ZGlmZiAtLWdpdCBhLy5naXRhdHRyaWJ1dGVzIGIvLmdpdGF0dHJpYnV0ZXMKaW5kZXggYTkwMDUyOC4uNWExOWI5NiAxMDA2NDQKLS0tIGEvLmdpdGF0dHJpYnV0ZXMKKysrIGIvLmdpdGF0dHJpYnV0ZXMKQEAgLTEgKzEsMiBAQAogKi5wbm0gLWRpZmYgLXRleHQKK3Rlc3RzL3JlZi9mYXRlL3N1Yi1zY2MgZW9sPWNybGYKZGlmZiAtLWdpdCBhLy50cmF2aXMueW1sIGIvLnRyYXZpcy55bWwKaW5kZXggZTU0MWVlMS4uNjNmMjA1MSAxMDA2NDQKLS0tIGEvLnRyYXZpcy55bWwKKysrIGIvLnRyYXZpcy55bWwKQEAgLTYsMTggKzYsMjIgQEAKIGFkZG9uczoKICAgYXB0OgogICAgIHBhY2thZ2VzOgotICAgICAgLSB5YXNtCisgICAgICAtIG5hc20KICAgICAgIC0gZGlmZnV0aWxzCiBjb21waWxlcjoKICAgLSBjbGFuZwogICAtIGdjYworbWF0cml4OgorICAgIGV4Y2x1ZGU6CisgICAgICAgIC0gb3M6IG9zeAorICAgICAgICAgIGNvbXBpbGVyOiBnY2MKIGNhY2hlOgogICBkaXJlY3RvcmllczoKICAgICAtIGZmbXBlZy1zYW1wbGVzCiBiZWZvcmVfaW5zdGFsbDoKICAgLSBpZiBbICIkVFJBVklTX09TX05BTUUiID09ICJvc3giIF07IHRoZW4gYnJldyB1cGRhdGUgLS1hbGw7IGZpCiBpbnN0YWxsOgotICAtIGlmIFsgIiRUUkFWSVNfT1NfTkFNRSIgPT0gIm9zeCIgXTsgdGhlbiBicmV3IGluc3RhbGwgeWFzbTsgZmkKKyAgLSBpZiBbICIkVFJBVklTX09TX05BTUUiID09ICJvc3giIF07IHRoZW4gYnJldyBpbnN0YWxsIG5hc207IGZpCiBzY3JpcHQ6CiAgIC0gbWtkaXIgLXAgZmZtcGVnLXNhbXBsZXMKICAgLSAuL2NvbmZpZ3VyZSAtLXNhbXBsZXM9ZmZtcGVnLXNhbXBsZXMgLS1jYz0kQ0MKZGlmZiAtLWdpdCBhL0NPTlRSSUJVVElORy5tZCBiL0NPTlRSSUJVVElORy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmI3OWU0Ci0tLSAvZGV2L251bGwKKysrIGIvQ09OVFJJQlVUSU5HLm1kCkBAIC0wLDAgKzEsNCBAQAorIyBOb3RlIHRvIEdpdGh1YiB1c2VycworUGF0Y2hlcyBzaG91bGQgYmUgc3VibWl0dGVkIHRvIHRoZSBbZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdF0oaHR0cHM6Ly9mZm1wZWcub3JnL21haWxtYW4vbGlzdGluZm8vZmZtcGVnLWRldmVsKSB1c2luZyBgZ2l0IGZvcm1hdC1wYXRjaGAgb3IgYGdpdCBzZW5kLWVtYWlsYC4gR2l0aHViIHB1bGwgcmVxdWVzdHMgc2hvdWxkIGJlIGF2b2lkZWQgYmVjYXVzZSB0aGV5IGFyZSBub3QgcGFydCBvZiBvdXIgcmV2aWV3IHByb2Nlc3MgYW5kICoqd2lsbCBiZSBpZ25vcmVkKiouCisKK1NlZSBbaHR0cHM6Ly9mZm1wZWcub3JnL2RldmVsb3Blci5odG1sI0NvbnRyaWJ1dGluZ10oaHR0cHM6Ly9mZm1wZWcub3JnL2RldmVsb3Blci5odG1sI0NvbnRyaWJ1dGluZykgZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9DaGFuZ2Vsb2cgYi9DaGFuZ2Vsb2cKaW5kZXggMmUxY2QzNi4uZThjN2FhYiAxMDA2NDQKLS0tIGEvQ2hhbmdlbG9nCisrKyBiL0NoYW5nZWxvZwpAQCAtMSw2ICsxLDU1NCBAQAogRW50cmllcyBhcmUgc29ydGVkIGNocm9ub2xvZ2ljYWxseSBmcm9tIG9sZGVzdCB0byB5b3VuZ2VzdCB3aXRoaW4gZWFjaCByZWxlYXNlLAogcmVsZWFzZXMgYXJlIHNvcnRlZCBmcm9tIHlvdW5nZXN0IHRvIG9sZGVzdC4KIAordmVyc2lvbiA0LjAuNDoKKy0gYXZjb2RlYy9oZXZjZGVjOiBBdm9pZCBvbmx5IHBhcnRseSBza2lwaW5nIGR1cGxpY2F0ZSBmaXJzdCBzbGljZXMKKy0gbGF2Yy9ibXA6IEF2b2lkIGEgaGVhcCBidWZmZXIgb3ZlcndyaXRlIGZvciAxYnBwIGlucHV0LgorLSBhdmNvZGVjL21wZWdwaWN0dXJlOiBDaGVjayBzaXplIG9mIGVkZ2VfZW11X2J1ZmZlcgorLSBhdmZvcm1hdC9tb3Y6IEZpeCBwb3RlbnRpYWwgaW50ZWdlciBvdmVyZmxvdyBpbiBlbnRyeSBjaGVjayBpbiBtb3ZfcmVhZF90cnVuKCkKKy0gYXZjb2RlYy90cnVlbW90aW9uMjogRml4IGludGVnZXIgb3ZlcmZsb3cgaW4gdG0yX251bGxfcmVzX2Jsb2NrKCkKKy0gYXZjb2RlYy9kZmE6IENoZWNrIHRoZSBjaHVuayBoZWFkZXIgaXMgbm90IHRydW5jYXRlZAorLSBhdmNvZGVjL2NsZWFydmlkZW86IENoZWNrIHJlbWFpbmluZyBkYXRhIGluIFAgZnJhbWVzCistIGF2Y29kZWMvZHZic3ViZGVjOiBDaGVjayBvYmplY3QgcG9zaXRpb24KKy0gYXZjb2RlYy9jZGdyYXBoaWNzOiBVc2UgZmZfc2V0X2RpbWVuc2lvbnMoKQorLSBhdmZvcm1hdC9nZHY6IENoZWNrIGZwcworLSBjb25maWd1cmU6IHVzZSB2cHhfY29kZWNfdnA4X2R4L2N4IGZvciBsaWJ2cHgtdnA4IGNoZWNraW5nCistIGNvbmZpZ3VyZTogYWRkIG1pc3NpbmcgcHRocmVhZHMgZXh0cmFsaWJzIGRlcGVuZGVuY3kgZm9yIGxpYnZweC12cDkKKy0gYXZjb2RlYy9tcGVnNHZpZGVvZGVjOiBDaGVjayBpZHggaW4gbXBlZzRfZGVjb2RlX3N0dWRpb19ibG9jaygpCistIGF2Y29kZWMvZHh2OiBDb3JyZWN0IGludGVnZXIgb3ZlcmZsb3cgaW4gZ2V0X29wY29kZXMoKQorLSBhdmNvZGVjL3NjcHI6IEZpeCB1c2Ugb2YgdW5pbml0aWFsaXplZCB2YXJpYWJsZQorLSBhdmNvZGVjL3FwZWc6IExpbWl0IGNvcHkgaW4gcXBlZ19kZWNvZGVfaW50cmEoKSB0byB0aGUgYXZhaWxhYmxlIGJ5dGVzCistIGF2Y29kZWMvYWljOiBDaGVjayByZW1haW5pbmcgYml0cyBpbiBhaWNfZGVjb2RlX2NvZWZmcygpCistIGF2Y29kZWMvZ2R2OiBDaGVjayBmb3IgdHJ1bmNhdGVkIHRhZ3MgaW4gZGVjb21wcmVzc181KCkKKy0gYXZjb2RlYy9iZXRoc29mdHZpZGVvOiBDaGVjayBibG9ja190eXBlCistIGF2Y29kZWMvanBlZzIwMDBkd3Q6IEZpeCBpbnRlZ2VyIG92ZXJmbG93IGluIGR3dF9kZWNvZGU5N19pbnQoKQorLSBhdmNvZGVjL2Vycm9yX3Jlc2lsaWVuY2U6IFVzZSBhIHN5bW1ldHJpYyBjaGVjayBmb3Igc2tpcHBpbmcgTVYgZXN0aW1hdGlvbgorLSBhdmNvZGVjL21scGRlYzogSW5zdWZmaWVudCB0eXBvCistIGF2Y29kZWMvem1idjogb2J0YWluIGZyYW1lIGxhdGVyCistIGF2Y29kZWMvanZkZWM6IENoZWNrIGF2YWlsYWJsZSBpbnB1dCBzcGFjZSBiZWZvcmUgZGVjb2RlOHg4KCkKKy0gYXZjb2RlYy9oMjY0X2RpcmVjdDogRml4IG92ZXJmbG93IGluIFBPQyBjb21wYXJpc3Npb24KKy0gYXZmb3JtYXQvd2VibWRhc2hlbmM6IENoZWNrIGlkIGluIGFkYXB0aW9uX3NldHMKKy0gYXZmb3JtYXQvaHR0cDogRml4IE91dC1vZi1Cb3VuZHMgYWNjZXNzIGluIHByb2Nlc3NfbGluZSgpCistIGF2Zm9ybWF0L2Z0cDogRml4IE91dC1vZi1Cb3VuZHMgQWNjZXNzIGFuZCBJbmZvcm1hdGlvbiBMZWFrIGluIGZ0cC5jOjM5MworLSBhdmNvZGVjL2h0bWxzdWJ0aXRsZXM6IEZpeGVzIGRlbmlhbCBvZiBzZXJ2aWNlIGR1ZSB0byB1c2Ugb2Ygc3NjYW5mIGluIGlubmVyIGxvb3AgZm9yIGhhbmRsaW5nIGJyYWNlcworLSBhdmNvZGVjL2h0bWxzdWJ0aXRsZXM6IEZpeGVzIGRlbmlhbCBvZiBzZXJ2aWNlIGR1ZSB0byB1c2Ugb2Ygc3NjYW5mIGluIGlubmVyIGxvb3AgZm9yIHRhZyBzY2FuaW5nCistIGF2Zm9ybWF0L21hdHJvc2thZGVjOiBEbyBub3QgbGVhayBxdWV1ZWQgcGFja2V0cyBvbiBzeW5jIGVycm9ycworLSBhdmNvZGVjL21wZWc0dmlkZW9kZWM6IENsZWFyIGludGVybGFjZWRfZGN0IGZvciBzdHVkaW8gcHJvZmlsZQorLSBhdmZvcm1hdC9tb3Y6IERvIG5vdCB1c2UgcmVmZXJlbmNlIHN0cmVhbSBpbiBtb3ZfcmVhZF9zaWR4KCkgaWYgdGhlcmUgaXMgbm8gcmVmZXJlbmNlIHN0cmVhbQorLSBhdmNvZGVjL3NicmRzcF9maXhlZC5jOiByZW1vdmUgaW5wdXQgdmFsdWUgbGltaXQgZm9yIHNicl9zdW1fc3F1YXJlX2MoKQorLSBhdmZvcm1hdC9tb3Y6IHZhbGlkYXRlIGNodW5rX2NvdW50IHZzIHN0c2NfZGF0YQorLSBhdmZvcm1hdC9tb3YuYzogcmVxdWlyZSB0ZmhkIHRvIGJlZ2luIHBhcnNpbmcgdHJ1bgorLSBhdmNvZGVjL3Bnc3N1YmRlYzogQ2hlY2sgZm9yIGR1cGxpY2F0ZSBkaXNwbGF5IHNlZ21lbnRzCistIGF2Zm9ybWF0L3J0c3A6IENoZWNrIG51bWJlciBvZiBzdHJlYW1zIGluIHNkcF9wYXJzZV9saW5lKCkKKy0gYXZmb3JtYXQvcnRzcDogQ2xlYXIgcmVwbHkgaW4gZXZlcnkgaXRlcmF0aW9uIGluIGZmX3J0c3BfY29ubmVjdCgpCistIGF2Y29kZWMvZmljOiBDaGVjayB0aGF0IHRoZXJlIGlzIGlucHV0IGxlZnQgaW4gZmljX2RlY29kZV9ibG9jaygpCistIGF2Y29kZWMvdGlmZjogQ2hlY2sgZm9yIDEyYml0IGdyYXkgZmF4CistIGF2dXRpbC9pbWd1dGlsczogT3B0aW1pemUgbWVtc2V0X2J5dGVzKCkgYnkgdXNpbmcgYXZfbWVtY3B5X2JhY2twdHIoKQorLSBhdnV0aWwvbWVtOiBPcHRpbWl6ZSBmaWxsMzIoKSBieSB1bnJvbGxpbmcgYW5kIHVzaW5nIDY0Yml0CistIGNvbmZpZ3VyZTogYnVtcCB5ZWFyCistIGF2Y29kZWMvZGlyYWNkZWM6IENoZWNrIGNvbXBvbmVudCBxdWFudAorLSBhdmNvZGVjL3Rlc3RzL3JhbmdlY29kZXI6IGluaXRpYWxpemUgYXJyYXkgdG8gYXZvaWQgdmFsZ3JpbmQgd2FybmluZworLSBhdmNvZGVjL2gyNjRfc2xpY2U6IEZpeCBpbnRlZ2VyIG92ZXJmbG93IGluIGltcGxpY2l0X3dlaWdodF90YWJsZSgpCistIGF2Y29kZWMvZXhyOiBzZXQgbGF5ZXJfbWF0Y2ggaW4gYWxsIGJyYW5jaGVzCistIGF2Y29kZWMvZXhyOiBDaGVjayBmb3IgZHVwbGljYXRlIGNoYW5uZWwgaW5kZXgKKy0gYXZjb2RlYy80eG06IEZpeCByZXR1cm5lZCBlcnJvciBjb2RlcworLSBhdmZvcm1hdC9saWJvcGVubXB0OiBGaXggc3VjY2Vzc2Z1bGwgdHlwbworLSBhdmNvZGVjL3Y0bDJfbTJtOiBmaXggY2FudCB0eXBvCistIGF2Y29kZWMvbWpwZWdiZGVjOiBGaXggc29tZSBtaXNwbGFjZWQge30gYW5kIHNwYWNlcworLSBhdmZvcm1hdC93dmRlYzogZGV0ZWN0IGFuZCBlcnJvciBvdXQgb24gV2F2UGFjayBEU0QgZmlsZXMKKy0gYXZjb2RlYy9taXBzOiBGaXggZmFpbGVkIGNhc2U6IGhldmMtY29uZm9ybWFuY2UtQU1QX0FfU2Ftc3VuZ18qIHdoZW4gZW5hYmxlIG1zYQorLSBhdmNvZGVjL2ZpYzogRmFpbCBvbiBpbnZhbGlkIHNsaWNlIHNpemUvb2ZmCistIHBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX3RlbXBsYXRlOiByZW1vdmUgRkZfUkVHX3NwIGZyb20gY2xvYmJlciBsaXN0CistIHBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX3RlbXBsYXRlOiBBdm9pZCB1c2luZyAlNCBmb3IgdGhlIHRocmVzaG9sZCBjb21wYXJlCistIGF2Y29kZWMvcnB6YTogQ2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggZGF0YSBmb3IgYWxsIHRoZSBibG9ja3MKKy0gYXZjb2RlYy9ycHphOiBNb3ZlIGZyYW1lIGFsbG9jYXRpb24gdG8gYSBsYXRlciBwb2ludAorLSBhdmNvZGVjL2F2Y29kZWM6IERvY3VtZW50IHRoZSBkYXRhIHR5cGUgZm9yIEFWX1BLVF9EQVRBX01QRUdUU19TVFJFQU1fSUQKKy0gYXZmb3JtYXQvbXBlZ3RzOiBGaXggc2lkZSBkYXRhIHR5cGUgZm9yIHN0cmVhbSBpZAorLSB0ZXN0cy9mYXRlL2ZpbHRlci12aWRlbzogaW5jcmVhc2UgZnV6eiBmb3IgZmF0ZS1maWx0ZXItcmVmY21wLXBzbnItcmdiCistIGF2Y29kZWMvbWpwZWdkZWM6IEZpeCBpbmRlbnRpb24gb2YgbGpwZWdfZGVjb2RlX3l1dl9zY2FuKCkKKy0gbGF2Zi9pZDN2MjogZmFpbCByZWFkX2FwaWMgb24gRU9GIHJlYWRpbmcgbWltZXR5cGUKKy0gYXZmb3JtYXQvbnV0ZW5jOiBEb2N1bWVudCB0cmFpbGVyIGluZGV4IGFzc2VydCBiZXR0ZXIKKy0gbGF2Zi9tb3Y6IGVuc3VyZSBvbmx5IG9uZSB0a2hkIHBlciB0cmFrCistIGF2Y29kZWMvY2xlYXJ2aWRlbzogQ2hlY2sgcmVtYWluaW5nIGlucHV0IGJpdHMgaW4gUCBtYWNybyBibG9jayBsb29wCistIGF2Y29kZWMvZHh2OiBDaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBkYXRhIHRvIGRlY29tcHJlc3MKKy0gYXZjb2RlYy9wcGMvaGV2Y2RzcDogRml4IGJ1aWxkIGZhaWx1cmVzIHdpdGggcG93ZXJwYy1saW51eC1nbnUtZ2NjLTQuOCB3aXRoIC0tZGlzYWJsZS1vcHRpbWl6YXRpb25zCistIGF2Y29kZWMvbXN2aWRlbzE6IENoZWNrIGZvciB0b28gc21hbGwgZGltZW5zaW9ucworLSBhdmNvZGVjL3dtdjJkZWM6IFNraXAgSSBmcmFtZSBpZiBpdHMgc21hbGxlciB0aGFuIDEvOCBvZiB0aGUgbWluaW1hbCBzaXplCistIGF2Y29kZWMvbXNtcGVnNGRlYzogU2tpcCBmcmFtZSBpZiBpdHMgc21hbGxlciB0aGFuIDEvOCBvZiB0aGUgbWluaW1hbCBzaXplCistIGF2Y29kZWMvdHJ1ZW1vdGlvbjJydDogRml4IHJvdW5kaW5nIGluIGlucHV0IHNpemUgY2hlY2sKKy0gYXZjb2RlYy90cnVlbW90aW9uMjogZml4IGludGVnZXIgb3ZlcmZsb3dzIGluIHRtMl9sb3dfY2hyb21hKCkKKy0gYXZjb2RlYy9wbmdkZWM6IENoZWNrIGNvbXByZXNzaW9uIG1ldGhvZAorLSBmZnRvb2xzL2ZmbXBlZzogUmVwYWlyIHJlaW5pdF9maWx0ZXIgZmVhdHVyZQorLSBhdmNvZGVjL3Nob3J0ZW46IEZpeCBpbnRlZ2VyIG92ZXJmbG93IHdpdGggb2Zmc2V0CistIGgyNjRfcmVkdW5kYW50X3BwczogRml4IGxvZ2dpbmcgY29udGV4dAorLSBhdmNvZGVjL2NhdnNkZWM6IFByb3BhZ2F0ZSBlcnJvciBjb2RlcyBpbnNpZGUgZGVjb2RlX21iX2koKQorLSBhdmNvZGVjL21wZWc0dmlkZW9kZWM6IENsZWFyIHBhcnRpdGlvbmVkIGZyYW1lIGluIGRlY29kZV9zdHVkaW9fdm9wX2hlYWRlcigpCistIGF2Y29kZWMvbXBlZ2F1ZGlvX3BhcnNlcjogQ29uc3VtZSBtb3JlIHRoYW4gMCBieXRlcyBpbiBjYXNlIG9mIHRoZSB1bnN1cHBvcnRlZCBtcDNhZHUgY2FzZQorLSBhdmNvZGVjL2hldmNkZWM6IGRlY29kZSBhdCBtb3N0IG9uZSBzbGljZSByZXBvcnRpbmcgYmVpbmcgdGhlIGZpcnN0IGluIHRoZSBwaWN0dXJlCistIGF2Zm9ybWF0L2RzZmRlYzogZml4IGNhbGN1bGF0aW9uIG9mIHNpemUgb2YgZGF0YSBjaHVuaworLSBhdmZvcm1hdC9kc2ZkZWM6IHByb3Blcmx5IGhhbmRsZSBwYWRkZWQgbGFzdCBwYWNrZXQKKy0gYXZjb2RlYy9oZXZjZGVjOiBmaXggbm9uLXJlZiBmcmFtZSBqdWRnZW1lbnQKKy0gYXZjb2RlYy9saWJhb21lbmM6IHJlbW92ZSBBVk9wdGlvbiByZWxhdGVkIHRvIGZyYW1lIHBhcnRpdGlvbnMKKwordmVyc2lvbiA0LjAuMzoKKy0gYXZ1dGlsL2ludGVnZXI6IEZpeCBpbnRlZ2VyIG92ZXJmbG93IGluIGF2X211bF9pKCkKKy0gYXZjb2RlYy9tc3JsZTogQ2hlY2sgdGhhdCB0aGUgaW5wdXQgaXMgbGFyZ2UgZW5vdWdoIHRvIGNvbnRhaW4gYSBlbmQgb2YgcGljdHVyZSBjb2RlCistIGF2Zm9ybWF0L2Z0cDogcmV0dXJuIEFWRVJST1JfRU9GIGZvciBFT0YKKy0gYXZjb2RlYy9saWJ4MjY0OiByZW1vdmUgRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSBmbGFnCistIGF2Y29kZWMvanBlZzIwMDBkZWM6IEZpeCBvZmYgYnkgMSBlcnJvciBpbiBKUEVHMjAwMF9QR09EX0NQUkwgaGFuZGxpbmcKKy0gYXZjb2RlYy9tcGVnNHZpZGVvZGVjOiBGaXggdHlwbyBpbiBzcHJpdGUgZGVsdGEgY2hlY2sKKy0gYXZjb2RlYy9oMjY0X2NhdmxjOiBDaGVjayBtYl9za2lwX3J1bgorLSBhdmNvZGVjL3JhMTQ0OiBGaXggaW50ZWdlciBvdmVyZmxvdyBpbiBhZGRfd2F2KCkKKy0gYXZmb3JtYXQvdXRpbHM6IE5ldmVyIHN0b3JlIG5lZ2F0aXZlIHZhbHVlcyBpbiBsYXN0X0lQX2R1cmF0aW9uCistIGF2Zm9ybWF0L3V0aWxzOiBGaXggaW50ZWdlciBvdmVyZmxvdyBpbiBkaXNjb250aW51aXR5IGNoZWNrCistIFJldmVydCAiYXZjb2RlYy9jYnNfaDI2NDogc2lsZW5jZSBlcnJvcnMgYWJvdXQgZW5kX29mX3NlcSBuYWx1cyIKKy0gYXZjb2RlYy9jYnM6IGVuc3VyZSB1c2VyX2RhdGEgaXMgcGFkZGVkIGZvciBHQkMgcGFyc2luZworLSBhdmNvZGVjL2NiczogZml4IGNyYXNoIGluIHNlaV9waWNfdGltZXN0YW1wCistIGF2Y29kZWMvY2JzX2gyNjQ6IHNpbGVuY2UgZXJyb3JzIGFib3V0IGVuZF9vZl9zZXEgbmFsdXMKKy0gYXZjb2RlYy9jdXZpZGRlYzogcHJvcGVybHkgdGFrZSBkZWludGVybGFjaW5nIGFuZCBkaXNwbGF5IGRlbGF5IGludG8gYWNjb3VudCBmb3IgYnVmZmVyX2Z1bGwgY2hlY2sKKy0gYXZjb2RlYy9oMjY0NV9wYXJzZTogc2tpcCBOQUxVcyB3aXRoIG5vIGNvbnRlbnQgYWZ0ZXIgc3RyaXBwaW5nIGFsbCB0aGUgdHJhaWxpbmcgemVyb3MKKy0gY29uZmlndXJlOiA8ZmZsaWI+X2RlcHM6IHZhbGlkYXRlLCByZWR1Y2Ugc2Vuc2l0aXZpdHkKKy0gY29uZmlndXJlOiBzcGVlZCB1cCBjaGVja19kZXBzKCkKKy0gY29uZmlndXJlOiBzcGVlZCB1cCBwcmludF9lbmFibGVkX2NvbXBvbmVudHMoKQorLSBjb25maWd1cmU6IHNwZWVkIHVwIGZsYXR0ZW5fZXh0cmFsaWJzX3dyYXBwZXIoKQorLSBhdmZvcm1hdC91dGlsczogRml4IHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93IGluIGV4dHJhY3RfZXh0cmFkYXRhKCkKKy0gYXZjb2RlYy91bmFyeTogSW1wcm92ZSBnZXRfdW5hcnkoKSBkb2NzCistIGF2Y29kZWMvZ2R2OiBSZXBsYWNlIGRpdmlzaW9ucyBieSBzaGlmdHMgaW4gcmVzY2FsZSgpCistIGF2Y29kZWMvYWMzZGVjOiBGaXggc2hpZnQgc2lnbmVkbmVzcyBpbiBtYXNrIGNyZWF0aW9uCistIGF2Y29kZWMvZWFjM2RlYzogQ2hlY2sgdGhhdCBjaGFubmVsX21hcCBkb2VzIG5vdCBjb250YWluIG1vcmUgdGhhbiBFQUMzX01BWF9DSEFOTkVMUworLSBkb2MvZXhhbXBsZXMvdmFhcGlfdHJhbnNjb2RlOiBGaXggdGhlIHR5cG8KKy0gYXZjb2RlYy9kdmRzdWJkZWM6IFNhbml0eSBjaGVjayBsZW4gaW4gZGVjb2RlX3JsZSgpCistIGF2Y29kZWMvbXBlZzR2aWRlb2RlYzogRml4IHVuZGVmaW5lZCBzaGlmdCBpbiBnZXRfYW12KCkKKy0gYXZjb2RlYy96bWJ2OiBDaGVjayB0aGF0IHRoZSBkZWNvbXByZXNzZWQgZGF0YSBzaXplIGlzIGNvcnJlY3QKKy0gYXZjb2RlYy96bWJ2OiBVcGRhdGUgZGVjb21wX2xlbiBpbiByYXcgZnJhbWVzCistIGF2Y29kZWMvc2hvcnRlbjogRml4IGJpdHN0cmVhbSBlbmQgY2hlY2sgaW4gcmVhZF9oZWFkZXIoKQorLSBhdmNvZGVjL2R2ZHN1YmRlYzogQXZvaWQgYnJhbmNoIGluIGRlY29kZV9ydW5fOGJpdCgpCistIGF2Y29kZWMvaDI2NF9yZWZzOiBEb2N1bWVudCBsYXN0IGlmKCkgaW4gZmZfaDI2NF9leGVjdXRlX3JlZl9waWNfbWFya2luZygpCistIGF2Y29kZWMvcmExNDQ6IEZpeCB1bmRlZmluZWQgaW50ZWdlciBvdmVyZmxvdyBpbiBhZGRfd2F2KCkKKy0gYXZjb2RlYy9pbmRlbzQ6IENoZWNrIGRpbWVuc2lvbnMgaW4gZGVjb2RlX3BpY19oZHIoKQorLSBhdmZvcm1hdC9tb3Y6IEVycm9yIG9uIHRvbyBsYXJnZSBzdHNkIGVudHJ5IGNvdW50cy4KKy0gZXhhbXBsZXM6IEZpeCB1c2Ugb2YgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSCistIGF2Y29kZWMvaHFfaHFhOiBDaGVjayByZW1haW5pbmcgaW5wdXQgYml0cyBpbiBocWFfZGVjb2RlX21iKCkKKy0gYXZjb2RlYy92YjogQ2hlY2sgZm9yIGVuZCBvZiBieXRlc3RyZWFtIGJlZm9yZSByZWFkaW5nIGJsb2NrdHlwZQorLSBhdmNvZGVjL3Nub3dkZWM6IEZpeCBpbnRlZ2VyIG92ZXJmbG93IHdpdGggbW90aW9uIHZlY3RvciByZXNpZHVhbAorLSBhdmNvZGVjL21wZWc0dmlkZW9kZWM6IEZpeCBzbGljZSBlbmQgZGV0ZWN0aW9uIGluIG1wZWc0X2RlY29kZV9zdHVkaW9fbWIoKQorLSBhdmZvcm1hdC9uc3ZkZWM6IERvIG5vdCBwYXJzZSBtdWx0aXBsZSBOU1ZmCistIGF2Zm9ybWF0L2Rhc2hkZWM6IEZpeCBzdHJsZW4ocmVwX2lkX3ZhbCkgd2l0aCBpdCBiZWluZyBOVUxMCistIGF2Zm9ybWF0L21sdmRlYzogcmVhZF9zdHJpbmcoKSByZWNlaXZlZCB1bnNpZ25lZCBzaXplLCBtYWtlIHRoZSBhcmd1bWVudCB1bnNpZ25lZAorLSBhdmZvcm1hdC9ybWRlYzogRml4IEVPRiBjaGVjayBpbiB0aGUgc3RyZWFtIGxvb3AgaW4gaXZyX3JlYWRfaGVhZGVyKCkKKy0gYXZjb2RlYy9zY3ByOiBDaGVjayBmb3IgbWluID4gbWF4IGluIGRlY29tcHJlc3NfcCgpCistIGF2Y29kZWMvc2hvcnRlbjogRml4IHNpZ25lZCAzMmJpdCBvdmVyZmxvdyBpbiBzaGlmdCBpbiBzaG9ydGVuX2RlY29kZV9mcmFtZSgpCistIGF2Y29kZWMvc2hvcnRlbjogRml4IGludGVnZXIgb3ZlcmZsb3cgaW4gcmVzaWR1YWwvTFBDIGNvbWJpbmF0aW9uCistIGF2Y29kZWMvc2hvcnRlbjogQ2hlY2sgdmVyYmF0aW0gbGVuZ3RoCistIGF2Y29kZWMvbXBlZ2F1ZGlvX3BhcnNlcjogSW5pdGlhbGl6ZSBwb3V0YnVmKgorLSBhdmNvZGVjL2FhY3BzZHNwX3RlbXBsYXRlOiBGaXggaW50ZWdlciBvdmVyZmxvdyBpbiBwc19zdGVyZW9faW50ZXJwb2xhdGVfYygpCistIGF2Zm9ybWF0L2ZsdmVuYzogQ2hlY2sgYXVkaW8gcGFja2V0IHNpemUKKy0gbGF2Yy9zdnEzOiBGaXggcmVncmVzc2lvbiBkZWNvZGluZyBzb21lIGZpbGVzLgorLSBhdmNvZGVjL21scF9wYXJzZXI6IENoZWNrIGlmIHN5bmNjb2RlIGlzIHdpdGhpbiBidWZmZXIKKy0gYXZjb2RlYy9xdHJsZTogQ2hlY2sgcmVtYWluaW5nIGJ5dGVzdHJlYW0gaW4gcXRybGVfZGVjb2RlX1hZYnBwKCkKKy0gYXZjb2RlYy9kaXJhY2RlYzogQ2hlY2sgYnl0ZXMgY291bnQgaW4gZWxzZSBicmFuY2ggaW4gZGVjb2RlX2xvd2RlbGF5KCkgdG9vCistIGF2Y29kZWMvZGlyYWNkZWM6IENoZWNrIHNsaWNlIG51bWJlcnMgZm9yIG92ZXJmbG93cyBpbiByZWxhdGlvbiB0byBwaWN0dXJlIGRpbWVuc2lvbnMKKy0gYXZjb2RlYy9kaXJhY2RlYzogQ2hhbmdlIGZyYW1lX251bWJlciB0byA2NGJpdCBhcyBpdHMgYSAzMmJpdCBmcm9tIHRoZSBiaXRzdHJlYW0gYW5kIHdlIGFsc28gaGF2ZSBhIC0xIHNwZWNpYWwgY2FzZQorLSBhdmNvZGVjL2RpcmFjX2R3dF90ZW1wbGF0ZTogRml4IHNldmVyYWwgaW50ZWdlciBvdmVyZmxvd3MgaW4gaG9yaXpvbnRhbF9jb21wb3NlX2RhdWI5N2koKQorLSBhdmNvZGVjL2RpcmFjZGVjOiBQcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cgaW4gaW50ZXJtZWRpYXRlIGluIGdsb2JhbF9tdigpCistIHN3cmVzYW1wbGUvc3dyZXNhbXBsZTogRml4IGlucHV0IGNoYW5uZWwgY291bnQgaW4gcmVzYW1wbGVfZmlyc3QgY29tcHV0YXRpb24KKy0gYXZ1dGlsL3BpeGZtdDogRG9jdW1lbnQgY2hyb21hIHBsYW5lIHNpemUgZm9yIG9kZCByZXNvbHV0aW9ucworLSBsYXZmL2xpYnNtYmNsaWVudDogcmV0dXJuIEFWRVJST1JfRU9GIGZvciBFT0YuCistIGxhdmMvdmlkZW90b29sYm94ZW5jOiBGaXggY29tcGlsYXRpb24gb24gb3N4IDEwLjEwLjUgWW9zZW1pdGUKKy0gYXZjb2RlYy9tZWRpYWNvZGVjZGVjOiBmaXggU0VHViBvbiBtb2Rlcm4gbnZpZGlhIGRlY29kZXJzCistIGF2Y29kZWMvYml0c3RyZWFtX2ZpbHRlcnM6IGNoZWNrIHRoZSBpbnB1dCBhcmd1bWVudCBvZiBhdl9ic2ZfZ2V0X2J5X25hbWUoKSBmb3IgTlVMTAorLSBhdmZvcm1hdC9saWJydG1wOiBmaXggcmV0dXJuaW5nIEVPRiBmcm9tIFJlYWQvV3JpdGUKKy0gYXZjb2RlYy92aWRlb3Rvb2xib3hlbmM6IGZpeCB1bmRlZmluZWQgYmVoYXZpb3Igd2l0aCByY19tYXhfcmF0ZT0wCisKKwordmVyc2lvbiA0LjAuMjoKKy0gYXZjb2RlYy9kdmRzdWJfcGFyc2VyOiBBbGxvY2F0ZSBpbnB1dCBwYWRkaW5nCistIGF2Y29kZWMvZHZkc3ViX3BhcnNlcjogSW5pdCBvdXRwdXQgYnVmL3NpemUKKy0gYXZjb2RlYy9kaXJhY19kd3RfdGVtcGxhdGU6IEZpeCBzaWduZWRuZXNzIHJlZ3Jlc3Npb24gaW4gaW50ZXJsZWF2ZSgpCistIGF2Zm9ybWF0L21vdjogU2ltcGxpZnkgbGFzdCBlbGVtZW50IGNvbXB1dGF0aW9uIGluIG1vdl9lc3RpbWF0ZV92aWRlb19kZWxheSgpCistIGF2Zm9ybWF0L21vdjogQnJlYWsgb3V0IG9mIGlubmVyIGxvb3AgZWFybHkgaW4gbW92X2VzdGltYXRlX3ZpZGVvX2RlbGF5KCkKKy0gYXZmb3JtYXQvbW92OiBFbGltaW5hdGUgdmFyaWFibGUgYnVmX3NpemUgZnJvbSBtb3ZfZXN0aW1hdGVfdmlkZW9fZGVsYXkoKQorLSBhdmZvcm1hdC9tb3Y6IHJlbW92ZSBtb2R1bG8gb3BlcmF0aW9ucyBmcm9tIG1vdl9lc3RpbWF0ZV92aWRlb19kZWxheSgpCistIGF2Zm9ybWF0L21vdmVuYzogV3JpdGUgdmVyc2lvbiAyIG9mIGF1ZGlvIGF0b20gaWYgY2hhbm5lbHMgaXMgbm90IGtub3duCistIHN3cmVzYW1wbGUvYXJtOiByZW5hbWUgbGFiZWxzIHRvIGZpeCB4Y29kZSBidWlsZCBlcnJvcgorLSBhdmZvcm1hdC9tb3ZlbmM6IENoZWNrIGlucHV0IHNhbXBsZSBjb3VudAorLSBhdmNvZGVjL21qcGVnZGVjOiBDaGVjayBmb3Igb2RkIHByb2dyZXNzaXZlIFJHQgorLSBhdmNvZGVjL3ZwOF9wYXJzZXI6IERvIG5vdCBsZWF2ZSBkYXRhL3NpemUgdW5pbml0aWFsaXplZAorLSBhdmZvcm1hdC9tbXM6IEFkZCBtaXNzaW5nIGNodW5rc2l6ZSBjaGVjaworLSBhdmZvcm1hdC9wdmE6IENoZWNrIGZvciBFT0YgYmVmb3JlIHJldHJ5aW5nIGluIHJlYWRfcGFydF9vZl9wYWNrZXQoKQorLSBhdmZvcm1hdC9ybWRlYzogRG8gbm90IHBhc3MgbWltZSB0eXBlIGluIHJtX3JlYWRfbXVsdGkoKSB0byBmZl9ybV9yZWFkX21kcHJfY29kZWNkYXRhKCkKKy0gYXZmb3JtYXQvYXNmZGVjX286IENoZWNrIHNpemVfYm1wIG1vcmUgZnVsbHkKKy0gYXZmb3JtYXQvbXhmZGVjOiBGaXggYXZfbG9nIGNvbnRleHQKKy0gYXZjb2RlYy9tcGVnNHZpZGVvZGVjOiBDaGVjayBmb3IgYml0c3RyZWFtIGVuZCBpbiByZWFkX3F1YW50X21hdHJpeF9leHQoKQorLSBhdmNvZGVjL2luZGVvNDogQ2hlY2sgZm9yIGVuZCBvZiBiaXRzdHJlYW0gaW4gZGVjb2RlX21iX2luZm8oKQorLSBhdmNvZGVjL2FjM2RlYzogQ2hlY2sgY2hhbm5lbF9tYXAgaW5kZXgKKy0gYXZjb2RlYy9tcGVnNHZpZGVvZGVjOiBSZW1vdmUgdXNlIG9mIEZGX1BST0ZJTEVfTVBFRzRfU0lNUExFX1NUVURJTyBhcyBpbmRpY2F0b3Igb2Ygc3R1ZGlvIHByb2ZpbGUKKy0gYXZjb2RlYy9zaG9ydGVuOiBGaXggdW5kZWZpbmVkIGFkZGl0aW9uIGluIHNob3J0ZW5fZGVjb2RlX2ZyYW1lKCkKKy0gYXZjb2RlYy9zaG9ydGVuOiBGaXggdW5kZWZpbmVkIGludGVnZXIgb3ZlcmZsb3cKKy0gYXZjb2RlYy9qcGVnMjAwMGRlYzogRml4ZXMgaW52YWxpZCBzaGlmdHMgaW4ganBlZzIwMDBfZGVjb2RlX3BhY2tldHNfcG9faXRlcmF0aW9uKCkKKy0gYXZjb2RlYy9qcGVnMjAwMGRlYzogQ2hlY2sgdGhhdCB0aGVyZSBhcmUgZW5vdWdoIGJ5dGVzIGZvciBhbGwgdGlsZXMKKy0gYXZmb3JtYXQvbW92ZW5jOiBVc2UgbW92LT5mYyBjb25zaXN0ZW50bHkgZm9yIGF2X2xvZygpCistIGF2Y29kZWMvbXBlZzR2aWRlb2RlYzogQ2hlY2sgcmVhZCBwcm9maWxlIGJlZm9yZSBzZXR0aW5nIGl0CistIGF2Zm9ybWF0L21vdmVuYzogRG8gbm90IHBhc3MgQVZDb2RlY1BhcmFtZXRlcnMgaW4gYXZwcml2X3JlcXVlc3Rfc2FtcGxlCistIGF2Y29kZWMvYWMzX3BhcnNlcjogQ2hlY2sgaW5pdF9nZXRfYml0czgoKSBmb3IgZmFpbHVyZQorLSBhdmZvcm1hdC9tb3ZlbmM6IENoZWNrIHRoYXQgZnJhbWVfdHlwZXMgb3RoZXIgdGhhbiBFQUMzX0ZSQU1FX1RZUEVfSU5ERVBFTkRFTlQgaGF2ZSBhIHN1cHBvcnRlZCBzdWJzdHJlYW0gaWQKKy0gYXZjb2RlYy9kcHg6IENoZWNrIGVsZW1lbnRzIGluIDEyYnBzIHBsYW5hciBwYXRoCistIGF2Y29kZWMvZXNjYXBlMTI0OiBGaXggc3BlbGxpbmcgZXJyb3JzIGluIGNvbW1lbnQKKy0gYXZjb2RlYy9yYTE0NDogRml4IGludGVnZXIgb3ZlcmZsb3cgaW4gZmZfZXZhbF9yZWZsKCkKKy0gYXZjb2RlYy9jc2NkOiBDaGVjayBvdXRwdXQgYnVmZmVyIHNpemUgZm9yIGx6by4KKy0gYXZjb2RlYy9lc2NhcGUxMjQ6IENoZWNrIGJ1Zl9zaXplIGFnYWluc3QgbnVtX3N1cGVyYmxvY2tzCistIGF2Y29kZWMvaDI2NF9wYXJzZXI6IFJlZHVjZSBuZWVkZWQgaGlzdG9yeSBmb3IgcGFyc2luZyBtYiBpbmRleAorLSBhdmNvZGVjL21hZ2ljeXV2OiBDaGVjayBiaXRzIGxlZnQgaW4gZmxhZ3MmMSBicmFuY2gKKy0gYXZjb2RlYy9tanBlZ2RlYzogQ2hlY2sgZm9yIGVuZCBvZiBiaXRzdHJlYW0gaW4gbGpwZWdfZGVjb2RlX3JnYl9zY2FuKCkKKy0gZmZtcGVnOiBmaXggLXN0cmVhbV9sb29wIHdpdGggbXVsdGlwbGUgaW5wdXRzCistIGZmbXBlZzogZmFjdG9yaXplIGlucHV0IHRocmVhZCBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24KKy0gYXZmb3JtYXQvbXBlZ3RzOiBwYXJzZSBsYXJnZSBQTVRzIHdpdGggbXVsdGlwbGUgdGFibGVzCistIFJldmVydCAiYXZjb2RlYy9tZWRpYWNvZGVjZGVjOiB3YWl0IG9uIGZpcnN0IGZyYW1lIGFmdGVyIGlucHV0IGJ1ZmZlcnMgYXJlIGZ1bGwiCistIGF2Y29kZWMvdmlkZW90b29sYm94ZW5jOiBmaXggaW52YWxpZCBzZXNzaW9uIG9uIGlPUworLSBhdmNvZGVjL3ZpZGVvdG9vbGJveGVuYzogc3BsaXQgaW5pdGlhbGl6YXRpb24KKy0gYXZjb2RlYy92aWRlb3Rvb2xib3hlbmM6IGZpeCBtdXRleC9jb25kIGxlYWsgaW4gZXJyb3IgcGF0aAorCit2ZXJzaW9uIDQuMC4xOgorLSBhdmNvZGVjL2FhY2RlY19maXhlZDogRml4IHVuZGVmaW5lZCBpbnRlZ2VyIG92ZXJmbG93IGluIGFwcGx5X2luZGVwZW5kZW50X2NvdXBsaW5nX2ZpeGVkKCkKKy0gYXZjb2RlYy9kaXJhY19kd3RfdGVtcGxhdGU6IEZpeCB1bmRlZmluZWQgYmVoYXZpb3IgaW4gaW50ZXJsZWF2ZSgpCistIGF2dXRpbC9jb21tb246IEZpeCB1bmRlZmluZWQgYmVoYXZpb3IgaW4gYXZfY2xpcF91aW50cDJfYygpCistIGZmdG9vbHMvZmZtcGVnOiBGYWxsYmFjayB0byBkdXJhdGlvbiBpZiBzYW1wbGUgcmF0ZSBpcyB1bmF2YWlsYWJsZQorLSBhdmZvcm1hdC9tb3Y6IE9ubHkgc2V0IHBrdC0+ZHVyYXRpb24gdG8gbm9uIG5lZ2F0aXZlIHZhbHVlcworLSBhdmNvZGVjL21wZWc0dmlkZW9kZWM6IENsZWFyIGJpdHNfcGVyX3Jhd19zYW1wbGUgaWYgaXQgaGFzIG9yaWdpbmF0ZWQgZnJvbSBhIHByZXZpb3VzIGluc3RhbmNlCistIGF2Zm9ybWF0L21vdmVuYzogZml4IHJlY29nbml6YXRpb24gb2YgY292ZXIgaW1hZ2Ugc3RyZWFtcworLSBhdmZvcm1hdC9tb3ZlbmM6IHByb3Blcmx5IGhhbmRsZSBjb3ZlciBpbWFnZSBjb2RlY3MKKy0gYXZjb2RlYy9oMjY0X3NsaWNlOiBGaXggb3ZlcmZsb3cgaW4gcmVjb3ZlcnlfZnJhbWUgY29tcHV0YXRpb24KKy0gYXZjb2RlYy9oMjY0X3BzOiBNb3ZlIE1BWF9MT0cyX01BWF9GUkFNRV9OVU0gdG8gaGVhZGVyIHNvIGl0IGNhbiBiZSB1c2VkIGluIGgyNjRfc2VpCistIGF2Y29kZWMvaDI2NF9tY190ZW1wbGF0ZTogT25seSBwcmVmZXRjaCBtb3Rpb24gaWYgdGhlIGxpc3QgaXMgdXNlZC4KKy0gYXZjb2RlYy94d2RkZWM6IFVzZSBmZl9zZXRfZGltZW5zaW9ucygpCistIGF2Y29kZWMvd2F2cGFjazogRml4IG92ZXJmbG93IGluIGFkZGluZyB0YWlsCistIGF2Y29kZWMvc2hvcnRlbjogRml4IG11bHRpcGxlIGludGVnZXIgb3ZlcmZsb3dzCistIGF2Y29kZWMvc2hvcnRlbjogRml4IHVuZGVmaW5lZCBzaGlmdCBpbiBmaXhfYml0c2hpZnQoKQorLSBhdmNvZGVjL3Nob3J0ZW46IEZpeCBhIG5lZ2F0aXZlIGxlZnQgc2hpZnQgaW4gc2hvcnRlbl9kZWNvZGVfZnJhbWUoKQorLSBhdmNvZGVjL3Nob3J0ZW46IFNhbml0eSBjaGVjayBubWVhbnMKKy0gYXZjb2RlYy9zaG9ydGVuOiBDaGVjayBub24gQ09NTSBjaHVuayBsZW4gYmVmb3JlIHNraXAgaW4gZGVjb2RlX2FpZmZfaGVhZGVyKCkKKy0gYXZjb2RlYy9tanBlZ2RlYzogRml4IGludGVnZXIgb3ZlcmZsb3cgaW4gbGpwZWdfZGVjb2RlX3JnYl9zY2FuKCkKKy0gYXZjb2RlYy90cnVlbW90aW9uMjogRml4IG92ZXJmbG93IGluIHRtMl9hcHBseV9kZWx0YXMoKQorLSBhdmNvZGVjL29wdXNfc2lsazogQ2hhbmdlIHNpbGtfbHNmMmxwYygpIHNsaWdodGx5IHRvd2FyZCBzaWxrL05MU0YyQS5jCistIGF2Y29kZWMvYW1yd2JkZWM6IEZpeCBkaXZpc2lvbiBieSAwIGluIGZpbmRfaGJfZ2FpbigpCistIGF2Y29kZWMvaDI2M2RlYzogUmVpbml0aWFsaXplIGlkY3QgY29udGV4dCBpZiBpdCBoYXMgbm90IGJlZW4gc2V0dXAgZm9yIHRoZSBhY3RpdmUgcHJvZmlsZQorLSBhdmNvZGVjL2lkY3Rkc3A6IENsZWFyIGlkY3QvaWRjdF9hZGQgZm9yIHN0dWRpbyBwcm9maWxlCistIGF2Zm9ybWF0L21vdjogcmVwbGFjZSBhIHZhbHVlIGVycm9yIGJ5IGNsaXBwaW5nIGludG8gdmFsaWQgcmFuZ2UgaW4gbW92X3JlYWRfc3RzYygpCistIGF2Zm9ybWF0L2JpbnRleHQ6IFJlZHVjZSBkZXRlY3Rpb24gZm9yIHJhbmRvbSAuYmluIGZpbGVzIGFzIGl0IG1vcmUgbGlrZWx5IGlzIG5vdCBhIG11bHRpbWVkaWEgcmVsYXRlZCBmaWxlCistIGF2Zm9ybWF0L21vdjogQnJlYWsgb3V0IGVhcmx5IGlmIGNodW5rX2NvdW50IGlzIDAgaW4gbW92X2J1aWxkX2luZGV4KCkKKy0gYXZjb2RlYy9maWM6IEF2b2lkIHNvbWUgbWFnaWMgbnVtYmVycyByZWxhdGVkIHRvIGN1cnNvcnMKKy0gYXZjb2RlYy9tcGVnNHZpZGVvOiBEZXRlY3QgcmVmZXJlbmNlIHN0dWRpbyBzdHJlYW1zIGFzIHN0dWRpbyBzdHJlYW1zCistIGF2Y29kZWMvbXBlZzR2aWRlb2RlYzogRG8gbm90IGNvcnJ1cHQgYml0c19wZXJfcmF3X3NhbXBsZQorLSBhdmNvZGVjL21wZWc0dmlkZW9kZTogRWxpbWluYXRlIG91dCBvZiBsb29wIFZPUCBzdGFydGNvZGUgcmVhZGluZyBmb3Igc3R1ZGlvIHByb2ZpbGUKKy0gYXZjb2RlYy9nMm1lZXQ6IGFzayBmb3Igc2FtcGxlIHdpdGggb3ZlcmZsb3dpbmcgUkdCCistIGF2Y29kZWMvaWRjdGRzcDogVHJhbnNtaXQgc3R1ZGlvX3Byb2ZpbGUgdG8gaW5pdCBpbnN0ZWFkIG9mIHVzaW5nIEFWQ29kZWNDb250ZXh0IHByb2ZpbGUKKy0gYXZjb2RlYy9hYzNkZWM6IENoZWNrIHRoYXQgdGhlIG51bWJlciBvZiBjaGFubmVscyB3aXRoIGRlcGVuZGFudCBzdHJlYW1zIGlzIHZhbGlkCistIGF2Y29kZWMvYWMzZGVjOiBGaXggbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlIGluIGFjM19kZWNvZGVfZnJhbWUoKQorLSBhdmNvZGVjL2FhY2RlY19maXhlZDogdXNlIDY0Yml0IHRvIGF2b2lkIG92ZXJmbG93IGluIHJvdW5kaW5nIGluIGFwcGx5X2RlcGVuZGVudF9jb3VwbGluZ19maXhlZCgpCistIG9hdmNvZGVjL2FhY3BzZHNwX3RlbXBsYXRlOiBVc2UgdW5zaWduZWQgZm9yIGhzMFggdG8gcHJldmVudCB1bmRlZmluZWQgYmVoYXZpb3IKKy0gYXZjb2RlYy9nNzIzXzFkZWM6IENsaXAgYml0czIgaW4gYm90aCBkaXJlY3Rpb25zCistIGF2Y29kZWMvbXBlZzR2aWRlb2VuYzogVXNlIDY0IGJpdCBmb3IgdGltZXMgaW4gbXBlZzRfZW5jb2RlX2dvcF9oZWFkZXIoKQorLSBhdmNvZGVjL21scGRlYzogT25seSBjaGFuZ2Ugbm9pc2VfdHlwZSBpZiB0aGUgcmVsYXRlZCBmaWVsZHMgYXJlIHZhbGlkCistIGluZGVvNDogRGVjb2RlIGFsbCBvciBub3RoaW5nIG9mIGEgYmFuZCBoZWFkZXIuCistIGF2Y29kZWMvYWMzZGVjOiBVc2UgZnJhbWVfc2l6ZSBpZiBzdXBlcmZyYW1lX3NpemUgaXMgMAorLSBhdmZvcm1hdC9tb3Y6IE9ubHkgZmFpbCBmb3IgU1RDTy9TVFNDIGNvbnRyYWRpY3Rpb25zIGlmIGJvdGggZXhpc3QKKy0gYXZjb2RlYy9kaXJhY19kd3Q6IEZpeCBpbnRlZ2VyIG92ZXJmbG93IGluIENPTVBPU0VfREQ5N2lIMCAvIENPTVBPU0VfREQxMzdpTDAKKy0gYXZjb2RlYy9maWM6IENoZWNrIGF2YWlsYWJsZSBpbnB1dCBzcGFjZSBmb3IgY3Vyc29yCistIGF2Y29kZWMvbXBlZzR2aWRlb2RlYzogQ2hlY2sgYnBzIChWT0wgaGVhZGVyKSBiZWZvcmUgVk9QIGZvciBzdHVkaW8gcHJvZmlsZQorLSBhdmNvZGVjL2cybWVldDogQ2hlY2sgUkdCIHVwcGVyIGxpbWl0CistIGF2Y29kZWMvanBlZzIwMDBkZWM6IEZpeCB1bmRlZmluZWQgc2hpZnQgaW4gdGhlIGpwZWcyMDAwX2RlY29kZV9wYWNrZXRzX3BvX2l0ZXJhdGlvbigpIENQUkwgY2FzZQorLSBhdmNvZGVjL2pwZWcyMDAwZGVjOiBTa2lwIGluaXQgZm9yIGNvbXBvbmVudCBpbiBDUFJMIGlmIG5vdGhpbmcgaXMgdG8gYmUgZG9uZQorLSBhdmNvZGVjL2cybWVldDogQ2hhbmdlIG9yZGVyIG9mIG9wZXJhdGlvbnMgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW9yCistIGF2Y29kZWMvZmxhY19wYXJzZXI6IEZpeCBpbmZpbml0ZSBsb29wCistIGF2Y29kZWMvbXBlZzR2aWRlb2RlYzogU3BsaXQgZGVjb2RlX3N0dWRpb192b2xfaGVhZGVyKCkgb3V0IG9mIGRlY29kZV9zdHVkaW92aXN1YWxvYmplY3QoKQorLSBhdmNvZGVjL21wZWc0dmlkZW9kZWM6IE1vdmUgZGVjb2RlX3N0dWRpb3Zpc3VhbG9iamVjdCgpIHBhcnNpbmcgaW4gdGhlIGJyYW5jaCBmb3IgdmlzdWFsIG9iamVjdCBwYXJzaW5nCistIGF2Y29kZWMvbXBlZzR2aWRlb19wYXJzZXI6IEF2b2lkIGxpdHRlcmFsIDB4MUI2LCB1c2UgbmFtZWQgY29uc3RhbnQgaW5zdGVhZAorLSBhdmNvZGVjL21wZWc0dmlkZW9fcGFyc2VyOiBGaXggaW5jb3JyZWN0IHNwbGl0aW5nIG9mIE1QRUctNCBzdHVkaW8gZnJhbWVzCistIGF2Zm9ybWF0L200dmRlYzogVXNlIHRoZSBzYW1lIGNvbnN0YW50IG5hbWVzIGFzIGxpYmF2Y29kZWMKKy0gYXZmb3JtYXQvbTR2ZGVjOiBGaXggZGV0ZWN0aW9uIG9mIHJhdyBNUEVHLTQgRVMgU3R1ZGlvCistIGF2Y29kZWMvd2F2cGFjazogRml4IGludGVnZXIgb3ZlcmZsb3cgaW4gREVDX01FRCgpIC8gSU5DX01FRCgpCistIGF2Y29kZWMvd2F2cGFjazogRml4IGludGVnZXIgb3ZlcmZsb3cgaW4gd3ZfdW5wYWNrX3N0ZXJlbygpCistIGF2Y29kZWMvZXJyb3JfcmVzaWxpZW5jZTogRml4IGludGVnZXIgb3ZlcmZsb3cgaW4gZmlsdGVyMTgxKCkKKy0gYXZjb2RlYy9oMjYzZGVjOiBDaGVjayBzbGljZV9yZXQgaW4gbXNwZWc0IHNsaWNlIGxvb3AKKy0gYXZjb2RlYy9lbHNkZWM6IEZpeCBtZW1sZWFrcworLSBhdmNvZGVjL3ZjMV9ibG9jazogc2ltcGxpZnkgYWNfdmFsIGNvbXB1dGF0aW9uCistIGF2Y29kZWMvZmZ2MWVuYzogQ2hlY2sgdGhhdCB0aGUgY3JjICsgdmVyc2lvbiBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQKKy0gY29uZmlndXJlOiBUaGUgZWFjM19jb3JlIGJpdHN0cmVhbSBmaWx0ZXIgbmVlZHMgdGhlIGFjMyBwYXJzZXIuCistIGNvbmZpZ3VyZTogZml4IGFybSBpbmxpbmUgYXNtIGNoZWNrcworLSBsYXZmL2xpYnNzaDogdHJhbnNsYXRlIGEgcmVhZCBvZiAwIHRvIEVPRgorLSBmZnByb2JlOiBmaXggU0VHViB3aGVuIG5ldyBzdHJlYW1zIGFyZSBhZGRlZAorLSBhdmZvcm1hdC9tcGVndHM6IGZpeCBpbmNvcnJlY3QgaW5kZW50YXRpb24KKy0gYXZmb3JtYXQvbXBlZ3RzOiBpbml0aWFsaXplIHNlY3Rpb25fYnVmIHRvIGZpeCB2YWxncmluZCB0ZXN0IGZhaWx1cmUKKy0gYXZmb3JtYXQvbXBlZ3RzOiByZWluZGVudCBhZnRlciBsYXN0IGNoYW5nZQorLSBhdmZvcm1hdC9tcGVndHM6IHBhcnNlIHNlY3Rpb25zIHdpdGggbXVsdGlwbGUgdGFibGVzCistIGF2Zm9ybWF0L21wZWd0czogY2xlYW4gdXAgd2hpdGVzcGFjZQorLSBhdmZvcm1hdC9tcGVndHM6IHVzZSBNQVhfU0VDVElPTl9TSVpFIGluc3RlYWQgb2YgaGFyZGNvZGVkIHZhbHVlCistIGF2Zm9ybWF0L21wZWd0czogc2tpcCBub24tUE1UIHRpZHMgZWFybGllcgorLSBhdmNvZGVjL21lZGlhY29kZWNkZWM6IGFkZCB3b3JrYXJvdW5kIGZvciBidWdneSBhbWxvZ2ljIG1wZWcyIGRlY29kZXIKKy0gYXZjb2RlYy9tZWRpYWNvZGVjZGVjOiB3YWl0IG9uIGZpcnN0IGZyYW1lIGFmdGVyIGlucHV0IGJ1ZmZlcnMgYXJlIGZ1bGwKKy0gYXZjb2RlYy9tZWRpYWNvZGVjZGVjOiByZXN0cnVjdHVyZSBtZWRpYWNvZGVjX3JlY2VpdmVfZnJhbWUKKy0gYXZjb2RlYy9tZWRpYWNvZGVjX3dyYXBwZXI6IGFkZCBoZWxwZXIgdG8gZmV0Y2ggU0RLX0lOVAorLSBhdmNvZGVjL21lZGlhY29kZWNkZWM6IHJlZmFjdG9yIHB0cyBoYW5kbGluZworLSBhdmNvZGVjL21lZGlhY29kZWNkZWM6IHVzZSBBVl9USU1FX0JBU0VfUQorLSBhdmNvZGVjL21lZGlhY29kZWNkZWM6IGNsYXJpZnkgZGVsYXlfZmx1c2ggc3BlY2lmaWMgY29kZQorLSBhdmNvZGVjL3ZpZGVvdG9vbGJveDogZml4IGRlY29kaW5nIG9mIHNvbWUgSEVWQyB2aWRlb3MKKy0gYXZjb2RlYy9oZXZjOiByZW1vdmUgdmlkZW90b29sYm94IGhhY2sKKy0gYXZjb2RlYy92aWRlb3Rvb2xib3g6IHNwbGl0IGgyNjQvaGV2YyBjYWxsYmFja3MKKy0gYXZjb2RlYy92aWRlb3Rvb2xib3g6IGNsZWFudXBzCistIGF2Y29kZWMvdmlkZW90b29sYm94OiBmaXgga1ZUQ291bGROb3RGaW5kVmlkZW9EZWNvZGVyRXJyIHRyeWluZyB0byBkZWNvZGUgSEVWQyBvbiBpT1MKKy0gYXZjb2RlYy92aWRlb3Rvb2xib3g6IGltcHJvdmUgbG9nZ2luZyBvZiBkZWNvZGVyIGVycm9ycworLSBhdmNvZGVjL3h3ZGRlYzogZml4IHBhbGV0dGUgYWxwaGEKKy0gYXZmb3JtYXQvd2VibV9jaHVuazogYWx3YXlzIHVzZSBhIHN0YXRpYyBidWZmZXIgZm9yIGdldF9jaHVua19maWxlbmFtZQorLSBjb25maWd1cmU6IGZpeCBjb25maWd1cmUgY2hlY2sgZm9yIGxpbHYtMAorLSBhdmNvZGVjL252ZGVjX2hldmM6IGZpeCBzY2FsaW5nIGxpc3RzCistIGF2Y29kZWMvaGV2Y2RlYzogbWFrZSBmZl9oZXZjX2ZyYW1lX25iX3JlZnMgdGFrZSBhIGNvbnN0IHBvaW50ZXIKKy0gbGF2Zi9ibHVyYXk6IHRyYW5zbGF0ZSBhIHJlYWQgb2YgMCB0byBFT0YKKy0gbGF2Zi9kYXNoZW5jOiBkb24ndCBjYWxsIGZsdXNoX2luaXRfc2VnbWVudCBiZWZvcmUgYXZmb3JtYXRfd3JpdGVfaGVhZGVyCistIGF2ZGV2aWNlL2RlY2tsaW5rX2RlYzogdW5yZWYgcGFja2V0cyBvbiBhdnBhY2tldF9xdWV1ZV9wdXQgZXJyb3IKKy0gYXZjb2RlYy9obm00dmlkZW86IGZpeCBwYWxldHRlIGFscGhhCistIGF2Y29kZWMvYW5tOiBmaXggcGFsZXR0ZSBhbHBoYQorLSBhdmZvcm1hdC9xdHBhbGV0dGU6IHBhcnNlIGNvbG9yIHRhYmxlIGFjY29yZGluZyB0byB0aGUgUXVpY2tUaW1lIGZpbGUgZm9ybWF0IHNwZWNzCistIGZmcGxheTogRml4IHJlYWxsb2NfdGV4dHVyZSB3aGVuIGlucHV0IHRleHR1cmUgaXMgTlVMTC4KKy0gaHdjb250ZXh0X3ZhYXBpOiBGaXggY29tcGlsYXRpb24gd2l0aCBsaWJ2YSB2ZXJzaW9ucyA8IDEuNC4wCistIGxhdmYvcXN2OiBjbG9uZSB0aGUgZnJhbWUgd2hpY2ggbWF5IGJlIG1hbmFnZWQgYnkgZnJhbWV3b3JrCistIGxhdmY6IG1ha2Ugb3ZlcmxheV9xc3Ygd29yayBiYXNlZCBvbiBmcmFtZXN5bmMKKy0gYXZmb3JtYXQvc2VnYWZpbG0gLSByZXZlcnQga2V5ZnJhbWUgZGV0ZWN0aW9uCistIGF2Zm9ybWF0L3V0aWxzOiByZWZhY3RvciB1cHN0cmVhbV9zdHJlYW1fdGltaW5ncworLSBhdmZvcm1hdC91dGlsczogaWdub3JlIG91dGxpZXIgZHVyYXRpb25zIG9uIHN1YnRpdGxlL2RhdGEgc3RyZWFtcyBhcyB3ZWxsCisKKwordmVyc2lvbiA0LjA6CistIEJpdHN0cmVhbSBmaWx0ZXJzIGZvciBlZGl0aW5nIG1ldGFkYXRhIGluIEguMjY0LCBIRVZDIGFuZCBNUEVHLTIgc3RyZWFtcworLSBEcm9wcGVkIHN1cHBvcnQgZm9yIE9wZW5KUEVHIHZlcnNpb25zIDIuMCBhbmQgYmVsb3cuIFVzaW5nIE9wZW5KUEVHIG5vdworICByZXF1aXJlcyAyLjEgKG9yIGxhdGVyKSBhbmQgcGtnLWNvbmZpZy4KKy0gVkRBIGRyb3BwZWQgKHVzZSBWaWRlb1Rvb2xib3ggaW5zdGVhZCkKKy0gTWFnaWNZVVYgZW5jb2RlcgorLSBSYXcgQU1SLU5CIGFuZCBBTVItV0IgZGVtdXhlcnMKKy0gVGlWbyB0eS90eSsgZGVtdXhlcgorLSBJbnRlbCBRU1YtYWNjZWxlcmF0ZWQgTUpQRUcgZW5jb2RpbmcKKy0gUENFIHN1cHBvcnQgZm9yIGV4dGVuZGVkIGNoYW5uZWwgbGF5b3V0cyBpbiB0aGUgQUFDIGVuY29kZXIKKy0gbmF0aXZlIGFwdFggYW5kIGFwdFggSEQgZW5jb2RlciBhbmQgZGVjb2RlcgorLSBSYXcgYXB0WCBhbmQgYXB0WCBIRCBtdXhlciBhbmQgZGVtdXhlcgorLSBOVklESUEgTlZERUMtYWNjZWxlcmF0ZWQgSC4yNjQsIEhFVkMsIE1KUEVHLCBNUEVHLTEvMi80LCBWQzEsIFZQOC85IGh3YWNjZWwgZGVjb2RpbmcKKy0gSW50ZWwgUVNWLWFjY2VsZXJhdGVkIG92ZXJsYXkgZmlsdGVyCistIG1jb21wYW5kIGF1ZGlvIGZpbHRlcgorLSBhY29udHJhc3QgYXVkaW8gZmlsdGVyCistIE9wZW5DTCBvdmVybGF5IGZpbHRlcgorLSB2aWRlbyBtaXggZmlsdGVyCistIHZpZGVvIG5vcm1hbGl6ZSBmaWx0ZXIKKy0gYXVkaW8gbHYyIHdyYXBwZXIgZmlsdGVyCistIFZBQVBJIE1KUEVHIGFuZCBWUDggZGVjb2RpbmcKKy0gQU1EIEFNRiBILjI2NCBhbmQgSEVWQyBlbmNvZGVycworLSB2aWRlbyBmaWxsYm9yZGVycyBmaWx0ZXIKKy0gdmlkZW8gc2V0cmFuZ2UgZmlsdGVyCistIG5zcCBkZW11eGVyCistIHN1cHBvcnQgTGlicmVTU0wgKHZpYSBsaWJ0bHMpCistIEFWWC01MTIvWk1NIHN1cHBvcnQgYWRkZWQKKy0gRHJvcHBlZCBzdXBwb3J0IGZvciBidWlsZGluZyBmb3IgV2luZG93cyBYUC4gVGhlIG1pbmltdW0gc3VwcG9ydGVkIFdpbmRvd3MKKyAgdmVyc2lvbiBpcyBXaW5kb3dzIFZpc3RhLgorLSBkZWNvbnZvbHZlIHZpZGVvIGZpbHRlcgorLSBlbnRyb3B5IHZpZGVvIGZpbHRlcgorLSBoaWxiZXJ0IGF1ZGlvIGZpbHRlciBzb3VyY2UKKy0gYWlpciBhdWRpbyBmaWx0ZXIKKy0gYWlmZjogYWRkIHN1cHBvcnQgZm9yIENELVJPTSBYQSBBRFBDTQorLSBSZW1vdmVkIHRoZSBmZnNlcnZlciBwcm9ncmFtCistIFJlbW92ZWQgdGhlIGZmbWVuYyBhbmQgZmZtZGVjIG11eGVyIGFuZCBkZW11eGVyCistIFZpZGVvVG9vbGJveCBIRVZDIGVuY29kZXIgYW5kIGh3YWNjZWwKKy0gVkFBUEktYWNjZWxlcmF0ZWQgUHJvY0FtcCAoY29sb3IgYmFsYW5jZSksIGRlbm9pc2UgYW5kIHNoYXJwbmVzcyBmaWx0ZXJzCistIEFkZCBhbmRyb2lkX2NhbWVyYSBpbmRldgorLSBjb2RlYzIgZW4vZGVjb2RpbmcgdmlhIGxpYmNvZGVjMgorLSBtdXhlci9kZW11eGVyIGZvciByYXcgY29kZWMyIGZpbGVzIGFuZCAuYzIgZmlsZXMKKy0gTW92ZWQgbnZpZGlhIGNvZGVjIGhlYWRlcnMgaW50byBhbiBleHRlcm5hbCByZXBvc2l0b3J5LgorICBUaGV5IGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vZ2l0LnZpZGVvbGFuLm9yZy8/cD1mZm1wZWcvbnYtY29kZWMtaGVhZGVycy5naXQKKy0gbmF0aXZlIFNCQyBlbmNvZGVyIGFuZCBkZWNvZGVyCistIGRybWV0ZXIgYXVkaW8gZmlsdGVyCistIGhhcHFhX2V4dHJhY3QgYml0c3RyZWFtIGZpbHRlcgorLSBmaWx0ZXJfdW5pdHMgYml0c3RyZWFtIGZpbHRlcgorLSBBVjEgU3VwcG9ydCB0aHJvdWdoIGxpYmFvbQorLSBFLUFDLTMgZGVwZW5kZW50IGZyYW1lcyBzdXBwb3J0CistIGJpdHN0cmVhbSBmaWx0ZXIgZm9yIGV4dHJhY3RpbmcgRS1BQy0zIGNvcmUKKy0gSGFpdmlzaW9uIFNSVCBwcm90b2NvbCB2aWEgbGlic3J0CistIHNlZ2FmaWxtIG11eGVyCistIHZmcmRldCBmaWx0ZXIKKworCit2ZXJzaW9uIDMuNDoKKy0gZGVmbGlja2VyIHZpZGVvIGZpbHRlcgorLSBkb3VibGV3ZWF2ZSB2aWRlbyBmaWx0ZXIKKy0gbHVtYWtleSB2aWRlbyBmaWx0ZXIKKy0gcGl4c2NvcGUgdmlkZW8gZmlsdGVyCistIG9zY2lsbG9zY29wZSB2aWRlbyBmaWx0ZXIKKy0gY29uZmlnLmxvZyBhbmQgb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlcyBtb3ZlZCBpbnRvIGZmYnVpbGQvIGRpcmVjdG9yeQorLSB1cGRhdGUgY3V2aWQvbnZlbmMgaGVhZGVycyB0byBWaWRlbyBDb2RlYyBTREsgOC4wLjE0CistIGFmaXIgYXVkaW8gZmlsdGVyCistIHNjYWxlX2N1ZGEgQ1VEQSBiYXNlZCB2aWRlbyBzY2FsZSBmaWx0ZXIKKy0gbGlicnN2ZyBzdXBwb3J0IGZvciBzdmcgcmFzdGVyaXphdGlvbgorLSBjcm9zc2ZlZWQgYXVkaW8gZmlsdGVyCistIHNwZWMgY29tcGxpYW50IFZQOSBtdXhpbmcgc3VwcG9ydCBpbiBNUDQKKy0gcmVtb3ZlIHRoZSBsaWJudXQgbXV4ZXIvZGVtdXhlciB3cmFwcGVycworLSByZW1vdmUgdGhlIGxpYnNjaHJvZWRpbmdlciBlbmNvZGVyL2RlY29kZXIgd3JhcHBlcnMKKy0gc3Vycm91bmQgYXVkaW8gZmlsdGVyCistIHNvZmFsaXplciBmaWx0ZXIgc3dpdGNoZWQgdG8gbGlibXlzb2ZhCistIEdyZW1saW4gRGlnaXRhbCBWaWRlbyBkZW11eGVyIGFuZCBkZWNvZGVyCistIGhlYWRwaG9uZSBhdWRpbyBmaWx0ZXIKKy0gc3VwZXJlcXVhbGl6ZXIgYXVkaW8gZmlsdGVyCistIHJvYmVydHMgdmlkZW8gZmlsdGVyCistIFRoZSB4ODYgYXNzZW1ibGVyIGRlZmF1bHQgc3dpdGNoZWQgZnJvbSB5YXNtIHRvIG5hc20sIHBhc3MKKyAgLS14ODZhc21leGU9eWFzbSB0byBjb25maWd1cmUgdG8gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW9yLgorLSBhZGRpdGlvbmFsIGZyYW1lIGZvcm1hdCBzdXBwb3J0IGZvciBJbnRlcnBsYXkgTVZFIG1vdmllcworLSBzdXBwb3J0IGZvciBkZWNvZGluZyB0aHJvdWdoIEQzRDExVkEgaW4gZmZtcGVnCistIGxpbWl0ZXIgdmlkZW8gZmlsdGVyCistIGxpYnZtYWYgdmlkZW8gZmlsdGVyCistIERvbGJ5IEUgZGVjb2RlciBhbmQgU01QVEUgMzM3TSBkZW11eGVyCistIHVucHJlbXVsdGlwbHkgdmlkZW8gZmlsdGVyCistIHRsdXQyIHZpZGVvIGZpbHRlcgorLSBmbG9vZGZpbGwgdmlkZW8gZmlsdGVyCistIHBzZXVkb2NvbG9yIHZpZGVvIGZpbHRlcgorLSByYXcgRy43MjYgbXV4ZXIgYW5kIGRlbXV4ZXIsIGxlZnQtIGFuZCByaWdodC1qdXN0aWZpZWQKKy0gTmV3VGVrIE5ESSBpbnB1dC9vdXRwdXQgZGV2aWNlCistIFNvbWUgdmlkZW8gZmlsdGVycyB3aXRoIHNldmVyYWwgaW5wdXRzIG5vdyB1c2UgYSBjb21tb24gc2V0IG9mIG9wdGlvbnM6CisgIGJsZW5kLCBsaWJ2bWFmLCBsdXQzZCwgb3ZlcmxheSwgcHNuciwgc3NpbS4KKyAgVGhleSBtdXN0IGFsd2F5cyBiZSB1c2VkIGJ5IG5hbWUuCistIEZJVFMgZGVtdXhlciBhbmQgZGVjb2RlcgorLSBGSVRTIG11eGVyIGFuZCBlbmNvZGVyCistIGFkZCAtLWRpc2FibGUtYXV0b2RldGVjdCBidWlsZCBzd2l0Y2gKKy0gZHJvcCBkZXByZWNhdGVkIHF0a2l0IGlucHV0IGRldmljZSAodXNlIGF2Zm91bmRhdGlvbiBpbnN0ZWFkKQorLSBkZXNwaWxsIHZpZGVvIGZpbHRlcgorLSBoYWFzIGF1ZGlvIGZpbHRlcgorLSBTVVAvUEdTIHN1YnRpdGxlIG11eGVyCistIGNvbnZvbHZlIHZpZGVvIGZpbHRlcgorLSBWUDkgdGlsZSB0aHJlYWRpbmcgc3VwcG9ydAorLSBLTVMgc2NyZWVuIGdyYWJiZXIKKy0gQ1VEQSB0aHVtYm5haWwgZmlsdGVyCistIFY0TDIgbWVtMm1lbSBIVyBhc3Npc3RlZCBjb2RlY3MKKy0gUm9ja2NoaXAgTVBQIGhhcmR3YXJlIGRlY29kaW5nCistIHZtYWZtb3Rpb24gdmlkZW8gZmlsdGVyCistIHVzZSBNSU1FIHR5cGUgIkc3MjYiIGZvciBsaXR0bGUtZW5kaWFuIEcuNzI2LCAiQUFMMi1HNzI2IiBmb3IgYmlnLWVuZGlhbiBHLjcyNgorCisKK3ZlcnNpb24gMy4zOgorLSBDcnlzdGFsSEQgZGVjb2RlciBtb3ZlZCB0byBuZXcgZGVjb2RlIEFQSQorLSBhZGQgaW50ZXJuYWwgZWJ1cjEyOCBsaWJyYXJ5LCByZW1vdmUgZXh0ZXJuYWwgbGliZWJ1cjEyOCBkZXBlbmRlbmN5CistIFByby1NUEVHIENvUCAjMy1SMiBGRUMgcHJvdG9jb2wKKy0gcHJlbXVsdGlwbHkgdmlkZW8gZmlsdGVyCistIFN1cHBvcnQgZm9yIHNwaGVyaWNhbCB2aWRlb3MKKy0gY29uZmlndXJlIG5vdyBmYWlscyBpZiBhdXRvZGV0ZWN0LWxpYnJhcmllcyBhcmUgcmVxdWVzdGVkIGJ1dCBub3QgZm91bmQKKy0gUFNEIERlY29kZXIKKy0gMTYuOCBmbG9hdGluZyBwb2ludCBwY20gZGVjb2RlcgorLSAyNC4wIGZsb2F0aW5nIHBvaW50IHBjbSBkZWNvZGVyCistIEFwcGxlIFBpeGxldCBkZWNvZGVyCistIFFETUMgYXVkaW8gZGVjb2RlcgorLSBOZXdUZWsgU3BlZWRIUSBkZWNvZGVyCistIE1JREkgU2FtcGxlIER1bXAgU3RhbmRhcmQgZGVtdXhlcgorLSByZWFkZWlhNjA4IGZpbHRlcgorLSBTYW1wbGUgRHVtcCBlWGNoYW5nZSBkZW11eGVyCistIGFiaXRzY29wZSBtdWx0aW1lZGlhIGZpbHRlcgorLSBTY2VuYXJpc3QgQ2xvc2VkIENhcHRpb25zIGRlbXV4ZXIgYW5kIG11eGVyCistIHRocmVzaG9sZCBmaWx0ZXIKKy0gbWlkZXF1YWxpemVyIGZpbHRlcgorLSBPcHRpbWFsIEh1ZmZtYW4gdGFibGVzIGZvciAoTSlKUEVHIGVuY29kaW5nCistIFZBQVBJLWFjY2VsZXJhdGVkIE1QRUctMiBhbmQgVlA4IGVuY29kaW5nCistIEZNIFNjcmVlbiBDYXB0dXJlIENvZGVjIGRlY29kZXIKKy0gbmF0aXZlIE9wdXMgZW5jb2RlcgorLSBTY3JlZW5QcmVzc29yIGRlY29kZXIKKy0gaW5jb21wbGV0ZSBDbGVhclZpZGVvIGRlY29kZXIKKy0gSW50ZWwgUVNWIHZpZGVvIHNjYWxpbmcgYW5kIGRlaW50ZXJsYWNpbmcgZmlsdGVycworLSBTdXBwb3J0IE1PViB3aXRoIG11bHRpcGxlIHNhbXBsZSBkZXNjcmlwdGlvbiB0YWJsZXMKKy0gWFBNIGRlY29kZXIKKy0gUmVtb3ZlZCB0aGUgbGVnYWN5IFgxMSBzY3JlZW4gZ3JhYmJlciwgdXNlIFhDQiBpbnN0ZWFkCistIE1QRUctNyBWaWRlbyBTaWduYXR1cmUgZmlsdGVyCistIFJlbW92ZWQgYXN5bmN0cyBmaWx0ZXIgKHVzZSBhZl9hcmVzYW1wbGUgaW5zdGVhZCkKKy0gSW50ZWwgUVNWLWFjY2VsZXJhdGVkIFZQOCB2aWRlbyBkZWNvZGluZworLSBWQUFQSS1hY2NlbGVyYXRlZCBkZWludGVybGFjaW5nCisKKwordmVyc2lvbiAzLjI6CistIGxpYm9wZW5tcHQgZGVtdXhlcgorLSB0ZWUgcHJvdG9jb2wKKy0gQ2hhbmdlZCBtZXRhZGF0YSBwcmludCBvcHRpb24gdG8gYWNjZXB0IGdlbmVyYWwgdXJscworLSBBbGlhcyBtdXhlciBmb3IgT2dnIFZpZGVvICgub2d2KQorLSBWUDggaW4gT2dnIG11eGluZworLSBjdXJ2ZXMgZmlsdGVyIGRvZXNuJ3QgYXV0b21hdGljYWxseSBpbnNlcnQgcG9pbnRzIGF0IHg9MCBhbmQgeD0xIGFueW1vcmUKKy0gMTYtYml0IHN1cHBvcnQgaW4gY3VydmVzIGZpbHRlciBhbmQgc2VsZWN0aXZlY29sb3IgZmlsdGVyCistIE9wZW5IMjY0IGRlY29kZXIgd3JhcHBlcgorLSBNZWRpYUNvZGVjIEguMjY0L0hFVkMvTVBFRy00L1ZQOC9WUDkgaHdhY2NlbAorLSBUcnVlIEF1ZGlvIChUVEEpIG11eGVyCistIGNyeXN0YWxpemVyIGF1ZGlvIGZpbHRlcgorLSBhY3J1c2hlciBhdWRpbyBmaWx0ZXIKKy0gYml0cGxhbmVub2lzZSB2aWRlbyBmaWx0ZXIKKy0gZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCBpbiBhbHMgZGVjb2RlcgorLSBmaWZvIG11eGVyCistIG1hc2tlZGNsYW1wIGZpbHRlcgorLSBoeXN0ZXJlc2lzIGZpbHRlcgorLSBsdXQyIGZpbHRlcgorLSB5dXZ0ZXN0c3JjIGZpbHRlcgorLSBDVURBIENVVklEIEguMjYzL1ZQOC9WUDkvMTAgYml0IEhFVkMgKERpdGhlcmVkKSBEZWNvZGluZworLSB2YWd1ZWRlbm9pc2VyIGZpbHRlcgorLSBhZGRlZCB0aHJlYWRzIG9wdGlvbiBwZXIgZmlsdGVyIGluc3RhbmNlCistIHdlYXZlIGZpbHRlcgorLSBnYmx1ciBmaWx0ZXIKKy0gYXZnYmx1ciBmaWx0ZXIKKy0gc29iZWwgYW5kIHByZXdpdHQgZmlsdGVyCistIE1lZGlhQ29kZWMgSEVWQy9NUEVHLTQvVlA4L1ZQOSBkZWNvZGluZworLSBNZXJpZGlhbiBMb3NzbGVzcyBQYWNraW5nIChNTFApIC8gVHJ1ZUhEIGVuY29kZXIKKy0gTm9uLUxvY2FsIE1lYW5zIChubG1lYW5zKSBkZW5vaXNpbmcgZmlsdGVyCistIHNkbDIgb3V0cHV0IGRldmljZSBhbmQgZmZwbGF5IHN1cHBvcnQKKy0gc2RsMSBvdXRwdXQgZGV2aWNlIGFuZCBzZGwxIHN1cHBvcnQgcmVtb3ZlZAorLSBleHRlbmRlZCBtb3YgZWRpdCBsaXN0IHN1cHBvcnQKKy0gbGliZmFhYyBlbmNvZGVyIHJlbW92ZWQKKy0gTWF0cm9za2EgbXV4ZXIgbm93IHdyaXRlcyBDUkMzMiBlbGVtZW50cyBieSBkZWZhdWx0IGluIGFsbCBMZXZlbCAxIGVsZW1lbnRzCistIHNpZGVkYXRhIHZpZGVvIGFuZCBhc2lkZWRhdGEgYXVkaW8gZmlsdGVyCistIENoYW5nZWQgbWFwcGluZyBvZiBydHAgTUlNRSB0eXBlIEc3MjYgdG8gY29kZWMgZzcyNmxlLgorLSBzcGVjIGNvbXBsaWFudCBWQUFQSS9EWFZBMiBWQy0xIGRlY29kaW5nIG9mIHNsaWNlcyBpbiBmcmFtZS1jb2RlZCBpbWFnZXMKKworCit2ZXJzaW9uIDMuMToKKy0gRFhWQTItYWNjZWxlcmF0ZWQgSEVWQyBNYWluMTAgZGVjb2RpbmcKKy0gZmllbGRoaW50IGZpbHRlcgorLSBsb29wIHZpZGVvIGZpbHRlciBhbmQgYWxvb3AgYXVkaW8gZmlsdGVyCistIEJvYiBXZWF2ZXIgZGVpbnRlcmxhY2luZyBmaWx0ZXIKKy0gZmlyZXF1YWxpemVyIGZpbHRlcgorLSBkYXRhc2NvcGUgZmlsdGVyCistIGJlbmNoIGFuZCBhYmVuY2ggZmlsdGVycworLSBjaWVzY29wZSBmaWx0ZXIKKy0gcHJvdG9jb2wgYmxhY2tsaXN0aW5nIEFQSQorLSBNZWRpYUNvZGVjIEgyNjQgZGVjb2RpbmcKKy0gVkMtMiBIUSBSVFAgcGF5bG9hZCBmb3JtYXQgKGRyYWZ0IHYxKSBkZXBhY2tldGl6ZXIgYW5kIHBhY2tldGl6ZXIKKy0gVlA5IFJUUCBwYXlsb2FkIGZvcm1hdCAoZHJhZnQgdjIpIHBhY2tldGl6ZXIKKy0gQXVkaW9Ub29sYm94IGF1ZGlvIGRlY29kZXJzCistIEF1ZGlvVG9vbGJveCBhdWRpbyBlbmNvZGVycworLSBjb3JlaW1hZ2UgZmlsdGVyIChHUFUgYmFzZWQgaW1hZ2UgZmlsdGVyaW5nIG9uIE9TWCkKKy0gbGliZGNhZGVjIHJlbW92ZWQKKy0gYml0c3RyZWFtIGZpbHRlciBmb3IgZXh0cmFjdGluZyBEVFMgY29yZQorLSBBRFBDTSBJTUEgREFUNCBkZWNvZGVyCistIG11c3ggZGVtdXhlcgorLSBhaXggZGVtdXhlcgorLSByZW1hcCBmaWx0ZXIKKy0gaGFzaCBhbmQgZnJhbWVoYXNoIG11eGVycworLSBjb2xvcnNwYWNlIGZpbHRlcgorLSBoZGNkIGZpbHRlcgorLSByZWFkdml0YyBmaWx0ZXIKKy0gVkFBUEktYWNjZWxlcmF0ZWQgZm9ybWF0IGNvbnZlcnNpb24gYW5kIHNjYWxpbmcKKy0gbGlibnBwL0NVREEtYWNjZWxlcmF0ZWQgZm9ybWF0IGNvbnZlcnNpb24gYW5kIHNjYWxpbmcKKy0gRHVjayBUcnVlTW90aW9uIDIuMCBSZWFsIFRpbWUgZGVjb2RlcgorLSBXaWRlYmFuZCBTaW5nbGUtYml0IERhdGEgKFdTRCkgZGVtdXhlcgorLSBWQUFQSS1hY2NlbGVyYXRlZCBILjI2NC9IRVZDL01KUEVHIGVuY29kaW5nCistIERUUyBFeHByZXNzIChMQlIpIGRlY29kZXIKKy0gR2VuZXJpYyBPcGVuTUFYIElMIGVuY29kZXIgd2l0aCBzdXBwb3J0IGZvciBSYXNwYmVycnkgUGkKKy0gSUZGIEFOSU0gZGVtdXhlciAmIGRlY29kZXIKKy0gRGlyZWN0IFN0cmVhbSBUcmFuc2ZlciAoRFNUKSBkZWNvZGVyCistIGxvdWRub3JtIGZpbHRlcgorLSBNVEFGIGRlbXV4ZXIgYW5kIGRlY29kZXIKKy0gTWFnaWNZVVYgZGVjb2RlcgorLSBPcGVuRXhyIGltcHJvdmVtZW50cyAodGlsZSBkYXRhIGFuZCBCNDQvQjQ0QSBzdXBwb3J0KQorLSBCaXRKYXp6IFNoZWVyVmlkZW8gZGVjb2RlcgorLSBDVURBIENVVklEIEgyNjQvSEVWQyBkZWNvZGVyCistIDEwLWJpdCBkZXB0aCBzdXBwb3J0IGluIG5hdGl2ZSB1dHZpZGVvIGRlY29kZXIKKy0gbGlidXR2aWRlbyB3cmFwcGVyIHJlbW92ZWQKKy0gWVVZMiBMb3NzbGVzcyBDb2RlYyBkZWNvZGVyCistIFZpZGVvVG9vbGJveCBILjI2NCBlbmNvZGVyCisKKwogdmVyc2lvbiAzLjA6CiAtIENvbW1vbiBFbmNyeXB0aW9uIChDRU5DKSBNUDQgZW5jb2RpbmcgYW5kIGRlY29kaW5nIHN1cHBvcnQKIC0gRFhWIGRlY29kaW5nCkBAIC04NzEsOCArMTQxOSw4IEBACiAtIHNob3dpbmZvIGZpbHRlciBhZGRlZAogLSBTTVBURSAzMDJNIEFFUzMgYXVkaW8gZGVjb2RlcgogLSBBcHBsZSBDb3JlIEF1ZGlvIEZvcm1hdCBtdXhlcgotLSA5Yml0IGFuZCAxMGJpdCBwZXIgc2FtcGxlIHN1cHBvcnQgaW4gdGhlIEguMjY0IGRlY29kZXIKLS0gOWJpdCBhbmQgMTBiaXQgRkZWMSBlbmNvZGluZyAvIGRlY29kaW5nCistIDkgYml0cyBhbmQgMTAgYml0cyBwZXIgc2FtcGxlIHN1cHBvcnQgaW4gdGhlIEguMjY0IGRlY29kZXIKKy0gOSBiaXRzIGFuZCAxMCBiaXRzIEZGVjEgZW5jb2RpbmcgLyBkZWNvZGluZwogLSBzcGxpdCBmaWx0ZXIgYWRkZWQKIC0gc2VsZWN0IGZpbHRlciBhZGRlZAogLSBzZGwgb3V0cHV0IGRldmljZSBhZGRlZApAQCAtMTE2NSw3ICsxNzEzLDcgQEAKIC0gcmF0ZSBkaXN0b3J0ZWQgb3B0aW1hbCBsYW1iZGEtPnFwIHN1cHBvcnQKIC0gQUFDIGVuY29kaW5nIHdpdGggbGliZmFhYwogLSBTdW5wbHVzIEpQRUcgY29kZWMgKFNQNVgpIHN1cHBvcnQKLS0gdXNlIExhZ3JhbmdlIG11bHRpcGxlciBpbnN0ZWFkIG9mIFFQIGZvciByYXRlY29udHJvbAorLSB1c2UgTGFncmFuZ2UgbXVsdGlwbGllciBpbnN0ZWFkIG9mIFFQIGZvciByYXRlY29udHJvbAogLSBUaGVvcmEvVlAzIGRlY29kaW5nIHN1cHBvcnQKIC0gWEEgYW5kIEFEWCBBRFBDTSBjb2RlY3MKIC0gZXhwb3J0IE1QRUctMiBhY3RpdmUgZGlzcGxheSBhcmVhIC8gcGFuIHNjYW4KZGlmZiAtLWdpdCBhL0xJQ0VOU0UubWQgYi9MSUNFTlNFLm1kCmluZGV4IDBjNTNkMGYuLmJhNjViMDUgMTAwNjQ0Ci0tLSBhL0xJQ0VOU0UubWQKKysrIGIvTElDRU5TRS5tZApAQCAtMSw0ICsxLDQgQEAKLSNGRm1wZWc6CisjIExpY2Vuc2UKIAogTW9zdCBmaWxlcyBpbiBGRm1wZWcgYXJlIHVuZGVyIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLjEKIG9yIGxhdGVyIChMR1BMIHYyLjErKS4gUmVhZCB0aGUgZmlsZSBgQ09QWUlORy5MR1BMdjIuMWAgZm9yIGRldGFpbHMuIFNvbWUgb3RoZXIKQEAgLTEzLDE4ICsxMywxOCBAQAogU3BlY2lmaWNhbGx5LCB0aGUgR1BMIHBhcnRzIG9mIEZGbXBlZyBhcmU6CiAKIC0gbGlicG9zdHByb2MKLS0gb3B0aW9uYWwgeDg2IG9wdGltaXphdGlvbnMgaW4gdGhlIGZpbGVzCi0gIC0gYGxpYmF2Y29kZWMveDg2L2ZsYWNfZHNwX2dwbC5hc21gCi0gIC0gYGxpYmF2Y29kZWMveDg2L2lkY3RfbW14LmNgCi0gIC0gYGxpYmF2ZmlsdGVyL3g4Ni92Zl9yZW1vdmVncmFpbi5hc21gCi0tIGxpYnV0dmlkZW8gZW5jb2RpbmcvZGVjb2Rpbmcgd3JhcHBlcnMgaW4KLSAgYGxpYmF2Y29kZWMvbGlidXR2aWRlbyouY3BwYAotLSB0aGUgWDExIGdyYWJiZXIgaW4gYGxpYmF2ZGV2aWNlL3gxMWdyYWIuY2AKLS0gdGhlIHN3cmVzYW1wbGUgdGVzdCBhcHAgaW4KLSAgYGxpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS10ZXN0LmNgCi0tIHRoZSBgdGV4aTJwb2QucGxgIHRvb2wKKy0gb3B0aW9uYWwgeDg2IG9wdGltaXphdGlvbiBpbiB0aGUgZmlsZXMKKyAgICAtIGBsaWJhdmNvZGVjL3g4Ni9mbGFjX2RzcF9ncGwuYXNtYAorICAgIC0gYGxpYmF2Y29kZWMveDg2L2lkY3RfbW14LmNgCisgICAgLSBgbGliYXZmaWx0ZXIveDg2L3ZmX3JlbW92ZWdyYWluLmFzbWAKKy0gdGhlIGZvbGxvd2luZyBidWlsZGluZyBhbmQgdGVzdGluZyB0b29scworICAgIC0gYGNvbXBhdC9zb2xhcmlzL21ha2Vfc3VudmVyLnBsYAorICAgIC0gYGRvYy90MmgucG1gCisgICAgLSBgZG9jL3RleGkycG9kLnBsYAorICAgIC0gYGxpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS10ZXN0LmNgCisgICAgLSBgdGVzdHMvY2hlY2thc20vKmAKKyAgICAtIGB0ZXN0cy90aW55X3NzaW0uY2AKIC0gdGhlIGZvbGxvd2luZyBmaWx0ZXJzIGluIGxpYmF2ZmlsdGVyOgotICAgIC0gYGZfZWJ1cjEyOC5jYAogICAgIC0gYHZmX2JsYWNrZnJhbWUuY2AKICAgICAtIGB2Zl9ib3hibHVyLmNgCiAgICAgLSBgdmZfY29sb3JtYXRyaXguY2AKQEAgLTQ3LDkgKzQ3LDkgQEAKICAgICAtIGB2Zl9wcC5jYAogICAgIC0gYHZmX3BwNy5jYAogICAgIC0gYHZmX3B1bGx1cC5jYAorICAgIC0gYHZmX3JlcGVhdGZpZWxkcy5jYAogICAgIC0gYHZmX3NhYi5jYAogICAgIC0gYHZmX3NtYXJ0Ymx1ci5jYAotICAgIC0gYHZmX3JlcGVhdGZpZWxkcy5jYAogICAgIC0gYHZmX3NwcC5jYAogICAgIC0gYHZmX3N0ZXJlbzNkLmNgCiAgICAgLSBgdmZfc3VwZXIyeHNhaS5jYApAQCAtNzMsMjAgKzczLDE3IEBACiAqIGB0ZXN0cy9yZWZlcmVuY2UucG5tYCBpcyB1bmRlciB0aGUgZXhwYXQgbGljZW5zZS4KIAogCi1leHRlcm5hbCBsaWJyYXJpZXMKLT09PT09PT09PT09PT09PT09PQorIyMgRXh0ZXJuYWwgbGlicmFyaWVzCiAKIEZGbXBlZyBjYW4gYmUgY29tYmluZWQgd2l0aCBhIG51bWJlciBvZiBleHRlcm5hbCBsaWJyYXJpZXMsIHdoaWNoIHNvbWV0aW1lcwogYWZmZWN0IHRoZSBsaWNlbnNpbmcgb2YgYmluYXJpZXMgcmVzdWx0aW5nIGZyb20gdGhlIGNvbWJpbmF0aW9uLgogCi1jb21wYXRpYmxlIGxpYnJhcmllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIyBDb21wYXRpYmxlIGxpYnJhcmllcwogCiBUaGUgZm9sbG93aW5nIGxpYnJhcmllcyBhcmUgdW5kZXIgR1BMOgogLSBmcmVpMHIKIC0gbGliY2RpbwogLSBsaWJydWJiZXJiYW5kCi0tIGxpYnV0dmlkZW8KIC0gbGlidmlkc3RhYgogLSBsaWJ4MjY0CiAtIGxpYngyNjUKQEAgLTEwMSwxNCArOTgsMjMgQEAKIHZlcnNpb24gMyBvZiB0aG9zZSBsaWNlbnNlcy4gU28gdG8gY29tYmluZSB0aGVzZSBsaWJyYXJpZXMgd2l0aCBGRm1wZWcsIHRoZQogbGljZW5zZSB2ZXJzaW9uIG5lZWRzIHRvIGJlIHVwZ3JhZGVkIGJ5IHBhc3NpbmcgYC0tZW5hYmxlLXZlcnNpb24zYCB0byBjb25maWd1cmUuCiAKLWluY29tcGF0aWJsZSBsaWJyYXJpZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIyBJbmNvbXBhdGlibGUgbGlicmFyaWVzCiAKLVRoZSBGcmF1bmhvZmVyIEFBQyBsaWJyYXJ5IGFuZCBGQUFDIGFyZSB1bmRlciBsaWNlbnNlcyB3aGljaAotYXJlIGluY29tcGF0aWJsZSB3aXRoIHRoZSBHUEx2MiBhbmQgdjMuIFdlIGRvIG5vdCBrbm93IGZvciBjZXJ0YWluIGlmIHRoZWlyCi1saWNlbnNlcyBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBMR1BMLgotSWYgeW91IHdpc2ggdG8gZW5hYmxlIHRoZXNlIGxpYnJhcmllcywgcGFzcyBgLS1lbmFibGUtbm9uZnJlZWAgdG8gY29uZmlndXJlLgotQnV0IG5vdGUgdGhhdCBpZiB5b3UgZW5hYmxlIGFueSBvZiB0aGVzZSBsaWJyYXJpZXMgdGhlIHJlc3VsdGluZyBiaW5hcnkgd2lsbAotYmUgdW5kZXIgYSBjb21wbGV4IGxpY2Vuc2UgbWl4IHRoYXQgaXMgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHRoZSBMR1BMIGFuZCB0aGF0Ci1tYXkgcmVzdWx0IGluIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMuIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlc2UKLXJlc3RyaWN0aW9ucyBjYXVzZSB0aGUgcmVzdWx0aW5nIGJpbmFyeSB0byBiZSB1bnJlZGlzdHJpYnV0ZWFibGUuCitUaGVyZSBhcmUgY2VydGFpbiBsaWJyYXJpZXMgeW91IGNhbiBjb21iaW5lIHdpdGggRkZtcGVnIHdob3NlIGxpY2Vuc2VzIGFyZSBub3QKK2NvbXBhdGlibGUgd2l0aCB0aGUgR1BMIGFuZC9vciB0aGUgTEdQTC4gSWYgeW91IHdpc2ggdG8gZW5hYmxlIHRoZXNlCitsaWJyYXJpZXMsIGV2ZW4gaW4gY2lyY3Vtc3RhbmNlcyB0aGF0IHRoZWlyIGxpY2Vuc2UgbWF5IGJlIGluY29tcGF0aWJsZSwgcGFzcworYC0tZW5hYmxlLW5vbmZyZWVgIHRvIGNvbmZpZ3VyZS4gQnV0IG5vdGUgdGhhdCBpZiB5b3UgZW5hYmxlIGFueSBvZiB0aGVzZQorbGlicmFyaWVzIHRoZSByZXN1bHRpbmcgYmluYXJ5IHdpbGwgYmUgdW5kZXIgYSBjb21wbGV4IGxpY2Vuc2UgbWl4IHRoYXQgaXMKK21vcmUgcmVzdHJpY3RpdmUgdGhhbiB0aGUgTEdQTCBhbmQgdGhhdCBtYXkgcmVzdWx0IGluIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMuCitJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZXNlIHJlc3RyaWN0aW9ucyBjYXVzZSB0aGUgcmVzdWx0aW5nIGJpbmFyeSB0byBiZQordW5yZWRpc3RyaWJ1dGFibGUuCisKK1RoZSBGcmF1bmhvZmVyIEZESyBBQUMgYW5kIE9wZW5TU0wgbGlicmFyaWVzIGFyZSB1bmRlciBsaWNlbnNlcyB3aGljaCBhcmUKK2luY29tcGF0aWJsZSB3aXRoIHRoZSBHUEx2MiBhbmQgdjMuIFRvIHRoZSBiZXN0IG9mIG91ciBrbm93bGVkZ2UsIHRoZXkgYXJlCitjb21wYXRpYmxlIHdpdGggdGhlIExHUEwuCisKK1RoZSBOVkVOQyBsaWJyYXJ5LCB3aGlsZSBpdHMgaGVhZGVyIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIGNvbXBhdGlibGUgTUlUCitsaWNlbnNlLCByZXF1aXJlcyBhIHByb3ByaWV0YXJ5IGJpbmFyeSBibG9iIGF0IHJ1biB0aW1lLCBhbmQgaXMgZGVlbWVkIHRvIGJlCitpbmNvbXBhdGlibGUgd2l0aCB0aGUgR1BMLiBXZSBhcmUgbm90IGNlcnRhaW4gaWYgaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQorTEdQTCwgYnV0IHdlIHJlcXVpcmUgYC0tZW5hYmxlLW5vbmZyZWVgIGV2ZW4gd2l0aCBMR1BMIGNvbmZpZ3VyYXRpb25zIGluIGNhc2UKK2l0IGlzIG5vdC4KZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggZTU3MTUwZC4uYjYxODU2MiAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTI5LDkgKzI5LDYgQEAKIGZmcHJvYmU6CiAgIGZmcHJvYmUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlZmFubyBTYWJhdGluaQogCi1mZnNlcnZlcjoKLSAgZmZzZXJ2ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXluYWxkbyBILiBWZXJkZWpvIFBpbm9jaGV0Ci0KIENvbW1hbmRsaW5lIHV0aWxpdHkgY29kZToKICAgY21kdXRpbHMuYywgY21kdXRpbHMuaCAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCiAKQEAgLTQyLDEyICszOSwxMiBAQAogTWlzY2VsbGFuZW91cyBBcmVhcwogPT09PT09PT09PT09PT09PT09PQogCi1kb2N1bWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlZmFubyBTYWJhdGluaSwgTWlrZSBNZWxhbnNvbiwgVGltb3RoeSBHdSwgTG91IExvZ2FuCi1idWlsZCBzeXN0ZW0gKGNvbmZpZ3VyZSwgbWFrZWZpbGVzKSAgICAgRGllZ28gQml1cnJ1biwgTWFucyBSdWxsZ2FyZAotcHJvamVjdCBzZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgIMOBcnDDoWQgR2VyZcO2ZmZ5LCBNaWNoYWVsIE5pZWRlcm1heWVyLCBSZWltYXIgRG9lZmZpbmdlciwgQWxleGFuZGVyIFN0cmFzc2VyLCBMb3UgTG9nYW4KK2RvY3VtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICBTdGVmYW5vIFNhYmF0aW5pLCBNaWtlIE1lbGFuc29uLCBUaW1vdGh5IEd1LCBMb3UgTG9nYW4sIEd5YW4gRG9zaGkKK3Byb2plY3Qgc2VydmVyICAgICAgICAgICAgICAgICAgICAgICAgICDDgXJww6FkIEdlcmXDtmZmeSwgTWljaGFlbCBOaWVkZXJtYXllciwgUmVpbWFyIERvZWZmaW5nZXIsIEFsZXhhbmRlciBTdHJhc3NlciwgTmlrb2xheSBBbGVrc2FuZHJvdgogcHJlc2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvYmVydCBTd2FpbgogbWV0YWRhdGEgc3Vic3lzdGVtICAgICAgICAgICAgICAgICAgICAgIEF1cmVsaWVuIEphY29icwogcmVsZWFzZSBtYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKK0FQSSB0ZXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMdWRtaWxhIEdsaW5za2loCiAKIAogQ29tbXVuaWNhdGlvbgpAQCAtNTYsMTAgKzUzLDExIEBACiB3ZWJzaXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVieSBCYXJiYXJhIExlcGFnZQogZmF0ZS5mZm1wZWcub3JnICAgICAgICAgICAgICAgICAgICAgICAgIFRpbW90aHkgR3UKIFRyYWMgYnVnIHRyYWNrZXIgICAgICAgICAgICAgICAgICAgICAgICBBbGV4YW5kZXIgU3RyYXNzZXIsIE1pY2hhZWwgTmllZGVybWF5ZXIsIENhcmwgRXVnZW4gSG95b3MsIExvdSBMb2dhbgotbWFpbGluZyBsaXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIsIEJhcHRpc3RlIENvdWR1cmllciwgTG91IExvZ2FuCittYWlsaW5nIGxpc3RzICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFwdGlzdGUgQ291ZHVyaWVyLCBMb3UgTG9nYW4KIEdvb2dsZSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wsIE1pY2hhZWwgTmllZGVybWF5ZXIsIEFsZXhhbmRlciBTdHJhc3NlcgogVHdpdHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvdSBMb2dhbiwgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldAogTGF1bmNocGFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbW90aHkgR3UKK2ZmbXBlZy1zZWN1cml0eSAgICAgICAgICAgICAgICAgICAgICAgICBBbmRyZWFzIENhZGhhbHB1biwgQ2FybCBFdWdlbiBIb3lvcywgQ2zDqW1lbnQgQsWTc2NoLCBNaWNoYWVsIE5pZWRlcm1heWVyLCBSZWltYXIgRG9lZmZpbmdlciwgUm9kZ2VyIENvbWJzLCB3bTQKIAogCiBsaWJhdnV0aWwKQEAgLTc5LDYgKzc3LDcgQEAKICAgZXZhbC5jLCBldmFsLmggICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCiAgIGZsb2F0X2RzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9yZW4gTWVycml0dAogICBoYXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlaW1hciBEb2VmZmluZ2VyCisgIGh3Y29udGV4dF9jdWRhKiAgICAgICAgICAgICAgICAgICAgICAgVGltbyBSb3RoZW5waWVsZXIKICAgaW50ZmxvYXQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCiAgIGludGVnZXIuYywgaW50ZWdlci5oICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgogICBsem8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlaW1hciBEb2VmZmluZ2VyCkBAIC04OSw3ICs4OCw2IEBACiAgIHJhdGlvbmFsLmMsIHJhdGlvbmFsLmggICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgogICByYzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlaW1hciBEb2VmZmluZ2VyCiAgIHJpcGVtZC5jLCByaXBlbWQuaCAgICAgICAgICAgICAgICAgICAgSmFtZXMgQWxtZXIKLSAgdGltZWNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbMOpbWVudCBCxZNzY2gKIAogCiBsaWJhdmNvZGVjCkBAIC0xMTUsMTAgKzExMywxMCBAQAogICAgIGx6dy4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgZmxvYXRpbmcgcG9pbnQgQUFOIERDVDoKICAgICBmYWFuZGN0LmMsIGZhYW5kY3QuaCAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCisgIE5vbi1wb3dlci1vZi10d28gTURDVDoKKyAgICBtZGN0MTUuYywgbWRjdDE1LmggICAgICAgICAgICAgICAgICBSb3N0aXNsYXYgUGVobGl2YW5vdgogICBHb2xvbWIgY29kaW5nOgogICAgIGdvbG9tYi5jLCBnb2xvbWIuaCAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKLSAgTFBDOgotICAgIGxwYy5jLCBscGMuaCAgICAgICAgICAgICAgICAgICAgICAgIEp1c3RpbiBSdWdnbGVzCiAgIG1vdGlvbiBlc3RpbWF0aW9uOgogICAgIG1vdGlvbiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgcmF0ZSBjb250cm9sOgpAQCAtMTM5LDQ3ICsxMzcsNDEgQEAKICAgOGJwcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb2JlcnRvIFRvZ25pCiAgIDhzdnguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFpa3Jpc2huYW4gTWVub24KICAgYWFjZW5jKiwgYWFjY29kZXIuYyAgICAgICAgICAgICAgICAgICBSb3N0aXNsYXYgUGVobGl2YW5vdgotICBhYXNjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgotICBhYzMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1c3RpbiBSdWdnbGVzCiAgIGFsYWNlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFpa3Jpc2huYW4gTWVub24KLSAgYWxzZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlsbyBCb3JnbWFubgotICBhcGVkZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgorICBhbHNkZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaWxvIEJvcmdtYW5uLCBVbWFpciBLaGFuCisgIGFwdHguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVyZWxpZW4gSmFjb2JzCiAgIGFzcyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVyZWxpZW4gSmFjb2JzCiAgIGFzdiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgotICBhdHJhYzMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlbmphbWluIExhcnNzb24KICAgYXRyYWMzcGx1cyogICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbSBQb2xpYWtvdnNraQorICBhdWRpb3Rvb2xib3gqICAgICAgICAgICAgICAgICAgICAgICAgIFJvZGdlciBDb21icwogICBiZ21jLmMsIGJnbWMuaCAgICAgICAgICAgICAgICAgICAgICAgIFRoaWxvIEJvcmdtYW5uCi0gIGJpbmsuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292CiAgIGJpbmthdWRpby5jICAgICAgICAgICAgICAgICAgICAgICAgICAgUGV0ZXIgUm9zcwotICBibXAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbnMgUnVsbGdhcmQsIEtvc3R5YSBTaGlzaGtvdgogICBjYXZzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZWZhbiBHZWhyZXIKICAgY2R4bC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgY2VscF9maWx0ZXJzLiogICAgICAgICAgICAgICAgICAgICAgICBWaXRvciBTZXNzYWsKICAgY2luZXBhay5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb2JlcnRvIFRvZ25pCiAgIGNpbmVwYWtlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgUmwgLyBBZXRleSBHLlQuIEFCCi0gIGNjYXB0aW9uX2RlYy5jICAgICAgICAgICAgICAgICAgICAgICAgQW5zaHVsIE1haGVzaHdhcmkKKyAgY2NhcHRpb25fZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICBBbnNodWwgTWFoZXNod2FyaSwgQW1hbiBHdXB0YQogICBjbGpyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsZXggQmVyZWdzemFzemkKLSAgY2xsYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJlayBCdWl0ZW5odWlzCi0gIGNvb2suYywgY29va2RhdGEuaCAgICAgICAgICAgICAgICAgICAgQmVuamFtaW4gTGFyc3NvbgogICBjcGlhLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZXBoYW4gSGlsYgogICBjcnlzdGFsaGQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoaWxpcCBMYW5nZGFsZQogICBjc2NkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlaW1hciBEb2VmZmluZ2VyCi0gIGRjYS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292LCBCZW5qYW1pbiBMYXJzc29uCisgIGN1dmlkZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltbyBSb3RoZW5waWVsZXIKKyAgZGNhKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb284NgogICBkaXJhYyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvc3Rpc2xhdiBQZWhsaXZhbm92CiAgIGRueGhkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFwdGlzdGUgQ291ZHVyaWVyCisgIGRvbGJ5X2UqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vODYKICAgZHBjbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWtlIE1lbGFuc29uCi0gIGRzc19zcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xla3NpaiBSZW1wZWwsIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAgZHNzX3NwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGVrc2lqIFJlbXBlbAogICBkdi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbWFuIFNoYXBvc2huaWsKICAgZHZic3ViZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnNodWwgTWFoZXNod2FyaQotICBkeGEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgogICBlYWNtdiosIGVhaWRjdCosIGVhdCogICAgICAgICAgICAgICAgIFBldGVyIFJvc3MKICAgZXZyYyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgZXhpZi5jLCBleGlmLmggICAgICAgICAgICAgICAgICAgICAgICBUaGlsbyBCb3JnbWFubgorICBleHIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnRpbiBWaWduYWxpCiAgIGZmdjEqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgogICBmZndhdmVzeW50aC5jICAgICAgICAgICAgICAgICAgICAgICAgIE5pY29sYXMgR2VvcmdlCi0gIGZpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyZWsgQnVpdGVuaHVpcwotICBmbGFjKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEp1c3RpbiBSdWdnbGVzCi0gIGZsYXNoc3YqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVuamFtaW4gTGFyc3NvbgorICBmaWZvLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbiBTZWJlY2hsZWJza3kKICAgZmxpY3ZpZGVvLmMgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWtlIE1lbGFuc29uCiAgIGc3MjIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFydGluIFN0b3Jzam8KICAgZzcyNi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb21hbiBTaGFwb3NobmlrCkBAIC0xODgsNjEgKzE4MCw0NyBAQAogICBoMjYzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgaDI2NCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb3JlbiBNZXJyaXR0LCBNaWNoYWVsIE5pZWRlcm1heWVyCiAgIGhhcCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tIEJ1dHRlcndvcnRoCi0gIGh1ZmZ5dXYqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllciwgQ2hyaXN0b3BoZSBHaXNxdWV0CisgIGh1ZmZ5dXYqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgogICBpZGNpbnZpZGVvLmMgICAgICAgICAgICAgICAgICAgICAgICAgIE1pa2UgTWVsYW5zb24KLSAgaW1jKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5qYW1pbiBMYXJzc29uCi0gIGluZGVvMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292Ci0gIGluZGVvNSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292CiAgIGludGVycGxheXZpZGVvLmMgICAgICAgICAgICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgotICBpdmkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgotICBqYWNvc3ViKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsw6ltZW50IELFk3NjaAorICBqbmkqLCBmZmpuaSogICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHRoaWV1IEJvdXJvbgogICBqcGVnMjAwMCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5pY29sYXMgQmVydHJhbmQKLSAganBlZ19scy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAganZkZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXRlciBSb3NzCi0gIGttdmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292CiAgIGxjbCouYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9iZXJ0byBUb2duaSwgUmVpbWFyIERvZWZmaW5nZXIKICAgbGliY2VsdF9kZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICBOaWNvbGFzIEdlb3JnZQorICBsaWJjb2RlYzIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvbWFzIEjDpHJkaW4KICAgbGliZGlyYWMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXZpZCBDb25yYWQKICAgbGliZ3NtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoZWwgQmFyZGlhdXgKICAgbGlia3ZhemFhci5jICAgICAgICAgICAgICAgICAgICAgICAgICBBcnR0dSBZbMOkLU91dGluZW4KICAgbGlib3BlbmpwZWcuYyAgICAgICAgICAgICAgICAgICAgICAgICBKYWlrcmlzaG5hbiBNZW5vbgogICBsaWJvcGVuanBlZ2VuYy5jICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgQnJhZHNoYXcKLSAgbGlic2Nocm9lZGluZ2VyKiAgICAgICAgICAgICAgICAgICAgICBEYXZpZCBDb25yYWQKLSAgbGlic3BlZXhkZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICBKdXN0aW4gUnVnZ2xlcwogICBsaWJ0aGVvcmFlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgIERhdmlkIENvbnJhZAotICBsaWJ1dHZpZGVvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcmwgRXVnZW4gSG95b3MKICAgbGlidm9yYmlzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXZpZCBDb25yYWQKICAgbGlidnB4KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYW1lcyBaZXJuCi0gIGxpYngyNjQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFucyBSdWxsZ2FyZCwgSmFzb24gR2FycmV0dC1HbGFzZXIKLSAgbGlieDI2NS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJlayBCdWl0ZW5odWlzCiAgIGxpYnhhdnMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlZmFuIEdlaHJlcgogICBsaWJ6dmJpLXRlbGV0ZXh0ZGVjLmMgICAgICAgICAgICAgICAgIE1hcnRvbiBCYWxpbnQKLSAgbG9jby5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAgbHpvLmgsIGx6by5jICAgICAgICAgICAgICAgICAgICAgICAgICBSZWltYXIgRG9lZmZpbmdlcgogICBtZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgbWltaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW1pcm8gUG9sbGEKICAgbWpwZWcqLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCi0gIG1scCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFtaXJvIFBvbGxhCisgIG1scCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFtaXJvIFBvbGxhLCBKYWkgTHV0aHJhCiAgIG1tdmlkZW8uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGV0ZXIgUm9zcwotICBtcGMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgogICBtcGVnMTIuYywgbXBlZzEyZGF0YS5oICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgbXBlZ3ZpZGVvLmMsIG1wZWd2aWRlby5oICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCiAgIG1xYyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmljb2xhcyBCZXJ0cmFuZAogICBtc21wZWc0LmMsIG1zbXBlZzRkYXRhLmggICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgbXNybGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWtlIE1lbGFuc29uCiAgIG1zdmlkZW8xLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgotICBuZWxseW1vc2VyZGVjLmMgICAgICAgICAgICAgICAgICAgICAgIEJlbmphbWluIExhcnNzb24KICAgbnV2LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWltYXIgRG9lZmZpbmdlcgotICBudmVuYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbW8gUm90aGVucGllbGVyCisgIG52ZGVjKiwgbnZlbmMqICAgICAgICAgICAgICAgICAgICAgICAgVGltbyBSb3RoZW5waWVsZXIKKyAgb3B1cyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3N0aXNsYXYgUGVobGl2YW5vdgogICBwYWYuKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAogICBwY3guYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl2byB2YW4gUG9vcnRlbgogICBwZ3NzdWJkZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlaW1hciBEb2VmZmluZ2VyCiAgIHB0eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXZvIHZhbiBQb29ydGVuCiAgIHFjZWxwKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV5bmFsZG8gSC4gVmVyZGVqbyBQaW5vY2hldAotICBxZG0yLmMsIHFkbTJkYXRhLmggICAgICAgICAgICAgICAgICAgIFJvYmVydG8gVG9nbmksIEJlbmphbWluIExhcnNzb24KLSAgcWRydy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKLSAgcXBlZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKLSAgcXN2KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdmFuIFVza292CisgIHFkbTIuYywgcWRtMmRhdGEuaCAgICAgICAgICAgICAgICAgICAgUm9iZXJ0byBUb2duaQorICBxc3YqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcmsgVGhvbXBzb24KICAgcXRybGUuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWtlIE1lbGFuc29uCiAgIHJhMTQ0LmMsIHJhMTQ0LmgsIHJhMjg4LmMsIHJhMjg4LmggICAgUm9iZXJ0byBUb2duaQogICByZXNhbXBsZTIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKQEAgLTI1MCw2NiArMjI4LDUxIEBACiAgIHJwemEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9iZXJ0byBUb2duaQogICBydGpwZWcuYywgcnRqcGVnLmggICAgICAgICAgICAgICAgICAgIFJlaW1hciBEb2VmZmluZ2VyCiAgIHJ2MTAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgotICBydjMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgotICBydjQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdiwgQ2hyaXN0b3BoZSBHaXNxdWV0CiAgIHMzdGMqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXZvIHZhbiBQb29ydGVuCi0gIHNtYWNrZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292CiAgIHNtYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgogICBzbXZqcGVnZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgIEFzaCBIdWdoZXMKICAgc25vdyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyLCBMb3JlbiBNZXJyaXR0CiAgIHNvbmljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxleCBCZXJlZ3N6YXN6aQorICBzcGVlZGhxLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZWluYXIgSC4gR3VuZGVyc29uCiAgIHNydCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVyZWxpZW4gSmFjb2JzCiAgIHN1bnJhc3QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXZvIHZhbiBQb29ydGVuCiAgIHN2cTMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgogICB0YWsqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAotICB0YXJnYS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgotICB0aWZmLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgogICB0cnVlbW90aW9uMSogICAgICAgICAgICAgICAgICAgICAgICAgIE1pa2UgTWVsYW5zb24KLSAgdHJ1ZW1vdGlvbjIqICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKLSAgdHJ1ZXNwZWVjaC5jICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKLSAgdHNjYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAgdHRhLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGV4IEJlcmVnc3phc3ppLCBKYWlrcmlzaG5hbiBNZW5vbgogICB0dGFlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAogICB0eGQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl2byB2YW4gUG9vcnRlbgotICB1bHRpKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgotICB2NDEwKi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcmVrIEJ1aXRlbmh1aXMKLSAgdmIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKLSAgdmJsZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJlayBCdWl0ZW5odWlzCi0gIHZjMSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292LCBDaHJpc3RvcGhlIEdpc3F1ZXQKKyAgdjRsMl8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb3JnZSBSYW1pcmV6LU9ydGl6CiAgIHZjMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9zdGlzbGF2IFBlaGxpdmFub3YKICAgdmNyMS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCi0gIHZkYV9oMjY0X2RlYy5jICAgICAgICAgICAgICAgICAgICAgICAgWGlkb3JuIFF1YW4KKyAgdmlkZW90b29sYm94ZW5jLmMgICAgICAgICAgICAgICAgICAgICBSaWNrIEtlcm4sIEFtYW4gR3VwdGEKICAgdmltYS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKLSAgdm1uYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAgdm9yYmlzZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5lcyBCYWxhdG9uaSwgRGF2aWQgQ29ucmFkCiAgIHZvcmJpc2VuYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgT2RlZCBTaGltb24KICAgdnAzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWtlIE1lbGFuc29uCiAgIHZwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVyZWxpZW4gSmFjb2JzCiAgIHZwNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVyZWxpZW4gSmFjb2JzCi0gIHZwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF2aWQgQ29ucmFkLCBKYXNvbiBHYXJyZXR0LUdsYXNlciwgUm9uYWxkIEJ1bHRqZQotICB2cDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbmFsZCBCdWx0amUsIENsw6ltZW50IELFk3NjaAorICB2cDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdmlkIENvbnJhZCwgUm9uYWxkIEJ1bHRqZQorICB2cDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbmFsZCBCdWx0amUKICAgdnFhdmlkZW8uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWtlIE1lbGFuc29uCi0gIHdhdnBhY2suYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292CiAgIHdtYXByb2RlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FzY2hhIFNvbW1lcgogICB3bWF2b2ljZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvbmFsZCBTLiBCdWx0amUKICAgd212Mi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCi0gIHdudjEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS29zdHlhIFNoaXNoa292CiAgIHhhbi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgogICB4Ym0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAogICB4ZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZWZhbm8gU2FiYXRpbmkKLSAgeGwuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAgeHZtYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdmFuIEthbHZhY2hldgogICB4d2QqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAotICB6ZXJvY29kZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcmVrIEJ1aXRlbmh1aXMKLSAgem1idiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKIAogSGFyZHdhcmUgYWNjZWxlcmF0aW9uOgogICBjcnlzdGFsaGQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoaWxpcCBMYW5nZGFsZQotICBkeHZhMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlbmRyaWsgTGVwcGtlcywgTGF1cmVudCBBaW1hcgorICBkeHZhMiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhlbmRyaWsgTGVwcGtlcywgTGF1cmVudCBBaW1hciwgU3RldmUgTGhvbW1lCisgIGQzZDExdmEqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RldmUgTGhvbW1lCisgIG1lZGlhY29kZWMqICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0dGhpZXUgQm91cm9uLCBBbWFuIEd1cHRhCiAgIHZhYXBpKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3dlbm9sZSBCZWF1Y2hlc25lCi0gIHZkYSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2ViYXN0aWVuIFp3aWNrZXJ0CisgIHZhYXBpX2VuY29kZSogICAgICAgICAgICAgICAgICAgICAgICAgTWFyayBUaG9tcHNvbgogICB2ZHBhdSogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBoaWxpcCBMYW5nZGFsZSwgQ2FybCBFdWdlbiBIb3lvcwotICB2aWRlb3Rvb2xib3gqICAgICAgICAgICAgICAgICAgICAgICAgIFNlYmFzdGllbiBad2lja2VydAorICB2aWRlb3Rvb2xib3gqICAgICAgICAgICAgICAgICAgICAgICAgIFJpY2sgS2VybiwgQW1hbiBHdXB0YQogCiAKIGxpYmF2ZGV2aWNlCkBAIC0zMTksNyArMjgyLDggQEAKIAogCiAgIGF2Zm91bmRhdGlvbi5tICAgICAgICAgICAgICAgICAgICAgICAgVGhpbG8gQm9yZ21hbm4KLSAgZGVja2xpbmsqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXRpIEZsaWVnbAorICBhbmRyb2lkX2NhbWVyYS5jICAgICAgICAgICAgICAgICAgICAgIEZlbGl4IE1hdG91c2NoZWsKKyAgZGVja2xpbmsqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJ0b24gQmFsaW50CiAgIGRzaG93LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9nZXIgUGFjayAoQ0Mgcm9nZXJkcGFja0BnbWFpbC5jb20pCiAgIGZiZGV2X2VuYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgTHVrYXN6IE1hcmVrCiAgIGdkaWdyYWIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9nZXIgUGFjayAoQ0Mgcm9nZXJkcGFja0BnbWFpbC5jb20pCkBAIC0zMjgsOCArMjkyLDggQEAKICAgbGliZGMxMzk0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICBSb21hbiBTaGFwb3NobmlrCiAgIG9wZW5nbF9lbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgTHVrYXN6IE1hcmVrCiAgIHB1bHNlX2F1ZGlvX2VuYy5jICAgICAgICAgICAgICAgICAgICAgTHVrYXN6IE1hcmVrCi0gIHF0a2l0Lm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpbG8gQm9yZ21hbm4KICAgc2RsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGVmYW5vIFNhYmF0aW5pCisgIHNkbDIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9zaCBkZSBLb2NrCiAgIHY0bDIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2lvcmdpbyBWYXp6YW5hCiAgIHZmd2NhcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFtaXJvIFBvbGxhCiAgIHh2LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHVrYXN6IE1hcmVrCkBAIC0zNDAsNiArMzA0LDggQEAKIEdlbmVyaWMgcGFydHM6CiAgIGdyYXBoZHVtcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgTmljb2xhcyBHZW9yZ2UKIAorICBtb3Rpb25fZXN0aW1hdGlvbi5jICAgICAgICAgICAgICAgICAgIERhdmluZGVyIFNpbmdoCisKIEZpbHRlcnM6CiAgIGZfZHJhd2dyYXBoLmMgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIGFmX2FkZWxheS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCkBAIC0zNTMsNyArMzE5LDEwIEBACiAgIGFmX2JpcXVhZHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIGFmX2Nob3J1cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIGFmX2NvbXBhbmQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCisgIGFmX2ZpcmVxdWFsaXplci5jICAgICAgICAgICAgICAgICAgICAgTXVoYW1tYWQgRmFpegorICBhZl9oZGNkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1cnQgUC4KICAgYWZfbGFkc3BhLmMgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKKyAgYWZfbG91ZG5vcm0uYyAgICAgICAgICAgICAgICAgICAgICAgICBLeWxlIFN3YW5zb24KICAgYWZfcGFuLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaWNvbGFzIEdlb3JnZQogICBhZl9zaWRlY2hhaW5jb21wcmVzcy5jICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAogICBhZl9zaWxlbmNlcmVtb3ZlLmMgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbApAQCAtMzYxLDExICszMzAsMTMgQEAKICAgYXZmX2F2ZWN0b3JzY29wZS5jICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgYXZmX3Nob3djcXQuYyAgICAgICAgICAgICAgICAgICAgICAgICBNdWhhbW1hZCBGYWl6CiAgIHZmX2JsZW5kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCisgIHZmX2J3ZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhvbWFzIE11bmR0IChDQyA8dGhvbWFzLm11bmR0QGhyLmRlPikKICAgdmZfY2hyb21ha2V5LmMgICAgICAgICAgICAgICAgICAgICAgICBUaW1vIFJvdGhlbnBpZWxlcgogICB2Zl9jb2xvcmNoYW5uZWxtaXhlci5jICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAogICB2Zl9jb2xvcmJhbGFuY2UuYyAgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAogICB2Zl9jb2xvcmtleS5jICAgICAgICAgICAgICAgICAgICAgICAgIFRpbW8gUm90aGVucGllbGVyCiAgIHZmX2NvbG9ybGV2ZWxzLmMgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCisgIHZmX2NvcmVpbWFnZS5tICAgICAgICAgICAgICAgICAgICAgICAgVGhpbG8gQm9yZ21hbm4KICAgdmZfZGViYW5kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgdmZfZGVqdWRkZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICBOaWNob2xhcyBSb2JiaW5zCiAgIHZmX2RlbG9nby5jICAgICAgICAgICAgICAgICAgICAgICAgICAgSmVhbiBEZWx2YXJlIChDQyA8amRlbHZhcmVAc3VzZS5jb20+KQpAQCAtMzc1LDExICszNDYsMTUgQEAKICAgdmZfaHF4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbMOpbWVudCBCxZNzY2gKICAgdmZfaWRldC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNjYWwgTWFzc2ltaW5vCiAgIHZmX2lsLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCisgIHZmXyh0KWludGVybGFjZSAgICAgICAgICAgICAgICAgICAgICAgVGhvbWFzIE11bmR0IChDQyA8dGhvbWFzLm11bmR0QGhyLmRlPikKICAgdmZfbGVuc2NvcnJlY3Rpb24uYyAgICAgICAgICAgICAgICAgICBEYW5pZWwgT2JlcmhvZmYKICAgdmZfbWVyZ2VwbGFuZXMuYyAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKKyAgdmZfbWVzdGltYXRlLmMgICAgICAgICAgICAgICAgICAgICAgICBEYXZpbmRlciBTaW5naAorICB2Zl9taW50ZXJwb2xhdGUuYyAgICAgICAgICAgICAgICAgICAgIERhdmluZGVyIFNpbmdoCiAgIHZmX25laWdoYm9yLmMgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIHZmX3BzbnIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIHZmX3JhbmRvbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCisgIHZmX3JlYWR2aXRjLmMgICAgICAgICAgICAgICAgICAgICAgICAgVG9iaWFzIFJhcHAgKENDIHQucmFwcCBhdCBub2EtYXJjaGl2ZSBkb3QgY29tKQogICB2Zl9zY2FsZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgdmZfc2VwYXJhdGVmaWVsZHMuYyAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgdmZfc3NpbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKQEAgLTM5OSw2ICszNzQsNyBAQAogICAgIGxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmggICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgVXRpbGl0eSBDb2RlOgogICAgIGxpYmF2Zm9ybWF0L3V0aWxzLmMgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAgVGV4dCBTdWJ0aXRsZXMgICAgICAgICAgICAgICAgICAgICAgICBDbMOpbWVudCBCxZNzY2gKIAogCiBNdXhlcnMvRGVtdXhlcnM6CkBAIC00MDgsMzQgKzM4NCwzNyBAQAogICBhZmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAogICBhaWZmZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhcHRpc3RlIENvdWR1cmllciwgTWF0dGhpZXUgQm91cm9uCiAgIGFpZmZlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFwdGlzdGUgQ291ZHVyaWVyLCBNYXR0aGlldSBCb3Vyb24KLSAgYXBlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAgYXBuZ2RlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZW5vaXQgRm91ZXQKICAgYXNzKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXJlbGllbiBKYWNvYnMKICAgYXN0ZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgYXN0ZW5jLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYW1lcyBBbG1lcgogICBhdmkqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKLSAgYXZpc3ludGguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdnhTeW50aCBUZWFtIChhdnhzeW50aC50ZXN0aW5nIGF0IGdtYWlsIGRvdCBjb20pCisgIGF2aXN5bnRoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RlcGhlbiBIdXRjaGluc29uCiAgIGF2ci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIGJpbmsuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGV0ZXIgUm9zcworICBib2FkZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKICAgYnJzdG0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgY2FmKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXRlciBSb3NzCiAgIGNkeGwuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCisgIGNvZGVjMi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tYXMgSMOkcmRpbgogICBjcmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAgZGFzaGRlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGV2ZW4gTGl1CisgIGRhc2hlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2FydGhpY2sgSmV5YXBhbAogICBkYXVkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlaW1hciBEb2VmZmluZ2VyCi0gIGRzcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xla3NpaiBSZW1wZWwsIE1pY2hhZWwgTmllZGVybWF5ZXIKKyAgZHNzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGVrc2lqIFJlbXBlbAorICBkdHNkZWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbzg2CiAgIGR0c2hkZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIGR2LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9tYW4gU2hhcG9zaG5pawotICBkeGEuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtvc3R5YSBTaGlzaGtvdgogICBlbGVjdHJvbmljYXJ0cy5jICAgICAgICAgICAgICAgICAgICAgIFBldGVyIFJvc3MKICAgZXBhZmRlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgZmZtKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXB0aXN0ZSBDb3VkdXJpZXIKLSAgZmxhYyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKdXN0aW4gUnVnZ2xlcwogICBmbGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pa2UgTWVsYW5zb24KLSAgZmx2ZGVjLmMsIGZsdmVuYy5jICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCisgIGZsdmRlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgorICBmbHZlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIsIFN0ZXZlbiBMaXUKICAgZ3hmLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWltYXIgRG9lZmZpbmdlcgogICBneGZlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhcHRpc3RlIENvdWR1cmllcgogICBobHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuc3NpIEhhbm51bGEKLSAgaGxzIGVuY3J5cHRpb24gKGhsc2VuYy5jKSAgICAgICAgICAgICBDaHJpc3RpYW4gU3Vsb3dheQorICBobHNlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENocmlzdGlhbiBTdWxvd2F5LCBTdGV2ZW4gTGl1CiAgIGlkY2luLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgogICBpZHJvcWRlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pa2UgTWVsYW5zb24KICAgaWZmLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYWlrcmlzaG5hbiBNZW5vbgpAQCAtNDQzLDEwICs0MjIsOSBAQAogICBpcG1vdmllLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pa2UgTWVsYW5zb24KICAgaXJjYW0qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgaXNzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGVmYW4gR2VocmVyCi0gIGphY29zdWIqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2zDqW1lbnQgQsWTc2NoCiAgIGp2ZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGV0ZXIgUm9zcwogICBsaWJtb2RwbHVnLmMgICAgICAgICAgICAgICAgICAgICAgICAgIENsw6ltZW50IELFk3NjaAotICBsaWJudXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9kZWQgU2hpbW9uCisgIGxpYm9wZW5tcHQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgSm9zaCBkZSBLb2NrCiAgIGxtbG00LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXZvIHZhbiBQb29ydGVuCiAgIGx2ZmRlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIGx4ZmRlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9tYXMgSMOkcmRpbgpAQCAtNDU4LDEwICs0MzYsOSBAQAogICBtZ3N0cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdWwgQiBNYWhvbAogICBtaWNyb2R2ZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1cmVsaWVuIEphY29icwogICBtbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBldGVyIFJvc3MKLSAgbW92LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyLCBCYXB0aXN0ZSBDb3VkdXJpZXIKKyAgbW92LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXB0aXN0ZSBDb3VkdXJpZXIKICAgbW92ZW5jLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXB0aXN0ZSBDb3VkdXJpZXIsIE1hdHRoaWV1IEJvdXJvbgogICBtb3ZlbmNjZW5jLmMgICAgICAgICAgICAgICAgICAgICAgICAgIEVyYW4gS29ybmJsYXUKLSAgbXBjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAgbXBlZy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCiAgIG1wZWdlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgogICBtcGVndHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnRvbiBCYWxpbnQKQEAgLTQ2OSw3ICs0NDYsNiBAQAogICBtc253Y190Y3AuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbWlybyBQb2xsYQogICBtdHYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJleW5hbGRvIEguIFZlcmRlam8gUGlub2NoZXQKICAgbXhmKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXB0aXN0ZSBDb3VkdXJpZXIKLSAgbXhmZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUb21hcyBIw6RyZGluCiAgIG5pc3RzcGhlcmVkZWMuYyAgICAgICAgICAgICAgICAgICAgICAgUGF1bCBCIE1haG9sCiAgIG5zdmRlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbmNvaXMgUmV2b2wKICAgbnV0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCkBAIC00ODcsOCArNDYzLDcgQEAKICAgcmF3LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCiAgIHJkdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9uYWxkIFMuIEJ1bHRqZQogICBybDIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhc2NoYSBTb21tZXIKLSAgcm1kZWMuYywgcm1lbmMuYyAgICAgICAgICAgICAgICAgICAgICBSb25hbGQgUy4gQnVsdGplLCBLb3N0eWEgU2hpc2hrb3YKLSAgcnRtcCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKKyAgcm1kZWMuYywgcm1lbmMuYyAgICAgICAgICAgICAgICAgICAgICBSb25hbGQgUy4gQnVsdGplCiAgIHJ0cC5jLCBydHBlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgTWFydGluIFN0b3Jzam8KICAgcnRwZGVjX2FjMy4qICAgICAgICAgICAgICAgICAgICAgICAgICBHaWxsZXMgQ2hhbnRlcGVyZHJpeAogICBydHBkZWNfZHYuKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRob21hcyBWb2xrZXJ0CkBAIC00OTYsMTUgKzQ3MSwxNCBAQAogICBydHBkZWNfaGV2Yy4qLCBydHBlbmNfaGV2Yy4qICAgICAgICAgIFRob21hcyBWb2xrZXJ0CiAgIHJ0cGRlY19tcGFfcm9idXN0LiogICAgICAgICAgICAgICAgICAgR2lsbGVzIENoYW50ZXBlcmRyaXgKICAgcnRwZGVjX2FzZi4qICAgICAgICAgICAgICAgICAgICAgICAgICBSb25hbGQgUy4gQnVsdGplCisgIHJ0cGRlY192YzJocS4qLCBydHBlbmNfdmMyaHEuKiAgICAgICAgVGhvbWFzIFZvbGtlcnQKICAgcnRwZGVjX3ZwOS5jICAgICAgICAgICAgICAgICAgICAgICAgICBUaG9tYXMgVm9sa2VydAogICBydHBlbmNfbXB2LiosIHJ0cGVuY19hYWMuKiAgICAgICAgICAgIE1hcnRpbiBTdG9yc2pvCi0gIHJ0c3AuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHVjYSBCYXJiYXRvCisgIHMzMzdtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vODYKICAgc2JnZGVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOaWNvbGFzIEdlb3JnZQogICBzZHAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnRpbiBTdG9yc2pvCiAgIHNlZ2FmaWxtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgogICBzZWdtZW50LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZWZhbm8gU2FiYXRpbmkKLSAgc2lmZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKLSAgc21hY2tlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAgc21qcGVnKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKICAgc3BkaWYqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbnNzaSBIYW5udWxhCiAgIHNydGRlYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVyZWxpZW4gSmFjb2JzCkBAIC01MTksNyArNDkzLDYgQEAKICAgd2VidnR0KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXR0aGV3IEogSGVhbmV5CiAgIHdlc3R3b29kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlrZSBNZWxhbnNvbgogICB3dHYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBldGVyIFJvc3MKLSAgd3YuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLb3N0eWEgU2hpc2hrb3YKICAgd3ZlbmMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXVsIEIgTWFob2wKIAogUHJvdG9jb2xzOgpAQCAtNTUwLDIwICs1MjMsNDUgQEAKIE9wZXJhdGluZyBzeXN0ZW1zIC8gQ1BVIGFyY2hpdGVjdHVyZXMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotQWxwaGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbnMgUnVsbGdhcmQsIEZhbGsgSHVlZmZuZXIKLUFSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYW5zIFJ1bGxnYXJkCi1BVlIzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFucyBSdWxsZ2FyZAotTUlQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbnMgUnVsbGdhcmQsIE5lZGVsamtvIEJhYmljCitBbHBoYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsayBIdWVmZm5lcgorTUlQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbm9qa3VtYXIgQmhvc2FsZQogTWFjIE9TIFggLyBQb3dlclBDICAgICAgICAgICAgICAgICAgICAgIFJvbWFpbiBEb2xiZWF1LCBHdWlsbGF1bWUgUG9pcmllcgogQW1pZ2EgLyBQb3dlclBDICAgICAgICAgICAgICAgICAgICAgICAgIENvbGluIFdhcmQKLUxpbnV4IC8gUG93ZXJQQyAgICAgICAgICAgICAgICAgICAgICAgICBMdWNhIEJhcmJhdG8KIFdpbmRvd3MgTWluR1cgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGV4IEJlcmVnc3phc3ppLCBSYW1pcm8gUG9sbGEKIFdpbmRvd3MgQ3lnd2luICAgICAgICAgICAgICAgICAgICAgICAgICBWaWN0b3IgUGFlc2EKIFdpbmRvd3MgTVNWQyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXR0aGV3IE9saXZlciwgSGVuZHJpayBMZXBwa2VzCiBXaW5kb3dzIElDTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0dGhldyBPbGl2ZXIKIEFESS9CbGFja2ZpbiBEU1AgICAgICAgICAgICAgICAgICAgICAgICBNYXJjIEhvZmZtYW4KIFNwYXJjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb21hbiBTaGFwb3NobmlrCi14ODYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgorT1MvMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtPIE15dW5nLUh1bgorCisKK0RldmVsb3BlcnMgd2l0aCBnaXQgd3JpdGUgYWNjZXNzIHdobyBhcmUgY3VycmVudGx5IG5vdCBtYWludGFpbmluZyBhbnkgc3BlY2lmaWMgcGFydAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitBbGV4IENvbnZlcnNlCitBbmRyZWFzIENhZGhhbHB1bgorQW51cmFkaGEgU3VyYXBhcmFqdQorQmVuIExpdHRsZXIKK0JlbmphbWluIExhcnNzb24KK0JvYmJ5IEJpbmdoYW0KK0RhbmllbCBWZXJrYW1wCitEZXJlayBCdWl0ZW5odWlzCitHYW5lc2ggQWpqYW5hZ2FkZGUKK0hlbnJpayBHcmFtbmVyCitJdmFuIFVza292CitKYW1lcyBEYXJubGV5CitKYW4gRWtzdHLDtm0KK0pvYWtpbSBQbGF0ZQorSnVuIFpoYW8KK0tpZXJhbiBLdW5oeWEKK0tpcmlsbCBHYXZyaWxvdgorTWFydGluIFN0b3JzasO2CitQYW5hZ2lvdGlzIElzc2FyaXMKK1BlZHJvIEFydGh1cgorU2ViYXN0aWVuIFp3aWNrZXJ0CitWaXR0b3JpbyBHaW92YXJhCit3bTQKKyh0aGlzIGxpc3QgaXMgaW5jb21wbGV0ZSkKIAogCiBSZWxlYXNlcwpAQCAtNTczLDcgKzU3MSw2IEBACiAyLjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgogMi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY2hhZWwgTmllZGVybWF5ZXIKIDIuNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNoYWVsIE5pZWRlcm1heWVyCi0yLjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljaGFlbCBOaWVkZXJtYXllcgogCiBJZiB5b3Ugd2FudCB0byBtYWludGFpbiBhbiBvbGRlciByZWxlYXNlLCBwbGVhc2UgY29udGFjdCB1cwogCkBAIC01ODMsNyArNTgwLDYgQEAKIAogQWxleGFuZGVyIFN0cmFzc2VyICAgICAgICAgICAgMUM5NiA3OEI3IDgzQ0IgOEFBNyA5QUY1IEQxRUIgQTdEOCBBNTdCIEE4NzYgRTU4RgogQW5zc2kgSGFubnVsYSAgICAgICAgICAgICAgICAgMUE5MiBGRjQyIDJERDkgOEQyRSA4QUY3IDY1QTkgNDI3OCBDNTIwIDUxM0QgRjNDQgotQW50b24gS2hpcm5vdiAgICAgICAgICAgICAgICAgNkQwQyA2NjI1IDU2RjggNjVEMSBFNUY1IDgxNEIgQjUwQSAxMjQxIEMwNjcgMDdBQgogQXNoIEh1Z2hlcyAgICAgICAgICAgICAgICAgICAgNjk0RCA0M0QyIEQxODAgQzdDNyA2NDIxIEFCRDMgQTY0MSBEMEI3IDYyM0QgNjAyOQogQXR0aWxhIEtpbmFsaSAgICAgICAgICAgICAgICAgMTFGMCBGOUE2IEExRDIgMTFGNiBDNzQ1IEQxMEMgNjUyMCBCQ0REIEYyREYgRTc2NQogQmFwdGlzdGUgQ291ZHVyaWVyICAgICAgICAgICAgOEQ3NyAxMzREIDIwQ0MgOTIyMCAyMDFGIEM1REIgMEFDOSAzMjVDIDVDMUEgQkFBQQpAQCAtNTkxLDE4ICs1ODcsMTcgQEAKIEJlbm9pdCBGb3VldCAgICAgICAgICAgICAgICAgIEIyMkEgNEY0RiA0M0VGIDYzNkIgQkI2NiBGQ0RDIDAwMjMgQUUxRSAyOTg1IDQ5QzgKIENsw6ltZW50IELFk3NjaCAgICAgICAgICAgICAgICAgNTJEMCAzQTgyIEQ0NDUgRjE5NCBEQjhCIDJCMTYgODdFRSAyQ0I4IEY0QjggRkNGOQogRGFuaWVsIFZlcmthbXAgICAgICAgICAgICAgICAgNzhBNiAwN0VEIDc4MkMgNjUzRSBDNjI4IEI4QjkgRjBFQiA4REQ4IDJGMEUgMjFDNwotRGllZ28gQml1cnJ1biAgICAgICAgICAgICAgICAgODIyNyAxRTMxIEI2RDkgNDk5NCA3NDI3IEUyMjAgOUNBRSBENkNDIDQ3NTcgRkNDNQogRkZtcGVnIHJlbGVhc2Ugc2lnbmluZyBrZXkgICAgRkNGOSA4NkVBIDE1RTYgRTI5MyBBNTY0IDRGMTAgQjQzMiAyRjA0IEQ2NzYgNThEOAogR2FuZXNoIEFqamFuYWdhZGRlICAgICAgICAgICAgQzk2QSA4NDhFIDk3QzMgQ0VBMiBBQjcyIDVDRTQgNDVGOSA2QTJEIDNDMzYgRkIxQgogR3dlbm9sZSBCZWF1Y2hlc25lICAgICAgICAgICAgMkU2MyBCM0E2IDNFNDQgMzdFMiAwMTdEIDI3MDQgNTNDNyA2MjY2IEIxNTMgOTlDNAogSmFpa3Jpc2huYW4gTWVub24gICAgICAgICAgICAgNjFBMSBGMDlGIDAxQzkgMkQ0NSA3OEUxIEM4NjIgMjVEQyA4ODMxIEFGNzAgRDM2OAorSmFtZXMgQWxtZXIgICAgICAgICAgICAgICAgICAgNzc1MSAyRThDIEZEOTQgQTE2OSA1N0U2IDlBN0EgMTQ2MyAwMUFEIDczNzYgNTlFMAogSmVhbiBEZWx2YXJlICAgICAgICAgICAgICAgICAgN0NBNiA5RjQ0IDYwRjEgQkRDNCAxRkQyIEM4NTggQTU1MiA2QjlCIEIzQ0QgNEU2QQotSnVzdGluIFJ1Z2dsZXMgICAgICAgICAgICAgICAgMzEzNiBFQ0MwIEMxMEQgNkMwNCA1RjQzIENBMjkgRkNCRSBDRDJBIDM3ODcgMUVCRgogTG9yZW4gTWVycml0dCAgICAgICAgICAgICAgICAgQUJEOSAwOEY0IEM5MjAgM0Y2NSBEOEJFIDM1RDcgMTU0MCBEQUE3IDA2MEYgNTZERQogTG91IExvZ2FuICAgICAgICAgICAgICAgICAgICAgN0Q2OCBEQzczIENCRUYgRUFCQiA2NzFBIEI2Q0YgNjIxQyAyRTI4IDgyRjggREMzQQotTHVjYSBCYXJiYXRvICAgICAgICAgICAgICAgICAgNjY3NyA0MjA5IDIxM0MgODg0MyA1QjY3IDI5RTcgRTg0QyA3OEMyIDg0RTkgMEUzNAogTWljaGFlbCBOaWVkZXJtYXllciAgICAgICAgICAgOUZGMiAxMjhCIDE0N0UgRjY3MyAwQkFEIEYxMzMgNjExRSBDNzg3IDA0MEIgMEZBQgogTmljb2xhcyBHZW9yZ2UgICAgICAgICAgICAgICAgMjRDRSAwMUNFIDlBQ0MgNUNFQiA3NEQ4IDhEOUQgQjA2MyBEOTk3IDM2RTUgNEM5MworTmlrb2xheSBBbGVrc2FuZHJvdiAgICAgICAgICAgODk3OCAxRDhDIEZCNzEgNTg4RSA0QjI3IEVBQTggQzRGMCBCNUZDIEUwMTEgMTNCMQogUGFuYWdpb3RpcyBJc3NhcmlzICAgICAgICAgICAgNjU3MSAxM0EzIDMzRDkgMzcyNiBGNzI4IEFBOTggRjY0MyBCMTJFIEVDRjMgRTAyOQogUGV0ZXIgUm9zcyAgICAgICAgICAgICAgICAgICAgQTkwNyBFMDJGIEE2RTUgMENEMiAzNENEIDIwRDIgNjc2MCA3OUM1IEFDNDAgREQ2QgogUGhpbGlwIExhbmdkYWxlICAgICAgICAgICAgICAgNURDNSA4RDY2IDVGQkEgM0E0MyAxOEVDIDA0NUUgRjhENiBCMTk0IDZBNzUgNjgyRQpAQCAtNjEyLDYgKzYwNyw3IEBACiBSb2JlcnQgU3dhaW4gICAgICAgICAgICAgICAgICBFRTdBIDU2RUEgNEE4MSBBN0I1IDIwMDEgQTUyMSA2N0ZBIDM2MkQgQTJGQyAzRTcxCiBTYXNjaGEgU29tbWVyICAgICAgICAgICAgICAgICAzOEEwIEY4OEIgODY4RSA5RDNBIDk3RDQgRDZBMCBFODIzIDcwNkYgMUUwNyAwRDNDCiBTdGVmYW5vIFNhYmF0aW5pICAgICAgICAgICAgICAwRDBCIEFENkIgNTMzMCBCQkFEIEQzRDYgNkEwQyA3MTlDIDI4MzkgRkM0MyAyRDVGCitTdGVpbmFyIEguIEd1bmRlcnNvbiAgICAgICAgICBDMkU5IDAwNEYgRjAyOCBDMThFIDRFQUQgREI4MyA3RjYxIDc1NjEgNzc5NyA4Rjc2CiBTdGVwaGFuIEhpbGIgICAgICAgICAgICAgICAgICA0RjM4IDBCM0EgNUYzOSBCOTlCIEY1MDUgRTU2MiA4RDVDIDU1NTQgNEUxNyA4ODYzCiBUaWFuY2hlbmcgIlRpbW90aHkiIEd1ICAgICAgICA5NDU2IEFGQzAgODE0QSA4MTM5IEU5OTQgODM1MSA3RkU2IEIwOTUgQjU4MiBCMEQ0CiBUaW0gTmljaG9sc29uICAgICAgICAgICAgICAgICAzOENGIERCMDkgM0VEMCBGNjA3IDhCNjcgNkNFRCAwQzBCIEZDNDQgOEIwQiBGQzgzCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDg3YTk4NjkuLjBjZDBhMWQgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDUgKzEsNSBAQAogTUFJTl9NQUtFRklMRT0xCi1pbmNsdWRlIGNvbmZpZy5tYWsKK2luY2x1ZGUgZmZidWlsZC9jb25maWcubWFrCiAKIHZwYXRoICUuYyAgICAkKFNSQ19QQVRIKQogdnBhdGggJS5jcHAgICQoU1JDX1BBVEgpCkBAIC0xMSwzOCArMTEsMTIgQEAKIHZwYXRoICUucmMgICAkKFNSQ19QQVRIKQogdnBhdGggJS52ICAgICQoU1JDX1BBVEgpCiB2cGF0aCAlLnRleGkgJChTUkNfUEFUSCkKK3ZwYXRoICUuY3UgICAkKFNSQ19QQVRIKQordnBhdGggJS5wdHggICQoU1JDX1BBVEgpCiB2cGF0aCAlL2ZhdGVfY29uZmlnLnNoLnRlbXBsYXRlICQoU1JDX1BBVEgpCiAKLUFWUFJPR1MtJChDT05GSUdfRkZNUEVHKSAgICs9IGZmbXBlZwotQVZQUk9HUy0kKENPTkZJR19GRlBMQVkpICAgKz0gZmZwbGF5Ci1BVlBST0dTLSQoQ09ORklHX0ZGUFJPQkUpICArPSBmZnByb2JlCi1BVlBST0dTLSQoQ09ORklHX0ZGU0VSVkVSKSArPSBmZnNlcnZlcgotCi1BVlBST0dTICAgIDo9ICQoQVZQUk9HUy15ZXM6JT0lJChQUk9HU1NVRikkKEVYRVNVRikpCi1JTlNUUFJPR1MgICA9ICQoQVZQUk9HUy15ZXM6JT0lJChQUk9HU1NVRikkKEVYRVNVRikpCi1QUk9HUyAgICAgICs9ICQoQVZQUk9HUykKLQotQVZCQVNFTkFNRVMgID0gZmZtcGVnIGZmcGxheSBmZnByb2JlIGZmc2VydmVyCi1BTExBVlBST0dTICAgPSAkKEFWQkFTRU5BTUVTOiU9JSQoUFJPR1NTVUYpJChFWEVTVUYpKQotQUxMQVZQUk9HU19HID0gJChBVkJBU0VOQU1FUzolPSUkKFBST0dTU1VGKV9nJChFWEVTVUYpKQotCi0kKGZvcmVhY2ggcHJvZywkKEFWQkFTRU5BTUVTKSwkKGV2YWwgT0JKUy0kKHByb2cpICs9IGNtZHV0aWxzLm8pKQotJChmb3JlYWNoIHByb2csJChBVkJBU0VOQU1FUyksJChldmFsIE9CSlMtJChwcm9nKS0kKENPTkZJR19PUEVOQ0wpICs9IGNtZHV0aWxzX29wZW5jbC5vKSkKLQotT0JKUy1mZm1wZWcgICAgICAgICAgICAgICAgICAgKz0gZmZtcGVnX29wdC5vIGZmbXBlZ19maWx0ZXIubwotT0JKUy1mZm1wZWctJChIQVZFX1ZEUEFVX1gxMSkgKz0gZmZtcGVnX3ZkcGF1Lm8KLU9CSlMtZmZtcGVnLSQoSEFWRV9EWFZBMl9MSUIpICs9IGZmbXBlZ19keHZhMi5vCi1pZm5kZWYgQ09ORklHX1ZJREVPVE9PTEJPWAotT0JKUy1mZm1wZWctJChDT05GSUdfVkRBKSAgICAgKz0gZmZtcGVnX3ZpZGVvdG9vbGJveC5vCi1lbmRpZgotT0JKUy1mZm1wZWctJChDT05GSUdfVklERU9UT09MQk9YKSArPSBmZm1wZWdfdmlkZW90b29sYm94Lm8KLU9CSlMtZmZtcGVnLSQoQ09ORklHX0xJQk1GWCkgICs9IGZmbXBlZ19xc3YubwotT0JKUy1mZnNlcnZlciAgICAgICAgICAgICAgICAgKz0gZmZzZXJ2ZXJfY29uZmlnLm8KLQotVEVTVFRPT0xTICAgPSBhdWRpb2dlbiB2aWRlb2dlbiByb3Rvem9vbSB0aW55X3BzbnIgdGlueV9zc2ltIGJhc2U2NAorVEVTVFRPT0xTICAgPSBhdWRpb2dlbiB2aWRlb2dlbiByb3Rvem9vbSB0aW55X3BzbnIgdGlueV9zc2ltIGJhc2U2NCBhdWRpb21hdGNoCiBIT1NUUFJPR1MgIDo9ICQoVEVTVFRPT0xTOiU9dGVzdHMvJSkgZG9jL3ByaW50X29wdGlvbnMKLVRPT0xTICAgICAgID0gcXQtZmFzdHN0YXJ0IHRyYXNoZXIgdW5jb2RlZF9mcmFtZQotVE9PTFMtJChDT05GSUdfWkxJQikgKz0gY3dzMmZ3cwogCiAjICQoRkZMSUJTLXllcykgbmVlZHMgdG8gYmUgaW4gbGlua2luZyBvcmRlcgogRkZMSUJTLSQoQ09ORklHX0FWREVWSUNFKSAgICs9IGF2ZGV2aWNlCkBAIC01NywzNSArMzEsNDUgQEAKIEZGTElCUyA6PSBhdnV0aWwKIAogREFUQV9GSUxFUyA6PSAkKHdpbGRjYXJkICQoU1JDX1BBVEgpL3ByZXNldHMvKi5mZnByZXNldCkgJChTUkNfUEFUSCkvZG9jL2ZmcHJvYmUueHNkCi1FWEFNUExFU19GSUxFUyA6PSAkKHdpbGRjYXJkICQoU1JDX1BBVEgpL2RvYy9leGFtcGxlcy8qLmMpICQoU1JDX1BBVEgpL2RvYy9leGFtcGxlcy9NYWtlZmlsZSAkKFNSQ19QQVRIKS9kb2MvZXhhbXBsZXMvUkVBRE1FCiAKLVNLSVBIRUFERVJTID0gY21kdXRpbHNfY29tbW9uX29wdHMuaCBjb21wYXQvdzMycHRocmVhZHMuaAorU0tJUEhFQURFUlMgPSBjb21wYXQvdzMycHRocmVhZHMuaAogCi1pbmNsdWRlICQoU1JDX1BBVEgpL2NvbW1vbi5tYWsKKyMgZmlyc3Qgc28gImFsbCIgYmVjb21lcyBkZWZhdWx0IHRhcmdldAorYWxsOiBhbGwteWVzCisKK2luY2x1ZGUgJChTUkNfUEFUSCkvdG9vbHMvTWFrZWZpbGUKK2luY2x1ZGUgJChTUkNfUEFUSCkvZmZidWlsZC9jb21tb24ubWFrCiAKIEZGX0VYVFJBTElCUyA6PSAkKEZGRVhUUkFMSUJTKQogRkZfREVQX0xJQlMgIDo9ICQoREVQX0xJQlMpCiBGRl9TVEFUSUNfREVQX0xJQlMgOj0gJChTVEFUSUNfREVQX0xJQlMpCiAKLWFsbDogJChBVlBST0dTKQorJChUT09MUyk6ICUkKEVYRVNVRik6ICUubworCSQoTEQpICQoTERGTEFHUykgJChMREVYRUZMQUdTKSAkKExEX08pICReICQoRVhUUkFMSUJTLSQoKkYpKSAkKEVYVFJBTElCUykgJChFTElCUykKIAotJChUT09MUyk6ICUkKEVYRVNVRik6ICUubyAkKEVYRU9CSlMpCi0JJChMRCkgJChMREZMQUdTKSAkKExERVhFRkxBR1MpICQoTERfTykgJF4gJChFTElCUykKK3RhcmdldF9kZWNfJV9mdXp6ZXIkKEVYRVNVRik6IHRhcmdldF9kZWNfJV9mdXp6ZXIubyAkKEZGX0RFUF9MSUJTKQorCSQoTEQpICQoTERGTEFHUykgJChMREVYRUZMQUdTKSAkKExEX08pICReICQoRUxJQlMpICQoRkZfRVhUUkFMSUJTKSAkKExJQkZVWlpFUl9QQVRIKQogCi10b29scy9jd3MyZndzJChFWEVTVUYpOiBFTElCUyA9ICQoWkxJQikKK3Rvb2xzL3NvZmEyd2F2cyQoRVhFU1VGKTogRUxJQlMgPSAkKEZGX0VYVFJBTElCUykKIHRvb2xzL3VuY29kZWRfZnJhbWUkKEVYRVNVRik6ICQoRkZfREVQX0xJQlMpCiB0b29scy91bmNvZGVkX2ZyYW1lJChFWEVTVUYpOiBFTElCUyA9ICQoRkZfRVhUUkFMSUJTKQordG9vbHMvdGFyZ2V0X2RlY18lX2Z1enplciQoRVhFU1VGKTogJChGRl9ERVBfTElCUykKIAotY29uZmlnLmg6IC5jb25maWcKLS5jb25maWc6ICQod2lsZGNhcmQgJChGRkxJQlM6JT0kKFNSQ19QQVRIKS9saWIlL2FsbCouYykpCitDT05GSUdVUkFCTEVfQ09NUE9ORU5UUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAkKHdpbGRjYXJkICQoRkZMSUJTOiU9JChTUkNfUEFUSCkvbGliJS9hbGwqLmMpKSAgICAgICAgICAgICAgICAgXAorICAgICQoU1JDX1BBVEgpL2xpYmF2Y29kZWMvYml0c3RyZWFtX2ZpbHRlcnMuYyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgJChTUkNfUEFUSCkvbGliYXZmb3JtYXQvcHJvdG9jb2xzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworY29uZmlnLmg6IGZmYnVpbGQvLmNvbmZpZworZmZidWlsZC8uY29uZmlnOiAkKENPTkZJR1VSQUJMRV9DT01QT05FTlRTKQogCUAtdHB1dCBib2xkIDI+L2Rldi9udWxsCi0JQC1wcmludGYgJ1xuV0FSTklORzogJCg/RikgbmV3ZXIgdGhhbiBjb25maWcuaCwgcmVydW4gY29uZmlndXJlXG5cbicKKwlALXByaW50ZiAnXG5XQVJOSU5HOiAkKD8pIG5ld2VyIHRoYW4gY29uZmlnLmgsIHJlcnVuIGNvbmZpZ3VyZVxuXG4nCiAJQC10cHV0IHNncjAgMj4vZGV2L251bGwKIAotU1VCRElSX1ZBUlMgOj0gQ0xFQU5GSUxFUyBFWEFNUExFUyBGRkxJQlMgSE9TVFBST0dTIFRFU1RQUk9HUyBUT09MUyAgICAgIFwKK1NVQkRJUl9WQVJTIDo9IENMRUFORklMRVMgRkZMSUJTIEhPU1RQUk9HUyBURVNUUFJPR1MgVE9PTFMgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBIRUFERVJTIEFSQ0hfSEVBREVSUyBCVUlMVF9IRUFERVJTIFNLSVBIRUFERVJTICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgQVJNVjVURS1PQkpTIEFSTVY2LU9CSlMgQVJNVjgtT0JKUyBWRlAtT0JKUyBORU9OLU9CSlMgICAgIFwKLSAgICAgICAgICAgICAgIEFMVElWRUMtT0JKUyBNTVgtT0JKUyBZQVNNLU9CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBBTFRJVkVDLU9CSlMgVlNYLU9CSlMgTU1YLU9CSlMgWDg2QVNNLU9CSlMgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgTUlQU0ZQVS1PQkpTIE1JUFNEU1BSMi1PQkpTIE1JUFNEU1AtT0JKUyBNU0EtT0JKUyAgICAgICAgIFwKICAgICAgICAgICAgICAgIE1NSS1PQkpTIE9CSlMgU0xJQk9CSlMgSE9TVE9CSlMgVEVTVE9CSlMKIApAQCAtMTAwLDQxICs4NCwzMiBAQAogaW5jbHVkZSAkKFNSQ19QQVRIKS8kKDEpL01ha2VmaWxlCiAtaW5jbHVkZSAkKFNSQ19QQVRIKS8kKDEpLyQoQVJDSCkvTWFrZWZpbGUKIC1pbmNsdWRlICQoU1JDX1BBVEgpLyQoMSkvJChJTlRSSU5TSUNTKS9NYWtlZmlsZQotaW5jbHVkZSAkKFNSQ19QQVRIKS9saWJyYXJ5Lm1haworaW5jbHVkZSAkKFNSQ19QQVRIKS9mZmJ1aWxkL2xpYnJhcnkubWFrCiBlbmRlZgogCiAkKGZvcmVhY2ggRCwkKEZGTElCUyksJChldmFsICQoY2FsbCBET1NVQkRJUixsaWIkKEQpKSkpCiAKK2luY2x1ZGUgJChTUkNfUEFUSCkvZmZ0b29scy9NYWtlZmlsZQogaW5jbHVkZSAkKFNSQ19QQVRIKS9kb2MvTWFrZWZpbGUKK2luY2x1ZGUgJChTUkNfUEFUSCkvZG9jL2V4YW1wbGVzL01ha2VmaWxlCiAKLWRlZmluZSBET1BST0cKLU9CSlMtJCgxKSArPSAkKDEpLm8gJChFWEVPQkpTKSAkKE9CSlMtJCgxKS15ZXMpCi0kKDEpJChQUk9HU1NVRilfZyQoRVhFU1VGKTogJCQoT0JKUy0kKDEpKQotJCQoT0JKUy0kKDEpKTogQ0ZMQUdTICArPSAkKENGTEFHUy0kKDEpKQotJCgxKSQoUFJPR1NTVUYpX2ckKEVYRVNVRik6IExERkxBR1MgKz0gJChMREZMQUdTLSQoMSkpCi0kKDEpJChQUk9HU1NVRilfZyQoRVhFU1VGKTogRkZfRVhUUkFMSUJTICs9ICQoTElCUy0kKDEpKQotLWluY2x1ZGUgJCQoT0JKUy0kKDEpOi5vPS5kKQotZW5kZWYKLQotJChmb3JlYWNoIFAsJChQUk9HUyksJChldmFsICQoY2FsbCBET1BST0csJChQOiQoUFJPR1NTVUYpJChFWEVTVUYpPSkpKSkKLQotZmZwcm9iZS5vIGNtZHV0aWxzLm8gbGliYXZjb2RlYy91dGlscy5vIGxpYmF2Zm9ybWF0L3V0aWxzLm8gbGliYXZkZXZpY2UvYXZkZXZpY2UubyBsaWJhdmZpbHRlci9hdmZpbHRlci5vIGxpYmF2dXRpbC91dGlscy5vIGxpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzLm8gbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLm8gbGlic3dzY2FsZS91dGlscy5vIDogbGliYXZ1dGlsL2ZmdmVyc2lvbi5oCitsaWJhdmNvZGVjL3V0aWxzLm8gbGliYXZmb3JtYXQvdXRpbHMubyBsaWJhdmRldmljZS9hdmRldmljZS5vIGxpYmF2ZmlsdGVyL2F2ZmlsdGVyLm8gbGliYXZ1dGlsL3V0aWxzLm8gbGlicG9zdHByb2MvcG9zdHByb2Nlc3MubyBsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUubyBsaWJzd3NjYWxlL3V0aWxzLm8gOiBsaWJhdnV0aWwvZmZ2ZXJzaW9uLmgKIAogJChQUk9HUyk6ICUkKFBST0dTU1VGKSQoRVhFU1VGKTogJSQoUFJPR1NTVUYpX2ckKEVYRVNVRikKK2lmZXEgKCQoU1RSSVBUWVBFKSxkaXJlY3QpCisJJChTVFJJUCkgLW8gJEAgJDwKK2Vsc2UKIAkkKENQKSAkPCAkQAogCSQoU1RSSVApICRACitlbmRpZgogCi0lJChQUk9HU1NVRilfZyQoRVhFU1VGKTogJS5vICQoRkZfREVQX0xJQlMpCislJChQUk9HU1NVRilfZyQoRVhFU1VGKTogJChGRl9ERVBfTElCUykKIAkkKExEKSAkKExERkxBR1MpICQoTERFWEVGTEFHUykgJChMRF9PKSAkKE9CSlMtJCopICQoRkZfRVhUUkFMSUJTKQogCi1PQkpESVJTICs9IHRvb2xzCi0KLS1pbmNsdWRlICQod2lsZGNhcmQgdG9vbHMvKi5kKQotCi1WRVJTSU9OX1NIICA9ICQoU1JDX1BBVEgpL3ZlcnNpb24uc2gKK1ZFUlNJT05fU0ggID0gJChTUkNfUEFUSCkvZmZidWlsZC92ZXJzaW9uLnNoCiBHSVRfTE9HICAgICA9ICQoU1JDX1BBVEgpLy5naXQvbG9ncy9IRUFECiAKLS52ZXJzaW9uOiAkKHdpbGRjYXJkICQoR0lUX0xPRykpICQoVkVSU0lPTl9TSCkgY29uZmlnLm1haworLnZlcnNpb246ICQod2lsZGNhcmQgJChHSVRfTE9HKSkgJChWRVJTSU9OX1NIKSBmZmJ1aWxkL2NvbmZpZy5tYWsKIC52ZXJzaW9uOiBNPUAKIAogbGliYXZ1dGlsL2ZmdmVyc2lvbi5oIC52ZXJzaW9uOgpAQCAtMTQ0LDQ0ICsxMTksMzIgQEAKICMgZm9yY2UgdmVyc2lvbi5zaCB0byBydW4gd2hlbmV2ZXIgdmVyc2lvbiBtaWdodCBoYXZlIGNoYW5nZWQKIC1pbmNsdWRlIC52ZXJzaW9uCiAKLWlmZGVmIEFWUFJPR1MKLWluc3RhbGw6IGluc3RhbGwtcHJvZ3MgaW5zdGFsbC1kYXRhCi1lbmRpZgotCiBpbnN0YWxsOiBpbnN0YWxsLWxpYnMgaW5zdGFsbC1oZWFkZXJzCiAKIGluc3RhbGwtbGliczogaW5zdGFsbC1saWJzLXllcwogCi1pbnN0YWxsLXByb2dzLXllczoKLWluc3RhbGwtcHJvZ3MtJChDT05GSUdfU0hBUkVEKTogaW5zdGFsbC1saWJzCi0KLWluc3RhbGwtcHJvZ3M6IGluc3RhbGwtcHJvZ3MteWVzICQoQVZQUk9HUykKLQkkKFEpbWtkaXIgLXAgIiQoQklORElSKSIKLQkkKElOU1RBTEwpIC1jIC1tIDc1NSAkKElOU1RQUk9HUykgIiQoQklORElSKSIKLQotaW5zdGFsbC1kYXRhOiAkKERBVEFfRklMRVMpICQoRVhBTVBMRVNfRklMRVMpCi0JJChRKW1rZGlyIC1wICIkKERBVEFESVIpL2V4YW1wbGVzIgoraW5zdGFsbC1kYXRhOiAkKERBVEFfRklMRVMpCisJJChRKW1rZGlyIC1wICIkKERBVEFESVIpIgogCSQoSU5TVEFMTCkgLW0gNjQ0ICQoREFUQV9GSUxFUykgIiQoREFUQURJUikiCi0JJChJTlNUQUxMKSAtbSA2NDQgJChFWEFNUExFU19GSUxFUykgIiQoREFUQURJUikvZXhhbXBsZXMiCiAKLXVuaW5zdGFsbDogdW5pbnN0YWxsLWxpYnMgdW5pbnN0YWxsLWhlYWRlcnMgdW5pbnN0YWxsLXByb2dzIHVuaW5zdGFsbC1kYXRhCi0KLXVuaW5zdGFsbC1wcm9nczoKLQkkKFJNKSAkKGFkZHByZWZpeCAiJChCSU5ESVIpLyIsICQoQUxMQVZQUk9HUykpCit1bmluc3RhbGw6IHVuaW5zdGFsbC1kYXRhIHVuaW5zdGFsbC1oZWFkZXJzIHVuaW5zdGFsbC1saWJzIHVuaW5zdGFsbC1wa2djb25maWcKIAogdW5pbnN0YWxsLWRhdGE6CiAJJChSTSkgLXIgIiQoREFUQURJUikiCiAKIGNsZWFuOjoKLQkkKFJNKSAkKEFMTEFWUFJPR1MpICQoQUxMQVZQUk9HU19HKQogCSQoUk0pICQoQ0xFQU5TVUZGSVhFUykKLQkkKFJNKSAkKENMRUFOU1VGRklYRVM6JT10b29scy8lKQorCSQoUk0pICQoYWRkcHJlZml4IGNvbXBhdC8sJChDTEVBTlNVRkZJWEVTKSkgJChhZGRwcmVmaXggY29tcGF0LyovLCQoQ0xFQU5TVUZGSVhFUykpCiAJJChSTSkgLXIgY292ZXJhZ2UtaHRtbAogCSQoUk0pIC1yZiBjb3ZlcmFnZS5pbmZvIGNvdmVyYWdlLmluZm8uaW4gbGNvdgogCi1kaXN0Y2xlYW46OgotCSQoUk0pICQoRElTVENMRUFOU1VGRklYRVMpCi0JJChSTSkgY29uZmlnLiogLmNvbmZpZyBsaWJhdnV0aWwvYXZjb25maWcuaCAudmVyc2lvbiBhdnZlcnNpb24uaCB2ZXJzaW9uLmggbGliYXZ1dGlsL2ZmdmVyc2lvbi5oIGxpYmF2Y29kZWMvY29kZWNfbmFtZXMuaAorZGlzdGNsZWFuOjogY2xlYW4KKwkkKFJNKSAudmVyc2lvbiBhdnZlcnNpb24uaCBjb25maWcuYXNtIGNvbmZpZy5oIG1hcGZpbGUgIFwKKwkJZmZidWlsZC8uY29uZmlnIGZmYnVpbGQvY29uZmlnLiogbGliYXZ1dGlsL2F2Y29uZmlnLmggXAorCQl2ZXJzaW9uLmggbGliYXZ1dGlsL2ZmdmVyc2lvbi5oIGxpYmF2Y29kZWMvY29kZWNfbmFtZXMuaCBcCisJCWxpYmF2Y29kZWMvYnNmX2xpc3QuYyBsaWJhdmZvcm1hdC9wcm90b2NvbF9saXN0LmMgXAorCQlsaWJhdmNvZGVjL2NvZGVjX2xpc3QuYyBsaWJhdmNvZGVjL3BhcnNlcl9saXN0LmMgXAorCQlsaWJhdmZvcm1hdC9tdXhlcl9saXN0LmMgbGliYXZmb3JtYXQvZGVtdXhlcl9saXN0LmMKIGlmZXEgKCQoU1JDX0xJTkspLHNyYykKIAkkKFJNKSBzcmMKIGVuZGlmCkBAIC0xOTAsNiArMTUzLDcgQEAKIGNvbmZpZzoKIAkkKFNSQ19QQVRIKS9jb25maWd1cmUgJCh2YWx1ZSBGRk1QRUdfQ09ORklHVVJBVElPTikKIAorYnVpbGQ6IGFsbCBhbGx0b29scyBleGFtcGxlcyB0ZXN0cHJvZ3MKIGNoZWNrOiBhbGwgYWxsdG9vbHMgZXhhbXBsZXMgdGVzdHByb2dzIGZhdGUKIAogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9NYWtlZmlsZQpAQCAtMjA1LDUgKzE2OSw1IEBACiAjIHNvIHRoaXMgc2F2ZXMgc29tZSB0aW1lIG9uIHNsb3cgc3lzdGVtcy4KIC5TVUZGSVhFUzoKIAotLlBIT05ZOiBhbGwgYWxsLXllcyBhbGx0b29scyBjaGVjayAqY2xlYW4gY29uZmlnIGluc3RhbGwqCi0uUEhPTlk6IHRlc3Rwcm9ncyB1bmluc3RhbGwqCisuUEhPTlk6IGFsbCBhbGwteWVzIGFsbHRvb2xzIGJ1aWxkIGNoZWNrIGNvbmZpZyB0ZXN0cHJvZ3MKKy5QSE9OWTogKmNsZWFuIGluc3RhbGwqIHVuaW5zdGFsbCoKZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCAyNDE5MTkxLi40NDczNDdjIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC0yMSw4ICsyMSw2IEBACiAqIFtmZnBsYXldKGh0dHBzOi8vZmZtcGVnLm9yZy9mZnBsYXkuaHRtbCkgaXMgYSBtaW5pbWFsaXN0aWMgbXVsdGltZWRpYSBwbGF5ZXIuCiAqIFtmZnByb2JlXShodHRwczovL2ZmbXBlZy5vcmcvZmZwcm9iZS5odG1sKSBpcyBhIHNpbXBsZSBhbmFseXNpcyB0b29sIHRvIGluc3BlY3QKICAgbXVsdGltZWRpYSBjb250ZW50LgotKiBbZmZzZXJ2ZXJdKGh0dHBzOi8vZmZtcGVnLm9yZy9mZnNlcnZlci5odG1sKSBpcyBhIG11bHRpbWVkaWEgc3RyZWFtaW5nIHNlcnZlcgotICBmb3IgbGl2ZSBicm9hZGNhc3RzLgogKiBBZGRpdGlvbmFsIHNtYWxsIHRvb2xzIHN1Y2ggYXMgYGF2aW9jYXRgLCBgaXNtaW5kZXhgIGFuZCBgcXQtZmFzdHN0YXJ0YC4KIAogIyMgRG9jdW1lbnRhdGlvbgpAQCAtNDUsNSArNDMsNCBAQAogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gdGhlIGZmbXBlZy1kZXZlbCBtYWlsaW5nIGxpc3QgdXNpbmcKIGBnaXQgZm9ybWF0LXBhdGNoYCBvciBgZ2l0IHNlbmQtZW1haWxgLiBHaXRodWIgcHVsbCByZXF1ZXN0cyBzaG91bGQgYmUKLWF2b2lkZWQgYmVjYXVzZSB0aGV5IGFyZSBub3QgcGFydCBvZiBvdXIgcmV2aWV3IHByb2Nlc3MuIEZldyBkZXZlbG9wZXJzCi1mb2xsb3cgcHVsbCByZXF1ZXN0cyBzbyB0aGV5IHdpbGwgbGlrZWx5IGJlIGlnbm9yZWQuCithdm9pZGVkIGJlY2F1c2UgdGhleSBhcmUgbm90IHBhcnQgb2Ygb3VyIHJldmlldyBwcm9jZXNzIGFuZCB3aWxsIGJlIGlnbm9yZWQuCmRpZmYgLS1naXQgYS9SRUxFQVNFIGIvUkVMRUFTRQppbmRleCA5ZjU1YjJjLi5jNTEwNmU2IDEwMDY0NAotLS0gYS9SRUxFQVNFCisrKyBiL1JFTEVBU0UKQEAgLTEgKzEgQEAKLTMuMAorNC4wLjQKZGlmZiAtLWdpdCBhL1JFTEVBU0VfTk9URVMgYi9SRUxFQVNFX05PVEVTCmluZGV4IDg2MWRjMDQuLjcxMjlhOWQgMTAwNjQ0Ci0tLSBhL1JFTEVBU0VfTk9URVMKKysrIGIvUkVMRUFTRV9OT1RFUwpAQCAtMSwxMyArMSwxMyBAQAogCi0gICAgICAgICAgICAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkAotICAgICAgICAgICAgICDilIIgUkVMRUFTRSBOT1RFUyBmb3IgRkZtcGVnIDMuMCAiRWluc3RlaW4iIOKUggotICAgICAgICAgICAgICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJgKKyAgICAgICAgICAgICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQCisgICAgICAgICAgICAgIOKUgiBSRUxFQVNFIE5PVEVTIGZvciBGRm1wZWcgNC4wICJXdSIg4pSCCisgICAgICAgICAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUmAogCi0gICBUaGUgRkZtcGVnIFByb2plY3QgcHJvdWRseSBwcmVzZW50cyBGRm1wZWcgMy4wICJFaW5zdGVpbiIsIGFib3V0IDUKLSAgIG1vbnRocyBhZnRlciB0aGUgcmVsZWFzZSBvZiBGRm1wZWcgMi44LgorICAgVGhlIEZGbXBlZyBQcm9qZWN0IHByb3VkbHkgcHJlc2VudHMgRkZtcGVnIDQuMCAiV3UiLCBhYm91dCA2CisgICBtb250aHMgYWZ0ZXIgdGhlIHJlbGVhc2Ugb2YgRkZtcGVnIDMuNC4KIAogICAgQSBjb21wbGV0ZSBDaGFuZ2Vsb2cgaXMgYXZhaWxhYmxlIGF0IHRoZSByb290IG9mIHRoZSBwcm9qZWN0LCBhbmQgdGhlCi0gICBjb21wbGV0ZSBHaXQgaGlzdG9yeSBvbiBodHRwOi8vc291cmNlLmZmbXBlZy5vcmcuCisgICBjb21wbGV0ZSBHaXQgaGlzdG9yeSBvbiBodHRwczovL2dpdC5mZm1wZWcub3JnL2dpdHdlYi9mZm1wZWcuZ2l0CiAKICAgIFdlIGhvcGUgeW91IHdpbGwgbGlrZSB0aGlzIHJlbGVhc2UgYXMgbXVjaCBhcyB3ZSBlbmpveWVkIHdvcmtpbmcgb24gaXQsIGFuZAogICAgYXMgdXN1YWwsIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgYWJvdXQgaXQsIG9yIGFueSBGRm1wZWcgcmVsYXRlZCB0b3BpYywKZGlmZiAtLWdpdCBhL1ZFUlNJT04gYi9WRVJTSU9OCmluZGV4IDlmNTViMmMuLmM1MTA2ZTYgMTAwNjQ0Ci0tLSBhL1ZFUlNJT04KKysrIGIvVkVSU0lPTgpAQCAtMSArMSBAQAotMy4wCis0LjAuNApkaWZmIC0tZ2l0IGEvYXJjaC5tYWsgYi9hcmNoLm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmNzhiNC4uMDAwMDAwMAotLS0gYS9hcmNoLm1haworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLU9CSlMtJChIQVZFX0FSTVY1VEUpICs9ICQoQVJNVjVURS1PQkpTKSAkKEFSTVY1VEUtT0JKUy15ZXMpCi1PQkpTLSQoSEFWRV9BUk1WNikgICArPSAkKEFSTVY2LU9CSlMpICAgJChBUk1WNi1PQkpTLXllcykKLU9CSlMtJChIQVZFX0FSTVY4KSAgICs9ICQoQVJNVjgtT0JKUykgICAkKEFSTVY4LU9CSlMteWVzKQotT0JKUy0kKEhBVkVfVkZQKSAgICAgKz0gJChWRlAtT0JKUykgICAgICQoVkZQLU9CSlMteWVzKQotT0JKUy0kKEhBVkVfTkVPTikgICAgKz0gJChORU9OLU9CSlMpICAgICQoTkVPTi1PQkpTLXllcykKLQotT0JKUy0kKEhBVkVfTUlQU0ZQVSkgICArPSAkKE1JUFNGUFUtT0JKUykgICAgJChNSVBTRlBVLU9CSlMteWVzKQotT0JKUy0kKEhBVkVfTUlQU0RTUCkgICArPSAkKE1JUFNEU1AtT0JKUykgICAgJChNSVBTRFNQLU9CSlMteWVzKQotT0JKUy0kKEhBVkVfTUlQU0RTUFIyKSArPSAkKE1JUFNEU1BSMi1PQkpTKSAgJChNSVBTRFNQUjItT0JKUy15ZXMpCi1PQkpTLSQoSEFWRV9NU0EpICAgICAgICs9ICQoTVNBLU9CSlMpICAgICAgICAkKE1TQS1PQkpTLXllcykKLU9CSlMtJChIQVZFX01NSSkgICArPSAkKE1NSS1PQkpTKSAgICQoTU1JLU9CSlMteWVzKQotCi1PQkpTLSQoSEFWRV9BTFRJVkVDKSArPSAkKEFMVElWRUMtT0JKUykgJChBTFRJVkVDLU9CSlMteWVzKQotT0JKUy0kKEhBVkVfVlNYKSAgICAgKz0gJChWU1gtT0JKUykgJChWU1gtT0JKUy15ZXMpCi0KLU9CSlMtJChIQVZFX01NWCkgICAgICs9ICQoTU1YLU9CSlMpICAgICAkKE1NWC1PQkpTLXllcykKLU9CSlMtJChIQVZFX1lBU00pICAgICs9ICQoWUFTTS1PQkpTKSAgICAkKFlBU00tT0JKUy15ZXMpCmRpZmYgLS1naXQgYS9jbWR1dGlscy5jIGIvY21kdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNhNDgzNi4uMDAwMDAwMAotLS0gYS9jbWR1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI1MCArMCwwIEBACi0vKgotICogVmFyaW91cyB1dGlsaXRpZXMgZm9yIGNvbW1hbmQgbGluZSB0b29scwotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgRmFicmljZSBCZWxsYXJkCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG1hdGguaD4KLQotLyogSW5jbHVkZSBvbmx5IHRoZSBlbmFibGVkIGhlYWRlcnMgc2luY2Ugc29tZSBjb21waWxlcnMgKG5hbWVseSwgU3VuCi0gICBTdHVkaW8pIHdpbGwgbm90IG9taXQgdW51c2VkIGlubGluZSBmdW5jdGlvbnMgYW5kIGNyZWF0ZSB1bmRlZmluZWQKLSAgIHJlZmVyZW5jZXMgdG8gbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBiZWluZyBidWlsdC4gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImNvbXBhdC92YV9jb3B5LmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKLSNpbmNsdWRlICJsaWJhdmZpbHRlci9hdmZpbHRlci5oIgotI2luY2x1ZGUgImxpYmF2ZGV2aWNlL2F2ZGV2aWNlLmgiCi0jaW5jbHVkZSAibGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLmgiCi0jaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCi0jaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgiCi0jaW5jbHVkZSAibGlicG9zdHByb2MvcG9zdHByb2Nlc3MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2Rpc3BsYXkuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZmZ2ZXJzaW9uLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3ZlcnNpb24uaCIKLSNpbmNsdWRlICJjbWR1dGlscy5oIgotI2lmIENPTkZJR19ORVRXT1JLCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvbmV0d29yay5oIgotI2VuZGlmCi0jaWYgSEFWRV9TWVNfUkVTT1VSQ0VfSAotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+Ci0jZW5kaWYKLQotc3RhdGljIGludCBpbml0X3JlcG9ydChjb25zdCBjaGFyICplbnYpOwotCi1BVkRpY3Rpb25hcnkgKnN3c19kaWN0OwotQVZEaWN0aW9uYXJ5ICpzd3Jfb3B0czsKLUFWRGljdGlvbmFyeSAqZm9ybWF0X29wdHMsICpjb2RlY19vcHRzLCAqcmVzYW1wbGVfb3B0czsKLQotc3RhdGljIEZJTEUgKnJlcG9ydF9maWxlOwotc3RhdGljIGludCByZXBvcnRfZmlsZV9sZXZlbCA9IEFWX0xPR19ERUJVRzsKLWludCBoaWRlX2Jhbm5lciA9IDA7Ci0KLXZvaWQgaW5pdF9vcHRzKHZvaWQpCi17Ci0gICAgYXZfZGljdF9zZXQoJnN3c19kaWN0LCAiZmxhZ3MiLCAiYmljdWJpYyIsIDApOwotfQotCi12b2lkIHVuaW5pdF9vcHRzKHZvaWQpCi17Ci0gICAgYXZfZGljdF9mcmVlKCZzd3Jfb3B0cyk7Ci0gICAgYXZfZGljdF9mcmVlKCZzd3NfZGljdCk7Ci0gICAgYXZfZGljdF9mcmVlKCZmb3JtYXRfb3B0cyk7Ci0gICAgYXZfZGljdF9mcmVlKCZjb2RlY19vcHRzKTsKLSAgICBhdl9kaWN0X2ZyZWUoJnJlc2FtcGxlX29wdHMpOwotfQotCi12b2lkIGxvZ19jYWxsYmFja19oZWxwKHZvaWQgKnB0ciwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmwpCi17Ci0gICAgdmZwcmludGYoc3Rkb3V0LCBmbXQsIHZsKTsKLX0KLQotc3RhdGljIHZvaWQgbG9nX2NhbGxiYWNrX3JlcG9ydCh2b2lkICpwdHIsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZsKQotewotICAgIHZhX2xpc3QgdmwyOwotICAgIGNoYXIgbGluZVsxMDI0XTsKLSAgICBzdGF0aWMgaW50IHByaW50X3ByZWZpeCA9IDE7Ci0KLSAgICB2YV9jb3B5KHZsMiwgdmwpOwotICAgIGF2X2xvZ19kZWZhdWx0X2NhbGxiYWNrKHB0ciwgbGV2ZWwsIGZtdCwgdmwpOwotICAgIGF2X2xvZ19mb3JtYXRfbGluZShwdHIsIGxldmVsLCBmbXQsIHZsMiwgbGluZSwgc2l6ZW9mKGxpbmUpLCAmcHJpbnRfcHJlZml4KTsKLSAgICB2YV9lbmQodmwyKTsKLSAgICBpZiAocmVwb3J0X2ZpbGVfbGV2ZWwgPj0gbGV2ZWwpIHsKLSAgICAgICAgZnB1dHMobGluZSwgcmVwb3J0X2ZpbGUpOwotICAgICAgICBmZmx1c2gocmVwb3J0X2ZpbGUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgKCpwcm9ncmFtX2V4aXQpKGludCByZXQpOwotCi12b2lkIHJlZ2lzdGVyX2V4aXQodm9pZCAoKmNiKShpbnQgcmV0KSkKLXsKLSAgICBwcm9ncmFtX2V4aXQgPSBjYjsKLX0KLQotdm9pZCBleGl0X3Byb2dyYW0oaW50IHJldCkKLXsKLSAgICBpZiAocHJvZ3JhbV9leGl0KQotICAgICAgICBwcm9ncmFtX2V4aXQocmV0KTsKLQotICAgIGV4aXQocmV0KTsKLX0KLQotZG91YmxlIHBhcnNlX251bWJlcl9vcl9kaWUoY29uc3QgY2hhciAqY29udGV4dCwgY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgpCi17Ci0gICAgY2hhciAqdGFpbDsKLSAgICBjb25zdCBjaGFyICplcnJvcjsKLSAgICBkb3VibGUgZCA9IGF2X3N0cnRvZChudW1zdHIsICZ0YWlsKTsKLSAgICBpZiAoKnRhaWwpCi0gICAgICAgIGVycm9yID0gIkV4cGVjdGVkIG51bWJlciBmb3IgJXMgYnV0IGZvdW5kOiAlc1xuIjsKLSAgICBlbHNlIGlmIChkIDwgbWluIHx8IGQgPiBtYXgpCi0gICAgICAgIGVycm9yID0gIlRoZSB2YWx1ZSBmb3IgJXMgd2FzICVzIHdoaWNoIGlzIG5vdCB3aXRoaW4gJWYgLSAlZlxuIjsKLSAgICBlbHNlIGlmICh0eXBlID09IE9QVF9JTlQ2NCAmJiAoaW50NjRfdClkICE9IGQpCi0gICAgICAgIGVycm9yID0gIkV4cGVjdGVkIGludDY0IGZvciAlcyBidXQgZm91bmQgJXNcbiI7Ci0gICAgZWxzZSBpZiAodHlwZSA9PSBPUFRfSU5UICYmIChpbnQpZCAhPSBkKQotICAgICAgICBlcnJvciA9ICJFeHBlY3RlZCBpbnQgZm9yICVzIGJ1dCBmb3VuZCAlc1xuIjsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBkOwotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsIGVycm9yLCBjb250ZXh0LCBudW1zdHIsIG1pbiwgbWF4KTsKLSAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludDY0X3QgcGFyc2VfdGltZV9vcl9kaWUoY29uc3QgY2hhciAqY29udGV4dCwgY29uc3QgY2hhciAqdGltZXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2R1cmF0aW9uKQotewotICAgIGludDY0X3QgdXM7Ci0gICAgaWYgKGF2X3BhcnNlX3RpbWUoJnVzLCB0aW1lc3RyLCBpc19kdXJhdGlvbikgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkICVzIHNwZWNpZmljYXRpb24gZm9yICVzOiAlc1xuIiwKLSAgICAgICAgICAgICAgIGlzX2R1cmF0aW9uID8gImR1cmF0aW9uIiA6ICJkYXRlIiwgY29udGV4dCwgdGltZXN0cik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0gICAgcmV0dXJuIHVzOwotfQotCi12b2lkIHNob3dfaGVscF9vcHRpb25zKGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucywgY29uc3QgY2hhciAqbXNnLCBpbnQgcmVxX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVqX2ZsYWdzLCBpbnQgYWx0X2ZsYWdzKQotewotICAgIGNvbnN0IE9wdGlvbkRlZiAqcG87Ci0gICAgaW50IGZpcnN0OwotCi0gICAgZmlyc3QgPSAxOwotICAgIGZvciAocG8gPSBvcHRpb25zOyBwby0+bmFtZTsgcG8rKykgewotICAgICAgICBjaGFyIGJ1Zls2NF07Ci0KLSAgICAgICAgaWYgKCgocG8tPmZsYWdzICYgcmVxX2ZsYWdzKSAhPSByZXFfZmxhZ3MpIHx8Ci0gICAgICAgICAgICAoYWx0X2ZsYWdzICYmICEocG8tPmZsYWdzICYgYWx0X2ZsYWdzKSkgfHwKLSAgICAgICAgICAgIChwby0+ZmxhZ3MgJiByZWpfZmxhZ3MpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgICAgICBwcmludGYoIiVzXG4iLCBtc2cpOwotICAgICAgICAgICAgZmlyc3QgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGF2X3N0cmxjcHkoYnVmLCBwby0+bmFtZSwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICBpZiAocG8tPmFyZ25hbWUpIHsKLSAgICAgICAgICAgIGF2X3N0cmxjYXQoYnVmLCAiICIsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgIGF2X3N0cmxjYXQoYnVmLCBwby0+YXJnbmFtZSwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiLSUtMTdzICAlc1xuIiwgYnVmLCBwby0+aGVscCk7Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLX0KLQotdm9pZCBzaG93X2hlbHBfY2hpbGRyZW4oY29uc3QgQVZDbGFzcyAqY2xhc3MsIGludCBmbGFncykKLXsKLSAgICBjb25zdCBBVkNsYXNzICpjaGlsZCA9IE5VTEw7Ci0gICAgaWYgKGNsYXNzLT5vcHRpb24pIHsKLSAgICAgICAgYXZfb3B0X3Nob3cyKCZjbGFzcywgTlVMTCwgZmxhZ3MsIDApOwotICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgfQotCi0gICAgd2hpbGUgKGNoaWxkID0gYXZfb3B0X2NoaWxkX2NsYXNzX25leHQoY2xhc3MsIGNoaWxkKSkKLSAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKGNoaWxkLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBjb25zdCBPcHRpb25EZWYgKmZpbmRfb3B0aW9uKGNvbnN0IE9wdGlvbkRlZiAqcG8sIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY29uc3QgY2hhciAqcCA9IHN0cmNocihuYW1lLCAnOicpOwotICAgIGludCBsZW4gPSBwID8gcCAtIG5hbWUgOiBzdHJsZW4obmFtZSk7Ci0KLSAgICB3aGlsZSAocG8tPm5hbWUpIHsKLSAgICAgICAgaWYgKCFzdHJuY21wKG5hbWUsIHBvLT5uYW1lLCBsZW4pICYmIHN0cmxlbihwby0+bmFtZSkgPT0gbGVuKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHBvKys7Ci0gICAgfQotICAgIHJldHVybiBwbzsKLX0KLQotLyogX1dJTjMyIG1lYW5zIHVzaW5nIHRoZSB3aW5kb3dzIGxpYmMgLSBjeWd3aW4gZG9lc24ndCBkZWZpbmUgdGhhdAotICogYnkgZGVmYXVsdC4gSEFWRV9DT01NQU5ETElORVRPQVJHVlcgaXMgdHJ1ZSBvbiBjeWd3aW4sIHdoaWxlCi0gKiBpdCBkb2Vzbid0IHByb3ZpZGUgdGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgdmlhIEdldENvbW1hbmRMaW5lVygpLiAqLwotI2lmIEhBVkVfQ09NTUFORExJTkVUT0FSR1ZXICYmIGRlZmluZWQoX1dJTjMyKQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxzaGVsbGFwaS5oPgotLyogV2lsbCBiZSBsZWFrZWQgb24gZXhpdCAqLwotc3RhdGljIGNoYXIqKiB3aW4zMl9hcmd2X3V0ZjggPSBOVUxMOwotc3RhdGljIGludCB3aW4zMl9hcmdjID0gMDsKLQotLyoqCi0gKiBQcmVwYXJlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIGV4ZWN1dGFibGUuCi0gKiBGb3IgV2luZG93cyAtIHBlcmZvcm0gd2lkZS1jaGFyIHRvIFVURi04IGNvbnZlcnNpb24uCi0gKiBJbnB1dCBhcmd1bWVudHMgc2hvdWxkIGJlIG1haW4oKSBmdW5jdGlvbiBhcmd1bWVudHMuCi0gKiBAcGFyYW0gYXJnY19wdHIgQXJndW1lbnRzIG51bWJlciAoaW5jbHVkaW5nIGV4ZWN1dGFibGUpCi0gKiBAcGFyYW0gYXJndl9wdHIgQXJndW1lbnRzIGxpc3QuCi0gKi8KLXN0YXRpYyB2b2lkIHByZXBhcmVfYXBwX2FyZ3VtZW50cyhpbnQgKmFyZ2NfcHRyLCBjaGFyICoqKmFyZ3ZfcHRyKQotewotICAgIGNoYXIgKmFyZ3N0cl9mbGF0OwotICAgIHdjaGFyX3QgKiphcmd2X3c7Ci0gICAgaW50IGksIGJ1ZmZzaXplID0gMCwgb2Zmc2V0ID0gMDsKLQotICAgIGlmICh3aW4zMl9hcmd2X3V0ZjgpIHsKLSAgICAgICAgKmFyZ2NfcHRyID0gd2luMzJfYXJnYzsKLSAgICAgICAgKmFyZ3ZfcHRyID0gd2luMzJfYXJndl91dGY4OwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgd2luMzJfYXJnYyA9IDA7Ci0gICAgYXJndl93ID0gQ29tbWFuZExpbmVUb0FyZ3ZXKEdldENvbW1hbmRMaW5lVygpLCAmd2luMzJfYXJnYyk7Ci0gICAgaWYgKHdpbjMyX2FyZ2MgPD0gMCB8fCAhYXJndl93KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiBkZXRlcm1pbmUgdGhlIFVURi04IGJ1ZmZlciBzaXplIChpbmNsdWRpbmcgTlVMTC10ZXJtaW5hdGlvbiBzeW1ib2xzKSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCB3aW4zMl9hcmdjOyBpKyspCi0gICAgICAgIGJ1ZmZzaXplICs9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgYXJndl93W2ldLCAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKLQotICAgIHdpbjMyX2FyZ3ZfdXRmOCA9IGF2X21hbGxvY3ooc2l6ZW9mKGNoYXIgKikgKiAod2luMzJfYXJnYyArIDEpICsgYnVmZnNpemUpOwotICAgIGFyZ3N0cl9mbGF0ICAgICA9IChjaGFyICopd2luMzJfYXJndl91dGY4ICsgc2l6ZW9mKGNoYXIgKikgKiAod2luMzJfYXJnYyArIDEpOwotICAgIGlmICghd2luMzJfYXJndl91dGY4KSB7Ci0gICAgICAgIExvY2FsRnJlZShhcmd2X3cpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IHdpbjMyX2FyZ2M7IGkrKykgewotICAgICAgICB3aW4zMl9hcmd2X3V0ZjhbaV0gPSAmYXJnc3RyX2ZsYXRbb2Zmc2V0XTsKLSAgICAgICAgb2Zmc2V0ICs9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfVVRGOCwgMCwgYXJndl93W2ldLCAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFyZ3N0cl9mbGF0W29mZnNldF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZzaXplIC0gb2Zmc2V0LCBOVUxMLCBOVUxMKTsKLSAgICB9Ci0gICAgd2luMzJfYXJndl91dGY4W2ldID0gTlVMTDsKLSAgICBMb2NhbEZyZWUoYXJndl93KTsKLQotICAgICphcmdjX3B0ciA9IHdpbjMyX2FyZ2M7Ci0gICAgKmFyZ3ZfcHRyID0gd2luMzJfYXJndl91dGY4OwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX2FwcF9hcmd1bWVudHMoaW50ICphcmdjX3B0ciwgY2hhciAqKiphcmd2X3B0cikKLXsKLSAgICAvKiBub3RoaW5nIHRvIGRvICovCi19Ci0jZW5kaWYgLyogSEFWRV9DT01NQU5ETElORVRPQVJHVlcgKi8KLQotc3RhdGljIGludCB3cml0ZV9vcHRpb24odm9pZCAqb3B0Y3R4LCBjb25zdCBPcHRpb25EZWYgKnBvLCBjb25zdCBjaGFyICpvcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgLyogbmV3LXN0eWxlIG9wdGlvbnMgY29udGFpbiBhbiBvZmZzZXQgaW50byBvcHRjdHgsIG9sZC1zdHlsZSBhZGRyZXNzIG9mCi0gICAgICogYSBnbG9iYWwgdmFyKi8KLSAgICB2b2lkICpkc3QgPSBwby0+ZmxhZ3MgJiAoT1BUX09GRlNFVCB8IE9QVF9TUEVDKSA/Ci0gICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilvcHRjdHggKyBwby0+dS5vZmYgOiBwby0+dS5kc3RfcHRyOwotICAgIGludCAqZHN0Y291bnQ7Ci0KLSAgICBpZiAocG8tPmZsYWdzICYgT1BUX1NQRUMpIHsKLSAgICAgICAgU3BlY2lmaWVyT3B0ICoqc28gPSBkc3Q7Ci0gICAgICAgIGNoYXIgKnAgPSBzdHJjaHIob3B0LCAnOicpOwotICAgICAgICBjaGFyICpzdHI7Ci0KLSAgICAgICAgZHN0Y291bnQgPSAoaW50ICopKHNvICsgMSk7Ci0gICAgICAgICpzbyA9IGdyb3dfYXJyYXkoKnNvLCBzaXplb2YoKipzbyksIGRzdGNvdW50LCAqZHN0Y291bnQgKyAxKTsKLSAgICAgICAgc3RyID0gYXZfc3RyZHVwKHAgPyBwICsgMSA6ICIiKTsKLSAgICAgICAgaWYgKCFzdHIpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAoKnNvKVsqZHN0Y291bnQgLSAxXS5zcGVjaWZpZXIgPSBzdHI7Ci0gICAgICAgIGRzdCA9ICYoKnNvKVsqZHN0Y291bnQgLSAxXS51OwotICAgIH0KLQotICAgIGlmIChwby0+ZmxhZ3MgJiBPUFRfU1RSSU5HKSB7Ci0gICAgICAgIGNoYXIgKnN0cjsKLSAgICAgICAgc3RyID0gYXZfc3RyZHVwKGFyZyk7Ci0gICAgICAgIGF2X2ZyZWVwKGRzdCk7Ci0gICAgICAgIGlmICghc3RyKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgKihjaGFyICoqKWRzdCA9IHN0cjsKLSAgICB9IGVsc2UgaWYgKHBvLT5mbGFncyAmIE9QVF9CT09MIHx8IHBvLT5mbGFncyAmIE9QVF9JTlQpIHsKLSAgICAgICAgKihpbnQgKilkc3QgPSBwYXJzZV9udW1iZXJfb3JfZGllKG9wdCwgYXJnLCBPUFRfSU5UNjQsIElOVF9NSU4sIElOVF9NQVgpOwotICAgIH0gZWxzZSBpZiAocG8tPmZsYWdzICYgT1BUX0lOVDY0KSB7Ci0gICAgICAgICooaW50NjRfdCAqKWRzdCA9IHBhcnNlX251bWJlcl9vcl9kaWUob3B0LCBhcmcsIE9QVF9JTlQ2NCwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgpOwotICAgIH0gZWxzZSBpZiAocG8tPmZsYWdzICYgT1BUX1RJTUUpIHsKLSAgICAgICAgKihpbnQ2NF90ICopZHN0ID0gcGFyc2VfdGltZV9vcl9kaWUob3B0LCBhcmcsIDEpOwotICAgIH0gZWxzZSBpZiAocG8tPmZsYWdzICYgT1BUX0ZMT0FUKSB7Ci0gICAgICAgICooZmxvYXQgKilkc3QgPSBwYXJzZV9udW1iZXJfb3JfZGllKG9wdCwgYXJnLCBPUFRfRkxPQVQsIC1JTkZJTklUWSwgSU5GSU5JVFkpOwotICAgIH0gZWxzZSBpZiAocG8tPmZsYWdzICYgT1BUX0RPVUJMRSkgewotICAgICAgICAqKGRvdWJsZSAqKWRzdCA9IHBhcnNlX251bWJlcl9vcl9kaWUob3B0LCBhcmcsIE9QVF9ET1VCTEUsIC1JTkZJTklUWSwgSU5GSU5JVFkpOwotICAgIH0gZWxzZSBpZiAocG8tPnUuZnVuY19hcmcpIHsKLSAgICAgICAgaW50IHJldCA9IHBvLT51LmZ1bmNfYXJnKG9wdGN0eCwgb3B0LCBhcmcpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCB2YWx1ZSAnJXMnIGZvciBvcHRpb24gJyVzJzogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgYXJnLCBvcHQsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwby0+ZmxhZ3MgJiBPUFRfRVhJVCkKLSAgICAgICAgZXhpdF9wcm9ncmFtKDApOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBwYXJzZV9vcHRpb24odm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZywKLSAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zKQotewotICAgIGNvbnN0IE9wdGlvbkRlZiAqcG87Ci0gICAgaW50IHJldDsKLQotICAgIHBvID0gZmluZF9vcHRpb24ob3B0aW9ucywgb3B0KTsKLSAgICBpZiAoIXBvLT5uYW1lICYmIG9wdFswXSA9PSAnbicgJiYgb3B0WzFdID09ICdvJykgewotICAgICAgICAvKiBoYW5kbGUgJ25vJyBib29sIG9wdGlvbiAqLwotICAgICAgICBwbyA9IGZpbmRfb3B0aW9uKG9wdGlvbnMsIG9wdCArIDIpOwotICAgICAgICBpZiAoKHBvLT5uYW1lICYmIChwby0+ZmxhZ3MgJiBPUFRfQk9PTCkpKQotICAgICAgICAgICAgYXJnID0gIjAiOwotICAgIH0gZWxzZSBpZiAocG8tPmZsYWdzICYgT1BUX0JPT0wpCi0gICAgICAgIGFyZyA9ICIxIjsKLQotICAgIGlmICghcG8tPm5hbWUpCi0gICAgICAgIHBvID0gZmluZF9vcHRpb24ob3B0aW9ucywgImRlZmF1bHQiKTsKLSAgICBpZiAoIXBvLT5uYW1lKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbnJlY29nbml6ZWQgb3B0aW9uICclcydcbiIsIG9wdCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIGlmIChwby0+ZmxhZ3MgJiBIQVNfQVJHICYmICFhcmcpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgYXJndW1lbnQgZm9yIG9wdGlvbiAnJXMnXG4iLCBvcHQpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLQotICAgIHJldCA9IHdyaXRlX29wdGlvbihvcHRjdHgsIHBvLCBvcHQsIGFyZyk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICByZXR1cm4gISEocG8tPmZsYWdzICYgSEFTX0FSRyk7Ci19Ci0KLXZvaWQgcGFyc2Vfb3B0aW9ucyh2b2lkICpvcHRjdHgsIGludCBhcmdjLCBjaGFyICoqYXJndiwgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zLAotICAgICAgICAgICAgICAgICAgIHZvaWQgKCpwYXJzZV9hcmdfZnVuY3Rpb24pKHZvaWQgKiwgY29uc3QgY2hhciopKQotewotICAgIGNvbnN0IGNoYXIgKm9wdDsKLSAgICBpbnQgb3B0aW5kZXgsIGhhbmRsZW9wdGlvbnMgPSAxLCByZXQ7Ci0KLSAgICAvKiBwZXJmb3JtIHN5c3RlbS1kZXBlbmRlbnQgY29udmVyc2lvbnMgZm9yIGFyZ3VtZW50cyBsaXN0ICovCi0gICAgcHJlcGFyZV9hcHBfYXJndW1lbnRzKCZhcmdjLCAmYXJndik7Ci0KLSAgICAvKiBwYXJzZSBvcHRpb25zICovCi0gICAgb3B0aW5kZXggPSAxOwotICAgIHdoaWxlIChvcHRpbmRleCA8IGFyZ2MpIHsKLSAgICAgICAgb3B0ID0gYXJndltvcHRpbmRleCsrXTsKLQotICAgICAgICBpZiAoaGFuZGxlb3B0aW9ucyAmJiBvcHRbMF0gPT0gJy0nICYmIG9wdFsxXSAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBpZiAob3B0WzFdID09ICctJyAmJiBvcHRbMl0gPT0gJ1wwJykgewotICAgICAgICAgICAgICAgIGhhbmRsZW9wdGlvbnMgPSAwOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3B0Kys7Ci0KLSAgICAgICAgICAgIGlmICgocmV0ID0gcGFyc2Vfb3B0aW9uKG9wdGN0eCwgb3B0LCBhcmd2W29wdGluZGV4XSwgb3B0aW9ucykpIDwgMCkKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICBvcHRpbmRleCArPSByZXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocGFyc2VfYXJnX2Z1bmN0aW9uKQotICAgICAgICAgICAgICAgIHBhcnNlX2FyZ19mdW5jdGlvbihvcHRjdHgsIG9wdCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBwYXJzZV9vcHRncm91cCh2b2lkICpvcHRjdHgsIE9wdGlvbkdyb3VwICpnKQotewotICAgIGludCBpLCByZXQ7Ci0KLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiUGFyc2luZyBhIGdyb3VwIG9mIG9wdGlvbnM6ICVzICVzLlxuIiwKLSAgICAgICAgICAgZy0+Z3JvdXBfZGVmLT5uYW1lLCBnLT5hcmcpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGctPm5iX29wdHM7IGkrKykgewotICAgICAgICBPcHRpb24gKm8gPSAmZy0+b3B0c1tpXTsKLQotICAgICAgICBpZiAoZy0+Z3JvdXBfZGVmLT5mbGFncyAmJgotICAgICAgICAgICAgIShnLT5ncm91cF9kZWYtPmZsYWdzICYgby0+b3B0LT5mbGFncykpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJPcHRpb24gJXMgKCVzKSBjYW5ub3QgYmUgYXBwbGllZCB0byAiCi0gICAgICAgICAgICAgICAgICAgIiVzICVzIC0tIHlvdSBhcmUgdHJ5aW5nIHRvIGFwcGx5IGFuIGlucHV0IG9wdGlvbiB0byBhbiAiCi0gICAgICAgICAgICAgICAgICAgIm91dHB1dCBmaWxlIG9yIHZpY2UgdmVyc2EuIE1vdmUgdGhpcyBvcHRpb24gYmVmb3JlIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgImZpbGUgaXQgYmVsb25ncyB0by5cbiIsIG8tPmtleSwgby0+b3B0LT5oZWxwLAotICAgICAgICAgICAgICAgICAgIGctPmdyb3VwX2RlZi0+bmFtZSwgZy0+YXJnKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiQXBwbHlpbmcgb3B0aW9uICVzICglcykgd2l0aCBhcmd1bWVudCAlcy5cbiIsCi0gICAgICAgICAgICAgICBvLT5rZXksIG8tPm9wdC0+aGVscCwgby0+dmFsKTsKLQotICAgICAgICByZXQgPSB3cml0ZV9vcHRpb24ob3B0Y3R4LCBvLT5vcHQsIG8tPmtleSwgby0+dmFsKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJTdWNjZXNzZnVsbHkgcGFyc2VkIGEgZ3JvdXAgb2Ygb3B0aW9ucy5cbiIpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBsb2NhdGVfb3B0aW9uKGludCBhcmdjLCBjaGFyICoqYXJndiwgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3B0bmFtZSkKLXsKLSAgICBjb25zdCBPcHRpb25EZWYgKnBvOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBjb25zdCBjaGFyICpjdXJfb3B0ID0gYXJndltpXTsKLQotICAgICAgICBpZiAoKmN1cl9vcHQrKyAhPSAnLScpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBwbyA9IGZpbmRfb3B0aW9uKG9wdGlvbnMsIGN1cl9vcHQpOwotICAgICAgICBpZiAoIXBvLT5uYW1lICYmIGN1cl9vcHRbMF0gPT0gJ24nICYmIGN1cl9vcHRbMV0gPT0gJ28nKQotICAgICAgICAgICAgcG8gPSBmaW5kX29wdGlvbihvcHRpb25zLCBjdXJfb3B0ICsgMik7Ci0KLSAgICAgICAgaWYgKCghcG8tPm5hbWUgJiYgIXN0cmNtcChjdXJfb3B0LCBvcHRuYW1lKSkgfHwKLSAgICAgICAgICAgICAocG8tPm5hbWUgJiYgIXN0cmNtcChvcHRuYW1lLCBwby0+bmFtZSkpKQotICAgICAgICAgICAgcmV0dXJuIGk7Ci0KLSAgICAgICAgaWYgKCFwby0+bmFtZSB8fCBwby0+ZmxhZ3MgJiBIQVNfQVJHKQotICAgICAgICAgICAgaSsrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZHVtcF9hcmd1bWVudChjb25zdCBjaGFyICphKQotewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7Ci0KLSAgICBmb3IgKHAgPSBhOyAqcDsgcCsrKQotICAgICAgICBpZiAoISgoKnAgPj0gJysnICYmICpwIDw9ICc6JykgfHwgKCpwID49ICdAJyAmJiAqcCA8PSAnWicpIHx8Ci0gICAgICAgICAgICAgICpwID09ICdfJyB8fCAoKnAgPj0gJ2EnICYmICpwIDw9ICd6JykpKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgaWYgKCEqcCkgewotICAgICAgICBmcHV0cyhhLCByZXBvcnRfZmlsZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZnB1dGMoJyInLCByZXBvcnRfZmlsZSk7Ci0gICAgZm9yIChwID0gYTsgKnA7IHArKykgewotICAgICAgICBpZiAoKnAgPT0gJ1xcJyB8fCAqcCA9PSAnIicgfHwgKnAgPT0gJyQnIHx8ICpwID09ICdgJykKLSAgICAgICAgICAgIGZwcmludGYocmVwb3J0X2ZpbGUsICJcXCVjIiwgKnApOwotICAgICAgICBlbHNlIGlmICgqcCA8ICcgJyB8fCAqcCA+ICd+JykKLSAgICAgICAgICAgIGZwcmludGYocmVwb3J0X2ZpbGUsICJcXHglMDJ4IiwgKnApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmcHV0YygqcCwgcmVwb3J0X2ZpbGUpOwotICAgIH0KLSAgICBmcHV0YygnIicsIHJlcG9ydF9maWxlKTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfb3B0aW9ucyhjb25zdCBPcHRpb25EZWYgKnBvKQotewotICAgIHdoaWxlIChwby0+bmFtZSkgewotICAgICAgICBpZiAocG8tPmZsYWdzICYgT1BUX1BFUkZJTEUpCi0gICAgICAgICAgICBhdl9hc3NlcnQwKHBvLT5mbGFncyAmIChPUFRfSU5QVVQgfCBPUFRfT1VUUFVUKSk7Ci0gICAgICAgIHBvKys7Ci0gICAgfQotfQotCi12b2lkIHBhcnNlX2xvZ2xldmVsKGludCBhcmdjLCBjaGFyICoqYXJndiwgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zKQotewotICAgIGludCBpZHggPSBsb2NhdGVfb3B0aW9uKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsICJsb2dsZXZlbCIpOwotICAgIGNvbnN0IGNoYXIgKmVudjsKLQotICAgIGNoZWNrX29wdGlvbnMob3B0aW9ucyk7Ci0KLSAgICBpZiAoIWlkeCkKLSAgICAgICAgaWR4ID0gbG9jYXRlX29wdGlvbihhcmdjLCBhcmd2LCBvcHRpb25zLCAidiIpOwotICAgIGlmIChpZHggJiYgYXJndltpZHggKyAxXSkKLSAgICAgICAgb3B0X2xvZ2xldmVsKE5VTEwsICJsb2dsZXZlbCIsIGFyZ3ZbaWR4ICsgMV0pOwotICAgIGlkeCA9IGxvY2F0ZV9vcHRpb24oYXJnYywgYXJndiwgb3B0aW9ucywgInJlcG9ydCIpOwotICAgIGlmICgoZW52ID0gZ2V0ZW52KCJGRlJFUE9SVCIpKSB8fCBpZHgpIHsKLSAgICAgICAgaW5pdF9yZXBvcnQoZW52KTsKLSAgICAgICAgaWYgKHJlcG9ydF9maWxlKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZwcmludGYocmVwb3J0X2ZpbGUsICJDb21tYW5kIGxpbmU6XG4iKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkdW1wX2FyZ3VtZW50KGFyZ3ZbaV0pOwotICAgICAgICAgICAgICAgIGZwdXRjKGkgPCBhcmdjIC0gMSA/ICcgJyA6ICdcbicsIHJlcG9ydF9maWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZmbHVzaChyZXBvcnRfZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWR4ID0gbG9jYXRlX29wdGlvbihhcmdjLCBhcmd2LCBvcHRpb25zLCAiaGlkZV9iYW5uZXIiKTsKLSAgICBpZiAoaWR4KQotICAgICAgICBoaWRlX2Jhbm5lciA9IDE7Ci19Ci0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiAqb3B0X2ZpbmQodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp1bml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRfZmxhZ3MsIGludCBzZWFyY2hfZmxhZ3MpCi17Ci0gICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZChvYmosIG5hbWUsIHVuaXQsIG9wdF9mbGFncywgc2VhcmNoX2ZsYWdzKTsKLSAgICBpZihvICYmICFvLT5mbGFncykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIG87Ci19Ci0KLSNkZWZpbmUgRkxBR1MgKG8tPnR5cGUgPT0gQVZfT1BUX1RZUEVfRkxBR1MgJiYgKGFyZ1swXT09Jy0nIHx8IGFyZ1swXT09JysnKSkgPyBBVl9ESUNUX0FQUEVORCA6IDAKLWludCBvcHRfZGVmYXVsdCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IEFWT3B0aW9uICpvOwotICAgIGludCBjb25zdW1lZCA9IDA7Ci0gICAgY2hhciBvcHRfc3RyaXBwZWRbMTI4XTsKLSAgICBjb25zdCBjaGFyICpwOwotICAgIGNvbnN0IEFWQ2xhc3MgKmNjID0gYXZjb2RlY19nZXRfY2xhc3MoKSwgKmZjID0gYXZmb3JtYXRfZ2V0X2NsYXNzKCk7Ci0jaWYgQ09ORklHX0FWUkVTQU1QTEUKLSAgICBjb25zdCBBVkNsYXNzICpyYyA9IGF2cmVzYW1wbGVfZ2V0X2NsYXNzKCk7Ci0jZW5kaWYKLSNpZiBDT05GSUdfU1dTQ0FMRQotICAgIGNvbnN0IEFWQ2xhc3MgKnNjID0gc3dzX2dldF9jbGFzcygpOwotI2VuZGlmCi0jaWYgQ09ORklHX1NXUkVTQU1QTEUKLSAgICBjb25zdCBBVkNsYXNzICpzd3JfY2xhc3MgPSBzd3JfZ2V0X2NsYXNzKCk7Ci0jZW5kaWYKLQotICAgIGlmICghc3RyY21wKG9wdCwgImRlYnVnIikgfHwgIXN0cmNtcChvcHQsICJmZGVidWciKSkKLSAgICAgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOwotCi0gICAgaWYgKCEocCA9IHN0cmNocihvcHQsICc6JykpKQotICAgICAgICBwID0gb3B0ICsgc3RybGVuKG9wdCk7Ci0gICAgYXZfc3RybGNweShvcHRfc3RyaXBwZWQsIG9wdCwgRkZNSU4oc2l6ZW9mKG9wdF9zdHJpcHBlZCksIHAgLSBvcHQgKyAxKSk7Ci0KLSAgICBpZiAoKG8gPSBvcHRfZmluZCgmY2MsIG9wdF9zdHJpcHBlZCwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0NISUxEUkVOIHwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSikpIHx8Ci0gICAgICAgICgob3B0WzBdID09ICd2JyB8fCBvcHRbMF0gPT0gJ2EnIHx8IG9wdFswXSA9PSAncycpICYmCi0gICAgICAgICAobyA9IG9wdF9maW5kKCZjYywgb3B0ICsgMSwgTlVMTCwgMCwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSikpKSkgewotICAgICAgICBhdl9kaWN0X3NldCgmY29kZWNfb3B0cywgb3B0LCBhcmcsIEZMQUdTKTsKLSAgICAgICAgY29uc3VtZWQgPSAxOwotICAgIH0KLSAgICBpZiAoKG8gPSBvcHRfZmluZCgmZmMsIG9wdCwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0NISUxEUkVOIHwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSikpKSB7Ci0gICAgICAgIGF2X2RpY3Rfc2V0KCZmb3JtYXRfb3B0cywgb3B0LCBhcmcsIEZMQUdTKTsKLSAgICAgICAgaWYgKGNvbnN1bWVkKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiUm91dGluZyBvcHRpb24gJXMgdG8gYm90aCBjb2RlYyBhbmQgbXV4ZXIgbGF5ZXJcbiIsIG9wdCk7Ci0gICAgICAgIGNvbnN1bWVkID0gMTsKLSAgICB9Ci0jaWYgQ09ORklHX1NXU0NBTEUKLSAgICBpZiAoIWNvbnN1bWVkICYmIChvID0gb3B0X2ZpbmQoJnNjLCBvcHQsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiB8IEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSkgewotICAgICAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqc3dzID0gc3dzX2FsbG9jX2NvbnRleHQoKTsKLSAgICAgICAgaW50IHJldCA9IGF2X29wdF9zZXQoc3dzLCBvcHQsIGFyZywgMCk7Ci0gICAgICAgIHN3c19mcmVlQ29udGV4dChzd3MpOwotICAgICAgICBpZiAoIXN0cmNtcChvcHQsICJzcmN3IikgfHwgIXN0cmNtcChvcHQsICJzcmNoIikgfHwKLSAgICAgICAgICAgICFzdHJjbXAob3B0LCAiZHN0dyIpIHx8ICFzdHJjbXAob3B0LCAiZHN0aCIpIHx8Ci0gICAgICAgICAgICAhc3RyY21wKG9wdCwgInNyY19mb3JtYXQiKSB8fCAhc3RyY21wKG9wdCwgImRzdF9mb3JtYXQiKSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkRpcmVjdGx5IHVzaW5nIHN3c2NhbGUgZGltZW5zaW9ucy9mb3JtYXQgb3B0aW9ucyBpcyBub3Qgc3VwcG9ydGVkLCBwbGVhc2UgdXNlIHRoZSAtcyBvciAtcGl4X2ZtdCBvcHRpb25zXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIG9wdGlvbiAlcy5cbiIsIG9wdCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgYXZfZGljdF9zZXQoJnN3c19kaWN0LCBvcHQsIGFyZywgRkxBR1MpOwotCi0gICAgICAgIGNvbnN1bWVkID0gMTsKLSAgICB9Ci0jZWxzZQotICAgIGlmICghY29uc3VtZWQgJiYgIXN0cmNtcChvcHQsICJzd3NfZmxhZ3MiKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJJZ25vcmluZyAlcyAlcywgZHVlIHRvIGRpc2FibGVkIHN3c2NhbGVcbiIsIG9wdCwgYXJnKTsKLSAgICAgICAgY29uc3VtZWQgPSAxOwotICAgIH0KLSNlbmRpZgotI2lmIENPTkZJR19TV1JFU0FNUExFCi0gICAgaWYgKCFjb25zdW1lZCAmJiAobz1vcHRfZmluZCgmc3dyX2NsYXNzLCBvcHQsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0NISUxEUkVOIHwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSikpKSB7Ci0gICAgICAgIHN0cnVjdCBTd3JDb250ZXh0ICpzd3IgPSBzd3JfYWxsb2MoKTsKLSAgICAgICAgaW50IHJldCA9IGF2X29wdF9zZXQoc3dyLCBvcHQsIGFyZywgMCk7Ci0gICAgICAgIHN3cl9mcmVlKCZzd3IpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHNldHRpbmcgb3B0aW9uICVzLlxuIiwgb3B0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfZGljdF9zZXQoJnN3cl9vcHRzLCBvcHQsIGFyZywgRkxBR1MpOwotICAgICAgICBjb25zdW1lZCA9IDE7Ci0gICAgfQotI2VuZGlmCi0jaWYgQ09ORklHX0FWUkVTQU1QTEUKLSAgICBpZiAoKG89b3B0X2ZpbmQoJnJjLCBvcHQsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4gfCBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKSkpIHsKLSAgICAgICAgYXZfZGljdF9zZXQoJnJlc2FtcGxlX29wdHMsIG9wdCwgYXJnLCBGTEFHUyk7Ci0gICAgICAgIGNvbnN1bWVkID0gMTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChjb25zdW1lZCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIEFWRVJST1JfT1BUSU9OX05PVF9GT1VORDsKLX0KLQotLyoKLSAqIENoZWNrIHdoZXRoZXIgZ2l2ZW4gb3B0aW9uIGlzIGEgZ3JvdXAgc2VwYXJhdG9yLgotICoKLSAqIEByZXR1cm4gaW5kZXggb2YgdGhlIGdyb3VwIGRlZmluaXRpb24gdGhhdCBtYXRjaGVkIG9yIC0xIGlmIG5vbmUKLSAqLwotc3RhdGljIGludCBtYXRjaF9ncm91cF9zZXBhcmF0b3IoY29uc3QgT3B0aW9uR3JvdXBEZWYgKmdyb3VwcywgaW50IG5iX2dyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wdCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9ncm91cHM7IGkrKykgewotICAgICAgICBjb25zdCBPcHRpb25Hcm91cERlZiAqcCA9ICZncm91cHNbaV07Ci0gICAgICAgIGlmIChwLT5zZXAgJiYgIXN0cmNtcChwLT5zZXAsIG9wdCkpCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qCi0gKiBGaW5pc2ggcGFyc2luZyBhbiBvcHRpb24gZ3JvdXAuCi0gKgotICogQHBhcmFtIGdyb3VwX2lkeCB3aGljaCBncm91cCBkZWZpbml0aW9uIHNob3VsZCB0aGlzIGdyb3VwIGJlbG9uZyB0bwotICogQHBhcmFtIGFyZyBhcmd1bWVudCBvZiB0aGUgZ3JvdXAgZGVsaW1pdGluZyBvcHRpb24KLSAqLwotc3RhdGljIHZvaWQgZmluaXNoX2dyb3VwKE9wdGlvblBhcnNlQ29udGV4dCAqb2N0eCwgaW50IGdyb3VwX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgT3B0aW9uR3JvdXBMaXN0ICpsID0gJm9jdHgtPmdyb3Vwc1tncm91cF9pZHhdOwotICAgIE9wdGlvbkdyb3VwICpnOwotCi0gICAgR1JPV19BUlJBWShsLT5ncm91cHMsIGwtPm5iX2dyb3Vwcyk7Ci0gICAgZyA9ICZsLT5ncm91cHNbbC0+bmJfZ3JvdXBzIC0gMV07Ci0KLSAgICAqZyAgICAgICAgICAgICA9IG9jdHgtPmN1cl9ncm91cDsKLSAgICBnLT5hcmcgICAgICAgICA9IGFyZzsKLSAgICBnLT5ncm91cF9kZWYgICA9IGwtPmdyb3VwX2RlZjsKLSAgICBnLT5zd3NfZGljdCAgICA9IHN3c19kaWN0OwotICAgIGctPnN3cl9vcHRzICAgID0gc3dyX29wdHM7Ci0gICAgZy0+Y29kZWNfb3B0cyAgPSBjb2RlY19vcHRzOwotICAgIGctPmZvcm1hdF9vcHRzID0gZm9ybWF0X29wdHM7Ci0gICAgZy0+cmVzYW1wbGVfb3B0cyA9IHJlc2FtcGxlX29wdHM7Ci0KLSAgICBjb2RlY19vcHRzICA9IE5VTEw7Ci0gICAgZm9ybWF0X29wdHMgPSBOVUxMOwotICAgIHJlc2FtcGxlX29wdHMgPSBOVUxMOwotICAgIHN3c19kaWN0ICAgID0gTlVMTDsKLSAgICBzd3Jfb3B0cyAgICA9IE5VTEw7Ci0gICAgaW5pdF9vcHRzKCk7Ci0KLSAgICBtZW1zZXQoJm9jdHgtPmN1cl9ncm91cCwgMCwgc2l6ZW9mKG9jdHgtPmN1cl9ncm91cCkpOwotfQotCi0vKgotICogQWRkIGFuIG9wdGlvbiBpbnN0YW5jZSB0byBjdXJyZW50bHkgcGFyc2VkIGdyb3VwLgotICovCi1zdGF0aWMgdm9pZCBhZGRfb3B0KE9wdGlvblBhcnNlQ29udGV4dCAqb2N0eCwgY29uc3QgT3B0aW9uRGVmICpvcHQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsKQotewotICAgIGludCBnbG9iYWwgPSAhKG9wdC0+ZmxhZ3MgJiAoT1BUX1BFUkZJTEUgfCBPUFRfU1BFQyB8IE9QVF9PRkZTRVQpKTsKLSAgICBPcHRpb25Hcm91cCAqZyA9IGdsb2JhbCA/ICZvY3R4LT5nbG9iYWxfb3B0cyA6ICZvY3R4LT5jdXJfZ3JvdXA7Ci0KLSAgICBHUk9XX0FSUkFZKGctPm9wdHMsIGctPm5iX29wdHMpOwotICAgIGctPm9wdHNbZy0+bmJfb3B0cyAtIDFdLm9wdCA9IG9wdDsKLSAgICBnLT5vcHRzW2ctPm5iX29wdHMgLSAxXS5rZXkgPSBrZXk7Ci0gICAgZy0+b3B0c1tnLT5uYl9vcHRzIC0gMV0udmFsID0gdmFsOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X3BhcnNlX2NvbnRleHQoT3B0aW9uUGFyc2VDb250ZXh0ICpvY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbkdyb3VwRGVmICpncm91cHMsIGludCBuYl9ncm91cHMpCi17Ci0gICAgc3RhdGljIGNvbnN0IE9wdGlvbkdyb3VwRGVmIGdsb2JhbF9ncm91cCA9IHsgImdsb2JhbCIgfTsKLSAgICBpbnQgaTsKLQotICAgIG1lbXNldChvY3R4LCAwLCBzaXplb2YoKm9jdHgpKTsKLQotICAgIG9jdHgtPm5iX2dyb3VwcyA9IG5iX2dyb3VwczsKLSAgICBvY3R4LT5ncm91cHMgICAgPSBhdl9tYWxsb2N6X2FycmF5KG9jdHgtPm5iX2dyb3Vwcywgc2l6ZW9mKCpvY3R4LT5ncm91cHMpKTsKLSAgICBpZiAoIW9jdHgtPmdyb3VwcykKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG9jdHgtPm5iX2dyb3VwczsgaSsrKQotICAgICAgICBvY3R4LT5ncm91cHNbaV0uZ3JvdXBfZGVmID0gJmdyb3Vwc1tpXTsKLQotICAgIG9jdHgtPmdsb2JhbF9vcHRzLmdyb3VwX2RlZiA9ICZnbG9iYWxfZ3JvdXA7Ci0gICAgb2N0eC0+Z2xvYmFsX29wdHMuYXJnICAgICAgID0gIiI7Ci0KLSAgICBpbml0X29wdHMoKTsKLX0KLQotdm9pZCB1bmluaXRfcGFyc2VfY29udGV4dChPcHRpb25QYXJzZUNvbnRleHQgKm9jdHgpCi17Ci0gICAgaW50IGksIGo7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgb2N0eC0+bmJfZ3JvdXBzOyBpKyspIHsKLSAgICAgICAgT3B0aW9uR3JvdXBMaXN0ICpsID0gJm9jdHgtPmdyb3Vwc1tpXTsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgbC0+bmJfZ3JvdXBzOyBqKyspIHsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZsLT5ncm91cHNbal0ub3B0cyk7Ci0gICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmwtPmdyb3Vwc1tqXS5jb2RlY19vcHRzKTsKLSAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmbC0+Z3JvdXBzW2pdLmZvcm1hdF9vcHRzKTsKLSAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmbC0+Z3JvdXBzW2pdLnJlc2FtcGxlX29wdHMpOwotCi0gICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmwtPmdyb3Vwc1tqXS5zd3NfZGljdCk7Ci0gICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmwtPmdyb3Vwc1tqXS5zd3Jfb3B0cyk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfZnJlZXAoJmwtPmdyb3Vwcyk7Ci0gICAgfQotICAgIGF2X2ZyZWVwKCZvY3R4LT5ncm91cHMpOwotCi0gICAgYXZfZnJlZXAoJm9jdHgtPmN1cl9ncm91cC5vcHRzKTsKLSAgICBhdl9mcmVlcCgmb2N0eC0+Z2xvYmFsX29wdHMub3B0cyk7Ci0KLSAgICB1bmluaXRfb3B0cygpOwotfQotCi1pbnQgc3BsaXRfY29tbWFuZGxpbmUoT3B0aW9uUGFyc2VDb250ZXh0ICpvY3R4LCBpbnQgYXJnYywgY2hhciAqYXJndltdLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25Hcm91cERlZiAqZ3JvdXBzLCBpbnQgbmJfZ3JvdXBzKQotewotICAgIGludCBvcHRpbmRleCA9IDE7Ci0gICAgaW50IGRhc2hkYXNoID0gLTI7Ci0KLSAgICAvKiBwZXJmb3JtIHN5c3RlbS1kZXBlbmRlbnQgY29udmVyc2lvbnMgZm9yIGFyZ3VtZW50cyBsaXN0ICovCi0gICAgcHJlcGFyZV9hcHBfYXJndW1lbnRzKCZhcmdjLCAmYXJndik7Ci0KLSAgICBpbml0X3BhcnNlX2NvbnRleHQob2N0eCwgZ3JvdXBzLCBuYl9ncm91cHMpOwotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJTcGxpdHRpbmcgdGhlIGNvbW1hbmRsaW5lLlxuIik7Ci0KLSAgICB3aGlsZSAob3B0aW5kZXggPCBhcmdjKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm9wdCA9IGFyZ3Zbb3B0aW5kZXgrK10sICphcmc7Ci0gICAgICAgIGNvbnN0IE9wdGlvbkRlZiAqcG87Ci0gICAgICAgIGludCByZXQ7Ci0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIlJlYWRpbmcgb3B0aW9uICclcycgLi4uIiwgb3B0KTsKLQotICAgICAgICBpZiAob3B0WzBdID09ICctJyAmJiBvcHRbMV0gPT0gJy0nICYmICFvcHRbMl0pIHsKLSAgICAgICAgICAgIGRhc2hkYXNoID0gb3B0aW5kZXg7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvKiB1bm5hbWVkIGdyb3VwIHNlcGFyYXRvcnMsIGUuZy4gb3V0cHV0IGZpbGVuYW1lICovCi0gICAgICAgIGlmIChvcHRbMF0gIT0gJy0nIHx8ICFvcHRbMV0gfHwgZGFzaGRhc2grMSA9PSBvcHRpbmRleCkgewotICAgICAgICAgICAgZmluaXNoX2dyb3VwKG9jdHgsIDAsIG9wdCk7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiIG1hdGNoZWQgYXMgJXMuXG4iLCBncm91cHNbMF0ubmFtZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBvcHQrKzsKLQotI2RlZmluZSBHRVRfQVJHKGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXJnID0gYXJndltvcHRpbmRleCsrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghYXJnKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgYXJndW1lbnQgZm9yIG9wdGlvbiAnJXMnLlxuIiwgb3B0KTtcCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLSAgICAgICAgLyogbmFtZWQgZ3JvdXAgc2VwYXJhdG9ycywgZS5nLiAtaSAqLwotICAgICAgICBpZiAoKHJldCA9IG1hdGNoX2dyb3VwX3NlcGFyYXRvcihncm91cHMsIG5iX2dyb3Vwcywgb3B0KSkgPj0gMCkgewotICAgICAgICAgICAgR0VUX0FSRyhhcmcpOwotICAgICAgICAgICAgZmluaXNoX2dyb3VwKG9jdHgsIHJldCwgYXJnKTsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIgbWF0Y2hlZCBhcyAlcyB3aXRoIGFyZ3VtZW50ICclcycuXG4iLAotICAgICAgICAgICAgICAgICAgIGdyb3Vwc1tyZXRdLm5hbWUsIGFyZyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vcm1hbCBvcHRpb25zICovCi0gICAgICAgIHBvID0gZmluZF9vcHRpb24ob3B0aW9ucywgb3B0KTsKLSAgICAgICAgaWYgKHBvLT5uYW1lKSB7Ci0gICAgICAgICAgICBpZiAocG8tPmZsYWdzICYgT1BUX0VYSVQpIHsKLSAgICAgICAgICAgICAgICAvKiBvcHRpb25hbCBhcmd1bWVudCwgZS5nLiAtaCAqLwotICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3Zbb3B0aW5kZXgrK107Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBvLT5mbGFncyAmIEhBU19BUkcpIHsKLSAgICAgICAgICAgICAgICBHRVRfQVJHKGFyZyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFyZyA9ICIxIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkX29wdChvY3R4LCBwbywgb3B0LCBhcmcpOwotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiBtYXRjaGVkIGFzIG9wdGlvbiAnJXMnICglcykgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgImFyZ3VtZW50ICclcycuXG4iLCBwby0+bmFtZSwgcG8tPmhlbHAsIGFyZyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFWT3B0aW9ucyAqLwotICAgICAgICBpZiAoYXJndltvcHRpbmRleF0pIHsKLSAgICAgICAgICAgIHJldCA9IG9wdF9kZWZhdWx0KE5VTEwsIG9wdCwgYXJndltvcHRpbmRleF0pOwotICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiBtYXRjaGVkIGFzIEFWT3B0aW9uICclcycgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCAnJXMnLlxuIiwgb3B0LCBhcmd2W29wdGluZGV4XSk7Ci0gICAgICAgICAgICAgICAgb3B0aW5kZXgrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICE9IEFWRVJST1JfT1BUSU9OX05PVF9GT1VORCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIG9wdGlvbiAnJXMnICIKLSAgICAgICAgICAgICAgICAgICAgICAgIndpdGggYXJndW1lbnQgJyVzJy5cbiIsIG9wdCwgYXJndltvcHRpbmRleF0pOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBib29sZWFuIC1ub2ZvbyBvcHRpb25zICovCi0gICAgICAgIGlmIChvcHRbMF0gPT0gJ24nICYmIG9wdFsxXSA9PSAnbycgJiYKLSAgICAgICAgICAgIChwbyA9IGZpbmRfb3B0aW9uKG9wdGlvbnMsIG9wdCArIDIpKSAmJgotICAgICAgICAgICAgcG8tPm5hbWUgJiYgcG8tPmZsYWdzICYgT1BUX0JPT0wpIHsKLSAgICAgICAgICAgIGFkZF9vcHQob2N0eCwgcG8sIG9wdCwgIjAiKTsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIgbWF0Y2hlZCBhcyBvcHRpb24gJyVzJyAoJXMpIHdpdGggIgotICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCAwLlxuIiwgcG8tPm5hbWUsIHBvLT5oZWxwKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVucmVjb2duaXplZCBvcHRpb24gJyVzJy5cbiIsIG9wdCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgaWYgKG9jdHgtPmN1cl9ncm91cC5uYl9vcHRzIHx8IGNvZGVjX29wdHMgfHwgZm9ybWF0X29wdHMgfHwgcmVzYW1wbGVfb3B0cykKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiVHJhaWxpbmcgb3B0aW9ucyB3ZXJlIGZvdW5kIG9uIHRoZSAiCi0gICAgICAgICAgICAgICAiY29tbWFuZGxpbmUuXG4iKTsKLQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJGaW5pc2hlZCBzcGxpdHRpbmcgdGhlIGNvbW1hbmRsaW5lLlxuIik7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG9wdF9jcHVmbGFncyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGludCByZXQ7Ci0gICAgdW5zaWduZWQgZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7Ci0KLSAgICBpZiAoKHJldCA9IGF2X3BhcnNlX2NwdV9jYXBzKCZmbGFncywgYXJnKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgYXZfZm9yY2VfY3B1X2ZsYWdzKGZsYWdzKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG9wdF9sb2dsZXZlbCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IHN0cnVjdCB7IGNvbnN0IGNoYXIgKm5hbWU7IGludCBsZXZlbDsgfSBsb2dfbGV2ZWxzW10gPSB7Ci0gICAgICAgIHsgInF1aWV0IiAgLCBBVl9MT0dfUVVJRVQgICB9LAotICAgICAgICB7ICJwYW5pYyIgICwgQVZfTE9HX1BBTklDICAgfSwKLSAgICAgICAgeyAiZmF0YWwiICAsIEFWX0xPR19GQVRBTCAgIH0sCi0gICAgICAgIHsgImVycm9yIiAgLCBBVl9MT0dfRVJST1IgICB9LAotICAgICAgICB7ICJ3YXJuaW5nIiwgQVZfTE9HX1dBUk5JTkcgfSwKLSAgICAgICAgeyAiaW5mbyIgICAsIEFWX0xPR19JTkZPICAgIH0sCi0gICAgICAgIHsgInZlcmJvc2UiLCBBVl9MT0dfVkVSQk9TRSB9LAotICAgICAgICB7ICJkZWJ1ZyIgICwgQVZfTE9HX0RFQlVHICAgfSwKLSAgICAgICAgeyAidHJhY2UiICAsIEFWX0xPR19UUkFDRSAgIH0sCi0gICAgfTsKLSAgICBjaGFyICp0YWlsOwotICAgIGludCBsZXZlbDsKLSAgICBpbnQgZmxhZ3M7Ci0gICAgaW50IGk7Ci0KLSAgICBmbGFncyA9IGF2X2xvZ19nZXRfZmxhZ3MoKTsKLSAgICB0YWlsID0gc3Ryc3RyKGFyZywgInJlcGVhdCIpOwotICAgIGlmICh0YWlsKQotICAgICAgICBmbGFncyAmPSB+QVZfTE9HX1NLSVBfUkVQRUFURUQ7Ci0gICAgZWxzZQotICAgICAgICBmbGFncyB8PSBBVl9MT0dfU0tJUF9SRVBFQVRFRDsKLQotICAgIGF2X2xvZ19zZXRfZmxhZ3MoZmxhZ3MpOwotICAgIGlmICh0YWlsID09IGFyZykKLSAgICAgICAgYXJnICs9IDYgKyAoYXJnWzZdPT0nKycpOwotICAgIGlmKHRhaWwgJiYgISphcmcpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGxvZ19sZXZlbHMpOyBpKyspIHsKLSAgICAgICAgaWYgKCFzdHJjbXAobG9nX2xldmVsc1tpXS5uYW1lLCBhcmcpKSB7Ci0gICAgICAgICAgICBhdl9sb2dfc2V0X2xldmVsKGxvZ19sZXZlbHNbaV0ubGV2ZWwpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBsZXZlbCA9IHN0cnRvbChhcmcsICZ0YWlsLCAxMCk7Ci0gICAgaWYgKCp0YWlsKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGxvZ2xldmVsIFwiJXNcIi4gIgotICAgICAgICAgICAgICAgIlBvc3NpYmxlIGxldmVscyBhcmUgbnVtYmVycyBvcjpcbiIsIGFyZyk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhsb2dfbGV2ZWxzKTsgaSsrKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlwiJXNcIlxuIiwgbG9nX2xldmVsc1tpXS5uYW1lKTsKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIH0KLSAgICBhdl9sb2dfc2V0X2xldmVsKGxldmVsKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZXhwYW5kX2ZpbGVuYW1lX3RlbXBsYXRlKEFWQlByaW50ICpicCwgY29uc3QgY2hhciAqdGVtcGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRtICp0bSkKLXsKLSAgICBpbnQgYzsKLQotICAgIHdoaWxlICgoYyA9ICoodGVtcGxhdGUrKykpKSB7Ci0gICAgICAgIGlmIChjID09ICclJykgewotICAgICAgICAgICAgaWYgKCEoYyA9ICoodGVtcGxhdGUrKykpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGJwLCAiJXMiLCBwcm9ncmFtX25hbWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgICAgICAgICAgYXZfYnByaW50ZihicCwgIiUwNGQlMDJkJTAyZC0lMDJkJTAyZCUwMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uICsgMSwgdG0tPnRtX21kYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICclJzoKLSAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnAsIGMsIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGJwLCBjLCAxKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGludCBpbml0X3JlcG9ydChjb25zdCBjaGFyICplbnYpCi17Ci0gICAgY2hhciAqZmlsZW5hbWVfdGVtcGxhdGUgPSBOVUxMOwotICAgIGNoYXIgKmtleSwgKnZhbDsKLSAgICBpbnQgcmV0LCBjb3VudCA9IDA7Ci0gICAgdGltZV90IG5vdzsKLSAgICBzdHJ1Y3QgdG0gKnRtOwotICAgIEFWQlByaW50IGZpbGVuYW1lOwotCi0gICAgaWYgKHJlcG9ydF9maWxlKSAvKiBhbHJlYWR5IG9wZW5lZCAqLwotICAgICAgICByZXR1cm4gMDsKLSAgICB0aW1lKCZub3cpOwotICAgIHRtID0gbG9jYWx0aW1lKCZub3cpOwotCi0gICAgd2hpbGUgKGVudiAmJiAqZW52KSB7Ci0gICAgICAgIGlmICgocmV0ID0gYXZfb3B0X2dldF9rZXlfdmFsdWUoJmVudiwgIj0iLCAiOiIsIDAsICZrZXksICZ2YWwpKSA8IDApIHsKLSAgICAgICAgICAgIGlmIChjb3VudCkKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIEZGUkVQT1JUIGVudmlyb25tZW50IHZhcmlhYmxlOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqZW52KQotICAgICAgICAgICAgZW52Kys7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIGlmICghc3RyY21wKGtleSwgImZpbGUiKSkgewotICAgICAgICAgICAgYXZfZnJlZShmaWxlbmFtZV90ZW1wbGF0ZSk7Ci0gICAgICAgICAgICBmaWxlbmFtZV90ZW1wbGF0ZSA9IHZhbDsKLSAgICAgICAgICAgIHZhbCA9IE5VTEw7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJsZXZlbCIpKSB7Ci0gICAgICAgICAgICBjaGFyICp0YWlsOwotICAgICAgICAgICAgcmVwb3J0X2ZpbGVfbGV2ZWwgPSBzdHJ0b2wodmFsLCAmdGFpbCwgMTApOwotICAgICAgICAgICAgaWYgKCp0YWlsKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgcmVwb3J0IGZpbGUgbGV2ZWxcbiIpOwotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGtleSAnJXMnIGluIEZGUkVQT1JUXG4iLCBrZXkpOwotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyZWUodmFsKTsKLSAgICAgICAgYXZfZnJlZShrZXkpOwotICAgIH0KLQotICAgIGF2X2JwcmludF9pbml0KCZmaWxlbmFtZSwgMCwgMSk7Ci0gICAgZXhwYW5kX2ZpbGVuYW1lX3RlbXBsYXRlKCZmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfeF9pZl9udWxsKGZpbGVuYW1lX3RlbXBsYXRlLCAiJXAtJXQubG9nIiksIHRtKTsKLSAgICBhdl9mcmVlKGZpbGVuYW1lX3RlbXBsYXRlKTsKLSAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmZmlsZW5hbWUpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJPdXQgb2YgbWVtb3J5IGJ1aWxkaW5nIHJlcG9ydCBmaWxlIG5hbWVcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIHJlcG9ydF9maWxlID0gZm9wZW4oZmlsZW5hbWUuc3RyLCAidyIpOwotICAgIGlmICghcmVwb3J0X2ZpbGUpIHsKLSAgICAgICAgaW50IHJldCA9IEFWRVJST1IoZXJybm8pOwotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gcmVwb3J0IFwiJXNcIjogJXNcbiIsCi0gICAgICAgICAgICAgICBmaWxlbmFtZS5zdHIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGF2X2xvZ19zZXRfY2FsbGJhY2sobG9nX2NhbGxiYWNrX3JlcG9ydCk7Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAotICAgICAgICAgICAiJXMgc3RhcnRlZCBvbiAlMDRkLSUwMmQtJTAyZCBhdCAlMDJkOiUwMmQ6JTAyZFxuIgotICAgICAgICAgICAiUmVwb3J0IHdyaXR0ZW4gdG8gXCIlc1wiXG4iLAotICAgICAgICAgICBwcm9ncmFtX25hbWUsCi0gICAgICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiArIDEsIHRtLT50bV9tZGF5LAotICAgICAgICAgICB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYywKLSAgICAgICAgICAgZmlsZW5hbWUuc3RyKTsKLSAgICBhdl9icHJpbnRfZmluYWxpemUoJmZpbGVuYW1lLCBOVUxMKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG9wdF9yZXBvcnQoY29uc3QgY2hhciAqb3B0KQotewotICAgIHJldHVybiBpbml0X3JlcG9ydChOVUxMKTsKLX0KLQotaW50IG9wdF9tYXhfYWxsb2Modm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjaGFyICp0YWlsOwotICAgIHNpemVfdCBtYXg7Ci0KLSAgICBtYXggPSBzdHJ0b2woYXJnLCAmdGFpbCwgMTApOwotICAgIGlmICgqdGFpbCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBtYXhfYWxsb2MgXCIlc1wiLlxuIiwgYXJnKTsKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIH0KLSAgICBhdl9tYXhfYWxsb2MobWF4KTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG9wdF90aW1lbGltaXQodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSNpZiBIQVZFX1NFVFJMSU1JVAotICAgIGludCBsaW0gPSBwYXJzZV9udW1iZXJfb3JfZGllKG9wdCwgYXJnLCBPUFRfSU5UNjQsIDAsIElOVF9NQVgpOwotICAgIHN0cnVjdCBybGltaXQgcmwgPSB7IGxpbSwgbGltICsgMSB9OwotICAgIGlmIChzZXRybGltaXQoUkxJTUlUX0NQVSwgJnJsKSkKLSAgICAgICAgcGVycm9yKCJzZXRybGltaXQiKTsKLSNlbHNlCi0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiLSVzIG5vdCBpbXBsZW1lbnRlZCBvbiB0aGlzIE9TXG4iLCBvcHQpOwotI2VuZGlmCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgcHJpbnRfZXJyb3IoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBlcnIpCi17Ci0gICAgY2hhciBlcnJidWZbMTI4XTsKLSAgICBjb25zdCBjaGFyICplcnJidWZfcHRyID0gZXJyYnVmOwotCi0gICAgaWYgKGF2X3N0cmVycm9yKGVyciwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSkgPCAwKQotICAgICAgICBlcnJidWZfcHRyID0gc3RyZXJyb3IoQVZVTkVSUk9SKGVycikpOwotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlczogJXNcbiIsIGZpbGVuYW1lLCBlcnJidWZfcHRyKTsKLX0KLQotc3RhdGljIGludCB3YXJuZWRfY2ZnID0gMDsKLQotI2RlZmluZSBJTkRFTlQgICAgICAgIDEKLSNkZWZpbmUgU0hPV19WRVJTSU9OICAyCi0jZGVmaW5lIFNIT1dfQ09ORklHICAgNAotI2RlZmluZSBTSE9XX0NPUFlSSUdIVCA4Ci0KLSNkZWZpbmUgUFJJTlRfTElCX0lORk8obGlibmFtZSwgTElCTkFNRSwgZmxhZ3MsIGxldmVsKSAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoQ09ORklHXyMjTElCTkFNRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29uc3QgY2hhciAqaW5kZW50ID0gZmxhZ3MgJiBJTkRFTlQ/ICIgICIgOiAiIjsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGZsYWdzICYgU0hPV19WRVJTSU9OKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gbGlibmFtZSMjX3ZlcnNpb24oKTsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBsZXZlbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAiJXNsaWIlLTExcyAlMmQuJTNkLiUzZCAvICUyZC4lM2QuJTNkXG4iLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBpbmRlbnQsICNsaWJuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBMSUIjI0xJQk5BTUUjI19WRVJTSU9OX01BSk9SLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBMSUIjI0xJQk5BTUUjI19WRVJTSU9OX01JTk9SLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBMSUIjI0xJQk5BTUUjI19WRVJTSU9OX01JQ1JPLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBBVl9WRVJTSU9OX01BSk9SKHZlcnNpb24pLCBBVl9WRVJTSU9OX01JTk9SKHZlcnNpb24pLFwKLSAgICAgICAgICAgICAgICAgICBBVl9WRVJTSU9OX01JQ1JPKHZlcnNpb24pKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGZsYWdzICYgU0hPV19DT05GSUcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNmZyA9IGxpYm5hbWUjI19jb25maWd1cmF0aW9uKCk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmIChzdHJjbXAoRkZNUEVHX0NPTkZJR1VSQVRJT04sIGNmZykpIHsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBpZiAoIXdhcm5lZF9jZmcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIGxldmVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNXQVJOSU5HOiBsaWJyYXJ5IGNvbmZpZ3VyYXRpb24gbWlzbWF0Y2hcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgd2FybmVkX2NmZyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgbGV2ZWwsICIlcyUtMTFzIGNvbmZpZ3VyYXRpb246ICVzXG4iLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCwgI2xpYm5hbWUsIGNmZyk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotc3RhdGljIHZvaWQgcHJpbnRfYWxsX2xpYnNfaW5mbyhpbnQgZmxhZ3MsIGludCBsZXZlbCkKLXsKLSAgICBQUklOVF9MSUJfSU5GTyhhdnV0aWwsICAgICBBVlVUSUwsICAgICBmbGFncywgbGV2ZWwpOwotICAgIFBSSU5UX0xJQl9JTkZPKGF2Y29kZWMsICAgIEFWQ09ERUMsICAgIGZsYWdzLCBsZXZlbCk7Ci0gICAgUFJJTlRfTElCX0lORk8oYXZmb3JtYXQsICAgQVZGT1JNQVQsICAgZmxhZ3MsIGxldmVsKTsKLSAgICBQUklOVF9MSUJfSU5GTyhhdmRldmljZSwgICBBVkRFVklDRSwgICBmbGFncywgbGV2ZWwpOwotICAgIFBSSU5UX0xJQl9JTkZPKGF2ZmlsdGVyLCAgIEFWRklMVEVSLCAgIGZsYWdzLCBsZXZlbCk7Ci0gICAgUFJJTlRfTElCX0lORk8oYXZyZXNhbXBsZSwgQVZSRVNBTVBMRSwgZmxhZ3MsIGxldmVsKTsKLSAgICBQUklOVF9MSUJfSU5GTyhzd3NjYWxlLCAgICBTV1NDQUxFLCAgICBmbGFncywgbGV2ZWwpOwotICAgIFBSSU5UX0xJQl9JTkZPKHN3cmVzYW1wbGUsIFNXUkVTQU1QTEUsIGZsYWdzLCBsZXZlbCk7Ci0gICAgUFJJTlRfTElCX0lORk8ocG9zdHByb2MsICAgUE9TVFBST0MsICAgZmxhZ3MsIGxldmVsKTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfcHJvZ3JhbV9pbmZvKGludCBmbGFncywgaW50IGxldmVsKQotewotICAgIGNvbnN0IGNoYXIgKmluZGVudCA9IGZsYWdzICYgSU5ERU5UPyAiICAiIDogIiI7Ci0KLSAgICBhdl9sb2coTlVMTCwgbGV2ZWwsICIlcyB2ZXJzaW9uICIgRkZNUEVHX1ZFUlNJT04sIHByb2dyYW1fbmFtZSk7Ci0gICAgaWYgKGZsYWdzICYgU0hPV19DT1BZUklHSFQpCi0gICAgICAgIGF2X2xvZyhOVUxMLCBsZXZlbCwgIiBDb3B5cmlnaHQgKGMpICVkLSVkIHRoZSBGRm1wZWcgZGV2ZWxvcGVycyIsCi0gICAgICAgICAgICAgICBwcm9ncmFtX2JpcnRoX3llYXIsIENPTkZJR19USElTX1lFQVIpOwotICAgIGF2X2xvZyhOVUxMLCBsZXZlbCwgIlxuIik7Ci0gICAgYXZfbG9nKE5VTEwsIGxldmVsLCAiJXNidWlsdCB3aXRoICVzXG4iLCBpbmRlbnQsIENDX0lERU5UKTsKLQotICAgIGF2X2xvZyhOVUxMLCBsZXZlbCwgIiVzY29uZmlndXJhdGlvbjogIiBGRk1QRUdfQ09ORklHVVJBVElPTiAiXG4iLCBpbmRlbnQpOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9idWlsZGNvbmYoaW50IGZsYWdzLCBpbnQgbGV2ZWwpCi17Ci0gICAgY29uc3QgY2hhciAqaW5kZW50ID0gZmxhZ3MgJiBJTkRFTlQgPyAiICAiIDogIiI7Ci0gICAgY2hhciBzdHJbXSA9IHsgRkZNUEVHX0NPTkZJR1VSQVRJT04gfTsKLSAgICBjaGFyICpjb25mbGlzdCwgKnJlbW92ZV90aWxkZSwgKnNwbGl0Y29uZjsKLQotICAgIC8vIENoYW5nZSBhbGwgdGhlICcgLS0nIHN0cmluZ3MgdG8gJ34tLScgc28gdGhhdAotICAgIC8vIHRoZXkgY2FuIGJlIGlkZW50aWZpZWQgYXMgdG9rZW5zLgotICAgIHdoaWxlICgoY29uZmxpc3QgPSBzdHJzdHIoc3RyLCAiIC0tIikpICE9IE5VTEwpIHsKLSAgICAgICAgc3RybmNweShjb25mbGlzdCwgIn4tLSIsIDMpOwotICAgIH0KLQotICAgIC8vIENvbXBlbnNhdGUgZm9yIHRoZSB3ZWlyZG5lc3MgdGhpcyB3b3VsZCBjYXVzZQotICAgIC8vIHdoZW4gcGFzc2luZyAncGtnLWNvbmZpZyAtLXN0YXRpYycuCi0gICAgd2hpbGUgKChyZW1vdmVfdGlsZGUgPSBzdHJzdHIoc3RyLCAicGtnLWNvbmZpZ34iKSkgIT0gTlVMTCkgewotICAgICAgICBzdHJuY3B5KHJlbW92ZV90aWxkZSwgInBrZy1jb25maWcgIiwgMTEpOwotICAgIH0KLQotICAgIHNwbGl0Y29uZiA9IHN0cnRvayhzdHIsICJ+Iik7Ci0gICAgYXZfbG9nKE5VTEwsIGxldmVsLCAiXG4lc2NvbmZpZ3VyYXRpb246XG4iLCBpbmRlbnQpOwotICAgIHdoaWxlIChzcGxpdGNvbmYgIT0gTlVMTCkgewotICAgICAgICBhdl9sb2coTlVMTCwgbGV2ZWwsICIlcyVzJXNcbiIsIGluZGVudCwgaW5kZW50LCBzcGxpdGNvbmYpOwotICAgICAgICBzcGxpdGNvbmYgPSBzdHJ0b2soTlVMTCwgIn4iKTsKLSAgICB9Ci19Ci0KLXZvaWQgc2hvd19iYW5uZXIoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMpCi17Ci0gICAgaW50IGlkeCA9IGxvY2F0ZV9vcHRpb24oYXJnYywgYXJndiwgb3B0aW9ucywgInZlcnNpb24iKTsKLSAgICBpZiAoaGlkZV9iYW5uZXIgfHwgaWR4KQotICAgICAgICByZXR1cm47Ci0KLSAgICBwcmludF9wcm9ncmFtX2luZm8gKElOREVOVHxTSE9XX0NPUFlSSUdIVCwgQVZfTE9HX0lORk8pOwotICAgIHByaW50X2FsbF9saWJzX2luZm8oSU5ERU5UfFNIT1dfQ09ORklHLCAgQVZfTE9HX0lORk8pOwotICAgIHByaW50X2FsbF9saWJzX2luZm8oSU5ERU5UfFNIT1dfVkVSU0lPTiwgQVZfTE9HX0lORk8pOwotfQotCi1pbnQgc2hvd192ZXJzaW9uKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfaGVscCk7Ci0gICAgcHJpbnRfcHJvZ3JhbV9pbmZvIChTSE9XX0NPUFlSSUdIVCwgQVZfTE9HX0lORk8pOwotICAgIHByaW50X2FsbF9saWJzX2luZm8oU0hPV19WRVJTSU9OLCBBVl9MT0dfSU5GTyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHNob3dfYnVpbGRjb25mKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfaGVscCk7Ci0gICAgcHJpbnRfYnVpbGRjb25mICAgICAgKElOREVOVHwwLCBBVl9MT0dfSU5GTyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHNob3dfbGljZW5zZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotI2lmIENPTkZJR19OT05GUkVFCi0gICAgcHJpbnRmKAotICAgICJUaGlzIHZlcnNpb24gb2YgJXMgaGFzIG5vbmZyZWUgcGFydHMgY29tcGlsZWQgaW4uXG4iCi0gICAgIlRoZXJlZm9yZSBpdCBpcyBub3QgbGVnYWxseSByZWRpc3RyaWJ1dGFibGUuXG4iLAotICAgIHByb2dyYW1fbmFtZSApOwotI2VsaWYgQ09ORklHX0dQTFYzCi0gICAgcHJpbnRmKAotICAgICIlcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4iCi0gICAgIml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4iCi0gICAgInRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXG4iCi0gICAgIihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4iCi0gICAgIlxuIgotICAgICIlcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuIgotICAgICJidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuIgotICAgICJNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4iCi0gICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4iCi0gICAgIlxuIgotICAgICJZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIgotICAgICJhbG9uZyB3aXRoICVzLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuIiwKLSAgICBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV9uYW1lICk7Ci0jZWxpZiBDT05GSUdfR1BMCi0gICAgcHJpbnRmKAotICAgICIlcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4iCi0gICAgIml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XG4iCi0gICAgInRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yXG4iCi0gICAgIihhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG4iCi0gICAgIlxuIgotICAgICIlcyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuIgotICAgICJidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuIgotICAgICJNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG4iCi0gICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4iCi0gICAgIlxuIgotICAgICJZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIgotICAgICJhbG9uZyB3aXRoICVzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4iCi0gICAgIkZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0FcbiIsCi0gICAgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSApOwotI2VsaWYgQ09ORklHX0xHUExWMwotICAgIHByaW50ZigKLSAgICAiJXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxuIgotICAgICJpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiIKLSAgICAidGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiIKLSAgICAiKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiIKLSAgICAiXG4iCi0gICAgIiVzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4iCi0gICAgImJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4iCi0gICAgIk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiIKLSAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4iCi0gICAgIlxuIgotICAgICJZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiIKLSAgICAiYWxvbmcgd2l0aCAlcy4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi5cbiIsCi0gICAgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSApOwotI2Vsc2UKLSAgICBwcmludGYoCi0gICAgIiVzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vclxuIgotICAgICJtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4iCi0gICAgIkxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlclxuIgotICAgICJ2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiIKLSAgICAiXG4iCi0gICAgIiVzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4iCi0gICAgImJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4iCi0gICAgIk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VXG4iCi0gICAgIkxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuXG4iCi0gICAgIlxuIgotICAgICJZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljXG4iCi0gICAgIkxpY2Vuc2UgYWxvbmcgd2l0aCAlczsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZVxuIgotICAgICJGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBXG4iLAotICAgIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX25hbWUgKTsKLSNlbmRpZgotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfZGV2aWNlKGNvbnN0IEFWQ2xhc3MgKmF2Y2xhc3MpCi17Ci0gICAgaWYgKCFhdmNsYXNzKQotICAgICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gQVZfSVNfSU5QVVRfREVWSUNFKGF2Y2xhc3MtPmNhdGVnb3J5KSB8fCBBVl9JU19PVVRQVVRfREVWSUNFKGF2Y2xhc3MtPmNhdGVnb3J5KTsKLX0KLQotc3RhdGljIGludCBzaG93X2Zvcm1hdHNfZGV2aWNlcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnLCBpbnQgZGV2aWNlX29ubHkpCi17Ci0gICAgQVZJbnB1dEZvcm1hdCAqaWZtdCAgPSBOVUxMOwotICAgIEFWT3V0cHV0Rm9ybWF0ICpvZm10ID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpsYXN0X25hbWU7Ci0gICAgaW50IGlzX2RldjsKLQotICAgIHByaW50ZigiJXNcbiIKLSAgICAgICAgICAgIiBELiA9IERlbXV4aW5nIHN1cHBvcnRlZFxuIgotICAgICAgICAgICAiIC5FID0gTXV4aW5nIHN1cHBvcnRlZFxuIgotICAgICAgICAgICAiIC0tXG4iLCBkZXZpY2Vfb25seSA/ICJEZXZpY2VzOiIgOiAiRmlsZSBmb3JtYXRzOiIpOwotICAgIGxhc3RfbmFtZSA9ICIwMDAiOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgaW50IGRlY29kZSA9IDA7Ci0gICAgICAgIGludCBlbmNvZGUgPSAwOwotICAgICAgICBjb25zdCBjaGFyICpuYW1lICAgICAgPSBOVUxMOwotICAgICAgICBjb25zdCBjaGFyICpsb25nX25hbWUgPSBOVUxMOwotCi0gICAgICAgIHdoaWxlICgob2ZtdCA9IGF2X29mb3JtYXRfbmV4dChvZm10KSkpIHsKLSAgICAgICAgICAgIGlzX2RldiA9IGlzX2RldmljZShvZm10LT5wcml2X2NsYXNzKTsKLSAgICAgICAgICAgIGlmICghaXNfZGV2ICYmIGRldmljZV9vbmx5KQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKCghbmFtZSB8fCBzdHJjbXAob2ZtdC0+bmFtZSwgbmFtZSkgPCAwKSAmJgotICAgICAgICAgICAgICAgIHN0cmNtcChvZm10LT5uYW1lLCBsYXN0X25hbWUpID4gMCkgewotICAgICAgICAgICAgICAgIG5hbWUgICAgICA9IG9mbXQtPm5hbWU7Ci0gICAgICAgICAgICAgICAgbG9uZ19uYW1lID0gb2ZtdC0+bG9uZ19uYW1lOwotICAgICAgICAgICAgICAgIGVuY29kZSAgICA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChpZm10ID0gYXZfaWZvcm1hdF9uZXh0KGlmbXQpKSkgewotICAgICAgICAgICAgaXNfZGV2ID0gaXNfZGV2aWNlKGlmbXQtPnByaXZfY2xhc3MpOwotICAgICAgICAgICAgaWYgKCFpc19kZXYgJiYgZGV2aWNlX29ubHkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAoKCFuYW1lIHx8IHN0cmNtcChpZm10LT5uYW1lLCBuYW1lKSA8IDApICYmCi0gICAgICAgICAgICAgICAgc3RyY21wKGlmbXQtPm5hbWUsIGxhc3RfbmFtZSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbmFtZSAgICAgID0gaWZtdC0+bmFtZTsKLSAgICAgICAgICAgICAgICBsb25nX25hbWUgPSBpZm10LT5sb25nX25hbWU7Ci0gICAgICAgICAgICAgICAgZW5jb2RlICAgID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuYW1lICYmIHN0cmNtcChpZm10LT5uYW1lLCBuYW1lKSA9PSAwKQotICAgICAgICAgICAgICAgIGRlY29kZSA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFuYW1lKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGxhc3RfbmFtZSA9IG5hbWU7Ci0KLSAgICAgICAgcHJpbnRmKCIgJXMlcyAlLTE1cyAlc1xuIiwKLSAgICAgICAgICAgICAgIGRlY29kZSA/ICJEIiA6ICIgIiwKLSAgICAgICAgICAgICAgIGVuY29kZSA/ICJFIiA6ICIgIiwKLSAgICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICBsb25nX25hbWUgPyBsb25nX25hbWU6IiAiKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBzaG93X2Zvcm1hdHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICByZXR1cm4gc2hvd19mb3JtYXRzX2RldmljZXMob3B0Y3R4LCBvcHQsIGFyZywgMCk7Ci19Ci0KLWludCBzaG93X2RldmljZXModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICByZXR1cm4gc2hvd19mb3JtYXRzX2RldmljZXMob3B0Y3R4LCBvcHQsIGFyZywgMSk7Ci19Ci0KLSNkZWZpbmUgUFJJTlRfQ09ERUNfU1VQUE9SVEVEKGNvZGVjLCBmaWVsZCwgdHlwZSwgbGlzdF9uYW1lLCB0ZXJtLCBnZXRfbmFtZSkgXAotICAgIGlmIChjb2RlYy0+ZmllbGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbnN0IHR5cGUgKnAgPSBjb2RlYy0+ZmllbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcmludGYoIiAgICBTdXBwb3J0ZWQgIiBsaXN0X25hbWUgIjoiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHdoaWxlICgqcCAhPSB0ZXJtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGdldF9uYW1lKCpwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBwKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcmludGYoIlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotc3RhdGljIHZvaWQgcHJpbnRfY29kZWMoY29uc3QgQVZDb2RlYyAqYykKLXsKLSAgICBpbnQgZW5jb2RlciA9IGF2X2NvZGVjX2lzX2VuY29kZXIoYyk7Ci0KLSAgICBwcmludGYoIiVzICVzIFslc106XG4iLCBlbmNvZGVyID8gIkVuY29kZXIiIDogIkRlY29kZXIiLCBjLT5uYW1lLAotICAgICAgICAgICBjLT5sb25nX25hbWUgPyBjLT5sb25nX25hbWUgOiAiIik7Ci0KLSAgICBwcmludGYoIiAgICBHZW5lcmFsIGNhcGFiaWxpdGllczogIik7Ci0gICAgaWYgKGMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQpCi0gICAgICAgIHByaW50ZigiaG9yaXpiYW5kICIpOwotICAgIGlmIChjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfRFIxKQotICAgICAgICBwcmludGYoImRyMSAiKTsKLSAgICBpZiAoYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX1RSVU5DQVRFRCkKLSAgICAgICAgcHJpbnRmKCJ0cnVuYyAiKTsKLSAgICBpZiAoYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RFTEFZKQotICAgICAgICBwcmludGYoImRlbGF5ICIpOwotICAgIGlmIChjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSkKLSAgICAgICAgcHJpbnRmKCJzbWFsbCAiKTsKLSAgICBpZiAoYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX1NVQkZSQU1FUykKLSAgICAgICAgcHJpbnRmKCJzdWJmcmFtZXMgIik7Ci0gICAgaWYgKGMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9FWFBFUklNRU5UQUwpCi0gICAgICAgIHByaW50ZigiZXhwICIpOwotICAgIGlmIChjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfQ0hBTk5FTF9DT05GKQotICAgICAgICBwcmludGYoImNoY29uZiAiKTsKLSAgICBpZiAoYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX1BBUkFNX0NIQU5HRSkKLSAgICAgICAgcHJpbnRmKCJwYXJhbWNoYW5nZSAiKTsKLSAgICBpZiAoYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX1ZBUklBQkxFX0ZSQU1FX1NJWkUpCi0gICAgICAgIHByaW50ZigidmFyaWFibGUgIik7Ci0gICAgaWYgKGMtPmNhcGFiaWxpdGllcyAmIChBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfQVVUT19USFJFQURTKSkKLSAgICAgICAgcHJpbnRmKCJ0aHJlYWRzICIpOwotICAgIGlmICghYy0+Y2FwYWJpbGl0aWVzKQotICAgICAgICBwcmludGYoIm5vbmUiKTsKLSAgICBwcmludGYoIlxuIik7Ci0KLSAgICBpZiAoYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKLSAgICAgICAgYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgcHJpbnRmKCIgICAgVGhyZWFkaW5nIGNhcGFiaWxpdGllczogIik7Ci0gICAgICAgIHN3aXRjaCAoYy0+Y2FwYWJpbGl0aWVzICYgKEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfQVVUT19USFJFQURTKSkgewotICAgICAgICBjYXNlIEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTIHwKLSAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUzogcHJpbnRmKCJmcmFtZSBhbmQgc2xpY2UiKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFM6IHByaW50ZigiZnJhbWUiKTsgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTOiBwcmludGYoInNsaWNlIik7ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVl9DT0RFQ19DQVBfQVVUT19USFJFQURTIDogcHJpbnRmKCJhdXRvIik7ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50Zigibm9uZSIpOyAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICB9Ci0KLSAgICBpZiAoYy0+c3VwcG9ydGVkX2ZyYW1lcmF0ZXMpIHsKLSAgICAgICAgY29uc3QgQVZSYXRpb25hbCAqZnBzID0gYy0+c3VwcG9ydGVkX2ZyYW1lcmF0ZXM7Ci0KLSAgICAgICAgcHJpbnRmKCIgICAgU3VwcG9ydGVkIGZyYW1lcmF0ZXM6Iik7Ci0gICAgICAgIHdoaWxlIChmcHMtPm51bSkgewotICAgICAgICAgICAgcHJpbnRmKCIgJWQvJWQiLCBmcHMtPm51bSwgZnBzLT5kZW4pOwotICAgICAgICAgICAgZnBzKys7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0KLSAgICBQUklOVF9DT0RFQ19TVVBQT1JURUQoYywgcGl4X2ZtdHMsIGVudW0gQVZQaXhlbEZvcm1hdCwgInBpeGVsIGZvcm1hdHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUsIEdFVF9QSVhfRk1UX05BTUUpOwotICAgIFBSSU5UX0NPREVDX1NVUFBPUlRFRChjLCBzdXBwb3J0ZWRfc2FtcGxlcmF0ZXMsIGludCwgInNhbXBsZSByYXRlcyIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9TQU1QTEVfUkFURV9OQU1FKTsKLSAgICBQUklOVF9DT0RFQ19TVVBQT1JURUQoYywgc2FtcGxlX2ZtdHMsIGVudW0gQVZTYW1wbGVGb3JtYXQsICJzYW1wbGUgZm9ybWF0cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSwgR0VUX1NBTVBMRV9GTVRfTkFNRSk7Ci0gICAgUFJJTlRfQ09ERUNfU1VQUE9SVEVEKGMsIGNoYW5uZWxfbGF5b3V0cywgdWludDY0X3QsICJjaGFubmVsIGxheW91dHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBHRVRfQ0hfTEFZT1VUX0RFU0MpOwotCi0gICAgaWYgKGMtPnByaXZfY2xhc3MpIHsKLSAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKGMtPnByaXZfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSk7Ci0gICAgfQotfQotCi1zdGF0aWMgY2hhciBnZXRfbWVkaWFfdHlwZV9jaGFyKGVudW0gQVZNZWRpYVR5cGUgdHlwZSkKLXsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86ICAgIHJldHVybiAnVic7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOiAgICByZXR1cm4gJ0EnOwotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOiAgICAgcmV0dXJuICdEJzsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6IHJldHVybiAnUyc7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ6cmV0dXJuICdUJzsKLSAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiAnPyc7Ci0gICAgfQotfQotCi1zdGF0aWMgY29uc3QgQVZDb2RlYyAqbmV4dF9jb2RlY19mb3JfaWQoZW51bSBBVkNvZGVjSUQgaWQsIGNvbnN0IEFWQ29kZWMgKnByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuY29kZXIpCi17Ci0gICAgd2hpbGUgKChwcmV2ID0gYXZfY29kZWNfbmV4dChwcmV2KSkpIHsKLSAgICAgICAgaWYgKHByZXYtPmlkID09IGlkICYmCi0gICAgICAgICAgICAoZW5jb2RlciA/IGF2X2NvZGVjX2lzX2VuY29kZXIocHJldikgOiBhdl9jb2RlY19pc19kZWNvZGVyKHByZXYpKSkKLSAgICAgICAgICAgIHJldHVybiBwcmV2OwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBjb21wYXJlX2NvZGVjX2Rlc2MoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLSAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqIGNvbnN0ICpkYSA9IGE7Ci0gICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKiBjb25zdCAqZGIgPSBiOwotCi0gICAgcmV0dXJuICgqZGEpLT50eXBlICE9ICgqZGIpLT50eXBlID8gRkZESUZGU0lHTigoKmRhKS0+dHlwZSwgKCpkYiktPnR5cGUpIDoKLSAgICAgICAgICAgc3RyY21wKCgqZGEpLT5uYW1lLCAoKmRiKS0+bmFtZSk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBnZXRfY29kZWNzX3NvcnRlZChjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqKipyY29kZWNzKQotewotICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjID0gTlVMTDsKLSAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqKmNvZGVjczsKLSAgICB1bnNpZ25lZCBuYl9jb2RlY3MgPSAwLCBpID0gMDsKLQotICAgIHdoaWxlICgoZGVzYyA9IGF2Y29kZWNfZGVzY3JpcHRvcl9uZXh0KGRlc2MpKSkKLSAgICAgICAgbmJfY29kZWNzKys7Ci0gICAgaWYgKCEoY29kZWNzID0gYXZfY2FsbG9jKG5iX2NvZGVjcywgc2l6ZW9mKCpjb2RlY3MpKSkpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk91dCBvZiBtZW1vcnlcbiIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotICAgIGRlc2MgPSBOVUxMOwotICAgIHdoaWxlICgoZGVzYyA9IGF2Y29kZWNfZGVzY3JpcHRvcl9uZXh0KGRlc2MpKSkKLSAgICAgICAgY29kZWNzW2krK10gPSBkZXNjOwotICAgIGF2X2Fzc2VydDAoaSA9PSBuYl9jb2RlY3MpOwotICAgIHFzb3J0KGNvZGVjcywgbmJfY29kZWNzLCBzaXplb2YoKmNvZGVjcyksIGNvbXBhcmVfY29kZWNfZGVzYyk7Ci0gICAgKnJjb2RlY3MgPSBjb2RlY3M7Ci0gICAgcmV0dXJuIG5iX2NvZGVjczsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfY29kZWNzX2Zvcl9pZChlbnVtIEFWQ29kZWNJRCBpZCwgaW50IGVuY29kZXIpCi17Ci0gICAgY29uc3QgQVZDb2RlYyAqY29kZWMgPSBOVUxMOwotCi0gICAgcHJpbnRmKCIgKCVzOiAiLCBlbmNvZGVyID8gImVuY29kZXJzIiA6ICJkZWNvZGVycyIpOwotCi0gICAgd2hpbGUgKChjb2RlYyA9IG5leHRfY29kZWNfZm9yX2lkKGlkLCBjb2RlYywgZW5jb2RlcikpKQotICAgICAgICBwcmludGYoIiVzICIsIGNvZGVjLT5uYW1lKTsKLQotICAgIHByaW50ZigiKSIpOwotfQotCi1pbnQgc2hvd19jb2RlY3Modm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqKmNvZGVjczsKLSAgICB1bnNpZ25lZCBpLCBuYl9jb2RlY3MgPSBnZXRfY29kZWNzX3NvcnRlZCgmY29kZWNzKTsKLQotICAgIHByaW50ZigiQ29kZWNzOlxuIgotICAgICAgICAgICAiIEQuLi4uLiA9IERlY29kaW5nIHN1cHBvcnRlZFxuIgotICAgICAgICAgICAiIC5FLi4uLiA9IEVuY29kaW5nIHN1cHBvcnRlZFxuIgotICAgICAgICAgICAiIC4uVi4uLiA9IFZpZGVvIGNvZGVjXG4iCi0gICAgICAgICAgICIgLi5BLi4uID0gQXVkaW8gY29kZWNcbiIKLSAgICAgICAgICAgIiAuLlMuLi4gPSBTdWJ0aXRsZSBjb2RlY1xuIgotICAgICAgICAgICAiIC4uLkkuLiA9IEludHJhIGZyYW1lLW9ubHkgY29kZWNcbiIKLSAgICAgICAgICAgIiAuLi4uTC4gPSBMb3NzeSBjb21wcmVzc2lvblxuIgotICAgICAgICAgICAiIC4uLi4uUyA9IExvc3NsZXNzIGNvbXByZXNzaW9uXG4iCi0gICAgICAgICAgICIgLS0tLS0tLVxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5iX2NvZGVjczsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjID0gY29kZWNzW2ldOwotICAgICAgICBjb25zdCBBVkNvZGVjICpjb2RlYyA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKHN0cnN0cihkZXNjLT5uYW1lLCAiX2RlcHJlY2F0ZWQiKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHByaW50ZigiICIpOwotICAgICAgICBwcmludGYoYXZjb2RlY19maW5kX2RlY29kZXIoZGVzYy0+aWQpID8gIkQiIDogIi4iKTsKLSAgICAgICAgcHJpbnRmKGF2Y29kZWNfZmluZF9lbmNvZGVyKGRlc2MtPmlkKSA/ICJFIiA6ICIuIik7Ci0KLSAgICAgICAgcHJpbnRmKCIlYyIsIGdldF9tZWRpYV90eXBlX2NoYXIoZGVzYy0+dHlwZSkpOwotICAgICAgICBwcmludGYoKGRlc2MtPnByb3BzICYgQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZKSA/ICJJIiA6ICIuIik7Ci0gICAgICAgIHByaW50ZigoZGVzYy0+cHJvcHMgJiBBVl9DT0RFQ19QUk9QX0xPU1NZKSAgICAgID8gIkwiIDogIi4iKTsKLSAgICAgICAgcHJpbnRmKChkZXNjLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfTE9TU0xFU1MpICAgPyAiUyIgOiAiLiIpOwotCi0gICAgICAgIHByaW50ZigiICUtMjBzICVzIiwgZGVzYy0+bmFtZSwgZGVzYy0+bG9uZ19uYW1lID8gZGVzYy0+bG9uZ19uYW1lIDogIiIpOwotCi0gICAgICAgIC8qIHByaW50IGRlY29kZXJzL2VuY29kZXJzIHdoZW4gdGhlcmUncyBtb3JlIHRoYW4gb25lIG9yIHRoZWlyCi0gICAgICAgICAqIG5hbWVzIGFyZSBkaWZmZXJlbnQgZnJvbSBjb2RlYyBuYW1lICovCi0gICAgICAgIHdoaWxlICgoY29kZWMgPSBuZXh0X2NvZGVjX2Zvcl9pZChkZXNjLT5pZCwgY29kZWMsIDApKSkgewotICAgICAgICAgICAgaWYgKHN0cmNtcChjb2RlYy0+bmFtZSwgZGVzYy0+bmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwcmludF9jb2RlY3NfZm9yX2lkKGRlc2MtPmlkLCAwKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb2RlYyA9IE5VTEw7Ci0gICAgICAgIHdoaWxlICgoY29kZWMgPSBuZXh0X2NvZGVjX2Zvcl9pZChkZXNjLT5pZCwgY29kZWMsIDEpKSkgewotICAgICAgICAgICAgaWYgKHN0cmNtcChjb2RlYy0+bmFtZSwgZGVzYy0+bmFtZSkpIHsKLSAgICAgICAgICAgICAgICBwcmludF9jb2RlY3NfZm9yX2lkKGRlc2MtPmlkLCAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICB9Ci0gICAgYXZfZnJlZShjb2RlY3MpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9jb2RlY3MoaW50IGVuY29kZXIpCi17Ci0gICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKipjb2RlY3M7Ci0gICAgdW5zaWduZWQgaSwgbmJfY29kZWNzID0gZ2V0X2NvZGVjc19zb3J0ZWQoJmNvZGVjcyk7Ci0KLSAgICBwcmludGYoIiVzOlxuIgotICAgICAgICAgICAiIFYuLi4uLiA9IFZpZGVvXG4iCi0gICAgICAgICAgICIgQS4uLi4uID0gQXVkaW9cbiIKLSAgICAgICAgICAgIiBTLi4uLi4gPSBTdWJ0aXRsZVxuIgotICAgICAgICAgICAiIC5GLi4uLiA9IEZyYW1lLWxldmVsIG11bHRpdGhyZWFkaW5nXG4iCi0gICAgICAgICAgICIgLi5TLi4uID0gU2xpY2UtbGV2ZWwgbXVsdGl0aHJlYWRpbmdcbiIKLSAgICAgICAgICAgIiAuLi5YLi4gPSBDb2RlYyBpcyBleHBlcmltZW50YWxcbiIKLSAgICAgICAgICAgIiAuLi4uQi4gPSBTdXBwb3J0cyBkcmF3X2hvcml6X2JhbmRcbiIKLSAgICAgICAgICAgIiAuLi4uLkQgPSBTdXBwb3J0cyBkaXJlY3QgcmVuZGVyaW5nIG1ldGhvZCAxXG4iCi0gICAgICAgICAgICIgLS0tLS0tXG4iLAotICAgICAgICAgICBlbmNvZGVyID8gIkVuY29kZXJzIiA6ICJEZWNvZGVycyIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb2RlY3M7IGkrKykgewotICAgICAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqZGVzYyA9IGNvZGVjc1tpXTsKLSAgICAgICAgY29uc3QgQVZDb2RlYyAqY29kZWMgPSBOVUxMOwotCi0gICAgICAgIHdoaWxlICgoY29kZWMgPSBuZXh0X2NvZGVjX2Zvcl9pZChkZXNjLT5pZCwgY29kZWMsIGVuY29kZXIpKSkgewotICAgICAgICAgICAgcHJpbnRmKCIgJWMiLCBnZXRfbWVkaWFfdHlwZV9jaGFyKGRlc2MtPnR5cGUpKTsKLSAgICAgICAgICAgIHByaW50ZigoY29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTKSA/ICJGIiA6ICIuIik7Ci0gICAgICAgICAgICBwcmludGYoKGNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUykgPyAiUyIgOiAiLiIpOwotICAgICAgICAgICAgcHJpbnRmKChjb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCkgID8gIlgiIDogIi4iKTsKLSAgICAgICAgICAgIHByaW50ZigoY29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQpPyJCIiA6ICIuIik7Ci0gICAgICAgICAgICBwcmludGYoKGNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfRFIxKSAgICAgICAgICAgPyAiRCIgOiAiLiIpOwotCi0gICAgICAgICAgICBwcmludGYoIiAlLTIwcyAlcyIsIGNvZGVjLT5uYW1lLCBjb2RlYy0+bG9uZ19uYW1lID8gY29kZWMtPmxvbmdfbmFtZSA6ICIiKTsKLSAgICAgICAgICAgIGlmIChzdHJjbXAoY29kZWMtPm5hbWUsIGRlc2MtPm5hbWUpKQotICAgICAgICAgICAgICAgIHByaW50ZigiIChjb2RlYyAlcykiLCBkZXNjLT5uYW1lKTsKLQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGF2X2ZyZWUoY29kZWNzKTsKLX0KLQotaW50IHNob3dfZGVjb2RlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBwcmludF9jb2RlY3MoMCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBzaG93X2VuY29kZXJzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgcHJpbnRfY29kZWNzKDEpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgc2hvd19ic2ZzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgQVZCaXRTdHJlYW1GaWx0ZXIgKmJzZiA9IE5VTEw7Ci0KLSAgICBwcmludGYoIkJpdHN0cmVhbSBmaWx0ZXJzOlxuIik7Ci0gICAgd2hpbGUgKChic2YgPSBhdl9iaXRzdHJlYW1fZmlsdGVyX25leHQoYnNmKSkpCi0gICAgICAgIHByaW50ZigiJXNcbiIsIGJzZi0+bmFtZSk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgc2hvd19wcm90b2NvbHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICB2b2lkICpvcGFxdWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICBwcmludGYoIlN1cHBvcnRlZCBmaWxlIHByb3RvY29sczpcbiIKLSAgICAgICAgICAgIklucHV0OlxuIik7Ci0gICAgd2hpbGUgKChuYW1lID0gYXZpb19lbnVtX3Byb3RvY29scygmb3BhcXVlLCAwKSkpCi0gICAgICAgIHByaW50ZigiICAlc1xuIiwgbmFtZSk7Ci0gICAgcHJpbnRmKCJPdXRwdXQ6XG4iKTsKLSAgICB3aGlsZSAoKG5hbWUgPSBhdmlvX2VudW1fcHJvdG9jb2xzKCZvcGFxdWUsIDEpKSkKLSAgICAgICAgcHJpbnRmKCIgICVzXG4iLCBuYW1lKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHNob3dfZmlsdGVycyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotI2lmIENPTkZJR19BVkZJTFRFUgotICAgIGNvbnN0IEFWRmlsdGVyICpmaWx0ZXIgPSBOVUxMOwotICAgIGNoYXIgZGVzY3JbNjRdLCAqZGVzY3JfY3VyOwotICAgIGludCBpLCBqOwotICAgIGNvbnN0IEFWRmlsdGVyUGFkICpwYWQ7Ci0KLSAgICBwcmludGYoIkZpbHRlcnM6XG4iCi0gICAgICAgICAgICIgIFQuLiA9IFRpbWVsaW5lIHN1cHBvcnRcbiIKLSAgICAgICAgICAgIiAgLlMuID0gU2xpY2UgdGhyZWFkaW5nXG4iCi0gICAgICAgICAgICIgIC4uQyA9IENvbW1hbmQgc3VwcG9ydFxuIgotICAgICAgICAgICAiICBBID0gQXVkaW8gaW5wdXQvb3V0cHV0XG4iCi0gICAgICAgICAgICIgIFYgPSBWaWRlbyBpbnB1dC9vdXRwdXRcbiIKLSAgICAgICAgICAgIiAgTiA9IER5bmFtaWMgbnVtYmVyIGFuZC9vciB0eXBlIG9mIGlucHV0L291dHB1dFxuIgotICAgICAgICAgICAiICB8ID0gU291cmNlIG9yIHNpbmsgZmlsdGVyXG4iKTsKLSAgICB3aGlsZSAoKGZpbHRlciA9IGF2ZmlsdGVyX25leHQoZmlsdGVyKSkpIHsKLSAgICAgICAgZGVzY3JfY3VyID0gZGVzY3I7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICAgICAgKihkZXNjcl9jdXIrKykgPSAnLSc7Ci0gICAgICAgICAgICAgICAgKihkZXNjcl9jdXIrKykgPSAnPic7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYWQgPSBpID8gZmlsdGVyLT5vdXRwdXRzIDogZmlsdGVyLT5pbnB1dHM7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBwYWQgJiYgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKHBhZCwgaik7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChkZXNjcl9jdXIgPj0gZGVzY3IgKyBzaXplb2YoZGVzY3IpIC0gNCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgKihkZXNjcl9jdXIrKykgPSBnZXRfbWVkaWFfdHlwZV9jaGFyKGF2ZmlsdGVyX3BhZF9nZXRfdHlwZShwYWQsIGopKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaikKLSAgICAgICAgICAgICAgICAqKGRlc2NyX2N1cisrKSA9ICgoIWkgJiYgKGZpbHRlci0+ZmxhZ3MgJiBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGkgJiYgKGZpbHRlci0+ZmxhZ3MgJiBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUykpKSA/ICdOJyA6ICd8JzsKLSAgICAgICAgfQotICAgICAgICAqZGVzY3JfY3VyID0gMDsKLSAgICAgICAgcHJpbnRmKCIgJWMlYyVjICUtMTdzICUtMTBzICVzXG4iLAotICAgICAgICAgICAgICAgZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORSA/ICdUJyA6ICcuJywKLSAgICAgICAgICAgICAgIGZpbHRlci0+ZmxhZ3MgJiBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMgICAgPyAnUycgOiAnLicsCi0gICAgICAgICAgICAgICBmaWx0ZXItPnByb2Nlc3NfY29tbWFuZCAgICAgICAgICAgICAgICAgICAgICAgID8gJ0MnIDogJy4nLAotICAgICAgICAgICAgICAgZmlsdGVyLT5uYW1lLCBkZXNjciwgZmlsdGVyLT5kZXNjcmlwdGlvbik7Ci0gICAgfQotI2Vsc2UKLSAgICBwcmludGYoIk5vIGZpbHRlcnMgYXZhaWxhYmxlOiBsaWJhdmZpbHRlciBkaXNhYmxlZFxuIik7Ci0jZW5kaWYKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IHNob3dfY29sb3JzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBjb25zdCB1aW50OF90ICpyZ2I7Ci0gICAgaW50IGk7Ci0KLSAgICBwcmludGYoIiUtMzJzICNSUkdHQkJcbiIsICJuYW1lIik7Ci0KLSAgICBmb3IgKGkgPSAwOyBuYW1lID0gYXZfZ2V0X2tub3duX2NvbG9yX25hbWUoaSwgJnJnYik7IGkrKykKLSAgICAgICAgcHJpbnRmKCIlLTMycyAjJTAyeCUwMnglMDJ4XG4iLCBuYW1lLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgc2hvd19waXhfZm10cyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2MgPSBOVUxMOwotCi0gICAgcHJpbnRmKCJQaXhlbCBmb3JtYXRzOlxuIgotICAgICAgICAgICAiSS4uLi4gPSBTdXBwb3J0ZWQgSW5wdXQgIGZvcm1hdCBmb3IgY29udmVyc2lvblxuIgotICAgICAgICAgICAiLk8uLi4gPSBTdXBwb3J0ZWQgT3V0cHV0IGZvcm1hdCBmb3IgY29udmVyc2lvblxuIgotICAgICAgICAgICAiLi5ILi4gPSBIYXJkd2FyZSBhY2NlbGVyYXRlZCBmb3JtYXRcbiIKLSAgICAgICAgICAgIi4uLlAuID0gUGFsZXR0ZWQgZm9ybWF0XG4iCi0gICAgICAgICAgICIuLi4uQiA9IEJpdHN0cmVhbSBmb3JtYXRcbiIKLSAgICAgICAgICAgIkZMQUdTIE5BTUUgICAgICAgICAgICBOQl9DT01QT05FTlRTIEJJVFNfUEVSX1BJWEVMXG4iCi0gICAgICAgICAgICItLS0tLVxuIik7Ci0KLSNpZiAhQ09ORklHX1NXU0NBTEUKLSMgICBkZWZpbmUgc3dzX2lzU3VwcG9ydGVkSW5wdXQoeCkgIDAKLSMgICBkZWZpbmUgc3dzX2lzU3VwcG9ydGVkT3V0cHV0KHgpIDAKLSNlbmRpZgotCi0gICAgd2hpbGUgKChwaXhfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19uZXh0KHBpeF9kZXNjKSkpIHsKLSAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0X2lkKHBpeF9kZXNjKTsKLSAgICAgICAgcHJpbnRmKCIlYyVjJWMlYyVjICUtMTZzICAgICAgICVkICAgICAgICAgICAgJTJkXG4iLAotICAgICAgICAgICAgICAgc3dzX2lzU3VwcG9ydGVkSW5wdXQgKHBpeF9mbXQpICAgICAgICAgICAgICA/ICdJJyA6ICcuJywKLSAgICAgICAgICAgICAgIHN3c19pc1N1cHBvcnRlZE91dHB1dChwaXhfZm10KSAgICAgICAgICAgICAgPyAnTycgOiAnLicsCi0gICAgICAgICAgICAgICBwaXhfZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCAgID8gJ0gnIDogJy4nLAotICAgICAgICAgICAgICAgcGl4X2Rlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCAgICAgICA/ICdQJyA6ICcuJywKLSAgICAgICAgICAgICAgIHBpeF9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0gPyAnQicgOiAnLicsCi0gICAgICAgICAgICAgICBwaXhfZGVzYy0+bmFtZSwKLSAgICAgICAgICAgICAgIHBpeF9kZXNjLT5uYl9jb21wb25lbnRzLAotICAgICAgICAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKHBpeF9kZXNjKSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgc2hvd19sYXlvdXRzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgaW50IGkgPSAwOwotICAgIHVpbnQ2NF90IGxheW91dCwgajsKLSAgICBjb25zdCBjaGFyICpuYW1lLCAqZGVzY3I7Ci0KLSAgICBwcmludGYoIkluZGl2aWR1YWwgY2hhbm5lbHM6XG4iCi0gICAgICAgICAgICJOQU1FICAgICAgICAgICBERVNDUklQVElPTlxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IDYzOyBpKyspIHsKLSAgICAgICAgbmFtZSA9IGF2X2dldF9jaGFubmVsX25hbWUoKHVpbnQ2NF90KTEgPDwgaSk7Ci0gICAgICAgIGlmICghbmFtZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBkZXNjciA9IGF2X2dldF9jaGFubmVsX2Rlc2NyaXB0aW9uKCh1aW50NjRfdCkxIDw8IGkpOwotICAgICAgICBwcmludGYoIiUtMTRzICVzXG4iLCBuYW1lLCBkZXNjcik7Ci0gICAgfQotICAgIHByaW50ZigiXG5TdGFuZGFyZCBjaGFubmVsIGxheW91dHM6XG4iCi0gICAgICAgICAgICJOQU1FICAgICAgICAgICBERUNPTVBPU0lUSU9OXG4iKTsKLSAgICBmb3IgKGkgPSAwOyAhYXZfZ2V0X3N0YW5kYXJkX2NoYW5uZWxfbGF5b3V0KGksICZsYXlvdXQsICZuYW1lKTsgaSsrKSB7Ci0gICAgICAgIGlmIChuYW1lKSB7Ci0gICAgICAgICAgICBwcmludGYoIiUtMTRzICIsIG5hbWUpOwotICAgICAgICAgICAgZm9yIChqID0gMTsgajsgaiA8PD0gMSkKLSAgICAgICAgICAgICAgICBpZiAoKGxheW91dCAmIGopKQotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzJXMiLCAobGF5b3V0ICYgKGogLSAxKSkgPyAiKyIgOiAiIiwgYXZfZ2V0X2NoYW5uZWxfbmFtZShqKSk7Ci0gICAgICAgICAgICBwcmludGYoIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBzaG93X3NhbXBsZV9mbXRzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgaW50IGk7Ci0gICAgY2hhciBmbXRfc3RyWzEyOF07Ci0gICAgZm9yIChpID0gLTE7IGkgPCBBVl9TQU1QTEVfRk1UX05COyBpKyspCi0gICAgICAgIHByaW50ZigiJXNcbiIsIGF2X2dldF9zYW1wbGVfZm10X3N0cmluZyhmbXRfc3RyLCBzaXplb2YoZm10X3N0ciksIGkpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2hvd19oZWxwX2NvZGVjKGNvbnN0IGNoYXIgKm5hbWUsIGludCBlbmNvZGVyKQotewotICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjOwotICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjOwotCi0gICAgaWYgKCFuYW1lKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJObyBjb2RlYyBuYW1lIHNwZWNpZmllZC5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY29kZWMgPSBlbmNvZGVyID8gYXZjb2RlY19maW5kX2VuY29kZXJfYnlfbmFtZShuYW1lKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19maW5kX2RlY29kZXJfYnlfbmFtZShuYW1lKTsKLQotICAgIGlmIChjb2RlYykKLSAgICAgICAgcHJpbnRfY29kZWMoY29kZWMpOwotICAgIGVsc2UgaWYgKChkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldF9ieV9uYW1lKG5hbWUpKSkgewotICAgICAgICBpbnQgcHJpbnRlZCA9IDA7Ci0KLSAgICAgICAgd2hpbGUgKChjb2RlYyA9IG5leHRfY29kZWNfZm9yX2lkKGRlc2MtPmlkLCBjb2RlYywgZW5jb2RlcikpKSB7Ci0gICAgICAgICAgICBwcmludGVkID0gMTsKLSAgICAgICAgICAgIHByaW50X2NvZGVjKGNvZGVjKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcHJpbnRlZCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvZGVjICclcycgaXMga25vd24gdG8gRkZtcGVnLCAiCi0gICAgICAgICAgICAgICAgICAgImJ1dCBubyAlcyBmb3IgaXQgYXJlIGF2YWlsYWJsZS4gRkZtcGVnIG1pZ2h0IG5lZWQgdG8gYmUgIgotICAgICAgICAgICAgICAgICAgICJyZWNvbXBpbGVkIHdpdGggYWRkaXRpb25hbCBleHRlcm5hbCBsaWJyYXJpZXMuXG4iLAotICAgICAgICAgICAgICAgICAgIG5hbWUsIGVuY29kZXIgPyAiZW5jb2RlcnMiIDogImRlY29kZXJzIik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ29kZWMgJyVzJyBpcyBub3QgcmVjb2duaXplZCBieSBGRm1wZWcuXG4iLAotICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBzaG93X2hlbHBfZGVtdXhlcihjb25zdCBjaGFyICpuYW1lKQotewotICAgIGNvbnN0IEFWSW5wdXRGb3JtYXQgKmZtdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KG5hbWUpOwotCi0gICAgaWYgKCFmbXQpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gZm9ybWF0ICclcycuXG4iLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaW50ZigiRGVtdXhlciAlcyBbJXNdOlxuIiwgZm10LT5uYW1lLCBmbXQtPmxvbmdfbmFtZSk7Ci0KLSAgICBpZiAoZm10LT5leHRlbnNpb25zKQotICAgICAgICBwcmludGYoIiAgICBDb21tb24gZXh0ZW5zaW9uczogJXMuXG4iLCBmbXQtPmV4dGVuc2lvbnMpOwotCi0gICAgaWYgKGZtdC0+cHJpdl9jbGFzcykKLSAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKGZtdC0+cHJpdl9jbGFzcywgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0pOwotfQotCi1zdGF0aWMgdm9pZCBzaG93X2hlbHBfbXV4ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqZGVzYzsKLSAgICBjb25zdCBBVk91dHB1dEZvcm1hdCAqZm10ID0gYXZfZ3Vlc3NfZm9ybWF0KG5hbWUsIE5VTEwsIE5VTEwpOwotCi0gICAgaWYgKCFmbXQpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gZm9ybWF0ICclcycuXG4iLCBuYW1lKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaW50ZigiTXV4ZXIgJXMgWyVzXTpcbiIsIGZtdC0+bmFtZSwgZm10LT5sb25nX25hbWUpOwotCi0gICAgaWYgKGZtdC0+ZXh0ZW5zaW9ucykKLSAgICAgICAgcHJpbnRmKCIgICAgQ29tbW9uIGV4dGVuc2lvbnM6ICVzLlxuIiwgZm10LT5leHRlbnNpb25zKTsKLSAgICBpZiAoZm10LT5taW1lX3R5cGUpCi0gICAgICAgIHByaW50ZigiICAgIE1pbWUgdHlwZTogJXMuXG4iLCBmbXQtPm1pbWVfdHlwZSk7Ci0gICAgaWYgKGZtdC0+dmlkZW9fY29kZWMgIT0gQVZfQ09ERUNfSURfTk9ORSAmJgotICAgICAgICAoZGVzYyA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoZm10LT52aWRlb19jb2RlYykpKSB7Ci0gICAgICAgIHByaW50ZigiICAgIERlZmF1bHQgdmlkZW8gY29kZWM6ICVzLlxuIiwgZGVzYy0+bmFtZSk7Ci0gICAgfQotICAgIGlmIChmbXQtPmF1ZGlvX2NvZGVjICE9IEFWX0NPREVDX0lEX05PTkUgJiYKLSAgICAgICAgKGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGZtdC0+YXVkaW9fY29kZWMpKSkgewotICAgICAgICBwcmludGYoIiAgICBEZWZhdWx0IGF1ZGlvIGNvZGVjOiAlcy5cbiIsIGRlc2MtPm5hbWUpOwotICAgIH0KLSAgICBpZiAoZm10LT5zdWJ0aXRsZV9jb2RlYyAhPSBBVl9DT0RFQ19JRF9OT05FICYmCi0gICAgICAgIChkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChmbXQtPnN1YnRpdGxlX2NvZGVjKSkpIHsKLSAgICAgICAgcHJpbnRmKCIgICAgRGVmYXVsdCBzdWJ0aXRsZSBjb2RlYzogJXMuXG4iLCBkZXNjLT5uYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoZm10LT5wcml2X2NsYXNzKQotICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oZm10LT5wcml2X2NsYXNzLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSk7Ci19Ci0KLSNpZiBDT05GSUdfQVZGSUxURVIKLXN0YXRpYyB2b2lkIHNob3dfaGVscF9maWx0ZXIoY29uc3QgY2hhciAqbmFtZSkKLXsKLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICBjb25zdCBBVkZpbHRlciAqZiA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKG5hbWUpOwotICAgIGludCBpLCBjb3VudDsKLQotICAgIGlmICghbmFtZSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTm8gZmlsdGVyIG5hbWUgc3BlY2lmaWVkLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKCFmKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGZpbHRlciAnJXMnLlxuIiwgbmFtZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwcmludGYoIkZpbHRlciAlc1xuIiwgZi0+bmFtZSk7Ci0gICAgaWYgKGYtPmRlc2NyaXB0aW9uKQotICAgICAgICBwcmludGYoIiAgJXNcbiIsIGYtPmRlc2NyaXB0aW9uKTsKLQotICAgIGlmIChmLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUykKLSAgICAgICAgcHJpbnRmKCIgICAgc2xpY2UgdGhyZWFkaW5nIHN1cHBvcnRlZFxuIik7Ci0KLSAgICBwcmludGYoIiAgICBJbnB1dHM6XG4iKTsKLSAgICBjb3VudCA9IGF2ZmlsdGVyX3BhZF9jb3VudChmLT5pbnB1dHMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIHByaW50ZigiICAgICAgICMlZDogJXMgKCVzKVxuIiwgaSwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKGYtPmlucHV0cywgaSksCi0gICAgICAgICAgICAgICBtZWRpYV90eXBlX3N0cmluZyhhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoZi0+aW5wdXRzLCBpKSkpOwotICAgIH0KLSAgICBpZiAoZi0+ZmxhZ3MgJiBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTKQotICAgICAgICBwcmludGYoIiAgICAgICAgZHluYW1pYyAoZGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zKVxuIik7Ci0gICAgZWxzZSBpZiAoIWNvdW50KQotICAgICAgICBwcmludGYoIiAgICAgICAgbm9uZSAoc291cmNlIGZpbHRlcilcbiIpOwotCi0gICAgcHJpbnRmKCIgICAgT3V0cHV0czpcbiIpOwotICAgIGNvdW50ID0gYXZmaWx0ZXJfcGFkX2NvdW50KGYtPm91dHB1dHMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIHByaW50ZigiICAgICAgICMlZDogJXMgKCVzKVxuIiwgaSwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKGYtPm91dHB1dHMsIGkpLAotICAgICAgICAgICAgICAgbWVkaWFfdHlwZV9zdHJpbmcoYXZmaWx0ZXJfcGFkX2dldF90eXBlKGYtPm91dHB1dHMsIGkpKSk7Ci0gICAgfQotICAgIGlmIChmLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19PVVRQVVRTKQotICAgICAgICBwcmludGYoIiAgICAgICAgZHluYW1pYyAoZGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zKVxuIik7Ci0gICAgZWxzZSBpZiAoIWNvdW50KQotICAgICAgICBwcmludGYoIiAgICAgICAgbm9uZSAoc2luayBmaWx0ZXIpXG4iKTsKLQotICAgIGlmIChmLT5wcml2X2NsYXNzKQotICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oZi0+cHJpdl9jbGFzcywgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0pOwotICAgIGlmIChmLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORSkKLSAgICAgICAgcHJpbnRmKCJUaGlzIGZpbHRlciBoYXMgc3VwcG9ydCBmb3IgdGltZWxpbmUgdGhyb3VnaCB0aGUgJ2VuYWJsZScgb3B0aW9uLlxuIik7Ci0jZWxzZQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJCdWlsZCB3aXRob3V0IGxpYmF2ZmlsdGVyOyAiCi0gICAgICAgICAgICJjYW4gbm90IHRvIHNhdGlzZnkgcmVxdWVzdFxuIik7Ci0jZW5kaWYKLX0KLSNlbmRpZgotCi1pbnQgc2hvd19oZWxwKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY2hhciAqdG9waWMsICpwYXI7Ci0gICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfaGVscCk7Ci0KLSAgICB0b3BpYyA9IGF2X3N0cmR1cChhcmcgPyBhcmcgOiAiIik7Ci0gICAgaWYgKCF0b3BpYykKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBwYXIgPSBzdHJjaHIodG9waWMsICc9Jyk7Ci0gICAgaWYgKHBhcikKLSAgICAgICAgKnBhcisrID0gMDsKLQotICAgIGlmICghKnRvcGljKSB7Ci0gICAgICAgIHNob3dfaGVscF9kZWZhdWx0KHRvcGljLCBwYXIpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh0b3BpYywgImRlY29kZXIiKSkgewotICAgICAgICBzaG93X2hlbHBfY29kZWMocGFyLCAwKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG9waWMsICJlbmNvZGVyIikpIHsKLSAgICAgICAgc2hvd19oZWxwX2NvZGVjKHBhciwgMSk7Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKHRvcGljLCAiZGVtdXhlciIpKSB7Ci0gICAgICAgIHNob3dfaGVscF9kZW11eGVyKHBhcik7Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKHRvcGljLCAibXV4ZXIiKSkgewotICAgICAgICBzaG93X2hlbHBfbXV4ZXIocGFyKTsKLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG9waWMsICJmaWx0ZXIiKSkgewotICAgICAgICBzaG93X2hlbHBfZmlsdGVyKHBhcik7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgICBzaG93X2hlbHBfZGVmYXVsdCh0b3BpYywgcGFyKTsKLSAgICB9Ci0KLSAgICBhdl9mcmVlcCgmdG9waWMpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgcmVhZF95ZXNubyh2b2lkKQotewotICAgIGludCBjID0gZ2V0Y2hhcigpOwotICAgIGludCB5ZXNubyA9IChhdl90b3VwcGVyKGMpID09ICdZJyk7Ci0KLSAgICB3aGlsZSAoYyAhPSAnXG4nICYmIGMgIT0gRU9GKQotICAgICAgICBjID0gZ2V0Y2hhcigpOwotCi0gICAgcmV0dXJuIHllc25vOwotfQotCi1GSUxFICpnZXRfcHJlc2V0X2ZpbGUoY2hhciAqZmlsZW5hbWUsIHNpemVfdCBmaWxlbmFtZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByZXNldF9uYW1lLCBpbnQgaXNfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb2RlY19uYW1lKQotewotICAgIEZJTEUgKmYgPSBOVUxMOwotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKmJhc2VbM10gPSB7IGdldGVudigiRkZNUEVHX0RBVEFESVIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRlbnYoIkhPTUUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1QRUdfREFUQURJUiwgfTsKLQotICAgIGlmIChpc19wYXRoKSB7Ci0gICAgICAgIGF2X3N0cmxjcHkoZmlsZW5hbWUsIHByZXNldF9uYW1lLCBmaWxlbmFtZV9zaXplKTsKLSAgICAgICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotICAgIH0gZWxzZSB7Ci0jaWZkZWYgX1dJTjMyCi0gICAgICAgIGNoYXIgZGF0YWRpcltNQVhfUEFUSF0sICpsczsKLSAgICAgICAgYmFzZVsyXSA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKEdldE1vZHVsZUZpbGVOYW1lQShHZXRNb2R1bGVIYW5kbGVBKE5VTEwpLCBkYXRhZGlyLCBzaXplb2YoZGF0YWRpcikgLSAxKSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChscyA9IGRhdGFkaXI7IGxzIDwgZGF0YWRpciArIHN0cmxlbihkYXRhZGlyKTsgbHMrKykKLSAgICAgICAgICAgICAgICBpZiAoKmxzID09ICdcXCcpICpscyA9ICcvJzsKLQotICAgICAgICAgICAgaWYgKGxzID0gc3RycmNocihkYXRhZGlyLCAnLycpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpscyA9IDA7Ci0gICAgICAgICAgICAgICAgc3RybmNhdChkYXRhZGlyLCAiL2ZmcHJlc2V0cyIsICBzaXplb2YoZGF0YWRpcikgLSAxIC0gc3RybGVuKGRhdGFkaXIpKTsKLSAgICAgICAgICAgICAgICBiYXNlWzJdID0gZGF0YWRpcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmICFmOyBpKyspIHsKLSAgICAgICAgICAgIGlmICghYmFzZVtpXSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBmaWxlbmFtZV9zaXplLCAiJXMlcy8lcy5mZnByZXNldCIsIGJhc2VbaV0sCi0gICAgICAgICAgICAgICAgICAgICBpICE9IDEgPyAiIiA6ICIvLmZmbXBlZyIsIHByZXNldF9uYW1lKTsKLSAgICAgICAgICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLSAgICAgICAgICAgIGlmICghZiAmJiBjb2RlY19uYW1lKSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoZmlsZW5hbWUsIGZpbGVuYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiVzJXMvJXMtJXMuZmZwcmVzZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VbaV0sIGkgIT0gMSA/ICIiIDogIi8uZmZtcGVnIiwgY29kZWNfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGY7Ci19Ci0KLWludCBjaGVja19zdHJlYW1fc3BlY2lmaWVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBjb25zdCBjaGFyICpzcGVjKQotewotICAgIGludCByZXQgPSBhdmZvcm1hdF9tYXRjaF9zdHJlYW1fc3BlY2lmaWVyKHMsIHN0LCBzcGVjKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc3RyZWFtIHNwZWNpZmllcjogJXMuXG4iLCBzcGVjKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1BVkRpY3Rpb25hcnkgKmZpbHRlcl9jb2RlY19vcHRzKEFWRGljdGlvbmFyeSAqb3B0cywgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBBVkNvZGVjICpjb2RlYykKLXsKLSAgICBBVkRpY3Rpb25hcnkgICAgKnJldCA9IE5VTEw7Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOwotICAgIGludCAgICAgICAgICAgIGZsYWdzID0gcy0+b2Zvcm1hdCA/IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU07Ci0gICAgY2hhciAgICAgICAgICBwcmVmaXggPSAwOwotICAgIGNvbnN0IEFWQ2xhc3MgICAgKmNjID0gYXZjb2RlY19nZXRfY2xhc3MoKTsKLQotICAgIGlmICghY29kZWMpCi0gICAgICAgIGNvZGVjICAgICAgICAgICAgPSBzLT5vZm9ybWF0ID8gYXZjb2RlY19maW5kX2VuY29kZXIoY29kZWNfaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXZjb2RlY19maW5kX2RlY29kZXIoY29kZWNfaWQpOwotCi0gICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgcHJlZml4ICA9ICd2JzsKLSAgICAgICAgZmxhZ3MgIHw9IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgICAgcHJlZml4ICA9ICdhJzsKLSAgICAgICAgZmxhZ3MgIHw9IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKLSAgICAgICAgcHJlZml4ICA9ICdzJzsKLSAgICAgICAgZmxhZ3MgIHw9IEFWX09QVF9GTEFHX1NVQlRJVExFX1BBUkFNOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB3aGlsZSAodCA9IGF2X2RpY3RfZ2V0KG9wdHMsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSB7Ci0gICAgICAgIGNoYXIgKnAgPSBzdHJjaHIodC0+a2V5LCAnOicpOwotCi0gICAgICAgIC8qIGNoZWNrIHN0cmVhbSBzcGVjaWZpY2F0aW9uIGluIG9wdCBuYW1lICovCi0gICAgICAgIGlmIChwKQotICAgICAgICAgICAgc3dpdGNoIChjaGVja19zdHJlYW1fc3BlY2lmaWVyKHMsIHN0LCBwICsgMSkpIHsKLSAgICAgICAgICAgIGNhc2UgIDE6ICpwID0gMDsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICAwOiAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF2X29wdF9maW5kKCZjYywgdC0+a2V5LCBOVUxMLCBmbGFncywgQVZfT1BUX1NFQVJDSF9GQUtFX09CSikgfHwKLSAgICAgICAgICAgICFjb2RlYyB8fAotICAgICAgICAgICAgKGNvZGVjLT5wcml2X2NsYXNzICYmCi0gICAgICAgICAgICAgYXZfb3B0X2ZpbmQoJmNvZGVjLT5wcml2X2NsYXNzLCB0LT5rZXksIE5VTEwsIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSkKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZyZXQsIHQtPmtleSwgdC0+dmFsdWUsIDApOwotICAgICAgICBlbHNlIGlmICh0LT5rZXlbMF0gPT0gcHJlZml4ICYmCi0gICAgICAgICAgICAgICAgIGF2X29wdF9maW5kKCZjYywgdC0+a2V5ICsgMSwgTlVMTCwgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKQotICAgICAgICAgICAgYXZfZGljdF9zZXQoJnJldCwgdC0+a2V5ICsgMSwgdC0+dmFsdWUsIDApOwotCi0gICAgICAgIGlmIChwKQotICAgICAgICAgICAgKnAgPSAnOic7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLUFWRGljdGlvbmFyeSAqKnNldHVwX2ZpbmRfc3RyZWFtX2luZm9fb3B0cyhBVkZvcm1hdENvbnRleHQgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpjb2RlY19vcHRzKQotewotICAgIGludCBpOwotICAgIEFWRGljdGlvbmFyeSAqKm9wdHM7Ci0KLSAgICBpZiAoIXMtPm5iX3N0cmVhbXMpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIG9wdHMgPSBhdl9tYWxsb2N6X2FycmF5KHMtPm5iX3N0cmVhbXMsIHNpemVvZigqb3B0cykpOwotICAgIGlmICghb3B0cykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvYyBtZW1vcnkgZm9yIHN0cmVhbSBvcHRpb25zLlxuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQotICAgICAgICBvcHRzW2ldID0gZmlsdGVyX2NvZGVjX29wdHMoY29kZWNfb3B0cywgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcywgcy0+c3RyZWFtc1tpXSwgTlVMTCk7Ci0gICAgcmV0dXJuIG9wdHM7Ci19Ci0KLXZvaWQgKmdyb3dfYXJyYXkodm9pZCAqYXJyYXksIGludCBlbGVtX3NpemUsIGludCAqc2l6ZSwgaW50IG5ld19zaXplKQotewotICAgIGlmIChuZXdfc2l6ZSA+PSBJTlRfTUFYIC8gZWxlbV9zaXplKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJBcnJheSB0b28gYmlnLlxuIik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0gICAgaWYgKCpzaXplIDwgbmV3X3NpemUpIHsKLSAgICAgICAgdWludDhfdCAqdG1wID0gYXZfcmVhbGxvY19hcnJheShhcnJheSwgbmV3X3NpemUsIGVsZW1fc2l6ZSk7Ci0gICAgICAgIGlmICghdG1wKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jIGJ1ZmZlci5cbiIpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgICAgIG1lbXNldCh0bXAgKyAqc2l6ZSplbGVtX3NpemUsIDAsIChuZXdfc2l6ZS0qc2l6ZSkgKiBlbGVtX3NpemUpOwotICAgICAgICAqc2l6ZSA9IG5ld19zaXplOwotICAgICAgICByZXR1cm4gdG1wOwotICAgIH0KLSAgICByZXR1cm4gYXJyYXk7Ci19Ci0KLWRvdWJsZSBnZXRfcm90YXRpb24oQVZTdHJlYW0gKnN0KQotewotICAgIEFWRGljdGlvbmFyeUVudHJ5ICpyb3RhdGVfdGFnID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAicm90YXRlIiwgTlVMTCwgMCk7Ci0gICAgdWludDhfdCogZGlzcGxheW1hdHJpeCA9IGF2X3N0cmVhbV9nZXRfc2lkZV9kYXRhKHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9ESVNQTEFZTUFUUklYLCBOVUxMKTsKLSAgICBkb3VibGUgdGhldGEgPSAwOwotCi0gICAgaWYgKHJvdGF0ZV90YWcgJiYgKnJvdGF0ZV90YWctPnZhbHVlICYmIHN0cmNtcChyb3RhdGVfdGFnLT52YWx1ZSwgIjAiKSkgewotICAgICAgICBjaGFyICp0YWlsOwotICAgICAgICB0aGV0YSA9IGF2X3N0cnRvZChyb3RhdGVfdGFnLT52YWx1ZSwgJnRhaWwpOwotICAgICAgICBpZiAoKnRhaWwpCi0gICAgICAgICAgICB0aGV0YSA9IDA7Ci0gICAgfQotICAgIGlmIChkaXNwbGF5bWF0cml4ICYmICF0aGV0YSkKLSAgICAgICAgdGhldGEgPSAtYXZfZGlzcGxheV9yb3RhdGlvbl9nZXQoKGludDMyX3QqKSBkaXNwbGF5bWF0cml4KTsKLQotICAgIHRoZXRhIC09IDM2MCpmbG9vcih0aGV0YS8zNjAgKyAwLjkvMzYwKTsKLQotICAgIGlmIChmYWJzKHRoZXRhIC0gOTAqcm91bmQodGhldGEvOTApKSA+IDIpCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk9kZCByb3RhdGlvbiBhbmdsZS5cbiIKLSAgICAgICAgICAgICAgICJJZiB5b3Ugd2FudCB0byBoZWxwLCB1cGxvYWQgYSBzYW1wbGUgIgotICAgICAgICAgICAgICAgIm9mIHRoaXMgZmlsZSB0byBmdHA6Ly91cGxvYWQuZmZtcGVnLm9yZy9pbmNvbWluZy8gIgotICAgICAgICAgICAgICAgImFuZCBjb250YWN0IHRoZSBmZm1wZWctZGV2ZWwgbWFpbGluZyBsaXN0LiAoZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcpIik7Ci0KLSAgICByZXR1cm4gdGhldGE7Ci19Ci0KLSNpZiBDT05GSUdfQVZERVZJQ0UKLXN0YXRpYyBpbnQgcHJpbnRfZGV2aWNlX3NvdXJjZXMoQVZJbnB1dEZvcm1hdCAqZm10LCBBVkRpY3Rpb25hcnkgKm9wdHMpCi17Ci0gICAgaW50IHJldCwgaTsKLSAgICBBVkRldmljZUluZm9MaXN0ICpkZXZpY2VfbGlzdCA9IE5VTEw7Ci0KLSAgICBpZiAoIWZtdCB8fCAhZm10LT5wcml2X2NsYXNzICB8fCAhQVZfSVNfSU5QVVRfREVWSUNFKGZtdC0+cHJpdl9jbGFzcy0+Y2F0ZWdvcnkpKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotCi0gICAgcHJpbnRmKCJBdWRvLWRldGVjdGVkIHNvdXJjZXMgZm9yICVzOlxuIiwgZm10LT5uYW1lKTsKLSAgICBpZiAoIWZtdC0+Z2V0X2RldmljZV9saXN0KSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKLSAgICAgICAgcHJpbnRmKCJDYW5ub3QgbGlzdCBzb3VyY2VzLiBOb3QgaW1wbGVtZW50ZWQuXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGlmICgocmV0ID0gYXZkZXZpY2VfbGlzdF9pbnB1dF9zb3VyY2VzKGZtdCwgTlVMTCwgb3B0cywgJmRldmljZV9saXN0KSkgPCAwKSB7Ci0gICAgICAgIHByaW50ZigiQ2Fubm90IGxpc3Qgc291cmNlcy5cbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGRldmljZV9saXN0LT5uYl9kZXZpY2VzOyBpKyspIHsKLSAgICAgICAgcHJpbnRmKCIlcyAlcyBbJXNdXG4iLCBkZXZpY2VfbGlzdC0+ZGVmYXVsdF9kZXZpY2UgPT0gaSA/ICIqIiA6ICIgIiwKLSAgICAgICAgICAgICAgIGRldmljZV9saXN0LT5kZXZpY2VzW2ldLT5kZXZpY2VfbmFtZSwgZGV2aWNlX2xpc3QtPmRldmljZXNbaV0tPmRldmljZV9kZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gIGZhaWw6Ci0gICAgYXZkZXZpY2VfZnJlZV9saXN0X2RldmljZXMoJmRldmljZV9saXN0KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHByaW50X2RldmljZV9zaW5rcyhBVk91dHB1dEZvcm1hdCAqZm10LCBBVkRpY3Rpb25hcnkgKm9wdHMpCi17Ci0gICAgaW50IHJldCwgaTsKLSAgICBBVkRldmljZUluZm9MaXN0ICpkZXZpY2VfbGlzdCA9IE5VTEw7Ci0KLSAgICBpZiAoIWZtdCB8fCAhZm10LT5wcml2X2NsYXNzICB8fCAhQVZfSVNfT1VUUFVUX0RFVklDRShmbXQtPnByaXZfY2xhc3MtPmNhdGVnb3J5KSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLQotICAgIHByaW50ZigiQXVkby1kZXRlY3RlZCBzaW5rcyBmb3IgJXM6XG4iLCBmbXQtPm5hbWUpOwotICAgIGlmICghZm10LT5nZXRfZGV2aWNlX2xpc3QpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9TWVMpOwotICAgICAgICBwcmludGYoIkNhbm5vdCBsaXN0IHNpbmtzLiBOb3QgaW1wbGVtZW50ZWQuXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGlmICgocmV0ID0gYXZkZXZpY2VfbGlzdF9vdXRwdXRfc2lua3MoZm10LCBOVUxMLCBvcHRzLCAmZGV2aWNlX2xpc3QpKSA8IDApIHsKLSAgICAgICAgcHJpbnRmKCJDYW5ub3QgbGlzdCBzaW5rcy5cbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGRldmljZV9saXN0LT5uYl9kZXZpY2VzOyBpKyspIHsKLSAgICAgICAgcHJpbnRmKCIlcyAlcyBbJXNdXG4iLCBkZXZpY2VfbGlzdC0+ZGVmYXVsdF9kZXZpY2UgPT0gaSA/ICIqIiA6ICIgIiwKLSAgICAgICAgICAgICAgIGRldmljZV9saXN0LT5kZXZpY2VzW2ldLT5kZXZpY2VfbmFtZSwgZGV2aWNlX2xpc3QtPmRldmljZXNbaV0tPmRldmljZV9kZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gIGZhaWw6Ci0gICAgYXZkZXZpY2VfZnJlZV9saXN0X2RldmljZXMoJmRldmljZV9saXN0KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNob3dfc2lua3Nfc291cmNlc19wYXJzZV9hcmcoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZGV2LCBBVkRpY3Rpb25hcnkgKipvcHRzKQotewotICAgIGludCByZXQ7Ci0gICAgaWYgKGFyZykgewotICAgICAgICBjaGFyICpvcHRzX3N0ciA9IE5VTEw7Ci0gICAgICAgIGF2X2Fzc2VydDAoZGV2ICYmIG9wdHMpOwotICAgICAgICAqZGV2ID0gYXZfc3RyZHVwKGFyZyk7Ci0gICAgICAgIGlmICghKmRldikKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGlmICgob3B0c19zdHIgPSBzdHJjaHIoKmRldiwgJywnKSkpIHsKLSAgICAgICAgICAgICoob3B0c19zdHIrKykgPSAnXDAnOwotICAgICAgICAgICAgaWYgKG9wdHNfc3RyWzBdICYmICgocmV0ID0gYXZfZGljdF9wYXJzZV9zdHJpbmcob3B0cywgb3B0c19zdHIsICI9IiwgIjoiLCAwKSkgPCAwKSkgewotICAgICAgICAgICAgICAgIGF2X2ZyZWVwKGRldik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBwcmludGYoIlxuRGV2aWNlIG5hbWUgaXMgbm90IHByb3ZpZGVkLlxuIgotICAgICAgICAgICAgICAgICJZb3UgY2FuIHBhc3MgZGV2aWNlbmFtZVssb3B0MT12YWwxWyxvcHQyPXZhbDIuLi5dXSBhcyBhbiBhcmd1bWVudC5cblxuIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBzaG93X3NvdXJjZXModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBBVklucHV0Rm9ybWF0ICpmbXQgPSBOVUxMOwotICAgIGNoYXIgKmRldiA9IE5VTEw7Ci0gICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpbnQgZXJyb3JfbGV2ZWwgPSBhdl9sb2dfZ2V0X2xldmVsKCk7Ci0KLSAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19FUlJPUik7Ci0KLSAgICBpZiAoKHJldCA9IHNob3dfc2lua3Nfc291cmNlc19wYXJzZV9hcmcoYXJnLCAmZGV2LCAmb3B0cykpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgZG8gewotICAgICAgICBmbXQgPSBhdl9pbnB1dF9hdWRpb19kZXZpY2VfbmV4dChmbXQpOwotICAgICAgICBpZiAoZm10KSB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChmbXQtPm5hbWUsICJsYXZmaSIpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvL2l0J3MgcG9pbnRsZXNzIHRvIHByb2JlIGxhdmZpCi0gICAgICAgICAgICBpZiAoZGV2ICYmICFhdl9tYXRjaF9uYW1lKGRldiwgZm10LT5uYW1lKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIHByaW50X2RldmljZV9zb3VyY2VzKGZtdCwgb3B0cyk7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChmbXQpOwotICAgIGRvIHsKLSAgICAgICAgZm10ID0gYXZfaW5wdXRfdmlkZW9fZGV2aWNlX25leHQoZm10KTsKLSAgICAgICAgaWYgKGZtdCkgewotICAgICAgICAgICAgaWYgKGRldiAmJiAhYXZfbWF0Y2hfbmFtZShkZXYsIGZtdC0+bmFtZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBwcmludF9kZXZpY2Vfc291cmNlcyhmbXQsIG9wdHMpOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoZm10KTsKLSAgZmFpbDoKLSAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwotICAgIGF2X2ZyZWUoZGV2KTsKLSAgICBhdl9sb2dfc2V0X2xldmVsKGVycm9yX2xldmVsKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgc2hvd19zaW5rcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIEFWT3V0cHV0Rm9ybWF0ICpmbXQgPSBOVUxMOwotICAgIGNoYXIgKmRldiA9IE5VTEw7Ci0gICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBpbnQgZXJyb3JfbGV2ZWwgPSBhdl9sb2dfZ2V0X2xldmVsKCk7Ci0KLSAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19FUlJPUik7Ci0KLSAgICBpZiAoKHJldCA9IHNob3dfc2lua3Nfc291cmNlc19wYXJzZV9hcmcoYXJnLCAmZGV2LCAmb3B0cykpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgZG8gewotICAgICAgICBmbXQgPSBhdl9vdXRwdXRfYXVkaW9fZGV2aWNlX25leHQoZm10KTsKLSAgICAgICAgaWYgKGZtdCkgewotICAgICAgICAgICAgaWYgKGRldiAmJiAhYXZfbWF0Y2hfbmFtZShkZXYsIGZtdC0+bmFtZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBwcmludF9kZXZpY2Vfc2lua3MoZm10LCBvcHRzKTsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGZtdCk7Ci0gICAgZG8gewotICAgICAgICBmbXQgPSBhdl9vdXRwdXRfdmlkZW9fZGV2aWNlX25leHQoZm10KTsKLSAgICAgICAgaWYgKGZtdCkgewotICAgICAgICAgICAgaWYgKGRldiAmJiAhYXZfbWF0Y2hfbmFtZShkZXYsIGZtdC0+bmFtZSkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBwcmludF9kZXZpY2Vfc2lua3MoZm10LCBvcHRzKTsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGZtdCk7Ci0gIGZhaWw6Ci0gICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKLSAgICBhdl9mcmVlKGRldik7Ci0gICAgYXZfbG9nX3NldF9sZXZlbChlcnJvcl9sZXZlbCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jbWR1dGlscy5oIGIvY21kdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlYTRhZC4uMDAwMDAwMAotLS0gYS9jbWR1dGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkwICswLDAgQEAKLS8qCi0gKiBWYXJpb3VzIHV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIHRvb2xzCi0gKiBjb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQ01EVVRJTFNfSAotI2RlZmluZSBDTURVVElMU19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgotI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2F2ZmlsdGVyLmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKLSNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGUuaCIKLQotI2lmZGVmIF9XSU4zMgotI3VuZGVmIG1haW4gLyogV2UgZG9uJ3Qgd2FudCBTREwgdG8gb3ZlcnJpZGUgb3VyIG1haW4oKSAqLwotI2VuZGlmCi0KLS8qKgotICogcHJvZ3JhbSBuYW1lLCBkZWZpbmVkIGJ5IHRoZSBwcm9ncmFtIGZvciBzaG93X3ZlcnNpb24oKS4KLSAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgcHJvZ3JhbV9uYW1lW107Ci0KLS8qKgotICogcHJvZ3JhbSBiaXJ0aCB5ZWFyLCBkZWZpbmVkIGJ5IHRoZSBwcm9ncmFtIGZvciBzaG93X2Jhbm5lcigpCi0gKi8KLWV4dGVybiBjb25zdCBpbnQgcHJvZ3JhbV9iaXJ0aF95ZWFyOwotCi1leHRlcm4gQVZDb2RlY0NvbnRleHQgKmF2Y29kZWNfb3B0c1tBVk1FRElBX1RZUEVfTkJdOwotZXh0ZXJuIEFWRm9ybWF0Q29udGV4dCAqYXZmb3JtYXRfb3B0czsKLWV4dGVybiBBVkRpY3Rpb25hcnkgKnN3c19kaWN0OwotZXh0ZXJuIEFWRGljdGlvbmFyeSAqc3dyX29wdHM7Ci1leHRlcm4gQVZEaWN0aW9uYXJ5ICpmb3JtYXRfb3B0cywgKmNvZGVjX29wdHMsICpyZXNhbXBsZV9vcHRzOwotZXh0ZXJuIGludCBoaWRlX2Jhbm5lcjsKLQotLyoqCi0gKiBSZWdpc3RlciBhIHByb2dyYW0tc3BlY2lmaWMgY2xlYW51cCByb3V0aW5lLgotICovCi12b2lkIHJlZ2lzdGVyX2V4aXQodm9pZCAoKmNiKShpbnQgcmV0KSk7Ci0KLS8qKgotICogV3JhcHMgZXhpdCB3aXRoIGEgcHJvZ3JhbS1zcGVjaWZpYyBjbGVhbnVwIHJvdXRpbmUuCi0gKi8KLXZvaWQgZXhpdF9wcm9ncmFtKGludCByZXQpIGF2X25vcmV0dXJuOwotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIGNtZHV0aWxzIG9wdGlvbiBzeXN0ZW0sIGluIHBhcnRpY3VsYXIKLSAqIGFsbG9jYXRlIHRoZSAqX29wdHMgY29udGV4dHMuCi0gKi8KLXZvaWQgaW5pdF9vcHRzKHZvaWQpOwotLyoqCi0gKiBVbmluaXRpYWxpemUgdGhlIGNtZHV0aWxzIG9wdGlvbiBzeXN0ZW0sIGluIHBhcnRpY3VsYXIKLSAqIGZyZWUgdGhlICpfb3B0cyBjb250ZXh0cyBhbmQgdGhlaXIgY29udGVudHMuCi0gKi8KLXZvaWQgdW5pbml0X29wdHModm9pZCk7Ci0KLS8qKgotICogVHJpdmlhbCBsb2cgY2FsbGJhY2suCi0gKiBPbmx5IHN1aXRhYmxlIGZvciBvcHRfaGVscCBhbmQgc2ltaWxhciBzaW5jZSBpdCBsYWNrcyBwcmVmaXggaGFuZGxpbmcuCi0gKi8KLXZvaWQgbG9nX2NhbGxiYWNrX2hlbHAodm9pZCogcHRyLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCB2bCk7Ci0KLS8qKgotICogT3ZlcnJpZGUgdGhlIGNwdWZsYWdzLgotICovCi1pbnQgb3B0X2NwdWZsYWdzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOwotCi0vKioKLSAqIEZhbGxiYWNrIGZvciBvcHRpb25zIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IGhhbmRsZWQsIHRoZXNlIHdpbGwgYmUKLSAqIHBhcnNlZCB0aHJvdWdoIEFWT3B0aW9ucy4KLSAqLwotaW50IG9wdF9kZWZhdWx0KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOwotCi0vKioKLSAqIFNldCB0aGUgbGliYXYqIGxpYnJhcmllcyBsb2cgbGV2ZWwuCi0gKi8KLWludCBvcHRfbG9nbGV2ZWwodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7Ci0KLWludCBvcHRfcmVwb3J0KGNvbnN0IGNoYXIgKm9wdCk7Ci0KLWludCBvcHRfbWF4X2FsbG9jKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOwotCi1pbnQgb3B0X2NvZGVjX2RlYnVnKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOwotCi0jaWYgQ09ORklHX09QRU5DTAotaW50IG9wdF9vcGVuY2wodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7Ci0KLWludCBvcHRfb3BlbmNsX2JlbmNoKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOwotI2VuZGlmCi0KLS8qKgotICogTGltaXQgdGhlIGV4ZWN1dGlvbiB0aW1lLgotICovCi1pbnQgb3B0X3RpbWVsaW1pdCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBQYXJzZSBhIHN0cmluZyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlIGFzIGEgZG91YmxlLgotICogRXhpdCBmcm9tIHRoZSBhcHBsaWNhdGlvbiBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb3JyZWN0bHkKLSAqIHBhcnNlZCBvciB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpcyBpbnZhbGlkLgotICoKLSAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSB2YWx1ZSB0byBiZSBzZXQgKGUuZy4gdGhlCi0gKiBjb3JyZXNwb25kaW5nIGNvbW1hbmQgbGluZSBvcHRpb24gbmFtZSkKLSAqIEBwYXJhbSBudW1zdHIgdGhlIHN0cmluZyB0byBiZSBwYXJzZWQKLSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIChPUFRfSU5UNjQgb3IgT1BUX0ZMT0FUKSBhcyB3aGljaCB0aGUKLSAqIHN0cmluZyBzaG91bGQgYmUgcGFyc2VkCi0gKiBAcGFyYW0gbWluIHRoZSBtaW5pbXVtIHZhbGlkIGFjY2VwdGVkIHZhbHVlCi0gKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIHZhbGlkIGFjY2VwdGVkIHZhbHVlCi0gKi8KLWRvdWJsZSBwYXJzZV9udW1iZXJfb3JfZGllKGNvbnN0IGNoYXIgKmNvbnRleHQsIGNvbnN0IGNoYXIgKm51bXN0ciwgaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWluLCBkb3VibGUgbWF4KTsKLQotLyoqCi0gKiBQYXJzZSBhIHN0cmluZyBzcGVjaWZ5aW5nIGEgdGltZSBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nCi0gKiB2YWx1ZSBhcyBhIG51bWJlciBvZiBtaWNyb3NlY29uZHMuIEV4aXQgZnJvbSB0aGUgYXBwbGljYXRpb24gaWYKLSAqIHRoZSBzdHJpbmcgY2Fubm90IGJlIGNvcnJlY3RseSBwYXJzZWQuCi0gKgotICogQHBhcmFtIGNvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIHZhbHVlIHRvIGJlIHNldCAoZS5nLiB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBsaW5lIG9wdGlvbiBuYW1lKQotICogQHBhcmFtIHRpbWVzdHIgdGhlIHN0cmluZyB0byBiZSBwYXJzZWQKLSAqIEBwYXJhbSBpc19kdXJhdGlvbiBhIGZsYWcgd2hpY2ggdGVsbHMgaG93IHRvIGludGVycHJldCB0aW1lc3RyLCBpZgotICogbm90IHplcm8gdGltZXN0ciBpcyBpbnRlcnByZXRlZCBhcyBhIGR1cmF0aW9uLCBvdGhlcndpc2UgYXMgYQotICogZGF0ZQotICoKLSAqIEBzZWUgYXZfcGFyc2VfdGltZSgpCi0gKi8KLWludDY0X3QgcGFyc2VfdGltZV9vcl9kaWUoY29uc3QgY2hhciAqY29udGV4dCwgY29uc3QgY2hhciAqdGltZXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2R1cmF0aW9uKTsKLQotdHlwZWRlZiBzdHJ1Y3QgU3BlY2lmaWVyT3B0IHsKLSAgICBjaGFyICpzcGVjaWZpZXI7ICAgIC8qKjwgc3RyZWFtL2NoYXB0ZXIvcHJvZ3JhbS8uLi4gc3BlY2lmaWVyICovCi0gICAgdW5pb24gewotICAgICAgICB1aW50OF90ICpzdHI7Ci0gICAgICAgIGludCAgICAgICAgaTsKLSAgICAgICAgaW50NjRfdCAgaTY0OwotICAgICAgICBmbG9hdCAgICAgIGY7Ci0gICAgICAgIGRvdWJsZSAgIGRibDsKLSAgICB9IHU7Ci19IFNwZWNpZmllck9wdDsKLQotdHlwZWRlZiBzdHJ1Y3QgT3B0aW9uRGVmIHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIGludCBmbGFnczsKLSNkZWZpbmUgSEFTX0FSRyAgICAweDAwMDEKLSNkZWZpbmUgT1BUX0JPT0wgICAweDAwMDIKLSNkZWZpbmUgT1BUX0VYUEVSVCAweDAwMDQKLSNkZWZpbmUgT1BUX1NUUklORyAweDAwMDgKLSNkZWZpbmUgT1BUX1ZJREVPICAweDAwMTAKLSNkZWZpbmUgT1BUX0FVRElPICAweDAwMjAKLSNkZWZpbmUgT1BUX0lOVCAgICAweDAwODAKLSNkZWZpbmUgT1BUX0ZMT0FUICAweDAxMDAKLSNkZWZpbmUgT1BUX1NVQlRJVExFIDB4MDIwMAotI2RlZmluZSBPUFRfSU5UNjQgIDB4MDQwMAotI2RlZmluZSBPUFRfRVhJVCAgIDB4MDgwMAotI2RlZmluZSBPUFRfREFUQSAgIDB4MTAwMAotI2RlZmluZSBPUFRfUEVSRklMRSAgMHgyMDAwICAgICAvKiB0aGUgb3B0aW9uIGlzIHBlci1maWxlIChjdXJyZW50bHkgZmZtcGVnLW9ubHkpLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWVkIGJ5IE9QVF9PRkZTRVQgb3IgT1BUX1NQRUMgKi8KLSNkZWZpbmUgT1BUX09GRlNFVCAweDQwMDAgICAgICAgLyogb3B0aW9uIGlzIHNwZWNpZmllZCBhcyBhbiBvZmZzZXQgaW4gYSBwYXNzZWQgb3B0Y3R4ICovCi0jZGVmaW5lIE9QVF9TUEVDICAgMHg4MDAwICAgICAgIC8qIG9wdGlvbiBpcyB0byBiZSBzdG9yZWQgaW4gYW4gYXJyYXkgb2YgU3BlY2lmaWVyT3B0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBsaWVzIE9QVF9PRkZTRVQuIE5leHQgZWxlbWVudCBhZnRlciB0aGUgb2Zmc2V0IGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGludCBjb250YWluaW5nIGVsZW1lbnQgY291bnQgaW4gdGhlIGFycmF5LiAqLwotI2RlZmluZSBPUFRfVElNRSAgMHgxMDAwMAotI2RlZmluZSBPUFRfRE9VQkxFIDB4MjAwMDAKLSNkZWZpbmUgT1BUX0lOUFVUICAweDQwMDAwCi0jZGVmaW5lIE9QVF9PVVRQVVQgMHg4MDAwMAotICAgICB1bmlvbiB7Ci0gICAgICAgIHZvaWQgKmRzdF9wdHI7Ci0gICAgICAgIGludCAoKmZ1bmNfYXJnKSh2b2lkICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKLSAgICAgICAgc2l6ZV90IG9mZjsKLSAgICB9IHU7Ci0gICAgY29uc3QgY2hhciAqaGVscDsKLSAgICBjb25zdCBjaGFyICphcmduYW1lOwotfSBPcHRpb25EZWY7Ci0KLS8qKgotICogUHJpbnQgaGVscCBmb3IgYWxsIG9wdGlvbnMgbWF0Y2hpbmcgc3BlY2lmaWVkIGZsYWdzLgotICoKLSAqIEBwYXJhbSBvcHRpb25zIGEgbGlzdCBvZiBvcHRpb25zCi0gKiBAcGFyYW0gbXNnIHRpdGxlIG9mIHRoaXMgZ3JvdXAuIE9ubHkgcHJpbnRlZCBpZiBhdCBsZWFzdCBvbmUgb3B0aW9uIG1hdGNoZXMuCi0gKiBAcGFyYW0gcmVxX2ZsYWdzIHByaW50IG9ubHkgb3B0aW9ucyB3aGljaCBoYXZlIGFsbCB0aG9zZSBmbGFncyBzZXQuCi0gKiBAcGFyYW0gcmVqX2ZsYWdzIGRvbid0IHByaW50IG9wdGlvbnMgd2hpY2ggaGF2ZSBhbnkgb2YgdGhvc2UgZmxhZ3Mgc2V0LgotICogQHBhcmFtIGFsdF9mbGFncyBwcmludCBvbmx5IG9wdGlvbnMgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSBmbGFncyBzZXQKLSAqLwotdm9pZCBzaG93X2hlbHBfb3B0aW9ucyhjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMsIGNvbnN0IGNoYXIgKm1zZywgaW50IHJlcV9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlal9mbGFncywgaW50IGFsdF9mbGFncyk7Ci0KLS8qKgotICogU2hvdyBoZWxwIGZvciBhbGwgb3B0aW9ucyB3aXRoIGdpdmVuIGZsYWdzIGluIGNsYXNzIGFuZCBhbGwgaXRzCi0gKiBjaGlsZHJlbi4KLSAqLwotdm9pZCBzaG93X2hlbHBfY2hpbGRyZW4oY29uc3QgQVZDbGFzcyAqY2xhc3MsIGludCBmbGFncyk7Ci0KLS8qKgotICogUGVyLWZmdG9vbCBzcGVjaWZpYyBoZWxwIGhhbmRsZXIuIEltcGxlbWVudGVkIGluIGVhY2gKLSAqIGZmdG9vbCwgY2FsbGVkIGJ5IHNob3dfaGVscCgpLgotICovCi12b2lkIHNob3dfaGVscF9kZWZhdWx0KGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBHZW5lcmljIC1oIGhhbmRsZXIgY29tbW9uIHRvIGFsbCBmZnRvb2xzLgotICovCi1pbnQgc2hvd19oZWxwKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOwotCi0vKioKLSAqIFBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgotICoKLSAqIEBwYXJhbSBvcHRjdHggYW4gb3BhcXVlIG9wdGlvbnMgY29udGV4dAotICogQHBhcmFtIGFyZ2MgICBudW1iZXIgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotICogQHBhcmFtIGFyZ3YgICB2YWx1ZXMgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwotICogQHBhcmFtIG9wdGlvbnMgQXJyYXkgd2l0aCB0aGUgZGVmaW5pdGlvbnMgcmVxdWlyZWQgdG8gaW50ZXJwcmV0IGV2ZXJ5Ci0gKiBvcHRpb24gb2YgdGhlIGZvcm06IC1vcHRpb25fbmFtZSBbYXJndW1lbnRdCi0gKiBAcGFyYW0gcGFyc2VfYXJnX2Z1bmN0aW9uIE5hbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlZCB0byBwcm9jZXNzIGV2ZXJ5Ci0gKiBhcmd1bWVudCB3aXRob3V0IGEgbGVhZGluZyBvcHRpb24gbmFtZSBmbGFnLiBOVUxMIGlmIHN1Y2ggYXJndW1lbnRzIGRvCi0gKiBub3QgaGF2ZSB0byBiZSBwcm9jZXNzZWQuCi0gKi8KLXZvaWQgcGFyc2Vfb3B0aW9ucyh2b2lkICpvcHRjdHgsIGludCBhcmdjLCBjaGFyICoqYXJndiwgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zLAotICAgICAgICAgICAgICAgICAgIHZvaWQgKCogcGFyc2VfYXJnX2Z1bmN0aW9uKSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIqKSk7Ci0KLS8qKgotICogUGFyc2Ugb25lIGdpdmVuIG9wdGlvbi4KLSAqCi0gKiBAcmV0dXJuIG9uIHN1Y2Nlc3MgMSBpZiBhcmcgd2FzIGNvbnN1bWVkLCAwIG90aGVyd2lzZTsgbmVnYXRpdmUgbnVtYmVyIG9uIGVycm9yCi0gKi8KLWludCBwYXJzZV9vcHRpb24odm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZywKLSAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zKTsKLQotLyoqCi0gKiBBbiBvcHRpb24gZXh0cmFjdGVkIGZyb20gdGhlIGNvbW1hbmRsaW5lLgotICogQ2Fubm90IHVzZSBBVkRpY3Rpb25hcnkgYmVjYXVzZSBvZiBvcHRpb25zIGxpa2UgLW1hcCB3aGljaCBjYW4gYmUKLSAqIHVzZWQgbXVsdGlwbGUgdGltZXMuCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9wdGlvbiB7Ci0gICAgY29uc3QgT3B0aW9uRGVmICAqb3B0OwotICAgIGNvbnN0IGNoYXIgICAgICAgKmtleTsKLSAgICBjb25zdCBjaGFyICAgICAgICp2YWw7Ci19IE9wdGlvbjsKLQotdHlwZWRlZiBzdHJ1Y3QgT3B0aW9uR3JvdXBEZWYgewotICAgIC8qKjwgZ3JvdXAgbmFtZSAqLwotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgLyoqCi0gICAgICogT3B0aW9uIHRvIGJlIHVzZWQgYXMgZ3JvdXAgc2VwYXJhdG9yLiBDYW4gYmUgTlVMTCBmb3IgZ3JvdXBzIHdoaWNoCi0gICAgICogYXJlIHRlcm1pbmF0ZWQgYnkgYSBub24tb3B0aW9uIGFyZ3VtZW50IChlLmcuIGZmbXBlZyBvdXRwdXQgZmlsZXMpCi0gICAgICovCi0gICAgY29uc3QgY2hhciAqc2VwOwotICAgIC8qKgotICAgICAqIE9wdGlvbiBmbGFncyB0aGF0IG11c3QgYmUgc2V0IG9uIGVhY2ggb3B0aW9uIHRoYXQgaXMKLSAgICAgKiBhcHBsaWVkIHRvIHRoaXMgZ3JvdXAKLSAgICAgKi8KLSAgICBpbnQgZmxhZ3M7Ci19IE9wdGlvbkdyb3VwRGVmOwotCi10eXBlZGVmIHN0cnVjdCBPcHRpb25Hcm91cCB7Ci0gICAgY29uc3QgT3B0aW9uR3JvdXBEZWYgKmdyb3VwX2RlZjsKLSAgICBjb25zdCBjaGFyICphcmc7Ci0KLSAgICBPcHRpb24gKm9wdHM7Ci0gICAgaW50ICBuYl9vcHRzOwotCi0gICAgQVZEaWN0aW9uYXJ5ICpjb2RlY19vcHRzOwotICAgIEFWRGljdGlvbmFyeSAqZm9ybWF0X29wdHM7Ci0gICAgQVZEaWN0aW9uYXJ5ICpyZXNhbXBsZV9vcHRzOwotICAgIEFWRGljdGlvbmFyeSAqc3dzX2RpY3Q7Ci0gICAgQVZEaWN0aW9uYXJ5ICpzd3Jfb3B0czsKLX0gT3B0aW9uR3JvdXA7Ci0KLS8qKgotICogQSBsaXN0IG9mIG9wdGlvbiBncm91cHMgdGhhdCBhbGwgaGF2ZSB0aGUgc2FtZSBncm91cCB0eXBlCi0gKiAoZS5nLiBpbnB1dCBmaWxlcyBvciBvdXRwdXQgZmlsZXMpCi0gKi8KLXR5cGVkZWYgc3RydWN0IE9wdGlvbkdyb3VwTGlzdCB7Ci0gICAgY29uc3QgT3B0aW9uR3JvdXBEZWYgKmdyb3VwX2RlZjsKLQotICAgIE9wdGlvbkdyb3VwICpncm91cHM7Ci0gICAgaW50ICAgICAgIG5iX2dyb3VwczsKLX0gT3B0aW9uR3JvdXBMaXN0OwotCi10eXBlZGVmIHN0cnVjdCBPcHRpb25QYXJzZUNvbnRleHQgewotICAgIE9wdGlvbkdyb3VwIGdsb2JhbF9vcHRzOwotCi0gICAgT3B0aW9uR3JvdXBMaXN0ICpncm91cHM7Ci0gICAgaW50ICAgICAgICAgICBuYl9ncm91cHM7Ci0KLSAgICAvKiBwYXJzaW5nIHN0YXRlICovCi0gICAgT3B0aW9uR3JvdXAgY3VyX2dyb3VwOwotfSBPcHRpb25QYXJzZUNvbnRleHQ7Ci0KLS8qKgotICogUGFyc2UgYW4gb3B0aW9ucyBncm91cCBhbmQgd3JpdGUgcmVzdWx0cyBpbnRvIG9wdGN0eC4KLSAqCi0gKiBAcGFyYW0gb3B0Y3R4IGFuIGFwcC1zcGVjaWZpYyBvcHRpb25zIGNvbnRleHQuIE5VTEwgZm9yIGdsb2JhbCBvcHRpb25zIGdyb3VwCi0gKi8KLWludCBwYXJzZV9vcHRncm91cCh2b2lkICpvcHRjdHgsIE9wdGlvbkdyb3VwICpnKTsKLQotLyoqCi0gKiBTcGxpdCB0aGUgY29tbWFuZGxpbmUgaW50byBhbiBpbnRlcm1lZGlhdGUgZm9ybSBjb252ZW5pZW50IGZvciBmdXJ0aGVyCi0gKiBwcm9jZXNzaW5nLgotICoKLSAqIFRoZSBjb21tYW5kbGluZSBpcyBhc3N1bWVkIHRvIGJlIGNvbXBvc2VkIG9mIG9wdGlvbnMgd2hpY2ggZWl0aGVyIGJlbG9uZyB0byBhCi0gKiBncm91cCAodGhvc2Ugd2l0aCBPUFRfU1BFQywgT1BUX09GRlNFVCBvciBPUFRfUEVSRklMRSkgb3IgYXJlIGdsb2JhbAotICogKGV2ZXJ5dGhpbmcgZWxzZSkuCi0gKgotICogQSBncm91cCAoZGVmaW5lZCBieSBhbiBPcHRpb25Hcm91cERlZiBzdHJ1Y3QpIGlzIGEgc2VxdWVuY2Ugb2Ygb3B0aW9ucwotICogdGVybWluYXRlZCBieSBlaXRoZXIgYSBncm91cCBzZXBhcmF0b3Igb3B0aW9uIChlLmcuIC1pKSBvciBhIHBhcmFtZXRlciB0aGF0Ci0gKiBpcyBub3QgYW4gb3B0aW9uIChkb2Vzbid0IHN0YXJ0IHdpdGggLSkuIEEgZ3JvdXAgd2l0aG91dCBhIHNlcGFyYXRvciBvcHRpb24KLSAqIG11c3QgYWx3YXlzIGJlIGZpcnN0IGluIHRoZSBzdXBwbGllZCBncm91cHMgbGlzdC4KLSAqCi0gKiBBbGwgb3B0aW9ucyB3aXRoaW4gdGhlIHNhbWUgZ3JvdXAgYXJlIHN0b3JlZCBpbiBvbmUgT3B0aW9uR3JvdXAgc3RydWN0IGluIGFuCi0gKiBPcHRpb25Hcm91cExpc3QsIGFsbCBncm91cHMgd2l0aCB0aGUgc2FtZSBncm91cCBkZWZpbml0aW9uIGFyZSBzdG9yZWQgaW4gb25lCi0gKiBPcHRpb25Hcm91cExpc3QgaW4gT3B0aW9uUGFyc2VDb250ZXh0Lmdyb3Vwcy4gVGhlIG9yZGVyIG9mIGdyb3VwIGxpc3RzIGlzIHRoZQotICogc2FtZSBhcyB0aGUgb3JkZXIgb2YgZ3JvdXAgZGVmaW5pdGlvbnMuCi0gKi8KLWludCBzcGxpdF9jb21tYW5kbGluZShPcHRpb25QYXJzZUNvbnRleHQgKm9jdHgsIGludCBhcmdjLCBjaGFyICphcmd2W10sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbkdyb3VwRGVmICpncm91cHMsIGludCBuYl9ncm91cHMpOwotCi0vKioKLSAqIEZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkgaW4gYW4gT3B0aW9uUGFyc2VDb250ZXh0LgotICovCi12b2lkIHVuaW5pdF9wYXJzZV9jb250ZXh0KE9wdGlvblBhcnNlQ29udGV4dCAqb2N0eCk7Ci0KLS8qKgotICogRmluZCB0aGUgJy1sb2dsZXZlbCcgb3B0aW9uIGluIHRoZSBjb21tYW5kIGxpbmUgYXJncyBhbmQgYXBwbHkgaXQuCi0gKi8KLXZvaWQgcGFyc2VfbG9nbGV2ZWwoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMpOwotCi0vKioKLSAqIFJldHVybiBpbmRleCBvZiBvcHRpb24gb3B0IGluIGFyZ3Ygb3IgMCBpZiBub3QgZm91bmQuCi0gKi8KLWludCBsb2NhdGVfb3B0aW9uKGludCBhcmdjLCBjaGFyICoqYXJndiwgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqb3B0bmFtZSk7Ci0KLS8qKgotICogQ2hlY2sgaWYgdGhlIGdpdmVuIHN0cmVhbSBtYXRjaGVzIGEgc3RyZWFtIHNwZWNpZmllci4KLSAqCi0gKiBAcGFyYW0gcyAgQ29ycmVzcG9uZGluZyBmb3JtYXQgY29udGV4dC4KLSAqIEBwYXJhbSBzdCBTdHJlYW0gZnJvbSBzIHRvIGJlIGNoZWNrZWQuCi0gKiBAcGFyYW0gc3BlYyBBIHN0cmVhbSBzcGVjaWZpZXIgb2YgdGhlIFt2fGF8c3xkXTpbXDxzdHJlYW0gaW5kZXhcPl0gZm9ybS4KLSAqCi0gKiBAcmV0dXJuIDEgaWYgdGhlIHN0cmVhbSBtYXRjaGVzLCAwIGlmIGl0IGRvZXNuJ3QsIDwwIG9uIGVycm9yCi0gKi8KLWludCBjaGVja19zdHJlYW1fc3BlY2lmaWVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBjb25zdCBjaGFyICpzcGVjKTsKLQotLyoqCi0gKiBGaWx0ZXIgb3V0IG9wdGlvbnMgZm9yIGdpdmVuIGNvZGVjLgotICoKLSAqIENyZWF0ZSBhIG5ldyBvcHRpb25zIGRpY3Rpb25hcnkgY29udGFpbmluZyBvbmx5IHRoZSBvcHRpb25zIGZyb20KLSAqIG9wdHMgd2hpY2ggYXBwbHkgdG8gdGhlIGNvZGVjIHdpdGggSUQgY29kZWNfaWQuCi0gKgotICogQHBhcmFtIG9wdHMgICAgIGRpY3Rpb25hcnkgdG8gcGxhY2Ugb3B0aW9ucyBpbgotICogQHBhcmFtIGNvZGVjX2lkIElEIG9mIHRoZSBjb2RlYyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJlZCBmb3IKLSAqIEBwYXJhbSBzIENvcnJlc3BvbmRpbmcgZm9ybWF0IGNvbnRleHQuCi0gKiBAcGFyYW0gc3QgQSBzdHJlYW0gZnJvbSBzIGZvciB3aGljaCB0aGUgb3B0aW9ucyBzaG91bGQgYmUgZmlsdGVyZWQuCi0gKiBAcGFyYW0gY29kZWMgVGhlIHBhcnRpY3VsYXIgY29kZWMgZm9yIHdoaWNoIHRoZSBvcHRpb25zIHNob3VsZCBiZSBmaWx0ZXJlZC4KLSAqICAgICAgICAgICAgICBJZiBudWxsLCB0aGUgZGVmYXVsdCBvbmUgaXMgbG9va2VkIHVwIGFjY29yZGluZyB0byB0aGUgY29kZWMgaWQuCi0gKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBkaWN0aW9uYXJ5Ci0gKi8KLUFWRGljdGlvbmFyeSAqZmlsdGVyX2NvZGVjX29wdHMoQVZEaWN0aW9uYXJ5ICpvcHRzLCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIEFWQ29kZWMgKmNvZGVjKTsKLQotLyoqCi0gKiBTZXR1cCBBVkNvZGVjQ29udGV4dCBvcHRpb25zIGZvciBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkuCi0gKgotICogQ3JlYXRlIGFuIGFycmF5IG9mIGRpY3Rpb25hcmllcywgb25lIGRpY3Rpb25hcnkgZm9yIGVhY2ggc3RyZWFtCi0gKiBjb250YWluZWQgaW4gcy4KLSAqIEVhY2ggZGljdGlvbmFyeSB3aWxsIGNvbnRhaW4gdGhlIG9wdGlvbnMgZnJvbSBjb2RlY19vcHRzIHdoaWNoIGNhbgotICogYmUgYXBwbGllZCB0byB0aGUgY29ycmVzcG9uZGluZyBzdHJlYW0gY29kZWMgY29udGV4dC4KLSAqCi0gKiBAcmV0dXJuIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYXJyYXkgb2YgZGljdGlvbmFyaWVzLCBOVUxMIGlmIGl0Ci0gKiBjYW5ub3QgYmUgY3JlYXRlZAotICovCi1BVkRpY3Rpb25hcnkgKipzZXR1cF9maW5kX3N0cmVhbV9pbmZvX29wdHMoQVZGb3JtYXRDb250ZXh0ICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqY29kZWNfb3B0cyk7Ci0KLS8qKgotICogUHJpbnQgYW4gZXJyb3IgbWVzc2FnZSB0byBzdGRlcnIsIGluZGljYXRpbmcgZmlsZW5hbWUgYW5kIGEgaHVtYW4KLSAqIHJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvciBjb2RlIGVyci4KLSAqCi0gKiBJZiBzdHJlcnJvcl9yKCkgaXMgbm90IGF2YWlsYWJsZSB0aGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaW4gYQotICogbXVsdGl0aHJlYWRlZCBhcHBsaWNhdGlvbiBtYXkgYmUgdW5zYWZlLgotICoKLSAqIEBzZWUgYXZfc3RyZXJyb3IoKQotICovCi12b2lkIHByaW50X2Vycm9yKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZXJyKTsKLQotLyoqCi0gKiBQcmludCB0aGUgcHJvZ3JhbSBiYW5uZXIgdG8gc3RkZXJyLiBUaGUgYmFubmVyIGNvbnRlbnRzIGRlcGVuZCBvbiB0aGUKLSAqIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgcmVwb3NpdG9yeSBhbmQgb2YgdGhlIGxpYmF2KiBsaWJyYXJpZXMgdXNlZCBieQotICogdGhlIHByb2dyYW0uCi0gKi8KLXZvaWQgc2hvd19iYW5uZXIoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMpOwotCi0vKioKLSAqIFByaW50IHRoZSB2ZXJzaW9uIG9mIHRoZSBwcm9ncmFtIHRvIHN0ZG91dC4gVGhlIHZlcnNpb24gbWVzc2FnZQotICogZGVwZW5kcyBvbiB0aGUgY3VycmVudCB2ZXJzaW9ucyBvZiB0aGUgcmVwb3NpdG9yeSBhbmQgb2YgdGhlIGxpYmF2KgotICogbGlicmFyaWVzLgotICogVGhpcyBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBkb2VzIG5vdCB1dGlsaXplIHRoZSBhcmd1bWVudHMuCi0gKi8KLWludCBzaG93X3ZlcnNpb24odm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7Ci0KLS8qKgotICogUHJpbnQgdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHByb2dyYW0gdG8gc3Rkb3V0LiBUaGUgY29udGVudHMKLSAqIGRlcGVuZCBvbiB0aGUgZGVmaW5pdGlvbiBvZiBGRk1QRUdfQ09ORklHVVJBVElPTi4KLSAqIFRoaXMgb3B0aW9uIHByb2Nlc3NpbmcgZnVuY3Rpb24gZG9lcyBub3QgdXRpbGl6ZSB0aGUgYXJndW1lbnRzLgotICovCi1pbnQgc2hvd19idWlsZGNvbmYodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7Ci0KLS8qKgotICogUHJpbnQgdGhlIGxpY2Vuc2Ugb2YgdGhlIHByb2dyYW0gdG8gc3Rkb3V0LiBUaGUgbGljZW5zZSBkZXBlbmRzIG9uCi0gKiB0aGUgbGljZW5zZSBvZiB0aGUgbGlicmFyaWVzIGNvbXBpbGVkIGludG8gdGhlIHByb2dyYW0uCi0gKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KLSAqLwotaW50IHNob3dfbGljZW5zZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZQotICogcHJvZ3JhbSAoaW5jbHVkaW5nIGRldmljZXMpLgotICogVGhpcyBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBkb2VzIG5vdCB1dGlsaXplIHRoZSBhcmd1bWVudHMuCi0gKi8KLWludCBzaG93X2Zvcm1hdHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7Ci0KLS8qKgotICogUHJpbnQgYSBsaXN0aW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGUKLSAqIHByb2dyYW0uCi0gKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KLSAqLwotaW50IHNob3dfZGV2aWNlcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotI2lmIENPTkZJR19BVkRFVklDRQotLyoqCi0gKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhdWRvZGV0ZWN0ZWQgc2lua3Mgb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gKiBEZXZpY2UgbmFtZSB3aXRoIG9wdGlvbnMgbWF5IGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBsaW1pdCByZXN1bHRzLgotICovCi1pbnQgc2hvd19zaW5rcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhdWRvZGV0ZWN0ZWQgc291cmNlcyBvZiB0aGUgaW5wdXQgZGV2aWNlLgotICogRGV2aWNlIG5hbWUgd2l0aCBvcHRpb25zIG1heSBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gbGltaXQgcmVzdWx0cy4KLSAqLwotaW50IHNob3dfc291cmNlcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLSNlbmRpZgotCi0vKioKLSAqIFByaW50IGEgbGlzdGluZyBjb250YWluaW5nIGFsbCB0aGUgY29kZWNzIHN1cHBvcnRlZCBieSB0aGUKLSAqIHByb2dyYW0uCi0gKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KLSAqLwotaW50IHNob3dfY29kZWNzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOwotCi0vKioKLSAqIFByaW50IGEgbGlzdGluZyBjb250YWluaW5nIGFsbCB0aGUgZGVjb2RlcnMgc3VwcG9ydGVkIGJ5IHRoZQotICogcHJvZ3JhbS4KLSAqLwotaW50IHNob3dfZGVjb2RlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7Ci0KLS8qKgotICogUHJpbnQgYSBsaXN0aW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBlbmNvZGVycyBzdXBwb3J0ZWQgYnkgdGhlCi0gKiBwcm9ncmFtLgotICovCi1pbnQgc2hvd19lbmNvZGVycyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIGZpbHRlcnMgc3VwcG9ydGVkIGJ5IHRoZQotICogcHJvZ3JhbS4KLSAqIFRoaXMgb3B0aW9uIHByb2Nlc3NpbmcgZnVuY3Rpb24gZG9lcyBub3QgdXRpbGl6ZSB0aGUgYXJndW1lbnRzLgotICovCi1pbnQgc2hvd19maWx0ZXJzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOwotCi0vKioKLSAqIFByaW50IGEgbGlzdGluZyBjb250YWluaW5nIGFsbCB0aGUgYml0IHN0cmVhbSBmaWx0ZXJzIHN1cHBvcnRlZCBieSB0aGUKLSAqIHByb2dyYW0uCi0gKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KLSAqLwotaW50IHNob3dfYnNmcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIHByb3RvY29scyBzdXBwb3J0ZWQgYnkgdGhlCi0gKiBwcm9ncmFtLgotICogVGhpcyBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBkb2VzIG5vdCB1dGlsaXplIHRoZSBhcmd1bWVudHMuCi0gKi8KLWludCBzaG93X3Byb3RvY29scyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIHBpeGVsIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZQotICogcHJvZ3JhbS4KLSAqIFRoaXMgb3B0aW9uIHByb2Nlc3NpbmcgZnVuY3Rpb24gZG9lcyBub3QgdXRpbGl6ZSB0aGUgYXJndW1lbnRzLgotICovCi1pbnQgc2hvd19waXhfZm10cyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIHN0YW5kYXJkIGNoYW5uZWwgbGF5b3V0cyBzdXBwb3J0ZWQgYnkKLSAqIHRoZSBwcm9ncmFtLgotICogVGhpcyBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBkb2VzIG5vdCB1dGlsaXplIHRoZSBhcmd1bWVudHMuCi0gKi8KLWludCBzaG93X2xheW91dHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7Ci0KLS8qKgotICogUHJpbnQgYSBsaXN0aW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBzYW1wbGUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlCi0gKiBwcm9ncmFtLgotICovCi1pbnQgc2hvd19zYW1wbGVfZm10cyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIGNvbG9yIG5hbWVzIGFuZCB2YWx1ZXMgcmVjb2duaXplZAotICogYnkgdGhlIHByb2dyYW0uCi0gKi8KLWludCBzaG93X2NvbG9ycyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKLQotLyoqCi0gKiBSZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBpZiBhIGxpbmUgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0Ci0gKiBzdGFydHMgd2l0aCBbeVldLCBvdGhlcndpc2UgcmV0dXJuIDAuCi0gKi8KLWludCByZWFkX3llc25vKHZvaWQpOwotCi0vKioKLSAqIEdldCBhIGZpbGUgY29ycmVzcG9uZGluZyB0byBhIHByZXNldCBmaWxlLgotICoKLSAqIElmIGlzX3BhdGggaXMgbm9uLXplcm8sIGxvb2sgZm9yIHRoZSBmaWxlIGluIHRoZSBwYXRoIHByZXNldF9uYW1lLgotICogT3RoZXJ3aXNlIHNlYXJjaCBmb3IgYSBmaWxlIG5hbWVkIGFyZy5mZnByZXNldCBpbiB0aGUgZGlyZWN0b3JpZXMKLSAqICRGRk1QRUdfREFUQURJUiAoaWYgc2V0KSwgJEhPTUUvLmZmbXBlZywgYW5kIGluIHRoZSBkYXRhZGlyIGRlZmluZWQKLSAqIGF0IGNvbmZpZ3VyYXRpb24gdGltZSBvciBpbiBhICJmZnByZXNldHMiIGZvbGRlciBhbG9uZyB0aGUgZXhlY3V0YWJsZQotICogb24gd2luMzIsIGluIHRoYXQgb3JkZXIuIElmIG5vIHN1Y2ggZmlsZSBpcyBmb3VuZCBhbmQKLSAqIGNvZGVjX25hbWUgaXMgZGVmaW5lZCwgdGhlbiBzZWFyY2ggZm9yIGEgZmlsZSBuYW1lZAotICogY29kZWNfbmFtZS1wcmVzZXRfbmFtZS5hdnByZXNldCBpbiB0aGUgYWJvdmUtbWVudGlvbmVkIGRpcmVjdG9yaWVzLgotICoKLSAqIEBwYXJhbSBmaWxlbmFtZSBidWZmZXIgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIGZvdW5kIGZpbGVuYW1lIGlzIHdyaXR0ZW4KLSAqIEBwYXJhbSBmaWxlbmFtZV9zaXplIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGVuYW1lIGJ1ZmZlcgotICogQHBhcmFtIHByZXNldF9uYW1lIG5hbWUgb2YgdGhlIHByZXNldCB0byBzZWFyY2gKLSAqIEBwYXJhbSBpc19wYXRoIHRlbGwgaWYgcHJlc2V0X25hbWUgaXMgYSBmaWxlbmFtZSBwYXRoCi0gKiBAcGFyYW0gY29kZWNfbmFtZSBuYW1lIG9mIHRoZSBjb2RlYyBmb3Igd2hpY2ggdG8gbG9vayBmb3IgdGhlCi0gKiBwcmVzZXQsIG1heSBiZSBOVUxMCi0gKi8KLUZJTEUgKmdldF9wcmVzZXRfZmlsZShjaGFyICpmaWxlbmFtZSwgc2l6ZV90IGZpbGVuYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJlc2V0X25hbWUsIGludCBpc19wYXRoLCBjb25zdCBjaGFyICpjb2RlY19uYW1lKTsKLQotLyoqCi0gKiBSZWFsbG9jIGFycmF5IHRvIGhvbGQgbmV3X3NpemUgZWxlbWVudHMgb2YgZWxlbV9zaXplLgotICogQ2FsbHMgZXhpdCgpIG9uIGZhaWx1cmUuCi0gKgotICogQHBhcmFtIGFycmF5IGFycmF5IHRvIHJlYWxsb2NhdGUKLSAqIEBwYXJhbSBlbGVtX3NpemUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGVsZW1lbnQKLSAqIEBwYXJhbSBzaXplIG5ldyBlbGVtZW50IGNvdW50IHdpbGwgYmUgd3JpdHRlbiBoZXJlCi0gKiBAcGFyYW0gbmV3X3NpemUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHBsYWNlIGluIHJlYWxsb2NhdGVkIGFycmF5Ci0gKiBAcmV0dXJuIHJlYWxsb2NhdGVkIGFycmF5Ci0gKi8KLXZvaWQgKmdyb3dfYXJyYXkodm9pZCAqYXJyYXksIGludCBlbGVtX3NpemUsIGludCAqc2l6ZSwgaW50IG5ld19zaXplKTsKLQotI2RlZmluZSBtZWRpYV90eXBlX3N0cmluZyBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcKLQotI2RlZmluZSBHUk9XX0FSUkFZKGFycmF5LCBuYl9lbGVtcylcCi0gICAgYXJyYXkgPSBncm93X2FycmF5KGFycmF5LCBzaXplb2YoKmFycmF5KSwgJm5iX2VsZW1zLCBuYl9lbGVtcyArIDEpCi0KLSNkZWZpbmUgR0VUX1BJWF9GTVRfTkFNRShwaXhfZm10KVwKLSAgICBjb25zdCBjaGFyICpuYW1lID0gYXZfZ2V0X3BpeF9mbXRfbmFtZShwaXhfZm10KTsKLQotI2RlZmluZSBHRVRfU0FNUExFX0ZNVF9OQU1FKHNhbXBsZV9mbXQpXAotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHNhbXBsZV9mbXQpCi0KLSNkZWZpbmUgR0VUX1NBTVBMRV9SQVRFX05BTUUocmF0ZSlcCi0gICAgY2hhciBuYW1lWzE2XTtcCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJWQiLCByYXRlKTsKLQotI2RlZmluZSBHRVRfQ0hfTEFZT1VUX05BTUUoY2hfbGF5b3V0KVwKLSAgICBjaGFyIG5hbWVbMTZdO1wKLSAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIweCUiUFJJeDY0LCBjaF9sYXlvdXQpOwotCi0jZGVmaW5lIEdFVF9DSF9MQVlPVVRfREVTQyhjaF9sYXlvdXQpXAotICAgIGNoYXIgbmFtZVsxMjhdO1wKLSAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKG5hbWUsIHNpemVvZihuYW1lKSwgMCwgY2hfbGF5b3V0KTsKLQotZG91YmxlIGdldF9yb3RhdGlvbihBVlN0cmVhbSAqc3QpOwotCi0jZW5kaWYgLyogQ01EVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvY21kdXRpbHNfY29tbW9uX29wdHMuaCBiL2NtZHV0aWxzX2NvbW1vbl9vcHRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OGRhYzEuLjAwMDAwMDAKLS0tIGEvY21kdXRpbHNfY29tbW9uX29wdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSAgICB7ICJMIiAgICAgICAgICAsIE9QVF9FWElULCB7LmZ1bmNfYXJnID0gc2hvd19saWNlbnNlfSwgICAgICAic2hvdyBsaWNlbnNlIiB9LAotICAgIHsgImgiICAgICAgICAgICwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBzaG93X2hlbHB9LCAgICAgICAgICJzaG93IGhlbHAiLCAidG9waWMiIH0sCi0gICAgeyAiPyIgICAgICAgICAgLCBPUFRfRVhJVCwgey5mdW5jX2FyZyA9IHNob3dfaGVscH0sICAgICAgICAgInNob3cgaGVscCIsICJ0b3BpYyIgfSwKLSAgICB7ICJoZWxwIiAgICAgICAsIE9QVF9FWElULCB7LmZ1bmNfYXJnID0gc2hvd19oZWxwfSwgICAgICAgICAic2hvdyBoZWxwIiwgInRvcGljIiB9LAotICAgIHsgIi1oZWxwIiAgICAgICwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBzaG93X2hlbHB9LCAgICAgICAgICJzaG93IGhlbHAiLCAidG9waWMiIH0sCi0gICAgeyAidmVyc2lvbiIgICAgLCBPUFRfRVhJVCwgey5mdW5jX2FyZyA9IHNob3dfdmVyc2lvbn0sICAgICAgInNob3cgdmVyc2lvbiIgfSwKLSAgICB7ICJidWlsZGNvbmYiICAsIE9QVF9FWElULCB7LmZ1bmNfYXJnID0gc2hvd19idWlsZGNvbmZ9LCAgICAic2hvdyBidWlsZCBjb25maWd1cmF0aW9uIiB9LAotICAgIHsgImZvcm1hdHMiICAgICwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBzaG93X2Zvcm1hdHMgIH0sICAgICJzaG93IGF2YWlsYWJsZSBmb3JtYXRzIiB9LAotICAgIHsgImRldmljZXMiICAgICwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBzaG93X2RldmljZXMgIH0sICAgICJzaG93IGF2YWlsYWJsZSBkZXZpY2VzIiB9LAotICAgIHsgImNvZGVjcyIgICAgICwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBzaG93X2NvZGVjcyAgIH0sICAgICJzaG93IGF2YWlsYWJsZSBjb2RlY3MiIH0sCi0gICAgeyAiZGVjb2RlcnMiICAgLCBPUFRfRVhJVCwgey5mdW5jX2FyZyA9IHNob3dfZGVjb2RlcnMgfSwgICAgInNob3cgYXZhaWxhYmxlIGRlY29kZXJzIiB9LAotICAgIHsgImVuY29kZXJzIiAgICwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBzaG93X2VuY29kZXJzIH0sICAgICJzaG93IGF2YWlsYWJsZSBlbmNvZGVycyIgfSwKLSAgICB7ICJic2ZzIiAgICAgICAsIE9QVF9FWElULCB7LmZ1bmNfYXJnID0gc2hvd19ic2ZzICAgICB9LCAgICAic2hvdyBhdmFpbGFibGUgYml0IHN0cmVhbSBmaWx0ZXJzIiB9LAotICAgIHsgInByb3RvY29scyIgICwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBzaG93X3Byb3RvY29sc30sICAgICJzaG93IGF2YWlsYWJsZSBwcm90b2NvbHMiIH0sCi0gICAgeyAiZmlsdGVycyIgICAgLCBPUFRfRVhJVCwgey5mdW5jX2FyZyA9IHNob3dfZmlsdGVycyAgfSwgICAgInNob3cgYXZhaWxhYmxlIGZpbHRlcnMiIH0sCi0gICAgeyAicGl4X2ZtdHMiICAgLCBPUFRfRVhJVCwgey5mdW5jX2FyZyA9IHNob3dfcGl4X2ZtdHMgfSwgICAgInNob3cgYXZhaWxhYmxlIHBpeGVsIGZvcm1hdHMiIH0sCi0gICAgeyAibGF5b3V0cyIgICAgLCBPUFRfRVhJVCwgey5mdW5jX2FyZyA9IHNob3dfbGF5b3V0cyAgfSwgICAgInNob3cgc3RhbmRhcmQgY2hhbm5lbCBsYXlvdXRzIiB9LAotICAgIHsgInNhbXBsZV9mbXRzIiwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBzaG93X3NhbXBsZV9mbXRzIH0sICJzaG93IGF2YWlsYWJsZSBhdWRpbyBzYW1wbGUgZm9ybWF0cyIgfSwKLSAgICB7ICJjb2xvcnMiICAgICAsIE9QVF9FWElULCB7LmZ1bmNfYXJnID0gc2hvd19jb2xvcnMgfSwgICAgICAic2hvdyBhdmFpbGFibGUgY29sb3IgbmFtZXMiIH0sCi0gICAgeyAibG9nbGV2ZWwiICAgLCBIQVNfQVJHLCAgey5mdW5jX2FyZyA9IG9wdF9sb2dsZXZlbH0sICAgICAgInNldCBsb2dnaW5nIGxldmVsIiwgImxvZ2xldmVsIiB9LAotICAgIHsgInYiLCAgICAgICAgICAgSEFTX0FSRywgIHsuZnVuY19hcmcgPSBvcHRfbG9nbGV2ZWx9LCAgICAgICJzZXQgbG9nZ2luZyBsZXZlbCIsICJsb2dsZXZlbCIgfSwKLSAgICB7ICJyZXBvcnQiICAgICAsIDAsICAgICAgICB7KHZvaWQqKW9wdF9yZXBvcnR9LCAiZ2VuZXJhdGUgYSByZXBvcnQiIH0sCi0gICAgeyAibWF4X2FsbG9jIiAgLCBIQVNfQVJHLCAgey5mdW5jX2FyZyA9IG9wdF9tYXhfYWxsb2N9LCAgICAgInNldCBtYXhpbXVtIHNpemUgb2YgYSBzaW5nbGUgYWxsb2NhdGVkIGJsb2NrIiwgImJ5dGVzIiB9LAotICAgIHsgImNwdWZsYWdzIiAgICwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsIHsgLmZ1bmNfYXJnID0gb3B0X2NwdWZsYWdzIH0sICJmb3JjZSBzcGVjaWZpYyBjcHUgZmxhZ3MiLCAiZmxhZ3MiIH0sCi0gICAgeyAiaGlkZV9iYW5uZXIiLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsIHsmaGlkZV9iYW5uZXJ9LCAgICAgImRvIG5vdCBzaG93IHByb2dyYW0gYmFubmVyIiwgImhpZGVfYmFubmVyIiB9LAotI2lmIENPTkZJR19PUEVOQ0wKLSAgICB7ICJvcGVuY2xfYmVuY2giLCBPUFRfRVhJVCwgey5mdW5jX2FyZyA9IG9wdF9vcGVuY2xfYmVuY2h9LCAicnVuIGJlbmNobWFyayBvbiBhbGwgT3BlbkNMIGRldmljZXMgYW5kIHNob3cgcmVzdWx0cyIgfSwKLSAgICB7ICJvcGVuY2xfb3B0aW9ucyIsIEhBU19BUkcsIHsuZnVuY19hcmcgPSBvcHRfb3BlbmNsfSwgICAgICAic2V0IE9wZW5DTCBlbnZpcm9ubWVudCBvcHRpb25zIiB9LAotI2VuZGlmCi0jaWYgQ09ORklHX0FWREVWSUNFCi0gICAgeyAic291cmNlcyIgICAgLCBPUFRfRVhJVCB8IEhBU19BUkcsIHsgLmZ1bmNfYXJnID0gc2hvd19zb3VyY2VzIH0sCi0gICAgICAibGlzdCBzb3VyY2VzIG9mIHRoZSBpbnB1dCBkZXZpY2UiLCAiZGV2aWNlIiB9LAotICAgIHsgInNpbmtzIiAgICAgICwgT1BUX0VYSVQgfCBIQVNfQVJHLCB7IC5mdW5jX2FyZyA9IHNob3dfc2lua3MgfSwKLSAgICAgICJsaXN0IHNpbmtzIG9mIHRoZSBvdXRwdXQgZGV2aWNlIiwgImRldmljZSIgfSwKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY21kdXRpbHNfb3BlbmNsLmMgYi9jbWR1dGlsc19vcGVuY2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQyMTM0NC4uMDAwMDAwMAotLS0gYS9jbWR1dGlsc19vcGVuY2wuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIExlbm55IFdhbmcKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3BlbmNsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCi0jaW5jbHVkZSAiY21kdXRpbHMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBwbGF0Zm9ybV9pZHg7Ci0gICAgaW50IGRldmljZV9pZHg7Ci0gICAgY2hhciBkZXZpY2VfbmFtZVs2NF07Ci0gICAgaW50NjRfdCBydW50aW1lOwotfSBPcGVuQ0xEZXZpY2VCZW5jaG1hcms7Ci0KLWNvbnN0IGNoYXIgKm9jbF9iZW5jaF9zb3VyY2UgPSBBVl9PUEVOQ0xfS0VSTkVMKAotaW5saW5lIHVuc2lnbmVkIGNoYXIgY2xpcF91aW50OChpbnQgYSkKLXsKLSAgICBpZiAoYSAmICh+MHhGRikpCi0gICAgICAgIHJldHVybiAoLWEpPj4zMTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBhOwotfQotCi1rZXJuZWwgdm9pZCB1bnNoYXJwX2JlbmNoKAotICAgICAgICAgICAgICAgICAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjLAotICAgICAgICAgICAgICAgICAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICBnbG9iYWwgaW50ICptYXNrLAotICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpCi17Ci0gICAgaW50IGksIGosIGxvY2FsX2lkeCwgbGNfaWR4LCBzdW0gPSAwOwotICAgIGludDIgdGhyZWFkX2lkeCwgYmxvY2tfaWR4LCBnbG9iYWxfaWR4LCBsbV9pZHg7Ci0gICAgdGhyZWFkX2lkeC54ID0gZ2V0X2xvY2FsX2lkKDApOwotICAgIHRocmVhZF9pZHgueSA9IGdldF9sb2NhbF9pZCgxKTsKLSAgICBibG9ja19pZHgueCA9IGdldF9ncm91cF9pZCgwKTsKLSAgICBibG9ja19pZHgueSA9IGdldF9ncm91cF9pZCgxKTsKLSAgICBnbG9iYWxfaWR4LnggPSBnZXRfZ2xvYmFsX2lkKDApOwotICAgIGdsb2JhbF9pZHgueSA9IGdldF9nbG9iYWxfaWQoMSk7Ci0gICAgbG9jYWwgdWNoYXIgZGF0YVszMl1bMzJdOwotICAgIGxvY2FsIGludCBsY1sxMjhdOwotCi0gICAgZm9yIChpID0gMDsgaSA8PSAxOyBpKyspIHsKLSAgICAgICAgbG1faWR4LnkgPSAtOCArIChibG9ja19pZHgueSArIGkpICogMTYgKyB0aHJlYWRfaWR4Lnk7Ci0gICAgICAgIGxtX2lkeC55ID0gbG1faWR4LnkgPCAwID8gMCA6IGxtX2lkeC55OwotICAgICAgICBsbV9pZHgueSA9IGxtX2lkeC55ID49IGhlaWdodCA/IGhlaWdodCAtIDE6IGxtX2lkeC55OwotICAgICAgICBmb3IgKGogPSAwOyBqIDw9IDE7IGorKykgewotICAgICAgICAgICAgbG1faWR4LnggPSAtOCArIChibG9ja19pZHgueCArIGopICogMTYgKyB0aHJlYWRfaWR4Lng7Ci0gICAgICAgICAgICBsbV9pZHgueCA9IGxtX2lkeC54IDwgMCA/IDAgOiBsbV9pZHgueDsKLSAgICAgICAgICAgIGxtX2lkeC54ID0gbG1faWR4LnggPj0gd2lkdGggPyB3aWR0aCAtIDE6IGxtX2lkeC54OwotICAgICAgICAgICAgZGF0YVtpKjE2ICsgdGhyZWFkX2lkeC55XVtqKjE2ICsgdGhyZWFkX2lkeC54XSA9IHNyY1tsbV9pZHgueSp3aWR0aCArIGxtX2lkeC54XTsKLSAgICAgICAgfQotICAgIH0KLSAgICBsb2NhbF9pZHggPSB0aHJlYWRfaWR4LnkqMTYgKyB0aHJlYWRfaWR4Lng7Ci0gICAgaWYgKGxvY2FsX2lkeCA8IDEyOCkKLSAgICAgICAgbGNbbG9jYWxfaWR4XSA9IG1hc2tbbG9jYWxfaWR4XTsKLSAgICBiYXJyaWVyKENMS19MT0NBTF9NRU1fRkVOQ0UpOwotCi0gICAgXG4jcHJhZ21hIHVucm9sbFxuCi0gICAgZm9yIChpID0gLTQ7IGkgPD0gNDsgaSsrKSB7Ci0gICAgICAgIGxtX2lkeC55ID0gOCArIGkgKyB0aHJlYWRfaWR4Lnk7Ci0gICAgICAgIFxuI3ByYWdtYSB1bnJvbGxcbgotICAgICAgICBmb3IgKGogPSAtNDsgaiA8PSA0OyBqKyspIHsKLSAgICAgICAgICAgIGxtX2lkeC54ID0gOCArIGogKyB0aHJlYWRfaWR4Lng7Ci0gICAgICAgICAgICBsY19pZHggPSAoaSArIDQpKjggKyBqICsgNDsKLSAgICAgICAgICAgIHN1bSArPSAoaW50KWRhdGFbbG1faWR4LnldW2xtX2lkeC54XSAqIGxjW2xjX2lkeF07Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IHRlbXAgPSAoaW50KWRhdGFbdGhyZWFkX2lkeC55ICsgOF1bdGhyZWFkX2lkeC54ICsgOF07Ci0gICAgaW50IHJlcyA9IHRlbXAgKyAoKCh0ZW1wIC0gKGludCkoKHN1bSArIDE8PDE1KSA+PiAxNikpKSA+PiAxNik7Ci0gICAgaWYgKGdsb2JhbF9pZHgueCA8IHdpZHRoICYmIGdsb2JhbF9pZHgueSA8IGhlaWdodCkKLSAgICAgICAgZHN0W2dsb2JhbF9pZHgueCArIGdsb2JhbF9pZHgueSp3aWR0aF0gPSBjbGlwX3VpbnQ4KHJlcyk7Ci19Ci0pOwotCi0jZGVmaW5lIE9DTENIRUNLKG1ldGhvZCwgLi4uICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0dXMgPSBtZXRob2QoX19WQV9BUkdTX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAjIG1ldGhvZCAiIGVycm9yICclcydcbiIsICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBnb3RvIGVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIENSRUFURUJVRihvdXQsIGZsYWdzLCBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvdXQgPSBjbENyZWF0ZUJ1ZmZlcihleHRfb3BlbmNsX2Vudi0+Y29udGV4dCwgZmxhZ3MsIHNpemUsIE5VTEwsICZzdGF0dXMpOyBcCi0gICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBPcGVuQ0wgYnVmZmVyXG4iKTsgICAgICAgIFwKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdvdG8gZW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkIGZpbGxfcmFuZF9pbnQoaW50ICpkYXRhLCBpbnQgbikKLXsKLSAgICBpbnQgaTsKLSAgICBzcmFuZChhdl9nZXR0aW1lKCkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICAgIGRhdGFbaV0gPSByYW5kKCk7Ci19Ci0KLSNkZWZpbmUgT1BFTkNMX05CX0lURVIgNQotc3RhdGljIGludDY0X3QgcnVuX29wZW5jbF9iZW5jaChBVk9wZW5DTEV4dGVybmFsRW52ICpleHRfb3BlbmNsX2VudikKLXsKLSAgICBpbnQgaSwgYXJnID0gMCwgd2lkdGggPSAxOTIwLCBoZWlnaHQgPSAxMDg4OwotICAgIGludDY0X3Qgc3RhcnQsIHJldCA9IDA7Ci0gICAgY2xfaW50IHN0YXR1czsKLSAgICBzaXplX3Qga2VybmVsX2xlbjsKLSAgICBjaGFyICppbmJ1ZjsKLSAgICBpbnQgKm1hc2s7Ci0gICAgaW50IGJ1Zl9zaXplID0gd2lkdGggKiBoZWlnaHQgKiBzaXplb2YoY2hhcik7Ci0gICAgaW50IG1hc2tfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKiAxMjg7Ci0KLSAgICBjbF9tZW0gY2xfbWFzaywgY2xfaW5idWYsIGNsX291dGJ1ZjsKLSAgICBjbF9rZXJuZWwga2VybmVsID0gTlVMTDsKLSAgICBjbF9wcm9ncmFtIHByb2dyYW0gPSBOVUxMOwotICAgIHNpemVfdCBsb2NhbF93b3JrX3NpemVfMmRbMl0gPSB7MTYsIDE2fTsKLSAgICBzaXplX3QgZ2xvYmFsX3dvcmtfc2l6ZV8yZFsyXSA9IHsoc2l6ZV90KXdpZHRoLCAoc2l6ZV90KWhlaWdodH07Ci0KLSAgICBpZiAoIShpbmJ1ZiA9IGF2X21hbGxvYyhidWZfc2l6ZSkpIHx8ICEobWFzayA9IGF2X21hbGxvYyhtYXNrX3NpemUpKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3V0IG9mIG1lbW9yeVxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGZpbGxfcmFuZF9pbnQoKGludCopaW5idWYsIGJ1Zl9zaXplLzQpOwotICAgIGZpbGxfcmFuZF9pbnQobWFzaywgbWFza19zaXplLzQpOwotCi0gICAgQ1JFQVRFQlVGKGNsX21hc2ssIENMX01FTV9SRUFEX09OTFksIG1hc2tfc2l6ZSk7Ci0gICAgQ1JFQVRFQlVGKGNsX2luYnVmLCBDTF9NRU1fUkVBRF9PTkxZLCBidWZfc2l6ZSk7Ci0gICAgQ1JFQVRFQlVGKGNsX291dGJ1ZiwgQ0xfTUVNX1JFQURfV1JJVEUsIGJ1Zl9zaXplKTsKLQotICAgIGtlcm5lbF9sZW4gPSBzdHJsZW4ob2NsX2JlbmNoX3NvdXJjZSk7Ci0gICAgcHJvZ3JhbSA9IGNsQ3JlYXRlUHJvZ3JhbVdpdGhTb3VyY2UoZXh0X29wZW5jbF9lbnYtPmNvbnRleHQsIDEsICZvY2xfYmVuY2hfc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXJuZWxfbGVuLCAmc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MgfHwgIXByb2dyYW0pIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCB1bmFibGUgdG8gY3JlYXRlIGJlbmNobWFyayBwcm9ncmFtXG4iKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIHN0YXR1cyA9IGNsQnVpbGRQcm9ncmFtKHByb2dyYW0sIDEsICYoZXh0X29wZW5jbF9lbnYtPmRldmljZV9pZCksIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIHVuYWJsZSB0byBidWlsZCBiZW5jaG1hcmsgcHJvZ3JhbVxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICBrZXJuZWwgPSBjbENyZWF0ZUtlcm5lbChwcm9ncmFtLCAidW5zaGFycF9iZW5jaCIsICZzdGF0dXMpOwotICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIHVuYWJsZSB0byBjcmVhdGUgYmVuY2htYXJrIGtlcm5lbFxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLQotICAgIE9DTENIRUNLKGNsRW5xdWV1ZVdyaXRlQnVmZmVyLCBleHRfb3BlbmNsX2Vudi0+Y29tbWFuZF9xdWV1ZSwgY2xfaW5idWYsIENMX1RSVUUsIDAsCi0gICAgICAgICAgICAgYnVmX3NpemUsIGluYnVmLCAwLCBOVUxMLCBOVUxMKTsKLSAgICBPQ0xDSEVDSyhjbEVucXVldWVXcml0ZUJ1ZmZlciwgZXh0X29wZW5jbF9lbnYtPmNvbW1hbmRfcXVldWUsIGNsX21hc2ssIENMX1RSVUUsIDAsCi0gICAgICAgICAgICAgbWFza19zaXplLCBtYXNrLCAwLCBOVUxMLCBOVUxMKTsKLSAgICBPQ0xDSEVDSyhjbFNldEtlcm5lbEFyZywga2VybmVsLCBhcmcrKywgc2l6ZW9mKGNsX21lbSksICZjbF9pbmJ1Zik7Ci0gICAgT0NMQ0hFQ0soY2xTZXRLZXJuZWxBcmcsIGtlcm5lbCwgYXJnKyssIHNpemVvZihjbF9tZW0pLCAmY2xfb3V0YnVmKTsKLSAgICBPQ0xDSEVDSyhjbFNldEtlcm5lbEFyZywga2VybmVsLCBhcmcrKywgc2l6ZW9mKGNsX21lbSksICZjbF9tYXNrKTsKLSAgICBPQ0xDSEVDSyhjbFNldEtlcm5lbEFyZywga2VybmVsLCBhcmcrKywgc2l6ZW9mKGNsX2ludCksICZ3aWR0aCk7Ci0gICAgT0NMQ0hFQ0soY2xTZXRLZXJuZWxBcmcsIGtlcm5lbCwgYXJnKyssIHNpemVvZihjbF9pbnQpLCAmaGVpZ2h0KTsKLQotICAgIHN0YXJ0ID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOwotICAgIGZvciAoaSA9IDA7IGkgPCBPUEVOQ0xfTkJfSVRFUjsgaSsrKQotICAgICAgICBPQ0xDSEVDSyhjbEVucXVldWVORFJhbmdlS2VybmVsLCBleHRfb3BlbmNsX2Vudi0+Y29tbWFuZF9xdWV1ZSwga2VybmVsLCAyLCBOVUxMLAotICAgICAgICAgICAgICAgICBnbG9iYWxfd29ya19zaXplXzJkLCBsb2NhbF93b3JrX3NpemVfMmQsIDAsIE5VTEwsIE5VTEwpOwotICAgIGNsRmluaXNoKGV4dF9vcGVuY2xfZW52LT5jb21tYW5kX3F1ZXVlKTsKLSAgICByZXQgPSAoYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gc3RhcnQpL09QRU5DTF9OQl9JVEVSOwotZW5kOgotICAgIGlmIChrZXJuZWwpCi0gICAgICAgIGNsUmVsZWFzZUtlcm5lbChrZXJuZWwpOwotICAgIGlmIChwcm9ncmFtKQotICAgICAgICBjbFJlbGVhc2VQcm9ncmFtKHByb2dyYW0pOwotICAgIGlmIChjbF9pbmJ1ZikKLSAgICAgICAgY2xSZWxlYXNlTWVtT2JqZWN0KGNsX2luYnVmKTsKLSAgICBpZiAoY2xfb3V0YnVmKQotICAgICAgICBjbFJlbGVhc2VNZW1PYmplY3QoY2xfb3V0YnVmKTsKLSAgICBpZiAoY2xfbWFzaykKLSAgICAgICAgY2xSZWxlYXNlTWVtT2JqZWN0KGNsX21hc2spOwotICAgIGF2X2ZyZWUoaW5idWYpOwotICAgIGF2X2ZyZWUobWFzayk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjb21wYXJlX29jbF9kZXZpY2VfZGVzYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICAgIGNvbnN0IE9wZW5DTERldmljZUJlbmNobWFyayogdmEgPSAoY29uc3QgT3BlbkNMRGV2aWNlQmVuY2htYXJrKilhOwotICAgIGNvbnN0IE9wZW5DTERldmljZUJlbmNobWFyayogdmIgPSAoY29uc3QgT3BlbkNMRGV2aWNlQmVuY2htYXJrKiliOwotICAgIHJldHVybiBGRkRJRkZTSUdOKHZhLT5ydW50aW1lICwgdmItPnJ1bnRpbWUpOwotfQotCi1pbnQgb3B0X29wZW5jbF9iZW5jaCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGludCBpLCBqLCBuYl9kZXZpY2VzID0gMCwgY291bnQgPSAwOwotICAgIGludDY0X3Qgc2NvcmUgPSAwOwotICAgIEFWT3BlbkNMRGV2aWNlTGlzdCAqZGV2aWNlX2xpc3Q7Ci0gICAgQVZPcGVuQ0xEZXZpY2VOb2RlICpkZXZpY2Vfbm9kZSA9IE5VTEw7Ci0gICAgT3BlbkNMRGV2aWNlQmVuY2htYXJrICpkZXZpY2VzID0gTlVMTDsKLSAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybTsKLQotICAgIGF2X29wZW5jbF9nZXRfZGV2aWNlX2xpc3QoJmRldmljZV9saXN0KTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX251bTsgaSsrKQotICAgICAgICBuYl9kZXZpY2VzICs9IGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2VfbnVtOwotICAgIGlmICghbmJfZGV2aWNlcykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTm8gT3BlbkNMIGRldmljZSBkZXRlY3RlZCFcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBpZiAoIShkZXZpY2VzID0gYXZfbWFsbG9jX2FycmF5KG5iX2RldmljZXMsIHNpemVvZihPcGVuQ0xEZXZpY2VCZW5jaG1hcmspKSkpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbnVtOyBpKyspIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2VfbnVtOyBqKyspIHsKLSAgICAgICAgICAgIGRldmljZV9ub2RlID0gZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9ub2RlW2pdOwotICAgICAgICAgICAgcGxhdGZvcm0gPSBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+cGxhdGZvcm1faWQ7Ci0gICAgICAgICAgICBzY29yZSA9IGF2X29wZW5jbF9iZW5jaG1hcmsoZGV2aWNlX25vZGUsIHBsYXRmb3JtLCBydW5fb3BlbmNsX2JlbmNoKTsKLSAgICAgICAgICAgIGlmIChzY29yZSA+IDApIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VzW2NvdW50XS5wbGF0Zm9ybV9pZHggPSBpOwotICAgICAgICAgICAgICAgIGRldmljZXNbY291bnRdLmRldmljZV9pZHggPSBqOwotICAgICAgICAgICAgICAgIGRldmljZXNbY291bnRdLnJ1bnRpbWUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICBhdl9zdHJsY3B5KGRldmljZXNbY291bnRdLmRldmljZV9uYW1lLCBkZXZpY2Vfbm9kZS0+ZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGV2aWNlc1tjb3VudF0uZGV2aWNlX25hbWUpKTsKLSAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHFzb3J0KGRldmljZXMsIGNvdW50LCBzaXplb2YoT3BlbkNMRGV2aWNlQmVuY2htYXJrKSwgY29tcGFyZV9vY2xfZGV2aWNlX2Rlc2MpOwotICAgIGZwcmludGYoc3RkZXJyLCAicGxhdGZvcm1faWR4XHRkZXZpY2VfaWR4XHRkZXZpY2VfbmFtZVx0cnVudGltZVxuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgIGZwcmludGYoc3Rkb3V0LCAiJWRcdCVkXHQlc1x0JSJQUklkNjQiXG4iLAotICAgICAgICAgICAgICAgIGRldmljZXNbaV0ucGxhdGZvcm1faWR4LCBkZXZpY2VzW2ldLmRldmljZV9pZHgsCi0gICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5kZXZpY2VfbmFtZSwgZGV2aWNlc1tpXS5ydW50aW1lKTsKLQotICAgIGF2X29wZW5jbF9mcmVlX2RldmljZV9saXN0KCZkZXZpY2VfbGlzdCk7Ci0gICAgYXZfZnJlZShkZXZpY2VzKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG9wdF9vcGVuY2wodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBjaGFyICprZXksICp2YWx1ZTsKLSAgICBjb25zdCBjaGFyICpvcHRzID0gYXJnOwotICAgIGludCByZXQgPSAwOwotICAgIHdoaWxlICgqb3B0cykgewotICAgICAgICByZXQgPSBhdl9vcHRfZ2V0X2tleV92YWx1ZSgmb3B0cywgIj0iLCAiOiIsIDAsICZrZXksICZ2YWx1ZSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgcmV0ID0gYXZfb3BlbmNsX3NldF9vcHRpb24oa2V5LCB2YWx1ZSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgaWYgKCpvcHRzKQotICAgICAgICAgICAgb3B0cysrOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvY29tbW9uLm1hayBiL2NvbW1vbi5tYWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjUxYzUuLjAwMDAwMDAKLS0tIGEvY29tbW9uLm1haworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0jCi0jIGNvbW1vbiBiaXRzIHVzZWQgYnkgYWxsIGxpYnJhcmllcwotIwotCi0jIGZpcnN0IHNvICJhbGwiIGJlY29tZXMgZGVmYXVsdCB0YXJnZXQKLWFsbDogYWxsLXllcwotCi1ERUZBVUxUX1lBU01EPS5kYmcKLQotaWZlcSAoJChEQkcpLDEpCi1ZQVNNRD0kKERFRkFVTFRfWUFTTUQpCi1lbHNlCi1ZQVNNRD0KLWVuZGlmCi0KLWlmbmRlZiBTVUJESVIKLQotaWZuZGVmIFYKLVEgICAgICA9IEAKLUVDSE8gICA9IHByaW50ZiAiJCgxKVx0JXNcbiIgJCgyKQotQlJJRUYgID0gQ0MgQ1hYIE9CSkNDIEhPU1RDQyBIT1NUTEQgQVMgWUFTTSBBUiBMRCBTVFJJUCBDUCBXSU5EUkVTCi1TSUxFTlQgPSBERVBDQyBERVBIT1NUQ0MgREVQQVMgREVQWUFTTSBSQU5MSUIgUk0KLQotTVNHICAgID0gJEAKLU0gICAgICA9IEAkKGNhbGwgRUNITywkKFRBRyksJEApOwotJChmb3JlYWNoIFZBUiwkKEJSSUVGKSwgXAotICAgICQoZXZhbCBvdmVycmlkZSAkKFZBUikgPSBAJCQoY2FsbCBFQ0hPLCQoVkFSKSwkJChNU0cpKTsgJCgkKFZBUikpKSkKLSQoZm9yZWFjaCBWQVIsJChTSUxFTlQpLCQoZXZhbCBvdmVycmlkZSAkKFZBUikgPSBAJCgkKFZBUikpKSkKLSQoZXZhbCBJTlNUQUxMID0gQCQoY2FsbCBFQ0hPLElOU1RBTEwsJCQoXjokKFNSQ19ESVIpLyU9JSkpOyAkKElOU1RBTEwpKQotZW5kaWYKLQotQUxMRkZMSUJTID0gYXZjb2RlYyBhdmRldmljZSBhdmZpbHRlciBhdmZvcm1hdCBhdnJlc2FtcGxlIGF2dXRpbCBwb3N0cHJvYyBzd3NjYWxlIHN3cmVzYW1wbGUKLQotIyBOQVNNIHJlcXVpcmVzIC1JIHBhdGggdGVybWluYXRlZCB3aXRoIC8KLUlGTEFHUyAgICAgOj0gLUkuIC1JJChTUkNfTElOSykvCi1DUFBGTEFHUyAgIDo9ICQoSUZMQUdTKSAkKENQUEZMQUdTKQotQ0ZMQUdTICAgICArPSAkKEVDRkxBR1MpCi1DQ0ZMQUdTICAgICA9ICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKQotT0JKQ0ZMQUdTICArPSAkKEVPQkpDRkxBR1MpCi1PQkpDQ0ZMQUdTICA9ICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKE9CSkNGTEFHUykKLUFTRkxBR1MgICAgOj0gJChDUFBGTEFHUykgJChBU0ZMQUdTKQotQ1hYRkxBR1MgICArPSAkKENQUEZMQUdTKSAkKENGTEFHUykKLVlBU01GTEFHUyAgKz0gJChJRkxBR1M6JT0lLykgLVBjb25maWcuYXNtCi0KLUhPU1RDQ0ZMQUdTID0gJChJRkxBR1MpICQoSE9TVENQUEZMQUdTKSAkKEhPU1RDRkxBR1MpCi1MREZMQUdTICAgIDo9ICQoQUxMRkZMSUJTOiU9JChMRF9QQVRIKWxpYiUpICQoTERGTEFHUykKLQotZGVmaW5lIENPTVBJTEUKLSAgICAgICAkKGNhbGwgJCgxKURFUCwkKDEpKQotICAgICAgICQoJCgxKSkgJCgkKDEpRkxBR1MpICQoJCgxKV9ERVBGTEFHUykgJCgkKDEpX0MpICQoJCgxKV9PKSAkKHBhdHN1YnN0ICQoU1JDX1BBVEgpLyUsJChTUkNfTElOSykvJSwkPCkKLWVuZGVmCi0KLUNPTVBJTEVfQyA9ICQoY2FsbCBDT01QSUxFLENDKQotQ09NUElMRV9DWFggPSAkKGNhbGwgQ09NUElMRSxDWFgpCi1DT01QSUxFX1MgPSAkKGNhbGwgQ09NUElMRSxBUykKLUNPTVBJTEVfTSA9ICQoY2FsbCBDT01QSUxFLE9CSkNDKQotQ09NUElMRV9IT1NUQyA9ICQoY2FsbCBDT01QSUxFLEhPU1RDQykKLQotJS5vOiAlLmMKLQkkKENPTVBJTEVfQykKLQotJS5vOiAlLmNwcAotCSQoQ09NUElMRV9DWFgpCi0KLSUubzogJS5tCi0JJChDT01QSUxFX00pCi0KLSUuczogJS5jCi0JJChDQykgJChDQ0ZMQUdTKSAtUyAtbyAkQCAkPAotCi0lLm86ICUuUwotCSQoQ09NUElMRV9TKQotCi0lX2hvc3QubzogJS5jCi0JJChDT01QSUxFX0hPU1RDKQotCi0lLm86ICUucmMKLQkkKFdJTkRSRVMpICQoSUZMQUdTKSAtLXByZXByb2Nlc3NvciAiJChERVBXSU5EUkVTKSAtRSAteGMtaGVhZGVyIC1EUkNfSU5WT0tFRCAkKENDX0RFUEZMQUdTKSIgLW8gJEAgJDwKLQotJS5pOiAlLmMKLQkkKENDKSAkKENDRkxBR1MpICQoQ0NfRSkgJDwKLQotJS5oLmM6Ci0JJChRKWVjaG8gJyNpbmNsdWRlICIkKi5oIicgPiRACi0KLSUudmVyOiAlLnYKLQkkKFEpc2VkICdzLyQkTUFKT1IvJCgkKGJhc2VuYW1lICQoQEYpKV9WRVJTSU9OX01BSk9SKS8nICReIHwgc2VkIC1lICdzLzovOlwKLS8nIC1lICdzLzsgLztcCi0vZycgPiAkQAotCi0lLmMgJS5oOiBUQUcgPSBHRU4KLQotIyBEdW1teSBydWxlIHRvIHN0b3AgbWFrZSB0cnlpbmcgdG8gcmVidWlsZCByZW1vdmVkIG9yIHJlbmFtZWQgaGVhZGVycwotJS5oOgotCUA6Ci0KLSMgRGlzYWJsZSBzdWZmaXggcnVsZXMuICBNb3N0IG9mIHRoZSBidWlsdGluIHJ1bGVzIGFyZSBzdWZmaXggcnVsZXMsCi0jIHNvIHRoaXMgc2F2ZXMgc29tZSB0aW1lIG9uIHNsb3cgc3lzdGVtcy4KLS5TVUZGSVhFUzoKLQotIyBEbyBub3QgZGVsZXRlIGludGVybWVkaWF0ZSBmaWxlcyBmcm9tIGNoYWlucyBvZiBpbXBsaWNpdCBydWxlcwotJChPQkpTKToKLWVuZGlmCi0KLWluY2x1ZGUgJChTUkNfUEFUSCkvYXJjaC5tYWsKLQotT0JKUyAgICAgICs9ICQoT0JKUy15ZXMpCi1TTElCT0JKUyAgKz0gJChTTElCT0JKUy15ZXMpCi1GRkxJQlMgICAgOj0gJCgkKE5BTUUpX0ZGTElCUykgJChGRkxJQlMteWVzKSAkKEZGTElCUykKLVRFU1RQUk9HUyArPSAkKFRFU1RQUk9HUy15ZXMpCi0KLUxETElCUyAgICAgICA9ICQoRkZMSUJTOiU9JSQoQlVJTERTVUYpKQotRkZFWFRSQUxJQlMgOj0gJChMRExJQlM6JT0kKExEX0xJQikpICQoRVhUUkFMSUJTKQotCi1PQkpTICAgICAgOj0gJChzb3J0ICQoT0JKUzolPSQoU1VCRElSKSUpKQotU0xJQk9CSlMgIDo9ICQoc29ydCAkKFNMSUJPQkpTOiU9JChTVUJESVIpJSkpCi1URVNUT0JKUyAgOj0gJChURVNUT0JKUzolPSQoU1VCRElSKSUpICQoVEVTVFBST0dTOiU9JChTVUJESVIpJS10ZXN0Lm8pCi1URVNUUFJPR1MgOj0gJChURVNUUFJPR1M6JT0kKFNVQkRJUiklLXRlc3QkKEVYRVNVRikpCi1IT1NUT0JKUyAgOj0gJChIT1NUUFJPR1M6JT0kKFNVQkRJUiklLm8pCi1IT1NUUFJPR1MgOj0gJChIT1NUUFJPR1M6JT0kKFNVQkRJUiklJChIT1NURVhFU1VGKSkKLVRPT0xTICAgICArPSAkKFRPT0xTLXllcykKLVRPT0xPQkpTICA6PSAkKFRPT0xTOiU9dG9vbHMvJS5vKQotVE9PTFMgICAgIDo9ICQoVE9PTFM6JT10b29scy8lJChFWEVTVUYpKQotSEVBREVSUyAgICs9ICQoSEVBREVSUy15ZXMpCi0KLVBBVEhfTElCTkFNRSA9ICQoZm9yZWFjaCBOQU1FLCQoMSksbGliJChOQU1FKS8kKCQoMilMSUJOQU1FKSkKLURFUF9MSUJTIDo9ICQoZm9yZWFjaCBsaWIsJChGRkxJQlMpLCQoY2FsbCBQQVRIX0xJQk5BTUUsJChsaWIpLCQoQ09ORklHX1NIQVJFRDp5ZXM9UykpKQotU1RBVElDX0RFUF9MSUJTIDo9ICQoZm9yZWFjaCBsaWIsJChGRkxJQlMpLCQoY2FsbCBQQVRIX0xJQk5BTUUsJChsaWIpKSkKLQotU1JDX0RJUiAgICA6PSAkKFNSQ19QQVRIKS9saWIkKE5BTUUpCi1BTExIRUFERVJTIDo9ICQoc3Vic3QgJChTUkNfRElSKS8sJChTVUJESVIpLCQod2lsZGNhcmQgJChTUkNfRElSKS8qLmggJChTUkNfRElSKS8kKEFSQ0gpLyouaCkpCi1TS0lQSEVBREVSUyArPSAkKEFSQ0hfSEVBREVSUzolPSQoQVJDSCkvJSkgJChTS0lQSEVBREVSUy0pCi1TS0lQSEVBREVSUyA6PSAkKFNLSVBIRUFERVJTOiU9JChTVUJESVIpJSkKLUhPQkpTICAgICAgICA9ICQoZmlsdGVyLW91dCAkKFNLSVBIRUFERVJTOi5oPS5oLm8pLCQoQUxMSEVBREVSUzouaD0uaC5vKSkKLWNoZWNraGVhZGVyczogJChIT0JKUykKLS5TRUNPTkRBUlk6ICAgJChIT0JKUzoubz0uYykKLQotYWxsdG9vbHM6ICQoVE9PTFMpCi0KLSQoSE9TVE9CSlMpOiAlLm86ICUuYwotCSQoQ09NUElMRV9IT1NUQykKLQotJChIT1NUUFJPR1MpOiAlJChIT1NURVhFU1VGKTogJS5vCi0JJChIT1NUTEQpICQoSE9TVExERkxBR1MpICQoSE9TVExEX08pICReICQoSE9TVExJQlMpCi0KLSQoT0JKUyk6ICAgICB8ICQoc29ydCAkKGRpciAkKE9CSlMpKSkKLSQoSE9CSlMpOiAgICB8ICQoc29ydCAkKGRpciAkKEhPQkpTKSkpCi0kKEhPU1RPQkpTKTogfCAkKHNvcnQgJChkaXIgJChIT1NUT0JKUykpKQotJChTTElCT0JKUyk6IHwgJChzb3J0ICQoZGlyICQoU0xJQk9CSlMpKSkKLSQoVEVTVE9CSlMpOiB8ICQoc29ydCAkKGRpciAkKFRFU1RPQkpTKSkpCi0kKFRPT0xPQkpTKTogfCB0b29scwotCi1PQkpESVJTIDo9ICQoT0JKRElSUykgJChkaXIgJChPQkpTKSAkKEhPQkpTKSAkKEhPU1RPQkpTKSAkKFNMSUJPQkpTKSAkKFRFU1RPQkpTKSkKLQotQ0xFQU5TVUZGSVhFUyAgICAgPSAqLmQgKi5vICp+ICouaC5jICoubWFwICoudmVyICoudmVyLXNvbDIgKi5obyAqLmdjbm8gKi5nY2RhICokKERFRkFVTFRfWUFTTUQpLmFzbQotRElTVENMRUFOU1VGRklYRVMgPSAqLnBjCi1MSUJTVUZGSVhFUyAgICAgICA9ICouYSAqLmxpYiAqLnNvICouc28uKiAqLmR5bGliICouZGxsICouZGVmICouZGxsLmEKLQotZGVmaW5lIFJVTEVTCi1jbGVhbjo6Ci0JJChSTSkgJChPQkpTKSAkKE9CSlM6Lm89LmQpICQoT0JKUzoubz0kKERFRkFVTFRfWUFTTUQpLmQpCi0JJChSTSkgJChIT1NUUFJPR1MpCi0JJChSTSkgJChUT09MUykKLWVuZGVmCi0KLSQoZXZhbCAkKFJVTEVTKSkKLQotLWluY2x1ZGUgJCh3aWxkY2FyZCAkKE9CSlM6Lm89LmQpICQoSE9TVE9CSlM6Lm89LmQpICQoVEVTVE9CSlM6Lm89LmQpICQoSE9CSlM6Lm89LmQpICQoU0xJQk9CSlM6Lm89LmQpKSAkKE9CSlM6Lm89JChERUZBVUxUX1lBU01EKS5kKQpkaWZmIC0tZ2l0IGEvY29tcGF0L2F0b21pY3MvZHVtbXkvc3RkYXRvbWljLmggYi9jb21wYXQvYXRvbWljcy9kdW1teS9zdGRhdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ4NWY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L2F0b21pY3MvZHVtbXkvc3RkYXRvbWljLmgKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIGJhc2VkIG9uIHZsY19hdG9taWMuaCBmcm9tIFZMQworICogQ29weXJpZ2h0IChDKSAyMDEwIFLDqW1pIERlbmlzLUNvdXJtb250CisgKi8KKworI2lmbmRlZiBDT01QQVRfQVRPTUlDU19EVU1NWV9TVERBVE9NSUNfSAorI2RlZmluZSBDT01QQVRfQVRPTUlDU19EVU1NWV9TVERBVE9NSUNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgQVRPTUlDX0ZMQUdfSU5JVCAwCisKKyNkZWZpbmUgQVRPTUlDX1ZBUl9JTklUKHZhbHVlKSAodmFsdWUpCisKKyNkZWZpbmUgYXRvbWljX2luaXQob2JqLCB2YWx1ZSkgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKihvYmopID0gKHZhbHVlKTsgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBraWxsX2RlcGVuZGVuY3koeSkgKCh2b2lkKTApCisKKyNkZWZpbmUgYXRvbWljX3RocmVhZF9mZW5jZShvcmRlcikgXAorICAgICgodm9pZCkwKQorCisjZGVmaW5lIGF0b21pY19zaWduYWxfZmVuY2Uob3JkZXIpIFwKKyAgICAoKHZvaWQpMCkKKworI2RlZmluZSBhdG9taWNfaXNfbG9ja19mcmVlKG9iaikgMAorCit0eXBlZGVmIGludHB0cl90IGF0b21pY19mbGFnOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfYm9vbDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2NoYXI7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19zY2hhcjsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VjaGFyOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfc2hvcnQ7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191c2hvcnQ7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnQ7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfbG9uZzsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3Vsb25nOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfbGxvbmc7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191bGxvbmc7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY193Y2hhcl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2xlYXN0OF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9sZWFzdDhfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9sZWFzdDY0X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9mYXN0OF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9mYXN0OF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2Zhc3QxNl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9mYXN0MTZfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9mYXN0MzJfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfZmFzdDY0X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2Zhc3Q2NF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50cHRyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50cHRyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19zaXplX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19wdHJkaWZmX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRtYXhfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRtYXhfdDsKKworI2RlZmluZSBhdG9taWNfc3RvcmUob2JqZWN0LCBkZXNpcmVkKSAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKihvYmplY3QpID0gKGRlc2lyZWQpOyAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBhdG9taWNfc3RvcmVfZXhwbGljaXQob2JqZWN0LCBkZXNpcmVkLCBvcmRlcikgXAorICAgIGF0b21pY19zdG9yZShvYmplY3QsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2xvYWQob2JqZWN0KSBcCisgICAgKCoob2JqZWN0KSkKKworI2RlZmluZSBhdG9taWNfbG9hZF9leHBsaWNpdChvYmplY3QsIG9yZGVyKSBcCisgICAgYXRvbWljX2xvYWQob2JqZWN0KQorCitzdGF0aWMgaW5saW5lIGludHB0cl90IGF0b21pY19leGNoYW5nZShpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBkZXNpcmVkKQoreworICAgIGludHB0cl90IHJldCA9ICpvYmplY3Q7CisgICAgKm9iamVjdCA9IGRlc2lyZWQ7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQob2JqZWN0LCBkZXNpcmVkLCBvcmRlcikgXAorICAgIGF0b21pY19leGNoYW5nZShvYmplY3QsIGRlc2lyZWQpCisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgZGVzaXJlZCkKK3sKKyAgICBpbnQgcmV0OworICAgIGlmICgqb2JqZWN0ID09ICpleHBlY3RlZCkgeworICAgICAgICAqb2JqZWN0ID0gZGVzaXJlZDsKKyAgICAgICAgcmV0ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZXhwZWN0ZWQgPSAqb2JqZWN0OworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkLCBzdWNjZXNzLCBmYWlsdXJlKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkLCBzdWNjZXNzLCBmYWlsdXJlKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKQorCisjZGVmaW5lIEZFVENIX01PRElGWShvcG5hbWUsIG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGlubGluZSBpbnRwdHJfdCBhdG9taWNfZmV0Y2hfICMjIG9wbmFtZShpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBvcGVyYW5kKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50cHRyX3QgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ID0gKm9iamVjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKm9iamVjdCA9ICpvYmplY3Qgb3Agb3BlcmFuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0ZFVENIX01PRElGWShhZGQsICspCitGRVRDSF9NT0RJRlkoc3ViLCAtKQorRkVUQ0hfTU9ESUZZKG9yLCAgfCkKK0ZFVENIX01PRElGWSh4b3IsIF4pCitGRVRDSF9NT0RJRlkoYW5kLCAmKQorCisjdW5kZWYgRkVUQ0hfTU9ESUZZCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdChvYmplY3QsIG9wZXJhbmQsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZldGNoX2FkZChvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdChvYmplY3QsIG9wZXJhbmQsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZldGNoX3N1YihvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KG9iamVjdCwgb3BlcmFuZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmV0Y2hfb3Iob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF94b3JfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF94b3Iob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9hbmRfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9hbmQob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldChvYmplY3QpIFwKKyAgICBhdG9taWNfZXhjaGFuZ2Uob2JqZWN0LCAxKQorCisjZGVmaW5lIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldF9leHBsaWNpdChvYmplY3QsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0KG9iamVjdCkKKworI2RlZmluZSBhdG9taWNfZmxhZ19jbGVhcihvYmplY3QpIFwKKyAgICBhdG9taWNfc3RvcmUob2JqZWN0LCAwKQorCisjZGVmaW5lIGF0b21pY19mbGFnX2NsZWFyX2V4cGxpY2l0KG9iamVjdCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmxhZ19jbGVhcihvYmplY3QpCisKKyNlbmRpZiAvKiBDT01QQVRfQVRPTUlDU19EVU1NWV9TVERBVE9NSUNfSCAqLwpkaWZmIC0tZ2l0IGEvY29tcGF0L2F0b21pY3MvZ2NjL3N0ZGF0b21pYy5oIGIvY29tcGF0L2F0b21pY3MvZ2NjL3N0ZGF0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxM2VkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvYXRvbWljcy9nY2Mvc3RkYXRvbWljLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIGJhc2VkIG9uIHZsY19hdG9taWMuaCBmcm9tIFZMQworICogQ29weXJpZ2h0IChDKSAyMDEwIFLDqW1pIERlbmlzLUNvdXJtb250CisgKi8KKworI2lmbmRlZiBDT01QQVRfQVRPTUlDU19HQ0NfU1REQVRPTUlDX0gKKyNkZWZpbmUgQ09NUEFUX0FUT01JQ1NfR0NDX1NUREFUT01JQ19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBBVE9NSUNfRkxBR19JTklUIDAKKworI2RlZmluZSBBVE9NSUNfVkFSX0lOSVQodmFsdWUpICh2YWx1ZSkKKworI2RlZmluZSBhdG9taWNfaW5pdChvYmosIHZhbHVlKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKG9iaikgPSAodmFsdWUpOyAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIGtpbGxfZGVwZW5kZW5jeSh5KSAoKHZvaWQpMCkKKworI2RlZmluZSBhdG9taWNfdGhyZWFkX2ZlbmNlKG9yZGVyKSBcCisgICAgX19zeW5jX3N5bmNocm9uaXplKCkKKworI2RlZmluZSBhdG9taWNfc2lnbmFsX2ZlbmNlKG9yZGVyKSBcCisgICAgKCh2b2lkKTApCisKKyNkZWZpbmUgYXRvbWljX2lzX2xvY2tfZnJlZShvYmopIDAKKwordHlwZWRlZiAgICAgICAgIF9Cb29sICAgICAgYXRvbWljX2ZsYWc7Cit0eXBlZGVmICAgICAgICAgX0Jvb2wgICAgICBhdG9taWNfYm9vbDsKK3R5cGVkZWYgICAgICAgICAgY2hhciAgICAgIGF0b21pY19jaGFyOwordHlwZWRlZiAgIHNpZ25lZCBjaGFyICAgICAgYXRvbWljX3NjaGFyOwordHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgYXRvbWljX3VjaGFyOwordHlwZWRlZiAgICAgICAgICBzaG9ydCAgICAgYXRvbWljX3Nob3J0OwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAgYXRvbWljX3VzaG9ydDsKK3R5cGVkZWYgICAgICAgICAgaW50ICAgICAgIGF0b21pY19pbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBhdG9taWNfdWludDsKK3R5cGVkZWYgICAgICAgICAgbG9uZyAgICAgIGF0b21pY19sb25nOwordHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgYXRvbWljX3Vsb25nOwordHlwZWRlZiAgICAgICAgICBsb25nIGxvbmcgYXRvbWljX2xsb25nOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgYXRvbWljX3VsbG9uZzsKK3R5cGVkZWYgICAgICAgICAgd2NoYXJfdCAgIGF0b21pY193Y2hhcl90OwordHlwZWRlZiAgICAgICBpbnRfbGVhc3Q4X3QgYXRvbWljX2ludF9sZWFzdDhfdDsKK3R5cGVkZWYgICAgICB1aW50X2xlYXN0OF90IGF0b21pY191aW50X2xlYXN0OF90OwordHlwZWRlZiAgICAgIGludF9sZWFzdDE2X3QgYXRvbWljX2ludF9sZWFzdDE2X3Q7Cit0eXBlZGVmICAgICB1aW50X2xlYXN0MTZfdCBhdG9taWNfdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmICAgICAgaW50X2xlYXN0MzJfdCBhdG9taWNfaW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgICAgIHVpbnRfbGVhc3QzMl90IGF0b21pY191aW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgICAgICBpbnRfbGVhc3Q2NF90IGF0b21pY19pbnRfbGVhc3Q2NF90OwordHlwZWRlZiAgICAgdWludF9sZWFzdDY0X3QgYXRvbWljX3VpbnRfbGVhc3Q2NF90OwordHlwZWRlZiAgICAgICBpbnRfZmFzdDhfdCBhdG9taWNfaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmICAgICAgdWludF9mYXN0OF90IGF0b21pY191aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmICAgICAgaW50X2Zhc3QxNl90IGF0b21pY19pbnRfZmFzdDE2X3Q7Cit0eXBlZGVmICAgICB1aW50X2Zhc3QxNl90IGF0b21pY191aW50X2Zhc3QxNl90OwordHlwZWRlZiAgICAgIGludF9mYXN0MzJfdCBhdG9taWNfaW50X2Zhc3QzMl90OwordHlwZWRlZiAgICAgdWludF9mYXN0MzJfdCBhdG9taWNfdWludF9mYXN0MzJfdDsKK3R5cGVkZWYgICAgICBpbnRfZmFzdDY0X3QgYXRvbWljX2ludF9mYXN0NjRfdDsKK3R5cGVkZWYgICAgIHVpbnRfZmFzdDY0X3QgYXRvbWljX3VpbnRfZmFzdDY0X3Q7Cit0eXBlZGVmICAgICAgICAgIGludHB0cl90IGF0b21pY19pbnRwdHJfdDsKK3R5cGVkZWYgICAgICAgICB1aW50cHRyX3QgYXRvbWljX3VpbnRwdHJfdDsKK3R5cGVkZWYgICAgICAgICAgICBzaXplX3QgYXRvbWljX3NpemVfdDsKK3R5cGVkZWYgICAgICAgICBwdHJkaWZmX3QgYXRvbWljX3B0cmRpZmZfdDsKK3R5cGVkZWYgICAgICAgICAgaW50bWF4X3QgYXRvbWljX2ludG1heF90OwordHlwZWRlZiAgICAgICAgIHVpbnRtYXhfdCBhdG9taWNfdWludG1heF90OworCisjZGVmaW5lIGF0b21pY19zdG9yZShvYmplY3QsIGRlc2lyZWQpICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKG9iamVjdCkgPSAoZGVzaXJlZCk7ICAgICAgICAgICAgICBcCisgICAgX19zeW5jX3N5bmNocm9uaXplKCk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBhdG9taWNfc3RvcmVfZXhwbGljaXQob2JqZWN0LCBkZXNpcmVkLCBvcmRlcikgXAorICAgIGF0b21pY19zdG9yZShvYmplY3QsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2xvYWQob2JqZWN0KSBcCisgICAgKF9fc3luY19zeW5jaHJvbml6ZSgpLCAqKG9iamVjdCkpCisKKyNkZWZpbmUgYXRvbWljX2xvYWRfZXhwbGljaXQob2JqZWN0LCBvcmRlcikgXAorICAgIGF0b21pY19sb2FkKG9iamVjdCkKKworI2RlZmluZSBhdG9taWNfZXhjaGFuZ2Uob2JqZWN0LCBkZXNpcmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX3R5cGVvZl9fKG9iamVjdCkgX29iaiA9IChvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdHlwZW9mX18oKm9iamVjdCkgX29sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX29sZCA9IGF0b21pY19sb2FkKF9vYmopOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICghX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcChfb2JqLCBfb2xkLCAoZGVzaXJlZCkpKTsgICBcCisgICAgX29sZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKyNkZWZpbmUgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KG9iamVjdCwgZGVzaXJlZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZXhjaGFuZ2Uob2JqZWN0LCBkZXNpcmVkKQorCisjZGVmaW5lIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKSAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fdHlwZW9mX18ob2JqZWN0KSBfZXhwID0gKGV4cGVjdGVkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX190eXBlb2ZfXygqb2JqZWN0KSBfb2xkID0gKl9leHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqX2V4cCA9IF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCgob2JqZWN0KSwgX29sZCwgKGRlc2lyZWQpKTsgXAorICAgICpfZXhwID09IF9vbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkLCBzdWNjZXNzLCBmYWlsdXJlKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkLCBzdWNjZXNzLCBmYWlsdXJlKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9hZGQob2JqZWN0LCBvcGVyYW5kKSBcCisgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9hZGQob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9zdWIob2JqZWN0LCBvcGVyYW5kKSBcCisgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9zdWIob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9vcihvYmplY3QsIG9wZXJhbmQpIFwKKyAgICBfX3N5bmNfZmV0Y2hfYW5kX29yKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9vcihvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX3hvcihvYmplY3QsIG9wZXJhbmQpIFwKKyAgICBfX3N5bmNfZmV0Y2hfYW5kX3hvcihvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdChvYmplY3QsIG9wZXJhbmQsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZldGNoX3hvcihvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2FuZChvYmplY3QsIG9wZXJhbmQpIFwKKyAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZChvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdChvYmplY3QsIG9wZXJhbmQsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZldGNoX2FuZChvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0KG9iamVjdCkgXAorICAgIGF0b21pY19leGNoYW5nZShvYmplY3QsIDEpCisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KG9iamVjdCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXQob2JqZWN0KQorCisjZGVmaW5lIGF0b21pY19mbGFnX2NsZWFyKG9iamVjdCkgXAorICAgIGF0b21pY19zdG9yZShvYmplY3QsIDApCisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQob2JqZWN0LCBvcmRlcikgXAorICAgIGF0b21pY19mbGFnX2NsZWFyKG9iamVjdCkKKworI2VuZGlmIC8qIENPTVBBVF9BVE9NSUNTX0dDQ19TVERBVE9NSUNfSCAqLwpkaWZmIC0tZ2l0IGEvY29tcGF0L2F0b21pY3MvcHRocmVhZC9zdGRhdG9taWMuYyBiL2NvbXBhdC9hdG9taWNzL3B0aHJlYWQvc3RkYXRvbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjYTk4OQotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9hdG9taWNzL3B0aHJlYWQvc3RkYXRvbWljLmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogYmFzZWQgb24gdmxjX2F0b21pYy5oIGZyb20gVkxDCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUsOpbWkgRGVuaXMtQ291cm1vbnQKKyAqLworCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAic3RkYXRvbWljLmgiCisKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgYXRvbWljX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOworCit2b2lkIGF2cHJpdl9hdG9taWNfbG9jayh2b2lkKQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYXRvbWljX2xvY2spOworfQorCit2b2lkIGF2cHJpdl9hdG9taWNfdW5sb2NrKHZvaWQpCit7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmF0b21pY19sb2NrKTsKK30KZGlmZiAtLWdpdCBhL2NvbXBhdC9hdG9taWNzL3B0aHJlYWQvc3RkYXRvbWljLmggYi9jb21wYXQvYXRvbWljcy9wdGhyZWFkL3N0ZGF0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTYwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvYXRvbWljcy9wdGhyZWFkL3N0ZGF0b21pYy5oCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBiYXNlZCBvbiB2bGNfYXRvbWljLmggZnJvbSBWTEMKKyAqIENvcHlyaWdodCAoQykgMjAxMCBSw6ltaSBEZW5pcy1Db3VybW9udAorICovCisKKyNpZm5kZWYgQ09NUEFUX0FUT01JQ1NfUFRIUkVBRF9TVERBVE9NSUNfSAorI2RlZmluZSBDT01QQVRfQVRPTUlDU19QVEhSRUFEX1NUREFUT01JQ19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBBVE9NSUNfRkxBR19JTklUIDAKKworI2RlZmluZSBBVE9NSUNfVkFSX0lOSVQodmFsdWUpICh2YWx1ZSkKKworI2RlZmluZSBhdG9taWNfaW5pdChvYmosIHZhbHVlKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKG9iaikgPSAodmFsdWUpOyAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIGtpbGxfZGVwZW5kZW5jeSh5KSAoKHZvaWQpMCkKKworI2RlZmluZSBhdG9taWNfc2lnbmFsX2ZlbmNlKG9yZGVyKSBcCisgICAgKCh2b2lkKTApCisKKyNkZWZpbmUgYXRvbWljX2lzX2xvY2tfZnJlZShvYmopIDAKKwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfZmxhZzsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2Jvb2w7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19jaGFyOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfc2NoYXI7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191Y2hhcjsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3Nob3J0OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdXNob3J0OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2xvbmc7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191bG9uZzsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2xsb25nOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWxsb25nOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfd2NoYXJfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9sZWFzdDhfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfbGVhc3QxNl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfbGVhc3QzMl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfbGVhc3Q2NF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9sZWFzdDY0X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfZmFzdDhfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfZmFzdDhfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9mYXN0MTZfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2Zhc3QzMl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2Zhc3Q2NF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9mYXN0NjRfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludHB0cl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludHB0cl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfc2l6ZV90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfcHRyZGlmZl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50bWF4X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50bWF4X3Q7CisKK3ZvaWQgYXZwcml2X2F0b21pY19sb2NrKHZvaWQpOwordm9pZCBhdnByaXZfYXRvbWljX3VubG9jayh2b2lkKTsKKworc3RhdGljIGlubGluZSB2b2lkIGF0b21pY190aHJlYWRfZmVuY2UoaW50IG9yZGVyKQoreworICAgIGF2cHJpdl9hdG9taWNfbG9jaygpOworICAgIGF2cHJpdl9hdG9taWNfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc3RvcmUoaW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3QgZGVzaXJlZCkKK3sKKyAgICBhdnByaXZfYXRvbWljX2xvY2soKTsKKyAgICAqb2JqZWN0ID0gZGVzaXJlZDsKKyAgICBhdnByaXZfYXRvbWljX3VubG9jaygpOworfQorCisjZGVmaW5lIGF0b21pY19zdG9yZV9leHBsaWNpdChvYmplY3QsIGRlc2lyZWQsIG9yZGVyKSBcCisgICAgYXRvbWljX3N0b3JlKG9iamVjdCwgZGVzaXJlZCkKKworc3RhdGljIGlubGluZSBpbnRwdHJfdCBhdG9taWNfbG9hZChpbnRwdHJfdCAqb2JqZWN0KQoreworICAgIGludHB0cl90IHJldDsKKyAgICBhdnByaXZfYXRvbWljX2xvY2soKTsKKyAgICByZXQgPSAqb2JqZWN0OworICAgIGF2cHJpdl9hdG9taWNfdW5sb2NrKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBhdG9taWNfbG9hZF9leHBsaWNpdChvYmplY3QsIG9yZGVyKSBcCisgICAgYXRvbWljX2xvYWQob2JqZWN0KQorCitzdGF0aWMgaW5saW5lIGludHB0cl90IGF0b21pY19leGNoYW5nZShpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCBkZXNpcmVkKQoreworICAgIGludHB0cl90IHJldDsKKyAgICBhdnByaXZfYXRvbWljX2xvY2soKTsKKyAgICByZXQgICAgID0gKm9iamVjdDsKKyAgICAqb2JqZWN0ID0gZGVzaXJlZDsKKyAgICBhdnByaXZfYXRvbWljX3VubG9jaygpOworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KG9iamVjdCwgZGVzaXJlZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZXhjaGFuZ2Uob2JqZWN0LCBkZXNpcmVkKQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoaW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3QgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGRlc2lyZWQpCit7CisgICAgaW50IHJldDsKKyAgICBhdnByaXZfYXRvbWljX2xvY2soKTsKKyAgICBpZiAoKm9iamVjdCA9PSAqZXhwZWN0ZWQpIHsKKyAgICAgICAgcmV0ICAgICA9IDE7CisgICAgICAgICpvYmplY3QgPSBkZXNpcmVkOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgICpleHBlY3RlZCA9ICpvYmplY3Q7CisgICAgfQorICAgIGF2cHJpdl9hdG9taWNfdW5sb2NrKCk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmdfZXhwbGljaXQob2JqZWN0LCBleHBlY3RlZCwgZGVzaXJlZCwgc3VjY2VzcywgZmFpbHVyZSkgXAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKQorCisjZGVmaW5lIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsob2JqZWN0LCBleHBlY3RlZCwgZGVzaXJlZCkgXAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKQorCisjZGVmaW5lIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWtfZXhwbGljaXQob2JqZWN0LCBleHBlY3RlZCwgZGVzaXJlZCwgc3VjY2VzcywgZmFpbHVyZSkgXAorICAgIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3dlYWsob2JqZWN0LCBleHBlY3RlZCwgZGVzaXJlZCkKKworI2RlZmluZSBGRVRDSF9NT0RJRlkob3BuYW1lLCBvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW5saW5lIGludHB0cl90IGF0b21pY19mZXRjaF8gIyMgb3BuYW1lKGludHB0cl90ICpvYmplY3QsIGludHB0cl90IG9wZXJhbmQpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludHB0cl90IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZwcml2X2F0b21pY19sb2NrKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSAqb2JqZWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpvYmplY3QgPSAqb2JqZWN0IG9wIG9wZXJhbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZwcml2X2F0b21pY191bmxvY2soKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitGRVRDSF9NT0RJRlkoYWRkLCArKQorRkVUQ0hfTU9ESUZZKHN1YiwgLSkKK0ZFVENIX01PRElGWShvciwgIHwpCitGRVRDSF9NT0RJRlkoeG9yLCBeKQorRkVUQ0hfTU9ESUZZKGFuZCwgJikKKworI3VuZGVmIEZFVENIX01PRElGWQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9hZGQob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9zdWIob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdChvYmplY3QsIG9wZXJhbmQsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZldGNoX29yKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KG9iamVjdCwgb3BlcmFuZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmV0Y2hfeG9yKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KG9iamVjdCwgb3BlcmFuZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmV0Y2hfYW5kKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXQob2JqZWN0KSBcCisgICAgYXRvbWljX2V4Y2hhbmdlKG9iamVjdCwgMSkKKworI2RlZmluZSBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQob2JqZWN0LCBvcmRlcikgXAorICAgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldChvYmplY3QpCisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfY2xlYXIob2JqZWN0KSBcCisgICAgYXRvbWljX3N0b3JlKG9iamVjdCwgMCkKKworI2RlZmluZSBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChvYmplY3QsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZsYWdfY2xlYXIob2JqZWN0KQorCisjZW5kaWYgLyogQ09NUEFUX0FUT01JQ1NfUFRIUkVBRF9TVERBVE9NSUNfSCAqLwpkaWZmIC0tZ2l0IGEvY29tcGF0L2F0b21pY3Mvc3VuY2Mvc3RkYXRvbWljLmggYi9jb21wYXQvYXRvbWljcy9zdW5jYy9zdGRhdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2Y4OWUwCi0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L2F0b21pY3Mvc3VuY2Mvc3RkYXRvbWljLmgKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBDT01QQVRfQVRPTUlDU19TVU5DQ19TVERBVE9NSUNfSAorI2RlZmluZSBDT01QQVRfQVRPTUlDU19TVU5DQ19TVERBVE9NSUNfSAorCisjaW5jbHVkZSA8YXRvbWljLmg+CisjaW5jbHVkZSA8bWJhcnJpZXIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2RlZmluZSBBVE9NSUNfRkxBR19JTklUIDAKKworI2RlZmluZSBBVE9NSUNfVkFSX0lOSVQodmFsdWUpICh2YWx1ZSkKKworI2RlZmluZSBhdG9taWNfaW5pdChvYmosIHZhbHVlKSBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKG9iaikgPSAodmFsdWUpOyAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIGtpbGxfZGVwZW5kZW5jeSh5KSAoKHZvaWQpMCkKKworI2RlZmluZSBhdG9taWNfdGhyZWFkX2ZlbmNlKG9yZGVyKSBcCisgICAgX19tYWNoaW5lX3J3X2JhcnJpZXIoKTsKKworI2RlZmluZSBhdG9taWNfc2lnbmFsX2ZlbmNlKG9yZGVyKSBcCisgICAgKCh2b2lkKTApCisKKyNkZWZpbmUgYXRvbWljX2lzX2xvY2tfZnJlZShvYmopIDAKKwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfZmxhZzsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2Jvb2w7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19jaGFyOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfc2NoYXI7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191Y2hhcjsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3Nob3J0OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdXNob3J0OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2xvbmc7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191bG9uZzsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2xsb25nOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWxsb25nOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfd2NoYXJfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9sZWFzdDhfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfbGVhc3QxNl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9sZWFzdDE2X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfbGVhc3QzMl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9sZWFzdDMyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfbGVhc3Q2NF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9sZWFzdDY0X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfZmFzdDhfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfZmFzdDhfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9mYXN0MTZfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfZmFzdDMyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2Zhc3QzMl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2Zhc3Q2NF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9mYXN0NjRfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludHB0cl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludHB0cl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfc2l6ZV90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfcHRyZGlmZl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50bWF4X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50bWF4X3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfc3RvcmUoaW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3QgZGVzaXJlZCkKK3sKKyAgICAqb2JqZWN0ID0gZGVzaXJlZDsKKyAgICBfX21hY2hpbmVfcndfYmFycmllcigpOworfQorCisjZGVmaW5lIGF0b21pY19zdG9yZV9leHBsaWNpdChvYmplY3QsIGRlc2lyZWQsIG9yZGVyKSBcCisgICAgYXRvbWljX3N0b3JlKG9iamVjdCwgZGVzaXJlZCkKKworc3RhdGljIGlubGluZSBpbnRwdHJfdCBhdG9taWNfbG9hZChpbnRwdHJfdCAqb2JqZWN0KQoreworICAgIF9fbWFjaGluZV9yd19iYXJyaWVyKCk7CisgICAgcmV0dXJuICpvYmplY3Q7Cit9CisKKyNkZWZpbmUgYXRvbWljX2xvYWRfZXhwbGljaXQob2JqZWN0LCBvcmRlcikgXAorICAgIGF0b21pY19sb2FkKG9iamVjdCkKKworI2RlZmluZSBhdG9taWNfZXhjaGFuZ2Uob2JqZWN0LCBkZXNpcmVkKSBcCisgICAgYXRvbWljX3N3YXBfcHRyKG9iamVjdCwgZGVzaXJlZCkKKworI2RlZmluZSBhdG9taWNfZXhjaGFuZ2VfZXhwbGljaXQob2JqZWN0LCBkZXNpcmVkLCBvcmRlcikgXAorICAgIGF0b21pY19leGNoYW5nZShvYmplY3QsIGRlc2lyZWQpCisKK3N0YXRpYyBpbmxpbmUgaW50IGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZyhpbnRwdHJfdCAqb2JqZWN0LCBpbnRwdHJfdCAqZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgZGVzaXJlZCkKK3sKKyAgICBpbnRwdHJfdCAgb2xkID0gKmV4cGVjdGVkOworICAgICpleHBlY3RlZCA9IChpbnRwdHJfdClhdG9taWNfY2FzX3B0cihvYmplY3QsICh2b2lkICopb2xkLCAodm9pZCAqKWRlc2lyZWQpOworICAgIHJldHVybiAqZXhwZWN0ZWQgPT0gb2xkOworfQorCisjZGVmaW5lIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkLCBzdWNjZXNzLCBmYWlsdXJlKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkLCBzdWNjZXNzLCBmYWlsdXJlKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKQorCitzdGF0aWMgaW5saW5lIGludHB0cl90IGF0b21pY19mZXRjaF9hZGQoaW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3Qgb3BlcmFuZCkKK3sKKyAgICByZXR1cm4gYXRvbWljX2FkZF9wdHJfbnYob2JqZWN0LCBvcGVyYW5kKSAtIG9wZXJhbmQ7Cit9CisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX3N1YihvYmplY3QsIG9wZXJhbmQpIFwKKyAgICBhdG9taWNfZmV0Y2hfYWRkKG9iamVjdCwgLShvcGVyYW5kKSkKKworc3RhdGljIGlubGluZSBpbnRwdHJfdCBhdG9taWNfZmV0Y2hfb3IoaW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3Qgb3BlcmFuZCkKK3sKKyAgICBpbnRwdHJfdCBvbGQ7CisgICAgZG8geworICAgICAgICBvbGQgPSBhdG9taWNfbG9hZChvYmplY3QpOworICAgIH0gd2hpbGUgKCFhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcob2JqZWN0LCBvbGQsIG9sZCB8IG9wZXJhbmQpKTsKKyAgICByZXR1cm4gb2xkOworfQorCitzdGF0aWMgaW5saW5lIGludHB0cl90IGF0b21pY19mZXRjaF94b3IoaW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3Qgb3BlcmFuZCkKK3sKKyAgICBpbnRwdHJfdCBvbGQ7CisgICAgZG8geworICAgICAgICBvbGQgPSBhdG9taWNfbG9hZChvYmplY3QpOworICAgIH0gd2hpbGUgKCFhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcob2JqZWN0LCBvbGQsIG9sZCBeIG9wZXJhbmQpKTsKKyAgICByZXR1cm4gb2xkOworfQorCitzdGF0aWMgaW5saW5lIGludHB0cl90IGF0b21pY19mZXRjaF9hbmQoaW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3Qgb3BlcmFuZCkKK3sKKyAgICBpbnRwdHJfdCBvbGQ7CisgICAgZG8geworICAgICAgICBvbGQgPSBhdG9taWNfbG9hZChvYmplY3QpOworICAgIH0gd2hpbGUgKCFhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcob2JqZWN0LCBvbGQsIG9sZCAmIG9wZXJhbmQpKTsKKyAgICByZXR1cm4gb2xkOworfQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9hZGQob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9zdWJfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9zdWIob2JqZWN0LCBvcGVyYW5kKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9vcl9leHBsaWNpdChvYmplY3QsIG9wZXJhbmQsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZldGNoX29yKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfeG9yX2V4cGxpY2l0KG9iamVjdCwgb3BlcmFuZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmV0Y2hfeG9yKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfYW5kX2V4cGxpY2l0KG9iamVjdCwgb3BlcmFuZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmV0Y2hfYW5kKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXQob2JqZWN0KSBcCisgICAgYXRvbWljX2V4Y2hhbmdlKG9iamVjdCwgMSkKKworI2RlZmluZSBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXRfZXhwbGljaXQob2JqZWN0LCBvcmRlcikgXAorICAgIGF0b21pY19mbGFnX3Rlc3RfYW5kX3NldChvYmplY3QpCisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfY2xlYXIob2JqZWN0KSBcCisgICAgYXRvbWljX3N0b3JlKG9iamVjdCwgMCkKKworI2RlZmluZSBhdG9taWNfZmxhZ19jbGVhcl9leHBsaWNpdChvYmplY3QsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZsYWdfY2xlYXIob2JqZWN0KQorCisjZW5kaWYgLyogQ09NUEFUX0FUT01JQ1NfU1VOQ0NfU1REQVRPTUlDX0ggKi8KZGlmZiAtLWdpdCBhL2NvbXBhdC9hdG9taWNzL3dpbjMyL3N0ZGF0b21pYy5oIGIvY29tcGF0L2F0b21pY3Mvd2luMzIvc3RkYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI4ZTZlNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbXBhdC9hdG9taWNzL3dpbjMyL3N0ZGF0b21pYy5oCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQ09NUEFUX0FUT01JQ1NfV0lOMzJfU1REQVRPTUlDX0gKKyNkZWZpbmUgQ09NUEFUX0FUT01JQ1NfV0lOMzJfU1REQVRPTUlDX0gKKworI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZGVmaW5lIEFUT01JQ19GTEFHX0lOSVQgMAorCisjZGVmaW5lIEFUT01JQ19WQVJfSU5JVCh2YWx1ZSkgKHZhbHVlKQorCisjZGVmaW5lIGF0b21pY19pbml0KG9iaiwgdmFsdWUpIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICoob2JqKSA9ICh2YWx1ZSk7ICAgICAgICAgICBcCit9IHdoaWxlKDApCisKKyNkZWZpbmUga2lsbF9kZXBlbmRlbmN5KHkpICgodm9pZCkwKQorCisjZGVmaW5lIGF0b21pY190aHJlYWRfZmVuY2Uob3JkZXIpIFwKKyAgICBNZW1vcnlCYXJyaWVyKCk7CisKKyNkZWZpbmUgYXRvbWljX3NpZ25hbF9mZW5jZShvcmRlcikgXAorICAgICgodm9pZCkwKQorCisjZGVmaW5lIGF0b21pY19pc19sb2NrX2ZyZWUob2JqKSAwCisKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ZsYWc7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19ib29sOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfY2hhcjsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3NjaGFyOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWNoYXI7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19zaG9ydDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VzaG9ydDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnQ7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19sb25nOwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWxvbmc7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19sbG9uZzsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VsbG9uZzsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3djaGFyX3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfbGVhc3Q4X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2xlYXN0OF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2xlYXN0MTZfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfbGVhc3QxNl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2xlYXN0MzJfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfbGVhc3QzMl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2xlYXN0NjRfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfbGVhc3Q2NF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2Zhc3Q4X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRfZmFzdDE2X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY191aW50X2Zhc3QxNl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfaW50X2Zhc3QzMl90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludF9mYXN0MzJfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludF9mYXN0NjRfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRfZmFzdDY0X3Q7Cit0eXBlZGVmIGludHB0cl90IGF0b21pY19pbnRwdHJfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3VpbnRwdHJfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3NpemVfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX3B0cmRpZmZfdDsKK3R5cGVkZWYgaW50cHRyX3QgYXRvbWljX2ludG1heF90OwordHlwZWRlZiBpbnRwdHJfdCBhdG9taWNfdWludG1heF90OworCisjZGVmaW5lIGF0b21pY19zdG9yZShvYmplY3QsIGRlc2lyZWQpICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqKG9iamVjdCkgPSAoZGVzaXJlZCk7ICAgICAgICAgICAgICBcCisgICAgTWVtb3J5QmFycmllcigpOyAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBhdG9taWNfc3RvcmVfZXhwbGljaXQob2JqZWN0LCBkZXNpcmVkLCBvcmRlcikgXAorICAgIGF0b21pY19zdG9yZShvYmplY3QsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2xvYWQob2JqZWN0KSBcCisgICAgKE1lbW9yeUJhcnJpZXIoKSwgKihvYmplY3QpKQorCisjZGVmaW5lIGF0b21pY19sb2FkX2V4cGxpY2l0KG9iamVjdCwgb3JkZXIpIFwKKyAgICBhdG9taWNfbG9hZChvYmplY3QpCisKKyNkZWZpbmUgYXRvbWljX2V4Y2hhbmdlKG9iamVjdCwgZGVzaXJlZCkgXAorICAgIEludGVybG9ja2VkRXhjaGFuZ2VQb2ludGVyKG9iamVjdCwgZGVzaXJlZCk7CisKKyNkZWZpbmUgYXRvbWljX2V4Y2hhbmdlX2V4cGxpY2l0KG9iamVjdCwgZGVzaXJlZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZXhjaGFuZ2Uob2JqZWN0LCBkZXNpcmVkKQorCitzdGF0aWMgaW5saW5lIGludCBhdG9taWNfY29tcGFyZV9leGNoYW5nZV9zdHJvbmcoaW50cHRyX3QgKm9iamVjdCwgaW50cHRyX3QgKmV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGRlc2lyZWQpCit7CisgICAgaW50cHRyX3Qgb2xkID0gKmV4cGVjdGVkOworICAgICpleHBlY3RlZCA9IChpbnRwdHJfdClJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIoCisgICAgICAgIChQVk9JRCAqKW9iamVjdCwgKFBWT0lEKWRlc2lyZWQsIChQVk9JRClvbGQpOworICAgIHJldHVybiAqZXhwZWN0ZWQgPT0gb2xkOworfQorCisjZGVmaW5lIGF0b21pY19jb21wYXJlX2V4Y2hhbmdlX3N0cm9uZ19leHBsaWNpdChvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkLCBzdWNjZXNzLCBmYWlsdXJlKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nKG9iamVjdCwgZXhwZWN0ZWQsIGRlc2lyZWQpCisKKyNkZWZpbmUgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2Vha19leHBsaWNpdChvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkLCBzdWNjZXNzLCBmYWlsdXJlKSBcCisgICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfd2VhayhvYmplY3QsIGV4cGVjdGVkLCBkZXNpcmVkKQorCisjaWZkZWYgX1dJTjY0CisjZGVmaW5lIGF0b21pY19mZXRjaF9hZGQob2JqZWN0LCBvcGVyYW5kKSBcCisgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZDY0KG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfc3ViKG9iamVjdCwgb3BlcmFuZCkgXAorICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NChvYmplY3QsIC0ob3BlcmFuZCkpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX29yKG9iamVjdCwgb3BlcmFuZCkgXAorICAgIEludGVybG9ja2VkT3I2NChvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX3hvcihvYmplY3QsIG9wZXJhbmQpIFwKKyAgICBJbnRlcmxvY2tlZFhvcjY0KG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfYW5kKG9iamVjdCwgb3BlcmFuZCkgXAorICAgIEludGVybG9ja2VkQW5kNjQob2JqZWN0LCBvcGVyYW5kKQorI2Vsc2UKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2FkZChvYmplY3QsIG9wZXJhbmQpIFwKKyAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfc3ViKG9iamVjdCwgb3BlcmFuZCkgXAorICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQob2JqZWN0LCAtKG9wZXJhbmQpKQorCisjZGVmaW5lIGF0b21pY19mZXRjaF9vcihvYmplY3QsIG9wZXJhbmQpIFwKKyAgICBJbnRlcmxvY2tlZE9yKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfeG9yKG9iamVjdCwgb3BlcmFuZCkgXAorICAgIEludGVybG9ja2VkWG9yKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfYW5kKG9iamVjdCwgb3BlcmFuZCkgXAorICAgIEludGVybG9ja2VkQW5kKG9iamVjdCwgb3BlcmFuZCkKKyNlbmRpZiAvKiBfV0lONjQgKi8KKworI2RlZmluZSBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KG9iamVjdCwgb3BlcmFuZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmV0Y2hfYWRkKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfc3ViX2V4cGxpY2l0KG9iamVjdCwgb3BlcmFuZCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmV0Y2hfc3ViKG9iamVjdCwgb3BlcmFuZCkKKworI2RlZmluZSBhdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQob2JqZWN0LCBvcGVyYW5kLCBvcmRlcikgXAorICAgIGF0b21pY19mZXRjaF9vcihvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX3hvcl9leHBsaWNpdChvYmplY3QsIG9wZXJhbmQsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZldGNoX3hvcihvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZldGNoX2FuZF9leHBsaWNpdChvYmplY3QsIG9wZXJhbmQsIG9yZGVyKSBcCisgICAgYXRvbWljX2ZldGNoX2FuZChvYmplY3QsIG9wZXJhbmQpCisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0KG9iamVjdCkgXAorICAgIGF0b21pY19leGNoYW5nZShvYmplY3QsIDEpCisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfdGVzdF9hbmRfc2V0X2V4cGxpY2l0KG9iamVjdCwgb3JkZXIpIFwKKyAgICBhdG9taWNfZmxhZ190ZXN0X2FuZF9zZXQob2JqZWN0KQorCisjZGVmaW5lIGF0b21pY19mbGFnX2NsZWFyKG9iamVjdCkgXAorICAgIGF0b21pY19zdG9yZShvYmplY3QsIDApCisKKyNkZWZpbmUgYXRvbWljX2ZsYWdfY2xlYXJfZXhwbGljaXQob2JqZWN0LCBvcmRlcikgXAorICAgIGF0b21pY19mbGFnX2NsZWFyKG9iamVjdCkKKworI2VuZGlmIC8qIENPTVBBVF9BVE9NSUNTX1dJTjMyX1NUREFUT01JQ19IICovCmRpZmYgLS1naXQgYS9jb21wYXQvYXZpc3ludGgvYXZpc3ludGhfYy5oIGIvY29tcGF0L2F2aXN5bnRoL2F2aXN5bnRoX2MuaAppbmRleCAwMTg5ZGFkLi42MDViOTJhIDEwMDY0NAotLS0gYS9jb21wYXQvYXZpc3ludGgvYXZpc3ludGhfYy5oCisrKyBiL2NvbXBhdC9hdmlzeW50aC9hdmlzeW50aF9jLmgKQEAgLTc1LDU0ICs3NSwxNDkgQEAKICAgICAgIEFWU19QTEFOQVJfQl9BTElHTkVEPUFWU19QTEFOQVJfQnxBVlNfUExBTkFSX0FMSUdORUR9OwogCiAgIC8vIENvbG9yc3BhY2UgcHJvcGVydGllcy4KLWVudW0ge0FWU19DU19CR1IgPSAxPDwyOCwKLSAgICAgIEFWU19DU19ZVVYgPSAxPDwyOSwKLSAgICAgIEFWU19DU19JTlRFUkxFQVZFRCA9IDE8PDMwLAotICAgICAgQVZTX0NTX1BMQU5BUiA9IDE8PDMxLAorZW51bSB7CisgICAgQVZTX0NTX1lVVkEgPSAxIDw8IDI3LAorICAgIEFWU19DU19CR1IgPSAxIDw8IDI4LAorICAgIEFWU19DU19ZVVYgPSAxIDw8IDI5LAorICAgIEFWU19DU19JTlRFUkxFQVZFRCA9IDEgPDwgMzAsCisgICAgQVZTX0NTX1BMQU5BUiA9IDEgPDwgMzEsCiAKLSAgICAgIEFWU19DU19TSElGVF9TVUJfV0lEVEggICA9IDAsCi0gICAgICBBVlNfQ1NfU0hJRlRfU1VCX0hFSUdIVCAgPSA4LAotICAgICAgQVZTX0NTX1NISUZUX1NBTVBMRV9CSVRTID0gMTYsCisgICAgQVZTX0NTX1NISUZUX1NVQl9XSURUSCA9IDAsCisgICAgQVZTX0NTX1NISUZUX1NVQl9IRUlHSFQgPSA4LAorICAgIEFWU19DU19TSElGVF9TQU1QTEVfQklUUyA9IDE2LAogCi0gICAgICBBVlNfQ1NfU1VCX1dJRFRIX01BU0sgICAgPSA3IDw8IEFWU19DU19TSElGVF9TVUJfV0lEVEgsCi0gICAgICBBVlNfQ1NfU1VCX1dJRFRIXzEgICAgICAgPSAzIDw8IEFWU19DU19TSElGVF9TVUJfV0lEVEgsIC8vIFlWMjQKLSAgICAgIEFWU19DU19TVUJfV0lEVEhfMiAgICAgICA9IDAgPDwgQVZTX0NTX1NISUZUX1NVQl9XSURUSCwgLy8gWVYxMiwgSTQyMCwgWVYxNgotICAgICAgQVZTX0NTX1NVQl9XSURUSF80ICAgICAgID0gMSA8PCBBVlNfQ1NfU0hJRlRfU1VCX1dJRFRILCAvLyBZVVY5LCBZVjQxMQorICAgIEFWU19DU19TVUJfV0lEVEhfTUFTSyA9IDcgPDwgQVZTX0NTX1NISUZUX1NVQl9XSURUSCwKKyAgICBBVlNfQ1NfU1VCX1dJRFRIXzEgPSAzIDw8IEFWU19DU19TSElGVF9TVUJfV0lEVEgsIC8vIFlWMjQKKyAgICBBVlNfQ1NfU1VCX1dJRFRIXzIgPSAwIDw8IEFWU19DU19TSElGVF9TVUJfV0lEVEgsIC8vIFlWMTIsIEk0MjAsIFlWMTYKKyAgICBBVlNfQ1NfU1VCX1dJRFRIXzQgPSAxIDw8IEFWU19DU19TSElGVF9TVUJfV0lEVEgsIC8vIFlVVjksIFlWNDExCiAKLSAgICAgIEFWU19DU19WUExBTkVGSVJTVCAgICAgICA9IDEgPDwgMywgLy8gWVYxMiwgWVYxNiwgWVYyNCwgWVY0MTEsIFlVVjkKLSAgICAgIEFWU19DU19VUExBTkVGSVJTVCAgICAgICA9IDEgPDwgNCwgLy8gSTQyMAorICAgIEFWU19DU19WUExBTkVGSVJTVCA9IDEgPDwgMywgLy8gWVYxMiwgWVYxNiwgWVYyNCwgWVY0MTEsIFlVVjkKKyAgICBBVlNfQ1NfVVBMQU5FRklSU1QgPSAxIDw8IDQsIC8vIEk0MjAKIAotICAgICAgQVZTX0NTX1NVQl9IRUlHSFRfTUFTSyAgID0gNyA8PCBBVlNfQ1NfU0hJRlRfU1VCX0hFSUdIVCwKLSAgICAgIEFWU19DU19TVUJfSEVJR0hUXzEgICAgICA9IDMgPDwgQVZTX0NTX1NISUZUX1NVQl9IRUlHSFQsIC8vIFlWMTYsIFlWMjQsIFlWNDExCi0gICAgICBBVlNfQ1NfU1VCX0hFSUdIVF8yICAgICAgPSAwIDw8IEFWU19DU19TSElGVF9TVUJfSEVJR0hULCAvLyBZVjEyLCBJNDIwCi0gICAgICBBVlNfQ1NfU1VCX0hFSUdIVF80ICAgICAgPSAxIDw8IEFWU19DU19TSElGVF9TVUJfSEVJR0hULCAvLyBZVVY5CisgICAgQVZTX0NTX1NVQl9IRUlHSFRfTUFTSyA9IDcgPDwgQVZTX0NTX1NISUZUX1NVQl9IRUlHSFQsCisgICAgQVZTX0NTX1NVQl9IRUlHSFRfMSA9IDMgPDwgQVZTX0NTX1NISUZUX1NVQl9IRUlHSFQsIC8vIFlWMTYsIFlWMjQsIFlWNDExCisgICAgQVZTX0NTX1NVQl9IRUlHSFRfMiA9IDAgPDwgQVZTX0NTX1NISUZUX1NVQl9IRUlHSFQsIC8vIFlWMTIsIEk0MjAKKyAgICBBVlNfQ1NfU1VCX0hFSUdIVF80ID0gMSA8PCBBVlNfQ1NfU0hJRlRfU1VCX0hFSUdIVCwgLy8gWVVWOQogCi0gICAgICBBVlNfQ1NfU0FNUExFX0JJVFNfTUFTSyAgPSA3IDw8IEFWU19DU19TSElGVF9TQU1QTEVfQklUUywKLSAgICAgIEFWU19DU19TQU1QTEVfQklUU184ICAgICA9IDAgPDwgQVZTX0NTX1NISUZUX1NBTVBMRV9CSVRTLAotICAgICAgQVZTX0NTX1NBTVBMRV9CSVRTXzE2ICAgID0gMSA8PCBBVlNfQ1NfU0hJRlRfU0FNUExFX0JJVFMsCi0gICAgICBBVlNfQ1NfU0FNUExFX0JJVFNfMzIgICAgPSAyIDw8IEFWU19DU19TSElGVF9TQU1QTEVfQklUUywKKyAgICBBVlNfQ1NfU0FNUExFX0JJVFNfTUFTSyA9IDcgPDwgQVZTX0NTX1NISUZUX1NBTVBMRV9CSVRTLAorICAgIEFWU19DU19TQU1QTEVfQklUU184ID0gMCA8PCBBVlNfQ1NfU0hJRlRfU0FNUExFX0JJVFMsCisgICAgQVZTX0NTX1NBTVBMRV9CSVRTXzEwID0gNSA8PCBBVlNfQ1NfU0hJRlRfU0FNUExFX0JJVFMsCisgICAgQVZTX0NTX1NBTVBMRV9CSVRTXzEyID0gNiA8PCBBVlNfQ1NfU0hJRlRfU0FNUExFX0JJVFMsCisgICAgQVZTX0NTX1NBTVBMRV9CSVRTXzE0ID0gNyA8PCBBVlNfQ1NfU0hJRlRfU0FNUExFX0JJVFMsCisgICAgQVZTX0NTX1NBTVBMRV9CSVRTXzE2ID0gMSA8PCBBVlNfQ1NfU0hJRlRfU0FNUExFX0JJVFMsCisgICAgQVZTX0NTX1NBTVBMRV9CSVRTXzMyID0gMiA8PCBBVlNfQ1NfU0hJRlRfU0FNUExFX0JJVFMsCiAKLSAgICAgIEFWU19DU19QTEFOQVJfTUFTSyAgICAgICA9IEFWU19DU19QTEFOQVIgfCBBVlNfQ1NfSU5URVJMRUFWRUQgfCBBVlNfQ1NfWVVWIHwgQVZTX0NTX0JHUiB8IEFWU19DU19TQU1QTEVfQklUU19NQVNLIHwgQVZTX0NTX1NVQl9IRUlHSFRfTUFTSyB8IEFWU19DU19TVUJfV0lEVEhfTUFTSywKLSAgICAgIEFWU19DU19QTEFOQVJfRklMVEVSICAgICA9IH4oIEFWU19DU19WUExBTkVGSVJTVCB8IEFWU19DU19VUExBTkVGSVJTVCApfTsKKyAgICBBVlNfQ1NfUExBTkFSX01BU0sgPSBBVlNfQ1NfUExBTkFSIHwgQVZTX0NTX0lOVEVSTEVBVkVEIHwgQVZTX0NTX1lVViB8IEFWU19DU19CR1IgfCBBVlNfQ1NfWVVWQSB8IEFWU19DU19TQU1QTEVfQklUU19NQVNLIHwgQVZTX0NTX1NVQl9IRUlHSFRfTUFTSyB8IEFWU19DU19TVUJfV0lEVEhfTUFTSywKKyAgICBBVlNfQ1NfUExBTkFSX0ZJTFRFUiA9IH4oQVZTX0NTX1ZQTEFORUZJUlNUIHwgQVZTX0NTX1VQTEFORUZJUlNUKSwKKworICAgIEFWU19DU19SR0JfVFlQRSAgPSAxIDw8IDAsCisgICAgQVZTX0NTX1JHQkFfVFlQRSA9IDEgPDwgMSwKKworICAgIEFWU19DU19HRU5FUklDX1lVVjQyMCAgPSBBVlNfQ1NfUExBTkFSIHwgQVZTX0NTX1lVViB8IEFWU19DU19WUExBTkVGSVJTVCB8IEFWU19DU19TVUJfSEVJR0hUXzIgfCBBVlNfQ1NfU1VCX1dJRFRIXzIsICAvLyA0OjI6MCBwbGFuYXIKKyAgICBBVlNfQ1NfR0VORVJJQ19ZVVY0MjIgID0gQVZTX0NTX1BMQU5BUiB8IEFWU19DU19ZVVYgfCBBVlNfQ1NfVlBMQU5FRklSU1QgfCBBVlNfQ1NfU1VCX0hFSUdIVF8xIHwgQVZTX0NTX1NVQl9XSURUSF8yLCAgLy8gNDoyOjIgcGxhbmFyCisgICAgQVZTX0NTX0dFTkVSSUNfWVVWNDQ0ICA9IEFWU19DU19QTEFOQVIgfCBBVlNfQ1NfWVVWIHwgQVZTX0NTX1ZQTEFORUZJUlNUIHwgQVZTX0NTX1NVQl9IRUlHSFRfMSB8IEFWU19DU19TVUJfV0lEVEhfMSwgIC8vIDQ6NDo0IHBsYW5hcgorICAgIEFWU19DU19HRU5FUklDX1kgICAgICAgPSBBVlNfQ1NfUExBTkFSIHwgQVZTX0NTX0lOVEVSTEVBVkVEIHwgQVZTX0NTX1lVViwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZIG9ubHkgKDQ6MDowKQorICAgIEFWU19DU19HRU5FUklDX1JHQlAgICAgPSBBVlNfQ1NfUExBTkFSIHwgQVZTX0NTX0JHUiB8IEFWU19DU19SR0JfVFlQRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFuYXIgUkdCCisgICAgQVZTX0NTX0dFTkVSSUNfUkdCQVAgICA9IEFWU19DU19QTEFOQVIgfCBBVlNfQ1NfQkdSIHwgQVZTX0NTX1JHQkFfVFlQRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBsYW5hciBSR0JBCisgICAgQVZTX0NTX0dFTkVSSUNfWVVWQTQyMCA9IEFWU19DU19QTEFOQVIgfCBBVlNfQ1NfWVVWQSB8IEFWU19DU19WUExBTkVGSVJTVCB8IEFWU19DU19TVUJfSEVJR0hUXzIgfCBBVlNfQ1NfU1VCX1dJRFRIXzIsIC8vIDQ6MjowOkEgcGxhbmFyCisgICAgQVZTX0NTX0dFTkVSSUNfWVVWQTQyMiA9IEFWU19DU19QTEFOQVIgfCBBVlNfQ1NfWVVWQSB8IEFWU19DU19WUExBTkVGSVJTVCB8IEFWU19DU19TVUJfSEVJR0hUXzEgfCBBVlNfQ1NfU1VCX1dJRFRIXzIsIC8vIDQ6MjoyOkEgcGxhbmFyCisgICAgQVZTX0NTX0dFTkVSSUNfWVVWQTQ0NCA9IEFWU19DU19QTEFOQVIgfCBBVlNfQ1NfWVVWQSB8IEFWU19DU19WUExBTkVGSVJTVCB8IEFWU19DU19TVUJfSEVJR0hUXzEgfCBBVlNfQ1NfU1VCX1dJRFRIXzEgfTsgLy8gNDo0OjQ6QSBwbGFuYXIKKwogCiAgIC8vIFNwZWNpZmljIGNvbG9yZm9ybWF0cwogZW51bSB7CiAgIEFWU19DU19VTktOT1dOID0gMCwKLSAgQVZTX0NTX0JHUjI0ID0gMTw8MCB8IEFWU19DU19CR1IgfCBBVlNfQ1NfSU5URVJMRUFWRUQsCi0gIEFWU19DU19CR1IzMiA9IDE8PDEgfCBBVlNfQ1NfQkdSIHwgQVZTX0NTX0lOVEVSTEVBVkVELAorICBBVlNfQ1NfQkdSMjQgPSBBVlNfQ1NfUkdCX1RZUEUgIHwgQVZTX0NTX0JHUiB8IEFWU19DU19JTlRFUkxFQVZFRCwKKyAgQVZTX0NTX0JHUjMyID0gQVZTX0NTX1JHQkFfVFlQRSB8IEFWU19DU19CR1IgfCBBVlNfQ1NfSU5URVJMRUFWRUQsCiAgIEFWU19DU19ZVVkyID0gMTw8MiB8IEFWU19DU19ZVVYgfCBBVlNfQ1NfSU5URVJMRUFWRUQsCiAgIC8vICBBVlNfQ1NfWVYxMiAgPSAxPDwzICBSZXNlcnZlZAogICAvLyAgQVZTX0NTX0k0MjAgID0gMTw8NCAgUmVzZXJ2ZWQKICAgQVZTX0NTX1JBVzMyID0gMTw8NSB8IEFWU19DU19JTlRFUkxFQVZFRCwKIAotICBBVlNfQ1NfWVYyNCAgPSBBVlNfQ1NfUExBTkFSIHwgQVZTX0NTX1lVViB8IEFWU19DU19TQU1QTEVfQklUU184IHwgQVZTX0NTX1ZQTEFORUZJUlNUIHwgQVZTX0NTX1NVQl9IRUlHSFRfMSB8IEFWU19DU19TVUJfV0lEVEhfMSwgIC8vIFlWVSA0OjQ6NCBwbGFuYXIKLSAgQVZTX0NTX1lWMTYgID0gQVZTX0NTX1BMQU5BUiB8IEFWU19DU19ZVVYgfCBBVlNfQ1NfU0FNUExFX0JJVFNfOCB8IEFWU19DU19WUExBTkVGSVJTVCB8IEFWU19DU19TVUJfSEVJR0hUXzEgfCBBVlNfQ1NfU1VCX1dJRFRIXzIsICAvLyBZVlUgNDoyOjIgcGxhbmFyCi0gIEFWU19DU19ZVjEyICA9IEFWU19DU19QTEFOQVIgfCBBVlNfQ1NfWVVWIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzggfCBBVlNfQ1NfVlBMQU5FRklSU1QgfCBBVlNfQ1NfU1VCX0hFSUdIVF8yIHwgQVZTX0NTX1NVQl9XSURUSF8yLCAgLy8gWVZVIDQ6MjowIHBsYW5hcgorICBBVlNfQ1NfWVYyNCAgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0NDQgfCBBVlNfQ1NfU0FNUExFX0JJVFNfOCwgIC8vIFlWVSA0OjQ6NCBwbGFuYXIKKyAgQVZTX0NTX1lWMTYgID0gQVZTX0NTX0dFTkVSSUNfWVVWNDIyIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzgsICAvLyBZVlUgNDoyOjIgcGxhbmFyCisgIEFWU19DU19ZVjEyICA9IEFWU19DU19HRU5FUklDX1lVVjQyMCB8IEFWU19DU19TQU1QTEVfQklUU184LCAgLy8gWVZVIDQ6MjowIHBsYW5hcgogICBBVlNfQ1NfSTQyMCAgPSBBVlNfQ1NfUExBTkFSIHwgQVZTX0NTX1lVViB8IEFWU19DU19TQU1QTEVfQklUU184IHwgQVZTX0NTX1VQTEFORUZJUlNUIHwgQVZTX0NTX1NVQl9IRUlHSFRfMiB8IEFWU19DU19TVUJfV0lEVEhfMiwgIC8vIFlVViA0OjI6MCBwbGFuYXIKICAgQVZTX0NTX0lZVVYgID0gQVZTX0NTX0k0MjAsCiAgIEFWU19DU19ZVjQxMSA9IEFWU19DU19QTEFOQVIgfCBBVlNfQ1NfWVVWIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzggfCBBVlNfQ1NfVlBMQU5FRklSU1QgfCBBVlNfQ1NfU1VCX0hFSUdIVF8xIHwgQVZTX0NTX1NVQl9XSURUSF80LCAgLy8gWVZVIDQ6MToxIHBsYW5hcgogICBBVlNfQ1NfWVVWOSAgPSBBVlNfQ1NfUExBTkFSIHwgQVZTX0NTX1lVViB8IEFWU19DU19TQU1QTEVfQklUU184IHwgQVZTX0NTX1ZQTEFORUZJUlNUIHwgQVZTX0NTX1NVQl9IRUlHSFRfNCB8IEFWU19DU19TVUJfV0lEVEhfNCwgIC8vIFlWVSA0OjE6MCBwbGFuYXIKLSAgQVZTX0NTX1k4ICAgID0gQVZTX0NTX1BMQU5BUiB8IEFWU19DU19JTlRFUkxFQVZFRCB8IEFWU19DU19ZVVYgfCBBVlNfQ1NfU0FNUExFX0JJVFNfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZICAgNDowOjAgcGxhbmFyCisgIEFWU19DU19ZOCAgICA9IEFWU19DU19HRU5FUklDX1kgfCBBVlNfQ1NfU0FNUExFX0JJVFNfOCwgICAgICAgLy8gWSAgIDQ6MDowIHBsYW5hcgorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBBVlMxNjogbmV3IHBsYW5hciBjb25zdGFudHMgZ28gbGl2ZSEgRXhwZXJpbWVudGFsIFBGIDE2MDYxMworICAvLyAxMC0xMi0xNCBiaXQgKyBwbGFuYXIgUkdCICsgQlJHNDgvNjQgMTYwNzI1CisgIEFWU19DU19ZVVY0NDRQMTAgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0NDQgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTAsIC8vIFlVViA0OjQ6NCAxMGJpdCBzYW1wbGVzCisgIEFWU19DU19ZVVY0MjJQMTAgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0MjIgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTAsIC8vIFlVViA0OjI6MiAxMGJpdCBzYW1wbGVzCisgIEFWU19DU19ZVVY0MjBQMTAgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0MjAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTAsIC8vIFlVViA0OjI6MCAxMGJpdCBzYW1wbGVzCisgIEFWU19DU19ZMTAgICAgICAgPSBBVlNfQ1NfR0VORVJJQ19ZIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzEwLCAgICAgIC8vIFkgICA0OjA6MCAxMGJpdCBzYW1wbGVzCisKKyAgQVZTX0NTX1lVVjQ0NFAxMiA9IEFWU19DU19HRU5FUklDX1lVVjQ0NCB8IEFWU19DU19TQU1QTEVfQklUU18xMiwgLy8gWVVWIDQ6NDo0IDEyYml0IHNhbXBsZXMKKyAgQVZTX0NTX1lVVjQyMlAxMiA9IEFWU19DU19HRU5FUklDX1lVVjQyMiB8IEFWU19DU19TQU1QTEVfQklUU18xMiwgLy8gWVVWIDQ6MjoyIDEyYml0IHNhbXBsZXMKKyAgQVZTX0NTX1lVVjQyMFAxMiA9IEFWU19DU19HRU5FUklDX1lVVjQyMCB8IEFWU19DU19TQU1QTEVfQklUU18xMiwgLy8gWVVWIDQ6MjowIDEyYml0IHNhbXBsZXMKKyAgQVZTX0NTX1kxMiAgICAgICA9IEFWU19DU19HRU5FUklDX1kgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTIsICAgICAgLy8gWSAgIDQ6MDowIDEyYml0IHNhbXBsZXMKKworICBBVlNfQ1NfWVVWNDQ0UDE0ID0gQVZTX0NTX0dFTkVSSUNfWVVWNDQ0IHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE0LCAvLyBZVVYgNDo0OjQgMTRiaXQgc2FtcGxlcworICBBVlNfQ1NfWVVWNDIyUDE0ID0gQVZTX0NTX0dFTkVSSUNfWVVWNDIyIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE0LCAvLyBZVVYgNDoyOjIgMTRiaXQgc2FtcGxlcworICBBVlNfQ1NfWVVWNDIwUDE0ID0gQVZTX0NTX0dFTkVSSUNfWVVWNDIwIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE0LCAvLyBZVVYgNDoyOjAgMTRiaXQgc2FtcGxlcworICBBVlNfQ1NfWTE0ICAgICAgID0gQVZTX0NTX0dFTkVSSUNfWSB8IEFWU19DU19TQU1QTEVfQklUU18xNCwgICAgICAvLyBZICAgNDowOjAgMTRiaXQgc2FtcGxlcworCisgIEFWU19DU19ZVVY0NDRQMTYgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0NDQgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTYsIC8vIFlVViA0OjQ6NCAxNmJpdCBzYW1wbGVzCisgIEFWU19DU19ZVVY0MjJQMTYgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0MjIgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTYsIC8vIFlVViA0OjI6MiAxNmJpdCBzYW1wbGVzCisgIEFWU19DU19ZVVY0MjBQMTYgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0MjAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTYsIC8vIFlVViA0OjI6MCAxNmJpdCBzYW1wbGVzCisgIEFWU19DU19ZMTYgICAgICAgPSBBVlNfQ1NfR0VORVJJQ19ZIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE2LCAgICAgIC8vIFkgICA0OjA6MCAxNmJpdCBzYW1wbGVzCisKKyAgLy8gMzIgYml0IHNhbXBsZXMgKGZsb2F0KQorICBBVlNfQ1NfWVVWNDQ0UFMgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0NDQgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMzIsICAvLyBZVVYgNDo0OjQgMzJiaXQgc2FtcGxlcworICBBVlNfQ1NfWVVWNDIyUFMgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0MjIgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMzIsICAvLyBZVVYgNDoyOjIgMzJiaXQgc2FtcGxlcworICBBVlNfQ1NfWVVWNDIwUFMgPSBBVlNfQ1NfR0VORVJJQ19ZVVY0MjAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMzIsICAvLyBZVVYgNDoyOjAgMzJiaXQgc2FtcGxlcworICBBVlNfQ1NfWTMyICAgICAgPSBBVlNfQ1NfR0VORVJJQ19ZIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzMyLCAgICAgICAvLyBZICAgNDowOjAgMzJiaXQgc2FtcGxlcworCisgIC8vIFJHQiBwYWNrZWQKKyAgQVZTX0NTX0JHUjQ4ID0gQVZTX0NTX1JHQl9UWVBFIHwgQVZTX0NTX0JHUiB8IEFWU19DU19JTlRFUkxFQVZFRCB8IEFWU19DU19TQU1QTEVfQklUU18xNiwgICAgLy8gQkdSIDN4MTYgYml0CisgIEFWU19DU19CR1I2NCA9IEFWU19DU19SR0JBX1RZUEUgfCBBVlNfQ1NfQkdSIHwgQVZTX0NTX0lOVEVSTEVBVkVEIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE2LCAgICAvLyBCR1IgNHgxNiBiaXQKKyAgLy8gbm8gcGFja2VkIDMyIGJpdCAoZmxvYXQpIHN1cHBvcnQgZm9yIHRoZXNlIGxlZ2FjeSB0eXBlcworCisgIC8vIFJHQiBwbGFuYXIKKyAgQVZTX0NTX1JHQlAgICA9IEFWU19DU19HRU5FUklDX1JHQlAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfOCwgIC8vIFBsYW5hciBSR0IgOCBiaXQgc2FtcGxlcworICBBVlNfQ1NfUkdCUDEwID0gQVZTX0NTX0dFTkVSSUNfUkdCUCB8IEFWU19DU19TQU1QTEVfQklUU18xMCwgLy8gUGxhbmFyIFJHQiAxMGJpdCBzYW1wbGVzCisgIEFWU19DU19SR0JQMTIgPSBBVlNfQ1NfR0VORVJJQ19SR0JQIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzEyLCAvLyBQbGFuYXIgUkdCIDEyYml0IHNhbXBsZXMKKyAgQVZTX0NTX1JHQlAxNCA9IEFWU19DU19HRU5FUklDX1JHQlAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTQsIC8vIFBsYW5hciBSR0IgMTRiaXQgc2FtcGxlcworICBBVlNfQ1NfUkdCUDE2ID0gQVZTX0NTX0dFTkVSSUNfUkdCUCB8IEFWU19DU19TQU1QTEVfQklUU18xNiwgLy8gUGxhbmFyIFJHQiAxNmJpdCBzYW1wbGVzCisgIEFWU19DU19SR0JQUyAgPSBBVlNfQ1NfR0VORVJJQ19SR0JQIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzMyLCAvLyBQbGFuYXIgUkdCIDMyYml0IHNhbXBsZXMKKworICAvLyBSR0JBIHBsYW5hcgorICBBVlNfQ1NfUkdCQVAgICA9IEFWU19DU19HRU5FUklDX1JHQkFQIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzgsICAvLyBQbGFuYXIgUkdCQSA4IGJpdCBzYW1wbGVzCisgIEFWU19DU19SR0JBUDEwID0gQVZTX0NTX0dFTkVSSUNfUkdCQVAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTAsIC8vIFBsYW5hciBSR0JBIDEwYml0IHNhbXBsZXMKKyAgQVZTX0NTX1JHQkFQMTIgPSBBVlNfQ1NfR0VORVJJQ19SR0JBUCB8IEFWU19DU19TQU1QTEVfQklUU18xMiwgLy8gUGxhbmFyIFJHQkEgMTJiaXQgc2FtcGxlcworICBBVlNfQ1NfUkdCQVAxNCA9IEFWU19DU19HRU5FUklDX1JHQkFQIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE0LCAvLyBQbGFuYXIgUkdCQSAxNGJpdCBzYW1wbGVzCisgIEFWU19DU19SR0JBUDE2ID0gQVZTX0NTX0dFTkVSSUNfUkdCQVAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTYsIC8vIFBsYW5hciBSR0JBIDE2Yml0IHNhbXBsZXMKKyAgQVZTX0NTX1JHQkFQUyAgPSBBVlNfQ1NfR0VORVJJQ19SR0JBUCB8IEFWU19DU19TQU1QTEVfQklUU18zMiwgLy8gUGxhbmFyIFJHQkEgMzJiaXQgc2FtcGxlcworCisgIC8vIFBsYW5hciBZVVZBCisgIEFWU19DU19ZVVZBNDQ0ICAgID0gQVZTX0NTX0dFTkVSSUNfWVVWQTQ0NCB8IEFWU19DU19TQU1QTEVfQklUU184LCAgLy8gWVVWQSA0OjQ6NCA4Yml0IHNhbXBsZXMKKyAgQVZTX0NTX1lVVkE0MjIgICAgPSBBVlNfQ1NfR0VORVJJQ19ZVVZBNDIyIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzgsICAvLyBZVVZBIDQ6MjoyIDhiaXQgc2FtcGxlcworICBBVlNfQ1NfWVVWQTQyMCAgICA9IEFWU19DU19HRU5FUklDX1lVVkE0MjAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfOCwgIC8vIFlVVkEgNDoyOjAgOGJpdCBzYW1wbGVzCisKKyAgQVZTX0NTX1lVVkE0NDRQMTAgPSBBVlNfQ1NfR0VORVJJQ19ZVVZBNDQ0IHwgQVZTX0NTX1NBTVBMRV9CSVRTXzEwLCAvLyBZVVZBIDQ6NDo0IDEwYml0IHNhbXBsZXMKKyAgQVZTX0NTX1lVVkE0MjJQMTAgPSBBVlNfQ1NfR0VORVJJQ19ZVVZBNDIyIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzEwLCAvLyBZVVZBIDQ6MjoyIDEwYml0IHNhbXBsZXMKKyAgQVZTX0NTX1lVVkE0MjBQMTAgPSBBVlNfQ1NfR0VORVJJQ19ZVVZBNDIwIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzEwLCAvLyBZVVZBIDQ6MjowIDEwYml0IHNhbXBsZXMKKworICBBVlNfQ1NfWVVWQTQ0NFAxMiA9IEFWU19DU19HRU5FUklDX1lVVkE0NDQgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTIsIC8vIFlVVkEgNDo0OjQgMTJiaXQgc2FtcGxlcworICBBVlNfQ1NfWVVWQTQyMlAxMiA9IEFWU19DU19HRU5FUklDX1lVVkE0MjIgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTIsIC8vIFlVVkEgNDoyOjIgMTJiaXQgc2FtcGxlcworICBBVlNfQ1NfWVVWQTQyMFAxMiA9IEFWU19DU19HRU5FUklDX1lVVkE0MjAgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMTIsIC8vIFlVVkEgNDoyOjAgMTJiaXQgc2FtcGxlcworCisgIEFWU19DU19ZVVZBNDQ0UDE0ID0gQVZTX0NTX0dFTkVSSUNfWVVWQTQ0NCB8IEFWU19DU19TQU1QTEVfQklUU18xNCwgLy8gWVVWQSA0OjQ6NCAxNGJpdCBzYW1wbGVzCisgIEFWU19DU19ZVVZBNDIyUDE0ID0gQVZTX0NTX0dFTkVSSUNfWVVWQTQyMiB8IEFWU19DU19TQU1QTEVfQklUU18xNCwgLy8gWVVWQSA0OjI6MiAxNGJpdCBzYW1wbGVzCisgIEFWU19DU19ZVVZBNDIwUDE0ID0gQVZTX0NTX0dFTkVSSUNfWVVWQTQyMCB8IEFWU19DU19TQU1QTEVfQklUU18xNCwgLy8gWVVWQSA0OjI6MCAxNGJpdCBzYW1wbGVzCisKKyAgQVZTX0NTX1lVVkE0NDRQMTYgPSBBVlNfQ1NfR0VORVJJQ19ZVVZBNDQ0IHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE2LCAvLyBZVVZBIDQ6NDo0IDE2Yml0IHNhbXBsZXMKKyAgQVZTX0NTX1lVVkE0MjJQMTYgPSBBVlNfQ1NfR0VORVJJQ19ZVVZBNDIyIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE2LCAvLyBZVVZBIDQ6MjoyIDE2Yml0IHNhbXBsZXMKKyAgQVZTX0NTX1lVVkE0MjBQMTYgPSBBVlNfQ1NfR0VORVJJQ19ZVVZBNDIwIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzE2LCAvLyBZVVZBIDQ6MjowIDE2Yml0IHNhbXBsZXMKKworICBBVlNfQ1NfWVVWQTQ0NFBTICA9IEFWU19DU19HRU5FUklDX1lVVkE0NDQgfCBBVlNfQ1NfU0FNUExFX0JJVFNfMzIsICAvLyBZVVZBIDQ6NDo0IDMyYml0IHNhbXBsZXMKKyAgQVZTX0NTX1lVVkE0MjJQUyAgPSBBVlNfQ1NfR0VORVJJQ19ZVVZBNDIyIHwgQVZTX0NTX1NBTVBMRV9CSVRTXzMyLCAgLy8gWVVWQSA0OjI6MiAzMmJpdCBzYW1wbGVzCisgIEFWU19DU19ZVVZBNDIwUFMgID0gQVZTX0NTX0dFTkVSSUNfWVVWQTQyMCB8IEFWU19DU19TQU1QTEVfQklUU18zMiwgIC8vIFlVVkEgNDoyOjAgMzJiaXQgc2FtcGxlcworCiB9OwogCiBlbnVtIHsKQEAgLTI0NywxMCArMzQyLDEwIEBACiAgICAgICAgIHsgcmV0dXJuICEhKHAtPnBpeGVsX3R5cGUmQVZTX0NTX0JHUik7IH0KIAogQVZTQ19JTkxJTkUgaW50IGF2c19pc19yZ2IyNChjb25zdCBBVlNfVmlkZW9JbmZvICogcCkKLSAgICAgICAgeyByZXR1cm4gKHAtPnBpeGVsX3R5cGUmQVZTX0NTX0JHUjI0KT09QVZTX0NTX0JHUjI0OyB9IC8vIENsZWFyIG91dCBhZGRpdGlvbmFsIHByb3BlcnRpZXMKKyAgICAgICAgeyByZXR1cm4gKChwLT5waXhlbF90eXBlJkFWU19DU19CR1IyNCk9PUFWU19DU19CR1IyNCkgJiYgKChwLT5waXhlbF90eXBlICYgQVZTX0NTX1NBTVBMRV9CSVRTX01BU0spID09IEFWU19DU19TQU1QTEVfQklUU184KTsgfQogCiBBVlNDX0lOTElORSBpbnQgYXZzX2lzX3JnYjMyKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKQotICAgICAgICB7IHJldHVybiAocC0+cGl4ZWxfdHlwZSAmIEFWU19DU19CR1IzMikgPT0gQVZTX0NTX0JHUjMyIDsgfQorICAgICAgIHsgcmV0dXJuICgocC0+cGl4ZWxfdHlwZSZBVlNfQ1NfQkdSMzIpPT1BVlNfQ1NfQkdSMzIpICYmICgocC0+cGl4ZWxfdHlwZSAmIEFWU19DU19TQU1QTEVfQklUU19NQVNLKSA9PSBBVlNfQ1NfU0FNUExFX0JJVFNfOCk7IH0KIAogQVZTQ19JTkxJTkUgaW50IGF2c19pc195dXYoY29uc3QgQVZTX1ZpZGVvSW5mbyAqIHApCiAgICAgICAgIHsgcmV0dXJuICEhKHAtPnBpeGVsX3R5cGUmQVZTX0NTX1lVViApOyB9CkBAIC0yNTgsNiArMzUzLDEwIEBACiBBVlNDX0lOTElORSBpbnQgYXZzX2lzX3l1eTIoY29uc3QgQVZTX1ZpZGVvSW5mbyAqIHApCiAgICAgICAgIHsgcmV0dXJuIChwLT5waXhlbF90eXBlICYgQVZTX0NTX1lVWTIpID09IEFWU19DU19ZVVkyOyB9CiAKK0FWU0NfQVBJKGludCwgYXZzX2lzX3JnYjQ4KShjb25zdCBBVlNfVmlkZW9JbmZvICogcCk7CisKK0FWU0NfQVBJKGludCwgYXZzX2lzX3JnYjY0KShjb25zdCBBVlNfVmlkZW9JbmZvICogcCk7CisKIEFWU0NfQVBJKGludCwgYXZzX2lzX3l2MjQpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKIAogQVZTQ19BUEkoaW50LCBhdnNfaXNfeXYxNikoY29uc3QgQVZTX1ZpZGVvSW5mbyAqIHApOwpAQCAtMjY4LDYgKzM2NywzOCBAQAogCiBBVlNDX0FQSShpbnQsIGF2c19pc195OCkoY29uc3QgQVZTX1ZpZGVvSW5mbyAqIHApOwogCitBVlNDX0FQSShpbnQsIGF2c19pc195dXY0NDRwMTYpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfaXNfeXV2NDIycDE2KShjb25zdCBBVlNfVmlkZW9JbmZvICogcCk7CisKK0FWU0NfQVBJKGludCwgYXZzX2lzX3l1djQyMHAxNikoY29uc3QgQVZTX1ZpZGVvSW5mbyAqIHApOworCitBVlNDX0FQSShpbnQsIGF2c19pc195MTYpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfaXNfeXV2NDQ0cHMpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfaXNfeXV2NDIycHMpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfaXNfeXV2NDIwcHMpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfaXNfeTMyKShjb25zdCBBVlNfVmlkZW9JbmZvICogcCk7CisKK0FWU0NfQVBJKGludCwgYXZzX2lzXzQ0NCkoY29uc3QgQVZTX1ZpZGVvSW5mbyAqIHApOworCitBVlNDX0FQSShpbnQsIGF2c19pc180MjIpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfaXNfNDIwKShjb25zdCBBVlNfVmlkZW9JbmZvICogcCk7CisKK0FWU0NfQVBJKGludCwgYXZzX2lzX3kpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfaXNfeXV2YSkoY29uc3QgQVZTX1ZpZGVvSW5mbyAqIHApOworCitBVlNDX0FQSShpbnQsIGF2c19pc19wbGFuYXJfcmdiKShjb25zdCBBVlNfVmlkZW9JbmZvICogcCk7CisKK0FWU0NfQVBJKGludCwgYXZzX2lzX3BsYW5hcl9yZ2JhKShjb25zdCBBVlNfVmlkZW9JbmZvICogcCk7CisKKworCiBBVlNDX0lOTElORSBpbnQgYXZzX2lzX3Byb3BlcnR5KGNvbnN0IEFWU19WaWRlb0luZm8gKiBwLCBpbnQgcHJvcGVydHkpCiAgICAgICAgIHsgcmV0dXJuICgocC0+aW1hZ2VfdHlwZSAmIHByb3BlcnR5KT09cHJvcGVydHkgKTsgfQogCkBAIC0zNjUsNiArNDk2LDEyIEBACiB9CiAjZW5kaWYKIAorQVZTQ19BUEkoaW50LCBhdnNfbnVtX2NvbXBvbmVudHMpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfY29tcG9uZW50X3NpemUpKGNvbnN0IEFWU19WaWRlb0luZm8gKiBwKTsKKworQVZTQ19BUEkoaW50LCBhdnNfYml0c19wZXJfY29tcG9uZW50KShjb25zdCBBVlNfVmlkZW9JbmZvICogcCk7CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KIC8vIEFWU19WaWRlb0ZyYW1lCkBAIC01MjgsNyArNjY1LDcgQEAKICAgICAgICAgeyBBVlNfVmFsdWUgdjsgYXZzX3NldF90b19jbGlwKCZ2LCB2MCk7IHJldHVybiB2OyB9CiAjZW5kaWYKIEFWU0NfSU5MSU5FIEFWU19WYWx1ZSBhdnNfbmV3X3ZhbHVlX2FycmF5KEFWU19WYWx1ZSAqIHYwLCBpbnQgc2l6ZSkKLSAgICAgICAgeyBBVlNfVmFsdWUgdjsgdi50eXBlID0gJ2EnOyB2LmQuYXJyYXkgPSB2MDsgdi5hcnJheV9zaXplID0gc2l6ZTsgcmV0dXJuIHY7IH0KKyAgICAgICAgeyBBVlNfVmFsdWUgdjsgdi50eXBlID0gJ2EnOyB2LmQuYXJyYXkgPSB2MDsgdi5hcnJheV9zaXplID0gKHNob3J0KXNpemU7IHJldHVybiB2OyB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KQEAgLTc2MSwxMSArODk4LDI4IEBACiAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c192c3ByaW50Zik7CiAKICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2dldF9lcnJvcik7CisgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc19yZ2I0OCk7CisgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc19yZ2I2NCk7CiAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc195djI0KTsKICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX3l2MTYpOwogICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfeXYxMik7CiAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc195djQxMSk7CiAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc195OCk7CisgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc195dXY0NDRwMTYpOworICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfeXV2NDIycDE2KTsKKyAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX3l1djQyMHAxNik7CisgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc195MTYpOworICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfeXV2NDQ0cHMpOworICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfeXV2NDIycHMpOworICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfeXV2NDIwcHMpOworICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfeTMyKTsKKyAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzXzQ0NCk7CisgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc180MjIpOworICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfNDIwKTsKKyAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX3kpOworICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfeXV2YSk7CisgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc19wbGFuYXJfcmdiKTsKKyAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX3BsYW5hcl9yZ2JhKTsKICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX2NvbG9yX3NwYWNlKTsKIAogICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfZ2V0X3BsYW5lX3dpZHRoX3N1YnNhbXBsaW5nKTsKQEAgLTc4MCw2ICs5MzQsMTEgQEAKICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2dldF9yZWFkX3B0cl9wKTsKICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX3dyaXRhYmxlKTsKICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2dldF93cml0ZV9wdHJfcCk7CisKKyAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX251bV9jb21wb25lbnRzKTsKKyAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2NvbXBvbmVudF9zaXplKTsKKyAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2JpdHNfcGVyX2NvbXBvbmVudCk7CisKIH07CiAKICN1bmRlZiBBVlNDX0RFQ0xBUkVfRlVOQwpAQCAtODQwLDExICs5OTksMjggQEAKICAgQVZTQ19MT0FEX0ZVTkMoYXZzX3ZzcHJpbnRmKTsKIAogICBBVlNDX0xPQURfRlVOQyhhdnNfZ2V0X2Vycm9yKTsKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3JnYjQ4KTsKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3JnYjY0KTsKICAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3l2MjQpOwogICBBVlNDX0xPQURfRlVOQyhhdnNfaXNfeXYxNik7CiAgIEFWU0NfTE9BRF9GVU5DKGF2c19pc195djEyKTsKICAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3l2NDExKTsKICAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3k4KTsKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3l1djQ0NHAxNik7CisgIEFWU0NfTE9BRF9GVU5DKGF2c19pc195dXY0MjJwMTYpOworICBBVlNDX0xPQURfRlVOQyhhdnNfaXNfeXV2NDIwcDE2KTsKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3kxNik7CisgIEFWU0NfTE9BRF9GVU5DKGF2c19pc195dXY0NDRwcyk7CisgIEFWU0NfTE9BRF9GVU5DKGF2c19pc195dXY0MjJwcyk7CisgIEFWU0NfTE9BRF9GVU5DKGF2c19pc195dXY0MjBwcyk7CisgIEFWU0NfTE9BRF9GVU5DKGF2c19pc195MzIpOworICBBVlNDX0xPQURfRlVOQyhhdnNfaXNfNDQ0KTsKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzXzQyMik7CisgIEFWU0NfTE9BRF9GVU5DKGF2c19pc180MjApOworICBBVlNDX0xPQURfRlVOQyhhdnNfaXNfeSk7CisgIEFWU0NfTE9BRF9GVU5DKGF2c19pc195dXZhKTsKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3BsYW5hcl9yZ2IpOworICBBVlNDX0xPQURfRlVOQyhhdnNfaXNfcGxhbmFyX3JnYmEpOwogICBBVlNDX0xPQURfRlVOQyhhdnNfaXNfY29sb3Jfc3BhY2UpOwogCiAgIEFWU0NfTE9BRF9GVU5DKGF2c19nZXRfcGxhbmVfd2lkdGhfc3Vic2FtcGxpbmcpOwpAQCAtODYwLDYgKzEwMzYsMTIgQEAKICAgQVZTQ19MT0FEX0ZVTkMoYXZzX2lzX3dyaXRhYmxlKTsKICAgQVZTQ19MT0FEX0ZVTkMoYXZzX2dldF93cml0ZV9wdHJfcCk7CiAKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX251bV9jb21wb25lbnRzKTsKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX2NvbXBvbmVudF9zaXplKTsKKyAgQVZTQ19MT0FEX0ZVTkMoYXZzX2JpdHNfcGVyX2NvbXBvbmVudCk7CisKKworCiAjdW5kZWYgX19BVlNDX1NUUklOR0lGWQogI3VuZGVmIEFWU0NfU1RSSU5HSUZZCiAjdW5kZWYgQVZTQ19MT0FEX0ZVTkMKZGlmZiAtLWdpdCBhL2NvbXBhdC9jdWRhL2R5bmxpbmtfbG9hZGVyLmggYi9jb21wYXQvY3VkYS9keW5saW5rX2xvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTM0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvY3VkYS9keW5saW5rX2xvYWRlci5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVl9DT01QQVRfQ1VEQV9EWU5MSU5LX0xPQURFUl9ICisjZGVmaW5lIEFWX0NPTVBBVF9DVURBX0RZTkxJTktfTE9BREVSX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJjb21wYXQvdzMyZGxmY24uaCIKKworI2RlZmluZSBGRk5WX0xPQURfRlVOQyhwYXRoKSBkbG9wZW4oKHBhdGgpLCBSVExEX0xBWlkpCisjZGVmaW5lIEZGTlZfU1lNX0ZVTkMobGliLCBzeW0pIGRsc3ltKChsaWIpLCAoc3ltKSkKKyNkZWZpbmUgRkZOVl9GUkVFX0ZVTkMobGliKSBkbGNsb3NlKGxpYikKKyNkZWZpbmUgRkZOVl9MT0dfRlVOQyhsb2djdHgsIG1zZywgLi4uKSBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsIG1zZywgIF9fVkFfQVJHU19fKQorI2RlZmluZSBGRk5WX0RFQlVHX0xPR19GVU5DKGxvZ2N0eCwgbXNnLCAuLi4pIGF2X2xvZyhsb2djdHgsIEFWX0xPR19ERUJVRywgbXNnLCAgX19WQV9BUkdTX18pCisKKyNpbmNsdWRlIDxmZm52Y29kZWMvZHlubGlua19sb2FkZXIuaD4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb21wYXQvY3VkYS9wdHgyYy5zaCBiL2NvbXBhdC9jdWRhL3B0eDJjLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjY2FiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb21wYXQvY3VkYS9wdHgyYy5zaApAQCAtMCwwICsxLDM2IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgKGMpIDIwMTcsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyMgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorIyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyMgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisjIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisjCisjIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisjIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorIworIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorIyBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyMgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisjIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisjIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisjIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyMgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorCitzZXQgLWUKKworT1VUPSIkMSIKK0lOPSIkMiIKK05BTUU9IiQoYmFzZW5hbWUgIiRJTiIgfCBzZWQgJ3MvXC4uKi8vJykiCisKK3ByaW50ZiAiY29uc3QgY2hhciAlc19wdHhbXSA9IFxcIiAiJE5BTUUiID4gIiRPVVQiCit3aGlsZSByZWFkIExJTkUKK2RvCisgICAgcHJpbnRmICJcblx0XCIlc1xcXG5cIiIgIiQocHJpbnRmICIlcyIgIiRMSU5FIiB8IHNlZCAtZSAncy9cci8vZycgLWUgJ3MvWyJcXF0vXFwmL2cnKSIgPj4gIiRPVVQiCitkb25lIDwgIiRJTiIKK3ByaW50ZiAiO1xuIiA+PiAiJE9VVCIKKworZXhpdCAwCmRpZmYgLS1naXQgYS9jb21wYXQvZGlzcGF0Y2hfc2VtYXBob3JlL3NlbWFwaG9yZS5oIGIvY29tcGF0L2Rpc3BhdGNoX3NlbWFwaG9yZS9zZW1hcGhvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDhjNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L2Rpc3BhdGNoX3NlbWFwaG9yZS9zZW1hcGhvcmUuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQ09NUEFUX0RJU1BBVENIX1NFTUFQSE9SRV9TRU1BUEhPUkVfSAorI2RlZmluZSBDT01QQVRfRElTUEFUQ0hfU0VNQVBIT1JFX1NFTUFQSE9SRV9ICisKKyNpbmNsdWRlIDxkaXNwYXRjaC9kaXNwYXRjaC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNkZWZpbmUgc2VtX3QgZGlzcGF0Y2hfc2VtYXBob3JlX3QKKyNkZWZpbmUgc2VtX3Bvc3QocHNlbSkgICAgICAgICAgICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoKnBzZW0pCisjZGVmaW5lIHNlbV93YWl0KHBzZW0pICAgICAgICAgICAgICBkaXNwYXRjaF9zZW1hcGhvcmVfd2FpdCgqcHNlbSwgRElTUEFUQ0hfVElNRV9GT1JFVkVSKQorI2RlZmluZSBzZW1fdGltZWR3YWl0KHBzZW0sIHZhbCkgICAgZGlzcGF0Y2hfc2VtYXBob3JlX3dhaXQoKnBzZW0sIGRpc3BhdGNoX3dhbGx0aW1lKHZhbCwgMCkpCisjZGVmaW5lIHNlbV9kZXN0cm95KHBzZW0pICAgICAgICAgICBkaXNwYXRjaF9yZWxlYXNlKCpwc2VtKQorCitzdGF0aWMgaW5saW5lIGludCBjb21wYXRfc2VtX2luaXQoZGlzcGF0Y2hfc2VtYXBob3JlX3QgKnBzZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVudXNlZCwgaW50IHZhbCkKK3sKKyAgICBpbnQgcmV0ID0gISEoKnBzZW0gPSBkaXNwYXRjaF9zZW1hcGhvcmVfY3JlYXRlKHZhbCkpIC0gMTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZXJybm8gPSBFTk9NRU07CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBzZW1faW5pdCBjb21wYXRfc2VtX2luaXQKKworI2VuZGlmIC8qIENPTVBBVF9ESVNQQVRDSF9TRU1BUEhPUkVfU0VNQVBIT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2NvbXBhdC9vczJ0aHJlYWRzLmggYi9jb21wYXQvb3MydGhyZWFkcy5oCmluZGV4IDQwYTExOWYuLjIxNzdhMDMgMTAwNjQ0Ci0tLSBhL2NvbXBhdC9vczJ0aHJlYWRzLmgKKysrIGIvY29tcGF0L29zMnRocmVhZHMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgS08gTXl1bmctSHVuIDxrb21oQGNob2xsaWFuLm5ldD4KKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE3IEtPIE15dW5nLUh1biA8a29taEBjaG9sbGlhbi5uZXQ+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTQ2LDkgKzQ2LDExIEBACiAKIHR5cGVkZWYgdm9pZCBwdGhyZWFkX2F0dHJfdDsKIAotdHlwZWRlZiBITVRYIHB0aHJlYWRfbXV0ZXhfdDsKK3R5cGVkZWYgX2ZtdXRleCBwdGhyZWFkX211dGV4X3Q7CiB0eXBlZGVmIHZvaWQgcHRocmVhZF9tdXRleGF0dHJfdDsKIAorI2RlZmluZSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSIF9GTVVURVhfSU5JVElBTElaRVIKKwogdHlwZWRlZiBzdHJ1Y3QgewogICAgIEhFViBldmVudF9zZW07CiAgICAgSEVWIGFja19zZW07CkBAIC05OCwyOCArMTAwLDI4IEBACiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCiB7Ci0gICAgRG9zQ3JlYXRlTXV0ZXhTZW0oTlVMTCwgKFBITVRYKW11dGV4LCAwLCBGQUxTRSk7CisgICAgX2ZtdXRleF9jcmVhdGUobXV0ZXgsIDApOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kocHRocmVhZF9tdXRleF90ICptdXRleCkKIHsKLSAgICBEb3NDbG9zZU11dGV4U2VtKCooUEhNVFgpbXV0ZXgpOworICAgIF9mbXV0ZXhfY2xvc2UobXV0ZXgpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBwdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKIHsKLSAgICBEb3NSZXF1ZXN0TXV0ZXhTZW0oKihQSE1UWCltdXRleCwgU0VNX0lOREVGSU5JVEVfV0FJVCk7CisgICAgX2ZtdXRleF9yZXF1ZXN0KG11dGV4LCAwKTsKIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgcHRocmVhZF9tdXRleF91bmxvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKIHsKLSAgICBEb3NSZWxlYXNlTXV0ZXhTZW0oKihQSE1UWCltdXRleCk7CisgICAgX2ZtdXRleF9yZWxlYXNlKG11dGV4KTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY29tcGF0L3BsYW45L2hlYWQgYi9jb21wYXQvcGxhbjkvaGVhZApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjg0MGIyZC4uMDAwMDAwMAotLS0gYS9jb21wYXQvcGxhbjkvaGVhZAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMhL2Jpbi9zaAotCi1uPTEwCi0KLWNhc2UgIiQxIiBpbgotICAgIC1uKSAgbj0kMjsgICAgICBzaGlmdCAyIDs7Ci0gICAgLW4qKSBuPSR7MSMtbn07IHNoaWZ0ICAgOzsKLWVzYWMKLQotZXhlYyBzZWQgJHtufXEgIiRAIgpkaWZmIC0tZ2l0IGEvY29tcGF0L3BsYW45L21haW4uYyBiL2NvbXBhdC9wbGFuOS9tYWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NmY5NmQuLjAwMDAwMDAKLS0tIGEvY29tcGF0L3BsYW45L21haW4uYworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotaW50IHBsYW45X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKLQotI3VuZGVmIG1haW4KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICAvKiBUaGUgc2V0ZmNyKCkgZnVuY3Rpb24gaW4gbGliOSBpcyBicm9rZW4sIG11c3QgdXNlIGFzbS4gKi8KLSNpZmRlZiBfX2kzODYKLSAgICBzaG9ydCBmY3I7Ci0gICAgX19hc21fXyB2b2xhdGlsZSAoImZzdGN3ICAgICAgICAlMCBcbiIKLSAgICAgICAgICAgICAgICAgICAgICAib3IgICAgICAkNjMsICUwIFxuIgotICAgICAgICAgICAgICAgICAgICAgICJmbGRjdyAgICAgICAgJTAgXG4iCi0gICAgICAgICAgICAgICAgICAgICAgOiAiPW0iKGZjcikpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gcGxhbjlfbWFpbihhcmdjLCBhcmd2KTsKLX0KZGlmZiAtLWdpdCBhL2NvbXBhdC9wbGFuOS9wcmludGYgYi9jb21wYXQvcGxhbjkvcHJpbnRmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxYTcwYTllLi4wMDAwMDAwCi0tLSBhL2NvbXBhdC9wbGFuOS9wcmludGYKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSMhL2Jpbi9zaAotZXhlYyBhd2sgIkJFR0lOIHsgZm9yIChpID0gMjsgaSA8IEFSR0M7IGkrKykgcHJpbnRmIFwiJDFcIiwgQVJHVltpXSB9IiAiJEAiCmRpZmYgLS1naXQgYS9jb21wYXQvc3RydG9kLmMgYi9jb21wYXQvc3RydG9kLmMKaW5kZXggM2E5NDUyZS4uOGI0MjQzYiAxMDA2NDQKLS0tIGEvY29tcGF0L3N0cnRvZC5jCisrKyBiL2NvbXBhdC9zdHJ0b2QuYwpAQCAtMjUsOSArMjUsOSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgogCi1zdGF0aWMgY2hhciAqY2hlY2tfbmFuX3N1ZmZpeChjaGFyICpzKQorc3RhdGljIGNvbnN0IGNoYXIgKmNoZWNrX25hbl9zdWZmaXgoY29uc3QgY2hhciAqcykKIHsKLSAgICBjaGFyICpzdGFydCA9IHM7CisgICAgY29uc3QgY2hhciAqc3RhcnQgPSBzOwogCiAgICAgaWYgKCpzKysgIT0gJygnKQogICAgICAgICByZXR1cm4gc3RhcnQ7CkBAIC00NCw3ICs0NCw3IEBACiAKIGRvdWJsZSBhdnByaXZfc3RydG9kKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIpCiB7Ci0gICAgY2hhciAqZW5kOworICAgIGNvbnN0IGNoYXIgKmVuZDsKICAgICBkb3VibGUgcmVzOwogCiAgICAgLyogU2tpcCBsZWFkaW5nIHNwYWNlcyAqLwpAQCAtODEsMTMgKzgxLDEzIEBACiAgICAgICAgICAgICAgICAhYXZfc3RybmNhc2VjbXAobnB0ciwgIisweCIsIDMpKSB7CiAgICAgICAgIC8qIEZJWE1FIHRoaXMgZG9lc24ndCBoYW5kbGUgZXhwb25lbnRzLCBub24taW50ZWdlcnMgKGZsb2F0L2RvdWJsZSkKICAgICAgICAgICogYW5kIG51bWJlcnMgdG9vIGxhcmdlIGZvciBsb25nIGxvbmcgKi8KLSAgICAgICAgcmVzID0gc3RydG9sbChucHRyLCAmZW5kLCAxNik7CisgICAgICAgIHJlcyA9IHN0cnRvbGwobnB0ciwgKGNoYXIgKiopJmVuZCwgMTYpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IHN0cnRvZChucHRyLCAmZW5kKTsKKyAgICAgICAgcmVzID0gc3RydG9kKG5wdHIsIChjaGFyICoqKSZlbmQpOwogICAgIH0KIAogICAgIGlmIChlbmRwdHIpCi0gICAgICAgICplbmRwdHIgPSBlbmQ7CisgICAgICAgICplbmRwdHIgPSAoY2hhciAqKWVuZDsKIAogICAgIHJldHVybiByZXM7CiB9CmRpZmYgLS1naXQgYS9jb21wYXQvdG1zNDcwL21hdGguaCBiL2NvbXBhdC90bXM0NzAvbWF0aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQyNzQzLi4wMDAwMDAwCi0tLSBhL2NvbXBhdC90bXM0NzAvbWF0aC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZuZGVmIENPTVBBVF9UTVM0NzBfTUFUSF9ICi0jZGVmaW5lIENPTVBBVF9UTVM0NzBfTUFUSF9ICi0KLSNpbmNsdWRlX25leHQgPG1hdGguaD4KLQotI3VuZGVmIElORklOSVRZCi0jdW5kZWYgTkFOCi0KLSNkZWZpbmUgSU5GSU5JVFkgKCooY29uc3QgZmxvYXQqKSgoY29uc3QgdW5zaWduZWQgW10peyAweDdmODAwMDAwIH0pKQotI2RlZmluZSBOQU4gICAgICAoKihjb25zdCBmbG9hdCopKChjb25zdCB1bnNpZ25lZCBbXSl7IDB4N2ZjMDAwMDAgfSkpCi0KLSNlbmRpZiAvKiBDT01QQVRfVE1TNDcwX01BVEhfSCAqLwpkaWZmIC0tZ2l0IGEvY29tcGF0L3czMmRsZmNuLmggYi9jb21wYXQvdzMyZGxmY24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODNiZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29tcGF0L3czMmRsZmNuLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIENPTVBBVF9XMzJETEZDTl9ICisjZGVmaW5lIENPTVBBVF9XMzJETEZDTl9ICisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgKF9XSU4zMl9XSU5OVCA8IDB4MDYwMikgfHwgSEFWRV9XSU5SVAorI2luY2x1ZGUgImxpYmF2dXRpbC93Y2hhcl9maWxlbmFtZS5oIgorI2VuZGlmCisvKioKKyAqIFNhZmUgZnVuY3Rpb24gdXNlZCB0byBvcGVuIGR5bmFtaWMgbGlicy4gVGhpcyBhdHRlbXB0cyB0byBpbXByb3ZlIHByb2dyYW0gc2VjdXJpdHkKKyAqIGJ5IHJlbW92aW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBmcm9tIHRoZSBkbGwgc2VhcmNoIHBhdGguIE9ubHkgZGxsJ3MgZm91bmQgaW4gdGhlCisgKiBleGVjdXRhYmxlIG9yIHN5c3RlbSBkaXJlY3RvcnkgYXJlIGFsbG93ZWQgdG8gYmUgbG9hZGVkLgorICogQHBhcmFtIG5hbWUgIFRoZSBkeW5hbWljIGxpYiBuYW1lLgorICogQHJldHVybiBBIGhhbmRsZSB0byB0aGUgb3BlbmVkIGxpYi4KKyAqLworc3RhdGljIGlubGluZSBITU9EVUxFIHdpbjMyX2Rsb3Blbihjb25zdCBjaGFyICpuYW1lKQoreworI2lmIF9XSU4zMl9XSU5OVCA8IDB4MDYwMgorICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgS0IyNTMzNjIzIGlzIGF2YWlsYWJsZQorICAgIGlmICghR2V0UHJvY0FkZHJlc3MoR2V0TW9kdWxlSGFuZGxlVyhMImtlcm5lbDMyLmRsbCIpLCAiU2V0RGVmYXVsdERsbERpcmVjdG9yaWVzIikpIHsKKyAgICAgICAgSE1PRFVMRSBtb2R1bGUgPSBOVUxMOworICAgICAgICB3Y2hhcl90ICpwYXRoID0gTlVMTCwgKm5hbWVfdyA9IE5VTEw7CisgICAgICAgIERXT1JEIHBhdGhsZW47CisgICAgICAgIGlmICh1dGY4dG93Y2hhcihuYW1lLCAmbmFtZV93KSkKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgcGF0aCA9ICh3Y2hhcl90ICopYXZfbWFsbG9jel9hcnJheShNQVhfUEFUSCwgc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICAgICAgLy8gVHJ5IGxvY2FsIGRpcmVjdG9yeSBmaXJzdAorICAgICAgICBwYXRobGVuID0gR2V0TW9kdWxlRmlsZU5hbWVXKE5VTEwsIHBhdGgsIE1BWF9QQVRIKTsKKyAgICAgICAgcGF0aGxlbiA9IHdjc3JjaHIocGF0aCwgJ1xcJykgLSBwYXRoOworICAgICAgICBpZiAocGF0aGxlbiA9PSAwIHx8IHBhdGhsZW4gKyB3Y3NsZW4obmFtZV93KSArIDIgPiBNQVhfUEFUSCkKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgcGF0aFtwYXRobGVuXSA9ICdcXCc7CisgICAgICAgIHdjc2NweShwYXRoICsgcGF0aGxlbiArIDEsIG5hbWVfdyk7CisgICAgICAgIG1vZHVsZSA9IExvYWRMaWJyYXJ5RXhXKHBhdGgsIE5VTEwsIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKTsKKyAgICAgICAgaWYgKG1vZHVsZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBOZXh0IHRyeSBTeXN0ZW0zMiBkaXJlY3RvcnkKKyAgICAgICAgICAgIHBhdGhsZW4gPSBHZXRTeXN0ZW1EaXJlY3RvcnlXKHBhdGgsIE1BWF9QQVRIKTsKKyAgICAgICAgICAgIGlmIChwYXRobGVuID09IDAgfHwgcGF0aGxlbiArIHdjc2xlbihuYW1lX3cpICsgMiA+IE1BWF9QQVRIKQorICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgICAgIHBhdGhbcGF0aGxlbl0gPSAnXFwnOworICAgICAgICAgICAgd2NzY3B5KHBhdGggKyBwYXRobGVuICsgMSwgbmFtZV93KTsKKyAgICAgICAgICAgIG1vZHVsZSA9IExvYWRMaWJyYXJ5RXhXKHBhdGgsIE5VTEwsIExPQURfV0lUSF9BTFRFUkVEX1NFQVJDSF9QQVRIKTsKKyAgICAgICAgfQorZXhpdDoKKyAgICAgICAgYXZfZnJlZShwYXRoKTsKKyAgICAgICAgYXZfZnJlZShuYW1lX3cpOworICAgICAgICByZXR1cm4gbW9kdWxlOworICAgIH0KKyNlbmRpZgorI2lmbmRlZiBMT0FEX0xJQlJBUllfU0VBUkNIX0FQUExJQ0FUSU9OX0RJUgorIyAgIGRlZmluZSBMT0FEX0xJQlJBUllfU0VBUkNIX0FQUExJQ0FUSU9OX0RJUiAweDAwMDAwMjAwCisjZW5kaWYKKyNpZm5kZWYgTE9BRF9MSUJSQVJZX1NFQVJDSF9TWVNURU0zMgorIyAgIGRlZmluZSBMT0FEX0xJQlJBUllfU0VBUkNIX1NZU1RFTTMyICAgICAgICAweDAwMDAwODAwCisjZW5kaWYKKyNpZiBIQVZFX1dJTlJUCisgICAgd2NoYXJfdCAqbmFtZV93ID0gTlVMTDsKKyAgICBpbnQgcmV0OworICAgIGlmICh1dGY4dG93Y2hhcihuYW1lLCAmbmFtZV93KSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0ID0gTG9hZFBhY2thZ2VkTGlicmFyeShuYW1lX3csIDApOworICAgIGF2X2ZyZWUobmFtZV93KTsKKyAgICByZXR1cm4gcmV0OworI2Vsc2UKKyAgICByZXR1cm4gTG9hZExpYnJhcnlFeEEobmFtZSwgTlVMTCwgTE9BRF9MSUJSQVJZX1NFQVJDSF9BUFBMSUNBVElPTl9ESVIgfCBMT0FEX0xJQlJBUllfU0VBUkNIX1NZU1RFTTMyKTsKKyNlbmRpZgorfQorI2RlZmluZSBkbG9wZW4obmFtZSwgZmxhZ3MpIHdpbjMyX2Rsb3BlbihuYW1lKQorI2RlZmluZSBkbGNsb3NlIEZyZWVMaWJyYXJ5CisjZGVmaW5lIGRsc3ltIEdldFByb2NBZGRyZXNzCisjZWxzZQorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2VuZGlmIC8qIENPTVBBVF9XMzJETEZDTl9IICovCmRpZmYgLS1naXQgYS9jb21wYXQvdzMycHRocmVhZHMuaCBiL2NvbXBhdC93MzJwdGhyZWFkcy5oCmluZGV4IDRhYzJhOTkuLjIxYWNmZDIgMTAwNjQ0Ci0tLSBhL2NvbXBhdC93MzJwdGhyZWFkcy5oCisrKyBiL2NvbXBhdC93MzJwdGhyZWFkcy5oCkBAIC0zOSwxMSArMzksNiBAQAogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNpbmNsdWRlIDxwcm9jZXNzLmg+CiAKLSNpZiBfV0lOMzJfV0lOTlQgPCAweDA2MDAgJiYgZGVmaW5lZChfX01JTkdXMzJfXykKLSN1bmRlZiBNZW1vcnlCYXJyaWVyCi0jZGVmaW5lIE1lbW9yeUJhcnJpZXIgX19zeW5jX3N5bmNocm9uaXplCi0jZW5kaWYKLQogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgpAQCAtNTYsMjggKzUxLDE5IEBACiAgICAgdm9pZCAqcmV0OwogfSBwdGhyZWFkX3Q7CiAKLS8qIHRoZSBjb25kaXRpb25hbCB2YXJpYWJsZSBhcGkgZm9yIHdpbmRvd3MgNi4wKyB1c2VzIGNyaXRpY2FsIHNlY3Rpb25zIGFuZAotICogbm90IG11dGV4ZXMgKi8KLXR5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiBwdGhyZWFkX211dGV4X3Q7Ci0KLS8qIFRoaXMgaXMgdGhlIENPTkRJVElPTl9WQVJJQUJMRSB0eXBlZGVmIGZvciB1c2luZyBXaW5kb3dzJyBuYXRpdmUKLSAqIGNvbmRpdGlvbmFsIHZhcmlhYmxlcyBvbiBrZXJuZWxzIDYuMCsuICovCi0jaWYgSEFWRV9DT05ESVRJT05fVkFSSUFCTEVfUFRSCisvKiB1c2UgbGlnaHQgd2VpZ2h0IG11dGV4L2NvbmRpdGlvbiB2YXJpYWJsZSBBUEkgZm9yIFdpbmRvd3MgVmlzdGEgYW5kIGxhdGVyICovCit0eXBlZGVmIFNSV0xPQ0sgcHRocmVhZF9tdXRleF90OwogdHlwZWRlZiBDT05ESVRJT05fVkFSSUFCTEUgcHRocmVhZF9jb25kX3Q7Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QgcHRocmVhZF9jb25kX3QgewotICAgIHZvaWQgKlB0cjsKLX0gcHRocmVhZF9jb25kX3Q7Ci0jZW5kaWYKIAotI2lmIF9XSU4zMl9XSU5OVCA+PSAweDA2MDAKKyNkZWZpbmUgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUiBTUldMT0NLX0lOSVQKKyNkZWZpbmUgUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSIENPTkRJVElPTl9WQVJJQUJMRV9JTklUCisKICNkZWZpbmUgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbih4KSBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uRXgoeCwgMCwgMCkKICNkZWZpbmUgV2FpdEZvclNpbmdsZU9iamVjdChhLCBiKSBXYWl0Rm9yU2luZ2xlT2JqZWN0RXgoYSwgYiwgRkFMU0UpCi0jZW5kaWYKIAogc3RhdGljIGF2X3VudXNlZCB1bnNpZ25lZCBfX3N0ZGNhbGwgYXR0cmlidXRlX2FsaWduX2FyZyB3aW4zMnRocmVhZF93b3JrZXIodm9pZCAqYXJnKQogewotICAgIHB0aHJlYWRfdCAqaCA9IGFyZzsKKyAgICBwdGhyZWFkX3QgKmggPSAocHRocmVhZF90Kilhcmc7CiAgICAgaC0+cmV0ID0gaC0+ZnVuYyhoLT5hcmcpOwogICAgIHJldHVybiAwOwogfQpAQCAtMTE0LDI2ICsxMDAsMjUgQEAKIAogc3RhdGljIGlubGluZSBpbnQgcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbSwgdm9pZCogYXR0cikKIHsKLSAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKG0pOworICAgIEluaXRpYWxpemVTUldMb2NrKG0pOwogICAgIHJldHVybiAwOwogfQogc3RhdGljIGlubGluZSBpbnQgcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCAqbSkKIHsKLSAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24obSk7CisgICAgLyogVW5sb2NrZWQgU1dSIGxvY2tzIHVzZSBubyByZXNvdXJjZXMgKi8KICAgICByZXR1cm4gMDsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IHB0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm0pCiB7Ci0gICAgRW50ZXJDcml0aWNhbFNlY3Rpb24obSk7CisgICAgQWNxdWlyZVNSV0xvY2tFeGNsdXNpdmUobSk7CiAgICAgcmV0dXJuIDA7CiB9CiBzdGF0aWMgaW5saW5lIGludCBwdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QgKm0pCiB7Ci0gICAgTGVhdmVDcml0aWNhbFNlY3Rpb24obSk7CisgICAgUmVsZWFzZVNSV0xvY2tFeGNsdXNpdmUobSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLSNpZiBfV0lOMzJfV0lOTlQgPj0gMHgwNjAwCiB0eXBlZGVmIElOSVRfT05DRSBwdGhyZWFkX29uY2VfdDsKICNkZWZpbmUgUFRIUkVBRF9PTkNFX0lOSVQgSU5JVF9PTkNFX1NUQVRJQ19JTklUCiAKQEAgLTE2Nyw3ICsxNTIsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKIHsKLSAgICBTbGVlcENvbmRpdGlvblZhcmlhYmxlQ1MoY29uZCwgbXV0ZXgsIElORklOSVRFKTsKKyAgICBTbGVlcENvbmRpdGlvblZhcmlhYmxlU1JXKGNvbmQsIG11dGV4LCBJTkZJTklURSwgMCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE3NywyNDIgKzE2Miw0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLSNlbHNlIC8vIF9XSU4zMl9XSU5OVCA8IDB4MDYwMAotCi0vKiBhdG9taWMgaW5pdCBzdGF0ZSBvZiBkeW5hbWljYWxseSBsb2FkZWQgZnVuY3Rpb25zICovCi1zdGF0aWMgTE9ORyB3MzJ0aHJlYWRfaW5pdF9zdGF0ZSA9IDA7Ci1zdGF0aWMgYXZfdW51c2VkIHZvaWQgdzMydGhyZWFkX2luaXQodm9pZCk7Ci0KLS8qIGZvciBwcmUtV2luZG93cyA2LjAgcGxhdGZvcm1zLCBkZWZpbmUgSU5JVF9PTkNFIHN0cnVjdCwKLSAqIGNvbXBhdGlibGUgdG8gdGhlIG9uZSB1c2VkIGluIHRoZSBuYXRpdmUgQVBJICovCi0KLXR5cGVkZWYgdW5pb24gcHRocmVhZF9vbmNlX3QgIHsKLSAgICB2b2lkICogUHRyOyAgICAvLy88IEZvciB0aGUgV2luZG93cyA2LjArIG5hdGl2ZSBmdW5jdGlvbnMKLSAgICBMT05HIHN0YXRlOyAgICAvLy88IEZvciB0aGUgcHJlLVdpbmRvd3MgNi4wIGNvbXBhdCBjb2RlCi19IHB0aHJlYWRfb25jZV90OwotCi0jZGVmaW5lIFBUSFJFQURfT05DRV9JTklUIHswfQotCi0vKiBmdW5jdGlvbiBwb2ludGVycyB0byBpbml0IG9uY2UgQVBJIG9uIHdpbmRvd3MgNi4wKyBrZXJuZWxzICovCi1zdGF0aWMgQk9PTCAoV0lOQVBJICppbml0b25jZV9iZWdpbikocHRocmVhZF9vbmNlX3QgKmxwSW5pdE9uY2UsIERXT1JEIGR3RmxhZ3MsIEJPT0wgKmZQZW5kaW5nLCB2b2lkICoqbHBDb250ZXh0KTsKLXN0YXRpYyBCT09MIChXSU5BUEkgKmluaXRvbmNlX2NvbXBsZXRlKShwdGhyZWFkX29uY2VfdCAqbHBJbml0T25jZSwgRFdPUkQgZHdGbGFncywgdm9pZCAqbHBDb250ZXh0KTsKLQotLyogcHJlLVdpbmRvd3MgNi4wIGNvbXBhdCB1c2luZyBhIHNwaW4tbG9jayAqLwotc3RhdGljIGlubGluZSB2b2lkIHczMnRocmVhZF9vbmNlX2ZhbGxiYWNrKExPTkcgdm9sYXRpbGUgKnN0YXRlLCB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSkKLXsKLSAgICBzd2l0Y2ggKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKHN0YXRlLCAxLCAwKSkgewotICAgIC8qIEluaXRpYWwgcnVuICovCi0gICAgY2FzZSAwOgotICAgICAgICBpbml0X3JvdXRpbmUoKTsKLSAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZShzdGF0ZSwgMik7Ci0gICAgICAgIGJyZWFrOwotICAgIC8qIEFub3RoZXIgdGhyZWFkIGlzIHJ1bm5pbmcgaW5pdCAqLwotICAgIGNhc2UgMToKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIE1lbW9yeUJhcnJpZXIoKTsKLSAgICAgICAgICAgIGlmICgqc3RhdGUgPT0gMikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIFNsZWVwKDApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIC8qIEluaXRpYWxpemF0aW9uIGNvbXBsZXRlICovCi0gICAgY2FzZSAyOgotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBhdl91bnVzZWQgaW50IHB0aHJlYWRfb25jZShwdGhyZWFkX29uY2VfdCAqb25jZV9jb250cm9sLCB2b2lkICgqaW5pdF9yb3V0aW5lKSh2b2lkKSkKLXsKLSAgICB3MzJ0aHJlYWRfb25jZV9mYWxsYmFjaygmdzMydGhyZWFkX2luaXRfc3RhdGUsIHczMnRocmVhZF9pbml0KTsKLQotICAgIC8qIFVzZSBuYXRpdmUgZnVuY3Rpb25zIG9uIFdpbmRvd3MgNi4wKyAqLwotICAgIGlmIChpbml0b25jZV9iZWdpbiAmJiBpbml0b25jZV9jb21wbGV0ZSkgewotICAgICAgICBCT09MIHBlbmRpbmcgPSBGQUxTRTsKLSAgICAgICAgaW5pdG9uY2VfYmVnaW4ob25jZV9jb250cm9sLCAwLCAmcGVuZGluZywgTlVMTCk7Ci0gICAgICAgIGlmIChwZW5kaW5nKQotICAgICAgICAgICAgaW5pdF9yb3V0aW5lKCk7Ci0gICAgICAgIGluaXRvbmNlX2NvbXBsZXRlKG9uY2VfY29udHJvbCwgMCwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHczMnRocmVhZF9vbmNlX2ZhbGxiYWNrKCZvbmNlX2NvbnRyb2wtPnN0YXRlLCBpbml0X3JvdXRpbmUpOwotICAgIHJldHVybiAwOwotfQotCi0vKiBmb3IgcHJlLVdpbmRvd3MgNi4wIHBsYXRmb3JtcyB3ZSBuZWVkIHRvIGRlZmluZSBhbmQgdXNlIG91ciBvd24gY29uZGl0aW9uCi0gKiB2YXJpYWJsZSBhbmQgYXBpICovCi0KLXR5cGVkZWYgc3RydWN0ICB3aW4zMl9jb25kX3QgewotICAgIHB0aHJlYWRfbXV0ZXhfdCBtdHhfYnJvYWRjYXN0OwotICAgIHB0aHJlYWRfbXV0ZXhfdCBtdHhfd2FpdGVyX2NvdW50OwotICAgIHZvbGF0aWxlIGludCB3YWl0ZXJfY291bnQ7Ci0gICAgSEFORExFIHNlbWFwaG9yZTsKLSAgICBIQU5ETEUgd2FpdGVyc19kb25lOwotICAgIHZvbGF0aWxlIGludCBpc19icm9hZGNhc3Q7Ci19IHdpbjMyX2NvbmRfdDsKLQotLyogZnVuY3Rpb24gcG9pbnRlcnMgdG8gY29uZGl0aW9uYWwgdmFyaWFibGUgQVBJIG9uIHdpbmRvd3MgNi4wKyBrZXJuZWxzICovCi1zdGF0aWMgdm9pZCAoV0lOQVBJICpjb25kX2Jyb2FkY2FzdCkocHRocmVhZF9jb25kX3QgKmNvbmQpOwotc3RhdGljIHZvaWQgKFdJTkFQSSAqY29uZF9pbml0KShwdGhyZWFkX2NvbmRfdCAqY29uZCk7Ci1zdGF0aWMgdm9pZCAoV0lOQVBJICpjb25kX3NpZ25hbCkocHRocmVhZF9jb25kX3QgKmNvbmQpOwotc3RhdGljIEJPT0wgKFdJTkFQSSAqY29uZF93YWl0KShwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgbWlsbGlzZWNvbmRzKTsKLQotc3RhdGljIGF2X3VudXNlZCBpbnQgcHRocmVhZF9jb25kX2luaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIGNvbnN0IHZvaWQgKnVudXNlZF9hdHRyKQotewotICAgIHdpbjMyX2NvbmRfdCAqd2luMzJfY29uZCA9IE5VTEw7Ci0KLSAgICB3MzJ0aHJlYWRfb25jZV9mYWxsYmFjaygmdzMydGhyZWFkX2luaXRfc3RhdGUsIHczMnRocmVhZF9pbml0KTsKLQotICAgIGlmIChjb25kX2luaXQpIHsKLSAgICAgICAgY29uZF9pbml0KGNvbmQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBub24gbmF0aXZlIGNvbmRpdGlvbiB2YXJpYWJsZXMgKi8KLSAgICB3aW4zMl9jb25kID0gYXZfbWFsbG9jeihzaXplb2Yod2luMzJfY29uZF90KSk7Ci0gICAgaWYgKCF3aW4zMl9jb25kKQotICAgICAgICByZXR1cm4gRU5PTUVNOwotICAgIGNvbmQtPlB0ciA9IHdpbjMyX2NvbmQ7Ci0gICAgd2luMzJfY29uZC0+c2VtYXBob3JlID0gQ3JlYXRlU2VtYXBob3JlKE5VTEwsIDAsIDB4N2ZmZmZmZmYsIE5VTEwpOwotICAgIGlmICghd2luMzJfY29uZC0+c2VtYXBob3JlKQotICAgICAgICByZXR1cm4gRU5PTUVNOwotICAgIHdpbjMyX2NvbmQtPndhaXRlcnNfZG9uZSA9IENyZWF0ZUV2ZW50KE5VTEwsIFRSVUUsIEZBTFNFLCBOVUxMKTsKLSAgICBpZiAoIXdpbjMyX2NvbmQtPndhaXRlcnNfZG9uZSkKLSAgICAgICAgcmV0dXJuIEVOT01FTTsKLQotICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmd2luMzJfY29uZC0+bXR4X3dhaXRlcl9jb3VudCwgTlVMTCk7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZ3aW4zMl9jb25kLT5tdHhfYnJvYWRjYXN0LCBOVUxMKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGF2X3VudXNlZCBpbnQgcHRocmVhZF9jb25kX2Rlc3Ryb3kocHRocmVhZF9jb25kX3QgKmNvbmQpCi17Ci0gICAgd2luMzJfY29uZF90ICp3aW4zMl9jb25kID0gY29uZC0+UHRyOwotICAgIC8qIG5hdGl2ZSBjb25kaXRpb24gdmFyaWFibGVzIGRvIG5vdCBkZXN0cm95ICovCi0gICAgaWYgKGNvbmRfaW5pdCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBub24gbmF0aXZlIGNvbmRpdGlvbiB2YXJpYWJsZXMgKi8KLSAgICBDbG9zZUhhbmRsZSh3aW4zMl9jb25kLT5zZW1hcGhvcmUpOwotICAgIENsb3NlSGFuZGxlKHdpbjMyX2NvbmQtPndhaXRlcnNfZG9uZSk7Ci0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZ3aW4zMl9jb25kLT5tdHhfd2FpdGVyX2NvdW50KTsKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJndpbjMyX2NvbmQtPm10eF9icm9hZGNhc3QpOwotICAgIGF2X2ZyZWVwKCZ3aW4zMl9jb25kKTsKLSAgICBjb25kLT5QdHIgPSBOVUxMOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXZfdW51c2VkIGludCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KHB0aHJlYWRfY29uZF90ICpjb25kKQotewotICAgIHdpbjMyX2NvbmRfdCAqd2luMzJfY29uZCA9IGNvbmQtPlB0cjsKLSAgICBpbnQgaGF2ZV93YWl0ZXI7Ci0KLSAgICBpZiAoY29uZF9icm9hZGNhc3QpIHsKLSAgICAgICAgY29uZF9icm9hZGNhc3QoY29uZCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIG5vbiBuYXRpdmUgY29uZGl0aW9uIHZhcmlhYmxlcyAqLwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmd2luMzJfY29uZC0+bXR4X2Jyb2FkY2FzdCk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3aW4zMl9jb25kLT5tdHhfd2FpdGVyX2NvdW50KTsKLSAgICBoYXZlX3dhaXRlciA9IDA7Ci0KLSAgICBpZiAod2luMzJfY29uZC0+d2FpdGVyX2NvdW50KSB7Ci0gICAgICAgIHdpbjMyX2NvbmQtPmlzX2Jyb2FkY2FzdCA9IDE7Ci0gICAgICAgIGhhdmVfd2FpdGVyID0gMTsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZV93YWl0ZXIpIHsKLSAgICAgICAgUmVsZWFzZVNlbWFwaG9yZSh3aW4zMl9jb25kLT5zZW1hcGhvcmUsIHdpbjMyX2NvbmQtPndhaXRlcl9jb3VudCwgTlVMTCk7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3aW4zMl9jb25kLT5tdHhfd2FpdGVyX2NvdW50KTsKLSAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCh3aW4zMl9jb25kLT53YWl0ZXJzX2RvbmUsIElORklOSVRFKTsKLSAgICAgICAgUmVzZXRFdmVudCh3aW4zMl9jb25kLT53YWl0ZXJzX2RvbmUpOwotICAgICAgICB3aW4zMl9jb25kLT5pc19icm9hZGNhc3QgPSAwOwotICAgIH0gZWxzZQotICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd2luMzJfY29uZC0+bXR4X3dhaXRlcl9jb3VudCk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJndpbjMyX2NvbmQtPm10eF9icm9hZGNhc3QpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXZfdW51c2VkIGludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKLXsKLSAgICB3aW4zMl9jb25kX3QgKndpbjMyX2NvbmQgPSBjb25kLT5QdHI7Ci0gICAgaW50IGxhc3Rfd2FpdGVyOwotICAgIGlmIChjb25kX3dhaXQpIHsKLSAgICAgICAgY29uZF93YWl0KGNvbmQsIG11dGV4LCBJTkZJTklURSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIG5vbiBuYXRpdmUgY29uZGl0aW9uIHZhcmlhYmxlcyAqLwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmd2luMzJfY29uZC0+bXR4X2Jyb2FkY2FzdCk7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3aW4zMl9jb25kLT5tdHhfd2FpdGVyX2NvdW50KTsKLSAgICB3aW4zMl9jb25kLT53YWl0ZXJfY291bnQrKzsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd2luMzJfY29uZC0+bXR4X3dhaXRlcl9jb3VudCk7Ci0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJndpbjMyX2NvbmQtPm10eF9icm9hZGNhc3QpOwotCi0gICAgLy8gdW5sb2NrIHRoZSBleHRlcm5hbCBtdXRleAotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKLSAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KHdpbjMyX2NvbmQtPnNlbWFwaG9yZSwgSU5GSU5JVEUpOwotCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3aW4zMl9jb25kLT5tdHhfd2FpdGVyX2NvdW50KTsKLSAgICB3aW4zMl9jb25kLT53YWl0ZXJfY291bnQtLTsKLSAgICBsYXN0X3dhaXRlciA9ICF3aW4zMl9jb25kLT53YWl0ZXJfY291bnQgfHwgIXdpbjMyX2NvbmQtPmlzX2Jyb2FkY2FzdDsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd2luMzJfY29uZC0+bXR4X3dhaXRlcl9jb3VudCk7Ci0KLSAgICBpZiAobGFzdF93YWl0ZXIpCi0gICAgICAgIFNldEV2ZW50KHdpbjMyX2NvbmQtPndhaXRlcnNfZG9uZSk7Ci0KLSAgICAvLyBsb2NrIHRoZSBleHRlcm5hbCBtdXRleAotICAgIHJldHVybiBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpOwotfQotCi1zdGF0aWMgYXZfdW51c2VkIGludCBwdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90ICpjb25kKQotewotICAgIHdpbjMyX2NvbmRfdCAqd2luMzJfY29uZCA9IGNvbmQtPlB0cjsKLSAgICBpbnQgaGF2ZV93YWl0ZXI7Ci0gICAgaWYgKGNvbmRfc2lnbmFsKSB7Ci0gICAgICAgIGNvbmRfc2lnbmFsKGNvbmQpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJndpbjMyX2NvbmQtPm10eF9icm9hZGNhc3QpOwotCi0gICAgLyogbm9uLW5hdGl2ZSBjb25kaXRpb24gdmFyaWFibGVzICovCi0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3aW4zMl9jb25kLT5tdHhfd2FpdGVyX2NvdW50KTsKLSAgICBoYXZlX3dhaXRlciA9IHdpbjMyX2NvbmQtPndhaXRlcl9jb3VudDsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmd2luMzJfY29uZC0+bXR4X3dhaXRlcl9jb3VudCk7Ci0KLSAgICBpZiAoaGF2ZV93YWl0ZXIpIHsKLSAgICAgICAgUmVsZWFzZVNlbWFwaG9yZSh3aW4zMl9jb25kLT5zZW1hcGhvcmUsIDEsIE5VTEwpOwotICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KHdpbjMyX2NvbmQtPndhaXRlcnNfZG9uZSwgSU5GSU5JVEUpOwotICAgICAgICBSZXNldEV2ZW50KHdpbjMyX2NvbmQtPndhaXRlcnNfZG9uZSk7Ci0gICAgfQotCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJndpbjMyX2NvbmQtPm10eF9icm9hZGNhc3QpOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBhdl91bnVzZWQgdm9pZCB3MzJ0aHJlYWRfaW5pdCh2b2lkKQotewotI2lmIF9XSU4zMl9XSU5OVCA8IDB4MDYwMAotICAgIEhBTkRMRSBrZXJuZWxfZGxsID0gR2V0TW9kdWxlSGFuZGxlKFRFWFQoImtlcm5lbDMyLmRsbCIpKTsKLSAgICAvKiBpZiBvbmUgaXMgYXZhaWxhYmxlLCB0aGVuIHRoZXkgc2hvdWxkIGFsbCBiZSBhdmFpbGFibGUgKi8KLSAgICBjb25kX2luaXQgICAgICA9Ci0gICAgICAgICh2b2lkKilHZXRQcm9jQWRkcmVzcyhrZXJuZWxfZGxsLCAiSW5pdGlhbGl6ZUNvbmRpdGlvblZhcmlhYmxlIik7Ci0gICAgY29uZF9icm9hZGNhc3QgPQotICAgICAgICAodm9pZCopR2V0UHJvY0FkZHJlc3Moa2VybmVsX2RsbCwgIldha2VBbGxDb25kaXRpb25WYXJpYWJsZSIpOwotICAgIGNvbmRfc2lnbmFsICAgID0KLSAgICAgICAgKHZvaWQqKUdldFByb2NBZGRyZXNzKGtlcm5lbF9kbGwsICJXYWtlQ29uZGl0aW9uVmFyaWFibGUiKTsKLSAgICBjb25kX3dhaXQgICAgICA9Ci0gICAgICAgICh2b2lkKilHZXRQcm9jQWRkcmVzcyhrZXJuZWxfZGxsLCAiU2xlZXBDb25kaXRpb25WYXJpYWJsZUNTIik7Ci0gICAgaW5pdG9uY2VfYmVnaW4gPQotICAgICAgICAodm9pZCopR2V0UHJvY0FkZHJlc3Moa2VybmVsX2RsbCwgIkluaXRPbmNlQmVnaW5Jbml0aWFsaXplIik7Ci0gICAgaW5pdG9uY2VfY29tcGxldGUgPQotICAgICAgICAodm9pZCopR2V0UHJvY0FkZHJlc3Moa2VybmVsX2RsbCwgIkluaXRPbmNlQ29tcGxldGUiKTsKLSNlbmRpZgotCi19Ci0KICNlbmRpZiAvKiBDT01QQVRfVzMyUFRIUkVBRFNfSCAqLwpkaWZmIC0tZ2l0IGEvY29tcGF0L3dpbmRvd3MvbWFrZWRlZiBiL2NvbXBhdC93aW5kb3dzL21ha2VkZWYKaW5kZXggZmNhZjEwOC4uNzI1OGI5NCAxMDA3NTUKLS0tIGEvY29tcGF0L3dpbmRvd3MvbWFrZWRlZgorKysgYi9jb21wYXQvd2luZG93cy9tYWtlZGVmCkBAIC00NSw3ICs0NSwxMSBAQAogCiB0cmFwICdybSAtZiAtLSAkbGlibmFtZScgRVhJVAogCi1saWIgLW91dDoke2xpYm5hbWV9ICRAID4vZGV2L251bGwKK2lmIFsgLW4gIiRBUiIgXTsgdGhlbgorICAgICRBUiByY3MgJHtsaWJuYW1lfSAkQCA+L2Rldi9udWxsCitlbHNlCisgICAgbGliIC1vdXQ6JHtsaWJuYW1lfSAkQCA+L2Rldi9udWxsCitmaQogaWYgWyAkPyAhPSAwIF07IHRoZW4KICAgICBlY2hvICJDb3VsZCBub3QgY3JlYXRlIHRlbXBvcmFyeSBsaWJyYXJ5LiIgPiYyCiAgICAgZXhpdCAxCkBAIC01NCwyMyArNTgsNyBAQAogSUZTPScKICcKIAotIyBEZXRlcm1pbmUgaWYgd2UncmUgYnVpbGRpbmcgZm9yIHg4NiBvciB4ODZfNjQgYW5kCi0jIHNldCB0aGUgc3ltYm9sIHByZWZpeCBhY2NvcmRpbmdseS4KLXByZWZpeD0iIgotYXJjaD0kKGR1bXBiaW4gLWhlYWRlcnMgJHtsaWJuYW1lfSB8Ci0gICAgICAgdHIgJ1x0JyAnICcgfAotICAgICAgIGdyZXAgJ14gXCsuXCttYWNoaW5lIFwrKC5cKyknIHwKLSAgICAgICBoZWFkIC0xIHwKLSAgICAgICBzZWQgLWUgJ3MvXiBcezEsXH0uXHsxLFx9IFx7MSxcfW1hY2hpbmUgXHsxLFx9KFwoLi4uXCkpLiovXDEvJykKLQotaWYgWyAiJHthcmNofSIgPSAieDg2IiBdOyB0aGVuCi0gICAgcHJlZml4PSJfIgotZWxzZQotICAgIGlmIFsgIiR7YXJjaH0iICE9ICJBUk0iIF0gJiYgWyAiJHthcmNofSIgIT0gIng2NCIgXTsgdGhlbgotICAgICAgICBlY2hvICJVbmtub3duIG1hY2hpbmUgdHlwZS4iID4mMgotICAgICAgICBleGl0IDEKLSAgICBmaQotZmkKK3ByZWZpeD0iJEVYVEVSTl9QUkVGSVgiCiAKIHN0YXJ0ZWQ9MAogcmVnZXg9Im5vbmUiCkBAIC0xMTIsNyArMTAwLDE5IEBACiAnCiBkb25lCiAKLWR1bXA9JChkdW1wYmluIC1saW5rZXJtZW1iZXI6MSAke2xpYm5hbWV9KQoraWYgWyAtbiAiJE5NIiBdOyB0aGVuCisgICAgIyBVc2UgZXZhbCwgc2luY2UgTk09Im5tIC1nIgorICAgIGR1bXA9JChldmFsICIkTk0gLS1kZWZpbmVkLW9ubHkgLWcgJHtsaWJuYW1lfSIgfAorICAgICAgICAgICAgICBncmVwIC12IDogfAorICAgICAgICAgICAgICBncmVwIC12IF4kIHwKKyAgICAgICAgICAgICAgY3V0IC1kJyAnIC1mMyB8CisgICAgICAgICAgICAgIHNlZCAtZSAicy9eJHtwcmVmaXh9Ly8iKQorZWxzZQorICAgIGR1bXA9JChkdW1wYmluIC1saW5rZXJtZW1iZXI6MSAke2xpYm5hbWV9IHwKKyAgICAgICAgICAgICAgc2VkIC1lICcvcHVibGljIHN5bWJvbHMvLCQhZCcgLWUgJy9eIFx7MSxcfVN1bW1hcnkvLCRkJyAtZSAicy8gXHsxLFx9JHtwcmVmaXh9LyAvIiAtZSAncy8gXHsxLFx9LyAvZycgfAorICAgICAgICAgICAgICB0YWlsIC1uICsyIHwKKyAgICAgICAgICAgICAgY3V0IC1kJyAnIC1mMykKK2ZpCiAKIHJtICR7bGlibmFtZX0KIApAQCAtMTIxLDkgKzEyMSw2IEBACiBmb3IgZXhwIGluICR7cmVnZXh9OyBkbwogICAgIGxpc3Q9IiR7bGlzdH0iJwogJyQoZWNobyAiJHtkdW1wfSIgfAotICAgICAgICAgIHNlZCAtZSAnL3B1YmxpYyBzeW1ib2xzLywkIWQnIC1lICcvXiBcezEsXH1TdW1tYXJ5LywkZCcgLWUgInMvIFx7MSxcfSR7cHJlZml4fS8gLyIgLWUgJ3MvIFx7MSxcfS8gL2cnIHwKLSAgICAgICAgICB0YWlsIC1uICsyIHwKLSAgICAgICAgICBjdXQgLWQnICcgLWYzIHwKICAgICAgICAgICBncmVwICJeJHtleHB9IiB8CiAgICAgICAgICAgc2VkIC1lICdzL14vICAgIC8nKQogZG9uZQpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmlndXJlCmluZGV4IDIxNDhmMTEuLjE1ZTZjMzIgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQorKysgYi9jb25maWd1cmUKQEAgLTYzLDYgKzYzLDcgQEAKIAogSGVscCBvcHRpb25zOgogICAtLWhlbHAgICAgICAgICAgICAgICAgICAgcHJpbnQgdGhpcyBtZXNzYWdlCisgIC0tcXVpZXQgICAgICAgICAgICAgICAgICBTdXBwcmVzcyBzaG93aW5nIGluZm9ybWF0aXZlIG91dHB1dAogICAtLWxpc3QtZGVjb2RlcnMgICAgICAgICAgc2hvdyBhbGwgYXZhaWxhYmxlIGRlY29kZXJzCiAgIC0tbGlzdC1lbmNvZGVycyAgICAgICAgICBzaG93IGFsbCBhdmFpbGFibGUgZW5jb2RlcnMKICAgLS1saXN0LWh3YWNjZWxzICAgICAgICAgIHNob3cgYWxsIGF2YWlsYWJsZSBoYXJkd2FyZSBhY2NlbGVyYXRvcnMKQEAgLTc2LDEwICs3NywxMCBAQAogICAtLWxpc3QtZmlsdGVycyAgICAgICAgICAgc2hvdyBhbGwgYXZhaWxhYmxlIGZpbHRlcnMKIAogU3RhbmRhcmQgb3B0aW9uczoKLSAgLS1sb2dmaWxlPUZJTEUgICAgICAgICAgIGxvZyB0ZXN0cyBhbmQgb3V0cHV0IHRvIEZJTEUgW2NvbmZpZy5sb2ddCisgIC0tbG9nZmlsZT1GSUxFICAgICAgICAgICBsb2cgdGVzdHMgYW5kIG91dHB1dCB0byBGSUxFIFtmZmJ1aWxkL2NvbmZpZy5sb2ddCiAgIC0tZGlzYWJsZS1sb2dnaW5nICAgICAgICBkbyBub3QgbG9nIGNvbmZpZ3VyZSBkZWJ1ZyBpbmZvcm1hdGlvbgogICAtLWZhdGFsLXdhcm5pbmdzICAgICAgICAgZmFpbCBpZiBhbnkgY29uZmlndXJlIHdhcm5pbmcgaXMgZ2VuZXJhdGVkCi0gIC0tcHJlZml4PVBSRUZJWCAgICAgICAgICBpbnN0YWxsIGluIFBSRUZJWCBbJHByZWZpeF0KKyAgLS1wcmVmaXg9UFJFRklYICAgICAgICAgIGluc3RhbGwgaW4gUFJFRklYIFskcHJlZml4X2RlZmF1bHRdCiAgIC0tYmluZGlyPURJUiAgICAgICAgICAgICBpbnN0YWxsIGJpbmFyaWVzIGluIERJUiBbUFJFRklYL2Jpbl0KICAgLS1kYXRhZGlyPURJUiAgICAgICAgICAgIGluc3RhbGwgZGF0YSBmaWxlcyBpbiBESVIgW1BSRUZJWC9zaGFyZS9mZm1wZWddCiAgIC0tZG9jZGlyPURJUiAgICAgICAgICAgICBpbnN0YWxsIGRvY3VtZW50YXRpb24gaW4gRElSIFtQUkVGSVgvc2hhcmUvZG9jL2ZmbXBlZ10KQEAgLTkwLDcgKzkxLDggQEAKICAgLS1wa2djb25maWdkaXI9RElSICAgICAgIGluc3RhbGwgcGtnLWNvbmZpZyBmaWxlcyBpbiBESVIgW0xJQkRJUi9wa2djb25maWddCiAgIC0tZW5hYmxlLXJwYXRoICAgICAgICAgICB1c2UgcnBhdGggdG8gYWxsb3cgaW5zdGFsbGluZyBsaWJyYXJpZXMgaW4gcGF0aHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwYXJ0IG9mIHRoZSBkeW5hbWljIGxpbmtlciBzZWFyY2ggcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlIHJwYXRoIHdoZW4gbGlua2luZyBwcm9ncmFtcyBbVVNFIFdJVEggQ0FSRV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZSBycGF0aCB3aGVuIGxpbmtpbmcgcHJvZ3JhbXMgKFVTRSBXSVRIIENBUkUpCisgIC0taW5zdGFsbC1uYW1lLWRpcj1ESVIgICBEYXJ3aW4gZGlyZWN0b3J5IG5hbWUgZm9yIGluc3RhbGxlZCB0YXJnZXRzCiAKIExpY2Vuc2luZyBvcHRpb25zOgogICAtLWVuYWJsZS1ncGwgICAgICAgICAgICAgYWxsb3cgdXNlIG9mIEdQTCBjb2RlLCB0aGUgcmVzdWx0aW5nIGxpYnMKQEAgLTEwMywxOSArMTA1LDE3IEBACiAgIC0tZGlzYWJsZS1zdGF0aWMgICAgICAgICBkbyBub3QgYnVpbGQgc3RhdGljIGxpYnJhcmllcyBbbm9dCiAgIC0tZW5hYmxlLXNoYXJlZCAgICAgICAgICBidWlsZCBzaGFyZWQgbGlicmFyaWVzIFtub10KICAgLS1lbmFibGUtc21hbGwgICAgICAgICAgIG9wdGltaXplIGZvciBzaXplIGluc3RlYWQgb2Ygc3BlZWQKLSAgLS1kaXNhYmxlLXJ1bnRpbWUtY3B1ZGV0ZWN0IGRpc2FibGUgZGV0ZWN0aW5nIGNwdSBjYXBhYmlsaXRpZXMgYXQgcnVudGltZSAoc21hbGxlciBiaW5hcnkpCisgIC0tZGlzYWJsZS1ydW50aW1lLWNwdWRldGVjdCBkaXNhYmxlIGRldGVjdGluZyBDUFUgY2FwYWJpbGl0aWVzIGF0IHJ1bnRpbWUgKHNtYWxsZXIgYmluYXJ5KQogICAtLWVuYWJsZS1ncmF5ICAgICAgICAgICAgZW5hYmxlIGZ1bGwgZ3JheXNjYWxlIHN1cHBvcnQgKHNsb3dlciBjb2xvcikKICAgLS1kaXNhYmxlLXN3c2NhbGUtYWxwaGEgIGRpc2FibGUgYWxwaGEgY2hhbm5lbCBzdXBwb3J0IGluIHN3c2NhbGUKICAgLS1kaXNhYmxlLWFsbCAgICAgICAgICAgIGRpc2FibGUgYnVpbGRpbmcgY29tcG9uZW50cywgbGlicmFyaWVzIGFuZCBwcm9ncmFtcwotICAtLWVuYWJsZS1pbmNvbXBhdGlibGUtbGliYXYtYWJpIGVuYWJsZSBpbmNvbXBhdGlibGUgTGliYXYgZm9yayBBQkkgW25vXQotICAtLWVuYWJsZS1yYWlzZS1tYWpvciAgICAgaW5jcmVhc2UgbWFqb3IgdmVyc2lvbiBudW1iZXJzIGluIHNvbmFtZXMgW25vXQorICAtLWRpc2FibGUtYXV0b2RldGVjdCAgICAgZGlzYWJsZSBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGV4dGVybmFsIGxpYnJhcmllcyBbbm9dCiAKIFByb2dyYW0gb3B0aW9uczoKICAgLS1kaXNhYmxlLXByb2dyYW1zICAgICAgIGRvIG5vdCBidWlsZCBjb21tYW5kIGxpbmUgcHJvZ3JhbXMKICAgLS1kaXNhYmxlLWZmbXBlZyAgICAgICAgIGRpc2FibGUgZmZtcGVnIGJ1aWxkCiAgIC0tZGlzYWJsZS1mZnBsYXkgICAgICAgICBkaXNhYmxlIGZmcGxheSBidWlsZAogICAtLWRpc2FibGUtZmZwcm9iZSAgICAgICAgZGlzYWJsZSBmZnByb2JlIGJ1aWxkCi0gIC0tZGlzYWJsZS1mZnNlcnZlciAgICAgICBkaXNhYmxlIGZmc2VydmVyIGJ1aWxkCiAKIERvY3VtZW50YXRpb24gb3B0aW9uczoKICAgLS1kaXNhYmxlLWRvYyAgICAgICAgICAgIGRvIG5vdCBidWlsZCBkb2N1bWVudGF0aW9uCkBAIC0xMzIsNyArMTMyLDcgQEAKICAgLS1kaXNhYmxlLXN3c2NhbGUgICAgICAgIGRpc2FibGUgbGlic3dzY2FsZSBidWlsZAogICAtLWRpc2FibGUtcG9zdHByb2MgICAgICAgZGlzYWJsZSBsaWJwb3N0cHJvYyBidWlsZAogICAtLWRpc2FibGUtYXZmaWx0ZXIgICAgICAgZGlzYWJsZSBsaWJhdmZpbHRlciBidWlsZAotICAtLWVuYWJsZS1hdnJlc2FtcGxlICAgICAgZW5hYmxlIGxpYmF2cmVzYW1wbGUgYnVpbGQgW25vXQorICAtLWVuYWJsZS1hdnJlc2FtcGxlICAgICAgZW5hYmxlIGxpYmF2cmVzYW1wbGUgYnVpbGQgKGRlcHJlY2F0ZWQpIFtub10KICAgLS1kaXNhYmxlLXB0aHJlYWRzICAgICAgIGRpc2FibGUgcHRocmVhZHMgW2F1dG9kZXRlY3RdCiAgIC0tZGlzYWJsZS13MzJ0aHJlYWRzICAgICBkaXNhYmxlIFdpbjMyIHRocmVhZHMgW2F1dG9kZXRlY3RdCiAgIC0tZGlzYWJsZS1vczJ0aHJlYWRzICAgICBkaXNhYmxlIE9TLzIgdGhyZWFkcyBbYXV0b2RldGVjdF0KQEAgLTE0OCwxNCArMTQ4LDYgQEAKICAgLS1kaXNhYmxlLWZhYW4gICAgICAgICAgIGRpc2FibGUgZmxvYXRpbmcgcG9pbnQgQUFOIChJKURDVCBjb2RlCiAgIC0tZGlzYWJsZS1waXhlbHV0aWxzICAgICBkaXNhYmxlIHBpeGVsIHV0aWxzIGluIGxpYmF2dXRpbAogCi1IYXJkd2FyZSBhY2NlbGVyYXRvcnM6Ci0gIC0tZGlzYWJsZS1kM2QxMXZhICAgICAgICBkaXNhYmxlIEQzRDExVkEgY29kZSBbYXV0b2RldGVjdF0KLSAgLS1kaXNhYmxlLWR4dmEyICAgICAgICAgIGRpc2FibGUgRFhWQTIgY29kZSBbYXV0b2RldGVjdF0KLSAgLS1kaXNhYmxlLXZhYXBpICAgICAgICAgIGRpc2FibGUgVkFBUEkgY29kZSBbYXV0b2RldGVjdF0KLSAgLS1kaXNhYmxlLXZkYSAgICAgICAgICAgIGRpc2FibGUgVkRBIGNvZGUgW2F1dG9kZXRlY3RdCi0gIC0tZGlzYWJsZS12ZHBhdSAgICAgICAgICBkaXNhYmxlIFZEUEFVIGNvZGUgW2F1dG9kZXRlY3RdCi0gIC0tZW5hYmxlLXZpZGVvdG9vbGJveCAgICBlbmFibGUgVmlkZW9Ub29sYm94IGNvZGUgW2F1dG9kZXRlY3RdCi0KIEluZGl2aWR1YWwgY29tcG9uZW50IG9wdGlvbnM6CiAgIC0tZGlzYWJsZS1ldmVyeXRoaW5nICAgICBkaXNhYmxlIGFsbCBjb21wb25lbnRzIGxpc3RlZCBiZWxvdwogICAtLWRpc2FibGUtZW5jb2Rlcj1OQU1FICAgZGlzYWJsZSBlbmNvZGVyIE5BTUUKQEAgLTE5NCwxOSArMTg2LDM4IEBACiAgIC0tZGlzYWJsZS1maWx0ZXJzICAgICAgICBkaXNhYmxlIGFsbCBmaWx0ZXJzCiAKIEV4dGVybmFsIGxpYnJhcnkgc3VwcG9ydDoKKworICBVc2luZyBhbnkgb2YgdGhlIGZvbGxvd2luZyBzd2l0Y2hlcyB3aWxsIGFsbG93IEZGbXBlZyB0byBsaW5rIHRvIHRoZQorICBjb3JyZXNwb25kaW5nIGV4dGVybmFsIGxpYnJhcnkuIEFsbCB0aGUgY29tcG9uZW50cyBkZXBlbmRpbmcgb24gdGhhdCBsaWJyYXJ5CisgIHdpbGwgYmVjb21lIGVuYWJsZWQsIGlmIGFsbCB0aGVpciBvdGhlciBkZXBlbmRlbmNpZXMgYXJlIG1ldCBhbmQgdGhleSBhcmUgbm90CisgIGV4cGxpY2l0bHkgZGlzYWJsZWQuIEUuZy4gLS1lbmFibGUtbGlid2F2cGFjayB3aWxsIGVuYWJsZSBsaW5raW5nIHRvCisgIGxpYndhdnBhY2sgYW5kIGFsbG93IHRoZSBsaWJ3YXZwYWNrIGVuY29kZXIgdG8gYmUgYnVpbHQsIHVubGVzcyBpdCBpcworICBzcGVjaWZpY2FsbHkgZGlzYWJsZWQgd2l0aCAtLWRpc2FibGUtZW5jb2Rlcj1saWJ3YXZwYWNrLgorCisgIE5vdGUgdGhhdCBvbmx5IHRoZSBzeXN0ZW0gbGlicmFyaWVzIGFyZSBhdXRvLWRldGVjdGVkLiBBbGwgdGhlIG90aGVyIGV4dGVybmFsCisgIGxpYnJhcmllcyBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZC4KKworICBBbHNvIG5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIGhlbHAgdGV4dCBkZXNjcmliZXMgdGhlIHB1cnBvc2Ugb2YgdGhlIGxpYnJhcmllcworICB0aGVtc2VsdmVzLCBub3QgYWxsIHRoZWlyIGZlYXR1cmVzIHdpbGwgbmVjZXNzYXJpbHkgYmUgdXNhYmxlIGJ5IEZGbXBlZy4KKworICAtLWRpc2FibGUtYWxzYSAgICAgICAgICAgZGlzYWJsZSBBTFNBIHN1cHBvcnQgW2F1dG9kZXRlY3RdCisgIC0tZGlzYWJsZS1hcHBraXQgICAgICAgICBkaXNhYmxlIEFwcGxlIEFwcEtpdCBmcmFtZXdvcmsgW2F1dG9kZXRlY3RdCisgIC0tZGlzYWJsZS1hdmZvdW5kYXRpb24gICBkaXNhYmxlIEFwcGxlIEFWRm91bmRhdGlvbiBmcmFtZXdvcmsgW2F1dG9kZXRlY3RdCiAgIC0tZW5hYmxlLWF2aXN5bnRoICAgICAgICBlbmFibGUgcmVhZGluZyBvZiBBdmlTeW50aCBzY3JpcHQgZmlsZXMgW25vXQogICAtLWRpc2FibGUtYnpsaWIgICAgICAgICAgZGlzYWJsZSBiemxpYiBbYXV0b2RldGVjdF0KKyAgLS1kaXNhYmxlLWNvcmVpbWFnZSAgICAgIGRpc2FibGUgQXBwbGUgQ29yZUltYWdlIGZyYW1ld29yayBbYXV0b2RldGVjdF0KICAgLS1lbmFibGUtY2hyb21hcHJpbnQgICAgIGVuYWJsZSBhdWRpbyBmaW5nZXJwcmludGluZyB3aXRoIGNocm9tYXByaW50IFtub10KLSAgLS1lbmFibGUtZm9udGNvbmZpZyAgICAgIGVuYWJsZSBmb250Y29uZmlnLCB1c2VmdWwgZm9yIGRyYXd0ZXh0IGZpbHRlciBbbm9dCiAgIC0tZW5hYmxlLWZyZWkwciAgICAgICAgICBlbmFibGUgZnJlaTByIHZpZGVvIGZpbHRlcmluZyBbbm9dCiAgIC0tZW5hYmxlLWdjcnlwdCAgICAgICAgICBlbmFibGUgZ2NyeXB0LCBuZWVkZWQgZm9yIHJ0bXAodCllIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wZW5zc2wsIGxpYnJ0bXAgb3IgZ21wIGlzIG5vdCB1c2VkIFtub10KICAgLS1lbmFibGUtZ21wICAgICAgICAgICAgIGVuYWJsZSBnbXAsIG5lZWRlZCBmb3IgcnRtcCh0KWUgc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3BlbnNzbCBvciBsaWJydG1wIGlzIG5vdCB1c2VkIFtub10KICAgLS1lbmFibGUtZ251dGxzICAgICAgICAgIGVuYWJsZSBnbnV0bHMsIG5lZWRlZCBmb3IgaHR0cHMgc3VwcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3BlbnNzbCBpcyBub3QgdXNlZCBbbm9dCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcGVuc3NsIG9yIGxpYnRscyBpcyBub3QgdXNlZCBbbm9dCiAgIC0tZGlzYWJsZS1pY29udiAgICAgICAgICBkaXNhYmxlIGljb252IFthdXRvZGV0ZWN0XQorICAtLWVuYWJsZS1qbmkgICAgICAgICAgICAgZW5hYmxlIEpOSSBzdXBwb3J0IFtub10KICAgLS1lbmFibGUtbGFkc3BhICAgICAgICAgIGVuYWJsZSBMQURTUEEgYXVkaW8gZmlsdGVyaW5nIFtub10KKyAgLS1lbmFibGUtbGliYW9tICAgICAgICAgIGVuYWJsZSBBVjEgdmlkZW8gZW5jb2RpbmcvZGVjb2RpbmcgdmlhIGxpYmFvbSBbbm9dCiAgIC0tZW5hYmxlLWxpYmFzcyAgICAgICAgICBlbmFibGUgbGliYXNzIHN1YnRpdGxlcyByZW5kZXJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgZm9yIHN1YnRpdGxlcyBhbmQgYXNzIGZpbHRlciBbbm9dCiAgIC0tZW5hYmxlLWxpYmJsdXJheSAgICAgICBlbmFibGUgQmx1UmF5IHJlYWRpbmcgdXNpbmcgbGliYmx1cmF5IFtub10KQEAgLTIxNCw0NiArMjI1LDQ4IEBACiAgIC0tZW5hYmxlLWxpYmNhY2EgICAgICAgICBlbmFibGUgdGV4dHVhbCBkaXNwbGF5IHVzaW5nIGxpYmNhY2EgW25vXQogICAtLWVuYWJsZS1saWJjZWx0ICAgICAgICAgZW5hYmxlIENFTFQgZGVjb2RpbmcgdmlhIGxpYmNlbHQgW25vXQogICAtLWVuYWJsZS1saWJjZGlvICAgICAgICAgZW5hYmxlIGF1ZGlvIENEIGdyYWJiaW5nIHdpdGggbGliY2RpbyBbbm9dCisgIC0tZW5hYmxlLWxpYmNvZGVjMiAgICAgICBlbmFibGUgY29kZWMyIGVuL2RlY29kaW5nIHVzaW5nIGxpYmNvZGVjMiBbbm9dCiAgIC0tZW5hYmxlLWxpYmRjMTM5NCAgICAgICBlbmFibGUgSUlEQy0xMzk0IGdyYWJiaW5nIHVzaW5nIGxpYmRjMTM5NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxpYnJhdzEzOTQgW25vXQotICAtLWVuYWJsZS1saWJkY2FkZWMgICAgICAgZW5hYmxlIERDQSBkZWNvZGluZyB2aWEgbGliZGNhZGVjIFtub10KLSAgLS1lbmFibGUtbGliZmFhYyAgICAgICAgIGVuYWJsZSBBQUMgZW5jb2RpbmcgdmlhIGxpYmZhYWMgW25vXQogICAtLWVuYWJsZS1saWJmZGstYWFjICAgICAgZW5hYmxlIEFBQyBkZS9lbmNvZGluZyB2aWEgbGliZmRrLWFhYyBbbm9dCiAgIC0tZW5hYmxlLWxpYmZsaXRlICAgICAgICBlbmFibGUgZmxpdGUgKHZvaWNlIHN5bnRoZXNpcykgc3VwcG9ydCB2aWEgbGliZmxpdGUgW25vXQorICAtLWVuYWJsZS1saWJmb250Y29uZmlnICAgZW5hYmxlIGxpYmZvbnRjb25maWcsIHVzZWZ1bCBmb3IgZHJhd3RleHQgZmlsdGVyIFtub10KICAgLS1lbmFibGUtbGliZnJlZXR5cGUgICAgIGVuYWJsZSBsaWJmcmVldHlwZSwgbmVlZGVkIGZvciBkcmF3dGV4dCBmaWx0ZXIgW25vXQogICAtLWVuYWJsZS1saWJmcmliaWRpICAgICAgZW5hYmxlIGxpYmZyaWJpZGksIGltcHJvdmVzIGRyYXd0ZXh0IGZpbHRlciBbbm9dCiAgIC0tZW5hYmxlLWxpYmdtZSAgICAgICAgICBlbmFibGUgR2FtZSBNdXNpYyBFbXUgdmlhIGxpYmdtZSBbbm9dCiAgIC0tZW5hYmxlLWxpYmdzbSAgICAgICAgICBlbmFibGUgR1NNIGRlL2VuY29kaW5nIHZpYSBsaWJnc20gW25vXQogICAtLWVuYWJsZS1saWJpZWM2MTg4MyAgICAgZW5hYmxlIGllYzYxODgzIHZpYSBsaWJpZWM2MTg4MyBbbm9dCiAgIC0tZW5hYmxlLWxpYmlsYmMgICAgICAgICBlbmFibGUgaUxCQyBkZS9lbmNvZGluZyB2aWEgbGliaWxiYyBbbm9dCisgIC0tZW5hYmxlLWxpYmphY2sgICAgICAgICBlbmFibGUgSkFDSyBhdWRpbyBzb3VuZCBzZXJ2ZXIgW25vXQogICAtLWVuYWJsZS1saWJrdmF6YWFyICAgICAgZW5hYmxlIEhFVkMgZW5jb2RpbmcgdmlhIGxpYmt2YXphYXIgW25vXQotICAtLWVuYWJsZS1saWJtZnggICAgICAgICAgZW5hYmxlIEhXIGFjY2VsZXJhdGlvbiB0aHJvdWdoIGxpYm1meAogICAtLWVuYWJsZS1saWJtb2RwbHVnICAgICAgZW5hYmxlIE1vZFBsdWcgdmlhIGxpYm1vZHBsdWcgW25vXQogICAtLWVuYWJsZS1saWJtcDNsYW1lICAgICAgZW5hYmxlIE1QMyBlbmNvZGluZyB2aWEgbGlibXAzbGFtZSBbbm9dCi0gIC0tZW5hYmxlLWxpYm51dCAgICAgICAgICBlbmFibGUgTlVUIChkZSltdXhpbmcgdmlhIGxpYm51dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZSAoZGUpbXV4ZXIgZXhpc3RzIFtub10KICAgLS1lbmFibGUtbGlib3BlbmNvcmUtYW1ybmIgZW5hYmxlIEFNUi1OQiBkZS9lbmNvZGluZyB2aWEgbGlib3BlbmNvcmUtYW1ybmIgW25vXQogICAtLWVuYWJsZS1saWJvcGVuY29yZS1hbXJ3YiBlbmFibGUgQU1SLVdCIGRlY29kaW5nIHZpYSBsaWJvcGVuY29yZS1hbXJ3YiBbbm9dCiAgIC0tZW5hYmxlLWxpYm9wZW5jdiAgICAgICBlbmFibGUgdmlkZW8gZmlsdGVyaW5nIHZpYSBsaWJvcGVuY3YgW25vXQogICAtLWVuYWJsZS1saWJvcGVuaDI2NCAgICAgZW5hYmxlIEguMjY0IGVuY29kaW5nIHZpYSBPcGVuSDI2NCBbbm9dCiAgIC0tZW5hYmxlLWxpYm9wZW5qcGVnICAgICBlbmFibGUgSlBFRyAyMDAwIGRlL2VuY29kaW5nIHZpYSBPcGVuSlBFRyBbbm9dCisgIC0tZW5hYmxlLWxpYm9wZW5tcHQgICAgICBlbmFibGUgZGVjb2RpbmcgdHJhY2tlZCBmaWxlcyB2aWEgbGlib3Blbm1wdCBbbm9dCiAgIC0tZW5hYmxlLWxpYm9wdXMgICAgICAgICBlbmFibGUgT3B1cyBkZS9lbmNvZGluZyB2aWEgbGlib3B1cyBbbm9dCiAgIC0tZW5hYmxlLWxpYnB1bHNlICAgICAgICBlbmFibGUgUHVsc2VhdWRpbyBpbnB1dCB2aWEgbGlicHVsc2UgW25vXQorICAtLWVuYWJsZS1saWJyc3ZnICAgICAgICAgZW5hYmxlIFNWRyByYXN0ZXJpemF0aW9uIHZpYSBsaWJyc3ZnIFtub10KICAgLS1lbmFibGUtbGlicnViYmVyYmFuZCAgIGVuYWJsZSBydWJiZXJiYW5kIG5lZWRlZCBmb3IgcnViYmVyYmFuZCBmaWx0ZXIgW25vXQogICAtLWVuYWJsZS1saWJydG1wICAgICAgICAgZW5hYmxlIFJUTVBbRV0gc3VwcG9ydCB2aWEgbGlicnRtcCBbbm9dCi0gIC0tZW5hYmxlLWxpYnNjaHJvZWRpbmdlciBlbmFibGUgRGlyYWMgZGUvZW5jb2RpbmcgdmlhIGxpYnNjaHJvZWRpbmdlciBbbm9dCiAgIC0tZW5hYmxlLWxpYnNoaW5lICAgICAgICBlbmFibGUgZml4ZWQtcG9pbnQgTVAzIGVuY29kaW5nIHZpYSBsaWJzaGluZSBbbm9dCiAgIC0tZW5hYmxlLWxpYnNtYmNsaWVudCAgICBlbmFibGUgU2FtYmEgcHJvdG9jb2wgdmlhIGxpYnNtYmNsaWVudCBbbm9dCiAgIC0tZW5hYmxlLWxpYnNuYXBweSAgICAgICBlbmFibGUgU25hcHB5IGNvbXByZXNzaW9uLCBuZWVkZWQgZm9yIGhhcCBlbmNvZGluZyBbbm9dCiAgIC0tZW5hYmxlLWxpYnNveHIgICAgICAgICBlbmFibGUgSW5jbHVkZSBsaWJzb3hyIHJlc2FtcGxpbmcgW25vXQogICAtLWVuYWJsZS1saWJzcGVleCAgICAgICAgZW5hYmxlIFNwZWV4IGRlL2VuY29kaW5nIHZpYSBsaWJzcGVleCBbbm9dCisgIC0tZW5hYmxlLWxpYnNydCAgICAgICAgICBlbmFibGUgSGFpdmlzaW9uIFNSVCBwcm90b2NvbCB2aWEgbGlic3J0IFtub10KICAgLS1lbmFibGUtbGlic3NoICAgICAgICAgIGVuYWJsZSBTRlRQIHByb3RvY29sIHZpYSBsaWJzc2ggW25vXQogICAtLWVuYWJsZS1saWJ0ZXNzZXJhY3QgICAgZW5hYmxlIFRlc3NlcmFjdCwgbmVlZGVkIGZvciBvY3IgZmlsdGVyIFtub10KICAgLS1lbmFibGUtbGlidGhlb3JhICAgICAgIGVuYWJsZSBUaGVvcmEgZW5jb2RpbmcgdmlhIGxpYnRoZW9yYSBbbm9dCisgIC0tZW5hYmxlLWxpYnRscyAgICAgICAgICBlbmFibGUgTGlicmVTU0wgKHZpYSBsaWJ0bHMpLCBuZWVkZWQgZm9yIGh0dHBzIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wZW5zc2wgb3IgZ251dGxzIGlzIG5vdCB1c2VkIFtub10KICAgLS1lbmFibGUtbGlidHdvbGFtZSAgICAgIGVuYWJsZSBNUDIgZW5jb2RpbmcgdmlhIGxpYnR3b2xhbWUgW25vXQotICAtLWVuYWJsZS1saWJ1dHZpZGVvICAgICAgZW5hYmxlIFV0IFZpZGVvIGVuY29kaW5nIGFuZCBkZWNvZGluZyB2aWEgbGlidXR2aWRlbyBbbm9dCiAgIC0tZW5hYmxlLWxpYnY0bDIgICAgICAgICBlbmFibGUgbGlidjRsMi92NGwtdXRpbHMgW25vXQogICAtLWVuYWJsZS1saWJ2aWRzdGFiICAgICAgZW5hYmxlIHZpZGVvIHN0YWJpbGl6YXRpb24gdXNpbmcgdmlkLnN0YWIgW25vXQorICAtLWVuYWJsZS1saWJ2bWFmICAgICAgICAgZW5hYmxlIHZtYWYgZmlsdGVyIHZpYSBsaWJ2bWFmIFtub10KICAgLS1lbmFibGUtbGlidm8tYW1yd2JlbmMgIGVuYWJsZSBBTVItV0IgZW5jb2RpbmcgdmlhIGxpYnZvLWFtcndiZW5jIFtub10KICAgLS1lbmFibGUtbGlidm9yYmlzICAgICAgIGVuYWJsZSBWb3JiaXMgZW4vZGVjb2RpbmcgdmlhIGxpYnZvcmJpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBleGlzdHMgW25vXQpAQCAtMjY5LDI4ICsyODIsNTIgQEAKICAgLS1lbmFibGUtbGlieGNiLXNoYXBlICAgIGVuYWJsZSBYMTEgZ3JhYmJpbmcgc2hhcGUgcmVuZGVyaW5nIFthdXRvZGV0ZWN0XQogICAtLWVuYWJsZS1saWJ4dmlkICAgICAgICAgZW5hYmxlIFh2aWQgZW5jb2RpbmcgdmlhIHh2aWRjb3JlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlIE1QRUctNC9YdmlkIGVuY29kZXIgZXhpc3RzIFtub10KKyAgLS1lbmFibGUtbGlieG1sMiAgICAgICAgIGVuYWJsZSBYTUwgcGFyc2luZyB1c2luZyB0aGUgQyBsaWJyYXJ5IGxpYnhtbDIgW25vXQogICAtLWVuYWJsZS1saWJ6aW1nICAgICAgICAgZW5hYmxlIHoubGliLCBuZWVkZWQgZm9yIHpzY2FsZSBmaWx0ZXIgW25vXQogICAtLWVuYWJsZS1saWJ6bXEgICAgICAgICAgZW5hYmxlIG1lc3NhZ2UgcGFzc2luZyB2aWEgbGliem1xIFtub10KICAgLS1lbmFibGUtbGlienZiaSAgICAgICAgIGVuYWJsZSB0ZWxldGV4dCBzdXBwb3J0IHZpYSBsaWJ6dmJpIFtub10KKyAgLS1lbmFibGUtbHYyICAgICAgICAgICAgIGVuYWJsZSBMVjIgYXVkaW8gZmlsdGVyaW5nIFtub10KICAgLS1kaXNhYmxlLWx6bWEgICAgICAgICAgIGRpc2FibGUgbHptYSBbYXV0b2RldGVjdF0KICAgLS1lbmFibGUtZGVja2xpbmsgICAgICAgIGVuYWJsZSBCbGFja21hZ2ljIERlY2tMaW5rIEkvTyBzdXBwb3J0IFtub10KLSAgLS1lbmFibGUtbW1hbCAgICAgICAgICAgIGVuYWJsZSBkZWNvZGluZyB2aWEgTU1BTCBbbm9dCi0gIC0tZW5hYmxlLW5ldGNkZiAgICAgICAgICBlbmFibGUgTmV0Q0RGLCBuZWVkZWQgZm9yIHNvZmFsaXplciBmaWx0ZXIgW25vXQotICAtLWVuYWJsZS1udmVuYyAgICAgICAgICAgZW5hYmxlIE5WSURJQSBOVkVOQyBzdXBwb3J0IFtub10KKyAgLS1lbmFibGUtbGlibmRpX25ld3RlayAgIGVuYWJsZSBOZXd0ZWNrIE5ESSBJL08gc3VwcG9ydCBbbm9dCisgIC0tZW5hYmxlLW1lZGlhY29kZWMgICAgICBlbmFibGUgQW5kcm9pZCBNZWRpYUNvZGVjIHN1cHBvcnQgW25vXQorICAtLWVuYWJsZS1saWJteXNvZmEgICAgICAgZW5hYmxlIGxpYm15c29mYSwgbmVlZGVkIGZvciBzb2ZhbGl6ZXIgZmlsdGVyIFtub10KICAgLS1lbmFibGUtb3BlbmFsICAgICAgICAgIGVuYWJsZSBPcGVuQUwgMS4xIGNhcHR1cmUgc3VwcG9ydCBbbm9dCi0gIC0tZW5hYmxlLW9wZW5jbCAgICAgICAgICBlbmFibGUgT3BlbkNMIGNvZGUKKyAgLS1lbmFibGUtb3BlbmNsICAgICAgICAgIGVuYWJsZSBPcGVuQ0wgcHJvY2Vzc2luZyBbbm9dCiAgIC0tZW5hYmxlLW9wZW5nbCAgICAgICAgICBlbmFibGUgT3BlbkdMIHJlbmRlcmluZyBbbm9dCiAgIC0tZW5hYmxlLW9wZW5zc2wgICAgICAgICBlbmFibGUgb3BlbnNzbCwgbmVlZGVkIGZvciBodHRwcyBzdXBwb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBnbnV0bHMgaXMgbm90IHVzZWQgW25vXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ251dGxzIG9yIGxpYnRscyBpcyBub3QgdXNlZCBbbm9dCisgIC0tZGlzYWJsZS1zbmRpbyAgICAgICAgICBkaXNhYmxlIHNuZGlvIHN1cHBvcnQgW2F1dG9kZXRlY3RdCiAgIC0tZGlzYWJsZS1zY2hhbm5lbCAgICAgICBkaXNhYmxlIFNDaGFubmVsIFNTUCwgbmVlZGVkIGZvciBUTFMgc3VwcG9ydCBvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93cyBpZiBvcGVuc3NsIGFuZCBnbnV0bHMgYXJlIG5vdCB1c2VkIFthdXRvZGV0ZWN0XQotICAtLWRpc2FibGUtc2RsICAgICAgICAgICAgZGlzYWJsZSBzZGwgW2F1dG9kZXRlY3RdCisgIC0tZGlzYWJsZS1zZGwyICAgICAgICAgICBkaXNhYmxlIHNkbDIgW2F1dG9kZXRlY3RdCiAgIC0tZGlzYWJsZS1zZWN1cmV0cmFuc3BvcnQgZGlzYWJsZSBTZWN1cmUgVHJhbnNwb3J0LCBuZWVkZWQgZm9yIFRMUyBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBPU1ggaWYgb3BlbnNzbCBhbmQgZ251dGxzIGFyZSBub3QgdXNlZCBbYXV0b2RldGVjdF0KLSAgLS1lbmFibGUteDExZ3JhYiAgICAgICAgIGVuYWJsZSBYMTEgZ3JhYmJpbmcgKGxlZ2FjeSkgW25vXQogICAtLWRpc2FibGUteGxpYiAgICAgICAgICAgZGlzYWJsZSB4bGliIFthdXRvZGV0ZWN0XQogICAtLWRpc2FibGUtemxpYiAgICAgICAgICAgZGlzYWJsZSB6bGliIFthdXRvZGV0ZWN0XQogCisgIFRoZSBmb2xsb3dpbmcgbGlicmFyaWVzIHByb3ZpZGUgdmFyaW91cyBoYXJkd2FyZSBhY2NlbGVyYXRpb24gZmVhdHVyZXM6CisgIC0tZGlzYWJsZS1hbWYgICAgICAgICAgICBkaXNhYmxlIEFNRiB2aWRlbyBlbmNvZGluZyBjb2RlIFthdXRvZGV0ZWN0XQorICAtLWRpc2FibGUtYXVkaW90b29sYm94ICAgZGlzYWJsZSBBcHBsZSBBdWRpb1Rvb2xib3ggY29kZSBbYXV0b2RldGVjdF0KKyAgLS1lbmFibGUtY3VkYS1zZGsgICAgICAgIGVuYWJsZSBDVURBIGZlYXR1cmVzIHRoYXQgcmVxdWlyZSB0aGUgQ1VEQSBTREsgW25vXQorICAtLWRpc2FibGUtY3V2aWQgICAgICAgICAgZGlzYWJsZSBOdmlkaWEgQ1VWSUQgc3VwcG9ydCBbYXV0b2RldGVjdF0KKyAgLS1kaXNhYmxlLWQzZDExdmEgICAgICAgIGRpc2FibGUgTWljcm9zb2Z0IERpcmVjdDNEIDExIHZpZGVvIGFjY2VsZXJhdGlvbiBjb2RlIFthdXRvZGV0ZWN0XQorICAtLWRpc2FibGUtZHh2YTIgICAgICAgICAgZGlzYWJsZSBNaWNyb3NvZnQgRGlyZWN0WCA5IHZpZGVvIGFjY2VsZXJhdGlvbiBjb2RlIFthdXRvZGV0ZWN0XQorICAtLWRpc2FibGUtZmZudmNvZGVjICAgICAgZGlzYWJsZSBkeW5hbWljYWxseSBsaW5rZWQgTnZpZGlhIGNvZGUgW2F1dG9kZXRlY3RdCisgIC0tZW5hYmxlLWxpYmRybSAgICAgICAgICBlbmFibGUgRFJNIGNvZGUgKExpbnV4KSBbbm9dCisgIC0tZW5hYmxlLWxpYm1meCAgICAgICAgICBlbmFibGUgSW50ZWwgTWVkaWFTREsgKEFLQSBRdWljayBTeW5jIFZpZGVvKSBjb2RlIHZpYSBsaWJtZnggW25vXQorICAtLWVuYWJsZS1saWJucHAgICAgICAgICAgZW5hYmxlIE52aWRpYSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzLWJhc2VkIGNvZGUgW25vXQorICAtLWVuYWJsZS1tbWFsICAgICAgICAgICAgZW5hYmxlIEJyb2FkY29tIE11bHRpLU1lZGlhIEFic3RyYWN0aW9uIExheWVyIChSYXNwYmVycnkgUGkpIHZpYSBNTUFMIFtub10KKyAgLS1kaXNhYmxlLW52ZGVjICAgICAgICAgIGRpc2FibGUgTnZpZGlhIHZpZGVvIGRlY29kaW5nIGFjY2VsZXJhdGlvbiAodmlhIGh3YWNjZWwpIFthdXRvZGV0ZWN0XQorICAtLWRpc2FibGUtbnZlbmMgICAgICAgICAgZGlzYWJsZSBOdmlkaWEgdmlkZW8gZW5jb2RpbmcgY29kZSBbYXV0b2RldGVjdF0KKyAgLS1lbmFibGUtb214ICAgICAgICAgICAgIGVuYWJsZSBPcGVuTUFYIElMIGNvZGUgW25vXQorICAtLWVuYWJsZS1vbXgtcnBpICAgICAgICAgZW5hYmxlIE9wZW5NQVggSUwgY29kZSBmb3IgUmFzcGJlcnJ5IFBpIFtub10KKyAgLS1lbmFibGUtcmttcHAgICAgICAgICAgIGVuYWJsZSBSb2NrY2hpcCBNZWRpYSBQcm9jZXNzIFBsYXRmb3JtIGNvZGUgW25vXQorICAtLWRpc2FibGUtdjRsMi1tMm0gICAgICAgZGlzYWJsZSBWNEwyIG1lbTJtZW0gY29kZSBbYXV0b2RldGVjdF0KKyAgLS1kaXNhYmxlLXZhYXBpICAgICAgICAgIGRpc2FibGUgVmlkZW8gQWNjZWxlcmF0aW9uIEFQSSAobWFpbmx5IFVuaXgvSW50ZWwpIGNvZGUgW2F1dG9kZXRlY3RdCisgIC0tZGlzYWJsZS12ZHBhdSAgICAgICAgICBkaXNhYmxlIE52aWRpYSBWaWRlbyBEZWNvZGUgYW5kIFByZXNlbnRhdGlvbiBBUEkgZm9yIFVuaXggY29kZSBbYXV0b2RldGVjdF0KKyAgLS1kaXNhYmxlLXZpZGVvdG9vbGJveCAgIGRpc2FibGUgVmlkZW9Ub29sYm94IGNvZGUgW2F1dG9kZXRlY3RdCisKIFRvb2xjaGFpbiBvcHRpb25zOgogICAtLWFyY2g9QVJDSCAgICAgICAgICAgICAgc2VsZWN0IGFyY2hpdGVjdHVyZSBbJGFyY2hdCiAgIC0tY3B1PUNQVSAgICAgICAgICAgICAgICBzZWxlY3QgdGhlIG1pbmltdW0gcmVxdWlyZWQgQ1BVIChhZmZlY3RzCkBAIC0zMDYsMTUgKzM0MywyMiBAQAogICAtLXRhcmdldC1zYW1wbGVzPURJUiAgICAgcGF0aCB0byBzYW1wbGVzIGRpcmVjdG9yeSBvbiB0YXJnZXQKICAgLS10ZW1wcHJlZml4PVBBVEggICAgICAgIGZvcmNlIGZpeGVkIGRpci9wcmVmaXggaW5zdGVhZCBvZiBta3RlbXAgZm9yIGNoZWNrcwogICAtLXRvb2xjaGFpbj1OQU1FICAgICAgICAgc2V0IHRvb2wgZGVmYXVsdHMgYWNjb3JkaW5nIHRvIE5BTUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChnY2MtYXNhbiwgY2xhbmctYXNhbiwgZ2NjLW1zYW4sIGNsYW5nLW1zYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnY2MtdHNhbiwgY2xhbmctdHNhbiwgZ2NjLXVzYW4sIGNsYW5nLXVzYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxncmluZC1tYXNzaWYsIHZhbGdyaW5kLW1lbWNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbXN2YywgaWNsLCBnY292LCBsbHZtLWNvdiwgaGFyZGVuZWQpCiAgIC0tbm09Tk0gICAgICAgICAgICAgICAgICB1c2Ugbm0gdG9vbCBOTSBbJG5tX2RlZmF1bHRdCiAgIC0tYXI9QVIgICAgICAgICAgICAgICAgICB1c2UgYXJjaGl2ZSB0b29sIEFSIFskYXJfZGVmYXVsdF0KICAgLS1hcz1BUyAgICAgICAgICAgICAgICAgIHVzZSBhc3NlbWJsZXIgQVMgWyRhc19kZWZhdWx0XQorICAtLWxuX3M9TE5fUyAgICAgICAgICAgICAgdXNlIHN5bWJvbGljIGxpbmsgdG9vbCBMTl9TIFskbG5fc19kZWZhdWx0XQorICAtLXN0cmlwPVNUUklQICAgICAgICAgICAgdXNlIHN0cmlwIHRvb2wgU1RSSVAgWyRzdHJpcF9kZWZhdWx0XQogICAtLXdpbmRyZXM9V0lORFJFUyAgICAgICAgdXNlIHdpbmRvd3MgcmVzb3VyY2UgY29tcGlsZXIgV0lORFJFUyBbJHdpbmRyZXNfZGVmYXVsdF0KLSAgLS15YXNtZXhlPUVYRSAgICAgICAgICAgIHVzZSB5YXNtLWNvbXBhdGlibGUgYXNzZW1ibGVyIEVYRSBbJHlhc21leGVfZGVmYXVsdF0KKyAgLS14ODZhc21leGU9RVhFICAgICAgICAgIHVzZSBuYXNtLWNvbXBhdGlibGUgYXNzZW1ibGVyIEVYRSBbJHg4NmFzbWV4ZV9kZWZhdWx0XQogICAtLWNjPUNDICAgICAgICAgICAgICAgICAgdXNlIEMgY29tcGlsZXIgQ0MgWyRjY19kZWZhdWx0XQogICAtLWN4eD1DWFggICAgICAgICAgICAgICAgdXNlIEMgY29tcGlsZXIgQ1hYIFskY3h4X2RlZmF1bHRdCiAgIC0tb2JqY2M9T0NDICAgICAgICAgICAgICB1c2UgT2JqQyBjb21waWxlciBPQ0MgWyRjY19kZWZhdWx0XQogICAtLWRlcC1jYz1ERVBDQyAgICAgICAgICAgdXNlIGRlcGVuZGVuY3kgZ2VuZXJhdG9yIERFUENDIFskY2NfZGVmYXVsdF0KKyAgLS1udmNjPU5WQ0MgICAgICAgICAgICAgIHVzZSBOdmlkaWEgQ1VEQSBjb21waWxlciBOVkNDIFskbnZjY19kZWZhdWx0XQogICAtLWxkPUxEICAgICAgICAgICAgICAgICAgdXNlIGxpbmtlciBMRCBbJGxkX2RlZmF1bHRdCiAgIC0tcGtnLWNvbmZpZz1QS0dDT05GSUcgICB1c2UgcGtnLWNvbmZpZyB0b29sIFBLR0NPTkZJRyBbJHBrZ19jb25maWdfZGVmYXVsdF0KICAgLS1wa2ctY29uZmlnLWZsYWdzPUZMQUdTIHBhc3MgYWRkaXRpb25hbCBmbGFncyB0byBwa2djb25mIFtdCkBAIC0zMzIsMTAgKzM3NiwxMSBAQAogICAtLWV4dHJhLW9iamNmbGFncz1GTEFHUyAgYWRkIEZMQUdTIHRvIE9CSkNGTEFHUyBbJENGTEFHU10KICAgLS1leHRyYS1sZGZsYWdzPUVMREZMQUdTIGFkZCBFTERGTEFHUyB0byBMREZMQUdTIFskTERGTEFHU10KICAgLS1leHRyYS1sZGV4ZWZsYWdzPUVMREZMQUdTIGFkZCBFTERGTEFHUyB0byBMREVYRUZMQUdTIFskTERFWEVGTEFHU10KLSAgLS1leHRyYS1sZGxpYmZsYWdzPUVMREZMQUdTIGFkZCBFTERGTEFHUyB0byBMRExJQkZMQUdTIFskTERMSUJGTEFHU10KKyAgLS1leHRyYS1sZHNvZmxhZ3M9RUxERkxBR1MgYWRkIEVMREZMQUdTIHRvIExEU09GTEFHUyBbJExEU09GTEFHU10KICAgLS1leHRyYS1saWJzPUVMSUJTICAgICAgIGFkZCBFTElCUyBbJEVMSUJTXQogICAtLWV4dHJhLXZlcnNpb249U1RSSU5HICAgdmVyc2lvbiBzdHJpbmcgc3VmZml4IFtdCiAgIC0tb3B0ZmxhZ3M9T1BURkxBR1MgICAgICBvdmVycmlkZSBvcHRpbWl6YXRpb24tcmVsYXRlZCBjb21waWxlciBmbGFncworICAtLW52Y2NmbGFncz1OVkNDRkxBR1MgICAgb3ZlcnJpZGUgbnZjYyBmbGFncyBbJG52Y2NmbGFnc19kZWZhdWx0XQogICAtLWJ1aWxkLXN1ZmZpeD1TVUZGSVggICAgbGlicmFyeSBuYW1lIHN1ZmZpeCBbXQogICAtLWVuYWJsZS1waWMgICAgICAgICAgICAgYnVpbGQgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZQogICAtLWVuYWJsZS10aHVtYiAgICAgICAgICAgY29tcGlsZSBmb3IgVGh1bWIgaW5zdHJ1Y3Rpb24gc2V0CkBAIC0zNTAsNyArMzk1LDYgQEAKICAgLS1kaXNhYmxlLXNhZmUtYml0c3RyZWFtLXJlYWRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZSBidWZmZXIgYm91bmRhcnkgY2hlY2tpbmcgaW4gYml0cmVhZGVycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZhc3RlciwgYnV0IG1heSBjcmFzaCkKLSAgLS1lbmFibGUtbWVtYWxpZ24taGFjayAgIGVtdWxhdGUgbWVtYWxpZ24sIGludGVyZmVyZXMgd2l0aCBtZW1vcnkgZGVidWdnZXJzCiAgIC0tc3dzLW1heC1maWx0ZXItc2l6ZT1OICB0aGUgbWF4IGZpbHRlciBzaXplIHN3c2NhbGUgdXNlcyBbJHN3c19tYXhfZmlsdGVyX3NpemVfZGVmYXVsdF0KIAogT3B0aW1pemF0aW9uIG9wdGlvbnMgKGV4cGVydHMgb25seSk6CkBAIC0zNzMsNiArNDE3LDcgQEAKICAgLS1kaXNhYmxlLWZtYTMgICAgICAgICAgIGRpc2FibGUgRk1BMyBvcHRpbWl6YXRpb25zCiAgIC0tZGlzYWJsZS1mbWE0ICAgICAgICAgICBkaXNhYmxlIEZNQTQgb3B0aW1pemF0aW9ucwogICAtLWRpc2FibGUtYXZ4MiAgICAgICAgICAgZGlzYWJsZSBBVlgyIG9wdGltaXphdGlvbnMKKyAgLS1kaXNhYmxlLWF2eDUxMiAgICAgICAgIGRpc2FibGUgQVZYLTUxMiBvcHRpbWl6YXRpb25zCiAgIC0tZGlzYWJsZS1hZXNuaSAgICAgICAgICBkaXNhYmxlIEFFU05JIG9wdGltaXphdGlvbnMKICAgLS1kaXNhYmxlLWFybXY1dGUgICAgICAgIGRpc2FibGUgYXJtdjV0ZSBvcHRpbWl6YXRpb25zCiAgIC0tZGlzYWJsZS1hcm12NiAgICAgICAgICBkaXNhYmxlIGFybXY2IG9wdGltaXphdGlvbnMKQEAgLTM4MCw3ICs0MjUsNyBAQAogICAtLWRpc2FibGUtdmZwICAgICAgICAgICAgZGlzYWJsZSBWRlAgb3B0aW1pemF0aW9ucwogICAtLWRpc2FibGUtbmVvbiAgICAgICAgICAgZGlzYWJsZSBORU9OIG9wdGltaXphdGlvbnMKICAgLS1kaXNhYmxlLWlubGluZS1hc20gICAgIGRpc2FibGUgdXNlIG9mIGlubGluZSBhc3NlbWJseQotICAtLWRpc2FibGUteWFzbSAgICAgICAgICAgZGlzYWJsZSB1c2Ugb2YgbmFzbS95YXNtIGFzc2VtYmx5CisgIC0tZGlzYWJsZS14ODZhc20gICAgICAgICBkaXNhYmxlIHVzZSBvZiBzdGFuZGFsb25lIHg4NiBhc3NlbWJseQogICAtLWRpc2FibGUtbWlwc2RzcCAgICAgICAgZGlzYWJsZSBNSVBTIERTUCBBU0UgUjEgb3B0aW1pemF0aW9ucwogICAtLWRpc2FibGUtbWlwc2RzcHIyICAgICAgZGlzYWJsZSBNSVBTIERTUCBBU0UgUjIgb3B0aW1pemF0aW9ucwogICAtLWRpc2FibGUtbXNhICAgICAgICAgICAgZGlzYWJsZSBNU0Egb3B0aW1pemF0aW9ucwpAQCAtNDE3LDEzICs0NjIsMTcgQEAKICAgLS1yYW5kb20tc2VlZD1WQUxVRSAgICAgIHNlZWQgdmFsdWUgZm9yIC0tZW5hYmxlL2Rpc2FibGUtcmFuZG9tCiAgIC0tZGlzYWJsZS12YWxncmluZC1iYWNrdHJhY2UgZG8gbm90IHByaW50IGEgYmFja3RyYWNlIHVuZGVyIFZhbGdyaW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25seSBhcHBsaWVzIHRvIC0tZGlzYWJsZS1vcHRpbWl6YXRpb25zIGJ1aWxkcykKKyAgLS1lbmFibGUtb3NmdXp6ICAgICAgICAgIEVuYWJsZSBidWlsZGluZyBmdXp6ZXIgdG9vbAorICAtLWxpYmZ1enplcj1QQVRIICAgICAgICAgcGF0aCB0byBsaWJmdXp6ZXIKKyAgLS1pZ25vcmUtdGVzdHM9VEVTVFMgICAgIGNvbW1hLXNlcGFyYXRlZCBsaXN0ICh3aXRob3V0ICJmYXRlLSIgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbmFtZSkgb2YgdGVzdHMgd2hvc2UgcmVzdWx0IGlzIGlnbm9yZWQKKyAgLS1lbmFibGUtbGludXgtcGVyZiAgICAgIGVuYWJsZSBMaW51eCBQZXJmb3JtYW5jZSBNb25pdG9yIEFQSQogCiBOT1RFOiBPYmplY3QgZmlsZXMgYXJlIGJ1aWx0IGF0IHRoZSBwbGFjZSB3aGVyZSBjb25maWd1cmUgaXMgbGF1bmNoZWQuCiBFT0YKICAgZXhpdCAwCiB9CiAKLXF1b3Rlcz0nIiInCiBpZiB0ZXN0IC10IDEgJiYgd2hpY2ggdHB1dCA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgICBuY29sb3JzPSQodHB1dCBjb2xvcnMpCiAgICAgaWYgdGVzdCAtbiAiJG5jb2xvcnMiICYmIHRlc3QgJG5jb2xvcnMgLWdlIDg7IHRoZW4KQEAgLTUwMiw3ICs1NTEsNyBAQAogICAgIHBhdD0kMQogICAgIHNoaWZ0CiAgICAgZm9yIHY7IGRvCi0gICAgICAgIGV2YWwgImNhc2UgJHYgaW4gJHBhdCkgZWNobyAkdiA7OyBlc2FjIgorICAgICAgICBldmFsICJjYXNlICckdicgaW4gJHBhdCkgcHJpbnRmICclcyAnICckdicgOzsgZXNhYyIKICAgICBkb25lCiB9CiAKQEAgLTUxMCw3ICs1NTksNyBAQAogICAgIHBhdD0kMQogICAgIHNoaWZ0CiAgICAgZm9yIHY7IGRvCi0gICAgICAgIGV2YWwgImNhc2UgJHYgaW4gJHBhdCkgOzsgKikgZWNobyAkdiA7OyBlc2FjIgorICAgICAgICBldmFsICJjYXNlICckdicgaW4gJHBhdCkgOzsgKikgcHJpbnRmICclcyAnICckdicgOzsgZXNhYyIKICAgICBkb25lCiB9CiAKQEAgLTUyNiw2ICs1NzUsMTIgQEAKICAgICBmb3IgdjsgZG8gZWNobyAke3Z9JHtzdWZmaXh9OyBkb25lCiB9CiAKK3JlbW92ZV9zdWZmaXgoKXsKKyAgICBzdWZmaXg9JDEKKyAgICBzaGlmdAorICAgIGZvciB2OyBkbyBlY2hvICR7diUkc3VmZml4fTsgZG9uZQorfQorCiBzZXRfYWxsKCl7CiAgICAgdmFsdWU9JDEKICAgICBzaGlmdApAQCAtNTQ2LDEzICs2MDEsMTMgQEAKICAgICBlY2hvICRAIHwgc2VkICdzL1teQS1aYS16MC05X10vXy9nJwogfQogCi1zZXRfc2FmZSgpeworc2V0X3Nhbml0aXplZCgpewogICAgIHZhcj0kMQogICAgIHNoaWZ0CiAgICAgZXZhbCAkKHNhbml0aXplX3Zhcl9uYW1lICIkdmFyIik9JyQqJwogfQogCi1nZXRfc2FmZSgpeworZ2V0X3Nhbml0aXplZCgpewogICAgIGV2YWwgZWNobyBcJCQoc2FuaXRpemVfdmFyX25hbWUgIiQxIikKIH0KIApAQCAtNTc1LDYgKzYzMCwxMyBAQAogICAgIGRvbmUKIH0KIAorcmVxdWVzdCgpeworICAgIGZvciB2YXIgaW4gJCo7IGRvCisgICAgICAgIGV2YWwgJHt2YXJ9X3JlcXVlc3RlZD15ZXMKKyAgICAgICAgZXZhbCAkdmFyPQorICAgIGRvbmUKK30KKwogZW5hYmxlKCl7CiAgICAgc2V0X2FsbCB5ZXMgJCoKIH0KQEAgLTU5MSwyOCArNjUzLDI1IEBACiAgICAgc2V0X3dlYWsgbm8gJCoKIH0KIAotZW5hYmxlX3NhZmUoKXsKK2VuYWJsZV9zYW5pdGl6ZWQoKXsKICAgICBmb3IgdmFyOyBkbwotICAgICAgICBlbmFibGUgJChlY2hvICIkdmFyIiB8IHNlZCAncy9bXkEtWmEtejAtOV9dL18vZycpCisgICAgICAgIGVuYWJsZSAkKHNhbml0aXplX3Zhcl9uYW1lICR2YXIpCiAgICAgZG9uZQogfQogCi1kaXNhYmxlX3NhZmUoKXsKK2Rpc2FibGVfc2FuaXRpemVkKCl7CiAgICAgZm9yIHZhcjsgZG8KLSAgICAgICAgZGlzYWJsZSAkKGVjaG8gIiR2YXIiIHwgc2VkICdzL1teQS1aYS16MC05X10vXy9nJykKKyAgICAgICAgZGlzYWJsZSAkKHNhbml0aXplX3Zhcl9uYW1lICR2YXIpCiAgICAgZG9uZQogfQogCiBkb19lbmFibGVfZGVlcCgpewogICAgIGZvciB2YXI7IGRvCiAgICAgICAgIGVuYWJsZWQgJHZhciAmJiBjb250aW51ZQotICAgICAgICBldmFsIHNlbD0iXCQke3Zhcn1fc2VsZWN0IgotICAgICAgICBldmFsIHNncz0iXCQke3Zhcn1fc3VnZ2VzdCIKLSAgICAgICAgcHVzaHZhciB2YXIgc2dzCi0gICAgICAgIGVuYWJsZV9kZWVwICRzZWwKLSAgICAgICAgcG9wdmFyIHNncwotICAgICAgICBlbmFibGVfZGVlcF93ZWFrICRzZ3MKLSAgICAgICAgcG9wdmFyIHZhcgorICAgICAgICBzZXQgLS0gJHZhcgorICAgICAgICBldmFsIGVuYWJsZV9kZWVwIFwkJHt2YXJ9X3NlbGVjdAorICAgICAgICB2YXI9JDEKKyAgICAgICAgZXZhbCBlbmFibGVfZGVlcF93ZWFrIFwkJHt2YXJ9X3N1Z2dlc3QKICAgICBkb25lCiB9CiAKQEAgLTYyNCwyMCArNjgzLDI1IEBACiBlbmFibGVfZGVlcF93ZWFrKCl7CiAgICAgZm9yIHZhcjsgZG8KICAgICAgICAgZGlzYWJsZWQgJHZhciAmJiBjb250aW51ZQotICAgICAgICBwdXNodmFyIHZhcgorICAgICAgICBzZXQgLS0gJHZhcgogICAgICAgICBkb19lbmFibGVfZGVlcCAkdmFyCi0gICAgICAgIHBvcHZhciB2YXIKKyAgICAgICAgdmFyPSQxCiAgICAgICAgIGVuYWJsZV93ZWFrICR2YXIKICAgICBkb25lCiB9CiAKK3JlcXVlc3RlZCgpeworICAgIHRlc3QgIiR7MSMhfSIgPSAiJDEiICYmIG9wPSI9IiB8fCBvcD0iIT0iCisgICAgZXZhbCB0ZXN0ICJ4XCQkezEjIX1fcmVxdWVzdGVkIiAkb3AgInh5ZXMiCit9CisKIGVuYWJsZWQoKXsKLSAgICB0ZXN0ICIkezEjIX0iID0gIiQxIiAmJiBvcD0nPScgfHwgb3A9IT0KKyAgICB0ZXN0ICIkezEjIX0iID0gIiQxIiAmJiBvcD0iPSIgfHwgb3A9IiE9IgogICAgIGV2YWwgdGVzdCAieFwkJHsxIyF9IiAkb3AgInh5ZXMiCiB9CiAKIGRpc2FibGVkKCl7Ci0gICAgdGVzdCAiJHsxIyF9IiA9ICIkMSIgJiYgb3A9Jz0nIHx8IG9wPSE9CisgICAgdGVzdCAiJHsxIyF9IiA9ICIkMSIgJiYgb3A9Ij0iIHx8IG9wPSIhPSIKICAgICBldmFsIHRlc3QgInhcJCR7MSMhfSIgJG9wICJ4bm8iCiB9CiAKQEAgLTY4MSw0OSArNzQ1LDQ5IEBACiAgICAgcmV0dXJuIDEKIH0KIAotZG9fY2hlY2tfZGVwcygpeworIyBUaGUgY2ZnIGxvb3AgaXMgdmVyeSBob3QgKHNldmVyYWwgdGhvdXNhbmRzIGl0ZXJhdGlvbnMpLCBhbmQgaW4gYmFzaCBhbHNvCisjIHBvdGVudGlhbHkgcXVpdGUgc2xvdy4gVHJ5IHRvIGFib3J0IHRoZSBpdGVyYXRpb25zIGVhcmx5LCBwcmVmZXJhYmx5IHdpdGhvdXQKKyMgY2FsbGluZyBmdW5jdGlvbnMuIDcwJSsgb2YgdGhlIHRpbWUgY2ZnIGlzIGFscmVhZHkgZG9uZSBvciB3aXRob3V0IGRlcHMuCitjaGVja19kZXBzKCl7CiAgICAgZm9yIGNmZzsgZG8KLSAgICAgICAgY2ZnPSIke2NmZyMhfSIKLSAgICAgICAgZW5hYmxlZCAke2NmZ31fY2hlY2tpbmcgJiYgZGllICJDaXJjdWxhciBkZXBlbmRlbmN5IGZvciAkY2ZnLiIKLSAgICAgICAgZGlzYWJsZWQgJHtjZmd9X2NoZWNraW5nICYmIGNvbnRpbnVlCi0gICAgICAgIGVuYWJsZSAke2NmZ31fY2hlY2tpbmcKLSAgICAgICAgYXBwZW5kIGFsbG9wdHMgJGNmZworICAgICAgICBldmFsIFsgeFwkJHtjZmd9X2NoZWNraW5nID0geGRvbmUgXSAmJiBjb250aW51ZQorICAgICAgICBldmFsIFsgeFwkJHtjZmd9X2NoZWNraW5nID0geGlucHJvZ3Jlc3MgXSAmJiBkaWUgIkNpcmN1bGFyIGRlcGVuZGVuY3kgZm9yICRjZmcuIgogCi0gICAgICAgIGV2YWwgZGVwX2FsbD0iXCQke2NmZ31fZGVwcyIKLSAgICAgICAgZXZhbCBkZXBfYW55PSJcJCR7Y2ZnfV9kZXBzX2FueSIKLSAgICAgICAgZXZhbCBkZXBfc2VsPSJcJCR7Y2ZnfV9zZWxlY3QiCi0gICAgICAgIGV2YWwgZGVwX3Nncz0iXCQke2NmZ31fc3VnZ2VzdCIKLSAgICAgICAgZXZhbCBkZXBfaWZhPSJcJCR7Y2ZnfV9pZiIKLSAgICAgICAgZXZhbCBkZXBfaWZuPSJcJCR7Y2ZnfV9pZl9hbnkiCisgICAgICAgIGV2YWwgIgorICAgICAgICBkZXBfYWxsPVwkJHtjZmd9X2RlcHMKKyAgICAgICAgZGVwX2FueT1cJCR7Y2ZnfV9kZXBzX2FueQorICAgICAgICBkZXBfY29uPVwkJHtjZmd9X2NvbmZsaWN0CisgICAgICAgIGRlcF9zZWw9XCQke2NmZ31fc2VsZWN0CisgICAgICAgIGRlcF9zZ3M9XCQke2NmZ31fc3VnZ2VzdAorICAgICAgICBkZXBfaWZhPVwkJHtjZmd9X2lmCisgICAgICAgIGRlcF9pZm49XCQke2NmZ31faWZfYW55CisgICAgICAgICIKIAotICAgICAgICBwdXNodmFyIGNmZyBkZXBfYWxsIGRlcF9hbnkgZGVwX3NlbCBkZXBfc2dzIGRlcF9pZmEgZGVwX2lmbgotICAgICAgICBkb19jaGVja19kZXBzICRkZXBfYWxsICRkZXBfYW55ICRkZXBfc2VsICRkZXBfc2dzICRkZXBfaWZhICRkZXBfaWZuCi0gICAgICAgIHBvcHZhciBjZmcgZGVwX2FsbCBkZXBfYW55IGRlcF9zZWwgZGVwX3NncyBkZXBfaWZhIGRlcF9pZm4KKyAgICAgICAgIyBtb3N0IG9mIHRoZSB0aW1lIGhlcmUgJGNmZyBoYXMgbm8gZGVwcyAtIGF2b2lkIGNvc3RseSBuby1vcCB3b3JrCisgICAgICAgIGlmIFsgIiRkZXBfYWxsJGRlcF9hbnkkZGVwX2NvbiRkZXBfc2VsJGRlcF9zZ3MkZGVwX2lmYSRkZXBfaWZuIiBdOyB0aGVuCisgICAgICAgICAgICBldmFsICR7Y2ZnfV9jaGVja2luZz1pbnByb2dyZXNzCiAKLSAgICAgICAgWyAtbiAiJGRlcF9pZmEiIF0gJiYgeyBlbmFibGVkX2FsbCAkZGVwX2lmYSAmJiBlbmFibGVfd2VhayAkY2ZnOyB9Ci0gICAgICAgIFsgLW4gIiRkZXBfaWZuIiBdICYmIHsgZW5hYmxlZF9hbnkgJGRlcF9pZm4gJiYgZW5hYmxlX3dlYWsgJGNmZzsgfQotICAgICAgICBlbmFibGVkX2FsbCAgJGRlcF9hbGwgfHwgZGlzYWJsZSAkY2ZnCi0gICAgICAgIGVuYWJsZWRfYW55ICAkZGVwX2FueSB8fCBkaXNhYmxlICRjZmcKLSAgICAgICAgZGlzYWJsZWRfYW55ICRkZXBfc2VsICYmIGRpc2FibGUgJGNmZworICAgICAgICAgICAgc2V0IC0tICRjZmcgIiRkZXBfYWxsIiAiJGRlcF9hbnkiICIkZGVwX2NvbiIgIiRkZXBfc2VsIiAiJGRlcF9zZ3MiICIkZGVwX2lmYSIgIiRkZXBfaWZuIgorICAgICAgICAgICAgY2hlY2tfZGVwcyAkZGVwX2FsbCAkZGVwX2FueSAkZGVwX2NvbiAkZGVwX3NlbCAkZGVwX3NncyAkZGVwX2lmYSAkZGVwX2lmbgorICAgICAgICAgICAgY2ZnPSQxOyBkZXBfYWxsPSQyOyBkZXBfYW55PSQzOyBkZXBfY29uPSQ0OyBkZXBfc2VsPSQ1IGRlcF9zZ3M9JDY7IGRlcF9pZmE9JDc7IGRlcF9pZm49JDgKIAotICAgICAgICBpZiBlbmFibGVkICRjZmc7IHRoZW4KLSAgICAgICAgICAgIGVuYWJsZV9kZWVwICRkZXBfc2VsCi0gICAgICAgICAgICBlbmFibGVfZGVlcF93ZWFrICRkZXBfc2dzCisgICAgICAgICAgICBbIC1uICIkZGVwX2lmYSIgXSAmJiB7IGVuYWJsZWRfYWxsICRkZXBfaWZhICYmIGVuYWJsZV93ZWFrICRjZmc7IH0KKyAgICAgICAgICAgIFsgLW4gIiRkZXBfaWZuIiBdICYmIHsgZW5hYmxlZF9hbnkgJGRlcF9pZm4gJiYgZW5hYmxlX3dlYWsgJGNmZzsgfQorICAgICAgICAgICAgZW5hYmxlZF9hbGwgICRkZXBfYWxsIHx8IHsgZGlzYWJsZSAkY2ZnICYmIHJlcXVlc3RlZCAkY2ZnICYmIGRpZSAiRVJST1I6ICRjZmcgcmVxdWVzdGVkLCBidXQgbm90IGFsbCBkZXBlbmRlbmNpZXMgYXJlIHNhdGlzZmllZDogJGRlcF9hbGwiOyB9CisgICAgICAgICAgICBlbmFibGVkX2FueSAgJGRlcF9hbnkgfHwgeyBkaXNhYmxlICRjZmcgJiYgcmVxdWVzdGVkICRjZmcgJiYgZGllICJFUlJPUjogJGNmZyByZXF1ZXN0ZWQsIGJ1dCBub3QgYW55IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkOiAkZGVwX2FueSI7IH0KKyAgICAgICAgICAgIGRpc2FibGVkX2FsbCAkZGVwX2NvbiB8fCB7IGRpc2FibGUgJGNmZyAmJiByZXF1ZXN0ZWQgJGNmZyAmJiBkaWUgIkVSUk9SOiAkY2ZnIHJlcXVlc3RlZCwgYnV0IHNvbWUgY29uZmxpY3RpbmcgZGVwZW5kZW5jaWVzIGFyZSB1bnNhdGlzZmllZDogJGRlcF9jb24iOyB9CisgICAgICAgICAgICBkaXNhYmxlZF9hbnkgJGRlcF9zZWwgJiYgeyBkaXNhYmxlICRjZmcgJiYgcmVxdWVzdGVkICRjZmcgJiYgZGllICJFUlJPUjogJGNmZyByZXF1ZXN0ZWQsIGJ1dCBzb21lIHNlbGVjdGVkIGRlcGVuZGVuY3kgaXMgdW5zYXRpc2ZpZWQ6ICRkZXBfc2VsIjsgfQorCisgICAgICAgICAgICBlbmFibGVkICRjZmcgJiYgZW5hYmxlX2RlZXBfd2VhayAkZGVwX3NlbCAkZGVwX3NncworCisgICAgICAgICAgICBmb3IgZGVwIGluICRkZXBfYWxsICRkZXBfYW55ICRkZXBfc2VsICRkZXBfc2dzOyBkbworICAgICAgICAgICAgICAgICMgZmlsdGVyIG91dCBsaWJyYXJ5IGRlcHMsIHRoZXNlIGRvIG5vdCBiZWxvbmcgaW4gZXh0cmFsaWJzCisgICAgICAgICAgICAgICAgaXNfaW4gJGRlcCAkTElCUkFSWV9MSVNUICYmIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZW5hYmxlZCAkZGVwICYmIGV2YWwgYXBwZW5kICR7Y2ZnfV9leHRyYWxpYnMgJHtkZXB9X2V4dHJhbGlicworICAgICAgICAgICAgZG9uZQogICAgICAgICBmaQogCi0gICAgICAgIGRpc2FibGUgJHtjZmd9X2NoZWNraW5nCi0gICAgZG9uZQotfQotCi1jaGVja19kZXBzKCl7Ci0gICAgdW5zZXQgYWxsb3B0cwotCi0gICAgZG9fY2hlY2tfZGVwcyAiJEAiCi0KLSAgICBmb3IgY2ZnIGluICRhbGxvcHRzOyBkbwotICAgICAgICBlbmFibGVkICRjZmcgfHwgY29udGludWUKLSAgICAgICAgZXZhbCBkZXBfZXh0cmFsaWJzPSJcJCR7Y2ZnfV9leHRyYWxpYnMiCi0gICAgICAgIHRlc3QgLW4gIiRkZXBfZXh0cmFsaWJzIiAmJiBhZGRfZXh0cmFsaWJzICRkZXBfZXh0cmFsaWJzCisgICAgICAgIGV2YWwgJHtjZmd9X2NoZWNraW5nPWRvbmUKICAgICBkb25lCiB9CiAKQEAgLTc2Miw3ICs4MjYsNyBAQAogICAgIHN1Zj0kMQogICAgIHNoaWZ0CiAgICAgZm9yIHY7IGRvCi0gICAgICAgIGVuYWJsZWQgJHYgJiYgcHJpbnRmICIlc1xuIiAke3YlJHN1Zn07CisgICAgICAgIGVuYWJsZWQgJHYgJiYgcHJpbnRmICIlc1xuIiAke3YlJHN1Zn0KICAgICBkb25lCiB9CiAKQEAgLTc3OCwxMyArODQyLDM3IEBACiAgICAgZXZhbCAiJHZhcj1cIiQqIFwkJHZhclwiIgogfQogCityZXZlcnNlICgpIHsKKyAgICBldmFsICcKKyAgICAgICAgcmV2ZXJzZV9vdXQ9CisgICAgICAgIGZvciB2IGluICQnJDEnOyBkbworICAgICAgICAgICAgcmV2ZXJzZV9vdXQ9IiR2ICRyZXZlcnNlX291dCIKKyAgICAgICAgZG9uZQorICAgICAgICAnJDEnPSRyZXZlcnNlX291dAorICAgICcKK30KKworIyBrZWVwcyB0aGUgbGFzdCBvY2N1cmVuY2Ugb2YgZWFjaCBub24tdW5pcXVlIGl0ZW0KIHVuaXF1ZSgpewotICAgIHZhcj0kMQotICAgIHVuaXFfbGlzdD0iIgotICAgIGZvciB0b2sgaW4gJChldmFsIGVjaG8gXCQkdmFyKTsgZG8KLSAgICAgICAgdW5pcV9saXN0PSIkKGZpbHRlcl9vdXQgJHRvayAkdW5pcV9saXN0KSAkdG9rIgorICAgIHVuaXF1ZV9vdXQ9CisgICAgZXZhbCB1bmlxdWVfaW49XCQkMQorICAgIHJldmVyc2UgdW5pcXVlX2luCisgICAgZm9yIHYgaW4gJHVuaXF1ZV9pbjsgZG8KKyAgICAgICAgIyAiICR1bmlxdWVfb3V0IiArc3BhY2Ugc3VjaCB0aGF0IGV2ZXJ5IGl0ZW0gaXMgc3Vycm91bmRlZCB3aXRoIHNwYWNlcworICAgICAgICBjYXNlICIgJHVuaXF1ZV9vdXQiIGluICoiICR2ICIqKSBjb250aW51ZTsgZXNhYyAgIyBhbHJlYWR5IGluIGxpc3QKKyAgICAgICAgdW5pcXVlX291dD0iJHVuaXF1ZV9vdXQkdiAiCiAgICAgZG9uZQotICAgIGV2YWwgIiR2YXI9XCIke3VuaXFfbGlzdH1cIiIKKyAgICByZXZlcnNlIHVuaXF1ZV9vdXQKKyAgICBldmFsICQxPVwkdW5pcXVlX291dAorfQorCityZXNvbHZlKCl7CisgICAgcmVzb2x2ZV9vdXQ9CisgICAgZXZhbCByZXNvbHZlX2luPVwkJDEKKyAgICBmb3IgdiBpbiAkcmVzb2x2ZV9pbjsgZG8KKyAgICAgICAgZXZhbCAncmVzb2x2ZV9vdXQ9IiRyZXNvbHZlX291dCQnJHYnICInCisgICAgZG9uZQorICAgIGV2YWwgJDE9XCRyZXNvbHZlX291dAogfQogCiBhZGRfY3BwZmxhZ3MoKXsKQEAgLTc5NSw2ICs4ODMsMTAgQEAKICAgICBhcHBlbmQgQ0ZMQUdTICQoJGNmbGFnc19maWx0ZXIgIiRAIikKIH0KIAorYWRkX2NmbGFnc19oZWFkZXJzKCl7CisgICAgYXBwZW5kIENGTEFHU19IRUFERVJTICQoJGNmbGFnc19maWx0ZXIgIiRAIikKK30KKwogYWRkX2N4eGZsYWdzKCl7CiAgICAgYXBwZW5kIENYWEZMQUdTICQoJGNmbGFnc19maWx0ZXIgIiRAIikKIH0KQEAgLTgxNSw4ICs5MDcsOCBAQAogICAgIGFwcGVuZCBMREVYRUZMQUdTICQoJGxkZmxhZ3NfZmlsdGVyICIkQCIpCiB9CiAKLWFkZF9sZGxpYmZsYWdzKCl7Ci0gICAgYXBwZW5kIExETElCRkxBR1MgJCgkbGRmbGFnc19maWx0ZXIgIiRAIikKK2FkZF9sZHNvZmxhZ3MoKXsKKyAgICBhcHBlbmQgTERTT0ZMQUdTICQoJGxkZmxhZ3NfZmlsdGVyICIkQCIpCiB9CiAKIGFkZF9zdHJpcGZsYWdzKCl7CkBAIC04NDUsMTMgKzkzNywxMyBAQAogICAgIG1hcCAnYWRkX2NwcGZsYWdzIC1EJHYnICIkQCIKIH0KIAotY2hlY2tfY21kKCl7Cit0ZXN0X2NtZCgpewogICAgIGxvZyAiJEAiCiAgICAgIiRAIiA+PiAkbG9nZmlsZSAyPiYxCiB9CiAKLWNoZWNrX3N0YXQoKXsKLSAgICBsb2cgY2hlY2tfc3RhdCAiJEAiCit0ZXN0X3N0YXQoKXsKKyAgICBsb2cgdGVzdF9zdGF0ICIkQCIKICAgICBzdGF0ICIkMSIgPj4gJGxvZ2ZpbGUgMj4mMQogfQogCkBAIC04NjMsNDMgKzk1NSw3NCBAQAogICAgIGV2YWwgcHJpbnRmICclc1xcbicgJENDX0UKIH0KIAotY2hlY2tfY2MoKXsKLSAgICBsb2cgY2hlY2tfY2MgIiRAIgordGVzdF9jYygpeworICAgIGxvZyB0ZXN0X2NjICIkQCIKICAgICBjYXQgPiAkVE1QQwogICAgIGxvZ19maWxlICRUTVBDCi0gICAgY2hlY2tfY21kICRjYyAkQ1BQRkxBR1MgJENGTEFHUyAiJEAiICRDQ19DICQoY2NfbyAkVE1QTykgJFRNUEMKKyAgICB0ZXN0X2NtZCAkY2MgJENQUEZMQUdTICRDRkxBR1MgIiRAIiAkQ0NfQyAkKGNjX28gJFRNUE8pICRUTVBDCiB9CiAKLWNoZWNrX2N4eCgpewotICAgIGxvZyBjaGVja19jeHggIiRAIgordGVzdF9jeHgoKXsKKyAgICBsb2cgdGVzdF9jeHggIiRAIgogICAgIGNhdCA+ICRUTVBDUFAKICAgICBsb2dfZmlsZSAkVE1QQ1BQCi0gICAgY2hlY2tfY21kICRjeHggJENQUEZMQUdTICRDRkxBR1MgJENYWEZMQUdTICIkQCIgJENYWF9DIC1vICRUTVBPICRUTVBDUFAKKyAgICB0ZXN0X2NtZCAkY3h4ICRDUFBGTEFHUyAkQ0ZMQUdTICRDWFhGTEFHUyAiJEAiICRDWFhfQyAtbyAkVE1QTyAkVE1QQ1BQCiB9CiAKLWNoZWNrX29iamNjKCl7Ci0gICAgbG9nIGNoZWNrX29iamNjICIkQCIKK3Rlc3Rfb2JqY2MoKXsKKyAgICBsb2cgdGVzdF9vYmpjYyAiJEAiCiAgICAgY2F0ID4gJFRNUE0KICAgICBsb2dfZmlsZSAkVE1QTQotICAgIGNoZWNrX2NtZCAkb2JqY2MgLVdlcnJvcj1taXNzaW5nLXByb3RvdHlwZXMgJENQUEZMQUdTICRDRkxBR1MgJE9CSkNGTEFHUyAiJEAiICRPQkpDQ19DICQoY2NfbyAkVE1QTykgJFRNUE0KKyAgICB0ZXN0X2NtZCAkb2JqY2MgLVdlcnJvcj1taXNzaW5nLXByb3RvdHlwZXMgJENQUEZMQUdTICRDRkxBR1MgJE9CSkNGTEFHUyAiJEAiICRPQkpDQ19DICQoY2NfbyAkVE1QTykgJFRNUE0KIH0KIAotY2hlY2tfY3BwKCl7Ci0gICAgbG9nIGNoZWNrX2NwcCAiJEAiCit0ZXN0X2NwcCgpeworICAgIGxvZyB0ZXN0X2NwcCAiJEAiCiAgICAgY2F0ID4gJFRNUEMKICAgICBsb2dfZmlsZSAkVE1QQwotICAgIGNoZWNrX2NtZCAkY2MgJENQUEZMQUdTICRDRkxBR1MgIiRAIiAkKGNjX2UgJFRNUE8pICRUTVBDCisgICAgdGVzdF9jbWQgJGNjICRDUFBGTEFHUyAkQ0ZMQUdTICIkQCIgJChjY19lICRUTVBPKSAkVE1QQwogfQogCiBhc19vKCl7CiAgICAgZXZhbCBwcmludGYgJyVzXFxuJyAkQVNfTwogfQogCi1jaGVja19hcygpewotICAgIGxvZyBjaGVja19hcyAiJEAiCit0ZXN0X2FzKCl7CisgICAgbG9nIHRlc3RfYXMgIiRAIgogICAgIGNhdCA+ICRUTVBTCiAgICAgbG9nX2ZpbGUgJFRNUFMKLSAgICBjaGVja19jbWQgJGFzICRDUFBGTEFHUyAkQVNGTEFHUyAiJEAiICRBU19DICQoYXNfbyAkVE1QTykgJFRNUFMKKyAgICB0ZXN0X2NtZCAkYXMgJENQUEZMQUdTICRBU0ZMQUdTICIkQCIgJEFTX0MgJChhc19vICRUTVBPKSAkVE1QUworfQorCit4ODZhc21fbygpeworICAgIGV2YWwgcHJpbnRmICclc1xcbicgJFg4NkFTTV9PCit9CisKK3Rlc3RfeDg2YXNtKCl7CisgICAgbG9nIHRlc3RfeDg2YXNtICIkQCIKKyAgICBlY2hvICIkMSIgPiAkVE1QQVNNCisgICAgbG9nX2ZpbGUgJFRNUEFTTQorICAgIHNoaWZ0CisgICAgdGVzdF9jbWQgJHg4NmFzbWV4ZSAkWDg2QVNNRkxBR1MgLVdlcnJvciAiJEAiICQoeDg2YXNtX28gJFRNUE8pICRUTVBBU00KK30KKworY2hlY2tfY21kKCl7CisgICAgbG9nIGNoZWNrX2NtZCAiJEAiCisgICAgY21kPSQxCisgICAgZGlzYWJsZWQgJGNtZCAmJiByZXR1cm4KKyAgICBkaXNhYmxlICRjbWQKKyAgICB0ZXN0X2NtZCAkQCAmJiBlbmFibGUgJGNtZAorfQorCitjaGVja19hcygpeworICAgIGxvZyBjaGVja19hcyAiJEAiCisgICAgbmFtZT0kMQorICAgIGNvZGU9JDIKKyAgICBzaGlmdCAyCisgICAgZGlzYWJsZSAkbmFtZQorICAgIHRlc3RfYXMgJEAgPDxFT0YgJiYgZW5hYmxlICRuYW1lCiskY29kZQorRU9GCiB9CiAKIGNoZWNrX2lubGluZV9hc20oKXsKQEAgLTkwOCwzOSArMTAzMSw2NyBAQAogICAgIGNvZGU9IiQyIgogICAgIHNoaWZ0IDIKICAgICBkaXNhYmxlICRuYW1lCi0gICAgY2hlY2tfY2MgIiRAIiA8PEVPRiAmJiBlbmFibGUgJG5hbWUKKyAgICB0ZXN0X2NjICIkQCIgPDxFT0YgJiYgZW5hYmxlICRuYW1lCiB2b2lkIGZvbyh2b2lkKXsgX19hc21fXyB2b2xhdGlsZSgkY29kZSk7IH0KIEVPRgogfQogCitjaGVja19pbmxpbmVfYXNtX2ZsYWdzKCl7CisgICAgbG9nIGNoZWNrX2lubGluZV9hc21fZmxhZ3MgIiRAIgorICAgIG5hbWU9IiQxIgorICAgIGNvZGU9IiQyIgorICAgIGZsYWdzPScnCisgICAgc2hpZnQgMgorICAgIHdoaWxlIFsgIiQxIiAhPSAiIiBdOyBkbworICAgICAgYXBwZW5kIGZsYWdzICQxCisgICAgICBzaGlmdAorICAgIGRvbmU7CisgICAgZGlzYWJsZSAkbmFtZQorICAgIGNhdCA+ICRUTVBDIDw8RU9GCit2b2lkIGZvbyh2b2lkKXsgX19hc21fXyB2b2xhdGlsZSgkY29kZSk7IH0KK0VPRgorICAgIGxvZ19maWxlICRUTVBDCisgICAgdGVzdF9jbWQgJGNjICRDUFBGTEFHUyAkQ0ZMQUdTICRmbGFncyAiJEAiICRDQ19DICQoY2NfbyAkVE1QTykgJFRNUEMgJiYKKyAgICBlbmFibGUgJG5hbWUgJiYgYWRkX2NmbGFncyAkZmxhZ3MgJiYgYWRkX2FzZmxhZ3MgJGZsYWdzICYmIGFkZF9sZGZsYWdzICRmbGFncworfQorCiBjaGVja19pbnNuKCl7CiAgICAgbG9nIGNoZWNrX2luc24gIiRAIgogICAgIGNoZWNrX2lubGluZV9hc20gJHsxfV9pbmxpbmUgIlwiJDJcIiIKLSAgICBlY2hvICIkMiIgfCBjaGVja19hcyAmJiBlbmFibGUgJHsxfV9leHRlcm5hbCB8fCBkaXNhYmxlICR7MX1fZXh0ZXJuYWwKKyAgICBjaGVja19hcyAkezF9X2V4dGVybmFsICIkMiIKIH0KIAotY2hlY2tfeWFzbSgpewotICAgIGxvZyBjaGVja195YXNtICIkQCIKLSAgICBlY2hvICIkMSIgPiAkVE1QUwotICAgIGxvZ19maWxlICRUTVBTCi0gICAgc2hpZnQgMQotICAgIGNoZWNrX2NtZCAkeWFzbWV4ZSAkWUFTTUZMQUdTIC1XZXJyb3IgIiRAIiAtbyAkVE1QTyAkVE1QUworY2hlY2tfeDg2YXNtKCl7CisgICAgbG9nIGNoZWNrX3g4NmFzbSAiJEAiCisgICAgbmFtZT0kMQorICAgIHNoaWZ0CisgICAgZGlzYWJsZSAkbmFtZQorICAgIHRlc3RfeDg2YXNtICIkQCIgJiYgZW5hYmxlICRuYW1lCiB9CiAKIGxkX28oKXsKICAgICBldmFsIHByaW50ZiAnJXNcXG4nICRMRF9PCiB9CiAKLWNoZWNrX2xkKCl7Ci0gICAgbG9nIGNoZWNrX2xkICIkQCIKK3Rlc3RfbGQoKXsKKyAgICBsb2cgdGVzdF9sZCAiJEAiCiAgICAgdHlwZT0kMQogICAgIHNoaWZ0IDEKICAgICBmbGFncz0kKGZpbHRlcl9vdXQgJy1sKnwqLnNvJyAkQCkKICAgICBsaWJzPSQoZmlsdGVyICctbCp8Ki5zbycgJEApCi0gICAgY2hlY2tfJHR5cGUgJCgkY2ZsYWdzX2ZpbHRlciAkZmxhZ3MpIHx8IHJldHVybgorICAgIHRlc3RfJHR5cGUgJCgkY2ZsYWdzX2ZpbHRlciAkZmxhZ3MpIHx8IHJldHVybgogICAgIGZsYWdzPSQoJGxkZmxhZ3NfZmlsdGVyICRmbGFncykKICAgICBsaWJzPSQoJGxkZmxhZ3NfZmlsdGVyICRsaWJzKQotICAgIGNoZWNrX2NtZCAkbGQgJExERkxBR1MgJGZsYWdzICQobGRfbyAkVE1QRSkgJFRNUE8gJGxpYnMgJGV4dHJhbGlicworICAgIHRlc3RfY21kICRsZCAkTERGTEFHUyAkTERFWEVGTEFHUyAkZmxhZ3MgJChsZF9vICRUTVBFKSAkVE1QTyAkbGlicyAkZXh0cmFsaWJzCit9CisKK2NoZWNrX2xkKCl7CisgICAgbG9nIGNoZWNrX2xkICIkQCIKKyAgICB0eXBlPSQxCisgICAgbmFtZT0kMgorICAgIHNoaWZ0IDIKKyAgICBkaXNhYmxlICRuYW1lCisgICAgdGVzdF9sZCAkdHlwZSAkQCAmJiBlbmFibGUgJG5hbWUKIH0KIAogcHJpbnRfaW5jbHVkZSgpewpAQCAtOTUwLDggKzExMDEsOCBAQAogICAgICAgICBlY2hvICIjaW5jbHVkZSA8JGhkcj4iCiB9CiAKLWNoZWNrX2NvZGUoKXsKLSAgICBsb2cgY2hlY2tfY29kZSAiJEAiCit0ZXN0X2NvZGUoKXsKKyAgICBsb2cgdGVzdF9jb2RlICIkQCIKICAgICBjaGVjaz0kMQogICAgIGhlYWRlcnM9JDIKICAgICBjb2RlPSQzCkBAIC05NjEsMjAgKzExMTIsMjAgQEAKICAgICAgICAgICAgIHByaW50X2luY2x1ZGUgJGhkcgogICAgICAgICBkb25lCiAgICAgICAgIGVjaG8gImludCBtYWluKHZvaWQpIHsgJGNvZGU7IHJldHVybiAwOyB9IgotICAgIH0gfCBjaGVja18kY2hlY2sgIiRAIgorICAgIH0gfCB0ZXN0XyRjaGVjayAiJEAiCiB9CiAKIGNoZWNrX2NwcGZsYWdzKCl7CiAgICAgbG9nIGNoZWNrX2NwcGZsYWdzICIkQCIKLSAgICBjaGVja19jYyAiJEAiIDw8RU9GICYmIGFwcGVuZCBDUFBGTEFHUyAiJEAiCi1pbnQgeDsKKyAgICB0ZXN0X2NwcCAiJEAiIDw8RU9GICYmIGFwcGVuZCBDUFBGTEFHUyAiJEAiCisjaW5jbHVkZSA8c3RkbGliLmg+CiBFT0YKIH0KIAogdGVzdF9jZmxhZ3MoKXsKICAgICBsb2cgdGVzdF9jZmxhZ3MgIiRAIgogICAgIHNldCAtLSAkKCRjZmxhZ3NfZmlsdGVyICIkQCIpCi0gICAgY2hlY2tfY2MgIiRAIiA8PEVPRgorICAgIHRlc3RfY2MgIiRAIiA8PEVPRgogaW50IHg7CiBFT0YKIH0KQEAgLTk4NywyNyArMTEzOCwyOCBAQAogY2hlY2tfY3h4ZmxhZ3MoKXsKICAgICBsb2cgY2hlY2tfY3h4ZmxhZ3MgIiRAIgogICAgIHNldCAtLSAkKCRjZmxhZ3NfZmlsdGVyICIkQCIpCi0gICAgY2hlY2tfY3h4ICIkQCIgPDxFT0YgJiYgYXBwZW5kIENYWEZMQUdTICIkQCIKKyAgICB0ZXN0X2N4eCAiJEAiIDw8RU9GICYmIGFwcGVuZCBDWFhGTEFHUyAiJEAiCiBpbnQgeDsKIEVPRgogfQogCiB0ZXN0X29iamNmbGFncygpewotICAgIGxvZyB0ZXN0X2NmbGFncyAiJEAiCi0gICAgc2V0IC0tICQoJGNmbGFnc19maWx0ZXIgIiRAIikKLSAgICBjaGVja19vYmpjYyAiJEAiIDw8RU9GCisgICAgbG9nIHRlc3Rfb2JqY2ZsYWdzICIkQCIKKyAgICBzZXQgLS0gJCgkb2JqY2ZsYWdzX2ZpbHRlciAiJEAiKQorICAgIHRlc3Rfb2JqY2MgIiRAIiA8PEVPRgogaW50IHg7CiBFT0YKIH0KIAogY2hlY2tfb2JqY2ZsYWdzKCl7Ci0gICAgbG9nIGNoZWNrX2NmbGFncyAiJEAiCisgICAgbG9nIGNoZWNrX29iamNmbGFncyAiJEAiCiAgICAgdGVzdF9vYmpjZmxhZ3MgIiRAIiAmJiBhZGRfb2JqY2ZsYWdzICIkQCIKIH0KIAogdGVzdF9sZGZsYWdzKCl7CiAgICAgbG9nIHRlc3RfbGRmbGFncyAiJEAiCi0gICAgY2hlY2tfbGQgImNjIiAiJEAiIDw8RU9GCisgICAgc2V0IC0tICQoJGxkZmxhZ3NfZmlsdGVyICIkQCIpCisgICAgdGVzdF9sZCAiY2MiICIkQCIgPDxFT0YKIGludCBtYWluKHZvaWQpeyByZXR1cm4gMDsgfQogRU9GCiB9CkBAIC0xMDE5LDExICsxMTcxLDExIEBACiAKIHRlc3Rfc3RyaXBmbGFncygpewogICAgIGxvZyB0ZXN0X3N0cmlwZmxhZ3MgIiRAIgotICAgICMgY2FsbCBjaGVja19jYyB0byBnZXQgYSBmcmVzaCBUTVBPCi0gICAgY2hlY2tfY2MgPDxFT0YKKyAgICAjIGNhbGwgdGVzdF9jYyB0byBnZXQgYSBmcmVzaCBUTVBPCisgICAgdGVzdF9jYyA8PEVPRgogaW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfQogRU9GCi0gICAgY2hlY2tfY21kICRzdHJpcCAkQVNNU1RSSVBGTEFHUyAiJEAiICRUTVBPCisgICAgdGVzdF9jbWQgJHN0cmlwICRBU01TVFJJUEZMQUdTICIkQCIgJFRNUE8KIH0KIAogY2hlY2tfc3RyaXBmbGFncygpewpAQCAtMTAzMywxMyArMTE4NSwxNSBAQAogCiBjaGVja19oZWFkZXIoKXsKICAgICBsb2cgY2hlY2tfaGVhZGVyICIkQCIKLSAgICBoZWFkZXI9JDEKKyAgICBoZWFkZXJzPSQxCiAgICAgc2hpZnQKLSAgICBkaXNhYmxlX3NhZmUgJGhlYWRlcgotICAgIGNoZWNrX2NwcCAiJEAiIDw8RU9GICYmIGVuYWJsZV9zYWZlICRoZWFkZXIKLSNpbmNsdWRlIDwkaGVhZGVyPgotaW50IHg7Ci1FT0YKKyAgICBkaXNhYmxlX3Nhbml0aXplZCAkaGVhZGVycworICAgIHsKKyAgICAgICAgZm9yIGhkciBpbiAkaGVhZGVyczsgZG8KKyAgICAgICAgICAgIHByaW50X2luY2x1ZGUgJGhkcgorICAgICAgICBkb25lCisgICAgICAgIGVjaG8gImludCB4OyIKKyAgICB9IHwgdGVzdF9jcHAgIiRAIiAmJiBlbmFibGVfc2FuaXRpemVkICRoZWFkZXJzCiB9CiAKIGNoZWNrX2hlYWRlcl9vYmpjYygpewpAQCAtMTA0NywxMSArMTIwMSwyMSBAQAogICAgIHJtIC1mIC0tICIkVE1QTyIKICAgICBoZWFkZXI9JDEKICAgICBzaGlmdAotICAgIGRpc2FibGVfc2FmZSAkaGVhZGVyCisgICAgZGlzYWJsZV9zYW5pdGl6ZWQgJGhlYWRlcgogICAgIHsKICAgICAgICBlY2hvICIjaW5jbHVkZSA8JGhlYWRlcj4iCiAgICAgICAgZWNobyAiaW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfSIKLSAgICB9IHwgY2hlY2tfb2JqY2MgJiYgY2hlY2tfc3RhdCAiJFRNUE8iICYmIGVuYWJsZV9zYWZlICRoZWFkZXJzCisgICAgfSB8IHRlc3Rfb2JqY2MgJiYgdGVzdF9zdGF0ICIkVE1QTyIgJiYgZW5hYmxlX3Nhbml0aXplZCAkaGVhZGVyCit9CisKK2NoZWNrX2FwcGxlX2ZyYW1ld29yaygpeworICAgIGxvZyBjaGVja19hcHBsZV9mcmFtZXdvcmsgIiRAIgorICAgIGZyYW1ld29yaz0iJDEiCisgICAgbmFtZT0iJCh0b2xvd2VyICRmcmFtZXdvcmspIgorICAgIGhlYWRlcj0iJHtmcmFtZXdvcmt9LyR7ZnJhbWV3b3JrfS5oIgorICAgIGRpc2FibGUgJG5hbWUKKyAgICBjaGVja19oZWFkZXJfb2JqY2MgJGhlYWRlciAmJgorICAgICAgICBlbmFibGUgJG5hbWUgJiYgZXZhbCAke25hbWV9X2V4dHJhbGlicz0nIi1mcmFtZXdvcmsgJGZyYW1ld29yayInCiB9CiAKIGNoZWNrX2Z1bmMoKXsKQEAgLTEwNTksNyArMTIyMyw3IEBACiAgICAgZnVuYz0kMQogICAgIHNoaWZ0CiAgICAgZGlzYWJsZSAkZnVuYwotICAgIGNoZWNrX2xkICJjYyIgIiRAIiA8PEVPRiAmJiBlbmFibGUgJGZ1bmMKKyAgICB0ZXN0X2xkICJjYyIgIiRAIiA8PEVPRiAmJiBlbmFibGUgJGZ1bmMKIGV4dGVybiBpbnQgJGZ1bmMoKTsKIGludCBtYWluKHZvaWQpeyAkZnVuYygpOyB9CiBFT0YKQEAgLTEwNzIsNyArMTIzNiw3IEBACiAgICAgc2hpZnQgMgogICAgIHRlc3QgJG5hcmcgPSAyICYmIGFyZ3M9ImYsIGciIHx8IGFyZ3M9ImYgKiBJIgogICAgIGRpc2FibGUgJGZ1bmMKLSAgICBjaGVja19sZCAiY2MiICIkQCIgPDxFT0YgJiYgZW5hYmxlICRmdW5jCisgICAgdGVzdF9sZCAiY2MiICIkQCIgPDxFT0YgJiYgZW5hYmxlICRmdW5jCiAjaW5jbHVkZSA8Y29tcGxleC5oPgogI2luY2x1ZGUgPG1hdGguaD4KIGZsb2F0IGZvbyhjb21wbGV4IGZsb2F0IGYsIGNvbXBsZXggZmxvYXQgZykgeyByZXR1cm4gJGZ1bmMoJGFyZ3MpOyB9CkBAIC0xMDg3LDcgKzEyNTEsNyBAQAogICAgIHNoaWZ0IDIKICAgICB0ZXN0ICRuYXJnID0gMiAmJiBhcmdzPSJmLCBnIiB8fCBhcmdzPSJmIgogICAgIGRpc2FibGUgJGZ1bmMKLSAgICBjaGVja19sZCAiY2MiICIkQCIgPDxFT0YgJiYgZW5hYmxlICRmdW5jCisgICAgdGVzdF9sZCAiY2MiICIkQCIgPDxFT0YgJiYgZW5hYmxlICRmdW5jCiAjaW5jbHVkZSA8bWF0aC5oPgogZmxvYXQgZm9vKGZsb2F0IGYsIGZsb2F0IGcpIHsgcmV0dXJuICRmdW5jKCRhcmdzKTsgfQogaW50IG1haW4odm9pZCl7IHJldHVybiAoaW50KSBmb287IH0KQEAgLTExMDMsMTEgKzEyNjcsMTcgQEAKICAgICAgICAgZm9yIGhkciBpbiAkaGVhZGVyczsgZG8KICAgICAgICAgICAgIHByaW50X2luY2x1ZGUgJGhkcgogICAgICAgICBkb25lCisgICAgICAgIGVjaG8gIiNpbmNsdWRlIDxzdGRpbnQuaD4iCiAgICAgICAgIGZvciBmdW5jIGluICRmdW5jczsgZG8KICAgICAgICAgICAgIGVjaG8gImxvbmcgY2hlY2tfJGZ1bmModm9pZCkgeyByZXR1cm4gKGxvbmcpICRmdW5jOyB9IgogICAgICAgICBkb25lCi0gICAgICAgIGVjaG8gImludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0iCi0gICAgfSB8IGNoZWNrX2xkICJjYyIgIiRAIiAmJiBlbmFibGUgJGZ1bmNzICYmIGVuYWJsZV9zYWZlICRoZWFkZXJzCisgICAgICAgIGVjaG8gImludCBtYWluKHZvaWQpIHsgaW50IHJldCA9IDA7IgorICAgICAgICAjIExUTyBjb3VsZCBvcHRpbWl6ZSBvdXQgdGhlIHRlc3QgZnVuY3Rpb25zIHdpdGhvdXQgdGhpcworICAgICAgICBmb3IgZnVuYyBpbiAkZnVuY3M7IGRvCisgICAgICAgICAgICBlY2hvICIgcmV0IHw9ICgoaW50cHRyX3QpY2hlY2tfJGZ1bmMpICYgMHhGRkZGOyIKKyAgICAgICAgZG9uZQorICAgICAgICBlY2hvICJyZXR1cm4gcmV0OyB9IgorICAgIH0gfCB0ZXN0X2xkICJjYyIgIiRAIiAmJiBlbmFibGUgJGZ1bmNzICYmIGVuYWJsZV9zYW5pdGl6ZWQgJGhlYWRlcnMKIH0KIAogY2hlY2tfY2xhc3NfaGVhZGVyc19jcHAoKXsKQEAgLTExMjYsMTUgKzEyOTYsMzggQEAKICAgICAgICAgICAgIGk9JChleHByICRpICsgMSkKICAgICAgICAgZG9uZQogICAgICAgICBlY2hvICJyZXR1cm4gMDsgfSIKLSAgICB9IHwgY2hlY2tfbGQgImN4eCIgIiRAIiAmJiBlbmFibGUgJGZ1bmNzICYmIGVuYWJsZV9zYWZlICRoZWFkZXJzCisgICAgfSB8IHRlc3RfbGQgImN4eCIgIiRAIiAmJiBlbmFibGUgJGZ1bmNzICYmIGVuYWJsZV9zYW5pdGl6ZWQgJGhlYWRlcnMKK30KKwordGVzdF9jcHBfY29uZGl0aW9uKCl7CisgICAgbG9nIHRlc3RfY3BwX2NvbmRpdGlvbiAiJEAiCisgICAgaGVhZGVyPSQxCisgICAgY29uZGl0aW9uPSQyCisgICAgc2hpZnQgMgorICAgIHRlc3RfY3BwICIkQCIgPDxFT0YKKyNpbmNsdWRlIDwkaGVhZGVyPgorI2lmICEoJGNvbmRpdGlvbikKKyNlcnJvciAidW5zYXRpc2ZpZWQgY29uZGl0aW9uOiAkY29uZGl0aW9uIgorI2VuZGlmCitFT0YKIH0KIAogY2hlY2tfY3BwX2NvbmRpdGlvbigpewogICAgIGxvZyBjaGVja19jcHBfY29uZGl0aW9uICIkQCIKLSAgICBoZWFkZXI9JDEKLSAgICBjb25kaXRpb249JDIKLSAgICBzaGlmdCAyCi0gICAgY2hlY2tfY3BwICIkQCIgPDxFT0YKKyAgICBuYW1lPSQxCisgICAgc2hpZnQgMQorICAgIGRpc2FibGUgJG5hbWUKKyAgICB0ZXN0X2NwcF9jb25kaXRpb24gIiRAIiAmJiBlbmFibGUgJG5hbWUKK30KKwordGVzdF9jZmxhZ3NfY2MoKXsKKyAgICBsb2cgdGVzdF9jZmxhZ3NfY2MgIiRAIgorICAgIGZsYWdzPSQxCisgICAgaGVhZGVyPSQyCisgICAgY29uZGl0aW9uPSQzCisgICAgc2hpZnQgMworICAgIHNldCAtLSAkKCRjZmxhZ3NfZmlsdGVyICIkZmxhZ3MiKQorICAgIHRlc3RfY2MgIiRAIiA8PEVPRgogI2luY2x1ZGUgPCRoZWFkZXI+CiAjaWYgISgkY29uZGl0aW9uKQogI2Vycm9yICJ1bnNhdGlzZmllZCBjb25kaXRpb246ICRjb25kaXRpb24iCkBAIC0xMTQ0LDQ4ICsxMzM3LDU3IEBACiAKIGNoZWNrX2xpYigpewogICAgIGxvZyBjaGVja19saWIgIiRAIgotICAgIGhlYWRlcj0iJDEiCi0gICAgZnVuYz0iJDIiCi0gICAgc2hpZnQgMgotICAgIGNoZWNrX2hlYWRlciAkaGVhZGVyICYmIGNoZWNrX2Z1bmMgJGZ1bmMgIiRAIiAmJiBhZGRfZXh0cmFsaWJzICIkQCIKLX0KLQotY2hlY2tfbGliMigpewotICAgIGxvZyBjaGVja19saWIyICIkQCIKLSAgICBoZWFkZXJzPSIkMSIKLSAgICBmdW5jcz0iJDIiCi0gICAgc2hpZnQgMgotICAgIGNoZWNrX2Z1bmNfaGVhZGVycyAiJGhlYWRlcnMiICIkZnVuY3MiICIkQCIgJiYgYWRkX2V4dHJhbGlicyAiJEAiCisgICAgbmFtZT0iJDEiCisgICAgaGVhZGVycz0iJDIiCisgICAgZnVuY3M9IiQzIgorICAgIHNoaWZ0IDMKKyAgICBkaXNhYmxlICRuYW1lCisgICAgY2hlY2tfZnVuY19oZWFkZXJzICIkaGVhZGVycyIgIiRmdW5jcyIgIiRAIiAmJgorICAgICAgICBlbmFibGUgJG5hbWUgJiYgZXZhbCAke25hbWV9X2V4dHJhbGlicz0iXCRAIgogfQogCiBjaGVja19saWJfY3BwKCl7CiAgICAgbG9nIGNoZWNrX2xpYl9jcHAgIiRAIgotICAgIGhlYWRlcnM9IiQxIgotICAgIGNsYXNzZXM9IiQyIgotICAgIHNoaWZ0IDIKLSAgICBjaGVja19jbGFzc19oZWFkZXJzX2NwcCAiJGhlYWRlcnMiICIkY2xhc3NlcyIgIiRAIiAmJiBhZGRfZXh0cmFsaWJzICIkQCIKKyAgICBuYW1lPSIkMSIKKyAgICBoZWFkZXJzPSIkMiIKKyAgICBjbGFzc2VzPSIkMyIKKyAgICBzaGlmdCAzCisgICAgZGlzYWJsZSAkbmFtZQorICAgIGNoZWNrX2NsYXNzX2hlYWRlcnNfY3BwICIkaGVhZGVycyIgIiRjbGFzc2VzIiAiJEAiICYmCisgICAgICAgIGVuYWJsZSAkbmFtZSAmJiBldmFsICR7bmFtZX1fZXh0cmFsaWJzPSJcJEAiCit9CisKK3Rlc3RfcGtnX2NvbmZpZygpeworICAgIGxvZyB0ZXN0X3BrZ19jb25maWcgIiRAIgorICAgIG5hbWU9IiQxIgorICAgIHBrZ192ZXJzaW9uPSIkMiIKKyAgICBwa2c9IiR7MiUlICp9IgorICAgIGhlYWRlcnM9IiQzIgorICAgIGZ1bmNzPSIkNCIKKyAgICBzaGlmdCA0CisgICAgZGlzYWJsZSAkbmFtZQorICAgIHRlc3RfY21kICRwa2dfY29uZmlnIC0tZXhpc3RzIC0tcHJpbnQtZXJyb3JzICRwa2dfdmVyc2lvbiB8fCByZXR1cm4KKyAgICBwa2dfY2ZsYWdzPSQoJHBrZ19jb25maWcgLS1jZmxhZ3MgJHBrZ19jb25maWdfZmxhZ3MgJHBrZykKKyAgICBwa2dfbGlicz0kKCRwa2dfY29uZmlnIC0tbGlicyAkcGtnX2NvbmZpZ19mbGFncyAkcGtnKQorICAgIGNoZWNrX2Z1bmNfaGVhZGVycyAiJGhlYWRlcnMiICIkZnVuY3MiICRwa2dfY2ZsYWdzICRwa2dfbGlicyAiJEAiICYmCisgICAgICAgIGVuYWJsZSAkbmFtZSAmJgorICAgICAgICBzZXRfc2FuaXRpemVkICIke25hbWV9X2NmbGFncyIgICAgJHBrZ19jZmxhZ3MgJiYKKyAgICAgICAgc2V0X3Nhbml0aXplZCAiJHtuYW1lfV9leHRyYWxpYnMiICRwa2dfbGlicwogfQogCiBjaGVja19wa2dfY29uZmlnKCl7CiAgICAgbG9nIGNoZWNrX3BrZ19jb25maWcgIiRAIgotICAgIHBrZ2FuZHZlcnNpb249IiQxIgotICAgIHBrZz0iJHsxJSUgKn0iCi0gICAgaGVhZGVycz0iJDIiCi0gICAgZnVuY3M9IiQzIgotICAgIHNoaWZ0IDMKLSAgICBjaGVja19jbWQgJHBrZ19jb25maWcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgJHBrZ2FuZHZlcnNpb24gfHwgcmV0dXJuCi0gICAgcGtnX2NmbGFncz0kKCRwa2dfY29uZmlnIC0tY2ZsYWdzICRwa2dfY29uZmlnX2ZsYWdzICRwa2cpCi0gICAgcGtnX2xpYnM9JCgkcGtnX2NvbmZpZyAtLWxpYnMgJHBrZ19jb25maWdfZmxhZ3MgJHBrZykKLSAgICBjaGVja19mdW5jX2hlYWRlcnMgIiRoZWFkZXJzIiAiJGZ1bmNzIiAkcGtnX2NmbGFncyAkcGtnX2xpYnMgIiRAIiAmJgotICAgICAgICBzZXRfc2FmZSAiJHtwa2d9X2NmbGFncyIgJHBrZ19jZmxhZ3MgICAmJgotICAgICAgICBzZXRfc2FmZSAiJHtwa2d9X2xpYnMiICAgJHBrZ19saWJzCisgICAgbmFtZT0iJDEiCisgICAgdGVzdF9wa2dfY29uZmlnICIkQCIgJiYKKyAgICAgICAgZXZhbCBhZGRfY2ZsYWdzIFwkJHtuYW1lfV9jZmxhZ3MKIH0KIAotY2hlY2tfZXhlYygpewotICAgIGNoZWNrX2xkICJjYyIgIiRAIiAmJiB7IGVuYWJsZWQgY3Jvc3NfY29tcGlsZSB8fCAkVE1QRSA+PiAkbG9nZmlsZSAyPiYxOyB9Cit0ZXN0X2V4ZWMoKXsKKyAgICB0ZXN0X2xkICJjYyIgIiRAIiAmJiB7IGVuYWJsZWQgY3Jvc3NfY29tcGlsZSB8fCAkVE1QRSA+PiAkbG9nZmlsZSAyPiYxOyB9CiB9CiAKIGNoZWNrX2V4ZWNfY3Jhc2goKXsKKyAgICBsb2cgY2hlY2tfZXhlY19jcmFzaCAiJEAiCiAgICAgY29kZT0kKGNhdCkKIAogICAgICMgZXhpdCgpIGlzIG5vdCBhc3luYyBzaWduYWwgc2FmZS4gIF9FeGl0IChDOTkpIGFuZCBfZXhpdCAoUE9TSVgpCkBAIC0xMTk0LDcgKzEzOTYsNyBAQAogICAgICMgY2FuIHJlZGlyZWN0IHRoZSAiVGVybWluYXRlZCIgbWVzc2FnZSBmcm9tIHRoZSBzaGVsbC4gIFNJR0JVUwogICAgICMgaXMgbm90IGRlZmluZWQgYnkgc3RhbmRhcmQgQyBzbyBpdCBpcyB1c2VkIGNvbmRpdGlvbmFsbHkuCiAKLSAgICAoY2hlY2tfZXhlYyAiJEAiKSA+PiAkbG9nZmlsZSAyPiYxIDw8RU9GCisgICAgKHRlc3RfZXhlYyAiJEAiKSA+PiAkbG9nZmlsZSAyPiYxIDw8RU9GCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiBzdGF0aWMgdm9pZCBzaWdoYW5kbGVyKGludCBzaWcpewogICAgIHJhaXNlKFNJR1RFUk0pOwpAQCAtMTIyMCw4ICsxNDIyLDggQEAKICAgICBoZWFkZXJzPSQxCiAgICAgdHlwZT0kMgogICAgIHNoaWZ0IDIKLSAgICBkaXNhYmxlX3NhZmUgIiR0eXBlIgotICAgIGNoZWNrX2NvZGUgY2MgIiRoZWFkZXJzIiAiJHR5cGUgdiIgIiRAIiAmJiBlbmFibGVfc2FmZSAiJHR5cGUiCisgICAgZGlzYWJsZV9zYW5pdGl6ZWQgIiR0eXBlIgorICAgIHRlc3RfY29kZSBjYyAiJGhlYWRlcnMiICIkdHlwZSB2IiAiJEAiICYmIGVuYWJsZV9zYW5pdGl6ZWQgIiR0eXBlIgogfQogCiBjaGVja19zdHJ1Y3QoKXsKQEAgLTEyMzAsOSArMTQzMiw5IEBACiAgICAgc3RydWN0PSQyCiAgICAgbWVtYmVyPSQzCiAgICAgc2hpZnQgMwotICAgIGRpc2FibGVfc2FmZSAiJHtzdHJ1Y3R9XyR7bWVtYmVyfSIKLSAgICBjaGVja19jb2RlIGNjICIkaGVhZGVycyIgImNvbnN0IHZvaWQgKnAgPSAmKCgkc3RydWN0ICopMCktPiRtZW1iZXIiICIkQCIgJiYKLSAgICAgICAgZW5hYmxlX3NhZmUgIiR7c3RydWN0fV8ke21lbWJlcn0iCisgICAgZGlzYWJsZV9zYW5pdGl6ZWQgIiR7c3RydWN0fV8ke21lbWJlcn0iCisgICAgdGVzdF9jb2RlIGNjICIkaGVhZGVycyIgImNvbnN0IHZvaWQgKnAgPSAmKCgkc3RydWN0ICopMCktPiRtZW1iZXIiICIkQCIgJiYKKyAgICAgICAgZW5hYmxlX3Nhbml0aXplZCAiJHtzdHJ1Y3R9XyR7bWVtYmVyfSIKIH0KIAogY2hlY2tfYnVpbHRpbigpewpAQCAtMTI0Miw3ICsxNDQ0LDcgQEAKICAgICBidWlsdGluPSQzCiAgICAgc2hpZnQgMwogICAgIGRpc2FibGUgIiRuYW1lIgotICAgIGNoZWNrX2NvZGUgbGQgIiRoZWFkZXJzIiAiJGJ1aWx0aW4iICJjYyIgIiRAIiAmJiBlbmFibGUgIiRuYW1lIgorICAgIHRlc3RfY29kZSBsZCAiJGhlYWRlcnMiICIkYnVpbHRpbiIgImNjIiAiJEAiICYmIGVuYWJsZSAiJG5hbWUiCiB9CiAKIGNoZWNrX2NvbXBpbGVfYXNzZXJ0KCl7CkBAIC0xMjUyLDIzICsxNDU0LDMwIEBACiAgICAgY29uZGl0aW9uPSQzCiAgICAgc2hpZnQgMwogICAgIGRpc2FibGUgIiRuYW1lIgotICAgIGNoZWNrX2NvZGUgY2MgIiRoZWFkZXJzIiAiY2hhciBjWzIgKiAhISgkY29uZGl0aW9uKSAtIDFdIiAiJEAiICYmIGVuYWJsZSAiJG5hbWUiCisgICAgdGVzdF9jb2RlIGNjICIkaGVhZGVycyIgImNoYXIgY1syICogISEoJGNvbmRpdGlvbikgLSAxXSIgIiRAIiAmJiBlbmFibGUgIiRuYW1lIgorfQorCitjaGVja19jYygpeworICAgIGxvZyBjaGVja19jYyAiJEAiCisgICAgbmFtZT0kMQorICAgIHNoaWZ0CisgICAgZGlzYWJsZSAiJG5hbWUiCisgICAgdGVzdF9jb2RlIGNjICIkQCIgJiYgZW5hYmxlICIkbmFtZSIKIH0KIAogcmVxdWlyZSgpewotICAgIG5hbWU9IiQxIgotICAgIGhlYWRlcj0iJDIiCi0gICAgZnVuYz0iJDMiCi0gICAgc2hpZnQgMwotICAgIGNoZWNrX2xpYiAkaGVhZGVyICRmdW5jICIkQCIgfHwgZGllICJFUlJPUjogJG5hbWUgbm90IGZvdW5kIgorICAgIGxvZyByZXF1aXJlICIkQCIKKyAgICBuYW1lX3ZlcnNpb249IiQxIgorICAgIG5hbWU9IiR7MSUlICp9IgorICAgIHNoaWZ0CisgICAgY2hlY2tfbGliICRuYW1lICIkQCIgfHwgZGllICJFUlJPUjogJG5hbWVfdmVyc2lvbiBub3QgZm91bmQiCiB9CiAKLXJlcXVpcmUyKCl7CityZXF1aXJlX2NjKCl7CisgICAgbG9nIHJlcXVpcmVfY2MgIiRAIgogICAgIG5hbWU9IiQxIgotICAgIGhlYWRlcnM9IiQyIgotICAgIGZ1bmM9IiQzIgotICAgIHNoaWZ0IDMKLSAgICBjaGVja19saWIyICIkaGVhZGVycyIgJGZ1bmMgIiRAIiB8fCBkaWUgIkVSUk9SOiAkbmFtZSBub3QgZm91bmQiCisgICAgc2hpZnQKKyAgICB0ZXN0X2NvZGUgY2MgIiRAIiB8fCBkaWUgIkVSUk9SOiAkbmFtZSBmYWlsZWQiCiB9CiAKIHJlcXVpcmVfY3BwKCl7CkBAIC0xMjc5LDM1ICsxNDg4LDIyIEBACiAgICAgY2hlY2tfbGliX2NwcCAiJGhlYWRlcnMiICIkY2xhc3NlcyIgIiRAIiB8fCBkaWUgIkVSUk9SOiAkbmFtZSBub3QgZm91bmQiCiB9CiAKLXVzZV9wa2dfY29uZmlnKCl7Ci0gICAgcGtnPSIkMSIKLSAgICBjaGVja19wa2dfY29uZmlnICIkQCIgfHwgcmV0dXJuIDEKLSAgICBhZGRfY2ZsYWdzICAgICQoZ2V0X3NhZmUgIiR7cGtnfV9jZmxhZ3MiKQotICAgIGFkZF9leHRyYWxpYnMgJChnZXRfc2FmZSAiJHtwa2d9X2xpYnMiKQorcmVxdWlyZV9oZWFkZXIoKXsKKyAgICBsb2cgcmVxdWlyZV9oZWFkZXIgIiRAIgorICAgIGhlYWRlcnM9IiQxIgorICAgIGNoZWNrX2hlYWRlciAiJEAiIHx8IGRpZSAiRVJST1I6ICRoZWFkZXJzIG5vdCBmb3VuZCIKK30KKworcmVxdWlyZV9jcHBfY29uZGl0aW9uKCl7CisgICAgbG9nIHJlcXVpcmVfY3BwX2NvbmRpdGlvbiAiJEAiCisgICAgY29uZGl0aW9uPSIkMiIKKyAgICB0ZXN0X2NwcF9jb25kaXRpb24gIiRAIiB8fCBkaWUgIkVSUk9SOiAkY29uZGl0aW9uIG5vdCBzYXRpc2ZpZWQiCiB9CiAKIHJlcXVpcmVfcGtnX2NvbmZpZygpewotICAgIHVzZV9wa2dfY29uZmlnICIkQCIgfHwgZGllICJFUlJPUjogJHBrZyBub3QgZm91bmQgdXNpbmcgcGtnLWNvbmZpZyRwa2dfY29uZmlnX2ZhaWxfbWVzc2FnZSIKLX0KLQotcmVxdWlyZV9saWJmcmVldHlwZSgpewotICAgIGxvZyByZXF1aXJlX2xpYmZyZWV0eXBlICIkQCIKLSAgICBwa2c9ImZyZWV0eXBlMiIKLSAgICBjaGVja19jbWQgJHBrZ19jb25maWcgLS1leGlzdHMgLS1wcmludC1lcnJvcnMgJHBrZyBcCi0gICAgICB8fCBkaWUgIkVSUk9SOiAkcGtnIG5vdCBmb3VuZCIKLSAgICBwa2dfY2ZsYWdzPSQoJHBrZ19jb25maWcgLS1jZmxhZ3MgJHBrZ19jb25maWdfZmxhZ3MgJHBrZykKLSAgICBwa2dfbGlicz0kKCRwa2dfY29uZmlnIC0tbGlicyAkcGtnX2NvbmZpZ19mbGFncyAkcGtnKQotICAgIHsKLSAgICAgICAgZWNobyAiI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+IgotICAgICAgICBlY2hvICIjaW5jbHVkZSBGVF9GUkVFVFlQRV9IIgotICAgICAgICBlY2hvICJsb25nIGNoZWNrX2Z1bmModm9pZCkgeyByZXR1cm4gKGxvbmcpIEZUX0luaXRfRnJlZVR5cGU7IH0iCi0gICAgICAgIGVjaG8gImludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0iCi0gICAgfSB8IGNoZWNrX2xkICJjYyIgJHBrZ19jZmxhZ3MgJHBrZ19saWJzIFwKLSAgICAgICYmIHNldF9zYWZlICIke3BrZ31fY2ZsYWdzIiAkcGtnX2NmbGFncyBcCi0gICAgICAmJiBzZXRfc2FmZSAiJHtwa2d9X2xpYnMiICAgJHBrZ19saWJzIFwKLSAgICAgIHx8IGRpZSAiRVJST1I6ICRwa2cgbm90IGZvdW5kIgotICAgIGFkZF9jZmxhZ3MgICAgJChnZXRfc2FmZSAiJHtwa2d9X2NmbGFncyIpCi0gICAgYWRkX2V4dHJhbGlicyAkKGdldF9zYWZlICIke3BrZ31fbGlicyIpCisgICAgbG9nIHJlcXVpcmVfcGtnX2NvbmZpZyAiJEAiCisgICAgcGtnX3ZlcnNpb249IiQyIgorICAgIGNoZWNrX3BrZ19jb25maWcgIiRAIiB8fCBkaWUgIkVSUk9SOiAkcGtnX3ZlcnNpb24gbm90IGZvdW5kIHVzaW5nIHBrZy1jb25maWckcGtnX2NvbmZpZ19mYWlsX21lc3NhZ2UiCiB9CiAKIGhvc3RjY19lKCl7CkBAIC0xMzE4LDQxICsxNTE0LDQxIEBACiAgICAgZXZhbCBwcmludGYgJyVzXFxuJyAkSE9TVENDX08KIH0KIAotY2hlY2tfaG9zdF9jYygpewotICAgIGxvZyBjaGVja19ob3N0X2NjICIkQCIKK3Rlc3RfaG9zdF9jYygpeworICAgIGxvZyB0ZXN0X2hvc3RfY2MgIiRAIgogICAgIGNhdCA+ICRUTVBDCiAgICAgbG9nX2ZpbGUgJFRNUEMKLSAgICBjaGVja19jbWQgJGhvc3RfY2MgJGhvc3RfY2ZsYWdzICIkQCIgJEhPU1RDQ19DICQoaG9zdGNjX28gJFRNUE8pICRUTVBDCisgICAgdGVzdF9jbWQgJGhvc3RfY2MgJGhvc3RfY2ZsYWdzICIkQCIgJEhPU1RDQ19DICQoaG9zdGNjX28gJFRNUE8pICRUTVBDCiB9CiAKLWNoZWNrX2hvc3RfY3BwKCl7Ci0gICAgbG9nIGNoZWNrX2hvc3RfY3BwICIkQCIKK3Rlc3RfaG9zdF9jcHAoKXsKKyAgICBsb2cgdGVzdF9ob3N0X2NwcCAiJEAiCiAgICAgY2F0ID4gJFRNUEMKICAgICBsb2dfZmlsZSAkVE1QQwotICAgIGNoZWNrX2NtZCAkaG9zdF9jYyAkaG9zdF9jcHBmbGFncyAkaG9zdF9jZmxhZ3MgIiRAIiAkKGhvc3RjY19lICRUTVBPKSAkVE1QQworICAgIHRlc3RfY21kICRob3N0X2NjICRob3N0X2NwcGZsYWdzICRob3N0X2NmbGFncyAiJEAiICQoaG9zdGNjX2UgJFRNUE8pICRUTVBDCiB9CiAKIGNoZWNrX2hvc3RfY3BwZmxhZ3MoKXsKICAgICBsb2cgY2hlY2tfaG9zdF9jcHBmbGFncyAiJEAiCi0gICAgY2hlY2tfaG9zdF9jYyAiJEAiIDw8RU9GICYmIGFwcGVuZCBob3N0X2NwcGZsYWdzICIkQCIKLWludCB4OworICAgIHRlc3RfaG9zdF9jcHAgIiRAIiA8PEVPRiAmJiBhcHBlbmQgaG9zdF9jcHBmbGFncyAiJEAiCisjaW5jbHVkZSA8c3RkbGliLmg+CiBFT0YKIH0KIAogY2hlY2tfaG9zdF9jZmxhZ3MoKXsKICAgICBsb2cgY2hlY2tfaG9zdF9jZmxhZ3MgIiRAIgogICAgIHNldCAtLSAkKCRob3N0X2NmbGFnc19maWx0ZXIgIiRAIikKLSAgICBjaGVja19ob3N0X2NjICIkQCIgPDxFT0YgJiYgYXBwZW5kIGhvc3RfY2ZsYWdzICIkQCIKKyAgICB0ZXN0X2hvc3RfY2MgIiRAIiA8PEVPRiAmJiBhcHBlbmQgaG9zdF9jZmxhZ3MgIiRAIgogaW50IHg7CiBFT0YKIH0KIAotY2hlY2tfaG9zdF9jcHBfY29uZGl0aW9uKCl7Ci0gICAgbG9nIGNoZWNrX2hvc3RfY3BwX2NvbmRpdGlvbiAiJEAiCit0ZXN0X2hvc3RfY3BwX2NvbmRpdGlvbigpeworICAgIGxvZyB0ZXN0X2hvc3RfY3BwX2NvbmRpdGlvbiAiJEAiCiAgICAgaGVhZGVyPSQxCiAgICAgY29uZGl0aW9uPSQyCiAgICAgc2hpZnQgMgotICAgIGNoZWNrX2hvc3RfY3BwICIkQCIgPDxFT0YKKyAgICB0ZXN0X2hvc3RfY3BwICIkQCIgPDxFT0YKICNpbmNsdWRlIDwkaGVhZGVyPgogI2lmICEoJGNvbmRpdGlvbikKICNlcnJvciAidW5zYXRpc2ZpZWQgY29uZGl0aW9uOiAkY29uZGl0aW9uIgpAQCAtMTM2MCwxMCArMTU1NiwxOCBAQAogRU9GCiB9CiAKK2NoZWNrX2hvc3RfY3BwX2NvbmRpdGlvbigpeworICAgIGxvZyBjaGVja19ob3N0X2NwcF9jb25kaXRpb24gIiRAIgorICAgIG5hbWU9JDEKKyAgICBzaGlmdCAxCisgICAgZGlzYWJsZSAkbmFtZQorICAgIHRlc3RfaG9zdF9jcHBfY29uZGl0aW9uICIkQCIgJiYgZW5hYmxlICRuYW1lCit9CisKIGNwX2lmX2NoYW5nZWQoKXsKLSAgICBjbXAgLXMgIiQxIiAiJDIiICYmIGVjaG8gIiQyIGlzIHVuY2hhbmdlZCIgJiYgcmV0dXJuCisgICAgY21wIC1zICIkMSIgIiQyIiAmJiB7IHRlc3QgIiRxdWlldCIgIT0gInllcyIgJiYgZWNobyAiJDIgaXMgdW5jaGFuZ2VkIjsgfSAmJiByZXR1cm4KICAgICBta2RpciAtcCAiJChkaXJuYW1lICQyKSIKLSAgICAkY3BfZiAiJDEiICIkMiIKKyAgICBjcCAtZiAiJDEiICIkMiIKIH0KIAogIyBDT05GSUdfTElTVCBjb250YWlucyBjb25maWd1cmFibGUgb3B0aW9ucywgd2hpbGUgSEFWRV9MSVNUIGlzIGZvcgpAQCAtMTM4MSwzNiArMTU4NSwzOCBAQAogICAgIGluZGV2cwogICAgIG91dGRldnMKICIKKwogQVZGSUxURVJfQ09NUE9ORU5UUz0iCiAgICAgZmlsdGVycwogIgorCiBBVkZPUk1BVF9DT01QT05FTlRTPSIKICAgICBkZW11eGVycwogICAgIG11eGVycwogICAgIHByb3RvY29scwogIgogCi1BVlJFU0FNUExFX0NPTVBPTkVOVFM9IiIKLUFWVVRJTF9DT01QT05FTlRTPSIiCi0KIENPTVBPTkVOVF9MSVNUPSIKICAgICAkQVZDT0RFQ19DT01QT05FTlRTCiAgICAgJEFWREVWSUNFX0NPTVBPTkVOVFMKICAgICAkQVZGSUxURVJfQ09NUE9ORU5UUwogICAgICRBVkZPUk1BVF9DT01QT05FTlRTCi0gICAgJEFWUkVTQU1QTEVfQ09NUE9ORU5UUwotICAgICRBVlVUSUxfQ09NUE9ORU5UUwogIgogCiBFWEFNUExFX0xJU1Q9IgotICAgIGF2aW9fcmVhZGluZ19leGFtcGxlCiAgICAgYXZpb19kaXJfY21kX2V4YW1wbGUKLSAgICBkZWNvZGluZ19lbmNvZGluZ19leGFtcGxlCisgICAgYXZpb19yZWFkaW5nX2V4YW1wbGUKKyAgICBkZWNvZGVfYXVkaW9fZXhhbXBsZQorICAgIGRlY29kZV92aWRlb19leGFtcGxlCiAgICAgZGVtdXhpbmdfZGVjb2RpbmdfZXhhbXBsZQorICAgIGVuY29kZV9hdWRpb19leGFtcGxlCisgICAgZW5jb2RlX3ZpZGVvX2V4YW1wbGUKICAgICBleHRyYWN0X212c19leGFtcGxlCiAgICAgZmlsdGVyX2F1ZGlvX2V4YW1wbGUKICAgICBmaWx0ZXJpbmdfYXVkaW9fZXhhbXBsZQogICAgIGZpbHRlcmluZ192aWRlb19leGFtcGxlCisgICAgaHR0cF9tdWx0aWNsaWVudF9leGFtcGxlCisgICAgaHdfZGVjb2RlX2V4YW1wbGUKICAgICBtZXRhZGF0YV9leGFtcGxlCiAgICAgbXV4aW5nX2V4YW1wbGUKICAgICBxc3ZkZWNfZXhhbXBsZQpAQCAtMTQxOSwzMCArMTYyNSw4MiBAQAogICAgIHNjYWxpbmdfdmlkZW9fZXhhbXBsZQogICAgIHRyYW5zY29kZV9hYWNfZXhhbXBsZQogICAgIHRyYW5zY29kaW5nX2V4YW1wbGUKKyAgICB2YWFwaV9lbmNvZGVfZXhhbXBsZQorICAgIHZhYXBpX3RyYW5zY29kZV9leGFtcGxlCisiCisKK0VYVEVSTkFMX0FVVE9ERVRFQ1RfTElCUkFSWV9MSVNUPSIKKyAgICBhbHNhCisgICAgYXBwa2l0CisgICAgYXZmb3VuZGF0aW9uCisgICAgYnpsaWIKKyAgICBjb3JlaW1hZ2UKKyAgICBpY29udgorICAgIGxpYnhjYgorICAgIGxpYnhjYl9zaG0KKyAgICBsaWJ4Y2Jfc2hhcGUKKyAgICBsaWJ4Y2JfeGZpeGVzCisgICAgbHptYQorICAgIHNjaGFubmVsCisgICAgc2RsMgorICAgIHNlY3VyZXRyYW5zcG9ydAorICAgIHNuZGlvCisgICAgeGxpYgorICAgIHpsaWIKKyIKKworRVhURVJOQUxfTElCUkFSWV9HUExfTElTVD0iCisgICAgYXZpc3ludGgKKyAgICBmcmVpMHIKKyAgICBsaWJjZGlvCisgICAgbGlicnViYmVyYmFuZAorICAgIGxpYnZpZHN0YWIKKyAgICBsaWJ4MjY0CisgICAgbGlieDI2NQorICAgIGxpYnhhdnMKKyAgICBsaWJ4dmlkCisiCisKK0VYVEVSTkFMX0xJQlJBUllfTk9ORlJFRV9MSVNUPSIKKyAgICBkZWNrbGluaworICAgIGxpYm5kaV9uZXd0ZWsKKyAgICBsaWJmZGtfYWFjCisgICAgb3BlbnNzbAorICAgIGxpYnRscworIgorCitFWFRFUk5BTF9MSUJSQVJZX1ZFUlNJT04zX0xJU1Q9IgorICAgIGdtcAorICAgIGxpYm9wZW5jb3JlX2Ftcm5iCisgICAgbGlib3BlbmNvcmVfYW1yd2IKKyAgICBsaWJ2bWFmCisgICAgbGlidm9fYW1yd2JlbmMKKyAgICBya21wcAorIgorCitFWFRFUk5BTF9MSUJSQVJZX0dQTFYzX0xJU1Q9IgorICAgIGxpYnNtYmNsaWVudAogIgogCiBFWFRFUk5BTF9MSUJSQVJZX0xJU1Q9IgotICAgIGF2aXN5bnRoCi0gICAgYnpsaWIKKyAgICAkRVhURVJOQUxfTElCUkFSWV9HUExfTElTVAorICAgICRFWFRFUk5BTF9MSUJSQVJZX05PTkZSRUVfTElTVAorICAgICRFWFRFUk5BTF9MSUJSQVJZX1ZFUlNJT04zX0xJU1QKKyAgICAkRVhURVJOQUxfTElCUkFSWV9HUExWM19MSVNUCiAgICAgY2hyb21hcHJpbnQKLSAgICBjcnlzdGFsaGQKLSAgICBkZWNrbGluawotICAgIGZyZWkwcgogICAgIGdjcnlwdAotICAgIGdtcAogICAgIGdudXRscwotICAgIGljb252CisgICAgam5pCiAgICAgbGFkc3BhCisgICAgbGliYW9tCiAgICAgbGliYXNzCiAgICAgbGliYmx1cmF5CiAgICAgbGliYnMyYgogICAgIGxpYmNhY2EKLSAgICBsaWJjZGlvCiAgICAgbGliY2VsdAorICAgIGxpYmNvZGVjMgogICAgIGxpYmRjMTM5NAotICAgIGxpYmRjYWRlYwotICAgIGxpYmZhYWMKLSAgICBsaWJmZGtfYWFjCisgICAgbGliZHJtCiAgICAgbGliZmxpdGUKICAgICBsaWJmb250Y29uZmlnCiAgICAgbGliZnJlZXR5cGUKQEAgLTE0NTEsNjMgKzE3MDksNzkgQEAKICAgICBsaWJnc20KICAgICBsaWJpZWM2MTg4MwogICAgIGxpYmlsYmMKKyAgICBsaWJqYWNrCiAgICAgbGlia3ZhemFhcgotICAgIGxpYm1meAogICAgIGxpYm1vZHBsdWcKICAgICBsaWJtcDNsYW1lCi0gICAgbGlibnV0Ci0gICAgbGlib3BlbmNvcmVfYW1ybmIKLSAgICBsaWJvcGVuY29yZV9hbXJ3YgorICAgIGxpYm15c29mYQogICAgIGxpYm9wZW5jdgogICAgIGxpYm9wZW5oMjY0CiAgICAgbGlib3BlbmpwZWcKKyAgICBsaWJvcGVubXB0CiAgICAgbGlib3B1cwogICAgIGxpYnB1bHNlCisgICAgbGlicnN2ZwogICAgIGxpYnJ0bXAKLSAgICBsaWJydWJiZXJiYW5kCi0gICAgbGlic2Nocm9lZGluZ2VyCiAgICAgbGlic2hpbmUKICAgICBsaWJzbWJjbGllbnQKICAgICBsaWJzbmFwcHkKICAgICBsaWJzb3hyCiAgICAgbGlic3BlZXgKKyAgICBsaWJzcnQKICAgICBsaWJzc2gKICAgICBsaWJ0ZXNzZXJhY3QKICAgICBsaWJ0aGVvcmEKICAgICBsaWJ0d29sYW1lCi0gICAgbGlidXR2aWRlbwogICAgIGxpYnY0bDIKLSAgICBsaWJ2aWRzdGFiCi0gICAgbGlidm9fYW1yd2JlbmMKICAgICBsaWJ2b3JiaXMKICAgICBsaWJ2cHgKICAgICBsaWJ3YXZwYWNrCiAgICAgbGlid2VicAotICAgIGxpYngyNjQKLSAgICBsaWJ4MjY1Ci0gICAgbGlieGF2cwotICAgIGxpYnhjYgotICAgIGxpYnhjYl9zaG0KLSAgICBsaWJ4Y2Jfc2hhcGUKLSAgICBsaWJ4Y2JfeGZpeGVzCi0gICAgbGlieHZpZAorICAgIGxpYnhtbDIKICAgICBsaWJ6aW1nCiAgICAgbGliem1xCiAgICAgbGlienZiaQotICAgIGx6bWEKLSAgICBtbWFsCi0gICAgbmV0Y2RmCi0gICAgbnZlbmMKKyAgICBsdjIKKyAgICBtZWRpYWNvZGVjCiAgICAgb3BlbmFsCi0gICAgb3BlbmNsCiAgICAgb3BlbmdsCi0gICAgb3BlbnNzbAotICAgIHNjaGFubmVsCi0gICAgc2RsCi0gICAgc2VjdXJldHJhbnNwb3J0Ci0gICAgeDExZ3JhYgotICAgIHhsaWIKLSAgICB6bGliCisiCisKK0hXQUNDRUxfQVVUT0RFVEVDVF9MSUJSQVJZX0xJU1Q9IgorICAgIGFtZgorICAgIGF1ZGlvdG9vbGJveAorICAgIGNyeXN0YWxoZAorICAgIGN1ZGEKKyAgICBjdXZpZAorICAgIGQzZDExdmEKKyAgICBkeHZhMgorICAgIGZmbnZjb2RlYworICAgIG52ZGVjCisgICAgbnZlbmMKKyAgICB2YWFwaQorICAgIHZkcGF1CisgICAgdmlkZW90b29sYm94CisgICAgdjRsMl9tMm0KKyAgICB4dm1jCisiCisKKyMgY2F0Y2hhbGwgbGlzdCBvZiB0aGluZ3MgdGhhdCByZXF1aXJlIGV4dGVybmFsIGxpYnMgdG8gbGluaworRVhUUkFMSUJTX0xJU1Q9IgorICAgIGNwdV9pbml0CisgICAgY3dzMmZ3cworIgorCitIV0FDQ0VMX0xJQlJBUllfTk9ORlJFRV9MSVNUPSIKKyAgICBjdWRhX3NkaworICAgIGxpYm5wcAorIgorCitIV0FDQ0VMX0xJQlJBUllfTElTVD0iCisgICAgJEhXQUNDRUxfTElCUkFSWV9OT05GUkVFX0xJU1QKKyAgICBsaWJtZngKKyAgICBtbWFsCisgICAgb214CisgICAgb3BlbmNsCiAiCiAKIERPQ1VNRU5UX0xJU1Q9IgpAQCAtMTUyMiw2ICsxNzk2LDcgQEAKICAgICBmdHJhcHYKICAgICBncmF5CiAgICAgaGFyZGNvZGVkX3RhYmxlcworICAgIG9teF9ycGkKICAgICBydW50aW1lX2NwdWRldGVjdAogICAgIHNhZmVfYml0c3RyZWFtX3JlYWRlcgogICAgIHNoYXJlZApAQCAtMTUzMCwyNiArMTgwNSwxNyBAQAogICAgIHN3c2NhbGVfYWxwaGEKICIKIAotSFdBQ0NFTF9MSVNUPSIKLSAgICBkM2QxMXZhCi0gICAgZHh2YTIKLSAgICB2YWFwaQotICAgIHZkYQotICAgIHZkcGF1Ci0gICAgdmlkZW90b29sYm94Ci0gICAgeHZtYwotIgotCisjIHRoaXMgbGlzdCBzaG91bGQgYmUga2VwdCBpbiBsaW5raW5nIG9yZGVyCiBMSUJSQVJZX0xJU1Q9IgotICAgIGF2Y29kZWMKICAgICBhdmRldmljZQogICAgIGF2ZmlsdGVyCisgICAgc3dzY2FsZQorICAgIHBvc3Rwcm9jCiAgICAgYXZmb3JtYXQKKyAgICBhdmNvZGVjCisgICAgc3dyZXNhbXBsZQogICAgIGF2cmVzYW1wbGUKICAgICBhdnV0aWwKLSAgICBwb3N0cHJvYwotICAgIHN3cmVzYW1wbGUKLSAgICBzd3NjYWxlCiAiCiAKIExJQ0VOU0VfTElTVD0iCkBAIC0xNTYxLDcgKzE4MjcsNiBAQAogUFJPR1JBTV9MSVNUPSIKICAgICBmZnBsYXkKICAgICBmZnByb2JlCi0gICAgZmZzZXJ2ZXIKICAgICBmZm1wZWcKICIKIApAQCAtMTU4MCwyOCArMTg0NSwzMCBAQAogICAgIHJkZnQKICIKIAorIyBDT01QT05FTlRfTElTVCBuZWVkcyB0byBjb21lIGxhc3QgdG8gZW5zdXJlIGNvcnJlY3QgZGVwZW5kZW5jeSBjaGVja2luZwogQ09ORklHX0xJU1Q9IgotICAgICRDT01QT05FTlRfTElTVAogICAgICRET0NVTUVOVF9MSVNUCiAgICAgJEVYQU1QTEVfTElTVAogICAgICRFWFRFUk5BTF9MSUJSQVJZX0xJU1QKKyAgICAkRVhURVJOQUxfQVVUT0RFVEVDVF9MSUJSQVJZX0xJU1QKKyAgICAkSFdBQ0NFTF9MSUJSQVJZX0xJU1QKKyAgICAkSFdBQ0NFTF9BVVRPREVURUNUX0xJQlJBUllfTElTVAogICAgICRGRUFUVVJFX0xJU1QKLSAgICAkSFdBQ0NFTF9MSVNUCiAgICAgJExJQ0VOU0VfTElTVAogICAgICRMSUJSQVJZX0xJU1QKICAgICAkUFJPR1JBTV9MSVNUCiAgICAgJFNVQlNZU1RFTV9MSVNUCisgICAgYXV0b2RldGVjdAogICAgIGZvbnRjb25maWcKLSAgICBpbmNvbXBhdGlibGVfbGliYXZfYWJpCi0gICAgbWVtYWxpZ25faGFjaworICAgIGxpbnV4X3BlcmYKICAgICBtZW1vcnlfcG9pc29uaW5nCiAgICAgbmVvbl9jbG9iYmVyX3Rlc3QKKyAgICBvc3NmdXp6CiAgICAgcGljCi0gICAgcG9kMm1hbgotICAgIHJhaXNlX21ham9yCiAgICAgdGh1bWIKICAgICB2YWxncmluZF9iYWNrdHJhY2UKICAgICB4bW1fY2xvYmJlcl90ZXN0CisgICAgJENPTVBPTkVOVF9MSVNUCiAiCiAKIFRIUkVBRFNfTElTVD0iCkBAIC0xNjE2LDYgKzE4ODMsMTIgQEAKICAgICBhdG9taWNzX3dpbjMyCiAiCiAKK0FVVE9ERVRFQ1RfTElCUz0iCisgICAgJEVYVEVSTkFMX0FVVE9ERVRFQ1RfTElCUkFSWV9MSVNUCisgICAgJEhXQUNDRUxfQVVUT0RFVEVDVF9MSUJSQVJZX0xJU1QKKyAgICAkVEhSRUFEU19MSVNUCisiCisKIEFSQ0hfTElTVD0iCiAgICAgYWFyY2g2NAogICAgIGFscGhhCkBAIC0xNjU3LDYgKzE5MzAsNyBAQAogQVJDSF9FWFRfTElTVF9NSVBTPSIKICAgICBtaXBzZnB1CiAgICAgbWlwczMycjIKKyAgICBtaXBzMzJyNQogICAgIG1pcHM2NHIyCiAgICAgbWlwczMycjYKICAgICBtaXBzNjRyNgpAQCAtMTY3Nyw2ICsxOTUxLDcgQEAKICAgICBhbWQzZG5vd2V4dAogICAgIGF2eAogICAgIGF2eDIKKyAgICBhdng1MTIKICAgICBmbWEzCiAgICAgZm1hNAogICAgIG1teApAQCAtMTcxOCw0MSArMTk5MywzOSBAQAogICAgIGZhc3RfNjRiaXQKICAgICBmYXN0X2NsegogICAgIGZhc3RfY21vdgotICAgIGxvY2FsX2FsaWduZWRfOAotICAgIGxvY2FsX2FsaWduZWRfMTYKLSAgICBsb2NhbF9hbGlnbmVkXzMyCisgICAgbG9jYWxfYWxpZ25lZAogICAgIHNpbWRfYWxpZ25fMTYKKyAgICBzaW1kX2FsaWduXzMyCisgICAgc2ltZF9hbGlnbl82NAogIgogCiBCVUlMVElOX0xJU1Q9IgogICAgIGF0b21pY19jYXNfcHRyCi0gICAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UKICAgICBtYWNoaW5lX3J3X2JhcnJpZXIKICAgICBNZW1vcnlCYXJyaWVyCiAgICAgbW1fZW1wdHkKICAgICByZHRzYwotICAgIHNhcmVzdGFydAorICAgIHNlbV90aW1lZHdhaXQKICAgICBzeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwCiAiCiBIQVZFX0xJU1RfQ01ETElORT0iCiAgICAgaW5saW5lX2FzbQogICAgIHN5bXZlcgotICAgIHlhc20KKyAgICB4ODZhc20KICIKIAogSEFWRV9MSVNUX1BVQj0iCiAgICAgYmlnZW5kaWFuCiAgICAgZmFzdF91bmFsaWduZWQKLSAgICBpbmNvbXBhdGlibGVfbGliYXZfYWJpCiAiCiAKIEhFQURFUlNfTElTVD0iCi0gICAgYWxzYV9hc291bmRsaWJfaAotICAgIGFsdGl2ZWNfaAogICAgIGFycGFfaW5ldF9oCiAgICAgYXNtX3R5cGVzX2gKICAgICBjZGlvX3BhcmFub2lhX2gKICAgICBjZGlvX3BhcmFub2lhX3BhcmFub2lhX2gKKyAgICBjdWRhX2gKKyAgICBkaXNwYXRjaF9kaXNwYXRjaF9oCiAgICAgZGV2X2JrdHJfaW9jdGxfYnQ4NDhfaAogICAgIGRldl9ia3RyX2lvY3RsX21ldGVvcl9oCiAgICAgZGV2X2ljX2J0OHh4X2gKQEAgLTE3NjAsMjUgKzIwMzMsMTggQEAKICAgICBkZXZfdmlkZW9fbWV0ZW9yX2lvY3RsX21ldGVvcl9oCiAgICAgZGlyZWN0X2gKICAgICBkaXJlbnRfaAotICAgIGRsZmNuX2gKLSAgICBkM2QxMV9oCisgICAgZHhnaWRlYnVnX2gKICAgICBkeHZhX2gKICAgICBFUzJfZ2xfaAogICAgIGdzbV9oCiAgICAgaW9faAotICAgIG1hY2hfbWFjaF90aW1lX2gKKyAgICBsaW51eF9wZXJmX2V2ZW50X2gKICAgICBtYWNoaW5lX2lvY3RsX2J0ODQ4X2gKICAgICBtYWNoaW5lX2lvY3RsX21ldGVvcl9oCiAgICAgbWFsbG9jX2gKICAgICBvcGVuY3YyX2NvcmVfY29yZV9jX2gKLSAgICBvcGVuanBlZ18yXzFfb3BlbmpwZWdfaAotICAgIG9wZW5qcGVnXzJfMF9vcGVuanBlZ19oCi0gICAgb3BlbmpwZWdfMV81X29wZW5qcGVnX2gKICAgICBPcGVuR0xfZ2wzX2gKICAgICBwb2xsX2gKLSAgICBzbmRpb19oCi0gICAgc291bmRjYXJkX2gKLSAgICBzeXNfbW1hbl9oCiAgICAgc3lzX3BhcmFtX2gKICAgICBzeXNfcmVzb3VyY2VfaAogICAgIHN5c19zZWxlY3RfaApAQCAtMTgzNSw2ICsyMTAxLDE2IEBACiAgICAgdHJ1bmNmCiAiCiAKK1NZU1RFTV9GRUFUVVJFUz0iCisgICAgZG9zX3BhdGhzCisgICAgbGliY19tc3ZjcnQKKyAgICBNTUFMX1BBUkFNRVRFUl9WSURFT19NQVhfTlVNX0NBTExCQUNLUworICAgIHNlY3Rpb25fZGF0YV9yZWxfcm8KKyAgICB0aHJlYWRzCisgICAgdXdwCisgICAgd2lucnQKKyIKKwogU1lTVEVNX0ZVTkNTPSIKICAgICBhY2Nlc3MKICAgICBhbGlnbmVkX21hbGxvYwpAQCAtMTg0MiwxMiArMjExOCw3IEBACiAgICAgY2xvY2tfZ2V0dGltZQogICAgIGNsb3Nlc29ja2V0CiAgICAgQ29tbWFuZExpbmVUb0FyZ3ZXCi0gICAgQ29UYXNrTWVtRnJlZQotICAgIENyeXB0R2VuUmFuZG9tCi0gICAgZGxvcGVuCiAgICAgZmNudGwKLSAgICBmbHRfbGltCi0gICAgZm9yawogICAgIGdldGFkZHJpbmZvCiAgICAgZ2V0aHJ0aW1lCiAgICAgZ2V0b3B0CkBAIC0xODYyLDcgKzIxMzMsNiBAQAogICAgIGdtdGltZV9yCiAgICAgaW5ldF9hdG9uCiAgICAgaXNhdHR5Ci0gICAgamFja19wb3J0X2dldF9sYXRlbmN5X3JhbmdlCiAgICAga2JoaXQKICAgICBsb2NhbHRpbWVfcgogICAgIGxzdGF0CkBAIC0xODc4LDYgKzIxNDgsNyBAQAogICAgIHBvc2l4X21lbWFsaWduCiAgICAgcHRocmVhZF9jYW5jZWwKICAgICBzY2hlZF9nZXRhZmZpbml0eQorICAgIFNlY0l0ZW1JbXBvcnQKICAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZQogICAgIFNldENvbnNvbGVDdHJsSGFuZGxlcgogICAgIHNldG1vZGUKQEAgLTE4OTIsMTMgKzIxNjMsMjEgQEAKICAgICB3Z2xHZXRQcm9jQWRkcmVzcwogIgogCitTWVNURU1fTElCUkFSSUVTPSIKKyAgICBiY3J5cHQKKyAgICB2YWFwaV9kcm0KKyAgICB2YWFwaV94MTEKKyAgICB2ZHBhdV94MTEKKyIKKwogVE9PTENIQUlOX0ZFQVRVUkVTPSIKKyAgICBhc19hcmNoX2RpcmVjdGl2ZQogICAgIGFzX2RuX2RpcmVjdGl2ZQorICAgIGFzX2ZwdV9kaXJlY3RpdmUKICAgICBhc19mdW5jCiAgICAgYXNfb2JqZWN0X2FyY2gKICAgICBhc21fbW9kX3EKLSAgICBhdHRyaWJ1dGVfbWF5X2FsaWFzCi0gICAgYXR0cmlidXRlX3BhY2tlZAorICAgIGJsb2Nrc19leHRlbnNpb24KICAgICBlYnBfYXZhaWxhYmxlCiAgICAgZWJ4X2F2YWlsYWJsZQogICAgIGdudV9hcwpAQCAtMTkxNywxMiArMjE5NiwxMyBAQAogIgogCiBUWVBFU19MSVNUPSIKLSAgICBDT05ESVRJT05fVkFSSUFCTEVfUHRyCisgICAga0NNVmlkZW9Db2RlY1R5cGVfSEVWQwogICAgIHNvY2tsZW5fdAogICAgIHN0cnVjdF9hZGRyaW5mbwogICAgIHN0cnVjdF9ncm91cF9zb3VyY2VfcmVxCiAgICAgc3RydWN0X2lwX21yZXFfc291cmNlCiAgICAgc3RydWN0X2lwdjZfbXJlcQorICAgIHN0cnVjdF9tc2doZHJfbXNnX2ZsYWdzCiAgICAgc3RydWN0X3BvbGxmZAogICAgIHN0cnVjdF9ydXNhZ2VfcnVfbWF4cnNzCiAgICAgc3RydWN0X3NjdHBfZXZlbnRfc3Vic2NyaWJlCkBAIC0xOTM4LDcgKzIyMTgsNiBAQAogICAgICQoYWRkX3N1ZmZpeCBfZXh0ZXJuYWwgJEFSQ0hfRVhUX0xJU1QpCiAgICAgJChhZGRfc3VmZml4IF9pbmxpbmUgICAkQVJDSF9FWFRfTElTVCkKICAgICAkQVJDSF9GRUFUVVJFUwotICAgICRBVE9NSUNTX0xJU1QKICAgICAkQlVJTFRJTl9MSVNUCiAgICAgJENPTVBMRVhfRlVOQ1MKICAgICAkSEFWRV9MSVNUX0NNRExJTkUKQEAgLTE5NDYsNDAgKzIyMjUsMzkgQEAKICAgICAkSEVBREVSU19MSVNUCiAgICAgJElOVFJJTlNJQ1NfTElTVAogICAgICRNQVRIX0ZVTkNTCisgICAgJFNZU1RFTV9GRUFUVVJFUwogICAgICRTWVNURU1fRlVOQ1MKKyAgICAkU1lTVEVNX0xJQlJBUklFUwogICAgICRUSFJFQURTX0xJU1QKICAgICAkVE9PTENIQUlOX0ZFQVRVUkVTCiAgICAgJFRZUEVTX0xJU1QKLSAgICBhdG9taWNzX25hdGl2ZQotICAgIGRvc19wYXRocwotICAgIGR4dmEyX2xpYgotICAgIGR4dmEyYXBpX2NvYmoKLSAgICBsaWJjX21zdmNydAotICAgIGxpYmRjMTM5NF8xCi0gICAgbGliZGMxMzk0XzIKICAgICBtYWtlaW5mbwogICAgIG1ha2VpbmZvX2h0bWwKKyAgICBvcGVuY2xfZDNkMTEKKyAgICBvcGVuY2xfZHJtX2FybQorICAgIG9wZW5jbF9kcm1fYmVpZ25ldAorICAgIG9wZW5jbF9keHZhMgorICAgIG9wZW5jbF92YWFwaV9iZWlnbmV0CisgICAgb3BlbmNsX3ZhYXBpX2ludGVsX21lZGlhCiAgICAgcGVybAogICAgIHBvZDJtYW4KLSAgICBzZGwKLSAgICBzZWN0aW9uX2RhdGFfcmVsX3JvCiAgICAgdGV4aTJodG1sCi0gICAgdGhyZWFkcwotICAgIHZhYXBpX3gxMQotICAgIHZkcGF1X3gxMQotICAgIHdpbnJ0Ci0gICAgeGxpYgogIgogCiAjIG9wdGlvbnMgZW1pdHRlZCB3aXRoIENPTkZJR18gcHJlZml4IGJ1dCBub3QgYXZhaWxhYmxlIG9uIHRoZSBjb21tYW5kIGxpbmUKIENPTkZJR19FWFRSQT0iCiAgICAgYWFuZGN0dGFibGVzCiAgICAgYWMzZHNwCisgICAgYWR0c19oZWFkZXIKICAgICBhdWRpb19mcmFtZV9xdWV1ZQogICAgIGF1ZGlvZHNwCiAgICAgYmxvY2tkc3AKICAgICBic3dhcGRzcAogICAgIGNhYmFjCisgICAgY2JzCisgICAgY2JzX2gyNjQKKyAgICBjYnNfaDI2NQorICAgIGNic19tcGVnMgogICAgIGRpcmFjX3BhcnNlCiAgICAgZHZwcm9maWxlCiAgICAgZXhpZgpAQCAtMTk5NSwyOCArMjI3MywzMyBAQAogICAgIGgyNjNkc3AKICAgICBoMjY0Y2hyb21hCiAgICAgaDI2NGRzcAorICAgIGgyNjRwYXJzZQogICAgIGgyNjRwcmVkCiAgICAgaDI2NHFwZWwKKyAgICBoZXZjcGFyc2UKICAgICBocGVsZHNwCiAgICAgaHVmZm1hbgogICAgIGh1ZmZ5dXZkc3AKICAgICBodWZmeXV2ZW5jZHNwCiAgICAgaWRjdGRzcAogICAgIGlpcmZpbHRlcgotICAgIGltZGN0MTUKKyAgICBtZGN0MTUKICAgICBpbnRyYXg4CisgICAgaXNvX21lZGlhCiAgICAgaXZpZHNwCiAgICAganBlZ3RhYmxlcwogICAgIGxncGx2MwogICAgIGxpYngyNjIKICAgICBsbGF1ZGRzcAogICAgIGxsdmlkZHNwCisgICAgbGx2aWRlbmNkc3AKICAgICBscGMKICAgICBsemYKICAgICBtZV9jbXAKICAgICBtcGVnX2VyCiAgICAgbXBlZ2F1ZGlvCiAgICAgbXBlZ2F1ZGlvZHNwCisgICAgbXBlZ2F1ZGlvaGVhZGVyCiAgICAgbXBlZ3ZpZGVvCiAgICAgbXBlZ3ZpZGVvZW5jCiAgICAgbXNzMzRkc3AKQEAgLTIwMjUsNiArMjMwOCw3IEBACiAgICAgcXN2CiAgICAgcXN2ZGVjCiAgICAgcXN2ZW5jCisgICAgcXN2dnBwCiAgICAgcmFuZ2Vjb2RlcgogICAgIHJpZmZkZWMKICAgICByaWZmZW5jCkBAIC0yMDMzLDEwICsyMzE3LDE0IEBACiAgICAgcnYzNGRzcAogICAgIHNpbmV3aW4KICAgICBzbmFwcHkKKyAgICBzcnRwCiAgICAgc3RhcnRjb2RlCiAgICAgdGV4dHVyZWRzcAogICAgIHRleHR1cmVkc3BlbmMKICAgICB0cGVsZHNwCisgICAgdmFhcGlfMQorICAgIHZhYXBpX2VuY29kZQorICAgIHZjMWRzcAogICAgIHZpZGVvZHNwCiAgICAgdnAzZHNwCiAgICAgdnA1NmRzcApAQCAtMjA3MSw2ICsyMzU5LDcgQEAKICAgICBwa2djb25maWdkaXIKICAgICBwcmVmaXgKICAgICBzaGxpYmRpcgorICAgIGluc3RhbGxfbmFtZV9kaXIKICIKIAogQ01ETElORV9TRVQ9IgpAQCAtMjA5MywxNiArMjM4MiwyMCBAQAogICAgIGdhcwogICAgIGhvc3RfY2MKICAgICBob3N0X2NmbGFncworICAgIGhvc3RfZXh0cmFsaWJzCiAgICAgaG9zdF9sZAogICAgIGhvc3RfbGRmbGFncwotICAgIGhvc3RfbGlicwogICAgIGhvc3Rfb3MKKyAgICBpZ25vcmVfdGVzdHMKICAgICBpbnN0YWxsCiAgICAgbGQKKyAgICBsbl9zCiAgICAgbG9nZmlsZQogICAgIG1hbGxvY19wcmVmaXgKICAgICBubQogICAgIG9wdGZsYWdzCisgICAgbnZjYworICAgIG52Y2NmbGFncwogICAgIHBrZ19jb25maWcKICAgICBwa2dfY29uZmlnX2ZsYWdzCiAgICAgcHJvZ3Nfc3VmZml4CkBAIC0yMTIwLDcgKzI0MTMsNyBAQAogICAgIHRlbXBwcmVmaXgKICAgICB0b29sY2hhaW4KICAgICB2YWxncmluZAotICAgIHlhc21leGUKKyAgICB4ODZhc21leGUKICIKIAogQ01ETElORV9BUFBFTkQ9IgpAQCAtMjE0NiwxNiArMjQzOSw2IEBACiAKIG1hcCAnZXZhbCAke3Z9X2lubGluZV9kZXBzPWlubGluZV9hc20nICRBUkNIX0VYVF9MSVNUX0FSTQogCi1taXBzZnB1X2RlcHM9Im1pcHMiCi1taXBzZHNwX2RlcHM9Im1pcHMiCi1taXBzZHNwcjJfZGVwcz0ibWlwcyIKLW1pcHMzMnIyX2RlcHM9Im1pcHMiCi1taXBzMzJyNl9kZXBzPSJtaXBzIgotbWlwczY0cjJfZGVwcz0ibWlwcyIKLW1pcHM2NHI2X2RlcHM9Im1pcHMiCi1tc2FfZGVwcz0ibWlwcyIKLW1taV9kZXBzPSJtaXBzIgotCiBhbHRpdmVjX2RlcHM9InBwYyIKIGRjYnpsX2RlcHM9InBwYyIKIGxkYnJ4X2RlcHM9InBwYyIKQEAgLTIxNjMsNiArMjQ0NiwxOSBAQAogdnN4X2RlcHM9ImFsdGl2ZWMiCiBwb3dlcjhfZGVwcz0idnN4IgogCitsb29uZ3NvbjJfZGVwcz0ibWlwcyIKK2xvb25nc29uM19kZXBzPSJtaXBzIgorbWlwczMycjJfZGVwcz0ibWlwcyIKK21pcHMzMnI1X2RlcHM9Im1pcHMiCittaXBzMzJyNl9kZXBzPSJtaXBzIgorbWlwczY0cjJfZGVwcz0ibWlwcyIKK21pcHM2NHI2X2RlcHM9Im1pcHMiCittaXBzZnB1X2RlcHM9Im1pcHMiCittaXBzZHNwX2RlcHM9Im1pcHMiCittaXBzZHNwcjJfZGVwcz0ibWlwcyIKK21taV9kZXBzPSJtaXBzIgorbXNhX2RlcHM9Im1pcHNmcHUiCisKIGNwdW5vcF9kZXBzPSJpNjg2IgogeDg2XzY0X3NlbGVjdD0iaTY4NiIKIHg4Nl82NF9zdWdnZXN0PSJmYXN0X2Ntb3YiCkBAIC0yMTg0LDkgKzI0ODAsMTAgQEAKIGZtYTNfZGVwcz0iYXZ4IgogZm1hNF9kZXBzPSJhdngiCiBhdngyX2RlcHM9ImF2eCIKK2F2eDUxMl9kZXBzPSJhdngyIgogCi1tbXhfZXh0ZXJuYWxfZGVwcz0ieWFzbSIKLW1teF9pbmxpbmVfZGVwcz0iaW5saW5lX2FzbSIKK21teF9leHRlcm5hbF9kZXBzPSJ4ODZhc20iCittbXhfaW5saW5lX2RlcHM9ImlubGluZV9hc20geDg2IgogbW14X3N1Z2dlc3Q9Im1teF9leHRlcm5hbCBtbXhfaW5saW5lIgogCiBmb3IgZXh0IGluICQoZmlsdGVyX291dCBtbXggJEFSQ0hfRVhUX0xJU1RfWDg2X1NJTUQpOyBkbwpAQCAtMjIwMSwxMyArMjQ5OCwxNyBAQAogZmFzdF9jbHpfaWZfYW55PSJhYXJjaDY0IGFscGhhIGF2cjMyIG1pcHMgcHBjIHg4NiIKIGZhc3RfdW5hbGlnbmVkX2lmX2FueT0iYWFyY2g2NCBwcGMgeDg2Igogc2ltZF9hbGlnbl8xNl9pZl9hbnk9ImFsdGl2ZWMgbmVvbiBzc2UiCitzaW1kX2FsaWduXzMyX2lmX2FueT0iYXZ4Igorc2ltZF9hbGlnbl82NF9pZl9hbnk9ImF2eDUxMiIKIAogIyBzeXN0ZW0gY2FwYWJpbGl0aWVzCitsaW51eF9wZXJmX2RlcHM9ImxpbnV4X3BlcmZfZXZlbnRfaCIKIHN5bXZlcl9pZl9hbnk9InN5bXZlcl9hc21fbGFiZWwgc3ltdmVyX2dudV9hc20iCi12YWxncmluZF9iYWNrdHJhY2VfZGVwcz0iIW9wdGltaXphdGlvbnMgdmFsZ3JpbmRfdmFsZ3JpbmRfaCIKK3ZhbGdyaW5kX2JhY2t0cmFjZV9jb25mbGljdD0ib3B0aW1pemF0aW9ucyIKK3ZhbGdyaW5kX2JhY2t0cmFjZV9kZXBzPSJ2YWxncmluZF92YWxncmluZF9oIgogCiAjIHRocmVhZGluZyBzdXBwb3J0Ci1hdG9taWNzX2djY19pZl9hbnk9InN5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXAgYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UiCithdG9taWNzX2djY19pZj0ic3luY192YWxfY29tcGFyZV9hbmRfc3dhcCIKIGF0b21pY3Nfc3VuY2NfaWY9ImF0b21pY19jYXNfcHRyIG1hY2hpbmVfcndfYmFycmllciIKIGF0b21pY3Nfd2luMzJfaWY9Ik1lbW9yeUJhcnJpZXIiCiBhdG9taWNzX25hdGl2ZV9pZl9hbnk9IiRBVE9NSUNTX0xJU1QiCkBAIC0yMjE1LDI3ICsyNTE2LDM0IEBACiB0aHJlYWRzX2lmX2FueT0iJFRIUkVBRFNfTElTVCIKIAogIyBzdWJzeXN0ZW1zCitjYnNfaDI2NF9zZWxlY3Q9ImNicyBnb2xvbWIiCitjYnNfaDI2NV9zZWxlY3Q9ImNicyBnb2xvbWIiCitjYnNfbXBlZzJfc2VsZWN0PSJjYnMiCiBkY3Rfc2VsZWN0PSJyZGZ0IgogZGlyYWNfcGFyc2Vfc2VsZWN0PSJnb2xvbWIiCiBlcnJvcl9yZXNpbGllbmNlX3NlbGVjdD0ibWVfY21wIgotZmFhbmRjdF9kZXBzPSJmYWFuIGZkY3Rkc3AiCi1mYWFuaWRjdF9kZXBzPSJmYWFuIGlkY3Rkc3AiCitmYWFuZGN0X2RlcHM9ImZhYW4iCitmYWFuZGN0X3NlbGVjdD0iZmRjdGRzcCIKK2ZhYW5pZGN0X2RlcHM9ImZhYW4iCitmYWFuaWRjdF9zZWxlY3Q9ImlkY3Rkc3AiCitoMjY0ZHNwX3NlbGVjdD0ic3RhcnRjb2RlIgoraGV2Y3BhcnNlX3NlbGVjdD0iZ29sb21iIgogZnJhbWVfdGhyZWFkX2VuY29kZXJfZGVwcz0iZW5jb2RlcnMgdGhyZWFkcyIKLWludHJheDhfc2VsZWN0PSJlcnJvcl9yZXNpbGllbmNlIgoraW50cmF4OF9zZWxlY3Q9ImJsb2NrZHNwIGlkY3Rkc3AiCiBtZGN0X3NlbGVjdD0iZmZ0IgorbWRjdDE1X3NlbGVjdD0iZmZ0IgogbWVfY21wX3NlbGVjdD0iZmRjdGRzcCBpZGN0ZHNwIHBpeGJsb2NrZHNwIgogbXBlZ19lcl9zZWxlY3Q9ImVycm9yX3Jlc2lsaWVuY2UiCi1tcGVnYXVkaW9fc2VsZWN0PSJtcGVnYXVkaW9kc3AiCittcGVnYXVkaW9fc2VsZWN0PSJtcGVnYXVkaW9kc3AgbXBlZ2F1ZGlvaGVhZGVyIgogbXBlZ2F1ZGlvZHNwX3NlbGVjdD0iZGN0IgogbXBlZ3ZpZGVvX3NlbGVjdD0iYmxvY2tkc3AgaDI2NGNocm9tYSBocGVsZHNwIGlkY3Rkc3AgbWVfY21wIG1wZWdfZXIgdmlkZW9kc3AiCiBtcGVndmlkZW9lbmNfc2VsZWN0PSJtZV9jbXAgbXBlZ3ZpZGVvIHBpeGJsb2NrZHNwIHFwZWxkc3AiCi1xc3ZkZWNfc2VsZWN0PSJxc3YiCi1xc3ZlbmNfc2VsZWN0PSJxc3YiCit2YzFkc3Bfc2VsZWN0PSJoMjY0Y2hyb21hIHFwZWxkc3Agc3RhcnRjb2RlIgogcmRmdF9zZWxlY3Q9ImZmdCIKIAogIyBkZWNvZGVycyAvIGVuY29kZXJzCi1hYWNfZGVjb2Rlcl9zZWxlY3Q9ImltZGN0MTUgbWRjdCBzaW5ld2luIgotYWFjX2ZpeGVkX2RlY29kZXJfc2VsZWN0PSJtZGN0IHNpbmV3aW4iCithYWNfZGVjb2Rlcl9zZWxlY3Q9ImFkdHNfaGVhZGVyIG1kY3QxNSBtZGN0IHNpbmV3aW4iCithYWNfZml4ZWRfZGVjb2Rlcl9zZWxlY3Q9ImFkdHNfaGVhZGVyIG1kY3Qgc2luZXdpbiIKIGFhY19lbmNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUgaWlyZmlsdGVyIGxwYyBtZGN0IHNpbmV3aW4iCiBhYWNfbGF0bV9kZWNvZGVyX3NlbGVjdD0iYWFjX2RlY29kZXIgYWFjX2xhdG1fcGFyc2VyIgogYWMzX2RlY29kZXJfc2VsZWN0PSJhYzNfcGFyc2VyIGFjM2RzcCBic3dhcGRzcCBmbXRjb252ZXJ0IG1kY3QiCkBAIC0yMjUyLDggKzI1NjAsMTMgQEAKIGFtdl9kZWNvZGVyX3NlbGVjdD0ic3A1eF9kZWNvZGVyIGV4aWYiCiBhbXZfZW5jb2Rlcl9zZWxlY3Q9ImFhbmRjdHRhYmxlcyBqcGVndGFibGVzIG1wZWd2aWRlb2VuYyIKIGFwZV9kZWNvZGVyX3NlbGVjdD0iYnN3YXBkc3AgbGxhdWRkc3AiCi1hcG5nX2RlY29kZXJfc2VsZWN0PSJ6bGliIgotYXBuZ19lbmNvZGVyX3NlbGVjdD0iaHVmZnl1dmVuY2RzcCB6bGliIgorYXBuZ19kZWNvZGVyX2RlcHM9InpsaWIiCithcG5nX2VuY29kZXJfZGVwcz0iemxpYiIKK2FwbmdfZW5jb2Rlcl9zZWxlY3Q9ImxsdmlkZW5jZHNwIgorYXB0eF9kZWNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUiCithcHR4X2VuY29kZXJfc2VsZWN0PSJhdWRpb19mcmFtZV9xdWV1ZSIKK2FwdHhfaGRfZGVjb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgorYXB0eF9oZF9lbmNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUiCiBhc3YxX2RlY29kZXJfc2VsZWN0PSJibG9ja2RzcCBic3dhcGRzcCBpZGN0ZHNwIgogYXN2MV9lbmNvZGVyX3NlbGVjdD0iYnN3YXBkc3AgZmRjdGRzcCBwaXhibG9ja2RzcCIKIGFzdjJfZGVjb2Rlcl9zZWxlY3Q9ImJsb2NrZHNwIGJzd2FwZHNwIGlkY3Rkc3AiCkBAIC0yMjY2LDYgKzI1NzksNyBAQAogYmlua2F1ZGlvX2RjdF9kZWNvZGVyX3NlbGVjdD0ibWRjdCByZGZ0IGRjdCBzaW5ld2luIHdtYV9mcmVxcyIKIGJpbmthdWRpb19yZGZ0X2RlY29kZXJfc2VsZWN0PSJtZGN0IHJkZnQgc2luZXdpbiB3bWFfZnJlcXMiCiBjYXZzX2RlY29kZXJfc2VsZWN0PSJibG9ja2RzcCBnb2xvbWIgaDI2NGNocm9tYSBpZGN0ZHNwIHFwZWxkc3AgdmlkZW9kc3AiCitjbGVhcnZpZGVvX2RlY29kZXJfc2VsZWN0PSJpZGN0ZHNwIgogY2xsY19kZWNvZGVyX3NlbGVjdD0iYnN3YXBkc3AiCiBjb21mb3J0bm9pc2VfZW5jb2Rlcl9zZWxlY3Q9ImxwYyIKIGNvb2tfZGVjb2Rlcl9zZWxlY3Q9ImF1ZGlvZHNwIG1kY3Qgc2luZXdpbiIKQEAgLTIyNzYsMzIgKzI1OTAsMzQgQEAKIGRpcmFjX2RlY29kZXJfc2VsZWN0PSJkaXJhY19wYXJzZSBkd3QgZ29sb21iIHZpZGVvZHNwIG1wZWd2aWRlb2VuYyIKIGRueGhkX2RlY29kZXJfc2VsZWN0PSJibG9ja2RzcCBpZGN0ZHNwIgogZG54aGRfZW5jb2Rlcl9zZWxlY3Q9ImFhbmRjdHRhYmxlcyBibG9ja2RzcCBmZGN0ZHNwIGlkY3Rkc3AgbXBlZ3ZpZGVvZW5jIHBpeGJsb2NrZHNwIgorZG9sYnlfZV9kZWNvZGVyX3NlbGVjdD0ibWRjdCIKIGR2dmlkZW9fZGVjb2Rlcl9zZWxlY3Q9ImR2cHJvZmlsZSBpZGN0ZHNwIgogZHZ2aWRlb19lbmNvZGVyX3NlbGVjdD0iZHZwcm9maWxlIGZkY3Rkc3AgbWVfY21wIHBpeGJsb2NrZHNwIgotZHhhX2RlY29kZXJfc2VsZWN0PSJ6bGliIgorZHhhX2RlY29kZXJfZGVwcz0iemxpYiIKIGR4dl9kZWNvZGVyX3NlbGVjdD0ibHpmIHRleHR1cmVkc3AiCiBlYWMzX2RlY29kZXJfc2VsZWN0PSJhYzNfZGVjb2RlciIKIGVhYzNfZW5jb2Rlcl9zZWxlY3Q9ImFjM19lbmNvZGVyIgogZWFtYWRfZGVjb2Rlcl9zZWxlY3Q9ImFhbmRjdHRhYmxlcyBibG9ja2RzcCBic3dhcGRzcCBpZGN0ZHNwIG1wZWd2aWRlbyIKIGVhdGdxX2RlY29kZXJfc2VsZWN0PSJhYW5kY3R0YWJsZXMiCi1lYXRxaV9kZWNvZGVyX3NlbGVjdD0iYWFuZGN0dGFibGVzIGJsb2NrZHNwIGJzd2FwZHNwIGlkY3Rkc3AgbXBlZzF2aWRlb19kZWNvZGVyIgotZXhyX2RlY29kZXJfc2VsZWN0PSJ6bGliIgotZmZ2MV9kZWNvZGVyX3NlbGVjdD0iZ29sb21iIHJhbmdlY29kZXIiCitlYXRxaV9kZWNvZGVyX3NlbGVjdD0iYWFuZGN0dGFibGVzIGJsb2NrZHNwIGJzd2FwZHNwIGlkY3Rkc3AiCitleHJfZGVjb2Rlcl9kZXBzPSJ6bGliIgorZmZ2MV9kZWNvZGVyX3NlbGVjdD0icmFuZ2Vjb2RlciIKIGZmdjFfZW5jb2Rlcl9zZWxlY3Q9InJhbmdlY29kZXIiCiBmZnZodWZmX2RlY29kZXJfc2VsZWN0PSJodWZmeXV2X2RlY29kZXIiCiBmZnZodWZmX2VuY29kZXJfc2VsZWN0PSJodWZmeXV2X2VuY29kZXIiCiBmaWNfZGVjb2Rlcl9zZWxlY3Q9ImdvbG9tYiIKLWZsYWNfZGVjb2Rlcl9zZWxlY3Q9ImZsYWNkc3AgZ29sb21iIgotZmxhY19lbmNvZGVyX3NlbGVjdD0iYnN3YXBkc3AgZmxhY2RzcCBnb2xvbWIgbHBjIgotZmxhc2hzdjJfZGVjb2Rlcl9zZWxlY3Q9InpsaWIiCi1mbGFzaHN2Ml9lbmNvZGVyX3NlbGVjdD0iemxpYiIKLWZsYXNoc3ZfZGVjb2Rlcl9zZWxlY3Q9InpsaWIiCi1mbGFzaHN2X2VuY29kZXJfc2VsZWN0PSJ6bGliIgorZmxhY19kZWNvZGVyX3NlbGVjdD0iZmxhY2RzcCIKK2ZsYWNfZW5jb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIGZsYWNkc3AgbHBjIgorZmxhc2hzdjJfZGVjb2Rlcl9kZXBzPSJ6bGliIgorZmxhc2hzdjJfZW5jb2Rlcl9kZXBzPSJ6bGliIgorZmxhc2hzdl9kZWNvZGVyX2RlcHM9InpsaWIiCitmbGFzaHN2X2VuY29kZXJfZGVwcz0iemxpYiIKIGZsdl9kZWNvZGVyX3NlbGVjdD0iaDI2M19kZWNvZGVyIgogZmx2X2VuY29kZXJfc2VsZWN0PSJoMjYzX2VuY29kZXIiCiBmb3VyeG1fZGVjb2Rlcl9zZWxlY3Q9ImJsb2NrZHNwIGJzd2FwZHNwIgogZnJhcHNfZGVjb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIGh1ZmZtYW4iCi1nMm1fZGVjb2Rlcl9zZWxlY3Q9ImJsb2NrZHNwIGlkY3Rkc3AganBlZ3RhYmxlcyB6bGliIgorZzJtX2RlY29kZXJfZGVwcz0iemxpYiIKK2cybV9kZWNvZGVyX3NlbGVjdD0iYmxvY2tkc3AgaWRjdGRzcCBqcGVndGFibGVzIgogZzcyOV9kZWNvZGVyX3NlbGVjdD0iYXVkaW9kc3AiCiBoMjYxX2RlY29kZXJfc2VsZWN0PSJtcGVndmlkZW8iCiBoMjYxX2VuY29kZXJfc2VsZWN0PSJhYW5kY3R0YWJsZXMgbXBlZ3ZpZGVvZW5jIgpAQCAtMjMxMCwzNCArMjYyNiwyNiBAQAogaDI2M2lfZGVjb2Rlcl9zZWxlY3Q9ImgyNjNfZGVjb2RlciIKIGgyNjNwX2RlY29kZXJfc2VsZWN0PSJoMjYzX2RlY29kZXIiCiBoMjYzcF9lbmNvZGVyX3NlbGVjdD0iaDI2M19lbmNvZGVyIgotaDI2NF9kZWNvZGVyX3NlbGVjdD0iY2FiYWMgZ29sb21iIGgyNjRjaHJvbWEgaDI2NGRzcCBoMjY0cHJlZCBoMjY0cXBlbCBzdGFydGNvZGUgdmlkZW9kc3AiCitoMjY0X2RlY29kZXJfc2VsZWN0PSJjYWJhYyBnb2xvbWIgaDI2NGNocm9tYSBoMjY0ZHNwIGgyNjRwYXJzZSBoMjY0cHJlZCBoMjY0cXBlbCB2aWRlb2RzcCIKIGgyNjRfZGVjb2Rlcl9zdWdnZXN0PSJlcnJvcl9yZXNpbGllbmNlIgotaDI2NF9xc3ZfZGVjb2Rlcl9kZXBzPSJsaWJtZngiCi1oMjY0X3Fzdl9kZWNvZGVyX3NlbGVjdD0iaDI2NF9tcDR0b2FubmV4Yl9ic2YgaDI2NF9wYXJzZXIgcXN2ZGVjIGgyNjRfcXN2X2h3YWNjZWwiCi1oMjY0X3Fzdl9lbmNvZGVyX2RlcHM9ImxpYm1meCIKLWgyNjRfcXN2X2VuY29kZXJfc2VsZWN0PSJxc3ZlbmMiCiBoYXBfZGVjb2Rlcl9zZWxlY3Q9InNuYXBweSB0ZXh0dXJlZHNwIgogaGFwX2VuY29kZXJfZGVwcz0ibGlic25hcHB5IgogaGFwX2VuY29kZXJfc2VsZWN0PSJ0ZXh0dXJlZHNwZW5jIgotaGV2Y19kZWNvZGVyX3NlbGVjdD0iYnN3YXBkc3AgY2FiYWMgZ29sb21iIHZpZGVvZHNwIgotaGV2Y19xc3ZfZGVjb2Rlcl9kZXBzPSJsaWJtZngiCi1oZXZjX3Fzdl9kZWNvZGVyX3NlbGVjdD0iaGV2Y19tcDR0b2FubmV4Yl9ic2YgaGV2Y19wYXJzZXIgcXN2ZGVjIGhldmNfcXN2X2h3YWNjZWwiCi1oZXZjX3Fzdl9lbmNvZGVyX2RlcHM9ImxpYm1meCIKLWhldmNfcXN2X2VuY29kZXJfc2VsZWN0PSJxc3ZlbmMiCitoZXZjX2RlY29kZXJfc2VsZWN0PSJic3dhcGRzcCBjYWJhYyBnb2xvbWIgaGV2Y3BhcnNlIHZpZGVvZHNwIgogaHVmZnl1dl9kZWNvZGVyX3NlbGVjdD0iYnN3YXBkc3AgaHVmZnl1dmRzcCBsbHZpZGRzcCIKLWh1ZmZ5dXZfZW5jb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIGh1ZmZtYW4gaHVmZnl1dmVuY2RzcCBsbHZpZGRzcCIKK2h1ZmZ5dXZfZW5jb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIGh1ZmZtYW4gaHVmZnl1dmVuY2RzcCBsbHZpZGVuY2RzcCIKIGlhY19kZWNvZGVyX3NlbGVjdD0iaW1jX2RlY29kZXIiCiBpbWNfZGVjb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIGZmdCBtZGN0IHNpbmV3aW4iCiBpbmRlbzNfZGVjb2Rlcl9zZWxlY3Q9ImhwZWxkc3AiCiBpbmRlbzRfZGVjb2Rlcl9zZWxlY3Q9Iml2aWRzcCIKIGluZGVvNV9kZWNvZGVyX3NlbGVjdD0iaXZpZHNwIgogaW50ZXJwbGF5X3ZpZGVvX2RlY29kZXJfc2VsZWN0PSJocGVsZHNwIgotanBlZ2xzX2RlY29kZXJfc2VsZWN0PSJnb2xvbWIgbWpwZWdfZGVjb2RlciIKLWpwZWdsc19lbmNvZGVyX3NlbGVjdD0iZ29sb21iIgoranBlZ2xzX2RlY29kZXJfc2VsZWN0PSJtanBlZ19kZWNvZGVyIgoganZfZGVjb2Rlcl9zZWxlY3Q9ImJsb2NrZHNwIgotbGFnYXJpdGhfZGVjb2Rlcl9zZWxlY3Q9Imh1ZmZ5dXZkc3AiCi1sanBlZ19lbmNvZGVyX3NlbGVjdD0iYWFuZGN0dGFibGVzIGlkY3Rkc3AganBlZ3RhYmxlcyIKLWxvY29fZGVjb2Rlcl9zZWxlY3Q9ImdvbG9tYiIKK2xhZ2FyaXRoX2RlY29kZXJfc2VsZWN0PSJsbHZpZGRzcCIKK2xqcGVnX2VuY29kZXJfc2VsZWN0PSJhYW5kY3R0YWJsZXMgaWRjdGRzcCBqcGVndGFibGVzIG1wZWd2aWRlb2VuYyIKK21hZ2ljeXV2X2RlY29kZXJfc2VsZWN0PSJsbHZpZGRzcCIKK21hZ2ljeXV2X2VuY29kZXJfc2VsZWN0PSJsbHZpZGVuY2RzcCIKIG1kZWNfZGVjb2Rlcl9zZWxlY3Q9ImJsb2NrZHNwIGlkY3Rkc3AgbXBlZ3ZpZGVvIgogbWV0YXNvdW5kX2RlY29kZXJfc2VsZWN0PSJsc3AgbWRjdCBzaW5ld2luIgogbWltaWNfZGVjb2Rlcl9zZWxlY3Q9ImJsb2NrZHNwIGJzd2FwZHNwIGhwZWxkc3AgaWRjdGRzcCIKQEAgLTIzNDUsNiArMjY1Myw3IEBACiBtanBlZ19lbmNvZGVyX3NlbGVjdD0iYWFuZGN0dGFibGVzIGpwZWd0YWJsZXMgbXBlZ3ZpZGVvZW5jIgogbWpwZWdiX2RlY29kZXJfc2VsZWN0PSJtanBlZ19kZWNvZGVyIgogbWxwX2RlY29kZXJfc2VsZWN0PSJtbHBfcGFyc2VyIgorbWxwX2VuY29kZXJfc2VsZWN0PSJscGMiCiBtb3Rpb25waXhlbHNfZGVjb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIgogbXAxX2RlY29kZXJfc2VsZWN0PSJtcGVnYXVkaW8iCiBtcDFmbG9hdF9kZWNvZGVyX3NlbGVjdD0ibXBlZ2F1ZGlvIgpAQCAtMjM1OCwyNiArMjY2NywyMSBAQAogbXAzb240ZmxvYXRfZGVjb2Rlcl9zZWxlY3Q9Im1wZWdhdWRpbyIKIG1wYzdfZGVjb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIG1wZWdhdWRpb2RzcCIKIG1wYzhfZGVjb2Rlcl9zZWxlY3Q9Im1wZWdhdWRpb2RzcCIKLW1wZWdfeHZtY19kZWNvZGVyX2RlcHM9IlgxMV9leHRlbnNpb25zX1h2TUNsaWJfaCIKLW1wZWdfeHZtY19kZWNvZGVyX3NlbGVjdD0ibXBlZzJ2aWRlb19kZWNvZGVyIgogbXBlZ3ZpZGVvX2RlY29kZXJfc2VsZWN0PSJtcGVndmlkZW8iCiBtcGVnMXZpZGVvX2RlY29kZXJfc2VsZWN0PSJtcGVndmlkZW8iCiBtcGVnMXZpZGVvX2VuY29kZXJfc2VsZWN0PSJhYW5kY3R0YWJsZXMgbXBlZ3ZpZGVvZW5jIGgyNjNkc3AiCiBtcGVnMnZpZGVvX2RlY29kZXJfc2VsZWN0PSJtcGVndmlkZW8iCiBtcGVnMnZpZGVvX2VuY29kZXJfc2VsZWN0PSJhYW5kY3R0YWJsZXMgbXBlZ3ZpZGVvZW5jIGgyNjNkc3AiCi1tcGVnMl9xc3ZfZGVjb2Rlcl9kZXBzPSJsaWJtZngiCi1tcGVnMl9xc3ZfZGVjb2Rlcl9zZWxlY3Q9InFzdmRlYyBtcGVnMl9xc3ZfaHdhY2NlbCIKLW1wZWcyX3Fzdl9lbmNvZGVyX2RlcHM9ImxpYm1meCIKLW1wZWcyX3Fzdl9lbmNvZGVyX3NlbGVjdD0icXN2ZW5jIgogbXBlZzRfZGVjb2Rlcl9zZWxlY3Q9ImgyNjNfZGVjb2RlciBtcGVnNHZpZGVvX3BhcnNlciIKIG1wZWc0X2VuY29kZXJfc2VsZWN0PSJoMjYzX2VuY29kZXIiCiBtc2ExX2RlY29kZXJfc2VsZWN0PSJtc3MzNGRzcCIKK21zY2NfZGVjb2Rlcl9kZXBzPSJ6bGliIgogbXNtcGVnNHYxX2RlY29kZXJfc2VsZWN0PSJoMjYzX2RlY29kZXIiCiBtc21wZWc0djJfZGVjb2Rlcl9zZWxlY3Q9ImgyNjNfZGVjb2RlciIKIG1zbXBlZzR2Ml9lbmNvZGVyX3NlbGVjdD0iaDI2M19lbmNvZGVyIgogbXNtcGVnNHYzX2RlY29kZXJfc2VsZWN0PSJoMjYzX2RlY29kZXIiCiBtc21wZWc0djNfZW5jb2Rlcl9zZWxlY3Q9ImgyNjNfZW5jb2RlciIKLW1zczJfZGVjb2Rlcl9zZWxlY3Q9InZjMV9kZWNvZGVyIgorbXNzMl9kZWNvZGVyX3NlbGVjdD0ibXBlZ3ZpZGVvIHFwZWxkc3AgdmMxX2RlY29kZXIiCiBtdHMyX2RlY29kZXJfc2VsZWN0PSJtc3MzNGRzcCIKIG14cGVnX2RlY29kZXJfc2VsZWN0PSJtanBlZ19kZWNvZGVyIgogbmVsbHltb3Nlcl9kZWNvZGVyX3NlbGVjdD0ibWRjdCBzaW5ld2luIgpAQCAtMjM4NSw5ICsyNjg5LDExIEBACiBudXZfZGVjb2Rlcl9zZWxlY3Q9ImlkY3Rkc3AgbHpvIgogb24yYXZjX2RlY29kZXJfc2VsZWN0PSJtZGN0Igogb3B1c19kZWNvZGVyX2RlcHM9InN3cmVzYW1wbGUiCi1vcHVzX2RlY29kZXJfc2VsZWN0PSJpbWRjdDE1IgotcG5nX2RlY29kZXJfc2VsZWN0PSJ6bGliIgotcG5nX2VuY29kZXJfc2VsZWN0PSJodWZmeXV2ZW5jZHNwIHpsaWIiCitvcHVzX2RlY29kZXJfc2VsZWN0PSJtZGN0MTUiCitvcHVzX2VuY29kZXJfc2VsZWN0PSJhdWRpb19mcmFtZV9xdWV1ZSBtZGN0MTUiCitwbmdfZGVjb2Rlcl9kZXBzPSJ6bGliIgorcG5nX2VuY29kZXJfZGVwcz0iemxpYiIKK3BuZ19lbmNvZGVyX3NlbGVjdD0ibGx2aWRlbmNkc3AiCiBwcm9yZXNfZGVjb2Rlcl9zZWxlY3Q9ImJsb2NrZHNwIGlkY3Rkc3AiCiBwcm9yZXNfZW5jb2Rlcl9zZWxlY3Q9ImZkY3Rkc3AiCiBxY2VscF9kZWNvZGVyX3NlbGVjdD0ibHNwIgpAQCAtMjM5Niw3ICsyNzAyLDcgQEAKIHJhXzE0NF9lbmNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUgbHBjIGF1ZGlvZHNwIgogcmFsZl9kZWNvZGVyX3NlbGVjdD0iZ29sb21iIgogcmF3dmlkZW9fZGVjb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIgotcnNjY19kZWNvZGVyX3NlbGVjdD0iemxpYiIKK3JzY2NfZGVjb2Rlcl9kZXBzPSJ6bGliIgogcnRqcGVnX2RlY29kZXJfc2VsZWN0PSJtZV9jbXAiCiBydjEwX2RlY29kZXJfc2VsZWN0PSJoMjYzX2RlY29kZXIiCiBydjEwX2VuY29kZXJfc2VsZWN0PSJoMjYzX2VuY29kZXIiCkBAIC0yNDA0LDggKzI3MTAsOCBAQAogcnYyMF9lbmNvZGVyX3NlbGVjdD0iaDI2M19lbmNvZGVyIgogcnYzMF9kZWNvZGVyX3NlbGVjdD0iZ29sb21iIGgyNjRwcmVkIGgyNjRxcGVsIG1wZWd2aWRlbyBydjM0ZHNwIgogcnY0MF9kZWNvZGVyX3NlbGVjdD0iZ29sb21iIGgyNjRwcmVkIGgyNjRxcGVsIG1wZWd2aWRlbyBydjM0ZHNwIgotc2NyZWVucHJlc3NvX2RlY29kZXJfc2VsZWN0PSJ6bGliIgotc2hvcnRlbl9kZWNvZGVyX3NlbGVjdD0iZ29sb21iIgorc2NyZWVucHJlc3NvX2RlY29kZXJfZGVwcz0iemxpYiIKK3Nob3J0ZW5fZGVjb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIgogc2lwcl9kZWNvZGVyX3NlbGVjdD0ibHNwIgogc25vd19kZWNvZGVyX3NlbGVjdD0iZHd0IGgyNjRxcGVsIGhwZWxkc3AgbWVfY21wIHJhbmdlY29kZXIgdmlkZW9kc3AiCiBzbm93X2VuY29kZXJfc2VsZWN0PSJhYW5kY3R0YWJsZXMgZHd0IGgyNjRxcGVsIGhwZWxkc3AgbWVfY21wIG1wZWd2aWRlb2VuYyByYW5nZWNvZGVyIgpAQCAtMjQxMywzMSArMjcxOSwzMiBAQAogc29uaWNfZW5jb2Rlcl9zZWxlY3Q9ImdvbG9tYiByYW5nZWNvZGVyIgogc29uaWNfbHNfZW5jb2Rlcl9zZWxlY3Q9ImdvbG9tYiByYW5nZWNvZGVyIgogc3A1eF9kZWNvZGVyX3NlbGVjdD0ibWpwZWdfZGVjb2RlciIKK3NyZ2NfZGVjb2Rlcl9kZXBzPSJ6bGliIgogc3ZxMV9kZWNvZGVyX3NlbGVjdD0iaHBlbGRzcCIKIHN2cTFfZW5jb2Rlcl9zZWxlY3Q9ImFhbmRjdHRhYmxlcyBocGVsZHNwIG1lX2NtcCBtcGVndmlkZW9lbmMiCi1zdnEzX2RlY29kZXJfc2VsZWN0PSJoMjY0X2RlY29kZXIgaHBlbGRzcCB0cGVsZHNwIgorc3ZxM19kZWNvZGVyX3NlbGVjdD0iZ29sb21iIGgyNjRkc3AgaDI2NHBhcnNlIGgyNjRwcmVkIGhwZWxkc3AgdHBlbGRzcCB2aWRlb2RzcCIKIHN2cTNfZGVjb2Rlcl9zdWdnZXN0PSJ6bGliIgogdGFrX2RlY29kZXJfc2VsZWN0PSJhdWRpb2RzcCIKLXRkc2NfZGVjb2Rlcl9zZWxlY3Q9InpsaWIgbWpwZWdfZGVjb2RlciIKK3Rkc2NfZGVjb2Rlcl9kZXBzPSJ6bGliIgordGRzY19kZWNvZGVyX3NlbGVjdD0ibWpwZWdfZGVjb2RlciIKIHRoZW9yYV9kZWNvZGVyX3NlbGVjdD0idnAzX2RlY29kZXIiCiB0aHBfZGVjb2Rlcl9zZWxlY3Q9Im1qcGVnX2RlY29kZXIiCiB0aWZmX2RlY29kZXJfc3VnZ2VzdD0iemxpYiBsem1hIgogdGlmZl9lbmNvZGVyX3N1Z2dlc3Q9InpsaWIiCiB0cnVlaGRfZGVjb2Rlcl9zZWxlY3Q9Im1scF9wYXJzZXIiCit0cnVlaGRfZW5jb2Rlcl9zZWxlY3Q9ImxwYyIKIHRydWVtb3Rpb24yX2RlY29kZXJfc2VsZWN0PSJic3dhcGRzcCIKIHRydWVzcGVlY2hfZGVjb2Rlcl9zZWxlY3Q9ImJzd2FwZHNwIgotdHNjY19kZWNvZGVyX3NlbGVjdD0iemxpYiIKK3RzY2NfZGVjb2Rlcl9kZXBzPSJ6bGliIgogdHdpbnZxX2RlY29kZXJfc2VsZWN0PSJtZGN0IGxzcCBzaW5ld2luIgogdHhkX2RlY29kZXJfc2VsZWN0PSJ0ZXh0dXJlZHNwIgotdXR2aWRlb19kZWNvZGVyX3NlbGVjdD0iYnN3YXBkc3AiCi11dHZpZGVvX2VuY29kZXJfc2VsZWN0PSJic3dhcGRzcCBodWZmbWFuIGh1ZmZ5dXZlbmNkc3AiCi12YmxlX2RlY29kZXJfc2VsZWN0PSJodWZmeXV2ZHNwIgotdmMxX2RlY29kZXJfc2VsZWN0PSJibG9ja2RzcCBoMjYzX2RlY29kZXIgaDI2NHFwZWwgaW50cmF4OCBxcGVsZHNwIHN0YXJ0Y29kZSIKLXZjMV9xc3ZfZGVjb2Rlcl9kZXBzPSJsaWJtZngiCi12YzFfcXN2X2RlY29kZXJfc2VsZWN0PSJxc3ZkZWMgdmMxX3Fzdl9od2FjY2VsIgordXR2aWRlb19kZWNvZGVyX3NlbGVjdD0iYnN3YXBkc3AgbGx2aWRkc3AiCit1dHZpZGVvX2VuY29kZXJfc2VsZWN0PSJic3dhcGRzcCBodWZmbWFuIGxsdmlkZW5jZHNwIgordmJsZV9kZWNvZGVyX3NlbGVjdD0ibGx2aWRkc3AiCit2YzFfZGVjb2Rlcl9zZWxlY3Q9ImJsb2NrZHNwIGgyNjNfZGVjb2RlciBoMjY0cXBlbCBpbnRyYXg4IG1wZWd2aWRlbyB2YzFkc3AiCiB2YzFpbWFnZV9kZWNvZGVyX3NlbGVjdD0idmMxX2RlY29kZXIiCiB2b3JiaXNfZGVjb2Rlcl9zZWxlY3Q9Im1kY3QiCi12b3JiaXNfZW5jb2Rlcl9zZWxlY3Q9Im1kY3QiCit2b3JiaXNfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIG1kY3QiCiB2cDNfZGVjb2Rlcl9zZWxlY3Q9ImhwZWxkc3AgdnAzZHNwIHZpZGVvZHNwIgogdnA1X2RlY29kZXJfc2VsZWN0PSJoMjY0Y2hyb21hIGhwZWxkc3AgdmlkZW9kc3AgdnAzZHNwIHZwNTZkc3AiCiB2cDZfZGVjb2Rlcl9zZWxlY3Q9ImgyNjRjaHJvbWEgaHBlbGRzcCBodWZmbWFuIHZpZGVvZHNwIHZwM2RzcCB2cDU2ZHNwIgpAQCAtMjQ0NSw3ICsyNzUyLDcgQEAKIHZwNmZfZGVjb2Rlcl9zZWxlY3Q9InZwNl9kZWNvZGVyIgogdnA3X2RlY29kZXJfc2VsZWN0PSJoMjY0cHJlZCB2aWRlb2RzcCB2cDhkc3AiCiB2cDhfZGVjb2Rlcl9zZWxlY3Q9ImgyNjRwcmVkIHZpZGVvZHNwIHZwOGRzcCIKLXZwOV9kZWNvZGVyX3NlbGVjdD0idmlkZW9kc3AgdnA5X3BhcnNlciIKK3ZwOV9kZWNvZGVyX3NlbGVjdD0idmlkZW9kc3AgdnA5X3BhcnNlciB2cDlfc3VwZXJmcmFtZV9zcGxpdF9ic2YiCiB3ZWJwX2RlY29kZXJfc2VsZWN0PSJ2cDhfZGVjb2RlciBleGlmIgogd21hbG9zc2xlc3NfZGVjb2Rlcl9zZWxlY3Q9ImxsYXVkZHNwIgogd21hcHJvX2RlY29kZXJfc2VsZWN0PSJtZGN0IHNpbmV3aW4gd21hX2ZyZXFzIgpAQCAtMjQ1Niw4OCArMjc2Myw4NCBAQAogd21hdm9pY2VfZGVjb2Rlcl9zZWxlY3Q9ImxzcCByZGZ0IGRjdCBtZGN0IHNpbmV3aW4iCiB3bXYxX2RlY29kZXJfc2VsZWN0PSJoMjYzX2RlY29kZXIiCiB3bXYxX2VuY29kZXJfc2VsZWN0PSJoMjYzX2VuY29kZXIiCi13bXYyX2RlY29kZXJfc2VsZWN0PSJibG9ja2RzcCBoMjYzX2RlY29kZXIgaWRjdGRzcCBpbnRyYXg4IHZpZGVvZHNwIHdtdjJkc3AiCit3bXYyX2RlY29kZXJfc2VsZWN0PSJibG9ja2RzcCBlcnJvcl9yZXNpbGllbmNlIGgyNjNfZGVjb2RlciBpZGN0ZHNwIGludHJheDggdmlkZW9kc3Agd212MmRzcCIKIHdtdjJfZW5jb2Rlcl9zZWxlY3Q9ImgyNjNfZW5jb2RlciB3bXYyZHNwIgogd212M19kZWNvZGVyX3NlbGVjdD0idmMxX2RlY29kZXIiCiB3bXYzaW1hZ2VfZGVjb2Rlcl9zZWxlY3Q9IndtdjNfZGVjb2RlciIKIHhtYTFfZGVjb2Rlcl9zZWxlY3Q9IndtYXByb19kZWNvZGVyIgogeG1hMl9kZWNvZGVyX3NlbGVjdD0id21hcHJvX2RlY29kZXIiCi16ZXJvY29kZWNfZGVjb2Rlcl9zZWxlY3Q9InpsaWIiCi16bGliX2RlY29kZXJfc2VsZWN0PSJ6bGliIgotemxpYl9lbmNvZGVyX3NlbGVjdD0iemxpYiIKLXptYnZfZGVjb2Rlcl9zZWxlY3Q9InpsaWIiCi16bWJ2X2VuY29kZXJfc2VsZWN0PSJ6bGliIgoremVyb2NvZGVjX2RlY29kZXJfZGVwcz0iemxpYiIKK3psaWJfZGVjb2Rlcl9kZXBzPSJ6bGliIgoremxpYl9lbmNvZGVyX2RlcHM9InpsaWIiCit6bWJ2X2RlY29kZXJfZGVwcz0iemxpYiIKK3ptYnZfZW5jb2Rlcl9kZXBzPSJ6bGliIgogCiAjIGhhcmR3YXJlIGFjY2VsZXJhdG9ycwogY3J5c3RhbGhkX2RlcHM9ImxpYmNyeXN0YWxoZF9saWJjcnlzdGFsaGRfaWZfaCIKLWQzZDExdmFfZGVwcz0iZDNkMTFfaCBkeHZhX2ggSUQzRDExVmlkZW9EZWNvZGVyIElEM0QxMVZpZGVvQ29udGV4dCIKLWR4dmEyX2RlcHM9ImR4dmEyYXBpX2ggRFhWQTJfQ29uZmlnUGljdHVyZURlY29kZSIKLXZhYXBpX2RlcHM9InZhX3ZhX2giCi12ZGFfZGVwcz0iVmlkZW9EZWNvZGVBY2NlbGVyYXRpb25fVkRBRGVjb2Rlcl9oIHB0aHJlYWRzIgotdmRhX2V4dHJhbGlicz0iLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbiAtZnJhbWV3b3JrIFZpZGVvRGVjb2RlQWNjZWxlcmF0aW9uIC1mcmFtZXdvcmsgUXVhcnR6Q29yZSIKLXZkcGF1X2RlcHM9InZkcGF1X3ZkcGF1X2ggdmRwYXVfdmRwYXVfeDExX2giCi12aWRlb3Rvb2xib3hfZGVwcz0iVmlkZW9Ub29sYm94X1ZpZGVvVG9vbGJveF9oIHB0aHJlYWRzIgotdmlkZW90b29sYm94X2V4dHJhbGlicz0iLWZyYW1ld29yayBDb3JlRm91bmRhdGlvbiAtZnJhbWV3b3JrIFZpZGVvVG9vbGJveCAtZnJhbWV3b3JrIENvcmVNZWRpYSAtZnJhbWV3b3JrIFF1YXJ0ekNvcmUgLWZyYW1ld29yayBDb3JlVmlkZW8iCitjdWRhX2RlcHM9ImZmbnZjb2RlYyIKK2N1dmlkX2RlcHM9ImZmbnZjb2RlYyIKK2QzZDExdmFfZGVwcz0iZHh2YV9oIElEM0QxMVZpZGVvRGVjb2RlciBJRDNEMTFWaWRlb0NvbnRleHQiCitkeHZhMl9kZXBzPSJkeHZhMmFwaV9oIERYVkEyX0NvbmZpZ1BpY3R1cmVEZWNvZGUgb2xlMzIgdXNlcjMyIgorZmZudmNvZGVjX2RlcHNfYW55PSJsaWJkbCBMb2FkTGlicmFyeSIKK252ZGVjX2RlcHM9ImZmbnZjb2RlYyIKK3ZpZGVvdG9vbGJveF9od2FjY2VsX2RlcHM9InZpZGVvdG9vbGJveCBwdGhyZWFkcyIKK3ZpZGVvdG9vbGJveF9od2FjY2VsX2V4dHJhbGlicz0iLWZyYW1ld29yayBRdWFydHpDb3JlIgogeHZtY19kZXBzPSJYMTFfZXh0ZW5zaW9uc19Ydk1DbGliX2giCiAKIGgyNjNfdmFhcGlfaHdhY2NlbF9kZXBzPSJ2YWFwaSIKIGgyNjNfdmFhcGlfaHdhY2NlbF9zZWxlY3Q9ImgyNjNfZGVjb2RlciIKIGgyNjNfdmlkZW90b29sYm94X2h3YWNjZWxfZGVwcz0idmlkZW90b29sYm94IgogaDI2M192aWRlb3Rvb2xib3hfaHdhY2NlbF9zZWxlY3Q9ImgyNjNfZGVjb2RlciIKLWgyNjRfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQgaDI2NF9tcDR0b2FubmV4Yl9ic2YgaDI2NF9wYXJzZXIiCiBoMjY0X2QzZDExdmFfaHdhY2NlbF9kZXBzPSJkM2QxMXZhIgogaDI2NF9kM2QxMXZhX2h3YWNjZWxfc2VsZWN0PSJoMjY0X2RlY29kZXIiCitoMjY0X2QzZDExdmEyX2h3YWNjZWxfZGVwcz0iZDNkMTF2YSIKK2gyNjRfZDNkMTF2YTJfaHdhY2NlbF9zZWxlY3Q9ImgyNjRfZGVjb2RlciIKIGgyNjRfZHh2YTJfaHdhY2NlbF9kZXBzPSJkeHZhMiIKIGgyNjRfZHh2YTJfaHdhY2NlbF9zZWxlY3Q9ImgyNjRfZGVjb2RlciIKLWgyNjRfbW1hbF9kZWNvZGVyX2RlcHM9Im1tYWwiCi1oMjY0X21tYWxfZGVjb2Rlcl9zZWxlY3Q9Im1tYWwiCi1oMjY0X21tYWxfaHdhY2NlbF9kZXBzPSJtbWFsIgotaDI2NF9xc3ZfaHdhY2NlbF9kZXBzPSJsaWJtZngiCitoMjY0X252ZGVjX2h3YWNjZWxfZGVwcz0ibnZkZWMiCitoMjY0X252ZGVjX2h3YWNjZWxfc2VsZWN0PSJoMjY0X2RlY29kZXIiCiBoMjY0X3ZhYXBpX2h3YWNjZWxfZGVwcz0idmFhcGkiCiBoMjY0X3ZhYXBpX2h3YWNjZWxfc2VsZWN0PSJoMjY0X2RlY29kZXIiCi1oMjY0X3ZkYV9kZWNvZGVyX2RlcHM9InZkYSIKLWgyNjRfdmRhX2RlY29kZXJfc2VsZWN0PSJoMjY0X2RlY29kZXIiCi1oMjY0X3ZkYV9od2FjY2VsX2RlcHM9InZkYSIKLWgyNjRfdmRhX2h3YWNjZWxfc2VsZWN0PSJoMjY0X2RlY29kZXIiCi1oMjY0X3ZkYV9vbGRfaHdhY2NlbF9kZXBzPSJ2ZGEiCi1oMjY0X3ZkYV9vbGRfaHdhY2NlbF9zZWxlY3Q9ImgyNjRfZGVjb2RlciIKLWgyNjRfdmRwYXVfZGVjb2Rlcl9kZXBzPSJ2ZHBhdSIKLWgyNjRfdmRwYXVfZGVjb2Rlcl9zZWxlY3Q9ImgyNjRfZGVjb2RlciIKIGgyNjRfdmRwYXVfaHdhY2NlbF9kZXBzPSJ2ZHBhdSIKIGgyNjRfdmRwYXVfaHdhY2NlbF9zZWxlY3Q9ImgyNjRfZGVjb2RlciIKIGgyNjRfdmlkZW90b29sYm94X2h3YWNjZWxfZGVwcz0idmlkZW90b29sYm94IgogaDI2NF92aWRlb3Rvb2xib3hfaHdhY2NlbF9zZWxlY3Q9ImgyNjRfZGVjb2RlciIKIGhldmNfZDNkMTF2YV9od2FjY2VsX2RlcHM9ImQzZDExdmEgRFhWQV9QaWNQYXJhbXNfSEVWQyIKIGhldmNfZDNkMTF2YV9od2FjY2VsX3NlbGVjdD0iaGV2Y19kZWNvZGVyIgoraGV2Y19kM2QxMXZhMl9od2FjY2VsX2RlcHM9ImQzZDExdmEgRFhWQV9QaWNQYXJhbXNfSEVWQyIKK2hldmNfZDNkMTF2YTJfaHdhY2NlbF9zZWxlY3Q9ImhldmNfZGVjb2RlciIKIGhldmNfZHh2YTJfaHdhY2NlbF9kZXBzPSJkeHZhMiBEWFZBX1BpY1BhcmFtc19IRVZDIgogaGV2Y19keHZhMl9od2FjY2VsX3NlbGVjdD0iaGV2Y19kZWNvZGVyIgotaGV2Y19xc3ZfaHdhY2NlbF9kZXBzPSJsaWJtZngiCitoZXZjX252ZGVjX2h3YWNjZWxfZGVwcz0ibnZkZWMiCitoZXZjX252ZGVjX2h3YWNjZWxfc2VsZWN0PSJoZXZjX2RlY29kZXIiCiBoZXZjX3ZhYXBpX2h3YWNjZWxfZGVwcz0idmFhcGkgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySEVWQyIKIGhldmNfdmFhcGlfaHdhY2NlbF9zZWxlY3Q9ImhldmNfZGVjb2RlciIKIGhldmNfdmRwYXVfaHdhY2NlbF9kZXBzPSJ2ZHBhdSBWZHBQaWN0dXJlSW5mb0hFVkMiCiBoZXZjX3ZkcGF1X2h3YWNjZWxfc2VsZWN0PSJoZXZjX2RlY29kZXIiCi1tcGVnX3ZkcGF1X2RlY29kZXJfZGVwcz0idmRwYXUiCi1tcGVnX3ZkcGF1X2RlY29kZXJfc2VsZWN0PSJtcGVnMnZpZGVvX2RlY29kZXIiCitoZXZjX3ZpZGVvdG9vbGJveF9od2FjY2VsX2RlcHM9InZpZGVvdG9vbGJveCIKK2hldmNfdmlkZW90b29sYm94X2h3YWNjZWxfc2VsZWN0PSJoZXZjX2RlY29kZXIiCittanBlZ19udmRlY19od2FjY2VsX2RlcHM9Im52ZGVjIgorbWpwZWdfbnZkZWNfaHdhY2NlbF9zZWxlY3Q9Im1qcGVnX2RlY29kZXIiCittanBlZ192YWFwaV9od2FjY2VsX2RlcHM9InZhYXBpIgorbWpwZWdfdmFhcGlfaHdhY2NlbF9zZWxlY3Q9Im1qcGVnX2RlY29kZXIiCiBtcGVnX3h2bWNfaHdhY2NlbF9kZXBzPSJ4dm1jIgogbXBlZ194dm1jX2h3YWNjZWxfc2VsZWN0PSJtcGVnMnZpZGVvX2RlY29kZXIiCi1tcGVnMV92ZHBhdV9kZWNvZGVyX2RlcHM9InZkcGF1IgotbXBlZzFfdmRwYXVfZGVjb2Rlcl9zZWxlY3Q9Im1wZWcxdmlkZW9fZGVjb2RlciIKK21wZWcxX252ZGVjX2h3YWNjZWxfZGVwcz0ibnZkZWMiCittcGVnMV9udmRlY19od2FjY2VsX3NlbGVjdD0ibXBlZzF2aWRlb19kZWNvZGVyIgogbXBlZzFfdmRwYXVfaHdhY2NlbF9kZXBzPSJ2ZHBhdSIKIG1wZWcxX3ZkcGF1X2h3YWNjZWxfc2VsZWN0PSJtcGVnMXZpZGVvX2RlY29kZXIiCiBtcGVnMV92aWRlb3Rvb2xib3hfaHdhY2NlbF9kZXBzPSJ2aWRlb3Rvb2xib3giCiBtcGVnMV92aWRlb3Rvb2xib3hfaHdhY2NlbF9zZWxlY3Q9Im1wZWcxdmlkZW9fZGVjb2RlciIKIG1wZWcxX3h2bWNfaHdhY2NlbF9kZXBzPSJ4dm1jIgogbXBlZzFfeHZtY19od2FjY2VsX3NlbGVjdD0ibXBlZzF2aWRlb19kZWNvZGVyIgotbXBlZzJfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCiBtcGVnMl9kM2QxMXZhX2h3YWNjZWxfZGVwcz0iZDNkMTF2YSIKIG1wZWcyX2QzZDExdmFfaHdhY2NlbF9zZWxlY3Q9Im1wZWcydmlkZW9fZGVjb2RlciIKK21wZWcyX2QzZDExdmEyX2h3YWNjZWxfZGVwcz0iZDNkMTF2YSIKK21wZWcyX2QzZDExdmEyX2h3YWNjZWxfc2VsZWN0PSJtcGVnMnZpZGVvX2RlY29kZXIiCiBtcGVnMl9keHZhMl9od2FjY2VsX2RlcHM9ImR4dmEyIgogbXBlZzJfZHh2YTJfaHdhY2NlbF9zZWxlY3Q9Im1wZWcydmlkZW9fZGVjb2RlciIKLW1wZWcyX21tYWxfZGVjb2Rlcl9kZXBzPSJtbWFsIgotbXBlZzJfbW1hbF9kZWNvZGVyX3NlbGVjdD0ibW1hbCIKLW1wZWcyX21tYWxfaHdhY2NlbF9kZXBzPSJtbWFsIgotbXBlZzJfcXN2X2h3YWNjZWxfZGVwcz0ibGlibWZ4IgotbXBlZzJfcXN2X2h3YWNjZWxfc2VsZWN0PSJxc3ZkZWNfbXBlZzIiCittcGVnMl9udmRlY19od2FjY2VsX2RlcHM9Im52ZGVjIgorbXBlZzJfbnZkZWNfaHdhY2NlbF9zZWxlY3Q9Im1wZWcydmlkZW9fZGVjb2RlciIKIG1wZWcyX3ZhYXBpX2h3YWNjZWxfZGVwcz0idmFhcGkiCiBtcGVnMl92YWFwaV9od2FjY2VsX3NlbGVjdD0ibXBlZzJ2aWRlb19kZWNvZGVyIgogbXBlZzJfdmRwYXVfaHdhY2NlbF9kZXBzPSJ2ZHBhdSIKQEAgLTI1NDYsNjQgKzI4NDksMjEzIEBACiBtcGVnMl92aWRlb3Rvb2xib3hfaHdhY2NlbF9zZWxlY3Q9Im1wZWcydmlkZW9fZGVjb2RlciIKIG1wZWcyX3h2bWNfaHdhY2NlbF9kZXBzPSJ4dm1jIgogbXBlZzJfeHZtY19od2FjY2VsX3NlbGVjdD0ibXBlZzJ2aWRlb19kZWNvZGVyIgotbXBlZzRfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCi1tcGVnNF9tbWFsX2RlY29kZXJfZGVwcz0ibW1hbCIKLW1wZWc0X21tYWxfZGVjb2Rlcl9zZWxlY3Q9Im1tYWwiCi1tcGVnNF9tbWFsX2h3YWNjZWxfZGVwcz0ibW1hbCIKK21wZWc0X252ZGVjX2h3YWNjZWxfZGVwcz0ibnZkZWMiCittcGVnNF9udmRlY19od2FjY2VsX3NlbGVjdD0ibXBlZzRfZGVjb2RlciIKIG1wZWc0X3ZhYXBpX2h3YWNjZWxfZGVwcz0idmFhcGkiCiBtcGVnNF92YWFwaV9od2FjY2VsX3NlbGVjdD0ibXBlZzRfZGVjb2RlciIKLW1wZWc0X3ZkcGF1X2RlY29kZXJfZGVwcz0idmRwYXUiCi1tcGVnNF92ZHBhdV9kZWNvZGVyX3NlbGVjdD0ibXBlZzRfZGVjb2RlciIKIG1wZWc0X3ZkcGF1X2h3YWNjZWxfZGVwcz0idmRwYXUiCiBtcGVnNF92ZHBhdV9od2FjY2VsX3NlbGVjdD0ibXBlZzRfZGVjb2RlciIKIG1wZWc0X3ZpZGVvdG9vbGJveF9od2FjY2VsX2RlcHM9InZpZGVvdG9vbGJveCIKIG1wZWc0X3ZpZGVvdG9vbGJveF9od2FjY2VsX3NlbGVjdD0ibXBlZzRfZGVjb2RlciIKLW1zbXBlZzRfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCi12YzFfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCiB2YzFfZDNkMTF2YV9od2FjY2VsX2RlcHM9ImQzZDExdmEiCiB2YzFfZDNkMTF2YV9od2FjY2VsX3NlbGVjdD0idmMxX2RlY29kZXIiCit2YzFfZDNkMTF2YTJfaHdhY2NlbF9kZXBzPSJkM2QxMXZhIgordmMxX2QzZDExdmEyX2h3YWNjZWxfc2VsZWN0PSJ2YzFfZGVjb2RlciIKIHZjMV9keHZhMl9od2FjY2VsX2RlcHM9ImR4dmEyIgogdmMxX2R4dmEyX2h3YWNjZWxfc2VsZWN0PSJ2YzFfZGVjb2RlciIKLXZjMV9tbWFsX2RlY29kZXJfZGVwcz0ibW1hbCIKLXZjMV9tbWFsX2RlY29kZXJfc2VsZWN0PSJtbWFsIgotdmMxX21tYWxfaHdhY2NlbF9kZXBzPSJtbWFsIgotdmMxX3Fzdl9od2FjY2VsX2RlcHM9ImxpYm1meCIKLXZjMV9xc3ZfaHdhY2NlbF9zZWxlY3Q9InFzdmRlY192YzEiCit2YzFfbnZkZWNfaHdhY2NlbF9kZXBzPSJudmRlYyIKK3ZjMV9udmRlY19od2FjY2VsX3NlbGVjdD0idmMxX2RlY29kZXIiCiB2YzFfdmFhcGlfaHdhY2NlbF9kZXBzPSJ2YWFwaSIKIHZjMV92YWFwaV9od2FjY2VsX3NlbGVjdD0idmMxX2RlY29kZXIiCi12YzFfdmRwYXVfZGVjb2Rlcl9kZXBzPSJ2ZHBhdSIKLXZjMV92ZHBhdV9kZWNvZGVyX3NlbGVjdD0idmMxX2RlY29kZXIiCiB2YzFfdmRwYXVfaHdhY2NlbF9kZXBzPSJ2ZHBhdSIKIHZjMV92ZHBhdV9od2FjY2VsX3NlbGVjdD0idmMxX2RlY29kZXIiCit2cDhfbnZkZWNfaHdhY2NlbF9kZXBzPSJudmRlYyIKK3ZwOF9udmRlY19od2FjY2VsX3NlbGVjdD0idnA4X2RlY29kZXIiCit2cDhfdmFhcGlfaHdhY2NlbF9kZXBzPSJ2YWFwaSBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDgiCit2cDhfdmFhcGlfaHdhY2NlbF9zZWxlY3Q9InZwOF9kZWNvZGVyIgogdnA5X2QzZDExdmFfaHdhY2NlbF9kZXBzPSJkM2QxMXZhIERYVkFfUGljUGFyYW1zX1ZQOSIKIHZwOV9kM2QxMXZhX2h3YWNjZWxfc2VsZWN0PSJ2cDlfZGVjb2RlciIKK3ZwOV9kM2QxMXZhMl9od2FjY2VsX2RlcHM9ImQzZDExdmEgRFhWQV9QaWNQYXJhbXNfVlA5IgordnA5X2QzZDExdmEyX2h3YWNjZWxfc2VsZWN0PSJ2cDlfZGVjb2RlciIKIHZwOV9keHZhMl9od2FjY2VsX2RlcHM9ImR4dmEyIERYVkFfUGljUGFyYW1zX1ZQOSIKIHZwOV9keHZhMl9od2FjY2VsX3NlbGVjdD0idnA5X2RlY29kZXIiCi12cDlfdmFhcGlfaHdhY2NlbF9kZXBzPSJ2YWFwaSBWQURlY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDkiCit2cDlfbnZkZWNfaHdhY2NlbF9kZXBzPSJudmRlYyIKK3ZwOV9udmRlY19od2FjY2VsX3NlbGVjdD0idnA5X2RlY29kZXIiCit2cDlfdmFhcGlfaHdhY2NlbF9kZXBzPSJ2YWFwaSBWQURlY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDlfYml0X2RlcHRoIgogdnA5X3ZhYXBpX2h3YWNjZWxfc2VsZWN0PSJ2cDlfZGVjb2RlciIKLXdtdjNfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCiB3bXYzX2QzZDExdmFfaHdhY2NlbF9zZWxlY3Q9InZjMV9kM2QxMXZhX2h3YWNjZWwiCit3bXYzX2QzZDExdmEyX2h3YWNjZWxfc2VsZWN0PSJ2YzFfZDNkMTF2YTJfaHdhY2NlbCIKIHdtdjNfZHh2YTJfaHdhY2NlbF9zZWxlY3Q9InZjMV9keHZhMl9od2FjY2VsIgord212M19udmRlY19od2FjY2VsX3NlbGVjdD0idmMxX252ZGVjX2h3YWNjZWwiCiB3bXYzX3ZhYXBpX2h3YWNjZWxfc2VsZWN0PSJ2YzFfdmFhcGlfaHdhY2NlbCIKLXdtdjNfdmRwYXVfZGVjb2Rlcl9zZWxlY3Q9InZjMV92ZHBhdV9kZWNvZGVyIgogd212M192ZHBhdV9od2FjY2VsX3NlbGVjdD0idmMxX3ZkcGF1X2h3YWNjZWwiCiAKKyMgaGFyZHdhcmUtYWNjZWxlcmF0ZWQgY29kZWNzCitvbXhfZGVwcz0ibGliZGwgcHRocmVhZHMiCitvbXhfcnBpX3NlbGVjdD0ib214IgorcXN2X2RlcHM9ImxpYm1meCIKK3FzdmRlY19zZWxlY3Q9InFzdiIKK3FzdmVuY19zZWxlY3Q9InFzdiIKK3FzdnZwcF9zZWxlY3Q9InFzdiIKK3ZhYXBpX2VuY29kZV9kZXBzPSJ2YWFwaSIKK3Y0bDJfbTJtX2RlcHNfYW55PSJsaW51eF92aWRlb2RldjJfaCIKKworaHd1cGxvYWRfY3VkYV9maWx0ZXJfZGVwcz0iZmZudmNvZGVjIgorc2NhbGVfbnBwX2ZpbHRlcl9kZXBzPSJmZm52Y29kZWMgbGlibnBwIgorc2NhbGVfY3VkYV9maWx0ZXJfZGVwcz0iY3VkYV9zZGsiCit0aHVtYm5haWxfY3VkYV9maWx0ZXJfZGVwcz0iY3VkYV9zZGsiCisKK2FtZl9kZXBzX2FueT0ibGliZGwgTG9hZExpYnJhcnkiCitudmVuY19kZXBzPSJmZm52Y29kZWMiCitudmVuY19kZXBzX2FueT0ibGliZGwgTG9hZExpYnJhcnkiCitudmVuY19lbmNvZGVyX2RlcHM9Im52ZW5jIgorCitoMjYzX3Y0bDJtMm1fZGVjb2Rlcl9kZXBzPSJ2NGwyX20ybSBoMjYzX3Y0bDJfbTJtIgoraDI2M192NGwybTJtX2VuY29kZXJfZGVwcz0idjRsMl9tMm0gaDI2M192NGwyX20ybSIKK2gyNjRfYW1mX2VuY29kZXJfZGVwcz0iYW1mIgoraDI2NF9jcnlzdGFsaGRfZGVjb2Rlcl9zZWxlY3Q9ImNyeXN0YWxoZCBoMjY0X21wNHRvYW5uZXhiX2JzZiBoMjY0X3BhcnNlciIKK2gyNjRfY3V2aWRfZGVjb2Rlcl9kZXBzPSJjdXZpZCIKK2gyNjRfY3V2aWRfZGVjb2Rlcl9zZWxlY3Q9ImgyNjRfbXA0dG9hbm5leGJfYnNmIgoraDI2NF9tZWRpYWNvZGVjX2RlY29kZXJfZGVwcz0ibWVkaWFjb2RlYyIKK2gyNjRfbWVkaWFjb2RlY19kZWNvZGVyX3NlbGVjdD0iaDI2NF9tcDR0b2FubmV4Yl9ic2YgaDI2NF9wYXJzZXIiCitoMjY0X21tYWxfZGVjb2Rlcl9kZXBzPSJtbWFsIgoraDI2NF9udmVuY19lbmNvZGVyX2RlcHM9Im52ZW5jIgoraDI2NF9vbXhfZW5jb2Rlcl9kZXBzPSJvbXgiCitoMjY0X3Fzdl9kZWNvZGVyX3NlbGVjdD0iaDI2NF9tcDR0b2FubmV4Yl9ic2YgaDI2NF9wYXJzZXIgcXN2ZGVjIgoraDI2NF9xc3ZfZW5jb2Rlcl9zZWxlY3Q9InFzdmVuYyIKK2gyNjRfcmttcHBfZGVjb2Rlcl9kZXBzPSJya21wcCIKK2gyNjRfcmttcHBfZGVjb2Rlcl9zZWxlY3Q9ImgyNjRfbXA0dG9hbm5leGJfYnNmIgoraDI2NF92YWFwaV9lbmNvZGVyX2RlcHM9IlZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQiCitoMjY0X3ZhYXBpX2VuY29kZXJfc2VsZWN0PSJjYnNfaDI2NCB2YWFwaV9lbmNvZGUiCitoMjY0X3Y0bDJtMm1fZGVjb2Rlcl9kZXBzPSJ2NGwyX20ybSBoMjY0X3Y0bDJfbTJtIgoraDI2NF92NGwybTJtX2VuY29kZXJfZGVwcz0idjRsMl9tMm0gaDI2NF92NGwyX20ybSIKK2hldmNfYW1mX2VuY29kZXJfZGVwcz0iYW1mIgoraGV2Y19jdXZpZF9kZWNvZGVyX2RlcHM9ImN1dmlkIgoraGV2Y19jdXZpZF9kZWNvZGVyX3NlbGVjdD0iaGV2Y19tcDR0b2FubmV4Yl9ic2YiCitoZXZjX21lZGlhY29kZWNfZGVjb2Rlcl9kZXBzPSJtZWRpYWNvZGVjIgoraGV2Y19tZWRpYWNvZGVjX2RlY29kZXJfc2VsZWN0PSJoZXZjX21wNHRvYW5uZXhiX2JzZiBoZXZjX3BhcnNlciIKK2hldmNfbnZlbmNfZW5jb2Rlcl9kZXBzPSJudmVuYyIKK2hldmNfcXN2X2RlY29kZXJfc2VsZWN0PSJoZXZjX21wNHRvYW5uZXhiX2JzZiBoZXZjX3BhcnNlciBxc3ZkZWMiCitoZXZjX3Fzdl9lbmNvZGVyX3NlbGVjdD0iaGV2Y3BhcnNlIHFzdmVuYyIKK2hldmNfcmttcHBfZGVjb2Rlcl9kZXBzPSJya21wcCIKK2hldmNfcmttcHBfZGVjb2Rlcl9zZWxlY3Q9ImhldmNfbXA0dG9hbm5leGJfYnNmIgoraGV2Y192YWFwaV9lbmNvZGVyX2RlcHM9IlZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlckhFVkMiCitoZXZjX3ZhYXBpX2VuY29kZXJfc2VsZWN0PSJjYnNfaDI2NSB2YWFwaV9lbmNvZGUiCitoZXZjX3Y0bDJtMm1fZGVjb2Rlcl9kZXBzPSJ2NGwyX20ybSBoZXZjX3Y0bDJfbTJtIgoraGV2Y192NGwybTJtX2VuY29kZXJfZGVwcz0idjRsMl9tMm0gaGV2Y192NGwyX20ybSIKK21qcGVnX2N1dmlkX2RlY29kZXJfZGVwcz0iY3V2aWQiCittanBlZ19xc3ZfZW5jb2Rlcl9kZXBzPSJsaWJtZngiCittanBlZ19xc3ZfZW5jb2Rlcl9zZWxlY3Q9InFzdmVuYyIKK21qcGVnX3ZhYXBpX2VuY29kZXJfZGVwcz0iVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVySlBFRyIKK21qcGVnX3ZhYXBpX2VuY29kZXJfc2VsZWN0PSJ2YWFwaV9lbmNvZGUganBlZ3RhYmxlcyIKK21wZWcxX2N1dmlkX2RlY29kZXJfZGVwcz0iY3V2aWQiCittcGVnMV92NGwybTJtX2RlY29kZXJfZGVwcz0idjRsMl9tMm0gbXBlZzFfdjRsMl9tMm0iCittcGVnMl9jcnlzdGFsaGRfZGVjb2Rlcl9zZWxlY3Q9ImNyeXN0YWxoZCIKK21wZWcyX2N1dmlkX2RlY29kZXJfZGVwcz0iY3V2aWQiCittcGVnMl9tbWFsX2RlY29kZXJfZGVwcz0ibW1hbCIKK21wZWcyX21lZGlhY29kZWNfZGVjb2Rlcl9kZXBzPSJtZWRpYWNvZGVjIgorbXBlZzJfcXN2X2RlY29kZXJfc2VsZWN0PSJxc3ZkZWMgbXBlZ3ZpZGVvX3BhcnNlciIKK21wZWcyX3Fzdl9lbmNvZGVyX3NlbGVjdD0icXN2ZW5jIgorbXBlZzJfdmFhcGlfZW5jb2Rlcl9kZXBzPSJWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMiIKK21wZWcyX3ZhYXBpX2VuY29kZXJfc2VsZWN0PSJjYnNfbXBlZzIgdmFhcGlfZW5jb2RlIgorbXBlZzJfdjRsMm0ybV9kZWNvZGVyX2RlcHM9InY0bDJfbTJtIG1wZWcyX3Y0bDJfbTJtIgorbXBlZzRfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCittcGVnNF9jdXZpZF9kZWNvZGVyX2RlcHM9ImN1dmlkIgorbXBlZzRfbWVkaWFjb2RlY19kZWNvZGVyX2RlcHM9Im1lZGlhY29kZWMiCittcGVnNF9tbWFsX2RlY29kZXJfZGVwcz0ibW1hbCIKK21wZWc0X29teF9lbmNvZGVyX2RlcHM9Im9teCIKK21wZWc0X3Y0bDJtMm1fZGVjb2Rlcl9kZXBzPSJ2NGwyX20ybSBtcGVnNF92NGwyX20ybSIKK21wZWc0X3Y0bDJtMm1fZW5jb2Rlcl9kZXBzPSJ2NGwyX20ybSBtcGVnNF92NGwyX20ybSIKK21zbXBlZzRfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCitudmVuY19oMjY0X2VuY29kZXJfc2VsZWN0PSJoMjY0X252ZW5jX2VuY29kZXIiCitudmVuY19oZXZjX2VuY29kZXJfc2VsZWN0PSJoZXZjX252ZW5jX2VuY29kZXIiCit2YzFfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCit2YzFfY3V2aWRfZGVjb2Rlcl9kZXBzPSJjdXZpZCIKK3ZjMV9tbWFsX2RlY29kZXJfZGVwcz0ibW1hbCIKK3ZjMV9xc3ZfZGVjb2Rlcl9zZWxlY3Q9InFzdmRlYyB2YzFfcGFyc2VyIgordmMxX3Y0bDJtMm1fZGVjb2Rlcl9kZXBzPSJ2NGwyX20ybSB2YzFfdjRsMl9tMm0iCit2cDhfY3V2aWRfZGVjb2Rlcl9kZXBzPSJjdXZpZCIKK3ZwOF9tZWRpYWNvZGVjX2RlY29kZXJfZGVwcz0ibWVkaWFjb2RlYyIKK3ZwOF9xc3ZfZGVjb2Rlcl9zZWxlY3Q9InFzdmRlYyB2cDhfcGFyc2VyIgordnA4X3JrbXBwX2RlY29kZXJfZGVwcz0icmttcHAiCit2cDhfdmFhcGlfZW5jb2Rlcl9kZXBzPSJWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDgiCit2cDhfdmFhcGlfZW5jb2Rlcl9zZWxlY3Q9InZhYXBpX2VuY29kZSIKK3ZwOF92NGwybTJtX2RlY29kZXJfZGVwcz0idjRsMl9tMm0gdnA4X3Y0bDJfbTJtIgordnA4X3Y0bDJtMm1fZW5jb2Rlcl9kZXBzPSJ2NGwyX20ybSB2cDhfdjRsMl9tMm0iCit2cDlfY3V2aWRfZGVjb2Rlcl9kZXBzPSJjdXZpZCIKK3ZwOV9tZWRpYWNvZGVjX2RlY29kZXJfZGVwcz0ibWVkaWFjb2RlYyIKK3ZwOV9ya21wcF9kZWNvZGVyX2RlcHM9InJrbXBwIgordnA5X3ZhYXBpX2VuY29kZXJfZGVwcz0iVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVlA5IgordnA5X3ZhYXBpX2VuY29kZXJfc2VsZWN0PSJ2YWFwaV9lbmNvZGUiCit2cDlfdjRsMm0ybV9kZWNvZGVyX2RlcHM9InY0bDJfbTJtIHZwOV92NGwyX20ybSIKK3dtdjNfY3J5c3RhbGhkX2RlY29kZXJfc2VsZWN0PSJjcnlzdGFsaGQiCisKICMgcGFyc2VycwotaDI2NF9wYXJzZXJfc2VsZWN0PSJoMjY0X2RlY29kZXIiCi1oZXZjX3BhcnNlcl9zZWxlY3Q9ImdvbG9tYiIKK2FhY19wYXJzZXJfc2VsZWN0PSJhZHRzX2hlYWRlciIKK2gyNjRfcGFyc2VyX3NlbGVjdD0iZ29sb21iIGgyNjRkc3AgaDI2NHBhcnNlIgoraGV2Y19wYXJzZXJfc2VsZWN0PSJoZXZjcGFyc2UiCittcGVnYXVkaW9fcGFyc2VyX3NlbGVjdD0ibXBlZ2F1ZGlvaGVhZGVyIgogbXBlZ3ZpZGVvX3BhcnNlcl9zZWxlY3Q9Im1wZWd2aWRlbyIKIG1wZWc0dmlkZW9fcGFyc2VyX3NlbGVjdD0iaDI2M2RzcCBtcGVndmlkZW8gcXBlbGRzcCIKLXZjMV9wYXJzZXJfc2VsZWN0PSJtcGVndmlkZW8gc3RhcnRjb2RlIHZjMV9kZWNvZGVyIgordmMxX3BhcnNlcl9zZWxlY3Q9InZjMWRzcCIKIAogIyBiaXRzdHJlYW1fZmlsdGVycworYWFjX2FkdHN0b2FzY19ic2Zfc2VsZWN0PSJhZHRzX2hlYWRlciIKK2VhYzNfY29yZV9ic2Zfc2VsZWN0PSJhYzNfcGFyc2VyIgorZmlsdGVyX3VuaXRzX2JzZl9zZWxlY3Q9ImNicyIKK2gyNjRfbWV0YWRhdGFfYnNmX2RlcHM9ImNvbnN0X25hbiIKK2gyNjRfbWV0YWRhdGFfYnNmX3NlbGVjdD0iY2JzX2gyNjQiCitoMjY0X3JlZHVuZGFudF9wcHNfYnNmX3NlbGVjdD0iY2JzX2gyNjQiCitoZXZjX21ldGFkYXRhX2JzZl9zZWxlY3Q9ImNic19oMjY1IgogbWpwZWcyanBlZ19ic2Zfc2VsZWN0PSJqcGVndGFibGVzIgorbXBlZzJfbWV0YWRhdGFfYnNmX3NlbGVjdD0iY2JzX21wZWcyIgordHJhY2VfaGVhZGVyc19ic2Zfc2VsZWN0PSJjYnMiCiAKICMgZXh0ZXJuYWwgbGlicmFyaWVzCithYWNfYXRfZGVjb2Rlcl9kZXBzPSJhdWRpb3Rvb2xib3giCithYWNfYXRfZGVjb2Rlcl9zZWxlY3Q9ImFhY19hZHRzdG9hc2NfYnNmIgorYWMzX2F0X2RlY29kZXJfZGVwcz0iYXVkaW90b29sYm94IgorYWMzX2F0X2RlY29kZXJfc2VsZWN0PSJhYzNfcGFyc2VyIgorYWRwY21faW1hX3F0X2F0X2RlY29kZXJfZGVwcz0iYXVkaW90b29sYm94IgorYWxhY19hdF9kZWNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK2Ftcl9uYl9hdF9kZWNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK2F2aXN5bnRoX2RlcHNfYW55PSJsaWJkbCBMb2FkTGlicmFyeSIKK2F2aXN5bnRoX2RlbXV4ZXJfZGVwcz0iYXZpc3ludGgiCithdmlzeW50aF9kZW11eGVyX3NlbGVjdD0icmlmZmRlYyIKK2VhYzNfYXRfZGVjb2Rlcl9kZXBzPSJhdWRpb3Rvb2xib3giCitlYWMzX2F0X2RlY29kZXJfc2VsZWN0PSJhYzNfcGFyc2VyIgorZ3NtX21zX2F0X2RlY29kZXJfZGVwcz0iYXVkaW90b29sYm94IgoraWxiY19hdF9kZWNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK21wMV9hdF9kZWNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK21wMl9hdF9kZWNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK21wM19hdF9kZWNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK21wMV9hdF9kZWNvZGVyX3NlbGVjdD0ibXBlZ2F1ZGlvaGVhZGVyIgorbXAyX2F0X2RlY29kZXJfc2VsZWN0PSJtcGVnYXVkaW9oZWFkZXIiCittcDNfYXRfZGVjb2Rlcl9zZWxlY3Q9Im1wZWdhdWRpb2hlYWRlciIKK3BjbV9hbGF3X2F0X2RlY29kZXJfZGVwcz0iYXVkaW90b29sYm94IgorcGNtX211bGF3X2F0X2RlY29kZXJfZGVwcz0iYXVkaW90b29sYm94IgorcWRtY19hdF9kZWNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK3FkbTJfYXRfZGVjb2Rlcl9kZXBzPSJhdWRpb3Rvb2xib3giCithYWNfYXRfZW5jb2Rlcl9kZXBzPSJhdWRpb3Rvb2xib3giCithYWNfYXRfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgorYWxhY19hdF9lbmNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK2FsYWNfYXRfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgoraWxiY19hdF9lbmNvZGVyX2RlcHM9ImF1ZGlvdG9vbGJveCIKK2lsYmNfYXRfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgorcGNtX2FsYXdfYXRfZW5jb2Rlcl9kZXBzPSJhdWRpb3Rvb2xib3giCitwY21fYWxhd19hdF9lbmNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUiCitwY21fbXVsYXdfYXRfZW5jb2Rlcl9kZXBzPSJhdWRpb3Rvb2xib3giCitwY21fbXVsYXdfYXRfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgogY2hyb21hcHJpbnRfbXV4ZXJfZGVwcz0iY2hyb21hcHJpbnQiCitoMjY0X3ZpZGVvdG9vbGJveF9lbmNvZGVyX2RlcHM9InB0aHJlYWRzIgoraDI2NF92aWRlb3Rvb2xib3hfZW5jb2Rlcl9zZWxlY3Q9InZpZGVvdG9vbGJveF9lbmNvZGVyIgoraGV2Y192aWRlb3Rvb2xib3hfZW5jb2Rlcl9kZXBzPSJwdGhyZWFkcyIKK2hldmNfdmlkZW90b29sYm94X2VuY29kZXJfc2VsZWN0PSJ2aWRlb3Rvb2xib3hfZW5jb2RlciIKK2xpYmFvbV9hdjFfZGVjb2Rlcl9kZXBzPSJsaWJhb20iCitsaWJhb21fYXYxX2VuY29kZXJfZGVwcz0ibGliYW9tIgogbGliY2VsdF9kZWNvZGVyX2RlcHM9ImxpYmNlbHQiCi1saWJkY2FkZWNfZGVjb2Rlcl9kZXBzPSJsaWJkY2FkZWMiCi1saWJmYWFjX2VuY29kZXJfZGVwcz0ibGliZmFhYyIKLWxpYmZhYWNfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgorbGliY29kZWMyX2RlY29kZXJfZGVwcz0ibGliY29kZWMyIgorbGliY29kZWMyX2VuY29kZXJfZGVwcz0ibGliY29kZWMyIgogbGliZmRrX2FhY19kZWNvZGVyX2RlcHM9ImxpYmZka19hYWMiCiBsaWJmZGtfYWFjX2VuY29kZXJfZGVwcz0ibGliZmRrX2FhYyIKIGxpYmZka19hYWNfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgpAQCAtMjYxNywxOSArMzA2OSwyMSBAQAogbGlia3ZhemFhcl9lbmNvZGVyX2RlcHM9ImxpYmt2YXphYXIiCiBsaWJtb2RwbHVnX2RlbXV4ZXJfZGVwcz0ibGlibW9kcGx1ZyIKIGxpYm1wM2xhbWVfZW5jb2Rlcl9kZXBzPSJsaWJtcDNsYW1lIgotbGlibXAzbGFtZV9lbmNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUiCitsaWJtcDNsYW1lX2VuY29kZXJfc2VsZWN0PSJhdWRpb19mcmFtZV9xdWV1ZSBtcGVnYXVkaW9oZWFkZXIiCiBsaWJvcGVuY29yZV9hbXJuYl9kZWNvZGVyX2RlcHM9ImxpYm9wZW5jb3JlX2Ftcm5iIgogbGlib3BlbmNvcmVfYW1ybmJfZW5jb2Rlcl9kZXBzPSJsaWJvcGVuY29yZV9hbXJuYiIKIGxpYm9wZW5jb3JlX2Ftcm5iX2VuY29kZXJfc2VsZWN0PSJhdWRpb19mcmFtZV9xdWV1ZSIKIGxpYm9wZW5jb3JlX2FtcndiX2RlY29kZXJfZGVwcz0ibGlib3BlbmNvcmVfYW1yd2IiCitsaWJvcGVuaDI2NF9kZWNvZGVyX2RlcHM9ImxpYm9wZW5oMjY0IgorbGlib3BlbmgyNjRfZGVjb2Rlcl9zZWxlY3Q9ImgyNjRfbXA0dG9hbm5leGJfYnNmIgogbGlib3BlbmgyNjRfZW5jb2Rlcl9kZXBzPSJsaWJvcGVuaDI2NCIKIGxpYm9wZW5qcGVnX2RlY29kZXJfZGVwcz0ibGlib3BlbmpwZWciCiBsaWJvcGVuanBlZ19lbmNvZGVyX2RlcHM9ImxpYm9wZW5qcGVnIgorbGlib3Blbm1wdF9kZW11eGVyX2RlcHM9ImxpYm9wZW5tcHQiCiBsaWJvcHVzX2RlY29kZXJfZGVwcz0ibGlib3B1cyIKIGxpYm9wdXNfZW5jb2Rlcl9kZXBzPSJsaWJvcHVzIgogbGlib3B1c19lbmNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUiCi1saWJzY2hyb2VkaW5nZXJfZGVjb2Rlcl9kZXBzPSJsaWJzY2hyb2VkaW5nZXIiCi1saWJzY2hyb2VkaW5nZXJfZW5jb2Rlcl9kZXBzPSJsaWJzY2hyb2VkaW5nZXIiCitsaWJyc3ZnX2RlY29kZXJfZGVwcz0ibGlicnN2ZyIKIGxpYnNoaW5lX2VuY29kZXJfZGVwcz0ibGlic2hpbmUiCiBsaWJzaGluZV9lbmNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUiCiBsaWJzcGVleF9kZWNvZGVyX2RlcHM9ImxpYnNwZWV4IgpAQCAtMjYzNyw0MyArMzA5MSw0MyBAQAogbGlic3BlZXhfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgogbGlidGhlb3JhX2VuY29kZXJfZGVwcz0ibGlidGhlb3JhIgogbGlidHdvbGFtZV9lbmNvZGVyX2RlcHM9ImxpYnR3b2xhbWUiCi1saWJ1dHZpZGVvX2RlY29kZXJfZGVwcz0ibGlidXR2aWRlbyIKLWxpYnV0dmlkZW9fZW5jb2Rlcl9kZXBzPSJsaWJ1dHZpZGVvIgogbGlidm9fYW1yd2JlbmNfZW5jb2Rlcl9kZXBzPSJsaWJ2b19hbXJ3YmVuYyIKIGxpYnZvcmJpc19kZWNvZGVyX2RlcHM9ImxpYnZvcmJpcyIKLWxpYnZvcmJpc19lbmNvZGVyX2RlcHM9ImxpYnZvcmJpcyIKK2xpYnZvcmJpc19lbmNvZGVyX2RlcHM9ImxpYnZvcmJpcyBsaWJ2b3JiaXNlbmMiCiBsaWJ2b3JiaXNfZW5jb2Rlcl9zZWxlY3Q9ImF1ZGlvX2ZyYW1lX3F1ZXVlIgogbGlidnB4X3ZwOF9kZWNvZGVyX2RlcHM9ImxpYnZweCIKIGxpYnZweF92cDhfZW5jb2Rlcl9kZXBzPSJsaWJ2cHgiCiBsaWJ2cHhfdnA5X2RlY29kZXJfZGVwcz0ibGlidnB4IgogbGlidnB4X3ZwOV9lbmNvZGVyX2RlcHM9ImxpYnZweCIKIGxpYndhdnBhY2tfZW5jb2Rlcl9kZXBzPSJsaWJ3YXZwYWNrIgorbGlid2F2cGFja19lbmNvZGVyX3NlbGVjdD0iYXVkaW9fZnJhbWVfcXVldWUiCiBsaWJ3ZWJwX2VuY29kZXJfZGVwcz0ibGlid2VicCIKIGxpYndlYnBfYW5pbV9lbmNvZGVyX2RlcHM9ImxpYndlYnAiCiBsaWJ4MjYyX2VuY29kZXJfZGVwcz0ibGlieDI2MiIKIGxpYngyNjRfZW5jb2Rlcl9kZXBzPSJsaWJ4MjY0IgotbGlieDI2NHJnYl9lbmNvZGVyX2RlcHM9ImxpYngyNjQiCitsaWJ4MjY0cmdiX2VuY29kZXJfZGVwcz0ibGlieDI2NCB4MjY0X2NzcF9iZ3IiCiBsaWJ4MjY0cmdiX2VuY29kZXJfc2VsZWN0PSJsaWJ4MjY0X2VuY29kZXIiCiBsaWJ4MjY1X2VuY29kZXJfZGVwcz0ibGlieDI2NSIKIGxpYnhhdnNfZW5jb2Rlcl9kZXBzPSJsaWJ4YXZzIgogbGlieHZpZF9lbmNvZGVyX2RlcHM9ImxpYnh2aWQiCiBsaWJ6dmJpX3RlbGV0ZXh0X2RlY29kZXJfZGVwcz0ibGlienZiaSIKLW52ZW5jX2VuY29kZXJfZGVwcz0ibnZlbmMiCi1udmVuY19oMjY0X2VuY29kZXJfZGVwcz0ibnZlbmMiCi1udmVuY19oZXZjX2VuY29kZXJfZGVwcz0ibnZlbmMiCit2aWRlb3Rvb2xib3hfc3VnZ2VzdD0iY29yZXNlcnZpY2VzIgordmlkZW90b29sYm94X2RlcHM9ImNvcmVmb3VuZGF0aW9uIGNvcmVtZWRpYSBjb3JldmlkZW8iCit2aWRlb3Rvb2xib3hfZW5jb2Rlcl9kZXBzPSJ2aWRlb3Rvb2xib3ggVlRDb21wcmVzc2lvblNlc3Npb25QcmVwYXJlVG9FbmNvZGVGcmFtZXMiCiAKICMgZGVtdXhlcnMgLyBtdXhlcnMKIGFjM19kZW11eGVyX3NlbGVjdD0iYWMzX3BhcnNlciIKK2FpZmZfbXV4ZXJfc2VsZWN0PSJpc29fbWVkaWEiCiBhc2ZfZGVtdXhlcl9zZWxlY3Q9InJpZmZkZWMiCiBhc2Zfb19kZW11eGVyX3NlbGVjdD0icmlmZmRlYyIKIGFzZl9tdXhlcl9zZWxlY3Q9InJpZmZlbmMiCiBhc2Zfc3RyZWFtX211eGVyX3NlbGVjdD0iYXNmX211eGVyIgotYXZpX2RlbXV4ZXJfc2VsZWN0PSJyaWZmZGVjIGV4aWYiCithdmlfZGVtdXhlcl9zZWxlY3Q9Imlzb19tZWRpYSByaWZmZGVjIGV4aWYiCiBhdmlfbXV4ZXJfc2VsZWN0PSJyaWZmZW5jIgotYXZpc3ludGhfZGVtdXhlcl9kZXBzPSJhdmlzeW50aCIKLWF2aXN5bnRoX2RlbXV4ZXJfc2VsZWN0PSJyaWZmZGVjIgotY2FmX2RlbXV4ZXJfc2VsZWN0PSJyaWZmZGVjIgorY2FmX2RlbXV4ZXJfc2VsZWN0PSJpc29fbWVkaWEgcmlmZmRlYyIKK2NhZl9tdXhlcl9zZWxlY3Q9Imlzb19tZWRpYSIKIGRhc2hfbXV4ZXJfc2VsZWN0PSJtcDRfbXV4ZXIiCitkYXNoX2RlbXV4ZXJfZGVwcz0ibGlieG1sMiIKIGRpcmFjX2RlbXV4ZXJfc2VsZWN0PSJkaXJhY19wYXJzZXIiCiBkdHNfZGVtdXhlcl9zZWxlY3Q9ImRjYV9wYXJzZXIiCiBkdHNoZF9kZW11eGVyX3NlbGVjdD0iZGNhX3BhcnNlciIKQEAgLTI2ODIsMjUgKzMxMzYsMjcgQEAKIGR4YV9kZW11eGVyX3NlbGVjdD0icmlmZmRlYyIKIGVhYzNfZGVtdXhlcl9zZWxlY3Q9ImFjM19wYXJzZXIiCiBmNHZfbXV4ZXJfc2VsZWN0PSJtb3ZfbXV4ZXIiCitmaWZvX211eGVyX2RlcHM9InRocmVhZHMiCiBmbGFjX2RlbXV4ZXJfc2VsZWN0PSJmbGFjX3BhcnNlciIKIGhkc19tdXhlcl9zZWxlY3Q9ImZsdl9tdXhlciIKIGhsc19tdXhlcl9zZWxlY3Q9Im1wZWd0c19tdXhlciIKK2hsc19tdXhlcl9zdWdnZXN0PSJnY3J5cHQgb3BlbnNzbCIKIGltYWdlMl9hbGlhc19waXhfZGVtdXhlcl9zZWxlY3Q9ImltYWdlMl9kZW11eGVyIgogaW1hZ2UyX2JyZW5kZXJfcGl4X2RlbXV4ZXJfc2VsZWN0PSJpbWFnZTJfZGVtdXhlciIKIGlwb2RfbXV4ZXJfc2VsZWN0PSJtb3ZfbXV4ZXIiCiBpc212X211eGVyX3NlbGVjdD0ibW92X211eGVyIgotbGlibnV0X2RlbXV4ZXJfZGVwcz0ibGlibnV0IgotbGlibnV0X211eGVyX2RlcHM9ImxpYm51dCIKIG1hdHJvc2thX2F1ZGlvX211eGVyX3NlbGVjdD0ibWF0cm9za2FfbXV4ZXIiCi1tYXRyb3NrYV9kZW11eGVyX3NlbGVjdD0icmlmZmRlYyIKK21hdHJvc2thX2RlbXV4ZXJfc2VsZWN0PSJpc29fbWVkaWEgcmlmZmRlYyIKIG1hdHJvc2thX2RlbXV4ZXJfc3VnZ2VzdD0iYnpsaWIgbHpvIHpsaWIiCi1tYXRyb3NrYV9tdXhlcl9zZWxlY3Q9InJpZmZlbmMiCittYXRyb3NrYV9tdXhlcl9zZWxlY3Q9Imlzb19tZWRpYSByaWZmZW5jIgogbW1mX211eGVyX3NlbGVjdD0icmlmZmVuYyIKLW1vdl9kZW11eGVyX3NlbGVjdD0icmlmZmRlYyIKK21vdl9kZW11eGVyX3NlbGVjdD0iaXNvX21lZGlhIHJpZmZkZWMiCiBtb3ZfZGVtdXhlcl9zdWdnZXN0PSJ6bGliIgotbW92X211eGVyX3NlbGVjdD0icmlmZmVuYyBydHBlbmNfY2hhaW4iCittb3ZfbXV4ZXJfc2VsZWN0PSJpc29fbWVkaWEgcmlmZmVuYyBydHBlbmNfY2hhaW4iCiBtcDNfZGVtdXhlcl9zZWxlY3Q9Im1wZWdhdWRpb19wYXJzZXIiCittcDNfbXV4ZXJfc2VsZWN0PSJtcGVnYXVkaW9oZWFkZXIiCiBtcDRfbXV4ZXJfc2VsZWN0PSJtb3ZfbXV4ZXIiCittcGVndHNfZGVtdXhlcl9zZWxlY3Q9Imlzb19tZWRpYSIKIG1wZWd0c19tdXhlcl9zZWxlY3Q9ImFkdHNfbXV4ZXIgbGF0bV9tdXhlciIKIG1wZWd0c3Jhd19kZW11eGVyX3NlbGVjdD0ibXBlZ3RzX2RlbXV4ZXIiCiBteGZfZDEwX211eGVyX3NlbGVjdD0ibXhmX211eGVyIgpAQCAtMjcwOSwxNyArMzE2NSwyMCBAQAogbnV2X2RlbXV4ZXJfc2VsZWN0PSJyaWZmZGVjIgogb2dhX211eGVyX3NlbGVjdD0ib2dnX211eGVyIgogb2dnX2RlbXV4ZXJfc2VsZWN0PSJkaXJhY19wYXJzZSIKK29ndl9tdXhlcl9zZWxlY3Q9Im9nZ19tdXhlciIKIG9wdXNfbXV4ZXJfc2VsZWN0PSJvZ2dfbXV4ZXIiCiBwc3BfbXV4ZXJfc2VsZWN0PSJtb3ZfbXV4ZXIiCiBydHBfZGVtdXhlcl9zZWxlY3Q9InNkcF9kZW11eGVyIgotcnRwZGVjX3NlbGVjdD0iYXNmX2RlbXV4ZXIganBlZ3RhYmxlcyBtb3ZfZGVtdXhlciBtcGVndHNfZGVtdXhlciBybV9kZW11eGVyIHJ0cF9wcm90b2NvbCIKK3J0cF9tdXhlcl9zZWxlY3Q9ImdvbG9tYiIKK3J0cGRlY19zZWxlY3Q9ImFzZl9kZW11eGVyIGpwZWd0YWJsZXMgbW92X2RlbXV4ZXIgbXBlZ3RzX2RlbXV4ZXIgcm1fZGVtdXhlciBydHBfcHJvdG9jb2wgc3J0cCIKIHJ0c3BfZGVtdXhlcl9zZWxlY3Q9Imh0dHBfcHJvdG9jb2wgcnRwZGVjIgogcnRzcF9tdXhlcl9zZWxlY3Q9InJ0cF9tdXhlciBodHRwX3Byb3RvY29sIHJ0cF9wcm90b2NvbCBydHBlbmNfY2hhaW4iCiBzYXBfZGVtdXhlcl9zZWxlY3Q9InNkcF9kZW11eGVyIgogc2FwX211eGVyX3NlbGVjdD0icnRwX211eGVyIHJ0cF9wcm90b2NvbCBydHBlbmNfY2hhaW4iCiBzZHBfZGVtdXhlcl9zZWxlY3Q9InJ0cGRlYyIKIHNtb290aHN0cmVhbWluZ19tdXhlcl9zZWxlY3Q9ImlzbXZfbXV4ZXIiCi1zcGRpZl9tdXhlcl9zZWxlY3Q9ImFhY19wYXJzZXIiCitzcGRpZl9kZW11eGVyX3NlbGVjdD0iYWR0c19oZWFkZXIiCitzcGRpZl9tdXhlcl9zZWxlY3Q9ImFkdHNfaGVhZGVyIgogc3B4X211eGVyX3NlbGVjdD0ib2dnX211eGVyIgogc3dmX2RlbXV4ZXJfc3VnZ2VzdD0iemxpYiIKIHRha19kZW11eGVyX3NlbGVjdD0idGFrX3BhcnNlciIKQEAgLTI3MzAsNzIgKzMxODksODEgQEAKIHc2NF9tdXhlcl9zZWxlY3Q9Indhdl9tdXhlciIKIHdhdl9kZW11eGVyX3NlbGVjdD0icmlmZmRlYyIKIHdhdl9tdXhlcl9zZWxlY3Q9InJpZmZlbmMiCi13ZWJtX211eGVyX3NlbGVjdD0icmlmZmVuYyIKLXd0dl9kZW11eGVyX3NlbGVjdD0icmlmZmRlYyIKLXd0dl9tdXhlcl9zZWxlY3Q9InJpZmZlbmMiCit3ZWJtX211eGVyX3NlbGVjdD0iaXNvX21lZGlhIHJpZmZlbmMiCit3ZWJtX2Rhc2hfbWFuaWZlc3RfZGVtdXhlcl9zZWxlY3Q9Im1hdHJvc2thX2RlbXV4ZXIiCit3dHZfZGVtdXhlcl9zZWxlY3Q9Im1wZWd0c19kZW11eGVyIHJpZmZkZWMiCit3dHZfbXV4ZXJfc2VsZWN0PSJtcGVndHNfbXV4ZXIgcmlmZmVuYyIKIHhtdl9kZW11eGVyX3NlbGVjdD0icmlmZmRlYyIKIHh3bWFfZGVtdXhlcl9zZWxlY3Q9InJpZmZkZWMiCiAKICMgaW5kZXZzIC8gb3V0ZGV2cwotYWxzYV9pbmRldl9kZXBzPSJhbHNhX2Fzb3VuZGxpYl9oIHNuZF9wY21faHRpbWVzdGFtcCIKLWFsc2Ffb3V0ZGV2X2RlcHM9ImFsc2FfYXNvdW5kbGliX2giCi1hdmZvdW5kYXRpb25faW5kZXZfZXh0cmFsaWJzPSItZnJhbWV3b3JrIENvcmVWaWRlbyAtZnJhbWV3b3JrIEZvdW5kYXRpb24gLWZyYW1ld29yayBBVkZvdW5kYXRpb24gLWZyYW1ld29yayBDb3JlTWVkaWEiCi1hdmZvdW5kYXRpb25faW5kZXZfc2VsZWN0PSJhdmZvdW5kYXRpb24iCithbmRyb2lkX2NhbWVyYV9pbmRldl9kZXBzPSJhbmRyb2lkIGNhbWVyYTJuZGsgbWVkaWFuZGsgcHRocmVhZHMiCithbmRyb2lkX2NhbWVyYV9pbmRldl9leHRyYWxpYnM9Ii1sYW5kcm9pZCAtbGNhbWVyYTJuZGsgLWxtZWRpYW5kayIKK2Fsc2FfaW5kZXZfZGVwcz0iYWxzYSIKK2Fsc2Ffb3V0ZGV2X2RlcHM9ImFsc2EiCithdmZvdW5kYXRpb25faW5kZXZfZGVwcz0iYXZmb3VuZGF0aW9uIGNvcmV2aWRlbyBjb3JlbWVkaWEgcHRocmVhZHMiCithdmZvdW5kYXRpb25faW5kZXZfc3VnZ2VzdD0iY29yZWdyYXBoaWNzIGFwcGxpY2F0aW9uc2VydmljZXMiCithdmZvdW5kYXRpb25faW5kZXZfZXh0cmFsaWJzPSItZnJhbWV3b3JrIEZvdW5kYXRpb24iCiBia3RyX2luZGV2X2RlcHNfYW55PSJkZXZfYmt0cl9pb2N0bF9idDg0OF9oIG1hY2hpbmVfaW9jdGxfYnQ4NDhfaCBkZXZfdmlkZW9fYmt0cl9pb2N0bF9idDg0OF9oIGRldl9pY19idDh4eF9oIgogY2FjYV9vdXRkZXZfZGVwcz0ibGliY2FjYSIKLWRlY2tsaW5rX2luZGV2X2RlcHM9ImRlY2tsaW5rIHB0aHJlYWRzIgorZGVja2xpbmtfZGVwc19hbnk9ImxpYmRsIExvYWRMaWJyYXJ5IgorZGVja2xpbmtfaW5kZXZfZGVwcz0iZGVja2xpbmsgdGhyZWFkcyIKIGRlY2tsaW5rX2luZGV2X2V4dHJhbGlicz0iLWxzdGRjKysiCi1kZWNrbGlua19vdXRkZXZfZGVwcz0iZGVja2xpbmsgcHRocmVhZHMiCitkZWNrbGlua19vdXRkZXZfZGVwcz0iZGVja2xpbmsgdGhyZWFkcyIKIGRlY2tsaW5rX291dGRldl9leHRyYWxpYnM9Ii1sc3RkYysrIgorbGlibmRpX25ld3Rla19pbmRldl9kZXBzPSJsaWJuZGlfbmV3dGVrIgorbGlibmRpX25ld3Rla19pbmRldl9leHRyYWxpYnM9Ii1sbmRpIgorbGlibmRpX25ld3Rla19vdXRkZXZfZGVwcz0ibGlibmRpX25ld3RlayIKK2xpYm5kaV9uZXd0ZWtfb3V0ZGV2X2V4dHJhbGlicz0iLWxuZGkiCiBkc2hvd19pbmRldl9kZXBzPSJJQmFzZUZpbHRlciIKIGRzaG93X2luZGV2X2V4dHJhbGlicz0iLWxwc2FwaSAtbG9sZTMyIC1sc3RybWlpZHMgLWx1dWlkIC1sb2xlYXV0MzIgLWxzaGx3YXBpIgotZHYxMzk0X2luZGV2X2RlcHM9ImR2MTM5NCIKLWR2MTM5NF9pbmRldl9zZWxlY3Q9ImR2X2RlbXV4ZXIiCiBmYmRldl9pbmRldl9kZXBzPSJsaW51eF9mYl9oIgogZmJkZXZfb3V0ZGV2X2RlcHM9ImxpbnV4X2ZiX2giCiBnZGlncmFiX2luZGV2X2RlcHM9IkNyZWF0ZURJQlNlY3Rpb24iCiBnZGlncmFiX2luZGV2X2V4dHJhbGlicz0iLWxnZGkzMiIKIGdkaWdyYWJfaW5kZXZfc2VsZWN0PSJibXBfZGVjb2RlciIKIGllYzYxODgzX2luZGV2X2RlcHM9ImxpYmllYzYxODgzIgotamFja19pbmRldl9kZXBzPSJqYWNrX2phY2tfaCBzZW1fdGltZWR3YWl0IgoramFja19pbmRldl9kZXBzPSJsaWJqYWNrIgoramFja19pbmRldl9kZXBzX2FueT0ic2VtX3RpbWVkd2FpdCBkaXNwYXRjaF9kaXNwYXRjaF9oIgora21zZ3JhYl9pbmRldl9kZXBzPSJsaWJkcm0iCiBsYXZmaV9pbmRldl9kZXBzPSJhdmZpbHRlciIKIGxpYmNkaW9faW5kZXZfZGVwcz0ibGliY2RpbyIKIGxpYmRjMTM5NF9pbmRldl9kZXBzPSJsaWJkYzEzOTQiCi1saWJ2NGwyX2luZGV2X2RlcHM9ImxpYnY0bDIiCiBvcGVuYWxfaW5kZXZfZGVwcz0ib3BlbmFsIgogb3BlbmdsX291dGRldl9kZXBzPSJvcGVuZ2wiCi1vc3NfaW5kZXZfZGVwc19hbnk9InNvdW5kY2FyZF9oIHN5c19zb3VuZGNhcmRfaCIKLW9zc19vdXRkZXZfZGVwc19hbnk9InNvdW5kY2FyZF9oIHN5c19zb3VuZGNhcmRfaCIKK29zc19pbmRldl9kZXBzX2FueT0ic3lzX3NvdW5kY2FyZF9oIgorb3NzX291dGRldl9kZXBzX2FueT0ic3lzX3NvdW5kY2FyZF9oIgogcHVsc2VfaW5kZXZfZGVwcz0ibGlicHVsc2UiCiBwdWxzZV9vdXRkZXZfZGVwcz0ibGlicHVsc2UiCi1xdGtpdF9pbmRldl9leHRyYWxpYnM9Ii1mcmFtZXdvcmsgUVRLaXQgLWZyYW1ld29yayBGb3VuZGF0aW9uIC1mcmFtZXdvcmsgUXVhcnR6Q29yZSIKLXF0a2l0X2luZGV2X3NlbGVjdD0icXRraXQiCi1zZGxfb3V0ZGV2X2RlcHM9InNkbCIKLXNuZGlvX2luZGV2X2RlcHM9InNuZGlvX2giCi1zbmRpb19vdXRkZXZfZGVwcz0ic25kaW9faCIKLXY0bF9pbmRldl9kZXBzPSJsaW51eF92aWRlb2Rldl9oIgorc2RsMl9vdXRkZXZfZGVwcz0ic2RsMiIKK3NuZGlvX2luZGV2X2RlcHM9InNuZGlvIgorc25kaW9fb3V0ZGV2X2RlcHM9InNuZGlvIgogdjRsMl9pbmRldl9kZXBzX2FueT0ibGludXhfdmlkZW9kZXYyX2ggc3lzX3ZpZGVvaW9faCIKK3Y0bDJfaW5kZXZfc3VnZ2VzdD0ibGlidjRsMiIKIHY0bDJfb3V0ZGV2X2RlcHNfYW55PSJsaW51eF92aWRlb2RldjJfaCBzeXNfdmlkZW9pb19oIgotdmZ3Y2FwX2luZGV2X2RlcHM9ImNhcENyZWF0ZUNhcHR1cmVXaW5kb3cgdmZ3Y2FwX2RlZmluZXMiCi12ZndjYXBfaW5kZXZfZXh0cmFsaWJzPSItbGF2aWNhcDMyIgoteDExZ3JhYl9pbmRldl9kZXBzPSJ4MTFncmFiIgoteDExZ3JhYl94Y2JfaW5kZXZfZGVwcz0ibGlieGNiIgordjRsMl9vdXRkZXZfc3VnZ2VzdD0ibGlidjRsMiIKK3Zmd2NhcF9pbmRldl9kZXBzPSJ2ZnczMiB2ZndjYXBfZGVmaW5lcyIKK3hjYmdyYWJfaW5kZXZfZGVwcz0ibGlieGNiIgoreGNiZ3JhYl9pbmRldl9zdWdnZXN0PSJsaWJ4Y2Jfc2htIGxpYnhjYl9zaGFwZSBsaWJ4Y2JfeGZpeGVzIgogeHZfb3V0ZGV2X2RlcHM9IlgxMV9leHRlbnNpb25zX1h2bGliX2ggWHZHZXRQb3J0QXR0cmlidXRlIgogeHZfb3V0ZGV2X2V4dHJhbGlicz0iLWxYdiAtbFgxMSAtbFhleHQiCiAKICMgcHJvdG9jb2xzCiBhc3luY19wcm90b2NvbF9kZXBzPSJ0aHJlYWRzIgogYmx1cmF5X3Byb3RvY29sX2RlcHM9ImxpYmJsdXJheSIKLWZmcnRtcGNyeXB0X3Byb3RvY29sX2RlcHM9IiFsaWJydG1wX3Byb3RvY29sIgorZmZydG1wY3J5cHRfcHJvdG9jb2xfY29uZmxpY3Q9ImxpYnJ0bXBfcHJvdG9jb2wiCiBmZnJ0bXBjcnlwdF9wcm90b2NvbF9kZXBzX2FueT0iZ2NyeXB0IGdtcCBvcGVuc3NsIgogZmZydG1wY3J5cHRfcHJvdG9jb2xfc2VsZWN0PSJ0Y3BfcHJvdG9jb2wiCi1mZnJ0bXBodHRwX3Byb3RvY29sX2RlcHM9IiFsaWJydG1wX3Byb3RvY29sIgorZmZydG1waHR0cF9wcm90b2NvbF9jb25mbGljdD0ibGlicnRtcF9wcm90b2NvbCIKIGZmcnRtcGh0dHBfcHJvdG9jb2xfc2VsZWN0PSJodHRwX3Byb3RvY29sIgogZnRwX3Byb3RvY29sX3NlbGVjdD0idGNwX3Byb3RvY29sIgogZ29waGVyX3Byb3RvY29sX3NlbGVjdD0ibmV0d29yayIKIGh0dHBfcHJvdG9jb2xfc2VsZWN0PSJ0Y3BfcHJvdG9jb2wiCitodHRwX3Byb3RvY29sX3N1Z2dlc3Q9InpsaWIiCiBodHRwcHJveHlfcHJvdG9jb2xfc2VsZWN0PSJ0Y3BfcHJvdG9jb2wiCitodHRwcHJveHlfcHJvdG9jb2xfc3VnZ2VzdD0iemxpYiIKIGh0dHBzX3Byb3RvY29sX3NlbGVjdD0idGxzX3Byb3RvY29sIgoraHR0cHNfcHJvdG9jb2xfc3VnZ2VzdD0iemxpYiIKIGljZWNhc3RfcHJvdG9jb2xfc2VsZWN0PSJodHRwX3Byb3RvY29sIgogbGlicnRtcF9wcm90b2NvbF9kZXBzPSJsaWJydG1wIgogbGlicnRtcGVfcHJvdG9jb2xfZGVwcz0ibGlicnRtcCIKQEAgLTI4MDQsMzAgKzMyNzIsMzQgQEAKIGxpYnJ0bXB0ZV9wcm90b2NvbF9kZXBzPSJsaWJydG1wIgogbGlic21iY2xpZW50X3Byb3RvY29sX2RlcHM9ImxpYnNtYmNsaWVudCBncGx2MyIKIGxpYnNzaF9wcm90b2NvbF9kZXBzPSJsaWJzc2giCitsaWJ0bHNfY29uZmxpY3Q9Im9wZW5zc2wgZ251dGxzIgogbW1zaF9wcm90b2NvbF9zZWxlY3Q9Imh0dHBfcHJvdG9jb2wiCiBtbXN0X3Byb3RvY29sX3NlbGVjdD0ibmV0d29yayIKLXJ0bXBfcHJvdG9jb2xfZGVwcz0iIWxpYnJ0bXBfcHJvdG9jb2wiCitsaWJzcnRfcHJvdG9jb2xfZGVwcz0ibGlic3J0IgorbGlic3J0X3Byb3RvY29sX3NlbGVjdD0ibmV0d29yayIKK3J0bXBfcHJvdG9jb2xfY29uZmxpY3Q9ImxpYnJ0bXBfcHJvdG9jb2wiCiBydG1wX3Byb3RvY29sX3NlbGVjdD0idGNwX3Byb3RvY29sIgorcnRtcF9wcm90b2NvbF9zdWdnZXN0PSJ6bGliIgogcnRtcGVfcHJvdG9jb2xfc2VsZWN0PSJmZnJ0bXBjcnlwdF9wcm90b2NvbCIKLXJ0bXBzX3Byb3RvY29sX2RlcHM9IiFsaWJydG1wX3Byb3RvY29sIgorcnRtcGVfcHJvdG9jb2xfc3VnZ2VzdD0iemxpYiIKK3J0bXBzX3Byb3RvY29sX2NvbmZsaWN0PSJsaWJydG1wX3Byb3RvY29sIgogcnRtcHNfcHJvdG9jb2xfc2VsZWN0PSJ0bHNfcHJvdG9jb2wiCitydG1wc19wcm90b2NvbF9zdWdnZXN0PSJ6bGliIgogcnRtcHRfcHJvdG9jb2xfc2VsZWN0PSJmZnJ0bXBodHRwX3Byb3RvY29sIgorcnRtcHRfcHJvdG9jb2xfc3VnZ2VzdD0iemxpYiIKIHJ0bXB0ZV9wcm90b2NvbF9zZWxlY3Q9ImZmcnRtcGNyeXB0X3Byb3RvY29sIGZmcnRtcGh0dHBfcHJvdG9jb2wiCitydG1wdGVfcHJvdG9jb2xfc3VnZ2VzdD0iemxpYiIKIHJ0bXB0c19wcm90b2NvbF9zZWxlY3Q9ImZmcnRtcGh0dHBfcHJvdG9jb2wgaHR0cHNfcHJvdG9jb2wiCitydG1wdHNfcHJvdG9jb2xfc3VnZ2VzdD0iemxpYiIKIHJ0cF9wcm90b2NvbF9zZWxlY3Q9InVkcF9wcm90b2NvbCIKLXNjdHBfcHJvdG9jb2xfZGVwcz0ic3RydWN0X3NjdHBfZXZlbnRfc3Vic2NyaWJlIgorc2NoYW5uZWxfY29uZmxpY3Q9Im9wZW5zc2wgZ251dGxzIGxpYnRscyIKK3NjdHBfcHJvdG9jb2xfZGVwcz0ic3RydWN0X3NjdHBfZXZlbnRfc3Vic2NyaWJlIHN0cnVjdF9tc2doZHJfbXNnX2ZsYWdzIgogc2N0cF9wcm90b2NvbF9zZWxlY3Q9Im5ldHdvcmsiCi1zcnRwX3Byb3RvY29sX3NlbGVjdD0icnRwX3Byb3RvY29sIgorc2VjdXJldHJhbnNwb3J0X2NvbmZsaWN0PSJvcGVuc3NsIGdudXRscyBsaWJ0bHMiCitzcnRwX3Byb3RvY29sX3NlbGVjdD0icnRwX3Byb3RvY29sIHNydHAiCiB0Y3BfcHJvdG9jb2xfc2VsZWN0PSJuZXR3b3JrIgotdGxzX2dudXRsc19wcm90b2NvbF9kZXBzPSJnbnV0bHMgIXRsc19zY2hhbm5lbF9wcm90b2NvbCAhdGxzX3NlY3VyZXRyYW5zcG9ydF9wcm90b2NvbCIKLXRsc19nbnV0bHNfcHJvdG9jb2xfc2VsZWN0PSJ0Y3BfcHJvdG9jb2wiCi10bHNfb3BlbnNzbF9wcm90b2NvbF9kZXBzPSJvcGVuc3NsICF0bHNfc2NoYW5uZWxfcHJvdG9jb2wgIXRsc19zZWN1cmV0cmFuc3BvcnRfcHJvdG9jb2wgIXRsc19nbnV0bHNfcHJvdG9jb2wiCi10bHNfb3BlbnNzbF9wcm90b2NvbF9zZWxlY3Q9InRjcF9wcm90b2NvbCIKLXRsc19zY2hhbm5lbF9wcm90b2NvbF9kZXBzPSJzY2hhbm5lbCIKLXRsc19zY2hhbm5lbF9wcm90b2NvbF9zZWxlY3Q9InRjcF9wcm90b2NvbCIKLXRsc19zZWN1cmV0cmFuc3BvcnRfcHJvdG9jb2xfZGVwcz0ic2VjdXJldHJhbnNwb3J0IgotdGxzX3NlY3VyZXRyYW5zcG9ydF9wcm90b2NvbF9zZWxlY3Q9InRjcF9wcm90b2NvbCIKLXRsc19wcm90b2NvbF9kZXBzX2FueT0idGxzX3NjaGFubmVsX3Byb3RvY29sIHRsc19zZWN1cmV0cmFuc3BvcnRfcHJvdG9jb2wgdGxzX2dudXRsc19wcm90b2NvbCB0bHNfb3BlbnNzbF9wcm90b2NvbCIKK3Rsc19wcm90b2NvbF9kZXBzX2FueT0iZ251dGxzIG9wZW5zc2wgc2NoYW5uZWwgc2VjdXJldHJhbnNwb3J0IGxpYnRscyIKK3Rsc19wcm90b2NvbF9zZWxlY3Q9InRjcF9wcm90b2NvbCIKIHVkcF9wcm90b2NvbF9zZWxlY3Q9Im5ldHdvcmsiCiB1ZHBsaXRlX3Byb3RvY29sX3NlbGVjdD0ibmV0d29yayIKIHVuaXhfcHJvdG9jb2xfZGVwcz0ic3lzX3VuX2giCkBAIC0yODM2LDM3ICszMzA4LDU2IEBACiAjIGZpbHRlcnMKIGFmZnRmaWx0X2ZpbHRlcl9kZXBzPSJhdmNvZGVjIgogYWZmdGZpbHRfZmlsdGVyX3NlbGVjdD0iZmZ0IgorYWZpcl9maWx0ZXJfZGVwcz0iYXZjb2RlYyIKK2FmaXJfZmlsdGVyX3NlbGVjdD0iZmZ0IgogYW1vdmllX2ZpbHRlcl9kZXBzPSJhdmNvZGVjIGF2Zm9ybWF0IgogYXJlc2FtcGxlX2ZpbHRlcl9kZXBzPSJzd3Jlc2FtcGxlIgogYXNzX2ZpbHRlcl9kZXBzPSJsaWJhc3MiCi1hc3luY3RzX2ZpbHRlcl9kZXBzPSJhdnJlc2FtcGxlIgogYXRlbXBvX2ZpbHRlcl9kZXBzPSJhdmNvZGVjIgogYXRlbXBvX2ZpbHRlcl9zZWxlY3Q9InJkZnQiCithdmdibHVyX29wZW5jbF9maWx0ZXJfZGVwcz0ib3BlbmNsIgogYXptcV9maWx0ZXJfZGVwcz0ibGliem1xIgogYmxhY2tmcmFtZV9maWx0ZXJfZGVwcz0iZ3BsIgogYm94Ymx1cl9maWx0ZXJfZGVwcz0iZ3BsIgogYnMyYl9maWx0ZXJfZGVwcz0ibGliYnMyYiIKIGNvbG9ybWF0cml4X2ZpbHRlcl9kZXBzPSJncGwiCitjb252b2x1dGlvbl9vcGVuY2xfZmlsdGVyX2RlcHM9Im9wZW5jbCIKK2NvbnZvbHZlX2ZpbHRlcl9kZXBzPSJhdmNvZGVjIgorY29udm9sdmVfZmlsdGVyX3NlbGVjdD0iZmZ0IgorY29yZWltYWdlX2ZpbHRlcl9kZXBzPSJjb3JlaW1hZ2UgYXBwa2l0IgorY29yZWltYWdlX2ZpbHRlcl9leHRyYWxpYnM9Ii1mcmFtZXdvcmsgT3BlbkdMIgorY29yZWltYWdlc3JjX2ZpbHRlcl9kZXBzPSJjb3JlaW1hZ2UgYXBwa2l0IgorY29yZWltYWdlc3JjX2ZpbHRlcl9leHRyYWxpYnM9Ii1mcmFtZXdvcmsgT3BlbkdMIgogY292ZXJfcmVjdF9maWx0ZXJfZGVwcz0iYXZjb2RlYyBhdmZvcm1hdCBncGwiCiBjcm9wZGV0ZWN0X2ZpbHRlcl9kZXBzPSJncGwiCitkZWNvbnZvbHZlX2ZpbHRlcl9kZXBzPSJhdmNvZGVjIgorZGVjb252b2x2ZV9maWx0ZXJfc2VsZWN0PSJmZnQiCitkZWludGVybGFjZV9xc3ZfZmlsdGVyX2RlcHM9ImxpYm1meCIKK2RlaW50ZXJsYWNlX3ZhYXBpX2ZpbHRlcl9kZXBzPSJ2YWFwaSIKIGRlbG9nb19maWx0ZXJfZGVwcz0iZ3BsIgorZGVub2lzZV92YWFwaV9maWx0ZXJfZGVwcz0idmFhcGkgVkFQcm9jUGlwZWxpbmVQYXJhbWV0ZXJCdWZmZXIiCiBkZXNoYWtlX2ZpbHRlcl9zZWxlY3Q9InBpeGVsdXRpbHMiCiBkcmF3dGV4dF9maWx0ZXJfZGVwcz0ibGliZnJlZXR5cGUiCi1lYnVyMTI4X2ZpbHRlcl9kZXBzPSJncGwiCitkcmF3dGV4dF9maWx0ZXJfc3VnZ2VzdD0ibGliZm9udGNvbmZpZyBsaWJmcmliaWRpIgorZWxiZ19maWx0ZXJfZGVwcz0iYXZjb2RlYyIKIGVxX2ZpbHRlcl9kZXBzPSJncGwiCiBmZnRmaWx0X2ZpbHRlcl9kZXBzPSJhdmNvZGVjIgogZmZ0ZmlsdF9maWx0ZXJfc2VsZWN0PSJyZGZ0IgogZmluZF9yZWN0X2ZpbHRlcl9kZXBzPSJhdmNvZGVjIGF2Zm9ybWF0IGdwbCIKK2ZpcmVxdWFsaXplcl9maWx0ZXJfZGVwcz0iYXZjb2RlYyIKK2ZpcmVxdWFsaXplcl9maWx0ZXJfc2VsZWN0PSJyZGZ0IgogZmxpdGVfZmlsdGVyX2RlcHM9ImxpYmZsaXRlIgotZnJlaTByX2ZpbHRlcl9kZXBzPSJmcmVpMHIgZGxvcGVuIgotZnJlaTByX3NyY19maWx0ZXJfZGVwcz0iZnJlaTByIGRsb3BlbiIKK2ZyYW1lcmF0ZV9maWx0ZXJfc2VsZWN0PSJwaXhlbHV0aWxzIgorZnJlaTByX2ZpbHRlcl9kZXBzPSJmcmVpMHIgbGliZGwiCitmcmVpMHJfc3JjX2ZpbHRlcl9kZXBzPSJmcmVpMHIgbGliZGwiCiBmc3BwX2ZpbHRlcl9kZXBzPSJncGwiCiBnZXFfZmlsdGVyX2RlcHM9ImdwbCIKIGhpc3RlcV9maWx0ZXJfZGVwcz0iZ3BsIgogaHFkbjNkX2ZpbHRlcl9kZXBzPSJncGwiCiBpbnRlcmxhY2VfZmlsdGVyX2RlcHM9ImdwbCIKIGtlcm5kZWludF9maWx0ZXJfZGVwcz0iZ3BsIgotbGFkc3BhX2ZpbHRlcl9kZXBzPSJsYWRzcGEgZGxvcGVuIgorbGFkc3BhX2ZpbHRlcl9kZXBzPSJsYWRzcGEgbGliZGwiCitsdjJfZmlsdGVyX2RlcHM9Imx2MiIKIG1jZGVpbnRfZmlsdGVyX2RlcHM9ImF2Y29kZWMgZ3BsIgogbW92aWVfZmlsdGVyX2RlcHM9ImF2Y29kZWMgYXZmb3JtYXQiCiBtcGRlY2ltYXRlX2ZpbHRlcl9kZXBzPSJncGwiCkBAIC0yODc2LDEyICszMzY3LDE4IEBACiBubmVkaV9maWx0ZXJfZGVwcz0iZ3BsIgogb2NyX2ZpbHRlcl9kZXBzPSJsaWJ0ZXNzZXJhY3QiCiBvY3ZfZmlsdGVyX2RlcHM9ImxpYm9wZW5jdiIKK29wZW5jbHNyY19maWx0ZXJfZGVwcz0ib3BlbmNsIgorb3ZlcmxheV9vcGVuY2xfZmlsdGVyX2RlcHM9Im9wZW5jbCIKK292ZXJsYXlfcXN2X2ZpbHRlcl9kZXBzPSJsaWJtZngiCitvdmVybGF5X3Fzdl9maWx0ZXJfc2VsZWN0PSJxc3Z2cHAiCiBvd2Rlbm9pc2VfZmlsdGVyX2RlcHM9ImdwbCIKIHBhbl9maWx0ZXJfZGVwcz0ic3dyZXNhbXBsZSIKIHBlcnNwZWN0aXZlX2ZpbHRlcl9kZXBzPSJncGwiCiBwaGFzZV9maWx0ZXJfZGVwcz0iZ3BsIgogcHA3X2ZpbHRlcl9kZXBzPSJncGwiCiBwcF9maWx0ZXJfZGVwcz0iZ3BsIHBvc3Rwcm9jIgorcHJvY2FtcF92YWFwaV9maWx0ZXJfZGVwcz0idmFhcGkgVkFQcm9jUGlwZWxpbmVQYXJhbWV0ZXJCdWZmZXIiCitwcm9ncmFtX29wZW5jbF9maWx0ZXJfZGVwcz0ib3BlbmNsIgogcHVsbHVwX2ZpbHRlcl9kZXBzPSJncGwiCiByZW1vdmVsb2dvX2ZpbHRlcl9kZXBzPSJhdmNvZGVjIGF2Zm9ybWF0IHN3c2NhbGUiCiByZXBlYXRmaWVsZHNfZmlsdGVyX2RlcHM9ImdwbCIKQEAgLTI4OTAsOCArMzM4NywxMSBAQAogc2FiX2ZpbHRlcl9kZXBzPSJncGwgc3dzY2FsZSIKIHNjYWxlMnJlZl9maWx0ZXJfZGVwcz0ic3dzY2FsZSIKIHNjYWxlX2ZpbHRlcl9kZXBzPSJzd3NjYWxlIgorc2NhbGVfcXN2X2ZpbHRlcl9kZXBzPSJsaWJtZngiCiBzZWxlY3RfZmlsdGVyX3NlbGVjdD0icGl4ZWx1dGlscyIKK3NoYXJwbmVzc192YWFwaV9maWx0ZXJfZGVwcz0idmFhcGkgVkFQcm9jUGlwZWxpbmVQYXJhbWV0ZXJCdWZmZXIiCiBzaG93Y3F0X2ZpbHRlcl9kZXBzPSJhdmNvZGVjIGF2Zm9ybWF0IHN3c2NhbGUiCitzaG93Y3F0X2ZpbHRlcl9zdWdnZXN0PSJsaWJmb250Y29uZmlnIGxpYmZyZWV0eXBlIgogc2hvd2NxdF9maWx0ZXJfc2VsZWN0PSJmZnQiCiBzaG93ZnJlcXNfZmlsdGVyX2RlcHM9ImF2Y29kZWMiCiBzaG93ZnJlcXNfZmlsdGVyX3NlbGVjdD0iZmZ0IgpAQCAtMjg5OSw4ICszMzk5LDkgQEAKIHNob3dzcGVjdHJ1bV9maWx0ZXJfc2VsZWN0PSJmZnQiCiBzaG93c3BlY3RydW1waWNfZmlsdGVyX2RlcHM9ImF2Y29kZWMiCiBzaG93c3BlY3RydW1waWNfZmlsdGVyX3NlbGVjdD0iZmZ0Igorc2lnbmF0dXJlX2ZpbHRlcl9kZXBzPSJncGwgYXZjb2RlYyBhdmZvcm1hdCIKIHNtYXJ0Ymx1cl9maWx0ZXJfZGVwcz0iZ3BsIHN3c2NhbGUiCi1zb2ZhbGl6ZXJfZmlsdGVyX2RlcHM9Im5ldGNkZiBhdmNvZGVjIgorc29mYWxpemVyX2ZpbHRlcl9kZXBzPSJsaWJteXNvZmEgYXZjb2RlYyIKIHNvZmFsaXplcl9maWx0ZXJfc2VsZWN0PSJmZnQiCiBzcGVjdHJ1bXN5bnRoX2ZpbHRlcl9kZXBzPSJhdmNvZGVjIgogc3BlY3RydW1zeW50aF9maWx0ZXJfc2VsZWN0PSJmZnQiCkBAIC0yOTEzLDUzICszNDE0LDg0IEBACiB0aW50ZXJsYWNlX2ZpbHRlcl9kZXBzPSJncGwiCiB0aW50ZXJsYWNlX21lcmdlX3Rlc3RfZGVwcz0idGludGVybGFjZV9maWx0ZXIiCiB0aW50ZXJsYWNlX3BhZF90ZXN0X2RlcHM9InRpbnRlcmxhY2VfZmlsdGVyIgordG9uZW1hcF9maWx0ZXJfZGVwcz0iY29uc3RfbmFuIgordW5zaGFycF9vcGVuY2xfZmlsdGVyX2RlcHM9Im9wZW5jbCIKIHVzcHBfZmlsdGVyX2RlcHM9ImdwbCBhdmNvZGVjIgordmFndWVkZW5vaXNlcl9maWx0ZXJfZGVwcz0iZ3BsIgogdmlkc3RhYmRldGVjdF9maWx0ZXJfZGVwcz0ibGlidmlkc3RhYiIKIHZpZHN0YWJ0cmFuc2Zvcm1fZmlsdGVyX2RlcHM9ImxpYnZpZHN0YWIiCitsaWJ2bWFmX2ZpbHRlcl9kZXBzPSJsaWJ2bWFmIHB0aHJlYWRzIgogem1xX2ZpbHRlcl9kZXBzPSJsaWJ6bXEiCiB6b29tcGFuX2ZpbHRlcl9kZXBzPSJzd3NjYWxlIgotenNjYWxlX2ZpbHRlcl9kZXBzPSJsaWJ6aW1nIgorenNjYWxlX2ZpbHRlcl9kZXBzPSJsaWJ6aW1nIGNvbnN0X25hbiIKK3NjYWxlX3ZhYXBpX2ZpbHRlcl9kZXBzPSJ2YWFwaSBWQVByb2NQaXBlbGluZVBhcmFtZXRlckJ1ZmZlciIKK3ZwcF9xc3ZfZmlsdGVyX2RlcHM9ImxpYm1meCIKK3ZwcF9xc3ZfZmlsdGVyX3NlbGVjdD0icXN2dnBwIgogCiAjIGV4YW1wbGVzCi1hdmNvZGVjX2V4YW1wbGVfZGVwcz0iYXZjb2RlYyBhdnV0aWwiCi1hdmlvX2Rpcl9jbWQ9ImF2Zm9ybWF0IGF2dXRpbCIKLWF2aW9fcmVhZGluZz0iYXZmb3JtYXQgYXZjb2RlYyBhdnV0aWwiCi1kZWNvZGluZ19lbmNvZGluZ19leGFtcGxlX2RlcHM9ImF2Y29kZWMgYXZmb3JtYXQgYXZ1dGlsIgorYXZpb19kaXJfY21kX2RlcHM9ImF2Zm9ybWF0IGF2dXRpbCIKK2F2aW9fcmVhZGluZ19kZXBzPSJhdmZvcm1hdCBhdmNvZGVjIGF2dXRpbCIKK2RlY29kZV9hdWRpb19leGFtcGxlX2RlcHM9ImF2Y29kZWMgYXZ1dGlsIgorZGVjb2RlX3ZpZGVvX2V4YW1wbGVfZGVwcz0iYXZjb2RlYyBhdnV0aWwiCiBkZW11eGluZ19kZWNvZGluZ19leGFtcGxlX2RlcHM9ImF2Y29kZWMgYXZmb3JtYXQgYXZ1dGlsIgorZW5jb2RlX2F1ZGlvX2V4YW1wbGVfZGVwcz0iYXZjb2RlYyBhdnV0aWwiCitlbmNvZGVfdmlkZW9fZXhhbXBsZV9kZXBzPSJhdmNvZGVjIGF2dXRpbCIKIGV4dHJhY3RfbXZzX2V4YW1wbGVfZGVwcz0iYXZjb2RlYyBhdmZvcm1hdCBhdnV0aWwiCiBmaWx0ZXJfYXVkaW9fZXhhbXBsZV9kZXBzPSJhdmZpbHRlciBhdnV0aWwiCiBmaWx0ZXJpbmdfYXVkaW9fZXhhbXBsZV9kZXBzPSJhdmZpbHRlciBhdmNvZGVjIGF2Zm9ybWF0IGF2dXRpbCIKIGZpbHRlcmluZ192aWRlb19leGFtcGxlX2RlcHM9ImF2ZmlsdGVyIGF2Y29kZWMgYXZmb3JtYXQgYXZ1dGlsIgoraHR0cF9tdWx0aWNsaWVudF9leGFtcGxlX2RlcHM9ImF2Zm9ybWF0IGF2dXRpbCBmb3JrIgoraHdfZGVjb2RlX2V4YW1wbGVfZGVwcz0iYXZjb2RlYyBhdmZvcm1hdCBhdnV0aWwiCiBtZXRhZGF0YV9leGFtcGxlX2RlcHM9ImF2Zm9ybWF0IGF2dXRpbCIKIG11eGluZ19leGFtcGxlX2RlcHM9ImF2Y29kZWMgYXZmb3JtYXQgYXZ1dGlsIHN3c2NhbGUiCi1xc3ZkZWNfZXhhbXBsZV9kZXBzPSJhdmNvZGVjIGF2dXRpbCBsaWJtZnggaDI2NF9xc3ZfZGVjb2RlciB2YWFwaV94MTEiCitxc3ZkZWNfZXhhbXBsZV9kZXBzPSJhdmNvZGVjIGF2dXRpbCBsaWJtZnggaDI2NF9xc3ZfZGVjb2RlciIKIHJlbXV4aW5nX2V4YW1wbGVfZGVwcz0iYXZjb2RlYyBhdmZvcm1hdCBhdnV0aWwiCiByZXNhbXBsaW5nX2F1ZGlvX2V4YW1wbGVfZGVwcz0iYXZ1dGlsIHN3cmVzYW1wbGUiCiBzY2FsaW5nX3ZpZGVvX2V4YW1wbGVfZGVwcz0iYXZ1dGlsIHN3c2NhbGUiCiB0cmFuc2NvZGVfYWFjX2V4YW1wbGVfZGVwcz0iYXZjb2RlYyBhdmZvcm1hdCBzd3Jlc2FtcGxlIgogdHJhbnNjb2RpbmdfZXhhbXBsZV9kZXBzPSJhdmZpbHRlciBhdmNvZGVjIGF2Zm9ybWF0IGF2dXRpbCIKK3ZhYXBpX2VuY29kZV9leGFtcGxlX2RlcHM9ImF2Y29kZWMgYXZ1dGlsIGgyNjRfdmFhcGlfZW5jb2RlciIKK3ZhYXBpX3RyYW5zY29kZV9leGFtcGxlX2RlcHM9ImF2Y29kZWMgYXZmb3JtYXQgYXZ1dGlsIGgyNjRfdmFhcGlfZW5jb2RlciIKIAotIyBsaWJyYXJpZXMsIGluIGxpbmtpbmcgb3JkZXIKKyMgRVhUUkFMSUJTX0xJU1QKK2NwdV9pbml0X2V4dHJhbGlicz0icHRocmVhZHNfZXh0cmFsaWJzIgorY3dzMmZ3c19leHRyYWxpYnM9InpsaWJfZXh0cmFsaWJzIgorCisjIGxpYnJhcmllcywgaW4gYW55IG9yZGVyCiBhdmNvZGVjX2RlcHM9ImF2dXRpbCIKK2F2Y29kZWNfc3VnZ2VzdD0ibGlibSIKK2F2Y29kZWNfc2VsZWN0PSJudWxsX2JzZiIKIGF2ZGV2aWNlX2RlcHM9ImF2Zm9ybWF0IGF2Y29kZWMgYXZ1dGlsIgorYXZkZXZpY2Vfc3VnZ2VzdD0ibGlibSIKIGF2ZmlsdGVyX2RlcHM9ImF2dXRpbCIKK2F2ZmlsdGVyX3N1Z2dlc3Q9ImxpYm0iCiBhdmZvcm1hdF9kZXBzPSJhdmNvZGVjIGF2dXRpbCIKK2F2Zm9ybWF0X3N1Z2dlc3Q9ImxpYm0gbmV0d29yayB6bGliIgogYXZyZXNhbXBsZV9kZXBzPSJhdnV0aWwiCithdnJlc2FtcGxlX3N1Z2dlc3Q9ImxpYm0iCithdnV0aWxfc3VnZ2VzdD0iY2xvY2tfZ2V0dGltZSBmZm52Y29kZWMgbGlibSBsaWJkcm0gbGlibWZ4IG9wZW5jbCB1c2VyMzIgdmFhcGkgdmlkZW90b29sYm94IGNvcmVmb3VuZGF0aW9uIGNvcmV2aWRlbyBjb3JlbWVkaWEgYmNyeXB0IgogcG9zdHByb2NfZGVwcz0iYXZ1dGlsIGdwbCIKK3Bvc3Rwcm9jX3N1Z2dlc3Q9ImxpYm0iCiBzd3Jlc2FtcGxlX2RlcHM9ImF2dXRpbCIKK3N3cmVzYW1wbGVfc3VnZ2VzdD0ibGlibSBsaWJzb3hyIgogc3dzY2FsZV9kZXBzPSJhdnV0aWwiCitzd3NjYWxlX3N1Z2dlc3Q9ImxpYm0iCisKK2F2Y29kZWNfZXh0cmFsaWJzPSJwdGhyZWFkc19leHRyYWxpYnMgaWNvbnZfZXh0cmFsaWJzIgorYXZmaWx0ZXJfZXh0cmFsaWJzPSJwdGhyZWFkc19leHRyYWxpYnMiCithdnV0aWxfZXh0cmFsaWJzPSJkM2QxMXZhX2V4dHJhbGlicyBuYW5vc2xlZXBfZXh0cmFsaWJzIHB0aHJlYWRzX2V4dHJhbGlicyB2YWFwaV9kcm1fZXh0cmFsaWJzIHZhYXBpX3gxMV9leHRyYWxpYnMgdmRwYXVfeDExX2V4dHJhbGlicyIKIAogIyBwcm9ncmFtcwogZmZtcGVnX2RlcHM9ImF2Y29kZWMgYXZmaWx0ZXIgYXZmb3JtYXQgc3dyZXNhbXBsZSIKIGZmbXBlZ19zZWxlY3Q9ImFmb3JtYXRfZmlsdGVyIGFudWxsX2ZpbHRlciBhdHJpbV9maWx0ZXIgZm9ybWF0X2ZpbHRlcgogICAgICAgICAgICAgICAgbnVsbF9maWx0ZXIKLSAgICAgICAgICAgICAgIHNldHB0c19maWx0ZXIgdHJpbV9maWx0ZXIiCi1mZnBsYXlfZGVwcz0iYXZjb2RlYyBhdmZvcm1hdCBzd3NjYWxlIHN3cmVzYW1wbGUgc2RsIgotZmZwbGF5X2xpYnM9JyRzZGxfbGlicycKKyAgICAgICAgICAgICAgIHRyaW1fZmlsdGVyIgorZmZtcGVnX3N1Z2dlc3Q9Im9sZTMyIHBzYXBpIHNoZWxsMzIiCitmZnBsYXlfZGVwcz0iYXZjb2RlYyBhdmZvcm1hdCBzd3NjYWxlIHN3cmVzYW1wbGUgc2RsMiIKIGZmcGxheV9zZWxlY3Q9InJkZnQgY3JvcF9maWx0ZXIgdHJhbnNwb3NlX2ZpbHRlciBoZmxpcF9maWx0ZXIgdmZsaXBfZmlsdGVyIHJvdGF0ZV9maWx0ZXIiCitmZnBsYXlfc3VnZ2VzdD0ic2hlbGwzMiIKIGZmcHJvYmVfZGVwcz0iYXZjb2RlYyBhdmZvcm1hdCIKLWZmc2VydmVyX2RlcHM9ImF2Zm9ybWF0IGZvcmsgc2FyZXN0YXJ0IgotZmZzZXJ2ZXJfc2VsZWN0PSJmZm1fbXV4ZXIgcnRwX3Byb3RvY29sIHJ0c3BfZGVtdXhlciIKK2ZmcHJvYmVfc3VnZ2VzdD0ic2hlbGwzMiIKIAogIyBkb2N1bWVudGF0aW9uCiBwb2RwYWdlc19kZXBzPSJwZXJsIgpAQCAtMjk3MSw3ICszNTAzLDcgQEAKIAogIyBkZWZhdWx0IHBhcmFtZXRlcnMKIAotbG9nZmlsZT0iY29uZmlnLmxvZyIKK2xvZ2ZpbGU9ImZmYnVpbGQvY29uZmlnLmxvZyIKIAogIyBpbnN0YWxsYXRpb24gcGF0aHMKIHByZWZpeF9kZWZhdWx0PSIvdXNyL2xvY2FsIgpAQCAtMjk4NywxNyArMzUxOSwyMCBAQAogY2NfZGVmYXVsdD0iZ2NjIgogY3h4X2RlZmF1bHQ9ImcrKyIKIGhvc3RfY2NfZGVmYXVsdD0iZ2NjIgotY3BfZj0iY3AgLWYiCiBkb3h5Z2VuX2RlZmF1bHQ9ImRveHlnZW4iCiBpbnN0YWxsPSJpbnN0YWxsIgotbG5fcz0ibG4gLXMgLWYiCitsbl9zX2RlZmF1bHQ9ImxuIC1zIC1mIgogbm1fZGVmYXVsdD0ibm0gLWciCi1vYmpmb3JtYXQ9ImVsZiIKIHBrZ19jb25maWdfZGVmYXVsdD1wa2ctY29uZmlnCiByYW5saWJfZGVmYXVsdD0icmFubGliIgogc3RyaXBfZGVmYXVsdD0ic3RyaXAiCi15YXNtZXhlX2RlZmF1bHQ9Inlhc20iCit2ZXJzaW9uX3NjcmlwdD0nLS12ZXJzaW9uLXNjcmlwdCcKK29iamZvcm1hdD0iZWxmMzIiCit4ODZhc21leGVfZGVmYXVsdD0ibmFzbSIKIHdpbmRyZXNfZGVmYXVsdD0id2luZHJlcyIKK252Y2NfZGVmYXVsdD0ibnZjYyIKK252Y2NmbGFnc19kZWZhdWx0PSItZ2VuY29kZSBhcmNoPWNvbXB1dGVfMzAsY29kZT1zbV8zMCAtTzIiCitzdHJpcHR5cGU9ImRpcmVjdCIKIAogIyBPUwogdGFyZ2V0X29zX2RlZmF1bHQ9JCh0b2xvd2VyICQodW5hbWUgLXMpKQpAQCAtMzAzNCw5ICszNTY5LDExIEBACiBzd3NfbWF4X2ZpbHRlcl9zaXplX2RlZmF1bHQ9MjU2CiBzZXRfZGVmYXVsdCBzd3NfbWF4X2ZpbHRlcl9zaXplCiAKLSMgRW5hYmxlIGh3YWNjZWxzIGJ5IGRlZmF1bHQuCi1lbmFibGUgZDNkMTF2YSBkeHZhMiB2YWFwaSB2ZGEgdmRwYXUgdmlkZW90b29sYm94IHh2bWMKLWVuYWJsZSB4bGliCisjIGludGVybmFsIGNvbXBvbmVudHMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdAorZW5hYmxlICRFWFRSQUxJQlNfTElTVAorCisjIEF2b2lkIGV4dGVybmFsLCBub24tc3lzdGVtLCBsaWJyYXJpZXMgZ2V0dGluZyBlbmFibGVkIGJ5IGRlcGVuZGVuY3kgcmVzb2x1dGlvbgorZGlzYWJsZSAkRVhURVJOQUxfTElCUkFSWV9MSVNUICRIV0FDQ0VMX0xJQlJBUllfTElTVAogCiAjIGJ1aWxkIHNldHRpbmdzCiBTSEZMQUdTPSctc2hhcmVkIC1XbCwtc29uYW1lLCQkKEBGKScKQEAgLTMwNTIsNiArMzU4OSw3IEBACiBMSUJfSU5TVEFMTF9FWFRSQV9DTUQ9JyQkKFJBTkxJQikgIiQoTElCRElSKS8kKExJQk5BTUUpIicKIFNMSUJfSU5TVEFMTF9OQU1FPSckKFNMSUJOQU1FX1dJVEhfVkVSU0lPTiknCiBTTElCX0lOU1RBTExfTElOS1M9JyQoU0xJQk5BTUVfV0lUSF9NQUpPUikgJChTTElCTkFNRSknCitWRVJTSU9OX1NDUklQVF9QT1NUUFJPQ0VTU19DTUQ9ImNhdCIKIAogYXNmbGFnc19maWx0ZXI9ZWNobwogY2ZsYWdzX2ZpbHRlcj1lY2hvCkBAIC0zMDY3LDYgKzM2MDUsNyBAQAogT0JKQ0NfQz0nLWMnCiBPQkpDQ19FPSctRSAtbyAkQCcKIE9CSkNDX089Jy1vICRAJworWDg2QVNNX089Jy1vICRAJwogTERfTz0nLW8gJEAnCiBMRF9MSUI9Jy1sJScKIExEX1BBVEg9Jy1MJwpAQCAtMzA3NCw4ICszNjEzLDEwIEBACiBIT1NUQ0NfRT0nLUUgLW8gJEAnCiBIT1NUQ0NfTz0nLW8gJEAnCiBIT1NUTERfTz0nLW8gJEAnCitOVkNDX0M9Jy1jJworTlZDQ19PPSctbyAkQCcKIAotaG9zdF9saWJzPSctbG0nCitob3N0X2V4dHJhbGlicz0nLWxtJwogaG9zdF9jZmxhZ3NfZmlsdGVyPWVjaG8KIGhvc3RfbGRmbGFnc19maWx0ZXI9ZWNobwogCkBAIC0zMDg2LDYgKzM2MjcsOCBAQAogREVQQ01EPSckKERFUCQoMSkpICQoREVQJCgxKUZMQUdTKSAkKCQoMSlERVBfRkxBR1MpICQ8IDI+L2Rldi9udWxsIHwgc2VkIC1lICIvXlwjLiovZCIgLWUgInMsXltbOnNwYWNlOl1dKiQoQEYpLCQoQEQpLyQoQEYpLCIgPiAkKEA6Lm89LmQpJwogREVQRkxBR1M9Jy1NTScKIAorbWtkaXIgLXAgZmZidWlsZAorCiAjIGZpbmQgc291cmNlIHBhdGgKIGlmIHRlc3QgLWYgY29uZmlndXJlOyB0aGVuCiAgICAgc291cmNlX3BhdGg9LgpAQCAtMzEwNSwzOSArMzY0OCw2NiBAQAogICAgIEZGTVBFR19DT05GSUdVUkFUSU9OPSIke0ZGTVBFR19DT05GSUdVUkFUSU9OIyB9ICR7bH0ke3J9IgogZG9uZQogCi1maW5kX3RoaW5ncygpeworZmluZF90aGluZ3NfZXh0ZXJuKCl7CiAgICAgdGhpbmc9JDEKICAgICBwYXR0ZXJuPSQyCiAgICAgZmlsZT0kc291cmNlX3BhdGgvJDMKLSAgICBzZWQgLW4gInMvXlteI10qJHBhdHRlcm4uKihbXixdKiwgKlwoW14sXSpcKVwoLC4qXCkqKS4qL1wxXyR0aGluZy9wIiAiJGZpbGUiCisgICAgb3V0PSR7NDotJHRoaW5nfQorICAgIHNlZCAtbiAicy9eW14jXSpleHRlcm4uKiRwYXR0ZXJuICpmZl9cKFteIF0qXClfJHRoaW5nOy9cMV8kb3V0L3AiICIkZmlsZSIKIH0KIAotRU5DT0RFUl9MSVNUPSQoZmluZF90aGluZ3MgIGVuY29kZXIgIEVOQyAgICAgIGxpYmF2Y29kZWMvYWxsY29kZWNzLmMpCi1ERUNPREVSX0xJU1Q9JChmaW5kX3RoaW5ncyAgZGVjb2RlciAgREVDICAgICAgbGliYXZjb2RlYy9hbGxjb2RlY3MuYykKLUhXQUNDRUxfTElTVD0kKGZpbmRfdGhpbmdzICBod2FjY2VsICBIV0FDQ0VMICBsaWJhdmNvZGVjL2FsbGNvZGVjcy5jKQotUEFSU0VSX0xJU1Q9JChmaW5kX3RoaW5ncyAgIHBhcnNlciAgIFBBUlNFUiAgIGxpYmF2Y29kZWMvYWxsY29kZWNzLmMpCi1CU0ZfTElTVD0kKGZpbmRfdGhpbmdzICAgICAgYnNmICAgICAgQlNGICAgICAgbGliYXZjb2RlYy9hbGxjb2RlY3MuYykKLU1VWEVSX0xJU1Q9JChmaW5kX3RoaW5ncyAgICBtdXhlciAgICBfTVVYICAgICBsaWJhdmZvcm1hdC9hbGxmb3JtYXRzLmMpCi1ERU1VWEVSX0xJU1Q9JChmaW5kX3RoaW5ncyAgZGVtdXhlciAgREVNVVggICAgbGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jKQotT1VUREVWX0xJU1Q9JChmaW5kX3RoaW5ncyAgIG91dGRldiAgIE9VVERFViAgIGxpYmF2ZGV2aWNlL2FsbGRldmljZXMuYykKLUlOREVWX0xJU1Q9JChmaW5kX3RoaW5ncyAgICBpbmRldiAgICBfSU4gICAgICBsaWJhdmRldmljZS9hbGxkZXZpY2VzLmMpCi1QUk9UT0NPTF9MSVNUPSQoZmluZF90aGluZ3MgcHJvdG9jb2wgUFJPVE9DT0wgbGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jKQotRklMVEVSX0xJU1Q9JChmaW5kX3RoaW5ncyAgIGZpbHRlciAgIEZJTFRFUiAgIGxpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYykKK2ZpbmRfZmlsdGVyc19leHRlcm4oKXsKKyAgICBmaWxlPSRzb3VyY2VfcGF0aC8kMQorICAgICNzZWQgLW4gInMvXmV4dGVybiBBVkZpbHRlciBmZl9cKFthdmZzaW5rcmNdXHsyLDVcfVwpX1woXHdcK1wpOy9cMl9maWx0ZXIvcCIgJGZpbGUKKyAgICBzZWQgLUUgLW4gInMvXmV4dGVybiBBVkZpbHRlciBmZl8oW2F2ZnNpbmtyY117Miw1fSlfKFthLXpBLVowLTlfXSspOy9cMl9maWx0ZXIvcCIgJGZpbGUKK30KIAotQUxMX0NPTVBPTkVOVFM9IgorRklMVEVSX0xJU1Q9JChmaW5kX2ZpbHRlcnNfZXh0ZXJuIGxpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYykKK09VVERFVl9MSVNUPSQoZmluZF90aGluZ3NfZXh0ZXJuIG11eGVyIEFWT3V0cHV0Rm9ybWF0IGxpYmF2ZGV2aWNlL2FsbGRldmljZXMuYyBvdXRkZXYpCitJTkRFVl9MSVNUPSQoZmluZF90aGluZ3NfZXh0ZXJuIGRlbXV4ZXIgQVZJbnB1dEZvcm1hdCBsaWJhdmRldmljZS9hbGxkZXZpY2VzLmMgaW5kZXYpCitNVVhFUl9MSVNUPSQoZmluZF90aGluZ3NfZXh0ZXJuIG11eGVyIEFWT3V0cHV0Rm9ybWF0IGxpYmF2Zm9ybWF0L2FsbGZvcm1hdHMuYykKK0RFTVVYRVJfTElTVD0kKGZpbmRfdGhpbmdzX2V4dGVybiBkZW11eGVyIEFWSW5wdXRGb3JtYXQgbGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jKQorRU5DT0RFUl9MSVNUPSQoZmluZF90aGluZ3NfZXh0ZXJuIGVuY29kZXIgQVZDb2RlYyBsaWJhdmNvZGVjL2FsbGNvZGVjcy5jKQorREVDT0RFUl9MSVNUPSQoZmluZF90aGluZ3NfZXh0ZXJuIGRlY29kZXIgQVZDb2RlYyBsaWJhdmNvZGVjL2FsbGNvZGVjcy5jKQorQ09ERUNfTElTVD0iCisgICAgJEVOQ09ERVJfTElTVAorICAgICRERUNPREVSX0xJU1QKKyIKK1BBUlNFUl9MSVNUPSQoZmluZF90aGluZ3NfZXh0ZXJuIHBhcnNlciBBVkNvZGVjUGFyc2VyIGxpYmF2Y29kZWMvcGFyc2VyLmMpCitCU0ZfTElTVD0kKGZpbmRfdGhpbmdzX2V4dGVybiBic2YgQVZCaXRTdHJlYW1GaWx0ZXIgbGliYXZjb2RlYy9iaXRzdHJlYW1fZmlsdGVycy5jKQorSFdBQ0NFTF9MSVNUPSQoZmluZF90aGluZ3NfZXh0ZXJuIGh3YWNjZWwgQVZIV0FjY2VsIGxpYmF2Y29kZWMvaHdhY2NlbHMuaCkKK1BST1RPQ09MX0xJU1Q9JChmaW5kX3RoaW5nc19leHRlcm4gcHJvdG9jb2wgVVJMUHJvdG9jb2wgbGliYXZmb3JtYXQvcHJvdG9jb2xzLmMpCisKK0FWQ09ERUNfQ09NUE9ORU5UU19MSVNUPSIKICAgICAkQlNGX0xJU1QKICAgICAkREVDT0RFUl9MSVNUCi0gICAgJERFTVVYRVJfTElTVAogICAgICRFTkNPREVSX0xJU1QKLSAgICAkRklMVEVSX0xJU1QKICAgICAkSFdBQ0NFTF9MSVNUCi0gICAgJElOREVWX0xJU1QKLSAgICAkTVVYRVJfTElTVAotICAgICRPVVRERVZfTElTVAogICAgICRQQVJTRVJfTElTVAorIgorCitBVkRFVklDRV9DT01QT05FTlRTX0xJU1Q9IgorICAgICRJTkRFVl9MSVNUCisgICAgJE9VVERFVl9MSVNUCisiCisKK0FWRklMVEVSX0NPTVBPTkVOVFNfTElTVD0iCisgICAgJEZJTFRFUl9MSVNUCisiCisKK0FWRk9STUFUX0NPTVBPTkVOVFNfTElTVD0iCisgICAgJERFTVVYRVJfTElTVAorICAgICRNVVhFUl9MSVNUCiAgICAgJFBST1RPQ09MX0xJU1QKICIKIAorQUxMX0NPTVBPTkVOVFM9IgorICAgICRBVkNPREVDX0NPTVBPTkVOVFNfTElTVAorICAgICRBVkRFVklDRV9DT01QT05FTlRTX0xJU1QKKyAgICAkQVZGSUxURVJfQ09NUE9ORU5UU19MSVNUCisgICAgJEFWRk9STUFUX0NPTVBPTkVOVFNfTElTVAorIgorCiBmb3IgbiBpbiAkQ09NUE9ORU5UX0xJU1Q7IGRvCiAgICAgdj0kKHRvdXBwZXIgJHtuJXN9KV9MSVNUCiAgICAgZXZhbCBlbmFibGUgXCQkdgpAQCAtMzE5NCw4ICszNzY0LDEzIEBACiAgICAgICAgIC0tZXh0cmEtbGRleGVmbGFncz0qKQogICAgICAgICAgICAgYWRkX2xkZXhlZmxhZ3MgJG9wdHZhbAogICAgICAgICA7OworICAgICAgICAtLWV4dHJhLWxkc29mbGFncz0qKQorICAgICAgICAgICAgYWRkX2xkc29mbGFncyAkb3B0dmFsCisgICAgICAgIDs7CiAgICAgICAgIC0tZXh0cmEtbGRsaWJmbGFncz0qKQotICAgICAgICAgICAgYWRkX2xkbGliZmxhZ3MgJG9wdHZhbAorICAgICAgICAgICAgd2FybiAiVGhlIC0tZXh0cmEtbGRsaWJmbGFncyBvcHRpb24gaXMgb25seSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgd2lsbCBiZVxuIlwKKyAgICAgICAgICAgICAgICAgInJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gVXNlIC0tZXh0cmEtbGRzb2ZsYWdzIGluc3RlYWQuIgorICAgICAgICAgICAgYWRkX2xkc29mbGFncyAkb3B0dmFsCiAgICAgICAgIDs7CiAgICAgICAgIC0tZXh0cmEtbGlicz0qKQogICAgICAgICAgICAgYWRkX2V4dHJhbGlicyAkb3B0dmFsCkBAIC0zMjI1LDYgKzM4MDAsOSBAQAogICAgICAgICAgICAgYWN0aW9uPSR7b3B0JSUtcmFuZG9tPSp9CiAgICAgICAgICAgICBkb19yYW5kb20gJHthY3Rpb24jLS19ICRvcHR2YWwKICAgICAgICAgOzsKKyAgICAgICAgLS1lbmFibGUtc2RsKQorICAgICAgICAgICAgZW5hYmxlIHNkbDIKKyAgICAgICAgOzsKICAgICAgICAgLS1lbmFibGUtKj0qfC0tZGlzYWJsZS0qPSopCiAgICAgICAgICAgICBldmFsICQoZWNobyAiJHtvcHQlJT0qfSIgfCBzZWQgJ3MvLS0vYWN0aW9uPS87cy8tLyB0aGluZz0vJykKICAgICAgICAgICAgIGlzX2luICIke3RoaW5nfXMiICRDT01QT05FTlRfTElTVCB8fCBkaWVfdW5rbm93biAiJG9wdCIKQEAgLTMyMzQsNiArMzgxMiwxNiBAQAogICAgICAgICAgICAgWyAiJGxpc3QiID0gIiIgXSAmJiB3YXJuICJPcHRpb24gJG9wdCBkaWQgbm90IG1hdGNoIGFueXRoaW5nIgogICAgICAgICAgICAgJGFjdGlvbiAkbGlzdAogICAgICAgICA7OworICAgICAgICAtLWVuYWJsZS15YXNtfC0tZGlzYWJsZS15YXNtKQorICAgICAgICAgICAgd2FybiAiVGhlICR7b3B0fSBvcHRpb24gaXMgb25seSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgd2lsbCBiZVxuIlwKKyAgICAgICAgICAgICAgICAgInJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gVXNlIC0tZW5hYmxlLXg4NmFzbSAvIC0tZGlzYWJsZS14ODZhc20gaW5zdGVhZC4iCisgICAgICAgICAgICB0ZXN0ICRvcHQgPSAtLWVuYWJsZS15YXNtICYmIHg4NmFzbT15ZXMgfHwgeDg2YXNtPW5vCisgICAgICAgIDs7CisgICAgICAgIC0teWFzbWV4ZT0qKQorICAgICAgICAgICAgd2FybiAiVGhlIC0teWFzbWV4ZSBvcHRpb24gaXMgb25seSBwcm92aWRlZCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgd2lsbCBiZVxuIlwKKyAgICAgICAgICAgICAgICAgInJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gVXNlIC0teDg2YXNtZXhlIGluc3RlYWQuIgorICAgICAgICAgICAgeDg2YXNtZXhlPSIkb3B0dmFsIgorICAgICAgICA7OwogICAgICAgICAtLWVuYWJsZS0/KnwtLWRpc2FibGUtPyopCiAgICAgICAgICAgICBldmFsICQoZWNobyAiJG9wdCIgfCBzZWQgJ3MvLS0vYWN0aW9uPS87cy8tLyBvcHRpb249LztzLy0vXy9nJykKICAgICAgICAgICAgIGlmIGlzX2luICRvcHRpb24gJENPTVBPTkVOVF9MSVNUOyB0aGVuCkBAIC0zMjUzLDggKzM4NDEsMTMgQEAKICAgICAgICAgOzsKICAgICAgICAgLS1oZWxwfC1oKSBzaG93X2hlbHAKICAgICAgICAgOzsKKyAgICAgICAgLS1xdWlldHwtcSkgcXVpZXQ9eWVzCisgICAgICAgIDs7CiAgICAgICAgIC0tZmF0YWwtd2FybmluZ3MpIGVuYWJsZSBmYXRhbF93YXJuaW5ncwogICAgICAgICA7OworICAgICAgICAtLWxpYmZ1enplcj0qKQorICAgICAgICAgICAgbGliZnV6emVyX3BhdGg9IiRvcHR2YWwiCisgICAgICAgIDs7CiAgICAgICAgICopCiAgICAgICAgICAgICBvcHRuYW1lPSIke29wdCUlPSp9IgogICAgICAgICAgICAgb3B0bmFtZT0iJHtvcHRuYW1lIy0tfSIKQEAgLTMyNzQsOCArMzg2Nyw2OSBAQAogICAgIGV2YWwgImV4cG9ydCAkZSIKIGRvbmUKIAoraWYgZGlzYWJsZWQgYXV0b2RldGVjdDsgdGhlbgorCisgICAgIyBVbmxlc3MgaWNvbnYgaXMgZXhwbGljaXRlbHkgZGlzYWJsZWQgYnkgdGhlIHVzZXIsIHdlIHN0aWxsIHdhbnQgdG8gcHJvYmUKKyAgICAjIGZvciB0aGUgaWNvbnYgZnJvbSB0aGUgbGliYy4KKyAgICBkaXNhYmxlZCBpY29udiB8fCBlbmFibGUgbGliY19pY29udgorCisgICAgZGlzYWJsZV93ZWFrICRFWFRFUk5BTF9BVVRPREVURUNUX0xJQlJBUllfTElTVAorICAgIGRpc2FibGVfd2VhayAkSFdBQ0NFTF9BVVRPREVURUNUX0xJQlJBUllfTElTVAorZmkKKyMgTWFyayBzcGVjaWZpY2FsbHkgZW5hYmxlZCwgYnV0IG5vcm1hbGx5IGF1dG9kZXRlY3RlZCBsaWJyYXJpZXMgYXMgcmVxdWVzdGVkLgorZm9yIGxpYiBpbiAkQVVUT0RFVEVDVF9MSUJTOyBkbworICAgIGVuYWJsZWQgJGxpYiAmJiByZXF1ZXN0ICRsaWIKK2RvbmUKKyNUT0RPOiBzd2l0Y2ggdG8gJEFVVE9ERVRFQ1RfTElCUyB3aGVuICRUSFJFQURTX0xJU1QgaXMgc3VwcG9ydGVkIHRoZSBzYW1lIHdheQorZW5hYmxlX3dlYWsgJEVYVEVSTkFMX0FVVE9ERVRFQ1RfTElCUkFSWV9MSVNUCitlbmFibGVfd2VhayAkSFdBQ0NFTF9BVVRPREVURUNUX0xJQlJBUllfTElTVAorCiBkaXNhYmxlZCBsb2dnaW5nICYmIGxvZ2ZpbGU9L2Rldi9udWxsCiAKKyMgY29tbWFuZCBsaW5lIGNvbmZpZ3VyYXRpb24gc2FuaXR5IGNoZWNrcworCisjIHdlIG5lZWQgdG8gYnVpbGQgYXQgbGVhc3Qgb25lIGxpYiB0eXBlCitpZiAhIGVuYWJsZWRfYW55IHN0YXRpYyBzaGFyZWQ7IHRoZW4KKyAgICBjYXQgPDxFT0YKK0F0IGxlYXN0IG9uZSBsaWJyYXJ5IHR5cGUgbXVzdCBiZSBidWlsdC4KK1NwZWNpZnkgLS1lbmFibGUtc3RhdGljIHRvIGJ1aWxkIHRoZSBzdGF0aWMgbGlicmFyaWVzIG9yIC0tZW5hYmxlLXNoYXJlZCB0bworYnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYXMgd2VsbC4gVG8gb25seSBidWlsZCB0aGUgc2hhcmVkIGxpYnJhcmllcyBzcGVjaWZ5CistLWRpc2FibGUtc3RhdGljIGluIGFkZGl0aW9uIHRvIC0tZW5hYmxlLXNoYXJlZC4KK0VPRgorICAgIGV4aXQgMQorZmkKKworZGllX2xpY2Vuc2VfZGlzYWJsZWQoKSB7CisgICAgZW5hYmxlZCAkMSB8fCB7IGVuYWJsZWQgJHYgJiYgZGllICIkdiBpcyAkMSBhbmQgLS1lbmFibGUtJDEgaXMgbm90IHNwZWNpZmllZC4iOyB9Cit9CisKK2RpZV9saWNlbnNlX2Rpc2FibGVkX2dwbCgpIHsKKyAgICBlbmFibGVkICQxIHx8IHsgZW5hYmxlZCAkdiAmJiBkaWUgIiR2IGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBncGwgYW5kIC0tZW5hYmxlLSQxIGlzIG5vdCBzcGVjaWZpZWQuIjsgfQorfQorCittYXAgImRpZV9saWNlbnNlX2Rpc2FibGVkIGdwbCIgICAgICAkRVhURVJOQUxfTElCUkFSWV9HUExfTElTVCAkRVhURVJOQUxfTElCUkFSWV9HUExWM19MSVNUCittYXAgImRpZV9saWNlbnNlX2Rpc2FibGVkIHZlcnNpb24zIiAkRVhURVJOQUxfTElCUkFSWV9WRVJTSU9OM19MSVNUICRFWFRFUk5BTF9MSUJSQVJZX0dQTFYzX0xJU1QKKworZW5hYmxlZCBncGwgJiYgbWFwICJkaWVfbGljZW5zZV9kaXNhYmxlZF9ncGwgbm9uZnJlZSIgJEVYVEVSTkFMX0xJQlJBUllfTk9ORlJFRV9MSVNUCittYXAgImRpZV9saWNlbnNlX2Rpc2FibGVkIG5vbmZyZWUiICRIV0FDQ0VMX0xJQlJBUllfTk9ORlJFRV9MSVNUCisKK2VuYWJsZWQgdmVyc2lvbjMgJiYgeyBlbmFibGVkIGdwbCAmJiBlbmFibGUgZ3BsdjMgfHwgZW5hYmxlIGxncGx2MzsgfQorCitpZiBlbmFibGVkIG5vbmZyZWU7IHRoZW4KKyAgICBsaWNlbnNlPSJub25mcmVlIGFuZCB1bnJlZGlzdHJpYnV0YWJsZSIKK2VsaWYgZW5hYmxlZCBncGx2MzsgdGhlbgorICAgIGxpY2Vuc2U9IkdQTCB2ZXJzaW9uIDMgb3IgbGF0ZXIiCitlbGlmIGVuYWJsZWQgbGdwbHYzOyB0aGVuCisgICAgbGljZW5zZT0iTEdQTCB2ZXJzaW9uIDMgb3IgbGF0ZXIiCitlbGlmIGVuYWJsZWQgZ3BsOyB0aGVuCisgICAgbGljZW5zZT0iR1BMIHZlcnNpb24gMiBvciBsYXRlciIKK2Vsc2UKKyAgICBsaWNlbnNlPSJMR1BMIHZlcnNpb24gMi4xIG9yIGxhdGVyIgorZmkKKworZW5hYmxlZF9hbGwgZ251dGxzIG9wZW5zc2wgJiYKKyAgICBkaWUgIkdudVRMUyBhbmQgT3BlblNTTCBtdXN0IG5vdCBiZSBlbmFibGVkIGF0IHRoZSBzYW1lIHRpbWUuIgorCiAjIERpc2FibGUgYWxsIHRoZSBsaWJyYXJ5LXNwZWNpZmljIGNvbXBvbmVudHMgaWYgdGhlIGxpYnJhcnkgaXRzZWxmCiAjIGlzIGRpc2FibGVkLCBzZWUgQVZDT0RFQ19MSVNUIGFuZCBmb2xsb3dpbmcgX0xJU1QgdmFyaWFibGVzLgogCkBAIC0zMjkzLDQ0ICszOTQ3LDQ4IEBACiAKIHRlc3QgLW4gIiR2YWxncmluZCIgJiYgdG9vbGNoYWluPSJ2YWxncmluZC1tZW1jaGVjayIKIAorZW5hYmxlZCBvc3NmdXp6ICYmIHsKKyAgICBhZGRfY2ZsYWdzICAtZnNhbml0aXplPWFkZHJlc3MsdW5kZWZpbmVkIC1mc2FuaXRpemUtY292ZXJhZ2U9dHJhY2UtcGMtZ3VhcmQsdHJhY2UtY21wIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCisgICAgYWRkX2xkZmxhZ3MgLWZzYW5pdGl6ZT1hZGRyZXNzLHVuZGVmaW5lZCAtZnNhbml0aXplLWNvdmVyYWdlPXRyYWNlLXBjLWd1YXJkLHRyYWNlLWNtcAorfQorCiBjYXNlICIkdG9vbGNoYWluIiBpbgotICAgIGNsYW5nLWFzYW4pCi0gICAgICAgIGNjX2RlZmF1bHQ9ImNsYW5nIgorICAgICotYXNhbikKKyAgICAgICAgY2NfZGVmYXVsdD0iJHt0b29sY2hhaW4lLWFzYW59IgogICAgICAgICBhZGRfY2ZsYWdzICAtZnNhbml0aXplPWFkZHJlc3MKICAgICAgICAgYWRkX2xkZmxhZ3MgLWZzYW5pdGl6ZT1hZGRyZXNzCiAgICAgOzsKLSAgICBjbGFuZy10c2FuKQotICAgICAgICBjY19kZWZhdWx0PSJjbGFuZyIKLSAgICAgICAgYWRkX2NmbGFncyAgLWZzYW5pdGl6ZT10aHJlYWQgLXBpZQorICAgICotbXNhbikKKyAgICAgICAgY2NfZGVmYXVsdD0iJHt0b29sY2hhaW4lLW1zYW59IgorICAgICAgICBhZGRfY2ZsYWdzICAtZnNhbml0aXplPW1lbW9yeSAtZnNhbml0aXplLW1lbW9yeS10cmFjay1vcmlnaW5zCisgICAgICAgIGFkZF9sZGZsYWdzIC1mc2FuaXRpemU9bWVtb3J5CisgICAgOzsKKyAgICAqLXRzYW4pCisgICAgICAgIGNjX2RlZmF1bHQ9IiR7dG9vbGNoYWluJS10c2FufSIKKyAgICAgICAgYWRkX2NmbGFncyAgLWZzYW5pdGl6ZT10aHJlYWQgLWZQSUUKICAgICAgICAgYWRkX2xkZmxhZ3MgLWZzYW5pdGl6ZT10aHJlYWQgLXBpZQorICAgICAgICBjYXNlICIkdG9vbGNoYWluIiBpbgorICAgICAgICAgICAgZ2NjLXRzYW4pCisgICAgICAgICAgICAgICAgYWRkX2NmbGFncyAgLWZQSUMKKyAgICAgICAgICAgICAgICBhZGRfbGRmbGFncyAtZlBJQworICAgICAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKICAgICA7OwotICAgIGNsYW5nLXVzYW4pCi0gICAgICAgIGNjX2RlZmF1bHQ9ImNsYW5nIgorICAgICotdXNhbikKKyAgICAgICAgY2NfZGVmYXVsdD0iJHt0b29sY2hhaW4lLXVzYW59IgogICAgICAgICBhZGRfY2ZsYWdzICAtZnNhbml0aXplPXVuZGVmaW5lZAogICAgICAgICBhZGRfbGRmbGFncyAtZnNhbml0aXplPXVuZGVmaW5lZAogICAgIDs7Ci0gICAgZ2NjLWFzYW4pCi0gICAgICAgIGNjX2RlZmF1bHQ9ImdjYyIKLSAgICAgICAgYWRkX2NmbGFncyAgLWZzYW5pdGl6ZT1hZGRyZXNzCi0gICAgICAgIGFkZF9sZGZsYWdzIC1mc2FuaXRpemU9YWRkcmVzcwotICAgIDs7Ci0gICAgZ2NjLXRzYW4pCi0gICAgICAgIGNjX2RlZmF1bHQ9ImdjYyIKLSAgICAgICAgYWRkX2NmbGFncyAgLWZzYW5pdGl6ZT10aHJlYWQgLXBpZSAtZlBJQwotICAgICAgICBhZGRfbGRmbGFncyAtZnNhbml0aXplPXRocmVhZCAtcGllIC1mUElDCi0gICAgOzsKLSAgICBnY2MtdXNhbikKLSAgICAgICAgY2NfZGVmYXVsdD0iZ2NjIgotICAgICAgICBhZGRfY2ZsYWdzICAtZnNhbml0aXplPXVuZGVmaW5lZAotICAgICAgICBhZGRfbGRmbGFncyAtZnNhbml0aXplPXVuZGVmaW5lZAotICAgIDs7Ci0gICAgdmFsZ3JpbmQtbWFzc2lmKQotICAgICAgICB0YXJnZXRfZXhlY19kZWZhdWx0PSR7dmFsZ3JpbmQ6LSJ2YWxncmluZCJ9Ci0gICAgICAgIHRhcmdldF9leGVjX2FyZ3M9Ii0tdG9vbD1tYXNzaWYgLS1hbGxvYy1mbj1hdl9tYWxsb2MgLS1hbGxvYy1mbj1hdl9tYWxsb2N6IC0tYWxsb2MtZm49YXZfY2FsbG9jIC0tYWxsb2MtZm49YXZfZmFzdF9wYWRkZWRfbWFsbG9jIC0tYWxsb2MtZm49YXZfZmFzdF9tYWxsb2MgLS1hbGxvYy1mbj1hdl9yZWFsbG9jX2YgLS1hbGxvYy1mbj1hdl9mYXN0X3JlYWxsb2MgLS1hbGxvYy1mbj1hdl9yZWFsbG9jIgotICAgIDs7Ci0gICAgdmFsZ3JpbmQtbWVtY2hlY2spCi0gICAgICAgIHRhcmdldF9leGVjX2RlZmF1bHQ9JHt2YWxncmluZDotInZhbGdyaW5kIn0KLSAgICAgICAgdGFyZ2V0X2V4ZWNfYXJncz0iLS1lcnJvci1leGl0Y29kZT0xIC0tbWFsbG9jLWZpbGw9MHgyYSAtLXRyYWNrLW9yaWdpbnM9eWVzIC0tbGVhay1jaGVjaz1mdWxsIC0tZ2VuLXN1cHByZXNzaW9ucz1hbGwgLS1zdXBwcmVzc2lvbnM9JHNvdXJjZV9wYXRoL3Rlc3RzL2ZhdGUtdmFsZ3JpbmQuc3VwcCIKKyAgICB2YWxncmluZC0qKQorICAgICAgICB0YXJnZXRfZXhlY19kZWZhdWx0PSJ2YWxncmluZCIKKyAgICAgICAgY2FzZSAiJHRvb2xjaGFpbiIgaW4KKyAgICAgICAgICAgIHZhbGdyaW5kLW1hc3NpZikKKyAgICAgICAgICAgICAgICB0YXJnZXRfZXhlY19hcmdzPSItLXRvb2w9bWFzc2lmIC0tYWxsb2MtZm49YXZfbWFsbG9jIC0tYWxsb2MtZm49YXZfbWFsbG9jeiAtLWFsbG9jLWZuPWF2X2NhbGxvYyAtLWFsbG9jLWZuPWF2X2Zhc3RfcGFkZGVkX21hbGxvYyAtLWFsbG9jLWZuPWF2X2Zhc3RfbWFsbG9jIC0tYWxsb2MtZm49YXZfcmVhbGxvY19mIC0tYWxsb2MtZm49YXZfZmFzdF9yZWFsbG9jIC0tYWxsb2MtZm49YXZfcmVhbGxvYyIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgdmFsZ3JpbmQtbWVtY2hlY2spCisgICAgICAgICAgICAgICAgdGFyZ2V0X2V4ZWNfYXJncz0iLS1lcnJvci1leGl0Y29kZT0xIC0tbWFsbG9jLWZpbGw9MHgyYSAtLXRyYWNrLW9yaWdpbnM9eWVzIC0tbGVhay1jaGVjaz1mdWxsIC0tZ2VuLXN1cHByZXNzaW9ucz1hbGwgLS1zdXBwcmVzc2lvbnM9JHNvdXJjZV9wYXRoL3Rlc3RzL2ZhdGUtdmFsZ3JpbmQuc3VwcCIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICBlc2FjCiAgICAgOzsKICAgICBtc3ZjKQogICAgICAgICAjIENoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgTVNWQyB2ZXJzaW9uIG5lZWRzIHRoZSBDOTkgY29udmVydGVyLgpAQCAtMzM0MiwxMyArNDAwMCwxOCBAQAogICAgICAgICBjbF9tYWpvcl92ZXI9JChjbCAyPiYxIHwgc2VkIC1uICdzLy4qVmVyc2lvbiBcKFtbOmRpZ2l0Ol1dXHsxLFx9XClcLi4qL1wxL3AnKQogICAgICAgICBpZiBbIC16ICIkY2xfbWFqb3JfdmVyIiBdIHx8IFsgJGNsX21ham9yX3ZlciAtZ2UgMTggXTsgdGhlbgogICAgICAgICAgICAgY2NfZGVmYXVsdD0iY2wiCisgICAgICAgICAgICBjeHhfZGVmYXVsdD0iY2wiCiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGNjX2RlZmF1bHQ9ImM5OXdyYXAgY2wiCisgICAgICAgICAgICBjeHhfZGVmYXVsdD0iYzk5d3JhcCBjbCIKICAgICAgICAgZmkKICAgICAgICAgbGRfZGVmYXVsdD0iJHNvdXJjZV9wYXRoL2NvbXBhdC93aW5kb3dzL21zbGluayIKICAgICAgICAgbm1fZGVmYXVsdD0iZHVtcGJpbiAtc3ltYm9scyIKICAgICAgICAgYXJfZGVmYXVsdD0ibGliIgogICAgICAgICBjYXNlICIkYXJjaCIgaW4KKyAgICAgICAgYWFyY2g2NHxhcm02NCkKKyAgICAgICAgICAgIGFzX2RlZmF1bHQ9ImFybWFzbTY0IgorICAgICAgICAgICAgOzsKICAgICAgICAgYXJtKikKICAgICAgICAgICAgIGFzX2RlZmF1bHQ9ImFybWFzbSIKICAgICAgICAgICAgIDs7CkBAIC0zMzcyLDIxICs0MDM1LDI2IEBACiAgICAgICAgIGFkZF9jZmxhZ3MgIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZQogICAgICAgICBhZGRfbGRmbGFncyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UKICAgICA7OworICAgIGxsdm0tY292KQorICAgICAgICBhZGRfY2ZsYWdzIC1mcHJvZmlsZS1hcmNzIC1mdGVzdC1jb3ZlcmFnZQorICAgICAgICBhZGRfbGRmbGFncyAtLWNvdmVyYWdlCisgICAgOzsKICAgICBoYXJkZW5lZCkKICAgICAgICAgYWRkX2NwcGZsYWdzIC1VX0ZPUlRJRllfU09VUkNFIC1EX0ZPUlRJRllfU09VUkNFPTIKICAgICAgICAgYWRkX2NmbGFncyAgIC1mbm8tc3RyaWN0LW92ZXJmbG93IC1mc3RhY2stcHJvdGVjdG9yLWFsbAogICAgICAgICBhZGRfbGRmbGFncyAgLVdsLC16LHJlbHJvIC1XbCwteixub3cKKyAgICAgICAgYWRkX2NmbGFncyAgIC1mUElFCisgICAgICAgIGFkZF9sZGV4ZWZsYWdzIC1mUElFIC1waWUKICAgICA7OwogICAgID8qKQogICAgICAgICBkaWUgIlVua25vd24gdG9vbGNoYWluICR0b29sY2hhaW4iCiAgICAgOzsKIGVzYWMKIAotdGVzdCAtbiAiJGNyb3NzX3ByZWZpeCIgJiYgZW5hYmxlIGNyb3NzX2NvbXBpbGUKLQotaWYgZW5hYmxlZCBjcm9zc19jb21waWxlOyB0aGVuCitpZiB0ZXN0IC1uICIkY3Jvc3NfcHJlZml4IjsgdGhlbgogICAgIHRlc3QgLW4gIiRhcmNoIiAmJiB0ZXN0IC1uICIkdGFyZ2V0X29zIiB8fAotICAgICAgICBkaWUgIk11c3Qgc3BlY2lmeSB0YXJnZXQgYXJjaCBhbmQgT1Mgd2hlbiBjcm9zcy1jb21waWxpbmciCisgICAgICAgIGRpZSAiTXVzdCBzcGVjaWZ5IHRhcmdldCBhcmNoICgtLWFyY2gpIGFuZCBPUyAoLS10YXJnZXQtb3MpIHdoZW4gY3Jvc3MtY29tcGlsaW5nIgorICAgIGVuYWJsZSBjcm9zc19jb21waWxlCiBmaQogCiBhcl9kZWZhdWx0PSIke2Nyb3NzX3ByZWZpeH0ke2FyX2RlZmF1bHR9IgpAQCAtMzQwNSw3ICs0MDczLDcgQEAKIHN5c2luY2x1ZGVfZGVmYXVsdD0iJHtzeXNyb290fS91c3IvaW5jbHVkZSIKIAogc2V0X2RlZmF1bHQgYXJjaCBjYyBjeHggZG94eWdlbiBwa2dfY29uZmlnIHJhbmxpYiBzdHJpcCBzeXNpbmNsdWRlIFwKLSAgICB0YXJnZXRfZXhlYyB0YXJnZXRfb3MgeWFzbWV4ZQorICAgIHRhcmdldF9leGVjIHRhcmdldF9vcyB4ODZhc21leGUgbnZjYwogZW5hYmxlZCBjcm9zc19jb21waWxlIHx8IGhvc3RfY2NfZGVmYXVsdD0kY2MKIHNldF9kZWZhdWx0IGhvc3RfY2MKIApAQCAtMzQzOSwyNSArNDEwNywzMiBAQAogCiBpZiBbIC1uICIkdGVtcHByZWZpeCIgXSA7IHRoZW4KICAgICBta3RlbXAoKXsKLSAgICAgICAgZWNobyAkdGVtcHByZWZpeC4ke0hPU1ROQU1FfS4ke1VJRH0KKyAgICAgICAgdG1wbmFtZT0iJHRlbXBwcmVmaXguJHtIT1NUTkFNRX0uJHtVSUR9IgorICAgICAgICBlY2hvICIkdG1wbmFtZSIKKyAgICAgICAgbWtkaXIgIiR0bXBuYW1lIgogICAgIH0KLWVsaWYgISBjaGVja19jbWQgbWt0ZW1wIC11IFhYWFhYWDsgdGhlbgorZWxpZiAhIHRlc3RfY21kIG1rdGVtcCAtdSBYWFhYWFg7IHRoZW4KICAgICAjIHNpbXBsZSByZXBsYWNlbWVudCBmb3IgbWlzc2luZyBta3RlbXAKICAgICAjIE5PVCBTQUZFIEZPUiBHRU5FUkFMIFVTRQogICAgIG1rdGVtcCgpewotICAgICAgICBlY2hvICIkezIlJVhYWCp9LiR7SE9TVE5BTUV9LiR7VUlEfS4kJCIKKyAgICAgICAgdG1wbmFtZT0iJHsyJSVYWFgqfS4ke0hPU1ROQU1FfS4ke1VJRH0uJCQiCisgICAgICAgIGVjaG8gIiR0bXBuYW1lIgorICAgICAgICBta2RpciAiJHRtcG5hbWUiCiAgICAgfQogZmkKIAorRkZUTVBESVI9JChta3RlbXAgLWQgIiR7VE1QRElSfS9mZmNvbmYuWFhYWFhYWFgiIDI+IC9kZXYvbnVsbCkgfHwKKyAgICBkaWUgIlVuYWJsZSB0byBjcmVhdGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBpbiAkVE1QRElSLiIKKwogdG1wZmlsZSgpewotICAgIHRtcD0kKG1rdGVtcCAtdSAiJHtUTVBESVJ9L2ZmY29uZi5YWFhYWFhYWCIpJDIgJiYKLSAgICAgICAgKHNldCAtQzsgZXhlYyA+ICR0bXApIDI+L2Rldi9udWxsIHx8Ci0gICAgICAgIGRpZSAiVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZSBpbiAkVE1QRElSLiIKLSAgICBhcHBlbmQgVE1QRklMRVMgJHRtcAorICAgIHRtcD0iJHtGRlRNUERJUn0vdGVzdCIkMgorICAgIChzZXQgLUM7IGV4ZWMgPiAkdG1wKSAyPiAvZGV2L251bGwgfHwKKyAgICAgICAgZGllICJVbmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlIGluICRGRlRNUERJUi4iCiAgICAgZXZhbCAkMT0kdG1wCiB9CiAKLXRyYXAgJ3JtIC1mIC0tICRUTVBGSUxFUycgRVhJVAordHJhcCAncm0gLXJmIC0tICIkRkZUTVBESVIiJyBFWElUCit0cmFwICdleGl0IDInIElOVAogCiB0bXBmaWxlIFRNUEFTTSAuYXNtCiB0bXBmaWxlIFRNUEMgICAuYwpAQCAtMzQ5OCwyNCArNDE3Myw2IEBACiAgICBkb25lCiB9CiAKLWNjY19mbGFncygpewotICAgIGZvciBmbGFnOyBkbwotICAgICAgICBjYXNlICRmbGFnIGluCi0gICAgICAgICAgICAtc3RkPWM5OSkgICAgICAgICAgIGVjaG8gLWM5OSAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIC1tY3B1PSopICAgICAgICAgICAgZWNobyAtYXJjaCAke2ZsYWcjKj19ICAgICAgICAgICA7OwotICAgICAgICAgICAgLW1pZWVlKSAgICAgICAgICAgICBlY2hvIC1pZWVlICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAtTyp8LWZhc3QpICAgICAgICAgIGVjaG8gJGZsYWcgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIC1mbm8tbWF0aC1lcnJubykgICAgZWNobyAtYXNzdW1lIG5vbWF0aF9lcnJubyAgICAgICA7OwotICAgICAgICAgICAgLWcpICAgICAgICAgICAgICAgICBlY2hvIC1nMyAgICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAtV2FsbCkgICAgICAgICAgICAgIGVjaG8gLW1zZ19lbmFibGUgbGV2ZWwyICAgICAgICAgOzsKLSAgICAgICAgICAgIC1Xbm8tcG9pbnRlci1zaWduKSAgZWNobyAtbXNnX2Rpc2FibGUgcHRybWlzbWF0Y2gxICA7OwotICAgICAgICAgICAgLVdsLCopICAgICAgICAgICAgICBlY2hvICRmbGFnICAgICAgICAgICAgICAgICAgICAgIDs7Ci0gICAgICAgICAgICAtZip8LVcqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICopICAgICAgICAgICAgICAgICAgZWNobyAkZmxhZyAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICBkb25lCi19Ci0KIGNwYXJzZXJfZmxhZ3MoKXsKICAgICBmb3IgZmxhZzsgZG8KICAgICAgICAgY2FzZSAkZmxhZyBpbgpAQCAtMzUzNSw2ICs0MTkyLDcgQEAKICAgICAgICAgICAgICMgc3BlY2lmaWMgZmlsdGVycywgdGhleSBtdXN0IGJlIHNwZWNpZmllZCBoZXJlIGFzIHdlbGwgb3IgZWxzZSB0aGUKICAgICAgICAgICAgICMgZ2VuZXJpYyBjYXRjaCBhbGwgYXQgdGhlIGJvdHRvbSB3aWxsIHByaW50IHRoZSBvcmlnaW5hbCBmbGFnLgogICAgICAgICAgICAgLVdhbGwpICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICAtV2V4dHJhKSAgICAgICAgICAgICAgOzsKICAgICAgICAgICAgIC1zdGQ9Yzk5KSAgICAgICAgICAgICA7OwogICAgICAgICAgICAgIyBDb21tb24gZmxhZ3MKICAgICAgICAgICAgIC1mb21pdC1mcmFtZS1wb2ludGVyKSA7OwpAQCAtMzU0Niw5ICs0MjA0LDggQEAKICAgICAgICAgICAgIC1tdGh1bWIpICAgICAgICAgICAgICA7OwogICAgICAgICAgICAgLW1hcmNoPSopICAgICAgICAgICAgIDs7CiAgICAgICAgICAgICAtbHopICAgICAgICAgICAgICAgICAgZWNobyB6bGliLmxpYiA7OwotICAgICAgICAgICAgLWxhdmlmaWwzMikgICAgICAgICAgIGVjaG8gdmZ3MzIubGliIDs7Ci0gICAgICAgICAgICAtbGF2aWNhcDMyKSAgICAgICAgICAgZWNobyB2ZnczMi5saWIgdXNlcjMyLmxpYiA7OwogICAgICAgICAgICAgLWx4MjY0KSAgICAgICAgICAgICAgIGVjaG8gbGlieDI2NC5saWIgOzsKKyAgICAgICAgICAgIC1sc3RkYysrKSAgICAgICAgICAgICA7OwogICAgICAgICAgICAgLWwqKSAgICAgICAgICAgICAgICAgIGVjaG8gJHtmbGFnIy1sfS5saWIgOzsKICAgICAgICAgICAgIC1MQVJHRUFERFJFU1NBV0FSRSkgICBlY2hvICRmbGFnIDs7CiAgICAgICAgICAgICAtTCopICAgICAgICAgICAgICAgICAgZWNobyAtbGlicGF0aDoke2ZsYWcjLUx9IDs7CkBAIC0zNTYxLDExICs0MjE4LDEzIEBACiAgICAgbXN2Y19jb21tb25fZmxhZ3MgIiRAIgogICAgIGZvciBmbGFnOyBkbwogICAgICAgICBjYXNlICRmbGFnIGluCi0gICAgICAgICAgICAtV2FsbCkgICAgICAgICAgICAgICAgZWNobyAtVzQgLXdkNDI0NCAtd2Q0MTI3IC13ZDQwMTggLXdkNDM4OSAgICAgXAorICAgICAgICAgICAgLVdhbGwpICAgICAgICAgICAgICAgIGVjaG8gLVczIC13ZDQwMTggLXdkNDE0NiAtd2Q0MjQ0IC13ZDQzMDUgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZDQ1NTQgOzsKKyAgICAgICAgICAgIC1XZXh0cmEpICAgICAgICAgICAgICBlY2hvIC1XNCAtd2Q0MjQ0IC13ZDQxMjcgLXdkNDAxOCAtd2Q0Mzg5ICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtd2Q0MTQ2IC13ZDQwNTcgLXdkNDIwNCAtd2Q0NzA2IC13ZDQzMDUgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdkNDE1MiAtd2Q0MzI0IC13ZTQwMTMgLXdkNDEwMCAtd2Q0MjE0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZDQzMDcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXdkNDI3MyAtd2Q0NTU0IC13ZDQ3MDEgOzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC13ZDQyNzMgLXdkNDU1NCAtd2Q0NzAxIC13ZDQ3MDMgOzsKICAgICAgICAgZXNhYwogICAgIGRvbmUKIH0KQEAgLTM1OTIsMTcgKzQyNTEsNiBAQAogICAgIGRvbmUKIH0KIAotcGdpX2ZsYWdzKCl7Ci0gICAgZm9yIGZsYWc7IGRvCi0gICAgICAgIGNhc2UgJGZsYWcgaW4KLSAgICAgICAgICAgIC1mbHRvKSAgICAgICAgICAgICAgICBlY2hvIC1NaXBhPWZhc3QsbGlib3B0LGxpYmlubGluZSx2ZXN0aWdpYWwgOzsKLSAgICAgICAgICAgIC1mb21pdC1mcmFtZS1wb2ludGVyKSBlY2hvIC1Nbm9mcmFtZSA7OwotICAgICAgICAgICAgLWcpICAgICAgICAgICAgICAgICAgIGVjaG8gLWdvcHQgOzsKLSAgICAgICAgICAgICopICAgICAgICAgICAgICAgICAgICBlY2hvICRmbGFnIDs7Ci0gICAgICAgIGVzYWMKLSAgICBkb25lCi19Ci0KIHN1bmNjX2ZsYWdzKCl7CiAgICAgZm9yIGZsYWc7IGRvCiAgICAgICAgIGNhc2UgJGZsYWcgaW4KQEAgLTM2MjUsMTEgKzQyNzMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgd2VzdG1lcmUpICAgICAgICAgICAgICAgICAgZWNobyAteHRhcmdldD13ZXN0bWVyZSAgICA7OwogICAgICAgICAgICAgICAgICAgICBzaWx2ZXJtb250KSAgICAgICAgICAgICAgICBlY2hvIC14YXJjaD1zc2U0XzIgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgIGNvcmVpNy1hdnh8c2FuZHlicmlkZ2UpICAgIGVjaG8gLXh0YXJnZXQ9c2FuZHlicmlkZ2UgOzsKLSAgICAgICAgICAgICAgICAgICAgY29yZS1hdngqfGl2eWJyaWRnZXxoYXN3ZWxsfGJyb2Fkd2VsbCkKKyAgICAgICAgICAgICAgICAgICAgY29yZS1hdngqfGl2eWJyaWRnZXxoYXN3ZWxsfGJyb2Fkd2VsbHxza3lsYWtlKnxrbmwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gLXhhcmNoPWF2eCAgICAgICAgICAgOzsKICAgICAgICAgICAgICAgICAgICAgYW1kZmFtMTB8YmFyY2Vsb25hKSAgICAgICAgZWNobyAteHRhcmdldD1iYXJjZWxvbmEgICA7OwogICAgICAgICAgICAgICAgICAgICBidHZlcjEpICAgICAgICAgICAgICAgICAgICBlY2hvIC14YXJjaD1hbWRzc2U0YSAgICAgIDs7Ci0gICAgICAgICAgICAgICAgICAgIGJ0dmVyMnxiZHZlciopICAgICAgICAgICAgIGVjaG8gLXhhcmNoPWF2eCAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICAgYnR2ZXIyfGJkdmVyKnx6bnZlciopICAgICAgZWNobyAteGFyY2g9YXZ4ICAgICAgICAgICA7OwogICAgICAgICAgICAgICAgICAgICBhdGhsb24tNHxhdGhsb24tW214XXApICAgICBlY2hvIC14YXJjaD1zc2VhICAgICAgICAgIDs7CiAgICAgICAgICAgICAgICAgICAgIGs4fG9wdGVyb258YXRobG9uNjR8YXRobG9uLWZ4KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvIC14YXJjaD1zc2UyYSAgICAgICAgIDs7CkBAIC0zNjQ3LDM1ICs0Mjk1LDYgQEAKICAgICBkb25lCiB9CiAKLXRtczQ3MF9mbGFncygpewotICAgIGZvciBmbGFnOyBkbwotICAgICAgICBjYXNlICRmbGFnIGluCi0gICAgICAgICAgICAtbWFyY2g9KnwtbWNwdT0qKQotICAgICAgICAgICAgICAgIGNhc2UgIiR7ZmxhZyMqPX0iIGluCi0gICAgICAgICAgICAgICAgICAgIGFybXY3LWF8Y29ydGV4LWEqKSAgICAgIGVjaG8gLW12PTdhOCA7OwotICAgICAgICAgICAgICAgICAgICBhcm12Ny1yfGNvcnRleC1yKikgICAgICBlY2hvIC1tdj03cjQgOzsKLSAgICAgICAgICAgICAgICAgICAgYXJtdjctbXxjb3J0ZXgtbSopICAgICAgZWNobyAtbXY9N20zIDs7Ci0gICAgICAgICAgICAgICAgICAgIGFybXY2Knxhcm0xMSopICAgICAgICAgIGVjaG8gLW12PTYgICA7OwotICAgICAgICAgICAgICAgICAgICBhcm12NSplfGFybVs3OV0qZSp8YXJtOVsyNF02Knxhcm05Nip8YXJtMTAyWzI2XSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAtbXY9NWUgIDs7Ci0gICAgICAgICAgICAgICAgICAgIGFybXY0Knxhcm03Knxhcm05WzI0XSopIGVjaG8gLW12PTQgICA7OwotICAgICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgLW1mcHU9bmVvbikgICAgIGVjaG8gLS1mbG9hdF9zdXBwb3J0PXZmcHYzIC0tbmVvbiA7OwotICAgICAgICAgICAgLW1mcHU9dmZwKSAgICAgIGVjaG8gLS1mbG9hdF9zdXBwb3J0PXZmcHYyICAgICAgICA7OwotICAgICAgICAgICAgLW1mcHU9dmZwdjMpICAgIGVjaG8gLS1mbG9hdF9zdXBwb3J0PXZmcHYzICAgICAgICA7OwotICAgICAgICAgICAgLW1mcHU9dmZwdjMtZDE2KSBlY2hvIC0tZmxvYXRfc3VwcG9ydD12ZnB2M2QxNiAgICA7OwotICAgICAgICAgICAgLW1zb2Z0LWZsb2F0KSAgIGVjaG8gLS1mbG9hdF9zdXBwb3J0PXZmcGxpYiAgICAgICA7OwotICAgICAgICAgICAgLU9bMC0zXXwtbWY9KikgIGVjaG8gJGZsYWcgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgLWcpICAgICAgICAgICAgIGVjaG8gLWcgLW1uICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgLXBkcz0qKSAgICAgICAgIGVjaG8gJGZsYWcgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgLUQqfC1JKikgICAgICAgIGVjaG8gJGZsYWcgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgLS1nY2N8LS1hYmk9KikgIGVjaG8gJGZsYWcgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICAgICAgLW1lKSAgICAgICAgICAgIGVjaG8gJGZsYWcgICAgICAgICAgICAgICAgICAgICAgICA7OwotICAgICAgICBlc2FjCi0gICAgZG9uZQotfQotCiBwcm9iZV9jYygpewogICAgIHBmeD0kMQogICAgIF9jYz0kMgpAQCAtMzcyOCwxMyArNDM0Nyw2IEBACiAgICAgICAgIF9pZGVudD0kKCRfY2MgLXF2ZXJzaW9uIDI+L2Rldi9udWxsIHwgaGVhZCAtbjEpCiAgICAgICAgIF9jZmxhZ3Nfc3BlZWQ9Jy1PNScKICAgICAgICAgX2NmbGFnc19zaXplPSctTzUgLXFjb21wYWN0JwotICAgIGVsaWYgJF9jYyAtViAyPi9kZXYvbnVsbCB8IGdyZXAgLXEgQ29tcGFxOyB0aGVuCi0gICAgICAgIF90eXBlPWNjYwotICAgICAgICBfaWRlbnQ9JCgkX2NjIC1WIHwgaGVhZCAtbjEgfCBjdXQgLWQnICcgLWYxLTMpCi0gICAgICAgIF9ERVBGTEFHUz0nLU0nCi0gICAgICAgIF9jZmxhZ3Nfc3BlZWQ9Jy1mYXN0JwotICAgICAgICBfY2ZsYWdzX3NpemU9Jy1PMScKLSAgICAgICAgX2ZsYWdzX2ZpbHRlcj1jY2NfZmxhZ3MKICAgICBlbGlmICRfY2MgLS12c24gMj4vZGV2L251bGwgfCBncmVwIC1FcSAiQVJNIChDL0NcK1wrICk/Q29tcGlsZXIiOyB0aGVuCiAgICAgICAgIHRlc3QgLWQgIiRzeXNyb290IiB8fCBkaWUgIk5vIHZhbGlkIHN5c3Jvb3Qgc3BlY2lmaWVkLiIKICAgICAgICAgX3R5cGU9YXJtY2MKQEAgLTM3NTEsMjIgKzQzNjMsMTIgQEAKICAgICAgICAgX2RlcGZsYWdzPSctTU1EJwogICAgICAgICBfY2ZsYWdzX3NwZWVkPSctTzMnCiAgICAgICAgIF9jZmxhZ3Nfc2l6ZT0nLU9zJwotICAgIGVsaWYgJF9jYyAtdmVyc2lvbiAyPi9kZXYvbnVsbCB8IGdyZXAgLUVxICdUTVM0NzB8VEkgQVJNJzsgdGhlbgotICAgICAgICBfdHlwZT10bXM0NzAKLSAgICAgICAgX2lkZW50PSQoJF9jYyAtdmVyc2lvbiB8IGhlYWQgLW4xIHwgdHIgLXMgJyAnKQotICAgICAgICBfZmxhZ3M9Jy0tZ2NjIC0tYWJpPWVhYmkgLW1lJwotICAgICAgICBfY2NfZT0nLXBwbCAtZmU9JEAnCi0gICAgICAgIF9jY19vPSctZmU9JEAnCi0gICAgICAgIF9kZXBmbGFncz0nLXBwYSAtcHBkPSQoQDoubz0uZCknCi0gICAgICAgIF9jZmxhZ3Nfc3BlZWQ9Jy1PMyAtbWY9NScKLSAgICAgICAgX2NmbGFnc19zaXplPSctTzMgLW1mPTInCi0gICAgICAgIF9mbGFnc19maWx0ZXI9dG1zNDcwX2ZsYWdzCi0gICAgZWxpZiAkX2NjIC12IDI+JjEgfCBncmVwIC1xIGNsYW5nOyB0aGVuCisgICAgZWxpZiAkX2NjIC12IDI+JjEgfCBncmVwIC1xIGNsYW5nICYmICEgJF9jYyAtPyA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIF90eXBlPWNsYW5nCiAgICAgICAgIF9pZGVudD0kKCRfY2MgLS12ZXJzaW9uIDI+L2Rldi9udWxsIHwgaGVhZCAtbjEpCiAgICAgICAgIF9kZXBmbGFncz0nLU1NRCAtTUYgJChAOi5vPS5kKSAtTVQgJEAnCiAgICAgICAgIF9jZmxhZ3Nfc3BlZWQ9Jy1PMycKLSAgICAgICAgX2NmbGFnc19zaXplPSctT3MnCisgICAgICAgIF9jZmxhZ3Nfc2l6ZT0nLU96JwogICAgIGVsaWYgJF9jYyAtViAyPiYxIHwgZ3JlcCAtcSBTdW47IHRoZW4KICAgICAgICAgX3R5cGU9c3VuY2MKICAgICAgICAgX2lkZW50PSQoJF9jYyAtViAyPiYxIHwgaGVhZCAtbjEgfCBjdXQgLWQnICcgLWYgMi0pCkBAIC0zNzkwLDE0ICs0MzkyLDYgQEAKICAgICAgICAgX2NmbGFnc19zcGVlZD0nLU8yJwogICAgICAgICBfY2ZsYWdzX3NpemU9Jy1PcycKICAgICAgICAgX2ZsYWdzX2ZpbHRlcj0nZmlsdGVyX291dCAtV2Rpc2FibGVkLW9wdGltaXphdGlvbnwtV3R5cGUtbGltaXRzfC1mbm8tc2lnbmVkLXplcm9zJwotICAgIGVsaWYgJF9jYyAtViAyPiYxIHwgZ3JlcCAtcSBQb3J0bGFuZDsgdGhlbgotICAgICAgICBfdHlwZT1wZ2kKLSAgICAgICAgX2lkZW50PSJQR0kgJCgkX2NjIC1WIDI+JjEgfCBhd2sgJy9ecGdjYy8geyBwcmludCAkMjsgZXhpdCB9JykiCi0gICAgICAgIG9wdF9jb21tb249Jy1hbGlhcz1hbnNpIC1NZHNlIC1NbHJlIC1NcHJlJwotICAgICAgICBfY2ZsYWdzX3NwZWVkPSItTzMgLU1hdXRvaW5saW5lIC1NdW5yb2xsPWM6NCAkb3B0X2NvbW1vbiIKLSAgICAgICAgX2NmbGFnc19zaXplPSItTzIgLU11bnJvbGw9YzoxICRvcHRfY29tbW9uIgotICAgICAgICBfY2ZsYWdzX25vb3B0PSItTyIKLSAgICAgICAgX2ZsYWdzX2ZpbHRlcj1wZ2lfZmxhZ3MKICAgICBlbGlmICRfY2MgMj4mMSB8IGdyZXAgLXEgJ01pY3Jvc29mdC4qQVJNLipBc3NlbWJsZXInOyB0aGVuCiAgICAgICAgIF90eXBlPWFybWFzbQogICAgICAgICBfaWRlbnQ9JCgkX2NjIHwgaGVhZCAtbjEpCkBAIC0zODI2LDE1ICs0NDIwLDI4IEBACiAgICAgICAgIF9mbGFncz0nLW5vbG9nbyAtUWRpYWctZXJyb3I6NDA0NCwxMDE1NycKICAgICAgICAgIyAtUXZlYy0gLVFzaW1kLSB0byBwcmV2ZW50IG1pc2NvbXBpbGF0aW9uLCAtR1MsIGZwOnByZWNpc2UgZm9yIGNvbnNpc3RlbmN5CiAgICAgICAgICMgd2l0aCBNU1ZDIHdoaWNoIGVuYWJsZXMgaXQgYnkgZGVmYXVsdC4KLSAgICAgICAgX2NmbGFncz0nLURfVVNFX01BVEhfREVGSU5FUyAtUW1zMCAtUXZlYy0gLVFzaW1kLSAtR1MgLWZwOnByZWNpc2UnCisgICAgICAgIF9jZmxhZ3M9Jy1RbXMwIC1RdmVjLSAtUXNpbWQtIC1HUyAtZnA6cHJlY2lzZScKICAgICAgICAgZGlzYWJsZSBzdHJpcHBpbmcKLSAgICBlbGlmICRfY2MgLW5vbG9nby0gMj4mMSB8IGdyZXAgLXEgTWljcm9zb2Z0OyB0aGVuCisgICAgZWxpZiAkX2NjIC0/IDI+L2Rldi9udWxsIHwgZ3JlcCAtcSAnTExWTS4qTGlua2VyJzsgdGhlbgorICAgICAgICAjIGxsZCBjYW4gZW11bGF0ZSBtdWx0aXBsZSBkaWZmZXJlbnQgbGlua2VyczsgaW4gbXMgbGluay5leGUgbW9kZSwKKyAgICAgICAgIyB0aGUgLT8gcGFyYW1ldGVyIGdpdmVzIHRoZSBoZWxwIG91dHB1dCB3aGljaCBjb250YWlucyBhbiBpZGVudGlmeWFibGUKKyAgICAgICAgIyBzdHJpbmcsIHdoaWxlIGl0IGdpdmVzIGFuIGVycm9yIGluIG90aGVyIG1vZGVzLgorICAgICAgICBfdHlwZT1sbGQtbGluaworICAgICAgICAjIFRoZSBsaW5rLmV4ZSBtb2RlIGRvZXNuJ3QgaGF2ZSBhIHN3aXRjaCBmb3IgZ2V0dGluZyB0aGUgdmVyc2lvbiwKKyAgICAgICAgIyBidXQgd2UgY2FuIGZvcmNlIGl0IGJhY2sgdG8gZ251IG1vZGUgYW5kIGdldCB0aGUgdmVyc2lvbiBmcm9tIHRoZXJlLgorICAgICAgICBfaWRlbnQ9JCgkX2NjIC1mbGF2b3IgZ251IC0tdmVyc2lvbiAyPi9kZXYvbnVsbCkKKyAgICAgICAgX2xkX289Jy1vdXQ6JEAnCisgICAgICAgIF9mbGFnc19maWx0ZXI9bXN2Y19mbGFncworICAgICAgICBfbGRfbGliPSdsaWIlLmEnCisgICAgICAgIF9sZF9wYXRoPSctbGlicGF0aDonCisgICAgZWxpZiAkX2NjIC1ub2xvZ28tIDI+JjEgfCBncmVwIC1xIE1pY3Jvc29mdCB8fCB7ICRfY2MgLXYgMj4mMSB8IGdyZXAgLXEgY2xhbmcgJiYgJF9jYyAtPyA+IC9kZXYvbnVsbCAyPiYxOyB9OyB0aGVuCiAgICAgICAgIF90eXBlPW1zdmMKLSAgICAgICAgX2lkZW50PSQoJF9jYyAyPiYxIHwgaGVhZCAtbjEpCisgICAgICAgIF9pZGVudD0kKCRfY2MgMj4mMSB8IGhlYWQgLW4xIHwgdHIgLWQgJ1xyJykKICAgICAgICAgX0RFUENNRD0nJChERVAkKDEpKSAkKERFUCQoMSlGTEFHUykgJCgkKDEpREVQX0ZMQUdTKSAkPCAyPiYxIHwgYXdrICdcJycvaW5jbHVkaW5nLyB7IHN1YigvXi4qZmlsZTogKi8sICIiKTsgZ3N1YigvXFwvLCAiLyIpOyBpZiAoIW1hdGNoKCQkMCwgLyAvKSkgcHJpbnQgIiRAOiIsICQkMCB9J1wnJyA+ICQoQDoubz0uZCknCiAgICAgICAgIF9ERVBGTEFHUz0nJChDUFBGTEFHUykgJChDRkxBR1MpIC1zaG93SW5jbHVkZXMgLVpzJwogICAgICAgICBfY2ZsYWdzX3NwZWVkPSItTzIiCiAgICAgICAgIF9jZmxhZ3Nfc2l6ZT0iLU8xIgorICAgICAgICBfY2ZsYWdzX25vb3B0PSItTzEiCiAgICAgICAgIGlmICRfY2MgLW5vbG9nby0gMj4mMSB8IGdyZXAgLXEgTGlua2VyOyB0aGVuCiAgICAgICAgICAgICBfbGRfbz0nLW91dDokQCcKICAgICAgICAgZWxzZQpAQCAtMzg0Niw3ICs0NDUzLDYgQEAKICAgICAgICAgX2xkX2xpYj0nbGliJS5hJwogICAgICAgICBfbGRfcGF0aD0nLWxpYnBhdGg6JwogICAgICAgICBfZmxhZ3M9Jy1ub2xvZ28nCi0gICAgICAgIF9jZmxhZ3M9Jy1EX1VTRV9NQVRIX0RFRklORVMgLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAtRF9DUlRfTk9OU1REQ19OT19XQVJOSU5HUycKICAgICAgICAgZGlzYWJsZSBzdHJpcHBpbmcKICAgICBlbGlmICRfY2MgLS12ZXJzaW9uIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSBeY3BhcnNlcjsgdGhlbgogICAgICAgICBfdHlwZT1jcGFyc2VyCkBAIC0zODgzLDkgKzQ0ODksMTEgQEAKIGFkZF9jZmxhZ3MgJF9mbGFncyAkX2NmbGFncwogY2NfbGRmbGFncz0kX2xkZmxhZ3MKIHNldF9jY3ZhcnMgQ0MKK3NldF9jY3ZhcnMgQ1hYCiAKIHByb2JlX2NjIGhvc3RjYyAiJGhvc3RfY2MiCiBob3N0X2NmbGFnc19maWx0ZXI9JF9mbGFnc19maWx0ZXIKK2hvc3RfY2ZsYWdzX3NwZWVkPSRfY2ZsYWdzX3NwZWVkCiBhZGRfaG9zdF9jZmxhZ3MgICRfZmxhZ3MgJF9jZmxhZ3MKIHNldF9jY3ZhcnMgSE9TVENDCiAKQEAgLTM4OTcsNyArNDUwNSw3IEBACiA6ICR7ZGVwX2NjX2RlZmF1bHQ6PSRjY30KIDogJHtsZF9kZWZhdWx0Oj0kY2N9CiA6ICR7aG9zdF9sZF9kZWZhdWx0Oj0kaG9zdF9jY30KLXNldF9kZWZhdWx0IGFyIGFzIG9iamNjIGRlcF9jYyBsZCBob3N0X2xkIHdpbmRyZXMKK3NldF9kZWZhdWx0IGFyIGFzIG9iamNjIGRlcF9jYyBsZCBsbl9zIGhvc3RfbGQgd2luZHJlcwogCiBwcm9iZV9jYyBhcyAiJGFzIgogYXNmbGFnc19maWx0ZXI9JF9mbGFnc19maWx0ZXIKQEAgLTM5MzIsMTIgKzQ1NDAsNiBAQAogaWYgJGFyIDI+JjEgfCBncmVwIC1xIE1pY3Jvc29mdDsgdGhlbgogICAgIGFyZmxhZ3M9Ii1ub2xvZ28iCiAgICAgYXJfbz0nLW91dDokQCcKLWVsaWYgJGFyIDI+JjEgfCBncmVwIC1xICdUZXhhcyBJbnN0cnVtZW50cyc7IHRoZW4KLSAgICBhcmZsYWdzPSJycSIKLSAgICBhcl9vPSckQCcKLWVsaWYgJGFyIDI+JjEgfCBncmVwIC1xICdVc2FnZTogYXIuKi1YLiphbnknOyB0aGVuCi0gICAgYXJmbGFncz0nLVhhbnkgLXIgLWMnCi0gICAgYXJfbz0nJEAnCiBlbGlmICRhciAyPiYxIHwgZ3JlcCAtcSAiXFtEXF0gIjsgdGhlbgogICAgIGFyZmxhZ3M9InJjRCIKICAgICBhcl9vPSckQCcKQEAgLTM5NTYsMTMgKzQ1NTgsNiBAQAogICAgICAgICBnY2N8bGx2bV9nY2N8Y2xhbmcpCiAgICAgICAgICAgICBhZGRfY3BwZmxhZ3MgLS1zeXNyb290PSIkc3lzcm9vdCIKICAgICAgICAgICAgIGFkZF9sZGZsYWdzIC0tc3lzcm9vdD0iJHN5c3Jvb3QiCi0jIE9uIERhcndpbiAtLXN5c3Jvb3QgbWF5IGJlIGlnbm9yZWQsIC1pc3lzcm9vdCBhbHdheXMgYWZmZWN0cyBoZWFkZXJzIGFuZCBsaW5raW5nCi0gICAgICAgICAgICBhZGRfY3BwZmxhZ3MgLWlzeXNyb290ICIkc3lzcm9vdCIKLSAgICAgICAgICAgIGFkZF9sZGZsYWdzIC1pc3lzcm9vdCAiJHN5c3Jvb3QiCi0gICAgICAgIDs7Ci0gICAgICAgIHRtczQ3MCkKLSAgICAgICAgICAgIGFkZF9jcHBmbGFncyAtSSIkc3lzaW5jbHVkZSIKLSAgICAgICAgICAgIGFkZF9sZGZsYWdzICAtLXN5c3Jvb3Q9IiRzeXNyb290IgogICAgICAgICA7OwogICAgIGVzYWMKIGZpCkBAIC00MDMzLDcgKzQ2MjgsNyBAQAogICAgIHNoNHxzaCkKICAgICAgICAgYXJjaD0ic2g0IgogICAgIDs7Ci0gICAgc3VuNHV8c3BhcmMqKQorICAgIHN1bjQqfHNwYXJjKikKICAgICAgICAgYXJjaD0ic3BhcmMiCiAgICAgOzsKICAgICB0aWxlZ3h8dGlsZS1neCkKQEAgLTQwNjYsMzIgKzQ2NjEsMzMgQEAKIGVsaWYgZW5hYmxlZCBhcm07IHRoZW4KIAogICAgIGNoZWNrX2FybV9hcmNoKCkgewotICAgICAgICBjaGVja19jcHBfY29uZGl0aW9uIHN0ZGRlZi5oIFwKKyAgICAgICAgdGVzdF9jcHBfY29uZGl0aW9uIHN0ZGRlZi5oIFwKICAgICAgICAgICAgICJkZWZpbmVkIF9fQVJNX0FSQ0hfJHsxfV9fIHx8IGRlZmluZWQgX19UQVJHRVRfQVJDSF8kezI6LSQxfSIgXAogICAgICAgICAgICAgJGNwdWZsYWdzCiAgICAgfQogCiAgICAgcHJvYmVfYXJtX2FyY2goKSB7Ci0gICAgICAgIGlmICAgY2hlY2tfYXJtX2FyY2ggNDsgICAgICAgIHRoZW4gZWNobyBhcm12NDsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA0VDsgICAgICAgdGhlbiBlY2hvIGFybXY0dDsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA1OyAgICAgICAgdGhlbiBlY2hvIGFybXY1OwotICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDVFOyAgICAgICB0aGVuIGVjaG8gYXJtdjVlOwotICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDVUOyAgICAgICB0aGVuIGVjaG8gYXJtdjV0OwotICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDVURTsgICAgICB0aGVuIGVjaG8gYXJtdjV0ZTsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA1VEVKOyAgICAgdGhlbiBlY2hvIGFybXY1dGU7Ci0gICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNjsgICAgICAgIHRoZW4gZWNobyBhcm12NjsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA2SjsgICAgICAgdGhlbiBlY2hvIGFybXY2ajsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA2SzsgICAgICAgdGhlbiBlY2hvIGFybXY2azsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA2WjsgICAgICAgdGhlbiBlY2hvIGFybXY2ejsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA2Wks7ICAgICAgdGhlbiBlY2hvIGFybXY2ems7Ci0gICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNlQyOyAgICAgIHRoZW4gZWNobyBhcm12NnQyOwotICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDc7ICAgICAgICB0aGVuIGVjaG8gYXJtdjc7Ci0gICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggN0EgIDdfQTsgIHRoZW4gZWNobyBhcm12Ny1hOwotICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDdTOyAgICAgICB0aGVuIGVjaG8gYXJtdjctYTsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA3UiAgN19SOyAgdGhlbiBlY2hvIGFybXY3LXI7Ci0gICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggN00gIDdfTTsgIHRoZW4gZWNobyBhcm12Ny1tOwotICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDdFTSA3RV9NOyB0aGVuIGVjaG8gYXJtdjctbTsKLSAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA4QSAgOF9BOyAgdGhlbiBlY2hvIGFybXY4LWE7CisgICAgICAgIGlmICAgY2hlY2tfYXJtX2FyY2ggNDsgICAgICAgIHRoZW4gZWNobyBhcm12NAorICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDRUOyAgICAgICB0aGVuIGVjaG8gYXJtdjR0CisgICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNTsgICAgICAgIHRoZW4gZWNobyBhcm12NQorICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDVFOyAgICAgICB0aGVuIGVjaG8gYXJtdjVlCisgICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNVQ7ICAgICAgIHRoZW4gZWNobyBhcm12NXQKKyAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA1VEU7ICAgICAgdGhlbiBlY2hvIGFybXY1dGUKKyAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA1VEVKOyAgICAgdGhlbiBlY2hvIGFybXY1dGUKKyAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA2OyAgICAgICAgdGhlbiBlY2hvIGFybXY2CisgICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNko7ICAgICAgIHRoZW4gZWNobyBhcm12NmoKKyAgICAgICAgZWxpZiBjaGVja19hcm1fYXJjaCA2SzsgICAgICAgdGhlbiBlY2hvIGFybXY2aworICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDZaOyAgICAgICB0aGVuIGVjaG8gYXJtdjZ6CisgICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNktaOyAgICAgIHRoZW4gZWNobyBhcm12NnprCisgICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNlpLOyAgICAgIHRoZW4gZWNobyBhcm12NnprCisgICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNlQyOyAgICAgIHRoZW4gZWNobyBhcm12NnQyCisgICAgICAgIGVsaWYgY2hlY2tfYXJtX2FyY2ggNzsgICAgICAgIHRoZW4gZWNobyBhcm12NworICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDdBICA3X0E7ICB0aGVuIGVjaG8gYXJtdjctYQorICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDdTOyAgICAgICB0aGVuIGVjaG8gYXJtdjctYQorICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDdSICA3X1I7ICB0aGVuIGVjaG8gYXJtdjctcgorICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDdNICA3X007ICB0aGVuIGVjaG8gYXJtdjctbQorICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDdFTSA3RV9NOyB0aGVuIGVjaG8gYXJtdjctbQorICAgICAgICBlbGlmIGNoZWNrX2FybV9hcmNoIDhBICA4X0E7ICB0aGVuIGVjaG8gYXJtdjgtYQogICAgICAgICBmaQogICAgIH0KIApAQCAtNDE1MywxMTggKzQ3NDksOTcgQEAKIAogICAgIGNwdWZsYWdzPSItbWFyY2g9JGNwdSIKIAotICAgIGNhc2UgJGNwdSBpbgotICAgICAgICAyNGtjKQotICAgICAgICAgICAgZGlzYWJsZSBtaXBzMzJyNgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzNjRyMgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzNjRyNgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzZnB1Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3AKLSAgICAgICAgICAgIGRpc2FibGUgbWlwc2RzcHIyCi0gICAgICAgICAgICBkaXNhYmxlIG1zYQotICAgICAgICA7OwotICAgICAgICAyNGtmKikKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczMycjYKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczY0cjIKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczY0cjYKLSAgICAgICAgICAgIGRpc2FibGUgbWlwc2RzcAotICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwcjIKLSAgICAgICAgICAgIGRpc2FibGUgbXNhCi0gICAgICAgIDs7Ci0gICAgICAgIDI0a2VjfDM0a2N8MTAwNGtjKQotICAgICAgICAgICAgZGlzYWJsZSBtaXBzMzJyNgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzNjRyMgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzNjRyNgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzZnB1Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3ByMgotICAgICAgICAgICAgZGlzYWJsZSBtc2EKLSAgICAgICAgOzsKLSAgICAgICAgMjRrZWYqfDM0a2YqfDEwMDRrZiopCi0gICAgICAgICAgICBkaXNhYmxlIG1pcHMzMnI2Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHM2NHIyCi0gICAgICAgICAgICBkaXNhYmxlIG1pcHM2NHI2Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3ByMgotICAgICAgICAgICAgZGlzYWJsZSBtc2EKLSAgICAgICAgOzsKLSAgICAgICAgNzRrYykKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczMycjYKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczY0cjIKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczY0cjYKLSAgICAgICAgICAgIGRpc2FibGUgbWlwc2ZwdQotICAgICAgICAgICAgZGlzYWJsZSBtc2EKLSAgICAgICAgOzsKLSAgICAgICAgNzRrZikKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczMycjYKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczY0cjIKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczY0cjYKLSAgICAgICAgICAgIGRpc2FibGUgbXNhCi0gICAgICAgIDs7Ci0gICAgICAgIHA1NjAwKQotICAgICAgICAgICAgZGlzYWJsZSBtaXBzMzJyNgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzNjRyMgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzNjRyNgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwCi0gICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3ByMgotICAgICAgICAgICAgY2hlY2tfY2ZsYWdzICItbXR1bmU9cDU2MDAiICYmCi0gICAgICAgICAgICBjaGVja19jZmxhZ3MgIi1tZnA2NCAtbXNjaGVkLXdlaWdodCAtbWxvYWQtc3RvcmUtcGFpcnMgLWZ1bnJvbGwtbG9vcHMiICYmCi0gICAgICAgICAgICBhZGRfYXNmbGFncyAiLW1mcDY0IgotICAgICAgICA7OwotICAgICAgICBpNjQwMCkKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczMycjIKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczMycjYKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczY0cjIKLSAgICAgICAgICAgIGRpc2FibGUgbWlwc2RzcAotICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwcjIKLSAgICAgICAgICAgIGNoZWNrX2NmbGFncyAiLW10dW5lPWk2NDAwIC1tYWJpPTY0IiAmJgotICAgICAgICAgICAgY2hlY2tfY2ZsYWdzICItbWZwNjQgLW1zY2hlZC13ZWlnaHQgLW1sb2FkLXN0b3JlLXBhaXJzIC1mdW5yb2xsLWxvb3BzIiAmJgotICAgICAgICAgICAgY2hlY2tfbGRmbGFncyAiLW1hYmk9NjQiICYmCi0gICAgICAgICAgICBhZGRfYXNmbGFncyAiLW1mcDY0IgotICAgICAgICA7OwotICAgICAgICBsb29uZ3NvbiopCi0gICAgICAgICAgICBkaXNhYmxlIG1pcHMzMnIyCi0gICAgICAgICAgICBkaXNhYmxlIG1pcHMzMnI2Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHM2NHIyCi0gICAgICAgICAgICBkaXNhYmxlIG1pcHM2NHI2Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHNmcHUKLSAgICAgICAgICAgIGRpc2FibGUgbWlwc2RzcAotICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwcjIKLSAgICAgICAgICAgIGRpc2FibGUgbXNhCi0gICAgICAgICAgICBlbmFibGUgbG9jYWxfYWxpZ25lZF84IGxvY2FsX2FsaWduZWRfMTYgbG9jYWxfYWxpZ25lZF8zMgotICAgICAgICAgICAgZW5hYmxlIHNpbWRfYWxpZ25fMTYKLSAgICAgICAgICAgIGVuYWJsZSBmYXN0XzY0Yml0Ci0gICAgICAgICAgICBlbmFibGUgZmFzdF9jbHoKLSAgICAgICAgICAgIGVuYWJsZSBmYXN0X2Ntb3YKLSAgICAgICAgICAgIGVuYWJsZSBmYXN0X3VuYWxpZ25lZAotICAgICAgICAgICAgZGlzYWJsZSBhbGlnbmVkX3N0YWNrCi0gICAgICAgICAgICBjYXNlICRjcHUgaW4KLSAgICAgICAgICAgICAgICBsb29uZ3NvbjMqKQotICAgICAgICAgICAgICAgICAgICBjcHVmbGFncz0iLW1hcmNoPWxvb25nc29uM2EgLW1oYXJkLWZsb2F0IC1mbm8tZXhwZW5zaXZlLW9wdGltaXphdGlvbnMiCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICBsb29uZ3NvbjJlKQotICAgICAgICAgICAgICAgICAgICBjcHVmbGFncz0iLW1hcmNoPWxvb25nc29uMmUgLW1oYXJkLWZsb2F0IC1mbm8tZXhwZW5zaXZlLW9wdGltaXphdGlvbnMiCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgICAgICBsb29uZ3NvbjJmKQotICAgICAgICAgICAgICAgICAgICBjcHVmbGFncz0iLW1hcmNoPWxvb25nc29uMmYgLW1oYXJkLWZsb2F0IC1mbm8tZXhwZW5zaXZlLW9wdGltaXphdGlvbnMiCi0gICAgICAgICAgICAgICAgOzsKLSAgICAgICAgICAgIGVzYWMKLSAgICAgICAgOzsKLSAgICAgICAgZ2VuZXJpYykKLSAgICAgICAgICAgIGRpc2FibGUgbWlwczY0cjYKLSAgICAgICAgICAgIGRpc2FibGUgbXNhCi0gICAgICAgIDs7Ci0gICAgICAgICopCi0gICAgICAgICAgICAjIFVua25vd24gQ1BVLiBEaXNhYmxlIGV2ZXJ5dGhpbmcuCi0gICAgICAgICAgICB3YXJuICJ1bmtub3duIENQVS4gRGlzYWJsaW5nIGFsbCBNSVBTIG9wdGltaXphdGlvbnMuIgotICAgICAgICAgICAgZGlzYWJsZSBtaXBzZnB1Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHMzMnIyCi0gICAgICAgICAgICBkaXNhYmxlIG1pcHMzMnI2Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHM2NHIyCi0gICAgICAgICAgICBkaXNhYmxlIG1pcHM2NHI2Ci0gICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3AKLSAgICAgICAgICAgIGRpc2FibGUgbWlwc2RzcHIyCi0gICAgICAgICAgICBkaXNhYmxlIG1zYQotICAgICAgICA7OwotICAgIGVzYWMKKyAgICBpZiBbICIkY3B1IiAhPSAiZ2VuZXJpYyIgXTsgdGhlbgorICAgICAgICBkaXNhYmxlIG1pcHMzMnIyCisgICAgICAgIGRpc2FibGUgbWlwczMycjUKKyAgICAgICAgZGlzYWJsZSBtaXBzNjRyMgorICAgICAgICBkaXNhYmxlIG1pcHMzMnI2CisgICAgICAgIGRpc2FibGUgbWlwczY0cjYKKyAgICAgICAgZGlzYWJsZSBsb29uZ3NvbjIKKyAgICAgICAgZGlzYWJsZSBsb29uZ3NvbjMKKworICAgICAgICBjYXNlICRjcHUgaW4KKyAgICAgICAgICAgIDI0a2N8MjRrZip8MjRrZWN8MzRrY3wxMDA0a2N8MjRrZWYqfDM0a2YqfDEwMDRrZip8NzRrY3w3NGtmKQorICAgICAgICAgICAgICAgIGVuYWJsZSBtaXBzMzJyMgorICAgICAgICAgICAgICAgIGRpc2FibGUgbXNhCisgICAgICAgICAgICA7OworICAgICAgICAgICAgcDU2MDB8aTY0MDB8cDY2MDApCisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwCisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwcjIKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICBsb29uZ3NvbiopCisgICAgICAgICAgICAgICAgZW5hYmxlIGxvb25nc29uMgorICAgICAgICAgICAgICAgIGVuYWJsZSBsb29uZ3NvbjMKKyAgICAgICAgICAgICAgICBlbmFibGUgbG9jYWxfYWxpZ25lZAorICAgICAgICAgICAgICAgIGVuYWJsZSBzaW1kX2FsaWduXzE2CisgICAgICAgICAgICAgICAgZW5hYmxlIGZhc3RfNjRiaXQKKyAgICAgICAgICAgICAgICBlbmFibGUgZmFzdF9jbHoKKyAgICAgICAgICAgICAgICBlbmFibGUgZmFzdF9jbW92CisgICAgICAgICAgICAgICAgZW5hYmxlIGZhc3RfdW5hbGlnbmVkCisgICAgICAgICAgICAgICAgZGlzYWJsZSBhbGlnbmVkX3N0YWNrCisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZnB1CisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwCisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwcjIKKyAgICAgICAgICAgICAgICBjYXNlICRjcHUgaW4KKyAgICAgICAgICAgICAgICAgICAgbG9vbmdzb24zKikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdWZsYWdzPSItbWFyY2g9bG9vbmdzb24zYSAtbWhhcmQtZmxvYXQgLWZuby1leHBlbnNpdmUtb3B0aW1pemF0aW9ucyIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICAgbG9vbmdzb24yZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdWZsYWdzPSItbWFyY2g9bG9vbmdzb24yZSAtbWhhcmQtZmxvYXQgLWZuby1leHBlbnNpdmUtb3B0aW1pemF0aW9ucyIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICAgICAgbG9vbmdzb24yZikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdWZsYWdzPSItbWFyY2g9bG9vbmdzb24yZiAtbWhhcmQtZmxvYXQgLWZuby1leHBlbnNpdmUtb3B0aW1pemF0aW9ucyIKKyAgICAgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICA7OworICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICAjIFVua25vd24gQ1BVLiBEaXNhYmxlIGV2ZXJ5dGhpbmcuCisgICAgICAgICAgICAgICAgd2FybiAidW5rbm93biBDUFUuIERpc2FibGluZyBhbGwgTUlQUyBvcHRpbWl6YXRpb25zLiIKKyAgICAgICAgICAgICAgICBkaXNhYmxlIG1pcHNmcHUKKyAgICAgICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3AKKyAgICAgICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3ByMgorICAgICAgICAgICAgICAgIGRpc2FibGUgbXNhCisgICAgICAgICAgICAgICAgZGlzYWJsZSBtbWkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKworICAgICAgICBjYXNlICRjcHUgaW4KKyAgICAgICAgICAgIDI0a2MpCisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZnB1CisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwCisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwcjIKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICAyNGtmKikKKyAgICAgICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3AKKyAgICAgICAgICAgICAgICBkaXNhYmxlIG1pcHNkc3ByMgorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIDI0a2VjfDM0a2N8MTAwNGtjKQorICAgICAgICAgICAgICAgIGRpc2FibGUgbWlwc2ZwdQorICAgICAgICAgICAgICAgIGRpc2FibGUgbWlwc2RzcHIyCisgICAgICAgICAgICA7OworICAgICAgICAgICAgMjRrZWYqfDM0a2YqfDEwMDRrZiopCisgICAgICAgICAgICAgICAgZGlzYWJsZSBtaXBzZHNwcjIKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICA3NGtjKQorICAgICAgICAgICAgICAgIGRpc2FibGUgbWlwc2ZwdQorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIHA1NjAwKQorICAgICAgICAgICAgICAgIGVuYWJsZSBtaXBzMzJyNQorICAgICAgICAgICAgICAgIGNoZWNrX2NmbGFncyAiLW10dW5lPXA1NjAwIiAmJiBjaGVja19jZmxhZ3MgIi1tc2NoZWQtd2VpZ2h0IC1tbG9hZC1zdG9yZS1wYWlycyAtZnVucm9sbC1sb29wcyIKKyAgICAgICAgICAgIDs7CisgICAgICAgICAgICBpNjQwMCkKKyAgICAgICAgICAgICAgICBlbmFibGUgbWlwczY0cjYKKyAgICAgICAgICAgICAgICBjaGVja19jZmxhZ3MgIi1tdHVuZT1pNjQwMCAtbWFiaT02NCIgJiYgY2hlY2tfY2ZsYWdzICItbXNjaGVkLXdlaWdodCAtbWxvYWQtc3RvcmUtcGFpcnMgLWZ1bnJvbGwtbG9vcHMiICYmIGNoZWNrX2xkZmxhZ3MgIi1tYWJpPTY0IgorICAgICAgICAgICAgOzsKKyAgICAgICAgICAgIHA2NjAwKQorICAgICAgICAgICAgICAgIGVuYWJsZSBtaXBzNjRyNgorICAgICAgICAgICAgICAgIGNoZWNrX2NmbGFncyAiLW10dW5lPXA2NjAwIC1tYWJpPTY0IiAmJiBjaGVja19jZmxhZ3MgIi1tc2NoZWQtd2VpZ2h0IC1tbG9hZC1zdG9yZS1wYWlycyAtZnVucm9sbC1sb29wcyIgJiYgY2hlY2tfbGRmbGFncyAiLW1hYmk9NjQiCisgICAgICAgICAgICA7OworICAgICAgICBlc2FjCisgICAgZWxzZQorICAgICAgICAjIFdlIGRvIG5vdCBkaXNhYmxlIGFueXRoaW5nLiBJcyB1cCB0byB0aGUgdXNlciB0byBkaXNhYmxlIHRoZSB1bndhbnRlZCBmZWF0dXJlcy4KKyAgICAgICAgd2FybiAnZ2VuZXJpYyBjcHUgc2VsZWN0ZWQnCisgICAgZmkKIAogZWxpZiBlbmFibGVkIHBwYzsgdGhlbgogCkBAIC00MzUzLDcgKzQ5MjgsOCBAQAogICAgICAgICA7OwogICAgICAgICAjIHRhcmdldHMgdGhhdCBkbyBzdXBwb3J0IG5vcGwgYW5kIGNvbmRpdGlvbmFsIG1vdiAoY21vdikKICAgICAgICAgaTY4NnxwZW50aXVtcHJvfHBlbnRpdW1bMjNdfHBlbnRpdW0tbXxhdGhsb258YXRobG9uLXRiaXJkfGF0aGxvbi00fGF0aGxvbi1bbXhdcHxhdGhsb242NCp8azgqfG9wdGVyb24qfGF0aGxvbi1meFwKLSAgICAgICAgfGNvcmUqfGF0b218Ym9ubmVsbHxuZWhhbGVtfHdlc3RtZXJlfHNpbHZlcm1vbnR8c2FuZHlicmlkZ2V8aXZ5YnJpZGdlfGhhc3dlbGx8YnJvYWR3ZWxsfGFtZGZhbTEwfGJhcmNlbG9uYXxiW2R0XXZlciopCisgICAgICAgIHxjb3JlKnxhdG9tfGJvbm5lbGx8bmVoYWxlbXx3ZXN0bWVyZXxzaWx2ZXJtb250fHNhbmR5YnJpZGdlfGl2eWJyaWRnZXxoYXN3ZWxsfGJyb2Fkd2VsbHxza3lsYWtlKnxrbmxcCisgICAgICAgIHxhbWRmYW0xMHxiYXJjZWxvbmF8YltkdF12ZXIqfHpudmVyKikKICAgICAgICAgICAgIGNwdWZsYWdzPSItbWFyY2g9JGNwdSIKICAgICAgICAgICAgIGVuYWJsZSBpNjg2CiAgICAgICAgICAgICBlbmFibGUgZmFzdF9jbW92CkBAIC00Mzc1LDcgKzQ5NTEsNyBAQAogZmkKIAogIyBjb21waWxlciBzYW5pdHkgY2hlY2sKLWNoZWNrX2V4ZWMgPDxFT0YKK3Rlc3RfZXhlYyA8PEVPRgogaW50IG1haW4odm9pZCl7IHJldHVybiAwOyB9CiBFT0YKIGlmIHRlc3QgIiQ/IiAhPSAwOyB0aGVuCkBAIC00Mzg5LDc2ICs0OTY1LDc1IEBACiAKIGFkZF9jcHBmbGFncyAtRF9JU09DOTlfU09VUkNFCiBhZGRfY3h4ZmxhZ3MgLURfX1NURENfQ09OU1RBTlRfTUFDUk9TCi1jaGVja19jZmxhZ3MgLXN0ZD1jOTkKLWNoZWNrX2NjIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgPDxFT0YgJiYgYWRkX2NwcGZsYWdzIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLUVPRgotY2hlY2tfY2MgLURfTEFSR0VGSUxFX1NPVVJDRSA8PEVPRiAmJiBhZGRfY3BwZmxhZ3MgLURfTEFSR0VGSUxFX1NPVVJDRQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotRU9GCitjaGVja19jeHhmbGFncyAtc3RkPWMrKzExIHx8IGNoZWNrX2N4eGZsYWdzIC1zdGQ9YysrMHgKKworIyBzb21lIGNvbXBpbGVycyBzaWxlbnRseSBhY2NlcHQgLXN0ZD1jMTEsIHNvIHdlIGFsc28gbmVlZCB0byBjaGVjayB0aGF0IHRoZQorIyB2ZXJzaW9uIG1hY3JvIGlzIGRlZmluZWQgcHJvcGVybHkKK3Rlc3RfY2ZsYWdzX2NjIC1zdGQ9YzExIGN0eXBlLmggIl9fU1REQ19WRVJTSU9OX18gPj0gMjAxMTEyTCIgJiYKKyAgICBhZGRfY2ZsYWdzIC1zdGQ9YzExIHx8CisgICAgY2hlY2tfY2ZsYWdzIC1zdGQ9Yzk5CisKK2NoZWNrX2NwcGZsYWdzIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQKK2NoZWNrX2NwcGZsYWdzIC1EX0xBUkdFRklMRV9TT1VSQ0UKIAogYWRkX2hvc3RfY3BwZmxhZ3MgLURfSVNPQzk5X1NPVVJDRQogY2hlY2tfaG9zdF9jZmxhZ3MgLXN0ZD1jOTkKIGNoZWNrX2hvc3RfY2ZsYWdzIC1XYWxsCi1jaGVja19ob3N0X2NmbGFncyAtTzMKK2NoZWNrX2hvc3RfY2ZsYWdzICRob3N0X2NmbGFnc19zcGVlZAogCiBjaGVja182NGJpdCgpewogICAgIGFyY2gzMj0kMQogICAgIGFyY2g2ND0kMgotICAgIGV4cHI9JDMKLSAgICBjaGVja19jb2RlIGNjICIiICJpbnQgdGVzdFsyKigkZXhwcikgLSAxXSIgJiYKKyAgICBleHByPSR7MzotJ3NpemVvZih2b2lkICopID4gNCd9CisgICAgdGVzdF9jb2RlIGNjICIiICJpbnQgdGVzdFsyKigkZXhwcikgLSAxXSIgJiYKICAgICAgICAgc3ViYXJjaD0kYXJjaDY0IHx8IHN1YmFyY2g9JGFyY2gzMgorICAgIGVuYWJsZSAkc3ViYXJjaAogfQogCiBjYXNlICIkYXJjaCIgaW4KICAgICBhYXJjaDY0fGFscGhhfGlhNjQpCi0gICAgICAgIHNwaWM9JHNoYXJlZAorICAgICAgICBlbmFibGVkIHNoYXJlZCAmJiBlbmFibGVfd2VhayBwaWMKICAgICA7OwogICAgIG1pcHMpCiAgICAgICAgIGNoZWNrXzY0Yml0IG1pcHMgbWlwczY0ICdfTUlQU19TSU0gPiAxJwotICAgICAgICBzcGljPSRzaGFyZWQKKyAgICAgICAgZW5hYmxlZCBzaGFyZWQgJiYgZW5hYmxlX3dlYWsgcGljCiAgICAgOzsKICAgICBwYXJpc2MpCi0gICAgICAgIGNoZWNrXzY0Yml0IHBhcmlzYyBwYXJpc2M2NCAnc2l6ZW9mKHZvaWQgKikgPiA0JwotICAgICAgICBzcGljPSRzaGFyZWQKKyAgICAgICAgY2hlY2tfNjRiaXQgcGFyaXNjIHBhcmlzYzY0CisgICAgICAgIGVuYWJsZWQgc2hhcmVkICYmIGVuYWJsZV93ZWFrIHBpYwogICAgIDs7CiAgICAgcHBjKQotICAgICAgICBjaGVja182NGJpdCBwcGMgcHBjNjQgJ3NpemVvZih2b2lkICopID4gNCcKLSAgICAgICAgc3BpYz0kc2hhcmVkCisgICAgICAgIGNoZWNrXzY0Yml0IHBwYyBwcGM2NAorICAgICAgICBlbmFibGVkIHNoYXJlZCAmJiBlbmFibGVfd2VhayBwaWMKICAgICA7OwogICAgIHMzOTApCi0gICAgICAgIGNoZWNrXzY0Yml0IHMzOTAgczM5MHggJ3NpemVvZih2b2lkICopID4gNCcKLSAgICAgICAgc3BpYz0kc2hhcmVkCisgICAgICAgIGNoZWNrXzY0Yml0IHMzOTAgczM5MHgKKyAgICAgICAgZW5hYmxlZCBzaGFyZWQgJiYgZW5hYmxlX3dlYWsgcGljCiAgICAgOzsKICAgICBzcGFyYykKLSAgICAgICAgY2hlY2tfNjRiaXQgc3BhcmMgc3BhcmM2NCAnc2l6ZW9mKHZvaWQgKikgPiA0JwotICAgICAgICBzcGljPSRzaGFyZWQKKyAgICAgICAgY2hlY2tfNjRiaXQgc3BhcmMgc3BhcmM2NAorICAgICAgICBlbmFibGVkIHNoYXJlZCAmJiBlbmFibGVfd2VhayBwaWMKICAgICA7OwogICAgIHg4NikKLSAgICAgICAgY2hlY2tfNjRiaXQgeDg2XzMyIHg4Nl82NCAnc2l6ZW9mKHZvaWQgKikgPiA0JwotICAgICAgICAjIFRyZWF0IHgzMiBhcyB4NjQgZm9yIG5vdy4gTm90ZSBpdCBhbHNvIG5lZWRzIHNwaWM9JHNoYXJlZAotICAgICAgICB0ZXN0ICIkc3ViYXJjaCIgPSAieDg2XzMyIiAmJiBjaGVja19jcHBfY29uZGl0aW9uIHN0ZGRlZi5oICdkZWZpbmVkKF9feDg2XzY0X18pJyAmJgotICAgICAgICAgICAgc3ViYXJjaD14ODZfNjQKLSAgICAgICAgaWYgdGVzdCAiJHN1YmFyY2giID0gIng4Nl82NCI7IHRoZW4KLSAgICAgICAgICAgIHNwaWM9JHNoYXJlZAorICAgICAgICBjaGVja182NGJpdCB4ODZfMzIgeDg2XzY0CisgICAgICAgICMgVHJlYXQgeDMyIGFzIHg2NCBmb3Igbm93LiBOb3RlIGl0IGFsc28gbmVlZHMgcGljIGlmIHNoYXJlZAorICAgICAgICB0ZXN0ICIkc3ViYXJjaCIgPSAieDg2XzMyIiAmJiB0ZXN0X2NwcF9jb25kaXRpb24gc3RkZGVmLmggJ2RlZmluZWQoX194ODZfNjRfXyknICYmCisgICAgICAgICAgICBzdWJhcmNoPXg4Nl82NCAmJiBlbmFibGUgeDg2XzY0ICYmIGRpc2FibGUgeDg2XzMyCisgICAgICAgIGlmIGVuYWJsZWQgeDg2XzY0OyB0aGVuCisgICAgICAgICAgICBlbmFibGVkIHNoYXJlZCAmJiBlbmFibGVfd2VhayBwaWMKKyAgICAgICAgICAgIG9iamZvcm1hdD1lbGY2NAogICAgICAgICBmaQogICAgIDs7Ci0gICAgcHBjKQotICAgICAgICBjaGVja19jYyA8PEVPRiAmJiBzdWJhcmNoPSJwcGM2NCIKLSAgICAgICAgaW50IHRlc3RbKGludClzaXplb2YoY2hhciopIC0gN107Ci1FT0YKLSAgICA7OwogZXNhYwogCi1lbmFibGUgJHN1YmFyY2gKLWVuYWJsZWQgc3BpYyAmJiBlbmFibGVfd2VhayBwaWMKLQogIyBPUyBzcGVjaWZpYwogY2FzZSAkdGFyZ2V0X29zIGluCiAgICAgYWl4KQogICAgICAgICBTSEZMQUdTPS1zaGFyZWQKICAgICAgICAgYWRkX2NwcGZsYWdzICctSVwkKFNSQ19QQVRIKS9jb21wYXQvYWl4JwogICAgICAgICBlbmFibGVkIHNoYXJlZCAmJiBhZGRfbGRmbGFncyAtV2wsLWJydGwKKyAgICAgICAgYXJmbGFncz0nLVhhbnkgLXIgLWMnCisgICAgICAgIHN0cmlwdHlwZT0iIgogICAgICAgICA7OwogICAgIGFuZHJvaWQpCiAgICAgICAgIGRpc2FibGUgc3ltdmVyCkBAIC00NDcwLDExICs1MDQ1LDExIEBACiAgICAgaGFpa3UpCiAgICAgICAgIHByZWZpeF9kZWZhdWx0PSIvYm9vdC9jb21tb24iCiAgICAgICAgIG5ldHdvcmtfZXh0cmFsaWJzPSItbG5ldHdvcmsiCi0gICAgICAgIGhvc3RfbGlicz0KKyAgICAgICAgaG9zdF9leHRyYWxpYnM9CiAgICAgICAgIDs7CiAgICAgc3Vub3MpCiAgICAgICAgIFNIRkxBR1M9Jy1zaGFyZWQgLVdsLC1oLCQkKEBGKScKLSAgICAgICAgZW5hYmxlZCB4ODYgJiYgU0hGTEFHUz0iLW1pbXB1cmUtdGV4dCAkU0hGTEFHUyIKKyAgICAgICAgZW5hYmxlZCB4ODYgJiYgYXBwZW5kIFNIRkxBR1MgLW1pbXB1cmUtdGV4dAogICAgICAgICBuZXR3b3JrX2V4dHJhbGlicz0iLWxzb2NrZXQgLWxuc2wiCiAgICAgICAgIGFkZF9jcHBmbGFncyAtRF9fRVhURU5TSU9OU19fCiAgICAgICAgICMgV2hlbiB1c2luZyBzdW5jYyB0byBidWlsZCwgdGhlIFNvbGFyaXMgbGlua2VyIHdpbGwgbWFyawpAQCAtNDQ4Niw3ICs1MDYxLDggQEAKICAgICAgICAgICAgIGVjaG8gImh3Y2FwXzEgPSBPVkVSUklERTsiID4gbWFwZmlsZSAmJgogICAgICAgICAgICAgYWRkX2xkZmxhZ3MgLVdsLC1NLG1hcGZpbGUKICAgICAgICAgbm1fZGVmYXVsdD0nbm0gLVAgLWcnCi0gICAgICAgIFNMSUJfQ1JFQVRFX0RFRl9DTUQ9JyQoUSlwZXJsICQoU1JDX1BBVEgpL2NvbXBhdC9zb2xhcmlzL21ha2Vfc3VudmVyLnBsICQkKGZpbHRlciAlLnZlciwkJF4pICQoT0JKUykgfCBncmVwIC12IEAgPiAkKFNVQkRJUilsaWIkKE5BTUUpLnZlci1zb2wyJworICAgICAgICB2ZXJzaW9uX3NjcmlwdD0nLU0nCisgICAgICAgIFZFUlNJT05fU0NSSVBUX1BPU1RQUk9DRVNTX0NNRD0ncGVybCAkKFNSQ19QQVRIKS9jb21wYXQvc29sYXJpcy9tYWtlX3N1bnZlci5wbCAtICQoT0JKUyknCiAgICAgICAgIDs7CiAgICAgbmV0YnNkKQogICAgICAgICBkaXNhYmxlIHN5bXZlcgpAQCAtNDQ5Niw2ICs1MDcyLDcgQEAKICAgICAgICAgOzsKICAgICBvcGVuYnNkfGJpdHJpZykKICAgICAgICAgZGlzYWJsZSBzeW12ZXIKKyAgICAgICAgc3RyaXB0eXBlPSIiCiAgICAgICAgIFNIRkxBR1M9Jy1zaGFyZWQnCiAgICAgICAgIFNMSUJfSU5TVEFMTF9OQU1FPSckKFNMSUJOQU1FKS4kKExJQk1BSk9SKS4kKExJQk1JTk9SKScKICAgICAgICAgU0xJQl9JTlNUQUxMX0xJTktTPQpAQCAtNDUxMyw1NyArNTA5MCw2NyBAQAogICAgICAgICA7OwogICAgIGRhcndpbikKICAgICAgICAgZW5hYmxlZCBwcGMgJiYgYWRkX2FzZmxhZ3MgLWZvcmNlX2NwdXN1YnR5cGVfQUxMCi0gICAgICAgIFNIRkxBR1M9Jy1keW5hbWljbGliIC1XbCwtc2luZ2xlX21vZHVsZSAtV2wsLWluc3RhbGxfbmFtZSwkKFNITElCRElSKS8kKFNMSUJOQU1FX1dJVEhfTUFKT1IpLC1jdXJyZW50X3ZlcnNpb24sJChMSUJWRVJTSU9OKSwtY29tcGF0aWJpbGl0eV92ZXJzaW9uLCQoTElCTUFKT1IpJworICAgICAgICBpbnN0YWxsX25hbWVfZGlyX2RlZmF1bHQ9JyQoU0hMSUJESVIpJworICAgICAgICBTSEZMQUdTPSctZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgLVdsLC1pbnN0YWxsX25hbWUsJChJTlNUQUxMX05BTUVfRElSKS8kKFNMSUJOQU1FX1dJVEhfTUFKT1IpLC1jdXJyZW50X3ZlcnNpb24sJChMSUJWRVJTSU9OKSwtY29tcGF0aWJpbGl0eV92ZXJzaW9uLCQoTElCTUFKT1IpJwogICAgICAgICBlbmFibGVkIHg4Nl8zMiAmJiBhcHBlbmQgU0hGTEFHUyAtV2wsLXJlYWRfb25seV9yZWxvY3Msc3VwcHJlc3MKICAgICAgICAgc3RyaXA9IiR7c3RyaXB9IC14IgogICAgICAgICBhZGRfbGRmbGFncyAtV2wsLWR5bmFtaWMsLXNlYXJjaF9wYXRoc19maXJzdAorICAgICAgICBjaGVja19jZmxhZ3MgLVdlcnJvcj1wYXJ0aWFsLWF2YWlsYWJpbGl0eQogICAgICAgICBTTElCU1VGPSIuZHlsaWIiCiAgICAgICAgIFNMSUJOQU1FX1dJVEhfVkVSU0lPTj0nJChTTElCUFJFRikkKEZVTExOQU1FKS4kKExJQlZFUlNJT04pJChTTElCU1VGKScKICAgICAgICAgU0xJQk5BTUVfV0lUSF9NQUpPUj0nJChTTElCUFJFRikkKEZVTExOQU1FKS4kKExJQk1BSk9SKSQoU0xJQlNVRiknCi0gICAgICAgIG9iamZvcm1hdD0ibWFjaG8iCi0gICAgICAgIGVuYWJsZWQgeDg2XzY0ICYmIG9iamZvcm1hdD0ibWFjaG82NCIKKyAgICAgICAgZW5hYmxlZCB4ODZfNjQgJiYgb2JqZm9ybWF0PSJtYWNobzY0IiB8fCBvYmpmb3JtYXQ9Im1hY2hvMzIiCiAgICAgICAgIGVuYWJsZWRfYW55IHBpYyBzaGFyZWQgeDg2XzY0IHx8CiAgICAgICAgICAgICB7IGNoZWNrX2NmbGFncyAtbWR5bmFtaWMtbm8tcGljICYmIGFkZF9hc2ZsYWdzIC1tZHluYW1pYy1uby1waWM7IH0KKyAgICAgICAgY2hlY2tfaGVhZGVyIGRpc3BhdGNoL2Rpc3BhdGNoLmggJiYKKyAgICAgICAgICAgIGFkZF9jcHBmbGFncyAnLUlcJChTUkNfUEFUSCkvY29tcGF0L2Rpc3BhdGNoX3NlbWFwaG9yZScKKyAgICAgICAgaWYgdGVzdCAtbiAiJHN5c3Jvb3QiOyB0aGVuCisgICAgICAgICAgICBpc19pbiAtaXN5c3Jvb3QgJGNjICRDUFBGTEFHUyAkQ0ZMQUdTIHx8IGNoZWNrX2NwcGZsYWdzIC1pc3lzcm9vdCAkc3lzcm9vdAorICAgICAgICAgICAgaXNfaW4gLWlzeXNyb290ICRsZCAkTERGTEFHUyAgICAgICAgICB8fCBjaGVja19sZGZsYWdzICAtaXN5c3Jvb3QgJHN5c3Jvb3QKKyAgICAgICAgZmkKKyAgICAgICAgdmVyc2lvbl9zY3JpcHQ9Jy1leHBvcnRlZF9zeW1ib2xzX2xpc3QnCisgICAgICAgIFZFUlNJT05fU0NSSVBUX1BPU1RQUk9DRVNTX0NNRD0ndHIgIiAiICJcbiIgfCBzZWQgLW4gL2dsb2JhbDovLC9sb2NhbDovcCB8IGdyZXAgIjsiIHwgdHIgIjsiICJcbiIgfCBzZWQgLUUgInMvKC4rKS9fXDEvZyIgfCBzZWQgLUUgInMvKC4rW14qXSkkJCQkL1wxKi8iJwogICAgICAgICA7OwogICAgIG1zeXMqKQotICAgICAgICBkaWUgIk5hdGl2ZSBNU1lTIGJ1aWxkcyBhcmUgZGlzY291cmFnZWQsIHBsZWFzZSB1c2UgdGhlIE1JTkdXIGVudmlyb25tZW50LiI7CisgICAgICAgIGRpZSAiTmF0aXZlIE1TWVMgYnVpbGRzIGFyZSBkaXNjb3VyYWdlZCwgcGxlYXNlIHVzZSB0aGUgTUlOR1cgZW52aXJvbm1lbnQuIgogICAgICAgICA7OwogICAgIG1pbmd3MzIqfG1pbmd3NjQqKQotICAgICAgICBpZiB0ZXN0ICR0YXJnZXRfb3MgPSAibWluZ3czMmNlIjsgdGhlbgotICAgICAgICAgICAgZGlzYWJsZSBuZXR3b3JrCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHRhcmdldF9vcz1taW5ndzMyCi0gICAgICAgIGZpCi0gICAgICAgIGRlY2tsaW5rX291dGRldl9leHRyYWxpYnM9IiRkZWNrbGlua19vdXRkZXZfZXh0cmFsaWJzIC1sb2xlMzIgLWxvbGVhdXQzMiIKLSAgICAgICAgZGVja2xpbmtfaW5kZXZfZXh0cmFsaWJzPSIkZGVja2xpbmtfaW5kZXZfZXh0cmFsaWJzIC1sb2xlMzIgLWxvbGVhdXQzMiIKKyAgICAgICAgdGFyZ2V0X29zPW1pbmd3MzIKICAgICAgICAgTElCVEFSR0VUPWkzODYKICAgICAgICAgaWYgZW5hYmxlZCB4ODZfNjQ7IHRoZW4KICAgICAgICAgICAgIExJQlRBUkdFVD0iaTM4Njp4ODYtNjQiCiAgICAgICAgIGVsaWYgZW5hYmxlZCBhcm07IHRoZW4KLSAgICAgICAgICAgIExJQlRBUkdFVD1hcm0td2luY2UKKyAgICAgICAgICAgIExJQlRBUkdFVD0iYXJtIgorICAgICAgICBlbGlmIGVuYWJsZWQgYWFyY2g2NDsgdGhlbgorICAgICAgICAgICAgTElCVEFSR0VUPSJhcm02NCIKICAgICAgICAgZmkKLSAgICAgICAgZW5hYmxlZCBzaGFyZWQgJiYgISBlbmFibGVkIHNtYWxsICYmIGNoZWNrX2NtZCAkd2luZHJlcyAtLXZlcnNpb24gJiYgZW5hYmxlIGdudV93aW5kcmVzCisgICAgICAgIGlmIGVuYWJsZWQgc2hhcmVkOyB0aGVuCisgICAgICAgICAgICAjIENhbm5vdCBidWlsZCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIGxpYnMgd2hlbiB1c2luZyBkbGxpbXBvcnQuCisgICAgICAgICAgICBkaXNhYmxlIHN0YXRpYworICAgICAgICBmaQorICAgICAgICBlbmFibGVkIHNoYXJlZCAmJiAhIGVuYWJsZWQgc21hbGwgJiYgdGVzdF9jbWQgJHdpbmRyZXMgLS12ZXJzaW9uICYmIGVuYWJsZSBnbnVfd2luZHJlcwogICAgICAgICBlbmFibGVkIHg4Nl8zMiAmJiBjaGVja19sZGZsYWdzIC1XbCwtLWxhcmdlLWFkZHJlc3MtYXdhcmUKICAgICAgICAgc2hsaWJkaXJfZGVmYXVsdD0iJGJpbmRpcl9kZWZhdWx0IgogICAgICAgICBTTElCUFJFRj0iIgogICAgICAgICBTTElCU1VGPSIuZGxsIgogICAgICAgICBTTElCTkFNRV9XSVRIX1ZFUlNJT049JyQoU0xJQlBSRUYpJChGVUxMTkFNRSktJChMSUJWRVJTSU9OKSQoU0xJQlNVRiknCiAgICAgICAgIFNMSUJOQU1FX1dJVEhfTUFKT1I9JyQoU0xJQlBSRUYpJChGVUxMTkFNRSktJChMSUJNQUpPUikkKFNMSUJTVUYpJwotICAgICAgICBkbGx0b29sPSIke2Nyb3NzX3ByZWZpeH1kbGx0b29sIgotICAgICAgICBpZiBjaGVja19jbWQgbGliLmV4ZSAtbGlzdDsgdGhlbgotICAgICAgICAgICAgU0xJQl9FWFRSQV9DTUQ9LSdzZWQgLWUgInMvIEBbXiBdKi8vIiAkJChAOiQoU0xJQlNVRik9Lm9yaWcuZGVmKSA+ICQkKEA6JChTTElCU1VGKT0uZGVmKTsgbGliLmV4ZSAvbWFjaGluZTokKExJQlRBUkdFVCkgL2RlZjokJChAOiQoU0xJQlNVRik9LmRlZikgL291dDokKFNVQkRJUikkKFNMSUJOQU1FOiQoU0xJQlNVRik9LmxpYiknCisgICAgICAgIGlmIHRlc3RfY21kIGxpYi5leGUgLWxpc3Q7IHRoZW4KKyAgICAgICAgICAgIFNMSUJfRVhUUkFfQ01EPS0nbGliLmV4ZSAtbm9sb2dvIC1tYWNoaW5lOiQoTElCVEFSR0VUKSAtZGVmOiQkKEA6JChTTElCU1VGKT0uZGVmKSAtb3V0OiQoU1VCRElSKSQoU0xJQk5BTUU6JChTTElCU1VGKT0ubGliKScKICAgICAgICAgICAgIGlmIGVuYWJsZWQgeDg2XzY0OyB0aGVuCiAgICAgICAgICAgICAgICAgTElCVEFSR0VUPXg2NAogICAgICAgICAgICAgZmkKLSAgICAgICAgZWxpZiBjaGVja19jbWQgJGRsbHRvb2wgLS12ZXJzaW9uOyB0aGVuCi0gICAgICAgICAgICBTTElCX0VYVFJBX0NNRD0tJ3NlZCAtZSAicy8gQFteIF0qLy8iICQkKEA6JChTTElCU1VGKT0ub3JpZy5kZWYpID4gJCQoQDokKFNMSUJTVUYpPS5kZWYpOyAkKERMTFRPT0wpIC1tICQoTElCVEFSR0VUKSAtZCAkJChAOiQoU0xJQlNVRik9LmRlZikgLWwgJChTVUJESVIpJChTTElCTkFNRTokKFNMSUJTVUYpPS5saWIpIC1EICQoU0xJQk5BTUVfV0lUSF9NQUpPUiknCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNMSUJfRVhUUkFfQ01EPS0nJChETExUT09MKSAtbSAkKExJQlRBUkdFVCkgLWQgJCQoQDokKFNMSUJTVUYpPS5kZWYpIC1sICQoU1VCRElSKSQoU0xJQk5BTUU6JChTTElCU1VGKT0ubGliKSAtRCAkKFNMSUJOQU1FX1dJVEhfTUFKT1IpJwogICAgICAgICBmaQogICAgICAgICBTTElCX0lOU1RBTExfTkFNRT0nJChTTElCTkFNRV9XSVRIX01BSk9SKScKICAgICAgICAgU0xJQl9JTlNUQUxMX0xJTktTPQogICAgICAgICBTTElCX0lOU1RBTExfRVhUUkFfU0hMSUI9JyQoU0xJQk5BTUU6JChTTElCU1VGKT0ubGliKScKICAgICAgICAgU0xJQl9JTlNUQUxMX0VYVFJBX0xJQj0nbGliJChTTElCTkFNRTokKFNMSUJTVUYpPS5kbGwuYSkgJChTTElCTkFNRV9XSVRIX01BSk9SOiQoU0xJQlNVRik9LmRlZiknCi0gICAgICAgIFNIRkxBR1M9Jy1zaGFyZWQgLVdsLC0tb3V0cHV0LWRlZiwkJChAOiQoU0xJQlNVRik9Lm9yaWcuZGVmKSAtV2wsLS1vdXQtaW1wbGliLCQoU1VCRElSKWxpYiQoU0xJQk5BTUU6JChTTElCU1VGKT0uZGxsLmEpIC1XbCwtLWVuYWJsZS1ydW50aW1lLXBzZXVkby1yZWxvYyAtV2wsLS1kaXNhYmxlLWF1dG8taW1hZ2UtYmFzZScKLSAgICAgICAgb2JqZm9ybWF0PSJ3aW4zMiIKKyAgICAgICAgU0xJQl9DUkVBVEVfREVGX0NNRD0nRVhURVJOX1BSRUZJWD0iJChFWFRFUk5fUFJFRklYKSIgQVI9IiQoQVJfQ01EKSIgTk09IiQoTk1fQ01EKSIgJChTUkNfUEFUSCkvY29tcGF0L3dpbmRvd3MvbWFrZWRlZiAkKFNVQkRJUilsaWIkKE5BTUUpLnZlciAkKE9CSlMpID4gJCQoQDokKFNMSUJTVUYpPS5kZWYpJworICAgICAgICBTSEZMQUdTPSctc2hhcmVkIC1XbCwtLW91dC1pbXBsaWIsJChTVUJESVIpbGliJChTTElCTkFNRTokKFNMSUJTVUYpPS5kbGwuYSkgLVdsLC0tZGlzYWJsZS1hdXRvLWltYWdlLWJhc2UgJCQoQDokKFNMSUJTVUYpPS5kZWYpJworICAgICAgICBlbmFibGVkIHg4Nl82NCAmJiBvYmpmb3JtYXQ9IndpbjY0IiB8fCBvYmpmb3JtYXQ9IndpbjMyIgorICAgICAgICBkbGx0b29sPSIke2Nyb3NzX3ByZWZpeH1kbGx0b29sIgogICAgICAgICByYW5saWI9OgogICAgICAgICBlbmFibGUgZG9zX3BhdGhzCiAgICAgICAgIGNoZWNrX2xkZmxhZ3MgLVdsLC0tbnhjb21wYXQsLS1keW5hbWljYmFzZQpAQCAtNDU3Myw5ICs1MTYwLDkgQEAKICAgICAgICAgIyBob3dldmVyIGxkIHRoZW4gZm9yZ2V0cyB3aGF0IHRoZSBlbnRyeSBwb2ludCBzaG91bGQgYmUgKG9vcHMpIHNvIHdlCiAgICAgICAgICMgaGF2ZSB0byBtYW51YWxseSAocmUpc2V0IGl0LgogICAgICAgICBpZiBlbmFibGVkIHg4Nl8zMjsgdGhlbgotICAgICAgICAgICAgYWRkX2xkZXhlZmxhZ3MgLVdsLC0tcGljLWV4ZWN1dGFibGUsLWUsX21haW5DUlRTdGFydHVwCisgICAgICAgICAgICBkaXNhYmxlZCBkZWJ1ZyAmJiBhZGRfbGRleGVmbGFncyAtV2wsLS1waWMtZXhlY3V0YWJsZSwtZSxfbWFpbkNSVFN0YXJ0dXAKICAgICAgICAgZWxpZiBlbmFibGVkIHg4Nl82NDsgdGhlbgotICAgICAgICAgICAgYWRkX2xkZXhlZmxhZ3MgLVdsLC0tcGljLWV4ZWN1dGFibGUsLWUsbWFpbkNSVFN0YXJ0dXAKKyAgICAgICAgICAgIGRpc2FibGVkIGRlYnVnICYmIGFkZF9sZGV4ZWZsYWdzIC1XbCwtLXBpYy1leGVjdXRhYmxlLC1lLG1haW5DUlRTdGFydHVwCiAgICAgICAgICAgICBjaGVja19sZGZsYWdzIC1XbCwtLWhpZ2gtZW50cm9weS12YSAjIGJpbnV0aWxzIDIuMjUKICAgICAgICAgICAgICMgU2V0IGltYWdlIGJhc2UgPjRHQiBmb3IgZXh0cmEgZW50cm9weSB3aXRoIEhFQVNMUgogICAgICAgICAgICAgYWRkX2xkZXhlZmxhZ3MgLVdsLC0taW1hZ2UtYmFzZSwweDE0MDAwMDAwMApAQCAtNDU5NywxMyArNTE4NCwxMyBAQAogICAgICAgICBTTElCU1VGPSIuZGxsIgogICAgICAgICBTTElCTkFNRV9XSVRIX1ZFUlNJT049JyQoU0xJQlBSRUYpJChGVUxMTkFNRSktJChMSUJWRVJTSU9OKSQoU0xJQlNVRiknCiAgICAgICAgIFNMSUJOQU1FX1dJVEhfTUFKT1I9JyQoU0xJQlBSRUYpJChGVUxMTkFNRSktJChMSUJNQUpPUikkKFNMSUJTVUYpJwotICAgICAgICBTTElCX0NSRUFURV9ERUZfQ01EPSckKFNSQ19QQVRIKS9jb21wYXQvd2luZG93cy9tYWtlZGVmICQoU1VCRElSKWxpYiQoTkFNRSkudmVyICQoT0JKUykgPiAkJChAOiQoU0xJQlNVRik9LmRlZiknCisgICAgICAgIFNMSUJfQ1JFQVRFX0RFRl9DTUQ9J0VYVEVSTl9QUkVGSVg9IiQoRVhURVJOX1BSRUZJWCkiICQoU1JDX1BBVEgpL2NvbXBhdC93aW5kb3dzL21ha2VkZWYgJChTVUJESVIpbGliJChOQU1FKS52ZXIgJChPQkpTKSA+ICQkKEA6JChTTElCU1VGKT0uZGVmKScKICAgICAgICAgU0xJQl9JTlNUQUxMX05BTUU9JyQoU0xJQk5BTUVfV0lUSF9NQUpPUiknCiAgICAgICAgIFNMSUJfSU5TVEFMTF9MSU5LUz0KICAgICAgICAgU0xJQl9JTlNUQUxMX0VYVFJBX1NITElCPSckKFNMSUJOQU1FOiQoU0xJQlNVRik9LmxpYiknCiAgICAgICAgIFNMSUJfSU5TVEFMTF9FWFRSQV9MSUI9JyQoU0xJQk5BTUVfV0lUSF9NQUpPUjokKFNMSUJTVUYpPS5kZWYpJwogICAgICAgICBTSEZMQUdTPSctZGxsIC1kZWY6JCQoQDokKFNMSUJTVUYpPS5kZWYpIC1pbXBsaWI6JChTVUJESVIpJChTTElCTkFNRTokKFNMSUJTVUYpPS5saWIpJwotICAgICAgICBvYmpmb3JtYXQ9IndpbjMyIgorICAgICAgICBlbmFibGVkIHg4Nl82NCAmJiBvYmpmb3JtYXQ9IndpbjY0IiB8fCBvYmpmb3JtYXQ9IndpbjMyIgogICAgICAgICByYW5saWI9OgogICAgICAgICBlbmFibGUgZG9zX3BhdGhzCiAgICAgICAgIDs7CkBAIC00NjE4LDkgKzUyMDUsMTAgQEAKICAgICAgICAgU0xJQl9JTlNUQUxMX0xJTktTPQogICAgICAgICBTTElCX0lOU1RBTExfRVhUUkFfTElCPSdsaWIkKEZVTExOQU1FKS5kbGwuYScKICAgICAgICAgU0hGTEFHUz0nLXNoYXJlZCAtV2wsLS1vdXQtaW1wbGliLCQoU1VCRElSKWxpYiQoRlVMTE5BTUUpLmRsbC5hJwotICAgICAgICBvYmpmb3JtYXQ9IndpbjMyIgorICAgICAgICBlbmFibGVkIHg4Nl82NCAmJiBvYmpmb3JtYXQ9IndpbjY0IiB8fCBvYmpmb3JtYXQ9IndpbjMyIgogICAgICAgICBlbmFibGUgZG9zX3BhdGhzCi0gICAgICAgIGVuYWJsZWQgc2hhcmVkICYmICEgZW5hYmxlZCBzbWFsbCAmJiBjaGVja19jbWQgJHdpbmRyZXMgLS12ZXJzaW9uICYmIGVuYWJsZSBnbnVfd2luZHJlcworICAgICAgICBlbmFibGVkIHNoYXJlZCAmJiAhIGVuYWJsZWQgc21hbGwgJiYgdGVzdF9jbWQgJHdpbmRyZXMgLS12ZXJzaW9uICYmIGVuYWJsZSBnbnVfd2luZHJlcworICAgICAgICBhZGRfY3BwZmxhZ3MgLURfUE9TSVhfQ19TT1VSQ0U9MjAwMTEyIC1EX1hPUEVOX1NPVVJDRT02MDAKICAgICAgICAgOzsKICAgICAqLWRvc3xmcmVlZG9zfG9wZW5kb3MpCiAgICAgICAgIG5ldHdvcmtfZXh0cmFsaWJzPSItbHNvY2tldCIKQEAgLTQ2MjksOCArNTIxNyw4IEBACiAgICAgICAgIGFkZF9jcHBmbGFncyAtVV9fU1RSSUNUX0FOU0lfXwogICAgICAgICA7OwogICAgIGxpbnV4KQotICAgICAgICBlbmFibGUgZHYxMzk0CiAgICAgICAgIGVuYWJsZSBzZWN0aW9uX2RhdGFfcmVsX3JvCisgICAgICAgIGVuYWJsZWRfYW55IGFybSBhYXJjaDY0ICYmIGVuYWJsZV93ZWFrIGxpbnV4X3BlcmYKICAgICAgICAgOzsKICAgICBpcml4KikKICAgICAgICAgdGFyZ2V0X29zPWlyaXgKQEAgLTQ2MzgsMjQgKzUyMjYsMjYgQEAKICAgICAgICAgOzsKICAgICBvcy8yKikKICAgICAgICAgc3RyaXA9Imx4bGl0ZSAtQ1MiCi0gICAgICAgIGxuX3M9ImNwIC1mIgorICAgICAgICBzdHJpcHR5cGU9IiIKICAgICAgICAgb2JqZm9ybWF0PSJhb3V0IgogICAgICAgICBhZGRfY3BwZmxhZ3MgLURfR05VX1NPVVJDRQotICAgICAgICBhZGRfbGRmbGFncyAtWm9tZiAtWmJpbi1maWxlcyAtWmFyZ3Mtd2lsZCAtWm1hcAorICAgICAgICBhZGRfbGRmbGFncyAtWm9tZiAtWmJpbi1maWxlcyAtWmFyZ3Mtd2lsZCAtWmhpZ2gtbWVtIC1abWFwCiAgICAgICAgIFNIRkxBR1M9JyQoU1VCRElSKSQoTkFNRSkuZGVmIC1aZGxsIC1ab21mJwogICAgICAgICBMSUJTVUY9Il9zLmEiCiAgICAgICAgIFNMSUJQUkVGPSIiCiAgICAgICAgIFNMSUJTVUY9Ii5kbGwiCi0gICAgICAgIFNMSUJOQU1FX1dJVEhfVkVSU0lPTj0nJChTTElCUFJFRikkKE5BTUUpLSQoTElCVkVSU0lPTikkKFNMSUJTVUYpJwotICAgICAgICBTTElCTkFNRV9XSVRIX01BSk9SPSckKFNMSUJQUkVGKSQoc2hlbGwgZWNobyAkKE5BTUUpIHwgY3V0IC1jMS02KSQoTElCTUFKT1IpJChTTElCU1VGKScKLSAgICAgICAgU0xJQl9DUkVBVEVfREVGX0NNRD0nZWNobyBMSUJSQVJZICQoU0xJQk5BTUVfV0lUSF9NQUpPUikgSU5JVElOU1RBTkNFIFRFUk1JTlNUQU5DRSA+ICQoU1VCRElSKSQoTkFNRSkuZGVmOyBcCi0gICAgICAgICAgICBlY2hvIENPREUgUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA+PiAkKFNVQkRJUikkKE5BTUUpLmRlZjsgXAotICAgICAgICAgICAgZWNobyBEQVRBIFBSRUxPQUQgTU9WRUFCTEUgTVVMVElQTEUgTk9OU0hBUkVEID4+ICQoU1VCRElSKSQoTkFNRSkuZGVmOyBcCi0gICAgICAgICAgICBlY2hvIEVYUE9SVFMgPj4gJChTVUJESVIpJChOQU1FKS5kZWY7IFwKLSAgICAgICAgICAgIGVteGV4cCAkKE9CSlMpID4+ICQoU1VCRElSKSQoTkFNRSkuZGVmJwotICAgICAgICBTTElCX0VYVFJBX0NNRD0nZW14aW1wIC1vICQoU1VCRElSKSQoTElCUFJFRikkKE5BTUUpX2RsbC5hICQoU1VCRElSKSQoTkFNRSkuZGVmOyBcCi0gICAgICAgICAgICBlbXhpbXAgLW8gJChTVUJESVIpJChMSUJQUkVGKSQoTkFNRSlfZGxsLmxpYiAkKFNVQkRJUikkKE5BTUUpLmRlZjsnCi0gICAgICAgIFNMSUJfSU5TVEFMTF9FWFRSQV9MSUI9JyQoTElCUFJFRikkKE5BTUUpX2RsbC5hICQoTElCUFJFRikkKE5BTUUpX2RsbC5saWInCisgICAgICAgIFNMSUJOQU1FX1dJVEhfVkVSU0lPTj0nJChTTElCUFJFRikkKEZVTExOQU1FKS0kKExJQlZFUlNJT04pJChTTElCU1VGKScKKyAgICAgICAgU0xJQk5BTUVfV0lUSF9NQUpPUj0nJChTTElCUFJFRikkKHNoZWxsIGVjaG8gJChGVUxMTkFNRSkgfCBjdXQgLWMxLTYpJChMSUJNQUpPUikkKFNMSUJTVUYpJworICAgICAgICBTTElCX0NSRUFURV9ERUZfQ01EPSdlY2hvIExJQlJBUlkgJChTTElCTkFNRV9XSVRIX01BSk9SOiQoU0xJQlNVRik9KSBJTklUSU5TVEFOQ0UgVEVSTUlOU1RBTkNFID4gJChTVUJESVIpJChGVUxMTkFNRSkuZGVmOyBcCisgICAgICAgICAgICBlY2hvIENPREUgUFJFTE9BRCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA+PiAkKFNVQkRJUikkKEZVTExOQU1FKS5kZWY7IFwKKyAgICAgICAgICAgIGVjaG8gREFUQSBQUkVMT0FEIE1PVkVBQkxFIE1VTFRJUExFIE5PTlNIQVJFRCA+PiAkKFNVQkRJUikkKEZVTExOQU1FKS5kZWY7IFwKKyAgICAgICAgICAgIGVjaG8gRVhQT1JUUyA+PiAkKFNVQkRJUikkKEZVTExOQU1FKS5kZWY7IFwKKyAgICAgICAgICAgIGVteGV4cCAkKE9CSlMpID4+ICQoU1VCRElSKSQoRlVMTE5BTUUpLmRlZicKKyAgICAgICAgU0xJQl9FWFRSQV9DTUQ9J2VteGltcCAtbyAkKFNVQkRJUikkKExJQlBSRUYpJChGVUxMTkFNRSlfZGxsLmEgJChTVUJESVIpJChGVUxMTkFNRSkuZGVmOyBcCisgICAgICAgICAgICBlbXhpbXAgLW8gJChTVUJESVIpJChMSUJQUkVGKSQoRlVMTE5BTUUpX2RsbC5saWIgJChTVUJESVIpJChGVUxMTkFNRSkuZGVmOycKKyAgICAgICAgU0xJQl9JTlNUQUxMX05BTUU9JyQoU0xJQk5BTUVfV0lUSF9NQUpPUiknCisgICAgICAgIFNMSUJfSU5TVEFMTF9MSU5LUz0KKyAgICAgICAgU0xJQl9JTlNUQUxMX0VYVFJBX0xJQj0nJChMSUJQUkVGKSQoRlVMTE5BTUUpX2RsbC5hICQoTElCUFJFRikkKEZVTExOQU1FKV9kbGwubGliJwogICAgICAgICBlbmFibGUgZG9zX3BhdGhzCiAgICAgICAgIGVuYWJsZV93ZWFrIG9zMnRocmVhZHMKICAgICAgICAgOzsKQEAgLTQ2ODAsMjMgKzUyNzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgIC1sOmRydGFlYWJpLmRzbyAtbDpzY3BwbndkbC5kc28gLWxzdXBjKysgLWxnY2MgXAogICAgICAgICAgICAgICAgICAgICAgIC1sOmxpYmMuZHNvIC1sOmxpYm0uZHNvIC1sOmV1c2VyLmRzbyAtbDpsaWJjcnQwLmxpYgogICAgICAgICA7OwotICAgIG9zZjEpCi0gICAgICAgIGFkZF9jcHBmbGFncyAtRF9PU0ZfU09VUkNFIC1EX1BPU0lYX1BJSSAtRF9SRUVOVFJBTlQKLSAgICAgICAgOzsKICAgICBtaW5peCkKICAgICAgICAgOzsKLSAgICBwbGFuOSkKLSAgICAgICAgYWRkX2NwcGZsYWdzIC1EX0M5OV9TTlBSSU5URl9FWFRFTlNJT04gIFwKLSAgICAgICAgICAgICAgICAgICAgIC1EX1JFRU5UUkFOVF9TT1VSQ0UgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIC1EX1JFU0VBUkNIX1NPVVJDRSAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIC1ERkRfU0VUU0laRT05NiAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIC1ESEFWRV9TT0NLX09QVFMKLSAgICAgICAgYWRkX2NvbXBhdCBzdHJ0b2QubyBzdHJ0b2Q9YXZwcml2X3N0cnRvZAotICAgICAgICBuZXR3b3JrX2V4dHJhbGlicz0nLWxic2QnCi0gICAgICAgIGV4ZW9ianM9Y29tcGF0L3BsYW45L21haW4ubwotICAgICAgICBkaXNhYmxlIGZmc2VydmVyCi0gICAgICAgIGNwX2Y9J2NwJwotICAgICAgICA7OwogICAgIG5vbmUpCiAgICAgICAgIDs7CiAgICAgKikKQEAgLTQ3MzAsMzggKzUzMDUsNDQgQEAKICAgICBwZng9JDEKICAgICBwZnhfbm9fPSR7cGZ4JV99CiAgICAgIyB1Y2xpYmMgZGVmaW5lcyBfX0dMSUJDX18sIHNvIGl0IG5lZWRzIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGdsaWJjLgotICAgIGlmIGNoZWNrXyR7cGZ4fWNwcF9jb25kaXRpb24gZmVhdHVyZXMuaCAiZGVmaW5lZCBfX1VDTElCQ19fIjsgdGhlbgorICAgIGlmIHRlc3RfJHtwZnh9Y3BwX2NvbmRpdGlvbiBmZWF0dXJlcy5oICJkZWZpbmVkIF9fVUNMSUJDX18iOyB0aGVuCiAgICAgICAgIGV2YWwgJHtwZnh9bGliY190eXBlPXVjbGliYwogICAgICAgICBhZGRfJHtwZnh9Y3BwZmxhZ3MgLURfUE9TSVhfQ19TT1VSQ0U9MjAwMTEyIC1EX1hPUEVOX1NPVVJDRT02MDAKLSAgICBlbGlmIGNoZWNrXyR7cGZ4fWNwcF9jb25kaXRpb24gZmVhdHVyZXMuaCAiZGVmaW5lZCBfX0dMSUJDX18iOyB0aGVuCisgICAgZWxpZiB0ZXN0XyR7cGZ4fWNwcF9jb25kaXRpb24gZmVhdHVyZXMuaCAiZGVmaW5lZCBfX0dMSUJDX18iOyB0aGVuCiAgICAgICAgIGV2YWwgJHtwZnh9bGliY190eXBlPWdsaWJjCiAgICAgICAgIGFkZF8ke3BmeH1jcHBmbGFncyAtRF9QT1NJWF9DX1NPVVJDRT0yMDAxMTIgLURfWE9QRU5fU09VUkNFPTYwMAogICAgICMgTWluR1cgaGVhZGVycyBjYW4gYmUgaW5zdGFsbGVkIG9uIEN5Z3dpbiwgc28gY2hlY2sgZm9yIG5ld2xpYiBmaXJzdC4KLSAgICBlbGlmIGNoZWNrXyR7cGZ4fWNwcF9jb25kaXRpb24gbmV3bGliLmggImRlZmluZWQgX05FV0xJQl9WRVJTSU9OIjsgdGhlbgorICAgIGVsaWYgdGVzdF8ke3BmeH1jcHBfY29uZGl0aW9uIG5ld2xpYi5oICJkZWZpbmVkIF9ORVdMSUJfVkVSU0lPTiI7IHRoZW4KICAgICAgICAgZXZhbCAke3BmeH1saWJjX3R5cGU9bmV3bGliCi0gICAgICAgIGFkZF8ke3BmeH1jcHBmbGFncyAtVV9fU1RSSUNUX0FOU0lfXworICAgICAgICBhZGRfJHtwZnh9Y3BwZmxhZ3MgLVVfX1NUUklDVF9BTlNJX18gLURfWE9QRU5fU09VUkNFPTYwMAogICAgICMgTWluR1c2NCBpcyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIE1pbkdXMzIsIHNvIGNoZWNrIGZvciBpdCBmaXJzdC4KLSAgICBlbGlmIGNoZWNrXyR7cGZ4fWNwcF9jb25kaXRpb24gX21pbmd3LmggImRlZmluZWQgX19NSU5HVzY0X1ZFUlNJT05fTUFKT1IiOyB0aGVuCisgICAgZWxpZiB0ZXN0XyR7cGZ4fWNwcF9jb25kaXRpb24gX21pbmd3LmggImRlZmluZWQgX19NSU5HVzY0X1ZFUlNJT05fTUFKT1IiOyB0aGVuCiAgICAgICAgIGV2YWwgJHtwZnh9bGliY190eXBlPW1pbmd3NjQKLSAgICAgICAgaWYgY2hlY2tfJHtwZnh9Y3BwX2NvbmRpdGlvbiBfbWluZ3cuaCAiX19NSU5HVzY0X1ZFUlNJT05fTUFKT1IgPCAzIjsgdGhlbgorICAgICAgICBpZiB0ZXN0XyR7cGZ4fWNwcF9jb25kaXRpb24gX21pbmd3LmggIl9fTUlOR1c2NF9WRVJTSU9OX01BSk9SIDwgMyI7IHRoZW4KICAgICAgICAgICAgIGFkZF9jb21wYXQgbXN2Y3J0L3NucHJpbnRmLm8KICAgICAgICAgICAgIGFkZF9jZmxhZ3MgIi1pbmNsdWRlICRzb3VyY2VfcGF0aC9jb21wYXQvbXN2Y3J0L3NucHJpbnRmLmgiCiAgICAgICAgIGZpCiAgICAgICAgIGFkZF8ke3BmeH1jcHBmbGFncyAtVV9fU1RSSUNUX0FOU0lfXyAtRF9fVVNFX01JTkdXX0FOU0lfU1RESU89MQogICAgICAgICBldmFsIHRlc3QgXCQke3BmeF9ub199Y2NfdHlwZSA9ICJnY2MiICYmCiAgICAgICAgICAgICBhZGRfJHtwZnh9Y3BwZmxhZ3MgLURfX3ByaW50Zl9fPV9fZ251X3ByaW50Zl9fCi0gICAgZWxpZiBjaGVja18ke3BmeH1jcHBfY29uZGl0aW9uIF9taW5ndy5oICJkZWZpbmVkIF9fTUlOR1dfVkVSU0lPTiIgIHx8Ci0gICAgICAgICBjaGVja18ke3BmeH1jcHBfY29uZGl0aW9uIF9taW5ndy5oICJkZWZpbmVkIF9fTUlOR1czMl9WRVJTSU9OIjsgdGhlbgorICAgICAgICB0ZXN0XyR7cGZ4fWNwcF9jb25kaXRpb24gd2luZG93cy5oICIhZGVmaW5lZChfV0lOMzJfV0lOTlQpIHx8IF9XSU4zMl9XSU5OVCA8IDB4MDYwMCIgJiYKKyAgICAgICAgICAgIGFkZF8ke3BmeH1jcHBmbGFncyAtRF9XSU4zMl9XSU5OVD0weDA2MDAKKyAgICBlbGlmIHRlc3RfJHtwZnh9Y3BwX2NvbmRpdGlvbiBfbWluZ3cuaCAiZGVmaW5lZCBfX01JTkdXX1ZFUlNJT04iICB8fAorICAgICAgICAgdGVzdF8ke3BmeH1jcHBfY29uZGl0aW9uIF9taW5ndy5oICJkZWZpbmVkIF9fTUlOR1czMl9WRVJTSU9OIjsgdGhlbgogICAgICAgICBldmFsICR7cGZ4fWxpYmNfdHlwZT1taW5ndzMyCi0gICAgICAgIGNoZWNrXyR7cGZ4fWNwcF9jb25kaXRpb24gX21pbmd3LmggIl9fTUlOR1czMl9NQUpPUl9WRVJTSU9OID4gMyB8fCBcCisgICAgICAgIHRlc3RfJHtwZnh9Y3BwX2NvbmRpdGlvbiBfbWluZ3cuaCAiX19NSU5HVzMyX01BSk9SX1ZFUlNJT04gPiAzIHx8IFwKICAgICAgICAgICAgIChfX01JTkdXMzJfTUFKT1JfVkVSU0lPTiA9PSAzICYmIF9fTUlOR1czMl9NSU5PUl9WRVJTSU9OID49IDE1KSIgfHwKICAgICAgICAgICAgIGRpZSAiRVJST1I6IE1pbkdXMzIgcnVudGltZSB2ZXJzaW9uIG11c3QgYmUgPj0gMy4xNS4iCiAgICAgICAgIGFkZF8ke3BmeH1jcHBmbGFncyAtVV9fU1RSSUNUX0FOU0lfXyAtRF9fVVNFX01JTkdXX0FOU0lfU1RESU89MQorICAgICAgICB0ZXN0XyR7cGZ4fWNwcF9jb25kaXRpb24gX21pbmd3LmggIl9fTVNWQ1JUX1ZFUlNJT05fXyA8IDB4MDcwMCIgJiYKKyAgICAgICAgICAgIGFkZF8ke3BmeH1jcHBmbGFncyAtRF9fTVNWQ1JUX1ZFUlNJT05fXz0weDA3MDAKKyAgICAgICAgdGVzdF8ke3BmeH1jcHBfY29uZGl0aW9uIHdpbmRvd3MuaCAiIWRlZmluZWQoX1dJTjMyX1dJTk5UKSB8fCBfV0lOMzJfV0lOTlQgPCAweDA2MDAiICYmCisgICAgICAgICAgICBhZGRfJHtwZnh9Y3BwZmxhZ3MgLURfV0lOMzJfV0lOTlQ9MHgwNjAwCiAgICAgICAgIGV2YWwgdGVzdCBcJCR7cGZ4X25vX31jY190eXBlID0gImdjYyIgJiYKICAgICAgICAgICAgIGFkZF8ke3BmeH1jcHBmbGFncyAtRF9fcHJpbnRmX189X19nbnVfcHJpbnRmX18KLSAgICBlbGlmIGNoZWNrXyR7cGZ4fWNwcF9jb25kaXRpb24gY3J0dmVyc2lvbi5oICJkZWZpbmVkIF9WQ19DUlRfTUFKT1JfVkVSU0lPTiI7IHRoZW4KKyAgICBlbGlmIHRlc3RfJHtwZnh9Y3BwX2NvbmRpdGlvbiBjcnR2ZXJzaW9uLmggImRlZmluZWQgX1ZDX0NSVF9NQUpPUl9WRVJTSU9OIjsgdGhlbgogICAgICAgICBldmFsICR7cGZ4fWxpYmNfdHlwZT1tc3ZjcnQKLSAgICAgICAgaWYgY2hlY2tfJHtwZnh9Y3BwX2NvbmRpdGlvbiBjcnR2ZXJzaW9uLmggIl9WQ19DUlRfTUFKT1JfVkVSU0lPTiA8IDE0IjsgdGhlbgorICAgICAgICBpZiB0ZXN0XyR7cGZ4fWNwcF9jb25kaXRpb24gY3J0dmVyc2lvbi5oICJfVkNfQ1JUX01BSk9SX1ZFUlNJT04gPCAxNCI7IHRoZW4KICAgICAgICAgICAgIGlmIFsgIiRwZngiID0gaG9zdF8gXTsgdGhlbgogICAgICAgICAgICAgICAgIGFkZF9ob3N0X2NwcGZsYWdzIC1Ec25wcmludGY9X3NucHJpbnRmCiAgICAgICAgICAgICBlbHNlCkBAIC00NzcxLDE4ICs1MzUyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c25wcmludGY9YXZwcml2X3ZzbnByaW50ZgogICAgICAgICAgICAgZmkKICAgICAgICAgZmkKKyAgICAgICAgYWRkXyR7cGZ4fWNwcGZsYWdzIC1EX1VTRV9NQVRIX0RFRklORVMgLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyAtRF9DUlRfTk9OU1REQ19OT19XQVJOSU5HUwogICAgICAgICAjIFRoZSBNU1ZDIDIwMTAgaGVhZGVycyAoV2luIDcuMCBTREspIHNldCBfV0lOMzJfV0lOTlQgdG8KICAgICAgICAgIyAweDYwMSBieSBkZWZhdWx0IHVubGVzcyBzb21ldGhpbmcgZWxzZSBpcyBzZXQgYnkgdGhlIHVzZXIuCiAgICAgICAgICMgVGhpcyBjYW4gZWFzaWx5IGxlYWQgdG8gdXMgZGV0ZWN0aW5nIGZ1bmN0aW9ucyBvbmx5IHByZXNlbnQKICAgICAgICAgIyBpbiBzdWNoIG5ldyB2ZXJzaW9ucyBhbmQgcHJvZHVjaW5nIGJpbmFyaWVzIHJlcXVpcmluZyB3aW5kb3dzIDcuMC4KLSAgICAgICAgIyBUaGVyZWZvcmUgZXhwbGljaXRseSBzZXQgdGhlIGRlZmF1bHQgdG8gWFAgdW5sZXNzIHRoZSB1c2VyIGhhcworICAgICAgICAjIFRoZXJlZm9yZSBleHBsaWNpdGx5IHNldCB0aGUgZGVmYXVsdCB0byBWaXN0YSB1bmxlc3MgdGhlIHVzZXIgaGFzCiAgICAgICAgICMgc2V0IHNvbWV0aGluZyBlbHNlIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgICAgICMgRG9uJ3QgZG8gdGhpcyBpZiBXSU5BUElfRkFNSUxZIGlzIHNldCBhbmQgaXMgc2V0IHRvIGEgbm9uLWRlc2t0b3AKICAgICAgICAgIyBmYW1pbHkuIEZvciB0aGVzZSBjYXNlcywgY29uZmlndXJlIGlzIGZyZWUgdG8gdXNlIGFueSBmdW5jdGlvbnMKICAgICAgICAgIyBmb3VuZCBpbiB0aGUgU0RLIGhlYWRlcnMgYnkgZGVmYXVsdC4gKEFsdGVybmF0aXZlbHksIHdlIGNvdWxkIGZvcmNlCiAgICAgICAgICMgX1dJTjMyX1dJTk5UIHRvIDB4MDYwMiBpbiB0aGF0IGNhc2UuKQotICAgICAgICBjaGVja18ke3BmeH1jcHBfY29uZGl0aW9uIHN0ZGxpYi5oICJkZWZpbmVkKF9XSU4zMl9XSU5OVCkiIHx8Ci0gICAgICAgICAgICB7IGNoZWNrXyR7cGZ4fWNwcCA8PEVPRiAmJiBhZGRfJHtwZnh9Y3BwZmxhZ3MgLURfV0lOMzJfV0lOTlQ9MHgwNTAyOyB9CisgICAgICAgIHRlc3RfJHtwZnh9Y3BwX2NvbmRpdGlvbiBzdGRsaWIuaCAiZGVmaW5lZChfV0lOMzJfV0lOTlQpIiB8fAorICAgICAgICAgICAgeyB0ZXN0XyR7cGZ4fWNwcCA8PEVPRiAmJiBhZGRfJHtwZnh9Y3BwZmxhZ3MgLURfV0lOMzJfV0lOTlQ9MHgwNjAwOyB9CiAjaWZkZWYgV0lOQVBJX0ZBTUlMWQogI2luY2x1ZGUgPHdpbmFwaWZhbWlseS5oPgogI2lmICFXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX0RFU0tUT1ApCkBAIC00NzkwLDI5ICs1MzcyLDM0IEBACiAjZW5kaWYKICNlbmRpZgogRU9GCi0gICAgZWxpZiBjaGVja18ke3BmeH1jcHBfY29uZGl0aW9uIHN0ZGRlZi5oICJkZWZpbmVkIF9fS0xJQkNfXyI7IHRoZW4KKyAgICAgICAgaWYgWyAiJHBmeCIgPSAiIiBdOyB0aGVuCisgICAgICAgICAgICBjaGVja19mdW5jIHN0cnRvbGwgfHwgYWRkX2NmbGFncyAtRHN0cnRvbGw9X3N0cnRvaTY0CisgICAgICAgICAgICBjaGVja19mdW5jIHN0cnRvdWxsIHx8IGFkZF9jZmxhZ3MgLURzdHJ0b3VsbD1fc3RydG91aTY0CisgICAgICAgIGZpCisgICAgZWxpZiB0ZXN0XyR7cGZ4fWNwcF9jb25kaXRpb24gc3RkZGVmLmggImRlZmluZWQgX19LTElCQ19fIjsgdGhlbgogICAgICAgICBldmFsICR7cGZ4fWxpYmNfdHlwZT1rbGliYwotICAgIGVsaWYgY2hlY2tfJHtwZnh9Y3BwX2NvbmRpdGlvbiBzeXMvY2RlZnMuaCAiZGVmaW5lZCBfX0JJT05JQ19fIjsgdGhlbgorICAgIGVsaWYgdGVzdF8ke3BmeH1jcHBfY29uZGl0aW9uIHN5cy9jZGVmcy5oICJkZWZpbmVkIF9fQklPTklDX18iOyB0aGVuCiAgICAgICAgIGV2YWwgJHtwZnh9bGliY190eXBlPWJpb25pYwotICAgIGVsaWYgY2hlY2tfJHtwZnh9Y3BwX2NvbmRpdGlvbiBzeXMvYnJhbmQuaCAiZGVmaW5lZCBMQUJFTEVEX0JSQU5EX05BTUUiOyB0aGVuCisgICAgZWxpZiB0ZXN0XyR7cGZ4fWNwcF9jb25kaXRpb24gc3lzL2JyYW5kLmggImRlZmluZWQgTEFCRUxFRF9CUkFORF9OQU1FIjsgdGhlbgogICAgICAgICBldmFsICR7cGZ4fWxpYmNfdHlwZT1zb2xhcmlzCiAgICAgICAgIGFkZF8ke3BmeH1jcHBmbGFncyAtRF9fRVhURU5TSU9OU19fIC1EX1hPUEVOX1NPVVJDRT02MDAKICAgICBmaQotICAgIGNoZWNrXyR7cGZ4fWNjIDw8RU9GCisgICAgdGVzdF8ke3BmeH1jYyA8PEVPRgogI2luY2x1ZGUgPHRpbWUuaD4KIHZvaWQgKnYgPSBsb2NhbHRpbWVfcjsKIEVPRgotdGVzdCAiJD8iICE9IDAgJiYgY2hlY2tfJHtwZnh9Y2MgLURfUE9TSVhfQ19TT1VSQ0U9MjAwMTEyIC1EX1hPUEVOX1NPVVJDRT02MDAgPDxFT0YgJiYgYWRkXyR7cGZ4fWNwcGZsYWdzIC1EX1BPU0lYX0NfU09VUkNFPTIwMDExMiAtRF9YT1BFTl9TT1VSQ0U9NjAwCit0ZXN0ICIkPyIgIT0gMCAmJiB0ZXN0XyR7cGZ4fWNjIC1EX1BPU0lYX0NfU09VUkNFPTIwMDExMiAtRF9YT1BFTl9TT1VSQ0U9NjAwIDw8RU9GICYmIGFkZF8ke3BmeH1jcHBmbGFncyAtRF9QT1NJWF9DX1NPVVJDRT0yMDAxMTIgLURfWE9QRU5fU09VUkNFPTYwMAogI2luY2x1ZGUgPHRpbWUuaD4KIHZvaWQgKnYgPSBsb2NhbHRpbWVfcjsKIEVPRgogCisgICAgZXZhbCB0ZXN0IC1uICJcJHske3BmeH1saWJjX3R5cGV9IiAmJiBlbmFibGUgJHtwZnh9bGliY18ke2xpYmNfdHlwZX0KIH0KIAogcHJvYmVfbGliYwotdGVzdCAtbiAiJGxpYmNfdHlwZSIgJiYgZW5hYmxlIGxpYmNfJGxpYmNfdHlwZQogcHJvYmVfbGliYyBob3N0XwotdGVzdCAtbiAiJGhvc3RfbGliY190eXBlIiAmJiBlbmFibGUgaG9zdF9saWJjXyRob3N0X2xpYmNfdHlwZQorCisjIGhhY2tzIGZvciBjb21waWxlci9saWJjL29zIGNvbWJpbmF0aW9ucwogCiBjYXNlICRsaWJjX3R5cGUgaW4KICAgICBiaW9uaWMpCkBAIC00ODIwLDMwICs1NDA3LDEwIEBACiAgICAgICAgIDs7CiBlc2FjCiAKLSMgaGFja3MgZm9yIGNvbXBpbGVyL2xpYmMvb3MgY29tYmluYXRpb25zCi0KLWlmIGVuYWJsZWRfYWxsIHRtczQ3MCBsaWJjX2dsaWJjOyB0aGVuCi0gICAgQ1BQRkxBR1M9Ii1JJHtzb3VyY2VfcGF0aH0vY29tcGF0L3RtczQ3MCAke0NQUEZMQUdTfSIKLSAgICBhZGRfY3BwZmxhZ3MgLURfX1VTRVJfTEFCRUxfUFJFRklYX189Ci0gICAgYWRkX2NwcGZsYWdzIC1EX19idWlsdGluX21lbXNldD1tZW1zZXQKLSAgICBhZGRfY3BwZmxhZ3MgLURfX2dudWNfdmFfbGlzdD12YV9saXN0IC1EX1ZBX0xJU1RfREVGSU5FRAotICAgIGFkZF9jZmxhZ3MgICAtcGRzPTQ4ICAgICMgaW5jb21wYXRpYmxlIHJlZGVmaW5pdGlvbiBvZiBtYWNybwotZmkKLQotaWYgZW5hYmxlZF9hbGwgY2NjIGxpYmNfZ2xpYmM7IHRoZW4KLSAgICBhZGRfbGRmbGFncyAtV2wsLXosbm93ICAjIGNhbGxzIHRvIGxpYm90cyBjcmFzaCB3aXRob3V0IHRoaXMKLWZpCi0KIGNoZWNrX2NvbXBpbGVfYXNzZXJ0IGZsdF9saW0gImZsb2F0LmggbGltaXRzLmgiICJEQkxfTUFYID09IChkb3VibGUpREJMX01BWCIgfHwKICAgICBhZGRfY3BwZmxhZ3MgJy1JXCQoU1JDX1BBVEgpL2NvbXBhdC9mbG9hdCcKIAotZXNjKCl7Ci0gICAgZWNobyAiJCoiIHwgc2VkICdzLyUvJTI1L2c7cy86LyUzYS9nJwotfQotCi1lY2hvICJjb25maWc6JGFyY2g6JHN1YmFyY2g6JGNwdTokdGFyZ2V0X29zOiQoZXNjICRjY19pZGVudCk6JChlc2MgJEZGTVBFR19DT05GSUdVUkFUSU9OKSIgPmNvbmZpZy5mYXRlCi0KLWNoZWNrX2NwcF9jb25kaXRpb24gc3RkbGliLmggImRlZmluZWQoX19QSUNfXykgfHwgZGVmaW5lZChfX3BpY19fKSB8fCBkZWZpbmVkKFBJQykiICYmIGVuYWJsZV93ZWFrIHBpYwordGVzdF9jcHBfY29uZGl0aW9uIHN0ZGxpYi5oICJkZWZpbmVkKF9fUElDX18pIHx8IGRlZmluZWQoX19waWNfXykgfHwgZGVmaW5lZChQSUMpIiAmJiBlbmFibGVfd2VhayBwaWMKIAogc2V0X2RlZmF1bHQgbGliZGlyCiA6ICR7c2hsaWJkaXJfZGVmYXVsdDo9IiRsaWJkaXIifQpAQCAtNDg1MiwxMDIgKzU0MTksNDYgQEAKIHNldF9kZWZhdWx0ICRQQVRIU19MSVNUCiBzZXRfZGVmYXVsdCBubQogCi0jIHdlIG5lZWQgdG8gYnVpbGQgYXQgbGVhc3Qgb25lIGxpYiB0eXBlCi1pZiAhIGVuYWJsZWRfYW55IHN0YXRpYyBzaGFyZWQ7IHRoZW4KLSAgICBjYXQgPDxFT0YKLUF0IGxlYXN0IG9uZSBsaWJyYXJ5IHR5cGUgbXVzdCBiZSBidWlsdC4KLVNwZWNpZnkgLS1lbmFibGUtc3RhdGljIHRvIGJ1aWxkIHRoZSBzdGF0aWMgbGlicmFyaWVzIG9yIC0tZW5hYmxlLXNoYXJlZCB0bwotYnVpbGQgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYXMgd2VsbC4gVG8gb25seSBidWlsZCB0aGUgc2hhcmVkIGxpYnJhcmllcyBzcGVjaWZ5Ci0tLWRpc2FibGUtc3RhdGljIGluIGFkZGl0aW9uIHRvIC0tZW5hYmxlLXNoYXJlZC4KLUVPRgotICAgIGV4aXQgMTsKLWZpCi0KLWRpZV9saWNlbnNlX2Rpc2FibGVkKCkgewotICAgIGVuYWJsZWQgJDEgfHwgeyBlbmFibGVkICQyICYmIGRpZSAiJDIgaXMgJDEgYW5kIC0tZW5hYmxlLSQxIGlzIG5vdCBzcGVjaWZpZWQuIjsgfQotfQotCi1kaWVfbGljZW5zZV9kaXNhYmxlZF9ncGwoKSB7Ci0gICAgZW5hYmxlZCAkMSB8fCB7IGVuYWJsZWQgJDIgJiYgZGllICIkMiBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgZ3BsIGFuZCAtLWVuYWJsZS0kMSBpcyBub3Qgc3BlY2lmaWVkLiI7IH0KLX0KLQotZGllX2xpY2Vuc2VfZGlzYWJsZWQgZ3BsIGZyZWkwcgotZGllX2xpY2Vuc2VfZGlzYWJsZWQgZ3BsIGxpYmNkaW8KLWRpZV9saWNlbnNlX2Rpc2FibGVkIGdwbCBsaWJydWJiZXJiYW5kCi1kaWVfbGljZW5zZV9kaXNhYmxlZCBncGwgbGlic21iY2xpZW50Ci1kaWVfbGljZW5zZV9kaXNhYmxlZCBncGwgbGlidXR2aWRlbwotZGllX2xpY2Vuc2VfZGlzYWJsZWQgZ3BsIGxpYnZpZHN0YWIKLWRpZV9saWNlbnNlX2Rpc2FibGVkIGdwbCBsaWJ4MjY0Ci1kaWVfbGljZW5zZV9kaXNhYmxlZCBncGwgbGlieDI2NQotZGllX2xpY2Vuc2VfZGlzYWJsZWQgZ3BsIGxpYnhhdnMKLWRpZV9saWNlbnNlX2Rpc2FibGVkIGdwbCBsaWJ4dmlkCi1kaWVfbGljZW5zZV9kaXNhYmxlZCBncGwgeDExZ3JhYgotCi1kaWVfbGljZW5zZV9kaXNhYmxlZCBub25mcmVlIGxpYmZhYWMKLWRpZV9saWNlbnNlX2Rpc2FibGVkIG5vbmZyZWUgbnZlbmMKLWVuYWJsZWQgZ3BsICYmIGRpZV9saWNlbnNlX2Rpc2FibGVkX2dwbCBub25mcmVlIGxpYmZka19hYWMKLWVuYWJsZWQgZ3BsICYmIGRpZV9saWNlbnNlX2Rpc2FibGVkX2dwbCBub25mcmVlIG9wZW5zc2wKLQotZGllX2xpY2Vuc2VfZGlzYWJsZWQgdmVyc2lvbjMgZ21wCi1kaWVfbGljZW5zZV9kaXNhYmxlZCB2ZXJzaW9uMyBsaWJvcGVuY29yZV9hbXJuYgotZGllX2xpY2Vuc2VfZGlzYWJsZWQgdmVyc2lvbjMgbGlib3BlbmNvcmVfYW1yd2IKLWRpZV9saWNlbnNlX2Rpc2FibGVkIHZlcnNpb24zIGxpYnNtYmNsaWVudAotZGllX2xpY2Vuc2VfZGlzYWJsZWQgdmVyc2lvbjMgbGlidm9fYW1yd2JlbmMKLQotZW5hYmxlZCB2ZXJzaW9uMyAmJiB7IGVuYWJsZWQgZ3BsICYmIGVuYWJsZSBncGx2MyB8fCBlbmFibGUgbGdwbHYzOyB9Ci0KLWRpc2FibGVkIG9wdGltaXphdGlvbnMgfHwgY2hlY2tfY2ZsYWdzIC1mb21pdC1mcmFtZS1wb2ludGVyCitkaXNhYmxlZCBvcHRpbWl6YXRpb25zIHx8IGVuYWJsZWQgb3NzZnV6eiB8fCBjaGVja19jZmxhZ3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIKIAogZW5hYmxlX3dlYWtfcGljKCkgewogICAgIGRpc2FibGVkIHBpYyAmJiByZXR1cm4KICAgICBlbmFibGUgcGljCiAgICAgYWRkX2NwcGZsYWdzIC1EUElDCiAgICAgY2FzZSAiJHRhcmdldF9vcyIgaW4KLSAgICBtaW5ndyp8Y3lnd2luKikKKyAgICBtaW5ndyp8Y3lnd2luKnx3aW4qKQogICAgICAgICA7OwogICAgICopCiAgICAgICAgIGFkZF9jZmxhZ3MgLWZQSUMKKyAgICAgICAgYWRkX2FzZmxhZ3MgLWZQSUMKICAgICAgICAgOzsKICAgICBlc2FjCi0gICAgYWRkX2FzZmxhZ3MgIC1mUElDCiB9CiAKIGVuYWJsZWQgcGljICYmIGVuYWJsZV93ZWFrX3BpYwogCi1jaGVja19jYyA8PEVPRiB8fCBkaWUgIlN5bWJvbCBtYW5nbGluZyBjaGVjayBmYWlsZWQuIgordGVzdF9jYyA8PEVPRiB8fCBkaWUgIlN5bWJvbCBtYW5nbGluZyBjaGVjayBmYWlsZWQuIgogaW50IGZmX2V4dGVybjsKIEVPRgogc3ltPSQoJG5tICRUTVBPIHwgYXdrICcvZmZfZXh0ZXJuL3sgcHJpbnQgc3Vic3RyKCQwLCBtYXRjaCgkMCwgL1teIFx0XSpmZl9leHRlcm4vKSkgfScpCiBleHRlcm5fcHJlZml4PSR7c3ltJSVmZl9leHRlcm4qfQogCi1jaGVja19jYyA8PEVPRiAmJiBlbmFibGVfd2VhayBpbmxpbmVfYXNtCi12b2lkIGZvbyh2b2lkKSB7IF9fYXNtX18gdm9sYXRpbGUgKCIiIDo6KTsgfQotRU9GCishIGRpc2FibGVkIGlubGluZV9hc20gJiYgY2hlY2tfaW5saW5lX2FzbSBpbmxpbmVfYXNtICciIiA6OicKIAotX3Jlc3RyaWN0PQotZm9yIHJlc3RyaWN0X2tleXdvcmQgaW4gcmVzdHJpY3QgX19yZXN0cmljdF9fIF9fcmVzdHJpY3Q7IGRvCi0gICAgY2hlY2tfY2MgPDxFT0YgJiYgX3Jlc3RyaWN0PSRyZXN0cmljdF9rZXl3b3JkICYmIGJyZWFrCi12b2lkIGZvbyhjaGFyICogJHJlc3RyaWN0X2tleXdvcmQgcCk7Ci1FT0YKK2ZvciByZXN0cmljdF9rZXl3b3JkIGluIHJlc3RyaWN0IF9fcmVzdHJpY3RfXyBfX3Jlc3RyaWN0ICIiOyBkbworICAgIHRlc3RfY29kZSBjYyAiIiAiY2hhciAqICRyZXN0cmljdF9rZXl3b3JkIHAiICYmIGJyZWFrCiBkb25lCiAKLWNoZWNrX2NjIDw8RU9GICYmIGVuYWJsZSBwcmFnbWFfZGVwcmVjYXRlZAotdm9pZCBmb28odm9pZCkgeyBfUHJhZ21hKCJHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9uc1wiIikgfQotRU9GCitjaGVja19jYyBwcmFnbWFfZGVwcmVjYXRlZCAiIiAnX1ByYWdtYSgiR0NDIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnNcIiIpJwogCi1jaGVja19jYyA8PEVPRiAmJiBlbmFibGUgYXR0cmlidXRlX3BhY2tlZAotc3RydWN0IHsgaW50IHg7IH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSkgeDsKLUVPRgotCi1jaGVja19jYyA8PEVPRiAmJiBlbmFibGUgYXR0cmlidXRlX21heV9hbGlhcwotdW5pb24geyBpbnQgeDsgfSBfX2F0dHJpYnV0ZV9fKChtYXlfYWxpYXMpKSB4OwotRU9GCi0KLWNoZWNrX2NjIDw8RU9GIHx8IGRpZSAiZW5kaWFuIHRlc3QgZmFpbGVkIgorIyBUaGUgZ2xvYmFsIHZhcmlhYmxlIGVuc3VyZXMgdGhlIGJpdHMgYXBwZWFyIHVuY2hhbmdlZCBpbiB0aGUgb2JqZWN0IGZpbGUuCit0ZXN0X2NjIDw8RU9GIHx8IGRpZSAiZW5kaWFuIHRlc3QgZmFpbGVkIgogdW5zaWduZWQgaW50IGVuZGlhbiA9ICdCJyA8PCAyNCB8ICdJJyA8PCAxNiB8ICdHJyA8PCA4IHwgJ0UnOwogRU9GCiBvZCAtdCB4MSAkVE1QTyB8IGdyZXAgLXEgJzQyICo0OSAqNDcgKjQ1JyAmJiBlbmFibGUgYmlnZW5kaWFuCiAKK2NoZWNrX2NjIGNvbnN0X25hbiBtYXRoLmggInN0cnVjdCB7IGRvdWJsZSBkOyB9IHN0YXRpYyBjb25zdCBiYXJbXSA9IHsgeyBOQU4gfSB9IgorCiBpZiAhIGVuYWJsZWQgcHBjNjQgfHwgZW5hYmxlZCBiaWdlbmRpYW47IHRoZW4KICAgICBkaXNhYmxlIHZzeAogZmkKQEAgLTQ5NTUsMTggKzU0NjYsMTMgQEAKIGNoZWNrX2dhcygpIHsKICAgICBsb2cgImNoZWNrX2dhcyB1c2luZyAnJGFzJyBhcyBBUyIKICAgICAjIDp2YXJhcmcgaXMgdXNlZCBvbiBhYXJjaDY0LCBhcm0gYW5kIHBwYyBhbHRpdmVjCi0gICAgY2hlY2tfYXMgPDxFT0YgfHwgcmV0dXJuIDEKKyAgICBjaGVja19hcyB2YXJhcmcgIgogLm1hY3JvIG0gbiwgeTp2YXJhcmc9MAogXG46IC5pbnQgXHkKIC5lbmRtCi1tIHgKLUVPRgorbSB4IiB8fCByZXR1cm4gMQogICAgICMgLmFsdG1hY3JvIGlzIG9ubHkgdXNlZCBpbiBhcm0gYXNtCi0gICAgISBlbmFibGVkIGFybSB8fCBjaGVja19hcyA8PEVPRiB8fCByZXR1cm4gMQotLmFsdG1hY3JvCi1FT0YKLSAgICBlbmFibGUgZ251X2FzCi0gICAgcmV0dXJuIDAKKyAgICAhIGVuYWJsZWQgYXJtIHx8IGNoZWNrX2FzIGdudV9hcyAiLmFsdG1hY3JvIgogfQogCiBpZiBlbmFibGVkX2FueSBhcm0gYWFyY2g2NCB8fCBlbmFibGVkX2FsbCBwcGMgYWx0aXZlYyAmJiBlbmFibGVkIGFzbTsgdGhlbgpAQCAtNDk4NCw3ICs1NDkwLDcgQEAKICAgICBbICR0YXJnZXRfb3MgPSAiZGFyd2luIiBdICYmIGdhc3BwX2FzX3R5cGU9ImFwcGxlLSRnYXNwcF9hc190eXBlIgogCiAgICAgdGVzdCAiJHthcyMqZ2FzLXByZXByb2Nlc3Nvci5wbH0iICE9ICIkYXMiIHx8Ci0gICAgY2hlY2tfY21kIGdhcy1wcmVwcm9jZXNzb3IucGwgLWFyY2ggJGFyY2ggLWFzLXR5cGUgJGdhc3BwX2FzX3R5cGUgLS0gJHthczo9JGNjfSAkYXNfbm9vcCAmJgorICAgIHRlc3RfY21kIGdhcy1wcmVwcm9jZXNzb3IucGwgLWFyY2ggJGFyY2ggLWFzLXR5cGUgJGdhc3BwX2FzX3R5cGUgLS0gJHthczo9JGNjfSAkYXNfbm9vcCAmJgogICAgICAgICBnYXM9IiR7Z2FzOj1nYXMtcHJlcHJvY2Vzc29yLnBsfSAtYXJjaCAkYXJjaCAtYXMtdHlwZSAkZ2FzcHBfYXNfdHlwZSAtLSAke2FzOj0kY2N9IgogCiAgICAgaWYgISBjaGVja19nYXMgOyB0aGVuCkBAIC00OTkzLDEwICs1NDk5LDggQEAKICAgICAgICAgICAgICRub2dhcyAiR05VIGFzc2VtYmxlciBub3QgZm91bmQsIGluc3RhbGwvdXBkYXRlIGdhcy1wcmVwcm9jZXNzb3IiCiAgICAgZmkKIAotICAgIGNoZWNrX2FzIDw8RU9GICYmIGVuYWJsZSBhc19mdW5jCi0uZnVuYyB0ZXN0Ci0uZW5kZnVuYwotRU9GCisgICAgY2hlY2tfYXMgYXNfZnVuYyAiLmZ1bmMgdGVzdAorICAgICAgICAgICAgICAgICAgICAgIC5lbmRmdW5jIgogZmkKIAogY2hlY2tfaW5saW5lX2FzbSBpbmxpbmVfYXNtX2xhYmVscyAnIjE6XG4iJwpAQCAtNTAxNywyMiArNTUyMSwyMCBAQAogCiBlbGlmIGVuYWJsZWQgYXJtOyB0aGVuCiAKLSAgICBlbmFibGVkIG1zdmMgJiYgY2hlY2tfY3BwX2NvbmRpdGlvbiBzdGRkZWYuaCAiZGVmaW5lZCBfTV9BUk1UIiAmJiBlbmFibGUgdGh1bWIKLQotICAgIGNoZWNrX2NwcF9jb25kaXRpb24gc3RkZGVmLmggImRlZmluZWQgX190aHVtYl9fIiAmJiBjaGVja19jYyA8PEVPRiAmJiBlbmFibGVfd2VhayB0aHVtYgorICAgIGVuYWJsZWQgbXN2YyAmJiBjaGVja19jcHBfY29uZGl0aW9uIHRodW1iIHN0ZGRlZi5oICJkZWZpbmVkIF9NX0FSTVQiCisgICAgdGVzdF9jcHBfY29uZGl0aW9uIHN0ZGRlZi5oICJkZWZpbmVkIF9fdGh1bWJfXyIgJiYgdGVzdF9jYyA8PEVPRiAmJiBlbmFibGVfd2VhayB0aHVtYgogZmxvYXQgZnVuYyhmbG9hdCBhLCBmbG9hdCBiKXsgcmV0dXJuIGErYjsgfQogRU9GCi0KICAgICBlbmFibGVkIHRodW1iICYmIGNoZWNrX2NmbGFncyAtbXRodW1iIHx8IGNoZWNrX2NmbGFncyAtbWFybQogCi0gICAgaWYgICAgIGNoZWNrX2NwcF9jb25kaXRpb24gc3RkZGVmLmggImRlZmluZWQgX19BUk1fUENTX1ZGUCI7IHRoZW4KLSAgICAgICAgZW5hYmxlIHZmcF9hcmdzCi0gICAgZWxpZiBjaGVja19jcHBfY29uZGl0aW9uIHN0ZGRlZi5oICJkZWZpbmVkIF9NX0FSTV9GUCAmJiBfTV9BUk1fRlAgPj0gMzAiOyB0aGVuCi0gICAgICAgIGVuYWJsZSB2ZnBfYXJncwotICAgIGVsaWYgISBjaGVja19jcHBfY29uZGl0aW9uIHN0ZGRlZi5oICJkZWZpbmVkIF9fQVJNX1BDUyB8fCBkZWZpbmVkIF9fU09GVEZQX18iICYmIFsgJHRhcmdldF9vcyAhPSBkYXJ3aW4gXTsgdGhlbgorICAgIGlmIGNoZWNrX2NwcF9jb25kaXRpb24gdmZwX2FyZ3Mgc3RkZGVmLmggImRlZmluZWQgX19BUk1fUENTX1ZGUCI7IHRoZW4KKyAgICAgICAgOgorICAgIGVsaWYgY2hlY2tfY3BwX2NvbmRpdGlvbiB2ZnBfYXJncyBzdGRkZWYuaCAiZGVmaW5lZCBfTV9BUk1fRlAgJiYgX01fQVJNX0ZQID49IDMwIjsgdGhlbgorICAgICAgICA6CisgICAgZWxpZiAhIHRlc3RfY3BwX2NvbmRpdGlvbiBzdGRkZWYuaCAiZGVmaW5lZCBfX0FSTV9QQ1MgfHwgZGVmaW5lZCBfX1NPRlRGUF9fIiAmJiBbICR0YXJnZXRfb3MgIT0gZGFyd2luIF07IHRoZW4KICAgICAgICAgY2FzZSAiJHtjcm9zc19wcmVmaXg6LSRjY30iIGluCi0gICAgICAgICAgICAqaGFyZGZsb2F0KikgICAgICAgICBlbmFibGUgdmZwX2FyZ3M7ICAgZnBhYmk9dmZwIDs7Ci0gICAgICAgICAgICAqKSBjaGVja19sZCAiY2MiIDw8RU9GICYmIGVuYWJsZSB2ZnBfYXJncyAmJiBmcGFiaT12ZnAgfHwgZnBhYmk9c29mdCA7OworICAgICAgICAgICAgKmhhcmRmbG9hdCopIGVuYWJsZSB2ZnBfYXJnczsgZnBhYmk9dmZwIDs7CisgICAgICAgICAgICAqKSBjaGVja19sZCAiY2MiIHZmcF9hcmdzIDw8RU9GICYmIGZwYWJpPXZmcCB8fCBmcGFiaT1zb2Z0IDs7CiBfX2FzbV9fICgiLmVhYmlfYXR0cmlidXRlIDI4LCAxIik7CiBpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CiBFT0YKQEAgLTUwNTQsMTYgKzU1NTYsMTUgQEAKIAogICAgIGNoZWNrX2lubGluZV9hc20gYXNtX21vZF9xICciYWRkIHIwLCAlUTAsICVSMCIgOjogInIiKChsb25nIGxvbmcpMCknCiAKLSAgICBjaGVja19hcyA8PEVPRiAmJiBlbmFibGUgYXNfZG5fZGlyZWN0aXZlCi1yYSAuZG4gZDAuaTE2Ci0udW5yZXEgcmEKLUVPRgorICAgIGNoZWNrX2FzIGFzX2FyY2hfZGlyZWN0aXZlICIuYXJjaCBhcm12Ny1hIgorICAgIGNoZWNrX2FzIGFzX2RuX2RpcmVjdGl2ZSAgICJyYSAuZG4gZDAuaTE2IgorICAgIGNoZWNrX2FzIGFzX2ZwdV9kaXJlY3RpdmUgICIuZnB1IG5lb24iCiAKICAgICAjIGxsdm0ncyBpbnRlZ3JhdGVkIGFzc2VtYmxlciBzdXBwb3J0cyAub2JqZWN0X2FyY2ggZnJvbSBsbHZtIDMuNQotICAgIFsgIiRvYmpmb3JtYXQiID0gZWxmIF0gJiYgY2hlY2tfYXMgPDxFT0YgJiYgZW5hYmxlIGFzX29iamVjdF9hcmNoCi0ub2JqZWN0X2FyY2ggYXJtdjQKLUVPRgorICAgIFsgIiRvYmpmb3JtYXQiID0gZWxmMzIgXSB8fCBbICIkb2JqZm9ybWF0IiA9IGVsZjY0IF0gJiYKKyAgICAgICAgY2hlY2tfYXMgYXNfb2JqZWN0X2FyY2ggIi5vYmplY3RfYXJjaCBhcm12NCIKIAorICAgICMgTVMgYXJtYXNtIGZhaWxzIHRvIGFzc2VtYmxlIG91ciBQSUMgY29uc3RydWN0cwogICAgIFsgJHRhcmdldF9vcyAhPSB3aW4zMiBdICYmIGVuYWJsZWRfYWxsIGFybXY2dDIgc2hhcmVkICFwaWMgJiYgZW5hYmxlX3dlYWtfcGljCiAKIGVsaWYgZW5hYmxlZCBtaXBzOyB0aGVuCkBAIC01MDczLDI3ICs1NTc0LDI2IEBACiAgICAgZW5hYmxlZCBtbWkgJiYgY2hlY2tfaW5saW5lX2FzbSBtbWkgJyJwdW5wY2tsaHcgJGYwLCAkZjAsICRmMCInCiAKICAgICAjIEVuYWJsZSBtaW5pbXVtIElTQSBiYXNlZCBvbiBzZWxlY3RlZCBvcHRpb25zCi0gICAgaWYgZW5hYmxlZCBtaXBzNjQgJiYgKGVuYWJsZWQgbWlwc2RzcCB8fCBlbmFibGVkIG1pcHNkc3ByMik7IHRoZW4KLSAgICAgICAgYWRkX2NmbGFncyAiLW1pcHM2NHIyIgotICAgICAgICBhZGRfYXNmbGFncyAiLW1pcHM2NHIyIgotICAgIGVsaWYgZW5hYmxlZCBtaXBzNjQgJiYgZW5hYmxlZCBtaXBzZnB1ICYmIGRpc2FibGVkIGxvb25nc29uMiAmJiBkaXNhYmxlZCBsb29uZ3NvbjM7IHRoZW4KLSAgICAgICAgYWRkX2NmbGFncyAiLW1pcHM2NCIKLSAgICAgICAgYWRkX2FzZmxhZ3MgIi1taXBzNjQiCi0gICAgZWxpZiBlbmFibGVkIG1pcHNkc3AgfHwgZW5hYmxlZCBtaXBzZHNwcjI7IHRoZW4KLSAgICAgICAgYWRkX2NmbGFncyAiLW1pcHMzMnIyIC1tZnAzMiIKLSAgICAgICAgYWRkX2FzZmxhZ3MgIi1taXBzMzJyMiAtbWZwMzIiCisgICAgaWYgZW5hYmxlZCBtaXBzNjQ7IHRoZW4KKyAgICAgICAgZW5hYmxlZCBtaXBzNjRyNiAmJiBjaGVja19pbmxpbmVfYXNtX2ZsYWdzIG1pcHM2NHI2ICciZGxzYSAkMCwgJDAsICQwLCAxIicgJy1taXBzNjRyNicKKyAgICAgICAgZW5hYmxlZCBtaXBzNjRyMiAmJiBjaGVja19pbmxpbmVfYXNtX2ZsYWdzIG1pcHM2NHIyICciZGV4dCAkMCwgJDAsIDAsIDEiJyAnLW1pcHM2NHIyJworICAgICAgICBkaXNhYmxlZCBtaXBzNjRyNiAmJiBkaXNhYmxlZCBtaXBzNjRyMiAmJiBjaGVja19pbmxpbmVfYXNtX2ZsYWdzIG1pcHM2NHIxICciZGFkZGkgJDAsICQwLCAwIicgJy1taXBzNjQnCisgICAgZWxzZQorICAgICAgICBlbmFibGVkIG1pcHMzMnI2ICYmIGNoZWNrX2lubGluZV9hc21fZmxhZ3MgbWlwczMycjYgJyJhdWkgJDAsICQwLCAwIicgJy1taXBzMzJyNicKKyAgICAgICAgZW5hYmxlZCBtaXBzMzJyNSAmJiBjaGVja19pbmxpbmVfYXNtX2ZsYWdzIG1pcHMzMnI1ICciZXJldG5jIicgJy1taXBzMzJyNScKKyAgICAgICAgZW5hYmxlZCBtaXBzMzJyMiAmJiBjaGVja19pbmxpbmVfYXNtX2ZsYWdzIG1pcHMzMnIyICciZXh0ICQwLCAkMCwgMCwgMSInICctbWlwczMycjInCisgICAgICAgIGRpc2FibGVkIG1pcHMzMnI2ICYmIGRpc2FibGVkIG1pcHMzMnI1ICYmIGRpc2FibGVkIG1pcHMzMnIyICYmIGNoZWNrX2lubGluZV9hc21fZmxhZ3MgbWlwczMycjEgJyJhZGRpICQwLCAkMCwgMCInICctbWlwczMyJwogICAgIGZpCiAKLSAgICBlbmFibGVkIG1pcHNkc3AgJiYgYWRkX2NmbGFncyAiLW1kc3AiICYmIGFkZF9hc2ZsYWdzICItbWRzcCIgJiYKLSAgICAgY2hlY2tfaW5saW5lX2FzbSBtaXBzZHNwICciYWRkdS5xYiAkdDAsICR0MSwgJHQyIicKLSAgICBlbmFibGVkIG1pcHNkc3ByMiAmJiBhZGRfY2ZsYWdzICItbWRzcHIyIiAmJiBhZGRfYXNmbGFncyAiLW1kc3ByMiIgJiYKLSAgICAgY2hlY2tfaW5saW5lX2FzbSBtaXBzZHNwcjIgJyJhYnNxX3MucWIgJHQwLCAkdDEiJwotICAgIGVuYWJsZWQgbWlwc2ZwdSAgICYmIGFkZF9jZmxhZ3MgIi1taGFyZC1mbG9hdCIgJiYgYWRkX2FzZmxhZ3MgIi1taGFyZC1mbG9hdCIgJiYKLSAgICAgY2hlY2tfaW5saW5lX2FzbSBtaXBzZnB1ICAgJyJtYWRkLmQgJGYwLCAkZjIsICRmNCwgJGY2IicKLSAgICBlbmFibGVkIG1zYSAgICAgICAmJiBjaGVja19jZmxhZ3MgIi1tbXNhIiAmJiBjaGVja19sZGZsYWdzICItbW1zYSIgJiYKLSAgICAgY2hlY2tfaW5saW5lX2FzbSBtc2EgICAgICAgJyJhZGR2aS5iICR3MCwgJHcxLCAxIicKKyAgICBlbmFibGVkIG1pcHNmcHUgJiYgY2hlY2tfaW5saW5lX2FzbV9mbGFncyBtaXBzZnB1ICciY3Z0LmQubCAkZjAsICRmMiInICctbWhhcmQtZmxvYXQnCisgICAgZW5hYmxlZCBtaXBzZnB1ICYmIChlbmFibGVkIG1pcHMzMnI1IHx8IGVuYWJsZWQgbWlwczMycjYgfHwgZW5hYmxlZCBtaXBzNjRyNikgJiYgY2hlY2tfaW5saW5lX2FzbV9mbGFncyBtaXBzZnB1ICciY3Z0LmQubCAkZjAsICRmMSInICctbWZwNjQnCisgICAgZW5hYmxlZCBtaXBzZnB1ICYmIGVuYWJsZWQgbXNhICYmIGNoZWNrX2lubGluZV9hc21fZmxhZ3MgbXNhICciYWRkdmkuYiAkdzAsICR3MSwgMSInICctbW1zYScgJiYgY2hlY2tfaGVhZGVyIG1zYS5oIHx8IGRpc2FibGUgbXNhCisgICAgZW5hYmxlZCBtaXBzZHNwICYmIGNoZWNrX2lubGluZV9hc21fZmxhZ3MgbWlwc2RzcCAnImFkZHUucWIgJHQwLCAkdDEsICR0MiInICctbWRzcCcKKyAgICBlbmFibGVkIG1pcHNkc3ByMiAmJiBjaGVja19pbmxpbmVfYXNtX2ZsYWdzIG1pcHNkc3ByMiAnImFic3Ffcy5xYiAkdDAsICR0MSInICctbWRzcHIyJwogCi0gICAgZW5hYmxlZCBtc2EgJiYgYWRkX2FzZmxhZ3MgIi1tbXNhIgorICAgIGlmIGVuYWJsZWQgYmlnZW5kaWFuICYmIGVuYWJsZWQgbXNhOyB0aGVuCisgICAgICAgIGRpc2FibGUgbXNhCisgICAgZmkKIAogZWxpZiBlbmFibGVkIHBhcmlzYzsgdGhlbgogCkBAIC01MTA1LDQwICs1NjA1LDMyIEBACiAKIGVsaWYgZW5hYmxlZCBwcGM7IHRoZW4KIAotICAgIGVuYWJsZSBsb2NhbF9hbGlnbmVkXzggbG9jYWxfYWxpZ25lZF8xNiBsb2NhbF9hbGlnbmVkXzMyCisgICAgZW5hYmxlIGxvY2FsX2FsaWduZWQKIAogICAgIGNoZWNrX2lubGluZV9hc20gZGNiemwgICAgICciZGNiemwgMCwgJTAiIDo6ICJyIigwKScKICAgICBjaGVja19pbmxpbmVfYXNtIGlibV9hc20gICAnImFkZCAwLCAwLCAwIicKICAgICBjaGVja19pbmxpbmVfYXNtIHBwYzR4eCAgICAnIm1hY2xodyByMTAsIHIxMSwgcjEyIicKICAgICBjaGVja19pbmxpbmVfYXNtIHhmb3JtX2FzbSAnImx3enggJTEsICV5MCIgOjogIloiKCooaW50KikwKSwgInIiKDApJwogCi0gICAgIyBBbHRpVmVjIGZsYWdzOiBUaGUgRlNGIHZlcnNpb24gb2YgR0NDIGRpZmZlcnMgZnJvbSB0aGUgQXBwbGUgdmVyc2lvbgogICAgIGlmIGVuYWJsZWQgYWx0aXZlYzsgdGhlbgotICAgICAgICBjaGVja19jZmxhZ3MgLW1hbHRpdmVjIC1tYWJpPWFsdGl2ZWMgJiYKLSAgICAgICAgeyBjaGVja19oZWFkZXIgYWx0aXZlYy5oICYmIGluY19hbHRpdmVjX2g9IiNpbmNsdWRlIDxhbHRpdmVjLmg+IiA7IH0gfHwKLSAgICAgICAgY2hlY2tfY2ZsYWdzIC1mYWx0aXZlYworICAgICAgICBjaGVja19jZmxhZ3MgLW1hbHRpdmVjIC1tYWJpPWFsdGl2ZWMKIAogICAgICAgICAjIGNoZWNrIGlmIG91ciBjb21waWxlciBzdXBwb3J0cyBNb3Rvcm9sYSBBbHRpVmVjIEMgQVBJCi0gICAgICAgIGNoZWNrX2NjIDw8RU9GIHx8IGRpc2FibGUgYWx0aXZlYwotJGluY19hbHRpdmVjX2gKLWludCBtYWluKHZvaWQpIHsKLSAgICB2ZWN0b3Igc2lnbmVkIGludCB2MSA9ICh2ZWN0b3Igc2lnbmVkIGludCkgeyAwIH07Ci0gICAgdmVjdG9yIHNpZ25lZCBpbnQgdjIgPSAodmVjdG9yIHNpZ25lZCBpbnQpIHsgMSB9OwotICAgIHYxID0gdmVjX2FkZCh2MSwgdjIpOwotICAgIHJldHVybiAwOwotfQotRU9GCisgICAgICAgIGNoZWNrX2NjIGFsdGl2ZWMgYWx0aXZlYy5oICJ2ZWN0b3Igc2lnbmVkIGludCB2MSA9ICh2ZWN0b3Igc2lnbmVkIGludCkgeyAwIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3Igc2lnbmVkIGludCB2MiA9ICh2ZWN0b3Igc2lnbmVkIGludCkgeyAxIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MSA9IHZlY19hZGQodjEsIHYyKTsiCiAKICAgICAgICAgZW5hYmxlZCBhbHRpdmVjIHx8IHdhcm4gIkFsdGl2ZWMgZGlzYWJsZWQsIHBvc3NpYmx5IG1pc3NpbmcgLS1jcHUgZmxhZyIKICAgICBmaQogCiAgICAgaWYgZW5hYmxlZCB2c3g7IHRoZW4KICAgICAgICAgY2hlY2tfY2ZsYWdzIC1tdnN4ICYmCi0gICAgICAgIGNoZWNrX2J1aWx0aW4gdmVjX3ZzeF9sZCAiYWx0aXZlYy5oIiAiX19idWlsdGluX3ZlY192c3hfbGQiIHx8IGRpc2FibGUgdnN4CisgICAgICAgIGNoZWNrX2NjIHZzeCBhbHRpdmVjLmggImludCB2WzRdID0geyAwIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvciBzaWduZWQgaW50IHYxID0gdmVjX3ZzeF9sZCgwLCB2KTsiCiAgICAgZmkKIAogICAgIGlmIGVuYWJsZWQgcG93ZXI4OyB0aGVuCi0gICAgICAgIGNoZWNrX2NwcF9jb25kaXRpb24gImFsdGl2ZWMuaCIgImRlZmluZWQoX0FSQ0hfUFdSOCkiIHx8IGRpc2FibGUgcG93ZXI4CisgICAgICAgIGNoZWNrX2NwcF9jb25kaXRpb24gcG93ZXI4ICJhbHRpdmVjLmgiICJkZWZpbmVkKF9BUkNIX1BXUjgpIgogICAgIGZpCiAKIGVsaWYgZW5hYmxlZCB4ODY7IHRoZW4KQEAgLTUxNDYsNyArNTYzOCw3IEBACiAgICAgY2hlY2tfYnVpbHRpbiByZHRzYyAgICBpbnRyaW4uaCAgICJfX3JkdHNjKCkiCiAgICAgY2hlY2tfYnVpbHRpbiBtbV9lbXB0eSBtbWludHJpbi5oICJfbW1fZW1wdHkoKSIKIAotICAgIGVuYWJsZSBsb2NhbF9hbGlnbmVkXzggbG9jYWxfYWxpZ25lZF8xNiBsb2NhbF9hbGlnbmVkXzMyCisgICAgZW5hYmxlIGxvY2FsX2FsaWduZWQKIAogICAgICMgY2hlY2sgd2hldGhlciBFQlAgaXMgYXZhaWxhYmxlIG9uIHg4NgogICAgICMgQXMgJ2knIGlzIHN0b3JlZCBvbiB0aGUgc3RhY2ssIHRoaXMgcHJvZ3JhbSB3aWxsIGNyYXNoCkBAIC01MTcyLDM0ICs1NjY0LDQyIEBACiAgICAgZW5hYmxlZCBzc3NlMyAgJiYgY2hlY2tfaW5saW5lX2FzbSBzc3NlM19pbmxpbmUgICcicGFic3cgJXhtbTAsICV4bW0wIicKICAgICBlbmFibGVkIG1teGV4dCAmJiBjaGVja19pbmxpbmVfYXNtIG1teGV4dF9pbmxpbmUgJyJwbWF4dWIgJW1tMCwgJW1tMSInCiAKLSAgICBpZiAhIGRpc2FibGVkX2FueSBhc20gbW14IHlhc207IHRoZW4KLSAgICAgICAgaWYgY2hlY2tfY21kICR5YXNtZXhlIC0tdmVyc2lvbjsgdGhlbgotICAgICAgICAgICAgZW5hYmxlZCB4ODZfNjQgJiYgeWFzbV9leHRyYT0iLW0gYW1kNjQiCi0gICAgICAgICAgICB5YXNtX2RlYnVnPSItZyBkd2FyZjIiCi0gICAgICAgIGVsaWYgY2hlY2tfY21kIG5hc20gLXY7IHRoZW4KLSAgICAgICAgICAgIHlhc21leGU9bmFzbQotICAgICAgICAgICAgeWFzbV9kZWJ1Zz0iLWcgLUYgZHdhcmYiCi0gICAgICAgICAgICBpZiBlbmFibGVkIHg4Nl82NDsgdGhlbgotICAgICAgICAgICAgICAgIGNhc2UgIiRvYmpmb3JtYXQiIGluCi0gICAgICAgICAgICAgICAgICAgIGVsZikgICBvYmpmb3JtYXQ9ZWxmNjQgOzsKLSAgICAgICAgICAgICAgICAgICAgd2luMzIpIG9iamZvcm1hdD13aW42NCA7OwotICAgICAgICAgICAgICAgIGVzYWMKLSAgICAgICAgICAgIGZpCisgICAgcHJvYmVfeDg2YXNtKCl7CisgICAgICAgIHg4NmFzbWV4ZV9wcm9iZT0kMQorICAgICAgICBpZiB0ZXN0X2NtZCAkeDg2YXNtZXhlX3Byb2JlIC12OyB0aGVuCisgICAgICAgICAgICB4ODZhc21leGU9JHg4NmFzbWV4ZV9wcm9iZQorICAgICAgICAgICAgeDg2YXNtX3R5cGU9bmFzbQorICAgICAgICAgICAgeDg2YXNtX2RlYnVnPSItZyAtRiBkd2FyZiIKKyAgICAgICAgICAgIFg4NkFTTURFUD0KKyAgICAgICAgICAgIFg4NkFTTV9ERVBGTEFHUz0nLU1EICQoQDoubz0uZCknCisgICAgICAgIGVsaWYgdGVzdF9jbWQgJHg4NmFzbWV4ZV9wcm9iZSAtLXZlcnNpb247IHRoZW4KKyAgICAgICAgICAgIHg4NmFzbWV4ZT0keDg2YXNtZXhlX3Byb2JlCisgICAgICAgICAgICB4ODZhc21fdHlwZT15YXNtCisgICAgICAgICAgICB4ODZhc21fZGVidWc9Ii1nIGR3YXJmMiIKKyAgICAgICAgICAgIFg4NkFTTURFUD0nJChERVBYODZBU00pICQoWDg2QVNNRkxBR1MpIC1NICQoWDg2QVNNX08pICQ8ID4gJChAOi5vPS5kKScKKyAgICAgICAgICAgIFg4NkFTTV9ERVBGTEFHUz0KICAgICAgICAgZmkKKyAgICAgICAgY2hlY2tfeDg2YXNtIHg4NmFzbSAibW92YmUgZWN4LCBbNV0iCisgICAgfQogCi0gICAgICAgIFlBU01GTEFHUz0iLWYgJG9iamZvcm1hdCAkeWFzbV9leHRyYSIKLSAgICAgICAgZW5hYmxlZCBwaWMgICAgICAgICAgICAgICAmJiBhcHBlbmQgWUFTTUZMQUdTICItRFBJQyIKLSAgICAgICAgdGVzdCAtbiAiJGV4dGVybl9wcmVmaXgiICAmJiBhcHBlbmQgWUFTTUZMQUdTICItRFBSRUZJWCIKKyAgICBpZiAhIGRpc2FibGVkX2FueSBhc20gbW14IHg4NmFzbTsgdGhlbgorICAgICAgICBkaXNhYmxlIHg4NmFzbQorICAgICAgICBmb3IgcHJvZ3JhbSBpbiAkeDg2YXNtZXhlIG5hc20geWFzbTsgZG8KKyAgICAgICAgICAgIHByb2JlX3g4NmFzbSAkcHJvZ3JhbSAmJiBicmVhaworICAgICAgICBkb25lCisgICAgICAgIGRpc2FibGVkIHg4NmFzbSAmJiBkaWUgIm5hc20veWFzbSBub3QgZm91bmQgb3IgdG9vIG9sZC4gVXNlIC0tZGlzYWJsZS14ODZhc20gZm9yIGEgY3JpcHBsZWQgYnVpbGQuIgorICAgICAgICBYODZBU01GTEFHUz0iLWYgJG9iamZvcm1hdCIKKyAgICAgICAgZW5hYmxlZCBwaWMgICAgICAgICAgICAgICAmJiBhcHBlbmQgWDg2QVNNRkxBR1MgIi1EUElDIgorICAgICAgICB0ZXN0IC1uICIkZXh0ZXJuX3ByZWZpeCIgICYmIGFwcGVuZCBYODZBU01GTEFHUyAiLURQUkVGSVgiCiAgICAgICAgIGNhc2UgIiRvYmpmb3JtYXQiIGluCi0gICAgICAgICAgICBlbGYqKSBlbmFibGVkIGRlYnVnICYmIGFwcGVuZCBZQVNNRkxBR1MgJHlhc21fZGVidWcgOzsKKyAgICAgICAgICAgIGVsZiopIGVuYWJsZWQgZGVidWcgJiYgYXBwZW5kIFg4NkFTTUZMQUdTICR4ODZhc21fZGVidWcgOzsKICAgICAgICAgZXNhYwogCi0gICAgICAgIGNoZWNrX3lhc20gIm1vdmJlIGVjeCwgWzVdIiAmJiBlbmFibGUgeWFzbSB8fAotICAgICAgICAgICAgZGllICJ5YXNtL25hc20gbm90IGZvdW5kIG9yIHRvbyBvbGQuIFVzZSAtLWRpc2FibGUteWFzbSBmb3IgYSBjcmlwcGxlZCBidWlsZC4iCi0gICAgICAgIGNoZWNrX3lhc20gInZleHRyYWN0aTEyOCB4bW0wLCB5bW0wLCAwIiAgICAgIHx8IGRpc2FibGUgYXZ4Ml9leHRlcm5hbAotICAgICAgICBjaGVja195YXNtICJ2cG1hY3NkZCB4bW0wLCB4bW0xLCB4bW0yLCB4bW0zIiB8fCBkaXNhYmxlIHhvcF9leHRlcm5hbAotICAgICAgICBjaGVja195YXNtICJ2Zm1hZGRwcyB5bW0wLCB5bW0xLCB5bW0yLCB5bW0zIiB8fCBkaXNhYmxlIGZtYTRfZXh0ZXJuYWwKLSAgICAgICAgY2hlY2tfeWFzbSAiQ1BVIGFtZG5vcCIgfHwgZGlzYWJsZSBjcHVub3AKKyAgICAgICAgY2hlY2tfeDg2YXNtIGF2eDUxMl9leHRlcm5hbCAidm1vdmRxYTMyIFtlYXhde2sxfXt6fSwgem1tMCIKKyAgICAgICAgY2hlY2tfeDg2YXNtIGF2eDJfZXh0ZXJuYWwgICAidmV4dHJhY3RpMTI4IHhtbTAsIHltbTAsIDAiCisgICAgICAgIGNoZWNrX3g4NmFzbSB4b3BfZXh0ZXJuYWwgICAgInZwbWFjc2RkIHhtbTAsIHhtbTEsIHhtbTIsIHhtbTMiCisgICAgICAgIGNoZWNrX3g4NmFzbSBmbWE0X2V4dGVybmFsICAgInZmbWFkZHBzIHltbTAsIHltbTEsIHltbTIsIHltbTMiCisgICAgICAgIGNoZWNrX3g4NmFzbSBjcHVub3AgICAgICAgICAgIkNQVSBhbWRub3AiCiAgICAgZmkKIAogICAgIGNhc2UgIiRjcHUiIGluCkBAIC01MjEwLDI0ICs1NzEwLDExIEBACiAKIGZpCiAKLWNoZWNrX2NvZGUgY2MgYXJtX25lb24uaCAiaW50MTZ4OF90IHRlc3QgPSB2ZHVwcV9uX3MxNigwKSIgJiYgZW5hYmxlIGludHJpbnNpY3NfbmVvbgorY2hlY2tfY2MgaW50cmluc2ljc19uZW9uIGFybV9uZW9uLmggImludDE2eDhfdCB0ZXN0ID0gdmR1cHFfbl9zMTYoMCkiCiAKIGNoZWNrX2xkZmxhZ3MgLVdsLC0tYXMtbmVlZGVkCiBjaGVja19sZGZsYWdzIC1XbCwteixub2V4ZWNzdGFjawogCi1pZiBjaGVja19mdW5jIGRsb3BlbjsgdGhlbgotICAgIGxkbD0KLWVsaWYgY2hlY2tfZnVuYyBkbG9wZW4gLWxkbDsgdGhlbgotICAgIGxkbD0tbGRsCi1maQotCi1kZWNrbGlua19vdXRkZXZfZXh0cmFsaWJzPSIkZGVja2xpbmtfb3V0ZGV2X2V4dHJhbGlicyAkbGRsIgotZGVja2xpbmtfaW5kZXZfZXh0cmFsaWJzPSIkZGVja2xpbmtfaW5kZXZfZXh0cmFsaWJzICRsZGwiCi1mcmVpMHJfZmlsdGVyX2V4dHJhbGlicz0nJGxkbCcKLWZyZWkwcl9zcmNfZmlsdGVyX2V4dHJhbGlicz0nJGxkbCcKLWxhZHNwYV9maWx0ZXJfZXh0cmFsaWJzPSckbGRsJwotbnZlbmNfZW5jb2Rlcl9leHRyYWxpYnM9JyRsZGwnCi0KIGlmICEgZGlzYWJsZWQgbmV0d29yazsgdGhlbgogICAgIGNoZWNrX2Z1bmMgZ2V0YWRkcmluZm8gJG5ldHdvcmtfZXh0cmFsaWJzCiAgICAgY2hlY2tfZnVuYyBpbmV0X2F0b24gJG5ldHdvcmtfZXh0cmFsaWJzCkBAIC01MjM4LDYgKzU3MjUsNyBAQAogICAgIGNoZWNrX3R5cGUgbmV0aW5ldC9pbi5oICJzdHJ1Y3QgaXB2Nl9tcmVxIiAtRF9EQVJXSU5fQ19TT1VSQ0UKICAgICBjaGVja190eXBlIHBvbGwuaCAic3RydWN0IHBvbGxmZCIKICAgICBjaGVja190eXBlIG5ldGluZXQvc2N0cC5oICJzdHJ1Y3Qgc2N0cF9ldmVudF9zdWJzY3JpYmUiCisgICAgY2hlY2tfc3RydWN0ICJzeXMvc29ja2V0LmgiICJzdHJ1Y3QgbXNnaGRyIiBtc2dfZmxhZ3MKICAgICBjaGVja19zdHJ1Y3QgInN5cy90eXBlcy5oIHN5cy9zb2NrZXQuaCIgInN0cnVjdCBzb2NrYWRkciIgc2FfbGVuCiAgICAgY2hlY2tfdHlwZSBuZXRpbmV0L2luLmggInN0cnVjdCBzb2NrYWRkcl9pbjYiCiAgICAgY2hlY2tfdHlwZSAic3lzL3R5cGVzLmggc3lzL3NvY2tldC5oIiAic3RydWN0IHNvY2thZGRyX3N0b3JhZ2UiCkBAIC01MjY4LDEzICs1NzU2LDEyIEBACiBmaQogCiBjaGVja19idWlsdGluIGF0b21pY19jYXNfcHRyIGF0b21pYy5oICJ2b2lkICoqcHRyOyB2b2lkICpvbGR2YWwsICpuZXd2YWw7IGF0b21pY19jYXNfcHRyKHB0ciwgb2xkdmFsLCBuZXd2YWwpIgotY2hlY2tfYnVpbHRpbiBhdG9taWNfY29tcGFyZV9leGNoYW5nZSAiIiAiaW50ICpwdHIsICpvbGR2YWw7IGludCBuZXd2YWw7IF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbihwdHIsIG9sZHZhbCwgbmV3dmFsLCAwLCBfX0FUT01JQ19TRVFfQ1NULCBfX0FUT01JQ19TRVFfQ1NUKSIKIGNoZWNrX2J1aWx0aW4gbWFjaGluZV9yd19iYXJyaWVyIG1iYXJyaWVyLmggIl9fbWFjaGluZV9yd19iYXJyaWVyKCkiCiBjaGVja19idWlsdGluIE1lbW9yeUJhcnJpZXIgd2luZG93cy5oICJNZW1vcnlCYXJyaWVyKCkiCi1jaGVja19idWlsdGluIHNhcmVzdGFydCBzaWduYWwuaCAiU0FfUkVTVEFSVCIKIGNoZWNrX2J1aWx0aW4gc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCAiIiAiaW50ICpwdHI7IGludCBvbGR2YWwsIG5ld3ZhbDsgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgb2xkdmFsLCBuZXd2YWwpIgogY2hlY2tfYnVpbHRpbiBnbXRpbWVfciB0aW1lLmggInRpbWVfdCAqdGltZTsgc3RydWN0IHRtICp0bTsgZ210aW1lX3IodGltZSwgdG0pIgogY2hlY2tfYnVpbHRpbiBsb2NhbHRpbWVfciB0aW1lLmggInRpbWVfdCAqdGltZTsgc3RydWN0IHRtICp0bTsgbG9jYWx0aW1lX3IodGltZSwgdG0pIgorY2hlY2tfYnVpbHRpbiB4MjY0X2NzcF9iZ3IgInN0ZGludC5oIHgyNjQuaCIgIlgyNjRfQ1NQX0JHUiIKIAogY2FzZSAiJGN1c3RvbV9hbGxvY2F0b3IiIGluCiAgICAgamVtYWxsb2MpCkBAIC01MjgyLDcgKzU3NjksNyBAQAogICAgICAgICByZXF1aXJlIGxpYmplbWFsbG9jIGplbWFsbG9jL2plbWFsbG9jLmggbWFsbG9jIC1samVtYWxsb2MKICAgICA7OwogICAgIHRjbWFsbG9jKQotICAgICAgICByZXF1aXJlX3BrZ19jb25maWcgbGlidGNtYWxsb2MgZ3BlcmZ0b29scy90Y21hbGxvYy5oIHRjX21hbGxvYworICAgICAgICByZXF1aXJlX3BrZ19jb25maWcgbGlidGNtYWxsb2MgbGlidGNtYWxsb2MgZ3BlcmZ0b29scy90Y21hbGxvYy5oIHRjX21hbGxvYwogICAgICAgICBtYWxsb2NfcHJlZml4PXRjXwogICAgIDs7CiBlc2FjCkBAIC01MjkyLDggKzU3NzksOCBAQAogY2hlY2tfZnVuYyAgJHttYWxsb2NfcHJlZml4fXBvc2l4X21lbWFsaWduICAgICAgJiYgZW5hYmxlIHBvc2l4X21lbWFsaWduCiAKIGNoZWNrX2Z1bmMgIGFjY2VzcwotY2hlY2tfZnVuYyAgYXJjNHJhbmRvbQotY2hlY2tfZnVuY19oZWFkZXJzIHRpbWUuaCBjbG9ja19nZXR0aW1lIHx8IHsgY2hlY2tfZnVuY19oZWFkZXJzIHRpbWUuaCBjbG9ja19nZXR0aW1lIC1scnQgJiYgYWRkX2V4dHJhbGlicyAtbHJ0ICYmIExJQlJUPSItbHJ0IjsgfQorY2hlY2tfZnVuY19oZWFkZXJzIHN0ZGxpYi5oIGFyYzRyYW5kb20KK2NoZWNrX2xpYiAgIGNsb2NrX2dldHRpbWUgdGltZS5oIGNsb2NrX2dldHRpbWUgfHwgY2hlY2tfbGliIGNsb2NrX2dldHRpbWUgdGltZS5oIGNsb2NrX2dldHRpbWUgLWxydAogY2hlY2tfZnVuYyAgZmNudGwKIGNoZWNrX2Z1bmMgIGZvcmsKIGNoZWNrX2Z1bmMgIGdldGhydGltZQpAQCAtNTMwMSwxMiArNTc4OCwxMSBAQAogY2hlY2tfZnVuYyAgZ2V0cnVzYWdlCiBjaGVja19mdW5jICBnZXR0aW1lb2ZkYXkKIGNoZWNrX2Z1bmMgIGlzYXR0eQotY2hlY2tfZnVuYyAgbWFjaF9hYnNvbHV0ZV90aW1lCiBjaGVja19mdW5jICBta3N0ZW1wCiBjaGVja19mdW5jICBtbWFwCiBjaGVja19mdW5jICBtcHJvdGVjdAogIyBTb2xhcmlzIGhhcyBuYW5vc2xlZXAgaW4gLWxydCwgT3BlblNvbGFyaXMgbm8gbG9uZ2VyIG5lZWRzIHRoYXQKLWNoZWNrX2Z1bmNfaGVhZGVycyB0aW1lLmggbmFub3NsZWVwIHx8IHsgY2hlY2tfZnVuY19oZWFkZXJzIHRpbWUuaCBuYW5vc2xlZXAgLWxydCAmJiBhZGRfZXh0cmFsaWJzIC1scnQgJiYgTElCUlQ9Ii1scnQiOyB9CitjaGVja19mdW5jX2hlYWRlcnMgdGltZS5oIG5hbm9zbGVlcCB8fCBjaGVja19saWIgbmFub3NsZWVwIHRpbWUuaCBuYW5vc2xlZXAgLWxydAogY2hlY2tfZnVuYyAgc2NoZWRfZ2V0YWZmaW5pdHkKIGNoZWNrX2Z1bmMgIHNldHJsaW1pdAogY2hlY2tfc3RydWN0ICJzeXMvc3RhdC5oIiAic3RydWN0IHN0YXQiIHN0X210aW0udHZfbnNlYyAtRF9CU0RfU09VUkNFCkBAIC01MzE4LDM3ICs1ODA0LDM1IEBACiBjaGVja19mdW5jX2hlYWRlcnMgY29uaW8uaCBrYmhpdAogY2hlY2tfZnVuY19oZWFkZXJzIGlvLmggc2V0bW9kZQogY2hlY2tfZnVuY19oZWFkZXJzIGx6by9sem8xeC5oIGx6bzF4Xzk5OV9jb21wcmVzcworY2hlY2tfZnVuY19oZWFkZXJzIG1hY2gvbWFjaF90aW1lLmggbWFjaF9hYnNvbHV0ZV90aW1lCiBjaGVja19mdW5jX2hlYWRlcnMgc3RkbGliLmggZ2V0ZW52CiBjaGVja19mdW5jX2hlYWRlcnMgc3lzL3N0YXQuaCBsc3RhdAogCi1jaGVja19mdW5jX2hlYWRlcnMgd2luZG93cy5oIENvVGFza01lbUZyZWUgLWxvbGUzMgogY2hlY2tfZnVuY19oZWFkZXJzIHdpbmRvd3MuaCBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrCiBjaGVja19mdW5jX2hlYWRlcnMgd2luZG93cy5oIEdldFByb2Nlc3NUaW1lcwogY2hlY2tfZnVuY19oZWFkZXJzIHdpbmRvd3MuaCBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZQorY2hlY2tfZnVuY19oZWFkZXJzIHdpbmRvd3MuaCBMb2FkTGlicmFyeQogY2hlY2tfZnVuY19oZWFkZXJzIHdpbmRvd3MuaCBNYXBWaWV3T2ZGaWxlCiBjaGVja19mdW5jX2hlYWRlcnMgd2luZG93cy5oIFBlZWtOYW1lZFBpcGUKIGNoZWNrX2Z1bmNfaGVhZGVycyB3aW5kb3dzLmggU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUKIGNoZWNrX2Z1bmNfaGVhZGVycyB3aW5kb3dzLmggU2V0Q29uc29sZUN0cmxIYW5kbGVyCiBjaGVja19mdW5jX2hlYWRlcnMgd2luZG93cy5oIFNsZWVwCiBjaGVja19mdW5jX2hlYWRlcnMgd2luZG93cy5oIFZpcnR1YWxBbGxvYwotY2hlY2tfc3RydWN0IHdpbmRvd3MuaCAiQ09ORElUSU9OX1ZBUklBQkxFIiBQdHIKIGNoZWNrX2Z1bmNfaGVhZGVycyBnbG9iLmggZ2xvYgogZW5hYmxlZCB4bGliICYmCiAgICAgY2hlY2tfZnVuY19oZWFkZXJzICJYMTEvWGxpYi5oIFgxMS9leHRlbnNpb25zL1h2bGliLmgiIFh2R2V0UG9ydEF0dHJpYnV0ZSAtbFh2IC1sWDExIC1sWGV4dAogCiBjaGVja19oZWFkZXIgZGlyZWN0LmgKIGNoZWNrX2hlYWRlciBkaXJlbnQuaAotY2hlY2tfaGVhZGVyIGRsZmNuLmgKLWNoZWNrX2hlYWRlciBkM2QxMS5oCitjaGVja19oZWFkZXIgZHhnaWRlYnVnLmgKIGNoZWNrX2hlYWRlciBkeHZhLmgKIGNoZWNrX2hlYWRlciBkeHZhMmFwaS5oIC1EX1dJTjMyX1dJTk5UPTB4MDYwMAogY2hlY2tfaGVhZGVyIGlvLmgKK2NoZWNrX2hlYWRlciBsaW51eC9wZXJmX2V2ZW50LmgKIGNoZWNrX2hlYWRlciBsaWJjcnlzdGFsaGQvbGliY3J5c3RhbGhkX2lmLmgKLWNoZWNrX2hlYWRlciBtYWNoL21hY2hfdGltZS5oCiBjaGVja19oZWFkZXIgbWFsbG9jLmgKIGNoZWNrX2hlYWRlciBuZXQvdWRwbGl0ZS5oCiBjaGVja19oZWFkZXIgcG9sbC5oCi1jaGVja19oZWFkZXIgc3lzL21tYW4uaAogY2hlY2tfaGVhZGVyIHN5cy9wYXJhbS5oCiBjaGVja19oZWFkZXIgc3lzL3Jlc291cmNlLmgKIGNoZWNrX2hlYWRlciBzeXMvc2VsZWN0LmgKQEAgLTUzNTcsMTggKzU4NDEsNDYgQEAKIGNoZWNrX2hlYWRlciB0ZXJtaW9zLmgKIGNoZWNrX2hlYWRlciB1bmlzdGQuaAogY2hlY2tfaGVhZGVyIHZhbGdyaW5kL3ZhbGdyaW5kLmgKLWNoZWNrX2hlYWRlciB2ZHBhdS92ZHBhdS5oCi1jaGVja19oZWFkZXIgdmRwYXUvdmRwYXVfeDExLmgKLWNoZWNrX2hlYWRlciBWaWRlb0RlY29kZUFjY2VsZXJhdGlvbi9WREFEZWNvZGVyLmgKLWNoZWNrX2hlYWRlciBWaWRlb1Rvb2xib3gvVmlkZW9Ub29sYm94LmgKK2NoZWNrX2Z1bmNfaGVhZGVycyBWaWRlb1Rvb2xib3gvVlRDb21wcmVzc2lvblNlc3Npb24uaCBWVENvbXByZXNzaW9uU2Vzc2lvblByZXBhcmVUb0VuY29kZUZyYW1lcyAtZnJhbWV3b3JrIFZpZGVvVG9vbGJveAogY2hlY2tfaGVhZGVyIHdpbmRvd3MuaAogY2hlY2tfaGVhZGVyIFgxMS9leHRlbnNpb25zL1h2TUNsaWIuaAogY2hlY2tfaGVhZGVyIGFzbS90eXBlcy5oCiAKLWNoZWNrX2xpYjIgIndpbmRvd3MuaCBzaGVsbGFwaS5oIiBDb21tYW5kTGluZVRvQXJndlcgLWxzaGVsbDMyCi1jaGVja19saWIyICJ3aW5kb3dzLmggd2luY3J5cHQuaCIgQ3J5cHRHZW5SYW5kb20gLWxhZHZhcGkzMgotY2hlY2tfbGliMiAid2luZG93cy5oIHBzYXBpLmgiIEdldFByb2Nlc3NNZW1vcnlJbmZvIC1scHNhcGkKLWNoZWNrX2xpYiAiQ29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oIiBVVEdldE9TVHlwZUZyb21TdHJpbmcgIi1mcmFtZXdvcmsgQ29yZVNlcnZpY2VzIgorIyBpdCBzZWVtcyB0aGVyZSBhcmUgdmVyc2lvbnMgb2YgY2xhbmcgaW4gc29tZSBkaXN0cm9zIHRoYXQgdHJ5IHRvIHVzZSB0aGUKKyMgZ2NjIGhlYWRlcnMsIHdoaWNoIGV4cGxvZGVzIGZvciBzdGRhdG9taWMKKyMgc28gd2UgYWxzbyBjaGVjayB0aGF0IGF0b21pY3MgYWN0dWFsbHkgd29yayBoZXJlCitjaGVja19idWlsdGluIHN0ZGF0b21pYyBzdGRhdG9taWMuaCAiYXRvbWljX2ludCBmb28sIGJhciA9IEFUT01JQ19WQVJfSU5JVCgtMSk7IGF0b21pY19zdG9yZSgmZm9vLCAwKTsgZm9vICs9IGJhciIKKworY2hlY2tfbGliIGFkdmFwaTMyICJ3aW5kb3dzLmgiICAgICAgICAgICAgUmVnQ2xvc2VLZXkgICAgICAgICAgLWxhZHZhcGkzMgorY2hlY2tfbGliIGJjcnlwdCAgICJ3aW5kb3dzLmggYmNyeXB0LmgiICAgQkNyeXB0R2VuUmFuZG9tICAgICAgLWxiY3J5cHQgJiYKKyAgICBjaGVja19jcHBfY29uZGl0aW9uIGJjcnlwdCBiY3J5cHQuaCAiZGVmaW5lZCBCQ1JZUFRfUk5HX0FMR09SSVRITSIKK2NoZWNrX2xpYiBvbGUzMiAgICAid2luZG93cy5oIiAgICAgICAgICAgIENvVGFza01lbUZyZWUgICAgICAgIC1sb2xlMzIKK2NoZWNrX2xpYiBzaGVsbDMyICAid2luZG93cy5oIHNoZWxsYXBpLmgiIENvbW1hbmRMaW5lVG9Bcmd2VyAgIC1sc2hlbGwzMgorY2hlY2tfbGliIHBzYXBpICAgICJ3aW5kb3dzLmggcHNhcGkuaCIgICAgR2V0UHJvY2Vzc01lbW9yeUluZm8gLWxwc2FwaQorCitjaGVja19saWIgYW5kcm9pZCBhbmRyb2lkL25hdGl2ZV93aW5kb3cuaCBBTmF0aXZlV2luZG93X2FjcXVpcmUgLWxhbmRyb2lkCitjaGVja19saWIgbWVkaWFuZGsgInN0ZGludC5oIG1lZGlhL05ka0ltYWdlLmgiIEFJbWFnZV9kZWxldGUgLWxtZWRpYW5kaworY2hlY2tfbGliIGNhbWVyYTJuZGsgInN0ZGJvb2wuaCBzdGRpbnQuaCBjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oIiBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUgLWxjYW1lcmEybmRrCisKK2VuYWJsZWQgYXBwa2l0ICAgICAgICYmIGNoZWNrX2FwcGxlX2ZyYW1ld29yayBBcHBLaXQKK2VuYWJsZWQgYXVkaW90b29sYm94ICYmIGNoZWNrX2FwcGxlX2ZyYW1ld29yayBBdWRpb1Rvb2xib3gKK2VuYWJsZWQgYXZmb3VuZGF0aW9uICYmIGNoZWNrX2FwcGxlX2ZyYW1ld29yayBBVkZvdW5kYXRpb24KK2VuYWJsZWQgY29yZWltYWdlICAgICYmIGNoZWNrX2FwcGxlX2ZyYW1ld29yayBDb3JlSW1hZ2UKK2VuYWJsZWQgdmlkZW90b29sYm94ICYmIGNoZWNrX2FwcGxlX2ZyYW1ld29yayBWaWRlb1Rvb2xib3gKKworY2hlY2tfYXBwbGVfZnJhbWV3b3JrIENvcmVGb3VuZGF0aW9uCitjaGVja19hcHBsZV9mcmFtZXdvcmsgQ29yZU1lZGlhCitjaGVja19hcHBsZV9mcmFtZXdvcmsgQ29yZVZpZGVvCisKK2VuYWJsZWQgYXZmb3VuZGF0aW9uICYmIHsKKyAgICBkaXNhYmxlIGNvcmVncmFwaGljcyBhcHBsaWNhdGlvbnNlcnZpY2VzCisgICAgY2hlY2tfbGliIGNvcmVncmFwaGljcyAgICAgICAgQ29yZUdyYXBoaWNzL0NvcmVHcmFwaGljcy5oICAgICAgICAgICAgICAgQ0dHZXRBY3RpdmVEaXNwbGF5TGlzdCAiLWZyYW1ld29yayBDb3JlR3JhcGhpY3MiIHx8CisgICAgY2hlY2tfbGliIGFwcGxpY2F0aW9uc2VydmljZXMgQXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmggQ0dHZXRBY3RpdmVEaXNwbGF5TGlzdCAiLWZyYW1ld29yayBBcHBsaWNhdGlvblNlcnZpY2VzIjsgfQorCitlbmFibGVkIHZpZGVvdG9vbGJveCAmJiB7CisgICAgY2hlY2tfbGliIGNvcmVzZXJ2aWNlcyBDb3JlU2VydmljZXMvQ29yZVNlcnZpY2VzLmggVVRHZXRPU1R5cGVGcm9tU3RyaW5nICItZnJhbWV3b3JrIENvcmVTZXJ2aWNlcyIKKyAgICBjaGVja19mdW5jX2hlYWRlcnMgQ29yZU1lZGlhL0NNRm9ybWF0RGVzY3JpcHRpb24uaCBrQ01WaWRlb0NvZGVjVHlwZV9IRVZDICItZnJhbWV3b3JrIENvcmVNZWRpYSIKK30KIAogY2hlY2tfc3RydWN0ICJzeXMvdGltZS5oIHN5cy9yZXNvdXJjZS5oIiAic3RydWN0IHJ1c2FnZSIgcnVfbWF4cnNzCiAKQEAgLTUzNzgsMTUgKzU4OTAsMzAgQEAKIGNoZWNrX3R5cGUgIndpbmRvd3MuaCBkM2QxMS5oIiAiSUQzRDExVmlkZW9Db250ZXh0IgogY2hlY2tfdHlwZSAiZDNkOS5oIGR4dmEyYXBpLmgiIERYVkEyX0NvbmZpZ1BpY3R1cmVEZWNvZGUgLURfV0lOMzJfV0lOTlQ9MHgwNjAyCiAKLWNoZWNrX3R5cGUgInZhL3ZhLmgiICJWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIRVZDIgotY2hlY2tfdHlwZSAidmEvdmEuaCIgIlZBRGVjUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZQOSIKK2NoZWNrX3R5cGUgInZhL3ZhLmggdmEvdmFfZGVjX2hldmMuaCIgIlZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckhFVkMiCitjaGVja190eXBlICJ2YS92YS5oIHZhL3ZhX2RlY192cDguaCIgIlZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZQOCIKK2NoZWNrX3N0cnVjdCAidmEvdmEuaCIgIlZBRGVjUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZQOSIgYml0X2RlcHRoCitjaGVja190eXBlICJ2YS92YS5oIHZhL3ZhX3ZwcC5oIiAiVkFQcm9jUGlwZWxpbmVQYXJhbWV0ZXJCdWZmZXIiCitjaGVja190eXBlICJ2YS92YS5oIHZhL3ZhX2VuY19oMjY0LmgiICJWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0IgorY2hlY2tfdHlwZSAidmEvdmEuaCB2YS92YV9lbmNfaGV2Yy5oIiAiVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVySEVWQyIKK2NoZWNrX3R5cGUgInZhL3ZhLmggdmEvdmFfZW5jX2pwZWcuaCIgIlZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlckpQRUciCitjaGVja190eXBlICJ2YS92YS5oIHZhL3ZhX2VuY19tcGVnMi5oIiAiVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIiCitjaGVja190eXBlICJ2YS92YS5oIHZhL3ZhX2VuY192cDguaCIgICJWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDgiCitjaGVja190eXBlICJ2YS92YS5oIHZhL3ZhX2VuY192cDkuaCIgICJWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDkiCiAKIGNoZWNrX3R5cGUgInZkcGF1L3ZkcGF1LmgiICJWZHBQaWN0dXJlSW5mb0hFVkMiCiAKLWNoZWNrX2NwcF9jb25kaXRpb24gd2luZG93cy5oICIhV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QKSIgJiYgZW5hYmxlIHdpbnJ0IHx8IGRpc2FibGUgd2lucnQKK2lmICEgZGlzYWJsZWQgZmZudmNvZGVjOyB0aGVuCisgICAgY2hlY2tfcGtnX2NvbmZpZyBmZm52Y29kZWMgImZmbnZjb2RlYyA+PSA4LjAuMTQuMSIgXAorICAgICAgICAiZmZudmNvZGVjL252RW5jb2RlQVBJLmggZmZudmNvZGVjL2R5bmxpbmtfY3VkYS5oIGZmbnZjb2RlYy9keW5saW5rX2N1dmlkZGVjLmggZmZudmNvZGVjL2R5bmxpbmtfbnZjdXZpZC5oIiAiIgorZmkKKworY2hlY2tfY3BwX2NvbmRpdGlvbiB3aW5ydCB3aW5kb3dzLmggIiFXSU5BUElfRkFNSUxZX1BBUlRJVElPTihXSU5BUElfUEFSVElUSU9OX0RFU0tUT1ApIgogCiBpZiAhIGRpc2FibGVkIHczMnRocmVhZHMgJiYgISBlbmFibGVkIHB0aHJlYWRzOyB0aGVuCiAgICAgY2hlY2tfZnVuY19oZWFkZXJzICJ3aW5kb3dzLmggcHJvY2Vzcy5oIiBfYmVnaW50aHJlYWRleCAmJgorICAgICAgICBjaGVja190eXBlICJ3aW5kb3dzLmgiIENPTkRJVElPTl9WQVJJQUJMRSAmJgorICAgICAgICBjaGVja190eXBlICJ3aW5kb3dzLmgiIElOSVRfT05DRSAmJgogICAgICAgICBlbmFibGUgdzMydGhyZWFkcyB8fCBkaXNhYmxlIHczMnRocmVhZHMKICAgICBpZiAhIGVuYWJsZWQgdzMydGhyZWFkcyAmJiBlbmFibGVkIHdpbnJ0OyB0aGVuCiAgICAgICAgIGNoZWNrX2Z1bmNfaGVhZGVycyAid2luZG93cy5oIiBDcmVhdGVUaHJlYWQgJiYKQEAgLTUzOTcsMzcgKzU5MjQsNDAgQEAKICMgY2hlY2sgZm9yIHNvbWUgY29tbW9uIG1ldGhvZHMgb2YgYnVpbGRpbmcgd2l0aCBwdGhyZWFkIHN1cHBvcnQKICMgZG8gdGhpcyBiZWZvcmUgdGhlIG9wdGlvbmFsIGxpYnJhcnkgY2hlY2tzIGFzIHNvbWUgb2YgdGhlbSByZXF1aXJlIHB0aHJlYWRzCiBpZiAhIGRpc2FibGVkIHB0aHJlYWRzICYmICEgZW5hYmxlZCB3MzJ0aHJlYWRzICYmICEgZW5hYmxlZCBvczJ0aHJlYWRzOyB0aGVuCi0gICAgZW5hYmxlIHB0aHJlYWRzCi0gICAgaWYgY2hlY2tfZnVuYyBwdGhyZWFkX2pvaW4gLXB0aHJlYWQgJiYgY2hlY2tfZnVuYyBwdGhyZWFkX2NyZWF0ZSAtcHRocmVhZDsgdGhlbgorICAgIGlmIGNoZWNrX2xpYiBwdGhyZWFkcyBwdGhyZWFkLmggcHRocmVhZF9qb2luICAgLXB0aHJlYWQgJiYKKyAgICAgICBjaGVja19saWIgcHRocmVhZHMgcHRocmVhZC5oIHB0aHJlYWRfY3JlYXRlIC1wdGhyZWFkOyB0aGVuCiAgICAgICAgIGFkZF9jZmxhZ3MgLXB0aHJlYWQKLSAgICAgICAgYWRkX2V4dHJhbGlicyAtcHRocmVhZAotICAgIGVsaWYgY2hlY2tfZnVuYyBwdGhyZWFkX2pvaW4gLXB0aHJlYWRzICYmIGNoZWNrX2Z1bmMgcHRocmVhZF9jcmVhdGUgLXB0aHJlYWRzOyB0aGVuCisgICAgZWxpZiBjaGVja19saWIgcHRocmVhZHMgcHRocmVhZC5oIHB0aHJlYWRfam9pbiAgIC1wdGhyZWFkcyAmJgorICAgICAgICAgY2hlY2tfbGliIHB0aHJlYWRzIHB0aHJlYWQuaCBwdGhyZWFkX2NyZWF0ZSAtcHRocmVhZHM7IHRoZW4KICAgICAgICAgYWRkX2NmbGFncyAtcHRocmVhZHMKLSAgICAgICAgYWRkX2V4dHJhbGlicyAtcHRocmVhZHMKLSAgICBlbGlmIGNoZWNrX2Z1bmMgcHRocmVhZF9qb2luIC1sZGwgLXB0aHJlYWQgJiYgY2hlY2tfZnVuYyBwdGhyZWFkX2NyZWF0ZSAtbGRsIC1wdGhyZWFkOyB0aGVuCisgICAgZWxpZiBjaGVja19saWIgcHRocmVhZHMgcHRocmVhZC5oIHB0aHJlYWRfam9pbiAgIC1sZGwgLXB0aHJlYWQgJiYKKyAgICAgICAgIGNoZWNrX2xpYiBwdGhyZWFkcyBwdGhyZWFkLmggcHRocmVhZF9jcmVhdGUgLWxkbCAtcHRocmVhZDsgdGhlbgogICAgICAgICBhZGRfY2ZsYWdzIC1sZGwgLXB0aHJlYWQKLSAgICAgICAgYWRkX2V4dHJhbGlicyAtbGRsIC1wdGhyZWFkCi0gICAgZWxpZiBjaGVja19mdW5jIHB0aHJlYWRfam9pbiAtbHB0aHJlYWRHQzIgJiYgY2hlY2tfZnVuYyBwdGhyZWFkX2NyZWF0ZSAtbHB0aHJlYWRHQzI7IHRoZW4KLSAgICAgICAgYWRkX2V4dHJhbGlicyAtbHB0aHJlYWRHQzIKLSAgICBlbGlmIGNoZWNrX2xpYiBwdGhyZWFkLmggcHRocmVhZF9qb2luIC1scHRocmVhZCAmJiBjaGVja19saWIgcHRocmVhZC5oIHB0aHJlYWRfY3JlYXRlIC1scHRocmVhZDsgdGhlbgorICAgIGVsaWYgY2hlY2tfbGliIHB0aHJlYWRzIHB0aHJlYWQuaCBwdGhyZWFkX2pvaW4gICAtbHB0aHJlYWRHQzIgJiYKKyAgICAgICAgIGNoZWNrX2xpYiBwdGhyZWFkcyBwdGhyZWFkLmggcHRocmVhZF9jcmVhdGUgLWxwdGhyZWFkR0MyOyB0aGVuCiAgICAgICAgIDoKLSAgICBlbGlmICEgY2hlY2tfZnVuYyBwdGhyZWFkX2pvaW4gJiYgISBjaGVja19mdW5jIHB0aHJlYWRfY3JlYXRlOyB0aGVuCi0gICAgICAgIGRpc2FibGUgcHRocmVhZHMKKyAgICBlbGlmIGNoZWNrX2xpYiBwdGhyZWFkcyBwdGhyZWFkLmggcHRocmVhZF9qb2luICAgLWxwdGhyZWFkICYmCisgICAgICAgICBjaGVja19saWIgcHRocmVhZHMgcHRocmVhZC5oIHB0aHJlYWRfY3JlYXRlIC1scHRocmVhZDsgdGhlbgorICAgICAgICA6CisgICAgZWxpZiBjaGVja19mdW5jIHB0aHJlYWRfam9pbiAmJiBjaGVja19mdW5jIHB0aHJlYWRfY3JlYXRlOyB0aGVuCisgICAgICAgIGVuYWJsZSBwdGhyZWFkcwogICAgIGZpCi0gICAgY2hlY2tfY29kZSBjYyAicHRocmVhZC5oIiAic3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBhdG9taWNfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIiIHx8IGRpc2FibGUgcHRocmVhZHMKKyAgICBjaGVja19jYyBwdGhyZWFkcyAicHRocmVhZC5oIiAic3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBhdG9taWNfbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIiCisKKyAgICBpZiBlbmFibGVkIHB0aHJlYWRzOyB0aGVuCisgICAgICAgIGNoZWNrX2J1aWx0aW4gc2VtX3RpbWVkd2FpdCBzZW1hcGhvcmUuaCAic2VtX3QgKnM7IHNlbV9pbml0KHMsMCwwKTsgc2VtX3RpbWVkd2FpdChzLDApOyBzZW1fZGVzdHJveShzKSIgJHB0aHJlYWRzX2V4dHJhbGlicworICAgICAgICBjaGVja19mdW5jIHB0aHJlYWRfY2FuY2VsICRwdGhyZWFkc19leHRyYWxpYnMKKyAgICBmaQogZmkKIAorZW5hYmxlZCAgemxpYiAmJiBjaGVja19saWIgemxpYiAgIHpsaWIuaCAgICAgIHpsaWJWZXJzaW9uICAgIC1segorZW5hYmxlZCBiemxpYiAmJiBjaGVja19saWIgYnpsaWIgYnpsaWIuaCBCWjJfYnpsaWJWZXJzaW9uICAgIC1sYnoyCitlbmFibGVkICBsem1hICYmIGNoZWNrX2xpYiBsem1hICAgbHptYS5oIGx6bWFfdmVyc2lvbl9udW1iZXIgLWxsem1hCiAKLWlmIGVuYWJsZWQgcHRocmVhZHM7IHRoZW4KLSAgY2hlY2tfZnVuYyBwdGhyZWFkX2NhbmNlbAotZmkKKyMgT24gc29tZSBzeXN0ZW1zIGR5bmFtaWMgbG9hZGluZyByZXF1aXJlcyBubyBleHRyYSBsaW5rZXIgZmxhZ3MKK2NoZWNrX2xpYiBsaWJkbCBkbGZjbi5oICJkbG9wZW4gZGxzeW0iIHx8IGNoZWNrX2xpYiBsaWJkbCBkbGZjbi5oICJkbG9wZW4gZGxzeW0iIC1sZGwKIAotZGlzYWJsZWQgIHpsaWIgfHwgY2hlY2tfbGliICAgemxpYi5oICAgICAgemxpYlZlcnNpb24gLWx6ICAgfHwgZGlzYWJsZSAgemxpYgotZGlzYWJsZWQgYnpsaWIgfHwgY2hlY2tfbGliMiBiemxpYi5oIEJaMl9iemxpYlZlcnNpb24gLWxiejIgfHwgZGlzYWJsZSBiemxpYgotZGlzYWJsZWQgIGx6bWEgfHwgY2hlY2tfbGliMiAgbHptYS5oIGx6bWFfdmVyc2lvbl9udW1iZXIgLWxsem1hIHx8IGRpc2FibGUgbHptYQotCi1jaGVja19saWIgbWF0aC5oIHNpbiAtbG0gJiYgTElCTT0iLWxtIgotZGlzYWJsZWQgY3J5c3RhbGhkIHx8IGNoZWNrX2xpYiBsaWJjcnlzdGFsaGQvbGliY3J5c3RhbGhkX2lmLmggRHRzQ3J5c3RhbEhEVmVyc2lvbiAtbGNyeXN0YWxoZCB8fCBkaXNhYmxlIGNyeXN0YWxoZAorY2hlY2tfbGliIGxpYm0gbWF0aC5oIHNpbiAtbG0KIAogYXRhbjJmX2FyZ3M9MgogY29weXNpZ25fYXJncz0yCkBAIC01NDM2LDcgKzU5NjYsNyBAQAogcG93Zl9hcmdzPTIKIAogZm9yIGZ1bmMgaW4gJE1BVEhfRlVOQ1M7IGRvCi0gICAgZXZhbCBjaGVja19tYXRoZnVuYyAkZnVuYyBcJHske2Z1bmN9X2FyZ3M6LTF9CisgICAgZXZhbCBjaGVja19tYXRoZnVuYyAkZnVuYyBcJHske2Z1bmN9X2FyZ3M6LTF9ICRsaWJtX2V4dHJhbGlicwogZG9uZQogCiBmb3IgZnVuYyBpbiAkQ09NUExFWF9GVU5DUzsgZG8KQEAgLTU0NDQsMTAxICs1OTc0LDEyMCBAQAogZG9uZQogCiAjIHRoZXNlIGFyZSBvZmYgYnkgZGVmYXVsdCwgc28gZmFpbCBpZiByZXF1ZXN0ZWQgYW5kIG5vdCBhdmFpbGFibGUKLWVuYWJsZWQgYXZmb3VuZGF0aW9uX2luZGV2ICYmIHsgY2hlY2tfaGVhZGVyX29iamNjIEFWRm91bmRhdGlvbi9BVkZvdW5kYXRpb24uaCB8fCBkaXNhYmxlIGF2Zm91bmRhdGlvbl9pbmRldjsgfQotZW5hYmxlZCBhdmZvdW5kYXRpb25faW5kZXYgJiYgeyBjaGVja19saWIyIENvcmVHcmFwaGljcy9Db3JlR3JhcGhpY3MuaCBDR0dldEFjdGl2ZURpc3BsYXlMaXN0IC1mcmFtZXdvcmsgQ29yZUdyYXBoaWNzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2xpYjIgQXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmggQ0dHZXRBY3RpdmVEaXNwbGF5TGlzdCAtZnJhbWV3b3JrIEFwcGxpY2F0aW9uU2VydmljZXM7IH0KLWVuYWJsZWQgYXZpc3ludGggICAgICAgICAgJiYgeyB7IGNoZWNrX2xpYjIgIndpbmRvd3MuaCIgTG9hZExpYnJhcnk7IH0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNoZWNrX2xpYjIgImRsZmNuLmgiIGRsb3BlbiAtbGRsOyB9IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFUlJPUjogTG9hZExpYnJhcnkvZGxvcGVuIG5vdCBmb3VuZCBmb3IgYXZpc3ludGgiOyB9CitlbmFibGVkIGN1ZGFfc2RrICAgICAgICAgICYmIHJlcXVpcmUgY3VkYV9zZGsgY3VkYS5oIGN1Q3R4Q3JlYXRlIC1sY3VkYQogZW5hYmxlZCBjaHJvbWFwcmludCAgICAgICAmJiByZXF1aXJlIGNocm9tYXByaW50IGNocm9tYXByaW50LmggY2hyb21hcHJpbnRfZ2V0X3ZlcnNpb24gLWxjaHJvbWFwcmludAotZW5hYmxlZCBkZWNrbGluayAgICAgICAgICAmJiB7IGNoZWNrX2hlYWRlciBEZWNrTGlua0FQSS5oIHx8IGRpZSAiRVJST1I6IERlY2tMaW5rQVBJLmggaGVhZGVyIG5vdCBmb3VuZCI7IH0KLWVuYWJsZWQgZnJlaTByICAgICAgICAgICAgJiYgeyBjaGVja19oZWFkZXIgZnJlaTByLmggfHwgZGllICJFUlJPUjogZnJlaTByLmggaGVhZGVyIG5vdCBmb3VuZCI7IH0KLWVuYWJsZWQgZ21wICAgICAgICAgICAgICAgJiYgcmVxdWlyZTIgZ21wIGdtcC5oIG1wel9leHBvcnQgLWxnbXAKLWVuYWJsZWQgZ251dGxzICAgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGdudXRscyBnbnV0bHMvZ251dGxzLmggZ251dGxzX2dsb2JhbF9pbml0Ci1lbmFibGVkIGxhZHNwYSAgICAgICAgICAgICYmIHsgY2hlY2tfaGVhZGVyIGxhZHNwYS5oIHx8IGRpZSAiRVJST1I6IGxhZHNwYS5oIGhlYWRlciBub3QgZm91bmQiOyB9CitlbmFibGVkIGRlY2tsaW5rICAgICAgICAgICYmIHsgcmVxdWlyZV9oZWFkZXIgRGVja0xpbmtBUEkuaCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGVzdF9jcHBfY29uZGl0aW9uIERlY2tMaW5rQVBJVmVyc2lvbi5oICJCTEFDS01BR0lDX0RFQ0tMSU5LX0FQSV9WRVJTSU9OID49IDB4MGEwNjAxMDAiIHx8IGRpZSAiRVJST1I6IERlY2tsaW5rIEFQSSB2ZXJzaW9uIG11c3QgYmUgPj0gMTAuNi4xLiI7IH0gfQorZW5hYmxlZCBsaWJuZGlfbmV3dGVrICAgICAmJiByZXF1aXJlX2hlYWRlciBQcm9jZXNzaW5nLk5ESS5MaWIuaAorZW5hYmxlZCBmcmVpMHIgICAgICAgICAgICAmJiByZXF1aXJlX2hlYWRlciBmcmVpMHIuaAorZW5hYmxlZCBnbXAgICAgICAgICAgICAgICAmJiByZXF1aXJlIGdtcCBnbXAuaCBtcHpfZXhwb3J0IC1sZ21wCitlbmFibGVkIGdudXRscyAgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBnbnV0bHMgZ251dGxzIGdudXRscy9nbnV0bHMuaCBnbnV0bHNfZ2xvYmFsX2luaXQKK2VuYWJsZWQgam5pICAgICAgICAgICAgICAgJiYgeyBbICR0YXJnZXRfb3MgPSAiYW5kcm9pZCIgXSAmJiBjaGVja19oZWFkZXIgam5pLmggJiYgZW5hYmxlZCBwdGhyZWFkcyB8fCBkaWUgIkVSUk9SOiBqbmkgbm90IGZvdW5kIjsgfQorZW5hYmxlZCBsYWRzcGEgICAgICAgICAgICAmJiByZXF1aXJlX2hlYWRlciBsYWRzcGEuaAorZW5hYmxlZCBsaWJhb20gICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGliYW9tICJhb20gPj0gMC4xLjAiIGFvbS9hb21fY29kZWMuaCBhb21fY29kZWNfdmVyc2lvbgorZW5hYmxlZCBsdjIgICAgICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbHYyIGxpbHYtMCAibGlsdi9saWx2LmgiIGxpbHZfd29ybGRfbmV3CiBlbmFibGVkIGxpYmllYzYxODgzICAgICAgICYmIHJlcXVpcmUgbGliaWVjNjE4ODMgbGliaWVjNjE4ODMvaWVjNjE4ODMuaCBpZWM2MTg4M19jbXBfY29ubmVjdCAtbHJhdzEzOTQgLWxhdmMxMzk0IC1scm9tMTM5NCAtbGllYzYxODgzCi1lbmFibGVkIGxpYmFzcyAgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJhc3MgYXNzL2Fzcy5oIGFzc19saWJyYXJ5X2luaXQKLWVuYWJsZWQgbGliYmx1cmF5ICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYmJsdXJheSBsaWJibHVyYXkvYmx1cmF5LmggYmRfb3BlbgotZW5hYmxlZCBsaWJiczJiICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGliYnMyYiBiczJiLmggYnMyYl9vcGVuCitlbmFibGVkIGxpYmFzcyAgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJhc3MgbGliYXNzIGFzcy9hc3MuaCBhc3NfbGlicmFyeV9pbml0CitlbmFibGVkIGxpYmJsdXJheSAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJibHVyYXkgbGliYmx1cmF5IGxpYmJsdXJheS9ibHVyYXkuaCBiZF9vcGVuCitlbmFibGVkIGxpYmJzMmIgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJiczJiIGxpYmJzMmIgYnMyYi5oIGJzMmJfb3BlbgogZW5hYmxlZCBsaWJjZWx0ICAgICAgICAgICAmJiByZXF1aXJlIGxpYmNlbHQgY2VsdC9jZWx0LmggY2VsdF9kZWNvZGUgLWxjZWx0MCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNoZWNrX2xpYiBjZWx0L2NlbHQuaCBjZWx0X2RlY29kZXJfY3JlYXRlX2N1c3RvbSAtbGNlbHQwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2hlY2tfbGliIGxpYmNlbHQgY2VsdC9jZWx0LmggY2VsdF9kZWNvZGVyX2NyZWF0ZV9jdXN0b20gLWxjZWx0MCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IGxpYmNlbHQgbXVzdCBiZSBpbnN0YWxsZWQgYW5kIHZlcnNpb24gbXVzdCBiZSA+PSAwLjExLjAuIjsgfQotZW5hYmxlZCBsaWJjYWNhICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgY2FjYSBjYWNhLmggY2FjYV9jcmVhdGVfY2FudmFzCi1lbmFibGVkIGxpYmRjYWRlYyAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyAiZGNhZGVjID49IDAuMS4wIiBsaWJkY2FkZWMvZGNhX2NvbnRleHQuaCBkY2FkZWNfY29udGV4dF9jcmVhdGUKLWVuYWJsZWQgbGliZmFhYyAgICAgICAgICAgJiYgcmVxdWlyZTIgbGliZmFhYyAic3RkaW50LmggZmFhYy5oIiBmYWFjRW5jR2V0VmVyc2lvbiAtbGZhYWMKLWVuYWJsZWQgbGliZmRrX2FhYyAgICAgICAgJiYgeyB1c2VfcGtnX2NvbmZpZyBmZGstYWFjICJmZGstYWFjL2FhY2VuY19saWIuaCIgYWFjRW5jT3BlbiB8fAorZW5hYmxlZCBsaWJjYWNhICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGliY2FjYSBjYWNhIGNhY2EuaCBjYWNhX2NyZWF0ZV9jYW52YXMKK2VuYWJsZWQgbGliY29kZWMyICAgICAgICAgJiYgcmVxdWlyZSBsaWJjb2RlYzIgY29kZWMyL2NvZGVjMi5oIGNvZGVjMl9jcmVhdGUgLWxjb2RlYzIKK2VuYWJsZWQgbGliZGMxMzk0ICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYmRjMTM5NCBsaWJkYzEzOTQtMiBkYzEzOTQvZGMxMzk0LmggZGMxMzk0X25ldworZW5hYmxlZCBsaWJkcm0gICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGliZHJtIGxpYmRybSB4Zjg2ZHJtLmggZHJtR2V0VmVyc2lvbgorZW5hYmxlZCBsaWJmZGtfYWFjICAgICAgICAmJiB7IGNoZWNrX3BrZ19jb25maWcgbGliZmRrX2FhYyBmZGstYWFjICJmZGstYWFjL2FhY2VuY19saWIuaCIgYWFjRW5jT3BlbiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWlyZSBsaWJmZGtfYWFjIGZkay1hYWMvYWFjZW5jX2xpYi5oIGFhY0VuY09wZW4gLWxmZGstYWFjICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuICJ1c2luZyBsaWJmZGsgd2l0aG91dCBwa2ctY29uZmlnIjsgfSB9Ci1mbGl0ZV9saWJzPSItbGZsaXRlX2NtdV90aW1lX2F3YiAtbGZsaXRlX2NtdV91c19hd2IgLWxmbGl0ZV9jbXVfdXNfa2FsIC1sZmxpdGVfY211X3VzX2thbDE2IC1sZmxpdGVfY211X3VzX3JtcyAtbGZsaXRlX2NtdV91c19zbHQgLWxmbGl0ZV91c2VuZ2xpc2ggLWxmbGl0ZV9jbXVsZXggLWxmbGl0ZSIKLWVuYWJsZWQgbGliZmxpdGUgICAgICAgICAgJiYgcmVxdWlyZTIgbGliZmxpdGUgImZsaXRlL2ZsaXRlLmgiIGZsaXRlX2luaXQgJGZsaXRlX2xpYnMKK2ZsaXRlX2V4dHJhbGlicz0iLWxmbGl0ZV9jbXVfdGltZV9hd2IgLWxmbGl0ZV9jbXVfdXNfYXdiIC1sZmxpdGVfY211X3VzX2thbCAtbGZsaXRlX2NtdV91c19rYWwxNiAtbGZsaXRlX2NtdV91c19ybXMgLWxmbGl0ZV9jbXVfdXNfc2x0IC1sZmxpdGVfdXNlbmdsaXNoIC1sZmxpdGVfY211bGV4IC1sZmxpdGUiCitlbmFibGVkIGxpYmZsaXRlICAgICAgICAgICYmIHJlcXVpcmUgbGliZmxpdGUgImZsaXRlL2ZsaXRlLmgiIGZsaXRlX2luaXQgJGZsaXRlX2V4dHJhbGlicwogZW5hYmxlZCBmb250Y29uZmlnICAgICAgICAmJiBlbmFibGUgbGliZm9udGNvbmZpZwotZW5hYmxlZCBsaWJmb250Y29uZmlnICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgZm9udGNvbmZpZyAiZm9udGNvbmZpZy9mb250Y29uZmlnLmgiIEZjSW5pdAotZW5hYmxlZCBsaWJmcmVldHlwZSAgICAgICAmJiByZXF1aXJlX2xpYmZyZWV0eXBlCi1lbmFibGVkIGxpYmZyaWJpZGkgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBmcmliaWRpIGZyaWJpZGkuaCBmcmliaWRpX3ZlcnNpb25faW5mbwotZW5hYmxlZCBsaWJnbWUgICAgICAgICAgICAmJiByZXF1aXJlICBsaWJnbWUgZ21lL2dtZS5oIGdtZV9uZXdfZW11IC1sZ21lIC1sc3RkYysrCitlbmFibGVkIGxpYmZvbnRjb25maWcgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJmb250Y29uZmlnIGZvbnRjb25maWcgImZvbnRjb25maWcvZm9udGNvbmZpZy5oIiBGY0luaXQKK2VuYWJsZWQgbGliZnJlZXR5cGUgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYmZyZWV0eXBlIGZyZWV0eXBlMiAiZnQyYnVpbGQuaCBGVF9GUkVFVFlQRV9IIiBGVF9Jbml0X0ZyZWVUeXBlCitlbmFibGVkIGxpYmZyaWJpZGkgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJmcmliaWRpIGZyaWJpZGkgZnJpYmlkaS5oIGZyaWJpZGlfdmVyc2lvbl9pbmZvCitlbmFibGVkIGxpYmdtZSAgICAgICAgICAgICYmIHsgY2hlY2tfcGtnX2NvbmZpZyBsaWJnbWUgbGliZ21lIGdtZS9nbWUuaCBnbWVfbmV3X2VtdSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmUgbGliZ21lIGdtZS9nbWUuaCBnbWVfbmV3X2VtdSAtbGdtZSAtbHN0ZGMrKzsgfQogZW5hYmxlZCBsaWJnc20gICAgICAgICAgICAmJiB7IGZvciBnc21faGRyIGluICJnc20uaCIgImdzbS9nc20uaCI7IGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2xpYiAiJHtnc21faGRyfSIgZ3NtX2NyZWF0ZSAtbGdzbSAmJiBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIGxpYmdzbSAiJHtnc21faGRyfSIgZ3NtX2NyZWF0ZSAtbGdzbSAmJiBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lIHx8IGRpZSAiRVJST1I6IGxpYmdzbSBub3QgZm91bmQiOyB9Ci1lbmFibGVkIGxpYmlsYmMgICAgICAgICAgICYmIHJlcXVpcmUgbGliaWxiYyBpbGJjLmggV2ViUnRjSWxiY2ZpeF9Jbml0RGVjb2RlIC1saWxiYwotZW5hYmxlZCBsaWJrdmF6YWFyICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgImt2YXphYXIgPj0gMC44LjEiIGt2YXphYXIuaCBrdnpfYXBpX2dldAotZW5hYmxlZCBsaWJtZnggICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGlibWZ4ICJtZngvbWZ4dmlkZW8uaCIgTUZYSW5pdAotZW5hYmxlZCBsaWJtb2RwbHVnICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGlibW9kcGx1ZyBsaWJtb2RwbHVnL21vZHBsdWcuaCBNb2RQbHVnX0xvYWQKLWVuYWJsZWQgbGlibXAzbGFtZSAgICAgICAgJiYgcmVxdWlyZSAibGlibXAzbGFtZSA+PSAzLjk4LjMiIGxhbWUvbGFtZS5oIGxhbWVfc2V0X1ZCUl9xdWFsaXR5IC1sbXAzbGFtZQotZW5hYmxlZCBsaWJudXQgICAgICAgICAgICAmJiByZXF1aXJlIGxpYm51dCBsaWJudXQuaCBudXRfZGVtdXhlcl9pbml0IC1sbnV0CitlbmFibGVkIGxpYmlsYmMgICAgICAgICAgICYmIHJlcXVpcmUgbGliaWxiYyBpbGJjLmggV2ViUnRjSWxiY2ZpeF9Jbml0RGVjb2RlIC1saWxiYyAkcHRocmVhZHNfZXh0cmFsaWJzCitlbmFibGVkIGxpYmt2YXphYXIgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJrdmF6YWFyICJrdmF6YWFyID49IDAuOC4xIiBrdmF6YWFyLmgga3Z6X2FwaV9nZXQKKyMgV2hpbGUgaXQgbWF5IGFwcGVhciB0aGF0IHJlcXVpcmUgaXMgYmVpbmcgdXNlZCBhcyBhIHBrZy1jb25maWcKKyMgZmFsbGJhY2sgZm9yIGxpYm1meCwgaXQgaXMgYWN0dWFsbHkgYmVpbmcgdXNlZCB0byBkZXRlY3QgYSBkaWZmZXJlbnQKKyMgaW5zdGFsbGF0aW9uIHJvdXRlIGFsdG9nZXRoZXIuICBJZiBsaWJtZnggaXMgaW5zdGFsbGVkIHZpYSB0aGUgSW50ZWwKKyMgTWVkaWEgU0RLIG9yIEludGVsIE1lZGlhIFNlcnZlciBTdHVkaW8sIHRoZXNlIGRvbid0IGNvbWUgd2l0aAorIyBwa2ctY29uZmlnIHN1cHBvcnQuICBJbnN0ZWFkLCB1c2VycyBzaG91bGQgbWFrZSBzdXJlIHRoYXQgdGhlIGJ1aWxkCisjIGNhbiBmaW5kIHRoZSBsaWJyYXJpZXMgYW5kIGhlYWRlcnMgdGhyb3VnaCBvdGhlciBtZWFucy4KK2VuYWJsZWQgbGlibWZ4ICAgICAgICAgICAgJiYgeyBjaGVja19wa2dfY29uZmlnIGxpYm1meCBsaWJtZnggIm1meC9tZnh2aWRlby5oIiBNRlhJbml0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXF1aXJlIGxpYm1meCAibWZ4L21meHZpZGVvLmgiIE1GWEluaXQgIi1sbGlibWZ4ICRhZHZhcGkzMl9leHRyYWxpYnMiICYmIHdhcm4gInVzaW5nIGxpYm1meCB3aXRob3V0IHBrZy1jb25maWciOyB9IH0KK2VuYWJsZWQgbGlibW9kcGx1ZyAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYm1vZHBsdWcgbGlibW9kcGx1ZyBsaWJtb2RwbHVnL21vZHBsdWcuaCBNb2RQbHVnX0xvYWQKK2VuYWJsZWQgbGlibXAzbGFtZSAgICAgICAgJiYgcmVxdWlyZSAibGlibXAzbGFtZSA+PSAzLjk4LjMiIGxhbWUvbGFtZS5oIGxhbWVfc2V0X1ZCUl9xdWFsaXR5IC1sbXAzbGFtZSAkbGlibV9leHRyYWxpYnMKK2VuYWJsZWQgbGlibXlzb2ZhICAgICAgICAgJiYgcmVxdWlyZSBsaWJteXNvZmEgIm15c29mYS5oIiBteXNvZmFfbG9hZCAtbG15c29mYSAkemxpYl9leHRyYWxpYnMKK2VuYWJsZWQgbGlibnBwICAgICAgICAgICAgJiYgeyBjaGVja19saWIgbGlibnBwIG5wcC5oIG5wcEdldExpYlZlcnNpb24gLWxucHBpZyAtbG5wcGljYyAtbG5wcGMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19saWIgbGlibnBwIG5wcC5oIG5wcEdldExpYlZlcnNpb24gLWxucHBpIC1sbnBwYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IGxpYm5wcCBub3QgZm91bmQiOyB9CiBlbmFibGVkIGxpYm9wZW5jb3JlX2Ftcm5iICYmIHJlcXVpcmUgbGlib3BlbmNvcmVfYW1ybmIgb3BlbmNvcmUtYW1ybmIvaW50ZXJmX2RlYy5oIERlY29kZXJfSW50ZXJmYWNlX2luaXQgLWxvcGVuY29yZS1hbXJuYgogZW5hYmxlZCBsaWJvcGVuY29yZV9hbXJ3YiAmJiByZXF1aXJlIGxpYm9wZW5jb3JlX2FtcndiIG9wZW5jb3JlLWFtcndiL2RlY19pZi5oIERfSUZfaW5pdCAtbG9wZW5jb3JlLWFtcndiCiBlbmFibGVkIGxpYm9wZW5jdiAgICAgICAgICYmIHsgY2hlY2tfaGVhZGVyIG9wZW5jdjIvY29yZS9jb3JlX2MuaCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfcGtnX2NvbmZpZyBvcGVuY3Ygb3BlbmN2Mi9jb3JlL2NvcmVfYy5oIGN2Q3JlYXRlSW1hZ2VIZWFkZXIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX3BrZ19jb25maWcgb3BlbmN2IG9wZW5jdi9jeGNvcmUuaCBjdkNyZWF0ZUltYWdlSGVhZGVyOyB9Ci1lbmFibGVkIGxpYm9wZW5oMjY0ICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBvcGVuaDI2NCB3ZWxzL2NvZGVjX2FwaS5oIFdlbHNHZXRDb2RlY1ZlcnNpb24KLWVuYWJsZWQgbGlib3BlbmpwZWcgICAgICAgJiYgeyBjaGVja19saWIgb3BlbmpwZWctMi4xL29wZW5qcGVnLmggb3BqX3ZlcnNpb24gLWxvcGVuanAyIC1ET1BKX1NUQVRJQyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2xpYiBvcGVuanBlZy0yLjAvb3BlbmpwZWcuaCBvcGpfdmVyc2lvbiAtbG9wZW5qcDIgLURPUEpfU1RBVElDIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG9wZW5qcGVnLTEuNS9vcGVuanBlZy5oIG9wal92ZXJzaW9uIC1sb3BlbmpwZWcgLURPUEpfU1RBVElDIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG9wZW5qcGVnLmggb3BqX3ZlcnNpb24gLWxvcGVuanBlZyAtRE9QSl9TVEFUSUMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVSUk9SOiBsaWJvcGVuanBlZyBub3QgZm91bmQiOyB9Ci1lbmFibGVkIGxpYm9wdXMgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBvcHVzIG9wdXNfbXVsdGlzdHJlYW0uaCBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlCi1lbmFibGVkIGxpYnB1bHNlICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJwdWxzZSBwdWxzZS9wdWxzZWF1ZGlvLmggcGFfY29udGV4dF9uZXcKLWVuYWJsZWQgbGlicnRtcCAgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYnJ0bXAgbGlicnRtcC9ydG1wLmggUlRNUF9Tb2NrZXQKLWVuYWJsZWQgbGlicnViYmVyYmFuZCAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnICJydWJiZXJiYW5kID49IDEuOC4xIiBydWJiZXJiYW5kL3J1YmJlcmJhbmQtYy5oIHJ1YmJlcmJhbmRfbmV3Ci1lbmFibGVkIGxpYnNjaHJvZWRpbmdlciAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBzY2hyb2VkaW5nZXItMS4wIHNjaHJvZWRpbmdlci9zY2hyby5oIHNjaHJvX2luaXQKLWVuYWJsZWQgbGlic2hpbmUgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIHNoaW5lIHNoaW5lL2xheWVyMy5oIHNoaW5lX2VuY29kZV9idWZmZXIKLWVuYWJsZWQgbGlic21iY2xpZW50ICAgICAgJiYgeyB1c2VfcGtnX2NvbmZpZyBzbWJjbGllbnQgbGlic21iY2xpZW50Lmggc21iY19pbml0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSBzbWJjbGllbnQgbGlic21iY2xpZW50Lmggc21iY19pbml0IC1sc21iY2xpZW50OyB9Ci1lbmFibGVkIGxpYnNuYXBweSAgICAgICAgICYmIHJlcXVpcmUgc25hcHB5IHNuYXBweS1jLmggc25hcHB5X2NvbXByZXNzIC1sc25hcHB5Ci1lbmFibGVkIGxpYnNveHIgICAgICAgICAgICYmIHJlcXVpcmUgbGlic294ciBzb3hyLmggc294cl9jcmVhdGUgLWxzb3hyICYmIExJQlNPWFI9Ii1sc294ciIKLWVuYWJsZWQgbGlic3NoICAgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYnNzaCBsaWJzc2gvc2Z0cC5oIHNmdHBfaW5pdAotZW5hYmxlZCBsaWJzcGVleCAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgc3BlZXggc3BlZXgvc3BlZXguaCBzcGVleF9kZWNvZGVyX2luaXQgLWxzcGVleAotZW5hYmxlZCBsaWJ0ZXNzZXJhY3QgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgdGVzc2VyYWN0IHRlc3NlcmFjdC9jYXBpLmggVGVzc0Jhc2VBUElDcmVhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNoZWNrX3BrZ19jb25maWcgbGlib3BlbmN2IG9wZW5jdiBvcGVuY3YyL2NvcmUvY29yZV9jLmggY3ZDcmVhdGVJbWFnZUhlYWRlciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSBsaWJvcGVuY3Ygb3BlbmN2Mi9jb3JlL2NvcmVfYy5oIGN2Q3JlYXRlSW1hZ2VIZWFkZXIgLWxvcGVuY3ZfY29yZSAtbG9wZW5jdl9pbWdwcm9jOyB9IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9wa2dfY29uZmlnIGxpYm9wZW5jdiBvcGVuY3Ygb3BlbmN2L2N4Y29yZS5oIGN2Q3JlYXRlSW1hZ2VIZWFkZXI7IH0KK2VuYWJsZWQgbGlib3BlbmgyNjQgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYm9wZW5oMjY0IG9wZW5oMjY0IHdlbHMvY29kZWNfYXBpLmggV2Vsc0dldENvZGVjVmVyc2lvbgorZW5hYmxlZCBsaWJvcGVuanBlZyAgICAgICAmJiB7IGNoZWNrX3BrZ19jb25maWcgbGlib3BlbmpwZWcgImxpYm9wZW5qcDIgPj0gMi4xLjAiIG9wZW5qcGVnLmggb3BqX3ZlcnNpb24gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJvcGVuanBlZyAibGlib3BlbmpwMiA+PSAyLjEuMCIgb3BlbmpwZWcuaCBvcGpfdmVyc2lvbiAtRE9QSl9TVEFUSUMgJiYgYWRkX2NwcGZsYWdzIC1ET1BKX1NUQVRJQzsgfSB9CitlbmFibGVkIGxpYm9wZW5tcHQgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJvcGVubXB0ICJsaWJvcGVubXB0ID49IDAuMi42NTU3IiBsaWJvcGVubXB0L2xpYm9wZW5tcHQuaCBvcGVubXB0X21vZHVsZV9jcmVhdGUgLWxzdGRjKysgJiYgYXBwZW5kIGxpYm9wZW5tcHRfZXh0cmFsaWJzICItbHN0ZGMrKyIKK2VuYWJsZWQgbGlib3B1cyAgICAgICAgICAgJiYgeworICAgIGVuYWJsZWQgbGlib3B1c19kZWNvZGVyICYmIHsKKyAgICAgICAgcmVxdWlyZV9wa2dfY29uZmlnIGxpYm9wdXMgb3B1cyBvcHVzX211bHRpc3RyZWFtLmggb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZQorICAgIH0KKyAgICBlbmFibGVkIGxpYm9wdXNfZW5jb2RlciAmJiB7CisgICAgICAgIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJvcHVzIG9wdXMgb3B1c19tdWx0aXN0cmVhbS5oIG9wdXNfbXVsdGlzdHJlYW1fc3Vycm91bmRfZW5jb2Rlcl9jcmVhdGUKKyAgICB9Cit9CitlbmFibGVkIGxpYnB1bHNlICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJwdWxzZSBsaWJwdWxzZSBwdWxzZS9wdWxzZWF1ZGlvLmggcGFfY29udGV4dF9uZXcKK2VuYWJsZWQgbGlicnN2ZyAgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYnJzdmcgbGlicnN2Zy0yLjAgbGlicnN2Zy0yLjAvbGlicnN2Zy9yc3ZnLmggcnN2Z19oYW5kbGVfcmVuZGVyX2NhaXJvCitlbmFibGVkIGxpYnJ0bXAgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJydG1wIGxpYnJ0bXAgbGlicnRtcC9ydG1wLmggUlRNUF9Tb2NrZXQKK2VuYWJsZWQgbGlicnViYmVyYmFuZCAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYnJ1YmJlcmJhbmQgInJ1YmJlcmJhbmQgPj0gMS44LjEiIHJ1YmJlcmJhbmQvcnViYmVyYmFuZC1jLmggcnViYmVyYmFuZF9uZXcgLWxzdGRjKysgJiYgYXBwZW5kIGxpYnJ1YmJlcmJhbmRfZXh0cmFsaWJzICItbHN0ZGMrKyIKK2VuYWJsZWQgbGlic2hpbmUgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYnNoaW5lIHNoaW5lIHNoaW5lL2xheWVyMy5oIHNoaW5lX2VuY29kZV9idWZmZXIKK2VuYWJsZWQgbGlic21iY2xpZW50ICAgICAgJiYgeyBjaGVja19wa2dfY29uZmlnIGxpYnNtYmNsaWVudCBzbWJjbGllbnQgbGlic21iY2xpZW50Lmggc21iY19pbml0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSBsaWJzbWJjbGllbnQgbGlic21iY2xpZW50Lmggc21iY19pbml0IC1sc21iY2xpZW50OyB9CitlbmFibGVkIGxpYnNuYXBweSAgICAgICAgICYmIHJlcXVpcmUgbGlic25hcHB5IHNuYXBweS1jLmggc25hcHB5X2NvbXByZXNzIC1sc25hcHB5IC1sc3RkYysrCitlbmFibGVkIGxpYnNveHIgICAgICAgICAgICYmIHJlcXVpcmUgbGlic294ciBzb3hyLmggc294cl9jcmVhdGUgLWxzb3hyCitlbmFibGVkIGxpYnNzaCAgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJzc2ggbGlic3NoIGxpYnNzaC9zZnRwLmggc2Z0cF9pbml0CitlbmFibGVkIGxpYnNwZWV4ICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJzcGVleCBzcGVleCBzcGVleC9zcGVleC5oIHNwZWV4X2RlY29kZXJfaW5pdAorZW5hYmxlZCBsaWJzcnQgICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGlic3J0ICJzcnQgPj0gMS4yLjAiIHNydC9zcnQuaCBzcnRfc29ja2V0CitlbmFibGVkIGxpYnRlc3NlcmFjdCAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJ0ZXNzZXJhY3QgdGVzc2VyYWN0IHRlc3NlcmFjdC9jYXBpLmggVGVzc0Jhc2VBUElDcmVhdGUKIGVuYWJsZWQgbGlidGhlb3JhICAgICAgICAgJiYgcmVxdWlyZSBsaWJ0aGVvcmEgdGhlb3JhL3RoZW9yYWVuYy5oIHRoX2luZm9faW5pdCAtbHRoZW9yYWVuYyAtbHRoZW9yYWRlYyAtbG9nZworZW5hYmxlZCBsaWJ0bHMgICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGlidGxzIGxpYnRscyB0bHMuaCB0bHNfY29uZmlndXJlCiBlbmFibGVkIGxpYnR3b2xhbWUgICAgICAgICYmIHJlcXVpcmUgbGlidHdvbGFtZSB0d29sYW1lLmggdHdvbGFtZV9pbml0IC1sdHdvbGFtZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNoZWNrX2xpYiB0d29sYW1lLmggdHdvbGFtZV9lbmNvZGVfYnVmZmVyX2Zsb2F0MzJfaW50ZXJsZWF2ZWQgLWx0d29sYW1lIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2hlY2tfbGliIGxpYnR3b2xhbWUgdHdvbGFtZS5oIHR3b2xhbWVfZW5jb2RlX2J1ZmZlcl9mbG9hdDMyX2ludGVybGVhdmVkIC1sdHdvbGFtZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IGxpYnR3b2xhbWUgbXVzdCBiZSBpbnN0YWxsZWQgYW5kIHZlcnNpb24gbXVzdCBiZSA+PSAwLjMuMTAiOyB9Ci1lbmFibGVkIGxpYnV0dmlkZW8gICAgICAgICYmIHJlcXVpcmVfY3BwIHV0dmlkZW8gInN0ZGludC5oIHN0ZGxpYi5oIHV0dmlkZW8vdXR2aWRlby5oIHV0dmlkZW8vQ29kZWMuaCIgJ0NDb2RlYyonIC1sdXR2aWRlbyAtbHN0ZGMrKwotZW5hYmxlZCBsaWJ2NGwyICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGlidjRsMiBsaWJ2NGwyLmggdjRsMl9pb2N0bAotZW5hYmxlZCBsaWJ2aWRzdGFiICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgInZpZHN0YWIgPj0gMC45OCIgdmlkLnN0YWIvbGlidmlkc3RhYi5oIHZzTW90aW9uRGV0ZWN0SW5pdAorZW5hYmxlZCBsaWJ2NGwyICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGlidjRsMiBsaWJ2NGwyIGxpYnY0bDIuaCB2NGwyX2lvY3RsCitlbmFibGVkIGxpYnZpZHN0YWIgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJ2aWRzdGFiICJ2aWRzdGFiID49IDAuOTgiIHZpZC5zdGFiL2xpYnZpZHN0YWIuaCB2c01vdGlvbkRldGVjdEluaXQKK2VuYWJsZWQgbGlidm1hZiAgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYnZtYWYgImxpYnZtYWYgPj0gMC42LjIiIGxpYnZtYWYuaCBjb21wdXRlX3ZtYWYKIGVuYWJsZWQgbGlidm9fYW1yd2JlbmMgICAgJiYgcmVxdWlyZSBsaWJ2b19hbXJ3YmVuYyB2by1hbXJ3YmVuYy9lbmNfaWYuaCBFX0lGX2luaXQgLWx2by1hbXJ3YmVuYwotZW5hYmxlZCBsaWJ2b3JiaXMgICAgICAgICAmJiByZXF1aXJlIGxpYnZvcmJpcyB2b3JiaXMvdm9yYmlzZW5jLmggdm9yYmlzX2luZm9faW5pdCAtbHZvcmJpc2VuYyAtbHZvcmJpcyAtbG9nZworZW5hYmxlZCBsaWJ2b3JiaXMgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGlidm9yYmlzIHZvcmJpcyB2b3JiaXMvY29kZWMuaCB2b3JiaXNfaW5mb19pbml0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJ2b3JiaXNlbmMgdm9yYmlzZW5jIHZvcmJpcy92b3JiaXNlbmMuaCB2b3JiaXNfZW5jb2RlX2luaXQKIAogZW5hYmxlZCBsaWJ2cHggICAgICAgICAgICAmJiB7CiAgICAgZW5hYmxlZCBsaWJ2cHhfdnA4X2RlY29kZXIgJiYgewotICAgICAgICB1c2VfcGtnX2NvbmZpZyAidnB4ID49IDAuOS4xIiAidnB4L3ZweF9kZWNvZGVyLmggdnB4L3ZwOGR4LmgiIHZweF9jb2RlY192cDhfZHggfHwKLSAgICAgICAgICAgIGNoZWNrX2xpYjIgInZweC92cHhfZGVjb2Rlci5oIHZweC92cDhkeC5oIiB2cHhfY29kZWNfZGVjX2luaXRfdmVyIC1sdnB4IHx8Ci0gICAgICAgICAgICAgICAgZGllICJFUlJPUjogbGlidnB4IGRlY29kZXIgdmVyc2lvbiBtdXN0IGJlID49MC45LjEiOworICAgICAgICBjaGVja19wa2dfY29uZmlnIGxpYnZweF92cDhfZGVjb2RlciAidnB4ID49IDEuNC4wIiAidnB4L3ZweF9kZWNvZGVyLmggdnB4L3ZwOGR4LmgiIHZweF9jb2RlY192cDhfZHggfHwKKyAgICAgICAgICAgIGNoZWNrX2xpYiBsaWJ2cHhfdnA4X2RlY29kZXIgInZweC92cHhfZGVjb2Rlci5oIHZweC92cDhkeC5oIiAidnB4X2NvZGVjX3ZwOF9keCBWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEgiICItbHZweCAkbGlibV9leHRyYWxpYnMgJHB0aHJlYWRzX2V4dHJhbGlicyIgfHwKKyAgICAgICAgICAgICAgICBkaWUgIkVSUk9SOiBsaWJ2cHggZGVjb2RlciB2ZXJzaW9uIG11c3QgYmUgPj0xLjQuMCI7CiAgICAgfQogICAgIGVuYWJsZWQgbGlidnB4X3ZwOF9lbmNvZGVyICYmIHsKLSAgICAgICAgdXNlX3BrZ19jb25maWcgInZweCA+PSAwLjkuNyIgInZweC92cHhfZW5jb2Rlci5oIHZweC92cDhjeC5oIiB2cHhfY29kZWNfdnA4X2N4IHx8Ci0gICAgICAgICAgICBjaGVja19saWIyICJ2cHgvdnB4X2VuY29kZXIuaCB2cHgvdnA4Y3guaCIgInZweF9jb2RlY19lbmNfaW5pdF92ZXIgVlA4RV9TRVRfTUFYX0lOVFJBX0JJVFJBVEVfUENUIiAtbHZweCB8fAotICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IGxpYnZweCBlbmNvZGVyIHZlcnNpb24gbXVzdCBiZSA+PTAuOS43IjsKKyAgICAgICAgY2hlY2tfcGtnX2NvbmZpZyBsaWJ2cHhfdnA4X2VuY29kZXIgInZweCA+PSAxLjQuMCIgInZweC92cHhfZW5jb2Rlci5oIHZweC92cDhjeC5oIiB2cHhfY29kZWNfdnA4X2N4IHx8CisgICAgICAgICAgICBjaGVja19saWIgbGlidnB4X3ZwOF9lbmNvZGVyICJ2cHgvdnB4X2VuY29kZXIuaCB2cHgvdnA4Y3guaCIgInZweF9jb2RlY192cDhfY3ggVlBYX0lNR19GTVRfSElHSEJJVERFUFRIIiAiLWx2cHggJGxpYm1fZXh0cmFsaWJzICRwdGhyZWFkc19leHRyYWxpYnMiIHx8CisgICAgICAgICAgICAgICAgZGllICJFUlJPUjogbGlidnB4IGVuY29kZXIgdmVyc2lvbiBtdXN0IGJlID49MS40LjAiOwogICAgIH0KICAgICBlbmFibGVkIGxpYnZweF92cDlfZGVjb2RlciAmJiB7Ci0gICAgICAgIHVzZV9wa2dfY29uZmlnICJ2cHggPj0gMS4zLjAiICJ2cHgvdnB4X2RlY29kZXIuaCB2cHgvdnA4ZHguaCIgdnB4X2NvZGVjX3ZwOV9keCB8fAotICAgICAgICAgICAgY2hlY2tfbGliMiAidnB4L3ZweF9kZWNvZGVyLmggdnB4L3ZwOGR4LmgiICJ2cHhfY29kZWNfdnA5X2R4IiAtbHZweCB8fAotICAgICAgICAgICAgICAgIGRpc2FibGUgbGlidnB4X3ZwOV9kZWNvZGVyOworICAgICAgICBjaGVja19wa2dfY29uZmlnIGxpYnZweF92cDlfZGVjb2RlciAidnB4ID49IDEuNC4wIiAidnB4L3ZweF9kZWNvZGVyLmggdnB4L3ZwOGR4LmgiIHZweF9jb2RlY192cDlfZHggfHwKKyAgICAgICAgICAgIGNoZWNrX2xpYiBsaWJ2cHhfdnA5X2RlY29kZXIgInZweC92cHhfZGVjb2Rlci5oIHZweC92cDhkeC5oIiAidnB4X2NvZGVjX3ZwOV9keCBWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEgiICItbHZweCAkbGlibV9leHRyYWxpYnMgJHB0aHJlYWRzX2V4dHJhbGlicyIKICAgICB9CiAgICAgZW5hYmxlZCBsaWJ2cHhfdnA5X2VuY29kZXIgJiYgewotICAgICAgICB1c2VfcGtnX2NvbmZpZyAidnB4ID49IDEuMy4wIiAidnB4L3ZweF9lbmNvZGVyLmggdnB4L3ZwOGN4LmgiIHZweF9jb2RlY192cDlfY3ggfHwKLSAgICAgICAgICAgIGNoZWNrX2xpYjIgInZweC92cHhfZW5jb2Rlci5oIHZweC92cDhjeC5oIiAidnB4X2NvZGVjX3ZwOV9jeCBWUDlFX1NFVF9BUV9NT0RFIiAtbHZweCB8fAotICAgICAgICAgICAgICAgIGRpc2FibGUgbGlidnB4X3ZwOV9lbmNvZGVyOworICAgICAgICBjaGVja19wa2dfY29uZmlnIGxpYnZweF92cDlfZW5jb2RlciAidnB4ID49IDEuNC4wIiAidnB4L3ZweF9lbmNvZGVyLmggdnB4L3ZwOGN4LmgiIHZweF9jb2RlY192cDlfY3ggfHwKKyAgICAgICAgICAgIGNoZWNrX2xpYiBsaWJ2cHhfdnA5X2VuY29kZXIgInZweC92cHhfZW5jb2Rlci5oIHZweC92cDhjeC5oIiAidnB4X2NvZGVjX3ZwOV9jeCBWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEgiICItbHZweCAkbGlibV9leHRyYWxpYnMgJHB0aHJlYWRzX2V4dHJhbGlicyIKICAgICB9CiAgICAgaWYgZGlzYWJsZWRfYWxsIGxpYnZweF92cDhfZGVjb2RlciBsaWJ2cHhfdnA5X2RlY29kZXIgbGlidnB4X3ZwOF9lbmNvZGVyIGxpYnZweF92cDlfZW5jb2RlcjsgdGhlbgogICAgICAgICBkaWUgImxpYnZweCBlbmFibGVkIGJ1dCBubyBzdXBwb3J0ZWQgZGVjb2RlcnMgZm91bmQiCkBAIC01NTQ3LDExOSArNjA5NiwxMTUgQEAKIAogZW5hYmxlZCBsaWJ3YXZwYWNrICAgICAgICAmJiByZXF1aXJlIGxpYndhdnBhY2sgd2F2cGFjay93YXZwYWNrLmggV2F2cGFja09wZW5GaWxlT3V0cHV0ICAtbHdhdnBhY2sKIGVuYWJsZWQgbGlid2VicCAgICAgICAgICAgJiYgewotICAgIGVuYWJsZWQgbGlid2VicF9lbmNvZGVyICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnICJsaWJ3ZWJwID49IDAuMi4wIiB3ZWJwL2VuY29kZS5oIFdlYlBHZXRFbmNvZGVyVmVyc2lvbgotICAgIGVuYWJsZWQgbGlid2VicF9hbmltX2VuY29kZXIgJiYgeyB1c2VfcGtnX2NvbmZpZyAibGlid2VicG11eCA+PSAwLjQuMCIgd2VicC9tdXguaCBXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdCB8fCBkaXNhYmxlIGxpYndlYnBfYW5pbV9lbmNvZGVyOyB9IH0KLWVuYWJsZWQgbGlieDI2NCAgICAgICAgICAgJiYgeyB1c2VfcGtnX2NvbmZpZyB4MjY0ICJzdGRpbnQuaCB4MjY0LmgiIHgyNjRfZW5jb2Rlcl9lbmNvZGUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVpcmUgbGlieDI2NCB4MjY0LmggeDI2NF9lbmNvZGVyX2VuY29kZSAtbHgyNjQgJiYKKyAgICBlbmFibGVkIGxpYndlYnBfZW5jb2RlciAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJ3ZWJwICJsaWJ3ZWJwID49IDAuMi4wIiB3ZWJwL2VuY29kZS5oIFdlYlBHZXRFbmNvZGVyVmVyc2lvbgorICAgIGVuYWJsZWQgbGlid2VicF9hbmltX2VuY29kZXIgJiYgY2hlY2tfcGtnX2NvbmZpZyBsaWJ3ZWJwX2FuaW1fZW5jb2RlciAibGlid2VicG11eCA+PSAwLjQuMCIgd2VicC9tdXguaCBXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdDsgfQorZW5hYmxlZCBsaWJ4MjY0ICAgICAgICAgICAmJiB7IGNoZWNrX3BrZ19jb25maWcgbGlieDI2NCB4MjY0ICJzdGRpbnQuaCB4MjY0LmgiIHgyNjRfZW5jb2Rlcl9lbmNvZGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVpcmUgbGlieDI2NCAic3RkaW50LmggeDI2NC5oIiB4MjY0X2VuY29kZXJfZW5jb2RlICItbHgyNjQgJHB0aHJlYWRzX2V4dHJhbGlicyAkbGlibV9leHRyYWxpYnMiICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuICJ1c2luZyBsaWJ4MjY0IHdpdGhvdXQgcGtnLWNvbmZpZyI7IH0gfSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNoZWNrX2NwcF9jb25kaXRpb24geDI2NC5oICJYMjY0X0JVSUxEID49IDExOCIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVSUk9SOiBsaWJ4MjY0IG11c3QgYmUgaW5zdGFsbGVkIGFuZCB2ZXJzaW9uIG11c3QgYmUgPj0gMC4xMTguIjsgfSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNoZWNrX2NwcF9jb25kaXRpb24geDI2NC5oICJYMjY0X01QRUcyIiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSBsaWJ4MjYyOyB9Ci1lbmFibGVkIGxpYngyNjUgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyB4MjY1IHgyNjUuaCB4MjY1X2FwaV9nZXQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBjaGVja19jcHBfY29uZGl0aW9uIHgyNjUuaCAiWDI2NV9CVUlMRCA+PSA2OCIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVSUk9SOiBsaWJ4MjY1IHZlcnNpb24gbXVzdCBiZSA+PSA2OC4iOyB9Ci1lbmFibGVkIGxpYnhhdnMgICAgICAgICAgICYmIHJlcXVpcmUgbGlieGF2cyB4YXZzLmggeGF2c19lbmNvZGVyX2VuY29kZSAtbHhhdnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZV9jcHBfY29uZGl0aW9uIHgyNjQuaCAiWDI2NF9CVUlMRCA+PSAxMTgiICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2NwcF9jb25kaXRpb24gbGlieDI2MiB4MjY0LmggIlgyNjRfTVBFRzIiCitlbmFibGVkIGxpYngyNjUgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJ4MjY1IHgyNjUgeDI2NS5oIHgyNjVfYXBpX2dldCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlX2NwcF9jb25kaXRpb24geDI2NS5oICJYMjY1X0JVSUxEID49IDY4IgorZW5hYmxlZCBsaWJ4YXZzICAgICAgICAgICAmJiByZXF1aXJlIGxpYnhhdnMgInN0ZGludC5oIHhhdnMuaCIgeGF2c19lbmNvZGVyX2VuY29kZSAiLWx4YXZzICRwdGhyZWFkc19leHRyYWxpYnMgJGxpYm1fZXh0cmFsaWJzIgogZW5hYmxlZCBsaWJ4dmlkICAgICAgICAgICAmJiByZXF1aXJlIGxpYnh2aWQgeHZpZC5oIHh2aWRfZ2xvYmFsIC1seHZpZGNvcmUKLWVuYWJsZWQgbGliemltZyAgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIHppbWcgemltZy5oIHppbWdfZ2V0X2FwaV92ZXJzaW9uCi1lbmFibGVkIGxpYnptcSAgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJ6bXEgem1xLmggem1xX2N0eF9uZXcKLWVuYWJsZWQgbGlienZiaSAgICAgICAgICAgJiYgcmVxdWlyZSBsaWJ6dmJpIGxpYnp2YmkuaCB2YmlfZGVjb2Rlcl9uZXcgLWx6dmJpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2hlY2tfY3BwX2NvbmRpdGlvbiBsaWJ6dmJpLmggIlZCSV9WRVJTSU9OX01BSk9SID4gMCB8fCBWQklfVkVSU0lPTl9NSU5PUiA+IDIgfHwgVkJJX1ZFUlNJT05fTUlOT1IgPT0gMiAmJiBWQklfVkVSU0lPTl9NSUNSTyA+PSAyOCIgfHwKK2VuYWJsZWQgbGliemltZyAgICAgICAgICAgJiYgcmVxdWlyZV9wa2dfY29uZmlnIGxpYnppbWcgInppbWcgPj0gMi43LjAiIHppbWcuaCB6aW1nX2dldF9hcGlfdmVyc2lvbgorZW5hYmxlZCBsaWJ6bXEgICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGliem1xIGxpYnptcSB6bXEuaCB6bXFfY3R4X25ldworZW5hYmxlZCBsaWJ6dmJpICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbGlienZiaSB6dmJpLTAuMiBsaWJ6dmJpLmggdmJpX2RlY29kZXJfbmV3ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGVzdF9jcHBfY29uZGl0aW9uIGxpYnp2YmkuaCAiVkJJX1ZFUlNJT05fTUFKT1IgPiAwIHx8IFZCSV9WRVJTSU9OX01JTk9SID4gMiB8fCBWQklfVkVSU0lPTl9NSU5PUiA9PSAyICYmIFZCSV9WRVJTSU9OX01JQ1JPID49IDI4IiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgZ3BsIHx8IGRpZSAiRVJST1I6IGxpYnp2YmkgcmVxdWlyZXMgdmVyc2lvbiAwLjIuMjggb3IgLS1lbmFibGUtZ3BsLiI7IH0KLWVuYWJsZWQgbW1hbCAgICAgICAgICAgICAgJiYgeyBjaGVja19saWIgaW50ZXJmYWNlL21tYWwvbW1hbC5oIG1tYWxfcG9ydF9jb25uZWN0IC1sbW1hbF9jb3JlIC1sbW1hbF91dGlsIC1sbW1hbF92Y19jbGllbnQgLWxiY21faG9zdCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICEgZW5hYmxlZCBjcm9zc19jb21waWxlICYmIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9jZmxhZ3MgLWlzeXN0ZW0vb3B0L3ZjL2luY2x1ZGUvIC1pc3lzdGVtL29wdC92Yy9pbmNsdWRlL2ludGVyZmFjZS92bWNzX2hvc3QvbGludXggLWlzeXN0ZW0vb3B0L3ZjL2luY2x1ZGUvaW50ZXJmYWNlL3Zjb3MvcHRocmVhZHMgLWZnbnU4OS1pbmxpbmUgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2V4dHJhbGlicyAtTC9vcHQvdmMvbGliLyAtbG1tYWxfY29yZSAtbG1tYWxfdXRpbCAtbG1tYWxfdmNfY2xpZW50IC1sYmNtX2hvc3QgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIGludGVyZmFjZS9tbWFsL21tYWwuaCBtbWFsX3BvcnRfY29ubmVjdCA7IH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIGludGVyZmFjZS9tbWFsL21tYWwuaCBtbWFsX3BvcnRfY29ubmVjdCA7IH0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVSUk9SOiBtbWFsIG5vdCBmb3VuZCI7IH0KLWVuYWJsZWQgbW1hbCAmJgotICAgIChjaGVja19jb2RlIGNjIGludGVyZmFjZS9tbWFsL21tYWwuaCAiTU1BTF9QQVJBTUVURVJfVklERU9fTUFYX05VTV9DQUxMQkFDS1MiIHx8Ci0gICAgIGRpZSAiRVJST1I6IG1tYWwgZmlybXdhcmUgaGVhZGVycyB0b28gb2xkIikKLQotZW5hYmxlZCBuZXRjZGYgICAgICAgICAgICAmJiByZXF1aXJlX3BrZ19jb25maWcgbmV0Y2RmIG5ldGNkZi5oIG5jX2lucV9saWJ2ZXJzCi1lbmFibGVkIG52ZW5jICAgICAgICAgICAgICYmIHsgY2hlY2tfaGVhZGVyIG52RW5jb2RlQVBJLmggfHwgZGllICJFUlJPUjogbnZFbmNvZGVBUEkuaCBub3QgZm91bmQuIjsgfSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGNoZWNrX2NwcF9jb25kaXRpb24gbnZFbmNvZGVBUEkuaCAiTlZFTkNBUElfTUFKT1JfVkVSU0lPTiA+PSA1IiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IE5WRU5DIEFQSSB2ZXJzaW9uIDQgb3Igb2xkZXIgaXMgbm90IHN1cHBvcnRlZCI7IH0gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBbICR0YXJnZXRfb3MgIT0gY3lnd2luIF0gfHwgZGllICJFUlJPUjogTlZFTkMgaXMgbm90IHN1cHBvcnRlZCBvbiBDeWd3aW4gY3VycmVudGx5LiI7IH0KLWVuYWJsZWQgb3BlbmFsICAgICAgICAgICAgJiYgeyB7IGZvciBhbF9saWJzIGluICIke09QRU5BTF9MSUJTfSIgIi1sb3BlbmFsIiAiLWxPcGVuQUwzMiI7IGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliICdBTC9hbC5oJyBhbEdldEVycm9yICIke2FsX2xpYnN9IiAmJiBicmVhazsgZG9uZSB9IHx8CitlbmFibGVkIGxpYnhtbDIgICAgICAgICAgICYmIHJlcXVpcmVfcGtnX2NvbmZpZyBsaWJ4bWwyIGxpYnhtbC0yLjAgbGlieG1sMi9saWJ4bWwveG1sdmVyc2lvbi5oIHhtbENoZWNrVmVyc2lvbgorZW5hYmxlZCBtZWRpYWNvZGVjICAgICAgICAmJiB7IGVuYWJsZWQgam5pIHx8IGRpZSAiRVJST1I6IG1lZGlhY29kZWMgcmVxdWlyZXMgLS1lbmFibGUtam5pIjsgfQorZW5hYmxlZCBtbWFsICAgICAgICAgICAgICAmJiB7IGNoZWNrX2xpYiBtbWFsIGludGVyZmFjZS9tbWFsL21tYWwuaCBtbWFsX3BvcnRfY29ubmVjdCAtbG1tYWxfY29yZSAtbG1tYWxfdXRpbCAtbG1tYWxfdmNfY2xpZW50IC1sYmNtX2hvc3QgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICEgZW5hYmxlZCBjcm9zc19jb21waWxlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfY2ZsYWdzIC1pc3lzdGVtL29wdC92Yy9pbmNsdWRlLyAtaXN5c3RlbS9vcHQvdmMvaW5jbHVkZS9pbnRlcmZhY2Uvdm1jc19ob3N0L2xpbnV4IC1pc3lzdGVtL29wdC92Yy9pbmNsdWRlL2ludGVyZmFjZS92Y29zL3B0aHJlYWRzIC1mZ251ODktaW5saW5lICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfbGRmbGFncyAtTC9vcHQvdmMvbGliLyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG1tYWwgaW50ZXJmYWNlL21tYWwvbW1hbC5oIG1tYWxfcG9ydF9jb25uZWN0IC1sbW1hbF9jb3JlIC1sbW1hbF91dGlsIC1sbW1hbF92Y19jbGllbnQgLWxiY21faG9zdDsgfSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IG1tYWwgbm90IGZvdW5kIiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2Z1bmNfaGVhZGVycyBpbnRlcmZhY2UvbW1hbC9tbWFsLmggIk1NQUxfUEFSQU1FVEVSX1ZJREVPX01BWF9OVU1fQ0FMTEJBQ0tTIjsgfQorZW5hYmxlZCBvcGVuYWwgICAgICAgICAgICAmJiB7IHsgZm9yIGFsX2V4dHJhbGlicyBpbiAiJHtPUEVOQUxfTElCU30iICItbG9wZW5hbCIgIi1sT3BlbkFMMzIiOyBkbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2xpYiBvcGVuYWwgJ0FML2FsLmgnIGFsR2V0RXJyb3IgIiR7YWxfZXh0cmFsaWJzfSIgJiYgYnJlYWs7IGRvbmUgfSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IG9wZW5hbCBub3QgZm91bmQiOyB9ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2hlY2tfY3BwX2NvbmRpdGlvbiAiQUwvYWwuaCIgImRlZmluZWQoQUxfVkVSU0lPTl8xXzEpIiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHRlc3RfY3BwX2NvbmRpdGlvbiAiQUwvYWwuaCIgImRlZmluZWQoQUxfVkVSU0lPTl8xXzEpIiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IG9wZW5hbCBtdXN0IGJlIGluc3RhbGxlZCBhbmQgdmVyc2lvbiBtdXN0IGJlIDEuMSBvciBjb21wYXRpYmxlIjsgfQotZW5hYmxlZCBvcGVuY2wgICAgICAgICAgICAmJiB7IGNoZWNrX2xpYjIgT3BlbkNML2NsLmggY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCAtV2wsLWZyYW1ld29yayxPcGVuQ0wgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19saWIyIENML2NsLmggY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCAtbE9wZW5DTCB8fAorZW5hYmxlZCBvcGVuY2wgICAgICAgICAgICAmJiB7IGNoZWNrX2xpYiBvcGVuY2wgT3BlbkNML2NsLmggY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCAtV2wsLWZyYW1ld29yayxPcGVuQ0wgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19saWIgb3BlbmNsIENML2NsLmggY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCAtbE9wZW5DTCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IG9wZW5jbCBub3QgZm91bmQiOyB9ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgY2hlY2tfY3BwX2NvbmRpdGlvbiAiT3BlbkNML2NsLmgiICJkZWZpbmVkKENMX1ZFUlNJT05fMV8yKSIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19jcHBfY29uZGl0aW9uICJDTC9jbC5oIiAiZGVmaW5lZChDTF9WRVJTSU9OXzFfMikiIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGVzdF9jcHBfY29uZGl0aW9uICJPcGVuQ0wvY2wuaCIgImRlZmluZWQoQ0xfVkVSU0lPTl8xXzIpIiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfY3BwX2NvbmRpdGlvbiAiQ0wvY2wuaCIgImRlZmluZWQoQ0xfVkVSU0lPTl8xXzIpIiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IG9wZW5jbCBtdXN0IGJlIGluc3RhbGxlZCBhbmQgdmVyc2lvbiBtdXN0IGJlIDEuMiBvciBjb21wYXRpYmxlIjsgfQotZW5hYmxlZCBvcGVuZ2wgICAgICAgICAgICAmJiB7IGNoZWNrX2xpYiBHTC9nbHguaCBnbFhHZXRQcm9jQWRkcmVzcyAiLWxHTCIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19saWIyIHdpbmRvd3MuaCB3Z2xHZXRQcm9jQWRkcmVzcyAiLWxvcGVuZ2wzMiAtbGdkaTMyIiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2xpYjIgT3BlbkdML2dsMy5oIGdsR2V0RXJyb3IgIi1XbCwtZnJhbWV3b3JrLE9wZW5HTCIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19saWIyIEVTMi9nbC5oIGdsR2V0RXJyb3IgIi1pc3lzcm9vdD0ke3N5c3Jvb3R9IC1XbCwtZnJhbWV3b3JrLE9wZW5HTEVTIiB8fAorZW5hYmxlZCBvcGVuZ2wgICAgICAgICAgICAmJiB7IGNoZWNrX2xpYiBvcGVuZ2wgR0wvZ2x4LmggZ2xYR2V0UHJvY0FkZHJlc3MgIi1sR0wiIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG9wZW5nbCB3aW5kb3dzLmggd2dsR2V0UHJvY0FkZHJlc3MgIi1sb3BlbmdsMzIgLWxnZGkzMiIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19saWIgb3BlbmdsIE9wZW5HTC9nbDMuaCBnbEdldEVycm9yICItV2wsLWZyYW1ld29yayxPcGVuR0wiIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG9wZW5nbCBFUzIvZ2wuaCBnbEdldEVycm9yICItaXN5c3Jvb3Q9JHtzeXNyb290fSAtV2wsLWZyYW1ld29yayxPcGVuR0xFUyIgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVSUk9SOiBvcGVuZ2wgbm90IGZvdW5kLiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotZW5hYmxlZCBvcGVuc3NsICAgICAgICAgICAmJiB7IHVzZV9wa2dfY29uZmlnIG9wZW5zc2wgb3BlbnNzbC9zc2wuaCBTU0xfbGlicmFyeV9pbml0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG9wZW5zc2wvc3NsLmggU1NMX2xpYnJhcnlfaW5pdCAtbHNzbCAtbGNyeXB0byB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2xpYiBvcGVuc3NsL3NzbC5oIFNTTF9saWJyYXJ5X2luaXQgLWxzc2wzMiAtbGVheTMyIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG9wZW5zc2wvc3NsLmggU1NMX2xpYnJhcnlfaW5pdCAtbHNzbCAtbGNyeXB0byAtbHdzMl8zMiAtbGdkaTMyIHx8CitlbmFibGVkIG9teCAgICAgICAgICAgICAgICYmIHJlcXVpcmVfaGVhZGVyIE9NWF9Db3JlLmgKK2VuYWJsZWQgb214X3JwaSAgICAgICAgICAgJiYgeyBjaGVja19oZWFkZXIgT01YX0NvcmUuaCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgISBlbmFibGVkIGNyb3NzX2NvbXBpbGUgJiYgYWRkX2NmbGFncyAtaXN5c3RlbS9vcHQvdmMvaW5jbHVkZS9JTCAmJiBjaGVja19oZWFkZXIgT01YX0NvcmUuaCA7IH0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUgIkVSUk9SOiBPcGVuTUFYIElMIGhlYWRlcnMgbm90IGZvdW5kIjsgfSAmJiBlbmFibGUgb214CitlbmFibGVkIG9wZW5zc2wgICAgICAgICAgICYmIHsgY2hlY2tfcGtnX2NvbmZpZyBvcGVuc3NsIG9wZW5zc2wgb3BlbnNzbC9zc2wuaCBPUEVOU1NMX2luaXRfc3NsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfcGtnX2NvbmZpZyBvcGVuc3NsIG9wZW5zc2wgb3BlbnNzbC9zc2wuaCBTU0xfbGlicmFyeV9pbml0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG9wZW5zc2wgb3BlbnNzbC9zc2wuaCBTU0xfbGlicmFyeV9pbml0IC1sc3NsIC1sY3J5cHRvIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfbGliIG9wZW5zc2wgb3BlbnNzbC9zc2wuaCBTU0xfbGlicmFyeV9pbml0IC1sc3NsMzIgLWxlYXkzMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2xpYiBvcGVuc3NsIG9wZW5zc2wvc3NsLmggU1NMX2xpYnJhcnlfaW5pdCAtbHNzbCAtbGNyeXB0byAtbHdzMl8zMiAtbGdkaTMyIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGllICJFUlJPUjogb3BlbnNzbCBub3QgZm91bmQiOyB9Ci1lbmFibGVkIHF0a2l0X2luZGV2ICAgICAgJiYgeyBjaGVja19oZWFkZXJfb2JqY2MgUVRLaXQvUVRLaXQuaCB8fCBkaXNhYmxlIHF0a2l0X2luZGV2OyB9Ci0KLSMgbGliZGMxMzk0IGNoZWNrCi1pZiBlbmFibGVkIGxpYmRjMTM5NDsgdGhlbgotICAgIHsgcmVxdWlyZV9wa2dfY29uZmlnIGxpYmRjMTM5NC0yIGRjMTM5NC9kYzEzOTQuaCBkYzEzOTRfbmV3ICYmCi0gICAgICAgIGVuYWJsZSBsaWJkYzEzOTRfMjsgfSB8fAotICAgIHsgY2hlY2tfbGliIGxpYmRjMTM5NC9kYzEzOTRfY29udHJvbC5oIGRjMTM5NF9jcmVhdGVfaGFuZGxlIC1sZGMxMzk0X2NvbnRyb2wgLWxyYXcxMzk0ICYmCi0gICAgICAgIGVuYWJsZSBsaWJkYzEzOTRfMTsgfSB8fAotICAgIGRpZSAiRVJST1I6IE5vIHZlcnNpb24gb2YgbGliZGMxMzk0IGZvdW5kICIKLWZpCitlbmFibGVkIHJrbXBwICAgICAgICAgICAgICYmIHsgcmVxdWlyZV9wa2dfY29uZmlnIHJrbXBwIHJvY2tjaGlwX21wcCAgcm9ja2NoaXAvcmtfbXBpLmggbXBwX2NyZWF0ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVfcGtnX2NvbmZpZyByb2NrY2hpcF9tcHAgInJvY2tjaGlwX21wcCA+PSAxLjMuNyIgcm9ja2NoaXAvcmtfbXBpLmggbXBwX2NyZWF0ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZW5hYmxlZCBsaWJkcm0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZSAiRVJST1I6IHJrbXBwIHJlcXVpcmVzIC0tZW5hYmxlLWxpYmRybSI7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiBpZiBlbmFibGVkIGdjcnlwdDsgdGhlbgogICAgIEdDUllQVF9DT05GSUc9IiR7Y3Jvc3NfcHJlZml4fWxpYmdjcnlwdC1jb25maWciCiAgICAgaWYgIiR7R0NSWVBUX0NPTkZJR30iIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCiAgICAgICAgIGdjcnlwdF9jZmxhZ3M9JCgiJHtHQ1JZUFRfQ09ORklHfSIgLS1jZmxhZ3MpCi0gICAgICAgIGdjcnlwdF9saWJzPSQoIiR7R0NSWVBUX0NPTkZJR30iIC0tbGlicykKLSAgICAgICAgY2hlY2tfZnVuY19oZWFkZXJzIGdjcnlwdC5oIGdjcnlfbXBpX25ldyAkZ2NyeXB0X2NmbGFncyAkZ2NyeXB0X2xpYnMgfHwKKyAgICAgICAgZ2NyeXB0X2V4dHJhbGlicz0kKCIke0dDUllQVF9DT05GSUd9IiAtLWxpYnMpCisgICAgICAgIGNoZWNrX2Z1bmNfaGVhZGVycyBnY3J5cHQuaCBnY3J5X21waV9uZXcgJGdjcnlwdF9jZmxhZ3MgJGdjcnlwdF9leHRyYWxpYnMgfHwKICAgICAgICAgICAgIGRpZSAiRVJST1I6IGdjcnlwdCBub3QgZm91bmQiCi0gICAgICAgIGFkZF9jZmxhZ3MgJGdjcnlwdF9jZmxhZ3MgJiYgYWRkX2V4dHJhbGlicyAkZ2NyeXB0X2xpYnMKKyAgICAgICAgYWRkX2NmbGFncyAkZ2NyeXB0X2NmbGFncwogICAgIGVsc2UKLSAgICAgICAgcmVxdWlyZTIgZ2NyeXB0IGdjcnlwdC5oIGdjcnlfbXBpX25ldyAtbGdjcnlwdAorICAgICAgICByZXF1aXJlIGdjcnlwdCBnY3J5cHQuaCBnY3J5X21waV9uZXcgLWxnY3J5cHQKICAgICBmaQogZmkKIAotaWYgISBkaXNhYmxlZCBzZGw7IHRoZW4KLSAgICBTRExfQ09ORklHPSIke2Nyb3NzX3ByZWZpeH1zZGwtY29uZmlnIgotICAgIGlmIGNoZWNrX3BrZ19jb25maWcgc2RsIFNETF9ldmVudHMuaCBTRExfUG9sbEV2ZW50OyB0aGVuCi0gICAgICAgIGNoZWNrX2NwcF9jb25kaXRpb24gU0RMLmggIihTRExfTUFKT1JfVkVSU0lPTjw8MTYgfCBTRExfTUlOT1JfVkVSU0lPTjw8OCB8IFNETF9QQVRDSExFVkVMKSA+PSAweDAxMDIwMSIgJHNkbF9jZmxhZ3MgJiYKLSAgICAgICAgY2hlY2tfY3BwX2NvbmRpdGlvbiBTREwuaCAiKFNETF9NQUpPUl9WRVJTSU9OPDwxNiB8IFNETF9NSU5PUl9WRVJTSU9OPDw4IHwgU0RMX1BBVENITEVWRUwpIDwgMHgwMTAzMDAiICRzZGxfY2ZsYWdzICYmCi0gICAgICAgIGVuYWJsZSBzZGwKLSAgICBlbHNlCi0gICAgICAgIGlmICIke1NETF9DT05GSUd9IiAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMTsgdGhlbgotICAgICAgICAgICAgc2RsX2NmbGFncz0kKCIke1NETF9DT05GSUd9IiAtLWNmbGFncykKLSAgICAgICAgICAgIHNkbF9saWJzPSQoIiR7U0RMX0NPTkZJR30iIC0tbGlicykKLSAgICAgICAgICAgIGNoZWNrX2Z1bmNfaGVhZGVycyBTRExfdmVyc2lvbi5oIFNETF9MaW5rZWRfVmVyc2lvbiAkc2RsX2NmbGFncyAkc2RsX2xpYnMgJiYKLSAgICAgICAgICAgIGNoZWNrX2NwcF9jb25kaXRpb24gU0RMLmggIihTRExfTUFKT1JfVkVSU0lPTjw8MTYgfCBTRExfTUlOT1JfVkVSU0lPTjw8OCB8IFNETF9QQVRDSExFVkVMKSA+PSAweDAxMDIwMSIgJHNkbF9jZmxhZ3MgJiYKLSAgICAgICAgICAgIGNoZWNrX2NwcF9jb25kaXRpb24gU0RMLmggIihTRExfTUFKT1JfVkVSU0lPTjw8MTYgfCBTRExfTUlOT1JfVkVSU0lPTjw8OCB8IFNETF9QQVRDSExFVkVMKSA8IDB4MDEwMzAwIiAkc2RsX2NmbGFncyAmJgotICAgICAgICAgICAgZW5hYmxlIHNkbAotICAgICAgICBlbGlmIGVuYWJsZWQgc2RsIDsgdGhlbgotICAgICAgICAgICAgZGllICJFUlJPUjogU0RMIG5vdCBmb3VuZCIKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZGlzYWJsZSBzZGwKLSAgICAgICAgZmkKK2lmIGVuYWJsZWQgc2RsMjsgdGhlbgorICAgIFNETDJfQ09ORklHPSIke2Nyb3NzX3ByZWZpeH1zZGwyLWNvbmZpZyIKKyAgICB0ZXN0X3BrZ19jb25maWcgc2RsMiAic2RsMiA+PSAyLjAuMSBzZGwyIDwgMi4xLjAiIFNETF9ldmVudHMuaCBTRExfUG9sbEV2ZW50CisgICAgaWYgZGlzYWJsZWQgc2RsMiAmJiAiJHtTREwyX0NPTkZJR30iIC0tdmVyc2lvbiA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuCisgICAgICAgIHNkbDJfY2ZsYWdzPSQoIiR7U0RMMl9DT05GSUd9IiAtLWNmbGFncykKKyAgICAgICAgc2RsMl9leHRyYWxpYnM9JCgiJHtTREwyX0NPTkZJR30iIC0tbGlicykKKyAgICAgICAgdGVzdF9jcHBfY29uZGl0aW9uIFNETC5oICIoU0RMX01BSk9SX1ZFUlNJT048PDE2IHwgU0RMX01JTk9SX1ZFUlNJT048PDggfCBTRExfUEFUQ0hMRVZFTCkgPj0gMHgwMjAwMDEiICRzZGwyX2NmbGFncyAmJgorICAgICAgICB0ZXN0X2NwcF9jb25kaXRpb24gU0RMLmggIihTRExfTUFKT1JfVkVSU0lPTjw8MTYgfCBTRExfTUlOT1JfVkVSU0lPTjw8OCB8IFNETF9QQVRDSExFVkVMKSA8IDB4MDIwMTAwIiAkc2RsMl9jZmxhZ3MgJiYKKyAgICAgICAgY2hlY2tfZnVuY19oZWFkZXJzIFNETF9ldmVudHMuaCBTRExfUG9sbEV2ZW50ICRzZGwyX2V4dHJhbGlicyAkc2RsMl9jZmxhZ3MgJiYKKyAgICAgICAgICAgIGVuYWJsZSBzZGwyCiAgICAgZmkKICAgICBpZiB0ZXN0ICR0YXJnZXRfb3MgPSAibWluZ3czMiI7IHRoZW4KLSAgICAgICAgc2RsX2xpYnM9IiRzZGxfbGlicyAtbWNvbnNvbGUiCisgICAgICAgIHNkbDJfZXh0cmFsaWJzPSQoZmlsdGVyX291dCAnLW13aW5kb3dzJyAkc2RsMl9leHRyYWxpYnMpCiAgICAgZmkKIGZpCi1lbmFibGVkIHNkbCAmJiBhZGRfY2ZsYWdzICRzZGxfY2ZsYWdzICYmIGFkZF9leHRyYWxpYnMgJHNkbF9saWJzCiAKLWRpc2FibGVkIHNlY3VyZXRyYW5zcG9ydCB8fCB7IGNoZWNrX2Z1bmMgU2VjSWRlbnRpdHlDcmVhdGUgIi1XbCwtZnJhbWV3b3JrLENvcmVGb3VuZGF0aW9uIC1XbCwtZnJhbWV3b3JrLFNlY3VyaXR5IiAmJgotICAgIGNoZWNrX2xpYjIgIlNlY3VyaXR5L1NlY3VyZVRyYW5zcG9ydC5oIFNlY3VyaXR5L1NlY3VyaXR5LmgiICJTU0xDcmVhdGVDb250ZXh0IFNlY0l0ZW1JbXBvcnQiICItV2wsLWZyYW1ld29yayxDb3JlRm91bmRhdGlvbiAtV2wsLWZyYW1ld29yayxTZWN1cml0eSIgJiYKLSAgICBlbmFibGUgc2VjdXJldHJhbnNwb3J0OyB9CitpZiBlbmFibGVkIGRlY2tsaW5rOyB0aGVuCisgICAgY2FzZSAkdGFyZ2V0X29zIGluCisgICAgICAgIG1pbmd3MzIqfG1pbmd3NjQqfHdpbjMyfHdpbjY0KQorICAgICAgICAgICAgZGVja2xpbmtfb3V0ZGV2X2V4dHJhbGlicz0iJGRlY2tsaW5rX291dGRldl9leHRyYWxpYnMgLWxvbGUzMiAtbG9sZWF1dDMyIgorICAgICAgICAgICAgZGVja2xpbmtfaW5kZXZfZXh0cmFsaWJzPSIkZGVja2xpbmtfaW5kZXZfZXh0cmFsaWJzIC1sb2xlMzIgLWxvbGVhdXQzMiIKKyAgICAgICAgICAgIDs7CisgICAgZXNhYworZmkKIAotZGlzYWJsZWQgc2NoYW5uZWwgfHwgeyBjaGVja19mdW5jX2hlYWRlcnMgIndpbmRvd3MuaCBTZWN1cml0eS5oIiBJbml0aWFsaXplU2VjdXJpdHlDb250ZXh0IC1EU0VDVVJJVFlfV0lOMzIgLWxTZWN1cjMyICYmCi0gICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZSBzY2hhbm5lbCAmJiBhZGRfZXh0cmFsaWJzIC1sU2VjdXIzMjsgfQorZW5hYmxlZCBzZWN1cmV0cmFuc3BvcnQgJiYKKyAgICBjaGVja19mdW5jIFNlY0lkZW50aXR5Q3JlYXRlICItV2wsLWZyYW1ld29yayxDb3JlRm91bmRhdGlvbiAtV2wsLWZyYW1ld29yayxTZWN1cml0eSIgJiYKKyAgICBjaGVja19saWIgc2VjdXJldHJhbnNwb3J0ICJTZWN1cml0eS9TZWN1cmVUcmFuc3BvcnQuaCBTZWN1cml0eS9TZWN1cml0eS5oIiAiU1NMQ3JlYXRlQ29udGV4dCIgIi1XbCwtZnJhbWV3b3JrLENvcmVGb3VuZGF0aW9uIC1XbCwtZnJhbWV3b3JrLFNlY3VyaXR5IiB8fAorICAgICAgICBkaXNhYmxlIHNlY3VyZXRyYW5zcG9ydAorCitlbmFibGVkIHNlY3VyZXRyYW5zcG9ydCAmJgorICAgIGNoZWNrX2Z1bmMgU2VjSXRlbUltcG9ydCAiLVdsLC1mcmFtZXdvcmssQ29yZUZvdW5kYXRpb24gLVdsLC1mcmFtZXdvcmssU2VjdXJpdHkiCisKK2VuYWJsZWQgc2NoYW5uZWwgJiYKKyAgICBjaGVja19mdW5jX2hlYWRlcnMgIndpbmRvd3MuaCBzZWN1cml0eS5oIiBJbml0aWFsaXplU2VjdXJpdHlDb250ZXh0IC1EU0VDVVJJVFlfV0lOMzIgLWxzZWN1cjMyICYmCisgICAgdGVzdF9jcHBfY29uZGl0aW9uIHdpbmVycm9yLmggImRlZmluZWQoU0VDX0lfQ09OVEVYVF9FWFBJUkVEKSIgJiYKKyAgICBzY2hhbm5lbF9leHRyYWxpYnM9Ii1sc2VjdXIzMiIgfHwKKyAgICAgICAgZGlzYWJsZSBzY2hhbm5lbAogCiBtYWtlaW5mbyAtLXZlcnNpb24gPiAvZGV2L251bGwgMj4mMSAmJiBlbmFibGUgbWFrZWluZm8gIHx8IGRpc2FibGUgbWFrZWluZm8KIGVuYWJsZWQgbWFrZWluZm8gXApAQCAtNTY3MCwxMjEgKzYyMTUsMTY4IEBACiBwb2QybWFuIC0taGVscCAgICAgPiAvZGV2L251bGwgMj4mMSAmJiBlbmFibGUgcG9kMm1hbiAgIHx8IGRpc2FibGUgcG9kMm1hbgogcnN5bmMgLS1oZWxwIDI+IC9kZXYvbnVsbCB8IGdyZXAgLXEgJ2NvbnRpbWVvdXQnICYmIGVuYWJsZSByc3luY19jb250aW1lb3V0IHx8IGRpc2FibGUgcnN5bmNfY29udGltZW91dAogCisjIGNoZWNrIFY0TDIgY29kZWNzIGF2YWlsYWJsZSBpbiB0aGUgQVBJCiBjaGVja19oZWFkZXIgbGludXgvZmIuaAotY2hlY2tfaGVhZGVyIGxpbnV4L3ZpZGVvZGV2LmgKIGNoZWNrX2hlYWRlciBsaW51eC92aWRlb2RldjIuaAotY2hlY2tfY29kZSBjYyBsaW51eC92aWRlb2RldjIuaCAic3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gdmZzZTsgdmZzZS5kaXNjcmV0ZS53aWR0aCA9IDA7IiAmJiBlbmFibGVfc2FmZSBzdHJ1Y3RfdjRsMl9mcm1pdmFsZW51bV9kaXNjcmV0ZQordGVzdF9jb2RlIGNjIGxpbnV4L3ZpZGVvZGV2Mi5oICJzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSB2ZnNlOyB2ZnNlLmRpc2NyZXRlLndpZHRoID0gMDsiICYmIGVuYWJsZV9zYW5pdGl6ZWQgc3RydWN0X3Y0bDJfZnJtaXZhbGVudW1fZGlzY3JldGUKK2NoZWNrX2NjIHY0bDJfbTJtIGxpbnV4L3ZpZGVvZGV2Mi5oICJpbnQgaSA9IFY0TDJfQ0FQX1ZJREVPX00yTV9NUExBTkUgfCBWNEwyX0NBUF9WSURFT19NMk0gfCBWNEwyX0JVRl9GTEFHX0xBU1Q7IgorY2hlY2tfY2MgdmMxX3Y0bDJfbTJtIGxpbnV4L3ZpZGVvZGV2Mi5oICJpbnQgaSA9IFY0TDJfUElYX0ZNVF9WQzFfQU5ORVhfRzsiCitjaGVja19jYyBtcGVnMV92NGwyX20ybSBsaW51eC92aWRlb2RldjIuaCAiaW50IGkgPSBWNEwyX1BJWF9GTVRfTVBFRzE7IgorY2hlY2tfY2MgbXBlZzJfdjRsMl9tMm0gbGludXgvdmlkZW9kZXYyLmggImludCBpID0gVjRMMl9QSVhfRk1UX01QRUcyOyIKK2NoZWNrX2NjIG1wZWc0X3Y0bDJfbTJtIGxpbnV4L3ZpZGVvZGV2Mi5oICJpbnQgaSA9IFY0TDJfUElYX0ZNVF9NUEVHNDsiCitjaGVja19jYyBoZXZjX3Y0bDJfbTJtIGxpbnV4L3ZpZGVvZGV2Mi5oICJpbnQgaSA9IFY0TDJfUElYX0ZNVF9IRVZDOyIKK2NoZWNrX2NjIGgyNjNfdjRsMl9tMm0gbGludXgvdmlkZW9kZXYyLmggImludCBpID0gVjRMMl9QSVhfRk1UX0gyNjM7IgorY2hlY2tfY2MgaDI2NF92NGwyX20ybSBsaW51eC92aWRlb2RldjIuaCAiaW50IGkgPSBWNEwyX1BJWF9GTVRfSDI2NDsiCitjaGVja19jYyB2cDhfdjRsMl9tMm0gbGludXgvdmlkZW9kZXYyLmggImludCBpID0gVjRMMl9QSVhfRk1UX1ZQODsiCitjaGVja19jYyB2cDlfdjRsMl9tMm0gbGludXgvdmlkZW9kZXYyLmggImludCBpID0gVjRMMl9QSVhfRk1UX1ZQOTsiCiAKIGNoZWNrX2hlYWRlciBzeXMvdmlkZW9pby5oCi1jaGVja19jb2RlIGNjIHN5cy92aWRlb2lvLmggInN0cnVjdCB2NGwyX2ZybXNpemVlbnVtIHZmc2U7IHZmc2UuZGlzY3JldGUud2lkdGggPSAwOyIgJiYgZW5hYmxlX3NhZmUgc3RydWN0X3Y0bDJfZnJtaXZhbGVudW1fZGlzY3JldGUKK3Rlc3RfY29kZSBjYyBzeXMvdmlkZW9pby5oICJzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSB2ZnNlOyB2ZnNlLmRpc2NyZXRlLndpZHRoID0gMDsiICYmIGVuYWJsZV9zYW5pdGl6ZWQgc3RydWN0X3Y0bDJfZnJtaXZhbGVudW1fZGlzY3JldGUKIAotY2hlY2tfZnVuY19oZWFkZXJzICJ3aW5kb3dzLmggdmZ3LmgiIGNhcENyZWF0ZUNhcHR1cmVXaW5kb3cgIiR2ZndjYXBfaW5kZXZfZXh0cmFsaWJzIgorY2hlY2tfbGliIHVzZXIzMiAid2luZG93cy5oIHdpbnVzZXIuaCIgR2V0U2hlbGxXaW5kb3cgLWx1c2VyMzIKK2NoZWNrX2xpYiB2ZnczMiAid2luZG93cy5oIHZmdy5oIiBjYXBDcmVhdGVDYXB0dXJlV2luZG93IC1sdmZ3MzIKICMgY2hlY2sgdGhhdCBXTV9DQVBfRFJJVkVSX0NPTk5FQ1QgaXMgZGVmaW5lZCB0byB0aGUgcHJvcGVyIHZhbHVlCiAjIHczMmFwaSAzLjEyIGhhZCBpdCBkZWZpbmVkIHdyb25nCi1jaGVja19jcHBfY29uZGl0aW9uIHZmdy5oICJXTV9DQVBfRFJJVkVSX0NPTk5FQ1QgPiBXTV9VU0VSIiAmJiBlbmFibGUgdmZ3Y2FwX2RlZmluZXMKK2NoZWNrX2NwcF9jb25kaXRpb24gdmZ3Y2FwX2RlZmluZXMgdmZ3LmggIldNX0NBUF9EUklWRVJfQ09OTkVDVCA+IFdNX1VTRVIiCiAKIGNoZWNrX3R5cGUgImRzaG93LmgiIElCYXNlRmlsdGVyCiAKICMgY2hlY2sgZm9yIGlvY3RsX21ldGVvci5oLCBpb2N0bF9idDg0OC5oIGFuZCBhbHRlcm5hdGl2ZXMKLXsgY2hlY2tfaGVhZGVyIGRldi9ia3RyL2lvY3RsX21ldGVvci5oICYmCi0gIGNoZWNrX2hlYWRlciBkZXYvYmt0ci9pb2N0bF9idDg0OC5oOyB9IHx8Ci17IGNoZWNrX2hlYWRlciBtYWNoaW5lL2lvY3RsX21ldGVvci5oICYmCi0gIGNoZWNrX2hlYWRlciBtYWNoaW5lL2lvY3RsX2J0ODQ4Lmg7IH0gfHwKLXsgY2hlY2tfaGVhZGVyIGRldi92aWRlby9tZXRlb3IvaW9jdGxfbWV0ZW9yLmggJiYKLSAgY2hlY2tfaGVhZGVyIGRldi92aWRlby9ia3RyL2lvY3RsX2J0ODQ4Lmg7IH0gfHwKLWNoZWNrX2hlYWRlciBkZXYvaWMvYnQ4eHguaAorY2hlY2tfaGVhZGVyICJkZXYvYmt0ci9pb2N0bF9tZXRlb3IuaCBkZXYvYmt0ci9pb2N0bF9idDg0OC5oIiAgICAgICAgICAgICAgICAgICB8fAorICAgIGNoZWNrX2hlYWRlciAibWFjaGluZS9pb2N0bF9tZXRlb3IuaCBtYWNoaW5lL2lvY3RsX2J0ODQ4LmgiICAgICAgICAgICAgICAgICB8fAorICAgIGNoZWNrX2hlYWRlciAiZGV2L3ZpZGVvL21ldGVvci9pb2N0bF9tZXRlb3IuaCBkZXYvdmlkZW8vYmt0ci9pb2N0bF9idDg0OC5oIiB8fAorICAgIGNoZWNrX2hlYWRlciAiZGV2L2ljL2J0OHh4LmgiCiAKLWNoZWNrX2hlYWRlciBzbmRpby5oCiBpZiBjaGVja19zdHJ1Y3Qgc3lzL3NvdW5kY2FyZC5oIGF1ZGlvX2J1Zl9pbmZvIGJ5dGVzOyB0aGVuCi0gICAgZW5hYmxlX3NhZmUgc3lzL3NvdW5kY2FyZC5oCisgICAgZW5hYmxlX3Nhbml0aXplZCBzeXMvc291bmRjYXJkLmgKIGVsc2UKLSAgICBjaGVja19jYyAtRF9fQlNEX1ZJU0lCTEUgLURfX1hTSV9WSVNJQkxFIDw8RU9GICYmIGFkZF9jcHBmbGFncyAtRF9fQlNEX1ZJU0lCTEUgLURfX1hTSV9WSVNJQkxFICYmIGVuYWJsZV9zYWZlIHN5cy9zb3VuZGNhcmQuaAorICAgIHRlc3RfY2MgLURfX0JTRF9WSVNJQkxFIC1EX19YU0lfVklTSUJMRSA8PEVPRiAmJiBhZGRfY3BwZmxhZ3MgLURfX0JTRF9WSVNJQkxFIC1EX19YU0lfVklTSUJMRSAmJiBlbmFibGVfc2FuaXRpemVkIHN5cy9zb3VuZGNhcmQuaAogICAgICNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+CiAgICAgYXVkaW9fYnVmX2luZm8gYWJjOwogRU9GCiBmaQotY2hlY2tfaGVhZGVyIHNvdW5kY2FyZC5oCiAKLWVuYWJsZWRfYW55IGFsc2FfaW5kZXYgYWxzYV9vdXRkZXYgJiYKLSAgICBjaGVja19saWIyIGFsc2EvYXNvdW5kbGliLmggc25kX3BjbV9odGltZXN0YW1wIC1sYXNvdW5kCitlbmFibGVkIGFsc2EgJiYgY2hlY2tfcGtnX2NvbmZpZyBhbHNhIGFsc2EgImFsc2EvYXNvdW5kbGliLmgiIHNuZF9wY21faHRpbWVzdGFtcCB8fAorICAgIGNoZWNrX2xpYiBhbHNhIGFsc2EvYXNvdW5kbGliLmggc25kX3BjbV9odGltZXN0YW1wIC1sYXNvdW5kCiAKLWVuYWJsZWQgamFja19pbmRldiAmJiBjaGVja19saWIyIGphY2svamFjay5oIGphY2tfY2xpZW50X29wZW4gLWxqYWNrICYmIGNoZWNrX2Z1bmMgc2VtX3RpbWVkd2FpdCAmJgotICAgIGNoZWNrX2Z1bmMgamFja19wb3J0X2dldF9sYXRlbmN5X3JhbmdlIC1samFjaworZW5hYmxlZCBsaWJqYWNrICYmCisgICAgcmVxdWlyZV9wa2dfY29uZmlnIGxpYmphY2sgamFjayBqYWNrL2phY2suaCBqYWNrX3BvcnRfZ2V0X2xhdGVuY3lfcmFuZ2UKIAotZW5hYmxlZF9hbnkgc25kaW9faW5kZXYgc25kaW9fb3V0ZGV2ICYmIGNoZWNrX2xpYjIgc25kaW8uaCBzaW9fb3BlbiAtbHNuZGlvCitlbmFibGVkIHNuZGlvICYmIGNoZWNrX2xpYiBzbmRpbyBzbmRpby5oIHNpb19vcGVuIC1sc25kaW8KIAogaWYgZW5hYmxlZCBsaWJjZGlvOyB0aGVuCi0gICAgY2hlY2tfbGliMiAiY2Rpby9jZGRhLmggY2Rpby9wYXJhbm9pYS5oIiBjZGlvX2NkZGFwX29wZW4gLWxjZGlvX3BhcmFub2lhIC1sY2Rpb19jZGRhIC1sY2RpbyB8fAotICAgIGNoZWNrX2xpYjIgImNkaW8vcGFyYW5vaWEvY2RkYS5oIGNkaW8vcGFyYW5vaWEvcGFyYW5vaWEuaCIgY2Rpb19jZGRhcF9vcGVuIC1sY2Rpb19wYXJhbm9pYSAtbGNkaW9fY2RkYSAtbGNkaW8gfHwKKyAgICBjaGVja19wa2dfY29uZmlnIGxpYmNkaW8gbGliY2Rpb19wYXJhbm9pYSAiY2Rpby9jZGRhLmggY2Rpby9wYXJhbm9pYS5oIiBjZGlvX2NkZGFwX29wZW4gfHwKKyAgICBjaGVja19wa2dfY29uZmlnIGxpYmNkaW8gbGliY2Rpb19wYXJhbm9pYSAiY2Rpby9wYXJhbm9pYS9jZGRhLmggY2Rpby9wYXJhbm9pYS9wYXJhbm9pYS5oIiBjZGlvX2NkZGFwX29wZW4gfHwKKyAgICBjaGVja19saWIgbGliY2RpbyAiY2Rpby9jZGRhLmggY2Rpby9wYXJhbm9pYS5oIiBjZGlvX2NkZGFwX29wZW4gLWxjZGlvX3BhcmFub2lhIC1sY2Rpb19jZGRhIC1sY2RpbyB8fAorICAgIGNoZWNrX2xpYiBsaWJjZGlvICJjZGlvL3BhcmFub2lhL2NkZGEuaCBjZGlvL3BhcmFub2lhL3BhcmFub2lhLmgiIGNkaW9fY2RkYXBfb3BlbiAtbGNkaW9fcGFyYW5vaWEgLWxjZGlvX2NkZGEgLWxjZGlvIHx8CiAgICAgZGllICJFUlJPUjogTm8gdXNhYmxlIGxpYmNkaW8vY2RwYXJhbm9pYSBmb3VuZCIKIGZpCiAKLWVuYWJsZWQgeGxpYiAmJgotICAgIGNoZWNrX2xpYiBYMTEvWGxpYi5oIFhPcGVuRGlzcGxheSAtbFgxMSB8fCBkaXNhYmxlIHhsaWIKLQotaWYgISBkaXNhYmxlZCBsaWJ4Y2I7IHRoZW4KLSAgICBjaGVja19wa2dfY29uZmlnICJ4Y2IgPj0gMS40IiB4Y2IveGNiLmggeGNiX2Nvbm5lY3QgfHwgewotICAgICAgICBlbmFibGVkIGxpYnhjYiAmJiBkaWUgIkVSUk9SOiBsaWJ4Y2IgPj0gMS40IG5vdCBmb3VuZCI7Ci0gICAgfSAmJiBkaXNhYmxlIHgxMWdyYWIgJiYgZW5hYmxlIGxpYnhjYgorZW5hYmxlZCBsaWJ4Y2IgJiYgY2hlY2tfcGtnX2NvbmZpZyBsaWJ4Y2IgInhjYiA+PSAxLjQiIHhjYi94Y2IuaCB4Y2JfY29ubmVjdCB8fAorICAgIGRpc2FibGUgbGlieGNiX3NobSBsaWJ4Y2Jfc2hhcGUgbGlieGNiX3hmaXhlcwogCiBpZiBlbmFibGVkIGxpYnhjYjsgdGhlbgotICAgIGRpc2FibGVkIGxpYnhjYl9zaG0gfHwgewotICAgICAgICBjaGVja19wa2dfY29uZmlnIHhjYi1zaG0geGNiL3NobS5oIHhjYl9zaG1fYXR0YWNoIHx8IHsKLSAgICAgICAgICAgIGVuYWJsZWQgbGlieGNiX3NobSAmJiBkaWUgIkVSUk9SOiBsaWJ4Y2Jfc2htIG5vdCBmb3VuZCI7Ci0gICAgICAgIH0gJiYgY2hlY2tfaGVhZGVyIHN5cy9zaG0uaCAmJiBlbmFibGUgbGlieGNiX3NobTsgfQotCi0gICAgZGlzYWJsZWQgbGlieGNiX3hmaXhlcyB8fCB7Ci0gICAgICAgIGNoZWNrX3BrZ19jb25maWcgeGNiLXhmaXhlcyB4Y2IveGZpeGVzLmggeGNiX3hmaXhlc19nZXRfY3Vyc29yX2ltYWdlIHx8IHsKLSAgICAgICAgICAgIGVuYWJsZWQgbGlieGNiX3hmaXhlcyAmJiBkaWUgIkVSUk9SOiBsaWJ4Y2JfeGZpeGVzIG5vdCBmb3VuZCI7Ci0gICAgICAgIH0gJiYgZW5hYmxlIGxpYnhjYl94Zml4ZXM7IH0KLQotICAgIGRpc2FibGVkIGxpYnhjYl9zaGFwZSB8fCB7Ci0gICAgICAgIGNoZWNrX3BrZ19jb25maWcgeGNiLXNoYXBlIHhjYi9zaGFwZS5oIHhjYl9zaGFwZV9nZXRfcmVjdGFuZ2xlcyB8fCB7Ci0gICAgICAgICAgICBlbmFibGVkIGxpYnhjYl9zaGFwZSAmJiBkaWUgIkVSUk9SOiBsaWJ4Y2Jfc2hhcGUgbm90IGZvdW5kIjsKLSAgICAgICAgfSAmJiBlbmFibGUgbGlieGNiX3NoYXBlOyB9Ci0KLSAgICBhZGRfY2ZsYWdzICR4Y2JfY2ZsYWdzICR4Y2Jfc2htX2NmbGFncyAkeGNiX3hmaXhlc19jZmxhZ3MgJHhjYl9zaGFwZV9jZmxhZ3MKLSAgICBhZGRfZXh0cmFsaWJzICR4Y2JfbGlicyAkeGNiX3NobV9saWJzICR4Y2JfeGZpeGVzX2xpYnMgJHhjYl9zaGFwZV9saWJzCi1maQotZmkKLQotaWYgZW5hYmxlZCB4MTFncmFiOyB0aGVuCi0gICAgZW5hYmxlZCB4bGliIHx8IGRpZSAiRVJST1I6IFhsaWIgbm90IGZvdW5kIgotICAgIHJlcXVpcmUgWGV4dCBYMTEvZXh0ZW5zaW9ucy9YU2htLmggWFNobUNyZWF0ZUltYWdlIC1sWGV4dAotICAgIHJlcXVpcmUgWGZpeGVzIFgxMS9leHRlbnNpb25zL1hmaXhlcy5oIFhGaXhlc0dldEN1cnNvckltYWdlIC1sWGZpeGVzCisgICAgZW5hYmxlZCBsaWJ4Y2Jfc2htICAgICYmIGNoZWNrX3BrZ19jb25maWcgbGlieGNiX3NobSAgICB4Y2Itc2htICAgIHhjYi9zaG0uaCAgICB4Y2Jfc2htX2F0dGFjaAorICAgIGVuYWJsZWQgbGlieGNiX3NoYXBlICAmJiBjaGVja19wa2dfY29uZmlnIGxpYnhjYl9zaGFwZSAgeGNiLXNoYXBlICB4Y2Ivc2hhcGUuaCAgeGNiX3NoYXBlX2dldF9yZWN0YW5nbGVzCisgICAgZW5hYmxlZCBsaWJ4Y2JfeGZpeGVzICYmIGNoZWNrX3BrZ19jb25maWcgbGlieGNiX3hmaXhlcyB4Y2IteGZpeGVzIHhjYi94Zml4ZXMuaCB4Y2JfeGZpeGVzX2dldF9jdXJzb3JfaW1hZ2UKIGZpCiAKIGNoZWNrX2Z1bmNfaGVhZGVycyAid2luZG93cy5oIiBDcmVhdGVESUJTZWN0aW9uICIkZ2RpZ3JhYl9pbmRldl9leHRyYWxpYnMiCiAKLWVuYWJsZWQgZHh2YTJhcGlfaCAmJgotICAgIGNoZWNrX2NjIDw8RU9GICYmIGVuYWJsZSBkeHZhMmFwaV9jb2JqCi0jZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDAKLSNkZWZpbmUgQ09CSk1BQ1JPUwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxkM2Q5Lmg+Ci0jaW5jbHVkZSA8ZHh2YTJhcGkuaD4KLWludCBtYWluKHZvaWQpIHsgSURpcmVjdFhWaWRlb0RlY29kZXIgKm8gPSBOVUxMOyBJRGlyZWN0WFZpZGVvRGVjb2Rlcl9SZWxlYXNlKG8pOyByZXR1cm4gMDsgfQorIyBkM2QxMXZhIHJlcXVpcmVzIGxpbmtpbmcgZGlyZWN0bHkgdG8gZHhnaSBhbmQgZDNkMTEgaWYgbm90IGJ1aWxkaW5nIGZvcgorIyB0aGUgZGVza3RvcCBhcGkgcGFydGl0aW9uCit0ZXN0X2NwcCA8PEVPRiAmJiBlbmFibGUgdXdwICYmIGQzZDExdmFfZXh0cmFsaWJzPSItbGR4Z2kgLWxkM2QxMSIKKyNpZmRlZiBXSU5BUElfRkFNSUxZCisjaW5jbHVkZSA8d2luYXBpZmFtaWx5Lmg+CisjaWYgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QKQorI2Vycm9yIGRlc2t0b3AsIG5vdCB1d3AKKyNlbHNlCisvLyBXSU5BUElfRkFNSUxZX0FQUCwgV0lOQVBJX0ZBTUlMWV9QSE9ORV9BUFAgPT4gVVdQCisjZW5kaWYKKyNlbHNlCisjZXJyb3Igbm8gZmFtaWx5IHNldAorI2VuZGlmCiBFT0YKIAogZW5hYmxlZCB2YWFwaSAmJgotICAgIGNoZWNrX2xpYiB2YS92YS5oIHZhSW5pdGlhbGl6ZSAtbHZhIHx8Ci0gICAgZGlzYWJsZSB2YWFwaQorICAgIGNoZWNrX2xpYiB2YWFwaSB2YS92YS5oIHZhSW5pdGlhbGl6ZSAtbHZhCiAKLWVuYWJsZWQgdmFhcGkgJiYgZW5hYmxlZCB4bGliICYmCi0gICAgY2hlY2tfbGliMiAidmEvdmEuaCB2YS92YV94MTEuaCIgdmFHZXREaXNwbGF5IC1sdmEgLWx2YS14MTEgJiYKLSAgICBlbmFibGUgdmFhcGlfeDExCitlbmFibGVkIHZhYXBpICYmCisgICAgY2hlY2tfY2MgdmFhcGkgInZhL3ZhLmgiICJ2YUNyZWF0ZVN1cmZhY2VzKDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApIgorCitpZiBlbmFibGVkIHZhYXBpOyB0aGVuCisgICAgY2hlY2tfbGliIHZhYXBpX2RybSAidmEvdmEuaCB2YS92YV9kcm0uaCIgdmFHZXREaXNwbGF5RFJNIC1sdmEgLWx2YS1kcm0KKyAgICBjaGVja19saWIgdmFhcGlfeDExICJ2YS92YS5oIHZhL3ZhX3gxMS5oIiB2YUdldERpc3BsYXkgLWx2YSAtbHZhLXgxMSAtbFgxMQorZmkKKworZW5hYmxlZCB2YWFwaSAmJgorICAgIGNoZWNrX2NwcF9jb25kaXRpb24gdmFhcGlfMSAidmEvdmEuaCIgIlZBX0NIRUNLX1ZFUlNJT04oMSwgMCwgMCkiCisKK2lmIGVuYWJsZWRfYWxsIG9wZW5jbCBsaWJkcm0gOyB0aGVuCisgICAgY2hlY2tfdHlwZSAiQ0wvY2xfaW50ZWwuaCIgImNsQ3JlYXRlSW1hZ2VGcm9tRmRJTlRFTF9mbiIgJiYKKyAgICAgICAgZW5hYmxlIG9wZW5jbF9kcm1fYmVpZ25ldAorICAgIGNoZWNrX2Z1bmNfaGVhZGVycyAiQ0wvY2xfZXh0LmgiIGNsSW1wb3J0TWVtb3J5QVJNICYmCisgICAgICAgIGVuYWJsZSBvcGVuY2xfZHJtX2FybQorZmkKKworaWYgZW5hYmxlZF9hbGwgb3BlbmNsIHZhYXBpIDsgdGhlbgorICAgIGVuYWJsZWQgb3BlbmNsX2RybV9iZWlnbmV0ICYmIGVuYWJsZSBvcGVuY2xfdmFhcGlfYmVpZ25ldAorICAgIGlmIGVuYWJsZWQgbGlibWZ4IDsgdGhlbgorICAgICAgICBjaGVja190eXBlICJDTC9jbC5oIENML3ZhX2V4dC5oIiAiY2xDcmVhdGVGcm9tVkFfQVBJTWVkaWFTdXJmYWNlSU5URUxfZm4iICYmCisgICAgICAgICAgICBlbmFibGUgb3BlbmNsX3ZhYXBpX2ludGVsX21lZGlhCisgICAgZmkKK2ZpCisKK2lmIGVuYWJsZWRfYWxsIG9wZW5jbCBkeHZhMiA7IHRoZW4KKyAgICBjaGVja190eXBlICJDTC9jbF9keDlfbWVkaWFfc2hhcmluZy5oIiBjbF9keDlfc3VyZmFjZV9pbmZvX2tociAmJgorICAgICAgICBlbmFibGUgb3BlbmNsX2R4dmEyCitmaQorCitpZiBlbmFibGVkX2FsbCBvcGVuY2wgZDNkMTF2YSA7IHRoZW4KKyAgICBjaGVja190eXBlICJDTC9jbF9kM2QxMS5oIiBjbEdldERldmljZUlEc0Zyb21EM0QxMUtIUl9mbiAmJgorICAgICAgICBlbmFibGUgb3BlbmNsX2QzZDExCitmaQogCiBlbmFibGVkIHZkcGF1ICYmCi0gICAgY2hlY2tfY3BwX2NvbmRpdGlvbiB2ZHBhdS92ZHBhdS5oICJkZWZpbmVkIFZEUF9ERUNPREVSX1BST0ZJTEVfTVBFRzRfUEFSVDJfQVNQIiB8fAotICAgIGRpc2FibGUgdmRwYXUKKyAgICBjaGVja19jcHBfY29uZGl0aW9uIHZkcGF1IHZkcGF1L3ZkcGF1LmggImRlZmluZWQgVkRQX0RFQ09ERVJfUFJPRklMRV9NUEVHNF9QQVJUMl9BU1AiCiAKLWVuYWJsZWQgdmRwYXUgJiYgZW5hYmxlZCB4bGliICYmCi0gICAgY2hlY2tfZnVuY19oZWFkZXJzICJ2ZHBhdS92ZHBhdS5oIHZkcGF1L3ZkcGF1X3gxMS5oIiB2ZHBfZGV2aWNlX2NyZWF0ZV94MTEgLWx2ZHBhdSAmJgotICAgIHByZXBlbmQgZmZtcGVnX2xpYnMgJCgkbGRmbGFnc19maWx0ZXIgIi1sdmRwYXUiKSAmJgotICAgIGVuYWJsZSB2ZHBhdV94MTEKK2VuYWJsZWQgdmRwYXUgJiYKKyAgICBjaGVja19saWIgdmRwYXVfeDExICJ2ZHBhdS92ZHBhdS5oIHZkcGF1L3ZkcGF1X3gxMS5oIiB2ZHBfZGV2aWNlX2NyZWF0ZV94MTEgLWx2ZHBhdSAtbFgxMQorCitlbmFibGVkIGNyeXN0YWxoZCAmJiBjaGVja19saWIgY3J5c3RhbGhkICJzdGRpbnQuaCBsaWJjcnlzdGFsaGQvbGliY3J5c3RhbGhkX2lmLmgiIER0c0NyeXN0YWxIRFZlcnNpb24gLWxjcnlzdGFsaGQKKworaWYgZW5hYmxlZCB4ODY7IHRoZW4KKyAgICBjYXNlICR0YXJnZXRfb3MgaW4KKyAgICAgICAgbWluZ3czMip8bWluZ3c2NCp8d2luMzJ8d2luNjR8bGludXh8Y3lnd2luKikKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBkaXNhYmxlIGZmbnZjb2RlYyBjdXZpZCBudmRlYyBudmVuYworICAgICAgICAgICAgOzsKKyAgICBlc2FjCitlbHNlCisgICAgZGlzYWJsZSBmZm52Y29kZWMgY3V2aWQgbnZkZWMgbnZlbmMKK2ZpCisKK2VuYWJsZWQgZmZudmNvZGVjICYmIGVuYWJsZSBjdWRhCisKK2VuYWJsZWQgbnZlbmMgJiYKKyAgICB0ZXN0X2NjIC1JJHNvdXJjZV9wYXRoIDw8RU9GIHx8IGRpc2FibGUgbnZlbmMKKyNpbmNsdWRlIDxmZm52Y29kZWMvbnZFbmNvZGVBUEkuaD4KK05WX0VOQ09ERV9BUElfRlVOQ1RJT05fTElTVCBmbGlzdDsKK3ZvaWQgZih2b2lkKSB7IHN0cnVjdCB7IGNvbnN0IEdVSUQgZ3VpZDsgfSBzW10gPSB7IHsgTlZfRU5DX1BSRVNFVF9IUV9HVUlEIH0gfTsgfQoraW50IG1haW4odm9pZCkgeyByZXR1cm4gMDsgfQorRU9GCisKK2VuYWJsZWQgYW1mICYmCisgICAgY2hlY2tfY3BwX2NvbmRpdGlvbiBhbWYgIkFNRi9jb3JlL1ZlcnNpb24uaCIgXAorICAgICAgICAiKEFNRl9WRVJTSU9OX01BSk9SIDw8IDQ4IHwgQU1GX1ZFUlNJT05fTUlOT1IgPDwgMzIgfCBBTUZfVkVSU0lPTl9SRUxFQVNFIDw8IDE2IHwgQU1GX1ZFUlNJT05fQlVJTERfTlVNKSA+PSAweDAwMDEwMDA0MDAwNDAwMDEiCiAKICMgRnVubnkgaWNvbnYgaW5zdGFsbGF0aW9ucyBhcmUgbm90IHVudXN1YWwsIHNvIGNoZWNrIGl0IGFmdGVyIGFsbCBmbGFncyBoYXZlIGJlZW4gc2V0Ci1kaXNhYmxlZCBpY29udiB8fCBjaGVja19mdW5jX2hlYWRlcnMgaWNvbnYuaCBpY29udiB8fCBjaGVja19saWIyIGljb252LmggaWNvbnYgLWxpY29udiB8fCBkaXNhYmxlIGljb252CitpZiBlbmFibGVkIGxpYmNfaWNvbnY7IHRoZW4KKyAgICBjaGVja19mdW5jX2hlYWRlcnMgaWNvbnYuaCBpY29udgorZWxpZiBlbmFibGVkIGljb252OyB0aGVuCisgICAgY2hlY2tfZnVuY19oZWFkZXJzIGljb252LmggaWNvbnYgfHwgY2hlY2tfbGliIGljb252IGljb252LmggaWNvbnYgLWxpY29udgorZmkKIAogZW5hYmxlZCBkZWJ1ZyAmJiBhZGRfY2ZsYWdzIC1nIiRkZWJ1Z2xldmVsIiAmJiBhZGRfYXNmbGFncyAtZyIkZGVidWdsZXZlbCIKIApAQCAtNTgwMSwzMCArNjM5Myw1MCBAQAogY2hlY2tfY2ZsYWdzIC1Xbm8tcG9pbnRlci10by1pbnQtY2FzdAogY2hlY2tfY2ZsYWdzIC1Xc3RyaWN0LXByb3RvdHlwZXMKIGNoZWNrX2NmbGFncyAtV2VtcHR5LWJvZHkKLWVuYWJsZWQgZXh0cmFfd2FybmluZ3MgJiYgY2hlY2tfY2ZsYWdzIC1XaW5saW5lCi1lbmFibGVkIGV4dHJhX3dhcm5pbmdzICYmIGNoZWNrX2NmbGFncyAtV2Nhc3QtcXVhbAorCitpZiBlbmFibGVkIGV4dHJhX3dhcm5pbmdzOyB0aGVuCisgICAgY2hlY2tfY2ZsYWdzIC1XY2FzdC1xdWFsCisgICAgY2hlY2tfY2ZsYWdzIC1XZXh0cmEKKyAgICBjaGVja19jZmxhZ3MgLVdwZWRhbnRpYworZmkKIAogY2hlY2tfZGlzYWJsZV93YXJuaW5nKCl7CiAgICAgd2FybmluZ19mbGFnPS1XJHsxIy1Xbm8tfQotICAgIHRlc3RfY2ZsYWdzICR3YXJuaW5nX2ZsYWcgJiYgYWRkX2NmbGFncyAkMQorICAgIHRlc3RfY2ZsYWdzICR1bmtub3duX3dhcm5pbmdfZmxhZ3MgJHdhcm5pbmdfZmxhZyAmJiBhZGRfY2ZsYWdzICQxCiB9CiAKK3Rlc3RfY2ZsYWdzIC1XZXJyb3I9dW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCAmJgorICAgIGFwcGVuZCB1bmtub3duX3dhcm5pbmdfZmxhZ3MgIi1XZXJyb3I9dW51c2VkLWNvbW1hbmQtbGluZS1hcmd1bWVudCIKK3Rlc3RfY2ZsYWdzIC1XZXJyb3I9dW5rbm93bi13YXJuaW5nLW9wdGlvbiAmJgorICAgIGFwcGVuZCB1bmtub3duX3dhcm5pbmdfZmxhZ3MgIi1XZXJyb3I9dW5rbm93bi13YXJuaW5nLW9wdGlvbiIKKwogY2hlY2tfZGlzYWJsZV93YXJuaW5nIC1Xbm8tcGFyZW50aGVzZXMKIGNoZWNrX2Rpc2FibGVfd2FybmluZyAtV25vLXN3aXRjaAogY2hlY2tfZGlzYWJsZV93YXJuaW5nIC1Xbm8tZm9ybWF0LXplcm8tbGVuZ3RoCiBjaGVja19kaXNhYmxlX3dhcm5pbmcgLVduby1wb2ludGVyLXNpZ24KIGNoZWNrX2Rpc2FibGVfd2FybmluZyAtV25vLXVudXNlZC1jb25zdC12YXJpYWJsZQorY2hlY2tfZGlzYWJsZV93YXJuaW5nIC1Xbm8tYm9vbC1vcGVyYXRpb24KKworY2hlY2tfZGlzYWJsZV93YXJuaW5nX2hlYWRlcnMoKXsKKyAgICB3YXJuaW5nX2ZsYWc9LVckezEjLVduby19CisgICAgdGVzdF9jZmxhZ3MgJHdhcm5pbmdfZmxhZyAmJiBhZGRfY2ZsYWdzX2hlYWRlcnMgJDEKK30KKworY2hlY2tfZGlzYWJsZV93YXJuaW5nX2hlYWRlcnMgLVduby1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucworY2hlY2tfZGlzYWJsZV93YXJuaW5nX2hlYWRlcnMgLVduby11bnVzZWQtdmFyaWFibGUKKwordGVzdF9jYyA8PEVPRiAmJiBlbmFibGUgYmxvY2tzX2V4dGVuc2lvbgordm9pZCAoXmJsb2NrKSh2b2lkKTsKK0VPRgogCiAjIGFkZCBzb21lIGxpbmtlciBmbGFncwogY2hlY2tfbGRmbGFncyAtV2wsLS13YXJuLWNvbW1vbgogY2hlY2tfbGRmbGFncyAtV2wsLXJwYXRoLWxpbms9bGlicG9zdHByb2M6bGlic3dyZXNhbXBsZTpsaWJzd3NjYWxlOmxpYmF2ZmlsdGVyOmxpYmF2ZGV2aWNlOmxpYmF2Zm9ybWF0OmxpYmF2Y29kZWM6bGliYXZ1dGlsOmxpYmF2cmVzYW1wbGUKLWVuYWJsZWQgcnBhdGggJiYgYWRkX2xkZXhlZmxhZ3MgLVdsLC1ycGF0aCwkbGliZGlyCi1lbmFibGVkIHJwYXRoICYmIGFkZF9sZGxpYmZsYWdzIC1XbCwtcnBhdGgsJGxpYmRpcgorZW5hYmxlZCBycGF0aCAmJiBhZGRfbGRleGVmbGFncyAtV2wsLXJwYXRoLCRsaWJkaXIgJiYgYWRkX2xkc29mbGFncyAtV2wsLXJwYXRoLCRsaWJkaXIKIHRlc3RfbGRmbGFncyAtV2wsLUJzeW1ib2xpYyAmJiBhcHBlbmQgU0hGTEFHUyAtV2wsLUJzeW1ib2xpYwogCiAjIGFkZCBzb21lIHN0cmlwIGZsYWdzCi0jIC13TiAnLi5AKicgaXMgbW9yZSBzZWxlY3RpdmUgdGhhbiAteCwgYnV0IG5vdCBhdmFpbGFibGUgZXZlcnl3aGVyZS4KLWNoZWNrX3N0cmlwZmxhZ3MgLXdOIFwnLi5AKlwnIHx8IGNoZWNrX3N0cmlwZmxhZ3MgLXgKK2NoZWNrX3N0cmlwZmxhZ3MgLXgKIAogZW5hYmxlZCBuZW9uX2Nsb2JiZXJfdGVzdCAmJgogICAgIGNoZWNrX2xkZmxhZ3MgLVdsLC0td3JhcCxhdmNvZGVjX29wZW4yICAgICAgICAgICAgICBcCkBAIC01ODM0LDYgKzY0NDYsMTAgQEAKICAgICAgICAgICAgICAgICAgIC1XbCwtLXdyYXAsYXZjb2RlY19lbmNvZGVfYXVkaW8yICAgICAgXAogICAgICAgICAgICAgICAgICAgLVdsLC0td3JhcCxhdmNvZGVjX2VuY29kZV92aWRlbzIgICAgICBcCiAgICAgICAgICAgICAgICAgICAtV2wsLS13cmFwLGF2Y29kZWNfZW5jb2RlX3N1YnRpdGxlICAgIFwKKyAgICAgICAgICAgICAgICAgIC1XbCwtLXdyYXAsYXZjb2RlY19zZW5kX3BhY2tldCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgLVdsLC0td3JhcCxhdmNvZGVjX3JlY2VpdmVfcGFja2V0ICAgICBcCisgICAgICAgICAgICAgICAgICAtV2wsLS13cmFwLGF2Y29kZWNfc2VuZF9mcmFtZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC1XbCwtLXdyYXAsYXZjb2RlY19yZWNlaXZlX2ZyYW1lICAgICAgXAogICAgICAgICAgICAgICAgICAgLVdsLC0td3JhcCxzd3JfY29udmVydCAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAtV2wsLS13cmFwLGF2cmVzYW1wbGVfY29udmVydCB8fAogICAgIGRpc2FibGUgbmVvbl9jbG9iYmVyX3Rlc3QKQEAgLTU4NDYsMjYgKzY0NjIsMzYgQEAKICAgICAgICAgICAgICAgICAgIC1XbCwtLXdyYXAsYXZjb2RlY19lbmNvZGVfYXVkaW8yICAgICAgXAogICAgICAgICAgICAgICAgICAgLVdsLC0td3JhcCxhdmNvZGVjX2VuY29kZV92aWRlbzIgICAgICBcCiAgICAgICAgICAgICAgICAgICAtV2wsLS13cmFwLGF2Y29kZWNfZW5jb2RlX3N1YnRpdGxlICAgIFwKKyAgICAgICAgICAgICAgICAgIC1XbCwtLXdyYXAsYXZjb2RlY19zZW5kX3BhY2tldCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgLVdsLC0td3JhcCxhdmNvZGVjX3JlY2VpdmVfcGFja2V0ICAgICBcCisgICAgICAgICAgICAgICAgICAtV2wsLS13cmFwLGF2Y29kZWNfc2VuZF9mcmFtZSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgIC1XbCwtLXdyYXAsYXZjb2RlY19yZWNlaXZlX2ZyYW1lICAgICAgXAogICAgICAgICAgICAgICAgICAgLVdsLC0td3JhcCxzd3JfY29udmVydCAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAtV2wsLS13cmFwLGF2cmVzYW1wbGVfY29udmVydCAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgIC1XbCwtLXdyYXAsc3dzX3NjYWxlIHx8CiAgICAgZGlzYWJsZSB4bW1fY2xvYmJlcl90ZXN0CiAKLWVjaG8gIlggeyBsb2NhbDogKjsgfTsiID4gJFRNUFYKLWlmIHRlc3RfbGRmbGFncyAtV2wsLS12ZXJzaW9uLXNjcmlwdCwkVE1QVjsgdGhlbgotICAgIGFwcGVuZCBTSEZMQUdTICctV2wsLS12ZXJzaW9uLXNjcmlwdCxcJChTVUJESVIpbGliXCQoTkFNRSkudmVyJwotZWxpZiB0ZXN0X2xkZmxhZ3MgLVdsLC1NLCRUTVBWOyB0aGVuCi0gICAgYXBwZW5kIFNIRkxBR1MgJy1XbCwtTSxcJChTVUJESVIpbGliXCQoTkFNRSkudmVyLXNvbDInCi1maQorY2hlY2tfbGQgImNjIiBwcm9wZXJfZGNlIDw8RU9GCitleHRlcm4gY29uc3QgaW50IGFycmF5WzUxMl07CitzdGF0aWMgaW5saW5lIGludCBmdW5jKHZvaWQpIHsgcmV0dXJuIGFycmF5WzBdOyB9CitpbnQgbWFpbih2b2lkKSB7IHJldHVybiAwOyB9CitFT0YKIAotY2hlY2tfY2MgPDxFT0YgJiYgZW5hYmxlIHN5bXZlcl9hc21fbGFiZWwKK2lmIGVuYWJsZWQgcHJvcGVyX2RjZTsgdGhlbgorICAgIGVjaG8gIlggeyBsb2NhbDogKjsgfTsiID4gJFRNUFYKKyAgICBpZiB0ZXN0X2xkZmxhZ3MgLVdsLCR7dmVyc2lvbl9zY3JpcHR9LCRUTVBWOyB0aGVuCisgICAgICAgIGFwcGVuZCBTSEZMQUdTICctV2wsJHt2ZXJzaW9uX3NjcmlwdH0sXCQoU1VCRElSKWxpYlwkKE5BTUUpLnZlcicKKyAgICAgICAgcXVvdGVzPSciIicKKyAgICAgICAgdGVzdF9jYyA8PEVPRiAmJiBlbmFibGUgc3ltdmVyX2FzbV9sYWJlbAogdm9pZCBmZl9mb28odm9pZCkgX19hc21fXyAoImF2X2Zvb0BWRVJTSU9OIik7CiB2b2lkIGZmX2Zvbyh2b2lkKSB7ICR7aW5saW5lX2FzbStfX2FzbV9fKCRxdW90ZXMpO30gfQogRU9GCi0gICAgY2hlY2tfY2MgPDxFT0YgJiYgZW5hYmxlIHN5bXZlcl9nbnVfYXNtCisgICAgICAgIHRlc3RfY2MgPDxFT0YgJiYgZW5hYmxlIHN5bXZlcl9nbnVfYXNtCiBfX2FzbV9fKCIuc3ltdmVyIGZmX2Zvbyxhdl9mb29AVkVSU0lPTiIpOwogdm9pZCBmZl9mb28odm9pZCkge30KIEVPRgorICAgIGZpCitmaQogCiBpZiBbIC16ICIkb3B0ZmxhZ3MiIF07IHRoZW4KICAgICBpZiBlbmFibGVkIHNtYWxsOyB0aGVuCkBAIC01ODc3LDExICs2NTAzLDI0IEBACiAgICAgZmkKIGZpCiAKK2lmIFsgLXogIiRudmNjZmxhZ3MiIF07IHRoZW4KKyAgICBudmNjZmxhZ3M9JG52Y2NmbGFnc19kZWZhdWx0CitmaQorCitpZiBlbmFibGVkIHg4Nl82NCB8fCBlbmFibGVkIHBwYzY0IHx8IGVuYWJsZWQgYWFyY2g2NDsgdGhlbgorICAgIG52Y2NmbGFncz0iJG52Y2NmbGFncyAtbTY0IgorZWxzZQorICAgIG52Y2NmbGFncz0iJG52Y2NmbGFncyAtbTMyIgorZmkKKwogY2hlY2tfb3B0ZmxhZ3MoKXsKICAgICBjaGVja19jZmxhZ3MgIiRAIgogICAgIGVuYWJsZWQgbHRvICYmIGNoZWNrX2xkZmxhZ3MgIiRAIgogfQogCitjaGVja19vcHRmbGFncyAkb3B0ZmxhZ3MKK2NoZWNrX29wdGZsYWdzIC1mbm8tbWF0aC1lcnJubworY2hlY2tfb3B0ZmxhZ3MgLWZuby1zaWduZWQtemVyb3MKIAogaWYgZW5hYmxlZCBsdG87IHRoZW4KICAgICB0ZXN0ICIkY2NfdHlwZSIgIT0gIiRsZF90eXBlIiAmJiBkaWUgIkxUTyByZXF1aXJlcyBzYW1lIGNvbXBpbGVyIGFuZCBsaW5rZXIiCkBAIC01ODkwLDEzICs2NTI5LDkgQEAKICAgICBkaXNhYmxlIGlubGluZV9hc21fZGlyZWN0X3N5bWJvbF9yZWZzCiBmaQogCi1jaGVja19vcHRmbGFncyAkb3B0ZmxhZ3MKLWNoZWNrX29wdGZsYWdzIC1mbm8tbWF0aC1lcnJubwotY2hlY2tfb3B0ZmxhZ3MgLWZuby1zaWduZWQtemVyb3MKLQogZW5hYmxlZCBmdHJhcHYgJiYgY2hlY2tfY2ZsYWdzIC1mdHJhcHYKIAotY2hlY2tfY2MgLW1uby1yZWQtem9uZSA8PEVPRiAmJiBub3JlZHpvbmVfZmxhZ3M9Ii1tbm8tcmVkLXpvbmUiCit0ZXN0X2NjIC1tbm8tcmVkLXpvbmUgPDxFT0YgJiYgbm9yZWR6b25lX2ZsYWdzPSItbW5vLXJlZC16b25lIgogaW50IHg7CiBFT0YKIApAQCAtNTkyOCwxOCArNjU2Myw4IEBACiAgICAgICAgICAgICBjaGVja19jZmxhZ3MgLWZhbGlnbi1zdGFjaz1tYWludGFpbi0xNi1ieXRlIHx8CiAgICAgICAgICAgICBkaXNhYmxlIGFsaWduZWRfc3RhY2sKICAgICBmaQotZWxpZiBlbmFibGVkIGNjYzsgdGhlbgotICAgICMgZGlzYWJsZSBzb21lIGFubm95aW5nIHdhcm5pbmdzCi0gICAgYWRkX2NmbGFncyAtbXNnX2Rpc2FibGUgYml0bm90aW50Ci0gICAgYWRkX2NmbGFncyAtbXNnX2Rpc2FibGUgbWl4ZnVuY3ZvaWQKLSAgICBhZGRfY2ZsYWdzIC1tc2dfZGlzYWJsZSBub25zdGFuZGNhc3QKLSAgICBhZGRfY2ZsYWdzIC1tc2dfZGlzYWJsZSB1bnN1cGllZWUKIGVsaWYgZW5hYmxlZCBnY2M7IHRoZW4KLSAgICBjYXNlICRnY2NfYmFzZXZlciBpbgotICAgICAgICA0LjkqKSBlbmFibGVkIHg4NiB8fCBjaGVja19vcHRmbGFncyAtZm5vLXRyZWUtdmVjdG9yaXplIDs7Ci0gICAgICAgIDQuKikgICAgICAgICAgICAgICAgIGNoZWNrX29wdGZsYWdzIC1mbm8tdHJlZS12ZWN0b3JpemUgOzsKLSAgICAgICAgKikgICAgZW5hYmxlZCB4ODYgfHwgY2hlY2tfb3B0ZmxhZ3MgLWZuby10cmVlLXZlY3Rvcml6ZSA7OwotICAgIGVzYWMKKyAgICBjaGVja19vcHRmbGFncyAtZm5vLXRyZWUtdmVjdG9yaXplCiAgICAgY2hlY2tfY2ZsYWdzIC1XZXJyb3I9Zm9ybWF0LXNlY3VyaXR5CiAgICAgY2hlY2tfY2ZsYWdzIC1XZXJyb3I9aW1wbGljaXQtZnVuY3Rpb24tZGVjbGFyYXRpb24KICAgICBjaGVja19jZmxhZ3MgLVdlcnJvcj1taXNzaW5nLXByb3RvdHlwZXMKQEAgLTU5NDgsMTAgKzY1NzMsMzkgQEAKICAgICBjaGVja19jZmxhZ3MgLVdmb3JtYXQKICAgICBjaGVja19jZmxhZ3MgLWZkaWFnbm9zdGljcy1jb2xvcj1hdXRvCiAgICAgZW5hYmxlZCBleHRyYV93YXJuaW5ncyB8fCBjaGVja19kaXNhYmxlX3dhcm5pbmcgLVduby1tYXliZS11bmluaXRpYWxpemVkCisgICAgaWYgZW5hYmxlZCB4ODZfMzI7IHRoZW4KKyAgICAgICAgY2FzZSAkdGFyZ2V0X29zIGluCisgICAgICAgICpic2QqKQorICAgICAgICAgICAgIyBCU0RzIGRvbid0IGd1YXJhbnRlZSBhIDE2IGJ5dGUgYWxpZ25lZCBzdGFjaywgYnV0IHdlIGNhbgorICAgICAgICAgICAgIyByZXF1ZXN0IEdDQyB0byB0cnkgdG8gbWFpbnRhaW4gMTYgYnl0ZSBhbGlnbm1lbnQgdGhyb3VnaG91dAorICAgICAgICAgICAgIyBmdW5jdGlvbiBjYWxscy4gTGlicmFyeSBlbnRyeSBwb2ludHMgdGhhdCBtaWdodCBjYWxsIGFzc2VtYmx5CisgICAgICAgICAgICAjIGZ1bmN0aW9ucyBhbGlnbiB0aGUgc3RhY2suIChUaGUgcGFyYW1ldGVyIG1lYW5zIDJeNCBieXRlcy4pCisgICAgICAgICAgICBjaGVja19jZmxhZ3MgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9NAorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgIGZpCiBlbGlmIGVuYWJsZWQgbGx2bV9nY2M7IHRoZW4KICAgICBjaGVja19jZmxhZ3MgLW1sbHZtIC1zdGFjay1hbGlnbm1lbnQ9MTYKIGVsaWYgZW5hYmxlZCBjbGFuZzsgdGhlbgotICAgIGNoZWNrX2NmbGFncyAtbWxsdm0gLXN0YWNrLWFsaWdubWVudD0xNgorICAgIGlmIGVuYWJsZWQgeDg2XzMyOyB0aGVuCisgICAgICAgICMgQ2xhbmcgZG9lc24ndCBzdXBwb3J0IG1haW50YWluaW5nIGFsaWdubWVudCB3aXRob3V0IGFzc3VtaW5nIHRoZQorICAgICAgICAjIHNhbWUgYWxpZ25tZW50IGluIGV2ZXJ5IGZ1bmN0aW9uLiBJZiAxNiBieXRlIGFsaWdubWVudCB3b3VsZCBiZQorICAgICAgICAjIGVuYWJsZWQsIG9uZSB3b3VsZCBhbHNvIGhhdmUgdG8gZWl0aGVyIGFkZCBhdHRyaWJ1dGVfYWxpZ25fYXJnIG9uCisgICAgICAgICMgZXZlcnkgc2luZ2xlIGVudHJ5IHBvaW50IGludG8gdGhlIGxpYnJhcmllcyBvciBlbmFibGUgLW1zdGFja3JlYWxpZ24KKyAgICAgICAgIyAoZG9pbmcgc3RhY2sgcmVhbGlnbm1lbnQgaW4gZXZlcnkgc2luZ2xlIGZ1bmN0aW9uKS4KKyAgICAgICAgY2FzZSAkdGFyZ2V0X29zIGluCisgICAgICAgIG1pbmd3MzJ8d2luMzJ8KmJzZCopCisgICAgICAgICAgICBkaXNhYmxlIGFsaWduZWRfc3RhY2sKKyAgICAgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBjaGVja19jZmxhZ3MgLW1sbHZtIC1zdGFjay1hbGlnbm1lbnQ9MTYKKyAgICAgICAgICAgIGNoZWNrX2NmbGFncyAtbXN0YWNrLWFsaWdubWVudD0xNgorICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworICAgIGVsc2UKKyAgICAgICAgY2hlY2tfY2ZsYWdzIC1tbGx2bSAtc3RhY2stYWxpZ25tZW50PTE2CisgICAgICAgIGNoZWNrX2NmbGFncyAtbXN0YWNrLWFsaWdubWVudD0xNgorICAgIGZpCiAgICAgY2hlY2tfY2ZsYWdzIC1RdW51c2VkLWFyZ3VtZW50cwogICAgIGNoZWNrX2NmbGFncyAtV2Vycm9yPWltcGxpY2l0LWZ1bmN0aW9uLWRlY2xhcmF0aW9uCiAgICAgY2hlY2tfY2ZsYWdzIC1XZXJyb3I9bWlzc2luZy1wcm90b3R5cGVzCkBAIC01OTY5LDExICs2NjIzLDkgQEAKICAgICBhZGRfY2ZsYWdzIC1XJHthcm1jY19vcHR9LC0tZGlhZ19zdXBwcmVzcz0zMzQzICMgaGFyZGZwIGNvbXBhdAogICAgIGFkZF9jZmxhZ3MgLVcke2FybWNjX29wdH0sLS1kaWFnX3N1cHByZXNzPTE2NyAgIyBwb2ludGVyIHNpZ24KICAgICBhZGRfY2ZsYWdzIC1XJHthcm1jY19vcHR9LC0tZGlhZ19zdXBwcmVzcz01MTMgICMgcG9pbnRlciBzaWduCi1lbGlmIGVuYWJsZWQgdG1zNDcwOyB0aGVuCi0gICAgYWRkX2NmbGFncyAtcGRzPTgyNCAtcGRzPTgzNwotICAgIGRpc2FibGUgaW5saW5lX2FzbQogZWxpZiBlbmFibGVkIHBhdGhzY2FsZTsgdGhlbgogICAgIGFkZF9jZmxhZ3MgLWZzdHJpY3Qtb3ZlcmZsb3cgLU9QVDp3cmFwX2Fyb3VuZF91bnNhZmVfb3B0PU9GRgorICAgIGRpc2FibGUgaW5saW5lX2FzbQogZWxpZiBlbmFibGVkX2FueSBtc3ZjIGljbDsgdGhlbgogICAgIGVuYWJsZWQgeDg2XzMyICYmIGRpc2FibGUgYWxpZ25lZF9zdGFjawogICAgIGVuYWJsZWRfYWxsIHg4Nl8zMiBkZWJ1ZyAmJiBhZGRfY2ZsYWdzIC1PeS0KQEAgLTU5ODIsNyArNjYzNCw3IEBACiAgICAgaWYgZW5hYmxlZCBpY2w7IHRoZW4KICAgICAgICAgIyAtUWFuc2ktYWxpYXMgaXMgYmFzaWNhbGx5IC1mc3RyaWN0LWFsaWFzaW5nLCBidXQgZG9lcyBub3Qgd29yawogICAgICAgICAjIChjb3JyZWN0bHkpIG9uIGljbCAxMy54LgotICAgICAgICBjaGVja19jcHBfY29uZGl0aW9uICJ3aW5kb3dzLmgiICJfX0lDTCA8IDEzMDAgfHwgX19JQ0wgPj0gMTQwMCIgJiYKKyAgICAgICAgdGVzdF9jcHBfY29uZGl0aW9uICJ3aW5kb3dzLmgiICJfX0lDTCA8IDEzMDAgfHwgX19JQ0wgPj0gMTQwMCIgJiYKICAgICAgICAgICAgIGFkZF9jZmxhZ3MgLVFhbnNpLWFsaWFzCiAgICAgICAgICMgU29tZSBpbmxpbmUgYXNtIGlzIG5vdCBjb21waWxhYmxlIGluIGRlYnVnCiAgICAgICAgIGlmIGVuYWJsZWQgZGVidWc7IHRoZW4KQEAgLTU5OTEsMjYgKzY2NDMsMzIgQEAKICAgICAgICAgZmkKICAgICBmaQogICAgICMgbXN2Y3J0MTAgeDY0IGluY29ycmVjdGx5IGVuYWJsZXMgbG9nMiwgb25seSBtc3ZjcnQxMiAoTVNWQyAyMDEzKSBvbndhcmRzIGFjdHVhbGx5IGhhcyBsb2cyLgotICAgIGNoZWNrX2NwcF9jb25kaXRpb24gY3J0dmVyc2lvbi5oICJfVkNfQ1JUX01BSk9SX1ZFUlNJT04gPj0gMTIiIHx8IGRpc2FibGUgbG9nMgorICAgIGNoZWNrX2NwcF9jb25kaXRpb24gbG9nMiBjcnR2ZXJzaW9uLmggIl9WQ19DUlRfTUFKT1JfVkVSU0lPTiA+PSAxMiIKICAgICAjIFRoZSBDUlQgaGVhZGVycyBjb250YWluIF9fZGVjbHNwZWMocmVzdHJpY3QpIGluIGEgZmV3IHBsYWNlcywgYnV0IGlmIHJlZGVmaW5pbmcKICAgICAjIHJlc3RyaWN0LCB0aGlzIG1pZ2h0IGJyZWFrLiBNU1ZDIDIwMTAgYW5kIDIwMTIgZmFpbCB3aXRoIF9fZGVjbHNwZWMoX19yZXN0cmljdCkKICAgICAjIChhcyBpdCBlbmRzIHVwIGlmIHRoZSByZXN0cmljdCByZWRlZmluZSBpcyBkb25lIGJlZm9yZSBpbmNsdWRpbmcgc3RkbGliLmgpLCB3aGlsZQogICAgICMgTVNWQyAyMDEzIGFuZCBuZXdlciBjYW4gaGFuZGxlIGl0IGZpbmUuCiAgICAgIyBJZiB0aGlzIGRlY2xzcGVjIGZhaWxzLCBmb3JjZSBpbmNsdWRpbmcgc3RkbGliLmggYmVmb3JlIHRoZSByZXN0cmljdCByZWRlZmluaXRpb24KICAgICAjIGhhcHBlbnMgaW4gY29uZmlnLmguCi0gICAgaWYgWyAkX3Jlc3RyaWN0ICE9IHJlc3RyaWN0IF07IHRoZW4KLSAgICAgICAgY2hlY2tfY2MgPDxFT0YgfHwgYWRkX2NmbGFncyAtRklzdGRsaWIuaAotX19kZWNsc3BlYygkX3Jlc3RyaWN0KSB2b2lkKiBmb28oaW50KTsKKyAgICBpZiBbICRyZXN0cmljdF9rZXl3b3JkICE9IHJlc3RyaWN0IF07IHRoZW4KKyAgICAgICAgdGVzdF9jYyA8PEVPRiB8fCBhZGRfY2ZsYWdzIC1GSXN0ZGxpYi5oCitfX2RlY2xzcGVjKCRyZXN0cmljdF9rZXl3b3JkKSB2b2lkICpmb28oaW50KTsKIEVPRgogICAgIGZpCi0gICAgY2hlY2tfZnVuYyBzdHJ0b2xsIHx8IGFkZF9jZmxhZ3MgLURzdHJ0b2xsPV9zdHJ0b2k2NAorICAgICMgdGhlIG5ldyBTU0Egb3B0aW16ZXIgaW4gVlMyMDE1IFUzIGlzIG1pcy1vcHRpbWl6aW5nIHNvbWUgcGFydHMgb2YgdGhlIGNvZGUKKyAgICAjIElzc3VlIGhhcyBiZWVuIGZpeGVkIGluIE1TVkMgdjE5LjAwLjI0MjE4LgorICAgIHRlc3RfY3BwX2NvbmRpdGlvbiB3aW5kb3dzLmggIl9NU0NfRlVMTF9WRVIgPj0gMTkwMDI0MjE4IiB8fAorICAgICAgICBjaGVja19jZmxhZ3MgLWQyU1NBT3B0aW1pemVyLQorICAgICMgZW5hYmxlIHV0Zi04IHNvdXJjZSBwcm9jZXNzaW5nIG9uIFZTMjAxNSBVMiBhbmQgbmV3ZXIKKyAgICB0ZXN0X2NwcF9jb25kaXRpb24gd2luZG93cy5oICJfTVNDX0ZVTExfVkVSID49IDE5MDAyMzkxOCIgJiYKKyAgICAgICAgYWRkX2NmbGFncyAtdXRmLTgKIGZpCiAKIGZvciBwZnggaW4gIiIgaG9zdF87IGRvCiAgICAgdmFybmFtZT0ke3BmeCVffWNjX3R5cGUKICAgICBldmFsICJ0eXBlPVwkJHZhcm5hbWUiCi0gICAgaWYgWyAkdHlwZSA9ICJtc3ZjIiBdOyB0aGVuCi0gICAgICAgIGNoZWNrXyR7cGZ4fWNjIDw8RU9GIHx8IGFkZF8ke3BmeH1jZmxhZ3MgLURpbmxpbmU9X19pbmxpbmUKKyAgICBpZiBbICIkdHlwZSIgPSAibXN2YyIgXTsgdGhlbgorICAgICAgICB0ZXN0XyR7cGZ4fWNjIDw8RU9GIHx8IGFkZF8ke3BmeH1jZmxhZ3MgLURpbmxpbmU9X19pbmxpbmUKIHN0YXRpYyBpbmxpbmUgaW50IGZvbyhpbnQgYSkgeyByZXR1cm4gYTsgfQogRU9GCiAgICAgZmkKQEAgLTYwMjgsMTUgKzY2ODYsNiBAQAogICAgIDs7CiBlc2FjCiAKLWNhc2UgJHRhcmdldF9vcyBpbgotICAgIG9zZjEpCi0gICAgICAgIGVuYWJsZWQgY2NjICYmIGFkZF9sZGZsYWdzICctV2wsLWV4cGVjdF91bnJlc29sdmVkLConCi0gICAgOzsKLSAgICBwbGFuOSkKLSAgICAgICAgYWRkX2NwcGZsYWdzIC1EbWFpbj1wbGFuOV9tYWluCi0gICAgOzsKLWVzYWMKLQogZW5hYmxlIGZyYW1lX3RocmVhZF9lbmNvZGVyCiAKIGVuYWJsZWQgYXNtIHx8IHsgYXJjaD1jOyBkaXNhYmxlICRBUkNIX0xJU1QgJEFSQ0hfRVhUX0xJU1Q7IH0KQEAgLTYwNDcsNDYgKzY2OTYsNjAgQEAKICAgICAgICAgICAgJEFMTF9DT01QT05FTlRTICAgIFwKIAogZW5hYmxlZCB0aHJlYWRzICYmICEgZW5hYmxlZCBwdGhyZWFkcyAmJiAhIGVuYWJsZWQgYXRvbWljc19uYXRpdmUgJiYgZGllICJub24gcHRocmVhZCB0aHJlYWRpbmcgd2l0aG91dCBhdG9taWNzIG5vdCBzdXBwb3J0ZWQsIHRyeSBhZGRpbmcgLS1lbmFibGUtcHRocmVhZHMgb3IgLS1jcHU9aTQ4NiBvciBoaWdoZXIgaWYgeW91IGFyZSBvbiB4ODYiCi0KK2VuYWJsZWQgYXZyZXNhbXBsZSAmJiB3YXJuICJCdWlsZGluZyB3aXRoIGRlcHJlY2F0ZWQgbGlicmFyeSBsaWJhdnJlc2FtcGxlIgogCiBpZiB0ZXN0ICR0YXJnZXRfb3MgPSAiaGFpa3UiOyB0aGVuCiAgICAgZGlzYWJsZSBtZW1hbGlnbgogICAgIGRpc2FibGUgcG9zaXhfbWVtYWxpZ24KIGZpCiAKLWVuYWJsZWRfYWxsIGR4dmEyIGR4dmEyYXBpX2NvYmogQ29UYXNrTWVtRnJlZSAmJgotICAgIHByZXBlbmQgZmZtcGVnX2xpYnMgJCgkbGRmbGFnc19maWx0ZXIgIi1sb2xlMzIiICItbHVzZXIzMiIpICYmCi0gICAgZW5hYmxlIGR4dmEyX2xpYgotCi0hIGVuYWJsZWRfYW55IG1lbWFsaWduIHBvc2l4X21lbWFsaWduIGFsaWduZWRfbWFsbG9jICYmCi0gICAgZW5hYmxlZCBzaW1kX2FsaWduXzE2ICYmIGVuYWJsZSBtZW1hbGlnbl9oYWNrCi0KLSMgYWRkX2RlcCBsaWIgZGVwCi0jIC0+IGVuYWJsZSAke2xpYn1fZGVwc18ke2RlcH0KLSMgLT4gYWRkICRkZXAgdG8gJHtsaWJ9X2RlcHMgb25seSBvbmNlCi1hZGRfZGVwKCkgewotICAgIGxpYj0kMQotICAgIGRlcD0kMgotICAgIGVuYWJsZWQgIiR7bGlifV9kZXBzXyR7ZGVwfSIgJiYgcmV0dXJuIDAKLSAgICBlbmFibGUgICIke2xpYn1fZGVwc18ke2RlcH0iCi0gICAgcHJlcGVuZCAiJHtsaWJ9X2RlcHMiICRkZXAKLX0KLQotIyBtZXJnZSBkZXBzIGxpYiBjb21wb25lbnRzCi0jIG1lcmdlIGFsbCAke2NvbXBvbmVudH1fZGVwcyBpbnRvICR7bGlifV9kZXBzIGFuZCAke2xpYn1fZGVwc18qCi1tZXJnZV9kZXBzKCkgewotICAgIGxpYj0kMQotICAgIHNoaWZ0Ci0gICAgZm9yIGNvbXAgaW4gJCo7IGRvCi0gICAgICAgIGVuYWJsZWQgJGNvbXAgfHwgY29udGludWUKLSAgICAgICAgZXZhbCAiZGVwPVwiXCQke2NvbXB9X2RlcHNcIiIKLSAgICAgICAgZm9yIGQgaW4gJGRlcDsgZG8KLSAgICAgICAgICAgIGFkZF9kZXAgJGxpYiAkZAorZmxhdHRlbl9leHRyYWxpYnMoKXsKKyAgICBuZXN0ZWRfZW50cmllcz0KKyAgICBsaXN0X25hbWU9JDEKKyAgICBldmFsIGxpc3Q9XCQkezF9CisgICAgZm9yIGVudHJ5IGluICRsaXN0OyBkbworICAgICAgICBlbnRyeV9jb3B5PSRlbnRyeQorICAgICAgICByZXNvbHZlIGVudHJ5X2NvcHkKKyAgICAgICAgZmxhdF9lbnRyaWVzPQorICAgICAgICBmb3IgZSBpbiAkZW50cnlfY29weTsgZG8KKyAgICAgICAgICAgIGNhc2UgJGUgaW4KKyAgICAgICAgICAgICAgICAqX2V4dHJhbGlicykgbmVzdGVkX2VudHJpZXM9IiRuZXN0ZWRfZW50cmllcyRlICI7OworICAgICAgICAgICAgICAgICAgICAgICAgICAqKSBmbGF0X2VudHJpZXM9IiRmbGF0X2VudHJpZXMkZSAiOzsKKyAgICAgICAgICAgIGVzYWMKICAgICAgICAgZG9uZQorICAgICAgICBldmFsICRlbnRyeT0iXCRmbGF0X2VudHJpZXMiCiAgICAgZG9uZQorICAgIGFwcGVuZCAkbGlzdF9uYW1lICIkbmVzdGVkX2VudHJpZXMiCisKKyAgICByZXNvbHZlIG5lc3RlZF9lbnRyaWVzCisgICAgaWYgdGVzdCAtbiAiJChmaWx0ZXIgJypfZXh0cmFsaWJzJyAkbmVzdGVkX2VudHJpZXMpIjsgdGhlbgorICAgICAgICBmbGF0dGVuX2V4dHJhbGlicyAkbGlzdF9uYW1lCisgICAgZmkKIH0KIAotbWVyZ2VfZGVwcyBsaWJhdmZpbHRlciAkRklMVEVSX0xJU1QKK2ZsYXR0ZW5fZXh0cmFsaWJzX3dyYXBwZXIoKXsKKyAgICBsaXN0X25hbWU9JDEKKyAgICBmbGF0dGVuX2V4dHJhbGlicyAkbGlzdF9uYW1lCisgICAgdW5pcXVlICRsaXN0X25hbWUKKyAgICByZXNvbHZlICRsaXN0X25hbWUKKyAgICBldmFsICRsaXN0X25hbWU9XCRcKFwkbGRmbGFnc19maWx0ZXIgXCQkbGlzdF9uYW1lXCkKKyAgICBldmFsIHByaW50ZiBcJyclcydcJyBcIiJcJCRsaXN0X25hbWUiXCIKK30KKworZm9yIGxpbmt1bml0IGluICRMSUJSQVJZX0xJU1Q7IGRvCisgICAgdW5zZXQgY3VycmVudF9leHRyYWxpYnMKKyAgICBldmFsIGNvbXBvbmVudHM9XCQkKHRvdXBwZXIgJHtsaW5rdW5pdH0pX0NPTVBPTkVOVFNfTElTVAorICAgIGZvciBjb21wIGluICR7Y29tcG9uZW50c307IGRvCisgICAgICAgIGVuYWJsZWQgJGNvbXAgfHwgY29udGludWUKKyAgICAgICAgY29tcF9leHRyYWxpYnM9IiR7Y29tcH1fZXh0cmFsaWJzIgorICAgICAgICBhcHBlbmQgY3VycmVudF9leHRyYWxpYnMgJGNvbXBfZXh0cmFsaWJzCisgICAgZG9uZQorICAgIGV2YWwgcHJlcGVuZCAke2xpbmt1bml0fV9leHRyYWxpYnMgJGN1cnJlbnRfZXh0cmFsaWJzCitkb25lCisKK2ZvciBsaW5rdW5pdCBpbiAkTElCUkFSWV9MSVNUICRQUk9HUkFNX0xJU1QgJEVYVFJBTElCU19MSVNUOyBkbworICAgIGV2YWwgJHtsaW5rdW5pdH1fZXh0cmFsaWJzPVwkXChmbGF0dGVuX2V4dHJhbGlic193cmFwcGVyICR7bGlua3VuaXR9X2V4dHJhbGlic1wpCitkb25lCiAKIG1hcCAnZW5hYmxlZCAkdiAmJiBpbnRyaW5zaWNzPSR7diNpbnRyaW5zaWNzX30nICRJTlRSSU5TSUNTX0xJU1QKIApAQCAtNjA5OCwxOSArNjc2MSw0MyBAQAogICAgIGZpCiBkb25lCiAKK2lmIGRpc2FibGVkIHN0ZGF0b21pYzsgdGhlbgorICAgIGlmIGVuYWJsZWQgYXRvbWljc19nY2M7IHRoZW4KKyAgICAgICAgYWRkX2NwcGZsYWdzICctSVwkKFNSQ19QQVRIKS9jb21wYXQvYXRvbWljcy9nY2MnCisgICAgZWxpZiBlbmFibGVkIGF0b21pY3Nfd2luMzI7IHRoZW4KKyAgICAgICAgYWRkX2NwcGZsYWdzICctSVwkKFNSQ19QQVRIKS9jb21wYXQvYXRvbWljcy93aW4zMicKKyAgICBlbGlmIGVuYWJsZWQgYXRvbWljc19zdW5jYzsgdGhlbgorICAgICAgICBhZGRfY3BwZmxhZ3MgJy1JXCQoU1JDX1BBVEgpL2NvbXBhdC9hdG9taWNzL3N1bmNjJworICAgIGVsaWYgZW5hYmxlZCBwdGhyZWFkczsgdGhlbgorICAgICAgICBhZGRfY29tcGF0IGF0b21pY3MvcHRocmVhZC9zdGRhdG9taWMubworICAgICAgICBhZGRfY3BwZmxhZ3MgJy1JXCQoU1JDX1BBVEgpL2NvbXBhdC9hdG9taWNzL3B0aHJlYWQnCisgICAgZWxzZQorICAgICAgICBlbmFibGVkIHRocmVhZHMgJiYgZGllICJUaHJlYWRpbmcgaXMgZW5hYmxlZCwgYnV0IG5vIGF0b21pY3MgYXJlIGF2YWlsYWJsZSIKKyAgICAgICAgYWRkX2NwcGZsYWdzICctSVwkKFNSQ19QQVRIKS9jb21wYXQvYXRvbWljcy9kdW1teScKKyAgICBmaQorZmkKKworIyBDaGVjayBpZiByZXF1ZXN0ZWQgbGlicmFyaWVzIHdlcmUgZm91bmQuCitmb3IgbGliIGluICRBVVRPREVURUNUX0xJQlM7IGRvCisgICAgcmVxdWVzdGVkICRsaWIgJiYgISBlbmFibGVkICRsaWIgJiYgZGllICJFUlJPUjogJGxpYiByZXF1ZXN0ZWQgYnV0IG5vdCBmb3VuZCI7Citkb25lCisKIGVuYWJsZWQgemxpYiAmJiBhZGRfY3BwZmxhZ3MgLURaTElCX0NPTlNUCiAKLSMgY29uZGl0aW9uYWwgbGlicmFyeSBkZXBlbmRlbmNpZXMsIGluIGxpbmtpbmcgb3JkZXIKKyMgY29uZGl0aW9uYWwgbGlicmFyeSBkZXBlbmRlbmNpZXMsIGluIGFueSBvcmRlcgogZW5hYmxlZCBhZmZ0ZmlsdF9maWx0ZXIgICAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAiYXZjb2RlYyIKK2VuYWJsZWQgYWZpcl9maWx0ZXIgICAgICAgICAmJiBwcmVwZW5kIGF2ZmlsdGVyX2RlcHMgImF2Y29kZWMiCiBlbmFibGVkIGFtb3ZpZV9maWx0ZXIgICAgICAgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJhdmZvcm1hdCBhdmNvZGVjIgogZW5hYmxlZCBhcmVzYW1wbGVfZmlsdGVyICAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAic3dyZXNhbXBsZSIKLWVuYWJsZWQgYXN5bmN0c19maWx0ZXIgICAgICAmJiBwcmVwZW5kIGF2ZmlsdGVyX2RlcHMgImF2cmVzYW1wbGUiCiBlbmFibGVkIGF0ZW1wb19maWx0ZXIgICAgICAgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJhdmNvZGVjIgogZW5hYmxlZCBjb3Zlcl9yZWN0X2ZpbHRlciAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAiYXZmb3JtYXQgYXZjb2RlYyIKK2VuYWJsZWQgY29udm9sdmVfZmlsdGVyICAgICAmJiBwcmVwZW5kIGF2ZmlsdGVyX2RlcHMgImF2Y29kZWMiCitlbmFibGVkIGRlY29udm9sdmVfZmlsdGVyICAgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJhdmNvZGVjIgogZW5hYmxlZCBlYnVyMTI4X2ZpbHRlciAmJiBlbmFibGVkIHN3cmVzYW1wbGUgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJzd3Jlc2FtcGxlIgogZW5hYmxlZCBlbGJnX2ZpbHRlciAgICAgICAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAiYXZjb2RlYyIKIGVuYWJsZWQgZmZ0ZmlsdF9maWx0ZXIgICAgICAmJiBwcmVwZW5kIGF2ZmlsdGVyX2RlcHMgImF2Y29kZWMiCiBlbmFibGVkIGZpbmRfcmVjdF9maWx0ZXIgICAgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJhdmZvcm1hdCBhdmNvZGVjIgorZW5hYmxlZCBmaXJlcXVhbGl6ZXJfZmlsdGVyICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAiYXZjb2RlYyIKIGVuYWJsZWQgbWNkZWludF9maWx0ZXIgICAgICAmJiBwcmVwZW5kIGF2ZmlsdGVyX2RlcHMgImF2Y29kZWMiCiBlbmFibGVkIG1vdmllX2ZpbHRlciAgICAmJiBwcmVwZW5kIGF2ZmlsdGVyX2RlcHMgImF2Zm9ybWF0IGF2Y29kZWMiCiBlbmFibGVkIHBhbl9maWx0ZXIgICAgICAgICAgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJzd3Jlc2FtcGxlIgpAQCAtNjEyNCwyMCArNjgxMSw1MSBAQAogZW5hYmxlZCBzaG93Y3F0X2ZpbHRlciAgICAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAiYXZmb3JtYXQgYXZjb2RlYyBzd3NjYWxlIgogZW5hYmxlZCBzaG93ZnJlcXNfZmlsdGVyICAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAiYXZjb2RlYyIKIGVuYWJsZWQgc2hvd3NwZWN0cnVtX2ZpbHRlciAmJiBwcmVwZW5kIGF2ZmlsdGVyX2RlcHMgImF2Y29kZWMiCitlbmFibGVkIHNpZ25hdHVyZV9maWx0ZXIgICAgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJhdmNvZGVjIGF2Zm9ybWF0IgogZW5hYmxlZCBzbWFydGJsdXJfZmlsdGVyICAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAic3dzY2FsZSIKIGVuYWJsZWQgc3BlY3RydW1zeW50aF9maWx0ZXIgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJhdmNvZGVjIgorZW5hYmxlZCBzcHBfZmlsdGVyICAgICAgICAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAiYXZjb2RlYyIKIGVuYWJsZWQgc3VidGl0bGVzX2ZpbHRlciAgICAmJiBwcmVwZW5kIGF2ZmlsdGVyX2RlcHMgImF2Zm9ybWF0IGF2Y29kZWMiCiBlbmFibGVkIHVzcHBfZmlsdGVyICAgICAgICAgJiYgcHJlcGVuZCBhdmZpbHRlcl9kZXBzICJhdmNvZGVjIgorZW5hYmxlZCB6b29tcGFuX2ZpbHRlciAgICAgICYmIHByZXBlbmQgYXZmaWx0ZXJfZGVwcyAic3dzY2FsZSIKIAogZW5hYmxlZCBsYXZmaV9pbmRldiAgICAgICAgICYmIHByZXBlbmQgYXZkZXZpY2VfZGVwcyAiYXZmaWx0ZXIiCiAKKyNGSVhNRQorZW5hYmxlZCBzZGwyX291dGRldiAgICAgJiYgYWRkX2NmbGFncyAkKGZpbHRlcl9vdXQgJy1EbWFpbj1TRExfbWFpbicgJHNkbDJfY2ZsYWdzKQorCiBlbmFibGVkIG9wdXNfZGVjb2RlciAgICAmJiBwcmVwZW5kIGF2Y29kZWNfZGVwcyAic3dyZXNhbXBsZSIKIAorIyByZW9yZGVyIHRoZSBpdGVtcyBhdCB2YXIgJDEgdG8gYWxpZ24gd2l0aCB0aGUgaXRlbXMgb3JkZXIgYXQgdmFyICQyIC4KKyMgZGllIGlmIGFuIGl0ZW0gYXQgJDEgaXMgbm90IGF0ICQyIC4KK3Jlb3JkZXJfYnkoKXsKKyAgICBldmFsIHJiX2luPVwkJDEKKyAgICBldmFsIHJiX29yZGVyZWQ9XCQkMgorCisgICAgZm9yIHJiIGluICRyYl9pbjsgZG8KKyAgICAgICAgaXNfaW4gJHJiICRyYl9vcmRlcmVkIHx8IGRpZSAiJHJiIGF0IFwkJDEgaXMgbm90IGF0IFwkJDIiCisgICAgZG9uZQorCisgICAgcmJfb3V0PQorICAgIGZvciByYiBpbiAkcmJfb3JkZXJlZDsgZG8KKyAgICAgICAgaXNfaW4gJHJiICRyYl9pbiAmJiByYl9vdXQ9IiRyYl9vdXQkcmIgIgorICAgIGRvbmUKKyAgICBldmFsICQxPVwkcmJfb3V0Cit9CisKKyMgZGVwcy1leHBhbmQgZmZsaWIgJDE6ICBOIHgge2FwcGVuZCBhbGwgZXhwYW5kZWQgZGVwczsgdW5pcXVlfQorIyB3aXRoaW4gYSBzZXQgb2YgTiBpdGVtcywgTiBleHBhbnNpb25zIGFyZSBlbm91Z2ggdG8gZXhwb3NlIGEgY3ljbGUuCiBleHBhbmRfZGVwcygpewotICAgIGxpYl9kZXBzPSR7MX1fZGVwcwotICAgIGV2YWwgImRlcHM9XCQkbGliX2RlcHMiCi0gICAgYXBwZW5kICRsaWJfZGVwcyAkKG1hcCAnZXZhbCBlY2hvIFwkJHt2fV9kZXBzJyAkZGVwcykKLSAgICB1bmlxdWUgJGxpYl9kZXBzCisgICAgdW5pcXVlICR7MX1fZGVwcyAgIyByZXF1aXJlZCBmb3IgdGhlIGVhcmx5IGJyZWFrIHRlc3QuCisgICAgZm9yIGR1bW15IGluICRMSUJSQVJZX0xJU1Q7IGRvICAjIE4gaXRlcmF0aW9zCisgICAgICAgIGV2YWwgZGVwcz1cJCR7MX1fZGVwcworICAgICAgICBhcHBlbmQgJHsxfV9kZXBzICQobWFwICdldmFsIGVjaG8gXCQke3Z9X2RlcHMnICRkZXBzKQorICAgICAgICB1bmlxdWUgJHsxfV9kZXBzCisgICAgICAgIGV2YWwgJ1sgJHsjZGVwc30gPSAkeyMnJHsxfV9kZXBzJ30gXScgJiYgYnJlYWsgICMgZG9lc24ndCBleHBhbmQgYW55bW9yZQorICAgIGRvbmUKKworICAgIGV2YWwgaXNfaW4gJDEgXCQkezF9X2RlcHMgJiYgZGllICJEZXBlbmRlbmN5IGN5Y2xlIGF0ICR7MX1fZGVwcyIKKyAgICByZW9yZGVyX2J5ICR7MX1fZGVwcyBMSUJSQVJZX0xJU1QgICMgbGlua2luZyBvcmRlciBpcyBleHBlY3RlZCBsYXRlcgogfQogCiAjd2UgaGF2ZSB0byByZW1vdmUgZ3BsIGZyb20gdGhlIGRlcHMgaGVyZSBhcyBzb21lIGNvZGUgYXNzdW1lcyBhbGwgbGliIGRlcHMgYXJlIGxpYnMKQEAgLTYxNDUsNiArNjg2Myw4IEBACiAKIG1hcCAnZXhwYW5kX2RlcHMgJHYnICRMSUJSQVJZX0xJU1QKIAoraWYgdGVzdCAiJHF1aWV0IiAhPSAieWVzIjsgdGhlbgorCiBlY2hvICJpbnN0YWxsIHByZWZpeCAgICAgICAgICAgICRwcmVmaXgiCiBlY2hvICJzb3VyY2UgcGF0aCAgICAgICAgICAgICAgICRzb3VyY2VfcGF0aCIKIGVjaG8gIkMgY29tcGlsZXIgICAgICAgICAgICAgICAgJGNjIgpAQCAtNjE2Niw3ICs2ODg2LDggQEAKIGVjaG8gImJpZy1lbmRpYW4gICAgICAgICAgICAgICAgJHtiaWdlbmRpYW4tbm99IgogZWNobyAicnVudGltZSBjcHUgZGV0ZWN0aW9uICAgICAke3J1bnRpbWVfY3B1ZGV0ZWN0LW5vfSIKIGlmIGVuYWJsZWQgeDg2OyB0aGVuCi0gICAgZWNobyAiJHt5YXNtZXhlfSAgICAgICAgICAgICAgICAgICAgICAke3lhc20tbm99IgorICAgIGVjaG8gInN0YW5kYWxvbmUgYXNzZW1ibHkgICAgICAgJHt4ODZhc20tbm99IgorICAgIGVjaG8gIng4NiBhc3NlbWJsZXIgICAgICAgICAgICAgJHt4ODZhc21leGV9IgogICAgIGVjaG8gIk1NWCBlbmFibGVkICAgICAgICAgICAgICAgJHttbXgtbm99IgogICAgIGVjaG8gIk1NWEVYVCBlbmFibGVkICAgICAgICAgICAgJHttbXhleHQtbm99IgogICAgIGVjaG8gIjNETm93ISBlbmFibGVkICAgICAgICAgICAgJHthbWQzZG5vdy1ub30iCkBAIC02MTc1LDYgKzY4OTYsOCBAQAogICAgIGVjaG8gIlNTU0UzIGVuYWJsZWQgICAgICAgICAgICAgJHtzc3NlMy1ub30iCiAgICAgZWNobyAiQUVTTkkgZW5hYmxlZCAgICAgICAgICAgICAke2Flc25pLW5vfSIKICAgICBlY2hvICJBVlggZW5hYmxlZCAgICAgICAgICAgICAgICR7YXZ4LW5vfSIKKyAgICBlY2hvICJBVlgyIGVuYWJsZWQgICAgICAgICAgICAgICR7YXZ4Mi1ub30iCisgICAgZWNobyAiQVZYLTUxMiBlbmFibGVkICAgICAgICAgICAke2F2eDUxMi1ub30iCiAgICAgZWNobyAiWE9QIGVuYWJsZWQgICAgICAgICAgICAgICAke3hvcC1ub30iCiAgICAgZWNobyAiRk1BMyBlbmFibGVkICAgICAgICAgICAgICAke2ZtYTMtbm99IgogICAgIGVjaG8gIkZNQTQgZW5hYmxlZCAgICAgICAgICAgICAgJHtmbWE0LW5vfSIKQEAgLTYyMTYsMTIgKzY5MzksOSBAQAogZWNobyAic3RhdGljICAgICAgICAgICAgICAgICAgICAke3N0YXRpYy1ub30iCiBlY2hvICJzaGFyZWQgICAgICAgICAgICAgICAgICAgICR7c2hhcmVkLW5vfSIKIGVjaG8gInBvc3Rwcm9jZXNzaW5nIHN1cHBvcnQgICAgJHtwb3N0cHJvYy1ub30iCi1lY2hvICJuZXcgZmlsdGVyIHN1cHBvcnQgICAgICAgICR7YXZmaWx0ZXItbm99IgogZWNobyAibmV0d29yayBzdXBwb3J0ICAgICAgICAgICAke25ldHdvcmstbm99IgogZWNobyAidGhyZWFkaW5nIHN1cHBvcnQgICAgICAgICAke3RocmVhZF90eXBlLW5vfSIKIGVjaG8gInNhZmUgYml0c3RyZWFtIHJlYWRlciAgICAgJHtzYWZlX2JpdHN0cmVhbV9yZWFkZXItbm99IgotZWNobyAiU0RMIHN1cHBvcnQgICAgICAgICAgICAgICAke3NkbC1ub30iCi1lY2hvICJvcGVuY2wgZW5hYmxlZCAgICAgICAgICAgICR7b3BlbmNsLW5vfSIKIGVjaG8gInRleGkyaHRtbCBlbmFibGVkICAgICAgICAgJHt0ZXhpMmh0bWwtbm99IgogZWNobyAicGVybCBlbmFibGVkICAgICAgICAgICAgICAke3Blcmwtbm99IgogZWNobyAicG9kMm1hbiBlbmFibGVkICAgICAgICAgICAke3BvZDJtYW4tbm99IgpAQCAtNjIzMSwxMiArNjk1MSwyMCBAQAogICAgIGVjaG8gInJhbmRvbSBzZWVkICAgICAgICAgICAgICAgJHtyYW5kb21fc2VlZH0iCiBlY2hvCiAKLWVjaG8gIkVuYWJsZWQgcHJvZ3JhbXM6IgotcHJpbnRfZW5hYmxlZCAnJyAkUFJPR1JBTV9MSVNUIHwgcHJpbnRfaW5fY29sdW1ucworZWNobyAiRXh0ZXJuYWwgbGlicmFyaWVzOiIKK3ByaW50X2VuYWJsZWQgJycgJEVYVEVSTkFMX0xJQlJBUllfTElTVCAkRVhURVJOQUxfQVVUT0RFVEVDVF9MSUJSQVJZX0xJU1QgfCBwcmludF9pbl9jb2x1bW5zCiBlY2hvCiAKLWVjaG8gIkV4dGVybmFsIGxpYnJhcmllczoiCi1wcmludF9lbmFibGVkICcnICRFWFRFUk5BTF9MSUJSQVJZX0xJU1QgfCBwcmludF9pbl9jb2x1bW5zCitlY2hvICJFeHRlcm5hbCBsaWJyYXJpZXMgcHJvdmlkaW5nIGhhcmR3YXJlIGFjY2VsZXJhdGlvbjoiCitwcmludF9lbmFibGVkICcnICRIV0FDQ0VMX0xJQlJBUllfTElTVCAkSFdBQ0NFTF9BVVRPREVURUNUX0xJQlJBUllfTElTVCB8IHByaW50X2luX2NvbHVtbnMKK2VjaG8KKworZWNobyAiTGlicmFyaWVzOiIKK3ByaW50X2VuYWJsZWQgJycgJExJQlJBUllfTElTVCB8IHByaW50X2luX2NvbHVtbnMKK2VjaG8KKworZWNobyAiUHJvZ3JhbXM6IgorcHJpbnRfZW5hYmxlZCAnJyAkUFJPR1JBTV9MSVNUIHwgcHJpbnRfaW5fY29sdW1ucwogZWNobwogCiBmb3IgdHlwZSBpbiBkZWNvZGVyIGVuY29kZXIgaHdhY2NlbCBwYXJzZXIgZGVtdXhlciBtdXhlciBwcm90b2NvbCBmaWx0ZXIgYnNmIGluZGV2IG91dGRldjsgZG8KQEAgLTYyNDYsMjggKzY5NzQsMzYgQEAKICAgICBlY2hvCiBkb25lCiAKLWxpY2Vuc2U9IkxHUEwgdmVyc2lvbiAyLjEgb3IgbGF0ZXIiCi1pZiBlbmFibGVkIG5vbmZyZWU7IHRoZW4KLSAgICBsaWNlbnNlPSJub25mcmVlIGFuZCB1bnJlZGlzdHJpYnV0YWJsZSIKLWVsaWYgZW5hYmxlZCBncGx2MzsgdGhlbgotICAgIGxpY2Vuc2U9IkdQTCB2ZXJzaW9uIDMgb3IgbGF0ZXIiCi1lbGlmIGVuYWJsZWQgbGdwbHYzOyB0aGVuCi0gICAgbGljZW5zZT0iTEdQTCB2ZXJzaW9uIDMgb3IgbGF0ZXIiCi1lbGlmIGVuYWJsZWQgZ3BsOyB0aGVuCi0gICAgbGljZW5zZT0iR1BMIHZlcnNpb24gMiBvciBsYXRlciIKK2lmIHRlc3QgLW4gIiRpZ25vcmVfdGVzdHMiOyB0aGVuCisgICAgaWdub3JlX3Rlc3RzPSQoZWNobyAkaWdub3JlX3Rlc3RzIHwgdHIgJywnICcgJykKKyAgICBlY2hvICJJZ25vcmVkIEZBVEUgdGVzdHM6IgorICAgIGVjaG8gJGlnbm9yZV90ZXN0cyB8IHByaW50X2luX2NvbHVtbnMKKyAgICBlY2hvCiBmaQogCiBlY2hvICJMaWNlbnNlOiAkbGljZW5zZSIKIAotZWNobyAiQ3JlYXRpbmcgY29uZmlnLm1haywgY29uZmlnLmgsIGFuZCBkb2MvY29uZmlnLnRleGkuLi4iCitmaSAjIHRlc3QgIiRxdWlldCIgIT0gInllcyIKKworaWYgdGVzdCAtbiAiJFdBUk5JTkdTIjsgdGhlbgorICAgIHByaW50ZiAiXG4lcyVzJFdBUk5JTkdTJXMiICIkd2Fybl9jb2xvciIgIiRib2xkX2NvbG9yIiAiJHJlc2V0X2NvbG9yIgorICAgIGVuYWJsZWQgZmF0YWxfd2FybmluZ3MgJiYgZXhpdCAxCitmaQogCiB0ZXN0IC1lIE1ha2VmaWxlIHx8IGVjaG8gImluY2x1ZGUgJHNvdXJjZV9wYXRoL01ha2VmaWxlIiA+IE1ha2VmaWxlCiAKK2VzYygpeworICAgIGVjaG8gIiQqIiB8IHNlZCAncy8lLyUyNS9nO3MvOi8lM2EvZycKK30KKworZWNobyAiY29uZmlnOiRhcmNoOiRzdWJhcmNoOiRjcHU6JHRhcmdldF9vczokKGVzYyAkY2NfaWRlbnQpOiQoZXNjICRGRk1QRUdfQ09ORklHVVJBVElPTikiID4gZmZidWlsZC9jb25maWcuZmF0ZQorCiBlbmFibGVkIHN0cmlwcGluZyB8fCBzdHJpcD0iZWNobyBza2lwcGluZyBzdHJpcCIKK2VuYWJsZWQgc3RyaXBwaW5nIHx8IHN0cmlwdHlwZT0iIgogCi1jb25maWdfZmlsZXM9IiRUTVBIIGNvbmZpZy5tYWsgZG9jL2NvbmZpZy50ZXhpIgorY29uZmlnX2ZpbGVzPSIkVE1QSCBmZmJ1aWxkL2NvbmZpZy5tYWsgZG9jL2NvbmZpZy50ZXhpIgogCi1jYXQgPiBjb25maWcubWFrIDw8RU9GCitjYXQgPiBmZmJ1aWxkL2NvbmZpZy5tYWsgPDxFT0YKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlIC0gZG8gbm90IG1vZGlmeSEKIGlmbmRlZiBGRk1QRUdfQ09ORklHX01BSwogRkZNUEVHX0NPTkZJR19NQUs9MQpAQCAtNjI4MSw2ICs3MDE3LDcgQEAKIERPQ0RJUj1cJChERVNURElSKSRkb2NkaXIKIE1BTkRJUj1cJChERVNURElSKSRtYW5kaXIKIFBLR0NPTkZJR0RJUj1cJChERVNURElSKSRwa2djb25maWdkaXIKK0lOU1RBTExfTkFNRV9ESVI9JGluc3RhbGxfbmFtZV9kaXIKIFNSQ19QQVRIPSRzb3VyY2VfcGF0aAogU1JDX0xJTks9JHNvdXJjZV9saW5rCiBpZm5kZWYgTUFJTl9NQUtFRklMRQpAQCAtNjI4OSw2ICs3MDI2LDcgQEAKIENDX0lERU5UPSRjY19pZGVudAogQVJDSD0kYXJjaAogSU5UUklOU0lDUz0kaW50cmluc2ljcworRVhURVJOX1BSRUZJWD0kZXh0ZXJuX3ByZWZpeAogQ0M9JGNjCiBDWFg9JGN4eAogQVM9JGFzCkBAIC02Mjk4LDEzICs3MDM2LDE4IEBACiBERVBDQ0ZMQUdTPSRERVBDQ0ZMQUdTIFwkKENQUEZMQUdTKQogREVQQVM9JGFzCiBERVBBU0ZMQUdTPSRERVBBU0ZMQUdTIFwkKENQUEZMQUdTKQotWUFTTT0keWFzbWV4ZQotREVQWUFTTT0keWFzbWV4ZQorWDg2QVNNPSR4ODZhc21leGUKK0RFUFg4NkFTTT0keDg2YXNtZXhlCitERVBYODZBU01GTEFHUz1cJChYODZBU01GTEFHUykKIEFSPSRhcgogQVJGTEFHUz0kYXJmbGFncwogQVJfTz0kYXJfbworQVJfQ01EPSRhcgorTk1fQ01EPSRubQogUkFOTElCPSRyYW5saWIKIFNUUklQPSRzdHJpcAorU1RSSVBUWVBFPSRzdHJpcHR5cGUKK05WQ0M9JG52Y2MKIENQPWNwIC1wCiBMTl9TPSRsbl9zCiBDUFBGTEFHUz0kQ1BQRkxBR1MKQEAgLTYzMTIsNiArNzA1NSw3IEBACiBDWFhGTEFHUz0kQ1hYRkxBR1MKIE9CSkNGTEFHUz0kT0JKQ0ZMQUdTCiBBU0ZMQUdTPSRBU0ZMQUdTCitOVkNDRkxBR1M9JG52Y2NmbGFncwogQVNfQz0kQVNfQwogQVNfTz0kQVNfTwogT0JKQ0NfQz0kT0JKQ0NfQwpAQCAtNjMyMiw3ICs3MDY2LDEwIEBACiBDQ19PPSRDQ19PCiBDWFhfQz0kQ1hYX0MKIENYWF9PPSRDWFhfTworTlZDQ19DPSROVkNDX0MKK05WQ0NfTz0kTlZDQ19PCiBMRF9PPSRMRF9PCitYODZBU01fTz0kWDg2QVNNX08KIExEX0xJQj0kTERfTElCCiBMRF9QQVRIPSRMRF9QQVRICiBETExUT09MPSRkbGx0b29sCkBAIC02MzMxLDEwICs3MDc4LDEwIEBACiBET1hZR0VOPSRkb3h5Z2VuCiBMREZMQUdTPSRMREZMQUdTCiBMREVYRUZMQUdTPSRMREVYRUZMQUdTCi1MRExJQkZMQUdTPSRMRExJQkZMQUdTCitMRFNPRkxBR1M9JExEU09GTEFHUwogU0hGTEFHUz0kKGVjaG8gJCgkbGRmbGFnc19maWx0ZXIgJFNIRkxBR1MpKQogQVNNU1RSSVBGTEFHUz0kQVNNU1RSSVBGTEFHUwotWUFTTUZMQUdTPSRZQVNNRkxBR1MKK1g4NkFTTUZMQUdTPSRYODZBU01GTEFHUwogQlVJTERTVUY9JGJ1aWxkX3N1ZmZpeAogUFJPR1NTVUY9JHByb2dzX3N1ZmZpeAogRlVMTE5BTUU9JEZVTExOQU1FCkBAIC02MzUwLDE1ICs3MDk3LDE4IEBACiBDQ0RFUF9GTEFHUz0kQ0NERVBfRkxBR1MKIEFTREVQPSRBU0RFUAogQVNERVBfRkxBR1M9JEFTREVQX0ZMQUdTCitYODZBU01ERVA9JFg4NkFTTURFUAorWDg2QVNNREVQX0ZMQUdTPSRYODZBU01ERVBfRkxBR1MKIENDX0RFUEZMQUdTPSRDQ19ERVBGTEFHUwogQVNfREVQRkxBR1M9JEFTX0RFUEZMQUdTCitYODZBU01fREVQRkxBR1M9JFg4NkFTTV9ERVBGTEFHUwogSE9TVENDPSRob3N0X2NjCiBIT1NUTEQ9JGhvc3RfbGQKIEhPU1RDRkxBR1M9JGhvc3RfY2ZsYWdzCiBIT1NUQ1BQRkxBR1M9JGhvc3RfY3BwZmxhZ3MKIEhPU1RFWEVTVUY9JEhPU1RFWEVTVUYKIEhPU1RMREZMQUdTPSRob3N0X2xkZmxhZ3MKLUhPU1RMSUJTPSRob3N0X2xpYnMKK0hPU1RFWFRSQUxJQlM9JGhvc3RfZXh0cmFsaWJzCiBERVBIT1NUQ0M9JGhvc3RfY2MKIERFUEhPU1RDQ0ZMQUdTPSRERVBIT1NUQ0NGTEFHUyBcJChIT1NUQ0NGTEFHUykKIEhPU1RDQ0RFUD0kSE9TVENDREVQCkBAIC02MzcwLDEyICs3MTIwLDExIEBACiBUQVJHRVRfRVhFQz0kdGFyZ2V0X2V4ZWMgJHRhcmdldF9leGVjX2FyZ3MKIFRBUkdFVF9QQVRIPSR0YXJnZXRfcGF0aAogVEFSR0VUX1NBTVBMRVM9JHt0YXJnZXRfc2FtcGxlczotXCQoU0FNUExFUyl9Ci1DRkxBR1MtZmZwbGF5PSRzZGxfY2ZsYWdzCi1aTElCPSQoJGxkZmxhZ3NfZmlsdGVyIC1seikKK0NGTEFHUy1mZnBsYXk9JHtzZGwyX2NmbGFnc30KK0NGTEFHU19IRUFERVJTPSRDRkxBR1NfSEVBREVSUwogTElCX0lOU1RBTExfRVhUUkFfQ01EPSRMSUJfSU5TVEFMTF9FWFRSQV9DTUQKIEVYVFJBTElCUz0kZXh0cmFsaWJzCiBDT01QQVRfT0JKUz0kY29tcGF0X29ianMKLUVYRU9CSlM9JGV4ZW9ianMKIElOU1RBTEw9JGluc3RhbGwKIExJQlRBUkdFVD0ke0xJQlRBUkdFVH0KIFNMSUJOQU1FPSR7U0xJQk5BTUV9CkBAIC02Mzg3LDMyICs3MTM2LDE4IEBACiBTTElCX0lOU1RBTExfTElOS1M9JHtTTElCX0lOU1RBTExfTElOS1N9CiBTTElCX0lOU1RBTExfRVhUUkFfTElCPSR7U0xJQl9JTlNUQUxMX0VYVFJBX0xJQn0KIFNMSUJfSU5TVEFMTF9FWFRSQV9TSExJQj0ke1NMSUJfSU5TVEFMTF9FWFRSQV9TSExJQn0KK1ZFUlNJT05fU0NSSVBUX1BPU1RQUk9DRVNTX0NNRD0ke1ZFUlNJT05fU0NSSVBUX1BPU1RQUk9DRVNTX0NNRH0KIFNBTVBMRVM6PSR7c2FtcGxlczotXCQoRkFURV9TQU1QTEVTKX0KIE5PUkVEWk9ORV9GTEFHUz0kbm9yZWR6b25lX2ZsYWdzCitMSUJGVVpaRVJfUEFUSD0kbGliZnV6emVyX3BhdGgKK0lHTk9SRV9URVNUUz0kaWdub3JlX3Rlc3RzCiBFT0YKIAotZ2V0X3ZlcnNpb24oKXsKLSAgICBsY25hbWU9bGliJHsxfQotICAgIG5hbWU9JCh0b3VwcGVyICRsY25hbWUpCi0gICAgZmlsZT0kc291cmNlX3BhdGgvJGxjbmFtZS92ZXJzaW9uLmgKLSAgICBldmFsICQoYXdrICIvI2RlZmluZSAke25hbWV9X1ZFUlNJT05fTS8geyBwcmludCBcJDIgXCI9XCIgXCQzIH0iICIkZmlsZSIpCi0gICAgZW5hYmxlZCByYWlzZV9tYWpvciAmJiBldmFsICR7bmFtZX1fVkVSU0lPTl9NQUpPUj0kKCgke25hbWV9X1ZFUlNJT05fTUFKT1IrMTAwKSkKLSAgICBldmFsICR7bmFtZX1fVkVSU0lPTj1cJCR7bmFtZX1fVkVSU0lPTl9NQUpPUi5cJCR7bmFtZX1fVkVSU0lPTl9NSU5PUi5cJCR7bmFtZX1fVkVSU0lPTl9NSUNSTwotICAgIGV2YWwgZWNobyAiJHtsY25hbWV9X1ZFUlNJT049XCQke25hbWV9X1ZFUlNJT04iID4+IGNvbmZpZy5tYWsKLSAgICBldmFsIGVjaG8gIiR7bGNuYW1lfV9WRVJTSU9OX01BSk9SPVwkJHtuYW1lfV9WRVJTSU9OX01BSk9SIiA+PiBjb25maWcubWFrCi0gICAgZXZhbCBlY2hvICIke2xjbmFtZX1fVkVSU0lPTl9NSU5PUj1cJCR7bmFtZX1fVkVSU0lPTl9NSU5PUiIgPj4gY29uZmlnLm1hawotfQorbWFwICdldmFsIGVjaG8gIiR7dn1fRkZMSUJTPVwkJHt2fV9kZXBzIiA+PiBmZmJ1aWxkL2NvbmZpZy5tYWsnICRMSUJSQVJZX0xJU1QKIAotbWFwICdnZXRfdmVyc2lvbiAkdicgJExJQlJBUllfTElTVAotCi1tYXAgJ2V2YWwgZWNobyAiJHt2fV9GRkxJQlM9XCQke3Z9X2RlcHMiID4+IGNvbmZpZy5tYWsnICRMSUJSQVJZX0xJU1QKLQotcHJpbnRfcHJvZ3JhbV9saWJzKCl7Ci0gICAgZXZhbCAicHJvZ3JhbV9saWJzPVwkJHsxfV9saWJzIgotICAgIGV2YWwgZWNobyAiTElCUy0kezF9PSR7cHJvZ3JhbV9saWJzfSIgPj4gY29uZmlnLm1hawotfQotCi1tYXAgJ3ByaW50X3Byb2dyYW1fbGlicyAkdicgJFBST0dSQU1fTElTVAorZm9yIGVudHJ5IGluICRMSUJSQVJZX0xJU1QgJFBST0dSQU1fTElTVCAkRVhUUkFMSUJTX0xJU1Q7IGRvCisgICAgZXZhbCBlY2hvICJFWFRSQUxJQlMtJHtlbnRyeX09XCQke2VudHJ5fV9leHRyYWxpYnMiID4+IGZmYnVpbGQvY29uZmlnLm1haworZG9uZQogCiBjYXQgPiAkVE1QSCA8PEVPRgogLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgY29uZmlndXJlIC0gZG8gbm90IG1vZGlmeSEgKi8KQEAgLTY0MjAsMTEgKzcxNTUsMTEgQEAKICNkZWZpbmUgRkZNUEVHX0NPTkZJR19ICiAjZGVmaW5lIEZGTVBFR19DT05GSUdVUkFUSU9OICIkKGNfZXNjYXBlICRGRk1QRUdfQ09ORklHVVJBVElPTikiCiAjZGVmaW5lIEZGTVBFR19MSUNFTlNFICIkKGNfZXNjYXBlICRsaWNlbnNlKSIKLSNkZWZpbmUgQ09ORklHX1RISVNfWUVBUiAyMDE2CisjZGVmaW5lIENPTkZJR19USElTX1lFQVIgMjAxOQogI2RlZmluZSBGRk1QRUdfREFUQURJUiAiJChldmFsIGNfZXNjYXBlICRkYXRhZGlyKSIKICNkZWZpbmUgQVZDT05WX0RBVEFESVIgIiQoZXZhbCBjX2VzY2FwZSAkZGF0YWRpcikiCiAjZGVmaW5lIENDX0lERU5UICIkKGNfZXNjYXBlICR7Y2NfaWRlbnQ6LVVua25vd24gY29tcGlsZXJ9KSIKLSNkZWZpbmUgYXZfcmVzdHJpY3QgJF9yZXN0cmljdAorI2RlZmluZSBhdl9yZXN0cmljdCAkcmVzdHJpY3Rfa2V5d29yZAogI2RlZmluZSBFWFRFUk5fUFJFRklYICIke2V4dGVybl9wcmVmaXh9IgogI2RlZmluZSBFWFRFUk5fQVNNICR7ZXh0ZXJuX3ByZWZpeH0KICNkZWZpbmUgQlVJTERTVUYgIiRidWlsZF9zdWZmaXgiCkBAIC02NDM5LDkgKzcxNzQsMTEgQEAKIHRlc3QgLW4gIiRtYWxsb2NfcHJlZml4IiAmJgogICAgIGVjaG8gIiNkZWZpbmUgTUFMTE9DX1BSRUZJWCAkbWFsbG9jX3ByZWZpeCIgPj4kVE1QSAogCi1pZiBlbmFibGVkIHlhc207IHRoZW4KK2lmIGVuYWJsZWQgeDg2YXNtOyB0aGVuCiAgICAgYXBwZW5kIGNvbmZpZ19maWxlcyAkVE1QQVNNCi0gICAgcHJpbnRmICcnID4kVE1QQVNNCisgICAgY2F0ID4gJFRNUEFTTSA8PEVPRgorOyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUgLSBkbyBub3QgbW9kaWZ5IQorRU9GCiBmaQogCiBlbmFibGVkIGdldGVudiB8fCBlY2hvICIjZGVmaW5lIGdldGVudih4KSBOVUxMIiA+PiAkVE1QSApAQCAtNjQ1OSwxNiArNzE5NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBTExfQ09NUE9ORU5UUyAgICBcCiAKIGVjaG8gIiNlbmRpZiAvKiBGRk1QRUdfQ09ORklHX0ggKi8iID4+ICRUTVBICi1lY2hvICJlbmRpZiAjIEZGTVBFR19DT05GSUdfTUFLIiA+PiBjb25maWcubWFrCitlY2hvICJlbmRpZiAjIEZGTVBFR19DT05GSUdfTUFLIiA+PiBmZmJ1aWxkL2NvbmZpZy5tYWsKIAogIyBEbyBub3Qgb3ZlcndyaXRlIGFuIHVuY2hhbmdlZCBjb25maWcuaCB0byBhdm9pZCBzdXBlcmZsdW91cyByZWJ1aWxkcy4KIGNwX2lmX2NoYW5nZWQgJFRNUEggY29uZmlnLmgKLXRvdWNoIC5jb25maWcKK3RvdWNoIGZmYnVpbGQvLmNvbmZpZwogCi1lbmFibGVkIHlhc20gJiYgY3BfaWZfY2hhbmdlZCAkVE1QQVNNIGNvbmZpZy5hc20KK2VuYWJsZWQgeDg2YXNtICYmIGNwX2lmX2NoYW5nZWQgJFRNUEFTTSBjb25maWcuYXNtCiAKIGNhdCA+ICRUTVBIIDw8RU9GCi0vKiBHZW5lcmF0ZWQgYnkgZmZjb25mICovCisvKiBHZW5lcmF0ZWQgYnkgZmZtcGVnIGNvbmZpZ3VyZSAqLwogI2lmbmRlZiBBVlVUSUxfQVZDT05GSUdfSAogI2RlZmluZSBBVlVUSUxfQVZDT05GSUdfSAogRU9GCkBAIC02NDc5LDY5ICs3MjE2LDgwIEBACiAKIGNwX2lmX2NoYW5nZWQgJFRNUEggbGliYXZ1dGlsL2F2Y29uZmlnLmgKIAotaWYgdGVzdCAtbiAiJFdBUk5JTkdTIjsgdGhlbgotICAgIHByaW50ZiAiXG4lcyVzJFdBUk5JTkdTJXMiICIkd2Fybl9jb2xvciIgIiRib2xkX2NvbG9yIiAiJHJlc2V0X2NvbG9yIgotICAgIGVuYWJsZWQgZmF0YWxfd2FybmluZ3MgJiYgZXhpdCAxCi1maQorIyBmdWxsX2ZpbHRlcl9uYW1lX2Zvbz12Zl9mb28KKyMgZnVsbF9maWx0ZXJfbmFtZV9iYXI9YXNyY19iYXIKKyMgLi4uCitldmFsICIkKHNlZCAtbiAicy9eZXh0ZXJuIEFWRmlsdGVyIGZmX1woW2F2ZnNpbmtyY11cezIsNVx9XClfXCguKlwpOy9mdWxsX2ZpbHRlcl9uYW1lX1wyPVwxX1wyL3AiICRzb3VyY2VfcGF0aC9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMpIgogCi0jIGJ1aWxkIHBrZy1jb25maWcgZmlsZXMKLQotbGliX3ZlcnNpb24oKXsKLSAgICBldmFsIHByaW50ZiAiXCJsaWIkezF9JHtidWlsZF9zdWZmaXh9ID49IFwkTElCJCh0b3VwcGVyICR7MX0pX1ZFUlNJT04sIFwiIgorIyBnZW5lcmF0ZSB0aGUgbGlzdHMgb2YgZW5hYmxlZCBjb21wb25lbnRzCitwcmludF9lbmFibGVkX2NvbXBvbmVudHMoKXsKKyAgICBmaWxlPSQxCisgICAgc3RydWN0X25hbWU9JDIKKyAgICBuYW1lPSQzCisgICAgc2hpZnQgMworICAgIGVjaG8gInN0YXRpYyBjb25zdCAkc3RydWN0X25hbWUgKiBjb25zdCAkbmFtZVtdID0geyIgPiAkVE1QSAorICAgIGZvciBjIGluICQqOyBkbworICAgICAgICBpZiBlbmFibGVkICRjOyB0aGVuCisgICAgICAgICAgICBjYXNlICRuYW1lIGluCisgICAgICAgICAgICAgICAgZmlsdGVyX2xpc3QpCisgICAgICAgICAgICAgICAgICAgIGV2YWwgYz1cJGZ1bGxfZmlsdGVyX25hbWVfJHtjJV9maWx0ZXJ9CisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgICAgICAgICBpbmRldl9saXN0KQorICAgICAgICAgICAgICAgICAgICBjPSR7YyVfaW5kZXZ9X2RlbXV4ZXIKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgICAgIG91dGRldl9saXN0KQorICAgICAgICAgICAgICAgICAgICBjPSR7YyVfb3V0ZGV2fV9tdXhlcgorICAgICAgICAgICAgICAgIDs7CisgICAgICAgICAgICBlc2FjCisgICAgICAgICAgICBwcmludGYgIiAgICAmZmZfJXMsXG4iICRjID4+ICRUTVBICisgICAgICAgIGZpCisgICAgZG9uZQorICAgIGlmIFsgIiRuYW1lIiA9ICJmaWx0ZXJfbGlzdCIgXTsgdGhlbgorICAgICAgICBmb3IgYyBpbiBhc3JjX2FidWZmZXIgdnNyY19idWZmZXIgYXNpbmtfYWJ1ZmZlciB2c2lua19idWZmZXI7IGRvCisgICAgICAgICAgICBwcmludGYgIiAgICAmZmZfJXMsXG4iICRjID4+ICRUTVBICisgICAgICAgIGRvbmUKKyAgICBmaQorICAgIGVjaG8gIiAgICBOVUxMIH07IiA+PiAkVE1QSAorICAgIGNwX2lmX2NoYW5nZWQgJFRNUEggJGZpbGUKIH0KIAotcGtnY29uZmlnX2dlbmVyYXRlKCl7Ci0gICAgbmFtZT0kMQotICAgIHNob3J0bmFtZT0ke25hbWUjbGlifSR7YnVpbGRfc3VmZml4fQotICAgIGNvbW1lbnQ9JDIKLSAgICB2ZXJzaW9uPSQzCi0gICAgbGlicz0kNAotICAgIHJlcXVpcmVzPSQobWFwICdsaWJfdmVyc2lvbiAkdicgJChldmFsIGVjaG8gXCQke25hbWUjbGlifV9kZXBzKSkKLSAgICByZXF1aXJlcz0ke3JlcXVpcmVzJSwgfQotICAgIGVuYWJsZWQgJHtuYW1lI2xpYn0gfHwgcmV0dXJuIDAKLSAgICBta2RpciAtcCAkbmFtZQotICAgIGNhdCA8PEVPRiA+ICRuYW1lLyRuYW1lJHtidWlsZF9zdWZmaXh9LnBjCitwcmludF9lbmFibGVkX2NvbXBvbmVudHMgbGliYXZmaWx0ZXIvZmlsdGVyX2xpc3QuYyBBVkZpbHRlciBmaWx0ZXJfbGlzdCAkRklMVEVSX0xJU1QKK3ByaW50X2VuYWJsZWRfY29tcG9uZW50cyBsaWJhdmNvZGVjL2NvZGVjX2xpc3QuYyBBVkNvZGVjIGNvZGVjX2xpc3QgJENPREVDX0xJU1QKK3ByaW50X2VuYWJsZWRfY29tcG9uZW50cyBsaWJhdmNvZGVjL3BhcnNlcl9saXN0LmMgQVZDb2RlY1BhcnNlciBwYXJzZXJfbGlzdCAkUEFSU0VSX0xJU1QKK3ByaW50X2VuYWJsZWRfY29tcG9uZW50cyBsaWJhdmNvZGVjL2JzZl9saXN0LmMgQVZCaXRTdHJlYW1GaWx0ZXIgYml0c3RyZWFtX2ZpbHRlcnMgJEJTRl9MSVNUCitwcmludF9lbmFibGVkX2NvbXBvbmVudHMgbGliYXZmb3JtYXQvZGVtdXhlcl9saXN0LmMgQVZJbnB1dEZvcm1hdCBkZW11eGVyX2xpc3QgJERFTVVYRVJfTElTVAorcHJpbnRfZW5hYmxlZF9jb21wb25lbnRzIGxpYmF2Zm9ybWF0L211eGVyX2xpc3QuYyBBVk91dHB1dEZvcm1hdCBtdXhlcl9saXN0ICRNVVhFUl9MSVNUCitwcmludF9lbmFibGVkX2NvbXBvbmVudHMgbGliYXZkZXZpY2UvaW5kZXZfbGlzdC5jIEFWSW5wdXRGb3JtYXQgaW5kZXZfbGlzdCAkSU5ERVZfTElTVAorcHJpbnRfZW5hYmxlZF9jb21wb25lbnRzIGxpYmF2ZGV2aWNlL291dGRldl9saXN0LmMgQVZPdXRwdXRGb3JtYXQgb3V0ZGV2X2xpc3QgJE9VVERFVl9MSVNUCitwcmludF9lbmFibGVkX2NvbXBvbmVudHMgbGliYXZmb3JtYXQvcHJvdG9jb2xfbGlzdC5jIFVSTFByb3RvY29sIHVybF9wcm90b2NvbHMgJFBST1RPQ09MX0xJU1QKKworIyBTZXR0aW5ncyBmb3IgcGtnLWNvbmZpZyBmaWxlcworCitjYXQgPiAkVE1QSCA8PEVPRgorIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBjb25maWd1cmUgLSBkbyBub3QgbW9kaWZ5IQorc2hhcmVkPSRzaGFyZWQKK2J1aWxkX3N1ZmZpeD0kYnVpbGRfc3VmZml4CiBwcmVmaXg9JHByZWZpeAotZXhlY19wcmVmaXg9XCR7cHJlZml4fQogbGliZGlyPSRsaWJkaXIKLWluY2x1ZGVkaXI9JGluY2RpcgotCi1OYW1lOiAkbmFtZQotRGVzY3JpcHRpb246ICRjb21tZW50Ci1WZXJzaW9uOiAkdmVyc2lvbgotUmVxdWlyZXM6ICQoZW5hYmxlZCBzaGFyZWQgfHwgZWNobyAkcmVxdWlyZXMpCi1SZXF1aXJlcy5wcml2YXRlOiAkKGVuYWJsZWQgc2hhcmVkICYmIGVjaG8gJHJlcXVpcmVzKQotQ29uZmxpY3RzOgotTGliczogLUxcJHtsaWJkaXJ9ICQoZW5hYmxlZCBycGF0aCAmJiBlY2hvICItV2wsLXJwYXRoLFwke2xpYmRpcn0iKSAtbCR7c2hvcnRuYW1lfSAkKGVuYWJsZWQgc2hhcmVkIHx8IGVjaG8gJGxpYnMpCi1MaWJzLnByaXZhdGU6ICQoZW5hYmxlZCBzaGFyZWQgJiYgZWNobyAkbGlicykKLUNmbGFnczogLUlcJHtpbmNsdWRlZGlyfQoraW5jZGlyPSRpbmNkaXIKK3JwYXRoPSQoZW5hYmxlZCBycGF0aCAmJiBlY2hvICItV2wsLXJwYXRoLFwke2xpYmRpcn0iKQorc291cmNlX3BhdGg9JHtzb3VyY2VfcGF0aH0KK0xJQlBSRUY9JHtMSUJQUkVGfQorTElCU1VGPSR7TElCU1VGfQorZXh0cmFsaWJzX2F2dXRpbD0iJGF2dXRpbF9leHRyYWxpYnMiCitleHRyYWxpYnNfYXZjb2RlYz0iJGF2Y29kZWNfZXh0cmFsaWJzIgorZXh0cmFsaWJzX2F2Zm9ybWF0PSIkYXZmb3JtYXRfZXh0cmFsaWJzIgorZXh0cmFsaWJzX2F2ZGV2aWNlPSIkYXZkZXZpY2VfZXh0cmFsaWJzIgorZXh0cmFsaWJzX2F2ZmlsdGVyPSIkYXZmaWx0ZXJfZXh0cmFsaWJzIgorZXh0cmFsaWJzX2F2cmVzYW1wbGU9IiRhdnJlc2FtcGxlX2V4dHJhbGlicyIKK2V4dHJhbGlic19wb3N0cHJvYz0iJHBvc3Rwcm9jX2V4dHJhbGlicyIKK2V4dHJhbGlic19zd3NjYWxlPSIkc3dzY2FsZV9leHRyYWxpYnMiCitleHRyYWxpYnNfc3dyZXNhbXBsZT0iJHN3cmVzYW1wbGVfZXh0cmFsaWJzIgogRU9GCiAKLW1rZGlyIC1wIGRvYy9leGFtcGxlcy9wYy11bmluc3RhbGxlZAotaW5jbHVkZWRpcj0ke3NvdXJjZV9wYXRofQotWyAiJGluY2x1ZGVkaXIiID0gLiBdICYmIGluY2x1ZGVkaXI9Ilwke3BjZmlsZWRpcn0vLi4vLi4vLi4iCi0gICAgY2F0IDw8RU9GID4gZG9jL2V4YW1wbGVzL3BjLXVuaW5zdGFsbGVkLyRuYW1lLnBjCi1wcmVmaXg9Ci1leGVjX3ByZWZpeD0KLWxpYmRpcj1cJHtwY2ZpbGVkaXJ9Ly4uLy4uLy4uLyRuYW1lCi1pbmNsdWRlZGlyPSR7aW5jbHVkZWRpcn0KK2ZvciBsaWIgaW4gJExJQlJBUllfTElTVDsgZG8KKyAgICBsaWJfZGVwcz0iJChldmFsIGVjaG8gXCQke2xpYn1fZGVwcykiCisgICAgZWNobyAke2xpYn1fZGVwcz1cIiRsaWJfZGVwc1wiID4+ICRUTVBICitkb25lCiAKLU5hbWU6ICRuYW1lCi1EZXNjcmlwdGlvbjogJGNvbW1lbnQKLVZlcnNpb246ICR2ZXJzaW9uCi1SZXF1aXJlczogJHJlcXVpcmVzCi1Db25mbGljdHM6Ci1MaWJzOiAtTFwke2xpYmRpcn0gLVdsLC1ycGF0aCxcJHtsaWJkaXJ9IC1sJHtzaG9ydG5hbWV9ICQoZW5hYmxlZCBzaGFyZWQgfHwgZWNobyAkbGlicykKLUNmbGFnczogLUlcJHtpbmNsdWRlZGlyfQotRU9GCi19Ci0KLXBrZ2NvbmZpZ19nZW5lcmF0ZSBsaWJhdnV0aWwgICAgICJGRm1wZWcgdXRpbGl0eSBsaWJyYXJ5IiAgICAgICAgICAgICAgICIkTElCQVZVVElMX1ZFUlNJT04iICAgICAiJExJQlJUICRMSUJNIgotcGtnY29uZmlnX2dlbmVyYXRlIGxpYmF2Y29kZWMgICAgIkZGbXBlZyBjb2RlYyBsaWJyYXJ5IiAgICAgICAgICAgICAgICAgIiRMSUJBVkNPREVDX1ZFUlNJT04iICAgICIkZXh0cmFsaWJzIgotcGtnY29uZmlnX2dlbmVyYXRlIGxpYmF2Zm9ybWF0ICAgIkZGbXBlZyBjb250YWluZXIgZm9ybWF0IGxpYnJhcnkiICAgICAgIiRMSUJBVkZPUk1BVF9WRVJTSU9OIiAgICIkZXh0cmFsaWJzIgotcGtnY29uZmlnX2dlbmVyYXRlIGxpYmF2ZGV2aWNlICAgIkZGbXBlZyBkZXZpY2UgaGFuZGxpbmcgbGlicmFyeSIgICAgICAgIiRMSUJBVkRFVklDRV9WRVJTSU9OIiAgICIkZXh0cmFsaWJzIgotcGtnY29uZmlnX2dlbmVyYXRlIGxpYmF2ZmlsdGVyICAgIkZGbXBlZyBhdWRpby92aWRlbyBmaWx0ZXJpbmcgbGlicmFyeSIgIiRMSUJBVkZJTFRFUl9WRVJTSU9OIiAgICIkZXh0cmFsaWJzIgotcGtnY29uZmlnX2dlbmVyYXRlIGxpYnBvc3Rwcm9jICAgIkZGbXBlZyBwb3N0cHJvY2Vzc2luZyBsaWJyYXJ5IiAgICAgICAgIiRMSUJQT1NUUFJPQ19WRVJTSU9OIiAgICIiCi1wa2djb25maWdfZ2VuZXJhdGUgbGliYXZyZXNhbXBsZSAiTGliYXYgYXVkaW8gcmVzYW1wbGluZyBsaWJyYXJ5IiAgICAgICAiJExJQkFWUkVTQU1QTEVfVkVSU0lPTiIgIiRMSUJNIgotcGtnY29uZmlnX2dlbmVyYXRlIGxpYnN3c2NhbGUgICAgIkZGbXBlZyBpbWFnZSByZXNjYWxpbmcgbGlicmFyeSIgICAgICAgIiRMSUJTV1NDQUxFX1ZFUlNJT04iICAgICIkTElCTSIKLXBrZ2NvbmZpZ19nZW5lcmF0ZSBsaWJzd3Jlc2FtcGxlICJGRm1wZWcgYXVkaW8gcmVzYW1wbGluZyBsaWJyYXJ5IiAgICAgICIkTElCU1dSRVNBTVBMRV9WRVJTSU9OIiAiJExJQk0gJExJQlNPWFIiCitjcF9pZl9jaGFuZ2VkICRUTVBIIGZmYnVpbGQvY29uZmlnLnNoCmRpZmYgLS1naXQgYS9kb2MvQVBJY2hhbmdlcyBiL2RvYy9BUEljaGFuZ2VzCmluZGV4IDg1ZDRkYjcuLjRmNmFjMmEgMTAwNjQ0Ci0tLSBhL2RvYy9BUEljaGFuZ2VzCisrKyBiL2RvYy9BUEljaGFuZ2VzCkBAIC0yLDE5ICsyLDU3NSBAQAogc2luY2UgdGhlIGxhc3QgbWFqb3IgdmVyc2lvbiBpbmNyZWFzZSBvciB0aGUgQVBJIHdhcyBhZGRlZC4KIAogVGhlIGxhc3QgdmVyc2lvbiBpbmNyZWFzZXMgd2VyZToKLWxpYmF2Y29kZWM6ICAgIDIwMTUtMDgtMjgKLWxpYmF2ZGV2aWNlOiAgIDIwMTUtMDgtMjgKLWxpYmF2ZmlsdGVyOiAgIDIwMTUtMDgtMjgKLWxpYmF2Zm9ybWF0OiAgIDIwMTUtMDgtMjgKLWxpYmF2cmVzYW1wbGU6IDIwMTUtMDgtMjgKLWxpYnBvc3Rwcm9jOiAgIDIwMTUtMDgtMjgKLWxpYnN3cmVzYW1wbGU6IDIwMTUtMDgtMjgKLWxpYnN3c2NhbGU6ICAgIDIwMTUtMDgtMjgKLWxpYmF2dXRpbDogICAgIDIwMTUtMDgtMjgKK2xpYmF2Y29kZWM6ICAgIDIwMTctMTAtMjEKK2xpYmF2ZGV2aWNlOiAgIDIwMTctMTAtMjEKK2xpYmF2ZmlsdGVyOiAgIDIwMTctMTAtMjEKK2xpYmF2Zm9ybWF0OiAgIDIwMTctMTAtMjEKK2xpYmF2cmVzYW1wbGU6IDIwMTctMTAtMjEKK2xpYnBvc3Rwcm9jOiAgIDIwMTctMTAtMjEKK2xpYnN3cmVzYW1wbGU6IDIwMTctMTAtMjEKK2xpYnN3c2NhbGU6ICAgIDIwMTctMTAtMjEKK2xpYmF2dXRpbDogICAgIDIwMTctMTAtMjEKIAogCiBBUEkgY2hhbmdlcywgbW9zdCByZWNlbnQgZmlyc3Q6CiAKKy0tLS0tLS0tIDg8IC0tLS0tLS0tLSBGRm1wZWcgNC4wIHdhcyBjdXQgaGVyZSAtLS0tLS0tLSA4PCAtLS0tLS0tLS0KKworMjAxOC0wNC0wMyAtIGQ2ZmMwMzFjYWYgLSBsYXZ1IDU2LjEzLjEwMCAtIHBpeGRlc2MuaAorICBEZXByZWNhdGUgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCBhbmQgbWFrZSBhbGxvY2F0aW5nIGEgcHNldWRvIHBhbGV0dGUKKyAgb3B0aW9uYWwgZm9yIEFQSSB1c2VycyAoc2VlIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwgZG94eWdlbiBmb3IgZGV0YWlscykuCisKKzIwMTgtMDQtMDEgLSA4NjAwODZlZTE2IC0gbGF2YyA1OC4xNy4xMDAgLSBhdmNvZGVjLmgKKyAgQWRkIGF2X3BhY2tldF9tYWtlX3JlZmNvdW50ZWQoKS4KKworMjAxOC0wNC0wMSAtIGYxODA1ZDE2MGQgLSBsYXZmaSA3LjE0LjEwMCAtIGF2ZmlsdGVyLmgKKyAgRGVwcmVjYXRlIHVzZSBvZiBhdmZpbHRlcl9yZWdpc3RlcigpLCBhdmZpbHRlcl9yZWdpc3Rlcl9hbGwoKSwKKyAgYXZmaWx0ZXJfbmV4dCgpLiBBZGQgYXZfZmlsdGVyX2l0ZXJhdGUoKS4KKworMjAxOC0wMy0yNSAtIGI3ZDBkOTEyZWYgLSBsYXZjIDU4LjE2LjEwMCAtIGF2Y29kZWMuaAorICBBZGQgRkZfU1VCX0NIQVJFTkNfTU9ERV9JR05PUkUuCisKKzIwMTgtMDMtMjMgLSBkYjJhN2M5NDdlIC0gbGF2dSA1Ni4xMi4xMDAgLSBlbmNyeXB0aW9uX2luZm8uaAorICBBZGQgQVZFbmNyeXB0aW9uSW5pdEluZm8gYW5kIEFWRW5jcnlwdGlvbkluZm8gc3RydWN0dXJlcyB0byBob2xkIG5ldyBzaWRlLWRhdGEKKyAgZm9yIGVuY3J5cHRpb24gaW5mby4KKworMjAxOC0wMy0yMSAtIGYxNGNhNjAwMDEgLSBsYXZjIDU4LjE1LjEwMCAtIGF2Y29kZWMuaAorICBBZGQgYXZfcGFja2V0X21ha2Vfd3JpdGFibGUoKS4KKworMjAxOC0wMy0xOCAtIDRiODZhYzI3YTAgLSBsYXZ1IDU2LjExLjEwMCAtIGZyYW1lLmgKKyAgQWRkIEFWX0ZSQU1FX0RBVEFfUVBfVEFCTEVfUFJPUEVSVElFUyBhbmQgQVZfRlJBTUVfREFUQV9RUF9UQUJMRV9EQVRBLgorCisyMDE4LTAzLTE1IC0gZTBlNzI1MzljZiAtIGxhdnUgNTYuMTAuMTAwIC0gb3B0LmgKKyAgQWRkIEFWX09QVF9GTEFHX0JTRl9QQVJBTQorCisyMDE4LTAzLTA3IC0gOTUwMTcwYmQzYiAtIGxhdnUgNTYuOS4xMDAgLSBjcmMuaAorICBBZGQgQVZfQ1JDXzhfRUJVIGNyYyB2YXJpYW50LgorCisyMDE4LTAzLTA3IC0gMmEwZWI4Njg1NyAtIGxhdmMgNTguMTQuMTAwIC0gbWVkaWFjb2RlYy5oCisgIENoYW5nZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiBhdmNvZGVjX2ZsdXNoKCkgb24gbWVkaWFjb2RlYworICB2aWRlbyBkZWNvZGVycy4gVG8gcmVzdG9yZSB0aGUgcHJldmlvdXMgYmVoYXZpb3IsIHVzZSB0aGUgbmV3CisgIGRlbGF5X2ZsdXNoPTEgb3B0aW9uLgorCisyMDE4LTAzLTAxIC0gNjczMWY2MDU5OCAtIGxhdnUgNTYuOC4xMDAgLSBmcmFtZS5oCisgIEFkZCBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhX2Zyb21fYnVmKCkuCisKKzIwMTgtMDItMTUgLSA4YThkMGIzMTlhCisgIENoYW5nZSBhdl9yaXBlbWRfdXBkYXRlKCksIGF2X211cm11cjNfdXBkYXRlKCkgYW5kIGF2X2hhc2hfdXBkYXRlKCkgbGVuZ3RoCisgIHBhcmFtZXRlciB0eXBlIHRvIHNpemVfdCBhdCBuZXh0IG1ham9yIGJ1bXAuCisKKzIwMTgtMDItMTIgLSBiY2FiMTFhMWEyIC0gbGF2ZmkgNy4xMi4xMDAgLSBhdmZpbHRlci5oCisgIEFkZCBBVkZpbHRlckNvbnRleHQuZXh0cmFfaHdfZnJhbWVzLgorCisyMDE4LTAyLTEyIC0gZDIzZmZmMGQ4YSAtIGxhdmMgNTguMTEuMTAwIC0gYXZjb2RlYy5oCisgIEFkZCBBVkNvZGVjQ29udGV4dC5leHRyYV9od19mcmFtZXMuCisKKzIwMTgtMDItMDYgLSAwNjk0ZDg3MDI0IC0gbGF2ZiA1OC45LjEwMCAtIGF2Zm9ybWF0LmgKKyAgRGVwcmVjYXRlIHVzZSBvZiBhdl9yZWdpc3Rlcl9pbnB1dF9mb3JtYXQoKSwgYXZfcmVnaXN0ZXJfb3V0cHV0X2Zvcm1hdCgpLAorICBhdl9yZWdpc3Rlcl9hbGwoKSwgYXZfaWZvcm1hdF9uZXh0KCksIGF2X29mb3JtYXRfbmV4dCgpLgorICBBZGQgYXZfZGVtdXhlcl9pdGVyYXRlKCksIGFuZCBhdl9tdXhlcl9pdGVyYXRlKCkuCisKKzIwMTgtMDItMDYgLSAzNmM4NWQ2ZTc3IC0gbGF2YyA1OC4xMC4xMDAgLSBhdmNvZGVjLmgKKyAgRGVwcmVjYXRlIHVzZSBvZiBhdmNvZGVjX3JlZ2lzdGVyKCksIGF2Y29kZWNfcmVnaXN0ZXJfYWxsKCksCisgIGF2X2NvZGVjX25leHQoKSwgYXZfcmVnaXN0ZXJfY29kZWNfcGFyc2VyKCksIGFuZCBhdl9wYXJzZXJfbmV4dCgpLgorICBBZGQgYXZfY29kZWNfaXRlcmF0ZSgpIGFuZCBhdl9wYXJzZXJfaXRlcmF0ZSgpLgorCisyMDE4LTAyLTA0IC0gZmY0NjEyNGIwZCAtIGxhdmYgNTguOC4xMDAgLSBhdmZvcm1hdC5oCisgIERlcHJlY2F0ZSB0aGUgY3VycmVudCBuYW1lcyBvZiB0aGUgUlRTUCAidGltZW91dCIsICJzdGltZW91dCIsICJ1c2VyLWFnZW50IgorICBvcHRpb25zLiBJbnRyb2R1Y2UgImxpc3Rlbl90aW1lb3V0IiBhcyByZXBsYWNlbWVudCBmb3IgdGhlIGN1cnJlbnQgInRpbWVvdXQiCisgIG9wdGlvbiwgYW5kICJ1c2VyX2FnZW50IiBhcyByZXBsYWNlbWVudCBmb3IgInVzZXItYWdlbnQiLiBPbmNlIHRoZSBkZXByZWNhdGlvbgorICBpcyBvdmVyLCB0aGUgb2xkICJ0aW1lb3V0IiBvcHRpb24gd2lsbCBiZSByZW1vdmVkLCBhbmQgInN0aW1lb3V0IiB3aWxsIGJlCisgIHJlbmFtZWQgdG8gInN0aW1lb3V0IiAodGhlICJ0aW1lb3V0IiBvcHRpb24gd2lsbCBlc3NlbnRpYWxseSBjaGFuZ2Ugc2VtYW50aWNzKS4KKworMjAxOC0wMS0yOCAtIGVhMzY3MmI3ZDYgLSBsYXZmIDU4LjcuMTAwIC0gYXZmb3JtYXQuaAorICBEZXByZWNhdGUgQVZGb3JtYXRDb250ZXh0IGZpbGVuYW1lIGZpZWxkIHdoaWNoIGhhZCBsaW1pdGVkIGxlbmd0aCwgdXNlIHRoZQorICBuZXcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHVybCBmaWVsZCBpbnN0ZWFkLgorCisyMDE4LTAxLTI4IC0gZWEzNjcyYjdkNiAtIGxhdmYgNTguNy4xMDAgLSBhdmZvcm1hdC5oCisgIEFkZCB1cmwgZmllbGQgdG8gQVZGb3JtYXRDb250ZXh0IGFuZCBhZGQgZmZfZm9ybWF0X3NldF91cmwgaGVscGVyIGZ1bmN0aW9uLgorCisyMDE4LTAxLTI3IC0gNjE5NGQ3ZTU2NCAtIGxhdmYgNTguNi4xMDAgLSBhdmZvcm1hdC5oCisgIEFkZCBBVkZNVENUWF9VTlNFRUtBQkxFIChmb3IgSExTIGRlbXV4ZXIpLgorCisyMDE4LTAxLTIzIC0gOWYwN2NmN2MwMCAtIGxhdnUgNTYuOS4xMDAgLSBhZXNfY3RyLmgKKyAgQWRkIG1ldGhvZCB0byBzZXQgdGhlIDE2LWJ5dGUgSVYuCisKKzIwMTgtMDEtMTYgLSA2MzFjNTZhOGU0IC0gbGF2ZiA1OC41LjEwMCAtIGF2Zm9ybWF0LmgKKyAgRXhwbGljaXRseSBtYWtlIGF2Zm9ybWF0X25ldHdvcmtfaW5pdCgpIGFuZCBhdmZvcm1hdF9uZXR3b3JrX2RlaW5pdCgpIG9wdGlvbmFsLgorICBJZiB0aGVzZSBhcmUgbm90IGNhbGxlZCwgbmV0d29yayBpbml0aWFsaXphdGlvbiBhbmQgZGVpbml0aWFsaXphdGlvbiBpcworICBhdXRvbWF0aWMsIGFuZCB1bmxpa2UgaW4gb2xkZXIgdmVyc2lvbnMsIGZ1bGx5IHN1cHBvcnRlZCwgdW5sZXNzIGxpYmF2Zm9ybWF0CisgIGlzIGxpbmtlZCB0byBhbmNpZW50IEdudVRMUyBhbmQgT3BlblNTTC4KKworMjAxOC0wMS0xNiAtIDY1MTJmZjcyZjkgLSBsYXZmIDU4LjQuMTAwIC0gYXZmb3JtYXQuaAorICBEZXByZWNhdGUgQVZTdHJlYW0ucmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uLiBJdCB3YXMgdXNlZnVsIG9ubHkgZm9yCisgIEZGc2VydmVyLCB3aGljaCBoYXMgYmVlbiByZW1vdmVkLgorCisyMDE4LTAxLTA1IC0gNzk4ZGNmMjQzMiAtIGxhdmZpIDcuMTEuMTAxIC0gYXZmaWx0ZXIuaAorICBEZXByZWNhdGUgYXZmaWx0ZXJfbGlua19nZXRfY2hhbm5lbHMoKS4gVXNlIGF2X2J1ZmZlcnNpbmtfZ2V0X2NoYW5uZWxzKCkuCisKKzIwMTctMDEtMDQgLSBjMjkwMzhmMzA0IC0gbGF2ciA0LjAuMCAtIGF2cmVzYW1wbGUuaAorICBEZXByZWNhdGUgdGhlIGVudGlyZSBsaWJyYXJ5LiBNZXJnZWQgeWVhcnMgYWdvIHRvIHByb3ZpZGUgY29tcGF0aWJpbGl0eQorICB3aXRoIExpYmF2LCBpdCByZW1haW5lZCB1bm1haW50YWluZWQgYnkgdGhlIEZGbXBlZyBwcm9qZWN0IGFuZCBkdXBsaWNhdGVkCisgIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgbGlic3dyZXNhbXBsZS4KKworICBJbiBvcmRlciB0byBpbXByb3ZlIGNvbnNpc3RlbmN5IGFuZCByZWR1Y2UgYXR0YWNrIHN1cmZhY2UsIGl0IGhhcyBiZWVuIGRlcHJlY2F0ZWQuCisgIFVzZXJzIG9mIHRoaXMgbGlicmFyeSBhcmUgYXNrZWQgdG8gbWlncmF0ZSB0byBsaWJzd3Jlc2FtcGxlLCB3aGljaCwgYXMgd2VsbCBhcworICBwcm92aWRpbmcgbW9yZSBmdW5jdGlvbmFsaXR5LCBpcyBmYXN0ZXIgYW5kIGhhcyBoaWdoZXIgYWNjdXJhY3kuCisKKzIwMTctMTItMjYgLSBhMDRjMmM3MDdkIC0gbGF2YyA1OC45LjEwMCAtIGF2Y29kZWMuaAorICBEZXByZWNhdGUgYXZfbG9ja21ncl9yZWdpc3RlcigpLiBZb3UgbmVlZCB0byBidWlsZCBGRm1wZWcgd2l0aCB0aHJlYWRpbmcKKyAgc3VwcG9ydCBlbmFibGVkIHRvIGdldCBiYXNpYyB0aHJlYWQtc2FmZXR5ICh3aGljaCBpcyB0aGUgZGVmYXVsdCBidWlsZAorICBjb25maWd1cmF0aW9uKS4KKworMjAxNy0xMi0yNCAtIDhiODFlYWJlNTcgLSBsYXZ1IDU2LjcuMTAwIC0gY3B1LmgKKyAgQVZYLTUxMiBmbGFncyBhZGRlZC4KKworMjAxNy0xMi0xNiAtIDhiZjRlNmQzY2UgLSBsYXZjIDU4LjguMTAwIC0gYXZjb2RlYy5oCisgIFRoZSBNZWRpYUNvZGVjIGRlY29kZXJzIG5vdyBzdXBwb3J0IEFWQ29kZWNDb250ZXh0Lmh3X2RldmljZV9jdHguCisKKzIwMTctMTItMTYgLSBlNGQ5ZjA1Y2E3IC0gbGF2dSA1Ni42LjEwMCAtIGh3Y29udGV4dC5oIGh3Y29udGV4dF9tZWRpYWNvZGVjLmgKKyAgQWRkIEFWX0hXREVWSUNFX1RZUEVfTUVESUFDT0RFQyBhbmQgYSBuZXcgaW5zdGFsbGVkIGhlYWRlciB3aXRoCisgIE1lZGlhQ29kZWMtc3BlY2lmaWMgaHdjb250ZXh0IGRlZmluaXRpb25zLgorCisyMDE3LTEyLTE0IC0gYjk0NWZlZDYyOSAtIGxhdmMgNTguNy4xMDAgLSBhdmNvZGVjLmgKKyAgQWRkIEFWX0NPREVDX0NBUF9IQVJEV0FSRSwgQVZfQ09ERUNfQ0FQX0hZQlJJRCwgYW5kIEFWQ29kZWMud3JhcHBlcl9uYW1lLAorICBhbmQgbWFyayBhbGwgQVZDb2RlY3MgYWNjb3JkaW5nbHkuCisKKzIwMTctMTEtMjkgLSBkMjY4MDk0Zjg4IC0gbGF2dSA1Ni40LjEwMCAvIDU2LjcuMCAtIHN0ZXJlbzNkLmgKKyAgQWRkIHZpZXcgZmllbGQgdG8gQVZTdGVyZW8zRCBzdHJ1Y3R1cmUgYW5kIEFWU3RlcmVvM0RWaWV3IGVudW0uCisKKzIwMTctMTEtMjYgLSAzYTcxYmNjMjEzIC0gbGF2YyA1OC42LjEwMCAtIGF2Y29kZWMuaAorICBBZGQgY29uc3QgdG8gQVZDb2RlY0NvbnRleHQuaHdhY2NlbC4KKworMjAxNy0xMS0yNiAtIDM1MzZhM2VmYjkgLSBsYXZjIDU4LjUuMTAwIC0gYXZjb2RlYy5oCisgIERlcHJlY2F0ZSB1c2VyIHZpc2liaWxpdHkgb2YgdGhlIEFWSFdBY2NlbCBzdHJ1Y3R1cmUgYW5kIHRoZSBmdW5jdGlvbnMKKyAgYXZfcmVnaXN0ZXJfaHdhY2NlbCgpIGFuZCBhdl9od2FjY2VsX25leHQoKS4KKworMjAxNy0xMS0yNiAtIDI0Y2MwYTUzZTkgLSBsYXZjIDU4LjQuMTAwIC0gYXZjb2RlYy5oCisgIEFkZCBBVkNvZGVjSFdDb25maWcgYW5kIGF2Y29kZWNfZ2V0X2h3X2NvbmZpZygpLgorCisyMDE3LTExLTIyIC0gMzY1MGNiMmRmYSAtIGxhdnUgNTYuMy4xMDAgLSBvcGVuY2wuaAorICBSZW1vdmUgZXhwZXJpbWVudGFsIE9wZW5DTCBBUEkgKGF2X29wZW5jbF8qKS4KKworMjAxNy0xMS0yMiAtIGIyNWQ4ZWYwYTcgLSBsYXZ1IDU2LjIuMTAwIC0gaHdjb250ZXh0LmggaHdjb250ZXh0X29wZW5jbC5oCisgIEFkZCBBVl9IV0RFVklDRV9UWVBFX09QRU5DTCBhbmQgYSBuZXcgaW5zdGFsbGVkIGhlYWRlciB3aXRoCisgIE9wZW5DTC1zcGVjaWZpYyBod2NvbnRleHQgZGVmaW5pdGlvbnMuCisKKzIwMTctMTEtMjIgLSBhMDUwZjU2YzA5IC0gbGF2dSA1Ni4xLjEwMCAtIHBpeGZtdC5oCisgIEFkZCBBVl9QSVhfRk1UX09QRU5DTC4KKworMjAxNy0xMS0xMSAtIDQ4ZTRlZGExMWQgLSBsYXZjIDU4LjMuMTAwIC0gYXZjb2RlYy5oCisgIEFkZCBhdmNvZGVjX2dldF9od19mcmFtZXNfcGFyYW1ldGVycygpLgorCistLS0tLS0tLSA4PCAtLS0tLS0tLS0gRkZtcGVnIDMuNCB3YXMgY3V0IGhlcmUgLS0tLS0tLS0gODwgLS0tLS0tLS0tCisKKzIwMTctMDktMjggLSBiNmNmNjZhZTFjIC0gbGF2YyA1Ny4xMDYuMTA0IC0gYXZjb2RlYy5oCisgIEFkZCBBVl9QS1RfREFUQV9BNTNfQ0MgcGFja2V0IHNpZGUgZGF0YSwgdG8gZXhwb3J0IGNsb3NlZCBjYXB0aW9ucworCisyMDE3LTA5LTI3IC0gN2FhNmI4YTY4ZiAtIGxhdnUgNTUuNzcuMTAxIC8gbGF2dSA1NS4zMS4xIC0gZnJhbWUuaAorICBBbGxvdyBwYXNzaW5nIHRoZSB2YWx1ZSBvZiAwIChtZWFuaW5nICJhdXRvbWF0aWMiKSBhcyB0aGUgcmVxdWlyZWQgYWxpZ25tZW50CisgIHRvIGF2X2ZyYW1lX2dldF9idWZmZXIoKS4KKworMjAxNy0wOS0yNyAtIDUyMmY4NzcwODYgLSBsYXZ1IDU1Ljc3LjEwMCAvIGxhdnUgNTUuMzEuMCAtIGNwdS5oCisgIEFkZCBhdl9jcHVfbWF4X2FsaWduKCkgZm9yIHF1ZXJ5aW5nIG1heGltdW0gcmVxdWlyZWQgZGF0YSBhbGlnbm1lbnQuCisKKzIwMTctMDktMjYgLSBiMWNmMTUxYzRkIC0gbGF2YyA1Ny4xMDYuMTAyIC0gYXZjb2RlYy5oCisgIERlcHJlY2F0ZSBBVkNvZGVjQ29udGV4dC5yZWZjb3VudGVkX2ZyYW1lcy4gVGhpcyB3YXMgdXNlZnVsIGZvciBkZXByZWNhdGVkCisgIEFQSSBvbmx5IChhdmNvZGVjX2RlY29kZV92aWRlbzIvYXZjb2RlY19kZWNvZGVfYXVkaW80KS4gVGhlIG5ldyBkZWNvZGUgQVBJcworICAoYXZjb2RlY19zZW5kX3BhY2tldC9hdmNvZGVjX3JlY2VpdmVfZnJhbWUpIGFsd2F5cyB3b3JrIHdpdGggcmVmZXJlbmNlCisgIGNvdW50ZWQgZnJhbWVzLgorCisyMDE3LTA5LTIxIC0gNmYxNWYxY2RjOCAtIGxhdnUgNTUuNzYuMTAwIC8gNTYuNi4wIC0gcGl4ZGVzYy5oCisgIEFkZCBhdl9jb2xvcl9yYW5nZV9mcm9tX25hbWUoKSwgYXZfY29sb3JfcHJpbWFyaWVzX2Zyb21fbmFtZSgpLAorICBhdl9jb2xvcl90cmFuc2Zlcl9mcm9tX25hbWUoKSwgYXZfY29sb3Jfc3BhY2VfZnJvbV9uYW1lKCksIGFuZAorICBhdl9jaHJvbWFfbG9jYXRpb25fZnJvbV9uYW1lKCkuCisKKzIwMTctMDktMTMgLSA4MjM0MmNlYWQxIC0gbGF2YyA1Ny4xMDYuMTAwIC0gYXZjb2RlYy5oCisgIEFkZCBBVl9QS1RfRkxBR19UUlVTVEVELgorCisyMDE3LTA5LTEzIC0gOWNiMjNjZDlmZSAtIGxhdnUgNTUuNzUuMTAwIC0gaHdjb250ZXh0LmggaHdjb250ZXh0X2RybS5oCisgIEFkZCBBVl9IV0RFVklDRV9UWVBFX0RSTSBhbmQgaW1wbGVtZW50YXRpb24uCisKKzIwMTctMDktMDggLSA1YmEyYWVmNmVjIC0gbGF2ZmkgNi4xMDMuMTAwIC0gYnVmZmVyc3JjLmgKKyAgQWRkIGF2X2J1ZmZlcnNyY19jbG9zZSgpLgorCisyMDE3LTA5LTA0IC0gNmNhZGJiMTZlOSAtIGxhdmMgNTcuMTA1LjEwMCAtIGF2Y29kZWMuaAorICBBZGQgQVZfSFdBQ0NFTF9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMLCByZXBsYWNpbmcgdGhlIGRlcHJlY2F0ZWQKKyAgSFdBQ0NFTF9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMIGZsYWcuCisKKzIwMTctMDktMDEgLSA1ZDc2Njc0NzU2IC0gbGF2ZiA1Ny44MS4xMDAgLSBhdmlvLmgKKyAgQWRkIGF2aW9fcmVhZF9wYXJ0aWFsKCkuCisKKzIwMTctMDktMDEgLSB4eHh4eHh4IC0gbGF2ZiA1Ny44MC4xMDAgLyA1Ny4xMS4wIC0gYXZpby5oCisgIEFkZCBhdmlvX2NvbnRleHRfZnJlZSgpLiBGcm9tIG5vdyBvbiBpdCBtdXN0IGJlIHVzZWQgZm9yIGZyZWVpbmcgQVZJT0NvbnRleHQuCisKKzIwMTctMDgtMDggLSAxNDYwNDA4NzAzIC0gbGF2dSA1NS43NC4xMDAgLSBwaXhkZXNjLmgKKyAgQWRkIEFWX1BJWF9GTVRfRkxBR19GTE9BVCBwaXhlbCBmb3JtYXQgZmxhZy4KKworMjAxNy0wOC0wOCAtIDQ2M2I4MWRlMmIgLSBsYXZ1IDU1LjcyLjEwMCAtIGltZ3V0aWxzLmgKKyAgQWRkIGF2X2ltYWdlX2ZpbGxfYmxhY2soKS4KKworMjAxNy0wOC0wOCAtIGNhYTEyMDI3YmEgLSBsYXZ1IDU1LjcxLjEwMCAtIGZyYW1lLmgKKyAgQWRkIGF2X2ZyYW1lX2FwcGx5X2Nyb3BwaW5nKCkuCisKKzIwMTctMDctMjUgLSAyNGRlNGZkZGNhIC0gbGF2dSA1NS42OS4xMDAgLSBmcmFtZS5oCisgIEFkZCBBVl9GUkFNRV9EQVRBX0lDQ19QUk9GSUxFIHNpZGUgZGF0YSB0eXBlLgorCisyMDE3LTA2LTI3IC0gNzAxNDNhMzk1NCAtIGxhdmMgNTcuMTAwLjEwMCAtIGF2Y29kZWMuaAorICBEWFZBMiBhbmQgRDNEMTEgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgZGVjb2Rpbmcgbm93IHN1cHBvcnRzIHRoZSBuZXcgaHdhY2NlbCBBUEksCisgIHdoaWNoIGNhbiBjcmVhdGUgdGhlIGRlY29kZXIgY29udGV4dCBhbmQgYWxsb2NhdGUgaGFyZHdhcmUgZnJhbWUgYXV0b21hdGljYWxseS4KKyAgU2VlIEFWQ29kZWNDb250ZXh0Lmh3X2RldmljZV9jdHggYW5kIEFWQ29kZWNDb250ZXh0Lmh3X2ZyYW1lc19jdHguIEZvciBEM0QxMSwKKyAgdGhlIG5ldyBBVl9QSVhfRk1UX0QzRDExIHBpeGZtdCBtdXN0IGJlIHVzZWQgd2l0aCB0aGUgbmV3IEFQSS4KKworMjAxNy0wNi0yNyAtIDMzMDM1MTFmMzMgLSBsYXZ1IDU2LjY3LjEwMCAtIGh3Y29udGV4dC5oCisgIEFkZCBBVl9IV0RFVklDRV9UWVBFX0QzRDExVkEgYW5kIEFWX1BJWF9GTVRfRDNEMTEuCisKKzIwMTctMDYtMjQgLSAwOTg5MWM1MzkxIC0gbGF2ZiA1Ny43NS4xMDAgLSBhdmlvLmgKKyAgQWRkIEFWSU9fREFUQV9NQVJLRVJfRkxVU0hfUE9JTlQgdG8gc2lnbmFsIHByZWZlcnJlZCBmbHVzaCBwb2ludHMgdG8gYXZpb2J1Zi4KKworMjAxNy0wNi0xNCAtIGQ1OWM2YTNhZWIgLSBsYXZ1IDU1LjY2LjEwMCAtIGh3Y29udGV4dC5oCisgIGF2X2h3ZnJhbWVfY3R4X2NyZWF0ZV9kZXJpdmVkKCkgbm93IHRha2VzIHNvbWUgQVZfSFdGUkFNRV9NQVBfKiBjb21iaW5hdGlvbgorICBhcyBpdHMgZmxhZ3MgYXJndW1lbnQgKHdoaWNoIHdhcyBwcmV2aW91c2x5IHVudXNlZCkuCisKKzIwMTctMDYtMTQgLSA0OWFlOGE1ZTg3IC0gbGF2YyA1Ny45OS4xMDAgLSBhdmNvZGVjLmgKKyAgQWRkIEFWX0hXQUNDRUxfRkxBR19BTExPV19QUk9GSUxFX01JU01BVENILgorCisyMDE3LTA2LTE0IC0gMGIxNzk0YTQzZSAtIGxhdnUgNTUuNjUuMTAwIC0gaHdjb250ZXh0LmgKKyAgQWRkIEFWX0hXREVWSUNFX1RZUEVfTk9ORSwgYXZfaHdkZXZpY2VfZmluZF90eXBlX2J5X25hbWUoKSwKKyAgYXZfaHdkZXZpY2VfZ2V0X3R5cGVfbmFtZSgpIGFuZCBhdl9od2RldmljZV9pdGVyYXRlX3R5cGVzKCkuCisKKzIwMTctMDYtMTQgLSBiMjIxNzJmNmYzIC0gbGF2dSA1NS42NC4xMDAgLSBod2NvbnRleHQuaAorICBBZGQgYXZfaHdkZXZpY2VfY3R4X2NyZWF0ZV9kZXJpdmVkKCkuCisKKzIwMTctMDUtMTUgLSA1MzJiMjNmMDc5IC0gbGF2YyA1Ny45Ni4xMDAgLSBhdmNvZGVjLmgKKyAgVmlkZW9Ub29sYm94IGhhcmR3YXJlLWFjY2VsZXJhdGVkIGRlY29kaW5nIG5vdyBzdXBwb3J0cyB0aGUgbmV3IGh3YWNjZWwgQVBJLAorICB3aGljaCBjYW4gY3JlYXRlIHRoZSBkZWNvZGVyIGNvbnRleHQgYW5kIGFsbG9jYXRlIGhhcmR3YXJlIGZyYW1lcyBhdXRvbWF0aWNhbGx5LgorICBTZWUgQVZDb2RlY0NvbnRleHQuaHdfZGV2aWNlX2N0eCBhbmQgQVZDb2RlY0NvbnRleHQuaHdfZnJhbWVzX2N0eC4KKworMjAxNy0wNS0xNSAtIDUzMmIyM2YwNzkgLSBsYXZ1IDU3LjYzLjEwMCAtIGh3Y29udGV4dC5oCisgIEFkZCBBVl9IV0RFVklDRV9UWVBFX1ZJREVPVE9PTEJPWCBhbmQgaW1wbGVtZW50YXRpb24uCisKKzIwMTctMDUtMDggLSBmMDg5ZTAyZmEyIC0gbGF2YyA1Ny45NS4xMDAgLyA1Ny4zMS4wIC0gYXZjb2RlYy5oCisgIEFkZCBBVkNvZGVjQ29udGV4dC5hcHBseV9jcm9wcGluZyB0byBjb250cm9sIHdoZXRoZXIgY3JvcHBpbmcKKyAgaXMgaGFuZGxlZCBieSBsaWJhdmNvZGVjIG9yIHRoZSBjYWxsZXIuCisKKzIwMTctMDUtMDggLSBhNDdiZDVkNzdlIC0gbGF2dSA1NS42Mi4xMDAgLyA1NS4zMC4wIC0gZnJhbWUuaAorICBBZGQgQVZGcmFtZS5jcm9wX2xlZnQvcmlnaHQvdG9wL2JvdHRvbSBmaWVsZHMgZm9yIGF0dGFjaGluZyBjcm9wcGluZworICBpbmZvcm1hdGlvbiB0byB2aWRlbyBmcmFtZXMuCisKKzIwMTcteHgteHggLSB4eHh4eHh4eHh4CisgIENoYW5nZSBhdl9zaGFfdXBkYXRlKCksIGF2X3NoYTUxMl91cGRhdGUoKSBhbmQgYXZfbWQ1X3N1bSgpL2F2X21kNV91cGRhdGUoKSBsZW5ndGgKKyAgcGFyYW1ldGVyIHR5cGUgdG8gc2l6ZV90IGF0IG5leHQgbWFqb3IgYnVtcC4KKworMjAxNy0wNS0wNSAtIGMwZjE3YTkwNWYgLSBsYXZjIDU3Ljk0LjEwMCAtIGF2Y29kZWMuaAorICBUaGUgY3V2aWQgZGVjb2RlcnMgbm93IHN1cHBvcnQgQVZDb2RlY0NvbnRleHQuaHdfZGV2aWNlX2N0eCwgd2hpY2ggcmVtb3ZlcworICB0aGUgcmVxdWlyZW1lbnQgdG8gc2V0IGFuIGluY29tcGxldGUgQVZDb2RlY0NvbnRleHQuaHdfZnJhbWVzX2N0eCBvbmx5IHRvCisgIHNldCB0aGUgQ3VkYSBkZXZpY2UgaGFuZGxlLgorCisyMDE3LTA0LTExIC0gODM3ODQ2NjUwNyAtIGxhdnUgNTUuNjEuMTAwIC0gYXZzdHJpbmcuaAorICBBZGQgYXZfc3RyaXJlcGxhY2UoKS4KKworMjAxNi0wNC0wNiAtIDE1N2U1N2ExODEgLSBsYXZjIDU3LjkyLjEwMCAtIGF2Y29kZWMuaAorICBBZGQgQVZfUEtUX0RBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTCBwYWNrZXQgc2lkZSBkYXRhLgorCisyMDE2LTA0LTA2IC0gYjM3OGY1YmQ2NCAtIGxhdnUgNTUuNjAuMTAwIC0gbWFzdGVyaW5nX2Rpc3BsYXlfbWV0YWRhdGEuaAorICBBZGQgQVZfRlJBTUVfREFUQV9DT05URU5UX0xJR0hUX0xFVkVMIHZhbHVlLCBhdl9jb250ZW50X2xpZ2h0X21ldGFkYXRhX2FsbG9jKCkKKyAgYW5kIGF2X2NvbnRlbnRfbGlnaHRfbWV0YWRhdGFfY3JlYXRlX3NpZGVfZGF0YSgpIEFQSSwgYW5kIEFWQ29udGVudExpZ2h0TWV0YWRhdGEKKyAgdHlwZSB0byBleHBvcnQgY29udGVudCBsaWdodCBsZXZlbCB2aWRlbyBwcm9wZXJ0aWVzLgorCisyMDE3LTAzLTMxIC0gOTAzM2U4NzIzYyAtIGxhdnUgNTUuNTcuMTAwIC0gc3BoZXJpY2FsLmgKKyAgQWRkIGF2X3NwaGVyaWNhbF9wcm9qZWN0aW9uX25hbWUoKS4KKyAgQWRkIGF2X3NwaGVyaWNhbF9mcm9tX25hbWUoKS4KKworMjAxNy0wMy0zMCAtIDRjZGEyM2YxZjEgLSBsYXZ1IDU1LjUzLjEwMCAvIDU1LjI3LjAgLSBod2NvbnRleHQuaAorICBBZGQgYXZfaHdmcmFtZV9tYXAoKSBhbmQgYXNzb2NpYXRlZCBBVl9IV0ZSQU1FX01BUF8qIGZsYWdzLgorICBBZGQgYXZfaHdmcmFtZV9jdHhfY3JlYXRlX2Rlcml2ZWQoKS4KKworMjAxNy0wMy0yOSAtIGJmZGNkZDZkODIgLSBsYXZ1IDU1LjUyLjEwMCAtIGF2dXRpbC5oCisgIGFkZCBhdl9mb3VyY2NfbWFrZV9zdHJpbmcoKSBmdW5jdGlvbiBhbmQgYXZfZm91cmNjMnN0cigpIG1hY3JvIHRvIHJlcGxhY2UKKyAgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcoKSBmcm9tIGxhdmMuCisKKzIwMTctMDMtMjcgLSBkZGVmM2Q5MDJmIC0gbGF2ZiA1Ny42OC4xMDAgLSBhdmZvcm1hdC5oCisgIERlcHJlY2F0ZSB0aGF0IGRlbXV4ZXJzIGV4cG9ydCB0aGUgc3RyZWFtIHJvdGF0aW9uIGFuZ2xlIGluIEFWU3RyZWFtLm1ldGFkYXRhCisgICh2aWEgYW4gZW50cnkgbmFtZWQgInJvdGF0ZSIpLiBVc2UgYXZfc3RyZWFtX2dldF9zaWRlX2RhdGEoKSB3aXRoCisgIEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVggaW5zdGVhZCwgYW5kIHJlYWQgdGhlIHJvdGF0aW9uIGFuZ2xlIHdpdGgKKyAgYXZfZGlzcGxheV9yb3RhdGlvbl9nZXQoKS4gVGhlIHNhbWUgaXMgZG9uZSBmb3IgbXV4aW5nLiBJbnN0ZWFkIG9mIGFkZGluZyBhCisgICJyb3RhdGUiIGVudHJ5IHRvIEFWU3RyZWFtLm1ldGFkYXRhLCBBVl9QS1RfREFUQV9ESVNQTEFZTUFUUklYIHNpZGUgZGF0YSBoYXMKKyAgdG8gYmUgYWRkZWQgdG8gdGhlIEFWU3RyZWFtLgorCisyMDE3LTAzLTIzIC0gN2U0YmE3NzZhMiAtIGxhdmMgNTcuODUuMTAxIC0gYXZjb2RlYy5oCisgIHZkcGF1IGhhcmR3YXJlIGFjY2VsZXJhdGVkIGRlY29kaW5nIG5vdyBzdXBwb3J0cyB0aGUgbmV3IGh3YWNjZWwgQVBJLCB3aGljaAorICBjYW4gY3JlYXRlIHRoZSBkZWNvZGVyIGNvbnRleHQgYW5kIGFsbG9jYXRlIGhhcmR3YXJlIGZyYW1lIGF1dG9tYXRpY2FsbHkuCisgIFNlZSBBVkNvZGVjQ29udGV4dC5od19kZXZpY2VfY3R4IGFuZCBBVkNvZGVjQ29udGV4dC5od19mcmFtZXNfY3R4LgorCisyMDE3LTAzLTIzIC0gMTU2YmQ4Mjc4ZiAtIGxhdmMgNTcuODUuMTAwIC0gYXZjb2RlYy5oCisgIEFkZCBBVkNvZGVjQ29udGV4dC5od2FjY2VsX2ZsYWdzIGZpZWxkLiBUaGlzIHdpbGwgY29udHJvbCBzb21lIGh3YWNjZWxzIGF0CisgIGEgbGF0ZXIgcG9pbnQuCisKKzIwMTctMDMtMjEgLSBmYzlmMTRjN2RlIC0gbGF2ZiA1Ny42Ny4xMDAgLyA1Ny4wOC4wIC0gYXZpby5oCisgIEFkZCBBVklPX1NFRUtBQkxFX1RJTUUgZmxhZy4KKworMjAxNy0wMy0yMSAtIGQ2ODJhZTcwYjQgLSBsYXZmIDU3LjY2LjEwNSwgbGF2YyA1Ny44My4xMDEgLSBhdmZvcm1hdC5oLCBhdmNvZGVjLmgKKyAgRGVwcmVjYXRlIEFWRk1UX0ZMQUdfS0VFUF9TSURFX0RBVEEuIEl0IHdpbGwgYmUgaWdub3JlZCBhZnRlciB0aGUgbmV4dCBtYWpvcgorICBidW1wLCBhbmQgbGliYXZmb3JtYXQgd2lsbCBiZWhhdmUgYXMgaWYgaXQgd2VyZSBhbHdheXMgc2V0LgorICBEZXByZWNhdGUgYXZfcGFja2V0X21lcmdlX3NpZGVfZGF0YSgpIGFuZCBhdl9wYWNrZXRfc3BsaXRfc2lkZV9kYXRhKCkuCisKKzIwMTYtMDMtMjAgLSA4MjAwYjE2YTljIC0gbGF2dSA1NS41MC4xMDAgLyA1NS4yMS4wIC0gaW1ndXRpbHMuaAorICBBZGQgYXZfaW1hZ2VfY29weV91Y19mcm9tKCksIGEgdmVyc2lvbiBvZiBhdl9pbWFnZV9jb3B5KCkgZm9yIGNvcHlpbmcKKyAgZnJvbSBHUFUgbWFwcGVkIG1lbW9yeS4KKworMjAxNy0wMy0yMCAtIDljMjQzNmUgLSBsYXZ1IDU1LjQ5LjEwMCAtIHBpeGRlc2MuaAorICBBZGQgQVZfUElYX0ZNVF9GTEFHX0JBWUVSIHBpeGVsIGZvcm1hdCBmbGFnLgorCisyMDE3LTAzLTE4IC0gMzc5NmZiMjY5MiAtIGxhdmZpIDYuNzcuMTAwIC0gYXZmaWx0ZXIuaAorICBEZXByZWNhdGUgQVZGaWx0ZXJHcmFwaC5yZXNhbXBsZV9sYXZyX29wdHMKKyAgSXQncyBuZXZlciBiZWVuIHVzZWQgYnkgYXZmaWx0ZXIgbm9yIHBhc3NlZCB0byBhbnl0aGluZy4KKworMjAxNy0wMi0xMCAtIDFiN2ZmZGRiM2EgLSBsYXZ1IDU1LjQ4LjEwMCAvIDU1LjMzLjAgLSBzcGhlcmljYWwuaAorICBBZGQgQVZfU1BIRVJJQ0FMX0VRVUlSRUNUQU5HVUxBUl9USUxFLCBhdl9zcGhlcmljYWxfdGlsZV9ib3VuZHMoKSwKKyAgYW5kIHByb2plY3Rpb24tc3BlY2lmaWMgcHJvcGVydGllcyAoYm91bmRfbGVmdCwgYm91bmRfdG9wLCBib3VuZF9yaWdodCwKKyAgYm91bmRfYm90dG9tLCBwYWRkaW5nKSB0byBBVlNwaGVyaWNhbE1hcHBpbmcuCisKKzIwMTctMDMtMDIgLSBhZGU3YzFhMjMyIC0gbGF2YyA1Ny44MS4xMDQgLSB2aWRlb3Rvb2xib3guaAorICBBVlZpZGVvdG9vbGJveENvbnRleHQuY3ZfcGl4X2ZtdF90eXBlIGNhbiBub3cgYmUgc2V0IHRvIDAgdG8gb3V0cHV0IHRoZQorICBuYXRpdmUgZGVjb2RlciBmb3JtYXQuIChUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgY2hhbmdlZC4pCisKKzIwMTctMDMtMDIgLSA1NTRiYzRlZWE4IC0gbGF2dSA1NS40Ny4xMDEsIGxhdmMgNTcuODEuMTAyLCBsYXZmIDU3LjY2LjEwMworICBSZW1vdmUgcmVxdWlyZW1lbnQgdG8gdXNlIEFWT3B0aW9uIG9yIGFjY2Vzc29ycyB0byBhY2Nlc3MgY2VydGFpbiBmaWVsZHMKKyAgaW4gQVZGcmFtZSwgQVZDb2RlY0NvbnRleHQsIGFuZCBBVkZvcm1hdENvbnRleHQgdGhhdCB3ZXJlIHByZXZpb3VzbHkKKyAgZG9jdW1lbnRlZCBhcyAibm8gZGlyZWN0IGFjY2VzcyIgYWxsb3dlZC4KKworMjAxNy0wMi0xMyAtIGMxYTVmY2EwNmYgLSBsYXZjIDU3LjgwLjEwMCAtIGF2Y29kZWMuaAorICBBZGQgQVZDb2RlY0NvbnRleHQuaHdfZGV2aWNlX2N0eC4KKworMjAxNy0wMi0xMSAtIGUzYWY0OWIxNGIgLSBsYXZ1IDU1LjQ3LjEwMCAtIGZyYW1lLmgKKyAgQWRkIEFWRnJhbWUub3BhcXVlX3JlZi4KKworMjAxNy0wMS0zMSAtIDJlYWI0ODE3N2QgLSBsYXZ1IDU1LjQ2LjEwMCAvIDU1LjIwLjAgLSBjcHUuaAorICBBZGQgQVZfQ1BVX0ZMQUdfU1NTRTNTTE9XLgorCisyMDE3LTAxLTI0IC0gYzQ2MThmODQyYSAtIGxhdnUgNTUuNDUuMTAwIC0gY2hhbm5lbF9sYXlvdXQuaAorICBBZGQgYXZfZ2V0X2V4dGVuZGVkX2NoYW5uZWxfbGF5b3V0KCkKKworMjAxNy0wMS0yMiAtIDc2YzVhNjllMjYgLSBsYXZ1IDU1LjQ0LjEwMCAtIGxmZy5oCisgIEFkZCBhdl9sZmdfaW5pdF9mcm9tX2RhdGEoKS4KKworMjAxNy0wMS0xNyAtIDJhNGE4NjUzYjYgLSBsYXZjIDU3Ljc0LjEwMCAtIHZhYXBpLmgKKyAgRGVwcmVjYXRlIHN0cnVjdCB2YWFwaV9jb250ZXh0IGFuZCB0aGUgdmFhcGkuaCBpbnN0YWxsZWQgaGVhZGVyLgorICBDYWxsZXJzIHNob3VsZCBzZXQgQVZDb2RlY0NvbnRleHQuaHdfZnJhbWVzX2N0eCBpbnN0ZWFkLgorCisyMDE3LTAxLTEyIC0gZGJlOWRiZWQzMSAtIGxhdmZpIDYuNjkuMTAwIC0gYnVmZmVyc2luay5oCisgIEFkZCBhdl9idWZmZXJzaW5rX2dldF8qKCkgZnVuY3Rpb25zLgorCisyMDE3LTAxLTA2IC0gOTQ4ODAzMmUxMCAtIGxhdmYgNTcuNjIuMTAwIC0gYXZpby5oCisgIEFkZCBhdmlvX2dldF9keW5fYnVmKCkKKworMjAxNi0xMi0xMCAtIGY1NDJiMTUyYWEgLSBsYXZ1IDU1LjQzLjEwMCAtIGltZ3V0aWxzLmgKKyAgQWRkIGF2X2ltYWdlX2NoZWNrX3NpemUyKCkKKworMjAxNi0xMi0wNyAtIGU3YTZmOGM5NzIgLSBsYXZjIDU3LjY3LjEwMCAvIDU3LjI5LjAgLSBhdmNvZGVjLmgKKyAgQWRkIEFWX1BLVF9EQVRBX1NQSEVSSUNBTCBwYWNrZXQgc2lkZSBkYXRhIHRvIGV4cG9ydCBBVlNwaGVyaWNhbE1hcHBpbmcKKyAgaW5mb3JtYXRpb24gZnJvbSBjb250YWluZXJzLgorCisyMDE2LTEyLTA3IC0gOGY1OGVjYzM0NCAtIGxhdnUgNTUuNDIuMTAwIC8gNTUuMzAuMCAtIHNwaGVyaWNhbC5oCisgIEFkZCBBVl9GUkFNRV9EQVRBX1NQSEVSSUNBTCB2YWx1ZSwgYXZfc3BoZXJpY2FsX2FsbG9jKCkgQVBJIGFuZAorICBBVlNwaGVyaWNhbE1hcHBpbmcgdHlwZSB0byBleHBvcnQgYW5kIGRlc2NyaWJlIHNwaGVyaWNhbCB2aWRlbyBwcm9wZXJ0aWVzLgorCisyMDE2LTExLTE4IC0gMmFiNTA2NDdmZiAtIGxhdmYgNTcuNTguMTAwIC0gYXZmb3JtYXQuaAorICBBZGQgYXZfc3RyZWFtX2FkZF9zaWRlX2RhdGEoKS4KKworMjAxNi0xMS0xMyAtIDc3NWE4NDc3YjcgLSBsYXZ1IDU1LjM5LjEwMCAtIGh3Y29udGV4dF92YWFwaS5oCisgIEFkZCBBVl9WQUFQSV9EUklWRVJfUVVJUktfQVRUUklCX01FTVRZUEUuCisKKzIwMTYtMTEtMTMgLSBhOGQ1MWJiNDI0IC0gbGF2dSA1NS4zOC4xMDAgLSBod2NvbnRleHRfdmFhcGkuaAorICBBZGQgZHJpdmVyIHF1aXJrcyBmaWVsZCB0byBWQUFQSS1zcGVjaWZpYyBod2RldmljZSBhbmQgZW51bSB3aXRoCisgIG1lbWJlcnMgQVZfVkFBUElfRFJJVkVSX1FVSVJLXyogdG8gcmVwcmVzZW50IGl0cyB2YWx1ZXMuCisKKzIwMTYtMTEtMTAgLSA2MzhiMjE2ZDRmIC0gbGF2dSA1NS4zNi4xMDAgLSBwaXhmbXQuaAorICBBZGQgQVZfUElYX0ZNVF9HUkFZMTIoTEUvQkUpLgorCistLS0tLS0tLSA4PCAtLS0tLS0tLS0gRkZtcGVnIDMuMiB3YXMgY3V0IGhlcmUgLS0tLS0tLS0gODwgLS0tLS0tLS0tCisKKzIwMTYtMTAtMjQgLSA3M2VhZDQ3IC0gbGF2ZiA1Ny41NS4xMDAgLSBhdmZvcm1hdC5oCisgIEFkZCBBVl9ESVNQT1NJVElPTl9USU1FRF9USFVNQk5BSUxTCisKKzIwMTYtMTAtMjQgLSBhMjQ2ZmVmIC0gbGF2ZiA1Ny41NC4xMDAgLSBhdmZvcm1hdC5oCisgIEFkZCBhdmZvcm1hdF9pbml0X291dHB1dCgpIGFuZCBBVlNUUkVBTV9JTklUX0lOXyBtYWNyb3MKKworMjAxNi0xMC0yMiAtIGY1NDk1YzkgLSBsYXZ1IDU1LjMzLjEwMCAtIGF2YXNzZXJ0LmgKKyAgQWRkIGF2X2Fzc2VydDBfZnB1KCkgLyBhdl9hc3NlcnQyX2ZwdSgpCisKKzIwMTYtMTAtMDcgLSAzZjkxMzdjIC8gMzJjODM1OSAtIGxhdmMgNTcuNjEuMTAwIC8gNTcuMjQuMCAtIGF2Y29kZWMuaAorICBEZWNvZGVycyBub3cgZXhwb3J0IHRoZSBmcmFtZSB0aW1lc3RhbXAgYXMgQVZGcmFtZS5wdHMuIEl0IHdhcworICBwcmV2aW91c2x5IGV4cG9ydGVkIGFzIEFWRnJhbWUucGt0X3B0cywgd2hpY2ggaXMgbm93IGRlcHJlY2F0ZWQuCisKKyAgTm90ZTogV2hlbiBkZWNvZGluZywgQVZGcmFtZS5wdHMgdXNlcyB0aGUgc3RyZWFtL3BhY2tldCB0aW1lYmFzZSwKKyAgYW5kIG5vdCB0aGUgY29kZWMgdGltZWJhc2UuCisKKzIwMTYtMDktMjggLSBlYmEwNDE0IC0gbGF2dSA1NS4zMi4xMDAgLyA1NS4xNi4wIC0gaHdjb250ZXh0LmggaHdjb250ZXh0X3Fzdi5oCisgIEFkZCBBVl9IV0RFVklDRV9UWVBFX1FTViBhbmQgYSBuZXcgaW5zdGFsbGVkIGhlYWRlciB3aXRoIFFTVi1zcGVjaWZpYworICBod2NvbnRleHQgZGVmaW5pdGlvbnMuCisKKzIwMTYtMDktMjYgLSAzMmMyNWYwIC0gbGF2YyA1Ny41OS4xMDAgLyA1Ny4yMy4wIC0gYXZjb2RlYy5oCisgIEFWQ29kZWNDb250ZXh0Lmh3X2ZyYW1lc19jdHggbm93IG1heSBiZSB1c2VkIGJ5IGRlY29kZXJzLgorCisyMDE2LTA5LTI3IC0gZjBiNmY3MiAtIGxhdmYgNTcuNTEuMTAwIC0gYXZmb3JtYXQuaAorICBBZGQgYXZfc3RyZWFtX2dldF9jb2RlY190aW1lYmFzZSgpCisKKzIwMTYtMDktMjcgLSAyM2MwNzc5IC0gbHN3ciAyLjIuMTAwIC0gc3dyZXNhbXBsZS5oCisgIEFkZCBzd3JfYnVpbGRfbWF0cml4KCkuCisKKzIwMTYtMDktMjMgLSAzMGQzZTM2IC0gbGF2YyA1Ny41OC4xMDAgLSBhdmNvZGVjLmgKKyAgQWRkIEFWX0NPREVDX0NBUF9BVk9JRF9QUk9CSU5HIGNvZGVjIGNhcGFiaWxpdHkgZmxhZy4KKworMjAxNi0wOS0xNCAtIGFlMWRkMGMgLSBsYXZmIDU3LjQ5LjEwMCAtIGF2Zm9ybWF0LmgKKyAgQWRkIGF2Zm9ybWF0X3RyYW5zZmVyX2ludGVybmFsX3N0cmVhbV90aW1pbmdfaW5mbyBoZWxwZXIgdG8gaGVscCB3aXRoIHN0cmVhbQorICBjb3B5LgorCisyMDE2LTA4LTI5IC0gNDQ5MzM5MCAtIGxhdmZpIDYuNTguMTAwIC0gYXZmaWx0ZXIuaAorICBBZGQgQVZGaWx0ZXJDb250ZXh0Lm5iX3RocmVhZHMuCisKKzIwMTYtMDgtMTUgLSBjM2M0YzcyIC0gbGF2YyA1Ny41My4xMDAgLSBhdmNvZGVjLmgKKyAgQWRkIHRyYWlsaW5nX3BhZGRpbmcgdG8gQVZDb2RlY0NvbnRleHQgdG8gbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcKKyAgZmllbGQgaW4gQVZDb2RlY1BhcmFtZXRlcnMuCisKKzIwMTYtMDgtMTUgLSBiNzQ2ZWQ3IC0gbGF2YyA1Ny41Mi4xMDAgLSBhdmNvZGVjLmgKKyAgQWRkIGEgbmV3IEFQSSBmb3IgY2hhaW5lZCBCU0YgZmlsdGVycyBhbmQgcGFzc3Rocm91Z2ggKG51bGwpIEJTRiAtLQorICBhdl9ic2ZfbGlzdF9hbGxvYygpLCBhdl9ic2ZfbGlzdF9mcmVlKCksIGF2X2JzZl9saXN0X2FwcGVuZCgpLAorICBhdl9ic2ZfbGlzdF9hcHBlbmQyKCksIGF2X2JzZl9saXN0X2ZpbmFsaXplKCksIGF2X2JzZl9saXN0X3BhcnNlX3N0cigpCisgIGFuZCBhdl9ic2ZfZ2V0X251bGxfZmlsdGVyKCkuCisKKzIwMTYtMDgtMDQgLSA4MmEzM2M4IC0gbGF2ZiA1Ny40Ni4xMDAgLSBhdmZvcm1hdC5oCisgIEFkZCBhdl9nZXRfZnJhbWVfZmlsZW5hbWUyKCkKKworMjAxNi0wNy0wOSAtIDc3NTM4OWYgLyA5MGY0NjlhIC0gbGF2YyA1Ny41MC4xMDAgLyA1Ny4yMC4wIC0gYXZjb2RlYy5oCisgIEFkZCBGRl9QUk9GSUxFX0gyNjRfTVVMVElWSUVXX0hJR0ggYW5kIEZGX1BST0ZJTEVfSDI2NF9TVEVSRU9fSElHSC4KKworMjAxNi0wNi0zMCAtIGMxYzdlMGFiIC0gbGF2ZiA1Ny40MS4xMDAgLSBhdmZvcm1hdC5oCisgIE1vdmVkIGNvZGVjcGFyIGZpZWxkIGZyb20gQVZTdHJlYW0gdG8gdGhlIGVuZCBvZiB0aGUgc3RydWN0LCBzbyB0aGF0CisgIHRoZSBmb2xsb3dpbmcgcHJpdmF0ZSBmaWVsZHMgYXJlIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGluIEZGbXBlZyAzLjAgKGxhdmYgNTcuMjUuMTAwKS4KKworMjAxNi0wNi0zMCAtIDA0MmZiNjlkIC0gbGF2dSA1NS4yOC4xMDAgLSBmcmFtZS5oCisgIE1vdmVkIGh3X2ZyYW1lc19jdHggZmllbGQgZnJvbSBBVkZyYW1lIHRvIHRoZSBlbmQgb2YgdGhlIHN0cnVjdCwgc28gdGhhdAorICB0aGUgZm9sbG93aW5nIHByaXZhdGUgZmllbGRzIGFyZSBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBpbiBGRm1wZWcgMy4wIChsYXZ1IDU1LjE3LjEwMykuCisKKzIwMTYtMDYtMjkgLSAxYTc1MTQ1NSAtIGxhdmZpIDYuNDcuMTAwIC0gYXZmaWx0ZXIuaAorICBGaXggYWNjaWRlbnRhbCBBQkkgYnJlYWthZ2UgaW4gQVZGaWx0ZXJDb250ZXh0LgorICBBQkkgd2FzIGJyb2tlbiBpbiA4Njg4ZDNhLCBsYXZmaSA2LjQyLjEwMCBhbmQgcmVsZWFzZWQgYXMgZmZtcGVnIDMuMS4KKworICBCZWNhdXNlIG9mIHRoaXMsIGZmbXBlZyBhbmQgZmZwbGF5IGJ1aWx0IGFnYWluc3QgbGF2Zmk+PTYuNDIuMTAwIHdpbGwgbm90IGJlCisgIGNvbXBhdGlibGUgd2l0aCBsYXZmaT49Ni40Ny4xMDAuIFBvdGVudGlhbGx5IGFsc28gYWZmZWN0cyBvdGhlciB1c2VycyBvZgorICBsaWJhdmZpbHRlciBpZiB0aGV5IGFyZSB1c2luZyBvbmUgb2YgdGhlIGFmZmVjdGVkIGZpZWxkcy4KKworLS0tLS0tLS0gODwgLS0tLS0tLS0tIEZGbXBlZyAzLjEgd2FzIGN1dCBoZXJlIC0tLS0tLS0tIDg8IC0tLS0tLS0tLQorCisyMDE2LTA2LTI2IC0gNDgxZjMyMCAvIDFjOWU4NjEgLSBsYXZ1IDU1LjI3LjEwMCAvIDU1LjEzLjAgLSBod2NvbnRleHQuaAorICBBZGQgYXZfaHdkZXZpY2VfY3R4X2NyZWF0ZSgpLgorCisyMDE2LTA2LTI2IC0gYjk1NTM0YiAvIGU0N2I4YmIgLSBsYXZjIDU3LjQ4LjEwMSAvIDU3LjE5LjEgLSBhdmNvZGVjLmgKKyAgQWRqdXN0IHZhbHVlcyBmb3IgSlBFRyAyMDAwIHByb2ZpbGVzLgorCisyMDE2LTA2LTIzIC0gNWQ3NWU0NiAvIGRiNzk2OGIgLSBsYXZmIDU3LjQwLjEwMCAvIDU3LjcuMCAtIGF2aW8uaAorICBBZGQgQVZJT0RhdGFNYXJrZXJUeXBlLCB3cml0ZV9kYXRhX3R5cGUsIGlnbm9yZV9ib3VuZGFyeV9wb2ludCBhbmQKKyAgYXZpb193cml0ZV9tYXJrZXIuCisKKzIwMTYtMDYtMjMgLSBhYmIzY2M0IC8gMGM0NDY4ZCAtIGxhdnUgNTUuMjYuMTAwIC8gNTUuMTIuMCAtIG9wdC5oCisgIEFkZCBhdl9zdGVyZW8zZF90eXBlX25hbWUoKSBhbmQgYXZfc3RlcmVvM2RfZnJvbV9uYW1lKCkuCisKKzIwMTYtMDYtMjIgLSAzNjg5ZWZlIC8gYzQ2ZGIzOCAtIGxhdnUgNTUuMjUuMTAwIC8gNTUuMTEuMCAtIGh3Y29udGV4dF9keHZhMi5oCisgIEFkZCBuZXcgaW5zdGFsbGVkIGhlYWRlciB3aXRoIERYVkEyLXNwZWNpZmljIGh3Y29udGV4dCBkZWZpbml0aW9ucy4KKworMjAxNi0wNC0yNyAtIGZiOTE4NzEgLSBsYXZ1IDU1LjIzLjEwMCAtIGxvZy5oCisgIEFkZCBhIG5ldyBmdW5jdGlvbiBhdl9sb2dfZm9ybWF0X2xpbmUyKCkgd2hpY2ggcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMKKyAgd3JpdHRlbiB0byB0aGUgdGFyZ2V0IGJ1ZmZlci4KKworMjAxNi0wNC0yMSAtIDdmYzMyOWUgLSBsYXZjIDU3LjM3LjEwMCAtIGF2Y29kZWMuaAorICBBZGQgYSBuZXcgYXVkaW8vdmlkZW8gZW5jb2RpbmcgYW5kIGRlY29kaW5nIEFQSSB3aXRoIGRlY291cGxlZCBpbnB1dAorICBhbmQgb3V0cHV0IC0tIGF2Y29kZWNfc2VuZF9wYWNrZXQoKSwgYXZjb2RlY19yZWNlaXZlX2ZyYW1lKCksCisgIGF2Y29kZWNfc2VuZF9mcmFtZSgpIGFuZCBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KCkuCisKKzIwMTYtMDQtMTcgLSBhZjljYWMxIC8gMzNkMTg5OCAtIGxhdmMgNTcuMzUuMTAwIC8gNTcuMTUuMCAtIGF2Y29kZWMuaAorICBBZGQgYSBuZXcgYml0c3RyZWFtIGZpbHRlcmluZyBBUEkgd29ya2luZyB3aXRoIEFWUGFja2V0cy4KKyAgRGVwcmVjYXRlIHRoZSBvbGQgYml0c3RyZWFtIGZpbHRlcmluZyBBUEkuCisKKzIwMTYtMDQtMTQgLSA4Njg4ZDNhIC8gMDdhODQ0ZiAtIGxhdmZpIDYuNDIuMTAwIC8gNi4zLjAgLSBhdmZpbHRlci5oCisgIEFkZCBBVkZpbHRlckNvbnRleHQuaHdfZGV2aWNlX2N0eC4KKworMjAxNi0wNC0xNCAtIDI4YWJiMjEgLyA1NTFjNjc3IC0gbGF2dSA1NS4yMi4xMDAgLyA1NS45LjAgLSBod2NvbnRleHRfdmFhcGkuaAorICBBZGQgbmV3IGluc3RhbGxlZCBoZWFkZXIgd2l0aCBWQUFQSS1zcGVjaWZpYyBod2NvbnRleHQgZGVmaW5pdGlvbnMuCisKKzIwMTYtMDQtMTQgLSBhZmNjZmFmIC8gYjFmMDFlOCAtIGxhdnUgNTUuMjEuMTAwIC8gNTUuNy4wIC0gaHdjb250ZXh0LmgKKyAgQWRkIEFWSFdGcmFtZXNDb25zdHJhaW50cyBhbmQgYXNzb2NpYXRlZCBBUEkuCisKKzIwMTYtMDQtMTEgLSA2ZjY5ZjdhIC8gOTIwMDUxNCAtIGxhdmYgNTcuMzMuMTAwIC8gNTcuNS4wIC0gYXZmb3JtYXQuaAorICBBZGQgQVZTdHJlYW0uY29kZWNwYXIsIGRlcHJlY2F0ZSBBVlN0cmVhbS5jb2RlYy4KKworMjAxNi0wNC0wMiAtIGU4YTliNjQgLSBsYXZ1IDU1LjIwLjEwMCAtIGJhc2U2NC5oCisgIEFkZCBBVl9CQVNFNjRfREVDT0RFX1NJWkUoeCkgbWFjcm8uCisKKzIwMTYteHgteHggLSBsYXZjIDU3LjMzLjEwMCAvIDU3LjE0LjAgLSBhdmNvZGVjLmgKKyAgZjliMWNmMSAvIDk5OGUxYjggLSBBZGQgQVZDb2RlY1BhcmFtZXRlcnMgYW5kIGl0cyByZWxhdGVkIEFQSS4KKyAgZTYwNTNiMyAvIGE4MDY4MzQgLSBBZGQgYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uMigpLgorCisyMDE2LTAzLTExIC0gNmQ4YWIzNSAtIGxhdmYvbGF2YyA1Ny4yOC4xMDEKKyAgQWRkIHJlcXVpcmVtZW50IHRvIGJpdHN0cmVhbSBmaWx0ZXJpbmcgQVBJIHRoYXQgcmV0dXJuZWQgcGFja2V0cyB3aXRoCisgIHNpemUgPT0gMCBhbmQgc2lkZV9kYXRhX2VsZW1zID09IDAgYXJlIHRvIGJlIHNraXBwZWQgYnkgdGhlIGNhbGxlci4KKworMjAxNi0wMy0wNCAtIDkzNjI5NzMgLSBsYXZmIDU3LjI4LjEwMAorICBBZGQgcHJvdG9jb2wgYmxhY2tsaXN0aW5nIEFQSQorCisyMDE2LTAyLTI4IC0gNGRkNGQ1MyAtIGxhdmMgNTcuMjcuMTAxCisgIFZhbGlkYXRlIEFWRnJhbWUgcmV0dXJuZWQgYnkgZ2V0X2J1ZmZlcjIgdG8gaGF2ZSByZXF1aXJlZAorICBwbGFuZXMgbm90IE5VTEwgYW5kIHVudXNlZCBwbGFuZXMgc2V0IHRvIE5VTEwgYXMgY3Jhc2hlcworICBhbmQgYnVmZmVyIG92ZXJmbG93IGFyZSBwb3NzaWJsZSB3aXRoIGNlcnRhaW4gc3RyZWFtcyBpZgorICB0aGF0IGlzIG5vdCB0aGUgY2FzZS4KKworMjAxNi0wMi0yNiAtIDMwZTc2ODUgLSBsYXZjIDU3LjI3LjEwMCAtIGF2Y29kZWMuaAorICAiZmxhZ3MyIiBkZWNvZGluZyBvcHRpb24gbm93IGFsbG93cyB0aGUgZmxhZyAiYXNzX3JvX2ZsdXNoX25vb3AiIHByZXZlbnRpbmcKKyAgdGhlIHJlc2V0IG9mIHRoZSBBU1MgUmVhZE9yZGVyIGZpZWxkIG9uIGZsdXNoLiBUaGlzIGFmZmVjdHMgdGhlIGNvbnRlbnQgb2YKKyAgQVZTdWJ0aXRsZXMucmVjdHNbTl0tPmFzcyB3aGVuICJzdWJfdGV4dF9mb3JtYXQiIGlzIHNldCB0byAiYXNzIiAoc2VlCisgIHByZXZpb3VzIGVudHJ5KS4KKworMjAxNi0wMi0yNiAtIDI5NDEyODIgLSBsYXZjIDU3LjI2LjEwMCAtIGF2Y29kZWMuaAorICBBZGQgYSAic3ViX3RleHRfZm9ybWF0IiBzdWJ0aXRsZXMgZGVjb2Rpbmcgb3B0aW9uIGFsbG93aW5nIHRoZSB2YWx1ZXMgImFzcyIKKyAgKHJlY29tbWVuZGVkKSBhbmQgImFzc193aXRoX3RpbWluZ3MiIChub3QgcmVjb21tZW5kZWQsIGRlcHJlY2F0ZWQsIGRlZmF1bHQpLgorICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBvcHRpb24gd2lsbCBjaGFuZ2UgdG8gImFzcyIgYXQgdGhlIG5leHQgbWFqb3IKKyAgbGliYXZjb2RlYyB2ZXJzaW9uIGJ1bXAuCisKKyAgVGhlIGN1cnJlbnQgZGVmYXVsdCBpcyAiYXNzX3dpdGhfdGltaW5ncyIgZm9yIGNvbXBhdGliaWxpdHkuIFRoaXMgbWVhbnMgdGhhdAorICBhbGwgc3VidGl0bGVzIHRleHQgZGVjb2RlcnMgY3VycmVudGx5IHN0aWxsIG91dHB1dCBBU1Mgd2l0aCB0aW1pbmdzIHByaW50ZWQKKyAgYXMgc3RyaW5ncyBpbiB0aGUgQVZTdWJ0aXRsZXMucmVjdHNbTl0tPmFzcyBmaWVsZHMuCisKKyAgU2V0dGluZyAic3ViX3RleHRfZm9ybWF0IiB0byAiYXNzIiBhbGxvd3MgYSBiZXR0ZXIgdGltaW5nIGFjY3VyYWN5IChBU1MKKyAgdGltaW5nIGlzIGxpbWl0ZWQgdG8gYSAxLzEwMCB0aW1lIGJhc2UsIHNvIHRoaXMgaXMgcmVsZXZhbnQgZm9yIGFueSBzdWJ0aXRsZXMKKyAgZm9ybWF0IG5lZWRpbmcgYSBiaWdnZXIgb25lKSwgZWFzZSB0aW1pbmcgYWRqdXN0bWVudHMsIGFuZCBwcmV2ZW50cyB0aGUgbmVlZAorICBvZiByZW1vdmluZyB0aGUgdGltaW5nIGZyb20gdGhlIGRlY29kZWQgc3RyaW5nIHlvdXJzZWxmLiBUaGlzIGZvcm0gaXMgYWxzbworICBrbm93biBhcyAidGhlIE1hdHJvc2thIGZvcm0iLiBUaGUgdGltaW5nIGluZm9ybWF0aW9uIChzdGFydCB0aW1lLCBkdXJhdGlvbikKKyAgY2FuIGJlIGZvdW5kIGluIHRoZSBBVlN1YnRpdGxlcyBmaWVsZHMuCisKKzIwMTYtMDItMjQgLSA3ZTQ5Y2RkIC8gN2IzMjE0ZDAgLSBsYXZjIDU3LjI1LjEwMCAvIDU3LjEzLjAgLSBhdmNvZGVjLmgKKyAgQWRkIEFWQ29kZWNDb250ZXh0Lmh3X2ZyYW1lc19jdHguCisKKzIwMTYtMDItMjQgLSAxMDQyNDAyIC8gYjNkZDMwZCAtIGxhdmZpIDYuMzYuMTAwIC8gNi4yLjAgLSBhdmZpbHRlci5oCisgIGF2ZmlsdGVyLmggLSBBZGQgQVZGaWx0ZXJMaW5rLmh3X2ZyYW1lc19jdHguCisgIGJ1ZmZlcnNyYy5oIC0gQWRkIEFWQnVmZmVyU3JjUGFyYW1ldGVycyBhbmQgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBpdC4KKworMjAxNi0wMi0yMyAtIDE0ZjdhM2QgLSBsYXZjIDU3LjI1LjEwMAorICBBZGQgQVZfUEtUX0RBVEFfTVBFR1RTX1NUUkVBTV9JRCBmb3IgZXhwb3J0aW5nIHRoZSBNUEVHVFMgc3RyZWFtIElELgorCisyMDE2LTAyLTE4IC0gMDhhY2FiOCAtIGxhdnUgNTUuMTguMTAwIC0gYXVkaW9fZmlmby5oCisgIEFkZCBhdl9hdWRpb19maWZvX3BlZWtfYXQoKS4KKworMjAxNi14eC14eCAtIGxhdnUgNTUuMTguMTAwIC8gNTUuNi4wCisgIDI2YWJkNTEgLyA3MjFhNGVmIGJ1ZmZlci5oIC0gQWRkIGF2X2J1ZmZlcl9wb29sX2luaXQyKCkuCisgIDFhNzA4NzggLyA4OTkyM2U0IGh3Y29udGV4dC5oIC0gQWRkIGEgbmV3IGluc3RhbGxlZCBoZWFkZXIgaHdjb250ZXh0Lmggd2l0aCBhIG5ldyBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBoYW5kbGluZyBod2FjY2VsIGZyYW1lcy4KKyAgNjk5MjI3NiAvIGFkODg0ZDEgaHdjb250ZXh0X2N1ZGEuaCAtIEFkZCBhIG5ldyBpbnN0YWxsZWQgaGVhZGVyIGh3Y29udGV4dF9jdWRhLmggd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVURBLXNwZWNpZmljIGh3Y29udGV4dCBkZWZpbml0aW9ucy4KKyAgZDc3OWQ4ZCAvIGEwMDFjZTMgaHdjb250ZXh0X3ZkcGF1LmggLSBBZGQgYSBuZXcgaW5zdGFsbGVkIGhlYWRlciBod2NvbnRleHRfdmRwYXUuaCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWRFBBVS1zcGVjaWZpYyBod2NvbnRleHQgZGVmaW5pdGlvbnMuCisgIDYzYzNlMzUgLyA3YmM3ODBjIHBpeGZtdC5oIC0gQWRkIEFWX1BJWF9GTVRfQ1VEQS4KKwogLS0tLS0tLS0gODwgLS0tLS0tLS0tIEZGbXBlZyAzLjAgd2FzIGN1dCBoZXJlIC0tLS0tLS0tIDg8IC0tLS0tLS0tLQogCiAyMDE2LTAyLTEwIC0gYmM5YTU5NiAvIDlmNjFhYmMgLSBsYXZmIDU3LjI1LjEwMCAvIDU3LjMuMCAtIGF2Zm9ybWF0LmgKQEAgLTMzMyw3ICs4ODksNyBAQAogICBBZGQgYXZfb3B0X2dldF9kaWN0X3ZhbC9zZXRfZGljdF92YWwgd2l0aCBBVl9PUFRfVFlQRV9ESUNUIHRvIHN1cHBvcnQKICAgZGljdGlvbmFyeSB0eXBlcyBiZWluZyBzZXQgYXMgb3B0aW9ucy4KIAotMjAxNC0wOC0xMyAtIGFmYmQ0YjggLSBsYXZmIDU2LjAxLjAgLSBhdmZvcm1hdC5oCisyMDE0LTA4LTEzIC0gYWZiZDRiN2UwOSAtIGxhdmYgNTYuMDEuMCAtIGF2Zm9ybWF0LmgKICAgQWRkIEFWRm9ybWF0Q29udGV4dC5ldmVudF9mbGFncyBhbmQgQVZTdHJlYW0uZXZlbnRfZmxhZ3MgZm9yIHNpZ25hbGluZyB0bwogICB0aGUgdXNlciB3aGVuIGV2ZW50cyBoYXBwZW4gaW4gdGhlIGZpbGUvc3RyZWFtLgogCkBAIC0zNTAsNyArOTA2LDcgQEAKIDIwMTQtMDgtMDggLSA1YzNjNjcxIC0gbGF2ZiA1NS41My4xMDAgLSBhdmlvLmgKICAgQWRkIGF2aW9fZmVvZigpIGFuZCBkZXByZWNhdGUgdXJsX2Zlb2YoKS4KIAotMjAxNC0wOC0wNyAtIGJiNzg5MDMgLSBsc3dzIDIuMS4zIC0gc3dzY2FsZS5oCisyMDE0LTA4LTA3IC0gYmI3ODkwMTZkNCAtIGxzd3MgMi4xLjMgLSBzd3NjYWxlLmgKICAgc3dzX2dldENvbnRleHQgaXMgbm90IGdvaW5nIHRvIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KIAogMjAxNC0wOC0wNyAtIGE1NjE2NjIgLyBhZDFlZTVmIC0gbGF2YyA1NS43My4xMDEgLyA1NS41Ny4zIC0gYXZjb2RlYy5oCkBAIC0xMDg0LDcgKzE2NDAsNyBAQAogICAgICAgICAgICAgICAgICogYmFzZSAtLSBpcyBub3cgc3RvcmVkIGluIEFWQnVmZmVyUmVmCiAgICAgICAgICAgICAgICAgKiByZWZlcmVuY2UsIHR5cGUsIGJ1ZmZlcl9oaW50cyAtLSBhcmUgdW5uZWNlc3NhcnkgaW4gdGhlIG5ldyBBUEkKICAgICAgICAgICAgICAgICAqIGh3YWNjZWxfcGljdHVyZV9wcml2YXRlLCBvd25lciwgdGhyZWFkX29wYXF1ZSAtLSBzaG91bGQgbm90Ci0gICAgICAgICAgICAgICAgICBoYXZlIGJlZW4gYWNlc3NlZCBmcm9tIG91dHNpZGUgb2YgbGF2YworICAgICAgICAgICAgICAgICAgaGF2ZSBiZWVuIGFjY2Vzc2VkIGZyb20gb3V0c2lkZSBvZiBsYXZjCiAgICAgICAgICAgICAgICAgKiBxc2NhbGVfdGFibGUsIHFzdHJpZGUsIHFzY2FsZV90eXBlLCBtYnNraXBfdGFibGUsIG1vdGlvbl92YWwsCiAgICAgICAgICAgICAgICAgICBtYl90eXBlLCBkY3RfY29lZmYsIHJlZl9pbmRleCAtLSBtcGVndmlkZW8tc3BlY2lmaWMgdGFibGVzLAogICAgICAgICAgICAgICAgICAgd2hpY2ggYXJlIG5vdCBleHBvcnRlZCBhbnltb3JlLgpkaWZmIC0tZ2l0IGEvZG9jL0RveHlmaWxlIGIvZG9jL0RveHlmaWxlCmluZGV4IDA3YjRkMWYuLjFjN2RlMmUgMTAwNjQ0Ci0tLSBhL2RvYy9Eb3h5ZmlsZQorKysgYi9kb2MvRG94eWZpbGUKQEAgLTEsMTAyICsxLDEyOSBAQAotIyBEb3h5ZmlsZSAxLjcuMQorIyBEb3h5ZmlsZSAxLjguOAogCiAjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCi0jIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdAorIyBkb3h5Z2VuICh3d3cuZG94eWdlbi5vcmcpIGZvciBhIHByb2plY3QuCiAjCi0jIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZAorIyBBbGwgdGV4dCBhZnRlciBhIGRvdWJsZSBoYXNoICgjIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIGlzIHBsYWNlZCBpbgorIyBmcm9udCBvZiB0aGUgVEFHIGl0IGlzIHByZWNlZGluZy4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBzaW5nbGUgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4KICMgVGhlIGZvcm1hdCBpczoKLSMgICAgICAgVEFHID0gdmFsdWUgW3ZhbHVlLCAuLi5dCi0jIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoKLSMgICAgICAgVEFHICs9IHZhbHVlIFt2YWx1ZSwgLi4uXQotIyBWYWx1ZXMgdGhhdCBjb250YWluIHNwYWNlcyBzaG91bGQgYmUgcGxhY2VkIGJldHdlZW4gcXVvdGVzICgiICIpCisjIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKLSMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbAotIyB0ZXh0IGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUKLSMgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUKLSMgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIHRoYXQgZm9sbG93LiBUaGUgZGVmYXVsdCBpcyBVVEYtOCB3aGljaCBpcyBhbHNvIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgdGV4dAorIyBiZWZvcmUgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhpcyB0YWcuIERveHlnZW4gdXNlcyBsaWJpY29udiAob3IgdGhlIGljb252CisjIGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udgorIyBmb3IgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCiAKIERPWFlGSUxFX0VOQ09ESU5HICAgICAgPSBVVEYtOAogCi0jIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIGEgc2VxdWVuY2Ugb2Ygd29yZHMgc3Vycm91bmRlZAotIyBieSBxdW90ZXMpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZSBwcm9qZWN0LgorIyBUaGUgUFJPSkVDVF9OQU1FIHRhZyBpcyBhIHNpbmdsZSB3b3JkIChvciBhIHNlcXVlbmNlIG9mIHdvcmRzIHN1cnJvdW5kZWQgYnkKKyMgZG91YmxlLXF1b3RlcywgdW5sZXNzIHlvdSBhcmUgdXNpbmcgRG94eXdpemFyZCkgdGhhdCBzaG91bGQgaWRlbnRpZnkgdGhlCisjIHByb2plY3QgZm9yIHdoaWNoIHRoZSBkb2N1bWVudGF0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBuYW1lIGlzIHVzZWQgaW4gdGhlCisjIHRpdGxlIG9mIG1vc3QgZ2VuZXJhdGVkIHBhZ2VzIGFuZCBpbiBhIGZldyBvdGhlciBwbGFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBNeSBQcm9qZWN0LgogCiBQUk9KRUNUX05BTUUgICAgICAgICAgID0gRkZtcGVnCiAKLSMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLgotIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yCi0jIGlmIHNvbWUgdmVyc2lvbiBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuIFRoaXMKKyMgY291bGQgYmUgaGFuZHkgZm9yIGFyY2hpdmluZyB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gb3IgaWYgc29tZSB2ZXJzaW9uCisjIGNvbnRyb2wgc3lzdGVtIGlzIHVzZWQuCiAKLVBST0pFQ1RfTlVNQkVSICAgICAgICAgPSAzLjAKK1BST0pFQ1RfTlVNQkVSICAgICAgICAgPSA0LjAuNAogCi0jIFdpdGggdGhlIFBST0pFQ1RfTE9HTyB0YWcgb25lIGNhbiBzcGVjaWZ5IGEgbG9nbyBvciBpY29uIHRoYXQgaXMgaW5jbHVkZWQKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NQotIyBwaXhlbHMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbAotIyBjb3B5IHRoZSBsb2dvIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBVc2luZyB0aGUgUFJPSkVDVF9CUklFRiB0YWcgb25lIGNhbiBwcm92aWRlIGFuIG9wdGlvbmFsIG9uZSBsaW5lIGRlc2NyaXB0aW9uCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXIgYQorIyBxdWljayBpZGVhIGFib3V0IHRoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0LiBLZWVwIHRoZSBkZXNjcmlwdGlvbiBzaG9ydC4KKworUFJPSkVDVF9CUklFRiAgICAgICAgICA9CisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYW4gbG9nbyBvciBpY29uIHRoYXQgaXMgaW5jbHVkZWQgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90IGV4Y2VlZCA1NSBwaXhlbHMKKyMgYW5kIHRoZSBtYXhpbXVtIHdpZHRoIHNob3VsZCBub3QgZXhjZWVkIDIwMCBwaXhlbHMuIERveHlnZW4gd2lsbCBjb3B5IHRoZSBsb2dvCisjIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorCiBQUk9KRUNUX0xPR08gICAgICAgICAgID0KIAotIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpCi0jIGJhc2UgcGF0aCB3aGVyZSB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSBwdXQuCi0jIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbgotIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCisjIFRoZSBPVVRQVVRfRElSRUNUT1JZIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIChyZWxhdGl2ZSBvciBhYnNvbHV0ZSkgcGF0aAorIyBpbnRvIHdoaWNoIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIHdyaXR0ZW4uIElmIGEgcmVsYXRpdmUgcGF0aCBpcworIyBlbnRlcmVkLCBpdCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZgorIyBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuCiAKIE9VVFBVVF9ESVJFQ1RPUlkgICAgICAgPSBkb2MvZG94eQogCi0jIElmIHRoZSBDUkVBVEVfU1VCRElSUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgY3JlYXRlCi0jIDQwOTYgc3ViLWRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQKLSMgZm9ybWF0IGFuZCB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLgotIyBFbmFibGluZyB0aGlzIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2YKLSMgc291cmNlIGZpbGVzLCB3aGVyZSBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkCi0jIG90aGVyd2lzZSBjYXVzZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorIyBJZiB0aGUgQ1JFQVRFX1NVQkRJUlMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZSA0MDk2IHN1Yi0KKyMgZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dCBmb3JtYXQgYW5kCisjIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIEVuYWJsaW5nIHRoaXMKKyMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZiBzb3VyY2UgZmlsZXMsIHdoZXJlCisjIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQgb3RoZXJ3aXNlIGNhdXNlcworIyBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIENSRUFURV9TVUJESVJTICAgICAgICAgPSBOTwogCisjIElmIHRoZSBBTExPV19VTklDT0RFX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWxsb3cgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgdG8gYXBwZWFyIGluIHRoZSBuYW1lcyBvZiBnZW5lcmF0ZWQgZmlsZXMuIElmIHNldCB0byBOTywgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgd2lsbCBiZSBlc2NhcGVkLCBmb3IgZXhhbXBsZSBfeEUzX3g4MV94ODQgd2lsbCBiZSB1c2VkIGZvciBVbmljb2RlCisjIFUrMzA0NC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTExPV19VTklDT0RFX05BTUVTICAgID0gTk8KKwogIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAogIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcwogIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCi0jIFRoZSBkZWZhdWx0IGxhbmd1YWdlIGlzIEVuZ2xpc2gsIG90aGVyIHN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOgotIyBBZnJpa2FhbnMsIEFyYWJpYywgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLCBDaGluZXNlLVRyYWRpdGlvbmFsLAotIyBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVzcGVyYW50bywgRmFyc2ksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLAotIyBHcmVlaywgSHVuZ2FyaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaAotIyBtZXNzYWdlcyksIEtvcmVhbiwgS29yZWFuLWVuLCBMaXRodWFuaWFuLCBOb3J3ZWdpYW4sIE1hY2Vkb25pYW4sIFBlcnNpYW4sCi0jIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxpYywgU2xvdmFrLAotIyBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBVa3JhaW5pYW4sIGFuZCBWaWV0bmFtZXNlLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBBZnJpa2FhbnMsIEFyYWJpYywgQXJtZW5pYW4sIEJyYXppbGlhbiwgQ2F0YWxhbiwgQ2hpbmVzZSwKKyMgQ2hpbmVzZS1UcmFkaXRpb25hbCwgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSwKKyMgRXNwZXJhbnRvLCBGYXJzaSAoUGVyc2lhbiksIEZpbm5pc2gsIEZyZW5jaCwgR2VybWFuLCBHcmVlaywgSHVuZ2FyaWFuLAorIyBJbmRvbmVzaWFuLCBJdGFsaWFuLCBKYXBhbmVzZSwgSmFwYW5lc2UtZW4gKEphcGFuZXNlIHdpdGggRW5nbGlzaCBtZXNzYWdlcyksCisjIEtvcmVhbiwgS29yZWFuLWVuIChLb3JlYW4gd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwgTGF0dmlhbiwgTGl0aHVhbmlhbiwKKyMgTWFjZWRvbmlhbiwgTm9yd2VnaWFuLCBQZXJzaWFuIChGYXJzaSksIFBvbGlzaCwgUG9ydHVndWVzZSwgUm9tYW5pYW4sIFJ1c3NpYW4sCisjIFNlcmJpYW4sIFNlcmJpYW4tQ3lyaWxsaWMsIFNsb3ZhaywgU2xvdmVuZSwgU3BhbmlzaCwgU3dlZGlzaCwgVHVya2lzaCwKKyMgVWtyYWluaWFuIGFuZCBWaWV0bmFtZXNlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRW5nbGlzaC4KIAogT1VUUFVUX0xBTkdVQUdFICAgICAgICA9IEVuZ2xpc2gKIAotIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwKLSMgaW5jbHVkZSBicmllZiBtZW1iZXIgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbgotIyB0aGUgZmlsZSBhbmQgY2xhc3MgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhRG9jKS4KLSMgU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgSWYgdGhlIEJSSUVGX01FTUJFUl9ERVNDIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBpbmNsdWRlIGJyaWVmIG1lbWJlcgorIyBkZXNjcmlwdGlvbnMgYWZ0ZXIgdGhlIG1lbWJlcnMgdGhhdCBhcmUgbGlzdGVkIGluIHRoZSBmaWxlIGFuZCBjbGFzcworIyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFkb2MpLiBTZXQgdG8gTk8gdG8gZGlzYWJsZSB0aGlzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTCiAKLSMgSWYgdGhlIFJFUEVBVF9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbCBwcmVwZW5kCi0jIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLgotIyBOb3RlOiBpZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQogIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIFJFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKIAotIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IKLSMgdGhhdCBpcyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcKLSMgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZCBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZQotIyBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0IGFuZCB0aGUgcmVzdWx0IGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzCi0jIHVzZWQgYXMgdGhlIGFubm90YXRlZCB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLgotIyBJZiBsZWZ0IGJsYW5rLCB0aGUgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoIiRuYW1lIiBpcyBhdXRvbWF0aWNhbGx5Ci0jIHJlcGxhY2VkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGVudGl0eSk6ICJUaGUgJG5hbWUgY2xhc3MiICJUaGUgJG5hbWUgd2lkZ2V0IgotIyAiVGhlICRuYW1lIGZpbGUiICJpcyIgInByb3ZpZGVzIiAic3BlY2lmaWVzIiAiY29udGFpbnMiCi0jICJyZXByZXNlbnRzIiAiYSIgImFuIiAidGhlIgorIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCiAKIEFCQlJFVklBVEVfQlJJRUYgICAgICAgPQogCiAjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KLSMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZXRhaWxlZCBzZWN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMgb25seSBhIGJyaWVmCiAjIGRlc2NyaXB0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIEFMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTwogCkBAIC0xMDQsMTUzICsxMzEsMjA3IEBACiAjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQogIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAogIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KIAotIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwKLSMgcGF0aCBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQKLSMgdG8gTk8gdGhlIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQuCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGZ1bGwgcGF0aAorIyBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlCisjIHNob3J0ZXN0IHBhdGggdGhhdCBtYWtlcyB0aGUgZmlsZSBuYW1lIHVuaXF1ZSB3aWxsIGJlIHVzZWQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogRlVMTF9QQVRIX05BTUVTICAgICAgICA9IFlFUwogCi0jIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgU1RSSVBfRlJPTV9QQVRIIHRhZwotIyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLiBTdHJpcHBpbmcgaXMKLSMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kIHBhcnQgb2YKLSMgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgotIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZQotIyBwYXRoIHRvIHN0cmlwLgorIyBUaGUgU1RSSVBfRlJPTV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLgorIyBTdHJpcHBpbmcgaXMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kCisjIHBhcnQgb2YgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZSBwYXRoIHRvCisjIHN0cmlwLgorIworIyBOb3RlIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvIHJlbGF0aXZlIHBhdGhzLCB3aGljaAorIyB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzIHN0YXJ0ZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBGVUxMX1BBVEhfTkFNRVMgaXMgc2V0IHRvIFlFUy4KIAogU1RSSVBfRlJPTV9QQVRIICAgICAgICA9IC4KIAotIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZgotIyB0aGUgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMKLSMgdGhlIHJlYWRlciB3aGljaCBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLgotIyBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzCi0jIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQgc3BlY2lmeSB0aGUgaW5jbHVkZSBwYXRocyB0aGF0Ci0jIGFyZSBub3JtYWxseSBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyIHVzaW5nIHRoZSAtSSBmbGFnLgorIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCiAKLVNUUklQX0ZST01fSU5DX1BBVEggICAgPQorU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9IC4KIAotIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIKLSMgKGJ1dCBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMKLSMgZG9lc24ndCBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBJZiB0aGUgU0hPUlRfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBtdWNoIHNob3J0ZXIgKGJ1dAorIyBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaXMgeW91ciBmaWxlIHN5c3RlbXMgZG9lc24ndAorIyBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIFNIT1JUX05BTUVTICAgICAgICAgICAgPSBOTwogCi0jIElmIHRoZSBKQVZBRE9DX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4KLSMgd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YURvYy1zdHlsZQotIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgSmF2YURvYwotIyBjb21tZW50cyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cwotIyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQorIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZQorIyBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFkb2Mtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFkb2Mtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtCisjIHN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZgorIyBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IFlFUwogCi0jIElmIHRoZSBRVF9BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwKLSMgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIFF0LXN0eWxlCi0jIGNvbW1lbnQgYXMgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBjb21tZW50cwotIyB3aWxsIGJlaGF2ZSBqdXN0IGxpa2UgcmVndWxhciBRdC1zdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcKLSMgYW4gZXhwbGljaXQgXGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQorIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKKyMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKKyMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKKyMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBRVF9BVVRPQlJJRUYgICAgICAgICAgID0gTk8KIAotIyBUaGUgTVVMVElMSU5FX0NQUF9JU19CUklFRiB0YWcgY2FuIGJlIHNldCB0byBZRVMgdG8gbWFrZSBEb3h5Z2VuCi0jIHRyZWF0IGEgbXVsdGktbGluZSBDKysgc3BlY2lhbCBjb21tZW50IGJsb2NrIChpLmUuIGEgYmxvY2sgb2YgLy8hIG9yIC8vLwotIyBjb21tZW50cykgYXMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4KLSMgVGhlIG5ldyBkZWZhdWx0IGlzIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkCi0jIGRlc2NyaXB0aW9uLiBTZXQgdGhpcyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvdXIgaW5zdGVhZC4KKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTwogCi0jIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGFuIHVuZG9jdW1lbnRlZAotIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdAotIyByZS1pbXBsZW1lbnRzLgorIyBJZiB0aGUgSU5IRVJJVF9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYW4gdW5kb2N1bWVudGVkIG1lbWJlciBpbmhlcml0cyB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmcm9tIGFueSBkb2N1bWVudGVkIG1lbWJlciB0aGF0IGl0IHJlLWltcGxlbWVudHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIElOSEVSSVRfRE9DUyAgICAgICAgICAgPSBZRVMKIAotIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlCi0jIGEgbmV3IHBhZ2UgZm9yIGVhY2ggbWVtYmVyLiBJZiBzZXQgdG8gTk8sIHRoZSBkb2N1bWVudGF0aW9uIG9mIGEgbWVtYmVyIHdpbGwKLSMgYmUgcGFydCBvZiB0aGUgZmlsZS9jbGFzcy9uYW1lc3BhY2UgdGhhdCBjb250YWlucyBpdC4KKyMgSWYgdGhlIFNFUEFSQVRFX01FTUJFUl9QQUdFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhCisjIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlCisjIHBhcnQgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCiAKLSMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuCi0jIERveHlnZW4gdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KIAotVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA0CiAKLSMgVGhpcyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIG51bWJlciBvZiBhbGlhc2VzIHRoYXQgYWN0cwotIyBhcyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4KLSMgRm9yIGV4YW1wbGUgYWRkaW5nICJzaWRlZWZmZWN0PVxwYXIgU2lkZSBFZmZlY3RzOlxuIiB3aWxsIGFsbG93IHlvdSB0bwotIyBwdXQgdGhlIGNvbW1hbmQgXHNpZGVlZmZlY3QgKG9yIEBzaWRlZWZmZWN0KSBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgd2hpY2gKLSMgd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZyAiU2lkZSBFZmZlY3RzOiIuCi0jIFlvdSBjYW4gcHV0IFxuJ3MgaW4gdGhlIHZhbHVlIHBhcnQgb2YgYW4gYWxpYXMgdG8gaW5zZXJ0IG5ld2xpbmVzLgorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCiAKIEFMSUFTRVMgICAgICAgICAgICAgICAgPQogCi0jIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0ZPUl9DIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEMKLSMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvciBDLgotIyBGb3IgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0Ci0jIG9mIGFsbCBtZW1iZXJzIHdpbGwgYmUgb21pdHRlZCwgZXRjLgorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCisjIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKKyMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gWUVTCiAKLSMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhCi0jIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IKLSMgSmF2YS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLCBxdWFsaWZpZWQKLSMgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCiAKICMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCi0jIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IKLSMgRm9ydHJhbi4KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCiAKICMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCi0jIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvcgotIyBWSERMLgorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KIAogIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0Ci0jIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuIGV4dGVuc2lvbi4KLSMgRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQgdXNpbmcgdGhpcwotIyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kIGxhbmd1YWdlCi0jIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LCBDU2hhcnAsIEMsCi0jIEMrKywgRCwgUEhQLCBPYmplY3RpdmUtQywgUHl0aG9uLCBGb3J0cmFuLCBWSERMLCBDLCBDKysuIEZvciBpbnN0YW5jZSB0byBtYWtlCi0jIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDCi0jIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4gTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucwotIyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4gKGZpeGVkIGZvcm1hdCBGb3J0cmFuOgorIyBGb3J0cmFuRml4ZWQsIGZyZWUgZm9ybWF0dGVkIEZvcnRyYW46IEZvcnRyYW5GcmVlLCB1bmtub3duIGZvcm1hdHRlZCBGb3J0cmFuOgorIyBGb3J0cmFuLiBJbiB0aGUgbGF0ZXIgY2FzZSB0aGUgcGFyc2VyIHRyaWVzIHRvIGd1ZXNzIHdoZXRoZXIgdGhlIGNvZGUgaXMgZml4ZWQKKyMgb3IgZnJlZSBmb3JtYXR0ZWQgY29kZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgRm9ydHJhbiB0eXBlIGZpbGVzKSwgVkhETC4gRm9yCisjIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQgaXMgUEhQKSwKKyMgYW5kIC5mIGZpbGVzIGFzIEMgKGRlZmF1bHQgaXMgRm9ydHJhbiksIHVzZTogaW5jPUZvcnRyYW4gZj1DLgorIworIyBOb3RlIEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQorIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCiAKIEVYVEVOU0lPTl9NQVBQSU5HICAgICAgPQogCisjIElmIHRoZSBNQVJLRE9XTl9TVVBQT1JUIHRhZyBpcyBlbmFibGVkIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbCBjb21tZW50cworIyBhY2NvcmRpbmcgdG8gdGhlIE1hcmtkb3duIGZvcm1hdCwgd2hpY2ggYWxsb3dzIGZvciBtb3JlIHJlYWRhYmxlCisjIGRvY3VtZW50YXRpb24uIFNlZSBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duLyBmb3IgZGV0YWlscy4KKyMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdSBjYW4KKyMgbWl4IGRveHlnZW4sIEhUTUwsIGFuZCBYTUwgY29tbWFuZHMgd2l0aCBNYXJrZG93biBmb3JtYXR0aW5nLiBEaXNhYmxlIG9ubHkgaW4KKyMgY2FzZSBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXRpZXMgaXNzdWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitNQVJLRE9XTl9TVVBQT1JUICAgICAgID0gWUVTCisKKyMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZAorIyBjbGFzc2VzLCBvciBuYW1lc3BhY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnRhdGlvbi4gU3VjaCBhIGxpbmsgY2FuCisjIGJlIHByZXZlbnRlZCBpbiBpbmRpdmlkdWFsIGNhc2VzIGJ5IGJ5IHB1dHRpbmcgYSAlIHNpZ24gaW4gZnJvbnQgb2YgdGhlIHdvcmQKKyMgb3IgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitBVVRPTElOS19TVVBQT1JUICAgICAgID0gWUVTCisKICMgSWYgeW91IHVzZSBTVEwgY2xhc3NlcyAoaS5lLiBzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3IsIGV0Yy4pIGJ1dCBkbyBub3Qgd2FudAotIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQKLSMgc2V0IHRoaXMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZAotIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsgdi5zLgotIyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgorIyB0byBpbmNsdWRlIChhIHRhZyBmaWxlIGZvcikgdGhlIFNUTCBzb3VyY2VzIGFzIGlucHV0LCB0aGVuIHlvdSBzaG91bGQgc2V0IHRoaXMKKyMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZAorIyBkZWZpbml0aW9ucyB3aG9zZSBhcmd1bWVudHMgY29udGFpbiBTVEwgY2xhc3NlcyAoZS5nLiBmdW5jKHN0ZDo6c3RyaW5nKTsKKyMgdmVyc3VzIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2UgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uCiAjIGRpYWdyYW1zIHRoYXQgaW52b2x2ZSBTVEwgY2xhc3NlcyBtb3JlIGNvbXBsZXRlIGFuZCBhY2N1cmF0ZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBCVUlMVElOX1NUTF9TVVBQT1JUICAgID0gTk8KIAogIyBJZiB5b3UgdXNlIE1pY3Jvc29mdCdzIEMrKy9DTEkgbGFuZ3VhZ2UsIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0bwogIyBlbmFibGUgcGFyc2luZyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIENQUF9DTElfU1VQUE9SVCAgICAgICAgPSBOTwogCi0jIFNldCB0aGUgU0lQX1NVUFBPUlQgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2Ygc2lwIHNvdXJjZXMgb25seS4KLSMgRG94eWdlbiB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljCi0jIGluc3RlYWQgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgorIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCAoc2VlOgorIyBodHRwOi8vd3d3LnJpdmVyYmFua2NvbXB1dGluZy5jby51ay9zb2Z0d2FyZS9zaXAvaW50cm8pIHNvdXJjZXMgb25seS4gRG94eWdlbgorIyB3aWxsIHBhcnNlIHRoZW0gbGlrZSBub3JtYWwgQysrIGJ1dCB3aWxsIGFzc3VtZSBhbGwgY2xhc3NlcyB1c2UgcHVibGljIGluc3RlYWQKKyMgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIFNJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTwogCi0jIEZvciBNaWNyb3NvZnQncyBJREwgdGhlcmUgYXJlIHByb3BnZXQgYW5kIHByb3BwdXQgYXR0cmlidXRlcyB0byBpbmRpY2F0ZSBnZXR0ZXIKLSMgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIFlFUyAodGhlIGRlZmF1bHQpCi0jIHdpbGwgbWFrZSBkb3h5Z2VuIHRvIHJlcGxhY2UgdGhlIGdldCBhbmQgc2V0IG1ldGhvZHMgYnkgYSBwcm9wZXJ0eSBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbi4gVGhpcyB3aWxsIG9ubHkgd29yayBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3IKLSMgc2V0dGluZyBhIHNpbXBsZSB0eXBlLiBJZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSwgb3IgeW91IHdhbnQgdG8gc2hvdyB0aGUKLSMgbWV0aG9kcyBhbnl3YXksIHlvdSBzaG91bGQgc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKKyMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCisjIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCisjIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91CisjIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIElETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKIApAQCAtMjU4LDM3MSArMzM5LDQ3MCBAQAogIyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgcmV1c2UgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGZpcnN0CiAjIG1lbWJlciBpbiB0aGUgZ3JvdXAgKGlmIGFueSkgZm9yIHRoZSBvdGhlciBtZW1iZXJzIG9mIHRoZSBncm91cC4gQnkgZGVmYXVsdAogIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIERJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTwogCi0jIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YKLSMgdGhlIHNhbWUgdHlwZSAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEKLSMgc3ViZ3JvdXAgb2YgdGhhdCB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8KLSMgTk8gdG8gcHJldmVudCBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcKLSMgdGhlIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFNldCB0aGUgU1VCR1JPVVBJTkcgdGFnIHRvIFlFUyB0byBhbGxvdyBjbGFzcyBtZW1iZXIgZ3JvdXBzIG9mIHRoZSBzYW1lIHR5cGUKKyMgKGZvciBpbnN0YW5jZSBhIGdyb3VwIG9mIHB1YmxpYyBmdW5jdGlvbnMpIHRvIGJlIHB1dCBhcyBhIHN1Ymdyb3VwIG9mIHRoYXQKKyMgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvIE5PIHRvIHByZXZlbnQKKyMgc3ViZ3JvdXBpbmcuIEFsdGVybmF0aXZlbHksIHRoaXMgY2FuIGJlIGRvbmUgcGVyIGNsYXNzIHVzaW5nIHRoZQorIyBcbm9zdWJncm91cGluZyBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBTVUJHUk9VUElORyAgICAgICAgICAgID0gWUVTCiAKLSMgV2hlbiBUWVBFREVGX0hJREVTX1NUUlVDVCBpcyBlbmFibGVkLCBhIHR5cGVkZWYgb2YgYSBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtCi0jIGlzIGRvY3VtZW50ZWQgYXMgc3RydWN0LCB1bmlvbiwgb3IgZW51bSB3aXRoIHRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmLiBTbworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCiAjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAogIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAotIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkKLSMgYmUgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgbmFtZXNwYWNlLCBvciBjbGFzcy4gQW5kIHRoZSBzdHJ1Y3Qgd2lsbCBiZSBuYW1lZCBUeXBlUy4gVGhpcyBjYW4gdHlwaWNhbGx5IGJlCisjIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kCiAjIHR5cGVzIGFyZSB0eXBlZGVmJ2VkIGFuZCBvbmx5IHRoZSB0eXBlZGVmIGlzIHJlZmVyZW5jZWQsIG5ldmVyIHRoZSB0YWcgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBUWVBFREVGX0hJREVTX1NUUlVDVCAgID0gWUVTCiAKLSMgVGhlIFNZTUJPTF9DQUNIRV9TSVpFIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGNhY2hlIHVzZSB0bwotIyBkZXRlcm1pbmUgd2hpY2ggc3ltYm9scyB0byBrZWVwIGluIG1lbW9yeSBhbmQgd2hpY2ggdG8gZmx1c2ggdG8gZGlzay4KLSMgV2hlbiB0aGUgY2FjaGUgaXMgZnVsbCwgbGVzcyBvZnRlbiB1c2VkIHN5bWJvbHMgd2lsbCBiZSB3cml0dGVuIHRvIGRpc2suCi0jIEZvciBzbWFsbCB0byBtZWRpdW0gc2l6ZSBwcm9qZWN0cyAoPDEwMDAgaW5wdXQgZmlsZXMpIHRoZSBkZWZhdWx0IHZhbHVlIGlzCi0jIHByb2JhYmx5IGdvb2QgZW5vdWdoLiBGb3IgbGFyZ2VyIHByb2plY3RzIGEgdG9vIHNtYWxsIGNhY2hlIHNpemUgY2FuIGNhdXNlCi0jIGRveHlnZW4gdG8gYmUgYnVzeSBzd2FwcGluZyBzeW1ib2xzIHRvIGFuZCBmcm9tIGRpc2sgbW9zdCBvZiB0aGUgdGltZQotIyBjYXVzaW5nIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgcGVuYWxpdHkuCi0jIElmIHRoZSBzeXN0ZW0gaGFzIGVub3VnaCBwaHlzaWNhbCBtZW1vcnkgaW5jcmVhc2luZyB0aGUgY2FjaGUgd2lsbCBpbXByb3ZlIHRoZQotIyBwZXJmb3JtYW5jZSBieSBrZWVwaW5nIG1vcmUgc3ltYm9scyBpbiBtZW1vcnkuIE5vdGUgdGhhdCB0aGUgdmFsdWUgd29ya3Mgb24KLSMgYSBsb2dhcml0aG1pYyBzY2FsZSBzbyBpbmNyZWFzaW5nIHRoZSBzaXplIGJ5IG9uZSB3aWxsIHJvdWdobHkgZG91YmxlIHRoZQotIyBtZW1vcnkgdXNhZ2UuIFRoZSBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYToKLSMgMl4oMTYrU1lNQk9MX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwKLSMgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNiA9IDY1NTM2IHN5bWJvbHMKKyMgVGhlIHNpemUgb2YgdGhlIHN5bWJvbCBsb29rdXAgY2FjaGUgY2FuIGJlIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcworIyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbiB0aGVpciBuYW1lIGFuZCBzY29wZS4gU2luY2UgdGhpcyBjYW4gYmUKKyMgYW4gZXhwZW5zaXZlIHByb2Nlc3MgYW5kIG9mdGVuIHRoZSBzYW1lIHN5bWJvbCBhcHBlYXJzIG11bHRpcGxlIHRpbWVzIGluIHRoZQorIyBjb2RlLCBkb3h5Z2VuIGtlZXBzIGEgY2FjaGUgb2YgcHJlLXJlc29sdmVkIHN5bWJvbHMuIElmIHRoZSBjYWNoZSBpcyB0b28gc21hbGwKKyMgZG94eWdlbiB3aWxsIGJlY29tZSBzbG93ZXIuIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZQorIyBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMgZm9ybXVsYTogMl4oMTYrTE9PS1VQX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UKKyMgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwgY29ycmVzcG9uZGluZyB0byBhIGNhY2hlIHNpemUgb2YgMl4xNj02NTUzNgorIyBzeW1ib2xzLiBBdCB0aGUgZW5kIG9mIGEgcnVuIGRveHlnZW4gd2lsbCByZXBvcnQgdGhlIGNhY2hlIHVzYWdlIGFuZCBzdWdnZXN0CisjIHRoZSBvcHRpbWFsIGNhY2hlIHNpemUgZnJvbSBhIHNwZWVkIHBvaW50IG9mIHZpZXcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDksIGRlZmF1bHQgdmFsdWU6IDAuCiAKLVNZTUJPTF9DQUNIRV9TSVpFICAgICAgPSAwCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCi0jIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLgotIyBQcml2YXRlIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzCi0jIHRoZSBFWFRSQUNUX1BSSVZBVEUgYW5kIEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMKKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKKyMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCisjIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKKyMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIEVYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKIAotIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcwotIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBwcml2YXRlIG1lbWJlcnMgb2YgYSBjbGFzcyB3aWxsCisjIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIEVYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBZRVMKIAotIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMgYWxsIHN0YXRpYyBtZW1iZXJzIG9mIGEgZmlsZQotIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBtZW1iZXJzIHdpdGggcGFja2FnZSBvciBpbnRlcm5hbAorIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBOTworCisjIElmIHRoZSBFWFRSQUNUX1NUQVRJQyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgc3RhdGljIG1lbWJlcnMgb2YgYSBmaWxlIHdpbGwgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IFlFUwogCi0jIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpCi0jIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgSWYgc2V0IHRvIE5PIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuCisjIElmIHRoZSBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMgY2xhc3NlcyAoYW5kIHN0cnVjdHMpIGRlZmluZWQKKyMgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIE5PCisjIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuIERvZXMgbm90IGhhdmUgYW55IGVmZmVjdAorIyBmb3IgSmF2YSBzb3VyY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCiAKLSMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBXaGVuIHNldCB0byBZRVMgbG9jYWwKLSMgbWV0aG9kcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlY3Rpb24gYnV0IG5vdCBpbgotIyB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KLSMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlIGluY2x1ZGVkLgorIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8gb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIEVYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTwogCiAjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlCiAjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZAotIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlCi0jIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdAotIyBhbm9ueW1vdXMgbmFtZXNwYWNlIGFyZSBoaWRkZW4uCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UgbmFtZSBvZgorIyB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlLiBCeSBkZWZhdWx0IGFub255bW91cyBuYW1lc3BhY2UKKyMgYXJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8KIAotIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwKLSMgdW5kb2N1bWVudGVkIG1lbWJlcnMgb2YgZG9jdW1lbnRlZCBjbGFzc2VzLCBmaWxlcyBvciBuYW1lc3BhY2VzLgotIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlCi0jIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGlzIGdlbmVyYXRlZC4KLSMgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorIyBJZiB0aGUgSElERV9VTkRPQ19NRU1CRVJTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgaW5zaWRlIGRvY3VtZW50ZWQgY2xhc3NlcyBvciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIG1lbWJlcnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLiBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogSElERV9VTkRPQ19NRU1CRVJTICAgICA9IE5PCiAKLSMgSWYgdGhlIEhJREVfVU5ET0NfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgRG94eWdlbiB3aWxsIGhpZGUgYWxsCi0jIHVuZG9jdW1lbnRlZCBjbGFzc2VzIHRoYXQgYXJlIG5vcm1hbGx5IHZpc2libGUgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4KLSMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzCi0jIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJZiBzZXQKKyMgdG8gTk8gdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cy4gVGhpcyBvcHRpb24gaGFzCisjIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIEhJREVfVU5ET0NfQ0xBU1NFUyAgICAgPSBOTwogCi0jIElmIHRoZSBISURFX0ZSSUVORF9DT01QT1VORFMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbAotIyBmcmllbmQgKGNsYXNzfHN0cnVjdHx1bmlvbikgZGVjbGFyYXRpb25zLgotIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUKLSMgZG9jdW1lbnRhdGlvbi4KKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTyB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KIAotIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFueQotIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4KLSMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgYmxvY2tzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlCi0jIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4KKyMgSWYgdGhlIEhJREVfSU5fQk9EWV9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbnkKKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uIElmIHNldCB0byBOTyB0aGVzZQorIyBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIEhJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTwogCi0jIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24KLSMgdGhhdCBpcyB0eXBlZCBhZnRlciBhIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldAotIyB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gdGhlIGRvY3VtZW50YXRpb24gd2lsbCBiZSBleGNsdWRlZC4KLSMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgSU5URVJOQUxfRE9DUyB0YWcgZGV0ZXJtaW5lcyBpZiBkb2N1bWVudGF0aW9uIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYQorIyBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiB0aGUgZG9jdW1lbnRhdGlvbgorIyB3aWxsIGJlIGV4Y2x1ZGVkLiBTZXQgaXQgdG8gWUVTIHRvIGluY2x1ZGUgdGhlIGludGVybmFsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogSU5URVJOQUxfRE9DUyAgICAgICAgICA9IE5PCiAKLSMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIERveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlCi0jIGZpbGUgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgYWxzbworIyBJZiB0aGUgQ0FTRV9TRU5TRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIG9ubHkgZ2VuZXJhdGUgZmlsZQorIyBuYW1lcyBpbiBsb3dlci1jYXNlIGxldHRlcnMuIElmIHNldCB0byBZRVMgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZSBhbHNvCiAjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXIKICMgaW4gY2FzZSBhbmQgaWYgeW91ciBmaWxlIHN5c3RlbSBzdXBwb3J0cyBjYXNlIHNlbnNpdGl2ZSBmaWxlIG5hbWVzLiBXaW5kb3dzCiAjIGFuZCBNYWMgdXNlcnMgYXJlIGFkdmlzZWQgdG8gc2V0IHRoaXMgb3B0aW9uIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogc3lzdGVtIGRlcGVuZGVudC4KIAogQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUwogCi0jIElmIHRoZSBISURFX1NDT1BFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVuIERveHlnZW4KLSMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZQotIyBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZSBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IG1lbWJlcnMgd2l0aAorIyB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gWUVTIHRoZQorIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBISURFX1NDT1BFX05BTUVTICAgICAgID0gTk8KIAotIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuCi0jIHdpbGwgcHV0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uCi0jIG9mIHRoYXQgZmlsZS4KKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCisjIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCiAKLSMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbgotIyB3aWxsIGxpc3QgaW5jbHVkZSBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24KLSMgcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKyMgSWYgdGhlIFNIT1dfR1JPVVBFRF9NRU1CX0lOQyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBhZGQgZm9yIGVhY2gKKyMgZ3JvdXBlZCBtZW1iZXIgYW4gaW5jbHVkZSBzdGF0ZW1lbnQgdG8gdGhlIGRvY3VtZW50YXRpb24sIHRlbGxpbmcgdGhlIHJlYWRlcgorIyB3aGljaCBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIHRoZSBtZW1iZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQorIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KIAotIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGEgdGFnIFtpbmxpbmVdCi0jIGlzIGluc2VydGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4KKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCiAKLSMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGVuIGRveHlnZW4KLSMgd2lsbCBzb3J0IHRoZSAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycwotIyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluCi0jIGRlY2xhcmF0aW9uIG9yZGVyLgorIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBTT1JUX01FTUJFUl9ET0NTICAgICAgID0gTk8KIAotIyBJZiB0aGUgU09SVF9CUklFRl9ET0NTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCi0jIGJyaWVmIGRvY3VtZW50YXRpb24gb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5Ci0jIGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbgotIyBkZWNsYXJhdGlvbiBvcmRlci4KKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBicmllZgorIyBkZXNjcmlwdGlvbnMgb2YgZmlsZSwgbmFtZXNwYWNlIGFuZCBjbGFzcyBtZW1iZXJzIGFscGhhYmV0aWNhbGx5IGJ5IG1lbWJlcgorIyBuYW1lLiBJZiBzZXQgdG8gTk8gdGhlIG1lbWJlcnMgd2lsbCBhcHBlYXIgaW4gZGVjbGFyYXRpb24gb3JkZXIuIE5vdGUgdGhhdAorIyB0aGlzIHdpbGwgYWxzbyBpbmZsdWVuY2UgdGhlIG9yZGVyIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBjbGFzcyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIFNPUlRfQlJJRUZfRE9DUyAgICAgICAgPSBOTwogCi0jIElmIHRoZSBTT1JUX01FTUJFUlNfQ1RPUlNfMVNUIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgotIyB3aWxsIHNvcnQgdGhlIChicmllZiBhbmQgZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgY2xhc3MgbWVtYmVycyBzbyB0aGF0Ci0jIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKLSMgdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieQotIyBTT1JUX01FTUJFUl9ET0NTIGFuZCBTT1JUX0JSSUVGX0RPQ1MuCi0jIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PCi0jIGFuZCBpZ25vcmVkIGZvciBkZXRhaWxlZCBkb2NzIGlmIFNPUlRfTUVNQkVSX0RPQ1MgaXMgc2V0IHRvIE5PLgorIyBJZiB0aGUgU09SVF9NRU1CRVJTX0NUT1JTXzFTVCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdCBjb25zdHJ1Y3RvcnMgYW5kCisjIGRlc3RydWN0b3JzIGFyZSBsaXN0ZWQgZmlyc3QuIElmIHNldCB0byBOTyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZQorIyByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5IFNPUlRfQlJJRUZfRE9DUyBhbmQgU09SVF9NRU1CRVJfRE9DUy4KKyMgTm90ZTogSWYgU09SVF9CUklFRl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nIGJyaWVmCisjIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBOb3RlOiBJZiBTT1JUX01FTUJFUl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nCisjIGRldGFpbGVkIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTwogCi0jIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlCi0jIGhpZXJhcmNoeSBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkKLSMgdGhlIGdyb3VwIG5hbWVzIHdpbGwgYXBwZWFyIGluIHRoZWlyIGRlZmluZWQgb3JkZXIuCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGhpZXJhcmNoeQorIyBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PIHRoZSBncm91cCBuYW1lcyB3aWxsCisjIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIFNPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBOTwogCi0jIElmIHRoZSBTT1JUX0JZX1NDT1BFX05BTUUgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUKLSMgc29ydGVkIGJ5IGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0bwotIyBOTyAodGhlIGRlZmF1bHQpLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBvbmx5IGJ5IGNsYXNzIG5hbWUsCi0jIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0LgorIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQorIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKKyMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCiAjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCi0jIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZQotIyBhbHBoYWJldGljYWwgbGlzdC4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlIGFscGhhYmV0aWNhbAorIyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIFNPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTwogCi0jIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yCi0jIGRpc2FibGUgKE5PKSB0aGUgdG9kbyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvCi0jIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgorIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KKyMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKKyMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCisjIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCisjIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZQorIyB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8gY29tbWFuZHMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIEdFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMKIAotIyBUaGUgR0VORVJBVEVfVEVTVExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcgotIyBkaXNhYmxlIChOTykgdGhlIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdAotIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlCisjIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdCBjb21tYW5kcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUwogCi0jIFRoZSBHRU5FUkFURV9CVUdMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKLSMgZGlzYWJsZSAoTk8pIHRoZSBidWcgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnCi0jIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZSBidWcKKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCiAKLSMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IKLSMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcKLSMgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pCisjIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGRlcHJlY2F0ZWQgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMKIAotIyBUaGUgRU5BQkxFRF9TRUNUSU9OUyB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIGNvbmRpdGlvbmFsCi0jIGRvY3VtZW50YXRpb24gc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgc2VjdGlvbm5hbWUgLi4uIFxlbmRpZi4KKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KKyMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KIAogRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9CiAKLSMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMKLSMgdGhlIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBkZWZpbmUgY29uc2lzdHMgb2YgZm9yIGl0IHRvIGFwcGVhciBpbgotIyB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQKLSMgaGVyZSBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LgotIyBUaGUgYXBwZWFyYW5jZSBvZiB0aGUgaW5pdGlhbGl6ZXIgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIGRlZmluZXMgaW4gdGhlCi0jIGRvY3VtZW50YXRpb24gY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyCi0jIGNvbW1hbmQgaW4gdGhlIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRoYXQgdGhlCisjIGluaXRpYWwgdmFsdWUgb2YgYSB2YXJpYWJsZSBvciBtYWNybyAvIGRlZmluZSBjYW4gaGF2ZSBmb3IgaXQgdG8gYXBwZWFyIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZCBoZXJlCisjIGl0IHdpbGwgYmUgaGlkZGVuLiBVc2UgYSB2YWx1ZSBvZiAwIHRvIGhpZGUgaW5pdGlhbGl6ZXJzIGNvbXBsZXRlbHkuIFRoZQorIyBhcHBlYXJhbmNlIG9mIHRoZSB2YWx1ZSBvZiBpbmRpdmlkdWFsIHZhcmlhYmxlcyBhbmQgbWFjcm9zIC8gZGVmaW5lcyBjYW4gYmUKKyMgY29udHJvbGxlZCB1c2luZyBcc2hvd2luaXRpYWxpemVyIG9yIFxoaWRlaW5pdGlhbGl6ZXIgY29tbWFuZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDMwLgogCiBNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzAKIAotIyBTZXQgdGhlIFNIT1dfVVNFRF9GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgbGlzdCBvZiBmaWxlcyBnZW5lcmF0ZWQKLSMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZQotIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBhdAorIyB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMgdGhlIGxpc3QKKyMgd2lsbCBtZW50aW9uIHRoZSBmaWxlcyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogU0hPV19VU0VEX0ZJTEVTICAgICAgICA9IFlFUwogCi0jIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4KLSMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgRmlsZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCi0jIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUwogCi0jIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQotIyBOYW1lc3BhY2VzIHBhZ2UuCi0jIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXgKLSMgYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4KKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE5hbWVzcGFjZXMKKyMgcGFnZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUwogCiAjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAogIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KICMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCi0jIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxjb21tYW5kPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxjb21tYW5kPiBpcyB0aGUgdmFsdWUgb2YKLSMgdGhlIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUKLSMgcHJvdmlkZWQgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dAotIyBpcyB1c2VkIGFzIHRoZSBmaWxlIHZlcnNpb24uIFNlZSB0aGUgbWFudWFsIGZvciBleGFtcGxlcy4KKyMgcG9wZW4oKSkgdGhlIGNvbW1hbmQgY29tbWFuZCBpbnB1dC1maWxlLCB3aGVyZSBjb21tYW5kIGlzIHRoZSB2YWx1ZSBvZiB0aGUKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCBpbnB1dC1maWxlIGlzIHRoZSBuYW1lIG9mIGFuIGlucHV0IGZpbGUgcHJvdmlkZWQKKyMgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dCBpcyB1c2VkIGFzIHRoZSBmaWxlCisjIHZlcnNpb24uIEZvciBhbiBleGFtcGxlIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KIAogRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9CiAKICMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKICMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKLSMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUaGUgY3JlYXRlIHRoZSBsYXlvdXQgZmlsZQotIyB0aGF0IHJlcHJlc2VudHMgZG94eWdlbidzIGRlZmF1bHRzLCBydW4gZG94eWdlbiB3aXRoIHRoZSAtbCBvcHRpb24uCi0jIFlvdSBjYW4gb3B0aW9uYWxseSBzcGVjaWZ5IGEgZmlsZSBuYW1lIGFmdGVyIHRoZSBvcHRpb24sIGlmIG9taXR0ZWQKLSMgRG94eWdlbkxheW91dC54bWwgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgZmlsZS4KKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KIAogTEFZT1VUX0ZJTEUgICAgICAgICAgICA9CiAKKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcyBjb250YWluaW5nCisjIHRoZSByZWZlcmVuY2UgZGVmaW5pdGlvbnMuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlIC5iaWIKKyMgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVGhpcyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wKKyMgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorIyBGb3IgTGFUZVggdGhlIHN0eWxlIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcKKyMgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlCisjIHNlYXJjaCBwYXRoLiBTZWUgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPQorCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgVGhlIFFVSUVUIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgZ2VuZXJhdGVkCi0jIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorIyBUaGUgUVVJRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBtZXNzYWdlcyB0aGF0IGFyZSBnZW5lcmF0ZWQgdG8KKyMgc3RhbmRhcmQgb3V0cHV0IGJ5IGRveHlnZW4uIElmIFFVSUVUIGlzIHNldCB0byBZRVMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlCisjIG1lc3NhZ2VzIGFyZSBvZmYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogUVVJRVQgICAgICAgICAgICAgICAgICA9IFlFUwogCiAjIFRoZSBXQVJOSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBhcmUKLSMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4uIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4gSWYgbGVmdCBibGFuawotIyBOTyBpcyB1c2VkLgorIyBnZW5lcmF0ZWQgdG8gc3RhbmRhcmQgZXJyb3IgKCBzdGRlcnIpIGJ5IGRveHlnZW4uIElmIFdBUk5JTkdTIGlzIHNldCB0byBZRVMKKyMgdGhpcyBpbXBsaWVzIHRoYXQgdGhlIHdhcm5pbmdzIGFyZSBvbi4KKyMKKyMgVGlwOiBUdXJuIHdhcm5pbmdzIG9uIHdoaWxlIHdyaXRpbmcgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIFdBUk5JTkdTICAgICAgICAgICAgICAgPSBZRVMKIAotIyBJZiBXQVJOX0lGX1VORE9DVU1FTlRFRCBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncwotIyBmb3IgdW5kb2N1bWVudGVkIG1lbWJlcnMuIElmIEVYVFJBQ1RfQUxMIGlzIHNldCB0byBZRVMgdGhlbiB0aGlzIGZsYWcgd2lsbAotIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLgorIyBJZiB0aGUgV0FSTl9JRl9VTkRPQ1VNRU5URUQgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlCisjIHdhcm5pbmdzIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZworIyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIFdBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKIAotIyBJZiBXQVJOX0lGX0RPQ19FUlJPUiBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCi0jIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUKLSMgcGFyYW1ldGVycyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdAotIyBkb24ndCBleGlzdCBvciB1c2luZyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgSWYgdGhlIFdBUk5fSUZfRE9DX0VSUk9SIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MgZm9yCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUgcGFyYW1ldGVycworIyBpbiBhIGRvY3VtZW50ZWQgZnVuY3Rpb24sIG9yIGRvY3VtZW50aW5nIHBhcmFtZXRlcnMgdGhhdCBkb24ndCBleGlzdCBvciB1c2luZworIyBtYXJrdXAgY29tbWFuZHMgd3JvbmdseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogV0FSTl9JRl9ET0NfRVJST1IgICAgICA9IFlFUwogCi0jIFRoaXMgV0FSTl9OT19QQVJBTURPQyBvcHRpb24gY2FuIGJlIGFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IKLSMgZnVuY3Rpb25zIHRoYXQgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMKLSMgb3IgcmV0dXJuIHZhbHVlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0Ci0jIHdyb25nIG9yIGluY29tcGxldGUgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YKLSMgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIGZ1bmN0aW9ucyB0aGF0CisjIGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzIG9yIHJldHVybgorIyB2YWx1ZS4gSWYgc2V0IHRvIE5PIGRveHlnZW4gd2lsbCBvbmx5IHdhcm4gYWJvdXQgd3Jvbmcgb3IgaW5jb21wbGV0ZSBwYXJhbWV0ZXIKKyMgZG9jdW1lbnRhdGlvbiwgYnV0IG5vdCBhYm91dCB0aGUgYWJzZW5jZSBvZiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIFdBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTwogCi0jIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQKLSMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQKLSMgdGFncywgd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUKLSMgd2FybmluZyBvcmlnaW5hdGVkIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4KLSMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkCi0jIGJlIG9idGFpbmVkIHZpYSBGSUxFX1ZFUlNJT05fRklMVEVSKQorIyBUaGUgV0FSTl9GT1JNQVQgdGFnIGRldGVybWluZXMgdGhlIGZvcm1hdCBvZiB0aGUgd2FybmluZyBtZXNzYWdlcyB0aGF0IGRveHlnZW4KKyMgY2FuIHByb2R1Y2UuIFRoZSBzdHJpbmcgc2hvdWxkIGNvbnRhaW4gdGhlICRmaWxlLCAkbGluZSwgYW5kICR0ZXh0IHRhZ3MsIHdoaWNoCisjIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHdhcm5pbmcgb3JpZ2luYXRlZAorIyBhbmQgdGhlIHdhcm5pbmcgdGV4dC4gT3B0aW9uYWxseSB0aGUgZm9ybWF0IG1heSBjb250YWluICR2ZXJzaW9uLCB3aGljaCB3aWxsCisjIGJlIHJlcGxhY2VkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRoZSBmaWxlIChpZiBpdCBjb3VsZCBiZSBvYnRhaW5lZCB2aWEKKyMgRklMRV9WRVJTSU9OX0ZJTFRFUikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6ICRmaWxlOiRsaW5lOiAkdGV4dC4KIAogV0FSTl9GT1JNQVQgICAgICAgICAgICA9ICIkZmlsZTokbGluZTogJHRleHQiCiAKLSMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZwotIyBhbmQgZXJyb3IgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuCi0jIHRvIHN0ZGVyci4KKyMgVGhlIFdBUk5fTE9HRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgdG8gd2hpY2ggd2FybmluZyBhbmQgZXJyb3IKKyMgbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIGxlZnQgYmxhbmsgdGhlIG91dHB1dCBpcyB3cml0dGVuIHRvIHN0YW5kYXJkCisjIGVycm9yIChzdGRlcnIpLgogCiBXQVJOX0xPR0ZJTEUgICAgICAgICAgID0KIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGZpbGVzCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgVGhlIElOUFVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCi0jIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSAibXlmaWxlLmNwcCIgb3IKLSMgZGlyZWN0b3JpZXMgbGlrZSAiL3Vzci9zcmMvbXlwcm9qZWN0Ii4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzCi0jIHdpdGggc3BhY2VzLgorIyBUaGUgSU5QVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgbXlmaWxlLmNwcCBvcgorIyBkaXJlY3RvcmllcyBsaWtlIC91c3Ivc3JjL215cHJvamVjdC4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdpdGgKKyMgc3BhY2VzLgorIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCiAKIElOUFVUICAgICAgICAgICAgICAgICAgPQogCiAjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzCi0jIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZywgd2hpY2ggaXMKLSMgYWxzbyB0aGUgZGVmYXVsdCBpbnB1dCBlbmNvZGluZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQKLSMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvcgotIyB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZy4gRG94eWdlbiB1c2VzCisjIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgdGhlIGxpYmljb252CisjIGRvY3VtZW50YXRpb24gKHNlZTogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252KSBmb3IgdGhlIGxpc3Qgb2YKKyMgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCiAKIElOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAogCiAjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKLSMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwCi0jIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQKLSMgYmxhbmsgdGhlIGZvbGxvd2luZyBwYXR0ZXJucyBhcmUgdGVzdGVkOgotIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmphdmEgKi5paSAqLml4eCAqLmlwcCAqLmkrKyAqLmlubCAqLmggKi5oaCAqLmh4eAotIyAqLmhwcCAqLmgrKyAqLmlkbCAqLm9kbCAqLmNzICoucGhwICoucGhwMyAqLmluYyAqLm0gKi5tbSAqLnB5ICouZjkwCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayB0aGUKKyMgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsICouYysrLCAqLmphdmEsICouaWksCisjICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsICouaGgsICouaHh4LCAqLmhwcCwKKyMgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywgKi5tLCAqLm1hcmtkb3duLAorIyAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5mOTAsICouZiwgKi5mb3IsICoudGNsLCAqLnZoZCwgKi52aGRsLCAqLnVjZiwKKyMgKi5xc2YsICouYXMgYW5kICouanMuCiAKIEZJTEVfUEFUVEVSTlMgICAgICAgICAgPQogCi0jIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcwotIyBzaG91bGQgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuIFBvc3NpYmxlIHZhbHVlcyBhcmUgWUVTIGFuZCBOTy4KLSMgSWYgbGVmdCBibGFuayBOTyBpcyB1c2VkLgorIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzIHNob3VsZAorIyBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCiAKLSMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQogIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQogIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKyMKKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcworIyBydW4uCiAKIEVYQ0xVREUgICAgICAgICAgICAgICAgPQogCi0jIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKLSMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlc3lzdGVtIGZlYXR1cmUpIGFyZSBleGNsdWRlZAorIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCiAjIGZyb20gdGhlIGlucHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIEVYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTwogCiAjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKICMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCi0jIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4gTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQKLSMgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMKLSMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCiAKIEVYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAqLmdpdCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgKi5kCkBAIC02MzIsNjc3ICs4MTIsMTEwOCBAQAogIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUKICMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywKICMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKIAogRVhDTFVERV9TWU1CT0xTICAgICAgICA9CiAKLSMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvcgotIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlCi0jIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4KKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlIHRoZSBcaW5jbHVkZQorIyBjb21tYW5kKS4KIAotRVhBTVBMRV9QQVRIICAgICAgICAgICA9IGRvYy9leGFtcGxlcy8KK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSBkb2MvZXhhbXBsZXMvIHRvb2xzLwogCiAjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCi0jIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcAotIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0Ci0jIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcCBhbmQKKyMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rIGFsbAorIyBmaWxlcyBhcmUgaW5jbHVkZWQuCiAKIEVYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqLmMKIAogIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlCi0jIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyB0byBiZSB1c2VkIHdpdGggdGhlIFxpbmNsdWRlIG9yIFxkb250aW5jbHVkZQotIyBjb21tYW5kcyBpcnJlc3BlY3RpdmUgb2YgdGhlIHZhbHVlIG9mIHRoZSBSRUNVUlNJVkUgdGFnLgotIyBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4KKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIGNvbW1hbmRzCisjIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCiAKLSMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IKLSMgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIGltYWdlIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUKLSMgdGhlIFxpbWFnZSBjb21tYW5kKS4KKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGltYWdlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcaW1hZ2UgY29tbWFuZCkuCiAKIElNQUdFX1BBVEggICAgICAgICAgICAgPQogCiAjIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQKICMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQotIyBieSBleGVjdXRpbmcgKHZpYSBwb3BlbigpKSB0aGUgY29tbWFuZCA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4sIHdoZXJlIDxmaWx0ZXI+Ci0jIGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbgotIyBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIgcHJvZ3JhbSB3cml0ZXMKLSMgdG8gc3RhbmRhcmQgb3V0cHV0LgotIyBJZiBGSUxURVJfUEFUVEVSTlMgaXMgc3BlY2lmaWVkLCB0aGlzIHRhZyB3aWxsIGJlCi0jIGlnbm9yZWQuCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kOgorIworIyA8ZmlsdGVyPiA8aW5wdXQtZmlsZT4KKyMKKyMgd2hlcmUgPGZpbHRlcj4gaXMgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVF9GSUxURVIgdGFnLCBhbmQgPGlucHV0LWZpbGU+IGlzIHRoZQorIyBuYW1lIG9mIGFuIGlucHV0IGZpbGUuIERveHlnZW4gd2lsbCB0aGVuIHVzZSB0aGUgb3V0cHV0IHRoYXQgdGhlIGZpbHRlcgorIyBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBzcGVjaWZpZWQsIHRoaXMgdGFnCisjIHdpbGwgYmUgaWdub3JlZC4KKyMKKyMgTm90ZSB0aGF0IHRoZSBmaWx0ZXIgbXVzdCBub3QgYWRkIG9yIHJlbW92ZSBsaW5lczsgaXQgaXMgYXBwbGllZCBiZWZvcmUgdGhlCisjIGNvZGUgaXMgc2Nhbm5lZCwgYnV0IG5vdCB3aGVuIHRoZSBvdXRwdXQgY29kZSBpcyBnZW5lcmF0ZWQuIElmIGxpbmVzIGFyZSBhZGRlZAorIyBvciByZW1vdmVkLCB0aGUgYW5jaG9ycyB3aWxsIG5vdCBiZSBwbGFjZWQgY29ycmVjdGx5LgogCiBJTlBVVF9GSUxURVIgICAgICAgICAgID0KIAogIyBUaGUgRklMVEVSX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbHRlcnMgb24gYSBwZXIgZmlsZSBwYXR0ZXJuCi0jIGJhc2lzLgotIyBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUKLSMgZmlsdGVyIGlmIHRoZXJlIGlzIGEgbWF0Y2guCi0jIFRoZSBmaWx0ZXJzIGFyZSBhIGxpc3Qgb2YgdGhlIGZvcm06Ci0jIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyCi0jIGluZm8gb24gaG93IGZpbHRlcnMgYXJlIHVzZWQuIElmIEZJTFRFUl9QQVRURVJOUyBpcyBlbXB0eSwgSU5QVVRfRklMVEVSCi0jIGlzIGFwcGxpZWQgdG8gYWxsIGZpbGVzLgorIyBiYXNpcy4gRG94eWdlbiB3aWxsIGNvbXBhcmUgdGhlIGZpbGUgbmFtZSB3aXRoIGVhY2ggcGF0dGVybiBhbmQgYXBwbHkgdGhlCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLiBUaGUgZmlsdGVycyBhcmUgYSBsaXN0IG9mIHRoZSBmb3JtOiBwYXR0ZXJuPWZpbHRlcgorIyAobGlrZSAqLmNwcD1teV9jcHBfZmlsdGVyKS4gU2VlIElOUFVUX0ZJTFRFUiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbiBvbiBob3cKKyMgZmlsdGVycyBhcmUgdXNlZC4gSWYgdGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgaXMgZW1wdHkgb3IgaWYgbm9uZSBvZiB0aGUKKyMgcGF0dGVybnMgbWF0Y2ggdGhlIGZpbGUgbmFtZSwgSU5QVVRfRklMVEVSIGlzIGFwcGxpZWQuCiAKIEZJTFRFUl9QQVRURVJOUyAgICAgICAgPQogCiAjIElmIHRoZSBGSUxURVJfU09VUkNFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgaW5wdXQgZmlsdGVyIChpZiBzZXQgdXNpbmcKLSMgSU5QVVRfRklMVEVSKSB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB3aGVuIHByb2R1Y2luZyBzb3VyY2UKLSMgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIElOUFVUX0ZJTFRFUiApIHdpbGwgYWxzbyBiZSB1c2VkIHRvIGZpbHRlciB0aGUgaW5wdXQgZmlsZXMgdGhhdCBhcmUgdXNlZCBmb3IKKyMgcHJvZHVjaW5nIHRoZSBzb3VyY2UgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PCiAKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0KKworIyBJZiB0aGUgVVNFX01ERklMRV9BU19NQUlOUEFHRSB0YWcgcmVmZXJzIHRvIHRoZSBuYW1lIG9mIGEgbWFya2Rvd24gZmlsZSB0aGF0CisjIGlzIHBhcnQgb2YgdGhlIGlucHV0LCBpdHMgY29udGVudHMgd2lsbCBiZSBwbGFjZWQgb24gdGhlIG1haW4gcGFnZQorIyAoaW5kZXguaHRtbCkuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBhIHByb2plY3Qgb24gZm9yIGluc3RhbmNlIEdpdEh1YgorIyBhbmQgd2FudCB0byByZXVzZSB0aGUgaW50cm9kdWN0aW9uIHBhZ2UgYWxzbyBmb3IgdGhlIGRveHlnZW4gb3V0cHV0LgorCitVU0VfTURGSUxFX0FTX01BSU5QQUdFID0KKwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsCi0jIGJlIGdlbmVyYXRlZC4gRG9jdW1lbnRlZCBlbnRpdGllcyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCB0aGVzZSBzb3VyY2VzLgotIyBOb3RlOiBUbyBnZXQgcmlkIG9mIGFsbCBzb3VyY2UgY29kZSBpbiB0aGUgZ2VuZXJhdGVkIG91dHB1dCwgbWFrZSBzdXJlIGFsc28KLSMgVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMKKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSB0aGF0CisjIGFsc28gVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUwogCi0jIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5Ci0jIG9mIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkgb2YgZnVuY3Rpb25zLAorIyBjbGFzc2VzIGFuZCBlbnVtcyBkaXJlY3RseSBpbnRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIElOTElORV9TT1VSQ0VTICAgICAgICAgPSBOTwogCi0jIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QKLSMgZG94eWdlbiB0byBoaWRlIGFueSBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlCi0jIGZyYWdtZW50cy4gTm9ybWFsIEMgYW5kIEMrKyBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IE5PCiAKLSMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKLSMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkCi0jIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCiAKLSMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMKLSMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzCi0jIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIFJFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTwogCi0jIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkKLSMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20KLSMgZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbAotIyBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4KLSMgT3RoZXJ3aXNlIHRoZXkgd2lsbCBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBJZiB0aGUgUkVGRVJFTkNFU19MSU5LX1NPVVJDRSB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldAorIyB0byBZRVMsIHRoZW4gdGhlIGh5cGVybGlua3MgZnJvbSBmdW5jdGlvbnMgaW4gUkVGRVJFTkNFU19SRUxBVElPTiBhbmQKKyMgUkVGRVJFTkNFRF9CWV9SRUxBVElPTiBsaXN0cyB3aWxsIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLiBPdGhlcndpc2UgdGhleSB3aWxsCisjIGxpbmsgdG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMKIAotIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUKLSMgd2lsbCBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuCi0jIGJ1aWx0LWluIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UKLSMgdGFnZ2luZyBzeXN0ZW0gKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91Ci0jIHdpbGwgbmVlZCB2ZXJzaW9uIDQuOC42IG9yIGhpZ2hlci4KKyMgSWYgU09VUkNFX1RPT0xUSVBTIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGhvdmVyaW5nIGEgaHlwZXJsaW5rIGluIHRoZQorIyBzb3VyY2UgY29kZSB3aWxsIHNob3cgYSB0b29sdGlwIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHByb3RvdHlwZSwKKyMgYnJpZWYgZGVzY3JpcHRpb24gYW5kIGxpbmtzIHRvIHRoZSBkZWZpbml0aW9uIGFuZCBkb2N1bWVudGF0aW9uLiBTaW5jZSB0aGlzCisjIHdpbGwgbWFrZSB0aGUgSFRNTCBmaWxlIGxhcmdlciBhbmQgbG9hZGluZyBvZiBsYXJnZSBmaWxlcyBhIGJpdCBzbG93ZXIsIHlvdQorIyBjYW4gb3B0IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworU09VUkNFX1RPT0xUSVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSB3aWxsCisjIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gYnVpbHQtaW4KKyMgc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSB0YWdnaW5nIHN5c3RlbQorIyAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3Ugd2lsbCBuZWVkIHZlcnNpb24KKyMgNC44LjYgb3IgaGlnaGVyLgorIworIyBUbyB1c2UgaXQgZG8gdGhlIGZvbGxvd2luZzoKKyMgLSBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnbG9iYWwKKyMgLSBFbmFibGUgU09VUkNFX0JST1dTRVIgYW5kIFVTRV9IVEFHUyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgLSBNYWtlIHN1cmUgdGhlIElOUFVUIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUKKyMgLSBSdW4gZG94eWdlbiBhcyBub3JtYWwKKyMKKyMgRG94eWdlbiB3aWxsIGludm9rZSBodGFncyAoYW5kIHRoYXQgd2lsbCBpbiB0dXJuIGludm9rZSBndGFncyksIHNvIHRoZXNlCisjIHRvb2xzIG11c3QgYmUgYXZhaWxhYmxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaS5lLiBpbiB0aGUgc2VhcmNoIHBhdGgpLgorIworIyBUaGUgcmVzdWx0OiBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgYnJvd3NlciBnZW5lcmF0ZWQgYnkgZG94eWdlbiwgdGhlIGxpbmtzIHRvCisjIHNvdXJjZSBjb2RlIHdpbGwgbm93IHBvaW50IHRvIHRoZSBvdXRwdXQgb2YgaHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCiAKIFVTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTwogCi0jIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuCi0jIHdpbGwgZ2VuZXJhdGUgYSB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3IKLSMgd2hpY2ggYW4gaW5jbHVkZSBpcyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdGhlIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciB3aGljaCBhbiBpbmNsdWRlIGlzCisjIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgU2VlIGFsc286IFNlY3Rpb24gXGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCiAKKyMgSWYgdGhlIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHVzZSB0aGUKKyMgY2xhbmcgcGFyc2VyIChzZWU6IGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy8pIGZvciBtb3JlIGFjY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGNvbXBpbGVkIHdpdGggdGhlIC0td2l0aC1saWJjbGFuZyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ0xBTkdfQVNTSVNURURfUEFSU0lORyA9IE5PCisKKyMgSWYgY2xhbmcgYXNzaXN0ZWQgcGFyc2luZyBpcyBlbmFibGVkIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCBjb21tYW5kCisjIGxpbmUgb3B0aW9ucyB0aGF0IHlvdSB3b3VsZCBub3JtYWxseSB1c2Ugd2hlbiBpbnZva2luZyB0aGUgY29tcGlsZXIuIE5vdGUgdGhhdAorIyB0aGUgaW5jbHVkZSBwYXRocyB3aWxsIGFscmVhZHkgYmUgc2V0IGJ5IGRveHlnZW4gZm9yIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyMgc3BlY2lmaWVkIHdpdGggSU5QVVQgYW5kIElOQ0xVREVfUEFUSC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgaXMgc2V0IHRvIFlFUy4KKworQ0xBTkdfT1BUSU9OUyAgICAgICAgICA9CisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgYWxwaGFiZXRpY2FsIGNsYXNzIGluZGV4CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgSWYgdGhlIEFMUEhBQkVUSUNBTF9JTkRFWCB0YWcgaXMgc2V0IHRvIFlFUywgYW4gYWxwaGFiZXRpY2FsIGluZGV4Ci0jIG9mIGFsbCBjb21wb3VuZHMgd2lsbCBiZSBnZW5lcmF0ZWQuIEVuYWJsZSB0aGlzIGlmIHRoZSBwcm9qZWN0Ci0jIGNvbnRhaW5zIGEgbG90IG9mIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucyBvciBpbnRlcmZhY2VzLgorIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIEFMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKIAotIyBJZiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGlzIGVuYWJsZWQgKHNlZSBBTFBIQUJFVElDQUxfSU5ERVgpIHRoZW4KLSMgdGhlIENPTFNfSU5fQUxQSEFfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zCi0jIGluIHdoaWNoIHRoaXMgbGlzdCB3aWxsIGJlIHNwbGl0IChjYW4gYmUgYSBudW1iZXIgaW4gdGhlIHJhbmdlIFsxLi4yMF0pCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KIAogQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKIAotIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsCi0jIGNsYXNzZXMgd2lsbCBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguCi0jIFRoZSBJR05PUkVfUFJFRklYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHByZWZpeGVzIHRoYXQKLSMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KIAogSUdOT1JFX1BSRUZJWCAgICAgICAgICA9CiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCi0jIGdlbmVyYXRlIEhUTUwgb3V0cHV0LgorIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgSFRNTCBvdXRwdXQKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUwogCi0jIFRoZSBIVE1MX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBIVE1MIGRvY3Mgd2lsbCBiZSBwdXQuCi0jIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKLSMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBodG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KIAogSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKIAotIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yCi0jIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sLnBocCwuYXNwKS4gSWYgaXQgaXMgbGVmdCBibGFuawotIyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgZmlsZXMgd2l0aCAuaHRtbCBleHRlbnNpb24uCisjIFRoZSBIVE1MX0ZJTEVfRVhURU5TSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlIGV4dGVuc2lvbiBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlIChmb3IgZXhhbXBsZTogLmh0bSwgLnBocCwgLmFzcCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KIAogSFRNTF9GSUxFX0VYVEVOU0lPTiAgICA9IC5odG1sCiAKLSMgVGhlIEhUTUxfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBoZWFkZXIgZm9yCi0jIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBUaGUgSFRNTF9IRUFERVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgSFRNTCBoZWFkZXIgZmlsZSBmb3IKKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKICMgc3RhbmRhcmQgaGVhZGVyLgorIworIyBUbyBnZXQgdmFsaWQgSFRNTCB0aGUgaGVhZGVyIGZpbGUgdGhhdCBpbmNsdWRlcyBhbnkgc2NyaXB0cyBhbmQgc3R5bGUgc2hlZXRzCisjIHRoYXQgZG94eWdlbiBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZCAoZS5nLgorIyB0aGUgc2V0dGluZyBHRU5FUkFURV9UUkVFVklFVykuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0byBzdGFydCB3aXRoIGEKKyMgZGVmYXVsdCBoZWFkZXIgdXNpbmcKKyMgZG94eWdlbiAtdyBodG1sIG5ld19oZWFkZXIuaHRtbCBuZXdfZm9vdGVyLmh0bWwgbmV3X3N0eWxlc2hlZXQuY3NzCisjIFlvdXJDb25maWdGaWxlCisjIGFuZCB0aGVuIG1vZGlmeSB0aGUgZmlsZSBuZXdfaGVhZGVyLmh0bWwuIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiCisjIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIGRlZmF1bHQgaGVhZGVyIHRoYXQgZG94eWdlbiBub3JtYWxseQorIyB1c2VzLgorIyBOb3RlOiBUaGUgaGVhZGVyIGlzIHN1YmplY3QgdG8gY2hhbmdlIHNvIHlvdSB0eXBpY2FsbHkgaGF2ZSB0byByZWdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IGhlYWRlciB3aGVuIHVwZ3JhZGluZyB0byBhIG5ld2VyIHZlcnNpb24gb2YgZG94eWdlbi4gRm9yIGEgZGVzY3JpcHRpb24KKyMgb2YgdGhlIHBvc3NpYmxlIG1hcmtlcnMgYW5kIGJsb2NrIG5hbWVzIHNlZSB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KIAogSFRNTF9IRUFERVIgICAgICAgICAgICA9CiAKLSMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgSFRNTCBmb290ZXIgZm9yCi0jIGVhY2ggZ2VuZXJhdGVkIEhUTUwgcGFnZS4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQotIyBzdGFuZGFyZCBmb290ZXIuCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGZvb3RlciBmb3IgZWFjaAorIyBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiB0aGUgdGFnIGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQKKyMgZm9vdGVyLiBTZWUgSFRNTF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdAorIyBmb290ZXIgYW5kIHdoYXQgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4gU2VlIGFsc28KKyMgc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBmb290ZXIKKyMgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCiAKIEhUTUxfRk9PVEVSICAgICAgICAgICAgPQogCi0jIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nCi0jIHN0eWxlIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8KLSMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgdGhlIHRhZyBpcyBsZWZ0IGJsYW5rIGRveHlnZW4KLSMgd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuIE5vdGUgdGhhdCBkb3h5Z2VuIHdpbGwgdHJ5IHRvIGNvcHkKLSMgdGhlIHN0eWxlIHNoZWV0IGZpbGUgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgc28gZG9uJ3QgcHV0IHlvdXIgb3duCi0jIHN0eWxlc2hlZXQgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSBhcyB3ZWxsLCBvciBpdCB3aWxsIGJlIGVyYXNlZCEKKyMgVGhlIEhUTUxfU1RZTEVTSEVFVCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBjYXNjYWRpbmcgc3R5bGUKKyMgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0byBmaW5lLXR1bmUgdGhlIGxvb2sgb2YKKyMgdGhlIEhUTUwgb3V0cHV0LiBJZiBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRlZmF1bHQgc3R5bGUgc2hlZXQuCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlIHN0eWxlCisjIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBOb3RlOiBJdCBpcyByZWNvbW1lbmRlZCB0byB1c2UgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIGluc3RlYWQgb2YgdGhpcyB0YWcsIGFzCisjIGl0IGlzIG1vcmUgcm9idXN0IGFuZCB0aGlzIHRhZyAoSFRNTF9TVFlMRVNIRUVUKSB3aWxsIGluIHRoZSBmdXR1cmUgYmVjb21lCisjIG9ic29sZXRlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgogCiBIVE1MX1NUWUxFU0hFRVQgICAgICAgID0KIAotIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4KLSMgRG94eWdlbiB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZXNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcwotIyBhY2NvcmRpbmcgdG8gdGhpcyBjb2xvci4gSHVlIGlzIHNwZWNpZmllZCBhcyBhbiBhbmdsZSBvbiBhIGNvbG9yd2hlZWwsCi0jIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSMgRm9yIGluc3RhbmNlIHRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwKLSMgMTgwIGlzIGN5YW4sIDI0MCBpcyBibHVlLCAzMDAgcHVycGxlLCBhbmQgMzYwIGlzIHJlZCBhZ2Fpbi4KLSMgVGhlIGFsbG93ZWQgcmFuZ2UgaXMgMCB0byAzNTkuCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzCisjIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuCisjIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCisjIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvciBtb3JlIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSB1cGRhdGVzLgorIyBEb3h5Z2VuIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZXMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisjIE5vdGU6IFRoZSBvcmRlciBvZiB0aGUgZXh0cmEgc3R5bGVzaGVldCBmaWxlcyBpcyBvZiBpbXBvcnRhbmNlIChlLmcuIHRoZSBsYXN0CisjIHN0eWxlc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgogCi0jSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDEyMAorSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9CiAKLSMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mCi0jIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UKLSMgZ3JheXNjYWxlcyBvbmx5LiBBIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQorIyAkcmVscGF0aF4gbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdCB0aGUKKyMgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9CisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuIERveHlnZW4KKyMgd2lsbCBhZGp1c3QgdGhlIGNvbG9ycyBpbiB0aGUgc3R5bGVzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMgYWNjb3JkaW5nIHRvCisjIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLCBzZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUKKyMgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwCisjIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDM1OSwgZGVmYXVsdCB2YWx1ZTogMjIwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCisjIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KIAogSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAogCi0jIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8KLSMgdGhlIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdwotIyAxMDAgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZQotIyB0aGUgb3V0cHV0IGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwKLSMgc28gODAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLAotIyBhbmQgMTAwIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2FtbWEuCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCisjIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKKyMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0CisjIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cworIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90CisjIGNoYW5nZSB0aGUgZ2FtbWEuCisjIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgogCiBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKIAogIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKLSMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nCi0jIHRoaXMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorIyBwYWdlIHdpbGwgY29udGFpbiB0aGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBwYWdlIHdhcyBnZW5lcmF0ZWQuIFNldHRpbmcgdGhpcworIyB0byBOTyBjYW4gaGVscCB3aGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIG11bHRpcGxlIHJ1bnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCiAKIEhUTUxfVElNRVNUQU1QICAgICAgICAgPSBZRVMKIAogIyBJZiB0aGUgSFRNTF9EWU5BTUlDX1NFQ1RJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGdlbmVyYXRlZCBIVE1MCiAjIGRvY3VtZW50YXRpb24gd2lsbCBjb250YWluIHNlY3Rpb25zIHRoYXQgY2FuIGJlIGhpZGRlbiBhbmQgc2hvd24gYWZ0ZXIgdGhlCi0jIHBhZ2UgaGFzIGxvYWRlZC4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cwotIyBKYXZhU2NyaXB0IGFuZCBESFRNTCBpcyByZXF1aXJlZCAoZm9yIGluc3RhbmNlIE1vemlsbGEgMS4wKywgRmlyZWZveAotIyBOZXRzY2FwZSA2LjArLCBJbnRlcm5ldCBleHBsb3JlciA1LjArLCBLb25xdWVyb3IsIG9yIFNhZmFyaSkuCisjIHBhZ2UgaGFzIGxvYWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgogCiBIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gTk8KIAotIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCi0jIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMwotIyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50IGVudmlyb25tZW50LCBpbnRyb2R1Y2VkIHdpdGggT1MgWCAxMC41IChMZW9wYXJkKS4KLSMgVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIE1ha2VmaWxlIGluIHRoZQotIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbiB0aGF0Ci0jIGRpcmVjdG9yeSBhbmQgcnVubmluZyAibWFrZSBpbnN0YWxsIiB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgotIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQKLSMgaXQgYXQgc3RhcnR1cC4KLSMgU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgV2l0aCBIVE1MX0lOREVYX05VTV9FTlRSSUVTIG9uZSBjYW4gY29udHJvbCB0aGUgcHJlZmVycmVkIG51bWJlciBvZiBlbnRyaWVzCisjIHNob3duIGluIHRoZSB2YXJpb3VzIHRyZWUgc3RydWN0dXJlZCBpbmRpY2VzIGluaXRpYWxseTsgdGhlIHVzZXIgY2FuIGV4cGFuZAorIyBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZCB0aGUgdHJlZSB0bworIyBzdWNoIGEgbGV2ZWwgdGhhdCBhdCBtb3N0IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGVudHJpZXMgYXJlIHZpc2libGUgKHVubGVzcworIyBhIGZ1bGx5IGNvbGxhcHNlZCB0cmVlIGFscmVhZHkgZXhjZWVkcyB0aGlzIGFtb3VudCkuIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZgorIyBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieSBkZWZhdWx0LiAwIGlzIGEgc3BlY2lhbCB2YWx1ZQorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgbnVtYmVyIG9mIGVudHJpZXMgYW5kIHdpbGwgcmVzdWx0IGluIGEgZnVsbCBleHBhbmRlZAorIyB0cmVlIGJ5IGRlZmF1bHQuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDk5OTksIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9JTkRFWF9OVU1fRU5UUklFUyA9IDEwMAorCisjIElmIHRoZSBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgQXBwbGUncyBYY29kZSAzIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQKKyMgZW52aXJvbm1lbnQgKHNlZTogaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMveGNvZGUvKSwgaW50cm9kdWNlZCB3aXRoCisjIE9TWCAxMC41IChMZW9wYXJkKS4gVG8gY3JlYXRlIGEgZG9jdW1lbnRhdGlvbiBzZXQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIE1ha2VmaWxlIGluIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbgorIyB0aGF0IGRpcmVjdG9yeSBhbmQgcnVubmluZyBtYWtlIGluc3RhbGwgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4KKyMgfi9MaWJyYXJ5L0RldmVsb3Blci9TaGFyZWQvRG9jdW1lbnRhdGlvbi9Eb2NTZXRzIHNvIHRoYXQgWGNvZGUgd2lsbCBmaW5kIGl0IGF0CisjIHN0YXJ0dXAuIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sCiAjIGZvciBtb3JlIGluZm9ybWF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCiAKIEdFTkVSQVRFX0RPQ1NFVCAgICAgICAgPSBOTwogCi0jIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZQotIyBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZQotIyBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlciAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkKLSMgY2FuIGJlIGdyb3VwZWQuCisjIFRoaXMgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRvY3NldCBmZWVkLiBBIGRvY3VtZW50YXRpb24gZmVlZCBwcm92aWRlcworIyBhbiB1bWJyZWxsYSB1bmRlciB3aGljaCBtdWx0aXBsZSBkb2N1bWVudGF0aW9uIHNldHMgZnJvbSBhIHNpbmdsZSBwcm92aWRlcgorIyAoc3VjaCBhcyBhIGNvbXBhbnkgb3IgcHJvZHVjdCBzdWl0ZSkgY2FuIGJlIGdyb3VwZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCiAKIERPQ1NFVF9GRUVETkFNRSAgICAgICAgPSAiRG94eWdlbiBnZW5lcmF0ZWQgZG9jcyIKIAotIyBXaGVuIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgdGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQKLSMgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEKLSMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbgotIyB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorIyBUaGlzIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24KKyMgc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlIHN0cmluZywgZS5nLgorIyBjb20ubXljb21wYW55Lk15RG9jU2V0LiBEb3h5Z2VuIHdpbGwgYXBwZW5kIC5kb2NzZXQgdG8gdGhlIG5hbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCiAKIERPQ1NFVF9CVU5ETEVfSUQgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CiAKLSMgV2hlbiBHRU5FUkFURV9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeQorIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5CiAjIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlCiAjIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5QdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KIAogRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgogCi0jIFRoZSBHRU5FUkFURV9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCiAKIERPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKIAotIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMKLSMgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdCBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgdG9vbHMgbGlrZSB0aGUKLSMgTWljcm9zb2Z0IEhUTUwgaGVscCB3b3Jrc2hvcCB0byBnZW5lcmF0ZSBhIGNvbXBpbGVkIEhUTUwgaGVscCBmaWxlICguY2htKQotIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiBnZW5lcmF0ZXMgdGhyZWUKKyMgYWRkaXRpb25hbCBIVE1MIGluZGV4IGZpbGVzOiBpbmRleC5oaHAsIGluZGV4LmhoYywgYW5kIGluZGV4Lmhoay4gVGhlCisjIGluZGV4LmhocCBpcyBhIHByb2plY3QgZmlsZSB0aGF0IGNhbiBiZSByZWFkIGJ5IE1pY3Jvc29mdCdzIEhUTUwgSGVscCBXb3Jrc2hvcAorIyAoc2VlOiBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTIxMTM4KSBvbgorIyBXaW5kb3dzLgorIworIyBUaGUgSFRNTCBIZWxwIFdvcmtzaG9wIGNvbnRhaW5zIGEgY29tcGlsZXIgdGhhdCBjYW4gY29udmVydCBhbGwgSFRNTCBvdXRwdXQKKyMgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaW50byBhIHNpbmdsZSBjb21waWxlZCBIVE1MIGZpbGUgKC5jaG0pLiBDb21waWxlZCBIVE1MCisjIGZpbGVzIGFyZSBub3cgdXNlZCBhcyB0aGUgV2luZG93cyA5OCBoZWxwIGZvcm1hdCwgYW5kIHdpbGwgcmVwbGFjZSB0aGUgb2xkCisjIFdpbmRvd3MgaGVscCBmb3JtYXQgKC5obHApIG9uIGFsbCBXaW5kb3dzIHBsYXRmb3JtcyBpbiB0aGUgZnV0dXJlLiBDb21wcmVzc2VkCisjIEhUTUwgZmlsZXMgYWxzbyBjb250YWluIGFuIGluZGV4LCBhIHRhYmxlIG9mIGNvbnRlbnRzLCBhbmQgeW91IGNhbiBzZWFyY2ggZm9yCisjIHdvcmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUgSFRNTCB3b3Jrc2hvcCBhbHNvIGNvbnRhaW5zIGEgdmlld2VyIGZvcgorIyBjb21wcmVzc2VkIEhUTUwgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KIAogR0VORVJBVEVfSFRNTEhFTFAgICAgICA9IE5PCiAKLSMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0ZJTEUgdGFnIGNhbgotIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0gZmlsZS4gWW91Ci0jIGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQorIyBUaGUgQ0hNX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0KKyMgZmlsZS4gWW91IGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQogIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgogCiBDSE1fRklMRSAgICAgICAgICAgICAgID0KIAotIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBISENfTE9DQVRJT04gdGFnIGNhbgotIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIChhYnNvbHV0ZSBwYXRoIGluY2x1ZGluZyBmaWxlIG5hbWUpIG9mCi0jIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4KLSMgdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKyMgVGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGgKKyMgaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YgdGhlIEhUTUwgaGVscCBjb21waWxlciAoIGhoYy5leGUpLiBJZiBub24tZW1wdHkKKyMgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKyMgVGhlIGZpbGUgaGFzIHRvIGJlIHNwZWNpZmllZCB3aXRoIGZ1bGwgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCiAKIEhIQ19MT0NBVElPTiAgICAgICAgICAgPQogCi0jIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEdFTkVSQVRFX0NISSBmbGFnCi0jIGNvbnRyb2xzIGlmIGEgc2VwYXJhdGUgLmNoaSBpbmRleCBmaWxlIGlzIGdlbmVyYXRlZCAoWUVTKSBvciB0aGF0Ci0jIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLgorIyBUaGUgR0VORVJBVEVfQ0hJIGZsYWcgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkICgKKyMgWUVTKSBvciB0aGF0IGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoIE5PKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KIAogR0VORVJBVEVfQ0hJICAgICAgICAgICA9IE5PCiAKLSMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0lOREVYX0VOQ09ESU5HCi0jIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4IChoaGspLCBjb250ZW50IChoaGMpIGFuZCBwcm9qZWN0IGZpbGUKLSMgY29udGVudC4KKyMgVGhlIENITV9JTkRFWF9FTkNPRElORyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoIGhoayksIGNvbnRlbnQgKCBoaGMpCisjIGFuZCBwcm9qZWN0IGZpbGUgY29udGVudC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCiAKIENITV9JTkRFWF9FTkNPRElORyAgICAgPQogCi0jIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIEJJTkFSWV9UT0MgZmxhZwotIyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoWUVTKSBvciBhCi0jIG5vcm1hbCB0YWJsZSBvZiBjb250ZW50cyAoTk8pIGluIHRoZSAuY2htIGZpbGUuCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKAorIyBZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzICggTk8pIGluIHRoZSAuY2htIGZpbGUuIEZ1cnRoZXJtb3JlIGl0CisjIGVuYWJsZXMgdGhlIFByZXZpb3VzIGFuZCBOZXh0IGJ1dHRvbnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCiAKIEJJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTwogCi0jIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzCi0jIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzIHRvCisjIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCiAKIFRPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTwogCiAjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQKLSMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZAotIyB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEKLSMgUXQgQ29tcHJlc3NlZCBIZWxwICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0CisjIGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwCisjICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgogCiBHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KIAotIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuCi0jIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLgotIyBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8gdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4gVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvCisjIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KIAogUUNIX0ZJTEUgICAgICAgICAgICAgICA9CiAKLSMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcKLSMgUXQgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQotIyBodHRwOi8vZG9jLnRyb2xsdGVjaC5jb20vcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZQorIyBUaGUgUUhQX05BTUVTUEFDRSB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdCBIZWxwCisjIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIE5hbWVzcGFjZQorIyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KIAogUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKIAotIyBUaGUgUUhQX1ZJUlRVQUxfRk9MREVSIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nCi0jIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKLSMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCN2aXJ0dWFsLWZvbGRlcnMKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdAorIyBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIFZpcnR1YWwKKyMgRm9sZGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC0KKyMgZm9sZGVycykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBkb2MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KIAogUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYwogCi0jIElmIFFIUF9DVVNUX0ZJTFRFUl9OQU1FIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tIGZpbHRlciB0bwotIyBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKLSMgaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycworIyBJZiB0aGUgUUhQX0NVU1RfRklMVEVSX05BTUUgdGFnIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tCisjIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KIAogUUhQX0NVU1RfRklMVEVSX05BTUUgICA9CiAKLSMgVGhlIFFIUF9DVVNUX0ZJTFRfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKLSMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUKLSMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycyI+Ci0jIFF0IEhlbHAgUHJvamVjdCAvIEN1c3RvbSBGaWx0ZXJzPC9hPi4KKyMgVGhlIFFIUF9DVVNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KKyMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQorIyBmaWx0ZXJzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgogCiBRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0KIAogIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcwotIyBwcm9qZWN0J3MKLSMgZmlsdGVyIHNlY3Rpb24gbWF0Y2hlcy4KLSMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcyI+Ci0jIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzPC9hPi4KKyMgcHJvamVjdCdzIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzIChzZWU6CisjIGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KIAogUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9CiAKLSMgSWYgdGhlIEdFTkVSQVRFX1FIUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFFIR19MT0NBVElPTiB0YWcgY2FuCi0jIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncyBxaGVscGdlbmVyYXRvci4KLSMgSWYgbm9uLWVtcHR5IGRveHlnZW4gd2lsbCB0cnkgdG8gcnVuIHFoZWxwZ2VuZXJhdG9yIG9uIHRoZSBnZW5lcmF0ZWQKLSMgLnFocCBmaWxlLgorIyBUaGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzCisjIHFoZWxwZ2VuZXJhdG9yLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlCisjIGdlbmVyYXRlZCAucWhwIGZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KIAogUUhHX0xPQ0FUSU9OICAgICAgICAgICA9CiAKLSMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzCi0jICB3aWxsIGJlIGdlbmVyYXRlZCwgd2hpY2ggdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgZm9ybSBhbiBFY2xpcHNlIGhlbHAKLSMgcGx1Z2luLiBUbyBpbnN0YWxsIHRoaXMgcGx1Z2luIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSB1bmRlciB0aGUgaGVscCBjb250ZW50cwotIyBtZW51IGluIEVjbGlwc2UsIHRoZSBjb250ZW50cyBvZiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTAotIyBmaWxlcyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YKLSMgdGhlIGRpcmVjdG9yeSB3aXRoaW4gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGUgc2FtZSBhcwotIyB0aGUgRUNMSVBTRV9ET0NfSUQgdmFsdWUuIEFmdGVyIGNvcHlpbmcgRWNsaXBzZSBuZWVkcyB0byBiZSByZXN0YXJ0ZWQgYmVmb3JlCi0jIHRoZSBoZWxwIGFwcGVhcnMuCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgdGhleSBmb3JtIGFuIEVjbGlwc2UgaGVscCBwbHVnaW4uIFRvCisjIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzIG1lbnUgaW4KKyMgRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIG5lZWRzCisjIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisjIHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4KKyMgQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUgdGhlIGhlbHAgYXBwZWFycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgogCiBHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KIAotIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KLSMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlCi0jIHRoaXMgbmFtZS4KKyMgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEVjbGlwc2UgaGVscCBwbHVnaW4uIFdoZW4gaW5zdGFsbGluZyB0aGUgcGx1Z2luCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZSB0aGlzCisjIG5hbWUuIEVhY2ggZG9jdW1lbnRhdGlvbiBzZXQgc2hvdWxkIGhhdmUgaXRzIG93biBpZGVudGlmaWVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0VDTElQU0VIRUxQIGlzIHNldCB0byBZRVMuCiAKIEVDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CiAKLSMgVGhlIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggYXQKLSMgdG9wIG9mIGVhY2ggSFRNTCBwYWdlLiBUaGUgdmFsdWUgTk8gKHRoZSBkZWZhdWx0KSBlbmFibGVzIHRoZSBpbmRleCBhbmQKLSMgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcyBpdC4KKyMgSWYgeW91IHdhbnQgZnVsbCBjb250cm9sIG92ZXIgdGhlIGxheW91dCBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgcGFnZXMgaXQgbWlnaHQKKyMgYmUgbmVjZXNzYXJ5IHRvIGRpc2FibGUgdGhlIGluZGV4IGFuZCByZXBsYWNlIGl0IHdpdGggeW91ciBvd24uIFRoZQorIyBESVNBQkxFX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgY29uZGVuc2VkIGluZGV4ICh0YWJzKSBhdCB0b3AKKyMgb2YgZWFjaCBIVE1MIHBhZ2UuIEEgdmFsdWUgb2YgTk8gZW5hYmxlcyB0aGUgaW5kZXggYW5kIHRoZSB2YWx1ZSBZRVMgZGlzYWJsZXMKKyMgaXQuIFNpbmNlIHRoZSB0YWJzIGluIHRoZSBpbmRleCBjb250YWluIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSBuYXZpZ2F0aW9uCisjIHRyZWUsIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIFlFUyBpZiB5b3UgYWxzbyBzZXQgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCiAKIERJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTwogCi0jIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzIChyYW5nZSBbMS4uMjBdKQotIyB0aGF0IGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KLQotRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQKLQogIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4Ci0jIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLgotIyBJZiB0aGUgdGFnIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZAotIyBjb250YWluaW5nIGEgdHJlZS1saWtlIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdAotIyBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMKLSMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuCi0jIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlIEhUTUwgaGVscCBmZWF0dXJlLgorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gSWYgdGhlIHRhZworIyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQgY29udGFpbmluZyBhIHRyZWUtbGlrZQorIyBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcworIyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZAorIyAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLiBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQorIyBIVE1MIGhlbHAgZmVhdHVyZS4gVmlhIGN1c3RvbSBzdHlsZXNoZWV0cyAoc2VlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCkgb25lIGNhbgorIyBmdXJ0aGVyIGZpbmUtdHVuZSB0aGUgbG9vayBvZiB0aGUgaW5kZXguIEFzIGFuIGV4YW1wbGUsIHRoZSBkZWZhdWx0IHN0eWxlCisjIHNoZWV0IGdlbmVyYXRlZCBieSBkb3h5Z2VuIGhhcyBhbiBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIHB1dCBhbiBpbWFnZSBhdAorIyB0aGUgcm9vdCBvZiB0aGUgdHJlZSBpbnN0ZWFkIG9mIHRoZSBQUk9KRUNUX05BTUUuIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMKKyMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCwgeW91IGNvdWxkIGNvbnNpZGVyIHNldHRpbmcKKyMgRElTQUJMRV9JTkRFWCB0byBZRVMgd2hlbiBlbmFibGluZyB0aGlzIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgogCiBHRU5FUkFURV9UUkVFVklFVyAgICAgID0gTk8KIAotIyBJZiB0aGUgdHJlZXZpZXcgaXMgZW5hYmxlZCAoc2VlIEdFTkVSQVRFX1RSRUVWSUVXKSB0aGVuIHRoaXMgdGFnIGNhbiBiZQotIyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUKLSMgaXMgc2hvd24uCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgdGhhdAorIyBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtIHZhbHVlcyBmcm9tIGFwcGVhcmluZworIyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgdXNlZAorIyB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIGlzIHNob3duLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxNTAwLCBkZWZhdWx0IHZhbHVlOiAyNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCiAKIFRSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKIAotIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuCi0jIGxpbmtzIHRvIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgV2hlbiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgb3BlbiBsaW5rcyB0bworIyBleHRlcm5hbCBzeW1ib2xzIGltcG9ydGVkIHZpYSB0YWcgZmlsZXMgaW4gYSBzZXBhcmF0ZSB3aW5kb3cuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KIAogRVhUX0xJTktTX0lOX1dJTkRPVyAgICA9IE5PCiAKLSMgVXNlIHRoaXMgdGFnIHRvIGNoYW5nZSB0aGUgZm9udCBzaXplIG9mIExhdGV4IGZvcm11bGFzIGluY2x1ZGVkCi0jIGFzIGltYWdlcyBpbiB0aGUgSFRNTCBkb2N1bWVudGF0aW9uLiBUaGUgZGVmYXVsdCBpcyAxMC4gTm90ZSB0aGF0Ci0jIHdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3h5Z2VuIHJ1biB5b3UgbmVlZAotIyB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeQotIyB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCiAKIEZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAogCiAjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcwotIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZQotIyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCi0jIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcwotIyBpbiB0aGUgSFRNTCBvdXRwdXQgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KIAogRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUwogCi0jIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94Ci0jIGZvciB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0Ci0jIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZwotIyBIVE1MIGhlbHAgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cwotIyAoR0VORVJBVEVfRE9DU0VUKSB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZAotIyB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lCi0jIGNhbiBiZSBzbG93LCB0aGVuIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdCBoYXZlIExhVGVYCisjIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MIG91dHB1dC4gV2hlbgorIyBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZCBjb25maWd1cmUgdGhlIHBhdGgKKyMgdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorIyB0aGUgTWF0aEpheCBvdXRwdXQuIFNlZSB0aGUgTWF0aEpheCBzaXRlIChzZWU6CisjIGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogSFRNTC1DU1MgKHdoaWNoIGlzIHNsb3dlciwgYnV0IGhhcyB0aGUgYmVzdAorIyBjb21wYXRpYmlsaXR5KSwgTmF0aXZlTU1MIChpLmUuIE1hdGhNTCkgYW5kIFNWRy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhUTUwtQ1NTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9GT1JNQVQgICAgICAgICA9IEhUTUwtQ1NTCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXggZGlyZWN0b3J5CisjIGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0byB0aGUgTWF0aEpheAorIyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQgaW5zdGFsbGluZworIyBNYXRoSmF4LiBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwgY29weSBvZgorIyBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTWF0aEpheAorIyBleHRlbnNpb24gbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuIEZvciBleGFtcGxlCisjIE1BVEhKQVhfRVhURU5TSU9OUyA9IFRlWC9BTVNtYXRoIFRlWC9BTVNzeW1ib2xzCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0KKworIyBUaGUgTUFUSEpBWF9DT0RFRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGZpbGUgd2l0aCBqYXZhc2NyaXB0IHBpZWNlcworIyBvZiBjb2RlIHRoYXQgd2lsbCBiZSB1c2VkIG9uIHN0YXJ0dXAgb2YgdGhlIE1hdGhKYXggY29kZS4gU2VlIHRoZSBNYXRoSmF4IHNpdGUKKyMgKHNlZTogaHR0cDovL2RvY3MubWF0aGpheC5vcmcvZW4vbGF0ZXN0L291dHB1dC5odG1sKSBmb3IgbW9yZSBkZXRhaWxzLiBGb3IgYW4KKyMgZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0NPREVGSUxFICAgICAgID0KKworIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveCBmb3IKKyMgdGhlIEhUTUwgb3V0cHV0LiBUaGUgdW5kZXJseWluZyBzZWFyY2ggZW5naW5lIHVzZXMgamF2YXNjcmlwdCBhbmQgREhUTUwgYW5kCisjIHNob3VsZCB3b3JrIG9uIGFueSBtb2Rlcm4gYnJvd3Nlci4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgSFRNTCBoZWxwCisjIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMgKEdFTkVSQVRFX0RPQ1NFVCkKKyMgdGhlcmUgaXMgYWxyZWFkeSBhIHNlYXJjaCBmdW5jdGlvbiBzbyB0aGlzIG9uZSBzaG91bGQgdHlwaWNhbGx5IGJlIGRpc2FibGVkLgorIyBGb3IgbGFyZ2UgcHJvamVjdHMgdGhlIGphdmFzY3JpcHQgYmFzZWQgc2VhcmNoIGVuZ2luZSBjYW4gYmUgc2xvdywgdGhlbgorIyBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLiBJdCBpcyBwb3NzaWJsZSB0bworIyBzZWFyY2ggdXNpbmcgdGhlIGtleWJvYXJkOyB0byBqdW1wIHRvIHRoZSBzZWFyY2ggYm94IHVzZSA8YWNjZXNzIGtleT4gKyBTCisjICh3aGF0IHRoZSA8YWNjZXNzIGtleT4gaXMgZGVwZW5kcyBvbiB0aGUgT1MgYW5kIGJyb3dzZXIsIGJ1dCBpdCBpcyB0eXBpY2FsbHkKKyMgPENUUkw+LCA8QUxUPi88b3B0aW9uPiwgb3IgYm90aCkuIEluc2lkZSB0aGUgc2VhcmNoIGJveCB1c2UgdGhlIDxjdXJzb3IgZG93bgorIyBrZXk+IHRvIGp1bXAgaW50byB0aGUgc2VhcmNoIHJlc3VsdHMgd2luZG93LCB0aGUgcmVzdWx0cyBjYW4gYmUgbmF2aWdhdGVkCisjIHVzaW5nIHRoZSA8Y3Vyc29yIGtleXM+LiBQcmVzcyA8RW50ZXI+IHRvIHNlbGVjdCBhbiBpdGVtIG9yIDxlc2NhcGU+IHRvIGNhbmNlbAorIyB0aGUgc2VhcmNoLiBUaGUgZmlsdGVyIG9wdGlvbnMgY2FuIGJlIHNlbGVjdGVkIHdoZW4gdGhlIGN1cnNvciBpcyBpbnNpZGUgdGhlCisjIHNlYXJjaCBib3ggYnkgcHJlc3NpbmcgPFNoaWZ0Pis8Y3Vyc29yIGRvd24+LiBBbHNvIGhlcmUgdXNlIHRoZSA8Y3Vyc29yIGtleXM+CisjIHRvIHNlbGVjdCBhIGZpbHRlciBhbmQgPEVudGVyPiBvciA8ZXNjYXBlPiB0byBhY3RpdmF0ZSBvciBjYW5jZWwgdGhlIGZpbHRlcgorIyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCiAKIFNFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMKIAogIyBXaGVuIHRoZSBTRVJWRVJfQkFTRURfU0VBUkNIIHRhZyBpcyBlbmFibGVkIHRoZSBzZWFyY2ggZW5naW5lIHdpbGwgYmUKLSMgaW1wbGVtZW50ZWQgdXNpbmcgYSBQSFAgZW5hYmxlZCB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYXQgdGhlIHdlYiBjbGllbnQKLSMgdXNpbmcgSmF2YXNjcmlwdC4gRG94eWdlbiB3aWxsIGdlbmVyYXRlIHRoZSBzZWFyY2ggUEhQIHNjcmlwdCBhbmQgaW5kZXgKLSMgZmlsZSB0byBwdXQgb24gdGhlIHdlYiBzZXJ2ZXIuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIHNlcnZlcgotIyBiYXNlZCBhcHByb2FjaCBpcyB0aGF0IGl0IHNjYWxlcyBiZXR0ZXIgdG8gbGFyZ2UgcHJvamVjdHMgYW5kIGFsbG93cwotIyBmdWxsIHRleHQgc2VhcmNoLiBUaGUgZGlzYWR2YW5jZXMgaXMgdGhhdCBpdCBpcyBtb3JlIGRpZmZpY3VsdCB0byBzZXR1cAotIyBhbmQgZG9lcyBub3QgaGF2ZSBsaXZlIHNlYXJjaGluZyBjYXBhYmlsaXRpZXMuCisjIGltcGxlbWVudGVkIHVzaW5nIGEgd2ViIHNlcnZlciBpbnN0ZWFkIG9mIGEgd2ViIGNsaWVudCB1c2luZyBKYXZhc2NyaXB0LiBUaGVyZQorIyBhcmUgdHdvIGZsYXZvcnMgb2Ygd2ViIHNlcnZlciBiYXNlZCBzZWFyY2hpbmcgZGVwZW5kaW5nIG9uIHRoZSBFWFRFUk5BTF9TRUFSQ0gKKyMgc2V0dGluZy4gV2hlbiBkaXNhYmxlZCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUEhQIHNjcmlwdCBmb3Igc2VhcmNoaW5nIGFuZAorIyBhbiBpbmRleCBmaWxlIHVzZWQgYnkgdGhlIHNjcmlwdC4gV2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMgZW5hYmxlZCB0aGUgaW5kZXhpbmcKKyMgYW5kIHNlYXJjaGluZyBuZWVkcyB0byBiZSBwcm92aWRlZCBieSBleHRlcm5hbCB0b29scy4gU2VlIHRoZSBzZWN0aW9uCisjICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCiAKIFNFUlZFUl9CQVNFRF9TRUFSQ0ggICAgPSBOTwogCisjIFdoZW4gRVhURVJOQUxfU0VBUkNIIHRhZyBpcyBlbmFibGVkIGRveHlnZW4gd2lsbCBubyBsb25nZXIgZ2VuZXJhdGUgdGhlIFBIUAorIyBzY3JpcHQgZm9yIHNlYXJjaGluZy4gSW5zdGVhZCB0aGUgc2VhcmNoIHJlc3VsdHMgYXJlIHdyaXR0ZW4gdG8gYW4gWE1MIGZpbGUKKyMgd2hpY2ggbmVlZHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IGFuIGV4dGVybmFsIGluZGV4ZXIuIERveHlnZW4gd2lsbCBpbnZva2UgYW4KKyMgZXh0ZXJuYWwgc2VhcmNoIGVuZ2luZSBwb2ludGVkIHRvIGJ5IHRoZSBTRUFSQ0hFTkdJTkVfVVJMIG9wdGlvbiB0byBvYnRhaW4gdGhlCisjIHNlYXJjaCByZXN1bHRzLgorIworIyBEb3h5Z2VuIHNoaXBzIHdpdGggYW4gZXhhbXBsZSBpbmRleGVyICggZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuCisjCisjIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0ggICAgICAgID0gTk8KKworIyBUaGUgU0VBUkNIRU5HSU5FX1VSTCBzaG91bGQgcG9pbnQgdG8gYSBzZWFyY2ggZW5naW5lIGhvc3RlZCBieSBhIHdlYiBzZXJ2ZXIKKyMgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKCBkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4gU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQKKyMgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hFTkdJTkVfVVJMICAgICAgID0KKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZSB1bmluZGV4ZWQKKyMgc2VhcmNoIGRhdGEgaXMgd3JpdHRlbiB0byBhIGZpbGUgZm9yIGluZGV4aW5nIGJ5IGFuIGV4dGVybmFsIHRvb2wuIFdpdGggdGhlCisjIFNFQVJDSERBVEFfRklMRSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IHNlYXJjaGRhdGEueG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSERBVEFfRklMRSAgICAgICAgPSBzZWFyY2hkYXRhLnhtbAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlCisjIEVYVEVSTkFMX1NFQVJDSF9JRCB0YWcgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2plY3QuIFRoaXMgaXMKKyMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRvIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlCisjIHByb2plY3RzIGFuZCByZWRpcmVjdCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSByaWdodCBwcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSF9JRCAgICAgPQorCisjIFRoZSBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBzZWFyY2hpbmcgdGhyb3VnaCBkb3h5Z2VuCisjIHByb2plY3RzIG90aGVyIHRoYW4gdGhlIG9uZSBkZWZpbmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLCBidXQgdGhhdCBhcmUKKyMgYWxsIGFkZGVkIHRvIHRoZSBzYW1lIGV4dGVybmFsIHNlYXJjaCBpbmRleC4gRWFjaCBwcm9qZWN0IG5lZWRzIHRvIGhhdmUgYQorIyB1bmlxdWUgaWQgc2V0IHZpYSBFWFRFUk5BTF9TRUFSQ0hfSUQuIFRoZSBzZWFyY2ggbWFwcGluZyB0aGVuIG1hcHMgdGhlIGlkIG9mCisjIHRvIGEgcmVsYXRpdmUgbG9jYXRpb24gd2hlcmUgdGhlIGRvY3VtZW50YXRpb24gY2FuIGJlIGZvdW5kLiBUaGUgZm9ybWF0IGlzOgorIyBFWFRSQV9TRUFSQ0hfTUFQUElOR1MgPSB0YWduYW1lMT1sb2MxIHRhZ25hbWUyPWxvYzIgLi4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworRVhUUkFfU0VBUkNIX01BUFBJTkdTICA9CisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIExhVGVYIG91dHB1dAorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCi0jIGdlbmVyYXRlIExhdGV4IG91dHB1dC4KKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBMYVRlWCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCiAKIEdFTkVSQVRFX0xBVEVYICAgICAgICAgPSBOTwogCi0jIFRoZSBMQVRFWF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgTGFUZVggZG9jcyB3aWxsIGJlIHB1dC4KLSMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQotIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCiAKIExBVEVYX09VVFBVVCAgICAgICAgICAgPSBsYXRleAogCiAjIFRoZSBMQVRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgTGFUZVggY29tbWFuZCBuYW1lIHRvIGJlCi0jIGludm9rZWQuIElmIGxlZnQgYmxhbmsgYGxhdGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgY29tbWFuZCBuYW1lLgotIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvcgotIyBnZW5lcmF0aW5nIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUKLSMgTWFrZWZpbGUgdGhhdCBpcyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBpbnZva2VkLgorIworIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvciBnZW5lcmF0aW5nCisjIGJpdG1hcHMgZm9yIGZvcm11bGFzIGluIHRoZSBIVE1MIG91dHB1dCwgYnV0IG5vdCBpbiB0aGUgTWFrZWZpbGUgdGhhdCBpcworIyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBsYXRleC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCiAKIExBVEVYX0NNRF9OQU1FICAgICAgICAgPSBsYXRleAogCi0jIFRoZSBNQUtFSU5ERVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNvbW1hbmQgbmFtZSB0bwotIyBnZW5lcmF0ZSBpbmRleCBmb3IgTGFUZVguIElmIGxlZnQgYmxhbmsgYG1ha2VpbmRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZQotIyBkZWZhdWx0IGNvbW1hbmQgbmFtZS4KKyMgVGhlIE1BS0VJTkRFWF9DTURfTkFNRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29tbWFuZCBuYW1lIHRvIGdlbmVyYXRlCisjIGluZGV4IGZvciBMYVRlWC4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbWFrZWluZGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KIAogTUFLRUlOREVYX0NNRF9OQU1FICAgICA9IG1ha2VpbmRleAogCi0jIElmIHRoZSBDT01QQUNUX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdAotIyBMYVRlWCBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvCi0jIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLgorIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgTGFUZVgKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KIAogQ09NUEFDVF9MQVRFWCAgICAgICAgICA9IE5PCiAKLSMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQKLSMgYnkgdGhlIHByaW50ZXIuIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGE0LCBhNHdpZGUsIGxldHRlciwgbGVnYWwgYW5kCi0jIGV4ZWN1dGl2ZS4gSWYgbGVmdCBibGFuayBhNHdpZGUgd2lsbCBiZSB1c2VkLgorIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCBieSB0aGUKKyMgcHJpbnRlci4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogYTQgKDIxMCB4IDI5NyBtbSksIGxldHRlciAoOC41IHggMTEgaW5jaGVzKSwgbGVnYWwgKDguNSB4CisjIDE0IGluY2hlcykgYW5kIGV4ZWN1dGl2ZSAoNy4yNSB4IDEwLjUgaW5jaGVzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGE0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KIAotUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0d2lkZQorUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0CiAKLSMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBuYW1lcyBvZiBMYVRlWAotIyBwYWNrYWdlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LgorIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTGFUZVggcGFja2FnZSBuYW1lcworIyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LiBUbyBnZXQgdGhlIHRpbWVzIGZvbnQgZm9yCisjIGluc3RhbmNlIHlvdSBjYW4gc3BlY2lmeQorIyBFWFRSQV9QQUNLQUdFUz10aW1lcworIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgogCiBFWFRSQV9QQUNLQUdFUyAgICAgICAgID0KIAotIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvcgotIyB0aGUgZ2VuZXJhdGVkIGxhdGV4IGRvY3VtZW50LiBUaGUgaGVhZGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgdW50aWwKLSMgdGhlIGZpcnN0IGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKLSMgc3RhbmRhcmQgaGVhZGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIHRoZSBmaXJzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGhlYWRlci4gU2VlCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbGV0IGRveHlnZW4gd3JpdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHRvIGEgc2VwYXJhdGUgZmlsZS4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgaGVhZGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgVGhlCisjIGZvbGxvd2luZyBjb21tYW5kcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSB0aGUgaGVhZGVyOiAkdGl0bGUsCisjICRkYXRldGltZSwgJGRhdGUsICRkb3h5Z2VudmVyc2lvbiwgJHByb2plY3RuYW1lLCAkcHJvamVjdG51bWJlciwKKyMgJHByb2plY3RicmllZiwgJHByb2plY3Rsb2dvLiBEb3h5Z2VuIHdpbGwgcmVwbGFjZSAkdGl0bGUgd2l0aCB0aGUgZW1weSBzdHJpbmcsCisjIGZvciB0aGUgcmVwbGFjZW1lbnQgdmFsdWVzIG9mIHRoZSBvdGhlciBjb21tYW5kcyB0aGUgdXNlciBpcyByZWZlcnJlZCB0bworIyBIVE1MX0hFQURFUi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCiAKIExBVEVYX0hFQURFUiAgICAgICAgICAgPQogCi0jIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkCi0jIGlzIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIHBkZiAodXNpbmcgcHMycGRmKS4gVGhlIHBkZiBmaWxlIHdpbGwKLSMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMKLSMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLgorIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvciB0aGUKKyMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgZm9vdGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBmb290ZXIuIFNlZQorIyBMQVRFWF9IRUFERVIgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIGEgZGVmYXVsdCBmb290ZXIgYW5kIHdoYXQKKyMgc3BlY2lhbCBjb21tYW5kcyBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGZvb3Rlci4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgZm9vdGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEKKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCiAKLVBERl9IWVBFUkxJTktTICAgICAgICAgPSBOTworTEFURVhfRk9PVEVSICAgICAgICAgICA9CiAKLSMgSWYgdGhlIFVTRV9QREZMQVRFWCB0YWcgaXMgc2V0IHRvIFlFUywgcGRmbGF0ZXggd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YKLSMgcGxhaW4gbGF0ZXggaW4gdGhlIGdlbmVyYXRlZCBNYWtlZmlsZS4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQorIyBUaGUgTEFURVhfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBMQVRFWF9PVVRQVVQgb3V0cHV0CisjIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yCisjIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRVhUUkFfRklMRVMgICAgICA9CisKKyMgSWYgdGhlIFBERl9IWVBFUkxJTktTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgTGFUZVggdGhhdCBpcyBnZW5lcmF0ZWQgaXMKKyMgcHJlcGFyZWQgZm9yIGNvbnZlcnNpb24gdG8gUERGICh1c2luZyBwczJwZGYgb3IgcGRmbGF0ZXgpLiBUaGUgUERGIGZpbGUgd2lsbAorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4gVGhpcworIyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBQREYgdmlld2VyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworUERGX0hZUEVSTElOS1MgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCB1c2UgcGRmbGF0ZXggdG8gZ2VuZXJhdGUKKyMgdGhlIFBERiBmaWxlIGRpcmVjdGx5IGZyb20gdGhlIExhVGVYIGZpbGVzLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhCiAjIGhpZ2hlciBxdWFsaXR5IFBERiBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KIAotVVNFX1BERkxBVEVYICAgICAgICAgICA9IE5PCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTCiAKLSMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXFxiYXRjaG1vZGUuCi0jIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXAKLSMgcnVubmluZyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLgotIyBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuCisjIElmIHRoZSBMQVRFWF9CQVRDSE1PREUgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBhZGQgdGhlIFxiYXRjaG1vZGUKKyMgY29tbWFuZCB0byB0aGUgZ2VuZXJhdGVkIExhVGVYIGZpbGVzLiBUaGlzIHdpbGwgaW5zdHJ1Y3QgTGFUZVggdG8ga2VlcCBydW5uaW5nCisjIGlmIGVycm9ycyBvY2N1ciwgaW5zdGVhZCBvZiBhc2tpbmcgdGhlIHVzZXIgZm9yIGhlbHAuIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZAorIyB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KIAogTEFURVhfQkFUQ0hNT0RFICAgICAgICA9IE5PCiAKLSMgSWYgTEFURVhfSElERV9JTkRJQ0VTIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90Ci0jIGluY2x1ZGUgdGhlIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKQotIyBpbiB0aGUgb3V0cHV0LgorIyBJZiB0aGUgTEFURVhfSElERV9JTkRJQ0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdCBpbmNsdWRlIHRoZQorIyBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikgaW4gdGhlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KIAogTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCiAKLSMgSWYgTEFURVhfU09VUkNFX0NPREUgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlCi0jIHNvdXJjZSBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgotIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzCi0jIHN1Y2ggYXMgU09VUkNFX0JST1dTRVIuCisjIElmIHRoZSBMQVRFWF9TT1VSQ0VfQ09ERSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlIHNvdXJjZQorIyBjb2RlIHdpdGggc3ludGF4IGhpZ2hsaWdodGluZyBpbiB0aGUgTGFUZVggb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCiAKIExBVEVYX1NPVVJDRV9DT0RFICAgICAgPSBOTwogCisjIFRoZSBMQVRFWF9CSUJfU1RZTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHN0eWxlIHRvIHVzZSBmb3IgdGhlCisjIGJpYmxpb2dyYXBoeSwgZS5nLiBwbGFpbm5hdCwgb3IgaWVlZXRyLiBTZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggYW5kIFxjaXRlIGZvciBtb3JlIGluZm8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBwbGFpbi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JJQl9TVFlMRSAgICAgICAgPSBwbGFpbgorCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBSVEYgb3V0cHV0CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgSWYgdGhlIEdFTkVSQVRFX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgUlRGIG91dHB1dAotIyBUaGUgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB2ZXJ5IHByZXR0eSB3aXRoCi0jIG90aGVyIFJURiByZWFkZXJzIG9yIGVkaXRvcnMuCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQuIFRoZQorIyBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHRvbyBwcmV0dHkgd2l0aCBvdGhlciBSVEYKKyMgcmVhZGVycy9lZGl0b3JzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCiAKIEdFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTwogCi0jIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LgotIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCi0jIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgcnRmJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKyMgVGhlIFJURl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgUlRGIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IHJ0Zi4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgogCiBSVEZfT1VUUFVUICAgICAgICAgICAgID0gcnRmCiAKLSMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdAotIyBSVEYgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0bwotIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgSWYgdGhlIENPTVBBQ1RfUlRGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBSVEYKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCiAKIENPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTwogCi0jIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZAotIyB3aWxsIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwKLSMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuCi0jIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIFdPUkQgb3Igb3RoZXIKLSMgcHJvZ3JhbXMgd2hpY2ggc3VwcG9ydCB0aG9zZSBmaWVsZHMuCi0jIE5vdGU6IHdvcmRwYWQgKHdyaXRlKSBhbmQgb3RoZXJzIGRvIG5vdCBzdXBwb3J0IGxpbmtzLgorIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgogCiBSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KIAotIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MKLSMgY29uZmlnIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZQotIyByZXBsYWNlbWVudHMsIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCiAKIFJURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQogCi0jIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBydGYgZG9jdW1lbnQuCi0jIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4KKyMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIFJURiBkb2N1bWVudC4gU3ludGF4IGlzCisjIHNpbWlsYXIgdG8gZG94eWdlbidzIGNvbmZpZyBmaWxlLiBBIHRlbXBsYXRlIGV4dGVuc2lvbnMgZmlsZSBjYW4gYmUgZ2VuZXJhdGVkCisjIHVzaW5nIGRveHlnZW4gLWUgcnRmIGV4dGVuc2lvbkZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KIAogUlRGX0VYVEVOU0lPTlNfRklMRSAgICA9CiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAotIyBnZW5lcmF0ZSBtYW4gcGFnZXMKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbWFuIHBhZ2VzIGZvcgorIyBjbGFzc2VzIGFuZCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBHRU5FUkFURV9NQU4gICAgICAgICAgID0gTk8KIAotIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuCi0jIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUKLSMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBtYW4nIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLgorIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LiBBIGRpcmVjdG9yeSBtYW4zIHdpbGwgYmUgY3JlYXRlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkKKyMgTUFOX09VVFBVVC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBtYW4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KIAogTUFOX09VVFBVVCAgICAgICAgICAgICA9IG1hbgogCi0jIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0bwotIyB0aGUgZ2VuZXJhdGVkIG1hbiBwYWdlcyAoZGVmYXVsdCBpcyB0aGUgc3Vicm91dGluZSdzIHNlY3Rpb24gLjMpCisjIFRoZSBNQU5fRVhURU5TSU9OIHRhZyBkZXRlcm1pbmVzIHRoZSBleHRlbnNpb24gdGhhdCBpcyBhZGRlZCB0byB0aGUgZ2VuZXJhdGVkCisjIG1hbiBwYWdlcy4gSW4gY2FzZSB0aGUgbWFudWFsIHNlY3Rpb24gZG9lcyBub3Qgc3RhcnQgd2l0aCBhIG51bWJlciwgdGhlIG51bWJlcgorIyAzIGlzIHByZXBlbmRlZC4gVGhlIGRvdCAoLikgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgTUFOX0VYVEVOU0lPTiB0YWcgaXMKKyMgb3B0aW9uYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAuMy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgogCiBNQU5fRVhURU5TSU9OICAgICAgICAgID0gLjMKIAotIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBEb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LAotIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5Ci0jIGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMKLSMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0IHRoZW0gdGhlIG1hbiBjb21tYW5kCi0jIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLgorIyBUaGUgTUFOX1NVQkRJUiB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IGNyZWF0ZWQgd2l0aGluCisjIE1BTl9PVVRQVVQgaW4gd2hpY2ggdGhlIG1hbiBwYWdlcyBhcmUgcGxhY2VkLiBJZiBkZWZhdWx0cyB0byBtYW4gZm9sbG93ZWQgYnkKKyMgTUFOX0VYVEVOU0lPTiB3aXRoIHRoZSBpbml0aWFsIC4gcmVtb3ZlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgorCitNQU5fU1VCRElSICAgICAgICAgICAgID0KKworIyBJZiB0aGUgTUFOX0xJTktTIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBkb3h5Z2VuIGdlbmVyYXRlcyBtYW4gb3V0cHV0LCB0aGVuIGl0CisjIHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5IGRvY3VtZW50ZWQgaW4gdGhlIHJlYWwKKyMgbWFuIHBhZ2UocykuIFRoZXNlIGFkZGl0aW9uYWwgZmlsZXMgb25seSBzb3VyY2UgdGhlIHJlYWwgbWFuIHBhZ2UsIGJ1dCB3aXRob3V0CisjIHRoZW0gdGhlIG1hbiBjb21tYW5kIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX01BTiBpcyBzZXQgdG8gWUVTLgogCiBNQU5fTElOS1MgICAgICAgICAgICAgID0gTk8KIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgWE1MIG91dHB1dAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCi0jIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgotIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjIElmIHRoZSBHRU5FUkFURV9YTUwgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQKKyMgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCiAKLSMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LgotIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlCi0jIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgeG1sJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4KKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiB4bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KIAogWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAogCi0jIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBzY2hlbWEsCi0jIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQotIyBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KLQotWE1MX1NDSEVNQSAgICAgICAgICAgICA9Ci0KLSMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIERURCwKLSMgd2hpY2ggY2FuIGJlIHVzZWQgYnkgYSB2YWxpZGF0aW5nIFhNTCBwYXJzZXIgdG8gY2hlY2sgdGhlCi0jIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLgotCi1YTUxfRFREICAgICAgICAgICAgICAgID0KLQotIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAotIyBkdW1wIHRoZSBwcm9ncmFtIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZwotIyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQKLSMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGR1bXAgdGhlIHByb2dyYW0KKyMgbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8KKyMgdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZQorIyBvZiB0aGUgWE1MIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgogCiBYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQKKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIERPQ0JPT0sgb3V0cHV0CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbAotIyBnZW5lcmF0ZSBhbiBBdXRvR2VuIERlZmluaXRpb25zIChzZWUgYXV0b2dlbi5zZi5uZXQpIGZpbGUKLSMgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwKLSMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwKLSMgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ0JPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMgSWYgdGhlIERPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGluY2x1ZGUgdGhlCisjIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZworIyBpbmZvcm1hdGlvbikgdG8gdGhlIERPQ0JPT0sgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkKKyMgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIERPQ0JPT0sgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBBdXRvR2VuCisjIERlZmluaXRpb25zIChzZWUgaHR0cDovL2F1dG9nZW4uc2YubmV0KSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZgorIyB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwKKyMgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dAorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsCi0jIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YKLSMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcwotIyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUKLSMgbW9tZW50LgorIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZQorIyBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgc3RpbGwgZXhwZXJpbWVudGFsIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KIAogR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PCiAKLSMgSWYgdGhlIFBFUkxNT0RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlCi0jIHRoZSBuZWNlc3NhcnkgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlCi0jIHRvIGdlbmVyYXRlIFBERiBhbmQgRFZJIG91dHB1dCBmcm9tIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQuCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5CisjIE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBQREYgYW5kIERWSQorIyBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCiAKIFBFUkxNT0RfTEFURVggICAgICAgICAgPSBOTwogCi0jIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUKLSMgbmljZWx5IGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLgotIyBUaGlzIGlzIHVzZWZ1bAotIyBpZiB5b3Ugd2FudCB0byB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uCi0jIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzCi0jIHRhZyBpcyBzZXQgdG8gTk8gdGhlIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlcgotIyBhbmQgUGVybCB3aWxsIHBhcnNlIGl0IGp1c3QgdGhlIHNhbWUuCisjIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8gdGhlCisjIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0CisjIGp1c3QgdGhlIHNhbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCiAKIFBFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKIAotIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZQotIyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLgotIyBUaGlzIGlzIHVzZWZ1bCBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUKLSMgTWFrZWZpbGUgZG9uJ3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisjIFRoZSBuYW1lcyBvZiB0aGUgbWFrZSB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBkb3h5cnVsZXMubWFrZSBmaWxlIGFyZQorIyBwcmVmaXhlZCB3aXRoIHRoZSBzdHJpbmcgY29udGFpbmVkIGluIFBFUkxNT0RfTUFLRVZBUl9QUkVGSVguIFRoaXMgaXMgdXNlZnVsCisjIHNvIGRpZmZlcmVudCBkb3h5cnVsZXMubWFrZSBmaWxlcyBpbmNsdWRlZCBieSB0aGUgc2FtZSBNYWtlZmlsZSBkb24ndAorIyBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIHZhcmlhYmxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1BFUkxNT0QgaXMgc2V0IHRvIFlFUy4KIAogUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9CiAKQEAgLTEzMTAsMTE3ICsxOTIxLDEzNCBAQAogIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCi0jIGV2YWx1YXRlIGFsbCBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlCi0jIGZpbGVzLgorIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGV2YWx1YXRlIGFsbAorIyBDLXByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGZvdW5kIGluIHRoZSBzb3VyY2VzIGFuZCBpbmNsdWRlIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBFTkFCTEVfUFJFUFJPQ0VTU0lORyAgID0gWUVTCiAKLSMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybwotIyBuYW1lcyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgY29uZGl0aW9uYWwKLSMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQKLSMgd2F5IGJ5IHNldHRpbmcgRVhQQU5EX09OTFlfUFJFREVGIHRvIFlFUy4KKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcworIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTyBvbmx5IGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIHdpbGwgYmUKKyMgcGVyZm9ybWVkLiBNYWNybyBleHBhbnNpb24gY2FuIGJlIGRvbmUgaW4gYSBjb250cm9sbGVkIHdheSBieSBzZXR0aW5nCisjIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCiAKIE1BQ1JPX0VYUEFOU0lPTiAgICAgICAgPSBZRVMKIAotIyBJZiB0aGUgRVhQQU5EX09OTFlfUFJFREVGIGFuZCBNQUNST19FWFBBTlNJT04gdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTCi0jIHRoZW4gdGhlIG1hY3JvIGV4cGFuc2lvbiBpcyBsaW1pdGVkIHRvIHRoZSBtYWNyb3Mgc3BlY2lmaWVkIHdpdGggdGhlCi0jIFBSRURFRklORUQgYW5kIEVYUEFORF9BU19ERUZJTkVEIHRhZ3MuCisjIElmIHRoZSBFWFBBTkRfT05MWV9QUkVERUYgYW5kIE1BQ1JPX0VYUEFOU0lPTiB0YWdzIGFyZSBib3RoIHNldCB0byBZRVMgdGhlbgorIyB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUgUFJFREVGSU5FRCBhbmQKKyMgRVhQQU5EX0FTX0RFRklORUQgdGFncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KIAogRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUwogCi0jIElmIHRoZSBTRUFSQ0hfSU5DTFVERVMgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSB0aGUgaW5jbHVkZXMgZmlsZXMKLSMgaW4gdGhlIElOQ0xVREVfUEFUSCAoc2VlIGJlbG93KSB3aWxsIGJlIHNlYXJjaCBpZiBhICNpbmNsdWRlIGlzIGZvdW5kLgorIyBJZiB0aGUgU0VBUkNIX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBpbmNsdWRlcyBmaWxlcyBpbiB0aGUKKyMgSU5DTFVERV9QQVRIIHdpbGwgYmUgc2VhcmNoZWQgaWYgYSAjaW5jbHVkZSBpcyBmb3VuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCiAKIFNFQVJDSF9JTkNMVURFUyAgICAgICAgPSBZRVMKIAogIyBUaGUgSU5DTFVERV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKLSMgY29udGFpbiBpbmNsdWRlIGZpbGVzIHRoYXQgYXJlIG5vdCBpbnB1dCBmaWxlcyBidXQgc2hvdWxkIGJlIHByb2Nlc3NlZCBieQotIyB0aGUgcHJlcHJvY2Vzc29yLgorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5IHRoZQorIyBwcmVwcm9jZXNzb3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hfSU5DTFVERVMgaXMgc2V0IHRvIFlFUy4KIAogSU5DTFVERV9QQVRIICAgICAgICAgICA9CiAKICMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAogIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCi0jIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsCi0jIGJlIHVzZWQuCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgogCiBJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0KIAotIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0Ci0jIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZgotIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lCi0jIG9yIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSA9IGFyZQotIyBvbWl0dGVkID0xIGlzIGFzc3VtZWQuIFRvIHByZXZlbnQgYSBtYWNybyBkZWZpbml0aW9uIGZyb20gYmVpbmcKLSMgdW5kZWZpbmVkIHZpYSAjdW5kZWYgb3IgcmVjdXJzaXZlbHkgZXhwYW5kZWQgdXNlIHRoZSA6PSBvcGVyYXRvcgotIyBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLgorIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IGFyZQorIyBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZiBlLmcuCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgb3IKKyMgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlICI9IiBhcmUgb21pdHRlZCwgIj0xIgorIyBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yCisjIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCiAKLVBSRURFRklORUQgICAgICAgICAgICAgPSAiX19hdHRyaWJ1dGVfXyh4KT0iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiREVDTEFSRV9BTElHTkVEKGEsdCxuKT10IG4iIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0b2YoeCx5KT0weDQyIiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXZfYWxsb2Nfc2l6ZSBcCitQUkVERUZJTkVEICAgICAgICAgICAgID0gX19hdHRyaWJ1dGVfXyh4KT0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICJERUNMQVJFX0FMSUdORUQobix0LHYpPXQgdiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldG9mKHgseSk9MHg0MiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYWxsb2Nfc2l6ZSguLi4pPSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoeCx5KT0xIFwKICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9HQ0NfVkVSU0lPTl9BVF9NT1NUKHgseSk9MCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgX19HTlVDX189MSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgX19HTlVDX18KIAotIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuCi0jIHRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLgotIyBUaGUgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4KLSMgVXNlIHRoZSBQUkVERUZJTkVEIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbi4KKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KIAotRVhQQU5EX0FTX0RFRklORUQgICAgICA9IGRlY2xhcmVfaWRjdCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURfUEFSX0RBVEEgXAorRVhQQU5EX0FTX0RFRklORUQgICAgICA9CiAKLSMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbgotIyBkb3h5Z2VuJ3MgcHJlcHJvY2Vzc29yIHdpbGwgcmVtb3ZlIGFsbCBmdW5jdGlvbi1saWtlIG1hY3JvcyB0aGF0IGFyZSBhbG9uZQotIyBvbiBhIGxpbmUsIGhhdmUgYW4gYWxsIHVwcGVyY2FzZSBuYW1lLCBhbmQgZG8gbm90IGVuZCB3aXRoIGEgc2VtaWNvbG9uLiBTdWNoCi0jIGZ1bmN0aW9uIG1hY3JvcyBhcmUgdHlwaWNhbGx5IHVzZWQgZm9yIGJvaWxlci1wbGF0ZSBjb2RlLCBhbmQgd2lsbCBjb25mdXNlCi0jIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAorIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlCisjIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MKKyMgYXJlIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAorIyByZW1vdmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KIAogU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUwogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gZXh0ZXJuYWwgcmVmZXJlbmNlcwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jIFRoZSBUQUdGSUxFUyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWdmaWxlcy4KLSMgT3B0aW9uYWxseSBhbiBpbml0aWFsIGxvY2F0aW9uIG9mIHRoZSBleHRlcm5hbCBkb2N1bWVudGF0aW9uCi0jIGNhbiBiZSBhZGRlZCBmb3IgZWFjaCB0YWdmaWxlLiBUaGUgZm9ybWF0IG9mIGEgdGFnIGZpbGUgd2l0aG91dAotIyB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6Ci0jCisjIFRoZSBUQUdGSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB0YWcgZmlsZXMuIEZvciBlYWNoIHRhZworIyBmaWxlIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgYWRkZWQuIFRoZSBmb3JtYXQgb2YKKyMgYSB0YWcgZmlsZSB3aXRob3V0IHRoaXMgbG9jYXRpb24gaXMgYXMgZm9sbG93czoKICMgVEFHRklMRVMgPSBmaWxlMSBmaWxlMiAuLi4KICMgQWRkaW5nIGxvY2F0aW9uIGZvciB0aGUgdGFnIGZpbGVzIGlzIGRvbmUgYXMgZm9sbG93czoKLSMKICMgVEFHRklMRVMgPSBmaWxlMT1sb2MxICJmaWxlMiA9IGxvYzIiIC4uLgotIyB3aGVyZSAibG9jMSIgYW5kICJsb2MyIiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IKLSMgVVJMcy4gSWYgYSBsb2NhdGlvbiBpcyBwcmVzZW50IGZvciBlYWNoIHRhZywgdGhlIGluc3RhbGxkb3ggdG9vbAotIyBkb2VzIG5vdCBoYXZlIHRvIGJlIHJ1biB0byBjb3JyZWN0IHRoZSBsaW5rcy4KLSMgTm90ZSB0aGF0IGVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUKLSMgKHdoZXJlIHRoZSBuYW1lIGRvZXMgTk9UIGluY2x1ZGUgdGhlIHBhdGgpCi0jIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuCi0jIGlzIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisjIHdoZXJlIGxvYzEgYW5kIGxvYzIgY2FuIGJlIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGhzIG9yIFVSTHMuIFNlZSB0aGUKKyMgc2VjdGlvbiAiTGlua2luZyB0byBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNlCisjIG9mIHRhZyBmaWxlcy4KKyMgTm90ZTogRWFjaCB0YWcgZmlsZSBtdXN0IGhhdmUgYSB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCiAKIFRBR0ZJTEVTICAgICAgICAgICAgICAgPQogCi0jIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUKLSMgYSB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4KKyMgV2hlbiBhIGZpbGUgbmFtZSBpcyBzcGVjaWZpZWQgYWZ0ZXIgR0VORVJBVEVfVEFHRklMRSwgZG94eWdlbiB3aWxsIGNyZWF0ZSBhCisjIHRhZyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGlucHV0IGZpbGVzIGl0IHJlYWRzLiBTZWUgc2VjdGlvbiAiTGlua2luZyB0bworIyBleHRlcm5hbCBkb2N1bWVudGF0aW9uIiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdXNhZ2Ugb2YgdGFnIGZpbGVzLgogCiBHRU5FUkFURV9UQUdGSUxFICAgICAgID0KIAotIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzc2VzIHdpbGwgYmUgbGlzdGVkCi0jIGluIHRoZSBjbGFzcyBpbmRleC4gSWYgc2V0IHRvIE5PIG9ubHkgdGhlIGluaGVyaXRlZCBleHRlcm5hbCBjbGFzc2VzCi0jIHdpbGwgYmUgbGlzdGVkLgorIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUKKyMgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgogCiBBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KIAotIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQKLSMgaW4gdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwKLSMgYmUgbGlzdGVkLgorIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCiAKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCiAjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAotIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mIGB3aGljaCBwZXJsJykuCisjIGludGVycHJldGVyIChpLmUuIHRoZSByZXN1bHQgb2YgJ3doaWNoIHBlcmwnKS4KKyMgVGhlIGRlZmF1bHQgZmlsZSAod2l0aCBhYnNvbHV0ZSBwYXRoKSBpczogL3Vzci9iaW4vcGVybC4KIAogUEVSTF9QQVRIICAgICAgICAgICAgICA9IC91c3IvYmluL3BlcmwKIApAQCAtMTQyOCwyMDAgKzIwNTYsMzA0IEBACiAjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAotIyBnZW5lcmF0ZSBhIGluaGVyaXRhbmNlIGRpYWdyYW0gKGluIEhUTUwsIFJURiBhbmQgTGFUZVgpIGZvciBjbGFzc2VzIHdpdGggYmFzZQotIyBvciBzdXBlciBjbGFzc2VzLiBTZXR0aW5nIHRoZSB0YWcgdG8gTk8gdHVybnMgdGhlIGRpYWdyYW1zIG9mZi4gTm90ZSB0aGF0Ci0jIHRoaXMgb3B0aW9uIGlzIHN1cGVyc2VkZWQgYnkgdGhlIEhBVkVfRE9UIG9wdGlvbiBiZWxvdy4gVGhpcyBpcyBvbmx5IGEKLSMgZmFsbGJhY2suIEl0IGlzIHJlY29tbWVuZGVkIHRvIGluc3RhbGwgYW5kIHVzZSBkb3QsIHNpbmNlIGl0IHlpZWxkcyBtb3JlCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCisjIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bworIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCisjIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKICMgcG93ZXJmdWwgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgogCiBDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCiAKICMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKLSMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlCi0jIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykgdG8gcHJvZHVjZSB0aGUgY2hhcnQgYW5kIGluc2VydCBpdCBpbiB0aGUKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQogIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCiAjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCiAjIGRlZmF1bHQgc2VhcmNoIHBhdGguCiAKIE1TQ0dFTl9QQVRIICAgICAgICAgICAgPQogCi0jIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlCi0jIGluaGVyaXRhbmNlIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQKLSMgb3IgaXMgbm90IGEgY2xhc3MuCisjIFlvdSBjYW4gaW5jbHVkZSBkaWFncmFtcyBtYWRlIHdpdGggZGlhIGluIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gRG94eWdlbiB3aWxsCisjIHRoZW4gcnVuIGRpYSB0byBwcm9kdWNlIHRoZSBkaWFncmFtIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZQorIyBESUFfUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpYSBiaW5hcnkgcmVzaWRlcy4KKyMgSWYgbGVmdCBlbXB0eSBkaWEgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworRElBX1BBVEggICAgICAgICAgICAgICA9CisKKyMgSWYgc2V0IHRvIFlFUywgdGhlIGluaGVyaXRhbmNlIGFuZCBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIGhpZGUgaW5oZXJpdGFuY2UKKyMgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZCBvciBpcyBub3QgYSBjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUwogCiAjIElmIHlvdSBzZXQgdGhlIEhBVkVfRE9UIHRhZyB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgYXNzdW1lIHRoZSBkb3QgdG9vbCBpcwotIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbgotIyB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50IEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uCi0jIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpCisjIGF2YWlsYWJsZSBmcm9tIHRoZSBwYXRoLiBUaGlzIHRvb2wgaXMgcGFydCBvZiBHcmFwaHZpeiAoc2VlOgorIyBodHRwOi8vd3d3LmdyYXBodml6Lm9yZy8pLCBhIGdyYXBoIHZpc3VhbGl6YXRpb24gdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudAorIyBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIG5vIGVmZmVjdCBpZiB0aGlzIG9wdGlvbiBpcworIyBzZXQgdG8gTk8KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KIAogSEFWRV9ET1QgICAgICAgICAgICAgICA9IE5PCiAKLSMgVGhlIERPVF9OVU1fVEhSRUFEUyBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBkb3QgaW52b2NhdGlvbnMgZG94eWdlbiBpcwotIyBhbGxvd2VkIHRvIHJ1biBpbiBwYXJhbGxlbC4gV2hlbiBzZXQgdG8gMCAodGhlIGRlZmF1bHQpIGRveHlnZW4gd2lsbAotIyBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdAotIyBleHBsaWNpdGx5IHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMCB0byBnZXQgY29udHJvbCBvdmVyIHRoZSBiYWxhbmNlCi0jIGJldHdlZW4gQ1BVIGxvYWQgYW5kIHByb2Nlc3Npbmcgc3BlZWQuCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgogCiBET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAogCi0jIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHdyaXRlIGEgZm9udCBjYWxsZWQgRnJlZVNhbnMudHRmIHRvIHRoZSBvdXRwdXQKLSMgZGlyZWN0b3J5IGFuZCByZWZlcmVuY2UgaXQgaW4gYWxsIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4gZ2VuZXJhdGVzLiBUaGlzCi0jIGZvbnQgZG9lcyBub3QgaW5jbHVkZSBhbGwgcG9zc2libGUgdW5pY29kZSBjaGFyYWN0ZXJzIGhvd2V2ZXIsIHNvIHdoZW4geW91IG5lZWQKLSMgdGhlc2UgKG9yIGp1c3Qgd2FudCBhIGRpZmZlcmVudGx5IGxvb2tpbmcgZm9udCkgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb250IG5hbWUKLSMgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCBuZWVkIHRvIG1ha2Ugc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LAotIyB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUKLSMgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeQotIyBjb250YWluaW5nIHRoZSBmb250LgorIyBXaGVuIHlvdSB3YW50IGEgZGlmZmVyZW50bHkgbG9va2luZyBmb250IGluIHRoZSBkb3QgZmlsZXMgdGhhdCBkb3h5Z2VuCisjIGdlbmVyYXRlcyB5b3UgY2FuIHNwZWNpZnkgdGhlIGZvbnQgbmFtZSB1c2luZyBET1RfRk9OVE5BTUUuIFlvdSBuZWVkIHRvIG1ha2UKKyMgc3VyZSBkb3QgaXMgYWJsZSB0byBmaW5kIHRoZSBmb250LCB3aGljaCBjYW4gYmUgZG9uZSBieSBwdXR0aW5nIGl0IGluIGEKKyMgc3RhbmRhcmQgbG9jYXRpb24gb3IgYnkgc2V0dGluZyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkKKyMgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmb250LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogSGVsdmV0aWNhLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAotRE9UX0ZPTlROQU1FICAgICAgICAgICA9IEZyZWVTYW5zCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhCiAKLSMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBmb250IG9mIGRvdCBncmFwaHMuCi0jIFRoZSBkZWZhdWx0IHNpemUgaXMgMTBwdC4KKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIChpbiBwb2ludHMpIG9mIHRoZSBmb250IG9mCisjIGRvdCBncmFwaHMuCisjIE1pbmltdW0gdmFsdWU6IDQsIG1heGltdW0gdmFsdWU6IDI0LCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCiAKIERPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAogCi0jIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSB0byBsb29rIGZvciB0aGUKLSMgRnJlZVNhbnMudHRmIGZvbnQgKHdoaWNoIGRveHlnZW4gd2lsbCBwdXQgdGhlcmUgaXRzZWxmKS4gSWYgeW91IHNwZWNpZnkgYQotIyBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQgdGhlIHBhdGggd2hlcmUgZG90Ci0jIGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBCeSBkZWZhdWx0IGRveHlnZW4gd2lsbCB0ZWxsIGRvdCB0byB1c2UgdGhlIGRlZmF1bHQgZm9udCBhcyBzcGVjaWZpZWQgd2l0aAorIyBET1RfRk9OVE5BTUUuIElmIHlvdSBzcGVjaWZ5IGEgZGlmZmVyZW50IGZvbnQgdXNpbmcgRE9UX0ZPTlROQU1FIHlvdSBjYW4gc2V0CisjIHRoZSBwYXRoIHdoZXJlIGRvdCBjYW4gZmluZCBpdCB1c2luZyB0aGlzIHRhZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCiAKIERPVF9GT05UUEFUSCAgICAgICAgICAgPQogCi0jIElmIHRoZSBDTEFTU19HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4KLSMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZAotIyBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlCi0jIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uCisjIElmIHRoZSBDTEFTU19HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuCisjIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCiAKIENMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKIAotIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4KLSMgd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZAotIyBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kCi0jIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGltcGxlbWVudGF0aW9uCisjIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZQorIyBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCiAKIENPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKIAotIyBJZiB0aGUgR1JPVVBfR1JBUEhTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgotIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAogR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUwogCiAjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgaW5oZXJpdGFuY2UgYW5kCiAjIGNvbGxhYm9yYXRpb24gZGlhZ3JhbXMgaW4gYSBzdHlsZSBzaW1pbGFyIHRvIHRoZSBPTUcncyBVbmlmaWVkIE1vZGVsaW5nCiAjIExhbmd1YWdlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgogCiBVTUxfTE9PSyAgICAgICAgICAgICAgID0gTk8KIAotIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUKLSMgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpciBpbnN0YW5jZXMuCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgogCi1URU1QTEFURV9SRUxBVElPTlMgICAgID0gWUVTCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKIAotIyBJZiB0aGUgRU5BQkxFX1BSRVBST0NFU1NJTkcsIFNFQVJDSF9JTkNMVURFUywgSU5DTFVERV9HUkFQSCwgYW5kIEhBVkVfRE9UCi0jIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkCi0jIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoCi0jIG90aGVyIGRvY3VtZW50ZWQgZmlsZXMuCisjIElmIHRoZSBURU1QTEFURV9SRUxBVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpcgorIyBpbnN0YW5jZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgogCiBJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCiAKLSMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVEX0JZX0dSQVBILCBhbmQKLSMgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoCi0jIGRvY3VtZW50ZWQgaGVhZGVyIGZpbGUgc2hvd2luZyB0aGUgZG9jdW1lbnRlZCBmaWxlcyB0aGF0IGRpcmVjdGx5IG9yCi0jIGluZGlyZWN0bHkgaW5jbHVkZSB0aGlzIGZpbGUuCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAogSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUwogCi0jIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4KLSMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbCBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24KLSMgb3IgY2xhc3MgbWV0aG9kLiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlCi0jIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocwotIyBmb3Igc2VsZWN0ZWQgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgogCiBDQUxMX0dSQVBIICAgICAgICAgICAgID0gTk8KIAotIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4KLSMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbGVyIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbgotIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UKLSMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlcgotIyBncmFwaHMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGVyZ3JhcGggY29tbWFuZC4KKyMgSWYgdGhlIENBTExFUl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlcgorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCiAKIENBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTwogCi0jIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbgotIyB3aWxsIGdyYXBoaWNhbCBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLgorIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBncmFwaGljYWwKKyMgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCiAKIEdSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKIAotIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBILCBTSE9XX0RJUkVDVE9SSUVTIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTCi0jIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMKLSMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlCi0jIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUKKyMgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZQorIyBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUgcmVsYXRpb25zIGJldHdlZW4gdGhlCisjIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCiAKIERJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMKIAogIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcwotIyBnZW5lcmF0ZWQgYnkgZG90LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHBuZywganBnLCBvciBnaWYKLSMgSWYgbGVmdCBibGFuayBwbmcgd2lsbCBiZSB1c2VkLgorIyBnZW5lcmF0ZWQgYnkgZG90LgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywgcG5nOmNhaXJvLCBwbmc6Y2Fpcm86Y2Fpcm8sIHBuZzpjYWlybzpnZCwgcG5nOmdkLAorIyBwbmc6Z2Q6Z2QsIGpwZywganBnOmNhaXJvLCBqcGc6Y2Fpcm86Z2QsIGpwZzpnZCwganBnOmdkOmdkLCBnaWYsIGdpZjpjYWlybywKKyMgZ2lmOmNhaXJvOmdkLCBnaWY6Z2QsIGdpZjpnZDpnZCBhbmQgc3ZnLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcG5nLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAogRE9UX0lNQUdFX0ZPUk1BVCAgICAgICA9IHBuZwogCi0jIFRoZSB0YWcgRE9UX1BBVEggY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCisjIElmIERPVF9JTUFHRV9GT1JNQVQgaXMgc2V0IHRvIHN2ZywgdGhlbiB0aGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvIFlFUyB0bworIyBlbmFibGUgZ2VuZXJhdGlvbiBvZiBpbnRlcmFjdGl2ZSBTVkcgaW1hZ2VzIHRoYXQgYWxsb3cgem9vbWluZyBhbmQgcGFubmluZy4KKyMKKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLiBUZXN0ZWQKKyMgYW5kIHdvcmtpbmcgYXJlIEZpcmVmb3gsIENocm9tZSwgU2FmYXJpLCBhbmQgT3BlcmEuCisjIE5vdGU6IEZvciBJRSA5KyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlciB0byBtYWtlCisjIHRoZSBTVkcgZmlsZXMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0lOVEVSQUNUSVZFX1NWRyAgICAgICAgPSBOTworCisjIFRoZSBET1RfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGF0aCB3aGVyZSB0aGUgZG90IHRvb2wgY2FuIGJlCiAjIGZvdW5kLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkIHRoZSBkb3QgdG9vbCBjYW4gYmUgZm91bmQgaW4gdGhlIHBhdGguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgogCiBET1RfUEFUSCAgICAgICAgICAgICAgID0KIAogIyBUaGUgRE9URklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKLSMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUKLSMgXGRvdGZpbGUgY29tbWFuZCkuCisjIGNvbnRhaW4gZG90IGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlIFxkb3RmaWxlCisjIGNvbW1hbmQpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAogRE9URklMRV9ESVJTICAgICAgICAgICA9CiAKLSMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YKLSMgbm9kZXMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoCi0jIGJlY29tZXMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMKLSMgdmlzdWFsaXplZCBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlCi0jIG51bWJlciBvZiBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KLSMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZQotIyB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPQorCisjIFRoZSBESUFGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRpYSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZGlhZmlsZQorIyBjb21tYW5kKS4KKworRElBRklMRV9ESVJTICAgICAgICAgICA9CisKKyMgV2hlbiB1c2luZyBwbGFudHVtbCwgdGhlIFBMQU5UVU1MX0pBUl9QQVRIIHRhZyBzaG91bGQgYmUgdXNlZCB0byBzcGVjaWZ5IHRoZQorIyBwYXRoIHdoZXJlIGphdmEgY2FuIGZpbmQgdGhlIHBsYW50dW1sLmphciBmaWxlLiBJZiBsZWZ0IGJsYW5rLCBpdCBpcyBhc3N1bWVkCisjIFBsYW50VU1MIGlzIG5vdCB1c2VkIG9yIGNhbGxlZCBkdXJpbmcgYSBwcmVwcm9jZXNzaW5nIHN0ZXAuIERveHlnZW4gd2lsbAorIyBnZW5lcmF0ZSBhIHdhcm5pbmcgd2hlbiBpdCBlbmNvdW50ZXJzIGEgXHN0YXJ0dW1sIGNvbW1hbmQgaW4gdGhpcyBjYXNlIGFuZAorIyB3aWxsIG5vdCBnZW5lcmF0ZSBvdXRwdXQgZm9yIHRoZSBkaWFncmFtLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworUExBTlRVTUxfSkFSX1BBVEggICAgICA9CisKKyMgVGhlIERPVF9HUkFQSF9NQVhfTk9ERVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygbm9kZXMKKyMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoIGJlY29tZXMKKyMgbGFyZ2VyIHRoYW4gdGhpcyB2YWx1ZSwgZG94eWdlbiB3aWxsIHRydW5jYXRlIHRoZSBncmFwaCwgd2hpY2ggaXMgdmlzdWFsaXplZAorIyBieSByZXByZXNlbnRpbmcgYSBub2RlIGFzIGEgcmVkIGJveC4gTm90ZSB0aGF0IGRveHlnZW4gaWYgdGhlIG51bWJlciBvZiBkaXJlY3QKKyMgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4KKyMgRE9UX0dSQVBIX01BWF9OT0RFUyB0aGVuIHRoZSBncmFwaCB3aWxsIG5vdCBiZSBzaG93biBhdCBhbGwuIEFsc28gbm90ZSB0aGF0CisjIHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieSBNQVhfRE9UX0dSQVBIX0RFUFRILgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgogCiBET1RfR1JBUEhfTUFYX05PREVTICAgID0gNTAKIAotIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZQotIyBncmFwaHMgZ2VuZXJhdGVkIGJ5IGRvdC4gQSBkZXB0aCB2YWx1ZSBvZiAzIG1lYW5zIHRoYXQgb25seSBub2RlcyByZWFjaGFibGUKLSMgZnJvbSB0aGUgcm9vdCBieSBmb2xsb3dpbmcgYSBwYXRoIHZpYSBhdCBtb3N0IDMgZWRnZXMgd2lsbCBiZSBzaG93bi4gTm9kZXMKLSMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzCi0jIG9wdGlvbiB0byAxIG9yIDIgbWF5IGdyZWF0bHkgcmVkdWNlIHRoZSBjb21wdXRhdGlvbiB0aW1lIG5lZWRlZCBmb3IgbGFyZ2UKLSMgY29kZSBiYXNlcy4gQWxzbyBub3RlIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5CisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKICMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAogTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKIAogIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKLSMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90Ci0jIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsCi0jIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mCi0jIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0byByZWFkKS4KKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAotRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IFlFUworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCiAKICMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKICMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcwotIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKQotIyBzdXBwb3J0IHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgogCiBET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KIAotIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsCi0jIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQKLSMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4KKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBsZWdlbmQgcGFnZQorIyBleHBsYWluaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGJveGVzIGFuZCBhcnJvd3MgaW4gdGhlIGRvdCBnZW5lcmF0ZWQKKyMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAogR0VORVJBVEVfTEVHRU5EICAgICAgICA9IFlFUwogCi0jIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbAotIyByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZQotIyB0aGUgdmFyaW91cyBncmFwaHMuCisjIElmIHRoZSBET1RfQ0xFQU5VUCB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgcmVtb3ZlIHRoZSBpbnRlcm1lZGlhdGUgZG90CisjIGZpbGVzIHRoYXQgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHZhcmlvdXMgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KIAogRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUwpkaWZmIC0tZ2l0IGEvZG9jL01ha2VmaWxlIGIvZG9jL01ha2VmaWxlCmluZGV4IDRhNzdhYWMuLmZhNDk5NmIgMTAwNjQ0Ci0tLSBhL2RvYy9NYWtlZmlsZQorKysgYi9kb2MvTWFrZWZpbGUKQEAgLTI0LDYgKzI0LDcgQEAKICAgICAgICAgICAgICAgZG9jL2ZhdGUuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgZG9jL2dlbmVyYWwuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgZG9jL2dpdC1ob3d0by5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZG9jL21haWxpbmctbGlzdC1mYXEuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgZG9jL251dC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgZG9jL3BsYXRmb3JtLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIApAQCAtMzYsMzAgKzM3LDYgQEAKIERPQ1MtJChDT05GSUdfVFhUUEFHRVMpICArPSAkKFRYVFBBR0VTKQogRE9DUyA9ICQoRE9DUy15ZXMpCiAKLURPQ19FWEFNUExFUy0kKENPTkZJR19BVklPX0RJUl9DTURfRVhBTVBMRSkgICAgICArPSBhdmlvX2Rpcl9jbWQKLURPQ19FWEFNUExFUy0kKENPTkZJR19BVklPX1JFQURJTkdfRVhBTVBMRSkgICAgICArPSBhdmlvX3JlYWRpbmcKLURPQ19FWEFNUExFUy0kKENPTkZJR19BVkNPREVDX0VYQU1QTEUpICAgICAgICAgICArPSBhdmNvZGVjCi1ET0NfRVhBTVBMRVMtJChDT05GSUdfREVDT0RJTkdfRU5DT0RJTkdfRVhBTVBMRSkgKz0gZGVjb2RpbmdfZW5jb2RpbmcKLURPQ19FWEFNUExFUy0kKENPTkZJR19ERU1VWElOR19ERUNPRElOR19FWEFNUExFKSArPSBkZW11eGluZ19kZWNvZGluZwotRE9DX0VYQU1QTEVTLSQoQ09ORklHX0VYVFJBQ1RfTVZTX0VYQU1QTEUpICAgICAgICs9IGV4dHJhY3RfbXZzCi1ET0NfRVhBTVBMRVMtJChDT05GSUdfRklMVEVSX0FVRElPX0VYQU1QTEUpICAgICAgKz0gZmlsdGVyX2F1ZGlvCi1ET0NfRVhBTVBMRVMtJChDT05GSUdfRklMVEVSSU5HX0FVRElPX0VYQU1QTEUpICAgKz0gZmlsdGVyaW5nX2F1ZGlvCi1ET0NfRVhBTVBMRVMtJChDT05GSUdfRklMVEVSSU5HX1ZJREVPX0VYQU1QTEUpICAgKz0gZmlsdGVyaW5nX3ZpZGVvCi1ET0NfRVhBTVBMRVMtJChDT05GSUdfTUVUQURBVEFfRVhBTVBMRSkgICAgICAgICAgKz0gbWV0YWRhdGEKLURPQ19FWEFNUExFUy0kKENPTkZJR19NVVhJTkdfRVhBTVBMRSkgICAgICAgICAgICArPSBtdXhpbmcKLURPQ19FWEFNUExFUy0kKENPTkZJR19RU1ZERUNfRVhBTVBMRSkgICAgICAgICAgICArPSBxc3ZkZWMKLURPQ19FWEFNUExFUy0kKENPTkZJR19SRU1VWElOR19FWEFNUExFKSAgICAgICAgICArPSByZW11eGluZwotRE9DX0VYQU1QTEVTLSQoQ09ORklHX1JFU0FNUExJTkdfQVVESU9fRVhBTVBMRSkgICs9IHJlc2FtcGxpbmdfYXVkaW8KLURPQ19FWEFNUExFUy0kKENPTkZJR19TQ0FMSU5HX1ZJREVPX0VYQU1QTEUpICAgICArPSBzY2FsaW5nX3ZpZGVvCi1ET0NfRVhBTVBMRVMtJChDT05GSUdfVFJBTlNDT0RFX0FBQ19FWEFNUExFKSAgICAgKz0gdHJhbnNjb2RlX2FhYwotRE9DX0VYQU1QTEVTLSQoQ09ORklHX1RSQU5TQ09ESU5HX0VYQU1QTEUpICAgICAgICs9IHRyYW5zY29kaW5nCi1BTExfRE9DX0VYQU1QTEVTX0xJU1QgPSAkKERPQ19FWEFNUExFUy0pICQoRE9DX0VYQU1QTEVTLXllcykKLQotRE9DX0VYQU1QTEVTICAgICAgIDo9ICQoRE9DX0VYQU1QTEVTLXllczolPWRvYy9leGFtcGxlcy8lJChQUk9HU1NVRikkKEVYRVNVRikpCi1BTExfRE9DX0VYQU1QTEVTICAgOj0gJChBTExfRE9DX0VYQU1QTEVTX0xJU1Q6JT1kb2MvZXhhbXBsZXMvJSQoUFJPR1NTVUYpJChFWEVTVUYpKQotQUxMX0RPQ19FWEFNUExFU19HIDo9ICQoQUxMX0RPQ19FWEFNUExFU19MSVNUOiU9ZG9jL2V4YW1wbGVzLyUkKFBST0dTU1VGKV9nJChFWEVTVUYpKQotUFJPR1MgICAgICAgICAgICAgICs9ICQoRE9DX0VYQU1QTEVTKQotCiBhbGwtJChDT05GSUdfRE9DKTogZG9jCiAKIGRvYzogZG9jdW1lbnRhdGlvbgpAQCAtNjcsOCArNDQsNiBAQAogYXBpZG9jOiBkb2MvZG94eS9odG1sCiBkb2N1bWVudGF0aW9uOiAkKERPQ1MpCiAKLWV4YW1wbGVzOiAkKERPQ19FWEFNUExFUykKLQogVEVYSURFUCA9IHBlcmwgJChTUkNfUEFUSCkvZG9jL3RleGlkZXAucGwgJChTUkNfUEFUSCkgJDwgJEAgPiQoQDolPSUuZCkKIAogZG9jLyUudHh0OiBUQUcgPSBUWFQKQEAgLTEyMSwxMSArOTYsOSBAQAogCSQoTSlwb2QybWFuIC0tc2VjdGlvbj0zIC0tY2VudGVyPSIgIiAtLXJlbGVhc2U9IiAiIC0tZGF0ZT0iICIgJDwgPiAkQAogCiAkKERPQ1MpIGRvYy9kb3h5L2h0bWw6IHwgZG9jLwotJChET0NfRVhBTVBMRVM6JSQoRVhFU1VGKT0lLm8pOiB8IGRvYy9leGFtcGxlcwotT0JKRElSUyArPSBkb2MvZXhhbXBsZXMKIAotRE9YWV9JTlBVVCAgICAgID0gJChJTlNUSEVBREVSUykgJChET0NfRVhBTVBMRVM6JSQoRVhFU1VGKT0lLmMpICQoTElCX0VYQU1QTEVTOiUkKEVYRVNVRik9JS5jKQotRE9YWV9JTlBVVF9ERVBTID0gJChhZGRwcmVmaXggJChTUkNfUEFUSCkvLCAkKERPWFlfSU5QVVQpKQorRE9YWV9JTlBVVCAgICAgID0gJChJTlNUSEVBREVSUykKK0RPWFlfSU5QVVRfREVQUyA9ICQoYWRkcHJlZml4ICQoU1JDX1BBVEgpLywgJChET1hZX0lOUFVUKSkgZmZidWlsZC9jb25maWcubWFrCiAKIGRvYy9kb3h5L2h0bWw6IFRBRyA9IERPWFkKIGRvYy9kb3h5L2h0bWw6ICQoU1JDX1BBVEgpL2RvYy9Eb3h5ZmlsZSAkKFNSQ19QQVRIKS9kb2MvZG94eS13cmFwcGVyLnNoICQoRE9YWV9JTlBVVF9ERVBTKQpAQCAtMTcxLDExICsxNDQsNyBAQAogZGlzdGNsZWFuOjogZG9jY2xlYW4KIAkkKFJNKSBkb2MvY29uZmlnLnRleGkKIAotZXhhbXBsZXNjbGVhbjoKLQkkKFJNKSAkKEFMTF9ET0NfRVhBTVBMRVMpICQoQUxMX0RPQ19FWEFNUExFU19HKQotCSQoUk0pICQoQ0xFQU5TVUZGSVhFUzolPWRvYy9leGFtcGxlcy8lKQotCi1kb2NjbGVhbjogZXhhbXBsZXNjbGVhbgorZG9jY2xlYW46OgogCSQoUk0pICQoQ0xFQU5TVUZGSVhFUzolPWRvYy8lKQogCSQoUk0pICQoVFhUUEFHRVMpIGRvYy8qLmh0bWwgZG9jLyoucG9kIGRvYy8qLjEgZG9jLyouMyBkb2MvYXZvcHRpb25zXyoudGV4aQogCSQoUk0pIC1yIGRvYy9kb3h5L2h0bWwKZGlmZiAtLWdpdCBhL2RvYy9iaXRzdHJlYW1fZmlsdGVycy50ZXhpIGIvZG9jL2JpdHN0cmVhbV9maWx0ZXJzLnRleGkKaW5kZXggNTYzMDQ5ZS4uNzMyMmFmNiAxMDA2NDQKLS0tIGEvZG9jL2JpdHN0cmVhbV9maWx0ZXJzLnRleGkKKysrIGIvZG9jL2JpdHN0cmVhbV9maWx0ZXJzLnRleGkKQEAgLTE4LDcgKzE4LDcgQEAKIG5hbWUgYWZ0ZXIgYSAnPScuCiAKIEBleGFtcGxlCi1mZm1wZWcgLWkgSU5QVVQgLWM6diBjb3B5IC1ic2Y6diBmaWx0ZXIxWz1vcHQxPXN0cjEvb3B0Mj1zdHIyXVssZmlsdGVyMl0gT1VUUFVUCitmZm1wZWcgLWkgSU5QVVQgLWM6diBjb3B5IC1ic2Y6diBmaWx0ZXIxWz1vcHQxPXN0cjE6b3B0Mj1zdHIyXVssZmlsdGVyMl0gT1VUUFVUCiBAZW5kIGV4YW1wbGUKIAogQmVsb3cgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBiaXRzdHJlYW0gZmlsdGVycywKQEAgLTI2LDM4ICsyNiw0NiBAQAogCiBAc2VjdGlvbiBhYWNfYWR0c3RvYXNjCiAKLUNvbnZlcnQgTVBFRy0yLzQgQUFDIEFEVFMgdG8gTVBFRy00IEF1ZGlvIFNwZWNpZmljIENvbmZpZ3VyYXRpb24KLWJpdHN0cmVhbSBmaWx0ZXIuCitDb252ZXJ0IE1QRUctMi80IEFBQyBBRFRTIHRvIGFuIE1QRUctNCBBdWRpbyBTcGVjaWZpYyBDb25maWd1cmF0aW9uCitiaXRzdHJlYW0uCiAKIFRoaXMgZmlsdGVyIGNyZWF0ZXMgYW4gTVBFRy00IEF1ZGlvU3BlY2lmaWNDb25maWcgZnJvbSBhbiBNUEVHLTIvNAogQURUUyBoZWFkZXIgYW5kIHJlbW92ZXMgdGhlIEFEVFMgaGVhZGVyLgogCi1UaGlzIGlzIHJlcXVpcmVkIGZvciBleGFtcGxlIHdoZW4gY29weWluZyBhbiBBQUMgc3RyZWFtIGZyb20gYSByYXcKLUFEVFMgQUFDIGNvbnRhaW5lciB0byBhIEZMViBvciBhIE1PVi9NUDQgZmlsZS4KK1RoaXMgZmlsdGVyIGlzIHJlcXVpcmVkIGZvciBleGFtcGxlIHdoZW4gY29weWluZyBhbiBBQUMgc3RyZWFtIGZyb20gYQorcmF3IEFEVFMgQUFDIG9yIGFuIE1QRUctVFMgY29udGFpbmVyIHRvIE1QNEEtTEFUTSwgdG8gYW4gRkxWIGZpbGUsIG9yCit0byBNT1YvTVA0IGZpbGVzIGFuZCByZWxhdGVkIGZvcm1hdHMgc3VjaCBhcyAzR1Agb3IgTTRBLiBQbGVhc2Ugbm90ZQordGhhdCBpdCBpcyBhdXRvLWluc2VydGVkIGZvciBNUDRBLUxBVE0gYW5kIE1PVi9NUDQgYW5kIHJlbGF0ZWQgZm9ybWF0cy4KIAogQHNlY3Rpb24gY2hvbXAKIAogUmVtb3ZlIHplcm8gcGFkZGluZyBhdCB0aGUgZW5kIG9mIGEgcGFja2V0LgogCitAc2VjdGlvbiBkY2FfY29yZQorCitFeHRyYWN0IHRoZSBjb3JlIGZyb20gYSBEQ0EvRFRTIHN0cmVhbSwgZHJvcHBpbmcgZXh0ZW5zaW9ucyBzdWNoIGFzCitEVFMtSEQuCisKIEBzZWN0aW9uIGR1bXBfZXh0cmEKIAogQWRkIGV4dHJhZGF0YSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWx0ZXJlZCBwYWNrZXRzLgogCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZnJlcQogVGhlIGFkZGl0aW9uYWwgYXJndW1lbnQgc3BlY2lmaWVzIHdoaWNoIHBhY2tldHMgc2hvdWxkIGJlIGZpbHRlcmVkLgogSXQgYWNjZXB0cyB0aGUgdmFsdWVzOgogQHRhYmxlIEBzYW1wCi1AaXRlbSBhCi1hZGQgZXh0cmFkYXRhIHRvIGFsbCBrZXkgcGFja2V0cywgYnV0IG9ubHkgaWYgQHZhcntsb2NhbF9oZWFkZXJ9IGlzCi1zZXQgaW4gdGhlIEBvcHRpb257ZmxhZ3MyfSBjb2RlYyBjb250ZXh0IGZpZWxkCi0KIEBpdGVtIGsKK0BpdGVtIGtleWZyYW1lCiBhZGQgZXh0cmFkYXRhIHRvIGFsbCBrZXkgcGFja2V0cwogCiBAaXRlbSBlCitAaXRlbSBhbGwKIGFkZCBleHRyYWRhdGEgdG8gYWxsIHBhY2tldHMKIEBlbmQgdGFibGUKK0BlbmQgdGFibGUKIAotSWYgbm90IHNwZWNpZmllZCBpdCBpcyBhc3N1bWVkIEBzYW1we2t9LgorSWYgbm90IHNwZWNpZmllZCBpdCBpcyBhc3N1bWVkIEBzYW1we2V9LgogCiBGb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIEBjb21tYW5ke2ZmbXBlZ30gY29tbWFuZCBmb3JjZXMgYSBnbG9iYWwKIGhlYWRlciAodGh1cyBkaXNhYmxpbmcgaW5kaXZpZHVhbCBwYWNrZXQgaGVhZGVycykgaW4gdGhlIEguMjY0IHBhY2tldHMKQEAgLTY3LDYgKzc1LDE0OCBAQAogZmZtcGVnIC1pIElOUFVUIC1tYXAgMCAtZmxhZ3M6diArZ2xvYmFsX2hlYWRlciAtYzp2IGxpYngyNjQgLWJzZjp2IGR1bXBfZXh0cmEgb3V0LnRzCiBAZW5kIGV4YW1wbGUKIAorQHNlY3Rpb24gZWFjM19jb3JlCisKK0V4dHJhY3QgdGhlIGNvcmUgZnJvbSBhIEUtQUMtMyBzdHJlYW0sIGRyb3BwaW5nIGV4dHJhIGNoYW5uZWxzLgorCitAc2VjdGlvbiBleHRyYWN0X2V4dHJhZGF0YQorCitFeHRyYWN0IHRoZSBpbi1iYW5kIGV4dHJhZGF0YS4KKworQ2VydGFpbiBjb2RlY3MgYWxsb3cgdGhlIGxvbmctdGVybSBoZWFkZXJzIChlLmcuIE1QRUctMiBzZXF1ZW5jZSBoZWFkZXJzLAorb3IgSC4yNjQvSEVWQyAoVlBTLylTUFMvUFBTKSB0byBiZSB0cmFuc21pdHRlZCBlaXRoZXIgImluLWJhbmQiIChpLmUuIGFzIGEgcGFydAorb2YgdGhlIGJpdHN0cmVhbSBjb250YWluaW5nIHRoZSBjb2RlZCBmcmFtZXMpIG9yICJvdXQgb2YgYmFuZCIgKGUuZy4gb24gdGhlCitjb250YWluZXIgbGV2ZWwpLiBUaGlzIGxhdHRlciBmb3JtIGlzIGNhbGxlZCAiZXh0cmFkYXRhIiBpbiBGRm1wZWcgdGVybWlub2xvZ3kuCisKK1RoaXMgYml0c3RyZWFtIGZpbHRlciBkZXRlY3RzIHRoZSBpbi1iYW5kIGhlYWRlcnMgYW5kIG1ha2VzIHRoZW0gYXZhaWxhYmxlIGFzCitleHRyYWRhdGEuCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSByZW1vdmUKK1doZW4gdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlIGxvbmctdGVybSBoZWFkZXJzIGFyZSByZW1vdmVkIGZyb20gdGhlCitiaXRzdHJlYW0gYWZ0ZXIgZXh0cmFjdGlvbi4KK0BlbmQgdGFibGUKKworQHNlY3Rpb24gZmlsdGVyX3VuaXRzCisKK1JlbW92ZSB1bml0cyB3aXRoIHR5cGVzIGluIG9yIG5vdCBpbiBhIGdpdmVuIHNldCBmcm9tIHRoZSBzdHJlYW0uCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBwYXNzX3R5cGVzCitMaXN0IG9mIHVuaXQgdHlwZXMgb3IgcmFuZ2VzIG9mIHVuaXQgdHlwZXMgdG8gcGFzcyB0aHJvdWdoIHdoaWxlIHJlbW92aW5nCithbGwgb3RoZXJzLiAgVGhpcyBpcyBzcGVjaWZpZWQgYXMgYSAnfCctc2VwYXJhdGVkIGxpc3Qgb2YgdW5pdCB0eXBlIHZhbHVlcworb3IgcmFuZ2VzIG9mIHZhbHVlcyB3aXRoICctJy4KKworQGl0ZW0gcmVtb3ZlX3R5cGVzCitJZGVudGljYWwgdG8gQG9wdGlvbntwYXNzX3R5cGVzfSwgZXhjZXB0IHRoZSB1bml0cyBpbiB0aGUgZ2l2ZW4gc2V0CityZW1vdmVkIGFuZCBhbGwgb3RoZXJzIHBhc3NlZCB0aHJvdWdoLgorQGVuZCB0YWJsZQorCitFeHRyYWRhdGEgaXMgdW5jaGFuZ2VkIGJ5IHRoaXMgdHJhbnNmb3JtYXRpb24sIGJ1dCBub3RlIHRoYXQgaWYgdGhlIHN0cmVhbQorY29udGFpbnMgaW5saW5lIHBhcmFtZXRlciBzZXRzIHRoZW4gdGhlIG91dHB1dCBtYXkgYmUgdW51c2FibGUgaWYgdGhleSBhcmUKK3JlbW92ZWQuCisKK0ZvciBleGFtcGxlLCB0byByZW1vdmUgYWxsIG5vbi1WQ0wgTkFMIHVuaXRzIGZyb20gYW4gSC4yNjQgc3RyZWFtOgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBJTlBVVCAtYzp2IGNvcHkgLWJzZjp2ICdmaWx0ZXJfdW5pdHM9cGFzc190eXBlcz0xLTUnIE9VVFBVVAorQGVuZCBleGFtcGxlCisKK1RvIHJlbW92ZSBhbGwgQVVEcywgU0VJIGFuZCBmaWxsZXIgZnJvbSBhbiBILjI2NSBzdHJlYW06CitAZXhhbXBsZQorZmZtcGVnIC1pIElOUFVUIC1jOnYgY29weSAtYnNmOnYgJ2ZpbHRlcl91bml0cz1yZW1vdmVfdHlwZXM9MzV8MzgtNDAnIE9VVFBVVAorQGVuZCBleGFtcGxlCisKK0BzZWN0aW9uIGhhcHFhX2V4dHJhY3QKKworRXh0cmFjdCBSZ2Igb3IgQWxwaGEgcGFydCBvZiBhbiBIQVBRQSBmaWxlLCB3aXRob3V0IHJlY29tcHJlc3Npb24sIGluIG9yZGVyIHRvIGNyZWF0ZSBhbiBIQVBRIG9yIGFuIEhBUEFscGhhT25seSBmaWxlLgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gdGV4dHVyZQorU3BlY2lmaWVzIHRoZSB0ZXh0dXJlIHRvIGtlZXAuCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBjb2xvcgorQGl0ZW0gYWxwaGEKK0BlbmQgdGFibGUKKworQGVuZCB0YWJsZQorCitDb252ZXJ0IEhBUFFBIHRvIEhBUFEKK0BleGFtcGxlCitmZm1wZWcgLWkgaGFwcWFfaW5wdXRmaWxlLm1vdiAtYyBjb3B5IC1ic2Y6diBoYXBxYV9leHRyYWN0PXRleHR1cmU9Y29sb3IgLXRhZzp2IEhhcFkgLW1ldGFkYXRhOnM6djowIGVuY29kZXI9IkhBUFEiIGhhcHFfZmlsZS5tb3YKK0BlbmQgZXhhbXBsZQorCitDb252ZXJ0IEhBUFFBIHRvIEhBUEFscGhhT25seQorQGV4YW1wbGUKK2ZmbXBlZyAtaSBoYXBxYV9pbnB1dGZpbGUubW92IC1jIGNvcHkgLWJzZjp2IGhhcHFhX2V4dHJhY3Q9dGV4dHVyZT1hbHBoYSAtdGFnOnYgSGFwQSAtbWV0YWRhdGE6czp2OjAgZW5jb2Rlcj0iSEFQQWxwaGEgT25seSIgaGFwYWxwaGFvbmx5X2ZpbGUubW92CitAZW5kIGV4YW1wbGUKKworQHNlY3Rpb24gaDI2NF9tZXRhZGF0YQorCitNb2RpZnkgbWV0YWRhdGEgZW1iZWRkZWQgaW4gYW4gSC4yNjQgc3RyZWFtLgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gYXVkCitJbnNlcnQgb3IgcmVtb3ZlIEFVRCBOQUwgdW5pdHMgaW4gYWxsIGFjY2VzcyB1bml0cyBvZiB0aGUgc3RyZWFtLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIGluc2VydAorQGl0ZW0gcmVtb3ZlCitAZW5kIHRhYmxlCisKK0BpdGVtIHNhbXBsZV9hc3BlY3RfcmF0aW8KK1NldCB0aGUgc2FtcGxlIGFzcGVjdCByYXRpbyBvZiB0aGUgc3RyZWFtIGluIHRoZSBWVUkgcGFyYW1ldGVycy4KKworQGl0ZW0gdmlkZW9fZm9ybWF0CitAaXRlbSB2aWRlb19mdWxsX3JhbmdlX2ZsYWcKK1NldCB0aGUgdmlkZW8gZm9ybWF0IGluIHRoZSBzdHJlYW0gKHNlZSBILjI2NCBzZWN0aW9uIEUuMi4xIGFuZAordGFibGUgRS0yKS4KKworQGl0ZW0gY29sb3VyX3ByaW1hcmllcworQGl0ZW0gdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzCitAaXRlbSBtYXRyaXhfY29lZmZpY2llbnRzCitTZXQgdGhlIGNvbG91ciBkZXNjcmlwdGlvbiBpbiB0aGUgc3RyZWFtIChzZWUgSC4yNjQgc2VjdGlvbiBFLjIuMQorYW5kIHRhYmxlcyBFLTMsIEUtNCBhbmQgRS01KS4KKworQGl0ZW0gY2hyb21hX3NhbXBsZV9sb2NfdHlwZQorU2V0IHRoZSBjaHJvbWEgc2FtcGxlIGxvY2F0aW9uIGluIHRoZSBzdHJlYW0gKHNlZSBILjI2NCBzZWN0aW9uCitFLjIuMSBhbmQgZmlndXJlIEUtMSkuCisKK0BpdGVtIHRpY2tfcmF0ZQorU2V0IHRoZSB0aWNrIHJhdGUgKG51bV91bml0c19pbl90aWNrIC8gdGltZV9zY2FsZSkgaW4gdGhlIFZVSQorcGFyYW1ldGVycy4gIFRoaXMgaXMgdGhlIHNtYWxsZXN0IHRpbWUgdW5pdCByZXByZXNlbnRhYmxlIGluIHRoZQorc3RyZWFtLCBhbmQgaW4gbWFueSBjYXNlcyByZXByZXNlbnRzIHRoZSBmaWVsZCByYXRlIG9mIHRoZSBzdHJlYW0KKyhkb3VibGUgdGhlIGZyYW1lIHJhdGUpLgorQGl0ZW0gZml4ZWRfZnJhbWVfcmF0ZV9mbGFnCitTZXQgd2hldGhlciB0aGUgc3RyZWFtIGhhcyBmaXhlZCBmcmFtZXJhdGUgLSB0eXBpY2FsbHkgdGhpcyBpbmRpY2F0ZXMKK3RoYXQgdGhlIGZyYW1lcmF0ZSBpcyBleGFjdGx5IGhhbGYgdGhlIHRpY2sgcmF0ZSwgYnV0IHRoZSBleGFjdAorbWVhbmluZyBpcyBkZXBlbmRlbnQgb24gaW50ZXJsYWNpbmcgYW5kIHRoZSBwaWN0dXJlIHN0cnVjdHVyZSAoc2VlCitILjI2NCBzZWN0aW9uIEUuMi4xIGFuZCB0YWJsZSBFLTYpLgorCitAaXRlbSBjcm9wX2xlZnQKK0BpdGVtIGNyb3BfcmlnaHQKK0BpdGVtIGNyb3BfdG9wCitAaXRlbSBjcm9wX2JvdHRvbQorU2V0IHRoZSBmcmFtZSBjcm9wcGluZyBvZmZzZXRzIGluIHRoZSBTUFMuICBUaGVzZSB2YWx1ZXMgd2lsbCByZXBsYWNlCit0aGUgY3VycmVudCBvbmVzIGlmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBjcm9wcGVkLgorCitUaGVzZSBmaWVsZHMgYXJlIHNldCBpbiBwaXhlbHMuICBOb3RlIHRoYXQgc29tZSBzaXplcyBtYXkgbm90IGJlCityZXByZXNlbnRhYmxlIGlmIHRoZSBjaHJvbWEgaXMgc3Vic2FtcGxlZCBvciB0aGUgc3RyZWFtIGlzIGludGVybGFjZWQKKyhzZWUgSC4yNjQgc2VjdGlvbiA3LjQuMi4xLjEpLgorCitAaXRlbSBzZWlfdXNlcl9kYXRhCitJbnNlcnQgYSBzdHJpbmcgYXMgU0VJIHVucmVnaXN0ZXJlZCB1c2VyIGRhdGEuICBUaGUgYXJndW1lbnQgbXVzdAorYmUgb2YgdGhlIGZvcm0gQGVtcGh7VVVJRCtzdHJpbmd9LCB3aGVyZSB0aGUgVVVJRCBpcyBhcyBoZXggZGlnaXRzCitwb3NzaWJseSBzZXBhcmF0ZWQgYnkgaHlwaGVucywgYW5kIHRoZSBzdHJpbmcgY2FuIGJlIGFueXRoaW5nLgorCitGb3IgZXhhbXBsZSwgQHNhbXB7MDg2ZjM2OTMtYjdiMy00ZjJjLTk2NTMtMjE0OTJmZWVlNWI4K2hlbGxvfSB3aWxsCitpbnNlcnQgdGhlIHN0cmluZyBgYGhlbGxvJycgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBVVUlELgorCitAaXRlbSBkZWxldGVfZmlsbGVyCitEZWxldGVzIGJvdGggZmlsbGVyIE5BTCB1bml0cyBhbmQgZmlsbGVyIFNFSSBtZXNzYWdlcy4KKworQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBoMjY0X21wNHRvYW5uZXhiCiAKIENvbnZlcnQgYW4gSC4yNjQgYml0c3RyZWFtIGZyb20gbGVuZ3RoIHByZWZpeGVkIG1vZGUgdG8gc3RhcnQgY29kZQpAQCAtNzQsNyArMjI0LDcgQEAKIHNwZWNpZmljYXRpb24pLgogCiBUaGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUgc3RyZWFtaW5nIGZvcm1hdHMsIHR5cGljYWxseSB0aGUgTVBFRy0yCi10cmFuc3BvcnQgc3RyZWFtIGZvcm1hdCAoIm1wZWd0cyIpLgordHJhbnNwb3J0IHN0cmVhbSBmb3JtYXQgKG11eGVyIEBjb2Rle21wZWd0c30pLgogCiBGb3IgZXhhbXBsZSB0byByZW11eCBhbiBNUDQgZmlsZSBjb250YWluaW5nIGFuIEguMjY0IHN0cmVhbSB0byBtcGVndHMKIGZvcm1hdCB3aXRoIEBjb21tYW5ke2ZmbXBlZ30sIHlvdSBjYW4gdXNlIHRoZSBjb21tYW5kOgpAQCAtODMsNiArMjMzLDkyIEBACiBmZm1wZWcgLWkgSU5QVVQubXA0IC1jb2RlYyBjb3B5IC1ic2Y6diBoMjY0X21wNHRvYW5uZXhiIE9VVFBVVC50cwogQGVuZCBleGFtcGxlCiAKK1BsZWFzZSBub3RlIHRoYXQgdGhpcyBmaWx0ZXIgaXMgYXV0by1pbnNlcnRlZCBmb3IgTVBFRy1UUyAobXV4ZXIKK0Bjb2Rle21wZWd0c30pIGFuZCByYXcgSC4yNjQgKG11eGVyIEBjb2Rle2gyNjR9KSBvdXRwdXQgZm9ybWF0cy4KKworQHNlY3Rpb24gaDI2NF9yZWR1bmRhbnRfcHBzCisKK1RoaXMgYXBwbGllcyBhIHNwZWNpZmljIGZpeHVwIHRvIHNvbWUgQmx1LXJheSBzdHJlYW1zIHdoaWNoIGNvbnRhaW4KK3JlZHVuZGFudCBQUFNzIG1vZGlmeWluZyBpcnJlbGV2YW50IHBhcmFtZXRlcnMgb2YgdGhlIHN0cmVhbSB3aGljaAorY29uZnVzZSBvdGhlciB0cmFuc2Zvcm1hdGlvbnMgd2hpY2ggcmVxdWlyZSBjb3JyZWN0IGV4dHJhZGF0YS4KKworQSBuZXcgc2luZ2xlIGdsb2JhbCBQUFMgaXMgY3JlYXRlZCwgYW5kIGFsbCBvZiB0aGUgcmVkdW5kYW50IFBQU3MKK3dpdGhpbiB0aGUgc3RyZWFtIGFyZSByZW1vdmVkLgorCitAc2VjdGlvbiBoZXZjX21ldGFkYXRhCisKK01vZGlmeSBtZXRhZGF0YSBlbWJlZGRlZCBpbiBhbiBIRVZDIHN0cmVhbS4KKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGF1ZAorSW5zZXJ0IG9yIHJlbW92ZSBBVUQgTkFMIHVuaXRzIGluIGFsbCBhY2Nlc3MgdW5pdHMgb2YgdGhlIHN0cmVhbS4KKworQHRhYmxlIEBzYW1wCitAaXRlbSBpbnNlcnQKK0BpdGVtIHJlbW92ZQorQGVuZCB0YWJsZQorCitAaXRlbSBzYW1wbGVfYXNwZWN0X3JhdGlvCitTZXQgdGhlIHNhbXBsZSBhc3BlY3QgcmF0aW8gaW4gdGhlIHN0cmVhbSBpbiB0aGUgVlVJIHBhcmFtZXRlcnMuCisKK0BpdGVtIHZpZGVvX2Zvcm1hdAorQGl0ZW0gdmlkZW9fZnVsbF9yYW5nZV9mbGFnCitTZXQgdGhlIHZpZGVvIGZvcm1hdCBpbiB0aGUgc3RyZWFtIChzZWUgSC4yNjUgc2VjdGlvbiBFLjMuMSBhbmQKK3RhYmxlIEUuMikuCisKK0BpdGVtIGNvbG91cl9wcmltYXJpZXMKK0BpdGVtIHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcworQGl0ZW0gbWF0cml4X2NvZWZmaWNpZW50cworU2V0IHRoZSBjb2xvdXIgZGVzY3JpcHRpb24gaW4gdGhlIHN0cmVhbSAoc2VlIEguMjY1IHNlY3Rpb24gRS4zLjEKK2FuZCB0YWJsZXMgRS4zLCBFLjQgYW5kIEUuNSkuCisKK0BpdGVtIGNocm9tYV9zYW1wbGVfbG9jX3R5cGUKK1NldCB0aGUgY2hyb21hIHNhbXBsZSBsb2NhdGlvbiBpbiB0aGUgc3RyZWFtIChzZWUgSC4yNjUgc2VjdGlvbgorRS4zLjEgYW5kIGZpZ3VyZSBFLjEpLgorCitAaXRlbSB0aWNrX3JhdGUKK1NldCB0aGUgdGljayByYXRlIGluIHRoZSBWUFMgYW5kIFZVSSBwYXJhbWV0ZXJzIChudW1fdW5pdHNfaW5fdGljayAvCit0aW1lX3NjYWxlKS4gIENvbWJpbmVkIHdpdGggQG9wdGlvbntudW1fdGlja3NfcG9jX2RpZmZfb25lfSwgdGhpcyBjYW4KK3NldCBhIGNvbnN0YW50IGZyYW1lcmF0ZSBpbiB0aGUgc3RyZWFtLiAgTm90ZSB0aGF0IGl0IGlzIGxpa2VseSB0byBiZQorb3ZlcnJpZGRlbiBieSBjb250YWluZXIgcGFyYW1ldGVycyB3aGVuIHRoZSBzdHJlYW0gaXMgaW4gYSBjb250YWluZXIuCisKK0BpdGVtIG51bV90aWNrc19wb2NfZGlmZl9vbmUKK1NldCBwb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnIGluIFZQUyBhbmQgVlVJIGFuZCB1c2UgdGhpcyB2YWx1ZQordG8gc2V0IG51bV90aWNrc19wb2NfZGlmZl9vbmVfbWludXMxIChzZWUgSC4yNjUgc2VjdGlvbnMgNy40LjMuMSBhbmQKK0UuMy4xKS4gIElnbm9yZWQgaWYgQG9wdGlvbnt0aWNrX3JhdGV9IGlzIG5vdCBhbHNvIHNldC4KKworQGl0ZW0gY3JvcF9sZWZ0CitAaXRlbSBjcm9wX3JpZ2h0CitAaXRlbSBjcm9wX3RvcAorQGl0ZW0gY3JvcF9ib3R0b20KK1NldCB0aGUgY29uZm9ybWFuY2Ugd2luZG93IGNyb3BwaW5nIG9mZnNldHMgaW4gdGhlIFNQUy4gIFRoZXNlIHZhbHVlcword2lsbCByZXBsYWNlIHRoZSBjdXJyZW50IG9uZXMgaWYgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNyb3BwZWQuCisKK1RoZXNlIGZpZWxkcyBhcmUgc2V0IGluIHBpeGVscy4gIE5vdGUgdGhhdCBzb21lIHNpemVzIG1heSBub3QgYmUKK3JlcHJlc2VudGFibGUgaWYgdGhlIGNocm9tYSBpcyBzdWJzYW1wbGVkIChILjI2NSBzZWN0aW9uIDcuNC4zLjIuMSkuCisKK0BlbmQgdGFibGUKKworQHNlY3Rpb24gaGV2Y19tcDR0b2FubmV4YgorCitDb252ZXJ0IGFuIEhFVkMvSC4yNjUgYml0c3RyZWFtIGZyb20gbGVuZ3RoIHByZWZpeGVkIG1vZGUgdG8gc3RhcnQgY29kZQorcHJlZml4ZWQgbW9kZSAoYXMgZGVmaW5lZCBpbiB0aGUgQW5uZXggQiBvZiB0aGUgSVRVLVQgSC4yNjUKK3NwZWNpZmljYXRpb24pLgorCitUaGlzIGlzIHJlcXVpcmVkIGJ5IHNvbWUgc3RyZWFtaW5nIGZvcm1hdHMsIHR5cGljYWxseSB0aGUgTVBFRy0yCit0cmFuc3BvcnQgc3RyZWFtIGZvcm1hdCAobXV4ZXIgQGNvZGV7bXBlZ3RzfSkuCisKK0ZvciBleGFtcGxlIHRvIHJlbXV4IGFuIE1QNCBmaWxlIGNvbnRhaW5pbmcgYW4gSEVWQyBzdHJlYW0gdG8gbXBlZ3RzCitmb3JtYXQgd2l0aCBAY29tbWFuZHtmZm1wZWd9LCB5b3UgY2FuIHVzZSB0aGUgY29tbWFuZDoKKworQGV4YW1wbGUKK2ZmbXBlZyAtaSBJTlBVVC5tcDQgLWNvZGVjIGNvcHkgLWJzZjp2IGhldmNfbXA0dG9hbm5leGIgT1VUUFVULnRzCitAZW5kIGV4YW1wbGUKKworUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGZpbHRlciBpcyBhdXRvLWluc2VydGVkIGZvciBNUEVHLVRTIChtdXhlcgorQGNvZGV7bXBlZ3RzfSkgYW5kIHJhdyBIRVZDL0guMjY1IChtdXhlciBAY29kZXtoMjY1fSBvcgorQGNvZGV7aGV2Y30pIG91dHB1dCBmb3JtYXRzLgorCiBAc2VjdGlvbiBpbXhkdW1wCiAKIE1vZGlmaWVzIHRoZSBiaXRzdHJlYW0gdG8gZml0IGluIE1PViBhbmQgdG8gYmUgdXNhYmxlIGJ5IHRoZSBGaW5hbCBDdXQKQEAgLTEzMywxMSArMzY5LDU4IEBACiBmZm1wZWcgLWkgZnJhbWVfJWQuanBnIC1jOnYgY29weSByb3RhdGVkLmF2aQogQGVuZCBleGFtcGxlCiAKLUBzZWN0aW9uIG1qcGVnYV9kdW1wX2hlYWRlcgorQHNlY3Rpb24gbWpwZWdhZHVtcAogCi1Ac2VjdGlvbiBtb3ZzdWIKK0FkZCBhbiBNSlBFRyBBIGhlYWRlciB0byB0aGUgYml0c3RyZWFtLCB0byBlbmFibGUgZGVjb2RpbmcgYnkKK1F1aWNrdGltZS4KIAotQHNlY3Rpb24gbXAzX2hlYWRlcl9kZWNvbXByZXNzCitAYW5jaG9ye21vdjJ0ZXh0c3VifQorQHNlY3Rpb24gbW92MnRleHRzdWIKKworRXh0cmFjdCBhIHJlcHJlc2VudGFibGUgdGV4dCBmaWxlIGZyb20gTU9WIHN1YnRpdGxlcywgc3RyaXBwaW5nIHRoZQorbWV0YWRhdGEgaGVhZGVyIGZyb20gZWFjaCBzdWJ0aXRsZSBwYWNrZXQuCisKK1NlZSBhbHNvIHRoZSBAcmVme3RleHQybW92c3VifSBmaWx0ZXIuCisKK0BzZWN0aW9uIG1wM2RlY29tcAorCitEZWNvbXByZXNzIG5vbi1zdGFuZGFyZCBjb21wcmVzc2VkIE1QMyBhdWRpbyBoZWFkZXJzLgorCitAc2VjdGlvbiBtcGVnMl9tZXRhZGF0YQorCitNb2RpZnkgbWV0YWRhdGEgZW1iZWRkZWQgaW4gYW4gTVBFRy0yIHN0cmVhbS4KKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGRpc3BsYXlfYXNwZWN0X3JhdGlvCitTZXQgdGhlIGRpc3BsYXkgYXNwZWN0IHJhdGlvIGluIHRoZSBzdHJlYW0uCisKK1RoZSBmb2xsb3dpbmcgZml4ZWQgdmFsdWVzIGFyZSBzdXBwb3J0ZWQ6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gNC8zCitAaXRlbSAxNi85CitAaXRlbSAyMjEvMTAwCitAZW5kIHRhYmxlCitBbnkgb3RoZXIgdmFsdWUgd2lsbCByZXN1bHQgaW4gc3F1YXJlIHBpeGVscyBiZWluZyBzaWduYWxsZWQgaW5zdGVhZAorKHNlZSBILjI2MiBzZWN0aW9uIDYuMy4zIGFuZCB0YWJsZSA2LTMpLgorCitAaXRlbSBmcmFtZV9yYXRlCitTZXQgdGhlIGZyYW1lIHJhdGUgaW4gdGhlIHN0cmVhbS4gIFRoaXMgaXMgY29uc3RydWN0ZWQgZnJvbSBhIHRhYmxlCitvZiBrbm93biB2YWx1ZXMgY29tYmluZWQgd2l0aCBhIHNtYWxsIG11bHRpcGxpZXIgYW5kIGRpdmlzb3IgLSBpZgordGhlIHN1cHBsaWVkIHZhbHVlIGlzIG5vdCBleGFjdGx5IHJlcHJlc2VudGFibGUsIHRoZSBuZWFyZXN0CityZXByZXNlbnRhYmxlIHZhbHVlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIChzZWUgSC4yNjIgc2VjdGlvbiA2LjMuMworYW5kIHRhYmxlIDYtNCkuCisKK0BpdGVtIHZpZGVvX2Zvcm1hdAorU2V0IHRoZSB2aWRlbyBmb3JtYXQgaW4gdGhlIHN0cmVhbSAoc2VlIEguMjYyIHNlY3Rpb24gNi4zLjYgYW5kCit0YWJsZSA2LTYpLgorCitAaXRlbSBjb2xvdXJfcHJpbWFyaWVzCitAaXRlbSB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MKK0BpdGVtIG1hdHJpeF9jb2VmZmljaWVudHMKK1NldCB0aGUgY29sb3VyIGRlc2NyaXB0aW9uIGluIHRoZSBzdHJlYW0gKHNlZSBILjI2MiBzZWN0aW9uIDYuMy42CithbmQgdGFibGVzIDYtNywgNi04IGFuZCA2LTkpLgorCitAZW5kIHRhYmxlCiAKIEBzZWN0aW9uIG1wZWc0X3VucGFja19iZnJhbWVzCiAKQEAgLTE2MSwyMCArNDQ0LDgyIEBACiAKIEBzZWN0aW9uIG5vaXNlCiAKLURhbWFnZXMgdGhlIGNvbnRlbnRzIG9mIHBhY2tldHMgd2l0aG91dCBkYW1hZ2luZyB0aGUgY29udGFpbmVyLiBDYW4gYmUKLXVzZWQgZm9yIGZ1enppbmcgb3IgdGVzdGluZyBlcnJvciByZXNpbGllbmNlL2NvbmNlYWxtZW50LgorRGFtYWdlcyB0aGUgY29udGVudHMgb2YgcGFja2V0cyBvciBzaW1wbHkgZHJvcHMgdGhlbSB3aXRob3V0IGRhbWFnaW5nIHRoZQorY29udGFpbmVyLiBDYW4gYmUgdXNlZCBmb3IgZnV6emluZyBvciB0ZXN0aW5nIGVycm9yIHJlc2lsaWVuY2UvY29uY2VhbG1lbnQuCiAKIFBhcmFtZXRlcnM6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gYW1vdW50CiBBIG51bWVyYWwgc3RyaW5nLCB3aG9zZSB2YWx1ZSBpcyByZWxhdGVkIHRvIGhvdyBvZnRlbiBvdXRwdXQgYnl0ZXMgd2lsbAogYmUgbW9kaWZpZWQuIFRoZXJlZm9yZSwgdmFsdWVzIGJlbG93IG9yIGVxdWFsIHRvIDAgYXJlIGZvcmJpZGRlbiwgYW5kCiB0aGUgbG93ZXIgdGhlIG1vcmUgZnJlcXVlbnQgYnl0ZXMgd2lsbCBiZSBtb2RpZmllZCwgd2l0aCAxIG1lYW5pbmcKIGV2ZXJ5IGJ5dGUgaXMgbW9kaWZpZWQuCitAaXRlbSBkcm9wYW1vdW50CitBIG51bWVyYWwgc3RyaW5nLCB3aG9zZSB2YWx1ZSBpcyByZWxhdGVkIHRvIGhvdyBvZnRlbiBwYWNrZXRzIHdpbGwgYmUgZHJvcHBlZC4KK1RoZXJlZm9yZSwgdmFsdWVzIGJlbG93IG9yIGVxdWFsIHRvIDAgYXJlIGZvcmJpZGRlbiwgYW5kIHRoZSBsb3dlciB0aGUgbW9yZQorZnJlcXVlbnQgcGFja2V0cyB3aWxsIGJlIGRyb3BwZWQsIHdpdGggMSBtZWFuaW5nIGV2ZXJ5IHBhY2tldCBpcyBkcm9wcGVkLgorQGVuZCB0YWJsZQogCitUaGUgZm9sbG93aW5nIGV4YW1wbGUgYXBwbGllcyB0aGUgbW9kaWZpY2F0aW9uIHRvIGV2ZXJ5IGJ5dGUgYnV0IGRvZXMgbm90IGRyb3AKK2FueSBwYWNrZXRzLgogQGV4YW1wbGUKIGZmbXBlZyAtaSBJTlBVVCAtYyBjb3B5IC1ic2Ygbm9pc2VbPTFdIG91dHB1dC5ta3YKIEBlbmQgZXhhbXBsZQotYXBwbGllcyB0aGUgbW9kaWZpY2F0aW9uIHRvIGV2ZXJ5IGJ5dGUuCisKK0BzZWN0aW9uIG51bGwKK1RoaXMgYml0c3RyZWFtIGZpbHRlciBwYXNzZXMgdGhlIHBhY2tldHMgdGhyb3VnaCB1bmNoYW5nZWQuCiAKIEBzZWN0aW9uIHJlbW92ZV9leHRyYQogCitSZW1vdmUgZXh0cmFkYXRhIGZyb20gcGFja2V0cy4KKworSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcjoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBmcmVxCitTZXQgd2hpY2ggZnJhbWUgdHlwZXMgdG8gcmVtb3ZlIGV4dHJhZGF0YSBmcm9tLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIGsKK1JlbW92ZSBleHRyYWRhdGEgZnJvbSBub24ta2V5ZnJhbWVzIG9ubHkuCisKK0BpdGVtIGtleWZyYW1lCitSZW1vdmUgZXh0cmFkYXRhIGZyb20ga2V5ZnJhbWVzIG9ubHkuCisKK0BpdGVtIGUsIGFsbAorUmVtb3ZlIGV4dHJhZGF0YSBmcm9tIGFsbCBmcmFtZXMuCisKK0BlbmQgdGFibGUKK0BlbmQgdGFibGUKKworQGFuY2hvcnt0ZXh0Mm1vdnN1Yn0KK0BzZWN0aW9uIHRleHQybW92c3ViCisKK0NvbnZlcnQgdGV4dCBzdWJ0aXRsZXMgdG8gTU9WIHN1YnRpdGxlcyAoYXMgdXNlZCBieSB0aGUgQGNvZGV7bW92X3RleHR9Citjb2RlYykgd2l0aCBtZXRhZGF0YSBoZWFkZXJzLgorCitTZWUgYWxzbyB0aGUgQHJlZnttb3YydGV4dHN1Yn0gZmlsdGVyLgorCitAc2VjdGlvbiB0cmFjZV9oZWFkZXJzCisKK0xvZyB0cmFjZSBvdXRwdXQgY29udGFpbmluZyBhbGwgc3ludGF4IGVsZW1lbnRzIGluIHRoZSBjb2RlZCBzdHJlYW0KK2hlYWRlcnMgKGV2ZXJ5dGhpbmcgYWJvdmUgdGhlIGxldmVsIG9mIGluZGl2aWR1YWwgY29kZWQgYmxvY2tzKS4KK1RoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGxvdy1sZXZlbCBzdHJlYW0gaXNzdWVzLgorCitTdXBwb3J0cyBILjI2NCwgSC4yNjUgYW5kIE1QRUctMi4KKworQHNlY3Rpb24gdnA5X3N1cGVyZnJhbWUKKworTWVyZ2UgVlA5IGludmlzaWJsZSAoYWx0LXJlZikgZnJhbWVzIGJhY2sgaW50byBWUDkgc3VwZXJmcmFtZXMuIFRoaXMKK2ZpeGVzIG1lcmdpbmcgb2Ygc3BsaXQvc2VnbWVudGVkIFZQOSBzdHJlYW1zIHdoZXJlIHRoZSBhbHQtcmVmIGZyYW1lCit3YXMgc3BsaXQgZnJvbSBpdHMgdmlzaWJsZSBjb3VudGVycGFydC4KKworQHNlY3Rpb24gdnA5X3N1cGVyZnJhbWVfc3BsaXQKKworU3BsaXQgVlA5IHN1cGVyZnJhbWVzIGludG8gc2luZ2xlIGZyYW1lcy4KKworQHNlY3Rpb24gdnA5X3Jhd19yZW9yZGVyCisKK0dpdmVuIGEgVlA5IHN0cmVhbSB3aXRoIGNvcnJlY3QgdGltZXN0YW1wcyBidXQgcG9zc2libHkgb3V0IG9mIG9yZGVyLAoraW5zZXJ0IGFkZGl0aW9uYWwgc2hvdy1leGlzdGluZy1mcmFtZSBwYWNrZXRzIHRvIGNvcnJlY3QgdGhlIG9yZGVyaW5nLgorCiBAYyBtYW4gZW5kIEJJVFNUUkVBTSBGSUxURVJTCmRpZmYgLS1naXQgYS9kb2MvYnVpbGRfc3lzdGVtLnR4dCBiL2RvYy9idWlsZF9zeXN0ZW0udHh0CmluZGV4IGE5YmQ0ZWIuLjMyNWE5ZTggMTAwNjQ0Ci0tLSBhL2RvYy9idWlsZF9zeXN0ZW0udHh0CisrKyBiL2RvYy9idWlsZF9zeXN0ZW0udHh0CkBAIC0zOSwxNSArMzksMTUgQEAKIGxpYmF2Zm9ybWF0L291dHB1dC1leGFtcGxlCiAgICAgQnVpbGQgdGhlIGxpYmF2Zm9ybWF0IGJhc2ljIGV4YW1wbGUuCiAKLWxpYmF2Y29kZWMvYXBpLWV4YW1wbGUKLSAgICBCdWlsZCB0aGUgbGliYXZjb2RlYyBiYXNpYyBleGFtcGxlLgotCiBsaWJzd3NjYWxlL3N3c2NhbGUtdGVzdAogICAgIEJ1aWxkIHRoZSBzd3NjYWxlIHNlbGYtdGVzdCAodXNlZnVsIGFsc28gYXMgYW4gZXhhbXBsZSkuCiAKIGNvbmZpZwogICAgIFJlY29uZmlndXJlIHRoZSBwcm9qZWN0IHdpdGggdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KIAordG9vbHMvdGFyZ2V0X2RlY188ZGVjb2Rlcj5fZnV6emVyCisgICAgQnVpbGQgZnV6emVyIHRvIGZ1enogdGhlIHNwZWNpZmllZCBkZWNvZGVyLgorCiAKIFVzZWZ1bCBzdGFuZGFyZCBtYWtlIGNvbW1hbmRzOgogbWFrZSAtdCA8dGFyZ2V0PgpkaWZmIC0tZ2l0IGEvZG9jL2NvZGVjcy50ZXhpIGIvZG9jL2NvZGVjcy50ZXhpCmluZGV4IGI0ODFiNGEuLmM5YjlhMTEgMTAwNjQ0Ci0tLSBhL2RvYy9jb2RlY3MudGV4aQorKysgYi9kb2MvY29kZWNzLnRleGkKQEAgLTQ0LDEyICs0NCw2IEBACiBVc2UgbG9vcCBmaWx0ZXIuCiBAaXRlbSBxc2NhbGUKIFVzZSBmaXhlZCBxc2NhbGUuCi1AaXRlbSBnbWMKLVVzZSBnbWMuCi1AaXRlbSBtdjAKLUFsd2F5cyB0cnkgYSBtYiB3aXRoIG12PTwwLDA+LgotQGl0ZW0gaW5wdXRfcHJlc2VydmVkCi0KIEBpdGVtIHBhc3MxCiBVc2UgaW50ZXJuYWwgMnBhc3MgcmF0ZWNvbnRyb2wgaW4gZmlyc3QgcGFzcyBtb2RlLgogQGl0ZW0gcGFzczIKQEAgLTYyLDggKzU2LDYgQEAKIFNldCBlcnJvcls/XSB2YXJpYWJsZXMgZHVyaW5nIGVuY29kaW5nLgogQGl0ZW0gdHJ1bmNhdGVkCiAKLUBpdGVtIG5hcQotTm9ybWFsaXplIGFkYXB0aXZlIHF1YW50aXphdGlvbi4KIEBpdGVtIGlsZGN0CiBVc2UgaW50ZXJsYWNlZCBEQ1QuCiBAaXRlbSBsb3dfZGVsYXkKQEAgLTEzOCw3ICsxMzAsOCBAQAogU2V0IG51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KIAogQGl0ZW0gY3V0b2ZmIEB2YXJ7aW50ZWdlcn0gKEBlbXBoe2VuY29kaW5nLGF1ZGlvfSkKLVNldCBjdXRvZmYgYmFuZHdpZHRoLgorU2V0IGN1dG9mZiBiYW5kd2lkdGguIChTdXBwb3J0ZWQgb25seSBieSBzZWxlY3RlZCBlbmNvZGVycywgc2VlCit0aGVpciByZXNwZWN0aXZlIGRvY3VtZW50YXRpb24gc2VjdGlvbnMuKQogCiBAaXRlbSBmcmFtZV9zaXplIEB2YXJ7aW50ZWdlcn0gKEBlbXBoe2VuY29kaW5nLGF1ZGlvfSkKIFNldCBhdWRpbyBmcmFtZSBzaXplLgpAQCAtMjU3LDcgKzI1MCw3IEBACiBQb3NzaWJsZSB2YWx1ZXM6CiBAdGFibGUgQHNhbXAKIEBpdGVtIHZlcnkKLXN0cmljdGx5IGNvbmZvcm0gdG8gYSBvbGRlciBtb3JlIHN0cmljdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIG9yIHJlZmVyZW5jZSBzb2Z0d2FyZQorc3RyaWN0bHkgY29uZm9ybSB0byBhbiBvbGRlciBtb3JlIHN0cmljdCB2ZXJzaW9uIG9mIHRoZSBzcGVjIG9yIHJlZmVyZW5jZSBzb2Z0d2FyZQogQGl0ZW0gc3RyaWN0CiBzdHJpY3RseSBjb25mb3JtIHRvIGFsbCB0aGUgdGhpbmdzIGluIHRoZSBzcGVjIG5vIG1hdHRlciB3aGF0IGNvbnNlcXVlbmNlcwogQGl0ZW0gbm9ybWFsCkBAIC00NTYsNiArNDQ5LDkgQEAKIEBpdGVtIGFzcGVjdCBAdmFye3JhdGlvbmFsIG51bWJlcn0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKIFNldCBzYW1wbGUgYXNwZWN0IHJhdGlvLgogCitAaXRlbSBzYXIgQHZhcntyYXRpb25hbCBudW1iZXJ9IChAZW1waHtlbmNvZGluZyx2aWRlb30pCitTZXQgc2FtcGxlIGFzcGVjdCByYXRpby4gQWxpYXMgdG8gQHZhcnthc3BlY3R9LgorCiBAaXRlbSBkZWJ1ZyBAdmFye2ZsYWdzfSAoQGVtcGh7ZGVjb2RpbmcvZW5jb2RpbmcsYXVkaW8sdmlkZW8sc3VidGl0bGVzfSkKIFByaW50IHNwZWNpZmljIGRlYnVnIGluZm8uCiAKQEAgLTQ3MSw4ICs0NjcsNiBAQAogbWFjcm9ibG9jayAoTUIpIHR5cGUKIEBpdGVtIHFwCiBwZXItYmxvY2sgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAoUVApCi1AaXRlbSBtdgotbW90aW9uIHZlY3RvcgogQGl0ZW0gZGN0X2NvZWZmCiAKIEBpdGVtIGdyZWVuX21ldGFkYXRhCkBAIC00ODIsMTggKzQ3NiwxMiBAQAogCiBAaXRlbSBzdGFydGNvZGUKIAotQGl0ZW0gcHRzCi0KIEBpdGVtIGVyCiBlcnJvciByZWNvZ25pdGlvbgogQGl0ZW0gbW1jbwogbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb25zIChILjI2NCkKIEBpdGVtIGJ1Z3MKIAotQGl0ZW0gdmlzX3FwCi12aXN1YWxpemUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAoUVApLCBsb3dlciBRUCBhcmUgdGludGVkIGdyZWVuZXIKLUBpdGVtIHZpc19tYl90eXBlCi12aXN1YWxpemUgYmxvY2sgdHlwZXMKIEBpdGVtIGJ1ZmZlcnMKIHBpY3R1cmUgYnVmZmVyIGFsbG9jYXRpb25zCiBAaXRlbSB0aHJlYWRfb3BzCkBAIC01MDIsMjEgKzQ5MCw2IEBACiBza2lwIG1vdGlvbiBjb21wZW5zYXRpb24KIEBlbmQgdGFibGUKIAotQGl0ZW0gdmlzbXYgQHZhcntpbnRlZ2VyfSAoQGVtcGh7ZGVjb2RpbmcsdmlkZW99KQotVmlzdWFsaXplIG1vdGlvbiB2ZWN0b3JzIChNVnMpLgotCi1UaGlzIG9wdGlvbiBpcyBkZXByZWNhdGVkLCBzZWUgdGhlIGNvZGVjdmlldyBmaWx0ZXIgaW5zdGVhZC4KLQotUG9zc2libGUgdmFsdWVzOgotQHRhYmxlIEBzYW1wCi1AaXRlbSBwZgotZm9yd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIFAtZnJhbWVzCi1AaXRlbSBiZgotZm9yd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEItZnJhbWVzCi1AaXRlbSBiYgotYmFja3dhcmQgcHJlZGljdGVkIE1WcyBvZiBCLWZyYW1lcwotQGVuZCB0YWJsZQotCiBAaXRlbSBjbXAgQHZhcntpbnRlZ2VyfSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQogU2V0IGZ1bGwgcGVsIG1lIGNvbXBhcmUgZnVuY3Rpb24uCiAKQEAgLTc1Myw4ICs3MjYsNiBAQAogCiBAaXRlbSBzbGljZV9mbGFncyBAdmFye2ludGVnZXJ9CiAKLUBpdGVtIHh2bWNfYWNjZWxlcmF0aW9uIEB2YXJ7aW50ZWdlcn0KLQogQGl0ZW0gbWJkIEB2YXJ7aW50ZWdlcn0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKIFNldCBtYWNyb2Jsb2NrIGRlY2lzaW9uIGFsZ29yaXRobSAoaGlnaCBxdWFsaXR5IG1vZGUpLgogCkBAIC0xMDQ2LDE1ICsxMDE3LDEzNiBAQAogQGl0ZW0gcmNfbWF4X3Zidl91c2UgQHZhcntmbG9hdH0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKIEBpdGVtIHJjX21pbl92YnZfdXNlIEB2YXJ7ZmxvYXR9IChAZW1waHtlbmNvZGluZyx2aWRlb30pCiBAaXRlbSB0aWNrc19wZXJfZnJhbWUgQHZhcntpbnRlZ2VyfSAoQGVtcGh7ZGVjb2RpbmcvZW5jb2RpbmcsYXVkaW8sdmlkZW99KQorCiBAaXRlbSBjb2xvcl9wcmltYXJpZXMgQHZhcntpbnRlZ2VyfSAoQGVtcGh7ZGVjb2RpbmcvZW5jb2RpbmcsdmlkZW99KQorUG9zc2libGUgdmFsdWVzOgorQHRhYmxlIEBzYW1wCitAaXRlbSBidDcwOQorQlQuNzA5CitAaXRlbSBidDQ3MG0KK0JULjQ3MCBNCitAaXRlbSBidDQ3MGJnCitCVC40NzAgQkcKK0BpdGVtIHNtcHRlMTcwbQorU01QVEUgMTcwIE0KK0BpdGVtIHNtcHRlMjQwbQorU01QVEUgMjQwIE0KK0BpdGVtIGZpbG0KK0ZpbG0KK0BpdGVtIGJ0MjAyMAorQlQuMjAyMAorQGl0ZW0gc21wdGU0MjgKK0BpdGVtIHNtcHRlNDI4XzEKK1NNUFRFIFNUIDQyOC0xCitAaXRlbSBzbXB0ZTQzMQorU01QVEUgNDMxLTIKK0BpdGVtIHNtcHRlNDMyCitTTVBURSA0MzItMQorQGl0ZW0gamVkZWMtcDIyCitKRURFQyBQMjIKK0BlbmQgdGFibGUKKwogQGl0ZW0gY29sb3JfdHJjIEB2YXJ7aW50ZWdlcn0gKEBlbXBoe2RlY29kaW5nL2VuY29kaW5nLHZpZGVvfSkKK1Bvc3NpYmxlIHZhbHVlczoKK0B0YWJsZSBAc2FtcAorQGl0ZW0gYnQ3MDkKK0JULjcwOQorQGl0ZW0gZ2FtbWEyMgorQlQuNDcwIE0KK0BpdGVtIGdhbW1hMjgKK0JULjQ3MCBCRworQGl0ZW0gc21wdGUxNzBtCitTTVBURSAxNzAgTQorQGl0ZW0gc21wdGUyNDBtCitTTVBURSAyNDAgTQorQGl0ZW0gbGluZWFyCitMaW5lYXIKK0BpdGVtIGxvZworQGl0ZW0gbG9nMTAwCitMb2cKK0BpdGVtIGxvZ19zcXJ0CitAaXRlbSBsb2czMTYKK0xvZyBzcXVhcmUgcm9vdAorQGl0ZW0gaWVjNjE5NjZfMl80CitAaXRlbSBpZWM2MTk2Ni0yLTQKK0lFQyA2MTk2Ni0yLTQKK0BpdGVtIGJ0MTM2MQorQGl0ZW0gYnQxMzYxZQorQlQuMTM2MQorQGl0ZW0gaWVjNjE5NjZfMl8xCitAaXRlbSBpZWM2MTk2Ni0yLTEKK0lFQyA2MTk2Ni0yLTEKK0BpdGVtIGJ0MjAyMF8xMAorQGl0ZW0gYnQyMDIwXzEwYml0CitCVC4yMDIwIC0gMTAgYml0CitAaXRlbSBidDIwMjBfMTIKK0BpdGVtIGJ0MjAyMF8xMmJpdAorQlQuMjAyMCAtIDEyIGJpdAorQGl0ZW0gc21wdGUyMDg0CitTTVBURSBTVCAyMDg0CitAaXRlbSBzbXB0ZTQyOAorQGl0ZW0gc21wdGU0MjhfMQorU01QVEUgU1QgNDI4LTEKK0BpdGVtIGFyaWItc3RkLWI2NworQVJJQiBTVEQtQjY3CitAZW5kIHRhYmxlCisKIEBpdGVtIGNvbG9yc3BhY2UgQHZhcntpbnRlZ2VyfSAoQGVtcGh7ZGVjb2RpbmcvZW5jb2RpbmcsdmlkZW99KQorUG9zc2libGUgdmFsdWVzOgorQHRhYmxlIEBzYW1wCitAaXRlbSByZ2IKK1JHQgorQGl0ZW0gYnQ3MDkKK0JULjcwOQorQGl0ZW0gZmNjCitGQ0MKK0BpdGVtIGJ0NDcwYmcKK0JULjQ3MCBCRworQGl0ZW0gc21wdGUxNzBtCitTTVBURSAxNzAgTQorQGl0ZW0gc21wdGUyNDBtCitTTVBURSAyNDAgTQorQGl0ZW0geWNvY2cKK1lDT0NHCitAaXRlbSBidDIwMjBuYworQGl0ZW0gYnQyMDIwX25jbAorQlQuMjAyMCBOQ0wKK0BpdGVtIGJ0MjAyMGMKK0BpdGVtIGJ0MjAyMF9jbAorQlQuMjAyMCBDTAorQGl0ZW0gc21wdGUyMDg1CitTTVBURSAyMDg1CitAZW5kIHRhYmxlCiAKIEBpdGVtIGNvbG9yX3JhbmdlIEB2YXJ7aW50ZWdlcn0gKEBlbXBoe2RlY29kaW5nL2VuY29kaW5nLHZpZGVvfSkKIElmIHVzZWQgYXMgaW5wdXQgcGFyYW1ldGVyLCBpdCBzZXJ2ZXMgYXMgYSBoaW50IHRvIHRoZSBkZWNvZGVyLCB3aGljaAogY29sb3JfcmFuZ2UgdGhlIGlucHV0IGhhcy4KK1Bvc3NpYmxlIHZhbHVlczoKK0B0YWJsZSBAc2FtcAorQGl0ZW0gdHYKK0BpdGVtIG1wZWcKK01QRUcgKDIxOSoyXihuLTgpKQorQGl0ZW0gcGMKK0BpdGVtIGpwZWcKK0pQRUcgKDJebi0xKQorQGVuZCB0YWJsZQogCiBAaXRlbSBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uIEB2YXJ7aW50ZWdlcn0gKEBlbXBoe2RlY29kaW5nL2VuY29kaW5nLHZpZGVvfSkKK1Bvc3NpYmxlIHZhbHVlczoKK0B0YWJsZSBAc2FtcAorQGl0ZW0gbGVmdAorCitAaXRlbSBjZW50ZXIKKworQGl0ZW0gdG9wbGVmdAorCitAaXRlbSB0b3AKKworQGl0ZW0gYm90dG9tbGVmdAorCitAaXRlbSBib3R0b20KKworQGVuZCB0YWJsZQogCiBAaXRlbSBsb2dfbGV2ZWxfb2Zmc2V0IEB2YXJ7aW50ZWdlcn0KIFNldCB0aGUgbG9nIGxldmVsIG9mZnNldC4KQEAgLTExMzMsMTMgKzEyMjUsMTMgQEAKIEludGVybGFjZWQgdmlkZW8sIGJvdHRvbSBjb2RlZCBmaXJzdCwgdG9wIGRpc3BsYXllZCBmaXJzdAogQGVuZCB0YWJsZQogCi1AaXRlbSBza2lwX2FscGhhIEB2YXJ7aW50ZWdlcn0gKEBlbXBoe2RlY29kaW5nLHZpZGVvfSkKK0BpdGVtIHNraXBfYWxwaGEgQHZhcntib29sfSAoQGVtcGh7ZGVjb2RpbmcsdmlkZW99KQogU2V0IHRvIDEgdG8gZGlzYWJsZSBwcm9jZXNzaW5nIGFscGhhICh0cmFuc3BhcmVuY3kpLiBUaGlzIHdvcmtzIGxpa2UgdGhlCiBAc2FtcHtncmF5fSBmbGFnIGluIHRoZSBAb3B0aW9ue2ZsYWdzfSBvcHRpb24gd2hpY2ggc2tpcHMgY2hyb21hIGluZm9ybWF0aW9uCiBpbnN0ZWFkIG9mIGFscGhhLiBEZWZhdWx0IGlzIDAuCiAKIEBpdGVtIGNvZGVjX3doaXRlbGlzdCBAdmFye2xpc3R9IChAZW1waHtpbnB1dH0pCi0iLCIgc2VwYXJhdGVkIExpc3Qgb2YgYWxsb3dlZCBkZWNvZGVycy4gQnkgZGVmYXVsdCBhbGwgYXJlIGFsbG93ZWQuCisiLCIgc2VwYXJhdGVkIGxpc3Qgb2YgYWxsb3dlZCBkZWNvZGVycy4gQnkgZGVmYXVsdCBhbGwgYXJlIGFsbG93ZWQuCiAKIEBpdGVtIGR1bXBfc2VwYXJhdG9yIEB2YXJ7c3RyaW5nfSAoQGVtcGh7aW5wdXR9KQogU2VwYXJhdG9yIHVzZWQgdG8gc2VwYXJhdGUgdGhlIGZpZWxkcyBwcmludGVkIG9uIHRoZSBjb21tYW5kIGxpbmUgYWJvdXQgdGhlCkBAIC0xMTUwLDYgKzEyNDIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgLWkgfi92aWRlb3MvbWF0cml4YmVuY2hfbXBlZzIubXBnCiBAZW5kIGV4YW1wbGUKIAorQGl0ZW0gbWF4X3BpeGVscyBAdmFye2ludGVnZXJ9IChAZW1waHtkZWNvZGluZy9lbmNvZGluZyx2aWRlb30pCitNYXhpbXVtIG51bWJlciBvZiBwaXhlbHMgcGVyIGltYWdlLiBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGF2b2lkIG91dCBvZgorbWVtb3J5IGZhaWx1cmVzIGR1ZSB0byBsYXJnZSBpbWFnZXMuCisKK0BpdGVtIGFwcGx5X2Nyb3BwaW5nIEB2YXJ7Ym9vbH0gKEBlbXBoe2RlY29kaW5nLHZpZGVvfSkKK0VuYWJsZSBjcm9wcGluZyBpZiBjcm9wcGluZyBwYXJhbWV0ZXJzIGFyZSBtdWx0aXBsZXMgb2YgdGhlIHJlcXVpcmVkCithbGlnbm1lbnQgZm9yIHRoZSBsZWZ0IGFuZCB0b3AgcGFyYW1ldGVycy4gSWYgdGhlIGFsaWdubWVudCBpcyBub3QgbWV0IHRoZQorY3JvcHBpbmcgd2lsbCBiZSBwYXJ0aWFsbHkgYXBwbGllZCB0byBtYWludGFpbiBhbGlnbm1lbnQuCitEZWZhdWx0IGlzIDEgKGVuYWJsZWQpLgorTm90ZTogVGhlIHJlcXVpcmVkIGFsaWdubWVudCBkZXBlbmRzIG9uIGlmIEBjb2Rle0FWX0NPREVDX0ZMQUdfVU5BTElHTkVEfSBpcyBzZXQgYW5kIHRoZQorQ1BVLiBAY29kZXtBVl9DT0RFQ19GTEFHX1VOQUxJR05FRH0gY2Fubm90IGJlIGNoYW5nZWQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiBBbHNvIGhhcmR3YXJlCitkZWNvZGVycyB3aWxsIG5vdCBhcHBseSBsZWZ0L3RvcCBDcm9wcGluZy4KKworCiBAZW5kIHRhYmxlCiAKIEBjIG1hbiBlbmQgQ09ERUMgT1BUSU9OUwpkaWZmIC0tZ2l0IGEvZG9jL2RlY29kZXJzLnRleGkgYi9kb2MvZGVjb2RlcnMudGV4aQppbmRleCAzNTc3MTE0Li5hOTUxMGJkIDEwMDY0NAotLS0gYS9kb2MvZGVjb2RlcnMudGV4aQorKysgYi9kb2MvZGVjb2RlcnMudGV4aQpAQCAtMjUsMTMgKzI1LDYgQEAKIEEgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSB2aWRlbyBkZWNvZGVycwogZm9sbG93cy4KIAotQHNlY3Rpb24gaGV2YwotCi1IRVZDIC8gSC4yNjUgZGVjb2Rlci4KLQotTm90ZTogdGhlIEBvcHRpb257c2tpcF9sb29wX2ZpbHRlcn0gb3B0aW9uIGhhcyBlZmZlY3Qgb25seSBhdCBsZXZlbAotQGNvZGV7YWxsfS4KLQogQHNlY3Rpb24gcmF3dmlkZW8KIAogUmF3IHZpZGVvIGRlY29kZXIuCkBAIC0xMDksNyArMTAyLDcgQEAKIAogQHNlY3Rpb24gZmZ3YXZlc3ludGgKIAotSW50ZXJuYWwgd2F2ZSBzeW50aGV0aXplci4KK0ludGVybmFsIHdhdmUgc3ludGhlc2l6ZXIuCiAKIFRoaXMgZGVjb2RlciBnZW5lcmF0ZXMgd2F2ZSBwYXR0ZXJucyBhY2NvcmRpbmcgdG8gcHJlZGVmaW5lZCBzZXF1ZW5jZXMuIEl0cwogdXNlIGlzIHB1cmVseSBpbnRlcm5hbCBhbmQgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBpdCBhY2NlcHRzIGlzIG5vdCBwdWJsaWNseQpAQCAtMjc1LDExICsyNjgsMTEgQEAKIENob3BzIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlcyBhbmQgcmVtb3ZlcyBlbXB0eSBsaW5lcyBmcm9tIHRoZSBnZW5lcmF0ZWQKIHRleHQuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBmb3IgdGVsZXRleHQgYmFzZWQgc3VidGl0bGVzIHdoZXJlIGVtcHR5IHNwYWNlcyBtYXkKIGJlIHByZXNlbnQgYXQgdGhlIHN0YXJ0IG9yIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmVzIG9yIGVtcHR5IGxpbmVzIG1heSBiZQotcHJlc2VudCBiZXR3ZWVuIHRoZSBzdWJ0aXRsZSBsaW5lcyBiZWNhdXNlIG9mIGRvdWJsZS1zaXplZCB0ZWxldGV4dCBjaGFyYWN0ZXMuCitwcmVzZW50IGJldHdlZW4gdGhlIHN1YnRpdGxlIGxpbmVzIGJlY2F1c2Ugb2YgZG91YmxlLXNpemVkIHRlbGV0ZXh0IGNoYXJhY3RlcnMuCiBEZWZhdWx0IHZhbHVlIGlzIDEuCiBAaXRlbSB0eHRfZHVyYXRpb24KIFNldHMgdGhlIGRpc3BsYXkgZHVyYXRpb24gb2YgdGhlIGRlY29kZWQgdGVsZXRleHQgcGFnZXMgb3Igc3VidGl0bGVzIGluCi1taWxpc2Vjb25kcy4gRGVmYXVsdCB2YWx1ZSBpcyAzMDAwMCB3aGljaCBpcyAzMCBzZWNvbmRzLgorbWlsbGlzZWNvbmRzLiBEZWZhdWx0IHZhbHVlIGlzIDMwMDAwIHdoaWNoIGlzIDMwIHNlY29uZHMuCiBAaXRlbSB0eHRfdHJhbnNwYXJlbnQKIEZvcmNlIHRyYW5zcGFyZW50IGJhY2tncm91bmQgb2YgdGhlIGdlbmVyYXRlZCB0ZWxldGV4dCBiaXRtYXBzLiBEZWZhdWx0IHZhbHVlCiBpcyAwIHdoaWNoIG1lYW5zIGFuIG9wYXF1ZSBiYWNrZ3JvdW5kLgpkaWZmIC0tZ2l0IGEvZG9jL2RlbXV4ZXJzLnRleGkgYi9kb2MvZGVtdXhlcnMudGV4aQppbmRleCA2YjVmOGJiLi5lN2MyYWJjIDEwMDY0NAotLS0gYS9kb2MvZGVtdXhlcnMudGV4aQorKysgYi9kb2MvZGVtdXhlcnMudGV4aQpAQCAtMTMsOCArMTMsOSBAQAogdGhlIG9wdGlvbiBAY29kZXstLWVuYWJsZS1kZW11eGVyPUB2YXJ7REVNVVhFUn19LCBvciBkaXNhYmxlIGl0CiB3aXRoIHRoZSBvcHRpb24gQGNvZGV7LS1kaXNhYmxlLWRlbXV4ZXI9QHZhcntERU1VWEVSfX0uCiAKLVRoZSBvcHRpb24gQGNvZGV7LWZvcm1hdHN9IG9mIHRoZSBmZiogdG9vbHMgd2lsbCBkaXNwbGF5IHRoZSBsaXN0IG9mCi1lbmFibGVkIGRlbXV4ZXJzLgorVGhlIG9wdGlvbiBAY29kZXstZGVtdXhlcnN9IG9mIHRoZSBmZiogdG9vbHMgd2lsbCBkaXNwbGF5IHRoZSBsaXN0IG9mCitlbmFibGVkIGRlbXV4ZXJzLiBVc2UgQGNvZGV7LWZvcm1hdHN9IHRvIHZpZXcgYSBjb21iaW5lZCBsaXN0IG9mCitlbmFibGVkIGRlbXV4ZXJzIGFuZCBtdXhlcnMuCiAKIFRoZSBkZXNjcmlwdGlvbiBvZiBzb21lIG9mIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGRlbXV4ZXJzIGZvbGxvd3MuCiAKQEAgLTcyLDcgKzczLDcgQEAKIFZpcnR1YWwgY29uY2F0ZW5hdGlvbiBzY3JpcHQgZGVtdXhlci4KIAogVGhpcyBkZW11eGVyIHJlYWRzIGEgbGlzdCBvZiBmaWxlcyBhbmQgb3RoZXIgZGlyZWN0aXZlcyBmcm9tIGEgdGV4dCBmaWxlIGFuZAotZGVtdXhlcyB0aGVtIG9uZSBhZnRlciB0aGUgb3RoZXIsIGFzIGlmIGFsbCB0aGVpciBwYWNrZXQgaGFkIGJlZW4gbXV4ZWQKK2RlbXV4ZXMgdGhlbSBvbmUgYWZ0ZXIgdGhlIG90aGVyLCBhcyBpZiBhbGwgdGhlaXIgcGFja2V0cyBoYWQgYmVlbiBtdXhlZAogdG9nZXRoZXIuCiAKIFRoZSB0aW1lc3RhbXBzIGluIHRoZSBmaWxlcyBhcmUgYWRqdXN0ZWQgc28gdGhhdCB0aGUgZmlyc3QgZmlsZSBzdGFydHMgYXQgMApAQCAtMTA0LDEwICsxMDUsMTAgQEAKIAogQGl0ZW0gQGNvZGV7ZmZjb25jYXQgdmVyc2lvbiAxLjB9CiBJZGVudGlmeSB0aGUgc2NyaXB0IHR5cGUgYW5kIHZlcnNpb24uIEl0IGFsc28gc2V0cyB0aGUgQG9wdGlvbntzYWZlfSBvcHRpb24KLXRvIDEgaWYgaXQgd2FzIHRvIGl0cyBkZWZhdWx0IC0xLgordG8gMSBpZiBpdCB3YXMgLTEuCiAKIFRvIG1ha2UgRkZtcGVnIHJlY29nbml6ZSB0aGUgZm9ybWF0IGF1dG9tYXRpY2FsbHksIHRoaXMgZGlyZWN0aXZlIG11c3QKLWFwcGVhcnMgZXhhY3RseSBhcyBpcyAobm8gZXh0cmEgc3BhY2Ugb3IgYnl0ZS1vcmRlci1tYXJrKSBvbiB0aGUgdmVyeSBmaXJzdAorYXBwZWFyIGV4YWN0bHkgYXMgaXMgKG5vIGV4dHJhIHNwYWNlIG9yIGJ5dGUtb3JkZXItbWFyaykgb24gdGhlIHZlcnkgZmlyc3QKIGxpbmUgb2YgdGhlIHNjcmlwdC4KIAogQGl0ZW0gQGNvZGV7ZHVyYXRpb24gQHZhcntkdXJ9fQpAQCAtMTkyLDcgKzE5Myw5IEBACiAKIElmIHNldCB0byAwLCBhbnkgZmlsZSBuYW1lIGlzIGFjY2VwdGVkLgogCi1UaGUgZGVmYXVsdCBpcyAtMSwgaXQgaXMgZXF1aXZhbGVudCB0byAxIGlmIHRoZSBmb3JtYXQgd2FzIGF1dG9tYXRpY2FsbHkKK1RoZSBkZWZhdWx0IGlzIDEuCisKKy0xIGlzIGVxdWl2YWxlbnQgdG8gMSBpZiB0aGUgZm9ybWF0IHdhcyBhdXRvbWF0aWNhbGx5CiBwcm9iZWQgYW5kIDAgb3RoZXJ3aXNlLgogCiBAaXRlbSBhdXRvX2NvbnZlcnQKQEAgLTI0MSwzMCArMjQ0LDMzIEBACiBAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCi1Ac2VjdGlvbiBmbHYKK0BzZWN0aW9uIGRhc2gKKworRHluYW1pYyBBZGFwdGl2ZSBTdHJlYW1pbmcgb3ZlciBIVFRQIGRlbXV4ZXIuCisKK1RoaXMgZGVtdXhlciBwcmVzZW50cyBhbGwgQVZTdHJlYW1zIGZvdW5kIGluIHRoZSBtYW5pZmVzdC4KK0J5IHNldHRpbmcgdGhlIGRpc2NhcmQgZmxhZ3Mgb24gQVZTdHJlYW1zIHRoZSBjYWxsZXIgY2FuIGRlY2lkZQord2hpY2ggc3RyZWFtcyB0byBhY3R1YWxseSByZWNlaXZlLgorRWFjaCBzdHJlYW0gbWlycm9ycyB0aGUgQGNvZGV7aWR9IGFuZCBAY29kZXtiYW5kd2lkdGh9IHByb3BlcnRpZXMgZnJvbSB0aGUKK0Bjb2RlezxSZXByZXNlbnRhdGlvbj59IGFzIG1ldGFkYXRhIGtleXMgbmFtZWQgImlkIiBhbmQgInZhcmlhbnRfYml0cmF0ZSIgcmVzcGVjdGl2ZWx5LgorCitAc2VjdGlvbiBmbHYsIGxpdmVfZmx2CiAKIEFkb2JlIEZsYXNoIFZpZGVvIEZvcm1hdCBkZW11eGVyLgogCi1UaGlzIGRlbXV4ZXIgaXMgdXNlZCB0byBkZW11eCBGTFYgZmlsZXMgYW5kIFJUTVAgbmV0d29yayBzdHJlYW1zLgorVGhpcyBkZW11eGVyIGlzIHVzZWQgdG8gZGVtdXggRkxWIGZpbGVzIGFuZCBSVE1QIG5ldHdvcmsgc3RyZWFtcy4gSW4gY2FzZSBvZiBsaXZlIG5ldHdvcmsgc3RyZWFtcywgaWYgeW91IGZvcmNlIGZvcm1hdCwgeW91IG1heSB1c2UgbGl2ZV9mbHYgb3B0aW9uIGluc3RlYWQgb2YgZmx2IHRvIHN1cnZpdmUgdGltZXN0YW1wIGRpc2NvbnRpbnVpdGllcy4KKworQGV4YW1wbGUKK2ZmbXBlZyAtZiBmbHYgLWkgbXlmaWxlLmZsdiAuLi4KK2ZmbXBlZyAtZiBsaXZlX2ZsdiAtaSBydG1wOi8vPGFueS5zZXJ2ZXI+L2FueXRoaW5nL2tleSAuLi4uCitAZW5kIGV4YW1wbGUKKwogCiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gLWZsdl9tZXRhZGF0YSBAdmFye2Jvb2x9CiBBbGxvY2F0ZSB0aGUgc3RyZWFtcyBhY2NvcmRpbmcgdG8gdGhlIG9uTWV0YURhdGEgYXJyYXkgY29udGVudC4KIEBlbmQgdGFibGUKIAotQHNlY3Rpb24gbGliZ21lCi0KLVRoZSBHYW1lIE11c2ljIEVtdSBsaWJyYXJ5IGlzIGEgY29sbGVjdGlvbiBvZiB2aWRlbyBnYW1lIG11c2ljIGZpbGUgZW11bGF0b3JzLgotCi1TZWUgQHVybHtodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ2FtZS1tdXNpYy1lbXUvfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotU29tZSBmaWxlcyBoYXZlIG11bHRpcGxlIHRyYWNrcy4gVGhlIGRlbXV4ZXIgd2lsbCBwaWNrIHRoZSBmaXJzdCB0cmFjayBieQotZGVmYXVsdC4gVGhlIEBvcHRpb257dHJhY2tfaW5kZXh9IG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZWxlY3QgYSBkaWZmZXJlbnQKLXRyYWNrLiBUcmFjayBpbmRleGVzIHN0YXJ0IGF0IDAuIFRoZSBkZW11eGVyIGV4cG9ydHMgdGhlIG51bWJlciBvZiB0cmFja3MgYXMKLUB2YXJ7dHJhY2tzfSBtZXRhIGRhdGEgZW50cnkuCi0KLUZvciB2ZXJ5IGxhcmdlIGZpbGVzLCB0aGUgQG9wdGlvbnttYXhfc2l6ZX0gb3B0aW9uIG1heSBoYXZlIHRvIGJlIGFkanVzdGVkLgotCiBAc2VjdGlvbiBnaWYKIAogQW5pbWF0ZWQgR0lGIGRlbXV4ZXIuCkBAIC0zMDQsNiArMzEwLDMyIEBACiB3aGljaCBpbiB0aGlzIGNhc2UgaXMgQGZpbGV7aW5wdXQubXA0fSBhcyB0aGUgR0lGIGluIHRoaXMgZXhhbXBsZSBsb29wcwogaW5maW5pdGVseS4KIAorQHNlY3Rpb24gaGxzCisKK0hMUyBkZW11eGVyCisKK0l0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gbGl2ZV9zdGFydF9pbmRleAorc2VnbWVudCBpbmRleCB0byBzdGFydCBsaXZlIHN0cmVhbXMgYXQgKG5lZ2F0aXZlIHZhbHVlcyBhcmUgZnJvbSB0aGUgZW5kKS4KKworQGl0ZW0gYWxsb3dlZF9leHRlbnNpb25zCisnLCcgc2VwYXJhdGVkIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRoYXQgaGxzIGlzIGFsbG93ZWQgdG8gYWNjZXNzLgorCitAaXRlbSBtYXhfcmVsb2FkCitNYXhpbXVtIG51bWJlciBvZiB0aW1lcyBhIGluc3VmZmljaWVudCBsaXN0IGlzIGF0dGVtcHRlZCB0byBiZSByZWxvYWRlZC4KK0RlZmF1bHQgdmFsdWUgaXMgMTAwMC4KKworQGl0ZW0gaHR0cF9wZXJzaXN0ZW50CitVc2UgcGVyc2lzdGVudCBIVFRQIGNvbm5lY3Rpb25zLiBBcHBsaWNhYmxlIG9ubHkgZm9yIEhUVFAgc3RyZWFtcy4KK0VuYWJsZWQgYnkgZGVmYXVsdC4KKworQGl0ZW0gaHR0cF9tdWx0aXBsZQorVXNlIG11bHRpcGxlIEhUVFAgY29ubmVjdGlvbnMgZm9yIGRvd25sb2FkaW5nIEhUVFAgc2VnbWVudHMuCitFbmFibGVkIGJ5IGRlZmF1bHQgZm9yIEhUVFAvMS4xIHNlcnZlcnMuCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIGltYWdlMgogCiBJbWFnZSBmaWxlIGRlbXV4ZXIuCkBAIC00MzksOSArNDcxLDQ5IEBACiBAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCi1Ac2VjdGlvbiBtb3YvbXA0LzNncC9RdWlja3RtZQorQHNlY3Rpb24gbGliZ21lCiAKLVF1aWNrdGltZSAvIE1QNCBkZW11eGVyLgorVGhlIEdhbWUgTXVzaWMgRW11IGxpYnJhcnkgaXMgYSBjb2xsZWN0aW9uIG9mIHZpZGVvIGdhbWUgbXVzaWMgZmlsZSBlbXVsYXRvcnMuCisKK1NlZSBAdXJse2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9nYW1lLW11c2ljLWVtdS99IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitTb21lIGZpbGVzIGhhdmUgbXVsdGlwbGUgdHJhY2tzLiBUaGUgZGVtdXhlciB3aWxsIHBpY2sgdGhlIGZpcnN0IHRyYWNrIGJ5CitkZWZhdWx0LiBUaGUgQG9wdGlvbnt0cmFja19pbmRleH0gb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCBhIGRpZmZlcmVudAordHJhY2suIFRyYWNrIGluZGV4ZXMgc3RhcnQgYXQgMC4gVGhlIGRlbXV4ZXIgZXhwb3J0cyB0aGUgbnVtYmVyIG9mIHRyYWNrcyBhcworQHZhcnt0cmFja3N9IG1ldGEgZGF0YSBlbnRyeS4KKworRm9yIHZlcnkgbGFyZ2UgZmlsZXMsIHRoZSBAb3B0aW9ue21heF9zaXplfSBvcHRpb24gbWF5IGhhdmUgdG8gYmUgYWRqdXN0ZWQuCisKK0BzZWN0aW9uIGxpYm9wZW5tcHQKKworbGlib3Blbm1wdCBiYXNlZCBtb2R1bGUgZGVtdXhlcgorCitTZWUgQHVybHtodHRwczovL2xpYi5vcGVubXB0Lm9yZy9saWJvcGVubXB0L30gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKK1NvbWUgZmlsZXMgaGF2ZSBtdWx0aXBsZSBzdWJzb25ncyAodHJhY2tzKSB0aGlzIGNhbiBiZSBzZXQgd2l0aCB0aGUgQG9wdGlvbntzdWJzb25nfQorb3B0aW9uLgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHN1YnNvbmcKK1NldCB0aGUgc3Vic29uZyBpbmRleC4gVGhpcyBjYW4gYmUgZWl0aGVyICAnYWxsJywgJ2F1dG8nLCBvciB0aGUgaW5kZXggb2YgdGhlCitzdWJzb25nLiBTdWJzb25nIGluZGV4ZXMgc3RhcnQgYXQgMC4gVGhlIGRlZmF1bHQgaXMgJ2F1dG8nLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0byBsZXQgbGlib3Blbm1wdCBjaG9vc2UuCisKK0BpdGVtIGxheW91dAorU2V0IHRoZSBjaGFubmVsIGxheW91dC4gVmFsaWQgdmFsdWVzIGFyZSAxLCAyLCBhbmQgNCBjaGFubmVsIGxheW91dHMuCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBTVEVSRU8uCisKK0BpdGVtIHNhbXBsZV9yYXRlCitTZXQgdGhlIHNhbXBsZSByYXRlIGZvciBsaWJvcGVubXB0IHRvIG91dHB1dC4KK1JhbmdlIGlzIGZyb20gMTAwMCB0byBJTlRfTUFYLiBUaGUgdmFsdWUgZGVmYXVsdCBpcyA0ODAwMC4KK0BlbmQgdGFibGUKKworQHNlY3Rpb24gbW92L21wNC8zZ3AvUXVpY2tUaW1lCisKK1F1aWNrVGltZSAvIE1QNCBkZW11eGVyLgogCiBUaGlzIGRlbXV4ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CiBAdGFibGUgQG9wdGlvbgpkaWZmIC0tZ2l0IGEvZG9jL2RldmVsb3Blci50ZXhpIGIvZG9jL2RldmVsb3Blci50ZXhpCmluZGV4IDZkYjkzY2UuLmEwZWVlZmUgMTAwNjQ0Ci0tLSBhL2RvYy9kZXZlbG9wZXIudGV4aQorKysgYi9kb2MvZGV2ZWxvcGVyLnRleGkKQEAgLTEwLDkgKzEwLDcgQEAKIAogQGNvbnRlbnRzCiAKLUBjaGFwdGVyIERldmVsb3BlcnMgR3VpZGUKLQotQHNlY3Rpb24gTm90ZXMgZm9yIGV4dGVybmFsIGRldmVsb3BlcnMKK0BjaGFwdGVyIE5vdGVzIGZvciBleHRlcm5hbCBkZXZlbG9wZXJzCiAKIFRoaXMgZG9jdW1lbnQgaXMgbW9zdGx5IHVzZWZ1bCBmb3IgaW50ZXJuYWwgRkZtcGVnIGRldmVsb3BlcnMuCiBFeHRlcm5hbCBkZXZlbG9wZXJzIHdobyBuZWVkIHRvIHVzZSB0aGUgQVBJIGluIHRoZWlyIGFwcGxpY2F0aW9uIHNob3VsZApAQCAtMzAsMTUgKzI4LDEzIEBACiBleHRlcm5hbCBwcm9ncmFtcyByZWFkIHRoZSBAZmlsZXtMSUNFTlNFfSBmaWxlIGluIHRoZSBzb3VyY2UgdHJlZSBhbmQKIGNvbnN1bHQgQHVybHtodHRwczovL2ZmbXBlZy5vcmcvbGVnYWwuaHRtbH0uCiAKLUBzZWN0aW9uIENvbnRyaWJ1dGluZworQGNoYXB0ZXIgQ29udHJpYnV0aW5nCiAKLVRoZXJlIGFyZSAzIHdheXMgYnkgd2hpY2ggY29kZSBnZXRzIGludG8gRkZtcGVnLgorVGhlcmUgYXJlIDIgd2F5cyBieSB3aGljaCBjb2RlIGdldHMgaW50byBGRm1wZWc6CiBAaXRlbWl6ZSBAYnVsbGV0Ci1AaXRlbSBTdWJtaXR0aW5nIHBhdGNoZXMgdG8gdGhlIG1haW4gZGV2ZWxvcGVyIG1haWxpbmcgbGlzdC4KK0BpdGVtIFN1Ym1pdHRpbmcgcGF0Y2hlcyB0byB0aGUgZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdC4KICAgICAgIFNlZSBAcmVme1N1Ym1pdHRpbmcgcGF0Y2hlc30gZm9yIGRldGFpbHMuCiBAaXRlbSBEaXJlY3RseSBjb21taXR0aW5nIGNoYW5nZXMgdG8gdGhlIG1haW4gdHJlZS4KLUBpdGVtIENvbW1pdHRpbmcgY2hhbmdlcyB0byBhIGdpdCBjbG9uZSwgZm9yIGV4YW1wbGUgb24gZ2l0aHViLmNvbSBvcgotICAgICAgZ2l0b3Jpb3VzLm9yZy4gQW5kIGFza2luZyB1cyB0byBtZXJnZSB0aGVzZSBjaGFuZ2VzLgogQGVuZCBpdGVtaXplCiAKIFdoaWNoZXZlciB3YXksIGNoYW5nZXMgc2hvdWxkIGJlIHJldmlld2VkIGJ5IHRoZSBtYWludGFpbmVyIG9mIHRoZSBjb2RlCkBAIC00Nyw5ICs0Myw5IEBACiBhbmQgc2hvdWxkIHRyeSB0byBmaXggaXNzdWVzIHRoZWlyIGNvbW1pdCBjYXVzZXMuCiAKIEBhbmNob3J7Q29kaW5nIFJ1bGVzfQotQHNlY3Rpb24gQ29kaW5nIFJ1bGVzCitAY2hhcHRlciBDb2RpbmcgUnVsZXMKIAotQHN1YnNlY3Rpb24gQ29kZSBmb3JtYXR0aW5nIGNvbnZlbnRpb25zCitAc2VjdGlvbiBDb2RlIGZvcm1hdHRpbmcgY29udmVudGlvbnMKIAogVGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgZ3VpZGVsaW5lcyByZWdhcmRpbmcgdGhlIGluZGVudGF0aW9uIGluIGZpbGVzOgogCkBAIC03NCw3ICs3MCw3IEBACiBUaGUgbWFpbiBwcmlvcml0eSBpbiBGRm1wZWcgaXMgc2ltcGxpY2l0eSBhbmQgc21hbGwgY29kZSBzaXplIGluIG9yZGVyIHRvCiBtaW5pbWl6ZSB0aGUgYnVnIGNvdW50LgogCi1Ac3Vic2VjdGlvbiBDb21tZW50cworQHNlY3Rpb24gQ29tbWVudHMKIFVzZSB0aGUgSmF2YURvYy9Eb3h5Z2VuICBmb3JtYXQgKHNlZSBleGFtcGxlcyBiZWxvdykgc28gdGhhdCBjb2RlIGRvY3VtZW50YXRpb24KIGNhbiBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS4gQWxsIG5vbnRyaXZpYWwgZnVuY3Rpb25zIHNob3VsZCBoYXZlIGEgY29tbWVudAogYWJvdmUgdGhlbSBleHBsYWluaW5nIHdoYXQgdGhlIGZ1bmN0aW9uIGRvZXMsIGV2ZW4gaWYgaXQgaXMganVzdCBvbmUgc2VudGVuY2UuCkBAIC0xMTQsNyArMTEwLDcgQEAKIC4uLgogQGVuZCBleGFtcGxlCiAKLUBzdWJzZWN0aW9uIEMgbGFuZ3VhZ2UgZmVhdHVyZXMKK0BzZWN0aW9uIEMgbGFuZ3VhZ2UgZmVhdHVyZXMKIAogRkZtcGVnIGlzIHByb2dyYW1tZWQgaW4gdGhlIElTTyBDOTAgbGFuZ3VhZ2Ugd2l0aCBhIGZldyBhZGRpdGlvbmFsCiBmZWF0dXJlcyBmcm9tIElTTyBDOTksIG5hbWVseToKQEAgLTEzMSw2ICsxMjcsMTEgQEAKIAogQGl0ZW0KIGNvbXBvdW5kIGxpdGVyYWxzIChAc2FtcHt4ID0gKHN0cnVjdCBzKSBAeyAxNywgMjMgQH07fSkuCisKK0BpdGVtCitJbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJlaGF2aW9yIGZvciBzaWduZWQgaW50ZWdlcnMgaXMgYXNzdW1lZCB0byBtYXRjaCB0aGUKK2V4cGVjdGVkIGJlaGF2aW9yIGZvciB0d28ncyBjb21wbGVtZW50LiBOb24gcmVwcmVzZW50YWJsZSB2YWx1ZXMgaW4gaW50ZWdlcgorY2FzdHMgYXJlIGJpbmFyeSB0cnVuY2F0ZWQuIFNoaWZ0IHJpZ2h0IG9mIHNpZ25lZCB2YWx1ZXMgdXNlcyBzaWduIGV4dGVuc2lvbi4KIEBlbmQgaXRlbWl6ZQogCiBUaGVzZSBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkIGJ5IGFsbCBjb21waWxlcnMgd2UgY2FyZSBhYm91dCwgc28gd2Ugd2lsbCBub3QKQEAgLTE1NSw3ICsxNTYsNyBAQAogR0NDIHN0YXRlbWVudCBleHByZXNzaW9ucyAoQHNhbXB7KHggPSAoQHsgaW50IHkgPSA0OyB5OyBAfSl9KS4KIEBlbmQgaXRlbWl6ZQogCi1Ac3Vic2VjdGlvbiBOYW1pbmcgY29udmVudGlvbnMKK0BzZWN0aW9uIE5hbWluZyBjb252ZW50aW9ucwogQWxsIG5hbWVzIHNob3VsZCBiZSBjb21wb3NlZCB3aXRoIHVuZGVyc2NvcmVzIChfKSwgbm90IENhbWVsQ2FzZS4gRm9yIGV4YW1wbGUsCiBAc2FtcHthdmZpbHRlcl9nZXRfdmlkZW9fYnVmZmVyfSBpcyBhbiBhY2NlcHRhYmxlIGZ1bmN0aW9uIG5hbWUgYW5kCiBAc2FtcHtBVkZpbHRlckdldFZpZGVvfSBpcyBub3QuIFRoZSBleGNlcHRpb24gZnJvbSB0aGlzIGFyZSB0eXBlIG5hbWVzLCBsaWtlCkBAIC0xNzksNyArMTgwLDcgQEAKIEBpdGVtCiBGb3IgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgdmlzaWJsZSBvdXRzaWRlIG9mIGZpbGUgc2NvcGUsIHVzZWQgaW50ZXJuYWxseQogYWNyb3NzIG11bHRpcGxlIGxpYnJhcmllcywgdXNlIEBjb2Rle2F2cHJpdl99IGFzIHByZWZpeCwgZm9yIGV4YW1wbGUsCi1Ac2FtcHthdnByaXZfYWFjX3BhcnNlX2hlYWRlcn0uCitAc2FtcHthdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZX0uCiAKIEBpdGVtCiBFYWNoIGxpYnJhcnkgaGFzIGl0cyBvd24gcHJlZml4IGZvciBwdWJsaWMgc3ltYm9scywgaW4gYWRkaXRpb24gdG8gdGhlCkBAIC0xOTksNyArMjAwLDcgQEAKIGFyZSByZXNlcnZlZCBhdCB0aGUgZmlsZSBsZXZlbCBhbmQgbWF5IG5vdCBiZSB1c2VkIGZvciBleHRlcm5hbGx5IHZpc2libGUKIHN5bWJvbHMuIElmIGluIGRvdWJ0LCBqdXN0IGF2b2lkIG5hbWVzIHN0YXJ0aW5nIHdpdGggQGNvZGV7X30gYWx0b2dldGhlci4KIAotQHN1YnNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb252ZW50aW9ucworQHNlY3Rpb24gTWlzY2VsbGFuZW91cyBjb252ZW50aW9ucwogCiBAaXRlbWl6ZSBAYnVsbGV0CiBAaXRlbQpAQCAtMjExLDcgKzIxMiw3IEBACiBzaG91bGQgYWxzbyBiZSBhdm9pZGVkIGlmIHRoZXkgZG9uJ3QgbWFrZSB0aGUgY29kZSBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KIEBlbmQgaXRlbWl6ZQogCi1Ac3Vic2VjdGlvbiBFZGl0b3IgY29uZmlndXJhdGlvbgorQHNlY3Rpb24gRWRpdG9yIGNvbmZpZ3VyYXRpb24KIEluIG9yZGVyIHRvIGNvbmZpZ3VyZSBWaW0gdG8gZm9sbG93IEZGbXBlZyBmb3JtYXR0aW5nIGNvbnZlbnRpb25zLCBwYXN0ZQogdGhlIGZvbGxvd2luZyBzbmlwcGV0IGludG8geW91ciBAZmlsZXsudmltcmN9OgogQGV4YW1wbGUKQEAgLTI0NCwxMCArMjQ1LDEwIEBACiAoc2V0cSBjLWRlZmF1bHQtc3R5bGUgImZmbXBlZyIpCiBAZW5kIGxpc3AKIAotQHNlY3Rpb24gRGV2ZWxvcG1lbnQgUG9saWN5CitAY2hhcHRlciBEZXZlbG9wbWVudCBQb2xpY3kKIAotQGVudW1lcmF0ZQotQGl0ZW0KK0BzZWN0aW9uIFBhdGNoZXMvQ29tbWl0dGluZworQHN1YmhlYWRpbmcgTGljZW5zZXMgZm9yIHBhdGNoZXMgbXVzdCBiZSBjb21wYXRpYmxlIHdpdGggRkZtcGVnLgogQ29udHJpYnV0aW9ucyBzaG91bGQgYmUgbGljZW5zZWQgdW5kZXIgdGhlCiBAdXJlZntodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGdwbC0yLjEuaHRtbCwgTEdQTCAyLjF9LAogaW5jbHVkaW5nIGFuICJvciBhbnkgbGF0ZXIgdmVyc2lvbiIgY2xhdXNlLCBvciwgaWYgeW91IHByZWZlcgpAQCAtMjYwLDE1ICsyNjEsMTUgQEAKIElmIHlvdSBhZGQgYSBuZXcgZmlsZSwgZ2l2ZSBpdCBhIHByb3BlciBsaWNlbnNlIGhlYWRlci4gRG8gbm90IGNvcHkgYW5kCiBwYXN0ZSBpdCBmcm9tIGEgcmFuZG9tIHBsYWNlLCB1c2UgYW4gZXhpc3RpbmcgZmlsZSBhcyB0ZW1wbGF0ZS4KIAotQGl0ZW0KLVlvdSBtdXN0IG5vdCBjb21taXQgY29kZSB3aGljaCBicmVha3MgRkZtcGVnISAoTWVhbmluZyB1bmZpbmlzaGVkIGJ1dAotZW5hYmxlZCBjb2RlIHdoaWNoIGJyZWFrcyBjb21waWxhdGlvbiBvciBjb21waWxlcyBidXQgZG9lcyBub3Qgd29yayBvcgotYnJlYWtzIHRoZSByZWdyZXNzaW9uIHRlc3RzKQotWW91IGNhbiBjb21taXQgdW5maW5pc2hlZCBzdHVmZiAoZm9yIHRlc3RpbmcgZXRjKSwgYnV0IGl0IG11c3QgYmUgZGlzYWJsZWQKLSgjaWZkZWYgZXRjKSBieSBkZWZhdWx0IHNvIGl0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIG90aGVyIGRldmVsb3BlcnMnCi13b3JrLgorQHN1YmhlYWRpbmcgWW91IG11c3Qgbm90IGNvbW1pdCBjb2RlIHdoaWNoIGJyZWFrcyBGRm1wZWchCitUaGlzIG1lYW5zIHVuZmluaXNoZWQgY29kZSB3aGljaCBpcyBlbmFibGVkIGFuZCBicmVha3MgY29tcGlsYXRpb24sCitvciBjb21waWxlcyBidXQgZG9lcyBub3Qgd29yay9icmVha3MgdGhlIHJlZ3Jlc3Npb24gdGVzdHMuIENvZGUgd2hpY2gKK2lzIHVuZmluaXNoZWQgYnV0IGRpc2FibGVkIG1heSBiZSBwZXJtaXR0ZWQgdW5kZXItY2lyY3Vtc3RhbmNlcywgbGlrZQorbWlzc2luZyBzYW1wbGVzIG9yIGFuIGltcGxlbWVudGF0aW9uIHdpdGggYSBzbWFsbCBzdWJzZXQgb2YgZmVhdHVyZXMuCitBbHdheXMgY2hlY2sgdGhlIG1haWxpbmcgbGlzdCBmb3IgYW55IHJldmlld2VycyB3aXRoIGlzc3VlcyBhbmQgdGVzdAorRkFURSBiZWZvcmUgeW91IHB1c2guCiAKLUBpdGVtCitAc3ViaGVhZGluZyBLZWVwIHRoZSBtYWluIGNvbW1pdCBtZXNzYWdlIHNob3J0IHdpdGggYW4gZXh0ZW5kZWQgZGVzY3JpcHRpb24gYmVsb3cuCiBUaGUgY29tbWl0IG1lc3NhZ2Ugc2hvdWxkIGhhdmUgYSBzaG9ydCBmaXJzdCBsaW5lIGluIHRoZSBmb3JtIG9mCiBhIEBzYW1we3RvcGljOiBzaG9ydCBkZXNjcmlwdGlvbn0gYXMgYSBoZWFkZXIsIHNlcGFyYXRlZCBieSBhIG5ld2xpbmUKIGZyb20gdGhlIGJvZHkgY29uc2lzdGluZyBvZiBhbiBleHBsYW5hdGlvbiBvZiB3aHkgdGhlIGNoYW5nZSBpcyBuZWNlc3NhcnkuCkBAIC0yNzYsMzAgKzI3NywyNCBAQAogc2hvdWxkIGluY2x1ZGUgaXRzIGJ1ZyBJRC4gUmVmZXJyaW5nIHRvIHRoZSBpc3N1ZSBvbiB0aGUgYnVnIHRyYWNrZXIgZG9lcwogbm90IGV4ZW1wdCB5b3UgZnJvbSB3cml0aW5nIGFuIGV4Y2VycHQgb2YgdGhlIGJ1ZyBpbiB0aGUgY29tbWl0IG1lc3NhZ2UuCiAKLUBpdGVtCi1Zb3UgZG8gbm90IGhhdmUgdG8gb3Zlci10ZXN0IHRoaW5ncy4gSWYgaXQgd29ya3MgZm9yIHlvdSwgYW5kIHlvdSB0aGluayBpdAotc2hvdWxkIHdvcmsgZm9yIG90aGVycywgdGhlbiBjb21taXQuIElmIHlvdXIgY29kZSBoYXMgcHJvYmxlbXMKLShwb3J0YWJpbGl0eSwgdHJpZ2dlcnMgY29tcGlsZXIgYnVncywgdW51c3VhbCBlbnZpcm9ubWVudCBldGMpIHRoZXkgd2lsbCBiZQotcmVwb3J0ZWQgYW5kIGV2ZW50dWFsbHkgZml4ZWQuCitAc3ViaGVhZGluZyBUZXN0aW5nIG11c3QgYmUgYWRlcXVhdGUgYnV0IG5vdCBleGNlc3NpdmUuCitJZiBpdCB3b3JrcyBmb3IgeW91LCBvdGhlcnMsIGFuZCBwYXNzZXMgRkFURSB0aGVuIGl0IHNob3VsZCBiZSBPSyB0byBjb21taXQKK2l0LCBwcm92aWRlZCBpdCBmaXRzIHRoZSBvdGhlciBjb21taXR0aW5nIGNyaXRlcmlhLiBZb3Ugc2hvdWxkIG5vdCB3b3JyeSBhYm91dAorb3Zlci10ZXN0aW5nIHRoaW5ncy4gSWYgeW91ciBjb2RlIGhhcyBwcm9ibGVtcyAocG9ydGFiaWxpdHksIHRyaWdnZXJzCitjb21waWxlciBidWdzLCB1bnVzdWFsIGVudmlyb25tZW50IGV0YykgdGhleSB3aWxsIGJlIHJlcG9ydGVkIGFuZCBldmVudHVhbGx5CitmaXhlZC4KIAotQGl0ZW0KLURvIG5vdCBjb21taXQgdW5yZWxhdGVkIGNoYW5nZXMgdG9nZXRoZXIsIHNwbGl0IHRoZW0gaW50byBzZWxmLWNvbnRhaW5lZAotcGllY2VzLiBBbHNvIGRvIG5vdCBmb3JnZXQgdGhhdCBpZiBwYXJ0IEIgZGVwZW5kcyBvbiBwYXJ0IEEsIGJ1dCBBIGRvZXMgbm90Ci1kZXBlbmQgb24gQiwgdGhlbiBBIGNhbiBhbmQgc2hvdWxkIGJlIGNvbW1pdHRlZCBmaXJzdCBhbmQgc2VwYXJhdGUgZnJvbSBCLgotS2VlcGluZyBjaGFuZ2VzIHdlbGwgc3BsaXQgaW50byBzZWxmLWNvbnRhaW5lZCBwYXJ0cyBtYWtlcyByZXZpZXdpbmcgYW5kCi11bmRlcnN0YW5kaW5nIHRoZW0gb24gdGhlIGNvbW1pdCBsb2cgbWFpbGluZyBsaXN0IGVhc2llci4gVGhpcyBhbHNvIGhlbHBzCi1pbiBjYXNlIG9mIGRlYnVnZ2luZyBsYXRlciBvbi4KK0BzdWJoZWFkaW5nIERvIG5vdCBjb21taXQgdW5yZWxhdGVkIGNoYW5nZXMgdG9nZXRoZXIuCitUaGV5IHNob3VsZCBiZSBzcGxpdCB0aGVtIGludG8gc2VsZi1jb250YWluZWQgcGllY2VzLiBBbHNvIGRvIG5vdCBmb3JnZXQKK3RoYXQgaWYgcGFydCBCIGRlcGVuZHMgb24gcGFydCBBLCBidXQgQSBkb2VzIG5vdCBkZXBlbmQgb24gQiwgdGhlbiBBIGNhbgorYW5kIHNob3VsZCBiZSBjb21taXR0ZWQgZmlyc3QgYW5kIHNlcGFyYXRlIGZyb20gQi4gS2VlcGluZyBjaGFuZ2VzIHdlbGwKK3NwbGl0IGludG8gc2VsZi1jb250YWluZWQgcGFydHMgbWFrZXMgcmV2aWV3aW5nIGFuZCB1bmRlcnN0YW5kaW5nIHRoZW0gb24KK3RoZSBjb21taXQgbG9nIG1haWxpbmcgbGlzdCBlYXNpZXIuIFRoaXMgYWxzbyBoZWxwcyBpbiBjYXNlIG9mIGRlYnVnZ2luZworbGF0ZXIgb24uCiBBbHNvIGlmIHlvdSBoYXZlIGRvdWJ0cyBhYm91dCBzcGxpdHRpbmcgb3Igbm90IHNwbGl0dGluZywgZG8gbm90IGhlc2l0YXRlIHRvCiBhc2svZGlzY3VzcyBpdCBvbiB0aGUgZGV2ZWxvcGVyIG1haWxpbmcgbGlzdC4KIAotQGl0ZW0KLURvIG5vdCBjaGFuZ2UgYmVoYXZpb3Igb2YgdGhlIHByb2dyYW1zIChyZW5hbWluZyBvcHRpb25zIGV0Yykgb3IgcHVibGljCi1BUEkgb3IgQUJJIHdpdGhvdXQgZmlyc3QgZGlzY3Vzc2luZyBpdCBvbiB0aGUgZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdC4KLURvIG5vdCByZW1vdmUgZnVuY3Rpb25hbGl0eSBmcm9tIHRoZSBjb2RlLiBKdXN0IGltcHJvdmUhCi0KLU5vdGU6IFJlZHVuZGFudCBjb2RlIGNhbiBiZSByZW1vdmVkLgotCi1AaXRlbQorQHN1YmhlYWRpbmcgQXNrIGJlZm9yZSB5b3UgY2hhbmdlIHRoZSBidWlsZCBzeXN0ZW0gKGNvbmZpZ3VyZSwgZXRjKS4KIERvIG5vdCBjb21taXQgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtIChNYWtlZmlsZXMsIGNvbmZpZ3VyZSBzY3JpcHQpCiB3aGljaCBjaGFuZ2UgYmVoYXZpb3IsIGRlZmF1bHRzIGV0Yywgd2l0aG91dCBhc2tpbmcgZmlyc3QuIFRoZSBzYW1lCiBhcHBsaWVzIHRvIGNvbXBpbGVyIHdhcm5pbmcgZml4ZXMsIHRyaXZpYWwgbG9va2luZyBmaXhlcyBhbmQgdG8gY29kZQpAQCAtMzA4LDcgKzMwMyw3IEBACiBsaXN0LCBhbmQgaWYgdGhlIGNvZGUgbWFpbnRhaW5lcnMgc2F5IE9LLCB5b3UgbWF5IGNvbW1pdC4gVGhpcyBkb2VzIG5vdAogYXBwbHkgdG8gZmlsZXMgeW91IHdyb3RlIGFuZC9vciBtYWludGFpbi4KIAotQGl0ZW0KK0BzdWJoZWFkaW5nIENvc21ldGljIGNoYW5nZXMgc2hvdWxkIGJlIGtlcHQgaW4gc2VwYXJhdGUgcGF0Y2hlcy4KIFdlIHJlZnVzZSBzb3VyY2UgaW5kZW50YXRpb24gYW5kIG90aGVyIGNvc21ldGljIGNoYW5nZXMgaWYgdGhleSBhcmUgbWl4ZWQKIHdpdGggZnVuY3Rpb25hbCBjaGFuZ2VzLCBzdWNoIGNvbW1pdHMgd2lsbCBiZSByZWplY3RlZCBhbmQgcmVtb3ZlZC4gRXZlcnkKIGRldmVsb3BlciBoYXMgaGlzIG93biBpbmRlbnRhdGlvbiBzdHlsZSwgeW91IHNob3VsZCBub3QgY2hhbmdlIGl0LiBPZiBjb3Vyc2UKQEAgLTMyMiw3ICszMTcsNyBAQAogdGhlbiBlaXRoZXIgZG8gTk9UIGNoYW5nZSB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGlubmVyIHBhcnQgd2l0aGluIChkbyBub3QKIG1vdmUgaXQgdG8gdGhlIHJpZ2h0KSEgb3IgZG8gc28gaW4gYSBzZXBhcmF0ZSBjb21taXQKIAotQGl0ZW0KK0BzdWJoZWFkaW5nIENvbW1pdCBtZXNzYWdlcyBzaG91bGQgYWx3YXlzIGJlIGZpbGxlZCBvdXQgcHJvcGVybHkuCiBBbHdheXMgZmlsbCBvdXQgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZS4gRGVzY3JpYmUgaW4gYSBmZXcgbGluZXMgd2hhdCB5b3UKIGNoYW5nZWQgYW5kIHdoeS4gWW91IGNhbiByZWZlciB0byBtYWlsaW5nIGxpc3QgcG9zdGluZ3MgaWYgeW91IGZpeCBhCiBwYXJ0aWN1bGFyIGJ1Zy4gQ29tbWVudHMgc3VjaCBhcyAiZml4ZWQhIiBvciAiQ2hhbmdlZCBpdC4iIGFyZSB1bmFjY2VwdGFibGUuCkBAIC0zMzQsNDcgKzMyOSwzMSBAQAogZGV0YWlscyBkZXNjcmliaW5nIHdoYXQgYW5kIHdoeSBhbmQgZ2l2aW5nIHJlZmVyZW5jZXMuCiBAZW5kIGV4YW1wbGUKIAotQGl0ZW0KK0BzdWJoZWFkaW5nIENyZWRpdCB0aGUgYXV0aG9yIG9mIHRoZSBwYXRjaC4KIE1ha2Ugc3VyZSB0aGUgYXV0aG9yIG9mIHRoZSBjb21taXQgaXMgc2V0IGNvcnJlY3RseS4gKHNlZSBnaXQgY29tbWl0IC0tYXV0aG9yKQogSWYgeW91IGFwcGx5IGEgcGF0Y2gsIHNlbmQgYW4KIGFuc3dlciB0byBmZm1wZWctZGV2ZWwgKG9yIHdoZXJldmVyIHlvdSBnb3QgdGhlIHBhdGNoIGZyb20pIHNheWluZyB0aGF0CiB5b3UgYXBwbGllZCB0aGUgcGF0Y2guCiAKLUBpdGVtCitAc3ViaGVhZGluZyBDb21wbGV4IHBhdGNoZXMgc2hvdWxkIHJlZmVyIHRvIGRpc2N1c3Npb24gc3Vycm91bmRpbmcgdGhlbS4KIFdoZW4gYXBwbHlpbmcgcGF0Y2hlcyB0aGF0IGhhdmUgYmVlbiBkaXNjdXNzZWQgKGF0IGxlbmd0aCkgb24gdGhlIG1haWxpbmcKIGxpc3QsIHJlZmVyZW5jZSB0aGUgdGhyZWFkIGluIHRoZSBsb2cgbWVzc2FnZS4KIAotQGl0ZW0KK0BzdWJoZWFkaW5nIEFsd2F5cyB3YWl0IGxvbmcgZW5vdWdoIGJlZm9yZSBwdXNoaW5nIGNoYW5nZXMKIERvIE5PVCBjb21taXQgdG8gY29kZSBhY3RpdmVseSBtYWludGFpbmVkIGJ5IG90aGVycyB3aXRob3V0IHBlcm1pc3Npb24uCi1TZW5kIGEgcGF0Y2ggdG8gZmZtcGVnLWRldmVsIGluc3RlYWQuIElmIG5vIG9uZSBhbnN3ZXJzIHdpdGhpbiBhIHJlYXNvbmFibGUKLXRpbWVmcmFtZSAoMTJoIGZvciBidWlsZCBmYWlsdXJlcyBhbmQgc2VjdXJpdHkgZml4ZXMsIDMgZGF5cyBzbWFsbCBjaGFuZ2VzLAorU2VuZCBhIHBhdGNoIHRvIGZmbXBlZy1kZXZlbC4gSWYgbm8gb25lIGFuc3dlcnMgd2l0aGluIGEgcmVhc29uYWJsZQordGltZS1mcmFtZSAoMTJoIGZvciBidWlsZCBmYWlsdXJlcyBhbmQgc2VjdXJpdHkgZml4ZXMsIDMgZGF5cyBzbWFsbCBjaGFuZ2VzLAogMSB3ZWVrIGZvciBiaWcgcGF0Y2hlcykgdGhlbiBjb21taXQgeW91ciBwYXRjaCBpZiB5b3UgdGhpbmsgaXQgaXMgT0suCiBBbHNvIG5vdGUsIHRoZSBtYWludGFpbmVyIGNhbiBzaW1wbHkgYXNrIGZvciBtb3JlIHRpbWUgdG8gcmV2aWV3IQogCi1AaXRlbQotU3Vic2NyaWJlIHRvIHRoZSBmZm1wZWctY3ZzbG9nIG1haWxpbmcgbGlzdC4gVGhlIGRpZmZzIG9mIGFsbCBjb21taXRzCi1hcmUgc2VudCB0aGVyZSBhbmQgcmV2aWV3ZWQgYnkgYWxsIHRoZSBvdGhlciBkZXZlbG9wZXJzLiBCdWdzIGFuZCBwb3NzaWJsZQotaW1wcm92ZW1lbnRzIG9yIGdlbmVyYWwgcXVlc3Rpb25zIHJlZ2FyZGluZyBjb21taXRzIGFyZSBkaXNjdXNzZWQgdGhlcmUuIFdlCi1leHBlY3QgeW91IHRvIHJlYWN0IGlmIHByb2JsZW1zIHdpdGggeW91ciBjb2RlIGFyZSB1bmNvdmVyZWQuCitAc2VjdGlvbiBDb2RlCitAc3ViaGVhZGluZyBBUEkvQUJJIGNoYW5nZXMgc2hvdWxkIGJlIGRpc2N1c3NlZCBiZWZvcmUgdGhleSBhcmUgbWFkZS4KK0RvIG5vdCBjaGFuZ2UgYmVoYXZpb3Igb2YgdGhlIHByb2dyYW1zIChyZW5hbWluZyBvcHRpb25zIGV0Yykgb3IgcHVibGljCitBUEkgb3IgQUJJIHdpdGhvdXQgZmlyc3QgZGlzY3Vzc2luZyBpdCBvbiB0aGUgZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdC4KK0RvIG5vdCByZW1vdmUgd2lkZWx5IHVzZWQgZnVuY3Rpb25hbGl0eSBvciBmZWF0dXJlcyAocmVkdW5kYW50IGNvZGUgY2FuIGJlIHJlbW92ZWQpLgogCi1AaXRlbQotVXBkYXRlIHRoZSBkb2N1bWVudGF0aW9uIGlmIHlvdSBjaGFuZ2UgYmVoYXZpb3Igb3IgYWRkIGZlYXR1cmVzLiBJZiB5b3UgYXJlCi11bnN1cmUgaG93IGJlc3QgdG8gZG8gdGhpcywgc2VuZCBhIHBhdGNoIHRvIGZmbXBlZy1kZXZlbCwgdGhlIGRvY3VtZW50YXRpb24KLW1haW50YWluZXIocykgd2lsbCByZXZpZXcgYW5kIGNvbW1pdCB5b3VyIHN0dWZmLgotCi1AaXRlbQotVHJ5IHRvIGtlZXAgaW1wb3J0YW50IGRpc2N1c3Npb25zIGFuZCByZXF1ZXN0cyAoYWxzbykgb24gdGhlIHB1YmxpYwotZGV2ZWxvcGVyIG1haWxpbmcgbGlzdCwgc28gdGhhdCBhbGwgZGV2ZWxvcGVycyBjYW4gYmVuZWZpdCBmcm9tIHRoZW0uCi0KLUBpdGVtCi1OZXZlciB3cml0ZSB0byB1bmFsbG9jYXRlZCBtZW1vcnksIG5ldmVyIHdyaXRlIG92ZXIgdGhlIGVuZCBvZiBhcnJheXMsCi1hbHdheXMgY2hlY2sgdmFsdWVzIHJlYWQgZnJvbSBzb21lIHVudHJ1c3RlZCBzb3VyY2UgYmVmb3JlIHVzaW5nIHRoZW0KLWFzIGFycmF5IGluZGV4IG9yIG90aGVyIHJpc2t5IHRoaW5ncy4KLQotQGl0ZW0KLVJlbWVtYmVyIHRvIGNoZWNrIGlmIHlvdSBuZWVkIHRvIGJ1bXAgdmVyc2lvbnMgZm9yIHRoZSBzcGVjaWZpYyBsaWJhdioKLXBhcnRzIChsaWJhdnV0aWwsIGxpYmF2Y29kZWMsIGxpYmF2Zm9ybWF0KSB5b3UgYXJlIGNoYW5naW5nLiBZb3UgbmVlZAotdG8gY2hhbmdlIHRoZSB2ZXJzaW9uIGludGVnZXIuCitAc3ViaGVhZGluZyBSZW1lbWJlciB0byBjaGVjayBpZiB5b3UgbmVlZCB0byBidW1wIHZlcnNpb25zIGZvciBsaWJhdiouCitEZXBlbmRpbmcgb24gdGhlIGNoYW5nZSwgeW91IG1heSBuZWVkIHRvIGNoYW5nZSB0aGUgdmVyc2lvbiBpbnRlZ2VyLgogSW5jcmVtZW50aW5nIHRoZSBmaXJzdCBjb21wb25lbnQgbWVhbnMgbm8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0bwogcHJldmlvdXMgdmVyc2lvbnMgKGUuZy4gcmVtb3ZhbCBvZiBhIGZ1bmN0aW9uIGZyb20gdGhlIHB1YmxpYyBBUEkpLgogSW5jcmVtZW50aW5nIHRoZSBzZWNvbmQgY29tcG9uZW50IG1lYW5zIGJhY2t3YXJkIGNvbXBhdGlibGUgY2hhbmdlCkBAIC0zODQsNyArMzYzLDcgQEAKIGNoYW5nZSAoZS5nLiBlbmNvZGVyIGJ1ZyBmaXggdGhhdCBtYXR0ZXJzIGZvciB0aGUgZGVjb2RlcikuIFRoZSB0aGlyZAogY29tcG9uZW50IGFsd2F5cyBzdGFydHMgYXQgMTAwIHRvIGRpc3Rpbmd1aXNoIEZGbXBlZyBmcm9tIExpYmF2LgogCi1AaXRlbQorQHN1YmhlYWRpbmcgV2FybmluZ3MgZm9yIGNvcnJlY3QgY29kZSBtYXkgYmUgZGlzYWJsZWQgaWYgdGhlcmUgaXMgbm8gb3RoZXIgb3B0aW9uLgogQ29tcGlsZXIgd2FybmluZ3MgaW5kaWNhdGUgcG90ZW50aWFsIGJ1Z3Mgb3IgY29kZSB3aXRoIGJhZCBzdHlsZS4gSWYgYSB0eXBlIG9mCiB3YXJuaW5nIGFsd2F5cyBwb2ludHMgdG8gY29ycmVjdCBhbmQgY2xlYW4gY29kZSwgdGhhdCB3YXJuaW5nIHNob3VsZAogYmUgZGlzYWJsZWQsIG5vdCB0aGUgY29kZSBjaGFuZ2VkLgpAQCAtMzkzLDE4ICszNzIsODQgQEAKIGJlIGNoYW5nZWQgdG8gbm90IGdlbmVyYXRlIGEgd2FybmluZyB1bmxlc3MgdGhhdCBjYXVzZXMgYSBzbG93ZG93bgogb3Igb2JmdXNjYXRlcyB0aGUgY29kZS4KIAotQGl0ZW0KK0BzdWJoZWFkaW5nIENoZWNrIHVudHJ1c3RlZCBpbnB1dCBwcm9wZXJseS4KK05ldmVyIHdyaXRlIHRvIHVuYWxsb2NhdGVkIG1lbW9yeSwgbmV2ZXIgd3JpdGUgb3ZlciB0aGUgZW5kIG9mIGFycmF5cywKK2Fsd2F5cyBjaGVjayB2YWx1ZXMgcmVhZCBmcm9tIHNvbWUgdW50cnVzdGVkIHNvdXJjZSBiZWZvcmUgdXNpbmcgdGhlbQorYXMgYXJyYXkgaW5kZXggb3Igb3RoZXIgcmlza3kgdGhpbmdzLgorCitAc2VjdGlvbiBEb2N1bWVudGF0aW9uL090aGVyCitAc3ViaGVhZGluZyBTdWJzY3JpYmUgdG8gdGhlIGZmbXBlZy1kZXZlbCBtYWlsaW5nIGxpc3QuCitJdCBpcyBpbXBvcnRhbnQgdG8gYmUgc3Vic2NyaWJlZCB0byB0aGUKK0B1cmVme2h0dHBzOi8vbGlzdHMuZmZtcGVnLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZmbXBlZy1kZXZlbCwgZmZtcGVnLWRldmVsfQorbWFpbGluZyBsaXN0LiBBbG1vc3QgYW55IG5vbi10cml2aWFsIHBhdGNoIGlzIHRvIGJlIHNlbnQgdGhlcmUgZm9yIHJldmlldy4KK090aGVyIGRldmVsb3BlcnMgbWF5IGhhdmUgY29tbWVudHMgYWJvdXQgeW91ciBjb250cmlidXRpb24uIFdlIGV4cGVjdCB5b3Ugc2VlCit0aG9zZSBjb21tZW50cywgYW5kIHRvIGltcHJvdmUgaXQgaWYgcmVxdWVzdGVkLiAoTi5CLiBFeHBlcmllbmNlZCBjb21taXR0ZXJzCitoYXZlIG90aGVyIGNoYW5uZWxzLCBhbmQgbWF5IHNvbWV0aW1lcyBza2lwIHJldmlldyBmb3IgdHJpdmlhbCBmaXhlcy4pIEFsc28sCitkaXNjdXNzaW9uIGhlcmUgYWJvdXQgYnVnIGZpeGVzIGFuZCBGRm1wZWcgaW1wcm92ZW1lbnRzIGJ5IG90aGVyIGRldmVsb3BlcnMgbWF5CitiZSBoZWxwZnVsIGluZm9ybWF0aW9uIGZvciB5b3UuIEZpbmFsbHksIGJ5IGJlaW5nIGEgbGlzdCBzdWJzY3JpYmVyLCB5b3VyCitjb250cmlidXRpb24gd2lsbCBiZSBwb3N0ZWQgaW1tZWRpYXRlbHkgdG8gdGhlIGxpc3QsIHdpdGhvdXQgdGhlIG1vZGVyYXRpb24KK2hvbGQgd2hpY2ggbWVzc2FnZXMgZnJvbSBub24tc3Vic2NyaWJlcnMgZXhwZXJpZW5jZS4KKworSG93ZXZlciwgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8gdGhlIHByb2plY3QgdGhhdCB3ZSByZWNlaXZlIHlvdXIgcGF0Y2ggdGhhbgordGhhdCB5b3UgYmUgc3Vic2NyaWJlZCB0byB0aGUgZmZtcGVnLWRldmVsIGxpc3QuIElmIHlvdSBoYXZlIGEgcGF0Y2gsIGFuZCBkb24ndAord2FudCB0byBzdWJzY3JpYmUgYW5kIGRpc2N1c3MgdGhlIHBhdGNoLCB0aGVuIHBsZWFzZSBkbyBzZW5kIGl0IHRvIHRoZSBsaXN0Cithbnl3YXkuCisKK0BzdWJoZWFkaW5nIFN1YnNjcmliZSB0byB0aGUgZmZtcGVnLWN2c2xvZyBtYWlsaW5nIGxpc3QuCitEaWZmcyBvZiBhbGwgY29tbWl0cyBhcmUgc2VudCB0byB0aGUKK0B1cmVme2h0dHBzOi8vbGlzdHMuZmZtcGVnLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZmbXBlZy1jdnNsb2csIGZmbXBlZy1jdnNsb2d9CittYWlsaW5nIGxpc3QuIFNvbWUgZGV2ZWxvcGVycyByZWFkIHRoaXMgbGlzdCB0byByZXZpZXcgYWxsIGNvZGUgYmFzZSBjaGFuZ2VzCitmcm9tIGFsbCBzb3VyY2VzLiBTdWJzY3JpYmluZyB0byB0aGlzIGxpc3QgaXMgbm90IG1hbmRhdG9yeS4KKworQHN1YmhlYWRpbmcgS2VlcCB0aGUgZG9jdW1lbnRhdGlvbiB1cCB0byBkYXRlLgorVXBkYXRlIHRoZSBkb2N1bWVudGF0aW9uIGlmIHlvdSBjaGFuZ2UgYmVoYXZpb3Igb3IgYWRkIGZlYXR1cmVzLiBJZiB5b3UgYXJlCit1bnN1cmUgaG93IGJlc3QgdG8gZG8gdGhpcywgc2VuZCBhIHBhdGNoIHRvIGZmbXBlZy1kZXZlbCwgdGhlIGRvY3VtZW50YXRpb24KK21haW50YWluZXIocykgd2lsbCByZXZpZXcgYW5kIGNvbW1pdCB5b3VyIHN0dWZmLgorCitAc3ViaGVhZGluZyBJbXBvcnRhbnQgZGlzY3Vzc2lvbnMgc2hvdWxkIGJlIGFjY2Vzc2libGUgdG8gYWxsLgorVHJ5IHRvIGtlZXAgaW1wb3J0YW50IGRpc2N1c3Npb25zIGFuZCByZXF1ZXN0cyAoYWxzbykgb24gdGhlIHB1YmxpYworZGV2ZWxvcGVyIG1haWxpbmcgbGlzdCwgc28gdGhhdCBhbGwgZGV2ZWxvcGVycyBjYW4gYmVuZWZpdCBmcm9tIHRoZW0uCisKK0BzdWJoZWFkaW5nIENoZWNrIHlvdXIgZW50cmllcyBpbiBNQUlOVEFJTkVSUy4KIE1ha2Ugc3VyZSB0aGF0IG5vIHBhcnRzIG9mIHRoZSBjb2RlYmFzZSB0aGF0IHlvdSBtYWludGFpbiBhcmUgbWlzc2luZyBmcm9tIHRoZQogQGZpbGV7TUFJTlRBSU5FUlN9IGZpbGUuIElmIHNvbWV0aGluZyB0aGF0IHlvdSB3YW50IHRvIG1haW50YWluIGlzIG1pc3NpbmcgYWRkIGl0IHdpdGgKIHlvdXIgbmFtZSBhZnRlciBpdC4KIElmIGF0IHNvbWUgcG9pbnQgeW91IG5vIGxvbmdlciB3YW50IHRvIG1haW50YWluIHNvbWUgY29kZSwgdGhlbiBwbGVhc2UgaGVscCBpbgogZmluZGluZyBhIG5ldyBtYWludGFpbmVyIGFuZCBhbHNvIGRvbid0IGZvcmdldCB0byB1cGRhdGUgdGhlIEBmaWxle01BSU5UQUlORVJTfSBmaWxlLgotQGVuZCBlbnVtZXJhdGUKIAogV2UgdGhpbmsgb3VyIHJ1bGVzIGFyZSBub3QgdG9vIGhhcmQuIElmIHlvdSBoYXZlIGNvbW1lbnRzLCBjb250YWN0IHVzLgogCitAY2hhcHRlciBDb2RlIG9mIGNvbmR1Y3QKKworQmUgZnJpZW5kbHkgYW5kIHJlc3BlY3RmdWwgdG93YXJkcyBvdGhlcnMgYW5kIHRoaXJkIHBhcnRpZXMuCitUcmVhdCBvdGhlcnMgdGhlIHdheSB5b3UgeW91cnNlbGYgd2FudCB0byBiZSB0cmVhdGVkLgorCitCZSBjb25zaWRlcmF0ZS4gTm90IGV2ZXJ5b25lIHNoYXJlcyB0aGUgc2FtZSB2aWV3cG9pbnQgYW5kIHByaW9yaXRpZXMgYXMgeW91IGRvLgorRGlmZmVyZW50IG9waW5pb25zIGFuZCBpbnRlcnByZXRhdGlvbnMgaGVscCB0aGUgcHJvamVjdC4KK0xvb2tpbmcgYXQgaXNzdWVzIGZyb20gYSBkaWZmZXJlbnQgcGVyc3BlY3RpdmUgYXNzaXN0cyBkZXZlbG9wbWVudC4KKworRG8gbm90IGFzc3VtZSBtYWxpY2UgZm9yIHRoaW5ncyB0aGF0IGNhbiBiZSBhdHRyaWJ1dGVkIHRvIGluY29tcGV0ZW5jZS4gRXZlbiBpZgoraXQgaXMgbWFsaWNlLCBpdCdzIHJhcmVseSBnb29kIHRvIHN0YXJ0IHdpdGggdGhhdCBhcyBpbml0aWFsIGFzc3VtcHRpb24uCisKK1N0YXkgZnJpZW5kbHkgZXZlbiBpZiBzb21lb25lIGFjdHMgY29udHJhcmlseS4gRXZlcnlvbmUgaGFzIGEgYmFkIGRheQorb25jZSBpbiBhIHdoaWxlLgorSWYgeW91IHlvdXJzZWxmIGhhdmUgYSBiYWQgZGF5IG9yIGFyZSBhbmdyeSB0aGVuIHRyeSB0byB0YWtlIGEgYnJlYWsgYW5kIHJlcGx5CitvbmNlIHlvdSBhcmUgY2FsbSBhbmQgd2l0aG91dCBhbmdlciBpZiB5b3UgaGF2ZSB0by4KKworVHJ5IHRvIGhlbHAgb3RoZXIgdGVhbSBtZW1iZXJzIGFuZCBjb29wZXJhdGUgaWYgeW91IGNhbi4KKworVGhlIGdvYWwgb2Ygc29mdHdhcmUgZGV2ZWxvcG1lbnQgaXMgdG8gY3JlYXRlIHRlY2huaWNhbCBleGNlbGxlbmNlLCBub3QgZm9yIGFueQoraW5kaXZpZHVhbCB0byBiZSBiZXR0ZXIgYW5kICJ3aW4iIGFnYWluc3QgdGhlIG90aGVycy4gTGFyZ2Ugc29mdHdhcmUgcHJvamVjdHMKK2FyZSBvbmx5IHBvc3NpYmxlIGFuZCBzdWNjZXNzZnVsIHRocm91Z2ggdGVhbXdvcmsuCisKK0lmIHNvbWVvbmUgc3RydWdnbGVzIGRvIG5vdCBwdXQgdGhlbSBkb3duLiBHaXZlIHRoZW0gYSBoZWxwaW5nIGhhbmQKK2luc3RlYWQgYW5kIHBvaW50IHRoZW0gaW4gdGhlIHJpZ2h0IGRpcmVjdGlvbi4KKworRmluYWxseSwga2VlcCBpbiBtaW5kIHRoZSBpbW1vcnRhbCB3b3JkcyBvZiBCaWxsIGFuZCBUZWQsCisiQmUgZXhjZWxsZW50IHRvIGVhY2ggb3RoZXIuIgorCiBAYW5jaG9ye1N1Ym1pdHRpbmcgcGF0Y2hlc30KLUBzZWN0aW9uIFN1Ym1pdHRpbmcgcGF0Y2hlcworQGNoYXB0ZXIgU3VibWl0dGluZyBwYXRjaGVzCiAKIEZpcnN0LCByZWFkIHRoZSBAcmVme0NvZGluZyBSdWxlc30gYWJvdmUgaWYgeW91IGRpZCBub3QgeWV0LCBpbiBwYXJ0aWN1bGFyCiB0aGUgcnVsZXMgcmVnYXJkaW5nIHBhdGNoIHN1Ym1pc3Npb24uCkBAIC00MzcsNyArNDgyLDExIEBACiBtYWlsaW5nIGxpc3QuIFVzZSBAY29kZXtnaXQgc2VuZC1lbWFpbH0gd2hlbiBwb3NzaWJsZSBzaW5jZSBpdCB3aWxsIHByb3Blcmx5CiBzZW5kIHBhdGNoZXMgd2l0aG91dCByZXF1aXJpbmcgZXh0cmEgY2FyZS4gSWYgeW91IGNhbm5vdCwgdGhlbiBzZW5kIHBhdGNoZXMKIGFzIGJhc2U2NC1lbmNvZGVkIGF0dGFjaG1lbnRzLCBzbyB5b3VyIHBhdGNoIGlzIG5vdCB0cmFzaGVkIGR1cmluZwotdHJhbnNtaXNzaW9uLgordHJhbnNtaXNzaW9uLiBBbHNvIGVuc3VyZSB0aGUgY29ycmVjdCBtaW1lIHR5cGUgaXMgdXNlZAorKHRleHQveC1kaWZmIG9yIHRleHQveC1wYXRjaCBvciBhdCBsZWFzdCB0ZXh0L3BsYWluKSBhbmQgdGhhdCBvbmx5IG9uZQorcGF0Y2ggaXMgaW5saW5lIG9yIGF0dGFjaGVkIHBlciBtYWlsLgorWW91IGNhbiBjaGVjayBAdXJse2h0dHBzOi8vcGF0Y2h3b3JrLmZmbXBlZy5vcmd9LCBpZiB5b3VyIHBhdGNoIGRvZXMgbm90IHNob3cgdXAsIGl0cyBtaW1lIHR5cGUKK2xpa2VseSB3YXMgd3JvbmcuCiAKIFlvdXIgcGF0Y2ggd2lsbCBiZSByZXZpZXdlZCBvbiB0aGUgbWFpbGluZyBsaXN0LiBZb3Ugd2lsbCBsaWtlbHkgYmUgYXNrZWQKIHRvIG1ha2Ugc29tZSBjaGFuZ2VzIGFuZCBhcmUgZXhwZWN0ZWQgdG8gc2VuZCBpbiBhbiBpbXByb3ZlZCB2ZXJzaW9uIHRoYXQKQEAgLTQ0OSw3ICs0OTgsNyBAQAogc2VuZCBhIHJlbWluZGVyIGJ5IGVtYWlsLiBZb3VyIHBhdGNoIHNob3VsZCBldmVudHVhbGx5IGJlIGRlYWx0IHdpdGguCiAKIAotQHNlY3Rpb24gTmV3IGNvZGVjcyBvciBmb3JtYXRzIGNoZWNrbGlzdAorQGNoYXB0ZXIgTmV3IGNvZGVjcyBvciBmb3JtYXRzIGNoZWNrbGlzdAogCiBAZW51bWVyYXRlCiBAaXRlbQpAQCAtNTAxLDcgKzU1MCw3IEBACiBAZW5kIGVudW1lcmF0ZQogCiAKLUBzZWN0aW9uIHBhdGNoIHN1Ym1pc3Npb24gY2hlY2tsaXN0CitAY2hhcHRlciBQYXRjaCBzdWJtaXNzaW9uIGNoZWNrbGlzdAogCiBAZW51bWVyYXRlCiBAaXRlbQpAQCAtNTExLDkgKzU2MCw5IEBACiBXYXMgdGhlIHBhdGNoIGdlbmVyYXRlZCB3aXRoIGdpdCBmb3JtYXQtcGF0Y2ggb3Igc2VuZC1lbWFpbD8KIAogQGl0ZW0KLURpZCB5b3Ugc2lnbiBvZmYgeW91ciBwYXRjaD8gKGdpdCBjb21taXQgLXMpCi1TZWUgQHVybHtodHRwOi8vZ2l0Lmtlcm5lbC5vcmcvP3A9bGludXgva2VybmVsL2dpdC90b3J2YWxkcy9saW51eC5naXQ7YT1ibG9iX3BsYWluO2Y9RG9jdW1lbnRhdGlvbi9TdWJtaXR0aW5nUGF0Y2hlc30gZm9yIHRoZSBtZWFuaW5nCi1vZiBzaWduIG9mZi4KK0RpZCB5b3Ugc2lnbi1vZmYgeW91ciBwYXRjaD8gKEBjb2Rle2dpdCBjb21taXQgLXN9KQorU2VlIEB1cmVme2h0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RvcnZhbGRzL2xpbnV4LmdpdC9wbGFpbi9Eb2N1bWVudGF0aW9uL3Byb2Nlc3Mvc3VibWl0dGluZy1wYXRjaGVzLnJzdCwgU2lnbiB5b3VyIHdvcmt9IGZvciB0aGUgbWVhbmluZworb2YgQGRmbntzaWduLW9mZn0uCiAKIEBpdGVtCiBEaWQgeW91IHByb3ZpZGUgYSBjbGVhciBnaXQgY29tbWl0IGxvZyBtZXNzYWdlPwpAQCAtNjE0LDcgKzY2Myw3IEBACiBvZiBsZWFrcywgb3V0IG9mIGFycmF5IGFjY2Vzc2VzLCBldGMuCiBAZW5kIGVudW1lcmF0ZQogCi1Ac2VjdGlvbiBQYXRjaCByZXZpZXcgcHJvY2VzcworQGNoYXB0ZXIgUGF0Y2ggcmV2aWV3IHByb2Nlc3MKIAogQWxsIHBhdGNoZXMgcG9zdGVkIHRvIGZmbXBlZy1kZXZlbCB3aWxsIGJlIHJldmlld2VkLCB1bmxlc3MgdGhleSBjb250YWluIGEKIGNsZWFyIG5vdGUgdGhhdCB0aGUgcGF0Y2ggaXMgbm90IGZvciB0aGUgZ2l0IG1hc3RlciBicmFuY2guCkBAIC02NDUsNyArNjk0LDcgQEAKIHdheSB0byBnZXQgZXZlcnlvbmUncyBwYXRjaGVzIHJldmlld2VkIHNvb25lci4KIAogQGFuY2hvcntSZWdyZXNzaW9uIHRlc3RzfQotQHNlY3Rpb24gUmVncmVzc2lvbiB0ZXN0cworQGNoYXB0ZXIgUmVncmVzc2lvbiB0ZXN0cwogCiBCZWZvcmUgc3VibWl0dGluZyBhIHBhdGNoIChvciBjb21taXR0aW5nIHRvIHRoZSByZXBvc2l0b3J5KSwgeW91IHNob3VsZCBhdCBsZWFzdAogdGVzdCB0aGF0IHlvdSBkaWQgbm90IGJyZWFrIGFueXRoaW5nLgpAQCAtNjU2LDcgKzcwNSw3IEBACiB0aGlzIGNhc2UsIHRoZSByZWZlcmVuY2UgcmVzdWx0cyBvZiB0aGUgcmVncmVzc2lvbiB0ZXN0cyBzaGFsbCBiZSBtb2RpZmllZAogYWNjb3JkaW5nbHldLgogCi1Ac3Vic2VjdGlvbiBBZGRpbmcgZmlsZXMgdG8gdGhlIGZhdGUtc3VpdGUgZGF0YXNldAorQHNlY3Rpb24gQWRkaW5nIGZpbGVzIHRvIHRoZSBmYXRlLXN1aXRlIGRhdGFzZXQKIAogV2hlbiB0aGVyZSBpcyBubyBtdXhlciBvciBlbmNvZGVyIGF2YWlsYWJsZSB0byBnZW5lcmF0ZSB0ZXN0IG1lZGlhIGZvciBhCiBzcGVjaWZpYyB0ZXN0IHRoZW4gdGhlIG1lZGlhIGhhcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZmF0ZS1zdWl0ZS4KQEAgLTY2Nyw3ICs3MTYsNyBAQAogbWVzc2FnZSBvciBpbnRyb2R1Y3RvcnkgbWVzc2FnZSBmb3IgdGhlIHBhdGNoIHNlcmllcyB0aGF0IHlvdSBwb3N0IHRvCiB0aGUgZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdCwgYSBkaXJlY3QgbGluayB0byBkb3dubG9hZCB0aGUgc2FtcGxlIG1lZGlhLgogCi1Ac3Vic2VjdGlvbiBWaXN1YWxpemluZyBUZXN0IENvdmVyYWdlCitAc2VjdGlvbiBWaXN1YWxpemluZyBUZXN0IENvdmVyYWdlCiAKIFRoZSBGRm1wZWcgYnVpbGQgc3lzdGVtIGFsbG93cyB2aXN1YWxpemluZyB0aGUgdGVzdCBjb3ZlcmFnZSBpbiBhbiBlYXN5CiBtYW5uZXIgd2l0aCB0aGUgY292ZXJhZ2UgdG9vbHMgQGNvZGV7Z2Nvdn0vQGNvZGV7bGNvdn0uICBUaGlzIGludm9sdmVzCkBAIC02OTQsNyArNzQzLDcgQEAKIG1lYXN1cmVtZW50cy4gWW91IHdpbGwgbmVlZCB0byByZXJ1biBAY29kZXttYWtlIGxjb3Z9IGFmdGVyIHJ1bm5pbmcgYQogbmV3IHRlc3QuCiAKLUBzdWJzZWN0aW9uIFVzaW5nIFZhbGdyaW5kCitAc2VjdGlvbiBVc2luZyBWYWxncmluZAogCiBUaGUgY29uZmlndXJlIHNjcmlwdCBwcm92aWRlcyBhIHNob3J0Y3V0IGZvciB1c2luZyB2YWxncmluZCB0byBzcG90IGJ1Z3MKIHJlbGF0ZWQgdG8gbWVtb3J5IGhhbmRsaW5nLiBKdXN0IGFkZCB0aGUgb3B0aW9uCkBAIC03MDgsNyArNzU3LDcgQEAKIHlvdXIgY29uZmlndXJlIGxpbmUgaW5zdGVhZC4KIAogQGFuY2hvcntSZWxlYXNlIHByb2Nlc3N9Ci1Ac2VjdGlvbiBSZWxlYXNlIHByb2Nlc3MKK0BjaGFwdGVyIFJlbGVhc2UgcHJvY2VzcwogCiBGRm1wZWcgbWFpbnRhaW5zIGEgc2V0IG9mIEBzdHJvbmd7cmVsZWFzZSBicmFuY2hlc30sIHdoaWNoIGFyZSB0aGUKIHJlY29tbWVuZGVkIGRlbGl2ZXJhYmxlIGZvciBzeXN0ZW0gaW50ZWdyYXRvcnMgYW5kIGRpc3RyaWJ1dG9ycyAoc3VjaCBhcwpAQCAtNzQwLDcgKzc4OSw3IEBACiBvbiB0aGUgQHN0cm9uZ3tmZm1wZWctZGV2ZWx9IG1haWxpbmcgbGlzdCBpbiB0aW1lIHRvIGFsbG93IGZvcndhcmQgcGxhbm5pbmcuCiAKIEBhbmNob3J7Q3JpdGVyaWEgZm9yIFBvaW50IFJlbGVhc2VzfQotQHN1YnNlY3Rpb24gQ3JpdGVyaWEgZm9yIFBvaW50IFJlbGVhc2VzCitAc2VjdGlvbiBDcml0ZXJpYSBmb3IgUG9pbnQgUmVsZWFzZXMKIAogQ2hhbmdlcyB0aGF0IG1hdGNoIHRoZSBmb2xsb3dpbmcgY3JpdGVyaWEgYXJlIHZhbGlkIGNhbmRpZGF0ZXMgZm9yCiBpbmNsdXNpb24gaW50byBhIHBvaW50IHJlbGVhc2U6CkBAIC03NjQsNyArODEzLDcgQEAKIFRoZSBvcmRlciBmb3IgY2hlY2tpbmcgdGhlIHJ1bGVzIGlzICgxIE9SIDIgT1IgMykgQU5EIDQuCiAKIAotQHN1YnNlY3Rpb24gUmVsZWFzZSBDaGVja2xpc3QKK0BzZWN0aW9uIFJlbGVhc2UgQ2hlY2tsaXN0CiAKIFRoZSByZWxlYXNlIHByb2Nlc3MgaW52b2x2ZXMgdGhlIGZvbGxvd2luZyBzdGVwczoKIApkaWZmIC0tZ2l0IGEvZG9jL2VuY29kZXJzLnRleGkgYi9kb2MvZW5jb2RlcnMudGV4aQppbmRleCBmMzhjYWQzLi43YjA5NTc1IDEwMDY0NAotLS0gYS9kb2MvZW5jb2RlcnMudGV4aQorKysgYi9kb2MvZW5jb2RlcnMudGV4aQpAQCAtNjEsOSArNjEsOSBAQAogCiBUaGlzIG1ldGhvZCBmaXJzdCBzZXRzIHF1YW50aXplcnMgZGVwZW5kaW5nIG9uIGJhbmQgdGhyZXNob2xkcyBhbmQgdGhlbiB0cmllcwogdG8gZmluZCBhbiBvcHRpbWFsIGNvbWJpbmF0aW9uIGJ5IGFkZGluZyBvciBzdWJ0cmFjdGluZyBhIHNwZWNpZmljIHZhbHVlIGZyb20KLWFsbCBxdWFudGl6ZXJzIGFuZCBhZGp1c3Rpbmcgc29tZSBpbmRpdmlkdWFsIHF1YW50aXplciBhIGxpdHRsZS4KLVdpbGwgdHVuZSBpdHNlbGYgYmFzZWQgb24gd2hldGhlciBhYWNfaXMvYWFjX21zL2FhY19wbnMgYXJlIGVuYWJsZWQuCi1UaGlzIGlzIHRoZSBkZWZhdWx0IGNob2ljZSBmb3IgYSBjb2Rlci4KK2FsbCBxdWFudGl6ZXJzIGFuZCBhZGp1c3Rpbmcgc29tZSBpbmRpdmlkdWFsIHF1YW50aXplciBhIGxpdHRsZS4gIFdpbGwgdHVuZQoraXRzZWxmIGJhc2VkIG9uIHdoZXRoZXIgQG9wdGlvbnthYWNfaXN9LCBAb3B0aW9ue2FhY19tc30gYW5kIEBvcHRpb257YWFjX3Buc30KK2FyZSBlbmFibGVkLgogCiBAaXRlbSBhbm1yCiBBdmVyYWdlIG5vaXNlIHRvIG1hc2sgcmF0aW8gKEFOTVIpIHRyZWxsaXMtYmFzZWQgc29sdXRpb24uCkBAIC03NiwyNyArNzYsMjcgQEAKIEBpdGVtIGZhc3QKIENvbnN0YW50IHF1YW50aXplciBtZXRob2QuCiAKLVRoaXMgbWV0aG9kIHNldHMgYSBjb25zdGFudCBxdWFudGl6ZXIgZm9yIGFsbCBiYW5kcy4gVGhpcyBpcyB0aGUgZmFzdGVzdCBvZiBhbGwKLXRoZSBtZXRob2RzIGFuZCBoYXMgbm8gcmF0ZSBjb250cm9sIG9yIHN1cHBvcnQgZm9yIEBvcHRpb257YWFjX2lzfSBvcgotQG9wdGlvbnthYWNfcG5zfS4KLU5vdCByZWNvbW1lbmRlZC4KK1VzZXMgYSBjaGVhcGVyIHZlcnNpb24gb2YgdHdvbG9vcCBhbGdvcml0aG0gdGhhdCBkb2Vzbid0IHRyeSB0byBkbyBhcyBtYW55CitjbGV2ZXIgYWRqdXN0bWVudHMuIFdvcnNlIHdpdGggbG93IGJpdHJhdGVzIChsZXNzIHRoYW4gNjRrYnBzKSwgYnV0IGlzIGJldHRlcgorYW5kIG11Y2ggZmFzdGVyIGF0IGhpZ2hlciBiaXRyYXRlcy4KK1RoaXMgaXMgdGhlIGRlZmF1bHQgY2hvaWNlIGZvciBhIGNvZGVyCiAKIEBlbmQgdGFibGUKIAogQGl0ZW0gYWFjX21zCi1TZXRzIG1pZC9zaWRlIGNvZGluZyBtb2RlLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBhdXRvIHdpbGwgYXV0b21hdGljYWxseSB1c2UKK1NldHMgbWlkL3NpZGUgY29kaW5nIG1vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJhdXRvIiB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlCiBNL1Mgd2l0aCBiYW5kcyB3aGljaCB3aWxsIGJlbmVmaXQgZnJvbSBzdWNoIGNvZGluZy4gQ2FuIGJlIGZvcmNlZCBmb3IgYWxsIGJhbmRzCiB1c2luZyB0aGUgdmFsdWUgImVuYWJsZSIsIHdoaWNoIGlzIG1haW5seSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvciBkaXNhYmxlZCB1c2luZwogImRpc2FibGUiLgogCiBAaXRlbSBhYWNfaXMKIFNldHMgaW50ZW5zaXR5IHN0ZXJlbyBjb2RpbmcgdG9vbCB1c2FnZS4gQnkgZGVmYXVsdCwgaXQncyBlbmFibGVkIGFuZCB3aWxsCi1hdXRvbWF0aWNhbGx5IHRvZ2dsZSBJUyBmb3Igc2ltaWxhciBwYWlycyBvZiBzdGVyZW8gYmFuZHMgaWYgaXQncyBiZW5lZml0aWFsLgorYXV0b21hdGljYWxseSB0b2dnbGUgSVMgZm9yIHNpbWlsYXIgcGFpcnMgb2Ygc3RlcmVvIGJhbmRzIGlmIGl0J3MgYmVuZWZpY2lhbC4KIENhbiBiZSBkaXNhYmxlZCBmb3IgZGVidWdnaW5nIGJ5IHNldHRpbmcgdGhlIHZhbHVlIHRvICJkaXNhYmxlIi4KIAogQGl0ZW0gYWFjX3BucwogVXNlcyBwZXJjZXB0dWFsIG5vaXNlIHN1YnN0aXR1dGlvbiB0byByZXBsYWNlIGxvdyBlbnRyb3B5IGhpZ2ggZnJlcXVlbmN5IGJhbmRzCi13aXRoIGltcGVyY2VpdmFibGUgd2hpdGUgbm9pc2UgZHVyaW5nIHRoZSBkZWNvZGluZyBwcm9jZXNzLiBCeSBkZWZhdWx0LCBpdCdzCit3aXRoIGltcGVyY2VwdGlibGUgd2hpdGUgbm9pc2UgZHVyaW5nIHRoZSBkZWNvZGluZyBwcm9jZXNzLiBCeSBkZWZhdWx0LCBpdCdzCiBlbmFibGVkLCBidXQgY2FuIGJlIGRpc2FibGVkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgYnkgdXNpbmcgImRpc2FibGUiLgogCiBAaXRlbSBhYWNfdG5zCkBAIC0xMzAsMTkgKzEzMCwxOSBAQAogZGVjZW50IHF1YWxpdHkuCiAKIEBpdGVtIG1wZWcyX2FhY19sb3cKLUVxdWl2YWxlbnQgdG8gLXByb2ZpbGU6YSBhYWNfbG93IC1hYWNfcG5zIDAuIFBOUyB3YXMgaW50cm9kdWNlZCB3aXRoIHRoZSBNUEVHNAotc3BlY2lmaWNhdGlvbnMuCitFcXVpdmFsZW50IHRvIEBjb2Rley1wcm9maWxlOmEgYWFjX2xvdyAtYWFjX3BucyAwfS4gUE5TIHdhcyBpbnRyb2R1Y2VkIHdpdGggdGhlCitNUEVHNCBzcGVjaWZpY2F0aW9ucy4KIAogQGl0ZW0gYWFjX2x0cAotTG9uZyB0ZXJtIHByZWRpY3Rpb24gcHJvZmlsZSwgaXMgZW5hYmxlZCBieSBhbmQgd2lsbCBlbmFibGUgdGhlIGFhY19sdHAgb3B0aW9uLgotSW50cm9kdWNlZCBpbiBNUEVHNC4KK0xvbmcgdGVybSBwcmVkaWN0aW9uIHByb2ZpbGUsIGlzIGVuYWJsZWQgYnkgYW5kIHdpbGwgZW5hYmxlIHRoZSBAb3B0aW9ue2FhY19sdHB9CitvcHRpb24uIEludHJvZHVjZWQgaW4gTVBFRzQuCiAKIEBpdGVtIGFhY19tYWluCi1NYWluLXR5cGUgcHJlZGljdGlvbiBwcm9maWxlLCBpcyBlbmFibGVkIGJ5IGFuZCB3aWxsIGVuYWJsZSB0aGUgYWFjX3ByZWQgb3B0aW9uLgotSW50cm9kdWNlZCBpbiBNUEVHMi4KK01haW4tdHlwZSBwcmVkaWN0aW9uIHByb2ZpbGUsIGlzIGVuYWJsZWQgYnkgYW5kIHdpbGwgZW5hYmxlIHRoZSBAb3B0aW9ue2FhY19wcmVkfQorb3B0aW9uLiBJbnRyb2R1Y2VkIGluIE1QRUcyLgogCi1JZiB0aGlzIG9wdGlvbiBpcyB1bnNwZWNpZmllZCBpdCBpcyBzZXQgdG8gQHNhbXB7YWFjX2xvd30uCiBAZW5kIHRhYmxlCitJZiB0aGlzIG9wdGlvbiBpcyB1bnNwZWNpZmllZCBpdCBpcyBzZXQgdG8gQHNhbXB7YWFjX2xvd30uCiBAZW5kIHRhYmxlCiAKIEBzZWN0aW9uIGFjMyBhbmQgYWMzX2ZpeGVkCkBAIC00ODcsNiArNDg3LDEwIEBACiB0aGUgbGVmdC9yaWdodCBjaGFubmVscyBhcyBtaWQvc2lkZS4gVGhpcyBvcHRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0LCBhbmQgaXQKIGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IGl0IGJlIGxlZnQgYXMgZW5hYmxlZCBleGNlcHQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCiAKK0BpdGVtIGN1dG9mZiBAdmFye2ZyZXF1ZW5jeX0KK1NldCBsb3dwYXNzIGN1dG9mZiBmcmVxdWVuY3kuIElmIHVuc3BlY2lmaWVkLCB0aGUgZW5jb2RlciBzZWxlY3RzIGEgZGVmYXVsdAorZGV0ZXJtaW5lZCBieSB2YXJpb3VzIG90aGVyIGVuY29kaW5nIHBhcmFtZXRlcnMuCisKIEBlbmQgdGFibGUKIAogQHN1YnNlY3Rpb24gRmxvYXRpbmctUG9pbnQtT25seSBBQy0zIEVuY29kaW5nIE9wdGlvbnMKQEAgLTU0NCw3ICs1NDgsOCBAQAogQHRhYmxlIEBvcHRpb24KIEBpdGVtIGNvbXByZXNzaW9uX2xldmVsCiBTZXRzIHRoZSBjb21wcmVzc2lvbiBsZXZlbCwgd2hpY2ggY2hvb3NlcyBkZWZhdWx0cyBmb3IgbWFueSBvdGhlciBvcHRpb25zCi1pZiB0aGV5IGFyZSBub3Qgc2V0IGV4cGxpY2l0bHkuCitpZiB0aGV5IGFyZSBub3Qgc2V0IGV4cGxpY2l0bHkuIFZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIHRvIDEyLCA1IGlzIHRoZQorZGVmYXVsdC4KIAogQGl0ZW0gZnJhbWVfc2l6ZQogU2V0cyB0aGUgc2l6ZSBvZiB0aGUgZnJhbWVzIGluIHNhbXBsZXMgcGVyIGNoYW5uZWwuCkBAIC01OTMsNyArNTk4LDcgQEAKIEBpdGVtIGF1dG8KIFRoZSBtb2RlIGlzIGNob3NlbiBhdXRvbWF0aWNhbGx5IGZvciBlYWNoIGZyYW1lCiBAaXRlbSBpbmRlcAotQ2hhbmVscyBhcmUgaW5kZXBlbmRlbnRseSBjb2RlZAorQ2hhbm5lbHMgYXJlIGluZGVwZW5kZW50bHkgY29kZWQKIEBpdGVtIGxlZnRfc2lkZQogQGl0ZW0gcmlnaHRfc2lkZQogQGl0ZW0gbWlkX3NpZGUKQEAgLTYxMSwxMTEgKzYxNiwyNyBAQAogCiBAZW5kIHRhYmxlCiAKLUBhbmNob3J7bGliZmFhY30KLUBzZWN0aW9uIGxpYmZhYWMKK0BhbmNob3J7b3B1c2VuY30KK0BzZWN0aW9uIG9wdXMKIAotbGliZmFhYyBBQUMgKEFkdmFuY2VkIEF1ZGlvIENvZGluZykgZW5jb2RlciB3cmFwcGVyLgorT3B1cyBlbmNvZGVyLgogCi1UaGlzIGVuY29kZXIgaXMgb2YgbXVjaCBsb3dlciBxdWFsaXR5IGFuZCBpcyBtb3JlIHVuc3RhYmxlIHRoYW4gYW55IG90aGVyIEFBQwotZW5jb2RlcnMsIHNvIGl0J3MgaGlnaGx5IHJlY29tbWVuZGVkIHRvIGluc3RlYWQgdXNlIG90aGVyIGVuY29kZXJzLCBsaWtlCi1AcmVme2FhY2VuYywsdGhlIG5hdGl2ZSBGRm1wZWcgQUFDIGVuY29kZXJ9LgotCi1UaGlzIGVuY29kZXIgYWxzbyByZXF1aXJlcyB0aGUgcHJlc2VuY2Ugb2YgdGhlIGxpYmZhYWMgaGVhZGVycyBhbmQgbGlicmFyeQotZHVyaW5nIGNvbmZpZ3VyYXRpb24uIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY29uZmlndXJlIHRoZSBidWlsZCB3aXRoCi1AY29kZXstLWVuYWJsZS1saWJmYWFjIC0tZW5hYmxlLW5vbmZyZWV9LgorVGhpcyBpcyBhIG5hdGl2ZSBGRm1wZWcgZW5jb2RlciBmb3IgdGhlIE9wdXMgZm9ybWF0LiBDdXJyZW50bHkgaXRzIGluIGRldmVsb3BtZW50IGFuZAorb25seSBpbXBsZW1lbnRzIHRoZSBDRUxUIHBhcnQgb2YgdGhlIGNvZGVjLiBJdHMgcXVhbGl0eSBpcyB1c3VhbGx5IHdvcnNlIGFuZCBhdCBiZXN0CitpcyBlcXVhbCB0byB0aGUgbGlib3B1cyBlbmNvZGVyLgogCiBAc3Vic2VjdGlvbiBPcHRpb25zCiAKLVRoZSBmb2xsb3dpbmcgc2hhcmVkIEZGbXBlZyBjb2RlYyBvcHRpb25zIGFyZSByZWNvZ25pemVkLgotCi1UaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHN1cHBvcnRlZCBieSB0aGUgbGliZmFhYyB3cmFwcGVyLiBUaGUKLUBjb21tYW5ke2ZhYWN9LWVxdWl2YWxlbnQgb2YgdGhlIG9wdGlvbnMgYXJlIGxpc3RlZCBpbiBwYXJlbnRoZXNlcy4KLQogQHRhYmxlIEBvcHRpb24KLUBpdGVtIGIgKEBlbXBoey1ifSkKLVNldCBiaXQgcmF0ZSBpbiBiaXRzL3MgZm9yIEFCUiAoQXZlcmFnZSBCaXQgUmF0ZSkgbW9kZS4gSWYgdGhlIGJpdCByYXRlCi1pcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGEgc3VpdGFibGUKLXZhbHVlIGRlcGVuZGluZyBvbiB0aGUgc2VsZWN0ZWQgcHJvZmlsZS4gQGNvbW1hbmR7ZmFhY30gYml0cmF0ZSBpcwotZXhwcmVzc2VkIGluIGtpbG9iaXRzL3MuCitAaXRlbSBiCitTZXQgYml0IHJhdGUgaW4gYml0cy9zLiBJZiB1bnNwZWNpZmllZCBpdCB1c2VzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgYW5kIHRoZSBsYXlvdXQKK3RvIG1ha2UgYSBnb29kIGd1ZXNzLgogCi1Ob3RlIHRoYXQgbGliZmFhYyBkb2VzIG5vdCBzdXBwb3J0IENCUiAoQ29uc3RhbnQgQml0IFJhdGUpIGJ1dCBvbmx5Ci1BQlIgKEF2ZXJhZ2UgQml0IFJhdGUpLgotCi1JZiBWQlIgbW9kZSBpcyBlbmFibGVkIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuCi0KLUBpdGVtIGFyIChAZW1waHstUn0pCi1TZXQgYXVkaW8gc2FtcGxpbmcgcmF0ZSAoaW4gSHopLgotCi1AaXRlbSBhYyAoQGVtcGh7LWN9KQotU2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMuCi0KLUBpdGVtIGN1dG9mZiAoQGVtcGh7LUN9KQotU2V0IGN1dG9mZiBmcmVxdWVuY3kuIElmIG5vdCBzcGVjaWZpZWQgKG9yIGV4cGxpY2l0bHkgc2V0IHRvIDApIGl0Ci13aWxsIHVzZSBhIHZhbHVlIGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQgYnkgdGhlIGxpYnJhcnkuIERlZmF1bHQgdmFsdWUKLWlzIDAuCi0KLUBpdGVtIHByb2ZpbGUKLVNldCBhdWRpbyBwcm9maWxlLgotCi1UaGUgZm9sbG93aW5nIHByb2ZpbGVzIGFyZSByZWNvZ25pemVkOgotQHRhYmxlIEBzYW1wCi1AaXRlbSBhYWNfbWFpbgotTWFpbiBBQUMgKE1haW4pCi0KLUBpdGVtIGFhY19sb3cKLUxvdyBDb21wbGV4aXR5IEFBQyAoTEMpCi0KLUBpdGVtIGFhY19zc3IKLVNjYWxhYmxlIFNhbXBsZSBSYXRlIChTU1IpCi0KLUBpdGVtIGFhY19sdHAKLUxvbmcgVGVybSBQcmVkaWN0aW9uIChMVFApCitAaXRlbSBvcHVzX2RlbGF5CitTZXRzIHRoZSBtYXhpbXVtIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gTG93ZXIgZGVsYXlzIHRoYW4gMjBtcyB3aWxsIHZlcnkgcXVpY2tseQorZGVjcmVhc2UgcXVhbGl0eS4KIEBlbmQgdGFibGUKIAotSWYgbm90IHNwZWNpZmllZCBpdCBpcyBzZXQgdG8gQHNhbXB7YWFjX2xvd30uCi0KLUBpdGVtIGZsYWdzICtxc2NhbGUKLVNldCBjb25zdGFudCBxdWFsaXR5IFZCUiAoVmFyaWFibGUgQml0IFJhdGUpIG1vZGUuCi0KLUBpdGVtIGdsb2JhbF9xdWFsaXR5Ci1TZXQgcXVhbGl0eSBpbiBWQlIgbW9kZSBhcyBhbiBpbnRlZ2VyIG51bWJlciBvZiBsYW1iZGEgdW5pdHMuCi0KLU9ubHkgcmVsZXZhbnQgd2hlbiBWQlIgbW9kZSBpcyBlbmFibGVkIHdpdGggQGNvZGV7ZmxhZ3MgK3FzY2FsZX0uICBUaGUKLXZhbHVlIGlzIGNvbnZlcnRlZCB0byBRUCB1bml0cyBieSBkaXZpZGluZyBpdCBieSBAY29kZXtGRl9RUDJMQU1CREF9LAotYW5kIHVzZWQgdG8gc2V0IHRoZSBxdWFsaXR5IHZhbHVlIHVzZWQgYnkgbGliZmFhYy4gQSByZWFzb25hYmxlIHJhbmdlCi1mb3IgdGhlIG9wdGlvbiB2YWx1ZSBpbiBRUCB1bml0cyBpcyBbMTAtNTAwXSwgdGhlIGhpZ2hlciB0aGUgdmFsdWUgdGhlCi1oaWdoZXIgdGhlIHF1YWxpdHkuCi0KLUBpdGVtIHEgKEBlbXBoey1xfSkKLUVuYWJsZSBWQlIgbW9kZSB3aGVuIHNldCB0byBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSwgYW5kIHNldCBjb25zdGFudAotcXVhbGl0eSB2YWx1ZSBhcyBhIGRvdWJsZSBmbG9hdGluZyBwb2ludCB2YWx1ZSBpbiBRUCB1bml0cy4KLQotVGhlIHZhbHVlIHNldHMgdGhlIHF1YWxpdHkgdmFsdWUgdXNlZCBieSBsaWJmYWFjLiBBIHJlYXNvbmFibGUgcmFuZ2UKLWZvciB0aGUgb3B0aW9uIHZhbHVlIGlzIFsxMC01MDBdLCB0aGUgaGlnaGVyIHRoZSB2YWx1ZSB0aGUgaGlnaGVyIHRoZQotcXVhbGl0eS4KLQotVGhpcyBvcHRpb24gaXMgdmFsaWQgb25seSB1c2luZyB0aGUgQGNvbW1hbmR7ZmZtcGVnfSBjb21tYW5kLWxpbmUKLXRvb2wuIEZvciBsaWJyYXJ5IGludGVyZmFjZSB1c2VycywgdXNlIEBvcHRpb257Z2xvYmFsX3F1YWxpdHl9LgotQGVuZCB0YWJsZQotCi1Ac3Vic2VjdGlvbiBFeGFtcGxlcwotCi1AaXRlbWl6ZQotQGl0ZW0KLVVzZSBAY29tbWFuZHtmZm1wZWd9IHRvIGNvbnZlcnQgYW4gYXVkaW8gZmlsZSB0byBBQlIgMTI4IGticHMgQUFDIGluIGFuIE00QSAoTVA0KQotY29udGFpbmVyOgotQGV4YW1wbGUKLWZmbXBlZyAtaSBpbnB1dC53YXYgLWNvZGVjOmEgbGliZmFhYyAtYjphIDEyOGsgLW91dHB1dC5tNGEKLUBlbmQgZXhhbXBsZQotCi1AaXRlbQotVXNlIEBjb21tYW5ke2ZmbXBlZ30gdG8gY29udmVydCBhbiBhdWRpbyBmaWxlIHRvIFZCUiBBQUMsIHVzaW5nIHRoZQotTFRQIEFBQyBwcm9maWxlOgotQGV4YW1wbGUKLWZmbXBlZyAtaSBpbnB1dC53YXYgLWM6YSBsaWJmYWFjIC1wcm9maWxlOmEgYWFjX2x0cCAtcTphIDEwMCBvdXRwdXQubTRhCi1AZW5kIGV4YW1wbGUKLUBlbmQgaXRlbWl6ZQotCiBAYW5jaG9ye2xpYmZkay1hYWMtZW5jfQogQHNlY3Rpb24gbGliZmRrX2FhYwogCkBAIC05MjEsNiArODQyLDEwIEBACiB3aXRoIDAgbWVhbmluZyBoaWdoZXN0IHF1YWxpdHkgYnV0IHNsb3dlc3QsIGFuZCA5IG1lYW5pbmcgZmFzdGVzdAogd2hpbGUgcHJvZHVjaW5nIHRoZSB3b3JzdCBxdWFsaXR5LgogCitAaXRlbSBjdXRvZmYgKEBlbXBoey0tbG93cGFzc30pCitTZXQgbG93cGFzcyBjdXRvZmYgZnJlcXVlbmN5LiBJZiB1bnNwZWNpZmllZCwgdGhlIGVuY29kZXIgZHluYW1pY2FsbHkKK2FkanVzdHMgdGhlIGN1dG9mZi4KKwogQGl0ZW0gcmVzZXJ2b2lyCiBFbmFibGUgdXNlIG9mIGJpdCByZXNlcnZvaXIgd2hlbiBzZXQgdG8gMS4gRGVmYXVsdCB2YWx1ZSBpcyAxLiBMQU1FCiBoYXMgdGhpcyBlbmFibGVkIGJ5IGRlZmF1bHQsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2UKQEAgLTk3NCw2ICs4OTksOTUgQEAKIAogQGVuZCB0YWJsZQogCitAc2VjdGlvbiBsaWJvcHVzCisKK2xpYm9wdXMgT3B1cyBJbnRlcmFjdGl2ZSBBdWRpbyBDb2RlYyBlbmNvZGVyIHdyYXBwZXIuCisKK1JlcXVpcmVzIHRoZSBwcmVzZW5jZSBvZiB0aGUgbGlib3B1cyBoZWFkZXJzIGFuZCBsaWJyYXJ5IGR1cmluZworY29uZmlndXJhdGlvbi4gWW91IG5lZWQgdG8gZXhwbGljaXRseSBjb25maWd1cmUgdGhlIGJ1aWxkIHdpdGgKK0Bjb2Rley0tZW5hYmxlLWxpYm9wdXN9LgorCitAc3Vic2VjdGlvbiBPcHRpb24gTWFwcGluZworCitNb3N0IGxpYm9wdXMgb3B0aW9ucyBhcmUgbW9kZWxsZWQgYWZ0ZXIgdGhlIEBjb21tYW5ke29wdXNlbmN9IHV0aWxpdHkgZnJvbQorb3B1cy10b29scy4gVGhlIGZvbGxvd2luZyBpcyBhbiBvcHRpb24gbWFwcGluZyBjaGFydCBkZXNjcmliaW5nIG9wdGlvbnMKK3N1cHBvcnRlZCBieSB0aGUgbGlib3B1cyB3cmFwcGVyLCBhbmQgdGhlaXIgQGNvbW1hbmR7b3B1c2VuY30tZXF1aXZhbGVudAoraW4gcGFyZW50aGVzZXMuCisKK0B0YWJsZSBAb3B0aW9uCisKK0BpdGVtIGIgKEBlbXBoe2JpdHJhdGV9KQorU2V0IHRoZSBiaXQgcmF0ZSBpbiBiaXRzL3MuICBGRm1wZWcncyBAb3B0aW9ue2J9IG9wdGlvbiBpcworZXhwcmVzc2VkIGluIGJpdHMvcywgd2hpbGUgQGNvbW1hbmR7b3B1c2VuY30ncyBAb3B0aW9ue2JpdHJhdGV9IGluCitraWxvYml0cy9zLgorCitAaXRlbSB2YnIgKEBlbXBoe3Zicn0sIEBlbXBoe2hhcmQtY2JyfSwgYW5kIEBlbXBoe2N2YnJ9KQorU2V0IFZCUiBtb2RlLiBUaGUgRkZtcGVnIEBvcHRpb257dmJyfSBvcHRpb24gaGFzIHRoZSBmb2xsb3dpbmcKK3ZhbGlkIGFyZ3VtZW50cywgd2l0aCB0aGUgQGNvbW1hbmR7b3B1c2VuY30gZXF1aXZhbGVudCBvcHRpb25zCitpbiBwYXJlbnRoZXNlczoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBvZmYgKEBlbXBoe2hhcmQtY2JyfSkKK1VzZSBjb25zdGFudCBiaXQgcmF0ZSBlbmNvZGluZy4KKworQGl0ZW0gb24gKEBlbXBoe3Zicn0pCitVc2UgdmFyaWFibGUgYml0IHJhdGUgZW5jb2RpbmcgKHRoZSBkZWZhdWx0KS4KKworQGl0ZW0gY29uc3RyYWluZWQgKEBlbXBoe2N2YnJ9KQorVXNlIGNvbnN0cmFpbmVkIHZhcmlhYmxlIGJpdCByYXRlIGVuY29kaW5nLgorQGVuZCB0YWJsZQorCitAaXRlbSBjb21wcmVzc2lvbl9sZXZlbCAoQGVtcGh7Y29tcH0pCitTZXQgZW5jb2RpbmcgYWxnb3JpdGhtIGNvbXBsZXhpdHkuIFZhbGlkIG9wdGlvbnMgYXJlIGludGVnZXJzIGluCit0aGUgMC0xMCByYW5nZS4gMCBnaXZlcyB0aGUgZmFzdGVzdCBlbmNvZGVzIGJ1dCBsb3dlciBxdWFsaXR5LCB3aGlsZSAxMAorZ2l2ZXMgdGhlIGhpZ2hlc3QgcXVhbGl0eSBidXQgc2xvd2VzdCBlbmNvZGluZy4gVGhlIGRlZmF1bHQgaXMgMTAuCisKK0BpdGVtIGZyYW1lX2R1cmF0aW9uIChAZW1waHtmcmFtZXNpemV9KQorU2V0IG1heGltdW0gZnJhbWUgc2l6ZSwgb3IgZHVyYXRpb24gb2YgYSBmcmFtZSBpbiBtaWxsaXNlY29uZHMuIFRoZQorYXJndW1lbnQgbXVzdCBiZSBleGFjdGx5IHRoZSBmb2xsb3dpbmc6IDIuNSwgNSwgMTAsIDIwLCA0MCwgNjAuIFNtYWxsZXIKK2ZyYW1lIHNpemVzIGFjaGlldmUgbG93ZXIgbGF0ZW5jeSBidXQgbGVzcyBxdWFsaXR5IGF0IGEgZ2l2ZW4gYml0cmF0ZS4KK1NpemVzIGdyZWF0ZXIgdGhhbiAyMG1zIGFyZSBvbmx5IGludGVyZXN0aW5nIGF0IGZhaXJseSBsb3cgYml0cmF0ZXMuCitUaGUgZGVmYXVsdCBpcyAyMG1zLgorCitAaXRlbSBwYWNrZXRfbG9zcyAoQGVtcGh7ZXhwZWN0LWxvc3N9KQorU2V0IGV4cGVjdGVkIHBhY2tldCBsb3NzIHBlcmNlbnRhZ2UuIFRoZSBkZWZhdWx0IGlzIDAuCisKK0BpdGVtIGFwcGxpY2F0aW9uIChOLkEuKQorU2V0IGludGVuZGVkIGFwcGxpY2F0aW9uIHR5cGUuIFZhbGlkIG9wdGlvbnMgYXJlIGxpc3RlZCBiZWxvdzoKKworQHRhYmxlIEBzYW1wCitAaXRlbSB2b2lwCitGYXZvciBpbXByb3ZlZCBzcGVlY2ggaW50ZWxsaWdpYmlsaXR5LgorQGl0ZW0gYXVkaW8KK0Zhdm9yIGZhaXRoZnVsbmVzcyB0byB0aGUgaW5wdXQgKHRoZSBkZWZhdWx0KS4KK0BpdGVtIGxvd2RlbGF5CitSZXN0cmljdCB0byBvbmx5IHRoZSBsb3dlc3QgZGVsYXkgbW9kZXMuCitAZW5kIHRhYmxlCisKK0BpdGVtIGN1dG9mZiAoTi5BLikKK1NldCBjdXRvZmYgYmFuZHdpZHRoIGluIEh6LiBUaGUgYXJndW1lbnQgbXVzdCBiZSBleGFjdGx5IG9uZSBvZiB0aGUKK2ZvbGxvd2luZzogNDAwMCwgNjAwMCwgODAwMCwgMTIwMDAsIG9yIDIwMDAwLCBjb3JyZXNwb25kaW5nIHRvCituYXJyb3diYW5kLCBtZWRpdW1iYW5kLCB3aWRlYmFuZCwgc3VwZXIgd2lkZWJhbmQsIGFuZCBmdWxsYmFuZAorcmVzcGVjdGl2ZWx5LiBUaGUgZGVmYXVsdCBpcyAwIChjdXRvZmYgZGlzYWJsZWQpLgorCitAaXRlbSBtYXBwaW5nX2ZhbWlseSAoQGVtcGh7bWFwcGluZ19mYW1pbHl9KQorU2V0IGNoYW5uZWwgbWFwcGluZyBmYW1pbHkgdG8gYmUgdXNlZCBieSB0aGUgZW5jb2Rlci4gVGhlIGRlZmF1bHQgdmFsdWUgb2YgLTEKK3VzZXMgbWFwcGluZyBmYW1pbHkgMCBmb3IgbW9ubyBhbmQgc3RlcmVvIGlucHV0cywgYW5kIG1hcHBpbmcgZmFtaWx5IDEKK290aGVyd2lzZS4gVGhlIGRlZmF1bHQgYWxzbyBkaXNhYmxlcyB0aGUgc3Vycm91bmQgbWFza2luZyBhbmQgTEZFIGJhbmR3aWR0aAorb3B0aW16YXRpb25zIGluIGxpYm9wdXMsIGFuZCByZXF1aXJlcyB0aGF0IHRoZSBpbnB1dCBjb250YWlucyA4IGNoYW5uZWxzIG9yCitmZXdlci4KKworT3RoZXIgdmFsdWVzIGluY2x1ZGUgMCBmb3IgbW9ubyBhbmQgc3RlcmVvLCAxIGZvciBzdXJyb3VuZCBzb3VuZCB3aXRoIG1hc2tpbmcKK2FuZCBMRkUgYmFuZHdpZHRoIG9wdGltaXphdGlvbnMsIGFuZCAyNTUgZm9yIGluZGVwZW5kZW50IHN0cmVhbXMgd2l0aCBhbgordW5zcGVjaWZpZWQgY2hhbm5lbCBsYXlvdXQuCisKK0BpdGVtIGFwcGx5X3BoYXNlX2ludiAoTi5BLikgKHJlcXVpcmVzIGxpYm9wdXMgPj0gMS4yKQorSWYgc2V0IHRvIDAsIGRpc2FibGVzIHRoZSB1c2Ugb2YgcGhhc2UgaW52ZXJzaW9uIGZvciBpbnRlbnNpdHkgc3RlcmVvLAoraW1wcm92aW5nIHRoZSBxdWFsaXR5IG9mIG1vbm8gZG93bm1peGVzLCBidXQgc2xpZ2h0bHkgcmVkdWNpbmcgbm9ybWFsIHN0ZXJlbworcXVhbGl0eS4gVGhlIGRlZmF1bHQgaXMgMSAocGhhc2UgaW52ZXJzaW9uIGVuYWJsZWQpLgorCitAZW5kIHRhYmxlCisKIEBhbmNob3J7bGlic2hpbmV9CiBAc2VjdGlvbiBsaWJzaGluZQogCkBAIC0xMTEzLDc5ICsxMTI3LDYgQEAKIAogQGVuZCB0YWJsZQogCi1Ac2VjdGlvbiBsaWJvcHVzCi0KLWxpYm9wdXMgT3B1cyBJbnRlcmFjdGl2ZSBBdWRpbyBDb2RlYyBlbmNvZGVyIHdyYXBwZXIuCi0KLVJlcXVpcmVzIHRoZSBwcmVzZW5jZSBvZiB0aGUgbGlib3B1cyBoZWFkZXJzIGFuZCBsaWJyYXJ5IGR1cmluZwotY29uZmlndXJhdGlvbi4gWW91IG5lZWQgdG8gZXhwbGljaXRseSBjb25maWd1cmUgdGhlIGJ1aWxkIHdpdGgKLUBjb2Rley0tZW5hYmxlLWxpYm9wdXN9LgotCi1Ac3Vic2VjdGlvbiBPcHRpb24gTWFwcGluZwotCi1Nb3N0IGxpYm9wdXMgb3B0aW9ucyBhcmUgbW9kZWxsZWQgYWZ0ZXIgdGhlIEBjb21tYW5ke29wdXNlbmN9IHV0aWxpdHkgZnJvbQotb3B1cy10b29scy4gVGhlIGZvbGxvd2luZyBpcyBhbiBvcHRpb24gbWFwcGluZyBjaGFydCBkZXNjcmliaW5nIG9wdGlvbnMKLXN1cHBvcnRlZCBieSB0aGUgbGlib3B1cyB3cmFwcGVyLCBhbmQgdGhlaXIgQGNvbW1hbmR7b3B1c2VuY30tZXF1aXZhbGVudAotaW4gcGFyZW50aGVzZXMuCi0KLUB0YWJsZSBAb3B0aW9uCi0KLUBpdGVtIGIgKEBlbXBoe2JpdHJhdGV9KQotU2V0IHRoZSBiaXQgcmF0ZSBpbiBiaXRzL3MuICBGRm1wZWcncyBAb3B0aW9ue2J9IG9wdGlvbiBpcwotZXhwcmVzc2VkIGluIGJpdHMvcywgd2hpbGUgQGNvbW1hbmR7b3B1c2VuY30ncyBAb3B0aW9ue2JpdHJhdGV9IGluCi1raWxvYml0cy9zLgotCi1AaXRlbSB2YnIgKEBlbXBoe3Zicn0sIEBlbXBoe2hhcmQtY2JyfSwgYW5kIEBlbXBoe2N2YnJ9KQotU2V0IFZCUiBtb2RlLiBUaGUgRkZtcGVnIEBvcHRpb257dmJyfSBvcHRpb24gaGFzIHRoZSBmb2xsb3dpbmcKLXZhbGlkIGFyZ3VtZW50cywgd2l0aCB0aGUgQGNvbW1hbmR7b3B1c2VuY30gZXF1aXZhbGVudCBvcHRpb25zCi1pbiBwYXJlbnRoZXNlczoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSBvZmYgKEBlbXBoe2hhcmQtY2JyfSkKLVVzZSBjb25zdGFudCBiaXQgcmF0ZSBlbmNvZGluZy4KLQotQGl0ZW0gb24gKEBlbXBoe3Zicn0pCi1Vc2UgdmFyaWFibGUgYml0IHJhdGUgZW5jb2RpbmcgKHRoZSBkZWZhdWx0KS4KLQotQGl0ZW0gY29uc3RyYWluZWQgKEBlbXBoe2N2YnJ9KQotVXNlIGNvbnN0cmFpbmVkIHZhcmlhYmxlIGJpdCByYXRlIGVuY29kaW5nLgotQGVuZCB0YWJsZQotCi1AaXRlbSBjb21wcmVzc2lvbl9sZXZlbCAoQGVtcGh7Y29tcH0pCi1TZXQgZW5jb2RpbmcgYWxnb3JpdGhtIGNvbXBsZXhpdHkuIFZhbGlkIG9wdGlvbnMgYXJlIGludGVnZXJzIGluCi10aGUgMC0xMCByYW5nZS4gMCBnaXZlcyB0aGUgZmFzdGVzdCBlbmNvZGVzIGJ1dCBsb3dlciBxdWFsaXR5LCB3aGlsZSAxMAotZ2l2ZXMgdGhlIGhpZ2hlc3QgcXVhbGl0eSBidXQgc2xvd2VzdCBlbmNvZGluZy4gVGhlIGRlZmF1bHQgaXMgMTAuCi0KLUBpdGVtIGZyYW1lX2R1cmF0aW9uIChAZW1waHtmcmFtZXNpemV9KQotU2V0IG1heGltdW0gZnJhbWUgc2l6ZSwgb3IgZHVyYXRpb24gb2YgYSBmcmFtZSBpbiBtaWxsaXNlY29uZHMuIFRoZQotYXJndW1lbnQgbXVzdCBiZSBleGFjdGx5IHRoZSBmb2xsb3dpbmc6IDIuNSwgNSwgMTAsIDIwLCA0MCwgNjAuIFNtYWxsZXIKLWZyYW1lIHNpemVzIGFjaGlldmUgbG93ZXIgbGF0ZW5jeSBidXQgbGVzcyBxdWFsaXR5IGF0IGEgZ2l2ZW4gYml0cmF0ZS4KLVNpemVzIGdyZWF0ZXIgdGhhbiAyMG1zIGFyZSBvbmx5IGludGVyZXN0aW5nIGF0IGZhaXJseSBsb3cgYml0cmF0ZXMuCi1UaGUgZGVmYXVsdCBpcyAyMG1zLgotCi1AaXRlbSBwYWNrZXRfbG9zcyAoQGVtcGh7ZXhwZWN0LWxvc3N9KQotU2V0IGV4cGVjdGVkIHBhY2tldCBsb3NzIHBlcmNlbnRhZ2UuIFRoZSBkZWZhdWx0IGlzIDAuCi0KLUBpdGVtIGFwcGxpY2F0aW9uIChOLkEuKQotU2V0IGludGVuZGVkIGFwcGxpY2F0aW9uIHR5cGUuIFZhbGlkIG9wdGlvbnMgYXJlIGxpc3RlZCBiZWxvdzoKLQotQHRhYmxlIEBzYW1wCi1AaXRlbSB2b2lwCi1GYXZvciBpbXByb3ZlZCBzcGVlY2ggaW50ZWxsaWdpYmlsaXR5LgotQGl0ZW0gYXVkaW8KLUZhdm9yIGZhaXRoZnVsbmVzcyB0byB0aGUgaW5wdXQgKHRoZSBkZWZhdWx0KS4KLUBpdGVtIGxvd2RlbGF5Ci1SZXN0cmljdCB0byBvbmx5IHRoZSBsb3dlc3QgZGVsYXkgbW9kZXMuCi1AZW5kIHRhYmxlCi0KLUBpdGVtIGN1dG9mZiAoTi5BLikKLVNldCBjdXRvZmYgYmFuZHdpZHRoIGluIEh6LiBUaGUgYXJndW1lbnQgbXVzdCBiZSBleGFjdGx5IG9uZSBvZiB0aGUKLWZvbGxvd2luZzogNDAwMCwgNjAwMCwgODAwMCwgMTIwMDAsIG9yIDIwMDAwLCBjb3JyZXNwb25kaW5nIHRvCi1uYXJyb3diYW5kLCBtZWRpdW1iYW5kLCB3aWRlYmFuZCwgc3VwZXIgd2lkZWJhbmQsIGFuZCBmdWxsYmFuZAotcmVzcGVjdGl2ZWx5LiBUaGUgZGVmYXVsdCBpcyAwIChjdXRvZmYgZGlzYWJsZWQpLgotCi1AZW5kIHRhYmxlCi0KIEBzZWN0aW9uIGxpYnZvcmJpcwogCiBsaWJ2b3JiaXMgZW5jb2RlciB3cmFwcGVyLgpAQCAtMTI4NSw2ICsxMjI2LDI3IEBACiBAZW5kIHRhYmxlCiBAZW5kIHRhYmxlCiAKK0BhbmNob3J7bWpwZWdlbmN9CitAc2VjdGlvbiBtanBlZworCitNb3Rpb24gSlBFRyBlbmNvZGVyLgorCitAc3Vic2VjdGlvbiBPcHRpb25zCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBodWZmbWFuCitTZXQgdGhlIGh1ZmZtYW4gZW5jb2Rpbmcgc3RyYXRlZ3kuIFBvc3NpYmxlIHZhbHVlczoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBkZWZhdWx0CitVc2UgdGhlIGRlZmF1bHQgaHVmZm1hbiB0YWJsZXMuIFRoaXMgaXMgdGhlIGRlZmF1bHQgc3RyYXRlZ3kuCisKK0BpdGVtIG9wdGltYWwKK0NvbXB1dGUgYW5kIHVzZSBvcHRpbWFsIGh1ZmZtYW4gdGFibGVzLgorCitAZW5kIHRhYmxlCitAZW5kIHRhYmxlCisKIEBhbmNob3J7d2F2cGFja2VuY30KIEBzZWN0aW9uIHdhdnBhY2sKIApAQCAtMTM1NCw2ICsxMzE2LDgxIEBACiBBIGRlc2NyaXB0aW9uIG9mIHNvbWUgb2YgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgdmlkZW8gZW5jb2RlcnMKIGZvbGxvd3MuCiAKK0BzZWN0aW9uIEhhcAorCitWaWR2b3ggSGFwIHZpZGVvIGVuY29kZXIuCisKK0BzdWJzZWN0aW9uIE9wdGlvbnMKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGZvcm1hdCBAdmFye2ludGVnZXJ9CitTcGVjaWZpZXMgdGhlIEhhcCBmb3JtYXQgdG8gZW5jb2RlLgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gaGFwCitAaXRlbSBoYXBfYWxwaGEKK0BpdGVtIGhhcF9xCitAZW5kIHRhYmxlCisKK0RlZmF1bHQgdmFsdWUgaXMgQG9wdGlvbntoYXB9LgorCitAaXRlbSBjaHVua3MgQHZhcntpbnRlZ2VyfQorU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2h1bmtzIHRvIHNwbGl0IGZyYW1lcyBpbnRvLCBiZXR3ZWVuIDEgYW5kIDY0LiBUaGlzCitwZXJtaXRzIG11bHRpdGhyZWFkZWQgZGVjb2Rpbmcgb2YgbGFyZ2UgZnJhbWVzLCBwb3RlbnRpYWxseSBhdCB0aGUgY29zdCBvZgorZGF0YS1yYXRlLiBUaGUgZW5jb2RlciBtYXkgbW9kaWZ5IHRoaXMgdmFsdWUgdG8gZGl2aWRlIGZyYW1lcyBldmVubHkuCisKK0RlZmF1bHQgdmFsdWUgaXMgQHZhcnsxfS4KKworQGl0ZW0gY29tcHJlc3NvciBAdmFye2ludGVnZXJ9CitTcGVjaWZpZXMgdGhlIHNlY29uZC1zdGFnZSBjb21wcmVzc29yIHRvIHVzZS4gSWYgc2V0IHRvIEBvcHRpb257bm9uZX0sCitAb3B0aW9ue2NodW5rc30gd2lsbCBiZSBsaW1pdGVkIHRvIDEsIGFzIGNodW5rZWQgdW5jb21wcmVzc2VkIGZyYW1lcyBvZmZlciBubworYmVuZWZpdC4KKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIG5vbmUKK0BpdGVtIHNuYXBweQorQGVuZCB0YWJsZQorCitEZWZhdWx0IHZhbHVlIGlzIEBvcHRpb257c25hcHB5fS4KKworQGVuZCB0YWJsZQorCitAc2VjdGlvbiBqcGVnMjAwMAorCitUaGUgbmF0aXZlIGpwZWcgMjAwMCBlbmNvZGVyIGlzIGxvc3N5IGJ5IGRlZmF1bHQsIHRoZSBAY29kZXstcTp2fQorb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgZW5jb2RpbmcgcXVhbGl0eS4gTG9zc2xlc3MgZW5jb2RpbmcKK2NhbiBiZSBzZWxlY3RlZCB3aXRoIEBjb2Rley1wcmVkIDF9LgorCitAc3Vic2VjdGlvbiBPcHRpb25zCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBmb3JtYXQKK0NhbiBiZSBzZXQgdG8gZWl0aGVyIEBjb2Rle2oya30gb3IgQGNvZGV7anAyfSAodGhlIGRlZmF1bHQpIHRoYXQKK21ha2VzIGl0IHBvc3NpYmxlIHRvIHN0b3JlIG5vbi1yZ2IgcGl4X2ZtdHMuCisKK0BlbmQgdGFibGUKKworQHNlY3Rpb24gbGlia3ZhemFhcgorCitLdmF6YWFyIEguMjY1L0hFVkMgZW5jb2Rlci4KKworUmVxdWlyZXMgdGhlIHByZXNlbmNlIG9mIHRoZSBsaWJrdmF6YWFyIGhlYWRlcnMgYW5kIGxpYnJhcnkgZHVyaW5nCitjb25maWd1cmF0aW9uLiBZb3UgbmVlZCB0byBleHBsaWNpdGx5IGNvbmZpZ3VyZSB0aGUgYnVpbGQgd2l0aAorQG9wdGlvbnstLWVuYWJsZS1saWJrdmF6YWFyfS4KKworQHN1YnNlY3Rpb24gT3B0aW9ucworCitAdGFibGUgQG9wdGlvbgorCitAaXRlbSBiCitTZXQgdGFyZ2V0IHZpZGVvIGJpdHJhdGUgaW4gYml0L3MgYW5kIGVuYWJsZSByYXRlIGNvbnRyb2wuCisKK0BpdGVtIGt2YXphYXItcGFyYW1zCitTZXQga3ZhemFhciBwYXJhbWV0ZXJzIGFzIGEgbGlzdCBvZiBAdmFye25hbWV9PUB2YXJ7dmFsdWV9IHBhaXJzIHNlcGFyYXRlZAorYnkgY29tbWFzICgsKS4gU2VlIGt2YXphYXIgZG9jdW1lbnRhdGlvbiBmb3IgYSBsaXN0IG9mIG9wdGlvbnMuCisKK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gbGlib3BlbmgyNjQKIAogQ2lzY28gbGlib3BlbmgyNjQgSC4yNjQvTVBFRy00IEFWQyBlbmNvZGVyIHdyYXBwZXIuCkBAIC0xMzkwLDcgKzE0MjcsNyBAQAogQHNhbXB7Zml4ZWR9LgogCiBAaXRlbSBzbGljZV9tb2RlCi1TZXQgc2xpY2UgbW9kZS4gQ2FuIGFzc3VtZSBvbmUgb2YgdGhlIGZvbGx3aW5nIHBvc3NpYmxlIHZhbHVlczoKK1NldCBzbGljZSBtb2RlLiBDYW4gYXNzdW1lIG9uZSBvZiB0aGUgZm9sbG93aW5nIHBvc3NpYmxlIHZhbHVlczoKIAogQHRhYmxlIEBzYW1wCiBAaXRlbSBmaXhlZApAQCAtMTQyMCwzMCArMTQ1Nyw2IEBACiBBbGxvdyBza2lwcGluZyBmcmFtZXMgdG8gaGl0IHRoZSB0YXJnZXQgYml0cmF0ZSBpZiBzZXQgdG8gMS4KIEBlbmQgdGFibGUKIAotQHNlY3Rpb24ganBlZzIwMDAKLQotVGhlIG5hdGl2ZSBqcGVnIDIwMDAgZW5jb2RlciBpcyBsb3NzeSBieSBkZWZhdWx0LCB0aGUgQGNvZGV7LXE6dn0KLW9wdGlvbiBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGVuY29kaW5nIHF1YWxpdHkuIExvc3NsZXNzIGVuY29kaW5nCi1jYW4gYmUgc2VsZWN0ZWQgd2l0aCBAY29kZXstcHJlZCAxfS4KLQotQHN1YnNlY3Rpb24gT3B0aW9ucwotCi1AdGFibGUgQG9wdGlvbgotQGl0ZW0gZm9ybWF0Ci1DYW4gYmUgc2V0IHRvIGVpdGhlciBAY29kZXtqMmt9IG9yIEBjb2Rle2pwMn0gKHRoZSBkZWZhdWx0KSB0aGF0Ci1tYWtlcyBpdCBwb3NzaWJsZSB0byBzdG9yZSBub24tcmdiIHBpeF9mbXRzLgotCi1AZW5kIHRhYmxlCi0KLUBzZWN0aW9uIHNub3cKLQotQHN1YnNlY3Rpb24gT3B0aW9ucwotCi1AdGFibGUgQG9wdGlvbgotQGl0ZW0gaXRlcmF0aXZlX2RpYV9zaXplCi1kaWEgc2l6ZSBmb3IgdGhlIGl0ZXJhdGl2ZSBtb3Rpb24gZXN0aW1hdGlvbgotQGVuZCB0YWJsZQotCiBAc2VjdGlvbiBsaWJ0aGVvcmEKIAogbGlidGhlb3JhIFRoZW9yYSBlbmNvZGVyIHdyYXBwZXIuCkBAIC0xNjU3LDcgKzE2NzAsNyBAQAogRW5hYmxlIGZyYW1lIHBhcmFsbGVsIGRlY29kYWJpbGl0eSBmZWF0dXJlcy4KIEBpdGVtIGFxLW1vZGUKIFNldCBhZGFwdGl2ZSBxdWFudGl6YXRpb24gbW9kZSAoMDogb2ZmIChkZWZhdWx0KSwgMTogdmFyaWFuY2UgMjogY29tcGxleGl0eSwgMzoKLWN5Y2xpYyByZWZyZXNoKS4KK2N5Y2xpYyByZWZyZXNoLCA0OiBlcXVhdG9yMzYwKS4KIEBpdGVtIGNvbG9yc3BhY2UgQGVtcGh7Y29sb3Itc3BhY2V9CiBTZXQgaW5wdXQgY29sb3Igc3BhY2UuIFRoZSBWUDkgYml0c3RyZWFtIHN1cHBvcnRzIHNpZ25hbGluZyB0aGUgZm9sbG93aW5nCiBjb2xvcnNwYWNlczoKQEAgLTE2NzAsNiArMTY4MywxNSBAQAogQGl0ZW0gQHNhbXB7c21wdGUyNDBtfSBAZW1waHtzbXB0ZTI0MH0KIEBpdGVtIEBzYW1we2J0MjAyMF9uY2x9IEBlbXBoe2J0MjAyMH0KIEBlbmQgdGFibGUKK0BpdGVtIHJvdy1tdCBAdmFye2Jvb2xlYW59CitFbmFibGUgcm93IGJhc2VkIG11bHRpLXRocmVhZGluZy4KK0BpdGVtIHR1bmUtY29udGVudAorU2V0IGNvbnRlbnQgdHlwZTogZGVmYXVsdCAoMCksIHNjcmVlbiAoMSksIGZpbG0gKDIpLgorQGl0ZW0gY29ycHVzLWNvbXBsZXhpdHkKK0NvcnB1cyBWQlIgbW9kZSBpcyBhIHZhcmlhbnQgb2Ygc3RhbmRhcmQgVkJSIHdoZXJlIHRoZSBjb21wbGV4aXR5IGRpc3RyaWJ1dGlvbgorbWlkcG9pbnQgaXMgcGFzc2VkIGluIHJhdGhlciB0aGFuIGNhbGN1bGF0ZWQgZm9yIGEgc3BlY2lmaWMgY2xpcCBvciBjaHVuay4KKworVGhlIHZhbGlkIHJhbmdlIGlzIFswLCAxMDAwMF0uIDAgKGRlZmF1bHQpIHVzZXMgc3RhbmRhcmQgVkJSLgogQGVuZCB0YWJsZQogCiBAZW5kIHRhYmxlCkBAIC0xNjc3LDcgKzE2OTksNiBAQAogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbGlidnB4IHNlZToKIEB1cmx7aHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvfQogCi0KIEBzZWN0aW9uIGxpYndlYnAKIAogbGlid2VicCBXZWJQIEltYWdlIGVuY29kZXIgd3JhcHBlcgpAQCAtMTc4Myw3ICsxODA0LDcgQEAKIEByZWZ7Y29kZWMtb3B0aW9ucywsdGhlIENvZGVjIE9wdGlvbnMgY2hhcHRlcn0uCiAKIFRvIGdldCBhIG1vcmUgYWNjdXJhdGUgYW5kIGV4dGVuc2l2ZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBsaWJ4MjY0Ci1vcHRpb25zLCBpbnZva2UgdGhlIGNvbW1hbmQgQGNvbW1hbmR7eDI2NCAtLWZ1bGwtaGVscH0gb3IgY29uc3VsdAorb3B0aW9ucywgaW52b2tlIHRoZSBjb21tYW5kIEBjb21tYW5ke3gyNjQgLS1mdWxsaGVscH0gb3IgY29uc3VsdAogdGhlIGxpYngyNjQgZG9jdW1lbnRhdGlvbi4KIAogQHRhYmxlIEBvcHRpb24KQEAgLTE4NDQsNiArMTg2NSwxMCBAQAogSGFkYW1hcmQgZXhoYXVzdGl2ZSBzZWFyY2ggKHNsb3dlc3QpLgogQGVuZCB0YWJsZQogCitAaXRlbSBmb3JjZWQtaWRyCitOb3JtYWxseSwgd2hlbiBmb3JjaW5nIGEgSS1mcmFtZSB0eXBlLCB0aGUgZW5jb2RlciBjYW4gc2VsZWN0IGFueSB0eXBlCitvZiBJLWZyYW1lLiBUaGlzIG9wdGlvbiBmb3JjZXMgaXQgdG8gY2hvb3NlIGFuIElEUi1mcmFtZS4KKwogQGl0ZW0gc3VicSAoQGVtcGh7c3VibWV9KQogU3ViLXBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uIG1ldGhvZC4KIApAQCAtMTg2Niw3ICsxODkxLDcgQEAKIEBlbmQgdGFibGUKIAogQGl0ZW0gY21wCi1TZXQgZnVsbCBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbiBjb21wYXJhdGlvbiBhbGdvcml0aG0uIFBvc3NpYmxlIHZhbHVlczoKK1NldCBmdWxsIHBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uIGNvbXBhcmlzb24gYWxnb3JpdGhtLiBQb3NzaWJsZSB2YWx1ZXM6CiAKIEB0YWJsZSBAc2FtcAogQGl0ZW0gY2hyb21hCkBAIC0yMDkyLDEyICsyMTE3LDEyIEBACiAKIEZvciBleGFtcGxlIHRvIHNwZWNpZnkgbGlieDI2NCBlbmNvZGluZyBvcHRpb25zIHdpdGggQGNvbW1hbmR7ZmZtcGVnfToKIEBleGFtcGxlCi1mZm1wZWcgLWkgZm9vLm1wZyAtdmNvZGVjIGxpYngyNjQgLXgyNjRvcHRzIGtleWludD0xMjM6bWluLWtleWludD0yMCAtYW4gb3V0Lm1rdgorZmZtcGVnIC1pIGZvby5tcGcgLWM6diBsaWJ4MjY0IC14MjY0b3B0cyBrZXlpbnQ9MTIzOm1pbi1rZXlpbnQ9MjAgLWFuIG91dC5ta3YKIEBlbmQgZXhhbXBsZQogCiBAaXRlbSBhNTNjYyBAdmFye2Jvb2xlYW59CiBJbXBvcnQgY2xvc2VkIGNhcHRpb25zICh3aGljaCBtdXN0IGJlIEFUU0MgY29tcGF0aWJsZSBmb3JtYXQpIGludG8gb3V0cHV0LgotT25seSB0aGUgbXBlZzIgYW5kIGgyNjQgZGVjb2RlcnMgcHJvdmlkZSB0aGVzZS4gRGVmYXVsdCBpcyAwIChvZmYpLgorT25seSB0aGUgbXBlZzIgYW5kIGgyNjQgZGVjb2RlcnMgcHJvdmlkZSB0aGVzZS4gRGVmYXVsdCBpcyAxIChvbikuCiAKIEBpdGVtIHgyNjQtcGFyYW1zIChOLkEuKQogT3ZlcnJpZGUgdGhlIHgyNjQgY29uZmlndXJhdGlvbiB1c2luZyBhIDotc2VwYXJhdGVkIGxpc3Qgb2Yga2V5PXZhbHVlCkBAIC0yMTM0LDYgKzIxNTksMTYgQEAKIEBpdGVtIHR1bmUKIFNldCB0aGUgeDI2NSB0dW5lIHBhcmFtZXRlci4KIAorQGl0ZW0gcHJvZmlsZQorU2V0IHByb2ZpbGUgcmVzdHJpY3Rpb25zLgorCitAaXRlbSBjcmYKK1NldCB0aGUgcXVhbGl0eSBmb3IgY29uc3RhbnQgcXVhbGl0eSBtb2RlLgorCitAaXRlbSBmb3JjZWQtaWRyCitOb3JtYWxseSwgd2hlbiBmb3JjaW5nIGEgSS1mcmFtZSB0eXBlLCB0aGUgZW5jb2RlciBjYW4gc2VsZWN0IGFueSB0eXBlCitvZiBJLWZyYW1lLiBUaGlzIG9wdGlvbiBmb3JjZXMgaXQgdG8gY2hvb3NlIGFuIElEUi1mcmFtZS4KKwogQGl0ZW0geDI2NS1wYXJhbXMKIFNldCB4MjY1IG9wdGlvbnMgdXNpbmcgYSBsaXN0IG9mIEB2YXJ7a2V5fT1AdmFye3ZhbHVlfSBjb3VwbGVzIHNlcGFyYXRlZAogYnkgIjoiLiBTZWUgQGNvbW1hbmR7eDI2NSAtLWhlbHB9IGZvciBhIGxpc3Qgb2Ygb3B0aW9ucy4KQEAgLTIzMzAsNiArMjM2NSwxMSBAQAogQGl0ZW14IGFsd2F5cwogQWx3YXlzIHdyaXRlIGl0LgogQGVuZCB0YWJsZQorQGl0ZW0gdmlkZW9fZm9ybWF0IEB2YXJ7aW50ZWdlcn0KK1NwZWNpZmllcyB0aGUgdmlkZW9fZm9ybWF0IHdyaXR0ZW4gaW50byB0aGUgc2VxdWVuY2UgZGlzcGxheSBleHRlbnNpb24KK2luZGljYXRpbmcgdGhlIHNvdXJjZSBvZiB0aGUgdmlkZW8gcGljdHVyZXMuIFRoZSBkZWZhdWx0IGlzIEBzYW1we3Vuc3BlY2lmaWVkfSwKK2NhbiBiZSBAc2FtcHtjb21wb25lbnR9LCBAc2FtcHtwYWx9LCBAc2FtcHtudHNjfSwgQHNhbXB7c2VjYW19IG9yIEBzYW1we21hY30uCitGb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5LCB1c2UgQHNhbXB7Y29tcG9uZW50fS4KIEBlbmQgdGFibGUKIAogQHNlY3Rpb24gcG5nCkBAIC0yMzYzLDYgKzI0MDMsNyBAQAogQGl0ZW0gc3RhbmRhcmQKIEBpdGVtIGhxCiBAaXRlbSA0NDQ0CitAaXRlbSA0NDQ0eHEKIEBlbmQgdGFibGUKIAogQGl0ZW0gcXVhbnRfbWF0IEB2YXJ7aW50ZWdlcn0KQEAgLTI0MTIsMjcgKzI0NTMsNiBAQAogRm9yIHRoZSBmYXN0ZXN0IGVuY29kaW5nIHNwZWVkIHNldCB0aGUgQG9wdGlvbntxc2NhbGV9IHBhcmFtZXRlciAoNCBpcyB0aGUKIHJlY29tbWVuZGVkIHZhbHVlKSBhbmQgZG8gbm90IHNldCBhIHNpemUgY29uc3RyYWludC4KIAotQHNlY3Rpb24gbGlia3ZhemFhcgotCi1LdmF6YWFyIEguMjY1L0hFVkMgZW5jb2Rlci4KLQotUmVxdWlyZXMgdGhlIHByZXNlbmNlIG9mIHRoZSBsaWJrdmF6YWFyIGhlYWRlcnMgYW5kIGxpYnJhcnkgZHVyaW5nCi1jb25maWd1cmF0aW9uLiBZb3UgbmVlZCB0byBleHBsaWNpdGx5IGNvbmZpZ3VyZSB0aGUgYnVpbGQgd2l0aAotQG9wdGlvbnstLWVuYWJsZS1saWJrdmF6YWFyfS4KLQotQHN1YnNlY3Rpb24gT3B0aW9ucwotCi1AdGFibGUgQG9wdGlvbgotCi1AaXRlbSBiCi1TZXQgdGFyZ2V0IHZpZGVvIGJpdHJhdGUgaW4gYml0L3MgYW5kIGVuYWJsZSByYXRlIGNvbnRyb2wuCi0KLUBpdGVtIGt2YXphYXItcGFyYW1zCi1TZXQga3ZhemFhciBwYXJhbWV0ZXJzIGFzIGEgbGlzdCBvZiBAdmFye25hbWV9PUB2YXJ7dmFsdWV9IHBhaXJzIHNlcGFyYXRlZAotYnkgY29tbWFzICgsKS4gU2VlIGt2YXphYXIgZG9jdW1lbnRhdGlvbiBmb3IgYSBsaXN0IG9mIG9wdGlvbnMuCi0KLUBlbmQgdGFibGUKLQogQHNlY3Rpb24gUVNWIGVuY29kZXJzCiAKIFRoZSBmYW1pbHkgb2YgSW50ZWwgUXVpY2tTeW5jIFZpZGVvIGVuY29kZXJzIChNUEVHLTIsIEguMjY0IGFuZCBIRVZDKQpAQCAtMjUyMSw2ICsyNTQxLDEyNiBAQAogCiBAZW5kIGl0ZW1pemUKIAorQHNlY3Rpb24gc25vdworCitAc3Vic2VjdGlvbiBPcHRpb25zCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBpdGVyYXRpdmVfZGlhX3NpemUKK2RpYSBzaXplIGZvciB0aGUgaXRlcmF0aXZlIG1vdGlvbiBlc3RpbWF0aW9uCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIFZBQVBJIGVuY29kZXJzCisKK1dyYXBwZXJzIGZvciBoYXJkd2FyZSBlbmNvZGVycyBhY2Nlc3NpYmxlIHZpYSBWQUFQSS4KKworVGhlc2UgZW5jb2RlcnMgb25seSBhY2NlcHQgaW5wdXQgaW4gVkFBUEkgaGFyZHdhcmUgc3VyZmFjZXMuICBJZiB5b3UgaGF2ZSBpbnB1dAoraW4gc29mdHdhcmUgZnJhbWVzLCB1c2UgdGhlIEBvcHRpb257aHd1cGxvYWR9IGZpbHRlciB0byB1cGxvYWQgdGhlbSB0byB0aGUgR1BVLgorCitUaGUgZm9sbG93aW5nIHN0YW5kYXJkIGxpYmF2Y29kZWMgb3B0aW9ucyBhcmUgdXNlZDoKK0BpdGVtaXplCitAaXRlbQorQG9wdGlvbntnfSAvIEBvcHRpb257Z29wX3NpemV9CitAaXRlbQorQG9wdGlvbntiZn0gLyBAb3B0aW9ue21heF9iX2ZyYW1lc30KK0BpdGVtCitAb3B0aW9ue3Byb2ZpbGV9CitAaXRlbQorQG9wdGlvbntsZXZlbH0KK0BpdGVtCitAb3B0aW9ue2J9IC8gQG9wdGlvbntiaXRfcmF0ZX0KK0BpdGVtCitAb3B0aW9ue21heHJhdGV9IC8gQG9wdGlvbntyY19tYXhfcmF0ZX0KK0BpdGVtCitAb3B0aW9ue2J1ZnNpemV9IC8gQG9wdGlvbntyY19idWZmZXJfc2l6ZX0KK0BpdGVtCitAb3B0aW9ue3JjX2luaXRfb2NjdXBhbmN5fSAvIEBvcHRpb257cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5fQorQGl0ZW0KK0BvcHRpb257Y29tcHJlc3Npb25fbGV2ZWx9CisKK1NwZWVkIC8gcXVhbGl0eSB0cmFkZW9mZjogaGlnaGVyIHZhbHVlcyBhcmUgZmFzdGVyIC8gd29yc2UgcXVhbGl0eS4KK0BpdGVtCitAb3B0aW9ue3F9IC8gQG9wdGlvbntnbG9iYWxfcXVhbGl0eX0KKworU2l6ZSAvIHF1YWxpdHkgdHJhZGVvZmY6IGhpZ2hlciB2YWx1ZXMgYXJlIHNtYWxsZXIgLyB3b3JzZSBxdWFsaXR5LgorQGl0ZW0KK0BvcHRpb257cW1pbn0KKyhvbmx5OiBAb3B0aW9ue3FtYXh9IGlzIG5vdCBzdXBwb3J0ZWQpCitAaXRlbQorQG9wdGlvbntpX3FmYWN0b3J9IC8gQG9wdGlvbntpX3F1YW50X2ZhY3Rvcn0KK0BpdGVtCitAb3B0aW9ue2lfcW9mZnNldH0gLyBAb3B0aW9ue2lfcXVhbnRfb2Zmc2V0fQorQGl0ZW0KK0BvcHRpb257Yl9xZmFjdG9yfSAvIEBvcHRpb257Yl9xdWFudF9mYWN0b3J9CitAaXRlbQorQG9wdGlvbntiX3FvZmZzZXR9IC8gQG9wdGlvbntiX3F1YW50X29mZnNldH0KK0BlbmQgaXRlbWl6ZQorCitAdGFibGUgQG9wdGlvbgorCitAaXRlbSBoMjY0X3ZhYXBpCitAb3B0aW9ue3Byb2ZpbGV9IHNldHMgdGhlIHZhbHVlIG9mIEBlbXBoe3Byb2ZpbGVfaWRjfSBhbmQgdGhlIEBlbXBoe2NvbnN0cmFpbnRfc2V0Kl9mbGFnfXMuCitAb3B0aW9ue2xldmVsfSBzZXRzIHRoZSB2YWx1ZSBvZiBAZW1waHtsZXZlbF9pZGN9LgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gbG93X3Bvd2VyCitVc2UgbG93LXBvd2VyIGVuY29kaW5nIG1vZGUuCitAaXRlbSBjb2RlcgorU2V0IGVudHJvcHkgZW5jb2RlciAoZGVmYXVsdCBpcyBAZW1waHtjYWJhY30pLiAgUG9zc2libGUgdmFsdWVzOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIGFjCitAaXRlbSBjYWJhYworVXNlIENBQkFDLgorCitAaXRlbSB2bGMKK0BpdGVtIGNhdmxjCitVc2UgQ0FWTEMuCitAZW5kIHRhYmxlCitAZW5kIHRhYmxlCisKK0BpdGVtIGhldmNfdmFhcGkKK0BvcHRpb257cHJvZmlsZX0gYW5kIEBvcHRpb257bGV2ZWx9IHNldCB0aGUgdmFsdWVzIG9mCitAZW1waHtnZW5lcmFsX3Byb2ZpbGVfaWRjfSBhbmQgQGVtcGh7Z2VuZXJhbF9sZXZlbF9pZGN9IHJlc3BlY3RpdmVseS4KKworQGl0ZW0gbWpwZWdfdmFhcGkKK0Fsd2F5cyBlbmNvZGVzIHVzaW5nIHRoZSBzdGFuZGFyZCBxdWFudGlzYXRpb24gYW5kIGh1ZmZtYW4gdGFibGVzIC0KK0BvcHRpb257Z2xvYmFsX3F1YWxpdHl9IHNjYWxlcyB0aGUgc3RhbmRhcmQgcXVhbnRpc2F0aW9uIHRhYmxlIChyYW5nZSAxLTEwMCkuCisKK0BpdGVtIG1wZWcyX3ZhYXBpCitAb3B0aW9ue3Byb2ZpbGV9IGFuZCBAb3B0aW9ue2xldmVsfSBzZXQgdGhlIHZhbHVlIG9mIEBlbXBoe3Byb2ZpbGVfYW5kX2xldmVsX2luZGljYXRpb259LgorCitObyByYXRlIGNvbnRyb2wgaXMgc3VwcG9ydGVkLgorCitAaXRlbSB2cDhfdmFhcGkKK0ItZnJhbWVzIGFyZSBub3Qgc3VwcG9ydGVkLgorCitAb3B0aW9ue2dsb2JhbF9xdWFsaXR5fSBzZXRzIHRoZSBAZW1waHtxX2lkeH0gdXNlZCBmb3Igbm9uLWtleSBmcmFtZXMgKHJhbmdlIDAtMTI3KS4KKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGxvb3BfZmlsdGVyX2xldmVsCitAaXRlbSBsb29wX2ZpbHRlcl9zaGFycG5lc3MKK01hbnVhbGx5IHNldCB0aGUgbG9vcCBmaWx0ZXIgcGFyYW1ldGVycy4KK0BlbmQgdGFibGUKKworQGl0ZW0gdnA5X3ZhYXBpCitAb3B0aW9ue2dsb2JhbF9xdWFsaXR5fSBzZXRzIHRoZSBAZW1waHtxX2lkeH0gdXNlZCBmb3IgUC1mcmFtZXMgKHJhbmdlIDAtMjU1KS4KKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGxvb3BfZmlsdGVyX2xldmVsCitAaXRlbSBsb29wX2ZpbHRlcl9zaGFycG5lc3MKK01hbnVhbGx5IHNldCB0aGUgbG9vcCBmaWx0ZXIgcGFyYW1ldGVycy4KK0BlbmQgdGFibGUKKworQi1mcmFtZXMgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZSBvdXRwdXQgc3RyZWFtIGlzIGFsd2F5cyBpbiBlbmNvZGUgb3JkZXIgcmF0aGVyIHRoYW4gZGlzcGxheQorb3JkZXIuICBJZiBCLWZyYW1lcyBhcmUgZW5hYmxlZCwgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byB1c2UgdGhlIEBvcHRpb257dnA5X3Jhd19yZW9yZGVyfQorYml0c3RyZWFtIGZpbHRlciB0byBtb2RpZnkgdGhlIG91dHB1dCBzdHJlYW0gdG8gZGlzcGxheSBmcmFtZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIuCisKK09ubHkgbm9ybWFsIGZyYW1lcyBhcmUgcHJvZHVjZWQgLSB0aGUgQG9wdGlvbnt2cDlfc3VwZXJmcmFtZX0gYml0c3RyZWFtIGZpbHRlciBtYXkgYmUKK3JlcXVpcmVkIHRvIHByb2R1Y2UgYSBzdHJlYW0gdXNhYmxlIHdpdGggYWxsIGRlY29kZXJzLgorCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIHZjMgogCiBTTVBURSBWQy0yIChwcmV2aW91c2x5IEJCQyBEaXJhYyBQcm8pLiBUaGlzIGNvZGVjIHdhcyBwcmltYXJpbHkgYWltZWQgYXQKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9NYWtlZmlsZSBiL2RvYy9leGFtcGxlcy9NYWtlZmlsZQppbmRleCBhZjM4MTU5Li45MjhmZjMwIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvTWFrZWZpbGUKKysrIGIvZG9jL2V4YW1wbGVzL01ha2VmaWxlCkBAIC0xLDQ2ICsxLDY0IEBACi0jIHVzZSBwa2ctY29uZmlnIGZvciBnZXR0aW5nIENGTEFHUyBhbmQgTERMSUJTCi1GRk1QRUdfTElCUz0gICAgbGliYXZkZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGliYXZmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGliYXZmaWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGliYXZjb2RlYyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGlic3dyZXNhbXBsZSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGlic3dzY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbGliYXZ1dGlsICAgICAgICAgICAgICAgICAgICAgICAgICBcCitFWEFNUExFUy0kKENPTkZJR19BVklPX0RJUl9DTURfRVhBTVBMRSkgICAgICArPSBhdmlvX2Rpcl9jbWQKK0VYQU1QTEVTLSQoQ09ORklHX0FWSU9fUkVBRElOR19FWEFNUExFKSAgICAgICs9IGF2aW9fcmVhZGluZworRVhBTVBMRVMtJChDT05GSUdfREVDT0RFX0FVRElPX0VYQU1QTEUpICAgICAgKz0gZGVjb2RlX2F1ZGlvCitFWEFNUExFUy0kKENPTkZJR19ERUNPREVfVklERU9fRVhBTVBMRSkgICAgICArPSBkZWNvZGVfdmlkZW8KK0VYQU1QTEVTLSQoQ09ORklHX0RFTVVYSU5HX0RFQ09ESU5HX0VYQU1QTEUpICs9IGRlbXV4aW5nX2RlY29kaW5nCitFWEFNUExFUy0kKENPTkZJR19FTkNPREVfQVVESU9fRVhBTVBMRSkgICAgICArPSBlbmNvZGVfYXVkaW8KK0VYQU1QTEVTLSQoQ09ORklHX0VOQ09ERV9WSURFT19FWEFNUExFKSAgICAgICs9IGVuY29kZV92aWRlbworRVhBTVBMRVMtJChDT05GSUdfRVhUUkFDVF9NVlNfRVhBTVBMRSkgICAgICAgKz0gZXh0cmFjdF9tdnMKK0VYQU1QTEVTLSQoQ09ORklHX0ZJTFRFUl9BVURJT19FWEFNUExFKSAgICAgICs9IGZpbHRlcl9hdWRpbworRVhBTVBMRVMtJChDT05GSUdfRklMVEVSSU5HX0FVRElPX0VYQU1QTEUpICAgKz0gZmlsdGVyaW5nX2F1ZGlvCitFWEFNUExFUy0kKENPTkZJR19GSUxURVJJTkdfVklERU9fRVhBTVBMRSkgICArPSBmaWx0ZXJpbmdfdmlkZW8KK0VYQU1QTEVTLSQoQ09ORklHX0hUVFBfTVVMVElDTElFTlRfRVhBTVBMRSkgICs9IGh0dHBfbXVsdGljbGllbnQKK0VYQU1QTEVTLSQoQ09ORklHX0hXX0RFQ09ERV9FWEFNUExFKSAgICAgICAgICs9IGh3X2RlY29kZQorRVhBTVBMRVMtJChDT05GSUdfTUVUQURBVEFfRVhBTVBMRSkgICAgICAgICAgKz0gbWV0YWRhdGEKK0VYQU1QTEVTLSQoQ09ORklHX01VWElOR19FWEFNUExFKSAgICAgICAgICAgICs9IG11eGluZworRVhBTVBMRVMtJChDT05GSUdfUVNWREVDX0VYQU1QTEUpICAgICAgICAgICAgKz0gcXN2ZGVjCitFWEFNUExFUy0kKENPTkZJR19SRU1VWElOR19FWEFNUExFKSAgICAgICAgICArPSByZW11eGluZworRVhBTVBMRVMtJChDT05GSUdfUkVTQU1QTElOR19BVURJT19FWEFNUExFKSAgKz0gcmVzYW1wbGluZ19hdWRpbworRVhBTVBMRVMtJChDT05GSUdfU0NBTElOR19WSURFT19FWEFNUExFKSAgICAgKz0gc2NhbGluZ192aWRlbworRVhBTVBMRVMtJChDT05GSUdfVFJBTlNDT0RFX0FBQ19FWEFNUExFKSAgICAgKz0gdHJhbnNjb2RlX2FhYworRVhBTVBMRVMtJChDT05GSUdfVFJBTlNDT0RJTkdfRVhBTVBMRSkgICAgICAgKz0gdHJhbnNjb2RpbmcKK0VYQU1QTEVTLSQoQ09ORklHX1ZBQVBJX0VOQ09ERV9FWEFNUExFKSAgICAgICs9IHZhYXBpX2VuY29kZQorRVhBTVBMRVMtJChDT05GSUdfVkFBUElfVFJBTlNDT0RFX0VYQU1QTEUpICAgKz0gdmFhcGlfdHJhbnNjb2RlCiAKLUNGTEFHUyArPSAtV2FsbCAtZwotQ0ZMQUdTIDo9ICQoc2hlbGwgcGtnLWNvbmZpZyAtLWNmbGFncyAkKEZGTVBFR19MSUJTKSkgJChDRkxBR1MpCi1MRExJQlMgOj0gJChzaGVsbCBwa2ctY29uZmlnIC0tbGlicyAkKEZGTVBFR19MSUJTKSkgJChMRExJQlMpCitFWEFNUExFUyAgICAgICA6PSAkKEVYQU1QTEVTLXllczolPWRvYy9leGFtcGxlcy8lJChQUk9HU1NVRikkKEVYRVNVRikpCitFWEFNUExFU19HICAgICA6PSAkKEVYQU1QTEVTLXllczolPWRvYy9leGFtcGxlcy8lJChQUk9HU1NVRilfZyQoRVhFU1VGKSkKK0FMTF9FWEFNUExFUyAgIDo9ICQoRVhBTVBMRVMpICQoRVhBTVBMRVMtOiU9ZG9jL2V4YW1wbGVzLyUkKFBST0dTU1VGKSQoRVhFU1VGKSkKK0FMTF9FWEFNUExFU19HIDo9ICQoRVhBTVBMRVNfRykgJChFWEFNUExFUy06JT1kb2MvZXhhbXBsZXMvJSQoUFJPR1NTVUYpX2ckKEVYRVNVRikpCitQUk9HUyAgICAgICAgICArPSAkKEVYQU1QTEVTKQogCi1FWEFNUExFUz0gICAgICAgYXZpb19kaXJfY21kICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgYXZpb19yZWFkaW5nICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgZGVjb2RpbmdfZW5jb2RpbmcgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgZGVtdXhpbmdfZGVjb2RpbmcgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgZXh0cmFjdF9tdnMgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgZmlsdGVyaW5nX3ZpZGVvICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgZmlsdGVyaW5nX2F1ZGlvICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgaHR0cF9tdWx0aWNsaWVudCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbWV0YWRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbXV4aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgcmVtdXhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgcmVzYW1wbGluZ19hdWRpbyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgc2NhbGluZ192aWRlbyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgdHJhbnNjb2RlX2FhYyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgdHJhbnNjb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICBcCitFWEFNUExFX01BS0VGSUxFIDo9ICQoU1JDX1BBVEgpL2RvYy9leGFtcGxlcy9NYWtlZmlsZQorRVhBTVBMRVNfRklMRVMgOj0gJCh3aWxkY2FyZCAkKFNSQ19QQVRIKS9kb2MvZXhhbXBsZXMvKi5jKSAkKFNSQ19QQVRIKS9kb2MvZXhhbXBsZXMvUkVBRE1FICQoRVhBTVBMRV9NQUtFRklMRSkKIAotT0JKUz0kKGFkZHN1ZmZpeCAubywkKEVYQU1QTEVTKSkKKyQoZm9yZWFjaCBQLCQoRVhBTVBMRVMpLCQoZXZhbCBPQkpTLSQoUDolJChQUk9HU1NVRikkKEVYRVNVRik9JSkgPSAkKFA6JSQoUFJPR1NTVUYpJChFWEVTVUYpPSUpLm8pKQorJChFWEFNUExFU19HKTogJSQoUFJPR1NTVUYpX2ckKEVYRVNVRik6ICUubwogCi0jIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgbWFrZSBleHBsaWNpdCB1c2Ugb2YgdGhlIG1hdGggbGlicmFyeQotYXZjb2RlYzogICAgICAgICAgIExETElCUyArPSAtbG0KLWRlY29kaW5nX2VuY29kaW5nOiBMRExJQlMgKz0gLWxtCi1tdXhpbmc6ICAgICAgICAgICAgTERMSUJTICs9IC1sbQotcmVzYW1wbGluZ19hdWRpbzogIExETElCUyArPSAtbG0KK2V4YW1wbGVzOiAkKEVYQU1QTEVTKQogCi0ucGhvbnk6IGFsbCBjbGVhbi10ZXN0IGNsZWFuCiskKEVYQU1QTEVTOiUkKFBST0dTU1VGKSQoRVhFU1VGKT0lLm8pOiB8IGRvYy9leGFtcGxlcworT0JKRElSUyArPSBkb2MvZXhhbXBsZXMKIAotYWxsOiAkKE9CSlMpICQoRVhBTVBMRVMpCitET1hZX0lOUFVUICs9ICQoRVhBTVBMRVM6JSQoUFJPR1NTVUYpJChFWEVTVUYpPSUuYykKIAotY2xlYW4tdGVzdDoKLQkkKFJNKSB0ZXN0Ki5wZ20gdGVzdC5oMjY0IHRlc3QubXAyIHRlc3Quc3cgdGVzdC5tcGcKK2luc3RhbGw6IGluc3RhbGwtZXhhbXBsZXMKIAotY2xlYW46IGNsZWFuLXRlc3QKLQkkKFJNKSAkKEVYQU1QTEVTKSAkKE9CSlMpCitpbnN0YWxsLWV4YW1wbGVzOiAkKEVYQU1QTEVTX0ZJTEVTKQorCSQoUSlta2RpciAtcCAiJChEQVRBRElSKS9leGFtcGxlcyIKKwkkKElOU1RBTEwpIC1tIDY0NCAkKEVYQU1QTEVTX0ZJTEVTKSAiJChEQVRBRElSKS9leGFtcGxlcyIKKwkkKElOU1RBTEwpIC1tIDY0NCAkKEVYQU1QTEVfTUFLRUZJTEU6JT0lLmV4YW1wbGUpICIkKERBVEFESVIpL2V4YW1wbGVzL01ha2VmaWxlIgorCit1bmluc3RhbGw6IHVuaW5zdGFsbC1leGFtcGxlcworCit1bmluc3RhbGwtZXhhbXBsZXM6CisJJChSTSkgLXIgIiQoREFUQURJUikvZXhhbXBsZXMiCisKK2V4YW1wbGVzY2xlYW46CisJJChSTSkgJChBTExfRVhBTVBMRVMpICQoQUxMX0VYQU1QTEVTX0cpCisJJChSTSkgJChDTEVBTlNVRkZJWEVTOiU9ZG9jL2V4YW1wbGVzLyUpCisKK2RvY2NsZWFuOjogZXhhbXBsZXNjbGVhbgorCistaW5jbHVkZSAkKHdpbGRjYXJkICQoRVhBTVBMRVM6JSQoUFJPR1NTVUYpJChFWEVTVUYpPSUuZCkpCisKKy5QSE9OWTogZXhhbXBsZXMKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9NYWtlZmlsZS5leGFtcGxlIGIvZG9jL2V4YW1wbGVzL01ha2VmaWxlLmV4YW1wbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQyODE1NAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9NYWtlZmlsZS5leGFtcGxlCkBAIC0wLDAgKzEsNTAgQEAKKyMgdXNlIHBrZy1jb25maWcgZm9yIGdldHRpbmcgQ0ZMQUdTIGFuZCBMRExJQlMKK0ZGTVBFR19MSUJTPSAgICBsaWJhdmRldmljZSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBsaWJhdmZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBsaWJhdmZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBsaWJhdmNvZGVjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBsaWJzd3Jlc2FtcGxlICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBsaWJzd3NjYWxlICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBsaWJhdnV0aWwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworQ0ZMQUdTICs9IC1XYWxsIC1nCitDRkxBR1MgOj0gJChzaGVsbCBwa2ctY29uZmlnIC0tY2ZsYWdzICQoRkZNUEVHX0xJQlMpKSAkKENGTEFHUykKK0xETElCUyA6PSAkKHNoZWxsIHBrZy1jb25maWcgLS1saWJzICQoRkZNUEVHX0xJQlMpKSAkKExETElCUykKKworRVhBTVBMRVM9ICAgICAgIGF2aW9fZGlyX2NtZCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGF2aW9fcmVhZGluZyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRlY29kZV9hdWRpbyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRlY29kZV92aWRlbyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRlbXV4aW5nX2RlY29kaW5nICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGVuY29kZV9hdWRpbyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGVuY29kZV92aWRlbyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGV4dHJhY3RfbXZzICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZpbHRlcmluZ192aWRlbyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZpbHRlcmluZ19hdWRpbyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGh0dHBfbXVsdGljbGllbnQgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGh3X2RlY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1ldGFkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG11eGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJlbXV4aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJlc2FtcGxpbmdfYXVkaW8gICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNjYWxpbmdfdmlkZW8gICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRyYW5zY29kZV9hYWMgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRyYW5zY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgXAorCitPQkpTPSQoYWRkc3VmZml4IC5vLCQoRVhBTVBMRVMpKQorCisjIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgbWFrZSBleHBsaWNpdCB1c2Ugb2YgdGhlIG1hdGggbGlicmFyeQorYXZjb2RlYzogICAgICAgICAgIExETElCUyArPSAtbG0KK2VuY29kZV9hdWRpbzogICAgICBMRExJQlMgKz0gLWxtCittdXhpbmc6ICAgICAgICAgICAgTERMSUJTICs9IC1sbQorcmVzYW1wbGluZ19hdWRpbzogIExETElCUyArPSAtbG0KKworLnBob255OiBhbGwgY2xlYW4tdGVzdCBjbGVhbgorCithbGw6ICQoT0JKUykgJChFWEFNUExFUykKKworY2xlYW4tdGVzdDoKKwkkKFJNKSB0ZXN0Ki5wZ20gdGVzdC5oMjY0IHRlc3QubXAyIHRlc3Quc3cgdGVzdC5tcGcKKworY2xlYW46IGNsZWFuLXRlc3QKKwkkKFJNKSAkKEVYQU1QTEVTKSAkKE9CSlMpCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvYXZpb19kaXJfY21kLmMgYi9kb2MvZXhhbXBsZXMvYXZpb19kaXJfY21kLmMKaW5kZXggNTBjNDM1Yy4uMDcyMmJkOSAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2F2aW9fZGlyX2NtZC5jCisrKyBiL2RvYy9leGFtcGxlcy9hdmlvX2Rpcl9jbWQuYwpAQCAtMTQzLDggKzE0Myw2IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIC8qIHJlZ2lzdGVyIGNvZGVjcyBhbmQgZm9ybWF0cyBhbmQgb3RoZXIgbGF2Zi9sYXZjIGNvbXBvbmVudHMqLwotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwogICAgIGF2Zm9ybWF0X25ldHdvcmtfaW5pdCgpOwogCiAgICAgb3AgPSBhcmd2WzFdOwpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2F2aW9fcmVhZGluZy5jIGIvZG9jL2V4YW1wbGVzL2F2aW9fcmVhZGluZy5jCmluZGV4IDAyNDc0ZTkuLmNiZmViMTcgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9hdmlvX3JlYWRpbmcuYworKysgYi9kb2MvZXhhbXBsZXMvYXZpb19yZWFkaW5nLmMKQEAgLTQ0LDYgKzQ0LDggQEAKICAgICBzdHJ1Y3QgYnVmZmVyX2RhdGEgKmJkID0gKHN0cnVjdCBidWZmZXJfZGF0YSAqKW9wYXF1ZTsKICAgICBidWZfc2l6ZSA9IEZGTUlOKGJ1Zl9zaXplLCBiZC0+c2l6ZSk7CiAKKyAgICBpZiAoIWJ1Zl9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAgICAgcHJpbnRmKCJwdHI6JXAgc2l6ZTolenVcbiIsIGJkLT5wdHIsIGJkLT5zaXplKTsKIAogICAgIC8qIGNvcHkgaW50ZXJuYWwgYnVmZmVyIGRhdGEgdG8gYnVmICovCkBAIC03Miw5ICs3NCw2IEBACiAgICAgfQogICAgIGlucHV0X2ZpbGVuYW1lID0gYXJndlsxXTsKIAotICAgIC8qIHJlZ2lzdGVyIGNvZGVjcyBhbmQgZm9ybWF0cyBhbmQgb3RoZXIgbGF2Zi9sYXZjIGNvbXBvbmVudHMqLwotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwotCiAgICAgLyogc2x1cnAgZmlsZSBjb250ZW50IGludG8gYnVmZmVyICovCiAgICAgcmV0ID0gYXZfZmlsZV9tYXAoaW5wdXRfZmlsZW5hbWUsICZidWZmZXIsICZidWZmZXJfc2l6ZSwgMCwgTlVMTCk7CiAgICAgaWYgKHJldCA8IDApCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZGVjb2RlX2F1ZGlvLmMgYi9kb2MvZXhhbXBsZXMvZGVjb2RlX2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkY2FmZAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9kZWNvZGVfYXVkaW8uYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gZGVjb2Rpbmcgd2l0aCBsaWJhdmNvZGVjIEFQSSBleGFtcGxlCisgKgorICogQGV4YW1wbGUgZGVjb2RlX2F1ZGlvLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmF2dXRpbC9mcmFtZS5oPgorI2luY2x1ZGUgPGxpYmF2dXRpbC9tZW0uaD4KKworI2luY2x1ZGUgPGxpYmF2Y29kZWMvYXZjb2RlYy5oPgorCisjZGVmaW5lIEFVRElPX0lOQlVGX1NJWkUgMjA0ODAKKyNkZWZpbmUgQVVESU9fUkVGSUxMX1RIUkVTSCA0MDk2CisKK3N0YXRpYyB2b2lkIGRlY29kZShBVkNvZGVjQ29udGV4dCAqZGVjX2N0eCwgQVZQYWNrZXQgKnBrdCwgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgRklMRSAqb3V0ZmlsZSkKK3sKKyAgICBpbnQgaSwgY2g7CisgICAgaW50IHJldCwgZGF0YV9zaXplOworCisgICAgLyogc2VuZCB0aGUgcGFja2V0IHdpdGggdGhlIGNvbXByZXNzZWQgZGF0YSB0byB0aGUgZGVjb2RlciAqLworICAgIHJldCA9IGF2Y29kZWNfc2VuZF9wYWNrZXQoZGVjX2N0eCwgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHN1Ym1pdHRpbmcgdGhlIHBhY2tldCB0byB0aGUgZGVjb2RlclxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogcmVhZCBhbGwgdGhlIG91dHB1dCBmcmFtZXMgKGluIGdlbmVyYWwgdGhlcmUgbWF5IGJlIGFueSBudW1iZXIgb2YgdGhlbSAqLworICAgIHdoaWxlIChyZXQgPj0gMCkgeworICAgICAgICByZXQgPSBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoZGVjX2N0eCwgZnJhbWUpOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZHVyaW5nIGRlY29kaW5nXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9zaXplID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoZGVjX2N0eC0+c2FtcGxlX2ZtdCk7CisgICAgICAgIGlmIChkYXRhX3NpemUgPCAwKSB7CisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBub3Qgb2NjdXIsIGNoZWNraW5nIGp1c3QgZm9yIHBhcmFub2lhICovCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjYWxjdWxhdGUgZGF0YSBzaXplXG4iKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9zYW1wbGVzOyBpKyspCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBkZWNfY3R4LT5jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgICAgICBmd3JpdGUoZnJhbWUtPmRhdGFbY2hdICsgZGF0YV9zaXplKmksIDEsIGRhdGFfc2l6ZSwgb3V0ZmlsZSk7CisgICAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgY29uc3QgY2hhciAqb3V0ZmlsZW5hbWUsICpmaWxlbmFtZTsKKyAgICBjb25zdCBBVkNvZGVjICpjb2RlYzsKKyAgICBBVkNvZGVjQ29udGV4dCAqYz0gTlVMTDsKKyAgICBBVkNvZGVjUGFyc2VyQ29udGV4dCAqcGFyc2VyID0gTlVMTDsKKyAgICBpbnQgbGVuLCByZXQ7CisgICAgRklMRSAqZiwgKm91dGZpbGU7CisgICAgdWludDhfdCBpbmJ1ZltBVURJT19JTkJVRl9TSVpFICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV07CisgICAgdWludDhfdCAqZGF0YTsKKyAgICBzaXplX3QgICBkYXRhX3NpemU7CisgICAgQVZQYWNrZXQgKnBrdDsKKyAgICBBVkZyYW1lICpkZWNvZGVkX2ZyYW1lID0gTlVMTDsKKworICAgIGlmIChhcmdjIDw9IDIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgPGlucHV0IGZpbGU+IDxvdXRwdXQgZmlsZT5cbiIsIGFyZ3ZbMF0pOworICAgICAgICBleGl0KDApOworICAgIH0KKyAgICBmaWxlbmFtZSAgICA9IGFyZ3ZbMV07CisgICAgb3V0ZmlsZW5hbWUgPSBhcmd2WzJdOworCisgICAgcGt0ID0gYXZfcGFja2V0X2FsbG9jKCk7CisKKyAgICAvKiBmaW5kIHRoZSBNUEVHIGF1ZGlvIGRlY29kZXIgKi8KKyAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKEFWX0NPREVDX0lEX01QMik7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvZGVjIG5vdCBmb3VuZFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgcGFyc2VyID0gYXZfcGFyc2VyX2luaXQoY29kZWMtPmlkKTsKKyAgICBpZiAoIXBhcnNlcikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnNlciBub3QgZm91bmRcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGMgPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGNvZGVjKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgYXVkaW8gY29kZWMgY29udGV4dFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogb3BlbiBpdCAqLworICAgIGlmIChhdmNvZGVjX29wZW4yKGMsIGNvZGVjLCBOVUxMKSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBjb2RlY1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAicmIiKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBvdXRmaWxlID0gZm9wZW4ob3V0ZmlsZW5hbWUsICJ3YiIpOworICAgIGlmICghb3V0ZmlsZSkgeworICAgICAgICBhdl9mcmVlKGMpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8qIGRlY29kZSB1bnRpbCBlb2YgKi8KKyAgICBkYXRhICAgICAgPSBpbmJ1ZjsKKyAgICBkYXRhX3NpemUgPSBmcmVhZChpbmJ1ZiwgMSwgQVVESU9fSU5CVUZfU0laRSwgZik7CisKKyAgICB3aGlsZSAoZGF0YV9zaXplID4gMCkgeworICAgICAgICBpZiAoIWRlY29kZWRfZnJhbWUpIHsKKyAgICAgICAgICAgIGlmICghKGRlY29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIGF1ZGlvIGZyYW1lXG4iKTsKKyAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZfcGFyc2VyX3BhcnNlMihwYXJzZXIsIGMsICZwa3QtPmRhdGEsICZwa3QtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX05PUFRTX1ZBTFVFLCBBVl9OT1BUU19WQUxVRSwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIHBhcnNpbmdcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhICAgICAgKz0gcmV0OworICAgICAgICBkYXRhX3NpemUgLT0gcmV0OworCisgICAgICAgIGlmIChwa3QtPnNpemUpCisgICAgICAgICAgICBkZWNvZGUoYywgcGt0LCBkZWNvZGVkX2ZyYW1lLCBvdXRmaWxlKTsKKworICAgICAgICBpZiAoZGF0YV9zaXplIDwgQVVESU9fUkVGSUxMX1RIUkVTSCkgeworICAgICAgICAgICAgbWVtbW92ZShpbmJ1ZiwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGRhdGEgPSBpbmJ1ZjsKKyAgICAgICAgICAgIGxlbiA9IGZyZWFkKGRhdGEgKyBkYXRhX3NpemUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTkJVRl9TSVpFIC0gZGF0YV9zaXplLCBmKTsKKyAgICAgICAgICAgIGlmIChsZW4gPiAwKQorICAgICAgICAgICAgICAgIGRhdGFfc2l6ZSArPSBsZW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmbHVzaCB0aGUgZGVjb2RlciAqLworICAgIHBrdC0+ZGF0YSA9IE5VTEw7CisgICAgcGt0LT5zaXplID0gMDsKKyAgICBkZWNvZGUoYywgcGt0LCBkZWNvZGVkX2ZyYW1lLCBvdXRmaWxlKTsKKworICAgIGZjbG9zZShvdXRmaWxlKTsKKyAgICBmY2xvc2UoZik7CisKKyAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmYyk7CisgICAgYXZfcGFyc2VyX2Nsb3NlKHBhcnNlcik7CisgICAgYXZfZnJhbWVfZnJlZSgmZGVjb2RlZF9mcmFtZSk7CisgICAgYXZfcGFja2V0X2ZyZWUoJnBrdCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9kZWNvZGVfdmlkZW8uYyBiL2RvYy9leGFtcGxlcy9kZWNvZGVfdmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTlkNDNmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL2RlY29kZV92aWRlby5jCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyAqLworCisvKioKKyAqIEBmaWxlCisgKiB2aWRlbyBkZWNvZGluZyB3aXRoIGxpYmF2Y29kZWMgQVBJIGV4YW1wbGUKKyAqCisgKiBAZXhhbXBsZSBkZWNvZGVfdmlkZW8uYworICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bGliYXZjb2RlYy9hdmNvZGVjLmg+CisKKyNkZWZpbmUgSU5CVUZfU0laRSA0MDk2CisKK3N0YXRpYyB2b2lkIHBnbV9zYXZlKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHdyYXAsIGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqZmlsZW5hbWUpCit7CisgICAgRklMRSAqZjsKKyAgICBpbnQgaTsKKworICAgIGYgPSBmb3BlbihmaWxlbmFtZSwidyIpOworICAgIGZwcmludGYoZiwgIlA1XG4lZCAlZFxuJWRcbiIsIHhzaXplLCB5c2l6ZSwgMjU1KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgeXNpemU7IGkrKykKKyAgICAgICAgZndyaXRlKGJ1ZiArIGkgKiB3cmFwLCAxLCB4c2l6ZSwgZik7CisgICAgZmNsb3NlKGYpOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGUoQVZDb2RlY0NvbnRleHQgKmRlY19jdHgsIEFWRnJhbWUgKmZyYW1lLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBhdmNvZGVjX3NlbmRfcGFja2V0KGRlY19jdHgsIHBrdCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBzZW5kaW5nIGEgcGFja2V0IGZvciBkZWNvZGluZ1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgd2hpbGUgKHJldCA+PSAwKSB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9mcmFtZShkZWNfY3R4LCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pIHx8IHJldCA9PSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgZGVjb2RpbmdcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50Zigic2F2aW5nIGZyYW1lICUzZFxuIiwgZGVjX2N0eC0+ZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgLyogdGhlIHBpY3R1cmUgaXMgYWxsb2NhdGVkIGJ5IHRoZSBkZWNvZGVyLiBubyBuZWVkIHRvCisgICAgICAgICAgIGZyZWUgaXQgKi8KKyAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzLSVkIiwgZmlsZW5hbWUsIGRlY19jdHgtPmZyYW1lX251bWJlcik7CisgICAgICAgIHBnbV9zYXZlKGZyYW1lLT5kYXRhWzBdLCBmcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgYnVmKTsKKyAgICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKm91dGZpbGVuYW1lOworICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjOworICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpwYXJzZXI7CisgICAgQVZDb2RlY0NvbnRleHQgKmM9IE5VTEw7CisgICAgRklMRSAqZjsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICB1aW50OF90IGluYnVmW0lOQlVGX1NJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXTsKKyAgICB1aW50OF90ICpkYXRhOworICAgIHNpemVfdCAgIGRhdGFfc2l6ZTsKKyAgICBpbnQgcmV0OworICAgIEFWUGFja2V0ICpwa3Q7CisKKyAgICBpZiAoYXJnYyA8PSAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxpbnB1dCBmaWxlPiA8b3V0cHV0IGZpbGU+XG4iLCBhcmd2WzBdKTsKKyAgICAgICAgZXhpdCgwKTsKKyAgICB9CisgICAgZmlsZW5hbWUgICAgPSBhcmd2WzFdOworICAgIG91dGZpbGVuYW1lID0gYXJndlsyXTsKKworICAgIHBrdCA9IGF2X3BhY2tldF9hbGxvYygpOworICAgIGlmICghcGt0KQorICAgICAgICBleGl0KDEpOworCisgICAgLyogc2V0IGVuZCBvZiBidWZmZXIgdG8gMCAodGhpcyBlbnN1cmVzIHRoYXQgbm8gb3ZlcnJlYWRpbmcgaGFwcGVucyBmb3IgZGFtYWdlZCBNUEVHIHN0cmVhbXMpICovCisgICAgbWVtc2V0KGluYnVmICsgSU5CVUZfU0laRSwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICAvKiBmaW5kIHRoZSBNUEVHLTEgdmlkZW8gZGVjb2RlciAqLworICAgIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoQVZfQ09ERUNfSURfTVBFRzFWSURFTyk7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvZGVjIG5vdCBmb3VuZFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgcGFyc2VyID0gYXZfcGFyc2VyX2luaXQoY29kZWMtPmlkKTsKKyAgICBpZiAoIXBhcnNlcikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInBhcnNlciBub3QgZm91bmRcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGMgPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGNvZGVjKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgdmlkZW8gY29kZWMgY29udGV4dFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogRm9yIHNvbWUgY29kZWNzLCBzdWNoIGFzIG1zbXBlZzQgYW5kIG1wZWc0LCB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICAgTVVTVCBiZSBpbml0aWFsaXplZCB0aGVyZSBiZWNhdXNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90CisgICAgICAgYXZhaWxhYmxlIGluIHRoZSBiaXRzdHJlYW0uICovCisKKyAgICAvKiBvcGVuIGl0ICovCisgICAgaWYgKGF2Y29kZWNfb3BlbjIoYywgY29kZWMsIE5VTEwpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGNvZGVjXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOworICAgIGlmICghZikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghZnJhbWUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgdmlkZW8gZnJhbWVcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHdoaWxlICghZmVvZihmKSkgeworICAgICAgICAvKiByZWFkIHJhdyBkYXRhIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KKyAgICAgICAgZGF0YV9zaXplID0gZnJlYWQoaW5idWYsIDEsIElOQlVGX1NJWkUsIGYpOworICAgICAgICBpZiAoIWRhdGFfc2l6ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8qIHVzZSB0aGUgcGFyc2VyIHRvIHNwbGl0IHRoZSBkYXRhIGludG8gZnJhbWVzICovCisgICAgICAgIGRhdGEgPSBpbmJ1ZjsKKyAgICAgICAgd2hpbGUgKGRhdGFfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IGF2X3BhcnNlcl9wYXJzZTIocGFyc2VyLCBjLCAmcGt0LT5kYXRhLCAmcGt0LT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBkYXRhX3NpemUsIEFWX05PUFRTX1ZBTFVFLCBBVl9OT1BUU19WQUxVRSwgMCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgcGFyc2luZ1xuIik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGEgICAgICArPSByZXQ7CisgICAgICAgICAgICBkYXRhX3NpemUgLT0gcmV0OworCisgICAgICAgICAgICBpZiAocGt0LT5zaXplKQorICAgICAgICAgICAgICAgIGRlY29kZShjLCBmcmFtZSwgcGt0LCBvdXRmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmbHVzaCB0aGUgZGVjb2RlciAqLworICAgIGRlY29kZShjLCBmcmFtZSwgTlVMTCwgb3V0ZmlsZW5hbWUpOworCisgICAgZmNsb3NlKGYpOworCisgICAgYXZfcGFyc2VyX2Nsb3NlKHBhcnNlcik7CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmMpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICBhdl9wYWNrZXRfZnJlZSgmcGt0KTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2RlY29kaW5nX2VuY29kaW5nLmMgYi9kb2MvZXhhbXBsZXMvZGVjb2RpbmdfZW5jb2RpbmcuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhOThhNi4uMDAwMDAwMAotLS0gYS9kb2MvZXhhbXBsZXMvZGVjb2RpbmdfZW5jb2RpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDY2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAotICoKLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKLSAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCi0gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCi0gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCi0gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKLSAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLSAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgotICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKLSAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KLSAqIFRIRSBTT0ZUV0FSRS4KLSAqLwotCi0vKioKLSAqIEBmaWxlCi0gKiBsaWJhdmNvZGVjIEFQSSB1c2UgZXhhbXBsZS4KLSAqCi0gKiBAZXhhbXBsZSBkZWNvZGluZ19lbmNvZGluZy5jCi0gKiBOb3RlIHRoYXQgbGliYXZjb2RlYyBvbmx5IGhhbmRsZXMgY29kZWNzIChtcGVnLCBtcGVnNCwgZXRjLi4uKSwKLSAqIG5vdCBmaWxlIGZvcm1hdHMgKGF2aSwgdm9iLCBtcDQsIG1vdiwgbWt2LCBteGYsIGZsdiwgbXBlZ3RzLCBtcGVncHMsIGV0Yy4uLikuIFNlZSBsaWJyYXJ5ICdsaWJhdmZvcm1hdCcgZm9yIHRoZQotICogZm9ybWF0IGhhbmRsaW5nCi0gKi8KLQotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPGxpYmF2dXRpbC9vcHQuaD4KLSNpbmNsdWRlIDxsaWJhdmNvZGVjL2F2Y29kZWMuaD4KLSNpbmNsdWRlIDxsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaD4KLSNpbmNsdWRlIDxsaWJhdnV0aWwvY29tbW9uLmg+Ci0jaW5jbHVkZSA8bGliYXZ1dGlsL2ltZ3V0aWxzLmg+Ci0jaW5jbHVkZSA8bGliYXZ1dGlsL21hdGhlbWF0aWNzLmg+Ci0jaW5jbHVkZSA8bGliYXZ1dGlsL3NhbXBsZWZtdC5oPgotCi0jZGVmaW5lIElOQlVGX1NJWkUgNDA5NgotI2RlZmluZSBBVURJT19JTkJVRl9TSVpFIDIwNDgwCi0jZGVmaW5lIEFVRElPX1JFRklMTF9USFJFU0ggNDA5NgotCi0vKiBjaGVjayB0aGF0IGEgZ2l2ZW4gc2FtcGxlIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGVuY29kZXIgKi8KLXN0YXRpYyBpbnQgY2hlY2tfc2FtcGxlX2ZtdChBVkNvZGVjICpjb2RlYywgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10KQotewotICAgIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgKnAgPSBjb2RlYy0+c2FtcGxlX2ZtdHM7Ci0KLSAgICB3aGlsZSAoKnAgIT0gQVZfU0FNUExFX0ZNVF9OT05FKSB7Ci0gICAgICAgIGlmICgqcCA9PSBzYW1wbGVfZm10KQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIGp1c3QgcGljayB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgc2FtcGxlcmF0ZSAqLwotc3RhdGljIGludCBzZWxlY3Rfc2FtcGxlX3JhdGUoQVZDb2RlYyAqY29kZWMpCi17Ci0gICAgY29uc3QgaW50ICpwOwotICAgIGludCBiZXN0X3NhbXBsZXJhdGUgPSAwOwotCi0gICAgaWYgKCFjb2RlYy0+c3VwcG9ydGVkX3NhbXBsZXJhdGVzKQotICAgICAgICByZXR1cm4gNDQxMDA7Ci0KLSAgICBwID0gY29kZWMtPnN1cHBvcnRlZF9zYW1wbGVyYXRlczsKLSAgICB3aGlsZSAoKnApIHsKLSAgICAgICAgYmVzdF9zYW1wbGVyYXRlID0gRkZNQVgoKnAsIGJlc3Rfc2FtcGxlcmF0ZSk7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0gICAgcmV0dXJuIGJlc3Rfc2FtcGxlcmF0ZTsKLX0KLQotLyogc2VsZWN0IGxheW91dCB3aXRoIHRoZSBoaWdoZXN0IGNoYW5uZWwgY291bnQgKi8KLXN0YXRpYyBpbnQgc2VsZWN0X2NoYW5uZWxfbGF5b3V0KEFWQ29kZWMgKmNvZGVjKQotewotICAgIGNvbnN0IHVpbnQ2NF90ICpwOwotICAgIHVpbnQ2NF90IGJlc3RfY2hfbGF5b3V0ID0gMDsKLSAgICBpbnQgYmVzdF9uYl9jaGFubmVscyAgID0gMDsKLQotICAgIGlmICghY29kZWMtPmNoYW5uZWxfbGF5b3V0cykKLSAgICAgICAgcmV0dXJuIEFWX0NIX0xBWU9VVF9TVEVSRU87Ci0KLSAgICBwID0gY29kZWMtPmNoYW5uZWxfbGF5b3V0czsKLSAgICB3aGlsZSAoKnApIHsKLSAgICAgICAgaW50IG5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKCpwKTsKLQotICAgICAgICBpZiAobmJfY2hhbm5lbHMgPiBiZXN0X25iX2NoYW5uZWxzKSB7Ci0gICAgICAgICAgICBiZXN0X2NoX2xheW91dCAgICA9ICpwOwotICAgICAgICAgICAgYmVzdF9uYl9jaGFubmVscyA9IG5iX2NoYW5uZWxzOwotICAgICAgICB9Ci0gICAgICAgIHArKzsKLSAgICB9Ci0gICAgcmV0dXJuIGJlc3RfY2hfbGF5b3V0OwotfQotCi0vKgotICogQXVkaW8gZW5jb2RpbmcgZXhhbXBsZQotICovCi1zdGF0aWMgdm9pZCBhdWRpb19lbmNvZGVfZXhhbXBsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBBVkNvZGVjICpjb2RlYzsKLSAgICBBVkNvZGVjQ29udGV4dCAqYz0gTlVMTDsKLSAgICBBVkZyYW1lICpmcmFtZTsKLSAgICBBVlBhY2tldCBwa3Q7Ci0gICAgaW50IGksIGosIGssIHJldCwgZ290X291dHB1dDsKLSAgICBpbnQgYnVmZmVyX3NpemU7Ci0gICAgRklMRSAqZjsKLSAgICB1aW50MTZfdCAqc2FtcGxlczsKLSAgICBmbG9hdCB0LCB0aW5jcjsKLQotICAgIHByaW50ZigiRW5jb2RlIGF1ZGlvIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLQotICAgIC8qIGZpbmQgdGhlIE1QMiBlbmNvZGVyICovCi0gICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2RlcihBVl9DT0RFQ19JRF9NUDIpOwotICAgIGlmICghY29kZWMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb2RlYyBub3QgZm91bmRcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGMgPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGNvZGVjKTsKLSAgICBpZiAoIWMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgYXVkaW8gY29kZWMgY29udGV4dFxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgLyogcHV0IHNhbXBsZSBwYXJhbWV0ZXJzICovCi0gICAgYy0+Yml0X3JhdGUgPSA2NDAwMDsKLQotICAgIC8qIGNoZWNrIHRoYXQgdGhlIGVuY29kZXIgc3VwcG9ydHMgczE2IHBjbSBpbnB1dCAqLwotICAgIGMtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKLSAgICBpZiAoIWNoZWNrX3NhbXBsZV9mbXQoY29kZWMsIGMtPnNhbXBsZV9mbXQpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0IHNhbXBsZSBmb3JtYXQgJXMiLAotICAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoYy0+c2FtcGxlX2ZtdCkpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8qIHNlbGVjdCBvdGhlciBhdWRpbyBwYXJhbWV0ZXJzIHN1cHBvcnRlZCBieSB0aGUgZW5jb2RlciAqLwotICAgIGMtPnNhbXBsZV9yYXRlICAgID0gc2VsZWN0X3NhbXBsZV9yYXRlKGNvZGVjKTsKLSAgICBjLT5jaGFubmVsX2xheW91dCA9IHNlbGVjdF9jaGFubmVsX2xheW91dChjb2RlYyk7Ci0gICAgYy0+Y2hhbm5lbHMgICAgICAgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYy0+Y2hhbm5lbF9sYXlvdXQpOwotCi0gICAgLyogb3BlbiBpdCAqLwotICAgIGlmIChhdmNvZGVjX29wZW4yKGMsIGNvZGVjLCBOVUxMKSA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBjb2RlY1xuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKLSAgICBpZiAoIWYpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8qIGZyYW1lIGNvbnRhaW5pbmcgaW5wdXQgcmF3IGF1ZGlvICovCi0gICAgZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGlmICghZnJhbWUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgYXVkaW8gZnJhbWVcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGZyYW1lLT5uYl9zYW1wbGVzICAgICA9IGMtPmZyYW1lX3NpemU7Ci0gICAgZnJhbWUtPmZvcm1hdCAgICAgICAgID0gYy0+c2FtcGxlX2ZtdDsKLSAgICBmcmFtZS0+Y2hhbm5lbF9sYXlvdXQgPSBjLT5jaGFubmVsX2xheW91dDsKLQotICAgIC8qIHRoZSBjb2RlYyBnaXZlcyB1cyB0aGUgZnJhbWUgc2l6ZSwgaW4gc2FtcGxlcywKLSAgICAgKiB3ZSBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIHNhbXBsZXMgYnVmZmVyIGluIGJ5dGVzICovCi0gICAgYnVmZmVyX3NpemUgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZShOVUxMLCBjLT5jaGFubmVscywgYy0+ZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNhbXBsZV9mbXQsIDApOwotICAgIGlmIChidWZmZXJfc2l6ZSA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZ2V0IHNhbXBsZSBidWZmZXIgc2l6ZVxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHNhbXBsZXMgPSBhdl9tYWxsb2MoYnVmZmVyX3NpemUpOwotICAgIGlmICghc2FtcGxlcykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc2FtcGxlcyBidWZmZXJcbiIsCi0gICAgICAgICAgICAgICAgYnVmZmVyX3NpemUpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICAvKiBzZXR1cCB0aGUgZGF0YSBwb2ludGVycyBpbiB0aGUgQVZGcmFtZSAqLwotICAgIHJldCA9IGF2Y29kZWNfZmlsbF9hdWRpb19mcmFtZShmcmFtZSwgYy0+Y2hhbm5lbHMsIGMtPnNhbXBsZV9mbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KilzYW1wbGVzLCBidWZmZXJfc2l6ZSwgMCk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc2V0dXAgYXVkaW8gZnJhbWVcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8qIGVuY29kZSBhIHNpbmdsZSB0b25lIHNvdW5kICovCi0gICAgdCA9IDA7Ci0gICAgdGluY3IgPSAyICogTV9QSSAqIDQ0MC4wIC8gYy0+c2FtcGxlX3JhdGU7Ci0gICAgZm9yIChpID0gMDsgaSA8IDIwMDsgaSsrKSB7Ci0gICAgICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOwotICAgICAgICBwa3QuZGF0YSA9IE5VTEw7IC8vIHBhY2tldCBkYXRhIHdpbGwgYmUgYWxsb2NhdGVkIGJ5IHRoZSBlbmNvZGVyCi0gICAgICAgIHBrdC5zaXplID0gMDsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgYy0+ZnJhbWVfc2l6ZTsgaisrKSB7Ci0gICAgICAgICAgICBzYW1wbGVzWzIqal0gPSAoaW50KShzaW4odCkgKiAxMDAwMCk7Ci0KLSAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCBjLT5jaGFubmVsczsgaysrKQotICAgICAgICAgICAgICAgIHNhbXBsZXNbMipqICsga10gPSBzYW1wbGVzWzIqal07Ci0gICAgICAgICAgICB0ICs9IHRpbmNyOwotICAgICAgICB9Ci0gICAgICAgIC8qIGVuY29kZSB0aGUgc2FtcGxlcyAqLwotICAgICAgICByZXQgPSBhdmNvZGVjX2VuY29kZV9hdWRpbzIoYywgJnBrdCwgZnJhbWUsICZnb3Rfb3V0cHV0KTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZW5jb2RpbmcgYXVkaW8gZnJhbWVcbiIpOwotICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ290X291dHB1dCkgewotICAgICAgICAgICAgZndyaXRlKHBrdC5kYXRhLCAxLCBwa3Quc2l6ZSwgZik7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBnZXQgdGhlIGRlbGF5ZWQgZnJhbWVzICovCi0gICAgZm9yIChnb3Rfb3V0cHV0ID0gMTsgZ290X291dHB1dDsgaSsrKSB7Ci0gICAgICAgIHJldCA9IGF2Y29kZWNfZW5jb2RlX2F1ZGlvMihjLCAmcGt0LCBOVUxMLCAmZ290X291dHB1dCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGVuY29kaW5nIGZyYW1lXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ290X291dHB1dCkgewotICAgICAgICAgICAgZndyaXRlKHBrdC5kYXRhLCAxLCBwa3Quc2l6ZSwgZik7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKGYpOwotCi0gICAgYXZfZnJlZXAoJnNhbXBsZXMpOwotICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKLSAgICBhdmNvZGVjX2Nsb3NlKGMpOwotICAgIGF2X2ZyZWUoYyk7Ci19Ci0KLS8qCi0gKiBBdWRpbyBkZWNvZGluZy4KLSAqLwotc3RhdGljIHZvaWQgYXVkaW9fZGVjb2RlX2V4YW1wbGUoY29uc3QgY2hhciAqb3V0ZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIEFWQ29kZWMgKmNvZGVjOwotICAgIEFWQ29kZWNDb250ZXh0ICpjPSBOVUxMOwotICAgIGludCBsZW47Ci0gICAgRklMRSAqZiwgKm91dGZpbGU7Ci0gICAgdWludDhfdCBpbmJ1ZltBVURJT19JTkJVRl9TSVpFICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV07Ci0gICAgQVZQYWNrZXQgYXZwa3Q7Ci0gICAgQVZGcmFtZSAqZGVjb2RlZF9mcmFtZSA9IE5VTEw7Ci0KLSAgICBhdl9pbml0X3BhY2tldCgmYXZwa3QpOwotCi0gICAgcHJpbnRmKCJEZWNvZGUgYXVkaW8gZmlsZSAlcyB0byAlc1xuIiwgZmlsZW5hbWUsIG91dGZpbGVuYW1lKTsKLQotICAgIC8qIGZpbmQgdGhlIG1wZWcgYXVkaW8gZGVjb2RlciAqLwotICAgIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoQVZfQ09ERUNfSURfTVAyKTsKLSAgICBpZiAoIWNvZGVjKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29kZWMgbm90IGZvdW5kXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBjID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYyk7Ci0gICAgaWYgKCFjKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIGF1ZGlvIGNvZGVjIGNvbnRleHRcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8qIG9wZW4gaXQgKi8KLSAgICBpZiAoYXZjb2RlY19vcGVuMihjLCBjb2RlYywgTlVMTCkgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gY29kZWNcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInJiIik7Ci0gICAgaWYgKCFmKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgb3V0ZmlsZSA9IGZvcGVuKG91dGZpbGVuYW1lLCAid2IiKTsKLSAgICBpZiAoIW91dGZpbGUpIHsKLSAgICAgICAgYXZfZnJlZShjKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICAvKiBkZWNvZGUgdW50aWwgZW9mICovCi0gICAgYXZwa3QuZGF0YSA9IGluYnVmOwotICAgIGF2cGt0LnNpemUgPSBmcmVhZChpbmJ1ZiwgMSwgQVVESU9fSU5CVUZfU0laRSwgZik7Ci0KLSAgICB3aGlsZSAoYXZwa3Quc2l6ZSA+IDApIHsKLSAgICAgICAgaW50IGksIGNoOwotICAgICAgICBpbnQgZ290X2ZyYW1lID0gMDsKLQotICAgICAgICBpZiAoIWRlY29kZWRfZnJhbWUpIHsKLSAgICAgICAgICAgIGlmICghKGRlY29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIGF1ZGlvIGZyYW1lXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbGVuID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KGMsIGRlY29kZWRfZnJhbWUsICZnb3RfZnJhbWUsICZhdnBrdCk7Ci0gICAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIGRlY29kaW5nXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGdvdF9mcmFtZSkgewotICAgICAgICAgICAgLyogaWYgYSBmcmFtZSBoYXMgYmVlbiBkZWNvZGVkLCBvdXRwdXQgaXQgKi8KLSAgICAgICAgICAgIGludCBkYXRhX3NpemUgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShjLT5zYW1wbGVfZm10KTsKLSAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgbm90IG9jY3VyLCBjaGVja2luZyBqdXN0IGZvciBwYXJhbm9pYSAqLwotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNhbGN1bGF0ZSBkYXRhIHNpemVcbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxkZWNvZGVkX2ZyYW1lLT5uYl9zYW1wbGVzOyBpKyspCi0gICAgICAgICAgICAgICAgZm9yIChjaD0wOyBjaDxjLT5jaGFubmVsczsgY2grKykKLSAgICAgICAgICAgICAgICAgICAgZndyaXRlKGRlY29kZWRfZnJhbWUtPmRhdGFbY2hdICsgZGF0YV9zaXplKmksIDEsIGRhdGFfc2l6ZSwgb3V0ZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZwa3Quc2l6ZSAtPSBsZW47Ci0gICAgICAgIGF2cGt0LmRhdGEgKz0gbGVuOwotICAgICAgICBhdnBrdC5kdHMgPQotICAgICAgICBhdnBrdC5wdHMgPSBBVl9OT1BUU19WQUxVRTsKLSAgICAgICAgaWYgKGF2cGt0LnNpemUgPCBBVURJT19SRUZJTExfVEhSRVNIKSB7Ci0gICAgICAgICAgICAvKiBSZWZpbGwgdGhlIGlucHV0IGJ1ZmZlciwgdG8gYXZvaWQgdHJ5aW5nIHRvIGRlY29kZQotICAgICAgICAgICAgICogaW5jb21wbGV0ZSBmcmFtZXMuIEluc3RlYWQgb2YgdGhpcywgb25lIGNvdWxkIGFsc28gdXNlCi0gICAgICAgICAgICAgKiBhIHBhcnNlciwgb3IgdXNlIGEgcHJvcGVyIGNvbnRhaW5lciBmb3JtYXQgdGhyb3VnaAotICAgICAgICAgICAgICogbGliYXZmb3JtYXQuICovCi0gICAgICAgICAgICBtZW1tb3ZlKGluYnVmLCBhdnBrdC5kYXRhLCBhdnBrdC5zaXplKTsKLSAgICAgICAgICAgIGF2cGt0LmRhdGEgPSBpbmJ1ZjsKLSAgICAgICAgICAgIGxlbiA9IGZyZWFkKGF2cGt0LmRhdGEgKyBhdnBrdC5zaXplLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5CVUZfU0laRSAtIGF2cGt0LnNpemUsIGYpOwotICAgICAgICAgICAgaWYgKGxlbiA+IDApCi0gICAgICAgICAgICAgICAgYXZwa3Quc2l6ZSArPSBsZW47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmY2xvc2Uob3V0ZmlsZSk7Ci0gICAgZmNsb3NlKGYpOwotCi0gICAgYXZjb2RlY19jbG9zZShjKTsKLSAgICBhdl9mcmVlKGMpOwotICAgIGF2X2ZyYW1lX2ZyZWUoJmRlY29kZWRfZnJhbWUpOwotfQotCi0vKgotICogVmlkZW8gZW5jb2RpbmcgZXhhbXBsZQotICovCi1zdGF0aWMgdm9pZCB2aWRlb19lbmNvZGVfZXhhbXBsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGNvZGVjX2lkKQotewotICAgIEFWQ29kZWMgKmNvZGVjOwotICAgIEFWQ29kZWNDb250ZXh0ICpjPSBOVUxMOwotICAgIGludCBpLCByZXQsIHgsIHksIGdvdF9vdXRwdXQ7Ci0gICAgRklMRSAqZjsKLSAgICBBVkZyYW1lICpmcmFtZTsKLSAgICBBVlBhY2tldCBwa3Q7Ci0gICAgdWludDhfdCBlbmRjb2RlW10gPSB7IDAsIDAsIDEsIDB4YjcgfTsKLQotICAgIHByaW50ZigiRW5jb2RlIHZpZGVvIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKLQotICAgIC8qIGZpbmQgdGhlIG1wZWcxIHZpZGVvIGVuY29kZXIgKi8KLSAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9lbmNvZGVyKGNvZGVjX2lkKTsKLSAgICBpZiAoIWNvZGVjKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29kZWMgbm90IGZvdW5kXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBjID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYyk7Ci0gICAgaWYgKCFjKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHZpZGVvIGNvZGVjIGNvbnRleHRcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIC8qIHB1dCBzYW1wbGUgcGFyYW1ldGVycyAqLwotICAgIGMtPmJpdF9yYXRlID0gNDAwMDAwOwotICAgIC8qIHJlc29sdXRpb24gbXVzdCBiZSBhIG11bHRpcGxlIG9mIHR3byAqLwotICAgIGMtPndpZHRoID0gMzUyOwotICAgIGMtPmhlaWdodCA9IDI4ODsKLSAgICAvKiBmcmFtZXMgcGVyIHNlY29uZCAqLwotICAgIGMtPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsxLDI1fTsKLSAgICAvKiBlbWl0IG9uZSBpbnRyYSBmcmFtZSBldmVyeSB0ZW4gZnJhbWVzCi0gICAgICogY2hlY2sgZnJhbWUgcGljdF90eXBlIGJlZm9yZSBwYXNzaW5nIGZyYW1lCi0gICAgICogdG8gZW5jb2RlciwgaWYgZnJhbWUtPnBpY3RfdHlwZSBpcyBBVl9QSUNUVVJFX1RZUEVfSQotICAgICAqIHRoZW4gZ29wX3NpemUgaXMgaWdub3JlZCBhbmQgdGhlIG91dHB1dCBvZiBlbmNvZGVyCi0gICAgICogd2lsbCBhbHdheXMgYmUgSSBmcmFtZSBpcnJlc3BlY3RpdmUgdG8gZ29wX3NpemUKLSAgICAgKi8KLSAgICBjLT5nb3Bfc2l6ZSA9IDEwOwotICAgIGMtPm1heF9iX2ZyYW1lcyA9IDE7Ci0gICAgYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKLQotICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQotICAgICAgICBhdl9vcHRfc2V0KGMtPnByaXZfZGF0YSwgInByZXNldCIsICJzbG93IiwgMCk7Ci0KLSAgICAvKiBvcGVuIGl0ICovCi0gICAgaWYgKGF2Y29kZWNfb3BlbjIoYywgY29kZWMsIE5VTEwpIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGNvZGVjXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOwotICAgIGlmICghZikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGlmICghZnJhbWUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgdmlkZW8gZnJhbWVcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICBmcmFtZS0+Zm9ybWF0ID0gYy0+cGl4X2ZtdDsKLSAgICBmcmFtZS0+d2lkdGggID0gYy0+d2lkdGg7Ci0gICAgZnJhbWUtPmhlaWdodCA9IGMtPmhlaWdodDsKLQotICAgIC8qIHRoZSBpbWFnZSBjYW4gYmUgYWxsb2NhdGVkIGJ5IGFueSBtZWFucyBhbmQgYXZfaW1hZ2VfYWxsb2MoKSBpcwotICAgICAqIGp1c3QgdGhlIG1vc3QgY29udmVuaWVudCB3YXkgaWYgYXZfbWFsbG9jKCkgaXMgdG8gYmUgdXNlZCAqLwotICAgIHJldCA9IGF2X2ltYWdlX2FsbG9jKGZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsIGMtPndpZHRoLCBjLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGl4X2ZtdCwgMzIpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHJhdyBwaWN0dXJlIGJ1ZmZlclxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgLyogZW5jb2RlIDEgc2Vjb25kIG9mIHZpZGVvICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI1OyBpKyspIHsKLSAgICAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7Ci0gICAgICAgIHBrdC5kYXRhID0gTlVMTDsgICAgLy8gcGFja2V0IGRhdGEgd2lsbCBiZSBhbGxvY2F0ZWQgYnkgdGhlIGVuY29kZXIKLSAgICAgICAgcGt0LnNpemUgPSAwOwotCi0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgICAgICAvKiBwcmVwYXJlIGEgZHVtbXkgaW1hZ2UgKi8KLSAgICAgICAgLyogWSAqLwotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYy0+aGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBjLT53aWR0aDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF1beSAqIGZyYW1lLT5saW5lc2l6ZVswXSArIHhdID0geCArIHkgKyBpICogMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIENiIGFuZCBDciAqLwotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYy0+aGVpZ2h0LzI7IHkrKykgewotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGMtPndpZHRoLzI7IHgrKykgewotICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhWzFdW3kgKiBmcmFtZS0+bGluZXNpemVbMV0gKyB4XSA9IDEyOCArIHkgKyBpICogMjsKLSAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVsyXVt5ICogZnJhbWUtPmxpbmVzaXplWzJdICsgeF0gPSA2NCArIHggKyBpICogNTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZyYW1lLT5wdHMgPSBpOwotCi0gICAgICAgIC8qIGVuY29kZSB0aGUgaW1hZ2UgKi8KLSAgICAgICAgcmV0ID0gYXZjb2RlY19lbmNvZGVfdmlkZW8yKGMsICZwa3QsIGZyYW1lLCAmZ290X291dHB1dCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGVuY29kaW5nIGZyYW1lXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ290X291dHB1dCkgewotICAgICAgICAgICAgcHJpbnRmKCJXcml0ZSBmcmFtZSAlM2QgKHNpemU9JTVkKVxuIiwgaSwgcGt0LnNpemUpOwotICAgICAgICAgICAgZndyaXRlKHBrdC5kYXRhLCAxLCBwa3Quc2l6ZSwgZik7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBnZXQgdGhlIGRlbGF5ZWQgZnJhbWVzICovCi0gICAgZm9yIChnb3Rfb3V0cHV0ID0gMTsgZ290X291dHB1dDsgaSsrKSB7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgIHJldCA9IGF2Y29kZWNfZW5jb2RlX3ZpZGVvMihjLCAmcGt0LCBOVUxMLCAmZ290X291dHB1dCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGVuY29kaW5nIGZyYW1lXG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ290X291dHB1dCkgewotICAgICAgICAgICAgcHJpbnRmKCJXcml0ZSBmcmFtZSAlM2QgKHNpemU9JTVkKVxuIiwgaSwgcGt0LnNpemUpOwotICAgICAgICAgICAgZndyaXRlKHBrdC5kYXRhLCAxLCBwa3Quc2l6ZSwgZik7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhZGQgc2VxdWVuY2UgZW5kIGNvZGUgdG8gaGF2ZSBhIHJlYWwgbXBlZyBmaWxlICovCi0gICAgZndyaXRlKGVuZGNvZGUsIDEsIHNpemVvZihlbmRjb2RlKSwgZik7Ci0gICAgZmNsb3NlKGYpOwotCi0gICAgYXZjb2RlY19jbG9zZShjKTsKLSAgICBhdl9mcmVlKGMpOwotICAgIGF2X2ZyZWVwKCZmcmFtZS0+ZGF0YVswXSk7Ci0gICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwotICAgIHByaW50ZigiXG4iKTsKLX0KLQotLyoKLSAqIFZpZGVvIGRlY29kaW5nIGV4YW1wbGUKLSAqLwotCi1zdGF0aWMgdm9pZCBwZ21fc2F2ZSh1bnNpZ25lZCBjaGFyICpidWYsIGludCB3cmFwLCBpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpbGVuYW1lKQotewotICAgIEZJTEUgKmY7Ci0gICAgaW50IGk7Ci0KLSAgICBmID0gZm9wZW4oZmlsZW5hbWUsInciKTsKLSAgICBmcHJpbnRmKGYsICJQNVxuJWQgJWRcbiVkXG4iLCB4c2l6ZSwgeXNpemUsIDI1NSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHlzaXplOyBpKyspCi0gICAgICAgIGZ3cml0ZShidWYgKyBpICogd3JhcCwgMSwgeHNpemUsIGYpOwotICAgIGZjbG9zZShmKTsKLX0KLQotc3RhdGljIGludCBkZWNvZGVfd3JpdGVfZnJhbWUoY29uc3QgY2hhciAqb3V0ZmlsZW5hbWUsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBpbnQgKmZyYW1lX2NvdW50LCBBVlBhY2tldCAqcGt0LCBpbnQgbGFzdCkKLXsKLSAgICBpbnQgbGVuLCBnb3RfZnJhbWU7Ci0gICAgY2hhciBidWZbMTAyNF07Ci0KLSAgICBsZW4gPSBhdmNvZGVjX2RlY29kZV92aWRlbzIoYXZjdHgsIGZyYW1lLCAmZ290X2ZyYW1lLCBwa3QpOwotICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgZGVjb2RpbmcgZnJhbWUgJWRcbiIsICpmcmFtZV9jb3VudCk7Ci0gICAgICAgIHJldHVybiBsZW47Ci0gICAgfQotICAgIGlmIChnb3RfZnJhbWUpIHsKLSAgICAgICAgcHJpbnRmKCJTYXZpbmcgJXNmcmFtZSAlM2RcbiIsIGxhc3QgPyAibGFzdCAiIDogIiIsICpmcmFtZV9jb3VudCk7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotCi0gICAgICAgIC8qIHRoZSBwaWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgZGVjb2Rlciwgbm8gbmVlZCB0byBmcmVlIGl0ICovCi0gICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIG91dGZpbGVuYW1lLCAqZnJhbWVfY291bnQpOwotICAgICAgICBwZ21fc2F2ZShmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPmxpbmVzaXplWzBdLAotICAgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsIGJ1Zik7Ci0gICAgICAgICgqZnJhbWVfY291bnQpKys7Ci0gICAgfQotICAgIGlmIChwa3QtPmRhdGEpIHsKLSAgICAgICAgcGt0LT5zaXplIC09IGxlbjsKLSAgICAgICAgcGt0LT5kYXRhICs9IGxlbjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpZGVvX2RlY29kZV9leGFtcGxlKGNvbnN0IGNoYXIgKm91dGZpbGVuYW1lLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBBVkNvZGVjICpjb2RlYzsKLSAgICBBVkNvZGVjQ29udGV4dCAqYz0gTlVMTDsKLSAgICBpbnQgZnJhbWVfY291bnQ7Ci0gICAgRklMRSAqZjsKLSAgICBBVkZyYW1lICpmcmFtZTsKLSAgICB1aW50OF90IGluYnVmW0lOQlVGX1NJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXTsKLSAgICBBVlBhY2tldCBhdnBrdDsKLQotICAgIGF2X2luaXRfcGFja2V0KCZhdnBrdCk7Ci0KLSAgICAvKiBzZXQgZW5kIG9mIGJ1ZmZlciB0byAwICh0aGlzIGVuc3VyZXMgdGhhdCBubyBvdmVycmVhZGluZyBoYXBwZW5zIGZvciBkYW1hZ2VkIG1wZWcgc3RyZWFtcykgKi8KLSAgICBtZW1zZXQoaW5idWYgKyBJTkJVRl9TSVpFLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLQotICAgIHByaW50ZigiRGVjb2RlIHZpZGVvIGZpbGUgJXMgdG8gJXNcbiIsIGZpbGVuYW1lLCBvdXRmaWxlbmFtZSk7Ci0KLSAgICAvKiBmaW5kIHRoZSBtcGVnMSB2aWRlbyBkZWNvZGVyICovCi0gICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihBVl9DT0RFQ19JRF9NUEVHMVZJREVPKTsKLSAgICBpZiAoIWNvZGVjKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29kZWMgbm90IGZvdW5kXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBjID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYyk7Ci0gICAgaWYgKCFjKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHZpZGVvIGNvZGVjIGNvbnRleHRcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGlmIChjb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX1RSVU5DQVRFRCkKLSAgICAgICAgYy0+ZmxhZ3MgfD0gQVZfQ09ERUNfRkxBR19UUlVOQ0FURUQ7IC8vIHdlIGRvIG5vdCBzZW5kIGNvbXBsZXRlIGZyYW1lcwotCi0gICAgLyogRm9yIHNvbWUgY29kZWNzLCBzdWNoIGFzIG1zbXBlZzQgYW5kIG1wZWc0LCB3aWR0aCBhbmQgaGVpZ2h0Ci0gICAgICAgTVVTVCBiZSBpbml0aWFsaXplZCB0aGVyZSBiZWNhdXNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90Ci0gICAgICAgYXZhaWxhYmxlIGluIHRoZSBiaXRzdHJlYW0uICovCi0KLSAgICAvKiBvcGVuIGl0ICovCi0gICAgaWYgKGF2Y29kZWNfb3BlbjIoYywgY29kZWMsIE5VTEwpIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGNvZGVjXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0KLSAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwotICAgIGlmICghZikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGlmICghZnJhbWUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgdmlkZW8gZnJhbWVcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIGZyYW1lX2NvdW50ID0gMDsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGF2cGt0LnNpemUgPSBmcmVhZChpbmJ1ZiwgMSwgSU5CVUZfU0laRSwgZik7Ci0gICAgICAgIGlmIChhdnBrdC5zaXplID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBOT1RFMTogc29tZSBjb2RlY3MgYXJlIHN0cmVhbSBiYXNlZCAobXBlZ3ZpZGVvLCBtcGVnYXVkaW8pCi0gICAgICAgICAgIGFuZCB0aGlzIGlzIHRoZSBvbmx5IG1ldGhvZCB0byB1c2UgdGhlbSBiZWNhdXNlIHlvdSBjYW5ub3QKLSAgICAgICAgICAga25vdyB0aGUgY29tcHJlc3NlZCBkYXRhIHNpemUgYmVmb3JlIGFuYWx5c2luZyBpdC4KLQotICAgICAgICAgICBCVVQgc29tZSBvdGhlciBjb2RlY3MgKG1zbXBlZzQsIG1wZWc0KSBhcmUgaW5oZXJlbnRseSBmcmFtZQotICAgICAgICAgICBiYXNlZCwgc28geW91IG11c3QgY2FsbCB0aGVtIHdpdGggYWxsIHRoZSBkYXRhIGZvciBvbmUKLSAgICAgICAgICAgZnJhbWUgZXhhY3RseS4gWW91IG11c3QgYWxzbyBpbml0aWFsaXplICd3aWR0aCcgYW5kCi0gICAgICAgICAgICdoZWlnaHQnIGJlZm9yZSBpbml0aWFsaXppbmcgdGhlbS4gKi8KLQotICAgICAgICAvKiBOT1RFMjogc29tZSBjb2RlY3MgYWxsb3cgdGhlIHJhdyBwYXJhbWV0ZXJzIChmcmFtZSBzaXplLAotICAgICAgICAgICBzYW1wbGUgcmF0ZSkgdG8gYmUgY2hhbmdlZCBhdCBhbnkgZnJhbWUuIFdlIGhhbmRsZSB0aGlzLCBzbwotICAgICAgICAgICB5b3Ugc2hvdWxkIGFsc28gdGFrZSBjYXJlIG9mIGl0ICovCi0KLSAgICAgICAgLyogaGVyZSwgd2UgdXNlIGEgc3RyZWFtIGJhc2VkIGRlY29kZXIgKG1wZWcxdmlkZW8pLCBzbyB3ZQotICAgICAgICAgICBmZWVkIGRlY29kZXIgYW5kIHNlZSBpZiBpdCBjb3VsZCBkZWNvZGUgYSBmcmFtZSAqLwotICAgICAgICBhdnBrdC5kYXRhID0gaW5idWY7Ci0gICAgICAgIHdoaWxlIChhdnBrdC5zaXplID4gMCkKLSAgICAgICAgICAgIGlmIChkZWNvZGVfd3JpdGVfZnJhbWUob3V0ZmlsZW5hbWUsIGMsIGZyYW1lLCAmZnJhbWVfY291bnQsICZhdnBrdCwgMCkgPCAwKQotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgLyogc29tZSBjb2RlY3MsIHN1Y2ggYXMgTVBFRywgdHJhbnNtaXQgdGhlIEkgYW5kIFAgZnJhbWUgd2l0aCBhCi0gICAgICAgbGF0ZW5jeSBvZiBvbmUgZnJhbWUuIFlvdSBtdXN0IGRvIHRoZSBmb2xsb3dpbmcgdG8gaGF2ZSBhCi0gICAgICAgY2hhbmNlIHRvIGdldCB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgdmlkZW8gKi8KLSAgICBhdnBrdC5kYXRhID0gTlVMTDsKLSAgICBhdnBrdC5zaXplID0gMDsKLSAgICBkZWNvZGVfd3JpdGVfZnJhbWUob3V0ZmlsZW5hbWUsIGMsIGZyYW1lLCAmZnJhbWVfY291bnQsICZhdnBrdCwgMSk7Ci0KLSAgICBmY2xvc2UoZik7Ci0KLSAgICBhdmNvZGVjX2Nsb3NlKGMpOwotICAgIGF2X2ZyZWUoYyk7Ci0gICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwotICAgIHByaW50ZigiXG4iKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGNvbnN0IGNoYXIgKm91dHB1dF90eXBlOwotCi0gICAgLyogcmVnaXN0ZXIgYWxsIHRoZSBjb2RlY3MgKi8KLSAgICBhdmNvZGVjX3JlZ2lzdGVyX2FsbCgpOwotCi0gICAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgICAgIHByaW50ZigidXNhZ2U6ICVzIG91dHB1dF90eXBlXG4iCi0gICAgICAgICAgICAgICAiQVBJIGV4YW1wbGUgcHJvZ3JhbSB0byBkZWNvZGUvZW5jb2RlIGEgbWVkaWEgc3RyZWFtIHdpdGggbGliYXZjb2RlYy5cbiIKLSAgICAgICAgICAgICAgICJUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIGEgc3ludGhldGljIHN0cmVhbSBhbmQgZW5jb2RlcyBpdCB0byBhIGZpbGVcbiIKLSAgICAgICAgICAgICAgICJuYW1lZCB0ZXN0LmgyNjQsIHRlc3QubXAyIG9yIHRlc3QubXBnIGRlcGVuZGluZyBvbiBvdXRwdXRfdHlwZS5cbiIKLSAgICAgICAgICAgICAgICJUaGUgZW5jb2RlZCBzdHJlYW0gaXMgdGhlbiBkZWNvZGVkIGFuZCB3cml0dGVuIHRvIGEgcmF3IGRhdGEgb3V0cHV0LlxuIgotICAgICAgICAgICAgICAgIm91dHB1dF90eXBlIG11c3QgYmUgY2hvc2VuIGJldHdlZW4gJ2gyNjQnLCAnbXAyJywgJ21wZycuXG4iLAotICAgICAgICAgICAgICAgYXJndlswXSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBvdXRwdXRfdHlwZSA9IGFyZ3ZbMV07Ci0KLSAgICBpZiAoIXN0cmNtcChvdXRwdXRfdHlwZSwgImgyNjQiKSkgewotICAgICAgICB2aWRlb19lbmNvZGVfZXhhbXBsZSgidGVzdC5oMjY0IiwgQVZfQ09ERUNfSURfSDI2NCk7Ci0gICAgfSBlbHNlIGlmICghc3RyY21wKG91dHB1dF90eXBlLCAibXAyIikpIHsKLSAgICAgICAgYXVkaW9fZW5jb2RlX2V4YW1wbGUoInRlc3QubXAyIik7Ci0gICAgICAgIGF1ZGlvX2RlY29kZV9leGFtcGxlKCJ0ZXN0LnBjbSIsICJ0ZXN0Lm1wMiIpOwotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvdXRwdXRfdHlwZSwgIm1wZyIpKSB7Ci0gICAgICAgIHZpZGVvX2VuY29kZV9leGFtcGxlKCJ0ZXN0Lm1wZyIsIEFWX0NPREVDX0lEX01QRUcxVklERU8pOwotICAgICAgICB2aWRlb19kZWNvZGVfZXhhbXBsZSgidGVzdCUwMmQucGdtIiwgInRlc3QubXBnIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIG91dHB1dCB0eXBlICclcycsIGNob29zZSBiZXR3ZWVuICdoMjY0JywgJ21wMicsIG9yICdtcGcnXG4iLAotICAgICAgICAgICAgICAgIG91dHB1dF90eXBlKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZGVtdXhpbmdfZGVjb2RpbmcuYyBiL2RvYy9leGFtcGxlcy9kZW11eGluZ19kZWNvZGluZy5jCmluZGV4IDU5ZTBjY2MuLjY5YTMxYTggMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9kZW11eGluZ19kZWNvZGluZy5jCisrKyBiL2RvYy9leGFtcGxlcy9kZW11eGluZ19kZWNvZGluZy5jCkBAIC05MywxMCArOTMsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcHJpbnRmKCJ2aWRlb19mcmFtZSVzIG46JWQgY29kZWRfbjolZCBwdHM6JXNcbiIsCisgICAgICAgICAgICBwcmludGYoInZpZGVvX2ZyYW1lJXMgbjolZCBjb2RlZF9uOiVkXG4iLAogICAgICAgICAgICAgICAgICAgIGNhY2hlZCA/ICIoY2FjaGVkKSIgOiAiIiwKLSAgICAgICAgICAgICAgICAgICB2aWRlb19mcmFtZV9jb3VudCsrLCBmcmFtZS0+Y29kZWRfcGljdHVyZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgYXZfdHMydGltZXN0cihmcmFtZS0+cHRzLCAmdmlkZW9fZGVjX2N0eC0+dGltZV9iYXNlKSk7CisgICAgICAgICAgICAgICAgICAgdmlkZW9fZnJhbWVfY291bnQrKywgZnJhbWUtPmNvZGVkX3BpY3R1cmVfbnVtYmVyKTsKIAogICAgICAgICAgICAgLyogY29weSBkZWNvZGVkIGZyYW1lIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlcjoKICAgICAgICAgICAgICAqIHRoaXMgaXMgcmVxdWlyZWQgc2luY2UgcmF3dmlkZW8gZXhwZWN0cyBub24gYWxpZ25lZCBkYXRhICovCkBAIC0xNDgsMTEgKzE0NywxMCBAQAogfQogCiBzdGF0aWMgaW50IG9wZW5fY29kZWNfY29udGV4dChpbnQgKnN0cmVhbV9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgsIGVudW0gQVZNZWRpYVR5cGUgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICoqZGVjX2N0eCwgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4LCBlbnVtIEFWTWVkaWFUeXBlIHR5cGUpCiB7CiAgICAgaW50IHJldCwgc3RyZWFtX2luZGV4OwogICAgIEFWU3RyZWFtICpzdDsKLSAgICBBVkNvZGVjQ29udGV4dCAqZGVjX2N0eCA9IE5VTEw7CiAgICAgQVZDb2RlYyAqZGVjID0gTlVMTDsKICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOwogCkBAIC0xNjYsMTcgKzE2NCwzMSBAQAogICAgICAgICBzdCA9IGZtdF9jdHgtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKIAogICAgICAgICAvKiBmaW5kIGRlY29kZXIgZm9yIHRoZSBzdHJlYW0gKi8KLSAgICAgICAgZGVjX2N0eCA9IHN0LT5jb2RlYzsKLSAgICAgICAgZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoZGVjX2N0eC0+Y29kZWNfaWQpOworICAgICAgICBkZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihzdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKICAgICAgICAgaWYgKCFkZWMpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGZpbmQgJXMgY29kZWNcbiIsCiAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyh0eXBlKSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAKKyAgICAgICAgLyogQWxsb2NhdGUgYSBjb2RlYyBjb250ZXh0IGZvciB0aGUgZGVjb2RlciAqLworICAgICAgICAqZGVjX2N0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoZGVjKTsKKyAgICAgICAgaWYgKCEqZGVjX2N0eCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlICVzIGNvZGVjIGNvbnRleHRcbiIsCisgICAgICAgICAgICAgICAgICAgIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyh0eXBlKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29weSBjb2RlYyBwYXJhbWV0ZXJzIGZyb20gaW5wdXQgc3RyZWFtIHRvIG91dHB1dCBjb2RlYyBjb250ZXh0ICovCisgICAgICAgIGlmICgocmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoKmRlY19jdHgsIHN0LT5jb2RlY3BhcikpIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29weSAlcyBjb2RlYyBwYXJhbWV0ZXJzIHRvIGRlY29kZXIgY29udGV4dFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHR5cGUpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKwogICAgICAgICAvKiBJbml0IHRoZSBkZWNvZGVycywgd2l0aCBvciB3aXRob3V0IHJlZmVyZW5jZSBjb3VudGluZyAqLwogICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgInJlZmNvdW50ZWRfZnJhbWVzIiwgcmVmY291bnQgPyAiMSIgOiAiMCIsIDApOwotICAgICAgICBpZiAoKHJldCA9IGF2Y29kZWNfb3BlbjIoZGVjX2N0eCwgZGVjLCAmb3B0cykpIDwgMCkgeworICAgICAgICBpZiAoKHJldCA9IGF2Y29kZWNfb3BlbjIoKmRlY19jdHgsIGRlYywgJm9wdHMpKSA8IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gJXMgY29kZWNcbiIsCiAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyh0eXBlKSk7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtMjQwLDkgKzI1Miw2IEBACiAgICAgdmlkZW9fZHN0X2ZpbGVuYW1lID0gYXJndlsyXTsKICAgICBhdWRpb19kc3RfZmlsZW5hbWUgPSBhcmd2WzNdOwogCi0gICAgLyogcmVnaXN0ZXIgYWxsIGZvcm1hdHMgYW5kIGNvZGVjcyAqLwotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwotCiAgICAgLyogb3BlbiBpbnB1dCBmaWxlLCBhbmQgYWxsb2NhdGUgZm9ybWF0IGNvbnRleHQgKi8KICAgICBpZiAoYXZmb3JtYXRfb3Blbl9pbnB1dCgmZm10X2N0eCwgc3JjX2ZpbGVuYW1lLCBOVUxMLCBOVUxMKSA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBzb3VyY2UgZmlsZSAlc1xuIiwgc3JjX2ZpbGVuYW1lKTsKQEAgLTI1NSw5ICsyNjQsOCBAQAogICAgICAgICBleGl0KDEpOwogICAgIH0KIAotICAgIGlmIChvcGVuX2NvZGVjX2NvbnRleHQoJnZpZGVvX3N0cmVhbV9pZHgsIGZtdF9jdHgsIEFWTUVESUFfVFlQRV9WSURFTykgPj0gMCkgeworICAgIGlmIChvcGVuX2NvZGVjX2NvbnRleHQoJnZpZGVvX3N0cmVhbV9pZHgsICZ2aWRlb19kZWNfY3R4LCBmbXRfY3R4LCBBVk1FRElBX1RZUEVfVklERU8pID49IDApIHsKICAgICAgICAgdmlkZW9fc3RyZWFtID0gZm10X2N0eC0+c3RyZWFtc1t2aWRlb19zdHJlYW1faWR4XTsKLSAgICAgICAgdmlkZW9fZGVjX2N0eCA9IHZpZGVvX3N0cmVhbS0+Y29kZWM7CiAKICAgICAgICAgdmlkZW9fZHN0X2ZpbGUgPSBmb3Blbih2aWRlb19kc3RfZmlsZW5hbWUsICJ3YiIpOwogICAgICAgICBpZiAoIXZpZGVvX2RzdF9maWxlKSB7CkBAIC0yNzksOSArMjg3LDggQEAKICAgICAgICAgdmlkZW9fZHN0X2J1ZnNpemUgPSByZXQ7CiAgICAgfQogCi0gICAgaWYgKG9wZW5fY29kZWNfY29udGV4dCgmYXVkaW9fc3RyZWFtX2lkeCwgZm10X2N0eCwgQVZNRURJQV9UWVBFX0FVRElPKSA+PSAwKSB7CisgICAgaWYgKG9wZW5fY29kZWNfY29udGV4dCgmYXVkaW9fc3RyZWFtX2lkeCwgJmF1ZGlvX2RlY19jdHgsIGZtdF9jdHgsIEFWTUVESUFfVFlQRV9BVURJTykgPj0gMCkgewogICAgICAgICBhdWRpb19zdHJlYW0gPSBmbXRfY3R4LT5zdHJlYW1zW2F1ZGlvX3N0cmVhbV9pZHhdOwotICAgICAgICBhdWRpb19kZWNfY3R4ID0gYXVkaW9fc3RyZWFtLT5jb2RlYzsKICAgICAgICAgYXVkaW9fZHN0X2ZpbGUgPSBmb3BlbihhdWRpb19kc3RfZmlsZW5hbWUsICJ3YiIpOwogICAgICAgICBpZiAoIWF1ZGlvX2RzdF9maWxlKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGRlc3RpbmF0aW9uIGZpbGUgJXNcbiIsIGF1ZGlvX2RzdF9maWxlbmFtZSk7CkBAIC0zNjksOCArMzc2LDggQEAKICAgICB9CiAKIGVuZDoKLSAgICBhdmNvZGVjX2Nsb3NlKHZpZGVvX2RlY19jdHgpOwotICAgIGF2Y29kZWNfY2xvc2UoYXVkaW9fZGVjX2N0eCk7CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJnZpZGVvX2RlY19jdHgpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdWRpb19kZWNfY3R4KTsKICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmZm10X2N0eCk7CiAgICAgaWYgKHZpZGVvX2RzdF9maWxlKQogICAgICAgICBmY2xvc2UodmlkZW9fZHN0X2ZpbGUpOwpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL2VuY29kZV9hdWRpby5jIGIvZG9jL2V4YW1wbGVzL2VuY29kZV9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzU4NmIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvZXhhbXBsZXMvZW5jb2RlX2F1ZGlvLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKKyAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKKyAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgorICogVEhFIFNPRlRXQVJFLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIGF1ZGlvIGVuY29kaW5nIHdpdGggbGliYXZjb2RlYyBBUEkgZXhhbXBsZS4KKyAqCisgKiBAZXhhbXBsZSBlbmNvZGVfYXVkaW8uYworICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8bGliYXZjb2RlYy9hdmNvZGVjLmg+CisKKyNpbmNsdWRlIDxsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaD4KKyNpbmNsdWRlIDxsaWJhdnV0aWwvY29tbW9uLmg+CisjaW5jbHVkZSA8bGliYXZ1dGlsL2ZyYW1lLmg+CisjaW5jbHVkZSA8bGliYXZ1dGlsL3NhbXBsZWZtdC5oPgorCisvKiBjaGVjayB0aGF0IGEgZ2l2ZW4gc2FtcGxlIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGVuY29kZXIgKi8KK3N0YXRpYyBpbnQgY2hlY2tfc2FtcGxlX2ZtdChjb25zdCBBVkNvZGVjICpjb2RlYywgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10KQoreworICAgIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgKnAgPSBjb2RlYy0+c2FtcGxlX2ZtdHM7CisKKyAgICB3aGlsZSAoKnAgIT0gQVZfU0FNUExFX0ZNVF9OT05FKSB7CisgICAgICAgIGlmICgqcCA9PSBzYW1wbGVfZm10KQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHArKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGp1c3QgcGljayB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgc2FtcGxlcmF0ZSAqLworc3RhdGljIGludCBzZWxlY3Rfc2FtcGxlX3JhdGUoY29uc3QgQVZDb2RlYyAqY29kZWMpCit7CisgICAgY29uc3QgaW50ICpwOworICAgIGludCBiZXN0X3NhbXBsZXJhdGUgPSAwOworCisgICAgaWYgKCFjb2RlYy0+c3VwcG9ydGVkX3NhbXBsZXJhdGVzKQorICAgICAgICByZXR1cm4gNDQxMDA7CisKKyAgICBwID0gY29kZWMtPnN1cHBvcnRlZF9zYW1wbGVyYXRlczsKKyAgICB3aGlsZSAoKnApIHsKKyAgICAgICAgaWYgKCFiZXN0X3NhbXBsZXJhdGUgfHwgYWJzKDQ0MTAwIC0gKnApIDwgYWJzKDQ0MTAwIC0gYmVzdF9zYW1wbGVyYXRlKSkKKyAgICAgICAgICAgIGJlc3Rfc2FtcGxlcmF0ZSA9ICpwOworICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiBiZXN0X3NhbXBsZXJhdGU7Cit9CisKKy8qIHNlbGVjdCBsYXlvdXQgd2l0aCB0aGUgaGlnaGVzdCBjaGFubmVsIGNvdW50ICovCitzdGF0aWMgaW50IHNlbGVjdF9jaGFubmVsX2xheW91dChjb25zdCBBVkNvZGVjICpjb2RlYykKK3sKKyAgICBjb25zdCB1aW50NjRfdCAqcDsKKyAgICB1aW50NjRfdCBiZXN0X2NoX2xheW91dCA9IDA7CisgICAgaW50IGJlc3RfbmJfY2hhbm5lbHMgICA9IDA7CisKKyAgICBpZiAoIWNvZGVjLT5jaGFubmVsX2xheW91dHMpCisgICAgICAgIHJldHVybiBBVl9DSF9MQVlPVVRfU1RFUkVPOworCisgICAgcCA9IGNvZGVjLT5jaGFubmVsX2xheW91dHM7CisgICAgd2hpbGUgKCpwKSB7CisgICAgICAgIGludCBuYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscygqcCk7CisKKyAgICAgICAgaWYgKG5iX2NoYW5uZWxzID4gYmVzdF9uYl9jaGFubmVscykgeworICAgICAgICAgICAgYmVzdF9jaF9sYXlvdXQgICAgPSAqcDsKKyAgICAgICAgICAgIGJlc3RfbmJfY2hhbm5lbHMgPSBuYl9jaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBwKys7CisgICAgfQorICAgIHJldHVybiBiZXN0X2NoX2xheW91dDsKK30KKworc3RhdGljIHZvaWQgZW5jb2RlKEFWQ29kZWNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgIEZJTEUgKm91dHB1dCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgLyogc2VuZCB0aGUgZnJhbWUgZm9yIGVuY29kaW5nICovCisgICAgcmV0ID0gYXZjb2RlY19zZW5kX2ZyYW1lKGN0eCwgZnJhbWUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igc2VuZGluZyB0aGUgZnJhbWUgdG8gdGhlIGVuY29kZXJcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8qIHJlYWQgYWxsIHRoZSBhdmFpbGFibGUgb3V0cHV0IHBhY2tldHMgKGluIGdlbmVyYWwgdGhlcmUgbWF5IGJlIGFueQorICAgICAqIG51bWJlciBvZiB0aGVtICovCisgICAgd2hpbGUgKHJldCA+PSAwKSB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9wYWNrZXQoY3R4LCBwa3QpOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZW5jb2RpbmcgYXVkaW8gZnJhbWVcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIGZ3cml0ZShwa3QtPmRhdGEsIDEsIHBrdC0+c2l6ZSwgb3V0cHV0KTsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgY29uc3QgQVZDb2RlYyAqY29kZWM7CisgICAgQVZDb2RlY0NvbnRleHQgKmM9IE5VTEw7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgQVZQYWNrZXQgKnBrdDsKKyAgICBpbnQgaSwgaiwgaywgcmV0OworICAgIEZJTEUgKmY7CisgICAgdWludDE2X3QgKnNhbXBsZXM7CisgICAgZmxvYXQgdCwgdGluY3I7CisKKyAgICBpZiAoYXJnYyA8PSAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxvdXRwdXQgZmlsZT5cbiIsIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgZmlsZW5hbWUgPSBhcmd2WzFdOworCisgICAgLyogZmluZCB0aGUgTVAyIGVuY29kZXIgKi8KKyAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9lbmNvZGVyKEFWX0NPREVDX0lEX01QMik7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvZGVjIG5vdCBmb3VuZFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgYyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoY29kZWMpOworICAgIGlmICghYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBhdWRpbyBjb2RlYyBjb250ZXh0XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvKiBwdXQgc2FtcGxlIHBhcmFtZXRlcnMgKi8KKyAgICBjLT5iaXRfcmF0ZSA9IDY0MDAwOworCisgICAgLyogY2hlY2sgdGhhdCB0aGUgZW5jb2RlciBzdXBwb3J0cyBzMTYgcGNtIGlucHV0ICovCisgICAgYy0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OworICAgIGlmICghY2hlY2tfc2FtcGxlX2ZtdChjb2RlYywgYy0+c2FtcGxlX2ZtdCkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFbmNvZGVyIGRvZXMgbm90IHN1cHBvcnQgc2FtcGxlIGZvcm1hdCAlcyIsCisgICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShjLT5zYW1wbGVfZm10KSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogc2VsZWN0IG90aGVyIGF1ZGlvIHBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5IHRoZSBlbmNvZGVyICovCisgICAgYy0+c2FtcGxlX3JhdGUgICAgPSBzZWxlY3Rfc2FtcGxlX3JhdGUoY29kZWMpOworICAgIGMtPmNoYW5uZWxfbGF5b3V0ID0gc2VsZWN0X2NoYW5uZWxfbGF5b3V0KGNvZGVjKTsKKyAgICBjLT5jaGFubmVscyAgICAgICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhjLT5jaGFubmVsX2xheW91dCk7CisKKyAgICAvKiBvcGVuIGl0ICovCisgICAgaWYgKGF2Y29kZWNfb3BlbjIoYywgY29kZWMsIE5VTEwpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGNvZGVjXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOworICAgIGlmICghZikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogcGFja2V0IGZvciBob2xkaW5nIGVuY29kZWQgb3V0cHV0ICovCisgICAgcGt0ID0gYXZfcGFja2V0X2FsbG9jKCk7CisgICAgaWYgKCFwa3QpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgYWxsb2NhdGUgdGhlIHBhY2tldFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogZnJhbWUgY29udGFpbmluZyBpbnB1dCByYXcgYXVkaW8gKi8KKyAgICBmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFmcmFtZSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBhdWRpbyBmcmFtZVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgICAgID0gYy0+ZnJhbWVfc2l6ZTsKKyAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgPSBjLT5zYW1wbGVfZm10OworICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCA9IGMtPmNoYW5uZWxfbGF5b3V0OworCisgICAgLyogYWxsb2NhdGUgdGhlIGRhdGEgYnVmZmVycyAqLworICAgIHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIoZnJhbWUsIDApOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIGF1ZGlvIGRhdGEgYnVmZmVyc1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLyogZW5jb2RlIGEgc2luZ2xlIHRvbmUgc291bmQgKi8KKyAgICB0ID0gMDsKKyAgICB0aW5jciA9IDIgKiBNX1BJICogNDQwLjAgLyBjLT5zYW1wbGVfcmF0ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKKyAgICAgICAgLyogbWFrZSBzdXJlIHRoZSBmcmFtZSBpcyB3cml0YWJsZSAtLSBtYWtlcyBhIGNvcHkgaWYgdGhlIGVuY29kZXIKKyAgICAgICAgICoga2VwdCBhIHJlZmVyZW5jZSBpbnRlcm5hbGx5ICovCisgICAgICAgIHJldCA9IGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUoZnJhbWUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIHNhbXBsZXMgPSAodWludDE2X3QqKWZyYW1lLT5kYXRhWzBdOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT5mcmFtZV9zaXplOyBqKyspIHsKKyAgICAgICAgICAgIHNhbXBsZXNbMipqXSA9IChpbnQpKHNpbih0KSAqIDEwMDAwKTsKKworICAgICAgICAgICAgZm9yIChrID0gMTsgayA8IGMtPmNoYW5uZWxzOyBrKyspCisgICAgICAgICAgICAgICAgc2FtcGxlc1syKmogKyBrXSA9IHNhbXBsZXNbMipqXTsKKyAgICAgICAgICAgIHQgKz0gdGluY3I7CisgICAgICAgIH0KKyAgICAgICAgZW5jb2RlKGMsIGZyYW1lLCBwa3QsIGYpOworICAgIH0KKworICAgIC8qIGZsdXNoIHRoZSBlbmNvZGVyICovCisgICAgZW5jb2RlKGMsIE5VTEwsIHBrdCwgZik7CisKKyAgICBmY2xvc2UoZik7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgYXZfcGFja2V0X2ZyZWUoJnBrdCk7CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmMpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZW5jb2RlX3ZpZGVvLmMgYi9kb2MvZXhhbXBsZXMvZW5jb2RlX3ZpZGVvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczMWIyYQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy9lbmNvZGVfdmlkZW8uYwpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdmlkZW8gZW5jb2Rpbmcgd2l0aCBsaWJhdmNvZGVjIEFQSSBleGFtcGxlCisgKgorICogQGV4YW1wbGUgZW5jb2RlX3ZpZGVvLmMKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGxpYmF2Y29kZWMvYXZjb2RlYy5oPgorCisjaW5jbHVkZSA8bGliYXZ1dGlsL29wdC5oPgorI2luY2x1ZGUgPGxpYmF2dXRpbC9pbWd1dGlscy5oPgorCitzdGF0aWMgdm9pZCBlbmNvZGUoQVZDb2RlY0NvbnRleHQgKmVuY19jdHgsIEFWRnJhbWUgKmZyYW1lLCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgIEZJTEUgKm91dGZpbGUpCit7CisgICAgaW50IHJldDsKKworICAgIC8qIHNlbmQgdGhlIGZyYW1lIHRvIHRoZSBlbmNvZGVyICovCisgICAgaWYgKGZyYW1lKQorICAgICAgICBwcmludGYoIlNlbmQgZnJhbWUgJTMiUFJJZDY0IlxuIiwgZnJhbWUtPnB0cyk7CisKKyAgICByZXQgPSBhdmNvZGVjX3NlbmRfZnJhbWUoZW5jX2N0eCwgZnJhbWUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igc2VuZGluZyBhIGZyYW1lIGZvciBlbmNvZGluZ1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgd2hpbGUgKHJldCA+PSAwKSB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9wYWNrZXQoZW5jX2N0eCwgcGt0KTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikgfHwgcmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBlbHNlIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGR1cmluZyBlbmNvZGluZ1xuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCJXcml0ZSBwYWNrZXQgJTMiUFJJZDY0IiAoc2l6ZT0lNWQpXG4iLCBwa3QtPnB0cywgcGt0LT5zaXplKTsKKyAgICAgICAgZndyaXRlKHBrdC0+ZGF0YSwgMSwgcGt0LT5zaXplLCBvdXRmaWxlKTsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgY29uc3QgY2hhciAqZmlsZW5hbWUsICpjb2RlY19uYW1lOworICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjOworICAgIEFWQ29kZWNDb250ZXh0ICpjPSBOVUxMOworICAgIGludCBpLCByZXQsIHgsIHk7CisgICAgRklMRSAqZjsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBBVlBhY2tldCAqcGt0OworICAgIHVpbnQ4X3QgZW5kY29kZVtdID0geyAwLCAwLCAxLCAweGI3IH07CisKKyAgICBpZiAoYXJnYyA8PSAyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxvdXRwdXQgZmlsZT4gPGNvZGVjIG5hbWU+XG4iLCBhcmd2WzBdKTsKKyAgICAgICAgZXhpdCgwKTsKKyAgICB9CisgICAgZmlsZW5hbWUgPSBhcmd2WzFdOworICAgIGNvZGVjX25hbWUgPSBhcmd2WzJdOworCisgICAgLyogZmluZCB0aGUgbXBlZzF2aWRlbyBlbmNvZGVyICovCisgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2Rlcl9ieV9uYW1lKGNvZGVjX25hbWUpOworICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb2RlYyAnJXMnIG5vdCBmb3VuZFxuIiwgY29kZWNfbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgYyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoY29kZWMpOworICAgIGlmICghYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSB2aWRlbyBjb2RlYyBjb250ZXh0XG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBwa3QgPSBhdl9wYWNrZXRfYWxsb2MoKTsKKyAgICBpZiAoIXBrdCkKKyAgICAgICAgZXhpdCgxKTsKKworICAgIC8qIHB1dCBzYW1wbGUgcGFyYW1ldGVycyAqLworICAgIGMtPmJpdF9yYXRlID0gNDAwMDAwOworICAgIC8qIHJlc29sdXRpb24gbXVzdCBiZSBhIG11bHRpcGxlIG9mIHR3byAqLworICAgIGMtPndpZHRoID0gMzUyOworICAgIGMtPmhlaWdodCA9IDI4ODsKKyAgICAvKiBmcmFtZXMgcGVyIHNlY29uZCAqLworICAgIGMtPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsxLCAyNX07CisgICAgYy0+ZnJhbWVyYXRlID0gKEFWUmF0aW9uYWwpezI1LCAxfTsKKworICAgIC8qIGVtaXQgb25lIGludHJhIGZyYW1lIGV2ZXJ5IHRlbiBmcmFtZXMKKyAgICAgKiBjaGVjayBmcmFtZSBwaWN0X3R5cGUgYmVmb3JlIHBhc3NpbmcgZnJhbWUKKyAgICAgKiB0byBlbmNvZGVyLCBpZiBmcmFtZS0+cGljdF90eXBlIGlzIEFWX1BJQ1RVUkVfVFlQRV9JCisgICAgICogdGhlbiBnb3Bfc2l6ZSBpcyBpZ25vcmVkIGFuZCB0aGUgb3V0cHV0IG9mIGVuY29kZXIKKyAgICAgKiB3aWxsIGFsd2F5cyBiZSBJIGZyYW1lIGlycmVzcGVjdGl2ZSB0byBnb3Bfc2l6ZQorICAgICAqLworICAgIGMtPmdvcF9zaXplID0gMTA7CisgICAgYy0+bWF4X2JfZnJhbWVzID0gMTsKKyAgICBjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworCisgICAgaWYgKGNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQorICAgICAgICBhdl9vcHRfc2V0KGMtPnByaXZfZGF0YSwgInByZXNldCIsICJzbG93IiwgMCk7CisKKyAgICAvKiBvcGVuIGl0ICovCisgICAgcmV0ID0gYXZjb2RlY19vcGVuMihjLCBjb2RlYywgTlVMTCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBjb2RlYzogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZiA9IGZvcGVuKGZpbGVuYW1lLCAid2IiKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWZyYW1lKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHZpZGVvIGZyYW1lXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgZnJhbWUtPmZvcm1hdCA9IGMtPnBpeF9mbXQ7CisgICAgZnJhbWUtPndpZHRoICA9IGMtPndpZHRoOworICAgIGZyYW1lLT5oZWlnaHQgPSBjLT5oZWlnaHQ7CisKKyAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKGZyYW1lLCAzMik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgdGhlIHZpZGVvIGZyYW1lIGRhdGFcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIC8qIGVuY29kZSAxIHNlY29uZCBvZiB2aWRlbyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKSB7CisgICAgICAgIGZmbHVzaChzdGRvdXQpOworCisgICAgICAgIC8qIG1ha2Ugc3VyZSB0aGUgZnJhbWUgZGF0YSBpcyB3cml0YWJsZSAqLworICAgICAgICByZXQgPSBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKGZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBleGl0KDEpOworCisgICAgICAgIC8qIHByZXBhcmUgYSBkdW1teSBpbWFnZSAqLworICAgICAgICAvKiBZICovCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBjLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGMtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdICsgeF0gPSB4ICsgeSArIGkgKiAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogQ2IgYW5kIENyICovCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBjLT5oZWlnaHQvMjsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYy0+d2lkdGgvMjsgeCsrKSB7CisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMV1beSAqIGZyYW1lLT5saW5lc2l6ZVsxXSArIHhdID0gMTI4ICsgeSArIGkgKiAyOworICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhWzJdW3kgKiBmcmFtZS0+bGluZXNpemVbMl0gKyB4XSA9IDY0ICsgeCArIGkgKiA1OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZnJhbWUtPnB0cyA9IGk7CisKKyAgICAgICAgLyogZW5jb2RlIHRoZSBpbWFnZSAqLworICAgICAgICBlbmNvZGUoYywgZnJhbWUsIHBrdCwgZik7CisgICAgfQorCisgICAgLyogZmx1c2ggdGhlIGVuY29kZXIgKi8KKyAgICBlbmNvZGUoYywgTlVMTCwgcGt0LCBmKTsKKworICAgIC8qIGFkZCBzZXF1ZW5jZSBlbmQgY29kZSB0byBoYXZlIGEgcmVhbCBNUEVHIGZpbGUgKi8KKyAgICBmd3JpdGUoZW5kY29kZSwgMSwgc2l6ZW9mKGVuZGNvZGUpLCBmKTsKKyAgICBmY2xvc2UoZik7CisKKyAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmYyk7CisgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgIGF2X3BhY2tldF9mcmVlKCZwa3QpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZXh0cmFjdF9tdnMuYyBiL2RvYy9leGFtcGxlcy9leHRyYWN0X212cy5jCmluZGV4IDk3NTE4OWMuLmRlMzFjY2QgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9leHRyYWN0X212cy5jCisrKyBiL2RvYy9leGFtcGxlcy9leHRyYWN0X212cy5jCkBAIC0zMSwyMyArMzEsMjYgQEAKIAogc3RhdGljIGludCB2aWRlb19zdHJlYW1faWR4ID0gLTE7CiBzdGF0aWMgQVZGcmFtZSAqZnJhbWUgPSBOVUxMOwotc3RhdGljIEFWUGFja2V0IHBrdDsKIHN0YXRpYyBpbnQgdmlkZW9fZnJhbWVfY291bnQgPSAwOwogCi1zdGF0aWMgaW50IGRlY29kZV9wYWNrZXQoaW50ICpnb3RfZnJhbWUsIGludCBjYWNoZWQpCitzdGF0aWMgaW50IGRlY29kZV9wYWNrZXQoY29uc3QgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBpbnQgZGVjb2RlZCA9IHBrdC5zaXplOworICAgIGludCByZXQgPSBhdmNvZGVjX3NlbmRfcGFja2V0KHZpZGVvX2RlY19jdHgsIHBrdCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSBzZW5kaW5nIGEgcGFja2V0IHRvIHRoZSBkZWNvZGVyOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKLSAgICAqZ290X2ZyYW1lID0gMDsKLQotICAgIGlmIChwa3Quc3RyZWFtX2luZGV4ID09IHZpZGVvX3N0cmVhbV9pZHgpIHsKLSAgICAgICAgaW50IHJldCA9IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMih2aWRlb19kZWNfY3R4LCBmcmFtZSwgZ290X2ZyYW1lLCAmcGt0KTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZGVjb2RpbmcgdmlkZW8gZnJhbWUgKCVzKVxuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICB3aGlsZSAocmV0ID49IDApICB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9mcmFtZSh2aWRlb19kZWNfY3R4LCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pIHx8IHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSByZWNlaXZpbmcgYSBmcmFtZSBmcm9tIHRoZSBkZWNvZGVyOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKmdvdF9mcmFtZSkgeworICAgICAgICBpZiAocmV0ID49IDApIHsKICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZDsKIApAQCAtNTgsMTkgKzYxLDE5IEBACiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNkLT5zaXplIC8gc2l6ZW9mKCptdnMpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZNb3Rpb25WZWN0b3IgKm12ID0gJm12c1tpXTsKICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCwlMmQsJTJkLCUyZCwlNGQsJTRkLCU0ZCwlNGQsMHglIlBSSXg2NCJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19mcmFtZV9jb3VudCwgbXYtPnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG12LT53LCBtdi0+aCwgbXYtPnNyY194LCBtdi0+c3JjX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtdi0+ZHN0X3gsIG12LT5kc3RfeSwgbXYtPmZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2ZyYW1lX2NvdW50LCBtdi0+c291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgbXYtPncsIG12LT5oLCBtdi0+c3JjX3gsIG12LT5zcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LT5kc3RfeCwgbXYtPmRzdF95LCBtdi0+ZmxhZ3MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBkZWNvZGVkOworICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9wZW5fY29kZWNfY29udGV4dChpbnQgKnN0cmVhbV9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgsIGVudW0gQVZNZWRpYVR5cGUgdHlwZSkKK3N0YXRpYyBpbnQgb3Blbl9jb2RlY19jb250ZXh0KEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCwgZW51bSBBVk1lZGlhVHlwZSB0eXBlKQogewogICAgIGludCByZXQ7CiAgICAgQVZTdHJlYW0gKnN0OwpAQCAtNzgsMjQgKzgxLDI3IEBACiAgICAgQVZDb2RlYyAqZGVjID0gTlVMTDsKICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOwogCi0gICAgcmV0ID0gYXZfZmluZF9iZXN0X3N0cmVhbShmbXRfY3R4LCB0eXBlLCAtMSwgLTEsIE5VTEwsIDApOworICAgIHJldCA9IGF2X2ZpbmRfYmVzdF9zdHJlYW0oZm10X2N0eCwgdHlwZSwgLTEsIC0xLCAmZGVjLCAwKTsKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBmaW5kICVzIHN0cmVhbSBpbiBpbnB1dCBmaWxlICclcydcbiIsCiAgICAgICAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHR5cGUpLCBzcmNfZmlsZW5hbWUpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgICpzdHJlYW1faWR4ID0gcmV0OwotICAgICAgICBzdCA9IGZtdF9jdHgtPnN0cmVhbXNbKnN0cmVhbV9pZHhdOworICAgICAgICBpbnQgc3RyZWFtX2lkeCA9IHJldDsKKyAgICAgICAgc3QgPSBmbXRfY3R4LT5zdHJlYW1zW3N0cmVhbV9pZHhdOwogCi0gICAgICAgIC8qIGZpbmQgZGVjb2RlciBmb3IgdGhlIHN0cmVhbSAqLwotICAgICAgICBkZWNfY3R4ID0gc3QtPmNvZGVjOwotICAgICAgICBkZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihkZWNfY3R4LT5jb2RlY19pZCk7Ci0gICAgICAgIGlmICghZGVjKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBmaW5kICVzIGNvZGVjXG4iLAotICAgICAgICAgICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcodHlwZSkpOworICAgICAgICBkZWNfY3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhkZWMpOworICAgICAgICBpZiAoIWRlY19jdHgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGNvZGVjXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KIAorICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChkZWNfY3R4LCBzdC0+Y29kZWNwYXIpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29weSBjb2RlYyBwYXJhbWV0ZXJzIHRvIGNvZGVjIGNvbnRleHRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIEluaXQgdGhlIHZpZGVvIGRlY29kZXIgKi8KICAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJmbGFnczIiLCAiK2V4cG9ydF9tdnMiLCAwKTsKICAgICAgICAgaWYgKChyZXQgPSBhdmNvZGVjX29wZW4yKGRlY19jdHgsIGRlYywgJm9wdHMpKSA8IDApIHsKQEAgLTEwMyw2ICsxMDksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHR5cGUpKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KKworICAgICAgICB2aWRlb19zdHJlYW1faWR4ID0gc3RyZWFtX2lkeDsKKyAgICAgICAgdmlkZW9fc3RyZWFtID0gZm10X2N0eC0+c3RyZWFtc1t2aWRlb19zdHJlYW1faWR4XTsKKyAgICAgICAgdmlkZW9fZGVjX2N0eCA9IGRlY19jdHg7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0xMTAsNyArMTIwLDggQEAKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICAgIGludCByZXQgPSAwLCBnb3RfZnJhbWU7CisgICAgaW50IHJldCA9IDA7CisgICAgQVZQYWNrZXQgcGt0ID0geyAwIH07CiAKICAgICBpZiAoYXJnYyAhPSAyKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDx2aWRlbz5cbiIsIGFyZ3ZbMF0pOwpAQCAtMTE4LDggKzEyOSw2IEBACiAgICAgfQogICAgIHNyY19maWxlbmFtZSA9IGFyZ3ZbMV07CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGlmIChhdmZvcm1hdF9vcGVuX2lucHV0KCZmbXRfY3R4LCBzcmNfZmlsZW5hbWUsIE5VTEwsIE5VTEwpIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHNvdXJjZSBmaWxlICVzXG4iLCBzcmNfZmlsZW5hbWUpOwogICAgICAgICBleGl0KDEpOwpAQCAtMTMwLDEwICsxMzksNyBAQAogICAgICAgICBleGl0KDEpOwogICAgIH0KIAotICAgIGlmIChvcGVuX2NvZGVjX2NvbnRleHQoJnZpZGVvX3N0cmVhbV9pZHgsIGZtdF9jdHgsIEFWTUVESUFfVFlQRV9WSURFTykgPj0gMCkgewotICAgICAgICB2aWRlb19zdHJlYW0gPSBmbXRfY3R4LT5zdHJlYW1zW3ZpZGVvX3N0cmVhbV9pZHhdOwotICAgICAgICB2aWRlb19kZWNfY3R4ID0gdmlkZW9fc3RyZWFtLT5jb2RlYzsKLSAgICB9CisgICAgb3Blbl9jb2RlY19jb250ZXh0KGZtdF9jdHgsIEFWTUVESUFfVFlQRV9WSURFTyk7CiAKICAgICBhdl9kdW1wX2Zvcm1hdChmbXRfY3R4LCAwLCBzcmNfZmlsZW5hbWUsIDApOwogCkBAIC0xNTIsMzMgKzE1OCwyMCBAQAogCiAgICAgcHJpbnRmKCJmcmFtZW51bSxzb3VyY2UsYmxvY2t3LGJsb2NraCxzcmN4LHNyY3ksZHN0eCxkc3R5LGZsYWdzXG4iKTsKIAotICAgIC8qIGluaXRpYWxpemUgcGFja2V0LCBzZXQgZGF0YSB0byBOVUxMLCBsZXQgdGhlIGRlbXV4ZXIgZmlsbCBpdCAqLwotICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOwotICAgIHBrdC5kYXRhID0gTlVMTDsKLSAgICBwa3Quc2l6ZSA9IDA7Ci0KICAgICAvKiByZWFkIGZyYW1lcyBmcm9tIHRoZSBmaWxlICovCiAgICAgd2hpbGUgKGF2X3JlYWRfZnJhbWUoZm10X2N0eCwgJnBrdCkgPj0gMCkgewotICAgICAgICBBVlBhY2tldCBvcmlnX3BrdCA9IHBrdDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BhY2tldCgmZ290X2ZyYW1lLCAwKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcGt0LmRhdGEgKz0gcmV0OwotICAgICAgICAgICAgcGt0LnNpemUgLT0gcmV0OwotICAgICAgICB9IHdoaWxlIChwa3Quc2l6ZSA+IDApOwotICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJm9yaWdfcGt0KTsKKyAgICAgICAgaWYgKHBrdC5zdHJlYW1faW5kZXggPT0gdmlkZW9fc3RyZWFtX2lkeCkKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9wYWNrZXQoJnBrdCk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvKiBmbHVzaCBjYWNoZWQgZnJhbWVzICovCi0gICAgcGt0LmRhdGEgPSBOVUxMOwotICAgIHBrdC5zaXplID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIGRlY29kZV9wYWNrZXQoJmdvdF9mcmFtZSwgMSk7Ci0gICAgfSB3aGlsZSAoZ290X2ZyYW1lKTsKKyAgICBkZWNvZGVfcGFja2V0KE5VTEwpOwogCiBlbmQ6Ci0gICAgYXZjb2RlY19jbG9zZSh2aWRlb19kZWNfY3R4KTsKKyAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmdmlkZW9fZGVjX2N0eCk7CiAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmZtdF9jdHgpOwogICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKICAgICByZXR1cm4gcmV0IDwgMDsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9maWx0ZXJfYXVkaW8uYyBiL2RvYy9leGFtcGxlcy9maWx0ZXJfYXVkaW8uYwppbmRleCAwMTc2MWRjLi4xNjExZTNkIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZmlsdGVyX2F1ZGlvLmMKKysrIGIvZG9jL2V4YW1wbGVzL2ZpbHRlcl9hdWRpby5jCkBAIC02NCwxMyArNjQsMTMgQEAKIHsKICAgICBBVkZpbHRlckdyYXBoICpmaWx0ZXJfZ3JhcGg7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICphYnVmZmVyX2N0eDsKLSAgICBBVkZpbHRlciAgICAgICAgKmFidWZmZXI7CisgICAgY29uc3QgQVZGaWx0ZXIgICphYnVmZmVyOwogICAgIEFWRmlsdGVyQ29udGV4dCAqdm9sdW1lX2N0eDsKLSAgICBBVkZpbHRlciAgICAgICAgKnZvbHVtZTsKKyAgICBjb25zdCBBVkZpbHRlciAgKnZvbHVtZTsKICAgICBBVkZpbHRlckNvbnRleHQgKmFmb3JtYXRfY3R4OwotICAgIEFWRmlsdGVyICAgICAgICAqYWZvcm1hdDsKKyAgICBjb25zdCBBVkZpbHRlciAgKmFmb3JtYXQ7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICphYnVmZmVyc2lua19jdHg7Ci0gICAgQVZGaWx0ZXIgICAgICAgICphYnVmZmVyc2luazsKKyAgICBjb25zdCBBVkZpbHRlciAgKmFidWZmZXJzaW5rOwogCiAgICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zX2RpY3QgPSBOVUxMOwogICAgIHVpbnQ4X3Qgb3B0aW9uc19zdHJbMTAyNF07CkBAIC0yODksOCArMjg5LDYgQEAKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCi0gICAgYXZmaWx0ZXJfcmVnaXN0ZXJfYWxsKCk7Ci0KICAgICAvKiBBbGxvY2F0ZSB0aGUgZnJhbWUgd2Ugd2lsbCBiZSB1c2luZyB0byBzdG9yZSB0aGUgZGF0YS4gKi8KICAgICBmcmFtZSAgPSBhdl9mcmFtZV9hbGxvYygpOwogICAgIGlmICghZnJhbWUpIHsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9maWx0ZXJpbmdfYXVkaW8uYyBiL2RvYy9leGFtcGxlcy9maWx0ZXJpbmdfYXVkaW8uYwppbmRleCA4OWM4MGNmLi5iMTA5ZGJjIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvZmlsdGVyaW5nX2F1ZGlvLmMKKysrIGIvZG9jL2V4YW1wbGVzL2ZpbHRlcmluZ19hdWRpby5jCkBAIC0zMiw3ICszMiw2IEBACiAKICNpbmNsdWRlIDxsaWJhdmNvZGVjL2F2Y29kZWMuaD4KICNpbmNsdWRlIDxsaWJhdmZvcm1hdC9hdmZvcm1hdC5oPgotI2luY2x1ZGUgPGxpYmF2ZmlsdGVyL2F2ZmlsdGVyZ3JhcGguaD4KICNpbmNsdWRlIDxsaWJhdmZpbHRlci9idWZmZXJzaW5rLmg+CiAjaW5jbHVkZSA8bGliYXZmaWx0ZXIvYnVmZmVyc3JjLmg+CiAjaW5jbHVkZSA8bGliYXZ1dGlsL29wdC5oPgpAQCAtNjUsMTEgKzY0LDE2IEBACiAgICAgLyogc2VsZWN0IHRoZSBhdWRpbyBzdHJlYW0gKi8KICAgICByZXQgPSBhdl9maW5kX2Jlc3Rfc3RyZWFtKGZtdF9jdHgsIEFWTUVESUFfVFlQRV9BVURJTywgLTEsIC0xLCAmZGVjLCAwKTsKICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGZpbmQgYSBhdWRpbyBzdHJlYW0gaW4gdGhlIGlucHV0IGZpbGVcbiIpOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGZpbmQgYW4gYXVkaW8gc3RyZWFtIGluIHRoZSBpbnB1dCBmaWxlXG4iKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgYXVkaW9fc3RyZWFtX2luZGV4ID0gcmV0OwotICAgIGRlY19jdHggPSBmbXRfY3R4LT5zdHJlYW1zW2F1ZGlvX3N0cmVhbV9pbmRleF0tPmNvZGVjOworCisgICAgLyogY3JlYXRlIGRlY29kaW5nIGNvbnRleHQgKi8KKyAgICBkZWNfY3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhkZWMpOworICAgIGlmICghZGVjX2N0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChkZWNfY3R4LCBmbXRfY3R4LT5zdHJlYW1zW2F1ZGlvX3N0cmVhbV9pbmRleF0tPmNvZGVjcGFyKTsKICAgICBhdl9vcHRfc2V0X2ludChkZWNfY3R4LCAicmVmY291bnRlZF9mcmFtZXMiLCAxLCAwKTsKIAogICAgIC8qIGluaXQgdGhlIGF1ZGlvIGRlY29kZXIgKi8KQEAgLTg1LDggKzg5LDggQEAKIHsKICAgICBjaGFyIGFyZ3NbNTEyXTsKICAgICBpbnQgcmV0ID0gMDsKLSAgICBBVkZpbHRlciAqYWJ1ZmZlcnNyYyAgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYWJ1ZmZlciIpOwotICAgIEFWRmlsdGVyICphYnVmZmVyc2luayA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJhYnVmZmVyc2luayIpOworICAgIGNvbnN0IEFWRmlsdGVyICphYnVmZmVyc3JjICA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJhYnVmZmVyIik7CisgICAgY29uc3QgQVZGaWx0ZXIgKmFidWZmZXJzaW5rID0gYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImFidWZmZXJzaW5rIik7CiAgICAgQVZGaWx0ZXJJbk91dCAqb3V0cHV0cyA9IGF2ZmlsdGVyX2lub3V0X2FsbG9jKCk7CiAgICAgQVZGaWx0ZXJJbk91dCAqaW5wdXRzICA9IGF2ZmlsdGVyX2lub3V0X2FsbG9jKCk7CiAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgb3V0X3NhbXBsZV9mbXRzW10gPSB7IEFWX1NBTVBMRV9GTVRfUzE2LCAtMSB9OwpAQCAtMTk2LDcgKzIwMCw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X2ZyYW1lKGNvbnN0IEFWRnJhbWUgKmZyYW1lKQogewotICAgIGNvbnN0IGludCBuID0gZnJhbWUtPm5iX3NhbXBsZXMgKiBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYXZfZnJhbWVfZ2V0X2NoYW5uZWxfbGF5b3V0KGZyYW1lKSk7CisgICAgY29uc3QgaW50IG4gPSBmcmFtZS0+bmJfc2FtcGxlcyAqIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpOwogICAgIGNvbnN0IHVpbnQxNl90ICpwICAgICA9ICh1aW50MTZfdCopZnJhbWUtPmRhdGFbMF07CiAgICAgY29uc3QgdWludDE2X3QgKnBfZW5kID0gcCArIG47CiAKQEAgLTIxMSwxMCArMjE1LDkgQEAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKICAgICBpbnQgcmV0OwotICAgIEFWUGFja2V0IHBhY2tldDAsIHBhY2tldDsKKyAgICBBVlBhY2tldCBwYWNrZXQ7CiAgICAgQVZGcmFtZSAqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwogICAgIEFWRnJhbWUgKmZpbHRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGludCBnb3RfZnJhbWU7CiAKICAgICBpZiAoIWZyYW1lIHx8ICFmaWx0X2ZyYW1lKSB7CiAgICAgICAgIHBlcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lIik7CkBAIC0yMjUsNjMgKzIyOCw1OCBAQAogICAgICAgICBleGl0KDEpOwogICAgIH0KIAotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwotICAgIGF2ZmlsdGVyX3JlZ2lzdGVyX2FsbCgpOwotCiAgICAgaWYgKChyZXQgPSBvcGVuX2lucHV0X2ZpbGUoYXJndlsxXSkpIDwgMCkKICAgICAgICAgZ290byBlbmQ7CiAgICAgaWYgKChyZXQgPSBpbml0X2ZpbHRlcnMoZmlsdGVyX2Rlc2NyKSkgPCAwKQogICAgICAgICBnb3RvIGVuZDsKIAogICAgIC8qIHJlYWQgYWxsIHBhY2tldHMgKi8KLSAgICBwYWNrZXQwLmRhdGEgPSBOVUxMOwotICAgIHBhY2tldC5kYXRhID0gTlVMTDsKICAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIXBhY2tldDAuZGF0YSkgewotICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9yZWFkX2ZyYW1lKGZtdF9jdHgsICZwYWNrZXQpKSA8IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBwYWNrZXQwID0gcGFja2V0OwotICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gYXZfcmVhZF9mcmFtZShmbXRfY3R4LCAmcGFja2V0KSkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgaWYgKHBhY2tldC5zdHJlYW1faW5kZXggPT0gYXVkaW9fc3RyZWFtX2luZGV4KSB7Ci0gICAgICAgICAgICBnb3RfZnJhbWUgPSAwOwotICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KGRlY19jdHgsIGZyYW1lLCAmZ290X2ZyYW1lLCAmcGFja2V0KTsKKyAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfc2VuZF9wYWNrZXQoZGVjX2N0eCwgJnBhY2tldCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyBhdWRpb1xuIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoaWxlIHNlbmRpbmcgYSBwYWNrZXQgdG8gdGhlIGRlY29kZXJcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFja2V0LnNpemUgLT0gcmV0OwotICAgICAgICAgICAgcGFja2V0LmRhdGEgKz0gcmV0OwogCi0gICAgICAgICAgICBpZiAoZ290X2ZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgLyogcHVzaCB0aGUgYXVkaW8gZGF0YSBmcm9tIGRlY29kZWQgZnJhbWUgaW50byB0aGUgZmlsdGVyZ3JhcGggKi8KLSAgICAgICAgICAgICAgICBpZiAoYXZfYnVmZmVyc3JjX2FkZF9mcmFtZV9mbGFncyhidWZmZXJzcmNfY3R4LCBmcmFtZSwgMCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGlsZSBmZWVkaW5nIHRoZSBhdWRpbyBmaWx0ZXJncmFwaFxuIik7CisgICAgICAgICAgICB3aGlsZSAocmV0ID49IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoZGVjX2N0eCwgZnJhbWUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pIHx8IHJldCA9PSBBVkVSUk9SX0VPRikgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoaWxlIHJlY2VpdmluZyBhIGZyYW1lIGZyb20gdGhlIGRlY29kZXJcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvKiBwdWxsIGZpbHRlcmVkIGF1ZGlvIGZyb20gdGhlIGZpbHRlcmdyYXBoICovCi0gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZfYnVmZmVyc2lua19nZXRfZnJhbWUoYnVmZmVyc2lua19jdHgsIGZpbHRfZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHB1c2ggdGhlIGF1ZGlvIGRhdGEgZnJvbSBkZWNvZGVkIGZyYW1lIGludG8gdGhlIGZpbHRlcmdyYXBoICovCisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKGJ1ZmZlcnNyY19jdHgsIGZyYW1lLCBBVl9CVUZGRVJTUkNfRkxBR19LRUVQX1JFRikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hpbGUgZmVlZGluZyB0aGUgYXVkaW8gZmlsdGVyZ3JhcGhcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50X2ZyYW1lKGZpbHRfZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmaWx0X2ZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIHB1bGwgZmlsdGVyZWQgYXVkaW8gZnJvbSB0aGUgZmlsdGVyZ3JhcGggKi8KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lKGJ1ZmZlcnNpbmtfY3R4LCBmaWx0X2ZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pIHx8IHJldCA9PSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfZnJhbWUoZmlsdF9mcmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmaWx0X2ZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocGFja2V0LnNpemUgPD0gMCkKLSAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBhY2tldDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogZGlzY2FyZCBub24td2FudGVkIHBhY2tldHMgKi8KLSAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGFja2V0MCk7CiAgICAgICAgIH0KKyAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwYWNrZXQpOwogICAgIH0KIGVuZDoKICAgICBhdmZpbHRlcl9ncmFwaF9mcmVlKCZmaWx0ZXJfZ3JhcGgpOwotICAgIGF2Y29kZWNfY2xvc2UoZGVjX2N0eCk7CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmRlY19jdHgpOwogICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZmbXRfY3R4KTsKICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CiAgICAgYXZfZnJhbWVfZnJlZSgmZmlsdF9mcmFtZSk7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvZmlsdGVyaW5nX3ZpZGVvLmMgYi9kb2MvZXhhbXBsZXMvZmlsdGVyaW5nX3ZpZGVvLmMKaW5kZXggM2RhYmYxMy4uZWQ0ZTdiYiAxMDA2NDQKLS0tIGEvZG9jL2V4YW1wbGVzL2ZpbHRlcmluZ192aWRlby5jCisrKyBiL2RvYy9leGFtcGxlcy9maWx0ZXJpbmdfdmlkZW8uYwpAQCAtMzIsNyArMzIsNiBAQAogCiAjaW5jbHVkZSA8bGliYXZjb2RlYy9hdmNvZGVjLmg+CiAjaW5jbHVkZSA8bGliYXZmb3JtYXQvYXZmb3JtYXQuaD4KLSNpbmNsdWRlIDxsaWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmg+CiAjaW5jbHVkZSA8bGliYXZmaWx0ZXIvYnVmZmVyc2luay5oPgogI2luY2x1ZGUgPGxpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oPgogI2luY2x1ZGUgPGxpYmF2dXRpbC9vcHQuaD4KQEAgLTcyLDcgKzcxLDEyIEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIHZpZGVvX3N0cmVhbV9pbmRleCA9IHJldDsKLSAgICBkZWNfY3R4ID0gZm10X2N0eC0+c3RyZWFtc1t2aWRlb19zdHJlYW1faW5kZXhdLT5jb2RlYzsKKworICAgIC8qIGNyZWF0ZSBkZWNvZGluZyBjb250ZXh0ICovCisgICAgZGVjX2N0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoZGVjKTsKKyAgICBpZiAoIWRlY19jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoZGVjX2N0eCwgZm10X2N0eC0+c3RyZWFtc1t2aWRlb19zdHJlYW1faW5kZXhdLT5jb2RlY3Bhcik7CiAgICAgYXZfb3B0X3NldF9pbnQoZGVjX2N0eCwgInJlZmNvdW50ZWRfZnJhbWVzIiwgMSwgMCk7CiAKICAgICAvKiBpbml0IHRoZSB2aWRlbyBkZWNvZGVyICovCkBAIC04OCw4ICs5Miw4IEBACiB7CiAgICAgY2hhciBhcmdzWzUxMl07CiAgICAgaW50IHJldCA9IDA7Ci0gICAgQVZGaWx0ZXIgKmJ1ZmZlcnNyYyAgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYnVmZmVyIik7Ci0gICAgQVZGaWx0ZXIgKmJ1ZmZlcnNpbmsgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYnVmZmVyc2luayIpOworICAgIGNvbnN0IEFWRmlsdGVyICpidWZmZXJzcmMgID0gYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImJ1ZmZlciIpOworICAgIGNvbnN0IEFWRmlsdGVyICpidWZmZXJzaW5rID0gYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImJ1ZmZlcnNpbmsiKTsKICAgICBBVkZpbHRlckluT3V0ICpvdXRwdXRzID0gYXZmaWx0ZXJfaW5vdXRfYWxsb2MoKTsKICAgICBBVkZpbHRlckluT3V0ICppbnB1dHMgID0gYXZmaWx0ZXJfaW5vdXRfYWxsb2MoKTsKICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZSA9IGZtdF9jdHgtPnN0cmVhbXNbdmlkZW9fc3RyZWFtX2luZGV4XS0+dGltZV9iYXNlOwpAQCAtMjA4LDcgKzIxMiw2IEBACiAgICAgQVZQYWNrZXQgcGFja2V0OwogICAgIEFWRnJhbWUgKmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKICAgICBBVkZyYW1lICpmaWx0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpbnQgZ290X2ZyYW1lOwogCiAgICAgaWYgKCFmcmFtZSB8fCAhZmlsdF9mcmFtZSkgewogICAgICAgICBwZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZSIpOwpAQCAtMjE5LDkgKzIyMiw2IEBACiAgICAgICAgIGV4aXQoMSk7CiAgICAgfQogCi0gICAgYXZfcmVnaXN0ZXJfYWxsKCk7Ci0gICAgYXZmaWx0ZXJfcmVnaXN0ZXJfYWxsKCk7Ci0KICAgICBpZiAoKHJldCA9IG9wZW5faW5wdXRfZmlsZShhcmd2WzFdKSkgPCAwKQogICAgICAgICBnb3RvIGVuZDsKICAgICBpZiAoKHJldCA9IGluaXRfZmlsdGVycyhmaWx0ZXJfZGVzY3IpKSA8IDApCkBAIC0yMzMsNDAgKzIzMyw0OSBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgaWYgKHBhY2tldC5zdHJlYW1faW5kZXggPT0gdmlkZW9fc3RyZWFtX2luZGV4KSB7Ci0gICAgICAgICAgICBnb3RfZnJhbWUgPSAwOwotICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfdmlkZW8yKGRlY19jdHgsIGZyYW1lLCAmZ290X2ZyYW1lLCAmcGFja2V0KTsKKyAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfc2VuZF9wYWNrZXQoZGVjX2N0eCwgJnBhY2tldCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBkZWNvZGluZyB2aWRlb1xuIik7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoaWxlIHNlbmRpbmcgYSBwYWNrZXQgdG8gdGhlIGRlY29kZXJcbiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZ290X2ZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPnB0cyA9IGF2X2ZyYW1lX2dldF9iZXN0X2VmZm9ydF90aW1lc3RhbXAoZnJhbWUpOwotCi0gICAgICAgICAgICAgICAgLyogcHVzaCB0aGUgZGVjb2RlZCBmcmFtZSBpbnRvIHRoZSBmaWx0ZXJncmFwaCAqLwotICAgICAgICAgICAgICAgIGlmIChhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKGJ1ZmZlcnNyY19jdHgsIGZyYW1lLCBBVl9CVUZGRVJTUkNfRkxBR19LRUVQX1JFRikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGlsZSBmZWVkaW5nIHRoZSBmaWx0ZXJncmFwaFxuIik7CisgICAgICAgICAgICB3aGlsZSAocmV0ID49IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoZGVjX2N0eCwgZnJhbWUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pIHx8IHJldCA9PSBBVkVSUk9SX0VPRikgewogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoaWxlIHJlY2VpdmluZyBhIGZyYW1lIGZyb20gdGhlIGRlY29kZXJcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvKiBwdWxsIGZpbHRlcmVkIGZyYW1lcyBmcm9tIHRoZSBmaWx0ZXJncmFwaCAqLwotICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lKGJ1ZmZlcnNpbmtfY3R4LCBmaWx0X2ZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikgfHwgcmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cHRzID0gZnJhbWUtPmJlc3RfZWZmb3J0X3RpbWVzdGFtcDsKKworICAgICAgICAgICAgICAgICAgICAvKiBwdXNoIHRoZSBkZWNvZGVkIGZyYW1lIGludG8gdGhlIGZpbHRlcmdyYXBoICovCisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKGJ1ZmZlcnNyY19jdHgsIGZyYW1lLCBBVl9CVUZGRVJTUkNfRkxBR19LRUVQX1JFRikgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hpbGUgZmVlZGluZyB0aGUgZmlsdGVyZ3JhcGhcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfZnJhbWUoZmlsdF9mcmFtZSwgYnVmZmVyc2lua19jdHgtPmlucHV0c1swXS0+dGltZV9iYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYoZmlsdF9mcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBwdWxsIGZpbHRlcmVkIGZyYW1lcyBmcm9tIHRoZSBmaWx0ZXJncmFwaCAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZfYnVmZmVyc2lua19nZXRfZnJhbWUoYnVmZmVyc2lua19jdHgsIGZpbHRfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikgfHwgcmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X2ZyYW1lKGZpbHRfZnJhbWUsIGJ1ZmZlcnNpbmtfY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmaWx0X2ZyYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBhY2tldCk7CiAgICAgfQogZW5kOgogICAgIGF2ZmlsdGVyX2dyYXBoX2ZyZWUoJmZpbHRlcl9ncmFwaCk7Ci0gICAgYXZjb2RlY19jbG9zZShkZWNfY3R4KTsKKyAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmZGVjX2N0eCk7CiAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmZtdF9jdHgpOwogICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKICAgICBhdl9mcmFtZV9mcmVlKCZmaWx0X2ZyYW1lKTsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9odHRwX211bHRpY2xpZW50LmMgYi9kb2MvZXhhbXBsZXMvaHR0cF9tdWx0aWNsaWVudC5jCmluZGV4IGI5YTMwNmQuLjgzMWU4OWMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9odHRwX211bHRpY2xpZW50LmMKKysrIGIvZG9jL2V4YW1wbGVzL2h0dHBfbXVsdGljbGllbnQuYwpAQCAtMzMsMTggKzMzLDE5IEBACiAjaW5jbHVkZSA8bGliYXZ1dGlsL29wdC5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi12b2lkIHByb2Nlc3NfY2xpZW50KEFWSU9Db250ZXh0ICpjbGllbnQsIGNvbnN0IGNoYXIgKmluX3VyaSkKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY2xpZW50KEFWSU9Db250ZXh0ICpjbGllbnQsIGNvbnN0IGNoYXIgKmluX3VyaSkKIHsKICAgICBBVklPQ29udGV4dCAqaW5wdXQgPSBOVUxMOwogICAgIHVpbnQ4X3QgYnVmWzEwMjRdOwogICAgIGludCByZXQsIG4sIHJlcGx5X2NvZGU7Ci0gICAgY2hhciAqcmVzb3VyY2UgPSBOVUxMOworICAgIHVpbnQ4X3QgKnJlc291cmNlID0gTlVMTDsKICAgICB3aGlsZSAoKHJldCA9IGF2aW9faGFuZHNoYWtlKGNsaWVudCkpID4gMCkgewogICAgICAgICBhdl9vcHRfZ2V0KGNsaWVudCwgInJlc291cmNlIiwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiwgJnJlc291cmNlKTsKICAgICAgICAgLy8gY2hlY2sgZm9yIHN0cmxlbihyZXNvdXJjZSkgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIGF2X29wdF9nZXQoKQogICAgICAgICAvLyBtYXkgcmV0dXJuIGVtcHR5IHN0cmluZy4KICAgICAgICAgaWYgKHJlc291cmNlICYmIHN0cmxlbihyZXNvdXJjZSkpCiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXZfZnJlZXAoJnJlc291cmNlKTsKICAgICB9CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIGdvdG8gZW5kOwpAQCAtOTMsMTUgKzk0LDE2IEBACiAgICAgYXZpb19jbG9zZShjbGllbnQpOwogICAgIGZwcmludGYoc3RkZXJyLCAiQ2xvc2luZyBpbnB1dFxuIik7CiAgICAgYXZpb19jbG9zZShpbnB1dCk7CisgICAgYXZfZnJlZXAoJnJlc291cmNlKTsKIH0KIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX1RSQUNFKTsKICAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOwogICAgIEFWSU9Db250ZXh0ICpjbGllbnQgPSBOVUxMLCAqc2VydmVyID0gTlVMTDsKICAgICBjb25zdCBjaGFyICppbl91cmksICpvdXRfdXJpOwogICAgIGludCByZXQsIHBpZDsKKyAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19UUkFDRSk7CiAgICAgaWYgKGFyZ2MgPCAzKSB7CiAgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIGlucHV0IGh0dHA6Ly9ob3N0bmFtZVs6cG9ydF1cbiIKICAgICAgICAgICAgICAgICJBUEkgZXhhbXBsZSBwcm9ncmFtIHRvIHNlcnZlIGh0dHAgdG8gbXVsdGlwbGUgY2xpZW50cy5cbiIKQEAgLTExMiw3ICsxMTQsNiBAQAogICAgIGluX3VyaSA9IGFyZ3ZbMV07CiAgICAgb3V0X3VyaSA9IGFyZ3ZbMl07CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKICAgICBhdmZvcm1hdF9uZXR3b3JrX2luaXQoKTsKIAogICAgIGlmICgocmV0ID0gYXZfZGljdF9zZXQoJm9wdGlvbnMsICJsaXN0ZW4iLCAiMiIsIDApKSA8IDApIHsKZGlmZiAtLWdpdCBhL2RvYy9leGFtcGxlcy9od19kZWNvZGUuYyBiL2RvYy9leGFtcGxlcy9od19kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2FlOGRmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2V4YW1wbGVzL2h3X2RlY29kZS5jCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IEp1biBaaGFvCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgS2FpeHVhbiBMaXUKKyAqCisgKiBIVyBBY2NlbGVyYXRpb24gQVBJICh2aWRlbyBkZWNvZGluZykgZGVjb2RlIHNhbXBsZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBIVy1BY2NlbGVyYXRlZCBkZWNvZGluZyBleGFtcGxlLgorICoKKyAqIEBleGFtcGxlIGh3X2RlY29kZS5jCisgKiBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIGRvIEhXLWFjY2VsZXJhdGVkIGRlY29kaW5nIHdpdGggb3V0cHV0CisgKiBmcmFtZXMgZnJvbSB0aGUgSFcgdmlkZW8gc3VyZmFjZXMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxsaWJhdmNvZGVjL2F2Y29kZWMuaD4KKyNpbmNsdWRlIDxsaWJhdmZvcm1hdC9hdmZvcm1hdC5oPgorI2luY2x1ZGUgPGxpYmF2dXRpbC9waXhkZXNjLmg+CisjaW5jbHVkZSA8bGliYXZ1dGlsL2h3Y29udGV4dC5oPgorI2luY2x1ZGUgPGxpYmF2dXRpbC9vcHQuaD4KKyNpbmNsdWRlIDxsaWJhdnV0aWwvYXZhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaWJhdnV0aWwvaW1ndXRpbHMuaD4KKworc3RhdGljIEFWQnVmZmVyUmVmICpod19kZXZpY2VfY3R4ID0gTlVMTDsKK3N0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgaHdfcGl4X2ZtdDsKK3N0YXRpYyBGSUxFICpvdXRwdXRfZmlsZSA9IE5VTEw7CisKK3N0YXRpYyBpbnQgaHdfZGVjb2Rlcl9pbml0KEFWQ29kZWNDb250ZXh0ICpjdHgsIGNvbnN0IGVudW0gQVZIV0RldmljZVR5cGUgdHlwZSkKK3sKKyAgICBpbnQgZXJyID0gMDsKKworICAgIGlmICgoZXJyID0gYXZfaHdkZXZpY2VfY3R4X2NyZWF0ZSgmaHdfZGV2aWNlX2N0eCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgMCkpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjcmVhdGUgc3BlY2lmaWVkIEhXIGRldmljZS5cbiIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBjdHgtPmh3X2RldmljZV9jdHggPSBhdl9idWZmZXJfcmVmKGh3X2RldmljZV9jdHgpOworCisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBnZXRfaHdfZm9ybWF0KEFWQ29kZWNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10cykKK3sKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnA7CisKKyAgICBmb3IgKHAgPSBwaXhfZm10czsgKnAgIT0gLTE7IHArKykgeworICAgICAgICBpZiAoKnAgPT0gaHdfcGl4X2ZtdCkKKyAgICAgICAgICAgIHJldHVybiAqcDsKKyAgICB9CisKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgSFcgc3VyZmFjZSBmb3JtYXQuXG4iKTsKKyAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOworfQorCitzdGF0aWMgaW50IGRlY29kZV93cml0ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwYWNrZXQpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBOVUxMLCAqc3dfZnJhbWUgPSBOVUxMOworICAgIEFWRnJhbWUgKnRtcF9mcmFtZSA9IE5VTEw7CisgICAgdWludDhfdCAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHJldCA9IGF2Y29kZWNfc2VuZF9wYWNrZXQoYXZjdHgsIHBhY2tldCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgZGVjb2RpbmdcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkgfHwgIShzd19mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3QgYWxsb2MgZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZjb2RlY19yZWNlaXZlX2ZyYW1lKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pIHx8IHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmc3dfZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSBkZWNvZGluZ1xuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWUtPmZvcm1hdCA9PSBod19waXhfZm10KSB7CisgICAgICAgICAgICAvKiByZXRyaWV2ZSBkYXRhIGZyb20gR1BVIHRvIENQVSAqLworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9od2ZyYW1lX3RyYW5zZmVyX2RhdGEoc3dfZnJhbWUsIGZyYW1lLCAwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB0cmFuc2ZlcnJpbmcgdGhlIGRhdGEgdG8gc3lzdGVtIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG1wX2ZyYW1lID0gc3dfZnJhbWU7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgdG1wX2ZyYW1lID0gZnJhbWU7CisKKyAgICAgICAgc2l6ZSA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZSh0bXBfZnJhbWUtPmZvcm1hdCwgdG1wX2ZyYW1lLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfZnJhbWUtPmhlaWdodCwgMSk7CisgICAgICAgIGJ1ZmZlciA9IGF2X21hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuIG5vdCBhbGxvYyBidWZmZXJcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHJldCA9IGF2X2ltYWdlX2NvcHlfdG9fYnVmZmVyKGJ1ZmZlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCAqKXRtcF9mcmFtZS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludCAqKXRtcF9mcmFtZS0+bGluZXNpemUsIHRtcF9mcmFtZS0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfZnJhbWUtPndpZHRoLCB0bXBfZnJhbWUtPmhlaWdodCwgMSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbiBub3QgY29weSBpbWFnZSB0byBidWZmZXJcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBmd3JpdGUoYnVmZmVyLCAxLCBzaXplLCBvdXRwdXRfZmlsZSkpIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZHVtcCByYXcgZGF0YS5cbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICBmYWlsOgorICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnN3X2ZyYW1lKTsKKyAgICAgICAgYXZfZnJlZXAoJmJ1ZmZlcik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICppbnB1dF9jdHggPSBOVUxMOworICAgIGludCB2aWRlb19zdHJlYW0sIHJldDsKKyAgICBBVlN0cmVhbSAqdmlkZW8gPSBOVUxMOworICAgIEFWQ29kZWNDb250ZXh0ICpkZWNvZGVyX2N0eCA9IE5VTEw7CisgICAgQVZDb2RlYyAqZGVjb2RlciA9IE5VTEw7CisgICAgQVZQYWNrZXQgcGFja2V0OworICAgIGVudW0gQVZIV0RldmljZVR5cGUgdHlwZTsKKyAgICBpbnQgaTsKKworICAgIGlmIChhcmdjIDwgNCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyA8ZGV2aWNlIHR5cGU+IDxpbnB1dCBmaWxlPiA8b3V0cHV0IGZpbGU+XG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHR5cGUgPSBhdl9od2RldmljZV9maW5kX3R5cGVfYnlfbmFtZShhcmd2WzFdKTsKKyAgICBpZiAodHlwZSA9PSBBVl9IV0RFVklDRV9UWVBFX05PTkUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJEZXZpY2UgdHlwZSAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwgYXJndlsxXSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQXZhaWxhYmxlIGRldmljZSB0eXBlczoiKTsKKyAgICAgICAgd2hpbGUoKHR5cGUgPSBhdl9od2RldmljZV9pdGVyYXRlX3R5cGVzKHR5cGUpKSAhPSBBVl9IV0RFVklDRV9UWVBFX05PTkUpCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAlcyIsIGF2X2h3ZGV2aWNlX2dldF90eXBlX25hbWUodHlwZSkpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBvcGVuIHRoZSBpbnB1dCBmaWxlICovCisgICAgaWYgKGF2Zm9ybWF0X29wZW5faW5wdXQoJmlucHV0X2N0eCwgYXJndlsyXSwgTlVMTCwgTlVMTCkgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJyVzJ1xuIiwgYXJndlsyXSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhpbnB1dF9jdHgsIE5VTEwpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBmaW5kIGlucHV0IHN0cmVhbSBpbmZvcm1hdGlvbi5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogZmluZCB0aGUgdmlkZW8gc3RyZWFtIGluZm9ybWF0aW9uICovCisgICAgcmV0ID0gYXZfZmluZF9iZXN0X3N0cmVhbShpbnB1dF9jdHgsIEFWTUVESUFfVFlQRV9WSURFTywgLTEsIC0xLCAmZGVjb2RlciwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBhIHZpZGVvIHN0cmVhbSBpbiB0aGUgaW5wdXQgZmlsZVxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgdmlkZW9fc3RyZWFtID0gcmV0OworCisgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgICBjb25zdCBBVkNvZGVjSFdDb25maWcgKmNvbmZpZyA9IGF2Y29kZWNfZ2V0X2h3X2NvbmZpZyhkZWNvZGVyLCBpKTsKKyAgICAgICAgaWYgKCFjb25maWcpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRGVjb2RlciAlcyBkb2VzIG5vdCBzdXBwb3J0IGRldmljZSB0eXBlICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+bmFtZSwgYXZfaHdkZXZpY2VfZ2V0X3R5cGVfbmFtZSh0eXBlKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZy0+bWV0aG9kcyAmIEFWX0NPREVDX0hXX0NPTkZJR19NRVRIT0RfSFdfREVWSUNFX0NUWCAmJgorICAgICAgICAgICAgY29uZmlnLT5kZXZpY2VfdHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICBod19waXhfZm10ID0gY29uZmlnLT5waXhfZm10OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIShkZWNvZGVyX2N0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoZGVjb2RlcikpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdmlkZW8gPSBpbnB1dF9jdHgtPnN0cmVhbXNbdmlkZW9fc3RyZWFtXTsKKyAgICBpZiAoYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoZGVjb2Rlcl9jdHgsIHZpZGVvLT5jb2RlY3BhcikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBkZWNvZGVyX2N0eC0+Z2V0X2Zvcm1hdCAgPSBnZXRfaHdfZm9ybWF0OworICAgIGF2X29wdF9zZXRfaW50KGRlY29kZXJfY3R4LCAicmVmY291bnRlZF9mcmFtZXMiLCAxLCAwKTsKKworICAgIGlmIChod19kZWNvZGVyX2luaXQoZGVjb2Rlcl9jdHgsIHR5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKChyZXQgPSBhdmNvZGVjX29wZW4yKGRlY29kZXJfY3R4LCBkZWNvZGVyLCBOVUxMKSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gY29kZWMgZm9yIHN0cmVhbSAjJXVcbiIsIHZpZGVvX3N0cmVhbSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBvcGVuIHRoZSBmaWxlIHRvIGR1bXAgcmF3IGRhdGEgKi8KKyAgICBvdXRwdXRfZmlsZSA9IGZvcGVuKGFyZ3ZbM10sICJ3KyIpOworCisgICAgLyogYWN0dWFsIGRlY29kaW5nIGFuZCBkdW1wIHRoZSByYXcgZGF0YSAqLworICAgIHdoaWxlIChyZXQgPj0gMCkgeworICAgICAgICBpZiAoKHJldCA9IGF2X3JlYWRfZnJhbWUoaW5wdXRfY3R4LCAmcGFja2V0KSkgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKHZpZGVvX3N0cmVhbSA9PSBwYWNrZXQuc3RyZWFtX2luZGV4KQorICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3dyaXRlKGRlY29kZXJfY3R4LCAmcGFja2V0KTsKKworICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBhY2tldCk7CisgICAgfQorCisgICAgLyogZmx1c2ggdGhlIGRlY29kZXIgKi8KKyAgICBwYWNrZXQuZGF0YSA9IE5VTEw7CisgICAgcGFja2V0LnNpemUgPSAwOworICAgIHJldCA9IGRlY29kZV93cml0ZShkZWNvZGVyX2N0eCwgJnBhY2tldCk7CisgICAgYXZfcGFja2V0X3VucmVmKCZwYWNrZXQpOworCisgICAgaWYgKG91dHB1dF9maWxlKQorICAgICAgICBmY2xvc2Uob3V0cHV0X2ZpbGUpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZkZWNvZGVyX2N0eCk7CisgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmlucHV0X2N0eCk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZod19kZXZpY2VfY3R4KTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL21ldGFkYXRhLmMgYi9kb2MvZXhhbXBsZXMvbWV0YWRhdGEuYwppbmRleCBmNzNjMjY3Li5lMzMwZDA3IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvbWV0YWRhdGEuYworKysgYi9kb2MvZXhhbXBsZXMvbWV0YWRhdGEuYwpAQCAtNDQsNyArNDQsNiBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKICAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmZtdF9jdHgsIGFyZ3ZbMV0sIE5VTEwsIE5VTEwpKSkKICAgICAgICAgcmV0dXJuIHJldDsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL211eGluZy5jIGIvZG9jL2V4YW1wbGVzL211eGluZy5jCmluZGV4IGQ0ZGFjNWMuLjA4ZGE5OGUgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9tdXhpbmcuYworKysgYi9kb2MvZXhhbXBsZXMvbXV4aW5nLmMKQEAgLTUyLDYgKzUyLDcgQEAKIC8vIGEgd3JhcHBlciBhcm91bmQgYSBzaW5nbGUgb3V0cHV0IEFWU3RyZWFtCiB0eXBlZGVmIHN0cnVjdCBPdXRwdXRTdHJlYW0gewogICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jOwogCiAgICAgLyogcHRzIG9mIHRoZSBuZXh0IGZyYW1lIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgKi8KICAgICBpbnQ2NF90IG5leHRfcHRzOwpAQCAtMTA0LDEzICsxMDUsMTggQEAKICAgICAgICAgZXhpdCgxKTsKICAgICB9CiAKLSAgICBvc3QtPnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShvYywgKmNvZGVjKTsKKyAgICBvc3QtPnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShvYywgTlVMTCk7CiAgICAgaWYgKCFvc3QtPnN0KSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIHN0cmVhbVxuIik7CiAgICAgICAgIGV4aXQoMSk7CiAgICAgfQogICAgIG9zdC0+c3QtPmlkID0gb2MtPm5iX3N0cmVhbXMtMTsKLSAgICBjID0gb3N0LT5zdC0+Y29kZWM7CisgICAgYyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoKmNvZGVjKTsKKyAgICBpZiAoIWMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2MgYW4gZW5jb2RpbmcgY29udGV4dFxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIG9zdC0+ZW5jID0gYzsKIAogICAgIHN3aXRjaCAoKCpjb2RlYyktPnR5cGUpIHsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKQEAgLTE1NSw3ICsxNjEsNyBAQAogICAgICAgICBjLT5nb3Bfc2l6ZSAgICAgID0gMTI7IC8qIGVtaXQgb25lIGludHJhIGZyYW1lIGV2ZXJ5IHR3ZWx2ZSBmcmFtZXMgYXQgbW9zdCAqLwogICAgICAgICBjLT5waXhfZm10ICAgICAgID0gU1RSRUFNX1BJWF9GTVQ7CiAgICAgICAgIGlmIChjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7Ci0gICAgICAgICAgICAvKiBqdXN0IGZvciB0ZXN0aW5nLCB3ZSBhbHNvIGFkZCBCIGZyYW1lcyAqLworICAgICAgICAgICAgLyoganVzdCBmb3IgdGVzdGluZywgd2UgYWxzbyBhZGQgQi1mcmFtZXMgKi8KICAgICAgICAgICAgIGMtPm1heF9iX2ZyYW1lcyA9IDI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8pIHsKQEAgLTIxMyw3ICsyMTksNyBAQAogICAgIGludCByZXQ7CiAgICAgQVZEaWN0aW9uYXJ5ICpvcHQgPSBOVUxMOwogCi0gICAgYyA9IG9zdC0+c3QtPmNvZGVjOworICAgIGMgPSBvc3QtPmVuYzsKIAogICAgIC8qIG9wZW4gaXQgKi8KICAgICBhdl9kaWN0X2NvcHkoJm9wdCwgb3B0X2FyZywgMCk7CkBAIC0yNDAsNiArMjQ2LDEzIEBACiAgICAgb3N0LT50bXBfZnJhbWUgPSBhbGxvY19hdWRpb19mcmFtZShBVl9TQU1QTEVfRk1UX1MxNiwgYy0+Y2hhbm5lbF9sYXlvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zYW1wbGVfcmF0ZSwgbmJfc2FtcGxlcyk7CiAKKyAgICAvKiBjb3B5IHRoZSBzdHJlYW0gcGFyYW1ldGVycyB0byB0aGUgbXV4ZXIgKi8KKyAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfZnJvbV9jb250ZXh0KG9zdC0+c3QtPmNvZGVjcGFyLCBjKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjb3B5IHRoZSBzdHJlYW0gcGFyYW1ldGVyc1xuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCiAgICAgLyogY3JlYXRlIHJlc2FtcGxlciBjb250ZXh0ICovCiAgICAgICAgIG9zdC0+c3dyX2N0eCA9IHN3cl9hbGxvYygpOwogICAgICAgICBpZiAoIW9zdC0+c3dyX2N0eCkgewpAQCAtMjcxLDEzICsyODQsMTMgQEAKICAgICBpbnQxNl90ICpxID0gKGludDE2X3QqKWZyYW1lLT5kYXRhWzBdOwogCiAgICAgLyogY2hlY2sgaWYgd2Ugd2FudCB0byBnZW5lcmF0ZSBtb3JlIGZyYW1lcyAqLwotICAgIGlmIChhdl9jb21wYXJlX3RzKG9zdC0+bmV4dF9wdHMsIG9zdC0+c3QtPmNvZGVjLT50aW1lX2Jhc2UsCisgICAgaWYgKGF2X2NvbXBhcmVfdHMob3N0LT5uZXh0X3B0cywgb3N0LT5lbmMtPnRpbWVfYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICBTVFJFQU1fRFVSQVRJT04sIChBVlJhdGlvbmFsKXsgMSwgMSB9KSA+PSAwKQogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGZvciAoaiA9IDA7IGogPGZyYW1lLT5uYl9zYW1wbGVzOyBqKyspIHsKICAgICAgICAgdiA9IChpbnQpKHNpbihvc3QtPnQpICogMTAwMDApOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3N0LT5zdC0+Y29kZWMtPmNoYW5uZWxzOyBpKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvc3QtPmVuYy0+Y2hhbm5lbHM7IGkrKykKICAgICAgICAgICAgICpxKysgPSB2OwogICAgICAgICBvc3QtPnQgICAgICs9IG9zdC0+dGluY3I7CiAgICAgICAgIG9zdC0+dGluY3IgKz0gb3N0LT50aW5jcjI7CkBAIC0zMDMsNyArMzE2LDcgQEAKICAgICBpbnQgZHN0X25iX3NhbXBsZXM7CiAKICAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKLSAgICBjID0gb3N0LT5zdC0+Y29kZWM7CisgICAgYyA9IG9zdC0+ZW5jOwogCiAgICAgZnJhbWUgPSBnZXRfYXVkaW9fZnJhbWUob3N0KTsKIApAQCAtMzIyLDE1ICszMzUsMTUgQEAKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICBleGl0KDEpOwogCi0gICAgICAgICAgICAvKiBjb252ZXJ0IHRvIGRlc3RpbmF0aW9uIGZvcm1hdCAqLwotICAgICAgICAgICAgcmV0ID0gc3dyX2NvbnZlcnQob3N0LT5zd3JfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5mcmFtZS0+ZGF0YSwgZHN0X25iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKilmcmFtZS0+ZGF0YSwgZnJhbWUtPm5iX3NhbXBsZXMpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIGNvbnZlcnRpbmdcbiIpOwotICAgICAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtZSA9IG9zdC0+ZnJhbWU7CisgICAgICAgIC8qIGNvbnZlcnQgdG8gZGVzdGluYXRpb24gZm9ybWF0ICovCisgICAgICAgIHJldCA9IHN3cl9jb252ZXJ0KG9zdC0+c3dyX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5mcmFtZS0+ZGF0YSwgZHN0X25iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKWZyYW1lLT5kYXRhLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIGNvbnZlcnRpbmdcbiIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBmcmFtZSA9IG9zdC0+ZnJhbWU7CiAKICAgICAgICAgZnJhbWUtPnB0cyA9IGF2X3Jlc2NhbGVfcShvc3QtPnNhbXBsZXNfY291bnQsIChBVlJhdGlvbmFsKXsxLCBjLT5zYW1wbGVfcmF0ZX0sIGMtPnRpbWVfYmFzZSk7CiAgICAgICAgIG9zdC0+c2FtcGxlc19jb3VudCArPSBkc3RfbmJfc2FtcGxlczsKQEAgLTM4Myw3ICszOTYsNyBAQAogc3RhdGljIHZvaWQgb3Blbl92aWRlbyhBVkZvcm1hdENvbnRleHQgKm9jLCBBVkNvZGVjICpjb2RlYywgT3V0cHV0U3RyZWFtICpvc3QsIEFWRGljdGlvbmFyeSAqb3B0X2FyZykKIHsKICAgICBpbnQgcmV0OwotICAgIEFWQ29kZWNDb250ZXh0ICpjID0gb3N0LT5zdC0+Y29kZWM7CisgICAgQVZDb2RlY0NvbnRleHQgKmMgPSBvc3QtPmVuYzsKICAgICBBVkRpY3Rpb25hcnkgKm9wdCA9IE5VTEw7CiAKICAgICBhdl9kaWN0X2NvcHkoJm9wdCwgb3B0X2FyZywgMCk7CkBAIC00MTQsMjEgKzQyNywyMCBAQAogICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qIGNvcHkgdGhlIHN0cmVhbSBwYXJhbWV0ZXJzIHRvIHRoZSBtdXhlciAqLworICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQob3N0LT5zdC0+Y29kZWNwYXIsIGMpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNvcHkgdGhlIHN0cmVhbSBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CiB9CiAKIC8qIFByZXBhcmUgYSBkdW1teSBpbWFnZS4gKi8KIHN0YXRpYyB2b2lkIGZpbGxfeXV2X2ltYWdlKEFWRnJhbWUgKnBpY3QsIGludCBmcmFtZV9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKLSAgICBpbnQgeCwgeSwgaSwgcmV0OwotCi0gICAgLyogd2hlbiB3ZSBwYXNzIGEgZnJhbWUgdG8gdGhlIGVuY29kZXIsIGl0IG1heSBrZWVwIGEgcmVmZXJlbmNlIHRvIGl0Ci0gICAgICogaW50ZXJuYWxseTsKLSAgICAgKiBtYWtlIHN1cmUgd2UgZG8gbm90IG92ZXJ3cml0ZSBpdCBoZXJlCi0gICAgICovCi0gICAgcmV0ID0gYXZfZnJhbWVfbWFrZV93cml0YWJsZShwaWN0KTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZXhpdCgxKTsKKyAgICBpbnQgeCwgeSwgaTsKIAogICAgIGkgPSBmcmFtZV9pbmRleDsKIApAQCAtNDQ4LDEzICs0NjAsMTggQEAKIAogc3RhdGljIEFWRnJhbWUgKmdldF92aWRlb19mcmFtZShPdXRwdXRTdHJlYW0gKm9zdCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqYyA9IG9zdC0+c3QtPmNvZGVjOworICAgIEFWQ29kZWNDb250ZXh0ICpjID0gb3N0LT5lbmM7CiAKICAgICAvKiBjaGVjayBpZiB3ZSB3YW50IHRvIGdlbmVyYXRlIG1vcmUgZnJhbWVzICovCi0gICAgaWYgKGF2X2NvbXBhcmVfdHMob3N0LT5uZXh0X3B0cywgb3N0LT5zdC0+Y29kZWMtPnRpbWVfYmFzZSwKKyAgICBpZiAoYXZfY29tcGFyZV90cyhvc3QtPm5leHRfcHRzLCBjLT50aW1lX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgU1RSRUFNX0RVUkFUSU9OLCAoQVZSYXRpb25hbCl7IDEsIDEgfSkgPj0gMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKKyAgICAvKiB3aGVuIHdlIHBhc3MgYSBmcmFtZSB0byB0aGUgZW5jb2RlciwgaXQgbWF5IGtlZXAgYSByZWZlcmVuY2UgdG8gaXQKKyAgICAgKiBpbnRlcm5hbGx5OyBtYWtlIHN1cmUgd2UgZG8gbm90IG92ZXJ3cml0ZSBpdCBoZXJlICovCisgICAgaWYgKGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUob3N0LT5mcmFtZSkgPCAwKQorICAgICAgICBleGl0KDEpOworCiAgICAgaWYgKGMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSB7CiAgICAgICAgIC8qIGFzIHdlIG9ubHkgZ2VuZXJhdGUgYSBZVVY0MjBQIHBpY3R1cmUsIHdlIG11c3QgY29udmVydCBpdAogICAgICAgICAgKiB0byB0aGUgY29kZWMgcGl4ZWwgZm9ybWF0IGlmIG5lZWRlZCAqLwpAQCAtNDcxLDkgKzQ4OCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZmlsbF95dXZfaW1hZ2Uob3N0LT50bXBfZnJhbWUsIG9zdC0+bmV4dF9wdHMsIGMtPndpZHRoLCBjLT5oZWlnaHQpOwotICAgICAgICBzd3Nfc2NhbGUob3N0LT5zd3NfY3R4LAotICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCAqKW9zdC0+dG1wX2ZyYW1lLT5kYXRhLCBvc3QtPnRtcF9mcmFtZS0+bGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAwLCBjLT5oZWlnaHQsIG9zdC0+ZnJhbWUtPmRhdGEsIG9zdC0+ZnJhbWUtPmxpbmVzaXplKTsKKyAgICAgICAgc3dzX3NjYWxlKG9zdC0+c3dzX2N0eCwgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCAqKSBvc3QtPnRtcF9mcmFtZS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgIG9zdC0+dG1wX2ZyYW1lLT5saW5lc2l6ZSwgMCwgYy0+aGVpZ2h0LCBvc3QtPmZyYW1lLT5kYXRhLAorICAgICAgICAgICAgICAgICAgb3N0LT5mcmFtZS0+bGluZXNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZpbGxfeXV2X2ltYWdlKG9zdC0+ZnJhbWUsIG9zdC0+bmV4dF9wdHMsIGMtPndpZHRoLCBjLT5oZWlnaHQpOwogICAgIH0KQEAgLTQ5NSw3ICs1MTIsNyBAQAogICAgIGludCBnb3RfcGFja2V0ID0gMDsKICAgICBBVlBhY2tldCBwa3QgPSB7IDAgfTsKIAotICAgIGMgPSBvc3QtPnN0LT5jb2RlYzsKKyAgICBjID0gb3N0LT5lbmM7CiAKICAgICBmcmFtZSA9IGdldF92aWRlb19mcmFtZShvc3QpOwogCkBAIC01MjQsNyArNTQxLDcgQEAKIAogc3RhdGljIHZvaWQgY2xvc2Vfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqb2MsIE91dHB1dFN0cmVhbSAqb3N0KQogewotICAgIGF2Y29kZWNfY2xvc2Uob3N0LT5zdC0+Y29kZWMpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZvc3QtPmVuYyk7CiAgICAgYXZfZnJhbWVfZnJlZSgmb3N0LT5mcmFtZSk7CiAgICAgYXZfZnJhbWVfZnJlZSgmb3N0LT50bXBfZnJhbWUpOwogICAgIHN3c19mcmVlQ29udGV4dChvc3QtPnN3c19jdHgpOwpAQCAtNTQ1LDkgKzU2Miw3IEBACiAgICAgaW50IGhhdmVfdmlkZW8gPSAwLCBoYXZlX2F1ZGlvID0gMDsKICAgICBpbnQgZW5jb2RlX3ZpZGVvID0gMCwgZW5jb2RlX2F1ZGlvID0gMDsKICAgICBBVkRpY3Rpb25hcnkgKm9wdCA9IE5VTEw7Ci0KLSAgICAvKiBJbml0aWFsaXplIGxpYmF2Y29kZWMsIGFuZCByZWdpc3RlciBhbGwgY29kZWNzIGFuZCBmb3JtYXRzLiAqLwotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOworICAgIGludCBpOwogCiAgICAgaWYgKGFyZ2MgPCAyKSB7CiAgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIG91dHB1dF9maWxlXG4iCkBAIC01NjEsOCArNTc2LDkgQEAKICAgICB9CiAKICAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07Ci0gICAgaWYgKGFyZ2MgPiAzICYmICFzdHJjbXAoYXJndlsyXSwgIi1mbGFncyIpKSB7Ci0gICAgICAgIGF2X2RpY3Rfc2V0KCZvcHQsIGFyZ3ZbMl0rMSwgYXJndlszXSwgMCk7CisgICAgZm9yIChpID0gMjsgaSsxIDwgYXJnYzsgaSs9MikgeworICAgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWZsYWdzIikgfHwgIXN0cmNtcChhcmd2W2ldLCAiLWZmbGFncyIpKQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9wdCwgYXJndltpXSsxLCBhcmd2W2krMV0sIDApOwogICAgIH0KIAogICAgIC8qIGFsbG9jYXRlIHRoZSBvdXRwdXQgbWVkaWEgY29udGV4dCAqLwpAQCAtNjIwLDggKzYzNiw4IEBACiAgICAgd2hpbGUgKGVuY29kZV92aWRlbyB8fCBlbmNvZGVfYXVkaW8pIHsKICAgICAgICAgLyogc2VsZWN0IHRoZSBzdHJlYW0gdG8gZW5jb2RlICovCiAgICAgICAgIGlmIChlbmNvZGVfdmlkZW8gJiYKLSAgICAgICAgICAgICghZW5jb2RlX2F1ZGlvIHx8IGF2X2NvbXBhcmVfdHModmlkZW9fc3QubmV4dF9wdHMsIHZpZGVvX3N0LnN0LT5jb2RlYy0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdC5uZXh0X3B0cywgYXVkaW9fc3Quc3QtPmNvZGVjLT50aW1lX2Jhc2UpIDw9IDApKSB7CisgICAgICAgICAgICAoIWVuY29kZV9hdWRpbyB8fCBhdl9jb21wYXJlX3RzKHZpZGVvX3N0Lm5leHRfcHRzLCB2aWRlb19zdC5lbmMtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3QubmV4dF9wdHMsIGF1ZGlvX3N0LmVuYy0+dGltZV9iYXNlKSA8PSAwKSkgewogICAgICAgICAgICAgZW5jb2RlX3ZpZGVvID0gIXdyaXRlX3ZpZGVvX2ZyYW1lKG9jLCAmdmlkZW9fc3QpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZW5jb2RlX2F1ZGlvID0gIXdyaXRlX2F1ZGlvX2ZyYW1lKG9jLCAmYXVkaW9fc3QpOwpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3FzdmRlYy5jIGIvZG9jL2V4YW1wbGVzL3FzdmRlYy5jCmluZGV4IGZkOTM0YmUuLjc0MTVlZWYgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9xc3ZkZWMuYworKysgYi9kb2MvZXhhbXBsZXMvcXN2ZGVjLmMKQEAgLTI2LDE4NSArMjYsNTUgQEAKICAqCiAgKiBAZXhhbXBsZSBxc3ZkZWMuYwogICogVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBkbyBRU1YtYWNjZWxlcmF0ZWQgSC4yNjQgZGVjb2Rpbmcgd2l0aCBvdXRwdXQKLSAqIGZyYW1lcyBpbiB0aGUgVkEtQVBJIHZpZGVvIHN1cmZhY2VzLgorICogZnJhbWVzIGluIHRoZSBHUFUgdmlkZW8gc3VyZmFjZXMuCiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2luY2x1ZGUgPG1meC9tZnh2aWRlby5oPgotCi0jaW5jbHVkZSA8dmEvdmEuaD4KLSNpbmNsdWRlIDx2YS92YV94MTEuaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotCiAjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKICNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmlvLmgiCiAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKLSNpbmNsdWRlICJsaWJhdmNvZGVjL3Fzdi5oIgogCisjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X3Fzdi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKIAogdHlwZWRlZiBzdHJ1Y3QgRGVjb2RlQ29udGV4dCB7Ci0gICAgbWZ4U2Vzc2lvbiBtZnhfc2Vzc2lvbjsKLSAgICBWQURpc3BsYXkgdmFfZHB5OwotCi0gICAgVkFTdXJmYWNlSUQgKnN1cmZhY2VzOwotICAgIG1meE1lbUlkICAgICpzdXJmYWNlX2lkczsKLSAgICBpbnQgICAgICAgICAqc3VyZmFjZV91c2VkOwotICAgIGludCAgICAgICBuYl9zdXJmYWNlczsKLQotICAgIG1meEZyYW1lSW5mbyBmcmFtZV9pbmZvOworICAgIEFWQnVmZmVyUmVmICpod19kZXZpY2VfcmVmOwogfSBEZWNvZGVDb250ZXh0OwogCi1zdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX2FsbG9jKG1meEhETCBwdGhpcywgbWZ4RnJhbWVBbGxvY1JlcXVlc3QgKnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWZ4RnJhbWVBbGxvY1Jlc3BvbnNlICpyZXNwKQotewotICAgIERlY29kZUNvbnRleHQgKmRlY29kZSA9IHB0aGlzOwotICAgIGludCBlcnIsIGk7Ci0KLSAgICBpZiAoZGVjb2RlLT5zdXJmYWNlcykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk11bHRpcGxlIGFsbG9jYXRpb24gcmVxdWVzdHMuXG4iKTsKLSAgICAgICAgcmV0dXJuIE1GWF9FUlJfTUVNT1JZX0FMTE9DOwotICAgIH0KLSAgICBpZiAoIShyZXEtPlR5cGUgJiBNRlhfTUVNVFlQRV9WSURFT19NRU1PUllfREVDT0RFUl9UQVJHRVQpKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5zdXBwb3J0ZWQgc3VyZmFjZSB0eXBlOiAlZFxuIiwgcmVxLT5UeXBlKTsKLSAgICAgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7Ci0gICAgfQotICAgIGlmIChyZXEtPkluZm8uQml0RGVwdGhMdW1hICE9IDggfHwgcmVxLT5JbmZvLkJpdERlcHRoQ2hyb21hICE9IDggfHwKLSAgICAgICAgcmVxLT5JbmZvLlNoaWZ0IHx8IHJlcS0+SW5mby5Gb3VyQ0MgIT0gTUZYX0ZPVVJDQ19OVjEyIHx8Ci0gICAgICAgIHJlcS0+SW5mby5DaHJvbWFGb3JtYXQgIT0gTUZYX0NIUk9NQUZPUk1BVF9ZVVY0MjApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnN1cHBvcnRlZCBzdXJmYWNlIHByb3BlcnRpZXMuXG4iKTsKLSAgICAgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgZGVjb2RlLT5zdXJmYWNlcyAgICAgPSBhdl9tYWxsb2NfYXJyYXkgKHJlcS0+TnVtRnJhbWVTdWdnZXN0ZWQsIHNpemVvZigqZGVjb2RlLT5zdXJmYWNlcykpOwotICAgIGRlY29kZS0+c3VyZmFjZV9pZHMgID0gYXZfbWFsbG9jX2FycmF5IChyZXEtPk51bUZyYW1lU3VnZ2VzdGVkLCBzaXplb2YoKmRlY29kZS0+c3VyZmFjZV9pZHMpKTsKLSAgICBkZWNvZGUtPnN1cmZhY2VfdXNlZCA9IGF2X21hbGxvY3pfYXJyYXkocmVxLT5OdW1GcmFtZVN1Z2dlc3RlZCwgc2l6ZW9mKCpkZWNvZGUtPnN1cmZhY2VfdXNlZCkpOwotICAgIGlmICghZGVjb2RlLT5zdXJmYWNlcyB8fCAhZGVjb2RlLT5zdXJmYWNlX2lkcyB8fCAhZGVjb2RlLT5zdXJmYWNlX3VzZWQpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGVyciA9IHZhQ3JlYXRlU3VyZmFjZXMoZGVjb2RlLT52YV9kcHksIFZBX1JUX0ZPUk1BVF9ZVVY0MjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXEtPkluZm8uV2lkdGgsIHJlcS0+SW5mby5IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGUtPnN1cmZhY2VzLCByZXEtPk51bUZyYW1lU3VnZ2VzdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7Ci0gICAgaWYgKGVyciAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGFsbG9jYXRpbmcgVkEgc3VyZmFjZXNcbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICAgIGRlY29kZS0+bmJfc3VyZmFjZXMgPSByZXEtPk51bUZyYW1lU3VnZ2VzdGVkOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGRlY29kZS0+bmJfc3VyZmFjZXM7IGkrKykKLSAgICAgICAgZGVjb2RlLT5zdXJmYWNlX2lkc1tpXSA9ICZkZWNvZGUtPnN1cmZhY2VzW2ldOwotCi0gICAgcmVzcC0+bWlkcyAgICAgICAgICAgPSBkZWNvZGUtPnN1cmZhY2VfaWRzOwotICAgIHJlc3AtPk51bUZyYW1lQWN0dWFsID0gZGVjb2RlLT5uYl9zdXJmYWNlczsKLQotICAgIGRlY29kZS0+ZnJhbWVfaW5mbyA9IHJlcS0+SW5mbzsKLQotICAgIHJldHVybiBNRlhfRVJSX05PTkU7Ci1mYWlsOgotICAgIGF2X2ZyZWVwKCZkZWNvZGUtPnN1cmZhY2VzKTsKLSAgICBhdl9mcmVlcCgmZGVjb2RlLT5zdXJmYWNlX2lkcyk7Ci0gICAgYXZfZnJlZXAoJmRlY29kZS0+c3VyZmFjZV91c2VkKTsKLQotICAgIHJldHVybiBNRlhfRVJSX01FTU9SWV9BTExPQzsKLX0KLQotc3RhdGljIG1meFN0YXR1cyBmcmFtZV9mcmVlKG1meEhETCBwdGhpcywgbWZ4RnJhbWVBbGxvY1Jlc3BvbnNlICpyZXNwKQotewotICAgIHJldHVybiBNRlhfRVJSX05PTkU7Ci19Ci0KLXN0YXRpYyBtZnhTdGF0dXMgZnJhbWVfbG9jayhtZnhIREwgcHRoaXMsIG1meE1lbUlkIG1pZCwgbWZ4RnJhbWVEYXRhICpwdHIpCi17Ci0gICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7Ci19Ci0KLXN0YXRpYyBtZnhTdGF0dXMgZnJhbWVfdW5sb2NrKG1meEhETCBwdGhpcywgbWZ4TWVtSWQgbWlkLCBtZnhGcmFtZURhdGEgKnB0cikKLXsKLSAgICByZXR1cm4gTUZYX0VSUl9VTlNVUFBPUlRFRDsKLX0KLQotc3RhdGljIG1meFN0YXR1cyBmcmFtZV9nZXRfaGRsKG1meEhETCBwdGhpcywgbWZ4TWVtSWQgbWlkLCBtZnhIREwgKmhkbCkKLXsKLSAgICAqaGRsID0gbWlkOwotICAgIHJldHVybiBNRlhfRVJSX05PTkU7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfc3VyZmFjZXMoRGVjb2RlQ29udGV4dCAqZGVjb2RlKQotewotICAgIGlmIChkZWNvZGUtPnN1cmZhY2VzKQotICAgICAgICB2YURlc3Ryb3lTdXJmYWNlcyhkZWNvZGUtPnZhX2RweSwgZGVjb2RlLT5zdXJmYWNlcywgZGVjb2RlLT5uYl9zdXJmYWNlcyk7Ci0gICAgYXZfZnJlZXAoJmRlY29kZS0+c3VyZmFjZXMpOwotICAgIGF2X2ZyZWVwKCZkZWNvZGUtPnN1cmZhY2VfaWRzKTsKLSAgICBhdl9mcmVlcCgmZGVjb2RlLT5zdXJmYWNlX3VzZWQpOwotICAgIGRlY29kZS0+bmJfc3VyZmFjZXMgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcih2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCi17Ci0gICAgaW50ICp1c2VkID0gb3BhcXVlOwotICAgICp1c2VkID0gMDsKLSAgICBhdl9mcmVlcCgmZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCi17Ci0gICAgRGVjb2RlQ29udGV4dCAqZGVjb2RlID0gYXZjdHgtPm9wYXF1ZTsKLQotICAgIG1meEZyYW1lU3VyZmFjZTEgKnN1cmY7Ci0gICAgQVZCdWZmZXJSZWYgKnN1cmZfYnVmOwotICAgIGludCBpZHg7Ci0KLSAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IGRlY29kZS0+bmJfc3VyZmFjZXM7IGlkeCsrKSB7Ci0gICAgICAgIGlmICghZGVjb2RlLT5zdXJmYWNlX3VzZWRbaWR4XSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaWR4ID09IGRlY29kZS0+bmJfc3VyZmFjZXMpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJObyBmcmVlIHN1cmZhY2VzXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICBzdXJmID0gYXZfbWFsbG9jeihzaXplb2YoKnN1cmYpKTsKLSAgICBpZiAoIXN1cmYpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3VyZl9idWYgPSBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90KilzdXJmLCBzaXplb2YoKnN1cmYpLCBmcmVlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlY29kZS0+c3VyZmFjZV91c2VkW2lkeF0sIEFWX0JVRkZFUl9GTEFHX1JFQURPTkxZKTsKLSAgICBpZiAoIXN1cmZfYnVmKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZzdXJmKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICBzdXJmLT5JbmZvICAgICAgID0gZGVjb2RlLT5mcmFtZV9pbmZvOwotICAgIHN1cmYtPkRhdGEuTWVtSWQgPSAmZGVjb2RlLT5zdXJmYWNlc1tpZHhdOwotCi0gICAgZnJhbWUtPmJ1ZlswXSAgPSBzdXJmX2J1ZjsKLSAgICBmcmFtZS0+ZGF0YVszXSA9ICh1aW50OF90KilzdXJmOwotCi0gICAgZGVjb2RlLT5zdXJmYWNlX3VzZWRbaWR4XSA9IDE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBnZXRfZm9ybWF0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10cykKIHsKICAgICB3aGlsZSAoKnBpeF9mbXRzICE9IEFWX1BJWF9GTVRfTk9ORSkgewogICAgICAgICBpZiAoKnBpeF9mbXRzID09IEFWX1BJWF9GTVRfUVNWKSB7Ci0gICAgICAgICAgICBpZiAoIWF2Y3R4LT5od2FjY2VsX2NvbnRleHQpIHsKLSAgICAgICAgICAgICAgICBEZWNvZGVDb250ZXh0ICpkZWNvZGUgPSBhdmN0eC0+b3BhcXVlOwotICAgICAgICAgICAgICAgIEFWUVNWQ29udGV4dCAqcXN2ID0gYXZfcXN2X2FsbG9jX2NvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXFzdikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKKyAgICAgICAgICAgIERlY29kZUNvbnRleHQgKmRlY29kZSA9IGF2Y3R4LT5vcGFxdWU7CisgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAgKmZyYW1lc19jdHg7CisgICAgICAgICAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eDsKKyAgICAgICAgICAgIGludCByZXQ7CiAKLSAgICAgICAgICAgICAgICBxc3YtPnNlc3Npb24gICA9IGRlY29kZS0+bWZ4X3Nlc3Npb247Ci0gICAgICAgICAgICAgICAgcXN2LT5pb3BhdHRlcm4gPSBNRlhfSU9QQVRURVJOX09VVF9WSURFT19NRU1PUlk7CisgICAgICAgICAgICAvKiBjcmVhdGUgYSBwb29sIG9mIHN1cmZhY2VzIHRvIGJlIHVzZWQgYnkgdGhlIGRlY29kZXIgKi8KKyAgICAgICAgICAgIGF2Y3R4LT5od19mcmFtZXNfY3R4ID0gYXZfaHdmcmFtZV9jdHhfYWxsb2MoZGVjb2RlLT5od19kZXZpY2VfcmVmKTsKKyAgICAgICAgICAgIGlmICghYXZjdHgtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKKyAgICAgICAgICAgIGZyYW1lc19jdHggICA9IChBVkhXRnJhbWVzQ29udGV4dCopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgICAgICAgICBmcmFtZXNfaHdjdHggPSBmcmFtZXNfY3R4LT5od2N0eDsKIAotICAgICAgICAgICAgICAgIGF2Y3R4LT5od2FjY2VsX2NvbnRleHQgPSBxc3Y7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZXNfY3R4LT5mb3JtYXQgICAgICAgICAgICA9IEFWX1BJWF9GTVRfUVNWOworICAgICAgICAgICAgZnJhbWVzX2N0eC0+c3dfZm9ybWF0ICAgICAgICAgPSBhdmN0eC0+c3dfcGl4X2ZtdDsKKyAgICAgICAgICAgIGZyYW1lc19jdHgtPndpZHRoICAgICAgICAgICAgID0gRkZBTElHTihhdmN0eC0+Y29kZWRfd2lkdGgsICAzMik7CisgICAgICAgICAgICBmcmFtZXNfY3R4LT5oZWlnaHQgICAgICAgICAgICA9IEZGQUxJR04oYXZjdHgtPmNvZGVkX2hlaWdodCwgMzIpOworICAgICAgICAgICAgZnJhbWVzX2N0eC0+aW5pdGlhbF9wb29sX3NpemUgPSAzMjsKKworICAgICAgICAgICAgZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlID0gTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX0RFQ09ERVJfVEFSR0VUOworCisgICAgICAgICAgICByZXQgPSBhdl9od2ZyYW1lX2N0eF9pbml0KGF2Y3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7CiAKICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX1FTVjsKICAgICAgICAgfQpAQCAtMjE4LDg2ICs4OCw0NyBAQAogfQogCiBzdGF0aWMgaW50IGRlY29kZV9wYWNrZXQoRGVjb2RlQ29udGV4dCAqZGVjb2RlLCBBVkNvZGVjQ29udGV4dCAqZGVjb2Rlcl9jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIEFWUGFja2V0ICpwa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVZJT0NvbnRleHQgKm91dHB1dF9jdHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIEFWRnJhbWUgKnN3X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QsIEFWSU9Db250ZXh0ICpvdXRwdXRfY3R4KQogewogICAgIGludCByZXQgPSAwOwotICAgIGludCBnb3RfZnJhbWUgPSAxOwogCi0gICAgd2hpbGUgKHBrdC0+c2l6ZSA+IDAgfHwgKCFwa3QtPmRhdGEgJiYgZ290X2ZyYW1lKSkgewotICAgICAgICByZXQgPSBhdmNvZGVjX2RlY29kZV92aWRlbzIoZGVjb2Rlcl9jdHgsIGZyYW1lLCAmZ290X2ZyYW1lLCBwa3QpOwotICAgICAgICBpZiAocmV0IDwgMCkgeworICAgIHJldCA9IGF2Y29kZWNfc2VuZF9wYWNrZXQoZGVjb2Rlcl9jdHgsIHBrdCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgZGVjb2RpbmdcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHdoaWxlIChyZXQgPj0gMCkgeworICAgICAgICBpbnQgaSwgajsKKworICAgICAgICByZXQgPSBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoZGVjb2Rlcl9jdHgsIGZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikgfHwgcmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGVsc2UgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZHVyaW5nIGRlY29kaW5nXG4iKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KIAotICAgICAgICBwa3QtPmRhdGEgKz0gcmV0OwotICAgICAgICBwa3QtPnNpemUgLT0gcmV0OwotCiAgICAgICAgIC8qIEEgcmVhbCBwcm9ncmFtIHdvdWxkIGRvIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgZGVjb2RlZCBmcmFtZSBoZXJlLgogICAgICAgICAgKiBXZSBqdXN0IHJldHJpZXZlIHRoZSByYXcgZGF0YSBhbmQgd3JpdGUgaXQgdG8gYSBmaWxlLCB3aGljaCBpcyByYXRoZXIKICAgICAgICAgICogdXNlbGVzcyBidXQgcGVkYWdvZ2ljLiAqLwotICAgICAgICBpZiAoZ290X2ZyYW1lKSB7Ci0gICAgICAgICAgICBtZnhGcmFtZVN1cmZhY2UxICpzdXJmID0gKG1meEZyYW1lU3VyZmFjZTEqKWZyYW1lLT5kYXRhWzNdOwotICAgICAgICAgICAgVkFTdXJmYWNlSUQgICAgc3VyZmFjZSA9ICooVkFTdXJmYWNlSUQqKXN1cmYtPkRhdGEuTWVtSWQ7CisgICAgICAgIHJldCA9IGF2X2h3ZnJhbWVfdHJhbnNmZXJfZGF0YShzd19mcmFtZSwgZnJhbWUsIDApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB0cmFuc2ZlcnJpbmcgdGhlIGRhdGEgdG8gc3lzdGVtIG1lbW9yeVxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KIAotICAgICAgICAgICAgVkFJbWFnZUZvcm1hdCBpbWdfZm10ID0gewotICAgICAgICAgICAgICAgIC5mb3VyY2MgICAgICAgICA9IFZBX0ZPVVJDQ19OVjEyLAotICAgICAgICAgICAgICAgIC5ieXRlX29yZGVyICAgICA9IFZBX0xTQl9GSVJTVCwKLSAgICAgICAgICAgICAgICAuYml0c19wZXJfcGl4ZWwgPSA4LAotICAgICAgICAgICAgICAgIC5kZXB0aCAgICAgICAgICA9IDgsCi0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBWQUltYWdlIGltZzsKLQotICAgICAgICAgICAgVkFTdGF0dXMgZXJyOwotICAgICAgICAgICAgdWludDhfdCAqZGF0YTsKLSAgICAgICAgICAgIGludCBpLCBqOwotCi0gICAgICAgICAgICBpbWcuYnVmICAgICAgPSBWQV9JTlZBTElEX0lEOwotICAgICAgICAgICAgaW1nLmltYWdlX2lkID0gVkFfSU5WQUxJRF9JRDsKLQotICAgICAgICAgICAgZXJyID0gdmFDcmVhdGVJbWFnZShkZWNvZGUtPnZhX2RweSwgJmltZ19mbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgJmltZyk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBjcmVhdGluZyBhbiBpbWFnZTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YUVycm9yU3RyKGVycikpOwotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IHZhR2V0SW1hZ2UoZGVjb2RlLT52YV9kcHksIHN1cmZhY2UsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLmltYWdlX2lkKTsKLSAgICAgICAgICAgIGlmIChlcnIgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGdldHRpbmcgYW4gaW1hZ2U6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFFcnJvclN0cihlcnIpKTsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnIgPSB2YU1hcEJ1ZmZlcihkZWNvZGUtPnZhX2RweSwgaW1nLmJ1ZiwgKHZvaWQqKikmZGF0YSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBtYXBwaW5nIHRoZSBpbWFnZSBidWZmZXI6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFFcnJvclN0cihlcnIpKTsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW1nLm51bV9wbGFuZXM7IGkrKykKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKGltZy5oZWlnaHQgPj4gKGkgPiAwKSk7IGorKykKLSAgICAgICAgICAgICAgICAgICAgYXZpb193cml0ZShvdXRwdXRfY3R4LCBkYXRhICsgaW1nLm9mZnNldHNbaV0gKyBqICogaW1nLnBpdGNoZXNbaV0sIGltZy53aWR0aCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzd19mcmFtZS0+ZGF0YSkgJiYgc3dfZnJhbWUtPmRhdGFbaV07IGkrKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoc3dfZnJhbWUtPmhlaWdodCA+PiAoaSA+IDApKTsgaisrKQorICAgICAgICAgICAgICAgIGF2aW9fd3JpdGUob3V0cHV0X2N0eCwgc3dfZnJhbWUtPmRhdGFbaV0gKyBqICogc3dfZnJhbWUtPmxpbmVzaXplW2ldLCBzd19mcmFtZS0+d2lkdGgpOwogCiBmYWlsOgotICAgICAgICAgICAgaWYgKGltZy5idWYgIT0gVkFfSU5WQUxJRF9JRCkKLSAgICAgICAgICAgICAgICB2YVVubWFwQnVmZmVyKGRlY29kZS0+dmFfZHB5LCBpbWcuYnVmKTsKLSAgICAgICAgICAgIGlmIChpbWcuaW1hZ2VfaWQgIT0gVkFfSU5WQUxJRF9JRCkKLSAgICAgICAgICAgICAgICB2YURlc3Ryb3lJbWFnZShkZWNvZGUtPnZhX2RweSwgaW1nLmltYWdlX2lkKTsKLSAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoc3dfZnJhbWUpOworICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CiAKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMzExLDMwICsxNDIsMTMgQEAKICAgICBjb25zdCBBVkNvZGVjICpkZWNvZGVyOwogCiAgICAgQVZQYWNrZXQgcGt0ID0geyAwIH07Ci0gICAgQVZGcmFtZSAqZnJhbWUgPSBOVUxMOworICAgIEFWRnJhbWUgKmZyYW1lID0gTlVMTCwgKnN3X2ZyYW1lID0gTlVMTDsKIAogICAgIERlY29kZUNvbnRleHQgZGVjb2RlID0geyBOVUxMIH07CiAKLSAgICBEaXNwbGF5ICpkcHkgPSBOVUxMOwotICAgIGludCB2YV92ZXJfbWFqb3IsIHZhX3Zlcl9taW5vcjsKLQotICAgIG1meElNUEwgbWZ4X2ltcGwgPSBNRlhfSU1QTF9BVVRPX0FOWTsKLSAgICBtZnhWZXJzaW9uIG1meF92ZXIgPSB7IHsgMSwgMSB9IH07Ci0KLSAgICBtZnhGcmFtZUFsbG9jYXRvciBmcmFtZV9hbGxvY2F0b3IgPSB7Ci0gICAgICAgIC5wdGhpcyA9ICZkZWNvZGUsCi0gICAgICAgIC5BbGxvYyA9IGZyYW1lX2FsbG9jLAotICAgICAgICAuTG9jayAgPSBmcmFtZV9sb2NrLAotICAgICAgICAuVW5sb2NrID0gZnJhbWVfdW5sb2NrLAotICAgICAgICAuR2V0SERMID0gZnJhbWVfZ2V0X2hkbCwKLSAgICAgICAgLkZyZWUgICA9IGZyYW1lX2ZyZWUsCi0gICAgfTsKLQogICAgIEFWSU9Db250ZXh0ICpvdXRwdXRfY3R4ID0gTlVMTDsKIAotICAgIGludCByZXQsIGksIGVycjsKLQotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOworICAgIGludCByZXQsIGk7CiAKICAgICBpZiAoYXJnYyA8IDMpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgPGlucHV0IGZpbGU+IDxvdXRwdXQgZmlsZT5cbiIsIGFyZ3ZbMF0pOwpAQCAtMzUyLDcgKzE2Niw3IEBACiAgICAgZm9yIChpID0gMDsgaSA8IGlucHV0X2N0eC0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IGlucHV0X2N0eC0+c3RyZWFtc1tpXTsKIAotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmICF2aWRlb19zdCkKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJiAhdmlkZW9fc3QpCiAgICAgICAgICAgICB2aWRlb19zdCA9IHN0OwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzdC0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9BTEw7CkBAIC0zNjIsMzQgKzE3NiwxMyBAQAogICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9CiAKLSAgICAvKiBpbml0aWFsaXplIFZBLUFQSSAqLwotICAgIGRweSA9IFhPcGVuRGlzcGxheShOVUxMKTsKLSAgICBpZiAoIWRweSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIHRoZSBYIGRpc3BsYXlcbiIpOworICAgIC8qIG9wZW4gdGhlIGhhcmR3YXJlIGRldmljZSAqLworICAgIHJldCA9IGF2X2h3ZGV2aWNlX2N0eF9jcmVhdGUoJmRlY29kZS5od19kZXZpY2VfcmVmLCBBVl9IV0RFVklDRV9UWVBFX1FTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdXRvIiwgTlVMTCwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiB0aGUgaGFyZHdhcmUgZGV2aWNlXG4iKTsKICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgfQotICAgIGRlY29kZS52YV9kcHkgPSB2YUdldERpc3BsYXkoZHB5KTsKLSAgICBpZiAoIWRlY29kZS52YV9kcHkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3Qgb3BlbiB0aGUgVkEgZGlzcGxheVxuIik7Ci0gICAgICAgIGdvdG8gZmluaXNoOwotICAgIH0KLQotICAgIGVyciA9IHZhSW5pdGlhbGl6ZShkZWNvZGUudmFfZHB5LCAmdmFfdmVyX21ham9yLCAmdmFfdmVyX21pbm9yKTsKLSAgICBpZiAoZXJyICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGluaXRpYWxpemUgVkE6ICVzXG4iLCB2YUVycm9yU3RyKGVycikpOwotICAgICAgICBnb3RvIGZpbmlzaDsKLSAgICB9Ci0gICAgZnByaW50ZihzdGRlcnIsICJJbml0aWFsaXplZCBWQSB2JWQuJWRcbiIsIHZhX3Zlcl9tYWpvciwgdmFfdmVyX21pbm9yKTsKLQotICAgIC8qIGluaXRpYWxpemUgYW4gTUZYIHNlc3Npb24gKi8KLSAgICBlcnIgPSBNRlhJbml0KG1meF9pbXBsLCAmbWZ4X3ZlciwgJmRlY29kZS5tZnhfc2Vzc2lvbik7Ci0gICAgaWYgKGVyciAhPSBNRlhfRVJSX05PTkUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBpbml0aWFsaXppbmcgYW4gTUZYIHNlc3Npb25cbiIpOwotICAgICAgICBnb3RvIGZpbmlzaDsKLSAgICB9Ci0KLSAgICBNRlhWaWRlb0NPUkVfU2V0SGFuZGxlKGRlY29kZS5tZnhfc2Vzc2lvbiwgTUZYX0hBTkRMRV9WQV9ESVNQTEFZLCBkZWNvZGUudmFfZHB5KTsKLSAgICBNRlhWaWRlb0NPUkVfU2V0RnJhbWVBbGxvY2F0b3IoZGVjb2RlLm1meF9zZXNzaW9uLCAmZnJhbWVfYWxsb2NhdG9yKTsKIAogICAgIC8qIGluaXRpYWxpemUgdGhlIGRlY29kZXIgKi8KICAgICBkZWNvZGVyID0gYXZjb2RlY19maW5kX2RlY29kZXJfYnlfbmFtZSgiaDI2NF9xc3YiKTsKQEAgLTQwNCwyMSArMTk3LDE5IEBACiAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KICAgICBkZWNvZGVyX2N0eC0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IMjY0OwotICAgIGlmICh2aWRlb19zdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSB7Ci0gICAgICAgIGRlY29kZXJfY3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHZpZGVvX3N0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKworICAgIGlmICh2aWRlb19zdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIGRlY29kZXJfY3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHZpZGVvX3N0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKICAgICAgICAgaWYgKCFkZWNvZGVyX2N0eC0+ZXh0cmFkYXRhKSB7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICAgICAgfQotICAgICAgICBtZW1jcHkoZGVjb2Rlcl9jdHgtPmV4dHJhZGF0YSwgdmlkZW9fc3QtPmNvZGVjLT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICB2aWRlb19zdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKLSAgICAgICAgZGVjb2Rlcl9jdHgtPmV4dHJhZGF0YV9zaXplID0gdmlkZW9fc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgbWVtY3B5KGRlY29kZXJfY3R4LT5leHRyYWRhdGEsIHZpZGVvX3N0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgdmlkZW9fc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIGRlY29kZXJfY3R4LT5leHRyYWRhdGFfc2l6ZSA9IHZpZGVvX3N0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemU7CiAgICAgfQotICAgIGRlY29kZXJfY3R4LT5yZWZjb3VudGVkX2ZyYW1lcyA9IDE7CiAKICAgICBkZWNvZGVyX2N0eC0+b3BhcXVlICAgICAgPSAmZGVjb2RlOwotICAgIGRlY29kZXJfY3R4LT5nZXRfYnVmZmVyMiA9IGdldF9idWZmZXI7CiAgICAgZGVjb2Rlcl9jdHgtPmdldF9mb3JtYXQgID0gZ2V0X2Zvcm1hdDsKIAogICAgIHJldCA9IGF2Y29kZWNfb3BlbjIoZGVjb2Rlcl9jdHgsIE5VTEwsIE5VTEwpOwpAQCAtNDM0LDggKzIyNSw5IEBACiAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KIAotICAgIGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIWZyYW1lKSB7CisgICAgZnJhbWUgICAgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIHN3X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWZyYW1lIHx8ICFzd19mcmFtZSkgewogICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KQEAgLTQ0Nyw3ICsyMzksNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgaWYgKHBrdC5zdHJlYW1faW5kZXggPT0gdmlkZW9fc3QtPmluZGV4KQotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BhY2tldCgmZGVjb2RlLCBkZWNvZGVyX2N0eCwgZnJhbWUsICZwa3QsIG91dHB1dF9jdHgpOworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BhY2tldCgmZGVjb2RlLCBkZWNvZGVyX2N0eCwgZnJhbWUsIHN3X2ZyYW1lLCAmcGt0LCBvdXRwdXRfY3R4KTsKIAogICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CiAgICAgfQpAQCAtNDU1LDcgKzI0Nyw3IEBACiAgICAgLyogZmx1c2ggdGhlIGRlY29kZXIgKi8KICAgICBwa3QuZGF0YSA9IE5VTEw7CiAgICAgcGt0LnNpemUgPSAwOwotICAgIHJldCA9IGRlY29kZV9wYWNrZXQoJmRlY29kZSwgZGVjb2Rlcl9jdHgsIGZyYW1lLCAmcGt0LCBvdXRwdXRfY3R4KTsKKyAgICByZXQgPSBkZWNvZGVfcGFja2V0KCZkZWNvZGUsIGRlY29kZXJfY3R4LCBmcmFtZSwgc3dfZnJhbWUsICZwa3QsIG91dHB1dF9jdHgpOwogCiBmaW5pc2g6CiAgICAgaWYgKHJldCA8IDApIHsKQEAgLTQ2NywxOSArMjU5LDExIEBACiAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmlucHV0X2N0eCk7CiAKICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmc3dfZnJhbWUpOwogCi0gICAgaWYgKGRlY29kZXJfY3R4KQotICAgICAgICBhdl9mcmVlcCgmZGVjb2Rlcl9jdHgtPmh3YWNjZWxfY29udGV4dCk7CiAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmRlY29kZXJfY3R4KTsKIAotICAgIGZyZWVfc3VyZmFjZXMoJmRlY29kZSk7Ci0KLSAgICBpZiAoZGVjb2RlLm1meF9zZXNzaW9uKQotICAgICAgICBNRlhDbG9zZShkZWNvZGUubWZ4X3Nlc3Npb24pOwotICAgIGlmIChkZWNvZGUudmFfZHB5KQotICAgICAgICB2YVRlcm1pbmF0ZShkZWNvZGUudmFfZHB5KTsKLSAgICBpZiAoZHB5KQotICAgICAgICBYQ2xvc2VEaXNwbGF5KGRweSk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZkZWNvZGUuaHdfZGV2aWNlX3JlZik7CiAKICAgICBhdmlvX2Nsb3NlKG91dHB1dF9jdHgpOwogCmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvcmVtdXhpbmcuYyBiL2RvYy9leGFtcGxlcy9yZW11eGluZy5jCmluZGV4IDY1NDM3ZDkuLjllNGQxMDMgMTAwNjQ0Ci0tLSBhL2RvYy9leGFtcGxlcy9yZW11eGluZy5jCisrKyBiL2RvYy9leGFtcGxlcy9yZW11eGluZy5jCkBAIC01MCw2ICs1MCw5IEBACiAgICAgQVZQYWNrZXQgcGt0OwogICAgIGNvbnN0IGNoYXIgKmluX2ZpbGVuYW1lLCAqb3V0X2ZpbGVuYW1lOwogICAgIGludCByZXQsIGk7CisgICAgaW50IHN0cmVhbV9pbmRleCA9IDA7CisgICAgaW50ICpzdHJlYW1fbWFwcGluZyA9IE5VTEw7CisgICAgaW50IHN0cmVhbV9tYXBwaW5nX3NpemUgPSAwOwogCiAgICAgaWYgKGFyZ2MgPCAzKSB7CiAgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIGlucHV0IG91dHB1dFxuIgpAQCAtNjIsOCArNjUsNiBAQAogICAgIGluX2ZpbGVuYW1lICA9IGFyZ3ZbMV07CiAgICAgb3V0X2ZpbGVuYW1lID0gYXJndlsyXTsKIAotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwotCiAgICAgaWYgKChyZXQgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZpZm10X2N0eCwgaW5fZmlsZW5hbWUsIDAsIDApKSA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlICclcyciLCBpbl9maWxlbmFtZSk7CiAgICAgICAgIGdvdG8gZW5kOwpAQCAtODMsMjUgKzg0LDQyIEBACiAgICAgICAgIGdvdG8gZW5kOwogICAgIH0KIAorICAgIHN0cmVhbV9tYXBwaW5nX3NpemUgPSBpZm10X2N0eC0+bmJfc3RyZWFtczsKKyAgICBzdHJlYW1fbWFwcGluZyA9IGF2X21hbGxvY3pfYXJyYXkoc3RyZWFtX21hcHBpbmdfc2l6ZSwgc2l6ZW9mKCpzdHJlYW1fbWFwcGluZykpOworICAgIGlmICghc3RyZWFtX21hcHBpbmcpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKICAgICBvZm10ID0gb2ZtdF9jdHgtPm9mb3JtYXQ7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgaWZtdF9jdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqb3V0X3N0cmVhbTsKICAgICAgICAgQVZTdHJlYW0gKmluX3N0cmVhbSA9IGlmbXRfY3R4LT5zdHJlYW1zW2ldOwotICAgICAgICBBVlN0cmVhbSAqb3V0X3N0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0ob2ZtdF9jdHgsIGluX3N0cmVhbS0+Y29kZWMtPmNvZGVjKTsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmluX2NvZGVjcGFyID0gaW5fc3RyZWFtLT5jb2RlY3BhcjsKKworICAgICAgICBpZiAoaW5fY29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICBpbl9jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgICAgIGluX2NvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICAgICAgc3RyZWFtX21hcHBpbmdbaV0gPSAtMTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc3RyZWFtX21hcHBpbmdbaV0gPSBzdHJlYW1faW5kZXgrKzsKKworICAgICAgICBvdXRfc3RyZWFtID0gYXZmb3JtYXRfbmV3X3N0cmVhbShvZm10X2N0eCwgTlVMTCk7CiAgICAgICAgIGlmICghb3V0X3N0cmVhbSkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgYWxsb2NhdGluZyBvdXRwdXQgc3RyZWFtXG4iKTsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQob3V0X3N0cmVhbS0+Y29kZWMsIGluX3N0cmVhbS0+Y29kZWMpOworICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShvdXRfc3RyZWFtLT5jb2RlY3BhciwgaW5fY29kZWNwYXIpOwogICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY29weSBjb250ZXh0IGZyb20gaW5wdXQgdG8gb3V0cHV0IHN0cmVhbSBjb2RlYyBjb250ZXh0XG4iKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNvcHkgY29kZWMgcGFyYW1ldGVyc1xuIik7CiAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgfQotICAgICAgICBvdXRfc3RyZWFtLT5jb2RlYy0+Y29kZWNfdGFnID0gMDsKLSAgICAgICAgaWYgKG9mbXRfY3R4LT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX0dMT0JBTEhFQURFUikKLSAgICAgICAgICAgIG91dF9zdHJlYW0tPmNvZGVjLT5mbGFncyB8PSBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVI7CisgICAgICAgIG91dF9zdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOwogICAgIH0KICAgICBhdl9kdW1wX2Zvcm1hdChvZm10X2N0eCwgMCwgb3V0X2ZpbGVuYW1lLCAxKTsKIApAQCAtMTI3LDggKzE0NSwxNCBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgaW5fc3RyZWFtICA9IGlmbXRfY3R4LT5zdHJlYW1zW3BrdC5zdHJlYW1faW5kZXhdOwotICAgICAgICBvdXRfc3RyZWFtID0gb2ZtdF9jdHgtPnN0cmVhbXNbcGt0LnN0cmVhbV9pbmRleF07CisgICAgICAgIGlmIChwa3Quc3RyZWFtX2luZGV4ID49IHN0cmVhbV9tYXBwaW5nX3NpemUgfHwKKyAgICAgICAgICAgIHN0cmVhbV9tYXBwaW5nW3BrdC5zdHJlYW1faW5kZXhdIDwgMCkgeworICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAorICAgICAgICBwa3Quc3RyZWFtX2luZGV4ID0gc3RyZWFtX21hcHBpbmdbcGt0LnN0cmVhbV9pbmRleF07CisgICAgICAgIG91dF9zdHJlYW0gPSBvZm10X2N0eC0+c3RyZWFtc1twa3Quc3RyZWFtX2luZGV4XTsKICAgICAgICAgbG9nX3BhY2tldChpZm10X2N0eCwgJnBrdCwgImluIik7CiAKICAgICAgICAgLyogY29weSBwYWNrZXQgKi8KQEAgLTE1Niw2ICsxODAsOCBAQAogICAgICAgICBhdmlvX2Nsb3NlcCgmb2ZtdF9jdHgtPnBiKTsKICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQob2ZtdF9jdHgpOwogCisgICAgYXZfZnJlZXAoJnN0cmVhbV9tYXBwaW5nKTsKKwogICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9jY3VycmVkOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKICAgICAgICAgcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdHJhbnNjb2RlX2FhYy5jIGIvZG9jL2V4YW1wbGVzL3RyYW5zY29kZV9hYWMuYwppbmRleCA0ODZlNTRjLi5lMGM3NmY1IDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdHJhbnNjb2RlX2FhYy5jCisrKyBiL2RvYy9leGFtcGxlcy90cmFuc2NvZGVfYWFjLmMKQEAgLTEsNCArMSw2IEBACiAvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTggQW5kcmVhcyBVbnRlcndlZ2VyCisgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKICAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTgsNyArMTAsNyBAQAogICoKICAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCiAgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKQEAgLTE4LDEwICsyMCwxMSBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBzaW1wbGUgYXVkaW8gY29udmVydGVyCisgKiBTaW1wbGUgYXVkaW8gY29udmVydGVyCiAgKgogICogQGV4YW1wbGUgdHJhbnNjb2RlX2FhYy5jCiAgKiBDb252ZXJ0IGFuIGlucHV0IGF1ZGlvIGZpbGUgdG8gQUFDIGluIGFuIE1QNCBjb250YWluZXIgdXNpbmcgRkZtcGVnLgorICogRm9ybWF0cyBvdGhlciB0aGFuIE1QNCBhcmUgc3VwcG9ydGVkIGJhc2VkIG9uIHRoZSBvdXRwdXQgZmlsZSBleHRlbnNpb24uCiAgKiBAYXV0aG9yIEFuZHJlYXMgVW50ZXJ3ZWdlciAoZHVzdHNpZ25zQGdtYWlsLmNvbSkKICAqLwogCkBAIC00MCw0OSArNDMsNDQgQEAKIAogI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5oIgogCi0vKiogVGhlIG91dHB1dCBiaXQgcmF0ZSBpbiBrYml0L3MgKi8KKy8qIFRoZSBvdXRwdXQgYml0IHJhdGUgaW4gYml0L3MgKi8KICNkZWZpbmUgT1VUUFVUX0JJVF9SQVRFIDk2MDAwCi0vKiogVGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KKy8qIFRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCiAjZGVmaW5lIE9VVFBVVF9DSEFOTkVMUyAyCiAKIC8qKgotICogQ29udmVydCBhbiBlcnJvciBjb2RlIGludG8gYSB0ZXh0IG1lc3NhZ2UuCi0gKiBAcGFyYW0gZXJyb3IgRXJyb3IgY29kZSB0byBiZSBjb252ZXJ0ZWQKLSAqIEByZXR1cm4gQ29ycmVzcG9uZGluZyBlcnJvciB0ZXh0IChub3QgdGhyZWFkLXNhZmUpCisgKiBPcGVuIGFuIGlucHV0IGZpbGUgYW5kIHRoZSByZXF1aXJlZCBkZWNvZGVyLgorICogQHBhcmFtICAgICAgZmlsZW5hbWUgICAgICAgICAgICAgRmlsZSB0byBiZSBvcGVuZWQKKyAqIEBwYXJhbVtvdXRdIGlucHV0X2Zvcm1hdF9jb250ZXh0IEZvcm1hdCBjb250ZXh0IG9mIG9wZW5lZCBmaWxlCisgKiBAcGFyYW1bb3V0XSBpbnB1dF9jb2RlY19jb250ZXh0ICBDb2RlYyBjb250ZXh0IG9mIG9wZW5lZCBmaWxlCisgKiBAcmV0dXJuIEVycm9yIGNvZGUgKDAgaWYgc3VjY2Vzc2Z1bCkKICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9lcnJvcl90ZXh0KGNvbnN0IGludCBlcnJvcikKLXsKLSAgICBzdGF0aWMgY2hhciBlcnJvcl9idWZmZXJbMjU1XTsKLSAgICBhdl9zdHJlcnJvcihlcnJvciwgZXJyb3JfYnVmZmVyLCBzaXplb2YoZXJyb3JfYnVmZmVyKSk7Ci0gICAgcmV0dXJuIGVycm9yX2J1ZmZlcjsKLX0KLQotLyoqIE9wZW4gYW4gaW5wdXQgZmlsZSBhbmQgdGhlIHJlcXVpcmVkIGRlY29kZXIuICovCiBzdGF0aWMgaW50IG9wZW5faW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqKmlucHV0X2Zvcm1hdF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKippbnB1dF9jb2RlY19jb250ZXh0KQogeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKICAgICBBVkNvZGVjICppbnB1dF9jb2RlYzsKICAgICBpbnQgZXJyb3I7CiAKLSAgICAvKiogT3BlbiB0aGUgaW5wdXQgZmlsZSB0byByZWFkIGZyb20gaXQuICovCisgICAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZSB0byByZWFkIGZyb20gaXQuICovCiAgICAgaWYgKChlcnJvciA9IGF2Zm9ybWF0X29wZW5faW5wdXQoaW5wdXRfZm9ybWF0X2NvbnRleHQsIGZpbGVuYW1lLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlICclcycgKGVycm9yICclcycpXG4iLAotICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBnZXRfZXJyb3JfdGV4dChlcnJvcikpOworICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBhdl9lcnIyc3RyKGVycm9yKSk7CiAgICAgICAgICppbnB1dF9mb3JtYXRfY29udGV4dCA9IE5VTEw7CiAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICB9CiAKLSAgICAvKiogR2V0IGluZm9ybWF0aW9uIG9uIHRoZSBpbnB1dCBmaWxlIChudW1iZXIgb2Ygc3RyZWFtcyBldGMuKS4gKi8KKyAgICAvKiBHZXQgaW5mb3JtYXRpb24gb24gdGhlIGlucHV0IGZpbGUgKG51bWJlciBvZiBzdHJlYW1zIGV0Yy4pLiAqLwogICAgIGlmICgoZXJyb3IgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCppbnB1dF9mb3JtYXRfY29udGV4dCwgTlVMTCkpIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGZpbmQgc3RyZWFtIGluZm8gKGVycm9yICclcycpXG4iLAotICAgICAgICAgICAgICAgIGdldF9lcnJvcl90ZXh0KGVycm9yKSk7CisgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihlcnJvcikpOwogICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dChpbnB1dF9mb3JtYXRfY29udGV4dCk7CiAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICB9CiAKLSAgICAvKiogTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgc3RyZWFtIGluIHRoZSBpbnB1dCBmaWxlLiAqLworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHN0cmVhbSBpbiB0aGUgaW5wdXQgZmlsZS4gKi8KICAgICBpZiAoKCppbnB1dF9mb3JtYXRfY29udGV4dCktPm5iX3N0cmVhbXMgIT0gMSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkV4cGVjdGVkIG9uZSBhdWRpbyBpbnB1dCBzdHJlYW0sIGJ1dCBmb3VuZCAlZFxuIiwKICAgICAgICAgICAgICAgICAoKmlucHV0X2Zvcm1hdF9jb250ZXh0KS0+bmJfc3RyZWFtcyk7CkBAIC05MCwyNCArODgsNDAgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKICAgICB9CiAKLSAgICAvKiogRmluZCBhIGRlY29kZXIgZm9yIHRoZSBhdWRpbyBzdHJlYW0uICovCi0gICAgaWYgKCEoaW5wdXRfY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcigoKmlucHV0X2Zvcm1hdF9jb250ZXh0KS0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkKSkpIHsKKyAgICAvKiBGaW5kIGEgZGVjb2RlciBmb3IgdGhlIGF1ZGlvIHN0cmVhbS4gKi8KKyAgICBpZiAoIShpbnB1dF9jb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKCgqaW5wdXRfZm9ybWF0X2NvbnRleHQpLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQpKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBmaW5kIGlucHV0IGNvZGVjXG4iKTsKICAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoaW5wdXRfZm9ybWF0X2NvbnRleHQpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOwogICAgIH0KIAotICAgIC8qKiBPcGVuIHRoZSBkZWNvZGVyIGZvciB0aGUgYXVkaW8gc3RyZWFtIHRvIHVzZSBpdCBsYXRlci4gKi8KLSAgICBpZiAoKGVycm9yID0gYXZjb2RlY19vcGVuMigoKmlucHV0X2Zvcm1hdF9jb250ZXh0KS0+c3RyZWFtc1swXS0+Y29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfY29kZWMsIE5VTEwpKSA8IDApIHsKKyAgICAvKiBBbGxvY2F0ZSBhIG5ldyBkZWNvZGluZyBjb250ZXh0LiAqLworICAgIGF2Y3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhpbnB1dF9jb2RlYyk7CisgICAgaWYgKCFhdmN0eCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBhIGRlY29kaW5nIGNvbnRleHRcbiIpOworICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dChpbnB1dF9mb3JtYXRfY29udGV4dCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgc3RyZWFtIHBhcmFtZXRlcnMgd2l0aCBkZW11eGVyIGluZm9ybWF0aW9uLiAqLworICAgIGVycm9yID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoYXZjdHgsICgqaW5wdXRfZm9ybWF0X2NvbnRleHQpLT5zdHJlYW1zWzBdLT5jb2RlY3Bhcik7CisgICAgaWYgKGVycm9yIDwgMCkgeworICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dChpbnB1dF9mb3JtYXRfY29udGV4dCk7CisgICAgICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdmN0eCk7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBPcGVuIHRoZSBkZWNvZGVyIGZvciB0aGUgYXVkaW8gc3RyZWFtIHRvIHVzZSBpdCBsYXRlci4gKi8KKyAgICBpZiAoKGVycm9yID0gYXZjb2RlY19vcGVuMihhdmN0eCwgaW5wdXRfY29kZWMsIE5VTEwpKSA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBpbnB1dCBjb2RlYyAoZXJyb3IgJyVzJylcbiIsCi0gICAgICAgICAgICAgICAgZ2V0X2Vycm9yX3RleHQoZXJyb3IpKTsKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKGVycm9yKSk7CisgICAgICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdmN0eCk7CiAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KGlucHV0X2Zvcm1hdF9jb250ZXh0KTsKICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgIH0KIAotICAgIC8qKiBTYXZlIHRoZSBkZWNvZGVyIGNvbnRleHQgZm9yIGVhc2llciBhY2Nlc3MgbGF0ZXIuICovCi0gICAgKmlucHV0X2NvZGVjX2NvbnRleHQgPSAoKmlucHV0X2Zvcm1hdF9jb250ZXh0KS0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgLyogU2F2ZSB0aGUgZGVjb2RlciBjb250ZXh0IGZvciBlYXNpZXIgYWNjZXNzIGxhdGVyLiAqLworICAgICppbnB1dF9jb2RlY19jb250ZXh0ID0gYXZjdHg7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTExNiwxMTAgKzEzMCwxMzYgQEAKICAqIE9wZW4gYW4gb3V0cHV0IGZpbGUgYW5kIHRoZSByZXF1aXJlZCBlbmNvZGVyLgogICogQWxzbyBzZXQgc29tZSBiYXNpYyBlbmNvZGVyIHBhcmFtZXRlcnMuCiAgKiBTb21lIG9mIHRoZXNlIHBhcmFtZXRlcnMgYXJlIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlJ3MgcGFyYW1ldGVycy4KKyAqIEBwYXJhbSAgICAgIGZpbGVuYW1lICAgICAgICAgICAgICBGaWxlIHRvIGJlIG9wZW5lZAorICogQHBhcmFtICAgICAgaW5wdXRfY29kZWNfY29udGV4dCAgIENvZGVjIGNvbnRleHQgb2YgaW5wdXQgZmlsZQorICogQHBhcmFtW291dF0gb3V0cHV0X2Zvcm1hdF9jb250ZXh0IEZvcm1hdCBjb250ZXh0IG9mIG91dHB1dCBmaWxlCisgKiBAcGFyYW1bb3V0XSBvdXRwdXRfY29kZWNfY29udGV4dCAgQ29kZWMgY29udGV4dCBvZiBvdXRwdXQgZmlsZQorICogQHJldHVybiBFcnJvciBjb2RlICgwIGlmIHN1Y2Nlc3NmdWwpCiAgKi8KIHN0YXRpYyBpbnQgb3Blbl9vdXRwdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqaW5wdXRfY29kZWNfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKipvdXRwdXRfZm9ybWF0X2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKipvdXRwdXRfY29kZWNfY29udGV4dCkKIHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggICAgICAgICAgPSBOVUxMOwogICAgIEFWSU9Db250ZXh0ICpvdXRwdXRfaW9fY29udGV4dCA9IE5VTEw7CiAgICAgQVZTdHJlYW0gKnN0cmVhbSAgICAgICAgICAgICAgID0gTlVMTDsKICAgICBBVkNvZGVjICpvdXRwdXRfY29kZWMgICAgICAgICAgPSBOVUxMOwogICAgIGludCBlcnJvcjsKIAotICAgIC8qKiBPcGVuIHRoZSBvdXRwdXQgZmlsZSB0byB3cml0ZSB0byBpdC4gKi8KKyAgICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZSB0byB3cml0ZSB0byBpdC4gKi8KICAgICBpZiAoKGVycm9yID0gYXZpb19vcGVuKCZvdXRwdXRfaW9fY29udGV4dCwgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklPX0ZMQUdfV1JJVEUpKSA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgZmlsZSAnJXMnIChlcnJvciAnJXMnKVxuIiwKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZ2V0X2Vycm9yX3RleHQoZXJyb3IpKTsKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSwgYXZfZXJyMnN0cihlcnJvcikpOwogICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgfQogCi0gICAgLyoqIENyZWF0ZSBhIG5ldyBmb3JtYXQgY29udGV4dCBmb3IgdGhlIG91dHB1dCBjb250YWluZXIgZm9ybWF0LiAqLworICAgIC8qIENyZWF0ZSBhIG5ldyBmb3JtYXQgY29udGV4dCBmb3IgdGhlIG91dHB1dCBjb250YWluZXIgZm9ybWF0LiAqLwogICAgIGlmICghKCpvdXRwdXRfZm9ybWF0X2NvbnRleHQgPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkpKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIG91dHB1dCBmb3JtYXQgY29udGV4dFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCi0gICAgLyoqIEFzc29jaWF0ZSB0aGUgb3V0cHV0IGZpbGUgKHBvaW50ZXIpIHdpdGggdGhlIGNvbnRhaW5lciBmb3JtYXQgY29udGV4dC4gKi8KKyAgICAvKiBBc3NvY2lhdGUgdGhlIG91dHB1dCBmaWxlIChwb2ludGVyKSB3aXRoIHRoZSBjb250YWluZXIgZm9ybWF0IGNvbnRleHQuICovCiAgICAgKCpvdXRwdXRfZm9ybWF0X2NvbnRleHQpLT5wYiA9IG91dHB1dF9pb19jb250ZXh0OwogCi0gICAgLyoqIEd1ZXNzIHRoZSBkZXNpcmVkIGNvbnRhaW5lciBmb3JtYXQgYmFzZWQgb24gdGhlIGZpbGUgZXh0ZW5zaW9uLiAqLworICAgIC8qIEd1ZXNzIHRoZSBkZXNpcmVkIGNvbnRhaW5lciBmb3JtYXQgYmFzZWQgb24gdGhlIGZpbGUgZXh0ZW5zaW9uLiAqLwogICAgIGlmICghKCgqb3V0cHV0X2Zvcm1hdF9jb250ZXh0KS0+b2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdChOVUxMLCBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkpKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGZpbmQgb3V0cHV0IGZpbGUgZm9ybWF0XG4iKTsKICAgICAgICAgZ290byBjbGVhbnVwOwogICAgIH0KIAotICAgIGF2X3N0cmxjcHkoKCpvdXRwdXRfZm9ybWF0X2NvbnRleHQpLT5maWxlbmFtZSwgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICBzaXplb2YoKCpvdXRwdXRfZm9ybWF0X2NvbnRleHQpLT5maWxlbmFtZSkpOworICAgIGlmICghKCgqb3V0cHV0X2Zvcm1hdF9jb250ZXh0KS0+dXJsID0gYXZfc3RyZHVwKGZpbGVuYW1lKSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgdXJsLlxuIik7CisgICAgICAgIGVycm9yID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQogCi0gICAgLyoqIEZpbmQgdGhlIGVuY29kZXIgdG8gYmUgdXNlZCBieSBpdHMgbmFtZS4gKi8KKyAgICAvKiBGaW5kIHRoZSBlbmNvZGVyIHRvIGJlIHVzZWQgYnkgaXRzIG5hbWUuICovCiAgICAgaWYgKCEob3V0cHV0X2NvZGVjID0gYXZjb2RlY19maW5kX2VuY29kZXIoQVZfQ09ERUNfSURfQUFDKSkpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZmluZCBhbiBBQUMgZW5jb2Rlci5cbiIpOwogICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgfQogCi0gICAgLyoqIENyZWF0ZSBhIG5ldyBhdWRpbyBzdHJlYW0gaW4gdGhlIG91dHB1dCBmaWxlIGNvbnRhaW5lci4gKi8KLSAgICBpZiAoIShzdHJlYW0gPSBhdmZvcm1hdF9uZXdfc3RyZWFtKCpvdXRwdXRfZm9ybWF0X2NvbnRleHQsIG91dHB1dF9jb2RlYykpKSB7CisgICAgLyogQ3JlYXRlIGEgbmV3IGF1ZGlvIHN0cmVhbSBpbiB0aGUgb3V0cHV0IGZpbGUgY29udGFpbmVyLiAqLworICAgIGlmICghKHN0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0oKm91dHB1dF9mb3JtYXRfY29udGV4dCwgTlVMTCkpKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNyZWF0ZSBuZXcgc3RyZWFtXG4iKTsKICAgICAgICAgZXJyb3IgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGdvdG8gY2xlYW51cDsKICAgICB9CiAKLSAgICAvKiogU2F2ZSB0aGUgZW5jb2RlciBjb250ZXh0IGZvciBlYXNpZXIgYWNjZXNzIGxhdGVyLiAqLwotICAgICpvdXRwdXRfY29kZWNfY29udGV4dCA9IHN0cmVhbS0+Y29kZWM7CisgICAgYXZjdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKG91dHB1dF9jb2RlYyk7CisgICAgaWYgKCFhdmN0eCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBhbiBlbmNvZGluZyBjb250ZXh0XG4iKTsKKyAgICAgICAgZXJyb3IgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CiAKLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGJhc2ljIGVuY29kZXIgcGFyYW1ldGVycy4KLSAgICAgKiBUaGUgaW5wdXQgZmlsZSdzIHNhbXBsZSByYXRlIGlzIHVzZWQgdG8gYXZvaWQgYSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLgotICAgICAqLwotICAgICgqb3V0cHV0X2NvZGVjX2NvbnRleHQpLT5jaGFubmVscyAgICAgICA9IE9VVFBVVF9DSEFOTkVMUzsKLSAgICAoKm91dHB1dF9jb2RlY19jb250ZXh0KS0+Y2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChPVVRQVVRfQ0hBTk5FTFMpOwotICAgICgqb3V0cHV0X2NvZGVjX2NvbnRleHQpLT5zYW1wbGVfcmF0ZSAgICA9IGlucHV0X2NvZGVjX2NvbnRleHQtPnNhbXBsZV9yYXRlOwotICAgICgqb3V0cHV0X2NvZGVjX2NvbnRleHQpLT5zYW1wbGVfZm10ICAgICA9IG91dHB1dF9jb2RlYy0+c2FtcGxlX2ZtdHNbMF07Ci0gICAgKCpvdXRwdXRfY29kZWNfY29udGV4dCktPmJpdF9yYXRlICAgICAgID0gT1VUUFVUX0JJVF9SQVRFOworICAgIC8qIFNldCB0aGUgYmFzaWMgZW5jb2RlciBwYXJhbWV0ZXJzLgorICAgICAqIFRoZSBpbnB1dCBmaWxlJ3Mgc2FtcGxlIHJhdGUgaXMgdXNlZCB0byBhdm9pZCBhIHNhbXBsZSByYXRlIGNvbnZlcnNpb24uICovCisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gT1VUUFVUX0NIQU5ORUxTOworICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGF2X2dldF9kZWZhdWx0X2NoYW5uZWxfbGF5b3V0KE9VVFBVVF9DSEFOTkVMUyk7CisgICAgYXZjdHgtPnNhbXBsZV9yYXRlICAgID0gaW5wdXRfY29kZWNfY29udGV4dC0+c2FtcGxlX3JhdGU7CisgICAgYXZjdHgtPnNhbXBsZV9mbXQgICAgID0gb3V0cHV0X2NvZGVjLT5zYW1wbGVfZm10c1swXTsKKyAgICBhdmN0eC0+Yml0X3JhdGUgICAgICAgPSBPVVRQVVRfQklUX1JBVEU7CiAKLSAgICAvKiogQWxsb3cgdGhlIHVzZSBvZiB0aGUgZXhwZXJpbWVudGFsIEFBQyBlbmNvZGVyICovCi0gICAgKCpvdXRwdXRfY29kZWNfY29udGV4dCktPnN0cmljdF9zdGRfY29tcGxpYW5jZSA9IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMOworICAgIC8qIEFsbG93IHRoZSB1c2Ugb2YgdGhlIGV4cGVyaW1lbnRhbCBBQUMgZW5jb2Rlci4gKi8KKyAgICBhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID0gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUw7CiAKLSAgICAvKiogU2V0IHRoZSBzYW1wbGUgcmF0ZSBmb3IgdGhlIGNvbnRhaW5lci4gKi8KKyAgICAvKiBTZXQgdGhlIHNhbXBsZSByYXRlIGZvciB0aGUgY29udGFpbmVyLiAqLwogICAgIHN0cmVhbS0+dGltZV9iYXNlLmRlbiA9IGlucHV0X2NvZGVjX2NvbnRleHQtPnNhbXBsZV9yYXRlOwogICAgIHN0cmVhbS0+dGltZV9iYXNlLm51bSA9IDE7CiAKLSAgICAvKioKLSAgICAgKiBTb21lIGNvbnRhaW5lciBmb3JtYXRzIChsaWtlIE1QNCkgcmVxdWlyZSBnbG9iYWwgaGVhZGVycyB0byBiZSBwcmVzZW50Ci0gICAgICogTWFyayB0aGUgZW5jb2RlciBzbyB0aGF0IGl0IGJlaGF2ZXMgYWNjb3JkaW5nbHkuCi0gICAgICovCisgICAgLyogU29tZSBjb250YWluZXIgZm9ybWF0cyAobGlrZSBNUDQpIHJlcXVpcmUgZ2xvYmFsIGhlYWRlcnMgdG8gYmUgcHJlc2VudC4KKyAgICAgKiBNYXJrIHRoZSBlbmNvZGVyIHNvIHRoYXQgaXQgYmVoYXZlcyBhY2NvcmRpbmdseS4gKi8KICAgICBpZiAoKCpvdXRwdXRfZm9ybWF0X2NvbnRleHQpLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX0dMT0JBTEhFQURFUikKLSAgICAgICAgKCpvdXRwdXRfY29kZWNfY29udGV4dCktPmZsYWdzIHw9IEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUjsKKyAgICAgICAgYXZjdHgtPmZsYWdzIHw9IEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUjsKIAotICAgIC8qKiBPcGVuIHRoZSBlbmNvZGVyIGZvciB0aGUgYXVkaW8gc3RyZWFtIHRvIHVzZSBpdCBsYXRlci4gKi8KLSAgICBpZiAoKGVycm9yID0gYXZjb2RlY19vcGVuMigqb3V0cHV0X2NvZGVjX2NvbnRleHQsIG91dHB1dF9jb2RlYywgTlVMTCkpIDwgMCkgeworICAgIC8qIE9wZW4gdGhlIGVuY29kZXIgZm9yIHRoZSBhdWRpbyBzdHJlYW0gdG8gdXNlIGl0IGxhdGVyLiAqLworICAgIGlmICgoZXJyb3IgPSBhdmNvZGVjX29wZW4yKGF2Y3R4LCBvdXRwdXRfY29kZWMsIE5VTEwpKSA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBvdXRwdXQgY29kZWMgKGVycm9yICclcycpXG4iLAotICAgICAgICAgICAgICAgIGdldF9lcnJvcl90ZXh0KGVycm9yKSk7CisgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihlcnJvcikpOwogICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgfQogCisgICAgZXJyb3IgPSBhdmNvZGVjX3BhcmFtZXRlcnNfZnJvbV9jb250ZXh0KHN0cmVhbS0+Y29kZWNwYXIsIGF2Y3R4KTsKKyAgICBpZiAoZXJyb3IgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGluaXRpYWxpemUgc3RyZWFtIHBhcmFtZXRlcnNcbiIpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCisgICAgLyogU2F2ZSB0aGUgZW5jb2RlciBjb250ZXh0IGZvciBlYXNpZXIgYWNjZXNzIGxhdGVyLiAqLworICAgICpvdXRwdXRfY29kZWNfY29udGV4dCA9IGF2Y3R4OworCiAgICAgcmV0dXJuIDA7CiAKIGNsZWFudXA6CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmF2Y3R4KTsKICAgICBhdmlvX2Nsb3NlcCgmKCpvdXRwdXRfZm9ybWF0X2NvbnRleHQpLT5wYik7CiAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KCpvdXRwdXRfZm9ybWF0X2NvbnRleHQpOwogICAgICpvdXRwdXRfZm9ybWF0X2NvbnRleHQgPSBOVUxMOwogICAgIHJldHVybiBlcnJvciA8IDAgPyBlcnJvciA6IEFWRVJST1JfRVhJVDsKIH0KIAotLyoqIEluaXRpYWxpemUgb25lIGRhdGEgcGFja2V0IGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICovCisvKioKKyAqIEluaXRpYWxpemUgb25lIGRhdGEgcGFja2V0IGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCisgKiBAcGFyYW0gcGFja2V0IFBhY2tldCB0byBiZSBpbml0aWFsaXplZAorICovCiBzdGF0aWMgdm9pZCBpbml0X3BhY2tldChBVlBhY2tldCAqcGFja2V0KQogewogICAgIGF2X2luaXRfcGFja2V0KHBhY2tldCk7Ci0gICAgLyoqIFNldCB0aGUgcGFja2V0IGRhdGEgYW5kIHNpemUgc28gdGhhdCBpdCBpcyByZWNvZ25pemVkIGFzIGJlaW5nIGVtcHR5LiAqLworICAgIC8qIFNldCB0aGUgcGFja2V0IGRhdGEgYW5kIHNpemUgc28gdGhhdCBpdCBpcyByZWNvZ25pemVkIGFzIGJlaW5nIGVtcHR5LiAqLwogICAgIHBhY2tldC0+ZGF0YSA9IE5VTEw7CiAgICAgcGFja2V0LT5zaXplID0gMDsKIH0KIAotLyoqIEluaXRpYWxpemUgb25lIGF1ZGlvIGZyYW1lIGZvciByZWFkaW5nIGZyb20gdGhlIGlucHV0IGZpbGUgKi8KKy8qKgorICogSW5pdGlhbGl6ZSBvbmUgYXVkaW8gZnJhbWUgZm9yIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgZmlsZS4KKyAqIEBwYXJhbVtvdXRdIGZyYW1lIEZyYW1lIHRvIGJlIGluaXRpYWxpemVkCisgKiBAcmV0dXJuIEVycm9yIGNvZGUgKDAgaWYgc3VjY2Vzc2Z1bCkKKyAqLwogc3RhdGljIGludCBpbml0X2lucHV0X2ZyYW1lKEFWRnJhbWUgKipmcmFtZSkKIHsKICAgICBpZiAoISgqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkgewpAQCAtMjMzLDYgKzI3MywxMCBAQAogICogSW5pdGlhbGl6ZSB0aGUgYXVkaW8gcmVzYW1wbGVyIGJhc2VkIG9uIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGNvZGVjIHNldHRpbmdzLgogICogSWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgc2FtcGxlIGZvcm1hdHMgZGlmZmVyLCBhIGNvbnZlcnNpb24gaXMgcmVxdWlyZWQKICAqIGxpYnN3cmVzYW1wbGUgdGFrZXMgY2FyZSBvZiB0aGlzLCBidXQgcmVxdWlyZXMgaW5pdGlhbGl6YXRpb24uCisgKiBAcGFyYW0gICAgICBpbnB1dF9jb2RlY19jb250ZXh0ICBDb2RlYyBjb250ZXh0IG9mIHRoZSBpbnB1dCBmaWxlCisgKiBAcGFyYW0gICAgICBvdXRwdXRfY29kZWNfY29udGV4dCBDb2RlYyBjb250ZXh0IG9mIHRoZSBvdXRwdXQgZmlsZQorICogQHBhcmFtW291dF0gcmVzYW1wbGVfY29udGV4dCAgICAgUmVzYW1wbGUgY29udGV4dCBmb3IgdGhlIHJlcXVpcmVkIGNvbnZlcnNpb24KKyAqIEByZXR1cm4gRXJyb3IgY29kZSAoMCBpZiBzdWNjZXNzZnVsKQogICovCiBzdGF0aWMgaW50IGluaXRfcmVzYW1wbGVyKEFWQ29kZWNDb250ZXh0ICppbnB1dF9jb2RlY19jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqb3V0cHV0X2NvZGVjX2NvbnRleHQsCkBAIC0yNDAsNyArMjg0LDcgQEAKIHsKICAgICAgICAgaW50IGVycm9yOwogCi0gICAgICAgIC8qKgorICAgICAgICAvKgogICAgICAgICAgKiBDcmVhdGUgYSByZXNhbXBsZXIgY29udGV4dCBmb3IgdGhlIGNvbnZlcnNpb24uCiAgICAgICAgICAqIFNldCB0aGUgY29udmVyc2lvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgKiBEZWZhdWx0IGNoYW5uZWwgbGF5b3V0cyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCkBAIC0yNTksMTQgKzMwMywxNCBAQAogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgcmVzYW1wbGUgY29udGV4dFxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9Ci0gICAgICAgIC8qKgorICAgICAgICAvKgogICAgICAgICAqIFBlcmZvcm0gYSBzYW5pdHkgY2hlY2sgc28gdGhhdCB0aGUgbnVtYmVyIG9mIGNvbnZlcnRlZCBzYW1wbGVzIGlzCiAgICAgICAgICogbm90IGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgY29udmVydGVkLgogICAgICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZXMgZGlmZmVyLCB0aGlzIGNhc2UgaGFzIHRvIGJlIGhhbmRsZWQgZGlmZmVyZW50bHkKICAgICAgICAgKi8KICAgICAgICAgYXZfYXNzZXJ0MChvdXRwdXRfY29kZWNfY29udGV4dC0+c2FtcGxlX3JhdGUgPT0gaW5wdXRfY29kZWNfY29udGV4dC0+c2FtcGxlX3JhdGUpOwogCi0gICAgICAgIC8qKiBPcGVuIHRoZSByZXNhbXBsZXIgd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuICovCisgICAgICAgIC8qIE9wZW4gdGhlIHJlc2FtcGxlciB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gKi8KICAgICAgICAgaWYgKChlcnJvciA9IHN3cl9pbml0KCpyZXNhbXBsZV9jb250ZXh0KSkgPCAwKSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHJlc2FtcGxlIGNvbnRleHRcbiIpOwogICAgICAgICAgICAgc3dyX2ZyZWUocmVzYW1wbGVfY29udGV4dCk7CkBAIC0yNzUsMTAgKzMxOSwxNSBAQAogICAgIHJldHVybiAwOwogfQogCi0vKiogSW5pdGlhbGl6ZSBhIEZJRk8gYnVmZmVyIGZvciB0aGUgYXVkaW8gc2FtcGxlcyB0byBiZSBlbmNvZGVkLiAqLworLyoqCisgKiBJbml0aWFsaXplIGEgRklGTyBidWZmZXIgZm9yIHRoZSBhdWRpbyBzYW1wbGVzIHRvIGJlIGVuY29kZWQuCisgKiBAcGFyYW1bb3V0XSBmaWZvICAgICAgICAgICAgICAgICBTYW1wbGUgYnVmZmVyCisgKiBAcGFyYW0gICAgICBvdXRwdXRfY29kZWNfY29udGV4dCBDb2RlYyBjb250ZXh0IG9mIHRoZSBvdXRwdXQgZmlsZQorICogQHJldHVybiBFcnJvciBjb2RlICgwIGlmIHN1Y2Nlc3NmdWwpCisgKi8KIHN0YXRpYyBpbnQgaW5pdF9maWZvKEFWQXVkaW9GaWZvICoqZmlmbywgQVZDb2RlY0NvbnRleHQgKm91dHB1dF9jb2RlY19jb250ZXh0KQogewotICAgIC8qKiBDcmVhdGUgdGhlIEZJRk8gYnVmZmVyIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHNhbXBsZSBmb3JtYXQuICovCisgICAgLyogQ3JlYXRlIHRoZSBGSUZPIGJ1ZmZlciBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dCBzYW1wbGUgZm9ybWF0LiAqLwogICAgIGlmICghKCpmaWZvID0gYXZfYXVkaW9fZmlmb19hbGxvYyhvdXRwdXRfY29kZWNfY29udGV4dC0+c2FtcGxlX2ZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NvZGVjX2NvbnRleHQtPmNoYW5uZWxzLCAxKSkpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgRklGT1xuIik7CkBAIC0yODcsNjkgKzMzNiwxMDMgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyoqIFdyaXRlIHRoZSBoZWFkZXIgb2YgdGhlIG91dHB1dCBmaWxlIGNvbnRhaW5lci4gKi8KKy8qKgorICogV3JpdGUgdGhlIGhlYWRlciBvZiB0aGUgb3V0cHV0IGZpbGUgY29udGFpbmVyLgorICogQHBhcmFtIG91dHB1dF9mb3JtYXRfY29udGV4dCBGb3JtYXQgY29udGV4dCBvZiB0aGUgb3V0cHV0IGZpbGUKKyAqIEByZXR1cm4gRXJyb3IgY29kZSAoMCBpZiBzdWNjZXNzZnVsKQorICovCiBzdGF0aWMgaW50IHdyaXRlX291dHB1dF9maWxlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKm91dHB1dF9mb3JtYXRfY29udGV4dCkKIHsKICAgICBpbnQgZXJyb3I7CiAgICAgaWYgKChlcnJvciA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihvdXRwdXRfZm9ybWF0X2NvbnRleHQsIE5VTEwpKSA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgd3JpdGUgb3V0cHV0IGZpbGUgaGVhZGVyIChlcnJvciAnJXMnKVxuIiwKLSAgICAgICAgICAgICAgICBnZXRfZXJyb3JfdGV4dChlcnJvcikpOworICAgICAgICAgICAgICAgIGF2X2VycjJzdHIoZXJyb3IpKTsKICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotLyoqIERlY29kZSBvbmUgYXVkaW8gZnJhbWUgZnJvbSB0aGUgaW5wdXQgZmlsZS4gKi8KKy8qKgorICogRGVjb2RlIG9uZSBhdWRpbyBmcmFtZSBmcm9tIHRoZSBpbnB1dCBmaWxlLgorICogQHBhcmFtICAgICAgZnJhbWUgICAgICAgICAgICAgICAgQXVkaW8gZnJhbWUgdG8gYmUgZGVjb2RlZAorICogQHBhcmFtICAgICAgaW5wdXRfZm9ybWF0X2NvbnRleHQgRm9ybWF0IGNvbnRleHQgb2YgdGhlIGlucHV0IGZpbGUKKyAqIEBwYXJhbSAgICAgIGlucHV0X2NvZGVjX2NvbnRleHQgIENvZGVjIGNvbnRleHQgb2YgdGhlIGlucHV0IGZpbGUKKyAqIEBwYXJhbVtvdXRdIGRhdGFfcHJlc2VudCAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIGRhdGEgaGFzIGJlZW4gZGVjb2RlZAorICogQHBhcmFtW291dF0gZmluaXNoZWQgICAgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVuZCBvZiBmaWxlIGhhcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiByZWFjaGVkIGFuZCBhbGwgZGF0YSBoYXMgYmVlbgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZC4gSWYgdGhpcyBmbGFnIGlzIGZhbHNlLCB0aGVyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbW9yZSBkYXRhIHRvIGJlIGRlY29kZWQsIGkuZS4sIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQgYWdhaW4uCisgKiBAcmV0dXJuIEVycm9yIGNvZGUgKDAgaWYgc3VjY2Vzc2Z1bCkKKyAqLwogc3RhdGljIGludCBkZWNvZGVfYXVkaW9fZnJhbWUoQVZGcmFtZSAqZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKmlucHV0X2Zvcm1hdF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmlucHV0X2NvZGVjX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRhdGFfcHJlc2VudCwgaW50ICpmaW5pc2hlZCkKIHsKLSAgICAvKiogUGFja2V0IHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlLiAqLworICAgIC8qIFBhY2tldCB1c2VkIGZvciB0ZW1wb3Jhcnkgc3RvcmFnZS4gKi8KICAgICBBVlBhY2tldCBpbnB1dF9wYWNrZXQ7CiAgICAgaW50IGVycm9yOwogICAgIGluaXRfcGFja2V0KCZpbnB1dF9wYWNrZXQpOwogCi0gICAgLyoqIFJlYWQgb25lIGF1ZGlvIGZyYW1lIGZyb20gdGhlIGlucHV0IGZpbGUgaW50byBhIHRlbXBvcmFyeSBwYWNrZXQuICovCisgICAgLyogUmVhZCBvbmUgYXVkaW8gZnJhbWUgZnJvbSB0aGUgaW5wdXQgZmlsZSBpbnRvIGEgdGVtcG9yYXJ5IHBhY2tldC4gKi8KICAgICBpZiAoKGVycm9yID0gYXZfcmVhZF9mcmFtZShpbnB1dF9mb3JtYXRfY29udGV4dCwgJmlucHV0X3BhY2tldCkpIDwgMCkgewotICAgICAgICAvKiogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIGZsdXNoIHRoZSBkZWNvZGVyIGJlbG93LiAqLworICAgICAgICAvKiBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgZmx1c2ggdGhlIGRlY29kZXIgYmVsb3cuICovCiAgICAgICAgIGlmIChlcnJvciA9PSBBVkVSUk9SX0VPRikKICAgICAgICAgICAgICpmaW5pc2hlZCA9IDE7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVhZCBmcmFtZSAoZXJyb3IgJyVzJylcbiIsCi0gICAgICAgICAgICAgICAgICAgIGdldF9lcnJvcl90ZXh0KGVycm9yKSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2VycjJzdHIoZXJyb3IpKTsKICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKgotICAgICAqIERlY29kZSB0aGUgYXVkaW8gZnJhbWUgc3RvcmVkIGluIHRoZSB0ZW1wb3JhcnkgcGFja2V0LgotICAgICAqIFRoZSBpbnB1dCBhdWRpbyBzdHJlYW0gZGVjb2RlciBpcyB1c2VkIHRvIGRvIHRoaXMuCi0gICAgICogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHBhc3MgYW4gZW1wdHkgcGFja2V0IHRvIHRoZSBkZWNvZGVyCi0gICAgICogdG8gZmx1c2ggaXQuCi0gICAgICovCi0gICAgaWYgKChlcnJvciA9IGF2Y29kZWNfZGVjb2RlX2F1ZGlvNChpbnB1dF9jb2RlY19jb250ZXh0LCBmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfcHJlc2VudCwgJmlucHV0X3BhY2tldCkpIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBkZWNvZGUgZnJhbWUgKGVycm9yICclcycpXG4iLAotICAgICAgICAgICAgICAgIGdldF9lcnJvcl90ZXh0KGVycm9yKSk7Ci0gICAgICAgIGF2X3BhY2tldF91bnJlZigmaW5wdXRfcGFja2V0KTsKKyAgICAvKiBTZW5kIHRoZSBhdWRpbyBmcmFtZSBzdG9yZWQgaW4gdGhlIHRlbXBvcmFyeSBwYWNrZXQgdG8gdGhlIGRlY29kZXIuCisgICAgICogVGhlIGlucHV0IGF1ZGlvIHN0cmVhbSBkZWNvZGVyIGlzIHVzZWQgdG8gZG8gdGhpcy4gKi8KKyAgICBpZiAoKGVycm9yID0gYXZjb2RlY19zZW5kX3BhY2tldChpbnB1dF9jb2RlY19jb250ZXh0LCAmaW5wdXRfcGFja2V0KSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHNlbmQgcGFja2V0IGZvciBkZWNvZGluZyAoZXJyb3IgJyVzJylcbiIsCisgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihlcnJvcikpOwogICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgfQogCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGRlY29kZXIgaGFzIG5vdCBiZWVuIGZsdXNoZWQgY29tcGxldGVseSwgd2UgYXJlIG5vdCBmaW5pc2hlZCwKLSAgICAgKiBzbyB0aGF0IHRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCBhZ2Fpbi4KLSAgICAgKi8KLSAgICBpZiAoKmZpbmlzaGVkICYmICpkYXRhX3ByZXNlbnQpCi0gICAgICAgICpmaW5pc2hlZCA9IDA7CisgICAgLyogUmVjZWl2ZSBvbmUgZnJhbWUgZnJvbSB0aGUgZGVjb2Rlci4gKi8KKyAgICBlcnJvciA9IGF2Y29kZWNfcmVjZWl2ZV9mcmFtZShpbnB1dF9jb2RlY19jb250ZXh0LCBmcmFtZSk7CisgICAgLyogSWYgdGhlIGRlY29kZXIgYXNrcyBmb3IgbW9yZSBkYXRhIHRvIGJlIGFibGUgdG8gZGVjb2RlIGEgZnJhbWUsCisgICAgICogcmV0dXJuIGluZGljYXRpbmcgdGhhdCBubyBkYXRhIGlzIHByZXNlbnQuICovCisgICAgaWYgKGVycm9yID09IEFWRVJST1IoRUFHQUlOKSkgeworICAgICAgICBlcnJvciA9IDA7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAvKiBJZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlIGlzIHJlYWNoZWQsIHN0b3AgZGVjb2RpbmcuICovCisgICAgfSBlbHNlIGlmIChlcnJvciA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAqZmluaXNoZWQgPSAxOworICAgICAgICBlcnJvciA9IDA7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9IGVsc2UgaWYgKGVycm9yIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBkZWNvZGUgZnJhbWUgKGVycm9yICclcycpXG4iLAorICAgICAgICAgICAgICAgIGF2X2VycjJzdHIoZXJyb3IpKTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIC8qIERlZmF1bHQgY2FzZTogUmV0dXJuIGRlY29kZWQgZGF0YS4gKi8KKyAgICB9IGVsc2UgeworICAgICAgICAqZGF0YV9wcmVzZW50ID0gMTsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0KKworY2xlYW51cDoKICAgICBhdl9wYWNrZXRfdW5yZWYoJmlucHV0X3BhY2tldCk7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGVycm9yOwogfQogCiAvKioKICAqIEluaXRpYWxpemUgYSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYXVkaW8gc2FtcGxlcy4KICAqIFRoZSBjb252ZXJzaW9uIHJlcXVpcmVzIHRlbXBvcmFyeSBzdG9yYWdlIGR1ZSB0byB0aGUgZGlmZmVyZW50IGZvcm1hdC4KICAqIFRoZSBudW1iZXIgb2YgYXVkaW8gc2FtcGxlcyB0byBiZSBhbGxvY2F0ZWQgaXMgc3BlY2lmaWVkIGluIGZyYW1lX3NpemUuCisgKiBAcGFyYW1bb3V0XSBjb252ZXJ0ZWRfaW5wdXRfc2FtcGxlcyBBcnJheSBvZiBjb252ZXJ0ZWQgc2FtcGxlcy4gVGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zIGFyZSByZWZlcmVuY2UsIGNoYW5uZWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgbXVsdGktY2hhbm5lbCBhdWRpbyksIHNhbXBsZS4KKyAqIEBwYXJhbSAgICAgIG91dHB1dF9jb2RlY19jb250ZXh0ICAgIENvZGVjIGNvbnRleHQgb2YgdGhlIG91dHB1dCBmaWxlCisgKiBAcGFyYW0gICAgICBmcmFtZV9zaXplICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBiZSBjb252ZXJ0ZWQgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggcm91bmQKKyAqIEByZXR1cm4gRXJyb3IgY29kZSAoMCBpZiBzdWNjZXNzZnVsKQogICovCiBzdGF0aWMgaW50IGluaXRfY29udmVydGVkX3NhbXBsZXModWludDhfdCAqKipjb252ZXJ0ZWRfaW5wdXRfc2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqb3V0cHV0X2NvZGVjX2NvbnRleHQsCkBAIC0zNTcsOCArNDQwLDcgQEAKIHsKICAgICBpbnQgZXJyb3I7CiAKLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZSBhcyBtYW55IHBvaW50ZXJzIGFzIHRoZXJlIGFyZSBhdWRpbyBjaGFubmVscy4KKyAgICAvKiBBbGxvY2F0ZSBhcyBtYW55IHBvaW50ZXJzIGFzIHRoZXJlIGFyZSBhdWRpbyBjaGFubmVscy4KICAgICAgKiBFYWNoIHBvaW50ZXIgd2lsbCBsYXRlciBwb2ludCB0byB0aGUgYXVkaW8gc2FtcGxlcyBvZiB0aGUgY29ycmVzcG9uZGluZwogICAgICAqIGNoYW5uZWxzIChhbHRob3VnaCBpdCBtYXkgYmUgTlVMTCBmb3IgaW50ZXJsZWF2ZWQgZm9ybWF0cykuCiAgICAgICovCkBAIC0zNjgsMTcgKzQ1MCwxNSBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHNhbXBsZXMgb2YgYWxsIGNoYW5uZWxzIGluIG9uZSBjb25zZWN1dGl2ZQotICAgICAqIGJsb2NrIGZvciBjb252ZW5pZW5jZS4KLSAgICAgKi8KKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBzYW1wbGVzIG9mIGFsbCBjaGFubmVscyBpbiBvbmUgY29uc2VjdXRpdmUKKyAgICAgKiBibG9jayBmb3IgY29udmVuaWVuY2UuICovCiAgICAgaWYgKChlcnJvciA9IGF2X3NhbXBsZXNfYWxsb2MoKmNvbnZlcnRlZF9pbnB1dF9zYW1wbGVzLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9jb2RlY19jb250ZXh0LT5jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9jb2RlY19jb250ZXh0LT5zYW1wbGVfZm10LCAwKSkgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgY29udmVydGVkIGlucHV0IHNhbXBsZXMgKGVycm9yICclcycpXG4iLAotICAgICAgICAgICAgICAgIGdldF9lcnJvcl90ZXh0KGVycm9yKSk7CisgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihlcnJvcikpOwogICAgICAgICBhdl9mcmVlcCgmKCpjb252ZXJ0ZWRfaW5wdXRfc2FtcGxlcylbMF0pOwogICAgICAgICBmcmVlKCpjb252ZXJ0ZWRfaW5wdXRfc2FtcGxlcyk7CiAgICAgICAgIHJldHVybiBlcnJvcjsKQEAgLTM4OCw4ICs0NjgsMTUgQEAKIAogLyoqCiAgKiBDb252ZXJ0IHRoZSBpbnB1dCBhdWRpbyBzYW1wbGVzIGludG8gdGhlIG91dHB1dCBzYW1wbGUgZm9ybWF0LgotICogVGhlIGNvbnZlcnNpb24gaGFwcGVucyBvbiBhIHBlci1mcmFtZSBiYXNpcywgdGhlIHNpemUgb2Ygd2hpY2ggaXMgc3BlY2lmaWVkCi0gKiBieSBmcmFtZV9zaXplLgorICogVGhlIGNvbnZlcnNpb24gaGFwcGVucyBvbiBhIHBlci1mcmFtZSBiYXNpcywgdGhlIHNpemUgb2Ygd2hpY2ggaXMKKyAqIHNwZWNpZmllZCBieSBmcmFtZV9zaXplLgorICogQHBhcmFtICAgICAgaW5wdXRfZGF0YSAgICAgICBTYW1wbGVzIHRvIGJlIGRlY29kZWQuIFRoZSBkaW1lbnNpb25zIGFyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsIChmb3IgbXVsdGktY2hhbm5lbCBhdWRpbyksIHNhbXBsZS4KKyAqIEBwYXJhbVtvdXRdIGNvbnZlcnRlZF9kYXRhICAgQ29udmVydGVkIHNhbXBsZXMuIFRoZSBkaW1lbnNpb25zIGFyZSBjaGFubmVsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgbXVsdGktY2hhbm5lbCBhdWRpbyksIHNhbXBsZS4KKyAqIEBwYXJhbSAgICAgIGZyYW1lX3NpemUgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgY29udmVydGVkCisgKiBAcGFyYW0gICAgICByZXNhbXBsZV9jb250ZXh0IFJlc2FtcGxlIGNvbnRleHQgZm9yIHRoZSBjb252ZXJzaW9uCisgKiBAcmV0dXJuIEVycm9yIGNvZGUgKDAgaWYgc3VjY2Vzc2Z1bCkKICAqLwogc3RhdGljIGludCBjb252ZXJ0X3NhbXBsZXMoY29uc3QgdWludDhfdCAqKmlucHV0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqY29udmVydGVkX2RhdGEsIGNvbnN0IGludCBmcmFtZV9zaXplLApAQCAtMzk3LDM1ICs0ODQsNDAgQEAKIHsKICAgICBpbnQgZXJyb3I7CiAKLSAgICAvKiogQ29udmVydCB0aGUgc2FtcGxlcyB1c2luZyB0aGUgcmVzYW1wbGVyLiAqLworICAgIC8qIENvbnZlcnQgdGhlIHNhbXBsZXMgdXNpbmcgdGhlIHJlc2FtcGxlci4gKi8KICAgICBpZiAoKGVycm9yID0gc3dyX2NvbnZlcnQocmVzYW1wbGVfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkX2RhdGEsIGZyYW1lX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RhdGEgICAgLCBmcmFtZV9zaXplKSkgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGNvbnZlcnQgaW5wdXQgc2FtcGxlcyAoZXJyb3IgJyVzJylcbiIsCi0gICAgICAgICAgICAgICAgZ2V0X2Vycm9yX3RleHQoZXJyb3IpKTsKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKGVycm9yKSk7CiAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotLyoqIEFkZCBjb252ZXJ0ZWQgaW5wdXQgYXVkaW8gc2FtcGxlcyB0byB0aGUgRklGTyBidWZmZXIgZm9yIGxhdGVyIHByb2Nlc3NpbmcuICovCisvKioKKyAqIEFkZCBjb252ZXJ0ZWQgaW5wdXQgYXVkaW8gc2FtcGxlcyB0byB0aGUgRklGTyBidWZmZXIgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgKiBAcGFyYW0gZmlmbyAgICAgICAgICAgICAgICAgICAgQnVmZmVyIHRvIGFkZCB0aGUgc2FtcGxlcyB0bworICogQHBhcmFtIGNvbnZlcnRlZF9pbnB1dF9zYW1wbGVzIFNhbXBsZXMgdG8gYmUgYWRkZWQuIFRoZSBkaW1lbnNpb25zIGFyZSBjaGFubmVsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBtdWx0aS1jaGFubmVsIGF1ZGlvKSwgc2FtcGxlLgorICogQHBhcmFtIGZyYW1lX3NpemUgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIGJlIGNvbnZlcnRlZAorICogQHJldHVybiBFcnJvciBjb2RlICgwIGlmIHN1Y2Nlc3NmdWwpCisgKi8KIHN0YXRpYyBpbnQgYWRkX3NhbXBsZXNfdG9fZmlmbyhBVkF1ZGlvRmlmbyAqZmlmbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqY29udmVydGVkX2lucHV0X3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGZyYW1lX3NpemUpCiB7CiAgICAgaW50IGVycm9yOwogCi0gICAgLyoqCi0gICAgICogTWFrZSB0aGUgRklGTyBhcyBsYXJnZSBhcyBpdCBuZWVkcyB0byBiZSB0byBob2xkIGJvdGgsCi0gICAgICogdGhlIG9sZCBhbmQgdGhlIG5ldyBzYW1wbGVzLgotICAgICAqLworICAgIC8qIE1ha2UgdGhlIEZJRk8gYXMgbGFyZ2UgYXMgaXQgbmVlZHMgdG8gYmUgdG8gaG9sZCBib3RoLAorICAgICAqIHRoZSBvbGQgYW5kIHRoZSBuZXcgc2FtcGxlcy4gKi8KICAgICBpZiAoKGVycm9yID0gYXZfYXVkaW9fZmlmb19yZWFsbG9jKGZpZm8sIGF2X2F1ZGlvX2ZpZm9fc2l6ZShmaWZvKSArIGZyYW1lX3NpemUpKSA8IDApIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVhbGxvY2F0ZSBGSUZPXG4iKTsKICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgIH0KIAotICAgIC8qKiBTdG9yZSB0aGUgbmV3IHNhbXBsZXMgaW4gdGhlIEZJRk8gYnVmZmVyLiAqLworICAgIC8qIFN0b3JlIHRoZSBuZXcgc2FtcGxlcyBpbiB0aGUgRklGTyBidWZmZXIuICovCiAgICAgaWYgKGF2X2F1ZGlvX2ZpZm9fd3JpdGUoZmlmbywgKHZvaWQgKiopY29udmVydGVkX2lucHV0X3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZSkgPCBmcmFtZV9zaXplKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHdyaXRlIGRhdGEgdG8gRklGT1xuIik7CkBAIC00MzUsOCArNTI3LDIwIEBACiB9CiAKIC8qKgotICogUmVhZCBvbmUgYXVkaW8gZnJhbWUgZnJvbSB0aGUgaW5wdXQgZmlsZSwgZGVjb2RlcywgY29udmVydHMgYW5kIHN0b3JlcworICogUmVhZCBvbmUgYXVkaW8gZnJhbWUgZnJvbSB0aGUgaW5wdXQgZmlsZSwgZGVjb2RlLCBjb252ZXJ0IGFuZCBzdG9yZQogICogaXQgaW4gdGhlIEZJRk8gYnVmZmVyLgorICogQHBhcmFtICAgICAgZmlmbyAgICAgICAgICAgICAgICAgQnVmZmVyIHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAcGFyYW0gICAgICBpbnB1dF9mb3JtYXRfY29udGV4dCBGb3JtYXQgY29udGV4dCBvZiB0aGUgaW5wdXQgZmlsZQorICogQHBhcmFtICAgICAgaW5wdXRfY29kZWNfY29udGV4dCAgQ29kZWMgY29udGV4dCBvZiB0aGUgaW5wdXQgZmlsZQorICogQHBhcmFtICAgICAgb3V0cHV0X2NvZGVjX2NvbnRleHQgQ29kZWMgY29udGV4dCBvZiB0aGUgb3V0cHV0IGZpbGUKKyAqIEBwYXJhbSAgICAgIHJlc2FtcGxlcl9jb250ZXh0ICAgIFJlc2FtcGxlIGNvbnRleHQgZm9yIHRoZSBjb252ZXJzaW9uCisgKiBAcGFyYW1bb3V0XSBmaW5pc2hlZCAgICAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW5kIG9mIGZpbGUgaGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIHJlYWNoZWQgYW5kIGFsbCBkYXRhIGhhcyBiZWVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkLiBJZiB0aGlzIGZsYWcgaXMgZmFsc2UsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBtb3JlIGRhdGEgdG8gYmUgZGVjb2RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkuZS4sIHRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdhaW4uCisgKiBAcmV0dXJuIEVycm9yIGNvZGUgKDAgaWYgc3VjY2Vzc2Z1bCkKICAqLwogc3RhdGljIGludCByZWFkX2RlY29kZV9jb252ZXJ0X2FuZF9zdG9yZShBVkF1ZGlvRmlmbyAqZmlmbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICppbnB1dF9mb3JtYXRfY29udGV4dCwKQEAgLTQ0NSw0NSArNTQ5LDQxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3ckNvbnRleHQgKnJlc2FtcGxlcl9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZpbmlzaGVkKQogewotICAgIC8qKiBUZW1wb3Jhcnkgc3RvcmFnZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyBvZiB0aGUgZnJhbWUgcmVhZCBmcm9tIHRoZSBmaWxlLiAqLworICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIG9mIHRoZSBpbnB1dCBzYW1wbGVzIG9mIHRoZSBmcmFtZSByZWFkIGZyb20gdGhlIGZpbGUuICovCiAgICAgQVZGcmFtZSAqaW5wdXRfZnJhbWUgPSBOVUxMOwotICAgIC8qKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlIGNvbnZlcnRlZCBpbnB1dCBzYW1wbGVzLiAqLworICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciB0aGUgY29udmVydGVkIGlucHV0IHNhbXBsZXMuICovCiAgICAgdWludDhfdCAqKmNvbnZlcnRlZF9pbnB1dF9zYW1wbGVzID0gTlVMTDsKLSAgICBpbnQgZGF0YV9wcmVzZW50OworICAgIGludCBkYXRhX3ByZXNlbnQgPSAwOwogICAgIGludCByZXQgPSBBVkVSUk9SX0VYSVQ7CiAKLSAgICAvKiogSW5pdGlhbGl6ZSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3Igb25lIGlucHV0IGZyYW1lLiAqLworICAgIC8qIEluaXRpYWxpemUgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG9uZSBpbnB1dCBmcmFtZS4gKi8KICAgICBpZiAoaW5pdF9pbnB1dF9mcmFtZSgmaW5wdXRfZnJhbWUpKQogICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgLyoqIERlY29kZSBvbmUgZnJhbWUgd29ydGggb2YgYXVkaW8gc2FtcGxlcy4gKi8KKyAgICAvKiBEZWNvZGUgb25lIGZyYW1lIHdvcnRoIG9mIGF1ZGlvIHNhbXBsZXMuICovCiAgICAgaWYgKGRlY29kZV9hdWRpb19mcmFtZShpbnB1dF9mcmFtZSwgaW5wdXRfZm9ybWF0X2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9jb2RlY19jb250ZXh0LCAmZGF0YV9wcmVzZW50LCBmaW5pc2hlZCkpCiAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAvKioKLSAgICAgKiBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgc2FtcGxlcworICAgIC8qIElmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIGFuZCB0aGVyZSBhcmUgbm8gbW9yZSBzYW1wbGVzCiAgICAgICogaW4gdGhlIGRlY29kZXIgd2hpY2ggYXJlIGRlbGF5ZWQsIHdlIGFyZSBhY3R1YWxseSBmaW5pc2hlZC4KLSAgICAgKiBUaGlzIG11c3Qgbm90IGJlIHRyZWF0ZWQgYXMgYW4gZXJyb3IuCi0gICAgICovCi0gICAgaWYgKCpmaW5pc2hlZCAmJiAhZGF0YV9wcmVzZW50KSB7CisgICAgICogVGhpcyBtdXN0IG5vdCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yLiAqLworICAgIGlmICgqZmluaXNoZWQpIHsKICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgZ290byBjbGVhbnVwOwogICAgIH0KLSAgICAvKiogSWYgdGhlcmUgaXMgZGVjb2RlZCBkYXRhLCBjb252ZXJ0IGFuZCBzdG9yZSBpdCAqLworICAgIC8qIElmIHRoZXJlIGlzIGRlY29kZWQgZGF0YSwgY29udmVydCBhbmQgc3RvcmUgaXQuICovCiAgICAgaWYgKGRhdGFfcHJlc2VudCkgewotICAgICAgICAvKiogSW5pdGlhbGl6ZSB0aGUgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHRoZSBjb252ZXJ0ZWQgaW5wdXQgc2FtcGxlcy4gKi8KKyAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHRoZSBjb252ZXJ0ZWQgaW5wdXQgc2FtcGxlcy4gKi8KICAgICAgICAgaWYgKGluaXRfY29udmVydGVkX3NhbXBsZXMoJmNvbnZlcnRlZF9pbnB1dF9zYW1wbGVzLCBvdXRwdXRfY29kZWNfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZnJhbWUtPm5iX3NhbXBsZXMpKQogICAgICAgICAgICAgZ290byBjbGVhbnVwOwogCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb252ZXJ0IHRoZSBpbnB1dCBzYW1wbGVzIHRvIHRoZSBkZXNpcmVkIG91dHB1dCBzYW1wbGUgZm9ybWF0LgotICAgICAgICAgKiBUaGlzIHJlcXVpcmVzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgcHJvdmlkZWQgYnkgY29udmVydGVkX2lucHV0X3NhbXBsZXMuCi0gICAgICAgICAqLworICAgICAgICAvKiBDb252ZXJ0IHRoZSBpbnB1dCBzYW1wbGVzIHRvIHRoZSBkZXNpcmVkIG91dHB1dCBzYW1wbGUgZm9ybWF0LgorICAgICAgICAgKiBUaGlzIHJlcXVpcmVzIGEgdGVtcG9yYXJ5IHN0b3JhZ2UgcHJvdmlkZWQgYnkgY29udmVydGVkX2lucHV0X3NhbXBsZXMuICovCiAgICAgICAgIGlmIChjb252ZXJ0X3NhbXBsZXMoKGNvbnN0IHVpbnQ4X3QqKilpbnB1dF9mcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgY29udmVydGVkX2lucHV0X3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZnJhbWUtPm5iX3NhbXBsZXMsIHJlc2FtcGxlcl9jb250ZXh0KSkKICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKIAotICAgICAgICAvKiogQWRkIHRoZSBjb252ZXJ0ZWQgaW5wdXQgc2FtcGxlcyB0byB0aGUgRklGTyBidWZmZXIgZm9yIGxhdGVyIHByb2Nlc3NpbmcuICovCisgICAgICAgIC8qIEFkZCB0aGUgY29udmVydGVkIGlucHV0IHNhbXBsZXMgdG8gdGhlIEZJRk8gYnVmZmVyIGZvciBsYXRlciBwcm9jZXNzaW5nLiAqLwogICAgICAgICBpZiAoYWRkX3NhbXBsZXNfdG9fZmlmbyhmaWZvLCBjb252ZXJ0ZWRfaW5wdXRfc2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZnJhbWUtPm5iX3NhbXBsZXMpKQogICAgICAgICAgICAgZ290byBjbGVhbnVwOwpAQCAtNTA0LDYgKzYwNCwxMCBAQAogLyoqCiAgKiBJbml0aWFsaXplIG9uZSBpbnB1dCBmcmFtZSBmb3Igd3JpdGluZyB0byB0aGUgb3V0cHV0IGZpbGUuCiAgKiBUaGUgZnJhbWUgd2lsbCBiZSBleGFjdGx5IGZyYW1lX3NpemUgc2FtcGxlcyBsYXJnZS4KKyAqIEBwYXJhbVtvdXRdIGZyYW1lICAgICAgICAgICAgICAgIEZyYW1lIHRvIGJlIGluaXRpYWxpemVkCisgKiBAcGFyYW0gICAgICBvdXRwdXRfY29kZWNfY29udGV4dCBDb2RlYyBjb250ZXh0IG9mIHRoZSBvdXRwdXQgZmlsZQorICogQHBhcmFtICAgICAgZnJhbWVfc2l6ZSAgICAgICAgICAgU2l6ZSBvZiB0aGUgZnJhbWUKKyAqIEByZXR1cm4gRXJyb3IgY29kZSAoMCBpZiBzdWNjZXNzZnVsKQogICovCiBzdGF0aWMgaW50IGluaXRfb3V0cHV0X2ZyYW1lKEFWRnJhbWUgKipmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKm91dHB1dF9jb2RlY19jb250ZXh0LApAQCAtNTExLDMxICs2MTUsMjcgQEAKIHsKICAgICBpbnQgZXJyb3I7CiAKLSAgICAvKiogQ3JlYXRlIGEgbmV3IGZyYW1lIHRvIHN0b3JlIHRoZSBhdWRpbyBzYW1wbGVzLiAqLworICAgIC8qIENyZWF0ZSBhIG5ldyBmcmFtZSB0byBzdG9yZSB0aGUgYXVkaW8gc2FtcGxlcy4gKi8KICAgICBpZiAoISgqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBvdXRwdXQgZnJhbWVcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOwogICAgIH0KIAotICAgIC8qKgotICAgICAqIFNldCB0aGUgZnJhbWUncyBwYXJhbWV0ZXJzLCBlc3BlY2lhbGx5IGl0cyBzaXplIGFuZCBmb3JtYXQuCisgICAgLyogU2V0IHRoZSBmcmFtZSdzIHBhcmFtZXRlcnMsIGVzcGVjaWFsbHkgaXRzIHNpemUgYW5kIGZvcm1hdC4KICAgICAgKiBhdl9mcmFtZV9nZXRfYnVmZmVyIG5lZWRzIHRoaXMgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUKICAgICAgKiBhdWRpbyBzYW1wbGVzIG9mIHRoZSBmcmFtZS4KICAgICAgKiBEZWZhdWx0IGNoYW5uZWwgbGF5b3V0cyBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICogYXJlIGFzc3VtZWQgZm9yIHNpbXBsaWNpdHkuCi0gICAgICovCisgICAgICogYXJlIGFzc3VtZWQgZm9yIHNpbXBsaWNpdHkuICovCiAgICAgKCpmcmFtZSktPm5iX3NhbXBsZXMgICAgID0gZnJhbWVfc2l6ZTsKICAgICAoKmZyYW1lKS0+Y2hhbm5lbF9sYXlvdXQgPSBvdXRwdXRfY29kZWNfY29udGV4dC0+Y2hhbm5lbF9sYXlvdXQ7CiAgICAgKCpmcmFtZSktPmZvcm1hdCAgICAgICAgID0gb3V0cHV0X2NvZGVjX2NvbnRleHQtPnNhbXBsZV9mbXQ7CiAgICAgKCpmcmFtZSktPnNhbXBsZV9yYXRlICAgID0gb3V0cHV0X2NvZGVjX2NvbnRleHQtPnNhbXBsZV9yYXRlOwogCi0gICAgLyoqCi0gICAgICogQWxsb2NhdGUgdGhlIHNhbXBsZXMgb2YgdGhlIGNyZWF0ZWQgZnJhbWUuIFRoaXMgY2FsbCB3aWxsIG1ha2UKLSAgICAgKiBzdXJlIHRoYXQgdGhlIGF1ZGlvIGZyYW1lIGNhbiBob2xkIGFzIG1hbnkgc2FtcGxlcyBhcyBzcGVjaWZpZWQuCi0gICAgICovCisgICAgLyogQWxsb2NhdGUgdGhlIHNhbXBsZXMgb2YgdGhlIGNyZWF0ZWQgZnJhbWUuIFRoaXMgY2FsbCB3aWxsIG1ha2UKKyAgICAgKiBzdXJlIHRoYXQgdGhlIGF1ZGlvIGZyYW1lIGNhbiBob2xkIGFzIG1hbnkgc2FtcGxlcyBhcyBzcGVjaWZpZWQuICovCiAgICAgaWYgKChlcnJvciA9IGF2X2ZyYW1lX2dldF9idWZmZXIoKmZyYW1lLCAwKSkgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgYWxsb2NhdGUgb3V0cHV0IGZyYW1lIHNhbXBsZXMgKGVycm9yICclcycpXG4iLAotICAgICAgICAgICAgICAgIGdldF9lcnJvcl90ZXh0KGVycm9yKSk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRlIG91dHB1dCBmcmFtZSBzYW1wbGVzIChlcnJvciAnJXMnKVxuIiwKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKGVycm9yKSk7CiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoZnJhbWUpOwogICAgICAgICByZXR1cm4gZXJyb3I7CiAgICAgfQpAQCAtNTQzLDg3ICs2NDMsMTE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qKiBHbG9iYWwgdGltZXN0YW1wIGZvciB0aGUgYXVkaW8gZnJhbWVzICovCisvKiBHbG9iYWwgdGltZXN0YW1wIGZvciB0aGUgYXVkaW8gZnJhbWVzLiAqLwogc3RhdGljIGludDY0X3QgcHRzID0gMDsKIAotLyoqIEVuY29kZSBvbmUgZnJhbWUgd29ydGggb2YgYXVkaW8gdG8gdGhlIG91dHB1dCBmaWxlLiAqLworLyoqCisgKiBFbmNvZGUgb25lIGZyYW1lIHdvcnRoIG9mIGF1ZGlvIHRvIHRoZSBvdXRwdXQgZmlsZS4KKyAqIEBwYXJhbSAgICAgIGZyYW1lICAgICAgICAgICAgICAgICBTYW1wbGVzIHRvIGJlIGVuY29kZWQKKyAqIEBwYXJhbSAgICAgIG91dHB1dF9mb3JtYXRfY29udGV4dCBGb3JtYXQgY29udGV4dCBvZiB0aGUgb3V0cHV0IGZpbGUKKyAqIEBwYXJhbSAgICAgIG91dHB1dF9jb2RlY19jb250ZXh0ICBDb2RlYyBjb250ZXh0IG9mIHRoZSBvdXRwdXQgZmlsZQorICogQHBhcmFtW291dF0gZGF0YV9wcmVzZW50ICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIGRhdGEgaGFzIGJlZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkCisgKiBAcmV0dXJuIEVycm9yIGNvZGUgKDAgaWYgc3VjY2Vzc2Z1bCkKKyAqLwogc3RhdGljIGludCBlbmNvZGVfYXVkaW9fZnJhbWUoQVZGcmFtZSAqZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKm91dHB1dF9mb3JtYXRfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICpvdXRwdXRfY29kZWNfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGF0YV9wcmVzZW50KQogewotICAgIC8qKiBQYWNrZXQgdXNlZCBmb3IgdGVtcG9yYXJ5IHN0b3JhZ2UuICovCisgICAgLyogUGFja2V0IHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlLiAqLwogICAgIEFWUGFja2V0IG91dHB1dF9wYWNrZXQ7CiAgICAgaW50IGVycm9yOwogICAgIGluaXRfcGFja2V0KCZvdXRwdXRfcGFja2V0KTsKIAotICAgIC8qKiBTZXQgYSB0aW1lc3RhbXAgYmFzZWQgb24gdGhlIHNhbXBsZSByYXRlIGZvciB0aGUgY29udGFpbmVyLiAqLworICAgIC8qIFNldCBhIHRpbWVzdGFtcCBiYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUgZm9yIHRoZSBjb250YWluZXIuICovCiAgICAgaWYgKGZyYW1lKSB7CiAgICAgICAgIGZyYW1lLT5wdHMgPSBwdHM7CiAgICAgICAgIHB0cyArPSBmcmFtZS0+bmJfc2FtcGxlczsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBFbmNvZGUgdGhlIGF1ZGlvIGZyYW1lIGFuZCBzdG9yZSBpdCBpbiB0aGUgdGVtcG9yYXJ5IHBhY2tldC4KLSAgICAgKiBUaGUgb3V0cHV0IGF1ZGlvIHN0cmVhbSBlbmNvZGVyIGlzIHVzZWQgdG8gZG8gdGhpcy4KLSAgICAgKi8KLSAgICBpZiAoKGVycm9yID0gYXZjb2RlY19lbmNvZGVfYXVkaW8yKG91dHB1dF9jb2RlY19jb250ZXh0LCAmb3V0cHV0X3BhY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLCBkYXRhX3ByZXNlbnQpKSA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZW5jb2RlIGZyYW1lIChlcnJvciAnJXMnKVxuIiwKLSAgICAgICAgICAgICAgICBnZXRfZXJyb3JfdGV4dChlcnJvcikpOwotICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJm91dHB1dF9wYWNrZXQpOworICAgIC8qIFNlbmQgdGhlIGF1ZGlvIGZyYW1lIHN0b3JlZCBpbiB0aGUgdGVtcG9yYXJ5IHBhY2tldCB0byB0aGUgZW5jb2Rlci4KKyAgICAgKiBUaGUgb3V0cHV0IGF1ZGlvIHN0cmVhbSBlbmNvZGVyIGlzIHVzZWQgdG8gZG8gdGhpcy4gKi8KKyAgICBlcnJvciA9IGF2Y29kZWNfc2VuZF9mcmFtZShvdXRwdXRfY29kZWNfY29udGV4dCwgZnJhbWUpOworICAgIC8qIFRoZSBlbmNvZGVyIHNpZ25hbHMgdGhhdCBpdCBoYXMgbm90aGluZyBtb3JlIHRvIGVuY29kZS4gKi8KKyAgICBpZiAoZXJyb3IgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgZXJyb3IgPSAwOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfSBlbHNlIGlmIChlcnJvciA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgc2VuZCBwYWNrZXQgZm9yIGVuY29kaW5nIChlcnJvciAnJXMnKVxuIiwKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKGVycm9yKSk7CiAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICB9CiAKLSAgICAvKiogV3JpdGUgb25lIGF1ZGlvIGZyYW1lIGZyb20gdGhlIHRlbXBvcmFyeSBwYWNrZXQgdG8gdGhlIG91dHB1dCBmaWxlLiAqLwotICAgIGlmICgqZGF0YV9wcmVzZW50KSB7Ci0gICAgICAgIGlmICgoZXJyb3IgPSBhdl93cml0ZV9mcmFtZShvdXRwdXRfZm9ybWF0X2NvbnRleHQsICZvdXRwdXRfcGFja2V0KSkgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCB3cml0ZSBmcmFtZSAoZXJyb3IgJyVzJylcbiIsCi0gICAgICAgICAgICAgICAgICAgIGdldF9lcnJvcl90ZXh0KGVycm9yKSk7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJm91dHB1dF9wYWNrZXQpOwotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgYXZfcGFja2V0X3VucmVmKCZvdXRwdXRfcGFja2V0KTsKKyAgICAvKiBSZWNlaXZlIG9uZSBlbmNvZGVkIGZyYW1lIGZyb20gdGhlIGVuY29kZXIuICovCisgICAgZXJyb3IgPSBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KG91dHB1dF9jb2RlY19jb250ZXh0LCAmb3V0cHV0X3BhY2tldCk7CisgICAgLyogSWYgdGhlIGVuY29kZXIgYXNrcyBmb3IgbW9yZSBkYXRhIHRvIGJlIGFibGUgdG8gcHJvdmlkZSBhbgorICAgICAqIGVuY29kZWQgZnJhbWUsIHJldHVybiBpbmRpY2F0aW5nIHRoYXQgbm8gZGF0YSBpcyBwcmVzZW50LiAqLworICAgIGlmIChlcnJvciA9PSBBVkVSUk9SKEVBR0FJTikpIHsKKyAgICAgICAgZXJyb3IgPSAwOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgLyogSWYgdGhlIGxhc3QgZnJhbWUgaGFzIGJlZW4gZW5jb2RlZCwgc3RvcCBlbmNvZGluZy4gKi8KKyAgICB9IGVsc2UgaWYgKGVycm9yID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgIGVycm9yID0gMDsKKyAgICAgICAgZ290byBjbGVhbnVwOworICAgIH0gZWxzZSBpZiAoZXJyb3IgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGVuY29kZSBmcmFtZSAoZXJyb3IgJyVzJylcbiIsCisgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihlcnJvcikpOworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgLyogRGVmYXVsdCBjYXNlOiBSZXR1cm4gZW5jb2RlZCBkYXRhLiAqLworICAgIH0gZWxzZSB7CisgICAgICAgICpkYXRhX3ByZXNlbnQgPSAxOwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIC8qIFdyaXRlIG9uZSBhdWRpbyBmcmFtZSBmcm9tIHRoZSB0ZW1wb3JhcnkgcGFja2V0IHRvIHRoZSBvdXRwdXQgZmlsZS4gKi8KKyAgICBpZiAoKmRhdGFfcHJlc2VudCAmJgorICAgICAgICAoZXJyb3IgPSBhdl93cml0ZV9mcmFtZShvdXRwdXRfZm9ybWF0X2NvbnRleHQsICZvdXRwdXRfcGFja2V0KSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHdyaXRlIGZyYW1lIChlcnJvciAnJXMnKVxuIiwKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKGVycm9yKSk7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisKK2NsZWFudXA6CisgICAgYXZfcGFja2V0X3VucmVmKCZvdXRwdXRfcGFja2V0KTsKKyAgICByZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgogICogTG9hZCBvbmUgYXVkaW8gZnJhbWUgZnJvbSB0aGUgRklGTyBidWZmZXIsIGVuY29kZSBhbmQgd3JpdGUgaXQgdG8gdGhlCiAgKiBvdXRwdXQgZmlsZS4KKyAqIEBwYXJhbSBmaWZvICAgICAgICAgICAgICAgICAgQnVmZmVyIHVzZWQgZm9yIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAcGFyYW0gb3V0cHV0X2Zvcm1hdF9jb250ZXh0IEZvcm1hdCBjb250ZXh0IG9mIHRoZSBvdXRwdXQgZmlsZQorICogQHBhcmFtIG91dHB1dF9jb2RlY19jb250ZXh0ICBDb2RlYyBjb250ZXh0IG9mIHRoZSBvdXRwdXQgZmlsZQorICogQHJldHVybiBFcnJvciBjb2RlICgwIGlmIHN1Y2Nlc3NmdWwpCiAgKi8KIHN0YXRpYyBpbnQgbG9hZF9lbmNvZGVfYW5kX3dyaXRlKEFWQXVkaW9GaWZvICpmaWZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpvdXRwdXRfZm9ybWF0X2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqb3V0cHV0X2NvZGVjX2NvbnRleHQpCiB7Ci0gICAgLyoqIFRlbXBvcmFyeSBzdG9yYWdlIG9mIHRoZSBvdXRwdXQgc2FtcGxlcyBvZiB0aGUgZnJhbWUgd3JpdHRlbiB0byB0aGUgZmlsZS4gKi8KKyAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBvZiB0aGUgb3V0cHV0IHNhbXBsZXMgb2YgdGhlIGZyYW1lIHdyaXR0ZW4gdG8gdGhlIGZpbGUuICovCiAgICAgQVZGcmFtZSAqb3V0cHV0X2ZyYW1lOwotICAgIC8qKgotICAgICAqIFVzZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc2FtcGxlcyBwZXIgZnJhbWUuCisgICAgLyogVXNlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwb3NzaWJsZSBzYW1wbGVzIHBlciBmcmFtZS4KICAgICAgKiBJZiB0aGVyZSBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gcG9zc2libGUgZnJhbWUgc2l6ZSBpbiB0aGUgRklGTwotICAgICAqIGJ1ZmZlciB1c2UgdGhpcyBudW1iZXIuIE90aGVyd2lzZSwgdXNlIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGZyYW1lIHNpemUKLSAgICAgKi8KKyAgICAgKiBidWZmZXIgdXNlIHRoaXMgbnVtYmVyLiBPdGhlcndpc2UsIHVzZSB0aGUgbWF4aW11bSBwb3NzaWJsZSBmcmFtZSBzaXplLiAqLwogICAgIGNvbnN0IGludCBmcmFtZV9zaXplID0gRkZNSU4oYXZfYXVkaW9fZmlmb19zaXplKGZpZm8pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NvZGVjX2NvbnRleHQtPmZyYW1lX3NpemUpOwogICAgIGludCBkYXRhX3dyaXR0ZW47CiAKLSAgICAvKiogSW5pdGlhbGl6ZSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3Igb25lIG91dHB1dCBmcmFtZS4gKi8KKyAgICAvKiBJbml0aWFsaXplIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBvbmUgb3V0cHV0IGZyYW1lLiAqLwogICAgIGlmIChpbml0X291dHB1dF9mcmFtZSgmb3V0cHV0X2ZyYW1lLCBvdXRwdXRfY29kZWNfY29udGV4dCwgZnJhbWVfc2l6ZSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CiAKLSAgICAvKioKLSAgICAgKiBSZWFkIGFzIG1hbnkgc2FtcGxlcyBmcm9tIHRoZSBGSUZPIGJ1ZmZlciBhcyByZXF1aXJlZCB0byBmaWxsIHRoZSBmcmFtZS4KLSAgICAgKiBUaGUgc2FtcGxlcyBhcmUgc3RvcmVkIGluIHRoZSBmcmFtZSB0ZW1wb3JhcmlseS4KLSAgICAgKi8KKyAgICAvKiBSZWFkIGFzIG1hbnkgc2FtcGxlcyBmcm9tIHRoZSBGSUZPIGJ1ZmZlciBhcyByZXF1aXJlZCB0byBmaWxsIHRoZSBmcmFtZS4KKyAgICAgKiBUaGUgc2FtcGxlcyBhcmUgc3RvcmVkIGluIHRoZSBmcmFtZSB0ZW1wb3JhcmlseS4gKi8KICAgICBpZiAoYXZfYXVkaW9fZmlmb19yZWFkKGZpZm8sICh2b2lkICoqKW91dHB1dF9mcmFtZS0+ZGF0YSwgZnJhbWVfc2l6ZSkgPCBmcmFtZV9zaXplKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlYWQgZGF0YSBmcm9tIEZJRk9cbiIpOwogICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXRfZnJhbWUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOwogICAgIH0KIAotICAgIC8qKiBFbmNvZGUgb25lIGZyYW1lIHdvcnRoIG9mIGF1ZGlvIHNhbXBsZXMuICovCisgICAgLyogRW5jb2RlIG9uZSBmcmFtZSB3b3J0aCBvZiBhdWRpbyBzYW1wbGVzLiAqLwogICAgIGlmIChlbmNvZGVfYXVkaW9fZnJhbWUob3V0cHV0X2ZyYW1lLCBvdXRwdXRfZm9ybWF0X2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY29kZWNfY29udGV4dCwgJmRhdGFfd3JpdHRlbikpIHsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0cHV0X2ZyYW1lKTsKQEAgLTYzMywxOSArNzYwLDIyIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qKiBXcml0ZSB0aGUgdHJhaWxlciBvZiB0aGUgb3V0cHV0IGZpbGUgY29udGFpbmVyLiAqLworLyoqCisgKiBXcml0ZSB0aGUgdHJhaWxlciBvZiB0aGUgb3V0cHV0IGZpbGUgY29udGFpbmVyLgorICogQHBhcmFtIG91dHB1dF9mb3JtYXRfY29udGV4dCBGb3JtYXQgY29udGV4dCBvZiB0aGUgb3V0cHV0IGZpbGUKKyAqIEByZXR1cm4gRXJyb3IgY29kZSAoMCBpZiBzdWNjZXNzZnVsKQorICovCiBzdGF0aWMgaW50IHdyaXRlX291dHB1dF9maWxlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICpvdXRwdXRfZm9ybWF0X2NvbnRleHQpCiB7CiAgICAgaW50IGVycm9yOwogICAgIGlmICgoZXJyb3IgPSBhdl93cml0ZV90cmFpbGVyKG91dHB1dF9mb3JtYXRfY29udGV4dCkpIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCB3cml0ZSBvdXRwdXQgZmlsZSB0cmFpbGVyIChlcnJvciAnJXMnKVxuIiwKLSAgICAgICAgICAgICAgICBnZXRfZXJyb3JfdGV4dChlcnJvcikpOworICAgICAgICAgICAgICAgIGF2X2VycjJzdHIoZXJyb3IpKTsKICAgICAgICAgcmV0dXJuIGVycm9yOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotLyoqIENvbnZlcnQgYW4gYXVkaW8gZmlsZSB0byBhbiBBQUMgZmlsZSBpbiBhbiBNUDQgY29udGFpbmVyLiAqLwogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogICAgIEFWRm9ybWF0Q29udGV4dCAqaW5wdXRfZm9ybWF0X2NvbnRleHQgPSBOVUxMLCAqb3V0cHV0X2Zvcm1hdF9jb250ZXh0ID0gTlVMTDsKQEAgLTY1NCw5MCArNzg0LDc1IEBACiAgICAgQVZBdWRpb0ZpZm8gKmZpZm8gPSBOVUxMOwogICAgIGludCByZXQgPSBBVkVSUk9SX0VYSVQ7CiAKLSAgICBpZiAoYXJnYyA8IDMpIHsKKyAgICBpZiAoYXJnYyAhPSAzKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxpbnB1dCBmaWxlPiA8b3V0cHV0IGZpbGU+XG4iLCBhcmd2WzBdKTsKICAgICAgICAgZXhpdCgxKTsKICAgICB9CiAKLSAgICAvKiogUmVnaXN0ZXIgYWxsIGNvZGVjcyBhbmQgZm9ybWF0cyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQuICovCi0gICAgYXZfcmVnaXN0ZXJfYWxsKCk7Ci0gICAgLyoqIE9wZW4gdGhlIGlucHV0IGZpbGUgZm9yIHJlYWRpbmcuICovCisgICAgLyogT3BlbiB0aGUgaW5wdXQgZmlsZSBmb3IgcmVhZGluZy4gKi8KICAgICBpZiAob3Blbl9pbnB1dF9maWxlKGFyZ3ZbMV0sICZpbnB1dF9mb3JtYXRfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dF9jb2RlY19jb250ZXh0KSkKICAgICAgICAgZ290byBjbGVhbnVwOwotICAgIC8qKiBPcGVuIHRoZSBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZy4gKi8KKyAgICAvKiBPcGVuIHRoZSBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZy4gKi8KICAgICBpZiAob3Blbl9vdXRwdXRfZmlsZShhcmd2WzJdLCBpbnB1dF9jb2RlY19jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfZm9ybWF0X2NvbnRleHQsICZvdXRwdXRfY29kZWNfY29udGV4dCkpCiAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAvKiogSW5pdGlhbGl6ZSB0aGUgcmVzYW1wbGVyIHRvIGJlIGFibGUgdG8gY29udmVydCBhdWRpbyBzYW1wbGUgZm9ybWF0cy4gKi8KKyAgICAvKiBJbml0aWFsaXplIHRoZSByZXNhbXBsZXIgdG8gYmUgYWJsZSB0byBjb252ZXJ0IGF1ZGlvIHNhbXBsZSBmb3JtYXRzLiAqLwogICAgIGlmIChpbml0X3Jlc2FtcGxlcihpbnB1dF9jb2RlY19jb250ZXh0LCBvdXRwdXRfY29kZWNfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgJnJlc2FtcGxlX2NvbnRleHQpKQogICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgLyoqIEluaXRpYWxpemUgdGhlIEZJRk8gYnVmZmVyIHRvIHN0b3JlIGF1ZGlvIHNhbXBsZXMgdG8gYmUgZW5jb2RlZC4gKi8KKyAgICAvKiBJbml0aWFsaXplIHRoZSBGSUZPIGJ1ZmZlciB0byBzdG9yZSBhdWRpbyBzYW1wbGVzIHRvIGJlIGVuY29kZWQuICovCiAgICAgaWYgKGluaXRfZmlmbygmZmlmbywgb3V0cHV0X2NvZGVjX2NvbnRleHQpKQogICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgLyoqIFdyaXRlIHRoZSBoZWFkZXIgb2YgdGhlIG91dHB1dCBmaWxlIGNvbnRhaW5lci4gKi8KKyAgICAvKiBXcml0ZSB0aGUgaGVhZGVyIG9mIHRoZSBvdXRwdXQgZmlsZSBjb250YWluZXIuICovCiAgICAgaWYgKHdyaXRlX291dHB1dF9maWxlX2hlYWRlcihvdXRwdXRfZm9ybWF0X2NvbnRleHQpKQogICAgICAgICBnb3RvIGNsZWFudXA7CiAKLSAgICAvKioKLSAgICAgKiBMb29wIGFzIGxvbmcgYXMgd2UgaGF2ZSBpbnB1dCBzYW1wbGVzIHRvIHJlYWQgb3Igb3V0cHV0IHNhbXBsZXMKLSAgICAgKiB0byB3cml0ZTsgYWJvcnQgYXMgc29vbiBhcyB3ZSBoYXZlIG5laXRoZXIuCi0gICAgICovCisgICAgLyogTG9vcCBhcyBsb25nIGFzIHdlIGhhdmUgaW5wdXQgc2FtcGxlcyB0byByZWFkIG9yIG91dHB1dCBzYW1wbGVzCisgICAgICogdG8gd3JpdGU7IGFib3J0IGFzIHNvb24gYXMgd2UgaGF2ZSBuZWl0aGVyLiAqLwogICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIC8qKiBVc2UgdGhlIGVuY29kZXIncyBkZXNpcmVkIGZyYW1lIHNpemUgZm9yIHByb2Nlc3NpbmcuICovCisgICAgICAgIC8qIFVzZSB0aGUgZW5jb2RlcidzIGRlc2lyZWQgZnJhbWUgc2l6ZSBmb3IgcHJvY2Vzc2luZy4gKi8KICAgICAgICAgY29uc3QgaW50IG91dHB1dF9mcmFtZV9zaXplID0gb3V0cHV0X2NvZGVjX2NvbnRleHQtPmZyYW1lX3NpemU7CiAgICAgICAgIGludCBmaW5pc2hlZCAgICAgICAgICAgICAgICA9IDA7CiAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIG9uZSBmcmFtZSB3b3J0aCBvZiBzYW1wbGVzIGluIHRoZSBGSUZPCisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZXJlIGlzIG9uZSBmcmFtZSB3b3J0aCBvZiBzYW1wbGVzIGluIHRoZSBGSUZPCiAgICAgICAgICAqIGJ1ZmZlciBzbyB0aGF0IHRoZSBlbmNvZGVyIGNhbiBkbyBpdHMgd29yay4KICAgICAgICAgICogU2luY2UgdGhlIGRlY29kZXIncyBhbmQgdGhlIGVuY29kZXIncyBmcmFtZSBzaXplIG1heSBkaWZmZXIsIHdlCiAgICAgICAgICAqIG5lZWQgdG8gRklGTyBidWZmZXIgdG8gc3RvcmUgYXMgbWFueSBmcmFtZXMgd29ydGggb2YgaW5wdXQgc2FtcGxlcwotICAgICAgICAgKiB0aGF0IHRoZXkgbWFrZSB1cCBhdCBsZWFzdCBvbmUgZnJhbWUgd29ydGggb2Ygb3V0cHV0IHNhbXBsZXMuCi0gICAgICAgICAqLworICAgICAgICAgKiB0aGF0IHRoZXkgbWFrZSB1cCBhdCBsZWFzdCBvbmUgZnJhbWUgd29ydGggb2Ygb3V0cHV0IHNhbXBsZXMuICovCiAgICAgICAgIHdoaWxlIChhdl9hdWRpb19maWZvX3NpemUoZmlmbykgPCBvdXRwdXRfZnJhbWVfc2l6ZSkgewotICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgKiBEZWNvZGUgb25lIGZyYW1lIHdvcnRoIG9mIGF1ZGlvIHNhbXBsZXMsIGNvbnZlcnQgaXQgdG8gdGhlCi0gICAgICAgICAgICAgKiBvdXRwdXQgc2FtcGxlIGZvcm1hdCBhbmQgcHV0IGl0IGludG8gdGhlIEZJRk8gYnVmZmVyLgotICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBEZWNvZGUgb25lIGZyYW1lIHdvcnRoIG9mIGF1ZGlvIHNhbXBsZXMsIGNvbnZlcnQgaXQgdG8gdGhlCisgICAgICAgICAgICAgKiBvdXRwdXQgc2FtcGxlIGZvcm1hdCBhbmQgcHV0IGl0IGludG8gdGhlIEZJRk8gYnVmZmVyLiAqLwogICAgICAgICAgICAgaWYgKHJlYWRfZGVjb2RlX2NvbnZlcnRfYW5kX3N0b3JlKGZpZm8sIGlucHV0X2Zvcm1hdF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2NvZGVjX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NvZGVjX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVfY29udGV4dCwgJmZpbmlzaGVkKSkKICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUsIHdlIGNvbnRpbnVlCi0gICAgICAgICAgICAgKiBlbmNvZGluZyB0aGUgcmVtYWluaW5nIGF1ZGlvIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBmaWxlLgotICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBJZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZSwgd2UgY29udGludWUKKyAgICAgICAgICAgICAqIGVuY29kaW5nIHRoZSByZW1haW5pbmcgYXVkaW8gc2FtcGxlcyB0byB0aGUgb3V0cHV0IGZpbGUuICovCiAgICAgICAgICAgICBpZiAoZmluaXNoZWQpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICAvKioKLSAgICAgICAgICogSWYgd2UgaGF2ZSBlbm91Z2ggc2FtcGxlcyBmb3IgdGhlIGVuY29kZXIsIHdlIGVuY29kZSB0aGVtLgorICAgICAgICAvKiBJZiB3ZSBoYXZlIGVub3VnaCBzYW1wbGVzIGZvciB0aGUgZW5jb2Rlciwgd2UgZW5jb2RlIHRoZW0uCiAgICAgICAgICAqIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUsIHdlIHBhc3MgdGhlIHJlbWFpbmluZyBzYW1wbGVzIHRvCi0gICAgICAgICAqIHRoZSBlbmNvZGVyLgotICAgICAgICAgKi8KKyAgICAgICAgICogdGhlIGVuY29kZXIuICovCiAgICAgICAgIHdoaWxlIChhdl9hdWRpb19maWZvX3NpemUoZmlmbykgPj0gb3V0cHV0X2ZyYW1lX3NpemUgfHwKICAgICAgICAgICAgICAgIChmaW5pc2hlZCAmJiBhdl9hdWRpb19maWZvX3NpemUoZmlmbykgPiAwKSkKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogVGFrZSBvbmUgZnJhbWUgd29ydGggb2YgYXVkaW8gc2FtcGxlcyBmcm9tIHRoZSBGSUZPIGJ1ZmZlciwKLSAgICAgICAgICAgICAqIGVuY29kZSBpdCBhbmQgd3JpdGUgaXQgdG8gdGhlIG91dHB1dCBmaWxlLgotICAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBUYWtlIG9uZSBmcmFtZSB3b3J0aCBvZiBhdWRpbyBzYW1wbGVzIGZyb20gdGhlIEZJRk8gYnVmZmVyLAorICAgICAgICAgICAgICogZW5jb2RlIGl0IGFuZCB3cml0ZSBpdCB0byB0aGUgb3V0cHV0IGZpbGUuICovCiAgICAgICAgICAgICBpZiAobG9hZF9lbmNvZGVfYW5kX3dyaXRlKGZpZm8sIG91dHB1dF9mb3JtYXRfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NvZGVjX2NvbnRleHQpKQogICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKIAotICAgICAgICAvKioKLSAgICAgICAgICogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUgYW5kIGhhdmUgZW5jb2RlZAotICAgICAgICAgKiBhbGwgcmVtYWluaW5nIHNhbXBsZXMsIHdlIGNhbiBleGl0IHRoaXMgbG9vcCBhbmQgZmluaXNoLgotICAgICAgICAgKi8KKyAgICAgICAgLyogSWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUgYW5kIGhhdmUgZW5jb2RlZAorICAgICAgICAgKiBhbGwgcmVtYWluaW5nIHNhbXBsZXMsIHdlIGNhbiBleGl0IHRoaXMgbG9vcCBhbmQgZmluaXNoLiAqLwogICAgICAgICBpZiAoZmluaXNoZWQpIHsKICAgICAgICAgICAgIGludCBkYXRhX3dyaXR0ZW47Ci0gICAgICAgICAgICAvKiogRmx1c2ggdGhlIGVuY29kZXIgYXMgaXQgbWF5IGhhdmUgZGVsYXllZCBmcmFtZXMuICovCisgICAgICAgICAgICAvKiBGbHVzaCB0aGUgZW5jb2RlciBhcyBpdCBtYXkgaGF2ZSBkZWxheWVkIGZyYW1lcy4gKi8KICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBkYXRhX3dyaXR0ZW4gPSAwOwogICAgICAgICAgICAgICAgIGlmIChlbmNvZGVfYXVkaW9fZnJhbWUoTlVMTCwgb3V0cHV0X2Zvcm1hdF9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NvZGVjX2NvbnRleHQsICZkYXRhX3dyaXR0ZW4pKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CkBAIC03NDYsNyArODYxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qKiBXcml0ZSB0aGUgdHJhaWxlciBvZiB0aGUgb3V0cHV0IGZpbGUgY29udGFpbmVyLiAqLworICAgIC8qIFdyaXRlIHRoZSB0cmFpbGVyIG9mIHRoZSBvdXRwdXQgZmlsZSBjb250YWluZXIuICovCiAgICAgaWYgKHdyaXRlX291dHB1dF9maWxlX3RyYWlsZXIob3V0cHV0X2Zvcm1hdF9jb250ZXh0KSkKICAgICAgICAgZ290byBjbGVhbnVwOwogICAgIHJldCA9IDA7CkBAIC03NTYsMTMgKzg3MSwxMyBAQAogICAgICAgICBhdl9hdWRpb19maWZvX2ZyZWUoZmlmbyk7CiAgICAgc3dyX2ZyZWUoJnJlc2FtcGxlX2NvbnRleHQpOwogICAgIGlmIChvdXRwdXRfY29kZWNfY29udGV4dCkKLSAgICAgICAgYXZjb2RlY19jbG9zZShvdXRwdXRfY29kZWNfY29udGV4dCk7CisgICAgICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZvdXRwdXRfY29kZWNfY29udGV4dCk7CiAgICAgaWYgKG91dHB1dF9mb3JtYXRfY29udGV4dCkgewogICAgICAgICBhdmlvX2Nsb3NlcCgmb3V0cHV0X2Zvcm1hdF9jb250ZXh0LT5wYik7CiAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChvdXRwdXRfZm9ybWF0X2NvbnRleHQpOwogICAgIH0KICAgICBpZiAoaW5wdXRfY29kZWNfY29udGV4dCkKLSAgICAgICAgYXZjb2RlY19jbG9zZShpbnB1dF9jb2RlY19jb250ZXh0KTsKKyAgICAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmlucHV0X2NvZGVjX2NvbnRleHQpOwogICAgIGlmIChpbnB1dF9mb3JtYXRfY29udGV4dCkKICAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmlucHV0X2Zvcm1hdF9jb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL3RyYW5zY29kaW5nLmMgYi9kb2MvZXhhbXBsZXMvdHJhbnNjb2RpbmcuYwppbmRleCBkNWQ0MTBiLi5lNDg4MzdjIDEwMDY0NAotLS0gYS9kb2MvZXhhbXBsZXMvdHJhbnNjb2RpbmcuYworKysgYi9kb2MvZXhhbXBsZXMvdHJhbnNjb2RpbmcuYwpAQCAtMzAsNyArMzAsNiBAQAogCiAjaW5jbHVkZSA8bGliYXZjb2RlYy9hdmNvZGVjLmg+CiAjaW5jbHVkZSA8bGliYXZmb3JtYXQvYXZmb3JtYXQuaD4KLSNpbmNsdWRlIDxsaWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmg+CiAjaW5jbHVkZSA8bGliYXZmaWx0ZXIvYnVmZmVyc2luay5oPgogI2luY2x1ZGUgPGxpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oPgogI2luY2x1ZGUgPGxpYmF2dXRpbC9vcHQuaD4KQEAgLTQ1LDYgKzQ0LDEyIEBACiB9IEZpbHRlcmluZ0NvbnRleHQ7CiBzdGF0aWMgRmlsdGVyaW5nQ29udGV4dCAqZmlsdGVyX2N0eDsKIAordHlwZWRlZiBzdHJ1Y3QgU3RyZWFtQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmRlY19jdHg7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuY19jdHg7Cit9IFN0cmVhbUNvbnRleHQ7CitzdGF0aWMgU3RyZWFtQ29udGV4dCAqc3RyZWFtX2N0eDsKKwogc3RhdGljIGludCBvcGVuX2lucHV0X2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAgICAgaW50IHJldDsKQEAgLTYxLDIyICs2Niw0MiBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAorICAgIHN0cmVhbV9jdHggPSBhdl9tYWxsb2N6X2FycmF5KGlmbXRfY3R4LT5uYl9zdHJlYW1zLCBzaXplb2YoKnN0cmVhbV9jdHgpKTsKKyAgICBpZiAoIXN0cmVhbV9jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgaWZtdF9jdHgtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBBVlN0cmVhbSAqc3RyZWFtOworICAgICAgICBBVlN0cmVhbSAqc3RyZWFtID0gaWZtdF9jdHgtPnN0cmVhbXNbaV07CisgICAgICAgIEFWQ29kZWMgKmRlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX2lkKTsKICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjX2N0eDsKLSAgICAgICAgc3RyZWFtID0gaWZtdF9jdHgtPnN0cmVhbXNbaV07Ci0gICAgICAgIGNvZGVjX2N0eCA9IHN0cmVhbS0+Y29kZWM7CisgICAgICAgIGlmICghZGVjKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmQgZGVjb2RlciBmb3Igc3RyZWFtICMldVxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9ERUNPREVSX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjb2RlY19jdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGRlYyk7CisgICAgICAgIGlmICghY29kZWNfY3R4KSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBkZWNvZGVyIGNvbnRleHQgZm9yIHN0cmVhbSAjJXVcbiIsIGkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChjb2RlY19jdHgsIHN0cmVhbS0+Y29kZWNwYXIpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjb3B5IGRlY29kZXIgcGFyYW1ldGVycyB0byBpbnB1dCBkZWNvZGVyIGNvbnRleHQgIgorICAgICAgICAgICAgICAgICAgICJmb3Igc3RyZWFtICMldVxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgICAgIC8qIFJlZW5jb2RlIHZpZGVvICYgYXVkaW8gYW5kIHJlbXV4IHN1YnRpdGxlcyBldGMuICovCiAgICAgICAgIGlmIChjb2RlY19jdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPCiAgICAgICAgICAgICAgICAgfHwgY29kZWNfY3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgaWYgKGNvZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICAgICAgY29kZWNfY3R4LT5mcmFtZXJhdGUgPSBhdl9ndWVzc19mcmFtZV9yYXRlKGlmbXRfY3R4LCBzdHJlYW0sIE5VTEwpOwogICAgICAgICAgICAgLyogT3BlbiBkZWNvZGVyICovCi0gICAgICAgICAgICByZXQgPSBhdmNvZGVjX29wZW4yKGNvZGVjX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19maW5kX2RlY29kZXIoY29kZWNfY3R4LT5jb2RlY19pZCksIE5VTEwpOworICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19vcGVuMihjb2RlY19jdHgsIGRlYywgTlVMTCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBkZWNvZGVyIGZvciBzdHJlYW0gIyV1XG4iLCBpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHN0cmVhbV9jdHhbaV0uZGVjX2N0eCA9IGNvZGVjX2N0eDsKICAgICB9CiAKICAgICBhdl9kdW1wX2Zvcm1hdChpZm10X2N0eCwgMCwgZmlsZW5hbWUsIDApOwpAQCAtMTA4LDggKzEzMyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpbl9zdHJlYW0gPSBpZm10X2N0eC0+c3RyZWFtc1tpXTsKLSAgICAgICAgZGVjX2N0eCA9IGluX3N0cmVhbS0+Y29kZWM7Ci0gICAgICAgIGVuY19jdHggPSBvdXRfc3RyZWFtLT5jb2RlYzsKKyAgICAgICAgZGVjX2N0eCA9IHN0cmVhbV9jdHhbaV0uZGVjX2N0eDsKIAogICAgICAgICBpZiAoZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8KICAgICAgICAgICAgICAgICB8fCBkZWNfY3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewpAQCAtMTE5LDYgKzE0MywxMSBAQAogICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJOZWNlc3NhcnkgZW5jb2RlciBub3QgZm91bmRcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5jX2N0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoZW5jb2Rlcik7CisgICAgICAgICAgICBpZiAoIWVuY19jdHgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBlbmNvZGVyIGNvbnRleHRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIEluIHRoaXMgZXhhbXBsZSwgd2UgdHJhbnNjb2RlIHRvIHNhbWUgcHJvcGVydGllcyAocGljdHVyZSBzaXplLAogICAgICAgICAgICAgICogc2FtcGxlIHJhdGUgZXRjLikuIFRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIGNoYW5nZWQgZm9yIG91dHB1dApAQCAtMTI4LDkgKzE1NywxMiBAQAogICAgICAgICAgICAgICAgIGVuY19jdHgtPndpZHRoID0gZGVjX2N0eC0+d2lkdGg7CiAgICAgICAgICAgICAgICAgZW5jX2N0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGRlY19jdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW87CiAgICAgICAgICAgICAgICAgLyogdGFrZSBmaXJzdCBmb3JtYXQgZnJvbSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzICovCi0gICAgICAgICAgICAgICAgZW5jX2N0eC0+cGl4X2ZtdCA9IGVuY29kZXItPnBpeF9mbXRzWzBdOworICAgICAgICAgICAgICAgIGlmIChlbmNvZGVyLT5waXhfZm10cykKKyAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+cGl4X2ZtdCA9IGVuY29kZXItPnBpeF9mbXRzWzBdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+cGl4X2ZtdCA9IGRlY19jdHgtPnBpeF9mbXQ7CiAgICAgICAgICAgICAgICAgLyogdmlkZW8gdGltZV9iYXNlIGNhbiBiZSBzZXQgdG8gd2hhdGV2ZXIgaXMgaGFuZHkgYW5kIHN1cHBvcnRlZCBieSBlbmNvZGVyICovCi0gICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gZGVjX2N0eC0+dGltZV9iYXNlOworICAgICAgICAgICAgICAgIGVuY19jdHgtPnRpbWVfYmFzZSA9IGF2X2ludl9xKGRlY19jdHgtPmZyYW1lcmF0ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVuY19jdHgtPnNhbXBsZV9yYXRlID0gZGVjX2N0eC0+c2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICAgZW5jX2N0eC0+Y2hhbm5lbF9sYXlvdXQgPSBkZWNfY3R4LT5jaGFubmVsX2xheW91dDsKQEAgLTE0MCwyOCArMTcyLDM2IEBACiAgICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gKEFWUmF0aW9uYWwpezEsIGVuY19jdHgtPnNhbXBsZV9yYXRlfTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG9mbXRfY3R4LT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX0dMT0JBTEhFQURFUikKKyAgICAgICAgICAgICAgICBlbmNfY3R4LT5mbGFncyB8PSBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVI7CisKICAgICAgICAgICAgIC8qIFRoaXJkIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBwYXNzIHNldHRpbmdzIHRvIGVuY29kZXIgKi8KICAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfb3BlbjIoZW5jX2N0eCwgZW5jb2RlciwgTlVMTCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW5ub3Qgb3BlbiB2aWRlbyBlbmNvZGVyIGZvciBzdHJlYW0gIyV1XG4iLCBpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2Zyb21fY29udGV4dChvdXRfc3RyZWFtLT5jb2RlY3BhciwgZW5jX2N0eCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY29weSBlbmNvZGVyIHBhcmFtZXRlcnMgdG8gb3V0cHV0IHN0cmVhbSAjJXVcbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dF9zdHJlYW0tPnRpbWVfYmFzZSA9IGVuY19jdHgtPnRpbWVfYmFzZTsKKyAgICAgICAgICAgIHN0cmVhbV9jdHhbaV0uZW5jX2N0eCA9IGVuY19jdHg7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVU5LTk9XTikgewogICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkVsZW1lbnRhcnkgc3RyZWFtICMlZCBpcyBvZiB1bmtub3duIHR5cGUsIGNhbm5vdCBwcm9jZWVkXG4iLCBpKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogaWYgdGhpcyBzdHJlYW0gbXVzdCBiZSByZW11eGVkICovCi0gICAgICAgICAgICByZXQgPSBhdmNvZGVjX2NvcHlfY29udGV4dChvZm10X2N0eC0+c3RyZWFtc1tpXS0+Y29kZWMsCi0gICAgICAgICAgICAgICAgICAgIGlmbXRfY3R4LT5zdHJlYW1zW2ldLT5jb2RlYyk7CisgICAgICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShvdXRfc3RyZWFtLT5jb2RlY3BhciwgaW5fc3RyZWFtLT5jb2RlY3Bhcik7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDb3B5aW5nIHN0cmVhbSBjb250ZXh0IGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvcHlpbmcgcGFyYW1ldGVycyBmb3Igc3RyZWFtICMldSBmYWlsZWRcbiIsIGkpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRfc3RyZWFtLT50aW1lX2Jhc2UgPSBpbl9zdHJlYW0tPnRpbWVfYmFzZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChvZm10X2N0eC0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9HTE9CQUxIRUFERVIpCi0gICAgICAgICAgICBlbmNfY3R4LT5mbGFncyB8PSBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVI7Ci0KICAgICB9CiAgICAgYXZfZHVtcF9mb3JtYXQob2ZtdF9jdHgsIDAsIGZpbGVuYW1lLCAxKTsKIApAQCAtMTg4LDggKzIyOCw4IEBACiB7CiAgICAgY2hhciBhcmdzWzUxMl07CiAgICAgaW50IHJldCA9IDA7Ci0gICAgQVZGaWx0ZXIgKmJ1ZmZlcnNyYyA9IE5VTEw7Ci0gICAgQVZGaWx0ZXIgKmJ1ZmZlcnNpbmsgPSBOVUxMOworICAgIGNvbnN0IEFWRmlsdGVyICpidWZmZXJzcmMgPSBOVUxMOworICAgIGNvbnN0IEFWRmlsdGVyICpidWZmZXJzaW5rID0gTlVMTDsKICAgICBBVkZpbHRlckNvbnRleHQgKmJ1ZmZlcnNyY19jdHggPSBOVUxMOwogICAgIEFWRmlsdGVyQ29udGV4dCAqYnVmZmVyc2lua19jdHggPSBOVUxMOwogICAgIEFWRmlsdGVySW5PdXQgKm91dHB1dHMgPSBhdmZpbHRlcl9pbm91dF9hbGxvYygpOwpAQCAtMzQ1LDE3ICszODUsMTcgQEAKICAgICAgICAgZmlsdGVyX2N0eFtpXS5idWZmZXJzcmNfY3R4ICA9IE5VTEw7CiAgICAgICAgIGZpbHRlcl9jdHhbaV0uYnVmZmVyc2lua19jdHggPSBOVUxMOwogICAgICAgICBmaWx0ZXJfY3R4W2ldLmZpbHRlcl9ncmFwaCAgID0gTlVMTDsKLSAgICAgICAgaWYgKCEoaWZtdF9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTwotICAgICAgICAgICAgICAgIHx8IGlmbXRfY3R4LT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pKQorICAgICAgICBpZiAoIShpZm10X2N0eC0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPCisgICAgICAgICAgICAgICAgfHwgaWZtdF9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykpCiAgICAgICAgICAgICBjb250aW51ZTsKIAogCi0gICAgICAgIGlmIChpZm10X2N0eC0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICBpZiAoaWZtdF9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKICAgICAgICAgICAgIGZpbHRlcl9zcGVjID0gIm51bGwiOyAvKiBwYXNzdGhyb3VnaCAoZHVtbXkpIGZpbHRlciBmb3IgdmlkZW8gKi8KICAgICAgICAgZWxzZQogICAgICAgICAgICAgZmlsdGVyX3NwZWMgPSAiYW51bGwiOyAvKiBwYXNzdGhyb3VnaCAoZHVtbXkpIGZpbHRlciBmb3IgYXVkaW8gKi8KLSAgICAgICAgcmV0ID0gaW5pdF9maWx0ZXIoJmZpbHRlcl9jdHhbaV0sIGlmbXRfY3R4LT5zdHJlYW1zW2ldLT5jb2RlYywKLSAgICAgICAgICAgICAgICBvZm10X2N0eC0+c3RyZWFtc1tpXS0+Y29kZWMsIGZpbHRlcl9zcGVjKTsKKyAgICAgICAgcmV0ID0gaW5pdF9maWx0ZXIoJmZpbHRlcl9jdHhbaV0sIHN0cmVhbV9jdHhbaV0uZGVjX2N0eCwKKyAgICAgICAgICAgICAgICBzdHJlYW1fY3R4W2ldLmVuY19jdHgsIGZpbHRlcl9zcGVjKTsKICAgICAgICAgaWYgKHJldCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMzY3LDcgKzQwNyw3IEBACiAgICAgaW50IGdvdF9mcmFtZV9sb2NhbDsKICAgICBBVlBhY2tldCBlbmNfcGt0OwogICAgIGludCAoKmVuY19mdW5jKShBVkNvZGVjQ29udGV4dCAqLCBBVlBhY2tldCAqLCBjb25zdCBBVkZyYW1lICosIGludCAqKSA9Ci0gICAgICAgIChpZm10X2N0eC0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZSA9PQorICAgICAgICAoaWZtdF9jdHgtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0KICAgICAgICAgIEFWTUVESUFfVFlQRV9WSURFTykgPyBhdmNvZGVjX2VuY29kZV92aWRlbzIgOiBhdmNvZGVjX2VuY29kZV9hdWRpbzI7CiAKICAgICBpZiAoIWdvdF9mcmFtZSkKQEAgLTM3OCw3ICs0MTgsNyBAQAogICAgIGVuY19wa3QuZGF0YSA9IE5VTEw7CiAgICAgZW5jX3BrdC5zaXplID0gMDsKICAgICBhdl9pbml0X3BhY2tldCgmZW5jX3BrdCk7Ci0gICAgcmV0ID0gZW5jX2Z1bmMob2ZtdF9jdHgtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMsICZlbmNfcGt0LAorICAgIHJldCA9IGVuY19mdW5jKHN0cmVhbV9jdHhbc3RyZWFtX2luZGV4XS5lbmNfY3R4LCAmZW5jX3BrdCwKICAgICAgICAgICAgIGZpbHRfZnJhbWUsIGdvdF9mcmFtZSk7CiAgICAgYXZfZnJhbWVfZnJlZSgmZmlsdF9mcmFtZSk7CiAgICAgaWYgKHJldCA8IDApCkBAIC0zODksNyArNDI5LDcgQEAKICAgICAvKiBwcmVwYXJlIHBhY2tldCBmb3IgbXV4aW5nICovCiAgICAgZW5jX3BrdC5zdHJlYW1faW5kZXggPSBzdHJlYW1faW5kZXg7CiAgICAgYXZfcGFja2V0X3Jlc2NhbGVfdHMoJmVuY19wa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgb2ZtdF9jdHgtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fY3R4W3N0cmVhbV9pbmRleF0uZW5jX2N0eC0+dGltZV9iYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9mbXRfY3R4LT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSk7CiAKICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiTXV4aW5nIGZyYW1lXG4iKTsKQEAgLTQ0Nyw3ICs0ODcsNyBAQAogICAgIGludCByZXQ7CiAgICAgaW50IGdvdF9mcmFtZTsKIAotICAgIGlmICghKG9mbXRfY3R4LT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYKKyAgICBpZiAoIShzdHJlYW1fY3R4W3N0cmVhbV9pbmRleF0uZW5jX2N0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmCiAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX0RFTEFZKSkKICAgICAgICAgcmV0dXJuIDA7CiAKQEAgLTQ3OCw5ICs1MTgsNiBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLSAgICBhdmZpbHRlcl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGlmICgocmV0ID0gb3Blbl9pbnB1dF9maWxlKGFyZ3ZbMV0pKSA8IDApCiAgICAgICAgIGdvdG8gZW5kOwogICAgIGlmICgocmV0ID0gb3Blbl9vdXRwdXRfZmlsZShhcmd2WzJdKSkgPCAwKQpAQCAtNDkzLDcgKzUzMCw3IEBACiAgICAgICAgIGlmICgocmV0ID0gYXZfcmVhZF9mcmFtZShpZm10X2N0eCwgJnBhY2tldCkpIDwgMCkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBzdHJlYW1faW5kZXggPSBwYWNrZXQuc3RyZWFtX2luZGV4OwotICAgICAgICB0eXBlID0gaWZtdF9jdHgtPnN0cmVhbXNbcGFja2V0LnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlOworICAgICAgICB0eXBlID0gaWZtdF9jdHgtPnN0cmVhbXNbcGFja2V0LnN0cmVhbV9pbmRleF0tPmNvZGVjcGFyLT5jb2RlY190eXBlOwogICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiRGVtdXhlciBnYXZlIGZyYW1lIG9mIHN0cmVhbV9pbmRleCAldVxuIiwKICAgICAgICAgICAgICAgICBzdHJlYW1faW5kZXgpOwogCkBAIC01MDYsMTAgKzU0MywxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZfcGFja2V0X3Jlc2NhbGVfdHMoJnBhY2tldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmbXRfY3R4LT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmbXRfY3R4LT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjLT50aW1lX2Jhc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2N0eFtzdHJlYW1faW5kZXhdLmRlY19jdHgtPnRpbWVfYmFzZSk7CiAgICAgICAgICAgICBkZWNfZnVuYyA9ICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgPyBhdmNvZGVjX2RlY29kZV92aWRlbzIgOgogICAgICAgICAgICAgICAgIGF2Y29kZWNfZGVjb2RlX2F1ZGlvNDsKLSAgICAgICAgICAgIHJldCA9IGRlY19mdW5jKGlmbXRfY3R4LT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjLCBmcmFtZSwKKyAgICAgICAgICAgIHJldCA9IGRlY19mdW5jKHN0cmVhbV9jdHhbc3RyZWFtX2luZGV4XS5kZWNfY3R4LCBmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgJmdvdF9mcmFtZSwgJnBhY2tldCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKQEAgLTUxOCw3ICs1NTUsNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZ290X2ZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPnB0cyA9IGF2X2ZyYW1lX2dldF9iZXN0X2VmZm9ydF90aW1lc3RhbXAoZnJhbWUpOworICAgICAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBmcmFtZS0+YmVzdF9lZmZvcnRfdGltZXN0YW1wOwogICAgICAgICAgICAgICAgIHJldCA9IGZpbHRlcl9lbmNvZGVfd3JpdGVfZnJhbWUoZnJhbWUsIHN0cmVhbV9pbmRleCk7CiAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwogICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtNTYzLDEzICs2MDAsMTQgQEAKICAgICBhdl9wYWNrZXRfdW5yZWYoJnBhY2tldCk7CiAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwogICAgIGZvciAoaSA9IDA7IGkgPCBpZm10X2N0eC0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIGF2Y29kZWNfY2xvc2UoaWZtdF9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjKTsKLSAgICAgICAgaWYgKG9mbXRfY3R4ICYmIG9mbXRfY3R4LT5uYl9zdHJlYW1zID4gaSAmJiBvZm10X2N0eC0+c3RyZWFtc1tpXSAmJiBvZm10X2N0eC0+c3RyZWFtc1tpXS0+Y29kZWMpCi0gICAgICAgICAgICBhdmNvZGVjX2Nsb3NlKG9mbXRfY3R4LT5zdHJlYW1zW2ldLT5jb2RlYyk7CisgICAgICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZzdHJlYW1fY3R4W2ldLmRlY19jdHgpOworICAgICAgICBpZiAob2ZtdF9jdHggJiYgb2ZtdF9jdHgtPm5iX3N0cmVhbXMgPiBpICYmIG9mbXRfY3R4LT5zdHJlYW1zW2ldICYmIHN0cmVhbV9jdHhbaV0uZW5jX2N0eCkKKyAgICAgICAgICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZzdHJlYW1fY3R4W2ldLmVuY19jdHgpOwogICAgICAgICBpZiAoZmlsdGVyX2N0eCAmJiBmaWx0ZXJfY3R4W2ldLmZpbHRlcl9ncmFwaCkKICAgICAgICAgICAgIGF2ZmlsdGVyX2dyYXBoX2ZyZWUoJmZpbHRlcl9jdHhbaV0uZmlsdGVyX2dyYXBoKTsKICAgICB9CiAgICAgYXZfZnJlZShmaWx0ZXJfY3R4KTsKKyAgICBhdl9mcmVlKHN0cmVhbV9jdHgpOwogICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZpZm10X2N0eCk7CiAgICAgaWYgKG9mbXRfY3R4ICYmICEob2ZtdF9jdHgtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSkKICAgICAgICAgYXZpb19jbG9zZXAoJm9mbXRfY3R4LT5wYik7CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdmFhcGlfZW5jb2RlLmMgYi9kb2MvZXhhbXBsZXMvdmFhcGlfZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkYzYyYgotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy92YWFwaV9lbmNvZGUuYwpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIFZpZGVvIEFjY2VsZXJhdGlvbiBBUEkgKHZpZGVvIGVuY29kaW5nKSBlbmNvZGUgc2FtcGxlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEludGVsIFZBQVBJLWFjY2VsZXJhdGVkIGVuY29kaW5nIGV4YW1wbGUuCisgKgorICogQGV4YW1wbGUgdmFhcGlfZW5jb2RlLmMKKyAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gZG8gVkFBUEktYWNjZWxlcmF0ZWQgZW5jb2RpbmcuIG5vdyBvbmx5IHN1cHBvcnQgTlYxMgorICogcmF3IGZpbGUsIHVzYWdlIGxpa2U6IHZhYXBpX2VuY29kZSAxOTIwIDEwODAgaW5wdXQueXV2IG91dHB1dC5oMjY0CisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxsaWJhdmNvZGVjL2F2Y29kZWMuaD4KKyNpbmNsdWRlIDxsaWJhdnV0aWwvcGl4ZGVzYy5oPgorI2luY2x1ZGUgPGxpYmF2dXRpbC9od2NvbnRleHQuaD4KKworc3RhdGljIGludCB3aWR0aCwgaGVpZ2h0Oworc3RhdGljIEFWQnVmZmVyUmVmICpod19kZXZpY2VfY3R4ID0gTlVMTDsKKworc3RhdGljIGludCBzZXRfaHdmcmFtZV9jdHgoQVZDb2RlY0NvbnRleHQgKmN0eCwgQVZCdWZmZXJSZWYgKmh3X2RldmljZV9jdHgpCit7CisgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19yZWY7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggPSBOVUxMOworICAgIGludCBlcnIgPSAwOworCisgICAgaWYgKCEoaHdfZnJhbWVzX3JlZiA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGh3X2RldmljZV9jdHgpKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjcmVhdGUgVkFBUEkgZnJhbWUgY29udGV4dC5cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQgKikoaHdfZnJhbWVzX3JlZi0+ZGF0YSk7CisgICAgZnJhbWVzX2N0eC0+Zm9ybWF0ICAgID0gQVZfUElYX0ZNVF9WQUFQSTsKKyAgICBmcmFtZXNfY3R4LT5zd19mb3JtYXQgPSBBVl9QSVhfRk1UX05WMTI7CisgICAgZnJhbWVzX2N0eC0+d2lkdGggICAgID0gd2lkdGg7CisgICAgZnJhbWVzX2N0eC0+aGVpZ2h0ICAgID0gaGVpZ2h0OworICAgIGZyYW1lc19jdHgtPmluaXRpYWxfcG9vbF9zaXplID0gMjA7CisgICAgaWYgKChlcnIgPSBhdl9od2ZyYW1lX2N0eF9pbml0KGh3X2ZyYW1lc19yZWYpKSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBWQUFQSSBmcmFtZSBjb250ZXh0LiIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZTogJXNcbiIsYXZfZXJyMnN0cihlcnIpKTsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZod19mcmFtZXNfcmVmKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgY3R4LT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihod19mcmFtZXNfcmVmKTsKKyAgICBpZiAoIWN0eC0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZod19mcmFtZXNfcmVmKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVuY29kZV93cml0ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBGSUxFICpmb3V0KQoreworICAgIGludCByZXQgPSAwOworICAgIEFWUGFja2V0IGVuY19wa3Q7CisKKyAgICBhdl9pbml0X3BhY2tldCgmZW5jX3BrdCk7CisgICAgZW5jX3BrdC5kYXRhID0gTlVMTDsKKyAgICBlbmNfcGt0LnNpemUgPSAwOworCisgICAgaWYgKChyZXQgPSBhdmNvZGVjX3NlbmRfZnJhbWUoYXZjdHgsIGZyYW1lKSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgY29kZTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICB3aGlsZSAoMSkgeworICAgICAgICByZXQgPSBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KGF2Y3R4LCAmZW5jX3BrdCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBlbmNfcGt0LnN0cmVhbV9pbmRleCA9IDA7CisgICAgICAgIHJldCA9IGZ3cml0ZShlbmNfcGt0LmRhdGEsIGVuY19wa3Quc2l6ZSwgMSwgZm91dCk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmZW5jX3BrdCk7CisgICAgfQorCitlbmQ6CisgICAgcmV0ID0gKChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSA/IDAgOiAtMSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgc2l6ZSwgZXJyOworICAgIEZJTEUgKmZpbiA9IE5VTEwsICpmb3V0ID0gTlVMTDsKKyAgICBBVkZyYW1lICpzd19mcmFtZSA9IE5VTEwsICpod19mcmFtZSA9IE5VTEw7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gTlVMTDsKKyAgICBBVkNvZGVjICpjb2RlYyA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqZW5jX25hbWUgPSAiaDI2NF92YWFwaSI7CisKKyAgICBpZiAoYXJnYyA8IDUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgPHdpZHRoPiA8aGVpZ2h0PiA8aW5wdXQgZmlsZT4gPG91dHB1dCBmaWxlPlxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICB3aWR0aCAgPSBhdG9pKGFyZ3ZbMV0pOworICAgIGhlaWdodCA9IGF0b2koYXJndlsyXSk7CisgICAgc2l6ZSAgID0gd2lkdGggKiBoZWlnaHQ7CisKKyAgICBpZiAoIShmaW4gPSBmb3Blbihhcmd2WzNdLCAiciIpKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWwgdG8gb3BlbiBpbnB1dCBmaWxlIDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEoZm91dCA9IGZvcGVuKGFyZ3ZbNF0sICJ3K2IiKSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsIHRvIG9wZW4gb3V0cHV0IGZpbGUgOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXJyID0gLTE7CisgICAgICAgIGdvdG8gY2xvc2U7CisgICAgfQorCisgICAgZXJyID0gYXZfaHdkZXZpY2VfY3R4X2NyZWF0ZSgmaHdfZGV2aWNlX2N0eCwgQVZfSFdERVZJQ0VfVFlQRV9WQUFQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDApOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNyZWF0ZSBhIFZBQVBJIGRldmljZS4gRXJyb3IgY29kZTogJXNcbiIsIGF2X2VycjJzdHIoZXJyKSk7CisgICAgICAgIGdvdG8gY2xvc2U7CisgICAgfQorCisgICAgaWYgKCEoY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2Rlcl9ieV9uYW1lKGVuY19uYW1lKSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgZmluZCBlbmNvZGVyLlxuIik7CisgICAgICAgIGVyciA9IC0xOworICAgICAgICBnb3RvIGNsb3NlOworICAgIH0KKworICAgIGlmICghKGF2Y3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYykpKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBjbG9zZTsKKyAgICB9CisKKyAgICBhdmN0eC0+d2lkdGggICAgID0gd2lkdGg7CisgICAgYXZjdHgtPmhlaWdodCAgICA9IGhlaWdodDsKKyAgICBhdmN0eC0+dGltZV9iYXNlID0gKEFWUmF0aW9uYWwpezEsIDI1fTsKKyAgICBhdmN0eC0+ZnJhbWVyYXRlID0gKEFWUmF0aW9uYWwpezI1LCAxfTsKKyAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLCAxfTsKKyAgICBhdmN0eC0+cGl4X2ZtdCAgID0gQVZfUElYX0ZNVF9WQUFQSTsKKworICAgIC8qIHNldCBod19mcmFtZXNfY3R4IGZvciBlbmNvZGVyJ3MgQVZDb2RlY0NvbnRleHQgKi8KKyAgICBpZiAoKGVyciA9IHNldF9od2ZyYW1lX2N0eChhdmN0eCwgaHdfZGV2aWNlX2N0eCkpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzZXQgaHdmcmFtZSBjb250ZXh0LlxuIik7CisgICAgICAgIGdvdG8gY2xvc2U7CisgICAgfQorCisgICAgaWYgKChlcnIgPSBhdmNvZGVjX29wZW4yKGF2Y3R4LCBjb2RlYywgTlVMTCkpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIHZpZGVvIGVuY29kZXIgY29kZWMuIEVycm9yIGNvZGU6ICVzXG4iLCBhdl9lcnIyc3RyKGVycikpOworICAgICAgICBnb3RvIGNsb3NlOworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKHN3X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gY2xvc2U7CisgICAgICAgIH0KKyAgICAgICAgLyogcmVhZCBkYXRhIGludG8gc29mdHdhcmUgZnJhbWUsIGFuZCB0cmFuc2ZlciB0aGVtIGludG8gaHcgZnJhbWUgKi8KKyAgICAgICAgc3dfZnJhbWUtPndpZHRoICA9IHdpZHRoOworICAgICAgICBzd19mcmFtZS0+aGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBzd19mcmFtZS0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9OVjEyOworICAgICAgICBpZiAoKGVyciA9IGF2X2ZyYW1lX2dldF9idWZmZXIoc3dfZnJhbWUsIDMyKSkgPCAwKQorICAgICAgICAgICAgZ290byBjbG9zZTsKKyAgICAgICAgaWYgKChlcnIgPSBmcmVhZCgodWludDhfdCopKHN3X2ZyYW1lLT5kYXRhWzBdKSwgc2l6ZSwgMSwgZmluKSkgPD0gMCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoKGVyciA9IGZyZWFkKCh1aW50OF90Kikoc3dfZnJhbWUtPmRhdGFbMV0pLCBzaXplLzIsIDEsIGZpbikpIDw9IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIShod19mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKSB7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGNsb3NlOworICAgICAgICB9CisgICAgICAgIGlmICgoZXJyID0gYXZfaHdmcmFtZV9nZXRfYnVmZmVyKGF2Y3R4LT5od19mcmFtZXNfY3R4LCBod19mcmFtZSwgMCkpIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBjb2RlOiAlcy5cbiIsIGF2X2VycjJzdHIoZXJyKSk7CisgICAgICAgICAgICBnb3RvIGNsb3NlOworICAgICAgICB9CisgICAgICAgIGlmICghaHdfZnJhbWUtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gY2xvc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChlcnIgPSBhdl9od2ZyYW1lX3RyYW5zZmVyX2RhdGEoaHdfZnJhbWUsIHN3X2ZyYW1lLCAwKSkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIHRyYW5zZmVycmluZyBmcmFtZSBkYXRhIHRvIHN1cmZhY2UuIgorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29kZTogJXMuXG4iLCBhdl9lcnIyc3RyKGVycikpOworICAgICAgICAgICAgZ290byBjbG9zZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZXJyID0gKGVuY29kZV93cml0ZShhdmN0eCwgaHdfZnJhbWUsIGZvdXQpKSkgPCAwKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBlbmNvZGUuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gY2xvc2U7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaHdfZnJhbWUpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzd19mcmFtZSk7CisgICAgfQorCisgICAgLyogZmx1c2ggZW5jb2RlciAqLworICAgIGVyciA9IGVuY29kZV93cml0ZShhdmN0eCwgTlVMTCwgZm91dCk7CisgICAgaWYgKGVyciA9PSBBVkVSUk9SX0VPRikKKyAgICAgICAgZXJyID0gMDsKKworY2xvc2U6CisgICAgaWYgKGZpbikKKyAgICAgICAgZmNsb3NlKGZpbik7CisgICAgaWYgKGZvdXQpCisgICAgICAgIGZjbG9zZShmb3V0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzd19mcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmaHdfZnJhbWUpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdmN0eCk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZod19kZXZpY2VfY3R4KTsKKworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9kb2MvZXhhbXBsZXMvdmFhcGlfdHJhbnNjb2RlLmMgYi9kb2MvZXhhbXBsZXMvdmFhcGlfdHJhbnNjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0NTVjMAotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9leGFtcGxlcy92YWFwaV90cmFuc2NvZGUuYwpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIFZpZGVvIEFjY2VsZXJhdGlvbiBBUEkgKHZpZGVvIHRyYW5zY29kaW5nKSB0cmFuc2NvZGUgc2FtcGxlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEludGVsIFZBQVBJLWFjY2VsZXJhdGVkIHRyYW5zY29kaW5nIGV4YW1wbGUuCisgKgorICogQGV4YW1wbGUgdmFhcGlfdHJhbnNjb2RlLmMKKyAqIFRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gZG8gVkFBUEktYWNjZWxlcmF0ZWQgdHJhbnNjb2RpbmcuCisgKiBVc2FnZTogdmFhcGlfdHJhbnNjb2RlIGlucHV0X3N0cmVhbSBjb2RlYyBvdXRwdXRfc3RyZWFtCisgKiBlLmc6IC0gdmFhcGlfdHJhbnNjb2RlIGlucHV0Lm1wNCBoMjY0X3ZhYXBpIG91dHB1dF9oMjY0Lm1wNAorICogICAgICAtIHZhYXBpX3RyYW5zY29kZSBpbnB1dC5tcDQgdnA5X3ZhYXBpIG91dHB1dF92cDkuaXZmCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGxpYmF2dXRpbC9od2NvbnRleHQuaD4KKyNpbmNsdWRlIDxsaWJhdmNvZGVjL2F2Y29kZWMuaD4KKyNpbmNsdWRlIDxsaWJhdmZvcm1hdC9hdmZvcm1hdC5oPgorCitzdGF0aWMgQVZGb3JtYXRDb250ZXh0ICppZm10X2N0eCA9IE5VTEwsICpvZm10X2N0eCA9IE5VTEw7CitzdGF0aWMgQVZCdWZmZXJSZWYgKmh3X2RldmljZV9jdHggPSBOVUxMOworc3RhdGljIEFWQ29kZWNDb250ZXh0ICpkZWNvZGVyX2N0eCA9IE5VTEwsICplbmNvZGVyX2N0eCA9IE5VTEw7CitzdGF0aWMgaW50IHZpZGVvX3N0cmVhbSA9IC0xOworc3RhdGljIEFWU3RyZWFtICpvc3Q7CitzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKworc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBnZXRfdmFhcGlfZm9ybWF0KEFWQ29kZWNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10cykKK3sKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnA7CisKKyAgICBmb3IgKHAgPSBwaXhfZm10czsgKnAgIT0gQVZfUElYX0ZNVF9OT05FOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09IEFWX1BJWF9GTVRfVkFBUEkpCisgICAgICAgICAgICByZXR1cm4gKnA7CisgICAgfQorCisgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZGVjb2RlIHRoaXMgZmlsZSB1c2luZyBWQS1BUEkuXG4iKTsKKyAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOworfQorCitzdGF0aWMgaW50IG9wZW5faW5wdXRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBpbnQgcmV0OworICAgIEFWQ29kZWMgKmRlY29kZXIgPSBOVUxMOworICAgIEFWU3RyZWFtICp2aWRlbyA9IE5VTEw7CisKKyAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmlmbXRfY3R4LCBmaWxlbmFtZSwgTlVMTCwgTlVMTCkpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJyVzJywgRXJyb3IgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGlmbXRfY3R4LCBOVUxMKSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IGZpbmQgaW5wdXQgc3RyZWFtIGluZm9ybWF0aW9uLiBFcnJvciBjb2RlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IGF2X2ZpbmRfYmVzdF9zdHJlYW0oaWZtdF9jdHgsIEFWTUVESUFfVFlQRV9WSURFTywgLTEsIC0xLCAmZGVjb2RlciwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgZmluZCBhIHZpZGVvIHN0cmVhbSBpbiB0aGUgaW5wdXQgZmlsZS4gIgorICAgICAgICAgICAgICAgICJFcnJvciBjb2RlOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgdmlkZW9fc3RyZWFtID0gcmV0OworCisgICAgaWYgKCEoZGVjb2Rlcl9jdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGRlY29kZXIpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHZpZGVvID0gaWZtdF9jdHgtPnN0cmVhbXNbdmlkZW9fc3RyZWFtXTsKKyAgICBpZiAoKHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc190b19jb250ZXh0KGRlY29kZXJfY3R4LCB2aWRlby0+Y29kZWNwYXIpKSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dCBlcnJvci4gRXJyb3IgY29kZTogJXNcbiIsCisgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBkZWNvZGVyX2N0eC0+aHdfZGV2aWNlX2N0eCA9IGF2X2J1ZmZlcl9yZWYoaHdfZGV2aWNlX2N0eCk7CisgICAgaWYgKCFkZWNvZGVyX2N0eC0+aHdfZGV2aWNlX2N0eCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkEgaGFyZHdhcmUgZGV2aWNlIHJlZmVyZW5jZSBjcmVhdGUgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGRlY29kZXJfY3R4LT5nZXRfZm9ybWF0ICAgID0gZ2V0X3ZhYXBpX2Zvcm1hdDsKKworICAgIGlmICgocmV0ID0gYXZjb2RlY19vcGVuMihkZWNvZGVyX2N0eCwgZGVjb2RlciwgTlVMTCkpIDwgMCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiBjb2RlYyBmb3IgZGVjb2RpbmcuIEVycm9yIGNvZGU6ICVzXG4iLAorICAgICAgICAgICAgICAgIGF2X2VycjJzdHIocmV0KSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVuY29kZV93cml0ZShBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBBVlBhY2tldCBlbmNfcGt0OworCisgICAgYXZfaW5pdF9wYWNrZXQoJmVuY19wa3QpOworICAgIGVuY19wa3QuZGF0YSA9IE5VTEw7CisgICAgZW5jX3BrdC5zaXplID0gMDsKKworICAgIGlmICgocmV0ID0gYXZjb2RlY19zZW5kX2ZyYW1lKGVuY29kZXJfY3R4LCBmcmFtZSkpIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGR1cmluZyBlbmNvZGluZy4gRXJyb3IgY29kZTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICB3aGlsZSAoMSkgeworICAgICAgICByZXQgPSBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KGVuY29kZXJfY3R4LCAmZW5jX3BrdCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBlbmNfcGt0LnN0cmVhbV9pbmRleCA9IDA7CisgICAgICAgIGF2X3BhY2tldF9yZXNjYWxlX3RzKCZlbmNfcGt0LCBpZm10X2N0eC0+c3RyZWFtc1t2aWRlb19zdHJlYW1dLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mbXRfY3R4LT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UpOworICAgICAgICByZXQgPSBhdl9pbnRlcmxlYXZlZF93cml0ZV9mcmFtZShvZm10X2N0eCwgJmVuY19wa3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgd3JpdGluZyBkYXRhIHRvIG91dHB1dCBmaWxlLiAiCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworZW5kOgorICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgIHJldHVybiAwOworICAgIHJldCA9ICgocmV0ID09IEFWRVJST1IoRUFHQUlOKSkgPyAwOi0xKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRlY19lbmMoQVZQYWNrZXQgKnBrdCwgQVZDb2RlYyAqZW5jX2NvZGVjKQoreworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludCByZXQgPSAwOworCisgICAgcmV0ID0gYXZjb2RlY19zZW5kX3BhY2tldChkZWNvZGVyX2N0eCwgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGR1cmluZyBkZWNvZGluZy4gRXJyb3IgY29kZTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgd2hpbGUgKHJldCA+PSAwKSB7CisgICAgICAgIGlmICghKGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9mcmFtZShkZWNvZGVyX2N0eCwgZnJhbWUpOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgZGVjb2RpbmcuIEVycm9yIGNvZGU6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFpbml0aWFsaXplZCkgeworICAgICAgICAgICAgLyogd2UgbmVlZCB0byByZWYgaHdfZnJhbWVzX2N0eCBvZiBkZWNvZGVyIHRvIGluaXRpYWxpemUgZW5jb2RlcidzIGNvZGVjLgorICAgICAgICAgICAgICAgT25seSBhZnRlciB3ZSBnZXQgYSBkZWNvZGVkIGZyYW1lLCBjYW4gd2Ugb2J0YWluIGl0cyBod19mcmFtZXNfY3R4ICovCisgICAgICAgICAgICBlbmNvZGVyX2N0eC0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoZGVjb2Rlcl9jdHgtPmh3X2ZyYW1lc19jdHgpOworICAgICAgICAgICAgaWYgKCFlbmNvZGVyX2N0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBzZXQgQVZDb2RlY0NvbnRleHQgUGFyYW1ldGVycyBmb3IgZW5jb2RlciwgaGVyZSB3ZSBrZWVwIHRoZW0gc3RheQorICAgICAgICAgICAgICogdGhlIHNhbWUgYXMgZGVjb2Rlci4KKyAgICAgICAgICAgICAqIHh4eDogbm93IHRoZSBzYW1wbGUgY2FuJ3QgaGFuZGxlIHJlc29sdXRpb24gY2hhbmdlIGNhc2UuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGVuY29kZXJfY3R4LT50aW1lX2Jhc2UgPSBhdl9pbnZfcShkZWNvZGVyX2N0eC0+ZnJhbWVyYXRlKTsKKyAgICAgICAgICAgIGVuY29kZXJfY3R4LT5waXhfZm10ICAgPSBBVl9QSVhfRk1UX1ZBQVBJOworICAgICAgICAgICAgZW5jb2Rlcl9jdHgtPndpZHRoICAgICA9IGRlY29kZXJfY3R4LT53aWR0aDsKKyAgICAgICAgICAgIGVuY29kZXJfY3R4LT5oZWlnaHQgICAgPSBkZWNvZGVyX2N0eC0+aGVpZ2h0OworCisgICAgICAgICAgICBpZiAoKHJldCA9IGF2Y29kZWNfb3BlbjIoZW5jb2Rlcl9jdHgsIGVuY19jb2RlYywgTlVMTCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gZW5jb2RlIGNvZGVjLiBFcnJvciBjb2RlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIShvc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKG9mbXRfY3R4LCBlbmNfY29kZWMpKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHN0cmVhbSBmb3Igb3V0cHV0IGZvcm1hdC5cbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9zdC0+dGltZV9iYXNlID0gZW5jb2Rlcl9jdHgtPnRpbWVfYmFzZTsKKyAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQob3N0LT5jb2RlY3BhciwgZW5jb2Rlcl9jdHgpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb3B5IHRoZSBzdHJlYW0gcGFyYW1ldGVycy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvZGU6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogd3JpdGUgdGhlIHN0cmVhbSBoZWFkZXIgKi8KKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKG9mbXRfY3R4LCBOVUxMKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSB3cml0aW5nIHN0cmVhbSBoZWFkZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBjb2RlOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gZW5jb2RlX3dyaXRlKGZyYW1lKSkgPCAwKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgZW5jb2RpbmcgYW5kIHdyaXRpbmcuXG4iKTsKKworZmFpbDoKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgQVZQYWNrZXQgZGVjX3BrdDsKKyAgICBBVkNvZGVjICplbmNfY29kZWM7CisKKyAgICBpZiAoYXJnYyAhPSA0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxpbnB1dCBmaWxlPiA8ZW5jb2RlIGNvZGVjPiA8b3V0cHV0IGZpbGU+XG4iCisgICAgICAgICAgICAgICAgIlRoZSBvdXRwdXQgZm9ybWF0IGlzIGd1ZXNzZWQgYWNjb3JkaW5nIHRvIHRoZSBmaWxlIGV4dGVuc2lvbi5cbiIKKyAgICAgICAgICAgICAgICAiXG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldCA9IGF2X2h3ZGV2aWNlX2N0eF9jcmVhdGUoJmh3X2RldmljZV9jdHgsIEFWX0hXREVWSUNFX1RZUEVfVkFBUEksIE5VTEwsIE5VTEwsIDApOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGNyZWF0ZSBhIFZBQVBJIGRldmljZS4gRXJyb3IgY29kZTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IG9wZW5faW5wdXRfZmlsZShhcmd2WzFdKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIGlmICghKGVuY19jb2RlYyA9IGF2Y29kZWNfZmluZF9lbmNvZGVyX2J5X25hbWUoYXJndlsyXSkpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGZpbmQgZW5jb2RlciAnJXMnXG4iLCBhcmd2WzJdKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmICgocmV0ID0gKGF2Zm9ybWF0X2FsbG9jX291dHB1dF9jb250ZXh0Migmb2ZtdF9jdHgsIE5VTEwsIE5VTEwsIGFyZ3ZbM10pKSkgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGRlZHVjZSBvdXRwdXQgZm9ybWF0IGZyb20gZmlsZSBleHRlbnNpb24uIEVycm9yIGNvZGU6ICIKKyAgICAgICAgICAgICAgICAiJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGlmICghKGVuY29kZXJfY3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhlbmNfY29kZWMpKSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHJldCA9IGF2aW9fb3Blbigmb2ZtdF9jdHgtPnBiLCBhcmd2WzNdLCBBVklPX0ZMQUdfV1JJVEUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUuICIKKyAgICAgICAgICAgICAgICAiRXJyb3IgY29kZTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8qIHJlYWQgYWxsIHBhY2tldHMgYW5kIG9ubHkgdHJhbnNjb2RpbmcgdmlkZW8gKi8KKyAgICB3aGlsZSAocmV0ID49IDApIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9yZWFkX2ZyYW1lKGlmbXRfY3R4LCAmZGVjX3BrdCkpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmICh2aWRlb19zdHJlYW0gPT0gZGVjX3BrdC5zdHJlYW1faW5kZXgpCisgICAgICAgICAgICByZXQgPSBkZWNfZW5jKCZkZWNfcGt0LCBlbmNfY29kZWMpOworCisgICAgICAgIGF2X3BhY2tldF91bnJlZigmZGVjX3BrdCk7CisgICAgfQorCisgICAgLyogZmx1c2ggZGVjb2RlciAqLworICAgIGRlY19wa3QuZGF0YSA9IE5VTEw7CisgICAgZGVjX3BrdC5zaXplID0gMDsKKyAgICByZXQgPSBkZWNfZW5jKCZkZWNfcGt0LCBlbmNfY29kZWMpOworICAgIGF2X3BhY2tldF91bnJlZigmZGVjX3BrdCk7CisKKyAgICAvKiBmbHVzaCBlbmNvZGVyICovCisgICAgcmV0ID0gZW5jb2RlX3dyaXRlKE5VTEwpOworCisgICAgLyogd3JpdGUgdGhlIHRyYWlsZXIgZm9yIG91dHB1dCBzdHJlYW0gKi8KKyAgICBhdl93cml0ZV90cmFpbGVyKG9mbXRfY3R4KTsKKworZW5kOgorICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZpZm10X2N0eCk7CisgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJm9mbXRfY3R4KTsKKyAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmZGVjb2Rlcl9jdHgpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZlbmNvZGVyX2N0eCk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZod19kZXZpY2VfY3R4KTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZG9jL2ZhcS50ZXhpIGIvZG9jL2ZhcS50ZXhpCmluZGV4IGVmMTExYzcuLjczNjI0YzYgMTAwNjQ0Ci0tLSBhL2RvYy9mYXEudGV4aQorKysgYi9kb2MvZmFxLnRleGkKQEAgLTMxMSwxOCArMzExLDE4IEBACiBGb3IgYXVkaW8sIHRvIHB1dCBhbGwgY2hhbm5lbHMgdG9nZXRoZXIgaW4gYSBzaW5nbGUgc3RyZWFtIChleGFtcGxlOiB0d28KIG1vbm8gc3RyZWFtcyBpbnRvIG9uZSBzdGVyZW8gc3RyZWFtKTogdGhpcyBpcyBzb21ldGltZXMgY2FsbGVkIHRvCiBAZW1waHttZXJnZX0gdGhlbSwgYW5kIGNhbiBiZSBkb25lIHVzaW5nIHRoZQotQHVybHtodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLWZpbHRlcnMuaHRtbCNhbWVyZ2UsIEBjb2Rle2FtZXJnZX19IGZpbHRlci4KK0B1cmx7ZmZtcGVnLWZpbHRlcnMuaHRtbCNhbWVyZ2UsIEBjb2Rle2FtZXJnZX19IGZpbHRlci4KIAogQGl0ZW0KIEZvciBhdWRpbywgdG8gcGxheSBvbmUgb24gdG9wIG9mIHRoZSBvdGhlcjogdGhpcyBpcyBjYWxsZWQgdG8gQGVtcGh7bWl4fQogdGhlbSwgYW5kIGNhbiBiZSBkb25lIGJ5IGZpcnN0IG1lcmdpbmcgdGhlbSBpbnRvIGEgc2luZ2xlIHN0cmVhbSBhbmQgdGhlbgotdXNpbmcgdGhlIEB1cmx7aHR0cHM6Ly9mZm1wZWcub3JnL2ZmbXBlZy1maWx0ZXJzLmh0bWwjcGFuLCBAY29kZXtwYW59fSBmaWx0ZXIgdG8gbWl4Cit1c2luZyB0aGUgQHVybHtmZm1wZWctZmlsdGVycy5odG1sI3BhbiwgQGNvZGV7cGFufX0gZmlsdGVyIHRvIG1peAogdGhlIGNoYW5uZWxzIGF0IHdpbGwuCiAKIEBpdGVtCiBGb3IgdmlkZW8sIHRvIGRpc3BsYXkgYm90aCB0b2dldGhlciwgc2lkZSBieSBzaWRlIG9yIG9uZSBvbiB0b3Agb2YgYSBwYXJ0IG9mCiB0aGUgb3RoZXI7IGl0IGNhbiBiZSBkb25lIHVzaW5nIHRoZQotQHVybHtodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLWZpbHRlcnMuaHRtbCNvdmVybGF5LCBAY29kZXtvdmVybGF5fX0gdmlkZW8gZmlsdGVyLgorQHVybHtmZm1wZWctZmlsdGVycy5odG1sI292ZXJsYXksIEBjb2Rle292ZXJsYXl9fSB2aWRlbyBmaWx0ZXIuCiAKIEBlbmQgaXRlbWl6ZQogCkBAIC0zMzMsMTkgKzMzMywxOSBAQAogCiBAc3Vic2VjdGlvbiBDb25jYXRlbmF0aW5nIHVzaW5nIHRoZSBjb25jYXQgQGVtcGh7ZmlsdGVyfQogCi1GRm1wZWcgaGFzIGEgQHVybHtodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLWZpbHRlcnMuaHRtbCNjb25jYXQsCitGRm1wZWcgaGFzIGEgQHVybHtmZm1wZWctZmlsdGVycy5odG1sI2NvbmNhdCwKIEBjb2Rle2NvbmNhdH19IGZpbHRlciBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIHRoYXQsIHdpdGggZXhhbXBsZXMgaW4gdGhlCiBkb2N1bWVudGF0aW9uLiBUaGlzIG9wZXJhdGlvbiBpcyByZWNvbW1lbmRlZCBpZiB5b3UgbmVlZCB0byByZS1lbmNvZGUuCiAKIEBzdWJzZWN0aW9uIENvbmNhdGVuYXRpbmcgdXNpbmcgdGhlIGNvbmNhdCBAZW1waHtkZW11eGVyfQogCi1GRm1wZWcgaGFzIGEgQHVybHtodHRwczovL3d3dy5mZm1wZWcub3JnL2ZmbXBlZy1mb3JtYXRzLmh0bWwjY29uY2F0LAorRkZtcGVnIGhhcyBhIEB1cmx7ZmZtcGVnLWZvcm1hdHMuaHRtbCNjb25jYXQsCiBAY29kZXtjb25jYXR9fSBkZW11eGVyIHdoaWNoIHlvdSBjYW4gdXNlIHdoZW4geW91IHdhbnQgdG8gYXZvaWQgYSByZS1lbmNvZGUgYW5kCiB5b3VyIGZvcm1hdCBkb2Vzbid0IHN1cHBvcnQgZmlsZSBsZXZlbCBjb25jYXRlbmF0aW9uLgogCiBAc3Vic2VjdGlvbiBDb25jYXRlbmF0aW5nIHVzaW5nIHRoZSBjb25jYXQgQGVtcGh7cHJvdG9jb2x9IChmaWxlIGxldmVsKQogCi1GRm1wZWcgaGFzIGEgQHVybHtodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLXByb3RvY29scy5odG1sI2NvbmNhdCwKK0ZGbXBlZyBoYXMgYSBAdXJse2ZmbXBlZy1wcm90b2NvbHMuaHRtbCNjb25jYXQsCiBAY29kZXtjb25jYXR9fSBwcm90b2NvbCBkZXNpZ25lZCBzcGVjaWZpY2FsbHkgZm9yIHRoYXQsIHdpdGggZXhhbXBsZXMgaW4gdGhlCiBkb2N1bWVudGF0aW9uLgogCkBAIC0zODUsNyArMzg1LDcgQEAKIGZmbXBlZyAtaSBpbnB1dDEuYXZpIC1xc2NhbGU6diAxIC15IGludGVybWVkaWF0ZTEubXBnIDwgL2Rldi9udWxsICYKIGZmbXBlZyAtaSBpbnB1dDIuYXZpIC1xc2NhbGU6diAxIC15IGludGVybWVkaWF0ZTIubXBnIDwgL2Rldi9udWxsICYKIGNhdCBpbnRlcm1lZGlhdGUxLm1wZyBpbnRlcm1lZGlhdGUyLm1wZyB8XAotZmZtcGVnIC1mIG1wZWcgLWkgLSAtYzp2IG1wZWc0IC1hY29kZWMgbGlibXAzbGFtZSBvdXRwdXQuYXZpCitmZm1wZWcgLWYgbXBlZyAtaSAtIC1jOnYgbXBlZzQgLWM6YSBsaWJtcDNsYW1lIG91dHB1dC5hdmkKIEBlbmQgZXhhbXBsZQogCiBAc3Vic2VjdGlvbiBDb25jYXRlbmF0aW5nIHVzaW5nIHJhdyBhdWRpbyBhbmQgdmlkZW8KQEAgLTQwNywxMyArNDA3LDEzIEBACiBta2ZpZm8gdGVtcDIudgogbWtmaWZvIGFsbC5hCiBta2ZpZm8gYWxsLnYKLWZmbXBlZyAtaSBpbnB1dDEuZmx2IC12biAtZiB1MTZsZSAtYWNvZGVjIHBjbV9zMTZsZSAtYWMgMiAtYXIgNDQxMDAgLSA+IHRlbXAxLmEgPCAvZGV2L251bGwgJgotZmZtcGVnIC1pIGlucHV0Mi5mbHYgLXZuIC1mIHUxNmxlIC1hY29kZWMgcGNtX3MxNmxlIC1hYyAyIC1hciA0NDEwMCAtID4gdGVtcDIuYSA8IC9kZXYvbnVsbCAmCitmZm1wZWcgLWkgaW5wdXQxLmZsdiAtdm4gLWYgdTE2bGUgLWM6YSBwY21fczE2bGUgLWFjIDIgLWFyIDQ0MTAwIC0gPiB0ZW1wMS5hIDwgL2Rldi9udWxsICYKK2ZmbXBlZyAtaSBpbnB1dDIuZmx2IC12biAtZiB1MTZsZSAtYzphIHBjbV9zMTZsZSAtYWMgMiAtYXIgNDQxMDAgLSA+IHRlbXAyLmEgPCAvZGV2L251bGwgJgogZmZtcGVnIC1pIGlucHV0MS5mbHYgLWFuIC1mIHl1djRtcGVncGlwZSAtID4gdGVtcDEudiA8IC9kZXYvbnVsbCAmCiBAeyBmZm1wZWcgLWkgaW5wdXQyLmZsdiAtYW4gLWYgeXV2NG1wZWdwaXBlIC0gPCAvZGV2L251bGwgfCB0YWlsIC1uICsyID4gdGVtcDIudiA7IEB9ICYKIGNhdCB0ZW1wMS5hIHRlbXAyLmEgPiBhbGwuYSAmCiBjYXQgdGVtcDEudiB0ZW1wMi52ID4gYWxsLnYgJgotZmZtcGVnIC1mIHUxNmxlIC1hY29kZWMgcGNtX3MxNmxlIC1hYyAyIC1hciA0NDEwMCAtaSBhbGwuYSBcCitmZm1wZWcgLWYgdTE2bGUgLWM6YSBwY21fczE2bGUgLWFjIDIgLWFyIDQ0MTAwIC1pIGFsbC5hIFwKICAgICAgICAtZiB5dXY0bXBlZ3BpcGUgLWkgYWxsLnYgXAogICAgICAgIC15IG91dHB1dC5mbHYKIHJtIHRlbXBbMTJdLlthdl0gYWxsLlthdl0KQEAgLTQ4NSw3ICs0ODUsNyBAQAogCiBJZiB5b3Ugd2FudCB0byBzdHJldGNoLCBvciDigJx1bnN0cmV0Y2jigJ0sIHRoZSBpbWFnZSwgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlCiBpbmZvcm1hdGlvbiB3aXRoIHRoZQotQHVybHtodHRwczovL2ZmbXBlZy5vcmcvZmZtcGVnLWZpbHRlcnMuaHRtbCNzZXRkYXJfMDAyYy1zZXRzYXIsIEBjb2Rle3NldGRhciBvciBzZXRzYXIgZmlsdGVyc319LgorQHVybHtmZm1wZWctZmlsdGVycy5odG1sI3NldGRhcl8wMDJjLXNldHNhciwgQGNvZGV7c2V0ZGFyIG9yIHNldHNhciBmaWx0ZXJzfX0uCiAKIERvIG5vdCBmb3JnZXQgdG8gZXhhbWluZSBjYXJlZnVsbHkgdGhlIG9yaWdpbmFsIHZpZGVvIHRvIGNoZWNrIHdoZXRoZXIgdGhlCiBzdHJldGNoaW5nIGNvbWVzIGZyb20gdGhlIGltYWdlIG9yIGZyb20gdGhlIGFzcGVjdCByYXRpbyBpbmZvcm1hdGlvbi4KQEAgLTUwMSw2ICs1MDEsNzEgQEAKIGZmbXBlZyAtaSBlZ2Ffc2NyZWVuLm51dCAtYXNwZWN0IDQvMyAtYyBjb3B5IGVnYV9zY3JlZW5fb3ZlcnJpZGRlbi5udXQKIEBlbmQgZXhhbXBsZQogCitAYW5jaG9ye2JhY2tncm91bmQgdGFza30KK0BzZWN0aW9uIEhvdyBkbyBJIHJ1biBmZm1wZWcgYXMgYSBiYWNrZ3JvdW5kIHRhc2s/CisKK2ZmbXBlZyBub3JtYWxseSBjaGVja3MgdGhlIGNvbnNvbGUgaW5wdXQsIGZvciBlbnRyaWVzIGxpa2UgInEiIHRvIHN0b3AKK2FuZCAiPyIgdG8gZ2l2ZSBoZWxwLCB3aGlsZSBwZXJmb3JtaW5nIG9wZXJhdGlvbnMuIGZmbXBlZyBkb2VzIG5vdCBoYXZlIGEgd2F5IG9mCitkZXRlY3Rpbmcgd2hlbiBpdCBpcyBydW5uaW5nIGFzIGEgYmFja2dyb3VuZCB0YXNrLgorV2hlbiBpdCBjaGVja3MgdGhlIGNvbnNvbGUgaW5wdXQsIHRoYXQgY2FuIGNhdXNlIHRoZSBwcm9jZXNzIHJ1bm5pbmcgZmZtcGVnCitpbiB0aGUgYmFja2dyb3VuZCB0byBzdXNwZW5kLgorCitUbyBwcmV2ZW50IHRob3NlIGlucHV0IGNoZWNrcywgYWxsb3dpbmcgZmZtcGVnIHRvIHJ1biBhcyBhIGJhY2tncm91bmQgdGFzaywKK3VzZSB0aGUgQHVybHtmZm1wZWcuaHRtbCNzdGRpbi1vcHRpb24sIEBjb2Rley1ub3N0ZGlufSBvcHRpb259CitpbiB0aGUgZmZtcGVnIGludm9jYXRpb24uIFRoaXMgaXMgZWZmZWN0aXZlIHdoZXRoZXIgeW91IHJ1biBmZm1wZWcgaW4gYSBzaGVsbAorb3IgaW52b2tlIGZmbXBlZyBpbiBpdHMgb3duIHByb2Nlc3MgdmlhIGFuIG9wZXJhdGluZyBzeXN0ZW0gQVBJLgorCitBcyBhbiBhbHRlcm5hdGl2ZSwgd2hlbiB5b3UgYXJlIHJ1bm5pbmcgZmZtcGVnIGluIGEgc2hlbGwsIHlvdSBjYW4gcmVkaXJlY3QKK3N0YW5kYXJkIGlucHV0IHRvIEBjb2Rley9kZXYvbnVsbH0gKG9uIExpbnV4IGFuZCBNYWMgT1MpCitvciBAY29kZXtOVUx9IChvbiBXaW5kb3dzKS4gWW91IGNhbiBkbyB0aGlzIHJlZGlyZWN0IGVpdGhlcgorb24gdGhlIGZmbXBlZyBpbnZvY2F0aW9uLCBvciBmcm9tIGEgc2hlbGwgc2NyaXB0IHdoaWNoIGNhbGxzIGZmbXBlZy4KKworRm9yIGV4YW1wbGU6CisKK0BleGFtcGxlCitmZm1wZWcgLW5vc3RkaW4gLWkgSU5QVVQgT1VUUFVUCitAZW5kIGV4YW1wbGUKKworb3IgKG9uIExpbnV4LCBNYWMgT1MsIGFuZCBvdGhlciBVTklYLWxpa2Ugc2hlbGxzKToKKworQGV4YW1wbGUKK2ZmbXBlZyAtaSBJTlBVVCBPVVRQVVQgPC9kZXYvbnVsbAorQGVuZCBleGFtcGxlCisKK29yIChvbiBXaW5kb3dzKToKKworQGV4YW1wbGUKK2ZmbXBlZyAtaSBJTlBVVCBPVVRQVVQgPE5VTAorQGVuZCBleGFtcGxlCisKK0BzZWN0aW9uIEhvdyBkbyBJIHByZXZlbnQgZmZtcGVnIGZyb20gc3VzcGVuZGluZyB3aXRoIGEgbWVzc2FnZSBsaWtlIEBlbXBoe3N1c3BlbmRlZCAodHR5IG91dHB1dCl9PworCitJZiB5b3UgcnVuIGZmbXBlZyBpbiB0aGUgYmFja2dyb3VuZCwgeW91IG1heSBmaW5kIHRoYXQgaXRzIHByb2Nlc3Mgc3VzcGVuZHMuCitUaGVyZSBtYXkgYmUgYSBtZXNzYWdlIGxpa2UgQGVtcGh7c3VzcGVuZGVkICh0dHkgb3V0cHV0KX0uIFRoZSBxdWVzdGlvbiBpcyBob3cKK3RvIHByZXZlbnQgdGhlIHByb2Nlc3MgZnJvbSBiZWluZyBzdXNwZW5kZWQuCisKK0ZvciBleGFtcGxlOgorCitAZXhhbXBsZQorJSBmZm1wZWcgLWkgSU5QVVQgT1VUUFVUICY+IH4vdG1wL2xvZy50eHQgJgorWzFdIDkzMzUyCislCitbMV0gICsgc3VzcGVuZGVkICh0dHkgb3V0cHV0KSAgZmZtcGVnIC1pIElOUFVUIE9VVFBVVCAmPgorQGVuZCBleGFtcGxlCisKK1RoZSBtZXNzYWdlICJ0dHkgb3V0cHV0IiBub3R3aXRoc3RhbmRpbmcsIHRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdAorZmZtcGVnIG5vcm1hbGx5IGNoZWNrcyB0aGUgY29uc29sZSBpbnB1dCB3aGVuIGl0IHJ1bnMuIFRoZSBvcGVyYXRpbmcgc3lzdGVtCitkZXRlY3RzIHRoaXMsIGFuZCBzdXNwZW5kcyB0aGUgcHJvY2VzcyB1bnRpbCB5b3UgY2FuIGJyaW5nIGl0IHRvIHRoZQorZm9yZWdyb3VuZCBhbmQgYXR0ZW5kIHRvIGl0LgorCitUaGUgc29sdXRpb24gaXMgdG8gdXNlIHRoZSByaWdodCB0ZWNobmlxdWVzIHRvIHRlbGwgZmZtcGVnIG5vdCB0byBjb25zdWx0Citjb25zb2xlIGlucHV0LiBZb3UgY2FuIHVzZSB0aGUKK0B1cmx7ZmZtcGVnLmh0bWwjc3RkaW4tb3B0aW9uLCBAY29kZXstbm9zdGRpbn0gb3B0aW9ufSwKK29yIHJlZGlyZWN0IHN0YW5kYXJkIGlucHV0IHdpdGggQGNvZGV7PCAvZGV2L251bGx9LgorU2VlIEZBUQorQHJlZntiYWNrZ3JvdW5kIHRhc2ssIEBlbXBoe0hvdyBkbyBJIHJ1biBmZm1wZWcgYXMgYSBiYWNrZ3JvdW5kIHRhc2s/fX0KK2ZvciBkZXRhaWxzLgorCiBAY2hhcHRlciBEZXZlbG9wbWVudAogCiBAc2VjdGlvbiBBcmUgdGhlcmUgZXhhbXBsZXMgaWxsdXN0cmF0aW5nIGhvdyB0byB1c2UgdGhlIEZGbXBlZyBsaWJyYXJpZXMsIHBhcnRpY3VsYXJseSBsaWJhdmNvZGVjIGFuZCBsaWJhdmZvcm1hdD8KZGlmZiAtLWdpdCBhL2RvYy9mYXRlLnRleGkgYi9kb2MvZmF0ZS50ZXhpCmluZGV4IDM1MzQ0M2EuLmM5YzBkM2EgMTAwNjQ0Ci0tLSBhL2RvYy9mYXRlLnRleGkKKysrIGIvZG9jL2ZhdGUudGV4aQpAQCAtMTQ3LDYgKzE0NywyNiBAQAogVGhlIG9ubHkgdGhpbmcgbGVmdCBpcyB0byBhdXRvbWF0ZSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBmYXRlLnNoIHNjcmlwdCBhbmQKIHRoZSBzeW5jaHJvbmlzYXRpb24gb2YgdGhlIHNhbXBsZXMgZGlyZWN0b3J5LgogCitAY2hhcHRlciBVcGxvYWRpbmcgbmV3IHNhbXBsZXMgdG8gdGhlIGZhdGUgc3VpdGUKKworVGhpcyBpcyBmb3IgZGV2ZWxvcGVycyB3aG8gaGF2ZSBhbiBhY2NvdW50IG9uIHRoZSBmYXRlIHN1aXRlIHNlcnZlci4KK0lmIHlvdSB1cGxvYWQgbmV3IHNhbXBsZXMsIHBsZWFzZSBtYWtlIHN1cmUgdGhleSBhcmUgYXMgc21hbGwgYXMgcG9zc2libGUsCitzcGFjZSBvbiBlYWNoIGNsaWVudCwgbmV0d29yayBiYW5kd2lkdGggYW5kIHNvIG9uIGJlbmVmaXQgZnJvbSBzbWFsbGVyIHRlc3QgY2FzZXMuCitBbHNvIGtlZXAgaW4gbWluZCBvbGRlciBjaGVja291dHMgdXNlIGV4aXN0aW5nIHNhbXBsZSBmaWxlcywgdGhhdCBtZWFucyBpbgorcHJhY3RpY2UgZ2VuZXJhbGx5IGRvIG5vdCByZXBsYWNlLCByZW1vdmUgb3Igb3ZlcndyaXRlIGZpbGVzIGFzIGl0IGxpa2VseSB3b3VsZAorYnJlYWsgb2xkZXIgY2hlY2tvdXRzIG9yIHJlbGVhc2VzLgorCitAZXhhbXBsZQorI0ZpcnN0IHVwZGF0ZSB5b3VyIGxvY2FsIHNhbXBsZXMgY29weToKK3JzeW5jIC12YXVMIC0tY2htb2Q9RGcrcyxEdW8reCx1ZytydyxvK3Isby13LCtYIGZhdGUtc3VpdGUuZmZtcGVnLm9yZzovaG9tZS9zYW1wbGVzL2ZhdGUtc3VpdGUvIH4vZmF0ZS1zdWl0ZQorCisjVGhlbiBkbyBhIGRyeSBydW4gY2hlY2tpbmcgd2hhdCB3b3VsZCBiZSB1cGxvYWRlZDoKK3JzeW5jIC12YW5MIC0tbm8tZyAtLWNobW9kPURnK3MsRHVvK3gsdWcrcncsbytyLG8tdywrWCB+L2ZhdGUtc3VpdGUvIGZhdGUtc3VpdGUuZmZtcGVnLm9yZzovaG9tZS9zYW1wbGVzL2ZhdGUtc3VpdGUKKworI1VwbG9hZCB0aGUgZmlsZXM6Cityc3luYyAtdmFMICAtLW5vLWcgLS1jaG1vZD1EZytzLER1byt4LHVnK3J3LG8rcixvLXcsK1ggfi9mYXRlLXN1aXRlLyBmYXRlLXN1aXRlLmZmbXBlZy5vcmc6L2hvbWUvc2FtcGxlcy9mYXRlLXN1aXRlCitAZW5kIGV4YW1wbGUKKwogCiBAY2hhcHRlciBGQVRFIG1ha2VmaWxlIHRhcmdldHMgYW5kIHZhcmlhYmxlcwogCkBAIC0xOTcsNiArMjE3LDExIEBACiAKIEBpdGVtIEdFTgogU2V0IHRvIEBzYW1wezF9IHRvIGdlbmVyYXRlIHRoZSBtaXNzaW5nIG9yIG1pc21hdGNoZWQgcmVmZXJlbmNlcy4KKworQGl0ZW0gSFdBQ0NFTAorU3BlY2lmeSB3aGljaCBoYXJkd2FyZSBhY2NlbGVyYXRpb24gdG8gdXNlIHdoaWxlIHJ1bm5pbmcgcmVncmVzc2lvbiB0ZXN0cywKK2J5IGRlZmF1bHQgQHNhbXB7bm9uZX0gaXMgdXNlZC4KKwogQGVuZCB0YWJsZQogCiBAc2VjdGlvbiBFeGFtcGxlcwpkaWZmIC0tZ2l0IGEvZG9jL2ZhdGVfY29uZmlnLnNoLnRlbXBsYXRlIGIvZG9jL2ZhdGVfY29uZmlnLnNoLnRlbXBsYXRlCmluZGV4IDA1OWExZjguLmFiMWJkYTQgMTAwNjQ0Ci0tLSBhL2RvYy9mYXRlX2NvbmZpZy5zaC50ZW1wbGF0ZQorKysgYi9kb2MvZmF0ZV9jb25maWcuc2gudGVtcGxhdGUKQEAgLTYsNiArNiw3IEBACiAjZmF0ZV9yZWN2PSJzc2ggLVQgZmF0ZUBmYXRlLmZmbXBlZy5vcmciICMgY29tbWFuZCB0byBzdWJtaXQgcmVwb3J0CiBjb21tZW50PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgZGVzY3JpcHRpb24KIGJ1aWxkX29ubHk9ICAgICAjIHNldCB0byAieWVzIiBmb3IgYSBjb21waWxlLW9ubHkgaW5zdGFuY2UgdGhhdCBza2lwcyB0ZXN0cworaWdub3JlX3Rlc3RzPQogCiAjIHRoZSBmb2xsb3dpbmcgYXJlIG9wdGlvbmFsIGFuZCBtYXAgdG8gY29uZmlndXJlIG9wdGlvbnMKIGFyY2g9CkBAIC0yNiw1ICsyNyw3IEBACiAKICNtYWtlPSAgICAgICAgICAjIG5hbWUgb2YgR05VIG1ha2UgaWYgbm90ICdtYWtlJwogbWFrZW9wdHM9ICAgICAgICMgZXh0cmEgb3B0aW9ucyBwYXNzZWQgdG8gJ21ha2UnCisjbWFrZW9wdHNfZmF0ZT0gIyBleHRyYSBvcHRpb25zIHBhc3NlZCB0byAnbWFrZScgd2hlbiBydW5uaW5nIHRlc3RzLAorICAgICAgICAgICAgICAgICMgZGVmYXVsdGluZyB0byBtYWtlb3B0cyBhYm92ZSBpZiB0aGlzIGlzIG5vdCBzZXQKICN0YXI9ICAgICAgICAgICAjIGNvbW1hbmQgdG8gY3JlYXRlIGEgdGFyIGFyY2hpdmUgZnJvbSBpdHMgYXJndW1lbnRzIG9uIHN0ZG91dCwKICAgICAgICAgICAgICAgICAjIGRlZmF1bHRzIHRvICd0YXIgYycKZGlmZiAtLWdpdCBhL2RvYy9mZm1wZWctYml0c3RyZWFtLWZpbHRlcnMudGV4aSBiL2RvYy9mZm1wZWctYml0c3RyZWFtLWZpbHRlcnMudGV4aQppbmRleCBiYmRlMjU3Li42M2MwYjMzIDEwMDY0NAotLS0gYS9kb2MvZmZtcGVnLWJpdHN0cmVhbS1maWx0ZXJzLnRleGkKKysrIGIvZG9jL2ZmbXBlZy1iaXRzdHJlYW0tZmlsdGVycy50ZXhpCkBAIC0yNiwxMiArMjYsMTIgQEAKIEBjaGFwdGVyIFNlZSBBbHNvCiAKIEBpZmh0bWwKLUB1cmx7ZmZtcGVnLmh0bWwsZmZtcGVnfSwgQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwgQHVybHtmZnNlcnZlci5odG1sLGZmc2VydmVyfSwKK0B1cmx7ZmZtcGVnLmh0bWwsZmZtcGVnfSwgQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwKIEB1cmx7bGliYXZjb2RlYy5odG1sLGxpYmF2Y29kZWN9CiBAZW5kIGlmaHRtbAogCiBAaWZub3RodG1sCi1mZm1wZWcoMSksIGZmcGxheSgxKSwgZmZwcm9iZSgxKSwgZmZzZXJ2ZXIoMSksIGxpYmF2Y29kZWMoMykKK2ZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBsaWJhdmNvZGVjKDMpCiBAZW5kIGlmbm90aHRtbAogCiBAaW5jbHVkZSBhdXRob3JzLnRleGkKZGlmZiAtLWdpdCBhL2RvYy9mZm1wZWctY29kZWNzLnRleGkgYi9kb2MvZmZtcGVnLWNvZGVjcy50ZXhpCmluZGV4IDdkZjQzOTEuLmU0NmNkM2EgMTAwNjQ0Ci0tLSBhL2RvYy9mZm1wZWctY29kZWNzLnRleGkKKysrIGIvZG9jL2ZmbXBlZy1jb2RlY3MudGV4aQpAQCAtMjMsMTIgKzIzLDEyIEBACiBAY2hhcHRlciBTZWUgQWxzbwogCiBAaWZodG1sCi1AdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sIEB1cmx7ZmZzZXJ2ZXIuaHRtbCxmZnNlcnZlcn0sCitAdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sCiBAdXJse2xpYmF2Y29kZWMuaHRtbCxsaWJhdmNvZGVjfQogQGVuZCBpZmh0bWwKIAogQGlmbm90aHRtbAotZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksIGZmc2VydmVyKDEpLCBsaWJhdmNvZGVjKDMpCitmZm1wZWcoMSksIGZmcGxheSgxKSwgZmZwcm9iZSgxKSwgbGliYXZjb2RlYygzKQogQGVuZCBpZm5vdGh0bWwKIAogQGluY2x1ZGUgYXV0aG9ycy50ZXhpCmRpZmYgLS1naXQgYS9kb2MvZmZtcGVnLWRldmljZXMudGV4aSBiL2RvYy9mZm1wZWctZGV2aWNlcy50ZXhpCmluZGV4IDcyMWMwZGYuLmE1MWRlMDAgMTAwNjQ0Ci0tLSBhL2RvYy9mZm1wZWctZGV2aWNlcy50ZXhpCisrKyBiL2RvYy9mZm1wZWctZGV2aWNlcy50ZXhpCkBAIC0yMywxMiArMjMsMTIgQEAKIEBjaGFwdGVyIFNlZSBBbHNvCiAKIEBpZmh0bWwKLUB1cmx7ZmZtcGVnLmh0bWwsZmZtcGVnfSwgQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwgQHVybHtmZnNlcnZlci5odG1sLGZmc2VydmVyfSwKK0B1cmx7ZmZtcGVnLmh0bWwsZmZtcGVnfSwgQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwKIEB1cmx7bGliYXZkZXZpY2UuaHRtbCxsaWJhdmRldmljZX0KIEBlbmQgaWZodG1sCiAKIEBpZm5vdGh0bWwKLWZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwgbGliYXZkZXZpY2UoMykKK2ZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBsaWJhdmRldmljZSgzKQogQGVuZCBpZm5vdGh0bWwKIAogQGluY2x1ZGUgYXV0aG9ycy50ZXhpCmRpZmYgLS1naXQgYS9kb2MvZmZtcGVnLWZpbHRlcnMudGV4aSBiL2RvYy9mZm1wZWctZmlsdGVycy50ZXhpCmluZGV4IGI2NDNmMmMuLmE4YWJhYmEgMTAwNjQ0Ci0tLSBhL2RvYy9mZm1wZWctZmlsdGVycy50ZXhpCisrKyBiL2RvYy9mZm1wZWctZmlsdGVycy50ZXhpCkBAIC0yMywxMiArMjMsMTIgQEAKIEBjaGFwdGVyIFNlZSBBbHNvCiAKIEBpZmh0bWwKLUB1cmx7ZmZtcGVnLmh0bWwsZmZtcGVnfSwgQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwgQHVybHtmZnNlcnZlci5odG1sLGZmc2VydmVyfSwKK0B1cmx7ZmZtcGVnLmh0bWwsZmZtcGVnfSwgQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwKIEB1cmx7bGliYXZmaWx0ZXIuaHRtbCxsaWJhdmZpbHRlcn0KIEBlbmQgaWZodG1sCiAKIEBpZm5vdGh0bWwKLWZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwgbGliYXZmaWx0ZXIoMykKK2ZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBsaWJhdmZpbHRlcigzKQogQGVuZCBpZm5vdGh0bWwKIAogQGluY2x1ZGUgYXV0aG9ycy50ZXhpCmRpZmYgLS1naXQgYS9kb2MvZmZtcGVnLWZvcm1hdHMudGV4aSBiL2RvYy9mZm1wZWctZm9ybWF0cy50ZXhpCmluZGV4IGQ5MTZlZTguLmExOTE3YTcgMTAwNjQ0Ci0tLSBhL2RvYy9mZm1wZWctZm9ybWF0cy50ZXhpCisrKyBiL2RvYy9mZm1wZWctZm9ybWF0cy50ZXhpCkBAIC0yMywxMiArMjMsMTIgQEAKIEBjaGFwdGVyIFNlZSBBbHNvCiAKIEBpZmh0bWwKLUB1cmx7ZmZtcGVnLmh0bWwsZmZtcGVnfSwgQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwgQHVybHtmZnNlcnZlci5odG1sLGZmc2VydmVyfSwKK0B1cmx7ZmZtcGVnLmh0bWwsZmZtcGVnfSwgQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwKIEB1cmx7bGliYXZmb3JtYXQuaHRtbCxsaWJhdmZvcm1hdH0KIEBlbmQgaWZodG1sCiAKIEBpZm5vdGh0bWwKLWZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwgbGliYXZmb3JtYXQoMykKK2ZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBsaWJhdmZvcm1hdCgzKQogQGVuZCBpZm5vdGh0bWwKIAogQGluY2x1ZGUgYXV0aG9ycy50ZXhpCmRpZmYgLS1naXQgYS9kb2MvZmZtcGVnLXByb3RvY29scy50ZXhpIGIvZG9jL2ZmbXBlZy1wcm90b2NvbHMudGV4aQppbmRleCBmM2EwOWY2Li43ZjBlNjJhIDEwMDY0NAotLS0gYS9kb2MvZmZtcGVnLXByb3RvY29scy50ZXhpCisrKyBiL2RvYy9mZm1wZWctcHJvdG9jb2xzLnRleGkKQEAgLTIzLDEyICsyMywxMiBAQAogQGNoYXB0ZXIgU2VlIEFsc28KIAogQGlmaHRtbAotQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LCBAdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAorQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LAogQHVybHtsaWJhdmZvcm1hdC5odG1sLGxpYmF2Zm9ybWF0fQogQGVuZCBpZmh0bWwKIAogQGlmbm90aHRtbAotZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksIGZmc2VydmVyKDEpLCBsaWJhdmZvcm1hdCgzKQorZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksIGxpYmF2Zm9ybWF0KDMpCiBAZW5kIGlmbm90aHRtbAogCiBAaW5jbHVkZSBhdXRob3JzLnRleGkKZGlmZiAtLWdpdCBhL2RvYy9mZm1wZWctcmVzYW1wbGVyLnRleGkgYi9kb2MvZmZtcGVnLXJlc2FtcGxlci50ZXhpCmluZGV4IGJlMzc4NGYuLjBlOWEzZGQgMTAwNjQ0Ci0tLSBhL2RvYy9mZm1wZWctcmVzYW1wbGVyLnRleGkKKysrIGIvZG9jL2ZmbXBlZy1yZXNhbXBsZXIudGV4aQpAQCAtMjUsMTIgKzI1LDEyIEBACiBAY2hhcHRlciBTZWUgQWxzbwogCiBAaWZodG1sCi1AdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sIEB1cmx7ZmZzZXJ2ZXIuaHRtbCxmZnNlcnZlcn0sCitAdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sCiBAdXJse2xpYnN3cmVzYW1wbGUuaHRtbCxsaWJzd3Jlc2FtcGxlfQogQGVuZCBpZmh0bWwKIAogQGlmbm90aHRtbAotZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksIGZmc2VydmVyKDEpLCBsaWJzd3Jlc2FtcGxlKDMpCitmZm1wZWcoMSksIGZmcGxheSgxKSwgZmZwcm9iZSgxKSwgbGlic3dyZXNhbXBsZSgzKQogQGVuZCBpZm5vdGh0bWwKIAogQGluY2x1ZGUgYXV0aG9ycy50ZXhpCmRpZmYgLS1naXQgYS9kb2MvZmZtcGVnLXNjYWxlci50ZXhpIGIvZG9jL2ZmbXBlZy1zY2FsZXIudGV4aQppbmRleCA5YWIxMmExLi5kMjU5ZGE5IDEwMDY0NAotLS0gYS9kb2MvZmZtcGVnLXNjYWxlci50ZXhpCisrKyBiL2RvYy9mZm1wZWctc2NhbGVyLnRleGkKQEAgLTI0LDEyICsyNCwxMiBAQAogQGNoYXB0ZXIgU2VlIEFsc28KIAogQGlmaHRtbAotQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LCBAdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAorQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LAogQHVybHtsaWJzd3NjYWxlLmh0bWwsbGlic3dzY2FsZX0KIEBlbmQgaWZodG1sCiAKIEBpZm5vdGh0bWwKLWZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwgbGlic3dzY2FsZSgzKQorZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksIGxpYnN3c2NhbGUoMykKIEBlbmQgaWZub3RodG1sCiAKIEBpbmNsdWRlIGF1dGhvcnMudGV4aQpkaWZmIC0tZ2l0IGEvZG9jL2ZmbXBlZy11dGlscy50ZXhpIGIvZG9jL2ZmbXBlZy11dGlscy50ZXhpCmluZGV4IGUzOWNmYTguLmQ4ZTA4ODQgMTAwNjQ0Ci0tLSBhL2RvYy9mZm1wZWctdXRpbHMudGV4aQorKysgYi9kb2MvZmZtcGVnLXV0aWxzLnRleGkKQEAgLTIzLDEyICsyMywxMiBAQAogQGNoYXB0ZXIgU2VlIEFsc28KIAogQGlmaHRtbAotQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LCBAdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAorQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LAogQHVybHtsaWJhdnV0aWwuaHRtbCxsaWJhdnV0aWx9CiBAZW5kIGlmaHRtbAogCiBAaWZub3RodG1sCi1mZm1wZWcoMSksIGZmcGxheSgxKSwgZmZwcm9iZSgxKSwgZmZzZXJ2ZXIoMSksIGxpYmF2dXRpbCgzKQorZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksIGxpYmF2dXRpbCgzKQogQGVuZCBpZm5vdGh0bWwKIAogQGluY2x1ZGUgYXV0aG9ycy50ZXhpCmRpZmYgLS1naXQgYS9kb2MvZmZtcGVnLnRleGkgYi9kb2MvZmZtcGVnLnRleGkKaW5kZXggZTAyODA3Yy4uODZjNmZkOCAxMDA2NDQKLS0tIGEvZG9jL2ZmbXBlZy50ZXhpCisrKyBiL2RvYy9mZm1wZWcudGV4aQpAQCAtMTIsNyArMTIsNyBAQAogCiBAY2hhcHRlciBTeW5vcHNpcwogCi1mZm1wZWcgW0B2YXJ7Z2xvYmFsX29wdGlvbnN9XSBAe1tAdmFye2lucHV0X2ZpbGVfb3B0aW9uc31dIC1pIEBmaWxle2lucHV0X2ZpbGV9QH0gLi4uIEB7W0B2YXJ7b3V0cHV0X2ZpbGVfb3B0aW9uc31dIEBmaWxle291dHB1dF9maWxlfUB9IC4uLgorZmZtcGVnIFtAdmFye2dsb2JhbF9vcHRpb25zfV0gQHtbQHZhcntpbnB1dF9maWxlX29wdGlvbnN9XSAtaSBAZmlsZXtpbnB1dF91cmx9QH0gLi4uIEB7W0B2YXJ7b3V0cHV0X2ZpbGVfb3B0aW9uc31dIEBmaWxle291dHB1dF91cmx9QH0gLi4uCiAKIEBjaGFwdGVyIERlc2NyaXB0aW9uCiBAYyBtYW4gYmVnaW4gREVTQ1JJUFRJT04KQEAgLTI0LDEwICsyNCwxMCBAQAogQGNvbW1hbmR7ZmZtcGVnfSByZWFkcyBmcm9tIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgaW5wdXQgImZpbGVzIiAod2hpY2ggY2FuIGJlIHJlZ3VsYXIKIGZpbGVzLCBwaXBlcywgbmV0d29yayBzdHJlYW1zLCBncmFiYmluZyBkZXZpY2VzLCBldGMuKSwgc3BlY2lmaWVkIGJ5IHRoZQogQGNvZGV7LWl9IG9wdGlvbiwgYW5kIHdyaXRlcyB0byBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIG91dHB1dCAiZmlsZXMiLCB3aGljaCBhcmUKLXNwZWNpZmllZCBieSBhIHBsYWluIG91dHB1dCBmaWxlbmFtZS4gQW55dGhpbmcgZm91bmQgb24gdGhlIGNvbW1hbmQgbGluZSB3aGljaAotY2Fubm90IGJlIGludGVycHJldGVkIGFzIGFuIG9wdGlvbiBpcyBjb25zaWRlcmVkIHRvIGJlIGFuIG91dHB1dCBmaWxlbmFtZS4KK3NwZWNpZmllZCBieSBhIHBsYWluIG91dHB1dCB1cmwuIEFueXRoaW5nIGZvdW5kIG9uIHRoZSBjb21tYW5kIGxpbmUgd2hpY2gKK2Nhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBvcHRpb24gaXMgY29uc2lkZXJlZCB0byBiZSBhbiBvdXRwdXQgdXJsLgogCi1FYWNoIGlucHV0IG9yIG91dHB1dCBmaWxlIGNhbiwgaW4gcHJpbmNpcGxlLCBjb250YWluIGFueSBudW1iZXIgb2Ygc3RyZWFtcyBvZgorRWFjaCBpbnB1dCBvciBvdXRwdXQgdXJsIGNhbiwgaW4gcHJpbmNpcGxlLCBjb250YWluIGFueSBudW1iZXIgb2Ygc3RyZWFtcyBvZgogZGlmZmVyZW50IHR5cGVzICh2aWRlby9hdWRpby9zdWJ0aXRsZS9hdHRhY2htZW50L2RhdGEpLiBUaGUgYWxsb3dlZCBudW1iZXIgYW5kL29yCiB0eXBlcyBvZiBzdHJlYW1zIG1heSBiZSBsaW1pdGVkIGJ5IHRoZSBjb250YWluZXIgZm9ybWF0LiBTZWxlY3Rpbmcgd2hpY2gKIHN0cmVhbXMgZnJvbSB3aGljaCBpbnB1dHMgd2lsbCBnbyBpbnRvIHdoaWNoIG91dHB1dCBpcyBlaXRoZXIgZG9uZSBhdXRvbWF0aWNhbGx5CkBAIC0yMjMsNyArMjIzLDcgQEAKIHN1YnRpdGxlcywgaXQgaXMgdGhlIGZpcnN0IHN1YnRpdGxlIHN0cmVhbS4gSW4gdGhlIGNhc2Ugd2hlcmUgc2V2ZXJhbCBzdHJlYW1zIG9mCiB0aGUgc2FtZSB0eXBlIHJhdGUgZXF1YWxseSwgdGhlIHN0cmVhbSB3aXRoIHRoZSBsb3dlc3QgaW5kZXggaXMgY2hvc2VuLgogCi1Zb3UgY2FuIGRpc2FibGUgc29tZSBvZiB0aG9zZSBkZWZhdWx0cyBieSB1c2luZyB0aGUgQGNvZGV7LXZuLy1hbi8tc259IG9wdGlvbnMuIEZvcgorWW91IGNhbiBkaXNhYmxlIHNvbWUgb2YgdGhvc2UgZGVmYXVsdHMgYnkgdXNpbmcgdGhlIEBjb2Rley12bi8tYW4vLXNuLy1kbn0gb3B0aW9ucy4gRm9yCiBmdWxsIG1hbnVhbCBjb250cm9sLCB1c2UgdGhlIEBjb2Rley1tYXB9IG9wdGlvbiwgd2hpY2ggZGlzYWJsZXMgdGhlIGRlZmF1bHRzIGp1c3QKIGRlc2NyaWJlZC4KIApAQCAtMjQzLDggKzI0Myw4IEBACiBmaWxlcyBhbmQgZ3Vlc3NlZCBmcm9tIHRoZSBmaWxlIGV4dGVuc2lvbiBmb3Igb3V0cHV0IGZpbGVzLCBzbyB0aGlzIG9wdGlvbiBpcyBub3QKIG5lZWRlZCBpbiBtb3N0IGNhc2VzLgogCi1AaXRlbSAtaSBAdmFye2ZpbGVuYW1lfSAoQGVtcGh7aW5wdXR9KQotaW5wdXQgZmlsZSBuYW1lCitAaXRlbSAtaSBAdmFye3VybH0gKEBlbXBoe2lucHV0fSkKK2lucHV0IGZpbGUgdXJsCiAKIEBpdGVtIC15IChAZW1waHtnbG9iYWx9KQogT3ZlcndyaXRlIG91dHB1dCBmaWxlcyB3aXRob3V0IGFza2luZy4KQEAgLTI4MSw3ICsyODEsNyBAQAogV2hlbiB1c2VkIGFzIGFuIGlucHV0IG9wdGlvbiAoYmVmb3JlIEBjb2Rley1pfSksIGxpbWl0IHRoZSBAdmFye2R1cmF0aW9ufSBvZgogZGF0YSByZWFkIGZyb20gdGhlIGlucHV0IGZpbGUuCiAKLVdoZW4gdXNlZCBhcyBhbiBvdXRwdXQgb3B0aW9uIChiZWZvcmUgYW4gb3V0cHV0IGZpbGVuYW1lKSwgc3RvcCB3cml0aW5nIHRoZQorV2hlbiB1c2VkIGFzIGFuIG91dHB1dCBvcHRpb24gKGJlZm9yZSBhbiBvdXRwdXQgdXJsKSwgc3RvcCB3cml0aW5nIHRoZQogb3V0cHV0IGFmdGVyIGl0cyBkdXJhdGlvbiByZWFjaGVzIEB2YXJ7ZHVyYXRpb259LgogCiBAdmFye2R1cmF0aW9ufSBtdXN0IGJlIGEgdGltZSBkdXJhdGlvbiBzcGVjaWZpY2F0aW9uLApAQCAtMjg5LDggKzI4OSw4IEBACiAKIC10byBhbmQgLXQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSBhbmQgLXQgaGFzIHByaW9yaXR5LgogCi1AaXRlbSAtdG8gQHZhcntwb3NpdGlvbn0gKEBlbXBoe291dHB1dH0pCi1TdG9wIHdyaXRpbmcgdGhlIG91dHB1dCBhdCBAdmFye3Bvc2l0aW9ufS4KK0BpdGVtIC10byBAdmFye3Bvc2l0aW9ufSAoQGVtcGh7aW5wdXQvb3V0cHV0fSkKK1N0b3Agd3JpdGluZyB0aGUgb3V0cHV0IG9yIHJlYWRpbmcgdGhlIGlucHV0IGF0IEB2YXJ7cG9zaXRpb259LgogQHZhcntwb3NpdGlvbn0gbXVzdCBiZSBhIHRpbWUgZHVyYXRpb24gc3BlY2lmaWNhdGlvbiwKIHNlZSBAcmVme3RpbWUgZHVyYXRpb24gc3ludGF4LCx0aGUgVGltZSBkdXJhdGlvbiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMoMSkgbWFudWFsLGZmbXBlZy11dGlsc30uCiAKQEAgLTMxMCw3ICszMTAsNyBAQAogZGlzY2FyZGVkLiBXaGVuIGRvaW5nIHN0cmVhbSBjb3B5IG9yIHdoZW4gQG9wdGlvbnstbm9hY2N1cmF0ZV9zZWVrfSBpcyB1c2VkLCBpdAogd2lsbCBiZSBwcmVzZXJ2ZWQuCiAKLVdoZW4gdXNlZCBhcyBhbiBvdXRwdXQgb3B0aW9uIChiZWZvcmUgYW4gb3V0cHV0IGZpbGVuYW1lKSwgZGVjb2RlcyBidXQgZGlzY2FyZHMKK1doZW4gdXNlZCBhcyBhbiBvdXRwdXQgb3B0aW9uIChiZWZvcmUgYW4gb3V0cHV0IHVybCksIGRlY29kZXMgYnV0IGRpc2NhcmRzCiBpbnB1dCB1bnRpbCB0aGUgdGltZXN0YW1wcyByZWFjaCBAdmFye3Bvc2l0aW9ufS4KIAogQHZhcntwb3NpdGlvbn0gbXVzdCBiZSBhIHRpbWUgZHVyYXRpb24gc3BlY2lmaWNhdGlvbiwKQEAgLTM1Nyw2ICszNTcsNDAgQEAKIGZmbXBlZyAtaSBJTlBVVCAtbWV0YWRhdGE6czphOjAgbGFuZ3VhZ2U9ZW5nIE9VVFBVVAogQGVuZCBleGFtcGxlCiAKK0BpdGVtIC1kaXNwb3NpdGlvbls6c3RyZWFtX3NwZWNpZmllcl0gQHZhcnt2YWx1ZX0gKEBlbXBoe291dHB1dCxwZXItc3RyZWFtfSkKK1NldHMgdGhlIGRpc3Bvc2l0aW9uIGZvciBhIHN0cmVhbS4KKworVGhpcyBvcHRpb24gb3ZlcnJpZGVzIHRoZSBkaXNwb3NpdGlvbiBjb3BpZWQgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiBJdCBpcyBhbHNvCitwb3NzaWJsZSB0byBkZWxldGUgdGhlIGRpc3Bvc2l0aW9uIGJ5IHNldHRpbmcgaXQgdG8gMC4KKworVGhlIGZvbGxvd2luZyBkaXNwb3NpdGlvbnMgYXJlIHJlY29nbml6ZWQ6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZGVmYXVsdAorQGl0ZW0gZHViCitAaXRlbSBvcmlnaW5hbAorQGl0ZW0gY29tbWVudAorQGl0ZW0gbHlyaWNzCitAaXRlbSBrYXJhb2tlCitAaXRlbSBmb3JjZWQKK0BpdGVtIGhlYXJpbmdfaW1wYWlyZWQKK0BpdGVtIHZpc3VhbF9pbXBhaXJlZAorQGl0ZW0gY2xlYW5fZWZmZWN0cworQGl0ZW0gY2FwdGlvbnMKK0BpdGVtIGRlc2NyaXB0aW9ucworQGl0ZW0gbWV0YWRhdGEKK0BlbmQgdGFibGUKKworRm9yIGV4YW1wbGUsIHRvIG1ha2UgdGhlIHNlY29uZCBhdWRpbyBzdHJlYW0gdGhlIGRlZmF1bHQgc3RyZWFtOgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBpbi5ta3YgLWRpc3Bvc2l0aW9uOmE6MSBkZWZhdWx0IG91dC5ta3YKK0BlbmQgZXhhbXBsZQorCitUbyBtYWtlIHRoZSBzZWNvbmQgc3VidGl0bGUgc3RyZWFtIHRoZSBkZWZhdWx0IHN0cmVhbSBhbmQgcmVtb3ZlIHRoZSBkZWZhdWx0CitkaXNwb3NpdGlvbiBmcm9tIHRoZSBmaXJzdCBzdWJ0aXRsZSBzdHJlYW06CitAZXhhbXBsZQorZmZtcGVnIC1pIElOUFVUIC1kaXNwb3NpdGlvbjpzOjAgMCAtZGlzcG9zaXRpb246czoxIGRlZmF1bHQgT1VUUFVUCitAZW5kIGV4YW1wbGUKKwogQGl0ZW0gLXByb2dyYW0gW3RpdGxlPUB2YXJ7dGl0bGV9Ol1bcHJvZ3JhbV9udW09QHZhcntwcm9ncmFtX251bX06XXN0PUB2YXJ7c3RyZWFtfVs6c3Q9QHZhcntzdHJlYW19Li4uXSAoQGVtcGh7b3V0cHV0fSkKIAogQ3JlYXRlcyBhIHByb2dyYW0gd2l0aCB0aGUgc3BlY2lmaWVkIEB2YXJ7dGl0bGV9LCBAdmFye3Byb2dyYW1fbnVtfSBhbmQgYWRkcyB0aGUgc3BlY2lmaWVkCkBAIC0zNzksOCArNDEzLDEzIEBACiBmZm1wZWcgLWkgbXlmaWxlLmF2aSAtdGFyZ2V0IHZjZCAtYmYgMiAvdG1wL3ZjZC5tcGcKIEBlbmQgZXhhbXBsZQogCitAaXRlbSAtZG4gKEBlbXBoe291dHB1dH0pCitEaXNhYmxlIGRhdGEgcmVjb3JkaW5nLiBGb3IgZnVsbCBtYW51YWwgY29udHJvbCBzZWUgdGhlIEBjb2Rley1tYXB9CitvcHRpb24uCisKIEBpdGVtIC1kZnJhbWVzIEB2YXJ7bnVtYmVyfSAoQGVtcGh7b3V0cHV0fSkKLVNldCB0aGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHRvIG91dHB1dC4gVGhpcyBpcyBhbiBhbGlhcyBmb3IgQGNvZGV7LWZyYW1lczpkfS4KK1NldCB0aGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHRvIG91dHB1dC4gVGhpcyBpcyBhbiBvYnNvbGV0ZSBhbGlhcyBmb3IKK0Bjb2Rley1mcmFtZXM6ZH0sIHdoaWNoIHlvdSBzaG91bGQgdXNlIGluc3RlYWQuCiAKIEBpdGVtIC1mcmFtZXNbOkB2YXJ7c3RyZWFtX3NwZWNpZmllcn1dIEB2YXJ7ZnJhbWVjb3VudH0gKEBlbXBoe291dHB1dCxwZXItc3RyZWFtfSkKIFN0b3Agd3JpdGluZyB0byB0aGUgc3RyZWFtIGFmdGVyIEB2YXJ7ZnJhbWVjb3VudH0gZnJhbWVzLgpAQCAtNDE1LDYgKzQ1NCwxMSBAQAogYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgZnJvbSB3aGljaCBhIGZpbHRlcmdyYXBoIGRlc2NyaXB0aW9uIGlzIHRvIGJlCiByZWFkLgogCitAaXRlbSAtZmlsdGVyX3RocmVhZHMgQHZhcntuYl90aHJlYWRzfSAoQGVtcGh7Z2xvYmFsfSkKK0RlZmluZXMgaG93IG1hbnkgdGhyZWFkcyBhcmUgdXNlZCB0byBwcm9jZXNzIGEgZmlsdGVyIHBpcGVsaW5lLiBFYWNoIHBpcGVsaW5lCit3aWxsIHByb2R1Y2UgYSB0aHJlYWQgcG9vbCB3aXRoIHRoaXMgbWFueSB0aHJlYWRzIGF2YWlsYWJsZSBmb3IgcGFyYWxsZWwgcHJvY2Vzc2luZy4KK1RoZSBkZWZhdWx0IGlzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIENQVXMuCisKIEBpdGVtIC1wcmVbOkB2YXJ7c3RyZWFtX3NwZWNpZmllcn1dIEB2YXJ7cHJlc2V0X25hbWV9IChAZW1waHtvdXRwdXQscGVyLXN0cmVhbX0pCiBTcGVjaWZ5IHRoZSBwcmVzZXQgZm9yIG1hdGNoaW5nIHN0cmVhbShzKS4KIApAQCAtNDMwLDYgKzQ3NCw3IEBACiBjb25zaXN0cyBvZiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBUaGUgbGFzdCBrZXkgb2YgYSBzZXF1ZW5jZSBvZgogcHJvZ3Jlc3MgaW5mb3JtYXRpb24gaXMgYWx3YXlzICJwcm9ncmVzcyIuCiAKK0BhbmNob3J7c3RkaW4gb3B0aW9ufQogQGl0ZW0gLXN0ZGluCiBFbmFibGUgaW50ZXJhY3Rpb24gb24gc3RhbmRhcmQgaW5wdXQuIE9uIGJ5IGRlZmF1bHQgdW5sZXNzIHN0YW5kYXJkIGlucHV0IGlzCiB1c2VkIGFzIGFuIGlucHV0LiBUbyBleHBsaWNpdGx5IGRpc2FibGUgaW50ZXJhY3Rpb24geW91IG5lZWQgdG8gc3BlY2lmeQpAQCAtNDkwLDcgKzUzNSw4IEBACiAKIEB0YWJsZSBAb3B0aW9uCiBAaXRlbSAtdmZyYW1lcyBAdmFye251bWJlcn0gKEBlbXBoe291dHB1dH0pCi1TZXQgdGhlIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgdG8gb3V0cHV0LiBUaGlzIGlzIGFuIGFsaWFzIGZvciBAY29kZXstZnJhbWVzOnZ9LgorU2V0IHRoZSBudW1iZXIgb2YgdmlkZW8gZnJhbWVzIHRvIG91dHB1dC4gVGhpcyBpcyBhbiBvYnNvbGV0ZSBhbGlhcyBmb3IKK0Bjb2Rley1mcmFtZXM6dn0sIHdoaWNoIHlvdSBzaG91bGQgdXNlIGluc3RlYWQuCiBAaXRlbSAtcls6QHZhcntzdHJlYW1fc3BlY2lmaWVyfV0gQHZhcntmcHN9IChAZW1waHtpbnB1dC9vdXRwdXQscGVyLXN0cmVhbX0pCiBTZXQgZnJhbWUgcmF0ZSAoSHogdmFsdWUsIGZyYWN0aW9uIG9yIGFiYnJldmlhdGlvbikuCiAKQEAgLTUyOSw3ICs1NzUsOCBAQAogZnJhbWVzLCBpZiBpdCBleGlzdHMuCiAKIEBpdGVtIC12biAoQGVtcGh7b3V0cHV0fSkKLURpc2FibGUgdmlkZW8gcmVjb3JkaW5nLgorRGlzYWJsZSB2aWRlbyByZWNvcmRpbmcuIEZvciBmdWxsIG1hbnVhbCBjb250cm9sIHNlZSB0aGUgQGNvZGV7LW1hcH0KK29wdGlvbi4KIAogQGl0ZW0gLXZjb2RlYyBAdmFye2NvZGVjfSAoQGVtcGh7b3V0cHV0fSkKIFNldCB0aGUgdmlkZW8gY29kZWMuIFRoaXMgaXMgYW4gYWxpYXMgZm9yIEBjb2Rley1jb2RlYzp2fS4KQEAgLTU5Nyw2ICs2NDQsMTYgQEAKIER1bXAgdmlkZW8gY29kaW5nIHN0YXRpc3RpY3MgdG8gQGZpbGV7dnN0YXRzX0hITU1TUy5sb2d9LgogQGl0ZW0gLXZzdGF0c19maWxlIEB2YXJ7ZmlsZX0KIER1bXAgdmlkZW8gY29kaW5nIHN0YXRpc3RpY3MgdG8gQHZhcntmaWxlfS4KK0BpdGVtIC12c3RhdHNfdmVyc2lvbiBAdmFye2ZpbGV9CitTcGVjaWZpZXMgd2hpY2ggdmVyc2lvbiBvZiB0aGUgdnN0YXRzIGZvcm1hdCB0byB1c2UuIERlZmF1bHQgaXMgMi4KKwordmVyc2lvbiA9IDEgOgorCitAY29kZXtmcmFtZT0gJTVkIHE9ICUyLjFmIFBTTlI9ICU2LjJmIGZfc2l6ZT0gJTZkIHNfc2l6ZT0gJTguMGZrQiB0aW1lPSAlMC4zZiBicj0gJTcuMWZrYml0cy9zIGF2Z19icj0gJTcuMWZrYml0cy9zfQorCit2ZXJzaW9uID4gMToKKworQGNvZGV7b3V0PSAlMmQgc3Q9ICUyZCBmcmFtZT0gJTVkIHE9ICUyLjFmIFBTTlI9ICU2LjJmIGZfc2l6ZT0gJTZkIHNfc2l6ZT0gJTguMGZrQiB0aW1lPSAlMC4zZiBicj0gJTcuMWZrYml0cy9zIGF2Z19icj0gJTcuMWZrYml0cy9zfQogQGl0ZW0gLXRvcFs6QHZhcntzdHJlYW1fc3BlY2lmaWVyfV0gQHZhcntufSAoQGVtcGh7b3V0cHV0LHBlci1zdHJlYW19KQogdG9wPTEvYm90dG9tPTAvYXV0bz0tMSBmaWVsZCBmaXJzdAogQGl0ZW0gLWRjIEB2YXJ7cHJlY2lzaW9ufQpAQCAtNjY0LDYgKzcyMSwxMDQgQEAKIFdoZW4gZG9pbmcgc3RyZWFtIGNvcHksIGNvcHkgYWxzbyBub24ta2V5IGZyYW1lcyBmb3VuZCBhdCB0aGUKIGJlZ2lubmluZy4KIAorQGl0ZW0gLWluaXRfaHdfZGV2aWNlIEB2YXJ7dHlwZX1bPUB2YXJ7bmFtZX1dWzpAdmFye2RldmljZX1bLEB2YXJ7a2V5PXZhbHVlfS4uLl1dCitJbml0aWFsaXNlIGEgbmV3IGhhcmR3YXJlIGRldmljZSBvZiB0eXBlIEB2YXJ7dHlwZX0gY2FsbGVkIEB2YXJ7bmFtZX0sIHVzaW5nIHRoZQorZ2l2ZW4gZGV2aWNlIHBhcmFtZXRlcnMuCitJZiBubyBuYW1lIGlzIHNwZWNpZmllZCBpdCB3aWxsIHJlY2VpdmUgYSBkZWZhdWx0IG5hbWUgb2YgdGhlIGZvcm0gIkB2YXJ7dHlwZX0lZCIuCisKK1RoZSBtZWFuaW5nIG9mIEB2YXJ7ZGV2aWNlfSBhbmQgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMgZGVwZW5kcyBvbiB0aGUKK2RldmljZSB0eXBlOgorQHRhYmxlIEBvcHRpb24KKworQGl0ZW0gY3VkYQorQHZhcntkZXZpY2V9IGlzIHRoZSBudW1iZXIgb2YgdGhlIENVREEgZGV2aWNlLgorCitAaXRlbSBkeHZhMgorQHZhcntkZXZpY2V9IGlzIHRoZSBudW1iZXIgb2YgdGhlIERpcmVjdDNEIDkgZGlzcGxheSBhZGFwdGVyLgorCitAaXRlbSB2YWFwaQorQHZhcntkZXZpY2V9IGlzIGVpdGhlciBhbiBYMTEgZGlzcGxheSBuYW1lIG9yIGEgRFJNIHJlbmRlciBub2RlLgorSWYgbm90IHNwZWNpZmllZCwgaXQgd2lsbCBhdHRlbXB0IHRvIG9wZW4gdGhlIGRlZmF1bHQgWDExIGRpc3BsYXkgKEBlbXBoeyRESVNQTEFZfSkKK2FuZCB0aGVuIHRoZSBmaXJzdCBEUk0gcmVuZGVyIG5vZGUgKEBlbXBoey9kZXYvZHJpL3JlbmRlckQxMjh9KS4KKworQGl0ZW0gdmRwYXUKK0B2YXJ7ZGV2aWNlfSBpcyBhbiBYMTEgZGlzcGxheSBuYW1lLgorSWYgbm90IHNwZWNpZmllZCwgaXQgd2lsbCBhdHRlbXB0IHRvIG9wZW4gdGhlIGRlZmF1bHQgWDExIGRpc3BsYXkgKEBlbXBoeyRESVNQTEFZfSkuCisKK0BpdGVtIHFzdgorQHZhcntkZXZpY2V9IHNlbGVjdHMgYSB2YWx1ZSBpbiBAc2FtcHtNRlhfSU1QTF8qfS4gQWxsb3dlZCB2YWx1ZXMgYXJlOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIGF1dG8KK0BpdGVtIHN3CitAaXRlbSBodworQGl0ZW0gYXV0b19hbnkKK0BpdGVtIGh3X2FueQorQGl0ZW0gaHcyCitAaXRlbSBodzMKK0BpdGVtIGh3NAorQGVuZCB0YWJsZQorSWYgbm90IHNwZWNpZmllZCwgQHNhbXB7YXV0b19hbnl9IGlzIHVzZWQuCisoTm90ZSB0aGF0IGl0IG1heSBiZSBlYXNpZXIgdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCByZXN1bHQgZm9yIFFTViBieSBjcmVhdGluZyB0aGUKK3BsYXRmb3JtLWFwcHJvcHJpYXRlIHN1YmRldmljZSAoQHNhbXB7ZHh2YTJ9IG9yIEBzYW1we3ZhYXBpfSkgYW5kIHRoZW4gZGVyaXZpbmcgYQorUVNWIGRldmljZSBmcm9tIHRoYXQuKQorCitAaXRlbSBvcGVuY2wKK0B2YXJ7ZGV2aWNlfSBzZWxlY3RzIHRoZSBwbGF0Zm9ybSBhbmQgZGV2aWNlIGFzIEBlbXBoe3BsYXRmb3JtX2luZGV4LmRldmljZV9pbmRleH0uCisKK1RoZSBzZXQgb2YgZGV2aWNlcyBjYW4gYWxzbyBiZSBmaWx0ZXJlZCB1c2luZyB0aGUga2V5LXZhbHVlIHBhaXJzIHRvIGZpbmQgb25seQorZGV2aWNlcyBtYXRjaGluZyBwYXJ0aWN1bGFyIHBsYXRmb3JtIG9yIGRldmljZSBzdHJpbmdzLgorCitUaGUgc3RyaW5ncyB1c2FibGUgYXMgZmlsdGVycyBhcmU6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcGxhdGZvcm1fcHJvZmlsZQorQGl0ZW0gcGxhdGZvcm1fdmVyc2lvbgorQGl0ZW0gcGxhdGZvcm1fbmFtZQorQGl0ZW0gcGxhdGZvcm1fdmVuZG9yCitAaXRlbSBwbGF0Zm9ybV9leHRlbnNpb25zCitAaXRlbSBkZXZpY2VfbmFtZQorQGl0ZW0gZGV2aWNlX3ZlbmRvcgorQGl0ZW0gZHJpdmVyX3ZlcnNpb24KK0BpdGVtIGRldmljZV92ZXJzaW9uCitAaXRlbSBkZXZpY2VfcHJvZmlsZQorQGl0ZW0gZGV2aWNlX2V4dGVuc2lvbnMKK0BpdGVtIGRldmljZV90eXBlCitAZW5kIHRhYmxlCisKK1RoZSBpbmRpY2VzIGFuZCBmaWx0ZXJzIG11c3QgdG9nZXRoZXIgdW5pcXVlbHkgc2VsZWN0IGEgZGV2aWNlLgorCitFeGFtcGxlczoKK0B0YWJsZSBAZW1waAorQGl0ZW0gLWluaXRfaHdfZGV2aWNlIG9wZW5jbDowLjEKK0Nob29zZSB0aGUgc2Vjb25kIGRldmljZSBvbiB0aGUgZmlyc3QgcGxhdGZvcm0uCisKK0BpdGVtIC1pbml0X2h3X2RldmljZSBvcGVuY2w6LGRldmljZV9uYW1lPUZvbzkwMDAKK0Nob29zZSB0aGUgZGV2aWNlIHdpdGggYSBuYW1lIGNvbnRhaW5pbmcgdGhlIHN0cmluZyBAZW1waHtGb285MDAwfS4KKworQGl0ZW0gLWluaXRfaHdfZGV2aWNlIG9wZW5jbDoxLGRldmljZV90eXBlPWdwdSxkZXZpY2VfZXh0ZW5zaW9ucz1jbF9raHJfZnAxNgorQ2hvb3NlIHRoZSBHUFUgZGV2aWNlIG9uIHRoZSBzZWNvbmQgcGxhdGZvcm0gc3VwcG9ydGluZyB0aGUgQGVtcGh7Y2xfa2hyX2ZwMTZ9CitleHRlbnNpb24uCitAZW5kIHRhYmxlCisKK0BlbmQgdGFibGUKKworQGl0ZW0gLWluaXRfaHdfZGV2aWNlIEB2YXJ7dHlwZX1bPUB2YXJ7bmFtZX1dQEBAdmFye3NvdXJjZX0KK0luaXRpYWxpc2UgYSBuZXcgaGFyZHdhcmUgZGV2aWNlIG9mIHR5cGUgQHZhcnt0eXBlfSBjYWxsZWQgQHZhcntuYW1lfSwKK2Rlcml2aW5nIGl0IGZyb20gdGhlIGV4aXN0aW5nIGRldmljZSB3aXRoIHRoZSBuYW1lIEB2YXJ7c291cmNlfS4KKworQGl0ZW0gLWluaXRfaHdfZGV2aWNlIGxpc3QKK0xpc3QgYWxsIGhhcmR3YXJlIGRldmljZSB0eXBlcyBzdXBwb3J0ZWQgaW4gdGhpcyBidWlsZCBvZiBmZm1wZWcuCisKK0BpdGVtIC1maWx0ZXJfaHdfZGV2aWNlIEB2YXJ7bmFtZX0KK1Bhc3MgdGhlIGhhcmR3YXJlIGRldmljZSBjYWxsZWQgQHZhcntuYW1lfSB0byBhbGwgZmlsdGVycyBpbiBhbnkgZmlsdGVyIGdyYXBoLgorVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGRldmljZSB0byB1cGxvYWQgdG8gd2l0aCB0aGUgQGNvZGV7aHd1cGxvYWR9IGZpbHRlciwKK29yIHRoZSBkZXZpY2UgdG8gbWFwIHRvIHdpdGggdGhlIEBjb2Rle2h3bWFwfSBmaWx0ZXIuICBPdGhlciBmaWx0ZXJzIG1heSBhbHNvCittYWtlIHVzZSBvZiB0aGlzIHBhcmFtZXRlciB3aGVuIHRoZXkgcmVxdWlyZSBhIGhhcmR3YXJlIGRldmljZS4gIE5vdGUgdGhhdCB0aGlzCitpcyB0eXBpY2FsbHkgb25seSByZXF1aXJlZCB3aGVuIHRoZSBpbnB1dCBpcyBub3QgYWxyZWFkeSBpbiBoYXJkd2FyZSBmcmFtZXMgLQord2hlbiBpdCBpcywgZmlsdGVycyB3aWxsIGRlcml2ZSB0aGUgZGV2aWNlIHRoZXkgcmVxdWlyZSBmcm9tIHRoZSBjb250ZXh0IG9mIHRoZQorZnJhbWVzIHRoZXkgcmVjZWl2ZSBhcyBpbnB1dC4KKworVGhpcyBpcyBhIGdsb2JhbCBzZXR0aW5nLCBzbyBhbGwgZmlsdGVycyB3aWxsIHJlY2VpdmUgdGhlIHNhbWUgZGV2aWNlLgorCiBAaXRlbSAtaHdhY2NlbFs6QHZhcntzdHJlYW1fc3BlY2lmaWVyfV0gQHZhcntod2FjY2VsfSAoQGVtcGh7aW5wdXQscGVyLXN0cmVhbX0pCiBVc2UgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIHRvIGRlY29kZSB0aGUgbWF0Y2hpbmcgc3RyZWFtKHMpLiBUaGUgYWxsb3dlZCB2YWx1ZXMKIG9mIEB2YXJ7aHdhY2NlbH0gYXJlOgpAQCAtNjc0LDE1ICs4MjksMTUgQEAKIEBpdGVtIGF1dG8KIEF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBoYXJkd2FyZSBhY2NlbGVyYXRpb24gbWV0aG9kLgogCi1AaXRlbSB2ZGEKLVVzZSBBcHBsZSBWREEgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgotCiBAaXRlbSB2ZHBhdQogVXNlIFZEUEFVIChWaWRlbyBEZWNvZGUgYW5kIFByZXNlbnRhdGlvbiBBUEkgZm9yIFVuaXgpIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KIAogQGl0ZW0gZHh2YTIKIFVzZSBEWFZBMiAoRGlyZWN0WCBWaWRlbyBBY2NlbGVyYXRpb24pIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KIAorQGl0ZW0gdmFhcGkKK1VzZSBWQUFQSSAoVmlkZW8gQWNjZWxlcmF0aW9uIEFQSSkgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLgorCiBAaXRlbSBxc3YKIFVzZSB0aGUgSW50ZWwgUXVpY2tTeW5jIFZpZGVvIGFjY2VsZXJhdGlvbiBmb3IgdmlkZW8gdHJhbnNjb2RpbmcuCiAKQEAgLTcwNiwzMyArODYxLDExIEBACiBAaXRlbSAtaHdhY2NlbF9kZXZpY2VbOkB2YXJ7c3RyZWFtX3NwZWNpZmllcn1dIEB2YXJ7aHdhY2NlbF9kZXZpY2V9IChAZW1waHtpbnB1dCxwZXItc3RyZWFtfSkKIFNlbGVjdCBhIGRldmljZSB0byB1c2UgZm9yIGhhcmR3YXJlIGFjY2VsZXJhdGlvbi4KIAotVGhpcyBvcHRpb24gb25seSBtYWtlcyBzZW5zZSB3aGVuIHRoZSBAb3B0aW9uey1od2FjY2VsfSBvcHRpb24gaXMgYWxzbwotc3BlY2lmaWVkLiBJdHMgZXhhY3QgbWVhbmluZyBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBoYXJkd2FyZSBhY2NlbGVyYXRpb24KLW1ldGhvZCBjaG9zZW4uCi0KLUB0YWJsZSBAb3B0aW9uCi1AaXRlbSB2ZHBhdQotRm9yIFZEUEFVLCB0aGlzIG9wdGlvbiBzcGVjaWZpZXMgdGhlIFgxMSBkaXNwbGF5L3NjcmVlbiB0byB1c2UuIElmIHRoaXMgb3B0aW9uCi1pcyBub3Qgc3BlY2lmaWVkLCB0aGUgdmFsdWUgb2YgdGhlIEB2YXJ7RElTUExBWX0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZAotCi1AaXRlbSBkeHZhMgotRm9yIERYVkEyLCB0aGlzIG9wdGlvbiBzaG91bGQgY29udGFpbiB0aGUgbnVtYmVyIG9mIHRoZSBkaXNwbGF5IGFkYXB0ZXIgdG8gdXNlLgotSWYgdGhpcyBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgYWRhcHRlciBpcyB1c2VkLgotCi1AaXRlbSBxc3YKLUZvciBRU1YsIHRoaXMgb3B0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSB2YWx1cyBvZiBNRlhfSU1QTF8qIC4gQWxsb3dlZCB2YWx1ZXMKLWFyZToKLUB0YWJsZSBAb3B0aW9uCi1AaXRlbSBhdXRvCi1AaXRlbSBzdwotQGl0ZW0gaHcKLUBpdGVtIGF1dG9fYW55Ci1AaXRlbSBod19hbnkKLUBpdGVtIGh3MgotQGl0ZW0gaHczCi1AaXRlbSBodzQKLUBlbmQgdGFibGUKLUBlbmQgdGFibGUKK1RoaXMgb3B0aW9uIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiB0aGUgQG9wdGlvbnstaHdhY2NlbH0gb3B0aW9uIGlzIGFsc28gc3BlY2lmaWVkLgorSXQgY2FuIGVpdGhlciByZWZlciB0byBhbiBleGlzdGluZyBkZXZpY2UgY3JlYXRlZCB3aXRoIEBvcHRpb257LWluaXRfaHdfZGV2aWNlfQorYnkgbmFtZSwgb3IgaXQgY2FuIGNyZWF0ZSBhIG5ldyBkZXZpY2UgYXMgaWYKK0BzYW1wey1pbml0X2h3X2RldmljZX0gQHZhcnt0eXBlfTpAdmFye2h3YWNjZWxfZGV2aWNlfQord2VyZSBjYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlLgogCiBAaXRlbSAtaHdhY2NlbHMKIExpc3QgYWxsIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBtZXRob2RzIHN1cHBvcnRlZCBpbiB0aGlzIGJ1aWxkIG9mIGZmbXBlZy4KQEAgLTc0Myw3ICs4NzYsOCBAQAogCiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gLWFmcmFtZXMgQHZhcntudW1iZXJ9IChAZW1waHtvdXRwdXR9KQotU2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHRvIG91dHB1dC4gVGhpcyBpcyBhbiBhbGlhcyBmb3IgQGNvZGV7LWZyYW1lczphfS4KK1NldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB0byBvdXRwdXQuIFRoaXMgaXMgYW4gb2Jzb2xldGUgYWxpYXMgZm9yCitAY29kZXstZnJhbWVzOmF9LCB3aGljaCB5b3Ugc2hvdWxkIHVzZSBpbnN0ZWFkLgogQGl0ZW0gLWFyWzpAdmFye3N0cmVhbV9zcGVjaWZpZXJ9XSBAdmFye2ZyZXF9IChAZW1waHtpbnB1dC9vdXRwdXQscGVyLXN0cmVhbX0pCiBTZXQgdGhlIGF1ZGlvIHNhbXBsaW5nIGZyZXF1ZW5jeS4gRm9yIG91dHB1dCBzdHJlYW1zIGl0IGlzIHNldCBieQogZGVmYXVsdCB0byB0aGUgZnJlcXVlbmN5IG9mIHRoZSBjb3JyZXNwb25kaW5nIGlucHV0IHN0cmVhbS4gRm9yIGlucHV0CkBAIC03NTcsNyArODkxLDggQEAKIHRoaXMgb3B0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIGF1ZGlvIGdyYWJiaW5nIGRldmljZXMgYW5kIHJhdyBkZW11eGVycwogYW5kIGlzIG1hcHBlZCB0byB0aGUgY29ycmVzcG9uZGluZyBkZW11eGVyIG9wdGlvbnMuCiBAaXRlbSAtYW4gKEBlbXBoe291dHB1dH0pCi1EaXNhYmxlIGF1ZGlvIHJlY29yZGluZy4KK0Rpc2FibGUgYXVkaW8gcmVjb3JkaW5nLiBGb3IgZnVsbCBtYW51YWwgY29udHJvbCBzZWUgdGhlIEBjb2Rley1tYXB9CitvcHRpb24uCiBAaXRlbSAtYWNvZGVjIEB2YXJ7Y29kZWN9IChAZW1waHtpbnB1dC9vdXRwdXR9KQogU2V0IHRoZSBhdWRpbyBjb2RlYy4gVGhpcyBpcyBhbiBhbGlhcyBmb3IgQGNvZGV7LWNvZGVjOmF9LgogQGl0ZW0gLXNhbXBsZV9mbXRbOkB2YXJ7c3RyZWFtX3NwZWNpZmllcn1dIEB2YXJ7c2FtcGxlX2ZtdH0gKEBlbXBoe291dHB1dCxwZXItc3RyZWFtfSkKQEAgLTc5Miw3ICs5MjcsOCBAQAogQGl0ZW0gLXNjb2RlYyBAdmFye2NvZGVjfSAoQGVtcGh7aW5wdXQvb3V0cHV0fSkKIFNldCB0aGUgc3VidGl0bGUgY29kZWMuIFRoaXMgaXMgYW4gYWxpYXMgZm9yIEBjb2Rley1jb2RlYzpzfS4KIEBpdGVtIC1zbiAoQGVtcGh7b3V0cHV0fSkKLURpc2FibGUgc3VidGl0bGUgcmVjb3JkaW5nLgorRGlzYWJsZSBzdWJ0aXRsZSByZWNvcmRpbmcuIEZvciBmdWxsIG1hbnVhbCBjb250cm9sIHNlZSB0aGUgQGNvZGV7LW1hcH0KK29wdGlvbi4KIEBpdGVtIC1zYnNmIEB2YXJ7Yml0c3RyZWFtX2ZpbHRlcn0KIERlcHJlY2F0ZWQsIHNlZSAtYnNmCiBAZW5kIHRhYmxlCkBAIC04MjIsNyArOTU4LDcgQEAKIEBzZWN0aW9uIEFkdmFuY2VkIG9wdGlvbnMKIAogQHRhYmxlIEBvcHRpb24KLUBpdGVtIC1tYXAgWy1dQHZhcntpbnB1dF9maWxlX2lkfVs6QHZhcntzdHJlYW1fc3BlY2lmaWVyfV1bLEB2YXJ7c3luY19maWxlX2lkfVs6QHZhcntzdHJlYW1fc3BlY2lmaWVyfV1dIHwgQHZhcntbbGlua2xhYmVsXX0gKEBlbXBoe291dHB1dH0pCitAaXRlbSAtbWFwIFstXUB2YXJ7aW5wdXRfZmlsZV9pZH1bOkB2YXJ7c3RyZWFtX3NwZWNpZmllcn1dWz9dWyxAdmFye3N5bmNfZmlsZV9pZH1bOkB2YXJ7c3RyZWFtX3NwZWNpZmllcn1dXSB8IEB2YXJ7W2xpbmtsYWJlbF19IChAZW1waHtvdXRwdXR9KQogCiBEZXNpZ25hdGUgb25lIG9yIG1vcmUgaW5wdXQgc3RyZWFtcyBhcyBhIHNvdXJjZSBmb3IgdGhlIG91dHB1dCBmaWxlLiBFYWNoIGlucHV0CiBzdHJlYW0gaXMgaWRlbnRpZmllZCBieSB0aGUgaW5wdXQgZmlsZSBpbmRleCBAdmFye2lucHV0X2ZpbGVfaWR9IGFuZApAQCAtODM4LDYgKzk3NCwxMSBAQAogQSBAY29kZXstfSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBzdHJlYW0gaWRlbnRpZmllciBjcmVhdGVzIGEgIm5lZ2F0aXZlIiBtYXBwaW5nLgogSXQgZGlzYWJsZXMgbWF0Y2hpbmcgc3RyZWFtcyBmcm9tIGFscmVhZHkgY3JlYXRlZCBtYXBwaW5ncy4KIAorQSB0cmFpbGluZyBAY29kZXs/fSBhZnRlciB0aGUgc3RyZWFtIGluZGV4IHdpbGwgYWxsb3cgdGhlIG1hcCB0byBiZQorb3B0aW9uYWw6IGlmIHRoZSBtYXAgbWF0Y2hlcyBubyBzdHJlYW1zIHRoZSBtYXAgd2lsbCBiZSBpZ25vcmVkIGluc3RlYWQKK29mIGZhaWxpbmcuIE5vdGUgdGhlIG1hcCB3aWxsIHN0aWxsIGZhaWwgaWYgYW4gaW52YWxpZCBpbnB1dCBmaWxlIGluZGV4CitpcyB1c2VkOyBzdWNoIGFzIGlmIHRoZSBtYXAgcmVmZXJzIHRvIGEgbm9uLWV4aXN0ZW50IGlucHV0LgorCiBBbiBhbHRlcm5hdGl2ZSBAdmFye1tsaW5rbGFiZWxdfSBmb3JtIHdpbGwgbWFwIG91dHB1dHMgZnJvbSBjb21wbGV4IGZpbHRlcgogZ3JhcGhzIChzZWUgdGhlIEBvcHRpb257LWZpbHRlcl9jb21wbGV4fSBvcHRpb24pIHRvIHRoZSBvdXRwdXQgZmlsZS4KIEB2YXJ7bGlua2xhYmVsfSBtdXN0IGNvcnJlc3BvbmQgdG8gYSBkZWZpbmVkIG91dHB1dCBsaW5rIGxhYmVsIGluIHRoZSBncmFwaC4KQEAgLTg3NSw2ICsxMDE2LDEzIEBACiBmZm1wZWcgLWkgSU5QVVQgLW1hcCAwIC1tYXAgLTA6YToxIE9VVFBVVAogQGVuZCBleGFtcGxlCiAKK1RvIG1hcCB0aGUgdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgZnJvbSB0aGUgZmlyc3QgaW5wdXQsIGFuZCB1c2luZyB0aGUKK3RyYWlsaW5nIEBjb2Rlez99LCBpZ25vcmUgdGhlIGF1ZGlvIG1hcHBpbmcgaWYgbm8gYXVkaW8gc3RyZWFtcyBleGlzdCBpbgordGhlIGZpcnN0IGlucHV0OgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBJTlBVVCAtbWFwIDA6diAtbWFwIDA6YT8gT1VUUFVUCitAZW5kIGV4YW1wbGUKKwogVG8gcGljayB0aGUgRW5nbGlzaCBhdWRpbyBzdHJlYW06CiBAZXhhbXBsZQogZmZtcGVnIC1pIElOUFVUIC1tYXAgMDptOmxhbmd1YWdlOmVuZyBPVVRQVVQKQEAgLTg5MCw3ICsxMDM4LDcgQEAKIEFsbG93IGlucHV0IHN0cmVhbXMgd2l0aCB1bmtub3duIHR5cGUgdG8gYmUgY29waWVkIGluc3RlYWQgb2YgZmFpbGluZyBpZiBjb3B5aW5nCiBzdWNoIHN0cmVhbXMgaXMgYXR0ZW1wdGVkLgogCi1AaXRlbSAtbWFwX2NoYW5uZWwgW0B2YXJ7aW5wdXRfZmlsZV9pZH0uQHZhcntzdHJlYW1fc3BlY2lmaWVyfS5AdmFye2NoYW5uZWxfaWR9fC0xXVs6QHZhcntvdXRwdXRfZmlsZV9pZH0uQHZhcntzdHJlYW1fc3BlY2lmaWVyfV0KK0BpdGVtIC1tYXBfY2hhbm5lbCBbQHZhcntpbnB1dF9maWxlX2lkfS5AdmFye3N0cmVhbV9zcGVjaWZpZXJ9LkB2YXJ7Y2hhbm5lbF9pZH18LTFdWz9dWzpAdmFye291dHB1dF9maWxlX2lkfS5AdmFye3N0cmVhbV9zcGVjaWZpZXJ9XQogTWFwIGFuIGF1ZGlvIGNoYW5uZWwgZnJvbSBhIGdpdmVuIGlucHV0IHRvIGFuIG91dHB1dC4gSWYKIEB2YXJ7b3V0cHV0X2ZpbGVfaWR9LkB2YXJ7c3RyZWFtX3NwZWNpZmllcn0gaXMgbm90IHNldCwgdGhlIGF1ZGlvIGNoYW5uZWwgd2lsbAogYmUgbWFwcGVkIG9uIGFsbCB0aGUgYXVkaW8gc3RyZWFtcy4KQEAgLTg5OSw2ICsxMDQ3LDEwIEBACiBAdmFye2lucHV0X2ZpbGVfaWR9LkB2YXJ7c3RyZWFtX3NwZWNpZmllcn0uQHZhcntjaGFubmVsX2lkfSB3aWxsIG1hcCBhIG11dGVkCiBjaGFubmVsLgogCitBIHRyYWlsaW5nIEBjb2Rlez99IHdpbGwgYWxsb3cgdGhlIG1hcF9jaGFubmVsIHRvIGJlCitvcHRpb25hbDogaWYgdGhlIG1hcF9jaGFubmVsIG1hdGNoZXMgbm8gY2hhbm5lbCB0aGUgbWFwX2NoYW5uZWwgd2lsbCBiZSBpZ25vcmVkIGluc3RlYWQKK29mIGZhaWxpbmcuCisKIEZvciBleGFtcGxlLCBhc3N1bWluZyBAdmFye0lOUFVUfSBpcyBhIHN0ZXJlbyBhdWRpbyBmaWxlLCB5b3UgY2FuIHN3aXRjaCB0aGUKIHR3byBhdWRpbyBjaGFubmVscyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKIEBleGFtcGxlCkBAIC05NDYsNiArMTA5OCwxMyBAQAogZmZtcGVnIC1pIGlucHV0Lm1rdiAtZmlsdGVyX2NvbXBsZXggIlswOjFdIFswOjJdIGFtZXJnZSIgLWM6YSBwY21fczE2bGUgLWM6diBjb3B5IG91dHB1dC5ta3YKIEBlbmQgZXhhbXBsZQogCitUbyBtYXAgdGhlIGZpcnN0IHR3byBhdWRpbyBjaGFubmVscyBmcm9tIHRoZSBmaXJzdCBpbnB1dCwgYW5kIHVzaW5nIHRoZQordHJhaWxpbmcgQGNvZGV7P30sIGlnbm9yZSB0aGUgYXVkaW8gY2hhbm5lbCBtYXBwaW5nIGlmIHRoZSBmaXJzdCBpbnB1dCBpcworbW9ubyBpbnN0ZWFkIG9mIHN0ZXJlbzoKK0BleGFtcGxlCitmZm1wZWcgLWkgSU5QVVQgLW1hcF9jaGFubmVsIDAuMC4wIC1tYXBfY2hhbm5lbCAwLjAuMT8gT1VUUFVUCitAZW5kIGV4YW1wbGUKKwogQGl0ZW0gLW1hcF9tZXRhZGF0YVs6QHZhcnttZXRhZGF0YV9zcGVjX291dH1dIEB2YXJ7aW5maWxlfVs6QHZhcnttZXRhZGF0YV9zcGVjX2lufV0gKEBlbXBoe291dHB1dCxwZXItbWV0YWRhdGF9KQogU2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIG9mIHRoZSBuZXh0IG91dHB1dCBmaWxlIGZyb20gQHZhcntpbmZpbGV9LiBOb3RlIHRoYXQKIHRob3NlIGFyZSBmaWxlIGluZGljZXMgKHplcm8tYmFzZWQpLCBub3QgZmlsZW5hbWVzLgpAQCAtMTAwOCwxNyArMTE2NywxMyBAQAogQGl0ZW0gLWhleCAoQGVtcGh7Z2xvYmFsfSkKIFdoZW4gZHVtcGluZyBwYWNrZXRzLCBhbHNvIGR1bXAgdGhlIHBheWxvYWQuCiBAaXRlbSAtcmUgKEBlbXBoe2lucHV0fSkKLVJlYWQgaW5wdXQgYXQgbmF0aXZlIGZyYW1lIHJhdGUuIE1haW5seSB1c2VkIHRvIHNpbXVsYXRlIGEgZ3JhYiBkZXZpY2UuCitSZWFkIGlucHV0IGF0IG5hdGl2ZSBmcmFtZSByYXRlLiBNYWlubHkgdXNlZCB0byBzaW11bGF0ZSBhIGdyYWIgZGV2aWNlLAogb3IgbGl2ZSBpbnB1dCBzdHJlYW0gKGUuZy4gd2hlbiByZWFkaW5nIGZyb20gYSBmaWxlKS4gU2hvdWxkIG5vdCBiZSB1c2VkCiB3aXRoIGFjdHVhbCBncmFiIGRldmljZXMgb3IgbGl2ZSBpbnB1dCBzdHJlYW1zICh3aGVyZSBpdCBjYW4gY2F1c2UgcGFja2V0CiBsb3NzKS4KIEJ5IGRlZmF1bHQgQGNvbW1hbmR7ZmZtcGVnfSBhdHRlbXB0cyB0byByZWFkIHRoZSBpbnB1dChzKSBhcyBmYXN0IGFzIHBvc3NpYmxlLgogVGhpcyBvcHRpb24gd2lsbCBzbG93IGRvd24gdGhlIHJlYWRpbmcgb2YgdGhlIGlucHV0KHMpIHRvIHRoZSBuYXRpdmUgZnJhbWUgcmF0ZQogb2YgdGhlIGlucHV0KHMpLiBJdCBpcyB1c2VmdWwgZm9yIHJlYWwtdGltZSBvdXRwdXQgKGUuZy4gbGl2ZSBzdHJlYW1pbmcpLgotQGl0ZW0gLWxvb3BfaW5wdXQKLUxvb3Agb3ZlciB0aGUgaW5wdXQgc3RyZWFtLiBDdXJyZW50bHkgaXQgd29ya3Mgb25seSBmb3IgaW1hZ2UKLXN0cmVhbXMuIFRoaXMgb3B0aW9uIGlzIHVzZWQgZm9yIGF1dG9tYXRpYyBGRnNlcnZlciB0ZXN0aW5nLgotVGhpcyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1sb29wIDEuCiBAaXRlbSAtbG9vcF9vdXRwdXQgQHZhcntudW1iZXJfb2ZfdGltZXN9CiBSZXBlYXRlZGx5IGxvb3Agb3V0cHV0IGZvciBmb3JtYXRzIHRoYXQgc3VwcG9ydCBsb29waW5nIHN1Y2ggYXMgYW5pbWF0ZWQgR0lGCiAoMCB3aWxsIGxvb3AgdGhlIG91dHB1dCBpbmZpbml0ZWx5KS4KQEAgLTExMTIsNiArMTI2NywzMiBAQAogCiBEZWZhdWx0IHZhbHVlIGlzIC0xLgogCitAaXRlbSAtZW5jX3RpbWVfYmFzZVs6QHZhcntzdHJlYW1fc3BlY2lmaWVyfV0gQHZhcnt0aW1lYmFzZX0gKEBlbXBoe291dHB1dCxwZXItc3RyZWFtfSkKK1NldCB0aGUgZW5jb2RlciB0aW1lYmFzZS4gQHZhcnt0aW1lYmFzZX0gaXMgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsCithbmQgY2FuIGFzc3VtZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSAwCitBc3NpZ24gYSBkZWZhdWx0IHZhbHVlIGFjY29yZGluZyB0byB0aGUgbWVkaWEgdHlwZS4KKworRm9yIHZpZGVvIC0gdXNlIDEvZnJhbWVyYXRlLCBmb3IgYXVkaW8gLSB1c2UgMS9zYW1wbGVyYXRlLgorCitAaXRlbSAtMQorVXNlIHRoZSBpbnB1dCBzdHJlYW0gdGltZWJhc2Ugd2hlbiBwb3NzaWJsZS4KKworSWYgYW4gaW5wdXQgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBkZWZhdWx0IHRpbWViYXNlIHdpbGwgYmUgdXNlZC4KKworQGl0ZW0gPjAKK1VzZSB0aGUgcHJvdmlkZWQgbnVtYmVyIGFzIHRoZSB0aW1lYmFzZS4KKworVGhpcyBmaWVsZCBjYW4gYmUgcHJvdmlkZWQgYXMgYSByYXRpbyBvZiB0d28gaW50ZWdlcnMgKGUuZy4gMToyNCwgMTo0ODAwMCkKK29yIGFzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIChlLmcuIDAuMDQxNjYsIDIuMDgzM2UtNSkKK0BlbmQgdGFibGUKKworRGVmYXVsdCB2YWx1ZSBpcyAwLgorCitAaXRlbSAtYml0ZXhhY3QgKEBlbXBoe2lucHV0L291dHB1dH0pCitFbmFibGUgYml0ZXhhY3QgbW9kZSBmb3IgKGRlKW11eGVyIGFuZCAoZGUvZW4pY29kZXIKIEBpdGVtIC1zaG9ydGVzdCAoQGVtcGh7b3V0cHV0fSkKIEZpbmlzaCBlbmNvZGluZyB3aGVuIHRoZSBzaG9ydGVzdCBpbnB1dCBzdHJlYW0gZW5kcy4KIEBpdGVtIC1kdHNfZGVsdGFfdGhyZXNob2xkCkBAIC0xMTI5LDcgKzEzMTAsNyBAQAogRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUgc3RyZWFtIDAgUElEIHRvIDMzIGFuZCB0aGUgc3RyZWFtIDEgUElEIHRvIDM2IGZvcgogYW4gb3V0cHV0IG1wZWd0cyBmaWxlOgogQGV4YW1wbGUKLWZmbXBlZyAtaSBpbmZpbGUgLXN0cmVhbWlkIDA6MzMgLXN0cmVhbWlkIDE6MzYgb3V0LnRzCitmZm1wZWcgLWkgaW51cmwgLXN0cmVhbWlkIDA6MzMgLXN0cmVhbWlkIDE6MzYgb3V0LnRzCiBAZW5kIGV4YW1wbGUKIAogQGl0ZW0gLWJzZls6QHZhcntzdHJlYW1fc3BlY2lmaWVyfV0gQHZhcntiaXRzdHJlYW1fZmlsdGVyc30gKEBlbXBoe291dHB1dCxwZXItc3RyZWFtfSkKQEAgLTEyMDEsNiArMTM4MiwxMSBAQAogZmZtcGVnIC1maWx0ZXJfY29tcGxleCAnY29sb3I9Yz1yZWQnIC10IDUgb3V0Lm1rdgogQGVuZCBleGFtcGxlCiAKK0BpdGVtIC1maWx0ZXJfY29tcGxleF90aHJlYWRzIEB2YXJ7bmJfdGhyZWFkc30gKEBlbXBoe2dsb2JhbH0pCitEZWZpbmVzIGhvdyBtYW55IHRocmVhZHMgYXJlIHVzZWQgdG8gcHJvY2VzcyBhIGZpbHRlcl9jb21wbGV4IGdyYXBoLgorU2ltaWxhciB0byBmaWx0ZXJfdGhyZWFkcyBidXQgdXNlZCBmb3IgQGNvZGV7LWZpbHRlcl9jb21wbGV4fSBncmFwaHMgb25seS4KK1RoZSBkZWZhdWx0IGlzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIENQVXMuCisKIEBpdGVtIC1sYXZmaSBAdmFye2ZpbHRlcmdyYXBofSAoQGVtcGh7Z2xvYmFsfSkKIERlZmluZSBhIGNvbXBsZXggZmlsdGVyZ3JhcGgsIGkuZS4gb25lIHdpdGggYXJiaXRyYXJ5IG51bWJlciBvZiBpbnB1dHMgYW5kL29yCiBvdXRwdXRzLiBFcXVpdmFsZW50IHRvIEBvcHRpb257LWZpbHRlcl9jb21wbGV4fS4KQEAgLTEyMjksMTYgKzE0MTUsNiBAQAogZGlzY2FyZGVkIGlmIHRoZXkgYXJlIG5vdCByZWFkIGluIGEgdGltZWx5IG1hbm5lcjsgcmFpc2luZyB0aGlzIHZhbHVlIGNhbgogYXZvaWQgaXQuCiAKLUBpdGVtIC1vdmVycmlkZV9mZnNlcnZlciAoQGVtcGh7Z2xvYmFsfSkKLU92ZXJyaWRlcyB0aGUgaW5wdXQgc3BlY2lmaWNhdGlvbnMgZnJvbSBAY29tbWFuZHtmZnNlcnZlcn0uIFVzaW5nIHRoaXMKLW9wdGlvbiB5b3UgY2FuIG1hcCBhbnkgaW5wdXQgc3RyZWFtIHRvIEBjb21tYW5ke2Zmc2VydmVyfSBhbmQgY29udHJvbAotbWFueSBhc3BlY3RzIG9mIHRoZSBlbmNvZGluZyBmcm9tIEBjb21tYW5ke2ZmbXBlZ30uIFdpdGhvdXQgdGhpcwotb3B0aW9uIEBjb21tYW5ke2ZmbXBlZ30gd2lsbCB0cmFuc21pdCB0byBAY29tbWFuZHtmZnNlcnZlcn0gd2hhdCBpcwotcmVxdWVzdGVkIGJ5IEBjb21tYW5ke2Zmc2VydmVyfS4KLQotVGhlIG9wdGlvbiBpcyBpbnRlbmRlZCBmb3IgY2FzZXMgd2hlcmUgZmVhdHVyZXMgYXJlIG5lZWRlZCB0aGF0IGNhbm5vdCBiZQotc3BlY2lmaWVkIHRvIEBjb21tYW5ke2Zmc2VydmVyfSBidXQgY2FuIGJlIHRvIEBjb21tYW5ke2ZmbXBlZ30uCi0KIEBpdGVtIC1zZHBfZmlsZSBAdmFye2ZpbGV9IChAZW1waHtnbG9iYWx9KQogUHJpbnQgc2RwIGluZm9ybWF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHRvIEB2YXJ7ZmlsZX0uCiBUaGlzIGFsbG93cyBkdW1waW5nIHNkcCBpbmZvcm1hdGlvbiB3aGVuIGF0IGxlYXN0IG9uZSBvdXRwdXQgaXNuJ3QgYW4KQEAgLTEyNzksNiArMTQ1NSwxNSBAQAogQGl0ZW0gLXhlcnJvciAoQGVtcGh7Z2xvYmFsfSkKIFN0b3AgYW5kIGV4aXQgb24gZXJyb3IKIAorQGl0ZW0gLW1heF9tdXhpbmdfcXVldWVfc2l6ZSBAdmFye3BhY2tldHN9IChAZW1waHtvdXRwdXQscGVyLXN0cmVhbX0pCitXaGVuIHRyYW5zY29kaW5nIGF1ZGlvIGFuZC9vciB2aWRlbyBzdHJlYW1zLCBmZm1wZWcgd2lsbCBub3QgYmVnaW4gd3JpdGluZyBpbnRvCit0aGUgb3V0cHV0IHVudGlsIGl0IGhhcyBvbmUgcGFja2V0IGZvciBlYWNoIHN1Y2ggc3RyZWFtLiBXaGlsZSB3YWl0aW5nIGZvciB0aGF0Cit0byBoYXBwZW4sIHBhY2tldHMgZm9yIG90aGVyIHN0cmVhbXMgYXJlIGJ1ZmZlcmVkLiBUaGlzIG9wdGlvbiBzZXRzIHRoZSBzaXplIG9mCit0aGlzIGJ1ZmZlciwgaW4gcGFja2V0cywgZm9yIHRoZSBtYXRjaGluZyBvdXRwdXQgc3RyZWFtLgorCitUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIG9wdGlvbiBzaG91bGQgYmUgaGlnaCBlbm91Z2ggZm9yIG1vc3QgdXNlcywgc28gb25seQordG91Y2ggdGhpcyBvcHRpb24gaWYgeW91IGFyZSBzdXJlIHRoYXQgeW91IG5lZWQgaXQuCisKIEBlbmQgdGFibGUKIAogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgeW91IGNhbiB1c2UgYSBiaXRtYXAgc3VidGl0bGUgc3RyZWFtIGFzIGlucHV0OiBpdApAQCAtMTQ4NCw3ICsxNjY5LDcgQEAKIFRoZSBtYXBwaW5nIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIERWRCB0cmFuc2NvZGluZwogdG8gZ2V0IHRoZSBkZXNpcmVkIGF1ZGlvIGxhbmd1YWdlLgogCi1OT1RFOiBUbyBzZWUgdGhlIHN1cHBvcnRlZCBpbnB1dCBmb3JtYXRzLCB1c2UgQGNvZGV7ZmZtcGVnIC1mb3JtYXRzfS4KK05PVEU6IFRvIHNlZSB0aGUgc3VwcG9ydGVkIGlucHV0IGZvcm1hdHMsIHVzZSBAY29kZXtmZm1wZWcgLWRlbXV4ZXJzfS4KIAogQGl0ZW0KIFlvdSBjYW4gZXh0cmFjdCBpbWFnZXMgZnJvbSBhIHZpZGVvLCBvciBjcmVhdGUgYSB2aWRlbyBmcm9tIG1hbnkgaW1hZ2VzOgpAQCAtMTQ5OSw4ICsxNjg0LDggQEAKIGV0Yy4gSW1hZ2VzIHdpbGwgYmUgcmVzY2FsZWQgdG8gZml0IHRoZSBuZXcgV3hIIHZhbHVlcy4KIAogSWYgeW91IHdhbnQgdG8gZXh0cmFjdCBqdXN0IGEgbGltaXRlZCBudW1iZXIgb2YgZnJhbWVzLCB5b3UgY2FuIHVzZSB0aGUKLWFib3ZlIGNvbW1hbmQgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgLXZmcmFtZXMgb3IgLXQgb3B0aW9uLCBvciBpbgotY29tYmluYXRpb24gd2l0aCAtc3MgdG8gc3RhcnQgZXh0cmFjdGluZyBmcm9tIGEgY2VydGFpbiBwb2ludCBpbiB0aW1lLgorYWJvdmUgY29tbWFuZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBAY29kZXstZnJhbWVzOnZ9IG9yIEBjb2Rley10fSBvcHRpb24sCitvciBpbiBjb21iaW5hdGlvbiB3aXRoIC1zcyB0byBzdGFydCBleHRyYWN0aW5nIGZyb20gYSBjZXJ0YWluIHBvaW50IGluIHRpbWUuCiAKIEZvciBjcmVhdGluZyBhIHZpZGVvIGZyb20gbWFueSBpbWFnZXM6CiBAZXhhbXBsZQpAQCAtMTU4NCw3ICsxNzY5LDcgQEAKIEBpZnNldCBjb25maWctbm90LWFsbAogQHVybHtmZm1wZWctYWxsLmh0bWwsZmZtcGVnLWFsbH0sCiBAZW5kIGlmc2V0Ci1AdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LCBAdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAorQHVybHtmZnBsYXkuaHRtbCxmZnBsYXl9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwKIEB1cmx7ZmZtcGVnLXV0aWxzLmh0bWwsZmZtcGVnLXV0aWxzfSwKIEB1cmx7ZmZtcGVnLXNjYWxlci5odG1sLGZmbXBlZy1zY2FsZXJ9LAogQHVybHtmZm1wZWctcmVzYW1wbGVyLmh0bWwsZmZtcGVnLXJlc2FtcGxlcn0sCkBAIC0xNjAzLDcgKzE3ODgsNyBAQAogQGlmc2V0IGNvbmZpZy1ub3QtYWxsCiBmZm1wZWctYWxsKDEpLAogQGVuZCBpZnNldAotZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwKK2ZmcGxheSgxKSwgZmZwcm9iZSgxKSwKIGZmbXBlZy11dGlscygxKSwgZmZtcGVnLXNjYWxlcigxKSwgZmZtcGVnLXJlc2FtcGxlcigxKSwKIGZmbXBlZy1jb2RlY3MoMSksIGZmbXBlZy1iaXRzdHJlYW0tZmlsdGVycygxKSwgZmZtcGVnLWZvcm1hdHMoMSksCiBmZm1wZWctZGV2aWNlcygxKSwgZmZtcGVnLXByb3RvY29scygxKSwgZmZtcGVnLWZpbHRlcnMoMSkKZGlmZiAtLWdpdCBhL2RvYy9mZnBsYXkudGV4aSBiL2RvYy9mZnBsYXkudGV4aQppbmRleCA0YmMzY2VkLi5jOTU5NTZlIDEwMDY0NAotLS0gYS9kb2MvZmZwbGF5LnRleGkKKysrIGIvZG9jL2ZmcGxheS50ZXhpCkBAIC0xMiw3ICsxMiw3IEBACiAKIEBjaGFwdGVyIFN5bm9wc2lzCiAKLWZmcGxheSBbQHZhcntvcHRpb25zfV0gW0BmaWxle2lucHV0X2ZpbGV9XQorZmZwbGF5IFtAdmFye29wdGlvbnN9XSBbQGZpbGV7aW5wdXRfdXJsfV0KIAogQGNoYXB0ZXIgRGVzY3JpcHRpb24KIEBjIG1hbiBiZWdpbiBERVNDUklQVElPTgpAQCAtNjIsNiArNjIsMTIgQEAKIFNlZWsgYnkgYnl0ZXMuCiBAaXRlbSAtbm9kaXNwCiBEaXNhYmxlIGdyYXBoaWNhbCBkaXNwbGF5LgorQGl0ZW0gLW5vYm9yZGVyCitCb3JkZXJsZXNzIHdpbmRvdy4KK0BpdGVtIC12b2x1bWUKK1NldCB0aGUgc3RhcnR1cCB2b2x1bWUuIDAgbWVhbnMgc2lsZW5jZSwgMTAwIG1lYW5zIG5vIHZvbHVtZSByZWR1Y3Rpb24gb3IKK2FtcGxpZmljYXRpb24uIE5lZ2F0aXZlIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyAwLCB2YWx1ZXMgYWJvdmUgMTAwIGFyZSB0cmVhdGVkCithcyAxMDAuCiBAaXRlbSAtZiBAdmFye2ZtdH0KIEZvcmNlIGZvcm1hdC4KIEBpdGVtIC13aW5kb3dfdGl0bGUgQHZhcnt0aXRsZX0KQEAgLTEwNiw4ICsxMTIsOCBAQAogVXNlIHRoZSBvcHRpb24gIi1maWx0ZXJzIiB0byBzaG93IGFsbCB0aGUgYXZhaWxhYmxlIGZpbHRlcnMgKGluY2x1ZGluZwogc291cmNlcyBhbmQgc2lua3MpLgogCi1AaXRlbSAtaSBAdmFye2lucHV0X2ZpbGV9Ci1SZWFkIEB2YXJ7aW5wdXRfZmlsZX0uCitAaXRlbSAtaSBAdmFye2lucHV0X3VybH0KK1JlYWQgQHZhcntpbnB1dF91cmx9LgogQGVuZCB0YWJsZQogCiBAc2VjdGlvbiBBZHZhbmNlZCBvcHRpb25zCkBAIC0yODUsNyArMjkxLDcgQEAKIEBpZnNldCBjb25maWctbm90LWFsbAogQHVybHtmZnBsYXktYWxsLmh0bWwsZmZtcGVnLWFsbH0sCiBAZW5kIGlmc2V0Ci1AdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LCBAdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAorQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcHJvYmUuaHRtbCxmZnByb2JlfSwKIEB1cmx7ZmZtcGVnLXV0aWxzLmh0bWwsZmZtcGVnLXV0aWxzfSwKIEB1cmx7ZmZtcGVnLXNjYWxlci5odG1sLGZmbXBlZy1zY2FsZXJ9LAogQHVybHtmZm1wZWctcmVzYW1wbGVyLmh0bWwsZmZtcGVnLXJlc2FtcGxlcn0sCkBAIC0zMDQsNyArMzEwLDcgQEAKIEBpZnNldCBjb25maWctbm90LWFsbAogZmZwbGF5LWFsbCgxKSwKIEBlbmQgaWZzZXQKLWZmbXBlZygxKSwgZmZwcm9iZSgxKSwgZmZzZXJ2ZXIoMSksCitmZm1wZWcoMSksIGZmcHJvYmUoMSksCiBmZm1wZWctdXRpbHMoMSksIGZmbXBlZy1zY2FsZXIoMSksIGZmbXBlZy1yZXNhbXBsZXIoMSksCiBmZm1wZWctY29kZWNzKDEpLCBmZm1wZWctYml0c3RyZWFtLWZpbHRlcnMoMSksIGZmbXBlZy1mb3JtYXRzKDEpLAogZmZtcGVnLWRldmljZXMoMSksIGZmbXBlZy1wcm90b2NvbHMoMSksIGZmbXBlZy1maWx0ZXJzKDEpCmRpZmYgLS1naXQgYS9kb2MvZmZwcm9iZS50ZXhpIGIvZG9jL2ZmcHJvYmUudGV4aQppbmRleCAyMDI0ZWVkLi40ZTlmMTg0IDEwMDY0NAotLS0gYS9kb2MvZmZwcm9iZS50ZXhpCisrKyBiL2RvYy9mZnByb2JlLnRleGkKQEAgLTEyLDcgKzEyLDcgQEAKIAogQGNoYXB0ZXIgU3lub3BzaXMKIAotZmZwcm9iZSBbQHZhcntvcHRpb25zfV0gW0BmaWxle2lucHV0X2ZpbGV9XQorZmZwcm9iZSBbQHZhcntvcHRpb25zfV0gW0BmaWxle2lucHV0X3VybH1dCiAKIEBjaGFwdGVyIERlc2NyaXB0aW9uCiBAYyBtYW4gYmVnaW4gREVTQ1JJUFRJT04KQEAgLTI0LDggKzI0LDggQEAKIGJ5IGEgbXVsdGltZWRpYSBzdHJlYW0gYW5kIHRoZSBmb3JtYXQgYW5kIHR5cGUgb2YgZWFjaCBtZWRpYSBzdHJlYW0KIGNvbnRhaW5lZCBpbiBpdC4KIAotSWYgYSBmaWxlbmFtZSBpcyBzcGVjaWZpZWQgaW4gaW5wdXQsIGZmcHJvYmUgd2lsbCB0cnkgdG8gb3BlbiBhbmQKLXByb2JlIHRoZSBmaWxlIGNvbnRlbnQuIElmIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgb3IgcmVjb2duaXplZCBhcworSWYgYSB1cmwgaXMgc3BlY2lmaWVkIGluIGlucHV0LCBmZnByb2JlIHdpbGwgdHJ5IHRvIG9wZW4gYW5kCitwcm9iZSB0aGUgdXJsIGNvbnRlbnQuIElmIHRoZSB1cmwgY2Fubm90IGJlIG9wZW5lZCBvciByZWNvZ25pemVkIGFzCiBhIG11bHRpbWVkaWEgZmlsZSwgYSBwb3NpdGl2ZSBleGl0IGNvZGUgaXMgcmV0dXJuZWQuCiAKIGZmcHJvYmUgbWF5IGJlIGVtcGxveWVkIGJvdGggYXMgYSBzdGFuZGFsb25lIGFwcGxpY2F0aW9uIG9yIGluCkBAIC0yMDgsNiArMjA4LDEzIEBACiBUaGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggc2luZ2xlIGZyYW1lIGlzIHByaW50ZWQgd2l0aGluIGEgZGVkaWNhdGVkCiBzZWN0aW9uIHdpdGggbmFtZSAiRlJBTUUiIG9yICJTVUJUSVRMRSIuCiAKK0BpdGVtIC1zaG93X2xvZyBAdmFye2xvZ2xldmVsfQorU2hvdyBsb2dnaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGRlY29kZXIgYWJvdXQgZWFjaCBmcmFtZSBhY2NvcmRpbmcgdG8KK3RoZSB2YWx1ZSBzZXQgaW4gQHZhcntsb2dsZXZlbH0sIChzZWUgQGNvZGV7LWxvZ2xldmVsfSkuIFRoaXMgb3B0aW9uIHJlcXVpcmVzIEBjb2Rley1zaG93X2ZyYW1lc30uCisKK1RoZSBpbmZvcm1hdGlvbiBmb3IgZWFjaCBsb2cgbWVzc2FnZSBpcyBwcmludGVkIHdpdGhpbiBhIGRlZGljYXRlZAorc2VjdGlvbiB3aXRoIG5hbWUgIkxPRyIuCisKIEBpdGVtIC1zaG93X3N0cmVhbXMKIFNob3cgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBtZWRpYSBzdHJlYW0gY29udGFpbmVkIGluIHRoZSBpbnB1dAogbXVsdGltZWRpYSBzdHJlYW0uCkBAIC0yNDUsNyArMjUyLDcgQEAKIEVhY2ggaW50ZXJ2YWwgaXMgc3BlY2lmaWVkIGJ5IHR3byBvcHRpb25hbCBwYXJ0cywgc2VwYXJhdGVkIGJ5ICIlIi4KIAogVGhlIGZpcnN0IHBhcnQgc3BlY2lmaWVzIHRoZSBpbnRlcnZhbCBzdGFydCBwb3NpdGlvbi4gSXQgaXMKLWludGVycHJldGVkIGFzIGFuIGFib2x1dGUgcG9zaXRpb24sIG9yIGFzIGEgcmVsYXRpdmUgb2Zmc2V0IGZyb20gdGhlCitpbnRlcnByZXRlZCBhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiwgb3IgYXMgYSByZWxhdGl2ZSBvZmZzZXQgZnJvbSB0aGUKIGN1cnJlbnQgcG9zaXRpb24gaWYgaXQgaXMgcHJlY2VkZWQgYnkgdGhlICIrIiBjaGFyYWN0ZXIuIElmIHRoaXMgZmlyc3QKIHBhcnQgaXMgbm90IHNwZWNpZmllZCwgbm8gc2Vla2luZyB3aWxsIGJlIHBlcmZvcm1lZCB3aGVuIHJlYWRpbmcgdGhpcwogaW50ZXJ2YWwuCkBAIC0zMzIsOCArMzM5LDggQEAKIEZvcmNlIGJpdGV4YWN0IG91dHB1dCwgdXNlZnVsIHRvIHByb2R1Y2Ugb3V0cHV0IHdoaWNoIGlzIG5vdCBkZXBlbmRlbnQKIG9uIHRoZSBzcGVjaWZpYyBidWlsZC4KIAotQGl0ZW0gLWkgQHZhcntpbnB1dF9maWxlfQotUmVhZCBAdmFye2lucHV0X2ZpbGV9LgorQGl0ZW0gLWkgQHZhcntpbnB1dF91cmx9CitSZWFkIEB2YXJ7aW5wdXRfdXJsfS4KIAogQGVuZCB0YWJsZQogQGMgbWFuIGVuZApAQCAtNDY0LDcgKzQ3MSw3IEBACiBAZW5kIHRhYmxlCiAKIEBpdGVtIHByaW50X3NlY3Rpb24sIHAKLVByaW50IHRoZSBzZWN0aW9uIG5hbWUgYXQgdGhlIGJlZ2luIG9mIGVhY2ggbGluZSBpZiB0aGUgdmFsdWUgaXMKK1ByaW50IHRoZSBzZWN0aW9uIG5hbWUgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgaWYgdGhlIHZhbHVlIGlzCiBAY29kZXsxfSwgZGlzYWJsZSBpdCB3aXRoIHZhbHVlIHNldCB0byBAY29kZXswfS4gRGVmYXVsdCB2YWx1ZSBpcwogQGNvZGV7MX0uCiAKQEAgLTY0Niw3ICs2NTMsNyBAQAogQGlmc2V0IGNvbmZpZy1ub3QtYWxsCiBAdXJse2ZmcHJvYmUtYWxsLmh0bWwsZmZwcm9iZS1hbGx9LAogQGVuZCBpZnNldAotQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZzZXJ2ZXIuaHRtbCxmZnNlcnZlcn0sCitAdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwKIEB1cmx7ZmZtcGVnLXV0aWxzLmh0bWwsZmZtcGVnLXV0aWxzfSwKIEB1cmx7ZmZtcGVnLXNjYWxlci5odG1sLGZmbXBlZy1zY2FsZXJ9LAogQHVybHtmZm1wZWctcmVzYW1wbGVyLmh0bWwsZmZtcGVnLXJlc2FtcGxlcn0sCkBAIC02NjUsNyArNjcyLDcgQEAKIEBpZnNldCBjb25maWctbm90LWFsbAogZmZwcm9iZS1hbGwoMSksCiBAZW5kIGlmc2V0Ci1mZm1wZWcoMSksIGZmcGxheSgxKSwgZmZzZXJ2ZXIoMSksCitmZm1wZWcoMSksIGZmcGxheSgxKSwKIGZmbXBlZy11dGlscygxKSwgZmZtcGVnLXNjYWxlcigxKSwgZmZtcGVnLXJlc2FtcGxlcigxKSwKIGZmbXBlZy1jb2RlY3MoMSksIGZmbXBlZy1iaXRzdHJlYW0tZmlsdGVycygxKSwgZmZtcGVnLWZvcm1hdHMoMSksCiBmZm1wZWctZGV2aWNlcygxKSwgZmZtcGVnLXByb3RvY29scygxKSwgZmZtcGVnLWZpbHRlcnMoMSkKZGlmZiAtLWdpdCBhL2RvYy9mZnByb2JlLnhzZCBiL2RvYy9mZnByb2JlLnhzZAppbmRleCBjN2Q1MTAxLi4zZTU4ZGEwIDEwMDY0NAotLS0gYS9kb2MvZmZwcm9iZS54c2QKKysrIGIvZG9jL2ZmcHJvYmUueHNkCkBAIC04Myw2ICs4Myw3IEBACiAgICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJmcmFtZVR5cGUiPgogICAgICAgPHhzZDpzZXF1ZW5jZT4KICAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJ0YWciIHR5cGU9ImZmcHJvYmU6dGFnVHlwZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZ3MiIHR5cGU9ImZmcHJvYmU6bG9nc1R5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+CiAgICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ic2lkZV9kYXRhX2xpc3QiIHR5cGU9ImZmcHJvYmU6ZnJhbWVTaWRlRGF0YUxpc3RUeXBlIiAgIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIiAvPgogICAgICAgPC94c2Q6c2VxdWVuY2U+CiAKQEAgLTExOSw2ICsxMjAsMjUgQEAKICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImludGVybGFjZWRfZnJhbWUiICAgICAgIHR5cGU9InhzZDppbnQiICAgLz4KICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InRvcF9maWVsZF9maXJzdCIgICAgICAgIHR5cGU9InhzZDppbnQiICAgLz4KICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InJlcGVhdF9waWN0IiAgICAgICAgICAgIHR5cGU9InhzZDppbnQiICAgLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbG9yX3JhbmdlIiAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbG9yX3NwYWNlIiAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbG9yX3ByaW1hcmllcyIgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbG9yX3RyYW5zZmVyIiAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNocm9tYV9sb2NhdGlvbiIgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICA8L3hzZDpjb21wbGV4VHlwZT4KKworICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nc1R5cGUiPgorICAgICAgICA8eHNkOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImxvZyIgdHlwZT0iZmZwcm9iZTpsb2dUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDwveHNkOnNlcXVlbmNlPgorICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ibG9nVHlwZSI+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbnRleHQiICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJsZXZlbCIgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnQiICAgLz4KKyAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2F0ZWdvcnkiICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6aW50IiAgIC8+CisgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InBhcmVudF9jb250ZXh0IiAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgorICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJwYXJlbnRfY2F0ZWdvcnkiICAgICAgICAgICAgIHR5cGU9InhzZDppbnQiICAgLz4KKyAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ibWVzc2FnZSIgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+CiAgICAgPC94c2Q6Y29tcGxleFR5cGU+CiAKICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZyYW1lU2lkZURhdGFMaXN0VHlwZSI+CkBAIC0xMjksNiArMTQ5LDcgQEAKICAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImZyYW1lU2lkZURhdGFUeXBlIj4KICAgICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0ic2lkZV9kYXRhX3R5cGUiICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+CiAgICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9InNpZGVfZGF0YV9zaXplIiAgICAgICAgICAgICAgdHlwZT0ieHNkOmludCIgICAvPgorICAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0aW1lY29kZSIgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KICAgICA8L3hzZDpjb21wbGV4VHlwZT4KIAogICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3VidGl0bGVUeXBlIj4KQEAgLTE2NSw2ICsxODYsNyBAQAogICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idmlzdWFsX2ltcGFpcmVkIiAgdHlwZT0ieHNkOmludCIgdXNlPSJyZXF1aXJlZCIgLz4KICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNsZWFuX2VmZmVjdHMiICAgIHR5cGU9InhzZDppbnQiIHVzZT0icmVxdWlyZWQiIC8+CiAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJhdHRhY2hlZF9waWMiICAgICB0eXBlPSJ4c2Q6aW50IiB1c2U9InJlcXVpcmVkIiAvPgorICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0idGltZWRfdGh1bWJuYWlscyIgdHlwZT0ieHNkOmludCIgdXNlPSJyZXF1aXJlZCIgLz4KICAgICA8L3hzZDpjb21wbGV4VHlwZT4KIAogICAgIDx4c2Q6Y29tcGxleFR5cGUgbmFtZT0ic3RyZWFtVHlwZSI+CkBAIC0yMDAsNiArMjIyLDcgQEAKICAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImNvbG9yX3RyYW5zZmVyIiAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+CiAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJjb2xvcl9wcmltYXJpZXMiICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgogICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0iY2hyb21hX2xvY2F0aW9uIiAgICAgIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgIDx4c2Q6YXR0cmlidXRlIG5hbWU9ImZpZWxkX29yZGVyIiAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIi8+CiAgICAgICA8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0aW1lY29kZSIgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIvPgogICAgICAgPHhzZDphdHRyaWJ1dGUgbmFtZT0icmVmcyIgICAgICAgICAgICAgICAgIHR5cGU9InhzZDppbnQiLz4KIApkaWZmIC0tZ2l0IGEvZG9jL2Zmc2VydmVyLmNvbmYgYi9kb2MvZmZzZXJ2ZXIuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EzMGZiNi4uMDAwMDAwMAotLS0gYS9kb2MvZmZzZXJ2ZXIuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDM3MiArMCwwIEBACi0jIFBvcnQgb24gd2hpY2ggdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcuIFlvdSBtdXN0IHNlbGVjdCBhIGRpZmZlcmVudAotIyBwb3J0IGZyb20geW91ciBzdGFuZGFyZCBIVFRQIHdlYiBzZXJ2ZXIgaWYgaXQgaXMgcnVubmluZyBvbiB0aGUgc2FtZQotIyBjb21wdXRlci4KLUhUVFBQb3J0IDgwOTAKLQotIyBBZGRyZXNzIG9uIHdoaWNoIHRoZSBzZXJ2ZXIgaXMgYm91bmQuIE9ubHkgdXNlZnVsIGlmIHlvdSBoYXZlCi0jIHNldmVyYWwgbmV0d29yayBpbnRlcmZhY2VzLgotSFRUUEJpbmRBZGRyZXNzIDAuMC4wLjAKLQotIyBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIEhUVFAgY29ubmVjdGlvbnMgdGhhdCBjYW4gYmUgaGFuZGxlZC4gSXQgaGFzCi0jIHRvIGJlIGRlZmluZWQgKmJlZm9yZSogdGhlIE1heENsaWVudHMgcGFyYW1ldGVyLCBzaW5jZSBpdCBkZWZpbmVzIHRoZQotIyBNYXhDbGllbnRzIG1heGltdW0gbGltaXQuCi1NYXhIVFRQQ29ubmVjdGlvbnMgMjAwMAotCi0jIE51bWJlciBvZiBzaW11bHRhbmVvdXMgcmVxdWVzdHMgdGhhdCBjYW4gYmUgaGFuZGxlZC4gU2luY2UgRkZTZXJ2ZXIKLSMgaXMgdmVyeSBmYXN0LCBpdCBpcyBtb3JlIGxpa2VseSB0aGF0IHlvdSB3aWxsIHdhbnQgdG8gbGVhdmUgdGhpcyBoaWdoCi0jIGFuZCB1c2UgTWF4QmFuZHdpZHRoLCBiZWxvdy4KLU1heENsaWVudHMgMTAwMAotCi0jIFRoaXMgdGhlIG1heGltdW0gYW1vdW50IG9mIGtiaXQvc2VjIHRoYXQgeW91IGFyZSBwcmVwYXJlZCB0bwotIyBjb25zdW1lIHdoZW4gc3RyZWFtaW5nIHRvIGNsaWVudHMuCi1NYXhCYW5kd2lkdGggMTAwMAotCi0jIEFjY2VzcyBsb2cgZmlsZSAodXNlcyBzdGFuZGFyZCBBcGFjaGUgbG9nIGZpbGUgZm9ybWF0KQotIyAnLScgaXMgdGhlIHN0YW5kYXJkIG91dHB1dC4KLUN1c3RvbUxvZyAtCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBEZWZpbml0aW9uIG9mIHRoZSBsaXZlIGZlZWRzLiBFYWNoIGxpdmUgZmVlZCBjb250YWlucyBvbmUgdmlkZW8KLSMgYW5kL29yIGF1ZGlvIHNlcXVlbmNlIGNvbWluZyBmcm9tIGFuIGZmbXBlZyBlbmNvZGVyIG9yIGFub3RoZXIKLSMgZmZzZXJ2ZXIuIFRoaXMgc2VxdWVuY2UgbWF5IGJlIGVuY29kZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCBzZXZlcmFsCi0jIGNvZGVjcyBhdCBzZXZlcmFsIHJlc29sdXRpb25zLgotCi08RmVlZCBmZWVkMS5mZm0+Ci0KLSMgWW91IG11c3QgdXNlICdmZm1wZWcnIHRvIHNlbmQgYSBsaXZlIGZlZWQgdG8gZmZzZXJ2ZXIuIEluIHRoaXMKLSMgZXhhbXBsZSwgeW91IGNhbiB0eXBlOgotIwotIyBmZm1wZWcgaHR0cDovL2xvY2FsaG9zdDo4MDkwL2ZlZWQxLmZmbQotCi0jIGZmc2VydmVyIGNhbiBhbHNvIGRvIHRpbWUgc2hpZnRpbmcuIEl0IG1lYW5zIHRoYXQgaXQgY2FuIHN0cmVhbSBhbnkKLSMgcHJldmlvdXNseSByZWNvcmRlZCBsaXZlIHN0cmVhbS4gVGhlIHJlcXVlc3Qgc2hvdWxkIGNvbnRhaW46Ci0jICJodHRwOi8veHh4eD9kYXRlPVtZWVlZLU1NLUREVF1bW0hIOl1NTTpdU1NbLm0uLi5dIi5Zb3UgbXVzdCBzcGVjaWZ5Ci0jIGEgcGF0aCB3aGVyZSB0aGUgZmVlZCBpcyBzdG9yZWQgb24gZGlzay4gWW91IGFsc28gc3BlY2lmeSB0aGUKLSMgbWF4aW11bSBzaXplIG9mIHRoZSBmZWVkLCB3aGVyZSB6ZXJvIG1lYW5zIHVubGltaXRlZC4gRGVmYXVsdDoKLSMgRmlsZT0vdG1wL2ZlZWRfbmFtZS5mZm0gRmlsZU1heFNpemU9NU0KLUZpbGUgL3RtcC9mZWVkMS5mZm0KLUZpbGVNYXhTaXplIDIwMEsKLQotIyBZb3UgY291bGQgc3BlY2lmeQotIyBSZWFkT25seUZpbGUgL3NhdmVkL3NwZWNpYWx2aWRlby5mZm0KLSMgVGhpcyBtYXJrcyB0aGUgZmlsZSBhcyByZWFkb25seSBhbmQgaXQgd2lsbCBub3QgYmUgZGVsZXRlZCBvciB1cGRhdGVkLgotCi0jIFNwZWNpZnkgbGF1bmNoIGluIG9yZGVyIHRvIHN0YXJ0IGZmbXBlZyBhdXRvbWF0aWNhbGx5LgotIyBGaXJzdCBmZm1wZWcgbXVzdCBiZSBkZWZpbmVkIHdpdGggYW4gYXBwcm9wcmlhdGUgcGF0aCBpZiBuZWVkZWQsCi0jIGFmdGVyIHRoYXQgb3B0aW9ucyBjYW4gZm9sbG93LCBidXQgYXZvaWQgYWRkaW5nIHRoZSBodHRwOi8vIGZpZWxkCi0jTGF1bmNoIGZmbXBlZwotCi0jIE9ubHkgYWxsb3cgY29ubmVjdGlvbnMgZnJvbSBsb2NhbGhvc3QgdG8gdGhlIGZlZWQuCi1BQ0wgYWxsb3cgMTI3LjAuMC4xCi0KLTwvRmVlZD4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgTm93IHlvdSBjYW4gZGVmaW5lIGVhY2ggc3RyZWFtIHdoaWNoIHdpbGwgYmUgZ2VuZXJhdGVkIGZyb20gdGhlCi0jIG9yaWdpbmFsIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW0uIEVhY2ggZm9ybWF0IGhhcyBhIGZpbGVuYW1lIChoZXJlCi0jICd0ZXN0MS5tcGcnKS4gRkZTZXJ2ZXIgd2lsbCBzZW5kIHRoaXMgc3RyZWFtIHdoZW4gYW5zd2VyaW5nIGEKLSMgcmVxdWVzdCBjb250YWluaW5nIHRoaXMgZmlsZW5hbWUuCi0KLTxTdHJlYW0gdGVzdDEubXBnPgotCi0jIGNvbWluZyBmcm9tIGxpdmUgZmVlZCAnZmVlZDEnCi1GZWVkIGZlZWQxLmZmbQotCi0jIEZvcm1hdCBvZiB0aGUgc3RyZWFtIDogeW91IGNhbiBjaG9vc2UgYW1vbmc6Ci0jIG1wZWcgICAgICAgOiBNUEVHLTEgbXVsdGlwbGV4ZWQgdmlkZW8gYW5kIGF1ZGlvCi0jIG1wZWd2aWRlbyAgOiBvbmx5IE1QRUctMSB2aWRlbwotIyBtcDIgICAgICAgIDogTVBFRy0yIGF1ZGlvICh1c2UgQXVkaW9Db2RlYyB0byBzZWxlY3QgbGF5ZXIgMiBhbmQgMyBjb2RlYykKLSMgb2dnICAgICAgICA6IE9nZyBmb3JtYXQgKFZvcmJpcyBhdWRpbyBjb2RlYykKLSMgcm0gICAgICAgICA6IFJlYWxOZXR3b3Jrcy1jb21wYXRpYmxlIHN0cmVhbS4gTXVsdGlwbGV4ZWQgYXVkaW8gYW5kIHZpZGVvLgotIyByYSAgICAgICAgIDogUmVhbE5ldHdvcmtzLWNvbXBhdGlibGUgc3RyZWFtLiBBdWRpbyBvbmx5LgotIyBtcGpwZWcgICAgIDogTXVsdGlwYXJ0IEpQRUcgKHdvcmtzIHdpdGggTmV0c2NhcGUgd2l0aG91dCBhbnkgcGx1Z2luKQotIyBqcGVnICAgICAgIDogR2VuZXJhdGUgYSBzaW5nbGUgSlBFRyBpbWFnZS4KLSMgbWpwZWcgICAgICA6IEdlbmVyYXRlIGEgTS1KUEVHIHN0cmVhbS4KLSMgYXNmICAgICAgICA6IEFTRiBjb21wYXRpYmxlIHN0cmVhbWluZyAoV2luZG93cyBNZWRpYSBQbGF5ZXIgZm9ybWF0KS4KLSMgc3dmICAgICAgICA6IE1hY3JvbWVkaWEgRmxhc2ggY29tcGF0aWJsZSBzdHJlYW0KLSMgYXZpICAgICAgICA6IEFWSSBmb3JtYXQgKE1QRUctNCB2aWRlbywgTVBFRyBhdWRpbyBzb3VuZCkKLUZvcm1hdCBtcGVnCi0KLSMgQml0cmF0ZSBmb3IgdGhlIGF1ZGlvIHN0cmVhbS4gQ29kZWNzIHVzdWFsbHkgc3VwcG9ydCBvbmx5IGEgZmV3Ci0jIGRpZmZlcmVudCBiaXRyYXRlcy4KLUF1ZGlvQml0UmF0ZSAzMgotCi0jIE51bWJlciBvZiBhdWRpbyBjaGFubmVsczogMSA9IG1vbm8sIDIgPSBzdGVyZW8KLUF1ZGlvQ2hhbm5lbHMgMQotCi0jIFNhbXBsaW5nIGZyZXF1ZW5jeSBmb3IgYXVkaW8uIFdoZW4gdXNpbmcgbG93IGJpdHJhdGVzLCB5b3Ugc2hvdWxkCi0jIGxvd2VyIHRoaXMgZnJlcXVlbmN5IHRvIDIyMDUwIG9yIDExMDI1LiBUaGUgc3VwcG9ydGVkIGZyZXF1ZW5jaWVzCi0jIGRlcGVuZCBvbiB0aGUgc2VsZWN0ZWQgYXVkaW8gY29kZWMuCi1BdWRpb1NhbXBsZVJhdGUgNDQxMDAKLQotIyBCaXRyYXRlIGZvciB0aGUgdmlkZW8gc3RyZWFtCi1WaWRlb0JpdFJhdGUgNjQKLQotIyBSYXRlY29udHJvbCBidWZmZXIgc2l6ZQotVmlkZW9CdWZmZXJTaXplIDQwCi0KLSMgTnVtYmVyIG9mIGZyYW1lcyBwZXIgc2Vjb25kCi1WaWRlb0ZyYW1lUmF0ZSAzCi0KLSMgU2l6ZSBvZiB0aGUgdmlkZW8gZnJhbWU6IFd4SCAoZGVmYXVsdDogMTYweDEyOCkKLSMgVGhlIGZvbGxvd2luZyBhYmJyZXZpYXRpb25zIGFyZSBkZWZpbmVkOiBzcWNpZiwgcWNpZiwgY2lmLCA0Y2lmLCBxcXZnYSwKLSMgcXZnYSwgdmdhLCBzdmdhLCB4Z2EsIHV4Z2EsIHF4Z2EsIHN4Z2EsIHFzeGdhLCBoc3hnYSwgd3ZnYSwgd3hnYSwgd3N4Z2EsCi0jIHd1eGdhLCB3b3hnYSwgd3FzeGdhLCB3cXV4Z2EsIHdoc3hnYSwgd2h1eGdhLCBjZ2EsIGVnYSwgaGQ0ODAsIGhkNzIwLAotIyBoZDEwODAKLVZpZGVvU2l6ZSAxNjB4MTI4Ci0KLSMgVHJhbnNtaXQgb25seSBpbnRyYSBmcmFtZXMgKHVzZWZ1bCBmb3IgbG93IGJpdHJhdGVzLCBidXQga2lsbHMgZnJhbWUgcmF0ZSkuCi0jVmlkZW9JbnRyYU9ubHkKLQotIyBJZiBub24taW50cmEgb25seSwgYW4gaW50cmEgZnJhbWUgaXMgdHJhbnNtaXR0ZWQgZXZlcnkgVmlkZW9Hb3BTaXplCi0jIGZyYW1lcy4gVmlkZW8gc3luY2hyb25pemF0aW9uIGNhbiBvbmx5IGJlZ2luIGF0IGFuIGludHJhIGZyYW1lLgotVmlkZW9Hb3BTaXplIDEyCi0KLSMgTW9yZSBNUEVHLTQgcGFyYW1ldGVycwotIyBWaWRlb0hpZ2hRdWFsaXR5Ci0jIFZpZGVvNE1vdGlvblZlY3RvcgotCi0jIENob29zZSB5b3VyIGNvZGVjczoKLSNBdWRpb0NvZGVjIG1wMgotI1ZpZGVvQ29kZWMgbXBlZzF2aWRlbwotCi0jIFN1cHByZXNzIGF1ZGlvCi0jTm9BdWRpbwotCi0jIFN1cHByZXNzIHZpZGVvCi0jTm9WaWRlbwotCi0jVmlkZW9RTWluIDMKLSNWaWRlb1FNYXggMzEKLQotIyBTZXQgdGhpcyB0byB0aGUgbnVtYmVyIG9mIHNlY29uZHMgYmFja3dhcmRzIGluIHRpbWUgdG8gc3RhcnQuIE5vdGUgdGhhdAotIyBtb3N0IHBsYXllcnMgd2lsbCBidWZmZXIgNS0xMCBzZWNvbmRzIG9mIHZpZGVvLCBhbmQgYWxzbyB5b3UgbmVlZCB0byBhbGxvdwotIyBmb3IgYSBrZXlmcmFtZSB0byBhcHBlYXIgaW4gdGhlIGRhdGEgc3RyZWFtLgotI1ByZXJvbGwgMTUKLQotIyBBQ0w6Ci0KLSMgWW91IGNhbiBhbGxvdyByYW5nZXMgb2YgYWRkcmVzc2VzIChvciBzaW5nbGUgYWRkcmVzc2VzKQotI0FDTCBBTExPVyA8Zmlyc3QgYWRkcmVzcz4gPGxhc3QgYWRkcmVzcz4KLQotIyBZb3UgY2FuIGRlbnkgcmFuZ2VzIG9mIGFkZHJlc3NlcyAob3Igc2luZ2xlIGFkZHJlc3NlcykKLSNBQ0wgREVOWSA8Zmlyc3QgYWRkcmVzcz4gPGxhc3QgYWRkcmVzcz4KLQotIyBZb3UgY2FuIHJlcGVhdCB0aGUgQUNMIGFsbG93L2RlbnkgYXMgb2Z0ZW4gYXMgeW91IGxpa2UuIEl0IGlzIG9uIGEgcGVyCi0jIHN0cmVhbSBiYXNpcy4gVGhlIGZpcnN0IG1hdGNoIGRlZmluZXMgdGhlIGFjdGlvbi4gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZXMsCi0jIHRoZW4gdGhlIGRlZmF1bHQgaXMgdGhlIGludmVyc2Ugb2YgdGhlIGxhc3QgQUNMIHN0YXRlbWVudC4KLSMKLSMgVGh1cyAnQUNMIGFsbG93IGxvY2FsaG9zdCcgb25seSBhbGxvd3MgYWNjZXNzIGZyb20gbG9jYWxob3N0LgotIyAnQUNMIGRlbnkgMS4wLjAuMCAxLjI1NS4yNTUuMjU1JyB3b3VsZCBkZW55IHRoZSB3aG9sZSBvZiBuZXR3b3JrIDEgYW5kCi0jIGFsbG93IGV2ZXJ5Ym9keSBlbHNlLgotCi08L1N0cmVhbT4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgRXhhbXBsZSBzdHJlYW1zCi0KLQotIyBNdWx0aXBhcnQgSlBFRwotCi0jPFN0cmVhbSB0ZXN0Lm1qcGc+Ci0jRmVlZCBmZWVkMS5mZm0KLSNGb3JtYXQgbXBqcGVnCi0jVmlkZW9GcmFtZVJhdGUgMgotI1ZpZGVvSW50cmFPbmx5Ci0jTm9BdWRpbwotI1N0cmljdCAtMQotIzwvU3RyZWFtPgotCi0KLSMgU2luZ2xlIEpQRUcKLQotIzxTdHJlYW0gdGVzdC5qcGc+Ci0jRmVlZCBmZWVkMS5mZm0KLSNGb3JtYXQganBlZwotI1ZpZGVvRnJhbWVSYXRlIDIKLSNWaWRlb0ludHJhT25seQotIyNWaWRlb1NpemUgMzUyeDI0MAotI05vQXVkaW8KLSNTdHJpY3QgLTEKLSM8L1N0cmVhbT4KLQotCi0jIEZsYXNoCi0KLSM8U3RyZWFtIHRlc3Quc3dmPgotI0ZlZWQgZmVlZDEuZmZtCi0jRm9ybWF0IHN3ZgotI1ZpZGVvRnJhbWVSYXRlIDIKLSNWaWRlb0ludHJhT25seQotI05vQXVkaW8KLSM8L1N0cmVhbT4KLQotCi0jIEFTRiBjb21wYXRpYmxlCi0KLTxTdHJlYW0gdGVzdC5hc2Y+Ci1GZWVkIGZlZWQxLmZmbQotRm9ybWF0IGFzZgotVmlkZW9GcmFtZVJhdGUgMTUKLVZpZGVvU2l6ZSAzNTJ4MjQwCi1WaWRlb0JpdFJhdGUgMjU2Ci1WaWRlb0J1ZmZlclNpemUgNDAKLVZpZGVvR29wU2l6ZSAzMAotQXVkaW9CaXRSYXRlIDY0Ci1TdGFydFNlbmRPbktleQotPC9TdHJlYW0+Ci0KLQotIyBNUDMgYXVkaW8KLQotIzxTdHJlYW0gdGVzdC5tcDM+Ci0jRmVlZCBmZWVkMS5mZm0KLSNGb3JtYXQgbXAyCi0jQXVkaW9Db2RlYyBtcDMKLSNBdWRpb0JpdFJhdGUgNjQKLSNBdWRpb0NoYW5uZWxzIDEKLSNBdWRpb1NhbXBsZVJhdGUgNDQxMDAKLSNOb1ZpZGVvCi0jPC9TdHJlYW0+Ci0KLQotIyBPZ2cgVm9yYmlzIGF1ZGlvCi0KLSM8U3RyZWFtIHRlc3Qub2dnPgotI0ZlZWQgZmVlZDEuZmZtCi0jTWV0YWRhdGEgdGl0bGUgIlN0cmVhbSB0aXRsZSIKLSNBdWRpb0JpdFJhdGUgNjQKLSNBdWRpb0NoYW5uZWxzIDIKLSNBdWRpb1NhbXBsZVJhdGUgNDQxMDAKLSNOb1ZpZGVvCi0jPC9TdHJlYW0+Ci0KLQotIyBSZWFsIHdpdGggYXVkaW8gb25seSBhdCAzMiBrYml0cwotCi0jPFN0cmVhbSB0ZXN0LnJhPgotI0ZlZWQgZmVlZDEuZmZtCi0jRm9ybWF0IHJtCi0jQXVkaW9CaXRSYXRlIDMyCi0jTm9WaWRlbwotI05vQXVkaW8KLSM8L1N0cmVhbT4KLQotCi0jIFJlYWwgd2l0aCBhdWRpbyBhbmQgdmlkZW8gYXQgNjQga2JpdHMKLQotIzxTdHJlYW0gdGVzdC5ybT4KLSNGZWVkIGZlZWQxLmZmbQotI0Zvcm1hdCBybQotI0F1ZGlvQml0UmF0ZSAzMgotI1ZpZGVvQml0UmF0ZSAxMjgKLSNWaWRlb0ZyYW1lUmF0ZSAyNQotI1ZpZGVvR29wU2l6ZSAyNQotI05vQXVkaW8KLSM8L1N0cmVhbT4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQSBzdHJlYW0gY29taW5nIGZyb20gYSBmaWxlOiB5b3Ugb25seSBuZWVkIHRvIHNldCB0aGUgaW5wdXQKLSMgZmlsZW5hbWUgYW5kIG9wdGlvbmFsbHkgYSBuZXcgZm9ybWF0LiBTdXBwb3J0ZWQgY29udmVyc2lvbnM6Ci0jICAgIEFWSSAtPiBBU0YKLQotIzxTdHJlYW0gZmlsZS5ybT4KLSNGaWxlICIvdXNyL2xvY2FsL2h0dHBkL2h0ZG9jcy90bGl2ZS5ybSIKLSNOb0F1ZGlvCi0jPC9TdHJlYW0+Ci0KLSM8U3RyZWFtIGZpbGUuYXNmPgotI0ZpbGUgIi91c3IvbG9jYWwvaHR0cGQvaHRkb2NzL3Rlc3QuYXNmIgotI05vQXVkaW8KLSNNZXRhZGF0YSBhdXRob3IgIk1lIgotI01ldGFkYXRhIGNvcHlyaWdodCAiU3VwZXIgTWVnYUNvcnAiCi0jTWV0YWRhdGEgdGl0bGUgIlRlc3Qgc3RyZWFtIGZyb20gZGlzayIKLSNNZXRhZGF0YSBjb21tZW50ICJUZXN0IGNvbW1lbnQiCi0jPC9TdHJlYW0+Ci0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFJUU1AgZXhhbXBsZXMKLSMKLSMgWW91IGNhbiBhY2Nlc3MgdGhpcyBzdHJlYW0gd2l0aCB0aGUgUlRTUCBVUkw6Ci0jICAgcnRzcDovL2xvY2FsaG9zdDo1NDU0L3Rlc3QxLXJ0c3AubXBnCi0jCi0jIEEgbm9uLXN0YW5kYXJkIFJUU1AgcmVkaXJlY3RvciBpcyBhbHNvIGNyZWF0ZWQuIEl0cyBVUkwgaXM6Ci0jICAgaHR0cDovL2xvY2FsaG9zdDo4MDkwL3Rlc3QxLXJ0c3AucnRzcAotCi0jPFN0cmVhbSB0ZXN0MS1ydHNwLm1wZz4KLSNGb3JtYXQgcnRwCi0jRmlsZSAiL3Vzci9sb2NhbC9odHRwZC9odGRvY3MvdGVzdDEubXBnIgotIzwvU3RyZWFtPgotCi0KLSMgVHJhbnNjb2RlIGFuIGluY29taW5nIGxpdmUgZmVlZCB0byBhbm90aGVyIGxpdmUgZmVlZCwKLSMgdXNpbmcgbGlieDI2NCBhbmQgdmlkZW8gcHJlc2V0cwotCi0jPFN0cmVhbSBsaXZlLmgyNjQ+Ci0jRm9ybWF0IHJ0cAotI0ZlZWQgZmVlZDEuZmZtCi0jVmlkZW9Db2RlYyBsaWJ4MjY0Ci0jVmlkZW9GcmFtZVJhdGUgMjQKLSNWaWRlb0JpdFJhdGUgMTAwCi0jVmlkZW9TaXplIDQ4MHgyNzIKLSNBVlByZXNldFZpZGVvIGRlZmF1bHQKLSNBVlByZXNldFZpZGVvIGJhc2VsaW5lCi0jQVZPcHRpb25WaWRlbyBmbGFncyArZ2xvYmFsX2hlYWRlcgotIwotI0F1ZGlvQ29kZWMgbGliZmFhYwotI0F1ZGlvQml0UmF0ZSAzMgotI0F1ZGlvQ2hhbm5lbHMgMgotI0F1ZGlvU2FtcGxlUmF0ZSAyMjA1MAotI0FWT3B0aW9uQXVkaW8gZmxhZ3MgK2dsb2JhbF9oZWFkZXIKLSM8L1N0cmVhbT4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFNEUC9tdWx0aWNhc3QgZXhhbXBsZXMKLSMKLSMgSWYgeW91IHdhbnQgdG8gc2VuZCB5b3VyIHN0cmVhbSBpbiBtdWx0aWNhc3QsIHlvdSBtdXN0IHNldCB0aGUKLSMgbXVsdGljYXN0IGFkZHJlc3Mgd2l0aCBNdWx0aWNhc3RBZGRyZXNzLiBUaGUgcG9ydCBhbmQgdGhlIFRUTCBjYW4KLSMgYWxzbyBiZSBzZXQuCi0jCi0jIEFuIFNEUCBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGZmc2VydmVyIGJ5IGFkZGluZyB0aGUKLSMgJ3NkcCcgZXh0ZW5zaW9uIHRvIHRoZSBzdHJlYW0gbmFtZSAoaGVyZQotIyBodHRwOi8vbG9jYWxob3N0OjgwOTAvdGVzdDEtc2RwLnNkcCkuIFlvdSBzaG91bGQgdXN1YWxseSBnaXZlIHRoaXMKLSMgZmlsZSB0byB5b3VyIHBsYXllciB0byBwbGF5IHRoZSBzdHJlYW0uCi0jCi0jIFRoZSAnTm9Mb29wJyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gYXZvaWQgbG9vcGluZyB3aGVuIHRoZSBzdHJlYW0gaXMKLSMgdGVybWluYXRlZC4KLQotIzxTdHJlYW0gdGVzdDEtc2RwLm1wZz4KLSNGb3JtYXQgcnRwCi0jRmlsZSAiL3Vzci9sb2NhbC9odHRwZC9odGRvY3MvdGVzdDEubXBnIgotI011bHRpY2FzdEFkZHJlc3MgMjI0LjEyNC4wLjEKLSNNdWx0aWNhc3RQb3J0IDUwMDAKLSNNdWx0aWNhc3RUVEwgMTYKLSNOb0xvb3AKLSM8L1N0cmVhbT4KLQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgU3BlY2lhbCBzdHJlYW1zCi0KLSMgU2VydmVyIHN0YXR1cwotCi08U3RyZWFtIHN0YXQuaHRtbD4KLUZvcm1hdCBzdGF0dXMKLQotIyBPbmx5IGFsbG93IGxvY2FsIHBlb3BsZSB0byBnZXQgdGhlIHN0YXR1cwotQUNMIGFsbG93IGxvY2FsaG9zdAotQUNMIGFsbG93IDE5Mi4xNjguMC4wIDE5Mi4xNjguMjU1LjI1NQotCi0jRmF2aWNvblVSTCBodHRwOi8vcG9uZDEuZ2xhZHN0b25lZmFtaWx5Lm5ldDo4MDgwL2Zhdmljb24uaWNvCi08L1N0cmVhbT4KLQotCi0jIFJlZGlyZWN0IGluZGV4Lmh0bWwgdG8gdGhlIGFwcHJvcHJpYXRlIHNpdGUKLQotPFJlZGlyZWN0IGluZGV4Lmh0bWw+Ci1VUkwgaHR0cDovL3d3dy5mZm1wZWcub3JnLwotPC9SZWRpcmVjdD4KZGlmZiAtLWdpdCBhL2RvYy9mZnNlcnZlci50ZXhpIGIvZG9jL2Zmc2VydmVyLnRleGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDhmNDcuLjAwMDAwMDAKLS0tIGEvZG9jL2Zmc2VydmVyLnRleGkKKysrIC9kZXYvbnVsbApAQCAtMSw5MjMgKzAsMCBAQAotXGlucHV0IHRleGluZm8gQGMgLSotIHRleGluZm8gLSotCi1AZG9jdW1lbnRlbmNvZGluZyBVVEYtOAotCi1Ac2V0dGl0bGUgZmZzZXJ2ZXIgRG9jdW1lbnRhdGlvbgotQHRpdGxlcGFnZQotQGNlbnRlciBAdGl0bGVmb250e2Zmc2VydmVyIERvY3VtZW50YXRpb259Ci1AZW5kIHRpdGxlcGFnZQotCi1AdG9wCi0KLUBjb250ZW50cwotCi1AY2hhcHRlciBTeW5vcHNpcwotCi1mZnNlcnZlciBbQHZhcntvcHRpb25zfV0KLQotQGNoYXB0ZXIgRGVzY3JpcHRpb24KLUBjIG1hbiBiZWdpbiBERVNDUklQVElPTgotCi1AY29tbWFuZHtmZnNlcnZlcn0gaXMgYSBzdHJlYW1pbmcgc2VydmVyIGZvciBib3RoIGF1ZGlvIGFuZCB2aWRlby4KLUl0IHN1cHBvcnRzIHNldmVyYWwgbGl2ZSBmZWVkcywgc3RyZWFtaW5nIGZyb20gZmlsZXMgYW5kIHRpbWUgc2hpZnRpbmcKLW9uIGxpdmUgZmVlZHMuIFlvdSBjYW4gc2VlayB0byBwb3NpdGlvbnMgaW4gdGhlIHBhc3Qgb24gZWFjaCBsaXZlCi1mZWVkLCBwcm92aWRlZCB5b3Ugc3BlY2lmeSBhIGJpZyBlbm91Z2ggZmVlZCBzdG9yYWdlLgotCi1AY29tbWFuZHtmZnNlcnZlcn0gaXMgY29uZmlndXJlZCB0aHJvdWdoIGEgY29uZmlndXJhdGlvbiBmaWxlLCB3aGljaAotaXMgcmVhZCBhdCBzdGFydHVwLiBJZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGl0IHdpbGwgcmVhZCBmcm9tCi1AZmlsZXsvZXRjL2Zmc2VydmVyLmNvbmZ9LgotCi1AY29tbWFuZHtmZnNlcnZlcn0gcmVjZWl2ZXMgcHJlcmVjb3JkZWQgZmlsZXMgb3IgRkZNIHN0cmVhbXMgZnJvbSBzb21lCi1AY29tbWFuZHtmZm1wZWd9IGluc3RhbmNlIGFzIGlucHV0LCB0aGVuIHN0cmVhbXMgdGhlbSBvdmVyCi1SVFAvUlRTUC9IVFRQLgotCi1BbiBAY29tbWFuZHtmZnNlcnZlcn0gaW5zdGFuY2Ugd2lsbCBsaXN0ZW4gb24gc29tZSBwb3J0IGFzIHNwZWNpZmllZAotaW4gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gWW91IGNhbiBsYXVuY2ggb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mCi1AY29tbWFuZHtmZm1wZWd9IGFuZCBzZW5kIG9uZSBvciBtb3JlIEZGTSBzdHJlYW1zIHRvIHRoZSBwb3J0IHdoZXJlCi1mZnNlcnZlciBpcyBleHBlY3RpbmcgdG8gcmVjZWl2ZSB0aGVtLiBBbHRlcm5hdGVseSwgeW91IGNhbiBtYWtlCi1AY29tbWFuZHtmZnNlcnZlcn0gbGF1bmNoIHN1Y2ggQGNvbW1hbmR7ZmZtcGVnfSBpbnN0YW5jZXMgYXQgc3RhcnR1cC4KLQotSW5wdXQgc3RyZWFtcyBhcmUgY2FsbGVkIGZlZWRzLCBhbmQgZWFjaCBvbmUgaXMgc3BlY2lmaWVkIGJ5IGEKLUBjb2RlezxGZWVkPn0gc2VjdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotCi1Gb3IgZWFjaCBmZWVkIHlvdSBjYW4gaGF2ZSBkaWZmZXJlbnQgb3V0cHV0IHN0cmVhbXMgaW4gdmFyaW91cwotZm9ybWF0cywgZWFjaCBvbmUgc3BlY2lmaWVkIGJ5IGEgQGNvZGV7PFN0cmVhbT59IHNlY3Rpb24gaW4gdGhlCi1jb25maWd1cmF0aW9uIGZpbGUuCi0KLUBjaGFwdGVyIERldGFpbGVkIGRlc2NyaXB0aW9uCi0KLUBjb21tYW5ke2Zmc2VydmVyfSB3b3JrcyBieSBmb3J3YXJkaW5nIHN0cmVhbXMgZW5jb2RlZCBieQotQGNvbW1hbmR7ZmZtcGVnfSwgb3IgcHJlLXJlY29yZGVkIHN0cmVhbXMgd2hpY2ggYXJlIHJlYWQgZnJvbSBkaXNrLgotCi1QcmVjaXNlbHksIEBjb21tYW5ke2Zmc2VydmVyfSBhY3RzIGFzIGFuIEhUVFAgc2VydmVyLCBhY2NlcHRpbmcgUE9TVAotcmVxdWVzdHMgZnJvbSBAY29tbWFuZHtmZm1wZWd9IHRvIGFjcXVpcmUgdGhlIHN0cmVhbSB0byBwdWJsaXNoLCBhbmQKLXNlcnZpbmcgUlRTUCBjbGllbnRzIG9yIEhUVFAgY2xpZW50cyBHRVQgcmVxdWVzdHMgd2l0aCB0aGUgc3RyZWFtCi1tZWRpYSBjb250ZW50LgotCi1BIGZlZWQgaXMgYW4gQHJlZntGRk19IHN0cmVhbSBjcmVhdGVkIGJ5IEBjb21tYW5ke2ZmbXBlZ30sIGFuZCBzZW50IHRvCi1hIHBvcnQgd2hlcmUgQGNvbW1hbmR7ZmZzZXJ2ZXJ9IGlzIGxpc3RlbmluZy4KLQotRWFjaCBmZWVkIGlzIGlkZW50aWZpZWQgYnkgYSB1bmlxdWUgbmFtZSwgY29ycmVzcG9uZGluZyB0byB0aGUgbmFtZQotb2YgdGhlIHJlc291cmNlIHB1Ymxpc2hlZCBvbiBAY29tbWFuZHtmZnNlcnZlcn0sIGFuZCBpcyBjb25maWd1cmVkIGJ5Ci1hIGRlZGljYXRlZCBAY29kZXtGZWVkfSBzZWN0aW9uIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0KLVRoZSBmZWVkIHB1Ymxpc2ggVVJMIGlzIGdpdmVuIGJ5OgotQGV4YW1wbGUKLWh0dHA6Ly9AdmFye2Zmc2VydmVyX2lwX2FkZHJlc3N9OkB2YXJ7aHR0cF9wb3J0fS9AdmFye2ZlZWRfbmFtZX0KLUBlbmQgZXhhbXBsZQotCi13aGVyZSBAdmFye2Zmc2VydmVyX2lwX2FkZHJlc3N9IGlzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBtYWNoaW5lIHdoZXJlCi1AY29tbWFuZHtmZnNlcnZlcn0gaXMgaW5zdGFsbGVkLCBAdmFye2h0dHBfcG9ydH0gaXMgdGhlIHBvcnQgbnVtYmVyIG9mCi10aGUgSFRUUCBzZXJ2ZXIgKGNvbmZpZ3VyZWQgdGhyb3VnaCB0aGUgQG9wdGlvbntIVFRQUG9ydH0gb3B0aW9uKSwgYW5kCi1AdmFye2ZlZWRfbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmVlZCBkZWZpbmVkIGluIHRoZQotY29uZmlndXJhdGlvbiBmaWxlLgotCi1FYWNoIGZlZWQgaXMgYXNzb2NpYXRlZCB0byBhIGZpbGUgd2hpY2ggaXMgc3RvcmVkIG9uIGRpc2suIFRoaXMgc3RvcmVkCi1maWxlIGlzIHVzZWQgdG8gc2VuZCBwcmUtcmVjb3JkZWQgZGF0YSB0byBhIHBsYXllciBhcyBmYXN0IGFzCi1wb3NzaWJsZSB3aGVuIG5ldyBjb250ZW50IGlzIGFkZGVkIGluIHJlYWwtdGltZSB0byB0aGUgc3RyZWFtLgotCi1BICJsaXZlLXN0cmVhbSIgb3IgInN0cmVhbSIgaXMgYSByZXNvdXJjZSBwdWJsaXNoZWQgYnkKLUBjb21tYW5ke2Zmc2VydmVyfSwgYW5kIG1hZGUgYWNjZXNzaWJsZSB0aHJvdWdoIHRoZSBIVFRQIHByb3RvY29sIHRvCi1jbGllbnRzLgotCi1BIHN0cmVhbSBjYW4gYmUgY29ubmVjdGVkIHRvIGEgZmVlZCwgb3IgdG8gYSBmaWxlLiBJbiB0aGUgZmlyc3QgY2FzZSwKLXRoZSBwdWJsaXNoZWQgc3RyZWFtIGlzIGZvcndhcmRlZCBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGZlZWQKLWdlbmVyYXRlZCBieSBhIHJ1bm5pbmcgaW5zdGFuY2Ugb2YgQGNvbW1hbmR7ZmZtcGVnfSwgaW4gdGhlIHNlY29uZAotY2FzZSB0aGUgc3RyZWFtIGlzIHJlYWQgZnJvbSBhIHByZS1yZWNvcmRlZCBmaWxlLgotCi1FYWNoIHN0cmVhbSBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIG5hbWUsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hbWUKLW9mIHRoZSByZXNvdXJjZSBzZXJ2ZWQgYnkgQGNvbW1hbmR7ZmZzZXJ2ZXJ9LCBhbmQgaXMgY29uZmlndXJlZCBieQotYSBkZWRpY2F0ZWQgQGNvZGV7U3RyZWFtfSBzZWN0aW9uIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0KLVRoZSBzdHJlYW0gYWNjZXNzIEhUVFAgVVJMIGlzIGdpdmVuIGJ5OgotQGV4YW1wbGUKLWh0dHA6Ly9AdmFye2Zmc2VydmVyX2lwX2FkZHJlc3N9OkB2YXJ7aHR0cF9wb3J0fS9AdmFye3N0cmVhbV9uYW1lfVtAdmFye29wdGlvbnN9XQotQGVuZCBleGFtcGxlCi0KLVRoZSBzdHJlYW0gYWNjZXNzIFJUU1AgVVJMIGlzIGdpdmVuIGJ5OgotQGV4YW1wbGUKLWh0dHA6Ly9AdmFye2Zmc2VydmVyX2lwX2FkZHJlc3N9OkB2YXJ7cnRzcF9wb3J0fS9AdmFye3N0cmVhbV9uYW1lfVtAdmFye29wdGlvbnN9XQotQGVuZCBleGFtcGxlCi0KLUB2YXJ7c3RyZWFtX25hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbSBkZWZpbmVkIGluCi10aGUgY29uZmlndXJhdGlvbiBmaWxlLiBAdmFye29wdGlvbnN9IGlzIGEgbGlzdCBvZiBvcHRpb25zIHNwZWNpZmllZAotYWZ0ZXIgdGhlIFVSTCB3aGljaCBhZmZlY3RzIGhvdyB0aGUgc3RyZWFtIGlzIHNlcnZlZCBieQotQGNvbW1hbmR7ZmZzZXJ2ZXJ9LiBAdmFye2h0dHBfcG9ydH0gYW5kIEB2YXJ7cnRzcF9wb3J0fSBhcmUgdGhlIEhUVFAKLWFuZCBSVFNQIHBvcnRzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgb3B0aW9ucyBAdmFye0hUVFBQb3J0fSBhbmQKLUB2YXJ7UlRTUFBvcnR9IHJlc3BlY3RpdmVseS4KLQotSW4gY2FzZSB0aGUgc3RyZWFtIGlzIGFzc29jaWF0ZWQgdG8gYSBmZWVkLCB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycwotbXVzdCBiZSBjb25maWd1cmVkIGluIHRoZSBzdHJlYW0gY29uZmlndXJhdGlvbi4gVGhleSBhcmUgc2VudCB0bwotQGNvbW1hbmR7ZmZtcGVnfSB3aGVuIHNldHRpbmcgdXAgdGhlIGVuY29kaW5nLiBUaGlzIGFsbG93cwotQGNvbW1hbmR7ZmZzZXJ2ZXJ9IHRvIGRlZmluZSB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyB1c2VkIGJ5Ci10aGUgQGNvbW1hbmR7ZmZtcGVnfSBlbmNvZGVycy4KLQotVGhlIEBjb21tYW5ke2ZmbXBlZ30gQG9wdGlvbntvdmVycmlkZV9mZnNlcnZlcn0gY29tbWFuZGxpbmUgb3B0aW9uCi1hbGxvd3Mgb25lIHRvIG92ZXJyaWRlIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIHNldCBieSB0aGUgc2VydmVyLgotCi1NdWx0aXBsZSBzdHJlYW1zIGNhbiBiZSBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgZmVlZC4KLQotRm9yIGV4YW1wbGUsIHlvdSBjYW4gaGF2ZSBhIHNpdHVhdGlvbiBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZwotZ3JhcGg6Ci0KLUB2ZXJiYXRpbQotICAgICAgICAgICAgICAgX19fX19fX19fICAgICAgIF9fX19fX19fX18KLSAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgIHwgICAgICAgICAgfAotZmZtcGVnIDEgLS0tLS18IGZlZWQgMSAgfC0tLS0tfCBzdHJlYW0gMSB8Ci0gICAgXCAgICAgICAgIHxfX19fX19fX198XCAgICB8X19fX19fX19fX3wKLSAgICAgXCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgXCAgICAgICAgICAgICAgICAgICAgXCAgIF9fX19fX19fX18KLSAgICAgICBcICAgICAgICAgICAgICAgICAgICBcIHwgICAgICAgICAgfAotICAgICAgICBcICAgICAgICAgICAgICAgICAgICBcfCBzdHJlYW0gMiB8Ci0gICAgICAgICBcICAgICAgICAgICAgICAgICAgICB8X19fX19fX19fX3wKLSAgICAgICAgICBcCi0gICAgICAgICAgIFwgICBfX19fX19fX18gICAgICAgX19fX19fX19fXwotICAgICAgICAgICAgXCB8ICAgICAgICAgfCAgICAgfCAgICAgICAgICB8Ci0gICAgICAgICAgICAgXHwgZmVlZCAyICB8LS0tLS18IHN0cmVhbSAzIHwKLSAgICAgICAgICAgICAgfF9fX19fX19fX3wgICAgIHxfX19fX19fX19ffAotCi0gICAgICAgICAgICAgICBfX19fX19fX18gICAgICAgX19fX19fX19fXwotICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgfCAgICAgICAgICB8Ci1mZm1wZWcgMiAtLS0tLXwgZmVlZCAzICB8LS0tLS18IHN0cmVhbSA0IHwKLSAgICAgICAgICAgICAgfF9fX19fX19fX3wgICAgIHxfX19fX19fX19ffAotCi0gICAgICAgICAgICAgICBfX19fX19fX18gICAgICAgX19fX19fX19fXwotICAgICAgICAgICAgICB8ICAgICAgICAgfCAgICAgfCAgICAgICAgICB8Ci0gICAgICAgICAgICAgIHwgZmlsZSAxICB8LS0tLS18IHN0cmVhbSA1IHwKLSAgICAgICAgICAgICAgfF9fX19fX19fX3wgICAgIHxfX19fX19fX19ffAotCi1AZW5kIHZlcmJhdGltCi0KLUBhbmNob3J7RkZNfQotQHNlY3Rpb24gRkZNLCBGRk0yIGZvcm1hdHMKLQotRkZNIGFuZCBGRk0yIGFyZSBmb3JtYXRzIHVzZWQgYnkgZmZzZXJ2ZXIuIFRoZXkgYWxsb3cgc3RvcmluZyBhIHdpZGUgdmFyaWV0eSBvZgotdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgYW5kIGVuY29kaW5nIG9wdGlvbnMsIGFuZCBjYW4gc3RvcmUgYSBtb3ZpbmcgdGltZSBzZWdtZW50Ci1vZiBhbiBpbmZpbml0ZSBtb3ZpZSBvciBhIHdob2xlIG1vdmllLgotCi1GRk0gaXMgdmVyc2lvbiBzcGVjaWZpYywgYW5kIHRoZXJlIGlzIGxpbWl0ZWQgY29tcGF0aWJpbGl0eSBvZiBGRk0gZmlsZXMKLWdlbmVyYXRlZCBieSBvbmUgdmVyc2lvbiBvZiBmZm1wZWcvZmZzZXJ2ZXIgYW5kIGFub3RoZXIgdmVyc2lvbiBvZgotZmZtcGVnL2Zmc2VydmVyLiBJdCBtYXkgd29yayBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gd29yay4KLQotRkZNMiBpcyBleHRlbnNpYmxlIHdoaWxlIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgYW5kIHNob3VsZCB3b3JrIGJldHdlZW4KLWRpZmZlcmluZyB2ZXJzaW9ucyBvZiB0b29scy4gRkZNMiBpcyB0aGUgZGVmYXVsdC4KLQotQHNlY3Rpb24gU3RhdHVzIHN0cmVhbQotCi1AY29tbWFuZHtmZnNlcnZlcn0gc3VwcG9ydHMgYW4gSFRUUCBpbnRlcmZhY2Ugd2hpY2ggZXhwb3NlcyB0aGUKLWN1cnJlbnQgc3RhdHVzIG9mIHRoZSBzZXJ2ZXIuCi0KLVNpbXBseSBwb2ludCB5b3VyIGJyb3dzZXIgdG8gdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpYWwgc3RhdHVzIHN0cmVhbQotc3BlY2lmaWVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0KLUZvciBleGFtcGxlIGlmIHlvdSBoYXZlOgotQGV4YW1wbGUKLTxTdHJlYW0gc3RhdHVzLmh0bWw+Ci1Gb3JtYXQgc3RhdHVzCi0KLSMgT25seSBhbGxvdyBsb2NhbCBwZW9wbGUgdG8gZ2V0IHRoZSBzdGF0dXMKLUFDTCBhbGxvdyBsb2NhbGhvc3QKLUFDTCBhbGxvdyAxOTIuMTY4LjAuMCAxOTIuMTY4LjI1NS4yNTUKLTwvU3RyZWFtPgotQGVuZCBleGFtcGxlCi0KLXRoZW4gdGhlIHNlcnZlciB3aWxsIHBvc3QgYSBwYWdlIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiB3aGVuCi10aGUgc3BlY2lhbCBzdHJlYW0gQGZpbGV7c3RhdHVzLmh0bWx9IGlzIHJlcXVlc3RlZC4KLQotQHNlY3Rpb24gSG93IGRvIEkgbWFrZSBpdCB3b3JrPwotCi1BcyBhIHNpbXBsZSB0ZXN0LCBqdXN0IHJ1biB0aGUgZm9sbG93aW5nIHR3byBjb21tYW5kIGxpbmVzIHdoZXJlIElOUFVURklMRQotaXMgc29tZSBmaWxlIHdoaWNoIHlvdSBjYW4gZGVjb2RlIHdpdGggZmZtcGVnOgotCi1AZXhhbXBsZQotZmZzZXJ2ZXIgLWYgZG9jL2Zmc2VydmVyLmNvbmYgJgotZmZtcGVnIC1pIElOUFVURklMRSBodHRwOi8vbG9jYWxob3N0OjgwOTAvZmVlZDEuZmZtCi1AZW5kIGV4YW1wbGUKLQotQXQgdGhpcyBwb2ludCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZ28gdG8geW91ciBXaW5kb3dzIG1hY2hpbmUgYW5kIGZpcmUgdXAKLVdpbmRvd3MgTWVkaWEgUGxheWVyIChXTVApLiBHbyB0byBPcGVuIFVSTCBhbmQgZW50ZXIKLQotQGV4YW1wbGUKLSAgICBodHRwOi8vPGxpbnV4Ym94Pjo4MDkwL3Rlc3QuYXNmCi1AZW5kIGV4YW1wbGUKLQotWW91IHNob3VsZCAoYWZ0ZXIgYSBzaG9ydCBkZWxheSkgc2VlIHZpZGVvIGFuZCBoZWFyIGF1ZGlvLgotCi1XQVJOSU5HOiB0cnlpbmcgdG8gc3RyZWFtIHRlc3QxLm1wZyBkb2Vzbid0IHdvcmsgd2l0aCBXTVAgYXMgaXQgdHJpZXMgdG8KLXRyYW5zZmVyIHRoZSBlbnRpcmUgZmlsZSBiZWZvcmUgc3RhcnRpbmcgdG8gcGxheS4KLVRoZSBzYW1lIGlzIHRydWUgb2YgQVZJIGZpbGVzLgotCi1Zb3Ugc2hvdWxkIGVkaXQgdGhlIEBmaWxle2Zmc2VydmVyLmNvbmZ9IGZpbGUgdG8gc3VpdCB5b3VyIG5lZWRzIChpbgotdGVybXMgb2YgZnJhbWUgcmF0ZXMgZXRjKS4gVGhlbiBpbnN0YWxsIEBjb21tYW5ke2Zmc2VydmVyfSBhbmQKLUBjb21tYW5ke2ZmbXBlZ30sIHdyaXRlIGEgc2NyaXB0IHRvIHN0YXJ0IHRoZW0gdXAsIGFuZCBvZmYgeW91IGdvLgotCi1Ac2VjdGlvbiBXaGF0IGVsc2UgY2FuIGl0IGRvPwotCi1Zb3UgY2FuIHJlcGxheSB2aWRlbyBmcm9tIC5mZm0gZmlsZXMgdGhhdCB3YXMgcmVjb3JkZWQgZWFybGllci4KLUhvd2V2ZXIsIHRoZXJlIGFyZSBhIG51bWJlciBvZiBjYXZlYXRzLCBpbmNsdWRpbmcgdGhlIGZhY3QgdGhhdCB0aGUKLWZmc2VydmVyIHBhcmFtZXRlcnMgbXVzdCBtYXRjaCB0aGUgb3JpZ2luYWwgcGFyYW1ldGVycyB1c2VkIHRvIHJlY29yZCB0aGUKLWZpbGUuIElmIHRoZXkgZG8gbm90LCB0aGVuIGZmc2VydmVyIGRlbGV0ZXMgdGhlIGZpbGUgYmVmb3JlIHJlY29yZGluZyBpbnRvIGl0LgotKE5vdyB0aGF0IEkgd3JpdGUgdGhpcywgaXQgc2VlbXMgYnJva2VuKS4KLQotWW91IGNhbiBmaWRkbGUgd2l0aCBtYW55IG9mIHRoZSBjb2RlYyBjaG9pY2VzIGFuZCBlbmNvZGluZyBwYXJhbWV0ZXJzLCBhbmQKLXRoZXJlIGFyZSBhIGJ1bmNoIG1vcmUgcGFyYW1ldGVycyB0aGF0IHlvdSBjYW5ub3QgY29udHJvbC4gUG9zdCBhIG1lc3NhZ2UKLXRvIHRoZSBtYWlsaW5nIGxpc3QgaWYgdGhlcmUgYXJlIHNvbWUgJ211c3QgaGF2ZScgcGFyYW1ldGVycy4gTG9vayBpbgotZmZzZXJ2ZXIuY29uZiBmb3IgYSBsaXN0IG9mIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIGNvbnRyb2xzLgotCi1JdCB3aWxsIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgdGhlIEFTWCBvciBSQU0gZmlsZXMgdGhhdCBhcmUgb2Z0ZW4gdXNlZAotaW4gYnJvd3NlcnMuIFRoZXNlIGZpbGVzIGFyZSBhY3R1YWxseSByZWRpcmVjdGlvbnMgdG8gdGhlIHVuZGVybHlpbmcgQVNGCi1vciBSTSBmaWxlLiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgdGhlIGJyb3dzZXIgb2Z0ZW4gZmV0Y2hlcyB0aGUKLWVudGlyZSBmaWxlIGJlZm9yZSBzdGFydGluZyB1cCB0aGUgZXh0ZXJuYWwgdmlld2VyLiBUaGUgcmVkaXJlY3Rpb24gZmlsZXMKLWFyZSB2ZXJ5IHNtYWxsIGFuZCBjYW4gYmUgdHJhbnNmZXJyZWQgcXVpY2tseS4gW1RoZSBzdHJlYW0gaXRzZWxmIGlzCi1vZnRlbiAnaW5maW5pdGUnIGFuZCB0aHVzIHRoZSBicm93c2VyIHRyaWVzIHRvIGRvd25sb2FkIGl0IGFuZCBuZXZlcgotZmluaXNoZXMuXQotCi1Ac2VjdGlvbiBUaXBzCi0KLSogV2hlbiB5b3UgY29ubmVjdCB0byBhIGxpdmUgc3RyZWFtLCBtb3N0IHBsYXllcnMgKFdNUCwgUkEsIGV0Yykgd2FudCB0bwotYnVmZmVyIGEgY2VydGFpbiBudW1iZXIgb2Ygc2Vjb25kcyBvZiBtYXRlcmlhbCBzbyB0aGF0IHRoZXkgY2FuIGRpc3BsYXkgdGhlCi1zaWduYWwgY29udGludW91c2x5LiBIb3dldmVyLCBmZnNlcnZlciAoYnkgZGVmYXVsdCkgc3RhcnRzIHNlbmRpbmcgZGF0YQotaW4gcmVhbHRpbWUuIFRoaXMgbWVhbnMgdGhhdCB0aGVyZSBpcyBhIHBhdXNlIG9mIGEgZmV3IHNlY29uZHMgd2hpbGUgdGhlCi1idWZmZXJpbmcgaXMgYmVpbmcgZG9uZSBieSB0aGUgcGxheWVyLiBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgdGhpcyBjYW4gYmUKLWN1cmVkIGJ5IGFkZGluZyBhICc/YnVmZmVyPTUnIHRvIHRoZSBlbmQgb2YgdGhlIFVSTC4gVGhpcyBtZWFucyB0aGF0IHRoZQotc3RyZWFtIHNob3VsZCBzdGFydCA1IHNlY29uZHMgaW4gdGhlIHBhc3QgLS0gYW5kIHNvIHRoZSBmaXJzdCA1IHNlY29uZHMKLW9mIHRoZSBzdHJlYW0gYXJlIHNlbnQgYXMgZmFzdCBhcyB0aGUgbmV0d29yayB3aWxsIGFsbG93LiBJdCB3aWxsIHRoZW4KLXNsb3cgZG93biB0byByZWFsIHRpbWUuIFRoaXMgbm90aWNlYWJseSBpbXByb3ZlcyB0aGUgc3RhcnR1cCBleHBlcmllbmNlLgotCi1Zb3UgY2FuIGFsc28gYWRkIGEgJ1ByZXJvbGwgMTUnIHN0YXRlbWVudCBpbnRvIHRoZSBmZnNlcnZlci5jb25mIHRoYXQgd2lsbAotYWRkIHRoZSAxNSBzZWNvbmQgcHJlYnVmZmVyaW5nIG9uIGFsbCByZXF1ZXN0cyB0aGF0IGRvIG5vdCBvdGhlcndpc2UKLXNwZWNpZnkgYSB0aW1lLiBJbiBhZGRpdGlvbiwgZmZzZXJ2ZXIgd2lsbCBza2lwIGZyYW1lcyB1bnRpbCBhIGtleV9mcmFtZQotaXMgZm91bmQuIFRoaXMgZnVydGhlciByZWR1Y2VzIHRoZSBzdGFydHVwIGRlbGF5IGJ5IG5vdCB0cmFuc2ZlcnJpbmcgZGF0YQotdGhhdCB3aWxsIGJlIGRpc2NhcmRlZC4KLQotQHNlY3Rpb24gV2h5IGRvZXMgdGhlID9idWZmZXIgLyBQcmVyb2xsIHN0b3Agd29ya2luZyBhZnRlciBhIHRpbWU/Ci0KLUl0IHR1cm5zIG91dCB0aGF0IChvbiBteSBtYWNoaW5lIGF0IGxlYXN0KSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBzdWNjZXNzZnVsbHkKLWdyYWJiZWQgaXMgbWFyZ2luYWxseSBsZXNzIHRoYW4gdGhlIG51bWJlciB0aGF0IG91Z2h0IHRvIGJlIGdyYWJiZWQuIFRoaXMKLW1lYW5zIHRoYXQgdGhlIHRpbWVzdGFtcCBpbiB0aGUgZW5jb2RlZCBkYXRhIHN0cmVhbSBnZXRzIGJlaGluZCByZWFsdGltZS4KLVRoaXMgbWVhbnMgdGhhdCBpZiB5b3Ugc2F5ICdQcmVyb2xsIDEwJywgdGhlbiB3aGVuIHRoZSBzdHJlYW0gZ2V0cyAxMAotb3IgbW9yZSBzZWNvbmRzIGJlaGluZCwgdGhlcmUgaXMgbm8gUHJlcm9sbCBsZWZ0LgotCi1GaXhpbmcgdGhpcyByZXF1aXJlcyBhIGNoYW5nZSBpbiB0aGUgaW50ZXJuYWxzIG9mIGhvdyB0aW1lc3RhbXBzIGFyZQotaGFuZGxlZC4KLQotQHNlY3Rpb24gRG9lcyB0aGUgQGNvZGV7P2RhdGU9fSBzdHVmZiB3b3JrLgotCi1ZZXMgKHN1YmplY3QgdG8gdGhlIGxpbWl0YXRpb24gb3V0bGluZWQgYWJvdmUpLiBBbHNvIG5vdGUgdGhhdCB3aGVuZXZlciB5b3UKLXN0YXJ0IGZmc2VydmVyLCBpdCBkZWxldGVzIHRoZSBmZm0gZmlsZSAoaWYgYW55IHBhcmFtZXRlcnMgaGF2ZSBjaGFuZ2VkKSwKLXRodXMgd2lwaW5nIG91dCB3aGF0IHlvdSBoYWQgcmVjb3JkZWQgYmVmb3JlLgotCi1UaGUgZm9ybWF0IG9mIHRoZSBAY29kZXs/ZGF0ZT14eHh4eHh9IGlzIGZhaXJseSBmbGV4aWJsZS4gWW91IHNob3VsZCB1c2Ugb25lCi1vZiB0aGUgZm9sbG93aW5nIGZvcm1hdHMgKHRoZSAnVCcgaXMgbGl0ZXJhbCk6Ci0KLUBleGFtcGxlCi0qIFlZWVktTU0tRERUSEg6TU06U1MgICAgIChsb2NhbHRpbWUpCi0qIFlZWVktTU0tRERUSEg6TU06U1NaICAgIChVVEMpCi1AZW5kIGV4YW1wbGUKLQotWW91IGNhbiBvbWl0IHRoZSBZWVlZLU1NLURELCBhbmQgdGhlbiBpdCByZWZlcnMgdG8gdGhlIGN1cnJlbnQgZGF5LiBIb3dldmVyCi1ub3RlIHRoYXQgQHNhbXB7P2RhdGU9MTY6MDA6MDB9IHJlZmVycyB0byAxNjowMCBvbiB0aGUgY3VycmVudCBkYXkgLS0gdGhpcwotbWF5IGJlIGluIHRoZSBmdXR1cmUgYW5kIHNvIGlzIHVubGlrZWx5IHRvIGJlIHVzZWZ1bC4KLQotWW91IHVzZSB0aGlzIGJ5IGFkZGluZyB0aGUgP2RhdGU9IHRvIHRoZSBlbmQgb2YgdGhlIFVSTCBmb3IgdGhlIHN0cmVhbS4KLUZvciBleGFtcGxlOiAgIEBzYW1we2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MC90ZXN0LmFzZj9kYXRlPTIwMDItMDctMjZUMjM6MDU6MDB9LgotQGMgbWFuIGVuZAotCi1AY2hhcHRlciBPcHRpb25zCi1AYyBtYW4gYmVnaW4gT1BUSU9OUwotCi1AaW5jbHVkZSBmZnRvb2xzLWNvbW1vbi1vcHRzLnRleGkKLQotQHNlY3Rpb24gTWFpbiBvcHRpb25zCi0KLUB0YWJsZSBAb3B0aW9uCi1AaXRlbSAtZiBAdmFye2NvbmZpZ2ZpbGV9Ci1SZWFkIGNvbmZpZ3VyYXRpb24gZmlsZSBAZmlsZXtjb25maWdmaWxlfS4gSWYgbm90IHNwZWNpZmllZCBpdCB3aWxsCi1yZWFkIGJ5IGRlZmF1bHQgZnJvbSBAZmlsZXsvZXRjL2Zmc2VydmVyLmNvbmZ9LgotCi1AaXRlbSAtbgotRW5hYmxlIG5vLWxhdW5jaCBtb2RlLiBUaGlzIG9wdGlvbiBkaXNhYmxlcyBhbGwgdGhlIEBjb2Rle0xhdW5jaH0KLWRpcmVjdGl2ZXMgd2l0aGluIHRoZSB2YXJpb3VzIEBjb2RlezxGZWVkPn0gc2VjdGlvbnMuIFNpbmNlCi1AY29tbWFuZHtmZnNlcnZlcn0gd2lsbCBub3QgbGF1bmNoIGFueSBAY29tbWFuZHtmZm1wZWd9IGluc3RhbmNlcywgeW91Ci13aWxsIGhhdmUgdG8gbGF1bmNoIHRoZW0gbWFudWFsbHkuCi0KLUBpdGVtIC1kCi1FbmFibGUgZGVidWcgbW9kZS4gVGhpcyBvcHRpb24gaW5jcmVhc2VzIGxvZyB2ZXJib3NpdHksIGFuZCBkaXJlY3RzCi1sb2cgbWVzc2FnZXMgdG8gc3Rkb3V0LiBXaGVuIHNwZWNpZmllZCwgdGhlIEBvcHRpb257Q3VzdG9tTG9nfSBvcHRpb24KLWlzIGlnbm9yZWQuCi1AZW5kIHRhYmxlCi0KLUBjaGFwdGVyIENvbmZpZ3VyYXRpb24gZmlsZSBzeW50YXgKLQotQGNvbW1hbmR7ZmZzZXJ2ZXJ9IHJlYWRzIGEgY29uZmlndXJhdGlvbiBmaWxlIGNvbnRhaW5pbmcgZ2xvYmFsCi1vcHRpb25zIGFuZCBzZXR0aW5ncyBmb3IgZWFjaCBzdHJlYW0gYW5kIGZlZWQuCi0KLVRoZSBjb25maWd1cmF0aW9uIGZpbGUgY29uc2lzdHMgb2YgZ2xvYmFsIG9wdGlvbnMgYW5kIGRlZGljYXRlZAotc2VjdGlvbnMsIHdoaWNoIG11c3QgYmUgaW50cm9kdWNlZCBieSAiPEB2YXJ7U0VDVElPTl9OQU1FfQotQHZhcntBUkdTfT4iIG9uIGEgc2VwYXJhdGUgbGluZSBhbmQgbXVzdCBiZSB0ZXJtaW5hdGVkIGJ5IGEgbGluZSBpbgotdGhlIGZvcm0gIjwvQHZhcntTRUNUSU9OX05BTUV9PiIuIEB2YXJ7QVJHU30gaXMgb3B0aW9uYWwuCi0KLUN1cnJlbnRseSB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIGFyZSByZWNvZ25pemVkOiBAc2FtcHtGZWVkfSwKLUBzYW1we1N0cmVhbX0sIEBzYW1we1JlZGlyZWN0fS4KLQotQSBsaW5lIHN0YXJ0aW5nIHdpdGggQGNvZGV7I30gaXMgaWdub3JlZCBhbmQgdHJlYXRlZCBhcyBhIGNvbW1lbnQuCi0KLU5hbWUgb2Ygb3B0aW9ucyBhbmQgc2VjdGlvbnMgYXJlIGNhc2UtaW5zZW5zaXRpdmUuCi0KLUBzZWN0aW9uIEFDTCBzeW50YXgKLUFuIEFDTCAoQWNjZXNzIENvbnRyb2wgTGlzdCkgc3BlY2lmaWVzIHRoZSBhZGRyZXNzIHdoaWNoIGFyZSBhbGxvd2VkCi10byBhY2Nlc3MgYSBnaXZlbiBzdHJlYW0sIG9yIHRvIHdyaXRlIGEgZ2l2ZW4gZmVlZC4KLQotSXQgYWNjZXB0cyB0aGUgZm9sbGluZyBmb3JtcwotQGl0ZW1pemUKLUBpdGVtCi1BbGxvdy9kZW55IGFjY2VzcyB0byBAdmFye2FkZHJlc3N9LgotQGV4YW1wbGUKLUFDTCBBTExPVyA8YWRkcmVzcz4KLUFDTCBERU5ZIDxhZGRyZXNzPgotQGVuZCBleGFtcGxlCi0KLUBpdGVtCi1BbGxvdy9kZW55IGFjY2VzcyB0byByYW5nZXMgb2YgYWRkcmVzc2VzIGZyb20gQHZhcntmaXJzdF9hZGRyZXNzfSB0bwotQHZhcntsYXN0X2FkZHJlc3N9LgotQGV4YW1wbGUKLUFDTCBBTExPVyA8Zmlyc3RfYWRkcmVzcz4gPGxhc3RfYWRkcmVzcz4KLUFDTCBERU5ZIDxmaXJzdF9hZGRyZXNzPiA8bGFzdF9hZGRyZXNzPgotQGVuZCBleGFtcGxlCi1AZW5kIGl0ZW1pemUKLQotWW91IGNhbiByZXBlYXQgdGhlIEFDTCBhbGxvdy9kZW55IGFzIG9mdGVuIGFzIHlvdSBsaWtlLiBJdCBpcyBvbiBhIHBlcgotc3RyZWFtIGJhc2lzLiBUaGUgZmlyc3QgbWF0Y2ggZGVmaW5lcyB0aGUgYWN0aW9uLiBJZiB0aGVyZSBhcmUgbm8gbWF0Y2hlcywKLXRoZW4gdGhlIGRlZmF1bHQgaXMgdGhlIGludmVyc2Ugb2YgdGhlIGxhc3QgQUNMIHN0YXRlbWVudC4KLQotVGh1cyAnQUNMIGFsbG93IGxvY2FsaG9zdCcgb25seSBhbGxvd3MgYWNjZXNzIGZyb20gbG9jYWxob3N0LgotJ0FDTCBkZW55IDEuMC4wLjAgMS4yNTUuMjU1LjI1NScgd291bGQgZGVueSB0aGUgd2hvbGUgb2YgbmV0d29yayAxIGFuZAotYWxsb3cgZXZlcnlib2R5IGVsc2UuCi0KLUBzZWN0aW9uIEdsb2JhbCBvcHRpb25zCi1AdGFibGUgQG9wdGlvbgotQGl0ZW0gSFRUUFBvcnQgQHZhcntwb3J0X251bWJlcn0KLUBpdGVtIFBvcnQgQHZhcntwb3J0X251bWJlcn0KLUBpdGVtIFJUU1BQb3J0IEB2YXJ7cG9ydF9udW1iZXJ9Ci0KLUB2YXJ7SFRUUFBvcnR9IHNldHMgdGhlIEhUVFAgc2VydmVyIGxpc3RlbmluZyBUQ1AgcG9ydCBudW1iZXIsCi1AdmFye1JUU1BQb3J0fSBzZXRzIHRoZSBSVFNQIHNlcnZlciBsaXN0ZW5pbmcgVENQIHBvcnQgbnVtYmVyLgotCi1AdmFye1BvcnR9IGlzIHRoZSBlcXVpdmFsZW50IG9mIEB2YXJ7SFRUUFBvcnR9IGFuZCBpcyBkZXByZWNhdGVkLgotCi1Zb3UgbXVzdCBzZWxlY3QgYSBkaWZmZXJlbnQgcG9ydCBmcm9tIHlvdXIgc3RhbmRhcmQgSFRUUCB3ZWIgc2VydmVyIGlmCi1pdCBpcyBydW5uaW5nIG9uIHRoZSBzYW1lIGNvbXB1dGVyLgotCi1JZiBub3Qgc3BlY2lmaWVkLCBubyBjb3JyZXNwb25kaW5nIHNlcnZlciB3aWxsIGJlIGNyZWF0ZWQuCi0KLUBpdGVtIEhUVFBCaW5kQWRkcmVzcyBAdmFye2lwX2FkZHJlc3N9Ci1AaXRlbSBCaW5kQWRkcmVzcyBAdmFye2lwX2FkZHJlc3N9Ci1AaXRlbSBSVFNQQmluZEFkZHJlc3MgQHZhcntpcF9hZGRyZXNzfQotU2V0IGFkZHJlc3Mgb24gd2hpY2ggdGhlIEhUVFAvUlRTUCBzZXJ2ZXIgaXMgYm91bmQuIE9ubHkgdXNlZnVsIGlmIHlvdQotaGF2ZSBzZXZlcmFsIG5ldHdvcmsgaW50ZXJmYWNlcy4KLQotQHZhcntCaW5kQWRkcmVzc30gaXMgdGhlIGVxdWl2YWxlbnQgb2YgQHZhcntIVFRQQmluZEFkZHJlc3N9IGFuZCBpcwotZGVwcmVjYXRlZC4KLQotQGl0ZW0gTWF4SFRUUENvbm5lY3Rpb25zIEB2YXJ7bn0KLVNldCBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIEhUVFAgY29ubmVjdGlvbnMgdGhhdCBjYW4gYmUgaGFuZGxlZC4gSXQKLWhhcyB0byBiZSBkZWZpbmVkIEBlbXBoe2JlZm9yZX0gdGhlIEBvcHRpb257TWF4Q2xpZW50c30gcGFyYW1ldGVyLAotc2luY2UgaXQgZGVmaW5lcyB0aGUgQG9wdGlvbntNYXhDbGllbnRzfSBtYXhpbXVtIGxpbWl0LgotCi1EZWZhdWx0IHZhbHVlIGlzIDIwMDAuCi0KLUBpdGVtIE1heENsaWVudHMgQHZhcntufQotU2V0IG51bWJlciBvZiBzaW11bHRhbmVvdXMgcmVxdWVzdHMgdGhhdCBjYW4gYmUgaGFuZGxlZC4gU2luY2UKLUBjb21tYW5ke2Zmc2VydmVyfSBpcyB2ZXJ5IGZhc3QsIGl0IGlzIG1vcmUgbGlrZWx5IHRoYXQgeW91IHdpbGwgd2FudAotdG8gbGVhdmUgdGhpcyBoaWdoIGFuZCB1c2UgQG9wdGlvbntNYXhCYW5kd2lkdGh9LgotCi1EZWZhdWx0IHZhbHVlIGlzIDUuCi0KLUBpdGVtIE1heEJhbmR3aWR0aCBAdmFye2ticHN9Ci1TZXQgdGhlIG1heGltdW0gYW1vdW50IG9mIGtiaXQvc2VjIHRoYXQgeW91IGFyZSBwcmVwYXJlZCB0byBjb25zdW1lCi13aGVuIHN0cmVhbWluZyB0byBjbGllbnRzLgotCi1EZWZhdWx0IHZhbHVlIGlzIDEwMDAuCi0KLUBpdGVtIEN1c3RvbUxvZyBAdmFye2ZpbGVuYW1lfQotU2V0IGFjY2VzcyBsb2cgZmlsZSAodXNlcyBzdGFuZGFyZCBBcGFjaGUgbG9nIGZpbGUgZm9ybWF0KS4gJy0nIGlzIHRoZQotc3RhbmRhcmQgb3V0cHV0LgotCi1JZiBub3Qgc3BlY2lmaWVkIEBjb21tYW5ke2Zmc2VydmVyfSB3aWxsIHByb2R1Y2Ugbm8gbG9nLgotCi1JbiBjYXNlIHRoZSBjb21tYW5kbGluZSBvcHRpb24gQG9wdGlvbnstZH0gaXMgc3BlY2lmaWVkIHRoaXMgb3B0aW9uIGlzCi1pZ25vcmVkLCBhbmQgdGhlIGxvZyBpcyB3cml0dGVuIHRvIHN0YW5kYXJkIG91dHB1dC4KLQotQGl0ZW0gTm9EYWVtb24KLVNldCBuby1kYWVtb24gbW9kZS4gVGhpcyBvcHRpb24gaXMgY3VycmVudGx5IGlnbm9yZWQgc2luY2Ugbm93Ci1AY29tbWFuZHtmZnNlcnZlcn0gd2lsbCBhbHdheXMgd29yayBpbiBuby1kYWVtb24gbW9kZSwgYW5kIGlzCi1kZXByZWNhdGVkLgotCi1AaXRlbSBVc2VEZWZhdWx0cwotQGl0ZW0gTm9EZWZhdWx0cwotQ29udHJvbCB3aGV0aGVyIGRlZmF1bHQgY29kZWMgb3B0aW9ucyBhcmUgdXNlZCBmb3IgdGhlIGFsbCBzdHJlYW1zIG9yIG5vdC4KLUVhY2ggc3RyZWFtIG1heSBvdmVyd3JpdGUgdGhpcyBzZXR0aW5nIGZvciBpdHMgb3duLiBEZWZhdWx0IGlzIEB2YXJ7VXNlRGVmYXVsdHN9LgotVGhlIGxhc3Rlc3Qgb2NjdXJyZW5jZSBvdmVycmlkZXMgcHJldmlvdXMgaWYgbXVsdGlwbGUgZGVmaW5pdGlvbnMuCi1AZW5kIHRhYmxlCi0KLUBzZWN0aW9uIEZlZWQgc2VjdGlvbgotCi1BIEZlZWQgc2VjdGlvbiBkZWZpbmVzIGEgZmVlZCBwcm92aWRlZCB0byBAY29tbWFuZHtmZnNlcnZlcn0uCi0KLUVhY2ggbGl2ZSBmZWVkIGNvbnRhaW5zIG9uZSB2aWRlbyBhbmQvb3IgYXVkaW8gc2VxdWVuY2UgY29taW5nIGZyb20gYW4KLUBjb21tYW5ke2ZmbXBlZ30gZW5jb2RlciBvciBhbm90aGVyIEBjb21tYW5ke2Zmc2VydmVyfS4gVGhpcyBzZXF1ZW5jZQotbWF5IGJlIGVuY29kZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCBzZXZlcmFsIGNvZGVjcyBhdCBzZXZlcmFsCi1yZXNvbHV0aW9ucy4KLQotQSBmZWVkIGluc3RhbmNlIHNwZWNpZmljYXRpb24gaXMgaW50cm9kdWNlZCBieSBhIGxpbmUgaW4gdGhlIGZvcm06Ci1AZXhhbXBsZQotPEZlZWQgRkVFRF9GSUxFTkFNRT4KLUBlbmQgZXhhbXBsZQotCi13aGVyZSBAdmFye0ZFRURfRklMRU5BTUV9IHNwZWNpZmllcyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhlIEZGTSBzdHJlYW0uCi0KLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVjb2duaXplZCB3aXRoaW4gYSBGZWVkIHNlY3Rpb24uCi0KLUB0YWJsZSBAb3B0aW9uCi1AaXRlbSBGaWxlIEB2YXJ7ZmlsZW5hbWV9Ci1AaXRlbSBSZWFkT25seUZpbGUgQHZhcntmaWxlbmFtZX0KLVNldCB0aGUgcGF0aCB3aGVyZSB0aGUgZmVlZCBmaWxlIGlzIHN0b3JlZCBvbiBkaXNrLgotCi1JZiBub3Qgc3BlY2lmaWVkLCB0aGUgQGZpbGV7L3RtcC9GRUVELmZmbX0gaXMgYXNzdW1lZCwgd2hlcmUKLUB2YXJ7RkVFRH0gaXMgdGhlIGZlZWQgbmFtZS4KLQotSWYgQG9wdGlvbntSZWFkT25seUZpbGV9IGlzIHVzZWQgdGhlIGZpbGUgaXMgbWFya2VkIGFzIHJlYWQtb25seSBhbmQKLWl0IHdpbGwgbm90IGJlIGRlbGV0ZWQgb3IgdXBkYXRlZC4KLQotQGl0ZW0gVHJ1bmNhdGUKLVRydW5jYXRlIHRoZSBmZWVkIGZpbGUsIHJhdGhlciB0aGFuIGFwcGVuZGluZyB0byBpdC4gQnkgZGVmYXVsdAotQGNvbW1hbmR7ZmZzZXJ2ZXJ9IHdpbGwgYXBwZW5kIGRhdGEgdG8gdGhlIGZpbGUsIHVudGlsIHRoZSBtYXhpbXVtCi1maWxlIHNpemUgdmFsdWUgaXMgcmVhY2hlZCAoc2VlIEBvcHRpb257RmlsZU1heFNpemV9IG9wdGlvbikuCi0KLUBpdGVtIEZpbGVNYXhTaXplIEB2YXJ7c2l6ZX0KLVNldCBtYXhpbXVtIHNpemUgb2YgdGhlIGZlZWQgZmlsZSBpbiBieXRlcy4gMCBtZWFucyB1bmxpbWl0ZWQuIFRoZQotcG9zdGZpeGVzIEBjb2Rle0t9ICgyXjEwKSwgQGNvZGV7TX0gKDJeMjApLCBhbmQgQGNvZGV7R30gKDJeMzApIGFyZQotcmVjb2duaXplZC4KLQotRGVmYXVsdCB2YWx1ZSBpcyA1TS4KLQotQGl0ZW0gTGF1bmNoIEB2YXJ7YXJnc30KLUxhdW5jaCBhbiBAY29tbWFuZHtmZm1wZWd9IGNvbW1hbmQgd2hlbiBjcmVhdGluZyBAY29tbWFuZHtmZnNlcnZlcn0uCi0KLUB2YXJ7YXJnc30gbXVzdCBiZSBhIHNlcXVlbmNlIG9mIGFyZ3VtZW50cyB0byBiZSBwcm92aWRlZCB0byBhbgotQGNvbW1hbmR7ZmZtcGVnfSBpbnN0YW5jZS4gVGhlIGZpcnN0IHByb3ZpZGVkIGFyZ3VtZW50IGlzIGlnbm9yZWQsIGFuZAotaXQgaXMgcmVwbGFjZWQgYnkgYSBwYXRoIHdpdGggdGhlIHNhbWUgZGlybmFtZSBvZiB0aGUgQGNvbW1hbmR7ZmZzZXJ2ZXJ9Ci1pbnN0YW5jZSwgZm9sbG93ZWQgYnkgdGhlIHJlbWFpbmluZyBhcmd1bWVudCBhbmQgdGVybWluYXRlZCB3aXRoIGEKLXBhdGggY29ycmVzcG9uZGluZyB0byB0aGUgZmVlZC4KLQotV2hlbiB0aGUgbGF1bmNoZWQgcHJvY2VzcyBleGl0cywgQGNvbW1hbmR7ZmZzZXJ2ZXJ9IHdpbGwgbGF1bmNoCi1hbm90aGVyIHByb2dyYW0gaW5zdGFuY2UuCi0KLUluIGNhc2UgeW91IG5lZWQgYSBtb3JlIGNvbXBsZXggQGNvbW1hbmR7ZmZtcGVnfSBjb25maWd1cmF0aW9uLAotZS5nLiBpZiB5b3UgbmVlZCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBGRk0gZmVlZHMgd2l0aCBhIHNpbmdsZQotQGNvbW1hbmR7ZmZtcGVnfSBpbnN0YW5jZSwgeW91IHNob3VsZCBsYXVuY2ggQGNvbW1hbmR7ZmZtcGVnfSBieSBoYW5kLgotCi1UaGlzIG9wdGlvbiBpcyBpZ25vcmVkIGluIGNhc2UgdGhlIGNvbW1hbmRsaW5lIG9wdGlvbiBAb3B0aW9uey1ufSBpcwotc3BlY2lmaWVkLgotCi1AaXRlbSBBQ0wgQHZhcntzcGVjfQotU3BlY2lmeSB0aGUgbGlzdCBvZiBJUCBhZGRyZXNzIHdoaWNoIGFyZSBhbGxvd2VkIG9yIGRlbmllZCB0byB3cml0ZQotdGhlIGZlZWQuIE11bHRpcGxlIEFDTCBvcHRpb25zIGNhbiBiZSBzcGVjaWZpZWQuCi1AZW5kIHRhYmxlCi0KLUBzZWN0aW9uIFN0cmVhbSBzZWN0aW9uCi0KLUEgU3RyZWFtIHNlY3Rpb24gZGVmaW5lcyBhIHN0cmVhbSBwcm92aWRlZCBieSBAY29tbWFuZHtmZnNlcnZlcn0sIGFuZAotaWRlbnRpZmllZCBieSBhIHNpbmdsZSBuYW1lLgotCi1UaGUgc3RyZWFtIGlzIHNlbnQgd2hlbiBhbnN3ZXJpbmcgYSByZXF1ZXN0IGNvbnRhaW5pbmcgdGhlIHN0cmVhbQotbmFtZS4KLQotQSBzdHJlYW0gc2VjdGlvbiBtdXN0IGJlIGludHJvZHVjZWQgYnkgdGhlIGxpbmU6Ci1AZXhhbXBsZQotPFN0cmVhbSBTVFJFQU1fTkFNRT4KLUBlbmQgZXhhbXBsZQotCi13aGVyZSBAdmFye1NUUkVBTV9OQU1FfSBzcGVjaWZpZXMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBzdHJlYW0uCi0KLVRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcmVjb2duaXplZCB3aXRoaW4gYSBTdHJlYW0gc2VjdGlvbi4KLQotRW5jb2Rpbmcgb3B0aW9ucyBhcmUgbWFya2VkIHdpdGggdGhlIEBlbXBoe2VuY29kaW5nfSB0YWcsIGFuZCB0aGV5IGFyZQotdXNlZCB0byBzZXQgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMsIGFuZCBhcmUgbWFwcGVkIHRvIGxpYmF2Y29kZWMKLWVuY29kaW5nIG9wdGlvbnMuIE5vdCBhbGwgZW5jb2Rpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkLCBpbgotcGFydGljdWxhciBpdCBpcyBub3QgcG9zc2libGUgdG8gc2V0IGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zLiBJbiBvcmRlcgotdG8gb3ZlcnJpZGUgdGhlIGVuY29kaW5nIG9wdGlvbnMgc3BlY2lmaWVkIGJ5IEBjb21tYW5ke2Zmc2VydmVyfSwgeW91Ci1jYW4gdXNlIHRoZSBAY29tbWFuZHtmZm1wZWd9IEBvcHRpb257b3ZlcnJpZGVfZmZzZXJ2ZXJ9IGNvbW1hbmRsaW5lCi1vcHRpb24uCi0KLU9ubHkgb25lIG9mIHRoZSBAb3B0aW9ue0ZlZWR9IGFuZCBAb3B0aW9ue0ZpbGV9IG9wdGlvbnMgc2hvdWxkIGJlIHNldC4KLQotQHRhYmxlIEBvcHRpb24KLUBpdGVtIEZlZWQgQHZhcntmZWVkX25hbWV9Ci1TZXQgdGhlIGlucHV0IGZlZWQuIEB2YXJ7ZmVlZF9uYW1lfSBtdXN0IGNvcnJlc3BvbmQgdG8gYW4gZXhpc3RpbmcKLWZlZWQgZGVmaW5lZCBpbiBhIEBjb2Rle0ZlZWR9IHNlY3Rpb24uCi0KLVdoZW4gdGhpcyBvcHRpb24gaXMgc2V0LCBlbmNvZGluZyBvcHRpb25zIGFyZSB1c2VkIHRvIHNldHVwIHRoZQotZW5jb2Rpbmcgb3BlcmF0ZWQgYnkgdGhlIHJlbW90ZSBAY29tbWFuZHtmZm1wZWd9IHByb2Nlc3MuCi0KLUBpdGVtIEZpbGUgQHZhcntmaWxlbmFtZX0KLVNldCB0aGUgZmlsZW5hbWUgb2YgdGhlIHByZS1yZWNvcmRlZCBpbnB1dCBmaWxlIHRvIHN0cmVhbS4KLQotV2hlbiB0aGlzIG9wdGlvbiBpcyBzZXQsIGVuY29kaW5nIG9wdGlvbnMgYXJlIGlnbm9yZWQgYW5kIHRoZSBpbnB1dAotZmlsZSBjb250ZW50IGlzIHJlLXN0cmVhbWVkIGFzIGlzLgotCi1AaXRlbSBGb3JtYXQgQHZhcntmb3JtYXRfbmFtZX0KLVNldCB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgc3RyZWFtLgotCi1NdXN0IGJlIHRoZSBuYW1lIG9mIGEgZm9ybWF0IHJlY29nbml6ZWQgYnkgRkZtcGVnLiBJZiBzZXQgdG8KLUBzYW1we3N0YXR1c30sIGl0IGlzIHRyZWF0ZWQgYXMgYSBzdGF0dXMgc3RyZWFtLgotCi1AaXRlbSBJbnB1dEZvcm1hdCBAdmFye2Zvcm1hdF9uYW1lfQotU2V0IGlucHV0IGZvcm1hdC4gSWYgbm90IHNwZWNpZmllZCwgaXQgaXMgYXV0b21hdGljYWxseSBndWVzc2VkLgotCi1AaXRlbSBQcmVyb2xsIEB2YXJ7bn0KLVNldCB0aGlzIHRvIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiYWNrd2FyZHMgaW4gdGltZSB0byBzdGFydC4gTm90ZSB0aGF0Ci1tb3N0IHBsYXllcnMgd2lsbCBidWZmZXIgNS0xMCBzZWNvbmRzIG9mIHZpZGVvLCBhbmQgYWxzbyB5b3UgbmVlZCB0byBhbGxvdwotZm9yIGEga2V5ZnJhbWUgdG8gYXBwZWFyIGluIHRoZSBkYXRhIHN0cmVhbS4KLQotRGVmYXVsdCB2YWx1ZSBpcyAwLgotCi1AaXRlbSBTdGFydFNlbmRPbktleQotRG8gbm90IHNlbmQgc3RyZWFtIHVudGlsIGl0IGdldHMgdGhlIGZpcnN0IGtleSBmcmFtZS4gQnkgZGVmYXVsdAotQGNvbW1hbmR7ZmZzZXJ2ZXJ9IHdpbGwgc2VuZCBkYXRhIGltbWVkaWF0ZWx5LgotCi1AaXRlbSBNYXhUaW1lIEB2YXJ7bn0KLVNldCB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gcnVuLiBUaGlzIHZhbHVlIHNldCB0aGUgbWF4aW11bSBkdXJhdGlvbgotb2YgdGhlIHN0cmVhbSBhIGNsaWVudCB3aWxsIGJlIGFibGUgdG8gcmVjZWl2ZS4KLQotQSB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgbm8gbGltaXQgaXMgc2V0IG9uIHRoZSBzdHJlYW0gZHVyYXRpb24uCi0KLUBpdGVtIEFDTCBAdmFye3NwZWN9Ci1TZXQgQUNMIGZvciB0aGUgc3RyZWFtLgotCi1AaXRlbSBEeW5hbWljQUNMIEB2YXJ7c3BlY30KLQotQGl0ZW0gUlRTUE9wdGlvbiBAdmFye29wdGlvbn0KLQotQGl0ZW0gTXVsdGljYXN0QWRkcmVzcyBAdmFye2FkZHJlc3N9Ci0KLUBpdGVtIE11bHRpY2FzdFBvcnQgQHZhcntwb3J0fQotCi1AaXRlbSBNdWx0aWNhc3RUVEwgQHZhcntpbnRlZ2VyfQotCi1AaXRlbSBOb0xvb3AKLQotQGl0ZW0gRmF2aWNvblVSTCBAdmFye3VybH0KLVNldCBmYXZpY29uIChmYXZvdXJpdGUgaWNvbikgZm9yIHRoZSBzZXJ2ZXIgc3RhdHVzIHBhZ2UuIEl0IGlzIGlnbm9yZWQKLWZvciByZWd1bGFyIHN0cmVhbXMuCi0KLUBpdGVtIEF1dGhvciBAdmFye3ZhbHVlfQotQGl0ZW0gQ29tbWVudCBAdmFye3ZhbHVlfQotQGl0ZW0gQ29weXJpZ2h0IEB2YXJ7dmFsdWV9Ci1AaXRlbSBUaXRsZSBAdmFye3ZhbHVlfQotU2V0IG1ldGFkYXRhIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9wdGlvbi4gQWxsIHRoZXNlIG9wdGlvbnMgYXJlCi1kZXByZWNhdGVkIGluIGZhdm9yIG9mIEBvcHRpb257TWV0YWRhdGF9LgotCi1AaXRlbSBNZXRhZGF0YSBAdmFye2tleX0gQHZhcnt2YWx1ZX0KLVNldCBtZXRhZGF0YSB2YWx1ZSBvbiB0aGUgb3V0cHV0IHN0cmVhbS4KLQotQGl0ZW0gVXNlRGVmYXVsdHMKLUBpdGVtIE5vRGVmYXVsdHMKLUNvbnRyb2wgd2hldGhlciBkZWZhdWx0IGNvZGVjIG9wdGlvbnMgYXJlIHVzZWQgZm9yIHRoZSBzdHJlYW0gb3Igbm90LgotRGVmYXVsdCBpcyBAdmFye1VzZURlZmF1bHRzfSB1bmxlc3MgZGlzYWJsZWQgZ2xvYmFsbHkuCi0KLUBpdGVtIE5vQXVkaW8KLUBpdGVtIE5vVmlkZW8KLVN1cHByZXNzIGF1ZGlvL3ZpZGVvLgotCi1AaXRlbSBBdWRpb0NvZGVjIEB2YXJ7Y29kZWNfbmFtZX0gKEBlbXBoe2VuY29kaW5nLGF1ZGlvfSkKLVNldCBhdWRpbyBjb2RlYy4KLQotQGl0ZW0gQXVkaW9CaXRSYXRlIEB2YXJ7cmF0ZX0gKEBlbXBoe2VuY29kaW5nLGF1ZGlvfSkKLVNldCBiaXRyYXRlIGZvciB0aGUgYXVkaW8gc3RyZWFtIGluIGtiaXRzIHBlciBzZWNvbmQuCi0KLUBpdGVtIEF1ZGlvQ2hhbm5lbHMgQHZhcntufSAoQGVtcGh7ZW5jb2RpbmcsYXVkaW99KQotU2V0IG51bWJlciBvZiBhdWRpbyBjaGFubmVscy4KLQotQGl0ZW0gQXVkaW9TYW1wbGVSYXRlIEB2YXJ7bn0gKEBlbXBoe2VuY29kaW5nLGF1ZGlvfSkKLVNldCBzYW1wbGluZyBmcmVxdWVuY3kgZm9yIGF1ZGlvLiBXaGVuIHVzaW5nIGxvdyBiaXRyYXRlcywgeW91IHNob3VsZAotbG93ZXIgdGhpcyBmcmVxdWVuY3kgdG8gMjIwNTAgb3IgMTEwMjUuIFRoZSBzdXBwb3J0ZWQgZnJlcXVlbmNpZXMKLWRlcGVuZCBvbiB0aGUgc2VsZWN0ZWQgYXVkaW8gY29kZWMuCi0KLUBpdGVtIEFWT3B0aW9uQXVkaW8gW0B2YXJ7Y29kZWN9Ol1AdmFye29wdGlvbn0gQHZhcnt2YWx1ZX0gKEBlbXBoe2VuY29kaW5nLGF1ZGlvfSkKLVNldCBnZW5lcmljIG9yIHByaXZhdGUgb3B0aW9uIGZvciBhdWRpbyBzdHJlYW0uCi1Qcml2YXRlIG9wdGlvbiBtdXN0IGJlIHByZWZpeGVkIHdpdGggY29kZWMgbmFtZSBvciBjb2RlYyBtdXN0IGJlIGRlZmluZWQgYmVmb3JlLgotCi1AaXRlbSBBVlByZXNldEF1ZGlvIEB2YXJ7cHJlc2V0fSAoQGVtcGh7ZW5jb2RpbmcsYXVkaW99KQotU2V0IHByZXNldCBmb3IgYXVkaW8gc3RyZWFtLgotCi1AaXRlbSBWaWRlb0NvZGVjIEB2YXJ7Y29kZWNfbmFtZX0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKLVNldCB2aWRlbyBjb2RlYy4KLQotQGl0ZW0gVmlkZW9CaXRSYXRlIEB2YXJ7bn0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKLVNldCBiaXRyYXRlIGZvciB0aGUgdmlkZW8gc3RyZWFtIGluIGtiaXRzIHBlciBzZWNvbmQuCi0KLUBpdGVtIFZpZGVvQml0UmF0ZVJhbmdlIEB2YXJ7cmFuZ2V9IChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgdmlkZW8gYml0cmF0ZSByYW5nZS4KLQotQSByYW5nZSBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgZm9ybSBAdmFye21pbnJhdGV9LUB2YXJ7bWF4cmF0ZX0sIGFuZAotc3BlY2lmaWVzIHRoZSBAb3B0aW9ue21pbnJhdGV9IGFuZCBAb3B0aW9ue21heHJhdGV9IGVuY29kaW5nIG9wdGlvbnMKLWV4cHJlc3NlZCBpbiBrYml0cyBwZXIgc2Vjb25kLgotCi1AaXRlbSBWaWRlb0JpdFJhdGVSYW5nZVRvbGVyYW5jZSBAdmFye259IChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgdmlkZW8gYml0cmF0ZSB0b2xlcmFuY2UgaW4ga2JpdHMgcGVyIHNlY29uZC4KLQotQGl0ZW0gUGl4ZWxGb3JtYXQgQHZhcntwaXhlbF9mb3JtYXR9IChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgdmlkZW8gcGl4ZWwgZm9ybWF0LgotCi1AaXRlbSBEZWJ1ZyBAdmFye2ludGVnZXJ9IChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgdmlkZW8gQG9wdGlvbntkZWJ1Z30gZW5jb2Rpbmcgb3B0aW9uLgotCi1AaXRlbSBTdHJpY3QgQHZhcntpbnRlZ2VyfSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQotU2V0IHZpZGVvIEBvcHRpb257c3RyaWN0fSBlbmNvZGluZyBvcHRpb24uCi0KLUBpdGVtIFZpZGVvQnVmZmVyU2l6ZSBAdmFye259IChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgcmF0ZWNvbnRyb2wgYnVmZmVyIHNpemUsIGV4cHJlc3NlZCBpbiBLQi4KLQotQGl0ZW0gVmlkZW9GcmFtZVJhdGUgQHZhcntufSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQotU2V0IG51bWJlciBvZiB2aWRlbyBmcmFtZXMgcGVyIHNlY29uZC4KLQotQGl0ZW0gVmlkZW9TaXplIChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgc2l6ZSBvZiB0aGUgdmlkZW8gZnJhbWUsIG11c3QgYmUgYW4gYWJicmV2aWF0aW9uIG9yIGluIHRoZSBmb3JtCi1AdmFye1d9eEB2YXJ7SH0uICBTZWUgQHJlZnt2aWRlbyBzaXplIHN5bnRheCwsdGhlIFZpZGVvIHNpemUgc2VjdGlvbgotaW4gdGhlIGZmbXBlZy11dGlscygxKSBtYW51YWwsZmZtcGVnLXV0aWxzfS4KLQotRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXsxNjB4MTI4fS4KLQotQGl0ZW0gVmlkZW9JbnRyYU9ubHkgKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKLVRyYW5zbWl0IG9ubHkgaW50cmEgZnJhbWVzICh1c2VmdWwgZm9yIGxvdyBiaXRyYXRlcywgYnV0IGtpbGxzIGZyYW1lIHJhdGUpLgotCi1AaXRlbSBWaWRlb0dvcFNpemUgQHZhcntufSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQotSWYgbm9uLWludHJhIG9ubHksIGFuIGludHJhIGZyYW1lIGlzIHRyYW5zbWl0dGVkIGV2ZXJ5IFZpZGVvR29wU2l6ZQotZnJhbWVzLiBWaWRlbyBzeW5jaHJvbml6YXRpb24gY2FuIG9ubHkgYmVnaW4gYXQgYW4gaW50cmEgZnJhbWUuCi0KLUBpdGVtIFZpZGVvVGFnIEB2YXJ7dGFnfSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQotU2V0IHZpZGVvIHRhZy4KLQotQGl0ZW0gVmlkZW9IaWdoUXVhbGl0eSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQotQGl0ZW0gVmlkZW80TW90aW9uVmVjdG9yIChAZW1waHtlbmNvZGluZyx2aWRlb30pCi0KLUBpdGVtIEJpdEV4YWN0IChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgYml0ZXhhY3QgZW5jb2RpbmcgZmxhZy4KLQotQGl0ZW0gSWRjdFNpbXBsZSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQotU2V0IHNpbXBsZSBJRENUIGFsZ29yaXRobS4KLQotQGl0ZW0gUXNjYWxlIEB2YXJ7bn0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKLUVuYWJsZSBjb25zdGFudCBxdWFsaXR5IGVuY29kaW5nLCBhbmQgc2V0IHZpZGVvIHFzY2FsZSAocXVhbnRpemF0aW9uCi1zY2FsZSkgdmFsdWUsIGV4cHJlc3NlZCBpbiBAdmFye259IFFQIHVuaXRzLgotCi1AaXRlbSBWaWRlb1FNaW4gQHZhcntufSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQotQGl0ZW0gVmlkZW9RTWF4IEB2YXJ7bn0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKLVNldCB2aWRlbyBxbWluL3FtYXguCi0KLUBpdGVtIFZpZGVvUURpZmYgQHZhcntpbnRlZ2VyfSAoQGVtcGh7ZW5jb2RpbmcsdmlkZW99KQotU2V0IHZpZGVvIEBvcHRpb257cWRpZmZ9IGVuY29kaW5nIG9wdGlvbi4KLQotQGl0ZW0gTHVtaU1hc2sgQHZhcntmbG9hdH0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKLUBpdGVtIERhcmtNYXNrIEB2YXJ7ZmxvYXR9IChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgQG9wdGlvbntsdW1pX21hc2t9L0BvcHRpb257ZGFya19tYXNrfSBlbmNvZGluZyBvcHRpb25zLgotCi1AaXRlbSBBVk9wdGlvblZpZGVvIFtAdmFye2NvZGVjfTpdQHZhcntvcHRpb259IEB2YXJ7dmFsdWV9IChAZW1waHtlbmNvZGluZyx2aWRlb30pCi1TZXQgZ2VuZXJpYyBvciBwcml2YXRlIG9wdGlvbiBmb3IgdmlkZW8gc3RyZWFtLgotUHJpdmF0ZSBvcHRpb24gbXVzdCBiZSBwcmVmaXhlZCB3aXRoIGNvZGVjIG5hbWUgb3IgY29kZWMgbXVzdCBiZSBkZWZpbmVkIGJlZm9yZS4KLQotQGl0ZW0gQVZQcmVzZXRWaWRlbyBAdmFye3ByZXNldH0gKEBlbXBoe2VuY29kaW5nLHZpZGVvfSkKLVNldCBwcmVzZXQgZm9yIHZpZGVvIHN0cmVhbS4KLQotQHZhcntwcmVzZXR9IG11c3QgYmUgdGhlIHBhdGggb2YgYSBwcmVzZXQgZmlsZS4KLUBlbmQgdGFibGUKLQotQHN1YnNlY3Rpb24gU2VydmVyIHN0YXR1cyBzdHJlYW0KLQotQSBzZXJ2ZXIgc3RhdHVzIHN0cmVhbSBpcyBhIHNwZWNpYWwgc3RyZWFtIHdoaWNoIGlzIHVzZWQgdG8gc2hvdwotc3RhdGlzdGljcyBhYm91dCB0aGUgQGNvbW1hbmR7ZmZzZXJ2ZXJ9IG9wZXJhdGlvbnMuCi0KLUl0IG11c3QgYmUgc3BlY2lmaWVkIHNldHRpbmcgdGhlIG9wdGlvbiBAb3B0aW9ue0Zvcm1hdH0gdG8KLUBzYW1we3N0YXR1c30uCi0KLUBzZWN0aW9uIFJlZGlyZWN0IHNlY3Rpb24KLQotQSByZWRpcmVjdCBzZWN0aW9uIHNwZWNpZmllcyB3aGVyZSB0byByZWRpcmVjdCB0aGUgcmVxdWVzdGVkIFVSTCB0bwotYW5vdGhlciBwYWdlLgotCi1BIHJlZGlyZWN0IHNlY3Rpb24gbXVzdCBiZSBpbnRyb2R1Y2VkIGJ5IHRoZSBsaW5lOgotQGV4YW1wbGUKLTxSZWRpcmVjdCBOQU1FPgotQGVuZCBleGFtcGxlCi0KLXdoZXJlIEB2YXJ7TkFNRX0gaXMgdGhlIG5hbWUgb2YgdGhlIHBhZ2Ugd2hpY2ggc2hvdWxkIGJlIHJlZGlyZWN0ZWQuCi0KLUl0IG9ubHkgYWNjZXB0cyB0aGUgb3B0aW9uIEBvcHRpb257VVJMfSwgd2hpY2ggc3BlY2lmeSB0aGUgcmVkaXJlY3Rpb24KLVVSTC4KLQotQGNoYXB0ZXIgU3RyZWFtIGV4YW1wbGVzCi0KLUBpdGVtaXplCi1AaXRlbQotTXVsdGlwYXJ0IEpQRUcKLUBleGFtcGxlCi08U3RyZWFtIHRlc3QubWpwZz4KLUZlZWQgZmVlZDEuZmZtCi1Gb3JtYXQgbXBqcGVnCi1WaWRlb0ZyYW1lUmF0ZSAyCi1WaWRlb0ludHJhT25seQotTm9BdWRpbwotU3RyaWN0IC0xCi08L1N0cmVhbT4KLUBlbmQgZXhhbXBsZQotCi1AaXRlbQotU2luZ2xlIEpQRUcKLUBleGFtcGxlCi08U3RyZWFtIHRlc3QuanBnPgotRmVlZCBmZWVkMS5mZm0KLUZvcm1hdCBqcGVnCi1WaWRlb0ZyYW1lUmF0ZSAyCi1WaWRlb0ludHJhT25seQotVmlkZW9TaXplIDM1MngyNDAKLU5vQXVkaW8KLVN0cmljdCAtMQotPC9TdHJlYW0+Ci1AZW5kIGV4YW1wbGUKLQotQGl0ZW0KLUZsYXNoCi1AZXhhbXBsZQotPFN0cmVhbSB0ZXN0LnN3Zj4KLUZlZWQgZmVlZDEuZmZtCi1Gb3JtYXQgc3dmCi1WaWRlb0ZyYW1lUmF0ZSAyCi1WaWRlb0ludHJhT25seQotTm9BdWRpbwotPC9TdHJlYW0+Ci1AZW5kIGV4YW1wbGUKLQotQGl0ZW0KLUFTRiBjb21wYXRpYmxlCi1AZXhhbXBsZQotPFN0cmVhbSB0ZXN0LmFzZj4KLUZlZWQgZmVlZDEuZmZtCi1Gb3JtYXQgYXNmCi1WaWRlb0ZyYW1lUmF0ZSAxNQotVmlkZW9TaXplIDM1MngyNDAKLVZpZGVvQml0UmF0ZSAyNTYKLVZpZGVvQnVmZmVyU2l6ZSA0MAotVmlkZW9Hb3BTaXplIDMwCi1BdWRpb0JpdFJhdGUgNjQKLVN0YXJ0U2VuZE9uS2V5Ci08L1N0cmVhbT4KLUBlbmQgZXhhbXBsZQotCi1AaXRlbQotTVAzIGF1ZGlvCi1AZXhhbXBsZQotPFN0cmVhbSB0ZXN0Lm1wMz4KLUZlZWQgZmVlZDEuZmZtCi1Gb3JtYXQgbXAyCi1BdWRpb0NvZGVjIG1wMwotQXVkaW9CaXRSYXRlIDY0Ci1BdWRpb0NoYW5uZWxzIDEKLUF1ZGlvU2FtcGxlUmF0ZSA0NDEwMAotTm9WaWRlbwotPC9TdHJlYW0+Ci1AZW5kIGV4YW1wbGUKLQotQGl0ZW0KLU9nZyBWb3JiaXMgYXVkaW8KLUBleGFtcGxlCi08U3RyZWFtIHRlc3Qub2dnPgotRmVlZCBmZWVkMS5mZm0KLU1ldGFkYXRhIHRpdGxlICJTdHJlYW0gdGl0bGUiCi1BdWRpb0JpdFJhdGUgNjQKLUF1ZGlvQ2hhbm5lbHMgMgotQXVkaW9TYW1wbGVSYXRlIDQ0MTAwCi1Ob1ZpZGVvCi08L1N0cmVhbT4KLUBlbmQgZXhhbXBsZQotCi1AaXRlbQotUmVhbCB3aXRoIGF1ZGlvIG9ubHkgYXQgMzIga2JpdHMKLUBleGFtcGxlCi08U3RyZWFtIHRlc3QucmE+Ci1GZWVkIGZlZWQxLmZmbQotRm9ybWF0IHJtCi1BdWRpb0JpdFJhdGUgMzIKLU5vVmlkZW8KLTwvU3RyZWFtPgotQGVuZCBleGFtcGxlCi0KLUBpdGVtCi1SZWFsIHdpdGggYXVkaW8gYW5kIHZpZGVvIGF0IDY0IGtiaXRzCi1AZXhhbXBsZQotPFN0cmVhbSB0ZXN0LnJtPgotRmVlZCBmZWVkMS5mZm0KLUZvcm1hdCBybQotQXVkaW9CaXRSYXRlIDMyCi1WaWRlb0JpdFJhdGUgMTI4Ci1WaWRlb0ZyYW1lUmF0ZSAyNQotVmlkZW9Hb3BTaXplIDI1Ci08L1N0cmVhbT4KLUBlbmQgZXhhbXBsZQotCi1AaXRlbQotRm9yIHN0cmVhbSBjb21pbmcgZnJvbSBhIGZpbGU6IHlvdSBvbmx5IG5lZWQgdG8gc2V0IHRoZSBpbnB1dCBmaWxlbmFtZQotYW5kIG9wdGlvbmFsbHkgYSBuZXcgZm9ybWF0LgotCi1AZXhhbXBsZQotPFN0cmVhbSBmaWxlLnJtPgotRmlsZSAiL3Vzci9sb2NhbC9odHRwZC9odGRvY3MvdGxpdmUucm0iCi1Ob0F1ZGlvCi08L1N0cmVhbT4KLUBlbmQgZXhhbXBsZQotCi1AZXhhbXBsZQotPFN0cmVhbSBmaWxlLmFzZj4KLUZpbGUgIi91c3IvbG9jYWwvaHR0cGQvaHRkb2NzL3Rlc3QuYXNmIgotTm9BdWRpbwotTWV0YWRhdGEgYXV0aG9yICJNZSIKLU1ldGFkYXRhIGNvcHlyaWdodCAiU3VwZXIgTWVnYUNvcnAiCi1NZXRhZGF0YSB0aXRsZSAiVGVzdCBzdHJlYW0gZnJvbSBkaXNrIgotTWV0YWRhdGEgY29tbWVudCAiVGVzdCBjb21tZW50IgotPC9TdHJlYW0+Ci1AZW5kIGV4YW1wbGUKLUBlbmQgaXRlbWl6ZQotCi1AYyBtYW4gZW5kCi0KLUBpbmNsdWRlIGNvbmZpZy50ZXhpCi1AaWZzZXQgY29uZmlnLWFsbAotQGlmc2V0IGNvbmZpZy1hdnV0aWwKLUBpbmNsdWRlIHV0aWxzLnRleGkKLUBlbmQgaWZzZXQKLUBpZnNldCBjb25maWctYXZjb2RlYwotQGluY2x1ZGUgY29kZWNzLnRleGkKLUBpbmNsdWRlIGJpdHN0cmVhbV9maWx0ZXJzLnRleGkKLUBlbmQgaWZzZXQKLUBpZnNldCBjb25maWctYXZmb3JtYXQKLUBpbmNsdWRlIGZvcm1hdHMudGV4aQotQGluY2x1ZGUgcHJvdG9jb2xzLnRleGkKLUBlbmQgaWZzZXQKLUBpZnNldCBjb25maWctYXZkZXZpY2UKLUBpbmNsdWRlIGRldmljZXMudGV4aQotQGVuZCBpZnNldAotQGlmc2V0IGNvbmZpZy1zd3Jlc2FtcGxlCi1AaW5jbHVkZSByZXNhbXBsZXIudGV4aQotQGVuZCBpZnNldAotQGlmc2V0IGNvbmZpZy1zd3NjYWxlCi1AaW5jbHVkZSBzY2FsZXIudGV4aQotQGVuZCBpZnNldAotQGlmc2V0IGNvbmZpZy1hdmZpbHRlcgotQGluY2x1ZGUgZmlsdGVycy50ZXhpCi1AZW5kIGlmc2V0Ci1AZW5kIGlmc2V0Ci0KLUBjaGFwdGVyIFNlZSBBbHNvCi0KLUBpZmh0bWwKLUBpZnNldCBjb25maWctYWxsCi1AdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAotQGVuZCBpZnNldAotQGlmc2V0IGNvbmZpZy1ub3QtYWxsCi1AdXJse2Zmc2VydmVyLWFsbC5odG1sLGZmc2VydmVyLWFsbH0sCi1AZW5kIGlmc2V0Ci10aGUgQGZpbGV7ZG9jL2Zmc2VydmVyLmNvbmZ9IGV4YW1wbGUsCi1AdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sCi1AdXJse2ZmbXBlZy11dGlscy5odG1sLGZmbXBlZy11dGlsc30sCi1AdXJse2ZmbXBlZy1zY2FsZXIuaHRtbCxmZm1wZWctc2NhbGVyfSwKLUB1cmx7ZmZtcGVnLXJlc2FtcGxlci5odG1sLGZmbXBlZy1yZXNhbXBsZXJ9LAotQHVybHtmZm1wZWctY29kZWNzLmh0bWwsZmZtcGVnLWNvZGVjc30sCi1AdXJse2ZmbXBlZy1iaXRzdHJlYW0tZmlsdGVycy5odG1sLGZmbXBlZy1iaXRzdHJlYW0tZmlsdGVyc30sCi1AdXJse2ZmbXBlZy1mb3JtYXRzLmh0bWwsZmZtcGVnLWZvcm1hdHN9LAotQHVybHtmZm1wZWctZGV2aWNlcy5odG1sLGZmbXBlZy1kZXZpY2VzfSwKLUB1cmx7ZmZtcGVnLXByb3RvY29scy5odG1sLGZmbXBlZy1wcm90b2NvbHN9LAotQHVybHtmZm1wZWctZmlsdGVycy5odG1sLGZmbXBlZy1maWx0ZXJzfQotQGVuZCBpZmh0bWwKLQotQGlmbm90aHRtbAotQGlmc2V0IGNvbmZpZy1hbGwKLWZmc2VydmVyKDEpLAotQGVuZCBpZnNldAotQGlmc2V0IGNvbmZpZy1ub3QtYWxsCi1mZnNlcnZlci1hbGwoMSksCi1AZW5kIGlmc2V0Ci10aGUgQGZpbGV7ZG9jL2Zmc2VydmVyLmNvbmZ9IGV4YW1wbGUsIGZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLAotZmZtcGVnLXV0aWxzKDEpLCBmZm1wZWctc2NhbGVyKDEpLCBmZm1wZWctcmVzYW1wbGVyKDEpLAotZmZtcGVnLWNvZGVjcygxKSwgZmZtcGVnLWJpdHN0cmVhbS1maWx0ZXJzKDEpLCBmZm1wZWctZm9ybWF0cygxKSwKLWZmbXBlZy1kZXZpY2VzKDEpLCBmZm1wZWctcHJvdG9jb2xzKDEpLCBmZm1wZWctZmlsdGVycygxKQotQGVuZCBpZm5vdGh0bWwKLQotQGluY2x1ZGUgYXV0aG9ycy50ZXhpCi0KLUBpZ25vcmUKLQotQHNldGZpbGVuYW1lIGZmc2VydmVyCi1Ac2V0dGl0bGUgZmZzZXJ2ZXIgdmlkZW8gc2VydmVyCi0KLUBlbmQgaWdub3JlCi0KLUBieWUKZGlmZiAtLWdpdCBhL2RvYy9mZnRvb2xzLWNvbW1vbi1vcHRzLnRleGkgYi9kb2MvZmZ0b29scy1jb21tb24tb3B0cy50ZXhpCmluZGV4IDUwOWM4YmMuLjg0NzA1YzAgMTAwNjQ0Ci0tLSBhL2RvYy9mZnRvb2xzLWNvbW1vbi1vcHRzLnRleGkKKysrIGIvZG9jL2ZmdG9vbHMtY29tbW9uLW9wdHMudGV4aQpAQCAtNDIsMTAgKzQyLDIwIEBACiB0aHVtYm5haWxzIG9yIGNvdmVyIGFydHMuICBJZiBAdmFye3N0cmVhbV9pbmRleH0gaXMgZ2l2ZW4sIHRoZW4gaXQgbWF0Y2hlcwogc3RyZWFtIG51bWJlciBAdmFye3N0cmVhbV9pbmRleH0gb2YgdGhpcyB0eXBlLiBPdGhlcndpc2UsIGl0IG1hdGNoZXMgYWxsCiBzdHJlYW1zIG9mIHRoaXMgdHlwZS4KLUBpdGVtIHA6QHZhcntwcm9ncmFtX2lkfVs6QHZhcntzdHJlYW1faW5kZXh9XQotSWYgQHZhcntzdHJlYW1faW5kZXh9IGlzIGdpdmVuLCB0aGVuIGl0IG1hdGNoZXMgdGhlIHN0cmVhbSB3aXRoIG51bWJlciBAdmFye3N0cmVhbV9pbmRleH0KK0BpdGVtIHA6QHZhcntwcm9ncmFtX2lkfVs6QHZhcntzdHJlYW1faW5kZXh9XSBvciBwOkB2YXJ7cHJvZ3JhbV9pZH1bOkB2YXJ7c3RyZWFtX3R5cGV9WzpAdmFye3N0cmVhbV9pbmRleH1dXSBvcgorcDpAdmFye3Byb2dyYW1faWR9Om06QHZhcntrZXl9WzpAdmFye3ZhbHVlfV0KK0luIGZpcnN0IHZlcnNpb24sIGlmIEB2YXJ7c3RyZWFtX2luZGV4fSBpcyBnaXZlbiwgdGhlbiBpdCBtYXRjaGVzIHRoZSBzdHJlYW0gd2l0aCBudW1iZXIgQHZhcntzdHJlYW1faW5kZXh9CiBpbiB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBpZCBAdmFye3Byb2dyYW1faWR9LiBPdGhlcndpc2UsIGl0IG1hdGNoZXMgYWxsIHN0cmVhbXMgaW4gdGhlCi1wcm9ncmFtLgorcHJvZ3JhbS4gSW4gdGhlIHNlY29uZCB2ZXJzaW9uLCBAdmFye3N0cmVhbV90eXBlfSBpcyBvbmUgb2YgZm9sbG93aW5nOiAndicgZm9yIHZpZGVvLCAnYScgZm9yIGF1ZGlvLCAncycKK2ZvciBzdWJ0aXRsZSwgJ2QnIGZvciBkYXRhLiBJZiBAdmFye3N0cmVhbV9pbmRleH0gaXMgYWxzbyBnaXZlbiwgdGhlbiBpdCBtYXRjaGVzCitzdHJlYW0gbnVtYmVyIEB2YXJ7c3RyZWFtX2luZGV4fSBvZiB0aGlzIHR5cGUgaW4gdGhlIHByb2dyYW0gd2l0aCB0aGUgaWQgQHZhcntwcm9ncmFtX2lkfS4KK090aGVyd2lzZSwgaWYgb25seSBAdmFye3N0cmVhbV90eXBlfSBpcyBnaXZlbiwgaXQgbWF0Y2hlcyBhbGwKK3N0cmVhbXMgb2YgdGhpcyB0eXBlIGluIHRoZSBwcm9ncmFtIHdpdGggdGhlIGlkIEB2YXJ7cHJvZ3JhbV9pZH0uCitJbiB0aGUgdGhpcmQgdmVyc2lvbiBtYXRjaGVzIHN0cmVhbXMgaW4gdGhlIHByb2dyYW0gd2l0aCB0aGUgaWQgQHZhcntwcm9ncmFtX2lkfSB3aXRoIHRoZSBtZXRhZGF0YQordGFnIEB2YXJ7a2V5fSBoYXZpbmcgdGhlIHNwZWNpZmllZCB2YWx1ZS4gSWYKK0B2YXJ7dmFsdWV9IGlzIG5vdCBnaXZlbiwgbWF0Y2hlcyBzdHJlYW1zIHRoYXQgY29udGFpbiB0aGUgZ2l2ZW4gdGFnIHdpdGggYW55Cit2YWx1ZS4KKwogQGl0ZW0gI0B2YXJ7c3RyZWFtX2lkfSBvciBpOkB2YXJ7c3RyZWFtX2lkfQogTWF0Y2ggdGhlIHN0cmVhbSBieSBzdHJlYW0gaWQgKGUuZy4gUElEIGluIE1QRUctVFMgY29udGFpbmVyKS4KIEBpdGVtIG06QHZhcntrZXl9WzpAdmFye3ZhbHVlfV0KQEAgLTExMCw2ICsxMjAsMTIgQEAKIEBpdGVtIC1mb3JtYXRzCiBTaG93IGF2YWlsYWJsZSBmb3JtYXRzIChpbmNsdWRpbmcgZGV2aWNlcykuCiAKK0BpdGVtIC1kZW11eGVycworU2hvdyBhdmFpbGFibGUgZGVtdXhlcnMuCisKK0BpdGVtIC1tdXhlcnMKK1Nob3cgYXZhaWxhYmxlIG11eGVycy4KKwogQGl0ZW0gLWRldmljZXMKIFNob3cgYXZhaWxhYmxlIGRldmljZXMuCiAKQEAgLTE0Nyw3ICsxNjMsNyBAQAogU2hvdyByZWNvZ25pemVkIGNvbG9yIG5hbWVzLgogCiBAaXRlbSAtc291cmNlcyBAdmFye2RldmljZX1bLEB2YXJ7b3B0MX09QHZhcnt2YWwxfVssQHZhcntvcHQyfT1AdmFye3ZhbDJ9XS4uLl0KLVNob3cgYXV0b2RldGVjdGVkIHNvdXJjZXMgb2YgdGhlIGludHB1dCBkZXZpY2UuCitTaG93IGF1dG9kZXRlY3RlZCBzb3VyY2VzIG9mIHRoZSBpbnB1dCBkZXZpY2UuCiBTb21lIGRldmljZXMgbWF5IHByb3ZpZGUgc3lzdGVtLWRlcGVuZGVudCBzb3VyY2UgbmFtZXMgdGhhdCBjYW5ub3QgYmUgYXV0b2RldGVjdGVkLgogVGhlIHJldHVybmVkIGxpc3QgY2Fubm90IGJlIGFzc3VtZWQgdG8gYmUgYWx3YXlzIGNvbXBsZXRlLgogQGV4YW1wbGUKQEAgLTE2MiwyNCArMTc4LDM0IEBACiBmZm1wZWcgLXNpbmtzIHB1bHNlLHNlcnZlcj0xOTIuMTY4LjAuNAogQGVuZCBleGFtcGxlCiAKLUBpdGVtIC1sb2dsZXZlbCBbcmVwZWF0K11AdmFye2xvZ2xldmVsfSB8IC12IFtyZXBlYXQrXUB2YXJ7bG9nbGV2ZWx9Ci1TZXQgdGhlIGxvZ2dpbmcgbGV2ZWwgdXNlZCBieSB0aGUgbGlicmFyeS4KLUFkZGluZyAicmVwZWF0KyIgaW5kaWNhdGVzIHRoYXQgcmVwZWF0ZWQgbG9nIG91dHB1dCBzaG91bGQgbm90IGJlIGNvbXByZXNzZWQKLXRvIHRoZSBmaXJzdCBsaW5lIGFuZCB0aGUgIkxhc3QgbWVzc2FnZSByZXBlYXRlZCBuIHRpbWVzIiBsaW5lIHdpbGwgYmUKLW9taXR0ZWQuICJyZXBlYXQiIGNhbiBhbHNvIGJlIHVzZWQgYWxvbmUuCi1JZiAicmVwZWF0IiBpcyB1c2VkIGFsb25lLCBhbmQgd2l0aCBubyBwcmlvciBsb2dsZXZlbCBzZXQsIHRoZSBkZWZhdWx0Ci1sb2dsZXZlbCB3aWxsIGJlIHVzZWQuIElmIG11bHRpcGxlIGxvZ2xldmVsIHBhcmFtZXRlcnMgYXJlIGdpdmVuLCB1c2luZwotJ3JlcGVhdCcgd2lsbCBub3QgY2hhbmdlIHRoZSBsb2dsZXZlbC4KK0BpdGVtIC1sb2dsZXZlbCBbQHZhcntmbGFnc30rXUB2YXJ7bG9nbGV2ZWx9IHwgLXYgW0B2YXJ7ZmxhZ3N9K11AdmFye2xvZ2xldmVsfQorU2V0IGxvZ2dpbmcgbGV2ZWwgYW5kIGZsYWdzIHVzZWQgYnkgdGhlIGxpYnJhcnkuCisKK1RoZSBvcHRpb25hbCBAdmFye2ZsYWdzfSBwcmVmaXggY2FuIGNvbnNpc3Qgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CitAdGFibGUgQHNhbXAKK0BpdGVtIHJlcGVhdAorSW5kaWNhdGVzIHRoYXQgcmVwZWF0ZWQgbG9nIG91dHB1dCBzaG91bGQgbm90IGJlIGNvbXByZXNzZWQgdG8gdGhlIGZpcnN0IGxpbmUKK2FuZCB0aGUgIkxhc3QgbWVzc2FnZSByZXBlYXRlZCBuIHRpbWVzIiBsaW5lIHdpbGwgYmUgb21pdHRlZC4KK0BpdGVtIGxldmVsCitJbmRpY2F0ZXMgdGhhdCBsb2cgb3V0cHV0IHNob3VsZCBhZGQgYSBAY29kZXtbbGV2ZWxdfSBwcmVmaXggdG8gZWFjaCBtZXNzYWdlCitsaW5lLiBUaGlzIGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvIGxvZyBjb2xvcmluZywgZS5nLiB3aGVuIGR1bXBpbmcgdGhlCitsb2cgdG8gZmlsZS4KK0BlbmQgdGFibGUKK0ZsYWdzIGNhbiBhbHNvIGJlIHVzZWQgYWxvbmUgYnkgYWRkaW5nIGEgJysnLyctJyBwcmVmaXggdG8gc2V0L3Jlc2V0IGEgc2luZ2xlCitmbGFnIHdpdGhvdXQgYWZmZWN0aW5nIG90aGVyIEB2YXJ7ZmxhZ3N9IG9yIGNoYW5naW5nIEB2YXJ7bG9nbGV2ZWx9LiBXaGVuCitzZXR0aW5nIGJvdGggQHZhcntmbGFnc30gYW5kIEB2YXJ7bG9nbGV2ZWx9LCBhICcrJyBzZXBhcmF0b3IgaXMgZXhwZWN0ZWQKK2JldHdlZW4gdGhlIGxhc3QgQHZhcntmbGFnc30gdmFsdWUgYW5kIGJlZm9yZSBAdmFye2xvZ2xldmVsfS4KKwogQHZhcntsb2dsZXZlbH0gaXMgYSBzdHJpbmcgb3IgYSBudW1iZXIgY29udGFpbmluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiBAdGFibGUgQHNhbXAKIEBpdGVtIHF1aWV0LCAtOAogU2hvdyBub3RoaW5nIGF0IGFsbDsgYmUgc2lsZW50LgogQGl0ZW0gcGFuaWMsIDAKIE9ubHkgc2hvdyBmYXRhbCBlcnJvcnMgd2hpY2ggY291bGQgbGVhZCB0aGUgcHJvY2VzcyB0byBjcmFzaCwgc3VjaCBhcwotYW5kIGFzc2VydCBmYWlsdXJlLiBUaGlzIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBmb3IgYW55dGhpbmcuCithbiBhc3NlcnRpb24gZmFpbHVyZS4gVGhpcyBpcyBub3QgY3VycmVudGx5IHVzZWQgZm9yIGFueXRoaW5nLgogQGl0ZW0gZmF0YWwsIDgKIE9ubHkgc2hvdyBmYXRhbCBlcnJvcnMuIFRoZXNlIGFyZSBlcnJvcnMgYWZ0ZXIgd2hpY2ggdGhlIHByb2Nlc3MgYWJzb2x1dGVseQotY2Fubm90IGNvbnRpbnVlIGFmdGVyLgorY2Fubm90IGNvbnRpbnVlLgogQGl0ZW0gZXJyb3IsIDE2CiBTaG93IGFsbCBlcnJvcnMsIGluY2x1ZGluZyBvbmVzIHdoaWNoIGNhbiBiZSByZWNvdmVyZWQgZnJvbS4KIEBpdGVtIHdhcm5pbmcsIDI0CkBAIC0xOTUsMTMgKzIyMSwyNCBAQAogQGl0ZW0gdHJhY2UsIDU2CiBAZW5kIHRhYmxlCiAKLUJ5IGRlZmF1bHQgdGhlIHByb2dyYW0gbG9ncyB0byBzdGRlcnIsIGlmIGNvbG9yaW5nIGlzIHN1cHBvcnRlZCBieSB0aGUKK0ZvciBleGFtcGxlIHRvIGVuYWJsZSByZXBlYXRlZCBsb2cgb3V0cHV0LCBhZGQgdGhlIEBjb2Rle2xldmVsfSBwcmVmaXgsIGFuZCBzZXQKK0B2YXJ7bG9nbGV2ZWx9IHRvIEBjb2Rle3ZlcmJvc2V9OgorQGV4YW1wbGUKK2ZmbXBlZyAtbG9nbGV2ZWwgcmVwZWF0K2xldmVsK3ZlcmJvc2UgLWkgaW5wdXQgb3V0cHV0CitAZW5kIGV4YW1wbGUKK0Fub3RoZXIgZXhhbXBsZSB0aGF0IGVuYWJsZXMgcmVwZWF0ZWQgbG9nIG91dHB1dCB3aXRob3V0IGFmZmVjdGluZyBjdXJyZW50CitzdGF0ZSBvZiBAY29kZXtsZXZlbH0gcHJlZml4IGZsYWcgb3IgQHZhcntsb2dsZXZlbH06CitAZXhhbXBsZQorZmZtcGVnIFsuLi5dIC1sb2dsZXZlbCArcmVwZWF0CitAZW5kIGV4YW1wbGUKKworQnkgZGVmYXVsdCB0aGUgcHJvZ3JhbSBsb2dzIHRvIHN0ZGVyci4gSWYgY29sb3JpbmcgaXMgc3VwcG9ydGVkIGJ5IHRoZQogdGVybWluYWwsIGNvbG9ycyBhcmUgdXNlZCB0byBtYXJrIGVycm9ycyBhbmQgd2FybmluZ3MuIExvZyBjb2xvcmluZwogY2FuIGJlIGRpc2FibGVkIHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCiBAZW52e0FWX0xPR19GT1JDRV9OT0NPTE9SfSBvciBAZW52e05PX0NPTE9SfSwgb3IgY2FuIGJlIGZvcmNlZCBzZXR0aW5nCiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQGVudntBVl9MT0dfRk9SQ0VfQ09MT1J9LgogVGhlIHVzZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQGVudntOT19DT0xPUn0gaXMgZGVwcmVjYXRlZCBhbmQKLXdpbGwgYmUgZHJvcHBlZCBpbiBhIGZvbGxvd2luZyBGRm1wZWcgdmVyc2lvbi4KK3dpbGwgYmUgZHJvcHBlZCBpbiBhIGZ1dHVyZSBGRm1wZWcgdmVyc2lvbi4KIAogQGl0ZW0gLXJlcG9ydAogRHVtcCBmdWxsIGNvbW1hbmQgbGluZSBhbmQgY29uc29sZSBvdXRwdXQgdG8gYSBmaWxlIG5hbWVkCkBAIC0zMDksNTEgKzM0Niw2IEBACiBAaXRlbSBrOAogQGVuZCB0YWJsZQogQGVuZCB0YWJsZQotCi1AaXRlbSAtb3BlbmNsX2JlbmNoCi1UaGlzIG9wdGlvbiBpcyB1c2VkIHRvIGJlbmNobWFyayBhbGwgYXZhaWxhYmxlIE9wZW5DTCBkZXZpY2VzIGFuZCBwcmludCB0aGUKLXJlc3VsdHMuIFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gRkZtcGVnIGhhcyBiZWVuIGNvbXBpbGVkIHdpdGgKLUBjb2Rley0tZW5hYmxlLW9wZW5jbH0uCi0KLVdoZW4gRkZtcGVnIGlzIGNvbmZpZ3VyZWQgd2l0aCBAY29kZXstLWVuYWJsZS1vcGVuY2x9LCB0aGUgb3B0aW9ucyBmb3IgdGhlCi1nbG9iYWwgT3BlbkNMIGNvbnRleHQgYXJlIHNldCB2aWEgQG9wdGlvbnstb3BlbmNsX29wdGlvbnN9LiBTZWUgdGhlCi0iT3BlbkNMIE9wdGlvbnMiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwgZm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mCi1zdXBwb3J0ZWQgb3B0aW9ucy4gQW1vbmdzdCBvdGhlcnMsIHRoZXNlIG9wdGlvbnMgaW5jbHVkZSB0aGUgYWJpbGl0eSB0byBzZWxlY3QKLWEgc3BlY2lmaWMgcGxhdGZvcm0gYW5kIGRldmljZSB0byBydW4gdGhlIE9wZW5DTCBjb2RlIG9uLiBCeSBkZWZhdWx0LCBGRm1wZWcKLXdpbGwgcnVuIG9uIHRoZSBmaXJzdCBkZXZpY2Ugb2YgdGhlIGZpcnN0IHBsYXRmb3JtLiBXaGlsZSB0aGUgb3B0aW9ucyBmb3IgdGhlCi1nbG9iYWwgT3BlbkNMIGNvbnRleHQgcHJvdmlkZSBmbGV4aWJpbGl0eSB0byB0aGUgdXNlciBpbiBzZWxlY3RpbmcgdGhlIE9wZW5DTAotZGV2aWNlIG9mIHRoZWlyIGNob2ljZSwgbW9zdCB1c2VycyB3b3VsZCBwcm9iYWJseSB3YW50IHRvIHNlbGVjdCB0aGUgZmFzdGVzdAotT3BlbkNMIGRldmljZSBmb3IgdGhlaXIgc3lzdGVtLgotCi1UaGlzIG9wdGlvbiBhc3Npc3RzIHRoZSBzZWxlY3Rpb24gb2YgdGhlIG1vc3QgZWZmaWNpZW50IGNvbmZpZ3VyYXRpb24gYnkKLWlkZW50aWZ5aW5nIHRoZSBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHRoZSB1c2VyJ3Mgc3lzdGVtLiBUaGUgYnVpbHQtaW4KLWJlbmNobWFyayBpcyBydW4gb24gYWxsIHRoZSBPcGVuQ0wgZGV2aWNlcyBhbmQgdGhlIHBlcmZvcm1hbmNlIGlzIG1lYXN1cmVkIGZvcgotZWFjaCBkZXZpY2UuIFRoZSBkZXZpY2VzIGluIHRoZSByZXN1bHRzIGxpc3QgYXJlIHNvcnRlZCBiYXNlZCBvbiB0aGVpcgotcGVyZm9ybWFuY2Ugd2l0aCB0aGUgZmFzdGVzdCBkZXZpY2UgbGlzdGVkIGZpcnN0LiBUaGUgdXNlciBjYW4gc3Vic2VxdWVudGx5Ci1pbnZva2UgQGNvbW1hbmR7ZmZtcGVnfSB1c2luZyB0aGUgZGV2aWNlIGRlZW1lZCBtb3N0IGFwcHJvcHJpYXRlIHZpYQotQG9wdGlvbnstb3BlbmNsX29wdGlvbnN9IHRvIG9idGFpbiB0aGUgYmVzdCBwZXJmb3JtYW5jZSBmb3IgdGhlIE9wZW5DTAotYWNjZWxlcmF0ZWQgY29kZS4KLQotVHlwaWNhbCB1c2FnZSB0byB1c2UgdGhlIGZhc3Rlc3QgT3BlbkNMIGRldmljZSBpbnZvbHZlIHRoZSBmb2xsb3dpbmcgc3RlcHMuCi0KLVJ1biB0aGUgY29tbWFuZDoKLUBleGFtcGxlCi1mZm1wZWcgLW9wZW5jbF9iZW5jaAotQGVuZCBleGFtcGxlCi1Ob3RlIGRvd24gdGhlIHBsYXRmb3JtIElEIChAdmFye3BpZHh9KSBhbmQgZGV2aWNlIElEIChAdmFye2RpZHh9KSBvZiB0aGUgZmlyc3QKLWkuZS4gZmFzdGVzdCBkZXZpY2UgaW4gdGhlIGxpc3QuCi1TZWxlY3QgdGhlIHBsYXRmb3JtIGFuZCBkZXZpY2UgdXNpbmcgdGhlIGNvbW1hbmQ6Ci1AZXhhbXBsZQotZmZtcGVnIC1vcGVuY2xfb3B0aW9ucyBwbGF0Zm9ybV9pZHg9QHZhcntwaWR4fTpkZXZpY2VfaWR4PUB2YXJ7ZGlkeH0gLi4uCi1AZW5kIGV4YW1wbGUKLQotQGl0ZW0gLW9wZW5jbF9vcHRpb25zIG9wdGlvbnMgKEBlbXBoe2dsb2JhbH0pCi1TZXQgT3BlbkNMIGVudmlyb25tZW50IG9wdGlvbnMuIFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4KLUZGbXBlZyBoYXMgYmVlbiBjb21waWxlZCB3aXRoIEBjb2Rley0tZW5hYmxlLW9wZW5jbH0uCi0KLUB2YXJ7b3B0aW9uc30gbXVzdCBiZSBhIGxpc3Qgb2YgQHZhcntrZXl9PUB2YXJ7dmFsdWV9IG9wdGlvbiBwYWlycwotc2VwYXJhdGVkIGJ5ICc6Jy4gU2VlIHRoZSBgYE9wZW5DTCBPcHRpb25zJycgc2VjdGlvbiBpbiB0aGUKLWZmbXBlZy11dGlscyBtYW51YWwgZm9yIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBvcHRpb25zLgogQGVuZCB0YWJsZQogCiBAc2VjdGlvbiBBVk9wdGlvbnMKZGlmZiAtLWdpdCBhL2RvYy9maWx0ZXJfZGVzaWduLnR4dCBiL2RvYy9maWx0ZXJfZGVzaWduLnR4dAppbmRleCBlOGE3YzUzLi44ODViMTliIDEwMDY0NAotLS0gYS9kb2MvZmlsdGVyX2Rlc2lnbi50eHQKKysrIGIvZG9jL2ZpbHRlcl9kZXNpZ24udHh0CkBAIC01LDcgKzUsNyBAQAogZ29vZCByZWFzb24pIHdoZW4gd3JpdGluZyBmaWx0ZXJzIGZvciBsaWJhdmZpbHRlci4KIAogSW4gdGhpcyBkb2N1bWVudCwgdGhlIHdvcmQg4oCcZnJhbWXigJ0gaW5kaWNhdGVzIGVpdGhlciBhIHZpZGVvIGZyYW1lIG9yIGEgZ3JvdXAKLW9mIGF1ZGlvIHNhbXBsZXMsIGFzIHN0b3JlZCBpbiBhbiBBVkZpbHRlckJ1ZmZlciBzdHJ1Y3R1cmUuCitvZiBhdWRpbyBzYW1wbGVzLCBhcyBzdG9yZWQgaW4gYW4gQVZGcmFtZSBzdHJ1Y3R1cmUuCiAKIAogRm9ybWF0IG5lZ290aWF0aW9uCkBAIC0zNSwzMiArMzUsMzEgQEAKICAgdG8gc2V0IHRoZSBmb3JtYXRzIHN1cHBvcnRlZCBvbiBhbm90aGVyLgogCiAKLUJ1ZmZlciByZWZlcmVuY2VzIG93bmVyc2hpcCBhbmQgcGVybWlzc2lvbnMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0ZyYW1lIHJlZmVyZW5jZXMgb3duZXJzaGlwIGFuZCBwZXJtaXNzaW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICAgUHJpbmNpcGxlCiAgIC0tLS0tLS0tLQogCi0gICAgQXVkaW8gYW5kIHZpZGVvIGRhdGEgYXJlIHZvbHVtaW5vdXM7IHRoZSBidWZmZXIgYW5kIGJ1ZmZlciByZWZlcmVuY2UKKyAgICBBdWRpbyBhbmQgdmlkZW8gZGF0YSBhcmUgdm9sdW1pbm91czsgdGhlIGZyYW1lIGFuZCBmcmFtZSByZWZlcmVuY2UKICAgICBtZWNoYW5pc20gaXMgaW50ZW5kZWQgdG8gYXZvaWQsIGFzIG11Y2ggYXMgcG9zc2libGUsIGV4cGVuc2l2ZSBjb3BpZXMgb2YKICAgICB0aGF0IGRhdGEgd2hpbGUgc3RpbGwgYWxsb3dpbmcgdGhlIGZpbHRlcnMgdG8gcHJvZHVjZSBjb3JyZWN0IHJlc3VsdHMuCiAKLSAgICBUaGUgZGF0YSBpcyBzdG9yZWQgaW4gYnVmZmVycyByZXByZXNlbnRlZCBieSBBVkZpbHRlckJ1ZmZlciBzdHJ1Y3R1cmVzLgotICAgIFRoZXkgbXVzdCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHksIGJ1dCB0aHJvdWdoIHJlZmVyZW5jZXMgc3RvcmVkIGluCi0gICAgQVZGaWx0ZXJCdWZmZXJSZWYgc3RydWN0dXJlcy4gU2V2ZXJhbCByZWZlcmVuY2VzIGNhbiBwb2ludCB0byB0aGUKLSAgICBzYW1lIGJ1ZmZlcjsgdGhlIGJ1ZmZlciBpcyBhdXRvbWF0aWNhbGx5IGRlYWxsb2NhdGVkIG9uY2UgYWxsCi0gICAgY29ycmVzcG9uZGluZyByZWZlcmVuY2VzIGhhdmUgYmVlbiBkZXN0cm95ZWQuCisgICAgVGhlIGRhdGEgaXMgc3RvcmVkIGluIGJ1ZmZlcnMgcmVwcmVzZW50ZWQgYnkgQVZGcmFtZSBzdHJ1Y3R1cmVzLgorICAgIFNldmVyYWwgcmVmZXJlbmNlcyBjYW4gcG9pbnQgdG8gdGhlIHNhbWUgZnJhbWUgYnVmZmVyOyB0aGUgYnVmZmVyIGlzCisgICAgYXV0b21hdGljYWxseSBkZWFsbG9jYXRlZCBvbmNlIGFsbCBjb3JyZXNwb25kaW5nIHJlZmVyZW5jZXMgaGF2ZSBiZWVuCisgICAgZGVzdHJveWVkLgogCiAgICAgVGhlIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgZGF0YSAocmVzb2x1dGlvbiwgc2FtcGxlIHJhdGUsIGV0Yy4pIGFyZQogICAgIHN0b3JlZCBpbiB0aGUgcmVmZXJlbmNlOyBkaWZmZXJlbnQgcmVmZXJlbmNlcyBmb3IgdGhlIHNhbWUgYnVmZmVyIGNhbgogICAgIHNob3cgZGlmZmVyZW50IGNoYXJhY3RlcmlzdGljcy4gSW4gcGFydGljdWxhciwgYSB2aWRlbyByZWZlcmVuY2UgY2FuCiAgICAgcG9pbnQgdG8gb25seSBhIHBhcnQgb2YgYSB2aWRlbyBidWZmZXIuCiAKLSAgICBBIHJlZmVyZW5jZSBpcyB1c3VhbGx5IG9idGFpbmVkIGFzIGlucHV0IHRvIHRoZSBzdGFydF9mcmFtZSBvcgotICAgIGZpbHRlcl9mcmFtZSBtZXRob2Qgb3IgcmVxdWVzdGVkIHVzaW5nIHRoZSBmZl9nZXRfdmlkZW9fYnVmZmVyIG9yCi0gICAgZmZfZ2V0X2F1ZGlvX2J1ZmZlciBmdW5jdGlvbnMuIEEgbmV3IHJlZmVyZW5jZSBvbiBhbiBleGlzdGluZyBidWZmZXIgY2FuCi0gICAgYmUgY3JlYXRlZCB3aXRoIHRoZSBhdmZpbHRlcl9yZWZfYnVmZmVyLiBBIHJlZmVyZW5jZSBpcyBkZXN0cm95ZWQgdXNpbmcKLSAgICB0aGUgYXZmaWx0ZXJfdW5yZWZfYnVmZmVycCBmdW5jdGlvbi4KKyAgICBBIHJlZmVyZW5jZSBpcyB1c3VhbGx5IG9idGFpbmVkIGFzIGlucHV0IHRvIHRoZSBmaWx0ZXJfZnJhbWUgbWV0aG9kIG9yCisgICAgcmVxdWVzdGVkIHVzaW5nIHRoZSBmZl9nZXRfdmlkZW9fYnVmZmVyIG9yIGZmX2dldF9hdWRpb19idWZmZXIKKyAgICBmdW5jdGlvbnMuIEEgbmV3IHJlZmVyZW5jZSBvbiBhbiBleGlzdGluZyBidWZmZXIgY2FuIGJlIGNyZWF0ZWQgd2l0aAorICAgIGF2X2ZyYW1lX3JlZigpLiBBIHJlZmVyZW5jZSBpcyBkZXN0cm95ZWQgdXNpbmcKKyAgICB0aGUgYXZfZnJhbWVfZnJlZSgpIGZ1bmN0aW9uLgogCiAgIFJlZmVyZW5jZSBvd25lcnNoaXAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzMsMTcgKzcyLDEzIEBACiAKICAgICBIZXJlIGFyZSB0aGUgKGZhaXJseSBvYnZpb3VzKSBydWxlcyBmb3IgcmVmZXJlbmNlIG93bmVyc2hpcDoKIAotICAgICogQSByZWZlcmVuY2UgcmVjZWl2ZWQgYnkgdGhlIGZpbHRlcl9mcmFtZSBtZXRob2QgKG9yIGl0cyBzdGFydF9mcmFtZQotICAgICAgZGVwcmVjYXRlZCB2ZXJzaW9uKSBiZWxvbmdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGZpbHRlci4KKyAgICAqIEEgcmVmZXJlbmNlIHJlY2VpdmVkIGJ5IHRoZSBmaWx0ZXJfZnJhbWUgbWV0aG9kIGJlbG9uZ3MgdG8gdGhlCisgICAgICBjb3JyZXNwb25kaW5nIGZpbHRlci4KIAotICAgICAgU3BlY2lhbCBleGNlcHRpb246IGZvciB2aWRlbyByZWZlcmVuY2VzOiB0aGUgcmVmZXJlbmNlIG1heSBiZSB1c2VkCi0gICAgICBpbnRlcm5hbGx5IGZvciBhdXRvbWF0aWMgY29weWluZyBhbmQgbXVzdCBub3QgYmUgZGVzdHJveWVkIGJlZm9yZQotICAgICAgZW5kX2ZyYW1lOyBpdCBjYW4gYmUgZ2l2ZW4gYXdheSB0byBmZl9zdGFydF9mcmFtZS4KKyAgICAqIEEgcmVmZXJlbmNlIHBhc3NlZCB0byBmZl9maWx0ZXJfZnJhbWUgaXMgZ2l2ZW4gYXdheSBhbmQgbXVzdCBubyBsb25nZXIKKyAgICAgIGJlIHVzZWQuCiAKLSAgICAqIEEgcmVmZXJlbmNlIHBhc3NlZCB0byBmZl9maWx0ZXJfZnJhbWUgKG9yIHRoZSBkZXByZWNhdGVkCi0gICAgICBmZl9zdGFydF9mcmFtZSkgaXMgZ2l2ZW4gYXdheSBhbmQgbXVzdCBubyBsb25nZXIgYmUgdXNlZC4KLQotICAgICogQSByZWZlcmVuY2UgY3JlYXRlZCB3aXRoIGF2ZmlsdGVyX3JlZl9idWZmZXIgYmVsb25ncyB0byB0aGUgY29kZSB0aGF0CisgICAgKiBBIHJlZmVyZW5jZSBjcmVhdGVkIHdpdGggYXZfZnJhbWVfcmVmKCkgYmVsb25ncyB0byB0aGUgY29kZSB0aGF0CiAgICAgICBjcmVhdGVkIGl0LgogCiAgICAgKiBBIHJlZmVyZW5jZSBvYnRhaW5lZCB3aXRoIGZmX2dldF92aWRlb19idWZmZXIgb3IgZmZfZ2V0X2F1ZGlvX2J1ZmZlcgpAQCAtOTUsODkgKzkwLDMyIEBACiAgIExpbmsgcmVmZXJlbmNlIGZpZWxkcwogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotICAgIFRoZSBBVkZpbHRlckxpbmsgc3RydWN0dXJlIGhhcyBhIGZldyBBVkZpbHRlckJ1ZmZlclJlZiBmaWVsZHMuIFRoZQotICAgIGN1cl9idWYgYW5kIG91dF9idWYgd2VyZSB1c2VkIHdpdGggdGhlIGRlcHJlY2F0ZWQKLSAgICBzdGFydF9mcmFtZS9kcmF3X3NsaWNlL2VuZF9mcmFtZSBBUEkgYW5kIHNob3VsZCBubyBsb25nZXIgYmUgdXNlZC4KLSAgICBzcmNfYnVmIGFuZCBwYXJ0aWFsX2J1ZiBhcmUgdXNlZCBieSBsaWJhdmZpbHRlciBpbnRlcm5hbGx5Ci0gICAgYW5kIG11c3Qgbm90IGJlIGFjY2Vzc2VkIGJ5IGZpbHRlcnMuCisgICAgVGhlIEFWRmlsdGVyTGluayBzdHJ1Y3R1cmUgaGFzIGEgZmV3IEFWRnJhbWUgZmllbGRzLgorCisgICAgcGFydGlhbF9idWYgaXMgdXNlZCBieSBsaWJhdmZpbHRlciBpbnRlcm5hbGx5IGFuZCBtdXN0IG5vdCBiZSBhY2Nlc3NlZAorICAgIGJ5IGZpbHRlcnMuCisKKyAgICBmaWZvIGNvbnRhaW5zIGZyYW1lcyBxdWV1ZWQgaW4gdGhlIGZpbHRlcidzIGlucHV0LiBUaGV5IGJlbG9uZyB0byB0aGUKKyAgICBmcmFtZXdvcmsgdW50aWwgdGhleSBhcmUgdGFrZW4gYnkgdGhlIGZpbHRlci4KIAogICBSZWZlcmVuY2UgcGVybWlzc2lvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSAgICBUaGUgQVZGaWx0ZXJCdWZmZXJSZWYgc3RydWN0dXJlIGhhcyBhIHBlcm1zIGZpZWxkIHRoYXQgZGVzY3JpYmVzIHdoYXQKLSAgICB0aGUgY29kZSB0aGF0IG93bnMgdGhlIHJlZmVyZW5jZSBpcyBhbGxvd2VkIHRvIGRvIHRvIHRoZSBidWZmZXIgZGF0YS4KLSAgICBEaWZmZXJlbnQgcmVmZXJlbmNlcyBmb3IgdGhlIHNhbWUgYnVmZmVyIGNhbiBoYXZlIGRpZmZlcmVudCBwZXJtaXNzaW9ucy4KKyAgICBTaW5jZSB0aGUgc2FtZSBmcmFtZSBkYXRhIGNhbiBiZSBzaGFyZWQgYnkgc2V2ZXJhbCBmcmFtZXMsIG1vZGlmeWluZyBtYXkKKyAgICBoYXZlIHVuaW50ZW5kZWQgY29uc2VxdWVuY2VzLiBBIGZyYW1lIGlzIGNvbnNpZGVyZWQgd3JpdGFibGUgaWYgb25seSBvbmUKKyAgICByZWZlcmVuY2UgdG8gaXQgZXhpc3RzLiBUaGUgY29kZSBvd25pbmcgdGhhdCByZWZlcmVuY2UgaXQgdGhlbiBhbGxvd2VkCisgICAgdG8gbW9kaWZ5IHRoZSBkYXRhLgogCi0gICAgRm9yIHZpZGVvIGZpbHRlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIGRlcHJlY2F0ZWQKLSAgICBzdGFydF9mcmFtZS9kcmF3X3NsaWNlL2VuZF9mcmFtZSBBUEksIHRoZSBwZXJtaXNzaW9ucyBvbmx5IGFwcGx5IHRvIHRoZQotICAgIHBhcnRzIG9mIHRoZSBidWZmZXIgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBjb3ZlcmVkIGJ5IHRoZSBkcmF3X3NsaWNlCi0gICAgbWV0aG9kLgorICAgIEEgZmlsdGVyIGNhbiBjaGVjayBpZiBhIGZyYW1lIGlzIHdyaXRhYmxlIGJ5IHVzaW5nIHRoZQorICAgIGF2X2ZyYW1lX2lzX3dyaXRhYmxlKCkgZnVuY3Rpb24uCiAKLSAgICBUaGUgdmFsdWUgaXMgYSBiaW5hcnkgT1Igb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CisgICAgQSBmaWx0ZXIgY2FuIGVuc3VyZSB0aGF0IGEgZnJhbWUgaXMgd3JpdGFibGUgYXQgc29tZSBwb2ludCBvZiB0aGUgY29kZQorICAgIGJ5IHVzaW5nIHRoZSBmZl9pbmxpbmtfbWFrZV9mcmFtZV93cml0YWJsZSgpIGZ1bmN0aW9uLiBJdCB3aWxsIGR1cGxpY2F0ZQorICAgIHRoZSBmcmFtZSBpZiBuZWVkZWQuCiAKLSAgICAqIEFWX1BFUk1fUkVBRDogdGhlIG93bmVyIGNhbiByZWFkIHRoZSBidWZmZXIgZGF0YTsgdGhpcyBpcyBlc3NlbnRpYWxseQotICAgICAgYWx3YXlzIHRydWUgYW5kIGlzIHRoZXJlIGZvciBzZWxmLWRvY3VtZW50YXRpb24uCi0KLSAgICAqIEFWX1BFUk1fV1JJVEU6IHRoZSBvd25lciBjYW4gbW9kaWZ5IHRoZSBidWZmZXIgZGF0YS4KLQotICAgICogQVZfUEVSTV9QUkVTRVJWRTogdGhlIG93bmVyIGNhbiByZWx5IG9uIHRoZSBmYWN0IHRoYXQgdGhlIGJ1ZmZlciBkYXRhCi0gICAgICB3aWxsIG5vdCBiZSBtb2RpZmllZCBieSBwcmV2aW91cyBmaWx0ZXJzLgotCi0gICAgKiBBVl9QRVJNX1JFVVNFOiB0aGUgb3duZXIgY2FuIG91dHB1dCB0aGUgYnVmZmVyIHNldmVyYWwgdGltZXMsIHdpdGhvdXQKLSAgICAgIG1vZGlmeWluZyB0aGUgZGF0YSBpbiBiZXR3ZWVuLgotCi0gICAgKiBBVl9QRVJNX1JFVVNFMjogdGhlIG93bmVyIGNhbiBvdXRwdXQgdGhlIGJ1ZmZlciBzZXZlcmFsIHRpbWVzIGFuZAotICAgICAgbW9kaWZ5IHRoZSBkYXRhIGluIGJldHdlZW4gKHVzZWxlc3Mgd2l0aG91dCB0aGUgV1JJVEUgcGVybWlzc2lvbnMpLgotCi0gICAgKiBBVl9QRVJNX0FMSUdOOiB0aGUgb3duZXIgY2FuIGFjY2VzcyB0aGUgZGF0YSB1c2luZyBmYXN0IG9wZXJhdGlvbnMKLSAgICAgIHRoYXQgcmVxdWlyZSBkYXRhIGFsaWdubWVudC4KLQotICAgIFRoZSBSRUFELCBXUklURSBhbmQgUFJFU0VSVkUgcGVybWlzc2lvbnMgYXJlIGFib3V0IHNoYXJpbmcgdGhlIHNhbWUKLSAgICBidWZmZXIgYmV0d2VlbiBzZXZlcmFsIGZpbHRlcnMgdG8gYXZvaWQgZXhwZW5zaXZlIGNvcGllcyB3aXRob3V0IHRoZW0KLSAgICBkb2luZyBjb25mbGljdGluZyBjaGFuZ2VzIG9uIHRoZSBkYXRhLgotCi0gICAgVGhlIFJFVVNFIGFuZCBSRVVTRTIgcGVybWlzc2lvbnMgYXJlIGFib3V0IHNwZWNpYWwgbWVtb3J5IGZvciBkaXJlY3QKLSAgICByZW5kZXJpbmcuIEZvciBleGFtcGxlIGEgYnVmZmVyIGRpcmVjdGx5IGFsbG9jYXRlZCBpbiB2aWRlbyBtZW1vcnkgbXVzdAotICAgIG5vdCBtb2RpZmllZCBvbmNlIGl0IGlzIGRpc3BsYXllZCBvbiBzY3JlZW4sIG9yIGl0IHdpbGwgY2F1c2UgdGVhcmluZzsKLSAgICBpdCB3aWxsIHRoZXJlZm9yZSBub3QgaGF2ZSB0aGUgUkVVU0UyIHBlcm1pc3Npb24uCi0KLSAgICBUaGUgQUxJR04gcGVybWlzc2lvbiBpcyBhYm91dCBleHRyYWN0aW5nIHBhcnQgb2YgdGhlIGJ1ZmZlciwgZm9yCi0gICAgY29weS1sZXNzIHBhZGRpbmcgb3IgY3JvcHBpbmcgZm9yIGV4YW1wbGUuCi0KLQotICAgIFJlZmVyZW5jZXMgcmVjZWl2ZWQgb24gaW5wdXQgcGFkcyBhcmUgZ3VhcmFudGVlZCB0byBoYXZlIGFsbCB0aGUKLSAgICBwZXJtaXNzaW9ucyBzdGF0ZWQgaW4gdGhlIG1pbl9wZXJtcyBmaWVsZCBhbmQgbm9uZSBvZiB0aGUgcGVybWlzc2lvbnMKLSAgICBzdGF0ZWQgaW4gdGhlIHJlal9wZXJtcy4KLQotICAgIFJlZmVyZW5jZXMgb2J0YWluZWQgYnkgZmZfZ2V0X3ZpZGVvX2J1ZmZlciBhbmQgZmZfZ2V0X2F1ZGlvX2J1ZmZlciBhcmUKLSAgICBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3QgYWxsIHRoZSBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgYXMgYXJndW1lbnQuCi0KLSAgICBSZWZlcmVuY2VzIGNyZWF0ZWQgYnkgYXZmaWx0ZXJfcmVmX2J1ZmZlciBoYXZlIHRoZSBzYW1lIHBlcm1pc3Npb25zIGFzCi0gICAgdGhlIG9yaWdpbmFsIHJlZmVyZW5jZSBtaW51cyB0aGUgb25lcyBleHBsaWNpdGx5IG1hc2tlZDsgdGhlIG1hc2sgaXMKLSAgICB1c3VhbGx5IH4wIHRvIGtlZXAgdGhlIHNhbWUgcGVybWlzc2lvbnMuCi0KLSAgICBGaWx0ZXJzIHNob3VsZCByZW1vdmUgcGVybWlzc2lvbnMgb24gcmVmZXJlbmNlIHRoZXkgZ2l2ZSB0byBvdXRwdXQKLSAgICB3aGVuZXZlciBuZWNlc3NhcnkuIEl0IGNhbiBiZSBhdXRvbWF0aWNhbGx5IGRvbmUgYnkgc2V0dGluZyB0aGUKLSAgICByZWpfcGVybXMgZmllbGQgb24gdGhlIG91dHB1dCBwYWQuCi0KLSAgICBIZXJlIGFyZSBhIGZldyBndWlkZWxpbmVzIGNvcnJlc3BvbmRpbmcgdG8gY29tbW9uIHNpdHVhdGlvbnM6Ci0KLSAgICAqIEZpbHRlcnMgdGhhdCBtb2RpZnkgYW5kIGZvcndhcmQgdGhlaXIgZnJhbWUgKGxpa2UgZHJhd3RleHQpIG5lZWQgdGhlCi0gICAgICBXUklURSBwZXJtaXNzaW9uLgotCi0gICAgKiBGaWx0ZXJzIHRoYXQgcmVhZCB0aGVpciBpbnB1dCB0byBwcm9kdWNlIGEgbmV3IGZyYW1lIG9uIG91dHB1dCAobGlrZQotICAgICAgc2NhbGUpIG5lZWQgdGhlIFJFQUQgcGVybWlzc2lvbiBvbiBpbnB1dCBhbmQgbXVzdCByZXF1ZXN0IGEgYnVmZmVyCi0gICAgICB3aXRoIHRoZSBXUklURSBwZXJtaXNzaW9uLgotCi0gICAgKiBGaWx0ZXJzIHRoYXQgaW50ZW5kIHRvIGtlZXAgYSByZWZlcmVuY2UgYWZ0ZXIgdGhlIGZpbHRlcmluZyBwcm9jZXNzCi0gICAgICBpcyBmaW5pc2hlZCAoYWZ0ZXIgZmlsdGVyX2ZyYW1lIHJldHVybnMpIG11c3QgaGF2ZSB0aGUgUFJFU0VSVkUKLSAgICAgIHBlcm1pc3Npb24gb24gaXQgYW5kIHJlbW92ZSB0aGUgV1JJVEUgcGVybWlzc2lvbiBpZiB0aGV5IGNyZWF0ZSBhIG5ldwotICAgICAgcmVmZXJlbmNlIHRvIGdpdmUgaXQgYXdheS4KLQotICAgICogRmlsdGVycyB0aGF0IGludGVuZCB0byBtb2RpZnkgYSByZWZlcmVuY2UgdGhleSBoYXZlIGtlcHQgYWZ0ZXIgdGhlIGVuZAotICAgICAgb2YgdGhlIGZpbHRlcmluZyBwcm9jZXNzIG5lZWQgdGhlIFJFVVNFMiBwZXJtaXNzaW9uIGFuZCBtdXN0IHJlbW92ZQotICAgICAgdGhlIFBSRVNFUlZFIHBlcm1pc3Npb24gaWYgdGhleSBjcmVhdGUgYSBuZXcgcmVmZXJlbmNlIHRvIGdpdmUgaXQKLSAgICAgIGF3YXkuCisgICAgQSBmaWx0ZXIgY2FuIGVuc3VyZSB0aGF0IHRoZSBmcmFtZSBwYXNzZWQgdG8gdGhlIGZpbHRlcl9mcmFtZSgpIGNhbGxiYWNrCisgICAgaXMgd3JpdGFibGUgYnkgc2V0dGluZyB0aGUgbmVlZHNfd3JpdGFibGUgZmxhZyBvbiB0aGUgY29ycmVzcG9uZGluZworICAgIGlucHV0IHBhZC4gSXQgZG9lcyBub3QgYXBwbHkgdG8gdGhlIGFjdGl2YXRlKCkgY2FsbGJhY2suCiAKIAogRnJhbWUgc2NoZWR1bGluZwpAQCAtMTg5LDExICsxMjcsMTAwIEBACiAgIFNpbXBsZSBmaWx0ZXJzIHRoYXQgb3V0cHV0IG9uZSBmcmFtZSBmb3IgZWFjaCBpbnB1dCBmcmFtZSBzaG91bGQgbm90IGhhdmUKICAgdG8gd29ycnkgYWJvdXQgaXQuCiAKKyAgVGhlcmUgYXJlIHR3byBkZXNpZ24gZm9yIGZpbHRlcnM6IG9uZSB1c2luZyB0aGUgZmlsdGVyX2ZyYW1lKCkgYW5kCisgIHJlcXVlc3RfZnJhbWUoKSBjYWxsYmFja3MgYW5kIHRoZSBvdGhlciB1c2luZyB0aGUgYWN0aXZhdGUoKSBjYWxsYmFjay4KKworICBUaGUgZGVzaWduIHVzaW5nIGZpbHRlcl9mcmFtZSgpIGFuZCByZXF1ZXN0X2ZyYW1lKCkgaXMgbGVnYWN5LCBidXQgaXQgaXMKKyAgc3VpdGFibGUgZm9yIGZpbHRlcnMgdGhhdCBoYXZlIGEgc2luZ2xlIGlucHV0IGFuZCBwcm9jZXNzIG9uZSBmcmFtZSBhdCBhCisgIHRpbWUuIE5ldyBmaWx0ZXJzIHdpdGggc2V2ZXJhbCBpbnB1dHMsIHRoYXQgdHJlYXQgc2V2ZXJhbCBmcmFtZXMgYXQgYSB0aW1lCisgIG9yIHRoYXQgcmVxdWlyZSBhIHNwZWNpYWwgdHJlYXRtZW50IGF0IEVPRiBzaG91bGQgcHJvYmFibHkgdXNlIHRoZSBkZXNpZ24KKyAgdXNpbmcgYWN0aXZhdGUoKS4KKworICBhY3RpdmF0ZQorICAtLS0tLS0tLQorCisgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gc29tZXRoaW5nIG11c3QgYmUgZG9uZSBpbiBhIGZpbHRlcjsgdGhlCisgICAgZGVmaW5pdGlvbiBvZiB0aGF0ICJzb21ldGhpbmciIGRlcGVuZHMgb24gdGhlIHNlbWFudGljIG9mIHRoZSBmaWx0ZXIuCisKKyAgICBUaGUgY2FsbGJhY2sgbXVzdCBleGFtaW5lIHRoZSBzdGF0dXMgb2YgdGhlIGZpbHRlcidzIGxpbmtzIGFuZCBwcm9jZWVkCisgICAgYWNjb3JkaW5nbHkuCisKKyAgICBUaGUgc3RhdHVzIG9mIG91dHB1dCBsaW5rcyBpcyBzdG9yZWQgaW4gdGhlIGZyYW1lX3dhbnRlZF9vdXQsIHN0YXR1c19pbgorICAgIGFuZCBzdGF0dXNfb3V0IGZpZWxkcyBhbmQgdGVzdGVkIGJ5IHRoZSBmZl9vdXRsaW5rX2ZyYW1lX3dhbnRlZCgpCisgICAgZnVuY3Rpb24uIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGVuIHRoZSBwcm9jZXNzaW5nIHJlcXVpcmVzIGEKKyAgICBmcmFtZSBvbiB0aGlzIGxpbmsgYW5kIHRoZSBmaWx0ZXIgaXMgZXhwZWN0ZWQgdG8gbWFrZSBlZmZvcnRzIGluIHRoYXQKKyAgICBkaXJlY3Rpb24uCisKKyAgICBUaGUgc3RhdHVzIG9mIGlucHV0IGxpbmtzIGlzIHN0b3JlZCBieSB0aGUgc3RhdHVzX2luLCBmaWZvIGFuZAorICAgIHN0YXR1c19vdXQgZmllbGRzOyB0aGV5IG11c3Qgbm90IGJlIGFjY2Vzc2VkIGRpcmVjdGx5LiBUaGUgZmlmbyBmaWVsZAorICAgIGNvbnRhaW5zIHRoZSBmcmFtZXMgdGhhdCBhcmUgcXVldWVkIGluIHRoZSBpbnB1dCBmb3IgcHJvY2Vzc2luZyBieSB0aGUKKyAgICBmaWx0ZXIuIFRoZSBzdGF0dXNfaW4gYW5kIHN0YXR1c19vdXQgZmllbGRzIGNvbnRhaW5zIHRoZSBxdWV1ZWQgc3RhdHVzCisgICAgKEVPRiBvciBlcnJvcikgb2YgdGhlIGxpbms7IHN0YXR1c19pbiBpcyBhIHN0YXR1cyBjaGFuZ2UgdGhhdCBtdXN0IGJlCisgICAgdGFrZW4gaW50byBhY2NvdW50IGFmdGVyIGFsbCBmcmFtZXMgaW4gZmlmbyBoYXZlIGJlZW4gcHJvY2Vzc2VkOworICAgIHN0YXR1c19vdXQgaXMgdGhlIHN0YXR1cyB0aGF0IGhhdmUgYmVlbiB0YWtlbiBpbnRvIGFjY291bnQsIGl0IGlzIGZpbmFsCisgICAgd2hlbiBpdCBpcyBub3QgMC4KKworICAgIFRoZSB0eXBpY2FsIHRhc2sgb2YgYW4gYWN0aXZhdGUgY2FsbGJhY2sgaXMgdG8gZmlyc3QgY2hlY2sgdGhlIGJhY2t3YXJkCisgICAgc3RhdHVzIG9mIG91dHB1dCBsaW5rcywgYW5kIGlmIHJlbGV2YW50IGZvcndhcmQgaXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBpbnB1dC4gVGhlbiwgaWYgcmVsZXZhbnQsIGZvciBlYWNoIGlucHV0IGxpbms6IHRlc3QgdGhlIGF2YWlsYWJpbGl0eSBvZgorICAgIGZyYW1lcyBpbiBmaWZvIGFuZCBwcm9jZXNzIHRoZW07ICBpZiBubyBmcmFtZSBpcyBhdmFpbGFibGUsIHRlc3QgYW5kCisgICAgYWNrbm93bGVkZ2UgYSBjaGFuZ2Ugb2Ygc3RhdHVzIHVzaW5nIGZmX2lubGlua19hY2tub3dsZWRnZV9zdGF0dXMoKTsgYW5kCisgICAgZm9yd2FyZCB0aGUgcmVzdWx0IChmcmFtZSBvciBzdGF0dXMgY2hhbmdlKSB0byB0aGUgY29ycmVzcG9uZGluZyBpbnB1dC4KKyAgICBJZiBub3RoaW5nIGlzIHBvc3NpYmxlLCB0ZXN0IHRoZSBzdGF0dXMgb2Ygb3V0cHV0cyBhbmQgZm9yd2FyZCBpdCB0byB0aGUKKyAgICBjb3JyZXNwb25kaW5nIGlucHV0KHMpLiBJZiBzdGlsbCBub3QgcG9zc2libGUsIHJldHVybiBGRkVSUk9SX05PVF9SRUFEWS4KKworICAgIElmIHRoZSBmaWx0ZXJzIHN0b3JlcyBpbnRlcm5hbGx5IG9uZSBvciBhIGZldyBmcmFtZSBmb3Igc29tZSBpbnB1dCwgaXQKKyAgICBjYW4gY29uc2lkZXIgdGhlbSB0byBiZSBwYXJ0IG9mIHRoZSBGSUZPIGFuZCBkZWxheSBhY2tub3dsZWRnaW5nIGEKKyAgICBzdGF0dXMgY2hhbmdlIGFjY29yZGluZ2x5LgorCisgICAgRXhhbXBsZSBjb2RlOgorCisgICAgcmV0ID0gZmZfb3V0bGlua19nZXRfc3RhdHVzKG91dGxpbmspOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZmZfaW5saW5rX3NldF9zdGF0dXMoaW5saW5rLCByZXQpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHByaXYtPm5leHRfZnJhbWUpIHsKKyAgICAgICAgLyogdXNlIGl0ICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXQgPSBmZl9pbmxpbmtfY29uc3VtZV9mcmFtZShpbmxpbmssICZmcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHJldCkgeworICAgICAgICAvKiB1c2UgaXQgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldCA9IGZmX2lubGlua19hY2tub3dsZWRnZV9zdGF0dXMoaW5saW5rLCAmc3RhdHVzLCAmcHRzKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIC8qIGZsdXNoICovCisgICAgICAgIGZmX291dGxpbmtfc2V0X3N0YXR1cyhvdXRsaW5rLCBzdGF0dXMsIHB0cyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZmZfb3V0bGlua19mcmFtZV93YW50ZWQob3V0bGluaykpIHsKKyAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBGRkVSUk9SX05PVF9SRUFEWTsKKworICAgIFRoZSBleGFjdCBjb2RlIGRlcGVuZHMgb24gaG93IHNpbWlsYXIgdGhlIC8qIHVzZSBpdCAqLyBibG9ja3MgYXJlIGFuZAorICAgIGhvdyByZWxhdGVkIHRoZXkgYXJlIHRvIHRoZSAvKiBmbHVzaCAqLyBibG9jaywgYW5kIG5lZWRzIHRvIGFwcGx5IHRoZXNlCisgICAgb3BlcmF0aW9ucyB0byB0aGUgY29ycmVjdCBpbmxpbmsgb3Igb3V0bGluayBpZiB0aGVyZSBhcmUgc2V2ZXJhbC4KKworICAgIE1hY3JvcyBhcmUgYXZhaWxhYmxlIHRvIGZhY3RvciB0aGF0IHdoZW4gbm8gZXh0cmEgcHJvY2Vzc2luZyBpcyBuZWVkZWQ6CisKKyAgICBGRl9GSUxURVJfRk9SV0FSRF9TVEFUVVNfQkFDSyhvdXRsaW5rLCBpbmxpbmspOworICAgIEZGX0ZJTFRFUl9GT1JXQVJEX1NUQVRVU19BTEwob3V0bGluaywgZmlsdGVyKTsKKyAgICBGRl9GSUxURVJfRk9SV0FSRF9TVEFUVVMoaW5saW5rLCBvdXRsaW5rKTsKKyAgICBGRl9GSUxURVJfRk9SV0FSRF9TVEFUVVNfQUxMKGlubGluaywgZmlsdGVyKTsKKyAgICBGRl9GSUxURVJfRk9SV0FSRF9XQU5URUQob3V0bGluaywgaW5saW5rKTsKKwogICBmaWx0ZXJfZnJhbWUKICAgLS0tLS0tLS0tLS0tCiAKLSAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIGZyYW1lIGlzIHB1c2hlZCB0byB0aGUgZmlsdGVyJ3MgaW5wdXQuIEl0Ci0gICAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBleGNlcHQgaW4gYSByZWVudHJhbnQgd2F5LgorICAgIEZvciBmaWx0ZXJzIHRoYXQgZG8gbm90IHVzZSB0aGUgYWN0aXZhdGUoKSBjYWxsYmFjaywgdGhpcyBtZXRob2QgaXMKKyAgICBjYWxsZWQgd2hlbiBhIGZyYW1lIGlzIHB1c2hlZCB0byB0aGUgZmlsdGVyJ3MgaW5wdXQuIEl0IGNhbiBiZSBjYWxsZWQgYXQKKyAgICBhbnkgdGltZSBleGNlcHQgaW4gYSByZWVudHJhbnQgd2F5LgogCiAgICAgSWYgdGhlIGlucHV0IGZyYW1lIGlzIGVub3VnaCB0byBwcm9kdWNlIG91dHB1dCwgdGhlbiB0aGUgZmlsdGVyIHNob3VsZAogICAgIHB1c2ggdGhlIG91dHB1dCBmcmFtZXMgb24gdGhlIG91dHB1dCBsaW5rIGltbWVkaWF0ZWx5LgpAQCAtMjIyLDkgKzI0OSwxMCBAQAogICByZXF1ZXN0X2ZyYW1lCiAgIC0tLS0tLS0tLS0tLS0KIAotICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgZnJhbWUgaXMgd2FudGVkIG9uIGFuIG91dHB1dC4KKyAgICBGb3IgZmlsdGVycyB0aGF0IGRvIG5vdCB1c2UgdGhlIGFjdGl2YXRlKCkgY2FsbGJhY2ssIHRoaXMgbWV0aG9kIGlzCisgICAgY2FsbGVkIHdoZW4gYSBmcmFtZSBpcyB3YW50ZWQgb24gYW4gb3V0cHV0LgogCi0gICAgRm9yIGFuIGlucHV0LCBpdCBzaG91bGQgZGlyZWN0bHkgY2FsbCBmaWx0ZXJfZnJhbWUgb24gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBGb3IgYSBzb3VyY2UsIGl0IHNob3VsZCBkaXJlY3RseSBjYWxsIGZpbHRlcl9mcmFtZSBvbiB0aGUgY29ycmVzcG9uZGluZwogICAgIG91dHB1dC4KIAogICAgIEZvciBhIGZpbHRlciwgaWYgdGhlcmUgYXJlIHF1ZXVlZCBmcmFtZXMgYWxyZWFkeSByZWFkeSwgb25lIG9mIHRoZXNlCkBAIC0yNTQsMTYgKzI4Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBOb3RlIHRoYXQsIGV4Y2VwdCBmb3IgZmlsdGVycyB0aGF0IGNhbiBoYXZlIHF1ZXVlZCBmcmFtZXMsIHJlcXVlc3RfZnJhbWUKLSAgICBkb2VzIG5vdCBwdXNoIGZyYW1lczogaXQgcmVxdWVzdHMgdGhlbSB0byBpdHMgaW5wdXQsIGFuZCBhcyBhIHJlYWN0aW9uLAotICAgIHRoZSBmaWx0ZXJfZnJhbWUgbWV0aG9kIHBvc3NpYmx5IHdpbGwgYmUgY2FsbGVkIGFuZCBkbyB0aGUgd29yay4KLQotTGVnYWN5IEFQSQotPT09PT09PT09PQotCi0gIFVudGlsIGxpYmF2ZmlsdGVyIDMuMjMsIHRoZSBmaWx0ZXJfZnJhbWUgbWV0aG9kIHdhcyBzcGxpdDoKLQotICAtIGZvciB2aWRlbyBmaWx0ZXJzLCBpdCB3YXMgbWFkZSBvZiBzdGFydF9mcmFtZSwgZHJhd19zbGljZSAodGhhdCBjb3VsZCBiZQotICAgIGNhbGxlZCBzZXZlcmFsIHRpbWVzIG9uIGRpc3RpbmN0IHBhcnRzIG9mIHRoZSBmcmFtZSkgYW5kIGVuZF9mcmFtZTsKLQotICAtIGZvciBhdWRpbyBmaWx0ZXJzLCBpdCB3YXMgY2FsbGVkIGZpbHRlcl9zYW1wbGVzLgorICAgIE5vdGUgdGhhdCwgZXhjZXB0IGZvciBmaWx0ZXJzIHRoYXQgY2FuIGhhdmUgcXVldWVkIGZyYW1lcyBhbmQgc291cmNlcywKKyAgICByZXF1ZXN0X2ZyYW1lIGRvZXMgbm90IHB1c2ggZnJhbWVzOiBpdCByZXF1ZXN0cyB0aGVtIHRvIGl0cyBpbnB1dCwgYW5kCisgICAgYXMgYSByZWFjdGlvbiwgdGhlIGZpbHRlcl9mcmFtZSBtZXRob2QgcG9zc2libHkgd2lsbCBiZSBjYWxsZWQgYW5kIGRvCisgICAgdGhlIHdvcmsuCmRpZmYgLS1naXQgYS9kb2MvZmlsdGVycy50ZXhpIGIvZG9jL2ZpbHRlcnMudGV4aQppbmRleCA2OGY1NGYxLi5mMjY3ZDI2IDEwMDY0NAotLS0gYS9kb2MvZmlsdGVycy50ZXhpCisrKyBiL2RvYy9maWx0ZXJzLnRleGkKQEAgLTEzMCwxMSArMTMwLDExIEBACiBkZXNjcmlwdGlvbnMuCiAKIEEgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IGEgc3RyaW5nIG9mIHRoZSBmb3JtOgotW0B2YXJ7aW5fbGlua18xfV0uLi5bQHZhcntpbl9saW5rX059XUB2YXJ7ZmlsdGVyX25hbWV9PUB2YXJ7YXJndW1lbnRzfVtAdmFye291dF9saW5rXzF9XS4uLltAdmFye291dF9saW5rX019XQorW0B2YXJ7aW5fbGlua18xfV0uLi5bQHZhcntpbl9saW5rX059XUB2YXJ7ZmlsdGVyX25hbWV9QEBAdmFye2lkfT1AdmFye2FyZ3VtZW50c31bQHZhcntvdXRfbGlua18xfV0uLi5bQHZhcntvdXRfbGlua19NfV0KIAogQHZhcntmaWx0ZXJfbmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIGZpbHRlciBjbGFzcyBvZiB3aGljaCB0aGUKIGRlc2NyaWJlZCBmaWx0ZXIgaXMgYW4gaW5zdGFuY2Ugb2YsIGFuZCBoYXMgdG8gYmUgdGhlIG5hbWUgb2Ygb25lIG9mCi10aGUgZmlsdGVyIGNsYXNzZXMgcmVnaXN0ZXJlZCBpbiB0aGUgcHJvZ3JhbS4KK3RoZSBmaWx0ZXIgY2xhc3NlcyByZWdpc3RlcmVkIGluIHRoZSBwcm9ncmFtIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgIkBAQHZhcntpZH0iLgogVGhlIG5hbWUgb2YgdGhlIGZpbHRlciBjbGFzcyBpcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgc3RyaW5nCiAiPUB2YXJ7YXJndW1lbnRzfSIuCiAKQEAgLTIxMiwxNCArMjEyLDE2IEBACiBIZXJlIGlzIGEgQk5GIGRlc2NyaXB0aW9uIG9mIHRoZSBmaWx0ZXJncmFwaCBzeW50YXg6CiBAZXhhbXBsZQogQHZhcntOQU1FfSAgICAgICAgICAgICA6Oj0gc2VxdWVuY2Ugb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYW5kICdfJworQHZhcntGSUxURVJfTkFNRX0gICAgICA6Oj0gQHZhcntOQU1FfVsiQEAiQHZhcntOQU1FfV0KIEB2YXJ7TElOS0xBQkVMfSAgICAgICAgOjo9ICJbIiBAdmFye05BTUV9ICJdIgogQHZhcntMSU5LTEFCRUxTfSAgICAgICA6Oj0gQHZhcntMSU5LTEFCRUx9IFtAdmFye0xJTktMQUJFTFN9XQogQHZhcntGSUxURVJfQVJHVU1FTlRTfSA6Oj0gc2VxdWVuY2Ugb2YgY2hhcnMgKHBvc3NpYmx5IHF1b3RlZCkKLUB2YXJ7RklMVEVSfSAgICAgICAgICAgOjo9IFtAdmFye0xJTktMQUJFTFN9XSBAdmFye05BTUV9IFsiPSIgQHZhcntGSUxURVJfQVJHVU1FTlRTfV0gW0B2YXJ7TElOS0xBQkVMU31dCitAdmFye0ZJTFRFUn0gICAgICAgICAgIDo6PSBbQHZhcntMSU5LTEFCRUxTfV0gQHZhcntGSUxURVJfTkFNRX0gWyI9IiBAdmFye0ZJTFRFUl9BUkdVTUVOVFN9XSBbQHZhcntMSU5LTEFCRUxTfV0KIEB2YXJ7RklMVEVSQ0hBSU59ICAgICAgOjo9IEB2YXJ7RklMVEVSfSBbLEB2YXJ7RklMVEVSQ0hBSU59XQogQHZhcntGSUxURVJHUkFQSH0gICAgICA6Oj0gW3N3c19mbGFncz1AdmFye2ZsYWdzfTtdIEB2YXJ7RklMVEVSQ0hBSU59IFs7QHZhcntGSUxURVJHUkFQSH1dCiBAZW5kIGV4YW1wbGUKIAorQGFuY2hvcntmaWx0ZXJncmFwaCBlc2NhcGluZ30KIEBzZWN0aW9uIE5vdGVzIG9uIGZpbHRlcmdyYXBoIGVzY2FwaW5nCiAKIEZpbHRlcmdyYXBoIGRlc2NyaXB0aW9uIGNvbXBvc2l0aW9uIGVudGFpbHMgc2V2ZXJhbCBsZXZlbHMgb2YKQEAgLTMwNiw4ICszMDgsNDMgQEAKIGN1cnZlcyAgICA9IGVuYWJsZT0nZ3RlKHQsMyknIDogcHJlc2V0PWNyb3NzX3Byb2Nlc3MKIEBlbmQgZXhhbXBsZQogCitTZWUgQGNvZGV7ZmZtcGVnIC1maWx0ZXJzfSB0byB2aWV3IHdoaWNoIGZpbHRlcnMgaGF2ZSB0aW1lbGluZSBzdXBwb3J0LgorCiBAYyBtYW4gZW5kIEZJTFRFUkdSQVBIIERFU0NSSVBUSU9OCiAKK0BhbmNob3J7ZnJhbWVzeW5jfQorQGNoYXB0ZXIgT3B0aW9ucyBmb3IgZmlsdGVycyB3aXRoIHNldmVyYWwgaW5wdXRzIChmcmFtZXN5bmMpCitAYyBtYW4gYmVnaW4gT1BUSU9OUyBGT1IgRklMVEVSUyBXSVRIIFNFVkVSQUwgSU5QVVRTCisKK1NvbWUgZmlsdGVycyB3aXRoIHNldmVyYWwgaW5wdXRzIHN1cHBvcnQgYSBjb21tb24gc2V0IG9mIG9wdGlvbnMuCitUaGVzZSBvcHRpb25zIGNhbiBvbmx5IGJlIHNldCBieSBuYW1lLCBub3Qgd2l0aCB0aGUgc2hvcnQgbm90YXRpb24uCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBlb2ZfYWN0aW9uCitUaGUgYWN0aW9uIHRvIHRha2Ugd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgb24gdGhlIHNlY29uZGFyeSBpbnB1dDsgaXQgYWNjZXB0cworb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcmVwZWF0CitSZXBlYXQgdGhlIGxhc3QgZnJhbWUgKHRoZSBkZWZhdWx0KS4KK0BpdGVtIGVuZGFsbAorRW5kIGJvdGggc3RyZWFtcy4KK0BpdGVtIHBhc3MKK1Bhc3MgdGhlIG1haW4gaW5wdXQgdGhyb3VnaC4KK0BlbmQgdGFibGUKKworQGl0ZW0gc2hvcnRlc3QKK0lmIHNldCB0byAxLCBmb3JjZSB0aGUgb3V0cHV0IHRvIHRlcm1pbmF0ZSB3aGVuIHRoZSBzaG9ydGVzdCBpbnB1dAordGVybWluYXRlcy4gRGVmYXVsdCB2YWx1ZSBpcyAwLgorCitAaXRlbSByZXBlYXRsYXN0CitJZiBzZXQgdG8gMSwgZm9yY2UgdGhlIGZpbHRlciB0byBleHRlbmQgdGhlIGxhc3QgZnJhbWUgb2Ygc2Vjb25kYXJ5IHN0cmVhbXMKK3VudGlsIHRoZSBlbmQgb2YgdGhlIHByaW1hcnkgc3RyZWFtLiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgdGhpcyBiZWhhdmlvci4KK0RlZmF1bHQgdmFsdWUgaXMgMS4KK0BlbmQgdGFibGUKKworQGMgbWFuIGVuZCBPUFRJT05TIEZPUiBGSUxURVJTIFdJVEggU0VWRVJBTCBJTlBVVFMKKwogQGNoYXB0ZXIgQXVkaW8gRmlsdGVycwogQGMgbWFuIGJlZ2luIEFVRElPIEZJTFRFUlMKIApAQCAtMzU0LDggKzM5MSw4IEBACiBTZXQgaW5wdXQgZ2Fpbi4gRGVmYXVsdCBpcyAxLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMDE1NjI1IGFuZCA2NC4KIAogQGl0ZW0gdGhyZXNob2xkCi1JZiBhIHNpZ25hbCBvZiBzZWNvbmQgc3RyZWFtIHJpc2VzIGFib3ZlIHRoaXMgbGV2ZWwgaXQgd2lsbCBhZmZlY3QgdGhlIGdhaW4KLXJlZHVjdGlvbiBvZiB0aGUgZmlyc3Qgc3RyZWFtLgorSWYgYSBzaWduYWwgb2Ygc3RyZWFtIHJpc2VzIGFib3ZlIHRoaXMgbGV2ZWwgaXQgd2lsbCBhZmZlY3QgdGhlIGdhaW4KK3JlZHVjdGlvbi4KIEJ5IGRlZmF1bHQgaXQgaXMgMC4xMjUuIFJhbmdlIGlzIGJldHdlZW4gMC4wMDA5NzU2MyBhbmQgMS4KIAogQGl0ZW0gcmF0aW8KQEAgLTM3Myw3ICs0MTAsNyBAQAogCiBAaXRlbSBtYWtldXAKIFNldCB0aGUgYW1vdW50IGJ5IGhvdyBtdWNoIHNpZ25hbCB3aWxsIGJlIGFtcGxpZmllZCBhZnRlciBwcm9jZXNzaW5nLgotRGVmYXVsdCBpcyAyLiBSYW5nZSBpcyBmcm9tIDEgYW5kIDY0LgorRGVmYXVsdCBpcyAxLiBSYW5nZSBpcyBmcm9tIDEgdG8gNjQuCiAKIEBpdGVtIGtuZWUKIEN1cnZlIHRoZSBzaGFycCBrbmVlIGFyb3VuZCB0aGUgdGhyZXNob2xkIHRvIGVudGVyIGdhaW4gcmVkdWN0aW9uIG1vcmUgc29mdGx5LgpAQCAtMzkzLDYgKzQzMCwyMSBAQAogUmFuZ2UgaXMgYmV0d2VlbiAwIGFuZCAxLgogQGVuZCB0YWJsZQogCitAc2VjdGlvbiBhY29udHJhc3QKK1NpbXBsZSBhdWRpbyBkeW5hbWljIHJhbmdlIGNvbW1wcmVzc2lvbi9leHBhbnNpb24gZmlsdGVyLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gY29udHJhc3QKK1NldCBjb250cmFzdC4gRGVmYXVsdCBpcyAzMy4gQWxsb3dlZCByYW5nZSBpcyBiZXR3ZWVuIDAgYW5kIDEwMC4KK0BlbmQgdGFibGUKKworQHNlY3Rpb24gYWNvcHkKKworQ29weSB0aGUgaW5wdXQgYXVkaW8gc291cmNlIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiBUaGlzIGlzIG1haW5seSB1c2VmdWwgZm9yCit0ZXN0aW5nIHB1cnBvc2VzLgorCiBAc2VjdGlvbiBhY3Jvc3NmYWRlCiAKIEFwcGx5IGNyb3NzIGZhZGUgZnJvbSBvbmUgaW5wdXQgYXVkaW8gc3RyZWFtIHRvIGFub3RoZXIgaW5wdXQgYXVkaW8gc3RyZWFtLgpAQCAtNDQxLDYgKzQ5Myw2NCBAQAogQGVuZCBleGFtcGxlCiBAZW5kIGl0ZW1pemUKIAorQHNlY3Rpb24gYWNydXNoZXIKKworUmVkdWNlIGF1ZGlvIGJpdCByZXNvbHV0aW9uLgorCitUaGlzIGZpbHRlciBpcyBiaXQgY3J1c2hlciB3aXRoIGVuaGFuY2VkIGZ1bmN0aW9uYWxpdHkuIEEgYml0IGNydXNoZXIKK2lzIHVzZWQgdG8gYXVkaWJseSByZWR1Y2UgbnVtYmVyIG9mIGJpdHMgYW4gYXVkaW8gc2lnbmFsIGlzIHNhbXBsZWQKK3dpdGguIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGJpdCBkZXB0aCBhdCBhbGwsIGl0IGp1c3QgcHJvZHVjZXMgdGhlCitlZmZlY3QuIE1hdGVyaWFsIHJlZHVjZWQgaW4gYml0IGRlcHRoIHNvdW5kcyBtb3JlIGhhcnNoIGFuZCAiZGlnaXRhbCIuCitUaGlzIGZpbHRlciBpcyBhYmxlIHRvIGV2ZW4gcm91bmQgdG8gY29udGludW91cyB2YWx1ZXMgaW5zdGVhZCBvZiBkaXNjcmV0ZQorYml0IGRlcHRocy4KK0FkZGl0aW9uYWxseSBpdCBoYXMgYSBEL0Mgb2Zmc2V0IHdoaWNoIHJlc3VsdHMgaW4gZGlmZmVyZW50IGNydXNoaW5nIG9mCit0aGUgbG93ZXIgYW5kIHRoZSB1cHBlciBoYWxmIG9mIHRoZSBzaWduYWwuCitBbiBBbnRpLUFsaWFzaW5nIHNldHRpbmcgaXMgYWJsZSB0byBwcm9kdWNlICJzb2Z0ZXIiIGNydXNoaW5nIHNvdW5kcy4KKworQW5vdGhlciBmZWF0dXJlIG9mIHRoaXMgZmlsdGVyIGlzIHRoZSBsb2dhcml0aG1pYyBtb2RlLgorVGhpcyBzZXR0aW5nIHN3aXRjaGVzIGZyb20gbGluZWFyIGRpc3RhbmNlcyBiZXR3ZWVuIGJpdHMgdG8gbG9nYXJpdGhtaWMgb25lcy4KK1RoZSByZXN1bHQgaXMgYSBtdWNoIG1vcmUgIm5hdHVyYWwiIHNvdW5kaW5nIGNydXNoZXIgd2hpY2ggZG9lc24ndCBnYXRlIGxvdworc2lnbmFscyBmb3IgZXhhbXBsZS4gVGhlIGh1bWFuIGVhciBoYXMgYSBsb2dhcml0aG1pYyBwZXJjZXB0aW9uLAorc28gdGhpcyBraW5kIG9mIGNydXNoaW5nIGlzIG11Y2ggbW9yZSBwbGVhc2FudC4KK0xvZ2FyaXRobWljIGNydXNoaW5nIGlzIGFsc28gYWJsZSB0byBnZXQgYW50aS1hbGlhc2VkLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gbGV2ZWxfaW4KK1NldCBsZXZlbCBpbi4KKworQGl0ZW0gbGV2ZWxfb3V0CitTZXQgbGV2ZWwgb3V0LgorCitAaXRlbSBiaXRzCitTZXQgYml0IHJlZHVjdGlvbi4KKworQGl0ZW0gbWl4CitTZXQgbWl4aW5nIGFtb3VudC4KKworQGl0ZW0gbW9kZQorQ2FuIGJlIGxpbmVhcjogQGNvZGV7bGlufSBvciBsb2dhcml0aG1pYzogQGNvZGV7bG9nfS4KKworQGl0ZW0gZGMKK1NldCBEQy4KKworQGl0ZW0gYWEKK1NldCBhbnRpLWFsaWFzaW5nLgorCitAaXRlbSBzYW1wbGVzCitTZXQgc2FtcGxlIHJlZHVjdGlvbi4KKworQGl0ZW0gbGZvCitFbmFibGUgTEZPLiBCeSBkZWZhdWx0IGRpc2FibGVkLgorCitAaXRlbSBsZm9yYW5nZQorU2V0IExGTyByYW5nZS4KKworQGl0ZW0gbGZvcmF0ZQorU2V0IExGTyByYXRlLgorQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBhZGVsYXkKIAogRGVsYXkgb25lIG9yIG1vcmUgYXVkaW8gY2hhbm5lbHMuCkBAIC00NTIsOSArNTYyLDkgQEAKIEB0YWJsZSBAb3B0aW9uCiBAaXRlbSBkZWxheXMKIFNldCBsaXN0IG9mIGRlbGF5cyBpbiBtaWxsaXNlY29uZHMgZm9yIGVhY2ggY2hhbm5lbCBzZXBhcmF0ZWQgYnkgJ3wnLgotQXQgbGVhc3Qgb25lIGRlbGF5IGdyZWF0ZXIgdGhhbiAwIHNob3VsZCBiZSBwcm92aWRlZC4KIFVudXNlZCBkZWxheXMgd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLiBJZiBudW1iZXIgb2YgZ2l2ZW4gZGVsYXlzIGlzCiBzbWFsbGVyIHRoYW4gbnVtYmVyIG9mIGNoYW5uZWxzIGFsbCByZW1haW5pbmcgY2hhbm5lbHMgd2lsbCBub3QgYmUgZGVsYXllZC4KK0lmIHlvdSB3YW50IHRvIGRlbGF5IGV4YWN0IG51bWJlciBvZiBzYW1wbGVzLCBhcHBlbmQgJ1MnIHRvIG51bWJlci4KIEBlbmQgdGFibGUKIAogQHN1YnNlY3Rpb24gRXhhbXBsZXMKQEAgLTQ2Niw2ICs1NzYsMTMgQEAKIEBleGFtcGxlCiBhZGVsYXk9MTUwMHwwfDUwMAogQGVuZCBleGFtcGxlCisKK0BpdGVtCitEZWxheSBzZWNvbmQgY2hhbm5lbCBieSA1MDAgc2FtcGxlcywgdGhlIHRoaXJkIGNoYW5uZWwgYnkgNzAwIHNhbXBsZXMgYW5kIGxlYXZlCit0aGUgZmlyc3QgY2hhbm5lbCAoYW5kIGFueSBvdGhlciBjaGFubmVscyB0aGF0IG1heSBiZSBwcmVzZW50KSB1bmNoYW5nZWQuCitAZXhhbXBsZQorYWRlbGF5PTB8NTAwU3w3MDBTCitAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCiBAc2VjdGlvbiBhZWNobwpAQCAtNDk1LDcgKzYxMiw3IEBACiBEZWZhdWx0IGlzIEBjb2RlezEwMDB9LgogCiBAaXRlbSBkZWNheXMKLVNldCBsaXN0IG9mIGxvdWRuZXNzZXMgb2YgcmVmbGVjdGVkIHNpZ25hbHMgc2VwYXJhdGVkIGJ5ICd8Jy4KK1NldCBsaXN0IG9mIGxvdWRuZXNzIG9mIHJlZmxlY3RlZCBzaWduYWxzIHNlcGFyYXRlZCBieSAnfCcuCiBBbGxvd2VkIHJhbmdlIGZvciBlYWNoIEBjb2Rle2RlY2F5fSBpcyBAY29kZXsoMCAtIDEuMF19LgogRGVmYXVsdCBpcyBAY29kZXswLjV9LgogQGVuZCB0YWJsZQpAQCAtODEwLDYgKzkyNyw1MCBAQAogQGVuZCBleGFtcGxlCiBAZW5kIGl0ZW1pemUKIAorQGFuY2hvcnthZmlyfQorQHNlY3Rpb24gYWZpcgorCitBcHBseSBhbiBhcmJpdHJhcnkgRnJlcXVlbmN5IEltcHVsc2UgUmVzcG9uc2UgZmlsdGVyLgorCitUaGlzIGZpbHRlciBpcyBkZXNpZ25lZCBmb3IgYXBwbHlpbmcgbG9uZyBGSVIgZmlsdGVycywKK3VwIHRvIDMwIHNlY29uZHMgbG9uZy4KKworSXQgY2FuIGJlIHVzZWQgYXMgY29tcG9uZW50IGZvciBkaWdpdGFsIGNyb3Nzb3ZlciBmaWx0ZXJzLAorcm9vbSBlcXVhbGl6YXRpb24sIGNyb3NzIHRhbGsgY2FuY2VsbGF0aW9uLCB3YXZlZmllbGQgc3ludGhlc2lzLAorYXVyYWxpemF0aW9uLCBhbWJpb3Bob25pY3MgYW5kIGFtYmlzb25pY3MuCisKK1RoaXMgZmlsdGVyIHVzZXMgc2Vjb25kIHN0cmVhbSBhcyBGSVIgY29lZmZpY2llbnRzLgorSWYgc2Vjb25kIHN0cmVhbSBob2xkcyBzaW5nbGUgY2hhbm5lbCwgaXQgd2lsbCBiZSB1c2VkCitmb3IgYWxsIGlucHV0IGNoYW5uZWxzIGluIGZpcnN0IHN0cmVhbSwgb3RoZXJ3aXNlCitudW1iZXIgb2YgY2hhbm5lbHMgaW4gc2Vjb25kIHN0cmVhbSBtdXN0IGJlIHNhbWUgYXMKK251bWJlciBvZiBjaGFubmVscyBpbiBmaXJzdCBzdHJlYW0uCisKK0l0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZHJ5CitTZXQgZHJ5IGdhaW4uIFRoaXMgc2V0cyBpbnB1dCBnYWluLgorCitAaXRlbSB3ZXQKK1NldCB3ZXQgZ2Fpbi4gVGhpcyBzZXRzIGZpbmFsIG91dHB1dCBnYWluLgorCitAaXRlbSBsZW5ndGgKK1NldCBJbXB1bHNlIFJlc3BvbnNlIGZpbHRlciBsZW5ndGguIERlZmF1bHQgaXMgMSwgd2hpY2ggbWVhbnMgd2hvbGUgSVIgaXMgcHJvY2Vzc2VkLgorCitAaXRlbSBhZ2FpbgorRW5hYmxlIGFwcGx5aW5nIGdhaW4gbWVhc3VyZWQgZnJvbSBwb3dlciBvZiBJUi4KK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKK0BpdGVtCitBcHBseSByZXZlcmIgdG8gc3RyZWFtIHVzaW5nIG1vbm8gSVIgZmlsZSBhcyBzZWNvbmQgaW5wdXQsIGNvbXBsZXRlIGNvbW1hbmQgdXNpbmcgZmZtcGVnOgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBpbnB1dC53YXYgLWkgbWlkZGxlX3R1bm5lbF8xd2F5X21vbm8ud2F2IC1sYXZmaSBhZmlyIG91dHB1dC53YXYKK0BlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCisKIEBhbmNob3J7YWZvcm1hdH0KIEBzZWN0aW9uIGFmb3JtYXQKIApAQCAtODQ1LDE0ICsxMDA2LDE0IEBACiBwcm9jZXNzaW5nIHJlZHVjZXMgZGlzdHVyYmluZyBub2lzZSBiZXR3ZWVuIHVzZWZ1bCBzaWduYWxzLgogCiBHYXRpbmcgaXMgZG9uZSBieSBkZXRlY3RpbmcgdGhlIHZvbHVtZSBiZWxvdyBhIGNob3NlbiBsZXZlbCBAdmFye3RocmVzaG9sZH0KLWFuZCBkaXZpZGUgaXQgYnkgdGhlIGZhY3RvciBzZXQgd2l0aCBAdmFye3JhdGlvfS4gVGhlIGJvdHRvbSBvZiB0aGUgbm9pc2UKK2FuZCBkaXZpZGluZyBpdCBieSB0aGUgZmFjdG9yIHNldCB3aXRoIEB2YXJ7cmF0aW99LiBUaGUgYm90dG9tIG9mIHRoZSBub2lzZQogZmxvb3IgaXMgc2V0IHZpYSBAdmFye3JhbmdlfS4gQmVjYXVzZSBhbiBleGFjdCBtYW5pcHVsYXRpb24gb2YgdGhlIHNpZ25hbAogd291bGQgY2F1c2UgZGlzdG9ydGlvbiBvZiB0aGUgd2F2ZWZvcm0gdGhlIHJlZHVjdGlvbiBjYW4gYmUgbGV2ZWxsZWQgb3ZlcgogdGltZS4gVGhpcyBpcyBkb25lIGJ5IHNldHRpbmcgQHZhcnthdHRhY2t9IGFuZCBAdmFye3JlbGVhc2V9LgogCiBAdmFye2F0dGFja30gZGV0ZXJtaW5lcyBob3cgbG9uZyB0aGUgc2lnbmFsIGhhcyB0byBmYWxsIGJlbG93IHRoZSB0aHJlc2hvbGQKIGJlZm9yZSBhbnkgcmVkdWN0aW9uIHdpbGwgb2NjdXIgYW5kIEB2YXJ7cmVsZWFzZX0gc2V0cyB0aGUgdGltZSB0aGUgc2lnbmFsCi1oYXMgdG8gcmFpc2UgYWJvdmUgdGhlIHRocmVzaG9sZCB0byByZWR1Y2UgdGhlIHJlZHVjdGlvbiBhZ2Fpbi4KK2hhcyB0byByaXNlIGFib3ZlIHRoZSB0aHJlc2hvbGQgdG8gcmVkdWNlIHRoZSByZWR1Y3Rpb24gYWdhaW4uCiBTaG9ydGVyIHNpZ25hbHMgdGhhbiB0aGUgY2hvc2VuIGF0dGFjayB0aW1lIHdpbGwgYmUgbGVmdCB1bnRvdWNoZWQuCiAKIEB0YWJsZSBAb3B0aW9uCkBAIC04NjksNyArMTAzMCw3IEBACiBEZWZhdWx0IGlzIDAuMTI1LiBBbGxvd2VkIHJhbmdlIGlzIGZyb20gMCB0byAxLgogCiBAaXRlbSByYXRpbwotU2V0IGEgcmF0aW8gYWJvdXQgd2hpY2ggdGhlIHNpZ25hbCBpcyByZWR1Y2VkLgorU2V0IGEgcmF0aW8gYnkgd2hpY2ggdGhlIHNpZ25hbCBpcyByZWR1Y2VkLgogRGVmYXVsdCBpcyAyLiBBbGxvd2VkIHJhbmdlIGlzIGZyb20gMSB0byA5MDAwLgogCiBAaXRlbSBhdHRhY2sKQEAgLTg5MiwxOSArMTA1MywxMDIgQEAKIAogQGl0ZW0gZGV0ZWN0aW9uCiBDaG9vc2UgaWYgZXhhY3Qgc2lnbmFsIHNob3VsZCBiZSB0YWtlbiBmb3IgZGV0ZWN0aW9uIG9yIGFuIFJNUyBsaWtlIG9uZS4KLURlZmF1bHQgaXMgcm1zLiBDYW4gYmUgcGVhayBvciBybXMuCitEZWZhdWx0IGlzIEBjb2Rle3Jtc30uIENhbiBiZSBAY29kZXtwZWFrfSBvciBAY29kZXtybXN9LgogCiBAaXRlbSBsaW5rCiBDaG9vc2UgaWYgdGhlIGF2ZXJhZ2UgbGV2ZWwgYmV0d2VlbiBhbGwgY2hhbm5lbHMgb3IgdGhlIGxvdWRlciBjaGFubmVsIGFmZmVjdHMKIHRoZSByZWR1Y3Rpb24uCi1EZWZhdWx0IGlzIGF2ZXJhZ2UuIENhbiBiZSBhdmVyYWdlIG9yIG1heGltdW0uCitEZWZhdWx0IGlzIEBjb2Rle2F2ZXJhZ2V9LiBDYW4gYmUgQGNvZGV7YXZlcmFnZX0gb3IgQGNvZGV7bWF4aW11bX0uCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIGFpaXIKKworQXBwbHkgYW4gYXJiaXRyYXJ5IEluZmluaXRlIEltcHVsc2UgUmVzcG9uc2UgZmlsdGVyLgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHoKK1NldCBudW1lcmF0b3IvemVyb3MgY29lZmZpY2llbnRzLgorCitAaXRlbSBwCitTZXQgZGVub21pbmF0b3IvcG9sZXMgY29lZmZpY2llbnRzLgorCitAaXRlbSBrCitTZXQgY2hhbm5lbHMgZ2FpbnMuCisKK0BpdGVtIGRyeV9nYWluCitTZXQgaW5wdXQgZ2Fpbi4KKworQGl0ZW0gd2V0X2dhaW4KK1NldCBvdXRwdXQgZ2Fpbi4KKworQGl0ZW0gZgorU2V0IGNvZWZmaWNpZW50cyBmb3JtYXQuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gdGYKK3RyYW5zZmVyIGZ1bmN0aW9uCitAaXRlbSB6cAorWi1wbGFuZSB6ZXJvcy9wb2xlcywgY2FydGVzaWFuIChkZWZhdWx0KQorQGl0ZW0gcHIKK1otcGxhbmUgemVyb3MvcG9sZXMsIHBvbGFyIHJhZGlhbnMKK0BpdGVtIHBkCitaLXBsYW5lIHplcm9zL3BvbGVzLCBwb2xhciBkZWdyZWVzCitAZW5kIHRhYmxlCisKK0BpdGVtIHIKK1NldCBraW5kIG9mIHByb2Nlc3NpbmcuCitDYW4gYmUgQGNvZGV7ZH0gLSBkaXJlY3Qgb3IgQGNvZGV7c30gLSBzZXJpYWwgY2FzY2FkaW5nLiBEZWZhdWxzIGlzIEBjb2Rle3N9LgorCitAaXRlbSBlCitTZXQgZmlsdGVyaW5nIHByZWNpc2lvbi4KKworQHRhYmxlIEBzYW1wCitAaXRlbSBkYmwKK2RvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQgKGRlZmF1bHQpCitAaXRlbSBmbHQKK3NpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQKK0BpdGVtIGkzMgorMzItYml0IGludGVnZXJzCitAaXRlbSBpMTYKKzE2LWJpdCBpbnRlZ2VycworQGVuZCB0YWJsZQorCitAZW5kIHRhYmxlCisKK0NvZWZmaWNpZW50cyBpbiBAY29kZXt0Zn0gZm9ybWF0IGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2VzIGFuZCBhcmUgaW4gYXNjZW5kaW5nCitvcmRlci4KKworQ29lZmZpY2llbnRzIGluIEBjb2Rle3pwfSBmb3JtYXQgYXJlIHNlcGFyYXRlZCBieSBzcGFjZXMgYW5kIG9yZGVyIG9mIGNvZWZmaWNpZW50cworZG9lc24ndCBtYXR0ZXIuIENvZWZmaWNpZW50cyBpbiBAY29kZXt6cH0gZm9ybWF0IGFyZSBjb21wbGV4IG51bWJlcnMgd2l0aCBAdmFye2l9CitpbWFnaW5hcnkgdW5pdC4KKworRGlmZmVyZW50IGNvZWZmaWNpZW50cyBhbmQgZ2FpbnMgY2FuIGJlIHByb3ZpZGVkIGZvciBldmVyeSBjaGFubmVsLCBpbiBzdWNoIGNhc2UKK3VzZSAnfCcgdG8gc2VwYXJhdGUgY29lZmZpY2llbnRzIG9yIGdhaW5zLiBMYXN0IHByb3ZpZGVkIGNvZWZmaWNpZW50cyB3aWxsIGJlCit1c2VkIGZvciBhbGwgcmVtYWluaW5nIGNoYW5uZWxzLgorCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitAaXRlbWl6ZQorQGl0ZW0KK0FwcGx5IDIgcG9sZSBlbGxpcHRpYyBub3RjaCBhdCBhcnJvdW5kIDUwMDBIeiBmb3IgNDgwMDAgSHogc2FtcGxlIHJhdGU6CitAZXhhbXBsZQorYWlpcj1rPTE6ej03Ljk1NzU4NDgwNzgwOTY3NTgxMEUtMSAtMi41NzUxMjg1Njg5MDgzMzIzMDAgMy42NzQ4Mzk4NTM5MzA3ODg3MTAgLTIuNTc1MTI4NzUyODk3OTkxMzcgNy45NTc1ODYyOTYzMTcxMzA4ODBFLTE6cD0xIC0yLjg2OTUwMDcyNDMyMzI1OTUzIDMuNjMwMjIwODgwNTQ2NDcyMTggLTIuMjgwNzU2NzgxNDcyNzIyMzIgNi4zNjEzNjIzMjY0Nzc0MjM1MDBFLTE6Zj10ZjpyPWQKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorU2FtZSBhcyBhYm92ZSBidXQgaW4gQGNvZGV7enB9IGZvcm1hdDoKK0BleGFtcGxlCithaWlyPWs9MC43OTU3NTg0ODA3ODA5Njc1Njp6PTAuODA5MTg3MDErMC41ODc3MzAwN2kgMC44MDkxODcwMS0wLjU4NzczMDA3aSAwLjgwODg0NzAwKzAuNTg3ODQwNTVpIDAuODA4ODQ3MDAtMC41ODc4NDA1NWk6cD0wLjYzODkyMzQ1KzAuNTk5NTEyMzVpIDAuNjM4OTIzNDUtMC41OTk1MTIzNWkgMC43OTU4MjY5MSswLjQ0MTk4NjczaSAwLjc5NTgyNjkxLTAuNDQxOTg2NzNpOmY9enA6cj1zCitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAc2VjdGlvbiBhbGltaXRlcgogCi1UaGUgbGltaXRlciBwcmV2ZW50cyBpbnB1dCBzaWduYWwgZnJvbSByYWlzaW5nIG92ZXIgYSBkZXNpcmVkIHRocmVzaG9sZC4KK1RoZSBsaW1pdGVyIHByZXZlbnRzIGFuIGlucHV0IHNpZ25hbCBmcm9tIHJpc2luZyBvdmVyIGEgZGVzaXJlZCB0aHJlc2hvbGQuCiBUaGlzIGxpbWl0ZXIgdXNlcyBsb29rYWhlYWQgdGVjaG5vbG9neSB0byBwcmV2ZW50IHlvdXIgc2lnbmFsIGZyb20gZGlzdG9ydGluZy4KLUl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCBkZWxheSBhZnRlciBzaWduYWwgaXMgcHJvY2Vzc2VkLiBLZWVwIGluIG1pbmQKK0l0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBzbWFsbCBkZWxheSBhZnRlciB0aGUgc2lnbmFsIGlzIHByb2Nlc3NlZC4gS2VlcCBpbiBtaW5kCiB0aGF0IHRoZSBkZWxheSBpdCBwcm9kdWNlcyBpcyB0aGUgYXR0YWNrIHRpbWUgeW91IHNldC4KIAogVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKQEAgLTk1Nyw3ICsxMjAxLDcgQEAKIEBpdGVtIGZyZXF1ZW5jeSwgZgogU2V0IGZyZXF1ZW5jeSBpbiBIei4KIAotQGl0ZW0gd2lkdGhfdHlwZQorQGl0ZW0gd2lkdGhfdHlwZSwgdAogU2V0IG1ldGhvZCB0byBzcGVjaWZ5IGJhbmQtd2lkdGggb2YgZmlsdGVyLgogQHRhYmxlIEBvcHRpb24KIEBpdGVtIGgKQEAgLTk2OCwxMCArMTIxMiw1MCBAQAogb2N0YXZlCiBAaXRlbSBzCiBzbG9wZQorQGl0ZW0gawora0h6CiBAZW5kIHRhYmxlCiAKIEBpdGVtIHdpZHRoLCB3CiBTcGVjaWZ5IHRoZSBiYW5kLXdpZHRoIG9mIGEgZmlsdGVyIGluIHdpZHRoX3R5cGUgdW5pdHMuCisKK0BpdGVtIGNoYW5uZWxzLCBjCitTcGVjaWZ5IHdoaWNoIGNoYW5uZWxzIHRvIGZpbHRlciwgYnkgZGVmYXVsdCBhbGwgYXZhaWxhYmxlIGFyZSBmaWx0ZXJlZC4KK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gQ29tbWFuZHMKKworVGhpcyBmaWx0ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBmcmVxdWVuY3ksIGYKK0NoYW5nZSBhbGxwYXNzIGZyZXF1ZW5jeS4KK1N5bnRheCBmb3IgdGhlIGNvbW1hbmQgaXMgOiAiQHZhcntmcmVxdWVuY3l9IgorCitAaXRlbSB3aWR0aF90eXBlLCB0CitDaGFuZ2UgYWxscGFzcyB3aWR0aF90eXBlLgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye3dpZHRoX3R5cGV9IgorCitAaXRlbSB3aWR0aCwgdworQ2hhbmdlIGFsbHBhc3Mgd2lkdGguCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7d2lkdGh9IgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBhbG9vcAorCitMb29wIGF1ZGlvIHNhbXBsZXMuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBsb29wCitTZXQgdGhlIG51bWJlciBvZiBsb29wcy4gU2V0dGluZyB0aGlzIHZhbHVlIHRvIC0xIHdpbGwgcmVzdWx0IGluIGluZmluaXRlIGxvb3BzLgorRGVmYXVsdCBpcyAwLgorCitAaXRlbSBzaXplCitTZXQgbWF4aW1hbCBudW1iZXIgb2Ygc2FtcGxlcy4gRGVmYXVsdCBpcyAwLgorCitAaXRlbSBzdGFydAorU2V0IGZpcnN0IHNhbXBsZSBvZiBsb29wLiBEZWZhdWx0IGlzIDAuCiBAZW5kIHRhYmxlCiAKIEBhbmNob3J7YW1lcmdlfQpAQCAtMTA2Nyw2ICsxMzUxLDkgQEAKIFRoZSB0cmFuc2l0aW9uIHRpbWUsIGluIHNlY29uZHMsIGZvciB2b2x1bWUgcmVub3JtYWxpemF0aW9uIHdoZW4gYW4gaW5wdXQKIHN0cmVhbSBlbmRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAyIHNlY29uZHMuCiAKK0BpdGVtIHdlaWdodHMKK1NwZWNpZnkgd2VpZ2h0IG9mIGVhY2ggaW5wdXQgYXVkaW8gc3RyZWFtIGFzIHNlcXVlbmNlLgorRWFjaCB3ZWlnaHQgaXMgc2VwYXJhdGVkIGJ5IHNwYWNlLiBCeSBkZWZhdWx0IGFsbCBpbnB1dHMgaGF2ZSBzYW1lIHdlaWdodC4KIEBlbmQgdGFibGUKIAogQHNlY3Rpb24gYW5lcXVhbGl6ZXIKQEAgLTEwODYsNyArMTM3Myw3IEBACiBTZXQgY2hhbm5lbCBudW1iZXIgdG8gd2hpY2ggZXF1YWxpemF0aW9uIHdpbGwgYmUgYXBwbGllZC4KIElmIGlucHV0IGRvZXNuJ3QgaGF2ZSB0aGF0IGNoYW5uZWwgdGhlIGVudHJ5IGlzIGlnbm9yZWQuCiAKLUBpdGVtIGNmCitAaXRlbSBmCiBTZXQgY2VudHJhbCBmcmVxdWVuY3kgZm9yIGJhbmQuCiBJZiBpbnB1dCBkb2Vzbid0IGhhdmUgdGhhdCBmcmVxdWVuY3kgdGhlIGVudHJ5IGlzIGlnbm9yZWQuCiAKQEAgLTEwOTYsNyArMTM4Myw3IEBACiBAaXRlbSBnCiBTZXQgYmFuZCBnYWluIGluIGRCLgogCi1AaXRlbSBmCitAaXRlbSB0CiBTZXQgZmlsdGVyIHR5cGUgZm9yIGJhbmQsIG9wdGlvbmFsLCBjYW4gYmU6CiAKIEB0YWJsZSBAc2FtcApAQCAtMTEyMCw3ICsxNDA3LDcgQEAKIAogQGl0ZW0gbWdhaW4KIFNldCBtYXggZ2FpbiB0aGF0IHdpbGwgYmUgZGlzcGxheWVkLiBPbmx5IHVzZWZ1bCBpZiBjdXJ2ZXMgb3B0aW9uIGlzIGFjdGl2YXRlZC4KLVNldHRpbmcgdGhpcyB0byByZWFzb25hYmxlIHZhbHVlIGFsbG93cyB0byBkaXNwbGF5IGdhaW4gd2hpY2ggaXMgZGVyaXZlZCBmcm9tCitTZXR0aW5nIHRoaXMgdG8gYSByZWFzb25hYmxlIHZhbHVlIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGRpc3BsYXkgZ2FpbiB3aGljaCBpcyBkZXJpdmVkIGZyb20KIG5laWdoYm91ciBiYW5kcyB3aGljaCBhcmUgdG9vIGNsb3NlIHRvIGVhY2ggb3RoZXIgYW5kIHRodXMgcHJvZHVjZSBoaWdoZXIgZ2Fpbgogd2hlbiBib3RoIGFyZSBhY3RpdmF0ZWQuCiAKQEAgLTEzMjgsNyArMTYxNSw5IEBACiBbQHZhcntzYW1wbGVfcmF0ZX06XUB2YXJ7cmVzYW1wbGVyX29wdGlvbnN9LCB3aGVyZSBAdmFye3NhbXBsZV9yYXRlfQogZXhwcmVzc2VzIGEgc2FtcGxlIHJhdGUgYW5kIEB2YXJ7cmVzYW1wbGVyX29wdGlvbnN9IGlzIGEgbGlzdCBvZgogQHZhcntrZXl9PUB2YXJ7dmFsdWV9IHBhaXJzLCBzZXBhcmF0ZWQgYnkgIjoiLiBTZWUgdGhlCi1mZm1wZWctcmVzYW1wbGVyIG1hbnVhbCBmb3IgdGhlIGNvbXBsZXRlIGxpc3Qgb2Ygc3VwcG9ydGVkIG9wdGlvbnMuCitAcmVme1Jlc2FtcGxlciBPcHRpb25zLCwiUmVzYW1wbGVyIE9wdGlvbnMiIHNlY3Rpb24gaW4gdGhlCitmZm1wZWctcmVzYW1wbGVyKDEpIG1hbnVhbCxmZm1wZWctcmVzYW1wbGVyfQorZm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mIHN1cHBvcnRlZCBvcHRpb25zLgogCiBAc3Vic2VjdGlvbiBFeGFtcGxlcwogCkBAIC0xMzQ3LDEzICsxNjM2LDMwIEBACiBAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCitAc2VjdGlvbiBhcmV2ZXJzZQorCitSZXZlcnNlIGFuIGF1ZGlvIGNsaXAuCisKK1dhcm5pbmc6IFRoaXMgZmlsdGVyIHJlcXVpcmVzIG1lbW9yeSB0byBidWZmZXIgdGhlIGVudGlyZSBjbGlwLCBzbyB0cmltbWluZworaXMgc3VnZ2VzdGVkLgorCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitAaXRlbWl6ZQorQGl0ZW0KK1Rha2UgdGhlIGZpcnN0IDUgc2Vjb25kcyBvZiBhIGNsaXAsIGFuZCByZXZlcnNlIGl0LgorQGV4YW1wbGUKK2F0cmltPWVuZD01LGFyZXZlcnNlCitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAc2VjdGlvbiBhc2V0bnNhbXBsZXMKIAogU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZWFjaCBvdXRwdXQgYXVkaW8gZnJhbWUuCiAKIFRoZSBsYXN0IG91dHB1dCBwYWNrZXQgbWF5IGNvbnRhaW4gYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHNhbXBsZXMsIGFzCiB0aGUgZmlsdGVyIHdpbGwgZmx1c2ggYWxsIHRoZSByZW1haW5pbmcgc2FtcGxlcyB3aGVuIHRoZSBpbnB1dCBhdWRpbwotc2lnbmFsIGl0cyBlbmQuCitzaWduYWxzIGl0cyBlbmQuCiAKIFRoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CiAKQEAgLTE0NDQsNyArMTc1MCw3IEBACiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gbGVuZ3RoCiBTaG9ydCB3aW5kb3cgbGVuZ3RoIGluIHNlY29uZHMsIHVzZWQgZm9yIHBlYWsgYW5kIHRyb3VnaCBSTVMgbWVhc3VyZW1lbnQuCi1EZWZhdWx0IGlzIEBjb2RlezAuMDV9ICg1MCBtaWxsaXNlY29uZHMpLiBBbGxvd2VkIHJhbmdlIGlzIEBjb2Rle1swLjEgLSAxMF19LgorRGVmYXVsdCBpcyBAY29kZXswLjA1fSAoNTAgbWlsbGlzZWNvbmRzKS4gQWxsb3dlZCByYW5nZSBpcyBAY29kZXtbMC4wMSAtIDEwXX0uCiAKIEBpdGVtIG1ldGFkYXRhCiAKQEAgLTE0NTksNiArMTc2NSw3IEBACiBNaW5fZGlmZmVyZW5jZQogTWF4X2RpZmZlcmVuY2UKIE1lYW5fZGlmZmVyZW5jZQorUk1TX2RpZmZlcmVuY2UKIFBlYWtfbGV2ZWwKIFJNU19wZWFrCiBSTVNfdHJvdWdoCkBAIC0xNDY2LDYgKzE3NzMsNyBAQAogRmxhdF9mYWN0b3IKIFBlYWtfY291bnQKIEJpdF9kZXB0aAorRHluYW1pY19yYW5nZQogCiBhbmQgZm9yIE92ZXJhbGw6CiBEQ19vZmZzZXQKQEAgLTE0NzQsNiArMTc4Miw3IEBACiBNaW5fZGlmZmVyZW5jZQogTWF4X2RpZmZlcmVuY2UKIE1lYW5fZGlmZmVyZW5jZQorUk1TX2RpZmZlcmVuY2UKIFBlYWtfbGV2ZWwKIFJNU19sZXZlbAogUk1TX3BlYWsKQEAgLTE1MTUsNiArMTgyNCw5IEBACiBNZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgc2FtcGxlcy4KIFRoZSBhdmVyYWdlIG9mIGVhY2ggZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBzYW1wbGVzLgogCitAaXRlbSBSTVMgZGlmZmVyZW5jZQorUm9vdCBNZWFuIFNxdWFyZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIHNhbXBsZXMuCisKIEBpdGVtIFBlYWsgbGV2ZWwgZEIKIEBpdGVtIFJNUyBsZXZlbCBkQgogU3RhbmRhcmQgcGVhayBhbmQgUk1TIGxldmVsIG1lYXN1cmVkIGluIGRCRlMuCkBAIC0xNTM2LDM5ICsxODQ4LDkgQEAKIAogQGl0ZW0gQml0IGRlcHRoCiBPdmVyYWxsIGJpdCBkZXB0aCBvZiBhdWRpby4gTnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgZWFjaCBzYW1wbGUuCi1AZW5kIHRhYmxlCiAKLUBzZWN0aW9uIGFzeW5jdHMKLQotU3luY2hyb25pemUgYXVkaW8gZGF0YSB3aXRoIHRpbWVzdGFtcHMgYnkgc3F1ZWV6aW5nL3N0cmV0Y2hpbmcgaXQgYW5kL29yCi1kcm9wcGluZyBzYW1wbGVzL2FkZGluZyBzaWxlbmNlIHdoZW4gbmVlZGVkLgotCi1UaGlzIGZpbHRlciBpcyBub3QgYnVpbHQgYnkgZGVmYXVsdCwgcGxlYXNlIHVzZSBAcmVme2FyZXNhbXBsZX0gdG8gZG8gc3F1ZWV6aW5nL3N0cmV0Y2hpbmcuCi0KLUl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgotQHRhYmxlIEBvcHRpb24KLQotQGl0ZW0gY29tcGVuc2F0ZQotRW5hYmxlIHN0cmV0Y2hpbmcvc3F1ZWV6aW5nIHRoZSBkYXRhIHRvIG1ha2UgaXQgbWF0Y2ggdGhlIHRpbWVzdGFtcHMuIERpc2FibGVkCi1ieSBkZWZhdWx0LiBXaGVuIGRpc2FibGVkLCB0aW1lIGdhcHMgYXJlIGNvdmVyZWQgd2l0aCBzaWxlbmNlLgotCi1AaXRlbSBtaW5fZGVsdGEKLVRoZSBtaW5pbXVtIGRpZmZlcmVuY2UgYmV0d2VlbiB0aW1lc3RhbXBzIGFuZCBhdWRpbyBkYXRhIChpbiBzZWNvbmRzKSB0byB0cmlnZ2VyCi1hZGRpbmcvZHJvcHBpbmcgc2FtcGxlcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC4xLiBJZiB5b3UgZ2V0IGFuIGltcGVyZmVjdAotc3luYyB3aXRoIHRoaXMgZmlsdGVyLCB0cnkgc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byAwLgotCi1AaXRlbSBtYXhfY29tcAotVGhlIG1heGltdW0gY29tcGVuc2F0aW9uIGluIHNhbXBsZXMgcGVyIHNlY29uZC4gT25seSByZWxldmFudCB3aXRoIGNvbXBlbnNhdGU9MS4KLVRoZSBkZWZhdWx0IHZhbHVlIGlzIDUwMC4KLQotQGl0ZW0gZmlyc3RfcHRzCi1Bc3N1bWUgdGhhdCB0aGUgZmlyc3QgUFRTIHNob3VsZCBiZSB0aGlzIHZhbHVlLiBUaGUgdGltZSBiYXNlIGlzIDEgLyBzYW1wbGUKLXJhdGUuIFRoaXMgYWxsb3dzIGZvciBwYWRkaW5nL3RyaW1taW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyZWFtLiBCeSBkZWZhdWx0LAotbm8gYXNzdW1wdGlvbiBpcyBtYWRlIGFib3V0IHRoZSBmaXJzdCBmcmFtZSdzIGV4cGVjdGVkIFBUUywgc28gbm8gcGFkZGluZyBvcgotdHJpbW1pbmcgaXMgZG9uZS4gRm9yIGV4YW1wbGUsIHRoaXMgY291bGQgYmUgc2V0IHRvIDAgdG8gcGFkIHRoZSBiZWdpbm5pbmcgd2l0aAotc2lsZW5jZSBpZiBhbiBhdWRpbyBzdHJlYW0gc3RhcnRzIGFmdGVyIHRoZSB2aWRlbyBzdHJlYW0gb3IgdG8gdHJpbSBhbnkgc2FtcGxlcwotd2l0aCBhIG5lZ2F0aXZlIFBUUyBkdWUgdG8gZW5jb2RlciBkZWxheS4KLQorQGl0ZW0gRHluYW1pYyByYW5nZQorTWVhc3VyZWQgZHluYW1pYyByYW5nZSBvZiBhdWRpbyBpbiBkQi4KIEBlbmQgdGFibGUKIAogQHNlY3Rpb24gYXRlbXBvCkBAIC0xNjgxLDcgKzE5NjMsNyBAQAogQGl0ZW0gY3NnCiBDb25zdGFudCBza2lydCBnYWluIGlmIHNldCB0byAxLiBEZWZhdWx0cyB0byAwLgogCi1AaXRlbSB3aWR0aF90eXBlCitAaXRlbSB3aWR0aF90eXBlLCB0CiBTZXQgbWV0aG9kIHRvIHNwZWNpZnkgYmFuZC13aWR0aCBvZiBmaWx0ZXIuCiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gaApAQCAtMTY5MiwxMCArMTk3NCwzMiBAQAogb2N0YXZlCiBAaXRlbSBzCiBzbG9wZQorQGl0ZW0gawora0h6CiBAZW5kIHRhYmxlCiAKIEBpdGVtIHdpZHRoLCB3CiBTcGVjaWZ5IHRoZSBiYW5kLXdpZHRoIG9mIGEgZmlsdGVyIGluIHdpZHRoX3R5cGUgdW5pdHMuCisKK0BpdGVtIGNoYW5uZWxzLCBjCitTcGVjaWZ5IHdoaWNoIGNoYW5uZWxzIHRvIGZpbHRlciwgYnkgZGVmYXVsdCBhbGwgYXZhaWxhYmxlIGFyZSBmaWx0ZXJlZC4KK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gQ29tbWFuZHMKKworVGhpcyBmaWx0ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBmcmVxdWVuY3ksIGYKK0NoYW5nZSBiYW5kcGFzcyBmcmVxdWVuY3kuCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7ZnJlcXVlbmN5fSIKKworQGl0ZW0gd2lkdGhfdHlwZSwgdAorQ2hhbmdlIGJhbmRwYXNzIHdpZHRoX3R5cGUuCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7d2lkdGhfdHlwZX0iCisKK0BpdGVtIHdpZHRoLCB3CitDaGFuZ2UgYmFuZHBhc3Mgd2lkdGguCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7d2lkdGh9IgogQGVuZCB0YWJsZQogCiBAc2VjdGlvbiBiYW5kcmVqZWN0CkBAIC0xNzEwLDcgKzIwMTQsNyBAQAogQGl0ZW0gZnJlcXVlbmN5LCBmCiBTZXQgdGhlIGZpbHRlcidzIGNlbnRyYWwgZnJlcXVlbmN5LiBEZWZhdWx0IGlzIEBjb2RlezMwMDB9LgogCi1AaXRlbSB3aWR0aF90eXBlCitAaXRlbSB3aWR0aF90eXBlLCB0CiBTZXQgbWV0aG9kIHRvIHNwZWNpZnkgYmFuZC13aWR0aCBvZiBmaWx0ZXIuCiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gaApAQCAtMTcyMSwxMCArMjAyNSwzMiBAQAogb2N0YXZlCiBAaXRlbSBzCiBzbG9wZQorQGl0ZW0gawora0h6CiBAZW5kIHRhYmxlCiAKIEBpdGVtIHdpZHRoLCB3CiBTcGVjaWZ5IHRoZSBiYW5kLXdpZHRoIG9mIGEgZmlsdGVyIGluIHdpZHRoX3R5cGUgdW5pdHMuCisKK0BpdGVtIGNoYW5uZWxzLCBjCitTcGVjaWZ5IHdoaWNoIGNoYW5uZWxzIHRvIGZpbHRlciwgYnkgZGVmYXVsdCBhbGwgYXZhaWxhYmxlIGFyZSBmaWx0ZXJlZC4KK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gQ29tbWFuZHMKKworVGhpcyBmaWx0ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBmcmVxdWVuY3ksIGYKK0NoYW5nZSBiYW5kcmVqZWN0IGZyZXF1ZW5jeS4KK1N5bnRheCBmb3IgdGhlIGNvbW1hbmQgaXMgOiAiQHZhcntmcmVxdWVuY3l9IgorCitAaXRlbSB3aWR0aF90eXBlLCB0CitDaGFuZ2UgYmFuZHJlamVjdCB3aWR0aF90eXBlLgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye3dpZHRoX3R5cGV9IgorCitAaXRlbSB3aWR0aCwgdworQ2hhbmdlIGJhbmRyZWplY3Qgd2lkdGguCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7d2lkdGh9IgogQGVuZCB0YWJsZQogCiBAc2VjdGlvbiBiYXNzCkBAIC0xNzQ2LDcgKzIwNzIsNyBAQAogdG8gZXh0ZW5kIG9yIHJlZHVjZSB0aGUgZnJlcXVlbmN5IHJhbmdlIHRvIGJlIGJvb3N0ZWQgb3IgY3V0LgogVGhlIGRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7MTAwfSBIei4KIAotQGl0ZW0gd2lkdGhfdHlwZQorQGl0ZW0gd2lkdGhfdHlwZSwgdAogU2V0IG1ldGhvZCB0byBzcGVjaWZ5IGJhbmQtd2lkdGggb2YgZmlsdGVyLgogQHRhYmxlIEBvcHRpb24KIEBpdGVtIGgKQEAgLTE3NTcsMTAgKzIwODMsMzYgQEAKIG9jdGF2ZQogQGl0ZW0gcwogc2xvcGUKK0BpdGVtIGsKK2tIegogQGVuZCB0YWJsZQogCiBAaXRlbSB3aWR0aCwgdwogRGV0ZXJtaW5lIGhvdyBzdGVlcCBpcyB0aGUgZmlsdGVyJ3Mgc2hlbGYgdHJhbnNpdGlvbi4KKworQGl0ZW0gY2hhbm5lbHMsIGMKK1NwZWNpZnkgd2hpY2ggY2hhbm5lbHMgdG8gZmlsdGVyLCBieSBkZWZhdWx0IGFsbCBhdmFpbGFibGUgYXJlIGZpbHRlcmVkLgorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBDb21tYW5kcworCitUaGlzIGZpbHRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIGZyZXF1ZW5jeSwgZgorQ2hhbmdlIGJhc3MgZnJlcXVlbmN5LgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye2ZyZXF1ZW5jeX0iCisKK0BpdGVtIHdpZHRoX3R5cGUsIHQKK0NoYW5nZSBiYXNzIHdpZHRoX3R5cGUuCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7d2lkdGhfdHlwZX0iCisKK0BpdGVtIHdpZHRoLCB3CitDaGFuZ2UgYmFzcyB3aWR0aC4KK1N5bnRheCBmb3IgdGhlIGNvbW1hbmQgaXMgOiAiQHZhcnt3aWR0aH0iCisKK0BpdGVtIGdhaW4sIGcKK0NoYW5nZSBiYXNzIGdhaW4uCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7Z2Fpbn0iCiBAZW5kIHRhYmxlCiAKIEBzZWN0aW9uIGJpcXVhZApAQCAtMTc2OCwxMSArMjEyMCwzMCBAQAogQXBwbHkgYSBiaXF1YWQgSUlSIGZpbHRlciB3aXRoIHRoZSBnaXZlbiBjb2VmZmljaWVudHMuCiBXaGVyZSBAdmFye2IwfSwgQHZhcntiMX0sIEB2YXJ7YjJ9IGFuZCBAdmFye2EwfSwgQHZhcnthMX0sIEB2YXJ7YTJ9CiBhcmUgdGhlIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgY29lZmZpY2llbnRzIHJlc3BlY3RpdmVseS4KK2FuZCBAdmFye2NoYW5uZWxzfSwgQHZhcntjfSBzcGVjaWZ5IHdoaWNoIGNoYW5uZWxzIHRvIGZpbHRlciwgYnkgZGVmYXVsdCBhbGwKK2F2YWlsYWJsZSBhcmUgZmlsdGVyZWQuCisKK0BzdWJzZWN0aW9uIENvbW1hbmRzCisKK1RoaXMgZmlsdGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gYTAKK0BpdGVtIGExCitAaXRlbSBhMgorQGl0ZW0gYjAKK0BpdGVtIGIxCitAaXRlbSBiMgorQ2hhbmdlIGJpcXVhZCBwYXJhbWV0ZXIuCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7dmFsdWV9IgorQGVuZCB0YWJsZQogCiBAc2VjdGlvbiBiczJiCiBCYXVlciBzdGVyZW8gdG8gYmluYXVyYWwgdHJhbnNmb3JtYXRpb24sIHdoaWNoIGltcHJvdmVzIGhlYWRwaG9uZSBsaXN0ZW5pbmcgb2YKIHN0ZXJlbyBhdWRpbyByZWNvcmRzLgogCitUbyBlbmFibGUgY29tcGlsYXRpb24gb2YgdGhpcyBmaWx0ZXIgeW91IG5lZWQgdG8gY29uZmlndXJlIEZGbXBlZyB3aXRoCitAY29kZXstLWVuYWJsZS1saWJiczJifS4KKwogSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiBAdGFibGUgQG9wdGlvbgogCkBAIC0xODA1LDkgKzIxNzYsNiBAQAogCiBJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKIEB0YWJsZSBAb3B0aW9uCi1AaXRlbSBjaGFubmVsX2xheW91dAotVGhlIGNoYW5uZWwgbGF5b3V0IG9mIHRoZSBvdXRwdXQgc3RyZWFtLgotCiBAaXRlbSBtYXAKIE1hcCBjaGFubmVscyBmcm9tIGlucHV0IHRvIG91dHB1dC4gVGhlIGFyZ3VtZW50IGlzIGEgJ3wnLXNlcGFyYXRlZCBsaXN0IG9mCiBtYXBwaW5ncywgZWFjaCBpbiB0aGUgQGNvZGV7QHZhcntpbl9jaGFubmVsfS1AdmFye291dF9jaGFubmVsfX0gb3IKQEAgLTE4MTYsMTEgKzIxODQsMTggQEAKIEB2YXJ7b3V0X2NoYW5uZWx9IGlzIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgY2hhbm5lbCBvciBpdHMgaW5kZXggaW4gdGhlIG91dHB1dAogY2hhbm5lbCBsYXlvdXQuIElmIEB2YXJ7b3V0X2NoYW5uZWx9IGlzIG5vdCBnaXZlbiB0aGVuIGl0IGlzIGltcGxpY2l0bHkgYW4KIGluZGV4LCBzdGFydGluZyB3aXRoIHplcm8gYW5kIGluY3JlYXNpbmcgYnkgb25lIGZvciBlYWNoIG1hcHBpbmcuCisKK0BpdGVtIGNoYW5uZWxfbGF5b3V0CitUaGUgY2hhbm5lbCBsYXlvdXQgb2YgdGhlIG91dHB1dCBzdHJlYW0uCiBAZW5kIHRhYmxlCiAKIElmIG5vIG1hcHBpbmcgaXMgcHJlc2VudCwgdGhlIGZpbHRlciB3aWxsIGltcGxpY2l0bHkgbWFwIGlucHV0IGNoYW5uZWxzIHRvCiBvdXRwdXQgY2hhbm5lbHMsIHByZXNlcnZpbmcgaW5kaWNlcy4KIAorQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKK0BpdGVtCiBGb3IgZXhhbXBsZSwgYXNzdW1pbmcgYSA1LjErZG93bm1peCBpbnB1dCBNT1YgZmlsZSwKIEBleGFtcGxlCiBmZm1wZWcgLWkgaW4ubW92IC1maWx0ZXIgJ2NoYW5uZWxtYXA9bWFwPURMLUZMfERSLUZSJyBvdXQud2F2CkBAIC0xODI4LDEwICsyMjAzLDEyIEBACiB3aWxsIGNyZWF0ZSBhbiBvdXRwdXQgV0FWIGZpbGUgdGFnZ2VkIGFzIHN0ZXJlbyBmcm9tIHRoZSBkb3dubWl4IGNoYW5uZWxzIG9mCiB0aGUgaW5wdXQuCiAKK0BpdGVtCiBUbyBmaXggYSA1LjEgV0FWIGltcHJvcGVybHkgZW5jb2RlZCBpbiBBQUMncyBuYXRpdmUgY2hhbm5lbCBvcmRlcgogQGV4YW1wbGUKIGZmbXBlZyAtaSBpbi53YXYgLWZpbHRlciAnY2hhbm5lbG1hcD0xfDJ8MHw1fDN8NDo1LjEnIG91dC53YXYKIEBlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCiAKIEBzZWN0aW9uIGNoYW5uZWxzcGxpdAogCkBAIC0xODQxLDggKzIyMTgsMTcgQEAKIEB0YWJsZSBAb3B0aW9uCiBAaXRlbSBjaGFubmVsX2xheW91dAogVGhlIGNoYW5uZWwgbGF5b3V0IG9mIHRoZSBpbnB1dCBzdHJlYW0uIFRoZSBkZWZhdWx0IGlzICJzdGVyZW8iLgorQGl0ZW0gY2hhbm5lbHMKK0EgY2hhbm5lbCBsYXlvdXQgZGVzY3JpYmluZyB0aGUgY2hhbm5lbHMgdG8gYmUgZXh0cmFjdGVkIGFzIHNlcGFyYXRlIG91dHB1dCBzdHJlYW1zCitvciAiYWxsIiB0byBleHRyYWN0IGVhY2ggaW5wdXQgY2hhbm5lbCBhcyBhIHNlcGFyYXRlIHN0cmVhbS4gVGhlIGRlZmF1bHQgaXMgImFsbCIuCisKK0Nob29zaW5nIGNoYW5uZWxzIG5vdCBwcmVzZW50IGluIGNoYW5uZWwgbGF5b3V0IGluIHRoZSBpbnB1dCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4KIEBlbmQgdGFibGUKIAorQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKK0BpdGVtCiBGb3IgZXhhbXBsZSwgYXNzdW1pbmcgYSBzdGVyZW8gaW5wdXQgTVAzIGZpbGUsCiBAZXhhbXBsZQogZmZtcGVnIC1pIGluLm1wMyAtZmlsdGVyX2NvbXBsZXggY2hhbm5lbHNwbGl0IG91dC5ta3YKQEAgLTE4NTAsNiArMjIzNiw3IEBACiB3aWxsIGNyZWF0ZSBhbiBvdXRwdXQgTWF0cm9za2EgZmlsZSB3aXRoIHR3byBhdWRpbyBzdHJlYW1zLCBvbmUgY29udGFpbmluZyBvbmx5CiB0aGUgbGVmdCBjaGFubmVsIGFuZCB0aGUgb3RoZXIgdGhlIHJpZ2h0IGNoYW5uZWwuCiAKK0BpdGVtCiBTcGxpdCBhIDUuMSBXQVYgZmlsZSBpbnRvIHBlci1jaGFubmVsIGZpbGVzOgogQGV4YW1wbGUKIGZmbXBlZyAtaSBpbi53YXYgLWZpbHRlcl9jb21wbGV4CkBAIC0xODU5LDYgKzIyNDYsMTQgQEAKIHNpZGVfcmlnaHQud2F2CiBAZW5kIGV4YW1wbGUKIAorQGl0ZW0KK0V4dHJhY3Qgb25seSBMRkUgZnJvbSBhIDUuMSBXQVYgZmlsZToKK0BleGFtcGxlCitmZm1wZWcgLWkgaW4ud2F2IC1maWx0ZXJfY29tcGxleCAnY2hhbm5lbHNwbGl0PWNoYW5uZWxfbGF5b3V0PTUuMTpjaGFubmVscz1MRkVbTEZFXScKKy1tYXAgJ1tMRkVdJyBsZmUud2F2CitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAc2VjdGlvbiBjaG9ydXMKIEFkZCBhIGNob3J1cyBlZmZlY3QgdG8gdGhlIGF1ZGlvLgogCkBAIC0xOTQyLDcgKzIzMzcsNyBAQAogVGhlIGlucHV0IHZhbHVlcyBtdXN0IGJlIGluIHN0cmljdGx5IGluY3JlYXNpbmcgb3JkZXIgYnV0IHRoZSB0cmFuc2ZlciBmdW5jdGlvbgogZG9lcyBub3QgaGF2ZSB0byBiZSBtb25vdG9uaWNhbGx5IHJpc2luZy4gVGhlIHBvaW50IEBjb2RlezAvMH0gaXMgYXNzdW1lZCBidXQKIG1heSBiZSBvdmVycmlkZGVuIChieSBAY29kZXswL291dC1kQm59KS4gVHlwaWNhbCB2YWx1ZXMgZm9yIHRoZSB0cmFuc2ZlcgotZnVuY3Rpb24gYXJlIEBjb2Rley03MC8tNzB8LTYwLy0yMH0uCitmdW5jdGlvbiBhcmUgQGNvZGV7LTcwLy03MHwtNjAvLTIwfDEvMH0uCiAKIEBpdGVtIHNvZnQta25lZQogU2V0IHRoZSBjdXJ2ZSByYWRpdXMgaW4gZEIgZm9yIGFsbCBqb2ludHMuIEl0IGRlZmF1bHRzIHRvIDAuMDEuCkBAIC0yMTEwLDYgKzI1MDUsNDkgQEAKIERlZmF1bHQgaXMgMjAuCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIGNyb3NzZmVlZAorQXBwbHkgaGVhZHBob25lIGNyb3NzZmVlZCBmaWx0ZXIuCisKK0Nyb3NzZmVlZCBpcyB0aGUgcHJvY2VzcyBvZiBibGVuZGluZyB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgb2Ygc3RlcmVvCithdWRpbyByZWNvcmRpbmcuCitJdCBpcyBtYWlubHkgdXNlZCB0byByZWR1Y2UgZXh0cmVtZSBzdGVyZW8gc2VwYXJhdGlvbiBvZiBsb3cgZnJlcXVlbmNpZXMuCisKK1RoZSBpbnRlbnQgaXMgdG8gcHJvZHVjZSBtb3JlIHNwZWFrZXIgbGlrZSBzb3VuZCB0byB0aGUgbGlzdGVuZXIuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBzdHJlbmd0aAorU2V0IHN0cmVuZ3RoIG9mIGNyb3NzZmVlZC4gRGVmYXVsdCBpcyAwLjIuIEFsbG93ZWQgcmFuZ2UgaXMgZnJvbSAwIHRvIDEuCitUaGlzIHNldHMgZ2FpbiBvZiBsb3cgc2hlbGYgZmlsdGVyIGZvciBzaWRlIHBhcnQgb2Ygc3RlcmVvIGltYWdlLgorRGVmYXVsdCBpcyAtNmRCLiBNYXggYWxsb3dlZCBpcyAtMzBkYiB3aGVuIHN0cmVuZ3RoIGlzIHNldCB0byAxLgorCitAaXRlbSByYW5nZQorU2V0IHNvdW5kc3RhZ2Ugd2lkZW5lc3MuIERlZmF1bHQgaXMgMC41LiBBbGxvd2VkIHJhbmdlIGlzIGZyb20gMCB0byAxLgorVGhpcyBzZXRzIGN1dCBvZmYgZnJlcXVlbmN5IG9mIGxvdyBzaGVsZiBmaWx0ZXIuIERlZmF1bHQgaXMgY3V0IG9mZiBuZWFyCisxNTUwIEh6LiBXaXRoIHJhbmdlIHNldCB0byAxIGN1dCBvZmYgZnJlcXVlbmN5IGlzIHNldCB0byAyMTAwIEh6LgorCitAaXRlbSBsZXZlbF9pbgorU2V0IGlucHV0IGdhaW4uIERlZmF1bHQgaXMgMC45LgorCitAaXRlbSBsZXZlbF9vdXQKK1NldCBvdXRwdXQgZ2Fpbi4gRGVmYXVsdCBpcyAxLgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBjcnlzdGFsaXplcgorU2ltcGxlIGFsZ29yaXRobSB0byBleHBhbmQgYXVkaW8gZHluYW1pYyByYW5nZS4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGkKK1NldHMgdGhlIGludGVuc2l0eSBvZiBlZmZlY3QgKGRlZmF1bHQ6IDIuMCkuIE11c3QgYmUgaW4gcmFuZ2UgYmV0d2VlbiAwLjAKKyh1bmNoYW5nZWQgc291bmQpIHRvIDEwLjAgKG1heGltdW0gZWZmZWN0KS4KKworQGl0ZW0gYworRW5hYmxlIGNsaXBwaW5nLiBCeSBkZWZhdWx0IGlzIGVuYWJsZWQuCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIGRjc2hpZnQKIEFwcGx5IGEgREMgc2hpZnQgdG8gdGhlIGF1ZGlvLgogCkBAIC0yMTI4LDYgKzI1NjYsMjEgQEAKIHVzZWQgdG8gcHJldmVudCBjbGlwcGluZy4KIEBlbmQgdGFibGUKIAorQHNlY3Rpb24gZHJtZXRlcgorTWVhc3VyZSBhdWRpbyBkeW5hbWljIHJhbmdlLgorCitEUiB2YWx1ZXMgb2YgMTQgYW5kIGhpZ2hlciBpcyBmb3VuZCBpbiB2ZXJ5IGR5bmFtaWMgbWF0ZXJpYWwuIERSIG9mIDggdG8gMTMKK2lzIGZvdW5kIGluIHRyYW5zaXRpb24gbWF0ZXJpYWwuIEFuZCBhbnl0aGluZyBsZXNzIHRoYXQgOCBoYXZlIHZlcnkgcG9vciBkeW5hbWljcworYW5kIGlzIHZlcnkgY29tcHJlc3NlZC4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGxlbmd0aAorU2V0IHdpbmRvdyBsZW5ndGggaW4gc2Vjb25kcyB1c2VkIHRvIHNwbGl0IGF1ZGlvIGludG8gc2VnbWVudHMgb2YgZXF1YWwgbGVuZ3RoLgorRGVmYXVsdCBpcyAzIHNlY29uZHMuCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIGR5bmF1ZG5vcm0KIER5bmFtaWMgQXVkaW8gTm9ybWFsaXplci4KIApAQCAtMjMxMyw3ICsyNzY2LDcgQEAKIEBpdGVtIGZyZXF1ZW5jeSwgZgogU2V0IHRoZSBmaWx0ZXIncyBjZW50cmFsIGZyZXF1ZW5jeSBpbiBIei4KIAotQGl0ZW0gd2lkdGhfdHlwZQorQGl0ZW0gd2lkdGhfdHlwZSwgdAogU2V0IG1ldGhvZCB0byBzcGVjaWZ5IGJhbmQtd2lkdGggb2YgZmlsdGVyLgogQHRhYmxlIEBvcHRpb24KIEBpdGVtIGgKQEAgLTIzMjQsNiArMjc3Nyw4IEBACiBvY3RhdmUKIEBpdGVtIHMKIHNsb3BlCitAaXRlbSBrCitrSHoKIEBlbmQgdGFibGUKIAogQGl0ZW0gd2lkdGgsIHcKQEAgLTIzMzIsNiArMjc4Nyw5IEBACiBAaXRlbSBnYWluLCBnCiBTZXQgdGhlIHJlcXVpcmVkIGdhaW4gb3IgYXR0ZW51YXRpb24gaW4gZEIuCiBCZXdhcmUgb2YgY2xpcHBpbmcgd2hlbiB1c2luZyBhIHBvc2l0aXZlIGdhaW4uCisKK0BpdGVtIGNoYW5uZWxzLCBjCitTcGVjaWZ5IHdoaWNoIGNoYW5uZWxzIHRvIGZpbHRlciwgYnkgZGVmYXVsdCBhbGwgYXZhaWxhYmxlIGFyZSBmaWx0ZXJlZC4KIEBlbmQgdGFibGUKIAogQHN1YnNlY3Rpb24gRXhhbXBsZXMKQEAgLTIzMzksMjIgKzI3OTcsNDMgQEAKIEBpdGVtCiBBdHRlbnVhdGUgMTAgZEIgYXQgMTAwMCBIeiwgd2l0aCBhIGJhbmR3aWR0aCBvZiAyMDAgSHo6CiBAZXhhbXBsZQotZXF1YWxpemVyPWY9MTAwMDp3aWR0aF90eXBlPWg6d2lkdGg9MjAwOmc9LTEwCitlcXVhbGl6ZXI9Zj0xMDAwOnQ9aDp3aWR0aD0yMDA6Zz0tMTAKIEBlbmQgZXhhbXBsZQogCiBAaXRlbQogQXBwbHkgMiBkQiBnYWluIGF0IDEwMDAgSHogd2l0aCBRIDEgYW5kIGF0dGVudWF0ZSA1IGRCIGF0IDEwMCBIeiB3aXRoIFEgMjoKIEBleGFtcGxlCi1lcXVhbGl6ZXI9Zj0xMDAwOndpZHRoX3R5cGU9cTp3aWR0aD0xOmc9MixlcXVhbGl6ZXI9Zj0xMDA6d2lkdGhfdHlwZT1xOndpZHRoPTI6Zz0tNQorZXF1YWxpemVyPWY9MTAwMDp0PXE6dz0xOmc9MixlcXVhbGl6ZXI9Zj0xMDA6dD1xOnc9MjpnPS01CiBAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCitAc3Vic2VjdGlvbiBDb21tYW5kcworCitUaGlzIGZpbHRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIGZyZXF1ZW5jeSwgZgorQ2hhbmdlIGVxdWFsaXplciBmcmVxdWVuY3kuCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7ZnJlcXVlbmN5fSIKKworQGl0ZW0gd2lkdGhfdHlwZSwgdAorQ2hhbmdlIGVxdWFsaXplciB3aWR0aF90eXBlLgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye3dpZHRoX3R5cGV9IgorCitAaXRlbSB3aWR0aCwgdworQ2hhbmdlIGVxdWFsaXplciB3aWR0aC4KK1N5bnRheCBmb3IgdGhlIGNvbW1hbmQgaXMgOiAiQHZhcnt3aWR0aH0iCisKK0BpdGVtIGdhaW4sIGcKK0NoYW5nZSBlcXVhbGl6ZXIgZ2Fpbi4KK1N5bnRheCBmb3IgdGhlIGNvbW1hbmQgaXMgOiAiQHZhcntnYWlufSIKK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gZXh0cmFzdGVyZW8KIAogTGluZWFybHkgaW5jcmVhc2VzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgd2hpY2gKIGFkZHMgc29tZSBzb3J0IG9mICJsaXZlIiBlZmZlY3QgdG8gcGxheWJhY2suCiAKLVRoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbjoKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CiAKIEB0YWJsZSBAb3B0aW9uCiBAaXRlbSBtCkBAIC0yMzY2LDYgKzI4NDUsMTUwIEBACiBFbmFibGUgY2xpcHBpbmcuIEJ5IGRlZmF1bHQgaXMgZW5hYmxlZC4KIEBlbmQgdGFibGUKIAorQHNlY3Rpb24gZmlyZXF1YWxpemVyCitBcHBseSBGSVIgRXF1YWxpemF0aW9uIHVzaW5nIGFyYml0cmFyeSBmcmVxdWVuY3kgcmVzcG9uc2UuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbjoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGdhaW4KK1NldCBnYWluIGN1cnZlIGVxdWF0aW9uIChpbiBkQikuIFRoZSBleHByZXNzaW9uIGNhbiBjb250YWluIHZhcmlhYmxlczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBmCit0aGUgZXZhbHVhdGVkIGZyZXF1ZW5jeQorQGl0ZW0gc3IKK3NhbXBsZSByYXRlCitAaXRlbSBjaAorY2hhbm5lbCBudW1iZXIsIHNldCB0byAwIHdoZW4gbXVsdGljaGFubmVscyBldmFsdWF0aW9uIGlzIGRpc2FibGVkCitAaXRlbSBjaGlkCitjaGFubmVsIGlkLCBzZWUgbGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgsIHNldCB0byB0aGUgZmlyc3QgY2hhbm5lbCBpZCB3aGVuCittdWx0aWNoYW5uZWxzIGV2YWx1YXRpb24gaXMgZGlzYWJsZWQKK0BpdGVtIGNocworbnVtYmVyIG9mIGNoYW5uZWxzCitAaXRlbSBjaGxheW91dAorY2hhbm5lbF9sYXlvdXQsIHNlZSBsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaAorCitAZW5kIHRhYmxlCithbmQgZnVuY3Rpb25zOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIGdhaW5faW50ZXJwb2xhdGUoZikKK2ludGVycG9sYXRlIGdhaW4gb24gZnJlcXVlbmN5IGYgYmFzZWQgb24gZ2Fpbl9lbnRyeQorQGl0ZW0gY3ViaWNfaW50ZXJwb2xhdGUoZikKK3NhbWUgYXMgZ2Fpbl9pbnRlcnBvbGF0ZSwgYnV0IHNtb290aGVyCitAZW5kIHRhYmxlCitUaGlzIG9wdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSBhcyBjb21tYW5kLiBEZWZhdWx0IGlzIEBjb2Rle2dhaW5faW50ZXJwb2xhdGUoZil9LgorCitAaXRlbSBnYWluX2VudHJ5CitTZXQgZ2FpbiBlbnRyeSBmb3IgZ2Fpbl9pbnRlcnBvbGF0ZSBmdW5jdGlvbi4gVGhlIGV4cHJlc3Npb24gY2FuCitjb250YWluIGZ1bmN0aW9uczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBlbnRyeShmLCBnKQorc3RvcmUgZ2FpbiBlbnRyeSBhdCBmcmVxdWVuY3kgZiB3aXRoIHZhbHVlIGcKK0BlbmQgdGFibGUKK1RoaXMgb3B0aW9uIGlzIGFsc28gYXZhaWxhYmxlIGFzIGNvbW1hbmQuCisKK0BpdGVtIGRlbGF5CitTZXQgZmlsdGVyIGRlbGF5IGluIHNlY29uZHMuIEhpZ2hlciB2YWx1ZSBtZWFucyBtb3JlIGFjY3VyYXRlLgorRGVmYXVsdCBpcyBAY29kZXswLjAxfS4KKworQGl0ZW0gYWNjdXJhY3kKK1NldCBmaWx0ZXIgYWNjdXJhY3kgaW4gSHouIExvd2VyIHZhbHVlIG1lYW5zIG1vcmUgYWNjdXJhdGUuCitEZWZhdWx0IGlzIEBjb2RlezV9LgorCitAaXRlbSB3ZnVuYworU2V0IHdpbmRvdyBmdW5jdGlvbi4gQWNjZXB0YWJsZSB2YWx1ZXMgYXJlOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIHJlY3Rhbmd1bGFyCityZWN0YW5ndWxhciB3aW5kb3csIHVzZWZ1bCB3aGVuIGdhaW4gY3VydmUgaXMgYWxyZWFkeSBzbW9vdGgKK0BpdGVtIGhhbm4KK2hhbm4gd2luZG93IChkZWZhdWx0KQorQGl0ZW0gaGFtbWluZworaGFtbWluZyB3aW5kb3cKK0BpdGVtIGJsYWNrbWFuCitibGFja21hbiB3aW5kb3cKK0BpdGVtIG51dHRhbGwzCiszLXRlcm1zIGNvbnRpbnVvdXMgMXN0IGRlcml2YXRpdmUgbnV0dGFsbCB3aW5kb3cKK0BpdGVtIG1udXR0YWxsMworbWluaW11bSAzLXRlcm1zIGRpc2NvbnRpbnVvdXMgbnV0dGFsbCB3aW5kb3cKK0BpdGVtIG51dHRhbGwKKzQtdGVybXMgY29udGludW91cyAxc3QgZGVyaXZhdGl2ZSBudXR0YWxsIHdpbmRvdworQGl0ZW0gYm51dHRhbGwKK21pbmltdW0gNC10ZXJtcyBkaXNjb250aW51b3VzIG51dHRhbGwgKGJsYWNrbWFuLW51dHRhbGwpIHdpbmRvdworQGl0ZW0gYmhhcnJpcworYmxhY2ttYW4taGFycmlzIHdpbmRvdworQGl0ZW0gdHVrZXkKK3R1a2V5IHdpbmRvdworQGVuZCB0YWJsZQorCitAaXRlbSBmaXhlZAorSWYgZW5hYmxlZCwgdXNlIGZpeGVkIG51bWJlciBvZiBhdWRpbyBzYW1wbGVzLiBUaGlzIGltcHJvdmVzIHNwZWVkIHdoZW4KK2ZpbHRlcmluZyB3aXRoIGxhcmdlIGRlbGF5LiBEZWZhdWx0IGlzIGRpc2FibGVkLgorCitAaXRlbSBtdWx0aQorRW5hYmxlIG11bHRpY2hhbm5lbHMgZXZhbHVhdGlvbiBvbiBnYWluLiBEZWZhdWx0IGlzIGRpc2FibGVkLgorCitAaXRlbSB6ZXJvX3BoYXNlCitFbmFibGUgemVybyBwaGFzZSBtb2RlIGJ5IHN1YnRyYWN0aW5nIHRpbWVzdGFtcCB0byBjb21wZW5zYXRlIGRlbGF5LgorRGVmYXVsdCBpcyBkaXNhYmxlZC4KKworQGl0ZW0gc2NhbGUKK1NldCBzY2FsZSB1c2VkIGJ5IGdhaW4uIEFjY2VwdGFibGUgdmFsdWVzIGFyZToKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBsaW5saW4KK2xpbmVhciBmcmVxdWVuY3ksIGxpbmVhciBnYWluCitAaXRlbSBsaW5sb2cKK2xpbmVhciBmcmVxdWVuY3ksIGxvZ2FyaXRobWljIChpbiBkQikgZ2FpbiAoZGVmYXVsdCkKK0BpdGVtIGxvZ2xpbgorbG9nYXJpdGhtaWMgKGluIG9jdGF2ZSBzY2FsZSB3aGVyZSAyMCBIeiBpcyAwKSBmcmVxdWVuY3ksIGxpbmVhciBnYWluCitAaXRlbSBsb2dsb2cKK2xvZ2FyaXRobWljIGZyZXF1ZW5jeSwgbG9nYXJpdGhtaWMgZ2FpbgorQGVuZCB0YWJsZQorCitAaXRlbSBkdW1wZmlsZQorU2V0IGZpbGUgZm9yIGR1bXBpbmcsIHN1aXRhYmxlIGZvciBnbnVwbG90LgorCitAaXRlbSBkdW1wc2NhbGUKK1NldCBzY2FsZSBmb3IgZHVtcGZpbGUuIEFjY2VwdGFibGUgdmFsdWVzIGFyZSBzYW1lIHdpdGggc2NhbGUgb3B0aW9uLgorRGVmYXVsdCBpcyBsaW5sb2cuCisKK0BpdGVtIGZmdDIKK0VuYWJsZSAyLWNoYW5uZWwgY29udm9sdXRpb24gdXNpbmcgY29tcGxleCBGRlQuIFRoaXMgaW1wcm92ZXMgc3BlZWQgc2lnbmlmaWNhbnRseS4KK0RlZmF1bHQgaXMgZGlzYWJsZWQuCisKK0BpdGVtIG1pbl9waGFzZQorRW5hYmxlIG1pbmltdW0gcGhhc2UgaW1wdWxzZSByZXNwb25zZS4gRGVmYXVsdCBpcyBkaXNhYmxlZC4KK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKK0BpdGVtaXplCitAaXRlbQorbG93cGFzcyBhdCAxMDAwIEh6OgorQGV4YW1wbGUKK2ZpcmVxdWFsaXplcj1nYWluPSdpZihsdChmLDEwMDApLCAwLCAtSU5GKScKK0BlbmQgZXhhbXBsZQorQGl0ZW0KK2xvd3Bhc3MgYXQgMTAwMCBIeiB3aXRoIGdhaW5fZW50cnk6CitAZXhhbXBsZQorZmlyZXF1YWxpemVyPWdhaW5fZW50cnk9J2VudHJ5KDEwMDAsMCk7IGVudHJ5KDEwMDEsIC1JTkYpJworQGVuZCBleGFtcGxlCitAaXRlbQorY3VzdG9tIGVxdWFsaXphdGlvbjoKK0BleGFtcGxlCitmaXJlcXVhbGl6ZXI9Z2Fpbl9lbnRyeT0nZW50cnkoMTAwLDApOyBlbnRyeSg0MDAsIC00KTsgZW50cnkoMTAwMCwgLTYpOyBlbnRyeSgyMDAwLCAwKScKK0BlbmQgZXhhbXBsZQorQGl0ZW0KK2hpZ2hlciBkZWxheSB3aXRoIHplcm8gcGhhc2UgdG8gY29tcGVuc2F0ZSBkZWxheToKK0BleGFtcGxlCitmaXJlcXVhbGl6ZXI9ZGVsYXk9MC4xOmZpeGVkPW9uOnplcm9fcGhhc2U9b24KK0BlbmQgZXhhbXBsZQorQGl0ZW0KK2xvd3Bhc3Mgb24gbGVmdCBjaGFubmVsLCBoaWdocGFzcyBvbiByaWdodCBjaGFubmVsOgorQGV4YW1wbGUKK2ZpcmVxdWFsaXplcj1nYWluPSdpZihlcShjaGlkLDEpLCBnYWluX2ludGVycG9sYXRlKGYpLCBpZihlcShjaGlkLDIpLCBnYWluX2ludGVycG9sYXRlKDFlNitmKSwgMCkpJworOmdhaW5fZW50cnk9J2VudHJ5KDEwMDAsIDApOyBlbnRyeSgxMDAxLC1JTkYpOyBlbnRyeSgxZTYrMTAwMCwwKSc6bXVsdGk9b24KK0BlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCisKIEBzZWN0aW9uIGZsYW5nZXIKIEFwcGx5IGEgZmxhbmdpbmcgZWZmZWN0IHRvIHRoZSBhdWRpby4KIApAQCAtMjM3Niw3ICsyOTk5LDcgQEAKIFNldCBiYXNlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gUmFuZ2UgZnJvbSAwIHRvIDMwLiBEZWZhdWx0IHZhbHVlIGlzIDAuCiAKIEBpdGVtIGRlcHRoCi1TZXQgYWRkZWQgc3dlcCBkZWxheSBpbiBtaWxsaXNlY29uZHMuIFJhbmdlIGZyb20gMCB0byAxMC4gRGVmYXVsdCB2YWx1ZSBpcyAyLgorU2V0IGFkZGVkIHN3ZWVwIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4gUmFuZ2UgZnJvbSAwIHRvIDEwLiBEZWZhdWx0IHZhbHVlIGlzIDIuCiAKIEBpdGVtIHJlZ2VuCiBTZXQgcGVyY2VudGFnZSByZWdlbmVyYXRpb24gKGRlbGF5ZWQgc2lnbmFsIGZlZWRiYWNrKS4gUmFuZ2UgZnJvbSAtOTUgdG8gOTUuCkBAIC0yNDAyLDYgKzMwMjUsMTk0IEBACiBEZWZhdWx0IGlzIEB2YXJ7bGluZWFyfS4KIEBlbmQgdGFibGUKIAorQHNlY3Rpb24gaGFhcworQXBwbHkgSGFhcyBlZmZlY3QgdG8gYXVkaW8uCisKK05vdGUgdGhhdCB0aGlzIG1ha2VzIG1vc3Qgc2Vuc2UgdG8gYXBwbHkgb24gbW9ubyBzaWduYWxzLgorV2l0aCB0aGlzIGZpbHRlciBhcHBsaWVkIHRvIG1vbm8gc2lnbmFscyBpdCBnaXZlIHNvbWUgZGlyZWN0aW9uYWxpdHkgYW5kCitzdHJldGNoZXMgaXRzIHN0ZXJlbyBpbWFnZS4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGxldmVsX2luCitTZXQgaW5wdXQgbGV2ZWwuIEJ5IGRlZmF1bHQgaXMgQHZhcnsxfSwgb3IgMGRCCisKK0BpdGVtIGxldmVsX291dAorU2V0IG91dHB1dCBsZXZlbC4gQnkgZGVmYXVsdCBpcyBAdmFyezF9LCBvciAwZEIuCisKK0BpdGVtIHNpZGVfZ2FpbgorU2V0IGdhaW4gYXBwbGllZCB0byBzaWRlIHBhcnQgb2Ygc2lnbmFsLiBCeSBkZWZhdWx0IGlzIEB2YXJ7MX0uCisKK0BpdGVtIG1pZGRsZV9zb3VyY2UKK1NldCBraW5kIG9mIG1pZGRsZSBzb3VyY2UuIENhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBsZWZ0CitQaWNrIGxlZnQgY2hhbm5lbC4KKworQGl0ZW0gcmlnaHQKK1BpY2sgcmlnaHQgY2hhbm5lbC4KKworQGl0ZW0gbWlkCitQaWNrIG1pZGRsZSBwYXJ0IHNpZ25hbCBvZiBzdGVyZW8gaW1hZ2UuCisKK0BpdGVtIHNpZGUKK1BpY2sgc2lkZSBwYXJ0IHNpZ25hbCBvZiBzdGVyZW8gaW1hZ2UuCitAZW5kIHRhYmxlCisKK0BpdGVtIG1pZGRsZV9waGFzZQorQ2hhbmdlIG1pZGRsZSBwaGFzZS4gQnkgZGVmYXVsdCBpcyBkaXNhYmxlZC4KKworQGl0ZW0gbGVmdF9kZWxheQorU2V0IGxlZnQgY2hhbm5lbCBkZWxheS4gQnkgZGVmYXVsdCBpcyBAdmFyezIuMDV9IG1pbGxpc2Vjb25kcy4KKworQGl0ZW0gbGVmdF9iYWxhbmNlCitTZXQgbGVmdCBjaGFubmVsIGJhbGFuY2UuIEJ5IGRlZmF1bHQgaXMgQHZhcnstMX0uCisKK0BpdGVtIGxlZnRfZ2FpbgorU2V0IGxlZnQgY2hhbm5lbCBnYWluLiBCeSBkZWZhdWx0IGlzIEB2YXJ7MX0uCisKK0BpdGVtIGxlZnRfcGhhc2UKK0NoYW5nZSBsZWZ0IHBoYXNlLiBCeSBkZWZhdWx0IGlzIGRpc2FibGVkLgorCitAaXRlbSByaWdodF9kZWxheQorU2V0IHJpZ2h0IGNoYW5uZWwgZGVsYXkuIEJ5IGRlZmF1bHRzIGlzIEB2YXJ7Mi4xMn0gbWlsbGlzZWNvbmRzLgorCitAaXRlbSByaWdodF9iYWxhbmNlCitTZXQgcmlnaHQgY2hhbm5lbCBiYWxhbmNlLiBCeSBkZWZhdWx0IGlzIEB2YXJ7MX0uCisKK0BpdGVtIHJpZ2h0X2dhaW4KK1NldCByaWdodCBjaGFubmVsIGdhaW4uIEJ5IGRlZmF1bHQgaXMgQHZhcnsxfS4KKworQGl0ZW0gcmlnaHRfcGhhc2UKK0NoYW5nZSByaWdodCBwaGFzZS4gQnkgZGVmYXVsdCBpcyBlbmFibGVkLgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBoZGNkCisKK0RlY29kZXMgSGlnaCBEZWZpbml0aW9uIENvbXBhdGlibGUgRGlnaXRhbCAoSERDRCkgZGF0YS4gQSAxNi1iaXQgUENNIHN0cmVhbSB3aXRoCitlbWJlZGRlZCBIRENEIGNvZGVzIGlzIGV4cGFuZGVkIGludG8gYSAyMC1iaXQgUENNIHN0cmVhbS4KKworVGhlIGZpbHRlciBzdXBwb3J0cyB0aGUgUGVhayBFeHRlbmQgYW5kIExvdy1sZXZlbCBHYWluIEFkanVzdG1lbnQgZmVhdHVyZXMKK29mIEhEQ0QsIGFuZCBkZXRlY3RzIHRoZSBUcmFuc2llbnQgRmlsdGVyIGZsYWcuCisKK0BleGFtcGxlCitmZm1wZWcgLWkgSERDRDE2LmZsYWMgLWFmIGhkY2QgT1VUMjQuZmxhYworQGVuZCBleGFtcGxlCisKK1doZW4gdXNpbmcgdGhlIGZpbHRlciB3aXRoIHdhdiwgbm90ZSB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3Igd2F2IGlzIDE2LWJpdCwKK3NvIHRoZSByZXN1bHRpbmcgMjAtYml0IHN0cmVhbSB3aWxsIGJlIHRydW5jYXRlZCBiYWNrIHRvIDE2LWJpdC4gVXNlIHNvbWV0aGluZworbGlrZSBAY29tbWFuZHstYWNvZGVjIHBjbV9zMjRsZX0gYWZ0ZXIgdGhlIGZpbHRlciB0byBnZXQgMjQtYml0IFBDTSBvdXRwdXQuCitAZXhhbXBsZQorZmZtcGVnIC1pIEhEQ0QxNi53YXYgLWFmIGhkY2QgT1VUMTYud2F2CitmZm1wZWcgLWkgSERDRDE2LndhdiAtYWYgaGRjZCAtYzphIHBjbV9zMjRsZSBPVVQyNC53YXYKK0BlbmQgZXhhbXBsZQorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZGlzYWJsZV9hdXRvY29udmVydAorRGlzYWJsZSBhbnkgYXV0b21hdGljIGZvcm1hdCBjb252ZXJzaW9uIG9yIHJlc2FtcGxpbmcgaW4gdGhlIGZpbHRlciBncmFwaC4KKworQGl0ZW0gcHJvY2Vzc19zdGVyZW8KK1Byb2Nlc3MgdGhlIHN0ZXJlbyBjaGFubmVscyB0b2dldGhlci4gSWYgdGFyZ2V0X2dhaW4gZG9lcyBub3QgbWF0Y2ggYmV0d2VlbgorY2hhbm5lbHMsIGNvbnNpZGVyIGl0IGludmFsaWQgYW5kIHVzZSB0aGUgbGFzdCB2YWxpZCB0YXJnZXRfZ2Fpbi4KKworQGl0ZW0gY2R0X21zCitTZXQgdGhlIGNvZGUgZGV0ZWN0IHRpbWVyIHBlcmlvZCBpbiBtcy4KKworQGl0ZW0gZm9yY2VfcGUKK0Fsd2F5cyBleHRlbmQgcGVha3MgYWJvdmUgLTNkQkZTIGV2ZW4gaWYgUEUgaXNuJ3Qgc2lnbmFsZWQuCisKK0BpdGVtIGFuYWx5emVfbW9kZQorUmVwbGFjZSBhdWRpbyB3aXRoIGEgc29saWQgdG9uZSBhbmQgYWRqdXN0IHRoZSBhbXBsaXR1ZGUgdG8gc2lnbmFsIHNvbWUKK3NwZWNpZmljIGFzcGVjdCBvZiB0aGUgZGVjb2RpbmcgcHJvY2Vzcy4gVGhlIG91dHB1dCBmaWxlIGNhbiBiZSBsb2FkZWQgaW4KK2FuIGF1ZGlvIGVkaXRvciBhbG9uZ3NpZGUgdGhlIG9yaWdpbmFsIHRvIGFpZCBhbmFseXNpcy4KKworQGNvZGV7YW5hbHl6ZV9tb2RlPXBlOmZvcmNlX3BlPXRydWV9IGNhbiBiZSB1c2VkIHRvIHNlZSBhbGwgc2FtcGxlcyBhYm92ZSB0aGUgUEUgbGV2ZWwuCisKK01vZGVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0gMCwgb2ZmCitEaXNhYmxlZAorQGl0ZW0gMSwgbGxlCitHYWluIGFkanVzdG1lbnQgbGV2ZWwgYXQgZWFjaCBzYW1wbGUKK0BpdGVtIDIsIHBlCitTYW1wbGVzIHdoZXJlIHBlYWsgZXh0ZW5kIG9jY3VycworQGl0ZW0gMywgY2R0CitTYW1wbGVzIHdoZXJlIHRoZSBjb2RlIGRldGVjdCB0aW1lciBpcyBhY3RpdmUKK0BpdGVtIDQsIHRnbQorU2FtcGxlcyB3aGVyZSB0aGUgdGFyZ2V0IGdhaW4gZG9lcyBub3QgbWF0Y2ggYmV0d2VlbiBjaGFubmVscworQGVuZCB0YWJsZQorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBoZWFkcGhvbmUKKworQXBwbHkgaGVhZC1yZWxhdGVkIHRyYW5zZmVyIGZ1bmN0aW9ucyAoSFJURnMpIHRvIGNyZWF0ZSB2aXJ0dWFsCitsb3Vkc3BlYWtlcnMgYXJvdW5kIHRoZSB1c2VyIGZvciBiaW5hdXJhbCBsaXN0ZW5pbmcgdmlhIGhlYWRwaG9uZXMuCitUaGUgSFJJUnMgYXJlIHByb3ZpZGVkIHZpYSBhZGRpdGlvbmFsIHN0cmVhbXMsIGZvciBlYWNoIGNoYW5uZWwKK29uZSBzdGVyZW8gaW5wdXQgc3RyZWFtIGlzIG5lZWRlZC4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIG1hcAorU2V0IG1hcHBpbmcgb2YgaW5wdXQgc3RyZWFtcyBmb3IgY29udm9sdXRpb24uCitUaGUgYXJndW1lbnQgaXMgYSAnfCctc2VwYXJhdGVkIGxpc3Qgb2YgY2hhbm5lbCBuYW1lcyBpbiBvcmRlciBhcyB0aGV5CithcmUgZ2l2ZW4gYXMgYWRkaXRpb25hbCBzdHJlYW0gaW5wdXRzIGZvciBmaWx0ZXIuCitUaGlzIGFsc28gc3BlY2lmeSBudW1iZXIgb2YgaW5wdXQgc3RyZWFtcy4gTnVtYmVyIG9mIGlucHV0IHN0cmVhbXMKK211c3QgYmUgbm90IGxlc3MgdGhhbiBudW1iZXIgb2YgY2hhbm5lbHMgaW4gZmlyc3Qgc3RyZWFtIHBsdXMgb25lLgorCitAaXRlbSBnYWluCitTZXQgZ2FpbiBhcHBsaWVkIHRvIGF1ZGlvLiBWYWx1ZSBpcyBpbiBkQi4gRGVmYXVsdCBpcyAwLgorCitAaXRlbSB0eXBlCitTZXQgcHJvY2Vzc2luZyB0eXBlLiBDYW4gYmUgQHZhcnt0aW1lfSBvciBAdmFye2ZyZXF9LiBAdmFye3RpbWV9IGlzCitwcm9jZXNzaW5nIGF1ZGlvIGluIHRpbWUgZG9tYWluIHdoaWNoIGlzIHNsb3cuCitAdmFye2ZyZXF9IGlzIHByb2Nlc3NpbmcgYXVkaW8gaW4gZnJlcXVlbmN5IGRvbWFpbiB3aGljaCBpcyBmYXN0LgorRGVmYXVsdCBpcyBAdmFye2ZyZXF9LgorCitAaXRlbSBsZmUKK1NldCBjdXN0b20gZ2FpbiBmb3IgTEZFIGNoYW5uZWxzLiBWYWx1ZSBpcyBpbiBkQi4gRGVmYXVsdCBpcyAwLgorCitAaXRlbSBzaXplCitTZXQgc2l6ZSBvZiBmcmFtZSBpbiBudW1iZXIgb2Ygc2FtcGxlcyB3aGljaCB3aWxsIGJlIHByb2Nlc3NlZCBhdCBvbmNlLgorRGVmYXVsdCB2YWx1ZSBpcyBAdmFyezEwMjR9LiBBbGxvd2VkIHJhbmdlIGlzIGZyb20gMTAyNCB0byA5NjAwMC4KKworQGl0ZW0gaHJpcgorU2V0IGZvcm1hdCBvZiBocmlyIHN0cmVhbS4KK0RlZmF1bHQgdmFsdWUgaXMgQHZhcntzdGVyZW99LiBBbHRlcm5hdGl2ZSB2YWx1ZSBpcyBAdmFye211bHRpY2h9LgorSWYgdmFsdWUgaXMgc2V0IHRvIEB2YXJ7c3RlcmVvfSwgbnVtYmVyIG9mIGFkZGl0aW9uYWwgc3RyZWFtcyBzaG91bGQKK2JlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGluIGZpcnN0IGlucHV0IHN0cmVhbS4KK0Fsc28gZWFjaCBhZGRpdGlvbmFsIHN0cmVhbSBzaG91bGQgaGF2ZSBzdGVyZW8gbnVtYmVyIG9mIGNoYW5uZWxzLgorSWYgdmFsdWUgaXMgc2V0IHRvIEB2YXJ7bXVsdGljaH0sIG51bWJlciBvZiBhZGRpdGlvbmFsIHN0cmVhbXMgc2hvdWxkCitiZSBleGFjdGx5IG9uZS4gQWxzbyBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgb2YgYWRkaXRpb25hbCBzdHJlYW0KK3Nob3VsZCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gdHdpY2UgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIGZpcnN0IGlucHV0CitzdHJlYW0uCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK0BpdGVtaXplCitAaXRlbQorRnVsbCBleGFtcGxlIHVzaW5nIHdhdiBmaWxlcyBhcyBjb2VmZmljaWVudHMgd2l0aCBhbW92aWUgZmlsdGVycyBmb3IgNy4xIGRvd25taXgsCitlYWNoIGFtb3ZpZSBmaWx0ZXIgdXNlIHN0ZXJlbyBmaWxlIHdpdGggSVIgY29lZmZpY2llbnRzIGFzIGlucHV0LgorVGhlIGZpbGVzIGdpdmUgY29lZmZpY2llbnRzIGZvciBlYWNoIHBvc2l0aW9uIG9mIHZpcnR1YWwgbG91ZHNwZWFrZXI6CitAZXhhbXBsZQorZmZtcGVnIC1pIGlucHV0LndhdiAtbGF2ZmktY29tcGxleCAiYW1vdmllPWF6aV8yNzBfZWxlXzBfREZDLndhdltzcl0sYW1vdmllPWF6aV85MF9lbGVfMF9ERkMud2F2W3NsXSxhbW92aWU9YXppXzIyNV9lbGVfMF9ERkMud2F2W2JyXSxhbW92aWU9YXppXzEzNV9lbGVfMF9ERkMud2F2W2JsXSxhbW92aWU9YXppXzBfZWxlXzBfREZDLndhdixhc3BsaXRbZmNdW2xmZV0sYW1vdmllPWF6aV8zNV9lbGVfMF9ERkMud2F2W2ZsXSxhbW92aWU9YXppXzMyNV9lbGVfMF9ERkMud2F2W2ZyXSxbYTowXVtmbF1bZnJdW2ZjXVtsZmVdW2JsXVticl1bc2xdW3NyXWhlYWRwaG9uZT1GTHxGUnxGQ3xMRkV8Qkx8QlJ8U0x8U1IiCitvdXRwdXQud2F2CitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK0Z1bGwgZXhhbXBsZSB1c2luZyB3YXYgZmlsZXMgYXMgY29lZmZpY2llbnRzIHdpdGggYW1vdmllIGZpbHRlcnMgZm9yIDcuMSBkb3dubWl4LAorYnV0IG5vdyBpbiBAdmFye211bHRpY2h9IEB2YXJ7aHJpcn0gZm9ybWF0LgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBpbnB1dC53YXYgLWxhdmZpLWNvbXBsZXggImFtb3ZpZT1taW5wLndhdltocmlyc10sW2E6MF1baHJpcnNdaGVhZHBob25lPW1hcD1GTHxGUnxGQ3xMRkV8Qkx8QlJ8U0x8U1I6aHJpcj1tdWx0aWNoIgorb3V0cHV0LndhdgorQGVuZCBleGFtcGxlCitAZW5kIGl0ZW1pemUKKwogQHNlY3Rpb24gaGlnaHBhc3MKIAogQXBwbHkgYSBoaWdoLXBhc3MgZmlsdGVyIHdpdGggM2RCIHBvaW50IGZyZXF1ZW5jeS4KQEAgLTI0MTcsNyArMzIyOCw3IEBACiBAaXRlbSBwb2xlcywgcAogU2V0IG51bWJlciBvZiBwb2xlcy4gRGVmYXVsdCBpcyAyLgogCi1AaXRlbSB3aWR0aF90eXBlCitAaXRlbSB3aWR0aF90eXBlLCB0CiBTZXQgbWV0aG9kIHRvIHNwZWNpZnkgYmFuZC13aWR0aCBvZiBmaWx0ZXIuCiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gaApAQCAtMjQyOCwxMiArMzIzOSwzNCBAQAogb2N0YXZlCiBAaXRlbSBzCiBzbG9wZQorQGl0ZW0gawora0h6CiBAZW5kIHRhYmxlCiAKIEBpdGVtIHdpZHRoLCB3CiBTcGVjaWZ5IHRoZSBiYW5kLXdpZHRoIG9mIGEgZmlsdGVyIGluIHdpZHRoX3R5cGUgdW5pdHMuCiBBcHBsaWVzIG9ubHkgdG8gZG91YmxlLXBvbGUgZmlsdGVyLgogVGhlIGRlZmF1bHQgaXMgMC43MDdxIGFuZCBnaXZlcyBhIEJ1dHRlcndvcnRoIHJlc3BvbnNlLgorCitAaXRlbSBjaGFubmVscywgYworU3BlY2lmeSB3aGljaCBjaGFubmVscyB0byBmaWx0ZXIsIGJ5IGRlZmF1bHQgYWxsIGF2YWlsYWJsZSBhcmUgZmlsdGVyZWQuCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIENvbW1hbmRzCisKK1RoaXMgZmlsdGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZnJlcXVlbmN5LCBmCitDaGFuZ2UgaGlnaHBhc3MgZnJlcXVlbmN5LgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye2ZyZXF1ZW5jeX0iCisKK0BpdGVtIHdpZHRoX3R5cGUsIHQKK0NoYW5nZSBoaWdocGFzcyB3aWR0aF90eXBlLgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye3dpZHRoX3R5cGV9IgorCitAaXRlbSB3aWR0aCwgdworQ2hhbmdlIGhpZ2hwYXNzIHdpZHRoLgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye3dpZHRofSIKIEBlbmQgdGFibGUKIAogQHNlY3Rpb24gam9pbgpAQCAtMjU5MCw2ICszNDIzLDMxIEBACiBAZXhhbXBsZQogbGFkc3BhPW1iZXFfMTE5NzptYmVxOi0yNHwtMjR8LTI0fDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwCiBAZW5kIGV4YW1wbGUKKworQGl0ZW0KK1JlZHVjZSBzdGVyZW8gaW1hZ2UgdXNpbmcgQGNvZGV7TmFycm93ZXJ9IGZyb20gdGhlIEBjb2Rle0MqIEF1ZGlvIFBsdWdpbiBTdWl0ZX0KKyhDQVBTKSBsaWJyYXJ5OgorQGV4YW1wbGUKK2xhZHNwYT1jYXBzOk5hcnJvd2VyCitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK0Fub3RoZXIgd2hpdGUgbm9pc2UsIG5vdyB1c2luZyBAY29kZXtDKiBBdWRpbyBQbHVnaW4gU3VpdGV9IChDQVBTKSBsaWJyYXJ5OgorQGV4YW1wbGUKK2xhZHNwYT1jYXBzOldoaXRlOi4yCitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK1NvbWUgZnJhY3RhbCBub2lzZSwgdXNpbmcgQGNvZGV7QyogQXVkaW8gUGx1Z2luIFN1aXRlfSAoQ0FQUykgbGlicmFyeToKK0BleGFtcGxlCitsYWRzcGE9Y2FwczpGcmFjdGFsOmM9YzE9MQorQGVuZCBleGFtcGxlCisKK0BpdGVtCitEeW5hbWljIHZvbHVtZSBub3JtYWxpemF0aW9uIHVzaW5nIEBjb2Rle1ZMZXZlbH0gcGx1Z2luOgorQGV4YW1wbGUKK2xhZHNwYT12bGV2ZWwtbGFkc3BhOnZsZXZlbF9tb25vCitAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCiBAc3Vic2VjdGlvbiBDb21tYW5kcwpAQCAtMjYwMiw2ICszNDYwLDY3IEBACiBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIG5vdCB2YWxpZCwgaXQgaXMgaWdub3JlZCBhbmQgcHJpb3Igb25lIGlzIGtlcHQuCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIGxvdWRub3JtCisKK0VCVSBSMTI4IGxvdWRuZXNzIG5vcm1hbGl6YXRpb24uIEluY2x1ZGVzIGJvdGggZHluYW1pYyBhbmQgbGluZWFyIG5vcm1hbGl6YXRpb24gbW9kZXMuCitTdXBwb3J0IGZvciBib3RoIHNpbmdsZSBwYXNzIChsaXZlc3RyZWFtcywgZmlsZXMpIGFuZCBkb3VibGUgcGFzcyAoZmlsZXMpIG1vZGVzLgorVGhpcyBhbGdvcml0aG0gY2FuIHRhcmdldCBJTCwgTFJBLCBhbmQgbWF4aW11bSB0cnVlIHBlYWsuIFRvIGFjY3VyYXRlbHkgZGV0ZWN0IHRydWUgcGVha3MsCit0aGUgYXVkaW8gc3RyZWFtIHdpbGwgYmUgdXBzYW1wbGVkIHRvIDE5MiBrSHogdW5sZXNzIHRoZSBub3JtYWxpemF0aW9uIG1vZGUgaXMgbGluZWFyLgorVXNlIHRoZSBAY29kZXstYXJ9IG9wdGlvbiBvciBAY29kZXthcmVzYW1wbGV9IGZpbHRlciB0byBleHBsaWNpdGx5IHNldCBhbiBvdXRwdXQgc2FtcGxlIHJhdGUuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBJLCBpCitTZXQgaW50ZWdyYXRlZCBsb3VkbmVzcyB0YXJnZXQuCitSYW5nZSBpcyAtNzAuMCAtIC01LjAuIERlZmF1bHQgdmFsdWUgaXMgLTI0LjAuCisKK0BpdGVtIExSQSwgbHJhCitTZXQgbG91ZG5lc3MgcmFuZ2UgdGFyZ2V0LgorUmFuZ2UgaXMgMS4wIC0gMjAuMC4gRGVmYXVsdCB2YWx1ZSBpcyA3LjAuCisKK0BpdGVtIFRQLCB0cAorU2V0IG1heGltdW0gdHJ1ZSBwZWFrLgorUmFuZ2UgaXMgLTkuMCAtICswLjAuIERlZmF1bHQgdmFsdWUgaXMgLTIuMC4KKworQGl0ZW0gbWVhc3VyZWRfSSwgbWVhc3VyZWRfaQorTWVhc3VyZWQgSUwgb2YgaW5wdXQgZmlsZS4KK1JhbmdlIGlzIC05OS4wIC0gKzAuMC4KKworQGl0ZW0gbWVhc3VyZWRfTFJBLCBtZWFzdXJlZF9scmEKK01lYXN1cmVkIExSQSBvZiBpbnB1dCBmaWxlLgorUmFuZ2UgaXMgIDAuMCAtIDk5LjAuCisKK0BpdGVtIG1lYXN1cmVkX1RQLCBtZWFzdXJlZF90cAorTWVhc3VyZWQgdHJ1ZSBwZWFrIG9mIGlucHV0IGZpbGUuCitSYW5nZSBpcyAgLTk5LjAgLSArOTkuMC4KKworQGl0ZW0gbWVhc3VyZWRfdGhyZXNoCitNZWFzdXJlZCB0aHJlc2hvbGQgb2YgaW5wdXQgZmlsZS4KK1JhbmdlIGlzIC05OS4wIC0gKzAuMC4KKworQGl0ZW0gb2Zmc2V0CitTZXQgb2Zmc2V0IGdhaW4uIEdhaW4gaXMgYXBwbGllZCBiZWZvcmUgdGhlIHRydWUtcGVhayBsaW1pdGVyLgorUmFuZ2UgaXMgIC05OS4wIC0gKzk5LjAuIERlZmF1bHQgaXMgKzAuMC4KKworQGl0ZW0gbGluZWFyCitOb3JtYWxpemUgbGluZWFybHkgaWYgcG9zc2libGUuCittZWFzdXJlZF9JLCBtZWFzdXJlZF9MUkEsIG1lYXN1cmVkX1RQLCBhbmQgbWVhc3VyZWRfdGhyZXNoIG11c3QgYWxzbwordG8gYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvIHVzZSB0aGlzIG1vZGUuCitPcHRpb25zIGFyZSB0cnVlIG9yIGZhbHNlLiBEZWZhdWx0IGlzIHRydWUuCisKK0BpdGVtIGR1YWxfbW9ubworVHJlYXQgbW9ubyBpbnB1dCBmaWxlcyBhcyAiZHVhbC1tb25vIi4gSWYgYSBtb25vIGZpbGUgaXMgaW50ZW5kZWQgZm9yIHBsYXliYWNrCitvbiBhIHN0ZXJlbyBzeXN0ZW0sIGl0cyBFQlUgUjEyOCBtZWFzdXJlbWVudCB3aWxsIGJlIHBlcmNlcHR1YWxseSBpbmNvcnJlY3QuCitJZiBzZXQgdG8gQGNvZGV7dHJ1ZX0sIHRoaXMgb3B0aW9uIHdpbGwgY29tcGVuc2F0ZSBmb3IgdGhpcyBlZmZlY3QuCitNdWx0aS1jaGFubmVsIGlucHV0IGZpbGVzIGFyZSBub3QgYWZmZWN0ZWQgYnkgdGhpcyBvcHRpb24uCitPcHRpb25zIGFyZSB0cnVlIG9yIGZhbHNlLiBEZWZhdWx0IGlzIGZhbHNlLgorCitAaXRlbSBwcmludF9mb3JtYXQKK1NldCBwcmludCBmb3JtYXQgZm9yIHN0YXRzLiBPcHRpb25zIGFyZSBzdW1tYXJ5LCBqc29uLCBvciBub25lLgorRGVmYXVsdCB2YWx1ZSBpcyBub25lLgorQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBsb3dwYXNzCiAKIEFwcGx5IGEgbG93LXBhc3MgZmlsdGVyIHdpdGggM2RCIHBvaW50IGZyZXF1ZW5jeS4KQEAgLTI2MTcsNyArMzUzNiw3IEBACiBAaXRlbSBwb2xlcywgcAogU2V0IG51bWJlciBvZiBwb2xlcy4gRGVmYXVsdCBpcyAyLgogCi1AaXRlbSB3aWR0aF90eXBlCitAaXRlbSB3aWR0aF90eXBlLCB0CiBTZXQgbWV0aG9kIHRvIHNwZWNpZnkgYmFuZC13aWR0aCBvZiBmaWx0ZXIuCiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gaApAQCAtMjYyOCwxMiArMzU0NywxMTggQEAKIG9jdGF2ZQogQGl0ZW0gcwogc2xvcGUKK0BpdGVtIGsKK2tIegogQGVuZCB0YWJsZQogCiBAaXRlbSB3aWR0aCwgdwogU3BlY2lmeSB0aGUgYmFuZC13aWR0aCBvZiBhIGZpbHRlciBpbiB3aWR0aF90eXBlIHVuaXRzLgogQXBwbGllcyBvbmx5IHRvIGRvdWJsZS1wb2xlIGZpbHRlci4KIFRoZSBkZWZhdWx0IGlzIDAuNzA3cSBhbmQgZ2l2ZXMgYSBCdXR0ZXJ3b3J0aCByZXNwb25zZS4KKworQGl0ZW0gY2hhbm5lbHMsIGMKK1NwZWNpZnkgd2hpY2ggY2hhbm5lbHMgdG8gZmlsdGVyLCBieSBkZWZhdWx0IGFsbCBhdmFpbGFibGUgYXJlIGZpbHRlcmVkLgorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBFeGFtcGxlcworQGl0ZW1pemUKK0BpdGVtCitMb3dwYXNzIG9ubHkgTEZFIGNoYW5uZWwsIGl0IExGRSBpcyBub3QgcHJlc2VudCBpdCBkb2VzIG5vdGhpbmc6CitAZXhhbXBsZQorbG93cGFzcz1jPUxGRQorQGVuZCBleGFtcGxlCitAZW5kIGl0ZW1pemUKKworQHN1YnNlY3Rpb24gQ29tbWFuZHMKKworVGhpcyBmaWx0ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBmcmVxdWVuY3ksIGYKK0NoYW5nZSBsb3dwYXNzIGZyZXF1ZW5jeS4KK1N5bnRheCBmb3IgdGhlIGNvbW1hbmQgaXMgOiAiQHZhcntmcmVxdWVuY3l9IgorCitAaXRlbSB3aWR0aF90eXBlLCB0CitDaGFuZ2UgbG93cGFzcyB3aWR0aF90eXBlLgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye3dpZHRoX3R5cGV9IgorCitAaXRlbSB3aWR0aCwgdworQ2hhbmdlIGxvd3Bhc3Mgd2lkdGguCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7d2lkdGh9IgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBsdjIKKworTG9hZCBhIExWMiAoTEFEU1BBIFZlcnNpb24gMikgcGx1Z2luLgorCitUbyBlbmFibGUgY29tcGlsYXRpb24gb2YgdGhpcyBmaWx0ZXIgeW91IG5lZWQgdG8gY29uZmlndXJlIEZGbXBlZyB3aXRoCitAY29kZXstLWVuYWJsZS1sdjJ9LgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcGx1Z2luLCBwCitTcGVjaWZpZXMgdGhlIHBsdWdpbiBVUkkuIFlvdSBtYXkgbmVlZCB0byBlc2NhcGUgJzonLgorCitAaXRlbSBjb250cm9scywgYworU2V0IHRoZSAnfCcgc2VwYXJhdGVkIGxpc3Qgb2YgY29udHJvbHMgd2hpY2ggYXJlIHplcm8gb3IgbW9yZSBmbG9hdGluZyBwb2ludAordmFsdWVzIHRoYXQgZGV0ZXJtaW5lIHRoZSBiZWhhdmlvciBvZiB0aGUgbG9hZGVkIHBsdWdpbiAoZm9yIGV4YW1wbGUgZGVsYXksCit0aHJlc2hvbGQgb3IgZ2FpbikuCitJZiBAb3B0aW9ue2NvbnRyb2xzfSBpcyBzZXQgdG8gQGNvZGV7aGVscH0sIGFsbCBhdmFpbGFibGUgY29udHJvbHMgYW5kCit0aGVpciB2YWxpZCByYW5nZXMgYXJlIHByaW50ZWQuCisKK0BpdGVtIHNhbXBsZV9yYXRlLCBzCitTcGVjaWZ5IHRoZSBzYW1wbGUgcmF0ZSwgZGVmYXVsdCB0byA0NDEwMC4gT25seSB1c2VkIGlmIHBsdWdpbiBoYXZlCit6ZXJvIGlucHV0cy4KKworQGl0ZW0gbmJfc2FtcGxlcywgbgorU2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCBwZXIgZWFjaCBvdXRwdXQgZnJhbWUsIGRlZmF1bHQKK2lzIDEwMjQuIE9ubHkgdXNlZCBpZiBwbHVnaW4gaGF2ZSB6ZXJvIGlucHV0cy4KKworQGl0ZW0gZHVyYXRpb24sIGQKK1NldCB0aGUgbWluaW11bSBkdXJhdGlvbiBvZiB0aGUgc291cmNlZCBhdWRpby4gU2VlCitAcmVme3RpbWUgZHVyYXRpb24gc3ludGF4LCx0aGUgVGltZSBkdXJhdGlvbiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMoMSkgbWFudWFsLGZmbXBlZy11dGlsc30KK2ZvciB0aGUgYWNjZXB0ZWQgc3ludGF4LgorTm90ZSB0aGF0IHRoZSByZXN1bHRpbmcgZHVyYXRpb24gbWF5IGJlIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGR1cmF0aW9uLAorYXMgdGhlIGdlbmVyYXRlZCBhdWRpbyBpcyBhbHdheXMgY3V0IGF0IHRoZSBlbmQgb2YgYSBjb21wbGV0ZSBmcmFtZS4KK0lmIG5vdCBzcGVjaWZpZWQsIG9yIHRoZSBleHByZXNzZWQgZHVyYXRpb24gaXMgbmVnYXRpdmUsIHRoZSBhdWRpbyBpcworc3VwcG9zZWQgdG8gYmUgZ2VuZXJhdGVkIGZvcmV2ZXIuCitPbmx5IHVzZWQgaWYgcGx1Z2luIGhhdmUgemVybyBpbnB1dHMuCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK0BpdGVtaXplCitAaXRlbQorQXBwbHkgYmFzcyBlbmhhbmNlciBwbHVnaW4gZnJvbSBDYWxmOgorQGV4YW1wbGUKK2x2Mj1wPWh0dHBcXFxcOi8vY2FsZi5zb3VyY2Vmb3JnZS5uZXQvcGx1Z2lucy9CYXNzRW5oYW5jZXI6Yz1hbW91bnQ9MgorQGVuZCBleGFtcGxlCisKK0BpdGVtCitBcHBseSB2aW55bCBwbHVnaW4gZnJvbSBDYWxmOgorQGV4YW1wbGUKK2x2Mj1wPWh0dHBcXFxcOi8vY2FsZi5zb3VyY2Vmb3JnZS5uZXQvcGx1Z2lucy9WaW55bDpjPWRyb25lPTAuMnxhZ2luZz0wLjUKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorQXBwbHkgYml0IGNydXNoZXIgcGx1Z2luIGZyb20gQXJ0eUZYOgorQGV4YW1wbGUKK2x2Mj1wPWh0dHBcXFxcOi8vd3d3Lm9wZW5hdnByb2R1Y3Rpb25zLmNvbS9hcnR5ZngjYml0dGE6Yz1jcnVzaD0wLjMKK0BlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCisKK0BzZWN0aW9uIG1jb21wYW5kCitNdWx0aWJhbmQgQ29tcHJlc3Mgb3IgZXhwYW5kIHRoZSBhdWRpbydzIGR5bmFtaWMgcmFuZ2UuCisKK1RoZSBpbnB1dCBhdWRpbyBpcyBkaXZpZGVkIGludG8gYmFuZHMgdXNpbmcgNHRoIG9yZGVyIExpbmt3aXR6LVJpbGV5IElJUnMuCitUaGlzIGlzIGFraW4gdG8gdGhlIGNyb3Nzb3ZlciBvZiBhIGxvdWRzcGVha2VyLCBhbmQgcmVzdWx0cyBpbiBmbGF0IGZyZXF1ZW5jeQorcmVzcG9uc2Ugd2hlbiBhYnNlbnQgY29tcGFuZGVyIGFjdGlvbi4KKworSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBhcmdzCitUaGlzIG9wdGlvbiBzeW50YXggaXM6CithdHRhY2ssZGVjYXksW2F0dGFjayxkZWNheS4uXSBzb2Z0LWtuZWUgcG9pbnRzIGNyb3Nzb3Zlcl9mcmVxdWVuY3kgW2RlbGF5IFtpbml0aWFsX3ZvbHVtZSBbZ2Fpbl1dXSB8IGF0dGFjayxkZWNheSAuLi4KK0ZvciBleHBsYW5hdGlvbiBvZiBlYWNoIGl0ZW0gcmVmZXIgdG8gY29tcGFuZCBmaWx0ZXIgZG9jdW1lbnRhdGlvbi4KIEBlbmQgdGFibGUKIAogQGFuY2hvcntwYW59CkBAIC0yNjU0LDcgKzM2NzksNyBAQAogCiBAaXRlbSBvdXRkZWYKIG91dHB1dCBjaGFubmVsIHNwZWNpZmljYXRpb24sIG9mIHRoZSBmb3JtOgotIkB2YXJ7b3V0X25hbWV9PVtAdmFye2dhaW59Kl1AdmFye2luX25hbWV9WytbQHZhcntnYWlufSpdQHZhcntpbl9uYW1lfS4uLl0iCisiQHZhcntvdXRfbmFtZX09W0B2YXJ7Z2Fpbn0qXUB2YXJ7aW5fbmFtZX1bKCstKVtAdmFye2dhaW59Kl1AdmFye2luX25hbWV9Li4uXSIKIAogQGl0ZW0gb3V0X25hbWUKIG91dHB1dCBjaGFubmVsIHRvIGRlZmluZSwgZWl0aGVyIGEgY2hhbm5lbCBuYW1lIChGTCwgRlIsIGV0Yy4pIG9yIGEgY2hhbm5lbApAQCAtMjg1NCw3ICszODc5LDcgQEAKIAogQGl0ZW0gbWFrZXVwCiBTZXQgdGhlIGFtb3VudCBieSBob3cgbXVjaCBzaWduYWwgd2lsbCBiZSBhbXBsaWZpZWQgYWZ0ZXIgcHJvY2Vzc2luZy4KLURlZmF1bHQgaXMgMi4gUmFuZ2UgaXMgZnJvbSAxIGFuZCA2NC4KK0RlZmF1bHQgaXMgMS4gUmFuZ2UgaXMgZnJvbSAxIHRvIDY0LgogCiBAaXRlbSBrbmVlCiBDdXJ2ZSB0aGUgc2hhcnAga25lZSBhcm91bmQgdGhlIHRocmVzaG9sZCB0byBlbnRlciBnYWluIHJlZHVjdGlvbiBtb3JlIHNvZnRseS4KQEAgLTMwNDEsNyArNDA2Niw3IEBACiBvciBhbXBsaXR1ZGUgcmF0aW8uIERlZmF1bHQgdmFsdWUgaXMgQGNvZGV7MH0uCiAKIEBpdGVtIGxlYXZlX3NpbGVuY2UKLVRoaXMgaW5kaWNhdGUgdGhhdCBAdmFye3N0b3BfZHVyYXRpb259IGxlbmd0aCBvZiBhdWRpbyBzaG91bGQgYmUgbGVmdCBpbnRhY3QKK1RoaXMgaW5kaWNhdGVzIHRoYXQgQHZhcntzdG9wX2R1cmF0aW9ufSBsZW5ndGggb2YgYXVkaW8gc2hvdWxkIGJlIGxlZnQgaW50YWN0CiBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcGVyaW9kIG9mIHNpbGVuY2UuCiBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIGxvbmcgcGF1c2VzIGJldHdlZW4gd29yZHMgYnV0IGRvIG5vdCB3YW50CiB0byByZW1vdmUgdGhlIHBhdXNlcyBjb21wbGV0ZWx5LiBEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezB9LgpAQCAtMzA2OCw3ICs0MDkzLDcgQEAKIEBlbmQgZXhhbXBsZQogCiBAaXRlbQotVHJpbSBhbGwgc2lsZW5jZSBlbmNvdW50ZXJlZCBmcm9tIGJlZ2luaW5nIHRvIGVuZCB3aGVyZSB0aGVyZSBpcyBtb3JlIHRoYW4gMQorVHJpbSBhbGwgc2lsZW5jZSBlbmNvdW50ZXJlZCBmcm9tIGJlZ2lubmluZyB0byBlbmQgd2hlcmUgdGhlcmUgaXMgbW9yZSB0aGFuIDEKIHNlY29uZCBvZiBzaWxlbmNlIGluIGF1ZGlvOgogQGV4YW1wbGUKIHNpbGVuY2VyZW1vdmU9MDowOjA6LTE6MTotOTBkQgpAQCAtMzA4NSw3ICs0MTEwLDcgQEAKIEF1c3RyaWFuIEFjYWRlbXkgb2YgU2NpZW5jZXMuCiAKIFRvIGVuYWJsZSBjb21waWxhdGlvbiBvZiB0aGlzIGZpbHRlciB5b3UgbmVlZCB0byBjb25maWd1cmUgRkZtcGVnIHdpdGgKLUBjb2Rley0tZW5hYmxlLW5ldGNkZn0uCitAY29kZXstLWVuYWJsZS1saWJteXNvZmF9LgogCiBUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgogCkBAIC0zMTA4LDExICs0MTMzLDQ3IEBACiAKIEBpdGVtIHR5cGUKIFNldCBwcm9jZXNzaW5nIHR5cGUuIENhbiBiZSBAdmFye3RpbWV9IG9yIEB2YXJ7ZnJlcX0uIEB2YXJ7dGltZX0gaXMKLXByb2Nlc3NpbmcgYXVkaW8gaW4gdGltZSBkb21haW4gd2hpY2ggaXMgc2xvdyBidXQgZ2l2ZXMgaGlnaCBxdWFsaXR5IG91dHB1dC4KLUB2YXJ7ZnJlcX0gaXMgcHJvY2Vzc2luZyBhdWRpbyBpbiBmcmVxdWVuY3kgZG9tYWluIHdoaWNoIGlzIGZhc3QgYnV0IGdpdmVzCi1tZWRpb2NyZSBvdXRwdXQuIERlZmF1bHQgaXMgQHZhcntmcmVxfS4KK3Byb2Nlc3NpbmcgYXVkaW8gaW4gdGltZSBkb21haW4gd2hpY2ggaXMgc2xvdy4KK0B2YXJ7ZnJlcX0gaXMgcHJvY2Vzc2luZyBhdWRpbyBpbiBmcmVxdWVuY3kgZG9tYWluIHdoaWNoIGlzIGZhc3QuCitEZWZhdWx0IGlzIEB2YXJ7ZnJlcX0uCisKK0BpdGVtIHNwZWFrZXJzCitTZXQgY3VzdG9tIHBvc2l0aW9ucyBvZiB2aXJ0dWFsIGxvdWRzcGVha2Vycy4gU3ludGF4IGZvciB0aGlzIG9wdGlvbiBpczoKKzxDSD4gPEFaSU0+IDxFTEVWPlt8PENIPiA8QVpJTT4gPEVMRVY+fC4uLl0uCitFYWNoIHZpcnR1YWwgbG91ZHNwZWFrZXIgaXMgZGVzY3JpYmVkIHdpdGggc2hvcnQgY2hhbm5lbCBuYW1lIGZvbGxvd2luZyB3aXRoCithemltdXRoIGFuZCBlbGV2YXRpb24gaW4gZGVncmVlcy4KK0VhY2ggdmlydHVhbCBsb3Vkc3BlYWtlciBkZXNjcmlwdGlvbiBpcyBzZXBhcmF0ZWQgYnkgJ3wnLgorRm9yIGV4YW1wbGUgdG8gb3ZlcnJpZGUgZnJvbnQgbGVmdCBhbmQgZnJvbnQgcmlnaHQgY2hhbm5lbCBwb3NpdGlvbnMgdXNlOgorJ3NwZWFrZXJzPUZMIDQ1IDE1fEZSIDM0NSAxNScuCitEZXNjcmlwdGlvbnMgd2l0aCB1bnJlY29nbmlzZWQgY2hhbm5lbCBuYW1lcyBhcmUgaWdub3JlZC4KKworQGl0ZW0gbGZlZ2FpbgorU2V0IGN1c3RvbSBnYWluIGZvciBMRkUgY2hhbm5lbHMuIFZhbHVlIGlzIGluIGRCLiBEZWZhdWx0IGlzIDAuCiBAZW5kIHRhYmxlCiAKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK0BpdGVtaXplCitAaXRlbQorVXNpbmcgQ2x1YkZyaXR6NiBzb2ZhIGZpbGU6CitAZXhhbXBsZQorc29mYWxpemVyPXNvZmE9L3BhdGgvdG8vQ2x1YkZyaXR6Ni5zb2ZhOnR5cGU9ZnJlcTpyYWRpdXM9MQorQGVuZCBleGFtcGxlCisKK0BpdGVtCitVc2luZyBDbHViRnJpdHoxMiBzb2ZhIGZpbGUgYW5kIGJpZ2dlciByYWRpdXMgd2l0aCBzbWFsbCByb3RhdGlvbjoKK0BleGFtcGxlCitzb2ZhbGl6ZXI9c29mYT0vcGF0aC90by9DbHViRnJpdHoxMi5zb2ZhOnR5cGU9ZnJlcTpyYWRpdXM9Mjpyb3RhdGlvbj01CitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK1NpbWlsYXIgYXMgYWJvdmUgYnV0IHdpdGggY3VzdG9tIHNwZWFrZXIgcG9zaXRpb25zIGZvciBmcm9udCBsZWZ0LCBmcm9udCByaWdodCwgYmFjayBsZWZ0IGFuZCBiYWNrIHJpZ2h0CithbmQgYWxzbyB3aXRoIGN1c3RvbSBnYWluOgorQGV4YW1wbGUKKyJzb2ZhbGl6ZXI9c29mYT0vcGF0aC90by9DbHViRnJpdHo2LnNvZmE6dHlwZT1mcmVxOnJhZGl1cz0yOnNwZWFrZXJzPUZMIDQ1fEZSIDMxNXxCTCAxMzV8QlIgMjI1OmdhaW49MjgiCitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAc2VjdGlvbiBzdGVyZW90b29scwogCiBUaGlzIGZpbHRlciBoYXMgc29tZSBoYW5keSB1dGlsaXRpZXMgdG8gbWFuYWdlIHN0ZXJlbyBzaWduYWxzLCBmb3IgY29udmVydGluZwpAQCAtMzE3OCw2ICs0MjM5LDEyIEBACiAKIEBpdGVtIGxyPnJsCiBMZWZ0L1JpZ2h0IHRvIFJpZ2h0L0xlZnQuCisKK0BpdGVtIG1zPmxsCitNaWQvU2lkZSB0byBMZWZ0L0xlZnQuCisKK0BpdGVtIG1zPnJyCitNaWQvU2lkZSB0byBSaWdodC9SaWdodC4KIEBlbmQgdGFibGUKIAogQGl0ZW0gc2xldgpAQCAtMzIwOCw3ICs0Mjc1LDQwIEBACiAKIEBpdGVtIHBoYXNlCiBTZXQgdGhlIHN0ZXJlbyBwaGFzZSBpbiBkZWdyZWVzLiBEZWZhdWx0IGlzIDAuIEFsbG93ZWQgcmFuZ2UgaXMgZnJvbSAwIHRvIDM2MC4KKworQGl0ZW0gYm1vZGVfaW4sIGJtb2RlX291dAorU2V0IGJhbGFuY2UgbW9kZSBmb3IgYmFsYW5jZV9pbi9iYWxhbmNlX291dCBvcHRpb24uCisKK0NhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBiYWxhbmNlCitDbGFzc2ljIGJhbGFuY2UgbW9kZS4gQXR0ZW51YXRlIG9uZSBjaGFubmVsIGF0IHRpbWUuCitHYWluIGlzIHJhaXNlZCB1cCB0byAxLgorCitAaXRlbSBhbXBsaXR1ZGUKK1NpbWlsYXIgYXMgY2xhc3NpYyBtb2RlIGFib3ZlIGJ1dCBnYWluIGlzIHJhaXNlZCB1cCB0byAyLgorCitAaXRlbSBwb3dlcgorRXF1YWwgcG93ZXIgZGlzdHJpYnV0aW9uLCBmcm9tIC02ZEIgdG8gKzZkQiByYW5nZS4KIEBlbmQgdGFibGUKK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKK0BpdGVtCitBcHBseSBrYXJhb2tlIGxpa2UgZWZmZWN0OgorQGV4YW1wbGUKK3N0ZXJlb3Rvb2xzPW1sZXY9MC4wMTU2MjUKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorQ29udmVydCBNL1Mgc2lnbmFsIHRvIEwvUjoKK0BleGFtcGxlCisic3RlcmVvdG9vbHM9bW9kZT1tcz5sciIKK0BlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCiAKIEBzZWN0aW9uIHN0ZXJlb3dpZGVuCiAKQEAgLTMyMzcsNiArNDMzNyw5NyBAQAogU2V0IGxldmVsIG9mIGlucHV0IHNpZ25hbCBvZiBvcmlnaW5hbCBjaGFubmVsLiBEZWZhdWx0IGlzIDAuOC4KIEBlbmQgdGFibGUKIAorQHNlY3Rpb24gc3VwZXJlcXVhbGl6ZXIKK0FwcGx5IDE4IGJhbmQgZXF1YWxpemVyLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIDFiCitTZXQgNjVIeiBiYW5kIGdhaW4uCitAaXRlbSAyYgorU2V0IDkySHogYmFuZCBnYWluLgorQGl0ZW0gM2IKK1NldCAxMzFIeiBiYW5kIGdhaW4uCitAaXRlbSA0YgorU2V0IDE4NUh6IGJhbmQgZ2Fpbi4KK0BpdGVtIDViCitTZXQgMjYySHogYmFuZCBnYWluLgorQGl0ZW0gNmIKK1NldCAzNzBIeiBiYW5kIGdhaW4uCitAaXRlbSA3YgorU2V0IDUyM0h6IGJhbmQgZ2Fpbi4KK0BpdGVtIDhiCitTZXQgNzQwSHogYmFuZCBnYWluLgorQGl0ZW0gOWIKK1NldCAxMDQ3SHogYmFuZCBnYWluLgorQGl0ZW0gMTBiCitTZXQgMTQ4MEh6IGJhbmQgZ2Fpbi4KK0BpdGVtIDExYgorU2V0IDIwOTNIeiBiYW5kIGdhaW4uCitAaXRlbSAxMmIKK1NldCAyOTYwSHogYmFuZCBnYWluLgorQGl0ZW0gMTNiCitTZXQgNDE4Nkh6IGJhbmQgZ2Fpbi4KK0BpdGVtIDE0YgorU2V0IDU5MjBIeiBiYW5kIGdhaW4uCitAaXRlbSAxNWIKK1NldCA4MzcySHogYmFuZCBnYWluLgorQGl0ZW0gMTZiCitTZXQgMTE4NDBIeiBiYW5kIGdhaW4uCitAaXRlbSAxN2IKK1NldCAxNjc0NEh6IGJhbmQgZ2Fpbi4KK0BpdGVtIDE4YgorU2V0IDIwMDAwSHogYmFuZCBnYWluLgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBzdXJyb3VuZAorQXBwbHkgYXVkaW8gc3Vycm91bmQgdXBtaXggZmlsdGVyLgorCitUaGlzIGZpbHRlciBhbGxvd3MgdG8gcHJvZHVjZSBtdWx0aWNoYW5uZWwgb3V0cHV0IGZyb20gYXVkaW8gc3RyZWFtLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gY2hsX291dAorU2V0IG91dHB1dCBjaGFubmVsIGxheW91dC4gQnkgZGVmYXVsdCwgdGhpcyBpcyBAdmFyezUuMX0uCisKK1NlZSBAcmVme2NoYW5uZWwgbGF5b3V0IHN5bnRheCwsdGhlIENoYW5uZWwgTGF5b3V0IHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscygxKSBtYW51YWwsZmZtcGVnLXV0aWxzfQorZm9yIHRoZSByZXF1aXJlZCBzeW50YXguCisKK0BpdGVtIGNobF9pbgorU2V0IGlucHV0IGNoYW5uZWwgbGF5b3V0LiBCeSBkZWZhdWx0LCB0aGlzIGlzIEB2YXJ7c3RlcmVvfS4KKworU2VlIEByZWZ7Y2hhbm5lbCBsYXlvdXQgc3ludGF4LCx0aGUgQ2hhbm5lbCBMYXlvdXQgc2VjdGlvbiBpbiB0aGUgZmZtcGVnLXV0aWxzKDEpIG1hbnVhbCxmZm1wZWctdXRpbHN9Citmb3IgdGhlIHJlcXVpcmVkIHN5bnRheC4KKworQGl0ZW0gbGV2ZWxfaW4KK1NldCBpbnB1dCB2b2x1bWUgbGV2ZWwuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgQHZhcnsxfS4KKworQGl0ZW0gbGV2ZWxfb3V0CitTZXQgb3V0cHV0IHZvbHVtZSBsZXZlbC4gQnkgZGVmYXVsdCwgdGhpcyBpcyBAdmFyezF9LgorCitAaXRlbSBsZmUKK0VuYWJsZSBMRkUgY2hhbm5lbCBvdXRwdXQgaWYgb3V0cHV0IGNoYW5uZWwgbGF5b3V0IGhhcyBpdC4gQnkgZGVmYXVsdCwgdGhpcyBpcyBlbmFibGVkLgorCitAaXRlbSBsZmVfbG93CitTZXQgTEZFIGxvdyBjdXQgb2ZmIGZyZXF1ZW5jeS4gQnkgZGVmYXVsdCwgdGhpcyBpcyBAdmFyezEyOH0gSHouCisKK0BpdGVtIGxmZV9oaWdoCitTZXQgTEZFIGhpZ2ggY3V0IG9mZiBmcmVxdWVuY3kuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgQHZhcnsyNTZ9IEh6LgorCitAaXRlbSBmY19pbgorU2V0IGZyb250IGNlbnRlciBpbnB1dCB2b2x1bWUuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgQHZhcnsxfS4KKworQGl0ZW0gZmNfb3V0CitTZXQgZnJvbnQgY2VudGVyIG91dHB1dCB2b2x1bWUuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgQHZhcnsxfS4KKworQGl0ZW0gbGZlX2luCitTZXQgTEZFIGlucHV0IHZvbHVtZS4gQnkgZGVmYXVsdCwgdGhpcyBpcyBAdmFyezF9LgorCitAaXRlbSBsZmVfb3V0CitTZXQgTEZFIG91dHB1dCB2b2x1bWUuIEJ5IGRlZmF1bHQsIHRoaXMgaXMgQHZhcnsxfS4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gdHJlYmxlCiAKIEJvb3N0IG9yIGN1dCB0cmVibGUgKHVwcGVyKSBmcmVxdWVuY2llcyBvZiB0aGUgYXVkaW8gdXNpbmcgYSB0d28tcG9sZQpAQCAtMzI1Niw3ICs0NDQ3LDcgQEAKIHRvIGV4dGVuZCBvciByZWR1Y2UgdGhlIGZyZXF1ZW5jeSByYW5nZSB0byBiZSBib29zdGVkIG9yIGN1dC4KIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEBjb2RlezMwMDB9IEh6LgogCi1AaXRlbSB3aWR0aF90eXBlCitAaXRlbSB3aWR0aF90eXBlLCB0CiBTZXQgbWV0aG9kIHRvIHNwZWNpZnkgYmFuZC13aWR0aCBvZiBmaWx0ZXIuCiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gaApAQCAtMzI2NywxMCArNDQ1OCwzNiBAQAogb2N0YXZlCiBAaXRlbSBzCiBzbG9wZQorQGl0ZW0gawora0h6CiBAZW5kIHRhYmxlCiAKIEBpdGVtIHdpZHRoLCB3CiBEZXRlcm1pbmUgaG93IHN0ZWVwIGlzIHRoZSBmaWx0ZXIncyBzaGVsZiB0cmFuc2l0aW9uLgorCitAaXRlbSBjaGFubmVscywgYworU3BlY2lmeSB3aGljaCBjaGFubmVscyB0byBmaWx0ZXIsIGJ5IGRlZmF1bHQgYWxsIGF2YWlsYWJsZSBhcmUgZmlsdGVyZWQuCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIENvbW1hbmRzCisKK1RoaXMgZmlsdGVyIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZnJlcXVlbmN5LCBmCitDaGFuZ2UgdHJlYmxlIGZyZXF1ZW5jeS4KK1N5bnRheCBmb3IgdGhlIGNvbW1hbmQgaXMgOiAiQHZhcntmcmVxdWVuY3l9IgorCitAaXRlbSB3aWR0aF90eXBlLCB0CitDaGFuZ2UgdHJlYmxlIHdpZHRoX3R5cGUuCitTeW50YXggZm9yIHRoZSBjb21tYW5kIGlzIDogIkB2YXJ7d2lkdGhfdHlwZX0iCisKK0BpdGVtIHdpZHRoLCB3CitDaGFuZ2UgdHJlYmxlIHdpZHRoLgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye3dpZHRofSIKKworQGl0ZW0gZ2FpbiwgZworQ2hhbmdlIHRyZWJsZSBnYWluLgorU3ludGF4IGZvciB0aGUgY29tbWFuZCBpcyA6ICJAdmFye2dhaW59IgogQGVuZCB0YWJsZQogCiBAc2VjdGlvbiB0cmVtb2xvCkBAIC0zNzA5LDcgKzQ5MjYsNyBAQAogVG8gZW5hYmxlIGNvbXBpbGF0aW9uIG9mIHRoaXMgZmlsdGVyIHlvdSBuZWVkIHRvIGNvbmZpZ3VyZSBGRm1wZWcgd2l0aAogQGNvZGV7LS1lbmFibGUtbGliZmxpdGV9LgogCi1Ob3RlIHRoYXQgdGhlIGZsaXRlIGxpYnJhcnkgaXMgbm90IHRocmVhZC1zYWZlLgorTm90ZSB0aGF0IHZlcnNpb25zIG9mIHRoZSBmbGl0ZSBsaWJyYXJ5IHByaW9yIHRvIDIuMCBhcmUgbm90IHRocmVhZC1zYWZlLgogCiBUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgogCkBAIC0zNzY0LDcgKzQ5ODEsNyBAQAogQGVuZCBpdGVtaXplCiAKIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGxpYmZsaXRlLCBjaGVjazoKLUB1cmx7aHR0cDovL3d3dy5zcGVlY2guY3MuY211LmVkdS9mbGl0ZS99CitAdXJse2h0dHA6Ly93d3cuZmVzdHZveC5vcmcvZmxpdGUvfQogCiBAc2VjdGlvbiBhbm9pc2VzcmMKIApAQCAtMzc4NSw4ICs1MDAyLDggQEAKIHJlc3VsdHMgaW4gbm9pc2Ugd2l0aCBhbiBpbmZpbml0ZSBsZW5ndGguCiAKIEBpdGVtIGNvbG9yLCBjb2xvdXIsIGMKLVNwZWNpZnkgdGhlIGNvbG9yIG9mIG5vaXNlLiBBdmFpbGFibGUgbm9pc2UgY29sb3JzIGFyZSB3aGl0ZSwgcGluaywgYW5kIGJyb3duLgotRGVmYXVsdCBjb2xvciBpcyB3aGl0ZS4KK1NwZWNpZnkgdGhlIGNvbG9yIG9mIG5vaXNlLiBBdmFpbGFibGUgbm9pc2UgY29sb3JzIGFyZSB3aGl0ZSwgcGluaywgYnJvd24sCitibHVlIGFuZCB2aW9sZXQuIERlZmF1bHQgY29sb3IgaXMgd2hpdGUuCiAKIEBpdGVtIHNlZWQsIHMKIFNwZWNpZnkgYSB2YWx1ZSB1c2VkIHRvIHNlZWQgdGhlIFBSTkcuCkBAIC0zODA2LDYgKzUwMjMsMzMgQEAKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIGhpbGJlcnQKKworR2VuZXJhdGUgb2RkLXRhcCBIaWxiZXJ0IHRyYW5zZm9ybSBGSVIgY29lZmZpY2llbnRzLgorCitUaGUgcmVzdWx0aW5nIHN0cmVhbSBjYW4gYmUgdXNlZCB3aXRoIEByZWZ7YWZpcn0gZmlsdGVyIGZvciBwaGFzZS1zaGlmdGluZwordGhlIHNpZ25hbCBieSA5MCBkZWdyZWVzLgorCitUaGlzIGlzIHVzZWQgaW4gbWFueSBtYXRyaXggY29kaW5nIHNjaGVtZXMgYW5kIGZvciBhbmFseXRpYyBzaWduYWwgZ2VuZXJhdGlvbi4KK1RoZSBwcm9jZXNzIGlzIG9mdGVuIHdyaXR0ZW4gYXMgYSBtdWx0aXBsaWNhdGlvbiBieSBpIChvciBqKSwgdGhlIGltYWdpbmFyeSB1bml0LgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorCitAaXRlbSBzYW1wbGVfcmF0ZSwgcworU2V0IHNhbXBsZSByYXRlLCBkZWZhdWx0IGlzIDQ0MTAwLgorCitAaXRlbSB0YXBzLCB0CitTZXQgbGVuZ3RoIG9mIEZJUiBmaWx0ZXIsIGRlZmF1bHQgaXMgMjIwNTEuCisKK0BpdGVtIG5iX3NhbXBsZXMsIG4KK1NldCBudW1iZXIgb2Ygc2FtcGxlcyBwZXIgZWFjaCBmcmFtZS4KKworQGl0ZW0gd2luX2Z1bmMsIHcKK1NldCB3aW5kb3cgZnVuY3Rpb24gdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgRklSIGNvZWZmaWNpZW50cy4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gc2luZQogCiBHZW5lcmF0ZSBhbiBhdWRpbyBzaWduYWwgbWFkZSBvZiBhIHNpbmUgd2F2ZSB3aXRoIGFtcGxpdHVkZSAxLzguCkBAIC00MDAxLDYgKzUyNDUsMjcgQEAKIEBpdGVtIHMKIFNldCBudW1iZXIgb2YgZnJhbWVzIGZpbHRlciB3aWxsIHVzZSBmb3IgYXZlcmFnaW5nLiBEZWZhdWx0IGlzIDMzLiBNdXN0IGJlIG9kZAogbnVtYmVyIGluIHJhbmdlIFs1LCAxMjldLgorCitAaXRlbSBwCitTZXQgd2hhdCBwbGFuZXMgb2YgZnJhbWUgZmlsdGVyIHdpbGwgdXNlIGZvciBhdmVyYWdpbmcuIERlZmF1bHQgaXMgYWxsLgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBhdmdibHVyCisKK0FwcGx5IGF2ZXJhZ2UgYmx1ciBmaWx0ZXIuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBzaXplWAorU2V0IGhvcml6b250YWwga2VybmVsIHNpemUuCisKK0BpdGVtIHBsYW5lcworU2V0IHdoaWNoIHBsYW5lcyB0byBmaWx0ZXIuIEJ5IGRlZmF1bHQgYWxsIHBsYW5lcyBhcmUgZmlsdGVyZWQuCisKK0BpdGVtIHNpemVZCitTZXQgdmVydGljYWwga2VybmVsIHNpemUsIGlmIHplcm8gaXQgd2lsbCBiZSBzYW1lIGFzIEBjb2Rle3NpemVYfS4KK0RlZmF1bHQgaXMgQGNvZGV7MH0uCiBAZW5kIHRhYmxlCiAKIEBzZWN0aW9uIGJib3gKQEAgLTQwMjAsNiArNTI4NSwyMSBAQAogU2V0IHRoZSBtaW5pbWFsIGx1bWluYW5jZSB2YWx1ZS4gRGVmYXVsdCBpcyBAY29kZXsxNn0uCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIGJpdHBsYW5lbm9pc2UKKworU2hvdyBhbmQgbWVhc3VyZSBiaXQgcGxhbmUgbm9pc2UuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBiaXRwbGFuZQorU2V0IHdoaWNoIHBsYW5lIHRvIGFuYWx5emUuIERlZmF1bHQgaXMgQGNvZGV7MX0uCisKK0BpdGVtIGZpbHRlcgorRmlsdGVyIG91dCBub2lzeSBwaXhlbHMgZnJvbSBAY29kZXtiaXRwbGFuZX0gc2V0IGFib3ZlLgorRGVmYXVsdCBpcyBkaXNhYmxlZC4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gYmxhY2tkZXRlY3QKIAogRGV0ZWN0IHZpZGVvIGludGVydmFscyB0aGF0IGFyZSAoYWxtb3N0KSBjb21wbGV0ZWx5IGJsYWNrLiBDYW4gYmUKQEAgLTQwODIsNiArNTM2MiwxMCBAQAogSW4gb3JkZXIgdG8gZGlzcGxheSB0aGUgb3V0cHV0IGxpbmVzLCB5b3UgbmVlZCB0byBzZXQgdGhlIGxvZ2xldmVsIGF0CiBsZWFzdCB0byB0aGUgQVZfTE9HX0lORk8gdmFsdWUuCiAKK1RoaXMgZmlsdGVyIGV4cG9ydHMgZnJhbWUgbWV0YWRhdGEgQGNvZGV7bGF2ZmkuYmxhY2tmcmFtZS5wYmxhY2t9LgorVGhlIHZhbHVlIHJlcHJlc2VudHMgdGhlIHBlcmNlbnRhZ2Ugb2YgcGl4ZWxzIGluIHRoZSBwaWN0dXJlIHRoYXQKK2FyZSBiZWxvdyB0aGUgdGhyZXNob2xkIHZhbHVlLgorCiBJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKIAogQHRhYmxlIEBvcHRpb24KQEAgLTQxMDIsNyArNTM4Niw3IEBACiAKIFRoZSBAY29kZXtibGVuZH0gZmlsdGVyIHRha2VzIHR3byBpbnB1dCBzdHJlYW1zIGFuZCBvdXRwdXRzIG9uZQogc3RyZWFtLCB0aGUgZmlyc3QgaW5wdXQgaXMgdGhlICJ0b3AiIGxheWVyIGFuZCBzZWNvbmQgaW5wdXQgaXMKLSJib3R0b20iIGxheWVyLiAgT3V0cHV0IHRlcm1pbmF0ZXMgd2hlbiBzaG9ydGVzdCBpbnB1dCB0ZXJtaW5hdGVzLgorImJvdHRvbSIgbGF5ZXIuICBCeSBkZWZhdWx0LCB0aGUgb3V0cHV0IHRlcm1pbmF0ZXMgd2hlbiB0aGUgbG9uZ2VzdCBpbnB1dCB0ZXJtaW5hdGVzLgogCiBUaGUgQGNvZGV7dGJsZW5kfSAodGltZSBibGVuZCkgZmlsdGVyIHRha2VzIHR3byBjb25zZWN1dGl2ZSBmcmFtZXMKIGZyb20gb25lIHNpbmdsZSBzdHJlYW0sIGFuZCBvdXRwdXRzIHRoZSByZXN1bHQgb2J0YWluZWQgYnkgYmxlbmRpbmcKQEAgLTQxMjIsMTkgKzU0MDYsMjIgQEAKIEF2YWlsYWJsZSB2YWx1ZXMgZm9yIGNvbXBvbmVudCBtb2RlcyBhcmU6CiBAdGFibGUgQHNhbXAKIEBpdGVtIGFkZGl0aW9uCi1AaXRlbSBhZGRpdGlvbjEyOAorQGl0ZW0gZ3JhaW5tZXJnZQogQGl0ZW0gYW5kCiBAaXRlbSBhdmVyYWdlCiBAaXRlbSBidXJuCiBAaXRlbSBkYXJrZW4KIEBpdGVtIGRpZmZlcmVuY2UKLUBpdGVtIGRpZmZlcmVuY2UxMjgKK0BpdGVtIGdyYWluZXh0cmFjdAogQGl0ZW0gZGl2aWRlCiBAaXRlbSBkb2RnZQorQGl0ZW0gZnJlZXplCiBAaXRlbSBleGNsdXNpb24KK0BpdGVtIGV4dHJlbWl0eQogQGl0ZW0gZ2xvdwogQGl0ZW0gaGFyZGxpZ2h0CiBAaXRlbSBoYXJkbWl4CitAaXRlbSBoZWF0CiBAaXRlbSBsaWdodGVuCiBAaXRlbSBsaW5lYXJsaWdodAogQGl0ZW0gbXVsdGlwbHkKQEAgLTQxOTksMTcgKzU0ODYsMTAgQEAKIEBpdGVtIEJPVFRPTSwgQgogVmFsdWUgb2YgcGl4ZWwgY29tcG9uZW50IGF0IGN1cnJlbnQgbG9jYXRpb24gZm9yIHNlY29uZCB2aWRlbyBmcmFtZSAoYm90dG9tIGxheWVyKS4KIEBlbmQgdGFibGUKLQotQGl0ZW0gc2hvcnRlc3QKLUZvcmNlIHRlcm1pbmF0aW9uIHdoZW4gdGhlIHNob3J0ZXN0IGlucHV0IHRlcm1pbmF0ZXMuIERlZmF1bHQgaXMKLUBjb2RlezB9LiBUaGlzIG9wdGlvbiBpcyBvbmx5IGRlZmluZWQgZm9yIHRoZSBAY29kZXtibGVuZH0gZmlsdGVyLgotCi1AaXRlbSByZXBlYXRsYXN0Ci1Db250aW51ZSBhcHBseWluZyB0aGUgbGFzdCBib3R0b20gZnJhbWUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiBBIHZhbHVlIG9mCi1AY29kZXswfSBkaXNhYmxlIHRoZSBmaWx0ZXIgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgb2YgdGhlIGJvdHRvbSBsYXllciBpcyByZWFjaGVkLgotRGVmYXVsdCBpcyBAY29kZXsxfS4gVGhpcyBvcHRpb24gaXMgb25seSBkZWZpbmVkIGZvciB0aGUgQGNvZGV7YmxlbmR9IGZpbHRlci4KIEBlbmQgdGFibGUKIAorVGhlIEBjb2Rle2JsZW5kfSBmaWx0ZXIgYWxzbyBzdXBwb3J0cyB0aGUgQHJlZntmcmFtZXN5bmN9IG9wdGlvbnMuCisKIEBzdWJzZWN0aW9uIEV4YW1wbGVzCiAKIEBpdGVtaXplCkBAIC00MjIwLDYgKzU1MDAsMTIgQEAKIEBlbmQgZXhhbXBsZQogCiBAaXRlbQorQXBwbHkgbGluZWFyIGhvcml6b250YWwgdHJhbnNpdGlvbiBmcm9tIHRvcCBsYXllciB0byBib3R0b20gbGF5ZXI6CitAZXhhbXBsZQorYmxlbmQ9YWxsX2V4cHI9J0EqKFgvVykrQiooMS1YL1cpJworQGVuZCBleGFtcGxlCisKK0BpdGVtCiBBcHBseSAxeDEgY2hlY2tlcmJvYXJkIGVmZmVjdDoKIEBleGFtcGxlCiBibGVuZD1hbGxfZXhwcj0naWYoZXEobW9kKFgsMiksbW9kKFksMikpLEEsQiknCkBAIC00MjQ2LDEzICs1NTMyLDEzIEBACiBAaXRlbQogU3BsaXQgZGlhZ29uYWxseSB2aWRlbyBhbmQgc2hvd3MgdG9wIGFuZCBib3R0b20gbGF5ZXIgb24gZWFjaCBzaWRlOgogQGV4YW1wbGUKLWJsZW5kPWFsbF9leHByPWlmKGd0KFgsWSooVy9IKSksQSxCKQorYmxlbmQ9YWxsX2V4cHI9J2lmKGd0KFgsWSooVy9IKSksQSxCKScKIEBlbmQgZXhhbXBsZQogCiBAaXRlbQogRGlzcGxheSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBjdXJyZW50IGFuZCB0aGUgcHJldmlvdXMgZnJhbWU6CiBAZXhhbXBsZQotdGJsZW5kPWFsbF9tb2RlPWRpZmZlcmVuY2UxMjgKK3RibGVuZD1hbGxfbW9kZT1ncmFpbmV4dHJhY3QKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKQEAgLTQzNDQsNiArNTYzMCw1OSBAQAogQGVuZCBleGFtcGxlCiBAZW5kIGl0ZW1pemUKIAorQHNlY3Rpb24gYndkaWYKKworRGVpbnRlcmxhY2UgdGhlIGlucHV0IHZpZGVvICgiYndkaWYiIHN0YW5kcyBmb3IgIkJvYiBXZWF2ZXIKK0RlaW50ZXJsYWNpbmcgRmlsdGVyIikuCisKK01vdGlvbiBhZGFwdGl2ZSBkZWludGVybGFjaW5nIGJhc2VkIG9uIHlhZGlmIHdpdGggdGhlIHVzZSBvZiB3M2ZkaWYgYW5kIGN1YmljCitpbnRlcnBvbGF0aW9uIGFsZ29yaXRobXMuCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIG1vZGUKK1RoZSBpbnRlcmxhY2luZyBtb2RlIHRvIGFkb3B0LiBJdCBhY2NlcHRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIDAsIHNlbmRfZnJhbWUKK091dHB1dCBvbmUgZnJhbWUgZm9yIGVhY2ggZnJhbWUuCitAaXRlbSAxLCBzZW5kX2ZpZWxkCitPdXRwdXQgb25lIGZyYW1lIGZvciBlYWNoIGZpZWxkLgorQGVuZCB0YWJsZQorCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBAY29kZXtzZW5kX2ZpZWxkfS4KKworQGl0ZW0gcGFyaXR5CitUaGUgcGljdHVyZSBmaWVsZCBwYXJpdHkgYXNzdW1lZCBmb3IgdGhlIGlucHV0IGludGVybGFjZWQgdmlkZW8uIEl0IGFjY2VwdHMgb25lCitvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIDAsIHRmZgorQXNzdW1lIHRoZSB0b3AgZmllbGQgaXMgZmlyc3QuCitAaXRlbSAxLCBiZmYKK0Fzc3VtZSB0aGUgYm90dG9tIGZpZWxkIGlzIGZpcnN0LgorQGl0ZW0gLTEsIGF1dG8KK0VuYWJsZSBhdXRvbWF0aWMgZGV0ZWN0aW9uIG9mIGZpZWxkIHBhcml0eS4KK0BlbmQgdGFibGUKKworVGhlIGRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7YXV0b30uCitJZiB0aGUgaW50ZXJsYWNpbmcgaXMgdW5rbm93biBvciB0aGUgZGVjb2RlciBkb2VzIG5vdCBleHBvcnQgdGhpcyBpbmZvcm1hdGlvbiwKK3RvcCBmaWVsZCBmaXJzdCB3aWxsIGJlIGFzc3VtZWQuCisKK0BpdGVtIGRlaW50CitTcGVjaWZ5IHdoaWNoIGZyYW1lcyB0byBkZWludGVybGFjZS4gQWNjZXB0IG9uZSBvZiB0aGUgZm9sbG93aW5nCit2YWx1ZXM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSAwLCBhbGwKK0RlaW50ZXJsYWNlIGFsbCBmcmFtZXMuCitAaXRlbSAxLCBpbnRlcmxhY2VkCitPbmx5IGRlaW50ZXJsYWNlIGZyYW1lcyBtYXJrZWQgYXMgaW50ZXJsYWNlZC4KK0BlbmQgdGFibGUKKworVGhlIGRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7YWxsfS4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gY2hyb21ha2V5CiBZVVYgY29sb3JzcGFjZSBjb2xvci9jaHJvbWEga2V5aW5nLgogCkBAIC00MzY5LDcgKzU3MDgsNyBAQAogQGl0ZW0geXV2CiBTaWduYWxzIHRoYXQgdGhlIGNvbG9yIHBhc3NlZCBpcyBhbHJlYWR5IGluIFlVViBpbnN0ZWFkIG9mIFJHQi4KIAotTGl0dGVyYWwgY29sb3JzIGxpa2UgImdyZWVuIiBvciAicmVkIiBkb24ndCBtYWtlIHNlbnNlIHdpdGggdGhpcyBlbmFibGVkIGFueW1vcmUuCitMaXRlcmFsIGNvbG9ycyBsaWtlICJncmVlbiIgb3IgInJlZCIgZG9uJ3QgbWFrZSBzZW5zZSB3aXRoIHRoaXMgZW5hYmxlZCBhbnltb3JlLgogVGhpcyBjYW4gYmUgdXNlZCB0byBwYXNzIGV4YWN0IFlVViB2YWx1ZXMgYXMgaGV4YWRlY2ltYWwgbnVtYmVycy4KIEBlbmQgdGFibGUKIApAQCAtNDM4OSw2ICs1NzI4LDYxIEBACiBAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCitAc2VjdGlvbiBjaWVzY29wZQorCitEaXNwbGF5IENJRSBjb2xvciBkaWFncmFtIHdpdGggcGl4ZWxzIG92ZXJsYWlkIG9udG8gaXQuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBzeXN0ZW0KK1NldCBjb2xvciBzeXN0ZW0uCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gbnRzYywgNDcwbQorQGl0ZW0gZWJ1LCA0NzBiZworQGl0ZW0gc21wdGUKK0BpdGVtIDI0MG0KK0BpdGVtIGFwcGxlCitAaXRlbSB3aWRlcmdiCitAaXRlbSBjaWUxOTMxCitAaXRlbSByZWM3MDksIGhkdHYKK0BpdGVtIHVoZHR2LCByZWMyMDIwCitAZW5kIHRhYmxlCisKK0BpdGVtIGNpZQorU2V0IENJRSBzeXN0ZW0uCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0geHl5CitAaXRlbSB1Y3MKK0BpdGVtIGx1dgorQGVuZCB0YWJsZQorCitAaXRlbSBnYW11dHMKK1NldCB3aGF0IGdhbXV0cyB0byBkcmF3LgorCitTZWUgQGNvZGV7c3lzdGVtfSBvcHRpb24gZm9yIGF2YWlsYWJsZSB2YWx1ZXMuCisKK0BpdGVtIHNpemUsIHMKK1NldCBjaWVzY29wZSBzaXplLCBieSBkZWZhdWx0IHNldCB0byA1MTIuCisKK0BpdGVtIGludGVuc2l0eSwgaQorU2V0IGludGVuc2l0eSB1c2VkIHRvIG1hcCBpbnB1dCBwaXhlbCB2YWx1ZXMgdG8gQ0lFIGRpYWdyYW0uCisKK0BpdGVtIGNvbnRyYXN0CitTZXQgY29udHJhc3QgdXNlZCB0byBkcmF3IHRvbmd1ZSBjb2xvcnMgdGhhdCBhcmUgb3V0IG9mIGFjdGl2ZSBjb2xvciBzeXN0ZW0gZ2FtdXQuCisKK0BpdGVtIGNvcnJnYW1tYQorQ29ycmVjdCBnYW1tYSBkaXNwbGF5ZWQgb24gc2NvcGUsIGJ5IGRlZmF1bHQgZW5hYmxlZC4KKworQGl0ZW0gc2hvd3doaXRlCitTaG93IHdoaXRlIHBvaW50IG9uIENJRSBkaWFncmFtLCBieSBkZWZhdWx0IGRpc2FibGVkLgorCitAaXRlbSBnYW1tYQorU2V0IGlucHV0IGdhbW1hLiBVc2VkIG9ubHkgd2l0aCBYWVogaW5wdXQgY29sb3Igc3BhY2UuCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIGNvZGVjdmlldwogCiBWaXN1YWxpemUgaW5mb3JtYXRpb24gZXhwb3J0ZWQgYnkgc29tZSBjb2RlY3MuCkBAIC00NDE1LDE2ICs1ODA5LDQ4IEBACiBAZW5kIHRhYmxlCiAKIEBpdGVtIHFwCi1EaXNwbGF5IHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBjaHJvbWEgcGxhbmVzCitEaXNwbGF5IHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBjaHJvbWEgcGxhbmVzLgorCitAaXRlbSBtdl90eXBlLCBtdnQKK1NldCBtb3Rpb24gdmVjdG9ycyB0eXBlIHRvIHZpc3VhbGl6ZS4gSW5jbHVkZXMgTVZzIGZyb20gYWxsIGZyYW1lcyB1bmxlc3Mgc3BlY2lmaWVkIGJ5IEB2YXJ7ZnJhbWVfdHlwZX0gb3B0aW9uLgorCitBdmFpbGFibGUgZmxhZ3MgZm9yIEB2YXJ7bXZfdHlwZX0gYXJlOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIGZwCitmb3J3YXJkIHByZWRpY3RlZCBNVnMKK0BpdGVtIGJwCitiYWNrd2FyZCBwcmVkaWN0ZWQgTVZzCitAZW5kIHRhYmxlCisKK0BpdGVtIGZyYW1lX3R5cGUsIGZ0CitTZXQgZnJhbWUgdHlwZSB0byB2aXN1YWxpemUgbW90aW9uIHZlY3RvcnMgb2YuCisKK0F2YWlsYWJsZSBmbGFncyBmb3IgQHZhcntmcmFtZV90eXBlfSBhcmU6CisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gaWYKK2ludHJhLWNvZGVkIGZyYW1lcyAoSS1mcmFtZXMpCitAaXRlbSBwZgorcHJlZGljdGVkIGZyYW1lcyAoUC1mcmFtZXMpCitAaXRlbSBiZgorYmktZGlyZWN0aW9uYWxseSBwcmVkaWN0ZWQgZnJhbWVzIChCLWZyYW1lcykKK0BlbmQgdGFibGUKIEBlbmQgdGFibGUKIAogQHN1YnNlY3Rpb24gRXhhbXBsZXMKIAogQGl0ZW1pemUKIEBpdGVtCi1WaXN1YWxpemVzIG11bHRpLWRpcmVjdGlvbmFscyBNVnMgZnJvbSBQIGFuZCBCLUZyYW1lcyB1c2luZyBAY29tbWFuZHtmZnBsYXl9OgorVmlzdWFsaXplIGZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBhbGwgZnJhbWVzIHVzaW5nIEBjb21tYW5ke2ZmcGxheX06CiBAZXhhbXBsZQotZmZwbGF5IC1mbGFnczIgK2V4cG9ydF9tdnMgaW5wdXQubXBnIC12ZiBjb2RlY3ZpZXc9bXY9cGYrYmYrYmIKK2ZmcGxheSAtZmxhZ3MyICtleHBvcnRfbXZzIGlucHV0Lm1wNCAtdmYgY29kZWN2aWV3PW12X3R5cGU9ZnAKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorVmlzdWFsaXplIG11bHRpLWRpcmVjdGlvbmFscyBNVnMgb2YgUCBhbmQgQi1GcmFtZXMgdXNpbmcgQGNvbW1hbmR7ZmZwbGF5fToKK0BleGFtcGxlCitmZnBsYXkgLWZsYWdzMiArZXhwb3J0X212cyBpbnB1dC5tcDQgLXZmIGNvZGVjdmlldz1tdj1wZitiZitiYgogQGVuZCBleGFtcGxlCiBAZW5kIGl0ZW1pemUKIApAQCAtNDY1MywxNCArNjA3OSwyNiBAQAogQGl0ZW0gYnQ3MDkKIEJULjcwOQogCitAaXRlbSBmY2MKK0ZDQworCiBAaXRlbSBidDYwMQogQlQuNjAxCiAKK0BpdGVtIGJ0NDcwCitCVC40NzAKKworQGl0ZW0gYnQ0NzBiZworQlQuNDcwQkcKKworQGl0ZW0gc21wdGUxNzBtCitTTVBURS0xNzBNCisKIEBpdGVtIHNtcHRlMjQwbQogU01QVEUtMjQwTQogCi1AaXRlbSBmY2MKLUZDQworQGl0ZW0gYnQyMDIwCitCVC4yMDIwCiBAZW5kIHRhYmxlCiBAZW5kIHRhYmxlCiAKQEAgLTQ2NjksOSArNjEwNywyODAgQEAKIGNvbG9ybWF0cml4PWJ0NjAxOnNtcHRlMjQwbQogQGVuZCBleGFtcGxlCiAKK0BzZWN0aW9uIGNvbG9yc3BhY2UKKworQ29udmVydCBjb2xvcnNwYWNlLCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3Mgb3IgY29sb3IgcHJpbWFyaWVzLgorSW5wdXQgdmlkZW8gbmVlZHMgdG8gaGF2ZSBhbiBldmVuIHNpemUuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAYW5jaG9ye2FsbH0KK0BpdGVtIGFsbAorU3BlY2lmeSBhbGwgY29sb3IgcHJvcGVydGllcyBhdCBvbmNlLgorCitUaGUgYWNjZXB0ZWQgdmFsdWVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0gYnQ0NzBtCitCVC40NzBNCisKK0BpdGVtIGJ0NDcwYmcKK0JULjQ3MEJHCisKK0BpdGVtIGJ0NjAxLTYtNTI1CitCVC42MDEtNiA1MjUKKworQGl0ZW0gYnQ2MDEtNi02MjUKK0JULjYwMS02IDYyNQorCitAaXRlbSBidDcwOQorQlQuNzA5CisKK0BpdGVtIHNtcHRlMTcwbQorU01QVEUtMTcwTQorCitAaXRlbSBzbXB0ZTI0MG0KK1NNUFRFLTI0ME0KKworQGl0ZW0gYnQyMDIwCitCVC4yMDIwCisKK0BlbmQgdGFibGUKKworQGFuY2hvcntzcGFjZX0KK0BpdGVtIHNwYWNlCitTcGVjaWZ5IG91dHB1dCBjb2xvcnNwYWNlLgorCitUaGUgYWNjZXB0ZWQgdmFsdWVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0gYnQ3MDkKK0JULjcwOQorCitAaXRlbSBmY2MKK0ZDQworCitAaXRlbSBidDQ3MGJnCitCVC40NzBCRyBvciBCVC42MDEtNiA2MjUKKworQGl0ZW0gc21wdGUxNzBtCitTTVBURS0xNzBNIG9yIEJULjYwMS02IDUyNQorCitAaXRlbSBzbXB0ZTI0MG0KK1NNUFRFLTI0ME0KKworQGl0ZW0geWNnY28KK1lDZ0NvCisKK0BpdGVtIGJ0MjAyMG5jbAorQlQuMjAyMCB3aXRoIG5vbi1jb25zdGFudCBsdW1pbmFuY2UKKworQGVuZCB0YWJsZQorCitAYW5jaG9ye3RyY30KK0BpdGVtIHRyYworU3BlY2lmeSBvdXRwdXQgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzLgorCitUaGUgYWNjZXB0ZWQgdmFsdWVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0gYnQ3MDkKK0JULjcwOQorCitAaXRlbSBidDQ3MG0KK0JULjQ3ME0KKworQGl0ZW0gYnQ0NzBiZworQlQuNDcwQkcKKworQGl0ZW0gZ2FtbWEyMgorQ29uc3RhbnQgZ2FtbWEgb2YgMi4yCisKK0BpdGVtIGdhbW1hMjgKK0NvbnN0YW50IGdhbW1hIG9mIDIuOAorCitAaXRlbSBzbXB0ZTE3MG0KK1NNUFRFLTE3ME0sIEJULjYwMS02IDYyNSBvciBCVC42MDEtNiA1MjUKKworQGl0ZW0gc21wdGUyNDBtCitTTVBURS0yNDBNCisKK0BpdGVtIHNyZ2IKK1NSR0IKKworQGl0ZW0gaWVjNjE5NjYtMi0xCitpZWM2MTk2Ni0yLTEKKworQGl0ZW0gaWVjNjE5NjYtMi00CitpZWM2MTk2Ni0yLTQKKworQGl0ZW0geHZ5Y2MKK3h2eWNjCisKK0BpdGVtIGJ0MjAyMC0xMAorQlQuMjAyMCBmb3IgMTAtYml0cyBjb250ZW50CisKK0BpdGVtIGJ0MjAyMC0xMgorQlQuMjAyMCBmb3IgMTItYml0cyBjb250ZW50CisKK0BlbmQgdGFibGUKKworQGFuY2hvcntwcmltYXJpZXN9CitAaXRlbSBwcmltYXJpZXMKK1NwZWNpZnkgb3V0cHV0IGNvbG9yIHByaW1hcmllcy4KKworVGhlIGFjY2VwdGVkIHZhbHVlcyBhcmU6CitAdGFibGUgQHNhbXAKK0BpdGVtIGJ0NzA5CitCVC43MDkKKworQGl0ZW0gYnQ0NzBtCitCVC40NzBNCisKK0BpdGVtIGJ0NDcwYmcKK0JULjQ3MEJHIG9yIEJULjYwMS02IDYyNQorCitAaXRlbSBzbXB0ZTE3MG0KK1NNUFRFLTE3ME0gb3IgQlQuNjAxLTYgNTI1CisKK0BpdGVtIHNtcHRlMjQwbQorU01QVEUtMjQwTQorCitAaXRlbSBmaWxtCitmaWxtCisKK0BpdGVtIHNtcHRlNDMxCitTTVBURS00MzEKKworQGl0ZW0gc21wdGU0MzIKK1NNUFRFLTQzMgorCitAaXRlbSBidDIwMjAKK0JULjIwMjAKKworQGl0ZW0gamVkZWMtcDIyCitKRURFQyBQMjIgcGhvc3Bob3JzCisKK0BlbmQgdGFibGUKKworQGFuY2hvcntyYW5nZX0KK0BpdGVtIHJhbmdlCitTcGVjaWZ5IG91dHB1dCBjb2xvciByYW5nZS4KKworVGhlIGFjY2VwdGVkIHZhbHVlcyBhcmU6CitAdGFibGUgQHNhbXAKK0BpdGVtIHR2CitUViAocmVzdHJpY3RlZCkgcmFuZ2UKKworQGl0ZW0gbXBlZworTVBFRyAocmVzdHJpY3RlZCkgcmFuZ2UKKworQGl0ZW0gcGMKK1BDIChmdWxsKSByYW5nZQorCitAaXRlbSBqcGVnCitKUEVHIChmdWxsKSByYW5nZQorCitAZW5kIHRhYmxlCisKK0BpdGVtIGZvcm1hdAorU3BlY2lmeSBvdXRwdXQgY29sb3IgZm9ybWF0LgorCitUaGUgYWNjZXB0ZWQgdmFsdWVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0geXV2NDIwcAorWVVWIDQ6MjowIHBsYW5hciA4LWJpdHMKKworQGl0ZW0geXV2NDIwcDEwCitZVVYgNDoyOjAgcGxhbmFyIDEwLWJpdHMKKworQGl0ZW0geXV2NDIwcDEyCitZVVYgNDoyOjAgcGxhbmFyIDEyLWJpdHMKKworQGl0ZW0geXV2NDIycAorWVVWIDQ6MjoyIHBsYW5hciA4LWJpdHMKKworQGl0ZW0geXV2NDIycDEwCitZVVYgNDoyOjIgcGxhbmFyIDEwLWJpdHMKKworQGl0ZW0geXV2NDIycDEyCitZVVYgNDoyOjIgcGxhbmFyIDEyLWJpdHMKKworQGl0ZW0geXV2NDQ0cAorWVVWIDQ6NDo0IHBsYW5hciA4LWJpdHMKKworQGl0ZW0geXV2NDQ0cDEwCitZVVYgNDo0OjQgcGxhbmFyIDEwLWJpdHMKKworQGl0ZW0geXV2NDQ0cDEyCitZVVYgNDo0OjQgcGxhbmFyIDEyLWJpdHMKKworQGVuZCB0YWJsZQorCitAaXRlbSBmYXN0CitEbyBhIGZhc3QgY29udmVyc2lvbiwgd2hpY2ggc2tpcHMgZ2FtbWEvcHJpbWFyeSBjb3JyZWN0aW9uLiBUaGlzIHdpbGwgdGFrZQorc2lnbmlmaWNhbnRseSBsZXNzIENQVSwgYnV0IHdpbGwgYmUgbWF0aGVtYXRpY2FsbHkgaW5jb3JyZWN0LiBUbyBnZXQgb3V0cHV0Citjb21wYXRpYmxlIHdpdGggdGhhdCBwcm9kdWNlZCBieSB0aGUgY29sb3JtYXRyaXggZmlsdGVyLCB1c2UgZmFzdD0xLgorCitAaXRlbSBkaXRoZXIKK1NwZWNpZnkgZGl0aGVyaW5nIG1vZGUuCisKK1RoZSBhY2NlcHRlZCB2YWx1ZXMgYXJlOgorQHRhYmxlIEBzYW1wCitAaXRlbSBub25lCitObyBkaXRoZXJpbmcKKworQGl0ZW0gZnNiCitGbG95ZC1TdGVpbmJlcmcgZGl0aGVyaW5nCitAZW5kIHRhYmxlCisKK0BpdGVtIHdwYWRhcHQKK1doaXRlcG9pbnQgYWRhcHRhdGlvbiBtb2RlLgorCitUaGUgYWNjZXB0ZWQgdmFsdWVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0gYnJhZGZvcmQKK0JyYWRmb3JkIHdoaXRlcG9pbnQgYWRhcHRhdGlvbgorCitAaXRlbSB2b25rcmllcwordm9uIEtyaWVzIHdoaXRlcG9pbnQgYWRhcHRhdGlvbgorCitAaXRlbSBpZGVudGl0eQoraWRlbnRpdHkgd2hpdGVwb2ludCBhZGFwdGF0aW9uIChpLmUuIG5vIHdoaXRlcG9pbnQgYWRhcHRhdGlvbikKK0BlbmQgdGFibGUKKworQGl0ZW0gaWFsbAorT3ZlcnJpZGUgYWxsIGlucHV0IHByb3BlcnRpZXMgYXQgb25jZS4gU2FtZSBhY2NlcHRlZCB2YWx1ZXMgYXMgQHJlZnthbGx9LgorCitAaXRlbSBpc3BhY2UKK092ZXJyaWRlIGlucHV0IGNvbG9yc3BhY2UuIFNhbWUgYWNjZXB0ZWQgdmFsdWVzIGFzIEByZWZ7c3BhY2V9LgorCitAaXRlbSBpcHJpbWFyaWVzCitPdmVycmlkZSBpbnB1dCBjb2xvciBwcmltYXJpZXMuIFNhbWUgYWNjZXB0ZWQgdmFsdWVzIGFzIEByZWZ7cHJpbWFyaWVzfS4KKworQGl0ZW0gaXRyYworT3ZlcnJpZGUgaW5wdXQgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzLiBTYW1lIGFjY2VwdGVkIHZhbHVlcyBhcyBAcmVme3RyY30uCisKK0BpdGVtIGlyYW5nZQorT3ZlcnJpZGUgaW5wdXQgY29sb3IgcmFuZ2UuIFNhbWUgYWNjZXB0ZWQgdmFsdWVzIGFzIEByZWZ7cmFuZ2V9LgorCitAZW5kIHRhYmxlCisKK1RoZSBmaWx0ZXIgY29udmVydHMgdGhlIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcywgY29sb3Igc3BhY2UgYW5kIGNvbG9yCitwcmltYXJpZXMgdG8gdGhlIHNwZWNpZmllZCB1c2VyIHZhbHVlcy4gVGhlIG91dHB1dCB2YWx1ZSwgaWYgbm90IHNwZWNpZmllZCwKK2lzIHNldCB0byBhIGRlZmF1bHQgdmFsdWUgYmFzZWQgb24gdGhlICJhbGwiIHByb3BlcnR5LiBJZiB0aGF0IHByb3BlcnR5IGlzCithbHNvIG5vdCBzcGVjaWZpZWQsIHRoZSBmaWx0ZXIgd2lsbCBsb2cgYW4gZXJyb3IuIFRoZSBvdXRwdXQgY29sb3IgcmFuZ2UgYW5kCitmb3JtYXQgZGVmYXVsdCB0byB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgaW5wdXQgY29sb3IgcmFuZ2UgYW5kIGZvcm1hdC4gVGhlCitpbnB1dCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MsIGNvbG9yIHNwYWNlLCBjb2xvciBwcmltYXJpZXMgYW5kIGNvbG9yIHJhbmdlCitzaG91bGQgYmUgc2V0IG9uIHRoZSBpbnB1dCBkYXRhLiBJZiBhbnkgb2YgdGhlc2UgYXJlIG1pc3NpbmcsIHRoZSBmaWx0ZXIgd2lsbAorbG9nIGFuIGVycm9yIGFuZCBubyBjb252ZXJzaW9uIHdpbGwgdGFrZSBwbGFjZS4KKworRm9yIGV4YW1wbGUgdG8gY29udmVydCB0aGUgaW5wdXQgdG8gU01QVEUtMjQwTSwgdXNlIHRoZSBjb21tYW5kOgorQGV4YW1wbGUKK2NvbG9yc3BhY2U9c21wdGUyNDBtCitAZW5kIGV4YW1wbGUKKwogQHNlY3Rpb24gY29udm9sdXRpb24KIAotQXBwbHkgY29udm9sdXRpb24gM3gzIG9yIDV4NSBmaWx0ZXIuCitBcHBseSBjb252b2x1dGlvbiAzeDMsIDV4NSBvciA3eDcgZmlsdGVyLgogCiBUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgogCkBAIC00NjgxLDcgKzYzOTAsNyBAQAogQGl0ZW0gMm0KIEBpdGVtIDNtCiBTZXQgbWF0cml4IGZvciBlYWNoIHBsYW5lLgotTWF0cml4IGlzIHNlcXVlbmNlIG9mIDkgb3IgMjUgc2lnbmVkIGludGVnZXJzLgorTWF0cml4IGlzIHNlcXVlbmNlIG9mIDksIDI1IG9yIDQ5IHNpZ25lZCBpbnRlZ2Vycy4KIAogQGl0ZW0gMHJkaXYKIEBpdGVtIDFyZGl2CkBAIC00NzI1LDE3ICs2NDM0LDE0NiBAQAogQGVuZCBleGFtcGxlCiAKIEBpdGVtCitBcHBseSBsYXBsYWNpYW4gZWRnZSBkZXRlY3RvciB3aGljaCBpbmNsdWRlcyBkaWFnb25hbHM6CitAZXhhbXBsZQorY29udm9sdXRpb249IjEgMSAxIDEgLTggMSAxIDEgMToxIDEgMSAxIC04IDEgMSAxIDE6MSAxIDEgMSAtOCAxIDEgMSAxOjEgMSAxIDEgLTggMSAxIDEgMTo1OjU6NToxOjA6MTI4OjEyODowIgorQGVuZCBleGFtcGxlCisKK0BpdGVtCiBBcHBseSBlbWJvc3M6CiBAZXhhbXBsZQogY29udm9sdXRpb249Ii0yIC0xIDAgLTEgMSAxIDAgMSAyOi0yIC0xIDAgLTEgMSAxIDAgMSAyOi0yIC0xIDAgLTEgMSAxIDAgMSAyOi0yIC0xIDAgLTEgMSAxIDAgMSAyIgogQGVuZCBleGFtcGxlCiBAZW5kIGl0ZW1pemUKIAorQHNlY3Rpb24gY29udm9sdmUKKworQXBwbHkgMkQgY29udm9sdXRpb24gb2YgdmlkZW8gc3RyZWFtIGluIGZyZXF1ZW5jeSBkb21haW4gdXNpbmcgc2Vjb25kIHN0cmVhbQorYXMgaW1wdWxzZS4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHBsYW5lcworU2V0IHdoaWNoIHBsYW5lcyB0byBwcm9jZXNzLgorCitAaXRlbSBpbXB1bHNlCitTZXQgd2hpY2ggaW1wdWxzZSB2aWRlbyBmcmFtZXMgd2lsbCBiZSBwcm9jZXNzZWQsIGNhbiBiZSBAdmFye2ZpcnN0fQorb3IgQHZhcnthbGx9LiBEZWZhdWx0IGlzIEB2YXJ7YWxsfS4KK0BlbmQgdGFibGUKKworVGhlIEBjb2Rle2NvbnZvbHZlfSBmaWx0ZXIgYWxzbyBzdXBwb3J0cyB0aGUgQHJlZntmcmFtZXN5bmN9IG9wdGlvbnMuCisKIEBzZWN0aW9uIGNvcHkKIAotQ29weSB0aGUgaW5wdXQgc291cmNlIHVuY2hhbmdlZCB0byB0aGUgb3V0cHV0LiBUaGlzIGlzIG1haW5seSB1c2VmdWwgZm9yCitDb3B5IHRoZSBpbnB1dCB2aWRlbyBzb3VyY2UgdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBmb3IKIHRlc3RpbmcgcHVycG9zZXMuCiAKK0BhbmNob3J7Y29yZWltYWdlfQorQHNlY3Rpb24gY29yZWltYWdlCitWaWRlbyBmaWx0ZXJpbmcgb24gR1BVIHVzaW5nIEFwcGxlJ3MgQ29yZUltYWdlIEFQSSBvbiBPU1guCisKK0hhcmR3YXJlIGFjY2VsZXJhdGlvbiBpcyBiYXNlZCBvbiBhbiBPcGVuR0wgY29udGV4dC4gVXN1YWxseSwgdGhpcyBtZWFucyBpdCBpcworcHJvY2Vzc2VkIGJ5IHZpZGVvIGhhcmR3YXJlLiBIb3dldmVyLCBzb2Z0d2FyZS1iYXNlZCBPcGVuR0wgaW1wbGVtZW50YXRpb25zCitleGlzdCB3aGljaCBtZWFucyB0aGVyZSBpcyBubyBndWFyYW50ZWUgZm9yIGhhcmR3YXJlIHByb2Nlc3NpbmcuIEl0IGRlcGVuZHMgb24KK3RoZSByZXNwZWN0aXZlIE9TWC4KKworVGhlcmUgYXJlIG1hbnkgZmlsdGVycyBhbmQgaW1hZ2UgZ2VuZXJhdG9ycyBwcm92aWRlZCBieSBBcHBsZSB0aGF0IGNvbWUgd2l0aCBhCitsYXJnZSB2YXJpZXR5IG9mIG9wdGlvbnMuIFRoZSBmaWx0ZXIgaGFzIHRvIGJlIHJlZmVyZW5jZWQgYnkgaXRzIG5hbWUgYWxvbmcKK3dpdGggaXRzIG9wdGlvbnMuCisKK1RoZSBjb3JlaW1hZ2UgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIGxpc3RfZmlsdGVycworTGlzdCBhbGwgYXZhaWxhYmxlIGZpbHRlcnMgYW5kIGdlbmVyYXRvcnMgYWxvbmcgd2l0aCBhbGwgdGhlaXIgcmVzcGVjdGl2ZQorb3B0aW9ucyBhcyB3ZWxsIGFzIHBvc3NpYmxlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWVzIGFsb25nIHdpdGggdGhlIGRlZmF1bHQKK3ZhbHVlcy4KK0BleGFtcGxlCitsaXN0X2ZpbHRlcnM9dHJ1ZQorQGVuZCBleGFtcGxlCisKK0BpdGVtIGZpbHRlcgorU3BlY2lmeSBhbGwgZmlsdGVycyBieSB0aGVpciByZXNwZWN0aXZlIG5hbWUgYW5kIG9wdGlvbnMuCitVc2UgQHZhcntsaXN0X2ZpbHRlcnN9IHRvIGRldGVybWluZSBhbGwgdmFsaWQgZmlsdGVyIG5hbWVzIGFuZCBvcHRpb25zLgorTnVtZXJpY2FsIG9wdGlvbnMgYXJlIHNwZWNpZmllZCBieSBhIGZsb2F0IHZhbHVlIGFuZCBhcmUgYXV0b21hdGljYWxseSBjbGFtcGVkCit0byB0aGVpciByZXNwZWN0aXZlIHZhbHVlIHJhbmdlLiAgVmVjdG9yIGFuZCBjb2xvciBvcHRpb25zIGhhdmUgdG8gYmUgc3BlY2lmaWVkCitieSBhIGxpc3Qgb2Ygc3BhY2Ugc2VwYXJhdGVkIGZsb2F0IHZhbHVlcy4gQ2hhcmFjdGVyIGVzY2FwaW5nIGhhcyB0byBiZSBkb25lLgorQSBzcGVjaWFsIG9wdGlvbiBuYW1lIEBjb2Rle2RlZmF1bHR9IGlzIGF2YWlsYWJsZSB0byB1c2UgZGVmYXVsdCBvcHRpb25zIGZvciBhCitmaWx0ZXIuCisKK0l0IGlzIHJlcXVpcmVkIHRvIHNwZWNpZnkgZWl0aGVyIEBjb2Rle2RlZmF1bHR9IG9yIGF0IGxlYXN0IG9uZSBvZiB0aGUgZmlsdGVyIG9wdGlvbnMuCitBbGwgb21pdHRlZCBvcHRpb25zIGFyZSB1c2VkIHdpdGggdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCitUaGUgc3ludGF4IG9mIHRoZSBmaWx0ZXIgc3RyaW5nIGlzIGFzIGZvbGxvd3M6CitAZXhhbXBsZQorZmlsdGVyPTxOQU1FPkBAPE9QVElPTj49PFZBTFVFPltAQDxPUFRJT04+PTxWQUxVRT5dW0BALi4uXVsjPE5BTUU+QEA8T1BUSU9OPj08VkFMVUU+W0BAPE9QVElPTj49PFZBTFVFPl1bQEAuLi5dXVsjLi4uXQorQGVuZCBleGFtcGxlCisKK0BpdGVtIG91dHB1dF9yZWN0CitTcGVjaWZ5IGEgcmVjdGFuZ2xlIHdoZXJlIHRoZSBvdXRwdXQgb2YgdGhlIGZpbHRlciBjaGFpbiBpcyBjb3BpZWQgaW50byB0aGUKK2lucHV0IGltYWdlLiBJdCBpcyBnaXZlbiBieSBhIGxpc3Qgb2Ygc3BhY2Ugc2VwYXJhdGVkIGZsb2F0IHZhbHVlczoKK0BleGFtcGxlCitvdXRwdXRfcmVjdD14XCB5XCB3aWR0aFwgaGVpZ2h0CitAZW5kIGV4YW1wbGUKK0lmIG5vdCBnaXZlbiwgdGhlIG91dHB1dCByZWN0YW5nbGUgZXF1YWxzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBpbnB1dCBpbWFnZS4KK1RoZSBvdXRwdXQgcmVjdGFuZ2xlIGlzIGF1dG9tYXRpY2FsbHkgY3JvcHBlZCBhdCB0aGUgYm9yZGVycyBvZiB0aGUgaW5wdXQKK2ltYWdlLiBOZWdhdGl2ZSB2YWx1ZXMgYXJlIHZhbGlkIGZvciBlYWNoIGNvbXBvbmVudC4KK0BleGFtcGxlCitvdXRwdXRfcmVjdD0yNVwgMjVcIDEwMFwgMTAwCitAZW5kIGV4YW1wbGUKK0BlbmQgdGFibGUKKworU2V2ZXJhbCBmaWx0ZXJzIGNhbiBiZSBjaGFpbmVkIGZvciBzdWNjZXNzaXZlIHByb2Nlc3Npbmcgd2l0aG91dCBHUFUtSE9TVAordHJhbnNmZXJzIGFsbG93aW5nIGZvciBmYXN0IHByb2Nlc3Npbmcgb2YgY29tcGxleCBmaWx0ZXIgY2hhaW5zLgorQ3VycmVudGx5LCBvbmx5IGZpbHRlcnMgd2l0aCB6ZXJvIChnZW5lcmF0b3JzKSBvciBleGFjdGx5IG9uZSAoZmlsdGVycykgaW5wdXQKK2ltYWdlIGFuZCBvbmUgb3V0cHV0IGltYWdlIGFyZSBzdXBwb3J0ZWQuIEFsc28sIHRyYW5zaXRpb24gZmlsdGVycyBhcmUgbm90IHlldAordXNhYmxlIGFzIGludGVuZGVkLgorCitTb21lIGZpbHRlcnMgZ2VuZXJhdGUgb3V0cHV0IGltYWdlcyB3aXRoIGFkZGl0aW9uYWwgcGFkZGluZyBkZXBlbmRpbmcgb24gdGhlCityZXNwZWN0aXZlIGZpbHRlciBrZXJuZWwuIFRoZSBwYWRkaW5nIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB0byBlbnN1cmUgdGhlCitmaWx0ZXIgb3V0cHV0IGhhcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBpbnB1dCBpbWFnZS4KKworRm9yIGltYWdlIGdlbmVyYXRvcnMsIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgaW1hZ2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUKK3ByZXZpb3VzIG91dHB1dCBpbWFnZSBvZiB0aGUgZmlsdGVyIGNoYWluIG9yIHRoZSBpbnB1dCBpbWFnZSBvZiB0aGUgd2hvbGUKK2ZpbHRlcmNoYWluLCByZXNwZWN0aXZlbHkuIFRoZSBnZW5lcmF0b3JzIGRvIG5vdCB1c2UgdGhlIHBpeGVsIGluZm9ybWF0aW9uIG9mCit0aGlzIGltYWdlIHRvIGdlbmVyYXRlIHRoZWlyIG91dHB1dC4gSG93ZXZlciwgdGhlIGdlbmVyYXRlZCBvdXRwdXQgaXMKK2JsZW5kZWQgb250byB0aGlzIGltYWdlLCByZXN1bHRpbmcgaW4gcGFydGlhbCBvciBjb21wbGV0ZSBjb3ZlcmFnZSBvZiB0aGUKK291dHB1dCBpbWFnZS4KKworVGhlIEByZWZ7Y29yZWltYWdlc3JjfSB2aWRlbyBzb3VyY2UgY2FuIGJlIHVzZWQgZm9yIGdlbmVyYXRpbmcgaW5wdXQgaW1hZ2VzCit3aGljaCBhcmUgZGlyZWN0bHkgZmVkIGludG8gdGhlIGZpbHRlciBjaGFpbi4gQnkgdXNpbmcgaXQsIHByb3ZpZGluZyBpbnB1dAoraW1hZ2VzIGJ5IGFub3RoZXIgdmlkZW8gc291cmNlIG9yIGFuIGlucHV0IHZpZGVvIGlzIG5vdCByZXF1aXJlZC4KKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKKworQGl0ZW0KK0xpc3QgYWxsIGZpbHRlcnMgYXZhaWxhYmxlOgorQGV4YW1wbGUKK2NvcmVpbWFnZT1saXN0X2ZpbHRlcnM9dHJ1ZQorQGVuZCBleGFtcGxlCisKK0BpdGVtCitVc2UgdGhlIENJQm94Qmx1ciBmaWx0ZXIgd2l0aCBkZWZhdWx0IG9wdGlvbnMgdG8gYmx1ciBhbiBpbWFnZToKK0BleGFtcGxlCitjb3JlaW1hZ2U9ZmlsdGVyPUNJQm94Qmx1ckBAZGVmYXVsdAorQGVuZCBleGFtcGxlCisKK0BpdGVtCitVc2UgYSBmaWx0ZXIgY2hhaW4gd2l0aCBDSVNlcGlhVG9uZSBhdCBkZWZhdWx0IHZhbHVlcyBhbmQgQ0lWaWduZXR0ZUVmZmVjdCB3aXRoCitpdHMgY2VudGVyIGF0IDEwMHgxMDAgYW5kIGEgcmFkaXVzIG9mIDUwIHBpeGVsczoKK0BleGFtcGxlCitjb3JlaW1hZ2U9ZmlsdGVyPUNJQm94Qmx1ckBAZGVmYXVsdCNDSVZpZ25ldHRlRWZmZWN0QEBpbnB1dENlbnRlcj0xMDBcIDEwMEBAaW5wdXRSYWRpdXM9NTAKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorVXNlIG51bGxzcmMgYW5kIENJUVJDb2RlR2VuZXJhdG9yIHRvIGNyZWF0ZSBhIFFSIGNvZGUgZm9yIHRoZSBGRm1wZWcgaG9tZXBhZ2UsCitnaXZlbiBhcyBjb21wbGV0ZSBhbmQgZXNjYXBlZCBjb21tYW5kLWxpbmUgZm9yIEFwcGxlJ3Mgc3RhbmRhcmQgYmFzaCBzaGVsbDoKK0BleGFtcGxlCitmZm1wZWcgLWYgbGF2ZmkgLWkgbnVsbHNyYz1zPTEwMHgxMDAsY29yZWltYWdlPWZpbHRlcj1DSVFSQ29kZUdlbmVyYXRvckBAaW5wdXRNZXNzYWdlPWh0dHBzXFxcXFw6Ly9GRm1wZWcub3JnL0BAaW5wdXRDb3JyZWN0aW9uTGV2ZWw9SCAtZnJhbWVzOnYgMSBRUkNvZGUucG5nCitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAc2VjdGlvbiBjcm9wCiAKIENyb3AgdGhlIGlucHV0IHZpZGVvIHRvIGdpdmVuIGRpbWVuc2lvbnMuCkBAIC00NzY3LDYgKzY2MDUsMTEgQEAKIElmIHNldCB0byAxIHdpbGwgZm9yY2UgdGhlIG91dHB1dCBkaXNwbGF5IGFzcGVjdCByYXRpbwogdG8gYmUgdGhlIHNhbWUgb2YgdGhlIGlucHV0LCBieSBjaGFuZ2luZyB0aGUgb3V0cHV0IHNhbXBsZSBhc3BlY3QKIHJhdGlvLiBJdCBkZWZhdWx0cyB0byAwLgorCitAaXRlbSBleGFjdAorRW5hYmxlIGV4YWN0IGNyb3BwaW5nLiBJZiBlbmFibGVkLCBzdWJzYW1wbGVkIHZpZGVvcyB3aWxsIGJlIGNyb3BwZWQgYXQgZXhhY3QKK3dpZHRoL2hlaWdodC94L3kgYXMgc3BlY2lmaWVkIGFuZCB3aWxsIG5vdCBiZSByb3VuZGVkIHRvIG5lYXJlc3Qgc21hbGxlciB2YWx1ZS4KK0l0IGRlZmF1bHRzIHRvIDAuCiBAZW5kIHRhYmxlCiAKIFRoZSBAdmFye291dF93fSwgQHZhcntvdXRfaH0sIEB2YXJ7eH0sIEB2YXJ7eX0gcGFyYW1ldGVycyBhcmUKQEAgLTQ5NDEsNyArNjc4NCw3IEBACiAKIEBpdGVtIGxpbWl0CiBTZXQgaGlnaGVyIGJsYWNrIHZhbHVlIHRocmVzaG9sZCwgd2hpY2ggY2FuIGJlIG9wdGlvbmFsbHkgc3BlY2lmaWVkCi1mcm9tIG5vdGhpbmcgKDApIHRvIGV2ZXJ5dGhpbmcgKDI1NSBmb3IgOGJpdCBiYXNlZCBmb3JtYXRzKS4gQW4gaW50ZW5zaXR5Citmcm9tIG5vdGhpbmcgKDApIHRvIGV2ZXJ5dGhpbmcgKDI1NSBmb3IgOC1iaXQgYmFzZWQgZm9ybWF0cykuIEFuIGludGVuc2l0eQogdmFsdWUgZ3JlYXRlciB0byB0aGUgc2V0IHZhbHVlIGlzIGNvbnNpZGVyZWQgbm9uLWJsYWNrLiBJdCBkZWZhdWx0cyB0byAyNC4KIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgdmFsdWUgYmV0d2VlbiAwLjAgYW5kIDEuMCB3aGljaCB3aWxsIGJlIHNjYWxlZCBkZXBlbmRpbmcKIG9uIHRoZSBiaXRkZXB0aCBvZiB0aGUgcGl4ZWwgZm9ybWF0LgpAQCAtNDk4NCwxMCArNjgyNyw2IEBACiBiZSBpbiB0aGUgQHZhcntbMDsxXX0gaW50ZXJ2YWwuICBJZiB0aGUgY29tcHV0ZWQgY3VydmVzIGhhcHBlbmVkIHRvIGdvIG91dHNpZGUKIHRoZSB2ZWN0b3Igc3BhY2VzLCB0aGUgdmFsdWVzIHdpbGwgYmUgY2xpcHBlZCBhY2NvcmRpbmdseS4KIAotSWYgdGhlcmUgaXMgbm8ga2V5IHBvaW50IGRlZmluZWQgaW4gQGNvZGV7eD0wfSwgdGhlIGZpbHRlciB3aWxsIGF1dG9tYXRpY2FsbHkKLWluc2VydCBhIEB2YXJ7KDA7MCl9IHBvaW50LiBJbiB0aGUgc2FtZSB3YXksIGlmIHRoZXJlIGlzIG5vIGtleSBwb2ludCBkZWZpbmVkCi1pbiBAY29kZXt4PTF9LCB0aGUgZmlsdGVyIHdpbGwgYXV0b21hdGljYWxseSBpbnNlcnQgYSBAdmFyeygxOzEpfSBwb2ludC4KLQogVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKIAogQHRhYmxlIEBvcHRpb24KQEAgLTUwMjgsNiArNjg2Nyw4IEBACiBAb3B0aW9ue2FsbH0gc2V0dGluZy4KIEBpdGVtIHBzZmlsZQogU3BlY2lmeSBhIFBob3Rvc2hvcCBjdXJ2ZXMgZmlsZSAoQGNvZGV7LmFjdn0pIHRvIGltcG9ydCB0aGUgc2V0dGluZ3MgZnJvbS4KK0BpdGVtIHBsb3QKK1NhdmUgR251cGxvdCBzY3JpcHQgb2YgdGhlIGN1cnZlcyBpbiBzcGVjaWZpZWQgZmlsZS4KIEBlbmQgdGFibGUKIAogVG8gYXZvaWQgc29tZSBmaWx0ZXJncmFwaCBzeW50YXggY29uZmxpY3RzLCBlYWNoIGtleSBwb2ludHMgbGlzdCBuZWVkIHRvIGJlCkBAIC01MDM5LDEzICs2ODgwLDEzIEBACiBAaXRlbQogSW5jcmVhc2Ugc2xpZ2h0bHkgdGhlIG1pZGRsZSBsZXZlbCBvZiBibHVlOgogQGV4YW1wbGUKLWN1cnZlcz1ibHVlPScwLjUvMC41OCcKK2N1cnZlcz1ibHVlPScwLzAgMC41LzAuNTggMS8xJwogQGVuZCBleGFtcGxlCiAKIEBpdGVtCiBWaW50YWdlIGVmZmVjdDoKIEBleGFtcGxlCi1jdXJ2ZXM9cj0nMC8wLjExIC40Mi8uNTEgMS8wLjk1JzpnPScwLjUwLzAuNDgnOmI9JzAvMC4yMiAuNDkvLjQ0IDEvMC44JworY3VydmVzPXI9JzAvMC4xMSAuNDIvLjUxIDEvMC45NSc6Zz0nMC8wIDAuNTAvMC40OCAxLzEnOmI9JzAvMC4yMiAuNDkvLjQ0IDEvMC44JwogQGVuZCBleGFtcGxlCiBIZXJlIHdlIG9idGFpbiB0aGUgZm9sbG93aW5nIGNvb3JkaW5hdGVzIGZvciBlYWNoIGNvbXBvbmVudHM6CiBAdGFibGUgQHZhcgpAQCAtNTA3MiwxMCArNjkxMyw1OCBAQAogQGl0ZW0KIFVzZSBhIFBob3Rvc2hvcCBwcmVzZXQgYW5kIHJlZGVmaW5lIHRoZSBwb2ludHMgb2YgdGhlIGdyZWVuIGNvbXBvbmVudDoKIEBleGFtcGxlCi1jdXJ2ZXM9cHNmaWxlPSdNeUN1cnZlc1ByZXNldHMvcHVycGxlLmFjdic6Z3JlZW49JzAuNDUvMC41MycKK2N1cnZlcz1wc2ZpbGU9J015Q3VydmVzUHJlc2V0cy9wdXJwbGUuYWN2JzpncmVlbj0nMC8wIDAuNDUvMC41MyAxLzEnCitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK0NoZWNrIG91dCB0aGUgY3VydmVzIG9mIHRoZSBAY29kZXtjcm9zc19wcm9jZXNzfSBwcm9maWxlIHVzaW5nIEBjb21tYW5ke2ZmbXBlZ30KK2FuZCBAY29tbWFuZHtnbnVwbG90fToKK0BleGFtcGxlCitmZm1wZWcgLWYgbGF2ZmkgLWkgY29sb3IgLXZmIGN1cnZlcz1jcm9zc19wcm9jZXNzOnBsb3Q9L3RtcC9jdXJ2ZXMucGx0IC1mcmFtZXM6diAxIC1mIG51bGwgLQorZ251cGxvdCAtcCAvdG1wL2N1cnZlcy5wbHQKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIGRhdGFzY29wZQorCitWaWRlbyBkYXRhIGFuYWx5c2lzIGZpbHRlci4KKworVGhpcyBmaWx0ZXIgc2hvd3MgaGV4YWRlY2ltYWwgcGl4ZWwgdmFsdWVzIG9mIHBhcnQgb2YgdmlkZW8uCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBzaXplLCBzCitTZXQgb3V0cHV0IHZpZGVvIHNpemUuCisKK0BpdGVtIHgKK1NldCB4IG9mZnNldCBmcm9tIHdoZXJlIHRvIHBpY2sgcGl4ZWxzLgorCitAaXRlbSB5CitTZXQgeSBvZmZzZXQgZnJvbSB3aGVyZSB0byBwaWNrIHBpeGVscy4KKworQGl0ZW0gbW9kZQorU2V0IHNjb3BlIG1vZGUsIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKK0B0YWJsZSBAc2FtcAorQGl0ZW0gbW9ubworRHJhdyBoZXhhZGVjaW1hbCBwaXhlbCB2YWx1ZXMgd2l0aCB3aGl0ZSBjb2xvciBvbiBibGFjayBiYWNrZ3JvdW5kLgorCitAaXRlbSBjb2xvcgorRHJhdyBoZXhhZGVjaW1hbCBwaXhlbCB2YWx1ZXMgd2l0aCBpbnB1dCB2aWRlbyBwaXhlbCBjb2xvciBvbiBibGFjaworYmFja2dyb3VuZC4KKworQGl0ZW0gY29sb3IyCitEcmF3IGhleGFkZWNpbWFsIHBpeGVsIHZhbHVlcyBvbiBjb2xvciBiYWNrZ3JvdW5kIHBpY2tlZCBmcm9tIGlucHV0IHZpZGVvLAordGhlIHRleHQgY29sb3IgaXMgcGlja2VkIGluIHN1Y2ggd2F5IHNvIGl0cyBhbHdheXMgdmlzaWJsZS4KK0BlbmQgdGFibGUKKworQGl0ZW0gYXhpcworRHJhdyByb3dzIGFuZCBjb2x1bW5zIG51bWJlcnMgb24gbGVmdCBhbmQgdG9wIG9mIHZpZGVvLgorCitAaXRlbSBvcGFjaXR5CitTZXQgYmFja2dyb3VuZCBvcGFjaXR5LgorQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBkY3Rkbm9pegogCiBEZW5vaXNlIGZyYW1lcyB1c2luZyAyRCBEQ1QgKGZyZXF1ZW5jeSBkb21haW4gZmlsdGVyaW5nKS4KQEAgLTUxNzMsMTEgKzcwNjIsMTYgQEAKIHdpbGwgcGljayBvbmx5IHBpeGVscyBvbiBzYW1lIHJvdyBhbmQgLVBJLzIgd2lsbCBwaWNrIG9ubHkgcGl4ZWxzIG9uIHNhbWUKIGNvbHVtbi4KIAotQGl0ZW0gYmx1cgorQGl0ZW0gYmx1ciwgYgogSWYgZW5hYmxlZCwgY3VycmVudCBwaXhlbCBpcyBjb21wYXJlZCB3aXRoIGF2ZXJhZ2UgdmFsdWUgb2YgYWxsIGZvdXIKIHN1cnJvdW5kaW5nIHBpeGVscy4gVGhlIGRlZmF1bHQgaXMgZW5hYmxlZC4gSWYgZGlzYWJsZWQgY3VycmVudCBwaXhlbCBpcwogY29tcGFyZWQgd2l0aCBhbGwgZm91ciBzdXJyb3VuZGluZyBwaXhlbHMuIFRoZSBwaXhlbCBpcyBjb25zaWRlcmVkIGJhbmRlZAogaWYgb25seSBhbGwgZm91ciBkaWZmZXJlbmNlcyB3aXRoIHN1cnJvdW5kaW5nIHBpeGVscyBhcmUgbGVzcyB0aGFuIHRocmVzaG9sZC4KKworQGl0ZW0gY291cGxpbmcsIGMKK0lmIGVuYWJsZWQsIGN1cnJlbnQgcGl4ZWwgaXMgY2hhbmdlZCBpZiBhbmQgb25seSBpZiBhbGwgcGl4ZWwgY29tcG9uZW50cyBhcmUgYmFuZGVkLAorZS5nLiBiYW5kaW5nIGRldGVjdGlvbiB0aHJlc2hvbGQgaXMgdHJpZ2dlcmVkIGZvciBhbGwgY29sb3IgY29tcG9uZW50cy4KK1RoZSBkZWZhdWx0IGlzIGRpc2FibGVkLgogQGVuZCB0YWJsZQogCiBAYW5jaG9ye2RlY2ltYXRlfQpAQCAtNTIyMCw2ICs3MTE0LDI5IEBACiBAY29kZXsxfS4KIEBlbmQgdGFibGUKIAorQHNlY3Rpb24gZGVjb252b2x2ZQorCitBcHBseSAyRCBkZWNvbnZvbHV0aW9uIG9mIHZpZGVvIHN0cmVhbSBpbiBmcmVxdWVuY3kgZG9tYWluIHVzaW5nIHNlY29uZCBzdHJlYW0KK2FzIGltcHVsc2UuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBwbGFuZXMKK1NldCB3aGljaCBwbGFuZXMgdG8gcHJvY2Vzcy4KKworQGl0ZW0gaW1wdWxzZQorU2V0IHdoaWNoIGltcHVsc2UgdmlkZW8gZnJhbWVzIHdpbGwgYmUgcHJvY2Vzc2VkLCBjYW4gYmUgQHZhcntmaXJzdH0KK29yIEB2YXJ7YWxsfS4gRGVmYXVsdCBpcyBAdmFye2FsbH0uCisKK0BpdGVtIG5vaXNlCitTZXQgbm9pc2Ugd2hlbiBkb2luZyBkaXZpc2lvbnMuIERlZmF1bHQgaXMgQHZhcnswLjAwMDAwMDF9LiBVc2VmdWwgd2hlbiB3aWR0aAorYW5kIGhlaWdodCBhcmUgbm90IHNhbWUgYW5kIG5vdCBwb3dlciBvZiAyIG9yIGlmIHN0cmVhbSBwcmlvciB0byBjb252b2x2aW5nCitoYWQgbm9pc2UuCitAZW5kIHRhYmxlCisKK1RoZSBAY29kZXtkZWNvbnZvbHZlfSBmaWx0ZXIgYWxzbyBzdXBwb3J0cyB0aGUgQHJlZntmcmFtZXN5bmN9IG9wdGlvbnMuCisKIEBzZWN0aW9uIGRlZmxhdGUKIAogQXBwbHkgZGVmbGF0ZSBlZmZlY3QgdG8gdGhlIHZpZGVvLgpAQCAtNTIzOCw2ICs3MTU1LDQ3IEBACiBJZiAwLCBwbGFuZSB3aWxsIHJlbWFpbiB1bmNoYW5nZWQuCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIGRlZmxpY2tlcgorCitSZW1vdmUgdGVtcG9yYWwgZnJhbWUgbHVtaW5hbmNlIHZhcmlhdGlvbnMuCisKK0l0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gc2l6ZSwgcworU2V0IG1vdmluZy1hdmVyYWdlIGZpbHRlciBzaXplIGluIGZyYW1lcy4gRGVmYXVsdCBpcyA1LiBBbGxvd2VkIHJhbmdlIGlzIDIgLSAxMjkuCisKK0BpdGVtIG1vZGUsIG0KK1NldCBhdmVyYWdpbmcgbW9kZSB0byBzbW9vdGggdGVtcG9yYWwgbHVtaW5hbmNlIHZhcmlhdGlvbnMuCisKK0F2YWlsYWJsZSB2YWx1ZXMgYXJlOgorQHRhYmxlIEBzYW1wCitAaXRlbSBhbQorQXJpdGhtZXRpYyBtZWFuCisKK0BpdGVtIGdtCitHZW9tZXRyaWMgbWVhbgorCitAaXRlbSBobQorSGFybW9uaWMgbWVhbgorCitAaXRlbSBxbQorUXVhZHJhdGljIG1lYW4KKworQGl0ZW0gY20KK0N1YmljIG1lYW4KKworQGl0ZW0gcG0KK1Bvd2VyIG1lYW4KKworQGl0ZW0gbWVkaWFuCitNZWRpYW4KK0BlbmQgdGFibGUKKworQGl0ZW0gYnlwYXNzCitEbyBub3QgYWN0dWFsbHkgbW9kaWZ5IGZyYW1lLiBVc2VmdWwgd2hlbiBvbmUgb25seSB3YW50cyBtZXRhZGF0YS4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gZGVqdWRkZXIKIAogUmVtb3ZlIGp1ZGRlciBwcm9kdWNlZCBieSBwYXJ0aWFsbHkgaW50ZXJsYWNlZCB0ZWxlY2luZWQgY29udGVudC4KQEAgLTUzOTMsMTAgKzczNTEsNDEgQEAKIElmIHNldCB0aGVuIGEgZGV0YWlsZWQgbG9nIG9mIHRoZSBtb3Rpb24gc2VhcmNoIGlzIHdyaXR0ZW4gdG8gdGhlCiBzcGVjaWZpZWQgZmlsZS4KIAotQGl0ZW0gb3BlbmNsCi1JZiBzZXQgdG8gMSwgc3BlY2lmeSB1c2luZyBPcGVuQ0wgY2FwYWJpbGl0aWVzLCBvbmx5IGF2YWlsYWJsZSBpZgotRkZtcGVnIHdhcyBjb25maWd1cmVkIHdpdGggQGNvZGV7LS1lbmFibGUtb3BlbmNsfS4gRGVmYXVsdCB2YWx1ZSBpcyAwLgorQGVuZCB0YWJsZQogCitAc2VjdGlvbiBkZXNwaWxsCisKK1JlbW92ZSB1bndhbnRlZCBjb250YW1pbmF0aW9uIG9mIGZvcmVncm91bmQgY29sb3JzLCBjYXVzZWQgYnkgcmVmbGVjdGVkIGNvbG9yIG9mCitncmVlbnNjcmVlbiBvciBibHVlc2NyZWVuLgorCitUaGlzIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHR5cGUKK1NldCB3aGF0IHR5cGUgb2YgZGVzcGlsbCB0byB1c2UuCisKK0BpdGVtIG1peAorU2V0IGhvdyBzcGlsbG1hcCB3aWxsIGJlIGdlbmVyYXRlZC4KKworQGl0ZW0gZXhwYW5kCitTZXQgaG93IG11Y2ggdG8gZ2V0IHJpZCBvZiBzdGlsbCByZW1haW5pbmcgc3BpbGwuCisKK0BpdGVtIHJlZAorQ29udHJvbHMgYW1vdW50IG9mIHJlZCBpbiBzcGlsbCBhcmVhLgorCitAaXRlbSBncmVlbgorQ29udHJvbHMgYW1vdW50IG9mIGdyZWVuIGluIHNwaWxsIGFyZWEuCitTaG91bGQgYmUgLTEgZm9yIGdyZWVuc2NyZWVuLgorCitAaXRlbSBibHVlCitDb250cm9scyBhbW91bnQgb2YgYmx1ZSBpbiBzcGlsbCBhcmVhLgorU2hvdWxkIGJlIC0xIGZvciBibHVlc2NyZWVuLgorCitAaXRlbSBicmlnaHRuZXNzCitDb250cm9scyBicmlnaHRuZXNzIG9mIHNwaWxsIGFyZWEsIHByZXNlcnZpbmcgY29sb3JzLgorCitAaXRlbSBhbHBoYQorTW9kaWZ5IGFscGhhIGZyb20gZ2VuZXJhdGVkIHNwaWxsbWFwLgogQGVuZCB0YWJsZQogCiBAc2VjdGlvbiBkZXRlbGVjaW5lCkBAIC01NDg0LDYgKzc0NzMsOSBAQAogCiBAaXRlbSB3cmFwCiBPdXQgb2YgcmFuZ2UgcGl4ZWxzIGFyZSB3cmFwcGVkIHNvIHRoZXkgcG9pbnQgdG8gcGl4ZWxzIG9mIG90aGVyIHNpZGUuCisKK0BpdGVtIG1pcnJvcgorT3V0IG9mIHJhbmdlIHBpeGVscyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggbWlycm9yZWQgcGl4ZWxzLgogQGVuZCB0YWJsZQogRGVmYXVsdCBpcyBAc2FtcHtzbWVhcn0uCiAKQEAgLTU1MjMsMTQgKzc1MTUsMjAgQEAKIAogQGl0ZW0gY29sb3IsIGMKIFNwZWNpZnkgdGhlIGNvbG9yIG9mIHRoZSBib3ggdG8gd3JpdGUuIEZvciB0aGUgZ2VuZXJhbCBzeW50YXggb2YgdGhpcyBvcHRpb24sCi1jaGVjayB0aGUgIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLiBJZiB0aGUgc3BlY2lhbAorY2hlY2sgdGhlIEByZWZ7Y29sb3Igc3ludGF4LCwiQ29sb3IiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwsZmZtcGVnLXV0aWxzfS4gSWYgdGhlIHNwZWNpYWwKIHZhbHVlIEBjb2Rle2ludmVydH0gaXMgdXNlZCwgdGhlIGJveCBlZGdlIGNvbG9yIGlzIHRoZSBzYW1lIGFzIHRoZQogdmlkZW8gd2l0aCBpbnZlcnRlZCBsdW1hLgogCiBAaXRlbSB0aGlja25lc3MsIHQKLVRoZSBleHByZXNzaW9uIHdoaWNoIHNldHMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgYm94IGVkZ2UuIERlZmF1bHQgdmFsdWUgaXMgQGNvZGV7M30uCitUaGUgZXhwcmVzc2lvbiB3aGljaCBzZXRzIHRoZSB0aGlja25lc3Mgb2YgdGhlIGJveCBlZGdlLgorQSB2YWx1ZSBvZiBAY29kZXtmaWxsfSB3aWxsIGNyZWF0ZSBhIGZpbGxlZCBib3guIERlZmF1bHQgdmFsdWUgaXMgQGNvZGV7M30uCiAKIFNlZSBiZWxvdyBmb3IgdGhlIGxpc3Qgb2YgYWNjZXB0ZWQgY29uc3RhbnRzLgorCitAaXRlbSByZXBsYWNlCitBcHBsaWNhYmxlIGlmIHRoZSBpbnB1dCBoYXMgYWxwaGEuIFdpdGggdmFsdWUgQGNvZGV7MX0sIHRoZSBwaXhlbHMgb2YgdGhlIHBhaW50ZWQgYm94Cit3aWxsIG92ZXJ3cml0ZSB0aGUgdmlkZW8ncyBjb2xvciBhbmQgYWxwaGEgcGl4ZWxzLgorRGVmYXVsdCBpcyBAY29kZXswfSwgd2hpY2ggY29tcG9zaXRlcyB0aGUgYm94IG9udG8gdGhlIGlucHV0LCBsZWF2aW5nIHRoZSB2aWRlbydzIGFscGhhIGludGFjdC4KIEBlbmQgdGFibGUKIAogVGhlIHBhcmFtZXRlcnMgZm9yIEB2YXJ7eH0sIEB2YXJ7eX0sIEB2YXJ7d30gYW5kIEB2YXJ7aH0gYW5kIEB2YXJ7dH0gYXJlIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgdGhlCkBAIC01NTkxLDcgKzc1ODksNyBAQAogQGl0ZW0KIEZpbGwgdGhlIGJveCB3aXRoIHBpbmsgY29sb3I6CiBAZXhhbXBsZQotZHJhd2JveD14PTEwOnk9MTA6dz0xMDA6aD0xMDA6Y29sb3I9cGlua0BAMC41OnQ9bWF4CitkcmF3Ym94PXg9MTA6eT0xMDp3PTEwMDpoPTEwMDpjb2xvcj1waW5rQEAwLjU6dD1maWxsCiBAZW5kIGV4YW1wbGUKIAogQGl0ZW0KQEAgLTU2MDEsMTA4ICs3NTk5LDYgQEAKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKLUBzZWN0aW9uIGRyYXdncmFwaCwgYWRyYXdncmFwaAotCi1EcmF3IGEgZ3JhcGggdXNpbmcgaW5wdXQgdmlkZW8gb3IgYXVkaW8gbWV0YWRhdGEuCi0KLUl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgotCi1AdGFibGUgQG9wdGlvbgotQGl0ZW0gbTEKLVNldCAxc3QgZnJhbWUgbWV0YWRhdGEga2V5IGZyb20gd2hpY2ggbWV0YWRhdGEgdmFsdWVzIHdpbGwgYmUgdXNlZCB0byBkcmF3IGEgZ3JhcGguCi0KLUBpdGVtIGZnMQotU2V0IDFzdCBmb3JlZ3JvdW5kIGNvbG9yIGV4cHJlc3Npb24uCi0KLUBpdGVtIG0yCi1TZXQgMm5kIGZyYW1lIG1ldGFkYXRhIGtleSBmcm9tIHdoaWNoIG1ldGFkYXRhIHZhbHVlcyB3aWxsIGJlIHVzZWQgdG8gZHJhdyBhIGdyYXBoLgotCi1AaXRlbSBmZzIKLVNldCAybmQgZm9yZWdyb3VuZCBjb2xvciBleHByZXNzaW9uLgotCi1AaXRlbSBtMwotU2V0IDNyZCBmcmFtZSBtZXRhZGF0YSBrZXkgZnJvbSB3aGljaCBtZXRhZGF0YSB2YWx1ZXMgd2lsbCBiZSB1c2VkIHRvIGRyYXcgYSBncmFwaC4KLQotQGl0ZW0gZmczCi1TZXQgM3JkIGZvcmVncm91bmQgY29sb3IgZXhwcmVzc2lvbi4KLQotQGl0ZW0gbTQKLVNldCA0dGggZnJhbWUgbWV0YWRhdGEga2V5IGZyb20gd2hpY2ggbWV0YWRhdGEgdmFsdWVzIHdpbGwgYmUgdXNlZCB0byBkcmF3IGEgZ3JhcGguCi0KLUBpdGVtIGZnNAotU2V0IDR0aCBmb3JlZ3JvdW5kIGNvbG9yIGV4cHJlc3Npb24uCi0KLUBpdGVtIG1pbgotU2V0IG1pbmltYWwgdmFsdWUgb2YgbWV0YWRhdGEgdmFsdWUuCi0KLUBpdGVtIG1heAotU2V0IG1heGltYWwgdmFsdWUgb2YgbWV0YWRhdGEgdmFsdWUuCi0KLUBpdGVtIGJnCi1TZXQgZ3JhcGggYmFja2dyb3VuZCBjb2xvci4gRGVmYXVsdCBpcyB3aGl0ZS4KLQotQGl0ZW0gbW9kZQotU2V0IGdyYXBoIG1vZGUuCi0KLUF2YWlsYWJsZSB2YWx1ZXMgZm9yIG1vZGUgaXM6Ci1AdGFibGUgQHNhbXAKLUBpdGVtIGJhcgotQGl0ZW0gZG90Ci1AaXRlbSBsaW5lCi1AZW5kIHRhYmxlCi0KLURlZmF1bHQgaXMgQGNvZGV7bGluZX0uCi0KLUBpdGVtIHNsaWRlCi1TZXQgc2xpZGUgbW9kZS4KLQotQXZhaWxhYmxlIHZhbHVlcyBmb3Igc2xpZGUgaXM6Ci1AdGFibGUgQHNhbXAKLUBpdGVtIGZyYW1lCi1EcmF3IG5ldyBmcmFtZSB3aGVuIHJpZ2h0IGJvcmRlciBpcyByZWFjaGVkLgotCi1AaXRlbSByZXBsYWNlCi1SZXBsYWNlIG9sZCBjb2x1bW5zIHdpdGggbmV3IG9uZXMuCi0KLUBpdGVtIHNjcm9sbAotU2Nyb2xsIGZyb20gcmlnaHQgdG8gbGVmdC4KLQotQGl0ZW0gcnNjcm9sbAotU2Nyb2xsIGZyb20gbGVmdCB0byByaWdodC4KLUBlbmQgdGFibGUKLQotRGVmYXVsdCBpcyBAY29kZXtmcmFtZX0uCi0KLUBpdGVtIHNpemUKLVNldCBzaXplIG9mIGdyYXBoIHZpZGVvLiBGb3IgdGhlIHN5bnRheCBvZiB0aGlzIG9wdGlvbiwgY2hlY2sgdGhlCi1AcmVme3ZpZGVvIHNpemUgc3ludGF4LCwiVmlkZW8gc2l6ZSIgc2VjdGlvbiBpbiB0aGUgZmZtcGVnLXV0aWxzIG1hbnVhbCxmZm1wZWctdXRpbHN9LgotVGhlIGRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7OTAweDI1Nn0uCi0KLVRoZSBmb3JlZ3JvdW5kIGNvbG9yIGV4cHJlc3Npb25zIGNhbiB1c2UgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6Ci1AdGFibGUgQG9wdGlvbgotQGl0ZW0gTUlOCi1NaW5pbWFsIHZhbHVlIG9mIG1ldGFkYXRhIHZhbHVlLgotCi1AaXRlbSBNQVgKLU1heGltYWwgdmFsdWUgb2YgbWV0YWRhdGEgdmFsdWUuCi0KLUBpdGVtIFZBTAotQ3VycmVudCBtZXRhZGF0YSBrZXkgdmFsdWUuCi1AZW5kIHRhYmxlCi0KLVRoZSBjb2xvciBpcyBkZWZpbmVkIGFzIDB4QUFCQkdHUlIuCi1AZW5kIHRhYmxlCi0KLUV4YW1wbGUgdXNpbmcgbWV0YWRhdGEgZnJvbSBAcmVme3NpZ25hbHN0YXRzfSBmaWx0ZXI6Ci1AZXhhbXBsZQotc2lnbmFsc3RhdHMsZHJhd2dyYXBoPWxhdmZpLnNpZ25hbHN0YXRzLllBVkc6bWluPTA6bWF4PTI1NQotQGVuZCBleGFtcGxlCi0KLUV4YW1wbGUgdXNpbmcgbWV0YWRhdGEgZnJvbSBAcmVme2VidXIxMjh9IGZpbHRlcjoKLUBleGFtcGxlCi1lYnVyMTI4PW1ldGFkYXRhPTEsYWRyYXdncmFwaD1sYXZmaS5yMTI4Lk06bWluPS0xMjA6bWF4PTUKLUBlbmQgZXhhbXBsZQotCiBAc2VjdGlvbiBkcmF3Z3JpZAogCiBEcmF3IGEgZ3JpZCBvbiB0aGUgaW5wdXQgaW1hZ2UuCkBAIC01NzIyLDcgKzc2MTgsNyBAQAogCiBAaXRlbSBjb2xvciwgYwogU3BlY2lmeSB0aGUgY29sb3Igb2YgdGhlIGdyaWQuIEZvciB0aGUgZ2VuZXJhbCBzeW50YXggb2YgdGhpcyBvcHRpb24sCi1jaGVjayB0aGUgIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLiBJZiB0aGUgc3BlY2lhbAorY2hlY2sgdGhlIEByZWZ7Y29sb3Igc3ludGF4LCwiQ29sb3IiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwsZmZtcGVnLXV0aWxzfS4gSWYgdGhlIHNwZWNpYWwKIHZhbHVlIEBjb2Rle2ludmVydH0gaXMgdXNlZCwgdGhlIGdyaWQgY29sb3IgaXMgdGhlIHNhbWUgYXMgdGhlCiB2aWRlbyB3aXRoIGludmVydGVkIGx1bWEuCiAKQEAgLTU3MzAsNiArNzYyNiwxMSBAQAogVGhlIGV4cHJlc3Npb24gd2hpY2ggc2V0cyB0aGUgdGhpY2tuZXNzIG9mIHRoZSBncmlkIGxpbmUuIERlZmF1bHQgdmFsdWUgaXMgQGNvZGV7MX0uCiAKIFNlZSBiZWxvdyBmb3IgdGhlIGxpc3Qgb2YgYWNjZXB0ZWQgY29uc3RhbnRzLgorCitAaXRlbSByZXBsYWNlCitBcHBsaWNhYmxlIGlmIHRoZSBpbnB1dCBoYXMgYWxwaGEuIFdpdGggQGNvZGV7MX0gdGhlIHBpeGVscyBvZiB0aGUgcGFpbnRlZCBncmlkCit3aWxsIG92ZXJ3cml0ZSB0aGUgdmlkZW8ncyBjb2xvciBhbmQgYWxwaGEgcGl4ZWxzLgorRGVmYXVsdCBpcyBAY29kZXswfSwgd2hpY2ggY29tcG9zaXRlcyB0aGUgZ3JpZCBvbnRvIHRoZSBpbnB1dCwgbGVhdmluZyB0aGUgdmlkZW8ncyBhbHBoYSBpbnRhY3QuCiBAZW5kIHRhYmxlCiAKIFRoZSBwYXJhbWV0ZXJzIGZvciBAdmFye3h9LCBAdmFye3l9LCBAdmFye3d9IGFuZCBAdmFye2h9IGFuZCBAdmFye3R9IGFyZSBleHByZXNzaW9ucyBjb250YWluaW5nIHRoZQpAQCAtNTgxMywxNyArNzcxNCwyMSBAQAogCiBAaXRlbSBib3hjb2xvcgogVGhlIGNvbG9yIHRvIGJlIHVzZWQgZm9yIGRyYXdpbmcgYm94IGFyb3VuZCB0ZXh0LiBGb3IgdGhlIHN5bnRheCBvZiB0aGlzCi1vcHRpb24sIGNoZWNrIHRoZSAiQ29sb3IiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwuCitvcHRpb24sIGNoZWNrIHRoZSBAcmVme2NvbG9yIHN5bnRheCwsIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLGZmbXBlZy11dGlsc30uCiAKIFRoZSBkZWZhdWx0IHZhbHVlIG9mIEB2YXJ7Ym94Y29sb3J9IGlzICJ3aGl0ZSIuCiAKK0BpdGVtIGxpbmVfc3BhY2luZworU2V0IHRoZSBsaW5lIHNwYWNpbmcgaW4gcGl4ZWxzIG9mIHRoZSBib3JkZXIgdG8gYmUgZHJhd24gYXJvdW5kIHRoZSBib3ggdXNpbmcgQHZhcntib3h9LgorVGhlIGRlZmF1bHQgdmFsdWUgb2YgQHZhcntsaW5lX3NwYWNpbmd9IGlzIDAuCisKIEBpdGVtIGJvcmRlcncKIFNldCB0aGUgd2lkdGggb2YgdGhlIGJvcmRlciB0byBiZSBkcmF3biBhcm91bmQgdGhlIHRleHQgdXNpbmcgQHZhcntib3JkZXJjb2xvcn0uCiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAdmFye2JvcmRlcnd9IGlzIDAuCiAKIEBpdGVtIGJvcmRlcmNvbG9yCiBTZXQgdGhlIGNvbG9yIHRvIGJlIHVzZWQgZm9yIGRyYXdpbmcgYm9yZGVyIGFyb3VuZCB0ZXh0LiBGb3IgdGhlIHN5bnRheCBvZiB0aGlzCi1vcHRpb24sIGNoZWNrIHRoZSAiQ29sb3IiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwuCitvcHRpb24sIGNoZWNrIHRoZSBAcmVme2NvbG9yIHN5bnRheCwsIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLGZmbXBlZy11dGlsc30uCiAKIFRoZSBkZWZhdWx0IHZhbHVlIG9mIEB2YXJ7Ym9yZGVyY29sb3J9IGlzICJibGFjayIuCiAKQEAgLTU4MzMsMTIgKzc3MzgsMTggQEAKIEBjb2Rle25vcm1hbH0gKGRlZmF1bHQpLiBTZWUgdGhlIEByZWZ7ZHJhd3RleHRfZXhwYW5zaW9uLCBUZXh0IGV4cGFuc2lvbn0gc2VjdGlvbgogYmVsb3cgZm9yIGRldGFpbHMuCiAKK0BpdGVtIGJhc2V0aW1lCitTZXQgYSBzdGFydCB0aW1lIGZvciB0aGUgY291bnQuIFZhbHVlIGlzIGluIG1pY3Jvc2Vjb25kcy4gT25seSBhcHBsaWVkCitpbiB0aGUgZGVwcmVjYXRlZCBzdHJmdGltZSBleHBhbnNpb24gbW9kZS4gVG8gZW11bGF0ZSBpbiBub3JtYWwgZXhwYW5zaW9uCittb2RlIHVzZSB0aGUgQGNvZGV7cHRzfSBmdW5jdGlvbiwgc3VwcGx5aW5nIHRoZSBzdGFydCB0aW1lIChpbiBzZWNvbmRzKQorYXMgdGhlIHNlY29uZCBhcmd1bWVudC4KKwogQGl0ZW0gZml4X2JvdW5kcwogSWYgdHJ1ZSwgY2hlY2sgYW5kIGZpeCB0ZXh0IGNvb3JkcyB0byBhdm9pZCBjbGlwcGluZy4KIAogQGl0ZW0gZm9udGNvbG9yCiBUaGUgY29sb3IgdG8gYmUgdXNlZCBmb3IgZHJhd2luZyBmb250cy4gRm9yIHRoZSBzeW50YXggb2YgdGhpcyBvcHRpb24sIGNoZWNrCi10aGUgIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLgordGhlIEByZWZ7Y29sb3Igc3ludGF4LCwiQ29sb3IiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwsZmZtcGVnLXV0aWxzfS4KIAogVGhlIGRlZmF1bHQgdmFsdWUgb2YgQHZhcntmb250Y29sb3J9IGlzICJibGFjayIuCiAKQEAgLTU4NTQsMTUgKzc3NjUsMTIgQEAKIFRoZSBmb250IGZpbGUgdG8gYmUgdXNlZCBmb3IgZHJhd2luZyB0ZXh0LiBUaGUgcGF0aCBtdXN0IGJlIGluY2x1ZGVkLgogVGhpcyBwYXJhbWV0ZXIgaXMgbWFuZGF0b3J5IGlmIHRoZSBmb250Y29uZmlnIHN1cHBvcnQgaXMgZGlzYWJsZWQuCiAKLUBpdGVtIGRyYXcKLVRoaXMgb3B0aW9uIGRvZXMgbm90IGV4aXN0LCBwbGVhc2Ugc2VlIHRoZSB0aW1lbGluZSBzeXN0ZW0KLQogQGl0ZW0gYWxwaGEKIERyYXcgdGhlIHRleHQgYXBwbHlpbmcgYWxwaGEgYmxlbmRpbmcuIFRoZSB2YWx1ZSBjYW4KLWJlIGVpdGhlciBhIG51bWJlciBiZXR3ZWVuIDAuMCBhbmQgMS4wCi1UaGUgZXhwcmVzc2lvbiBhY2NlcHRzIHRoZSBzYW1lIHZhcmlhYmxlcyBAdmFye3gsIHl9IGRvLgorYmUgYSBudW1iZXIgYmV0d2VlbiAwLjAgYW5kIDEuMC4KK1RoZSBleHByZXNzaW9uIGFjY2VwdHMgdGhlIHNhbWUgdmFyaWFibGVzIEB2YXJ7eCwgeX0gYXMgd2VsbC4KIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDEuCi1QbGVhc2Ugc2VlIGZvbnRjb2xvcl9leHByCitQbGVhc2Ugc2VlIEB2YXJ7Zm9udGNvbG9yX2V4cHJ9LgogCiBAaXRlbSBmb250c2l6ZQogVGhlIGZvbnQgc2l6ZSB0byBiZSB1c2VkIGZvciBkcmF3aW5nIHRleHQuCkBAIC01OTA0LDcgKzc4MTIsOCBAQAogCiBAaXRlbSBzaGFkb3djb2xvcgogVGhlIGNvbG9yIHRvIGJlIHVzZWQgZm9yIGRyYXdpbmcgYSBzaGFkb3cgYmVoaW5kIHRoZSBkcmF3biB0ZXh0LiBGb3IgdGhlCi1zeW50YXggb2YgdGhpcyBvcHRpb24sIGNoZWNrIHRoZSAiQ29sb3IiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwuCitzeW50YXggb2YgdGhpcyBvcHRpb24sIGNoZWNrIHRoZSBAcmVme2NvbG9yIHN5bnRheCwsIkNvbG9yIiBzZWN0aW9uIGluIHRoZQorZmZtcGVnLXV0aWxzIG1hbnVhbCxmZm1wZWctdXRpbHN9LgogCiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAdmFye3NoYWRvd2NvbG9yfSBpcyAiYmxhY2siLgogCkBAIC01OTI4LDcgKzc4MzcsMTMgQEAKIG9wdGlvbiBtdXN0IGJlIHNwZWNpZmllZC4KIAogQGl0ZW0gdGltZWNvZGVfcmF0ZSwgcmF0ZSwgcgotU2V0IHRoZSB0aW1lY29kZSBmcmFtZSByYXRlICh0aW1lY29kZSBvbmx5KS4KK1NldCB0aGUgdGltZWNvZGUgZnJhbWUgcmF0ZSAodGltZWNvZGUgb25seSkuIFZhbHVlIHdpbGwgYmUgcm91bmRlZCB0byBuZWFyZXN0CitpbnRlZ2VyLiBNaW5pbXVtIHZhbHVlIGlzICIxIi4KK0Ryb3AtZnJhbWUgdGltZWNvZGUgaXMgc3VwcG9ydGVkIGZvciBmcmFtZSByYXRlcyAzMCAmIDYwLgorCitAaXRlbSB0YzI0aG1heAorSWYgc2V0IHRvIDEsIHRoZSBvdXRwdXQgb2YgdGhlIHRpbWVjb2RlIG9wdGlvbiB3aWxsIHdyYXAgYXJvdW5kIGF0IDI0IGhvdXJzLgorRGVmYXVsdCBpcyAwIChkaXNhYmxlZCkuCiAKIEBpdGVtIHRleHQKIFRoZSB0ZXh0IHN0cmluZyB0byBiZSBkcmF3bi4gVGhlIHRleHQgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIFVURi04CkBAIC02MDQ1LDcgKzc5NjAsNyBAQAogVGhlIGJhY2tzbGFzaCBjaGFyYWN0ZXIgQHNhbXB7XH0sIGZvbGxvd2VkIGJ5IGFueSBjaGFyYWN0ZXIsIGFsd2F5cyBleHBhbmRzIHRvCiB0aGUgc2Vjb25kIGNoYXJhY3Rlci4KIAotU2VxdWVuY2Ugb2YgdGhlIGZvcm0gQGNvZGV7JUB7Li4uQH19IGFyZSBleHBhbmRlZC4gVGhlIHRleHQgYmV0d2VlbiB0aGUKK1NlcXVlbmNlcyBvZiB0aGUgZm9ybSBAY29kZXslQHsuLi5AfX0gYXJlIGV4cGFuZGVkLiBUaGUgdGV4dCBiZXR3ZWVuIHRoZQogYnJhY2VzIGlzIGEgZnVuY3Rpb24gbmFtZSwgcG9zc2libHkgZm9sbG93ZWQgYnkgYXJndW1lbnRzIHNlcGFyYXRlZCBieSAnOicuCiBJZiB0aGUgYXJndW1lbnRzIGNvbnRhaW4gc3BlY2lhbCBjaGFyYWN0ZXJzIG9yIGRlbGltaXRlcnMgKCc6JyBvciAnQH0nKSwKIHRoZXkgc2hvdWxkIGJlIGVzY2FwZWQuCkBAIC02MDg5LDcgKzgwMDQsMTIgQEAKIEl0IGNhbiBhY2NlcHQgYW4gYXJndW1lbnQ6IGEgc3RyZnRpbWUoKSBmb3JtYXQgc3RyaW5nLgogCiBAaXRlbSBtZXRhZGF0YQotRnJhbWUgbWV0YWRhdGEuIEl0IG11c3QgdGFrZSBvbmUgYXJndW1lbnQgc3BlY2lmeWluZyBtZXRhZGF0YSBrZXkuCitGcmFtZSBtZXRhZGF0YS4gVGFrZXMgb25lIG9yIHR3byBhcmd1bWVudHMuCisKK1RoZSBmaXJzdCBhcmd1bWVudCBpcyBtYW5kYXRvcnkgYW5kIHNwZWNpZmllcyB0aGUgbWV0YWRhdGEga2V5LgorCitUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIG9wdGlvbmFsIGFuZCBzcGVjaWZpZXMgYSBkZWZhdWx0IHZhbHVlLCB1c2VkIHdoZW4gdGhlCittZXRhZGF0YSBrZXkgaXMgbm90IGZvdW5kIG9yIGVtcHR5LgogCiBAaXRlbSBuLCBmcmFtZV9udW0KIFRoZSBmcmFtZSBudW1iZXIsIHN0YXJ0aW5nIGZyb20gMC4KQEAgLTYxNDcsNiArODA2NywxMiBAQAogQGVuZCBleGFtcGxlCiAKIEBpdGVtCitTaG93IHRoZSB0ZXh0IGF0IGEgcmFuZG9tIHBvc2l0aW9uLCBzd2l0Y2hpbmcgdG8gYSBuZXcgcG9zaXRpb24gZXZlcnkgMzAgc2Vjb25kczoKK0BleGFtcGxlCitkcmF3dGV4dD0iZm9udHNpemU9MzA6Zm9udGZpbGU9RnJlZVNlcmlmLnR0Zjp0ZXh0PSdoZWxsbyB3b3JsZCc6eD1pZihlcShtb2QodFwsMzApXCwwKVwscmFuZCgwXCwody10ZXh0X3cpKVwseCk6eT1pZihlcShtb2QodFwsMzApXCwwKVwscmFuZCgwXCwoaC10ZXh0X2gpKVwseSkiCitAZW5kIGV4YW1wbGUKKworQGl0ZW0KIFNob3cgYSB0ZXh0IGxpbmUgc2xpZGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQgaW4gdGhlIGxhc3Qgcm93IG9mIHRoZSB2aWRlbwogZnJhbWUuIFRoZSBmaWxlIEBmaWxle0xPTkdfTElORX0gaXMgYXNzdW1lZCB0byBjb250YWluIGEgc2luZ2xlIGxpbmUKIHdpdGggbm8gbmV3bGluZXMuCkBAIC02MTk2LDYgKzgxMjIsMTQgQEAKIGZmcGxheSAtZiBsYXZmaSAiY29sb3IsZHJhd3RleHQ9dGV4dD1URVNUOmZvbnRzaXplPTUwOmZvbnRmaWxlPUZyZWVTZXJpZi50dGY6Zm9udGNvbG9yX2V4cHI9ZmYwMDAwJUB7ZWlmXFxcXDogY2xpcCgyNTUqKDEqYmV0d2Vlbih0XFwsICREUyArICRGSURcXCwgJERFIC0gJEZPRCkgKyAoKHQgLSAkRFMpLyRGSUQpKmJldHdlZW4odFxcLCAkRFNcXCwgJERTICsgJEZJRCkgKyAoLSh0IC0gJERFKS8kRk9EKSpiZXR3ZWVuKHRcXCwgJERFIC0gJEZPRFxcLCAkREUpIClcXCwgMFxcLCAyNTUpIFxcXFw6IHhcXFxcOiAyIEB9IgogQGVuZCBleGFtcGxlCiAKK0BpdGVtCitIb3Jpem9udGFsbHkgYWxpZ24gbXVsdGlwbGUgc2VwYXJhdGUgdGV4dHMuIE5vdGUgdGhhdCBAb3B0aW9ue21heF9nbHlwaF9hfQorYW5kIHRoZSBAb3B0aW9ue2ZvbnRzaXplfSB2YWx1ZSBhcmUgaW5jbHVkZWQgaW4gdGhlIEBvcHRpb257eX0gb2Zmc2V0LgorQGV4YW1wbGUKK2RyYXd0ZXh0PWZvbnRmaWxlPUZyZWVTYW5zLnR0Zjp0ZXh0PURPRzpmb250c2l6ZT0yNDp4PTEwOnk9MjArMjQtbWF4X2dseXBoX2EsCitkcmF3dGV4dD1mb250ZmlsZT1GcmVlU2Fucy50dGY6dGV4dD1jb3c6Zm9udHNpemU9MjQ6eD04MDp5PTIwKzI0LW1heF9nbHlwaF9hCitAZW5kIGV4YW1wbGUKKwogQGVuZCBpdGVtaXplCiAKIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGxpYmZyZWV0eXBlLCBjaGVjazoKQEAgLTY0NjQsNiArODM5OCwyMCBAQAogbGVuZ3RoIGdyZWF0ZXIgdGhhbiAyNTYuCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIGVudHJvcHkKKworTWVhc3VyZSBncmF5bGV2ZWwgZW50cm9weSBpbiBoaXN0b2dyYW0gb2YgY29sb3IgY2hhbm5lbHMgb2YgdmlkZW8gZnJhbWVzLgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIG1vZGUKK0NhbiBiZSBlaXRoZXIgQHZhcntub3JtYWx9IG9yIEB2YXJ7ZGlmZn0uIERlZmF1bHQgaXMgQHZhcntub3JtYWx9LgorCitAdmFye2RpZmZ9IG1vZGUgbWVhc3VyZXMgZW50cm9weSBvZiBoaXN0b2dyYW0gZGVsdGEgdmFsdWVzLCBhYnNvbHV0ZSBkaWZmZXJlbmNlcworYmV0d2VlbiBuZWlnaGJvdXIgaGlzdG9ncmFtIHZhbHVlcy4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gZmFkZQogCiBBcHBseSBhIGZhZGUtaW4vb3V0IGVmZmVjdCB0byB0aGUgaW5wdXQgdmlkZW8uCkBAIC02NTgzLDYgKzg1MzEsMjAgQEAKIEBpdGVtIHdlaWdodF9WCiBTZXQgdGhlIGZyZXF1ZW5jeSBkb21haW4gd2VpZ2h0IGV4cHJlc3Npb24gZm9yIHRoZSAybmQgY2hyb21hIHBsYW5lLgogCitAaXRlbSBldmFsCitTZXQgd2hlbiB0aGUgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZC4KKworSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHZhbHVlczoKK0B0YWJsZSBAc2FtcAorQGl0ZW0gaW5pdAorT25seSBldmFsdWF0ZSBleHByZXNzaW9ucyBvbmNlIGR1cmluZyB0aGUgZmlsdGVyIGluaXRpYWxpemF0aW9uLgorCitAaXRlbSBmcmFtZQorRXZhbHVhdGUgZXhwcmVzc2lvbnMgZm9yIGVhY2ggaW5jb21pbmcgZnJhbWUuCitAZW5kIHRhYmxlCisKK0RlZmF1bHQgdmFsdWUgaXMgQHNhbXB7aW5pdH0uCisKIFRoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKIEBpdGVtIFgKIEBpdGVtIFkKQEAgLTY1OTEsNiArODU1Myw5IEBACiBAaXRlbSBXCiBAaXRlbSBICiBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UuCisKK0BpdGVtIE4KK1RoZSBudW1iZXIgb2YgaW5wdXQgZnJhbWUsIHN0YXJ0aW5nIGZyb20gMC4KIEBlbmQgdGFibGUKIAogQHN1YnNlY3Rpb24gRXhhbXBsZXMKQEAgLTY2MzcsNiArODYwMiw1MCBAQAogQGNvZGV7Ym90dG9tfSkuCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIGZpZWxkaGludAorCitDcmVhdGUgbmV3IGZyYW1lcyBieSBjb3B5aW5nIHRoZSB0b3AgYW5kIGJvdHRvbSBmaWVsZHMgZnJvbSBzdXJyb3VuZGluZyBmcmFtZXMKK3N1cHBsaWVkIGFzIG51bWJlcnMgYnkgdGhlIGhpbnQgZmlsZS4KKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGhpbnQKK1NldCBmaWxlIGNvbnRhaW5pbmcgaGludHM6IGFic29sdXRlL3JlbGF0aXZlIGZyYW1lIG51bWJlcnMuCisKK1RoZXJlIG11c3QgYmUgb25lIGxpbmUgZm9yIGVhY2ggZnJhbWUgaW4gYSBjbGlwLiBFYWNoIGxpbmUgbXVzdCBjb250YWluIHR3bworbnVtYmVycyBzZXBhcmF0ZWQgYnkgdGhlIGNvbW1hLCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IEBjb2Rley19IG9yIEBjb2Rleyt9LgorTnVtYmVycyBzdXBwbGllZCBvbiBlYWNoIGxpbmUgb2YgZmlsZSBjYW4gbm90IGJlIG91dCBvZiBbTi0xLE4rMV0gd2hlcmUgTgoraXMgY3VycmVudCBmcmFtZSBudW1iZXIgZm9yIEBjb2Rle2Fic29sdXRlfSBtb2RlIG9yIG91dCBvZiBbLTEsIDFdIHJhbmdlCitmb3IgQGNvZGV7cmVsYXRpdmV9IG1vZGUuIEZpcnN0IG51bWJlciB0ZWxscyBmcm9tIHdoaWNoIGZyYW1lIHRvIHBpY2sgdXAgdG9wCitmaWVsZCBhbmQgc2Vjb25kIG51bWJlciB0ZWxscyBmcm9tIHdoaWNoIGZyYW1lIHRvIHBpY2sgdXAgYm90dG9tIGZpZWxkLgorCitJZiBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IEBjb2Rleyt9IG91dHB1dCBmcmFtZSB3aWxsIGJlIG1hcmtlZCBhcyBpbnRlcmxhY2VkLAorZWxzZSBpZiBmb2xsb3dlZCBieSBAY29kZXstfSBvdXRwdXQgZnJhbWUgd2lsbCBiZSBtYXJrZWQgYXMgcHJvZ3Jlc3NpdmUsIGVsc2UKK2l0IHdpbGwgYmUgbWFya2VkIHNhbWUgYXMgaW5wdXQgZnJhbWUuCitJZiBsaW5lIHN0YXJ0cyB3aXRoIEBjb2RleyN9IG9yIEBjb2Rlezt9IHRoYXQgbGluZSBpcyBza2lwcGVkLgorCitAaXRlbSBtb2RlCitDYW4gYmUgaXRlbSBAY29kZXthYnNvbHV0ZX0gb3IgQGNvZGV7cmVsYXRpdmV9LiBEZWZhdWx0IGlzIEBjb2Rle2Fic29sdXRlfS4KK0BlbmQgdGFibGUKKworRXhhbXBsZSBvZiBmaXJzdCBzZXZlcmFsIGxpbmVzIG9mIEBjb2Rle2hpbnR9IGZpbGUgZm9yIEBjb2Rle3JlbGF0aXZlfSBtb2RlOgorQGV4YW1wbGUKKzAsMCAtICMgZmlyc3QgZnJhbWUKKzEsMCAtICMgc2Vjb25kIGZyYW1lLCB1c2UgdGhpcmQncyBmcmFtZSB0b3AgZmllbGQgYW5kIHNlY29uZCdzIGZyYW1lIGJvdHRvbSBmaWVsZAorMSwwIC0gIyB0aGlyZCBmcmFtZSwgdXNlIGZvdXJ0aCdzIGZyYW1lIHRvcCBmaWVsZCBhbmQgdGhpcmQncyBmcmFtZSBib3R0b20gZmllbGQKKzEsMCAtCiswLDAgLQorMCwwIC0KKzEsMCAtCisxLDAgLQorMSwwIC0KKzAsMCAtCiswLDAgLQorMSwwIC0KKzEsMCAtCisxLDAgLQorMCwwIC0KK0BlbmQgZXhhbXBsZQorCiBAc2VjdGlvbiBmaWVsZG1hdGNoCiAKIEZpZWxkIG1hdGNoaW5nIGZpbHRlciBmb3IgaW52ZXJzZSB0ZWxlY2luZS4gSXQgaXMgbWVhbnQgdG8gcmVjb25zdHJ1Y3QgdGhlCkBAIC03MDA0LDYgKzkwMTMsNDggQEAKIAogSXQgZG9lcyBub3QgdGFrZSBwYXJhbWV0ZXJzLgogCitAc2VjdGlvbiBmaWxsYm9yZGVycworCitGaWxsIGJvcmRlcnMgb2YgdGhlIGlucHV0IHZpZGVvLCB3aXRob3V0IGNoYW5naW5nIHZpZGVvIHN0cmVhbSBkaW1lbnNpb25zLgorU29tZXRpbWVzIHZpZGVvIGNhbiBoYXZlIGdhcmJhZ2UgYXQgdGhlIGZvdXIgZWRnZXMgYW5kIHlvdSBtYXkgbm90IHdhbnQgdG8KK2Nyb3AgdmlkZW8gaW5wdXQgdG8ga2VlcCBzaXplIG11bHRpcGxlIG9mIHNvbWUgbnVtYmVyLgorCitUaGlzIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGxlZnQKK051bWJlciBvZiBwaXhlbHMgdG8gZmlsbCBmcm9tIGxlZnQgYm9yZGVyLgorCitAaXRlbSByaWdodAorTnVtYmVyIG9mIHBpeGVscyB0byBmaWxsIGZyb20gcmlnaHQgYm9yZGVyLgorCitAaXRlbSB0b3AKK051bWJlciBvZiBwaXhlbHMgdG8gZmlsbCBmcm9tIHRvcCBib3JkZXIuCisKK0BpdGVtIGJvdHRvbQorTnVtYmVyIG9mIHBpeGVscyB0byBmaWxsIGZyb20gYm90dG9tIGJvcmRlci4KKworQGl0ZW0gbW9kZQorU2V0IGZpbGwgbW9kZS4KKworSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHZhbHVlczoKK0B0YWJsZSBAc2FtcAorQGl0ZW0gc21lYXIKK2ZpbGwgcGl4ZWxzIHVzaW5nIG91dGVybW9zdCBwaXhlbHMKKworQGl0ZW0gbWlycm9yCitmaWxsIHBpeGVscyB1c2luZyBtaXJyb3JpbmcKKworQGl0ZW0gZml4ZWQKK2ZpbGwgcGl4ZWxzIHdpdGggY29uc3RhbnQgdmFsdWUKK0BlbmQgdGFibGUKKworRGVmYXVsdCBpcyBAdmFye3NtZWFyfS4KKworQGl0ZW0gY29sb3IKK1NldCBjb2xvciBmb3IgcGl4ZWxzIGluIGZpeGVkIG1vZGUuIERlZmF1bHQgaXMgQHZhcntibGFja30uCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIGZpbmRfcmVjdAogCiBGaW5kIGEgcmVjdGFuZ3VsYXIgb2JqZWN0CkBAIC03MDY4LDYgKzkxMTksNDMgQEAKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIGZsb29kZmlsbAorCitGbG9vZCBhcmVhIHdpdGggdmFsdWVzIG9mIHNhbWUgcGl4ZWwgY29tcG9uZW50cyB3aXRoIGFub3RoZXIgdmFsdWVzLgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSB4CitTZXQgcGl4ZWwgeCBjb29yZGluYXRlLgorCitAaXRlbSB5CitTZXQgcGl4ZWwgeSBjb29yZGluYXRlLgorCitAaXRlbSBzMAorU2V0IHNvdXJjZSAjMCBjb21wb25lbnQgdmFsdWUuCisKK0BpdGVtIHMxCitTZXQgc291cmNlICMxIGNvbXBvbmVudCB2YWx1ZS4KKworQGl0ZW0gczIKK1NldCBzb3VyY2UgIzIgY29tcG9uZW50IHZhbHVlLgorCitAaXRlbSBzMworU2V0IHNvdXJjZSAjMyBjb21wb25lbnQgdmFsdWUuCisKK0BpdGVtIGQwCitTZXQgZGVzdGluYXRpb24gIzAgY29tcG9uZW50IHZhbHVlLgorCitAaXRlbSBkMQorU2V0IGRlc3RpbmF0aW9uICMxIGNvbXBvbmVudCB2YWx1ZS4KKworQGl0ZW0gZDIKK1NldCBkZXN0aW5hdGlvbiAjMiBjb21wb25lbnQgdmFsdWUuCisKK0BpdGVtIGQzCitTZXQgZGVzdGluYXRpb24gIzMgY29tcG9uZW50IHZhbHVlLgorQGVuZCB0YWJsZQorCiBAYW5jaG9ye2Zvcm1hdH0KIEBzZWN0aW9uIGZvcm1hdAogCkBAIC03MTExLDEzICs5MTk5LDIxIEBACiBAaXRlbSBmcHMKIFRoZSBkZXNpcmVkIG91dHB1dCBmcmFtZSByYXRlLiBUaGUgZGVmYXVsdCBpcyBAY29kZXsyNX0uCiAKK0BpdGVtIHN0YXJ0X3RpbWUKK0Fzc3VtZSB0aGUgZmlyc3QgUFRTIHNob3VsZCBiZSB0aGUgZ2l2ZW4gdmFsdWUsIGluIHNlY29uZHMuIFRoaXMgYWxsb3dzIGZvcgorcGFkZGluZy90cmltbWluZyBhdCB0aGUgc3RhcnQgb2Ygc3RyZWFtLiBCeSBkZWZhdWx0LCBubyBhc3N1bXB0aW9uIGlzIG1hZGUKK2Fib3V0IHRoZSBmaXJzdCBmcmFtZSdzIGV4cGVjdGVkIFBUUywgc28gbm8gcGFkZGluZyBvciB0cmltbWluZyBpcyBkb25lLgorRm9yIGV4YW1wbGUsIHRoaXMgY291bGQgYmUgc2V0IHRvIDAgdG8gcGFkIHRoZSBiZWdpbm5pbmcgd2l0aCBkdXBsaWNhdGVzIG9mCit0aGUgZmlyc3QgZnJhbWUgaWYgYSB2aWRlbyBzdHJlYW0gc3RhcnRzIGFmdGVyIHRoZSBhdWRpbyBzdHJlYW0gb3IgdG8gdHJpbSBhbnkKK2ZyYW1lcyB3aXRoIGEgbmVnYXRpdmUgUFRTLgorCiBAaXRlbSByb3VuZAotUm91bmRpbmcgbWV0aG9kLgorVGltZXN0YW1wIChQVFMpIHJvdW5kaW5nIG1ldGhvZC4KIAogUG9zc2libGUgdmFsdWVzIGFyZToKIEB0YWJsZSBAb3B0aW9uCiBAaXRlbSB6ZXJvCi16ZXJvIHJvdW5kIHRvd2FyZHMgMAorcm91bmQgdG93YXJkcyAwCiBAaXRlbSBpbmYKIHJvdW5kIGF3YXkgZnJvbSAwCiBAaXRlbSBkb3duCkBAIC03MTI5LDE4ICs5MjI1LDIyIEBACiBAZW5kIHRhYmxlCiBUaGUgZGVmYXVsdCBpcyBAY29kZXtuZWFyfS4KIAotQGl0ZW0gc3RhcnRfdGltZQotQXNzdW1lIHRoZSBmaXJzdCBQVFMgc2hvdWxkIGJlIHRoZSBnaXZlbiB2YWx1ZSwgaW4gc2Vjb25kcy4gVGhpcyBhbGxvd3MgZm9yCi1wYWRkaW5nL3RyaW1taW5nIGF0IHRoZSBzdGFydCBvZiBzdHJlYW0uIEJ5IGRlZmF1bHQsIG5vIGFzc3VtcHRpb24gaXMgbWFkZQotYWJvdXQgdGhlIGZpcnN0IGZyYW1lJ3MgZXhwZWN0ZWQgUFRTLCBzbyBubyBwYWRkaW5nIG9yIHRyaW1taW5nIGlzIGRvbmUuCi1Gb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSBzZXQgdG8gMCB0byBwYWQgdGhlIGJlZ2lubmluZyB3aXRoIGR1cGxpY2F0ZXMgb2YKLXRoZSBmaXJzdCBmcmFtZSBpZiBhIHZpZGVvIHN0cmVhbSBzdGFydHMgYWZ0ZXIgdGhlIGF1ZGlvIHN0cmVhbSBvciB0byB0cmltIGFueQotZnJhbWVzIHdpdGggYSBuZWdhdGl2ZSBQVFMuCitAaXRlbSBlb2ZfYWN0aW9uCitBY3Rpb24gcGVyZm9ybWVkIHdoZW4gcmVhZGluZyB0aGUgbGFzdCBmcmFtZS4KKworUG9zc2libGUgdmFsdWVzIGFyZToKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSByb3VuZAorVXNlIHNhbWUgdGltZXN0YW1wIHJvdW5kaW5nIG1ldGhvZCBhcyB1c2VkIGZvciBvdGhlciBmcmFtZXMuCitAaXRlbSBwYXNzCitQYXNzIHRocm91Z2ggbGFzdCBmcmFtZSBpZiBpbnB1dCBkdXJhdGlvbiBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuCitAZW5kIHRhYmxlCitUaGUgZGVmYXVsdCBpcyBAY29kZXtyb3VuZH0uCiAKIEBlbmQgdGFibGUKIAogQWx0ZXJuYXRpdmVseSwgdGhlIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCBhcyBhIGZsYXQgc3RyaW5nOgotQHZhcntmcHN9WzpAdmFye3JvdW5kfV0uCitAdmFye2Zwc31bOkB2YXJ7c3RhcnRfdGltZX1bOkB2YXJ7cm91bmR9XV0uCiAKIFNlZSBhbHNvIHRoZSBAcmVme3NldHB0c30gZmlsdGVyLgogCkBAIC03MjM2LDcgKzkzMzYsNyBAQAogMCBhbmQgMTAwIHRvIGluZGljYXRlIGEgbmV3IHNjZW5lOyBhIGxvdyB2YWx1ZSByZWZsZWN0cyBhIGxvdwogcHJvYmFiaWxpdHkgZm9yIHRoZSBjdXJyZW50IGZyYW1lIHRvIGludHJvZHVjZSBhIG5ldyBzY2VuZSwgd2hpbGUgYSBoaWdoZXIKIHZhbHVlIG1lYW5zIHRoZSBjdXJyZW50IGZyYW1lIGlzIG1vcmUgbGlrZWx5IHRvIGJlIG9uZS4KLVRoZSBkZWZhdWx0IGlzIEBjb2Rlezd9LgorVGhlIGRlZmF1bHQgaXMgQGNvZGV7OC4yfS4KIAogQGl0ZW0gZmxhZ3MKIFNwZWNpZnkgZmxhZ3MgaW5mbHVlbmNpbmcgdGhlIGZpbHRlciBwcm9jZXNzLgpAQCAtNzI3Niw3ICs5Mzc2LDcgQEAKIEBpdGVtIGZpbHRlcl9uYW1lCiBUaGUgbmFtZSBvZiB0aGUgZnJlaTByIGVmZmVjdCB0byBsb2FkLiBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKIEBlbnZ7RlJFSTBSX1BBVEh9IGlzIGRlZmluZWQsIHRoZSBmcmVpMHIgZWZmZWN0IGlzIHNlYXJjaGVkIGZvciBpbiBlYWNoIG9mIHRoZQotZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGJ5IHRoZSBjb2xvbi1zZXBhcmF0ZWQgbGlzdCBpbiBAZW52e0ZSRUlPUl9QQVRIfS4KK2RpcmVjdG9yaWVzIHNwZWNpZmllZCBieSB0aGUgY29sb24tc2VwYXJhdGVkIGxpc3QgaW4gQGVudntGUkVJMFJfUEFUSH0uCiBPdGhlcndpc2UsIHRoZSBzdGFuZGFyZCBmcmVpMHIgcGF0aHMgYXJlIHNlYXJjaGVkLCBpbiB0aGlzIG9yZGVyOgogQGZpbGV7SE9NRS8uZnJlaTByLTEvbGliL30sIEBmaWxley91c3IvbG9jYWwvbGliL2ZyZWkwci0xL30sCiBAZmlsZXsvdXNyL2xpYi9mcmVpMHItMS99LgpAQCAtNzI4OSw4ICs5Mzg5LDkgQEAKIEEgZnJlaTByIGVmZmVjdCBwYXJhbWV0ZXIgY2FuIGJlIGEgYm9vbGVhbiAoaXRzIHZhbHVlIGlzIGVpdGhlcgogInkiIG9yICJuIiksIGEgZG91YmxlLCBhIGNvbG9yIChzcGVjaWZpZWQgYXMKIEB2YXJ7Un0vQHZhcntHfS9AdmFye0J9LCB3aGVyZSBAdmFye1J9LCBAdmFye0d9LCBhbmQgQHZhcntCfSBhcmUgZmxvYXRpbmcgcG9pbnQKLW51bWJlcnMgYmV0d2VlbiAwLjAgYW5kIDEuMCwgaW5jbHVzaXZlKSBvciBieSBhIGNvbG9yIGRlc2NyaXB0aW9uIHNwZWNpZmllZCBpbiB0aGUgIkNvbG9yIgotc2VjdGlvbiBpbiB0aGUgZmZtcGVnLXV0aWxzIG1hbnVhbCksIGEgcG9zaXRpb24gKHNwZWNpZmllZCBhcyBAdmFye1h9L0B2YXJ7WX0sIHdoZXJlCitudW1iZXJzIGJldHdlZW4gMC4wIGFuZCAxLjAsIGluY2x1c2l2ZSkgb3IgYSBjb2xvciBkZXNjcmlwdGlvbiBhcyBzcGVjaWZpZWQgaW4gdGhlCitAcmVme2NvbG9yIHN5bnRheCwsIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLGZmbXBlZy11dGlsc30sCithIHBvc2l0aW9uIChzcGVjaWZpZWQgYXMgQHZhcntYfS9AdmFye1l9LCB3aGVyZQogQHZhcntYfSBhbmQgQHZhcntZfSBhcmUgZmxvYXRpbmcgcG9pbnQgbnVtYmVycykgYW5kL29yIGEgc3RyaW5nLgogCiBUaGUgbnVtYmVyIGFuZCB0eXBlcyBvZiBwYXJhbWV0ZXJzIGRlcGVuZCBvbiB0aGUgbG9hZGVkIGVmZmVjdC4gSWYgYW4KQEAgLTczNTUsNiArOTQ1NiwyNyBAQAogCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIGdibHVyCisKK0FwcGx5IEdhdXNzaWFuIGJsdXIgZmlsdGVyLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gc2lnbWEKK1NldCBob3Jpem9udGFsIHNpZ21hLCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgR2F1c3NpYW4gYmx1ci4gRGVmYXVsdCBpcyBAY29kZXswLjV9LgorCitAaXRlbSBzdGVwcworU2V0IG51bWJlciBvZiBzdGVwcyBmb3IgR2F1c3NpYW4gYXBwcm94aW1hdGlvbi4gRGVmYXVscyBpcyBAY29kZXsxfS4KKworQGl0ZW0gcGxhbmVzCitTZXQgd2hpY2ggcGxhbmVzIHRvIGZpbHRlci4gQnkgZGVmYXVsdCBhbGwgcGxhbmVzIGFyZSBmaWx0ZXJlZC4KKworQGl0ZW0gc2lnbWFWCitTZXQgdmVydGljYWwgc2lnbWEsIGlmIG5lZ2F0aXZlIGl0IHdpbGwgYmUgc2FtZSBhcyBAY29kZXtzaWdtYX0uCitEZWZhdWx0IGlzIEBjb2Rley0xfS4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gZ2VxCiAKIFRoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CkBAIC03NDgyLDE4ICs5NjA0LDEyIEBACiBAZXhhbXBsZQogZ2VxPWx1bT0yNTUqZ2F1c3MoKFgvVy0wLjUpKjMpKmdhdXNzKChZL0gtMC41KSozKS9nYXVzcygwKS9nYXVzcygwKSxmb3JtYXQ9Z3JheQogQGVuZCBleGFtcGxlCi0KLUBpdGVtCi1EaWFnb25hbCBzcGxpdCBzY3JlZW4gdG8gY29tcGFyZSBmaWx0ZXIgZWZmZWN0OgotQGV4YW1wbGUKLWZmbXBlZyAtaSBpbnB1dCAtZmlsdGVyX2NvbXBsZXggIlswOnZdZ2VxPWx1bT1pZihndChYXCxZKihXL0gpKVwsMjU1KSxmb3JtYXQ9Z3JheVthbHBoYV07WzA6dl1bYWxwaGFdYWxwaGFtZXJnZSxjdXJ2ZXM9cHJlc2V0PWNvbG9yX25lZ2F0aXZlW2ZpbHRlcmVkXTtbMDp2XVtmaWx0ZXJlZF1vdmVybGF5IiBvdXRwdXQKLUBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKIEBzZWN0aW9uIGdyYWRmdW4KIAogRml4IHRoZSBiYW5kaW5nIGFydGlmYWN0cyB0aGF0IGFyZSBzb21ldGltZXMgaW50cm9kdWNlZCBpbnRvIG5lYXJseSBmbGF0Ci1yZWdpb25zIGJ5IHRydW5jYXRpb24gdG8gOGJpdCBjb2xvciBkZXB0aC4KK3JlZ2lvbnMgYnkgdHJ1bmNhdGlvbiB0byA4LWJpdCBjb2xvciBkZXB0aC4KIEludGVycG9sYXRlIHRoZSBncmFkaWVudHMgdGhhdCBzaG91bGQgZ28gd2hlcmUgdGhlIGJhbmRzIGFyZSwgYW5kCiBkaXRoZXIgdGhlbS4KIApAQCAtNzY4MiwxNSArOTc5OCwxOCBAQAogU2V0IGRpc3BsYXkgbW9kZS4KIEl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiBAdGFibGUgQHNhbXAKLUBpdGVtIHBhcmFkZQorQGl0ZW0gc3RhY2sKIFBlciBjb2xvciBjb21wb25lbnQgZ3JhcGhzIGFyZSBwbGFjZWQgYmVsb3cgZWFjaCBvdGhlci4KIAorQGl0ZW0gcGFyYWRlCitQZXIgY29sb3IgY29tcG9uZW50IGdyYXBocyBhcmUgcGxhY2VkIHNpZGUgYnkgc2lkZS4KKwogQGl0ZW0gb3ZlcmxheQogUHJlc2VudHMgaW5mb3JtYXRpb24gaWRlbnRpY2FsIHRvIHRoYXQgaW4gdGhlIEBjb2Rle3BhcmFkZX0sIGV4Y2VwdAogdGhhdCB0aGUgZ3JhcGhzIHJlcHJlc2VudGluZyBjb2xvciBjb21wb25lbnRzIGFyZSBzdXBlcmltcG9zZWQgZGlyZWN0bHkKIG92ZXIgb25lIGFub3RoZXIuCiBAZW5kIHRhYmxlCi1EZWZhdWx0IGlzIEBjb2Rle3BhcmFkZX0uCitEZWZhdWx0IGlzIEBjb2Rle3N0YWNrfS4KIAogQGl0ZW0gbGV2ZWxzX21vZGUKIFNldCBtb2RlLiBDYW4gYmUgZWl0aGVyIEBjb2Rle2xpbmVhcn0sIG9yIEBjb2Rle2xvZ2FyaXRobWljfS4KQEAgLTc2OTksNiArOTgxOCwxMiBAQAogQGl0ZW0gY29tcG9uZW50cwogU2V0IHdoYXQgY29sb3IgY29tcG9uZW50cyB0byBkaXNwbGF5LgogRGVmYXVsdCBpcyBAY29kZXs3fS4KKworQGl0ZW0gZmdvcGFjaXR5CitTZXQgZm9yZWdyb3VuZCBvcGFjaXR5LiBEZWZhdWx0IGlzIEBjb2RlezAuN30uCisKK0BpdGVtIGJnb3BhY2l0eQorU2V0IGJhY2tncm91bmQgb3BhY2l0eS4gRGVmYXVsdCBpcyBAY29kZXswLjV9LgogQGVuZCB0YWJsZQogCiBAc3Vic2VjdGlvbiBFeGFtcGxlcwpAQCAtNzc0MCw2ICs5ODY1LDExNiBAQAogQHZhcntsdW1hX3RtcH0qQHZhcntjaHJvbWFfc3BhdGlhbH0vQHZhcntsdW1hX3NwYXRpYWx9LgogQGVuZCB0YWJsZQogCitAc2VjdGlvbiBod2Rvd25sb2FkCisKK0Rvd25sb2FkIGhhcmR3YXJlIGZyYW1lcyB0byBzeXN0ZW0gbWVtb3J5LgorCitUaGUgaW5wdXQgbXVzdCBiZSBpbiBoYXJkd2FyZSBmcmFtZXMsIGFuZCB0aGUgb3V0cHV0IGEgbm9uLWhhcmR3YXJlIGZvcm1hdC4KK05vdCBhbGwgZm9ybWF0cyB3aWxsIGJlIHN1cHBvcnRlZCBvbiB0aGUgb3V0cHV0IC0gaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBpbnNlcnQKK2FuIGFkZGl0aW9uYWwgQG9wdGlvbntmb3JtYXR9IGZpbHRlciBpbW1lZGlhdGVseSBmb2xsb3dpbmcgaW4gdGhlIGdyYXBoIHRvIGdldAordGhlIG91dHB1dCBpbiBhIHN1cHBvcnRlZCBmb3JtYXQuCisKK0BzZWN0aW9uIGh3bWFwCisKK01hcCBoYXJkd2FyZSBmcmFtZXMgdG8gc3lzdGVtIG1lbW9yeSBvciB0byBhbm90aGVyIGRldmljZS4KKworVGhpcyBmaWx0ZXIgaGFzIHNldmVyYWwgZGlmZmVyZW50IG1vZGVzIG9mIG9wZXJhdGlvbjsgd2hpY2ggb25lIGlzIHVzZWQgZGVwZW5kcworb24gdGhlIGlucHV0IGFuZCBvdXRwdXQgZm9ybWF0czoKK0BpdGVtaXplCitAaXRlbQorSGFyZHdhcmUgZnJhbWUgaW5wdXQsIG5vcm1hbCBmcmFtZSBvdXRwdXQKKworTWFwIHRoZSBpbnB1dCBmcmFtZXMgdG8gc3lzdGVtIG1lbW9yeSBhbmQgcGFzcyB0aGVtIHRvIHRoZSBvdXRwdXQuICBJZiB0aGUKK29yaWdpbmFsIGhhcmR3YXJlIGZyYW1lIGlzIGxhdGVyIHJlcXVpcmVkIChmb3IgZXhhbXBsZSwgYWZ0ZXIgb3ZlcmxheWluZworc29tZXRoaW5nIGVsc2Ugb24gcGFydCBvZiBpdCksIHRoZSBAb3B0aW9ue2h3bWFwfSBmaWx0ZXIgY2FuIGJlIHVzZWQgYWdhaW4KK2luIHRoZSBuZXh0IG1vZGUgdG8gcmV0cmlldmUgaXQuCitAaXRlbQorTm9ybWFsIGZyYW1lIGlucHV0LCBoYXJkd2FyZSBmcmFtZSBvdXRwdXQKKworSWYgdGhlIGlucHV0IGlzIGFjdHVhbGx5IGEgc29mdHdhcmUtbWFwcGVkIGhhcmR3YXJlIGZyYW1lLCB0aGVuIHVubWFwIGl0IC0KK3RoYXQgaXMsIHJldHVybiB0aGUgb3JpZ2luYWwgaGFyZHdhcmUgZnJhbWUuCisKK090aGVyd2lzZSwgYSBkZXZpY2UgbXVzdCBiZSBwcm92aWRlZC4gIENyZWF0ZSBuZXcgaGFyZHdhcmUgc3VyZmFjZXMgb24gdGhhdAorZGV2aWNlIGZvciB0aGUgb3V0cHV0LCB0aGVuIG1hcCB0aGVtIGJhY2sgdG8gdGhlIHNvZnR3YXJlIGZvcm1hdCBhdCB0aGUgaW5wdXQKK2FuZCBnaXZlIHRob3NlIGZyYW1lcyB0byB0aGUgcHJlY2VkaW5nIGZpbHRlci4gIFRoaXMgd2lsbCB0aGVuIGFjdCBsaWtlIHRoZQorQG9wdGlvbntod3VwbG9hZH0gZmlsdGVyLCBidXQgbWF5IGJlIGFibGUgdG8gYXZvaWQgYW4gYWRkaXRpb25hbCBjb3B5IHdoZW4KK3RoZSBpbnB1dCBpcyBhbHJlYWR5IGluIGEgY29tcGF0aWJsZSBmb3JtYXQuCitAaXRlbQorSGFyZHdhcmUgZnJhbWUgaW5wdXQgYW5kIG91dHB1dAorCitBIGRldmljZSBtdXN0IGJlIHN1cHBsaWVkIGZvciB0aGUgb3V0cHV0LCBlaXRoZXIgZGlyZWN0bHkgb3Igd2l0aCB0aGUKK0BvcHRpb257ZGVyaXZlX2RldmljZX0gb3B0aW9uLiAgVGhlIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlcyBtdXN0IGJlIG9mCitkaWZmZXJlbnQgdHlwZXMgYW5kIGNvbXBhdGlibGUgLSB0aGUgZXhhY3QgbWVhbmluZyBvZiB0aGlzIGlzCitzeXN0ZW0tZGVwZW5kZW50LCBidXQgdHlwaWNhbGx5IGl0IG1lYW5zIHRoYXQgdGhleSBtdXN0IHJlZmVyIHRvIHRoZSBzYW1lCit1bmRlcmx5aW5nIGhhcmR3YXJlIGNvbnRleHQgKGZvciBleGFtcGxlLCByZWZlciB0byB0aGUgc2FtZSBncmFwaGljcyBjYXJkKS4KKworSWYgdGhlIGlucHV0IGZyYW1lcyB3ZXJlIG9yaWdpbmFsbHkgY3JlYXRlZCBvbiB0aGUgb3V0cHV0IGRldmljZSwgdGhlbiB1bm1hcAordG8gcmV0cmlldmUgdGhlIG9yaWdpbmFsIGZyYW1lcy4KKworT3RoZXJ3aXNlLCBtYXAgdGhlIGZyYW1lcyB0byB0aGUgb3V0cHV0IGRldmljZSAtIGNyZWF0ZSBuZXcgaGFyZHdhcmUgZnJhbWVzCitvbiB0aGUgb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZyYW1lcyBvbiB0aGUgaW5wdXQuCitAZW5kIGl0ZW1pemUKKworVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIGFjY2VwdGVkOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gbW9kZQorU2V0IHRoZSBmcmFtZSBtYXBwaW5nIG1vZGUuICBTb21lIGNvbWJpbmF0aW9uIG9mOgorQHRhYmxlIEB2YXIKK0BpdGVtIHJlYWQKK1RoZSBtYXBwZWQgZnJhbWUgc2hvdWxkIGJlIHJlYWRhYmxlLgorQGl0ZW0gd3JpdGUKK1RoZSBtYXBwZWQgZnJhbWUgc2hvdWxkIGJlIHdyaXRlYWJsZS4KK0BpdGVtIG92ZXJ3cml0ZQorVGhlIG1hcHBpbmcgd2lsbCBhbHdheXMgb3ZlcndyaXRlIHRoZSBlbnRpcmUgZnJhbWUuCisKK1RoaXMgbWF5IGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gc29tZSBjYXNlcywgYXMgdGhlIG9yaWdpbmFsIGNvbnRlbnRzIG9mIHRoZQorZnJhbWUgbmVlZCBub3QgYmUgbG9hZGVkLgorQGl0ZW0gZGlyZWN0CitUaGUgbWFwcGluZyBtdXN0IG5vdCBpbnZvbHZlIGFueSBjb3B5aW5nLgorCitJbmRpcmVjdCBtYXBwaW5ncyB0byBjb3BpZXMgb2YgZnJhbWVzIGFyZSBjcmVhdGVkIGluIHNvbWUgY2FzZXMgd2hlcmUgZWl0aGVyCitkaXJlY3QgbWFwcGluZyBpcyBub3QgcG9zc2libGUgb3IgaXQgd291bGQgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXMuCitTZXR0aW5nIHRoaXMgZmxhZyBlbnN1cmVzIHRoYXQgdGhlIG1hcHBpbmcgaXMgZGlyZWN0IGFuZCB3aWxsIGZhaWwgaWYgdGhhdCBpcworbm90IHBvc3NpYmxlLgorQGVuZCB0YWJsZQorRGVmYXVsdHMgdG8gQHZhcntyZWFkK3dyaXRlfSBpZiBub3Qgc3BlY2lmaWVkLgorCitAaXRlbSBkZXJpdmVfZGV2aWNlIEB2YXJ7dHlwZX0KK1JhdGhlciB0aGFuIHVzaW5nIHRoZSBkZXZpY2Ugc3VwcGxpZWQgYXQgaW5pdGlhbGlzYXRpb24sIGluc3RlYWQgZGVyaXZlIGEgbmV3CitkZXZpY2Ugb2YgdHlwZSBAdmFye3R5cGV9IGZyb20gdGhlIGRldmljZSB0aGUgaW5wdXQgZnJhbWVzIGV4aXN0IG9uLgorCitAaXRlbSByZXZlcnNlCitJbiBhIGhhcmR3YXJlIHRvIGhhcmR3YXJlIG1hcHBpbmcsIG1hcCBpbiByZXZlcnNlIC0gY3JlYXRlIGZyYW1lcyBpbiB0aGUgc2luaworYW5kIG1hcCB0aGVtIGJhY2sgdG8gdGhlIHNvdXJjZS4gIFRoaXMgbWF5IGJlIG5lY2Vzc2FyeSBpbiBzb21lIGNhc2VzIHdoZXJlCithIG1hcHBpbmcgaW4gb25lIGRpcmVjdGlvbiBpcyByZXF1aXJlZCBidXQgb25seSB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIGlzCitzdXBwb3J0ZWQgYnkgdGhlIGRldmljZXMgYmVpbmcgdXNlZC4KKworVGhpcyBvcHRpb24gaXMgZGFuZ2Vyb3VzIC0gaXQgbWF5IGJyZWFrIHRoZSBwcmVjZWRpbmcgZmlsdGVyIGluIHVuZGVmaW5lZAord2F5cyBpZiB0aGVyZSBhcmUgYW55IGFkZGl0aW9uYWwgY29uc3RyYWludHMgb24gdGhhdCBmaWx0ZXIncyBvdXRwdXQuCitEbyBub3QgdXNlIGl0IHdpdGhvdXQgZnVsbHkgdW5kZXJzdGFuZGluZyB0aGUgaW1wbGljYXRpb25zIG9mIGl0cyB1c2UuCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIGh3dXBsb2FkCisKK1VwbG9hZCBzeXN0ZW0gbWVtb3J5IGZyYW1lcyB0byBoYXJkd2FyZSBzdXJmYWNlcy4KKworVGhlIGRldmljZSB0byB1cGxvYWQgdG8gbXVzdCBiZSBzdXBwbGllZCB3aGVuIHRoZSBmaWx0ZXIgaXMgaW5pdGlhbGlzZWQuICBJZgordXNpbmcgZmZtcGVnLCBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIGRldmljZSB3aXRoIHRoZSBAb3B0aW9uey1maWx0ZXJfaHdfZGV2aWNlfQorb3B0aW9uLgorCitAYW5jaG9ye2h3dXBsb2FkX2N1ZGF9CitAc2VjdGlvbiBod3VwbG9hZF9jdWRhCisKK1VwbG9hZCBzeXN0ZW0gbWVtb3J5IGZyYW1lcyB0byBhIENVREEgZGV2aWNlLgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgcGFyYW1ldGVyczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGRldmljZQorVGhlIG51bWJlciBvZiB0aGUgQ1VEQSBkZXZpY2UgdG8gdXNlCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIGhxeAogCiBBcHBseSBhIGhpZ2gtcXVhbGl0eSBtYWduaWZpY2F0aW9uIGZpbHRlciBkZXNpZ25lZCBmb3IgcGl4ZWwgYXJ0LiBUaGlzIGZpbHRlcgpAQCAtNzg4MSwxMiArMTAxMTYsMzEgQEAKIHZhbHVlLgogQGVuZCB0YWJsZQogCitAc2VjdGlvbiBoeXN0ZXJlc2lzCisKK0dyb3cgZmlyc3Qgc3RyZWFtIGludG8gc2Vjb25kIHN0cmVhbSBieSBjb25uZWN0aW5nIGNvbXBvbmVudHMuCitUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIG1vcmUgcm9idXN0IGVkZ2UgbWFza3MuCisKK1RoaXMgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcGxhbmVzCitTZXQgd2hpY2ggcGxhbmVzIHdpbGwgYmUgcHJvY2Vzc2VkIGFzIGJpdG1hcCwgdW5wcm9jZXNzZWQgcGxhbmVzIHdpbGwgYmUKK2NvcGllZCBmcm9tIGZpcnN0IHN0cmVhbS4KK0J5IGRlZmF1bHQgdmFsdWUgMHhmLCBhbGwgcGxhbmVzIHdpbGwgYmUgcHJvY2Vzc2VkLgorCitAaXRlbSB0aHJlc2hvbGQKK1NldCB0aHJlc2hvbGQgd2hpY2ggaXMgdXNlZCBpbiBmaWx0ZXJpbmcuIElmIHBpeGVsIGNvbXBvbmVudCB2YWx1ZSBpcyBoaWdoZXIgdGhhbgordGhpcyB2YWx1ZSBmaWx0ZXIgYWxnb3JpdGhtIGZvciBjb25uZWN0aW5nIGNvbXBvbmVudHMgaXMgYWN0aXZhdGVkLgorQnkgZGVmYXVsdCB2YWx1ZSBpcyAwLgorQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBpZGV0CiAKIERldGVjdCB2aWRlbyBpbnRlcmxhY2luZyB0eXBlLgogCi1UaGlzIGZpbHRlciB0cmllcyB0byBkZXRlY3QgaWYgdGhlIGlucHV0IGZyYW1lcyBhcyBpbnRlcmxhY2VkLCBwcm9ncmVzc2l2ZSwKLXRvcCBvciBib3R0b20gZmllbGQgZmlyc3QuIEl0IHdpbGwgYWxzbyB0cnkgYW5kIGRldGVjdCBmaWVsZHMgdGhhdCBhcmUKK1RoaXMgZmlsdGVyIHRyaWVzIHRvIGRldGVjdCBpZiB0aGUgaW5wdXQgZnJhbWVzIGFyZSBpbnRlcmxhY2VkLCBwcm9ncmVzc2l2ZSwKK3RvcCBvciBib3R0b20gZmllbGQgZmlyc3QuIEl0IHdpbGwgYWxzbyB0cnkgdG8gZGV0ZWN0IGZpZWxkcyB0aGF0IGFyZQogcmVwZWF0ZWQgYmV0d2VlbiBhZGphY2VudCBmcmFtZXMgKGEgc2lnbiBvZiB0ZWxlY2luZSkuCiAKIFNpbmdsZSBmcmFtZSBkZXRlY3Rpb24gY29uc2lkZXJzIG9ubHkgaW1tZWRpYXRlbHkgYWRqYWNlbnQgZnJhbWVzIHdoZW4gY2xhc3NpZnlpbmcgZWFjaCBmcmFtZS4KQEAgLTc5NDksMTEgKzEwMjAzLDExIEBACiBTZXQgaW50ZXJsYWNpbmcgdGhyZXNob2xkLgogQGl0ZW0gcHJvZ190aHJlcwogU2V0IHByb2dyZXNzaXZlIHRocmVzaG9sZC4KLUBpdGVtIHJlcGVhdF90aHJlcworQGl0ZW0gcmVwX3RocmVzCiBUaHJlc2hvbGQgZm9yIHJlcGVhdGVkIGZpZWxkIGRldGVjdGlvbi4KIEBpdGVtIGhhbGZfbGlmZQogTnVtYmVyIG9mIGZyYW1lcyBhZnRlciB3aGljaCBhIGdpdmVuIGZyYW1lJ3MgY29udHJpYnV0aW9uIHRvIHRoZQotc3RhdGlzdGljcyBpcyBoYWx2ZWQgKGkuZS4sIGl0IGNvbnRyaWJ1dGVzIG9ubHkgMC41IHRvIGl0J3MKK3N0YXRpc3RpY3MgaXMgaGFsdmVkIChpLmUuLCBpdCBjb250cmlidXRlcyBvbmx5IDAuNSB0byBpdHMKIGNsYXNzaWZpY2F0aW9uKS4gVGhlIGRlZmF1bHQgb2YgMCBtZWFucyB0aGF0IGFsbCBmcmFtZXMgc2VlbiBhcmUgZ2l2ZW4KIGZ1bGwgd2VpZ2h0IG9mIDEuMCBmb3JldmVyLgogQGl0ZW0gYW5hbHl6ZV9pbnRlcmxhY2VkX2ZsYWcKQEAgLTgwNDYsOCArMTAzMDAsMjEgQEAKICh0ZmYgLSBkZWZhdWx0KSBvciBvZGQgKGJmZikgbGluZXMgb2YgdGhlIHByb2dyZXNzaXZlIGZyYW1lLgogCiBAaXRlbSBsb3dwYXNzCi1FbmFibGUgKGRlZmF1bHQpIG9yIGRpc2FibGUgdGhlIHZlcnRpY2FsIGxvd3Bhc3MgZmlsdGVyIHRvIGF2b2lkIHR3aXR0ZXIKLWludGVybGFjaW5nIGFuZCByZWR1Y2UgbW9pcmUgcGF0dGVybnMuCitWZXJ0aWNhbCBsb3dwYXNzIGZpbHRlciB0byBhdm9pZCB0d2l0dGVyIGludGVybGFjaW5nIGFuZAorcmVkdWNlIG1vaXJlIHBhdHRlcm5zLgorCitAdGFibGUgQHNhbXAKK0BpdGVtIDAsIG9mZgorRGlzYWJsZSB2ZXJ0aWNhbCBsb3dwYXNzIGZpbHRlcgorCitAaXRlbSAxLCBsaW5lYXIKK0VuYWJsZSBsaW5lYXIgZmlsdGVyIChkZWZhdWx0KQorCitAaXRlbSAyLCBjb21wbGV4CitFbmFibGUgY29tcGxleCBmaWx0ZXIuIFRoaXMgd2lsbCBzbGlnaHRseSBsZXNzIHJlZHVjZSB0d2l0dGVyIGFuZCBtb2lyZQorYnV0IGJldHRlciByZXRhaW4gZGV0YWlsIGFuZCBzdWJqZWN0aXZlIHNoYXJwbmVzcyBpbXByZXNzaW9uLgorCitAZW5kIHRhYmxlCiBAZW5kIHRhYmxlCiAKIEBzZWN0aW9uIGtlcm5kZWludApAQCAtODEyOSwxNSArMTAzOTYsMTcgQEAKIEBpdGVtIGN4CiBSZWxhdGl2ZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGZvY2FsIHBvaW50IG9mIHRoZSBpbWFnZSwgYW5kIHRoZXJlYnkgdGhlIGNlbnRlciBvZiB0aGUKIGRpc3RvcnRpb24uIFRoaXMgdmFsdWUgaGFzIGEgcmFuZ2UgWzAsMV0gYW5kIGlzIGV4cHJlc3NlZCBhcyBmcmFjdGlvbnMgb2YgdGhlIGltYWdlCi13aWR0aC4KK3dpZHRoLiBEZWZhdWx0IGlzIDAuNS4KIEBpdGVtIGN5CiBSZWxhdGl2ZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGZvY2FsIHBvaW50IG9mIHRoZSBpbWFnZSwgYW5kIHRoZXJlYnkgdGhlIGNlbnRlciBvZiB0aGUKIGRpc3RvcnRpb24uIFRoaXMgdmFsdWUgaGFzIGEgcmFuZ2UgWzAsMV0gYW5kIGlzIGV4cHJlc3NlZCBhcyBmcmFjdGlvbnMgb2YgdGhlIGltYWdlCi1oZWlnaHQuCitoZWlnaHQuIERlZmF1bHQgaXMgMC41LgogQGl0ZW0gazEKLUNvZWZmaWNpZW50IG9mIHRoZSBxdWFkcmF0aWMgY29ycmVjdGlvbiB0ZXJtLiAwLjUgbWVhbnMgbm8gY29ycmVjdGlvbi4KK0NvZWZmaWNpZW50IG9mIHRoZSBxdWFkcmF0aWMgY29ycmVjdGlvbiB0ZXJtLiBUaGlzIHZhbHVlIGhhcyBhIHJhbmdlIFstMSwxXS4gMCBtZWFucworbm8gY29ycmVjdGlvbi4gRGVmYXVsdCBpcyAwLgogQGl0ZW0gazIKLUNvZWZmaWNpZW50IG9mIHRoZSBkb3VibGUgcXVhZHJhdGljIGNvcnJlY3Rpb24gdGVybS4gMC41IG1lYW5zIG5vIGNvcnJlY3Rpb24uCitDb2VmZmljaWVudCBvZiB0aGUgZG91YmxlIHF1YWRyYXRpYyBjb3JyZWN0aW9uIHRlcm0uIFRoaXMgdmFsdWUgaGFzIGEgcmFuZ2UgWy0xLDFdLgorMCBtZWFucyBubyBjb3JyZWN0aW9uLiBEZWZhdWx0IGlzIDAuCiBAZW5kIHRhYmxlCiAKIFRoZSBmb3JtdWxhIHRoYXQgZ2VuZXJhdGVzIHRoZSBjb3JyZWN0aW9uIGlzOgpAQCAtODE0Nyw2ICsxMDQxNiwxMDAgQEAKIHdoZXJlIEB2YXJ7cl8wfSBpcyBoYWx2ZSBvZiB0aGUgaW1hZ2UgZGlhZ29uYWwgYW5kIEB2YXJ7cl9zcmN9IGFuZCBAdmFye3JfdGd0fSBhcmUgdGhlCiBkaXN0YW5jZXMgZnJvbSB0aGUgZm9jYWwgcG9pbnQgaW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGltYWdlcywgcmVzcGVjdGl2ZWx5LgogCitAc2VjdGlvbiBsaWJ2bWFmCisKK09idGFpbiB0aGUgVk1BRiAoVmlkZW8gTXVsdGktTWV0aG9kIEFzc2Vzc21lbnQgRnVzaW9uKQorc2NvcmUgYmV0d2VlbiB0d28gaW5wdXQgdmlkZW9zLgorCitUaGUgb2J0YWluZWQgVk1BRiBzY29yZSBpcyBwcmludGVkIHRocm91Z2ggdGhlIGxvZ2dpbmcgc3lzdGVtLgorCitJdCByZXF1aXJlcyBOZXRmbGl4J3Mgdm1hZiBsaWJyYXJ5IChsaWJ2bWFmKSBhcyBhIHByZS1yZXF1aXNpdGUuCitBZnRlciBpbnN0YWxsaW5nIHRoZSBsaWJyYXJ5IGl0IGNhbiBiZSBlbmFibGVkIHVzaW5nOgorQGNvZGV7Li9jb25maWd1cmUgLS1lbmFibGUtbGlidm1hZn0uCitJZiBubyBtb2RlbCBwYXRoIGlzIHNwZWNpZmllZCBpdCB1c2VzIHRoZSBkZWZhdWx0IG1vZGVsOiBAY29kZXt2bWFmX3YwLjYuMS5wa2x9LgorCitUaGUgZmlsdGVyIGhhcyBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIG1vZGVsX3BhdGgKK1NldCB0aGUgbW9kZWwgcGF0aCB3aGljaCBpcyB0byBiZSB1c2VkIGZvciBTVk0uCitEZWZhdWx0IHZhbHVlOiBAY29kZXsidm1hZl92MC42LjEucGtsIn0KKworQGl0ZW0gbG9nX3BhdGgKK1NldCB0aGUgZmlsZSBwYXRoIHRvIGJlIHVzZWQgdG8gc3RvcmUgbG9ncy4KKworQGl0ZW0gbG9nX2ZtdAorU2V0IHRoZSBmb3JtYXQgb2YgdGhlIGxvZyBmaWxlICh4bWwgb3IganNvbikuCisKK0BpdGVtIGVuYWJsZV90cmFuc2Zvcm0KK0VuYWJsZXMgdHJhbnNmb3JtIGZvciBjb21wdXRpbmcgdm1hZi4KKworQGl0ZW0gcGhvbmVfbW9kZWwKK0ludm9rZXMgdGhlIHBob25lIG1vZGVsIHdoaWNoIHdpbGwgZ2VuZXJhdGUgVk1BRiBzY29yZXMgaGlnaGVyIHRoYW4gaW4gdGhlCityZWd1bGFyIG1vZGVsLCB3aGljaCBpcyBtb3JlIHN1aXRhYmxlIGZvciBsYXB0b3AsIFRWLCBldGMuIHZpZXdpbmcgY29uZGl0aW9ucy4KKworQGl0ZW0gcHNucgorRW5hYmxlcyBjb21wdXRpbmcgcHNuciBhbG9uZyB3aXRoIHZtYWYuCisKK0BpdGVtIHNzaW0KK0VuYWJsZXMgY29tcHV0aW5nIHNzaW0gYWxvbmcgd2l0aCB2bWFmLgorCitAaXRlbSBtc19zc2ltCitFbmFibGVzIGNvbXB1dGluZyBtc19zc2ltIGFsb25nIHdpdGggdm1hZi4KKworQGl0ZW0gcG9vbAorU2V0IHRoZSBwb29sIG1ldGhvZCAobWVhbiwgbWluIG9yIGhhcm1vbmljIG1lYW4pIHRvIGJlIHVzZWQgZm9yIGNvbXB1dGluZyB2bWFmLgorQGVuZCB0YWJsZQorCitUaGlzIGZpbHRlciBhbHNvIHN1cHBvcnRzIHRoZSBAcmVme2ZyYW1lc3luY30gb3B0aW9ucy4KKworT24gdGhlIGJlbG93IGV4YW1wbGVzIHRoZSBpbnB1dCBmaWxlIEBmaWxle21haW4ubXBnfSBiZWluZyBwcm9jZXNzZWQgaXMKK2NvbXBhcmVkIHdpdGggdGhlIHJlZmVyZW5jZSBmaWxlIEBmaWxle3JlZi5tcGd9LgorCitAZXhhbXBsZQorZmZtcGVnIC1pIG1haW4ubXBnIC1pIHJlZi5tcGcgLWxhdmZpIGxpYnZtYWYgLWYgbnVsbCAtCitAZW5kIGV4YW1wbGUKKworRXhhbXBsZSB3aXRoIG9wdGlvbnM6CitAZXhhbXBsZQorZmZtcGVnIC1pIG1haW4ubXBnIC1pIHJlZi5tcGcgLWxhdmZpIGxpYnZtYWY9InBzbnI9MTplbmFibGUtdHJhbnNmb3JtPTEiIC1mIG51bGwgLQorQGVuZCBleGFtcGxlCisKK0BzZWN0aW9uIGxpbWl0ZXIKKworTGltaXRzIHRoZSBwaXhlbCBjb21wb25lbnRzIHZhbHVlcyB0byB0aGUgc3BlY2lmaWVkIHJhbmdlIFttaW4sIG1heF0uCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBtaW4KK0xvd2VyIGJvdW5kLiBEZWZhdWx0cyB0byB0aGUgbG93ZXN0IGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBpbnB1dC4KKworQGl0ZW0gbWF4CitVcHBlciBib3VuZC4gRGVmYXVsdHMgdG8gdGhlIGhpZ2hlc3QgYWxsb3dlZCB2YWx1ZSBmb3IgdGhlIGlucHV0LgorCitAaXRlbSBwbGFuZXMKK1NwZWNpZnkgd2hpY2ggcGxhbmVzIHdpbGwgYmUgcHJvY2Vzc2VkLiBEZWZhdWx0cyB0byBhbGwgYXZhaWxhYmxlLgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBsb29wCisKK0xvb3AgdmlkZW8gZnJhbWVzLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gbG9vcAorU2V0IHRoZSBudW1iZXIgb2YgbG9vcHMuIFNldHRpbmcgdGhpcyB2YWx1ZSB0byAtMSB3aWxsIHJlc3VsdCBpbiBpbmZpbml0ZSBsb29wcy4KK0RlZmF1bHQgaXMgMC4KKworQGl0ZW0gc2l6ZQorU2V0IG1heGltYWwgc2l6ZSBpbiBudW1iZXIgb2YgZnJhbWVzLiBEZWZhdWx0IGlzIDAuCisKK0BpdGVtIHN0YXJ0CitTZXQgZmlyc3QgZnJhbWUgb2YgbG9vcC4gRGVmYXVsdCBpcyAwLgorQGVuZCB0YWJsZQorCiBAYW5jaG9ye2x1dDNkfQogQHNlY3Rpb24gbHV0M2QKIApAQCAtODE4NCw2ICsxMDU0NywyOCBAQAogQGVuZCB0YWJsZQogQGVuZCB0YWJsZQogCitUaGlzIGZpbHRlciBhbHNvIHN1cHBvcnRzIHRoZSBAcmVme2ZyYW1lc3luY30gb3B0aW9ucy4KKworQHNlY3Rpb24gbHVtYWtleQorCitUdXJuIGNlcnRhaW4gbHVtYSB2YWx1ZXMgaW50byB0cmFuc3BhcmVuY3kuCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSB0aHJlc2hvbGQKK1NldCB0aGUgbHVtYSB3aGljaCB3aWxsIGJlIHVzZWQgYXMgYmFzZSBmb3IgdHJhbnNwYXJlbmN5LgorRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXswfS4KKworQGl0ZW0gdG9sZXJhbmNlCitTZXQgdGhlIHJhbmdlIG9mIGx1bWEgdmFsdWVzIHRvIGJlIGtleWVkIG91dC4KK0RlZmF1bHQgdmFsdWUgaXMgQGNvZGV7MH0uCisKK0BpdGVtIHNvZnRuZXNzCitTZXQgdGhlIHJhbmdlIG9mIHNvZnRuZXNzLiBEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezB9LgorVXNlIHRoaXMgdG8gY29udHJvbCBncmFkdWFsIHRyYW5zaXRpb24gZnJvbSB6ZXJvIHRvIGZ1bGwgdHJhbnNwYXJlbmN5LgorQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBsdXQsIGx1dHJnYiwgbHV0eXV2CiAKIENvbXB1dGUgYSBsb29rLXVwIHRhYmxlIGZvciBiaW5kaW5nIGVhY2ggcGl4ZWwgY29tcG9uZW50IGlucHV0IHZhbHVlCkBAIC04MzI0LDggKzEwNzA5LDEwNSBAQAogQGV4YW1wbGUKIGx1dHl1dj15PSdiaXRhbmQodmFsLCAxMjgrNjQrMzIpJwogQGVuZCBleGFtcGxlCisKK0BpdGVtCitUZWNobmljb2xvciBsaWtlIGVmZmVjdDoKK0BleGFtcGxlCitsdXR5dXY9dT0nKHZhbC1tYXh2YWwvMikqMittYXh2YWwvMic6dj0nKHZhbC1tYXh2YWwvMikqMittYXh2YWwvMicKK0BlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIGx1dDIsIHRsdXQyCisKK1RoZSBAY29kZXtsdXQyfSBmaWx0ZXIgdGFrZXMgdHdvIGlucHV0IHN0cmVhbXMgYW5kIG91dHB1dHMgb25lCitzdHJlYW0uCisKK1RoZSBAY29kZXt0bHV0Mn0gKHRpbWUgbHV0MikgZmlsdGVyIHRha2VzIHR3byBjb25zZWN1dGl2ZSBmcmFtZXMKK2Zyb20gb25lIHNpbmdsZSBzdHJlYW0uCisKK1RoaXMgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIGMwCitzZXQgZmlyc3QgcGl4ZWwgY29tcG9uZW50IGV4cHJlc3Npb24KK0BpdGVtIGMxCitzZXQgc2Vjb25kIHBpeGVsIGNvbXBvbmVudCBleHByZXNzaW9uCitAaXRlbSBjMgorc2V0IHRoaXJkIHBpeGVsIGNvbXBvbmVudCBleHByZXNzaW9uCitAaXRlbSBjMworc2V0IGZvdXJ0aCBwaXhlbCBjb21wb25lbnQgZXhwcmVzc2lvbiwgY29ycmVzcG9uZHMgdG8gdGhlIGFscGhhIGNvbXBvbmVudAorQGVuZCB0YWJsZQorCitFYWNoIG9mIHRoZW0gc3BlY2lmaWVzIHRoZSBleHByZXNzaW9uIHRvIHVzZSBmb3IgY29tcHV0aW5nIHRoZSBsb29rdXAgdGFibGUgZm9yCit0aGUgY29ycmVzcG9uZGluZyBwaXhlbCBjb21wb25lbnQgdmFsdWVzLgorCitUaGUgZXhhY3QgY29tcG9uZW50IGFzc29jaWF0ZWQgdG8gZWFjaCBvZiB0aGUgQHZhcntjKn0gb3B0aW9ucyBkZXBlbmRzIG9uIHRoZQorZm9ybWF0IGluIGlucHV0cy4KKworVGhlIGV4cHJlc3Npb25zIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gdworQGl0ZW0gaAorVGhlIGlucHV0IHdpZHRoIGFuZCBoZWlnaHQuCisKK0BpdGVtIHgKK1RoZSBmaXJzdCBpbnB1dCB2YWx1ZSBmb3IgdGhlIHBpeGVsIGNvbXBvbmVudC4KKworQGl0ZW0geQorVGhlIHNlY29uZCBpbnB1dCB2YWx1ZSBmb3IgdGhlIHBpeGVsIGNvbXBvbmVudC4KKworQGl0ZW0gYmR4CitUaGUgZmlyc3QgaW5wdXQgdmlkZW8gYml0IGRlcHRoLgorCitAaXRlbSBiZHkKK1RoZSBzZWNvbmQgaW5wdXQgdmlkZW8gYml0IGRlcHRoLgorQGVuZCB0YWJsZQorCitBbGwgZXhwcmVzc2lvbnMgZGVmYXVsdCB0byAieCIuCisKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK0BpdGVtaXplCitAaXRlbQorSGlnaGxpZ2h0IGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIFJHQiB2aWRlbyBzdHJlYW1zOgorQGV4YW1wbGUKK2x1dDI9J2lmbm90KHgteSwwLHBvdygyLGJkeCktMSk6aWZub3QoeC15LDAscG93KDIsYmR4KS0xKTppZm5vdCh4LXksMCxwb3coMixiZHgpLTEpJworQGVuZCBleGFtcGxlCisKK0BpdGVtCitIaWdobGlnaHQgZGlmZmVyZW5jZXMgYmV0d2VlbiB0d28gWVVWIHZpZGVvIHN0cmVhbXM6CitAZXhhbXBsZQorbHV0Mj0naWZub3QoeC15LDAscG93KDIsYmR4KS0xKTppZm5vdCh4LXkscG93KDIsYmR4LTEpLHBvdygyLGJkeCktMSk6aWZub3QoeC15LHBvdygyLGJkeC0xKSxwb3coMixiZHgpLTEpJworQGVuZCBleGFtcGxlCisKK0BpdGVtCitTaG93IG1heCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHZpZGVvIHN0cmVhbXM6CitAZXhhbXBsZQorbHV0Mj0naWYobHQoeCx5KSwwLGlmKGd0KHgseSkscG93KDIsYmR4KS0xLHBvdygyLGJkeC0xKSkpOmlmKGx0KHgseSksMCxpZihndCh4LHkpLHBvdygyLGJkeCktMSxwb3coMixiZHgtMSkpKTppZihsdCh4LHkpLDAsaWYoZ3QoeCx5KSxwb3coMixiZHgpLTEscG93KDIsYmR4LTEpKSknCitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCitAc2VjdGlvbiBtYXNrZWRjbGFtcAorCitDbGFtcCB0aGUgZmlyc3QgaW5wdXQgc3RyZWFtIHdpdGggdGhlIHNlY29uZCBpbnB1dCBhbmQgdGhpcmQgaW5wdXQgc3RyZWFtLgorCitSZXR1cm5zIHRoZSB2YWx1ZSBvZiBmaXJzdCBzdHJlYW0gdG8gYmUgYmV0d2VlbiBzZWNvbmQgaW5wdXQKK3N0cmVhbSAtIEBjb2Rle3VuZGVyc2hvb3R9IGFuZCB0aGlyZCBpbnB1dCBzdHJlYW0gKyBAY29kZXtvdmVyc2hvb3R9LgorCitUaGlzIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSB1bmRlcnNob290CitEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezB9LgorCitAaXRlbSBvdmVyc2hvb3QKK0RlZmF1bHQgdmFsdWUgaXMgQGNvZGV7MH0uCisKK0BpdGVtIHBsYW5lcworU2V0IHdoaWNoIHBsYW5lcyB3aWxsIGJlIHByb2Nlc3NlZCBhcyBiaXRtYXAsIHVucHJvY2Vzc2VkIHBsYW5lcyB3aWxsIGJlCitjb3BpZWQgZnJvbSBmaXJzdCBzdHJlYW0uCitCeSBkZWZhdWx0IHZhbHVlIDB4ZiwgYWxsIHBsYW5lcyB3aWxsIGJlIHByb2Nlc3NlZC4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gbWFza2VkbWVyZ2UKIAogTWVyZ2UgdGhlIGZpcnN0IGlucHV0IHN0cmVhbSB3aXRoIHRoZSBzZWNvbmQgaW5wdXQgc3RyZWFtIHVzaW5nIHBlciBwaXhlbApAQCAtODQ0OCwxMDQgKzEwOTMwLDE4MCBAQAogQGVuZCBleGFtcGxlCiBAZW5kIGl0ZW1pemUKIAotQHNlY3Rpb24gbWV0YWRhdGEsIGFtZXRhZGF0YQorQHNlY3Rpb24gbWVzdGltYXRlCiAKLU1hbmlwdWxhdGUgZnJhbWUgbWV0YWRhdGEuCitFc3RpbWF0ZSBhbmQgZXhwb3J0IG1vdGlvbiB2ZWN0b3JzIHVzaW5nIGJsb2NrIG1hdGNoaW5nIGFsZ29yaXRobXMuCitNb3Rpb24gdmVjdG9ycyBhcmUgc3RvcmVkIGluIGZyYW1lIHNpZGUgZGF0YSB0byBiZSB1c2VkIGJ5IG90aGVyIGZpbHRlcnMuCiAKIFRoaXMgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgotCiBAdGFibGUgQG9wdGlvbgotQGl0ZW0gbW9kZQotU2V0IG1vZGUgb2Ygb3BlcmF0aW9uIG9mIHRoZSBmaWx0ZXIuCi0KLUNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKK0BpdGVtIG1ldGhvZAorU3BlY2lmeSB0aGUgbW90aW9uIGVzdGltYXRpb24gbWV0aG9kLiBBY2NlcHRzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKIAogQHRhYmxlIEBzYW1wCi1AaXRlbSBzZWxlY3QKLUlmIGJvdGggQGNvZGV7dmFsdWV9IGFuZCBAY29kZXtrZXl9IGlzIHNldCwgc2VsZWN0IGZyYW1lcwotd2hpY2ggaGF2ZSBzdWNoIG1ldGFkYXRhLiBJZiBvbmx5IEBjb2Rle2tleX0gaXMgc2V0LCBzZWxlY3QKLWV2ZXJ5IGZyYW1lIHRoYXQgaGFzIHN1Y2gga2V5IGluIG1ldGFkYXRhLgorQGl0ZW0gZXNhCitFeGhhdXN0aXZlIHNlYXJjaCBhbGdvcml0aG0uCitAaXRlbSB0c3MKK1RocmVlIHN0ZXAgc2VhcmNoIGFsZ29yaXRobS4KK0BpdGVtIHRkbHMKK1R3byBkaW1lbnNpb25hbCBsb2dhcml0aG1pYyBzZWFyY2ggYWxnb3JpdGhtLgorQGl0ZW0gbnRzcworTmV3IHRocmVlIHN0ZXAgc2VhcmNoIGFsZ29yaXRobS4KK0BpdGVtIGZzcworRm91ciBzdGVwIHNlYXJjaCBhbGdvcml0aG0uCitAaXRlbSBkcworRGlhbW9uZCBzZWFyY2ggYWxnb3JpdGhtLgorQGl0ZW0gaGV4YnMKK0hleGFnb24tYmFzZWQgc2VhcmNoIGFsZ29yaXRobS4KK0BpdGVtIGVwenMKK0VuaGFuY2VkIHByZWRpY3RpdmUgem9uYWwgc2VhcmNoIGFsZ29yaXRobS4KK0BpdGVtIHVtaAorVW5ldmVuIG11bHRpLWhleGFnb24gc2VhcmNoIGFsZ29yaXRobS4KK0BlbmQgdGFibGUKK0RlZmF1bHQgdmFsdWUgaXMgQHNhbXB7ZXNhfS4KIAotQGl0ZW0gYWRkCi1BZGQgbmV3IG1ldGFkYXRhIEBjb2Rle2tleX0gYW5kIEBjb2Rle3ZhbHVlfS4gSWYga2V5IGlzIGFscmVhZHkgYXZhaWxhYmxlCi1kbyBub3RoaW5nLgorQGl0ZW0gbWJfc2l6ZQorTWFjcm9ibG9jayBzaXplLiBEZWZhdWx0IEBjb2RlezE2fS4KIAotQGl0ZW0gbW9kaWZ5Ci1Nb2RpZnkgdmFsdWUgb2YgYWxyZWFkeSBwcmVzZW50IGtleS4KLQotQGl0ZW0gZGVsZXRlCi1JZiBAY29kZXt2YWx1ZX0gaXMgc2V0LCBkZWxldGUgb25seSBrZXlzIHRoYXQgaGF2ZSBzdWNoIHZhbHVlLgotT3RoZXJ3aXNlLCBkZWxldGUga2V5LgotCi1AaXRlbSBwcmludAotUHJpbnQga2V5IGFuZCBpdHMgdmFsdWUgaWYgbWV0YWRhdGEgd2FzIGZvdW5kLiBJZiBAY29kZXtrZXl9IGlzIG5vdCBzZXQgcHJpbnQgYWxsCi1tZXRhZGF0YSB2YWx1ZXMgYXZhaWxhYmxlIGluIGZyYW1lLgorQGl0ZW0gc2VhcmNoX3BhcmFtCitTZWFyY2ggcGFyYW1ldGVyLiBEZWZhdWx0IEBjb2Rlezd9LgogQGVuZCB0YWJsZQogCi1AaXRlbSBrZXkKLVNldCBrZXkgdXNlZCB3aXRoIGFsbCBtb2Rlcy4gTXVzdCBiZSBzZXQgZm9yIGFsbCBtb2RlcyBleGNlcHQgQGNvZGV7cHJpbnR9LgorQHNlY3Rpb24gbWlkZXF1YWxpemVyCiAKLUBpdGVtIHZhbHVlCi1TZXQgbWV0YWRhdGEgdmFsdWUgd2hpY2ggd2lsbCBiZSB1c2VkLiBUaGlzIG9wdGlvbiBpcyBtYW5kYXRvcnkgZm9yCi1AY29kZXttb2RpZnl9IGFuZCBAY29kZXthZGR9IG1vZGUuCitBcHBseSBNaWR3YXkgSW1hZ2UgRXF1YWxpemF0aW9uIGVmZmVjdCB1c2luZyB0d28gdmlkZW8gc3RyZWFtcy4KIAotQGl0ZW0gZnVuY3Rpb24KLVdoaWNoIGZ1bmN0aW9uIHRvIHVzZSB3aGVuIGNvbXBhcmluZyBtZXRhZGF0YSB2YWx1ZSBhbmQgQGNvZGV7dmFsdWV9LgorTWlkd2F5IEltYWdlIEVxdWFsaXphdGlvbiBhZGp1c3RzIGEgcGFpciBvZiBpbWFnZXMgdG8gaGF2ZSB0aGUgc2FtZQoraGlzdG9ncmFtLCB3aGlsZSBtYWludGFpbmluZyB0aGVpciBkeW5hbWljcyBhcyBtdWNoIGFzIHBvc3NpYmxlLiBJdCdzCit1c2VmdWwgZm9yIGUuZy4gbWF0Y2hpbmcgZXhwb3N1cmVzIGZyb20gYSBwYWlyIG9mIHN0ZXJlbyBjYW1lcmFzLgogCi1DYW4gYmUgb25lIG9mIGZvbGxvd2luZzoKK1RoaXMgZmlsdGVyIGhhcyB0d28gaW5wdXRzIGFuZCBvbmUgb3V0cHV0LCB3aGljaCBtdXN0IGJlIG9mIHNhbWUgcGl4ZWwgZm9ybWF0LCBidXQKK21heSBiZSBvZiBkaWZmZXJlbnQgc2l6ZXMuIFRoZSBvdXRwdXQgb2YgZmlsdGVyIGlzIGZpcnN0IGlucHV0IGFkanVzdGVkIHdpdGgKK21pZHdheSBoaXN0b2dyYW0gb2YgYm90aCBpbnB1dHMuCiAKLUB0YWJsZSBAc2FtcAotQGl0ZW0gc2FtZV9zdHIKLVZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgc3RyaW5ncywgcmV0dXJucyB0cnVlIGlmIG1ldGFkYXRhIHZhbHVlIGlzIHNhbWUgYXMgQGNvZGV7dmFsdWV9LgotCi1AaXRlbSBzdGFydHNfd2l0aAotVmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBzdHJpbmdzLCByZXR1cm5zIHRydWUgaWYgbWV0YWRhdGEgdmFsdWUgc3RhcnRzIHdpdGgKLXRoZSBAY29kZXt2YWx1ZX0gb3B0aW9uIHN0cmluZy4KLQotQGl0ZW0gbGVzcwotVmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBmbG9hdHMsIHJldHVybnMgdHJ1ZSBpZiBtZXRhZGF0YSB2YWx1ZSBpcyBsZXNzIHRoYW4gQGNvZGV7dmFsdWV9LgotCi1AaXRlbSBlcXVhbAotVmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBmbG9hdHMsIHJldHVybnMgdHJ1ZSBpZiBAY29kZXt2YWx1ZX0gaXMgZXF1YWwgd2l0aCBtZXRhZGF0YSB2YWx1ZS4KLQotQGl0ZW0gZ3JlYXRlcgotVmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBmbG9hdHMsIHJldHVybnMgdHJ1ZSBpZiBtZXRhZGF0YSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gQGNvZGV7dmFsdWV9LgotCi1AaXRlbSBleHByCi1WYWx1ZXMgYXJlIGludGVycHJldGVkIGFzIGZsb2F0cywgcmV0dXJucyB0cnVlIGlmIGV4cHJlc3Npb24gZnJvbSBvcHRpb24gQGNvZGV7ZXhwcn0KLWV2YWx1YXRlcyB0byB0cnVlLgotQGVuZCB0YWJsZQotCi1AaXRlbSBleHByCi1TZXQgZXhwcmVzc2lvbiB3aGljaCBpcyB1c2VkIHdoZW4gQGNvZGV7ZnVuY3Rpb259IGlzIHNldCB0byBAY29kZXtleHByfS4KLVRoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCB0aHJvdWdoIHRoZSBldmFsIEFQSSBhbmQgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZwotY29uc3RhbnRzOgorVGhpcyBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbjoKIAogQHRhYmxlIEBvcHRpb24KLUBpdGVtIFZBTFVFMQotRmxvYXQgcmVwcmVzZW50YXRpb24gb2YgQGNvZGV7dmFsdWV9IGZyb20gbWV0YWRhdGEga2V5LgotCi1AaXRlbSBWQUxVRTIKLUZsb2F0IHJlcHJlc2VudGF0aW9uIG9mIEBjb2Rle3ZhbHVlfSBhcyBzdXBwbGllZCBieSB1c2VyIGluIEBjb2Rle3ZhbHVlfSBvcHRpb24uCitAaXRlbSBwbGFuZXMKK1NldCB3aGljaCBwbGFuZXMgdG8gcHJvY2Vzcy4gRGVmYXVsdCBpcyBAY29kZXsxNX0sIHdoaWNoIGlzIGFsbCBhdmFpbGFibGUgcGxhbmVzLgogQGVuZCB0YWJsZQogCi1AaXRlbSBmaWxlCi1JZiBzcGVjaWZpZWQgaW4gQGNvZGV7cHJpbnR9IG1vZGUsIG91dHB1dCBpcyB3cml0dGVuIHRvIHRoZSBuYW1lZCBmaWxlLiBXaGVuCi1maWxlbmFtZSBlcXVhbHMgIi0iIGRhdGEgaXMgd3JpdHRlbiB0byBzdGFuZGFyZCBvdXRwdXQuCi1JZiBAY29kZXtmaWxlfSBvcHRpb24gaXMgbm90IHNldCwgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gdGhlIGxvZyB3aXRoIEFWX0xPR19JTkZPCi1sb2dsZXZlbC4KK0BzZWN0aW9uIG1pbnRlcnBvbGF0ZQorCitDb252ZXJ0IHRoZSB2aWRlbyB0byBzcGVjaWZpZWQgZnJhbWUgcmF0ZSB1c2luZyBtb3Rpb24gaW50ZXJwb2xhdGlvbi4KKworVGhpcyBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZnBzCitTcGVjaWZ5IHRoZSBvdXRwdXQgZnJhbWUgcmF0ZS4gVGhpcyBjYW4gYmUgcmF0aW9uYWwgZS5nLiBAY29kZXs2MDAwMC8xMDAxfS4gRnJhbWVzIGFyZSBkcm9wcGVkIGlmIEB2YXJ7ZnBzfSBpcyBsb3dlciB0aGFuIHNvdXJjZSBmcHMuIERlZmF1bHQgQGNvZGV7NjB9LgorCitAaXRlbSBtaV9tb2RlCitNb3Rpb24gaW50ZXJwb2xhdGlvbiBtb2RlLiBGb2xsb3dpbmcgdmFsdWVzIGFyZSBhY2NlcHRlZDoKK0B0YWJsZSBAc2FtcAorQGl0ZW0gZHVwCitEdXBsaWNhdGUgcHJldmlvdXMgb3IgbmV4dCBmcmFtZSBmb3IgaW50ZXJwb2xhdGluZyBuZXcgb25lcy4KK0BpdGVtIGJsZW5kCitCbGVuZCBzb3VyY2UgZnJhbWVzLiBJbnRlcnBvbGF0ZWQgZnJhbWUgaXMgbWVhbiBvZiBwcmV2aW91cyBhbmQgbmV4dCBmcmFtZXMuCitAaXRlbSBtY2kKK01vdGlvbiBjb21wZW5zYXRlZCBpbnRlcnBvbGF0aW9uLiBGb2xsb3dpbmcgb3B0aW9ucyBhcmUgZWZmZWN0aXZlIHdoZW4gdGhpcyBtb2RlIGlzIHNlbGVjdGVkOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIG1jX21vZGUKK01vdGlvbiBjb21wZW5zYXRpb24gbW9kZS4gRm9sbG93aW5nIHZhbHVlcyBhcmUgYWNjZXB0ZWQ6CitAdGFibGUgQHNhbXAKK0BpdGVtIG9ibWMKK092ZXJsYXBwZWQgYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbi4KK0BpdGVtIGFvYm1jCitBZGFwdGl2ZSBvdmVybGFwcGVkIGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24uIFdpbmRvdyB3ZWlnaHRpbmcgY29lZmZpY2llbnRzIGFyZSBjb250cm9sbGVkIGFkYXB0aXZlbHkgYWNjb3JkaW5nIHRvIHRoZSByZWxpYWJpbGl0aWVzIG9mIHRoZSBuZWlnaGJvcmluZyBtb3Rpb24gdmVjdG9ycyB0byByZWR1Y2Ugb3ZlcnNtb290aGluZy4KK0BlbmQgdGFibGUKK0RlZmF1bHQgbW9kZSBpcyBAc2FtcHtvYm1jfS4KKworQGl0ZW0gbWVfbW9kZQorTW90aW9uIGVzdGltYXRpb24gbW9kZS4gRm9sbG93aW5nIHZhbHVlcyBhcmUgYWNjZXB0ZWQ6CitAdGFibGUgQHNhbXAKK0BpdGVtIGJpZGlyCitCaWRpcmVjdGlvbmFsIG1vdGlvbiBlc3RpbWF0aW9uLiBNb3Rpb24gdmVjdG9ycyBhcmUgZXN0aW1hdGVkIGZvciBlYWNoIHNvdXJjZSBmcmFtZSBpbiBib3RoIGZvcndhcmQgYW5kIGJhY2t3YXJkIGRpcmVjdGlvbnMuCitAaXRlbSBiaWxhdAorQmlsYXRlcmFsIG1vdGlvbiBlc3RpbWF0aW9uLiBNb3Rpb24gdmVjdG9ycyBhcmUgZXN0aW1hdGVkIGRpcmVjdGx5IGZvciBpbnRlcnBvbGF0ZWQgZnJhbWUuCitAZW5kIHRhYmxlCitEZWZhdWx0IG1vZGUgaXMgQHNhbXB7YmlsYXR9LgorCitAaXRlbSBtZQorVGhlIGFsZ29yaXRobSB0byBiZSB1c2VkIGZvciBtb3Rpb24gZXN0aW1hdGlvbi4gRm9sbG93aW5nIHZhbHVlcyBhcmUgYWNjZXB0ZWQ6CitAdGFibGUgQHNhbXAKK0BpdGVtIGVzYQorRXhoYXVzdGl2ZSBzZWFyY2ggYWxnb3JpdGhtLgorQGl0ZW0gdHNzCitUaHJlZSBzdGVwIHNlYXJjaCBhbGdvcml0aG0uCitAaXRlbSB0ZGxzCitUd28gZGltZW5zaW9uYWwgbG9nYXJpdGhtaWMgc2VhcmNoIGFsZ29yaXRobS4KK0BpdGVtIG50c3MKK05ldyB0aHJlZSBzdGVwIHNlYXJjaCBhbGdvcml0aG0uCitAaXRlbSBmc3MKK0ZvdXIgc3RlcCBzZWFyY2ggYWxnb3JpdGhtLgorQGl0ZW0gZHMKK0RpYW1vbmQgc2VhcmNoIGFsZ29yaXRobS4KK0BpdGVtIGhleGJzCitIZXhhZ29uLWJhc2VkIHNlYXJjaCBhbGdvcml0aG0uCitAaXRlbSBlcHpzCitFbmhhbmNlZCBwcmVkaWN0aXZlIHpvbmFsIHNlYXJjaCBhbGdvcml0aG0uCitAaXRlbSB1bWgKK1VuZXZlbiBtdWx0aS1oZXhhZ29uIHNlYXJjaCBhbGdvcml0aG0uCitAZW5kIHRhYmxlCitEZWZhdWx0IGFsZ29yaXRobSBpcyBAc2FtcHtlcHpzfS4KKworQGl0ZW0gbWJfc2l6ZQorTWFjcm9ibG9jayBzaXplLiBEZWZhdWx0IEBjb2RlezE2fS4KKworQGl0ZW0gc2VhcmNoX3BhcmFtCitNb3Rpb24gZXN0aW1hdGlvbiBzZWFyY2ggcGFyYW1ldGVyLiBEZWZhdWx0IEBjb2RlezMyfS4KKworQGl0ZW0gdnNibWMKK0VuYWJsZSB2YXJpYWJsZS1zaXplIGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24uIE1vdGlvbiBlc3RpbWF0aW9uIGlzIGFwcGxpZWQgd2l0aCBzbWFsbGVyIGJsb2NrIHNpemVzIGF0IG9iamVjdCBib3VuZGFyaWVzIGluIG9yZGVyIHRvIG1ha2UgdGhlIHRoZW0gbGVzcyBibHVyLiBEZWZhdWx0IGlzIEBjb2RlezB9IChkaXNhYmxlZCkuCitAZW5kIHRhYmxlCiBAZW5kIHRhYmxlCiAKLUBzdWJzZWN0aW9uIEV4YW1wbGVzCitAaXRlbSBzY2QKK1NjZW5lIGNoYW5nZSBkZXRlY3Rpb24gbWV0aG9kLiBTY2VuZSBjaGFuZ2UgbGVhZHMgbW90aW9uIHZlY3RvcnMgdG8gYmUgaW4gcmFuZG9tIGRpcmVjdGlvbi4gU2NlbmUgY2hhbmdlIGRldGVjdGlvbiByZXBsYWNlIGludGVycG9sYXRlZCBmcmFtZXMgYnkgZHVwbGljYXRlIG9uZXMuIE1heSBub3QgYmUgbmVlZGVkIGZvciBvdGhlciBtb2Rlcy4gRm9sbG93aW5nIHZhbHVlcyBhcmUgYWNjZXB0ZWQ6CitAdGFibGUgQHNhbXAKK0BpdGVtIG5vbmUKK0Rpc2FibGUgc2NlbmUgY2hhbmdlIGRldGVjdGlvbi4KK0BpdGVtIGZkaWZmCitGcmFtZSBkaWZmZXJlbmNlLiBDb3JyZXNwb25kaW5nIHBpeGVsIHZhbHVlcyBhcmUgY29tcGFyZWQgYW5kIGlmIGl0IHNhdGlzZmllcyBAdmFye3NjZF90aHJlc2hvbGR9IHNjZW5lIGNoYW5nZSBpcyBkZXRlY3RlZC4KK0BlbmQgdGFibGUKK0RlZmF1bHQgbWV0aG9kIGlzIEBzYW1we2ZkaWZmfS4KIAotQGl0ZW1pemUKLUBpdGVtCi1QcmludCBhbGwgbWV0YWRhdGEgdmFsdWVzIGZvciBmcmFtZXMgd2l0aCBrZXkgQGNvZGV7bGF2Zmkuc2luZ25hbHN0YXRzLllESUZ9IHdpdGggdmFsdWVzCi1iZXR3ZWVuIDAgYW5kIDEuCi1AZXhhbXBsZQotQGVuZCBleGFtcGxlCi1zaWduYWxzdGF0cyxtZXRhZGF0YT1wcmludDprZXk9bGF2Zmkuc2lnbmFsc3RhdHMuWURJRjp2YWx1ZT0wOmZ1bmN0aW9uPWV4cHI6ZXhwcj0nYmV0d2VlbihWQUxVRTEsMCwxKScKLUBlbmQgaXRlbWl6ZQorQGl0ZW0gc2NkX3RocmVzaG9sZAorU2NlbmUgY2hhbmdlIGRldGVjdGlvbiB0aHJlc2hvbGQuIERlZmF1bHQgaXMgQGNvZGV7NS4wfS4KK0BlbmQgdGFibGUKKworQHNlY3Rpb24gbWl4CisKK01peCBzZXZlcmFsIHZpZGVvIGlucHV0IHN0cmVhbXMgaW50byBvbmUgdmlkZW8gc3RyZWFtLgorCitBIGRlc2NyaXB0aW9uIG9mIHRoZSBhY2NlcHRlZCBvcHRpb25zIGZvbGxvd3MuCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBuYl9pbnB1dHMKK1RoZSBudW1iZXIgb2YgaW5wdXRzLiBJZiB1bnNwZWNpZmllZCwgaXQgZGVmYXVsdHMgdG8gMi4KKworQGl0ZW0gd2VpZ2h0cworU3BlY2lmeSB3ZWlnaHQgb2YgZWFjaCBpbnB1dCB2aWRlbyBzdHJlYW0gYXMgc2VxdWVuY2UuCitFYWNoIHdlaWdodCBpcyBzZXBhcmF0ZWQgYnkgc3BhY2UuCisKK0BpdGVtIGR1cmF0aW9uCitTcGVjaWZ5IGhvdyBlbmQgb2Ygc3RyZWFtIGlzIGRldGVybWluZWQuCitAdGFibGUgQHNhbXAKK0BpdGVtIGxvbmdlc3QKK1RoZSBkdXJhdGlvbiBvZiB0aGUgbG9uZ2VzdCBpbnB1dC4gKGRlZmF1bHQpCisKK0BpdGVtIHNob3J0ZXN0CitUaGUgZHVyYXRpb24gb2YgdGhlIHNob3J0ZXN0IGlucHV0LgorCitAaXRlbSBmaXJzdAorVGhlIGR1cmF0aW9uIG9mIHRoZSBmaXJzdCBpbnB1dC4KK0BlbmQgdGFibGUKK0BlbmQgdGFibGUKIAogQHNlY3Rpb24gbXBkZWNpbWF0ZQogCkBAIC04NTYyLDcgKzExMTIwLDcgQEAKIEBpdGVtIG1heAogU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25zZWN1dGl2ZSBmcmFtZXMgd2hpY2ggY2FuIGJlIGRyb3BwZWQgKGlmCiBwb3NpdGl2ZSksIG9yIHRoZSBtaW5pbXVtIGludGVydmFsIGJldHdlZW4gZHJvcHBlZCBmcmFtZXMgKGlmCi1uZWdhdGl2ZSkuIElmIHRoZSB2YWx1ZSBpcyAwLCB0aGUgZnJhbWUgaXMgZHJvcHBlZCB1bnJlZ2FyZGluZyB0aGUKK25lZ2F0aXZlKS4gSWYgdGhlIHZhbHVlIGlzIDAsIHRoZSBmcmFtZSBpcyBkcm9wcGVkIGRpc3JlZ2FyZGluZyB0aGUKIG51bWJlciBvZiBwcmV2aW91cyBzZXF1ZW50aWFsbHkgZHJvcHBlZCBmcmFtZXMuCiAKIERlZmF1bHQgdmFsdWUgaXMgMC4KQEAgLTg1OTMsNiArMTExNTEsNDEgQEAKIEl0IGFjY2VwdHMgYW4gaW50ZWdlciBpbiBpbnB1dDsgaWYgbm9uLXplcm8gaXQgbmVnYXRlcyB0aGUKIGFscGhhIGNvbXBvbmVudCAoaWYgYXZhaWxhYmxlKS4gVGhlIGRlZmF1bHQgdmFsdWUgaW4gaW5wdXQgaXMgMC4KIAorQHNlY3Rpb24gbmxtZWFucworCitEZW5vaXNlIGZyYW1lcyB1c2luZyBOb24tTG9jYWwgTWVhbnMgYWxnb3JpdGhtLgorCitFYWNoIHBpeGVsIGlzIGFkanVzdGVkIGJ5IGxvb2tpbmcgZm9yIG90aGVyIHBpeGVscyB3aXRoIHNpbWlsYXIgY29udGV4dHMuIFRoaXMKK2NvbnRleHQgc2ltaWxhcml0eSBpcyBkZWZpbmVkIGJ5IGNvbXBhcmluZyB0aGVpciBzdXJyb3VuZGluZyBwYXRjaGVzIG9mIHNpemUKK0BvcHRpb257cH14QG9wdGlvbntwfS4gUGF0Y2hlcyBhcmUgc2VhcmNoZWQgaW4gYW4gYXJlYSBvZiBAb3B0aW9ue3J9eEBvcHRpb257cn0KK2Fyb3VuZCB0aGUgcGl4ZWwuCisKK05vdGUgdGhhdCB0aGUgcmVzZWFyY2ggYXJlYSBkZWZpbmVzIGNlbnRlcnMgZm9yIHBhdGNoZXMsIHdoaWNoIG1lYW5zIHNvbWUKK3BhdGNoZXMgd2lsbCBiZSBtYWRlIG9mIHBpeGVscyBvdXRzaWRlIHRoYXQgcmVzZWFyY2ggYXJlYS4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9ucy4KKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHMKK1NldCBkZW5vaXNpbmcgc3RyZW5ndGguCisKK0BpdGVtIHAKK1NldCBwYXRjaCBzaXplLgorCitAaXRlbSBwYworU2FtZSBhcyBAb3B0aW9ue3B9IGJ1dCBmb3IgY2hyb21hIHBsYW5lcy4KKworVGhlIGRlZmF1bHQgdmFsdWUgaXMgQHZhcnswfSBhbmQgbWVhbnMgYXV0b21hdGljLgorCitAaXRlbSByCitTZXQgcmVzZWFyY2ggc2l6ZS4KKworQGl0ZW0gcmMKK1NhbWUgYXMgQG9wdGlvbntyfSBidXQgZm9yIGNocm9tYSBwbGFuZXMuCisKK1RoZSBkZWZhdWx0IHZhbHVlIGlzIEB2YXJ7MH0gYW5kIG1lYW5zIGF1dG9tYXRpYy4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gbm5lZGkKIAogRGVpbnRlcmxhY2UgdmlkZW8gdXNpbmcgbmV1cmFsIG5ldHdvcmsgZWRnZSBkaXJlY3RlZCBpbnRlcnBvbGF0aW9uLgpAQCAtODYyMyw5ICsxMTIxNiw5IEBACiBVc2UgdG9wIGZpZWxkIG9ubHkuCiBAaXRlbSBiCiBVc2UgYm90dG9tIGZpZWxkIG9ubHkuCi1AaXRlbSBmdAorQGl0ZW0gdGYKIFVzZSBib3RoIGZpZWxkcywgdG9wIGZpcnN0LgotQGl0ZW0gZmIKK0BpdGVtIGJmCiBVc2UgYm90aCBmaWVsZHMsIGJvdHRvbSBmaXJzdC4KIEBlbmQgdGFibGUKIApAQCAtODY0OSw3ICsxMTI0Miw3IEBACiBAZW5kIHRhYmxlCiAKIEBpdGVtIG5ucwotU2V0IHRoZSBudW1iZXIgb2YgbmV1cm9ucyBpbiBwcmVkaWNjdG9yIG5ldXJhbCBuZXR3b3JrLgorU2V0IHRoZSBudW1iZXIgb2YgbmV1cm9ucyBpbiBwcmVkaWN0b3IgbmV1cmFsIG5ldHdvcmsuCiBDYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAKIEB0YWJsZSBAc2FtcApAQCAtODcxMiw3ICsxMTMwNSw3IEBACiAKIEBpdGVtIHBpeF9mbXRzCiBBICd8Jy1zZXBhcmF0ZWQgbGlzdCBvZiBwaXhlbCBmb3JtYXQgbmFtZXMsIHN1Y2ggYXMKLWFwaXhfZm10cz15dXY0MjBwfG1vbm93fHJnYjI0Ii4KK3BpeF9mbXRzPXl1djQyMHB8bW9ub3d8cmdiMjQiLgogCiBAZW5kIHRhYmxlCiAKQEAgLTg3ODIsNiArMTEzNzUsODYgQEAKIG5vaXNlPWFsbHM9MjA6YWxsZj10K3UKIEBlbmQgZXhhbXBsZQogCitAc2VjdGlvbiBub3JtYWxpemUKKworTm9ybWFsaXplIFJHQiB2aWRlbyAoYWthIGhpc3RvZ3JhbSBzdHJldGNoaW5nLCBjb250cmFzdCBzdHJldGNoaW5nKS4KK1NlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTm9ybWFsaXphdGlvbl8oaW1hZ2VfcHJvY2Vzc2luZykKKworRm9yIGVhY2ggY2hhbm5lbCBvZiBlYWNoIGZyYW1lLCB0aGUgZmlsdGVyIGNvbXB1dGVzIHRoZSBpbnB1dCByYW5nZSBhbmQgbWFwcworaXQgbGluZWFybHkgdG8gdGhlIHVzZXItc3BlY2lmaWVkIG91dHB1dCByYW5nZS4gVGhlIG91dHB1dCByYW5nZSBkZWZhdWx0cwordG8gdGhlIGZ1bGwgZHluYW1pYyByYW5nZSBmcm9tIHB1cmUgYmxhY2sgdG8gcHVyZSB3aGl0ZS4KKworVGVtcG9yYWwgc21vb3RoaW5nIGNhbiBiZSB1c2VkIG9uIHRoZSBpbnB1dCByYW5nZSB0byByZWR1Y2UgZmxpY2tlcmluZyAocmFwaWQKK2NoYW5nZXMgaW4gYnJpZ2h0bmVzcykgY2F1c2VkIHdoZW4gc21hbGwgZGFyayBvciBicmlnaHQgb2JqZWN0cyBlbnRlciBvciBsZWF2ZQordGhlIHNjZW5lLiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGF1dG8tZXhwb3N1cmUgKGF1dG9tYXRpYyBnYWluIGNvbnRyb2wpIG9uIGEKK3ZpZGVvIGNhbWVyYSwgYW5kLCBsaWtlIGEgdmlkZW8gY2FtZXJhLCBpdCBtYXkgY2F1c2UgYSBwZXJpb2Qgb2Ygb3Zlci0gb3IKK3VuZGVyLWV4cG9zdXJlIG9mIHRoZSB2aWRlby4KKworVGhlIFIsRyxCIGNoYW5uZWxzIGNhbiBiZSBub3JtYWxpemVkIGluZGVwZW5kZW50bHksIHdoaWNoIG1heSBjYXVzZSBzb21lCitjb2xvciBzaGlmdGluZywgb3IgbGlua2VkIHRvZ2V0aGVyIGFzIGEgc2luZ2xlIGNoYW5uZWwsIHdoaWNoIHByZXZlbnRzCitjb2xvciBzaGlmdGluZy4gTGlua2VkIG5vcm1hbGl6YXRpb24gcHJlc2VydmVzIGh1ZS4gSW5kZXBlbmRlbnQgbm9ybWFsaXphdGlvbgorZG9lcyBub3QsIHNvIGl0IGNhbiBiZSB1c2VkIHRvIHJlbW92ZSBzb21lIGNvbG9yIGNhc3RzLiBJbmRlcGVuZGVudCBhbmQgbGlua2VkCitub3JtYWxpemF0aW9uIGNhbiBiZSBjb21iaW5lZCBpbiBhbnkgcmF0aW8uCisKK1RoZSBub3JtYWxpemUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gYmxhY2twdAorQGl0ZW0gd2hpdGVwdAorQ29sb3JzIHdoaWNoIGRlZmluZSB0aGUgb3V0cHV0IHJhbmdlLiBUaGUgbWluaW11bSBpbnB1dCB2YWx1ZSBpcyBtYXBwZWQgdG8KK3RoZSBAdmFye2JsYWNrcHR9LiBUaGUgbWF4aW11bSBpbnB1dCB2YWx1ZSBpcyBtYXBwZWQgdG8gdGhlIEB2YXJ7d2hpdGVwdH0uCitUaGUgZGVmYXVsdHMgYXJlIGJsYWNrIGFuZCB3aGl0ZSByZXNwZWN0aXZlbHkuIFNwZWNpZnlpbmcgd2hpdGUgZm9yCitAdmFye2JsYWNrcHR9IGFuZCBibGFjayBmb3IgQHZhcnt3aGl0ZXB0fSB3aWxsIGdpdmUgY29sb3ItaW52ZXJ0ZWQsCitub3JtYWxpemVkIHZpZGVvLiBTaGFkZXMgb2YgZ3JleSBjYW4gYmUgdXNlZCB0byByZWR1Y2UgdGhlIGR5bmFtaWMgcmFuZ2UKKyhjb250cmFzdCkuIFNwZWNpZnlpbmcgc2F0dXJhdGVkIGNvbG9ycyBoZXJlIGNhbiBjcmVhdGUgc29tZSBpbnRlcmVzdGluZworZWZmZWN0cy4KKworQGl0ZW0gc21vb3RoaW5nCitUaGUgbnVtYmVyIG9mIHByZXZpb3VzIGZyYW1lcyB0byB1c2UgZm9yIHRlbXBvcmFsIHNtb290aGluZy4gVGhlIGlucHV0IHJhbmdlCitvZiBlYWNoIGNoYW5uZWwgaXMgc21vb3RoZWQgdXNpbmcgYSByb2xsaW5nIGF2ZXJhZ2Ugb3ZlciB0aGUgY3VycmVudCBmcmFtZQorYW5kIHRoZSBAdmFye3Ntb290aGluZ30gcHJldmlvdXMgZnJhbWVzLiBUaGUgZGVmYXVsdCBpcyAwIChubyB0ZW1wb3JhbAorc21vb3RoaW5nKS4KKworQGl0ZW0gaW5kZXBlbmRlbmNlCitDb250cm9scyB0aGUgcmF0aW8gb2YgaW5kZXBlbmRlbnQgKGNvbG9yIHNoaWZ0aW5nKSBjaGFubmVsIG5vcm1hbGl6YXRpb24gdG8KK2xpbmtlZCAoY29sb3IgcHJlc2VydmluZykgbm9ybWFsaXphdGlvbi4gMC4wIGlzIGZ1bGx5IGxpbmtlZCwgMS4wIGlzIGZ1bGx5CitpbmRlcGVuZGVudC4gRGVmYXVsdHMgdG8gMS4wIChmdWxseSBpbmRlcGVuZGVudCkuCisKK0BpdGVtIHN0cmVuZ3RoCitPdmVyYWxsIHN0cmVuZ3RoIG9mIHRoZSBmaWx0ZXIuIDEuMCBpcyBmdWxsIHN0cmVuZ3RoLiAwLjAgaXMgYSByYXRoZXIKK2V4cGVuc2l2ZSBuby1vcC4gRGVmYXVsdHMgdG8gMS4wIChmdWxsIHN0cmVuZ3RoKS4KKworQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitTdHJldGNoIHZpZGVvIGNvbnRyYXN0IHRvIHVzZSB0aGUgZnVsbCBkeW5hbWljIHJhbmdlLCB3aXRoIG5vIHRlbXBvcmFsCitzbW9vdGhpbmc7IG1heSBmbGlja2VyIGRlcGVuZGluZyBvbiB0aGUgc291cmNlIGNvbnRlbnQ6CitAZXhhbXBsZQorbm9ybWFsaXplPWJsYWNrcHQ9YmxhY2s6d2hpdGVwdD13aGl0ZTpzbW9vdGhpbmc9MAorQGVuZCBleGFtcGxlCisKK0FzIGFib3ZlLCBidXQgd2l0aCA1MCBmcmFtZXMgb2YgdGVtcG9yYWwgc21vb3RoaW5nOyBmbGlja2VyIHNob3VsZCBiZQorcmVkdWNlZCwgZGVwZW5kaW5nIG9uIHRoZSBzb3VyY2UgY29udGVudDoKK0BleGFtcGxlCitub3JtYWxpemU9YmxhY2twdD1ibGFjazp3aGl0ZXB0PXdoaXRlOnNtb290aGluZz01MAorQGVuZCBleGFtcGxlCisKK0FzIGFib3ZlLCBidXQgd2l0aCBodWUtcHJlc2VydmluZyBsaW5rZWQgY2hhbm5lbCBub3JtYWxpemF0aW9uOgorQGV4YW1wbGUKK25vcm1hbGl6ZT1ibGFja3B0PWJsYWNrOndoaXRlcHQ9d2hpdGU6c21vb3RoaW5nPTUwOmluZGVwZW5kZW5jZT0wCitAZW5kIGV4YW1wbGUKKworQXMgYWJvdmUsIGJ1dCB3aXRoIGhhbGYgc3RyZW5ndGg6CitAZXhhbXBsZQorbm9ybWFsaXplPWJsYWNrcHQ9YmxhY2s6d2hpdGVwdD13aGl0ZTpzbW9vdGhpbmc9NTA6aW5kZXBlbmRlbmNlPTA6c3RyZW5ndGg9MC41CitAZW5kIGV4YW1wbGUKKworTWFwIHRoZSBkYXJrZXN0IGlucHV0IGNvbG9yIHRvIHJlZCwgdGhlIGJyaWdodGVzdCBpbnB1dCBjb2xvciB0byBjeWFuOgorQGV4YW1wbGUKK25vcm1hbGl6ZT1ibGFja3B0PXJlZDp3aGl0ZXB0PWN5YW4KK0BlbmQgZXhhbXBsZQorCiBAc2VjdGlvbiBudWxsCiAKIFBhc3MgdGhlIHZpZGVvIHNvdXJjZSB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dC4KQEAgLTg5MTQsNiArMTE1ODcsODQgQEAKIFRoZXNlIHBhcmFtZXRlcnMgY29ycmVzcG9uZCB0byB0aGUgcGFyYW1ldGVycyBhc3NpZ25lZCB0byB0aGUKIGxpYm9wZW5jdiBmdW5jdGlvbiBAY29kZXtjdlNtb290aH0uCiAKK0BzZWN0aW9uIG9zY2lsbG9zY29wZQorCisyRCBWaWRlbyBPc2NpbGxvc2NvcGUuCisKK1VzZWZ1bCB0byBtZWFzdXJlIHNwYXRpYWwgaW1wdWxzZSwgc3RlcCByZXNwb25zZXMsIGNocm9tYSBkZWxheXMsIGV0Yy4KKworSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSB4CitTZXQgc2NvcGUgY2VudGVyIHggcG9zaXRpb24uCisKK0BpdGVtIHkKK1NldCBzY29wZSBjZW50ZXIgeSBwb3NpdGlvbi4KKworQGl0ZW0gcworU2V0IHNjb3BlIHNpemUsIHJlbGF0aXZlIHRvIGZyYW1lIGRpYWdvbmFsLgorCitAaXRlbSB0CitTZXQgc2NvcGUgdGlsdC9yb3RhdGlvbi4KKworQGl0ZW0gbworU2V0IHRyYWNlIG9wYWNpdHkuCisKK0BpdGVtIHR4CitTZXQgdHJhY2UgY2VudGVyIHggcG9zaXRpb24uCisKK0BpdGVtIHR5CitTZXQgdHJhY2UgY2VudGVyIHkgcG9zaXRpb24uCisKK0BpdGVtIHR3CitTZXQgdHJhY2Ugd2lkdGgsIHJlbGF0aXZlIHRvIHdpZHRoIG9mIGZyYW1lLgorCitAaXRlbSB0aAorU2V0IHRyYWNlIGhlaWdodCwgcmVsYXRpdmUgdG8gaGVpZ2h0IG9mIGZyYW1lLgorCitAaXRlbSBjCitTZXQgd2hpY2ggY29tcG9uZW50cyB0byB0cmFjZS4gQnkgZGVmYXVsdCBpdCB0cmFjZXMgZmlyc3QgdGhyZWUgY29tcG9uZW50cy4KKworQGl0ZW0gZworRHJhdyB0cmFjZSBncmlkLiBCeSBkZWZhdWx0IGlzIGVuYWJsZWQuCisKK0BpdGVtIHN0CitEcmF3IHNvbWUgc3RhdGlzdGljcy4gQnkgZGVmYXVsdCBpcyBlbmFibGVkLgorCitAaXRlbSBzYworRHJhdyBzY29wZS4gQnkgZGVmYXVsdCBpcyBlbmFibGVkLgorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitAaXRlbWl6ZQorQGl0ZW0KK0luc3BlY3QgZnVsbCBmaXJzdCByb3cgb2YgdmlkZW8gZnJhbWUuCitAZXhhbXBsZQorb3NjaWxsb3Njb3BlPXg9MC41Onk9MDpzPTEKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorSW5zcGVjdCBmdWxsIGxhc3Qgcm93IG9mIHZpZGVvIGZyYW1lLgorQGV4YW1wbGUKK29zY2lsbG9zY29wZT14PTAuNTp5PTE6cz0xCitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK0luc3BlY3QgZnVsbCA1dGggbGluZSBvZiB2aWRlbyBmcmFtZSBvZiBoZWlnaHQgMTA4MC4KK0BleGFtcGxlCitvc2NpbGxvc2NvcGU9eD0wLjU6eT01LzEwODA6cz0xCitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK0luc3BlY3QgZnVsbCBsYXN0IGNvbHVtbiBvZiB2aWRlbyBmcmFtZS4KK0BleGFtcGxlCitvc2NpbGxvc2NvcGU9eD0xOnk9MC41OnM9MTp0PTEKK0BlbmQgZXhhbXBsZQorCitAZW5kIGl0ZW1pemUKKwogQGFuY2hvcntvdmVybGF5fQogQHNlY3Rpb24gb3ZlcmxheQogCkBAIC04OTM1LDE3ICsxMTY4Niw3IEBACiBvdmVybGF5IHdpbGwgbm90IGJlIGRpc3BsYXllZCB3aXRoaW4gdGhlIG91dHB1dCB2aXNpYmxlIGFyZWEpLgogCiBAaXRlbSBlb2ZfYWN0aW9uCi1UaGUgYWN0aW9uIHRvIHRha2Ugd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgb24gdGhlIHNlY29uZGFyeSBpbnB1dDsgaXQgYWNjZXB0cwotb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotCi1AdGFibGUgQG9wdGlvbgotQGl0ZW0gcmVwZWF0Ci1SZXBlYXQgdGhlIGxhc3QgZnJhbWUgKHRoZSBkZWZhdWx0KS4KLUBpdGVtIGVuZGFsbAotRW5kIGJvdGggc3RyZWFtcy4KLUBpdGVtIHBhc3MKLVBhc3MgdGhlIG1haW4gaW5wdXQgdGhyb3VnaC4KLUBlbmQgdGFibGUKK1NlZSBAcmVme2ZyYW1lc3luY30uCiAKIEBpdGVtIGV2YWwKIFNldCB3aGVuIHRoZSBleHByZXNzaW9ucyBmb3IgQG9wdGlvbnt4fSwgYW5kIEBvcHRpb257eX0gYXJlIGV2YWx1YXRlZC4KQEAgLTg5NjMsOCArMTE3MDQsNyBAQAogRGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtmcmFtZX0uCiAKIEBpdGVtIHNob3J0ZXN0Ci1JZiBzZXQgdG8gMSwgZm9yY2UgdGhlIG91dHB1dCB0byB0ZXJtaW5hdGUgd2hlbiB0aGUgc2hvcnRlc3QgaW5wdXQKLXRlcm1pbmF0ZXMuIERlZmF1bHQgdmFsdWUgaXMgMC4KK1NlZSBAcmVme2ZyYW1lc3luY30uCiAKIEBpdGVtIGZvcm1hdAogU2V0IHRoZSBmb3JtYXQgZm9yIHRoZSBvdXRwdXQgdmlkZW8uCkBAIC04OTgxLDIwICsxMTcyMSwyMyBAQAogZm9yY2UgWVVWNDQ0IG91dHB1dAogCiBAaXRlbSByZ2IKLWZvcmNlIFJHQiBvdXRwdXQKK2ZvcmNlIHBhY2tlZCBSR0Igb3V0cHV0CisKK0BpdGVtIGdicnAKK2ZvcmNlIHBsYW5hciBSR0Igb3V0cHV0CisKK0BpdGVtIGF1dG8KK2F1dG9tYXRpY2FsbHkgcGljayBmb3JtYXQKIEBlbmQgdGFibGUKIAogRGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHt5dXY0MjB9LgogCi1AaXRlbSByZ2IgQGVtcGh7KGRlcHJlY2F0ZWQpfQotSWYgc2V0IHRvIDEsIGZvcmNlIHRoZSBmaWx0ZXIgdG8gYWNjZXB0IGlucHV0cyBpbiB0aGUgUkdCCi1jb2xvciBzcGFjZS4gRGVmYXVsdCB2YWx1ZSBpcyAwLiBUaGlzIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UKLUBvcHRpb257Zm9ybWF0fSBpbnN0ZWFkLgotCiBAaXRlbSByZXBlYXRsYXN0Ci1JZiBzZXQgdG8gMSwgZm9yY2UgdGhlIGZpbHRlciB0byBkcmF3IHRoZSBsYXN0IG92ZXJsYXkgZnJhbWUgb3ZlciB0aGUKLW1haW4gaW5wdXQgdW50aWwgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgdGhpcwotYmVoYXZpb3IuIERlZmF1bHQgdmFsdWUgaXMgMS4KK1NlZSBAcmVme2ZyYW1lc3luY30uCisKK0BpdGVtIGFscGhhCitTZXQgZm9ybWF0IG9mIGFscGhhIG9mIHRoZSBvdmVybGFpZCB2aWRlbywgaXQgY2FuIGJlIEB2YXJ7c3RyYWlnaHR9IG9yCitAdmFye3ByZW11bHRpcGxpZWR9LiBEZWZhdWx0IGlzIEB2YXJ7c3RyYWlnaHR9LgogQGVuZCB0YWJsZQogCiBUaGUgQG9wdGlvbnt4fSwgYW5kIEBvcHRpb257eX0gZXhwcmVzc2lvbnMgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZwpAQCAtOTAzMSw2ICsxMTc3NCw4IEBACiAKIEBlbmQgdGFibGUKIAorVGhpcyBmaWx0ZXIgYWxzbyBzdXBwb3J0cyB0aGUgQHJlZntmcmFtZXN5bmN9IG9wdGlvbnMuCisKIE5vdGUgdGhhdCB0aGUgQHZhcntufSwgQHZhcntwb3N9LCBAdmFye3R9IHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlIG9ubHkKIHdoZW4gZXZhbHVhdGlvbiBpcyBkb25lIEBlbXBoe3BlciBmcmFtZX0sIGFuZCB3aWxsIGV2YWx1YXRlIHRvIE5BTgogd2hlbiBAb3B0aW9ue2V2YWx9IGlzIHNldCB0byBAc2FtcHtpbml0fS4KQEAgLTkyMDEsMTEgKzExOTQ2LDM2IEBACiAKIFRoZSBkZWZhdWx0IHZhbHVlIG9mIEB2YXJ7eH0gYW5kIEB2YXJ7eX0gaXMgMC4KIAorSWYgQHZhcnt4fSBvciBAdmFye3l9IGV2YWx1YXRlIHRvIGEgbmVnYXRpdmUgbnVtYmVyLCB0aGV5J2xsIGJlIGNoYW5nZWQKK3NvIHRoZSBpbnB1dCBpbWFnZSBpcyBjZW50ZXJlZCBvbiB0aGUgcGFkZGVkIGFyZWEuCisKIEBpdGVtIGNvbG9yCiBTcGVjaWZ5IHRoZSBjb2xvciBvZiB0aGUgcGFkZGVkIGFyZWEuIEZvciB0aGUgc3ludGF4IG9mIHRoaXMgb3B0aW9uLAotY2hlY2sgdGhlICJDb2xvciIgc2VjdGlvbiBpbiB0aGUgZmZtcGVnLXV0aWxzIG1hbnVhbC4KK2NoZWNrIHRoZSBAcmVme2NvbG9yIHN5bnRheCwsIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMKK21hbnVhbCxmZm1wZWctdXRpbHN9LgogCiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAdmFye2NvbG9yfSBpcyAiYmxhY2siLgorCitAaXRlbSBldmFsCitTcGVjaWZ5IHdoZW4gdG8gZXZhbHVhdGUgIEB2YXJ7d2lkdGh9LCBAdmFye2hlaWdodH0sIEB2YXJ7eH0gYW5kIEB2YXJ7eX0gZXhwcmVzc2lvbi4KKworSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBpbml0CitPbmx5IGV2YWx1YXRlIGV4cHJlc3Npb25zIG9uY2UgZHVyaW5nIHRoZSBmaWx0ZXIgaW5pdGlhbGl6YXRpb24gb3Igd2hlbgorYSBjb21tYW5kIGlzIHByb2Nlc3NlZC4KKworQGl0ZW0gZnJhbWUKK0V2YWx1YXRlIGV4cHJlc3Npb25zIGZvciBlYWNoIGluY29taW5nIGZyYW1lLgorCitAZW5kIHRhYmxlCisKK0RlZmF1bHQgdmFsdWUgaXMgQHNhbXB7aW5pdH0uCisKK0BpdGVtIGFzcGVjdAorUGFkIHRvIGFzcGVjdCBpbnN0ZWFkIHRvIGEgcmVzb2x1dGlvbi4KKwogQGVuZCB0YWJsZQogCiBUaGUgdmFsdWUgZm9yIHRoZSBAdmFye3dpZHRofSwgQHZhcntoZWlnaHR9LCBAdmFye3h9LCBhbmQgQHZhcnt5fQpAQCAtOTMyOCw2ICsxMjA5OCw5IEBACiB0byBkaXNhYmxlIHRoaXMgb3B0aW9uIGZvciBhIHN0YW5kYWxvbmUgaW1hZ2UuCiBTZXQgYnkgZGVmYXVsdC4KIAorQGl0ZW0gdHJhbnNwYXJlbmN5X2NvbG9yCitTZXQgdGhlIGNvbG9yIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGJhY2tncm91bmQgZm9yIHRyYW5zcGFyZW5jeS4KKwogQGl0ZW0gc3RhdHNfbW9kZQogU2V0IHN0YXRpc3RpY3MgbW9kZS4KIApAQCAtOTMzOSw2ICsxMjExMiw4IEBACiBDb21wdXRlIGhpc3RvZ3JhbXMgb25seSBmb3IgdGhlIHBhcnQgdGhhdCBkaWZmZXJzIGZyb20gcHJldmlvdXMgZnJhbWUuIFRoaXMKIG1pZ2h0IGJlIHJlbGV2YW50IHRvIGdpdmUgbW9yZSBpbXBvcnRhbmNlIHRvIHRoZSBtb3ZpbmcgcGFydCBvZiB5b3VyIGlucHV0IGlmCiB0aGUgYmFja2dyb3VuZCBpcyBzdGF0aWMuCitAaXRlbSBzaW5nbGUKK0NvbXB1dGUgbmV3IGhpc3RvZ3JhbSBmb3IgZWFjaCBmcmFtZS4KIEBlbmQgdGFibGUKIAogRGVmYXVsdCB2YWx1ZSBpcyBAdmFye2Z1bGx9LgpAQCAtOTQxMCw2ICsxMjE4NSwxNiBAQAogQGVuZCB0YWJsZQogCiBEZWZhdWx0IGlzIEB2YXJ7bm9uZX0uCisKK0BpdGVtIG5ldworVGFrZSBuZXcgcGFsZXR0ZSBmb3IgZWFjaCBvdXRwdXQgZnJhbWUuCisKK0BpdGVtIGFscGhhX3RocmVzaG9sZAorU2V0cyB0aGUgYWxwaGEgdGhyZXNob2xkIGZvciB0cmFuc3BhcmVuY3kuIEFscGhhIHZhbHVlcyBhYm92ZSB0aGlzIHRocmVzaG9sZAord2lsbCBiZSB0cmVhdGVkIGFzIGNvbXBsZXRlbHkgb3BhcXVlLCBhbmQgdmFsdWVzIGJlbG93IHRoaXMgdGhyZXNob2xkIHdpbGwgYmUKK3RyZWF0ZWQgYXMgY29tcGxldGVseSB0cmFuc3BhcmVudC4KKworVGhlIG9wdGlvbiBtdXN0IGJlIGFuIGludGVnZXIgdmFsdWUgaW4gdGhlIHJhbmdlIFswLDI1NV0uIERlZmF1bHQgaXMgQHZhcnsxMjh9LgogQGVuZCB0YWJsZQogCiBAc3Vic2VjdGlvbiBFeGFtcGxlcwpAQCAtOTQ1MCw2ICsxMjIzNSwxMCBAQAogQGl0ZW0gVwogQGl0ZW0gSAogdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdmlkZW8gZnJhbWUuCitAaXRlbSBpbgorSW5wdXQgZnJhbWUgY291bnQuCitAaXRlbSBvbgorT3V0cHV0IGZyYW1lIGNvdW50LgogQGVuZCB0YWJsZQogCiBAaXRlbSBpbnRlcnBvbGF0aW9uCkBAIC05NDgwLDYgKzEyMjY5LDIxIEBACiAKIERlZmF1bHQgdmFsdWUgaXMgQHNhbXB7c291cmNlfS4KIEBlbmQgdGFibGUKKworQGl0ZW0gZXZhbAorU2V0IHdoZW4gdGhlIGV4cHJlc3Npb25zIGZvciBjb29yZGluYXRlcyBAb3B0aW9ue3gwLHkwLC4uLngzLHkzfSBhcmUgZXZhbHVhdGVkLgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorQHRhYmxlIEBzYW1wCitAaXRlbSBpbml0Citvbmx5IGV2YWx1YXRlIGV4cHJlc3Npb25zIG9uY2UgZHVyaW5nIHRoZSBmaWx0ZXIgaW5pdGlhbGl6YXRpb24gb3IKK3doZW4gYSBjb21tYW5kIGlzIHByb2Nlc3NlZAorCitAaXRlbSBmcmFtZQorZXZhbHVhdGUgZXhwcmVzc2lvbnMgZm9yIGVhY2ggaW5jb21pbmcgZnJhbWUKK0BlbmQgdGFibGUKKworRGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtpbml0fS4KIEBlbmQgdGFibGUKIAogQHNlY3Rpb24gcGhhc2UKQEAgLTk1NTUsNiArMTIzNTksMzYgQEAKIAogY2FuIGJlIHVzZWQgdG8gdGVzdCB0aGUgbW9ub3doaXRlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yIGRlZmluaXRpb24uCiAKK0BzZWN0aW9uIHBpeHNjb3BlCisKK0Rpc3BsYXkgc2FtcGxlIHZhbHVlcyBvZiBjb2xvciBjaGFubmVscy4gTWFpbmx5IHVzZWZ1bCBmb3IgY2hlY2tpbmcgY29sb3IKK2FuZCBsZXZlbHMuIE1pbmltdW0gc3VwcG9ydGVkIHJlc29sdXRpb24gaXMgNjQweDQ4MC4KKworVGhlIGZpbHRlcnMgYWNjZXB0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHgKK1NldCBzY29wZSBYIHBvc2l0aW9uLCByZWxhdGl2ZSBvZmZzZXQgb24gWCBheGlzLgorCitAaXRlbSB5CitTZXQgc2NvcGUgWSBwb3NpdGlvbiwgcmVsYXRpdmUgb2Zmc2V0IG9uIFkgYXhpcy4KKworQGl0ZW0gdworU2V0IHNjb3BlIHdpZHRoLgorCitAaXRlbSBoCitTZXQgc2NvcGUgaGVpZ2h0LgorCitAaXRlbSBvCitTZXQgd2luZG93IG9wYWNpdHkuIFRoaXMgd2luZG93IGFsc28gaG9sZHMgc3RhdGlzdGljcyBhYm91dCBwaXhlbCBhcmVhLgorCitAaXRlbSB3eAorU2V0IHdpbmRvdyBYIHBvc2l0aW9uLCByZWxhdGl2ZSBvZmZzZXQgb24gWCBheGlzLgorCitAaXRlbSB3eQorU2V0IHdpbmRvdyBZIHBvc2l0aW9uLCByZWxhdGl2ZSBvZmZzZXQgb24gWSBheGlzLgorQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBwcAogCiBFbmFibGUgdGhlIHNwZWNpZmllZCBjaGFpbiBvZiBwb3N0cHJvY2Vzc2luZyBzdWJmaWx0ZXJzIHVzaW5nIGxpYnBvc3Rwcm9jLiBUaGlzCkBAIC05NzU2LDYgKzEyNTkwLDIyNSBAQAogQGVuZCB0YWJsZQogQGVuZCB0YWJsZQogCitAc2VjdGlvbiBwcmVtdWx0aXBseQorQXBwbHkgYWxwaGEgcHJlbXVsdGlwbHkgZWZmZWN0IHRvIGlucHV0IHZpZGVvIHN0cmVhbSB1c2luZyBmaXJzdCBwbGFuZQorb2Ygc2Vjb25kIHN0cmVhbSBhcyBhbHBoYS4KKworQm90aCBzdHJlYW1zIG11c3QgaGF2ZSBzYW1lIGRpbWVuc2lvbnMgYW5kIHNhbWUgcGl4ZWwgZm9ybWF0LgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb246CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBwbGFuZXMKK1NldCB3aGljaCBwbGFuZXMgd2lsbCBiZSBwcm9jZXNzZWQsIHVucHJvY2Vzc2VkIHBsYW5lcyB3aWxsIGJlIGNvcGllZC4KK0J5IGRlZmF1bHQgdmFsdWUgMHhmLCBhbGwgcGxhbmVzIHdpbGwgYmUgcHJvY2Vzc2VkLgorCitAaXRlbSBpbnBsYWNlCitEbyBub3QgcmVxdWlyZSAybmQgaW5wdXQgZm9yIHByb2Nlc3NpbmcsIGluc3RlYWQgdXNlIGFscGhhIHBsYW5lIGZyb20gaW5wdXQgc3RyZWFtLgorQGVuZCB0YWJsZQorCitAc2VjdGlvbiBwcmV3aXR0CitBcHBseSBwcmV3aXR0IG9wZXJhdG9yIHRvIGlucHV0IHZpZGVvIHN0cmVhbS4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcGxhbmVzCitTZXQgd2hpY2ggcGxhbmVzIHdpbGwgYmUgcHJvY2Vzc2VkLCB1bnByb2Nlc3NlZCBwbGFuZXMgd2lsbCBiZSBjb3BpZWQuCitCeSBkZWZhdWx0IHZhbHVlIDB4ZiwgYWxsIHBsYW5lcyB3aWxsIGJlIHByb2Nlc3NlZC4KKworQGl0ZW0gc2NhbGUKK1NldCB2YWx1ZSB3aGljaCB3aWxsIGJlIG11bHRpcGxpZWQgd2l0aCBmaWx0ZXJlZCByZXN1bHQuCisKK0BpdGVtIGRlbHRhCitTZXQgdmFsdWUgd2hpY2ggd2lsbCBiZSBhZGRlZCB0byBmaWx0ZXJlZCByZXN1bHQuCitAZW5kIHRhYmxlCisKK0BhbmNob3J7cHJvZ3JhbV9vcGVuY2x9CitAc2VjdGlvbiBwcm9ncmFtX29wZW5jbAorCitGaWx0ZXIgdmlkZW8gdXNpbmcgYW4gT3BlbkNMIHByb2dyYW0uCisKK0B0YWJsZSBAb3B0aW9uCisKK0BpdGVtIHNvdXJjZQorT3BlbkNMIHByb2dyYW0gc291cmNlIGZpbGUuCisKK0BpdGVtIGtlcm5lbAorS2VybmVsIG5hbWUgaW4gcHJvZ3JhbS4KKworQGl0ZW0gaW5wdXRzCitOdW1iZXIgb2YgaW5wdXRzIHRvIHRoZSBmaWx0ZXIuICBEZWZhdWx0cyB0byAxLgorCitAaXRlbSBzaXplLCBzCitTaXplIG9mIG91dHB1dCBmcmFtZXMuICBEZWZhdWx0cyB0byB0aGUgc2FtZSBhcyB0aGUgZmlyc3QgaW5wdXQuCisKK0BlbmQgdGFibGUKKworVGhlIHByb2dyYW0gc291cmNlIGZpbGUgbXVzdCBjb250YWluIGEga2VybmVsIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIG5hbWUsCit3aGljaCB3aWxsIGJlIHJ1biBvbmNlIGZvciBlYWNoIHBsYW5lIG9mIHRoZSBvdXRwdXQuICBFYWNoIHJ1biBvbiBhIHBsYW5lCitnZXRzIGVucXVldWVkIGFzIGEgc2VwYXJhdGUgMkQgZ2xvYmFsIE5EUmFuZ2Ugd2l0aCBvbmUgd29yay1pdGVtIGZvciBlYWNoCitwaXhlbCB0byBiZSBnZW5lcmF0ZWQuICBUaGUgZ2xvYmFsIElEIG9mZnNldCBmb3IgZWFjaCB3b3JrLWl0ZW0gaXMgdGhlcmVmb3JlCit0aGUgY29vcmRpbmF0ZXMgb2YgYSBwaXhlbCBpbiB0aGUgZGVzdGluYXRpb24gaW1hZ2UuCisKK1RoZSBrZXJuZWwgZnVuY3Rpb24gbmVlZHMgdG8gdGFrZSB0aGUgZm9sbG93aW5nIGFyZ3VtZW50czoKK0BpdGVtaXplCitAaXRlbQorRGVzdGluYXRpb24gaW1hZ2UsIEB2YXJ7X193cml0ZV9vbmx5IGltYWdlMmRfdH0uCisKK1RoaXMgaW1hZ2Ugd2lsbCBiZWNvbWUgdGhlIG91dHB1dDsgdGhlIGtlcm5lbCBzaG91bGQgd3JpdGUgYWxsIG9mIGl0LgorQGl0ZW0KK0ZyYW1lIGluZGV4LCBAdmFye3Vuc2lnbmVkIGludH0uCisKK1RoaXMgaXMgYSBjb3VudGVyIHN0YXJ0aW5nIGZyb20gemVybyBhbmQgaW5jcmVhc2luZyBieSBvbmUgZm9yIGVhY2ggZnJhbWUuCitAaXRlbQorU291cmNlIGltYWdlcywgQHZhcntfX3JlYWRfb25seSBpbWFnZTJkX3R9LgorCitUaGVzZSBhcmUgdGhlIG1vc3QgcmVjZW50IGltYWdlcyBvbiBlYWNoIGlucHV0LiAgVGhlIGtlcm5lbCBtYXkgcmVhZCBmcm9tCit0aGVtIHRvIGdlbmVyYXRlIHRoZSBvdXRwdXQsIGJ1dCB0aGV5IGNhbid0IGJlIHdyaXR0ZW4gdG8uCitAZW5kIGl0ZW1pemUKKworRXhhbXBsZSBwcm9ncmFtczoKKworQGl0ZW1pemUKK0BpdGVtCitDb3B5IHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0IChvdXRwdXQgbXVzdCBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBpbnB1dCkuCitAdmVyYmF0aW0KK19fa2VybmVsIHZvaWQgY29weShfX3dyaXRlX29ubHkgaW1hZ2UyZF90IGRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICBfX3JlYWRfb25seSAgaW1hZ2UyZF90IHNvdXJjZSkKK3sKKyAgICBjb25zdCBzYW1wbGVyX3Qgc2FtcGxlciA9IENMS19OT1JNQUxJWkVEX0NPT1JEU19GQUxTRTsKKworICAgIGludDIgbG9jYXRpb24gPSAoaW50MikoZ2V0X2dsb2JhbF9pZCgwKSwgZ2V0X2dsb2JhbF9pZCgxKSk7CisKKyAgICBmbG9hdDQgdmFsdWUgPSByZWFkX2ltYWdlZihzb3VyY2UsIHNhbXBsZXIsIGxvY2F0aW9uKTsKKworICAgIHdyaXRlX2ltYWdlZihkZXN0aW5hdGlvbiwgbG9jYXRpb24sIHZhbHVlKTsKK30KK0BlbmQgdmVyYmF0aW0KKworQGl0ZW0KK0FwcGx5IGEgc2ltcGxlIHRyYW5zZm9ybWF0aW9uLCByb3RhdGluZyB0aGUgaW5wdXQgYnkgYW4gYW1vdW50IGluY3JlYXNpbmcKK3dpdGggdGhlIGluZGV4IGNvdW50ZXIuICBQaXhlbCB2YWx1ZXMgYXJlIGxpbmVhcmx5IGludGVycG9sYXRlZCBieSB0aGUKK3NhbXBsZXIsIGFuZCB0aGUgb3V0cHV0IG5lZWQgbm90IGhhdmUgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQuCitAdmVyYmF0aW0KK19fa2VybmVsIHZvaWQgcm90YXRlX2ltYWdlKF9fd3JpdGVfb25seSBpbWFnZTJkX3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZWFkX29ubHkgIGltYWdlMmRfdCBzcmMpCit7CisgICAgY29uc3Qgc2FtcGxlcl90IHNhbXBsZXIgPSAoQ0xLX05PUk1BTElaRURfQ09PUkRTX0ZBTFNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEtfRklMVEVSX0xJTkVBUik7CisKKyAgICBmbG9hdCBhbmdsZSA9IChmbG9hdClpbmRleCAvIDEwMC4wZjsKKworICAgIGZsb2F0MiBkc3RfZGltID0gY29udmVydF9mbG9hdDIoZ2V0X2ltYWdlX2RpbShkc3QpKTsKKyAgICBmbG9hdDIgc3JjX2RpbSA9IGNvbnZlcnRfZmxvYXQyKGdldF9pbWFnZV9kaW0oc3JjKSk7CisKKyAgICBmbG9hdDIgZHN0X2NlbiA9IGRzdF9kaW0gLyAyLjBmOworICAgIGZsb2F0MiBzcmNfY2VuID0gc3JjX2RpbSAvIDIuMGY7CisKKyAgICBpbnQyICAgZHN0X2xvYyA9IChpbnQyKShnZXRfZ2xvYmFsX2lkKDApLCBnZXRfZ2xvYmFsX2lkKDEpKTsKKworICAgIGZsb2F0MiBkc3RfcG9zID0gY29udmVydF9mbG9hdDIoZHN0X2xvYykgLSBkc3RfY2VuOworICAgIGZsb2F0MiBzcmNfcG9zID0geworICAgICAgICBjb3MoYW5nbGUpICogZHN0X3Bvcy54IC0gc2luKGFuZ2xlKSAqIGRzdF9wb3MueSwKKyAgICAgICAgc2luKGFuZ2xlKSAqIGRzdF9wb3MueCArIGNvcyhhbmdsZSkgKiBkc3RfcG9zLnkKKyAgICB9OworICAgIHNyY19wb3MgPSBzcmNfcG9zICogc3JjX2RpbSAvIGRzdF9kaW07CisKKyAgICBmbG9hdDIgc3JjX2xvYyA9IHNyY19wb3MgKyBzcmNfY2VuOworCisgICAgaWYgKHNyY19sb2MueCA8IDAuMGYgICAgICB8fCBzcmNfbG9jLnkgPCAwLjBmIHx8CisgICAgICAgIHNyY19sb2MueCA+IHNyY19kaW0ueCB8fCBzcmNfbG9jLnkgPiBzcmNfZGltLnkpCisgICAgICAgIHdyaXRlX2ltYWdlZihkc3QsIGRzdF9sb2MsIDAuNWYpOworICAgIGVsc2UKKyAgICAgICAgd3JpdGVfaW1hZ2VmKGRzdCwgZHN0X2xvYywgcmVhZF9pbWFnZWYoc3JjLCBzYW1wbGVyLCBzcmNfbG9jKSk7Cit9CitAZW5kIHZlcmJhdGltCisKK0BpdGVtCitCbGVuZCB0d28gaW5wdXRzIHRvZ2V0aGVyLCB3aXRoIHRoZSBhbW91bnQgb2YgZWFjaCBpbnB1dCB1c2VkIHZhcnlpbmcKK3dpdGggdGhlIGluZGV4IGNvdW50ZXIuCitAdmVyYmF0aW0KK19fa2VybmVsIHZvaWQgYmxlbmRfaW1hZ2VzKF9fd3JpdGVfb25seSBpbWFnZTJkX3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZWFkX29ubHkgIGltYWdlMmRfdCBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZWFkX29ubHkgIGltYWdlMmRfdCBzcmMyKQoreworICAgIGNvbnN0IHNhbXBsZXJfdCBzYW1wbGVyID0gKENMS19OT1JNQUxJWkVEX0NPT1JEU19GQUxTRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xLX0ZJTFRFUl9MSU5FQVIpOworCisgICAgZmxvYXQgYmxlbmQgPSAoY29zKChmbG9hdClpbmRleCAvIDUwLjBmKSArIDEuMGYpIC8gMi4wZjsKKworICAgIGludDIgIGRzdF9sb2MgPSAoaW50MikoZ2V0X2dsb2JhbF9pZCgwKSwgZ2V0X2dsb2JhbF9pZCgxKSk7CisgICAgaW50MiBzcmMxX2xvYyA9IGRzdF9sb2MgKiBnZXRfaW1hZ2VfZGltKHNyYzEpIC8gZ2V0X2ltYWdlX2RpbShkc3QpOworICAgIGludDIgc3JjMl9sb2MgPSBkc3RfbG9jICogZ2V0X2ltYWdlX2RpbShzcmMyKSAvIGdldF9pbWFnZV9kaW0oZHN0KTsKKworICAgIGZsb2F0NCB2YWwxID0gcmVhZF9pbWFnZWYoc3JjMSwgc2FtcGxlciwgc3JjMV9sb2MpOworICAgIGZsb2F0NCB2YWwyID0gcmVhZF9pbWFnZWYoc3JjMiwgc2FtcGxlciwgc3JjMl9sb2MpOworCisgICAgd3JpdGVfaW1hZ2VmKGRzdCwgZHN0X2xvYywgdmFsMSAqIGJsZW5kICsgdmFsMiAqICgxLjBmIC0gYmxlbmQpKTsKK30KK0BlbmQgdmVyYmF0aW0KKworQGVuZCBpdGVtaXplCisKK0BzZWN0aW9uIHBzZXVkb2NvbG9yCisKK0FsdGVyIGZyYW1lIGNvbG9ycyBpbiB2aWRlbyB3aXRoIHBzZXVkb2NvbG9ycy4KKworVGhpcyBmaWx0ZXIgYWNjZXB0IHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGMwCitzZXQgcGl4ZWwgZmlyc3QgY29tcG9uZW50IGV4cHJlc3Npb24KKworQGl0ZW0gYzEKK3NldCBwaXhlbCBzZWNvbmQgY29tcG9uZW50IGV4cHJlc3Npb24KKworQGl0ZW0gYzIKK3NldCBwaXhlbCB0aGlyZCBjb21wb25lbnQgZXhwcmVzc2lvbgorCitAaXRlbSBjMworc2V0IHBpeGVsIGZvdXJ0aCBjb21wb25lbnQgZXhwcmVzc2lvbiwgY29ycmVzcG9uZHMgdG8gdGhlIGFscGhhIGNvbXBvbmVudAorCitAaXRlbSBpCitzZXQgY29tcG9uZW50IHRvIHVzZSBhcyBiYXNlIGZvciBhbHRlcmluZyBjb2xvcnMKK0BlbmQgdGFibGUKKworRWFjaCBvZiB0aGVtIHNwZWNpZmllcyB0aGUgZXhwcmVzc2lvbiB0byB1c2UgZm9yIGNvbXB1dGluZyB0aGUgbG9va3VwIHRhYmxlIGZvcgordGhlIGNvcnJlc3BvbmRpbmcgcGl4ZWwgY29tcG9uZW50IHZhbHVlcy4KKworVGhlIGV4cHJlc3Npb25zIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGFuZCBmdW5jdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSB3CitAaXRlbSBoCitUaGUgaW5wdXQgd2lkdGggYW5kIGhlaWdodC4KKworQGl0ZW0gdmFsCitUaGUgaW5wdXQgdmFsdWUgZm9yIHRoZSBwaXhlbCBjb21wb25lbnQuCisKK0BpdGVtIHltaW4sIHVtaW4sIHZtaW4sIGFtaW4KK1RoZSBtaW5pbXVtIGFsbG93ZWQgY29tcG9uZW50IHZhbHVlLgorCitAaXRlbSB5bWF4LCB1bWF4LCB2bWF4LCBhbWF4CitUaGUgbWF4aW11bSBhbGxvd2VkIGNvbXBvbmVudCB2YWx1ZS4KK0BlbmQgdGFibGUKKworQWxsIGV4cHJlc3Npb25zIGRlZmF1bHQgdG8gInZhbCIuCisKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK0BpdGVtaXplCitAaXRlbQorQ2hhbmdlIHRvbyBoaWdoIGx1bWEgdmFsdWVzIHRvIGdyYWRpZW50OgorQGV4YW1wbGUKK3BzZXVkb2NvbG9yPSInaWYoYmV0d2Vlbih2YWwseW1heCxhbWF4KSxsZXJwKHltaW4seW1heCwodmFsLXltYXgpLyhhbWF4LXltYXgpKSwtMSk6aWYoYmV0d2Vlbih2YWwseW1heCxhbWF4KSxsZXJwKHVtYXgsdW1pbiwodmFsLXltYXgpLyhhbWF4LXltYXgpKSwtMSk6aWYoYmV0d2Vlbih2YWwseW1heCxhbWF4KSxsZXJwKHZtaW4sdm1heCwodmFsLXltYXgpLyhhbWF4LXltYXgpKSwtMSk6LTEnIgorQGVuZCBleGFtcGxlCitAZW5kIGl0ZW1pemUKKwogQHNlY3Rpb24gcHNucgogCiBPYnRhaW4gdGhlIGF2ZXJhZ2UsIG1heGltdW0gYW5kIG1pbmltdW0gUFNOUiAoUGVhayBTaWduYWwgdG8gTm9pc2UKQEAgLTk3OTAsMTMgKzEyODQzLDM5IEBACiBJZiBzcGVjaWZpZWQgdGhlIGZpbHRlciB3aWxsIHVzZSB0aGUgbmFtZWQgZmlsZSB0byBzYXZlIHRoZSBQU05SIG9mCiBlYWNoIGluZGl2aWR1YWwgZnJhbWUuIFdoZW4gZmlsZW5hbWUgZXF1YWxzICItIiB0aGUgZGF0YSBpcyBzZW50IHRvCiBzdGFuZGFyZCBvdXRwdXQuCisKK0BpdGVtIHN0YXRzX3ZlcnNpb24KK1NwZWNpZmllcyB3aGljaCB2ZXJzaW9uIG9mIHRoZSBzdGF0cyBmaWxlIGZvcm1hdCB0byB1c2UuIERldGFpbHMgb2YKK2VhY2ggZm9ybWF0IGFyZSB3cml0dGVuIGJlbG93LgorRGVmYXVsdCB2YWx1ZSBpcyAxLgorCitAaXRlbSBzdGF0c19hZGRfbWF4CitEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG1heCB2YWx1ZSBpcyBvdXRwdXQgdG8gdGhlIHN0YXRzIGxvZy4KK0RlZmF1bHQgdmFsdWUgaXMgMC4KK1JlcXVpcmVzIHN0YXRzX3ZlcnNpb24gPj0gMi4gSWYgdGhpcyBpcyBzZXQgYW5kIHN0YXRzX3ZlcnNpb24gPCAyLAordGhlIGZpbHRlciB3aWxsIHJldHVybiBhbiBlcnJvci4KIEBlbmQgdGFibGUKIAorVGhpcyBmaWx0ZXIgYWxzbyBzdXBwb3J0cyB0aGUgQHJlZntmcmFtZXN5bmN9IG9wdGlvbnMuCisKIFRoZSBmaWxlIHByaW50ZWQgaWYgQHZhcntzdGF0c19maWxlfSBpcyBzZWxlY3RlZCwgY29udGFpbnMgYSBzZXF1ZW5jZSBvZgoga2V5L3ZhbHVlIHBhaXJzIG9mIHRoZSBmb3JtIEB2YXJ7a2V5fTpAdmFye3ZhbHVlfSBmb3IgZWFjaCBjb21wYXJlZAogY291cGxlIG9mIGZyYW1lcy4KIAotQSBkZXNjcmlwdGlvbiBvZiBlYWNoIHNob3duIHBhcmFtZXRlciBmb2xsb3dzOgorSWYgYSBAdmFye3N0YXRzX3ZlcnNpb259IGdyZWF0ZXIgdGhhbiAxIGlzIHNwZWNpZmllZCwgYSBoZWFkZXIgbGluZSBwcmVjZWRlcwordGhlIGxpc3Qgb2YgcGVyLWZyYW1lLXBhaXIgc3RhdHMsIHdpdGgga2V5IHZhbHVlIHBhaXJzIGZvbGxvd2luZyB0aGUgZnJhbWUKK2Zvcm1hdCB3aXRoIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHBzbnJfbG9nX3ZlcnNpb24KK1RoZSB2ZXJzaW9uIG9mIHRoZSBsb2cgZmlsZSBmb3JtYXQuIFdpbGwgbWF0Y2ggQHZhcntzdGF0c192ZXJzaW9ufS4KKworQGl0ZW0gZmllbGRzCitBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHRoZSBwZXItZnJhbWUtcGFpciBwYXJhbWV0ZXJzIGluY2x1ZGVkIGluCit0aGUgbG9nLgorQGVuZCB0YWJsZQorCitBIGRlc2NyaXB0aW9uIG9mIGVhY2ggc2hvd24gcGVyLWZyYW1lLXBhaXIgcGFyYW1ldGVyIGZvbGxvd3M6CiAKIEB0YWJsZSBAb3B0aW9uCiBAaXRlbSBuCkBAIC05ODA2LDEzICsxMjg4NSwxNyBAQAogTWVhbiBTcXVhcmUgRXJyb3IgcGl4ZWwtYnktcGl4ZWwgYXZlcmFnZSBkaWZmZXJlbmNlIG9mIHRoZSBjb21wYXJlZAogZnJhbWVzLCBhdmVyYWdlZCBvdmVyIGFsbCB0aGUgaW1hZ2UgY29tcG9uZW50cy4KIAotQGl0ZW0gbXNlX3ksIG1zZV91LCBtc2VfdiwgbXNlX3IsIG1zZV9nLCBtc2VfZywgbXNlX2EKK0BpdGVtIG1zZV95LCBtc2VfdSwgbXNlX3YsIG1zZV9yLCBtc2VfZywgbXNlX2IsIG1zZV9hCiBNZWFuIFNxdWFyZSBFcnJvciBwaXhlbC1ieS1waXhlbCBhdmVyYWdlIGRpZmZlcmVuY2Ugb2YgdGhlIGNvbXBhcmVkCiBmcmFtZXMgZm9yIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIGJ5IHRoZSBzdWZmaXguCiAKIEBpdGVtIHBzbnJfeSwgcHNucl91LCBwc25yX3YsIHBzbnJfciwgcHNucl9nLCBwc25yX2IsIHBzbnJfYQogUGVhayBTaWduYWwgdG8gTm9pc2UgcmF0aW8gb2YgdGhlIGNvbXBhcmVkIGZyYW1lcyBmb3IgdGhlIGNvbXBvbmVudAogc3BlY2lmaWVkIGJ5IHRoZSBzdWZmaXguCisKK0BpdGVtIG1heF9hdmcsIG1heF95LCBtYXhfdSwgbWF4X3YKK01heGltdW0gYWxsb3dlZCB2YWx1ZSBmb3IgZWFjaCBjaGFubmVsLCBhbmQgYXZlcmFnZSBvdmVyIGFsbAorY2hhbm5lbHMuCiBAZW5kIHRhYmxlCiAKIEZvciBleGFtcGxlOgpAQCAtOTkwOSw3ICsxMjk5Miw3IEBACiAxIGlmIGluZGV4IGlzIG5vdCAxMjksIDAgb3RoZXJ3aXNlLgogCiBAaXRlbSBxcAotU2VxdWVudGlvbmFsIGluZGV4IHN0YXJ0aW5nIGZyb20gLTEyOSB0byAxMjguCitTZXF1ZW50aWFsIGluZGV4IHN0YXJ0aW5nIGZyb20gLTEyOSB0byAxMjguCiBAZW5kIHRhYmxlCiAKIEBzdWJzZWN0aW9uIEV4YW1wbGVzCkBAIC05OTQwLDYgKzEzMDIzLDEyNSBAQAogYmVzdCBlZmZvcnQgYmFzaXMuCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIHJlYWRlaWE2MDgKKworUmVhZCBjbG9zZWQgY2FwdGlvbmluZyAoRUlBLTYwOCkgaW5mb3JtYXRpb24gZnJvbSB0aGUgdG9wIGxpbmVzIG9mIGEgdmlkZW8gZnJhbWUuCisKK1RoaXMgZmlsdGVyIGFkZHMgZnJhbWUgbWV0YWRhdGEgZm9yIEBjb2Rle2xhdmZpLnJlYWRlaWE2MDguWC5jY30gYW5kCitAY29kZXtsYXZmaS5yZWFkZWlhNjA4LlgubGluZX0sIHdoZXJlIEBjb2Rle1h9IGlzIHRoZSBudW1iZXIgb2YgdGhlIGlkZW50aWZpZWQgbGluZQord2l0aCBFSUEtNjA4IGRhdGEgKHN0YXJ0aW5nIGZyb20gMCkuIEEgZGVzY3JpcHRpb24gb2YgZWFjaCBtZXRhZGF0YSB2YWx1ZSBmb2xsb3dzOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gbGF2ZmkucmVhZGVpYTYwOC5YLmNjCitUaGUgdHdvIGJ5dGVzIHN0b3JlZCBhcyBFSUEtNjA4IGRhdGEgKHByaW50ZWQgaW4gaGV4YWRlY2ltYWwpLgorCitAaXRlbSBsYXZmaS5yZWFkZWlhNjA4LlgubGluZQorVGhlIG51bWJlciBvZiB0aGUgbGluZSBvbiB3aGljaCB0aGUgRUlBLTYwOCBkYXRhIHdhcyBpZGVudGlmaWVkIGFuZCByZWFkLgorQGVuZCB0YWJsZQorCitUaGlzIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHNjYW5fbWluCitTZXQgdGhlIGxpbmUgdG8gc3RhcnQgc2Nhbm5pbmcgZm9yIEVJQS02MDggZGF0YS4gRGVmYXVsdCBpcyBAY29kZXswfS4KKworQGl0ZW0gc2Nhbl9tYXgKK1NldCB0aGUgbGluZSB0byBlbmQgc2Nhbm5pbmcgZm9yIEVJQS02MDggZGF0YS4gRGVmYXVsdCBpcyBAY29kZXsyOX0uCisKK0BpdGVtIG1hYworU2V0IG1pbmltYWwgYWNjZXB0YWJsZSBhbXBsaXR1ZGUgY2hhbmdlIGZvciBzeW5jIGNvZGVzIGRldGVjdGlvbi4KK0RlZmF1bHQgaXMgQGNvZGV7MC4yfS4gQWxsb3dlZCByYW5nZSBpcyBAY29kZXtbMC4wMDEgLSAxXX0uCisKK0BpdGVtIHNwdworU2V0IHRoZSByYXRpbyBvZiB3aWR0aCByZXNlcnZlZCBmb3Igc3luYyBjb2RlIGRldGVjdGlvbi4KK0RlZmF1bHQgaXMgQGNvZGV7MC4yN30uIEFsbG93ZWQgcmFuZ2UgaXMgQGNvZGV7WzAuMDEgLSAwLjddfS4KKworQGl0ZW0gbWhkCitTZXQgdGhlIG1heCBwZWFrcyBoZWlnaHQgZGlmZmVyZW5jZSBmb3Igc3luYyBjb2RlIGRldGVjdGlvbi4KK0RlZmF1bHQgaXMgQGNvZGV7MC4xfS4gQWxsb3dlZCByYW5nZSBpcyBAY29kZXtbMC4wIC0gMC41XX0uCisKK0BpdGVtIG1wZAorU2V0IG1heCBwZWFrcyBwZXJpb2QgZGlmZmVyZW5jZSBmb3Igc3luYyBjb2RlIGRldGVjdGlvbi4KK0RlZmF1bHQgaXMgQGNvZGV7MC4xfS4gQWxsb3dlZCByYW5nZSBpcyBAY29kZXtbMC4wIC0gMC41XX0uCisKK0BpdGVtIG1zZAorU2V0IHRoZSBmaXJzdCB0d28gbWF4IHN0YXJ0IGNvZGUgYml0cyBkaWZmZXJlbmNlcy4KK0RlZmF1bHQgaXMgQGNvZGV7MC4wMn0uIEFsbG93ZWQgcmFuZ2UgaXMgQGNvZGV7WzAuMCAtIDAuNV19LgorCitAaXRlbSBiaGQKK1NldCB0aGUgbWluaW11bSByYXRpbyBvZiBiaXRzIGhlaWdodCBjb21wYXJlZCB0byAzcmQgc3RhcnQgY29kZSBiaXQuCitEZWZhdWx0IGlzIEBjb2RlezAuNzV9LiBBbGxvd2VkIHJhbmdlIGlzIEBjb2Rle1swLjAxIC0gMV19LgorCitAaXRlbSB0aF93CitTZXQgdGhlIHdoaXRlIGNvbG9yIHRocmVzaG9sZC4gRGVmYXVsdCBpcyBAY29kZXswLjM1fS4gQWxsb3dlZCByYW5nZSBpcyBAY29kZXtbMC4xIC0gMV19LgorCitAaXRlbSB0aF9iCitTZXQgdGhlIGJsYWNrIGNvbG9yIHRocmVzaG9sZC4gRGVmYXVsdCBpcyBAY29kZXswLjE1fS4gQWxsb3dlZCByYW5nZSBpcyBAY29kZXtbMC4wIC0gMC41XX0uCisKK0BpdGVtIGNocAorRW5hYmxlIGNoZWNraW5nIHRoZSBwYXJpdHkgYml0LiBJbiB0aGUgZXZlbnQgb2YgYSBwYXJpdHkgZXJyb3IsIHRoZSBmaWx0ZXIgd2lsbCBvdXRwdXQKK0Bjb2RlezB4MDB9IGZvciB0aGF0IGNoYXJhY3Rlci4gRGVmYXVsdCBpcyBmYWxzZS4KK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKK0BpdGVtCitPdXRwdXQgYSBjc3Ygd2l0aCBwcmVzZW50YXRpb24gdGltZSBhbmQgdGhlIGZpcnN0IHR3byBsaW5lcyBvZiBpZGVudGlmaWVkIEVJQS02MDggY2FwdGlvbmluZyBkYXRhLgorQGV4YW1wbGUKK2ZmcHJvYmUgLWYgbGF2ZmkgLWkgbW92aWU9Y2FwdGlvbmVkX3ZpZGVvLm1vdixyZWFkZWlhNjA4IC1zaG93X2VudHJpZXMgZnJhbWU9cGt0X3B0c190aW1lOmZyYW1lX3RhZ3M9bGF2ZmkucmVhZGVpYTYwOC4wLmNjLGxhdmZpLnJlYWRlaWE2MDguMS5jYyAtb2YgY3N2CitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCitAc2VjdGlvbiByZWFkdml0YworCitSZWFkIHZlcnRpY2FsIGludGVydmFsIHRpbWVjb2RlIChWSVRDKSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0b3AgbGluZXMgb2YgYQordmlkZW8gZnJhbWUuCisKK1RoZSBmaWx0ZXIgYWRkcyBmcmFtZSBtZXRhZGF0YSBrZXkgQGNvZGV7bGF2ZmkucmVhZHZpdGMudGNfc3RyfSB3aXRoIHRoZQordGltZWNvZGUgdmFsdWUsIGlmIGEgdmFsaWQgdGltZWNvZGUgaGFzIGJlZW4gZGV0ZWN0ZWQuIEZ1cnRoZXIgbWV0YWRhdGEga2V5CitAY29kZXtsYXZmaS5yZWFkdml0Yy5mb3VuZH0gaXMgc2V0IHRvIDAvMSBkZXBlbmRpbmcgb24gd2hldGhlcgordGltZWNvZGUgZGF0YSBoYXMgYmVlbiBmb3VuZCBvciBub3QuCisKK1RoaXMgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gc2Nhbl9tYXgKK1NldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdG8gc2NhbiBmb3IgVklUQyBkYXRhLiBJZiB0aGUgdmFsdWUgaXMgc2V0IHRvCitAY29kZXstMX0gdGhlIGZ1bGwgdmlkZW8gZnJhbWUgaXMgc2Nhbm5lZC4gRGVmYXVsdCBpcyBAY29kZXs0NX0uCisKK0BpdGVtIHRocl9iCitTZXQgdGhlIGx1bWEgdGhyZXNob2xkIGZvciBibGFjay4gQWNjZXB0cyBmbG9hdCBudW1iZXJzIGluIHRoZSByYW5nZSBbMC4wLDEuMF0sCitkZWZhdWx0IHZhbHVlIGlzIEBjb2RlezAuMn0uIFRoZSB2YWx1ZSBtdXN0IGJlIGVxdWFsIG9yIGxlc3MgdGhhbiBAY29kZXt0aHJfd30uCisKK0BpdGVtIHRocl93CitTZXQgdGhlIGx1bWEgdGhyZXNob2xkIGZvciB3aGl0ZS4gQWNjZXB0cyBmbG9hdCBudW1iZXJzIGluIHRoZSByYW5nZSBbMC4wLDEuMF0sCitkZWZhdWx0IHZhbHVlIGlzIEBjb2RlezAuNn0uIFRoZSB2YWx1ZSBtdXN0IGJlIGVxdWFsIG9yIGdyZWF0ZXIgdGhhbiBAY29kZXt0aHJfYn0uCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK0BpdGVtaXplCitAaXRlbQorRGV0ZWN0IGFuZCBkcmF3IFZJVEMgZGF0YSBvbnRvIHRoZSB2aWRlbyBmcmFtZTsgaWYgbm8gdmFsaWQgVklUQyBpcyBkZXRlY3RlZCwKK2RyYXcgQGNvZGV7LS06LS06LS06LS19IGFzIGEgcGxhY2Vob2xkZXI6CitAZXhhbXBsZQorZmZtcGVnIC1pIGlucHV0LmF2aSAtZmlsdGVyOnYgJ3JlYWR2aXRjLGRyYXd0ZXh0PWZvbnRmaWxlPUZyZWVNb25vLnR0Zjp0ZXh0PSVAe21ldGFkYXRhXFw6bGF2ZmkucmVhZHZpdGMudGNfc3RyXFw6LS1cXFxcXFw6LS1cXFxcXFw6LS1cXFxcXFw6LS1AfTp4PSh3LXR3KS8yOnk9NDAwLWFzY2VudCcKK0BlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCisKK0BzZWN0aW9uIHJlbWFwCisKK1JlbWFwIHBpeGVscyB1c2luZyAybmQ6IFhtYXAgYW5kIDNyZDogWW1hcCBpbnB1dCB2aWRlbyBzdHJlYW0uCisKK0Rlc3RpbmF0aW9uIHBpeGVsIGF0IHBvc2l0aW9uIChYLCBZKSB3aWxsIGJlIHBpY2tlZCBmcm9tIHNvdXJjZSAoeCwgeSkgcG9zaXRpb24KK3doZXJlIHggPSBYbWFwKFgsIFkpIGFuZCB5ID0gWW1hcChYLCBZKS4gSWYgbWFwcGluZyB2YWx1ZXMgYXJlIG91dCBvZiByYW5nZSwgemVybwordmFsdWUgZm9yIHBpeGVsIHdpbGwgYmUgdXNlZCBmb3IgZGVzdGluYXRpb24gcGl4ZWwuCisKK1htYXAgYW5kIFltYXAgaW5wdXQgdmlkZW8gc3RyZWFtcyBtdXN0IGJlIG9mIHNhbWUgZGltZW5zaW9ucy4gT3V0cHV0IHZpZGVvIHN0cmVhbQord2lsbCBoYXZlIFhtYXAvWW1hcCB2aWRlbyBzdHJlYW0gZGltZW5zaW9ucy4KK1htYXAgYW5kIFltYXAgaW5wdXQgdmlkZW8gc3RyZWFtcyBhcmUgMTZiaXQgZGVwdGgsIHNpbmdsZSBjaGFubmVsLgorCiBAc2VjdGlvbiByZW1vdmVncmFpbgogCiBUaGUgcmVtb3ZlZ3JhaW4gZmlsdGVyIGlzIGEgc3BhdGlhbCBkZW5vaXNlciBmb3IgcHJvZ3Jlc3NpdmUgdmlkZW8uCkBAIC0xMDA3OSw5ICsxMzI4MSw5IEBACiBUaGlzIGZpbHRlciB1c2VzIHRoZSByZXBlYXRfZmllbGQgZmxhZyBmcm9tIHRoZSBWaWRlbyBFUyBoZWFkZXJzIGFuZCBoYXJkIHJlcGVhdHMKIGZpZWxkcyBiYXNlZCBvbiBpdHMgdmFsdWUuCiAKLUBzZWN0aW9uIHJldmVyc2UsIGFyZXZlcnNlCitAc2VjdGlvbiByZXZlcnNlCiAKLVJldmVyc2UgYSBjbGlwLgorUmV2ZXJzZSBhIHZpZGVvIGNsaXAuCiAKIFdhcm5pbmc6IFRoaXMgZmlsdGVyIHJlcXVpcmVzIG1lbW9yeSB0byBidWZmZXIgdGhlIGVudGlyZSBjbGlwLCBzbyB0cmltbWluZwogaXMgc3VnZ2VzdGVkLgpAQCAtMTAwOTYsNiArMTMyOTgsMjMgQEAKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIHJvYmVydHMKK0FwcGx5IHJvYmVydHMgY3Jvc3Mgb3BlcmF0b3IgdG8gaW5wdXQgdmlkZW8gc3RyZWFtLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb246CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBwbGFuZXMKK1NldCB3aGljaCBwbGFuZXMgd2lsbCBiZSBwcm9jZXNzZWQsIHVucHJvY2Vzc2VkIHBsYW5lcyB3aWxsIGJlIGNvcGllZC4KK0J5IGRlZmF1bHQgdmFsdWUgMHhmLCBhbGwgcGxhbmVzIHdpbGwgYmUgcHJvY2Vzc2VkLgorCitAaXRlbSBzY2FsZQorU2V0IHZhbHVlIHdoaWNoIHdpbGwgYmUgbXVsdGlwbGllZCB3aXRoIGZpbHRlcmVkIHJlc3VsdC4KKworQGl0ZW0gZGVsdGEKK1NldCB2YWx1ZSB3aGljaCB3aWxsIGJlIGFkZGVkIHRvIGZpbHRlcmVkIHJlc3VsdC4KK0BlbmQgdGFibGUKKwogQHNlY3Rpb24gcm90YXRlCiAKIFJvdGF0ZSB2aWRlbyBieSBhbiBhcmJpdHJhcnkgYW5nbGUgZXhwcmVzc2VkIGluIHJhZGlhbnMuCkBAIC0xMDEyNSw4ICsxMzM0NCw5IEBACiAKIEBpdGVtIGZpbGxjb2xvciwgYwogU2V0IHRoZSBjb2xvciB1c2VkIHRvIGZpbGwgdGhlIG91dHB1dCBhcmVhIG5vdCBjb3ZlcmVkIGJ5IHRoZSByb3RhdGVkCi1pbWFnZS4gRm9yIHRoZSBnZW5lcmFsIHN5bnRheCBvZiB0aGlzIG9wdGlvbiwgY2hlY2sgdGhlICJDb2xvciIgc2VjdGlvbiBpbiB0aGUKLWZmbXBlZy11dGlscyBtYW51YWwuIElmIHRoZSBzcGVjaWFsIHZhbHVlICJub25lIiBpcyBzZWxlY3RlZCB0aGVuIG5vCitpbWFnZS4gRm9yIHRoZSBnZW5lcmFsIHN5bnRheCBvZiB0aGlzIG9wdGlvbiwgY2hlY2sgdGhlCitAcmVme2NvbG9yIHN5bnRheCwsIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLGZmbXBlZy11dGlsc30uCitJZiB0aGUgc3BlY2lhbCB2YWx1ZSAibm9uZSIgaXMgc2VsZWN0ZWQgdGhlbiBubwogYmFja2dyb3VuZCBpcyBwcmludGVkICh1c2VmdWwgZm9yIGV4YW1wbGUgaWYgdGhlIGJhY2tncm91bmQgaXMgbmV2ZXIgc2hvd24pLgogCiBEZWZhdWx0IHZhbHVlIGlzICJibGFjayIuCkBAIC0xMDI1MCwxNiArMTM0NzAsMTYgQEAKIGJlIGEgdmFsdWUgaW4gdGhlIDAuMS0xMDAuMCByYW5nZSwgZGVmYXVsdCB2YWx1ZSBpcyAxLjAuCiAKIEBpdGVtIGNocm9tYV9yYWRpdXMsIGNyCi1TZXQgY2hyb21hIGJsdXIgZmlsdGVyIHN0cmVuZ3RoLCBtdXN0IGJlIGEgdmFsdWUgaW4gcmFuZ2UgMC4xLTQuMC4gQQorU2V0IGNocm9tYSBibHVyIGZpbHRlciBzdHJlbmd0aCwgbXVzdCBiZSBhIHZhbHVlIGluIHJhbmdlIC0wLjktNC4wLiBBCiBncmVhdGVyIHZhbHVlIHdpbGwgcmVzdWx0IGluIGEgbW9yZSBibHVycmVkIGltYWdlLCBhbmQgaW4gc2xvd2VyCiBwcm9jZXNzaW5nLgogCiBAaXRlbSBjaHJvbWFfcHJlX2ZpbHRlcl9yYWRpdXMsIGNwZnIKLVNldCBjaHJvbWEgcHJlLWZpbHRlciByYWRpdXMsIG11c3QgYmUgYSB2YWx1ZSBpbiB0aGUgMC4xLTIuMCByYW5nZS4KK1NldCBjaHJvbWEgcHJlLWZpbHRlciByYWRpdXMsIG11c3QgYmUgYSB2YWx1ZSBpbiB0aGUgLTAuOS0yLjAgcmFuZ2UuCiAKIEBpdGVtIGNocm9tYV9zdHJlbmd0aCwgY3MKIFNldCBjaHJvbWEgbWF4aW11bSBkaWZmZXJlbmNlIGJldHdlZW4gcGl4ZWxzIHRvIHN0aWxsIGJlIGNvbnNpZGVyZWQsCi1tdXN0IGJlIGEgdmFsdWUgaW4gdGhlIDAuMS0xMDAuMCByYW5nZS4KK211c3QgYmUgYSB2YWx1ZSBpbiB0aGUgLTAuOS0xMDAuMCByYW5nZS4KIEBlbmQgdGFibGUKIAogRWFjaCBjaHJvbWEgb3B0aW9uIHZhbHVlLCBpZiBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQsIGlzIHNldCB0byB0aGUKQEAgLTEwMjkwLDE3ICsxMzUxMCwxOCBAQAogU2V0IHRoZSBvdXRwdXQgdmlkZW8gZGltZW5zaW9uIGV4cHJlc3Npb24uIERlZmF1bHQgdmFsdWUgaXMgdGhlIGlucHV0CiBkaW1lbnNpb24uCiAKLUlmIHRoZSB2YWx1ZSBpcyAwLCB0aGUgaW5wdXQgd2lkdGggaXMgdXNlZCBmb3IgdGhlIG91dHB1dC4KK0lmIHRoZSBAdmFye3dpZHRofSBvciBAdmFye3d9IHZhbHVlIGlzIDAsIHRoZSBpbnB1dCB3aWR0aCBpcyB1c2VkIGZvcgordGhlIG91dHB1dC4gSWYgdGhlIEB2YXJ7aGVpZ2h0fSBvciBAdmFye2h9IHZhbHVlIGlzIDAsIHRoZSBpbnB1dCBoZWlnaHQKK2lzIHVzZWQgZm9yIHRoZSBvdXRwdXQuCiAKLUlmIG9uZSBvZiB0aGUgdmFsdWVzIGlzIC0xLCB0aGUgc2NhbGUgZmlsdGVyIHdpbGwgdXNlIGEgdmFsdWUgdGhhdAotbWFpbnRhaW5zIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGlucHV0IGltYWdlLCBjYWxjdWxhdGVkIGZyb20gdGhlCi1vdGhlciBzcGVjaWZpZWQgZGltZW5zaW9uLiBJZiBib3RoIG9mIHRoZW0gYXJlIC0xLCB0aGUgaW5wdXQgc2l6ZSBpcwotdXNlZAorSWYgb25lIGFuZCBvbmx5IG9uZSBvZiB0aGUgdmFsdWVzIGlzIC1uIHdpdGggbiA+PSAxLCB0aGUgc2NhbGUgZmlsdGVyCit3aWxsIHVzZSBhIHZhbHVlIHRoYXQgbWFpbnRhaW5zIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGlucHV0IGltYWdlLAorY2FsY3VsYXRlZCBmcm9tIHRoZSBvdGhlciBzcGVjaWZpZWQgZGltZW5zaW9uLiBBZnRlciB0aGF0IGl0IHdpbGwsCitob3dldmVyLCBtYWtlIHN1cmUgdGhhdCB0aGUgY2FsY3VsYXRlZCBkaW1lbnNpb24gaXMgZGl2aXNpYmxlIGJ5IG4gYW5kCithZGp1c3QgdGhlIHZhbHVlIGlmIG5lY2Vzc2FyeS4KIAotSWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgLW4gd2l0aCBuID4gMSwgdGhlIHNjYWxlIGZpbHRlciB3aWxsIGFsc28gdXNlIGEgdmFsdWUKLXRoYXQgbWFpbnRhaW5zIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGlucHV0IGltYWdlLCBjYWxjdWxhdGVkIGZyb20gdGhlIG90aGVyCi1zcGVjaWZpZWQgZGltZW5zaW9uLiBBZnRlciB0aGF0IGl0IHdpbGwsIGhvd2V2ZXIsIG1ha2Ugc3VyZSB0aGF0IHRoZSBjYWxjdWxhdGVkCi1kaW1lbnNpb24gaXMgZGl2aXNpYmxlIGJ5IG4gYW5kIGFkanVzdCB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgorSWYgYm90aCB2YWx1ZXMgYXJlIC1uIHdpdGggbiA+PSAxLCB0aGUgYmVoYXZpb3Igd2lsbCBiZSBpZGVudGljYWwgdG8KK2JvdGggdmFsdWVzIGJlaW5nIHNldCB0byAwIGFzIHByZXZpb3VzbHkgZGV0YWlsZWQuCiAKIFNlZSBiZWxvdyBmb3IgdGhlIGxpc3Qgb2YgYWNjZXB0ZWQgY29uc3RhbnRzIGZvciB1c2UgaW4gdGhlIGRpbWVuc2lvbgogZXhwcmVzc2lvbi4KQEAgLTEwNDA3LDEzICsxMzYyOCwxMyBAQAogcmFuZ2UgZGVwZW5kcyBvbiB0aGUgcGl4ZWwgZm9ybWF0LiBQb3NzaWJsZSB2YWx1ZXM6CiAKIEB0YWJsZSBAc2FtcAotQGl0ZW0gYXV0bworQGl0ZW0gYXV0by91bmtub3duCiBDaG9vc2UgYXV0b21hdGljYWxseS4KIAogQGl0ZW0ganBlZy9mdWxsL3BjCiBTZXQgZnVsbCByYW5nZSAoMC0yNTUgaW4gY2FzZSBvZiA4LWJpdCBsdW1hKS4KIAotQGl0ZW0gbXBlZy90dgorQGl0ZW0gbXBlZy9saW1pdGVkL3R2CiBTZXQgIk1QRUciIHJhbmdlICgxNi0yMzUgaW4gY2FzZSBvZiA4LWJpdCBsdW1hKS4KIEBlbmQgdGFibGUKIApAQCAtMTA1NzIsNiArMTM3OTMsMTkgQEAKIEBleGFtcGxlCiBzY2FsZT13PSdtaW4oNTAwXCwgaXcqMy8yKTpoPS0xJwogQGVuZCBleGFtcGxlCisKK0BpdGVtCitNYWtlIHBpeGVscyBzcXVhcmUgYnkgY29tYmluaW5nIHNjYWxlIGFuZCBzZXRzYXI6CitAZXhhbXBsZQorc2NhbGU9J3RydW5jKGloKmRhcik6aWgnLHNldHNhcj0xLzEKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorTWFrZSBwaXhlbHMgc3F1YXJlIGJ5IGNvbWJpbmluZyBzY2FsZSBhbmQgc2V0c2FyLAorbWFraW5nIHN1cmUgdGhlIHJlc3VsdGluZyByZXNvbHV0aW9uIGlzIGV2ZW4gKHJlcXVpcmVkIGJ5IHNvbWUgY29kZWNzKToKK0BleGFtcGxlCitzY2FsZT0ndHJ1bmMoaWgqZGFyLzIpKjI6dHJ1bmMoaWgvMikqMicsc2V0c2FyPTEvMQorQGVuZCBleGFtcGxlCiBAZW5kIGl0ZW1pemUKIAogQHN1YnNlY3Rpb24gQ29tbWFuZHMKQEAgLTEwNTg3LDIzICsxMzgyMSw4NiBAQAogdmFsdWUuCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIHNjYWxlX25wcAorCitVc2UgdGhlIE5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIChsaWJucHApIHRvIHBlcmZvcm0gc2NhbGluZyBhbmQvb3IgcGl4ZWwKK2Zvcm1hdCBjb252ZXJzaW9uIG9uIENVREEgdmlkZW8gZnJhbWVzLiBTZXR0aW5nIHRoZSBvdXRwdXQgd2lkdGggYW5kIGhlaWdodAord29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIGZvciB0aGUgQHZhcntzY2FsZX0gZmlsdGVyLgorCitUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgb3B0aW9ucyBhcmUgYWNjZXB0ZWQ6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZm9ybWF0CitUaGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSBvdXRwdXQgQ1VEQSBmcmFtZXMuIElmIHNldCB0byB0aGUgc3RyaW5nICJzYW1lIiAodGhlCitkZWZhdWx0KSwgdGhlIGlucHV0IGZvcm1hdCB3aWxsIGJlIGtlcHQuIE5vdGUgdGhhdCBhdXRvbWF0aWMgZm9ybWF0IG5lZ290aWF0aW9uCithbmQgY29udmVyc2lvbiBpcyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgaGFyZHdhcmUgZnJhbWVzCisKK0BpdGVtIGludGVycF9hbGdvCitUaGUgaW50ZXJwb2xhdGlvbiBhbGdvcml0aG0gdXNlZCBmb3IgcmVzaXppbmcuIE9uZSBvZiB0aGUgZm9sbG93aW5nOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIG5uCitOZWFyZXN0IG5laWdoYm91ci4KKworQGl0ZW0gbGluZWFyCitAaXRlbSBjdWJpYworQGl0ZW0gY3ViaWMycF9ic3BsaW5lCisyLXBhcmFtZXRlciBjdWJpYyAoQj0xLCBDPTApCisKK0BpdGVtIGN1YmljMnBfY2F0bXVsbHJvbQorMi1wYXJhbWV0ZXIgY3ViaWMgKEI9MCwgQz0xLzIpCisKK0BpdGVtIGN1YmljMnBfYjA1YzAzCisyLXBhcmFtZXRlciBjdWJpYyAoQj0xLzIsIEM9My8xMCkKKworQGl0ZW0gc3VwZXIKK1N1cGVyc2FtcGxpbmcKKworQGl0ZW0gbGFuY3pvcworQGVuZCB0YWJsZQorCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIHNjYWxlMnJlZgogCiBTY2FsZSAocmVzaXplKSB0aGUgaW5wdXQgdmlkZW8sIGJhc2VkIG9uIGEgcmVmZXJlbmNlIHZpZGVvLgogCiBTZWUgdGhlIHNjYWxlIGZpbHRlciBmb3IgYXZhaWxhYmxlIG9wdGlvbnMsIHNjYWxlMnJlZiBzdXBwb3J0cyB0aGUgc2FtZSBidXQKLXVzZXMgdGhlIHJlZmVyZW5jZSB2aWRlbyBpbnN0ZWFkIG9mIHRoZSBtYWluIGlucHV0IGFzIGJhc2lzLgordXNlcyB0aGUgcmVmZXJlbmNlIHZpZGVvIGluc3RlYWQgb2YgdGhlIG1haW4gaW5wdXQgYXMgYmFzaXMuIHNjYWxlMnJlZiBhbHNvCitzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgY29uc3RhbnRzIGZvciB0aGUgQG9wdGlvbnt3fSBhbmQKK0BvcHRpb257aH0gb3B0aW9uczoKKworQHRhYmxlIEB2YXIKK0BpdGVtIG1haW5fdworQGl0ZW0gbWFpbl9oCitUaGUgbWFpbiBpbnB1dCB2aWRlbydzIHdpZHRoIGFuZCBoZWlnaHQKKworQGl0ZW0gbWFpbl9hCitUaGUgc2FtZSBhcyBAdmFye21haW5fd30gLyBAdmFye21haW5faH0KKworQGl0ZW0gbWFpbl9zYXIKK1RoZSBtYWluIGlucHV0IHZpZGVvJ3Mgc2FtcGxlIGFzcGVjdCByYXRpbworCitAaXRlbSBtYWluX2RhciwgbWRhcgorVGhlIG1haW4gaW5wdXQgdmlkZW8ncyBkaXNwbGF5IGFzcGVjdCByYXRpby4gQ2FsY3VsYXRlZCBmcm9tCitAY29kZXsobWFpbl93IC8gbWFpbl9oKSAqIG1haW5fc2FyfS4KKworQGl0ZW0gbWFpbl9oc3ViCitAaXRlbSBtYWluX3ZzdWIKK1RoZSBtYWluIGlucHV0IHZpZGVvJ3MgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgY2hyb21hIHN1YnNhbXBsZSB2YWx1ZXMuCitGb3IgZXhhbXBsZSBmb3IgdGhlIHBpeGVsIGZvcm1hdCAieXV2NDIycCIgQHZhcntoc3VifSBpcyAyIGFuZCBAdmFye3ZzdWJ9CitpcyAxLgorQGVuZCB0YWJsZQogCiBAc3Vic2VjdGlvbiBFeGFtcGxlcwogCiBAaXRlbWl6ZQogQGl0ZW0KLVNjYWxlIGEgc3VidGl0bGUgc3RyZWFtIHRvIG1hdGNoIHRoZSBtYWluIHZpZGVvIGluIHNpemUgYmVmb3JlIG92ZXJsYXlpbmcKK1NjYWxlIGEgc3VidGl0bGUgc3RyZWFtIChiKSB0byBtYXRjaCB0aGUgbWFpbiB2aWRlbyAoYSkgaW4gc2l6ZSBiZWZvcmUgb3ZlcmxheWluZwogQGV4YW1wbGUKICdzY2FsZTJyZWZbYl1bYV07W2FdW2Jdb3ZlcmxheScKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BhbmNob3J7c2VsZWN0aXZlY29sb3J9CiBAc2VjdGlvbiBzZWxlY3RpdmVjb2xvcgogCiBBZGp1c3QgY3lhbiwgbWFnZW50YSwgeWVsbG93IGFuZCBibGFjayAoQ01ZSykgdG8gY2VydGFpbiByYW5nZXMgb2YgY29sb3JzIChzdWNoCkBAIC0xMDY3MSw2ICsxMzk2OCw3IEBACiBAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCitAYW5jaG9ye3NlcGFyYXRlZmllbGRzfQogQHNlY3Rpb24gc2VwYXJhdGVmaWVsZHMKIAogVGhlIEBjb2Rle3NlcGFyYXRlZmllbGRzfSB0YWtlcyBhIGZyYW1lLWJhc2VkIHZpZGVvIGlucHV0IGFuZCBzcGxpdHMKQEAgLTEwNzY0LDcgKzE0MDYyLDYgQEAKIEBleGFtcGxlCiBzZXRkYXI9ZGFyPTEuNzc3NzcKIHNldGRhcj1kYXI9MTYvOQotc2V0ZGFyPWRhcj0xLjc3Nzc3CiBAZW5kIGV4YW1wbGUKIAogQGl0ZW0KQEAgLTEwODg4LDcgKzE0MTg1LDcgQEAKIAogQHNlY3Rpb24gc2h1ZmZsZWZyYW1lcwogCi1SZW9yZGVyIGFuZC9vciBkdXBsaWNhdGUgdmlkZW8gZnJhbWVzLgorUmVvcmRlciBhbmQvb3IgZHVwbGljYXRlIGFuZC9vciBkcm9wIHZpZGVvIGZyYW1lcy4KIAogSXQgYWNjZXB0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAKQEAgLTEwODk3LDE1ICsxNDE5NCwyNyBAQAogU2V0IHRoZSBkZXN0aW5hdGlvbiBpbmRleGVzIG9mIGlucHV0IGZyYW1lcy4KIFRoaXMgaXMgc3BhY2Ugb3IgJ3wnIHNlcGFyYXRlZCBsaXN0IG9mIGluZGV4ZXMgdGhhdCBtYXBzIGlucHV0IGZyYW1lcyB0byBvdXRwdXQKIGZyYW1lcy4gTnVtYmVyIG9mIGluZGV4ZXMgYWxzbyBzZXRzIG1heGltYWwgdmFsdWUgdGhhdCBlYWNoIGluZGV4IG1heSBoYXZlLgorJy0xJyBpbmRleCBoYXZlIHNwZWNpYWwgbWVhbmluZyBhbmQgdGhhdCBpcyB0byBkcm9wIGZyYW1lLgogQGVuZCB0YWJsZQogCiBUaGUgZmlyc3QgZnJhbWUgaGFzIHRoZSBpbmRleCAwLiBUaGUgZGVmYXVsdCBpcyB0byBrZWVwIHRoZSBpbnB1dCB1bmNoYW5nZWQuCiAKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK0BpdGVtaXplCitAaXRlbQogU3dhcCBzZWNvbmQgYW5kIHRoaXJkIGZyYW1lIG9mIGV2ZXJ5IHRocmVlIGZyYW1lcyBvZiB0aGUgaW5wdXQ6CiBAZXhhbXBsZQogZmZtcGVnIC1pIElOUFVUIC12ZiAic2h1ZmZsZWZyYW1lcz0wIDIgMSIgT1VUUFVUCiBAZW5kIGV4YW1wbGUKIAorQGl0ZW0KK1N3YXAgMTB0aCBhbmQgMXN0IGZyYW1lIG9mIGV2ZXJ5IHRlbiBmcmFtZXMgb2YgdGhlIGlucHV0OgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBJTlBVVCAtdmYgInNodWZmbGVmcmFtZXM9OSAxIDIgMyA0IDUgNiA3IDggMCIgT1VUUFVUCitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAc2VjdGlvbiBzaHVmZmxlcGxhbmVzCiAKIFJlb3JkZXIgYW5kL29yIGR1cGxpY2F0ZSB2aWRlbyBwbGFuZXMuCkBAIC0xMDkzMCwxMCArMTQyMzksMTUgQEAKIAogVGhlIGZpcnN0IHBsYW5lIGhhcyB0aGUgaW5kZXggMC4gVGhlIGRlZmF1bHQgaXMgdG8ga2VlcCB0aGUgaW5wdXQgdW5jaGFuZ2VkLgogCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitAaXRlbWl6ZQorQGl0ZW0KIFN3YXAgdGhlIHNlY29uZCBhbmQgdGhpcmQgcGxhbmVzIG9mIHRoZSBpbnB1dDoKIEBleGFtcGxlCiBmZm1wZWcgLWkgSU5QVVQgLXZmIHNodWZmbGVwbGFuZXM9MDoyOjE6MyBPVVRQVVQKIEBlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCiAKIEBhbmNob3J7c2lnbmFsc3RhdHN9CiBAc2VjdGlvbiBzaWduYWxzdGF0cwpAQCAtMTEwNDUsNiArMTQzNTksMTggQEAKIERpc3BsYXkgdGhlIGF2ZXJhZ2Ugb2Ygc2FtcGxlIHZhbHVlIGRpZmZlcmVuY2UgYmV0d2VlbiBhbGwgdmFsdWVzIG9mIHRoZSBWCiBwbGFuZSBpbiB0aGUgY3VycmVudCBmcmFtZSBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZXMgb2YgdGhlIHByZXZpb3VzIGlucHV0IGZyYW1lLgogRXhwcmVzc2VkIGluIHJhbmdlIG9mIFswLTI1NV0uCisKK0BpdGVtIFlCSVRERVBUSAorRGlzcGxheSBiaXQgZGVwdGggb2YgWSBwbGFuZSBpbiBjdXJyZW50IGZyYW1lLgorRXhwcmVzc2VkIGluIHJhbmdlIG9mIFswLTE2XS4KKworQGl0ZW0gVUJJVERFUFRICitEaXNwbGF5IGJpdCBkZXB0aCBvZiBVIHBsYW5lIGluIGN1cnJlbnQgZnJhbWUuCitFeHByZXNzZWQgaW4gcmFuZ2Ugb2YgWzAtMTZdLgorCitAaXRlbSBWQklUREVQVEgKK0Rpc3BsYXkgYml0IGRlcHRoIG9mIFYgcGxhbmUgaW4gY3VycmVudCBmcmFtZS4KK0V4cHJlc3NlZCBpbiByYW5nZSBvZiBbMC0xNl0uCiBAZW5kIHRhYmxlCiAKIFRoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CkBAIC0xMTExOCw2ICsxNDQ0NCw5NSBAQAogQGVuZCBleGFtcGxlCiBAZW5kIGl0ZW1pemUKIAorQGFuY2hvcntzaWduYXR1cmV9CitAc2VjdGlvbiBzaWduYXR1cmUKKworQ2FsY3VsYXRlcyB0aGUgTVBFRy03IFZpZGVvIFNpZ25hdHVyZS4gVGhlIGZpbHRlciBjYW4gaGFuZGxlIG1vcmUgdGhhbiBvbmUKK2lucHV0LiBJbiB0aGlzIGNhc2UgdGhlIG1hdGNoaW5nIGJldHdlZW4gdGhlIGlucHV0cyBjYW4gYmUgY2FsY3VsYXRlZCBhZGRpdGlvbmFsbHkuCitUaGUgZmlsdGVyIGFsd2F5cyBwYXNzZXMgdGhyb3VnaCB0aGUgZmlyc3QgaW5wdXQuIFRoZSBzaWduYXR1cmUgb2YgZWFjaCBzdHJlYW0gY2FuCitiZSB3cml0dGVuIGludG8gYSBmaWxlLgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGRldGVjdG1vZGUKK0VuYWJsZSBvciBkaXNhYmxlIHRoZSBtYXRjaGluZyBwcm9jZXNzLgorCitBdmFpbGFibGUgdmFsdWVzIGFyZToKKworQHRhYmxlIEBzYW1wCitAaXRlbSBvZmYKK0Rpc2FibGUgdGhlIGNhbGN1bGF0aW9uIG9mIGEgbWF0Y2hpbmcgKGRlZmF1bHQpLgorQGl0ZW0gZnVsbAorQ2FsY3VsYXRlIHRoZSBtYXRjaGluZyBmb3IgdGhlIHdob2xlIHZpZGVvIGFuZCBvdXRwdXQgd2hldGhlciB0aGUgd2hvbGUgdmlkZW8KK21hdGNoZXMgb3Igb25seSBwYXJ0cy4KK0BpdGVtIGZhc3QKK0NhbGN1bGF0ZSBvbmx5IHVudGlsIGEgbWF0Y2hpbmcgaXMgZm91bmQgb3IgdGhlIHZpZGVvIGVuZHMuIFNob3VsZCBiZSBmYXN0ZXIgaW4KK3NvbWUgY2FzZXMuCitAZW5kIHRhYmxlCisKK0BpdGVtIG5iX2lucHV0cworU2V0IHRoZSBudW1iZXIgb2YgaW5wdXRzLiBUaGUgb3B0aW9uIHZhbHVlIG11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlci4KK0RlZmF1bHQgdmFsdWUgaXMgMS4KKworQGl0ZW0gZmlsZW5hbWUKK1NldCB0aGUgcGF0aCB0byB3aGljaCB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4uIElmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgaW5wdXQsCit0aGUgcGF0aCBtdXN0IGJlIGEgcHJvdG90eXBlLCBpLmUuIG11c3QgY29udGFpbiAlZCBvciAlMG5kICh3aGVyZSBuIGlzIGEgcG9zaXRpdmUKK2ludGVnZXIpLCB0aGF0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgaW5wdXQgbnVtYmVyLiBJZiBubyBmaWxlbmFtZSBpcworc3BlY2lmaWVkLCBubyBvdXRwdXQgd2lsbCBiZSB3cml0dGVuLiBUaGlzIGlzIHRoZSBkZWZhdWx0LgorCitAaXRlbSBmb3JtYXQKK0Nob29zZSB0aGUgb3V0cHV0IGZvcm1hdC4KKworQXZhaWxhYmxlIHZhbHVlcyBhcmU6CisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gYmluYXJ5CitVc2UgdGhlIHNwZWNpZmllZCBiaW5hcnkgcmVwcmVzZW50YXRpb24gKGRlZmF1bHQpLgorQGl0ZW0geG1sCitVc2UgdGhlIHNwZWNpZmllZCB4bWwgcmVwcmVzZW50YXRpb24uCitAZW5kIHRhYmxlCisKK0BpdGVtIHRoX2QKK1NldCB0aHJlc2hvbGQgdG8gZGV0ZWN0IG9uZSB3b3JkIGFzIHNpbWlsYXIuIFRoZSBvcHRpb24gdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyCitncmVhdGVyIHRoYW4gemVyby4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgOTAwMC4KKworQGl0ZW0gdGhfZGMKK1NldCB0aHJlc2hvbGQgdG8gZGV0ZWN0IGFsbCB3b3JkcyBhcyBzaW1pbGFyLiBUaGUgb3B0aW9uIHZhbHVlIG11c3QgYmUgYW4gaW50ZWdlcgorZ3JlYXRlciB0aGFuIHplcm8uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDYwMDAwLgorCitAaXRlbSB0aF94aAorU2V0IHRocmVzaG9sZCB0byBkZXRlY3QgZnJhbWVzIGFzIHNpbWlsYXIuIFRoZSBvcHRpb24gdmFsdWUgbXVzdCBiZSBhbiBpbnRlZ2VyCitncmVhdGVyIHRoYW4gemVyby4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMTE2LgorCitAaXRlbSB0aF9kaQorU2V0IHRoZSBtaW5pbXVtIGxlbmd0aCBvZiBhIHNlcXVlbmNlIGluIGZyYW1lcyB0byByZWNvZ25pemUgaXQgYXMgbWF0Y2hpbmcKK3NlcXVlbmNlLiBUaGUgb3B0aW9uIHZhbHVlIG11c3QgYmUgYSBub24gbmVnYXRpdmUgaW50ZWdlciB2YWx1ZS4KK1RoZSBkZWZhdWx0IHZhbHVlIGlzIDAuCisKK0BpdGVtIHRoX2l0CitTZXQgdGhlIG1pbmltdW0gcmVsYXRpb24sIHRoYXQgbWF0Y2hpbmcgZnJhbWVzIHRvIGFsbCBmcmFtZXMgbXVzdCBoYXZlLgorVGhlIG9wdGlvbiB2YWx1ZSBtdXN0IGJlIGEgZG91YmxlIHZhbHVlIGJldHdlZW4gMCBhbmQgMS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC41LgorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitAaXRlbWl6ZQorQGl0ZW0KK1RvIGNhbGN1bGF0ZSB0aGUgc2lnbmF0dXJlIG9mIGFuIGlucHV0IHZpZGVvIGFuZCBzdG9yZSBpdCBpbiBzaWduYXR1cmUuYmluOgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBpbnB1dC5ta3YgLXZmIHNpZ25hdHVyZT1maWxlbmFtZT1zaWduYXR1cmUuYmluIC1tYXAgMDp2IC1mIG51bGwgLQorQGVuZCBleGFtcGxlCisKK0BpdGVtCitUbyBkZXRlY3Qgd2hldGhlciB0d28gdmlkZW9zIG1hdGNoIGFuZCBzdG9yZSB0aGUgc2lnbmF0dXJlcyBpbiBYTUwgZm9ybWF0IGluCitzaWduYXR1cmUwLnhtbCBhbmQgc2lnbmF0dXJlMS54bWw6CitAZXhhbXBsZQorZmZtcGVnIC1pIGlucHV0MS5ta3YgLWkgaW5wdXQyLm1rdiAtZmlsdGVyX2NvbXBsZXggIlswOnZdWzE6dl0gc2lnbmF0dXJlPW5iX2lucHV0cz0yOmRldGVjdG1vZGU9ZnVsbDpmb3JtYXQ9eG1sOmZpbGVuYW1lPXNpZ25hdHVyZSVkLnhtbCIgLW1hcCA6diAtZiBudWxsIC0KK0BlbmQgZXhhbXBsZQorCitAZW5kIGl0ZW1pemUKKwogQGFuY2hvcntzbWFydGJsdXJ9CiBAc2VjdGlvbiBzbWFydGJsdXIKIApAQCAtMTExNDcsMjAgKzE0NTYyLDIwIEBACiBAaXRlbSBjaHJvbWFfcmFkaXVzLCBjcgogU2V0IHRoZSBjaHJvbWEgcmFkaXVzLiBUaGUgb3B0aW9uIHZhbHVlIG11c3QgYmUgYSBmbG9hdCBudW1iZXIgaW4KIHRoZSByYW5nZSBbMC4xLDUuMF0gdGhhdCBzcGVjaWZpZXMgdGhlIHZhcmlhbmNlIG9mIHRoZSBnYXVzc2lhbiBmaWx0ZXIKLXVzZWQgdG8gYmx1ciB0aGUgaW1hZ2UgKHNsb3dlciBpZiBsYXJnZXIpLiBEZWZhdWx0IHZhbHVlIGlzIDEuMC4KK3VzZWQgdG8gYmx1ciB0aGUgaW1hZ2UgKHNsb3dlciBpZiBsYXJnZXIpLiBEZWZhdWx0IHZhbHVlIGlzIEBvcHRpb257bHVtYV9yYWRpdXN9LgogCiBAaXRlbSBjaHJvbWFfc3RyZW5ndGgsIGNzCiBTZXQgdGhlIGNocm9tYSBzdHJlbmd0aC4gVGhlIG9wdGlvbiB2YWx1ZSBtdXN0IGJlIGEgZmxvYXQgbnVtYmVyCiBpbiB0aGUgcmFuZ2UgWy0xLjAsMS4wXSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGJsdXJyaW5nLiBBIHZhbHVlIGluY2x1ZGVkCiBpbiBbMC4wLDEuMF0gd2lsbCBibHVyIHRoZSBpbWFnZSB3aGVyZWFzIGEgdmFsdWUgaW5jbHVkZWQgaW4KLVstMS4wLDAuMF0gd2lsbCBzaGFycGVuIHRoZSBpbWFnZS4gRGVmYXVsdCB2YWx1ZSBpcyAxLjAuCitbLTEuMCwwLjBdIHdpbGwgc2hhcnBlbiB0aGUgaW1hZ2UuIERlZmF1bHQgdmFsdWUgaXMgQG9wdGlvbntsdW1hX3N0cmVuZ3RofS4KIAogQGl0ZW0gY2hyb21hX3RocmVzaG9sZCwgY3QKIFNldCB0aGUgY2hyb21hIHRocmVzaG9sZCB1c2VkIGFzIGEgY29lZmZpY2llbnQgdG8gZGV0ZXJtaW5lCiB3aGV0aGVyIGEgcGl4ZWwgc2hvdWxkIGJlIGJsdXJyZWQgb3Igbm90LiBUaGUgb3B0aW9uIHZhbHVlIG11c3QgYmUgYW4KIGludGVnZXIgaW4gdGhlIHJhbmdlIFstMzAsMzBdLiBBIHZhbHVlIG9mIDAgd2lsbCBmaWx0ZXIgYWxsIHRoZSBpbWFnZSwKIGEgdmFsdWUgaW5jbHVkZWQgaW4gWzAsMzBdIHdpbGwgZmlsdGVyIGZsYXQgYXJlYXMgYW5kIGEgdmFsdWUgaW5jbHVkZWQKLWluIFstMzAsMF0gd2lsbCBmaWx0ZXIgZWRnZXMuIERlZmF1bHQgdmFsdWUgaXMgMC4KK2luIFstMzAsMF0gd2lsbCBmaWx0ZXIgZWRnZXMuIERlZmF1bHQgdmFsdWUgaXMgQG9wdGlvbntsdW1hX3RocmVzaG9sZH0uCiBAZW5kIHRhYmxlCiAKIElmIGEgY2hyb21hIG9wdGlvbiBpcyBub3QgZXhwbGljaXRseSBzZXQsIHRoZSBjb3JyZXNwb25kaW5nIGx1bWEgdmFsdWUKQEAgLTExMjEwLDYgKzE0NjI1LDggQEAKIFNhbWUgYXMgYWJvdmUgYnV0IGluIGRCIHJlcHJlc2VudGF0aW9uLgogQGVuZCB0YWJsZQogCitUaGlzIGZpbHRlciBhbHNvIHN1cHBvcnRzIHRoZSBAcmVme2ZyYW1lc3luY30gb3B0aW9ucy4KKwogRm9yIGV4YW1wbGU6CiBAZXhhbXBsZQogbW92aWU9cmVmX21vdmllLm1wZywgc2V0cHRzPVBUUy1TVEFSVFBUUyBbbWFpbl07CkBAIC0xMTQwMyw2ICsxNDgyMCw5IEBACiAKIEBpdGVtIGljcgogaW50ZXJsZWF2ZWQgY29sdW1ucywgcmlnaHQgZXllIGZpcnN0CisKK0BpdGVtIGhkbWkKK0hETUkgZnJhbWUgcGFjawogQGVuZCB0YWJsZQogCiBEZWZhdWx0IHZhbHVlIGlzIEBzYW1we2FyY2R9LgpAQCAtMTE0NjMsNiArMTQ4ODMsMjMgQEAKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIHNvYmVsCitBcHBseSBzb2JlbCBvcGVyYXRvciB0byBpbnB1dCB2aWRlbyBzdHJlYW0uCisKK1RoZSBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbjoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIHBsYW5lcworU2V0IHdoaWNoIHBsYW5lcyB3aWxsIGJlIHByb2Nlc3NlZCwgdW5wcm9jZXNzZWQgcGxhbmVzIHdpbGwgYmUgY29waWVkLgorQnkgZGVmYXVsdCB2YWx1ZSAweGYsIGFsbCBwbGFuZXMgd2lsbCBiZSBwcm9jZXNzZWQuCisKK0BpdGVtIHNjYWxlCitTZXQgdmFsdWUgd2hpY2ggd2lsbCBiZSBtdWx0aXBsaWVkIHdpdGggZmlsdGVyZWQgcmVzdWx0LgorCitAaXRlbSBkZWx0YQorU2V0IHZhbHVlIHdoaWNoIHdpbGwgYmUgYWRkZWQgdG8gZmlsdGVyZWQgcmVzdWx0LgorQGVuZCB0YWJsZQorCiBAYW5jaG9ye3NwcH0KIEBzZWN0aW9uIHNwcAogCkBAIC0xMTUyNyw2ICsxNDk2NCw5IEBACiBTZXQgYSBkaXJlY3RvcnkgcGF0aCBjb250YWluaW5nIGZvbnRzIHRoYXQgY2FuIGJlIHVzZWQgYnkgdGhlIGZpbHRlci4KIFRoZXNlIGZvbnRzIHdpbGwgYmUgdXNlZCBpbiBhZGRpdGlvbiB0byB3aGF0ZXZlciB0aGUgZm9udCBwcm92aWRlciB1c2VzLgogCitAaXRlbSBhbHBoYQorUHJvY2VzcyBhbHBoYSBjaGFubmVsLCBieSBkZWZhdWx0IGFscGhhIGNoYW5uZWwgaXMgdW50b3VjaGVkLgorCiBAaXRlbSBjaGFyZW5jCiBTZXQgc3VidGl0bGVzIGlucHV0IGNoYXJhY3RlciBlbmNvZGluZy4gQGNvZGV7c3VidGl0bGVzfSBmaWx0ZXIgb25seS4gT25seQogdXNlZnVsIGlmIG5vdCBVVEYtOC4KQEAgLTExNjcyLDYgKzE1MTEyLDYzIEBACiAxNnA6IDMzMzMzMzM0CiBAZW5kIGV4YW1wbGUKIAorQHNlY3Rpb24gdGhyZXNob2xkCisKK0FwcGx5IHRocmVzaG9sZCBlZmZlY3QgdG8gdmlkZW8gc3RyZWFtLgorCitUaGlzIGZpbHRlciBuZWVkcyBmb3VyIHZpZGVvIHN0cmVhbXMgdG8gcGVyZm9ybSB0aHJlc2hvbGRpbmcuCitGaXJzdCBzdHJlYW0gaXMgc3RyZWFtIHdlIGFyZSBmaWx0ZXJpbmcuCitTZWNvbmQgc3RyZWFtIGlzIGhvbGRpbmcgdGhyZXNob2xkIHZhbHVlcywgdGhpcmQgc3RyZWFtIGlzIGhvbGRpbmcgbWluIHZhbHVlcywKK2FuZCBsYXN0LCBmb3VydGggc3RyZWFtIGlzIGhvbGRpbmcgbWF4IHZhbHVlcy4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcGxhbmVzCitTZXQgd2hpY2ggcGxhbmVzIHdpbGwgYmUgcHJvY2Vzc2VkLCB1bnByb2Nlc3NlZCBwbGFuZXMgd2lsbCBiZSBjb3BpZWQuCitCeSBkZWZhdWx0IHZhbHVlIDB4ZiwgYWxsIHBsYW5lcyB3aWxsIGJlIHByb2Nlc3NlZC4KK0BlbmQgdGFibGUKKworRm9yIGV4YW1wbGUgaWYgZmlyc3Qgc3RyZWFtIHBpeGVsJ3MgY29tcG9uZW50IHZhbHVlIGlzIGxlc3MgdGhlbiB0aHJlc2hvbGQgdmFsdWUKK29mIHBpeGVsIGNvbXBvbmVudCBmcm9tIDJuZCB0aHJlc2hvbGQgc3RyZWFtLCB0aGlyZCBzdHJlYW0gdmFsdWUgd2lsbCBwaWNrZWQsCitvdGhlcndpc2UgZm91cnRoIHN0cmVhbSBwaXhlbCBjb21wb25lbnQgdmFsdWUgd2lsbCBiZSBwaWNrZWQuCisKK1VzaW5nIGNvbG9yIHNvdXJjZSBmaWx0ZXIgb25lIGNhbiBwZXJmb3JtIHZhcmlvdXMgdHlwZXMgb2YgdGhyZXNob2xkaW5nOgorCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitAaXRlbWl6ZQorQGl0ZW0KK0JpbmFyeSB0aHJlc2hvbGQsIHVzaW5nIGdyYXkgY29sb3IgYXMgdGhyZXNob2xkOgorQGV4YW1wbGUKK2ZmbXBlZyAtaSAzMjB4MjQwLmF2aSAtZiBsYXZmaSAtaSBjb2xvcj1ncmF5IC1mIGxhdmZpIC1pIGNvbG9yPWJsYWNrIC1mIGxhdmZpIC1pIGNvbG9yPXdoaXRlIC1sYXZmaSB0aHJlc2hvbGQgb3V0cHV0LmF2aQorQGVuZCBleGFtcGxlCisKK0BpdGVtCitJbnZlcnRlZCBiaW5hcnkgdGhyZXNob2xkLCB1c2luZyBncmF5IGNvbG9yIGFzIHRocmVzaG9sZDoKK0BleGFtcGxlCitmZm1wZWcgLWkgMzIweDI0MC5hdmkgLWYgbGF2ZmkgLWkgY29sb3I9Z3JheSAtZiBsYXZmaSAtaSBjb2xvcj13aGl0ZSAtZiBsYXZmaSAtaSBjb2xvcj1ibGFjayAtbGF2ZmkgdGhyZXNob2xkIG91dHB1dC5hdmkKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorVHJ1bmNhdGUgYmluYXJ5IHRocmVzaG9sZCwgdXNpbmcgZ3JheSBjb2xvciBhcyB0aHJlc2hvbGQ6CitAZXhhbXBsZQorZmZtcGVnIC1pIDMyMHgyNDAuYXZpIC1mIGxhdmZpIC1pIGNvbG9yPWdyYXkgLWkgMzIweDI0MC5hdmkgLWYgbGF2ZmkgLWkgY29sb3I9Z3JheSAtbGF2ZmkgdGhyZXNob2xkIG91dHB1dC5hdmkKK0BlbmQgZXhhbXBsZQorCitAaXRlbQorVGhyZXNob2xkIHRvIHplcm8sIHVzaW5nIGdyYXkgY29sb3IgYXMgdGhyZXNob2xkOgorQGV4YW1wbGUKK2ZmbXBlZyAtaSAzMjB4MjQwLmF2aSAtZiBsYXZmaSAtaSBjb2xvcj1ncmF5IC1mIGxhdmZpIC1pIGNvbG9yPXdoaXRlIC1pIDMyMHgyNDAuYXZpIC1sYXZmaSB0aHJlc2hvbGQgb3V0cHV0LmF2aQorQGVuZCBleGFtcGxlCisKK0BpdGVtCitJbnZlcnRlZCB0aHJlc2hvbGQgdG8gemVybywgdXNpbmcgZ3JheSBjb2xvciBhcyB0aHJlc2hvbGQ6CitAZXhhbXBsZQorZmZtcGVnIC1pIDMyMHgyNDAuYXZpIC1mIGxhdmZpIC1pIGNvbG9yPWdyYXkgLWkgMzIweDI0MC5hdmkgLWYgbGF2ZmkgLWkgY29sb3I9d2hpdGUgLWxhdmZpIHRocmVzaG9sZCBvdXRwdXQuYXZpCitAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQorCiBAc2VjdGlvbiB0aHVtYm5haWwKIFNlbGVjdCB0aGUgbW9zdCByZXByZXNlbnRhdGl2ZSBmcmFtZSBpbiBhIGdpdmVuIHNlcXVlbmNlIG9mIGNvbnNlY3V0aXZlIGZyYW1lcy4KIApAQCAtMTE3MzEsOCArMTUyMjgsMTcgQEAKIAogQGl0ZW0gY29sb3IKIFNwZWNpZnkgdGhlIGNvbG9yIG9mIHRoZSB1bnVzZWQgYXJlYS4gRm9yIHRoZSBzeW50YXggb2YgdGhpcyBvcHRpb24sIGNoZWNrIHRoZQotIkNvbG9yIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBAdmFye2NvbG9yfQotaXMgImJsYWNrIi4KK0ByZWZ7Y29sb3Igc3ludGF4LCwiQ29sb3IiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwsZmZtcGVnLXV0aWxzfS4KK1RoZSBkZWZhdWx0IHZhbHVlIG9mIEB2YXJ7Y29sb3J9IGlzICJibGFjayIuCisKK0BpdGVtIG92ZXJsYXAKK1NldCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBvdmVybGFwIHdoZW4gdGlsaW5nIHNldmVyYWwgc3VjY2Vzc2l2ZSBmcmFtZXMgdG9nZXRoZXIuCitUaGUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIEBjb2RlezB9IGFuZCBAdmFye25iX2ZyYW1lcyAtIDF9LgorCitAaXRlbSBpbml0X3BhZGRpbmcKK1NldCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBpbml0aWFsbHkgYmUgZW1wdHkgYmVmb3JlIGRpc3BsYXlpbmcgZmlyc3Qgb3V0cHV0IGZyYW1lLgorVGhpcyBjb250cm9scyBob3cgc29vbiB3aWxsIG9uZSBnZXQgZmlyc3Qgb3V0cHV0IGZyYW1lLgorVGhlIHZhbHVlIG11c3QgYmUgYmV0d2VlbiBAY29kZXswfSBhbmQgQHZhcntuYl9mcmFtZXMgLSAxfS4KIEBlbmQgdGFibGUKIAogQHN1YnNlY3Rpb24gRXhhbXBsZXMKQEAgLTExNzk4LDI4ICsxNTMwNCw3IEBACiAyMjIyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NDQ0CiBAZW5kIGV4YW1wbGUKIAotQGl0ZW0gZHJvcF9vZGQsIDEKLU9ubHkgb3V0cHV0IGV2ZW4gZnJhbWVzLCBvZGQgZnJhbWVzIGFyZSBkcm9wcGVkLCBnZW5lcmF0aW5nIGEgZnJhbWUgd2l0aAotdW5jaGFuZ2VkIGhlaWdodCBhdCBoYWxmIGZyYW1lIHJhdGUuCi0KLUBleGFtcGxlCi0gLS0tLS0tPiB0aW1lCi1JbnB1dDoKLUZyYW1lIDEgICAgICAgICBGcmFtZSAyICAgICAgICAgRnJhbWUgMyAgICAgICAgIEZyYW1lIDQKLQotMTExMTEgICAgICAgICAgIDIyMjIyICAgICAgICAgICAzMzMzMyAgICAgICAgICAgNDQ0NDQKLTExMTExICAgICAgICAgICAyMjIyMiAgICAgICAgICAgMzMzMzMgICAgICAgICAgIDQ0NDQ0Ci0xMTExMSAgICAgICAgICAgMjIyMjIgICAgICAgICAgIDMzMzMzICAgICAgICAgICA0NDQ0NAotMTExMTEgICAgICAgICAgIDIyMjIyICAgICAgICAgICAzMzMzMyAgICAgICAgICAgNDQ0NDQKLQotT3V0cHV0OgotICAgICAgICAgICAgICAgIDIyMjIyICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ0NDQKLSAgICAgICAgICAgICAgICAyMjIyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NDQ0Ci0gICAgICAgICAgICAgICAgMjIyMjIgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDQ0NAotICAgICAgICAgICAgICAgIDIyMjIyICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ0NDQKLUBlbmQgZXhhbXBsZQotCi1AaXRlbSBkcm9wX2V2ZW4sIDIKK0BpdGVtIGRyb3BfZXZlbiwgMQogT25seSBvdXRwdXQgb2RkIGZyYW1lcywgZXZlbiBmcmFtZXMgYXJlIGRyb3BwZWQsIGdlbmVyYXRpbmcgYSBmcmFtZSB3aXRoCiB1bmNoYW5nZWQgaGVpZ2h0IGF0IGhhbGYgZnJhbWUgcmF0ZS4KIApAQCAtMTE4NDAsNiArMTUzMjUsMjcgQEAKIDExMTExICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMzMzMKIEBlbmQgZXhhbXBsZQogCitAaXRlbSBkcm9wX29kZCwgMgorT25seSBvdXRwdXQgZXZlbiBmcmFtZXMsIG9kZCBmcmFtZXMgYXJlIGRyb3BwZWQsIGdlbmVyYXRpbmcgYSBmcmFtZSB3aXRoCit1bmNoYW5nZWQgaGVpZ2h0IGF0IGhhbGYgZnJhbWUgcmF0ZS4KKworQGV4YW1wbGUKKyAtLS0tLS0+IHRpbWUKK0lucHV0OgorRnJhbWUgMSAgICAgICAgIEZyYW1lIDIgICAgICAgICBGcmFtZSAzICAgICAgICAgRnJhbWUgNAorCisxMTExMSAgICAgICAgICAgMjIyMjIgICAgICAgICAgIDMzMzMzICAgICAgICAgICA0NDQ0NAorMTExMTEgICAgICAgICAgIDIyMjIyICAgICAgICAgICAzMzMzMyAgICAgICAgICAgNDQ0NDQKKzExMTExICAgICAgICAgICAyMjIyMiAgICAgICAgICAgMzMzMzMgICAgICAgICAgIDQ0NDQ0CisxMTExMSAgICAgICAgICAgMjIyMjIgICAgICAgICAgIDMzMzMzICAgICAgICAgICA0NDQ0NAorCitPdXRwdXQ6CisgICAgICAgICAgICAgICAgMjIyMjIgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDQ0NAorICAgICAgICAgICAgICAgIDIyMjIyICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ0NDQKKyAgICAgICAgICAgICAgICAyMjIyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NDQ0CisgICAgICAgICAgICAgICAgMjIyMjIgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDQ0NAorQGVuZCBleGFtcGxlCisKIEBpdGVtIHBhZCwgMwogRXhwYW5kIGVhY2ggZnJhbWUgdG8gZnVsbCBoZWlnaHQsIGJ1dCBwYWQgYWx0ZXJuYXRlIGxpbmVzIHdpdGggYmxhY2ssCiBnZW5lcmF0aW5nIGEgZnJhbWUgd2l0aCBkb3VibGUgaGVpZ2h0IGF0IHRoZSBzYW1lIGlucHV0IGZyYW1lIHJhdGUuCkBAIC0xMTkzNCw5ICsxNTQ0MCwxMSBAQAogIDExMTExICAgMTExMTEgICAyMjIyMiAgIDIyMjIyICAgMzMzMzMgICAzMzMzMyAgIDQ0NDQ0CiBAZW5kIGV4YW1wbGUKIAorCiBAaXRlbSBtZXJnZXgyLCA3CiBNb3ZlIG9kZCBmcmFtZXMgaW50byB0aGUgdXBwZXIgZmllbGQsIGV2ZW4gaW50byB0aGUgbG93ZXIgZmllbGQsCiBnZW5lcmF0aW5nIGEgZG91YmxlIGhlaWdodCBmcmFtZSBhdCBzYW1lIGZyYW1lIHJhdGUuCisKIEBleGFtcGxlCiAgLS0tLS0tPiB0aW1lCiBJbnB1dDoKQEAgLTExOTcyLDE2ICsxNTQ4MCwxMjkgQEAKIAogQHRhYmxlIEBvcHRpb24KIEBpdGVtIGxvd19wYXNzX2ZpbHRlciwgdmxmcAotRW5hYmxlIHZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlcmluZyBpbiB0aGUgZmlsdGVyLgorRW5hYmxlIGxpbmVhciB2ZXJ0aWNhbCBsb3ctcGFzcyBmaWx0ZXJpbmcgaW4gdGhlIGZpbHRlci4KIFZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlcmluZyBpcyByZXF1aXJlZCB3aGVuIGNyZWF0aW5nIGFuIGludGVybGFjZWQKIGRlc3RpbmF0aW9uIGZyb20gYSBwcm9ncmVzc2l2ZSBzb3VyY2Ugd2hpY2ggY29udGFpbnMgaGlnaC1mcmVxdWVuY3kKIHZlcnRpY2FsIGRldGFpbC4gRmlsdGVyaW5nIHdpbGwgcmVkdWNlIGludGVybGFjZSAndHdpdHRlcicgYW5kIE1vaXJlCiBwYXR0ZXJuaW5nLgogCitAaXRlbSBjb21wbGV4X2ZpbHRlciwgY3ZsZnAKK0VuYWJsZSBjb21wbGV4IHZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlcmluZy4KK1RoaXMgd2lsbCBzbGlnaHRseSBsZXNzIHJlZHVjZSBpbnRlcmxhY2UgJ3R3aXR0ZXInIGFuZCBNb2lyZQorcGF0dGVybmluZyBidXQgYmV0dGVyIHJldGFpbiBkZXRhaWwgYW5kIHN1YmplY3RpdmUgc2hhcnBuZXNzIGltcHJlc3Npb24uCisKK0BlbmQgdGFibGUKKwogVmVydGljYWwgbG93LXBhc3MgZmlsdGVyaW5nIGNhbiBvbmx5IGJlIGVuYWJsZWQgZm9yIEBvcHRpb257bW9kZX0KIEB2YXJ7aW50ZXJsZWF2ZV90b3B9IGFuZCBAdmFye2ludGVybGVhdmVfYm90dG9tfS4KIAogQGVuZCB0YWJsZQorCitAc2VjdGlvbiB0b25lbWFwCitUb25lIG1hcCBjb2xvcnMgZnJvbSBkaWZmZXJlbnQgZHluYW1pYyByYW5nZXMuCisKK1RoaXMgZmlsdGVyIGV4cGVjdHMgZGF0YSBpbiBzaW5nbGUgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50LCBhcyBpdCBuZWVkcyB0bworb3BlcmF0ZSBvbiAoYW5kIGNhbiBvdXRwdXQpIG91dC1vZi1yYW5nZSB2YWx1ZXMuIEFub3RoZXIgZmlsdGVyLCBzdWNoIGFzCitAcmVme3pzY2FsZX0sIGlzIG5lZWRlZCB0byBjb252ZXJ0IHRoZSByZXN1bHRpbmcgZnJhbWUgdG8gYSB1c2FibGUgZm9ybWF0LgorCitUaGUgdG9uZW1hcHBpbmcgYWxnb3JpdGhtcyBpbXBsZW1lbnRlZCBvbmx5IHdvcmsgb24gbGluZWFyIGxpZ2h0LCBzbyBpbnB1dAorZGF0YSBzaG91bGQgYmUgbGluZWFyaXplZCBiZWZvcmVoYW5kIChhbmQgcG9zc2libHkgY29ycmVjdGx5IHRhZ2dlZCkuCisKK0BleGFtcGxlCitmZm1wZWcgLWkgSU5QVVQgLXZmIHpzY2FsZT10cmFuc2Zlcj1saW5lYXIsdG9uZW1hcD1jbGlwLHpzY2FsZT10cmFuc2Zlcj1idDcwOSxmb3JtYXQ9eXV2NDIwcCBPVVRQVVQKK0BlbmQgZXhhbXBsZQorCitAc3Vic2VjdGlvbiBPcHRpb25zCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zLgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gdG9uZW1hcAorU2V0IHRoZSB0b25lIG1hcCBhbGdvcml0aG0gdG8gdXNlLgorCitQb3NzaWJsZSB2YWx1ZXMgYXJlOgorQHRhYmxlIEB2YXIKK0BpdGVtIG5vbmUKK0RvIG5vdCBhcHBseSBhbnkgdG9uZSBtYXAsIG9ubHkgZGVzYXR1cmF0ZSBvdmVyYnJpZ2h0IHBpeGVscy4KKworQGl0ZW0gY2xpcAorSGFyZC1jbGlwIGFueSBvdXQtb2YtcmFuZ2UgdmFsdWVzLiBVc2UgaXQgZm9yIHBlcmZlY3QgY29sb3IgYWNjdXJhY3kgZm9yCitpbi1yYW5nZSB2YWx1ZXMsIHdoaWxlIGRpc3RvcnRpbmcgb3V0LW9mLXJhbmdlIHZhbHVlcy4KKworQGl0ZW0gbGluZWFyCitTdHJldGNoIHRoZSBlbnRpcmUgcmVmZXJlbmNlIGdhbXV0IHRvIGEgbGluZWFyIG11bHRpcGxlIG9mIHRoZSBkaXNwbGF5LgorCitAaXRlbSBnYW1tYQorRml0IGEgbG9nYXJpdGhtaWMgdHJhbnNmZXIgYmV0d2VlbiB0aGUgdG9uZSBjdXJ2ZXMuCisKK0BpdGVtIHJlaW5oYXJkCitQcmVzZXJ2ZSBvdmVyYWxsIGltYWdlIGJyaWdodG5lc3Mgd2l0aCBhIHNpbXBsZSBjdXJ2ZSwgdXNpbmcgbm9ubGluZWFyCitjb250cmFzdCwgd2hpY2ggcmVzdWx0cyBpbiBmbGF0dGVuaW5nIGRldGFpbHMgYW5kIGRlZ3JhZGluZyBjb2xvciBhY2N1cmFjeS4KKworQGl0ZW0gaGFibGUKK1ByZXNlcnZlIGJvdGggZGFyayBhbmQgYnJpZ2h0IGRldGFpbHMgYmV0dGVyIHRoYW4gQHZhcntyZWluaGFyZH0sIGF0IHRoZSBjb3N0CitvZiBzbGlnaHRseSBkYXJrZW5pbmcgZXZlcnl0aGluZy4gVXNlIGl0IHdoZW4gZGV0YWlsIHByZXNlcnZhdGlvbiBpcyBtb3JlCitpbXBvcnRhbnQgdGhhbiBjb2xvciBhbmQgYnJpZ2h0bmVzcyBhY2N1cmFjeS4KKworQGl0ZW0gbW9iaXVzCitTbW9vdGhseSBtYXAgb3V0LW9mLXJhbmdlIHZhbHVlcywgd2hpbGUgcmV0YWluaW5nIGNvbnRyYXN0IGFuZCBjb2xvcnMgZm9yCitpbi1yYW5nZSBtYXRlcmlhbCBhcyBtdWNoIGFzIHBvc3NpYmxlLiBVc2UgaXQgd2hlbiBjb2xvciBhY2N1cmFjeSBpcyBtb3JlCitpbXBvcnRhbnQgdGhhbiBkZXRhaWwgcHJlc2VydmF0aW9uLgorQGVuZCB0YWJsZQorCitEZWZhdWx0IGlzIG5vbmUuCisKK0BpdGVtIHBhcmFtCitUdW5lIHRoZSB0b25lIG1hcHBpbmcgYWxnb3JpdGhtLgorCitUaGlzIGFmZmVjdHMgdGhlIGZvbGxvd2luZyBhbGdvcml0aG1zOgorQHRhYmxlIEB2YXIKK0BpdGVtIG5vbmUKK0lnbm9yZWQuCisKK0BpdGVtIGxpbmVhcgorU3BlY2lmaWVzIHRoZSBzY2FsZSBmYWN0b3IgdG8gdXNlIHdoaWxlIHN0cmV0Y2hpbmcuCitEZWZhdWx0IHRvIDEuMC4KKworQGl0ZW0gZ2FtbWEKK1NwZWNpZmllcyB0aGUgZXhwb25lbnQgb2YgdGhlIGZ1bmN0aW9uLgorRGVmYXVsdCB0byAxLjguCisKK0BpdGVtIGNsaXAKK1NwZWNpZnkgYW4gZXh0cmEgbGluZWFyIGNvZWZmaWNpZW50IHRvIG11bHRpcGx5IGludG8gdGhlIHNpZ25hbCBiZWZvcmUgY2xpcHBpbmcuCitEZWZhdWx0IHRvIDEuMC4KKworQGl0ZW0gcmVpbmhhcmQKK1NwZWNpZnkgdGhlIGxvY2FsIGNvbnRyYXN0IGNvZWZmaWNpZW50IGF0IHRoZSBkaXNwbGF5IHBlYWsuCitEZWZhdWx0IHRvIDAuNSwgd2hpY2ggbWVhbnMgdGhhdCBpbi1nYW11dCB2YWx1ZXMgd2lsbCBiZSBhYm91dCBoYWxmIGFzIGJyaWdodAorYXMgd2hlbiBjbGlwcGluZy4KKworQGl0ZW0gaGFibGUKK0lnbm9yZWQuCisKK0BpdGVtIG1vYml1cworU3BlY2lmeSB0aGUgdHJhbnNpdGlvbiBwb2ludCBmcm9tIGxpbmVhciB0byBtb2JpdXMgdHJhbnNmb3JtLiBFdmVyeSB2YWx1ZQorYmVsb3cgdGhpcyBwb2ludCBpcyBndWFyYW50ZWVkIHRvIGJlIG1hcHBlZCAxOjEuIFRoZSBoaWdoZXIgdGhlIHZhbHVlLCB0aGUKK21vcmUgYWNjdXJhdGUgdGhlIHJlc3VsdCB3aWxsIGJlLCBhdCB0aGUgY29zdCBvZiBsb3NpbmcgYnJpZ2h0IGRldGFpbHMuCitEZWZhdWx0IHRvIDAuMywgd2hpY2ggZHVlIHRvIHRoZSBzdGVlcCBpbml0aWFsIHNsb3BlIHN0aWxsIHByZXNlcnZlcyBpbi1yYW5nZQorY29sb3JzIGZhaXJseSBhY2N1cmF0ZWx5LgorQGVuZCB0YWJsZQorCitAaXRlbSBkZXNhdAorQXBwbHkgZGVzYXR1cmF0aW9uIGZvciBoaWdobGlnaHRzIHRoYXQgZXhjZWVkIHRoaXMgbGV2ZWwgb2YgYnJpZ2h0bmVzcy4gVGhlCitoaWdoZXIgdGhlIHBhcmFtZXRlciwgdGhlIG1vcmUgY29sb3IgaW5mb3JtYXRpb24gd2lsbCBiZSBwcmVzZXJ2ZWQuIFRoaXMKK3NldHRpbmcgaGVscHMgcHJldmVudCB1bm5hdHVyYWxseSBibG93bi1vdXQgY29sb3JzIGZvciBzdXBlci1oaWdobGlnaHRzLCBieQorKHNtb290aGx5KSB0dXJuaW5nIGludG8gd2hpdGUgaW5zdGVhZC4gVGhpcyBtYWtlcyBpbWFnZXMgZmVlbCBtb3JlIG5hdHVyYWwsCithdCB0aGUgY29zdCBvZiByZWR1Y2luZyBpbmZvcm1hdGlvbiBhYm91dCBvdXQtb2YtcmFuZ2UgY29sb3JzLgorCitUaGUgZGVmYXVsdCBvZiAyLjAgaXMgc29tZXdoYXQgY29uc2VydmF0aXZlIGFuZCB3aWxsIG1vc3RseSBqdXN0IGFwcGx5IHRvCitza2llcyBvciBkaXJlY3RseSBzdW5saXQgc3VyZmFjZXMuIEEgc2V0dGluZyBvZiAwLjAgZGlzYWJsZXMgdGhpcyBvcHRpb24uCisKK1RoaXMgb3B0aW9uIHdvcmtzIG9ubHkgaWYgdGhlIGlucHV0IGZyYW1lIGhhcyBhIHN1cHBvcnRlZCBjb2xvciB0YWcuCisKK0BpdGVtIHBlYWsKK092ZXJyaWRlIHNpZ25hbC9ub21pbmFsL3JlZmVyZW5jZSBwZWFrIHdpdGggdGhpcyB2YWx1ZS4gVXNlZnVsIHdoZW4gdGhlCitlbWJlZGRlZCBwZWFrIGluZm9ybWF0aW9uIGluIGRpc3BsYXkgbWV0YWRhdGEgaXMgbm90IHJlbGlhYmxlIG9yIHdoZW4gdG9uZQorbWFwcGluZyBmcm9tIGEgbG93ZXIgcmFuZ2UgdG8gYSBoaWdoZXIgcmFuZ2UuCiBAZW5kIHRhYmxlCiAKIEBzZWN0aW9uIHRyYW5zcG9zZQpAQCAtMTIxMzAsNiArMTU3NTEsMjggQEAKIAogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIHVucHJlbXVsdGlwbHkKK0FwcGx5IGFscGhhIHVucHJlbXVsdGlwbHkgZWZmZWN0IHRvIGlucHV0IHZpZGVvIHN0cmVhbSB1c2luZyBmaXJzdCBwbGFuZQorb2Ygc2Vjb25kIHN0cmVhbSBhcyBhbHBoYS4KKworQm90aCBzdHJlYW1zIG11c3QgaGF2ZSBzYW1lIGRpbWVuc2lvbnMgYW5kIHNhbWUgcGl4ZWwgZm9ybWF0LgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb246CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBwbGFuZXMKK1NldCB3aGljaCBwbGFuZXMgd2lsbCBiZSBwcm9jZXNzZWQsIHVucHJvY2Vzc2VkIHBsYW5lcyB3aWxsIGJlIGNvcGllZC4KK0J5IGRlZmF1bHQgdmFsdWUgMHhmLCBhbGwgcGxhbmVzIHdpbGwgYmUgcHJvY2Vzc2VkLgorCitJZiB0aGUgZm9ybWF0IGhhcyAxIG9yIDIgY29tcG9uZW50cywgdGhlbiBsdW1hIGlzIGJpdCAwLgorSWYgdGhlIGZvcm1hdCBoYXMgMyBvciA0IGNvbXBvbmVudHM6Citmb3IgUkdCIGZvcm1hdHMgYml0IDAgaXMgZ3JlZW4sIGJpdCAxIGlzIGJsdWUgYW5kIGJpdCAyIGlzIHJlZDsKK2ZvciBZVVYgZm9ybWF0cyBiaXQgMCBpcyBsdW1hLCBiaXQgMSBpcyBjaHJvbWEtVSBhbmQgYml0IDIgaXMgY2hyb21hLVYuCitJZiBwcmVzZW50LCB0aGUgYWxwaGEgY2hhbm5lbCBpcyBhbHdheXMgdGhlIGxhc3QgYml0LgorCitAaXRlbSBpbnBsYWNlCitEbyBub3QgcmVxdWlyZSAybmQgaW5wdXQgZm9yIHByb2Nlc3NpbmcsIGluc3RlYWQgdXNlIGFscGhhIHBsYW5lIGZyb20gaW5wdXQgc3RyZWFtLgorQGVuZCB0YWJsZQogCiBAYW5jaG9ye3Vuc2hhcnB9CiBAc2VjdGlvbiB1bnNoYXJwCkBAIC0xMjE0MSwxMSArMTU3ODQsMTEgQEAKIEB0YWJsZSBAb3B0aW9uCiBAaXRlbSBsdW1hX21zaXplX3gsIGx4CiBTZXQgdGhlIGx1bWEgbWF0cml4IGhvcml6b250YWwgc2l6ZS4gSXQgbXVzdCBiZSBhbiBvZGQgaW50ZWdlciBiZXR3ZWVuCi0zIGFuZCA2My4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNS4KKzMgYW5kIDIzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1LgogCiBAaXRlbSBsdW1hX21zaXplX3ksIGx5CiBTZXQgdGhlIGx1bWEgbWF0cml4IHZlcnRpY2FsIHNpemUuIEl0IG11c3QgYmUgYW4gb2RkIGludGVnZXIgYmV0d2VlbiAzCi1hbmQgNjMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuCithbmQgMjMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuCiAKIEBpdGVtIGx1bWFfYW1vdW50LCBsYQogU2V0IHRoZSBsdW1hIGVmZmVjdCBzdHJlbmd0aC4gSXQgbXVzdCBiZSBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgcmVhc29uYWJsZQpAQCAtMTIxNTgsMTEgKzE1ODAxLDExIEBACiAKIEBpdGVtIGNocm9tYV9tc2l6ZV94LCBjeAogU2V0IHRoZSBjaHJvbWEgbWF0cml4IGhvcml6b250YWwgc2l6ZS4gSXQgbXVzdCBiZSBhbiBvZGQgaW50ZWdlcgotYmV0d2VlbiAzIGFuZCA2My4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNS4KK2JldHdlZW4gMyBhbmQgMjMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuCiAKIEBpdGVtIGNocm9tYV9tc2l6ZV95LCBjeQogU2V0IHRoZSBjaHJvbWEgbWF0cml4IHZlcnRpY2FsIHNpemUuIEl0IG11c3QgYmUgYW4gb2RkIGludGVnZXIKLWJldHdlZW4gMyBhbmQgNjMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDUuCitiZXR3ZWVuIDMgYW5kIDIzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA1LgogCiBAaXRlbSBjaHJvbWFfYW1vdW50LCBjYQogU2V0IHRoZSBjaHJvbWEgZWZmZWN0IHN0cmVuZ3RoLiBJdCBtdXN0IGJlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCByZWFzb25hYmxlCkBAIC0xMjE3MywxMCArMTU4MTYsNiBAQAogCiBEZWZhdWx0IHZhbHVlIGlzIDAuMC4KIAotQGl0ZW0gb3BlbmNsCi1JZiBzZXQgdG8gMSwgc3BlY2lmeSB1c2luZyBPcGVuQ0wgY2FwYWJpbGl0aWVzLCBvbmx5IGF2YWlsYWJsZSBpZgotRkZtcGVnIHdhcyBjb25maWd1cmVkIHdpdGggQGNvZGV7LS1lbmFibGUtb3BlbmNsfS4gRGVmYXVsdCB2YWx1ZSBpcyAwLgotCiBAZW5kIHRhYmxlCiAKIEFsbCBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbCBhbmQgZGVmYXVsdCB0byB0aGUgZXF1aXZhbGVudCBvZiB0aGUKQEAgLTEyMjIzLDYgKzE1ODYyLDU1IEBACiBmcm9tIHRoZSB2aWRlbyBzdHJlYW0gKGlmIGF2YWlsYWJsZSkuCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIHZhZ3VlZGVub2lzZXIKKworQXBwbHkgYSB3YXZlbGV0IGJhc2VkIGRlbm9pc2VyLgorCitJdCB0cmFuc2Zvcm1zIGVhY2ggZnJhbWUgZnJvbSB0aGUgdmlkZW8gaW5wdXQgaW50byB0aGUgd2F2ZWxldCBkb21haW4sCit1c2luZyBDb2hlbi1EYXViZWNoaWVzLUZlYXV2ZWF1IDkvNy4gVGhlbiBpdCBhcHBsaWVzIHNvbWUgZmlsdGVyaW5nIHRvCit0aGUgb2J0YWluZWQgY29lZmZpY2llbnRzLiBJdCBkb2VzIGFuIGludmVyc2Ugd2F2ZWxldCB0cmFuc2Zvcm0gYWZ0ZXIuCitEdWUgdG8gd2F2ZWxldCBwcm9wZXJ0aWVzLCBpdCBzaG91bGQgZ2l2ZSBhIG5pY2Ugc21vb3RoZWQgcmVzdWx0LCBhbmQKK3JlZHVjZWQgbm9pc2UsIHdpdGhvdXQgYmx1cnJpbmcgcGljdHVyZSBmZWF0dXJlcy4KKworVGhpcyBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSB0aHJlc2hvbGQKK1RoZSBmaWx0ZXJpbmcgc3RyZW5ndGguIFRoZSBoaWdoZXIsIHRoZSBtb3JlIGZpbHRlcmVkIHRoZSB2aWRlbyB3aWxsIGJlLgorSGFyZCB0aHJlc2hvbGRpbmcgY2FuIHVzZSBhIGhpZ2hlciB0aHJlc2hvbGQgdGhhbiBzb2Z0IHRocmVzaG9sZGluZworYmVmb3JlIHRoZSB2aWRlbyBsb29rcyBvdmVyZmlsdGVyZWQuIERlZmF1bHQgdmFsdWUgaXMgMi4KKworQGl0ZW0gbWV0aG9kCitUaGUgZmlsdGVyaW5nIG1ldGhvZCB0aGUgZmlsdGVyIHdpbGwgdXNlLgorCitJdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorQHRhYmxlIEBzYW1wCitAaXRlbSBoYXJkCitBbGwgdmFsdWVzIHVuZGVyIHRoZSB0aHJlc2hvbGQgd2lsbCBiZSB6ZXJvZWQuCisKK0BpdGVtIHNvZnQKK0FsbCB2YWx1ZXMgdW5kZXIgdGhlIHRocmVzaG9sZCB3aWxsIGJlIHplcm9lZC4gQWxsIHZhbHVlcyBhYm92ZSB3aWxsIGJlCityZWR1Y2VkIGJ5IHRoZSB0aHJlc2hvbGQuCisKK0BpdGVtIGdhcnJvdGUKK1NjYWxlcyBvciBudWxsaWZpZXMgY29lZmZpY2llbnRzIC0gaW50ZXJtZWRpYXJ5IGJldHdlZW4gKG1vcmUpIHNvZnQgYW5kCisobGVzcykgaGFyZCB0aHJlc2hvbGRpbmcuCitAZW5kIHRhYmxlCisKK0RlZmF1bHQgaXMgZ2Fycm90ZS4KKworQGl0ZW0gbnN0ZXBzCitOdW1iZXIgb2YgdGltZXMsIHRoZSB3YXZlbGV0IHdpbGwgZGVjb21wb3NlIHRoZSBwaWN0dXJlLiBQaWN0dXJlIGNhbid0CitiZSBkZWNvbXBvc2VkIGJleW9uZCBhIHBhcnRpY3VsYXIgcG9pbnQgKHR5cGljYWxseSwgOCBmb3IgYSA2NDB4NDgwCitmcmFtZSAtIGFzIDJeOSA9IDUxMiA+IDQ4MCkuIFZhbGlkIHZhbHVlcyBhcmUgaW50ZWdlcnMgYmV0d2VlbiAxIGFuZCAzMi4gRGVmYXVsdCB2YWx1ZSBpcyA2LgorCitAaXRlbSBwZXJjZW50CitQYXJ0aWFsIG9mIGZ1bGwgZGVub2lzaW5nIChsaW1pdGVkIGNvZWZmaWNpZW50cyBzaHJpbmtpbmcpLCBmcm9tIDAgdG8gMTAwLiBEZWZhdWx0IHZhbHVlIGlzIDg1LgorCitAaXRlbSBwbGFuZXMKK0EgbGlzdCBvZiB0aGUgcGxhbmVzIHRvIHByb2Nlc3MuIEJ5IGRlZmF1bHQgYWxsIHBsYW5lcyBhcmUgcHJvY2Vzc2VkLgorQGVuZCB0YWJsZQorCiBAc2VjdGlvbiB2ZWN0b3JzY29wZQogCiBEaXNwbGF5IDIgY29sb3IgY29tcG9uZW50IHZhbHVlcyBpbiB0aGUgdHdvIGRpbWVuc2lvbmFsIGdyYXBoICh3aGljaCBpcyBjYWxsZWQKQEAgLTEyMjQzLDcgKzE1OTMxLDcgQEAKIEBpdGVtIGNvbG9yCiBHcmF5IHZhbHVlcyBhcmUgZGlzcGxheWVkIG9uIGdyYXBoLiBTdXJyb3VuZGluZyBwaXhlbHMgdmFsdWVzIHdoaWNoIGFyZSBub3QKIHByZXNlbnQgaW4gdmlkZW8gZnJhbWUgYXJlIGRyYXduIGluIGdyYWRpZW50IG9mIDIgY29sb3IgY29tcG9uZW50cyB3aGljaCBhcmUKLXNldCBieSBvcHRpb24gQGNvZGV7eH0gYW5kIEBjb2Rle3l9Lgorc2V0IGJ5IG9wdGlvbiBAY29kZXt4fSBhbmQgQGNvZGV7eX0uIFRoZSAzcmQgY29sb3IgY29tcG9uZW50IGlzIHN0YXRpYy4KIAogQGl0ZW0gY29sb3IyCiBBY3R1YWwgY29sb3IgY29tcG9uZW50cyB2YWx1ZXMgcHJlc2VudCBpbiB2aWRlbyBmcmFtZSBhcmUgZGlzcGxheWVkIG9uIGdyYXBoLgpAQCAtMTIyNTcsNiArMTU5NDUsMTAgQEAKIEFjdHVhbCBjb2xvcnMgcHJlc2VudCBpbiB2aWRlbyBmcmFtZSBhcmUgZGlzcGxheWVkIG9uIGdyYXBoLiBJZiB0d28gZGlmZmVyZW50CiBjb2xvcnMgbWFwIHRvIHNhbWUgcG9zaXRpb24gb24gZ3JhcGggdGhlbiBjb2xvciB3aXRoIGhpZ2hlciB2YWx1ZSBvZiBjb21wb25lbnQKIG5vdCBwcmVzZW50IGluIGdyYXBoIGlzIHBpY2tlZC4KKworQGl0ZW0gY29sb3I1CitHcmF5IHZhbHVlcyBhcmUgZGlzcGxheWVkIG9uIGdyYXBoLiBTaW1pbGFyIHRvIEBjb2Rle2NvbG9yfSBidXQgd2l0aCAzcmQgY29sb3IKK2NvbXBvbmVudCBwaWNrZWQgZnJvbSByYWRpYWwgZ3JhZGllbnQuCiBAZW5kIHRhYmxlCiAKIEBpdGVtIHgKQEAgLTEyMjY2LDcgKzE1OTU4LDcgQEAKIFNldCB3aGljaCBjb2xvciBjb21wb25lbnQgd2lsbCBiZSByZXByZXNlbnRlZCBvbiBZLWF4aXMuIERlZmF1bHQgaXMgQGNvZGV7Mn0uCiAKIEBpdGVtIGludGVuc2l0eSwgaQotU2V0IGludGVuc2l0eSwgdXNlZCBieSBtb2RlczogZ3JheSwgY29sb3IgYW5kIGNvbG9yMyBmb3IgaW5jcmVhc2luZyBicmlnaHRuZXNzCitTZXQgaW50ZW5zaXR5LCB1c2VkIGJ5IG1vZGVzOiBncmF5LCBjb2xvciwgY29sb3IzIGFuZCBjb2xvcjUgZm9yIGluY3JlYXNpbmcgYnJpZ2h0bmVzcwogb2YgY29sb3IgY29tcG9uZW50IHdoaWNoIHJlcHJlc2VudHMgZnJlcXVlbmN5IG9mIChYLCBZKSBsb2NhdGlvbiBpbiBncmFwaC4KIAogQGl0ZW0gZW52ZWxvcGUsIGUKQEAgLTEyMjg0LDYgKzE1OTc2LDU3IEBACiBAaXRlbSBwZWFrK2luc3RhbnQKIFBlYWsgYW5kIGluc3RhbnQgZW52ZWxvcGUgY29tYmluZWQgdG9nZXRoZXIuCiBAZW5kIHRhYmxlCisKK0BpdGVtIGdyYXRpY3VsZSwgZworU2V0IHdoYXQga2luZCBvZiBncmF0aWN1bGUgdG8gZHJhdy4KK0B0YWJsZSBAc2FtcAorQGl0ZW0gbm9uZQorQGl0ZW0gZ3JlZW4KK0BpdGVtIGNvbG9yCitAZW5kIHRhYmxlCisKK0BpdGVtIG9wYWNpdHksIG8KK1NldCBncmF0aWN1bGUgb3BhY2l0eS4KKworQGl0ZW0gZmxhZ3MsIGYKK1NldCBncmF0aWN1bGUgZmxhZ3MuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gd2hpdGUKK0RyYXcgZ3JhdGljdWxlIGZvciB3aGl0ZSBwb2ludC4KKworQGl0ZW0gYmxhY2sKK0RyYXcgZ3JhdGljdWxlIGZvciBibGFjayBwb2ludC4KKworQGl0ZW0gbmFtZQorRHJhdyBjb2xvciBwb2ludHMgc2hvcnQgbmFtZXMuCitAZW5kIHRhYmxlCisKK0BpdGVtIGJnb3BhY2l0eSwgYgorU2V0IGJhY2tncm91bmQgb3BhY2l0eS4KKworQGl0ZW0gbHRocmVzaG9sZCwgbAorU2V0IGxvdyB0aHJlc2hvbGQgZm9yIGNvbG9yIGNvbXBvbmVudCBub3QgcmVwcmVzZW50ZWQgb24gWCBvciBZIGF4aXMuCitWYWx1ZXMgbG93ZXIgdGhhbiB0aGlzIHZhbHVlIHdpbGwgYmUgaWdub3JlZC4gRGVmYXVsdCBpcyAwLgorTm90ZSB0aGlzIHZhbHVlIGlzIG11bHRpcGxpZWQgd2l0aCBhY3R1YWwgbWF4IHBvc3NpYmxlIHZhbHVlIG9uZSBwaXhlbCBjb21wb25lbnQKK2NhbiBoYXZlLiBTbyBmb3IgOC1iaXQgaW5wdXQgYW5kIGxvdyB0aHJlc2hvbGQgdmFsdWUgb2YgMC4xIGFjdHVhbCB0aHJlc2hvbGQKK2lzIDAuMSAqIDI1NSA9IDI1LgorCitAaXRlbSBodGhyZXNob2xkLCBoCitTZXQgaGlnaCB0aHJlc2hvbGQgZm9yIGNvbG9yIGNvbXBvbmVudCBub3QgcmVwcmVzZW50ZWQgb24gWCBvciBZIGF4aXMuCitWYWx1ZXMgaGlnaGVyIHRoYW4gdGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuIERlZmF1bHQgaXMgMS4KK05vdGUgdGhpcyB2YWx1ZSBpcyBtdWx0aXBsaWVkIHdpdGggYWN0dWFsIG1heCBwb3NzaWJsZSB2YWx1ZSBvbmUgcGl4ZWwgY29tcG9uZW50CitjYW4gaGF2ZS4gU28gZm9yIDgtYml0IGlucHV0IGFuZCBoaWdoIHRocmVzaG9sZCB2YWx1ZSBvZiAwLjkgYWN0dWFsIHRocmVzaG9sZAoraXMgMC45ICogMjU1ID0gMjMwLgorCitAaXRlbSBjb2xvcnNwYWNlLCBjCitTZXQgd2hhdCBraW5kIG9mIGNvbG9yc3BhY2UgdG8gdXNlIHdoZW4gZHJhd2luZyBncmF0aWN1bGUuCitAdGFibGUgQHNhbXAKK0BpdGVtIGF1dG8KK0BpdGVtIDYwMQorQGl0ZW0gNzA5CitAZW5kIHRhYmxlCitEZWZhdWx0IGlzIGF1dG8uCiBAZW5kIHRhYmxlCiAKIEBhbmNob3J7dmlkc3RhYmRldGVjdH0KQEAgLTEyNTI4LDYgKzE2MjcxLDE3IEBACiBmZm1wZWcgLWkgaW4uYXZpIC12ZiAidmZsaXAiIG91dC5hdmkKIEBlbmQgZXhhbXBsZQogCitAc2VjdGlvbiB2ZnJkZXQKKworRGV0ZWN0IHZhcmlhYmxlIGZyYW1lIHJhdGUgdmlkZW8uCisKK1RoaXMgZmlsdGVyIHRyaWVzIHRvIGRldGVjdCBpZiB0aGUgaW5wdXQgaXMgdmFyaWFibGUgb3IgY29uc3RhbnQgZnJhbWUgcmF0ZS4KKworQXQgZW5kIGl0IHdpbGwgb3V0cHV0IG51bWJlciBvZiBmcmFtZXMgZGV0ZWN0ZWQgYXMgaGF2aW5nIHZhcmlhYmxlIGRlbHRhIHB0cywKK2FuZCBvbmVzIHdpdGggY29uc3RhbnQgZGVsdGEgcHRzLgorSWYgdGhlcmUgd2FzIGZyYW1lcyB3aXRoIHZhcmlhYmxlIGRlbHRhLCB0aGFuIGl0IHdpbGwgYWxzbyBzaG93IG1pbiBhbmQgbWF4IGRlbHRhCitlbmNvdW50ZXJlZC4KKwogQGFuY2hvcnt2aWduZXR0ZX0KIEBzZWN0aW9uIHZpZ25ldHRlCiAKQEAgLTEyNjM5LDYgKzE2MzkzLDIwIEBACiAKIEBlbmQgaXRlbWl6ZQogCitAc2VjdGlvbiB2bWFmbW90aW9uCisKK09idGFpbiB0aGUgYXZlcmFnZSB2bWFmIG1vdGlvbiBzY29yZSBvZiBhIHZpZGVvLgorSXQgaXMgb25lIG9mIHRoZSBjb21wb25lbnQgZmlsdGVycyBvZiBWTUFGLgorCitUaGUgb2J0YWluZWQgYXZlcmFnZSBtb3Rpb24gc2NvcmUgaXMgcHJpbnRlZCB0aHJvdWdoIHRoZSBsb2dnaW5nIHN5c3RlbS4KKworSW4gdGhlIGJlbG93IGV4YW1wbGUgdGhlIGlucHV0IGZpbGUgQGZpbGV7cmVmLm1wZ30gaXMgYmVpbmcgcHJvY2Vzc2VkIGFuZCBzY29yZQoraXMgY29tcHV0ZWQuCisKK0BleGFtcGxlCitmZm1wZWcgLWkgcmVmLm1wZyAtbGF2Zmkgdm1hZm1vdGlvbiAtZiBudWxsIC0KK0BlbmQgZXhhbXBsZQorCiBAc2VjdGlvbiB2c3RhY2sKIFN0YWNrIGlucHV0IHZpZGVvcyB2ZXJ0aWNhbGx5LgogCkBAIC0xMjczNywxMCArMTY1MDUsMTQgQEAKIGluIG92ZXJsYXBwaW5nIGFyZWFzIG9mIHRoZSBjb2xvciBjb21wb25lbnRzIHRoYXQgYXJlIHN1cHBvc2VkIHRvIGJlIGlkZW50aWNhbCwKIHN1Y2ggYXMgbmV1dHJhbCB3aGl0ZXMsIGdyYXlzLCBvciBibGFja3MuCiAKLUBpdGVtIHBhcmFkZQorQGl0ZW0gc3RhY2sKIERpc3BsYXkgc2VwYXJhdGUgZ3JhcGggZm9yIHRoZSBjb2xvciBjb21wb25lbnRzIHNpZGUgYnkgc2lkZSBpbgogQGNvZGV7cm93fSBtb2RlIG9yIG9uZSBiZWxvdyB0aGUgb3RoZXIgaW4gQGNvZGV7Y29sdW1ufSBtb2RlLgogCitAaXRlbSBwYXJhZGUKK0Rpc3BsYXkgc2VwYXJhdGUgZ3JhcGggZm9yIHRoZSBjb2xvciBjb21wb25lbnRzIHNpZGUgYnkgc2lkZSBpbgorQGNvZGV7Y29sdW1ufSBtb2RlIG9yIG9uZSBiZWxvdyB0aGUgb3RoZXIgaW4gQGNvZGV7cm93fSBtb2RlLgorCiBVc2luZyB0aGlzIGRpc3BsYXkgbW9kZSBtYWtlcyBpdCBlYXN5IHRvIHNwb3QgY29sb3IgY2FzdHMgaW4gdGhlIGhpZ2hsaWdodHMKIGFuZCBzaGFkb3dzIG9mIGFuIGltYWdlLCBieSBjb21wYXJpbmcgdGhlIGNvbnRvdXJzIG9mIHRoZSB0b3AgYW5kIHRoZSBib3R0b20KIGdyYXBocyBvZiBlYWNoIHdhdmVmb3JtLiBTaW5jZSB3aGl0ZXMsIGdyYXlzLCBhbmQgYmxhY2tzIGFyZSBjaGFyYWN0ZXJpemVkCkBAIC0xMjc0OCw3ICsxNjUyMCw3IEBACiBzaG91bGQgZGlzcGxheSB0aHJlZSB3YXZlZm9ybXMgb2Ygcm91Z2hseSBlcXVhbCB3aWR0aC9oZWlnaHQuIElmIG5vdCwgdGhlCiBjb3JyZWN0aW9uIGlzIGVhc3kgdG8gcGVyZm9ybSBieSBtYWtpbmcgbGV2ZWwgYWRqdXN0bWVudHMgdGhlIHRocmVlIHdhdmVmb3Jtcy4KIEBlbmQgdGFibGUKLURlZmF1bHQgaXMgQGNvZGV7cGFyYWRlfS4KK0RlZmF1bHQgaXMgQGNvZGV7c3RhY2t9LgogCiBAaXRlbSBjb21wb25lbnRzLCBjCiBTZXQgd2hpY2ggY29sb3IgY29tcG9uZW50cyB0byBkaXNwbGF5LiBEZWZhdWx0IGlzIDEsIHdoaWNoIG1lYW5zIG9ubHkgbHVtaW5hbmNlCkBAIC0xMjc4MywxNyArMTY1NTUsOTUgQEAKIEBpdGVtIGFmbGF0CiBTaW1pbGFyIGFzIGFib3ZlLCBidXQgc2hvd3MgZGlmZmVyZW5jZSBiZXR3ZWVuIGJsdWUgYW5kIHJlZCBjaHJvbWEuCiAKK0BpdGVtIHhmbGF0CitTaW1pbGFyIGFzIGFib3ZlLCBidXQgdXNlIGRpZmZlcmVudCBjb2xvcnMuCisKIEBpdGVtIGNocm9tYQogRGlzcGxheXMgb25seSBjaHJvbWEuCiAKLUBpdGVtIGFjaHJvbWEKLVNpbWlsYXIgYXMgYWJvdmUsIGJ1dCBzaG93cyBkaWZmZXJlbmNlIGJldHdlZW4gYmx1ZSBhbmQgcmVkIGNocm9tYS4KLQogQGl0ZW0gY29sb3IKIERpc3BsYXlzIGFjdHVhbCBjb2xvciB2YWx1ZSBvbiB3YXZlZm9ybS4KKworQGl0ZW0gYWNvbG9yCitTaW1pbGFyIGFzIGFib3ZlLCBidXQgd2l0aCBsdW1hIHNob3dpbmcgZnJlcXVlbmN5IG9mIGNocm9tYSB2YWx1ZXMuCitAZW5kIHRhYmxlCisKK0BpdGVtIGdyYXRpY3VsZSwgZworU2V0IHdoaWNoIGdyYXRpY3VsZSB0byBkaXNwbGF5LgorCitAdGFibGUgQHNhbXAKK0BpdGVtIG5vbmUKK0RvIG5vdCBkaXNwbGF5IGdyYXRpY3VsZS4KKworQGl0ZW0gZ3JlZW4KK0Rpc3BsYXkgZ3JlZW4gZ3JhdGljdWxlIHNob3dpbmcgbGVnYWwgYnJvYWRjYXN0IHJhbmdlcy4KKworQGl0ZW0gb3JhbmdlCitEaXNwbGF5IG9yYW5nZSBncmF0aWN1bGUgc2hvd2luZyBsZWdhbCBicm9hZGNhc3QgcmFuZ2VzLgorQGVuZCB0YWJsZQorCitAaXRlbSBvcGFjaXR5LCBvCitTZXQgZ3JhdGljdWxlIG9wYWNpdHkuCisKK0BpdGVtIGZsYWdzLCBmbAorU2V0IGdyYXRpY3VsZSBmbGFncy4KKworQHRhYmxlIEBzYW1wCitAaXRlbSBudW1iZXJzCitEcmF3IG51bWJlcnMgYWJvdmUgbGluZXMuIEJ5IGRlZmF1bHQgZW5hYmxlZC4KKworQGl0ZW0gZG90cworRHJhdyBkb3RzIGluc3RlYWQgb2YgbGluZXMuCitAZW5kIHRhYmxlCisKK0BpdGVtIHNjYWxlLCBzCitTZXQgc2NhbGUgdXNlZCBmb3IgZGlzcGxheWluZyBncmF0aWN1bGUuCisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gZGlnaXRhbAorQGl0ZW0gbWlsbGl2b2x0cworQGl0ZW0gaXJlCitAZW5kIHRhYmxlCitEZWZhdWx0IGlzIGRpZ2l0YWwuCisKK0BpdGVtIGJnb3BhY2l0eSwgYgorU2V0IGJhY2tncm91bmQgb3BhY2l0eS4KK0BlbmQgdGFibGUKKworQHNlY3Rpb24gd2VhdmUsIGRvdWJsZXdlYXZlCisKK1RoZSBAY29kZXt3ZWF2ZX0gdGFrZXMgYSBmaWVsZC1iYXNlZCB2aWRlbyBpbnB1dCBhbmQgam9pbgorZWFjaCB0d28gc2VxdWVudGlhbCBmaWVsZHMgaW50byBzaW5nbGUgZnJhbWUsIHByb2R1Y2luZyBhIG5ldyBkb3VibGUKK2hlaWdodCBjbGlwIHdpdGggaGFsZiB0aGUgZnJhbWUgcmF0ZSBhbmQgaGFsZiB0aGUgZnJhbWUgY291bnQuCisKK1RoZSBAY29kZXtkb3VibGV3ZWF2ZX0gd29ya3Mgc2FtZSBhcyBAY29kZXt3ZWF2ZX0gYnV0IHdpdGhvdXQKK2hhbHZpbmcgZnJhbWUgcmF0ZSBhbmQgZnJhbWUgY291bnQuCisKK0l0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb246CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBmaXJzdF9maWVsZAorU2V0IGZpcnN0IGZpZWxkLiBBdmFpbGFibGUgdmFsdWVzIGFyZToKKworQHRhYmxlIEBzYW1wCitAaXRlbSB0b3AsIHQKK1NldCB0aGUgZnJhbWUgYXMgdG9wLWZpZWxkLWZpcnN0LgorCitAaXRlbSBib3R0b20sIGIKK1NldCB0aGUgZnJhbWUgYXMgYm90dG9tLWZpZWxkLWZpcnN0LgogQGVuZCB0YWJsZQogQGVuZCB0YWJsZQogCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitAaXRlbWl6ZQorQGl0ZW0KK0ludGVybGFjZSB2aWRlbyB1c2luZyBAcmVme3NlbGVjdH0gYW5kIEByZWZ7c2VwYXJhdGVmaWVsZHN9IGZpbHRlcjoKK0BleGFtcGxlCitzZXBhcmF0ZWZpZWxkcyxzZWxlY3Q9ZXEobW9kKG4sNCksMCkrZXEobW9kKG4sNCksMyksd2VhdmUKK0BlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCisKIEBzZWN0aW9uIHhicgogQXBwbHkgdGhlIHhCUiBoaWdoLXF1YWxpdHkgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgd2hpY2ggaXMgZGVzaWduZWQgZm9yIHBpeGVsCiBhcnQuIEl0IGZvbGxvd3MgYSBzZXQgb2YgZWRnZS1kZXRlY3Rpb24gcnVsZXMsIHNlZQpAQCAtMTI5NjEsOCArMTY4MTEsMTUgQEAKIEBleGFtcGxlCiB6b29tcGFuPXo9J21pbih6b29tKzAuMDAxNSwxLjUpJzpkPTcwMDp4PSdpdy8yLShpdy96b29tLzIpJzp5PSdpaC8yLShpaC96b29tLzIpJwogQGVuZCBleGFtcGxlCisKK0BpdGVtCitTYW1lIGFzIGFib3ZlIGJ1dCB3aXRob3V0IHBhdXNpbmc6CitAZXhhbXBsZQorem9vbXBhbj16PSdtaW4obWF4KHpvb20scHpvb20pKzAuMDAxNSwxLjUpJzpkPTE6eD0naXcvMi0oaXcvem9vbS8yKSc6eT0naWgvMi0oaWgvem9vbS8yKScKK0BlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BhbmNob3J7enNjYWxlfQogQHNlY3Rpb24genNjYWxlCiBTY2FsZSAocmVzaXplKSB0aGUgaW5wdXQgdmlkZW8sIHVzaW5nIHRoZSB6LmxpYiBsaWJyYXJ5OgogaHR0cHM6Ly9naXRodWIuY29tL3Nla3JpdC10d2MvemltZy4KQEAgLTEyOTgzLDE4ICsxNjg0MCwxOCBAQAogU2V0IHRoZSBvdXRwdXQgdmlkZW8gZGltZW5zaW9uIGV4cHJlc3Npb24uIERlZmF1bHQgdmFsdWUgaXMgdGhlIGlucHV0CiBkaW1lbnNpb24uCiAKLUlmIHRoZSBAdmFye3dpZHRofSBvciBAdmFye3d9IGlzIDAsIHRoZSBpbnB1dCB3aWR0aCBpcyB1c2VkIGZvciB0aGUgb3V0cHV0LgotSWYgdGhlIEB2YXJ7aGVpZ2h0fSBvciBAdmFye2h9IGlzIDAsIHRoZSBpbnB1dCBoZWlnaHQgaXMgdXNlZCBmb3IgdGhlIG91dHB1dC4KK0lmIHRoZSBAdmFye3dpZHRofSBvciBAdmFye3d9IHZhbHVlIGlzIDAsIHRoZSBpbnB1dCB3aWR0aCBpcyB1c2VkIGZvcgordGhlIG91dHB1dC4gSWYgdGhlIEB2YXJ7aGVpZ2h0fSBvciBAdmFye2h9IHZhbHVlIGlzIDAsIHRoZSBpbnB1dCBoZWlnaHQKK2lzIHVzZWQgZm9yIHRoZSBvdXRwdXQuCiAKLUlmIG9uZSBvZiB0aGUgdmFsdWVzIGlzIC0xLCB0aGUgenNjYWxlIGZpbHRlciB3aWxsIHVzZSBhIHZhbHVlIHRoYXQKLW1haW50YWlucyB0aGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBpbnB1dCBpbWFnZSwgY2FsY3VsYXRlZCBmcm9tIHRoZQotb3RoZXIgc3BlY2lmaWVkIGRpbWVuc2lvbi4gSWYgYm90aCBvZiB0aGVtIGFyZSAtMSwgdGhlIGlucHV0IHNpemUgaXMKLXVzZWQKK0lmIG9uZSBhbmQgb25seSBvbmUgb2YgdGhlIHZhbHVlcyBpcyAtbiB3aXRoIG4gPj0gMSwgdGhlIHpzY2FsZSBmaWx0ZXIKK3dpbGwgdXNlIGEgdmFsdWUgdGhhdCBtYWludGFpbnMgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgaW5wdXQgaW1hZ2UsCitjYWxjdWxhdGVkIGZyb20gdGhlIG90aGVyIHNwZWNpZmllZCBkaW1lbnNpb24uIEFmdGVyIHRoYXQgaXQgd2lsbCwKK2hvd2V2ZXIsIG1ha2Ugc3VyZSB0aGF0IHRoZSBjYWxjdWxhdGVkIGRpbWVuc2lvbiBpcyBkaXZpc2libGUgYnkgbiBhbmQKK2FkanVzdCB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgogCi1JZiBvbmUgb2YgdGhlIHZhbHVlcyBpcyAtbiB3aXRoIG4gPiAxLCB0aGUgenNjYWxlIGZpbHRlciB3aWxsIGFsc28gdXNlIGEgdmFsdWUKLXRoYXQgbWFpbnRhaW5zIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGlucHV0IGltYWdlLCBjYWxjdWxhdGVkIGZyb20gdGhlIG90aGVyCi1zcGVjaWZpZWQgZGltZW5zaW9uLiBBZnRlciB0aGF0IGl0IHdpbGwsIGhvd2V2ZXIsIG1ha2Ugc3VyZSB0aGF0IHRoZSBjYWxjdWxhdGVkCi1kaW1lbnNpb24gaXMgZGl2aXNpYmxlIGJ5IG4gYW5kIGFkanVzdCB0aGUgdmFsdWUgaWYgbmVjZXNzYXJ5LgorSWYgYm90aCB2YWx1ZXMgYXJlIC1uIHdpdGggbiA+PSAxLCB0aGUgYmVoYXZpb3Igd2lsbCBiZSBpZGVudGljYWwgdG8KK2JvdGggdmFsdWVzIGJlaW5nIHNldCB0byAwIGFzIHByZXZpb3VzbHkgZGV0YWlsZWQuCiAKIFNlZSBiZWxvdyBmb3IgdGhlIGxpc3Qgb2YgYWNjZXB0ZWQgY29uc3RhbnRzIGZvciB1c2UgaW4gdGhlIGRpbWVuc2lvbgogZXhwcmVzc2lvbi4KQEAgLTEzMDcwLDYgKzE2OTI3LDkgQEAKIEBpdGVtIGxpbmVhcgogQGl0ZW0gMjAyMF8xMAogQGl0ZW0gMjAyMF8xMgorQGl0ZW0gc21wdGUyMDg0CitAaXRlbSBpZWM2MTk2Ni0yLTEKK0BpdGVtIGFyaWItc3RkLWI2NwogQGVuZCB0YWJsZQogCiBEZWZhdWx0IGlzIHNhbWUgYXMgaW5wdXQuCkBAIC0xMzE0Niw2ICsxNzAwNiwzNyBAQAogQGl0ZW0gMjAyMF9uY2wKIEBpdGVtIDIwMjBfY2wKIEBlbmQgdGFibGUKKworQGl0ZW0gY2hyb21hbCwgYworU2V0IHRoZSBvdXRwdXQgY2hyb21hIGxvY2F0aW9uLgorCitQb3NzaWJsZSB2YWx1ZXMgYXJlOgorQHRhYmxlIEB2YXIKK0BpdGVtIGlucHV0CitAaXRlbSBsZWZ0CitAaXRlbSBjZW50ZXIKK0BpdGVtIHRvcGxlZnQKK0BpdGVtIHRvcAorQGl0ZW0gYm90dG9tbGVmdAorQGl0ZW0gYm90dG9tCitAZW5kIHRhYmxlCisKK0BpdGVtIGNocm9tYWxpbiwgY2luCitTZXQgdGhlIGlucHV0IGNocm9tYSBsb2NhdGlvbi4KKworUG9zc2libGUgdmFsdWVzIGFyZToKK0B0YWJsZSBAdmFyCitAaXRlbSBpbnB1dAorQGl0ZW0gbGVmdAorQGl0ZW0gY2VudGVyCitAaXRlbSB0b3BsZWZ0CitAaXRlbSB0b3AKK0BpdGVtIGJvdHRvbWxlZnQKK0BpdGVtIGJvdHRvbQorQGVuZCB0YWJsZQorCitAaXRlbSBucGwKK1NldCB0aGUgbm9taW5hbCBwZWFrIGx1bWluYW5jZS4KIEBlbmQgdGFibGUKIAogVGhlIHZhbHVlcyBvZiB0aGUgQG9wdGlvbnt3fSBhbmQgQG9wdGlvbntofSBvcHRpb25zIGFyZSBleHByZXNzaW9ucwpAQCAtMTMyMzgsNiArMTcxMjksMTAgQEAKIFNwZWNpZnkgdGhlIG9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBmb3IgdGhlIHNjYWxlIGZpbHRlciB3aGljaAogaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCB3aGVuIGFuIGlucHV0IGNoYW5nZSBpcyBkZXRlY3RlZCBpbiB0aGUKIGlucHV0IHNpemUgb3IgZm9ybWF0LgorCitAaXRlbSBod19mcmFtZXNfY3R4CitXaGVuIHVzaW5nIGEgaGFyZHdhcmUgcGl4ZWwgZm9ybWF0LCB0aGlzIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhbgorQVZIV0ZyYW1lc0NvbnRleHQgZGVzY3JpYmluZyBpbnB1dCBmcmFtZXMuCiBAZW5kIHRhYmxlCiAKIEZvciBleGFtcGxlOgpAQCAtMTMyNjUsNyArMTcxNjAsNyBAQAogQ3JlYXRlIGEgcGF0dGVybiBnZW5lcmF0ZWQgYnkgYW4gZWxlbWVudGFyeSBjZWxsdWxhciBhdXRvbWF0b24uCiAKIFRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBjZWxsdWxhciBhdXRvbWF0b24gY2FuIGJlIGRlZmluZWQgdGhyb3VnaCB0aGUKLUBvcHRpb257ZmlsZW5hbWV9LCBhbmQgQG9wdGlvbntwYXR0ZXJufSBvcHRpb25zLiBJZiBzdWNoIG9wdGlvbnMgYXJlCitAb3B0aW9ue2ZpbGVuYW1lfSBhbmQgQG9wdGlvbntwYXR0ZXJufSBvcHRpb25zLiBJZiBzdWNoIG9wdGlvbnMgYXJlCiBub3Qgc3BlY2lmaWVkIGFuIGluaXRpYWwgc3RhdGUgaXMgY3JlYXRlZCByYW5kb21seS4KIAogQXQgZWFjaCBuZXcgZnJhbWUgYSBuZXcgcm93IGluIHRoZSB2aWRlbyBpcyBmaWxsZWQgd2l0aCB0aGUgcmVzdWx0IG9mCkBAIC0xMzM3NCw2ICsxNzI2OSw2NyBAQAogCiBAZW5kIGl0ZW1pemUKIAorQGFuY2hvcntjb3JlaW1hZ2VzcmN9CitAc2VjdGlvbiBjb3JlaW1hZ2VzcmMKK1ZpZGVvIHNvdXJjZSBnZW5lcmF0ZWQgb24gR1BVIHVzaW5nIEFwcGxlJ3MgQ29yZUltYWdlIEFQSSBvbiBPU1guCisKK1RoaXMgdmlkZW8gc291cmNlIGlzIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgQHJlZntjb3JlaW1hZ2V9IHZpZGVvIGZpbHRlci4KK1VzZSBhIGNvcmUgaW1hZ2UgZ2VuZXJhdG9yIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFwcGxpZWQgZmlsdGVyY2hhaW4gdG8KK2dlbmVyYXRlIHRoZSBjb250ZW50LgorCitUaGUgY29yZWltYWdlc3JjIHZpZGVvIHNvdXJjZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBsaXN0X2dlbmVyYXRvcnMKK0xpc3QgYWxsIGF2YWlsYWJsZSBnZW5lcmF0b3JzIGFsb25nIHdpdGggYWxsIHRoZWlyIHJlc3BlY3RpdmUgb3B0aW9ucyBhcyB3ZWxsIGFzCitwb3NzaWJsZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcyBhbG9uZyB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcy4KK0BleGFtcGxlCitsaXN0X2dlbmVyYXRvcnM9dHJ1ZQorQGVuZCBleGFtcGxlCisKK0BpdGVtIHNpemUsIHMKK1NwZWNpZnkgdGhlIHNpemUgb2YgdGhlIHNvdXJjZWQgdmlkZW8uIEZvciB0aGUgc3ludGF4IG9mIHRoaXMgb3B0aW9uLCBjaGVjayB0aGUKK0ByZWZ7dmlkZW8gc2l6ZSBzeW50YXgsLCJWaWRlbyBzaXplIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLGZmbXBlZy11dGlsc30uCitUaGUgZGVmYXVsdCB2YWx1ZSBpcyBAY29kZXszMjB4MjQwfS4KKworQGl0ZW0gcmF0ZSwgcgorU3BlY2lmeSB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgc291cmNlZCB2aWRlbywgYXMgdGhlIG51bWJlciBvZiBmcmFtZXMKK2dlbmVyYXRlZCBwZXIgc2Vjb25kLiBJdCBoYXMgdG8gYmUgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdAorQHZhcntmcmFtZV9yYXRlX251bX0vQHZhcntmcmFtZV9yYXRlX2Rlbn0sIGFuIGludGVnZXIgbnVtYmVyLCBhIGZsb2F0aW5nIHBvaW50CitudW1iZXIgb3IgYSB2YWxpZCB2aWRlbyBmcmFtZSByYXRlIGFiYnJldmlhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyIyNSIuCisKK0BpdGVtIHNhcgorU2V0IHRoZSBzYW1wbGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBzb3VyY2VkIHZpZGVvLgorCitAaXRlbSBkdXJhdGlvbiwgZAorU2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgc291cmNlZCB2aWRlby4gU2VlCitAcmVme3RpbWUgZHVyYXRpb24gc3ludGF4LCx0aGUgVGltZSBkdXJhdGlvbiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMoMSkgbWFudWFsLGZmbXBlZy11dGlsc30KK2ZvciB0aGUgYWNjZXB0ZWQgc3ludGF4LgorCitJZiBub3Qgc3BlY2lmaWVkLCBvciB0aGUgZXhwcmVzc2VkIGR1cmF0aW9uIGlzIG5lZ2F0aXZlLCB0aGUgdmlkZW8gaXMKK3N1cHBvc2VkIHRvIGJlIGdlbmVyYXRlZCBmb3JldmVyLgorQGVuZCB0YWJsZQorCitBZGRpdGlvbmFsbHksIGFsbCBvcHRpb25zIG9mIHRoZSBAcmVme2NvcmVpbWFnZX0gdmlkZW8gZmlsdGVyIGFyZSBhY2NlcHRlZC4KK0EgY29tcGxldGUgZmlsdGVyY2hhaW4gY2FuIGJlIHVzZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBvZiB0aGUKK2dlbmVyYXRlZCBpbnB1dCB3aXRob3V0IENQVS1IT1NUIHRyYW5zZmVyLiBTZWUgQHJlZntjb3JlaW1hZ2V9IGRvY3VtZW50YXRpb24KK2FuZCBleGFtcGxlcyBmb3IgZGV0YWlscy4KKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKKworQGl0ZW0KK1VzZSBDSVFSQ29kZUdlbmVyYXRvciB0byBjcmVhdGUgYSBRUiBjb2RlIGZvciB0aGUgRkZtcGVnIGhvbWVwYWdlLAorZ2l2ZW4gYXMgY29tcGxldGUgYW5kIGVzY2FwZWQgY29tbWFuZC1saW5lIGZvciBBcHBsZSdzIHN0YW5kYXJkIGJhc2ggc2hlbGw6CitAZXhhbXBsZQorZmZtcGVnIC1mIGxhdmZpIC1pIGNvcmVpbWFnZXNyYz1zPTEwMHgxMDA6ZmlsdGVyPUNJUVJDb2RlR2VuZXJhdG9yQEBpbnB1dE1lc3NhZ2U9aHR0cHNcXFxcXDovL0ZGbXBlZy5vcmcvQEBpbnB1dENvcnJlY3Rpb25MZXZlbD1IIC1mcmFtZXM6diAxIFFSQ29kZS5wbmcKK0BlbmQgZXhhbXBsZQorVGhpcyBleGFtcGxlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFFSQ29kZSBleGFtcGxlIG9mIEByZWZ7Y29yZWltYWdlfSB3aXRob3V0IHRoZQorbmVlZCBmb3IgYSBudWxsc3JjIHZpZGVvIHNvdXJjZS4KK0BlbmQgaXRlbWl6ZQorCisKIEBzZWN0aW9uIG1hbmRlbGJyb3QKIAogR2VuZXJhdGUgYSBNYW5kZWxicm90IHNldCBmcmFjdGFsLCBhbmQgcHJvZ3Jlc3NpdmVseSB6b29tIHRvd2FyZHMgdGhlCkBAIC0xMzQzMSw4ICsxNzM4Nyw4IEBACiB2YWx1ZSBpcyAiMjUiLgogCiBAaXRlbSBzaXplLCBzCi1TZXQgZnJhbWUgc2l6ZS4gRm9yIHRoZSBzeW50YXggb2YgdGhpcyBvcHRpb24sIGNoZWNrIHRoZSAiVmlkZW8KLXNpemUiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwuIERlZmF1bHQgdmFsdWUgaXMgIjY0MHg0ODAiLgorU2V0IGZyYW1lIHNpemUuIEZvciB0aGUgc3ludGF4IG9mIHRoaXMgb3B0aW9uLCBjaGVjayB0aGUgQHJlZnt2aWRlbyBzaXplIHN5bnRheCwsIlZpZGVvCitzaXplIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLGZmbXBlZy11dGlsc30uIERlZmF1bHQgdmFsdWUgaXMgIjY0MHg0ODAiLgogCiBAaXRlbSBzdGFydF9zY2FsZQogU2V0IHRoZSBpbml0aWFsIHNjYWxlIHZhbHVlLiBEZWZhdWx0IHZhbHVlIGlzIDMuMC4KQEAgLTEzNjMxLDggKzE3NTg3LDggQEAKIEBpdGVtIG1vbGRfY29sb3IKIFNldCBtb2xkIGNvbG9yLCBmb3IgZGVmaW5pdGVseSBkZWFkIGFuZCBtb2xkeSBjZWxscy4KIAotRm9yIHRoZSBzeW50YXggb2YgdGhlc2UgMyBjb2xvciBvcHRpb25zLCBjaGVjayB0aGUgIkNvbG9yIiBzZWN0aW9uIGluIHRoZQotZmZtcGVnLXV0aWxzIG1hbnVhbC4KK0ZvciB0aGUgc3ludGF4IG9mIHRoZXNlIDMgY29sb3Igb3B0aW9ucywgY2hlY2sgdGhlIEByZWZ7Y29sb3Igc3ludGF4LCwiQ29sb3IiIHNlY3Rpb24gaW4gdGhlCitmZm1wZWctdXRpbHMgbWFudWFsLGZmbXBlZy11dGlsc30uCiBAZW5kIHRhYmxlCiAKIEBzdWJzZWN0aW9uIEV4YW1wbGVzCkBAIC0xMzY3Myw3ICsxNzYyOSw5IEBACiBAYW5jaG9ye3NtcHRlYmFyc30KIEBhbmNob3J7c21wdGVoZGJhcnN9CiBAYW5jaG9ye3Rlc3RzcmN9Ci1Ac2VjdGlvbiBhbGxyZ2IsIGFsbHl1diwgY29sb3IsIGhhbGRjbHV0c3JjLCBudWxsc3JjLCByZ2J0ZXN0c3JjLCBzbXB0ZWJhcnMsIHNtcHRlaGRiYXJzLCB0ZXN0c3JjCitAYW5jaG9ye3Rlc3RzcmMyfQorQGFuY2hvcnt5dXZ0ZXN0c3JjfQorQHNlY3Rpb24gYWxscmdiLCBhbGx5dXYsIGNvbG9yLCBoYWxkY2x1dHNyYywgbnVsbHNyYywgcmdidGVzdHNyYywgc21wdGViYXJzLCBzbXB0ZWhkYmFycywgdGVzdHNyYywgdGVzdHNyYzIsIHl1dnRlc3RzcmMKIAogVGhlIEBjb2Rle2FsbHJnYn0gc291cmNlIHJldHVybnMgZnJhbWVzIG9mIHNpemUgNDA5Nng0MDk2IG9mIGFsbCByZ2IgY29sb3JzLgogCkBAIC0xMzcwMiwyNyArMTc2NjAsMzUgQEAKIGNvbG9yIHBhdHRlcm4sIGEgc2Nyb2xsaW5nIGdyYWRpZW50IGFuZCBhIHRpbWVzdGFtcC4gVGhpcyBpcyBtYWlubHkKIGludGVuZGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgogCitUaGUgQGNvZGV7dGVzdHNyYzJ9IHNvdXJjZSBpcyBzaW1pbGFyIHRvIHRlc3RzcmMsIGJ1dCBzdXBwb3J0cyBtb3JlCitwaXhlbCBmb3JtYXRzIGluc3RlYWQgb2YganVzdCBAY29kZXtyZ2IyNH0uIFRoaXMgYWxsb3dzIHVzaW5nIGl0IGFzIGFuCitpbnB1dCBmb3Igb3RoZXIgdGVzdHMgd2l0aG91dCByZXF1aXJpbmcgYSBmb3JtYXQgY29udmVyc2lvbi4KKworVGhlIEBjb2Rle3l1dnRlc3RzcmN9IHNvdXJjZSBnZW5lcmF0ZXMgYW4gWVVWIHRlc3QgcGF0dGVybi4gWW91IHNob3VsZAorc2VlIGEgeSwgY2IgYW5kIGNyIHN0cmlwZSBmcm9tIHRvcCB0byBib3R0b20uCisKIFRoZSBzb3VyY2VzIGFjY2VwdCB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiAKIEB0YWJsZSBAb3B0aW9uCiAKLUBpdGVtIGNvbG9yLCBjCi1TcGVjaWZ5IHRoZSBjb2xvciBvZiB0aGUgc291cmNlLCBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgQGNvZGV7Y29sb3J9Ci1zb3VyY2UuIEZvciB0aGUgc3ludGF4IG9mIHRoaXMgb3B0aW9uLCBjaGVjayB0aGUgIkNvbG9yIiBzZWN0aW9uIGluIHRoZQotZmZtcGVnLXV0aWxzIG1hbnVhbC4KLQogQGl0ZW0gbGV2ZWwKIFNwZWNpZnkgdGhlIGxldmVsIG9mIHRoZSBIYWxkIENMVVQsIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBAY29kZXtoYWxkY2x1dHNyY30KIHNvdXJjZS4gQSBsZXZlbCBvZiBAY29kZXtOfSBnZW5lcmF0ZXMgYSBwaWN0dXJlIG9mIEBjb2Rle04qTipOfSBieSBAY29kZXtOKk4qTn0KIHBpeGVscyB0byBiZSB1c2VkIGFzIGlkZW50aXR5IG1hdHJpeCBmb3IgM0QgbG9va3VwIHRhYmxlcy4gRWFjaCBjb21wb25lbnQgaXMKIGNvZGVkIG9uIGEgQGNvZGV7MS8oTipOKX0gc2NhbGUuCiAKK0BpdGVtIGNvbG9yLCBjCitTcGVjaWZ5IHRoZSBjb2xvciBvZiB0aGUgc291cmNlLCBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgQGNvZGV7Y29sb3J9Citzb3VyY2UuIEZvciB0aGUgc3ludGF4IG9mIHRoaXMgb3B0aW9uLCBjaGVjayB0aGUKK0ByZWZ7Y29sb3Igc3ludGF4LCwiQ29sb3IiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwsZmZtcGVnLXV0aWxzfS4KKwogQGl0ZW0gc2l6ZSwgcwogU3BlY2lmeSB0aGUgc2l6ZSBvZiB0aGUgc291cmNlZCB2aWRlby4gRm9yIHRoZSBzeW50YXggb2YgdGhpcyBvcHRpb24sIGNoZWNrIHRoZQogQHJlZnt2aWRlbyBzaXplIHN5bnRheCwsIlZpZGVvIHNpemUiIHNlY3Rpb24gaW4gdGhlIGZmbXBlZy11dGlscyBtYW51YWwsZmZtcGVnLXV0aWxzfS4KIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEBjb2RlezMyMHgyNDB9LgogCi1UaGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIHdpdGggdGhlIEBjb2Rle2hhbGRjbHV0c3JjfSBmaWx0ZXIuCitUaGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIHdpdGggdGhlIEBjb2Rle2FsbHJnYn0sIEBjb2Rle2FsbHl1dn0sIGFuZAorQGNvZGV7aGFsZGNsdXRzcmN9IGZpbHRlcnMuCiAKIEBpdGVtIHJhdGUsIHIKIFNwZWNpZnkgdGhlIGZyYW1lIHJhdGUgb2YgdGhlIHNvdXJjZWQgdmlkZW8sIGFzIHRoZSBudW1iZXIgb2YgZnJhbWVzCkBAIC0xMzczMSw5ICsxNzY5Nyw2IEBACiBudW1iZXIgb3IgYSB2YWxpZCB2aWRlbyBmcmFtZSByYXRlIGFiYnJldmlhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKICIyNSIuCiAKLUBpdGVtIHNhcgotU2V0IHRoZSBzYW1wbGUgYXNwZWN0IHJhdGlvIG9mIHRoZSBzb3VyY2VkIHZpZGVvLgotCiBAaXRlbSBkdXJhdGlvbiwgZAogU2V0IHRoZSBkdXJhdGlvbiBvZiB0aGUgc291cmNlZCB2aWRlby4gU2VlCiBAcmVme3RpbWUgZHVyYXRpb24gc3ludGF4LCx0aGUgVGltZSBkdXJhdGlvbiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMoMSkgbWFudWFsLGZmbXBlZy11dGlsc30KQEAgLTEzNzQyLDYgKzE3NzA1LDE0IEBACiBJZiBub3Qgc3BlY2lmaWVkLCBvciB0aGUgZXhwcmVzc2VkIGR1cmF0aW9uIGlzIG5lZ2F0aXZlLCB0aGUgdmlkZW8gaXMKIHN1cHBvc2VkIHRvIGJlIGdlbmVyYXRlZCBmb3JldmVyLgogCitAaXRlbSBzYXIKK1NldCB0aGUgc2FtcGxlIGFzcGVjdCByYXRpbyBvZiB0aGUgc291cmNlZCB2aWRlby4KKworQGl0ZW0gYWxwaGEKK1NwZWNpZnkgdGhlIGFscGhhIChvcGFjaXR5KSBvZiB0aGUgYmFja2dyb3VuZCwgb25seSBhdmFpbGFibGUgaW4gdGhlCitAY29kZXt0ZXN0c3JjMn0gc291cmNlLiBUaGUgdmFsdWUgbXVzdCBiZSBiZXR3ZWVuIDAgKGZ1bGx5IHRyYW5zcGFyZW50KSBhbmQKKzI1NSAoZnVsbHkgb3BhcXVlLCB0aGUgZGVmYXVsdCkuCisKIEBpdGVtIGRlY2ltYWxzLCBuCiBTZXQgdGhlIG51bWJlciBvZiBkZWNpbWFscyB0byBzaG93IGluIHRoZSB0aW1lc3RhbXAsIG9ubHkgYXZhaWxhYmxlIGluIHRoZQogQGNvZGV7dGVzdHNyY30gc291cmNlLgpAQCAtMTM3NTEsMjcgKzE3NzIyLDMyIEBACiB2YWx1ZS4gRGVmYXVsdCB2YWx1ZSBpcyAwLgogQGVuZCB0YWJsZQogCi1Gb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nOgorQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKK0BpdGVtCitHZW5lcmF0ZSBhIHZpZGVvIHdpdGggYSBkdXJhdGlvbiBvZiA1LjMgc2Vjb25kcywgd2l0aCBzaXplCisxNzZ4MTQ0IGFuZCBhIGZyYW1lIHJhdGUgb2YgMTAgZnJhbWVzIHBlciBzZWNvbmQ6CiBAZXhhbXBsZQogdGVzdHNyYz1kdXJhdGlvbj01LjM6c2l6ZT1xY2lmOnJhdGU9MTAKIEBlbmQgZXhhbXBsZQogCi13aWxsIGdlbmVyYXRlIGEgdmlkZW8gd2l0aCBhIGR1cmF0aW9uIG9mIDUuMyBzZWNvbmRzLCB3aXRoIHNpemUKLTE3NngxNDQgYW5kIGEgZnJhbWUgcmF0ZSBvZiAxMCBmcmFtZXMgcGVyIHNlY29uZC4KLQorQGl0ZW0KIFRoZSBmb2xsb3dpbmcgZ3JhcGggZGVzY3JpcHRpb24gd2lsbCBnZW5lcmF0ZSBhIHJlZCBzb3VyY2UKIHdpdGggYW4gb3BhY2l0eSBvZiAwLjIsIHdpdGggc2l6ZSAicWNpZiIgYW5kIGEgZnJhbWUgcmF0ZSBvZiAxMAotZnJhbWVzIHBlciBzZWNvbmQuCitmcmFtZXMgcGVyIHNlY29uZDoKIEBleGFtcGxlCiBjb2xvcj1jPXJlZEBAMC4yOnM9cWNpZjpyPTEwCiBAZW5kIGV4YW1wbGUKIAorQGl0ZW0KIElmIHRoZSBpbnB1dCBjb250ZW50IGlzIHRvIGJlIGlnbm9yZWQsIEBjb2Rle251bGxzcmN9IGNhbiBiZSB1c2VkLiBUaGUKIGZvbGxvd2luZyBjb21tYW5kIGdlbmVyYXRlcyBub2lzZSBpbiB0aGUgbHVtaW5hbmNlIHBsYW5lIGJ5IGVtcGxveWluZwogdGhlIEBjb2Rle2dlcX0gZmlsdGVyOgogQGV4YW1wbGUKIG51bGxzcmM9cz0yNTZ4MjU2LCBnZXE9cmFuZG9tKDEpKjI1NToxMjg6MTI4CiBAZW5kIGV4YW1wbGUKK0BlbmQgaXRlbWl6ZQogCiBAc3Vic2VjdGlvbiBDb21tYW5kcwogCkBAIC0xMzc4Myw2ICsxNzc1OSw3OCBAQAogY29ycmVzcG9uZGluZyBAb3B0aW9ue2NvbG9yfSBvcHRpb24uCiBAZW5kIHRhYmxlCiAKK0BzZWN0aW9uIG9wZW5jbHNyYworCitHZW5lcmF0ZSB2aWRlbyB1c2luZyBhbiBPcGVuQ0wgcHJvZ3JhbS4KKworQHRhYmxlIEBvcHRpb24KKworQGl0ZW0gc291cmNlCitPcGVuQ0wgcHJvZ3JhbSBzb3VyY2UgZmlsZS4KKworQGl0ZW0ga2VybmVsCitLZXJuZWwgbmFtZSBpbiBwcm9ncmFtLgorCitAaXRlbSBzaXplLCBzCitTaXplIG9mIGZyYW1lcyB0byBnZW5lcmF0ZS4gIFRoaXMgbXVzdCBiZSBzZXQuCisKK0BpdGVtIGZvcm1hdAorUGl4ZWwgZm9ybWF0IHRvIHVzZSBmb3IgdGhlIGdlbmVyYXRlZCBmcmFtZXMuICBUaGlzIG11c3QgYmUgc2V0LgorCitAaXRlbSByYXRlLCByCitOdW1iZXIgb2YgZnJhbWVzIGdlbmVyYXRlZCBldmVyeSBzZWNvbmQuICBEZWZhdWx0IHZhbHVlIGlzICcyNScuCisKK0BlbmQgdGFibGUKKworRm9yIGRldGFpbHMgb2YgaG93IHRoZSBwcm9ncmFtIGxvYWRpbmcgd29ya3MsIHNlZSB0aGUgQHJlZntwcm9ncmFtX29wZW5jbH0KK2ZpbHRlci4KKworRXhhbXBsZSBwcm9ncmFtczoKKworQGl0ZW1pemUKK0BpdGVtCitHZW5lcmF0ZSBhIGNvbG91ciByYW1wIGJ5IHNldHRpbmcgcGl4ZWwgdmFsdWVzIGZyb20gdGhlIHBvc2l0aW9uIG9mIHRoZSBwaXhlbAoraW4gdGhlIG91dHB1dCBpbWFnZS4gIChOb3RlIHRoYXQgdGhpcyB3aWxsIHdvcmsgd2l0aCBhbGwgcGl4ZWwgZm9ybWF0cywgYnV0Cit0aGUgZ2VuZXJhdGVkIG91dHB1dCB3aWxsIG5vdCBiZSB0aGUgc2FtZS4pCitAdmVyYmF0aW0KK19fa2VybmVsIHZvaWQgcmFtcChfX3dyaXRlX29ubHkgaW1hZ2UyZF90IGRzdCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisgICAgaW50MiBsb2MgPSAoaW50MikoZ2V0X2dsb2JhbF9pZCgwKSwgZ2V0X2dsb2JhbF9pZCgxKSk7CisKKyAgICBmbG9hdDQgdmFsOworICAgIHZhbC54eSA9IHZhbC56dyA9IGNvbnZlcnRfZmxvYXQyKGxvYykgLyBjb252ZXJ0X2Zsb2F0MihnZXRfaW1hZ2VfZGltKGRzdCkpOworCisgICAgd3JpdGVfaW1hZ2VmKGRzdCwgbG9jLCB2YWwpOworfQorQGVuZCB2ZXJiYXRpbQorCitAaXRlbQorR2VuZXJhdGUgYSBTaWVycGluc2tpIGNhcnBldCBwYXR0ZXJuLCBwYW5uaW5nIGJ5IGEgc2luZ2xlIHBpeGVsIGVhY2ggZnJhbWUuCitAdmVyYmF0aW0KK19fa2VybmVsIHZvaWQgc2llcnBpbnNraV9jYXJwZXQoX193cml0ZV9vbmx5IGltYWdlMmRfdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKyAgICBpbnQyIGxvYyA9IChpbnQyKShnZXRfZ2xvYmFsX2lkKDApLCBnZXRfZ2xvYmFsX2lkKDEpKTsKKworICAgIGZsb2F0NCB2YWx1ZSA9IDAuMGY7CisgICAgaW50IHggPSBsb2MueCArIGluZGV4OworICAgIGludCB5ID0gbG9jLnkgKyBpbmRleDsKKyAgICB3aGlsZSAoeCA+IDAgfHwgeSA+IDApIHsKKyAgICAgICAgaWYgKHggJSAzID09IDEgJiYgeSAlIDMgPT0gMSkgeworICAgICAgICAgICAgdmFsdWUgPSAxLjBmOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgeCAvPSAzOworICAgICAgICB5IC89IDM7CisgICAgfQorCisgICAgd3JpdGVfaW1hZ2VmKGRzdCwgbG9jLCB2YWx1ZSk7Cit9CitAZW5kIHZlcmJhdGltCisKK0BlbmQgaXRlbWl6ZQorCiBAYyBtYW4gZW5kIFZJREVPIFNPVVJDRVMKIAogQGNoYXB0ZXIgVmlkZW8gU2lua3MKQEAgLTEzODE2LDYgKzE3ODY0LDI4IEBACiAKIEJlbG93IGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnRseSBhdmFpbGFibGUgbXVsdGltZWRpYSBmaWx0ZXJzLgogCitAc2VjdGlvbiBhYml0c2NvcGUKKworQ29udmVydCBpbnB1dCBhdWRpbyB0byBhIHZpZGVvIG91dHB1dCwgZGlzcGxheWluZyB0aGUgYXVkaW8gYml0IHNjb3BlLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcmF0ZSwgcgorU2V0IGZyYW1lIHJhdGUsIGV4cHJlc3NlZCBhcyBudW1iZXIgb2YgZnJhbWVzIHBlciBzZWNvbmQuIERlZmF1bHQKK3ZhbHVlIGlzICIyNSIuCisKK0BpdGVtIHNpemUsIHMKK1NwZWNpZnkgdGhlIHZpZGVvIHNpemUgZm9yIHRoZSBvdXRwdXQuIEZvciB0aGUgc3ludGF4IG9mIHRoaXMgb3B0aW9uLCBjaGVjayB0aGUKK0ByZWZ7dmlkZW8gc2l6ZSBzeW50YXgsLCJWaWRlbyBzaXplIiBzZWN0aW9uIGluIHRoZSBmZm1wZWctdXRpbHMgbWFudWFsLGZmbXBlZy11dGlsc30uCitEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezEwMjR4MjU2fS4KKworQGl0ZW0gY29sb3JzCitTcGVjaWZ5IGxpc3Qgb2YgY29sb3JzIHNlcGFyYXRlZCBieSBzcGFjZSBvciBieSAnfCcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvCitkcmF3IGNoYW5uZWxzLiBVbnJlY29nbml6ZWQgb3IgbWlzc2luZyBjb2xvcnMgd2lsbCBiZSByZXBsYWNlZAorYnkgd2hpdGUgY29sb3IuCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIGFoaXN0b2dyYW0KIAogQ29udmVydCBpbnB1dCBhdWRpbyB0byBhIHZpZGVvIG91dHB1dCwgZGlzcGxheWluZyB0aGUgdm9sdW1lIGhpc3RvZ3JhbS4KQEAgLTEzOTE5LDYgKzE3OTg5LDkgQEAKIEBpdGVtIG1wYwogU2V0IGNvbG9yIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgZHJhd2luZyBtZWRpYW4gcGhhc2UuIElmIGNvbG9yIGlzCiBAY29kZXtub25lfSB3aGljaCBpcyBkZWZhdWx0LCBubyBtZWRpYW4gcGhhc2UgdmFsdWUgd2lsbCBiZSBkcmF3bi4KKworQGl0ZW0gdmlkZW8KK0VuYWJsZSB2aWRlbyBvdXRwdXQuIERlZmF1bHQgaXMgZW5hYmxlZC4KIEBlbmQgdGFibGUKIAogVGhlIGZpbHRlciBhbHNvIGV4cG9ydHMgdGhlIGZyYW1lIG1ldGFkYXRhIEBjb2Rle2xhdmZpLmFwaGFzZW1ldGVyLnBoYXNlfSB3aGljaApAQCAtMTM5ODMsNyArMTgwNTYsOCBAQAogQWxsb3dlZCByYW5nZSBpcyBAY29kZXtbMCwgMjU1XX0uCiAKIEBpdGVtIHpvb20KLVNldCB0aGUgem9vbSBmYWN0b3IuIERlZmF1bHQgdmFsdWUgaXMgQGNvZGV7MX0uIEFsbG93ZWQgcmFuZ2UgaXMgQGNvZGV7WzEsIDEwXX0uCitTZXQgdGhlIHpvb20gZmFjdG9yLiBEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezF9LiBBbGxvd2VkIHJhbmdlIGlzIEBjb2Rle1swLCAxMF19LgorVmFsdWVzIGxvd2VyIHRoYW4gQHZhcnsxfSB3aWxsIGF1dG8gYWRqdXN0IHpvb20gZmFjdG9yIHRvIG1heGltYWwgcG9zc2libGUgdmFsdWUuCiAKIEBpdGVtIGRyYXcKIFNldCB0aGUgdmVjdG9yc2NvcGUgZHJhd2luZyBtb2RlLgpAQCAtMTM5OTgsNiArMTgwNzIsNDUgQEAKIEBlbmQgdGFibGUKIAogRGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtkb3R9LgorCitAaXRlbSBzY2FsZQorU3BlY2lmeSBhbXBsaXR1ZGUgc2NhbGUgb2YgYXVkaW8gc2FtcGxlcy4KKworQXZhaWxhYmxlIHZhbHVlcyBhcmU6CitAdGFibGUgQHNhbXAKK0BpdGVtIGxpbgorTGluZWFyLgorCitAaXRlbSBzcXJ0CitTcXVhcmUgcm9vdC4KKworQGl0ZW0gY2JydAorQ3ViaWMgcm9vdC4KKworQGl0ZW0gbG9nCitMb2dhcml0aG1pYy4KK0BlbmQgdGFibGUKKworQGl0ZW0gc3dhcAorU3dhcCBsZWZ0IGNoYW5uZWwgYXhpcyB3aXRoIHJpZ2h0IGNoYW5uZWwgYXhpcy4KKworQGl0ZW0gbWlycm9yCitNaXJyb3IgYXhpcy4KKworQHRhYmxlIEBzYW1wCitAaXRlbSBub25lCitObyBtaXJyb3IuCisKK0BpdGVtIHgKK01pcnJvciBvbmx5IHggYXhpcy4KKworQGl0ZW0geQorTWlycm9yIG9ubHkgeSBheGlzLgorCitAaXRlbSB4eQorTWlycm9yIGJvdGggYXhpcy4KK0BlbmQgdGFibGUKKwogQGVuZCB0YWJsZQogCiBAc3Vic2VjdGlvbiBFeGFtcGxlcwpAQCAtMTQwMTEsNiArMTgxMjQsNDAgQEAKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIGJlbmNoLCBhYmVuY2gKKworQmVuY2htYXJrIHBhcnQgb2YgYSBmaWx0ZXJncmFwaC4KKworVGhlIGZpbHRlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIGFjdGlvbgorU3RhcnQgb3Igc3RvcCBhIHRpbWVyLgorCitBdmFpbGFibGUgdmFsdWVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0gc3RhcnQKK0dldCB0aGUgY3VycmVudCB0aW1lLCBzZXQgaXQgYXMgZnJhbWUgbWV0YWRhdGEgKHVzaW5nIHRoZSBrZXkKK0Bjb2Rle2xhdmZpLmJlbmNoLnN0YXJ0X3RpbWV9KSwgYW5kIGZvcndhcmQgdGhlIGZyYW1lIHRvIHRoZSBuZXh0IGZpbHRlci4KKworQGl0ZW0gc3RvcAorR2V0IHRoZSBjdXJyZW50IHRpbWUgYW5kIGZldGNoIHRoZSBAY29kZXtsYXZmaS5iZW5jaC5zdGFydF90aW1lfSBtZXRhZGF0YSBmcm9tCit0aGUgaW5wdXQgZnJhbWUgbWV0YWRhdGEgdG8gZ2V0IHRoZSB0aW1lIGRpZmZlcmVuY2UuIFRpbWUgZGlmZmVyZW5jZSwgYXZlcmFnZSwKK21heGltdW0gYW5kIG1pbmltdW0gdGltZSAocmVzcGVjdGl2ZWx5IEBjb2Rle3R9LCBAY29kZXthdmd9LCBAY29kZXttYXh9IGFuZAorQGNvZGV7bWlufSkgYXJlIHRoZW4gcHJpbnRlZC4gVGhlIHRpbWVzdGFtcHMgYXJlIGV4cHJlc3NlZCBpbiBzZWNvbmRzLgorQGVuZCB0YWJsZQorQGVuZCB0YWJsZQorCitAc3Vic2VjdGlvbiBFeGFtcGxlcworCitAaXRlbWl6ZQorQGl0ZW0KK0JlbmNobWFyayBAcmVme3NlbGVjdGl2ZWNvbG9yfSBmaWx0ZXI6CitAZXhhbXBsZQorYmVuY2g9c3RhcnQsc2VsZWN0aXZlY29sb3I9cmVkcz0tLjIgLjEyIC0uNDksYmVuY2g9c3RvcAorQGVuZCBleGFtcGxlCitAZW5kIGl0ZW1pemUKKwogQHNlY3Rpb24gY29uY2F0CiAKIENvbmNhdGVuYXRlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zLCBqb2luaW5nIHRoZW0gdG9nZXRoZXIgb25lIGFmdGVyIHRoZQpAQCAtMTQwOTEsNiArMTgyMzgsMTE5IEBACiAKIEBlbmQgaXRlbWl6ZQogCitAc3Vic2VjdGlvbiBDb21tYW5kcworCitUaGlzIGZpbHRlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIG5leHQKK0Nsb3NlIHRoZSBjdXJyZW50IHNlZ21lbnQgYW5kIHN0ZXAgdG8gdGhlIG5leHQgb25lCitAZW5kIHRhYmxlCisKK0BzZWN0aW9uIGRyYXdncmFwaCwgYWRyYXdncmFwaAorCitEcmF3IGEgZ3JhcGggdXNpbmcgaW5wdXQgdmlkZW8gb3IgYXVkaW8gbWV0YWRhdGEuCisKK0l0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gbTEKK1NldCAxc3QgZnJhbWUgbWV0YWRhdGEga2V5IGZyb20gd2hpY2ggbWV0YWRhdGEgdmFsdWVzIHdpbGwgYmUgdXNlZCB0byBkcmF3IGEgZ3JhcGguCisKK0BpdGVtIGZnMQorU2V0IDFzdCBmb3JlZ3JvdW5kIGNvbG9yIGV4cHJlc3Npb24uCisKK0BpdGVtIG0yCitTZXQgMm5kIGZyYW1lIG1ldGFkYXRhIGtleSBmcm9tIHdoaWNoIG1ldGFkYXRhIHZhbHVlcyB3aWxsIGJlIHVzZWQgdG8gZHJhdyBhIGdyYXBoLgorCitAaXRlbSBmZzIKK1NldCAybmQgZm9yZWdyb3VuZCBjb2xvciBleHByZXNzaW9uLgorCitAaXRlbSBtMworU2V0IDNyZCBmcmFtZSBtZXRhZGF0YSBrZXkgZnJvbSB3aGljaCBtZXRhZGF0YSB2YWx1ZXMgd2lsbCBiZSB1c2VkIHRvIGRyYXcgYSBncmFwaC4KKworQGl0ZW0gZmczCitTZXQgM3JkIGZvcmVncm91bmQgY29sb3IgZXhwcmVzc2lvbi4KKworQGl0ZW0gbTQKK1NldCA0dGggZnJhbWUgbWV0YWRhdGEga2V5IGZyb20gd2hpY2ggbWV0YWRhdGEgdmFsdWVzIHdpbGwgYmUgdXNlZCB0byBkcmF3IGEgZ3JhcGguCisKK0BpdGVtIGZnNAorU2V0IDR0aCBmb3JlZ3JvdW5kIGNvbG9yIGV4cHJlc3Npb24uCisKK0BpdGVtIG1pbgorU2V0IG1pbmltYWwgdmFsdWUgb2YgbWV0YWRhdGEgdmFsdWUuCisKK0BpdGVtIG1heAorU2V0IG1heGltYWwgdmFsdWUgb2YgbWV0YWRhdGEgdmFsdWUuCisKK0BpdGVtIGJnCitTZXQgZ3JhcGggYmFja2dyb3VuZCBjb2xvci4gRGVmYXVsdCBpcyB3aGl0ZS4KKworQGl0ZW0gbW9kZQorU2V0IGdyYXBoIG1vZGUuCisKK0F2YWlsYWJsZSB2YWx1ZXMgZm9yIG1vZGUgaXM6CitAdGFibGUgQHNhbXAKK0BpdGVtIGJhcgorQGl0ZW0gZG90CitAaXRlbSBsaW5lCitAZW5kIHRhYmxlCisKK0RlZmF1bHQgaXMgQGNvZGV7bGluZX0uCisKK0BpdGVtIHNsaWRlCitTZXQgc2xpZGUgbW9kZS4KKworQXZhaWxhYmxlIHZhbHVlcyBmb3Igc2xpZGUgaXM6CitAdGFibGUgQHNhbXAKK0BpdGVtIGZyYW1lCitEcmF3IG5ldyBmcmFtZSB3aGVuIHJpZ2h0IGJvcmRlciBpcyByZWFjaGVkLgorCitAaXRlbSByZXBsYWNlCitSZXBsYWNlIG9sZCBjb2x1bW5zIHdpdGggbmV3IG9uZXMuCisKK0BpdGVtIHNjcm9sbAorU2Nyb2xsIGZyb20gcmlnaHQgdG8gbGVmdC4KKworQGl0ZW0gcnNjcm9sbAorU2Nyb2xsIGZyb20gbGVmdCB0byByaWdodC4KKworQGl0ZW0gcGljdHVyZQorRHJhdyBzaW5nbGUgcGljdHVyZS4KK0BlbmQgdGFibGUKKworRGVmYXVsdCBpcyBAY29kZXtmcmFtZX0uCisKK0BpdGVtIHNpemUKK1NldCBzaXplIG9mIGdyYXBoIHZpZGVvLiBGb3IgdGhlIHN5bnRheCBvZiB0aGlzIG9wdGlvbiwgY2hlY2sgdGhlCitAcmVme3ZpZGVvIHNpemUgc3ludGF4LCwiVmlkZW8gc2l6ZSIgc2VjdGlvbiBpbiB0aGUgZmZtcGVnLXV0aWxzIG1hbnVhbCxmZm1wZWctdXRpbHN9LgorVGhlIGRlZmF1bHQgdmFsdWUgaXMgQGNvZGV7OTAweDI1Nn0uCisKK1RoZSBmb3JlZ3JvdW5kIGNvbG9yIGV4cHJlc3Npb25zIGNhbiB1c2UgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CitAdGFibGUgQG9wdGlvbgorQGl0ZW0gTUlOCitNaW5pbWFsIHZhbHVlIG9mIG1ldGFkYXRhIHZhbHVlLgorCitAaXRlbSBNQVgKK01heGltYWwgdmFsdWUgb2YgbWV0YWRhdGEgdmFsdWUuCisKK0BpdGVtIFZBTAorQ3VycmVudCBtZXRhZGF0YSBrZXkgdmFsdWUuCitAZW5kIHRhYmxlCisKK1RoZSBjb2xvciBpcyBkZWZpbmVkIGFzIDB4QUFCQkdHUlIuCitAZW5kIHRhYmxlCisKK0V4YW1wbGUgdXNpbmcgbWV0YWRhdGEgZnJvbSBAcmVme3NpZ25hbHN0YXRzfSBmaWx0ZXI6CitAZXhhbXBsZQorc2lnbmFsc3RhdHMsZHJhd2dyYXBoPWxhdmZpLnNpZ25hbHN0YXRzLllBVkc6bWluPTA6bWF4PTI1NQorQGVuZCBleGFtcGxlCisKK0V4YW1wbGUgdXNpbmcgbWV0YWRhdGEgZnJvbSBAcmVme2VidXIxMjh9IGZpbHRlcjoKK0BleGFtcGxlCitlYnVyMTI4PW1ldGFkYXRhPTEsYWRyYXdncmFwaD1sYXZmaS5yMTI4Lk06bWluPS0xMjA6bWF4PTUKK0BlbmQgZXhhbXBsZQorCiBAYW5jaG9ye2VidXIxMjh9CiBAc2VjdGlvbiBlYnVyMTI4CiAKQEAgLTE0MjA4LDcgKzE4NDY4LDcgQEAKIFRoZXNlIGZpbHRlcnMgcmVhZCBmcmFtZXMgZnJvbSBzZXZlcmFsIGlucHV0cyBhbmQgc2VuZCB0aGUgb2xkZXN0CiBxdWV1ZWQgZnJhbWUgdG8gdGhlIG91dHB1dC4KIAotSW5wdXQgc3RyZWFtcyBtdXN0IGhhdmUgYSB3ZWxsIGRlZmluZWQsIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBmcmFtZQorSW5wdXQgc3RyZWFtcyBtdXN0IGhhdmUgd2VsbCBkZWZpbmVkLCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgZnJhbWUKIHRpbWVzdGFtcCB2YWx1ZXMuCiAKIEluIG9yZGVyIHRvIHN1Ym1pdCBvbmUgZnJhbWUgdG8gb3V0cHV0LCB0aGVzZSBmaWx0ZXJzIG5lZWQgdG8gZW5xdWV1ZQpAQCAtMTQyMTYsOSArMTg0NzYsOSBAQAogaW5wdXQgaXMgbm90IHlldCB0ZXJtaW5hdGVkIGFuZCB3aWxsIG5vdCByZWNlaXZlIGluY29taW5nIGZyYW1lcy4KIAogRm9yIGV4YW1wbGUgY29uc2lkZXIgdGhlIGNhc2Ugd2hlbiBvbmUgaW5wdXQgaXMgYSBAY29kZXtzZWxlY3R9IGZpbHRlcgotd2hpY2ggYWx3YXlzIGRyb3AgaW5wdXQgZnJhbWVzLiBUaGUgQGNvZGV7aW50ZXJsZWF2ZX0gZmlsdGVyIHdpbGwga2VlcAord2hpY2ggYWx3YXlzIGRyb3BzIGlucHV0IGZyYW1lcy4gVGhlIEBjb2Rle2ludGVybGVhdmV9IGZpbHRlciB3aWxsIGtlZXAKIHJlYWRpbmcgZnJvbSB0aGF0IGlucHV0LCBidXQgaXQgd2lsbCBuZXZlciBiZSBhYmxlIHRvIHNlbmQgbmV3IGZyYW1lcwotdG8gb3V0cHV0IHVudGlsIHRoZSBpbnB1dCB3aWxsIHNlbmQgYW4gZW5kLW9mLXN0cmVhbSBzaWduYWwuCit0byBvdXRwdXQgdW50aWwgdGhlIGlucHV0IHNlbmRzIGFuIGVuZC1vZi1zdHJlYW0gc2lnbmFsLgogCiBBbHNvLCBkZXBlbmRpbmcgb24gaW5wdXRzIHN5bmNocm9uaXphdGlvbiwgdGhlIGZpbHRlcnMgd2lsbCBkcm9wCiBmcmFtZXMgaW4gY2FzZSBvbmUgaW5wdXQgcmVjZWl2ZXMgbW9yZSBmcmFtZXMgdGhhbiB0aGUgb3RoZXIgb25lcywgYW5kCkBAIC0xNDI0Nyw2ICsxODUwNywxMTcgQEAKIEBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIG1ldGFkYXRhLCBhbWV0YWRhdGEKKworTWFuaXB1bGF0ZSBmcmFtZSBtZXRhZGF0YS4KKworVGhpcyBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBtb2RlCitTZXQgbW9kZSBvZiBvcGVyYXRpb24gb2YgdGhlIGZpbHRlci4KKworQ2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIHNlbGVjdAorSWYgYm90aCBAY29kZXt2YWx1ZX0gYW5kIEBjb2Rle2tleX0gaXMgc2V0LCBzZWxlY3QgZnJhbWVzCit3aGljaCBoYXZlIHN1Y2ggbWV0YWRhdGEuIElmIG9ubHkgQGNvZGV7a2V5fSBpcyBzZXQsIHNlbGVjdAorZXZlcnkgZnJhbWUgdGhhdCBoYXMgc3VjaCBrZXkgaW4gbWV0YWRhdGEuCisKK0BpdGVtIGFkZAorQWRkIG5ldyBtZXRhZGF0YSBAY29kZXtrZXl9IGFuZCBAY29kZXt2YWx1ZX0uIElmIGtleSBpcyBhbHJlYWR5IGF2YWlsYWJsZQorZG8gbm90aGluZy4KKworQGl0ZW0gbW9kaWZ5CitNb2RpZnkgdmFsdWUgb2YgYWxyZWFkeSBwcmVzZW50IGtleS4KKworQGl0ZW0gZGVsZXRlCitJZiBAY29kZXt2YWx1ZX0gaXMgc2V0LCBkZWxldGUgb25seSBrZXlzIHRoYXQgaGF2ZSBzdWNoIHZhbHVlLgorT3RoZXJ3aXNlLCBkZWxldGUga2V5LiBJZiBAY29kZXtrZXl9IGlzIG5vdCBzZXQsIGRlbGV0ZSBhbGwgbWV0YWRhdGEgdmFsdWVzIGluCit0aGUgZnJhbWUuCisKK0BpdGVtIHByaW50CitQcmludCBrZXkgYW5kIGl0cyB2YWx1ZSBpZiBtZXRhZGF0YSB3YXMgZm91bmQuIElmIEBjb2Rle2tleX0gaXMgbm90IHNldCBwcmludCBhbGwKK21ldGFkYXRhIHZhbHVlcyBhdmFpbGFibGUgaW4gZnJhbWUuCitAZW5kIHRhYmxlCisKK0BpdGVtIGtleQorU2V0IGtleSB1c2VkIHdpdGggYWxsIG1vZGVzLiBNdXN0IGJlIHNldCBmb3IgYWxsIG1vZGVzIGV4Y2VwdCBAY29kZXtwcmludH0gYW5kIEBjb2Rle2RlbGV0ZX0uCisKK0BpdGVtIHZhbHVlCitTZXQgbWV0YWRhdGEgdmFsdWUgd2hpY2ggd2lsbCBiZSB1c2VkLiBUaGlzIG9wdGlvbiBpcyBtYW5kYXRvcnkgZm9yCitAY29kZXttb2RpZnl9IGFuZCBAY29kZXthZGR9IG1vZGUuCisKK0BpdGVtIGZ1bmN0aW9uCitXaGljaCBmdW5jdGlvbiB0byB1c2Ugd2hlbiBjb21wYXJpbmcgbWV0YWRhdGEgdmFsdWUgYW5kIEBjb2Rle3ZhbHVlfS4KKworQ2FuIGJlIG9uZSBvZiBmb2xsb3dpbmc6CisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gc2FtZV9zdHIKK1ZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgc3RyaW5ncywgcmV0dXJucyB0cnVlIGlmIG1ldGFkYXRhIHZhbHVlIGlzIHNhbWUgYXMgQGNvZGV7dmFsdWV9LgorCitAaXRlbSBzdGFydHNfd2l0aAorVmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBzdHJpbmdzLCByZXR1cm5zIHRydWUgaWYgbWV0YWRhdGEgdmFsdWUgc3RhcnRzIHdpdGgKK3RoZSBAY29kZXt2YWx1ZX0gb3B0aW9uIHN0cmluZy4KKworQGl0ZW0gbGVzcworVmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBmbG9hdHMsIHJldHVybnMgdHJ1ZSBpZiBtZXRhZGF0YSB2YWx1ZSBpcyBsZXNzIHRoYW4gQGNvZGV7dmFsdWV9LgorCitAaXRlbSBlcXVhbAorVmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBmbG9hdHMsIHJldHVybnMgdHJ1ZSBpZiBAY29kZXt2YWx1ZX0gaXMgZXF1YWwgd2l0aCBtZXRhZGF0YSB2YWx1ZS4KKworQGl0ZW0gZ3JlYXRlcgorVmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBmbG9hdHMsIHJldHVybnMgdHJ1ZSBpZiBtZXRhZGF0YSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gQGNvZGV7dmFsdWV9LgorCitAaXRlbSBleHByCitWYWx1ZXMgYXJlIGludGVycHJldGVkIGFzIGZsb2F0cywgcmV0dXJucyB0cnVlIGlmIGV4cHJlc3Npb24gZnJvbSBvcHRpb24gQGNvZGV7ZXhwcn0KK2V2YWx1YXRlcyB0byB0cnVlLgorQGVuZCB0YWJsZQorCitAaXRlbSBleHByCitTZXQgZXhwcmVzc2lvbiB3aGljaCBpcyB1c2VkIHdoZW4gQGNvZGV7ZnVuY3Rpb259IGlzIHNldCB0byBAY29kZXtleHByfS4KK1RoZSBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCB0aHJvdWdoIHRoZSBldmFsIEFQSSBhbmQgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZworY29uc3RhbnRzOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gVkFMVUUxCitGbG9hdCByZXByZXNlbnRhdGlvbiBvZiBAY29kZXt2YWx1ZX0gZnJvbSBtZXRhZGF0YSBrZXkuCisKK0BpdGVtIFZBTFVFMgorRmxvYXQgcmVwcmVzZW50YXRpb24gb2YgQGNvZGV7dmFsdWV9IGFzIHN1cHBsaWVkIGJ5IHVzZXIgaW4gQGNvZGV7dmFsdWV9IG9wdGlvbi4KK0BlbmQgdGFibGUKKworQGl0ZW0gZmlsZQorSWYgc3BlY2lmaWVkIGluIEBjb2Rle3ByaW50fSBtb2RlLCBvdXRwdXQgaXMgd3JpdHRlbiB0byB0aGUgbmFtZWQgZmlsZS4gSW5zdGVhZCBvZgorcGxhaW4gZmlsZW5hbWUgYW55IHdyaXRhYmxlIHVybCBjYW4gYmUgc3BlY2lmaWVkLiBGaWxlbmFtZSBgYC0nJyBpcyBhIHNob3J0aGFuZAorZm9yIHN0YW5kYXJkIG91dHB1dC4gSWYgQGNvZGV7ZmlsZX0gb3B0aW9uIGlzIG5vdCBzZXQsIG91dHB1dCBpcyB3cml0dGVuIHRvIHRoZSBsb2cKK3dpdGggQVZfTE9HX0lORk8gbG9nbGV2ZWwuCisKK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKK0BpdGVtCitQcmludCBhbGwgbWV0YWRhdGEgdmFsdWVzIGZvciBmcmFtZXMgd2l0aCBrZXkgQGNvZGV7bGF2Zmkuc2lnbmFsc3RhdHMuWURJRn0gd2l0aCB2YWx1ZXMKK2JldHdlZW4gMCBhbmQgMS4KK0BleGFtcGxlCitzaWduYWxzdGF0cyxtZXRhZGF0YT1wcmludDprZXk9bGF2Zmkuc2lnbmFsc3RhdHMuWURJRjp2YWx1ZT0wOmZ1bmN0aW9uPWV4cHI6ZXhwcj0nYmV0d2VlbihWQUxVRTEsMCwxKScKK0BlbmQgZXhhbXBsZQorQGl0ZW0KK1ByaW50IHNpbGVuY2VkZXRlY3Qgb3V0cHV0IHRvIGZpbGUgQGZpbGV7bWV0YWRhdGEudHh0fS4KK0BleGFtcGxlCitzaWxlbmNlZGV0ZWN0LGFtZXRhZGF0YT1tb2RlPXByaW50OmZpbGU9bWV0YWRhdGEudHh0CitAZW5kIGV4YW1wbGUKK0BpdGVtCitEaXJlY3QgYWxsIG1ldGFkYXRhIHRvIGEgcGlwZSB3aXRoIGZpbGUgZGVzY3JpcHRvciA0LgorQGV4YW1wbGUKK21ldGFkYXRhPW1vZGU9cHJpbnQ6ZmlsZT0ncGlwZVw6NCcKK0BlbmQgZXhhbXBsZQorQGVuZCBpdGVtaXplCisKIEBzZWN0aW9uIHBlcm1zLCBhcGVybXMKIAogU2V0IHJlYWQvd3JpdGUgcGVybWlzc2lvbnMgZm9yIHRoZSBvdXRwdXQgZnJhbWVzLgpAQCAtMTQyODgsNyArMTg2NTksNyBAQAogCiBAc2VjdGlvbiByZWFsdGltZSwgYXJlYWx0aW1lCiAKLVNsb3cgZG93biBmaWx0ZXJpbmcgdG8gbWF0Y2ggcmVhbCB0aW1lIGFwcHJveGltYXRpdmVseS4KK1Nsb3cgZG93biBmaWx0ZXJpbmcgdG8gbWF0Y2ggcmVhbCB0aW1lIGFwcHJveGltYXRlbHkuCiAKIFRoZXNlIGZpbHRlcnMgd2lsbCBwYXVzZSB0aGUgZmlsdGVyaW5nIGZvciBhIHZhcmlhYmxlIGFtb3VudCBvZiB0aW1lIHRvCiBtYXRjaCB0aGUgb3V0cHV0IHJhdGUgd2l0aCB0aGUgaW5wdXQgdGltZXN0YW1wcy4KQEAgLTE0MzAyLDYgKzE4NjczLDcgQEAKIGEgdGltZXN0YW1wIGRpc2NvbnRpbnVpdHkgYW5kIHJlc2V0IHRoZSB0aW1lci4gRGVmYXVsdCBpcyAyIHNlY29uZHMuCiBAZW5kIHRhYmxlCiAKK0BhbmNob3J7c2VsZWN0fQogQHNlY3Rpb24gc2VsZWN0LCBhc2VsZWN0CiAKIFNlbGVjdCBmcmFtZXMgdG8gcGFzcyBpbiBvdXRwdXQuCkBAIC0xNDM1Nyw3ICsxODcyOSw3IEBACiBUaGUgUFRTIG9mIHRoZSBsYXN0IHByZXZpb3VzbHkgZmlsdGVyZWQgdmlkZW8gZnJhbWUuIEl0J3MgTkFOIGlmIHVuZGVmaW5lZC4KIAogQGl0ZW0gcHJldl9zZWxlY3RlZF90Ci1UaGUgUFRTIG9mIHRoZSBsYXN0IHByZXZpb3VzbHkgc2VsZWN0ZWQgdmlkZW8gZnJhbWUuIEl0J3MgTkFOIGlmIHVuZGVmaW5lZC4KK1RoZSBQVFMgb2YgdGhlIGxhc3QgcHJldmlvdXNseSBzZWxlY3RlZCB2aWRlbyBmcmFtZSwgZXhwcmVzc2VkIGluIHNlY29uZHMuIEl0J3MgTkFOIGlmIHVuZGVmaW5lZC4KIAogQGl0ZW0gc3RhcnRfcHRzCiBUaGUgUFRTIG9mIHRoZSBmaXJzdCB2aWRlbyBmcmFtZSBpbiB0aGUgdmlkZW8uIEl0J3MgTkFOIGlmIHVuZGVmaW5lZC4KQEAgLTE0NDcyLDcgKzE4ODQ0LDcgQEAKIEBlbmQgZXhhbXBsZQogCiBAaXRlbQotU2VsZWN0IG9ubHkgSSBmcmFtZXMgY29udGFpbmVkIGluIHRoZSAxMC0yMCB0aW1lIGludGVydmFsOgorU2VsZWN0IG9ubHkgSS1mcmFtZXMgY29udGFpbmVkIGluIHRoZSAxMC0yMCB0aW1lIGludGVydmFsOgogQGV4YW1wbGUKIHNlbGVjdD1iZXR3ZWVuKHRcLDEwXCwyMCkqZXEocGljdF90eXBlXCxJKQogQGVuZCBleGFtcGxlCkBAIC0xNDYyMCw2ICsxODk5MiwxMiBAQAogQGVuZCBleGFtcGxlCiAKIEBpdGVtCitUYXJnZXQgYSBzcGVjaWZpYyBmaWx0ZXIgaW5zdGFuY2U6CitAZXhhbXBsZQorYXNlbmRjbWQ9Yz0nNC4wIGF0ZW1wb0BAbXkgdGVtcG8gMS41JyxhdGVtcG9AQG15CitAZW5kIGV4YW1wbGUKKworQGl0ZW0KIFNwZWNpZnkgYSBsaXN0IG9mIGRyYXd0ZXh0IGFuZCBodWUgY29tbWFuZHMgaW4gYSBmaWxlLgogQGV4YW1wbGUKICMgc2hvdyB0ZXh0IGluIHRoZSBpbnRlcnZhbCA1LTEwCkBAIC0xNDc3Niw2ICsxOTE1NCwzNyBAQAogCiBAZW5kIGl0ZW1pemUKIAorQHNlY3Rpb24gc2V0cmFuZ2UKKworRm9yY2UgY29sb3IgcmFuZ2UgZm9yIHRoZSBvdXRwdXQgdmlkZW8gZnJhbWUuCisKK1RoZSBAY29kZXtzZXRyYW5nZX0gZmlsdGVyIG1hcmtzIHRoZSBjb2xvciByYW5nZSBwcm9wZXJ0eSBmb3IgdGhlCitvdXRwdXQgZnJhbWVzLiBJdCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGlucHV0IGZyYW1lLCBidXQgb25seSBzZXRzIHRoZQorY29ycmVzcG9uZGluZyBwcm9wZXJ0eSwgd2hpY2ggYWZmZWN0cyBob3cgdGhlIGZyYW1lIGlzIHRyZWF0ZWQgYnkKK2ZvbGxvd2luZyBmaWx0ZXJzLgorCitUaGUgZmlsdGVyIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorCitAaXRlbSByYW5nZQorQXZhaWxhYmxlIHZhbHVlcyBhcmU6CisKK0B0YWJsZSBAc2FtcAorQGl0ZW0gYXV0bworS2VlcCB0aGUgc2FtZSBjb2xvciByYW5nZSBwcm9wZXJ0eS4KKworQGl0ZW0gdW5zcGVjaWZpZWQsIHVua25vd24KK1NldCB0aGUgY29sb3IgcmFuZ2UgYXMgdW5zcGVjaWZpZWQuCisKK0BpdGVtIGxpbWl0ZWQsIHR2LCBtcGVnCitTZXQgdGhlIGNvbG9yIHJhbmdlIGFzIGxpbWl0ZWQuCisKK0BpdGVtIGZ1bGwsIHBjLCBqcGVnCitTZXQgdGhlIGNvbG9yIHJhbmdlIGFzIGZ1bGwuCitAZW5kIHRhYmxlCitAZW5kIHRhYmxlCisKIEBzZWN0aW9uIHNldHRiLCBhc2V0dGIKIAogU2V0IHRoZSB0aW1lYmFzZSB0byB1c2UgZm9yIHRoZSBvdXRwdXQgZnJhbWVzIHRpbWVzdGFtcHMuCkBAIC0xNDkxNCwxMiArMTkzMjMsMjEgQEAKIFNwZWNpZnkgdGhlIGJhcmdyYXBoIGdhbW1hLiBEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezF9LiBBY2NlcHRhYmxlIHJhbmdlIGlzCiBAY29kZXtbMSwgN119LgogCitAaXRlbSBiYXJfdAorU3BlY2lmeSB0aGUgYmFyZ3JhcGggdHJhbnNwYXJlbmN5IGxldmVsLiBMb3dlciB2YWx1ZSBtYWtlcyB0aGUgYmFyZ3JhcGggc2hhcnBlci4KK0RlZmF1bHQgdmFsdWUgaXMgQGNvZGV7MX0uIEFjY2VwdGFibGUgcmFuZ2UgaXMgQGNvZGV7WzAsIDFdfS4KKwogQGl0ZW0gdGltZWNsYW1wLCB0YwogU3BlY2lmeSB0aGUgdHJhbnNmb3JtIHRpbWVjbGFtcC4gQXQgbG93IGZyZXF1ZW5jeSwgdGhlcmUgaXMgdHJhZGUtb2ZmIGJldHdlZW4KIGFjY3VyYWN5IGluIHRpbWUgZG9tYWluIGFuZCBmcmVxdWVuY3kgZG9tYWluLiBJZiB0aW1lY2xhbXAgaXMgbG93ZXIsCiBldmVudCBpbiB0aW1lIGRvbWFpbiBpcyByZXByZXNlbnRlZCBtb3JlIGFjY3VyYXRlbHkgKHN1Y2ggYXMgZmFzdCBiYXNzIGRydW0pLAogb3RoZXJ3aXNlIGV2ZW50IGluIGZyZXF1ZW5jeSBkb21haW4gaXMgcmVwcmVzZW50ZWQgbW9yZSBhY2N1cmF0ZWx5Ci0oc3VjaCBhcyBiYXNzIGd1aXRhcikuIEFjY2VwdGFibGUgcmFuZ2UgaXMgQGNvZGV7WzAuMSwgMV19LiBEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezAuMTd9LgorKHN1Y2ggYXMgYmFzcyBndWl0YXIpLiBBY2NlcHRhYmxlIHJhbmdlIGlzIEBjb2Rle1swLjAwMiwgMV19LiBEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezAuMTd9LgorCitAaXRlbSBhdHRhY2sKK1NldCBhdHRhY2sgdGltZSBpbiBzZWNvbmRzLiBUaGUgZGVmYXVsdCBpcyBAY29kZXswfSAoZGlzYWJsZWQpLiBPdGhlcndpc2UsIGl0CitsaW1pdHMgZnV0dXJlIHNhbXBsZXMgYnkgYXBwbHlpbmcgYXN5bW1ldHJpYyB3aW5kb3dpbmcgaW4gdGltZSBkb21haW4sIHVzZWZ1bAord2hlbiBsb3cgbGF0ZW5jeSBpcyByZXF1aXJlZC4gQWNjZXB0ZWQgcmFuZ2UgaXMgQGNvZGV7WzAsIDFdfS4KIAogQGl0ZW0gYmFzZWZyZXEKIFNwZWNpZnkgdGhlIHRyYW5zZm9ybSBiYXNlIGZyZXF1ZW5jeS4gRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXsyMC4wMTUyMzEyNjQwODAwNzQ3NX0sCkBAIC0xNDk1OCw2ICsxOTM3NiwxMCBAQAogaW1wbGVtZW50ZWQgd2l0aCBjdXN0b20gQHZhcntiYXNlZnJlcX0gYW5kIEB2YXJ7ZW5kZnJlcX0sIHVzZSBAdmFye2F4aXNmaWxlfQogb3B0aW9uIGluc3RlYWQuCiAKK0BpdGVtIGZvbnQKK1NwZWNpZnkgZm9udGNvbmZpZyBwYXR0ZXJuLiBUaGlzIGhhcyBsb3dlciBwcmlvcml0eSB0aGFuIEB2YXJ7Zm9udGZpbGV9LgorVGhlIDogaW4gdGhlIHBhdHRlcm4gbWF5IGJlIHJlcGxhY2VkIGJ5IHwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgZXNjYXBpbmcuCisKIEBpdGVtIGZvbnRjb2xvcgogU3BlY2lmeSBmb250IGNvbG9yIGV4cHJlc3Npb24uIFRoaXMgaXMgYXJpdGhtZXRpYyBleHByZXNzaW9uIHRoYXQgc2hvdWxkIHJldHVybgogaW50ZWdlciB2YWx1ZSAweFJSR0dCQi4gSXQgY2FuIGNvbnRhaW4gdmFyaWFibGVzOgpAQCAtMTQ5ODcsNiArMTk0MDksMzcgQEAKIHRoZSBheGlzIGlzIGRpc2FibGVkLCBpZ25vcmluZyBAdmFye2ZvbnRmaWxlfSBhbmQgQHZhcntheGlzZmlsZX0gb3B0aW9uLgogRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXsxfS4KIAorQGl0ZW0gY3NwCitTZXQgY29sb3JzcGFjZS4gVGhlIGFjY2VwdGVkIHZhbHVlcyBhcmU6CitAdGFibGUgQHNhbXAKK0BpdGVtIHVuc3BlY2lmaWVkCitVbnNwZWNpZmllZCAoZGVmYXVsdCkKKworQGl0ZW0gYnQ3MDkKK0JULjcwOQorCitAaXRlbSBmY2MKK0ZDQworCitAaXRlbSBidDQ3MGJnCitCVC40NzBCRyBvciBCVC42MDEtNiA2MjUKKworQGl0ZW0gc21wdGUxNzBtCitTTVBURS0xNzBNIG9yIEJULjYwMS02IDUyNQorCitAaXRlbSBzbXB0ZTI0MG0KK1NNUFRFLTI0ME0KKworQGl0ZW0gYnQyMDIwbmNsCitCVC4yMDIwIHdpdGggbm9uLWNvbnN0YW50IGx1bWluYW5jZQorCitAZW5kIHRhYmxlCisKK0BpdGVtIGNzY2hlbWUKK1NldCBzcGVjdHJvZ3JhbSBjb2xvciBzY2hlbWUuIFRoaXMgaXMgbGlzdCBvZiBmbG9hdGluZyBwb2ludCB2YWx1ZXMgd2l0aCBmb3JtYXQKK0Bjb2Rle2xlZnRfcnxsZWZ0X2d8bGVmdF9ifHJpZ2h0X3J8cmlnaHRfZ3xyaWdodF9ifS4KK1RoZSBkZWZhdWx0IGlzIEBjb2RlezF8MC41fDB8MHwwLjV8MX0uCisKIEBlbmQgdGFibGUKIAogQHN1YnNlY3Rpb24gRXhhbXBsZXMKQEAgLTE1MDU1LDYgKzE5NTA4LDEyIEBACiBAZW5kIGV4YW1wbGUKIAogQGl0ZW0KK0N1c3RvbSBmb250IHVzaW5nIGZvbnRjb25maWc6CitAZXhhbXBsZQorZm9udD0nQ291cmllciBOZXcsTW9ub3NwYWNlLG1vbm98Ym9sZCcKK0BlbmQgZXhhbXBsZQorCitAaXRlbQogQ3VzdG9tIGZyZXF1ZW5jeSByYW5nZSB3aXRoIGN1c3RvbSBheGlzIHVzaW5nIGltYWdlIGZpbGU6CiBAZXhhbXBsZQogYXhpc2ZpbGU9bXlheGlzLnBuZzpiYXNlZnJlcT00MDplbmRmcmVxPTEwMDAwCkBAIC0xNTE2Miw2ICsxOTYyMSwxMCBAQAogQGl0ZW0gbGFuY3pvcwogQGl0ZW0gZ2F1c3MKIEBpdGVtIHR1a2V5CitAaXRlbSBkb2xwaAorQGl0ZW0gY2F1Y2h5CitAaXRlbSBwYXJ6ZW4KK0BpdGVtIHBvaXNzb24KIEBlbmQgdGFibGUKIERlZmF1bHQgaXMgQGNvZGV7aGFubmluZ30uCiAKQEAgLTE1MTg4LDYgKzE5NjUxLDkgQEAKIEBlbmQgdGFibGUKIERlZmF1bHQgaXMgQGNvZGV7Y29tYmluZWR9LgogCitAaXRlbSBtaW5hbXAKK1NldCBtaW5pbXVtIGFtcGxpdHVkZSB1c2VkIGluIEBjb2Rle2xvZ30gYW1wbGl0dWRlIHNjYWxlci4KKwogQGVuZCB0YWJsZQogCiBAYW5jaG9ye3Nob3dzcGVjdHJ1bX0KQEAgLTE1MjEzLDEwICsxOTY3OSwxMCBAQAogdGhlIHNhbXBsZXMgc3RhcnQgYWdhaW4gb24gdGhlIGxlZnQgd2hlbiB0aGV5IHJlYWNoIHRoZSByaWdodAogQGl0ZW0gc2Nyb2xsCiB0aGUgc2FtcGxlcyBzY3JvbGwgZnJvbSByaWdodCB0byBsZWZ0Ci1AaXRlbSByc2Nyb2xsCi10aGUgc2FtcGxlcyBzY3JvbGwgZnJvbSBsZWZ0IHRvIHJpZ2h0CiBAaXRlbSBmdWxsZnJhbWUKIGZyYW1lcyBhcmUgb25seSBwcm9kdWNlZCB3aGVuIHRoZSBzYW1wbGVzIHJlYWNoIHRoZSByaWdodAorQGl0ZW0gcnNjcm9sbAordGhlIHNhbXBsZXMgc2Nyb2xsIGZyb20gbGVmdCB0byByaWdodAogQGVuZCB0YWJsZQogCiBEZWZhdWx0IHZhbHVlIGlzIEBjb2Rle3JlcGxhY2V9LgpAQCAtMTUyNzIsMTIgKzE5NzM4LDEyIEBACiBzcXVhcmUgcm9vdCwgZGVmYXVsdAogQGl0ZW0gY2JydAogY3ViaWMgcm9vdAorQGl0ZW0gbG9nCitsb2dhcml0aG1pYwogQGl0ZW0gNHRocnQKIDR0aCByb290CiBAaXRlbSA1dGhydAogNXRoIHJvb3QKLUBpdGVtIGxvZwotbG9nYXJpdGhtaWMKIEBlbmQgdGFibGUKIAogRGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtzcXJ0fS4KQEAgLTE1MzA5LDYgKzE5Nzc1LDEwIEBACiBAaXRlbSBsYW5jem9zCiBAaXRlbSBnYXVzcwogQGl0ZW0gdHVrZXkKK0BpdGVtIGRvbHBoCitAaXRlbSBjYXVjaHkKK0BpdGVtIHBhcnplbgorQGl0ZW0gcG9pc3NvbgogQGVuZCB0YWJsZQogCiBEZWZhdWx0IHZhbHVlIGlzIEBjb2Rle2hhbm59LgpAQCAtMTUzMjgsNiArMTk3OTgsMTAgQEAKIAogQGl0ZW0gZGF0YQogU2V0IHdoaWNoIGRhdGEgdG8gZGlzcGxheS4gQ2FuIGJlIEBjb2Rle21hZ25pdHVkZX0sIGRlZmF1bHQgb3IgQGNvZGV7cGhhc2V9LgorCitAaXRlbSByb3RhdGlvbgorU2V0IGNvbG9yIHJvdGF0aW9uLCBtdXN0IGJlIGluIFstMS4wLCAxLjBdIHJhbmdlLgorRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXswfS4KIEBlbmQgdGFibGUKIAogVGhlIHVzYWdlIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgc2hvd3dhdmVzIGZpbHRlcjsgc2VlIHRoZSBleGFtcGxlcyBpbiB0aGF0CkBAIC0xNTQxMiwxMiArMTk4ODYsMTIgQEAKIHNxdWFyZSByb290LCBkZWZhdWx0CiBAaXRlbSBjYnJ0CiBjdWJpYyByb290CitAaXRlbSBsb2cKK2xvZ2FyaXRobWljCiBAaXRlbSA0dGhydAogNHRoIHJvb3QKIEBpdGVtIDV0aHJ0CiA1dGggcm9vdAotQGl0ZW0gbG9nCi1sb2dhcml0aG1pYwogQGVuZCB0YWJsZQogRGVmYXVsdCB2YWx1ZSBpcyBAc2FtcHtsb2d9LgogCkBAIC0xNTQ0OCw2ICsxOTkyMiwxMCBAQAogQGl0ZW0gbGFuY3pvcwogQGl0ZW0gZ2F1c3MKIEBpdGVtIHR1a2V5CitAaXRlbSBkb2xwaAorQGl0ZW0gY2F1Y2h5CitAaXRlbSBwYXJ6ZW4KK0BpdGVtIHBvaXNzb24KIEBlbmQgdGFibGUKIERlZmF1bHQgdmFsdWUgaXMgQGNvZGV7aGFubn0uCiAKQEAgLTE1NDYxLDYgKzE5OTM5LDEwIEBACiAKIEBpdGVtIGxlZ2VuZAogRHJhdyB0aW1lIGFuZCBmcmVxdWVuY3kgYXhlcyBhbmQgbGVnZW5kcy4gRGVmYXVsdCBpcyBlbmFibGVkLgorCitAaXRlbSByb3RhdGlvbgorU2V0IGNvbG9yIHJvdGF0aW9uLCBtdXN0IGJlIGluIFstMS4wLCAxLjBdIHJhbmdlLgorRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXswfS4KIEBlbmQgdGFibGUKIAogQHN1YnNlY3Rpb24gRXhhbXBsZXMKQEAgLTE1NDg4LDEzICsxOTk3MCwxMyBAQAogU2V0IGJvcmRlciB3aWR0aCwgYWxsb3dlZCByYW5nZSBpcyBbMCwgNV0uIERlZmF1bHQgaXMgMS4KIAogQGl0ZW0gdwotU2V0IGNoYW5uZWwgd2lkdGgsIGFsbG93ZWQgcmFuZ2UgaXMgWzgwLCAxMDgwXS4gRGVmYXVsdCBpcyA0MDAuCitTZXQgY2hhbm5lbCB3aWR0aCwgYWxsb3dlZCByYW5nZSBpcyBbODAsIDgxOTJdLiBEZWZhdWx0IGlzIDQwMC4KIAogQGl0ZW0gaAotU2V0IGNoYW5uZWwgaGVpZ2h0LCBhbGxvd2VkIHJhbmdlIGlzIFsxLCAxMDBdLiBEZWZhdWx0IGlzIDIwLgorU2V0IGNoYW5uZWwgaGVpZ2h0LCBhbGxvd2VkIHJhbmdlIGlzIFsxLCA5MDBdLiBEZWZhdWx0IGlzIDIwLgogCiBAaXRlbSBmCi1TZXQgZmFkZSwgYWxsb3dlZCByYW5nZSBpcyBbMC4wMDEsIDFdLiBEZWZhdWx0IGlzIDAuOTUuCitTZXQgZmFkZSwgYWxsb3dlZCByYW5nZSBpcyBbMCwgMV0uIERlZmF1bHQgaXMgMC45NS4KIAogQGl0ZW0gYwogU2V0IHZvbHVtZSBjb2xvciBleHByZXNzaW9uLgpAQCAtMTU1MDUsNiArMTk5ODcsOSBAQAogQGl0ZW0gVk9MVU1FCiBDdXJyZW50IG1heCB2b2x1bWUgb2YgY2hhbm5lbCBpbiBkQi4KIAorQGl0ZW0gUEVBSworQ3VycmVudCBwZWFrLgorCiBAaXRlbSBDSEFOTkVMCiBDdXJyZW50IGNoYW5uZWwgbnVtYmVyLCBzdGFydGluZyBmcm9tIDAuCiBAZW5kIHRhYmxlCkBAIC0xNTUxNCw2ICsxOTk5OSwzNSBAQAogCiBAaXRlbSB2CiBJZiBzZXQsIGRpc3BsYXlzIHZvbHVtZSB2YWx1ZXMuIERlZmF1bHQgaXMgZW5hYmxlZC4KKworQGl0ZW0gbworU2V0IG9yaWVudGF0aW9uLCBjYW4gYmUgaG9yaXpvbnRhbDogQGNvZGV7aH0gb3IgdmVydGljYWw6IEBjb2Rle3Z9LAorZGVmYXVsdCBpcyBAY29kZXtofS4KKworQGl0ZW0gcworU2V0IHN0ZXAgc2l6ZSwgYWxsb3dlZCByYW5nZSBpcyBbMCwgNV0uIERlZmF1bHQgaXMgMCwgd2hpY2ggbWVhbnMKK3N0ZXAgaXMgZGlzYWJsZWQuCisKK0BpdGVtIHAKK1NldCBiYWNrZ3JvdW5kIG9wYWNpdHksIGFsbG93ZWQgcmFuZ2UgaXMgWzAsIDFdLiBEZWZhdWx0IGlzIDAuCisKK0BpdGVtIG0KK1NldCBtZXRlcmluZyBtb2RlLCBjYW4gYmUgcGVhazogQGNvZGV7cH0gb3Igcm1zOiBAY29kZXtyfSwKK2RlZmF1bHQgaXMgQGNvZGV7cH0uCisKK0BpdGVtIGRzCitTZXQgZGlzcGxheSBzY2FsZSwgY2FuIGJlIGxpbmVhcjogQGNvZGV7bGlufSBvciBsb2c6IEBjb2Rle2xvZ30sCitkZWZhdWx0IGlzIEBjb2Rle2xpbn0uCisKK0BpdGVtIGRtCitJbiBzZWNvbmQuCitJZiBzZXQgdG8gPiAwLiwgZGlzcGxheSBhIGxpbmUgZm9yIHRoZSBtYXggbGV2ZWwKK2luIHRoZSBwcmV2aW91cyBzZWNvbmRzLgorZGVmYXVsdCBpcyBkaXNhYmxlZDogQGNvZGV7MC59CisKK0BpdGVtIGRtYworVGhlIGNvbG9yIG9mIHRoZSBtYXggbGluZS4gVXNlIHdoZW4gQGNvZGV7ZG19IG9wdGlvbiBpcyBzZXQgdG8gPiAwLgorZGVmYXVsdCBpczogQGNvZGV7b3JhbmdlfQogQGVuZCB0YWJsZQogCiBAc2VjdGlvbiBzaG93d2F2ZXMKQEAgLTE1NTY1LDkgKzIwMDc5LDM4IEBACiBTZXQgY29sb3JzIHNlcGFyYXRlZCBieSAnfCcgd2hpY2ggYXJlIGdvaW5nIHRvIGJlIHVzZWQgZm9yIGRyYXdpbmcgb2YgZWFjaCBjaGFubmVsLgogCiBAaXRlbSBzY2FsZQotU2V0IGFtcGxpdHVkZSBzY2FsZS4gQ2FuIGJlIGxpbmVhciBAY29kZXtsaW59IG9yIGxvZ2FyaXRobWljIEBjb2Rle2xvZ30uCitTZXQgYW1wbGl0dWRlIHNjYWxlLgorCitBdmFpbGFibGUgdmFsdWVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0gbGluCitMaW5lYXIuCisKK0BpdGVtIGxvZworTG9nYXJpdGhtaWMuCisKK0BpdGVtIHNxcnQKK1NxdWFyZSByb290LgorCitAaXRlbSBjYnJ0CitDdWJpYyByb290LgorQGVuZCB0YWJsZQorCiBEZWZhdWx0IGlzIGxpbmVhci4KIAorQGl0ZW0gZHJhdworU2V0IHRoZSBkcmF3IG1vZGUuIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCB0byBzZXQgZm9yIGhpZ2ggQHZhcntufS4KKworQXZhaWxhYmxlIHZhbHVlcyBhcmU6CitAdGFibGUgQHNhbXAKK0BpdGVtIHNjYWxlCitTY2FsZSBwaXhlbCB2YWx1ZXMgZm9yIGVhY2ggZHJhd24gc2FtcGxlLgorCitAaXRlbSBmdWxsCitEcmF3IGV2ZXJ5IHNhbXBsZSBkaXJlY3RseS4KK0BlbmQgdGFibGUKKworRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXtzY2FsZX0uCiBAZW5kIHRhYmxlCiAKIEBzdWJzZWN0aW9uIEV4YW1wbGVzCkBAIC0xNTYwNyw3ICsyMDE1MCwyMyBAQAogU2V0IGNvbG9ycyBzZXBhcmF0ZWQgYnkgJ3wnIHdoaWNoIGFyZSBnb2luZyB0byBiZSB1c2VkIGZvciBkcmF3aW5nIG9mIGVhY2ggY2hhbm5lbC4KIAogQGl0ZW0gc2NhbGUKLVNldCBhbXBsaXR1ZGUgc2NhbGUuIENhbiBiZSBsaW5lYXIgQGNvZGV7bGlufSBvciBsb2dhcml0aG1pYyBAY29kZXtsb2d9LgorU2V0IGFtcGxpdHVkZSBzY2FsZS4KKworQXZhaWxhYmxlIHZhbHVlcyBhcmU6CitAdGFibGUgQHNhbXAKK0BpdGVtIGxpbgorTGluZWFyLgorCitAaXRlbSBsb2cKK0xvZ2FyaXRobWljLgorCitAaXRlbSBzcXJ0CitTcXVhcmUgcm9vdC4KKworQGl0ZW0gY2JydAorQ3ViaWMgcm9vdC4KK0BlbmQgdGFibGUKKwogRGVmYXVsdCBpcyBsaW5lYXIuCiBAZW5kIHRhYmxlCiAKQEAgLTE1NjIwLDE2ICsyMDE3OSwzOCBAQAogQGV4YW1wbGUKIGZmbXBlZyAtaSBhdWRpby5mbGFjIC1sYXZmaSBzaG93d2F2ZXNwaWM9c3BsaXRfY2hhbm5lbHM9MTpzPTEwMjR4ODAwIHdhdmVmb3JtLnBuZwogQGVuZCBleGFtcGxlCi0KLUBpdGVtCi1Db2xvcml6ZSB0aGUgd2F2ZWZvcm0gd2l0aCBjb2xvcmNoYW5uZWxtaXhlci4gVGhpcyBleGFtcGxlIHdpbGwgbWFrZQotdGhlIHdhdmVmb3JtIGEgZ3JlZW4gY29sb3IgYXBwcm94aW1hdGVseSBSR0IoNjYsMjE3LDE1MCkuIEFkZGl0aW9uYWwKLWNoYW5uZWxzIHdpbGwgYmUgc2hhZGVzIG9mIHRoaXMgY29sb3IuCi1AZXhhbXBsZQotZmZtcGVnIC1pIGF1ZGlvLm1wMyAtZmlsdGVyX2NvbXBsZXggInNob3d3YXZlc3BpYyxjb2xvcmNoYW5uZWxtaXhlcj1ycj02Ni8yNTU6Z2c9MjE3LzI1NTpiYj0xNTAvMjU1IiB3YXZlZm9ybS5wbmcKLUBlbmQgZXhhbXBsZQogQGVuZCBpdGVtaXplCiAKK0BzZWN0aW9uIHNpZGVkYXRhLCBhc2lkZWRhdGEKKworRGVsZXRlIGZyYW1lIHNpZGUgZGF0YSwgb3Igc2VsZWN0IGZyYW1lcyBiYXNlZCBvbiBpdC4KKworVGhpcyBmaWx0ZXIgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBtb2RlCitTZXQgbW9kZSBvZiBvcGVyYXRpb24gb2YgdGhlIGZpbHRlci4KKworQ2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIHNlbGVjdAorU2VsZWN0IGV2ZXJ5IGZyYW1lIHdpdGggc2lkZSBkYXRhIG9mIEBjb2Rle3R5cGV9LgorCitAaXRlbSBkZWxldGUKK0RlbGV0ZSBzaWRlIGRhdGEgb2YgQGNvZGV7dHlwZX0uIElmIEBjb2Rle3R5cGV9IGlzIG5vdCBzZXQsIGRlbGV0ZSBhbGwgc2lkZQorZGF0YSBpbiB0aGUgZnJhbWUuCisKK0BlbmQgdGFibGUKKworQGl0ZW0gdHlwZQorU2V0IHNpZGUgZGF0YSB0eXBlIHVzZWQgd2l0aCBhbGwgbW9kZXMuIE11c3QgYmUgc2V0IGZvciBAY29kZXtzZWxlY3R9IG1vZGUuIEZvcgordGhlIGxpc3Qgb2YgZnJhbWUgc2lkZSBkYXRhIHR5cGVzLCByZWZlciB0byB0aGUgQGNvZGV7QVZGcmFtZVNpZGVEYXRhVHlwZX0gZW51bQoraW4gQGZpbGV7bGliYXZ1dGlsL2ZyYW1lLmh9LiBGb3IgZXhhbXBsZSwgdG8gY2hvb3NlCitAY29kZXtBVl9GUkFNRV9EQVRBX1BBTlNDQU59IHNpZGUgZGF0YSwgeW91IG11c3Qgc3BlY2lmeSBAY29kZXtQQU5TQ0FOfS4KKworQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBzcGVjdHJ1bXN5bnRoCiAKIFN5dGhlc2l6ZSBhdWRpbyBmcm9tIDIgaW5wdXQgdmlkZW8gc3BlY3RydW1zLCBmaXJzdCBpbnB1dCBzdHJlYW0gcmVwcmVzZW50cwpAQCAtMTU2MzcsNyArMjAyMTgsNyBAQAogVGhlIGZpbHRlciB3aWxsIHRyYW5zZm9ybSBmcm9tIGZyZXF1ZW5jeSBkb21haW4gYXMgZGlzcGxheWVkIGluIHZpZGVvcyBiYWNrCiB0byB0aW1lIGRvbWFpbiBhcyBwcmVzZW50ZWQgaW4gYXVkaW8gb3V0cHV0LgogCi1UaGlzIGZpbHRlciBpcyBwcmltYXJseSBjcmVhdGVkIGZvciByZXZlcnNpbmcgcHJvY2Vzc2VkIEByZWZ7c2hvd3NwZWN0cnVtfQorVGhpcyBmaWx0ZXIgaXMgcHJpbWFyaWx5IGNyZWF0ZWQgZm9yIHJldmVyc2luZyBwcm9jZXNzZWQgQHJlZntzaG93c3BlY3RydW19CiBmaWx0ZXIgb3V0cHV0cywgYnV0IGNhbiBzeW50aGVzaXplIHNvdW5kIGZyb20gb3RoZXIgc3BlY3Ryb2dyYW1zIHRvby4KIEJ1dCBpbiBzdWNoIGNhc2UgcmVzdWx0cyBhcmUgZ29pbmcgdG8gYmUgcG9vciBpZiB0aGUgcGhhc2UgZGF0YSBpcyBub3QKIGF2YWlsYWJsZSwgYmVjYXVzZSBpbiBzdWNoIGNhc2VzIHBoYXNlIGRhdGEgbmVlZCB0byBiZSByZWNyZWF0ZWQsIHVzdWFsbHkKQEAgLTE1NzQwLDcgKzIwMzIxLDcgQEAKIAogQGNvZGV7em1xfSBhbmQgQGNvZGV7YXptcX0gd29yayBhcyBhIHBhc3MtdGhyb3VnaCBmaWx0ZXJzLiBAY29kZXt6bXF9CiBtdXN0IGJlIGluc2VydGVkIGJldHdlZW4gdHdvIHZpZGVvIGZpbHRlcnMsIEBjb2Rle2F6bXF9IGJldHdlZW4gdHdvCi1hdWRpbyBmaWx0ZXJzLgorYXVkaW8gZmlsdGVycy4gQm90aCBhcmUgY2FwYWJsZSB0byBzZW5kIG1lc3NhZ2VzIHRvIGFueSBmaWx0ZXIgdHlwZS4KIAogVG8gZW5hYmxlIHRoZXNlIGZpbHRlcnMgeW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgbGliem1xIGxpYnJhcnkgYW5kCiBoZWFkZXJzIGFuZCBjb25maWd1cmUgRkZtcGVnIHdpdGggQGNvZGV7LS1lbmFibGUtbGliem1xfS4KQEAgLTE1NzUwLDcgKzIwMzMxLDEwIEBACiAKIFRoZSBAY29kZXt6bXF9IGFuZCBAY29kZXthem1xfSBmaWx0ZXJzIHdvcmsgYXMgYSBsaWJ6bXEgc2VydmVyLCB3aGljaAogcmVjZWl2ZXMgbWVzc2FnZXMgc2VudCB0aHJvdWdoIGEgbmV0d29yayBpbnRlcmZhY2UgZGVmaW5lZCBieSB0aGUKLUBvcHRpb257YmluZF9hZGRyZXNzfSBvcHRpb24uCitAb3B0aW9ue2JpbmRfYWRkcmVzc30gKG9yIHRoZSBhYmJyZXZpYXRpb24gIkBvcHRpb257Yn0iKSBvcHRpb24uCitEZWZhdWx0IHZhbHVlIG9mIHRoaXMgb3B0aW9uIGlzIEBmaWxle3RjcDovL2xvY2FsaG9zdDo1NTU1fS4gWW91IG1heQord2FudCB0byBhbHRlciB0aGlzIHZhbHVlIHRvIHlvdXIgbmVlZHMsIGJ1dCBkbyBub3QgZm9yZ2V0IHRvIGVzY2FwZSBhbnkKKyc6JyBzaWducyAoc2VlIEByZWZ7ZmlsdGVyZ3JhcGggZXNjYXBpbmd9KS4KIAogVGhlIHJlY2VpdmVkIG1lc3NhZ2UgbXVzdCBiZSBpbiB0aGUgZm9ybToKIEBleGFtcGxlCkBAIC0xNTc1OCw3ICsyMDM0MiwxMCBAQAogQGVuZCBleGFtcGxlCiAKIEB2YXJ7VEFSR0VUfSBzcGVjaWZpZXMgdGhlIHRhcmdldCBvZiB0aGUgY29tbWFuZCwgdXN1YWxseSB0aGUgbmFtZSBvZgotdGhlIGZpbHRlciBjbGFzcyBvciBhIHNwZWNpZmljIGZpbHRlciBpbnN0YW5jZSBuYW1lLgordGhlIGZpbHRlciBjbGFzcyBvciBhIHNwZWNpZmljIGZpbHRlciBpbnN0YW5jZSBuYW1lLiBUaGUgZGVmYXVsdAorZmlsdGVyIGluc3RhbmNlIG5hbWUgdXNlcyB0aGUgcGF0dGVybiBAc2FtcHtQYXJzZWRfPGZpbHRlcl9uYW1lPl88aW5kZXg+fSwKK2J1dCB5b3UgY2FuIG92ZXJyaWRlIHRoaXMgYnkgdXNpbmcgdGhlIEBzYW1we2ZpbHRlcl9uYW1lQEBpZH0gc3ludGF4Cisoc2VlIEByZWZ7RmlsdGVyZ3JhcGggc3ludGF4fSkuCiAKIEB2YXJ7Q09NTUFORH0gc3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGZvciB0aGUgdGFyZ2V0IGZpbHRlci4KIApAQCAtMTU3ODAsMTQgKzIwMzY3LDE3IEBACiBMb29rIGF0IEBmaWxle3Rvb2xzL3ptcXNlbmR9IGZvciBhbiBleGFtcGxlIG9mIGEgem1xIGNsaWVudCB3aGljaCBjYW4KIGJlIHVzZWQgdG8gc2VuZCBjb21tYW5kcyBwcm9jZXNzZWQgYnkgdGhlc2UgZmlsdGVycy4KIAotQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBmaWx0ZXJncmFwaCBnZW5lcmF0ZWQgYnkgQGNvbW1hbmR7ZmZwbGF5fQorQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBmaWx0ZXJncmFwaCBnZW5lcmF0ZWQgYnkgQGNvbW1hbmR7ZmZwbGF5fS4KK0luIHRoaXMgZXhhbXBsZSB0aGUgbGFzdCBvdmVybGF5IGZpbHRlciBoYXMgYW4gaW5zdGFuY2UgbmFtZS4gQWxsIG90aGVyCitmaWx0ZXJzIHdpbGwgaGF2ZSBkZWZhdWx0IGluc3RhbmNlIG5hbWVzLgorCiBAZXhhbXBsZQogZmZwbGF5IC1kdW1wZ3JhcGggMSAtZiBsYXZmaSAiCiBjb2xvcj1zPTEwMHgxMDA6Yz1yZWQgIFtsXTsKIGNvbG9yPXM9MTAweDEwMDpjPWJsdWUgW3JdOwogbnVsbHNyYz1zPTIwMHgxMDAsIHptcSBbYmddOwotW2JnXVtsXSAgIG92ZXJsYXkgICAgICBbYmcrbF07Ci1bYmcrbF1bcl0gb3ZlcmxheT14PTEwMCAiCitbYmddW2xdICAgb3ZlcmxheSAgICAgW2JnK2xdOworW2JnK2xdW3JdIG92ZXJsYXlAQG15PXg9MTAwICIKIEBlbmQgZXhhbXBsZQogCiBUbyBjaGFuZ2UgdGhlIGNvbG9yIG9mIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHZpZGVvLCB0aGUgZm9sbG93aW5nCkBAIC0xNTgwMSw2ICsyMDM5MSwxMiBAQAogZWNobyBQYXJzZWRfY29sb3JfMSBjIHBpbmsgfCB0b29scy96bXFzZW5kCiBAZW5kIGV4YW1wbGUKIAorVG8gY2hhbmdlIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmlnaHQgc2lkZToKK0BleGFtcGxlCitlY2hvIG92ZXJsYXlAQG15IHggMTUwIHwgdG9vbHMvem1xc2VuZAorQGVuZCBleGFtcGxlCisKKwogQGMgbWFuIGVuZCBNVUxUSU1FRElBIEZJTFRFUlMKIAogQGNoYXB0ZXIgTXVsdGltZWRpYSBTb3VyY2VzCkBAIC0xNTgzOSw4ICsyMDQzNSw4IEBACiBAaXRlbSBzdHJlYW1zLCBzCiBTcGVjaWZpZXMgdGhlIHN0cmVhbXMgdG8gcmVhZC4gU2V2ZXJhbCBzdHJlYW1zIGNhbiBiZSBzcGVjaWZpZWQsCiBzZXBhcmF0ZWQgYnkgIisiLiBUaGUgc291cmNlIHdpbGwgdGhlbiBoYXZlIGFzIG1hbnkgb3V0cHV0cywgaW4gdGhlCi1zYW1lIG9yZGVyLiBUaGUgc3ludGF4IGlzIGV4cGxhaW5lZCBpbiB0aGUgYGBTdHJlYW0gc3BlY2lmaWVycycnCi1zZWN0aW9uIGluIHRoZSBmZm1wZWcgbWFudWFsLiBUd28gc3BlY2lhbCBuYW1lcywgImR2IiBhbmQgImRhIiBzcGVjaWZ5CitzYW1lIG9yZGVyLiBUaGUgc3ludGF4IGlzIGV4cGxhaW5lZCBpbiB0aGUgQHJlZntTdHJlYW0gc3BlY2lmaWVycywsIlN0cmVhbSBzcGVjaWZpZXJzIgorc2VjdGlvbiBpbiB0aGUgZmZtcGVnIG1hbnVhbCxmZm1wZWd9LiBUd28gc3BlY2lhbCBuYW1lcywgImR2IiBhbmQgImRhIiBzcGVjaWZ5CiByZXNwZWN0aXZlbHkgdGhlIGRlZmF1bHQgKGJlc3Qgc3VpdGVkKSB2aWRlbyBhbmQgYXVkaW8gc3RyZWFtLiBEZWZhdWx0CiBpcyAiZHYiLCBvciAiZGEiIGlmIHRoZSBmaWx0ZXIgaXMgY2FsbGVkIGFzICJhbW92aWUiLgogCkBAIC0xNTg1MiwxMSArMjA0NDgsMTYgQEAKIAogQGl0ZW0gbG9vcAogU3BlY2lmaWVzIGhvdyBtYW55IHRpbWVzIHRvIHJlYWQgdGhlIHN0cmVhbSBpbiBzZXF1ZW5jZS4KLUlmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gMSwgdGhlIHN0cmVhbSB3aWxsIGJlIHJlYWQgYWdhaW4gYW5kIGFnYWluLgorSWYgdGhlIHZhbHVlIGlzIDAsIHRoZSBzdHJlYW0gd2lsbCBiZSBsb29wZWQgaW5maW5pdGVseS4KIERlZmF1bHQgdmFsdWUgaXMgIjEiLgogCiBOb3RlIHRoYXQgd2hlbiB0aGUgbW92aWUgaXMgbG9vcGVkIHRoZSBzb3VyY2UgdGltZXN0YW1wcyBhcmUgbm90CiBjaGFuZ2VkLCBzbyBpdCB3aWxsIGdlbmVyYXRlIG5vbiBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGltZXN0YW1wcy4KKworQGl0ZW0gZGlzY29udGludWl0eQorU3BlY2lmaWVzIHRoZSB0aW1lIGRpZmZlcmVuY2UgYmV0d2VlbiBmcmFtZXMgYWJvdmUgd2hpY2ggdGhlIHBvaW50IGlzCitjb25zaWRlcmVkIGEgdGltZXN0YW1wIGRpc2NvbnRpbnVpdHkgd2hpY2ggaXMgcmVtb3ZlZCBieSBhZGp1c3RpbmcgdGhlIGxhdGVyCit0aW1lc3RhbXBzLgogQGVuZCB0YWJsZQogCiBJdCBhbGxvd3Mgb3ZlcmxheWluZyBhIHNlY29uZCB2aWRlbyBvbiB0b3Agb2YgdGhlIG1haW4gaW5wdXQgb2YKQEAgLTE1ODk3LDQgKzIwNDk4LDI4IEBACiBAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQogCitAc3Vic2VjdGlvbiBDb21tYW5kcworCitCb3RoIG1vdmllIGFuZCBhbW92aWUgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgorQHRhYmxlIEBvcHRpb24KK0BpdGVtIHNlZWsKK1BlcmZvcm0gc2VlayB1c2luZyAiYXZfc2Vla19mcmFtZSIuCitUaGUgc3ludGF4IGlzOiBzZWVrIEB2YXJ7c3RyZWFtX2luZGV4fXxAdmFye3RpbWVzdGFtcH18QHZhcntmbGFnc30KK0BpdGVtaXplCitAaXRlbQorQHZhcntzdHJlYW1faW5kZXh9OiBJZiBzdHJlYW1faW5kZXggaXMgLTEsIGEgZGVmYXVsdAorc3RyZWFtIGlzIHNlbGVjdGVkLCBhbmQgQHZhcnt0aW1lc3RhbXB9IGlzIGF1dG9tYXRpY2FsbHkgY29udmVydGVkCitmcm9tIEFWX1RJTUVfQkFTRSB1bml0cyB0byB0aGUgc3RyZWFtIHNwZWNpZmljIHRpbWVfYmFzZS4KK0BpdGVtCitAdmFye3RpbWVzdGFtcH06IFRpbWVzdGFtcCBpbiBBVlN0cmVhbS50aW1lX2Jhc2UgdW5pdHMKK29yLCBpZiBubyBzdHJlYW0gaXMgc3BlY2lmaWVkLCBpbiBBVl9USU1FX0JBU0UgdW5pdHMuCitAaXRlbQorQHZhcntmbGFnc306IEZsYWdzIHdoaWNoIHNlbGVjdCBkaXJlY3Rpb24gYW5kIHNlZWtpbmcgbW9kZS4KK0BlbmQgaXRlbWl6ZQorCitAaXRlbSBnZXRfZHVyYXRpb24KK0dldCBtb3ZpZSBkdXJhdGlvbiBpbiBBVl9USU1FX0JBU0UgdW5pdHMuCisKK0BlbmQgdGFibGUKKwogQGMgbWFuIGVuZCBNVUxUSU1FRElBIFNPVVJDRVMKZGlmZiAtLWdpdCBhL2RvYy9mb3JtYXRzLnRleGkgYi9kb2MvZm9ybWF0cy50ZXhpCmluZGV4IDYxN2NkYTUuLmRkZDc3NDMgMTAwNjQ0Ci0tLSBhL2RvYy9mb3JtYXRzLnRleGkKKysrIGIvZG9jL2Zvcm1hdHMudGV4aQpAQCAtNjEsNiArNjEsMTAgQEAKIE9ubHkgd3JpdGUgcGxhdGZvcm0tLCBidWlsZC0gYW5kIHRpbWUtaW5kZXBlbmRlbnQgZGF0YS4KIFRoaXMgZW5zdXJlcyB0aGF0IGZpbGUgYW5kIGRhdGEgY2hlY2tzdW1zIGFyZSByZXByb2R1Y2libGUgYW5kIG1hdGNoIGJldHdlZW4KIHBsYXRmb3Jtcy4gSXRzIHByaW1hcnkgdXNlIGlzIGZvciByZWdyZXNzaW9uIHRlc3RpbmcuCitAaXRlbSBzaG9ydGVzdAorU3RvcCBtdXhpbmcgYXQgdGhlIGVuZCBvZiB0aGUgc2hvcnRlc3Qgc3RyZWFtLgorSXQgbWF5IGJlIG5lZWRlZCB0byBpbmNyZWFzZSBtYXhfaW50ZXJsZWF2ZV9kZWx0YSB0byBhdm9pZCBmbHVzaGluZyB0aGUgbG9uZ2VyCitzdHJlYW1zIGJlZm9yZSBFT0YuCiBAZW5kIHRhYmxlCiAKIEBpdGVtIHNlZWsyYW55IEB2YXJ7aW50ZWdlcn0gKEBlbXBoe2lucHV0fSkKQEAgLTE0Nyw3ICsxNTEsNyBAQAogZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBidWZmZXJlZCBwYWNrZXRzLgogCiBAaXRlbSB1c2Vfd2FsbGNsb2NrX2FzX3RpbWVzdGFtcHMgQHZhcntpbnRlZ2VyfSAoQGVtcGh7aW5wdXR9KQotVXNlIHdhbGxjbG9jayBhcyB0aW1lc3RhbXBzLgorVXNlIHdhbGxjbG9jayBhcyB0aW1lc3RhbXBzIGlmIHNldCB0byAxLiBEZWZhdWx0IGlzIDAuCiAKIEBpdGVtIGF2b2lkX25lZ2F0aXZlX3RzIEB2YXJ7aW50ZWdlcn0gKEBlbXBoe291dHB1dH0pCiAKQEAgLTE3OCw5ICsxODIsMTAgQEAKIENvcnJlY3Qgc2luZ2xlIHRpbWVzdGFtcCBvdmVyZmxvd3MgaWYgc2V0IHRvIDEuIERlZmF1bHQgaXMgMS4KIAogQGl0ZW0gZmx1c2hfcGFja2V0cyBAdmFye2ludGVnZXJ9IChAZW1waHtvdXRwdXR9KQotRmx1c2ggdGhlIHVuZGVybHlpbmcgSS9PIHN0cmVhbSBhZnRlciBlYWNoIHBhY2tldC4gRGVmYXVsdCAxIGVuYWJsZXMgaXQsIGFuZAotaGFzIHRoZSBlZmZlY3Qgb2YgcmVkdWNpbmcgdGhlIGxhdGVuY3k7IDAgZGlzYWJsZXMgaXQgYW5kIG1heSBzbGlnaHRseQotaW5jcmVhc2UgcGVyZm9ybWFuY2UgaW4gc29tZSBjYXNlcy4KK0ZsdXNoIHRoZSB1bmRlcmx5aW5nIEkvTyBzdHJlYW0gYWZ0ZXIgZWFjaCBwYWNrZXQuIERlZmF1bHQgaXMgLTEgKGF1dG8pLCB3aGljaAorbWVhbnMgdGhhdCB0aGUgdW5kZXJseWluZyBwcm90b2NvbCB3aWxsIGRlY2lkZSwgMSBlbmFibGVzIGl0LCBhbmQgaGFzIHRoZQorZWZmZWN0IG9mIHJlZHVjaW5nIHRoZSBsYXRlbmN5LCAwIGRpc2FibGVzIGl0IGFuZCBtYXkgaW5jcmVhc2UgSU8gdGhyb3VnaHB1dCBpbgorc29tZSBjYXNlcy4KIAogQGl0ZW0gb3V0cHV0X3RzX29mZnNldCBAdmFye29mZnNldH0gKEBlbXBoe291dHB1dH0pCiBTZXQgdGhlIG91dHB1dCB0aW1lIG9mZnNldC4KQEAgLTE5NSw3ICsyMDAsNyBAQAogaXMgQGNvZGV7MH0gKG1lYW5pbmcgdGhhdCBubyBvZmZzZXQgaXMgYXBwbGllZCkuCiAKIEBpdGVtIGZvcm1hdF93aGl0ZWxpc3QgQHZhcntsaXN0fSAoQGVtcGh7aW5wdXR9KQotIiwiIHNlcGFyYXRlZCBMaXN0IG9mIGFsbG93ZWQgZGVtdXhlcnMuIEJ5IGRlZmF1bHQgYWxsIGFyZSBhbGxvd2VkLgorIiwiIHNlcGFyYXRlZCBsaXN0IG9mIGFsbG93ZWQgZGVtdXhlcnMuIEJ5IGRlZmF1bHQgYWxsIGFyZSBhbGxvd2VkLgogCiBAaXRlbSBkdW1wX3NlcGFyYXRvciBAdmFye3N0cmluZ30gKEBlbXBoe2lucHV0fSkKIFNlcGFyYXRvciB1c2VkIHRvIHNlcGFyYXRlIHRoZSBmaWVsZHMgcHJpbnRlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGFib3V0IHRoZQpAQCAtMjA1LDYgKzIxMCwxMCBAQAogZmZwcm9iZSAtZHVtcF9zZXBhcmF0b3IgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAiICAtaSB+L3ZpZGVvcy9tYXRyaXhiZW5jaF9tcGVnMi5tcGcKIEBlbmQgZXhhbXBsZQorCitAaXRlbSBtYXhfc3RyZWFtcyBAdmFye2ludGVnZXJ9IChAZW1waHtpbnB1dH0pCitTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmVqZWN0IGZpbGVzIHRoYXQKK3dvdWxkIHJlcXVpcmUgdG9vIG1hbnkgcmVzb3VyY2VzIGR1ZSB0byBhIGxhcmdlIG51bWJlciBvZiBzdHJlYW1zLgogQGVuZCB0YWJsZQogCiBAYyBtYW4gZW5kIEZPUk1BVCBPUFRJT05TCmRpZmYgLS1naXQgYS9kb2MvZ2VuZXJhbC50ZXhpIGIvZG9jL2dlbmVyYWwudGV4aQppbmRleCA1OWVhNGY0Li4yNTgzMDA2IDEwMDY0NAotLS0gYS9kb2MvZ2VuZXJhbC50ZXhpCisrKyBiL2RvYy9nZW5lcmFsLnRleGkKQEAgLTE3LDYgKzE3LDE0IEBACiBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSBwYXNzaW5nIHRoZSBhcHByb3ByaWF0ZSBmbGFncyB0bwogQGNvbW1hbmR7Li9jb25maWd1cmV9LgogCitAc2VjdGlvbiBBbGxpYW5jZSBmb3IgT3BlbiBNZWRpYSBsaWJhb20KKworRkZtcGVnIGNhbiBtYWtlIHVzZSBvZiB0aGUgbGliYW9tIGxpYnJhcnkgZm9yIEFWMSBkZWNvZGluZy4KKworR28gdG8gQHVybHtodHRwOi8vYW9tZWRpYS5vcmcvfSBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZm9yCitpbnN0YWxsaW5nIHRoZSBsaWJyYXJ5LiBUaGVuIHBhc3MgQGNvZGV7LS1lbmFibGUtbGliYW9tfSB0byBjb25maWd1cmUgdG8KK2VuYWJsZSBpdC4KKwogQHNlY3Rpb24gT3BlbkpQRUcKIAogRkZtcGVnIGNhbiB1c2UgdGhlIE9wZW5KUEVHIGxpYnJhcmllcyBmb3IgZW5jb2RpbmcvZGVjb2RpbmcgSjJLIHZpZGVvcy4gIEdvIHRvCkBAIC04NSw2ICs5MywyNCBAQAogaW5zdHJ1Y3Rpb25zIGZvciBpbnN0YWxsaW5nIHRoZSBsaWJyYXJ5LgogVGhlbiBwYXNzIEBjb2Rley0tZW5hYmxlLWxpYnR3b2xhbWV9IHRvIGNvbmZpZ3VyZSB0byBlbmFibGUgaXQuCiAKK0BzZWN0aW9uIGxpYmNvZGVjMiAvIGNvZGVjMiBnZW5lcmFsCisKK0ZGbXBlZyBjYW4gbWFrZSB1c2Ugb2YgbGliY29kZWMyIGZvciBjb2RlYzIgZW5jb2RpbmcgYW5kIGRlY29kaW5nLgorVGhlcmUgaXMgY3VycmVudGx5IG5vIG5hdGl2ZSBkZWNvZGVyLCBzbyBsaWJjb2RlYzIgbXVzdCBiZSB1c2VkIGZvciBkZWNvZGluZy4KKworR28gdG8gQHVybHtodHRwOi8vZnJlZWR2Lm9yZy99LCBkb3dubG9hZCAiQ29kZWMgMiBzb3VyY2UgYXJjaGl2ZSIuCitCdWlsZCBhbmQgaW5zdGFsbCB1c2luZyBDTWFrZS4gRGViaWFuIHVzZXJzIGNhbiBpbnN0YWxsIHRoZSBsaWJjb2RlYzItZGV2IHBhY2thZ2UgaW5zdGVhZC4KK09uY2UgbGliY29kZWMyIGlzIGluc3RhbGxlZCB5b3UgY2FuIHBhc3MgQGNvZGV7LS1lbmFibGUtbGliY29kZWMyfSB0byBjb25maWd1cmUgdG8gZW5hYmxlIGl0LgorCitUaGUgZWFzaWVzdCB3YXkgdG8gdXNlIGNvZGVjMiBpcyB3aXRoIC5jMiBmaWxlcywgc2luY2UgdGhleSBjb250YWluIHRoZSBtb2RlIGluZm9ybWF0aW9uIHJlcXVpcmVkIGZvciBkZWNvZGluZy4KK1RvIGVuY29kZSBzdWNoIGEgZmlsZSwgdXNlIGEgLmMyIGZpbGUgZXh0ZW5zaW9uIGFuZCBnaXZlIHRoZSBsaWJjb2RlYzIgZW5jb2RlciB0aGUgLW1vZGUgb3B0aW9uOgorQGNvZGV7ZmZtcGVnIC1pIGlucHV0LndhdiAtbW9kZSA3MDBDIG91dHB1dC5jMn0uCitQbGF5YmFjayBpcyBhcyBzaW1wbGUgYXMgQGNvZGV7ZmZwbGF5IG91dHB1dC5jMn0uCitGb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCBtb2RlcywgcnVuIEBjb2Rle2ZmbXBlZyAtaCBlbmNvZGVyPWxpYmNvZGVjMn0uCitSYXcgY29kZWMyIGZpbGVzIGFyZSBhbHNvIHN1cHBvcnRlZC4KK1RvIG1ha2Ugc2Vuc2Ugb2YgdGhlbSB0aGUgbW9kZSBpbiB1c2UgbmVlZHMgdG8gYmUgc3BlY2lmaWVkIGFzIGEgZm9ybWF0IG9wdGlvbjoKK0Bjb2Rle2ZmbXBlZyAtZiBjb2RlYzJyYXcgLW1vZGUgMTMwMCAtaSBpbnB1dC5yYXcgb3V0cHV0Lndhdn0uCisKIEBzZWN0aW9uIGxpYnZweAogCiBGRm1wZWcgY2FuIG1ha2UgdXNlIG9mIHRoZSBsaWJ2cHggbGlicmFyeSBmb3IgVlA4L1ZQOSBlbmNvZGluZy4KQEAgLTEwMSwxNCArMTI3LDI5IEBACiBpbnN0YWxsaW5nIHRoZSBsaWJyYXJ5LiBUaGVuIHBhc3MgQGNvZGV7LS1lbmFibGUtbGlid2F2cGFja30gdG8gY29uZmlndXJlIHRvCiBlbmFibGUgaXQuCiAKK0BzZWN0aW9uIGxpYnhhdnMKKworRkZtcGVnIGNhbiBtYWtlIHVzZSBvZiB0aGUgbGlieGF2cyBsaWJyYXJ5IGZvciBYYXZzIGVuY29kaW5nLgorCitHbyB0byBAdXJse2h0dHA6Ly94YXZzLnNmLm5ldC99IGFuZCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBmb3IKK2luc3RhbGxpbmcgdGhlIGxpYnJhcnkuIFRoZW4gcGFzcyBAY29kZXstLWVuYWJsZS1saWJ4YXZzfSB0byBjb25maWd1cmUgdG8KK2VuYWJsZSBpdC4KKwogQHNlY3Rpb24gT3BlbkgyNjQKIAotRkZtcGVnIGNhbiBtYWtlIHVzZSBvZiB0aGUgT3BlbkgyNjQgbGlicmFyeSBmb3IgSC4yNjQgZW5jb2RpbmcuCitGRm1wZWcgY2FuIG1ha2UgdXNlIG9mIHRoZSBPcGVuSDI2NCBsaWJyYXJ5IGZvciBILjI2NCBlbmNvZGluZyBhbmQgZGVjb2RpbmcuCiAKIEdvIHRvIEB1cmx7aHR0cDovL3d3dy5vcGVuaDI2NC5vcmcvfSBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZm9yCiBpbnN0YWxsaW5nIHRoZSBsaWJyYXJ5LiBUaGVuIHBhc3MgQGNvZGV7LS1lbmFibGUtbGlib3BlbmgyNjR9IHRvIGNvbmZpZ3VyZSB0bwogZW5hYmxlIGl0LgogCitGb3IgZGVjb2RpbmcsIHRoaXMgbGlicmFyeSBpcyBtdWNoIG1vcmUgbGltaXRlZCB0aGFuIHRoZSBidWlsdC1pbiBkZWNvZGVyCitpbiBsaWJhdmNvZGVjOyBjdXJyZW50bHksIHRoaXMgbGlicmFyeSBsYWNrcyBzdXBwb3J0IGZvciBkZWNvZGluZyBCLWZyYW1lcworYW5kIHNvbWUgb3RoZXIgbWFpbi9oaWdoIHByb2ZpbGUgZmVhdHVyZXMuIChJdCBjdXJyZW50bHkgb25seSBzdXBwb3J0cworY29uc3RyYWluZWQgYmFzZWxpbmUgcHJvZmlsZSBhbmQgQ0FCQUMuKSBVc2luZyBpdCBpcyBtb3N0bHkgdXNlZnVsIGZvcgordGVzdGluZyBhbmQgZm9yIHRha2luZyBhZHZhbnRhZ2Ugb2YgQ2lzY28ncyBwYXRlbnQgcG9ydGZvbGlvIGxpY2Vuc2UKKyhAdXJse2h0dHA6Ly93d3cub3BlbmgyNjQub3JnL0JJTkFSWV9MSUNFTlNFLnR4dH0pLgorCiBAc2VjdGlvbiB4MjY0CiAKIEZGbXBlZyBjYW4gbWFrZSB1c2Ugb2YgdGhlIHgyNjQgbGlicmFyeSBmb3IgSC4yNjQgZW5jb2RpbmcuCkBAIC0xODAsNiArMjIxLDE5IEBACiBAdXJse2h0dHBzOi8vZ2l0aHViLmNvbS9hdnhzeW50aC9hdnhzeW50aCwgQXZ4U3ludGh9LgogCiBAZmxvYXQgTk9URQorVGhlcmUgaXMgY3VycmVudGx5IGEgcmVncmVzc2lvbiBpbiBBdmlTeW50aCsncyBAY29kZXtjYXBpLmh9IGhlYWRlciBhcyBvZgorT2N0b2JlciAyMDE2LCB3aGljaCBpbnRlcmZlcmVzIHdpdGggdGhlIGFiaWxpdHkgZm9yIGJ1aWxkcyBvZiBGRm1wZWcgdG8gdXNlCitNU1ZDLWJ1aWx0IGJpbmFyaWVzIG9mIEF2aVN5bnRoLiBVbnRpbCB0aGlzIGlzIHJlc29sdmVkLCB5b3UgY2FuIG1ha2Ugc3VyZQorYSBrbm93biBnb29kIHZlcnNpb24gaXMgaW5zdGFsbGVkIGJ5IGNoZWNraW5nIG91dCBhIHZlcnNpb24gZnJvbSBiZWZvcmUKK3RoZSByZWdyZXNzaW9uIG9jY3VycmVkOgorCitAY29kZXtnaXQgY2xvbmUgLWIgTVQgZ2l0Oi8vZ2l0aHViLmNvbS9BdmlTeW50aC9BdmlTeW50aFBsdXMuZ2l0IEAqCitjZCBBdmlTeW50aFBsdXMgQCoKK2dpdCBjaGVja291dCAtYiBvbGRoZWFkZXIgYjRmMjkyYjRkYmZhZDE0OTY5N2ZiNjVjNmEwMzdiYjM4MTA4MTNmOSBAKgorbWFrZSBpbnN0YWxsIFBSRUZJWD0vaW5zdGFsbC9wcmVmaXh9CitAZW5kIGZsb2F0CisKK0BmbG9hdCBOT1RFCiBBdmlTeW50aCBhbmQgQXZ4U3ludGggYXJlIGxvYWRlZCBkeW5hbWljYWxseS4gIERpc3RyaWJ1dG9ycyBjYW4gYnVpbGQgRkZtcGVnCiB3aXRoIEBjb2Rley0tZW5hYmxlLWF2aXN5bnRofSwgYW5kIHRoZSBiaW5hcmllcyB3aWxsIHdvcmsgcmVnYXJkbGVzcyBvZiB0aGUKIGVuZCB1c2VyIGhhdmluZyBBdmlTeW50aCBvciBBdnhTeW50aCBpbnN0YWxsZWQgLSB0aGV5J2xsIG9ubHkgbmVlZCB0byBiZQpAQCAtMTk3LDYgKzI1MSwxOCBAQAogd2l0aCB0aGUgQGNvZGV7LS1lbmFibGUtbGlibWZ4fSBvcHRpb24gYW5kIEBjb2Rle3BrZy1jb25maWd9IG5lZWRzIHRvIGJlIGFibGUgdG8KIGxvY2F0ZSB0aGUgZGlzcGF0Y2hlcidzIEBjb2Rley5wY30gZmlsZXMuCiAKK0BzZWN0aW9uIEFNRCBWQ0UKKworRkZtcGVnIGNhbiB1c2UgdGhlIEFNRCBBZHZhbmNlZCBNZWRpYSBGcmFtZXdvcmsgbGlicmFyeSBmb3IgYWNjZWxlcmF0ZWQgSC4yNjQKK2FuZCBIRVZDIGVuY29kaW5nIG9uIFZDRSBlbmFibGVkIGhhcmR3YXJlIHVuZGVyIFdpbmRvd3MuCisKK1RvIGVuYWJsZSBzdXBwb3J0IHlvdSBtdXN0IG9idGFpbiB0aGUgQU1GIGZyYW1ld29yayBoZWFkZXIgZmlsZXMgZnJvbQorQHVybHtodHRwczovL2dpdGh1Yi5jb20vR1BVT3Blbi1MaWJyYXJpZXNBbmRTREtzL0FNRi5naXR9LgorCitDcmVhdGUgYW4gQGNvZGV7QU1GL30gZGlyZWN0b3J5IGluIHRoZSBzeXN0ZW0gaW5jbHVkZSBwYXRoLgorQ29weSB0aGUgY29udGVudHMgb2YgQGNvZGV7QU1GL2FtZi9wdWJsaWMvaW5jbHVkZS99IGludG8gdGhhdCBkaXJlY3RvcnkuCitUaGVuIGNvbmZpZ3VyZSBGRm1wZWcgd2l0aCBAY29kZXstLWVuYWJsZS1hbWZ9LgorCiAKIEBjaGFwdGVyIFN1cHBvcnRlZCBGaWxlIEZvcm1hdHMsIENvZGVjcyBvciBGZWF0dXJlcwogCkBAIC0yNjIsNiArMzI4LDEwIEBACiBAaXRlbSBCUlNUTSAgICAgICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKICAgICBAdGFiIEF1ZGlvIGZvcm1hdCB1c2VkIG9uIHRoZSBOaW50ZW5kbyBXaWkuCiBAaXRlbSBCV0YgICAgICAgICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKK0BpdGVtIGNvZGVjMiAocmF3KSAgICAgICAgICAgICAgQHRhYiBYIEB0YWIgWAorICAgIEB0YWIgTXVzdCBiZSBnaXZlbiAtbW9kZSBmb3JtYXQgb3B0aW9uIHRvIGRlY29kZSBjb3JyZWN0bHkuCitAaXRlbSBjb2RlYzIgKC5jMiBmaWxlcykgICAgICAgIEB0YWIgWCBAdGFiIFgKKyAgICBAdGFiIENvbnRhaW5zIGhlYWRlciB3aXRoIHZlcnNpb24gYW5kIG1vZGUgaW5mbywgc2ltcGxpZnlpbmcgcGxheWJhY2suCiBAaXRlbSBDUkkgQURYICAgICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKICAgICBAdGFiIEF1ZGlvLW9ubHkgZm9ybWF0IHVzZWQgaW4gY29uc29sZSB2aWRlbyBnYW1lcy4KIEBpdGVtIERpc2N3b3JsZCBJSSBCTVYgICAgICAgICAgQHRhYiAgIEB0YWIgWApAQCAtMzEzLDYgKzM4Myw3IEBACiBAaXRlbSBGdW5Db20gSVNTICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKICAgICBAdGFiIEF1ZGlvIGZvcm1hdCB1c2VkIGluIHZhcmlvdXMgZ2FtZXMgZnJvbSBGdW5Db20gbGlrZSBUaGUgTG9uZ2VzdCBKb3VybmV5LgogQGl0ZW0gRy43MjMuMSAgICAgICAgICAgICAgICAgICBAdGFiIFggQHRhYiBYCitAaXRlbSBHLjcyNiAgICAgICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFggQHRhYiBCb3RoIGxlZnQtIGFuZCByaWdodC1qdXN0aWZpZWQuCiBAaXRlbSBHLjcyOSBCSVQgICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKIEBpdGVtIEcuNzI5IHJhdyAgICAgICAgICAgICAgICAgQHRhYiAgIEB0YWIgWAogQGl0ZW0gR0VOSCAgICAgICAgICAgICAgICAgICAgICBAdGFiICAgQHRhYiBYCkBAIC0zMzUsNiArNDA2LDggQEAKIEBpdGVtIGlMQkMgICAgICAgICAgICAgICAgICAgICAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gSW50ZXJwbGF5IE1WRSAgICAgICAgICAgICBAdGFiICAgQHRhYiBYCiAgICAgQHRhYiBGb3JtYXQgdXNlZCBpbiB2YXJpb3VzIEludGVycGxheSBjb21wdXRlciBnYW1lcy4KK0BpdGVtIEl0ZXJhdGVkIFN5c3RlbXMgQ2xlYXJWaWRlbyBAdGFiICAgICBAdGFiICBYCisgICAgQHRhYiBJLWZyYW1lcyBvbmx5CiBAaXRlbSBJVjggICAgICAgICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKICAgICBAdGFiIEEgZm9ybWF0IGdlbmVyYXRlZCBieSBJbmRpZ29WaXNpb24gODAwMCB2aWRlbyBzZXJ2ZXIuCiBAaXRlbSBJVkYgKE9uMikgICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKQEAgLTM4MCw2ICs0NTMsNyBAQAogICAgIEB0YWIgQXVkaW8gZm9ybWF0IHVzZWQgb24gdGhlIFBTMy4KIEBpdGVtIE1pcmlsbGlzIEZJQyB2aWRlbyAgICAgICAgQHRhYiAgIEB0YWIgWAogICAgIEB0YWIgTm8gY3Vyc29yIHJlbmRlcmluZy4KK0BpdGVtIE1JREkgU2FtcGxlIER1bXAgU3RhbmRhcmQgQHRhYiAgIEB0YWIgWAogQGl0ZW0gTUlNRSBtdWx0aXBhcnQgSlBFRyAgICAgICBAdGFiIFggQHRhYgogQGl0ZW0gTVNOIFRDUCB3ZWJjYW0gICAgICAgICAgICBAdGFiICAgQHRhYiBYCiAgICAgQHRhYiBVc2VkIGJ5IE1TTiBNZXNzZW5nZXIgd2ViY2FtIHN0cmVhbXMuCkBAIC0zOTMsNiArNDY3LDcgQEAKIEBpdGVtIE5DIGNhbWVyYSBmZWVkICAgICAgICAgICAgQHRhYiAgIEB0YWIgWAogICAgIEB0YWIgTkMgKEFWSVAgTkM0NjAwKSBjYW1lcmEgc3RyZWFtcwogQGl0ZW0gTklTVCBTUGVlY2ggSEVhZGVyIFJFc291cmNlcyBAdGFiICAgQHRhYiBYCitAaXRlbSBDb21wdXRlcml6ZWQgU3BlZWNoIExhYiBOU1AgQHRhYiAgIEB0YWIgWAogQGl0ZW0gTlRUIFR3aW5WUSAoVlFGKSAgICAgICAgICBAdGFiICAgQHRhYiBYCiAgICAgQHRhYiBOaXBwb24gVGVsZWdyYXBoIGFuZCBUZWxlcGhvbmUgQ29ycG9yYXRpb24gVHdpblZRLgogQGl0ZW0gTnVsbHNvZnQgU3RyZWFtaW5nIFZpZGVvICBAdGFiICAgQHRhYiBYCkBAIC00MDcsNiArNDgyLDEwIEBACiBAaXRlbSBRQ1AgICAgICAgICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKIEBpdGVtIHJhdyBBRFRTIChBQUMpICAgICAgICAgICAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gcmF3IEFDLTMgICAgICAgICAgICAgICAgICBAdGFiIFggQHRhYiBYCitAaXRlbSByYXcgQU1SLU5CICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKK0BpdGVtIHJhdyBBTVItV0IgICAgICAgICAgICAgICAgQHRhYiAgIEB0YWIgWAorQGl0ZW0gcmF3IGFwdFggICAgICAgICAgICAgICAgICBAdGFiIFggQHRhYiBYCitAaXRlbSByYXcgYXB0WCBIRCAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKIEBpdGVtIHJhdyBDaGluZXNlIEFWUyB2aWRlbyAgICAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gcmF3IENSSSBBRFggICAgICAgICAgICAgICBAdGFiIFggQHRhYiBYCiBAaXRlbSByYXcgRGlyYWMgICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKQEAgLTQzMCw2ICs1MDksNyBAQAogQGl0ZW0gcmF3IE5VTEwgICAgICAgICAgICAgICAgICBAdGFiIFggQHRhYgogQGl0ZW0gcmF3IHZpZGVvICAgICAgICAgICAgICAgICBAdGFiIFggQHRhYiBYCiBAaXRlbSByYXcgaWQgUm9RICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiCitAaXRlbSByYXcgU0JDICAgICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKIEBpdGVtIHJhdyBTaG9ydGVuICAgICAgICAgICAgICAgQHRhYiAgIEB0YWIgWAogQGl0ZW0gcmF3IFRBSyAgICAgICAgICAgICAgICAgICBAdGFiICAgQHRhYiBYCiBAaXRlbSByYXcgVHJ1ZUhEICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKQEAgLTQ0Myw2ICs1MjMsOCBAQAogQGl0ZW0gcmF3IFBDTSBzaWduZWQgMjQgYml0IGxpdHRsZS1lbmRpYW4gIEB0YWIgWCBAdGFiIFgKIEBpdGVtIHJhdyBQQ00gc2lnbmVkIDMyIGJpdCBiaWctZW5kaWFuICBAdGFiIFggQHRhYiBYCiBAaXRlbSByYXcgUENNIHNpZ25lZCAzMiBiaXQgbGl0dGxlLWVuZGlhbiAgQHRhYiBYIEB0YWIgWAorQGl0ZW0gcmF3IFBDTSBzaWduZWQgNjQgYml0IGJpZy1lbmRpYW4gIEB0YWIgWCBAdGFiIFgKK0BpdGVtIHJhdyBQQ00gc2lnbmVkIDY0IGJpdCBsaXR0bGUtZW5kaWFuICBAdGFiIFggQHRhYiBYCiBAaXRlbSByYXcgUENNIHVuc2lnbmVkIDggYml0ICAgIEB0YWIgWCBAdGFiIFgKIEBpdGVtIHJhdyBQQ00gdW5zaWduZWQgMTYgYml0IGJpZy1lbmRpYW4gIEB0YWIgWCBAdGFiIFgKIEBpdGVtIHJhdyBQQ00gdW5zaWduZWQgMTYgYml0IGxpdHRsZS1lbmRpYW4gIEB0YWIgWCBAdGFiIFgKQEAgLTQ1MCw2ICs1MzIsOCBAQAogQGl0ZW0gcmF3IFBDTSB1bnNpZ25lZCAyNCBiaXQgbGl0dGxlLWVuZGlhbiAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gcmF3IFBDTSB1bnNpZ25lZCAzMiBiaXQgYmlnLWVuZGlhbiAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gcmF3IFBDTSB1bnNpZ25lZCAzMiBiaXQgbGl0dGxlLWVuZGlhbiAgQHRhYiBYIEB0YWIgWAorQGl0ZW0gcmF3IFBDTSAxNi44IGZsb2F0aW5nIHBvaW50IGxpdHRsZS1lbmRpYW4gQHRhYiAgIEB0YWIgWAorQGl0ZW0gcmF3IFBDTSAyNC4wIGZsb2F0aW5nIHBvaW50IGxpdHRsZS1lbmRpYW4gQHRhYiAgIEB0YWIgWAogQGl0ZW0gcmF3IFBDTSBmbG9hdGluZy1wb2ludCAzMiBiaXQgYmlnLWVuZGlhbiAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gcmF3IFBDTSBmbG9hdGluZy1wb2ludCAzMiBiaXQgbGl0dGxlLWVuZGlhbiAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gcmF3IFBDTSBmbG9hdGluZy1wb2ludCA2NCBiaXQgYmlnLWVuZGlhbiAgQHRhYiBYIEB0YWIgWApAQCAtNDcxLDEwICs1NTUsMTEgQEAKICAgICBAdGFiIE91dHB1dCBpcyBwZXJmb3JtZWQgYnkgcHVibGlzaGluZyBzdHJlYW0gdG8gUlRNUCBzZXJ2ZXIKIEBpdGVtIFJUUCAgICAgICAgICAgICAgICAgICAgICAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gUlRTUCAgICAgICAgICAgICAgICAgICAgICBAdGFiIFggQHRhYiBYCitAaXRlbSBTYW1wbGUgRHVtcCBlWGNoYW5nZSAgICAgIEB0YWIgICBAdGFiIFgKIEBpdGVtIFNBUCAgICAgICAgICAgICAgICAgICAgICAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gU0JHICAgICAgICAgICAgICAgICAgICAgICBAdGFiICAgQHRhYiBYCiBAaXRlbSBTRFAgICAgICAgICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKLUBpdGVtIFNlZ2EgRklMTS9DUEsgICAgICAgICAgICAgQHRhYiAgIEB0YWIgWAorQGl0ZW0gU2VnYSBGSUxNL0NQSyAgICAgICAgICAgICBAdGFiIFggQHRhYiBYCiAgICAgQHRhYiBVc2VkIGluIG1hbnkgU2VnYSBTYXR1cm4gY29uc29sZSBnYW1lcy4KIEBpdGVtIFNpbGljb24gR3JhcGhpY3MgTW92aWUgICAgQHRhYiAgIEB0YWIgWAogQGl0ZW0gU2llcnJhIFNPTCAgICAgICAgICAgICAgICBAdGFiICAgQHRhYiBYCkBAIC00ODUsNiArNTcwLDcgQEAKICAgICBAdGFiIE11bHRpbWVkaWEgZm9ybWF0IHVzZWQgYnkgbWFueSBnYW1lcy4KIEBpdGVtIFNNSlBFRyAgICAgICAgICAgICAgICAgICAgQHRhYiBYIEB0YWIgWAogICAgIEB0YWIgVXNlZCBpbiBjZXJ0YWluIExva2kgZ2FtZSBwb3J0cy4KK0BpdGVtIFNNUFRFIDMzN00gZW5jYXBzdWxhdGlvbiAgQHRhYiAgIEB0YWIgWAogQGl0ZW0gU211c2ggICAgICAgICAgICAgICAgICAgICBAdGFiICAgQHRhYiBYCiAgICAgQHRhYiBNdWx0aW1lZGlhIGZvcm1hdCB1c2VkIGluIHNvbWUgTHVjYXNBcnRzIGdhbWVzLgogQGl0ZW0gU29ueSBPcGVuTUcgKE9NQSkgICAgICAgICBAdGFiIFggQHRhYiBYCkBAIC00OTMsNyArNTc5LDcgQEAKIEBpdGVtIFNvbnkgV2F2ZTY0IChXNjQpICAgICAgICAgQHRhYiBYIEB0YWIgWAogQGl0ZW0gU29YIG5hdGl2ZSBmb3JtYXQgICAgICAgICBAdGFiIFggQHRhYiBYCiBAaXRlbSBTVU4gQVUgZm9ybWF0ICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKLUBpdGVtIFNVUCByYXcgUEdTIHN1YnRpdGxlcyAgICAgQHRhYiAgIEB0YWIgWAorQGl0ZW0gU1VQIHJhdyBQR1Mgc3VidGl0bGVzICAgICBAdGFiIFggQHRhYiBYCiBAaXRlbSBTVkFHICAgICAgICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKICAgICBAdGFiIEF1ZGlvIGZvcm1hdCB1c2VkIGluIEtvbmFtaSBQUzIgZ2FtZXMuCiBAaXRlbSBURFNDICAgICAgICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKQEAgLTUwMiw3ICs1ODgsNyBAQAogICAgIEB0YWIgVXNlZCBvbiB0aGUgTmludGVuZG8gR2FtZUN1YmUuCiBAaXRlbSBUaWVydGV4IExpbWl0ZWQgU0VRICAgICAgIEB0YWIgICBAdGFiIFgKICAgICBAdGFiIFRpZXJ0ZXggLnNlcSBmaWxlcyB1c2VkIGluIHRoZSBET1MgQ0QtUk9NIHZlcnNpb24gb2YgdGhlIGdhbWUgRmxhc2hiYWNrLgotQGl0ZW0gVHJ1ZSBBdWRpbyAgICAgICAgICAgICAgICBAdGFiICAgQHRhYiBYCitAaXRlbSBUcnVlIEF1ZGlvICAgICAgICAgICAgICAgIEB0YWIgWCBAdGFiIFgKIEBpdGVtIFZBRyAgICAgICAgICAgICAgICAgICAgICAgQHRhYiAgIEB0YWIgWAogICAgIEB0YWIgQXVkaW8gZm9ybWF0IHVzZWQgaW4gbWFueSBTb255IFBTMiBnYW1lcy4KIEBpdGVtIFZDLTEgdGVzdCBiaXRzdHJlYW0gICAgICAgQHRhYiBYIEB0YWIgWApAQCAtNTIwLDYgKzYwNiw3IEBACiAgICAgQHRhYiBNdWx0aW1lZGlhIGZvcm1hdCB1c2VkIGluIFdlc3R3b29kIFN0dWRpb3MgZ2FtZXMuCiBAaXRlbSBXZXN0d29vZCBTdHVkaW9zIFZRQSAgICAgIEB0YWIgICBAdGFiIFgKICAgICBAdGFiIE11bHRpbWVkaWEgZm9ybWF0IHVzZWQgaW4gV2VzdHdvb2QgU3R1ZGlvcyBnYW1lcy4KK0BpdGVtIFdpZGViYW5kIFNpbmdsZS1iaXQgRGF0YSAoV1NEKSBAdGFiICAgQHRhYiBYCiBAaXRlbSBXVkUgICAgICAgICAgICAgICAgICAgICAgIEB0YWIgICBAdGFiIFgKIEBpdGVtIFhNViAgICAgICAgICAgICAgICAgICAgICAgQHRhYiAgIEB0YWIgWAogICAgIEB0YWIgTWljcm9zb2Z0IHZpZGVvIGNvbnRhaW5lciB1c2VkIGluIFhib3ggZ2FtZXMuCkBAIC01NTUsNiArNjQyLDggQEAKICAgICBAdGFiIERpZ2l0YWwgUGljdHVyZSBFeGNoYW5nZQogQGl0ZW0gRVhSICAgICAgICAgIEB0YWIgICBAdGFiIFgKICAgICBAdGFiIE9wZW5FWFIKK0BpdGVtIEZJVFMgICAgICAgICBAdGFiIFggQHRhYiBYCisgICAgQHRhYiBGbGV4aWJsZSBJbWFnZSBUcmFuc3BvcnQgU3lzdGVtCiBAaXRlbSBKUEVHICAgICAgICAgQHRhYiBYIEB0YWIgWAogICAgIEB0YWIgUHJvZ3Jlc3NpdmUgSlBFRyBpcyBub3Qgc3VwcG9ydGVkLgogQGl0ZW0gSlBFRyAyMDAwICAgIEB0YWIgWCBAdGFiIFgKQEAgLTU3Niw2ICs2NjUsOCBAQAogQGl0ZW0gUE5HICAgICAgICAgIEB0YWIgWCBAdGFiIFgKIEBpdGVtIFBQTSAgICAgICAgICBAdGFiIFggQHRhYiBYCiAgICAgQHRhYiBQb3J0YWJsZSBQaXhlbE1hcCBpbWFnZQorQGl0ZW0gUFNEICAgICAgICAgIEB0YWIgICBAdGFiIFgKKyAgICBAdGFiIFBob3Rvc2hvcAogQGl0ZW0gUFRYICAgICAgICAgIEB0YWIgICBAdGFiIFgKICAgICBAdGFiIFYuRmxhc2ggUFRYIGZvcm1hdAogQGl0ZW0gU0dJICAgICAgICAgIEB0YWIgWCBAdGFiIFgKQEAgLTU5Miw2ICs2ODMsOCBAQAogICAgIEB0YWIgWCBCaXRNYXAgaW1hZ2UgZm9ybWF0CiBAaXRlbSBYRmFjZSBAdGFiIFggQHRhYiBYCiAgICAgQHRhYiBYLUZhY2UgaW1hZ2UgZm9ybWF0CitAaXRlbSBYUE0gIEB0YWIgICBAdGFiIFgKKyAgICBAdGFiIFggUGl4TWFwIGltYWdlIGZvcm1hdAogQGl0ZW0gWFdEICBAdGFiIFggQHRhYiBYCiAgICAgQHRhYiBYIFdpbmRvdyBEdW1wIGltYWdlIGZvcm1hdAogQGVuZCBtdWx0aXRhYmxlCkBAIC02MTcsNiArNzEwLDcgQEAKIEBpdGVtIEFOU0kvQVNDSUkgYXJ0ICAgICAgICAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gQXBwbGUgSW50ZXJtZWRpYXRlIENvZGVjIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIEFwcGxlIE1KUEVHLUIgICAgICAgICAgQHRhYiAgICAgQHRhYiAgWAorQGl0ZW0gQXBwbGUgUGl4bGV0ICAgICAgICAgICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBBcHBsZSBQcm9SZXMgICAgICAgICAgIEB0YWIgIFggIEB0YWIgIFgKIEBpdGVtIEFwcGxlIFF1aWNrRHJhdyAgICAgICAgQHRhYiAgICAgQHRhYiAgWAogICAgIEB0YWIgZm91cmNjOiBxZHJ3CkBAIC02MzMsNiArNzI3LDggQEAKIEBpdGVtIEF1dG9kZXNrIEFuaW1hdG9yIEZsaWMgdmlkZW8gIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIEF1dG9kZXNrIFJMRSAgICAgICAgICAgQHRhYiAgICAgQHRhYiAgWAogICAgIEB0YWIgZm91cmNjOiBBQVNDCitAaXRlbSBBVjEgICAgICAgICAgICAgICAgICAgIEB0YWIgICAgIEB0YWIgIEUKKyAgICBAdGFiIFN1cHBvcnRlZCB0aHJvdWdoIGV4dGVybmFsIGxpYnJhcnkgbGliYW9tCiBAaXRlbSBBdmlkIDE6MSAxMC1iaXQgUkdCIFBhY2tlciAgQHRhYiAgWCAgQHRhYiAgWAogICAgIEB0YWIgZm91cmNjOiBBVnJwCiBAaXRlbSBBVlMgKEF1ZGlvIFZpZGVvIFN0YW5kYXJkKSB2aWRlbyAgQHRhYiAgICAgQHRhYiAgWApAQCAtNjQzLDYgKzczOSw3IEBACiBAaXRlbSBCZXRoZXNkYSBWSUQgdmlkZW8gICAgIEB0YWIgICAgIEB0YWIgIFgKICAgICBAdGFiIFVzZWQgaW4gc29tZSBnYW1lcyBmcm9tIEJldGhlc2RhIFNvZnR3b3Jrcy4KIEBpdGVtIEJpbmsgVmlkZW8gICAgICAgICAgICAgQHRhYiAgICAgQHRhYiAgWAorQGl0ZW0gQml0SmF6eiBTaGVlclZpZGVvICAgICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBCaXRtYXAgQnJvdGhlcnMgSlYgdmlkZW8gIEB0YWIgICBAdGFiIFgKIEBpdGVtIHk0MXAgQnJvb2t0cmVlIHVuY29tcHJlc3NlZCA0OjE6MSAxMi1iaXQgICAgIEB0YWIgIFggIEB0YWIgIFgKIEBpdGVtIEJydXRlIEZvcmNlICYgSWdub3JhbmNlICAgQHRhYiAgIEB0YWIgWApAQCAtNjY5LDcgKzc2Niw3IEBACiBAaXRlbSBERkEgICAgICAgICAgICAgICAgICAgIEB0YWIgICAgIEB0YWIgIFgKICAgICBAdGFiIENvZGVjIHVzZWQgaW4gQ2hyb25vbWFzdGVyIGdhbWUuCiBAaXRlbSBEaXJhYyAgICAgICAgICAgICAgICAgIEB0YWIgIEUgIEB0YWIgIFgKLSAgICBAdGFiIHN1cHBvcnRlZCB0aHJvdWdoIGV4dGVybmFsIGxpYnJhcnkgbGlic2Nocm9lZGluZ2VyCisgICAgQHRhYiBzdXBwb3J0ZWQgdGhvdWdoIHRoZSBuYXRpdmUgdmMyIChEaXJhYyBQcm8pIGVuY29kZXIKIEBpdGVtIERlbHV4ZSBQYWludCBBbmltYXRpb24gQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gRE54SEQgICAgICAgICAgICAgICAgICBAdGFiICAgWCBAdGFiICBYCiAgICAgQHRhYiBha2EgU01QVEUgVkMzCkBAIC02NzcsNiArNzc0LDggQEAKICAgICBAdGFiIGZvdXJjYzogRFVDSwogQGl0ZW0gRHVjayBUcnVlTW90aW9uIDIuMCAgICBAdGFiICAgICBAdGFiICBYCiAgICAgQHRhYiBmb3VyY2M6IFRNMjAKK0BpdGVtIER1Y2sgVHJ1ZU1vdGlvbiAyLjAgUlQgQHRhYiAgICAgQHRhYiAgWAorICAgIEB0YWIgZm91cmNjOiBUUjIwCiBAaXRlbSBEViAoRGlnaXRhbCBWaWRlbykgICAgIEB0YWIgIFggIEB0YWIgIFgKIEBpdGVtIER4dG9yeSBjYXB0dXJlIGZvcm1hdCAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gRmVlYmxlIEZpbGVzL1NjdW1tVk0gRFhBICBAdGFiICAgICBAdGFiICBYCkBAIC02OTYsNiArNzk1LDcgQEAKIEBpdGVtIEZsYXNoIFNjcmVlbiBWaWRlbyB2MiAgQHRhYiAgWCAgQHRhYiAgWAogQGl0ZW0gRmxhc2ggVmlkZW8gKEZMVikgICAgICBAdGFiICBYICBAdGFiICBYCiAgICAgQHRhYiBTb3JlbnNvbiBILjI2MyB1c2VkIGluIEZsYXNoCitAaXRlbSBGTSBTY3JlZW4gQ2FwdHVyZSBDb2RlYyAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gRm9yd2FyZCBVbmNvbXByZXNzZWQgICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBGcmFwcyAgICAgICAgICAgICAgICAgIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIEdvMk1lZXRpbmcgICAgICAgICAgICAgQHRhYiAgICAgQHRhYiAgWApAQCAtNzQzLDYgKzg0Myw4IEBACiBAaXRlbSBMdWNhc0FydHMgU0FOTS9TbXVzaCAgIEB0YWIgICAgIEB0YWIgIFgKICAgICBAdGFiIFVzZWQgaW4gTHVjYXNBcnRzIGdhbWVzIC8gU01VU0ggYW5pbWF0aW9ucy4KIEBpdGVtIGxvc3NsZXNzIE1KUEVHICAgICAgICAgQHRhYiAgWCAgQHRhYiAgWAorQGl0ZW0gTWFnaWNZVVYgVmlkZW8gICAgICAgICBAdGFiICBYICBAdGFiICBYCitAaXRlbSBNYW5kc29mdCBTY3JlZW4gQ2FwdHVyZSBDb2RlYyAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gTWljcm9zb2Z0IEFUQyBTY3JlZW4gICBAdGFiICAgICBAdGFiICBYCiAgICAgQHRhYiBBbHNvIGtub3duIGFzIE1pY3Jvc29mdCBTY3JlZW4gMy4KIEBpdGVtIE1pY3Jvc29mdCBFeHByZXNzaW9uIEVuY29kZXIgU2NyZWVuICBAdGFiICAgICBAdGFiICBYCkBAIC03NjcsNiArODY5LDcgQEAKIEBpdGVtIE1QRUctNCBwYXJ0IDIgTWljcm9zb2Z0IHZhcmlhbnQgdmVyc2lvbiAxICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBNUEVHLTQgcGFydCAyIE1pY3Jvc29mdCB2YXJpYW50IHZlcnNpb24gMiAgQHRhYiAgWCAgQHRhYiAgWAogQGl0ZW0gTVBFRy00IHBhcnQgMiBNaWNyb3NvZnQgdmFyaWFudCB2ZXJzaW9uIDMgIEB0YWIgIFggIEB0YWIgIFgKK0BpdGVtIE5ld3RlayBTcGVlZEhRICAgICAgICAgICAgICAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gTmludGVuZG8gR2FtZWN1YmUgVEhQIHZpZGVvICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBOdXBwZWxWaWRlby9SVGpwZWcgICAgIEB0YWIgICAgIEB0YWIgIFgKICAgICBAdGFiIFZpZGVvIGVuY29kaW5nIHVzZWQgaW4gTnVwcGVsVmlkZW8gZmlsZXMuCkBAIC04MDcsNyArOTEwLDkgQEAKICAgICBAdGFiIFRleHR1cmUgZGljdGlvbmFyaWVzIHVzZWQgYnkgdGhlIFJlbmRlcndhcmUgRW5naW5lLgogQGl0ZW0gUkwyIHZpZGVvICAgICAgICAgICAgICBAdGFiICAgICBAdGFiICBYCiAgICAgQHRhYiB1c2VkIGluIHNvbWUgZ2FtZXMgYnkgRW50ZXJ0YWlubWVudCBTb2Z0d2FyZSBQYXJ0bmVycworQGl0ZW0gU2NyZWVuUHJlc3NvciAgICAgICAgICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBTY3JlZW5wcmVzc28gICAgICAgICAgIEB0YWIgICAgIEB0YWIgIFgKK0BpdGVtIFNjcmVlbiBSZWNvcmRlciBHb2xkIENvZGVjICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBTaWVycmEgVk1EIHZpZGVvICAgICAgIEB0YWIgICAgIEB0YWIgIFgKICAgICBAdGFiIFVzZWQgaW4gU2llcnJhIFZNRCBmaWxlcy4KIEBpdGVtIFNpbGljb24gR3JhcGhpY3MgTW90aW9uIFZpZGVvIENvbXByZXNzb3IgMSAoTVZDMSkgIEB0YWIgICAgIEB0YWIgIFgKQEAgLTg3NSw3ICs5ODAsNyBAQAogQGl0ZW0gOFNWWCBleHBvbmVudGlhbCAgICAgICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSA4U1ZYIGZpYm9uYWNjaSAgICAgICAgIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIEFBQyAgICAgICAgICAgICAgICAgICAgQHRhYiBFWCAgQHRhYiAgWAotICAgIEB0YWIgZW5jb2Rpbmcgc3VwcG9ydGVkIHRocm91Z2ggaW50ZXJuYWwgZW5jb2RlciBhbmQgZXh0ZXJuYWwgbGlicmFyaWVzIGxpYmZhYWMgYW5kIGxpYmZkay1hYWMKKyAgICBAdGFiIGVuY29kaW5nIHN1cHBvcnRlZCB0aHJvdWdoIGludGVybmFsIGVuY29kZXIgYW5kIGV4dGVybmFsIGxpYnJhcnkgbGliZmRrLWFhYwogQGl0ZW0gQUFDKyAgICAgICAgICAgICAgICAgICBAdGFiICBFICBAdGFiICBJWAogICAgIEB0YWIgZW5jb2Rpbmcgc3VwcG9ydGVkIHRocm91Z2ggZXh0ZXJuYWwgbGlicmFyeSBsaWJmZGstYWFjCiBAaXRlbSBBQy0zICAgICAgICAgICAgICAgICAgIEB0YWIgSVggIEB0YWIgIElYCkBAIC05MzYsNiArMTA0MSwxMCBAQAogQGl0ZW0gQW1hemluZyBTdHVkaW8gUEFGIEF1ZGlvIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIEFwcGxlIGxvc3NsZXNzIGF1ZGlvICAgQHRhYiAgWCAgQHRhYiAgWAogICAgIEB0YWIgUXVpY2tUaW1lIGZvdXJjYyAnYWxhYycKK0BpdGVtIGFwdFggICAgICAgICAgICAgICAgICAgQHRhYiAgWCAgQHRhYiAgWAorICAgIEB0YWIgVXNlZCBpbiBCbHVldG9vdGggQTJEUAorQGl0ZW0gYXB0WCBIRCAgICAgICAgICAgICAgICBAdGFiICBYICBAdGFiICBYCisgICAgQHRhYiBVc2VkIGluIEJsdWV0b290aCBBMkRQCiBAaXRlbSBBVFJBQzEgICAgICAgICAgICAgICAgIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIEFUUkFDMyAgICAgICAgICAgICAgICAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gQVRSQUMzKyAgICAgICAgICAgICAgICBAdGFiICAgICBAdGFiICBYCkBAIC05NDMsNiArMTA1Miw4IEBACiAgICAgQHRhYiBVc2VkIGluIEJpbmsgYW5kIFNtYWNrZXIgZmlsZXMgaW4gbWFueSBnYW1lcy4KIEBpdGVtIENFTFQgICAgICAgICAgICAgICAgICAgQHRhYiAgICAgQHRhYiAgRQogICAgIEB0YWIgZGVjb2Rpbmcgc3VwcG9ydGVkIHRocm91Z2ggZXh0ZXJuYWwgbGlicmFyeSBsaWJjZWx0CitAaXRlbSBjb2RlYzIgICAgICAgICAgICAgICAgIEB0YWIgIEUgIEB0YWIgIEUKKyAgICBAdGFiIGVuL2RlY29kaW5nIHN1cHBvcnRlZCB0aHJvdWdoIGV4dGVybmFsIGxpYnJhcnkgbGliY29kZWMyCiBAaXRlbSBEZWxwaGluZSBTb2Z0d2FyZSBJbnRlcm5hdGlvbmFsIENJTiBhdWRpbyAgQHRhYiAgICAgQHRhYiAgWAogICAgIEB0YWIgQ29kZWMgdXNlZCBpbiBEZWxwaGluZSBTb2Z0d2FyZSBJbnRlcm5hdGlvbmFsIGdhbWVzLgogQGl0ZW0gRGlnaXRhbCBTcGVlY2ggU3RhbmRhcmQgLSBTdGFuZGFyZCBQbGF5IG1vZGUgKERTUyBTUCkgQHRhYiAgICAgQHRhYiAgWApAQCAtOTUwLDcgKzEwNjEsOCBAQAogQGl0ZW0gQ09PSyAgICAgICAgICAgICAgICAgICBAdGFiICAgICBAdGFiICBYCiAgICAgQHRhYiBBbGwgdmVyc2lvbnMgZXhjZXB0IDUuMSBhcmUgc3VwcG9ydGVkLgogQGl0ZW0gRENBIChEVFMgQ29oZXJlbnQgQWNvdXN0aWNzKSAgQHRhYiAgWCAgQHRhYiAgWAotICAgIEB0YWIgc3VwcG9ydGVkIGV4dGVuc2lvbnM6IFhDaCwgWExMIChwYXJ0aWFsbHkpCisgICAgQHRhYiBzdXBwb3J0ZWQgZXh0ZW5zaW9uczogWENoLCBYWENILCBYOTYsIFhCUiwgWExMLCBMQlIgKHBhcnRpYWxseSkKK0BpdGVtIERvbGJ5IEUgIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIERQQ00gaWQgUm9RICAgICAgICAgICAgQHRhYiAgWCAgQHRhYiAgWAogICAgIEB0YWIgVXNlZCBpbiBRdWFrZSBJSUksIEplZGkgS25pZ2h0IDIgYW5kIG90aGVyIGNvbXB1dGVyIGdhbWVzLgogQGl0ZW0gRFBDTSBJbnRlcnBsYXkgICAgICAgICBAdGFiICAgICBAdGFiICBYCkBAIC05NjcsNiArMTA3OSw3IEBACiBAaXRlbSBEU0QgKERpcmVjdCBTdHJlYW0gRGlnaXRpYWwpLCBsZWFzdCBzaWduaWZpY2FudCBiaXQgZmlyc3QsIHBsYW5hciAgQHRhYiAgQHRhYiAgWAogQGl0ZW0gRFNEIChEaXJlY3QgU3RyZWFtIERpZ2l0aWFsKSwgbW9zdCBzaWduaWZpY2FudCBiaXQgZmlyc3QsIHBsYW5hciAgIEB0YWIgIEB0YWIgIFgKIEBpdGVtIERTUCBHcm91cCBUcnVlU3BlZWNoICAgQHRhYiAgICAgQHRhYiAgWAorQGl0ZW0gRFNUIChEaXJlY3QgU3RyZWFtIFRyYW5zZmVyKSBAdGFiICBAdGFiICBYCiBAaXRlbSBEViBhdWRpbyAgICAgICAgICAgICAgIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIEVuaGFuY2VkIEFDLTMgICAgICAgICAgQHRhYiAgWCAgQHRhYiAgWAogQGl0ZW0gRVZSQyAoRW5oYW5jZWQgVmFyaWFibGUgUmF0ZSBDb2RlYykgQHRhYiAgICAgQHRhYiAgWApAQCAtOTg0LDcgKzEwOTcsNyBAQAogQGl0ZW0gSW50ZXJwbGF5IEFDTSAgICAgICAgICAgIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIE1BQ0UgKE1hY2ludG9zaCBBdWRpbyBDb21wcmVzc2lvbi9FeHBhbnNpb24pIDM6MSAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gTUFDRSAoTWFjaW50b3NoIEF1ZGlvIENvbXByZXNzaW9uL0V4cGFuc2lvbikgNjoxICBAdGFiICAgICBAdGFiICBYCi1AaXRlbSBNTFAgKE1lcmlkaWFuIExvc3NsZXNzIFBhY2tpbmcpICBAdGFiICAgICBAdGFiICBYCitAaXRlbSBNTFAgKE1lcmlkaWFuIExvc3NsZXNzIFBhY2tpbmcpICBAdGFiICBYICBAdGFiICBYCiAgICAgQHRhYiBVc2VkIGluIERWRC1BdWRpbyBkaXNjcy4KIEBpdGVtIE1vbmtleSdzIEF1ZGlvICAgICAgICAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gTVAxIChNUEVHIGF1ZGlvIGxheWVyIDEpICBAdGFiICAgICBAdGFiIElYCkBAIC0xMDI4LDYgKzExNDEsNyBAQAogQGl0ZW0gUENNIHVuc2lnbmVkIDMyLWJpdCBsaXR0bGUtZW5kaWFuICBAdGFiICBYICBAdGFiICBYCiBAaXRlbSBQQ00gWm9yayAgICAgICAgICAgICAgIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIFFDRUxQIC8gUHVyZVZvaWNlICAgICAgQHRhYiAgICAgQHRhYiAgWAorQGl0ZW0gUURlc2lnbiBNdXNpYyBDb2RlYyAxICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBRRGVzaWduIE11c2ljIENvZGVjIDIgIEB0YWIgICAgIEB0YWIgIFgKICAgICBAdGFiIFRoZXJlIGFyZSBzdGlsbCBzb21lIGRpc3RvcnRpb25zLgogQGl0ZW0gUmVhbEF1ZGlvIDEuMCAoMTQuNEspICBAdGFiICBYICBAdGFiICBYCkBAIC0xMDM4LDYgKzExNTIsOCBAQAogICAgIEB0YWIgUmVhbCBsb3cgYml0cmF0ZSBBQy0zIGNvZGVjCiBAaXRlbSBSZWFsQXVkaW8gTG9zc2xlc3MgICAgIEB0YWIgICAgIEB0YWIgIFgKIEBpdGVtIFJlYWxBdWRpbyBTSVBSIC8gQUNFTFAuTkVUIEB0YWIgICAgIEB0YWIgIFgKK0BpdGVtIFNCQyAobG93LWNvbXBsZXhpdHkgc3ViYmFuZCBjb2RlYykgQHRhYiAgWCAgQHRhYiAgWAorICAgIEB0YWIgVXNlZCBpbiBCbHVldG9vdGggQTJEUAogQGl0ZW0gU2hvcnRlbiAgICAgICAgICAgICAgICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBTaWVycmEgVk1EIGF1ZGlvICAgICAgIEB0YWIgICAgIEB0YWIgIFgKICAgICBAdGFiIFVzZWQgaW4gU2llcnJhIFZNRCBmaWxlcy4KQEAgLTEwNTEsNyArMTE2Nyw3IEBACiAgICAgQHRhYiBzdXBwb3J0ZWQgdGhyb3VnaCBleHRlcm5hbCBsaWJyYXJ5IGxpYnNwZWV4CiBAaXRlbSBUQUsgKFRvbSdzIGxvc3NsZXNzIEF1ZGlvIEtvbXByZXNzb3IpICBAdGFiICAgICBAdGFiICBYCiBAaXRlbSBUcnVlIEF1ZGlvIChUVEEpICAgICAgIEB0YWIgIFggIEB0YWIgIFgKLUBpdGVtIFRydWVIRCAgICAgICAgICAgICAgICAgQHRhYiAgICAgQHRhYiAgWAorQGl0ZW0gVHJ1ZUhEICAgICAgICAgICAgICAgICBAdGFiICBYICBAdGFiICBYCiAgICAgQHRhYiBVc2VkIGluIEhELURWRCBhbmQgQmx1LVJheSBkaXNjcy4KIEBpdGVtIFR3aW5WUSAoVlFGIGZsYXZvcikgICAgQHRhYiAgICAgQHRhYiAgWAogQGl0ZW0gVklNQSAgICAgICAgICAgICAgICAgICBAdGFiICAgICBAdGFiICBYCkBAIC0xMTI0LDYgKzEyNDAsNyBAQAogQGl0ZW0gTU1TSCAgICAgICAgIEB0YWIgWAogQGl0ZW0gTU1TVCAgICAgICAgIEB0YWIgWAogQGl0ZW0gcGlwZSAgICAgICAgIEB0YWIgWAorQGl0ZW0gUHJvLU1QRUcgRkVDIEB0YWIgWAogQGl0ZW0gUlRNUCAgICAgICAgIEB0YWIgWAogQGl0ZW0gUlRNUEUgICAgICAgIEB0YWIgWAogQGl0ZW0gUlRNUFMgICAgICAgIEB0YWIgWApkaWZmIC0tZ2l0IGEvZG9jL2dpdC1ob3d0by50ZXhpIGIvZG9jL2dpdC1ob3d0by50ZXhpCmluZGV4IGU1ZTNjODEuLjJiNGZiODAgMTAwNjQ0Ci0tLSBhL2RvYy9naXQtaG93dG8udGV4aQorKysgYi9kb2MvZ2l0LWhvd3RvLnRleGkKQEAgLTQwOCw3ICs0MDgsNyBAQAogQGNvbW1hbmR7Z2l0IGxvZyAtcCAxMjM0NTY3Li45ODc2NTR9LiBUaGUgQGNvbW1hbmR7Z2l0IHN0YXR1c30gY29tbWFuZAogbWF5IGhlbHAgaW4gZmluZGluZyBsb2NhbCBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIGZvcmdvdHRlbiB0byBiZSBhZGRlZC4KIAotTmV4dCBsZXQgdGhlIGNvZGUgcGFzcyB0aHJvdWdoIGEgZnVsbCBydW4gb2Ygb3VyIHRlc3RzdWl0ZS4KK05leHQgbGV0IHRoZSBjb2RlIHBhc3MgdGhyb3VnaCBhIGZ1bGwgcnVuIG9mIG91ciB0ZXN0IHN1aXRlLgogCiBAaXRlbWl6ZQogQGl0ZW0gQGNvbW1hbmR7bWFrZSBkaXN0Y2xlYW59CkBAIC00MTgsNyArNDE4LDcgQEAKIEBlbmQgaXRlbWl6ZQogCiBNYWtlIHN1cmUgYWxsIHlvdXIgY2hhbmdlcyBoYXZlIGJlZW4gY2hlY2tlZCBiZWZvcmUgcHVzaGluZyB0aGVtLCB0aGUKLXRlc3RzdWl0ZSBvbmx5IGNoZWNrcyBhZ2FpbnN0IHJlZ3Jlc3Npb25zIGFuZCB0aGF0IG9ubHkgdG8gc29tZSBleHRlbmQuIEl0IGRvZXMKK3Rlc3Qgc3VpdGUgb25seSBjaGVja3MgYWdhaW5zdCByZWdyZXNzaW9ucyBhbmQgdGhhdCBvbmx5IHRvIHNvbWUgZXh0ZW5kLiBJdCBkb2VzCiBvYnZpb3VzbHkgbm90IGNoZWNrIG5ld2x5IGFkZGVkIGZlYXR1cmVzL2NvZGUgdG8gYmUgd29ya2luZyB1bmxlc3MgeW91IGhhdmUKIGFkZGVkIGEgdGVzdCBmb3IgdGhhdCAod2hpY2ggaXMgcmVjb21tZW5kZWQpLgogCmRpZmYgLS1naXQgYS9kb2MvaW5kZXZzLnRleGkgYi9kb2MvaW5kZXZzLnRleGkKaW5kZXggM2ZiODUyYi4uNjk1MTk0MCAxMDA2NDQKLS0tIGEvZG9jL2luZGV2cy50ZXhpCisrKyBiL2RvYy9pbmRldnMudGV4aQpAQCAtNjMsMTIgKzYzLDUxIEBACiAKIEBlbmQgdGFibGUKIAorQHNlY3Rpb24gYW5kcm9pZF9jYW1lcmEKKworQW5kcm9pZCBjYW1lcmEgaW5wdXQgZGV2aWNlLgorCitUaGlzIGlucHV0IGRldmljZXMgdXNlcyB0aGUgQW5kcm9pZCBDYW1lcmEyIE5ESyBBUEkgd2hpY2ggaXMKK2F2YWlsYWJsZSBvbiBkZXZpY2VzIHdpdGggQVBJIGxldmVsIDI0Ky4gVGhlIGF2YWlsYWJpbGl0eSBvZgorYW5kcm9pZF9jYW1lcmEgaXMgYXV0b2RldGVjdGVkIGR1cmluZyBjb25maWd1cmF0aW9uLgorCitUaGlzIGRldmljZSBhbGxvd3MgY2FwdHVyaW5nIGZyb20gYWxsIGNhbWVyYXMgb24gYW4gQW5kcm9pZCBkZXZpY2UsCit3aGljaCBhcmUgaW50ZWdyYXRlZCBpbnRvIHRoZSBDYW1lcmEyIE5ESyBBUEkuCisKK1RoZSBhdmFpbGFibGUgY2FtZXJhcyBhcmUgZW51bWVyYXRlZCBpbnRlcm5hbGx5IGFuZCBjYW4gYmUgc2VsZWN0ZWQKK3dpdGggdGhlIEB2YXJ7Y2FtZXJhX2luZGV4fSBwYXJhbWV0ZXIuIFRoZSBpbnB1dCBmaWxlIHN0cmluZyBpcworZGlzY2FyZGVkLgorCitHZW5lcmFsbHkgdGhlIGJhY2sgZmFjaW5nIGNhbWVyYSBoYXMgaW5kZXggMCB3aGlsZSB0aGUgZnJvbnQgZmFjaW5nCitjYW1lcmEgaGFzIGluZGV4IDEuCisKK0BzdWJzZWN0aW9uIE9wdGlvbnMKKworQHRhYmxlIEBvcHRpb24KKworQGl0ZW0gdmlkZW9fc2l6ZQorU2V0IHRoZSB2aWRlbyBzaXplIGdpdmVuIGFzIGEgc3RyaW5nIHN1Y2ggYXMgNjQweDQ4MCBvciBoZDcyMC4KK0ZhbGxzIGJhY2sgdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIHJlcG9ydGVkIGJ5CitBbmRyb2lkIGlmIHJlcXVlc3RlZCB2aWRlbyBzaXplIGlzIG5vdCBhdmFpbGFibGUgb3IgYnkgZGVmYXVsdC4KKworQGl0ZW0gZnJhbWVyYXRlCitTZXQgdGhlIHZpZGVvIGZyYW1lcmF0ZS4KK0ZhbGxzIGJhY2sgdG8gdGhlIGZpcnN0IGF2YWlsYWJsZSBjb25maWd1cmF0aW9uIHJlcG9ydGVkIGJ5CitBbmRyb2lkIGlmIHJlcXVlc3RlZCBmcmFtZXJhdGUgaXMgbm90IGF2YWlsYWJsZSBvciBieSBkZWZhdWx0ICgtMSkuCisKK0BpdGVtIGNhbWVyYV9pbmRleAorU2V0IHRoZSBpbmRleCBvZiB0aGUgY2FtZXJhIHRvIHVzZS4gRGVmYXVsdCBpcyAwLgorCitAaXRlbSBpbnB1dF9xdWV1ZV9zaXplCitTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYW1lcyB0byBidWZmZXIuIERlZmF1bHQgaXMgNS4KKworQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBhdmZvdW5kYXRpb24KIAogQVZGb3VuZGF0aW9uIGlucHV0IGRldmljZS4KIAogQVZGb3VuZGF0aW9uIGlzIHRoZSBjdXJyZW50bHkgcmVjb21tZW5kZWQgZnJhbWV3b3JrIGJ5IEFwcGxlIGZvciBzdHJlYW1ncmFiYmluZyBvbiBPU1ggPj0gMTAuNyBhcyB3ZWxsIGFzIG9uIGlPUy4KLVRoZSBvbGRlciBRVEtpdCBmcmFtZXdvcmsgaGFzIGJlZW4gbWFya2VkIGRlcHJlY2F0ZWQgc2luY2UgT1NYIHZlcnNpb24gMTAuNy4KIAogVGhlIGlucHV0IGZpbGVuYW1lIGhhcyB0byBiZSBnaXZlbiBpbiB0aGUgZm9sbG93aW5nIHN5bnRheDoKIEBleGFtcGxlCkBAIC0yMTUsOCArMjU0LDkgQEAKIGFuZCBAY29kZXstLWV4dHJhLWxkZmxhZ3N9LgogT24gV2luZG93cywgeW91IG5lZWQgdG8gcnVuIHRoZSBJREwgZmlsZXMgdGhyb3VnaCBAY29tbWFuZHt3aWRsfS4KIAotRGVja0xpbmsgaXMgdmVyeSBwaWNreSBhYm91dCB0aGUgZm9ybWF0cyBpdCBzdXBwb3J0cy4gUGl4ZWwgZm9ybWF0IGlzCi11eXZ5NDIyIG9yIHYyMTAsIGZyYW1lcmF0ZSBhbmQgdmlkZW8gc2l6ZSBtdXN0IGJlIGRldGVybWluZWQgZm9yIHlvdXIgZGV2aWNlIHdpdGgKK0RlY2tMaW5rIGlzIHZlcnkgcGlja3kgYWJvdXQgdGhlIGZvcm1hdHMgaXQgc3VwcG9ydHMuIFBpeGVsIGZvcm1hdCBvZiB0aGUKK2lucHV0IGNhbiBiZSBzZXQgd2l0aCBAb3B0aW9ue3Jhd19mb3JtYXR9LgorRnJhbWVyYXRlIGFuZCB2aWRlbyBzaXplIG11c3QgYmUgZGV0ZXJtaW5lZCBmb3IgeW91ciBkZXZpY2Ugd2l0aAogQGNvbW1hbmR7LWxpc3RfZm9ybWF0cyAxfS4gQXVkaW8gc2FtcGxlIHJhdGUgaXMgYWx3YXlzIDQ4IGtIeiBhbmQgdGhlIG51bWJlcgogb2YgY2hhbm5lbHMgY2FuIGJlIDIsIDggb3IgMTYuIE5vdGUgdGhhdCBhbGwgYXVkaW8gY2hhbm5lbHMgYXJlIGJ1bmRsZWQgaW4gb25lIHNpbmdsZQogYXVkaW8gdHJhY2suCkBAIC0yMzMsMjQgKzI3Myw5NyBAQAogSWYgc2V0IHRvIEBvcHRpb257dHJ1ZX0sIHByaW50IGEgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBhbmQgZXhpdC4KIERlZmF1bHRzIHRvIEBvcHRpb257ZmFsc2V9LgogCitAaXRlbSBmb3JtYXRfY29kZSA8Rm91ckNDPgorVGhpcyBzZXRzIHRoZSBpbnB1dCB2aWRlbyBmb3JtYXQgdG8gdGhlIGZvcm1hdCBnaXZlbiBieSB0aGUgRm91ckNDLiBUbyBzZWUKK3RoZSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHlvdXIgZGV2aWNlKHMpIHVzZSBAb3B0aW9ue2xpc3RfZm9ybWF0c30uCitOb3RlIHRoYXQgdGhlcmUgaXMgYSBGb3VyQ0MgQG9wdGlvbnsncGFsICd9IHRoYXQgY2FuIGFsc28gYmUgdXNlZAorYXMgQG9wdGlvbntwYWx9ICgzIGxldHRlcnMpLgorRGVmYXVsdCBiZWhhdmlvciBpcyBhdXRvZGV0ZWN0aW9uIG9mIHRoZSBpbnB1dCB2aWRlbyBmb3JtYXQsIGlmIHRoZSBoYXJkd2FyZQorc3VwcG9ydHMgaXQuCisKIEBpdGVtIGJtX3YyMTAKK1RoaXMgaXMgYSBkZXByZWNhdGVkIG9wdGlvbiwgeW91IGNhbiB1c2UgQG9wdGlvbntyYXdfZm9ybWF0fSBpbnN0ZWFkLgogSWYgc2V0IHRvIEBzYW1wezF9LCB2aWRlbyBpcyBjYXB0dXJlZCBpbiAxMCBiaXQgdjIxMCBpbnN0ZWFkCiBvZiB1eXZ5NDIyLiBOb3QgYWxsIEJsYWNrbWFnaWMgZGV2aWNlcyBzdXBwb3J0IHRoaXMgb3B0aW9uLgogCitAaXRlbSByYXdfZm9ybWF0CitTZXQgdGhlIHBpeGVsIGZvcm1hdCBvZiB0aGUgY2FwdHVyZWQgdmlkZW8uCitBdmFpbGFibGUgdmFsdWVzIGFyZToKK0B0YWJsZSBAc2FtcAorQGl0ZW0gdXl2eTQyMgorCitAaXRlbSB5dXY0MjJwMTAKKworQGl0ZW0gYXJnYgorCitAaXRlbSBiZ3JhCisKK0BpdGVtIHJnYjEwCisKK0BlbmQgdGFibGUKKwogQGl0ZW0gdGVsZXRleHRfbGluZXMKIElmIHNldCB0byBub256ZXJvLCBhbiBhZGRpdGlvbmFsIHRlbGV0ZXh0IHN0cmVhbSB3aWxsIGJlIGNhcHR1cmVkIGZyb20gdGhlCi12ZXJ0aWNhbCBhbmNpbGxhcnkgZGF0YS4gVGhpcyBvcHRpb24gaXMgYSBiaXRtYXNrIG9mIHRoZSBWQkkgbGluZXMgY2hlY2tlZCwKLXNwZWNpZmljYWxseSBsaW5lcyA2IHRvIDIyLCBhbmQgbGluZXMgMzE4IHRvIDMzNS4gTGluZSA2IGlzIHRoZSBMU0IgaW4gdGhlIG1hc2suCi1TZWxlY3RlZCBsaW5lcyB3aGljaCBkbyBub3QgY29udGFpbiB0ZWxldGV4dCBpbmZvcm1hdGlvbiB3aWxsIGJlIGlnbm9yZWQuIFlvdQotY2FuIHVzZSB0aGUgc3BlY2lhbCBAb3B0aW9ue2FsbH0gY29uc3RhbnQgdG8gc2VsZWN0IGFsbCBwb3NzaWJsZSBsaW5lcywgb3IKLUBvcHRpb257c3RhbmRhcmR9IHRvIHNraXAgbGluZXMgNiwgMzE4IGFuZCAzMTksIHdoaWNoIGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGFsbAotcmVjZWl2ZXJzLiBDYXB0dXJpbmcgdGVsZXRleHQgb25seSB3b3JrcyBmb3IgU0QgUEFMIHNvdXJjZXMgaW4gOCBiaXQgbW9kZS4KLVRvIHVzZSB0aGlzIG9wdGlvbiwgZmZtcGVnIG5lZWRzIHRvIGJlIGNvbXBpbGVkIHdpdGggQGNvZGV7LS1lbmFibGUtbGlienZiaX0uCit2ZXJ0aWNhbCBhbmNpbGxhcnkgZGF0YS4gQm90aCBTRCBQQUwgKDU3NmkpIGFuZCBIRCAoMTA4MGkgb3IgMTA4MHApCitzb3VyY2VzIGFyZSBzdXBwb3J0ZWQuIEluIGNhc2Ugb2YgSEQgc291cmNlcywgT1A0NyBwYWNrZXRzIGFyZSBkZWNvZGVkLgorCitUaGlzIG9wdGlvbiBpcyBhIGJpdG1hc2sgb2YgdGhlIFNEIFBBTCBWQkkgbGluZXMgY2FwdHVyZWQsIHNwZWNpZmljYWxseSBsaW5lcyA2Cit0byAyMiwgYW5kIGxpbmVzIDMxOCB0byAzMzUuIExpbmUgNiBpcyB0aGUgTFNCIGluIHRoZSBtYXNrLiBTZWxlY3RlZCBsaW5lcword2hpY2ggZG8gbm90IGNvbnRhaW4gdGVsZXRleHQgaW5mb3JtYXRpb24gd2lsbCBiZSBpZ25vcmVkLiBZb3UgY2FuIHVzZSB0aGUKK3NwZWNpYWwgQG9wdGlvbnthbGx9IGNvbnN0YW50IHRvIHNlbGVjdCBhbGwgcG9zc2libGUgbGluZXMsIG9yCitAb3B0aW9ue3N0YW5kYXJkfSB0byBza2lwIGxpbmVzIDYsIDMxOCBhbmQgMzE5LCB3aGljaCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aAorYWxsIHJlY2VpdmVycy4KKworRm9yIFNEIHNvdXJjZXMsIGZmbXBlZyBuZWVkcyB0byBiZSBjb21waWxlZCB3aXRoIEBjb2Rley0tZW5hYmxlLWxpYnp2Yml9LiBGb3IKK0hEIHNvdXJjZXMsIG9uIG9sZGVyIChwcmUtNEspIERlY2tMaW5rIGNhcmQgbW9kZWxzIHlvdSBoYXZlIHRvIGNhcHR1cmUgaW4gMTAKK2JpdCBtb2RlLgogCiBAaXRlbSBjaGFubmVscwogRGVmaW5lcyBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdG8gY2FwdHVyZS4gTXVzdCBiZSBAc2FtcHsyfSwgQHNhbXB7OH0gb3IgQHNhbXB7MTZ9LgogRGVmYXVsdHMgdG8gQHNhbXB7Mn0uCiAKK0BpdGVtIGR1cGxleF9tb2RlCitTZXRzIHRoZSBkZWNrbGluayBkZXZpY2UgZHVwbGV4IG1vZGUuIE11c3QgYmUgQHNhbXB7dW5zZXR9LCBAc2FtcHtoYWxmfSBvciBAc2FtcHtmdWxsfS4KK0RlZmF1bHRzIHRvIEBzYW1we3Vuc2V0fS4KKworQGl0ZW0gdmlkZW9faW5wdXQKK1NldHMgdGhlIHZpZGVvIGlucHV0IHNvdXJjZS4gTXVzdCBiZSBAc2FtcHt1bnNldH0sIEBzYW1we3NkaX0sIEBzYW1we2hkbWl9LAorQHNhbXB7b3B0aWNhbF9zZGl9LCBAc2FtcHtjb21wb25lbnR9LCBAc2FtcHtjb21wb3NpdGV9IG9yIEBzYW1we3NfdmlkZW99LgorRGVmYXVsdHMgdG8gQHNhbXB7dW5zZXR9LgorCitAaXRlbSBhdWRpb19pbnB1dAorU2V0cyB0aGUgYXVkaW8gaW5wdXQgc291cmNlLiBNdXN0IGJlIEBzYW1we3Vuc2V0fSwgQHNhbXB7ZW1iZWRkZWR9LAorQHNhbXB7YWVzX2VidX0sIEBzYW1we2FuYWxvZ30sIEBzYW1we2FuYWxvZ194bHJ9LCBAc2FtcHthbmFsb2dfcmNhfSBvcgorQHNhbXB7bWljcm9waG9uZX0uIERlZmF1bHRzIHRvIEBzYW1we3Vuc2V0fS4KKworQGl0ZW0gdmlkZW9fcHRzCitTZXRzIHRoZSB2aWRlbyBwYWNrZXQgdGltZXN0YW1wIHNvdXJjZS4gTXVzdCBiZSBAc2FtcHt2aWRlb30sIEBzYW1we2F1ZGlvfSwKK0BzYW1we3JlZmVyZW5jZX0sIEBzYW1we3dhbGxjbG9ja30gb3IgQHNhbXB7YWJzX3dhbGxjbG9ja30uCitEZWZhdWx0cyB0byBAc2FtcHt2aWRlb30uCisKK0BpdGVtIGF1ZGlvX3B0cworU2V0cyB0aGUgYXVkaW8gcGFja2V0IHRpbWVzdGFtcCBzb3VyY2UuIE11c3QgYmUgQHNhbXB7dmlkZW99LCBAc2FtcHthdWRpb30sCitAc2FtcHtyZWZlcmVuY2V9LCBAc2FtcHt3YWxsY2xvY2t9IG9yIEBzYW1we2Fic193YWxsY2xvY2t9LgorRGVmYXVsdHMgdG8gQHNhbXB7YXVkaW99LgorCitAaXRlbSBkcmF3X2JhcnMKK0lmIHNldCB0byBAc2FtcHt0cnVlfSwgY29sb3IgYmFycyBhcmUgZHJhd24gaW4gdGhlIGV2ZW50IG9mIGEgc2lnbmFsIGxvc3MuCitEZWZhdWx0cyB0byBAc2FtcHt0cnVlfS4KKworQGl0ZW0gcXVldWVfc2l6ZQorU2V0cyBtYXhpbXVtIGlucHV0IGJ1ZmZlciBzaXplIGluIGJ5dGVzLiBJZiB0aGUgYnVmZmVyaW5nIHJlYWNoZXMgdGhpcyB2YWx1ZSwKK2luY29taW5nIGZyYW1lcyB3aWxsIGJlIGRyb3BwZWQuCitEZWZhdWx0cyB0byBAc2FtcHsxMDczNzQxODI0fS4KKworQGl0ZW0gYXVkaW9fZGVwdGgKK1NldHMgdGhlIGF1ZGlvIHNhbXBsZSBiaXQgZGVwdGguIE11c3QgYmUgQHNhbXB7MTZ9IG9yIEBzYW1wezMyfS4KK0RlZmF1bHRzIHRvIEBzYW1wezE2fS4KKworQGl0ZW0gZGVja2xpbmtfY29weXRzCitJZiBzZXQgdG8gQG9wdGlvbnt0cnVlfSwgdGltZXN0YW1wcyBhcmUgZm9yd2FyZGVkIGFzIHRoZXkgYXJlIHdpdGhvdXQgcmVtb3ZpbmcKK3RoZSBpbml0aWFsIG9mZnNldC4KK0RlZmF1bHRzIHRvIEBvcHRpb257ZmFsc2V9LgorCiBAZW5kIHRhYmxlCiAKIEBzdWJzZWN0aW9uIEV4YW1wbGVzCkBAIC0yNzAsMjEgKzM4MywxMzEgQEAKIEBlbmQgZXhhbXBsZQogCiBAaXRlbQotQ2FwdHVyZSB2aWRlbyBjbGlwIGF0IDEwODBpNTAgKGZvcm1hdCAxMSk6CitDYXB0dXJlIHZpZGVvIGNsaXAgYXQgMTA4MGk1MDoKIEBleGFtcGxlCi1mZm1wZWcgLWYgZGVja2xpbmsgLWkgJ0ludGVuc2l0eSBQcm9AQDExJyAtYWNvZGVjIGNvcHkgLXZjb2RlYyBjb3B5IG91dHB1dC5hdmkKK2ZmbXBlZyAtZm9ybWF0X2NvZGUgSGk1MCAtZiBkZWNrbGluayAtaSAnSW50ZW5zaXR5IFBybycgLWM6YSBjb3B5IC1jOnYgY29weSBvdXRwdXQuYXZpCiBAZW5kIGV4YW1wbGUKIAogQGl0ZW0KIENhcHR1cmUgdmlkZW8gY2xpcCBhdCAxMDgwaTUwIDEwIGJpdDoKIEBleGFtcGxlCi1mZm1wZWcgLWJtX3YyMTAgMSAtZiBkZWNrbGluayAtaSAnVWx0cmFTdHVkaW8gTWluaSBSZWNvcmRlckBAMTEnIC1hY29kZWMgY29weSAtdmNvZGVjIGNvcHkgb3V0cHV0LmF2aQorZmZtcGVnIC1ibV92MjEwIDEgLWZvcm1hdF9jb2RlIEhpNTAgLWYgZGVja2xpbmsgLWkgJ1VsdHJhU3R1ZGlvIE1pbmkgUmVjb3JkZXInIC1jOmEgY29weSAtYzp2IGNvcHkgb3V0cHV0LmF2aQogQGVuZCBleGFtcGxlCiAKIEBpdGVtCiBDYXB0dXJlIHZpZGVvIGNsaXAgYXQgMTA4MGk1MCB3aXRoIDE2IGF1ZGlvIGNoYW5uZWxzOgogQGV4YW1wbGUKLWZmbXBlZyAtY2hhbm5lbHMgMTYgLWYgZGVja2xpbmsgLWkgJ1VsdHJhU3R1ZGlvIE1pbmkgUmVjb3JkZXJAQDExJyAtYWNvZGVjIGNvcHkgLXZjb2RlYyBjb3B5IG91dHB1dC5hdmkKK2ZmbXBlZyAtY2hhbm5lbHMgMTYgLWZvcm1hdF9jb2RlIEhpNTAgLWYgZGVja2xpbmsgLWkgJ1VsdHJhU3R1ZGlvIE1pbmkgUmVjb3JkZXInIC1jOmEgY29weSAtYzp2IGNvcHkgb3V0cHV0LmF2aQorQGVuZCBleGFtcGxlCisKK0BlbmQgaXRlbWl6ZQorCitAc2VjdGlvbiBrbXNncmFiCisKK0tNUyB2aWRlbyBpbnB1dCBkZXZpY2UuCisKK0NhcHR1cmVzIHRoZSBLTVMgc2Nhbm91dCBmcmFtZWJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpZWQgQ1JUQyBvciBwbGFuZSBhcyBhCitEUk0gb2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCB0byBvdGhlciBoYXJkd2FyZSBmdW5jdGlvbnMuCisKK1JlcXVpcmVzIGVpdGhlciBEUk0gbWFzdGVyIG9yIENBUF9TWVNfQURNSU4gdG8gcnVuLgorCitJZiB5b3UgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0IGFsbCBvZiB0aGF0IG1lYW5zLCB5b3UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0aGlzLiAgTG9vayBhdAorQG9wdGlvbnt4MTFncmFifSBpbnN0ZWFkLgorCitAc3Vic2VjdGlvbiBPcHRpb25zCisKK0B0YWJsZSBAb3B0aW9uCisKK0BpdGVtIGRldmljZQorRFJNIGRldmljZSB0byBjYXB0dXJlIG9uLiAgRGVmYXVsdHMgdG8gQG9wdGlvbnsvZGV2L2RyaS9jYXJkMH0uCisKK0BpdGVtIGZvcm1hdAorUGl4ZWwgZm9ybWF0IG9mIHRoZSBmcmFtZWJ1ZmZlci4gIERlZmF1bHRzIHRvIEBvcHRpb257YmdyMH0uCisKK0BpdGVtIGZvcm1hdF9tb2RpZmllcgorRm9ybWF0IG1vZGlmaWVyIHRvIHNpZ25hbCBvbiBvdXRwdXQgZnJhbWVzLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gaW1wb3J0IGNvcnJlY3RseSBpbnRvCitzb21lIEFQSXMsIGJ1dCBjYW4ndCBiZSBhdXRvZGV0ZWN0ZWQuICBTZWUgdGhlIGxpYmRybSBkb2N1bWVudGF0aW9uIGZvciBwb3NzaWJsZSB2YWx1ZXMuCisKK0BpdGVtIGNydGNfaWQKK0tNUyBDUlRDIElEIHRvIGRlZmluZSB0aGUgY2FwdHVyZSBzb3VyY2UuICBUaGUgZmlyc3QgYWN0aXZlIHBsYW5lIG9uIHRoZSBnaXZlbiBDUlRDCit3aWxsIGJlIHVzZWQuCisKK0BpdGVtIHBsYW5lX2lkCitLTVMgcGxhbmUgSUQgdG8gZGVmaW5lIHRoZSBjYXB0dXJlIHNvdXJjZS4gIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBhY3RpdmUgcGxhbmUgZm91bmQgaWYKK25laXRoZXIgQG9wdGlvbntjcnRjX2lkfSBub3IgQG9wdGlvbntwbGFuZV9pZH0gYXJlIHNwZWNpZmllZC4KKworQGl0ZW0gZnJhbWVyYXRlCitGcmFtZXJhdGUgdG8gY2FwdHVyZSBhdC4gIFRoaXMgaXMgbm90IHN5bmNocm9uaXNlZCB0byBhbnkgcGFnZSBmbGlwcGluZyBvciBmcmFtZWJ1ZmZlcgorY2hhbmdlcyAtIGl0IGp1c3QgZGVmaW5lcyB0aGUgaW50ZXJ2YWwgYXQgd2hpY2ggdGhlIGZyYW1lYnVmZmVyIGlzIHNhbXBsZWQuICBTYW1wbGluZworZmFzdGVyIHRoYW4gdGhlIGZyYW1lYnVmZmVyIHVwZGF0ZSByYXRlIHdpbGwgZ2VuZXJhdGUgaW5kZXBlbmRlbnQgZnJhbWVzIHdpdGggdGhlIHNhbWUKK2NvbnRlbnQuICBEZWZhdWx0cyB0byBAY29kZXszMH0uCisKK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKKworQGl0ZW0KK0NhcHR1cmUgZnJvbSB0aGUgZmlyc3QgYWN0aXZlIHBsYW5lLCBkb3dubG9hZCB0aGUgcmVzdWx0IHRvIG5vcm1hbCBmcmFtZXMgYW5kIGVuY29kZS4KK1RoaXMgd2lsbCBvbmx5IHdvcmsgaWYgdGhlIGZyYW1lYnVmZmVyIGlzIGJvdGggbGluZWFyIGFuZCBtYXBwYWJsZSAtIGlmIG5vdCwgdGhlIHJlc3VsdAorbWF5IGJlIHNjcmFtYmxlZCBvciBmYWlsIHRvIGRvd25sb2FkLgorQGV4YW1wbGUKK2ZmbXBlZyAtZiBrbXNncmFiIC1pIC0gLXZmICdod2Rvd25sb2FkLGZvcm1hdD1iZ3IwJyBvdXRwdXQubXA0CitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK0NhcHR1cmUgZnJvbSBDUlRDIElEIDQyIGF0IDYwZnBzLCBtYXAgdGhlIHJlc3VsdCB0byBWQUFQSSwgY29udmVydCB0byBOVjEyIGFuZCBlbmNvZGUgYXMgSC4yNjQuCitAZXhhbXBsZQorZmZtcGVnIC1jcnRjX2lkIDQyIC1mcmFtZXJhdGUgNjAgLWYga21zZ3JhYiAtaSAtIC12ZiAnaHdtYXA9ZGVyaXZlX2RldmljZT12YWFwaSxzY2FsZV92YWFwaT13PTE5MjA6aD0xMDgwOmZvcm1hdD1udjEyJyAtYzp2IGgyNjRfdmFhcGkgb3V0cHV0Lm1wNAorQGVuZCBleGFtcGxlCisKK0BlbmQgaXRlbWl6ZQorCitAc2VjdGlvbiBsaWJuZGlfbmV3dGVrCisKK1RoZSBsaWJuZGlfbmV3dGVrIGlucHV0IGRldmljZSBwcm92aWRlcyBjYXB0dXJlIGNhcGFiaWxpdGllcyBmb3IgdXNpbmcgTkRJIChOZXR3b3JrCitEZXZpY2UgSW50ZXJmYWNlLCBzdGFuZGFyZCBjcmVhdGVkIGJ5IE5ld1RlaykuCisKK0lucHV0IGZpbGVuYW1lIGlzIGEgTkRJIHNvdXJjZSBuYW1lIHRoYXQgY291bGQgYmUgZm91bmQgYnkgc2VuZGluZyAtZmluZF9zb3VyY2VzIDEKK3RvIGNvbW1hbmQgbGluZSAtIGl0IGhhcyBubyBzcGVjaWZpYyBzeW50YXggYnV0IGh1bWFuLXJlYWRhYmxlIGZvcm1hdHRlZC4KKworVG8gZW5hYmxlIHRoaXMgaW5wdXQgZGV2aWNlLCB5b3UgbmVlZCB0aGUgTkRJIFNESyBhbmQgeW91CituZWVkIHRvIGNvbmZpZ3VyZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBAY29kZXstLWV4dHJhLWNmbGFnc30KK2FuZCBAY29kZXstLWV4dHJhLWxkZmxhZ3N9LgorCitAc3Vic2VjdGlvbiBPcHRpb25zCisKK0B0YWJsZSBAb3B0aW9uCisKK0BpdGVtIGZpbmRfc291cmNlcworSWYgc2V0IHRvIEBvcHRpb257dHJ1ZX0sIHByaW50IGEgbGlzdCBvZiBmb3VuZC9hdmFpbGFibGUgTkRJIHNvdXJjZXMgYW5kIGV4aXQuCitEZWZhdWx0cyB0byBAb3B0aW9ue2ZhbHNlfS4KKworQGl0ZW0gd2FpdF9zb3VyY2VzCitPdmVycmlkZSB0aW1lIHRvIHdhaXQgdW50aWwgdGhlIG51bWJlciBvZiBvbmxpbmUgc291cmNlcyBoYXZlIGNoYW5nZWQuCitEZWZhdWx0cyB0byBAb3B0aW9uezAuNX0uCisKK0BpdGVtIGFsbG93X3ZpZGVvX2ZpZWxkcworV2hlbiB0aGlzIGZsYWcgaXMgQG9wdGlvbntmYWxzZX0sIGFsbCB2aWRlbyB0aGF0IHlvdSByZWNlaXZlIHdpbGwgYmUgcHJvZ3Jlc3NpdmUuCitEZWZhdWx0cyB0byBAb3B0aW9ue3RydWV9LgorCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK0BpdGVtaXplCisKK0BpdGVtCitMaXN0IGlucHV0IGRldmljZXM6CitAZXhhbXBsZQorZmZtcGVnIC1mIGxpYm5kaV9uZXd0ZWsgLWZpbmRfc291cmNlcyAxIC1pIGR1bW15CitAZW5kIGV4YW1wbGUKKworQGl0ZW0KK1Jlc3RyZWFtIHRvIE5ESToKK0BleGFtcGxlCitmZm1wZWcgLWYgbGlibmRpX25ld3RlayAtaSAiREVWLTUuSU5URVJOQUwuTTFTVEVSRU8uVFYgKE5ESV9TT1VSQ0VfTkFNRV8xKSIgLWYgbGlibmRpX25ld3RlayAteSBORElfU09VUkNFX05BTUVfMgogQGVuZCBleGFtcGxlCiAKIEBlbmQgaXRlbWl6ZQpAQCAtNDg5LDMxICs3MTIsNiBAQAogCiBAZW5kIGl0ZW1pemUKIAotQHNlY3Rpb24gZHYxMzk0Ci0KLUxpbnV4IERWIDEzOTQgaW5wdXQgZGV2aWNlLgotCi1Ac3Vic2VjdGlvbiBPcHRpb25zCi0KLUB0YWJsZSBAb3B0aW9uCi0KLUBpdGVtIGZyYW1lcmF0ZQotU2V0IHRoZSBmcmFtZSByYXRlLiBEZWZhdWx0IGlzIDI1LgotCi1AaXRlbSBzdGFuZGFyZAotCi1BdmFpbGFibGUgdmFsdWVzIGFyZToKLUB0YWJsZSBAc2FtcAotQGl0ZW0gcGFsCi0KLUBpdGVtIG50c2MKLQotQGVuZCB0YWJsZQotCi1EZWZhdWx0IHZhbHVlIGlzIEBjb2Rle250c2N9LgotCi1AZW5kIHRhYmxlCi0KIEBzZWN0aW9uIGZiZGV2CiAKIExpbnV4IGZyYW1lYnVmZmVyIGlucHV0IGRldmljZS4KQEAgLTY1Niw3ICs4NTQsNyBAQAogbm90IGhhdmUgYSBmaXhlZCBmcmFtZSBzaXplLgogCiBAaXRlbSBkdmd1aWQKLVNlbGVjdCB0aGUgY2FwdHVyZSBkZXZpY2UgYnkgc3BlY2lmeWluZyBpdCdzIEdVSUQuIENhcHR1cmluZyB3aWxsIG9ubHkKK1NlbGVjdCB0aGUgY2FwdHVyZSBkZXZpY2UgYnkgc3BlY2lmeWluZyBpdHMgR1VJRC4gQ2FwdHVyaW5nIHdpbGwgb25seQogYmUgcGVyZm9ybWVkIGZyb20gdGhlIHNwZWNpZmllZCBkZXZpY2UgYW5kIGZhaWxzIGlmIG5vIGRldmljZSB3aXRoIHRoZQogZ2l2ZW4gR1VJRCBpcyBmb3VuZC4gVGhpcyBpcyB1c2VmdWwgdG8gc2VsZWN0IHRoZSBpbnB1dCBpZiBtdWx0aXBsZQogZGV2aWNlcyBhcmUgY29ubmVjdGVkIGF0IHRoZSBzYW1lIHRpbWUuCkBAIC0xMDUwLDQ5ICsxMjQ4LDYgQEAKIGZmbXBlZyAtZiBwdWxzZSAtaSBkZWZhdWx0IC90bXAvcHVsc2Uud2F2CiBAZW5kIGV4YW1wbGUKIAotQHNlY3Rpb24gcXRraXQKLQotUVRLaXQgaW5wdXQgZGV2aWNlLgotCi1UaGUgZmlsZW5hbWUgcGFzc2VkIGFzIGlucHV0IGlzIHBhcnNlZCB0byBjb250YWluIGVpdGhlciBhIGRldmljZSBuYW1lIG9yIGluZGV4LgotVGhlIGRldmljZSBpbmRleCBjYW4gYWxzbyBiZSBnaXZlbiBieSB1c2luZyAtdmlkZW9fZGV2aWNlX2luZGV4LgotQSBnaXZlbiBkZXZpY2UgaW5kZXggd2lsbCBvdmVycmlkZSBhbnkgZ2l2ZW4gZGV2aWNlIG5hbWUuCi1JZiB0aGUgZGVzaXJlZCBkZXZpY2UgY29uc2lzdHMgb2YgbnVtYmVycyBvbmx5LCB1c2UgLXZpZGVvX2RldmljZV9pbmRleCB0byBpZGVudGlmeSBpdC4KLVRoZSBkZWZhdWx0IGRldmljZSB3aWxsIGJlIGNob3NlbiBpZiBhbiBlbXB0eSBzdHJpbmcgIG9yIHRoZSBkZXZpY2UgbmFtZSAiZGVmYXVsdCIgaXMgZ2l2ZW4uCi1UaGUgYXZhaWxhYmxlIGRldmljZXMgY2FuIGJlIGVudW1lcmF0ZWQgYnkgdXNpbmcgLWxpc3RfZGV2aWNlcy4KLQotQGV4YW1wbGUKLWZmbXBlZyAtZiBxdGtpdCAtaSAiMCIgb3V0Lm1wZwotQGVuZCBleGFtcGxlCi0KLUBleGFtcGxlCi1mZm1wZWcgLWYgcXRraXQgLXZpZGVvX2RldmljZV9pbmRleCAwIC1pICIiIG91dC5tcGcKLUBlbmQgZXhhbXBsZQotCi1AZXhhbXBsZQotZmZtcGVnIC1mIHF0a2l0IC1pICJkZWZhdWx0IiBvdXQubXBnCi1AZW5kIGV4YW1wbGUKLQotQGV4YW1wbGUKLWZmbXBlZyAtZiBxdGtpdCAtbGlzdF9kZXZpY2VzIHRydWUgLWkgIiIKLUBlbmQgZXhhbXBsZQotCi1Ac3Vic2VjdGlvbiBPcHRpb25zCi0KLUB0YWJsZSBAb3B0aW9uCi0KLUBpdGVtIGZyYW1lX3JhdGUKLVNldCBmcmFtZSByYXRlLiBEZWZhdWx0IGlzIDMwLgotCi1AaXRlbSBsaXN0X2RldmljZXMKLUlmIHNldCB0byBAY29kZXt0cnVlfSwgcHJpbnQgYSBsaXN0IG9mIGRldmljZXMgYW5kIGV4aXQuIERlZmF1bHQgaXMKLUBjb2Rle2ZhbHNlfS4KLQotQGl0ZW0gdmlkZW9fZGV2aWNlX2luZGV4Ci1TZWxlY3QgdGhlIHZpZGVvIGRldmljZSBieSBpbmRleCBmb3IgZGV2aWNlcyB3aXRoIHRoZSBzYW1lIG5hbWUgKHN0YXJ0cyBhdCAwKS4KLQotQGVuZCB0YWJsZQotCiBAc2VjdGlvbiBzbmRpbwogCiBzbmRpbyBpbnB1dCBkZXZpY2UuCkBAIC0xMjc5LDkgKzE0MzQsNiBAQAogaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtLiBJdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgZHVyaW5nCiBjb25maWd1cmF0aW9uLgogCi1BbHRlcm5hdGl2ZWx5LCB0aGUgY29uZmlndXJlIG9wdGlvbiBAb3B0aW9uey0tZW5hYmxlLXgxMWdyYWJ9IGV4aXN0cwotZm9yIGxlZ2FjeSBYbGliIHVzZXJzLgotCiBUaGlzIGRldmljZSBhbGxvd3Mgb25lIHRvIGNhcHR1cmUgYSByZWdpb24gb2YgYW4gWDExIGRpc3BsYXkuCiAKIFRoZSBmaWxlbmFtZSBwYXNzZWQgYXMgaW5wdXQgaGFzIHRoZSBzeW50YXg6CkBAIC0xMzE5LDcgKzE0NzEsNyBAQAogCiBAdGFibGUgQG9wdGlvbgogQGl0ZW0gZHJhd19tb3VzZQotU3BlY2lmeSB3aGV0aGVyIHRvIGRyYXcgdGhlIG1vdXNlIHBvaW50ZXIuIEEgdmFsdWUgb2YgQGNvZGV7MH0gc3BlY2lmeQorU3BlY2lmeSB3aGV0aGVyIHRvIGRyYXcgdGhlIG1vdXNlIHBvaW50ZXIuIEEgdmFsdWUgb2YgQGNvZGV7MH0gc3BlY2lmaWVzCiBub3QgdG8gZHJhdyB0aGUgcG9pbnRlci4gRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXsxfS4KIAogQGl0ZW0gZm9sbG93X21vdXNlCkBAIC0xMzY5LDExICsxNTIxLDYgQEAKIEBpdGVtIHZpZGVvX3NpemUKIFNldCB0aGUgdmlkZW8gZnJhbWUgc2l6ZS4gRGVmYXVsdCB2YWx1ZSBpcyBAY29kZXt2Z2F9LgogCi1AaXRlbSB1c2Vfc2htCi1Vc2UgdGhlIE1JVC1TSE0gZXh0ZW5zaW9uIGZvciBzaGFyZWQgbWVtb3J5LiBEZWZhdWx0IHZhbHVlIGlzIEBjb2RlezF9LgotSXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIGl0IGZvciByZW1vdGUgZGlzcGxheXMgKGxlZ2FjeSB4MTFncmFiCi1vbmx5KS4KLQogQGl0ZW0gZ3JhYl94CiBAaXRlbSBncmFiX3kKIFNldCB0aGUgZ3JhYmJpbmcgcmVnaW9uIGNvb3JkaW5hdGVzLiBUaGV5IGFyZSBleHByZXNzZWQgYXMgb2Zmc2V0IGZyb20KZGlmZiAtLWdpdCBhL2RvYy9pc3N1ZV90cmFja2VyLnR4dCBiL2RvYy9pc3N1ZV90cmFja2VyLnR4dAppbmRleCBlOGU4NTMwLi41ZDk4MDVhIDEwMDY0NAotLS0gYS9kb2MvaXNzdWVfdHJhY2tlci50eHQKKysrIGIvZG9jL2lzc3VlX3RyYWNrZXIudHh0CkBAIC0xOTMsOSArMTkzLDYgQEAKIGZmcHJvYmUKICAgICBpc3N1ZXMgaW4gb3IgcmVsYXRlZCB0byBmZnByb2JlLmMKIAotZmZzZXJ2ZXIKLSAgICBpc3N1ZXMgaW4gb3IgcmVsYXRlZCB0byBmZnNlcnZlci5jCi0KIHBvc3Rwcm9jCiAgICAgaXNzdWVzIGluIGxpYnBvc3Rwcm9jLyoKIApkaWZmIC0tZ2l0IGEvZG9jL2xleGljb24gYi9kb2MvbGV4aWNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk2YWIxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xleGljb24KQEAgLTAsMCArMSwyNyBAQAorQ29tbW9uIGFiYnJldmlhdGlvbnMvc2hvcnRoYW5kcyB3ZSB1c2UgdGhhdCBkb24ndCBuZWVkIGEgY29tbWVudAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitkc3A6IGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NpbmcKK2RzdC9hZHN0OiAoYXN5bW1ldHJpYykgZGlzY3JldGUgc2luZSB0cmFuc2Zvcm0KK2VjOiBlbnRyb3B5IGNvZGluZyBvciBlcnJvciBjb25jZWFsbWVudAorZXI6IGVycm9yIHJlc2lsaWVuY2UKK2ZkY3QvaWRjdDogZm9yd2FyZC9pbnZlcnNlIGRpc2NyZXRlIGNvc2luZSB0cmFuc2Zvcm0KK2ZmdDogZmFzdCBGb3VyaWVyIHRyYW5zZm9ybQorZ29wOiBncm91cCBvZiBwaWN0dXJlcworaHcvc3c6IGhhcmR3YXJlL3NvZnR3YXJlCitscDogbG93cGFzcworbHBmOiBsb29wIGZpbHRlcgorbHV0OiBsb29rdXAgdGFibGUKK21iOiBtYWNyb2Jsb2NrCittYzogbW90aW9uIGNvbXBlbnNhdGlvbgorbWU6IG1vdGlvbiBlc3RpbWF0aW9uCittdjogbW90aW9uIHZlY3RvcgorbmFsOiBuZXR3b3JrIGFic3RyYWN0aW9uIGxheWVyCitwZWwvcXBlbC9lcGVsL2hwZWwvZnBlbDogcGl4ZWwgLyBxdWFydGVyLXBpeGVsIC8gZWlnaHRoLXBpeGVsIC8gaGFsZi1waXhlbCAvIGZ1bGwtcGl4ZWwKK3BwOiBwb3N0IHByb2Nlc3MKK3FwOiBxdWFudGl6YXRpb24gcGFyYW1ldGVyCityYzogcmF0ZSBjb250cm9sCitzZWk6IHN1cHBsZW1lbnRhbCBlbmhhbmNlbWVudCBpbmZvcm1hdGlvbgorc2w6IHNsaWNlCit2bGM6IHZhcmlhYmxlIGxlbmd0aCBjb2RpbmcKK3ZxOiB2ZWN0b3IgcXVhbnRpemF0aW9uCmRpZmYgLS1naXQgYS9kb2MvbGliYXYtbWVyZ2UudHh0IGIvZG9jL2xpYmF2LW1lcmdlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmEwOGZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL2xpYmF2LW1lcmdlLnR4dApAQCAtMCwwICsxLDExNiBAQAorQ09OVEVYVAorPT09PT09PQorCitUaGUgRkZtcGVnIHByb2plY3QgbWVyZ2VzIGFsbCB0aGUgY2hhbmdlcyBmcm9tIHRoZSBMaWJhdiBwcm9qZWN0CisoaHR0cHM6Ly9saWJhdi5vcmcpIHNpbmNlIHRoZSBvcmlnaW4gb2YgdGhlIGZvcmsgKGFyb3VuZCAyMDExKS4KKworV2l0aCB0aGUgZXhjZXB0aW9ucyBvZiBzb21lIGNvbW1pdHMgZHVlIHRvIHRlY2huaWNhbC9wb2xpdGljYWwgZGlzYWdyZWVtZW50cyBvcgoraXNzdWVzLCB0aGUgY2hhbmdlcyBhcmUgbWVyZ2VkIG9uIGEgbW9yZSBvciBsZXNzIHJlZ3VsYXIgc2NoZWR1bGUgKGRhaWx5IGZvcgoreWVhcnMgdGhhbmtzIHRvIE1pY2hhZWwsIGJ1dCBtb3JlIHNwYXJzZSBub3dhZGF5cykuCisKK1dIWQorPT09CisKK1RoZSBtYWpvcml0eSBvZiB0aGUgYWN0aXZlIGRldmVsb3BlcnMgYmVsaWV2ZSB0aGUgcHJvamVjdCBuZWVkcyB0byBrZWVwIHRoaXMKK3BvbGljeSBmb3IgdmFyaW91cyByZWFzb25zLgorCitUaGUgbW9zdCBpbXBvcnRhbnQgb25lIGlzIHRoYXQgd2UgZG9uJ3Qgd2FudCBvdXIgdXNlcnMgdG8gaGF2ZSB0byBjaG9vc2UKK2JldHdlZW4gdHdvIGRpc3RyaWJ1dG9ycyBvZiBsaWJyYXJpZXMgb2YgdGhlIGV4YWN0IHNhbWUgbmFtZSBpbiBvcmRlciB0byBoYXZlIGEKK2RpZmZlcmVudCBzZXQgb2YgZmVhdHVyZXMgYW5kIGJ1Z2ZpeGVzLiBCeSB0YWtpbmcgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCit1bmlmeWluZyB0aGUgdHdvIGNvZGViYXNlcywgd2UgYWxsb3cgdXNlcnMgdG8gYmVuZWZpdCBmcm9tIHRoZSBjaGFuZ2VzIGZyb20gdGhlCit0d28gdGVhbXMuCisKK1RvZGF5LCBGRm1wZWcgaGFzIGEgbXVjaCBsYXJnZXIgdXNlciBkYXRhYmFzZSAod2UgYXJlIGRpc3RyaWJ1dGVkIGJ5IGV2ZXJ5CittYWpvciBkaXN0cmlidXRpb24pLCBzbyB3ZSBjb25zaWRlciB0aGlzIG1pc3Npb24gYSBwcmlvcml0eS4KKworQSBkaWZmZXJlbnQgYXBwcm9hY2ggdG8gdGhlIG1lcmdlIGNvdWxkIGhhdmUgYmVlbiB0byBwaWNrIHRoZSBjaGFuZ2VzIHdlIGFyZQoraW50ZXJlc3RlZCBpbiBhbmQgZHJvcCBtb3N0IG9mIHRoZSBjb3NtZXRpY3MgYW5kIG90aGVyIGxlc3MgaW1wb3J0YW50IGNoYW5nZXMuCitVbmZvcnR1bmF0ZWx5LCB0aGlzIG1ha2VzIHRoZSBmb2xsb3dpbmcgcGlja3MgbXVjaCBoYXJkZXIsIGVzcGVjaWFsbHkgc2luY2UgdGhlCitMaWJhdiBwcm9qZWN0IGlzIGludm9sdmVkIGluIHZhcmlvdXMgZGVlcCBBUEkgY2hhbmdlcy4gQXMgYSByZXN1bHQsIHdlIGRlY2lkZQordG8gdmlydHVhbGx5IHRha2UgZXZlcnl0aGluZyBkb25lIHRoZXJlLgorCitBbnkgTGliYXYgZGV2ZWxvcGVyIGlzIG9mIGNvdXJzZSB3ZWxjb21lIGFueXRpbWUgdG8gY29udHJpYnV0ZSBkaXJlY3RseSB0byB0aGUKK0ZGbXBlZyB0cmVlLiBPZiBjb3Vyc2UsIHdlIGZ1bGx5IHVuZGVyc3RhbmQgYW5kIGFyZSBmb3JjZWQgdG8gYWNjZXB0IHRoYXQgdmVyeQorZmV3IExpYmF2IGRldmVsb3BlcnMgYXJlIGludGVyZXN0ZWQgaW4gZG9pbmcgc28sIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIHJlY29nbml6ZQordGhlaXIgd29yay4gVGhpcyBsZWFkcyB1cyB0byBjcmVhdGUgbWVyZ2UgY29tbWl0cyBmb3IgZXZlcnkgc2luZ2xlIG9uZSBmcm9tCitMaWJhdi4gVGhlIG9yaWdpbmFsIGNvbW1pdCBhcHBlYXJzIHRvdGFsbHkgdW5jaGFuZ2VkIHdpdGggZnVsbCBhdXRob3JzaGlwIGluCitvdXIgaGlzdG9yeSAoYW5kIHRoZSBjb25mbGljdCBhcmUgc29sdmVkIGluIHRoZSBtZXJnZSBvbmUpLiBUaGF0IHdheSwgbm90IGEKK3NpbmdsZSB0aGluZyBmcm9tIExpYmF2IHdpbGwgYmUgbG9zdCBpbiB0aGUgZnV0dXJlIGluIGNhc2Ugc29tZSByZXVuaWZpY2F0aW9uCitoYXBwZW5zLCBvciB0aGF0IHByb2plY3QgZGlzYXBwZWFycyBvbmUgd2F5IG9yIGFub3RoZXIuCisKK0RPV05TSURFUworPT09PT09PT09CisKK09mIGNvdXJzZSwgdGhlcmUgYXJlIG1hbnkgZG93bnNpZGVzIHRvIHRoaXMgYXBwcm9hY2guCisKKy0gSXQgY2F1c2VzIGEgbm9uIG5lZ2xpZ2libGUgbWVyZ2UgY29tbWl0cyBwb2xsdXRpb24uIFdlIG1ha2Ugc3VyZSB0aGVyZSBhcmUKKyAgbm90IHNldmVyYWwgbGV2ZWwgb2YgbWVyZ2VzIGVudGFuZ2xlZCAod2UgZG8gYSAxOjEgbWVyZ2UvY29tbWl0KSwgYnV0IGl0J3MKKyAgc3RpbGwgYSBub24tbGluZWFyIGhpc3RvcnkuCisKKy0gTWFueSBkdXBsaWNhdGVkIHdvcmsuIEZvciBpbnN0YW5jZSwgd2UgYWRkZWQgbGliYXZyZXNhbXBsZSBpbiBvdXIgdHJlZSB0bworICBrZWVwIGNvbXBhdGliaWxpdHkgd2l0aCBMaWJhdiB3aGVuIG91ciBsaWJzd3Jlc2FtcGxlIHdhcyBhbHJlYWR5IGNvdmVyaW5nIHRoZQorICBleGFjdCBzYW1lIHB1cnBvc2UuIFRoZSBzYW1lIHRoaW5nIGhhcHBlbmVkIGZvciB2YXJpb3VzIGVsZW1lbnRzIHN1Y2ggYXMgdGhlCisgIFByb1JlcyBzdXBwb3J0IChidXQgZGlmZmVyZW5jZXMgaW4gZmVhdHVyZXMsIGJ1Z3MsIGxpY2Vuc2VzLCAuLi4pLiBUaGVyZSBhcmUKKyAgbWFueSB3b3JrIHRvIGRvIHRvIHVuaWZ5IHRoZW0sIGFuZCBhbnkgaGVscCBpcyB2ZXJ5IG11Y2ggd2VsY29tZS4KKworLSBTbyBtdWNoIG1hbnBvd2VyIGZyb20gYm90aCBGRm1wZWcgYW5kIExpYmF2IGlzIGxvc3QgYmVjYXVzZSBvZiB0aGlzIG1lc3MuIFdlCisgIGtub3cgaXQsIGFuZCB3ZSBkb24ndCBrbm93IGhvdyB0byBmaXggaXQuIEl0IHRha2VzIGluY3JlZGlibGUgdGltZSB0byBkbworICB0aGVzZSBtZXJnZXMsIHNvIHdlIGhhdmUgZXZlbiBsZXNzIHRpbWUgdG8gd29yayBvbiB0aGluZ3Mgd2UgcGVyc29uYWxseSBjYXJlCisgIGFib3V0LiBUaGUgYmFkIHZpYmVzIGFsc28gZG8gbm90IGhlbHAgd2l0aCBrZWVwaW5nIG91ciBkZXZlbG9wZXJzIG1vdGl2YXRlZC4KKworLSBUaGVyZSBpcyBhIGdyb3dpbmcgdGVjaG5pY2FsIHJpc2sgZmFjdG9yIHdpdGggdGhlIG1lcmdlcyBkdWUgdG8gdGhlIGNvZGViYXNlCisgIGRpZmZlcmluZyBtb3JlIGFuZCBtb3JlLgorCitNRVJHRSBHVUlERUxJTkVTCis9PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgZ2l2ZXMgZGV2ZWxvcGVyIGd1aWRlbGluZXMgb24gaG93IHRvIHByb2NlZWQgd2hlbiBtZXJnaW5nIExpYmF2IGNvbW1pdHMuCisKK0JlZm9yZSBzdGFydGluZywgeW91IGNhbiByZWR1Y2UgdGhlIHJpc2sgb2YgZXJyb3JzIG9uIG1lcmdlIGNvbmZsaWN0cyBieSB1c2luZworYSBkaWZmZXJlbnQgbWVyZ2UgY29uZmxpY3Qgc3R5bGU6CisKKyAgICAkIGdpdCBjb25maWcgLS1nbG9iYWwgbWVyZ2UuY29uZmxpY3RzdHlsZSBkaWZmMworCit0b29scy9saWJhdi1tZXJnZS1uZXh0LWNvbW1pdCBpcyBhIHNjcmlwdCB0byBoZWxwIG1lcmdpbmcgdGhlIG5leHQgY29tbWl0IGluCit0aGUgcXVldWUuIEl0IGFzc3VtZXMgYSByZW1vdGUgbmFtZWQgbGliYXYuIEl0IGhhcyB0d28gbW9kZXM6IG1lcmdlLCBhbmQgbm9vcC4KK1RoZSBub29wIG1vZGUgY3JlYXRlcyBhIG1lcmdlIHdpdGggbm8gY2hhbmdlIHRvIHRoZSBIRUFELiBZb3UgY2FuIHBhc3MgYSBoYXNoCithcyBleHRyYSBhcmd1bWVudCB0byByZWZlcmVuY2UgYSBqdXN0aWZpY2F0aW9uIChpdCBpcyBjb21tb24gdGhhdCB3ZSBhbHJlYWR5CitoYXZlIHRoZSBjaGFuZ2UgZG9uZSBpbiBGRm1wZWcpLgorCitBbHNvIHNlZSB0b29scy9tdXJnZSwgeW91IGNhbiBjb3B5IGFuZCBwYXN0ZSBhIDMgd2F5IGNvbmZsaWN0IGludG8gaXRzIHN0ZGluCithbmQgaXQgd2lsbCBkaXNwbGF5IGNvbG9yZWQgZGlmZnMuIEFueSBhcmd1bWVudHMgdG8gbXVyZ2UgKGxpa2Ugb25lcyB0byBzdXBwcmVzcword2hpdGVzcGFjZSBkaWZmZXJlbmNlcykgYXJlIHBhc3NlZCBpbnRvIGNvbG9yZGlmZi4KKworVE9ETy9GSVhNRS9VTk1FUkdFRAorPT09PT09PT09PT09PT09PT09PQorCitTdHVmZiB0aGF0IGRpZG4ndCByZWFjaCB0aGUgY29kZWJhc2U6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gSEVWQyBEU1AgYW5kIHg4NiBNQyBTSU1EIGltcHJvdmVtZW50cyBmcm9tIExpYmF2IChzZWUgaHR0cHM6Ly9mZm1wZWcub3JnL3BpcGVybWFpbC9mZm1wZWctZGV2ZWwvMjAxNS1EZWNlbWJlci8xODQ3NzcuaHRtbCkKKyAgLSAxZjgyMTc1MGYgaGV2Y2RzcDogc3BsaXQgdGhlIHFwZWwgZnVuY3Rpb25zIGJ5IHdpZHRoIGluc3RlYWQgb2YgYnkgdGhlIHN1YnBpeGVsIGZyYWN0aW9uCisgIC0gODE4YmZlN2YwIGhldmNkc3A6IHNwbGl0IHRoZSBlcGVsIGZ1bmN0aW9ucyBieSB3aWR0aAorICAtIDY4ODQxNzM5OSBoZXZjZHNwOiBzcGxpdCB0aGUgcHJlZCBmdW5jdGlvbnMgYnkgd2lkdGgKKyAgLSBhODUzMzg4ZDIgaGV2YzogY2hhbmdlIHRoZSBzdHJpZGUgb2YgdGhlIE1DIGJ1ZmZlciB0byBiZSBpbiBieXRlcyBpbnN0ZWFkIG9mIGVsZW1lbnRzCisgIC0gMGNlZjA2ZGYwIGNoZWNrYXNtOiBhZGQgSEVWQyBNQyB0ZXN0cworICAtIGU3MDc4ZTg0MiBoZXZjZHNwOiBhZGQgeDg2IFNJTUQgZm9yIE1DCisgIC0gNzk5M2VjMTlhIGhldmM6IEFkZCBoZXZjX2dldF9waXhlbF80LzgvMTIvMTYvMjQvMzIvNDgvNjQKKy0gbmV3IGJpdHN0cmVhbSByZWFkZXIgKHNlZSBodHRwOi8vZmZtcGVnLm9yZy9waXBlcm1haWwvZmZtcGVnLWRldmVsLzIwMTctQXByaWwvMjA5NjA5Lmh0bWwpCistIHVzZSBhdl9jcHVfbWF4X2FsaWduKCkgaW5zdGVhZCBvZiBoYXJkY29kaW5nIGFsaWdubWVudCByZXF1aXJlbWVudHMgKHNlZSBodHRwczovL2ZmbXBlZy5vcmcvcGlwZXJtYWlsL2ZmbXBlZy1kZXZlbC8yMDE3LVNlcHRlbWJlci8yMTU4MzQuaHRtbCkKKyAgLSBmNDRlYzIyZTAgbGF2YzogdXNlIGF2X2NwdV9tYXhfYWxpZ24oKSBpbnN0ZWFkIG9mIGhhcmRjb2RpbmcgYWxpZ25tZW50IHJlcXVpcmVtZW50cworICAtIDRkZTIyMGQyZSBmcmFtZTogYWxsb3cgYWxpZ249MCAobWVhbmluZyBhdXRvbWF0aWMpIGZvciBhdl9mcmFtZV9nZXRfYnVmZmVyKCkKKy0gU3VwcG9ydCByZWNvdmVyeSBmcm9tIGFuIGFscmVhZHkgcHJlc2VudCBITFMgcGxheWxpc3QgKHNlZSAxNmNiMDZiYjMwKQorLSBSZW1vdmUgYWxsIG91dHB1dCBkZXZpY2VzIChzZWUgOGU3ZTA0MmQ0MSwgOGQzZGI5NWYyMCwgNmNlMTMwNzBiZCwgZDQ2Y2QyNDk4NiBhbmQgaHR0cHM6Ly9mZm1wZWcub3JnL3BpcGVybWFpbC9mZm1wZWctZGV2ZWwvMjAxNy1TZXB0ZW1iZXIvMjE2OTA0Lmh0bWwpCisKK0NvbGxhdGVyYWwgZGFtYWdlIHRoYXQgbmVlZHMgd29yayBsb2NhbGx5OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gTWVyZ2UgcHJvcmVzZGVjMi5jIGFuZCBwcm9yZXNkZWNfbGdwbC5jCistIE1lcmdlIHByb3Jlc2VuY19hbmF0b2xpeS5jIGFuZCBwcm9yZXNlbmNfa29zdHlhLmMKKy0gRml4IE1JUFMgQUMzIGRvd25taXgKKworRXh0cmEgY2hhbmdlcyBuZWVkZWQgdG8gYmUgYWxpZ25lZCB3aXRoIExpYmF2OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistIFN3aXRjaGluZyBvdXIgZXhhbXBsZXMgdG8gdGhlIG5ldyBlbmNvZGUvZGVjb2RlIEFQSSAoc2VlIDY3ZDI4ZjRhMGYpCistIEhFVkMgSURDVCBiaXQgZGVwdGggMTItYml0IHN1cHBvcnQgKExpYmF2IGFkZGVkIDggYW5kIDEwIGJ1dCBkb2Vzbid0IGhhdmUgMTIpCmRpZmYgLS1naXQgYS9kb2MvbGliYXZjb2RlYy50ZXhpIGIvZG9jL2xpYmF2Y29kZWMudGV4aQppbmRleCA4N2I5MGRiLi5iMjJjNDdhIDEwMDY0NAotLS0gYS9kb2MvbGliYXZjb2RlYy50ZXhpCisrKyBiL2RvYy9saWJhdmNvZGVjLnRleGkKQEAgLTI2LDEzICsyNiwxMyBAQAogQGNoYXB0ZXIgU2VlIEFsc28KIAogQGlmaHRtbAotQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LCBAdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAorQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LAogQHVybHtmZm1wZWctY29kZWNzLmh0bWwsZmZtcGVnLWNvZGVjc30sIEB1cmx7ZmZtcGVnLWJpdHN0cmVhbS1maWx0ZXJzLmh0bWwsYml0c3RyZWFtLWZpbHRlcnN9LAogQHVybHtsaWJhdnV0aWwuaHRtbCxsaWJhdnV0aWx9CiBAZW5kIGlmaHRtbAogCiBAaWZub3RodG1sCi1mZm1wZWcoMSksIGZmcGxheSgxKSwgZmZwcm9iZSgxKSwgZmZzZXJ2ZXIoMSksCitmZm1wZWcoMSksIGZmcGxheSgxKSwgZmZwcm9iZSgxKSwKIGZmbXBlZy1jb2RlY3MoMSksIGZmbXBlZy1iaXRzdHJlYW0tZmlsdGVycygxKSwKIGxpYmF2dXRpbCgzKQogQGVuZCBpZm5vdGh0bWwKZGlmZiAtLWdpdCBhL2RvYy9saWJhdmRldmljZS50ZXhpIGIvZG9jL2xpYmF2ZGV2aWNlLnRleGkKaW5kZXggOWIxMDI4Mi4uMGFiZGFhZiAxMDA2NDQKLS0tIGEvZG9jL2xpYmF2ZGV2aWNlLnRleGkKKysrIGIvZG9jL2xpYmF2ZGV2aWNlLnRleGkKQEAgLTIzLDEzICsyMywxMyBAQAogQGNoYXB0ZXIgU2VlIEFsc28KIAogQGlmaHRtbAotQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LCBAdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAorQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LAogQHVybHtmZm1wZWctZGV2aWNlcy5odG1sLGZmbXBlZy1kZXZpY2VzfSwKIEB1cmx7bGliYXZ1dGlsLmh0bWwsbGliYXZ1dGlsfSwgQHVybHtsaWJhdmNvZGVjLmh0bWwsbGliYXZjb2RlY30sIEB1cmx7bGliYXZmb3JtYXQuaHRtbCxsaWJhdmZvcm1hdH0KIEBlbmQgaWZodG1sCiAKIEBpZm5vdGh0bWwKLWZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwKK2ZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLAogZmZtcGVnLWRldmljZXMoMSksCiBsaWJhdnV0aWwoMyksIGxpYmF2Y29kZWMoMyksIGxpYmF2Zm9ybWF0KDMpCiBAZW5kIGlmbm90aHRtbApkaWZmIC0tZ2l0IGEvZG9jL2xpYmF2ZmlsdGVyLnRleGkgYi9kb2MvbGliYXZmaWx0ZXIudGV4aQppbmRleCA1MmUwNzUzLi5kOTQ3MmViIDEwMDY0NAotLS0gYS9kb2MvbGliYXZmaWx0ZXIudGV4aQorKysgYi9kb2MvbGliYXZmaWx0ZXIudGV4aQpAQCAtMjEsMTQgKzIxLDE0IEBACiBAY2hhcHRlciBTZWUgQWxzbwogCiBAaWZodG1sCi1AdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sIEB1cmx7ZmZzZXJ2ZXIuaHRtbCxmZnNlcnZlcn0sCitAdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sCiBAdXJse2ZmbXBlZy1maWx0ZXJzLmh0bWwsZmZtcGVnLWZpbHRlcnN9LAogQHVybHtsaWJhdnV0aWwuaHRtbCxsaWJhdnV0aWx9LCBAdXJse2xpYnN3c2NhbGUuaHRtbCxsaWJzd3NjYWxlfSwgQHVybHtsaWJzd3Jlc2FtcGxlLmh0bWwsbGlic3dyZXNhbXBsZX0sCiBAdXJse2xpYmF2Y29kZWMuaHRtbCxsaWJhdmNvZGVjfSwgQHVybHtsaWJhdmZvcm1hdC5odG1sLGxpYmF2Zm9ybWF0fSwgQHVybHtsaWJhdmRldmljZS5odG1sLGxpYmF2ZGV2aWNlfQogQGVuZCBpZmh0bWwKIAogQGlmbm90aHRtbAotZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksIGZmc2VydmVyKDEpLAorZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksCiBmZm1wZWctZmlsdGVycygxKSwKIGxpYmF2dXRpbCgzKSwgbGlic3dzY2FsZSgzKSwgbGlic3dyZXNhbXBsZSgzKSwgbGliYXZjb2RlYygzKSwgbGliYXZmb3JtYXQoMyksIGxpYmF2ZGV2aWNlKDMpCiBAZW5kIGlmbm90aHRtbApkaWZmIC0tZ2l0IGEvZG9jL2xpYmF2Zm9ybWF0LnRleGkgYi9kb2MvbGliYXZmb3JtYXQudGV4aQppbmRleCBkNTA1ZDY0Li43Y2Y0MWZkIDEwMDY0NAotLS0gYS9kb2MvbGliYXZmb3JtYXQudGV4aQorKysgYi9kb2MvbGliYXZmb3JtYXQudGV4aQpAQCAtMjYsMTMgKzI2LDEzIEBACiBAY2hhcHRlciBTZWUgQWxzbwogCiBAaWZodG1sCi1AdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sIEB1cmx7ZmZzZXJ2ZXIuaHRtbCxmZnNlcnZlcn0sCitAdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sCiBAdXJse2ZmbXBlZy1mb3JtYXRzLmh0bWwsZmZtcGVnLWZvcm1hdHN9LCBAdXJse2ZmbXBlZy1wcm90b2NvbHMuaHRtbCxmZm1wZWctcHJvdG9jb2xzfSwKIEB1cmx7bGliYXZ1dGlsLmh0bWwsbGliYXZ1dGlsfSwgQHVybHtsaWJhdmNvZGVjLmh0bWwsbGliYXZjb2RlY30KIEBlbmQgaWZodG1sCiAKIEBpZm5vdGh0bWwKLWZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwKK2ZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLAogZmZtcGVnLWZvcm1hdHMoMSksIGZmbXBlZy1wcm90b2NvbHMoMSksCiBsaWJhdnV0aWwoMyksIGxpYmF2Y29kZWMoMykKIEBlbmQgaWZub3RodG1sCmRpZmYgLS1naXQgYS9kb2MvbGliYXZ1dGlsLnRleGkgYi9kb2MvbGliYXZ1dGlsLnRleGkKaW5kZXggN2ExYzMzMi4uZWU1MDM2MiAxMDA2NDQKLS0tIGEvZG9jL2xpYmF2dXRpbC50ZXhpCisrKyBiL2RvYy9saWJhdnV0aWwudGV4aQpAQCAtNDIsMTIgKzQyLDEyIEBACiBAY2hhcHRlciBTZWUgQWxzbwogCiBAaWZodG1sCi1AdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sIEB1cmx7ZmZzZXJ2ZXIuaHRtbCxmZnNlcnZlcn0sCitAdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sCiBAdXJse2ZmbXBlZy11dGlscy5odG1sLGZmbXBlZy11dGlsc30KIEBlbmQgaWZodG1sCiAKIEBpZm5vdGh0bWwKLWZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwKK2ZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLAogZmZtcGVnLXV0aWxzKDEpCiBAZW5kIGlmbm90aHRtbAogCmRpZmYgLS1naXQgYS9kb2MvbGlic3dyZXNhbXBsZS50ZXhpIGIvZG9jL2xpYnN3cmVzYW1wbGUudGV4aQppbmRleCBiYjU3Mjc4Li4zMTA4Y2IxIDEwMDY0NAotLS0gYS9kb2MvbGlic3dyZXNhbXBsZS50ZXhpCisrKyBiL2RvYy9saWJzd3Jlc2FtcGxlLnRleGkKQEAgLTQ4LDEzICs0OCwxMyBAQAogQGNoYXB0ZXIgU2VlIEFsc28KIAogQGlmaHRtbAotQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LCBAdXJse2Zmc2VydmVyLmh0bWwsZmZzZXJ2ZXJ9LAorQHVybHtmZm1wZWcuaHRtbCxmZm1wZWd9LCBAdXJse2ZmcGxheS5odG1sLGZmcGxheX0sIEB1cmx7ZmZwcm9iZS5odG1sLGZmcHJvYmV9LAogQHVybHtmZm1wZWctcmVzYW1wbGVyLmh0bWwsZmZtcGVnLXJlc2FtcGxlcn0sCiBAdXJse2xpYmF2dXRpbC5odG1sLGxpYmF2dXRpbH0KIEBlbmQgaWZodG1sCiAKIEBpZm5vdGh0bWwKLWZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLCBmZnNlcnZlcigxKSwKK2ZmbXBlZygxKSwgZmZwbGF5KDEpLCBmZnByb2JlKDEpLAogZmZtcGVnLXJlc2FtcGxlcigxKSwKIGxpYmF2dXRpbCgzKQogQGVuZCBpZm5vdGh0bWwKZGlmZiAtLWdpdCBhL2RvYy9saWJzd3NjYWxlLnRleGkgYi9kb2MvbGlic3dzY2FsZS50ZXhpCmluZGV4IDc1N2ZkMjQuLmUxMzdjMjQgMTAwNjQ0Ci0tLSBhL2RvYy9saWJzd3NjYWxlLnRleGkKKysrIGIvZG9jL2xpYnN3c2NhbGUudGV4aQpAQCAtNDEsMTMgKzQxLDEzIEBACiBAY2hhcHRlciBTZWUgQWxzbwogCiBAaWZodG1sCi1AdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sIEB1cmx7ZmZzZXJ2ZXIuaHRtbCxmZnNlcnZlcn0sCitAdXJse2ZmbXBlZy5odG1sLGZmbXBlZ30sIEB1cmx7ZmZwbGF5Lmh0bWwsZmZwbGF5fSwgQHVybHtmZnByb2JlLmh0bWwsZmZwcm9iZX0sCiBAdXJse2ZmbXBlZy1zY2FsZXIuaHRtbCxmZm1wZWctc2NhbGVyfSwKIEB1cmx7bGliYXZ1dGlsLmh0bWwsbGliYXZ1dGlsfQogQGVuZCBpZmh0bWwKIAogQGlmbm90aHRtbAotZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksIGZmc2VydmVyKDEpLAorZmZtcGVnKDEpLCBmZnBsYXkoMSksIGZmcHJvYmUoMSksCiBmZm1wZWctc2NhbGVyKDEpLAogbGliYXZ1dGlsKDMpCiBAZW5kIGlmbm90aHRtbApkaWZmIC0tZ2l0IGEvZG9jL21haWxpbmctbGlzdC1mYXEudGV4aSBiL2RvYy9tYWlsaW5nLWxpc3QtZmFxLnRleGkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmODk4MQotLS0gL2Rldi9udWxsCisrKyBiL2RvYy9tYWlsaW5nLWxpc3QtZmFxLnRleGkKQEAgLTAsMCArMSwzNjUgQEAKK1xpbnB1dCB0ZXhpbmZvIEBjIC0qLSB0ZXhpbmZvIC0qLQorQGRvY3VtZW50ZW5jb2RpbmcgVVRGLTgKKworQHNldHRpdGxlIEZGbXBlZyBNYWlsaW5nIExpc3QgRkFRCitAdGl0bGVwYWdlCitAY2VudGVyIEB0aXRsZWZvbnR7RkZtcGVnIE1haWxpbmcgTGlzdCBGQVF9CitAZW5kIHRpdGxlcGFnZQorCitAdG9wCisKK0Bjb250ZW50cworCitAY2hhcHRlciBHZW5lcmFsIFF1ZXN0aW9ucworCitAc2VjdGlvbiBXaGF0IGlzIGEgbWFpbGluZyBsaXN0PworCitBIG1haWxpbmcgbGlzdCBpcyBub3QgbXVjaCBkaWZmZXJlbnQgdGhhbiBlbWFpbGluZyBzb21lb25lLCBidXQgdGhlCittYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB5b3VyIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgYnkgZXZlcnlvbmUgd2hvCitzdWJzY3JpYmVzIHRvIHRoZSBsaXN0LiBJdCBpcyBzb21ld2hhdCBsaWtlIGEgZm9ydW0gYnV0IGluIGVtYWlsIGZvcm0uCisKK1NlZSB0aGUgQHVybHtodHRwczovL2xpc3RzLmZmbXBlZy5vcmcvcGlwZXJtYWlsL2ZmbXBlZy11c2VyLywgZmZtcGVnLXVzZXIgYXJjaGl2ZXN9Citmb3IgZXhhbXBsZXMuCisKK0BzZWN0aW9uIFdoYXQgdHlwZSBvZiBxdWVzdGlvbnMgY2FuIEkgYXNrPworCitAaXRlbWl6ZQorQGl0ZW0KK0B1cmx7aHR0cHM6Ly9saXN0cy5mZm1wZWcub3JnL21haWxtYW4vbGlzdGluZm8vZmZtcGVnLXVzZXIvLCBmZm1wZWctdXNlcn06CitGb3IgcXVlc3Rpb25zIGludm9sdmluZyB1bnNjcmlwdGVkIHVzYWdlIG9yIGNvbXBpbGF0aW9uIG9mIHRoZSBGRm1wZWcKK2NvbW1hbmQtbGluZSB0b29scyAoQGNvbW1hbmR7ZmZtcGVnfSwgQGNvbW1hbmR7ZmZwcm9iZX0sIEBjb21tYW5ke2ZmcGxheX0pLgorCitAaXRlbQorQHVybHtodHRwczovL2xpc3RzLmZmbXBlZy5vcmcvbWFpbG1hbi9saXN0aW5mby9saWJhdi11c2VyLywgbGliYXYtdXNlcn06CitGb3IgcXVlc3Rpb25zIGludm9sdmluZyB0aGUgRkZtcGVnIGxpYmF2KiBsaWJyYXJpZXMgKGxpYmF2Y29kZWMsCitsaWJhdmZvcm1hdCwgbGliYXZmaWx0ZXIsIGV0YykuCisKK0BpdGVtCitAdXJse2h0dHBzOi8vbGlzdHMuZmZtcGVnLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZmbXBlZy1kZXZlbC8sIGZmbXBlZy1kZXZlbH06CitGb3IgZGlzY3Vzc2lvbnMgaW52b2x2aW5nIHRoZSBkZXZlbG9wbWVudCBvZiBGRm1wZWcgYW5kIGZvciBzdWJtaXR0aW5nCitwYXRjaGVzLiBVc2VyIHF1ZXN0aW9ucyBzaG91bGQgYmUgYXNrZWQgYXQgZmZtcGVnLXVzZXIgb3IgbGliYXYtdXNlci4KK0BlbmQgaXRlbWl6ZQorCitUbyByZXBvcnQgYSBidWcgc2VlIEB1cmx7aHR0cHM6Ly9mZm1wZWcub3JnL2J1Z3JlcG9ydHMuaHRtbH0uCisKK1dlIGNhbm5vdCBwcm92aWRlIGhlbHAgZm9yIHNjcmlwdHMgYW5kL29yIHRoaXJkLXBhcnR5IHRvb2xzLgorCitAYW5jaG9ye0hvdyBkbyBJIGFzayBhIHF1ZXN0aW9uIG9yIHNlbmQgYSBtZXNzYWdlIHRvIGEgbWFpbGluZyBsaXN0P30KK0BzZWN0aW9uIEhvdyBkbyBJIGFzayBhIHF1ZXN0aW9uIG9yIHNlbmQgYSBtZXNzYWdlIHRvIGEgbWFpbGluZyBsaXN0PworCitBbGwgeW91IGhhdmUgdG8gZG8gaXMgc2VuZCBhbiBlbWFpbDoKKworQGl0ZW1pemUKK0BpdGVtCitFbWFpbCBAZW1haWx7ZmZtcGVnLXVzZXJAQGZmbXBlZy5vcmd9IHRvIHNlbmQgYSBtZXNzYWdlIHRvIHRoZQorZmZtcGVnLXVzZXIgbWFpbGluZyBsaXN0LgorCitAaXRlbQorRW1haWwgQGVtYWlse2xpYmF2LXVzZXJAQGZmbXBlZy5vcmd9IHRvIHNlbmQgYSBtZXNzYWdlIHRvIHRoZQorbGliYXYtdXNlciBtYWlsaW5nIGxpc3QuCitAZW5kIGl0ZW1pemUKKworSWYgeW91IGFyZSBub3Qgc3Vic2NyaWJlZCB0byB0aGUgbWFpbGluZyBsaXN0IHRoZW4geW91ciBxdWVzdGlvbiBtdXN0IGJlCittYW51YWxseSBhcHByb3ZlZC4gQXBwcm92YWwgbWF5IHRha2Ugc2V2ZXJhbCBkYXlzLCBidXQgdGhlIHdhaXQgaXMKK3VzdWFsbHkgbGVzcy4gSWYgeW91IHdhbnQgdGhlIG1lc3NhZ2UgdG8gYmUgc2VudCB3aXRoIG5vIGRlbGF5IHRoZW4geW91CittdXN0IHN1YnNjcmliZSBmaXJzdC4gU2VlIEByZWZ7SG93IGRvIEkgc3Vic2NyaWJlP30KKworUGxlYXNlIGRvIG5vdCBzZW5kIGEgbWVzc2FnZSwgc3Vic2NyaWJlLCBhbmQgcmUtc2VuZCB0aGUgbWVzc2FnZTogdGhpcworcmVzdWx0cyBpbiBkdXBsaWNhdGVzLCBjYXVzZXMgbW9yZSB3b3JrIGZvciB0aGUgYWRtaW5zLCBhbmQgbWF5IGxvd2VyCit5b3VyIGNoYW5jZSBhdCBnZXR0aW5nIGFuIGFuc3dlci4gSG93ZXZlciwgeW91IG1heSBkbyBzbyBpZiB5b3UgZmlyc3QKK0ByZWZ7SG93IGRvIEkgZGVsZXRlIG15IG1lc3NhZ2UgaW4gdGhlIG1vZGVyYXRpb24gcXVldWU/LCBkZWxldGUgeW91ciBvcmlnaW5hbCBtZXNzYWdlIGZyb20gdGhlIG1vZGVyYXRpb24gcXVldWV9LgorCitAY2hhcHRlciBTdWJzY3JpYmluZyAvIFVuc3Vic2NyaWJpbmcKKworQHNlY3Rpb24gV2hhdCBkb2VzIHN1YnNjcmliaW5nIGRvPworCitTdWJzY3JpYmluZyBhbGxvd3MgdHdvIHRoaW5nczoKKworQGl0ZW1pemUKK0BpdGVtCitZb3VyIG1lc3NhZ2VzIHdpbGwgc2hvdyB1cCBpbiB0aGUgbWFpbGluZyBsaXN0IHdpdGhvdXQgd2FpdGluZyBpbiB0aGUKK21vZGVyYXRpb24gcXVldWUgYW5kIG5lZWRpbmcgdG8gYmUgbWFudWFsbHkgYXBwcm92ZWQgYnkgYSBtYWlsaW5nIGxpc3QKK2FkbWluLgorCitAaXRlbQorWW91IHdpbGwgcmVjZWl2ZSBhbGwgbWVzc2FnZXMgdG8gdGhlIG1haWxpbmcgbGlzdCBpbmNsdWRpbmcgcmVwbGllcyB0bworeW91ciBtZXNzYWdlcy4gTm9uLXN1YnNjcmliZWQgdXNlcnMgZG8gbm90IHJlY2VpdmUgYW55IG1lc3NhZ2VzLgorQGVuZCBpdGVtaXplCisKK0BzZWN0aW9uIERvIEkgbmVlZCB0byBzdWJzY3JpYmU/CisKK05vLiBZb3UgY2FuIHN0aWxsIHNlbmQgYSBtZXNzYWdlIHRvIHRoZSBtYWlsaW5nIGxpc3Qgd2l0aG91dAorc3Vic2NyaWJpbmcuIFNlZSBAcmVme0hvdyBkbyBJIGFzayBhIHF1ZXN0aW9uIG9yIHNlbmQgYSBtZXNzYWdlIHRvIGEgbWFpbGluZyBsaXN0P30KKworSG93ZXZlciwgeW91ciBtZXNzYWdlIHdpbGwgbmVlZCB0byBiZSBtYW51YWxseSBhcHByb3ZlZCBieSBhIG1haWxpbmcKK2xpc3QgYWRtaW4sIGFuZCB5b3Ugd2lsbCBub3QgcmVjZWl2ZSBhbnkgbWFpbGluZyBsaXN0IG1lc3NhZ2VzIG9yCityZXBsaWVzLgorCitZb3UgY2FuIGFzayB0byBiZSBDQ2QgaW4geW91ciBtZXNzYWdlLCBidXQgcmVwbHlpbmcgdXNlcnMgd2lsbAorc29tZXRpbWVzIGZvcmdldCB0byBkbyBzby4KKworWW91IG1heSBhbHNvIHZpZXcgYW5kIHJlcGx5IHRvIG1lc3NhZ2VzIHZpYSB0aGUgQHJlZntXaGVyZSBhcmUgdGhlIGFyY2hpdmVzPywgYXJjaGl2ZXN9LgorCitAYW5jaG9ye0hvdyBkbyBJIHN1YnNjcmliZT99CitAc2VjdGlvbiBIb3cgZG8gSSBzdWJzY3JpYmU/CisKK0VtYWlsIEBlbWFpbHtmZm1wZWctdXNlci1yZXF1ZXN0QEBmZm1wZWcub3JnfSB3aXRoIHRoZSBzdWJqZWN0CitAZW1waHtzdWJzY3JpYmV9LgorCitPciB2aXNpdCB0aGUgQHVybHtodHRwczovL2xpc3RzLmZmbXBlZy5vcmcvbWFpbG1hbi9saXN0aW5mby9mZm1wZWctdXNlci8sIGZmbXBlZy11c2VyIG1haWxpbmcgbGlzdCBpbmZvIHBhZ2V9CithbmQgcmVmZXIgdG8gdGhlIEBlbXBoe1N1YnNjcmliaW5nIHRvIGZmbXBlZy11c2VyfSBzZWN0aW9uLgorCitUaGUgcHJvY2VzcyBpcyB0aGUgc2FtZSBmb3IgdGhlIG90aGVyIG1haWxpbmcgbGlzdHMuCisKK0BzZWN0aW9uIEhvdyBkbyBJIHVuc3Vic2NyaWJlPworCitFbWFpbCBAZW1haWx7ZmZtcGVnLXVzZXItcmVxdWVzdEBAZmZtcGVnLm9yZ30gd2l0aCBzdWJqZWN0IEBlbXBoe3Vuc3Vic2NyaWJlfS4KKworT3IgdmlzaXQgdGhlIEB1cmx7aHR0cHM6Ly9saXN0cy5mZm1wZWcub3JnL21haWxtYW4vbGlzdGluZm8vZmZtcGVnLXVzZXIvLCBmZm1wZWctdXNlciBtYWlsaW5nIGxpc3QgaW5mbyBwYWdlfSwKK3Njcm9sbCB0byBib3R0b20gb2YgcGFnZSwgZW50ZXIgeW91ciBlbWFpbCBhZGRyZXNzIGluIHRoZSBib3gsIGFuZCBjbGljawordGhlIEBlbXBoe1Vuc3Vic2NyaWJlIG9yIGVkaXQgb3B0aW9uc30gYnV0dG9uLgorCitUaGUgcHJvY2VzcyBpcyB0aGUgc2FtZSBmb3IgdGhlIG90aGVyIG1haWxpbmcgbGlzdHMuCisKK1BsZWFzZSBhdm9pZCBhc2tpbmcgYSBtYWlsaW5nIGxpc3QgYWRtaW4gdG8gdW5zdWJzY3JpYmUgeW91IHVubGVzcyB5b3UKK2FyZSBhYnNvbHV0ZWx5IHVuYWJsZSB0byBkbyBzbyBieSB5b3Vyc2VsZi4gU2VlIEByZWZ7V2hvIGRvIEkgY29udGFjdCBpZiBJIGhhdmUgYSBwcm9ibGVtIHdpdGggdGhlIG1haWxpbmcgbGlzdD99CisKK0BjaGFwdGVyIE1vZGVyYXRpb24gUXVldWUKK0BhbmNob3J7V2h5IGlzIG15IG1lc3NhZ2UgYXdhaXRpbmcgbW9kZXJhdG9yIGFwcHJvdmFsP30KK0BzZWN0aW9uIFdoeSBpcyBteSBtZXNzYWdlIGF3YWl0aW5nIG1vZGVyYXRvciBhcHByb3ZhbD8KKworU29tZSBtZXNzYWdlcyBhcmUgYXV0b21hdGljYWxseSBoZWxkIGluIHRoZSBAZW1waHttb2RlcmF0aW9uIHF1ZXVlfSBhbmQKK211c3QgYmUgbWFudWFsbHkgYXBwcm92ZWQgYnkgYSBtYWlsaW5nIGxpc3QgYWRtaW46CisKK1RoZXNlIGFyZToKKworQGl0ZW1pemUKK0BpdGVtCitNZXNzYWdlcyBmcm9tIHVzZXJzIHdobyBhcmUgQHN0cm9uZ3tub3R9IHN1YnNjcmliZWQuCisKK0BpdGVtCitNZXNzYWdlcyB0aGF0IGV4Y2VlZCB0aGUgQHJlZntXaGF0IGlzIHRoZSBtZXNzYWdlIHNpemUgbGltaXQ/LCBtZXNzYWdlIHNpemUgbGltaXR9LgorCitAaXRlbQorTWVzc2FnZXMgZnJvbSB1c2VycyB3aG9zZSBhY2NvdW50cyBoYXZlIGJlZW4gc2V0IHdpdGggdGhlIEBlbXBoe21vZGVyYXRpb24gZmxhZ30KKyh2ZXJ5IHJhcmVseSBvY2N1cnMsIGJ1dCBtYXkgaWYgYSB1c2VyIHJlcGVhdGVkbHkgaWdub3JlcyB0aGUgcnVsZXMKK29yIGlzIGFidXNpdmUgdG93YXJkcyBvdGhlcnMpLgorQGVuZCBpdGVtaXplCisKK0BzZWN0aW9uIEhvdyBsb25nIGRvZXMgaXQgdGFrZSBmb3IgbXkgbWVzc2FnZSBpbiB0aGUgbW9kZXJhdGlvbiBxdWV1ZSB0byBiZSBhcHByb3ZlZD8KKworVGhlIHF1ZXVlIGlzIHVzdWFsbHkgY2hlY2tlZCBvbmNlIG9yIHR3aWNlIGEgZGF5LCBidXQgb24gb2NjYXNpb24KK3NldmVyYWwgZGF5cyBtYXkgcGFzcyBiZWZvcmUgc29tZW9uZSBjaGVja3MgdGhlIHF1ZXVlLgorCitAYW5jaG9ye0hvdyBkbyBJIGRlbGV0ZSBteSBtZXNzYWdlIGluIHRoZSBtb2RlcmF0aW9uIHF1ZXVlP30KK0BzZWN0aW9uIEhvdyBkbyBJIGRlbGV0ZSBteSBtZXNzYWdlIGluIHRoZSBtb2RlcmF0aW9uIHF1ZXVlPworCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYW4gZW1haWwgd2l0aCB0aGUgc3ViamVjdCBAZW1waHtZb3VyIG1lc3NhZ2UgdG8gZmZtcGVnLXVzZXIgYXdhaXRzIG1vZGVyYXRvciBhcHByb3ZhbH0uCitBIGxpbmsgaXMgaW4gdGhlIG1lc3NhZ2UgdGhhdCB3aWxsIGFsbG93IHlvdSB0byBkZWxldGUgeW91ciBtZXNzYWdlCit1bmxlc3MgYSBtYWlsaW5nIGxpc3QgYWRtaW4gYWxyZWFkeSBhcHByb3ZlZCBvciByZWplY3RlZCBpdC4KKworQGNoYXB0ZXIgQXJjaGl2ZXMKKworQGFuY2hvcntXaGVyZSBhcmUgdGhlIGFyY2hpdmVzP30KK0BzZWN0aW9uIFdoZXJlIGFyZSB0aGUgYXJjaGl2ZXM/CisKK1NlZSB0aGUgQGVtcGh7QXJjaGl2ZXN9IHNlY3Rpb24gb24gdGhlIEB1cmx7aHR0cHM6Ly9mZm1wZWcub3JnL2NvbnRhY3QuaHRtbCwgRkZtcGVnIENvbnRhY3R9CitwYWdlIGZvciBsaW5rcyB0byBhbGwgRkZtcGVnIG1haWxpbmcgbGlzdCBhcmNoaXZlcy4KKworTm90ZSB0aGF0IHRoZSBhcmNoaXZlcyBhcmUgc3BsaXQgYnkgbW9udGguIERpc2N1c3Npb25zIHRoYXQgc3Bhbgorc2V2ZXJhbCBtb250aHMgd2lsbCBiZSBzcGxpdCBpbnRvIHNlcGFyYXRlIG1vbnRocyBpbiB0aGUgYXJjaGl2ZXMuCisKK0BzZWN0aW9uIEhvdyBkbyBJIHJlcGx5IHRvIGEgbWVzc2FnZSBpbiB0aGUgYXJjaGl2ZXM/CisKK0NsaWNrIHRoZSBlbWFpbCBsaW5rIGF0IHRoZSB0b3Agb2YgdGhlIG1lc3NhZ2UganVzdCB1bmRlciB0aGUgc3ViamVjdAordGl0bGUuIFRoZSBsaW5rIHdpbGwgcHJvdmlkZSB0aGUgcHJvcGVyIGhlYWRlcnMgdG8ga2VlcCB0aGUgbWVzc2FnZQord2l0aGluIHRoZSB0aHJlYWQuCisKK0BzZWN0aW9uIEhvdyBkbyBJIHNlYXJjaCB0aGUgYXJjaGl2ZXM/CisKK1BlcmZvcm0gYSBzaXRlIHNlYXJjaCB1c2luZyB5b3VyIGZhdm9yaXRlIHNlYXJjaCBlbmdpbmUuIEV4YW1wbGU6CisKK0B0e3NpdGU6bGlzdHMuZmZtcGVnLm9yZy9waXBlcm1haWwvZmZtcGVnLXVzZXIvICJzZWFyY2ggdGVybSJ9CisKK0BjaGFwdGVyIE90aGVyCisKK0BzZWN0aW9uIElzIHRoZXJlIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBtYWlsaW5nIGxpc3Q/CisKK1lvdSBjYW4gYXNrIGZvciBoZWxwIGluIHRoZSBvZmZpY2lhbCBAdHsjZmZtcGVnfSBJUkMgY2hhbm5lbCBvbiBGcmVlbm9kZS4KKworU29tZSB1c2VycyBwcmVmZXIgdGhlIHRoaXJkLXBhcnR5IE5hYmJsZSBpbnRlcmZhY2Ugd2hpY2ggcHJlc2VudHMgdGhlCittYWlsaW5nIGxpc3RzIGluIGEgdHlwaWNhbCBmb3J1bSBsYXlvdXQuCisKK1RoZXJlIGFyZSBhbHNvIG51bWVyb3VzIHRoaXJkLXBhcnR5IGhlbHAgc2l0ZXMgc3VjaCBhcyBTdXBlciBVc2VyIGFuZAorci9mZm1wZWcgb24gcmVkZGl0LgorCitAYW5jaG9ye1doYXQgaXMgdG9wLXBvc3Rpbmc/fQorQHNlY3Rpb24gV2hhdCBpcyB0b3AtcG9zdGluZz8KKworU2VlIEB1cmx7aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9zdGluZ19zdHlsZSNUb3AtcG9zdGluZ30uCisKK0luc3RlYWQsIHVzZSB0cmltbWVkIGludGVybGVhdmVkL2lubGluZSByZXBsaWVzIChAdXJse2h0dHBzOi8vbGlzdHMuZmZtcGVnLm9yZy9waXBlcm1haWwvZmZtcGVnLXVzZXIvMjAxNy1BcHJpbC8wMzU4NDkuaHRtbCwgZXhhbXBsZX0pLgorCitAYW5jaG9ye1doYXQgaXMgdGhlIG1lc3NhZ2Ugc2l6ZSBsaW1pdD99CitAc2VjdGlvbiBXaGF0IGlzIHRoZSBtZXNzYWdlIHNpemUgbGltaXQ/CisKK1RoZSBtZXNzYWdlIHNpemUgbGltaXQgaXMgNTAwIGtpbG9ieXRlcyBmb3IgdGhlIHVzZXIgbGlzdHMgYW5kIDEwMDAKK2tpbG9ieXRlcyBmb3IgZmZtcGVnLWRldmVsLiBQbGVhc2UgcHJvdmlkZSBsaW5rcyB0byBsYXJnZXIgZmlsZXMgaW5zdGVhZAorb2YgYXR0YWNoaW5nIHRoZW0uCisKK0BzZWN0aW9uIFdoZXJlIGNhbiBJIHVwbG9hZCBzYW1wbGUgZmlsZXM/CisKK0FueXdoZXJlIHRoYXQgaXMgbm90IHRvbyBhbm5veWluZyBmb3IgdXMgdG8gdXNlLgorCitHb29nbGUgRHJpdmUgYW5kIERyb3Bib3ggYXJlIGFjY2VwdGFibGUgaWYgeW91IG5lZWQgYSBmaWxlIGhvc3QsIGFuZAorMHgwLnN0IGlzIGdvb2QgZm9yIGZpbGVzIHVuZGVyIDI1NiBNaUIuCisKK1NtYWxsLCBzaG9ydCBzYW1wbGVzIGFyZSBwcmVmZXJyZWQgaWYgcG9zc2libGUuCisKK0BzZWN0aW9uIFdpbGwgSSByZWNlaXZlIHNwYW0gaWYgSSBzZW5kIGFuZC9vciBzdWJzY3JpYmUgdG8gYSBtYWlsaW5nIGxpc3Q/CisKK0hpZ2hseSB1bmxpa2VseS4KKworQGl0ZW1pemUKK0BpdGVtCitUaGUgbGlzdCBvZiBzdWJzY3JpYmVkIHVzZXJzIGlzIG5vdCBwdWJsaWMuCisKK0BpdGVtCitFbWFpbCBhZGRyZXNzZXMgaW4gdGhlIGFyY2hpdmVzIGFyZSBvYmZ1c2NhdGVkLgorCitAaXRlbQorU2V2ZXJhbCB1bmlxdWUgdGVzdCBlbWFpbCBhY2NvdW50cyB3ZXJlIHV0aWxpemVkIGFuZCBub25lIGhhdmUgeWV0CityZWNlaXZlZCBhbnkgc3BhbS4KK0BlbmQgaXRlbWl6ZQorCitIb3dldmVyLCB5b3UgbWF5IHNlZSBhIHNwYW0gaW4gdGhlIG1haWxpbmcgbGlzdHMgb24gcmFyZSBvY2Nhc2lvbnM6CisKK0BpdGVtaXplCitAaXRlbQorU3BhbSBpbiB0aGUgbW9kZXJhdGlvbiBxdWV1ZSBtYXkgYmUgYWNjaWRlbnRhbGx5IGFwcHJvdmVkIGR1ZSB0byBodW1hbgorZXJyb3IuCisKK0BpdGVtCitUaGVyZSBoYXZlIGJlZW4gYSBmZXcgbWVzc2FnZXMgZnJvbSBzdWJzY3JpYmVkIHVzZXJzIHdobyBoYWQgdGhlaXIgb3duCitlbWFpbCBhZGRyZXNzZXMgaGFja2VkIGFuZCBzcGFtIG1lc3NhZ2VzIGZyb20gKG9yIGFwcGVhcmluZyB0byBiZSBmcm9tKQordGhlIGhhY2tlZCBhY2NvdW50IHdlcmUgc2VudCB0byB0aGVpciBjb250YWN0cyAoYSBtYWlsaW5nIGxpc3QgYmVpbmcgYQorY29udGFjdCBpbiB0aGVzZSBjYXNlcykuCisKK0BpdGVtCitJZiB5b3UgYXJlIHN1YnNjcmliZWQgdG8gdGhlIGJ1ZyB0cmFja2VyIG1haWxpbmcgbGlzdCAoZmZtcGVnLXRyYWMpIHlvdQorbWF5IHNlZSB0aGUgb2NjYXNpb25hbCBzcGFtIGFzIGEgZmFsc2UgYnVnIHJlcG9ydCwgYnV0IHdlIHRha2UgbWVhc3VyZXMKK3RvIHRyeSB0byBwcmV2ZW50IHRoaXMuCitAZW5kIGl0ZW1pemUKKworQHNlY3Rpb24gSG93IGRvIEkgZmlsdGVyIG1haWxpbmcgbGlzdCBtZXNzYWdlcz8KKworVXNlIHRoZSBAZW1waHtMaXN0LUlkfS4gRm9yIGV4YW1wbGUsIHRoZSBmZm1wZWctdXNlciBtYWlsaW5nIGxpc3QgaXMKK0B0e2ZmbXBlZy11c2VyLmZmbXBlZy5vcmd9LiBZb3UgY2FuIHZpZXcgdGhlIExpc3QtSWQgaW4gdGhlIHJhdyBtZXNzYWdlCitvciBoZWFkZXJzLgorCitZb3UgY2FuIHRoZW4gZmlsdGVyIHRoZSBtYWlsaW5nIGxpc3QgbWVzc2FnZXMgdG8gdGhlaXIgb3duIGZvbGRlci4KKworQGNoYXB0ZXIgUnVsZXMgYW5kIEV0aXF1ZXR0ZQorCitAc2VjdGlvbiBXaGF0IGFyZSB0aGUgcnVsZXMgYW5kIHRoZSBwcm9wZXIgZXRpcXVldHRlPworCitUaGVyZSBtYXkgc2VlbSB0byBiZSBtYW55IHRoaW5ncyB0byByZW1lbWJlciwgYnV0IHdlIHdhbnQgdG8gaGVscCBhbmQKK2ZvbGxvd2luZyB0aGVzZSBndWlkZWxpbmVzIHdpbGwgYWxsb3cgeW91IHRvIGdldCBhbnN3ZXJzIG1vcmUgcXVpY2tseQorYW5kIGhlbHAgYXZvaWQgZ2V0dGluZyBpZ25vcmVkLgorCitAaXRlbWl6ZQorQGl0ZW0KK0Fsd2F5cyBzaG93IHlvdXIgYWN0dWFsLCB1bnNjcmlwdGVkIEBjb21tYW5ke2ZmbXBlZ30gY29tbWFuZCBhbmQgdGhlCitjb21wbGV0ZSwgdW5jdXQgY29uc29sZSBvdXRwdXQgZnJvbSB5b3VyIGNvbW1hbmQuCisKK0BpdGVtCitVc2UgdGhlIG1vc3Qgc2ltcGxlIGFuZCBtaW5pbWFsIGNvbW1hbmQgdGhhdCBzdGlsbCBzaG93cyB0aGUgaXNzdWUgeW91CithcmUgZW5jb3VudGVyaW5nLgorCitAaXRlbQorUHJvdmlkZSBhbGwgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHNvIG90aGVycyBjYW4gYXR0ZW1wdCB0byBkdXBsaWNhdGUKK3lvdXIgaXNzdWUuIFRoaXMgaW5jbHVkZXMgdGhlIGFjdHVhbCBjb21tYW5kLCBjb21wbGV0ZSB1bmN1dCBjb25zb2xlCitvdXRwdXQsIGFuZCBhbnkgaW5wdXRzIHRoYXQgYXJlIHJlcXVpcmVkIHRvIGR1cGxpY2F0ZSB0aGUgaXNzdWUuCisKK0BpdGVtCitVc2UgdGhlIGxhdGVzdCBAY29tbWFuZHtmZm1wZWd9IGJ1aWxkIHlvdSBjYW4gZ2V0LiBTZWUgdGhlIEB1cmx7aHR0cHM6Ly9mZm1wZWcub3JnL2Rvd25sb2FkLmh0bWwsIEZGbXBlZyBEb3dubG9hZH0KK3BhZ2UgZm9yIGxpbmtzIHRvIHJlY2VudCBidWlsZHMgZm9yIExpbnV4LCBtYWNPUywgYW5kIFdpbmRvd3MuIE9yCitjb21waWxlIGZyb20gdGhlIGN1cnJlbnQgZ2l0IG1hc3RlciBicmFuY2guCisKK0BpdGVtCitBdm9pZCBAdXJse2h0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Bvc3Rpbmdfc3R5bGUjVG9wLXBvc3RpbmcsIHRvcC1wb3N0aW5nfS4KK0Fsc28gc2VlIEByZWZ7V2hhdCBpcyB0b3AtcG9zdGluZz99CisKK0BpdGVtCitBdm9pZCBoaWphY2tpbmcgdGhyZWFkcy4gVGhyZWFkIGhpamFja2luZyBpcyByZXBseWluZyB0byBhIG1lc3NhZ2UgYW5kCitjaGFuZ2luZyB0aGUgc3ViamVjdCBsaW5lIHRvIHNvbWV0aGluZyB1bnJlbGF0ZWQgdG8gdGhlIG9yaWdpbmFsIHRocmVhZC4KK01vc3QgZW1haWwgY2xpZW50cyB3aWxsIHN0aWxsIHNob3cgdGhlIHJlbmFtZWQgbWVzc2FnZSB1bmRlciB0aGUKK29yaWdpbmFsIHRocmVhZC4gVGhpcyBjYW4gYmUgY29uZnVzaW5nIGFuZCB0aGVzZSB0eXBlcyBvZiBtZXNzYWdlcyBhcmUKK29mdGVuIGlnbm9yZWQuCisKK0BpdGVtCitEbyBub3Qgc2VuZCBzY3JlZW5zaG90cy4gQ29weSBhbmQgcGFzdGUgY29uc29sZSB0ZXh0IGluc3RlYWQgb2YgbWFraW5nCitzY3JlZW5zaG90cyBvZiB0aGUgdGV4dC4KKworQGl0ZW0KK0F2b2lkIHNlbmRpbmcgZW1haWwgZGlzY2xhaW1lcnMgYW5kIGxlZ2FsZXNlIGlmIHBvc3NpYmxlIGFzIHRoaXMgaXMgYQorcHVibGljIGxpc3QuCisKK0BpdGVtCitBdm9pZCB1c2luZyB0aGUgQGNvZGV7LWxvZ2xldmVsIGRlYnVnfSwgQGNvZGV7LWxvZ2xldmVsIHF1aWV0fSwgYW5kCitAY29tbWFuZHstaGlkZV9iYW5uZXJ9IG9wdGlvbnMgdW5sZXNzIHJlcXVlc3RlZCB0byBkbyBzby4KKworQGl0ZW0KK0lmIHlvdSBhdHRhY2ggZmlsZXMgYXZvaWQgY29tcHJlc3Npbmcgc21hbGwgZmlsZXMuIFVuY29tcHJlc3NlZCBpcworcHJlZmVycmVkLgorCitAaXRlbQorUGxlYXNlIGRvIG5vdCBzZW5kIEhUTUwtb25seSBtZXNzYWdlcy4gVGhlIG1haWxpbmcgbGlzdCB3aWxsIGlnbm9yZSB0aGUKK0hUTUwgY29tcG9uZW50IG9mIHlvdXIgbWVzc2FnZS4gTW9zdCBtYWlsIGNsaWVudHMgd2lsbCBhdXRvbWF0aWNhbGx5CitpbmNsdWRlIGEgdGV4dCBjb21wb25lbnQ6IHRoaXMgaXMgd2hhdCB0aGUgbWFpbGluZyBsaXN0IHdpbGwgdXNlLgorCitAaXRlbQorQ29uZmlndXJpbmcgeW91ciBtYWlsIGNsaWVudCB0byBicmVhayBsaW5lcyBhZnRlciA3MCBvciBzbyBjaGFyYWN0ZXJzIGlzCityZWNvbW1lbmRlZC4KKworQGl0ZW0KK0F2b2lkIHNlbmRpbmcgdGhlIHNhbWUgbWVzc2FnZSB0byBtdWx0aXBsZSBtYWlsaW5nIGxpc3RzLgorCitAaXRlbQorUGxlYXNlIGZvbGxvdyBvdXIgQHVybHtodHRwczovL2ZmbXBlZy5vcmcvZGV2ZWxvcGVyLmh0bWwjQ29kZS1vZi1jb25kdWN0LCBDb2RlIG9mIENvbmR1Y3R9LgorQGVuZCBpdGVtaXplCisKK0BjaGFwdGVyIEhlbHAKKworQHNlY3Rpb24gV2h5IGFtIEkgbm90IHJlY2VpdmluZyBhbnkgbWVzc2FnZXM/CisKK1NvbWUgZW1haWwgcHJvdmlkZXJzIGhhdmUgYmxhY2tsaXN0cyBvciBzcGFtIGZpbHRlcnMgdGhhdCBibG9jayBvciBtYXJrCit0aGUgbWFpbGluZyBsaXN0IG1lc3NhZ2VzIGFzIGZhbHNlIHBvc2l0aXZlcy4gVW5mb3J0dW5hdGVseSwgdGhlIHVzZXIgaXMKK29mdGVuIG5vdCBhd2FyZSBvZiB0aGlzIGFuZCBpcyBvZnRlbiBvdXQgb2YgdGhlaXIgY29udHJvbC4KKworV2hlbiBwb3NzaWJsZSB3ZSBhdHRlbXB0IHRvIG5vdGlmeSB0aGUgcHJvdmlkZXIgdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZQorYmxhY2tsaXN0cyBvciBmaWx0ZXJzLgorCitAc2VjdGlvbiBXaHkgYXJlIG15IHNlbnQgbWVzc2FnZXMgbm90IHNob3dpbmcgdXA/CisKK0V4Y2x1ZGluZyBAcmVme1doeSBpcyBteSBtZXNzYWdlIGF3YWl0aW5nIG1vZGVyYXRvciBhcHByb3ZhbD8sIG1lc3NhZ2VzIHRoYXQgYXJlIGhlbGQgaW4gdGhlIG1vZGVyYXRpb24gcXVldWV9Cit0aGVyZSBhcmUgYSBmZXcgb3RoZXIgcmVhc29ucyB3aHkgeW91ciBtZXNzYWdlcyBtYXkgZmFpbCB0byBhcHBlYXI6CisKK0BpdGVtaXplCitAaXRlbQorSFRNTC1vbmx5IG1lc3NhZ2VzIGFyZSBpZ25vcmVkIGJ5IHRoZSBtYWlsaW5nIGxpc3RzLiBNb3N0IG1haWwgY2xpZW50cworYXV0b21hdGljYWxseSBpbmNsdWRlIGEgdGV4dCBjb21wb25lbnQgYWxvbmdzaWRlIEhUTUwgZW1haWw6IHRoaXMgaXMgd2hhdAordGhlIG1haWxpbmcgbGlzdCB3aWxsIHVzZS4gSWYgaXQgZG9lcyBub3QgdGhlbiBjb25zaWRlciB5b3VyIGNsaWVudCB0byBiZQorYnJva2VuLCBiZWNhdXNlIHNlbmRpbmcgYSB0ZXh0IGNvbXBvbmVudCBhbG9uZyB3aXRoIHRoZSBIVE1MIGNvbXBvbmVudCB0bworZm9ybSBhIG11bHRpLXBhcnQgbWVzc2FnZSBpcyByZWNvbW1lbmRlZCBieSBlbWFpbCBzdGFuZGFyZHMuCisKK0BpdGVtCitDaGVjayB5b3VyIHNwYW0gZm9sZGVyLgorQGVuZCBpdGVtaXplCisKK0BhbmNob3J7V2hvIGRvIEkgY29udGFjdCBpZiBJIGhhdmUgYSBwcm9ibGVtIHdpdGggdGhlIG1haWxpbmcgbGlzdD99CitAc2VjdGlvbiBXaG8gZG8gSSBjb250YWN0IGlmIEkgaGF2ZSBhIHByb2JsZW0gd2l0aCB0aGUgbWFpbGluZyBsaXN0PworCitTZW5kIGEgbWVzc2FnZSB0byBAZW1haWx7ZmZtcGVnLXVzZXItb3duZXJAQGZmbXBlZy5vcmd9LgorCitAYnllCmRpZmYgLS1naXQgYS9kb2MvbXV4ZXJzLnRleGkgYi9kb2MvbXV4ZXJzLnRleGkKaW5kZXggMmU2YmI0Yy4uZjI4ODc2NCAxMDA2NDQKLS0tIGEvZG9jL211eGVycy50ZXhpCisrKyBiL2RvYy9tdXhlcnMudGV4aQpAQCAtMTMsOCArMTMsOSBAQAogd2l0aCB0aGUgb3B0aW9ucyBAY29kZXstLWVuYWJsZS1tdXhlcj1AdmFye01VWEVSfX0gLwogQGNvZGV7LS1kaXNhYmxlLW11eGVyPUB2YXJ7TVVYRVJ9fS4KIAotVGhlIG9wdGlvbiBAY29kZXstZm9ybWF0c30gb2YgdGhlIGZmKiB0b29scyB3aWxsIGRpc3BsYXkgdGhlIGxpc3Qgb2YKLWVuYWJsZWQgbXV4ZXJzLgorVGhlIG9wdGlvbiBAY29kZXstbXV4ZXJzfSBvZiB0aGUgZmYqIHRvb2xzIHdpbGwgZGlzcGxheSB0aGUgbGlzdCBvZgorZW5hYmxlZCBtdXhlcnMuIFVzZSBAY29kZXstZm9ybWF0c30gdG8gdmlldyBhIGNvbWJpbmVkIGxpc3Qgb2YKK2VuYWJsZWQgZGVtdXhlcnMgYW5kIG11eGVycy4KIAogQSBkZXNjcmlwdGlvbiBvZiBzb21lIG9mIHRoZSBjdXJyZW50bHkgYXZhaWxhYmxlIG11eGVycyBmb2xsb3dzLgogCkBAIC01Nyw2ICs1OCwzOSBAQAogCiBAZW5kIHRhYmxlCiAKK0BhbmNob3J7YXZpfQorQHNlY3Rpb24gYXZpCisKK0F1ZGlvIFZpZGVvIEludGVybGVhdmVkIG11eGVyLgorCitAc3Vic2VjdGlvbiBPcHRpb25zCisKK0l0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gcmVzZXJ2ZV9pbmRleF9zcGFjZQorUmVzZXJ2ZSB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBieXRlcyBmb3IgdGhlIE9wZW5ETUwgbWFzdGVyIGluZGV4IG9mIGVhY2gKK3N0cmVhbSB3aXRoaW4gdGhlIGZpbGUgaGVhZGVyLiBCeSBkZWZhdWx0IGFkZGl0aW9uYWwgbWFzdGVyIGluZGV4ZXMgYXJlCitlbWJlZGRlZCB3aXRoaW4gdGhlIGRhdGEgcGFja2V0cyBpZiB0aGVyZSBpcyBubyBzcGFjZSBsZWZ0IGluIHRoZSBmaXJzdCBtYXN0ZXIKK2luZGV4IGFuZCBhcmUgbGlua2VkIHRvZ2V0aGVyIGFzIGEgY2hhaW4gb2YgaW5kZXhlcy4gVGhpcyBpbmRleCBzdHJ1Y3R1cmUgY2FuCitjYXVzZSBwcm9ibGVtcyBmb3Igc29tZSB1c2UgY2FzZXMsIGUuZy4gdGhpcmQtcGFydHkgc29mdHdhcmUgc3RyaWN0bHkgcmVseWluZworb24gdGhlIE9wZW5ETUwgaW5kZXggc3BlY2lmaWNhdGlvbiBvciB3aGVuIGZpbGUgc2Vla2luZyBpcyBzbG93LiBSZXNlcnZpbmcKK2Vub3VnaCBpbmRleCBzcGFjZSBpbiB0aGUgZmlsZSBoZWFkZXIgYXZvaWRzIHRoZXNlIHByb2JsZW1zLgorCitUaGUgcmVxdWlyZWQgaW5kZXggc3BhY2UgZGVwZW5kcyBvbiB0aGUgb3V0cHV0IGZpbGUgc2l6ZSBhbmQgc2hvdWxkIGJlIGFib3V0IDE2CitieXRlcyBwZXIgZ2lnYWJ5dGUuIFdoZW4gdGhpcyBvcHRpb24gaXMgb21pdHRlZCBvciBzZXQgdG8gemVybyB0aGUgbmVjZXNzYXJ5CitpbmRleCBzcGFjZSBpcyBndWVzc2VkLgorCitAaXRlbSB3cml0ZV9jaGFubmVsX21hc2sKK1dyaXRlIHRoZSBjaGFubmVsIGxheW91dCBtYXNrIGludG8gdGhlIGF1ZGlvIHN0cmVhbSBoZWFkZXIuCisKK1RoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gRGlzYWJsaW5nIHRoZSBjaGFubmVsIG1hc2sgY2FuIGJlIHVzZWZ1bCBpbgorc3BlY2lmaWMgc2NlbmFyaW9zLCBlLmcuIHdoZW4gbWVyZ2luZyBtdWx0aXBsZSBhdWRpbyBzdHJlYW1zIGludG8gb25lIGZvcgorY29tcGF0aWJpbGl0eSB3aXRoIHNvZnR3YXJlIHRoYXQgb25seSBzdXBwb3J0cyBhIHNpbmdsZSBhdWRpbyBzdHJlYW0gaW4gQVZJCisoc2VlIEByZWZ7YW1lcmdlLCx0aGUgImFtZXJnZSIgc2VjdGlvbiBpbiB0aGUgZmZtcGVnLWZpbHRlcnMgbWFudWFsLGZmbXBlZy1maWx0ZXJzfSkuCisKK0BlbmQgdGFibGUKKwogQGFuY2hvcntjaHJvbWFwcmludH0KIEBzZWN0aW9uIGNocm9tYXByaW50CiAKQEAgLTEyOSw2ICsxNjMsMTExIEBACiBmZm1wZWcgLWkgSU5QVVQgLWM6YSBwY21fdTggLWM6diBtcGVnMnZpZGVvIC1mIGNyYyAtCiBAZW5kIGV4YW1wbGUKIAorQHNlY3Rpb24gZmx2CisKK0Fkb2JlIEZsYXNoIFZpZGVvIEZvcm1hdCBtdXhlci4KKworVGhpcyBtdXhlciBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKKworQHRhYmxlIEBvcHRpb24KKworQGl0ZW0gZmx2ZmxhZ3MgQHZhcntmbGFnc30KK1Bvc3NpYmxlIHZhbHVlczoKKworQHRhYmxlIEBzYW1wCisKK0BpdGVtIGFhY19zZXFfaGVhZGVyX2RldGVjdAorUGxhY2UgQUFDIHNlcXVlbmNlIGhlYWRlciBiYXNlZCBvbiBhdWRpbyBzdHJlYW0gZGF0YS4KKworQGl0ZW0gbm9fc2VxdWVuY2VfZW5kCitEaXNhYmxlIHNlcXVlbmNlIGVuZCB0YWcuCisKK0BpdGVtIG5vX21ldGFkYXRhCitEaXNhYmxlIG1ldGFkYXRhIHRhZy4KKworQGl0ZW0gbm9fZHVyYXRpb25fZmlsZXNpemUKK0Rpc2FibGUgZHVyYXRpb24gYW5kIGZpbGVzaXplIGluIG1ldGFkYXRhIHdoZW4gdGhleSBhcmUgZXF1YWwgdG8gemVybworYXQgdGhlIGVuZCBvZiBzdHJlYW0uIChCZSB1c2VkIHRvIG5vbi1zZWVrYWJsZSBsaXZpbmcgc3RyZWFtKS4KKworQGl0ZW0gYWRkX2tleWZyYW1lX2luZGV4CitVc2VkIHRvIGZhY2lsaXRhdGUgc2Vla2luZzsgcGFydGljdWxhcmx5IGZvciBIVFRQIHBzZXVkbyBzdHJlYW1pbmcuCitAZW5kIHRhYmxlCitAZW5kIHRhYmxlCisKK0BhbmNob3J7ZGFzaH0KK0BzZWN0aW9uIGRhc2gKKworRHluYW1pYyBBZGFwdGl2ZSBTdHJlYW1pbmcgb3ZlciBIVFRQIChEQVNIKSBtdXhlciB0aGF0IGNyZWF0ZXMgc2VnbWVudHMKK2FuZCBtYW5pZmVzdCBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlIE1QRUctREFTSCBzdGFuZGFyZCBJU08vSUVDIDIzMDA5LTE6MjAxNC4KKworRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOgorCitAaXRlbWl6ZSBAYnVsbGV0CitAaXRlbQorSVNPIERBU0ggU3BlY2lmaWNhdGlvbjogQHVybHtodHRwOi8vc3RhbmRhcmRzLmlzby5vcmcvaXR0Zi9QdWJsaWNseUF2YWlsYWJsZVN0YW5kYXJkcy9jMDY1Mjc0X0lTT19JRUNfMjMwMDktMV8yMDE0LnppcH0KK0BpdGVtCitXZWJNIERBU0ggU3BlY2lmaWNhdGlvbjogQHVybHtodHRwczovL3NpdGVzLmdvb2dsZS5jb20vYS93ZWJtcHJvamVjdC5vcmcvd2lraS9hZGFwdGl2ZS1zdHJlYW1pbmcvd2VibS1kYXNoLXNwZWNpZmljYXRpb259CitAZW5kIGl0ZW1pemUKKworSXQgY3JlYXRlcyBhIE1QRCBtYW5pZmVzdCBmaWxlIGFuZCBzZWdtZW50IGZpbGVzIGZvciBlYWNoIHN0cmVhbS4KKworVGhlIHNlZ21lbnQgZmlsZW5hbWUgbWlnaHQgY29udGFpbiBwcmUtZGVmaW5lZCBpZGVudGlmaWVycyB1c2VkIHdpdGggU2VnbWVudFRlbXBsYXRlCithcyBkZWZpbmVkIGluIHNlY3Rpb24gNS4zLjkuNC40IG9mIHRoZSBzdGFuZGFyZC4gQXZhaWxhYmxlIGlkZW50aWZpZXJzIGFyZSAiJFJlcHJlc2VudGF0aW9uSUQkIiwKKyIkTnVtYmVyJCIsICIkQmFuZHdpZHRoJCIgYW5kICIkVGltZSQiLgorCitAZXhhbXBsZQorZmZtcGVnIC1yZSAtaSA8aW5wdXQ+IC1tYXAgMCAtbWFwIDAgLWM6YSBsaWJmZGtfYWFjIC1jOnYgbGlieDI2NAorLWI6djowIDgwMGsgLWI6djoxIDMwMGsgLXM6djoxIDMyMHgxNzAgLXByb2ZpbGU6djoxIGJhc2VsaW5lCistcHJvZmlsZTp2OjAgbWFpbiAtYmYgMSAta2V5aW50X21pbiAxMjAgLWcgMTIwIC1zY190aHJlc2hvbGQgMAorLWJfc3RyYXRlZ3kgMCAtYXI6YToxIDIyMDUwIC11c2VfdGltZWxpbmUgMSAtdXNlX3RlbXBsYXRlIDEKKy13aW5kb3dfc2l6ZSA1IC1hZGFwdGF0aW9uX3NldHMgImlkPTAsc3RyZWFtcz12IGlkPTEsc3RyZWFtcz1hIgorLWYgZGFzaCAvcGF0aC90by9vdXQubXBkCitAZW5kIGV4YW1wbGUKKworQHRhYmxlIEBvcHRpb24KK0BpdGVtIC1taW5fc2VnX2R1cmF0aW9uIEB2YXJ7bWljcm9zZWNvbmRzfQorU2V0IHRoZSBzZWdtZW50IGxlbmd0aCBpbiBtaWNyb3NlY29uZHMuCitAaXRlbSAtd2luZG93X3NpemUgQHZhcntzaXplfQorU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cyBrZXB0IGluIHRoZSBtYW5pZmVzdC4KK0BpdGVtIC1leHRyYV93aW5kb3dfc2l6ZSBAdmFye3NpemV9CitTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIGtlcHQgb3V0c2lkZSBvZiB0aGUgbWFuaWZlc3QgYmVmb3JlIHJlbW92aW5nIGZyb20gZGlzay4KK0BpdGVtIC1yZW1vdmVfYXRfZXhpdCBAdmFye3JlbW92ZX0KK0VuYWJsZSAoMSkgb3IgZGlzYWJsZSAoMCkgcmVtb3ZhbCBvZiBhbGwgc2VnbWVudHMgd2hlbiBmaW5pc2hlZC4KK0BpdGVtIC11c2VfdGVtcGxhdGUgQHZhcnt0ZW1wbGF0ZX0KK0VuYWJsZSAoMSkgb3IgZGlzYWJsZSAoMCkgdXNlIG9mIFNlZ21lbnRUZW1wbGF0ZSBpbnN0ZWFkIG9mIFNlZ21lbnRMaXN0LgorQGl0ZW0gLXVzZV90aW1lbGluZSBAdmFye3RpbWVsaW5lfQorRW5hYmxlICgxKSBvciBkaXNhYmxlICgwKSB1c2Ugb2YgU2VnbWVudFRpbWVsaW5lIGluIFNlZ21lbnRUZW1wbGF0ZS4KK0BpdGVtIC1zaW5nbGVfZmlsZSBAdmFye3NpbmdsZV9maWxlfQorRW5hYmxlICgxKSBvciBkaXNhYmxlICgwKSBzdG9yaW5nIGFsbCBzZWdtZW50cyBpbiBvbmUgZmlsZSwgYWNjZXNzZWQgdXNpbmcgYnl0ZSByYW5nZXMuCitAaXRlbSAtc2luZ2xlX2ZpbGVfbmFtZSBAdmFye2ZpbGVfbmFtZX0KK0RBU0gtdGVtcGxhdGVkIG5hbWUgdG8gYmUgdXNlZCBmb3IgYmFzZVVSTC4gSW1wbGllcyBAdmFye3NpbmdsZV9maWxlfSBzZXQgdG8gIjEiLgorQGl0ZW0gLWluaXRfc2VnX25hbWUgQHZhcntpbml0X25hbWV9CitEQVNILXRlbXBsYXRlZCBuYW1lIHRvIHVzZWQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBzZWdtZW50LiBEZWZhdWx0IGlzICJpbml0LXN0cmVhbSRSZXByZXNlbnRhdGlvbklEJC5tNHMiCitAaXRlbSAtbWVkaWFfc2VnX25hbWUgQHZhcntzZWdtZW50X25hbWV9CitEQVNILXRlbXBsYXRlZCBuYW1lIHRvIHVzZWQgZm9yIHRoZSBtZWRpYSBzZWdtZW50cy4gRGVmYXVsdCBpcyAiY2h1bmstc3RyZWFtJFJlcHJlc2VudGF0aW9uSUQkLSROdW1iZXIlMDVkJC5tNHMiCitAaXRlbSAtdXRjX3RpbWluZ191cmwgQHZhcnt1dGNfdXJsfQorVVJMIG9mIHRoZSBwYWdlIHRoYXQgd2lsbCByZXR1cm4gdGhlIFVUQyB0aW1lc3RhbXAgaW4gSVNPIGZvcm1hdC4gRXhhbXBsZTogImh0dHBzOi8vdGltZS5ha2FtYWkuY29tLz9pc28iCitAaXRlbSAtaHR0cF91c2VyX2FnZW50IEB2YXJ7dXNlcl9hZ2VudH0KK092ZXJyaWRlIFVzZXItQWdlbnQgZmllbGQgaW4gSFRUUCBoZWFkZXIuIEFwcGxpY2FibGUgb25seSBmb3IgSFRUUCBvdXRwdXQuCitAaXRlbSAtaHR0cF9wZXJzaXN0ZW50IEB2YXJ7aHR0cF9wZXJzaXN0ZW50fQorVXNlIHBlcnNpc3RlbnQgSFRUUCBjb25uZWN0aW9ucy4gQXBwbGljYWJsZSBvbmx5IGZvciBIVFRQIG91dHB1dC4KK0BpdGVtIC1obHNfcGxheWxpc3QgQHZhcntobHNfcGxheWxpc3R9CitHZW5lcmF0ZSBITFMgcGxheWxpc3QgZmlsZXMgYXMgd2VsbC4gVGhlIG1hc3RlciBwbGF5bGlzdCBpcyBnZW5lcmF0ZWQgd2l0aCB0aGUgZmlsZW5hbWUgbWFzdGVyLm0zdTguCitPbmUgbWVkaWEgcGxheWxpc3QgZmlsZSBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggc3RyZWFtIHdpdGggZmlsZW5hbWVzIG1lZGlhXzAubTN1OCwgbWVkaWFfMS5tM3U4LCBldGMuCitAaXRlbSAtc3RyZWFtaW5nIEB2YXJ7c3RyZWFtaW5nfQorRW5hYmxlICgxKSBvciBkaXNhYmxlICgwKSBjaHVuayBzdHJlYW1pbmcgbW9kZSBvZiBvdXRwdXQuIEluIGNodW5rIHN0cmVhbWluZworbW9kZSwgZWFjaCBmcmFtZSB3aWxsIGJlIGEgbW9vZiBmcmFnbWVudCB3aGljaCBmb3JtcyBhIGNodW5rLgorQGl0ZW0gLWFkYXB0YXRpb25fc2V0cyBAdmFye2FkYXB0YXRpb25fc2V0c30KK0Fzc2lnbiBzdHJlYW1zIHRvIEFkYXB0YXRpb25TZXRzLiBTeW50YXggaXMgImlkPXgsc3RyZWFtcz1hLGIsYyBpZD15LHN0cmVhbXM9ZCxlIiB3aXRoIHggYW5kIHkgYmVpbmcgdGhlIElEcworb2YgdGhlIGFkYXB0YXRpb24gc2V0cyBhbmQgYSxiLGMsZCBhbmQgZSBhcmUgdGhlIGluZGljZXMgb2YgdGhlIG1hcHBlZCBzdHJlYW1zLgorCitUbyBtYXAgYWxsIHZpZGVvIChvciBhdWRpbykgc3RyZWFtcyB0byBhbiBBZGFwdGF0aW9uU2V0LCAidiIgKG9yICJhIikgY2FuIGJlIHVzZWQgYXMgc3RyZWFtIGlkZW50aWZpZXIgaW5zdGVhZCBvZiBJRHMuCisKK1doZW4gbm8gYXNzaWdubWVudCBpcyBkZWZpbmVkLCB0aGlzIGRlZmF1bHRzIHRvIGFuIEFkYXB0YXRpb25TZXQgZm9yIGVhY2ggc3RyZWFtLgorQGl0ZW0gLXRpbWVvdXQgQHZhcnt0aW1lb3V0fQorU2V0IHRpbWVvdXQgZm9yIHNvY2tldCBJL08gb3BlcmF0aW9ucy4gQXBwbGljYWJsZSBvbmx5IGZvciBIVFRQIG91dHB1dC4KK0BlbmQgdGFibGUKKwogQGFuY2hvcntmcmFtZWNyY30KIEBzZWN0aW9uIGZyYW1lY3JjCiAKQEAgLTE3NCwzMCArMzEzLDcwIEBACiAKIFNlZSBhbHNvIHRoZSBAcmVme2NyY30gbXV4ZXIuCiAKK0BhbmNob3J7ZnJhbWVoYXNofQorQHNlY3Rpb24gZnJhbWVoYXNoCisKK1Blci1wYWNrZXQgaGFzaCB0ZXN0aW5nIGZvcm1hdC4KKworVGhpcyBtdXhlciBjb21wdXRlcyBhbmQgcHJpbnRzIGEgY3J5cHRvZ3JhcGhpYyBoYXNoIGZvciBlYWNoIGF1ZGlvCithbmQgdmlkZW8gcGFja2V0LiBUaGlzIGNhbiBiZSB1c2VkIGZvciBwYWNrZXQtYnktcGFja2V0IGVxdWFsaXR5CitjaGVja3Mgd2l0aG91dCBoYXZpbmcgdG8gaW5kaXZpZHVhbGx5IGRvIGEgYmluYXJ5IGNvbXBhcmlzb24gb24gZWFjaC4KKworQnkgZGVmYXVsdCBhdWRpbyBmcmFtZXMgYXJlIGNvbnZlcnRlZCB0byBzaWduZWQgMTYtYml0IHJhdyBhdWRpbyBhbmQKK3ZpZGVvIGZyYW1lcyB0byByYXcgdmlkZW8gYmVmb3JlIGNvbXB1dGluZyB0aGUgaGFzaCwgYnV0IHRoZSBvdXRwdXQKK29mIGV4cGxpY2l0IGNvbnZlcnNpb25zIHRvIG90aGVyIGNvZGVjcyBjYW4gYWxzbyBiZSB1c2VkLiBJdCB1c2VzIHRoZQorU0hBLTI1NiBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb24gYnkgZGVmYXVsdCwgYnV0IHN1cHBvcnRzIHNldmVyYWwKK290aGVyIGFsZ29yaXRobXMuCisKK1RoZSBvdXRwdXQgb2YgdGhlIG11eGVyIGNvbnNpc3RzIG9mIGEgbGluZSBmb3IgZWFjaCBhdWRpbyBhbmQgdmlkZW8KK3BhY2tldCBvZiB0aGUgZm9ybToKK0BleGFtcGxlCitAdmFye3N0cmVhbV9pbmRleH0sIEB2YXJ7cGFja2V0X2R0c30sIEB2YXJ7cGFja2V0X3B0c30sIEB2YXJ7cGFja2V0X2R1cmF0aW9ufSwgQHZhcntwYWNrZXRfc2l6ZX0sIEB2YXJ7aGFzaH0KK0BlbmQgZXhhbXBsZQorCitAdmFye2hhc2h9IGlzIGEgaGV4YWRlY2ltYWwgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgY29tcHV0ZWQgaGFzaAorZm9yIHRoZSBwYWNrZXQuCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBoYXNoIEB2YXJ7YWxnb3JpdGhtfQorVXNlIHRoZSBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb24gc3BlY2lmaWVkIGJ5IHRoZSBzdHJpbmcgQHZhcnthbGdvcml0aG19LgorU3VwcG9ydGVkIHZhbHVlcyBpbmNsdWRlIEBjb2Rle01ENX0sIEBjb2Rle211cm11cjN9LCBAY29kZXtSSVBFTUQxMjh9LAorQGNvZGV7UklQRU1EMTYwfSwgQGNvZGV7UklQRU1EMjU2fSwgQGNvZGV7UklQRU1EMzIwfSwgQGNvZGV7U0hBMTYwfSwKK0Bjb2Rle1NIQTIyNH0sIEBjb2Rle1NIQTI1Nn0gKGRlZmF1bHQpLCBAY29kZXtTSEE1MTIvMjI0fSwgQGNvZGV7U0hBNTEyLzI1Nn0sCitAY29kZXtTSEEzODR9LCBAY29kZXtTSEE1MTJ9LCBAY29kZXtDUkMzMn0gYW5kIEBjb2Rle2FkbGVyMzJ9LgorCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK1RvIGNvbXB1dGUgdGhlIFNIQS0yNTYgaGFzaCBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvIGZyYW1lcyBpbiBAZmlsZXtJTlBVVH0sCitjb252ZXJ0ZWQgdG8gcmF3IGF1ZGlvIGFuZCB2aWRlbyBwYWNrZXRzLCBhbmQgc3RvcmUgaXQgaW4gdGhlIGZpbGUKK0BmaWxle291dC5zaGEyNTZ9OgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBJTlBVVCAtZiBmcmFtZWhhc2ggb3V0LnNoYTI1NgorQGVuZCBleGFtcGxlCisKK1RvIHByaW50IHRoZSBpbmZvcm1hdGlvbiB0byBzdGRvdXQsIHVzaW5nIHRoZSBNRDUgaGFzaCBmdW5jdGlvbiwgdXNlCit0aGUgY29tbWFuZDoKK0BleGFtcGxlCitmZm1wZWcgLWkgSU5QVVQgLWYgZnJhbWVoYXNoIC1oYXNoIG1kNSAtCitAZW5kIGV4YW1wbGUKKworU2VlIGFsc28gdGhlIEByZWZ7aGFzaH0gbXV4ZXIuCisKIEBhbmNob3J7ZnJhbWVtZDV9CiBAc2VjdGlvbiBmcmFtZW1kNQogCiBQZXItcGFja2V0IE1ENSB0ZXN0aW5nIGZvcm1hdC4KIAotVGhpcyBtdXhlciBjb21wdXRlcyBhbmQgcHJpbnRzIHRoZSBNRDUgaGFzaCBmb3IgZWFjaCBhdWRpbwotYW5kIHZpZGVvIHBhY2tldC4gQnkgZGVmYXVsdCBhdWRpbyBmcmFtZXMgYXJlIGNvbnZlcnRlZCB0byBzaWduZWQKLTE2LWJpdCByYXcgYXVkaW8gYW5kIHZpZGVvIGZyYW1lcyB0byByYXcgdmlkZW8gYmVmb3JlIGNvbXB1dGluZyB0aGUKLWhhc2guCi0KLVRoZSBvdXRwdXQgb2YgdGhlIG11eGVyIGNvbnNpc3RzIG9mIGEgbGluZSBmb3IgZWFjaCBhdWRpbyBhbmQgdmlkZW8KLXBhY2tldCBvZiB0aGUgZm9ybToKLUBleGFtcGxlCi1AdmFye3N0cmVhbV9pbmRleH0sIEB2YXJ7cGFja2V0X2R0c30sIEB2YXJ7cGFja2V0X3B0c30sIEB2YXJ7cGFja2V0X2R1cmF0aW9ufSwgQHZhcntwYWNrZXRfc2l6ZX0sIEB2YXJ7TUQ1fQotQGVuZCBleGFtcGxlCi0KLUB2YXJ7TUQ1fSBpcyBhIGhleGFkZWNpbWFsIG51bWJlciByZXByZXNlbnRpbmcgdGhlIGNvbXB1dGVkIE1ENSBoYXNoCi1mb3IgdGhlIHBhY2tldC4KK1RoaXMgaXMgYSB2YXJpYW50IG9mIHRoZSBAcmVme2ZyYW1laGFzaH0gbXV4ZXIuIFVubGlrZSB0aGF0IG11eGVyLAoraXQgZGVmYXVsdHMgdG8gdXNpbmcgdGhlIE1ENSBoYXNoIGZ1bmN0aW9uLgogCiBAc3Vic2VjdGlvbiBFeGFtcGxlcwogCi1Gb3IgZXhhbXBsZSB0byBjb21wdXRlIHRoZSBNRDUgb2YgdGhlIGF1ZGlvIGFuZCB2aWRlbyBmcmFtZXMgaW4KLUBmaWxle0lOUFVUfSwgY29udmVydGVkIHRvIHJhdyBhdWRpbyBhbmQgdmlkZW8gcGFja2V0cywgYW5kIHN0b3JlIGl0Ci1pbiB0aGUgZmlsZSBAZmlsZXtvdXQubWQ1fToKK1RvIGNvbXB1dGUgdGhlIE1ENSBoYXNoIG9mIHRoZSBhdWRpbyBhbmQgdmlkZW8gZnJhbWVzIGluIEBmaWxle0lOUFVUfSwKK2NvbnZlcnRlZCB0byByYXcgYXVkaW8gYW5kIHZpZGVvIHBhY2tldHMsIGFuZCBzdG9yZSBpdCBpbiB0aGUgZmlsZQorQGZpbGV7b3V0Lm1kNX06CiBAZXhhbXBsZQogZmZtcGVnIC1pIElOUFVUIC1mIGZyYW1lbWQ1IG91dC5tZDUKIEBlbmQgZXhhbXBsZQpAQCAtMjA3LDcgKzM4Niw3IEBACiBmZm1wZWcgLWkgSU5QVVQgLWYgZnJhbWVtZDUgLQogQGVuZCBleGFtcGxlCiAKLVNlZSBhbHNvIHRoZSBAcmVme21kNX0gbXV4ZXIuCitTZWUgYWxzbyB0aGUgQHJlZntmcmFtZWhhc2h9IGFuZCBAcmVme21kNX0gbXV4ZXJzLgogCiBAYW5jaG9ye2dpZn0KIEBzZWN0aW9uIGdpZgpAQCAtMjM0LDE0ICs0MTMsNTkgQEAKIGZmbXBlZyAtaSBJTlBVVCAtbG9vcCAxMCAtZmluYWxfZGVsYXkgNTAwIG91dC5naWYKIEBlbmQgZXhhbXBsZQogCi1Ob3RlIDE6IGlmIHlvdSB3aXNoIHRvIGV4dHJhY3QgdGhlIGZyYW1lcyBpbiBzZXBhcmF0ZSBHSUYgZmlsZXMsIHlvdSBuZWVkIHRvCitOb3RlIDE6IGlmIHlvdSB3aXNoIHRvIGV4dHJhY3QgdGhlIGZyYW1lcyBpbnRvIHNlcGFyYXRlIEdJRiBmaWxlcywgeW91IG5lZWQgdG8KIGZvcmNlIHRoZSBAcmVme2ltYWdlMn0gbXV4ZXI6CiBAZXhhbXBsZQogZmZtcGVnIC1pIElOUFVUIC1jOnYgZ2lmIC1mIGltYWdlMiAib3V0JWQuZ2lmIgogQGVuZCBleGFtcGxlCiAKLU5vdGUgMjogdGhlIEdJRiBmb3JtYXQgaGFzIGEgdmVyeSBzbWFsbCB0aW1lIGJhc2U6IHRoZSBkZWxheSBiZXR3ZWVuIHR3byBmcmFtZXMKLWNhbiBub3QgYmUgc21hbGxlciB0aGFuIG9uZSBjZW50aSBzZWNvbmQuCitOb3RlIDI6IHRoZSBHSUYgZm9ybWF0IGhhcyBhIHZlcnkgbGFyZ2UgdGltZSBiYXNlOiB0aGUgZGVsYXkgYmV0d2VlbiB0d28gZnJhbWVzCitjYW4gdGhlcmVmb3JlIG5vdCBiZSBzbWFsbGVyIHRoYW4gb25lIGNlbnRpIHNlY29uZC4KKworQGFuY2hvcntoYXNofQorQHNlY3Rpb24gaGFzaAorCitIYXNoIHRlc3RpbmcgZm9ybWF0LgorCitUaGlzIG11eGVyIGNvbXB1dGVzIGFuZCBwcmludHMgYSBjcnlwdG9ncmFwaGljIGhhc2ggb2YgYWxsIHRoZSBpbnB1dAorYXVkaW8gYW5kIHZpZGVvIGZyYW1lcy4gVGhpcyBjYW4gYmUgdXNlZCBmb3IgZXF1YWxpdHkgY2hlY2tzIHdpdGhvdXQKK2hhdmluZyB0byBkbyBhIGNvbXBsZXRlIGJpbmFyeSBjb21wYXJpc29uLgorCitCeSBkZWZhdWx0IGF1ZGlvIGZyYW1lcyBhcmUgY29udmVydGVkIHRvIHNpZ25lZCAxNi1iaXQgcmF3IGF1ZGlvIGFuZAordmlkZW8gZnJhbWVzIHRvIHJhdyB2aWRlbyBiZWZvcmUgY29tcHV0aW5nIHRoZSBoYXNoLCBidXQgdGhlIG91dHB1dAorb2YgZXhwbGljaXQgY29udmVyc2lvbnMgdG8gb3RoZXIgY29kZWNzIGNhbiBhbHNvIGJlIHVzZWQuIFRpbWVzdGFtcHMKK2FyZSBpZ25vcmVkLiBJdCB1c2VzIHRoZSBTSEEtMjU2IGNyeXB0b2dyYXBoaWMgaGFzaCBmdW5jdGlvbiBieSBkZWZhdWx0LAorYnV0IHN1cHBvcnRzIHNldmVyYWwgb3RoZXIgYWxnb3JpdGhtcy4KKworVGhlIG91dHB1dCBvZiB0aGUgbXV4ZXIgY29uc2lzdHMgb2YgYSBzaW5nbGUgbGluZSBvZiB0aGUgZm9ybToKK0B2YXJ7YWxnb309QHZhcntoYXNofSwgd2hlcmUgQHZhcnthbGdvfSBpcyBhIHNob3J0IHN0cmluZyByZXByZXNlbnRpbmcKK3RoZSBoYXNoIGZ1bmN0aW9uIHVzZWQsIGFuZCBAdmFye2hhc2h9IGlzIGEgaGV4YWRlY2ltYWwgbnVtYmVyCityZXByZXNlbnRpbmcgdGhlIGNvbXB1dGVkIGhhc2guCisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSBoYXNoIEB2YXJ7YWxnb3JpdGhtfQorVXNlIHRoZSBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb24gc3BlY2lmaWVkIGJ5IHRoZSBzdHJpbmcgQHZhcnthbGdvcml0aG19LgorU3VwcG9ydGVkIHZhbHVlcyBpbmNsdWRlIEBjb2Rle01ENX0sIEBjb2Rle211cm11cjN9LCBAY29kZXtSSVBFTUQxMjh9LAorQGNvZGV7UklQRU1EMTYwfSwgQGNvZGV7UklQRU1EMjU2fSwgQGNvZGV7UklQRU1EMzIwfSwgQGNvZGV7U0hBMTYwfSwKK0Bjb2Rle1NIQTIyNH0sIEBjb2Rle1NIQTI1Nn0gKGRlZmF1bHQpLCBAY29kZXtTSEE1MTIvMjI0fSwgQGNvZGV7U0hBNTEyLzI1Nn0sCitAY29kZXtTSEEzODR9LCBAY29kZXtTSEE1MTJ9LCBAY29kZXtDUkMzMn0gYW5kIEBjb2Rle2FkbGVyMzJ9LgorCitAZW5kIHRhYmxlCisKK0BzdWJzZWN0aW9uIEV4YW1wbGVzCisKK1RvIGNvbXB1dGUgdGhlIFNIQS0yNTYgaGFzaCBvZiB0aGUgaW5wdXQgY29udmVydGVkIHRvIHJhdyBhdWRpbyBhbmQKK3ZpZGVvLCBhbmQgc3RvcmUgaXQgaW4gdGhlIGZpbGUgQGZpbGV7b3V0LnNoYTI1Nn06CitAZXhhbXBsZQorZmZtcGVnIC1pIElOUFVUIC1mIGhhc2ggb3V0LnNoYTI1NgorQGVuZCBleGFtcGxlCisKK1RvIHByaW50IGFuIE1ENSBoYXNoIHRvIHN0ZG91dCB1c2UgdGhlIGNvbW1hbmQ6CitAZXhhbXBsZQorZmZtcGVnIC1pIElOUFVUIC1mIGhhc2ggLWhhc2ggbWQ1IC0KK0BlbmQgZXhhbXBsZQorCitTZWUgYWxzbyB0aGUgQHJlZntmcmFtZWhhc2h9IG11eGVyLgogCiBAYW5jaG9ye2hsc30KIEBzZWN0aW9uIGhscwpAQCAtMjU2LDkgKzQ4MCwxMiBAQAogaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBwbGF5bGlzdCwgZm9sbG93ZWQgYnkgYSBzZXF1ZW50aWFsIG51bWJlciBhbmQgYQogLnRzIGV4dGVuc2lvbi4KIAorTWFrZSBzdXJlIHRvIHJlcXVpcmUgYSBjbG9zZWQgR09QIHdoZW4gZW5jb2RpbmcgYW5kIHRvIHNldCB0aGUgR09QCitzaXplIHRvIGZpdCB5b3VyIHNlZ21lbnQgdGltZSBjb25zdHJhaW50LgorCiBGb3IgZXhhbXBsZSwgdG8gY29udmVydCBhbiBpbnB1dCBmaWxlIHdpdGggQGNvbW1hbmR7ZmZtcGVnfToKIEBleGFtcGxlCi1mZm1wZWcgLWkgaW4ubnV0IG91dC5tM3U4CitmZm1wZWcgLWkgaW4ubWt2IC1jOnYgaDI2NCAtZmxhZ3MgK2Nnb3AgLWcgMzAgLWhsc190aW1lIDEgb3V0Lm0zdTgKIEBlbmQgZXhhbXBsZQogVGhpcyBleGFtcGxlIHdpbGwgcHJvZHVjZSB0aGUgcGxheWxpc3QsIEBmaWxle291dC5tM3U4fSwgYW5kIHNlZ21lbnQgZmlsZXM6CiBAZmlsZXtvdXQwLnRzfSwgQGZpbGV7b3V0MS50c30sIEBmaWxle291dDIudHN9LCBldGMuCkBAIC0yNzIsMzAgKzQ5OSw2NyBAQAogVGhpcyBtdXhlciBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CiAKIEB0YWJsZSBAb3B0aW9uCitAaXRlbSBobHNfaW5pdF90aW1lIEB2YXJ7c2Vjb25kc30KK1NldCB0aGUgaW5pdGlhbCB0YXJnZXQgc2VnbWVudCBsZW5ndGggaW4gc2Vjb25kcy4gRGVmYXVsdCB2YWx1ZSBpcyBAdmFyezB9LgorU2VnbWVudCB3aWxsIGJlIGN1dCBvbiB0aGUgbmV4dCBrZXkgZnJhbWUgYWZ0ZXIgdGhpcyB0aW1lIGhhcyBwYXNzZWQgb24gdGhlIGZpcnN0IG0zdTggbGlzdC4KK0FmdGVyIHRoZSBpbml0aWFsIHBsYXlsaXN0IGlzIGZpbGxlZCBAY29tbWFuZHtmZm1wZWd9IHdpbGwgY3V0IHNlZ21lbnRzCithdCBkdXJhdGlvbiBlcXVhbCB0byBAY29kZXtobHNfdGltZX0KKwogQGl0ZW0gaGxzX3RpbWUgQHZhcntzZWNvbmRzfQotU2V0IHRoZSBzZWdtZW50IGxlbmd0aCBpbiBzZWNvbmRzLiBEZWZhdWx0IHZhbHVlIGlzIDIuCitTZXQgdGhlIHRhcmdldCBzZWdtZW50IGxlbmd0aCBpbiBzZWNvbmRzLiBEZWZhdWx0IHZhbHVlIGlzIDIuCitTZWdtZW50IHdpbGwgYmUgY3V0IG9uIHRoZSBuZXh0IGtleSBmcmFtZSBhZnRlciB0aGlzIHRpbWUgaGFzIHBhc3NlZC4KIAogQGl0ZW0gaGxzX2xpc3Rfc2l6ZSBAdmFye3NpemV9CiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBsYXlsaXN0IGVudHJpZXMuIElmIHNldCB0byAwIHRoZSBsaXN0IGZpbGUKIHdpbGwgY29udGFpbiBhbGwgdGhlIHNlZ21lbnRzLiBEZWZhdWx0IHZhbHVlIGlzIDUuCiAKK0BpdGVtIGhsc19kZWxldGVfdGhyZXNob2xkIEB2YXJ7c2l6ZX0KK1NldCB0aGUgbnVtYmVyIG9mIHVucmVmZXJlbmNlZCBzZWdtZW50cyB0byBrZWVwIG9uIGRpc2sgYmVmb3JlIEBjb2Rle2hsc19mbGFncyBkZWxldGVfc2VnbWVudHN9CitkZWxldGVzIHRoZW0uIEluY3JlYXNlIHRoaXMgdG8gYWxsb3cgY29udGludWUgY2xpZW50cyB0byBkb3dubG9hZCBzZWdtZW50cyB3aGljaAord2VyZSByZWNlbnRseSByZWZlcmVuY2VkIGluIHRoZSBwbGF5bGlzdC4gRGVmYXVsdCB2YWx1ZSBpcyAxLCBtZWFuaW5nIHNlZ21lbnRzIG9sZGVyIHRoYW4KK0Bjb2Rle2hsc19saXN0X3NpemUrMX0gd2lsbCBiZSBkZWxldGVkLgorCiBAaXRlbSBobHNfdHNfb3B0aW9ucyBAdmFye29wdGlvbnNfbGlzdH0KIFNldCBvdXRwdXQgZm9ybWF0IG9wdGlvbnMgdXNpbmcgYSA6LXNlcGFyYXRlZCBsaXN0IG9mIGtleT12YWx1ZQogcGFyYW1ldGVycy4gVmFsdWVzIGNvbnRhaW5pbmcgQGNvZGV7On0gc3BlY2lhbCBjaGFyYWN0ZXJzIG11c3QgYmUKIGVzY2FwZWQuCiAKIEBpdGVtIGhsc193cmFwIEB2YXJ7d3JhcH0KLVNldCB0aGUgbnVtYmVyIGFmdGVyIHdoaWNoIHRoZSBzZWdtZW50IGZpbGVuYW1lIG51bWJlciAodGhlIG51bWJlcgotc3BlY2lmaWVkIGluIGVhY2ggc2VnbWVudCBmaWxlKSB3cmFwcy4gSWYgc2V0IHRvIDAgdGhlIG51bWJlciB3aWxsIGJlCi1uZXZlciB3cmFwcGVkLiBEZWZhdWx0IHZhbHVlIGlzIDAuCitUaGlzIGlzIGEgZGVwcmVjYXRlZCBvcHRpb24sIHlvdSBjYW4gdXNlIEBjb2Rle2hsc19saXN0X3NpemV9CithbmQgQGNvZGV7aGxzX2ZsYWdzIGRlbGV0ZV9zZWdtZW50c30gaW5zdGVhZCBpdAogCiBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgdG8gYXZvaWQgdG8gZmlsbCB0aGUgZGlzayB3aXRoIG1hbnkgc2VnbWVudAogZmlsZXMsIGFuZCBsaW1pdHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnQgZmlsZXMgd3JpdHRlbiB0byBkaXNrCiB0byBAdmFye3dyYXB9LgogCisKK0BpdGVtIGhsc19zdGFydF9udW1iZXJfc291cmNlCitTdGFydCB0aGUgcGxheWxpc3Qgc2VxdWVuY2UgbnVtYmVyIChAY29kZXsjRVhULVgtTUVESUEtU0VRVUVOQ0V9KSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBzb3VyY2UuCitVbmxlc3MgQGNvZGV7aGxzX2ZsYWdzIHNpbmdsZV9maWxlfSBpcyBzZXQsIGl0IGFsc28gc3BlY2lmaWVzIHNvdXJjZSBvZiBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXJzIG9mCitzZWdtZW50IGFuZCBzdWJ0aXRsZSBmaWxlbmFtZXMuIEluIGFueSBjYXNlLCBpZiBAY29kZXtobHNfZmxhZ3MgYXBwZW5kX2xpc3R9CitpcyBzZXQgYW5kIHJlYWQgcGxheWxpc3Qgc2VxdWVuY2UgbnVtYmVyIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHN0YXJ0IHNlcXVlbmNlIG51bWJlciwKK3RoZW4gdGhhdCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgc3RhcnQgdmFsdWUuCisKK0l0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisKK0B0YWJsZSBAb3B0aW9uCisKK0BpdGVtIGdlbmVyaWMgKGRlZmF1bHQpCitTZXQgdGhlIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlcnMgYWNjb3JkaW5nIHRvIEB2YXJ7c3RhcnRfbnVtYmVyfSBvcHRpb24gdmFsdWUuCisKK0BpdGVtIGVwb2NoCitUaGUgc3RhcnQgbnVtYmVyIHdpbGwgYmUgdGhlIHNlY29uZHMgc2luY2UgZXBvY2ggKDE5NzAtMDEtMDEgMDA6MDA6MDApCisKK0BpdGVtIGRhdGV0aW1lCitUaGUgc3RhcnQgbnVtYmVyIHdpbGwgYmUgYmFzZWQgb24gdGhlIGN1cnJlbnQgZGF0ZS90aW1lIGFzIFlZWVltbWRkSEhNTVNTLiBlLmcuIDIwMTYxMjMxMjM1NzU5LgorCitAZW5kIHRhYmxlCisKIEBpdGVtIHN0YXJ0X251bWJlciBAdmFye251bWJlcn0KLVN0YXJ0IHRoZSBwbGF5bGlzdCBzZXF1ZW5jZSBudW1iZXIgZnJvbSBAdmFye251bWJlcn0uIERlZmF1bHQgdmFsdWUgaXMKLTAuCitTdGFydCB0aGUgcGxheWxpc3Qgc2VxdWVuY2UgbnVtYmVyIChAY29kZXsjRVhULVgtTUVESUEtU0VRVUVOQ0V9KSBmcm9tIHRoZSBzcGVjaWZpZWQgQHZhcntudW1iZXJ9Cit3aGVuIEB2YXJ7aGxzX3N0YXJ0X251bWJlcl9zb3VyY2V9IHZhbHVlIGlzIEB2YXJ7Z2VuZXJpY30uIChUaGlzIGlzIHRoZSBkZWZhdWx0IGNhc2UuKQorVW5sZXNzIEBjb2Rle2hsc19mbGFncyBzaW5nbGVfZmlsZX0gaXMgc2V0LCBpdCBhbHNvIHNwZWNpZmllcyBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXJzIG9mIHNlZ21lbnQgYW5kIHN1YnRpdGxlIGZpbGVuYW1lcy4KK0RlZmF1bHQgdmFsdWUgaXMgMC4KIAogQGl0ZW0gaGxzX2FsbG93X2NhY2hlIEB2YXJ7YWxsb3djYWNoZX0KIEV4cGxpY2l0bHkgc2V0IHdoZXRoZXIgdGhlIGNsaWVudCBNQVkgKDEpIG9yIE1VU1QgTk9UICgwKSBjYWNoZSBtZWRpYSBzZWdtZW50cy4KQEAgLTMxMCwxNCArNTc0LDgxIEBACiBzcGVjaWZpZWQuCiAKIEBpdGVtIGhsc19zZWdtZW50X2ZpbGVuYW1lIEB2YXJ7ZmlsZW5hbWV9Ci1TZXQgdGhlIHNlZ21lbnQgZmlsZW5hbWUuIFVubGVzcyBobHNfZmxhZ3Mgc2luZ2xlX2ZpbGUgaXMgc2V0IEB2YXJ7ZmlsZW5hbWV9Ci1pcyB1c2VkIGFzIGEgc3RyaW5nIGZvcm1hdCB3aXRoIHRoZSBzZWdtZW50IG51bWJlcjoKK1NldCB0aGUgc2VnbWVudCBmaWxlbmFtZS4gVW5sZXNzIEBjb2Rle2hsc19mbGFncyBzaW5nbGVfZmlsZX0gaXMgc2V0LAorQHZhcntmaWxlbmFtZX0gaXMgdXNlZCBhcyBhIHN0cmluZyBmb3JtYXQgd2l0aCB0aGUgc2VnbWVudCBudW1iZXI6CiBAZXhhbXBsZQotZmZtcGVnIGluLm51dCAtaGxzX3NlZ21lbnRfZmlsZW5hbWUgJ2ZpbGUlMDNkLnRzJyBvdXQubTN1OAorZmZtcGVnIC1pIGluLm51dCAtaGxzX3NlZ21lbnRfZmlsZW5hbWUgJ2ZpbGUlMDNkLnRzJyBvdXQubTN1OAogQGVuZCBleGFtcGxlCiBUaGlzIGV4YW1wbGUgd2lsbCBwcm9kdWNlIHRoZSBwbGF5bGlzdCwgQGZpbGV7b3V0Lm0zdTh9LCBhbmQgc2VnbWVudCBmaWxlczoKIEBmaWxle2ZpbGUwMDAudHN9LCBAZmlsZXtmaWxlMDAxLnRzfSwgQGZpbGV7ZmlsZTAwMi50c30sIGV0Yy4KIAorQHZhcntmaWxlbmFtZX0gbWF5IGNvbnRhaW4gZnVsbCBwYXRoIG9yIHJlbGF0aXZlIHBhdGggc3BlY2lmaWNhdGlvbiwKK2J1dCBvbmx5IHRoZSBmaWxlIG5hbWUgcGFydCB3aXRob3V0IGFueSBwYXRoIGluZm8gd2lsbCBiZSBjb250YWluZWQgaW4gdGhlIG0zdTggc2VnbWVudCBsaXN0LgorU2hvdWxkIGEgcmVsYXRpdmUgcGF0aCBiZSBzcGVjaWZpZWQsIHRoZSBwYXRoIG9mIHRoZSBjcmVhdGVkIHNlZ21lbnQKK2ZpbGVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCitXaGVuIHVzZV9sb2NhbHRpbWVfbWtkaXIgaXMgc2V0LCB0aGUgd2hvbGUgZXhwYW5kZWQgdmFsdWUgb2YgQHZhcntmaWxlbmFtZX0gd2lsbCBiZSB3cml0dGVuIGludG8gdGhlIG0zdTggc2VnbWVudCBsaXN0LgorCitXaGVuIEBjb2Rle3Zhcl9zdHJlYW1fbWFwfSBpcyBzZXQgd2l0aCB0d28gb3IgbW9yZSB2YXJpYW50IHN0cmVhbXMsIHRoZQorQHZhcntmaWxlbmFtZX0gcGF0dGVybiBtdXN0IGNvbnRhaW4gdGhlIHN0cmluZyAiJXYiLCB0aGlzIHN0cmluZyBzcGVjaWZpZXMKK3RoZSBwb3NpdGlvbiBvZiB2YXJpYW50IHN0cmVhbSBpbmRleCBpbiB0aGUgZ2VuZXJhdGVkIHNlZ21lbnQgZmlsZSBuYW1lcy4KK0BleGFtcGxlCitmZm1wZWcgLWkgaW4udHMgLWI6djowIDEwMDBrIC1iOnY6MSAyNTZrIC1iOmE6MCA2NGsgLWI6YToxIDMyayBcCisgIC1tYXAgMDp2IC1tYXAgMDphIC1tYXAgMDp2IC1tYXAgMDphIC1mIGhscyAtdmFyX3N0cmVhbV9tYXAgInY6MCxhOjAgdjoxLGE6MSIgXAorICAtaGxzX3NlZ21lbnRfZmlsZW5hbWUgJ2ZpbGVfJXZfJTAzZC50cycgb3V0XyV2Lm0zdTgKK0BlbmQgZXhhbXBsZQorVGhpcyBleGFtcGxlIHdpbGwgcHJvZHVjZSB0aGUgcGxheWxpc3RzIHNlZ21lbnQgZmlsZSBzZXRzOgorQGZpbGV7ZmlsZV8wXzAwMC50c30sIEBmaWxle2ZpbGVfMF8wMDEudHN9LCBAZmlsZXtmaWxlXzBfMDAyLnRzfSwgZXRjLiBhbmQKK0BmaWxle2ZpbGVfMV8wMDAudHN9LCBAZmlsZXtmaWxlXzFfMDAxLnRzfSwgQGZpbGV7ZmlsZV8xXzAwMi50c30sIGV0Yy4KKworVGhlIHN0cmluZyAiJXYiIG1heSBiZSBwcmVzZW50IGluIHRoZSBmaWxlbmFtZSBvciBpbiB0aGUgbGFzdCBkaXJlY3RvcnkgbmFtZQorY29udGFpbmluZyB0aGUgZmlsZS4gSWYgdGhlIHN0cmluZyBpcyBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkgbmFtZSwgdGhlbgorc3ViLWRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGFmdGVyIGV4cGFuZGluZyB0aGUgZGlyZWN0b3J5IG5hbWUgcGF0dGVybi4gVGhpcworZW5hYmxlcyBjcmVhdGlvbiBvZiBzZWdtZW50cyBjb3JyZXNwb25kaW5nIHRvIGRpZmZlcmVudCB2YXJpYW50IHN0cmVhbXMgaW4KK3N1YmRpcmVjdG9yaWVzLgorQGV4YW1wbGUKK2ZmbXBlZyAtaSBpbi50cyAtYjp2OjAgMTAwMGsgLWI6djoxIDI1NmsgLWI6YTowIDY0ayAtYjphOjEgMzJrIFwKKyAgLW1hcCAwOnYgLW1hcCAwOmEgLW1hcCAwOnYgLW1hcCAwOmEgLWYgaGxzIC12YXJfc3RyZWFtX21hcCAidjowLGE6MCB2OjEsYToxIiBcCisgIC1obHNfc2VnbWVudF9maWxlbmFtZSAndnMldi9maWxlXyUwM2QudHMnIHZzJXYvb3V0Lm0zdTgKK0BlbmQgZXhhbXBsZQorVGhpcyBleGFtcGxlIHdpbGwgcHJvZHVjZSB0aGUgcGxheWxpc3RzIHNlZ21lbnQgZmlsZSBzZXRzOgorQGZpbGV7dnMwL2ZpbGVfMDAwLnRzfSwgQGZpbGV7dnMwL2ZpbGVfMDAxLnRzfSwgQGZpbGV7dnMwL2ZpbGVfMDAyLnRzfSwgZXRjLiBhbmQKK0BmaWxle3ZzMS9maWxlXzAwMC50c30sIEBmaWxle3ZzMS9maWxlXzAwMS50c30sIEBmaWxle3ZzMS9maWxlXzAwMi50c30sIGV0Yy4KKworQGl0ZW0gdXNlX2xvY2FsdGltZQorVXNlIHN0cmZ0aW1lKCkgb24gQHZhcntmaWxlbmFtZX0gdG8gZXhwYW5kIHRoZSBzZWdtZW50IGZpbGVuYW1lIHdpdGggbG9jYWx0aW1lLgorVGhlIHNlZ21lbnQgbnVtYmVyIGlzIGFsc28gYXZhaWxhYmxlIGluIHRoaXMgbW9kZSwgYnV0IHRvIHVzZSBpdCwgeW91IG5lZWQgdG8gc3BlY2lmeSBzZWNvbmRfbGV2ZWxfc2VnbWVudF9pbmRleAoraGxzX2ZsYWcgYW5kICUlZCB3aWxsIGJlIHRoZSBzcGVjaWZpZXIuCitAZXhhbXBsZQorZmZtcGVnIC1pIGluLm51dCAtdXNlX2xvY2FsdGltZSAxIC1obHNfc2VnbWVudF9maWxlbmFtZSAnZmlsZS0lWSVtJWQtJXMudHMnIG91dC5tM3U4CitAZW5kIGV4YW1wbGUKK1RoaXMgZXhhbXBsZSB3aWxsIHByb2R1Y2UgdGhlIHBsYXlsaXN0LCBAZmlsZXtvdXQubTN1OH0sIGFuZCBzZWdtZW50IGZpbGVzOgorQGZpbGV7ZmlsZS0yMDE2MDIxNS0xNDU1NTY5MDIzLnRzfSwgQGZpbGV7ZmlsZS0yMDE2MDIxNS0xNDU1NTY5MDI0LnRzfSwgZXRjLgorTm90ZTogT24gc29tZSBzeXN0ZW1zL2Vudmlyb25tZW50cywgdGhlIEBjb2RleyVzfSBzcGVjaWZpZXIgaXMgbm90IGF2YWlsYWJsZS4gU2VlCisgIEBjb2Rle3N0cmZ0aW1lKCl9IGRvY3VtZW50YXRpb24uCitAZXhhbXBsZQorZmZtcGVnIC1pIGluLm51dCAtdXNlX2xvY2FsdGltZSAxIC1obHNfZmxhZ3Mgc2Vjb25kX2xldmVsX3NlZ21lbnRfaW5kZXggLWhsc19zZWdtZW50X2ZpbGVuYW1lICdmaWxlLSVZJW0lZC0lJTA0ZC50cycgb3V0Lm0zdTgKK0BlbmQgZXhhbXBsZQorVGhpcyBleGFtcGxlIHdpbGwgcHJvZHVjZSB0aGUgcGxheWxpc3QsIEBmaWxle291dC5tM3U4fSwgYW5kIHNlZ21lbnQgZmlsZXM6CitAZmlsZXtmaWxlLTIwMTYwMjE1LTAwMDEudHN9LCBAZmlsZXtmaWxlLTIwMTYwMjE1LTAwMDIudHN9LCBldGMuCisKK0BpdGVtIHVzZV9sb2NhbHRpbWVfbWtkaXIKK1VzZWQgdG9nZXRoZXIgd2l0aCAtdXNlX2xvY2FsdGltZSwgaXQgd2lsbCBjcmVhdGUgYWxsIHN1YmRpcmVjdG9yaWVzIHdoaWNoCitpcyBleHBhbmRlZCBpbiBAdmFye2ZpbGVuYW1lfS4KK0BleGFtcGxlCitmZm1wZWcgLWkgaW4ubnV0IC11c2VfbG9jYWx0aW1lIDEgLXVzZV9sb2NhbHRpbWVfbWtkaXIgMSAtaGxzX3NlZ21lbnRfZmlsZW5hbWUgJyVZJW0lZC9maWxlLSVZJW0lZC0lcy50cycgb3V0Lm0zdTgKK0BlbmQgZXhhbXBsZQorVGhpcyBleGFtcGxlIHdpbGwgY3JlYXRlIGEgZGlyZWN0b3J5IDIwMTU2MDIxNSAoaWYgaXQgZG9lcyBub3QgZXhpc3QpLCBhbmQgdGhlbgorcHJvZHVjZSB0aGUgcGxheWxpc3QsIEBmaWxle291dC5tM3U4fSwgYW5kIHNlZ21lbnQgZmlsZXM6CitAZmlsZXsyMDE2MDIxNS9maWxlLTIwMTYwMjE1LTE0NTU1NjkwMjMudHN9LCBAZmlsZXsyMDE2MDIxNS9maWxlLTIwMTYwMjE1LTE0NTU1NjkwMjQudHN9LCBldGMuCisKK0BleGFtcGxlCitmZm1wZWcgLWkgaW4ubnV0IC11c2VfbG9jYWx0aW1lIDEgLXVzZV9sb2NhbHRpbWVfbWtkaXIgMSAtaGxzX3NlZ21lbnRfZmlsZW5hbWUgJyVZLyVtLyVkL2ZpbGUtJVklbSVkLSVzLnRzJyBvdXQubTN1OAorQGVuZCBleGFtcGxlCitUaGlzIGV4YW1wbGUgd2lsbCBjcmVhdGUgYSBkaXJlY3RvcnkgaGllcmFyY2h5IDIwMTYvMDIvMTUgKGlmIGFueSBvZiB0aGVtIGRvIG5vdCBleGlzdCksIGFuZCB0aGVuCitwcm9kdWNlIHRoZSBwbGF5bGlzdCwgQGZpbGV7b3V0Lm0zdTh9LCBhbmQgc2VnbWVudCBmaWxlczoKK0BmaWxlezIwMTYvMDIvMTUvZmlsZS0yMDE2MDIxNS0xNDU1NTY5MDIzLnRzfSwgQGZpbGV7MjAxNi8wMi8xNS9maWxlLTIwMTYwMjE1LTE0NTU1NjkwMjQudHN9LCBldGMuCisKKwogQGl0ZW0gaGxzX2tleV9pbmZvX2ZpbGUgQHZhcntrZXlfaW5mb19maWxlfQogVXNlIHRoZSBpbmZvcm1hdGlvbiBpbiBAdmFye2tleV9pbmZvX2ZpbGV9IGZvciBzZWdtZW50IGVuY3J5cHRpb24uIFRoZSBmaXJzdAogbGluZSBvZiBAdmFye2tleV9pbmZvX2ZpbGV9IHNwZWNpZmllcyB0aGUga2V5IFVSSSB3cml0dGVuIHRvIHRoZSBwbGF5bGlzdC4gVGhlCkBAIC0zMjgsNyArNjU5LDcgQEAKIGhleGFkZWNpbWFsIHN0cmluZyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHNlZ21lbnQgc2VxdWVuY2UgbnVtYmVyIChkZWZhdWx0KQogZm9yIGVuY3J5cHRpb24uIENoYW5nZXMgdG8gQHZhcntrZXlfaW5mb19maWxlfSB3aWxsIHJlc3VsdCBpbiBzZWdtZW50CiBlbmNyeXB0aW9uIHdpdGggdGhlIG5ldyBrZXkvSVYgYW5kIGFuIGVudHJ5IGluIHRoZSBwbGF5bGlzdCBmb3IgdGhlIG5ldyBrZXkKLVVSSS9JVi4KK1VSSS9JViBpZiBAY29kZXtobHNfZmxhZ3MgcGVyaW9kaWNfcmVrZXl9IGlzIGVuYWJsZWQuCiAKIEtleSBpbmZvIGZpbGUgZm9ybWF0OgogQGV4YW1wbGUKQEAgLTM3NCw3ICs3MDUsNTQgQEAKICAgLWhsc19rZXlfaW5mb19maWxlIGZpbGUua2V5aW5mbyBvdXQubTN1OAogQGVuZCBleGFtcGxlCiAKLUBpdGVtIGhsc19mbGFncyBzaW5nbGVfZmlsZQorQGl0ZW0gLWhsc19lbmMgQHZhcntlbmN9CitFbmFibGUgKDEpIG9yIGRpc2FibGUgKDApIHRoZSBBRVMxMjggZW5jcnlwdGlvbi4KK1doZW4gZW5hYmxlZCBldmVyeSBzZWdtZW50IGdlbmVyYXRlZCBpcyBlbmNyeXB0ZWQgYW5kIHRoZSBlbmNyeXB0aW9uIGtleQoraXMgc2F2ZWQgYXMgQHZhcntwbGF5bGlzdCBuYW1lfS5rZXkuCisKK0BpdGVtIC1obHNfZW5jX2tleSBAdmFye2tleX0KK0hleC1jb2RlZCAxNmJ5dGUga2V5IHRvIGVuY3J5cHQgdGhlIHNlZ21lbnRzLCBieSBkZWZhdWx0IGl0CitpcyByYW5kb21seSBnZW5lcmF0ZWQuCisKK0BpdGVtIC1obHNfZW5jX2tleV91cmwgQHZhcntrZXl1cmx9CitJZiBzZXQsIEB2YXJ7a2V5dXJsfSBpcyBwcmVwZW5kZWQgaW5zdGVhZCBvZiBAdmFye2Jhc2V1cmx9IHRvIHRoZSBrZXkgZmlsZW5hbWUKK2luIHRoZSBwbGF5bGlzdC4KKworQGl0ZW0gLWhsc19lbmNfaXYgQHZhcntpdn0KK0hleC1jb2RlZCAxNmJ5dGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGZvciBldmVyeSBzZWdtZW50IGluc3RlYWQKK29mIHRoZSBhdXRvZ2VuZXJhdGVkIG9uZXMuCisKK0BpdGVtIGhsc19zZWdtZW50X3R5cGUgQHZhcntmbGFnc30KK1Bvc3NpYmxlIHZhbHVlczoKKworQHRhYmxlIEBzYW1wCitAaXRlbSBtcGVndHMKK0lmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSBobHMgc2VnbWVudCBmaWxlcyB3aWxsIGZvcm1hdCB0byBtcGVndHMuCit0aGUgbXBlZ3RzIGZpbGVzIGlzIHVzZWQgaW4gYWxsIGhscyB2ZXJzaW9ucy4KKworQGl0ZW0gZm1wNAorSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIGhscyBzZWdtZW50IGZpbGVzIHdpbGwgZm9ybWF0IHRvIGZyYWdtZW50IG1wNCBsb29rcyBsaWtlIGRhc2guCit0aGUgZm1wNCBmaWxlcyBpcyB1c2VkIGluIGhscyBhZnRlciB2ZXJzaW9uIDcuCisKK0BlbmQgdGFibGUKKworQGl0ZW0gaGxzX2ZtcDRfaW5pdF9maWxlbmFtZSBAdmFye2ZpbGVuYW1lfQorc2V0IGZpbGVuYW1lIHRvIHRoZSBmcmFnbWVudCBmaWxlcyBoZWFkZXIgZmlsZSwgZGVmYXVsdCBmaWxlbmFtZSBpcyBAZmlsZXtpbml0Lm1wNH0uCisKK1doZW4gQGNvZGV7dmFyX3N0cmVhbV9tYXB9IGlzIHNldCB3aXRoIHR3byBvciBtb3JlIHZhcmlhbnQgc3RyZWFtcywgdGhlCitAdmFye2ZpbGVuYW1lfSBwYXR0ZXJuIG11c3QgY29udGFpbiB0aGUgc3RyaW5nICIldiIsIHRoaXMgc3RyaW5nIHNwZWNpZmllcwordGhlIHBvc2l0aW9uIG9mIHZhcmlhbnQgc3RyZWFtIGluZGV4IGluIHRoZSBnZW5lcmF0ZWQgaW5pdCBmaWxlIG5hbWVzLgorVGhlIHN0cmluZyAiJXYiIG1heSBiZSBwcmVzZW50IGluIHRoZSBmaWxlbmFtZSBvciBpbiB0aGUgbGFzdCBkaXJlY3RvcnkgbmFtZQorY29udGFpbmluZyB0aGUgZmlsZS4gSWYgdGhlIHN0cmluZyBpcyBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkgbmFtZSwgdGhlbgorc3ViLWRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGFmdGVyIGV4cGFuZGluZyB0aGUgZGlyZWN0b3J5IG5hbWUgcGF0dGVybi4gVGhpcworZW5hYmxlcyBjcmVhdGlvbiBvZiBpbml0IGZpbGVzIGNvcnJlc3BvbmRpbmcgdG8gZGlmZmVyZW50IHZhcmlhbnQgc3RyZWFtcyBpbgorc3ViZGlyZWN0b3JpZXMuCisKK0BpdGVtIGhsc19mbGFncyBAdmFye2ZsYWdzfQorUG9zc2libGUgdmFsdWVzOgorCitAdGFibGUgQHNhbXAKK0BpdGVtIHNpbmdsZV9maWxlCiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgbXV4ZXIgd2lsbCBzdG9yZSBhbGwgc2VnbWVudHMgaW4gYSBzaW5nbGUgTVBFRy1UUwogZmlsZSwgYW5kIHdpbGwgdXNlIGJ5dGUgcmFuZ2VzIGluIHRoZSBwbGF5bGlzdC4gSExTIHBsYXlsaXN0cyBnZW5lcmF0ZWQgd2l0aAogdGhpcyB3YXkgd2lsbCBoYXZlIHRoZSB2ZXJzaW9uIG51bWJlciA0LgpAQCAtMzg1LDkgKzc2MywyMTggQEAKIFdpbGwgcHJvZHVjZSB0aGUgcGxheWxpc3QsIEBmaWxle291dC5tM3U4fSwgYW5kIGEgc2luZ2xlIHNlZ21lbnQgZmlsZSwKIEBmaWxle291dC50c30uCiAKLUBpdGVtIGhsc19mbGFncyBkZWxldGVfc2VnbWVudHMKK0BpdGVtIGRlbGV0ZV9zZWdtZW50cwogU2VnbWVudCBmaWxlcyByZW1vdmVkIGZyb20gdGhlIHBsYXlsaXN0IGFyZSBkZWxldGVkIGFmdGVyIGEgcGVyaW9kIG9mIHRpbWUKIGVxdWFsIHRvIHRoZSBkdXJhdGlvbiBvZiB0aGUgc2VnbWVudCBwbHVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcGxheWxpc3QuCisKK0BpdGVtIGFwcGVuZF9saXN0CitBcHBlbmQgbmV3IHNlZ21lbnRzIGludG8gdGhlIGVuZCBvZiBvbGQgc2VnbWVudCBsaXN0LAorYW5kIHJlbW92ZSB0aGUgQGNvZGV7I0VYVC1YLUVORExJU1R9IGZyb20gdGhlIG9sZCBzZWdtZW50IGxpc3QuCisKK0BpdGVtIHJvdW5kX2R1cmF0aW9ucworUm91bmQgdGhlIGR1cmF0aW9uIGluZm8gaW4gdGhlIHBsYXlsaXN0IGZpbGUgc2VnbWVudCBpbmZvIHRvIGludGVnZXIKK3ZhbHVlcywgaW5zdGVhZCBvZiB1c2luZyBmbG9hdGluZyBwb2ludC4KKworQGl0ZW0gZGlzY29udF9zdGFydAorQWRkIHRoZSBAY29kZXsjRVhULVgtRElTQ09OVElOVUlUWX0gdGFnIHRvIHRoZSBwbGF5bGlzdCwgYmVmb3JlIHRoZQorZmlyc3Qgc2VnbWVudCdzIGluZm9ybWF0aW9uLgorCitAaXRlbSBvbWl0X2VuZGxpc3QKK0RvIG5vdCBhcHBlbmQgdGhlIEBjb2Rle0VYVC1YLUVORExJU1R9IHRhZyBhdCB0aGUgZW5kIG9mIHRoZSBwbGF5bGlzdC4KKworQGl0ZW0gcGVyaW9kaWNfcmVrZXkKK1RoZSBmaWxlIHNwZWNpZmllZCBieSBAY29kZXtobHNfa2V5X2luZm9fZmlsZX0gd2lsbCBiZSBjaGVja2VkIHBlcmlvZGljYWxseSBhbmQKK2RldGVjdCB1cGRhdGVzIHRvIHRoZSBlbmNyeXB0aW9uIGluZm8uIEJlIHN1cmUgdG8gcmVwbGFjZSB0aGlzIGZpbGUgYXRvbWljYWxseSwKK2luY2x1ZGluZyB0aGUgZmlsZSBjb250YWluaW5nIHRoZSBBRVMgZW5jcnlwdGlvbiBrZXkuCisKK0BpdGVtIGluZGVwZW5kZW50X3NlZ21lbnRzCitBZGQgdGhlIEBjb2RleyNFWFQtWC1JTkRFUEVOREVOVC1TRUdNRU5UU30gdG8gcGxheWxpc3RzIHRoYXQgaGFzIHZpZGVvIHNlZ21lbnRzCithbmQgd2hlbiBhbGwgdGhlIHNlZ21lbnRzIG9mIHRoYXQgcGxheWxpc3QgYXJlIGd1YXJhbnRlZWQgdG8gc3RhcnQgd2l0aCBhIEtleSBmcmFtZS4KKworQGl0ZW0gc3BsaXRfYnlfdGltZQorQWxsb3cgc2VnbWVudHMgdG8gc3RhcnQgb24gZnJhbWVzIG90aGVyIHRoYW4ga2V5ZnJhbWVzLiBUaGlzIGltcHJvdmVzCitiZWhhdmlvciBvbiBzb21lIHBsYXllcnMgd2hlbiB0aGUgdGltZSBiZXR3ZWVuIGtleWZyYW1lcyBpcyBpbmNvbnNpc3RlbnQsCitidXQgbWF5IG1ha2UgdGhpbmdzIHdvcnNlIG9uIG90aGVycywgYW5kIGNhbiBjYXVzZSBzb21lIG9kZGl0aWVzIGR1cmluZworc2Vla2luZy4gVGhpcyBmbGFnIHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIEBjb2Rle2hsc190aW1lfSBvcHRpb24uCisKK0BpdGVtIHByb2dyYW1fZGF0ZV90aW1lCitHZW5lcmF0ZSBAY29kZXtFWFQtWC1QUk9HUkFNLURBVEUtVElNRX0gdGFncy4KKworQGl0ZW0gc2Vjb25kX2xldmVsX3NlZ21lbnRfaW5kZXgKK01ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBzZWdtZW50IGluZGV4ZXMgYXMgJSVkIGluIGhsc19zZWdtZW50X2ZpbGVuYW1lIGV4cHJlc3Npb24KK2Jlc2lkZXMgZGF0ZS90aW1lIHZhbHVlcyB3aGVuIHVzZV9sb2NhbHRpbWUgaXMgb24uCitUbyBnZXQgZml4ZWQgd2lkdGggbnVtYmVycyB3aXRoIHRyYWlsaW5nIHplcm9lcywgJSUweGQgZm9ybWF0IGlzIGF2YWlsYWJsZSB3aGVyZSB4IGlzIHRoZSByZXF1aXJlZCB3aWR0aC4KKworQGl0ZW0gc2Vjb25kX2xldmVsX3NlZ21lbnRfc2l6ZQorTWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIHNlZ21lbnQgc2l6ZXMgKGNvdW50ZWQgaW4gYnl0ZXMpIGFzICUlcyBpbiBobHNfc2VnbWVudF9maWxlbmFtZQorZXhwcmVzc2lvbiBiZXNpZGVzIGRhdGUvdGltZSB2YWx1ZXMgd2hlbiB1c2VfbG9jYWx0aW1lIGlzIG9uLgorVG8gZ2V0IGZpeGVkIHdpZHRoIG51bWJlcnMgd2l0aCB0cmFpbGluZyB6ZXJvZXMsICUlMHhzIGZvcm1hdCBpcyBhdmFpbGFibGUgd2hlcmUgeCBpcyB0aGUgcmVxdWlyZWQgd2lkdGguCisKK0BpdGVtIHNlY29uZF9sZXZlbF9zZWdtZW50X2R1cmF0aW9uCitNYWtlcyBpdCBwb3NzaWJsZSB0byB1c2Ugc2VnbWVudCBkdXJhdGlvbiAoY2FsY3VsYXRlZCAgaW4gbWljcm9zZWNvbmRzKSBhcyAlJXQgaW4gaGxzX3NlZ21lbnRfZmlsZW5hbWUKK2V4cHJlc3Npb24gYmVzaWRlcyBkYXRlL3RpbWUgdmFsdWVzIHdoZW4gdXNlX2xvY2FsdGltZSBpcyBvbi4KK1RvIGdldCBmaXhlZCB3aWR0aCBudW1iZXJzIHdpdGggdHJhaWxpbmcgemVyb2VzLCAlJTB4dCBmb3JtYXQgaXMgYXZhaWxhYmxlIHdoZXJlIHggaXMgdGhlIHJlcXVpcmVkIHdpZHRoLgorCitAZXhhbXBsZQorZmZtcGVnIC1pIHNhbXBsZS5tcGVnIFwKKyAgIC1mIGhscyAtaGxzX3RpbWUgMyAtaGxzX2xpc3Rfc2l6ZSA1IFwKKyAgIC1obHNfZmxhZ3Mgc2Vjb25kX2xldmVsX3NlZ21lbnRfaW5kZXgrc2Vjb25kX2xldmVsX3NlZ21lbnRfc2l6ZStzZWNvbmRfbGV2ZWxfc2VnbWVudF9kdXJhdGlvbiBcCisgICAtdXNlX2xvY2FsdGltZSAxIC11c2VfbG9jYWx0aW1lX21rZGlyIDEgLWhsc19zZWdtZW50X2ZpbGVuYW1lICJzZWdtZW50XyVZJW0lZCVIJU0lU18lJTA0ZF8lJTA4c18lJTAxM3QudHMiIHN0cmVhbS5tM3U4CitAZW5kIGV4YW1wbGUKK1RoaXMgd2lsbCBwcm9kdWNlIHNlZ21lbnRzIGxpa2UgdGhpczoKK0BmaWxle3NlZ21lbnRfMjAxNzAxMDIxOTQzMzRfMDAwM18wMDEyMjIwMF8wMDAwMDAzMDAwMDAwLnRzfSwgQGZpbGV7c2VnbWVudF8yMDE3MDEwMjE5NDMzNF8wMDA0XzAwMTIwMDcyXzAwMDAwMDMwMDAwMDAudHN9IGV0Yy4KKworQGl0ZW0gdGVtcF9maWxlCitXcml0ZSBzZWdtZW50IGRhdGEgdG8gZmlsZW5hbWUudG1wIGFuZCByZW5hbWUgdG8gZmlsZW5hbWUgb25seSBvbmNlIHRoZSBzZWdtZW50IGlzIGNvbXBsZXRlLiBBIHdlYnNlcnZlcgorc2VydmluZyB1cCBzZWdtZW50cyBjYW4gYmUgY29uZmlndXJlZCB0byByZWplY3QgcmVxdWVzdHMgdG8gKi50bXAgdG8gcHJldmVudCBhY2Nlc3MgdG8gaW4tcHJvZ3Jlc3Mgc2VnbWVudHMKK2JlZm9yZSB0aGV5IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgbTN1OCBwbGF5bGlzdC4KKworQGVuZCB0YWJsZQorCitAaXRlbSBobHNfcGxheWxpc3RfdHlwZSBldmVudAorRW1pdCBAY29kZXsjRVhULVgtUExBWUxJU1QtVFlQRTpFVkVOVH0gaW4gdGhlIG0zdTggaGVhZGVyLiBGb3JjZXMKK0BvcHRpb257aGxzX2xpc3Rfc2l6ZX0gdG8gMDsgdGhlIHBsYXlsaXN0IGNhbiBvbmx5IGJlIGFwcGVuZGVkIHRvLgorCitAaXRlbSBobHNfcGxheWxpc3RfdHlwZSB2b2QKK0VtaXQgQGNvZGV7I0VYVC1YLVBMQVlMSVNULVRZUEU6Vk9EfSBpbiB0aGUgbTN1OCBoZWFkZXIuIEZvcmNlcworQG9wdGlvbntobHNfbGlzdF9zaXplfSB0byAwOyB0aGUgcGxheWxpc3QgbXVzdCBub3QgY2hhbmdlLgorCitAaXRlbSBtZXRob2QKK1VzZSB0aGUgZ2l2ZW4gSFRUUCBtZXRob2QgdG8gY3JlYXRlIHRoZSBobHMgZmlsZXMuCitAZXhhbXBsZQorZmZtcGVnIC1yZSAtaSBpbi50cyAtZiBobHMgLW1ldGhvZCBQVVQgaHR0cDovL2V4YW1wbGUuY29tL2xpdmUvb3V0Lm0zdTgKK0BlbmQgZXhhbXBsZQorVGhpcyBleGFtcGxlIHdpbGwgdXBsb2FkIGFsbCB0aGUgbXBlZ3RzIHNlZ21lbnQgZmlsZXMgdG8gdGhlIEhUVFAKK3NlcnZlciB1c2luZyB0aGUgSFRUUCBQVVQgbWV0aG9kLCBhbmQgdXBkYXRlIHRoZSBtM3U4IGZpbGVzIGV2ZXJ5CitAY29kZXtyZWZyZXNofSB0aW1lcyB1c2luZyB0aGUgc2FtZSBtZXRob2QuCitOb3RlIHRoYXQgdGhlIEhUVFAgc2VydmVyIG11c3Qgc3VwcG9ydCB0aGUgZ2l2ZW4gbWV0aG9kIGZvciB1cGxvYWRpbmcKK2ZpbGVzLgorCitAaXRlbSBodHRwX3VzZXJfYWdlbnQKK092ZXJyaWRlIFVzZXItQWdlbnQgZmllbGQgaW4gSFRUUCBoZWFkZXIuIEFwcGxpY2FibGUgb25seSBmb3IgSFRUUCBvdXRwdXQuCisKK0BpdGVtIHZhcl9zdHJlYW1fbWFwCitNYXAgc3RyaW5nIHdoaWNoIHNwZWNpZmllcyBob3cgdG8gZ3JvdXAgdGhlIGF1ZGlvLCB2aWRlbyBhbmQgc3VidGl0bGUgc3RyZWFtcworaW50byBkaWZmZXJlbnQgdmFyaWFudCBzdHJlYW1zLiBUaGUgdmFyaWFudCBzdHJlYW0gZ3JvdXBzIGFyZSBzZXBhcmF0ZWQKK2J5IHNwYWNlLgorRXhwZWN0ZWQgc3RyaW5nIGZvcm1hdCBpcyBsaWtlIHRoaXMgImE6MCx2OjAgYToxLHY6MSAuLi4uIi4gSGVyZSBhOiwgdjosIHM6IGFyZQordGhlIGtleXMgdG8gc3BlY2lmeSBhdWRpbywgdmlkZW8gYW5kIHN1YnRpdGxlIHN0cmVhbXMgcmVzcGVjdGl2ZWx5LgorQWxsb3dlZCB2YWx1ZXMgYXJlIDAgdG8gOSAobGltaXRlZCBqdXN0IGJhc2VkIG9uIHByYWN0aWNhbCB1c2FnZSkuCisKK1doZW4gdGhlcmUgYXJlIHR3byBvciBtb3JlIHZhcmlhbnQgc3RyZWFtcywgdGhlIG91dHB1dCBmaWxlbmFtZSBwYXR0ZXJuIG11c3QKK2NvbnRhaW4gdGhlIHN0cmluZyAiJXYiLCB0aGlzIHN0cmluZyBzcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHZhcmlhbnQgc3RyZWFtCitpbmRleCBpbiB0aGUgb3V0cHV0IG1lZGlhIHBsYXlsaXN0IGZpbGVuYW1lcy4gVGhlIHN0cmluZyAiJXYiIG1heSBiZSBwcmVzZW50IGluCit0aGUgZmlsZW5hbWUgb3IgaW4gdGhlIGxhc3QgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgZmlsZS4gSWYgdGhlIHN0cmluZyBpcworcHJlc2VudCBpbiB0aGUgZGlyZWN0b3J5IG5hbWUsIHRoZW4gc3ViLWRpcmVjdG9yaWVzIGFyZSBjcmVhdGVkIGFmdGVyIGV4cGFuZGluZwordGhlIGRpcmVjdG9yeSBuYW1lIHBhdHRlcm4uIFRoaXMgZW5hYmxlcyBjcmVhdGlvbiBvZiB2YXJpYW50IHN0cmVhbXMgaW4KK3N1YmRpcmVjdG9yaWVzLgorCitAZXhhbXBsZQorZmZtcGVnIC1yZSAtaSBpbi50cyAtYjp2OjAgMTAwMGsgLWI6djoxIDI1NmsgLWI6YTowIDY0ayAtYjphOjEgMzJrIFwKKyAgLW1hcCAwOnYgLW1hcCAwOmEgLW1hcCAwOnYgLW1hcCAwOmEgLWYgaGxzIC12YXJfc3RyZWFtX21hcCAidjowLGE6MCB2OjEsYToxIiBcCisgIGh0dHA6Ly9leGFtcGxlLmNvbS9saXZlL291dF8ldi5tM3U4CitAZW5kIGV4YW1wbGUKK1RoaXMgZXhhbXBsZSBjcmVhdGVzIHR3byBobHMgdmFyaWFudCBzdHJlYW1zLiBUaGUgZmlyc3QgdmFyaWFudCBzdHJlYW0gd2lsbAorY29udGFpbiB2aWRlbyBzdHJlYW0gb2YgYml0cmF0ZSAxMDAwayBhbmQgYXVkaW8gc3RyZWFtIG9mIGJpdHJhdGUgNjRrIGFuZCB0aGUKK3NlY29uZCB2YXJpYW50IHN0cmVhbSB3aWxsIGNvbnRhaW4gdmlkZW8gc3RyZWFtIG9mIGJpdHJhdGUgMjU2ayBhbmQgYXVkaW8KK3N0cmVhbSBvZiBiaXRyYXRlIDMyay4gSGVyZSwgdHdvIG1lZGlhIHBsYXlsaXN0IHdpdGggZmlsZSBuYW1lcyBvdXRfMC5tM3U4IGFuZAorb3V0XzEubTN1OCB3aWxsIGJlIGNyZWF0ZWQuCitAZXhhbXBsZQorZmZtcGVnIC1yZSAtaSBpbi50cyAtYjp2OjAgMTAwMGsgLWI6djoxIDI1NmsgLWI6YTowIDY0ayBcCisgIC1tYXAgMDp2IC1tYXAgMDphIC1tYXAgMDp2IC1mIGhscyAtdmFyX3N0cmVhbV9tYXAgInY6MCBhOjAgdjoxIiBcCisgIGh0dHA6Ly9leGFtcGxlLmNvbS9saXZlL291dF8ldi5tM3U4CitAZW5kIGV4YW1wbGUKK1RoaXMgZXhhbXBsZSBjcmVhdGVzIHRocmVlIGhscyB2YXJpYW50IHN0cmVhbXMuIFRoZSBmaXJzdCB2YXJpYW50IHN0cmVhbSB3aWxsCitiZSBhIHZpZGVvIG9ubHkgc3RyZWFtIHdpdGggdmlkZW8gYml0cmF0ZSAxMDAwaywgdGhlIHNlY29uZCB2YXJpYW50IHN0cmVhbSB3aWxsCitiZSBhbiBhdWRpbyBvbmx5IHN0cmVhbSB3aXRoIGJpdHJhdGUgNjRrIGFuZCB0aGUgdGhpcmQgdmFyaWFudCBzdHJlYW0gd2lsbCBiZSBhCit2aWRlbyBvbmx5IHN0cmVhbSB3aXRoIGJpdHJhdGUgMjU2ay4gSGVyZSwgdGhyZWUgbWVkaWEgcGxheWxpc3Qgd2l0aCBmaWxlIG5hbWVzCitvdXRfMC5tM3U4LCBvdXRfMS5tM3U4IGFuZCBvdXRfMi5tM3U4IHdpbGwgYmUgY3JlYXRlZC4KK0BleGFtcGxlCitmZm1wZWcgLXJlIC1pIGluLnRzIC1iOnY6MCAxMDAwayAtYjp2OjEgMjU2ayAtYjphOjAgNjRrIC1iOmE6MSAzMmsgXAorICAtbWFwIDA6diAtbWFwIDA6YSAtbWFwIDA6diAtbWFwIDA6YSAtZiBobHMgLXZhcl9zdHJlYW1fbWFwICJ2OjAsYTowIHY6MSxhOjEiIFwKKyAgaHR0cDovL2V4YW1wbGUuY29tL2xpdmUvdnNfJXYvb3V0Lm0zdTgKK0BlbmQgZXhhbXBsZQorVGhpcyBleGFtcGxlIGNyZWF0ZXMgdGhlIHZhcmlhbnQgc3RyZWFtcyBpbiBzdWJkaXJlY3Rvcmllcy4gSGVyZSwgdGhlIGZpcnN0CittZWRpYSBwbGF5bGlzdCBpcyBjcmVhdGVkIGF0IEBmaWxle2h0dHA6Ly9leGFtcGxlLmNvbS9saXZlL3ZzXzAvb3V0Lm0zdTh9IGFuZAordGhlIHNlY29uZCBvbmUgYXQgQGZpbGV7aHR0cDovL2V4YW1wbGUuY29tL2xpdmUvdnNfMS9vdXQubTN1OH0uCitAZXhhbXBsZQorZmZtcGVnIC1yZSAtaSBpbi50cyAtYjphOjAgMzJrIC1iOmE6MSA2NGsgLWI6djowIDEwMDBrIC1iOnY6MSAzMDAwayAgXAorICAtbWFwIDA6YSAtbWFwIDA6YSAtbWFwIDA6diAtbWFwIDA6diAtZiBobHMgXAorICAtdmFyX3N0cmVhbV9tYXAgImE6MCxhZ3JvdXA6YXVkX2xvdyBhOjEsYWdyb3VwOmF1ZF9oaWdoIHY6MCxhZ3JvdXA6YXVkX2xvdyB2OjEsYWdyb3VwOmF1ZF9oaWdoIiBcCisgIC1tYXN0ZXJfcGxfbmFtZSBtYXN0ZXIubTN1OCBcCisgIGh0dHA6Ly9leGFtcGxlLmNvbS9saXZlL291dF8ldi5tM3U4CitAZW5kIGV4YW1wbGUKK1RoaXMgZXhhbXBsZSBjcmVhdGVzIHR3byBhdWRpbyBvbmx5IGFuZCB0d28gdmlkZW8gb25seSB2YXJpYW50IHN0cmVhbXMuIEluCithZGRpdGlvbiB0byB0aGUgI0VYVC1YLVNUUkVBTS1JTkYgdGFnIGZvciBlYWNoIHZhcmlhbnQgc3RyZWFtIGluIHRoZSBtYXN0ZXIKK3BsYXlsaXN0LCAjRVhULVgtTUVESUEgdGFnIGlzIGFsc28gYWRkZWQgZm9yIHRoZSB0d28gYXVkaW8gb25seSB2YXJpYW50IHN0cmVhbXMKK2FuZCB0aGV5IGFyZSBtYXBwZWQgdG8gdGhlIHR3byB2aWRlbyBvbmx5IHZhcmlhbnQgc3RyZWFtcyB3aXRoIGF1ZGlvIGdyb3VwIG5hbWVzCisnYXVkX2xvdycgYW5kICdhdWRfaGlnaCcuCisKK0J5IGRlZmF1bHQsIGEgc2luZ2xlIGhscyB2YXJpYW50IGNvbnRhaW5pbmcgYWxsIHRoZSBlbmNvZGVkIHN0cmVhbXMgaXMgY3JlYXRlZC4KKworQGl0ZW0gY2Nfc3RyZWFtX21hcAorTWFwIHN0cmluZyB3aGljaCBzcGVjaWZpZXMgZGlmZmVyZW50IGNsb3NlZCBjYXB0aW9ucyBncm91cHMgYW5kIHRoZWlyCithdHRyaWJ1dGVzLiBUaGUgY2xvc2VkIGNhcHRpb25zIHN0cmVhbSBncm91cHMgYXJlIHNlcGFyYXRlZCBieSBzcGFjZS4KK0V4cGVjdGVkIHN0cmluZyBmb3JtYXQgaXMgbGlrZSB0aGlzCisiY2Nncm91cDo8Z3JvdXAgbmFtZT4saW5zdHJlYW1pZDo8SU5TVFJFQU0tSUQ+LGxhbmd1YWdlOjxsYW5ndWFnZSBjb2RlPiAuLi4uIi4KKydjY2dyb3VwJyBhbmQgJ2luc3RyZWFtaWQnIGFyZSBtYW5kYXRvcnkgYXR0cmlidXRlcy4gJ2xhbmd1YWdlJyBpcyBhbiBvcHRpb25hbAorYXR0cmlidXRlLgorVGhlIGNsb3NlZCBjYXB0aW9ucyBncm91cHMgY29uZmlndXJlZCB1c2luZyB0aGlzIG9wdGlvbiBhcmUgbWFwcGVkIHRvIGRpZmZlcmVudAordmFyaWFudCBzdHJlYW1zIGJ5IHByb3ZpZGluZyB0aGUgc2FtZSAnY2Nncm91cCcgbmFtZSBpbiB0aGUKK0Bjb2Rle3Zhcl9zdHJlYW1fbWFwfSBzdHJpbmcuIElmIEBjb2Rle3Zhcl9zdHJlYW1fbWFwfSBpcyBub3Qgc2V0LCB0aGVuIHRoZQorZmlyc3QgYXZhaWxhYmxlIGNjZ3JvdXAgaW4gQGNvZGV7Y2Nfc3RyZWFtX21hcH0gaXMgbWFwcGVkIHRvIHRoZSBvdXRwdXQgdmFyaWFudAorc3RyZWFtLiBUaGUgZXhhbXBsZXMgZm9yIHRoZXNlIHR3byB1c2UgY2FzZXMgYXJlIGdpdmVuIGJlbG93LgorCitAZXhhbXBsZQorZmZtcGVnIC1yZSAtaSBpbi50cyAtYjp2IDEwMDBrIC1iOmEgNjRrIC1hNTNjYyAxIC1mIGhscyBcCisgIC1jY19zdHJlYW1fbWFwICJjY2dyb3VwOmNjLGluc3RyZWFtaWQ6Q0MxLGxhbmd1YWdlOmVuIiBcCisgIC1tYXN0ZXJfcGxfbmFtZSBtYXN0ZXIubTN1OCBcCisgIGh0dHA6Ly9leGFtcGxlLmNvbS9saXZlL291dC5tM3U4CitAZW5kIGV4YW1wbGUKK1RoaXMgZXhhbXBsZSBhZGRzIEBjb2RleyNFWFQtWC1NRURJQX0gdGFnIHdpdGggQGNvZGV7VFlQRT1DTE9TRUQtQ0FQVElPTlN9IGluCit0aGUgbWFzdGVyIHBsYXlsaXN0IHdpdGggZ3JvdXAgbmFtZSAnY2MnLCBsYW5nYXVnZSAnZW4nIChlbmdsaXNoKSBhbmQKK0lOU1RSRUFNLUlEICdDQzEnLiBBbHNvLCBpdCBhZGRzIEBjb2Rle0NMT1NFRC1DQVBUSU9OU30gYXR0cmlidXRlIHdpdGggZ3JvdXAKK25hbWUgJ2NjJyBmb3IgdGhlIG91dHB1dCB2YXJpYW50IHN0cmVhbS4KK0BleGFtcGxlCitmZm1wZWcgLXJlIC1pIGluLnRzIC1iOnY6MCAxMDAwayAtYjp2OjEgMjU2ayAtYjphOjAgNjRrIC1iOmE6MSAzMmsgXAorICAtYTUzY2M6MCAxIC1hNTNjYzoxIDFcCisgIC1tYXAgMDp2IC1tYXAgMDphIC1tYXAgMDp2IC1tYXAgMDphIC1mIGhscyBcCisgIC1jY19zdHJlYW1fbWFwICJjY2dyb3VwOmNjLGluc3RyZWFtaWQ6Q0MxLGxhbmd1YWdlOmVuIGNjZ3JvdXA6Y2MsaW5zdHJlYW1pZDpDQzIsbGFuZ3VhZ2U6c3AiIFwKKyAgLXZhcl9zdHJlYW1fbWFwICJ2OjAsYTowLGNjZ3JvdXA6Y2MgdjoxLGE6MSxjY2dyb3VwOmNjIiBcCisgIC1tYXN0ZXJfcGxfbmFtZSBtYXN0ZXIubTN1OCBcCisgIGh0dHA6Ly9leGFtcGxlLmNvbS9saXZlL291dF8ldi5tM3U4CitAZW5kIGV4YW1wbGUKK1RoaXMgZXhhbXBsZSBhZGRzIHR3byBAY29kZXsjRVhULVgtTUVESUF9IHRhZ3Mgd2l0aCBAY29kZXtUWVBFPUNMT1NFRC1DQVBUSU9OU30gaW4KK3RoZSBtYXN0ZXIgcGxheWxpc3QgZm9yIHRoZSBJTlNUUkVBTS1JRHMgJ0NDMScgYW5kICdDQzInLiBBbHNvLCBpdCBhZGRzCitAY29kZXtDTE9TRUQtQ0FQVElPTlN9IGF0dHJpYnV0ZSB3aXRoIGdyb3VwIG5hbWUgJ2NjJyBmb3IgdGhlIHR3byBvdXRwdXQgdmFyaWFudAorc3RyZWFtcy4KKworQGl0ZW0gbWFzdGVyX3BsX25hbWUKK0NyZWF0ZSBITFMgbWFzdGVyIHBsYXlsaXN0IHdpdGggdGhlIGdpdmVuIG5hbWUuCisKK0BleGFtcGxlCitmZm1wZWcgLXJlIC1pIGluLnRzIC1mIGhscyAtbWFzdGVyX3BsX25hbWUgbWFzdGVyLm0zdTggaHR0cDovL2V4YW1wbGUuY29tL2xpdmUvb3V0Lm0zdTgKK0BlbmQgZXhhbXBsZQorVGhpcyBleGFtcGxlIGNyZWF0ZXMgSExTIG1hc3RlciBwbGF5bGlzdCB3aXRoIG5hbWUgbWFzdGVyLm0zdTggYW5kIGl0IGlzCitwdWJsaXNoZWQgYXQgaHR0cDovL2V4YW1wbGUuY29tL2xpdmUvCisKK0BpdGVtIG1hc3Rlcl9wbF9wdWJsaXNoX3JhdGUKK1B1Ymxpc2ggbWFzdGVyIHBsYXkgbGlzdCByZXBlYXRlZGx5IGV2ZXJ5IGFmdGVyIHNwZWNpZmllZCBudW1iZXIgb2Ygc2VnbWVudCBpbnRlcnZhbHMuCisKK0BleGFtcGxlCitmZm1wZWcgLXJlIC1pIGluLnRzIC1mIGhscyAtbWFzdGVyX3BsX25hbWUgbWFzdGVyLm0zdTggXAorLWhsc190aW1lIDIgLW1hc3Rlcl9wbF9wdWJsaXNoX3JhdGUgMzAgaHR0cDovL2V4YW1wbGUuY29tL2xpdmUvb3V0Lm0zdTgKK0BlbmQgZXhhbXBsZQorCitUaGlzIGV4YW1wbGUgY3JlYXRlcyBITFMgbWFzdGVyIHBsYXlsaXN0IHdpdGggbmFtZSBtYXN0ZXIubTN1OCBhbmQga2VlcAorcHVibGlzaGluZyBpdCByZXBlYXRlZGx5IGV2ZXJ5IGFmdGVyIDMwIHNlZ21lbnRzIGkuZS4gZXZlcnkgYWZ0ZXIgNjBzLgorCitAaXRlbSBodHRwX3BlcnNpc3RlbnQKK1VzZSBwZXJzaXN0ZW50IEhUVFAgY29ubmVjdGlvbnMuIEFwcGxpY2FibGUgb25seSBmb3IgSFRUUCBvdXRwdXQuCisKK0BpdGVtIHRpbWVvdXQKK1NldCB0aW1lb3V0IGZvciBzb2NrZXQgSS9PIG9wZXJhdGlvbnMuIEFwcGxpY2FibGUgb25seSBmb3IgSFRUUCBvdXRwdXQuCisKIEBlbmQgdGFibGUKIAogQGFuY2hvcntpY299CkBAIC00NTksNyArMTA0Niw3IEBACiBzZXF1ZW5jZSBvZiBmaWxlcyBAZmlsZXtpbWctMDAxLmpwZWd9LCBAZmlsZXtpbWctMDAyLmpwZWd9LCAuLi4sCiB0YWtpbmcgb25lIGltYWdlIGV2ZXJ5IHNlY29uZCBmcm9tIHRoZSBpbnB1dCB2aWRlbzoKIEBleGFtcGxlCi1mZm1wZWcgLWkgaW4uYXZpIC12c3luYyAxIC1yIDEgLWYgaW1hZ2UyICdpbWctJTAzZC5qcGVnJworZmZtcGVnIC1pIGluLmF2aSAtdnN5bmMgY2ZyIC1yIDEgLWYgaW1hZ2UyICdpbWctJTAzZC5qcGVnJwogQGVuZCBleGFtcGxlCiAKIE5vdGUgdGhhdCB3aXRoIEBjb21tYW5ke2ZmbXBlZ30sIGlmIHRoZSBmb3JtYXQgaXMgbm90IHNwZWNpZmllZCB3aXRoIHRoZQpAQCAtNDY3LDEyICsxMDU0LDEyIEBACiBmb3JtYXQsIHRoZSBpbWFnZTIgbXV4ZXIgaXMgYXV0b21hdGljYWxseSBzZWxlY3RlZCwgc28gdGhlIHByZXZpb3VzCiBjb21tYW5kIGNhbiBiZSB3cml0dGVuIGFzOgogQGV4YW1wbGUKLWZmbXBlZyAtaSBpbi5hdmkgLXZzeW5jIDEgLXIgMSAnaW1nLSUwM2QuanBlZycKK2ZmbXBlZyAtaSBpbi5hdmkgLXZzeW5jIGNmciAtciAxICdpbWctJTAzZC5qcGVnJwogQGVuZCBleGFtcGxlCiAKIE5vdGUgYWxzbyB0aGF0IHRoZSBwYXR0ZXJuIG11c3Qgbm90IG5lY2Vzc2FyaWx5IGNvbnRhaW4gIiVkIiBvcgogIiUwQHZhcntOfWQiLCBmb3IgZXhhbXBsZSB0byBjcmVhdGUgYSBzaW5nbGUgaW1hZ2UgZmlsZQotQGZpbGV7aW1nLmpwZWd9IGZyb20gdGhlIGlucHV0IHZpZGVvIHlvdSBjYW4gZW1wbG95IHRoZSBjb21tYW5kOgorQGZpbGV7aW1nLmpwZWd9IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCB2aWRlbyB5b3UgY2FuIGVtcGxveSB0aGUgY29tbWFuZDoKIEBleGFtcGxlCiBmZm1wZWcgLWkgaW4uYXZpIC1mIGltYWdlMiAtZnJhbWVzOnYgMSBpbWcuanBlZwogQGVuZCBleGFtcGxlCkBAIC00ODgsMTEgKzEwNzUsMjAgQEAKIGZmbXBlZyAtZiB2NGwyIC1yIDEgLWkgL2Rldi92aWRlbzAgLWYgaW1hZ2UyIC1zdHJmdGltZSAxICIlWS0lbS0lZF8lSC0lTS0lUy5qcGciCiBAZW5kIGV4YW1wbGUKIAorWW91IGNhbiBzZXQgdGhlIGZpbGUgbmFtZSB3aXRoIGN1cnJlbnQgZnJhbWUncyBQVFM6CitAZXhhbXBsZQorZmZtcGVnIC1mIHY0bDIgLXIgMSAtaSAvZGV2L3ZpZGVvMCAtY29weXRzIC1mIGltYWdlMiAtZnJhbWVfcHRzIHRydWUgJWQuanBnIgorQGVuZCBleGFtcGxlCisKIEBzdWJzZWN0aW9uIE9wdGlvbnMKIAogQHRhYmxlIEBvcHRpb24KK0BpdGVtIGZyYW1lX3B0cworSWYgc2V0IHRvIDEsIGV4cGFuZCB0aGUgZmlsZW5hbWUgd2l0aCBwdHMgZnJvbSBwa3QtPnB0cy4KK0RlZmF1bHQgdmFsdWUgaXMgMC4KKwogQGl0ZW0gc3RhcnRfbnVtYmVyCi1TdGFydCB0aGUgc2VxdWVuY2UgZnJvbSB0aGUgc3BlY2lmaWVkIG51bWJlci4gRGVmYXVsdCB2YWx1ZSBpcyAwLgorU3RhcnQgdGhlIHNlcXVlbmNlIGZyb20gdGhlIHNwZWNpZmllZCBudW1iZXIuIERlZmF1bHQgdmFsdWUgaXMgMS4KIAogQGl0ZW0gdXBkYXRlCiBJZiBzZXQgdG8gMSwgdGhlIGZpbGVuYW1lIHdpbGwgYWx3YXlzIGJlIGludGVycHJldGVkIGFzIGp1c3QgYQpAQCAtNjAxLDE2ICsxMTk3LDEyIEBACiAKIE1ENSB0ZXN0aW5nIGZvcm1hdC4KIAotVGhpcyBtdXhlciBjb21wdXRlcyBhbmQgcHJpbnRzIHRoZSBNRDUgaGFzaCBvZiBhbGwgdGhlIGlucHV0IGF1ZGlvCi1hbmQgdmlkZW8gZnJhbWVzLiBCeSBkZWZhdWx0IGF1ZGlvIGZyYW1lcyBhcmUgY29udmVydGVkIHRvIHNpZ25lZAotMTYtYml0IHJhdyBhdWRpbyBhbmQgdmlkZW8gZnJhbWVzIHRvIHJhdyB2aWRlbyBiZWZvcmUgY29tcHV0aW5nIHRoZQotaGFzaC4gVGltZXN0YW1wcyBhcmUgaWdub3JlZC4KK1RoaXMgaXMgYSB2YXJpYW50IG9mIHRoZSBAcmVme2hhc2h9IG11eGVyLiBVbmxpa2UgdGhhdCBtdXhlciwgaXQKK2RlZmF1bHRzIHRvIHVzaW5nIHRoZSBNRDUgaGFzaCBmdW5jdGlvbi4KIAotVGhlIG91dHB1dCBvZiB0aGUgbXV4ZXIgY29uc2lzdHMgb2YgYSBzaW5nbGUgbGluZSBvZiB0aGUgZm9ybToKLU1ENT1AdmFye01ENX0sIHdoZXJlIEB2YXJ7TUQ1fSBpcyBhIGhleGFkZWNpbWFsIG51bWJlciByZXByZXNlbnRpbmcKLXRoZSBjb21wdXRlZCBNRDUgaGFzaC4KK0BzdWJzZWN0aW9uIEV4YW1wbGVzCiAKLUZvciBleGFtcGxlIHRvIGNvbXB1dGUgdGhlIE1ENSBoYXNoIG9mIHRoZSBpbnB1dCBjb252ZXJ0ZWQgdG8gcmF3CitUbyBjb21wdXRlIHRoZSBNRDUgaGFzaCBvZiB0aGUgaW5wdXQgY29udmVydGVkIHRvIHJhdwogYXVkaW8gYW5kIHZpZGVvLCBhbmQgc3RvcmUgaXQgaW4gdGhlIGZpbGUgQGZpbGV7b3V0Lm1kNX06CiBAZXhhbXBsZQogZmZtcGVnIC1pIElOUFVUIC1mIG1kNSBvdXQubWQ1CkBAIC02MjEsNyArMTIxMyw3IEBACiBmZm1wZWcgLWkgSU5QVVQgLWYgbWQ1IC0KIEBlbmQgZXhhbXBsZQogCi1TZWUgYWxzbyB0aGUgQHJlZntmcmFtZW1kNX0gbXV4ZXIuCitTZWUgYWxzbyB0aGUgQHJlZntoYXNofSBhbmQgQHJlZntmcmFtZW1kNX0gbXV4ZXJzLgogCiBAc2VjdGlvbiBtb3YsIG1wNCwgaXNtdgogCkBAIC03MTIsNiArMTMwNCwxNSBAQAogMTQ0OTYtMTI6MjAxMi4gVGhpcyBtYXkgbWFrZSB0aGUgZnJhZ21lbnRzIGVhc2llciB0byBwYXJzZSBpbiBjZXJ0YWluCiBjaXJjdW1zdGFuY2VzIChhdm9pZGluZyBiYXNpbmcgdHJhY2sgZnJhZ21lbnQgbG9jYXRpb24gY2FsY3VsYXRpb25zCiBvbiB0aGUgaW1wbGljaXQgZW5kIG9mIHRoZSBwcmV2aW91cyB0cmFjayBmcmFnbWVudCkuCitAaXRlbSAtd3JpdGVfdG1jZAorU3BlY2lmeSBAY29kZXtvbn0gdG8gZm9yY2Ugd3JpdGluZyBhIHRpbWVjb2RlIHRyYWNrLCBAY29kZXtvZmZ9IHRvIGRpc2FibGUgaXQKK2FuZCBAY29kZXthdXRvfSB0byB3cml0ZSBhIHRpbWVjb2RlIHRyYWNrIG9ubHkgZm9yIG1vdiBhbmQgbXA0IG91dHB1dCAoZGVmYXVsdCkuCitAaXRlbSAtbW92ZmxhZ3MgbmVnYXRpdmVfY3RzX29mZnNldHMKK0VuYWJsZXMgdXRpbGl6YXRpb24gb2YgdmVyc2lvbiAxIG9mIHRoZSBDVFRTIGJveCwgaW4gd2hpY2ggdGhlIENUUyBvZmZzZXRzIGNhbgorYmUgbmVnYXRpdmUuIFRoaXMgZW5hYmxlcyB0aGUgaW5pdGlhbCBzYW1wbGUgdG8gaGF2ZSBEVFMvQ1RTIG9mIHplcm8sIGFuZAorcmVkdWNlcyB0aGUgbmVlZCBmb3IgZWRpdCBsaXN0cyBmb3Igc29tZSBjYXNlcyBzdWNoIGFzIHZpZGVvIHRyYWNrcyB3aXRoCitCLWZyYW1lcy4gQWRkaXRpb25hbGx5LCBlYXNlcyBjb25mb3JtYW5jZSB3aXRoIHRoZSBEQVNILUlGIGludGVyb3BlcmFiaWxpdHkKK2d1aWRlbGluZXMuCiBAZW5kIHRhYmxlCiAKIEBzdWJzZWN0aW9uIEV4YW1wbGUKQEAgLTc5MCw2OSArMTM5MSwzNSBAQAogCiBUaGUgcmVjb2duaXplZCBtZXRhZGF0YSBzZXR0aW5ncyBpbiBtcGVndHMgbXV4ZXIgYXJlIEBjb2Rle3NlcnZpY2VfcHJvdmlkZXJ9CiBhbmQgQGNvZGV7c2VydmljZV9uYW1lfS4gSWYgdGhleSBhcmUgbm90IHNldCB0aGUgZGVmYXVsdCBmb3IKLUBjb2Rle3NlcnZpY2VfcHJvdmlkZXJ9IGlzICJGRm1wZWciIGFuZCB0aGUgZGVmYXVsdCBmb3IKLUBjb2Rle3NlcnZpY2VfbmFtZX0gaXMgIlNlcnZpY2UwMSIuCitAY29kZXtzZXJ2aWNlX3Byb3ZpZGVyfSBpcyBAc2FtcHtGRm1wZWd9IGFuZCB0aGUgZGVmYXVsdCBmb3IKK0Bjb2Rle3NlcnZpY2VfbmFtZX0gaXMgQHNhbXB7U2VydmljZTAxfS4KIAogQHN1YnNlY3Rpb24gT3B0aW9ucwogCiBUaGUgbXV4ZXIgb3B0aW9ucyBhcmU6CiAKIEB0YWJsZSBAb3B0aW9uCi1AaXRlbSAtbXBlZ3RzX29yaWdpbmFsX25ldHdvcmtfaWQgQHZhcntudW1iZXJ9Ci1TZXQgdGhlIG9yaWdpbmFsX25ldHdvcmtfaWQgKGRlZmF1bHQgMHgwMDAxKS4gVGhpcyBpcyB1bmlxdWUgaWRlbnRpZmllcgotb2YgYSBuZXR3b3JrIGluIERWQi4gSXRzIG1haW4gdXNlIGlzIGluIHRoZSB1bmlxdWUgaWRlbnRpZmljYXRpb24gb2YgYQotc2VydmljZSB0aHJvdWdoIHRoZSBwYXRoIE9yaWdpbmFsX05ldHdvcmtfSUQsIFRyYW5zcG9ydF9TdHJlYW1fSUQuCi1AaXRlbSAtbXBlZ3RzX3RyYW5zcG9ydF9zdHJlYW1faWQgQHZhcntudW1iZXJ9Ci1TZXQgdGhlIHRyYW5zcG9ydF9zdHJlYW1faWQgKGRlZmF1bHQgMHgwMDAxKS4gVGhpcyBpZGVudGlmaWVzIGEKLXRyYW5zcG9uZGVyIGluIERWQi4KLUBpdGVtIC1tcGVndHNfc2VydmljZV9pZCBAdmFye251bWJlcn0KLVNldCB0aGUgc2VydmljZV9pZCAoZGVmYXVsdCAweDAwMDEpIGFsc28ga25vd24gYXMgcHJvZ3JhbSBpbiBEVkIuCi1AaXRlbSAtbXBlZ3RzX3NlcnZpY2VfdHlwZSBAdmFye251bWJlcn0KLVNldCB0aGUgcHJvZ3JhbSBzZXJ2aWNlX3R5cGUgKGRlZmF1bHQgQHZhcntkaWdpdGFsX3R2fSksIHNlZSBiZWxvdwotYSBsaXN0IG9mIHByZSBkZWZpbmVkIHZhbHVlcy4KLUBpdGVtIC1tcGVndHNfcG10X3N0YXJ0X3BpZCBAdmFye251bWJlcn0KLVNldCB0aGUgZmlyc3QgUElEIGZvciBQTVQgKGRlZmF1bHQgMHgxMDAwLCBtYXggMHgxZjAwKS4KLUBpdGVtIC1tcGVndHNfc3RhcnRfcGlkIEB2YXJ7bnVtYmVyfQotU2V0IHRoZSBmaXJzdCBQSUQgZm9yIGRhdGEgcGFja2V0cyAoZGVmYXVsdCAweDAxMDAsIG1heCAweDBmMDApLgotQGl0ZW0gLW1wZWd0c19tMnRzX21vZGUgQHZhcntudW1iZXJ9Ci1FbmFibGUgbTJ0cyBtb2RlIGlmIHNldCB0byAxLiBEZWZhdWx0IHZhbHVlIGlzIC0xIHdoaWNoIGRpc2FibGVzIG0ydHMgbW9kZS4KLUBpdGVtIC1tdXhyYXRlIEB2YXJ7bnVtYmVyfQotU2V0IGEgY29uc3RhbnQgbXV4cmF0ZSAoZGVmYXVsdCBWQlIpLgotQGl0ZW0gLXBjcl9wZXJpb2QgQHZhcntudW1lcn0KLU92ZXJyaWRlIHRoZSBkZWZhdWx0IFBDUiByZXRyYW5zbWlzc2lvbiB0aW1lIChkZWZhdWx0IDIwbXMpLCBpZ25vcmVkCi1pZiB2YXJpYWJsZSBtdXhyYXRlIGlzIHNlbGVjdGVkLgotQGl0ZW0gcGF0X3BlcmlvZCBAdmFye251bWJlcn0KLU1heGltYWwgdGltZSBpbiBzZWNvbmRzIGJldHdlZW4gUEFUL1BNVCB0YWJsZXMuCi1AaXRlbSBzZHRfcGVyaW9kIEB2YXJ7bnVtYmVyfQotTWF4aW1hbCB0aW1lIGluIHNlY29uZHMgYmV0d2VlbiBTRFQgdGFibGVzLgotQGl0ZW0gLXBlc19wYXlsb2FkX3NpemUgQHZhcntudW1iZXJ9Ci1TZXQgbWluaW11bSBQRVMgcGFja2V0IHBheWxvYWQgaW4gYnl0ZXMuCi1AaXRlbSAtbXBlZ3RzX2ZsYWdzIEB2YXJ7ZmxhZ3N9Ci1TZXQgZmxhZ3MgKHNlZSBiZWxvdykuCi1AaXRlbSAtbXBlZ3RzX2NvcHl0cyBAdmFye251bWJlcn0KLVByZXNlcnZlIG9yaWdpbmFsIHRpbWVzdGFtcHMsIGlmIHZhbHVlIGlzIHNldCB0byAxLiBEZWZhdWx0IHZhbHVlIGlzIC0xLCB3aGljaAotcmVzdWx0cyBpbiBzaGlmdGluZyB0aW1lc3RhbXBzIHNvIHRoYXQgdGhleSBzdGFydCBmcm9tIDAuCi1AaXRlbSAtdGFibGVzX3ZlcnNpb24gQHZhcntudW1iZXJ9Ci1TZXQgUEFULCBQTVQgYW5kIFNEVCB2ZXJzaW9uIChkZWZhdWx0IDAsIHZhbGlkIHZhbHVlcyBhcmUgZnJvbSAwIHRvIDMxLCBpbmNsdXNpdmVseSkuCi1UaGlzIG9wdGlvbiBhbGxvd3MgdXBkYXRpbmcgc3RyZWFtIHN0cnVjdHVyZSBzbyB0aGF0IHN0YW5kYXJkIGNvbnN1bWVyIG1heQotZGV0ZWN0IHRoZSBjaGFuZ2UuIFRvIGRvIHNvLCByZW9wZW4gb3V0cHV0IEFWRm9ybWF0Q29udGV4dCAoaW4gY2FzZSBvZiBBUEkKLXVzYWdlKSBvciByZXN0YXJ0IGZmbXBlZyBpbnN0YW5jZSwgY3ljbGljYWxseSBjaGFuZ2luZyB0YWJsZXNfdmVyc2lvbiB2YWx1ZToKLUBleGFtcGxlCi1mZm1wZWcgLWkgc291cmNlMS50cyAtY29kZWMgY29weSAtZiBtcGVndHMgLXRhYmxlc192ZXJzaW9uIDAgdWRwOi8vMS4xLjEuMToxMTExCi1mZm1wZWcgLWkgc291cmNlMi50cyAtY29kZWMgY29weSAtZiBtcGVndHMgLXRhYmxlc192ZXJzaW9uIDEgdWRwOi8vMS4xLjEuMToxMTExCi0uLi4KLWZmbXBlZyAtaSBzb3VyY2UzLnRzIC1jb2RlYyBjb3B5IC1mIG1wZWd0cyAtdGFibGVzX3ZlcnNpb24gMzEgdWRwOi8vMS4xLjEuMToxMTExCi1mZm1wZWcgLWkgc291cmNlMS50cyAtY29kZWMgY29weSAtZiBtcGVndHMgLXRhYmxlc192ZXJzaW9uIDAgdWRwOi8vMS4xLjEuMToxMTExCi1mZm1wZWcgLWkgc291cmNlMi50cyAtY29kZWMgY29weSAtZiBtcGVndHMgLXRhYmxlc192ZXJzaW9uIDEgdWRwOi8vMS4xLjEuMToxMTExCi0uLi4KLUBlbmQgZXhhbXBsZQotQGVuZCB0YWJsZQorQGl0ZW0gbXBlZ3RzX3RyYW5zcG9ydF9zdHJlYW1faWQgQHZhcntpbnRlZ2VyfQorU2V0IHRoZSBAc2FtcHt0cmFuc3BvcnRfc3RyZWFtX2lkfS4gVGhpcyBpZGVudGlmaWVzIGEgdHJhbnNwb25kZXIgaW4gRFZCLgorRGVmYXVsdCBpcyBAY29kZXsweDAwMDF9LgogCi1PcHRpb24gbXBlZ3RzX3NlcnZpY2VfdHlwZSBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorQGl0ZW0gbXBlZ3RzX29yaWdpbmFsX25ldHdvcmtfaWQgQHZhcntpbnRlZ2VyfQorU2V0IHRoZSBAc2FtcHtvcmlnaW5hbF9uZXR3b3JrX2lkfS4gVGhpcyBpcyB1bmlxdWUgaWRlbnRpZmllciBvZiBhCituZXR3b3JrIGluIERWQi4gSXRzIG1haW4gdXNlIGlzIGluIHRoZSB1bmlxdWUgaWRlbnRpZmljYXRpb24gb2YgYSBzZXJ2aWNlCit0aHJvdWdoIHRoZSBwYXRoIEBzYW1we09yaWdpbmFsX05ldHdvcmtfSUQsIFRyYW5zcG9ydF9TdHJlYW1fSUR9LiBEZWZhdWx0CitpcyBAY29kZXsweDAwMDF9LgogCi1AdGFibGUgQG9wdGlvbgorQGl0ZW0gbXBlZ3RzX3NlcnZpY2VfaWQgQHZhcntpbnRlZ2VyfQorU2V0IHRoZSBAc2FtcHtzZXJ2aWNlX2lkfSwgYWxzbyBrbm93biBhcyBwcm9ncmFtIGluIERWQi4gRGVmYXVsdCBpcworQGNvZGV7MHgwMDAxfS4KKworQGl0ZW0gbXBlZ3RzX3NlcnZpY2VfdHlwZSBAdmFye2ludGVnZXJ9CitTZXQgdGhlIHByb2dyYW0gQHNhbXB7c2VydmljZV90eXBlfS4gRGVmYXVsdCBpcyBAY29kZXtkaWdpdGFsX3R2fS4KK0FjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorQHRhYmxlIEBzYW1wCiBAaXRlbSBoZXhfdmFsdWUKLUFueSBoZXhkZWNpbWFsIHZhbHVlIGJldHdlZW4gMHgwMSB0byAweGZmIGFzIGRlZmluZWQgaW4gRVRTSSAzMDAgNDY4LgorQW55IGhleGRlY2ltYWwgdmFsdWUgYmV0d2VlbiBAY29kZXsweDAxfSB0byBAY29kZXsweGZmfSBhcyBkZWZpbmVkIGluCitFVFNJIDMwMCA0NjguCiBAaXRlbSBkaWdpdGFsX3R2CiBEaWdpdGFsIFRWIHNlcnZpY2UuCiBAaXRlbSBkaWdpdGFsX3JhZGlvCkBAIC04NjksOSArMTQzNiwyNiBAQAogQWR2YW5jZWQgQ29kZWMgRGlnaXRhbCBIRFRWIHNlcnZpY2UuCiBAZW5kIHRhYmxlCiAKLU9wdGlvbiBtcGVndHNfZmxhZ3MgbWF5IHRha2UgYSBzZXQgb2Ygc3VjaCBmbGFnczoKK0BpdGVtIG1wZWd0c19wbXRfc3RhcnRfcGlkIEB2YXJ7aW50ZWdlcn0KK1NldCB0aGUgZmlyc3QgUElEIGZvciBQTVQuIERlZmF1bHQgaXMgQGNvZGV7MHgxMDAwfS4gTWF4IGlzIEBjb2RlezB4MWYwMH0uCiAKLUB0YWJsZSBAb3B0aW9uCitAaXRlbSBtcGVndHNfc3RhcnRfcGlkIEB2YXJ7aW50ZWdlcn0KK1NldCB0aGUgZmlyc3QgUElEIGZvciBkYXRhIHBhY2tldHMuIERlZmF1bHQgaXMgQGNvZGV7MHgwMTAwfS4gTWF4IGlzCitAY29kZXsweDBmMDB9LgorCitAaXRlbSBtcGVndHNfbTJ0c19tb2RlIEB2YXJ7Ym9vbGVhbn0KK0VuYWJsZSBtMnRzIG1vZGUgaWYgc2V0IHRvIEBjb2RlezF9LiBEZWZhdWx0IHZhbHVlIGlzIEBjb2Rley0xfSB3aGljaAorZGlzYWJsZXMgbTJ0cyBtb2RlLgorCitAaXRlbSBtdXhyYXRlIEB2YXJ7aW50ZWdlcn0KK1NldCBhIGNvbnN0YW50IG11eHJhdGUuIERlZmF1bHQgaXMgVkJSLgorCitAaXRlbSBwZXNfcGF5bG9hZF9zaXplIEB2YXJ7aW50ZWdlcn0KK1NldCBtaW5pbXVtIFBFUyBwYWNrZXQgcGF5bG9hZCBpbiBieXRlcy4gRGVmYXVsdCBpcyBAY29kZXsyOTMwfS4KKworQGl0ZW0gbXBlZ3RzX2ZsYWdzIEB2YXJ7ZmxhZ3N9CitTZXQgbXBlZ3RzIGZsYWdzLiBBY2NlcHRzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKK0B0YWJsZSBAc2FtcAogQGl0ZW0gcmVzZW5kX2hlYWRlcnMKIFJlZW1pdCBQQVQvUE1UIGJlZm9yZSB3cml0aW5nIHRoZSBuZXh0IHBhY2tldC4KIEBpdGVtIGxhdG0KQEAgLTg4MCw2ICsxNDY0LDQ3IEBACiBSZWVtaXQgUEFUIGFuZCBQTVQgYXQgZWFjaCB2aWRlbyBmcmFtZS4KIEBpdGVtIHN5c3RlbV9iCiBDb25mb3JtIHRvIFN5c3RlbSBCIChEVkIpIGluc3RlYWQgb2YgU3lzdGVtIEEgKEFUU0MpLgorQGl0ZW0gaW5pdGlhbF9kaXNjb250aW51aXR5CitNYXJrIHRoZSBpbml0aWFsIHBhY2tldCBvZiBlYWNoIHN0cmVhbSBhcyBkaXNjb250aW51aXR5LgorQGVuZCB0YWJsZQorCitAaXRlbSByZXNlbmRfaGVhZGVycyBAdmFye2ludGVnZXJ9CitSZWVtaXQgUEFUL1BNVCBiZWZvcmUgd3JpdGluZyB0aGUgbmV4dCBwYWNrZXQuIFRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQ6Cit1c2UgQG9wdGlvbnttcGVndHNfZmxhZ3N9IGluc3RlYWQuCisKK0BpdGVtIG1wZWd0c19jb3B5dHMgQHZhcntib29sZWFufQorUHJlc2VydmUgb3JpZ2luYWwgdGltZXN0YW1wcywgaWYgdmFsdWUgaXMgc2V0IHRvIEBjb2RlezF9LiBEZWZhdWx0IHZhbHVlCitpcyBAY29kZXstMX0sIHdoaWNoIHJlc3VsdHMgaW4gc2hpZnRpbmcgdGltZXN0YW1wcyBzbyB0aGF0IHRoZXkgc3RhcnQgZnJvbSAwLgorCitAaXRlbSBvbWl0X3ZpZGVvX3Blc19sZW5ndGggQHZhcntib29sZWFufQorT21pdCB0aGUgUEVTIHBhY2tldCBsZW5ndGggZm9yIHZpZGVvIHBhY2tldHMuIERlZmF1bHQgaXMgQGNvZGV7MX0gKHRydWUpLgorCitAaXRlbSBwY3JfcGVyaW9kIEB2YXJ7aW50ZWdlcn0KK092ZXJyaWRlIHRoZSBkZWZhdWx0IFBDUiByZXRyYW5zbWlzc2lvbiB0aW1lIGluIG1pbGxpc2Vjb25kcy4gSWdub3JlZCBpZgordmFyaWFibGUgbXV4cmF0ZSBpcyBzZWxlY3RlZC4gRGVmYXVsdCBpcyBAY29kZXsyMH0uCisKK0BpdGVtIHBhdF9wZXJpb2QgQHZhcntkb3VibGV9CitNYXhpbXVtIHRpbWUgaW4gc2Vjb25kcyBiZXR3ZWVuIFBBVC9QTVQgdGFibGVzLgorCitAaXRlbSBzZHRfcGVyaW9kIEB2YXJ7ZG91YmxlfQorTWF4aW11bSB0aW1lIGluIHNlY29uZHMgYmV0d2VlbiBTRFQgdGFibGVzLgorCitAaXRlbSB0YWJsZXNfdmVyc2lvbiBAdmFye2ludGVnZXJ9CitTZXQgUEFULCBQTVQgYW5kIFNEVCB2ZXJzaW9uIChkZWZhdWx0IEBjb2RlezB9LCB2YWxpZCB2YWx1ZXMgYXJlIGZyb20gMCB0byAzMSwgaW5jbHVzaXZlbHkpLgorVGhpcyBvcHRpb24gYWxsb3dzIHVwZGF0aW5nIHN0cmVhbSBzdHJ1Y3R1cmUgc28gdGhhdCBzdGFuZGFyZCBjb25zdW1lciBtYXkKK2RldGVjdCB0aGUgY2hhbmdlLiBUbyBkbyBzbywgcmVvcGVuIG91dHB1dCBAY29kZXtBVkZvcm1hdENvbnRleHR9IChpbiBjYXNlIG9mIEFQSQordXNhZ2UpIG9yIHJlc3RhcnQgQGNvbW1hbmR7ZmZtcGVnfSBpbnN0YW5jZSwgY3ljbGljYWxseSBjaGFuZ2luZworQG9wdGlvbnt0YWJsZXNfdmVyc2lvbn0gdmFsdWU6CisKK0BleGFtcGxlCitmZm1wZWcgLWkgc291cmNlMS50cyAtY29kZWMgY29weSAtZiBtcGVndHMgLXRhYmxlc192ZXJzaW9uIDAgdWRwOi8vMS4xLjEuMToxMTExCitmZm1wZWcgLWkgc291cmNlMi50cyAtY29kZWMgY29weSAtZiBtcGVndHMgLXRhYmxlc192ZXJzaW9uIDEgdWRwOi8vMS4xLjEuMToxMTExCisuLi4KK2ZmbXBlZyAtaSBzb3VyY2UzLnRzIC1jb2RlYyBjb3B5IC1mIG1wZWd0cyAtdGFibGVzX3ZlcnNpb24gMzEgdWRwOi8vMS4xLjEuMToxMTExCitmZm1wZWcgLWkgc291cmNlMS50cyAtY29kZWMgY29weSAtZiBtcGVndHMgLXRhYmxlc192ZXJzaW9uIDAgdWRwOi8vMS4xLjEuMToxMTExCitmZm1wZWcgLWkgc291cmNlMi50cyAtY29kZWMgY29weSAtZiBtcGVndHMgLXRhYmxlc192ZXJzaW9uIDEgdWRwOi8vMS4xLjEuMToxMTExCisuLi4KK0BlbmQgZXhhbXBsZQogQGVuZCB0YWJsZQogCiBAc3Vic2VjdGlvbiBFeGFtcGxlCkBAIC04OTMsNyArMTUxOCw3IEBACiAgICAgIC1tcGVndHNfc3RhcnRfcGlkIDB4MTUwIFwKICAgICAgLW1ldGFkYXRhIHNlcnZpY2VfcHJvdmlkZXI9IlNvbWUgcHJvdmlkZXIiIFwKICAgICAgLW1ldGFkYXRhIHNlcnZpY2VfbmFtZT0iU29tZSBDaGFubmVsIiBcCi0gICAgIC15IG91dC50cworICAgICBvdXQudHMKIEBlbmQgZXhhbXBsZQogCiBAc2VjdGlvbiBteGYsIG14Zl9kMTAKQEAgLTEwMTcsNiArMTY0MiwxMiBAQAogVGhlIHNlZ21lbnQgbXV4ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgogCiBAdGFibGUgQG9wdGlvbgorQGl0ZW0gaW5jcmVtZW50X3RjIEB2YXJ7MXwwfQoraWYgc2V0IHRvIEBjb2RlezF9LCBpbmNyZW1lbnQgdGltZWNvZGUgYmV0d2VlbiBlYWNoIHNlZ21lbnQKK0lmIHRoaXMgaXMgc2VsZWN0ZWQsIHRoZSBpbnB1dCBuZWVkIHRvIGhhdmUKK2EgdGltZWNvZGUgaW4gdGhlIGZpcnN0IHZpZGVvIHN0cmVhbS4gRGVmYXVsdCB2YWx1ZSBpcworQGNvZGV7MH0uCisKIEBpdGVtIHJlZmVyZW5jZV9zdHJlYW0gQHZhcntzcGVjaWZpZXJ9CiBTZXQgdGhlIHJlZmVyZW5jZSBzdHJlYW0sIGFzIHNwZWNpZmllZCBieSB0aGUgc3RyaW5nIEB2YXJ7c3BlY2lmaWVyfS4KIElmIEB2YXJ7c3BlY2lmaWVyfSBpcyBzZXQgdG8gQGNvZGV7YXV0b30sIHRoZSByZWZlcmVuY2UgaXMgY2hvc2VuCkBAIC0xMTM2LDkgKzE3NjcsNiBAQAogY2FuIG1ha2UgdGhlIHNlZ21lbnRlciBtb3JlIHJlc2lsaWVudCB0byBiYWNrd2FyZCBsb2NhbCB0aW1lIGp1bXBzLCBzdWNoIGFzCiBsZWFwIHNlY29uZHMgb3IgdHJhbnNpdGlvbiB0byBzdGFuZGFyZCB0aW1lIGZyb20gZGF5bGlnaHQgc2F2aW5ncyB0aW1lLgogCi1Bc3N1bWluZyB0aGF0IHRoZSBkZWxheSBiZXR3ZWVuIHRoZSBwYWNrZXRzIG9mIHlvdXIgc291cmNlIGlzIGxlc3MgdGhhbiAwLjUKLXNlY29uZCB5b3UgY2FuIGRldGVjdCBhIGxlYXAgc2Vjb25kIGJ5IHNwZWNpZnlpbmcgMC41IGFzIHRoZSBkdXJhdGlvbi4KLQogRGVmYXVsdCBpcyB0aGUgbWF4aW11bSBwb3NzaWJsZSBkdXJhdGlvbiB3aGljaCBtZWFucyBzdGFydGluZyBhIG5ldyBzZWdtZW50CiByZWdhcmRsZXNzIG9mIHRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIGxhc3QgY2xvY2sgdGltZS4KIApAQCAtMTE5Niw3ICsxODI0LDcgQEAKIGR1cmluZyBzZWVraW5nLiBEZWZhdWx0cyB0byBAY29kZXswfS4KIAogQGl0ZW0gcmVzZXRfdGltZXN0YW1wcyBAdmFyezF8MH0KLVJlc2V0IHRpbWVzdGFtcHMgYXQgdGhlIGJlZ2luIG9mIGVhY2ggc2VnbWVudCwgc28gdGhhdCBlYWNoIHNlZ21lbnQKK1Jlc2V0IHRpbWVzdGFtcHMgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNlZ21lbnQsIHNvIHRoYXQgZWFjaCBzZWdtZW50CiB3aWxsIHN0YXJ0IHdpdGggbmVhci16ZXJvIHRpbWVzdGFtcHMuIEl0IGlzIG1lYW50IHRvIGVhc2UgdGhlIHBsYXliYWNrCiBvZiB0aGUgZ2VuZXJhdGVkIHNlZ21lbnRzLiBNYXkgbm90IHdvcmsgd2l0aCBzb21lIGNvbWJpbmF0aW9ucyBvZgogbXV4ZXJzL2NvZGVjcy4gSXQgaXMgc2V0IHRvIEBjb2RlezB9IGJ5IGRlZmF1bHQuCkBAIC0xMjA0LDggKzE4MzIsMTYgQEAKIEBpdGVtIGluaXRpYWxfb2Zmc2V0IEB2YXJ7b2Zmc2V0fQogU3BlY2lmeSB0aW1lc3RhbXAgb2Zmc2V0IHRvIGFwcGx5IHRvIHRoZSBvdXRwdXQgcGFja2V0IHRpbWVzdGFtcHMuIFRoZQogYXJndW1lbnQgbXVzdCBiZSBhIHRpbWUgZHVyYXRpb24gc3BlY2lmaWNhdGlvbiwgYW5kIGRlZmF1bHRzIHRvIDAuCisKK0BpdGVtIHdyaXRlX2VtcHR5X3NlZ21lbnRzIEB2YXJ7MXwwfQorSWYgZW5hYmxlZCwgd3JpdGUgYW4gZW1wdHkgc2VnbWVudCBpZiB0aGVyZSBhcmUgbm8gcGFja2V0cyBkdXJpbmcgdGhlIHBlcmlvZCBhCitzZWdtZW50IHdvdWxkIHVzdWFsbHkgc3Bhbi4gT3RoZXJ3aXNlLCB0aGUgc2VnbWVudCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBuZXh0CitwYWNrZXQgd3JpdHRlbi4gRGVmYXVsdHMgdG8gQGNvZGV7MH0uCiBAZW5kIHRhYmxlCiAKK01ha2Ugc3VyZSB0byByZXF1aXJlIGEgY2xvc2VkIEdPUCB3aGVuIGVuY29kaW5nIGFuZCB0byBzZXQgdGhlIEdPUAorc2l6ZSB0byBmaXQgeW91ciBzZWdtZW50IHRpbWUgY29uc3RyYWludC4KKwogQHN1YnNlY3Rpb24gRXhhbXBsZXMKIAogQGl0ZW1pemUKQEAgLTEyMTQsNyArMTg1MCw3IEBACiBAZmlsZXtvdXQtMDAwLm51dH0sIEBmaWxle291dC0wMDEubnV0fSwgZXRjLiwgYW5kIHdyaXRlIHRoZSBsaXN0IG9mCiBnZW5lcmF0ZWQgc2VnbWVudHMgdG8gQGZpbGV7b3V0Lmxpc3R9OgogQGV4YW1wbGUKLWZmbXBlZyAtaSBpbi5ta3YgLWNvZGVjIGNvcHkgLW1hcCAwIC1mIHNlZ21lbnQgLXNlZ21lbnRfbGlzdCBvdXQubGlzdCBvdXQlMDNkLm51dAorZmZtcGVnIC1pIGluLm1rdiAtY29kZWMgaGV2YyAtZmxhZ3MgK2Nnb3AgLWcgNjAgLW1hcCAwIC1mIHNlZ21lbnQgLXNlZ21lbnRfbGlzdCBvdXQubGlzdCBvdXQlMDNkLm51dAogQGVuZCBleGFtcGxlCiAKIEBpdGVtCkBAIC0xMjUxLDkgKzE4ODcsOSBAQAogCiBAaXRlbQogQ29udmVydCB0aGUgQGZpbGV7aW4ubWt2fSB0byBUUyBzZWdtZW50cyB1c2luZyB0aGUgQGNvZGV7bGlieDI2NH0KLWFuZCBAY29kZXtsaWJmYWFjfSBlbmNvZGVyczoKK2FuZCBAY29kZXthYWN9IGVuY29kZXJzOgogQGV4YW1wbGUKLWZmbXBlZyAtaSBpbi5ta3YgLW1hcCAwIC1jb2RlYzp2IGxpYngyNjQgLWNvZGVjOmEgbGliZmFhYyAtZiBzc2VnbWVudCAtc2VnbWVudF9saXN0IG91dC5saXN0IG91dCUwM2QudHMKK2ZmbXBlZyAtaSBpbi5ta3YgLW1hcCAwIC1jb2RlYzp2IGxpYngyNjQgLWNvZGVjOmEgYWFjIC1mIHNzZWdtZW50IC1zZWdtZW50X2xpc3Qgb3V0Lmxpc3Qgb3V0JTAzZC50cwogQGVuZCBleGFtcGxlCiAKIEBpdGVtCkBAIC0xMjg3LDYgKzE5MjMsMTAyIEBACiAKIEBlbmQgdGFibGUKIAorQGFuY2hvcntmaWZvfQorQHNlY3Rpb24gZmlmbworCitUaGUgZmlmbyBwc2V1ZG8tbXV4ZXIgYWxsb3dzIHRoZSBzZXBhcmF0aW9uIG9mIGVuY29kaW5nIGFuZCBtdXhpbmcgYnkgdXNpbmcKK2ZpcnN0LWluLWZpcnN0LW91dCBxdWV1ZSBhbmQgcnVubmluZyB0aGUgYWN0dWFsIG11eGVyIGluIGEgc2VwYXJhdGUgdGhyZWFkLiBUaGlzCitpcyBlc3BlY2lhbGx5IHVzZWZ1bCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBAcmVme3RlZX0gbXV4ZXIgYW5kIGNhbiBiZSB1c2VkIHRvCitzZW5kIGRhdGEgdG8gc2V2ZXJhbCBkZXN0aW5hdGlvbnMgd2l0aCBkaWZmZXJlbnQgcmVsaWFiaWxpdHkvd3JpdGluZyBzcGVlZC9sYXRlbmN5LgorCitBUEkgdXNlcnMgc2hvdWxkIGJlIGF3YXJlIHRoYXQgY2FsbGJhY2sgZnVuY3Rpb25zIChpbnRlcnJ1cHRfY2FsbGJhY2ssCitpb19vcGVuIGFuZCBpb19jbG9zZSkgdXNlZCB3aXRoaW4gaXRzIEFWRm9ybWF0Q29udGV4dCBtdXN0IGJlIHRocmVhZC1zYWZlLgorCitUaGUgYmVoYXZpb3Igb2YgdGhlIGZpZm8gbXV4ZXIgaWYgdGhlIHF1ZXVlIGZpbGxzIHVwIG9yIGlmIHRoZSBvdXRwdXQgZmFpbHMgaXMKK3NlbGVjdGFibGUsCisKK0BpdGVtaXplIEBidWxsZXQKKworQGl0ZW0KK291dHB1dCBjYW4gYmUgdHJhbnNwYXJlbnRseSByZXN0YXJ0ZWQgd2l0aCBjb25maWd1cmFibGUgZGVsYXkgYmV0d2VlbiByZXRyaWVzCitiYXNlZCBvbiByZWFsIHRpbWUgb3IgdGltZSBvZiB0aGUgcHJvY2Vzc2VkIHN0cmVhbS4KKworQGl0ZW0KK2VuY29kaW5nIGNhbiBiZSBibG9ja2VkIGR1cmluZyB0ZW1wb3JhcnkgZmFpbHVyZSwgb3IgY29udGludWUgdHJhbnNwYXJlbnRseQorZHJvcHBpbmcgcGFja2V0cyBpbiBjYXNlIGZpZm8gcXVldWUgZmlsbHMgdXAuCisKK0BlbmQgaXRlbWl6ZQorCitAdGFibGUgQG9wdGlvbgorCitAaXRlbSBmaWZvX2Zvcm1hdAorU3BlY2lmeSB0aGUgZm9ybWF0IG5hbWUuIFVzZWZ1bCBpZiBpdCBjYW5ub3QgYmUgZ3Vlc3NlZCBmcm9tIHRoZQorb3V0cHV0IG5hbWUgc3VmZml4LgorCitAaXRlbSBxdWV1ZV9zaXplCitTcGVjaWZ5IHNpemUgb2YgdGhlIHF1ZXVlIChudW1iZXIgb2YgcGFja2V0cykuIERlZmF1bHQgdmFsdWUgaXMgNjAuCisKK0BpdGVtIGZvcm1hdF9vcHRzCitTcGVjaWZ5IGZvcm1hdCBvcHRpb25zIGZvciB0aGUgdW5kZXJseWluZyBtdXhlci4gTXV4ZXIgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkCithcyBhIGxpc3Qgb2YgQHZhcntrZXl9PUB2YXJ7dmFsdWV9IHBhaXJzIHNlcGFyYXRlZCBieSAnOicuCisKK0BpdGVtIGRyb3BfcGt0c19vbl9vdmVyZmxvdyBAdmFye2Jvb2x9CitJZiBzZXQgdG8gMSAodHJ1ZSksIGluIGNhc2UgdGhlIGZpZm8gcXVldWUgZmlsbHMgdXAsIHBhY2tldHMgd2lsbCBiZSBkcm9wcGVkCityYXRoZXIgdGhhbiBibG9ja2luZyB0aGUgZW5jb2Rlci4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBjb250aW51ZSBzdHJlYW1pbmcgd2l0aG91dAorZGVsYXlpbmcgdGhlIGlucHV0LCBhdCB0aGUgY29zdCBvZiBvbWl0dGluZyBwYXJ0IG9mIHRoZSBzdHJlYW0uIEJ5IGRlZmF1bHQKK3RoaXMgb3B0aW9uIGlzIHNldCB0byAwIChmYWxzZSksIHNvIGluIHN1Y2ggY2FzZXMgdGhlIGVuY29kZXIgd2lsbCBiZSBibG9ja2VkCit1bnRpbCB0aGUgbXV4ZXIgcHJvY2Vzc2VzIHNvbWUgb2YgdGhlIHBhY2tldHMgYW5kIG5vbmUgb2YgdGhlbSBpcyBsb3N0LgorCitAaXRlbSBhdHRlbXB0X3JlY292ZXJ5IEB2YXJ7Ym9vbH0KK0lmIGZhaWx1cmUgb2NjdXJzLCBhdHRlbXB0IHRvIHJlY292ZXIgdGhlIG91dHB1dC4gVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bAord2hlbiB1c2VkIHdpdGggbmV0d29yayBvdXRwdXQsIHNpbmNlIGl0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJlc3RhcnQgc3RyZWFtaW5nIHRyYW5zcGFyZW50bHkuCitCeSBkZWZhdWx0IHRoaXMgb3B0aW9uIGlzIHNldCB0byAwIChmYWxzZSkuCisKK0BpdGVtIG1heF9yZWNvdmVyeV9hdHRlbXB0cworU2V0cyBtYXhpbXVtIG51bWJlciBvZiBzdWNjZXNzaXZlIHVuc3VjY2Vzc2Z1bCByZWNvdmVyeSBhdHRlbXB0cyBhZnRlciB3aGljaAordGhlIG91dHB1dCBmYWlscyBwZXJtYW5lbnRseS4gQnkgZGVmYXVsdCB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gMCAodW5saW1pdGVkKS4KKworQGl0ZW0gcmVjb3Zlcnlfd2FpdF90aW1lIEB2YXJ7ZHVyYXRpb259CitXYWl0aW5nIHRpbWUgYmVmb3JlIHRoZSBuZXh0IHJlY292ZXJ5IGF0dGVtcHQgYWZ0ZXIgcHJldmlvdXMgdW5zdWNjZXNzZnVsCityZWNvdmVyeSBhdHRlbXB0LiBEZWZhdWx0IHZhbHVlIGlzIDUgc2Vjb25kcy4KKworQGl0ZW0gcmVjb3Zlcnlfd2FpdF9zdHJlYW10aW1lIEB2YXJ7Ym9vbH0KK0lmIHNldCB0byAwIChmYWxzZSksIHRoZSByZWFsIHRpbWUgaXMgdXNlZCB3aGVuIHdhaXRpbmcgZm9yIHRoZSByZWNvdmVyeQorYXR0ZW1wdCAoaS5lLiB0aGUgcmVjb3Zlcnkgd2lsbCBiZSBhdHRlbXB0ZWQgYWZ0ZXIgYXQgbGVhc3QKK3JlY292ZXJ5X3dhaXRfdGltZSBzZWNvbmRzKS4KK0lmIHNldCB0byAxICh0cnVlKSwgdGhlIHRpbWUgb2YgdGhlIHByb2Nlc3NlZCBzdHJlYW0gaXMgdGFrZW4gaW50byBhY2NvdW50CitpbnN0ZWFkIChpLmUuIHRoZSByZWNvdmVyeSB3aWxsIGJlIGF0dGVtcHRlZCBhZnRlciBhdCBsZWFzdCBAdmFye3JlY292ZXJ5X3dhaXRfdGltZX0KK3NlY29uZHMgb2YgdGhlIHN0cmVhbSBpcyBvbWl0dGVkKS4KK0J5IGRlZmF1bHQsIHRoaXMgb3B0aW9uIGlzIHNldCB0byAwIChmYWxzZSkuCisKK0BpdGVtIHJlY292ZXJfYW55X2Vycm9yIEB2YXJ7Ym9vbH0KK0lmIHNldCB0byAxICh0cnVlKSwgcmVjb3Zlcnkgd2lsbCBiZSBhdHRlbXB0ZWQgcmVnYXJkbGVzcyBvZiB0eXBlIG9mIHRoZSBlcnJvcgorY2F1c2luZyB0aGUgZmFpbHVyZS4gQnkgZGVmYXVsdCB0aGlzIG9wdGlvbiBpcyBzZXQgdG8gMCAoZmFsc2UpIGFuZCBpbiBjYXNlIG9mCitjZXJ0YWluICh1c3VhbGx5IHBlcm1hbmVudCkgZXJyb3JzIHRoZSByZWNvdmVyeSBpcyBub3QgYXR0ZW1wdGVkIGV2ZW4gd2hlbgorQHZhcnthdHRlbXB0X3JlY292ZXJ5fSBpcyBzZXQgdG8gMS4KKworQGl0ZW0gcmVzdGFydF93aXRoX2tleWZyYW1lIEB2YXJ7Ym9vbH0KK1NwZWNpZnkgd2hldGhlciB0byB3YWl0IGZvciB0aGUga2V5ZnJhbWUgYWZ0ZXIgcmVjb3ZlcmluZyBmcm9tCitxdWV1ZSBvdmVyZmxvdyBvciBmYWlsdXJlLiBUaGlzIG9wdGlvbiBpcyBzZXQgdG8gMCAoZmFsc2UpIGJ5IGRlZmF1bHQuCisKK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKKworQGl0ZW0KK1N0cmVhbSBzb21ldGhpbmcgdG8gcnRtcCBzZXJ2ZXIsIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlIHN0cmVhbSBhdCByZWFsLXRpbWUKK3JhdGUgZXZlbiBpbiBjYXNlIG9mIHRlbXBvcmFyeSBmYWlsdXJlIChuZXR3b3JrIG91dGFnZSkgYW5kIGF0dGVtcHQgdG8gcmVjb3Zlcgorc3RyZWFtaW5nIGV2ZXJ5IHNlY29uZCBpbmRlZmluaXRlbHkuCitAZXhhbXBsZQorZmZtcGVnIC1yZSAtaSAuLi4gLWM6diBsaWJ4MjY0IC1jOmEgYWFjIC1mIGZpZm8gLWZpZm9fZm9ybWF0IGZsdiAtbWFwIDA6diAtbWFwIDA6YQorICAtZHJvcF9wa3RzX29uX292ZXJmbG93IDEgLWF0dGVtcHRfcmVjb3ZlcnkgMSAtcmVjb3Zlcnlfd2FpdF90aW1lIDEgcnRtcDovL2V4YW1wbGUuY29tL2xpdmUvc3RyZWFtX25hbWUKK0BlbmQgZXhhbXBsZQorCitAZW5kIGl0ZW1pemUKKworQGFuY2hvcnt0ZWV9CiBAc2VjdGlvbiB0ZWUKIAogVGhlIHRlZSBtdXhlciBjYW4gYmUgdXNlZCB0byB3cml0ZSB0aGUgc2FtZSBkYXRhIHRvIHNldmVyYWwgZmlsZXMgb3IgYW55CkBAIC0xMjk5LDYgKzIwMzEsMTggQEAKIHVzZWZ1bCB3aGVuIHVzaW5nIHRoZSBsaWJhdmZvcm1hdCBBUEkgZGlyZWN0bHkgYmVjYXVzZSBpdCBpcyB0aGVuIHBvc3NpYmxlCiB0byBmZWVkIHRoZSBzYW1lIHBhY2tldHMgdG8gc2V2ZXJhbCBtdXhlcnMgZGlyZWN0bHkuCiAKK0B0YWJsZSBAb3B0aW9uCisKK0BpdGVtIHVzZV9maWZvIEB2YXJ7Ym9vbH0KK0lmIHNldCB0byAxLCBzbGF2ZSBvdXRwdXRzIHdpbGwgYmUgcHJvY2Vzc2VkIGluIHNlcGFyYXRlIHRocmVhZCB1c2luZyBAcmVme2ZpZm99CittdXhlci4gVGhpcyBhbGxvd3MgdG8gY29tcGVuc2F0ZSBmb3IgZGlmZmVyZW50IHNwZWVkL2xhdGVuY3kvcmVsaWFiaWxpdHkgb2YKK291dHB1dHMgYW5kIHNldHVwIHRyYW5zcGFyZW50IHJlY292ZXJ5LiBCeSBkZWZhdWx0IHRoaXMgZmVhdHVyZSBpcyB0dXJuZWQgb2ZmLgorCitAaXRlbSBmaWZvX29wdGlvbnMKK09wdGlvbnMgdG8gcGFzcyB0byBmaWZvIHBzZXVkby1tdXhlciBpbnN0YW5jZXMuIFNlZSBAcmVme2ZpZm99LgorCitAZW5kIHRhYmxlCisKIFRoZSBzbGF2ZSBvdXRwdXRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGZpbGUgbmFtZSBnaXZlbiB0byB0aGUgbXV4ZXIsCiBzZXBhcmF0ZWQgYnkgJ3wnLiBJZiBhbnkgb2YgdGhlIHNsYXZlIG5hbWUgY29udGFpbnMgdGhlICd8JyBzZXBhcmF0b3IsCiBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBvciBhbnkgc3BlY2lhbCBjaGFyYWN0ZXIsIGl0IG11c3QgYmUKQEAgLTEzMjAsNiArMjA2NCwxMyBAQAogU3BlY2lmeSBhIGxpc3Qgb2YgYml0c3RyZWFtIGZpbHRlcnMgdG8gYXBwbHkgdG8gdGhlIHNwZWNpZmllZAogb3V0cHV0LgogCitAaXRlbSB1c2VfZmlmbyBAdmFye2Jvb2x9CitUaGlzIGFsbG93cyB0byBvdmVycmlkZSB0ZWUgbXV4ZXIgdXNlX2ZpZm8gb3B0aW9uIGZvciBpbmRpdmlkdWFsIHNsYXZlIG11eGVyLgorCitAaXRlbSBmaWZvX29wdGlvbnMKK1RoaXMgYWxsb3dzIHRvIG92ZXJyaWRlIHRlZSBtdXhlciBmaWZvX29wdGlvbnMgZm9yIGluZGl2aWR1YWwgc2xhdmUgbXV4ZXIuCitTZWUgQHJlZntmaWZvfS4KKwogSXQgaXMgcG9zc2libGUgdG8gc3BlY2lmeSB0byB3aGljaCBzdHJlYW1zIGEgZ2l2ZW4gYml0c3RyZWFtIGZpbHRlcgogYXBwbGllcywgYnkgYXBwZW5kaW5nIGEgc3RyZWFtIHNwZWNpZmllciB0byB0aGUgb3B0aW9uIHNlcGFyYXRlZCBieQogQGNvZGV7L30uIEB2YXJ7c3BlY30gbXVzdCBiZSBhIHN0cmVhbSBzcGVjaWZpZXIgKHNlZSBAcmVme0Zvcm1hdApAQCAtMTMzMyw2ICsyMDg0LDEyIEBACiBzcGVjaWZpZWQgYnkgYSBzdHJlYW0gc3BlY2lmaWVyLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGlzIGRlZmF1bHRzIHRvCiBhbGwgdGhlIGlucHV0IHN0cmVhbXMuIFlvdSBtYXkgdXNlIG11bHRpcGxlIHN0cmVhbSBzcGVjaWZpZXJzCiBzZXBhcmF0ZWQgYnkgY29tbWFzIChAY29kZXssfSkgZS5nLjogQGNvZGV7YTowLHZ9CisKK0BpdGVtIG9uZmFpbAorU3BlY2lmeSBiZWhhdmlvdXIgb24gb3V0cHV0IGZhaWx1cmUuIFRoaXMgY2FuIGJlIHNldCB0byBlaXRoZXIgQGNvZGV7YWJvcnR9ICh3aGljaCBpcworZGVmYXVsdCkgb3IgQGNvZGV7aWdub3JlfS4gQGNvZGV7YWJvcnR9IHdpbGwgY2F1c2Ugd2hvbGUgcHJvY2VzcyB0byBmYWlsIGluIGNhc2Ugb2YgZmFpbHVyZQorb24gdGhpcyBzbGF2ZSBvdXRwdXQuIEBjb2Rle2lnbm9yZX0gd2lsbCBpZ25vcmUgZmFpbHVyZSBvbiB0aGlzIG91dHB1dCwgc28gb3RoZXIgb3V0cHV0cword2lsbCBjb250aW51ZSB3aXRob3V0IGJlaW5nIGFmZmVjdGVkLgogQGVuZCB0YWJsZQogCiBAc3Vic2VjdGlvbiBFeGFtcGxlcwpAQCAtMTM0Nyw2ICsyMTA0LDE0IEBACiBAZW5kIGV4YW1wbGUKIAogQGl0ZW0KK0FzIGFib3ZlLCBidXQgY29udGludWUgc3RyZWFtaW5nIGV2ZW4gaWYgb3V0cHV0IHRvIGxvY2FsIGZpbGUgZmFpbHMKKyhmb3IgZXhhbXBsZSBsb2NhbCBkcml2ZSBmaWxscyB1cCk6CitAZXhhbXBsZQorZmZtcGVnIC1pIC4uLiAtYzp2IGxpYngyNjQgLWM6YSBtcDIgLWYgdGVlIC1tYXAgMDp2IC1tYXAgMDphCisgICJbb25mYWlsPWlnbm9yZV1hcmNoaXZlLTIwMTIxMTA3Lm1rdnxbZj1tcGVndHNddWRwOi8vMTAuMC4xLjI1NToxMjM0LyIKK0BlbmQgZXhhbXBsZQorCitAaXRlbQogVXNlIEBjb21tYW5ke2ZmbXBlZ30gdG8gZW5jb2RlIHRoZSBpbnB1dCwgYW5kIHNlbmQgdGhlIG91dHB1dAogdG8gdGhyZWUgZGlmZmVyZW50IGRlc3RpbmF0aW9ucy4gVGhlIEBjb2Rle2R1bXBfZXh0cmF9IGJpdHN0cmVhbQogZmlsdGVyIGlzIHVzZWQgdG8gYWRkIGV4dHJhZGF0YSBpbmZvcm1hdGlvbiB0byBhbGwgdGhlIG91dHB1dCB2aWRlbwpAQCAtMTM1NCw3ICsyMTE5LDcgQEAKIG9wdGlvbiBpcyBhcHBsaWVkIHRvIEBmaWxle291dC5hYWN9IGluIG9yZGVyIHRvIG1ha2UgaXQgY29udGFpbiBvbmx5CiBhdWRpbyBwYWNrZXRzLgogQGV4YW1wbGUKLWZmbXBlZyAtaSAuLi4gLW1hcCAwIC1mbGFncyArZ2xvYmFsX2hlYWRlciAtYzp2IGxpYngyNjQgLWM6YSBhYWMgLXN0cmljdCBleHBlcmltZW50YWwKK2ZmbXBlZyAtaSAuLi4gLW1hcCAwIC1mbGFncyArZ2xvYmFsX2hlYWRlciAtYzp2IGxpYngyNjQgLWM6YSBhYWMKICAgICAgICAtZiB0ZWUgIltic2ZzL3Y9ZHVtcF9leHRyYV1vdXQudHN8W21vdmZsYWdzPStmYXN0c3RhcnRdb3V0Lm1wNHxbc2VsZWN0PWFdb3V0LmFhYyIKIEBlbmQgZXhhbXBsZQogCkBAIC0xMzYzLDcgKzIxMjgsNyBAQAogdGhhdCBhIHNlY29uZCBsZXZlbCBlc2NhcGluZyBtdXN0IGJlIHBlcmZvcm1lZCwgYXMgIjoiIGlzIGEgc3BlY2lhbAogY2hhcmFjdGVyIHVzZWQgdG8gc2VwYXJhdGUgb3B0aW9ucy4KIEBleGFtcGxlCi1mZm1wZWcgLWkgLi4uIC1tYXAgMCAtZmxhZ3MgK2dsb2JhbF9oZWFkZXIgLWM6diBsaWJ4MjY0IC1jOmEgYWFjIC1zdHJpY3QgZXhwZXJpbWVudGFsCitmZm1wZWcgLWkgLi4uIC1tYXAgMCAtZmxhZ3MgK2dsb2JhbF9oZWFkZXIgLWM6diBsaWJ4MjY0IC1jOmEgYWFjCiAgICAgICAgLWYgdGVlICJbYnNmcy92PWR1bXBfZXh0cmFdb3V0LnRzfFttb3ZmbGFncz0rZmFzdHN0YXJ0XW91dC5tcDR8W3NlbGVjdD1cJ2E6MVwnXW91dC5hYWMiCiBAZW5kIGV4YW1wbGUKIEBlbmQgaXRlbWl6ZQpkaWZmIC0tZ2l0IGEvZG9jL251dC50ZXhpIGIvZG9jL251dC50ZXhpCmluZGV4IGEwMmY4NmEuLmY5YjE4ZjUgMTAwNjQ0Ci0tLSBhL2RvYy9udXQudGV4aQorKysgYi9kb2MvbnV0LnRleGkKQEAgLTM0LDcgKzM0LDcgQEAKIAogVGhlIEJST0FEQ0FTVCB2YXJpYW50IHByb3ZpZGVzIGEgc2Vjb25kYXJ5IHRpbWUgcmVmZXJlbmNlIHRvIGZhY2lsaXRhdGUKIGRldGVjdGluZyBlbmRwb2ludCBsYXRlbmN5IGFuZCBuZXR3b3JrIGRlbGF5cy4KLUl0IGFzc3VtZXMgYWxsIHRoZSBlbmRwb2ludCBjbG9ja3MgYXJlIHN5bmNyb25pemVkLgorSXQgYXNzdW1lcyBhbGwgdGhlIGVuZHBvaW50IGNsb2NrcyBhcmUgc3luY2hyb25pemVkLgogVG8gYmUgdXNlZCBpbiByZWFsLXRpbWUgc2NlbmFyaW9zLgogCiBAc2VjdGlvbiBQSVBFCmRpZmYgLS1naXQgYS9kb2Mvb3B0aW1pemF0aW9uLnR4dCBiL2RvYy9vcHRpbWl6YXRpb24udHh0CmluZGV4IDFhMGI5OGMuLjk3NGUyZjkgMTAwNjQ0Ci0tLSBhL2RvYy9vcHRpbWl6YXRpb24udHh0CisrKyBiL2RvYy9vcHRpbWl6YXRpb24udHh0CkBAIC03LDcgKzcsNyBAQAogdGhlbiB0YWtlIGEgbG9vayBpbiB0aGUgeDg2LyBkaXJlY3RvcnksIGFzIG1vc3QgaW1wb3J0YW50IGZ1bmN0aW9ucyBhcmUKIGFscmVhZHkgb3B0aW1pemVkIGZvciBNTVguCiAKLUlmIHlvdSB3YW50IHRvIGRvIHg4NiBvcHRpbWl6YXRpb25zIHRoZW4geW91IGNhbiBlaXRoZXIgdHJ5IHRvIGZpbmV0dW5lIHRoZQorSWYgeW91IHdhbnQgdG8gZG8geDg2IG9wdGltaXphdGlvbnMgdGhlbiB5b3UgY2FuIGVpdGhlciB0cnkgdG8gZmluZS10dW5lIHRoZQogc3R1ZmYgaW4gdGhlIHg4NiBkaXJlY3Rvcnkgb3IgZmluZCBzb21lIG90aGVyIGZ1bmN0aW9ucyBpbiB0aGUgQyBzb3VyY2UgdG8KIG9wdGltaXplLCBidXQgdGhlcmUgYXJlbid0IG1hbnkgbGVmdC4KIApAQCAtMTQyLDcgKzE0Miw3IEBACiBTb21lIGluc3RydWN0aW9ucyBvbiBzb21lIGFyY2hpdGVjdHVyZXMgaGF2ZSBzdHJpY3QgYWxpZ25tZW50IHJlc3RyaWN0aW9ucywKIGZvciBleGFtcGxlIG1vc3QgU1NFL1NTRTIgaW5zdHJ1Y3Rpb25zIG9uIHg4Ni4KIFRoZSBtaW5pbXVtIGd1YXJhbnRlZWQgYWxpZ25tZW50IGlzIHdyaXR0ZW4gaW4gdGhlIC5oIGZpbGVzLCBmb3IgZXhhbXBsZToKLSAgICB2b2lkICgqcHV0X3BpeGVsc19jbGFtcGVkKShjb25zdCBpbnQxNl90ICpibG9jay8qYWxpZ24gMTYqLywgVUlOVDggKnBpeGVscy8qYWxpZ24gOCovLCBpbnQgbGluZV9zaXplKTsKKyAgICB2b2lkICgqcHV0X3BpeGVsc19jbGFtcGVkKShjb25zdCBpbnQxNl90ICpibG9jay8qYWxpZ24gMTYqLywgdWludDhfdCAqcGl4ZWxzLyphbGlnbiA4Ki8sIHB0cmRpZmZfdCBzdHJpZGUpOwogCiAKIEdlbmVyYWwgVGlwczoKQEAgLTE2MSw5ICsxNjEsOSBAQAogRm9yIHg4NiwgbWFyayByZWdpc3RlcnMgdGhhdCBhcmUgY2xvYmJlcmVkIGluIHlvdXIgYXNtLiBUaGlzIG1lYW5zIGJvdGgKIGdlbmVyYWwgeDg2IHJlZ2lzdGVycyAoZS5nLiBlYXgpIGFzIHdlbGwgYXMgWE1NIHJlZ2lzdGVycy4gVGhpcyBsYXN0IG9uZSBpcwogcGFydGljdWxhcmx5IGltcG9ydGFudCBvbiBXaW42NCwgd2hlcmUgeG1tNi0xNSBhcmUgY2FsbGVlLXNhdmUsIGFuZCBub3QKLXJlc3RvcmluZyB0aGVpciBjb250ZW50cyBsZWFkcyB0byB1bmRlZmluZWQgcmVzdWx0cy4gSW4gZXh0ZXJuYWwgYXNtIChlLmcuCi15YXNtKSwgeW91IGRvIHRoaXMgYnkgdXNpbmc6Ci1jZ2xvYmFsIGZ1bmN0b25fbmFtZSwgbnVtX2FyZ3MsIG51bV9yZWdzLCBudW1feG1tX3JlZ3MKK3Jlc3RvcmluZyB0aGVpciBjb250ZW50cyBsZWFkcyB0byB1bmRlZmluZWQgcmVzdWx0cy4gSW4gZXh0ZXJuYWwgYXNtLAoreW91IGRvIHRoaXMgYnkgdXNpbmc6CitjZ2xvYmFsIGZ1bmN0aW9uX25hbWUsIG51bV9hcmdzLCBudW1fcmVncywgbnVtX3htbV9yZWdzCiBJbiBpbmxpbmUgYXNtLCB5b3Ugc3BlY2lmeSBjbG9iYmVyZWQgcmVnaXN0ZXJzIGF0IHRoZSBlbmQgb2YgeW91ciBhc206CiBfX2FzbV9fKCIuLiIgOjo6ICIlZWF4IikuCiBJZiBnY2MgaXMgbm90IHNldCB0byBzdXBwb3J0IHNzZSAoLW1zc2UpIGl0IHdpbGwgbm90IGFjY2VwdCB4bW0gcmVnaXN0ZXJzCkBAIC0xOTksMTIgKzE5OSwxMiBAQAogSW5saW5lIGFzbSB2cy4gZXh0ZXJuYWwgYXNtCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIEJvdGggaW5saW5lIGFzbSAoX19hc21fXygiLi4iKSBpbiBhIC5jIGZpbGUsIGhhbmRsZWQgYnkgYSBjb21waWxlciBzdWNoIGFzIGdjYykKLWFuZCBleHRlcm5hbCBhc20gKC5zIG9yIC5hc20gZmlsZXMsIGhhbmRsZWQgYnkgYW4gYXNzZW1ibGVyIHN1Y2ggYXMgeWFzbS9uYXNtKQorYW5kIGV4dGVybmFsIGFzbSAoLnMgb3IgLmFzbSBmaWxlcywgaGFuZGxlZCBieSBhbiBhc3NlbWJsZXIgc3VjaCBhcyBuYXNtL3lhc20pCiBhcmUgYWNjZXB0ZWQgaW4gRkZtcGVnLiBXaGljaCBvbmUgdG8gdXNlIGRpZmZlcnMgcGVyIHNwZWNpZmljIGNhc2UuCiAKIC0gaWYgeW91ciBjb2RlIGlzIGludGVuZGVkIHRvIGJlIGlubGluZWQgaW4gYSBDIGZ1bmN0aW9uLCBpbmxpbmUgYXNtIGlzIGFsd2F5cwogICAgYmV0dGVyLCBiZWNhdXNlIGV4dGVybmFsIGFzbSBjYW5ub3QgYmUgaW5saW5lZAotLSBpZiB5b3VyIGNvZGUgY2FsbHMgZXh0ZXJuYWwgZnVuY3Rpb25zLCB5YXNtIGlzIGFsd2F5cyBiZXR0ZXIKKy0gaWYgeW91ciBjb2RlIGNhbGxzIGV4dGVybmFsIGZ1bmN0aW9ucywgZXh0ZXJuYWwgYXNtIGlzIGFsd2F5cyBiZXR0ZXIKIC0gaWYgeW91ciBjb2RlIHRha2VzIGh1Z2UgYW5kIGNvbXBsZXggc3RydWN0cyBhcyBmdW5jdGlvbiBhcmd1bWVudHMgKGUuZy4KICAgIE1wZWdFbmNDb250ZXh0OyBub3RlIHRoYXQgdGhpcyBpcyBub3QgaWRlYWwgYW5kIGlzIGRpc2NvdXJhZ2VkIGlmIHRoZXJlCiAgICBhcmUgYWx0ZXJuYXRpdmVzKSwgdGhlbiBpbmxpbmUgYXNtIGlzIGFsd2F5cyBiZXR0ZXIsIGJlY2F1c2UgcHJlZGljdGluZwpkaWZmIC0tZ2l0IGEvZG9jL291dGRldnMudGV4aSBiL2RvYy9vdXRkZXZzLnRleGkKaW5kZXggZTY4NjUzZi4uZGFmN2IxYSAxMDA2NDQKLS0tIGEvZG9jL291dGRldnMudGV4aQorKysgYi9kb2Mvb3V0ZGV2cy50ZXhpCkBAIC0xMDQsNyArMTA0LDcgQEAKIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBzaG93cyB0aGUgQGNvbW1hbmR7ZmZtcGVnfSBvdXRwdXQgaXMgYW4KIENBQ0Egd2luZG93LCBmb3JjaW5nIGl0cyBzaXplIHRvIDgweDI1OgogQGV4YW1wbGUKLWZmbXBlZyAtaSBJTlBVVCAtdmNvZGVjIHJhd3ZpZGVvIC1waXhfZm10IHJnYjI0IC13aW5kb3dfc2l6ZSA4MHgyNSAtZiBjYWNhIC0KK2ZmbXBlZyAtaSBJTlBVVCAtYzp2IHJhd3ZpZGVvIC1waXhfZm10IHJnYjI0IC13aW5kb3dfc2l6ZSA4MHgyNSAtZiBjYWNhIC0KIEBlbmQgZXhhbXBsZQogCiBAaXRlbQpAQCAtMTMxLDggKzEzMSw4IEBACiBPbiBXaW5kb3dzLCB5b3UgbmVlZCB0byBydW4gdGhlIElETCBmaWxlcyB0aHJvdWdoIEBjb21tYW5ke3dpZGx9LgogCiBEZWNrTGluayBpcyB2ZXJ5IHBpY2t5IGFib3V0IHRoZSBmb3JtYXRzIGl0IHN1cHBvcnRzLiBQaXhlbCBmb3JtYXQgaXMgYWx3YXlzCi11eXZ5NDIyLCBmcmFtZXJhdGUgYW5kIHZpZGVvIHNpemUgbXVzdCBiZSBkZXRlcm1pbmVkIGZvciB5b3VyIGRldmljZSB3aXRoCi1AY29tbWFuZHstbGlzdF9mb3JtYXRzIDF9LiBBdWRpbyBzYW1wbGUgcmF0ZSBpcyBhbHdheXMgNDgga0h6LgordXl2eTQyMiwgZnJhbWVyYXRlLCBmaWVsZCBvcmRlciBhbmQgdmlkZW8gc2l6ZSBtdXN0IGJlIGRldGVybWluZWQgZm9yIHlvdXIKK2RldmljZSB3aXRoIEBjb21tYW5key1saXN0X2Zvcm1hdHMgMX0uIEF1ZGlvIHNhbXBsZSByYXRlIGlzIGFsd2F5cyA0OCBrSHouCiAKIEBzdWJzZWN0aW9uIE9wdGlvbnMKIApAQCAtMTgyLDYgKzE4Miw1MSBAQAogCiBAZW5kIGl0ZW1pemUKIAorQHNlY3Rpb24gbGlibmRpX25ld3RlaworCitUaGUgbGlibmRpX25ld3RlayBvdXRwdXQgZGV2aWNlIHByb3ZpZGVzIHBsYXliYWNrIGNhcGFiaWxpdGllcyBmb3IgdXNpbmcgTkRJIChOZXR3b3JrCitEZXZpY2UgSW50ZXJmYWNlLCBzdGFuZGFyZCBjcmVhdGVkIGJ5IE5ld1RlaykuCisKK091dHB1dCBmaWxlbmFtZSBpcyBhIE5ESSBuYW1lLgorCitUbyBlbmFibGUgdGhpcyBvdXRwdXQgZGV2aWNlLCB5b3UgbmVlZCB0aGUgTkRJIFNESyBhbmQgeW91CituZWVkIHRvIGNvbmZpZ3VyZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSBAY29kZXstLWV4dHJhLWNmbGFnc30KK2FuZCBAY29kZXstLWV4dHJhLWxkZmxhZ3N9LgorCitOREkgdXNlcyB1eXZ5NDIyIHBpeGVsIGZvcm1hdCBuYXRpdmVseSwgYnV0IGFsc28gc3VwcG9ydHMgYmdyYSwgYmdyMCwgcmdiYSBhbmQKK3JnYjAuCisKK0BzdWJzZWN0aW9uIE9wdGlvbnMKKworQHRhYmxlIEBvcHRpb24KKworQGl0ZW0gcmVmZXJlbmNlX2xldmVsCitUaGUgYXVkaW8gcmVmZXJlbmNlIGxldmVsIGluIGRCLiBUaGlzIHNwZWNpZmllcyBob3cgbWFueSBkQiBhYm92ZSB0aGUKK3JlZmVyZW5jZSBsZXZlbCAoKzRkQlUpIGlzIHRoZSBmdWxsIHJhbmdlIG9mIDE2IGJpdCBhdWRpby4KK0RlZmF1bHRzIHRvIEBvcHRpb257MH0uCisKK0BpdGVtIGNsb2NrX3ZpZGVvCitUaGVzZSBzcGVjaWZ5IHdoZXRoZXIgdmlkZW8gImNsb2NrIiB0aGVtc2VsdmVzLgorRGVmYXVsdHMgdG8gQG9wdGlvbntmYWxzZX0uCisKK0BpdGVtIGNsb2NrX2F1ZGlvCitUaGVzZSBzcGVjaWZ5IHdoZXRoZXIgYXVkaW8gImNsb2NrIiB0aGVtc2VsdmVzLgorRGVmYXVsdHMgdG8gQG9wdGlvbntmYWxzZX0uCisKK0BlbmQgdGFibGUKKworQHN1YnNlY3Rpb24gRXhhbXBsZXMKKworQGl0ZW1pemUKKworQGl0ZW0KK1BsYXkgdmlkZW8gY2xpcDoKK0BleGFtcGxlCitmZm1wZWcgLWkgInVkcDovL0BAMjM5LjEuMS4xOjEwNDgwP2ZpZm9fc2l6ZT0xMDAwMDAwJm92ZXJydW5fbm9uZmF0YWw9MSIgLXZmICJzY2FsZT03MjA6NTc2LGZwcz1mcHM9MjUsc2V0ZGFyPWRhcj0xNi85LGZvcm1hdD1waXhfZm10cz11eXZ5NDIyIiAtZiBsaWJuZGlfbmV3dGVrIE5FV19OREkxCitAZW5kIGV4YW1wbGUKKworQGVuZCBpdGVtaXplCisKIEBzZWN0aW9uIGZiZGV2CiAKIExpbnV4IGZyYW1lYnVmZmVyIG91dHB1dCBkZXZpY2UuCkBAIC0yMDYsNyArMjUxLDcgQEAKIFBsYXkgYSBmaWxlIG9uIGZyYW1lYnVmZmVyIGRldmljZSBAZmlsZXsvZGV2L2ZiMH0uCiBSZXF1aXJlZCBwaXhlbCBmb3JtYXQgZGVwZW5kcyBvbiBjdXJyZW50IGZyYW1lYnVmZmVyIHNldHRpbmdzLgogQGV4YW1wbGUKLWZmbXBlZyAtcmUgLWkgSU5QVVQgLXZjb2RlYyByYXd2aWRlbyAtcGl4X2ZtdCBiZ3JhIC1mIGZiZGV2IC9kZXYvZmIwCitmZm1wZWcgLXJlIC1pIElOUFVUIC1jOnYgcmF3dmlkZW8gLXBpeF9mbXQgYmdyYSAtZiBmYmRldiAvZGV2L2ZiMAogQGVuZCBleGFtcGxlCiAKIFNlZSBhbHNvIEB1cmx7aHR0cDovL2xpbnV4LWZiZGV2LnNvdXJjZWZvcmdlLm5ldC99LCBhbmQgZmJzZXQoMSkuCkBAIC0zNjgsNyArNDEzLDcgQEAKIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBzaG93cyB0aGUgQGNvbW1hbmR7ZmZtcGVnfSBvdXRwdXQgaXMgYW4KIFNETCB3aW5kb3csIGZvcmNpbmcgaXRzIHNpemUgdG8gdGhlIHFjaWYgZm9ybWF0OgogQGV4YW1wbGUKLWZmbXBlZyAtaSBJTlBVVCAtdmNvZGVjIHJhd3ZpZGVvIC1waXhfZm10IHl1djQyMHAgLXdpbmRvd19zaXplIHFjaWYgLWYgc2RsICJTREwgb3V0cHV0IgorZmZtcGVnIC1pIElOUFVUIC1jOnYgcmF3dmlkZW8gLXBpeF9mbXQgeXV2NDIwcCAtd2luZG93X3NpemUgcWNpZiAtZiBzZGwgIlNETCBvdXRwdXQiCiBAZW5kIGV4YW1wbGUKIAogQHNlY3Rpb24gc25kaW8KZGlmZiAtLWdpdCBhL2RvYy9wYXRjaHdvcmsgYi9kb2MvcGF0Y2h3b3JrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjk0Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvcGF0Y2h3b3JrCkBAIC0wLDAgKzEsMTAgQEAKK1BhdGNod29yayBzdGF0ZXMKKworTkVXOiAgICAgICAgICAgICAgIEluaXRpYWwgc3RhdGUgb2YgbmV3IHBhdGNoZXMKK0FjY2VwdGVkOiAgICAgICAgICBUaGUgcGF0Y2ggd2FzIHB1c2hlZCB0byB0aGUgbWFpbiBtYXN0ZXIgcmVwb3NpdG9yeQorUmVqZWN0ZWQ6ICAgICAgICAgIFRoZSBwYXRjaCBoYXMgYmVlbiByZWplY3RlZAorV2l0aGRyYXduOiAgICAgICAgIFRoZSBwYXRjaCB3YXMgd2l0aGRyYXduIGJ5IHRoZSBhdXRob3IKK05vdCBBcHBsaWNhYmxlOiAgICBUaGUgcGF0Y2ggZG9lcyBub3QgYXBwbHkgdG8gdGhlIG1haW4gbWFzdGVyIHJlcG9zaXRvcnkKK1N1cGVyc2VkZWQ6ICAgICAgICBBIG5ld2VyIHZlcnNpb24gb2YgdGhlIHBhdGNoIGhhcyBiZWVuIHBvc3RlZAorQ2hhbmdlcyBSZXF1ZXN0ZWQ6IFRoZSBwYXRjaCBoYXMgYmVlbiBvciBpcyB1bmRlciByZXZpZXcgYW5kIGNoYW5nZXMgaGF2ZSBiZWVuIHJlcXVlc3RlZAorUkZDOiAgICAgICAgICAgICAgIFRoZSBwYXRjaCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgYXBwbGllZCBidXQgb25seSBmb3IgY29tbWVudHMKZGlmZiAtLWdpdCBhL2RvYy9wbGF0Zm9ybS50ZXhpIGIvZG9jL3BsYXRmb3JtLnRleGkKaW5kZXggZjdlZTQ1Ni4uYmRmYjZmZCAxMDA2NDQKLS0tIGEvZG9jL3BsYXRmb3JtLnRleGkKKysrIGIvZG9jL3BsYXRmb3JtLnRleGkKQEAgLTYzLDcgKzYzLDcgQEAKIEBzZWN0aW9uIERhcndpbiAoTWFjIE9TIFgsIGlQaG9uZSkKIAogVGhlIHRvb2xjaGFpbiBwcm92aWRlZCB3aXRoIFhjb2RlIGlzIHN1ZmZpY2llbnQgdG8gYnVpbGQgdGhlIGJhc2ljCi11bmFjZWxlcmF0ZWQgY29kZS4KK3VuYWNjZWxlcmF0ZWQgY29kZS4KIAogTWFjIE9TIFggb24gUG93ZXJQQyBvciBBUk0gKGlQaG9uZSkgcmVxdWlyZXMgYSBwcmVwcm9jZXNzb3IgZnJvbQogQHVybHtodHRwczovL2dpdGh1Yi5jb20vRkZtcGVnL2dhcy1wcmVwcm9jZXNzb3J9IG9yCkBAIC03MSw5ICs3MSw5IEBACiBhc3NlbWJseSBmdW5jdGlvbnMuIFB1dCB0aGUgUGVybCBzY3JpcHQgc29tZXdoZXJlCiBpbiB5b3VyIFBBVEgsIEZGbXBlZydzIGNvbmZpZ3VyZSB3aWxsIHBpY2sgaXQgdXAgYXV0b21hdGljYWxseS4KIAotTWFjIE9TIFggb24gYW1kNjQgYW5kIHg4NiByZXF1aXJlcyBAY29tbWFuZHt5YXNtfSB0byBidWlsZCBtb3N0IG9mIHRoZQorTWFjIE9TIFggb24gYW1kNjQgYW5kIHg4NiByZXF1aXJlcyBAY29tbWFuZHtuYXNtfSB0byBidWlsZCBtb3N0IG9mIHRoZQogb3B0aW1pemVkIGFzc2VtYmx5IGZ1bmN0aW9ucy4gQHVyZWZ7aHR0cDovL3d3dy5maW5rcHJvamVjdC5vcmcvLCBGaW5rfSwKLUB1cmVme2h0dHA6Ly93d3cuZ2VudG9vLm9yZy9wcm9qL2VuL2dlbnRvby1hbHQvcHJlZml4L2Jvb3RzdHJhcC1tYWNvcy54bWwsIEdlbnRvbyBQcmVmaXh9LAorQHVyZWZ7aHR0cHM6Ly93aWtpLmdlbnRvby5vcmcvd2lraS9Qcm9qZWN0OlByZWZpeCwgR2VudG9vIFByZWZpeH0sCiBAdXJlZntodHRwczovL214Y2wuZ2l0aHViLmNvbS9ob21lYnJldy8sIEhvbWVicmV3fQogb3IgQHVyZWZ7aHR0cDovL3d3dy5tYWNwb3J0cy5vcmcsIE1hY1BvcnRzfSBjYW4gZWFzaWx5IHByb3ZpZGUgaXQuCiAKQEAgLTE0MSwxMCArMTQxLDEwIEBACiBwYWNtYW4gLVMgbWFrZSBwa2djb25mIGRpZmZ1dGlscwogCiAjIG1pbmd3LXc2NCBwYWNrYWdlcyBhbmQgdG9vbGNoYWlucwotcGFjbWFuIC1TIG1pbmd3LXc2NC14ODZfNjQteWFzbSBtaW5ndy13NjQteDg2XzY0LWdjYyBtaW5ndy13NjQteDg2XzY0LVNETAorcGFjbWFuIC1TIG1pbmd3LXc2NC14ODZfNjQtbmFzbSBtaW5ndy13NjQteDg2XzY0LWdjYyBtaW5ndy13NjQteDg2XzY0LVNETDIKIEBlbmQgZXhhbXBsZQogCi1UbyB0YXJnZXQgMzJiaXQgcmVwbGFjZSB0aGUgQGNvZGV7eDg2XzY0fSB3aXRoIEBjb2Rle2k2ODZ9IGluIHRoZSBjb21tYW5kIGFib3ZlLgorVG8gdGFyZ2V0IDMyIGJpdHMgcmVwbGFjZSBAY29kZXt4ODZfNjR9IHdpdGggQGNvZGV7aTY4Nn0gaW4gdGhlIGNvbW1hbmQgYWJvdmUuCiAKIEBzZWN0aW9uIE1pY3Jvc29mdCBWaXN1YWwgQysrIG9yIEludGVsIEMrKyBDb21waWxlciBmb3IgV2luZG93cwogCkBAIC0xNTksNyArMTU5LDcgQEAKIEBpdGVtIEB1cmVme2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9tc2ludHR5cGVzLywgbXNpbnR0eXBlc30KIChpZiB1c2luZyBNU1ZDIDIwMTIgb3IgZWFybGllcikKIEBpdGVtIEB1cmVme2h0dHA6Ly9tc3lzMi5naXRodWIuaW8vLCBNU1lTMn0KLUBpdGVtIEB1cmVme2h0dHA6Ly95YXNtLnRvcnRhbGwubmV0LywgWUFTTX0KK0BpdGVtIEB1cmVme2h0dHA6Ly93d3cubmFzbS51cy8sIE5BU019CiAoQWxzbyBhdmFpbGFibGUgdmlhIE1TWVMyJ3MgcGFja2FnZSBtYW5hZ2VyLikKIEBlbmQgaXRlbWl6ZQogCkBAIC0xNzMsNyArMTczLDcgQEAKIE5leHQsIG1ha2Ugc3VyZSBhbnkgb3RoZXIgaGVhZGVycyBhbmQgbGlicyB5b3Ugd2FudCB0byB1c2UsIHN1Y2ggYXMgemxpYiwgYXJlCiBsb2NhdGVkIGluIGEgc3BvdCB0aGF0IHRoZSBjb21waWxlciBjYW4gc2VlLiBEbyBzbyBieSBtb2RpZnlpbmcgdGhlIEBjb2Rle0xJQn0KIGFuZCBAY29kZXtJTkNMVURFfSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gaW5jbHVkZSB0aGUgQHN0cm9uZ3tXaW5kb3dzLXN0eWxlfQotcGF0aHMgdG8gdGhlc2UgZGlyZWN0b3JpZXMuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gdHJ5IGFuZCB1c2UgdGhlCitwYXRocyB0byB0aGVzZSBkaXJlY3Rvcmllcy4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiB0cnkgdG8gdXNlIHRoZQogQGNvZGV7LS1leHRyYS1jZmxhZ3N9L0Bjb2Rley0tZXh0cmEtbGRmbGFnc30gY29uZmlndXJlIG9wdGlvbnMuIElmIHVzaW5nIE1TVkMKIDIwMTIgb3IgZWFybGllciwgcGxhY2UgQGNvZGV7aW50dHlwZXMuaH0gc29tZXdoZXJlIHRoZSBjb21waWxlciBjYW4gc2VlIHRvby4KIApAQCAtMzE0LDggKzMxNCw4IEBACiBAdXJlZntodHRwOi8vc291cmNld2FyZS5vcmcvY3lnd2lucG9ydHMvLCBDeWd3aW4gUG9ydHN9OgogCiBAZXhhbXBsZQoteWFzbSwgbGliU0RMLWRldmVsLCBsaWJmYWFjLWRldmVsLCBsaWJnc20tZGV2ZWwsIGxpYm1wM2xhbWUtZGV2ZWwsCi1saWJzY2hyb2VkaW5nZXIxLjAtZGV2ZWwsIHNwZWV4LWRldmVsLCBsaWJ0aGVvcmEtZGV2ZWwsIGxpYnh2aWRjb3JlLWRldmVsCit5YXNtLCBsaWJTREwtZGV2ZWwsIGxpYmdzbS1kZXZlbCwgbGlibXAzbGFtZS1kZXZlbCwKK3NwZWV4LWRldmVsLCBsaWJ0aGVvcmEtZGV2ZWwsIGxpYnh2aWRjb3JlLWRldmVsCiBAZW5kIGV4YW1wbGUKIAogVGhlIHJlY29tbWVuZGF0aW9uIGZvciB4MjY0IGlzIHRvIGJ1aWxkIGl0IGZyb20gc291cmNlLCBhcyBpdCBldm9sdmVzIHRvbwpAQCAtMzQzLDY3ICszNDMsNCBAQAogLi9jb25maWd1cmUgLS10YXJnZXQtb3M9bWluZ3czMiAtLWVuYWJsZS1zaGFyZWQgLS1kaXNhYmxlLXN0YXRpYyAtLWV4dHJhLWNmbGFncz0tbW5vLWN5Z3dpbiAtLWV4dHJhLWxpYnM9LW1uby1jeWd3aW4KIEBlbmQgZXhhbXBsZQogCi1AY2hhcHRlciBQbGFuIDkKLQotVGhlIG5hdGl2ZSBAdXJlZntodHRwOi8vcGxhbjkuYmVsbC1sYWJzLmNvbS9wbGFuOS8sIFBsYW4gOX0gY29tcGlsZXIKLWRvZXMgbm90IGltcGxlbWVudCBhbGwgdGhlIEM5OSBmZWF0dXJlcyBuZWVkZWQgYnkgRkZtcGVnIHNvIHRoZSBnY2MKLXBvcnQgbXVzdCBiZSB1c2VkLiAgRnVydGhlcm1vcmUsIGEgZmV3IGl0ZW1zIG1pc3NpbmcgZnJvbSB0aGUgQwotbGlicmFyeSBhbmQgc2hlbGwgZW52aXJvbm1lbnQgbmVlZCB0byBiZSBmaXhlZC4KLQotQGl0ZW1pemUKLQotQGl0ZW0gR05VIGF3aywgZ3JlcCwgbWFrZSwgYW5kIHNlZAotCi1Xb3JraW5nIHBhY2thZ2VzIG9mIHRoZXNlIHRvb2xzIGNhbiBiZSBmb3VuZCBhdAotQHVyZWZ7aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3BvcnRzMnBsYW45L2Rvd25sb2Fkcy9saXN0LCBwb3J0czJwbGFuOX0uCi1UaGV5IGNhbiBiZSBpbnN0YWxsZWQgd2l0aCBAdXJlZntodHRwOi8vOWZyb250Lm9yZy8sIDlmcm9udCdzfSBAY29kZXtwa2d9Ci11dGlsaXR5IGJ5IHNldHRpbmcgQGNvZGV7cGtncGF0aH0gdG8KLUBjb2Rle2h0dHA6Ly9wb3J0czJwbGFuOS5nb29nbGVjb2RlLmNvbS9maWxlcy99LgotCi1AaXRlbSBNaXNzaW5nL2Jyb2tlbiBAY29kZXtoZWFkfSBhbmQgQGNvZGV7cHJpbnRmfSBjb21tYW5kcwotCi1SZXBsYWNlbWVudHMgYWRlcXVhdGUgZm9yIGJ1aWxkaW5nIEZGbXBlZyBjYW4gYmUgZm91bmQgaW4gdGhlCi1AY29kZXtjb21wYXQvcGxhbjl9IGRpcmVjdG9yeS4gIFBsYWNlIHRoZXNlIHNvbWV3aGVyZSB0aGV5IHdpbGwgYmUKLWZvdW5kIGJ5IHRoZSBzaGVsbC4gIFRoZXNlIGFyZSBub3QgZnVsbCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCi1jb21tYW5kcyBhbmQgYXJlIEBlbXBoe25vdH0gc3VpdGFibGUgZm9yIGdlbmVyYWwgdXNlLgotCi1AaXRlbSBNaXNzaW5nIEM5OSBAY29kZXtzdGRpbnQuaH0gYW5kIEBjb2Rle2ludHR5cGVzLmh9Ci0KLVJlcGxhY2VtZW50IGhlYWRlcnMgYXJlIGF2YWlsYWJsZSBmcm9tCi1AdXJse2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wbGFuOWZyb250L2lzc3Vlcy9kZXRhaWw/aWQ9MTUyfS4KLQotQGl0ZW0gTWlzc2luZyBvciBub24tc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMKLQotU29tZSBmdW5jdGlvbnMgaW4gdGhlIEMgbGlicmFyeSBhcmUgbWlzc2luZyBvciBpbmNvbXBsZXRlLiAgVGhlCi1AY29kZXtAdXJlZntodHRwOi8vcG9ydHMycGxhbjkuZ29vZ2xlY29kZS5jb20vZmlsZXMvZ2NjLWFwZWxpYnMtMTIwNy50YnosCi1nY2MtYXBlbGlicy0xMjA3fX0gcGFja2FnZSBmcm9tCi1AdXJlZntodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcG9ydHMycGxhbjkvZG93bmxvYWRzL2xpc3QsIHBvcnRzMnBsYW45fQotaW5jbHVkZXMgYW4gdXBkYXRlZCBDIGxpYnJhcnksIGJ1dCBpbnN0YWxsaW5nIHRoZSBmdWxsIHBhY2thZ2UgZ2l2ZXMKLXVudXNhYmxlIGV4ZWN1dGFibGVzLiAgSW5zdGVhZCwga2VlcCB0aGUgZmlsZXMgZnJvbSBAY29kZXtnY2NiaW4udGd6fQotdW5kZXIgQGNvZGV7LzM4Ni9saWIvZ251fS4gIEZyb20gdGhlIEBjb2Rle2xpYmMuYX0gYXJjaGl2ZSBpbiB0aGUKLUBjb2Rle2djYy1hcGVsaWJzLTEyMDd9IHBhY2thZ2UsIGV4dHJhY3QgdGhlIGZvbGxvd2luZyBvYmplY3QgZmlsZXMgYW5kCi10dXJuIHRoZW0gaW50byBhIGxpYnJhcnk6Ci0KLUBpdGVtaXplCi1AaXRlbSBAY29kZXtzdHJlcnJvci5vfQotQGl0ZW0gQGNvZGV7c3RydG9sbC5vfQotQGl0ZW0gQGNvZGV7c25wcmludGYub30KLUBpdGVtIEBjb2Rle3ZzbnByaW50Zi5vfQotQGl0ZW0gQGNvZGV7dmZwcmludGYub30KLUBpdGVtIEBjb2Rle19JT19nZXRjLm99Ci1AaXRlbSBAY29kZXtfSU9fcHV0Yy5vfQotQGVuZCBpdGVtaXplCi0KLVVzZSB0aGUgQGNvZGV7LS1leHRyYS1saWJzfSBvcHRpb24gb2YgQGNvZGV7Y29uZmlndXJlfSB0byBpbmZvcm0gdGhlCi1idWlsZCBzeXN0ZW0gb2YgdGhpcyBsaWJyYXJ5LgotCi1AaXRlbSBGUFUgZXhjZXB0aW9ucyBlbmFibGVkIGJ5IGRlZmF1bHQKLQotVW5saWtlIG1vc3Qgb3RoZXIgc3lzdGVtcywgUGxhbiA5IGVuYWJsZXMgRlBVIGV4Y2VwdGlvbnMgYnkgZGVmYXVsdC4KLVRoZXNlIG11c3QgYmUgZGlzYWJsZWQgYmVmb3JlIGNhbGxpbmcgYW55IEZGbXBlZyBmdW5jdGlvbnMuICBXaGlsZSB0aGUKLWluY2x1ZGVkIHRvb2xzIHdpbGwgZG8gdGhpcyBhdXRvbWF0aWNhbGx5LCBvdGhlciB1c2VycyBvZiB0aGUKLWxpYnJhcmllcyBtdXN0IGRvIGl0IHRoZW1zZWx2ZXMuCi0KLUBlbmQgaXRlbWl6ZQotCiBAYnllCmRpZmYgLS1naXQgYS9kb2MvcHJpbnRfb3B0aW9ucy5jIGIvZG9jL3ByaW50X29wdGlvbnMuYwppbmRleCA5ZmQ2NmNhLi5mZDFjZjEwIDEwMDY0NAotLS0gYS9kb2MvcHJpbnRfb3B0aW9ucy5jCisrKyBiL2RvYy9wcmludF9vcHRpb25zLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxmbG9hdC5oPgogCkBAIC0zMCwxMiArMzEsMTcgQEAKIC8vIGZvciB0aGUgdGFyZ2V0LiB3aXRob3V0IHRoaXMgYnVpbGQgYnJlYWtzIG9uIG1pbmd3CiAjZGVmaW5lIEFWRk9STUFUX09TX1NVUFBPUlRfSAogCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9vcHRpb25zX3RhYmxlLmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9vcHRpb25zX3RhYmxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAKKy8qIEZvcmNpYmx5IHR1cm4gb2ZmIGRlcHJlY2F0aW9uIHdhcm5pbmdzLCB3aGljaCBqdXN0IGFkZCBub2lzZSBoZXJlLiAqLworI3VuZGVmIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisjZGVmaW5lIGF0dHJpYnV0ZV9kZXByZWNhdGVkCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL29wdGlvbnNfdGFibGUuaCIKKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L29wdGlvbnNfdGFibGUuaCIKKwogc3RhdGljIHZvaWQgcHJpbnRfdXNhZ2Uodm9pZCkKIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBlbnVtX29wdGlvbnMgdHlwZVxuIgpkaWZmIC0tZ2l0IGEvZG9jL3Byb3RvY29scy50ZXhpIGIvZG9jL3Byb3RvY29scy50ZXhpCmluZGV4IDM3NWQwNDIuLmUxOTUwNGQgMTAwNjQ0Ci0tLSBhL2RvYy9wcm90b2NvbHMudGV4aQorKysgYi9kb2MvcHJvdG9jb2xzLnRleGkKQEAgLTUsNiArNSwxMSBAQAogY2FuIGJlIHNldCBvbiBhbGwgdGhlIHByb3RvY29scy4gSW4gYWRkaXRpb24gZWFjaCBwcm90b2NvbCBtYXkgc3VwcG9ydAogc28tY2FsbGVkIHByaXZhdGUgb3B0aW9ucywgd2hpY2ggYXJlIHNwZWNpZmljIGZvciB0aGF0IGNvbXBvbmVudC4KIAorT3B0aW9ucyBtYXkgYmUgc2V0IGJ5IHNwZWNpZnlpbmcgLUB2YXJ7b3B0aW9ufSBAdmFye3ZhbHVlfSBpbiB0aGUKK0ZGbXBlZyB0b29scywgb3IgYnkgc2V0dGluZyB0aGUgdmFsdWUgZXhwbGljaXRseSBpbiB0aGUKK0Bjb2Rle0FWRm9ybWF0Q29udGV4dH0gb3B0aW9ucyBvciB1c2luZyB0aGUgQGZpbGV7bGliYXZ1dGlsL29wdC5ofSBBUEkKK2ZvciBwcm9ncmFtbWF0aWMgdXNlLgorCiBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgb3B0aW9ucyBmb2xsb3dzOgogCiBAdGFibGUgQG9wdGlvbgpAQCAtMzYsNiArNDEsMTQgQEAKIFRoZSBvcHRpb24gIi1wcm90b2NvbHMiIG9mIHRoZSBmZiogdG9vbHMgd2lsbCBkaXNwbGF5IHRoZSBsaXN0IG9mCiBzdXBwb3J0ZWQgcHJvdG9jb2xzLgogCitBbGwgcHJvdG9jb2xzIGFjY2VwdCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CisKK0B0YWJsZSBAb3B0aW9uCitAaXRlbSByd190aW1lb3V0CitNYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgKG5ldHdvcmspIHJlYWQvd3JpdGUgb3BlcmF0aW9ucyB0byBjb21wbGV0ZSwKK2luIG1pY3Jvc2Vjb25kcy4KK0BlbmQgdGFibGUKKwogQSBkZXNjcmlwdGlvbiBvZiB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBwcm90b2NvbHMgZm9sbG93cy4KIAogQHNlY3Rpb24gYXN5bmMKQEAgLTIxNiw2ICsyMjksMTcgQEAKIGV0Yy4pLiBEaWZmZXJlbnQgRlRQIHNlcnZlcnMgYmVoYXZlIGluIGRpZmZlcmVudCB3YXkgZHVyaW5nIHNlZWsKIG9wZXJhdGlvbi4gZmYqIHRvb2xzIG1heSBwcm9kdWNlIGluY29tcGxldGUgY29udGVudCBkdWUgdG8gc2VydmVyIGxpbWl0YXRpb25zLgogCitUaGlzIHByb3RvY29sIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gZm9sbG93CitJZiBzZXQgdG8gMSwgdGhlIHByb3RvY29sIHdpbGwgcmV0cnkgcmVhZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlLCBhbGxvd2luZworcmVhZGluZyBmaWxlcyB0aGF0IHN0aWxsIGFyZSBiZWluZyB3cml0dGVuLiBJbiBvcmRlciBmb3IgdGhpcyB0byB0ZXJtaW5hdGUsCit5b3UgZWl0aGVyIG5lZWQgdG8gdXNlIHRoZSByd190aW1lb3V0IG9wdGlvbiwgb3IgdXNlIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sKKyhmb3IgQVBJIHVzZXJzKS4KKworQGVuZCB0YWJsZQorCiBAc2VjdGlvbiBnb3BoZXIKIAogR29waGVyIHByb3RvY29sLgpAQCAtMjU3LDcgKzI4MSw3IEBACiBJZiBzZXQgdG8gMSB1c2UgY2h1bmtlZCBUcmFuc2Zlci1FbmNvZGluZyBmb3IgcG9zdHMsIGRlZmF1bHQgaXMgMS4KIAogQGl0ZW0gY29udGVudF90eXBlCi1TZXQgYSBzcGVjaWZpYyBjb250ZW50IHR5cGUgZm9yIHRoZSBQT1NUIG1lc3NhZ2VzLgorU2V0IGEgc3BlY2lmaWMgY29udGVudCB0eXBlIGZvciB0aGUgUE9TVCBtZXNzYWdlcyBvciBmb3IgbGlzdGVuIG1vZGUuCiAKIEBpdGVtIGh0dHBfcHJveHkKIHNldCBIVFRQIHByb3h5IHRvIHR1bm5lbCB0aHJvdWdoIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjEyMzQKQEAgLTI3MiwxMSArMjk2LDE2IEBACiBAaXRlbSBwb3N0X2RhdGEKIFNldCBjdXN0b20gSFRUUCBwb3N0IGRhdGEuCiAKLUBpdGVtIHVzZXItYWdlbnQKK0BpdGVtIHJlZmVyZXIKK1NldCB0aGUgUmVmZXJlciBoZWFkZXIuIEluY2x1ZGUgJ1JlZmVyZXI6IFVSTCcgaGVhZGVyIGluIEhUVFAgcmVxdWVzdC4KKwogQGl0ZW0gdXNlcl9hZ2VudAogT3ZlcnJpZGUgdGhlIFVzZXItQWdlbnQgaGVhZGVyLiBJZiBub3Qgc3BlY2lmaWVkIHRoZSBwcm90b2NvbCB3aWxsIHVzZSBhCiBzdHJpbmcgZGVzY3JpYmluZyB0aGUgbGliYXZmb3JtYXQgYnVpbGQuICgiTGF2Zi88dmVyc2lvbj4iKQogCitAaXRlbSB1c2VyLWFnZW50CitUaGlzIGlzIGEgZGVwcmVjYXRlZCBvcHRpb24sIHlvdSBjYW4gdXNlIHVzZXJfYWdlbnQgaW5zdGVhZCBpdC4KKwogQGl0ZW0gdGltZW91dAogU2V0IHRpbWVvdXQgaW4gbWljcm9zZWNvbmRzIG9mIHNvY2tldCBJL08gb3BlcmF0aW9ucyB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nIGxvdyBsZXZlbAogb3BlcmF0aW9uLiBCeSBkZWZhdWx0IGl0IGlzIHNldCB0byAtMSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdGltZW91dCBpcwpAQCAtMjk1LDYgKzMyNCw5IEBACiBAaXRlbSBtaW1lX3R5cGUKIEV4cG9ydCB0aGUgTUlNRSB0eXBlLgogCitAaXRlbSBodHRwX3ZlcnNpb24KK0V4cG9ydHMgdGhlIEhUVFAgcmVzcG9uc2UgdmVyc2lvbiBudW1iZXIuIFVzdWFsbHkgIjEuMCIgb3IgIjEuMSIuCisKIEBpdGVtIGljeQogSWYgc2V0IHRvIDEgcmVxdWVzdCBJQ1kgKFNIT1VUY2FzdCkgbWV0YWRhdGEgZnJvbSB0aGUgc2VydmVyLiBJZiB0aGUgc2VydmVyCiBzdXBwb3J0cyB0aGlzLCB0aGUgbWV0YWRhdGEgaGFzIHRvIGJlIHJldHJpZXZlZCBieSB0aGUgYXBwbGljYXRpb24gYnkgcmVhZGluZwpAQCAtMzM2LDggKzM2OCw4IEBACiBJZiBzZXQgdG8gMSBlbmFibGVzIGV4cGVyaW1lbnRhbCBIVFRQIHNlcnZlci4gVGhpcyBjYW4gYmUgdXNlZCB0byBzZW5kIGRhdGEgd2hlbgogdXNlZCBhcyBhbiBvdXRwdXQgb3B0aW9uLCBvciByZWFkIGRhdGEgZnJvbSBhIGNsaWVudCB3aXRoIEhUVFAgUE9TVCB3aGVuIHVzZWQgYXMKIGFuIGlucHV0IG9wdGlvbi4KLUlmIHNldCB0byAyIGVuYWJsZXMgZXhwZXJpbWVudGFsIG11dGxpLWNsaWVudCBIVFRQIHNlcnZlci4gVGhpcyBpcyBub3QgeWV0IGltcGxlbWVudGVkCi1pbiBmZm1wZWcuYyBvciBmZnNlcnZlci5jIGFuZCB0aHVzIG11c3Qgbm90IGJlIHVzZWQgYXMgYSBjb21tYW5kIGxpbmUgb3B0aW9uLgorSWYgc2V0IHRvIDIgZW5hYmxlcyBleHBlcmltZW50YWwgbXVsdGktY2xpZW50IEhUVFAgc2VydmVyLiBUaGlzIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQKK2luIGZmbXBlZy5jIGFuZCB0aHVzIG11c3Qgbm90IGJlIHVzZWQgYXMgYSBjb21tYW5kIGxpbmUgb3B0aW9uLgogQGV4YW1wbGUKICMgU2VydmVyIHNpZGUgKHNlbmRpbmcpOgogZmZtcGVnIC1pIHNvbWVmaWxlLm9nZyAtYyBjb3B5IC1saXN0ZW4gMSAtZiBvZ2cgaHR0cDovL0B2YXJ7c2VydmVyfTpAdmFye3BvcnR9CkBAIC00OTQsNiArNTI2LDQxIEBACiBOb3RlIHRoYXQgc29tZSBmb3JtYXRzICh0eXBpY2FsbHkgTU9WKSwgcmVxdWlyZSB0aGUgb3V0cHV0IHByb3RvY29sIHRvCiBiZSBzZWVrYWJsZSwgc28gdGhleSB3aWxsIGZhaWwgd2l0aCB0aGUgcGlwZSBvdXRwdXQgcHJvdG9jb2wuCiAKK0BzZWN0aW9uIHByb21wZWcKKworUHJvLU1QRUcgQ29kZSBvZiBQcmFjdGljZSAjMyBSZWxlYXNlIDIgRkVDIHByb3RvY29sLgorCitUaGUgUHJvLU1QRUcgQ29QIzMgRkVDIGlzIGEgMkQgcGFyaXR5LWNoZWNrIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiBtZWNoYW5pc20KK2ZvciBNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbXMgc2VudCBvdmVyIFJUUC4KKworVGhpcyBwcm90b2NvbCBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgQGNvZGV7cnRwX21wZWd0c30gbXV4ZXIgYW5kCit0aGUgQGNvZGV7cnRwfSBwcm90b2NvbC4KKworVGhlIHJlcXVpcmVkIHN5bnRheCBpczoKK0BleGFtcGxlCistZiBydHBfbXBlZ3RzIC1mZWMgcHJvbXBlZz1AdmFye29wdGlvbn09QHZhcnt2YWx9Li4uIHJ0cDovL0B2YXJ7aG9zdG5hbWV9OkB2YXJ7cG9ydH0KK0BlbmQgZXhhbXBsZQorCitUaGUgZGVzdGluYXRpb24gVURQIHBvcnRzIGFyZSBAY29kZXtwb3J0ICsgMn0gZm9yIHRoZSBjb2x1bW4gRkVDIHN0cmVhbQorYW5kIEBjb2Rle3BvcnQgKyA0fSBmb3IgdGhlIHJvdyBGRUMgc3RyZWFtLgorCitUaGlzIHByb3RvY29sIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zOgorQHRhYmxlIEBvcHRpb24KKworQGl0ZW0gbD1AdmFye259CitUaGUgbnVtYmVyIG9mIGNvbHVtbnMgKDQtMjAsIEx4RCA8PSAxMDApCisKK0BpdGVtIGQ9QHZhcntufQorVGhlIG51bWJlciBvZiByb3dzICg0LTIwLCBMeEQgPD0gMTAwKQorCitAZW5kIHRhYmxlCisKK0V4YW1wbGUgdXNhZ2U6CisKK0BleGFtcGxlCistZiBydHBfbXBlZ3RzIC1mZWMgcHJvbXBlZz1sPTg6ZD00IHJ0cDovL0B2YXJ7aG9zdG5hbWV9OkB2YXJ7cG9ydH0KK0BlbmQgZXhhbXBsZQorCiBAc2VjdGlvbiBydG1wCiAKIFJlYWwtVGltZSBNZXNzYWdpbmcgUHJvdG9jb2wuCkBAIC02NzYsNyArNzQzLDcgQEAKIAogQHRhYmxlIEBvcHRpb24KIEBpdGVtIHRpbWVvdXQKLVNldCB0aW1lb3V0IGluIG1pbGlzZWNvbmRzIG9mIHNvY2tldCBJL08gb3BlcmF0aW9ucyB1c2VkIGJ5IHRoZSB1bmRlcmx5aW5nCitTZXQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgb2Ygc29ja2V0IEkvTyBvcGVyYXRpb25zIHVzZWQgYnkgdGhlIHVuZGVybHlpbmcKIGxvdyBsZXZlbCBvcGVyYXRpb24uIEJ5IGRlZmF1bHQgaXQgaXMgc2V0IHRvIC0xLCB3aGljaCBtZWFucyB0aGF0IHRoZSB0aW1lb3V0CiBpcyBub3Qgc3BlY2lmaWVkLgogCkBAIC0xMDg4LDYgKzExNTUsMTQ2IEBACiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMuIEJ5IGRlZmF1bHQgbm8gbGltaXQgaXMgc2V0LgogQGVuZCB0YWJsZQogCitAc2VjdGlvbiBzcnQKKworSGFpdmlzaW9uIFNlY3VyZSBSZWxpYWJsZSBUcmFuc3BvcnQgUHJvdG9jb2wgdmlhIGxpYnNydC4KKworVGhlIHN1cHBvcnRlZCBzeW50YXggZm9yIGEgU1JUIFVSTCBpczoKK0BleGFtcGxlCitzcnQ6Ly9AdmFye2hvc3RuYW1lfTpAdmFye3BvcnR9Wz9AdmFye29wdGlvbnN9XQorQGVuZCBleGFtcGxlCisKK0B2YXJ7b3B0aW9uc30gY29udGFpbnMgYSBsaXN0IG9mICYtc2VwYXJhdGVkIG9wdGlvbnMgb2YgdGhlIGZvcm0KK0B2YXJ7a2V5fT1AdmFye3ZhbH0uCisKK29yCisKK0BleGFtcGxlCitAdmFye29wdGlvbnN9IHNydDovL0B2YXJ7aG9zdG5hbWV9OkB2YXJ7cG9ydH0KK0BlbmQgZXhhbXBsZQorCitAdmFye29wdGlvbnN9IGNvbnRhaW5zIGEgbGlzdCBvZiAnLUB2YXJ7a2V5fSBAdmFye3ZhbH0nCitvcHRpb25zLgorCitUaGlzIHByb3RvY29sIGFjY2VwdHMgdGhlIGZvbGxvd2luZyBvcHRpb25zLgorCitAdGFibGUgQG9wdGlvbgorQGl0ZW0gY29ubmVjdF90aW1lb3V0CitDb25uZWN0aW9uIHRpbWVvdXQ7IFNSVCBjYW5ub3QgY29ubmVjdCBmb3IgUlRUID4gMTUwMCBtc2VjCisoMiBoYW5kc2hha2UgZXhjaGFuZ2VzKSB3aXRoIHRoZSBkZWZhdWx0IGNvbm5lY3QgdGltZW91dCBvZgorMyBzZWNvbmRzLiBUaGlzIG9wdGlvbiBhcHBsaWVzIHRvIHRoZSBjYWxsZXIgYW5kIHJlbmRlenZvdXMKK2Nvbm5lY3Rpb24gbW9kZXMuIFRoZSBjb25uZWN0IHRpbWVvdXQgaXMgMTAgdGltZXMgdGhlIHZhbHVlCitzZXQgZm9yIHRoZSByZW5kZXp2b3VzIG1vZGUgKHdoaWNoIGNhbiBiZSB1c2VkIGFzIGEKK3dvcmthcm91bmQgZm9yIHRoaXMgY29ubmVjdGlvbiBwcm9ibGVtIHdpdGggZWFybGllciB2ZXJzaW9ucykuCisKK0BpdGVtIGZmcz1AdmFye2J5dGVzfQorRmxpZ2h0IEZsYWcgU2l6ZSAoV2luZG93IFNpemUpLCBpbiBieXRlcy4gRkZTIGlzIGFjdHVhbGx5IGFuCitpbnRlcm5hbCBwYXJhbWV0ZXIgYW5kIHlvdSBzaG91bGQgc2V0IGl0IHRvIG5vdCBsZXNzIHRoYW4KK0BvcHRpb257cmVjdl9idWZmZXJfc2l6ZX0gYW5kIEBvcHRpb257bXNzfS4gVGhlIGRlZmF1bHQgdmFsdWUKK2lzIHJlbGF0aXZlbHkgbGFyZ2UsIHRoZXJlZm9yZSB1bmxlc3MgeW91IHNldCBhIHZlcnkgbGFyZ2UgcmVjZWl2ZXIgYnVmZmVyLAoreW91IGRvIG5vdCBuZWVkIHRvIGNoYW5nZSB0aGlzIG9wdGlvbi4gRGVmYXVsdCB2YWx1ZSBpcyAyNTYwMC4KKworQGl0ZW0gaW5wdXRidz1AdmFye2J5dGVzL3NlY29uZHN9CitTZW5kZXIgbm9taW5hbCBpbnB1dCByYXRlLCBpbiBieXRlcyBwZXIgc2Vjb25kcy4gVXNlZCBhbG9uZyB3aXRoCitAb3B0aW9ue29oZWFkYnd9LCB3aGVuIEBvcHRpb257bWF4Ynd9IGlzIHNldCB0byByZWxhdGl2ZSAoMCksIHRvCitjYWxjdWxhdGUgbWF4aW11bSBzZW5kaW5nIHJhdGUgd2hlbiByZWNvdmVyeSBwYWNrZXRzIGFyZSBzZW50CithbG9uZyB3aXRoIHRoZSBtYWluIG1lZGlhIHN0cmVhbToKK0BvcHRpb257aW5wdXRid30gKiAoMTAwICsgQG9wdGlvbntvaGVhZGJ3fSkgLyAxMDAKK2lmIEBvcHRpb257aW5wdXRid30gaXMgbm90IHNldCB3aGlsZSBAb3B0aW9ue21heGJ3fSBpcyBzZXQgdG8KK3JlbGF0aXZlICgwKSwgdGhlIGFjdHVhbCBpbnB1dCByYXRlIGlzIGV2YWx1YXRlZCBpbnNpZGUKK3RoZSBsaWJyYXJ5LiBEZWZhdWx0IHZhbHVlIGlzIDAuCisKK0BpdGVtIGlwdG9zPUB2YXJ7dG9zfQorSVAgVHlwZSBvZiBTZXJ2aWNlLiBBcHBsaWVzIHRvIHNlbmRlciBvbmx5LiBEZWZhdWx0IHZhbHVlIGlzIDB4QjguCisKK0BpdGVtIGlwdHRsPUB2YXJ7dHRsfQorSVAgVGltZSBUbyBMaXZlLiBBcHBsaWVzIHRvIHNlbmRlciBvbmx5LiBEZWZhdWx0IHZhbHVlIGlzIDY0LgorCitAaXRlbSBsaXN0ZW5fdGltZW91dAorU2V0IHNvY2tldCBsaXN0ZW4gdGltZW91dC4KKworQGl0ZW0gbWF4Ync9QHZhcntieXRlcy9zZWNvbmRzfQorTWF4aW11bSBzZW5kaW5nIGJhbmR3aWR0aCwgaW4gYnl0ZXMgcGVyIHNlY29uZHMuCistMSBpbmZpbml0ZSAoQ1NSVENDIGxpbWl0IGlzIDMwbWJwcykKKzAgcmVsYXRpdmUgdG8gaW5wdXQgcmF0ZSAoc2VlIEBvcHRpb257aW5wdXRid30pCis+MCBhYnNvbHV0ZSBsaW1pdCB2YWx1ZQorRGVmYXVsdCB2YWx1ZSBpcyAwIChyZWxhdGl2ZSkKKworQGl0ZW0gbW9kZT1AdmFye2NhbGxlcnxsaXN0ZW5lcnxyZW5kZXp2b3VzfQorQ29ubmVjdGlvbiBtb2RlLgorQG9wdGlvbntjYWxsZXJ9IG9wZW5zIGNsaWVudCBjb25uZWN0aW9uLgorQG9wdGlvbntsaXN0ZW5lcn0gc3RhcnRzIHNlcnZlciB0byBsaXN0ZW4gZm9yIGluY29taW5nIGNvbm5lY3Rpb25zLgorQG9wdGlvbntyZW5kZXp2b3VzfSB1c2UgUmVuZGV6LVZvdXMgY29ubmVjdGlvbiBtb2RlLgorRGVmYXVsdCB2YWx1ZSBpcyBjYWxsZXIuCisKK0BpdGVtIG1zcz1AdmFye2J5dGVzfQorTWF4aW11bSBTZWdtZW50IFNpemUsIGluIGJ5dGVzLiBVc2VkIGZvciBidWZmZXIgYWxsb2NhdGlvbgorYW5kIHJhdGUgY2FsY3VsYXRpb24gdXNpbmcgYSBwYWNrZXQgY291bnRlciBhc3N1bWluZyBmdWxseQorZmlsbGVkIHBhY2tldHMuIFRoZSBzbWFsbGVzdCBNU1MgYmV0d2VlbiB0aGUgcGVlcnMgaXMKK3VzZWQuIFRoaXMgaXMgMTUwMCBieSBkZWZhdWx0IGluIHRoZSBvdmVyYWxsIGludGVybmV0LgorVGhpcyBpcyB0aGUgbWF4aW11bSBzaXplIG9mIHRoZSBVRFAgcGFja2V0IGFuZCBjYW4gYmUKK29ubHkgZGVjcmVhc2VkLCB1bmxlc3MgeW91IGhhdmUgc29tZSB1bnVzdWFsIGRlZGljYXRlZAorbmV0d29yayBzZXR0aW5ncy4gRGVmYXVsdCB2YWx1ZSBpcyAxNTAwLgorCitAaXRlbSBuYWtyZXBvcnQ9QHZhcnsxfDB9CitJZiBzZXQgdG8gMSwgUmVjZWl2ZXIgd2lsbCBzZW5kIGBVTVNHX0xPU1NSRVBPUlRgIG1lc3NhZ2VzCitwZXJpb2RpY2FsbHkgdW50aWwgYSBsb3N0IHBhY2tldCBpcyByZXRyYW5zbWl0dGVkIG9yCitpbnRlbnRpb25hbGx5IGRyb3BwZWQuIERlZmF1bHQgdmFsdWUgaXMgMS4KKworQGl0ZW0gb2hlYWRidz1AdmFye3BlcmNlbnRzfQorUmVjb3ZlcnkgYmFuZHdpZHRoIG92ZXJoZWFkIGFib3ZlIGlucHV0IHJhdGUsIGluIHBlcmNlbnRzLgorU2VlIEBvcHRpb257aW5wdXRid30uIERlZmF1bHQgdmFsdWUgaXMgMjUlLgorCitAaXRlbSBwYXNzcGhyYXNlPUB2YXJ7c3RyaW5nfQorSGFpQ3J5cHQgRW5jcnlwdGlvbi9EZWNyeXB0aW9uIFBhc3NwaHJhc2Ugc3RyaW5nLCBsZW5ndGgKK2Zyb20gMTAgdG8gNzkgY2hhcmFjdGVycy4gVGhlIHBhc3NwaHJhc2UgaXMgdGhlIHNoYXJlZAorc2VjcmV0IGJldHdlZW4gdGhlIHNlbmRlciBhbmQgdGhlIHJlY2VpdmVyLiBJdCBpcyB1c2VkCit0byBnZW5lcmF0ZSB0aGUgS2V5IEVuY3J5cHRpbmcgS2V5IHVzaW5nIFBCS0RGMgorKFBhc3N3b3JkLUJhc2VkIEtleSBEZXJpdmF0aW9uIEZ1bmN0aW9uKS4gSXQgaXMgdXNlZAorb25seSBpZiBAb3B0aW9ue3Bia2V5bGVufSBpcyBub24temVyby4gSXQgaXMgdXNlZCBvbgordGhlIHJlY2VpdmVyIG9ubHkgaWYgdGhlIHJlY2VpdmVkIGRhdGEgaXMgZW5jcnlwdGVkLgorVGhlIGNvbmZpZ3VyZWQgcGFzc3BocmFzZSBjYW5ub3QgYmUgcmVjb3ZlcmVkICh3cml0ZS1vbmx5KS4KKworQGl0ZW0gcGJrZXlsZW49QHZhcntieXRlc30KK1NlbmRlciBlbmNyeXB0aW9uIGtleSBsZW5ndGgsIGluIGJ5dGVzLgorT25seSBjYW4gYmUgc2V0IHRvIDAsIDE2LCAyNCBhbmQgMzIuCitFbmFibGUgc2VuZGVyIGVuY3J5cHRpb24gaWYgbm90IDAuCitOb3QgcmVxdWlyZWQgb24gcmVjZWl2ZXIgKHNldCB0byAwKSwKK2tleSBzaXplIG9idGFpbmVkIGZyb20gc2VuZGVyIGluIEhhaUNyeXB0IGhhbmRzaGFrZS4KK0RlZmF1bHQgdmFsdWUgaXMgMC4KKworQGl0ZW0gcmVjdl9idWZmZXJfc2l6ZT1AdmFye2J5dGVzfQorU2V0IHJlY2VpdmUgYnVmZmVyIHNpemUsIGV4cHJlc3NlZCBpbiBieXRlcy4KKworQGl0ZW0gc2VuZF9idWZmZXJfc2l6ZT1AdmFye2J5dGVzfQorU2V0IHNlbmQgYnVmZmVyIHNpemUsIGV4cHJlc3NlZCBpbiBieXRlcy4KKworQGl0ZW0gcndfdGltZW91dAorU2V0IHJhaXNlIGVycm9yIHRpbWVvdXQgZm9yIHJlYWQvd3JpdGUgb3B0YXRpb25zLgorCitUaGlzIG9wdGlvbiBpcyBvbmx5IHJlbGV2YW50IGluIHJlYWQgbW9kZToKK2lmIG5vIGRhdGEgYXJyaXZlZCBpbiBtb3JlIHRoYW4gdGhpcyB0aW1lCitpbnRlcnZhbCwgcmFpc2UgZXJyb3IuCisKK0BpdGVtIHRscGt0ZHJvcD1AdmFyezF8MH0KK1Rvby1sYXRlIFBhY2tldCBEcm9wLiBXaGVuIGVuYWJsZWQgb24gcmVjZWl2ZXIsIGl0IHNraXBzCittaXNzaW5nIHBhY2tldHMgdGhhdCBoYXZlIG5vdCBiZWVuIGRlbGl2ZXJlZCBpbiB0aW1lIGFuZAorZGVsaXZlcnMgdGhlIGZvbGxvd2luZyBwYWNrZXRzIHRvIHRoZSBhcHBsaWNhdGlvbiB3aGVuCit0aGVpciB0aW1lLXRvLXBsYXkgaGFzIGNvbWUuIEl0IGFsc28gc2VuZHMgYSBmYWtlIEFDSyB0bwordGhlIHNlbmRlci4gV2hlbiBlbmFibGVkIG9uIHNlbmRlciBhbmQgZW5hYmxlZCBvbiB0aGUKK3JlY2VpdmluZyBwZWVyLCB0aGUgc2VuZGVyIGRyb3BzIHRoZSBvbGRlciBwYWNrZXRzIHRoYXQKK2hhdmUgbm8gY2hhbmNlIG9mIGJlaW5nIGRlbGl2ZXJlZCBpbiB0aW1lLiBJdCB3YXMKK2F1dG9tYXRpY2FsbHkgZW5hYmxlZCBpbiB0aGUgc2VuZGVyIGlmIHRoZSByZWNlaXZlcgorc3VwcG9ydHMgaXQuCisKK0BpdGVtIHRzYnBkZGVsYXkKK1RpbWVzdGFtcC1iYXNlZCBQYWNrZXQgRGVsaXZlcnkgRGVsYXkuCitVc2VkIHRvIGFic29yYiBidXJzdCBvZiBtaXNzZWQgcGFja2V0IHJldHJhbnNtaXNzaW9uLgorCitAZW5kIHRhYmxlCisKK0ZvciBtb3JlIGluZm9ybWF0aW9uIHNlZTogQHVybHtodHRwczovL2dpdGh1Yi5jb20vSGFpdmlzaW9uL3NydH0uCisKIEBzZWN0aW9uIHNydHAKIAogU2VjdXJlIFJlYWwtdGltZSBUcmFuc3BvcnQgUHJvdG9jb2wuCkBAIC0xMTI1LDYgKzEzMzIsNyBAQAogU3RhcnQgb2Zmc2V0IG9mIHRoZSBleHRyYWN0ZWQgc2VnbWVudCwgaW4gYnl0ZXMuCiBAaXRlbSBlbmQKIEVuZCBvZmZzZXQgb2YgdGhlIGV4dHJhY3RlZCBzZWdtZW50LCBpbiBieXRlcy4KK0lmIHNldCB0byAwLCBleHRyYWN0IHRpbGwgZW5kIG9mIGZpbGUuCiBAZW5kIHRhYmxlCiAKIEV4YW1wbGVzOgpAQCAtMTE0MCw2ICsxMzQ4LDIwIEBACiBzdWJmaWxlLCxzdGFydCwxODMyNDE3MjgsZW5kLDM2NjQ5MDYyNCwsOmFyY2hpdmUudGFyCiBAZW5kIGV4YW1wbGUKIAorUGxheSBhIE1QRUctVFMgZmlsZSBmcm9tIHN0YXJ0IG9mZnNldCB0aWxsIGVuZDoKK0BleGFtcGxlCitzdWJmaWxlLCxzdGFydCwzMjgxNTIzOSxlbmQsMCwsOnZpZGVvLnRzCitAZW5kIGV4YW1wbGUKKworQHNlY3Rpb24gdGVlCisKK1dyaXRlcyB0aGUgb3V0cHV0IHRvIG11bHRpcGxlIHByb3RvY29scy4gVGhlIGluZGl2aWR1YWwgb3V0cHV0cyBhcmUgc2VwYXJhdGVkCitieSB8CisKK0BleGFtcGxlCit0ZWU6ZmlsZTovL3BhdGgvdG8vbG9jYWwvdGhpcy5hdml8ZmlsZTovL3BhdGgvdG8vbG9jYWwvdGhhdC5hdmkKK0BlbmQgZXhhbXBsZQorCiBAc2VjdGlvbiB0Y3AKIAogVHJhbnNtaXNzaW9uIENvbnRyb2wgUHJvdG9jb2wuCkBAIC0xMTcyLDYgKzEzOTQsOSBAQAogCiBAaXRlbSBzZW5kX2J1ZmZlcl9zaXplPUB2YXJ7Ynl0ZXN9CiBTZXQgc2VuZCBidWZmZXIgc2l6ZSwgZXhwcmVzc2VkIGJ5dGVzLgorCitAaXRlbSB0Y3Bfbm9kZWxheT1AdmFyezF8MH0KK1NldCBUQ1BfTk9ERUxBWSB0byBkaXNhYmxlIE5hZ2xlJ3MgYWxnb3JpdGhtLiBEZWZhdWx0IHZhbHVlIGlzIDAuCiBAZW5kIHRhYmxlCiAKIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gc2V0dXAgYSBsaXN0ZW5pbmcgVENQIGNvbm5lY3Rpb24KQEAgLTEyMDcsNyArMTQzMiw3IEBACiBOb3RlLCBpZiB1c2luZyBPcGVuU1NMLCB0aGlzIGN1cnJlbnRseSBvbmx5IG1ha2VzIHN1cmUgdGhhdCB0aGUKIHBlZXIgY2VydGlmaWNhdGUgaXMgc2lnbmVkIGJ5IG9uZSBvZiB0aGUgcm9vdCBjZXJ0aWZpY2F0ZXMgaW4gdGhlIENBCiBkYXRhYmFzZSwgYnV0IGl0IGRvZXMgbm90IHZhbGlkYXRlIHRoYXQgdGhlIGNlcnRpZmljYXRlIGFjdHVhbGx5Ci1tYXRjaGVzIHRoZSBob3N0IG5hbWUgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvLiAoV2l0aCBHbnVUTFMsCittYXRjaGVzIHRoZSBob3N0IG5hbWUgd2UgYXJlIHRyeWluZyB0byBjb25uZWN0IHRvLiAoV2l0aCBvdGhlciBiYWNrZW5kcywKIHRoZSBob3N0IG5hbWUgaXMgdmFsaWRhdGVkIGFzIHdlbGwuKQogCiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgc2luY2UgaXQgcmVxdWlyZXMgYSBDQSBkYXRhYmFzZSB0byBiZQpAQCAtMTI2Niw2ICsxNDkxLDE0IEBACiB0aGUgcmVjZWl2ZSBvciBzZW5kIGJ1ZmZlciBzaXplLCBkZXBlbmRpbmcgb24gd2hhdCB0aGUgc29ja2V0IGlzIHVzZWQgZm9yLgogRGVmYXVsdCBpcyA2NEtCLiAgU2VlIGFsc28gQHZhcntmaWZvX3NpemV9LgogCitAaXRlbSBiaXRyYXRlPUB2YXJ7Yml0cmF0ZX0KK0lmIHNldCB0byBub256ZXJvLCB0aGUgb3V0cHV0IHdpbGwgaGF2ZSB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IGJpdHJhdGUgaWYgdGhlCitpbnB1dCBoYXMgZW5vdWdoIHBhY2tldHMgdG8gc3VzdGFpbiBpdC4KKworQGl0ZW0gYnVyc3RfYml0cz1AdmFye2JpdHN9CitXaGVuIHVzaW5nIEB2YXJ7Yml0cmF0ZX0gdGhpcyBzcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgaW4KK3BhY2tldCBidXJzdHMuCisKIEBpdGVtIGxvY2FscG9ydD1AdmFye3BvcnR9CiBPdmVycmlkZSB0aGUgbG9jYWwgVURQIHBvcnQgdG8gYmluZCB3aXRoLgogCmRpZmYgLS1naXQgYS9kb2MvcmVzYW1wbGVyLnRleGkgYi9kb2MvcmVzYW1wbGVyLnRleGkKaW5kZXggY2I3ZDUzNi4uNWVkM2Y0MyAxMDA2NDQKLS0tIGEvZG9jL3Jlc2FtcGxlci50ZXhpCisrKyBiL2RvYy9yZXNhbXBsZXIudGV4aQpAQCAtMTIwLDggKzEyMCw4IEBACiBhcHBsaWNhYmxlIGluIHRoaXMgY2FzZS4KIEBpdGVtIHNveHIKIHNlbGVjdCB0aGUgU29YIFJlc2FtcGxlciAod2hlcmUgYXZhaWxhYmxlKTsgY29tcGVuc2F0aW9uLCBhbmQgZmlsdGVyIG9wdGlvbnMKLWZpbHRlcl9zaXplLCBwaGFzZV9zaGlmdCwgZmlsdGVyX3R5cGUgJiBrYWlzZXJfYmV0YSwgYXJlIG5vdCBhcHBsaWNhYmxlIGluIHRoaXMKLWNhc2UuCitmaWx0ZXJfc2l6ZSwgcGhhc2Vfc2hpZnQsIGV4YWN0X3JhdGlvbmFsLCBmaWx0ZXJfdHlwZSAmIGthaXNlcl9iZXRhLCBhcmUgbm90CithcHBsaWNhYmxlIGluIHRoaXMgY2FzZS4KIEBlbmQgdGFibGUKIAogQGl0ZW0gZmlsdGVyX3NpemUKQEAgLTEzMiw3ICsxMzIsMTMgQEAKIHRoZSBpbnRlcnZhbCBbMCwzMF0uCiAKIEBpdGVtIGxpbmVhcl9pbnRlcnAKLVVzZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpZiBzZXQgdG8gMSwgZGVmYXVsdCB2YWx1ZSBpcyAwLgorVXNlIGxpbmVhciBpbnRlcnBvbGF0aW9uIHdoZW4gZW5hYmxlZCAodGhlIGRlZmF1bHQpLiBEaXNhYmxlIGl0IGlmIHlvdSB3YW50Cit0byBwcmVzZXJ2ZSBzcGVlZCBpbnN0ZWFkIG9mIHF1YWxpdHkgd2hlbiBleGFjdF9yYXRpb25hbCBmYWlscy4KKworQGl0ZW0gZXhhY3RfcmF0aW9uYWwKK0ZvciBzd3Igb25seSwgd2hlbiBlbmFibGVkLCB0cnkgdG8gdXNlIGV4YWN0IHBoYXNlX2NvdW50IGJhc2VkIG9uIGlucHV0IGFuZAorb3V0cHV0IHNhbXBsZSByYXRlLiBIb3dldmVyLCBpZiBpdCBpcyBsYXJnZXIgdGhhbiBAY29kZXsxIDw8IHBoYXNlX3NoaWZ0fSwKK3RoZSBwaGFzZV9jb3VudCB3aWxsIGJlIEBjb2RlezEgPDwgcGhhc2Vfc2hpZnR9IGFzIGZhbGxiYWNrLiBEZWZhdWx0IGlzIGVuYWJsZWQuCiAKIEBpdGVtIGN1dG9mZgogU2V0IGN1dG9mZiBmcmVxdWVuY3kgKHN3cjogNmRCIHBvaW50OyBzb3hyOiAwZEIgcG9pbnQpIHJhdGlvOyBtdXN0IGJlIGEgZmxvYXQKZGlmZiAtLWdpdCBhL2RvYy9zY2FsZXIudGV4aSBiL2RvYy9zY2FsZXIudGV4aQppbmRleCAzZTExNWNkLi5mNzM4MDRhIDEwMDY0NAotLS0gYS9kb2Mvc2NhbGVyLnRleGkKKysrIGIvZG9jL3NjYWxlci50ZXhpCkBAIC0xMyw3ICsxMyw4IEBACiBAYW5jaG9ye3N3c19mbGFnc30KIEBpdGVtIHN3c19mbGFncwogU2V0IHRoZSBzY2FsZXIgZmxhZ3MuIFRoaXMgaXMgYWxzbyB1c2VkIHRvIHNldCB0aGUgc2NhbGluZwotYWxnb3JpdGhtLiBPbmx5IGEgc2luZ2xlIGFsZ29yaXRobSBzaG91bGQgYmUgc2VsZWN0ZWQuCithbGdvcml0aG0uIE9ubHkgYSBzaW5nbGUgYWxnb3JpdGhtIHNob3VsZCBiZSBzZWxlY3RlZC4gRGVmYXVsdAordmFsdWUgaXMgQHNhbXB7YmljdWJpY30uCiAKIEl0IGFjY2VwdHMgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiBAdGFibGUgQHNhbXAKZGlmZiAtLWdpdCBhL2RvYy9zbm93LnR4dCBiL2RvYy9zbm93LnR4dAppbmRleCA5ZDU3NzhkLi5iYmYyOGJjIDEwMDY0NAotLS0gYS9kb2Mvc25vdy50eHQKKysrIGIvZG9jL3Nub3cudHh0CkBAIC01MjcsNyArNTI3LDcgQEAKID09PT09PT09PT09PT09PT09PQogCiBTbm93IHN1cHBvcnRzIDIgd2F2ZWxldCB0cmFuc2Zvcm1zLCB0aGUgc3ltbWV0cmljIGJpb3J0aG9nb25hbCA1LzMgaW50ZWdlcgotdHJhbnNmb3JtIGFuZCBhIGludGVnZXIgYXBwcm94aW1hdGlvbiBvZiB0aGUgc3ltbWV0cmljIGJpb3J0aG9nb25hbCA5LzcKK3RyYW5zZm9ybSBhbmQgYW4gaW50ZWdlciBhcHByb3hpbWF0aW9uIG9mIHRoZSBzeW1tZXRyaWMgYmlvcnRob2dvbmFsIDkvNwogZGF1YmVjaGllcyB3YXZlbGV0LgogCiAyRCBJRFdUIChpbnZlcnNlIGRpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtKQpkaWZmIC0tZ2l0IGEvZG9jL3N3c2NhbGUudHh0IGIvZG9jL3N3c2NhbGUudHh0CmluZGV4IDIwNjYwMDkuLmRiYjRlMjkgMTAwNjQ0Ci0tLSBhL2RvYy9zd3NjYWxlLnR4dAorKysgYi9kb2Mvc3dzY2FsZS50eHQKQEAgLTEwLDEyICsxMCwxMiBAQAogICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNwZWNpYWwgY29udmVydGVyICAgICBbSW5wdXQgdG8gWVVWIGNvbnZlcnRlcl0KICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgIHwgICAgICAgICAgKDhiaXQgWVVWIDQ6NDo0IC8gNDoyOjIgLyA0OjI6MCAvIDQ6MDowICkKKyAgICAgICAgICAgICAgfCAgICAgICAgICg4LWJpdCBZVVYgNDo0OjQgLyA0OjI6MiAvIDQ6MjowIC8gNDowOjAgKQogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB2CiAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsIHNjYWxlcgogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgfCAgICAgICgxNWJpdCBZVVYgNDo0OjQgLyA0OjI6MiAvIDQ6MjowIC8gNDoxOjEgLyA0OjA6MCApCisgICAgICAgICAgICAgIHwgICAgICgxNS1iaXQgWVVWIDQ6NDo0IC8gNDoyOjIgLyA0OjI6MCAvIDQ6MToxIC8gNDowOjAgKQogICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB2CiAgICAgICAgICAgICAgIHwgICAgICAgICAgVmVydGljYWwgc2NhbGVyIGFuZCBvdXRwdXQgY29udmVydGVyCmRpZmYgLS1naXQgYS9kb2MvdDJoLmluaXQgYi9kb2MvdDJoLmluaXQKaW5kZXggYzQxYmUyZS4uYTAxYTk3MSAxMDA2NDQKLS0tIGEvZG9jL3QyaC5pbml0CisrKyBiL2RvYy90MmguaW5pdApAQCAtMjIsNyArMjIsNyBAQAogbXkgJFRFTVBMQVRFX0hFQURFUjIgPSAkRU5WeyJGRk1QRUdfSEVBREVSMiJ9IHx8IDw8RU9UOwogICA8L2hlYWQ+CiAgIDxib2R5PgotICAgIDxkaXYgc3R5bGU9IndpZHRoOiA5NSU7IG1hcmdpbjogYXV0byI+CisgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KIEVPVAogCiBteSAkVEVNUExBVEVfRk9PVEVSID0gJEVOVnsiRkZNUEVHX0ZPT1RFUiJ9IHx8IDw8RU9UOwpkaWZmIC0tZ2l0IGEvZG9jL3QyaC5wbSBiL2RvYy90MmgucG0KaW5kZXggNWVmYjJkYS4uZTgzZDU2NCAxMDA2NDQKLS0tIGEvZG9jL3QyaC5wbQorKysgYi9kb2MvdDJoLnBtCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJzdHlsZS5taW4uY3NzIj4KICAgPC9oZWFkPgogICA8Ym9keT4KLSAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogOTUlOyBtYXJnaW46IGF1dG8iPgorICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICA8aDE+CiBFT1QKIApkaWZmIC0tZ2l0IGEvZG9jL3VuZGVmaW5lZC50eHQgYi9kb2MvdW5kZWZpbmVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDEyOTliCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3VuZGVmaW5lZC50eHQKQEAgLTAsMCArMSw0NyBAQAorVW5kZWZpbmVkIEJlaGF2aW9yCistLS0tLS0tLS0tLS0tLS0tLS0KK0luIHRoZSBDIGxhbmd1YWdlLCBzb21lIG9wZXJhdGlvbnMgYXJlIHVuZGVmaW5lZCwgbGlrZSBzaWduZWQgaW50ZWdlciBvdmVyZmxvdywKK2RlcmVmZXJlbmNpbmcgZnJlZWQgcG9pbnRlcnMsIGFjY2Vzc2luZyBvdXRzaWRlIGFsbG9jYXRlZCBzcGFjZSwgLi4uCisKK1VuZGVmaW5lZCBCZWhhdmlvciBtdXN0IG5vdCBvY2N1ciBpbiBhIEMgcHJvZ3JhbSwgaXQgaXMgbm90IHNhZmUgZXZlbiBpZiB0aGUKK291dHB1dCBvZiB1bmRlZmluZWQgb3BlcmF0aW9ucyBpcyB1bnVzZWQuIFRoZSB1bnNhZmV0eSBtYXkgc2VlbSBuaXQgcGlja2luZworYnV0IE9wdGltaXppbmcgY29tcGlsZXJzIGhhdmUgaW4gZmFjdCBvcHRpbWl6ZWQgY29kZSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0CitubyB1bmRlZmluZWQgQmVoYXZpb3Igb2NjdXJzLgorT3B0aW1pemluZyBjb2RlIGJhc2VkIG9uIHdyb25nIGFzc3VtcHRpb25zIGNhbiBhbmQgaGFzIGluIHNvbWUgY2FzZXMgbGVhZCB0bworZWZmZWN0cyBiZXlvbmQgdGhlIG91dHB1dCBvZiBjb21wdXRhdGlvbnMuCisKKworVGhlIHNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93IHByb2JsZW0gaW4gc3BlZWQgY3JpdGljYWwgY29kZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ29kZSB3aGljaCBpcyBoaWdobHkgb3B0aW1pemVkIGFuZCB3b3JrcyB3aXRoIHNpZ25lZCBpbnRlZ2VycyBzb21ldGltZXMgaGFzIHRoZQorcHJvYmxlbSB0aGF0IHNvbWUgKGludmFsaWQpIGlucHV0cyBjYW4gdHJpZ2dlciBvdmVyZmxvd3MgKHVuZGVmaW5lZCBiZWhhdmlvcikuCitJbiB0aGVzZSBjYXNlcywgb2Z0ZW4gdGhlIG91dHB1dCBvZiB0aGUgY29tcHV0YXRpb24gZG9lcyBub3QgbWF0dGVyIChhcyBpdCBpcworZnJvbSBpbnZhbGlkIGlucHV0KS4KK0luIHNvbWUgY2FzZXMgdGhlIGlucHV0IGNhbiBiZSBjaGVja2VkIGVhc2lseSBpbiBvdGhlcnMgY2hlY2tpbmcgdGhlIGlucHV0IGlzCitjb21wdXRhdGlvbmFsbHkgdG9vIGludGVuc2l2ZS4KK0luIHRoZXNlIHJlbWFpbmluZyBjYXNlcyBhIHVuc2lnbmVkIHR5cGUgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIHNpZ25lZCB0eXBlLgordW5zaWduZWQgb3ZlcmZsb3dzIGFyZSBkZWZpbmVkIGluIEMuCisKK1NVSU5UCistLS0tLQorQXMgd2UgaGF2ZSBhYm92ZSBlc3RhYmxpc2hlZCB0aGVyZSBpcyBhIG5lZWQgdG8gdXNlICJ1bnNpZ25lZCIgc29tZXRpbWVzIGluCitjb21wdXRhdGlvbnMgd2hpY2ggd29yayB3aXRoIHNpZ25lZCBpbnRlZ2VycyAod2hpY2ggb3ZlcmZsb3cpLgorVXNpbmcgInVuc2lnbmVkIiBmb3Igc2lnbmVkIGludGVnZXJzIGhhcyB0aGUgdmVyeSBzaWduaWZpY2FudCBwb3RlbnRpYWwgdG8KK2NhdXNlIGNvbmZ1c2lvbgorYXMgaW4KK3Vuc2lnbmVkIGEsYixjOworLi4uCithK2IqYzsKK1RoZSByZWFkZXIgZG9lcyBub3QgZXhwZWN0IGIgdG8gYmUgc2VtYW50aWNhbGx5IC01IGhlcmUgYW5kIGlmIHRoZSBjb2RlIGlzCitjaGFuZ2VkIGJ5IG1heWJlIGFkZGluZyBhIGNhc3QsIGEgZGl2aXNpb24gb3Igb3RoZXIgdGhlIHNpZ25lZG5lc3Mgd2lsbCBhbG1vc3QKK2NlcnRhaW5seSBiZSBtaXN0YWtlbi4KK1RvIGF2b2lkIHRoaXMgY29uZnVzaW9uIGEgbmV3IHR5cGUgd2FzIGludHJvZHVjZWQsICJTVUlOVCIgaXMgdGhlIEMgInVuc2lnbmVkIgordHlwZSBidXQgaXQgaG9sZHMgYSBzaWduZWQgImludCIuCit0byB1c2UgdGhlIHNhbWUgZXhhbXBsZQorU1VJTlQgYSxiLGM7CisuLi4KK2ErYipjOworaGVyZSB0aGUgcmVhZGVyIGtub3dzIHRoYXQgYSxiLGMgYXJlIG1lYW50IHRvIGJlIHNpZ25lZCBpbnRlZ2VycyBidXQgZm9yIEMKK3N0YW5kYXJkIGNvbXBsaWFuY2UgLyB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3IgdGhleSBhcmUgc3RvcmVkIGluIHVuc2lnbmVkCitpbnRzLgorCmRpZmYgLS1naXQgYS9kb2MvdXRpbHMudGV4aSBiL2RvYy91dGlscy50ZXhpCmluZGV4IDc1NmM2MDkuLmQ1NWRkMzEgMTAwNjQ0Ci0tLSBhL2RvYy91dGlscy50ZXhpCisrKyBiL2RvYy91dGlscy50ZXhpCkBAIC03MTksMTkgKzcxOSwyNCBAQAogdGhlIG5hbWUgb2YgYSBzaW5nbGUgY2hhbm5lbCAoZS5nLiBAc2FtcHtGTH0sIEBzYW1we0ZSfSwgQHNhbXB7RkN9LCBAc2FtcHtMRkV9LCBldGMuKQogCiBAaXRlbQotYSBudW1iZXIgb2YgY2hhbm5lbHMsIGluIGRlY2ltYWwsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgJ2MnLCB5aWVsZGluZwotdGhlIGRlZmF1bHQgY2hhbm5lbCBsYXlvdXQgZm9yIHRoYXQgbnVtYmVyIG9mIGNoYW5uZWxzIChzZWUgdGhlCi1mdW5jdGlvbiBAY29kZXthdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dH0pCithIG51bWJlciBvZiBjaGFubmVscywgaW4gZGVjaW1hbCwgZm9sbG93ZWQgYnkgJ2MnLCB5aWVsZGluZyB0aGUgZGVmYXVsdCBjaGFubmVsCitsYXlvdXQgZm9yIHRoYXQgbnVtYmVyIG9mIGNoYW5uZWxzIChzZWUgdGhlIGZ1bmN0aW9uCitAY29kZXthdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dH0pLiBOb3RlIHRoYXQgbm90IGFsbCBjaGFubmVsIGNvdW50cyBoYXZlIGEKK2RlZmF1bHQgbGF5b3V0LgorCitAaXRlbQorYSBudW1iZXIgb2YgY2hhbm5lbHMsIGluIGRlY2ltYWwsIGZvbGxvd2VkIGJ5ICdDJywgeWllbGRpbmcgYW4gdW5rbm93biBjaGFubmVsCitsYXlvdXQgd2l0aCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBjaGFubmVscy4gTm90ZSB0aGF0IG5vdCBhbGwgY2hhbm5lbCBsYXlvdXQKK3NwZWNpZmljYXRpb24gc3RyaW5ncyBzdXBwb3J0IHVua25vd24gY2hhbm5lbCBsYXlvdXRzLgogCiBAaXRlbQogYSBjaGFubmVsIGxheW91dCBtYXNrLCBpbiBoZXhhZGVjaW1hbCBzdGFydGluZyB3aXRoICIweCIgKHNlZSB0aGUKIEBjb2Rle0FWX0NIXyp9IG1hY3JvcyBpbiBAZmlsZXtsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaH0uCiBAZW5kIGl0ZW1pemUKIAotU3RhcnRpbmcgZnJvbSBsaWJhdnV0aWwgdmVyc2lvbiA1MyB0aGUgdHJhaWxpbmcgY2hhcmFjdGVyICJjIiB0bwotc3BlY2lmeSBhIG51bWJlciBvZiBjaGFubmVscyB3aWxsIGJlIHJlcXVpcmVkLCB3aGlsZSBhIGNoYW5uZWwgbGF5b3V0Ci1tYXNrIGNvdWxkIGFsc28gYmUgc3BlY2lmaWVkIGFzIGEgZGVjaW1hbCBudW1iZXIgKGlmIGFuZCBvbmx5IGlmIG5vdAotZm9sbG93ZWQgYnkgImMiKS4KK0JlZm9yZSBsaWJhdnV0aWwgdmVyc2lvbiA1MyB0aGUgdHJhaWxpbmcgY2hhcmFjdGVyICJjIiB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mCitjaGFubmVscyB3YXMgb3B0aW9uYWwsIGJ1dCBub3cgaXQgaXMgcmVxdWlyZWQsIHdoaWxlIGEgY2hhbm5lbCBsYXlvdXQgbWFzayBjYW4KK2Fsc28gYmUgc3BlY2lmaWVkIGFzIGEgZGVjaW1hbCBudW1iZXIgKGlmIGFuZCBvbmx5IGlmIG5vdCBmb2xsb3dlZCBieSAiYyIgb3IgIkMiKS4KIAogU2VlIGFsc28gdGhlIGZ1bmN0aW9uIEBjb2Rle2F2X2dldF9jaGFubmVsX2xheW91dH0gZGVmaW5lZCBpbgogQGZpbGV7bGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0Lmh9LgpAQCAtNzcxLDYgKzc3Niw5IEBACiBAaXRlbSBhdGFuKHgpCiBDb21wdXRlIGFyY3RhbmdlbnQgb2YgQHZhcnt4fS4KIAorQGl0ZW0gYXRhbjIoeCwgeSkKK0NvbXB1dGUgcHJpbmNpcGFsIHZhbHVlIG9mIHRoZSBhcmMgdGFuZ2VudCBvZiBAdmFye3l9L0B2YXJ7eH0uCisKIEBpdGVtIGJldHdlZW4oeCwgbWluLCBtYXgpCiBSZXR1cm4gMSBpZiBAdmFye3h9IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBAdmFye21pbn0gYW5kIGxlc3NlciB0aGFuIG9yCiBlcXVhbCB0byBAdmFye21heH0sIDAgb3RoZXJ3aXNlLgpAQCAtODU2LDYgKzg2NCw5IEBACiBAdmFye3Zhcn0sIHdoaWNoIHdhcyBwcmV2aW91c2x5IHN0b3JlZCB3aXRoIHN0KEB2YXJ7dmFyfSwgQHZhcntleHByfSkuCiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbG9hZGVkIHZhbHVlLgogCitAaXRlbSBsZXJwKHgsIHksIHopCitSZXR1cm4gbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiBAdmFye3h9IGFuZCBAdmFye3l9IGJ5IGFtb3VudCBvZiBAdmFye3p9LgorCiBAaXRlbSBsb2coeCkKIENvbXB1dGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgQHZhcnt4fS4KIApAQCAtODY5LDcgKzg4MCw3IEBACiBSZXR1cm4gdGhlIG1heGltdW0gYmV0d2VlbiBAdmFye3h9IGFuZCBAdmFye3l9LgogCiBAaXRlbSBtaW4oeCwgeSkKLVJldHVybiB0aGUgbWF4aW11bSBiZXR3ZWVuIEB2YXJ7eH0gYW5kIEB2YXJ7eX0uCitSZXR1cm4gdGhlIG1pbmltdW0gYmV0d2VlbiBAdmFye3h9IGFuZCBAdmFye3l9LgogCiBAaXRlbSBtb2QoeCwgeSkKIENvbXB1dGUgdGhlIHJlbWFpbmRlciBvZiBkaXZpc2lvbiBvZiBAdmFye3h9IGJ5IEB2YXJ7eX0uCkBAIC05MDYsNiArOTE3LDkgQEAKIEBjb2Rle2xkKDApfS4gV2hlbiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gMCB0aGVuIHRoZQogY29ycmVzcG9uZGluZyBpbnB1dCB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLgogCitAaXRlbSByb3VuZChleHByKQorUm91bmQgdGhlIHZhbHVlIG9mIGV4cHJlc3Npb24gQHZhcntleHByfSB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLiBGb3IgZXhhbXBsZSwgInJvdW5kKDEuNSkiIGlzICIyLjAiLgorCiBAaXRlbSBzaW4oeCkKIENvbXB1dGUgc2luZSBvZiBAdmFye3h9LgogCkBAIC0xMDQzLDMzICsxMDU3LDMgQEAKIEBlbmQgdGFibGUKIAogQGMgbWFuIGVuZCBFWFBSRVNTSU9OIEVWQUxVQVRJT04KLQotQGNoYXB0ZXIgT3BlbkNMIE9wdGlvbnMKLUBjIG1hbiBiZWdpbiBPUEVOQ0wgT1BUSU9OUwotCi1XaGVuIEZGbXBlZyBpcyBjb25maWd1cmVkIHdpdGggQGNvZGV7LS1lbmFibGUtb3BlbmNsfSwgaXQgaXMgcG9zc2libGUKLXRvIHNldCB0aGUgb3B0aW9ucyBmb3IgdGhlIGdsb2JhbCBPcGVuQ0wgY29udGV4dC4KLQotVGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIG9wdGlvbnMgZm9sbG93czoKLQotQHRhYmxlIEBvcHRpb24KLUBpdGVtIGJ1aWxkX29wdGlvbnMKLVNldCBidWlsZCBvcHRpb25zIHVzZWQgdG8gY29tcGlsZSB0aGUgcmVnaXN0ZXJlZCBrZXJuZWxzLgotCi1TZWUgcmVmZXJlbmNlICJPcGVuQ0wgU3BlY2lmaWNhdGlvbiBWZXJzaW9uOiAxLjIgY2hhcHRlciA1LjYuNCIuCi0KLUBpdGVtIHBsYXRmb3JtX2lkeAotU2VsZWN0IHRoZSBpbmRleCBvZiB0aGUgcGxhdGZvcm0gdG8gcnVuIE9wZW5DTCBjb2RlLgotCi1UaGUgc3BlY2lmaWVkIGluZGV4IG11c3QgYmUgb25lIG9mIHRoZSBpbmRleGVzIGluIHRoZSBkZXZpY2UgbGlzdAotd2hpY2ggY2FuIGJlIG9idGFpbmVkIHdpdGggQGNvZGV7ZmZtcGVnIC1vcGVuY2xfYmVuY2h9IG9yIEBjb2Rle2F2X29wZW5jbF9nZXRfZGV2aWNlX2xpc3QoKX0uCi0KLUBpdGVtIGRldmljZV9pZHgKLVNlbGVjdCB0aGUgaW5kZXggb2YgdGhlIGRldmljZSB1c2VkIHRvIHJ1biBPcGVuQ0wgY29kZS4KLQotVGhlIHNwZWNpZmllZCBpbmRleCBtdXN0IGJlIG9uZSBvZiB0aGUgaW5kZXhlcyBpbiB0aGUgZGV2aWNlIGxpc3Qgd2hpY2gKLWNhbiBiZSBvYnRhaW5lZCB3aXRoIEBjb2Rle2ZmbXBlZyAtb3BlbmNsX2JlbmNofSBvciBAY29kZXthdl9vcGVuY2xfZ2V0X2RldmljZV9saXN0KCl9LgotCi1AZW5kIHRhYmxlCi0KLUBjIG1hbiBlbmQgT1BFTkNMIE9QVElPTlMKZGlmZiAtLWdpdCBhL2RvYy93cml0aW5nX2ZpbHRlcnMudHh0IGIvZG9jL3dyaXRpbmdfZmlsdGVycy50eHQKaW5kZXggNjZlYmI1My4uOThiOWM2ZiAxMDA2NDQKLS0tIGEvZG9jL3dyaXRpbmdfZmlsdGVycy50eHQKKysrIGIvZG9jL3dyaXRpbmdfZmlsdGVycy50eHQKQEAgLTMxLDIxICszMSwxOSBAQAogVGhhdCdzIGl0LCB5b3VyIG5ldyBwbGF5Z3JvdW5kIGlzIHJlYWR5LgogCiBTb21lIGxpdHRsZSBkZXRhaWxzIGFib3V0IHdoYXQncyBnb2luZyBvbjoKLWxpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYzphdmZpbHRlcl9yZWdpc3Rlcl9hbGwoKSBpcyBjYWxsZWQgYXQgcnVudGltZSB0byBjcmVhdGUKLWEgbGlzdCBvZiB0aGUgYXZhaWxhYmxlIGZpbHRlcnMsIGJ1dCBpdCdzIGltcG9ydGFudCB0byBrbm93IHRoYXQgdGhpcyBmaWxlIGlzCi1hbHNvIHBhcnNlZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCwgd2hpY2ggaW4gdHVybiB3aWxsIGRlZmluZSB2YXJpYWJsZXMgZm9yCi10aGUgYnVpbGQgc3lzdGVtIGFuZCB0aGUgQzoKK2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYzp0aGlzIGZpbGUgaXMgcGFyc2VkIGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0LCB3aGljaCBpbiB0dXJuCit3aWxsIGRlZmluZSB2YXJpYWJsZXMgZm9yIHRoZSBidWlsZCBzeXN0ZW0gYW5kIHRoZSBDOgogCiAgICAgLS0tIGFmdGVyIHJ1bm5pbmcgY29uZmlndXJlIC0tLQogCi0gICAgJCBncmVwIEZPT0JBUiBjb25maWcubWFrCisgICAgJCBncmVwIEZPT0JBUiBmZmJ1aWxkL2NvbmZpZy5tYWsKICAgICBDT05GSUdfRk9PQkFSX0ZJTFRFUj15ZXMKICAgICAkIGdyZXAgRk9PQkFSIGNvbmZpZy5oCiAgICAgI2RlZmluZSBDT05GSUdfRk9PQkFSX0ZJTFRFUiAxCiAKLUNPTkZJR19GT09CQVJfRklMVEVSPXllcyBmcm9tIHRoZSBjb25maWcubWFrIGlzIGxhdGVyIHVzZWQgdG8gZW5hYmxlIHRoZSBmaWx0ZXIgaW4KLWxpYmF2ZmlsdGVyL01ha2VmaWxlIGFuZCBDT05GSUdfRk9PQkFSX0ZJTFRFUj0xIGZyb20gdGhlIGNvbmZpZy5oIHdpbGwgYmUgdXNlZAotZm9yIHJlZ2lzdGVyaW5nIHRoZSBmaWx0ZXIgaW4gbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jLgorQ09ORklHX0ZPT0JBUl9GSUxURVI9eWVzIGZyb20gdGhlIGZmYnVpbGQvY29uZmlnLm1hayBpcyBsYXRlciB1c2VkIHRvIGVuYWJsZQordGhlIGZpbHRlciBpbiBsaWJhdmZpbHRlci9NYWtlZmlsZSBhbmQgQ09ORklHX0ZPT0JBUl9GSUxURVI9MSBmcm9tIHRoZSBjb25maWcuaAord2lsbCBiZSB1c2VkIGZvciByZWdpc3RlcmluZyB0aGUgZmlsdGVyIGluIGxpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYy4KIAogRmlsdGVyIGNvZGUgbGF5b3V0CiA9PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2ZmYnVpbGQvYXJjaC5tYWsgYi9mZmJ1aWxkL2FyY2gubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwOTAwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9mZmJ1aWxkL2FyY2gubWFrCkBAIC0wLDAgKzEsMTcgQEAKK09CSlMtJChIQVZFX0FSTVY1VEUpICs9ICQoQVJNVjVURS1PQkpTKSAkKEFSTVY1VEUtT0JKUy15ZXMpCitPQkpTLSQoSEFWRV9BUk1WNikgICArPSAkKEFSTVY2LU9CSlMpICAgJChBUk1WNi1PQkpTLXllcykKK09CSlMtJChIQVZFX0FSTVY4KSAgICs9ICQoQVJNVjgtT0JKUykgICAkKEFSTVY4LU9CSlMteWVzKQorT0JKUy0kKEhBVkVfVkZQKSAgICAgKz0gJChWRlAtT0JKUykgICAgICQoVkZQLU9CSlMteWVzKQorT0JKUy0kKEhBVkVfTkVPTikgICAgKz0gJChORU9OLU9CSlMpICAgICQoTkVPTi1PQkpTLXllcykKKworT0JKUy0kKEhBVkVfTUlQU0ZQVSkgICArPSAkKE1JUFNGUFUtT0JKUykgICAgJChNSVBTRlBVLU9CSlMteWVzKQorT0JKUy0kKEhBVkVfTUlQU0RTUCkgICArPSAkKE1JUFNEU1AtT0JKUykgICAgJChNSVBTRFNQLU9CSlMteWVzKQorT0JKUy0kKEhBVkVfTUlQU0RTUFIyKSArPSAkKE1JUFNEU1BSMi1PQkpTKSAgJChNSVBTRFNQUjItT0JKUy15ZXMpCitPQkpTLSQoSEFWRV9NU0EpICAgICAgICs9ICQoTVNBLU9CSlMpICAgICAgICAkKE1TQS1PQkpTLXllcykKK09CSlMtJChIQVZFX01NSSkgICArPSAkKE1NSS1PQkpTKSAgICQoTU1JLU9CSlMteWVzKQorCitPQkpTLSQoSEFWRV9BTFRJVkVDKSArPSAkKEFMVElWRUMtT0JKUykgJChBTFRJVkVDLU9CSlMteWVzKQorT0JKUy0kKEhBVkVfVlNYKSAgICAgKz0gJChWU1gtT0JKUykgJChWU1gtT0JKUy15ZXMpCisKK09CSlMtJChIQVZFX01NWCkgICAgICs9ICQoTU1YLU9CSlMpICAgICAkKE1NWC1PQkpTLXllcykKK09CSlMtJChIQVZFX1g4NkFTTSkgICs9ICQoWDg2QVNNLU9CSlMpICAkKFg4NkFTTS1PQkpTLXllcykKZGlmZiAtLWdpdCBhL2ZmYnVpbGQvY29tbW9uLm1hayBiL2ZmYnVpbGQvY29tbW9uLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQxYjA1Ci0tLSAvZGV2L251bGwKKysrIGIvZmZidWlsZC9jb21tb24ubWFrCkBAIC0wLDAgKzEsMTc2IEBACisjCisjIGNvbW1vbiBiaXRzIHVzZWQgYnkgYWxsIGxpYnJhcmllcworIworCitERUZBVUxUX1g4NkFTTUQ9LmRiZworCitpZmVxICgkKERCRyksMSkKK1g4NkFTTUQ9JChERUZBVUxUX1g4NkFTTUQpCitlbHNlCitYODZBU01EPQorZW5kaWYKKworaWZuZGVmIFNVQkRJUgorCitpZm5kZWYgVgorUSAgICAgID0gQAorRUNITyAgID0gcHJpbnRmICIkKDEpXHQlc1xuIiAkKDIpCitCUklFRiAgPSBDQyBDWFggT0JKQ0MgSE9TVENDIEhPU1RMRCBBUyBYODZBU00gQVIgTEQgU1RSSVAgQ1AgV0lORFJFUyBOVkNDCitTSUxFTlQgPSBERVBDQyBERVBIT1NUQ0MgREVQQVMgREVQWDg2QVNNIFJBTkxJQiBSTQorCitNU0cgICAgPSAkQAorTSAgICAgID0gQCQoY2FsbCBFQ0hPLCQoVEFHKSwkQCk7CiskKGZvcmVhY2ggVkFSLCQoQlJJRUYpLCBcCisgICAgJChldmFsIG92ZXJyaWRlICQoVkFSKSA9IEAkJChjYWxsIEVDSE8sJChWQVIpLCQkKE1TRykpOyAkKCQoVkFSKSkpKQorJChmb3JlYWNoIFZBUiwkKFNJTEVOVCksJChldmFsIG92ZXJyaWRlICQoVkFSKSA9IEAkKCQoVkFSKSkpKQorJChldmFsIElOU1RBTEwgPSBAJChjYWxsIEVDSE8sSU5TVEFMTCwkJCheOiQoU1JDX0RJUikvJT0lKSk7ICQoSU5TVEFMTCkpCitlbmRpZgorCitBTExGRkxJQlMgPSBhdmNvZGVjIGF2ZGV2aWNlIGF2ZmlsdGVyIGF2Zm9ybWF0IGF2cmVzYW1wbGUgYXZ1dGlsIHBvc3Rwcm9jIHN3c2NhbGUgc3dyZXNhbXBsZQorCisjIE5BU00gcmVxdWlyZXMgLUkgcGF0aCB0ZXJtaW5hdGVkIHdpdGggLworSUZMQUdTICAgICA6PSAtSS4gLUkkKFNSQ19MSU5LKS8KK0NQUEZMQUdTICAgOj0gJChJRkxBR1MpICQoQ1BQRkxBR1MpCitDRkxBR1MgICAgICs9ICQoRUNGTEFHUykKK0NDRkxBR1MgICAgID0gJChDUFBGTEFHUykgJChDRkxBR1MpCitPQkpDRkxBR1MgICs9ICQoRU9CSkNGTEFHUykKK09CSkNDRkxBR1MgID0gJChDUFBGTEFHUykgJChDRkxBR1MpICQoT0JKQ0ZMQUdTKQorQVNGTEFHUyAgICA6PSAkKENQUEZMQUdTKSAkKEFTRkxBR1MpCitDWFhGTEFHUyAgIDo9ICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKENYWEZMQUdTKQorWDg2QVNNRkxBR1MgKz0gJChJRkxBR1M6JT0lLykgLUkkKDxEKS8gLVBjb25maWcuYXNtCitOVkNDRkxBR1MgICs9IC1wdHgKKworSE9TVENDRkxBR1MgPSAkKElGTEFHUykgJChIT1NUQ1BQRkxBR1MpICQoSE9TVENGTEFHUykKK0xERkxBR1MgICAgOj0gJChBTExGRkxJQlM6JT0kKExEX1BBVEgpbGliJSkgJChMREZMQUdTKQorCitkZWZpbmUgQ09NUElMRQorICAgICAgICQoY2FsbCAkKDEpREVQLCQoMSkpCisgICAgICAgJCgkKDEpKSAkKCQoMSlGTEFHUykgJCgkKDEpX0RFUEZMQUdTKSAkKCQoMSlfQykgJCgkKDEpX08pICQocGF0c3Vic3QgJChTUkNfUEFUSCkvJSwkKFNSQ19MSU5LKS8lLCQ8KQorZW5kZWYKKworQ09NUElMRV9DID0gJChjYWxsIENPTVBJTEUsQ0MpCitDT01QSUxFX0NYWCA9ICQoY2FsbCBDT01QSUxFLENYWCkKK0NPTVBJTEVfUyA9ICQoY2FsbCBDT01QSUxFLEFTKQorQ09NUElMRV9NID0gJChjYWxsIENPTVBJTEUsT0JKQ0MpCitDT01QSUxFX1g4NkFTTSA9ICQoY2FsbCBDT01QSUxFLFg4NkFTTSkKK0NPTVBJTEVfSE9TVEMgPSAkKGNhbGwgQ09NUElMRSxIT1NUQ0MpCitDT01QSUxFX05WQ0MgPSAkKGNhbGwgQ09NUElMRSxOVkNDKQorCislLm86ICUuYworCSQoQ09NUElMRV9DKQorCislLm86ICUuY3BwCisJJChDT01QSUxFX0NYWCkKKworJS5vOiAlLm0KKwkkKENPTVBJTEVfTSkKKworJS5zOiAlLmMKKwkkKENDKSAkKENDRkxBR1MpIC1TIC1vICRAICQ8CisKKyUubzogJS5TCisJJChDT01QSUxFX1MpCisKKyVfaG9zdC5vOiAlLmMKKwkkKENPTVBJTEVfSE9TVEMpCisKKyUkKERFRkFVTFRfWDg2QVNNRCkuYXNtOiAlLmFzbQorCSQoREVQWDg2QVNNKSAkKFg4NkFTTUZMQUdTKSAtTSAtbyAkQCAkPCA+ICQoQDouYXNtPS5kKQorCSQoWDg2QVNNKSAkKFg4NkFTTUZMQUdTKSAtZSAkPCB8IHNlZCAnL14lL2Q7L14kJC9kOycgPiAkQAorCislLm86ICUuYXNtCisJJChDT01QSUxFX1g4NkFTTSkKKwktJChpZiAkKEFTTVNUUklQRkxBR1MpLCAkKFNUUklQKSAkKEFTTVNUUklQRkxBR1MpICRAKQorCislLm86ICUucmMKKwkkKFdJTkRSRVMpICQoSUZMQUdTKSAtLXByZXByb2Nlc3NvciAiJChERVBXSU5EUkVTKSAtRSAteGMtaGVhZGVyIC1EUkNfSU5WT0tFRCAkKENDX0RFUEZMQUdTKSIgLW8gJEAgJDwKKworJS5pOiAlLmMKKwkkKENDKSAkKENDRkxBR1MpICQoQ0NfRSkgJDwKKworJS5oLmM6CisJJChRKWVjaG8gJyNpbmNsdWRlICIkKi5oIicgPiRACisKKyUucHR4OiAlLmN1CisJJChDT01QSUxFX05WQ0MpCisKKyUucHR4LmM6ICUucHR4CisJJChRKXNoICQoU1JDX1BBVEgpL2NvbXBhdC9jdWRhL3B0eDJjLnNoICRAICQocGF0c3Vic3QgJChTUkNfUEFUSCkvJSwkKFNSQ19MSU5LKS8lLCQ8KQorCislLmMgJS5oICUucGMgJS52ZXIgJS52ZXJzaW9uOiBUQUcgPSBHRU4KKworIyBEdW1teSBydWxlIHRvIHN0b3AgbWFrZSB0cnlpbmcgdG8gcmVidWlsZCByZW1vdmVkIG9yIHJlbmFtZWQgaGVhZGVycworJS5oOgorCUA6CisKKyMgRGlzYWJsZSBzdWZmaXggcnVsZXMuICBNb3N0IG9mIHRoZSBidWlsdGluIHJ1bGVzIGFyZSBzdWZmaXggcnVsZXMsCisjIHNvIHRoaXMgc2F2ZXMgc29tZSB0aW1lIG9uIHNsb3cgc3lzdGVtcy4KKy5TVUZGSVhFUzoKKworIyBEbyBub3QgZGVsZXRlIGludGVybWVkaWF0ZSBmaWxlcyBmcm9tIGNoYWlucyBvZiBpbXBsaWNpdCBydWxlcworJChPQkpTKToKK2VuZGlmCisKK2luY2x1ZGUgJChTUkNfUEFUSCkvZmZidWlsZC9hcmNoLm1haworCitPQkpTICAgICAgKz0gJChPQkpTLXllcykKK1NMSUJPQkpTICArPSAkKFNMSUJPQkpTLXllcykKK0ZGTElCUyAgICA6PSAkKCQoTkFNRSlfRkZMSUJTKSAkKEZGTElCUy15ZXMpICQoRkZMSUJTKQorVEVTVFBST0dTICs9ICQoVEVTVFBST0dTLXllcykKKworTERMSUJTICAgICAgID0gJChGRkxJQlM6JT0lJChCVUlMRFNVRikpCitGRkVYVFJBTElCUyA6PSAkKExETElCUzolPSQoTERfTElCKSkgJChmb3JlYWNoIGxpYixFWFRSQUxJQlMtJChOQU1FKSAkKEZGTElCUzolPUVYVFJBTElCUy0lKSwkKCQobGliKSkpICQoRVhUUkFMSUJTKQorCitPQkpTICAgICAgOj0gJChzb3J0ICQoT0JKUzolPSQoU1VCRElSKSUpKQorU0xJQk9CSlMgIDo9ICQoc29ydCAkKFNMSUJPQkpTOiU9JChTVUJESVIpJSkpCitURVNUT0JKUyAgOj0gJChURVNUT0JKUzolPSQoU1VCRElSKXRlc3RzLyUpICQoVEVTVFBST0dTOiU9JChTVUJESVIpdGVzdHMvJS5vKQorVEVTVFBST0dTIDo9ICQoVEVTVFBST0dTOiU9JChTVUJESVIpdGVzdHMvJSQoRVhFU1VGKSkKK0hPU1RPQkpTICA6PSAkKEhPU1RQUk9HUzolPSQoU1VCRElSKSUubykKK0hPU1RQUk9HUyA6PSAkKEhPU1RQUk9HUzolPSQoU1VCRElSKSUkKEhPU1RFWEVTVUYpKQorVE9PTFMgICAgICs9ICQoVE9PTFMteWVzKQorVE9PTE9CSlMgIDo9ICQoVE9PTFM6JT10b29scy8lLm8pCitUT09MUyAgICAgOj0gJChUT09MUzolPXRvb2xzLyUkKEVYRVNVRikpCitIRUFERVJTICAgKz0gJChIRUFERVJTLXllcykKKworUEFUSF9MSUJOQU1FID0gJChmb3JlYWNoIE5BTUUsJCgxKSxsaWIkKE5BTUUpLyQoJCgyKUxJQk5BTUUpKQorREVQX0xJQlMgOj0gJChmb3JlYWNoIGxpYiwkKEZGTElCUyksJChjYWxsIFBBVEhfTElCTkFNRSwkKGxpYiksJChDT05GSUdfU0hBUkVEOnllcz1TKSkpCitTVEFUSUNfREVQX0xJQlMgOj0gJChmb3JlYWNoIGxpYiwkKEZGTElCUyksJChjYWxsIFBBVEhfTElCTkFNRSwkKGxpYikpKQorCitTUkNfRElSICAgIDo9ICQoU1JDX1BBVEgpL2xpYiQoTkFNRSkKK0FMTEhFQURFUlMgOj0gJChzdWJzdCAkKFNSQ19ESVIpLywkKFNVQkRJUiksJCh3aWxkY2FyZCAkKFNSQ19ESVIpLyouaCAkKFNSQ19ESVIpLyQoQVJDSCkvKi5oKSkKK1NLSVBIRUFERVJTICs9ICQoQVJDSF9IRUFERVJTOiU9JChBUkNIKS8lKSAkKFNLSVBIRUFERVJTLSkKK1NLSVBIRUFERVJTIDo9ICQoU0tJUEhFQURFUlM6JT0kKFNVQkRJUiklKQorSE9CSlMgICAgICAgID0gJChmaWx0ZXItb3V0ICQoU0tJUEhFQURFUlM6Lmg9LmgubyksJChBTExIRUFERVJTOi5oPS5oLm8pKQorUFRYT0JKUyAgICAgID0gJChmaWx0ZXIgJS5wdHgubywkKE9CSlMpKQorJChIT0JKUyk6ICAgICBDQ0ZMQUdTICs9ICQoQ0ZMQUdTX0hFQURFUlMpCitjaGVja2hlYWRlcnM6ICQoSE9CSlMpCisuU0VDT05EQVJZOiAgICQoSE9CSlM6Lm89LmMpICQoUFRYT0JKUzoubz0uYykgJChQVFhPQkpTOi5vPSkKKworYWxsdG9vbHM6ICQoVE9PTFMpCisKKyQoSE9TVE9CSlMpOiAlLm86ICUuYworCSQoQ09NUElMRV9IT1NUQykKKworJChIT1NUUFJPR1MpOiAlJChIT1NURVhFU1VGKTogJS5vCisJJChIT1NUTEQpICQoSE9TVExERkxBR1MpICQoSE9TVExEX08pICReICQoSE9TVEVYVFJBTElCUykKKworJChPQkpTKTogICAgIHwgJChzb3J0ICQoZGlyICQoT0JKUykpKQorJChIT0JKUyk6ICAgIHwgJChzb3J0ICQoZGlyICQoSE9CSlMpKSkKKyQoSE9TVE9CSlMpOiB8ICQoc29ydCAkKGRpciAkKEhPU1RPQkpTKSkpCiskKFNMSUJPQkpTKTogfCAkKHNvcnQgJChkaXIgJChTTElCT0JKUykpKQorJChURVNUT0JKUyk6IHwgJChzb3J0ICQoZGlyICQoVEVTVE9CSlMpKSkKKyQoVE9PTE9CSlMpOiB8IHRvb2xzCisKK09CSkRJUlMgOj0gJChPQkpESVJTKSAkKGRpciAkKE9CSlMpICQoSE9CSlMpICQoSE9TVE9CSlMpICQoU0xJQk9CSlMpICQoVEVTVE9CSlMpKQorCitDTEVBTlNVRkZJWEVTICAgICA9ICouZCAqLmdjZGEgKi5nY25vICouaC5jICouaG8gKi5tYXAgKi5vICoucGMgKi5wdHggKi5wdHguYyAqLnZlciAqLnZlcnNpb24gKiQoREVGQVVMVF9YODZBU01EKS5hc20gKn4KK0xJQlNVRkZJWEVTICAgICAgID0gKi5hICoubGliICouc28gKi5zby4qICouZHlsaWIgKi5kbGwgKi5kZWYgKi5kbGwuYQorCitkZWZpbmUgUlVMRVMKK2NsZWFuOjoKKwkkKFJNKSAkKEhPU1RQUk9HUykgJChURVNUUFJPR1MpICQoVE9PTFMpCitlbmRlZgorCiskKGV2YWwgJChSVUxFUykpCisKKy1pbmNsdWRlICQod2lsZGNhcmQgJChPQkpTOi5vPS5kKSAkKEhPU1RPQkpTOi5vPS5kKSAkKFRFU1RPQkpTOi5vPS5kKSAkKEhPQkpTOi5vPS5kKSAkKFNMSUJPQkpTOi5vPS5kKSkgJChPQkpTOi5vPSQoREVGQVVMVF9YODZBU01EKS5kKQpkaWZmIC0tZ2l0IGEvZmZidWlsZC9saWJyYXJ5Lm1hayBiL2ZmYnVpbGQvbGlicmFyeS5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyYmFjYgotLS0gL2Rldi9udWxsCisrKyBiL2ZmYnVpbGQvbGlicmFyeS5tYWsKQEAgLTAsMCArMSwxMDcgQEAKK2luY2x1ZGUgJChTUkNfUEFUSCkvZmZidWlsZC9jb21tb24ubWFrCisKK2lmZXEgKCwkKGZpbHRlciAlY2xlYW4gY29uZmlnLCQoTUFLRUNNREdPQUxTKSkpCistaW5jbHVkZSAkKFNVQkRJUilsaWIkKE5BTUUpLnZlcnNpb24KK2VuZGlmCisKK0xJQlZFUlNJT04gOj0gJChsaWIkKE5BTUUpX1ZFUlNJT04pCitMSUJNQUpPUiAgIDo9ICQobGliJChOQU1FKV9WRVJTSU9OX01BSk9SKQorTElCTUlOT1IgICA6PSAkKGxpYiQoTkFNRSlfVkVSU0lPTl9NSU5PUikKK0lOQ0lOU1RESVIgOj0gJChJTkNESVIpL2xpYiQoTkFNRSkKKworSU5TVEhFQURFUlMgOj0gJChJTlNUSEVBREVSUykgJChIRUFERVJTOiU9JChTVUJESVIpJSkKKworYWxsLSQoQ09ORklHX1NUQVRJQyk6ICQoU1VCRElSKSQoTElCTkFNRSkgICQoU1VCRElSKWxpYiQoRlVMTE5BTUUpLnBjCithbGwtJChDT05GSUdfU0hBUkVEKTogJChTVUJESVIpJChTTElCTkFNRSkgJChTVUJESVIpbGliJChGVUxMTkFNRSkucGMKKworTElCT0JKUyA6PSAkKE9CSlMpICQoU1VCRElSKSUuaC5vICQoVEVTVE9CSlMpCiskKExJQk9CSlMpICQoTElCT0JKUzoubz0ucykgJChMSUJPQkpTOi5vPS5pKTogICBDUFBGTEFHUyArPSAtREhBVkVfQVZfQ09ORklHX0gKKworJChTVUJESVIpJChMSUJOQU1FKTogJChPQkpTKQorCSQoUk0pICRACisJJChBUikgJChBUkZMQUdTKSAkKEFSX08pICReCisJJChSQU5MSUIpICRACisKK2luc3RhbGwtaGVhZGVyczogaW5zdGFsbC1saWIkKE5BTUUpLWhlYWRlcnMgaW5zdGFsbC1saWIkKE5BTUUpLXBrZ2NvbmZpZworCitpbnN0YWxsLWxpYnMtJChDT05GSUdfU1RBVElDKTogaW5zdGFsbC1saWIkKE5BTUUpLXN0YXRpYworaW5zdGFsbC1saWJzLSQoQ09ORklHX1NIQVJFRCk6IGluc3RhbGwtbGliJChOQU1FKS1zaGFyZWQKKworZGVmaW5lIFJVTEVTCiskKFRPT0xTKTogICAgIFRISVNMSUIgPSAkKEZVTExOQU1FOiU9JChMRF9MSUIpKQorJChURVNUUFJPR1MpOiBUSElTTElCID0gJChTVUJESVIpJChMSUJOQU1FKQorCiskKExJQk9CSlMpOiBDUFBGTEFHUyArPSAtREJVSUxESU5HXyQoTkFNRSkKKworJChURVNUUFJPR1MpICQoVE9PTFMpOiAlJChFWEVTVUYpOiAlLm8KKwkkJChMRCkgJChMREZMQUdTKSAkKExERVhFRkxBR1MpICQkKExEX08pICQkKGZpbHRlciAlLm8sJCReKSAkJChUSElTTElCKSAkKEZGRVhUUkFMSUJTKSAkJChFWFRSQUxJQlMtJCQoKkYpKSAkJChFTElCUykKKworJChTVUJESVIpbGliJChOQU1FKS52ZXJzaW9uOiAkKFNVQkRJUil2ZXJzaW9uLmggfCAkKFNVQkRJUikKKwkkJChNKSAkJChTUkNfUEFUSCkvZmZidWlsZC9saWJ2ZXJzaW9uLnNoICQoTkFNRSkgJCQ8ID4gJCRACisKKyQoU1VCRElSKWxpYiQoRlVMTE5BTUUpLnBjOiAkKFNVQkRJUil2ZXJzaW9uLmggZmZidWlsZC9jb25maWcuc2ggfCAkKFNVQkRJUikKKwkkJChNKSAkJChTUkNfUEFUSCkvZmZidWlsZC9wa2djb25maWdfZ2VuZXJhdGUuc2ggJChOQU1FKSAiJChERVNDKSIKKworJChTVUJESVIpbGliJChOQU1FKS52ZXI6ICQoU1VCRElSKWxpYiQoTkFNRSkudiAkKE9CSlMpCisJJCQoTSlzZWQgJ3MvTUFKT1IvJChsaWIkKE5BTUUpX1ZFUlNJT05fTUFKT1IpLycgJCQ8IHwgJChWRVJTSU9OX1NDUklQVF9QT1NUUFJPQ0VTU19DTUQpID4gJCRACisKKyQoU1VCRElSKSQoU0xJQk5BTUUpOiAkKFNVQkRJUikkKFNMSUJOQU1FX1dJVEhfTUFKT1IpCisJJChRKWNkIC4vJChTVUJESVIpICYmICQoTE5fUykgJChTTElCTkFNRV9XSVRIX01BSk9SKSAkKFNMSUJOQU1FKQorCiskKFNVQkRJUikkKFNMSUJOQU1FX1dJVEhfTUFKT1IpOiAkKE9CSlMpICQoU0xJQk9CSlMpICQoU1VCRElSKWxpYiQoTkFNRSkudmVyCisJJChTTElCX0NSRUFURV9ERUZfQ01EKQorCSQkKExEKSAkKFNIRkxBR1MpICQoTERGTEFHUykgJChMRFNPRkxBR1MpICQkKExEX08pICQkKGZpbHRlciAlLm8sJCReKSAkKEZGRVhUUkFMSUJTKQorCSQoU0xJQl9FWFRSQV9DTUQpCisKK2lmZGVmIFNVQkRJUgorJChTVUJESVIpJChTTElCTkFNRV9XSVRIX01BSk9SKTogJChERVBfTElCUykKK2VuZGlmCisKK2NsZWFuOjoKKwkkKFJNKSAkKGFkZHByZWZpeCAkKFNVQkRJUiksJChDTEVBTkZJTEVTKSAkKENMRUFOU1VGRklYRVMpICQoTElCU1VGRklYRVMpKSBcCisJICAgICQoQ0xFQU5TVUZGSVhFUzolPSQoU1VCRElSKSQoQVJDSCkvJSkgJChDTEVBTlNVRkZJWEVTOiU9JChTVUJESVIpdGVzdHMvJSkKKworaW5zdGFsbC1saWIkKE5BTUUpLXNoYXJlZDogJChTVUJESVIpJChTTElCTkFNRSkKKwkkKFEpbWtkaXIgLXAgIiQoU0hMSUJESVIpIgorCSQkKElOU1RBTEwpIC1tIDc1NSAkJDwgIiQoU0hMSUJESVIpLyQoU0xJQl9JTlNUQUxMX05BTUUpIgorCSQkKFNUUklQKSAiJChTSExJQkRJUikvJChTTElCX0lOU1RBTExfTkFNRSkiCisJJChRKSQoZm9yZWFjaCBGLCQoU0xJQl9JTlNUQUxMX0xJTktTKSwoY2QgIiQoU0hMSUJESVIpIiAmJiAkKExOX1MpICQoU0xJQl9JTlNUQUxMX05BTUUpICQoRikpOykKKwkkKGlmICQoU0xJQl9JTlNUQUxMX0VYVFJBX1NITElCKSwkJChJTlNUQUxMKSAtbSA2NDQgJChTTElCX0lOU1RBTExfRVhUUkFfU0hMSUI6JT0kKFNVQkRJUiklKSAiJChTSExJQkRJUikiKQorCSQoaWYgJChTTElCX0lOU1RBTExfRVhUUkFfTElCKSwkKFEpbWtkaXIgLXAgIiQoTElCRElSKSIpCisJJChpZiAkKFNMSUJfSU5TVEFMTF9FWFRSQV9MSUIpLCQkKElOU1RBTEwpIC1tIDY0NCAkKFNMSUJfSU5TVEFMTF9FWFRSQV9MSUI6JT0kKFNVQkRJUiklKSAiJChMSUJESVIpIikKKworaW5zdGFsbC1saWIkKE5BTUUpLXN0YXRpYzogJChTVUJESVIpJChMSUJOQU1FKQorCSQoUSlta2RpciAtcCAiJChMSUJESVIpIgorCSQkKElOU1RBTEwpIC1tIDY0NCAkJDwgIiQoTElCRElSKSIKKwkkKExJQl9JTlNUQUxMX0VYVFJBX0NNRCkKKworaW5zdGFsbC1saWIkKE5BTUUpLWhlYWRlcnM6ICQoYWRkcHJlZml4ICQoU1VCRElSKSwkKEhFQURFUlMpICQoQlVJTFRfSEVBREVSUykpCisJJChRKW1rZGlyIC1wICIkKElOQ0lOU1RESVIpIgorCSQkKElOU1RBTEwpIC1tIDY0NCAkJF4gIiQoSU5DSU5TVERJUikiCisKK2luc3RhbGwtbGliJChOQU1FKS1wa2djb25maWc6ICQoU1VCRElSKWxpYiQoRlVMTE5BTUUpLnBjCisJJChRKW1rZGlyIC1wICIkKFBLR0NPTkZJR0RJUikiCisJJCQoSU5TVEFMTCkgLW0gNjQ0ICQkXiAiJChQS0dDT05GSUdESVIpIgorCit1bmluc3RhbGwtbGliczo6CisJLSQoUk0pICIkKFNITElCRElSKS8kKFNMSUJOQU1FX1dJVEhfTUFKT1IpIiBcCisJICAgICAgICIkKFNITElCRElSKS8kKFNMSUJOQU1FKSIgICAgICAgICAgICBcCisJICAgICAgICIkKFNITElCRElSKS8kKFNMSUJOQU1FX1dJVEhfVkVSU0lPTikiCisJLSQoUk0pICAkKFNMSUJfSU5TVEFMTF9FWFRSQV9TSExJQjolPSIkKFNITElCRElSKS8lIikKKwktJChSTSkgICQoU0xJQl9JTlNUQUxMX0VYVFJBX0xJQjolPSIkKExJQkRJUikvJSIpCisJLSQoUk0pICIkKExJQkRJUikvJChMSUJOQU1FKSIKKwordW5pbnN0YWxsLWhlYWRlcnM6OgorCSQoUk0pICQoYWRkcHJlZml4ICIkKElOQ0lOU1RESVIpLyIsJChIRUFERVJTKSAkKEJVSUxUX0hFQURFUlMpKQorCS1ybWRpciAiJChJTkNJTlNURElSKSIKKwordW5pbnN0YWxsLXBrZ2NvbmZpZzo6CisJJChSTSkgIiQoUEtHQ09ORklHRElSKS9saWIkKEZVTExOQU1FKS5wYyIKK2VuZGVmCisKKyQoZXZhbCAkKFJVTEVTKSkKKworJChUT09MUyk6ICAgICAkKERFUF9MSUJTKSAkKFNVQkRJUikkKCQoQ09ORklHX1NIQVJFRDp5ZXM9UylMSUJOQU1FKQorJChURVNUUFJPR1MpOiAkKERFUF9MSUJTKSAkKFNVQkRJUikkKExJQk5BTUUpCisKK3Rlc3Rwcm9nczogJChURVNUUFJPR1MpCmRpZmYgLS1naXQgYS9mZmJ1aWxkL2xpYnZlcnNpb24uc2ggYi9mZmJ1aWxkL2xpYnZlcnNpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTkwY2U5ZgotLS0gL2Rldi9udWxsCisrKyBiL2ZmYnVpbGQvbGlidmVyc2lvbi5zaApAQCAtMCwwICsxLDEzIEBACit0b3VwcGVyKCl7CisgICAgZWNobyAiJEAiIHwgdHIgYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXogQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoKK30KKworbmFtZT1saWIkMQordWNuYW1lPSQodG91cHBlciAke25hbWV9KQorZmlsZT0kMgorCitldmFsICQoYXdrICIvI2RlZmluZSAke3VjbmFtZX1fVkVSU0lPTl9NLyB7IHByaW50IFwkMiBcIj1cIiBcJDMgfSIgIiRmaWxlIikKK2V2YWwgJHt1Y25hbWV9X1ZFUlNJT049XCQke3VjbmFtZX1fVkVSU0lPTl9NQUpPUi5cJCR7dWNuYW1lfV9WRVJTSU9OX01JTk9SLlwkJHt1Y25hbWV9X1ZFUlNJT05fTUlDUk8KK2V2YWwgZWNobyAiJHtuYW1lfV9WRVJTSU9OPVwkJHt1Y25hbWV9X1ZFUlNJT04iCitldmFsIGVjaG8gIiR7bmFtZX1fVkVSU0lPTl9NQUpPUj1cJCR7dWNuYW1lfV9WRVJTSU9OX01BSk9SIgorZXZhbCBlY2hvICIke25hbWV9X1ZFUlNJT05fTUlOT1I9XCQke3VjbmFtZX1fVkVSU0lPTl9NSU5PUiIKZGlmZiAtLWdpdCBhL2ZmYnVpbGQvcGtnY29uZmlnX2dlbmVyYXRlLnNoIGIvZmZidWlsZC9wa2djb25maWdfZ2VuZXJhdGUuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTVkZTY3MQotLS0gL2Rldi9udWxsCisrKyBiL2ZmYnVpbGQvcGtnY29uZmlnX2dlbmVyYXRlLnNoCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9zaAorCisuIGZmYnVpbGQvY29uZmlnLnNoCisKK2lmIHRlc3QgIiRzaGFyZWQiID0gInllcyI7IHRoZW4KKyAgICBzaGFyZWQ9dHJ1ZQorZWxzZQorICAgIHNoYXJlZD1mYWxzZQorZmkKKworc2hvcnRuYW1lPSQxCituYW1lPWxpYiR7c2hvcnRuYW1lfQorZnVsbG5hbWU9JHtuYW1lfSR7YnVpbGRfc3VmZml4fQorY29tbWVudD0kMgorbGlicz0kKGV2YWwgZWNobyBcJGV4dHJhbGlic18ke3Nob3J0bmFtZX0pCitkZXBzPSQoZXZhbCBlY2hvIFwkJHtzaG9ydG5hbWV9X2RlcHMpCisKK2ZvciBkZXAgaW4gJGRlcHM7IGRvCisgICAgZGVwbmFtZT1saWIke2RlcH0KKyAgICBmdWxsZGVwbmFtZT0ke2RlcG5hbWV9JHtidWlsZF9zdWZmaXh9CisgICAgLiAke2RlcG5hbWV9LyR7ZGVwbmFtZX0udmVyc2lvbgorICAgIGRlcHZlcnNpb249JChldmFsIGVjaG8gXCQke2RlcG5hbWV9X1ZFUlNJT04pCisgICAgcmVxdWlyZXM9IiRyZXF1aXJlcyAke2Z1bGxkZXBuYW1lfSA+PSAke2RlcHZlcnNpb259LCAiCitkb25lCityZXF1aXJlcz0ke3JlcXVpcmVzJSwgfQorCit2ZXJzaW9uPSQoZ3JlcCAke25hbWV9X1ZFUlNJT049ICRuYW1lLyR7bmFtZX0udmVyc2lvbiB8IGN1dCAtZD0gLWYyKQorCitjYXQgPDxFT0YgPiAkbmFtZS8kZnVsbG5hbWUucGMKK3ByZWZpeD0kcHJlZml4CitleGVjX3ByZWZpeD1cJHtwcmVmaXh9CitsaWJkaXI9JGxpYmRpcgoraW5jbHVkZWRpcj0kaW5jZGlyCisKK05hbWU6ICRmdWxsbmFtZQorRGVzY3JpcHRpb246ICRjb21tZW50CitWZXJzaW9uOiAkdmVyc2lvbgorUmVxdWlyZXM6ICQoJHNoYXJlZCB8fCBlY2hvICRyZXF1aXJlcykKK1JlcXVpcmVzLnByaXZhdGU6ICQoJHNoYXJlZCAmJiBlY2hvICRyZXF1aXJlcykKK0NvbmZsaWN0czoKK0xpYnM6IC1MXCR7bGliZGlyfSAkcnBhdGggLWwke2Z1bGxuYW1lI2xpYn0gJCgkc2hhcmVkIHx8IGVjaG8gJGxpYnMpCitMaWJzLnByaXZhdGU6ICQoJHNoYXJlZCAmJiBlY2hvICRsaWJzKQorQ2ZsYWdzOiAtSVwke2luY2x1ZGVkaXJ9CitFT0YKKworbWtkaXIgLXAgZG9jL2V4YW1wbGVzL3BjLXVuaW5zdGFsbGVkCitpbmNsdWRlZGlyPSR7c291cmNlX3BhdGh9CitbICIkaW5jbHVkZWRpciIgPSAuIF0gJiYgaW5jbHVkZWRpcj0iXCR7cGNmaWxlZGlyfS8uLi8uLi8uLiIKKyAgICBjYXQgPDxFT0YgPiBkb2MvZXhhbXBsZXMvcGMtdW5pbnN0YWxsZWQvJHtuYW1lfS11bmluc3RhbGxlZC5wYworcHJlZml4PQorZXhlY19wcmVmaXg9CitsaWJkaXI9XCR7cGNmaWxlZGlyfS8uLi8uLi8uLi8kbmFtZQoraW5jbHVkZWRpcj0ke3NvdXJjZV9wYXRofQorCitOYW1lOiAkZnVsbG5hbWUKK0Rlc2NyaXB0aW9uOiAkY29tbWVudAorVmVyc2lvbjogJHZlcnNpb24KK1JlcXVpcmVzOiAkcmVxdWlyZXMKK0NvbmZsaWN0czoKK0xpYnM6IC1MXCR7bGliZGlyfSAtV2wsLXJwYXRoLFwke2xpYmRpcn0gLWwke2Z1bGxuYW1lI2xpYn0gJCgkc2hhcmVkIHx8IGVjaG8gJGxpYnMpCitDZmxhZ3M6IC1JXCR7aW5jbHVkZWRpcn0KK0VPRgpkaWZmIC0tZ2l0IGEvZmZidWlsZC92ZXJzaW9uLnNoIGIvZmZidWlsZC92ZXJzaW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVkYzRkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9mZmJ1aWxkL3ZlcnNpb24uc2gKQEAgLTAsMCArMSw2MyBAQAorIyEvYmluL3NoCisKKyMgVXNhZ2U6IHZlcnNpb24uc2ggPGZmbXBlZy1yb290LWRpcj4gPG91dHB1dC12ZXJzaW9uLmg+IDxleHRyYS12ZXJzaW9uPgorCisjIGNoZWNrIGZvciBnaXQgc2hvcnQgaGFzaAoraWYgISB0ZXN0ICIkcmV2aXNpb24iOyB0aGVuCisgICAgaWYgKGNkICIkMSIgJiYgZ3JlcCBnaXQgUkVMRUFTRSAyPiAvZGV2L251bGwgPi9kZXYvbnVsbCkgOyB0aGVuCisgICAgICAgIHJldmlzaW9uPSQoY2QgIiQxIiAmJiBnaXQgZGVzY3JpYmUgLS10YWdzIC0tbWF0Y2ggTiAyPiAvZGV2L251bGwpCisgICAgZWxzZQorICAgICAgICByZXZpc2lvbj0kKGNkICIkMSIgJiYgZ2l0IGRlc2NyaWJlIC0tdGFncyAtLWFsd2F5cyAyPiAvZGV2L251bGwpCisgICAgZmkKK2ZpCisKKyMgU2hhbGxvdyBHaXQgY2xvbmVzICgtLWRlcHRoKSBkbyBub3QgaGF2ZSB0aGUgTiB0YWc6CisjIHVzZSAnZ2l0LVlZWVktTU0tREQtaGhoaGhoaCcuCit0ZXN0ICIkcmV2aXNpb24iIHx8IHJldmlzaW9uPSQoY2QgIiQxIiAmJgorICBnaXQgbG9nIC0xIC0tcHJldHR5PWZvcm1hdDoiZ2l0LSVjZC0laCIgLS1kYXRlPXNob3J0IDI+IC9kZXYvbnVsbCkKKworIyBTbmFwc2hvdHMgZnJvbSBnaXR3ZWIgYXJlIGluIGEgZGlyZWN0b3J5IGNhbGxlZCBmZm1wZWctaGhoaGhoaCBvcgorIyBmZm1wZWctSEVBRC1oaGhoaGhoLgoraWYgWyAteiAiJHJldmlzaW9uIiBdOyB0aGVuCisgIHNyY2Rpcj0kKGNkICIkMSIgJiYgcHdkKQorICBjYXNlICIkc3JjZGlyIiBpbgorICAgICovZmZtcGVnLVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdKQorICAgICAgZ2l0X2hhc2g9IiR7c3JjZGlyIyMqLX0iOzsKKyAgICAqL2ZmbXBlZy1IRUFELVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdKQorICAgICAgZ2l0X2hhc2g9IiR7c3JjZGlyIyMqLX0iOzsKKyAgZXNhYworZmkKKworIyBubyByZXZpc2lvbiBudW1iZXIgZm91bmQKK3Rlc3QgIiRyZXZpc2lvbiIgfHwgcmV2aXNpb249JChjZCAiJDEiICYmIGNhdCBSRUxFQVNFIDI+IC9kZXYvbnVsbCkKKworIyBBcHBlbmQgdGhlIEdpdCBoYXNoIGlmIHdlIGhhdmUgb25lCit0ZXN0ICIkcmV2aXNpb24iICYmIHRlc3QgIiRnaXRfaGFzaCIgJiYgcmV2aXNpb249IiRyZXZpc2lvbi0kZ2l0X2hhc2giCisKKyMgcmVsZWFzZXMgZXh0cmFjdCB0aGUgdmVyc2lvbiBudW1iZXIgZnJvbSB0aGUgVkVSU0lPTiBmaWxlCit2ZXJzaW9uPSQoY2QgIiQxIiAmJiBjYXQgVkVSU0lPTiAyPiAvZGV2L251bGwpCit0ZXN0ICIkdmVyc2lvbiIgfHwgdmVyc2lvbj0kcmV2aXNpb24KKwordGVzdCAtbiAiJDMiICYmIHZlcnNpb249JHZlcnNpb24tJDMKKworaWYgWyAteiAiJDIiIF07IHRoZW4KKyAgICBlY2hvICIkdmVyc2lvbiIKKyAgICBleGl0CitmaQorCitORVdfUkVWSVNJT049IiNkZWZpbmUgRkZNUEVHX1ZFUlNJT04gXCIkdmVyc2lvblwiIgorT0xEX1JFVklTSU9OPSQoY2F0ICIkMiIgMj4gL2Rldi9udWxsIHwgaGVhZCAtNCB8IHRhaWwgLTEpCisKKyMgU3RyaW5nIHVzZWQgZm9yIHByZXByb2Nlc3NvciBndWFyZAorR1VBUkQ9JChlY2hvICIkMiIgfCBzZWQgJ3MvXC8vXy8nIHwgc2VkICdzL1wuL18vJyB8IHRyICdbOmxvd2VyOl0nICdbOnVwcGVyOl0nIHwgc2VkICdzL0xJQi8vJykKKworIyBVcGRhdGUgdmVyc2lvbiBoZWFkZXIgb25seSBvbiByZXZpc2lvbiBjaGFuZ2VzIHRvIGF2b2lkIHNwdXJpb3VzIHJlYnVpbGRzCitpZiB0ZXN0ICIkTkVXX1JFVklTSU9OIiAhPSAiJE9MRF9SRVZJU0lPTiI7IHRoZW4KKyAgICBjYXQgPDwgRU9GID4gIiQyIgorLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdmVyc2lvbi5zaCwgZG8gbm90IG1hbnVhbGx5IGVkaXQhICovCisjaWZuZGVmICRHVUFSRAorI2RlZmluZSAkR1VBUkQKKyRORVdfUkVWSVNJT04KKyNlbmRpZiAvKiAkR1VBUkQgKi8KK0VPRgorZmkKZGlmZiAtLWdpdCBhL2ZmbXBlZy5jIGIvZmZtcGVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZWMzYzMuLjAwMDAwMDAKLS0tIGEvZmZtcGVnLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBGYWJyaWNlIEJlbGxhcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogbXVsdGltZWRpYSBjb252ZXJ0ZXIgYmFzZWQgb24gdGhlIEZGbXBlZyBsaWJyYXJpZXMKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2lmIEhBVkVfSU9fSAotI2luY2x1ZGUgPGlvLmg+Ci0jZW5kaWYKLSNpZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCi0jaW5jbHVkZSAibGliYXZkZXZpY2UvYXZkZXZpY2UuaCIKLSNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9tYXRob3BzLmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvb3Nfc3VwcG9ydC5oIgotCi0jIGluY2x1ZGUgImxpYmF2ZmlsdGVyL2F2ZmlsdGVyLmgiCi0jIGluY2x1ZGUgImxpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oIgotIyBpbmNsdWRlICJsaWJhdmZpbHRlci9idWZmZXJzaW5rLmgiCi0KLSNpZiBIQVZFX1NZU19SRVNPVVJDRV9ICi0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KLSNlbGlmIEhBVkVfR0VUUFJPQ0VTU1RJTUVTCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0jaWYgSEFWRV9HRVRQUk9DRVNTTUVNT1JZSU5GTwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDxwc2FwaS5oPgotI2VuZGlmCi0jaWYgSEFWRV9TRVRDT05TT0xFQ1RSTEhBTkRMRVIKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotCi0jaWYgSEFWRV9TWVNfU0VMRUNUX0gKLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jZW5kaWYKLQotI2lmIEhBVkVfVEVSTUlPU19ICi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgotI2luY2x1ZGUgPHRlcm1pb3MuaD4KLSNlbGlmIEhBVkVfS0JISVQKLSNpbmNsdWRlIDxjb25pby5oPgotI2VuZGlmCi0KLSNpZiBIQVZFX1BUSFJFQURTCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlICJmZm1wZWcuaCIKLSNpbmNsdWRlICJjbWR1dGlscy5oIgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0KLWNvbnN0IGNoYXIgcHJvZ3JhbV9uYW1lW10gPSAiZmZtcGVnIjsKLWNvbnN0IGludCBwcm9ncmFtX2JpcnRoX3llYXIgPSAyMDAwOwotCi1zdGF0aWMgRklMRSAqdnN0YXRzX2ZpbGU7Ci0KLWNvbnN0IGNoYXIgKmNvbnN0IGZvcmNlZF9rZXlmcmFtZXNfY29uc3RfbmFtZXNbXSA9IHsKLSAgICAibiIsCi0gICAgIm5fZm9yY2VkIiwKLSAgICAicHJldl9mb3JjZWRfbiIsCi0gICAgInByZXZfZm9yY2VkX3QiLAotICAgICJ0IiwKLSAgICBOVUxMCi19OwotCi1zdGF0aWMgdm9pZCBkb192aWRlb19zdGF0cyhPdXRwdXRTdHJlYW0gKm9zdCwgaW50IGZyYW1lX3NpemUpOwotc3RhdGljIGludDY0X3QgZ2V0dXRpbWUodm9pZCk7Ci1zdGF0aWMgaW50NjRfdCBnZXRtYXhyc3Modm9pZCk7Ci0KLXN0YXRpYyBpbnQgcnVuX2FzX2RhZW1vbiAgPSAwOwotc3RhdGljIGludCBuYl9mcmFtZXNfZHVwID0gMDsKLXN0YXRpYyBpbnQgbmJfZnJhbWVzX2Ryb3AgPSAwOwotc3RhdGljIGludDY0X3QgZGVjb2RlX2Vycm9yX3N0YXRbMl07Ci0KLXN0YXRpYyBpbnQgY3VycmVudF90aW1lOwotQVZJT0NvbnRleHQgKnByb2dyZXNzX2F2aW8gPSBOVUxMOwotCi1zdGF0aWMgdWludDhfdCAqc3VidGl0bGVfb3V0OwotCi1JbnB1dFN0cmVhbSAqKmlucHV0X3N0cmVhbXMgPSBOVUxMOwotaW50ICAgICAgICBuYl9pbnB1dF9zdHJlYW1zID0gMDsKLUlucHV0RmlsZSAgICoqaW5wdXRfZmlsZXMgICA9IE5VTEw7Ci1pbnQgICAgICAgIG5iX2lucHV0X2ZpbGVzICAgPSAwOwotCi1PdXRwdXRTdHJlYW0gKipvdXRwdXRfc3RyZWFtcyA9IE5VTEw7Ci1pbnQgICAgICAgICBuYl9vdXRwdXRfc3RyZWFtcyA9IDA7Ci1PdXRwdXRGaWxlICAgKipvdXRwdXRfZmlsZXMgICA9IE5VTEw7Ci1pbnQgICAgICAgICBuYl9vdXRwdXRfZmlsZXMgICA9IDA7Ci0KLUZpbHRlckdyYXBoICoqZmlsdGVyZ3JhcGhzOwotaW50ICAgICAgICBuYl9maWx0ZXJncmFwaHM7Ci0KLSNpZiBIQVZFX1RFUk1JT1NfSAotCi0vKiBpbml0IHRlcm1pbmFsIHNvIHRoYXQgd2UgY2FuIGdyYWIga2V5cyAqLwotc3RhdGljIHN0cnVjdCB0ZXJtaW9zIG9sZHR0eTsKLXN0YXRpYyBpbnQgcmVzdG9yZV90dHk7Ci0jZW5kaWYKLQotI2lmIEhBVkVfUFRIUkVBRFMKLXN0YXRpYyB2b2lkIGZyZWVfaW5wdXRfdGhyZWFkcyh2b2lkKTsKLSNlbmRpZgotCi0vKiBzdWIydmlkZW8gaGFjazoKLSAgIENvbnZlcnQgc3VidGl0bGVzIHRvIHZpZGVvIHdpdGggYWxwaGEgdG8gaW5zZXJ0IHRoZW0gaW4gZmlsdGVyIGdyYXBocy4KLSAgIFRoaXMgaXMgYSB0ZW1wb3Jhcnkgc29sdXRpb24gdW50aWwgbGliYXZmaWx0ZXIgZ2V0cyByZWFsIHN1YnRpdGxlcyBzdXBwb3J0LgotICovCi0KLXN0YXRpYyBpbnQgc3ViMnZpZGVvX2dldF9ibGFua19mcmFtZShJbnB1dFN0cmVhbSAqaXN0KQotewotICAgIGludCByZXQ7Ci0gICAgQVZGcmFtZSAqZnJhbWUgPSBpc3QtPnN1YjJ2aWRlby5mcmFtZTsKLQotICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKLSAgICBpc3QtPnN1YjJ2aWRlby5mcmFtZS0+d2lkdGggID0gaXN0LT5kZWNfY3R4LT53aWR0aCAgPyBpc3QtPmRlY19jdHgtPndpZHRoICA6IGlzdC0+c3ViMnZpZGVvLnc7Ci0gICAgaXN0LT5zdWIydmlkZW8uZnJhbWUtPmhlaWdodCA9IGlzdC0+ZGVjX2N0eC0+aGVpZ2h0ID8gaXN0LT5kZWNfY3R4LT5oZWlnaHQgOiBpc3QtPnN1YjJ2aWRlby5oOwotICAgIGlzdC0+c3ViMnZpZGVvLmZyYW1lLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1JHQjMyOwotICAgIGlmICgocmV0ID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcihmcmFtZSwgMzIpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgbWVtc2V0KGZyYW1lLT5kYXRhWzBdLCAwLCBmcmFtZS0+aGVpZ2h0ICogZnJhbWUtPmxpbmVzaXplWzBdKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3ViMnZpZGVvX2NvcHlfcmVjdCh1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdWJ0aXRsZVJlY3QgKnIpCi17Ci0gICAgdWludDMyX3QgKnBhbCwgKmRzdDI7Ci0gICAgdWludDhfdCAqc3JjLCAqc3JjMjsKLSAgICBpbnQgeCwgeTsKLQotICAgIGlmIChyLT50eXBlICE9IFNVQlRJVExFX0JJVE1BUCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJzdWIydmlkZW86IG5vbi1iaXRtYXAgc3VidGl0bGVcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChyLT54IDwgMCB8fCByLT54ICsgci0+dyA+IHcgfHwgci0+eSA8IDAgfHwgci0+eSArIHItPmggPiBoKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgInN1YjJ2aWRlbzogcmVjdGFuZ2xlICglZCAlZCAlZCAlZCkgb3ZlcmZsb3dpbmcgJWQgJWRcbiIsCi0gICAgICAgICAgICByLT54LCByLT55LCByLT53LCByLT5oLCB3LCBoCi0gICAgICAgICk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkc3QgKz0gci0+eSAqIGRzdF9saW5lc2l6ZSArIHItPnggKiA0OwotICAgIHNyYyA9IHItPnBpY3QuZGF0YVswXTsKLSAgICBwYWwgPSAodWludDMyX3QgKilyLT5waWN0LmRhdGFbMV07Ci0gICAgZm9yICh5ID0gMDsgeSA8IHItPmg7IHkrKykgewotICAgICAgICBkc3QyID0gKHVpbnQzMl90ICopZHN0OwotICAgICAgICBzcmMyID0gc3JjOwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgci0+dzsgeCsrKQotICAgICAgICAgICAgKihkc3QyKyspID0gcGFsWyooc3JjMisrKV07Ci0gICAgICAgIGRzdCArPSBkc3RfbGluZXNpemU7Ci0gICAgICAgIHNyYyArPSByLT5waWN0LmxpbmVzaXplWzBdOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgc3ViMnZpZGVvX3B1c2hfcmVmKElucHV0U3RyZWFtICppc3QsIGludDY0X3QgcHRzKQotewotICAgIEFWRnJhbWUgKmZyYW1lID0gaXN0LT5zdWIydmlkZW8uZnJhbWU7Ci0gICAgaW50IGk7Ci0KLSAgICBhdl9hc3NlcnQxKGZyYW1lLT5kYXRhWzBdKTsKLSAgICBpc3QtPnN1YjJ2aWRlby5sYXN0X3B0cyA9IGZyYW1lLT5wdHMgPSBwdHM7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlzdC0+bmJfZmlsdGVyczsgaSsrKQotICAgICAgICBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKGlzdC0+ZmlsdGVyc1tpXS0+ZmlsdGVyLCBmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJTUkNfRkxBR19LRUVQX1JFRiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQlVGRkVSU1JDX0ZMQUdfUFVTSCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHN1YjJ2aWRlb191cGRhdGUoSW5wdXRTdHJlYW0gKmlzdCwgQVZTdWJ0aXRsZSAqc3ViKQotewotICAgIEFWRnJhbWUgKmZyYW1lID0gaXN0LT5zdWIydmlkZW8uZnJhbWU7Ci0gICAgaW50OF90ICpkc3Q7Ci0gICAgaW50ICAgICBkc3RfbGluZXNpemU7Ci0gICAgaW50IG51bV9yZWN0cywgaTsKLSAgICBpbnQ2NF90IHB0cywgZW5kX3B0czsKLQotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoc3ViKSB7Ci0gICAgICAgIHB0cyAgICAgICA9IGF2X3Jlc2NhbGVfcShzdWItPnB0cyArIHN1Yi0+c3RhcnRfZGlzcGxheV90aW1lICogMTAwMExMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgIGVuZF9wdHMgICA9IGF2X3Jlc2NhbGVfcShzdWItPnB0cyArIHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSAgICogMTAwMExMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgIG51bV9yZWN0cyA9IHN1Yi0+bnVtX3JlY3RzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHB0cyAgICAgICA9IGlzdC0+c3ViMnZpZGVvLmVuZF9wdHM7Ci0gICAgICAgIGVuZF9wdHMgICA9IElOVDY0X01BWDsKLSAgICAgICAgbnVtX3JlY3RzID0gMDsKLSAgICB9Ci0gICAgaWYgKHN1YjJ2aWRlb19nZXRfYmxhbmtfZnJhbWUoaXN0KSA8IDApIHsKLSAgICAgICAgYXZfbG9nKGlzdC0+ZGVjX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkltcG9zc2libGUgdG8gZ2V0IGEgYmxhbmsgY2FudmFzLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZHN0ICAgICAgICAgID0gZnJhbWUtPmRhdGEgICAgWzBdOwotICAgIGRzdF9saW5lc2l6ZSA9IGZyYW1lLT5saW5lc2l6ZVswXTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlY3RzOyBpKyspCi0gICAgICAgIHN1YjJ2aWRlb19jb3B5X3JlY3QoZHN0LCBkc3RfbGluZXNpemUsIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgc3ViLT5yZWN0c1tpXSk7Ci0gICAgc3ViMnZpZGVvX3B1c2hfcmVmKGlzdCwgcHRzKTsKLSAgICBpc3QtPnN1YjJ2aWRlby5lbmRfcHRzID0gZW5kX3B0czsKLX0KLQotc3RhdGljIHZvaWQgc3ViMnZpZGVvX2hlYXJ0YmVhdChJbnB1dFN0cmVhbSAqaXN0LCBpbnQ2NF90IHB0cykKLXsKLSAgICBJbnB1dEZpbGUgKmluZmlsZSA9IGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF07Ci0gICAgaW50IGksIGosIG5iX3JlcXM7Ci0gICAgaW50NjRfdCBwdHMyOwotCi0gICAgLyogV2hlbiBhIGZyYW1lIGlzIHJlYWQgZnJvbSBhIGZpbGUsIGV4YW1pbmUgYWxsIHN1YjJ2aWRlbyBzdHJlYW1zIGluCi0gICAgICAgdGhlIHNhbWUgZmlsZSBhbmQgc2VuZCB0aGUgc3ViMnZpZGVvIGZyYW1lIGFnYWluLiBPdGhlcndpc2UsIGRlY29kZWQKLSAgICAgICB2aWRlbyBmcmFtZXMgY291bGQgYmUgYWNjdW11bGF0aW5nIGluIHRoZSBmaWx0ZXIgZ3JhcGggd2hpbGUgYSBmaWx0ZXIKLSAgICAgICAocG9zc2libHkgb3ZlcmxheSkgaXMgZGVzcGVyYXRlbHkgd2FpdGluZyBmb3IgYSBzdWJ0aXRsZSBmcmFtZS4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5maWxlLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gKmlzdDIgPSBpbnB1dF9zdHJlYW1zW2luZmlsZS0+aXN0X2luZGV4ICsgaV07Ci0gICAgICAgIGlmICghaXN0Mi0+c3ViMnZpZGVvLmZyYW1lKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIC8qIHN1YnRpdGxlcyBzZWVtIHRvIGJlIHVzdWFsbHkgbXV4ZWQgYWhlYWQgb2Ygb3RoZXIgc3RyZWFtczsKLSAgICAgICAgICAgaWYgbm90LCBzdWJ0cmFjdGluZyBhIGxhcmdlciB0aW1lIGhlcmUgaXMgbmVjZXNzYXJ5ICovCi0gICAgICAgIHB0czIgPSBhdl9yZXNjYWxlX3EocHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIGlzdDItPnN0LT50aW1lX2Jhc2UpIC0gMTsKLSAgICAgICAgLyogZG8gbm90IHNlbmQgdGhlIGhlYXJ0YmVhdCBmcmFtZSBpZiB0aGUgc3VidGl0bGUgaXMgYWxyZWFkeSBhaGVhZCAqLwotICAgICAgICBpZiAocHRzMiA8PSBpc3QyLT5zdWIydmlkZW8ubGFzdF9wdHMpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHB0czIgPj0gaXN0Mi0+c3ViMnZpZGVvLmVuZF9wdHMgfHwgIWlzdDItPnN1YjJ2aWRlby5mcmFtZS0+ZGF0YVswXSkKLSAgICAgICAgICAgIHN1YjJ2aWRlb191cGRhdGUoaXN0MiwgTlVMTCk7Ci0gICAgICAgIGZvciAoaiA9IDAsIG5iX3JlcXMgPSAwOyBqIDwgaXN0Mi0+bmJfZmlsdGVyczsgaisrKQotICAgICAgICAgICAgbmJfcmVxcyArPSBhdl9idWZmZXJzcmNfZ2V0X25iX2ZhaWxlZF9yZXF1ZXN0cyhpc3QyLT5maWx0ZXJzW2pdLT5maWx0ZXIpOwotICAgICAgICBpZiAobmJfcmVxcykKLSAgICAgICAgICAgIHN1YjJ2aWRlb19wdXNoX3JlZihpc3QyLCBwdHMyKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHN1YjJ2aWRlb19mbHVzaChJbnB1dFN0cmVhbSAqaXN0KQotewotICAgIGludCBpOwotCi0gICAgaWYgKGlzdC0+c3ViMnZpZGVvLmVuZF9wdHMgPCBJTlQ2NF9NQVgpCi0gICAgICAgIHN1YjJ2aWRlb191cGRhdGUoaXN0LCBOVUxMKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXN0LT5uYl9maWx0ZXJzOyBpKyspCi0gICAgICAgIGF2X2J1ZmZlcnNyY19hZGRfZnJhbWUoaXN0LT5maWx0ZXJzW2ldLT5maWx0ZXIsIE5VTEwpOwotfQotCi0vKiBlbmQgb2Ygc3ViMnZpZGVvIGhhY2sgKi8KLQotc3RhdGljIHZvaWQgdGVybV9leGl0X3NpZ3NhZmUodm9pZCkKLXsKLSNpZiBIQVZFX1RFUk1JT1NfSAotICAgIGlmKHJlc3RvcmVfdHR5KQotICAgICAgICB0Y3NldGF0dHIgKDAsIFRDU0FOT1csICZvbGR0dHkpOwotI2VuZGlmCi19Ci0KLXZvaWQgdGVybV9leGl0KHZvaWQpCi17Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19RVUlFVCwgIiVzIiwgIiIpOwotICAgIHRlcm1fZXhpdF9zaWdzYWZlKCk7Ci19Ci0KLXN0YXRpYyB2b2xhdGlsZSBpbnQgcmVjZWl2ZWRfc2lndGVybSA9IDA7Ci1zdGF0aWMgdm9sYXRpbGUgaW50IHJlY2VpdmVkX25iX3NpZ25hbHMgPSAwOwotc3RhdGljIHZvbGF0aWxlIGludCB0cmFuc2NvZGVfaW5pdF9kb25lID0gMDsKLXN0YXRpYyB2b2xhdGlsZSBpbnQgZmZtcGVnX2V4aXRlZCA9IDA7Ci1zdGF0aWMgaW50IG1haW5fcmV0dXJuX2NvZGUgPSAwOwotCi1zdGF0aWMgdm9pZAotc2lndGVybV9oYW5kbGVyKGludCBzaWcpCi17Ci0gICAgcmVjZWl2ZWRfc2lndGVybSA9IHNpZzsKLSAgICByZWNlaXZlZF9uYl9zaWduYWxzKys7Ci0gICAgdGVybV9leGl0X3NpZ3NhZmUoKTsKLSAgICBpZihyZWNlaXZlZF9uYl9zaWduYWxzID4gMykgewotICAgICAgICB3cml0ZSgyLypTVERFUlJfRklMRU5PKi8sICJSZWNlaXZlZCA+IDMgc3lzdGVtIHNpZ25hbHMsIGhhcmQgZXhpdGluZ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbigiUmVjZWl2ZWQgPiAzIHN5c3RlbSBzaWduYWxzLCBoYXJkIGV4aXRpbmdcbiIpKTsKLQotICAgICAgICBleGl0KDEyMyk7Ci0gICAgfQotfQotCi0jaWYgSEFWRV9TRVRDT05TT0xFQ1RSTEhBTkRMRVIKLXN0YXRpYyBCT09MIFdJTkFQSSBDdHJsSGFuZGxlcihEV09SRCBmZHdDdHJsVHlwZSkKLXsKLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiXG5SZWNlaXZlZCB3aW5kb3dzIHNpZ25hbCAlbGRcbiIsIGZkd0N0cmxUeXBlKTsKLQotICAgIHN3aXRjaCAoZmR3Q3RybFR5cGUpCi0gICAgewotICAgIGNhc2UgQ1RSTF9DX0VWRU5UOgotICAgIGNhc2UgQ1RSTF9CUkVBS19FVkVOVDoKLSAgICAgICAgc2lndGVybV9oYW5kbGVyKFNJR0lOVCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgY2FzZSBDVFJMX0NMT1NFX0VWRU5UOgotICAgIGNhc2UgQ1RSTF9MT0dPRkZfRVZFTlQ6Ci0gICAgY2FzZSBDVFJMX1NIVVRET1dOX0VWRU5UOgotICAgICAgICBzaWd0ZXJtX2hhbmRsZXIoU0lHVEVSTSk7Ci0gICAgICAgIC8qIEJhc2ljYWxseSwgd2l0aCB0aGVzZSAzIGV2ZW50cywgd2hlbiB3ZSByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZCB0aGUKLSAgICAgICAgICAgcHJvY2VzcyBpcyBoYXJkIHRlcm1pbmF0ZWQsIHNvIHN0YWxsIGFzIGxvbmcgYXMgd2UgbmVlZCB0bwotICAgICAgICAgICB0byB0cnkgYW5kIGxldCB0aGUgbWFpbiB0aHJlYWQocykgY2xlYW4gdXAgYW5kIGdyYWNlZnVsbHkgdGVybWluYXRlCi0gICAgICAgICAgICh3ZSBoYXZlIGF0IG1vc3QgNSBzZWNvbmRzLCBidXQgc2hvdWxkIGJlIGRvbmUgZmFyIGJlZm9yZSB0aGF0KS4gKi8KLSAgICAgICAgd2hpbGUgKCFmZm1wZWdfZXhpdGVkKSB7Ci0gICAgICAgICAgICBTbGVlcCgwKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJSZWNlaXZlZCB1bmtub3duIHdpbmRvd3Mgc2lnbmFsICVsZFxuIiwgZmR3Q3RybFR5cGUpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotI2VuZGlmCi0KLXZvaWQgdGVybV9pbml0KHZvaWQpCi17Ci0jaWYgSEFWRV9URVJNSU9TX0gKLSAgICBpZighcnVuX2FzX2RhZW1vbil7Ci0gICAgICAgIHN0cnVjdCB0ZXJtaW9zIHR0eTsKLSAgICAgICAgaWYgKHRjZ2V0YXR0ciAoMCwgJnR0eSkgPT0gMCkgewotICAgICAgICAgICAgb2xkdHR5ID0gdHR5OwotICAgICAgICAgICAgcmVzdG9yZV90dHkgPSAxOwotCi0gICAgICAgICAgICB0dHkuY19pZmxhZyAmPSB+KElHTkJSS3xCUktJTlR8UEFSTVJLfElTVFJJUAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8SU5MQ1J8SUdOQ1J8SUNSTkx8SVhPTik7Ci0gICAgICAgICAgICB0dHkuY19vZmxhZyB8PSBPUE9TVDsKLSAgICAgICAgICAgIHR0eS5jX2xmbGFnICY9IH4oRUNIT3xFQ0hPTkx8SUNBTk9OfElFWFRFTik7Ci0gICAgICAgICAgICB0dHkuY19jZmxhZyAmPSB+KENTSVpFfFBBUkVOQik7Ci0gICAgICAgICAgICB0dHkuY19jZmxhZyB8PSBDUzg7Ci0gICAgICAgICAgICB0dHkuY19jY1tWTUlOXSA9IDE7Ci0gICAgICAgICAgICB0dHkuY19jY1tWVElNRV0gPSAwOwotCi0gICAgICAgICAgICB0Y3NldGF0dHIgKDAsIFRDU0FOT1csICZ0dHkpOwotICAgICAgICB9Ci0gICAgICAgIHNpZ25hbChTSUdRVUlULCBzaWd0ZXJtX2hhbmRsZXIpOyAvKiBRdWl0IChQT1NJWCkuICAqLwotICAgIH0KLSNlbmRpZgotCi0gICAgc2lnbmFsKFNJR0lOVCAsIHNpZ3Rlcm1faGFuZGxlcik7IC8qIEludGVycnVwdCAoQU5TSSkuICAgICovCi0gICAgc2lnbmFsKFNJR1RFUk0sIHNpZ3Rlcm1faGFuZGxlcik7IC8qIFRlcm1pbmF0aW9uIChBTlNJKS4gICovCi0jaWZkZWYgU0lHWENQVQotICAgIHNpZ25hbChTSUdYQ1BVLCBzaWd0ZXJtX2hhbmRsZXIpOwotI2VuZGlmCi0jaWYgSEFWRV9TRVRDT05TT0xFQ1RSTEhBTkRMRVIKLSAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIoKFBIQU5ETEVSX1JPVVRJTkUpIEN0cmxIYW5kbGVyLCBUUlVFKTsKLSNlbmRpZgotfQotCi0vKiByZWFkIGEga2V5IHdpdGhvdXQgYmxvY2tpbmcgKi8KLXN0YXRpYyBpbnQgcmVhZF9rZXkodm9pZCkKLXsKLSAgICB1bnNpZ25lZCBjaGFyIGNoOwotI2lmIEhBVkVfVEVSTUlPU19ICi0gICAgaW50IG4gPSAxOwotICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgIGZkX3NldCByZmRzOwotCi0gICAgRkRfWkVSTygmcmZkcyk7Ci0gICAgRkRfU0VUKDAsICZyZmRzKTsKLSAgICB0di50dl9zZWMgPSAwOwotICAgIHR2LnR2X3VzZWMgPSAwOwotICAgIG4gPSBzZWxlY3QoMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7Ci0gICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgIG4gPSByZWFkKDAsICZjaCwgMSk7Ci0gICAgICAgIGlmIChuID09IDEpCi0gICAgICAgICAgICByZXR1cm4gY2g7Ci0KLSAgICAgICAgcmV0dXJuIG47Ci0gICAgfQotI2VsaWYgSEFWRV9LQkhJVAotIyAgICBpZiBIQVZFX1BFRUtOQU1FRFBJUEUKLSAgICBzdGF0aWMgaW50IGlzX3BpcGU7Ci0gICAgc3RhdGljIEhBTkRMRSBpbnB1dF9oYW5kbGU7Ci0gICAgRFdPUkQgZHcsIG5jaGFyczsKLSAgICBpZighaW5wdXRfaGFuZGxlKXsKLSAgICAgICAgaW5wdXRfaGFuZGxlID0gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOwotICAgICAgICBpc19waXBlID0gIUdldENvbnNvbGVNb2RlKGlucHV0X2hhbmRsZSwgJmR3KTsKLSAgICB9Ci0KLSAgICBpZiAoaXNfcGlwZSkgewotICAgICAgICAvKiBXaGVuIHJ1bm5pbmcgdW5kZXIgYSBHVUksIHlvdSB3aWxsIGVuZCBoZXJlLiAqLwotICAgICAgICBpZiAoIVBlZWtOYW1lZFBpcGUoaW5wdXRfaGFuZGxlLCBOVUxMLCAwLCBOVUxMLCAmbmNoYXJzLCBOVUxMKSkgewotICAgICAgICAgICAgLy8gaW5wdXQgcGlwZSBtYXkgaGF2ZSBiZWVuIGNsb3NlZCBieSB0aGUgcHJvZ3JhbSB0aGF0IHJhbiBmZm1wZWcKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICAvL1JlYWQgaXQKLSAgICAgICAgaWYobmNoYXJzICE9IDApIHsKLSAgICAgICAgICAgIHJlYWQoMCwgJmNoLCAxKTsKLSAgICAgICAgICAgIHJldHVybiBjaDsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0jICAgIGVuZGlmCi0gICAgaWYoa2JoaXQoKSkKLSAgICAgICAgcmV0dXJuKGdldGNoKCkpOwotI2VuZGlmCi0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGRlY29kZV9pbnRlcnJ1cHRfY2Iodm9pZCAqY3R4KQotewotICAgIHJldHVybiByZWNlaXZlZF9uYl9zaWduYWxzID4gdHJhbnNjb2RlX2luaXRfZG9uZTsKLX0KLQotY29uc3QgQVZJT0ludGVycnVwdENCIGludF9jYiA9IHsgZGVjb2RlX2ludGVycnVwdF9jYiwgTlVMTCB9OwotCi1zdGF0aWMgdm9pZCBmZm1wZWdfY2xlYW51cChpbnQgcmV0KQotewotICAgIGludCBpLCBqOwotCi0gICAgaWYgKGRvX2JlbmNobWFyaykgewotICAgICAgICBpbnQgbWF4cnNzID0gZ2V0bWF4cnNzKCkgLyAxMDI0OwotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJiZW5jaDogbWF4cnNzPSVpa0JcbiIsIG1heHJzcyk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX2ZpbHRlcmdyYXBoczsgaSsrKSB7Ci0gICAgICAgIEZpbHRlckdyYXBoICpmZyA9IGZpbHRlcmdyYXBoc1tpXTsKLSAgICAgICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmZmctPmdyYXBoKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGZnLT5uYl9pbnB1dHM7IGorKykgewotICAgICAgICAgICAgYXZfZnJlZXAoJmZnLT5pbnB1dHNbal0tPm5hbWUpOwotICAgICAgICAgICAgYXZfZnJlZXAoJmZnLT5pbnB1dHNbal0pOwotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyZWVwKCZmZy0+aW5wdXRzKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGZnLT5uYl9vdXRwdXRzOyBqKyspIHsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZmZy0+b3V0cHV0c1tqXS0+bmFtZSk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmZmctPm91dHB1dHNbal0pOwotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyZWVwKCZmZy0+b3V0cHV0cyk7Ci0gICAgICAgIGF2X2ZyZWVwKCZmZy0+Z3JhcGhfZGVzYyk7Ci0KLSAgICAgICAgYXZfZnJlZXAoJmZpbHRlcmdyYXBoc1tpXSk7Ci0gICAgfQotICAgIGF2X2ZyZWVwKCZmaWx0ZXJncmFwaHMpOwotCi0gICAgYXZfZnJlZXAoJnN1YnRpdGxlX291dCk7Ci0KLSAgICAvKiBjbG9zZSBmaWxlcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfZmlsZXM7IGkrKykgewotICAgICAgICBPdXRwdXRGaWxlICpvZiA9IG91dHB1dF9maWxlc1tpXTsKLSAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzOwotICAgICAgICBpZiAoIW9mKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHMgPSBvZi0+Y3R4OwotICAgICAgICBpZiAocyAmJiBzLT5vZm9ybWF0ICYmICEocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpKQotICAgICAgICAgICAgYXZpb19jbG9zZXAoJnMtPnBiKTsKLSAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHMpOwotICAgICAgICBhdl9kaWN0X2ZyZWUoJm9mLT5vcHRzKTsKLQotICAgICAgICBhdl9mcmVlcCgmb3V0cHV0X2ZpbGVzW2ldKTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjOwotCi0gICAgICAgIGlmICghb3N0KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYnNmYyA9IG9zdC0+Yml0c3RyZWFtX2ZpbHRlcnM7Ci0gICAgICAgIHdoaWxlIChic2ZjKSB7Ci0gICAgICAgICAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKm5leHQgPSBic2ZjLT5uZXh0OwotICAgICAgICAgICAgYXZfYml0c3RyZWFtX2ZpbHRlcl9jbG9zZShic2ZjKTsKLSAgICAgICAgICAgIGJzZmMgPSBuZXh0OwotICAgICAgICB9Ci0gICAgICAgIG9zdC0+Yml0c3RyZWFtX2ZpbHRlcnMgPSBOVUxMOwotICAgICAgICBhdl9mcmFtZV9mcmVlKCZvc3QtPmZpbHRlcmVkX2ZyYW1lKTsKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3N0LT5sYXN0X2ZyYW1lKTsKLQotICAgICAgICBhdl9wYXJzZXJfY2xvc2Uob3N0LT5wYXJzZXIpOwotCi0gICAgICAgIGF2X2ZyZWVwKCZvc3QtPmZvcmNlZF9rZXlmcmFtZXMpOwotICAgICAgICBhdl9leHByX2ZyZWUob3N0LT5mb3JjZWRfa2V5ZnJhbWVzX3BleHByKTsKLSAgICAgICAgYXZfZnJlZXAoJm9zdC0+YXZmaWx0ZXIpOwotICAgICAgICBhdl9mcmVlcCgmb3N0LT5sb2dmaWxlX3ByZWZpeCk7Ci0KLSAgICAgICAgYXZfZnJlZXAoJm9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwKTsKLSAgICAgICAgb3N0LT5hdWRpb19jaGFubmVsc19tYXBwZWQgPSAwOwotCi0gICAgICAgIGF2X2RpY3RfZnJlZSgmb3N0LT5zd3NfZGljdCk7Ci0KLSAgICAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJm9zdC0+ZW5jX2N0eCk7Ci0KLSAgICAgICAgYXZfZnJlZXAoJm91dHB1dF9zdHJlYW1zW2ldKTsKLSAgICB9Ci0jaWYgSEFWRV9QVEhSRUFEUwotICAgIGZyZWVfaW5wdXRfdGhyZWFkcygpOwotI2VuZGlmCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X2ZpbGVzOyBpKyspIHsKLSAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmlucHV0X2ZpbGVzW2ldLT5jdHgpOwotICAgICAgICBhdl9mcmVlcCgmaW5wdXRfZmlsZXNbaV0pOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5wdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIElucHV0U3RyZWFtICppc3QgPSBpbnB1dF9zdHJlYW1zW2ldOwotCi0gICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlzdC0+ZGVjb2RlZF9mcmFtZSk7Ci0gICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlzdC0+ZmlsdGVyX2ZyYW1lKTsKLSAgICAgICAgYXZfZGljdF9mcmVlKCZpc3QtPmRlY29kZXJfb3B0cyk7Ci0gICAgICAgIGF2c3VidGl0bGVfZnJlZSgmaXN0LT5wcmV2X3N1Yi5zdWJ0aXRsZSk7Ci0gICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlzdC0+c3ViMnZpZGVvLmZyYW1lKTsKLSAgICAgICAgYXZfZnJlZXAoJmlzdC0+ZmlsdGVycyk7Ci0gICAgICAgIGF2X2ZyZWVwKCZpc3QtPmh3YWNjZWxfZGV2aWNlKTsKLQotICAgICAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmaXN0LT5kZWNfY3R4KTsKLQotICAgICAgICBhdl9mcmVlcCgmaW5wdXRfc3RyZWFtc1tpXSk7Ci0gICAgfQotCi0gICAgaWYgKHZzdGF0c19maWxlKSB7Ci0gICAgICAgIGlmIChmY2xvc2UodnN0YXRzX2ZpbGUpKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiRXJyb3IgY2xvc2luZyB2c3RhdHMgZmlsZSwgbG9zcyBvZiBpbmZvcm1hdGlvbiBwb3NzaWJsZTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihBVkVSUk9SKGVycm5vKSkpOwotICAgIH0KLSAgICBhdl9mcmVlcCgmdnN0YXRzX2ZpbGVuYW1lKTsKLQotICAgIGF2X2ZyZWVwKCZpbnB1dF9zdHJlYW1zKTsKLSAgICBhdl9mcmVlcCgmaW5wdXRfZmlsZXMpOwotICAgIGF2X2ZyZWVwKCZvdXRwdXRfc3RyZWFtcyk7Ci0gICAgYXZfZnJlZXAoJm91dHB1dF9maWxlcyk7Ci0KLSAgICB1bmluaXRfb3B0cygpOwotCi0gICAgYXZmb3JtYXRfbmV0d29ya19kZWluaXQoKTsKLQotICAgIGlmIChyZWNlaXZlZF9zaWd0ZXJtKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIkV4aXRpbmcgbm9ybWFsbHksIHJlY2VpdmVkIHNpZ25hbCAlZC5cbiIsCi0gICAgICAgICAgICAgICAoaW50KSByZWNlaXZlZF9zaWd0ZXJtKTsKLSAgICB9IGVsc2UgaWYgKHJldCAmJiB0cmFuc2NvZGVfaW5pdF9kb25lKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIkNvbnZlcnNpb24gZmFpbGVkIVxuIik7Ci0gICAgfQotICAgIHRlcm1fZXhpdCgpOwotICAgIGZmbXBlZ19leGl0ZWQgPSAxOwotfQotCi12b2lkIHJlbW92ZV9hdm9wdGlvbnMoQVZEaWN0aW9uYXJ5ICoqYSwgQVZEaWN0aW9uYXJ5ICpiKQotewotICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKLQotICAgIHdoaWxlICgodCA9IGF2X2RpY3RfZ2V0KGIsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewotICAgICAgICBhdl9kaWN0X3NldChhLCB0LT5rZXksIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSk7Ci0gICAgfQotfQotCi12b2lkIGFzc2VydF9hdm9wdGlvbnMoQVZEaWN0aW9uYXJ5ICptKQotewotICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0OwotICAgIGlmICgodCA9IGF2X2RpY3RfZ2V0KG0sICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiT3B0aW9uICVzIG5vdCBmb3VuZC5cbiIsIHQtPmtleSk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGFib3J0X2NvZGVjX2V4cGVyaW1lbnRhbChBVkNvZGVjICpjLCBpbnQgZW5jb2RlcikKLXsKLSAgICBleGl0X3Byb2dyYW0oMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9iZW5jaG1hcmsoY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgaWYgKGRvX2JlbmNobWFya19hbGwpIHsKLSAgICAgICAgaW50NjRfdCB0ID0gZ2V0dXRpbWUoKTsKLSAgICAgICAgdmFfbGlzdCB2YTsKLSAgICAgICAgY2hhciBidWZbMTAyNF07Ci0KLSAgICAgICAgaWYgKGZtdCkgewotICAgICAgICAgICAgdmFfc3RhcnQodmEsIGZtdCk7Ci0gICAgICAgICAgICB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgZm10LCB2YSk7Ci0gICAgICAgICAgICB2YV9lbmQodmEpOwotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiYmVuY2g6ICU4IlBSSXU2NCIgJXMgXG4iLCB0IC0gY3VycmVudF90aW1lLCBidWYpOwotICAgICAgICB9Ci0gICAgICAgIGN1cnJlbnRfdGltZSA9IHQ7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjbG9zZV9hbGxfb3V0cHV0X3N0cmVhbXMoT3V0cHV0U3RyZWFtICpvc3QsIE9TVEZpbmlzaGVkIHRoaXNfc3RyZWFtLCBPU1RGaW5pc2hlZCBvdGhlcnMpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QyID0gb3V0cHV0X3N0cmVhbXNbaV07Ci0gICAgICAgIG9zdDItPmZpbmlzaGVkIHw9IG9zdCA9PSBvc3QyID8gdGhpc19zdHJlYW0gOiBvdGhlcnM7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCB3cml0ZV9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QsIE91dHB1dFN0cmVhbSAqb3N0KQotewotICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYyA9IG9zdC0+Yml0c3RyZWFtX2ZpbHRlcnM7Ci0gICAgQVZDb2RlY0NvbnRleHQgICAgICAgICAgKmF2Y3R4ID0gb3N0LT5lbmNvZGluZ19uZWVkZWQgPyBvc3QtPmVuY19jdHggOiBvc3QtPnN0LT5jb2RlYzsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKCFvc3QtPnN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgJiYgb3N0LT5lbmNfY3R4LT5leHRyYWRhdGFfc2l6ZSkgewotICAgICAgICBvc3QtPnN0LT5jb2RlYy0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihvc3QtPmVuY19jdHgtPmV4dHJhZGF0YV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgIGlmIChvc3QtPnN0LT5jb2RlYy0+ZXh0cmFkYXRhKSB7Ci0gICAgICAgICAgICBtZW1jcHkob3N0LT5zdC0+Y29kZWMtPmV4dHJhZGF0YSwgb3N0LT5lbmNfY3R4LT5leHRyYWRhdGEsIG9zdC0+ZW5jX2N0eC0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICAgICAgb3N0LT5zdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gb3N0LT5lbmNfY3R4LT5leHRyYWRhdGFfc2l6ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIHZpZGVvX3N5bmNfbWV0aG9kID09IFZTWU5DX0RST1ApIHx8Ci0gICAgICAgIChhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgYXVkaW9fc3luY19tZXRob2QgPCAwKSkKLSAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0cyA9IEFWX05PUFRTX1ZBTFVFOwotCi0gICAgLyoKLSAgICAgKiBBdWRpbyBlbmNvZGVycyBtYXkgc3BsaXQgdGhlIHBhY2tldHMgLS0gICNmcmFtZXMgaW4gIT0gI3BhY2tldHMgb3V0LgotICAgICAqIEJ1dCB0aGVyZSBpcyBubyByZW9yZGVyaW5nLCBzbyB3ZSBjYW4gbGltaXQgdGhlIG51bWJlciBvZiBvdXRwdXQgcGFja2V0cwotICAgICAqIGJ5IHNpbXBseSBkcm9wcGluZyB0aGVtIGhlcmUuCi0gICAgICogQ291bnRpbmcgZW5jb2RlZCB2aWRlbyBmcmFtZXMgbmVlZHMgdG8gYmUgZG9uZSBzZXBhcmF0ZWx5IGJlY2F1c2Ugb2YKLSAgICAgKiByZW9yZGVyaW5nLCBzZWUgZG9fdmlkZW9fb3V0KCkKLSAgICAgKi8KLSAgICBpZiAoIShhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgYXZjdHgtPmNvZGVjKSkgewotICAgICAgICBpZiAob3N0LT5mcmFtZV9udW1iZXIgPj0gb3N0LT5tYXhfZnJhbWVzKSB7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBvc3QtPmZyYW1lX251bWJlcisrOwotICAgIH0KLSAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICB1aW50OF90ICpzZCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfUVVBTElUWV9TVEFUUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgICAgb3N0LT5xdWFsaXR5ID0gc2QgPyBBVl9STDMyKHNkKSA6IC0xOwotICAgICAgICBvc3QtPnBpY3RfdHlwZSA9IHNkID8gc2RbNF0gOiBBVl9QSUNUVVJFX1RZUEVfTk9ORTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpPEZGX0FSUkFZX0VMRU1TKG9zdC0+ZXJyb3IpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChzZCAmJiBpIDwgc2RbNV0pCi0gICAgICAgICAgICAgICAgb3N0LT5lcnJvcltpXSA9IEFWX1JMNjQoc2QgKyA4ICsgOCppKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBvc3QtPmVycm9yW2ldID0gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3N0LT5mcmFtZV9yYXRlLm51bSAmJiBvc3QtPmlzX2NmcikgewotICAgICAgICAgICAgaWYgKHBrdC0+ZHVyYXRpb24gPiAwKQotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk92ZXJyaWRpbmcgcGFja2V0IGR1cmF0aW9uIGJ5IGZyYW1lIHJhdGUsIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW5cbiIpOwotICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcSgxLCBhdl9pbnZfcShvc3QtPmZyYW1lX3JhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPnN0LT50aW1lX2Jhc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGJzZmMpCi0gICAgICAgIGF2X3BhY2tldF9zcGxpdF9zaWRlX2RhdGEocGt0KTsKLQotICAgIGlmICgocmV0ID0gYXZfYXBwbHlfYml0c3RyZWFtX2ZpbHRlcnMoYXZjdHgsIHBrdCwgYnNmYykpIDwgMCkgewotICAgICAgICBwcmludF9lcnJvcigiIiwgcmV0KTsKLSAgICAgICAgaWYgKGV4aXRfb25fZXJyb3IpCi0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgaWYgKCEocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT1RJTUVTVEFNUFMpKSB7Ci0gICAgICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgotICAgICAgICAgICAgcGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKLSAgICAgICAgICAgIHBrdC0+ZHRzID4gcGt0LT5wdHMpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgRFRTOiAlIlBSSWQ2NCIgUFRTOiAlIlBSSWQ2NCIgaW4gb3V0cHV0IHN0cmVhbSAlZDolZCwgcmVwbGFjaW5nIGJ5IGd1ZXNzXG4iLAotICAgICAgICAgICAgICAgICAgIHBrdC0+ZHRzLCBwa3QtPnB0cywKLSAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+c3QtPmluZGV4KTsKLSAgICAgICAgICAgIHBrdC0+cHRzID0KLSAgICAgICAgICAgIHBrdC0+ZHRzID0gcGt0LT5wdHMgKyBwa3QtPmR0cyArIG9zdC0+bGFzdF9tdXhfZHRzICsgMQotICAgICAgICAgICAgICAgICAgICAgLSBGRk1JTjMocGt0LT5wdHMsIHBrdC0+ZHRzLCBvc3QtPmxhc3RfbXV4X2R0cyArIDEpCi0gICAgICAgICAgICAgICAgICAgICAtIEZGTUFYMyhwa3QtPnB0cywgcGt0LT5kdHMsIG9zdC0+bGFzdF9tdXhfZHRzICsgMSk7Ci0gICAgICAgIH0KLSAgICAgaWYoCi0gICAgICAgIChhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gfHwgYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSAmJgotICAgICAgICBwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgotICAgICAgICBvc3QtPmxhc3RfbXV4X2R0cyAhPSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgaW50NjRfdCBtYXggPSBvc3QtPmxhc3RfbXV4X2R0cyArICEocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9UU19OT05TVFJJQ1QpOwotICAgICAgaWYgKHBrdC0+ZHRzIDwgbWF4KSB7Ci0gICAgICAgIGludCBsb2dsZXZlbCA9IG1heCAtIHBrdC0+ZHRzID4gMiB8fCBhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gPyBBVl9MT0dfV0FSTklORyA6IEFWX0xPR19ERUJVRzsKLSAgICAgICAgYXZfbG9nKHMsIGxvZ2xldmVsLCAiTm9uLW1vbm90b25vdXMgRFRTIGluIG91dHB1dCBzdHJlYW0gIgotICAgICAgICAgICAgICAgIiVkOiVkOyBwcmV2aW91czogJSJQUklkNjQiLCBjdXJyZW50OiAlIlBSSWQ2NCI7ICIsCi0gICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+c3QtPmluZGV4LCBvc3QtPmxhc3RfbXV4X2R0cywgcGt0LT5kdHMpOwotICAgICAgICBpZiAoZXhpdF9vbl9lcnJvcikgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgImFib3J0aW5nLlxuIik7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfbG9nKHMsIGxvZ2xldmVsLCAiY2hhbmdpbmcgdG8gJSJQUklkNjQiLiBUaGlzIG1heSByZXN1bHQgIgotICAgICAgICAgICAgICAgImluIGluY29ycmVjdCB0aW1lc3RhbXBzIGluIHRoZSBvdXRwdXQgZmlsZS5cbiIsCi0gICAgICAgICAgICAgICBtYXgpOwotICAgICAgICBpZihwa3QtPnB0cyA+PSBwa3QtPmR0cykKLSAgICAgICAgICAgIHBrdC0+cHRzID0gRkZNQVgocGt0LT5wdHMsIG1heCk7Ci0gICAgICAgIHBrdC0+ZHRzID0gbWF4OwotICAgICAgfQotICAgICB9Ci0gICAgfQotICAgIG9zdC0+bGFzdF9tdXhfZHRzID0gcGt0LT5kdHM7Ci0KLSAgICBvc3QtPmRhdGFfc2l6ZSArPSBwa3QtPnNpemU7Ci0gICAgb3N0LT5wYWNrZXRzX3dyaXR0ZW4rKzsKLQotICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gb3N0LT5pbmRleDsKLQotICAgIGlmIChkZWJ1Z190cykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJtdXhlciA8LSB0eXBlOiVzICIKLSAgICAgICAgICAgICAgICAicGt0X3B0czolcyBwa3RfcHRzX3RpbWU6JXMgcGt0X2R0czolcyBwa3RfZHRzX3RpbWU6JXMgc2l6ZTolZFxuIiwKLSAgICAgICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcob3N0LT5lbmNfY3R4LT5jb2RlY190eXBlKSwKLSAgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LT5wdHMpLCBhdl90czJ0aW1lc3RyKHBrdC0+cHRzLCAmb3N0LT5zdC0+dGltZV9iYXNlKSwKLSAgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LT5kdHMpLCBhdl90czJ0aW1lc3RyKHBrdC0+ZHRzLCAmb3N0LT5zdC0+dGltZV9iYXNlKSwKLSAgICAgICAgICAgICAgICBwa3QtPnNpemUKLSAgICAgICAgICAgICAgKTsKLSAgICB9Ci0KLSAgICByZXQgPSBhdl9pbnRlcmxlYXZlZF93cml0ZV9mcmFtZShzLCBwa3QpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIHByaW50X2Vycm9yKCJhdl9pbnRlcmxlYXZlZF93cml0ZV9mcmFtZSgpIiwgcmV0KTsKLSAgICAgICAgbWFpbl9yZXR1cm5fY29kZSA9IDE7Ci0gICAgICAgIGNsb3NlX2FsbF9vdXRwdXRfc3RyZWFtcyhvc3QsIE1VWEVSX0ZJTklTSEVEIHwgRU5DT0RFUl9GSU5JU0hFRCwgRU5DT0RFUl9GSU5JU0hFRCk7Ci0gICAgfQotICAgIGF2X3BhY2tldF91bnJlZihwa3QpOwotfQotCi1zdGF0aWMgdm9pZCBjbG9zZV9vdXRwdXRfc3RyZWFtKE91dHB1dFN0cmVhbSAqb3N0KQotewotICAgIE91dHB1dEZpbGUgKm9mID0gb3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF07Ci0KLSAgICBvc3QtPmZpbmlzaGVkIHw9IEVOQ09ERVJfRklOSVNIRUQ7Ci0gICAgaWYgKG9mLT5zaG9ydGVzdCkgewotICAgICAgICBpbnQ2NF90IGVuZCA9IGF2X3Jlc2NhbGVfcShvc3QtPnN5bmNfb3B0cyAtIG9zdC0+Zmlyc3RfcHRzLCBvc3QtPmVuY19jdHgtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOwotICAgICAgICBvZi0+cmVjb3JkaW5nX3RpbWUgPSBGRk1JTihvZi0+cmVjb3JkaW5nX3RpbWUsIGVuZCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGNoZWNrX3JlY29yZGluZ190aW1lKE91dHB1dFN0cmVhbSAqb3N0KQotewotICAgIE91dHB1dEZpbGUgKm9mID0gb3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF07Ci0KLSAgICBpZiAob2YtPnJlY29yZGluZ190aW1lICE9IElOVDY0X01BWCAmJgotICAgICAgICBhdl9jb21wYXJlX3RzKG9zdC0+c3luY19vcHRzIC0gb3N0LT5maXJzdF9wdHMsIG9zdC0+ZW5jX2N0eC0+dGltZV9iYXNlLCBvZi0+cmVjb3JkaW5nX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpID49IDApIHsKLSAgICAgICAgY2xvc2Vfb3V0cHV0X3N0cmVhbShvc3QpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX2F1ZGlvX291dChBVkZvcm1hdENvbnRleHQgKnMsIE91dHB1dFN0cmVhbSAqb3N0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lKQotewotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBvc3QtPmVuY19jdHg7Ci0gICAgQVZQYWNrZXQgcGt0OwotICAgIGludCBnb3RfcGFja2V0ID0gMDsKLQotICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOwotICAgIHBrdC5kYXRhID0gTlVMTDsKLSAgICBwa3Quc2l6ZSA9IDA7Ci0KLSAgICBpZiAoIWNoZWNrX3JlY29yZGluZ190aW1lKG9zdCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChmcmFtZS0+cHRzID09IEFWX05PUFRTX1ZBTFVFIHx8IGF1ZGlvX3N5bmNfbWV0aG9kIDwgMCkKLSAgICAgICAgZnJhbWUtPnB0cyA9IG9zdC0+c3luY19vcHRzOwotICAgIG9zdC0+c3luY19vcHRzID0gZnJhbWUtPnB0cyArIGZyYW1lLT5uYl9zYW1wbGVzOwotICAgIG9zdC0+c2FtcGxlc19lbmNvZGVkICs9IGZyYW1lLT5uYl9zYW1wbGVzOwotICAgIG9zdC0+ZnJhbWVzX2VuY29kZWQrKzsKLQotICAgIGF2X2Fzc2VydDAocGt0LnNpemUgfHwgIXBrdC5kYXRhKTsKLSAgICB1cGRhdGVfYmVuY2htYXJrKE5VTEwpOwotICAgIGlmIChkZWJ1Z190cykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlbmNvZGVyIDwtIHR5cGU6YXVkaW8gIgotICAgICAgICAgICAgICAgImZyYW1lX3B0czolcyBmcmFtZV9wdHNfdGltZTolcyB0aW1lX2Jhc2U6JWQvJWRcbiIsCi0gICAgICAgICAgICAgICBhdl90czJzdHIoZnJhbWUtPnB0cyksIGF2X3RzMnRpbWVzdHIoZnJhbWUtPnB0cywgJmVuYy0+dGltZV9iYXNlKSwKLSAgICAgICAgICAgICAgIGVuYy0+dGltZV9iYXNlLm51bSwgZW5jLT50aW1lX2Jhc2UuZGVuKTsKLSAgICB9Ci0KLSAgICBpZiAoYXZjb2RlY19lbmNvZGVfYXVkaW8yKGVuYywgJnBrdCwgZnJhbWUsICZnb3RfcGFja2V0KSA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkF1ZGlvIGVuY29kaW5nIGZhaWxlZCAoYXZjb2RlY19lbmNvZGVfYXVkaW8yKVxuIik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0gICAgdXBkYXRlX2JlbmNobWFyaygiZW5jb2RlX2F1ZGlvICVkLiVkIiwgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKLQotICAgIGlmIChnb3RfcGFja2V0KSB7Ci0gICAgICAgIGF2X3BhY2tldF9yZXNjYWxlX3RzKCZwa3QsIGVuYy0+dGltZV9iYXNlLCBvc3QtPnN0LT50aW1lX2Jhc2UpOwotCi0gICAgICAgIGlmIChkZWJ1Z190cykgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiZW5jb2RlciAtPiB0eXBlOmF1ZGlvICIKLSAgICAgICAgICAgICAgICAgICAicGt0X3B0czolcyBwa3RfcHRzX3RpbWU6JXMgcGt0X2R0czolcyBwa3RfZHRzX3RpbWU6JXNcbiIsCi0gICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC5wdHMpLCBhdl90czJ0aW1lc3RyKHBrdC5wdHMsICZvc3QtPnN0LT50aW1lX2Jhc2UpLAotICAgICAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QuZHRzKSwgYXZfdHMydGltZXN0cihwa3QuZHRzLCAmb3N0LT5zdC0+dGltZV9iYXNlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZV9mcmFtZShzLCAmcGt0LCBvc3QpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZG9fc3VidGl0bGVfb3V0KEFWRm9ybWF0Q29udGV4dCAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSAqaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3VidGl0bGUgKnN1YikKLXsKLSAgICBpbnQgc3VidGl0bGVfb3V0X21heF9zaXplID0gMTAyNCAqIDEwMjQ7Ci0gICAgaW50IHN1YnRpdGxlX291dF9zaXplLCBuYiwgaTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jOwotICAgIEFWUGFja2V0IHBrdDsKLSAgICBpbnQ2NF90IHB0czsKLQotICAgIGlmIChzdWItPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiU3VidGl0bGUgcGFja2V0cyBtdXN0IGhhdmUgYSBwdHNcbiIpOwotICAgICAgICBpZiAoZXhpdF9vbl9lcnJvcikKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGVuYyA9IG9zdC0+ZW5jX2N0eDsKLQotICAgIGlmICghc3VidGl0bGVfb3V0KSB7Ci0gICAgICAgIHN1YnRpdGxlX291dCA9IGF2X21hbGxvYyhzdWJ0aXRsZV9vdXRfbWF4X3NpemUpOwotICAgICAgICBpZiAoIXN1YnRpdGxlX291dCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBzdWJ0aXRsZV9vdXRcbiIpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogTm90ZTogRFZCIHN1YnRpdGxlIG5lZWQgb25lIHBhY2tldCB0byBkcmF3IHRoZW0gYW5kIG9uZSBvdGhlcgotICAgICAgIHBhY2tldCB0byBjbGVhciB0aGVtICovCi0gICAgLyogWFhYOiBzaWduYWwgaXQgaW4gdGhlIGNvZGVjIGNvbnRleHQgPyAqLwotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRSkKLSAgICAgICAgbmIgPSAyOwotICAgIGVsc2UKLSAgICAgICAgbmIgPSAxOwotCi0gICAgLyogc2hpZnQgdGltZXN0YW1wIHRvIGhvbm9yIC1zcyBhbmQgbWFrZSBjaGVja19yZWNvcmRpbmdfdGltZSgpIHdvcmsgd2l0aCAtdCAqLwotICAgIHB0cyA9IHN1Yi0+cHRzOwotICAgIGlmIChvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XS0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgcHRzIC09IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdLT5zdGFydF90aW1lOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYjsgaSsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIHNhdmVfbnVtX3JlY3RzID0gc3ViLT5udW1fcmVjdHM7Ci0KLSAgICAgICAgb3N0LT5zeW5jX29wdHMgPSBhdl9yZXNjYWxlX3EocHRzLCBBVl9USU1FX0JBU0VfUSwgZW5jLT50aW1lX2Jhc2UpOwotICAgICAgICBpZiAoIWNoZWNrX3JlY29yZGluZ190aW1lKG9zdCkpCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgc3ViLT5wdHMgPSBwdHM7Ci0gICAgICAgIC8vIHN0YXJ0X2Rpc3BsYXlfdGltZSBpcyByZXF1aXJlZCB0byBiZSAwCi0gICAgICAgIHN1Yi0+cHRzICAgICAgICAgICAgICAgKz0gYXZfcmVzY2FsZV9xKHN1Yi0+c3RhcnRfZGlzcGxheV90aW1lLCAoQVZSYXRpb25hbCl7IDEsIDEwMDAgfSwgQVZfVElNRV9CQVNFX1EpOwotICAgICAgICBzdWItPmVuZF9kaXNwbGF5X3RpbWUgIC09IHN1Yi0+c3RhcnRfZGlzcGxheV90aW1lOwotICAgICAgICBzdWItPnN0YXJ0X2Rpc3BsYXlfdGltZSA9IDA7Ci0gICAgICAgIGlmIChpID09IDEpCi0gICAgICAgICAgICBzdWItPm51bV9yZWN0cyA9IDA7Ci0KLSAgICAgICAgb3N0LT5mcmFtZXNfZW5jb2RlZCsrOwotCi0gICAgICAgIHN1YnRpdGxlX291dF9zaXplID0gYXZjb2RlY19lbmNvZGVfc3VidGl0bGUoZW5jLCBzdWJ0aXRsZV9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGVfb3V0X21heF9zaXplLCBzdWIpOwotICAgICAgICBpZiAoaSA9PSAxKQotICAgICAgICAgICAgc3ViLT5udW1fcmVjdHMgPSBzYXZlX251bV9yZWN0czsKLSAgICAgICAgaWYgKHN1YnRpdGxlX291dF9zaXplIDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlN1YnRpdGxlIGVuY29kaW5nIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKLSAgICAgICAgcGt0LmRhdGEgPSBzdWJ0aXRsZV9vdXQ7Ci0gICAgICAgIHBrdC5zaXplID0gc3VidGl0bGVfb3V0X3NpemU7Ci0gICAgICAgIHBrdC5wdHMgID0gYXZfcmVzY2FsZV9xKHN1Yi0+cHRzLCBBVl9USU1FX0JBU0VfUSwgb3N0LT5zdC0+dGltZV9iYXNlKTsKLSAgICAgICAgcGt0LmR1cmF0aW9uID0gYXZfcmVzY2FsZV9xKHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSwgKEFWUmF0aW9uYWwpeyAxLCAxMDAwIH0sIG9zdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRSkgewotICAgICAgICAgICAgLyogWFhYOiB0aGUgcHRzIGNvcnJlY3Rpb24gaXMgaGFuZGxlZCBoZXJlLiBNYXliZSBoYW5kbGluZwotICAgICAgICAgICAgICAgaXQgaW4gdGhlIGNvZGVjIHdvdWxkIGJlIGJldHRlciAqLwotICAgICAgICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgICAgICAgICBwa3QucHRzICs9IDkwICogc3ViLT5zdGFydF9kaXNwbGF5X3RpbWU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcGt0LnB0cyArPSA5MCAqIHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZTsKLSAgICAgICAgfQotICAgICAgICBwa3QuZHRzID0gcGt0LnB0czsKLSAgICAgICAgd3JpdGVfZnJhbWUocywgJnBrdCwgb3N0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX3ZpZGVvX291dChBVkZvcm1hdENvbnRleHQgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqbmV4dF9waWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzeW5jX2lwdHMpCi17Ci0gICAgaW50IHJldCwgZm9ybWF0X3ZpZGVvX3N5bmM7Ci0gICAgQVZQYWNrZXQgcGt0OwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBvc3QtPmVuY19jdHg7Ci0gICAgQVZDb2RlY0NvbnRleHQgKm11eF9lbmMgPSBvc3QtPnN0LT5jb2RlYzsKLSAgICBpbnQgbmJfZnJhbWVzLCBuYjBfZnJhbWVzLCBpOwotICAgIGRvdWJsZSBkZWx0YSwgZGVsdGEwOwotICAgIGRvdWJsZSBkdXJhdGlvbiA9IDA7Ci0gICAgaW50IGZyYW1lX3NpemUgPSAwOwotICAgIElucHV0U3RyZWFtICppc3QgPSBOVUxMOwotICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyID0gb3N0LT5maWx0ZXItPmZpbHRlcjsKLQotICAgIGlmIChvc3QtPnNvdXJjZV9pbmRleCA+PSAwKQotICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XTsKLQotICAgIGlmIChmaWx0ZXItPmlucHV0c1swXS0+ZnJhbWVfcmF0ZS5udW0gPiAwICYmCi0gICAgICAgIGZpbHRlci0+aW5wdXRzWzBdLT5mcmFtZV9yYXRlLmRlbiA+IDApCi0gICAgICAgIGR1cmF0aW9uID0gMS8oYXZfcTJkKGZpbHRlci0+aW5wdXRzWzBdLT5mcmFtZV9yYXRlKSAqIGF2X3EyZChlbmMtPnRpbWVfYmFzZSkpOwotCi0gICAgaWYoaXN0ICYmIGlzdC0+c3QtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgJiYgaXN0LT5zdC0+Zmlyc3RfZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIG9zdC0+ZnJhbWVfcmF0ZS5udW0pCi0gICAgICAgIGR1cmF0aW9uID0gRkZNSU4oZHVyYXRpb24sIDEvKGF2X3EyZChvc3QtPmZyYW1lX3JhdGUpICogYXZfcTJkKGVuYy0+dGltZV9iYXNlKSkpOwotCi0gICAgaWYgKCFvc3QtPmZpbHRlcnNfc2NyaXB0ICYmCi0gICAgICAgICFvc3QtPmZpbHRlcnMgJiYKLSAgICAgICAgbmV4dF9waWN0dXJlICYmCi0gICAgICAgIGlzdCAmJgotICAgICAgICBscmludGYoYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbihuZXh0X3BpY3R1cmUpICogYXZfcTJkKGlzdC0+c3QtPnRpbWVfYmFzZSkgLyBhdl9xMmQoZW5jLT50aW1lX2Jhc2UpKSA+IDApIHsKLSAgICAgICAgZHVyYXRpb24gPSBscmludGYoYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbihuZXh0X3BpY3R1cmUpICogYXZfcTJkKGlzdC0+c3QtPnRpbWVfYmFzZSkgLyBhdl9xMmQoZW5jLT50aW1lX2Jhc2UpKTsKLSAgICB9Ci0KLSAgICBpZiAoIW5leHRfcGljdHVyZSkgewotICAgICAgICAvL2VuZCwgZmx1c2hpbmcKLSAgICAgICAgbmIwX2ZyYW1lcyA9IG5iX2ZyYW1lcyA9IG1pZF9wcmVkKG9zdC0+bGFzdF9uYjBfZnJhbWVzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5sYXN0X25iMF9mcmFtZXNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmxhc3RfbmIwX2ZyYW1lc1syXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGVsdGEwID0gc3luY19pcHRzIC0gb3N0LT5zeW5jX29wdHM7IC8vIGRlbHRhMCBpcyB0aGUgImRyaWZ0IiBiZXR3ZWVuIHRoZSBpbnB1dCBmcmFtZSAobmV4dF9waWN0dXJlKSBhbmQgd2hlcmUgaXQgd291bGQgZmFsbCBpbiB0aGUgb3V0cHV0LgotICAgICAgICBkZWx0YSAgPSBkZWx0YTAgKyBkdXJhdGlvbjsKLQotICAgICAgICAvKiBieSBkZWZhdWx0LCB3ZSBvdXRwdXQgYSBzaW5nbGUgZnJhbWUgKi8KLSAgICAgICAgbmIwX2ZyYW1lcyA9IDA7IC8vIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBQUkVWSU9VUyBmcmFtZSBzaG91bGQgYmUgZHVwbGljYXRlZCwgbW9zdGx5IGZvciB2YXJpYWJsZSBmcmFtZXJhdGUgKFZGUikKLSAgICAgICAgbmJfZnJhbWVzID0gMTsKLQotICAgICAgICBmb3JtYXRfdmlkZW9fc3luYyA9IHZpZGVvX3N5bmNfbWV0aG9kOwotICAgICAgICBpZiAoZm9ybWF0X3ZpZGVvX3N5bmMgPT0gVlNZTkNfQVVUTykgewotICAgICAgICAgICAgaWYoIXN0cmNtcChzLT5vZm9ybWF0LT5uYW1lLCAiYXZpIikpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRfdmlkZW9fc3luYyA9IFZTWU5DX1ZGUjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGZvcm1hdF92aWRlb19zeW5jID0gKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfVkFSSUFCTEVfRlBTKSA/ICgocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT1RJTUVTVEFNUFMpID8gVlNZTkNfUEFTU1RIUk9VR0ggOiBWU1lOQ19WRlIpIDogVlNZTkNfQ0ZSOwotICAgICAgICAgICAgaWYgKCAgIGlzdAotICAgICAgICAgICAgICAgICYmIGZvcm1hdF92aWRlb19zeW5jID09IFZTWU5DX0NGUgotICAgICAgICAgICAgICAgICYmIGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF0tPmN0eC0+bmJfc3RyZWFtcyA9PSAxCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+aW5wdXRfdHNfb2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRfdmlkZW9fc3luYyA9IFZTWU5DX1ZTQ0ZSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvcm1hdF92aWRlb19zeW5jID09IFZTWU5DX0NGUiAmJiBjb3B5X3RzKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0X3ZpZGVvX3N5bmMgPSBWU1lOQ19WU0NGUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBvc3QtPmlzX2NmciA9IChmb3JtYXRfdmlkZW9fc3luYyA9PSBWU1lOQ19DRlIgfHwgZm9ybWF0X3ZpZGVvX3N5bmMgPT0gVlNZTkNfVlNDRlIpOwotCi0gICAgICAgIGlmIChkZWx0YTAgPCAwICYmCi0gICAgICAgICAgICBkZWx0YSA+IDAgJiYKLSAgICAgICAgICAgIGZvcm1hdF92aWRlb19zeW5jICE9IFZTWU5DX1BBU1NUSFJPVUdIICYmCi0gICAgICAgICAgICBmb3JtYXRfdmlkZW9fc3luYyAhPSBWU1lOQ19EUk9QKSB7Ci0gICAgICAgICAgICBpZiAoZGVsdGEwIDwgLTAuNikgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlBhc3QgZHVyYXRpb24gJWYgdG9vIGxhcmdlXG4iLCAtZGVsdGEwKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJDbGlwcGluZyBmcmFtZSBpbiByYXRlIGNvbnZlcnNpb24gYnkgJWZcbiIsIC1kZWx0YTApOwotICAgICAgICAgICAgc3luY19pcHRzID0gb3N0LT5zeW5jX29wdHM7Ci0gICAgICAgICAgICBkdXJhdGlvbiArPSBkZWx0YTA7Ci0gICAgICAgICAgICBkZWx0YTAgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChmb3JtYXRfdmlkZW9fc3luYykgewotICAgICAgICBjYXNlIFZTWU5DX1ZTQ0ZSOgotICAgICAgICAgICAgaWYgKG9zdC0+ZnJhbWVfbnVtYmVyID09IDAgJiYgZGVsdGEwID49IDAuNSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJOb3QgZHVwbGljYXRpbmcgJWQgaW5pdGlhbCBmcmFtZXNcbiIsIChpbnQpbHJpbnRmKGRlbHRhMCkpOwotICAgICAgICAgICAgICAgIGRlbHRhID0gZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgZGVsdGEwID0gMDsKLSAgICAgICAgICAgICAgICBvc3QtPnN5bmNfb3B0cyA9IGxyaW50KHN5bmNfaXB0cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgVlNZTkNfQ0ZSOgotICAgICAgICAgICAgLy8gRklYTUUgc2V0IHRvIDAuNSBhZnRlciB3ZSBmaXggc29tZSBkdHMvcHRzIGJ1Z3MgbGlrZSBpbiBhdmlkZWMuYwotICAgICAgICAgICAgaWYgKGZyYW1lX2Ryb3BfdGhyZXNob2xkICYmIGRlbHRhIDwgZnJhbWVfZHJvcF90aHJlc2hvbGQgJiYgb3N0LT5mcmFtZV9udW1iZXIpIHsKLSAgICAgICAgICAgICAgICBuYl9mcmFtZXMgPSAwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkZWx0YSA8IC0xLjEpCi0gICAgICAgICAgICAgICAgbmJfZnJhbWVzID0gMDsKLSAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhID4gMS4xKSB7Ci0gICAgICAgICAgICAgICAgbmJfZnJhbWVzID0gbHJpbnRmKGRlbHRhKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVsdGEwID4gMS4xKQotICAgICAgICAgICAgICAgICAgICBuYjBfZnJhbWVzID0gbHJpbnRmKGRlbHRhMCAtIDAuNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBWU1lOQ19WRlI6Ci0gICAgICAgICAgICBpZiAoZGVsdGEgPD0gLTAuNikKLSAgICAgICAgICAgICAgICBuYl9mcmFtZXMgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEgPiAwLjYpCi0gICAgICAgICAgICAgICAgb3N0LT5zeW5jX29wdHMgPSBscmludChzeW5jX2lwdHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVlNZTkNfRFJPUDoKLSAgICAgICAgY2FzZSBWU1lOQ19QQVNTVEhST1VHSDoKLSAgICAgICAgICAgIG9zdC0+c3luY19vcHRzID0gbHJpbnQoc3luY19pcHRzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG5iX2ZyYW1lcyA9IEZGTUlOKG5iX2ZyYW1lcywgb3N0LT5tYXhfZnJhbWVzIC0gb3N0LT5mcmFtZV9udW1iZXIpOwotICAgIG5iMF9mcmFtZXMgPSBGRk1JTihuYjBfZnJhbWVzLCBuYl9mcmFtZXMpOwotCi0gICAgbWVtbW92ZShvc3QtPmxhc3RfbmIwX2ZyYW1lcyArIDEsCi0gICAgICAgICAgICBvc3QtPmxhc3RfbmIwX2ZyYW1lcywKLSAgICAgICAgICAgIHNpemVvZihvc3QtPmxhc3RfbmIwX2ZyYW1lc1swXSkgKiAoRkZfQVJSQVlfRUxFTVMob3N0LT5sYXN0X25iMF9mcmFtZXMpIC0gMSkpOwotICAgIG9zdC0+bGFzdF9uYjBfZnJhbWVzWzBdID0gbmIwX2ZyYW1lczsKLQotICAgIGlmIChuYjBfZnJhbWVzID09IDAgJiYgb3N0LT5sYXN0X2Ryb3BwZWQpIHsKLSAgICAgICAgbmJfZnJhbWVzX2Ryb3ArKzsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLAotICAgICAgICAgICAgICAgIioqKiBkcm9wcGluZyBmcmFtZSAlZCBmcm9tIHN0cmVhbSAlZCBhdCB0cyAlIlBSSWQ2NCJcbiIsCi0gICAgICAgICAgICAgICBvc3QtPmZyYW1lX251bWJlciwgb3N0LT5zdC0+aW5kZXgsIG9zdC0+bGFzdF9mcmFtZS0+cHRzKTsKLSAgICB9Ci0gICAgaWYgKG5iX2ZyYW1lcyA+IChuYjBfZnJhbWVzICYmIG9zdC0+bGFzdF9kcm9wcGVkKSArIChuYl9mcmFtZXMgPiBuYjBfZnJhbWVzKSkgewotICAgICAgICBpZiAobmJfZnJhbWVzID4gZHRzX2Vycm9yX3RocmVzaG9sZCAqIDMwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgZnJhbWUgZHVwbGljYXRpb24gdG9vIGxhcmdlLCBza2lwcGluZ1xuIiwgbmJfZnJhbWVzIC0gMSk7Ci0gICAgICAgICAgICBuYl9mcmFtZXNfZHJvcCsrOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG5iX2ZyYW1lc19kdXAgKz0gbmJfZnJhbWVzIC0gKG5iMF9mcmFtZXMgJiYgb3N0LT5sYXN0X2Ryb3BwZWQpIC0gKG5iX2ZyYW1lcyA+IG5iMF9mcmFtZXMpOwotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIqKiogJWQgZHVwIVxuIiwgbmJfZnJhbWVzIC0gMSk7Ci0gICAgfQotICAgIG9zdC0+bGFzdF9kcm9wcGVkID0gbmJfZnJhbWVzID09IG5iMF9mcmFtZXMgJiYgbmV4dF9waWN0dXJlOwotCi0gIC8qIGR1cGxpY2F0ZXMgZnJhbWUgaWYgbmVlZGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBuYl9mcmFtZXM7IGkrKykgewotICAgIEFWRnJhbWUgKmluX3BpY3R1cmU7Ci0gICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7Ci0gICAgcGt0LmRhdGEgPSBOVUxMOwotICAgIHBrdC5zaXplID0gMDsKLQotICAgIGlmIChpIDwgbmIwX2ZyYW1lcyAmJiBvc3QtPmxhc3RfZnJhbWUpIHsKLSAgICAgICAgaW5fcGljdHVyZSA9IG9zdC0+bGFzdF9mcmFtZTsKLSAgICB9IGVsc2UKLSAgICAgICAgaW5fcGljdHVyZSA9IG5leHRfcGljdHVyZTsKLQotICAgIGlmICghaW5fcGljdHVyZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaW5fcGljdHVyZS0+cHRzID0gb3N0LT5zeW5jX29wdHM7Ci0KLSNpZiAxCi0gICAgaWYgKCFjaGVja19yZWNvcmRpbmdfdGltZShvc3QpKQotI2Vsc2UKLSAgICBpZiAob3N0LT5mcmFtZV9udW1iZXIgPj0gb3N0LT5tYXhfZnJhbWVzKQotI2VuZGlmCi0gICAgICAgIHJldHVybjsKLQotI2lmIEZGX0FQSV9MQVZGX0ZNVF9SQVdQSUNUVVJFCi0gICAgaWYgKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfUkFXUElDVFVSRSAmJgotICAgICAgICBlbmMtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTykgewotICAgICAgICAvKiByYXcgcGljdHVyZXMgYXJlIHdyaXR0ZW4gYXMgQVZQaWN0dXJlIHN0cnVjdHVyZSB0bwotICAgICAgICAgICBhdm9pZCBhbnkgY29waWVzLiBXZSBzdXBwb3J0IHRlbXBvcmFyaWx5IHRoZSBvbGRlcgotICAgICAgICAgICBtZXRob2QuICovCi0gICAgICAgIGlmIChpbl9waWN0dXJlLT5pbnRlcmxhY2VkX2ZyYW1lKQotICAgICAgICAgICAgbXV4X2VuYy0+ZmllbGRfb3JkZXIgPSBpbl9waWN0dXJlLT50b3BfZmllbGRfZmlyc3QgPyBBVl9GSUVMRF9UQjpBVl9GSUVMRF9CVDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbXV4X2VuYy0+ZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9QUk9HUkVTU0lWRTsKLSAgICAgICAgcGt0LmRhdGEgICA9ICh1aW50OF90ICopaW5fcGljdHVyZTsKLSAgICAgICAgcGt0LnNpemUgICA9ICBzaXplb2YoQVZQaWN0dXJlKTsKLSAgICAgICAgcGt0LnB0cyAgICA9IGF2X3Jlc2NhbGVfcShpbl9waWN0dXJlLT5wdHMsIGVuYy0+dGltZV9iYXNlLCBvc3QtPnN0LT50aW1lX2Jhc2UpOwotICAgICAgICBwa3QuZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwotCi0gICAgICAgIHdyaXRlX2ZyYW1lKHMsICZwa3QsIG9zdCk7Ci0gICAgfSBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIGludCBnb3RfcGFja2V0LCBmb3JjZWRfa2V5ZnJhbWUgPSAwOwotICAgICAgICBkb3VibGUgcHRzX3RpbWU7Ci0KLSAgICAgICAgaWYgKGVuYy0+ZmxhZ3MgJiAoQVZfQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCB8IEFWX0NPREVDX0ZMQUdfSU5URVJMQUNFRF9NRSkgJiYKLSAgICAgICAgICAgIG9zdC0+dG9wX2ZpZWxkX2ZpcnN0ID49IDApCi0gICAgICAgICAgICBpbl9waWN0dXJlLT50b3BfZmllbGRfZmlyc3QgPSAhIW9zdC0+dG9wX2ZpZWxkX2ZpcnN0OwotCi0gICAgICAgIGlmIChpbl9waWN0dXJlLT5pbnRlcmxhY2VkX2ZyYW1lKSB7Ci0gICAgICAgICAgICBpZiAoZW5jLT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfTUpQRUcpCi0gICAgICAgICAgICAgICAgbXV4X2VuYy0+ZmllbGRfb3JkZXIgPSBpbl9waWN0dXJlLT50b3BfZmllbGRfZmlyc3QgPyBBVl9GSUVMRF9UVDpBVl9GSUVMRF9CQjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBtdXhfZW5jLT5maWVsZF9vcmRlciA9IGluX3BpY3R1cmUtPnRvcF9maWVsZF9maXJzdCA/IEFWX0ZJRUxEX1RCOkFWX0ZJRUxEX0JUOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG11eF9lbmMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfUFJPR1JFU1NJVkU7Ci0KLSAgICAgICAgaW5fcGljdHVyZS0+cXVhbGl0eSA9IGVuYy0+Z2xvYmFsX3F1YWxpdHk7Ci0gICAgICAgIGluX3BpY3R1cmUtPnBpY3RfdHlwZSA9IDA7Ci0KLSAgICAgICAgcHRzX3RpbWUgPSBpbl9waWN0dXJlLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgPwotICAgICAgICAgICAgaW5fcGljdHVyZS0+cHRzICogYXZfcTJkKGVuYy0+dGltZV9iYXNlKSA6IE5BTjsKLSAgICAgICAgaWYgKG9zdC0+Zm9yY2VkX2tmX2luZGV4IDwgb3N0LT5mb3JjZWRfa2ZfY291bnQgJiYKLSAgICAgICAgICAgIGluX3BpY3R1cmUtPnB0cyA+PSBvc3QtPmZvcmNlZF9rZl9wdHNbb3N0LT5mb3JjZWRfa2ZfaW5kZXhdKSB7Ci0gICAgICAgICAgICBvc3QtPmZvcmNlZF9rZl9pbmRleCsrOwotICAgICAgICAgICAgZm9yY2VkX2tleWZyYW1lID0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChvc3QtPmZvcmNlZF9rZXlmcmFtZXNfcGV4cHIpIHsKLSAgICAgICAgICAgIGRvdWJsZSByZXM7Ci0gICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX1RdID0gcHRzX3RpbWU7Ci0gICAgICAgICAgICByZXMgPSBhdl9leHByX2V2YWwob3N0LT5mb3JjZWRfa2V5ZnJhbWVzX3BleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlcywgTlVMTCk7Ci0gICAgICAgICAgICBmZl9kbG9nKE5VTEwsICJmb3JjZV9rZXlfZnJhbWU6IG46JWYgbl9mb3JjZWQ6JWYgcHJldl9mb3JjZWRfbjolZiB0OiVmIHByZXZfZm9yY2VkX3Q6JWYgLT4gcmVzOiVmXG4iLAotICAgICAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX05dLAotICAgICAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX05fRk9SQ0VEXSwKLSAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9QUkVWX0ZPUkNFRF9OXSwKLSAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9UXSwKLSAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9QUkVWX0ZPUkNFRF9UXSwKLSAgICAgICAgICAgICAgICAgICAgcmVzKTsKLSAgICAgICAgICAgIGlmIChyZXMpIHsKLSAgICAgICAgICAgICAgICBmb3JjZWRfa2V5ZnJhbWUgPSAxOwotICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfUFJFVl9GT1JDRURfTl0gPQotICAgICAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX05dOwotICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfUFJFVl9GT1JDRURfVF0gPQotICAgICAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX1RdOwotICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfTl9GT1JDRURdICs9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfTl0gKz0gMTsKLSAgICAgICAgfSBlbHNlIGlmICggICBvc3QtPmZvcmNlZF9rZXlmcmFtZXMKLSAgICAgICAgICAgICAgICAgICAmJiAhc3RybmNtcChvc3QtPmZvcmNlZF9rZXlmcmFtZXMsICJzb3VyY2UiLCA2KQotICAgICAgICAgICAgICAgICAgICYmIGluX3BpY3R1cmUtPmtleV9mcmFtZT09MSkgewotICAgICAgICAgICAgZm9yY2VkX2tleWZyYW1lID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmb3JjZWRfa2V5ZnJhbWUpIHsKLSAgICAgICAgICAgIGluX3BpY3R1cmUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOwotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIkZvcmNlZCBrZXlmcmFtZSBhdCB0aW1lICVmXG4iLCBwdHNfdGltZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVfYmVuY2htYXJrKE5VTEwpOwotICAgICAgICBpZiAoZGVidWdfdHMpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImVuY29kZXIgPC0gdHlwZTp2aWRlbyAiCi0gICAgICAgICAgICAgICAgICAgImZyYW1lX3B0czolcyBmcmFtZV9wdHNfdGltZTolcyB0aW1lX2Jhc2U6JWQvJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKGluX3BpY3R1cmUtPnB0cyksIGF2X3RzMnRpbWVzdHIoaW5fcGljdHVyZS0+cHRzLCAmZW5jLT50aW1lX2Jhc2UpLAotICAgICAgICAgICAgICAgICAgIGVuYy0+dGltZV9iYXNlLm51bSwgZW5jLT50aW1lX2Jhc2UuZGVuKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9zdC0+ZnJhbWVzX2VuY29kZWQrKzsKLQotICAgICAgICByZXQgPSBhdmNvZGVjX2VuY29kZV92aWRlbzIoZW5jLCAmcGt0LCBpbl9waWN0dXJlLCAmZ290X3BhY2tldCk7Ci0gICAgICAgIHVwZGF0ZV9iZW5jaG1hcmsoImVuY29kZV92aWRlbyAlZC4lZCIsIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiVmlkZW8gZW5jb2RpbmcgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnb3RfcGFja2V0KSB7Ci0gICAgICAgICAgICBpZiAoZGVidWdfdHMpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlbmNvZGVyIC0+IHR5cGU6dmlkZW8gIgotICAgICAgICAgICAgICAgICAgICAgICAicGt0X3B0czolcyBwa3RfcHRzX3RpbWU6JXMgcGt0X2R0czolcyBwa3RfZHRzX3RpbWU6JXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QucHRzKSwgYXZfdHMydGltZXN0cihwa3QucHRzLCAmZW5jLT50aW1lX2Jhc2UpLAotICAgICAgICAgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LmR0cyksIGF2X3RzMnRpbWVzdHIocGt0LmR0cywgJmVuYy0+dGltZV9iYXNlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwa3QucHRzID09IEFWX05PUFRTX1ZBTFVFICYmICEoZW5jLT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RFTEFZKSkKLSAgICAgICAgICAgICAgICBwa3QucHRzID0gb3N0LT5zeW5jX29wdHM7Ci0KLSAgICAgICAgICAgIGF2X3BhY2tldF9yZXNjYWxlX3RzKCZwa3QsIGVuYy0+dGltZV9iYXNlLCBvc3QtPnN0LT50aW1lX2Jhc2UpOwotCi0gICAgICAgICAgICBpZiAoZGVidWdfdHMpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlbmNvZGVyIC0+IHR5cGU6dmlkZW8gIgotICAgICAgICAgICAgICAgICAgICAicGt0X3B0czolcyBwa3RfcHRzX3RpbWU6JXMgcGt0X2R0czolcyBwa3RfZHRzX3RpbWU6JXNcbiIsCi0gICAgICAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QucHRzKSwgYXZfdHMydGltZXN0cihwa3QucHRzLCAmb3N0LT5zdC0+dGltZV9iYXNlKSwKLSAgICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC5kdHMpLCBhdl90czJ0aW1lc3RyKHBrdC5kdHMsICZvc3QtPnN0LT50aW1lX2Jhc2UpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZnJhbWVfc2l6ZSA9IHBrdC5zaXplOwotICAgICAgICAgICAgd3JpdGVfZnJhbWUocywgJnBrdCwgb3N0KTsKLQotICAgICAgICAgICAgLyogaWYgdHdvIHBhc3MsIG91dHB1dCBsb2cgKi8KLSAgICAgICAgICAgIGlmIChvc3QtPmxvZ2ZpbGUgJiYgZW5jLT5zdGF0c19vdXQpIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKG9zdC0+bG9nZmlsZSwgIiVzIiwgZW5jLT5zdGF0c19vdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG9zdC0+c3luY19vcHRzKys7Ci0gICAgLyoKLSAgICAgKiBGb3IgdmlkZW8sIG51bWJlciBvZiBmcmFtZXMgaW4gPT0gbnVtYmVyIG9mIHBhY2tldHMgb3V0LgotICAgICAqIEJ1dCB0aGVyZSBtYXkgYmUgcmVvcmRlcmluZywgc28gd2UgY2FuJ3QgdGhyb3cgYXdheSBmcmFtZXMgb24gZW5jb2RlcgotICAgICAqIGZsdXNoLCB3ZSBuZWVkIHRvIGxpbWl0IHRoZW0gaGVyZSwgYmVmb3JlIHRoZXkgZ28gaW50byBlbmNvZGVyLgotICAgICAqLwotICAgIG9zdC0+ZnJhbWVfbnVtYmVyKys7Ci0KLSAgICBpZiAodnN0YXRzX2ZpbGVuYW1lICYmIGZyYW1lX3NpemUpCi0gICAgICAgIGRvX3ZpZGVvX3N0YXRzKG9zdCwgZnJhbWVfc2l6ZSk7Ci0gIH0KLQotICAgIGlmICghb3N0LT5sYXN0X2ZyYW1lKQotICAgICAgICBvc3QtPmxhc3RfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGF2X2ZyYW1lX3VucmVmKG9zdC0+bGFzdF9mcmFtZSk7Ci0gICAgaWYgKG5leHRfcGljdHVyZSAmJiBvc3QtPmxhc3RfZnJhbWUpCi0gICAgICAgIGF2X2ZyYW1lX3JlZihvc3QtPmxhc3RfZnJhbWUsIG5leHRfcGljdHVyZSk7Ci0gICAgZWxzZQotICAgICAgICBhdl9mcmFtZV9mcmVlKCZvc3QtPmxhc3RfZnJhbWUpOwotfQotCi1zdGF0aWMgZG91YmxlIHBzbnIoZG91YmxlIGQpCi17Ci0gICAgcmV0dXJuIC0xMC4wICogbG9nMTAoZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX3ZpZGVvX3N0YXRzKE91dHB1dFN0cmVhbSAqb3N0LCBpbnQgZnJhbWVfc2l6ZSkKLXsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jOwotICAgIGludCBmcmFtZV9udW1iZXI7Ci0gICAgZG91YmxlIHRpMSwgYml0cmF0ZSwgYXZnX2JpdHJhdGU7Ci0KLSAgICAvKiB0aGlzIGlzIGV4ZWN1dGVkIGp1c3QgdGhlIGZpcnN0IHRpbWUgZG9fdmlkZW9fc3RhdHMgaXMgY2FsbGVkICovCi0gICAgaWYgKCF2c3RhdHNfZmlsZSkgewotICAgICAgICB2c3RhdHNfZmlsZSA9IGZvcGVuKHZzdGF0c19maWxlbmFtZSwgInciKTsKLSAgICAgICAgaWYgKCF2c3RhdHNfZmlsZSkgewotICAgICAgICAgICAgcGVycm9yKCJmb3BlbiIpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZW5jID0gb3N0LT5lbmNfY3R4OwotICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgIGZyYW1lX251bWJlciA9IG9zdC0+c3QtPm5iX2ZyYW1lczsKLSAgICAgICAgZnByaW50Zih2c3RhdHNfZmlsZSwgImZyYW1lPSAlNWQgcT0gJTIuMWYgIiwgZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgIG9zdC0+cXVhbGl0eSAvIChmbG9hdClGRl9RUDJMQU1CREEpOwotCi0gICAgICAgIGlmIChvc3QtPmVycm9yWzBdPj0wICYmIChlbmMtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QU05SKSkKLSAgICAgICAgICAgIGZwcmludGYodnN0YXRzX2ZpbGUsICJQU05SPSAlNi4yZiAiLCBwc25yKG9zdC0+ZXJyb3JbMF0gLyAoZW5jLT53aWR0aCAqIGVuYy0+aGVpZ2h0ICogMjU1LjAgKiAyNTUuMCkpKTsKLQotICAgICAgICBmcHJpbnRmKHZzdGF0c19maWxlLCJmX3NpemU9ICU2ZCAiLCBmcmFtZV9zaXplKTsKLSAgICAgICAgLyogY29tcHV0ZSBwdHMgdmFsdWUgKi8KLSAgICAgICAgdGkxID0gYXZfc3RyZWFtX2dldF9lbmRfcHRzKG9zdC0+c3QpICogYXZfcTJkKG9zdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgIGlmICh0aTEgPCAwLjAxKQotICAgICAgICAgICAgdGkxID0gMC4wMTsKLQotICAgICAgICBiaXRyYXRlICAgICA9IChmcmFtZV9zaXplICogOCkgLyBhdl9xMmQoZW5jLT50aW1lX2Jhc2UpIC8gMTAwMC4wOwotICAgICAgICBhdmdfYml0cmF0ZSA9IChkb3VibGUpKG9zdC0+ZGF0YV9zaXplICogOCkgLyB0aTEgLyAxMDAwLjA7Ci0gICAgICAgIGZwcmludGYodnN0YXRzX2ZpbGUsICJzX3NpemU9ICU4LjBma0IgdGltZT0gJTAuM2YgYnI9ICU3LjFma2JpdHMvcyBhdmdfYnI9ICU3LjFma2JpdHMvcyAiLAotICAgICAgICAgICAgICAgKGRvdWJsZSlvc3QtPmRhdGFfc2l6ZSAvIDEwMjQsIHRpMSwgYml0cmF0ZSwgYXZnX2JpdHJhdGUpOwotICAgICAgICBmcHJpbnRmKHZzdGF0c19maWxlLCAidHlwZT0gJWNcbiIsIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihvc3QtPnBpY3RfdHlwZSkpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZmluaXNoX291dHB1dF9zdHJlYW0oT3V0cHV0U3RyZWFtICpvc3QpCi17Ci0gICAgT3V0cHV0RmlsZSAqb2YgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKLSAgICBpbnQgaTsKLQotICAgIG9zdC0+ZmluaXNoZWQgPSBFTkNPREVSX0ZJTklTSEVEIHwgTVVYRVJfRklOSVNIRUQ7Ci0KLSAgICBpZiAob2YtPnNob3J0ZXN0KSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBvZi0+Y3R4LT5uYl9zdHJlYW1zOyBpKyspCi0gICAgICAgICAgICBvdXRwdXRfc3RyZWFtc1tvZi0+b3N0X2luZGV4ICsgaV0tPmZpbmlzaGVkID0gRU5DT0RFUl9GSU5JU0hFRCB8IE1VWEVSX0ZJTklTSEVEOwotICAgIH0KLX0KLQotLyoqCi0gKiBHZXQgYW5kIGVuY29kZSBuZXcgb3V0cHV0IGZyb20gYW55IG9mIHRoZSBmaWx0ZXJncmFwaHMsIHdpdGhvdXQgY2F1c2luZwotICogYWN0aXZpdHkuCi0gKgotICogQHJldHVybiAgMCBmb3Igc3VjY2VzcywgPDAgZm9yIHNldmVyZSBlcnJvcnMKLSAqLwotc3RhdGljIGludCByZWFwX2ZpbHRlcnMoaW50IGZsdXNoKQotewotICAgIEFWRnJhbWUgKmZpbHRlcmVkX2ZyYW1lID0gTlVMTDsKLSAgICBpbnQgaTsKLQotICAgIC8qIFJlYXAgYWxsIGJ1ZmZlcnMgcHJlc2VudCBpbiB0aGUgYnVmZmVyIHNpbmtzICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgT3V0cHV0RmlsZSAgICAqb2YgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKLSAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXI7Ci0gICAgICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBvc3QtPmVuY19jdHg7Ci0gICAgICAgIGludCByZXQgPSAwOwotCi0gICAgICAgIGlmICghb3N0LT5maWx0ZXIpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZmlsdGVyID0gb3N0LT5maWx0ZXItPmZpbHRlcjsKLQotICAgICAgICBpZiAoIW9zdC0+ZmlsdGVyZWRfZnJhbWUgJiYgIShvc3QtPmZpbHRlcmVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLSAgICAgICAgZmlsdGVyZWRfZnJhbWUgPSBvc3QtPmZpbHRlcmVkX2ZyYW1lOwotCi0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBkb3VibGUgZmxvYXRfcHRzID0gQVZfTk9QVFNfVkFMVUU7IC8vIHRoaXMgaXMgaWRlbnRpY2FsIHRvIGZpbHRlcmVkX2ZyYW1lLnB0cyBidXQgd2l0aCBoaWdoZXIgcHJlY2lzaW9uCi0gICAgICAgICAgICByZXQgPSBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9mbGFncyhmaWx0ZXIsIGZpbHRlcmVkX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJTSU5LX0ZMQUdfTk9fUkVRVUVTVCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUihFQUdBSU4pICYmIHJldCAhPSBBVkVSUk9SX0VPRikgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfZmxhZ3MoKTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbHVzaCAmJiByZXQgPT0gQVZFUlJPUl9FT0YpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci0+aW5wdXRzWzBdLT50eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvX3ZpZGVvX291dChvZi0+Y3R4LCBvc3QsIE5VTEwsIEFWX05PUFRTX1ZBTFVFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3N0LT5maW5pc2hlZCkgewotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZpbHRlcmVkX2ZyYW1lKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWx0ZXJlZF9mcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydF90aW1lID0gKG9mLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSA/IDAgOiBvZi0+c3RhcnRfdGltZTsKLSAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRiID0gZW5jLT50aW1lX2Jhc2U7Ci0gICAgICAgICAgICAgICAgaW50IGV4dHJhX2JpdHMgPSBhdl9jbGlwKDI5IC0gYXZfbG9nMih0Yi5kZW4pLCAwLCAxNik7Ci0KLSAgICAgICAgICAgICAgICB0Yi5kZW4gPDw9IGV4dHJhX2JpdHM7Ci0gICAgICAgICAgICAgICAgZmxvYXRfcHRzID0KLSAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGZpbHRlcmVkX2ZyYW1lLT5wdHMsIGZpbHRlci0+aW5wdXRzWzBdLT50aW1lX2Jhc2UsIHRiKSAtCi0gICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShzdGFydF90aW1lLCBBVl9USU1FX0JBU0VfUSwgdGIpOwotICAgICAgICAgICAgICAgIGZsb2F0X3B0cyAvPSAxIDw8IGV4dHJhX2JpdHM7Ci0gICAgICAgICAgICAgICAgLy8gYXZvaWQgZXhhY3QgbWlkb2ludHMgdG8gcmVkdWNlIHRoZSBjaGFuY2Ugb2Ygcm91bmRpbmcgZGlmZmVyZW5jZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQgaW4gY2FzZSB0aGUgZnBzIGNvZGUgaXMgY2hhbmdlZCB0byB3b3JrIHdpdGggaW50ZWdlcnMKLSAgICAgICAgICAgICAgICBmbG9hdF9wdHMgKz0gRkZTSUdOKGZsb2F0X3B0cykgKiAxLjAgLyAoMTw8MTcpOwotCi0gICAgICAgICAgICAgICAgZmlsdGVyZWRfZnJhbWUtPnB0cyA9Ci0gICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShmaWx0ZXJlZF9mcmFtZS0+cHRzLCBmaWx0ZXItPmlucHV0c1swXS0+dGltZV9iYXNlLCBlbmMtPnRpbWVfYmFzZSkgLQotICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3Eoc3RhcnRfdGltZSwgQVZfVElNRV9CQVNFX1EsIGVuYy0+dGltZV9iYXNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vaWYgKG9zdC0+c291cmNlX2luZGV4ID49IDApCi0gICAgICAgICAgICAvLyAgICAqZmlsdGVyZWRfZnJhbWU9ICppbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XS0+ZGVjb2RlZF9mcmFtZTsgLy9mb3IgbWVfdGhyZXNob2xkCi0KLSAgICAgICAgICAgIHN3aXRjaCAoZmlsdGVyLT5pbnB1dHNbMF0tPnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgICAgIGlmICghb3N0LT5mcmFtZV9hc3BlY3RfcmF0aW8ubnVtKQotICAgICAgICAgICAgICAgICAgICBlbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBmaWx0ZXJlZF9mcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKLQotICAgICAgICAgICAgICAgIGlmIChkZWJ1Z190cykgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJmaWx0ZXIgLT4gcHRzOiVzIHB0c190aW1lOiVzIGV4YWN0OiVmIHRpbWVfYmFzZTolZC8lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl90czJzdHIoZmlsdGVyZWRfZnJhbWUtPnB0cyksIGF2X3RzMnRpbWVzdHIoZmlsdGVyZWRfZnJhbWUtPnB0cywgJmVuYy0+dGltZV9iYXNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdF9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT50aW1lX2Jhc2UubnVtLCBlbmMtPnRpbWVfYmFzZS5kZW4pOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRvX3ZpZGVvX291dChvZi0+Y3R4LCBvc3QsIGZpbHRlcmVkX2ZyYW1lLCBmbG9hdF9wdHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICAgICAgaWYgKCEoZW5jLT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX1BBUkFNX0NIQU5HRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgZW5jLT5jaGFubmVscyAhPSBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZmlsdGVyZWRfZnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVkaW8gZmlsdGVyIGdyYXBoIG91dHB1dCBpcyBub3Qgbm9ybWFsaXplZCBhbmQgZW5jb2RlciBkb2VzIG5vdCBzdXBwb3J0IHBhcmFtZXRlciBjaGFuZ2VzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRvX2F1ZGlvX291dChvZi0+Y3R4LCBvc3QsIGZpbHRlcmVkX2ZyYW1lKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzdXBwb3J0IHN1YnRpdGxlIGZpbHRlcnMKLSAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmaWx0ZXJlZF9mcmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfZmluYWxfc3RhdHMoaW50NjRfdCB0b3RhbF9zaXplKQotewotICAgIHVpbnQ2NF90IHZpZGVvX3NpemUgPSAwLCBhdWRpb19zaXplID0gMCwgZXh0cmFfc2l6ZSA9IDAsIG90aGVyX3NpemUgPSAwOwotICAgIHVpbnQ2NF90IHN1YnRpdGxlX3NpemUgPSAwOwotICAgIHVpbnQ2NF90IGRhdGFfc2l6ZSA9IDA7Ci0gICAgZmxvYXQgcGVyY2VudCA9IC0xLjA7Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IHBhc3MxX3VzZWQgPSAxOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgc3dpdGNoIChvc3QtPmVuY19jdHgtPmNvZGVjX3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiB2aWRlb19zaXplICs9IG9zdC0+ZGF0YV9zaXplOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOiBhdWRpb19zaXplICs9IG9zdC0+ZGF0YV9zaXplOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOiBzdWJ0aXRsZV9zaXplICs9IG9zdC0+ZGF0YV9zaXplOyBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICBvdGhlcl9zaXplICs9IG9zdC0+ZGF0YV9zaXplOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBleHRyYV9zaXplICs9IG9zdC0+ZW5jX2N0eC0+ZXh0cmFkYXRhX3NpemU7Ci0gICAgICAgIGRhdGFfc2l6ZSAgKz0gb3N0LT5kYXRhX3NpemU7Ci0gICAgICAgIGlmICggICAob3N0LT5lbmNfY3R4LT5mbGFncyAmIChBVl9DT0RFQ19GTEFHX1BBU1MxIHwgQ09ERUNfRkxBR19QQVNTMikpCi0gICAgICAgICAgICAhPSBBVl9DT0RFQ19GTEFHX1BBU1MxKQotICAgICAgICAgICAgcGFzczFfdXNlZCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGRhdGFfc2l6ZSAmJiB0b3RhbF9zaXplPjAgJiYgdG90YWxfc2l6ZSA+PSBkYXRhX3NpemUpCi0gICAgICAgIHBlcmNlbnQgPSAxMDAuMCAqICh0b3RhbF9zaXplIC0gZGF0YV9zaXplKSAvIGRhdGFfc2l6ZTsKLQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInZpZGVvOiUxLjBma0IgYXVkaW86JTEuMGZrQiBzdWJ0aXRsZTolMS4wZmtCIG90aGVyIHN0cmVhbXM6JTEuMGZrQiBnbG9iYWwgaGVhZGVyczolMS4wZmtCIG11eGluZyBvdmVyaGVhZDogIiwKLSAgICAgICAgICAgdmlkZW9fc2l6ZSAvIDEwMjQuMCwKLSAgICAgICAgICAgYXVkaW9fc2l6ZSAvIDEwMjQuMCwKLSAgICAgICAgICAgc3VidGl0bGVfc2l6ZSAvIDEwMjQuMCwKLSAgICAgICAgICAgb3RoZXJfc2l6ZSAvIDEwMjQuMCwKLSAgICAgICAgICAgZXh0cmFfc2l6ZSAvIDEwMjQuMCk7Ci0gICAgaWYgKHBlcmNlbnQgPj0gMC4wKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlZiUlIiwgcGVyY2VudCk7Ci0gICAgZWxzZQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJ1bmtub3duIik7Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiXG4iKTsKLQotICAgIC8qIHByaW50IHZlcmJvc2UgcGVyLXN0cmVhbSBzdGF0cyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9maWxlczsgaSsrKSB7Ci0gICAgICAgIElucHV0RmlsZSAqZiA9IGlucHV0X2ZpbGVzW2ldOwotICAgICAgICB1aW50NjRfdCB0b3RhbF9wYWNrZXRzID0gMCwgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiSW5wdXQgZmlsZSAjJWQgKCVzKTpcbiIsCi0gICAgICAgICAgICAgICBpLCBmLT5jdHgtPmZpbGVuYW1lKTsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgZi0+bmJfc3RyZWFtczsgaisrKSB7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSAqaXN0ID0gaW5wdXRfc3RyZWFtc1tmLT5pc3RfaW5kZXggKyBqXTsKLSAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZSA9IGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZTsKLQotICAgICAgICAgICAgdG90YWxfc2l6ZSAgICArPSBpc3QtPmRhdGFfc2l6ZTsKLSAgICAgICAgICAgIHRvdGFsX3BhY2tldHMgKz0gaXN0LT5uYl9wYWNrZXRzOwotCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIgIElucHV0IHN0cmVhbSAjJWQ6JWQgKCVzKTogIiwKLSAgICAgICAgICAgICAgICAgICBpLCBqLCBtZWRpYV90eXBlX3N0cmluZyh0eXBlKSk7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIlIlBSSXU2NCIgcGFja2V0cyByZWFkICglIlBSSXU2NCIgYnl0ZXMpOyAiLAotICAgICAgICAgICAgICAgICAgIGlzdC0+bmJfcGFja2V0cywgaXN0LT5kYXRhX3NpemUpOwotCi0gICAgICAgICAgICBpZiAoaXN0LT5kZWNvZGluZ19uZWVkZWQpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIlIlBSSXU2NCIgZnJhbWVzIGRlY29kZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmZyYW1lc19kZWNvZGVkKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIiAoJSJQUkl1NjQiIHNhbXBsZXMpIiwgaXN0LT5zYW1wbGVzX2RlY29kZWQpOwotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIjsgIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIgIFRvdGFsOiAlIlBSSXU2NCIgcGFja2V0cyAoJSJQUkl1NjQiIGJ5dGVzKSBkZW11eGVkXG4iLAotICAgICAgICAgICAgICAgdG90YWxfcGFja2V0cywgdG90YWxfc2l6ZSk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9maWxlczsgaSsrKSB7Ci0gICAgICAgIE91dHB1dEZpbGUgKm9mID0gb3V0cHV0X2ZpbGVzW2ldOwotICAgICAgICB1aW50NjRfdCB0b3RhbF9wYWNrZXRzID0gMCwgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiT3V0cHV0IGZpbGUgIyVkICglcyk6XG4iLAotICAgICAgICAgICAgICAgaSwgb2YtPmN0eC0+ZmlsZW5hbWUpOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBvZi0+Y3R4LT5uYl9zdHJlYW1zOyBqKyspIHsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gb3V0cHV0X3N0cmVhbXNbb2YtPm9zdF9pbmRleCArIGpdOwotICAgICAgICAgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlID0gb3N0LT5lbmNfY3R4LT5jb2RlY190eXBlOwotCi0gICAgICAgICAgICB0b3RhbF9zaXplICAgICs9IG9zdC0+ZGF0YV9zaXplOwotICAgICAgICAgICAgdG90YWxfcGFja2V0cyArPSBvc3QtPnBhY2tldHNfd3JpdHRlbjsKLQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiICBPdXRwdXQgc3RyZWFtICMlZDolZCAoJXMpOiAiLAotICAgICAgICAgICAgICAgICAgIGksIGosIG1lZGlhX3R5cGVfc3RyaW5nKHR5cGUpKTsKLSAgICAgICAgICAgIGlmIChvc3QtPmVuY29kaW5nX25lZWRlZCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIiUiUFJJdTY0IiBmcmFtZXMgZW5jb2RlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIG9zdC0+ZnJhbWVzX2VuY29kZWQpOwotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiICglIlBSSXU2NCIgc2FtcGxlcykiLCBvc3QtPnNhbXBsZXNfZW5jb2RlZCk7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiOyAiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiJSJQUkl1NjQiIHBhY2tldHMgbXV4ZWQgKCUiUFJJdTY0IiBieXRlcyk7ICIsCi0gICAgICAgICAgICAgICAgICAgb3N0LT5wYWNrZXRzX3dyaXR0ZW4sIG9zdC0+ZGF0YV9zaXplKTsKLQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIiAgVG90YWw6ICUiUFJJdTY0IiBwYWNrZXRzICglIlBSSXU2NCIgYnl0ZXMpIG11eGVkXG4iLAotICAgICAgICAgICAgICAgdG90YWxfcGFja2V0cywgdG90YWxfc2l6ZSk7Ci0gICAgfQotICAgIGlmKHZpZGVvX3NpemUgKyBkYXRhX3NpemUgKyBhdWRpb19zaXplICsgc3VidGl0bGVfc2l6ZSArIGV4dHJhX3NpemUgPT0gMCl7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk91dHB1dCBmaWxlIGlzIGVtcHR5LCBub3RoaW5nIHdhcyBlbmNvZGVkICIpOwotICAgICAgICBpZiAocGFzczFfdXNlZCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIihjaGVjayAtc3MgLyAtdCAvIC1mcmFtZXMgcGFyYW1ldGVycyBpZiB1c2VkKVxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X3JlcG9ydChpbnQgaXNfbGFzdF9yZXBvcnQsIGludDY0X3QgdGltZXJfc3RhcnQsIGludDY0X3QgY3VyX3RpbWUpCi17Ci0gICAgY2hhciBidWZbMTAyNF07Ci0gICAgQVZCUHJpbnQgYnVmX3NjcmlwdDsKLSAgICBPdXRwdXRTdHJlYW0gKm9zdDsKLSAgICBBVkZvcm1hdENvbnRleHQgKm9jOwotICAgIGludDY0X3QgdG90YWxfc2l6ZTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jOwotICAgIGludCBmcmFtZV9udW1iZXIsIHZpZCwgaTsKLSAgICBkb3VibGUgYml0cmF0ZTsKLSAgICBkb3VibGUgc3BlZWQ7Ci0gICAgaW50NjRfdCBwdHMgPSBJTlQ2NF9NSU4gKyAxOwotICAgIHN0YXRpYyBpbnQ2NF90IGxhc3RfdGltZSA9IC0xOwotICAgIHN0YXRpYyBpbnQgcXBfaGlzdG9ncmFtWzUyXTsKLSAgICBpbnQgaG91cnMsIG1pbnMsIHNlY3MsIHVzOwotICAgIGludCByZXQ7Ci0gICAgZmxvYXQgdDsKLQotICAgIGlmICghcHJpbnRfc3RhdHMgJiYgIWlzX2xhc3RfcmVwb3J0ICYmICFwcm9ncmVzc19hdmlvKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoIWlzX2xhc3RfcmVwb3J0KSB7Ci0gICAgICAgIGlmIChsYXN0X3RpbWUgPT0gLTEpIHsKLSAgICAgICAgICAgIGxhc3RfdGltZSA9IGN1cl90aW1lOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoY3VyX3RpbWUgLSBsYXN0X3RpbWUpIDwgNTAwMDAwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBsYXN0X3RpbWUgPSBjdXJfdGltZTsKLSAgICB9Ci0KLSAgICB0ID0gKGN1cl90aW1lLXRpbWVyX3N0YXJ0KSAvIDEwMDAwMDAuMDsKLQotCi0gICAgb2MgPSBvdXRwdXRfZmlsZXNbMF0tPmN0eDsKLQotICAgIHRvdGFsX3NpemUgPSBhdmlvX3NpemUob2MtPnBiKTsKLSAgICBpZiAodG90YWxfc2l6ZSA8PSAwKSAvLyBGSVhNRSBpbXByb3ZlIGF2aW9fc2l6ZSgpIHNvIGl0IHdvcmtzIHdpdGggbm9uIHNlZWthYmxlIG91dHB1dCB0b28KLSAgICAgICAgdG90YWxfc2l6ZSA9IGF2aW9fdGVsbChvYy0+cGIpOwotCi0gICAgYnVmWzBdID0gJ1wwJzsKLSAgICB2aWQgPSAwOwotICAgIGF2X2JwcmludF9pbml0KCZidWZfc2NyaXB0LCAwLCAxKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgewotICAgICAgICBmbG9hdCBxID0gLTE7Ci0gICAgICAgIG9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOwotICAgICAgICBlbmMgPSBvc3QtPmVuY19jdHg7Ci0gICAgICAgIGlmICghb3N0LT5zdHJlYW1fY29weSkKLSAgICAgICAgICAgIHEgPSBvc3QtPnF1YWxpdHkgLyAoZmxvYXQpIEZGX1FQMkxBTUJEQTsKLQotICAgICAgICBpZiAodmlkICYmIGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLCAicT0lMi4xZiAiLCBxKTsKLSAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJzdHJlYW1fJWRfJWRfcT0lLjFmXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIHEpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghdmlkICYmIGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgIGZsb2F0IGZwczsKLQotICAgICAgICAgICAgZnJhbWVfbnVtYmVyID0gb3N0LT5mcmFtZV9udW1iZXI7Ci0gICAgICAgICAgICBmcHMgPSB0ID4gMSA/IGZyYW1lX251bWJlciAvIHQgOiAwOwotICAgICAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZiksICJmcmFtZT0lNWQgZnBzPSUzLipmIHE9JTMuMWYgIiwKLSAgICAgICAgICAgICAgICAgICAgIGZyYW1lX251bWJlciwgZnBzIDwgOS45NSwgZnBzLCBxKTsKLSAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJmcmFtZT0lZFxuIiwgZnJhbWVfbnVtYmVyKTsKLSAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJmcHM9JS4xZlxuIiwgZnBzKTsKLSAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJzdHJlYW1fJWRfJWRfcT0lLjFmXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIHEpOwotICAgICAgICAgICAgaWYgKGlzX2xhc3RfcmVwb3J0KQotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLCAiTCIpOwotICAgICAgICAgICAgaWYgKHFwX2hpc3QpIHsKLSAgICAgICAgICAgICAgICBpbnQgajsKLSAgICAgICAgICAgICAgICBpbnQgcXAgPSBscmludGYocSk7Ci0gICAgICAgICAgICAgICAgaWYgKHFwID49IDAgJiYgcXAgPCBGRl9BUlJBWV9FTEVNUyhxcF9oaXN0b2dyYW0pKQotICAgICAgICAgICAgICAgICAgICBxcF9oaXN0b2dyYW1bcXBdKys7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLCAiJVgiLCBhdl9sb2cyKHFwX2hpc3RvZ3JhbVtqXSArIDEpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChlbmMtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QU05SKSAmJiAob3N0LT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX05PTkUgfHwgaXNfbGFzdF9yZXBvcnQpKSB7Ci0gICAgICAgICAgICAgICAgaW50IGo7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGVycm9yLCBlcnJvcl9zdW0gPSAwOwotICAgICAgICAgICAgICAgIGRvdWJsZSBzY2FsZSwgc2NhbGVfc3VtID0gMDsKLSAgICAgICAgICAgICAgICBkb3VibGUgcDsKLSAgICAgICAgICAgICAgICBjaGFyIHR5cGVbM10gPSB7ICdZJywnVScsJ1YnIH07Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZiksICJQU05SPSIpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2xhc3RfcmVwb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVuYy0+ZXJyb3Jbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IGVuYy0+d2lkdGggKiBlbmMtPmhlaWdodCAqIDI1NS4wICogMjU1LjAgKiBmcmFtZV9udW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG9zdC0+ZXJyb3Jbal07Ci0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IGVuYy0+d2lkdGggKiBlbmMtPmhlaWdodCAqIDI1NS4wICogMjU1LjA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGopCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSAvPSA0OwotICAgICAgICAgICAgICAgICAgICBlcnJvcl9zdW0gKz0gZXJyb3I7Ci0gICAgICAgICAgICAgICAgICAgIHNjYWxlX3N1bSArPSBzY2FsZTsKLSAgICAgICAgICAgICAgICAgICAgcCA9IHBzbnIoZXJyb3IgLyBzY2FsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLCAiJWM6JTIuMmYgIiwgdHlwZVtqXSwgcCk7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJzdHJlYW1fJWRfJWRfcHNucl8lYz0lMi4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIHR5cGVbal0gfCAzMiwgcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHAgPSBwc25yKGVycm9yX3N1bSAvIHNjYWxlX3N1bSk7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZiksICIqOiUyLjJmICIsIHBzbnIoZXJyb3Jfc3VtIC8gc2NhbGVfc3VtKSk7Ci0gICAgICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgInN0cmVhbV8lZF8lZF9wc25yX2FsbD0lMi4yZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCwgcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIC8qIGNvbXB1dGUgbWluIG91dHB1dCB2YWx1ZSAqLwotICAgICAgICBpZiAoYXZfc3RyZWFtX2dldF9lbmRfcHRzKG9zdC0+c3QpICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICAgICAgcHRzID0gRkZNQVgocHRzLCBhdl9yZXNjYWxlX3EoYXZfc3RyZWFtX2dldF9lbmRfcHRzKG9zdC0+c3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5zdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSkpOwotICAgICAgICBpZiAoaXNfbGFzdF9yZXBvcnQpCi0gICAgICAgICAgICBuYl9mcmFtZXNfZHJvcCArPSBvc3QtPmxhc3RfZHJvcHBlZDsKLSAgICB9Ci0KLSAgICBzZWNzID0gRkZBQlMocHRzKSAvIEFWX1RJTUVfQkFTRTsKLSAgICB1cyA9IEZGQUJTKHB0cykgJSBBVl9USU1FX0JBU0U7Ci0gICAgbWlucyA9IHNlY3MgLyA2MDsKLSAgICBzZWNzICU9IDYwOwotICAgIGhvdXJzID0gbWlucyAvIDYwOwotICAgIG1pbnMgJT0gNjA7Ci0KLSAgICBiaXRyYXRlID0gcHRzICYmIHRvdGFsX3NpemUgPj0gMCA/IHRvdGFsX3NpemUgKiA4IC8gKHB0cyAvIDEwMDAuMCkgOiAtMTsKLSAgICBzcGVlZCA9IHQgIT0gMC4wID8gKGRvdWJsZSlwdHMgLyBBVl9USU1FX0JBU0UgLyB0IDogLTE7Ci0KLSAgICBpZiAodG90YWxfc2l6ZSA8IDApIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemU9Ti9BIHRpbWU9Iik7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgc2l6ZW9mKGJ1ZikgLSBzdHJsZW4oYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaXplPSU4LjBma0IgdGltZT0iLCB0b3RhbF9zaXplIC8gMTAyNC4wKTsKLSAgICBpZiAocHRzIDwgMCkKLSAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZiksICItIik7Ci0gICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZiksCi0gICAgICAgICAgICAgIiUwMmQ6JTAyZDolMDJkLiUwMmQgIiwgaG91cnMsIG1pbnMsIHNlY3MsCi0gICAgICAgICAgICAgKDEwMCAqIHVzKSAvIEFWX1RJTUVfQkFTRSk7Ci0KLSAgICBpZiAoYml0cmF0ZSA8IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZiksImJpdHJhdGU9Ti9BIik7Ci0gICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJiaXRyYXRlPU4vQVxuIik7Ci0gICAgfWVsc2V7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLCJiaXRyYXRlPSU2LjFma2JpdHMvcyIsIGJpdHJhdGUpOwotICAgICAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAiYml0cmF0ZT0lNi4xZmtiaXRzL3NcbiIsIGJpdHJhdGUpOwotICAgIH0KLQotICAgIGlmICh0b3RhbF9zaXplIDwgMCkgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgInRvdGFsX3NpemU9Ti9BXG4iKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJ0b3RhbF9zaXplPSUiUFJJZDY0IlxuIiwgdG90YWxfc2l6ZSk7Ci0gICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgIm91dF90aW1lX21zPSUiUFJJZDY0IlxuIiwgcHRzKTsKLSAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAib3V0X3RpbWU9JTAyZDolMDJkOiUwMmQuJTA2ZFxuIiwKLSAgICAgICAgICAgICAgIGhvdXJzLCBtaW5zLCBzZWNzLCB1cyk7Ci0KLSAgICBpZiAobmJfZnJhbWVzX2R1cCB8fCBuYl9mcmFtZXNfZHJvcCkKLSAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIHNpemVvZihidWYpIC0gc3RybGVuKGJ1ZiksICIgZHVwPSVkIGRyb3A9JWQiLAotICAgICAgICAgICAgICAgIG5iX2ZyYW1lc19kdXAsIG5iX2ZyYW1lc19kcm9wKTsKLSAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAiZHVwX2ZyYW1lcz0lZFxuIiwgbmJfZnJhbWVzX2R1cCk7Ci0gICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgImRyb3BfZnJhbWVzPSVkXG4iLCBuYl9mcmFtZXNfZHJvcCk7Ci0KLSAgICBpZiAoc3BlZWQgPCAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLCIgc3BlZWQ9Ti9BIik7Ci0gICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJzcGVlZD1OL0FcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpLCIgc3BlZWQ9JTQuM2d4Iiwgc3BlZWQpOwotICAgICAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAic3BlZWQ9JTQuM2d4XG4iLCBzcGVlZCk7Ci0gICAgfQotCi0gICAgaWYgKHByaW50X3N0YXRzIHx8IGlzX2xhc3RfcmVwb3J0KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgZW5kID0gaXNfbGFzdF9yZXBvcnQgPyAnXG4nIDogJ1xyJzsKLSAgICAgICAgaWYgKHByaW50X3N0YXRzPT0xICYmIEFWX0xPR19JTkZPID4gYXZfbG9nX2dldF9sZXZlbCgpKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICAgICVjIiwgYnVmLCBlbmQpOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiVzICAgICVjIiwgYnVmLCBlbmQpOwotCi0gICAgZmZsdXNoKHN0ZGVycik7Ci0gICAgfQotCi0gICAgaWYgKHByb2dyZXNzX2F2aW8pIHsKLSAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgInByb2dyZXNzPSVzXG4iLAotICAgICAgICAgICAgICAgICAgIGlzX2xhc3RfcmVwb3J0ID8gImVuZCIgOiAiY29udGludWUiKTsKLSAgICAgICAgYXZpb193cml0ZShwcm9ncmVzc19hdmlvLCBidWZfc2NyaXB0LnN0ciwKLSAgICAgICAgICAgICAgICAgICBGRk1JTihidWZfc2NyaXB0LmxlbiwgYnVmX3NjcmlwdC5zaXplIC0gMSkpOwotICAgICAgICBhdmlvX2ZsdXNoKHByb2dyZXNzX2F2aW8pOwotICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1Zl9zY3JpcHQsIE5VTEwpOwotICAgICAgICBpZiAoaXNfbGFzdF9yZXBvcnQpIHsKLSAgICAgICAgICAgIGlmICgocmV0ID0gYXZpb19jbG9zZXAoJnByb2dyZXNzX2F2aW8pKSA8IDApCi0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNsb3NpbmcgcHJvZ3Jlc3MgbG9nLCBsb3NzIG9mIGluZm9ybWF0aW9uIHBvc3NpYmxlOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc19sYXN0X3JlcG9ydCkKLSAgICAgICAgcHJpbnRfZmluYWxfc3RhdHModG90YWxfc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsdXNoX2VuY29kZXJzKHZvaWQpCi17Ci0gICAgaW50IGksIHJldDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSAgICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IG9zdC0+ZW5jX2N0eDsKLSAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpvcyA9IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdLT5jdHg7Ci0gICAgICAgIGludCBzdG9wX2VuY29kaW5nID0gMDsKLQotICAgICAgICBpZiAoIW9zdC0+ZW5jb2RpbmdfbmVlZGVkKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgZW5jLT5mcmFtZV9zaXplIDw9IDEpCi0gICAgICAgICAgICBjb250aW51ZTsKLSNpZiBGRl9BUElfTEFWRl9GTVRfUkFXUElDVFVSRQotICAgICAgICBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiAob3MtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfUkFXUElDVFVSRSkgJiYgZW5jLT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8pCi0gICAgICAgICAgICBjb250aW51ZTsKLSNlbmRpZgotCi0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGludCAoKmVuY29kZSkoQVZDb2RlY0NvbnRleHQqLCBBVlBhY2tldCosIGNvbnN0IEFWRnJhbWUqLCBpbnQqKSA9IE5VTEw7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGVuYy0+Y29kZWNfdHlwZSkgewotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICAgICAgZW5jb2RlID0gYXZjb2RlY19lbmNvZGVfYXVkaW8yOwotICAgICAgICAgICAgICAgIGRlc2MgICA9ICJhdWRpbyI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgICAgICAgICBlbmNvZGUgPSBhdmNvZGVjX2VuY29kZV92aWRlbzI7Ci0gICAgICAgICAgICAgICAgZGVzYyAgID0gInZpZGVvIjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgc3RvcF9lbmNvZGluZyA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChlbmNvZGUpIHsKLSAgICAgICAgICAgICAgICBBVlBhY2tldCBwa3Q7Ci0gICAgICAgICAgICAgICAgaW50IHBrdF9zaXplOwotICAgICAgICAgICAgICAgIGludCBnb3RfcGFja2V0OwotICAgICAgICAgICAgICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOwotICAgICAgICAgICAgICAgIHBrdC5kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICBwa3Quc2l6ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVfYmVuY2htYXJrKE5VTEwpOwotICAgICAgICAgICAgICAgIHJldCA9IGVuY29kZShlbmMsICZwa3QsIE5VTEwsICZnb3RfcGFja2V0KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVfYmVuY2htYXJrKCJmbHVzaF8lcyAlZC4lZCIsIGRlc2MsIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIiVzIGVuY29kaW5nIGZhaWxlZDogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAob3N0LT5sb2dmaWxlICYmIGVuYy0+c3RhdHNfb3V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZwcmludGYob3N0LT5sb2dmaWxlLCAiJXMiLCBlbmMtPnN0YXRzX291dCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZ290X3BhY2tldCkgewotICAgICAgICAgICAgICAgICAgICBzdG9wX2VuY29kaW5nID0gMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvc3QtPmZpbmlzaGVkICYgTVVYRVJfRklOSVNIRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXZfcGFja2V0X3Jlc2NhbGVfdHMoJnBrdCwgZW5jLT50aW1lX2Jhc2UsIG9zdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgICAgICAgICAgcGt0X3NpemUgPSBwa3Quc2l6ZTsKLSAgICAgICAgICAgICAgICB3cml0ZV9mcmFtZShvcywgJnBrdCwgb3N0KTsKLSAgICAgICAgICAgICAgICBpZiAob3N0LT5lbmNfY3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiB2c3RhdHNfZmlsZW5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9fdmlkZW9fc3RhdHMob3N0LCBwa3Rfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc3RvcF9lbmNvZGluZykKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoKLSAqIENoZWNrIHdoZXRoZXIgYSBwYWNrZXQgZnJvbSBpc3Qgc2hvdWxkIGJlIHdyaXR0ZW4gaW50byBvc3QgYXQgdGhpcyB0aW1lCi0gKi8KLXN0YXRpYyBpbnQgY2hlY2tfb3V0cHV0X2NvbnN0cmFpbnRzKElucHV0U3RyZWFtICppc3QsIE91dHB1dFN0cmVhbSAqb3N0KQotewotICAgIE91dHB1dEZpbGUgKm9mID0gb3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF07Ci0gICAgaW50IGlzdF9pbmRleCAgPSBpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT5pc3RfaW5kZXggKyBpc3QtPnN0LT5pbmRleDsKLQotICAgIGlmIChvc3QtPnNvdXJjZV9pbmRleCAhPSBpc3RfaW5kZXgpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKG9zdC0+ZmluaXNoZWQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKG9mLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFICYmIGlzdC0+cHRzIDwgb2YtPnN0YXJ0X3RpbWUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX3N0cmVhbWNvcHkoSW5wdXRTdHJlYW0gKmlzdCwgT3V0cHV0U3RyZWFtICpvc3QsIGNvbnN0IEFWUGFja2V0ICpwa3QpCi17Ci0gICAgT3V0cHV0RmlsZSAqb2YgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKLSAgICBJbnB1dEZpbGUgICAqZiA9IGlucHV0X2ZpbGVzIFtpc3QtPmZpbGVfaW5kZXhdOwotICAgIGludDY0X3Qgc3RhcnRfdGltZSA9IChvZi0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgPyAwIDogb2YtPnN0YXJ0X3RpbWU7Ci0gICAgaW50NjRfdCBvc3RfdGJfc3RhcnRfdGltZSA9IGF2X3Jlc2NhbGVfcShzdGFydF90aW1lLCBBVl9USU1FX0JBU0VfUSwgb3N0LT5zdC0+dGltZV9iYXNlKTsKLSAgICBBVlBpY3R1cmUgcGljdDsKLSAgICBBVlBhY2tldCBvcGt0OwotCi0gICAgYXZfaW5pdF9wYWNrZXQoJm9wa3QpOwotCi0gICAgaWYgKCghb3N0LT5mcmFtZV9udW1iZXIgJiYgIShwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSkgJiYKLSAgICAgICAgIW9zdC0+Y29weV9pbml0aWFsX25vbmtleWZyYW1lcykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFvc3QtPmZyYW1lX251bWJlciAmJiAhb3N0LT5jb3B5X3ByaW9yX3N0YXJ0KSB7Ci0gICAgICAgIGludDY0X3QgY29tcF9zdGFydCA9IHN0YXJ0X3RpbWU7Ci0gICAgICAgIGlmIChjb3B5X3RzICYmIGYtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICBjb21wX3N0YXJ0ID0gRkZNQVgoc3RhcnRfdGltZSwgZi0+c3RhcnRfdGltZSArIGYtPnRzX29mZnNldCk7Ci0gICAgICAgIGlmIChwa3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/Ci0gICAgICAgICAgICBpc3QtPnB0cyA8IGNvbXBfc3RhcnQgOgotICAgICAgICAgICAgcGt0LT5wdHMgPCBhdl9yZXNjYWxlX3EoY29tcF9zdGFydCwgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG9mLT5yZWNvcmRpbmdfdGltZSAhPSBJTlQ2NF9NQVggJiYKLSAgICAgICAgaXN0LT5wdHMgPj0gb2YtPnJlY29yZGluZ190aW1lICsgc3RhcnRfdGltZSkgewotICAgICAgICBjbG9zZV9vdXRwdXRfc3RyZWFtKG9zdCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZi0+cmVjb3JkaW5nX3RpbWUgIT0gSU5UNjRfTUFYKSB7Ci0gICAgICAgIHN0YXJ0X3RpbWUgPSBmLT5jdHgtPnN0YXJ0X3RpbWU7Ci0gICAgICAgIGlmIChmLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFICYmIGNvcHlfdHMpCi0gICAgICAgICAgICBzdGFydF90aW1lICs9IGYtPnN0YXJ0X3RpbWU7Ci0gICAgICAgIGlmIChpc3QtPnB0cyA+PSBmLT5yZWNvcmRpbmdfdGltZSArIHN0YXJ0X3RpbWUpIHsKLSAgICAgICAgICAgIGNsb3NlX291dHB1dF9zdHJlYW0ob3N0KTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGZvcmNlIHRoZSBpbnB1dCBzdHJlYW0gUFRTICovCi0gICAgaWYgKG9zdC0+ZW5jX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCi0gICAgICAgIG9zdC0+c3luY19vcHRzKys7Ci0KLSAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgIG9wa3QucHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+cHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIG9zdC0+c3QtPnRpbWVfYmFzZSkgLSBvc3RfdGJfc3RhcnRfdGltZTsKLSAgICBlbHNlCi0gICAgICAgIG9wa3QucHRzID0gQVZfTk9QVFNfVkFMVUU7Ci0KLSAgICBpZiAocGt0LT5kdHMgPT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgIG9wa3QuZHRzID0gYXZfcmVzY2FsZV9xKGlzdC0+ZHRzLCBBVl9USU1FX0JBU0VfUSwgb3N0LT5zdC0+dGltZV9iYXNlKTsKLSAgICBlbHNlCi0gICAgICAgIG9wa3QuZHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIG9zdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgb3BrdC5kdHMgLT0gb3N0X3RiX3N0YXJ0X3RpbWU7Ci0KLSAgICBpZiAob3N0LT5zdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgIGludCBkdXJhdGlvbiA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihpc3QtPmRlY19jdHgsIHBrdC0+c2l6ZSk7Ci0gICAgICAgIGlmKCFkdXJhdGlvbikKLSAgICAgICAgICAgIGR1cmF0aW9uID0gaXN0LT5kZWNfY3R4LT5mcmFtZV9zaXplOwotICAgICAgICBvcGt0LmR0cyA9IG9wa3QucHRzID0gYXZfcmVzY2FsZV9kZWx0YShpc3QtPnN0LT50aW1lX2Jhc2UsIHBrdC0+ZHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgaXN0LT5kZWNfY3R4LT5zYW1wbGVfcmF0ZX0sIGR1cmF0aW9uLCAmaXN0LT5maWx0ZXJfaW5fcmVzY2FsZV9kZWx0YV9sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPnN0LT50aW1lX2Jhc2UpIC0gb3N0X3RiX3N0YXJ0X3RpbWU7Ci0gICAgfQotCi0gICAgb3BrdC5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShwa3QtPmR1cmF0aW9uLCBpc3QtPnN0LT50aW1lX2Jhc2UsIG9zdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgb3BrdC5mbGFncyAgICA9IHBrdC0+ZmxhZ3M7Ci0gICAgLy8gRklYTUUgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgMiBsaW5lcyB0aGV5IHNoYWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBiaXRzdHJlYW0gZmlsdGVycwotICAgIGlmICggIG9zdC0+c3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjY0Ci0gICAgICAgJiYgb3N0LT5zdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUcxVklERU8KLSAgICAgICAmJiBvc3QtPnN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTwotICAgICAgICYmIG9zdC0+c3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WQzEKLSAgICAgICApIHsKLSAgICAgICAgaW50IHJldCA9IGF2X3BhcnNlcl9jaGFuZ2Uob3N0LT5wYXJzZXIsIG9zdC0+c3QtPmNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BrdC5kYXRhLCAmb3BrdC5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiYXZfcGFyc2VyX2NoYW5nZSBmYWlsZWQ6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgb3BrdC5idWYgPSBhdl9idWZmZXJfY3JlYXRlKG9wa3QuZGF0YSwgb3BrdC5zaXplLCBhdl9idWZmZXJfZGVmYXVsdF9mcmVlLCBOVUxMLCAwKTsKLSAgICAgICAgICAgIGlmICghb3BrdC5idWYpCi0gICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb3BrdC5kYXRhID0gcGt0LT5kYXRhOwotICAgICAgICBvcGt0LnNpemUgPSBwa3QtPnNpemU7Ci0gICAgfQotICAgIGF2X2NvcHlfcGFja2V0X3NpZGVfZGF0YSgmb3BrdCwgcGt0KTsKLQotI2lmIEZGX0FQSV9MQVZGX0ZNVF9SQVdQSUNUVVJFCi0gICAgaWYgKG9zdC0+c3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgotICAgICAgICBvc3QtPnN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8gJiYKLSAgICAgICAgKG9mLT5jdHgtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfUkFXUElDVFVSRSkpIHsKLSAgICAgICAgLyogc3RvcmUgQVZQaWN0dXJlIGluIEFWUGFja2V0LCBhcyBleHBlY3RlZCBieSB0aGUgb3V0cHV0IGZvcm1hdCAqLwotICAgICAgICBpbnQgcmV0ID0gYXZwaWN0dXJlX2ZpbGwoJnBpY3QsIG9wa3QuZGF0YSwgb3N0LT5zdC0+Y29kZWMtPnBpeF9mbXQsIG9zdC0+c3QtPmNvZGVjLT53aWR0aCwgb3N0LT5zdC0+Y29kZWMtPmhlaWdodCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiYXZwaWN0dXJlX2ZpbGwgZmFpbGVkOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgICAgIG9wa3QuZGF0YSA9ICh1aW50OF90ICopJnBpY3Q7Ci0gICAgICAgIG9wa3Quc2l6ZSA9IHNpemVvZihBVlBpY3R1cmUpOwotICAgICAgICBvcGt0LmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHdyaXRlX2ZyYW1lKG9mLT5jdHgsICZvcGt0LCBvc3QpOwotfQotCi1pbnQgZ3Vlc3NfaW5wdXRfY2hhbm5lbF9sYXlvdXQoSW5wdXRTdHJlYW0gKmlzdCkKLXsKLSAgICBBVkNvZGVjQ29udGV4dCAqZGVjID0gaXN0LT5kZWNfY3R4OwotCi0gICAgaWYgKCFkZWMtPmNoYW5uZWxfbGF5b3V0KSB7Ci0gICAgICAgIGNoYXIgbGF5b3V0X25hbWVbMjU2XTsKLQotICAgICAgICBpZiAoZGVjLT5jaGFubmVscyA+IGlzdC0+Z3Vlc3NfbGF5b3V0X21heCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBkZWMtPmNoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQoZGVjLT5jaGFubmVscyk7Ci0gICAgICAgIGlmICghZGVjLT5jaGFubmVsX2xheW91dCkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGxheW91dF9uYW1lLCBzaXplb2YobGF5b3V0X25hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYy0+Y2hhbm5lbHMsIGRlYy0+Y2hhbm5lbF9sYXlvdXQpOwotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJHdWVzc2VkIENoYW5uZWwgTGF5b3V0IGZvciAgSW5wdXQgU3RyZWFtICIKLSAgICAgICAgICAgICAgICIjJWQuJWQgOiAlc1xuIiwgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCwgbGF5b3V0X25hbWUpOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfZGVjb2RlX3Jlc3VsdChJbnB1dFN0cmVhbSAqaXN0LCBpbnQgKmdvdF9vdXRwdXQsIGludCByZXQpCi17Ci0gICAgaWYgKCpnb3Rfb3V0cHV0IHx8IHJldDwwKQotICAgICAgICBkZWNvZGVfZXJyb3Jfc3RhdFtyZXQ8MF0gKys7Ci0KLSAgICBpZiAocmV0IDwgMCAmJiBleGl0X29uX2Vycm9yKQotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0KLSAgICBpZiAoZXhpdF9vbl9lcnJvciAmJiAqZ290X291dHB1dCAmJiBpc3QpIHsKLSAgICAgICAgaWYgKGF2X2ZyYW1lX2dldF9kZWNvZGVfZXJyb3JfZmxhZ3MoaXN0LT5kZWNvZGVkX2ZyYW1lKSB8fCAoaXN0LT5kZWNvZGVkX2ZyYW1lLT5mbGFncyAmIEFWX0ZSQU1FX0ZMQUdfQ09SUlVQVCkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlczogY29ycnVwdCBkZWNvZGVkIGZyYW1lIGluIHN0cmVhbSAlZFxuIiwgaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+Y3R4LT5maWxlbmFtZSwgaXN0LT5zdC0+aW5kZXgpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGRlY29kZV9hdWRpbyhJbnB1dFN0cmVhbSAqaXN0LCBBVlBhY2tldCAqcGt0LCBpbnQgKmdvdF9vdXRwdXQpCi17Ci0gICAgQVZGcmFtZSAqZGVjb2RlZF9mcmFtZSwgKmY7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gaXN0LT5kZWNfY3R4OwotICAgIGludCBpLCByZXQsIGVyciA9IDAsIHJlc2FtcGxlX2NoYW5nZWQ7Ci0gICAgQVZSYXRpb25hbCBkZWNvZGVkX2ZyYW1lX3RiOwotCi0gICAgaWYgKCFpc3QtPmRlY29kZWRfZnJhbWUgJiYgIShpc3QtPmRlY29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBpZiAoIWlzdC0+ZmlsdGVyX2ZyYW1lICYmICEoaXN0LT5maWx0ZXJfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBkZWNvZGVkX2ZyYW1lID0gaXN0LT5kZWNvZGVkX2ZyYW1lOwotCi0gICAgdXBkYXRlX2JlbmNobWFyayhOVUxMKTsKLSAgICByZXQgPSBhdmNvZGVjX2RlY29kZV9hdWRpbzQoYXZjdHgsIGRlY29kZWRfZnJhbWUsIGdvdF9vdXRwdXQsIHBrdCk7Ci0gICAgdXBkYXRlX2JlbmNobWFyaygiZGVjb2RlX2F1ZGlvICVkLiVkIiwgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7Ci0KLSAgICBpZiAocmV0ID49IDAgJiYgYXZjdHgtPnNhbXBsZV9yYXRlIDw9IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTYW1wbGUgcmF0ZSAlZCBpbnZhbGlkXG4iLCBhdmN0eC0+c2FtcGxlX3JhdGUpOwotICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIH0KLQotICAgIGNoZWNrX2RlY29kZV9yZXN1bHQoaXN0LCBnb3Rfb3V0cHV0LCByZXQpOwotCi0gICAgaWYgKCEqZ290X291dHB1dCB8fCByZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgaXN0LT5zYW1wbGVzX2RlY29kZWQgKz0gZGVjb2RlZF9mcmFtZS0+bmJfc2FtcGxlczsKLSAgICBpc3QtPmZyYW1lc19kZWNvZGVkKys7Ci0KLSNpZiAxCi0gICAgLyogaW5jcmVtZW50IG5leHRfZHRzIHRvIHVzZSBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGlucHV0IHN0cmVhbSBkb2VzIG5vdAotICAgICAgIGhhdmUgdGltZXN0YW1wcyBvciB0aGVyZSBhcmUgbXVsdGlwbGUgZnJhbWVzIGluIHRoZSBwYWNrZXQgKi8KLSAgICBpc3QtPm5leHRfcHRzICs9ICgoaW50NjRfdClBVl9USU1FX0JBU0UgKiBkZWNvZGVkX2ZyYW1lLT5uYl9zYW1wbGVzKSAvCi0gICAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGU7Ci0gICAgaXN0LT5uZXh0X2R0cyArPSAoKGludDY0X3QpQVZfVElNRV9CQVNFICogZGVjb2RlZF9mcmFtZS0+bmJfc2FtcGxlcykgLwotICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlOwotI2VuZGlmCi0KLSAgICByZXNhbXBsZV9jaGFuZ2VkID0gaXN0LT5yZXNhbXBsZV9zYW1wbGVfZm10ICAgICAhPSBkZWNvZGVkX2ZyYW1lLT5mb3JtYXQgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICBpc3QtPnJlc2FtcGxlX2NoYW5uZWxzICAgICAgICE9IGF2Y3R4LT5jaGFubmVscyAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGlzdC0+cmVzYW1wbGVfY2hhbm5lbF9sYXlvdXQgIT0gZGVjb2RlZF9mcmFtZS0+Y2hhbm5lbF9sYXlvdXQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5yZXNhbXBsZV9zYW1wbGVfcmF0ZSAgICAhPSBkZWNvZGVkX2ZyYW1lLT5zYW1wbGVfcmF0ZTsKLSAgICBpZiAocmVzYW1wbGVfY2hhbmdlZCkgewotICAgICAgICBjaGFyIGxheW91dDFbNjRdLCBsYXlvdXQyWzY0XTsKLQotICAgICAgICBpZiAoIWd1ZXNzX2lucHV0X2NoYW5uZWxfbGF5b3V0KGlzdCkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbmFibGUgdG8gZmluZCBkZWZhdWx0IGNoYW5uZWwgIgotICAgICAgICAgICAgICAgICAgICJsYXlvdXQgZm9yIElucHV0IFN0cmVhbSAjJWQuJWRcbiIsIGlzdC0+ZmlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICBpc3QtPnN0LT5pbmRleCk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVjb2RlZF9mcmFtZS0+Y2hhbm5lbF9sYXlvdXQgPSBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQ7Ci0KLSAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhsYXlvdXQxLCBzaXplb2YobGF5b3V0MSksIGlzdC0+cmVzYW1wbGVfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5yZXNhbXBsZV9jaGFubmVsX2xheW91dCk7Ci0gICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcobGF5b3V0Miwgc2l6ZW9mKGxheW91dDIpLCBhdmN0eC0+Y2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZF9mcmFtZS0+Y2hhbm5lbF9sYXlvdXQpOwotCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICJJbnB1dCBzdHJlYW0gIyVkOiVkIGZyYW1lIGNoYW5nZWQgZnJvbSByYXRlOiVkIGZtdDolcyBjaDolZCBjaGw6JXMgdG8gcmF0ZTolZCBmbXQ6JXMgY2g6JWQgY2hsOiVzXG4iLAotICAgICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCwKLSAgICAgICAgICAgICAgIGlzdC0+cmVzYW1wbGVfc2FtcGxlX3JhdGUsICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGlzdC0+cmVzYW1wbGVfc2FtcGxlX2ZtdCksCi0gICAgICAgICAgICAgICBpc3QtPnJlc2FtcGxlX2NoYW5uZWxzLCBsYXlvdXQxLAotICAgICAgICAgICAgICAgZGVjb2RlZF9mcmFtZS0+c2FtcGxlX3JhdGUsIGF2X2dldF9zYW1wbGVfZm10X25hbWUoZGVjb2RlZF9mcmFtZS0+Zm9ybWF0KSwKLSAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywgbGF5b3V0Mik7Ci0KLSAgICAgICAgaXN0LT5yZXNhbXBsZV9zYW1wbGVfZm10ICAgICA9IGRlY29kZWRfZnJhbWUtPmZvcm1hdDsKLSAgICAgICAgaXN0LT5yZXNhbXBsZV9zYW1wbGVfcmF0ZSAgICA9IGRlY29kZWRfZnJhbWUtPnNhbXBsZV9yYXRlOwotICAgICAgICBpc3QtPnJlc2FtcGxlX2NoYW5uZWxfbGF5b3V0ID0gZGVjb2RlZF9mcmFtZS0+Y2hhbm5lbF9sYXlvdXQ7Ci0gICAgICAgIGlzdC0+cmVzYW1wbGVfY2hhbm5lbHMgICAgICAgPSBhdmN0eC0+Y2hhbm5lbHM7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2ZpbHRlcmdyYXBoczsgaSsrKQotICAgICAgICAgICAgaWYgKGlzdF9pbl9maWx0ZXJncmFwaChmaWx0ZXJncmFwaHNbaV0sIGlzdCkpIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJHcmFwaCAqZmcgPSBmaWx0ZXJncmFwaHNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGNvbmZpZ3VyZV9maWx0ZXJncmFwaChmZykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJFcnJvciByZWluaXRpYWxpemluZyBmaWx0ZXJzIVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogaWYgdGhlIGRlY29kZXIgcHJvdmlkZXMgYSBwdHMsIHVzZSBpdCBpbnN0ZWFkIG9mIHRoZSBsYXN0IHBhY2tldCBwdHMuCi0gICAgICAgdGhlIGRlY29kZXIgY291bGQgYmUgZGVsYXlpbmcgb3V0cHV0IGJ5IGEgcGFja2V0IG9yIG1vcmUuICovCi0gICAgaWYgKGRlY29kZWRfZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICBpc3QtPmR0cyA9IGlzdC0+bmV4dF9kdHMgPSBpc3QtPnB0cyA9IGlzdC0+bmV4dF9wdHMgPSBhdl9yZXNjYWxlX3EoZGVjb2RlZF9mcmFtZS0+cHRzLCBhdmN0eC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7Ci0gICAgICAgIGRlY29kZWRfZnJhbWVfdGIgICA9IGF2Y3R4LT50aW1lX2Jhc2U7Ci0gICAgfSBlbHNlIGlmIChkZWNvZGVkX2ZyYW1lLT5wa3RfcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgIGRlY29kZWRfZnJhbWUtPnB0cyA9IGRlY29kZWRfZnJhbWUtPnBrdF9wdHM7Ci0gICAgICAgIGRlY29kZWRfZnJhbWVfdGIgICA9IGlzdC0+c3QtPnRpbWVfYmFzZTsKLSAgICB9IGVsc2UgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgIGRlY29kZWRfZnJhbWUtPnB0cyA9IHBrdC0+cHRzOwotICAgICAgICBkZWNvZGVkX2ZyYW1lX3RiICAgPSBpc3QtPnN0LT50aW1lX2Jhc2U7Ci0gICAgfWVsc2UgewotICAgICAgICBkZWNvZGVkX2ZyYW1lLT5wdHMgPSBpc3QtPmR0czsKLSAgICAgICAgZGVjb2RlZF9mcmFtZV90YiAgID0gQVZfVElNRV9CQVNFX1E7Ci0gICAgfQotICAgIHBrdC0+cHRzICAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOwotICAgIGlmIChkZWNvZGVkX2ZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgIGRlY29kZWRfZnJhbWUtPnB0cyA9IGF2X3Jlc2NhbGVfZGVsdGEoZGVjb2RlZF9mcmFtZV90YiwgZGVjb2RlZF9mcmFtZS0+cHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBhdmN0eC0+c2FtcGxlX3JhdGV9LCBkZWNvZGVkX2ZyYW1lLT5uYl9zYW1wbGVzLCAmaXN0LT5maWx0ZXJfaW5fcmVzY2FsZV9kZWx0YV9sYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBhdmN0eC0+c2FtcGxlX3JhdGV9KTsKLSAgICBpc3QtPm5iX3NhbXBsZXMgPSBkZWNvZGVkX2ZyYW1lLT5uYl9zYW1wbGVzOwotICAgIGZvciAoaSA9IDA7IGkgPCBpc3QtPm5iX2ZpbHRlcnM7IGkrKykgewotICAgICAgICBpZiAoaSA8IGlzdC0+bmJfZmlsdGVycyAtIDEpIHsKLSAgICAgICAgICAgIGYgPSBpc3QtPmZpbHRlcl9mcmFtZTsKLSAgICAgICAgICAgIGVyciA9IGF2X2ZyYW1lX3JlZihmLCBkZWNvZGVkX2ZyYW1lKTsKLSAgICAgICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGYgPSBkZWNvZGVkX2ZyYW1lOwotICAgICAgICBlcnIgPSBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKGlzdC0+ZmlsdGVyc1tpXS0+ZmlsdGVyLCBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0JVRkZFUlNSQ19GTEFHX1BVU0gpOwotICAgICAgICBpZiAoZXJyID09IEFWRVJST1JfRU9GKQotICAgICAgICAgICAgZXJyID0gMDsgLyogaWdub3JlICovCi0gICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlY29kZWRfZnJhbWUtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOwotCi0gICAgYXZfZnJhbWVfdW5yZWYoaXN0LT5maWx0ZXJfZnJhbWUpOwotICAgIGF2X2ZyYW1lX3VucmVmKGRlY29kZWRfZnJhbWUpOwotICAgIHJldHVybiBlcnIgPCAwID8gZXJyIDogcmV0OwotfQotCi1zdGF0aWMgaW50IGRlY29kZV92aWRlbyhJbnB1dFN0cmVhbSAqaXN0LCBBVlBhY2tldCAqcGt0LCBpbnQgKmdvdF9vdXRwdXQpCi17Ci0gICAgQVZGcmFtZSAqZGVjb2RlZF9mcmFtZSwgKmY7Ci0gICAgaW50IGksIHJldCA9IDAsIGVyciA9IDAsIHJlc2FtcGxlX2NoYW5nZWQ7Ci0gICAgaW50NjRfdCBiZXN0X2VmZm9ydF90aW1lc3RhbXA7Ci0gICAgQVZSYXRpb25hbCAqZnJhbWVfc2FtcGxlX2FzcGVjdDsKLQotICAgIGlmICghaXN0LT5kZWNvZGVkX2ZyYW1lICYmICEoaXN0LT5kZWNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgaWYgKCFpc3QtPmZpbHRlcl9mcmFtZSAmJiAhKGlzdC0+ZmlsdGVyX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgZGVjb2RlZF9mcmFtZSA9IGlzdC0+ZGVjb2RlZF9mcmFtZTsKLSAgICBwa3QtPmR0cyAgPSBhdl9yZXNjYWxlX3EoaXN0LT5kdHMsIEFWX1RJTUVfQkFTRV9RLCBpc3QtPnN0LT50aW1lX2Jhc2UpOwotCi0gICAgdXBkYXRlX2JlbmNobWFyayhOVUxMKTsKLSAgICByZXQgPSBhdmNvZGVjX2RlY29kZV92aWRlbzIoaXN0LT5kZWNfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkX2ZyYW1lLCBnb3Rfb3V0cHV0LCBwa3QpOwotICAgIHVwZGF0ZV9iZW5jaG1hcmsoImRlY29kZV92aWRlbyAlZC4lZCIsIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgpOwotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBsaW5lIG1heSBiZSByZXF1aXJlZCBpbiBzb21lIGNhc2VzIHdoZXJlIHRoZXJlIGlzIG5vIHBhcnNlcgotICAgIC8vIG9yIHRoZSBwYXJzZXIgZG9lcyBub3QgaGFzX2JfZnJhbWVzIGNvcnJlY3RseQotICAgIGlmIChpc3QtPnN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzIDwgaXN0LT5kZWNfY3R4LT5oYXNfYl9mcmFtZXMpIHsKLSAgICAgICAgaWYgKGlzdC0+ZGVjX2N0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgewotICAgICAgICAgICAgaXN0LT5zdC0+Y29kZWMtPmhhc19iX2ZyYW1lcyA9IGlzdC0+ZGVjX2N0eC0+aGFzX2JfZnJhbWVzOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGF2X2xvZyhpc3QtPmRlY19jdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICJoYXNfYl9mcmFtZXMgaXMgbGFyZ2VyIGluIGRlY29kZXIgdGhhbiBkZW11eGVyICVkID4gJWQuXG4iCi0gICAgICAgICAgICAgICAgICAgIklmIHlvdSB3YW50IHRvIGhlbHAsIHVwbG9hZCBhIHNhbXBsZSAiCi0gICAgICAgICAgICAgICAgICAgIm9mIHRoaXMgZmlsZSB0byBmdHA6Ly91cGxvYWQuZmZtcGVnLm9yZy9pbmNvbWluZy8gIgotICAgICAgICAgICAgICAgICAgICJhbmQgY29udGFjdCB0aGUgZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdC4gKGZmbXBlZy1kZXZlbEBmZm1wZWcub3JnKSIsCi0gICAgICAgICAgICAgICAgICAgaXN0LT5kZWNfY3R4LT5oYXNfYl9mcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgaXN0LT5zdC0+Y29kZWMtPmhhc19iX2ZyYW1lcyk7Ci0gICAgfQotCi0gICAgY2hlY2tfZGVjb2RlX3Jlc3VsdChpc3QsIGdvdF9vdXRwdXQsIHJldCk7Ci0KLSAgICBpZiAoKmdvdF9vdXRwdXQgJiYgcmV0ID49IDApIHsKLSAgICAgICAgaWYgKGlzdC0+ZGVjX2N0eC0+d2lkdGggICE9IGRlY29kZWRfZnJhbWUtPndpZHRoIHx8Ci0gICAgICAgICAgICBpc3QtPmRlY19jdHgtPmhlaWdodCAhPSBkZWNvZGVkX2ZyYW1lLT5oZWlnaHQgfHwKLSAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+cGl4X2ZtdCAhPSBkZWNvZGVkX2ZyYW1lLT5mb3JtYXQpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJGcmFtZSBwYXJhbWV0ZXJzIG1pc21hdGNoIGNvbnRleHQgJWQsJWQsJWQgIT0gJWQsJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgZGVjb2RlZF9mcmFtZS0+d2lkdGgsCi0gICAgICAgICAgICAgICAgZGVjb2RlZF9mcmFtZS0+aGVpZ2h0LAotICAgICAgICAgICAgICAgIGRlY29kZWRfZnJhbWUtPmZvcm1hdCwKLSAgICAgICAgICAgICAgICBpc3QtPmRlY19jdHgtPndpZHRoLAotICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+aGVpZ2h0LAotICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+cGl4X2ZtdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoISpnb3Rfb3V0cHV0IHx8IHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBpZihpc3QtPnRvcF9maWVsZF9maXJzdD49MCkKLSAgICAgICAgZGVjb2RlZF9mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID0gaXN0LT50b3BfZmllbGRfZmlyc3Q7Ci0KLSAgICBpc3QtPmZyYW1lc19kZWNvZGVkKys7Ci0KLSAgICBpZiAoaXN0LT5od2FjY2VsX3JldHJpZXZlX2RhdGEgJiYgZGVjb2RlZF9mcmFtZS0+Zm9ybWF0ID09IGlzdC0+aHdhY2NlbF9waXhfZm10KSB7Ci0gICAgICAgIGVyciA9IGlzdC0+aHdhY2NlbF9yZXRyaWV2ZV9kYXRhKGlzdC0+ZGVjX2N0eCwgZGVjb2RlZF9mcmFtZSk7Ci0gICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBpc3QtPmh3YWNjZWxfcmV0cmlldmVkX3BpeF9mbXQgPSBkZWNvZGVkX2ZyYW1lLT5mb3JtYXQ7Ci0KLSAgICBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IGF2X2ZyYW1lX2dldF9iZXN0X2VmZm9ydF90aW1lc3RhbXAoZGVjb2RlZF9mcmFtZSk7Ci0gICAgaWYoYmVzdF9lZmZvcnRfdGltZXN0YW1wICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICBpc3QtPm5leHRfcHRzID0gaXN0LT5wdHMgPSBhdl9yZXNjYWxlX3EoZGVjb2RlZF9mcmFtZS0+cHRzID0gYmVzdF9lZmZvcnRfdGltZXN0YW1wLCBpc3QtPnN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKLQotICAgIGlmIChkZWJ1Z190cykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJkZWNvZGVyIC0+IGlzdF9pbmRleDolZCB0eXBlOnZpZGVvICIKLSAgICAgICAgICAgICAgICJmcmFtZV9wdHM6JXMgZnJhbWVfcHRzX3RpbWU6JXMgYmVzdF9lZmZvcnRfdHM6JSJQUklkNjQiIGJlc3RfZWZmb3J0X3RzX3RpbWU6JXMga2V5ZnJhbWU6JWQgZnJhbWVfdHlwZTolZCB0aW1lX2Jhc2U6JWQvJWRcbiIsCi0gICAgICAgICAgICAgICBpc3QtPnN0LT5pbmRleCwgYXZfdHMyc3RyKGRlY29kZWRfZnJhbWUtPnB0cyksCi0gICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGRlY29kZWRfZnJhbWUtPnB0cywgJmlzdC0+c3QtPnRpbWVfYmFzZSksCi0gICAgICAgICAgICAgICBiZXN0X2VmZm9ydF90aW1lc3RhbXAsCi0gICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGJlc3RfZWZmb3J0X3RpbWVzdGFtcCwgJmlzdC0+c3QtPnRpbWVfYmFzZSksCi0gICAgICAgICAgICAgICBkZWNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUsIGRlY29kZWRfZnJhbWUtPnBpY3RfdHlwZSwKLSAgICAgICAgICAgICAgIGlzdC0+c3QtPnRpbWVfYmFzZS5udW0sIGlzdC0+c3QtPnRpbWVfYmFzZS5kZW4pOwotICAgIH0KLQotICAgIHBrdC0+c2l6ZSA9IDA7Ci0KLSAgICBpZiAoaXN0LT5zdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pCi0gICAgICAgIGRlY29kZWRfZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpc3QtPnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvOwotCi0gICAgcmVzYW1wbGVfY2hhbmdlZCA9IGlzdC0+cmVzYW1wbGVfd2lkdGggICAhPSBkZWNvZGVkX2ZyYW1lLT53aWR0aCAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5yZXNhbXBsZV9oZWlnaHQgICE9IGRlY29kZWRfZnJhbWUtPmhlaWdodCB8fAotICAgICAgICAgICAgICAgICAgICAgICBpc3QtPnJlc2FtcGxlX3BpeF9mbXQgIT0gZGVjb2RlZF9mcmFtZS0+Zm9ybWF0OwotICAgIGlmIChyZXNhbXBsZV9jaGFuZ2VkKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICJJbnB1dCBzdHJlYW0gIyVkOiVkIGZyYW1lIGNoYW5nZWQgZnJvbSBzaXplOiVkeCVkIGZtdDolcyB0byBzaXplOiVkeCVkIGZtdDolc1xuIiwKLSAgICAgICAgICAgICAgIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgsCi0gICAgICAgICAgICAgICBpc3QtPnJlc2FtcGxlX3dpZHRoLCAgaXN0LT5yZXNhbXBsZV9oZWlnaHQsICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGlzdC0+cmVzYW1wbGVfcGl4X2ZtdCksCi0gICAgICAgICAgICAgICBkZWNvZGVkX2ZyYW1lLT53aWR0aCwgZGVjb2RlZF9mcmFtZS0+aGVpZ2h0LCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGRlY29kZWRfZnJhbWUtPmZvcm1hdCkpOwotCi0gICAgICAgIGlzdC0+cmVzYW1wbGVfd2lkdGggICA9IGRlY29kZWRfZnJhbWUtPndpZHRoOwotICAgICAgICBpc3QtPnJlc2FtcGxlX2hlaWdodCAgPSBkZWNvZGVkX2ZyYW1lLT5oZWlnaHQ7Ci0gICAgICAgIGlzdC0+cmVzYW1wbGVfcGl4X2ZtdCA9IGRlY29kZWRfZnJhbWUtPmZvcm1hdDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZmlsdGVyZ3JhcGhzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpc3RfaW5fZmlsdGVyZ3JhcGgoZmlsdGVyZ3JhcGhzW2ldLCBpc3QpICYmIGlzdC0+cmVpbml0X2ZpbHRlcnMgJiYKLSAgICAgICAgICAgICAgICBjb25maWd1cmVfZmlsdGVyZ3JhcGgoZmlsdGVyZ3JhcGhzW2ldKSA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRXJyb3IgcmVpbml0aWFsaXppbmcgZmlsdGVycyFcbiIpOwotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZyYW1lX3NhbXBsZV9hc3BlY3Q9IGF2X29wdF9wdHIoYXZjb2RlY19nZXRfZnJhbWVfY2xhc3MoKSwgZGVjb2RlZF9mcmFtZSwgInNhbXBsZV9hc3BlY3RfcmF0aW8iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXN0LT5uYl9maWx0ZXJzOyBpKyspIHsKLSAgICAgICAgaWYgKCFmcmFtZV9zYW1wbGVfYXNwZWN0LT5udW0pCi0gICAgICAgICAgICAqZnJhbWVfc2FtcGxlX2FzcGVjdCA9IGlzdC0+c3QtPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0KLSAgICAgICAgaWYgKGkgPCBpc3QtPm5iX2ZpbHRlcnMgLSAxKSB7Ci0gICAgICAgICAgICBmID0gaXN0LT5maWx0ZXJfZnJhbWU7Ci0gICAgICAgICAgICBlcnIgPSBhdl9mcmFtZV9yZWYoZiwgZGVjb2RlZF9mcmFtZSk7Ci0gICAgICAgICAgICBpZiAoZXJyIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBmID0gZGVjb2RlZF9mcmFtZTsKLSAgICAgICAgcmV0ID0gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZV9mbGFncyhpc3QtPmZpbHRlcnNbaV0tPmZpbHRlciwgZiwgQVZfQlVGRkVSU1JDX0ZMQUdfUFVTSCk7Ci0gICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKLSAgICAgICAgICAgIHJldCA9IDA7IC8qIGlnbm9yZSAqLwotICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCi0gICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbmplY3QgZnJhbWUgaW50byBmaWx0ZXIgbmV0d29yazogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLWZhaWw6Ci0gICAgYXZfZnJhbWVfdW5yZWYoaXN0LT5maWx0ZXJfZnJhbWUpOwotICAgIGF2X2ZyYW1lX3VucmVmKGRlY29kZWRfZnJhbWUpOwotICAgIHJldHVybiBlcnIgPCAwID8gZXJyIDogcmV0OwotfQotCi1zdGF0aWMgaW50IHRyYW5zY29kZV9zdWJ0aXRsZXMoSW5wdXRTdHJlYW0gKmlzdCwgQVZQYWNrZXQgKnBrdCwgaW50ICpnb3Rfb3V0cHV0KQotewotICAgIEFWU3VidGl0bGUgc3VidGl0bGU7Ci0gICAgaW50IGksIHJldCA9IGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMihpc3QtPmRlY19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VidGl0bGUsIGdvdF9vdXRwdXQsIHBrdCk7Ci0KLSAgICBjaGVja19kZWNvZGVfcmVzdWx0KE5VTEwsIGdvdF9vdXRwdXQsIHJldCk7Ci0KLSAgICBpZiAocmV0IDwgMCB8fCAhKmdvdF9vdXRwdXQpIHsKLSAgICAgICAgaWYgKCFwa3QtPnNpemUpCi0gICAgICAgICAgICBzdWIydmlkZW9fZmx1c2goaXN0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBpZiAoaXN0LT5maXhfc3ViX2R1cmF0aW9uKSB7Ci0gICAgICAgIGludCBlbmQgPSAxOwotICAgICAgICBpZiAoaXN0LT5wcmV2X3N1Yi5nb3Rfb3V0cHV0KSB7Ci0gICAgICAgICAgICBlbmQgPSBhdl9yZXNjYWxlKHN1YnRpdGxlLnB0cyAtIGlzdC0+cHJldl9zdWIuc3VidGl0bGUucHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLCBBVl9USU1FX0JBU0UpOwotICAgICAgICAgICAgaWYgKGVuZCA8IGlzdC0+cHJldl9zdWIuc3VidGl0bGUuZW5kX2Rpc3BsYXlfdGltZSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhpc3QtPmRlY19jdHgsIEFWX0xPR19ERUJVRywKLSAgICAgICAgICAgICAgICAgICAgICAgIlN1YnRpdGxlIGR1cmF0aW9uIHJlZHVjZWQgZnJvbSAlZCB0byAlZCVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBpc3QtPnByZXZfc3ViLnN1YnRpdGxlLmVuZF9kaXNwbGF5X3RpbWUsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgZW5kIDw9IDAgPyAiLCBkcm9wcGluZyBpdCIgOiAiIik7Ci0gICAgICAgICAgICAgICAgaXN0LT5wcmV2X3N1Yi5zdWJ0aXRsZS5lbmRfZGlzcGxheV90aW1lID0gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZGU1dBUChpbnQsICAgICAgICAqZ290X291dHB1dCwgaXN0LT5wcmV2X3N1Yi5nb3Rfb3V0cHV0KTsKLSAgICAgICAgRkZTV0FQKGludCwgICAgICAgIHJldCwgICAgICAgICBpc3QtPnByZXZfc3ViLnJldCk7Ci0gICAgICAgIEZGU1dBUChBVlN1YnRpdGxlLCBzdWJ0aXRsZSwgICAgaXN0LT5wcmV2X3N1Yi5zdWJ0aXRsZSk7Ci0gICAgICAgIGlmIChlbmQgPD0gMCkKLSAgICAgICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIGlmICghKmdvdF9vdXRwdXQpCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBzdWIydmlkZW9fdXBkYXRlKGlzdCwgJnN1YnRpdGxlKTsKLQotICAgIGlmICghc3VidGl0bGUubnVtX3JlY3RzKQotICAgICAgICBnb3RvIG91dDsKLQotICAgIGlzdC0+ZnJhbWVzX2RlY29kZWQrKzsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gb3V0cHV0X3N0cmVhbXNbaV07Ci0KLSAgICAgICAgaWYgKCFjaGVja19vdXRwdXRfY29uc3RyYWludHMoaXN0LCBvc3QpIHx8ICFvc3QtPmVuY29kaW5nX25lZWRlZAotICAgICAgICAgICAgfHwgb3N0LT5lbmMtPnR5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZG9fc3VidGl0bGVfb3V0KG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdLT5jdHgsIG9zdCwgaXN0LCAmc3VidGl0bGUpOwotICAgIH0KLQotb3V0OgotICAgIGF2c3VidGl0bGVfZnJlZSgmc3VidGl0bGUpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2VuZF9maWx0ZXJfZW9mKElucHV0U3RyZWFtICppc3QpCi17Ci0gICAgaW50IGksIHJldDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaXN0LT5uYl9maWx0ZXJzOyBpKyspIHsKLSAgICAgICAgcmV0ID0gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZShpc3QtPmZpbHRlcnNbaV0tPmZpbHRlciwgTlVMTCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIHBrdCA9IE5VTEwgbWVhbnMgRU9GIChuZWVkZWQgdG8gZmx1c2ggZGVjb2RlciBidWZmZXJzKSAqLwotc3RhdGljIGludCBwcm9jZXNzX2lucHV0X3BhY2tldChJbnB1dFN0cmVhbSAqaXN0LCBjb25zdCBBVlBhY2tldCAqcGt0LCBpbnQgbm9fZW9mKQotewotICAgIGludCByZXQgPSAwLCBpOwotICAgIGludCBnb3Rfb3V0cHV0ID0gMDsKLQotICAgIEFWUGFja2V0IGF2cGt0OwotICAgIGlmICghaXN0LT5zYXdfZmlyc3RfdHMpIHsKLSAgICAgICAgaXN0LT5kdHMgPSBpc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gPyAtIGlzdC0+ZGVjX2N0eC0+aGFzX2JfZnJhbWVzICogQVZfVElNRV9CQVNFIC8gYXZfcTJkKGlzdC0+c3QtPmF2Z19mcmFtZV9yYXRlKSA6IDA7Ci0gICAgICAgIGlzdC0+cHRzID0gMDsKLSAgICAgICAgaWYgKHBrdCAmJiBwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiAhaXN0LT5kZWNvZGluZ19uZWVkZWQpIHsKLSAgICAgICAgICAgIGlzdC0+ZHRzICs9IGF2X3Jlc2NhbGVfcShwa3QtPnB0cywgaXN0LT5zdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7Ci0gICAgICAgICAgICBpc3QtPnB0cyA9IGlzdC0+ZHRzOyAvL3VudXNlZCBidXQgYmV0dGVyIHRvIHNldCBpdCB0byBhIHZhbHVlIHRoYXRzIG5vdCB0b3RhbGx5IHdyb25nCi0gICAgICAgIH0KLSAgICAgICAgaXN0LT5zYXdfZmlyc3RfdHMgPSAxOwotICAgIH0KLQotICAgIGlmIChpc3QtPm5leHRfZHRzID09IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICBpc3QtPm5leHRfZHRzID0gaXN0LT5kdHM7Ci0gICAgaWYgKGlzdC0+bmV4dF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgIGlzdC0+bmV4dF9wdHMgPSBpc3QtPnB0czsKLQotICAgIGlmICghcGt0KSB7Ci0gICAgICAgIC8qIEVPRiBoYW5kbGluZyAqLwotICAgICAgICBhdl9pbml0X3BhY2tldCgmYXZwa3QpOwotICAgICAgICBhdnBrdC5kYXRhID0gTlVMTDsKLSAgICAgICAgYXZwa3Quc2l6ZSA9IDA7Ci0gICAgICAgIGdvdG8gaGFuZGxlX2VvZjsKLSAgICB9IGVsc2UgewotICAgICAgICBhdnBrdCA9ICpwa3Q7Ci0gICAgfQotCi0gICAgaWYgKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgIGlzdC0+bmV4dF9kdHMgPSBpc3QtPmR0cyA9IGF2X3Jlc2NhbGVfcShwa3QtPmR0cywgaXN0LT5zdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7Ci0gICAgICAgIGlmIChpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8ICFpc3QtPmRlY29kaW5nX25lZWRlZCkKLSAgICAgICAgICAgIGlzdC0+bmV4dF9wdHMgPSBpc3QtPnB0cyA9IGlzdC0+ZHRzOwotICAgIH0KLQotICAgIC8vIHdoaWxlIHdlIGhhdmUgbW9yZSB0byBkZWNvZGUgb3Igd2hpbGUgdGhlIGRlY29kZXIgZGlkIG91dHB1dCBzb21ldGhpbmcgb24gRU9GCi0gICAgd2hpbGUgKGlzdC0+ZGVjb2RpbmdfbmVlZGVkICYmIChhdnBrdC5zaXplID4gMCB8fCAoIXBrdCAmJiBnb3Rfb3V0cHV0KSkpIHsKLSAgICAgICAgaW50IGR1cmF0aW9uOwotICAgIGhhbmRsZV9lb2Y6Ci0KLSAgICAgICAgaXN0LT5wdHMgPSBpc3QtPm5leHRfcHRzOwotICAgICAgICBpc3QtPmR0cyA9IGlzdC0+bmV4dF9kdHM7Ci0KLSAgICAgICAgaWYgKGF2cGt0LnNpemUgJiYgYXZwa3Quc2l6ZSAhPSBwa3QtPnNpemUgJiYKLSAgICAgICAgICAgICEoaXN0LT5kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9TVUJGUkFNRVMpKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgaXN0LT5zaG93ZWRfbXVsdGlfcGFja2V0X3dhcm5pbmcgPyBBVl9MT0dfVkVSQk9TRSA6IEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBmcmFtZXMgaW4gYSBwYWNrZXQgZnJvbSBzdHJlYW0gJWRcbiIsIHBrdC0+c3RyZWFtX2luZGV4KTsKLSAgICAgICAgICAgIGlzdC0+c2hvd2VkX211bHRpX3BhY2tldF93YXJuaW5nID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAoaXN0LT5kZWNfY3R4LT5jb2RlY190eXBlKSB7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2F1ZGlvICAgIChpc3QsICZhdnBrdCwgJmdvdF9vdXRwdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3ZpZGVvICAgIChpc3QsICZhdnBrdCwgJmdvdF9vdXRwdXQpOwotICAgICAgICAgICAgaWYgKGF2cGt0LmR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EoYXZwa3QuZHVyYXRpb24sIGlzdC0+c3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGlzdC0+ZGVjX2N0eC0+ZnJhbWVyYXRlLm51bSAhPSAwICYmIGlzdC0+ZGVjX2N0eC0+ZnJhbWVyYXRlLmRlbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHRpY2tzPSBhdl9zdHJlYW1fZ2V0X3BhcnNlcihpc3QtPnN0KSA/IGF2X3N0cmVhbV9nZXRfcGFyc2VyKGlzdC0+c3QpLT5yZXBlYXRfcGljdCsxIDogaXN0LT5kZWNfY3R4LT50aWNrc19wZXJfZnJhbWU7Ci0gICAgICAgICAgICAgICAgZHVyYXRpb24gPSAoKGludDY0X3QpQVZfVElNRV9CQVNFICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5kZWNfY3R4LT5mcmFtZXJhdGUuZGVuICogdGlja3MpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5kZWNfY3R4LT5mcmFtZXJhdGUubnVtIC8gaXN0LT5kZWNfY3R4LT50aWNrc19wZXJfZnJhbWU7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIGlmKGlzdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaXN0LT5uZXh0X2R0cyArPSBkdXJhdGlvbjsKLSAgICAgICAgICAgIH1lbHNlCi0gICAgICAgICAgICAgICAgaXN0LT5uZXh0X2R0cyA9IEFWX05PUFRTX1ZBTFVFOwotCi0gICAgICAgICAgICBpZiAoZ290X291dHB1dCkKLSAgICAgICAgICAgICAgICBpc3QtPm5leHRfcHRzICs9IGR1cmF0aW9uOyAvL0ZJWE1FIHRoZSBkdXJhdGlvbiBpcyBub3QgY29ycmVjdCBpbiBzb21lIGNhc2VzCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6Ci0gICAgICAgICAgICByZXQgPSB0cmFuc2NvZGVfc3VidGl0bGVzKGlzdCwgJmF2cGt0LCAmZ290X291dHB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hpbGUgZGVjb2Rpbmcgc3RyZWFtICMlZDolZDogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCwgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgICAgIGlmIChleGl0X29uX2Vycm9yKQotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgYXZwa3QuZHRzPQotICAgICAgICBhdnBrdC5wdHM9IEFWX05PUFRTX1ZBTFVFOwotCi0gICAgICAgIC8vIHRvdWNoIGRhdGEgYW5kIHNpemUgb25seSBpZiBub3QgRU9GCi0gICAgICAgIGlmIChwa3QpIHsKLSAgICAgICAgICAgIGlmKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pCi0gICAgICAgICAgICAgICAgcmV0ID0gYXZwa3Quc2l6ZTsKLSAgICAgICAgICAgIGF2cGt0LmRhdGEgKz0gcmV0OwotICAgICAgICAgICAgYXZwa3Quc2l6ZSAtPSByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFnb3Rfb3V0cHV0KSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ290X291dHB1dCAmJiAhcGt0KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLyogYWZ0ZXIgZmx1c2hpbmcsIHNlbmQgYW4gRU9GIG9uIGFsbCB0aGUgZmlsdGVyIGlucHV0cyBhdHRhY2hlZCB0byB0aGUgc3RyZWFtICovCi0gICAgLyogZXhjZXB0IHdoZW4gbG9vcGluZyB3ZSBuZWVkIHRvIGZsdXNoIGJ1dCBub3QgdG8gc2VuZCBhbiBFT0YgKi8KLSAgICBpZiAoIXBrdCAmJiBpc3QtPmRlY29kaW5nX25lZWRlZCAmJiAhZ290X291dHB1dCAmJiAhbm9fZW9mKSB7Ci0gICAgICAgIGludCByZXQgPSBzZW5kX2ZpbHRlcl9lb2YoaXN0KTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJFcnJvciBtYXJraW5nIGZpbHRlcnMgYXMgZmluaXNoZWRcbiIpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogaGFuZGxlIHN0cmVhbSBjb3B5ICovCi0gICAgaWYgKCFpc3QtPmRlY29kaW5nX25lZWRlZCkgewotICAgICAgICBpc3QtPmR0cyA9IGlzdC0+bmV4dF9kdHM7Ci0gICAgICAgIHN3aXRjaCAoaXN0LT5kZWNfY3R4LT5jb2RlY190eXBlKSB7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgaXN0LT5uZXh0X2R0cyArPSAoKGludDY0X3QpQVZfVElNRV9CQVNFICogaXN0LT5kZWNfY3R4LT5mcmFtZV9zaXplKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+c2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICBpZiAoaXN0LT5mcmFtZXJhdGUubnVtKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHdvcmstYXJvdW5kIGZvciBjOTktdG8tYzg5IGlzc3VlIDcKLSAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZV9xID0gQVZfVElNRV9CQVNFX1E7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBuZXh0X2R0cyA9IGF2X3Jlc2NhbGVfcShpc3QtPm5leHRfZHRzLCB0aW1lX2Jhc2VfcSwgYXZfaW52X3EoaXN0LT5mcmFtZXJhdGUpKTsKLSAgICAgICAgICAgICAgICBpc3QtPm5leHRfZHRzID0gYXZfcmVzY2FsZV9xKG5leHRfZHRzICsgMSwgYXZfaW52X3EoaXN0LT5mcmFtZXJhdGUpLCB0aW1lX2Jhc2VfcSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBrdC0+ZHVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBpc3QtPm5leHRfZHRzICs9IGF2X3Jlc2NhbGVfcShwa3QtPmR1cmF0aW9uLCBpc3QtPnN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZihpc3QtPmRlY19jdHgtPmZyYW1lcmF0ZS5udW0gIT0gMCkgewotICAgICAgICAgICAgICAgIGludCB0aWNrcz0gYXZfc3RyZWFtX2dldF9wYXJzZXIoaXN0LT5zdCkgPyBhdl9zdHJlYW1fZ2V0X3BhcnNlcihpc3QtPnN0KS0+cmVwZWF0X3BpY3QgKyAxIDogaXN0LT5kZWNfY3R4LT50aWNrc19wZXJfZnJhbWU7Ci0gICAgICAgICAgICAgICAgaXN0LT5uZXh0X2R0cyArPSAoKGludDY0X3QpQVZfVElNRV9CQVNFICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmZyYW1lcmF0ZS5kZW4gKiB0aWNrcykgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+ZnJhbWVyYXRlLm51bSAvIGlzdC0+ZGVjX2N0eC0+dGlja3NfcGVyX2ZyYW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaXN0LT5wdHMgPSBpc3QtPmR0czsKLSAgICAgICAgaXN0LT5uZXh0X3B0cyA9IGlzdC0+bmV4dF9kdHM7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IHBrdCAmJiBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgewotICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOwotCi0gICAgICAgIGlmICghY2hlY2tfb3V0cHV0X2NvbnN0cmFpbnRzKGlzdCwgb3N0KSB8fCBvc3QtPmVuY29kaW5nX25lZWRlZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGRvX3N0cmVhbWNvcHkoaXN0LCBvc3QsIHBrdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdvdF9vdXRwdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X3NkcCh2b2lkKQotewotICAgIGNoYXIgc2RwWzE2Mzg0XTsKLSAgICBpbnQgaTsKLSAgICBpbnQgajsKLSAgICBBVklPQ29udGV4dCAqc2RwX3BiOwotICAgIEFWRm9ybWF0Q29udGV4dCAqKmF2YyA9IGF2X21hbGxvY19hcnJheShuYl9vdXRwdXRfZmlsZXMsIHNpemVvZigqYXZjKSk7Ci0KLSAgICBpZiAoIWF2YykKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbmJfb3V0cHV0X2ZpbGVzOyBpKyspIHsKLSAgICAgICAgaWYgKCFzdHJjbXAob3V0cHV0X2ZpbGVzW2ldLT5jdHgtPm9mb3JtYXQtPm5hbWUsICJydHAiKSkgewotICAgICAgICAgICAgYXZjW2pdID0gb3V0cHV0X2ZpbGVzW2ldLT5jdHg7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWopCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGF2X3NkcF9jcmVhdGUoYXZjLCBqLCBzZHAsIHNpemVvZihzZHApKTsKLQotICAgIGlmICghc2RwX2ZpbGVuYW1lKSB7Ci0gICAgICAgIHByaW50ZigiU0RQOlxuJXNcbiIsIHNkcCk7Ci0gICAgICAgIGZmbHVzaChzdGRvdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhdmlvX29wZW4yKCZzZHBfcGIsIHNkcF9maWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFLCAmaW50X2NiLCBOVUxMKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBzZHAgZmlsZSAnJXMnXG4iLCBzZHBfZmlsZW5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZpb19wcmludGYoc2RwX3BiLCAiU0RQOlxuJXMiLCBzZHApOwotICAgICAgICAgICAgYXZpb19jbG9zZXAoJnNkcF9wYik7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmc2RwX2ZpbGVuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLQotZmFpbDoKLSAgICBhdl9mcmVlcCgmYXZjKTsKLX0KLQotc3RhdGljIGNvbnN0IEhXQWNjZWwgKmdldF9od2FjY2VsKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGh3YWNjZWxzW2ldLm5hbWU7IGkrKykKLSAgICAgICAgaWYgKGh3YWNjZWxzW2ldLnBpeF9mbXQgPT0gcGl4X2ZtdCkKLSAgICAgICAgICAgIHJldHVybiAmaHdhY2NlbHNbaV07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgZ2V0X2Zvcm1hdChBVkNvZGVjQ29udGV4dCAqcywgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10cykKLXsKLSAgICBJbnB1dFN0cmVhbSAqaXN0ID0gcy0+b3BhcXVlOwotICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcDsKLSAgICBpbnQgcmV0OwotCi0gICAgZm9yIChwID0gcGl4X2ZtdHM7ICpwICE9IC0xOyBwKyspIHsKLSAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldCgqcCk7Ci0gICAgICAgIGNvbnN0IEhXQWNjZWwgKmh3YWNjZWw7Ci0KLSAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBod2FjY2VsID0gZ2V0X2h3YWNjZWwoKnApOwotICAgICAgICBpZiAoIWh3YWNjZWwgfHwKLSAgICAgICAgICAgIChpc3QtPmFjdGl2ZV9od2FjY2VsX2lkICYmIGlzdC0+YWN0aXZlX2h3YWNjZWxfaWQgIT0gaHdhY2NlbC0+aWQpIHx8Ci0gICAgICAgICAgICAoaXN0LT5od2FjY2VsX2lkICE9IEhXQUNDRUxfQVVUTyAmJiBpc3QtPmh3YWNjZWxfaWQgIT0gaHdhY2NlbC0+aWQpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgcmV0ID0gaHdhY2NlbC0+aW5pdChzKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGlmIChpc3QtPmh3YWNjZWxfaWQgPT0gaHdhY2NlbC0+aWQpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLAotICAgICAgICAgICAgICAgICAgICAgICAiJXMgaHdhY2NlbCByZXF1ZXN0ZWQgZm9yIGlucHV0IHN0cmVhbSAjJWQ6JWQsICIKLSAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuXG4iLCBod2FjY2VsLT5uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaXN0LT5hY3RpdmVfaHdhY2NlbF9pZCA9IGh3YWNjZWwtPmlkOwotICAgICAgICBpc3QtPmh3YWNjZWxfcGl4X2ZtdCAgID0gKnA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiAqcDsKLX0KLQotc3RhdGljIGludCBnZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKQotewotICAgIElucHV0U3RyZWFtICppc3QgPSBzLT5vcGFxdWU7Ci0KLSAgICBpZiAoaXN0LT5od2FjY2VsX2dldF9idWZmZXIgJiYgZnJhbWUtPmZvcm1hdCA9PSBpc3QtPmh3YWNjZWxfcGl4X2ZtdCkKLSAgICAgICAgcmV0dXJuIGlzdC0+aHdhY2NlbF9nZXRfYnVmZmVyKHMsIGZyYW1lLCBmbGFncyk7Ci0KLSAgICByZXR1cm4gYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIyKHMsIGZyYW1lLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF9pbnB1dF9zdHJlYW0oaW50IGlzdF9pbmRleCwgY2hhciAqZXJyb3IsIGludCBlcnJvcl9sZW4pCi17Ci0gICAgaW50IHJldDsKLSAgICBJbnB1dFN0cmVhbSAqaXN0ID0gaW5wdXRfc3RyZWFtc1tpc3RfaW5kZXhdOwotCi0gICAgaWYgKGlzdC0+ZGVjb2RpbmdfbmVlZGVkKSB7Ci0gICAgICAgIEFWQ29kZWMgKmNvZGVjID0gaXN0LT5kZWM7Ci0gICAgICAgIGlmICghY29kZWMpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGVycm9yLCBlcnJvcl9sZW4sICJEZWNvZGVyIChjb2RlYyAlcykgbm90IGZvdW5kIGZvciBpbnB1dCBzdHJlYW0gIyVkOiVkIiwKLSAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShpc3QtPmRlY19jdHgtPmNvZGVjX2lkKSwgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXN0LT5kZWNfY3R4LT5vcGFxdWUgICAgICAgICAgICAgICAgPSBpc3Q7Ci0gICAgICAgIGlzdC0+ZGVjX2N0eC0+Z2V0X2Zvcm1hdCAgICAgICAgICAgID0gZ2V0X2Zvcm1hdDsKLSAgICAgICAgaXN0LT5kZWNfY3R4LT5nZXRfYnVmZmVyMiAgICAgICAgICAgPSBnZXRfYnVmZmVyOwotICAgICAgICBpc3QtPmRlY19jdHgtPnRocmVhZF9zYWZlX2NhbGxiYWNrcyA9IDE7Ci0KLSAgICAgICAgYXZfb3B0X3NldF9pbnQoaXN0LT5kZWNfY3R4LCAicmVmY291bnRlZF9mcmFtZXMiLCAxLCAwKTsKLSAgICAgICAgaWYgKGlzdC0+ZGVjX2N0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFICYmCi0gICAgICAgICAgIChpc3QtPmRlY29kaW5nX25lZWRlZCAmIERFQ09ESU5HX0ZPUl9PU1QpKSB7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldCgmaXN0LT5kZWNvZGVyX29wdHMsICJjb21wdXRlX2VkdCIsICIxIiwgQVZfRElDVF9ET05UX09WRVJXUklURSk7Ci0gICAgICAgICAgICBpZiAoaXN0LT5kZWNvZGluZ19uZWVkZWQgJiBERUNPRElOR19GT1JfRklMVEVSKQotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIldhcm5pbmcgdXNpbmcgRFZCIHN1YnRpdGxlcyBmb3IgZmlsdGVyaW5nIGFuZCBvdXRwdXQgYXQgdGhlIHNhbWUgdGltZSBpcyBub3QgZnVsbHkgc3VwcG9ydGVkLCBhbHNvIHNlZSAtY29tcHV0ZV9lZHQgWzB8MV1cbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhdl9kaWN0X2dldChpc3QtPmRlY29kZXJfb3B0cywgInRocmVhZHMiLCBOVUxMLCAwKSkKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZpc3QtPmRlY29kZXJfb3B0cywgInRocmVhZHMiLCAiYXV0byIsIDApOwotICAgICAgICBpZiAoKHJldCA9IGF2Y29kZWNfb3BlbjIoaXN0LT5kZWNfY3R4LCBjb2RlYywgJmlzdC0+ZGVjb2Rlcl9vcHRzKSkgPCAwKSB7Ci0gICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRVhQRVJJTUVOVEFMKQotICAgICAgICAgICAgICAgIGFib3J0X2NvZGVjX2V4cGVyaW1lbnRhbChjb2RlYywgMCk7Ci0KLSAgICAgICAgICAgIHNucHJpbnRmKGVycm9yLCBlcnJvcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgb3BlbmluZyBkZWNvZGVyIGZvciBpbnB1dCBzdHJlYW0gIgotICAgICAgICAgICAgICAgICAgICAgIiMlZDolZCA6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydF9hdm9wdGlvbnMoaXN0LT5kZWNvZGVyX29wdHMpOwotICAgIH0KLQotICAgIGlzdC0+bmV4dF9wdHMgPSBBVl9OT1BUU19WQUxVRTsKLSAgICBpc3QtPm5leHRfZHRzID0gQVZfTk9QVFNfVkFMVUU7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIElucHV0U3RyZWFtICpnZXRfaW5wdXRfc3RyZWFtKE91dHB1dFN0cmVhbSAqb3N0KQotewotICAgIGlmIChvc3QtPnNvdXJjZV9pbmRleCA+PSAwKQotICAgICAgICByZXR1cm4gaW5wdXRfc3RyZWFtc1tvc3QtPnNvdXJjZV9pbmRleF07Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGFyZV9pbnQ2NChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotICAgIHJldHVybiBGRkRJRkZTSUdOKCooY29uc3QgaW50NjRfdCAqKWEsICooY29uc3QgaW50NjRfdCAqKWIpOwotfQotCi1zdGF0aWMgaW50IGluaXRfb3V0cHV0X3N0cmVhbShPdXRwdXRTdHJlYW0gKm9zdCwgY2hhciAqZXJyb3IsIGludCBlcnJvcl9sZW4pCi17Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAob3N0LT5lbmNvZGluZ19uZWVkZWQpIHsKLSAgICAgICAgQVZDb2RlYyAgICAgICpjb2RlYyA9IG9zdC0+ZW5jOwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqZGVjID0gTlVMTDsKLSAgICAgICAgSW5wdXRTdHJlYW0gKmlzdDsKLQotICAgICAgICBpZiAoKGlzdCA9IGdldF9pbnB1dF9zdHJlYW0ob3N0KSkpCi0gICAgICAgICAgICBkZWMgPSBpc3QtPmRlY19jdHg7Ci0gICAgICAgIGlmIChkZWMgJiYgZGVjLT5zdWJ0aXRsZV9oZWFkZXIpIHsKLSAgICAgICAgICAgIC8qIEFTUyBjb2RlIGFzc3VtZXMgdGhpcyBidWZmZXIgaXMgbnVsbCB0ZXJtaW5hdGVkIHNvIGFkZCBleHRyYSBieXRlLiAqLwotICAgICAgICAgICAgb3N0LT5lbmNfY3R4LT5zdWJ0aXRsZV9oZWFkZXIgPSBhdl9tYWxsb2N6KGRlYy0+c3VidGl0bGVfaGVhZGVyX3NpemUgKyAxKTsKLSAgICAgICAgICAgIGlmICghb3N0LT5lbmNfY3R4LT5zdWJ0aXRsZV9oZWFkZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIG1lbWNweShvc3QtPmVuY19jdHgtPnN1YnRpdGxlX2hlYWRlciwgZGVjLT5zdWJ0aXRsZV9oZWFkZXIsIGRlYy0+c3VidGl0bGVfaGVhZGVyX3NpemUpOwotICAgICAgICAgICAgb3N0LT5lbmNfY3R4LT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZSA9IGRlYy0+c3VidGl0bGVfaGVhZGVyX3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFhdl9kaWN0X2dldChvc3QtPmVuY29kZXJfb3B0cywgInRocmVhZHMiLCBOVUxMLCAwKSkKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvc3QtPmVuY29kZXJfb3B0cywgInRocmVhZHMiLCAiYXV0byIsIDApOwotICAgICAgICBpZiAob3N0LT5lbmMtPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCi0gICAgICAgICAgICAhY29kZWMtPmRlZmF1bHRzICYmCi0gICAgICAgICAgICAhYXZfZGljdF9nZXQob3N0LT5lbmNvZGVyX29wdHMsICJiIiwgTlVMTCwgMCkgJiYKLSAgICAgICAgICAgICFhdl9kaWN0X2dldChvc3QtPmVuY29kZXJfb3B0cywgImFiIiwgTlVMTCwgMCkpCi0gICAgICAgICAgICBhdl9kaWN0X3NldCgmb3N0LT5lbmNvZGVyX29wdHMsICJiIiwgIjEyODAwMCIsIDApOwotCi0gICAgICAgIGlmICgocmV0ID0gYXZjb2RlY19vcGVuMihvc3QtPmVuY19jdHgsIGNvZGVjLCAmb3N0LT5lbmNvZGVyX29wdHMpKSA8IDApIHsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FWFBFUklNRU5UQUwpCi0gICAgICAgICAgICAgICAgYWJvcnRfY29kZWNfZXhwZXJpbWVudGFsKGNvZGVjLCAxKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGVycm9yLCBlcnJvcl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgb3BlbmluZyBlbmNvZGVyIGZvciBvdXRwdXQgc3RyZWFtICMlZDolZCAtICIKLSAgICAgICAgICAgICAgICAgICAgICJtYXliZSBpbmNvcnJlY3QgcGFyYW1ldGVycyBzdWNoIGFzIGJpdF9yYXRlLCByYXRlLCB3aWR0aCBvciBoZWlnaHQiLAotICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBpZiAob3N0LT5lbmMtPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCi0gICAgICAgICAgICAhKG9zdC0+ZW5jLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfVkFSSUFCTEVfRlJBTUVfU0laRSkpCi0gICAgICAgICAgICBhdl9idWZmZXJzaW5rX3NldF9mcmFtZV9zaXplKG9zdC0+ZmlsdGVyLT5maWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+ZW5jX2N0eC0+ZnJhbWVfc2l6ZSk7Ci0gICAgICAgIGFzc2VydF9hdm9wdGlvbnMob3N0LT5lbmNvZGVyX29wdHMpOwotICAgICAgICBpZiAob3N0LT5lbmNfY3R4LT5iaXRfcmF0ZSAmJiBvc3QtPmVuY19jdHgtPmJpdF9yYXRlIDwgMTAwMCkKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlRoZSBiaXRyYXRlIHBhcmFtZXRlciBpcyBzZXQgdG9vIGxvdy4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgSXQgdGFrZXMgYml0cy9zIGFzIGFyZ3VtZW50LCBub3Qga2JpdHMvc1xuIik7Ci0KLSAgICAgICAgcmV0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQob3N0LT5zdC0+Y29kZWMsIG9zdC0+ZW5jX2N0eCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLAotICAgICAgICAgICAgICAgICAgICJFcnJvciBpbml0aWFsaXppbmcgdGhlIG91dHB1dCBzdHJlYW0gY29kZWMgY29udGV4dC5cbiIpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9zdC0+ZW5jX2N0eC0+bmJfY29kZWRfc2lkZV9kYXRhKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLQotICAgICAgICAgICAgb3N0LT5zdC0+c2lkZV9kYXRhID0gYXZfcmVhbGxvY19hcnJheShOVUxMLCBvc3QtPmVuY19jdHgtPm5iX2NvZGVkX3NpZGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpvc3QtPnN0LT5zaWRlX2RhdGEpKTsKLSAgICAgICAgICAgIGlmICghb3N0LT5zdC0+c2lkZV9kYXRhKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvc3QtPmVuY19jdHgtPm5iX2NvZGVkX3NpZGVfZGF0YTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgQVZQYWNrZXRTaWRlRGF0YSAqc2Rfc3JjID0gJm9zdC0+ZW5jX2N0eC0+Y29kZWRfc2lkZV9kYXRhW2ldOwotICAgICAgICAgICAgICAgIEFWUGFja2V0U2lkZURhdGEgKnNkX2RzdCA9ICZvc3QtPnN0LT5zaWRlX2RhdGFbaV07Ci0KLSAgICAgICAgICAgICAgICBzZF9kc3QtPmRhdGEgPSBhdl9tYWxsb2Moc2Rfc3JjLT5zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNkX2RzdC0+ZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoc2RfZHN0LT5kYXRhLCBzZF9zcmMtPmRhdGEsIHNkX3NyYy0+c2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2RfZHN0LT5zaXplID0gc2Rfc3JjLT5zaXplOwotICAgICAgICAgICAgICAgIHNkX2RzdC0+dHlwZSA9IHNkX3NyYy0+dHlwZTsKLSAgICAgICAgICAgICAgICBvc3QtPnN0LT5uYl9zaWRlX2RhdGErKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvcHkgdGltZWJhc2Ugd2hpbGUgcmVtb3ZpbmcgY29tbW9uIGZhY3RvcnMKLSAgICAgICAgb3N0LT5zdC0+dGltZV9iYXNlID0gYXZfYWRkX3Eob3N0LT5lbmNfY3R4LT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXswLCAxfSk7Ci0gICAgICAgIG9zdC0+c3QtPmNvZGVjLT5jb2RlYz0gb3N0LT5lbmNfY3R4LT5jb2RlYzsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBhdl9vcHRfc2V0X2RpY3Qob3N0LT5lbmNfY3R4LCAmb3N0LT5lbmNvZGVyX29wdHMpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLAotICAgICAgICAgICAgICAgICAgIkVycm9yIHNldHRpbmcgdXAgY29kZWMgY29udGV4dCBvcHRpb25zLlxuIik7Ci0gICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY29weSB0aW1lYmFzZSB3aGlsZSByZW1vdmluZyBjb21tb24gZmFjdG9ycwotICAgICAgICBvc3QtPnN0LT50aW1lX2Jhc2UgPSBhdl9hZGRfcShvc3QtPnN0LT5jb2RlYy0+dGltZV9iYXNlLCAoQVZSYXRpb25hbCl7MCwgMX0pOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhcnNlX2ZvcmNlZF9rZXlfZnJhbWVzKGNoYXIgKmtmLCBPdXRwdXRTdHJlYW0gKm9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBjaGFyICpwOwotICAgIGludCBuID0gMSwgaSwgc2l6ZSwgaW5kZXggPSAwOwotICAgIGludDY0X3QgdCwgKnB0czsKLQotICAgIGZvciAocCA9IGtmOyAqcDsgcCsrKQotICAgICAgICBpZiAoKnAgPT0gJywnKQotICAgICAgICAgICAgbisrOwotICAgIHNpemUgPSBuOwotICAgIHB0cyA9IGF2X21hbGxvY19hcnJheShzaXplLCBzaXplb2YoKnB0cykpOwotICAgIGlmICghcHRzKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3QgYWxsb2NhdGUgZm9yY2VkIGtleSBmcmFtZXMgYXJyYXkuXG4iKTsKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIH0KLQotICAgIHAgPSBrZjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGNoYXIgKm5leHQgPSBzdHJjaHIocCwgJywnKTsKLQotICAgICAgICBpZiAobmV4dCkKLSAgICAgICAgICAgICpuZXh0KysgPSAwOwotCi0gICAgICAgIGlmICghbWVtY21wKHAsICJjaGFwdGVycyIsIDgpKSB7Ci0KLSAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmID0gb3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF0tPmN0eDsKLSAgICAgICAgICAgIGludCBqOwotCi0gICAgICAgICAgICBpZiAoYXZmLT5uYl9jaGFwdGVycyA+IElOVF9NQVggLSBzaXplIHx8Ci0gICAgICAgICAgICAgICAgIShwdHMgPSBhdl9yZWFsbG9jX2YocHRzLCBzaXplICs9IGF2Zi0+bmJfY2hhcHRlcnMgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcHRzKSkpKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmb3JjZWQga2V5IGZyYW1lcyBhcnJheS5cbiIpOwotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHQgPSBwWzhdID8gcGFyc2VfdGltZV9vcl9kaWUoImZvcmNlX2tleV9mcmFtZXMiLCBwICsgOCwgMSkgOiAwOwotICAgICAgICAgICAgdCA9IGF2X3Jlc2NhbGVfcSh0LCBBVl9USU1FX0JBU0VfUSwgYXZjdHgtPnRpbWVfYmFzZSk7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBhdmYtPm5iX2NoYXB0ZXJzOyBqKyspIHsKLSAgICAgICAgICAgICAgICBBVkNoYXB0ZXIgKmMgPSBhdmYtPmNoYXB0ZXJzW2pdOwotICAgICAgICAgICAgICAgIGF2X2Fzc2VydDEoaW5kZXggPCBzaXplKTsKLSAgICAgICAgICAgICAgICBwdHNbaW5kZXgrK10gPSBhdl9yZXNjYWxlX3EoYy0+c3RhcnQsIGMtPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRpbWVfYmFzZSkgKyB0OwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIHQgPSBwYXJzZV90aW1lX29yX2RpZSgiZm9yY2Vfa2V5X2ZyYW1lcyIsIHAsIDEpOwotICAgICAgICAgICAgYXZfYXNzZXJ0MShpbmRleCA8IHNpemUpOwotICAgICAgICAgICAgcHRzW2luZGV4KytdID0gYXZfcmVzY2FsZV9xKHQsIEFWX1RJTUVfQkFTRV9RLCBhdmN0eC0+dGltZV9iYXNlKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgcCA9IG5leHQ7Ci0gICAgfQotCi0gICAgYXZfYXNzZXJ0MChpbmRleCA9PSBzaXplKTsKLSAgICBxc29ydChwdHMsIHNpemUsIHNpemVvZigqcHRzKSwgY29tcGFyZV9pbnQ2NCk7Ci0gICAgb3N0LT5mb3JjZWRfa2ZfY291bnQgPSBzaXplOwotICAgIG9zdC0+Zm9yY2VkX2tmX3B0cyAgID0gcHRzOwotfQotCi1zdGF0aWMgdm9pZCByZXBvcnRfbmV3X3N0cmVhbShpbnQgaW5wdXRfaW5kZXgsIEFWUGFja2V0ICpwa3QpCi17Ci0gICAgSW5wdXRGaWxlICpmaWxlID0gaW5wdXRfZmlsZXNbaW5wdXRfaW5kZXhdOwotICAgIEFWU3RyZWFtICpzdCA9IGZpbGUtPmN0eC0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07Ci0KLSAgICBpZiAocGt0LT5zdHJlYW1faW5kZXggPCBmaWxlLT5uYl9zdHJlYW1zX3dhcm4pCi0gICAgICAgIHJldHVybjsKLSAgICBhdl9sb2coZmlsZS0+Y3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgIk5ldyAlcyBzdHJlYW0gJWQ6JWQgYXQgcG9zOiUiUFJJZDY0IiBhbmQgRFRTOiVzc1xuIiwKLSAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSksCi0gICAgICAgICAgIGlucHV0X2luZGV4LCBwa3QtPnN0cmVhbV9pbmRleCwKLSAgICAgICAgICAgcGt0LT5wb3MsIGF2X3RzMnRpbWVzdHIocGt0LT5kdHMsICZzdC0+dGltZV9iYXNlKSk7Ci0gICAgZmlsZS0+bmJfc3RyZWFtc193YXJuID0gcGt0LT5zdHJlYW1faW5kZXggKyAxOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZW5jb2Rlcl9pZChPdXRwdXRGaWxlICpvZiwgT3V0cHV0U3RyZWFtICpvc3QpCi17Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7Ci0KLSAgICB1aW50OF90ICplbmNvZGVyX3N0cmluZzsKLSAgICBpbnQgZW5jb2Rlcl9zdHJpbmdfbGVuOwotICAgIGludCBmb3JtYXRfZmxhZ3MgPSAwOwotICAgIGludCBjb2RlY19mbGFncyA9IDA7Ci0KLSAgICBpZiAoYXZfZGljdF9nZXQob3N0LT5zdC0+bWV0YWRhdGEsICJlbmNvZGVyIiwgIE5VTEwsIDApKQotICAgICAgICByZXR1cm47Ci0KLSAgICBlID0gYXZfZGljdF9nZXQob2YtPm9wdHMsICJmZmxhZ3MiLCBOVUxMLCAwKTsKLSAgICBpZiAoZSkgewotICAgICAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kKG9mLT5jdHgsICJmZmxhZ3MiLCBOVUxMLCAwLCAwKTsKLSAgICAgICAgaWYgKCFvKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBhdl9vcHRfZXZhbF9mbGFncyhvZi0+Y3R4LCBvLCBlLT52YWx1ZSwgJmZvcm1hdF9mbGFncyk7Ci0gICAgfQotICAgIGUgPSBhdl9kaWN0X2dldChvc3QtPmVuY29kZXJfb3B0cywgImZsYWdzIiwgTlVMTCwgMCk7Ci0gICAgaWYgKGUpIHsKLSAgICAgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZChvc3QtPmVuY19jdHgsICJmbGFncyIsIE5VTEwsIDAsIDApOwotICAgICAgICBpZiAoIW8pCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGF2X29wdF9ldmFsX2ZsYWdzKG9zdC0+ZW5jX2N0eCwgbywgZS0+dmFsdWUsICZjb2RlY19mbGFncyk7Ci0gICAgfQotCi0gICAgZW5jb2Rlcl9zdHJpbmdfbGVuID0gc2l6ZW9mKExJQkFWQ09ERUNfSURFTlQpICsgc3RybGVuKG9zdC0+ZW5jLT5uYW1lKSArIDI7Ci0gICAgZW5jb2Rlcl9zdHJpbmcgICAgID0gYXZfbWFsbG9jeihlbmNvZGVyX3N0cmluZ19sZW4pOwotICAgIGlmICghZW5jb2Rlcl9zdHJpbmcpCi0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLQotICAgIGlmICghKGZvcm1hdF9mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QpICYmICEoY29kZWNfZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0JJVEVYQUNUKSkKLSAgICAgICAgYXZfc3RybGNweShlbmNvZGVyX3N0cmluZywgTElCQVZDT0RFQ19JREVOVCAiICIsIGVuY29kZXJfc3RyaW5nX2xlbik7Ci0gICAgZWxzZQotICAgICAgICBhdl9zdHJsY3B5KGVuY29kZXJfc3RyaW5nLCAiTGF2YyAiLCBlbmNvZGVyX3N0cmluZ19sZW4pOwotICAgIGF2X3N0cmxjYXQoZW5jb2Rlcl9zdHJpbmcsIG9zdC0+ZW5jLT5uYW1lLCBlbmNvZGVyX3N0cmluZ19sZW4pOwotICAgIGF2X2RpY3Rfc2V0KCZvc3QtPnN0LT5tZXRhZGF0YSwgImVuY29kZXIiLCAgZW5jb2Rlcl9zdHJpbmcsCi0gICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwgfCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLX0KLQotc3RhdGljIGludCB0cmFuc2NvZGVfaW5pdCh2b2lkKQotewotICAgIGludCByZXQgPSAwLCBpLCBqLCBrOwotICAgIEFWRm9ybWF0Q29udGV4dCAqb2M7Ci0gICAgT3V0cHV0U3RyZWFtICpvc3Q7Ci0gICAgSW5wdXRTdHJlYW0gKmlzdDsKLSAgICBjaGFyIGVycm9yWzEwMjRdID0gezB9OwotICAgIGludCB3YW50X3NkcCA9IDE7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZmlsdGVyZ3JhcGhzOyBpKyspIHsKLSAgICAgICAgRmlsdGVyR3JhcGggKmZnID0gZmlsdGVyZ3JhcGhzW2ldOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmctPm5iX291dHB1dHM7IGorKykgewotICAgICAgICAgICAgT3V0cHV0RmlsdGVyICpvZmlsdGVyID0gZmctPm91dHB1dHNbal07Ci0gICAgICAgICAgICBpZiAoIW9maWx0ZXItPm9zdCB8fCBvZmlsdGVyLT5vc3QtPnNvdXJjZV9pbmRleCA+PSAwKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGZnLT5uYl9pbnB1dHMgIT0gMSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZvciAoayA9IG5iX2lucHV0X3N0cmVhbXMtMTsgayA+PSAwIDsgay0tKQotICAgICAgICAgICAgICAgIGlmIChmZy0+aW5wdXRzWzBdLT5pc3QgPT0gaW5wdXRfc3RyZWFtc1trXSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBvZmlsdGVyLT5vc3QtPnNvdXJjZV9pbmRleCA9IGs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpbml0IGZyYW1lcmF0ZSBlbXVsYXRpb24gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5wdXRfZmlsZXM7IGkrKykgewotICAgICAgICBJbnB1dEZpbGUgKmlmaWxlID0gaW5wdXRfZmlsZXNbaV07Ci0gICAgICAgIGlmIChpZmlsZS0+cmF0ZV9lbXUpCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaWZpbGUtPm5iX3N0cmVhbXM7IGorKykKLSAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW1zW2ogKyBpZmlsZS0+aXN0X2luZGV4XS0+c3RhcnQgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7Ci0gICAgfQotCi0gICAgLyogZm9yIGVhY2ggb3V0cHV0IHN0cmVhbSwgd2UgY29tcHV0ZSB0aGUgcmlnaHQgZW5jb2RpbmcgcGFyYW1ldGVycyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIEFWQ29kZWNDb250ZXh0ICplbmNfY3R4OwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqZGVjX2N0eCA9IE5VTEw7Ci0gICAgICAgIG9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOwotICAgICAgICBvYyAgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XS0+Y3R4OwotICAgICAgICBpc3QgPSBnZXRfaW5wdXRfc3RyZWFtKG9zdCk7Ci0KLSAgICAgICAgaWYgKG9zdC0+YXR0YWNobWVudF9maWxlbmFtZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGVuY19jdHggPSBvc3QtPnN0cmVhbV9jb3B5ID8gb3N0LT5zdC0+Y29kZWMgOiBvc3QtPmVuY19jdHg7Ci0KLSAgICAgICAgaWYgKGlzdCkgewotICAgICAgICAgICAgZGVjX2N0eCA9IGlzdC0+ZGVjX2N0eDsKLQotICAgICAgICAgICAgb3N0LT5zdC0+ZGlzcG9zaXRpb24gICAgICAgICAgPSBpc3QtPnN0LT5kaXNwb3NpdGlvbjsKLSAgICAgICAgICAgIGVuY19jdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgICAgPSBkZWNfY3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlOwotICAgICAgICAgICAgZW5jX2N0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IGRlY19jdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGo9MDsgajxvYy0+bmJfc3RyZWFtczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gb2MtPnN0cmVhbXNbal07Ci0gICAgICAgICAgICAgICAgaWYgKHN0ICE9IG9zdC0+c3QgJiYgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IGVuY19jdHgtPmNvZGVjX3R5cGUpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGogPT0gb2MtPm5iX3N0cmVhbXMpCi0gICAgICAgICAgICAgICAgaWYgKGVuY19jdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPIHx8IGVuY19jdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQotICAgICAgICAgICAgICAgICAgICBvc3QtPnN0LT5kaXNwb3NpdGlvbiA9IEFWX0RJU1BPU0lUSU9OX0RFRkFVTFQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3N0LT5zdHJlYW1fY29weSkgewotICAgICAgICAgICAgQVZSYXRpb25hbCBzYXI7Ci0gICAgICAgICAgICB1aW50NjRfdCBleHRyYV9zaXplOwotCi0gICAgICAgICAgICBhdl9hc3NlcnQwKGlzdCAmJiAhb3N0LT5maWx0ZXIpOwotCi0gICAgICAgICAgICBleHRyYV9zaXplID0gKHVpbnQ2NF90KWRlY19jdHgtPmV4dHJhZGF0YV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRTsKLQotICAgICAgICAgICAgaWYgKGV4dHJhX3NpemUgPiBJTlRfTUFYKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogaWYgc3RyZWFtX2NvcHkgaXMgc2VsZWN0ZWQsIG5vIG5lZWQgdG8gZGVjb2RlIG9yIGVuY29kZSAqLwotICAgICAgICAgICAgZW5jX2N0eC0+Y29kZWNfaWQgICA9IGRlY19jdHgtPmNvZGVjX2lkOwotICAgICAgICAgICAgZW5jX2N0eC0+Y29kZWNfdHlwZSA9IGRlY19jdHgtPmNvZGVjX3R5cGU7Ci0KLSAgICAgICAgICAgIGlmICghZW5jX2N0eC0+Y29kZWNfdGFnKSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvZGVjX3RhZzsKLSAgICAgICAgICAgICAgICBpZiAoIW9jLT5vZm9ybWF0LT5jb2RlY190YWcgfHwKLSAgICAgICAgICAgICAgICAgICAgIGF2X2NvZGVjX2dldF9pZCAob2MtPm9mb3JtYXQtPmNvZGVjX3RhZywgZGVjX2N0eC0+Y29kZWNfdGFnKSA9PSBlbmNfY3R4LT5jb2RlY19pZCB8fAotICAgICAgICAgICAgICAgICAgICAgIWF2X2NvZGVjX2dldF90YWcyKG9jLT5vZm9ybWF0LT5jb2RlY190YWcsIGRlY19jdHgtPmNvZGVjX2lkLCAmY29kZWNfdGFnKSkKLSAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+Y29kZWNfdGFnID0gZGVjX2N0eC0+Y29kZWNfdGFnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbmNfY3R4LT5iaXRfcmF0ZSAgICAgICA9IGRlY19jdHgtPmJpdF9yYXRlOwotICAgICAgICAgICAgZW5jX2N0eC0+cmNfbWF4X3JhdGUgICAgPSBkZWNfY3R4LT5yY19tYXhfcmF0ZTsKLSAgICAgICAgICAgIGVuY19jdHgtPnJjX2J1ZmZlcl9zaXplID0gZGVjX2N0eC0+cmNfYnVmZmVyX3NpemU7Ci0gICAgICAgICAgICBlbmNfY3R4LT5maWVsZF9vcmRlciAgICA9IGRlY19jdHgtPmZpZWxkX29yZGVyOwotICAgICAgICAgICAgaWYgKGRlY19jdHgtPmV4dHJhZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgZW5jX2N0eC0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2N6KGV4dHJhX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghZW5jX2N0eC0+ZXh0cmFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweShlbmNfY3R4LT5leHRyYWRhdGEsIGRlY19jdHgtPmV4dHJhZGF0YSwgZGVjX2N0eC0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZW5jX2N0eC0+ZXh0cmFkYXRhX3NpemU9IGRlY19jdHgtPmV4dHJhZGF0YV9zaXplOwotICAgICAgICAgICAgZW5jX2N0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlICA9IGRlY19jdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKLQotICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gaXN0LT5zdC0+dGltZV9iYXNlOwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEF2aSBpcyBhIHNwZWNpYWwgY2FzZSBoZXJlIGJlY2F1c2UgaXQgc3VwcG9ydHMgdmFyaWFibGUgZnBzIGJ1dAotICAgICAgICAgICAgICogaGF2aW5nIHRoZSBmcHMgYW5kIHRpbWViYXNlIGRpZmZlcmUgc2lnbmlmaWNhbnRseSBhZGRzIHF1aXRlIHNvbWUKLSAgICAgICAgICAgICAqIG92ZXJoZWFkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmKCFzdHJjbXAob2MtPm9mb3JtYXQtPm5hbWUsICJhdmkiKSkgewotICAgICAgICAgICAgICAgIGlmICggY29weV90YjwwICYmIGF2X3EyZChpc3QtPnN0LT5yX2ZyYW1lX3JhdGUpID49IGF2X3EyZChpc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAwLjUvYXZfcTJkKGlzdC0+c3QtPnJfZnJhbWVfcmF0ZSkgPiBhdl9xMmQoaXN0LT5zdC0+dGltZV9iYXNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIDAuNS9hdl9xMmQoaXN0LT5zdC0+cl9mcmFtZV9yYXRlKSA+IGF2X3EyZChkZWNfY3R4LT50aW1lX2Jhc2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXZfcTJkKGlzdC0+c3QtPnRpbWVfYmFzZSkgPCAxLjAvNTAwICYmIGF2X3EyZChkZWNfY3R4LT50aW1lX2Jhc2UpIDwgMS4wLzUwMAotICAgICAgICAgICAgICAgICAgICAgfHwgY29weV90Yj09Mil7Ci0gICAgICAgICAgICAgICAgICAgIGVuY19jdHgtPnRpbWVfYmFzZS5udW0gPSBpc3QtPnN0LT5yX2ZyYW1lX3JhdGUuZGVuOwotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UuZGVuID0gMippc3QtPnN0LT5yX2ZyYW1lX3JhdGUubnVtOwotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT50aWNrc19wZXJfZnJhbWUgPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICAgY29weV90YjwwICYmIGF2X3EyZChkZWNfY3R4LT50aW1lX2Jhc2UpKmRlY19jdHgtPnRpY2tzX3Blcl9mcmFtZSA+IDIqYXZfcTJkKGlzdC0+c3QtPnRpbWVfYmFzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGF2X3EyZChpc3QtPnN0LT50aW1lX2Jhc2UpIDwgMS4wLzUwMAotICAgICAgICAgICAgICAgICAgICB8fCBjb3B5X3RiPT0wKXsKLSAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gZGVjX2N0eC0+dGltZV9iYXNlOwotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UubnVtICo9IGRlY19jdHgtPnRpY2tzX3Blcl9mcmFtZTsKLSAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlLmRlbiAqPSAyOwotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT50aWNrc19wZXJfZnJhbWUgPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZighKG9jLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX1ZBUklBQkxFX0ZQUykKLSAgICAgICAgICAgICAgICAgICAgICAmJiBzdHJjbXAob2MtPm9mb3JtYXQtPm5hbWUsICJtb3YiKSAmJiBzdHJjbXAob2MtPm9mb3JtYXQtPm5hbWUsICJtcDQiKSAmJiBzdHJjbXAob2MtPm9mb3JtYXQtPm5hbWUsICIzZ3AiKQotICAgICAgICAgICAgICAgICAgICAgICYmIHN0cmNtcChvYy0+b2Zvcm1hdC0+bmFtZSwgIjNnMiIpICYmIHN0cmNtcChvYy0+b2Zvcm1hdC0+bmFtZSwgInBzcCIpICYmIHN0cmNtcChvYy0+b2Zvcm1hdC0+bmFtZSwgImlwb2QiKQotICAgICAgICAgICAgICAgICAgICAgICYmIHN0cmNtcChvYy0+b2Zvcm1hdC0+bmFtZSwgImY0diIpCi0gICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBpZiggICBjb3B5X3RiPDAgJiYgZGVjX2N0eC0+dGltZV9iYXNlLmRlbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdl9xMmQoZGVjX2N0eC0+dGltZV9iYXNlKSpkZWNfY3R4LT50aWNrc19wZXJfZnJhbWUgPiBhdl9xMmQoaXN0LT5zdC0+dGltZV9iYXNlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhdl9xMmQoaXN0LT5zdC0+dGltZV9iYXNlKSA8IDEuMC81MDAKLSAgICAgICAgICAgICAgICAgICB8fCBjb3B5X3RiPT0wKXsKLSAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gZGVjX2N0eC0+dGltZV9iYXNlOwotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UubnVtICo9IGRlY19jdHgtPnRpY2tzX3Blcl9mcmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoICAgZW5jX2N0eC0+Y29kZWNfdGFnID09IEFWX1JMMzIoInRtY2QiKQotICAgICAgICAgICAgICAgICYmIGRlY19jdHgtPnRpbWVfYmFzZS5udW0gPCBkZWNfY3R4LT50aW1lX2Jhc2UuZGVuCi0gICAgICAgICAgICAgICAgJiYgZGVjX2N0eC0+dGltZV9iYXNlLm51bSA+IDAKLSAgICAgICAgICAgICAgICAmJiAxMjFMTCpkZWNfY3R4LT50aW1lX2Jhc2UubnVtID4gZGVjX2N0eC0+dGltZV9iYXNlLmRlbikgewotICAgICAgICAgICAgICAgIGVuY19jdHgtPnRpbWVfYmFzZSA9IGRlY19jdHgtPnRpbWVfYmFzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFvc3QtPmZyYW1lX3JhdGUubnVtKQotICAgICAgICAgICAgICAgIG9zdC0+ZnJhbWVfcmF0ZSA9IGlzdC0+ZnJhbWVyYXRlOwotICAgICAgICAgICAgaWYob3N0LT5mcmFtZV9yYXRlLm51bSkKLSAgICAgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UgPSBhdl9pbnZfcShvc3QtPmZyYW1lX3JhdGUpOwotCi0gICAgICAgICAgICBhdl9yZWR1Y2UoJmVuY19jdHgtPnRpbWVfYmFzZS5udW0sICZlbmNfY3R4LT50aW1lX2Jhc2UuZGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlLm51bSwgZW5jX2N0eC0+dGltZV9iYXNlLmRlbiwgSU5UX01BWCk7Ci0KLSAgICAgICAgICAgIGlmIChpc3QtPnN0LT5uYl9zaWRlX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBvc3QtPnN0LT5zaWRlX2RhdGEgPSBhdl9yZWFsbG9jX2FycmF5KE5VTEwsIGlzdC0+c3QtPm5iX3NpZGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaXN0LT5zdC0+c2lkZV9kYXRhKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFvc3QtPnN0LT5zaWRlX2RhdGEpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgICAgICAgICBvc3QtPnN0LT5uYl9zaWRlX2RhdGEgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpc3QtPnN0LT5uYl9zaWRlX2RhdGE7IGorKykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldFNpZGVEYXRhICpzZF9zcmMgPSAmaXN0LT5zdC0+c2lkZV9kYXRhW2pdOwotICAgICAgICAgICAgICAgICAgICBBVlBhY2tldFNpZGVEYXRhICpzZF9kc3QgPSAmb3N0LT5zdC0+c2lkZV9kYXRhW29zdC0+c3QtPm5iX3NpZGVfZGF0YV07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG9zdC0+cm90YXRlX292ZXJyaWRkZW4gJiYgc2Rfc3JjLT50eXBlID09IEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVgpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICBzZF9kc3QtPmRhdGEgPSBhdl9tYWxsb2Moc2Rfc3JjLT5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzZF9kc3QtPmRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc2RfZHN0LT5kYXRhLCBzZF9zcmMtPmRhdGEsIHNkX3NyYy0+c2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNkX2RzdC0+c2l6ZSA9IHNkX3NyYy0+c2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgc2RfZHN0LT50eXBlID0gc2Rfc3JjLT50eXBlOwotICAgICAgICAgICAgICAgICAgICBvc3QtPnN0LT5uYl9zaWRlX2RhdGErKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9zdC0+cGFyc2VyID0gYXZfcGFyc2VyX2luaXQoZW5jX2N0eC0+Y29kZWNfaWQpOwotCi0gICAgICAgICAgICBzd2l0Y2ggKGVuY19jdHgtPmNvZGVjX3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgICAgIGlmIChhdWRpb192b2x1bWUgIT0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICItYWNvZGVjIGNvcHkgYW5kIC12b2wgYXJlIGluY29tcGF0aWJsZSAoZnJhbWVzIGFyZSBub3QgZGVjb2RlZClcbiIpOwotICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVuY19jdHgtPmNoYW5uZWxfbGF5b3V0ICAgICA9IGRlY19jdHgtPmNoYW5uZWxfbGF5b3V0OwotICAgICAgICAgICAgICAgIGVuY19jdHgtPnNhbXBsZV9yYXRlICAgICAgICA9IGRlY19jdHgtPnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIGVuY19jdHgtPmNoYW5uZWxzICAgICAgICAgICA9IGRlY19jdHgtPmNoYW5uZWxzOwotICAgICAgICAgICAgICAgIGVuY19jdHgtPmZyYW1lX3NpemUgICAgICAgICA9IGRlY19jdHgtPmZyYW1lX3NpemU7Ci0gICAgICAgICAgICAgICAgZW5jX2N0eC0+YXVkaW9fc2VydmljZV90eXBlID0gZGVjX2N0eC0+YXVkaW9fc2VydmljZV90eXBlOwotICAgICAgICAgICAgICAgIGVuY19jdHgtPmJsb2NrX2FsaWduICAgICAgICA9IGRlY19jdHgtPmJsb2NrX2FsaWduOwotICAgICAgICAgICAgICAgIGVuY19jdHgtPmluaXRpYWxfcGFkZGluZyAgICA9IGRlY19jdHgtPmRlbGF5OwotICAgICAgICAgICAgICAgIGVuY19jdHgtPnByb2ZpbGUgICAgICAgICAgICA9IGRlY19jdHgtPnByb2ZpbGU7Ci0jaWYgRkZfQVBJX0FVRElPRU5DX0RFTEFZCi0gICAgICAgICAgICAgICAgZW5jX2N0eC0+ZGVsYXkgICAgICAgICAgICAgID0gZGVjX2N0eC0+ZGVsYXk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZigoZW5jX2N0eC0+YmxvY2tfYWxpZ24gPT0gMSB8fCBlbmNfY3R4LT5ibG9ja19hbGlnbiA9PSAxMTUyIHx8IGVuY19jdHgtPmJsb2NrX2FsaWduID09IDU3NikgJiYgZW5jX2N0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKQotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT5ibG9ja19hbGlnbj0gMDsKLSAgICAgICAgICAgICAgICBpZihlbmNfY3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpCi0gICAgICAgICAgICAgICAgICAgIGVuY19jdHgtPmJsb2NrX2FsaWduPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICAgICAgZW5jX2N0eC0+cGl4X2ZtdCAgICAgICAgICAgID0gZGVjX2N0eC0+cGl4X2ZtdDsKLSAgICAgICAgICAgICAgICBlbmNfY3R4LT53aWR0aCAgICAgICAgICAgICAgPSBkZWNfY3R4LT53aWR0aDsKLSAgICAgICAgICAgICAgICBlbmNfY3R4LT5oZWlnaHQgICAgICAgICAgICAgPSBkZWNfY3R4LT5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgZW5jX2N0eC0+aGFzX2JfZnJhbWVzICAgICAgID0gZGVjX2N0eC0+aGFzX2JfZnJhbWVzOwotICAgICAgICAgICAgICAgIGlmIChvc3QtPmZyYW1lX2FzcGVjdF9yYXRpby5udW0pIHsgLy8gb3ZlcnJpZGRlbiBieSB0aGUgLWFzcGVjdCBjbGkgb3B0aW9uCi0gICAgICAgICAgICAgICAgICAgIHNhciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9tdWxfcShvc3QtPmZyYW1lX2FzcGVjdF9yYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgZW5jX2N0eC0+aGVpZ2h0LCBlbmNfY3R4LT53aWR0aCB9KTsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiT3ZlcnJpZGluZyBhc3BlY3QgcmF0aW8gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggc3RyZWFtIGNvcHkgbWF5IHByb2R1Y2UgaW52YWxpZCBmaWxlc1xuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzdC0+c3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKQotICAgICAgICAgICAgICAgICAgICBzYXIgPSBpc3QtPnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2FyID0gZGVjX2N0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKLSAgICAgICAgICAgICAgICBvc3QtPnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gZW5jX2N0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHNhcjsKLSAgICAgICAgICAgICAgICBvc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZSA9IGlzdC0+c3QtPmF2Z19mcmFtZV9yYXRlOwotICAgICAgICAgICAgICAgIG9zdC0+c3QtPnJfZnJhbWVfcmF0ZSA9IGlzdC0+c3QtPnJfZnJhbWVfcmF0ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgotICAgICAgICAgICAgICAgIGVuY19jdHgtPndpZHRoICA9IGRlY19jdHgtPndpZHRoOwotICAgICAgICAgICAgICAgIGVuY19jdHgtPmhlaWdodCA9IGRlY19jdHgtPmhlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1VOS05PV046Ci0gICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghb3N0LT5lbmMpCi0gICAgICAgICAgICAgICAgb3N0LT5lbmMgPSBhdmNvZGVjX2ZpbmRfZW5jb2RlcihlbmNfY3R4LT5jb2RlY19pZCk7Ci0gICAgICAgICAgICBpZiAoIW9zdC0+ZW5jKSB7Ci0gICAgICAgICAgICAgICAgLyogc2hvdWxkIG9ubHkgaGFwcGVuIHdoZW4gYSBkZWZhdWx0IGNvZGVjIGlzIG5vdCBwcmVzZW50LiAqLwotICAgICAgICAgICAgICAgIHNucHJpbnRmKGVycm9yLCBzaXplb2YoZXJyb3IpLCAiRW5jb2RlciAoY29kZWMgJXMpIG5vdCBmb3VuZCBmb3Igb3V0cHV0IHN0cmVhbSAjJWQ6JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUob3N0LT5zdC0+Y29kZWMtPmNvZGVjX2lkKSwgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICAgICAgZ290byBkdW1wX2Zvcm1hdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0X2VuY29kZXJfaWQob3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF0sIG9zdCk7Ci0KLSNpZiBDT05GSUdfTElCTUZYCi0gICAgICAgICAgICBpZiAocXN2X3RyYW5zY29kZV9pbml0KG9zdCkpCi0gICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIGlmICghb3N0LT5maWx0ZXIgJiYKLSAgICAgICAgICAgICAgICAoZW5jX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKLSAgICAgICAgICAgICAgICAgZW5jX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbHRlckdyYXBoICpmZzsKLSAgICAgICAgICAgICAgICAgICAgZmcgPSBpbml0X3NpbXBsZV9maWx0ZXJncmFwaChpc3QsIG9zdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmVfZmlsdGVyZ3JhcGgoZmcpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRXJyb3Igb3BlbmluZyBmaWx0ZXJzIVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVuY19jdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvc3QtPmZyYW1lX3JhdGUubnVtKQotICAgICAgICAgICAgICAgICAgICBvc3QtPmZyYW1lX3JhdGUgPSBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9yYXRlKG9zdC0+ZmlsdGVyLT5maWx0ZXIpOwotICAgICAgICAgICAgICAgIGlmIChpc3QgJiYgIW9zdC0+ZnJhbWVfcmF0ZS5udW0pCi0gICAgICAgICAgICAgICAgICAgIG9zdC0+ZnJhbWVfcmF0ZSA9IGlzdC0+ZnJhbWVyYXRlOwotICAgICAgICAgICAgICAgIGlmIChpc3QgJiYgIW9zdC0+ZnJhbWVfcmF0ZS5udW0pCi0gICAgICAgICAgICAgICAgICAgIG9zdC0+ZnJhbWVfcmF0ZSA9IGlzdC0+c3QtPnJfZnJhbWVfcmF0ZTsKLSAgICAgICAgICAgICAgICBpZiAoaXN0ICYmICFvc3QtPmZyYW1lX3JhdGUubnVtKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9zdC0+ZnJhbWVfcmF0ZSA9IChBVlJhdGlvbmFsKXsyNSwgMX07Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBpbmZvcm1hdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJvdXQgdGhlIGlucHV0IGZyYW1lcmF0ZSBpcyBhdmFpbGFibGUuIEZhbGxpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2sgdG8gYSBkZWZhdWx0IHZhbHVlIG9mIDI1ZnBzIGZvciBvdXRwdXQgc3RyZWFtICMlZDolZC4gVXNlIHRoZSAtciBvcHRpb24gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImlmIHlvdSB3YW50IGEgZGlmZmVyZW50IGZyYW1lcmF0ZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOwotICAgICAgICAgICAgICAgIH0KLS8vICAgICAgICAgICAgICAgICAgICBvc3QtPmZyYW1lX3JhdGUgPSBpc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gPyBpc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZSA6IChBVlJhdGlvbmFsKXsyNSwgMX07Ci0gICAgICAgICAgICAgICAgaWYgKG9zdC0+ZW5jICYmIG9zdC0+ZW5jLT5zdXBwb3J0ZWRfZnJhbWVyYXRlcyAmJiAhb3N0LT5mb3JjZV9mcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IGF2X2ZpbmRfbmVhcmVzdF9xX2lkeChvc3QtPmZyYW1lX3JhdGUsIG9zdC0+ZW5jLT5zdXBwb3J0ZWRfZnJhbWVyYXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG9zdC0+ZnJhbWVfcmF0ZSA9IG9zdC0+ZW5jLT5zdXBwb3J0ZWRfZnJhbWVyYXRlc1tpZHhdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyByZWR1Y2UgZnJhbWUgcmF0ZSBmb3IgbXBlZzQgdG8gYmUgd2l0aGluIHRoZSBzcGVjIGxpbWl0cwotICAgICAgICAgICAgICAgIGlmIChlbmNfY3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgewotICAgICAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJm9zdC0+ZnJhbWVfcmF0ZS5udW0sICZvc3QtPmZyYW1lX3JhdGUuZGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5mcmFtZV9yYXRlLm51bSwgb3N0LT5mcmFtZV9yYXRlLmRlbiwgNjU1MzUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3dpdGNoIChlbmNfY3R4LT5jb2RlY190eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgICAgICAgICAgICBlbmNfY3R4LT5zYW1wbGVfZm10ICAgICA9IG9zdC0+ZmlsdGVyLT5maWx0ZXItPmlucHV0c1swXS0+Zm9ybWF0OwotICAgICAgICAgICAgICAgIGVuY19jdHgtPnNhbXBsZV9yYXRlICAgID0gb3N0LT5maWx0ZXItPmZpbHRlci0+aW5wdXRzWzBdLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgICAgICBlbmNfY3R4LT5jaGFubmVsX2xheW91dCA9IG9zdC0+ZmlsdGVyLT5maWx0ZXItPmlucHV0c1swXS0+Y2hhbm5lbF9sYXlvdXQ7Ci0gICAgICAgICAgICAgICAgZW5jX2N0eC0+Y2hhbm5lbHMgICAgICAgPSBhdmZpbHRlcl9saW5rX2dldF9jaGFubmVscyhvc3QtPmZpbHRlci0+ZmlsdGVyLT5pbnB1dHNbMF0pOwotICAgICAgICAgICAgICAgIGVuY19jdHgtPnRpbWVfYmFzZSAgICAgID0gKEFWUmF0aW9uYWwpeyAxLCBlbmNfY3R4LT5zYW1wbGVfcmF0ZSB9OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gYXZfaW52X3Eob3N0LT5mcmFtZV9yYXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoIShlbmNfY3R4LT50aW1lX2Jhc2UubnVtICYmIGVuY19jdHgtPnRpbWVfYmFzZS5kZW4pKQotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UgPSBvc3QtPmZpbHRlci0+ZmlsdGVyLT5pbnB1dHNbMF0tPnRpbWVfYmFzZTsKLSAgICAgICAgICAgICAgICBpZiAoICAgYXZfcTJkKGVuY19jdHgtPnRpbWVfYmFzZSkgPCAwLjAwMSAmJiB2aWRlb19zeW5jX21ldGhvZCAhPSBWU1lOQ19QQVNTVEhST1VHSAotICAgICAgICAgICAgICAgICAgICYmICh2aWRlb19zeW5jX21ldGhvZCA9PSBWU1lOQ19DRlIgfHwgdmlkZW9fc3luY19tZXRob2QgPT0gVlNZTkNfVlNDRlIgfHwgKHZpZGVvX3N5bmNfbWV0aG9kID09IFZTWU5DX0FVVE8gJiYgIShvYy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9WQVJJQUJMRV9GUFMpKSkpewotICAgICAgICAgICAgICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19XQVJOSU5HLCAiRnJhbWUgcmF0ZSB2ZXJ5IGhpZ2ggZm9yIGEgbXV4ZXIgbm90IGVmZmljaWVudGx5IHN1cHBvcnRpbmcgaXQuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgY29uc2lkZXIgc3BlY2lmeWluZyBhIGxvd2VyIGZyYW1lcmF0ZSwgYSBkaWZmZXJlbnQgbXV4ZXIgb3IgLXZzeW5jIDJcbiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3N0LT5mb3JjZWRfa2ZfY291bnQ7IGorKykKLSAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2ZfcHRzW2pdID0gYXZfcmVzY2FsZV9xKG9zdC0+Zm9yY2VkX2tmX3B0c1tqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlKTsKLQotICAgICAgICAgICAgICAgIGVuY19jdHgtPndpZHRoICA9IG9zdC0+ZmlsdGVyLT5maWx0ZXItPmlucHV0c1swXS0+dzsKLSAgICAgICAgICAgICAgICBlbmNfY3R4LT5oZWlnaHQgPSBvc3QtPmZpbHRlci0+ZmlsdGVyLT5pbnB1dHNbMF0tPmg7Ci0gICAgICAgICAgICAgICAgZW5jX2N0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IG9zdC0+c3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPQotICAgICAgICAgICAgICAgICAgICBvc3QtPmZyYW1lX2FzcGVjdF9yYXRpby5udW0gPyAvLyBvdmVycmlkZGVuIGJ5IHRoZSAtYXNwZWN0IGNsaSBvcHRpb24KLSAgICAgICAgICAgICAgICAgICAgYXZfbXVsX3Eob3N0LT5mcmFtZV9hc3BlY3RfcmF0aW8sIChBVlJhdGlvbmFsKXsgZW5jX2N0eC0+aGVpZ2h0LCBlbmNfY3R4LT53aWR0aCB9KSA6Ci0gICAgICAgICAgICAgICAgICAgIG9zdC0+ZmlsdGVyLT5maWx0ZXItPmlucHV0c1swXS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAob3N0LT5lbmMtPm5hbWUsICJsaWJ4MjY0IiwgNykgJiYKLSAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUgJiYKLSAgICAgICAgICAgICAgICAgICAgb3N0LT5maWx0ZXItPmZpbHRlci0+aW5wdXRzWzBdLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9ZVVY0MjBQKQotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcGl4ZWwgZm9ybWF0IHNwZWNpZmllZCwgJXMgZm9yIEguMjY0IGVuY29kaW5nIGNob3Nlbi5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgLXBpeF9mbXQgeXV2NDIwcCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG91dGRhdGVkIG1lZGlhIHBsYXllcnMuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShvc3QtPmZpbHRlci0+ZmlsdGVyLT5pbnB1dHNbMF0tPmZvcm1hdCkpOwotICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChvc3QtPmVuYy0+bmFtZSwgIm1wZWcydmlkZW8iLCAxMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUgJiYKLSAgICAgICAgICAgICAgICAgICAgb3N0LT5maWx0ZXItPmZpbHRlci0+aW5wdXRzWzBdLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9ZVVY0MjBQKQotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gcGl4ZWwgZm9ybWF0IHNwZWNpZmllZCwgJXMgZm9yIE1QRUctMiBlbmNvZGluZyBjaG9zZW4uXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlIC1waXhfZm10IHl1djQyMHAgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdXRkYXRlZCBtZWRpYSBwbGF5ZXJzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUob3N0LT5maWx0ZXItPmZpbHRlci0+aW5wdXRzWzBdLT5mb3JtYXQpKTsKLSAgICAgICAgICAgICAgICBlbmNfY3R4LT5waXhfZm10ID0gb3N0LT5maWx0ZXItPmZpbHRlci0+aW5wdXRzWzBdLT5mb3JtYXQ7Ci0KLSAgICAgICAgICAgICAgICBvc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZSA9IG9zdC0+ZnJhbWVfcmF0ZTsKLQotICAgICAgICAgICAgICAgIGlmICghZGVjX2N0eCB8fAotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT53aWR0aCAgICE9IGRlY19jdHgtPndpZHRoICB8fAotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT5oZWlnaHQgICE9IGRlY19jdHgtPmhlaWdodCB8fAotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT5waXhfZm10ICE9IGRlY19jdHgtPnBpeF9mbXQpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IGZyYW1lX2JpdHNfcGVyX3Jhd19zYW1wbGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG9zdC0+Zm9yY2VkX2tleWZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAob3N0LT5mb3JjZWRfa2V5ZnJhbWVzLCAiZXhwcjoiLCA1KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgmb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX3BleHByLCBvc3QtPmZvcmNlZF9rZXlmcmFtZXMrNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VkX2tleWZyYW1lc19jb25zdF9uYW1lcywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZvcmNlX2tleV9mcmFtZXMgZXhwcmVzc2lvbiAnJXMnXG4iLCBvc3QtPmZvcmNlZF9rZXlmcmFtZXMrNSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfTl0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9OX0ZPUkNFRF0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9QUkVWX0ZPUkNFRF9OXSA9IE5BTjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfUFJFVl9GT1JDRURfVF0gPSBOQU47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHBhcnNlIHRoZSAnZm9yY2VkX2tleWZyYW1lcycgaW4gY2FzZSBvZiAna2VlcC1zb3VyY2Uta2V5ZnJhbWVzJywKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIGl0IG9ubHkgZm9yIHN0YXRpYyBrZiB0aW1pbmdzCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZihzdHJuY21wKG9zdC0+Zm9yY2VkX2tleWZyYW1lcywgInNvdXJjZSIsIDYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9mb3JjZWRfa2V5X2ZyYW1lcyhvc3QtPmZvcmNlZF9rZXlmcmFtZXMsIG9zdCwgb3N0LT5lbmNfY3R4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgotICAgICAgICAgICAgICAgIGVuY19jdHgtPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsxLCAxMDAwfTsKLSAgICAgICAgICAgICAgICBpZiAoIWVuY19jdHgtPndpZHRoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVuY19jdHgtPndpZHRoICAgICA9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdLT5zdC0+Y29kZWMtPndpZHRoOwotICAgICAgICAgICAgICAgICAgICBlbmNfY3R4LT5oZWlnaHQgICAgPSBpbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XS0+c3QtPmNvZGVjLT5oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfREFUQToKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvc3QtPmRpc3Bvc2l0aW9uKSB7Ci0gICAgICAgICAgICBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0c1tdID0gewotICAgICAgICAgICAgICAgIHsgImRpc3Bvc2l0aW9uIiAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfRkxBR1MsIHsgLmk2NCA9IDAgfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImRlZmF1bHQiICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0RFRkFVTFQgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImR1YiIgICAgICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0RVQiAgICAgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgIm9yaWdpbmFsIiAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX09SSUdJTkFMICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImNvbW1lbnQiICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0NPTU1FTlQgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImx5cmljcyIgICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0xZUklDUyAgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImthcmFva2UiICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0tBUkFPS0UgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImZvcmNlZCIgICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0ZPUkNFRCAgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImhlYXJpbmdfaW1wYWlyZWQiICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgInZpc3VhbF9pbXBhaXJlZCIgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX1ZJU1VBTF9JTVBBSVJFRCAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImNsZWFuX2VmZmVjdHMiICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0NMRUFOX0VGRkVDVFMgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImNhcHRpb25zIiAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0NBUFRJT05TICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgImRlc2NyaXB0aW9ucyIgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0RFU0NSSVBUSU9OUyAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgIm1ldGFkYXRhIiAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX01FVEFEQVRBICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAotICAgICAgICAgICAgICAgIHsgTlVMTCB9LAotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCBBVkNsYXNzIGNsYXNzID0gewotICAgICAgICAgICAgICAgIC5jbGFzc19uYW1lID0gIiIsCi0gICAgICAgICAgICAgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKLSAgICAgICAgICAgICAgICAub3B0aW9uICAgICA9IG9wdHMsCi0gICAgICAgICAgICAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgY29uc3QgQVZDbGFzcyAqcGNsYXNzID0gJmNsYXNzOwotCi0gICAgICAgICAgICByZXQgPSBhdl9vcHRfZXZhbF9mbGFncygmcGNsYXNzLCAmb3B0c1swXSwgb3N0LT5kaXNwb3NpdGlvbiwgJm9zdC0+c3QtPmRpc3Bvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZHVtcF9mb3JtYXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBvcGVuIGVhY2ggZW5jb2RlciAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIHJldCA9IGluaXRfb3V0cHV0X3N0cmVhbShvdXRwdXRfc3RyZWFtc1tpXSwgZXJyb3IsIHNpemVvZihlcnJvcikpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIGdvdG8gZHVtcF9mb3JtYXQ7Ci0gICAgfQotCi0gICAgLyogaW5pdCBpbnB1dCBzdHJlYW1zICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X3N0cmVhbXM7IGkrKykKLSAgICAgICAgaWYgKChyZXQgPSBpbml0X2lucHV0X3N0cmVhbShpLCBlcnJvciwgc2l6ZW9mKGVycm9yKSkpIDwgMCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgICAgICAgICBvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgICAgICAgICBhdmNvZGVjX2Nsb3NlKG9zdC0+ZW5jX2N0eCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnb3RvIGR1bXBfZm9ybWF0OwotICAgICAgICB9Ci0KLSAgICAvKiBkaXNjYXJkIHVudXNlZCBwcm9ncmFtcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9maWxlczsgaSsrKSB7Ci0gICAgICAgIElucHV0RmlsZSAqaWZpbGUgPSBpbnB1dF9maWxlc1tpXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGlmaWxlLT5jdHgtPm5iX3Byb2dyYW1zOyBqKyspIHsKLSAgICAgICAgICAgIEFWUHJvZ3JhbSAqcCA9IGlmaWxlLT5jdHgtPnByb2dyYW1zW2pdOwotICAgICAgICAgICAgaW50IGRpc2NhcmQgID0gQVZESVNDQVJEX0FMTDsKLQotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHAtPm5iX3N0cmVhbV9pbmRleGVzOyBrKyspCi0gICAgICAgICAgICAgICAgaWYgKCFpbnB1dF9zdHJlYW1zW2lmaWxlLT5pc3RfaW5kZXggKyBwLT5zdHJlYW1faW5kZXhba11dLT5kaXNjYXJkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBBVkRJU0NBUkRfREVGQVVMVDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgcC0+ZGlzY2FyZCA9IGRpc2NhcmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBvcGVuIGZpbGVzIGFuZCB3cml0ZSBmaWxlIGhlYWRlcnMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X2ZpbGVzOyBpKyspIHsKLSAgICAgICAgb2MgPSBvdXRwdXRfZmlsZXNbaV0tPmN0eDsKLSAgICAgICAgb2MtPmludGVycnVwdF9jYWxsYmFjayA9IGludF9jYjsKLSAgICAgICAgaWYgKChyZXQgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIob2MsICZvdXRwdXRfZmlsZXNbaV0tPm9wdHMpKSA8IDApIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGVycm9yLCBzaXplb2YoZXJyb3IpLAotICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB3cml0ZSBoZWFkZXIgZm9yIG91dHB1dCBmaWxlICMlZCAiCi0gICAgICAgICAgICAgICAgICAgICAiKGluY29ycmVjdCBjb2RlYyBwYXJhbWV0ZXJzID8pOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICBpLCBhdl9lcnIyc3RyKHJldCkpOwotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgZ290byBkdW1wX2Zvcm1hdDsKLSAgICAgICAgfQotLy8gICAgICAgICBhc3NlcnRfYXZvcHRpb25zKG91dHB1dF9maWxlc1tpXS0+b3B0cyk7Ci0gICAgICAgIGlmIChzdHJjbXAob2MtPm9mb3JtYXQtPm5hbWUsICJydHAiKSkgewotICAgICAgICAgICAgd2FudF9zZHAgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gZHVtcF9mb3JtYXQ6Ci0gICAgLyogZHVtcCB0aGUgZmlsZSBvdXRwdXQgcGFyYW1ldGVycyAtIGNhbm5vdCBiZSBkb25lIGJlZm9yZSBpbiBjYXNlCi0gICAgICAgb2Ygc3RyZWFtIGNvcHkgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X2ZpbGVzOyBpKyspIHsKLSAgICAgICAgYXZfZHVtcF9mb3JtYXQob3V0cHV0X2ZpbGVzW2ldLT5jdHgsIGksIG91dHB1dF9maWxlc1tpXS0+Y3R4LT5maWxlbmFtZSwgMSk7Ci0gICAgfQotCi0gICAgLyogZHVtcCB0aGUgc3RyZWFtIG1hcHBpbmcgKi8KLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJTdHJlYW0gbWFwcGluZzpcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpXTsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaXN0LT5uYl9maWx0ZXJzOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChpc3QtPmZpbHRlcnNbal0tPmdyYXBoLT5ncmFwaF9kZXNjKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICBTdHJlYW0gIyVkOiVkICglcykgLT4gJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4LCBpc3QtPmRlYyA/IGlzdC0+ZGVjLT5uYW1lIDogIj8iLAotICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmZpbHRlcnNbal0tPm5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChuYl9maWx0ZXJncmFwaHMgPiAxKQotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKGdyYXBoICVkKSIsIGlzdC0+ZmlsdGVyc1tqXS0+Z3JhcGgtPmluZGV4KTsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgb3N0ID0gb3V0cHV0X3N0cmVhbXNbaV07Ci0KLSAgICAgICAgaWYgKG9zdC0+YXR0YWNobWVudF9maWxlbmFtZSkgewotICAgICAgICAgICAgLyogYW4gYXR0YWNoZWQgZmlsZSAqLwotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICBGaWxlICVzIC0+IFN0cmVhbSAjJWQ6JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgb3N0LT5hdHRhY2htZW50X2ZpbGVuYW1lLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3N0LT5maWx0ZXIgJiYgb3N0LT5maWx0ZXItPmdyYXBoLT5ncmFwaF9kZXNjKSB7Ci0gICAgICAgICAgICAvKiBvdXRwdXQgZnJvbSBhIGNvbXBsZXggZ3JhcGggKi8KLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAgJXMiLCBvc3QtPmZpbHRlci0+bmFtZSk7Ci0gICAgICAgICAgICBpZiAobmJfZmlsdGVyZ3JhcGhzID4gMSkKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKGdyYXBoICVkKSIsIG9zdC0+ZmlsdGVyLT5ncmFwaC0+aW5kZXgpOwotCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgLT4gU3RyZWFtICMlZDolZCAoJXMpXG4iLCBvc3QtPmZpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgb3N0LT5pbmRleCwgb3N0LT5lbmMgPyBvc3QtPmVuYy0+bmFtZSA6ICI/Iik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAgU3RyZWFtICMlZDolZCAtPiAjJWQ6JWQiLAotICAgICAgICAgICAgICAgaW5wdXRfc3RyZWFtc1tvc3QtPnNvdXJjZV9pbmRleF0tPmZpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICBpbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XS0+c3QtPmluZGV4LAotICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LAotICAgICAgICAgICAgICAgb3N0LT5pbmRleCk7Ci0gICAgICAgIGlmIChvc3QtPnN5bmNfaXN0ICE9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIFtzeW5jICMlZDolZF0iLAotICAgICAgICAgICAgICAgICAgIG9zdC0+c3luY19pc3QtPmZpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgb3N0LT5zeW5jX2lzdC0+c3QtPmluZGV4KTsKLSAgICAgICAgaWYgKG9zdC0+c3RyZWFtX2NvcHkpCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKGNvcHkpIik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgQVZDb2RlYyAqaW5fY29kZWMgICAgPSBpbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XS0+ZGVjOwotICAgICAgICAgICAgY29uc3QgQVZDb2RlYyAqb3V0X2NvZGVjICAgPSBvc3QtPmVuYzsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlY29kZXJfbmFtZSAgID0gIj8iOwotICAgICAgICAgICAgY29uc3QgY2hhciAqaW5fY29kZWNfbmFtZSAgPSAiPyI7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGVyX25hbWUgICA9ICI/IjsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm91dF9jb2RlY19uYW1lID0gIj8iOwotICAgICAgICAgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2M7Ci0KLSAgICAgICAgICAgIGlmIChpbl9jb2RlYykgewotICAgICAgICAgICAgICAgIGRlY29kZXJfbmFtZSAgPSBpbl9jb2RlYy0+bmFtZTsKLSAgICAgICAgICAgICAgICBkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChpbl9jb2RlYy0+aWQpOwotICAgICAgICAgICAgICAgIGlmIChkZXNjKQotICAgICAgICAgICAgICAgICAgICBpbl9jb2RlY19uYW1lID0gZGVzYy0+bmFtZTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChkZWNvZGVyX25hbWUsIGluX2NvZGVjX25hbWUpKQotICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX25hbWUgPSAibmF0aXZlIjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG91dF9jb2RlYykgewotICAgICAgICAgICAgICAgIGVuY29kZXJfbmFtZSAgID0gb3V0X2NvZGVjLT5uYW1lOwotICAgICAgICAgICAgICAgIGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KG91dF9jb2RlYy0+aWQpOwotICAgICAgICAgICAgICAgIGlmIChkZXNjKQotICAgICAgICAgICAgICAgICAgICBvdXRfY29kZWNfbmFtZSA9IGRlc2MtPm5hbWU7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoZW5jb2Rlcl9uYW1lLCBvdXRfY29kZWNfbmFtZSkpCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXJfbmFtZSA9ICJuYXRpdmUiOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKCVzICglcykgLT4gJXMgKCVzKSkiLAotICAgICAgICAgICAgICAgICAgIGluX2NvZGVjX25hbWUsIGRlY29kZXJfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBvdXRfY29kZWNfbmFtZSwgZW5jb2Rlcl9uYW1lKTsKLSAgICAgICAgfQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJcbiIpOwotICAgIH0KLQotICAgIGlmIChyZXQpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBlcnJvcik7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgaWYgKHNkcF9maWxlbmFtZSB8fCB3YW50X3NkcCkgewotICAgICAgICBwcmludF9zZHAoKTsKLSAgICB9Ci0KLSAgICB0cmFuc2NvZGVfaW5pdF9kb25lID0gMTsKLQotICAgIHJldHVybiAwOwotfQotCi0vKiBSZXR1cm4gMSBpZiB0aGVyZSByZW1haW4gc3RyZWFtcyB3aGVyZSBtb3JlIG91dHB1dCBpcyB3YW50ZWQsIDAgb3RoZXJ3aXNlLiAqLwotc3RhdGljIGludCBuZWVkX291dHB1dCh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgICAgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgT3V0cHV0RmlsZSAqb2YgICAgICAgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKLSAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpvcyAgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XS0+Y3R4OwotCi0gICAgICAgIGlmIChvc3QtPmZpbmlzaGVkIHx8Ci0gICAgICAgICAgICAob3MtPnBiICYmIGF2aW9fdGVsbChvcy0+cGIpID49IG9mLT5saW1pdF9maWxlc2l6ZSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKG9zdC0+ZnJhbWVfbnVtYmVyID49IG9zdC0+bWF4X2ZyYW1lcykgewotICAgICAgICAgICAgaW50IGo7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2YtPmN0eC0+bmJfc3RyZWFtczsgaisrKQotICAgICAgICAgICAgICAgIGNsb3NlX291dHB1dF9zdHJlYW0ob3V0cHV0X3N0cmVhbXNbb2YtPm9zdF9pbmRleCArIGpdKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogU2VsZWN0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHByb2Nlc3MuCi0gKgotICogQHJldHVybiAgc2VsZWN0ZWQgb3V0cHV0IHN0cmVhbSwgb3IgTlVMTCBpZiBub25lIGF2YWlsYWJsZQotICovCi1zdGF0aWMgT3V0cHV0U3RyZWFtICpjaG9vc2Vfb3V0cHV0KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50NjRfdCBvcHRzX21pbiA9IElOVDY0X01BWDsKLSAgICBPdXRwdXRTdHJlYW0gKm9zdF9taW4gPSBOVUxMOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgaW50NjRfdCBvcHRzID0gb3N0LT5zdC0+Y3VyX2R0cyA9PSBBVl9OT1BUU19WQUxVRSA/IElOVDY0X01JTiA6Ci0gICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShvc3QtPnN0LT5jdXJfZHRzLCBvc3QtPnN0LT50aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7Ci0gICAgICAgIGlmIChvc3QtPnN0LT5jdXJfZHRzID09IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgImN1cl9kdHMgaXMgaW52YWxpZCAodGhpcyBpcyBoYXJtbGVzcyBpZiBpdCBvY2N1cnMgb25jZSBhdCB0aGUgc3RhcnQgcGVyIHN0cmVhbSlcbiIpOwotCi0gICAgICAgIGlmICghb3N0LT5maW5pc2hlZCAmJiBvcHRzIDwgb3B0c19taW4pIHsKLSAgICAgICAgICAgIG9wdHNfbWluID0gb3B0czsKLSAgICAgICAgICAgIG9zdF9taW4gID0gb3N0LT51bmF2YWlsYWJsZSA/IE5VTEwgOiBvc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG9zdF9taW47Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF90dHlfZWNobyhpbnQgb24pCi17Ci0jaWYgSEFWRV9URVJNSU9TX0gKLSAgICBzdHJ1Y3QgdGVybWlvcyB0dHk7Ci0gICAgaWYgKHRjZ2V0YXR0cigwLCAmdHR5KSA9PSAwKSB7Ci0gICAgICAgIGlmIChvbikgdHR5LmNfbGZsYWcgfD0gRUNITzsKLSAgICAgICAgZWxzZSAgICB0dHkuY19sZmxhZyAmPSB+RUNITzsKLSAgICAgICAgdGNzZXRhdHRyKDAsIFRDU0FOT1csICZ0dHkpOwotICAgIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IGNoZWNrX2tleWJvYXJkX2ludGVyYWN0aW9uKGludDY0X3QgY3VyX3RpbWUpCi17Ci0gICAgaW50IGksIHJldCwga2V5OwotICAgIHN0YXRpYyBpbnQ2NF90IGxhc3RfdGltZTsKLSAgICBpZiAocmVjZWl2ZWRfbmJfc2lnbmFscykKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKLSAgICAvKiByZWFkX2tleSgpIHJldHVybnMgMCBvbiBFT0YgKi8KLSAgICBpZihjdXJfdGltZSAtIGxhc3RfdGltZSA+PSAxMDAwMDAgJiYgIXJ1bl9hc19kYWVtb24pewotICAgICAgICBrZXkgPSAgcmVhZF9rZXkoKTsKLSAgICAgICAgbGFzdF90aW1lID0gY3VyX3RpbWU7Ci0gICAgfWVsc2UKLSAgICAgICAga2V5ID0gLTE7Ci0gICAgaWYgKGtleSA9PSAncScpCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7Ci0gICAgaWYgKGtleSA9PSAnKycpIGF2X2xvZ19zZXRfbGV2ZWwoYXZfbG9nX2dldF9sZXZlbCgpKzEwKTsKLSAgICBpZiAoa2V5ID09ICctJykgYXZfbG9nX3NldF9sZXZlbChhdl9sb2dfZ2V0X2xldmVsKCktMTApOwotICAgIGlmIChrZXkgPT0gJ3MnKSBxcF9oaXN0ICAgICBePSAxOwotICAgIGlmIChrZXkgPT0gJ2gnKXsKLSAgICAgICAgaWYgKGRvX2hleF9kdW1wKXsKLSAgICAgICAgICAgIGRvX2hleF9kdW1wID0gZG9fcGt0X2R1bXAgPSAwOwotICAgICAgICB9IGVsc2UgaWYoZG9fcGt0X2R1bXApewotICAgICAgICAgICAgZG9faGV4X2R1bXAgPSAxOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGRvX3BrdF9kdW1wID0gMTsKLSAgICAgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOwotICAgIH0KLSAgICBpZiAoa2V5ID09ICdjJyB8fCBrZXkgPT0gJ0MnKXsKLSAgICAgICAgY2hhciBidWZbNDA5Nl0sIHRhcmdldFs2NF0sIGNvbW1hbmRbMjU2XSwgYXJnWzI1Nl0gPSB7MH07Ci0gICAgICAgIGRvdWJsZSB0aW1lOwotICAgICAgICBpbnQgaywgbiA9IDA7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5FbnRlciBjb21tYW5kOiA8dGFyZ2V0PnxhbGwgPHRpbWU+fC0xIDxjb21tYW5kPlsgPGFyZ3VtZW50Pl1cbiIpOwotICAgICAgICBpID0gMDsKLSAgICAgICAgc2V0X3R0eV9lY2hvKDEpOwotICAgICAgICB3aGlsZSAoKGsgPSByZWFkX2tleSgpKSAhPSAnXG4nICYmIGsgIT0gJ1xyJyAmJiBpIDwgc2l6ZW9mKGJ1ZiktMSkKLSAgICAgICAgICAgIGlmIChrID4gMCkKLSAgICAgICAgICAgICAgICBidWZbaSsrXSA9IGs7Ci0gICAgICAgIGJ1ZltpXSA9IDA7Ci0gICAgICAgIHNldF90dHlfZWNobygwKTsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgICAgICBpZiAoayA+IDAgJiYKLSAgICAgICAgICAgIChuID0gc3NjYW5mKGJ1ZiwgIiU2M1teIF0gJWxmICUyNTVbXiBdICUyNTVbXlxuXSIsIHRhcmdldCwgJnRpbWUsIGNvbW1hbmQsIGFyZykpID49IDMpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJQcm9jZXNzaW5nIGNvbW1hbmQgdGFyZ2V0OiVzIHRpbWU6JWYgY29tbWFuZDolcyBhcmc6JXMiLAotICAgICAgICAgICAgICAgICAgIHRhcmdldCwgdGltZSwgY29tbWFuZCwgYXJnKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9maWx0ZXJncmFwaHM7IGkrKykgewotICAgICAgICAgICAgICAgIEZpbHRlckdyYXBoICpmZyA9IGZpbHRlcmdyYXBoc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoZmctPmdyYXBoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfc2VuZF9jb21tYW5kKGZnLT5ncmFwaCwgdGFyZ2V0LCBjb21tYW5kLCBhcmcsIGJ1Ziwgc2l6ZW9mKGJ1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID09ICdjJyA/IEFWRklMVEVSX0NNRF9GTEFHX09ORSA6IDApOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb21tYW5kIHJlcGx5IGZvciBzdHJlYW0gJWQ6IHJldDolZCByZXM6XG4lcyIsIGksIHJldCwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gJ2MnKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlF1ZWluZyBjb21tYW5kcyBvbmx5IG9uIGZpbHRlcnMgc3VwcG9ydGluZyB0aGUgc3BlY2lmaWMgY29tbWFuZCBpcyB1bnN1cHBvcnRlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX3F1ZXVlX2NvbW1hbmQoZmctPmdyYXBoLCB0YXJnZXQsIGNvbW1hbmQsIGFyZywgMCwgdGltZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlF1ZWluZyBjb21tYW5kIGZhaWxlZCB3aXRoIGVycm9yICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiUGFyc2UgZXJyb3IsIGF0IGxlYXN0IDMgYXJndW1lbnRzIHdlcmUgZXhwZWN0ZWQsICIKLSAgICAgICAgICAgICAgICAgICAib25seSAlZCBnaXZlbiBpbiBzdHJpbmcgJyVzJ1xuIiwgbiwgYnVmKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoa2V5ID09ICdkJyB8fCBrZXkgPT0gJ0QnKXsKLSAgICAgICAgaW50IGRlYnVnPTA7Ci0gICAgICAgIGlmKGtleSA9PSAnRCcpIHsKLSAgICAgICAgICAgIGRlYnVnID0gaW5wdXRfc3RyZWFtc1swXS0+c3QtPmNvZGVjLT5kZWJ1Zzw8MTsKLSAgICAgICAgICAgIGlmKCFkZWJ1ZykgZGVidWcgPSAxOwotICAgICAgICAgICAgd2hpbGUoZGVidWcgJiAoRkZfREVCVUdfRENUX0NPRUZGfEZGX0RFQlVHX1ZJU19RUHxGRl9ERUJVR19WSVNfTUJfVFlQRSkpIC8vdW5zdXBwb3J0ZWQsIHdvdWxkIGp1c3QgY3Jhc2gKLSAgICAgICAgICAgICAgICBkZWJ1ZyArPSBkZWJ1ZzsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlszMl07Ci0gICAgICAgICAgICBpbnQgayA9IDA7Ci0gICAgICAgICAgICBpID0gMDsKLSAgICAgICAgICAgIHNldF90dHlfZWNobygxKTsKLSAgICAgICAgICAgIHdoaWxlICgoayA9IHJlYWRfa2V5KCkpICE9ICdcbicgJiYgayAhPSAnXHInICYmIGkgPCBzaXplb2YoYnVmKS0xKQotICAgICAgICAgICAgICAgIGlmIChrID4gMCkKLSAgICAgICAgICAgICAgICAgICAgYnVmW2krK10gPSBrOwotICAgICAgICAgICAgYnVmW2ldID0gMDsKLSAgICAgICAgICAgIHNldF90dHlfZWNobygwKTsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgICAgICAgICAgIGlmIChrIDw9IDAgfHwgc3NjYW5mKGJ1ZiwgIiVkIiwgJmRlYnVnKSE9MSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZXJyb3IgcGFyc2luZyBkZWJ1ZyB2YWx1ZVxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGk9MDtpPG5iX2lucHV0X3N0cmVhbXM7aSsrKSB7Ci0gICAgICAgICAgICBpbnB1dF9zdHJlYW1zW2ldLT5zdC0+Y29kZWMtPmRlYnVnID0gZGVidWc7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGk9MDtpPG5iX291dHB1dF9zdHJlYW1zO2krKykgewotICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgICAgIG9zdC0+ZW5jX2N0eC0+ZGVidWcgPSBkZWJ1ZzsKLSAgICAgICAgfQotICAgICAgICBpZihkZWJ1ZykgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOwotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiZGVidWc9JWRcbiIsIGRlYnVnKTsKLSAgICB9Ci0gICAgaWYgKGtleSA9PSAnPycpewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImtleSAgICBmdW5jdGlvblxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIj8gICAgICBzaG93IHRoaXMgaGVscFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIisgICAgICBpbmNyZWFzZSB2ZXJib3NpdHlcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICItICAgICAgZGVjcmVhc2UgdmVyYm9zaXR5XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiYyAgICAgIFNlbmQgY29tbWFuZCB0byBmaXJzdCBtYXRjaGluZyBmaWx0ZXIgc3VwcG9ydGluZyBpdFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIkMgICAgICBTZW5kL1F1ZSBjb21tYW5kIHRvIGFsbCBtYXRjaGluZyBmaWx0ZXJzXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiRCAgICAgIGN5Y2xlIHRocm91Z2ggYXZhaWxhYmxlIGRlYnVnIG1vZGVzXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiaCAgICAgIGR1bXAgcGFja2V0cy9oZXggcHJlc3MgdG8gY3ljbGUgdGhyb3VnaCB0aGUgMyBzdGF0ZXNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJxICAgICAgcXVpdFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgInMgICAgICBTaG93IFFQIGhpc3RvZ3JhbVxuIgotICAgICAgICApOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2lmIEhBVkVfUFRIUkVBRFMKLXN0YXRpYyB2b2lkICppbnB1dF90aHJlYWQodm9pZCAqYXJnKQotewotICAgIElucHV0RmlsZSAqZiA9IGFyZzsKLSAgICB1bnNpZ25lZCBmbGFncyA9IGYtPm5vbl9ibG9ja2luZyA/IEFWX1RIUkVBRF9NRVNTQUdFX05PTkJMT0NLIDogMDsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIEFWUGFja2V0IHBrdDsKLSAgICAgICAgcmV0ID0gYXZfcmVhZF9mcmFtZShmLT5jdHgsICZwa3QpOwotCi0gICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7Ci0gICAgICAgICAgICBhdl91c2xlZXAoMTAwMDApOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfcmVjdihmLT5pbl90aHJlYWRfcXVldWUsIHJldCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZW5kKGYtPmluX3RocmVhZF9xdWV1ZSwgJnBrdCwgZmxhZ3MpOwotICAgICAgICBpZiAoZmxhZ3MgJiYgcmV0ID09IEFWRVJST1IoRUFHQUlOKSkgewotICAgICAgICAgICAgZmxhZ3MgPSAwOwotICAgICAgICAgICAgcmV0ID0gYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2VuZChmLT5pbl90aHJlYWRfcXVldWUsICZwa3QsIGZsYWdzKTsKLSAgICAgICAgICAgIGF2X2xvZyhmLT5jdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICJUaHJlYWQgbWVzc2FnZSBxdWV1ZSBibG9ja2luZzsgY29uc2lkZXIgcmFpc2luZyB0aGUgIgotICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfcXVldWVfc2l6ZSBvcHRpb24gKGN1cnJlbnQgdmFsdWU6ICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICBmLT50aHJlYWRfcXVldWVfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUl9FT0YpCi0gICAgICAgICAgICAgICAgYXZfbG9nKGYtPmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNlbmQgcGFja2V0IHRvIG1haW4gdGhyZWFkOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKLSAgICAgICAgICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfcmVjdihmLT5pbl90aHJlYWRfcXVldWUsIHJldCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2lucHV0X3RocmVhZHModm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9maWxlczsgaSsrKSB7Ci0gICAgICAgIElucHV0RmlsZSAqZiA9IGlucHV0X2ZpbGVzW2ldOwotICAgICAgICBBVlBhY2tldCBwa3Q7Ci0KLSAgICAgICAgaWYgKCFmIHx8ICFmLT5pbl90aHJlYWRfcXVldWUpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2V0X2Vycl9zZW5kKGYtPmluX3RocmVhZF9xdWV1ZSwgQVZFUlJPUl9FT0YpOwotICAgICAgICB3aGlsZSAoYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfcmVjdihmLT5pbl90aHJlYWRfcXVldWUsICZwa3QsIDApID49IDApCi0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7Ci0KLSAgICAgICAgcHRocmVhZF9qb2luKGYtPnRocmVhZCwgTlVMTCk7Ci0gICAgICAgIGYtPmpvaW5lZCA9IDE7Ci0gICAgICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2ZyZWUoJmYtPmluX3RocmVhZF9xdWV1ZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGluaXRfaW5wdXRfdGhyZWFkcyh2b2lkKQotewotICAgIGludCBpLCByZXQ7Ci0KLSAgICBpZiAobmJfaW5wdXRfZmlsZXMgPT0gMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5wdXRfZmlsZXM7IGkrKykgewotICAgICAgICBJbnB1dEZpbGUgKmYgPSBpbnB1dF9maWxlc1tpXTsKLQotICAgICAgICBpZiAoZi0+Y3R4LT5wYiA/ICFmLT5jdHgtPnBiLT5zZWVrYWJsZSA6Ci0gICAgICAgICAgICBzdHJjbXAoZi0+Y3R4LT5pZm9ybWF0LT5uYW1lLCAibGF2ZmkiKSkKLSAgICAgICAgICAgIGYtPm5vbl9ibG9ja2luZyA9IDE7Ci0gICAgICAgIHJldCA9IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2FsbG9jKCZmLT5pbl90aHJlYWRfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPnRocmVhZF9xdWV1ZV9zaXplLCBzaXplb2YoQVZQYWNrZXQpKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIGlmICgocmV0ID0gcHRocmVhZF9jcmVhdGUoJmYtPnRocmVhZCwgTlVMTCwgaW5wdXRfdGhyZWFkLCBmKSkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQ6ICVzLiBUcnkgdG8gaW5jcmVhc2UgYHVsaW1pdCAtdmAgb3IgZGVjcmVhc2UgYHVsaW1pdCAtc2AuXG4iLCBzdHJlcnJvcihyZXQpKTsKLSAgICAgICAgICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2ZyZWUoJmYtPmluX3RocmVhZF9xdWV1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihyZXQpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF9pbnB1dF9wYWNrZXRfbXQoSW5wdXRGaWxlICpmLCBBVlBhY2tldCAqcGt0KQotewotICAgIHJldHVybiBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9yZWN2KGYtPmluX3RocmVhZF9xdWV1ZSwgcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPm5vbl9ibG9ja2luZyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVEhSRUFEX01FU1NBR0VfTk9OQkxPQ0sgOiAwKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGdldF9pbnB1dF9wYWNrZXQoSW5wdXRGaWxlICpmLCBBVlBhY2tldCAqcGt0KQotewotICAgIGlmIChmLT5yYXRlX2VtdSkgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGYtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gKmlzdCA9IGlucHV0X3N0cmVhbXNbZi0+aXN0X2luZGV4ICsgaV07Ci0gICAgICAgICAgICBpbnQ2NF90IHB0cyA9IGF2X3Jlc2NhbGUoaXN0LT5kdHMsIDEwMDAwMDAsIEFWX1RJTUVfQkFTRSk7Ci0gICAgICAgICAgICBpbnQ2NF90IG5vdyA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIGlzdC0+c3RhcnQ7Ci0gICAgICAgICAgICBpZiAocHRzID4gbm93KQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNpZiBIQVZFX1BUSFJFQURTCi0gICAgaWYgKG5iX2lucHV0X2ZpbGVzID4gMSkKLSAgICAgICAgcmV0dXJuIGdldF9pbnB1dF9wYWNrZXRfbXQoZiwgcGt0KTsKLSNlbmRpZgotICAgIHJldHVybiBhdl9yZWFkX2ZyYW1lKGYtPmN0eCwgcGt0KTsKLX0KLQotc3RhdGljIGludCBnb3RfZWFnYWluKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspCi0gICAgICAgIGlmIChvdXRwdXRfc3RyZWFtc1tpXS0+dW5hdmFpbGFibGUpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcmVzZXRfZWFnYWluKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X2ZpbGVzOyBpKyspCi0gICAgICAgIGlucHV0X2ZpbGVzW2ldLT5lYWdhaW4gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKQotICAgICAgICBvdXRwdXRfc3RyZWFtc1tpXS0+dW5hdmFpbGFibGUgPSAwOwotfQotCi0vLyBzZXQgZHVyYXRpb24gdG8gbWF4KHRtcCwgZHVyYXRpb24pIGluIGEgcHJvcGVyIHRpbWUgYmFzZSBhbmQgcmV0dXJuIGR1cmF0aW9uJ3MgdGltZV9iYXNlCi1zdGF0aWMgQVZSYXRpb25hbCBkdXJhdGlvbl9tYXgoaW50NjRfdCB0bXAsIGludDY0X3QgKmR1cmF0aW9uLCBBVlJhdGlvbmFsIHRtcF90aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlKQotewotICAgIGludCByZXQ7Ci0KLSAgICBpZiAoISpkdXJhdGlvbikgewotICAgICAgICAqZHVyYXRpb24gPSB0bXA7Ci0gICAgICAgIHJldHVybiB0bXBfdGltZV9iYXNlOwotICAgIH0KLQotICAgIHJldCA9IGF2X2NvbXBhcmVfdHMoKmR1cmF0aW9uLCB0aW1lX2Jhc2UsIHRtcCwgdG1wX3RpbWVfYmFzZSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgKmR1cmF0aW9uID0gdG1wOwotICAgICAgICByZXR1cm4gdG1wX3RpbWVfYmFzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGltZV9iYXNlOwotfQotCi1zdGF0aWMgaW50IHNlZWtfdG9fc3RhcnQoSW5wdXRGaWxlICppZmlsZSwgQVZGb3JtYXRDb250ZXh0ICppcykKLXsKLSAgICBJbnB1dFN0cmVhbSAqaXN0OwotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKLSAgICBpbnQgaSwgcmV0LCBoYXNfYXVkaW8gPSAwOwotICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwotCi0gICAgcmV0ID0gYXZfc2Vla19mcmFtZShpcywgLTEsIGlzLT5zdGFydF90aW1lLCAwKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBpZmlsZS0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIGlzdCAgID0gaW5wdXRfc3RyZWFtc1tpZmlsZS0+aXN0X2luZGV4ICsgaV07Ci0gICAgICAgIGF2Y3R4ID0gaXN0LT5kZWNfY3R4OwotCi0gICAgICAgIC8vIGZsdXNoIGRlY29kZXJzCi0gICAgICAgIGlmIChpc3QtPmRlY29kaW5nX25lZWRlZCkgewotICAgICAgICAgICAgcHJvY2Vzc19pbnB1dF9wYWNrZXQoaXN0LCBOVUxMLCAxKTsKLSAgICAgICAgICAgIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhhdmN0eCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBkdXJhdGlvbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IGZyYW1lIGluIGEgc3RyZWFtCi0gICAgICAgICAqIHdoZW4gYXVkaW8gc3RyZWFtIGlzIHByZXNlbnQgd2UgZG9uJ3QgY2FyZSBhYm91dAotICAgICAgICAgKiBsYXN0IHZpZGVvIGZyYW1lIGxlbmd0aCBiZWNhdXNlIGl0J3Mgbm90IGRlZmluZWQgZXhhY3RseSAqLwotICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIGlzdC0+bmJfc2FtcGxlcykKLSAgICAgICAgICAgIGhhc19hdWRpbyA9IDE7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IGlmaWxlLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgaXN0ICAgPSBpbnB1dF9zdHJlYW1zW2lmaWxlLT5pc3RfaW5kZXggKyBpXTsKLSAgICAgICAgYXZjdHggPSBpc3QtPmRlY19jdHg7Ci0KLSAgICAgICAgaWYgKGhhc19hdWRpbykgewotICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJiBpc3QtPm5iX3NhbXBsZXMpIHsKLSAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHNhbXBsZV9yYXRlID0gezEsIGF2Y3R4LT5zYW1wbGVfcmF0ZX07Ci0KLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShpc3QtPm5iX3NhbXBsZXMsIHNhbXBsZV9yYXRlLCBpc3QtPnN0LT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaXN0LT5mcmFtZXJhdGUubnVtKSB7Ci0gICAgICAgICAgICAgICAgZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EoMSwgaXN0LT5mcmFtZXJhdGUsIGlzdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzdC0+c3QtPmF2Z19mcmFtZV9yYXRlLm51bSkgewotICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gYXZfcmVzY2FsZV9xKDEsIGlzdC0+c3QtPmF2Z19mcmFtZV9yYXRlLCBpc3QtPnN0LT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgfSBlbHNlIGR1cmF0aW9uID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlmaWxlLT5kdXJhdGlvbikKLSAgICAgICAgICAgIGlmaWxlLT50aW1lX2Jhc2UgPSBpc3QtPnN0LT50aW1lX2Jhc2U7Ci0gICAgICAgIC8qIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgc3RyZWFtLCBtYXhfcHRzIC0gbWluX3B0cyBpcwotICAgICAgICAgKiB0aGUgZHVyYXRpb24gb2YgdGhlIHN0cmVhbSB3aXRob3V0IHRoZSBsYXN0IGZyYW1lICovCi0gICAgICAgIGR1cmF0aW9uICs9IGlzdC0+bWF4X3B0cyAtIGlzdC0+bWluX3B0czsKLSAgICAgICAgaWZpbGUtPnRpbWVfYmFzZSA9IGR1cmF0aW9uX21heChkdXJhdGlvbiwgJmlmaWxlLT5kdXJhdGlvbiwgaXN0LT5zdC0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmaWxlLT50aW1lX2Jhc2UpOwotICAgIH0KLQotICAgIGlmIChpZmlsZS0+bG9vcCA+IDApCi0gICAgICAgIGlmaWxlLT5sb29wLS07Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vKgotICogUmV0dXJuCi0gKiAtIDAgLS0gb25lIHBhY2tldCB3YXMgcmVhZCBhbmQgcHJvY2Vzc2VkCi0gKiAtIEFWRVJST1IoRUFHQUlOKSAtLSBubyBwYWNrZXRzIHdlcmUgYXZhaWxhYmxlIGZvciBzZWxlY3RlZCBmaWxlLAotICogICB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4KLSAqIC0gQVZFUlJPUl9FT0YgLS0gdGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBhZ2FpbgotICovCi1zdGF0aWMgaW50IHByb2Nlc3NfaW5wdXQoaW50IGZpbGVfaW5kZXgpCi17Ci0gICAgSW5wdXRGaWxlICppZmlsZSA9IGlucHV0X2ZpbGVzW2ZpbGVfaW5kZXhdOwotICAgIEFWRm9ybWF0Q29udGV4dCAqaXM7Ci0gICAgSW5wdXRTdHJlYW0gKmlzdDsKLSAgICBBVlBhY2tldCBwa3Q7Ci0gICAgaW50IHJldCwgaSwgajsKLSAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgIGludDY0X3QgcGt0X2R0czsKLQotICAgIGlzICA9IGlmaWxlLT5jdHg7Ci0gICAgcmV0ID0gZ2V0X2lucHV0X3BhY2tldChpZmlsZSwgJnBrdCk7Ci0KLSAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkgewotICAgICAgICBpZmlsZS0+ZWFnYWluID0gMTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCA8IDAgJiYgaWZpbGUtPmxvb3ApIHsKLSAgICAgICAgaWYgKChyZXQgPSBzZWVrX3RvX3N0YXJ0KGlmaWxlLCBpcykpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIHJldCA9IGdldF9pbnB1dF9wYWNrZXQoaWZpbGUsICZwa3QpOwotICAgIH0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBpZiAocmV0ICE9IEFWRVJST1JfRU9GKSB7Ci0gICAgICAgICAgICBwcmludF9lcnJvcihpcy0+ZmlsZW5hbWUsIHJldCk7Ci0gICAgICAgICAgICBpZiAoZXhpdF9vbl9lcnJvcikKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWZpbGUtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpZmlsZS0+aXN0X2luZGV4ICsgaV07Ci0gICAgICAgICAgICBpZiAoaXN0LT5kZWNvZGluZ19uZWVkZWQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBwcm9jZXNzX2lucHV0X3BhY2tldChpc3QsIE5VTEwsIDApOwotICAgICAgICAgICAgICAgIGlmIChyZXQ+MCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIG1hcmsgYWxsIG91dHB1dHMgdGhhdCBkb24ndCBnbyB0aHJvdWdoIGxhdmZpIGFzIGZpbmlzaGVkICovCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGorKykgewotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gb3V0cHV0X3N0cmVhbXNbal07Ci0KLSAgICAgICAgICAgICAgICBpZiAob3N0LT5zb3VyY2VfaW5kZXggPT0gaWZpbGUtPmlzdF9pbmRleCArIGkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG9zdC0+c3RyZWFtX2NvcHkgfHwgb3N0LT5lbmMtPnR5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSkKLSAgICAgICAgICAgICAgICAgICAgZmluaXNoX291dHB1dF9zdHJlYW0ob3N0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmaWxlLT5lb2ZfcmVhY2hlZCA9IDE7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Ci0gICAgfQotCi0gICAgcmVzZXRfZWFnYWluKCk7Ci0KLSAgICBpZiAoZG9fcGt0X2R1bXApIHsKLSAgICAgICAgYXZfcGt0X2R1bXBfbG9nMihOVUxMLCBBVl9MT0dfSU5GTywgJnBrdCwgZG9faGV4X2R1bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaXMtPnN0cmVhbXNbcGt0LnN0cmVhbV9pbmRleF0pOwotICAgIH0KLSAgICAvKiB0aGUgZm9sbG93aW5nIHRlc3QgaXMgbmVlZGVkIGluIGNhc2UgbmV3IHN0cmVhbXMgYXBwZWFyCi0gICAgICAgZHluYW1pY2FsbHkgaW4gc3RyZWFtIDogd2UgaWdub3JlIHRoZW0gKi8KLSAgICBpZiAocGt0LnN0cmVhbV9pbmRleCA+PSBpZmlsZS0+bmJfc3RyZWFtcykgewotICAgICAgICByZXBvcnRfbmV3X3N0cmVhbShmaWxlX2luZGV4LCAmcGt0KTsKLSAgICAgICAgZ290byBkaXNjYXJkX3BhY2tldDsKLSAgICB9Ci0KLSAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW2lmaWxlLT5pc3RfaW5kZXggKyBwa3Quc3RyZWFtX2luZGV4XTsKLQotICAgIGlzdC0+ZGF0YV9zaXplICs9IHBrdC5zaXplOwotICAgIGlzdC0+bmJfcGFja2V0cysrOwotCi0gICAgaWYgKGlzdC0+ZGlzY2FyZCkKLSAgICAgICAgZ290byBkaXNjYXJkX3BhY2tldDsKLQotICAgIGlmIChleGl0X29uX2Vycm9yICYmIChwa3QuZmxhZ3MgJiBBVl9QS1RfRkxBR19DT1JSVVBUKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiJXM6IGNvcnJ1cHQgaW5wdXQgcGFja2V0IGluIHN0cmVhbSAlZFxuIiwgaXMtPmZpbGVuYW1lLCBwa3Quc3RyZWFtX2luZGV4KTsKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIH0KLQotICAgIGlmIChkZWJ1Z190cykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJkZW11eGVyIC0+IGlzdF9pbmRleDolZCB0eXBlOiVzICIKLSAgICAgICAgICAgICAgICJuZXh0X2R0czolcyBuZXh0X2R0c190aW1lOiVzIG5leHRfcHRzOiVzIG5leHRfcHRzX3RpbWU6JXMgcGt0X3B0czolcyBwa3RfcHRzX3RpbWU6JXMgcGt0X2R0czolcyBwa3RfZHRzX3RpbWU6JXMgb2ZmOiVzIG9mZl90aW1lOiVzXG4iLAotICAgICAgICAgICAgICAgaWZpbGUtPmlzdF9pbmRleCArIHBrdC5zdHJlYW1faW5kZXgsIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGUpLAotICAgICAgICAgICAgICAgYXZfdHMyc3RyKGlzdC0+bmV4dF9kdHMpLCBhdl90czJ0aW1lc3RyKGlzdC0+bmV4dF9kdHMsICZBVl9USU1FX0JBU0VfUSksCi0gICAgICAgICAgICAgICBhdl90czJzdHIoaXN0LT5uZXh0X3B0cyksIGF2X3RzMnRpbWVzdHIoaXN0LT5uZXh0X3B0cywgJkFWX1RJTUVfQkFTRV9RKSwKLSAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QucHRzKSwgYXZfdHMydGltZXN0cihwa3QucHRzLCAmaXN0LT5zdC0+dGltZV9iYXNlKSwKLSAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QuZHRzKSwgYXZfdHMydGltZXN0cihwa3QuZHRzLCAmaXN0LT5zdC0+dGltZV9iYXNlKSwKLSAgICAgICAgICAgICAgIGF2X3RzMnN0cihpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT50c19vZmZzZXQpLAotICAgICAgICAgICAgICAgYXZfdHMydGltZXN0cihpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT50c19vZmZzZXQsICZBVl9USU1FX0JBU0VfUSkpOwotICAgIH0KLQotICAgIGlmKCFpc3QtPndyYXBfY29ycmVjdGlvbl9kb25lICYmIGlzLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFICYmIGlzdC0+c3QtPnB0c193cmFwX2JpdHMgPCA2NCl7Ci0gICAgICAgIGludDY0X3Qgc3RpbWUsIHN0aW1lMjsKLSAgICAgICAgLy8gQ29ycmVjdGluZyBzdGFydHRpbWUgYmFzZWQgb24gdGhlIGVuYWJsZWQgc3RyZWFtcwotICAgICAgICAvLyBGSVhNRSB0aGlzIGlkZWFsbHkgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHRoZSBmaXJzdCB1c2Ugb2Ygc3RhcnR0aW1lIGJ1dCB3ZSBkbyBub3Qga25vdyB3aGljaCBhcmUgdGhlIGVuYWJsZWQgc3RyZWFtcyBhdCB0aGF0IHBvaW50LgotICAgICAgICAvLyAgICAgICBzbyB3ZSBpbnN0ZWFkIGRvIGl0IGhlcmUgYXMgcGFydCBvZiBkaXNjb250aW51aXR5IGhhbmRsaW5nCi0gICAgICAgIGlmICggICBpc3QtPm5leHRfZHRzID09IEFWX05PUFRTX1ZBTFVFCi0gICAgICAgICAgICAmJiBpZmlsZS0+dHNfb2Zmc2V0ID09IC1pcy0+c3RhcnRfdGltZQotICAgICAgICAgICAgJiYgKGlzLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX1RTX0RJU0NPTlQpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IG5ld19zdGFydF90aW1lID0gSU5UNjRfTUFYOwotICAgICAgICAgICAgZm9yIChpPTA7IGk8aXMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IGlzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIGlmKHN0LT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwgfHwgc3QtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIG5ld19zdGFydF90aW1lID0gRkZNSU4obmV3X3N0YXJ0X3RpbWUsIGF2X3Jlc2NhbGVfcShzdC0+c3RhcnRfdGltZSwgc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChuZXdfc3RhcnRfdGltZSA+IGlzLT5zdGFydF90aW1lKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGlzLCBBVl9MT0dfVkVSQk9TRSwgIkNvcnJlY3Rpbmcgc3RhcnQgdGltZSBieSAlIlBSSWQ2NCJcbiIsIG5ld19zdGFydF90aW1lIC0gaXMtPnN0YXJ0X3RpbWUpOwotICAgICAgICAgICAgICAgIGlmaWxlLT50c19vZmZzZXQgPSAtbmV3X3N0YXJ0X3RpbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzdGltZSA9IGF2X3Jlc2NhbGVfcShpcy0+c3RhcnRfdGltZSwgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgIHN0aW1lMj0gc3RpbWUgKyAoMVVMTDw8aXN0LT5zdC0+cHRzX3dyYXBfYml0cyk7Ci0gICAgICAgIGlzdC0+d3JhcF9jb3JyZWN0aW9uX2RvbmUgPSAxOwotCi0gICAgICAgIGlmKHN0aW1lMiA+IHN0aW1lICYmIHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LmR0cyA+IHN0aW1lICsgKDFMTDw8KGlzdC0+c3QtPnB0c193cmFwX2JpdHMtMSkpKSB7Ci0gICAgICAgICAgICBwa3QuZHRzIC09IDFVTEw8PGlzdC0+c3QtPnB0c193cmFwX2JpdHM7Ci0gICAgICAgICAgICBpc3QtPndyYXBfY29ycmVjdGlvbl9kb25lID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZihzdGltZTIgPiBzdGltZSAmJiBwa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHBrdC5wdHMgPiBzdGltZSArICgxTEw8PChpc3QtPnN0LT5wdHNfd3JhcF9iaXRzLTEpKSkgewotICAgICAgICAgICAgcGt0LnB0cyAtPSAxVUxMPDxpc3QtPnN0LT5wdHNfd3JhcF9iaXRzOwotICAgICAgICAgICAgaXN0LT53cmFwX2NvcnJlY3Rpb25fZG9uZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBhZGQgdGhlIHN0cmVhbS1nbG9iYWwgc2lkZSBkYXRhIHRvIHRoZSBmaXJzdCBwYWNrZXQgKi8KLSAgICBpZiAoaXN0LT5uYl9wYWNrZXRzID09IDEpIHsKLSAgICAgICAgaWYgKGlzdC0+c3QtPm5iX3NpZGVfZGF0YSkKLSAgICAgICAgICAgIGF2X3BhY2tldF9zcGxpdF9zaWRlX2RhdGEoJnBrdCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3QtPnN0LT5uYl9zaWRlX2RhdGE7IGkrKykgewotICAgICAgICAgICAgQVZQYWNrZXRTaWRlRGF0YSAqc3JjX3NkID0gJmlzdC0+c3QtPnNpZGVfZGF0YVtpXTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9kYXRhOwotCi0gICAgICAgICAgICBpZiAoYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoJnBrdCwgc3JjX3NkLT50eXBlLCBOVUxMKSkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChpc3QtPmF1dG9yb3RhdGUgJiYgc3JjX3NkLT50eXBlID09IEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVgpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGRzdF9kYXRhID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEoJnBrdCwgc3JjX3NkLT50eXBlLCBzcmNfc2QtPnNpemUpOwotICAgICAgICAgICAgaWYgKCFkc3RfZGF0YSkKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0KLSAgICAgICAgICAgIG1lbWNweShkc3RfZGF0YSwgc3JjX3NkLT5kYXRhLCBzcmNfc2QtPnNpemUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgIHBrdC5kdHMgKz0gYXZfcmVzY2FsZV9xKGlmaWxlLT50c19vZmZzZXQsIEFWX1RJTUVfQkFTRV9RLCBpc3QtPnN0LT50aW1lX2Jhc2UpOwotICAgIGlmIChwa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICBwa3QucHRzICs9IGF2X3Jlc2NhbGVfcShpZmlsZS0+dHNfb2Zmc2V0LCBBVl9USU1FX0JBU0VfUSwgaXN0LT5zdC0+dGltZV9iYXNlKTsKLQotICAgIGlmIChwa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICBwa3QucHRzICo9IGlzdC0+dHNfc2NhbGU7Ci0gICAgaWYgKHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgIHBrdC5kdHMgKj0gaXN0LT50c19zY2FsZTsKLQotICAgIHBrdF9kdHMgPSBhdl9yZXNjYWxlX3Ffcm5kKHBrdC5kdHMsIGlzdC0+c3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EsIEFWX1JPVU5EX05FQVJfSU5GfEFWX1JPVU5EX1BBU1NfTUlOTUFYKTsKLSAgICBpZiAoKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKLSAgICAgICAgIGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pICYmCi0gICAgICAgIHBrdF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgaXN0LT5uZXh0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSAmJiAhY29weV90cwotICAgICAgICAmJiAoaXMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfVFNfRElTQ09OVCkgJiYgaWZpbGUtPmxhc3RfdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgaW50NjRfdCBkZWx0YSAgID0gcGt0X2R0cyAtIGlmaWxlLT5sYXN0X3RzOwotICAgICAgICBpZiAoZGVsdGEgPCAtMUxMKmR0c19kZWx0YV90aHJlc2hvbGQqQVZfVElNRV9CQVNFIHx8Ci0gICAgICAgICAgICBkZWx0YSA+ICAxTEwqZHRzX2RlbHRhX3RocmVzaG9sZCpBVl9USU1FX0JBU0UpewotICAgICAgICAgICAgaWZpbGUtPnRzX29mZnNldCAtPSBkZWx0YTsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgIkludGVyIHN0cmVhbSB0aW1lc3RhbXAgZGlzY29udGludWl0eSAlIlBSSWQ2NCIsIG5ldyBvZmZzZXQ9ICUiUFJJZDY0IlxuIiwKLSAgICAgICAgICAgICAgICAgICBkZWx0YSwgaWZpbGUtPnRzX29mZnNldCk7Ci0gICAgICAgICAgICBwa3QuZHRzIC09IGF2X3Jlc2NhbGVfcShkZWx0YSwgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgICAgICBpZiAocGt0LnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgICAgICBwa3QucHRzIC09IGF2X3Jlc2NhbGVfcShkZWx0YSwgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShpZmlsZS0+ZHVyYXRpb24sIGlmaWxlLT50aW1lX2Jhc2UsIGlzdC0+c3QtPnRpbWVfYmFzZSk7Ci0gICAgaWYgKHBrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgcGt0LnB0cyArPSBkdXJhdGlvbjsKLSAgICAgICAgaXN0LT5tYXhfcHRzID0gRkZNQVgocGt0LnB0cywgaXN0LT5tYXhfcHRzKTsKLSAgICAgICAgaXN0LT5taW5fcHRzID0gRkZNSU4ocGt0LnB0cywgaXN0LT5taW5fcHRzKTsKLSAgICB9Ci0KLSAgICBpZiAocGt0LmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgcGt0LmR0cyArPSBkdXJhdGlvbjsKLQotICAgIHBrdF9kdHMgPSBhdl9yZXNjYWxlX3Ffcm5kKHBrdC5kdHMsIGlzdC0+c3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EsIEFWX1JPVU5EX05FQVJfSU5GfEFWX1JPVU5EX1BBU1NfTUlOTUFYKTsKLSAgICBpZiAoKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKLSAgICAgICAgIGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pICYmCi0gICAgICAgICBwa3RfZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIGlzdC0+bmV4dF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKLSAgICAgICAgIWNvcHlfdHMpIHsKLSAgICAgICAgaW50NjRfdCBkZWx0YSAgID0gcGt0X2R0cyAtIGlzdC0+bmV4dF9kdHM7Ci0gICAgICAgIGlmIChpcy0+aWZvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9UU19ESVNDT05UKSB7Ci0gICAgICAgICAgICBpZiAoZGVsdGEgPCAtMUxMKmR0c19kZWx0YV90aHJlc2hvbGQqQVZfVElNRV9CQVNFIHx8Ci0gICAgICAgICAgICAgICAgZGVsdGEgPiAgMUxMKmR0c19kZWx0YV90aHJlc2hvbGQqQVZfVElNRV9CQVNFIHx8Ci0gICAgICAgICAgICAgICAgcGt0X2R0cyArIEFWX1RJTUVfQkFTRS8xMCA8IEZGTUFYKGlzdC0+cHRzLCBpc3QtPmR0cykpIHsKLSAgICAgICAgICAgICAgICBpZmlsZS0+dHNfb2Zmc2V0IC09IGRlbHRhOwotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgZGlzY29udGludWl0eSAlIlBSSWQ2NCIsIG5ldyBvZmZzZXQ9ICUiUFJJZDY0IlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEsIGlmaWxlLT50c19vZmZzZXQpOwotICAgICAgICAgICAgICAgIHBrdC5kdHMgLT0gYXZfcmVzY2FsZV9xKGRlbHRhLCBBVl9USU1FX0JBU0VfUSwgaXN0LT5zdC0+dGltZV9iYXNlKTsKLSAgICAgICAgICAgICAgICBpZiAocGt0LnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgcGt0LnB0cyAtPSBhdl9yZXNjYWxlX3EoZGVsdGEsIEFWX1RJTUVfQkFTRV9RLCBpc3QtPnN0LT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCBkZWx0YSA8IC0xTEwqZHRzX2Vycm9yX3RocmVzaG9sZCpBVl9USU1FX0JBU0UgfHwKLSAgICAgICAgICAgICAgICAgZGVsdGEgPiAgMUxMKmR0c19lcnJvcl90aHJlc2hvbGQqQVZfVElNRV9CQVNFKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiRFRTICUiUFJJZDY0IiwgbmV4dDolIlBSSWQ2NCIgc3Q6JWQgaW52YWxpZCBkcm9wcGluZ1xuIiwgcGt0LmR0cywgaXN0LT5uZXh0X2R0cywgcGt0LnN0cmVhbV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgcGt0LmR0cyA9IEFWX05PUFRTX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpewotICAgICAgICAgICAgICAgIGludDY0X3QgcGt0X3B0cyA9IGF2X3Jlc2NhbGVfcShwa3QucHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKLSAgICAgICAgICAgICAgICBkZWx0YSAgID0gcGt0X3B0cyAtIGlzdC0+bmV4dF9kdHM7Ci0gICAgICAgICAgICAgICAgaWYgKCBkZWx0YSA8IC0xTEwqZHRzX2Vycm9yX3RocmVzaG9sZCpBVl9USU1FX0JBU0UgfHwKLSAgICAgICAgICAgICAgICAgICAgIGRlbHRhID4gIDFMTCpkdHNfZXJyb3JfdGhyZXNob2xkKkFWX1RJTUVfQkFTRSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJQVFMgJSJQUklkNjQiLCBuZXh0OiUiUFJJZDY0IiBpbnZhbGlkIGRyb3BwaW5nIHN0OiVkXG4iLCBwa3QucHRzLCBpc3QtPm5leHRfZHRzLCBwa3Quc3RyZWFtX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcGt0LnB0cyA9IEFWX05PUFRTX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwa3QuZHRzICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICBpZmlsZS0+bGFzdF90cyA9IGF2X3Jlc2NhbGVfcShwa3QuZHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKLQotICAgIGlmIChkZWJ1Z190cykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJkZW11eGVyK2ZmbXBlZyAtPiBpc3RfaW5kZXg6JWQgdHlwZTolcyBwa3RfcHRzOiVzIHBrdF9wdHNfdGltZTolcyBwa3RfZHRzOiVzIHBrdF9kdHNfdGltZTolcyBvZmY6JXMgb2ZmX3RpbWU6JXNcbiIsCi0gICAgICAgICAgICAgICBpZmlsZS0+aXN0X2luZGV4ICsgcGt0LnN0cmVhbV9pbmRleCwgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSksCi0gICAgICAgICAgICAgICBhdl90czJzdHIocGt0LnB0cyksIGF2X3RzMnRpbWVzdHIocGt0LnB0cywgJmlzdC0+c3QtPnRpbWVfYmFzZSksCi0gICAgICAgICAgICAgICBhdl90czJzdHIocGt0LmR0cyksIGF2X3RzMnRpbWVzdHIocGt0LmR0cywgJmlzdC0+c3QtPnRpbWVfYmFzZSksCi0gICAgICAgICAgICAgICBhdl90czJzdHIoaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+dHNfb2Zmc2V0KSwKLSAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIoaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+dHNfb2Zmc2V0LCAmQVZfVElNRV9CQVNFX1EpKTsKLSAgICB9Ci0KLSAgICBzdWIydmlkZW9faGVhcnRiZWF0KGlzdCwgcGt0LnB0cyk7Ci0KLSAgICBwcm9jZXNzX2lucHV0X3BhY2tldChpc3QsICZwa3QsIDApOwotCi1kaXNjYXJkX3BhY2tldDoKLSAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBQZXJmb3JtIGEgc3RlcCBvZiB0cmFuc2NvZGluZyBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIgZ3JhcGguCi0gKgotICogQHBhcmFtW2luXSAgZ3JhcGggICAgIGZpbHRlciBncmFwaCB0byBjb25zaWRlcgotICogQHBhcmFtW291dF0gYmVzdF9pc3QgIGlucHV0IHN0cmVhbSB3aGVyZSBhIGZyYW1lIHdvdWxkIGFsbG93IHRvIGNvbnRpbnVlCi0gKiBAcmV0dXJuICAwIGZvciBzdWNjZXNzLCA8MCBmb3IgZXJyb3IKLSAqLwotc3RhdGljIGludCB0cmFuc2NvZGVfZnJvbV9maWx0ZXIoRmlsdGVyR3JhcGggKmdyYXBoLCBJbnB1dFN0cmVhbSAqKmJlc3RfaXN0KQotewotICAgIGludCBpLCByZXQ7Ci0gICAgaW50IG5iX3JlcXVlc3RzLCBuYl9yZXF1ZXN0c19tYXggPSAwOwotICAgIElucHV0RmlsdGVyICppZmlsdGVyOwotICAgIElucHV0U3RyZWFtICppc3Q7Ci0KLSAgICAqYmVzdF9pc3QgPSBOVUxMOwotICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX3JlcXVlc3Rfb2xkZXN0KGdyYXBoLT5ncmFwaCk7Ci0gICAgaWYgKHJldCA+PSAwKQotICAgICAgICByZXR1cm4gcmVhcF9maWx0ZXJzKDApOwotCi0gICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgewotICAgICAgICByZXQgPSByZWFwX2ZpbHRlcnMoMSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfb3V0cHV0czsgaSsrKQotICAgICAgICAgICAgY2xvc2Vfb3V0cHV0X3N0cmVhbShncmFwaC0+b3V0cHV0c1tpXS0+b3N0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgaWYgKHJldCAhPSBBVkVSUk9SKEVBR0FJTikpCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2lucHV0czsgaSsrKSB7Ci0gICAgICAgIGlmaWx0ZXIgPSBncmFwaC0+aW5wdXRzW2ldOwotICAgICAgICBpc3QgPSBpZmlsdGVyLT5pc3Q7Ci0gICAgICAgIGlmIChpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT5lYWdhaW4gfHwKLSAgICAgICAgICAgIGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF0tPmVvZl9yZWFjaGVkKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIG5iX3JlcXVlc3RzID0gYXZfYnVmZmVyc3JjX2dldF9uYl9mYWlsZWRfcmVxdWVzdHMoaWZpbHRlci0+ZmlsdGVyKTsKLSAgICAgICAgaWYgKG5iX3JlcXVlc3RzID4gbmJfcmVxdWVzdHNfbWF4KSB7Ci0gICAgICAgICAgICBuYl9yZXF1ZXN0c19tYXggPSBuYl9yZXF1ZXN0czsKLSAgICAgICAgICAgICpiZXN0X2lzdCA9IGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghKmJlc3RfaXN0KQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX291dHB1dHM7IGkrKykKLSAgICAgICAgICAgIGdyYXBoLT5vdXRwdXRzW2ldLT5vc3QtPnVuYXZhaWxhYmxlID0gMTsKLQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqIFJ1biBhIHNpbmdsZSBzdGVwIG9mIHRyYW5zY29kaW5nLgotICoKLSAqIEByZXR1cm4gIDAgZm9yIHN1Y2Nlc3MsIDwwIGZvciBlcnJvcgotICovCi1zdGF0aWMgaW50IHRyYW5zY29kZV9zdGVwKHZvaWQpCi17Ci0gICAgT3V0cHV0U3RyZWFtICpvc3Q7Ci0gICAgSW5wdXRTdHJlYW0gICppc3Q7Ci0gICAgaW50IHJldDsKLQotICAgIG9zdCA9IGNob29zZV9vdXRwdXQoKTsKLSAgICBpZiAoIW9zdCkgewotICAgICAgICBpZiAoZ290X2VhZ2FpbigpKSB7Ci0gICAgICAgICAgICByZXNldF9lYWdhaW4oKTsKLSAgICAgICAgICAgIGF2X3VzbGVlcCgxMDAwMCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJObyBtb3JlIGlucHV0cyB0byByZWFkIGZyb20sIGZpbmlzaGluZy5cbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Ci0gICAgfQotCi0gICAgaWYgKG9zdC0+ZmlsdGVyKSB7Ci0gICAgICAgIGlmICgocmV0ID0gdHJhbnNjb2RlX2Zyb21fZmlsdGVyKG9zdC0+ZmlsdGVyLT5ncmFwaCwgJmlzdCkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmICghaXN0KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZfYXNzZXJ0MChvc3QtPnNvdXJjZV9pbmRleCA+PSAwKTsKLSAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tvc3QtPnNvdXJjZV9pbmRleF07Ci0gICAgfQotCi0gICAgcmV0ID0gcHJvY2Vzc19pbnB1dChpc3QtPmZpbGVfaW5kZXgpOwotICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7Ci0gICAgICAgIGlmIChpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT5lYWdhaW4pCi0gICAgICAgICAgICBvc3QtPnVuYXZhaWxhYmxlID0gMTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQgPT0gQVZFUlJPUl9FT0YgPyAwIDogcmV0OwotCi0gICAgcmV0dXJuIHJlYXBfZmlsdGVycygwKTsKLX0KLQotLyoKLSAqIFRoZSBmb2xsb3dpbmcgY29kZSBpcyB0aGUgbWFpbiBsb29wIG9mIHRoZSBmaWxlIGNvbnZlcnRlcgotICovCi1zdGF0aWMgaW50IHRyYW5zY29kZSh2b2lkKQotewotICAgIGludCByZXQsIGk7Ci0gICAgQVZGb3JtYXRDb250ZXh0ICpvczsKLSAgICBPdXRwdXRTdHJlYW0gKm9zdDsKLSAgICBJbnB1dFN0cmVhbSAqaXN0OwotICAgIGludDY0X3QgdGltZXJfc3RhcnQ7Ci0gICAgaW50NjRfdCB0b3RhbF9wYWNrZXRzX3dyaXR0ZW4gPSAwOwotCi0gICAgcmV0ID0gdHJhbnNjb2RlX2luaXQoKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgaWYgKHN0ZGluX2ludGVyYWN0aW9uKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlByZXNzIFtxXSB0byBzdG9wLCBbP10gZm9yIGhlbHBcbiIpOwotICAgIH0KLQotICAgIHRpbWVyX3N0YXJ0ID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOwotCi0jaWYgSEFWRV9QVEhSRUFEUwotICAgIGlmICgocmV0ID0gaW5pdF9pbnB1dF90aHJlYWRzKCkpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotI2VuZGlmCi0KLSAgICB3aGlsZSAoIXJlY2VpdmVkX3NpZ3Rlcm0pIHsKLSAgICAgICAgaW50NjRfdCBjdXJfdGltZT0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOwotCi0gICAgICAgIC8qIGlmICdxJyBwcmVzc2VkLCBleGl0cyAqLwotICAgICAgICBpZiAoc3RkaW5faW50ZXJhY3Rpb24pCi0gICAgICAgICAgICBpZiAoY2hlY2tfa2V5Ym9hcmRfaW50ZXJhY3Rpb24oY3VyX3RpbWUpIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBjaGVjayBpZiB0aGVyZSdzIGFueSBzdHJlYW0gd2hlcmUgb3V0cHV0IGlzIHN0aWxsIG5lZWRlZCAqLwotICAgICAgICBpZiAoIW5lZWRfb3V0cHV0KCkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIk5vIG1vcmUgb3V0cHV0IHN0cmVhbXMgdG8gd3JpdGUgdG8sIGZpbmlzaGluZy5cbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICByZXQgPSB0cmFuc2NvZGVfc3RlcCgpOwotICAgICAgICBpZiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUl9FT0YpIHsKLSAgICAgICAgICAgIGNoYXIgZXJyYnVmWzEyOF07Ci0gICAgICAgICAgICBhdl9zdHJlcnJvcihyZXQsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOwotCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hpbGUgZmlsdGVyaW5nOiAlc1xuIiwgZXJyYnVmKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZHVtcCByZXBvcnQgYnkgdXNpbmcgdGhlIG91dHB1dCBmaXJzdCB2aWRlbyBhbmQgYXVkaW8gc3RyZWFtcyAqLwotICAgICAgICBwcmludF9yZXBvcnQoMCwgdGltZXJfc3RhcnQsIGN1cl90aW1lKTsKLSAgICB9Ci0jaWYgSEFWRV9QVEhSRUFEUwotICAgIGZyZWVfaW5wdXRfdGhyZWFkcygpOwotI2VuZGlmCi0KLSAgICAvKiBhdCB0aGUgZW5kIG9mIHN0cmVhbSwgd2UgbXVzdCBmbHVzaCB0aGUgZGVjb2RlciBidWZmZXJzICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X3N0cmVhbXM7IGkrKykgewotICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW2ldOwotICAgICAgICBpZiAoIWlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF0tPmVvZl9yZWFjaGVkICYmIGlzdC0+ZGVjb2RpbmdfbmVlZGVkKSB7Ci0gICAgICAgICAgICBwcm9jZXNzX2lucHV0X3BhY2tldChpc3QsIE5VTEwsIDApOwotICAgICAgICB9Ci0gICAgfQotICAgIGZsdXNoX2VuY29kZXJzKCk7Ci0KLSAgICB0ZXJtX2V4aXQoKTsKLQotICAgIC8qIHdyaXRlIHRoZSB0cmFpbGVyIGlmIG5lZWRlZCBhbmQgY2xvc2UgZmlsZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfZmlsZXM7IGkrKykgewotICAgICAgICBvcyA9IG91dHB1dF9maWxlc1tpXS0+Y3R4OwotICAgICAgICBpZiAoKHJldCA9IGF2X3dyaXRlX3RyYWlsZXIob3MpKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciB3cml0aW5nIHRyYWlsZXIgb2YgJXM6ICVzIiwgb3MtPmZpbGVuYW1lLCBhdl9lcnIyc3RyKHJldCkpOwotICAgICAgICAgICAgaWYgKGV4aXRfb25fZXJyb3IpCi0gICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZHVtcCByZXBvcnQgYnkgdXNpbmcgdGhlIGZpcnN0IHZpZGVvIGFuZCBhdWRpbyBzdHJlYW1zICovCi0gICAgcHJpbnRfcmVwb3J0KDEsIHRpbWVyX3N0YXJ0LCBhdl9nZXR0aW1lX3JlbGF0aXZlKCkpOwotCi0gICAgLyogY2xvc2UgZWFjaCBlbmNvZGVyICovCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgb3N0ID0gb3V0cHV0X3N0cmVhbXNbaV07Ci0gICAgICAgIGlmIChvc3QtPmVuY29kaW5nX25lZWRlZCkgewotICAgICAgICAgICAgYXZfZnJlZXAoJm9zdC0+ZW5jX2N0eC0+c3RhdHNfaW4pOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsX3BhY2tldHNfd3JpdHRlbiArPSBvc3QtPnBhY2tldHNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgICBpZiAoIXRvdGFsX3BhY2tldHNfd3JpdHRlbiAmJiAoYWJvcnRfb25fZmxhZ3MgJiBBQk9SVF9PTl9GTEFHX0VNUFRZX09VVFBVVCkpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkVtcHR5IG91dHB1dFxuIik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICAvKiBjbG9zZSBlYWNoIGRlY29kZXIgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5wdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbaV07Ci0gICAgICAgIGlmIChpc3QtPmRlY29kaW5nX25lZWRlZCkgewotICAgICAgICAgICAgYXZjb2RlY19jbG9zZShpc3QtPmRlY19jdHgpOwotICAgICAgICAgICAgaWYgKGlzdC0+aHdhY2NlbF91bmluaXQpCi0gICAgICAgICAgICAgICAgaXN0LT5od2FjY2VsX3VuaW5pdChpc3QtPmRlY19jdHgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZmluaXNoZWQgISAqLwotICAgIHJldCA9IDA7Ci0KLSBmYWlsOgotI2lmIEhBVkVfUFRIUkVBRFMKLSAgICBmcmVlX2lucHV0X3RocmVhZHMoKTsKLSNlbmRpZgotCi0gICAgaWYgKG91dHB1dF9zdHJlYW1zKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICBvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgICAgIGlmIChvc3QpIHsKLSAgICAgICAgICAgICAgICBpZiAob3N0LT5sb2dmaWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmY2xvc2Uob3N0LT5sb2dmaWxlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNsb3NpbmcgbG9nZmlsZSwgbG9zcyBvZiBpbmZvcm1hdGlvbiBwb3NzaWJsZTogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihBVkVSUk9SKGVycm5vKSkpOwotICAgICAgICAgICAgICAgICAgICBvc3QtPmxvZ2ZpbGUgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdl9mcmVlcCgmb3N0LT5mb3JjZWRfa2ZfcHRzKTsKLSAgICAgICAgICAgICAgICBhdl9mcmVlcCgmb3N0LT5hcGFkKTsKLSAgICAgICAgICAgICAgICBhdl9mcmVlcCgmb3N0LT5kaXNwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZvc3QtPmVuY29kZXJfb3B0cyk7Ci0gICAgICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZvc3QtPnN3c19kaWN0KTsKLSAgICAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9zdC0+c3dyX29wdHMpOwotICAgICAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3N0LT5yZXNhbXBsZV9vcHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQ2NF90IGdldHV0aW1lKHZvaWQpCi17Ci0jaWYgSEFWRV9HRVRSVVNBR0UKLSAgICBzdHJ1Y3QgcnVzYWdlIHJ1c2FnZTsKLQotICAgIGdldHJ1c2FnZShSVVNBR0VfU0VMRiwgJnJ1c2FnZSk7Ci0gICAgcmV0dXJuIChydXNhZ2UucnVfdXRpbWUudHZfc2VjICogMTAwMDAwMExMKSArIHJ1c2FnZS5ydV91dGltZS50dl91c2VjOwotI2VsaWYgSEFWRV9HRVRQUk9DRVNTVElNRVMKLSAgICBIQU5ETEUgcHJvYzsKLSAgICBGSUxFVElNRSBjLCBlLCBrLCB1OwotICAgIHByb2MgPSBHZXRDdXJyZW50UHJvY2VzcygpOwotICAgIEdldFByb2Nlc3NUaW1lcyhwcm9jLCAmYywgJmUsICZrLCAmdSk7Ci0gICAgcmV0dXJuICgoaW50NjRfdCkgdS5kd0hpZ2hEYXRlVGltZSA8PCAzMiB8IHUuZHdMb3dEYXRlVGltZSkgLyAxMDsKLSNlbHNlCi0gICAgcmV0dXJuIGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50NjRfdCBnZXRtYXhyc3Modm9pZCkKLXsKLSNpZiBIQVZFX0dFVFJVU0FHRSAmJiBIQVZFX1NUUlVDVF9SVVNBR0VfUlVfTUFYUlNTCi0gICAgc3RydWN0IHJ1c2FnZSBydXNhZ2U7Ci0gICAgZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnVzYWdlKTsKLSAgICByZXR1cm4gKGludDY0X3QpcnVzYWdlLnJ1X21heHJzcyAqIDEwMjQ7Ci0jZWxpZiBIQVZFX0dFVFBST0NFU1NNRU1PUllJTkZPCi0gICAgSEFORExFIHByb2M7Ci0gICAgUFJPQ0VTU19NRU1PUllfQ09VTlRFUlMgbWVtY291bnRlcnM7Ci0gICAgcHJvYyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7Ci0gICAgbWVtY291bnRlcnMuY2IgPSBzaXplb2YobWVtY291bnRlcnMpOwotICAgIEdldFByb2Nlc3NNZW1vcnlJbmZvKHByb2MsICZtZW1jb3VudGVycywgc2l6ZW9mKG1lbWNvdW50ZXJzKSk7Ci0gICAgcmV0dXJuIG1lbWNvdW50ZXJzLlBlYWtQYWdlZmlsZVVzYWdlOwotI2Vsc2UKLSAgICByZXR1cm4gMDsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBsb2dfY2FsbGJhY2tfbnVsbCh2b2lkICpwdHIsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZsKQotewotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IHJldDsKLSAgICBpbnQ2NF90IHRpOwotCi0gICAgcmVnaXN0ZXJfZXhpdChmZm1wZWdfY2xlYW51cCk7Ci0KLSAgICBzZXR2YnVmKHN0ZGVycixOVUxMLF9JT05CRiwwKTsgLyogd2luMzIgcnVudGltZSBuZWVkcyB0aGlzICovCi0KLSAgICBhdl9sb2dfc2V0X2ZsYWdzKEFWX0xPR19TS0lQX1JFUEVBVEVEKTsKLSAgICBwYXJzZV9sb2dsZXZlbChhcmdjLCBhcmd2LCBvcHRpb25zKTsKLQotICAgIGlmKGFyZ2M+MSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItZCIpKXsKLSAgICAgICAgcnVuX2FzX2RhZW1vbj0xOwotICAgICAgICBhdl9sb2dfc2V0X2NhbGxiYWNrKGxvZ19jYWxsYmFja19udWxsKTsKLSAgICAgICAgYXJnYy0tOwotICAgICAgICBhcmd2Kys7Ci0gICAgfQotCi0gICAgYXZjb2RlY19yZWdpc3Rlcl9hbGwoKTsKLSNpZiBDT05GSUdfQVZERVZJQ0UKLSAgICBhdmRldmljZV9yZWdpc3Rlcl9hbGwoKTsKLSNlbmRpZgotICAgIGF2ZmlsdGVyX3JlZ2lzdGVyX2FsbCgpOwotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwotICAgIGF2Zm9ybWF0X25ldHdvcmtfaW5pdCgpOwotCi0gICAgc2hvd19iYW5uZXIoYXJnYywgYXJndiwgb3B0aW9ucyk7Ci0KLSAgICB0ZXJtX2luaXQoKTsKLQotICAgIC8qIHBhcnNlIG9wdGlvbnMgYW5kIG9wZW4gYWxsIGlucHV0L291dHB1dCBmaWxlcyAqLwotICAgIHJldCA9IGZmbXBlZ19wYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0KLSAgICBpZiAobmJfb3V0cHV0X2ZpbGVzIDw9IDAgJiYgbmJfaW5wdXRfZmlsZXMgPT0gMCkgewotICAgICAgICBzaG93X3VzYWdlKCk7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlVzZSAtaCB0byBnZXQgZnVsbCBoZWxwIG9yLCBldmVuIGJldHRlciwgcnVuICdtYW4gJXMnXG4iLCBwcm9ncmFtX25hbWUpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgLyogZmlsZSBjb252ZXJ0ZXIgLyBncmFiICovCi0gICAgaWYgKG5iX291dHB1dF9maWxlcyA8PSAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJBdCBsZWFzdCBvbmUgb3V0cHV0IGZpbGUgbXVzdCBiZSBzcGVjaWZpZWRcbiIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0vLyAgICAgaWYgKG5iX2lucHV0X2ZpbGVzID09IDApIHsKLS8vICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKLS8vICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotLy8gICAgIH0KLQotICAgIGN1cnJlbnRfdGltZSA9IHRpID0gZ2V0dXRpbWUoKTsKLSAgICBpZiAodHJhbnNjb2RlKCkgPCAwKQotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgdGkgPSBnZXR1dGltZSgpIC0gdGk7Ci0gICAgaWYgKGRvX2JlbmNobWFyaykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJiZW5jaDogdXRpbWU9JTAuM2ZzXG4iLCB0aSAvIDEwMDAwMDAuMCk7Ci0gICAgfQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIlIlBSSXU2NCIgZnJhbWVzIHN1Y2Nlc3NmdWxseSBkZWNvZGVkLCAlIlBSSXU2NCIgZGVjb2RpbmcgZXJyb3JzXG4iLAotICAgICAgICAgICBkZWNvZGVfZXJyb3Jfc3RhdFswXSwgZGVjb2RlX2Vycm9yX3N0YXRbMV0pOwotICAgIGlmICgoZGVjb2RlX2Vycm9yX3N0YXRbMF0gKyBkZWNvZGVfZXJyb3Jfc3RhdFsxXSkgKiBtYXhfZXJyb3JfcmF0ZSA8IGRlY29kZV9lcnJvcl9zdGF0WzFdKQotICAgICAgICBleGl0X3Byb2dyYW0oNjkpOwotCi0gICAgZXhpdF9wcm9ncmFtKHJlY2VpdmVkX25iX3NpZ25hbHMgPyAyNTUgOiBtYWluX3JldHVybl9jb2RlKTsKLSAgICByZXR1cm4gbWFpbl9yZXR1cm5fY29kZTsKLX0KZGlmZiAtLWdpdCBhL2ZmbXBlZy5oIGIvZmZtcGVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzIyYjAuLjAwMDAwMDAKLS0tIGEvZmZtcGVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ODEgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZuZGVmIEZGTVBFR19ICi0jZGVmaW5lIEZGTVBFR19ICi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpZiBIQVZFX1BUSFJFQURTCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJjbWR1dGlscy5oIgotCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmlvLmgiCi0KLSNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKLQotI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2F2ZmlsdGVyLmgiCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmgiCi0KLSNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaCIKLQotI2RlZmluZSBWU1lOQ19BVVRPICAgICAgIC0xCi0jZGVmaW5lIFZTWU5DX1BBU1NUSFJPVUdIIDAKLSNkZWZpbmUgVlNZTkNfQ0ZSICAgICAgICAgMQotI2RlZmluZSBWU1lOQ19WRlIgICAgICAgICAyCi0jZGVmaW5lIFZTWU5DX1ZTQ0ZSICAgICAgIDB4ZmUKLSNkZWZpbmUgVlNZTkNfRFJPUCAgICAgICAgMHhmZgotCi0jZGVmaW5lIE1BWF9TVFJFQU1TIDEwMjQgICAgLyogYXJiaXRyYXJ5IHNhbml0eSBjaGVjayB2YWx1ZSAqLwotCi1lbnVtIEhXQWNjZWxJRCB7Ci0gICAgSFdBQ0NFTF9OT05FID0gMCwKLSAgICBIV0FDQ0VMX0FVVE8sCi0gICAgSFdBQ0NFTF9WRFBBVSwKLSAgICBIV0FDQ0VMX0RYVkEyLAotICAgIEhXQUNDRUxfVkRBLAotICAgIEhXQUNDRUxfVklERU9UT09MQk9YLAotICAgIEhXQUNDRUxfUVNWLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgSFdBY2NlbCB7Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICBpbnQgKCppbml0KShBVkNvZGVjQ29udGV4dCAqcyk7Ci0gICAgZW51bSBIV0FjY2VsSUQgaWQ7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7Ci19IEhXQWNjZWw7Ci0KLS8qIHNlbGVjdCBhbiBpbnB1dCBzdHJlYW0gZm9yIGFuIG91dHB1dCBzdHJlYW0gKi8KLXR5cGVkZWYgc3RydWN0IFN0cmVhbU1hcCB7Ci0gICAgaW50IGRpc2FibGVkOyAgICAgICAgICAgLyogMSBpcyB0aGlzIG1hcHBpbmcgaXMgZGlzYWJsZWQgYnkgYSBuZWdhdGl2ZSBtYXAgKi8KLSAgICBpbnQgZmlsZV9pbmRleDsKLSAgICBpbnQgc3RyZWFtX2luZGV4OwotICAgIGludCBzeW5jX2ZpbGVfaW5kZXg7Ci0gICAgaW50IHN5bmNfc3RyZWFtX2luZGV4OwotICAgIGNoYXIgKmxpbmtsYWJlbDsgICAgICAgLyogbmFtZSBvZiBhbiBvdXRwdXQgbGluaywgZm9yIG1hcHBpbmcgbGF2Zmkgb3V0cHV0cyAqLwotfSBTdHJlYW1NYXA7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgIGZpbGVfaWR4LCAgc3RyZWFtX2lkeCwgIGNoYW5uZWxfaWR4OyAvLyBpbnB1dAotICAgIGludCBvZmlsZV9pZHgsIG9zdHJlYW1faWR4OyAgICAgICAgICAgICAgIC8vIG91dHB1dAotfSBBdWRpb0NoYW5uZWxNYXA7Ci0KLXR5cGVkZWYgc3RydWN0IE9wdGlvbnNDb250ZXh0IHsKLSAgICBPcHRpb25Hcm91cCAqZzsKLQotICAgIC8qIGlucHV0L291dHB1dCBvcHRpb25zICovCi0gICAgaW50NjRfdCBzdGFydF90aW1lOwotICAgIGludDY0X3Qgc3RhcnRfdGltZV9lb2Y7Ci0gICAgaW50IHNlZWtfdGltZXN0YW1wOwotICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKLQotICAgIFNwZWNpZmllck9wdCAqY29kZWNfbmFtZXM7Ci0gICAgaW50ICAgICAgICBuYl9jb2RlY19uYW1lczsKLSAgICBTcGVjaWZpZXJPcHQgKmF1ZGlvX2NoYW5uZWxzOwotICAgIGludCAgICAgICAgbmJfYXVkaW9fY2hhbm5lbHM7Ci0gICAgU3BlY2lmaWVyT3B0ICphdWRpb19zYW1wbGVfcmF0ZTsKLSAgICBpbnQgICAgICAgIG5iX2F1ZGlvX3NhbXBsZV9yYXRlOwotICAgIFNwZWNpZmllck9wdCAqZnJhbWVfcmF0ZXM7Ci0gICAgaW50ICAgICAgICBuYl9mcmFtZV9yYXRlczsKLSAgICBTcGVjaWZpZXJPcHQgKmZyYW1lX3NpemVzOwotICAgIGludCAgICAgICAgbmJfZnJhbWVfc2l6ZXM7Ci0gICAgU3BlY2lmaWVyT3B0ICpmcmFtZV9waXhfZm10czsKLSAgICBpbnQgICAgICAgIG5iX2ZyYW1lX3BpeF9mbXRzOwotCi0gICAgLyogaW5wdXQgb3B0aW9ucyAqLwotICAgIGludDY0X3QgaW5wdXRfdHNfb2Zmc2V0OwotICAgIGludCBsb29wOwotICAgIGludCByYXRlX2VtdTsKLSAgICBpbnQgYWNjdXJhdGVfc2VlazsKLSAgICBpbnQgdGhyZWFkX3F1ZXVlX3NpemU7Ci0KLSAgICBTcGVjaWZpZXJPcHQgKnRzX3NjYWxlOwotICAgIGludCAgICAgICAgbmJfdHNfc2NhbGU7Ci0gICAgU3BlY2lmaWVyT3B0ICpkdW1wX2F0dGFjaG1lbnQ7Ci0gICAgaW50ICAgICAgICBuYl9kdW1wX2F0dGFjaG1lbnQ7Ci0gICAgU3BlY2lmaWVyT3B0ICpod2FjY2VsczsKLSAgICBpbnQgICAgICAgIG5iX2h3YWNjZWxzOwotICAgIFNwZWNpZmllck9wdCAqaHdhY2NlbF9kZXZpY2VzOwotICAgIGludCAgICAgICAgbmJfaHdhY2NlbF9kZXZpY2VzOwotICAgIFNwZWNpZmllck9wdCAqYXV0b3JvdGF0ZTsKLSAgICBpbnQgICAgICAgIG5iX2F1dG9yb3RhdGU7Ci0KLSAgICAvKiBvdXRwdXQgb3B0aW9ucyAqLwotICAgIFN0cmVhbU1hcCAqc3RyZWFtX21hcHM7Ci0gICAgaW50ICAgICBuYl9zdHJlYW1fbWFwczsKLSAgICBBdWRpb0NoYW5uZWxNYXAgKmF1ZGlvX2NoYW5uZWxfbWFwczsgLyogb25lIGluZm8gZW50cnkgcGVyIC1tYXBfY2hhbm5lbCAqLwotICAgIGludCAgICAgICAgICAgbmJfYXVkaW9fY2hhbm5lbF9tYXBzOyAvKiBudW1iZXIgb2YgKHZhbGlkKSAtbWFwX2NoYW5uZWwgc2V0dGluZ3MgKi8KLSAgICBpbnQgbWV0YWRhdGFfZ2xvYmFsX21hbnVhbDsKLSAgICBpbnQgbWV0YWRhdGFfc3RyZWFtc19tYW51YWw7Ci0gICAgaW50IG1ldGFkYXRhX2NoYXB0ZXJzX21hbnVhbDsKLSAgICBjb25zdCBjaGFyICoqYXR0YWNobWVudHM7Ci0gICAgaW50ICAgICAgIG5iX2F0dGFjaG1lbnRzOwotCi0gICAgaW50IGNoYXB0ZXJzX2lucHV0X2ZpbGU7Ci0KLSAgICBpbnQ2NF90IHJlY29yZGluZ190aW1lOwotICAgIGludDY0X3Qgc3RvcF90aW1lOwotICAgIHVpbnQ2NF90IGxpbWl0X2ZpbGVzaXplOwotICAgIGZsb2F0IG11eF9wcmVsb2FkOwotICAgIGZsb2F0IG11eF9tYXhfZGVsYXk7Ci0gICAgaW50IHNob3J0ZXN0OwotCi0gICAgaW50IHZpZGVvX2Rpc2FibGU7Ci0gICAgaW50IGF1ZGlvX2Rpc2FibGU7Ci0gICAgaW50IHN1YnRpdGxlX2Rpc2FibGU7Ci0gICAgaW50IGRhdGFfZGlzYWJsZTsKLQotICAgIC8qIGluZGV4ZWQgYnkgb3V0cHV0IGZpbGUgc3RyZWFtIGluZGV4ICovCi0gICAgaW50ICAgKnN0cmVhbWlkX21hcDsKLSAgICBpbnQgbmJfc3RyZWFtaWRfbWFwOwotCi0gICAgU3BlY2lmaWVyT3B0ICptZXRhZGF0YTsKLSAgICBpbnQgICAgICAgIG5iX21ldGFkYXRhOwotICAgIFNwZWNpZmllck9wdCAqbWF4X2ZyYW1lczsKLSAgICBpbnQgICAgICAgIG5iX21heF9mcmFtZXM7Ci0gICAgU3BlY2lmaWVyT3B0ICpiaXRzdHJlYW1fZmlsdGVyczsKLSAgICBpbnQgICAgICAgIG5iX2JpdHN0cmVhbV9maWx0ZXJzOwotICAgIFNwZWNpZmllck9wdCAqY29kZWNfdGFnczsKLSAgICBpbnQgICAgICAgIG5iX2NvZGVjX3RhZ3M7Ci0gICAgU3BlY2lmaWVyT3B0ICpzYW1wbGVfZm10czsKLSAgICBpbnQgICAgICAgIG5iX3NhbXBsZV9mbXRzOwotICAgIFNwZWNpZmllck9wdCAqcXNjYWxlOwotICAgIGludCAgICAgICAgbmJfcXNjYWxlOwotICAgIFNwZWNpZmllck9wdCAqZm9yY2VkX2tleV9mcmFtZXM7Ci0gICAgaW50ICAgICAgICBuYl9mb3JjZWRfa2V5X2ZyYW1lczsKLSAgICBTcGVjaWZpZXJPcHQgKmZvcmNlX2ZwczsKLSAgICBpbnQgICAgICAgIG5iX2ZvcmNlX2ZwczsKLSAgICBTcGVjaWZpZXJPcHQgKmZyYW1lX2FzcGVjdF9yYXRpb3M7Ci0gICAgaW50ICAgICAgICBuYl9mcmFtZV9hc3BlY3RfcmF0aW9zOwotICAgIFNwZWNpZmllck9wdCAqcmNfb3ZlcnJpZGVzOwotICAgIGludCAgICAgICAgbmJfcmNfb3ZlcnJpZGVzOwotICAgIFNwZWNpZmllck9wdCAqaW50cmFfbWF0cmljZXM7Ci0gICAgaW50ICAgICAgICBuYl9pbnRyYV9tYXRyaWNlczsKLSAgICBTcGVjaWZpZXJPcHQgKmludGVyX21hdHJpY2VzOwotICAgIGludCAgICAgICAgbmJfaW50ZXJfbWF0cmljZXM7Ci0gICAgU3BlY2lmaWVyT3B0ICpjaHJvbWFfaW50cmFfbWF0cmljZXM7Ci0gICAgaW50ICAgICAgICBuYl9jaHJvbWFfaW50cmFfbWF0cmljZXM7Ci0gICAgU3BlY2lmaWVyT3B0ICp0b3BfZmllbGRfZmlyc3Q7Ci0gICAgaW50ICAgICAgICBuYl90b3BfZmllbGRfZmlyc3Q7Ci0gICAgU3BlY2lmaWVyT3B0ICptZXRhZGF0YV9tYXA7Ci0gICAgaW50ICAgICAgICBuYl9tZXRhZGF0YV9tYXA7Ci0gICAgU3BlY2lmaWVyT3B0ICpwcmVzZXRzOwotICAgIGludCAgICAgICAgbmJfcHJlc2V0czsKLSAgICBTcGVjaWZpZXJPcHQgKmNvcHlfaW5pdGlhbF9ub25rZXlmcmFtZXM7Ci0gICAgaW50ICAgICAgICBuYl9jb3B5X2luaXRpYWxfbm9ua2V5ZnJhbWVzOwotICAgIFNwZWNpZmllck9wdCAqY29weV9wcmlvcl9zdGFydDsKLSAgICBpbnQgICAgICAgIG5iX2NvcHlfcHJpb3Jfc3RhcnQ7Ci0gICAgU3BlY2lmaWVyT3B0ICpmaWx0ZXJzOwotICAgIGludCAgICAgICAgbmJfZmlsdGVyczsKLSAgICBTcGVjaWZpZXJPcHQgKmZpbHRlcl9zY3JpcHRzOwotICAgIGludCAgICAgICAgbmJfZmlsdGVyX3NjcmlwdHM7Ci0gICAgU3BlY2lmaWVyT3B0ICpyZWluaXRfZmlsdGVyczsKLSAgICBpbnQgICAgICAgIG5iX3JlaW5pdF9maWx0ZXJzOwotICAgIFNwZWNpZmllck9wdCAqZml4X3N1Yl9kdXJhdGlvbjsKLSAgICBpbnQgICAgICAgIG5iX2ZpeF9zdWJfZHVyYXRpb247Ci0gICAgU3BlY2lmaWVyT3B0ICpjYW52YXNfc2l6ZXM7Ci0gICAgaW50ICAgICAgICBuYl9jYW52YXNfc2l6ZXM7Ci0gICAgU3BlY2lmaWVyT3B0ICpwYXNzOwotICAgIGludCAgICAgICAgbmJfcGFzczsKLSAgICBTcGVjaWZpZXJPcHQgKnBhc3Nsb2dmaWxlczsKLSAgICBpbnQgICAgICAgIG5iX3Bhc3Nsb2dmaWxlczsKLSAgICBTcGVjaWZpZXJPcHQgKmd1ZXNzX2xheW91dF9tYXg7Ci0gICAgaW50ICAgICAgICBuYl9ndWVzc19sYXlvdXRfbWF4OwotICAgIFNwZWNpZmllck9wdCAqYXBhZDsKLSAgICBpbnQgICAgICAgIG5iX2FwYWQ7Ci0gICAgU3BlY2lmaWVyT3B0ICpkaXNjYXJkOwotICAgIGludCAgICAgICAgbmJfZGlzY2FyZDsKLSAgICBTcGVjaWZpZXJPcHQgKmRpc3Bvc2l0aW9uOwotICAgIGludCAgICAgICAgbmJfZGlzcG9zaXRpb247Ci0gICAgU3BlY2lmaWVyT3B0ICpwcm9ncmFtOwotICAgIGludCAgICAgICAgbmJfcHJvZ3JhbTsKLX0gT3B0aW9uc0NvbnRleHQ7Ci0KLXR5cGVkZWYgc3RydWN0IElucHV0RmlsdGVyIHsKLSAgICBBVkZpbHRlckNvbnRleHQgICAgKmZpbHRlcjsKLSAgICBzdHJ1Y3QgSW5wdXRTdHJlYW0gKmlzdDsKLSAgICBzdHJ1Y3QgRmlsdGVyR3JhcGggKmdyYXBoOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAqbmFtZTsKLX0gSW5wdXRGaWx0ZXI7Ci0KLXR5cGVkZWYgc3RydWN0IE91dHB1dEZpbHRlciB7Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICAgICAqZmlsdGVyOwotICAgIHN0cnVjdCBPdXRwdXRTdHJlYW0gKm9zdDsKLSAgICBzdHJ1Y3QgRmlsdGVyR3JhcGggICpncmFwaDsKLSAgICB1aW50OF90ICAgICAgICAgICAgICpuYW1lOwotCi0gICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgdW50aWwgc3RyZWFtIG1hcHMgYXJlIHByb2Nlc3NlZCAqLwotICAgIEFWRmlsdGVySW5PdXQgICAgICAgKm91dF90bXA7Ci0gICAgZW51bSBBVk1lZGlhVHlwZSAgICAgdHlwZTsKLX0gT3V0cHV0RmlsdGVyOwotCi10eXBlZGVmIHN0cnVjdCBGaWx0ZXJHcmFwaCB7Ci0gICAgaW50ICAgICAgICAgICAgaW5kZXg7Ci0gICAgY29uc3QgY2hhciAgICAqZ3JhcGhfZGVzYzsKLQotICAgIEFWRmlsdGVyR3JhcGggKmdyYXBoOwotICAgIGludCByZWNvbmZpZ3VyYXRpb247Ci0KLSAgICBJbnB1dEZpbHRlciAgICoqaW5wdXRzOwotICAgIGludCAgICAgICAgICBuYl9pbnB1dHM7Ci0gICAgT3V0cHV0RmlsdGVyICoqb3V0cHV0czsKLSAgICBpbnQgICAgICAgICBuYl9vdXRwdXRzOwotfSBGaWx0ZXJHcmFwaDsKLQotdHlwZWRlZiBzdHJ1Y3QgSW5wdXRTdHJlYW0gewotICAgIGludCBmaWxlX2luZGV4OwotICAgIEFWU3RyZWFtICpzdDsKLSAgICBpbnQgZGlzY2FyZDsgICAgICAgICAgICAgLyogdHJ1ZSBpZiBzdHJlYW0gZGF0YSBzaG91bGQgYmUgZGlzY2FyZGVkICovCi0gICAgaW50IHVzZXJfc2V0X2Rpc2NhcmQ7Ci0gICAgaW50IGRlY29kaW5nX25lZWRlZDsgICAgIC8qIG5vbiB6ZXJvIGlmIHRoZSBwYWNrZXRzIG11c3QgYmUgZGVjb2RlZCBpbiAncmF3X2ZpZm8nLCBzZWUgREVDT0RJTkdfRk9SXyogKi8KLSNkZWZpbmUgREVDT0RJTkdfRk9SX09TVCAgICAxCi0jZGVmaW5lIERFQ09ESU5HX0ZPUl9GSUxURVIgMgotCi0gICAgQVZDb2RlY0NvbnRleHQgKmRlY19jdHg7Ci0gICAgQVZDb2RlYyAqZGVjOwotICAgIEFWRnJhbWUgKmRlY29kZWRfZnJhbWU7Ci0gICAgQVZGcmFtZSAqZmlsdGVyX2ZyYW1lOyAvKiBhIHJlZiBvZiBkZWNvZGVkX2ZyYW1lLCB0byBiZSBzZW50IHRvIGZpbHRlcnMgKi8KLQotICAgIGludDY0X3QgICAgICAgc3RhcnQ7ICAgICAvKiB0aW1lIHdoZW4gcmVhZCBzdGFydGVkICovCi0gICAgLyogcHJlZGljdGVkIGR0cyBvZiB0aGUgbmV4dCBwYWNrZXQgcmVhZCBmb3IgdGhpcyBzdHJlYW0gb3IgKHdoZW4gdGhlcmUgYXJlCi0gICAgICogc2V2ZXJhbCBmcmFtZXMgaW4gYSBwYWNrZXQpIG9mIHRoZSBuZXh0IGZyYW1lIGluIGN1cnJlbnQgcGFja2V0IChpbiBBVl9USU1FX0JBU0UgdW5pdHMpICovCi0gICAgaW50NjRfdCAgICAgICBuZXh0X2R0czsKLSAgICBpbnQ2NF90ICAgICAgIGR0czsgICAgICAgLy8vPCBkdHMgb2YgdGhlIGxhc3QgcGFja2V0IHJlYWQgZm9yIHRoaXMgc3RyZWFtIChpbiBBVl9USU1FX0JBU0UgdW5pdHMpCi0KLSAgICBpbnQ2NF90ICAgICAgIG5leHRfcHRzOyAgLy8vPCBzeW50aGV0aWMgcHRzIGZvciB0aGUgbmV4dCBkZWNvZGUgZnJhbWUgKGluIEFWX1RJTUVfQkFTRSB1bml0cykKLSAgICBpbnQ2NF90ICAgICAgIHB0czsgICAgICAgLy8vPCBjdXJyZW50IHB0cyBvZiB0aGUgZGVjb2RlZCBmcmFtZSAgKGluIEFWX1RJTUVfQkFTRSB1bml0cykKLSAgICBpbnQgICAgICAgICAgIHdyYXBfY29ycmVjdGlvbl9kb25lOwotCi0gICAgaW50NjRfdCBmaWx0ZXJfaW5fcmVzY2FsZV9kZWx0YV9sYXN0OwotCi0gICAgaW50NjRfdCBtaW5fcHRzOyAvKiBwdHMgd2l0aCB0aGUgc21hbGxlc3QgdmFsdWUgaW4gYSBjdXJyZW50IHN0cmVhbSAqLwotICAgIGludDY0X3QgbWF4X3B0czsgLyogcHRzIHdpdGggdGhlIGhpZ2hlciB2YWx1ZSBpbiBhIGN1cnJlbnQgc3RyZWFtICovCi0gICAgaW50NjRfdCBuYl9zYW1wbGVzOyAvKiBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgbGFzdCBkZWNvZGVkIGF1ZGlvIGZyYW1lIGJlZm9yZSBsb29waW5nICovCi0KLSAgICBkb3VibGUgdHNfc2NhbGU7Ci0gICAgaW50IHNhd19maXJzdF90czsKLSAgICBpbnQgc2hvd2VkX211bHRpX3BhY2tldF93YXJuaW5nOwotICAgIEFWRGljdGlvbmFyeSAqZGVjb2Rlcl9vcHRzOwotICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgICAgICAgICAgICAgIC8qIGZyYW1lcmF0ZSBmb3JjZWQgd2l0aCAtciAqLwotICAgIGludCB0b3BfZmllbGRfZmlyc3Q7Ci0gICAgaW50IGd1ZXNzX2xheW91dF9tYXg7Ci0KLSAgICBpbnQgYXV0b3JvdGF0ZTsKLSAgICBpbnQgcmVzYW1wbGVfaGVpZ2h0OwotICAgIGludCByZXNhbXBsZV93aWR0aDsKLSAgICBpbnQgcmVzYW1wbGVfcGl4X2ZtdDsKLQotICAgIGludCAgICAgIHJlc2FtcGxlX3NhbXBsZV9mbXQ7Ci0gICAgaW50ICAgICAgcmVzYW1wbGVfc2FtcGxlX3JhdGU7Ci0gICAgaW50ICAgICAgcmVzYW1wbGVfY2hhbm5lbHM7Ci0gICAgdWludDY0X3QgcmVzYW1wbGVfY2hhbm5lbF9sYXlvdXQ7Ci0KLSAgICBpbnQgZml4X3N1Yl9kdXJhdGlvbjsKLSAgICBzdHJ1Y3QgeyAvKiBwcmV2aW91cyBkZWNvZGVkIHN1YnRpdGxlIGFuZCByZWxhdGVkIHZhcmlhYmxlcyAqLwotICAgICAgICBpbnQgZ290X291dHB1dDsKLSAgICAgICAgaW50IHJldDsKLSAgICAgICAgQVZTdWJ0aXRsZSBzdWJ0aXRsZTsKLSAgICB9IHByZXZfc3ViOwotCi0gICAgc3RydWN0IHN1YjJ2aWRlbyB7Ci0gICAgICAgIGludDY0X3QgbGFzdF9wdHM7Ci0gICAgICAgIGludDY0X3QgZW5kX3B0czsKLSAgICAgICAgQVZGcmFtZSAqZnJhbWU7Ci0gICAgICAgIGludCB3LCBoOwotICAgIH0gc3ViMnZpZGVvOwotCi0gICAgaW50IGRyMTsKLQotICAgIC8qIGRlY29kZWQgZGF0YSBmcm9tIHRoaXMgc3RyZWFtIGdvZXMgaW50byBhbGwgdGhvc2UgZmlsdGVycwotICAgICAqIGN1cnJlbnRseSB2aWRlbyBhbmQgYXVkaW8gb25seSAqLwotICAgIElucHV0RmlsdGVyICoqZmlsdGVyczsKLSAgICBpbnQgICAgICAgIG5iX2ZpbHRlcnM7Ci0KLSAgICBpbnQgcmVpbml0X2ZpbHRlcnM7Ci0KLSAgICAvKiBod2FjY2VsIG9wdGlvbnMgKi8KLSAgICBlbnVtIEhXQWNjZWxJRCBod2FjY2VsX2lkOwotICAgIGNoYXIgICpod2FjY2VsX2RldmljZTsKLQotICAgIC8qIGh3YWNjZWwgY29udGV4dCAqLwotICAgIGVudW0gSFdBY2NlbElEIGFjdGl2ZV9od2FjY2VsX2lkOwotICAgIHZvaWQgICpod2FjY2VsX2N0eDsKLSAgICB2b2lkICgqaHdhY2NlbF91bmluaXQpKEFWQ29kZWNDb250ZXh0ICpzKTsKLSAgICBpbnQgICgqaHdhY2NlbF9nZXRfYnVmZmVyKShBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7Ci0gICAgaW50ICAoKmh3YWNjZWxfcmV0cmlldmVfZGF0YSkoQVZDb2RlY0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKTsKLSAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgaHdhY2NlbF9waXhfZm10OwotICAgIGVudW0gQVZQaXhlbEZvcm1hdCBod2FjY2VsX3JldHJpZXZlZF9waXhfZm10OwotCi0gICAgLyogc3RhdHMgKi8KLSAgICAvLyBjb21iaW5lZCBzaXplIG9mIGFsbCB0aGUgcGFja2V0cyByZWFkCi0gICAgdWludDY0X3QgZGF0YV9zaXplOwotICAgIC8qIG51bWJlciBvZiBwYWNrZXRzIHN1Y2Nlc3NmdWxseSByZWFkIGZvciB0aGlzIHN0cmVhbSAqLwotICAgIHVpbnQ2NF90IG5iX3BhY2tldHM7Ci0gICAgLy8gbnVtYmVyIG9mIGZyYW1lcy9zYW1wbGVzIHJldHJpZXZlZCBmcm9tIHRoZSBkZWNvZGVyCi0gICAgdWludDY0X3QgZnJhbWVzX2RlY29kZWQ7Ci0gICAgdWludDY0X3Qgc2FtcGxlc19kZWNvZGVkOwotfSBJbnB1dFN0cmVhbTsKLQotdHlwZWRlZiBzdHJ1Y3QgSW5wdXRGaWxlIHsKLSAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKLSAgICBpbnQgZW9mX3JlYWNoZWQ7ICAgICAgLyogdHJ1ZSBpZiBlb2YgcmVhY2hlZCAqLwotICAgIGludCBlYWdhaW47ICAgICAgICAgICAvKiB0cnVlIGlmIGxhc3QgcmVhZCBhdHRlbXB0IHJldHVybmVkIEVBR0FJTiAqLwotICAgIGludCBpc3RfaW5kZXg7ICAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBzdHJlYW0gaW4gaW5wdXRfc3RyZWFtcyAqLwotICAgIGludCBsb29wOyAgICAgICAgICAgICAvKiBzZXQgbnVtYmVyIG9mIHRpbWVzIGlucHV0IHN0cmVhbSBzaG91bGQgYmUgbG9vcGVkICovCi0gICAgaW50NjRfdCBkdXJhdGlvbjsgICAgIC8qIGFjdHVhbCBkdXJhdGlvbiBvZiB0aGUgbG9uZ2VzdCBzdHJlYW0gaW4gYSBmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBtb21lbnQgd2hlbiBsb29waW5nIGhhcHBlbnMgKi8KLSAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsgLyogdGltZSBiYXNlIG9mIHRoZSBkdXJhdGlvbiAqLwotICAgIGludDY0X3QgaW5wdXRfdHNfb2Zmc2V0OwotCi0gICAgaW50NjRfdCB0c19vZmZzZXQ7Ci0gICAgaW50NjRfdCBsYXN0X3RzOwotICAgIGludDY0X3Qgc3RhcnRfdGltZTsgICAvKiB1c2VyLXNwZWNpZmllZCBzdGFydCB0aW1lIGluIEFWX1RJTUVfQkFTRSBvciBBVl9OT1BUU19WQUxVRSAqLwotICAgIGludCBzZWVrX3RpbWVzdGFtcDsKLSAgICBpbnQ2NF90IHJlY29yZGluZ190aW1lOwotICAgIGludCBuYl9zdHJlYW1zOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyZWFtIHRoYXQgZmZtcGVnIGlzIGF3YXJlIG9mOyBtYXkgYmUgZGlmZmVyZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gY3R4Lm5iX3N0cmVhbXMgaWYgbmV3IHN0cmVhbXMgYXBwZWFyIGR1cmluZyBhdl9yZWFkX2ZyYW1lKCkgKi8KLSAgICBpbnQgbmJfc3RyZWFtc193YXJuOyAgLyogbnVtYmVyIG9mIHN0cmVhbXMgdGhhdCB0aGUgdXNlciB3YXMgd2FybmVkIG9mICovCi0gICAgaW50IHJhdGVfZW11OwotICAgIGludCBhY2N1cmF0ZV9zZWVrOwotCi0jaWYgSEFWRV9QVEhSRUFEUwotICAgIEFWVGhyZWFkTWVzc2FnZVF1ZXVlICppbl90aHJlYWRfcXVldWU7Ci0gICAgcHRocmVhZF90IHRocmVhZDsgICAgICAgICAgIC8qIHRocmVhZCByZWFkaW5nIGZyb20gdGhpcyBmaWxlICovCi0gICAgaW50IG5vbl9ibG9ja2luZzsgICAgICAgICAgIC8qIHJlYWRpbmcgcGFja2V0cyBmcm9tIHRoZSB0aHJlYWQgc2hvdWxkIG5vdCBibG9jayAqLwotICAgIGludCBqb2luZWQ7ICAgICAgICAgICAgICAgICAvKiB0aGUgdGhyZWFkIGhhcyBiZWVuIGpvaW5lZCAqLwotICAgIGludCB0aHJlYWRfcXVldWVfc2l6ZTsgICAgICAvKiBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZWQgcGFja2V0cyAqLwotI2VuZGlmCi19IElucHV0RmlsZTsKLQotZW51bSBmb3JjZWRfa2V5ZnJhbWVzX2NvbnN0IHsKLSAgICBGS0ZfTiwKLSAgICBGS0ZfTl9GT1JDRUQsCi0gICAgRktGX1BSRVZfRk9SQ0VEX04sCi0gICAgRktGX1BSRVZfRk9SQ0VEX1QsCi0gICAgRktGX1QsCi0gICAgRktGX05CCi19OwotCi0jZGVmaW5lIEFCT1JUX09OX0ZMQUdfRU1QVFlfT1VUUFVUICgxIDw8ICAwKQotCi1leHRlcm4gY29uc3QgY2hhciAqY29uc3QgZm9yY2VkX2tleWZyYW1lc19jb25zdF9uYW1lc1tdOwotCi10eXBlZGVmIGVudW0gewotICAgIEVOQ09ERVJfRklOSVNIRUQgPSAxLAotICAgIE1VWEVSX0ZJTklTSEVEID0gMiwKLX0gT1NURmluaXNoZWQgOwotCi10eXBlZGVmIHN0cnVjdCBPdXRwdXRTdHJlYW0gewotICAgIGludCBmaWxlX2luZGV4OyAgICAgICAgICAvKiBmaWxlIGluZGV4ICovCi0gICAgaW50IGluZGV4OyAgICAgICAgICAgICAgIC8qIHN0cmVhbSBpbmRleCBpbiB0aGUgb3V0cHV0IGZpbGUgKi8KLSAgICBpbnQgc291cmNlX2luZGV4OyAgICAgICAgLyogSW5wdXRTdHJlYW0gaW5kZXggKi8KLSAgICBBVlN0cmVhbSAqc3Q7ICAgICAgICAgICAgLyogc3RyZWFtIGluIHRoZSBvdXRwdXQgZmlsZSAqLwotICAgIGludCBlbmNvZGluZ19uZWVkZWQ7ICAgICAvKiB0cnVlIGlmIGVuY29kaW5nIG5lZWRlZCBmb3IgdGhpcyBzdHJlYW0gKi8KLSAgICBpbnQgZnJhbWVfbnVtYmVyOwotICAgIC8qIGlucHV0IHB0cyBhbmQgY29ycmVzcG9uZGluZyBvdXRwdXQgcHRzCi0gICAgICAgZm9yIEEvViBzeW5jICovCi0gICAgc3RydWN0IElucHV0U3RyZWFtICpzeW5jX2lzdDsgLyogaW5wdXQgc3RyZWFtIHRvIHN5bmMgYWdhaW5zdCAqLwotICAgIGludDY0X3Qgc3luY19vcHRzOyAgICAgICAvKiBvdXRwdXQgZnJhbWUgY291bnRlciwgY291bGQgYmUgY2hhbmdlZCB0byBzb21lIHRydWUgdGltZXN0YW1wICovIC8vIEZJWE1FIGxvb2sgYXQgZnJhbWVfbnVtYmVyCi0gICAgLyogcHRzIG9mIHRoZSBmaXJzdCBmcmFtZSBlbmNvZGVkIGZvciB0aGlzIHN0cmVhbSwgdXNlZCBmb3IgbGltaXRpbmcKLSAgICAgKiByZWNvcmRpbmcgdGltZSAqLwotICAgIGludDY0X3QgZmlyc3RfcHRzOwotICAgIC8qIGR0cyBvZiB0aGUgbGFzdCBwYWNrZXQgc2VudCB0byB0aGUgbXV4ZXIgKi8KLSAgICBpbnQ2NF90IGxhc3RfbXV4X2R0czsKLSAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJpdHN0cmVhbV9maWx0ZXJzOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmNfY3R4OwotICAgIEFWQ29kZWMgKmVuYzsKLSAgICBpbnQ2NF90IG1heF9mcmFtZXM7Ci0gICAgQVZGcmFtZSAqZmlsdGVyZWRfZnJhbWU7Ci0gICAgQVZGcmFtZSAqbGFzdF9mcmFtZTsKLSAgICBpbnQgbGFzdF9kcm9wcGVkOwotICAgIGludCBsYXN0X25iMF9mcmFtZXNbM107Ci0KLSAgICB2b2lkICAqaHdhY2NlbF9jdHg7Ci0KLSAgICAvKiB2aWRlbyBvbmx5ICovCi0gICAgQVZSYXRpb25hbCBmcmFtZV9yYXRlOwotICAgIGludCBpc19jZnI7Ci0gICAgaW50IGZvcmNlX2ZwczsKLSAgICBpbnQgdG9wX2ZpZWxkX2ZpcnN0OwotICAgIGludCByb3RhdGVfb3ZlcnJpZGRlbjsKLQotICAgIEFWUmF0aW9uYWwgZnJhbWVfYXNwZWN0X3JhdGlvOwotCi0gICAgLyogZm9yY2VkIGtleSBmcmFtZXMgKi8KLSAgICBpbnQ2NF90ICpmb3JjZWRfa2ZfcHRzOwotICAgIGludCBmb3JjZWRfa2ZfY291bnQ7Ci0gICAgaW50IGZvcmNlZF9rZl9pbmRleDsKLSAgICBjaGFyICpmb3JjZWRfa2V5ZnJhbWVzOwotICAgIEFWRXhwciAqZm9yY2VkX2tleWZyYW1lc19wZXhwcjsKLSAgICBkb3VibGUgZm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfTkJdOwotCi0gICAgLyogYXVkaW8gb25seSAqLwotICAgIGludCAqYXVkaW9fY2hhbm5lbHNfbWFwOyAgICAgICAgICAgICAvKiBsaXN0IG9mIHRoZSBjaGFubmVscyBpZCB0byBwaWNrIGZyb20gdGhlIHNvdXJjZSBzdHJlYW0gKi8KLSAgICBpbnQgYXVkaW9fY2hhbm5lbHNfbWFwcGVkOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIGluIGF1ZGlvX2NoYW5uZWxzX21hcCAqLwotCi0gICAgY2hhciAqbG9nZmlsZV9wcmVmaXg7Ci0gICAgRklMRSAqbG9nZmlsZTsKLQotICAgIE91dHB1dEZpbHRlciAqZmlsdGVyOwotICAgIGNoYXIgKmF2ZmlsdGVyOwotICAgIGNoYXIgKmZpbHRlcnM7ICAgICAgICAgLy8vPCBmaWx0ZXJncmFwaCBhc3NvY2lhdGVkIHRvIHRoZSAtZmlsdGVyIG9wdGlvbgotICAgIGNoYXIgKmZpbHRlcnNfc2NyaXB0OyAgLy8vPCBmaWx0ZXJncmFwaCBzY3JpcHQgYXNzb2NpYXRlZCB0byB0aGUgLWZpbHRlcl9zY3JpcHQgb3B0aW9uCi0KLSAgICBBVkRpY3Rpb25hcnkgKmVuY29kZXJfb3B0czsKLSAgICBBVkRpY3Rpb25hcnkgKnN3c19kaWN0OwotICAgIEFWRGljdGlvbmFyeSAqc3dyX29wdHM7Ci0gICAgQVZEaWN0aW9uYXJ5ICpyZXNhbXBsZV9vcHRzOwotICAgIGNoYXIgKmFwYWQ7Ci0gICAgT1NURmluaXNoZWQgZmluaXNoZWQ7ICAgICAgICAvKiBubyBtb3JlIHBhY2tldHMgc2hvdWxkIGJlIHdyaXR0ZW4gZm9yIHRoaXMgc3RyZWFtICovCi0gICAgaW50IHVuYXZhaWxhYmxlOyAgICAgICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgdGhlIHN0ZXJhbSBpcyB1bmF2YWlsYWJsZSAocG9zc2libHkgdGVtcG9yYXJpbHkpICovCi0gICAgaW50IHN0cmVhbV9jb3B5OwotICAgIGNvbnN0IGNoYXIgKmF0dGFjaG1lbnRfZmlsZW5hbWU7Ci0gICAgaW50IGNvcHlfaW5pdGlhbF9ub25rZXlmcmFtZXM7Ci0gICAgaW50IGNvcHlfcHJpb3Jfc3RhcnQ7Ci0gICAgY2hhciAqZGlzcG9zaXRpb247Ci0KLSAgICBpbnQga2VlcF9waXhfZm10OwotCi0gICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnBhcnNlcjsKLQotICAgIC8qIHN0YXRzICovCi0gICAgLy8gY29tYmluZWQgc2l6ZSBvZiBhbGwgdGhlIHBhY2tldHMgd3JpdHRlbgotICAgIHVpbnQ2NF90IGRhdGFfc2l6ZTsKLSAgICAvLyBudW1iZXIgb2YgcGFja2V0cyBzZW5kIHRvIHRoZSBtdXhlcgotICAgIHVpbnQ2NF90IHBhY2tldHNfd3JpdHRlbjsKLSAgICAvLyBudW1iZXIgb2YgZnJhbWVzL3NhbXBsZXMgc2VudCB0byB0aGUgZW5jb2RlcgotICAgIHVpbnQ2NF90IGZyYW1lc19lbmNvZGVkOwotICAgIHVpbnQ2NF90IHNhbXBsZXNfZW5jb2RlZDsKLQotICAgIC8qIHBhY2tldCBxdWFsaXR5IGZhY3RvciAqLwotICAgIGludCBxdWFsaXR5OwotCi0gICAgLyogcGFja2V0IHBpY3R1cmUgdHlwZSAqLwotICAgIGludCBwaWN0X3R5cGU7Ci0KLSAgICAvKiBmcmFtZSBlbmNvZGUgc3VtIG9mIHNxdWFyZWQgZXJyb3IgdmFsdWVzICovCi0gICAgaW50NjRfdCBlcnJvcls0XTsKLX0gT3V0cHV0U3RyZWFtOwotCi10eXBlZGVmIHN0cnVjdCBPdXRwdXRGaWxlIHsKLSAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKLSAgICBBVkRpY3Rpb25hcnkgKm9wdHM7Ci0gICAgaW50IG9zdF9pbmRleDsgICAgICAgLyogaW5kZXggb2YgdGhlIGZpcnN0IHN0cmVhbSBpbiBvdXRwdXRfc3RyZWFtcyAqLwotICAgIGludDY0X3QgcmVjb3JkaW5nX3RpbWU7ICAvLy88IGRlc2lyZWQgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgZmlsZSBpbiBtaWNyb3NlY29uZHMgPT0gQVZfVElNRV9CQVNFIHVuaXRzCi0gICAgaW50NjRfdCBzdGFydF90aW1lOyAgICAgIC8vLzwgc3RhcnQgdGltZSBpbiBtaWNyb3NlY29uZHMgPT0gQVZfVElNRV9CQVNFIHVuaXRzCi0gICAgdWludDY0X3QgbGltaXRfZmlsZXNpemU7IC8qIGZpbGVzaXplIGxpbWl0IGV4cHJlc3NlZCBpbiBieXRlcyAqLwotCi0gICAgaW50IHNob3J0ZXN0OwotfSBPdXRwdXRGaWxlOwotCi1leHRlcm4gSW5wdXRTdHJlYW0gKippbnB1dF9zdHJlYW1zOwotZXh0ZXJuIGludCAgICAgICAgbmJfaW5wdXRfc3RyZWFtczsKLWV4dGVybiBJbnB1dEZpbGUgICAqKmlucHV0X2ZpbGVzOwotZXh0ZXJuIGludCAgICAgICAgbmJfaW5wdXRfZmlsZXM7Ci0KLWV4dGVybiBPdXRwdXRTdHJlYW0gKipvdXRwdXRfc3RyZWFtczsKLWV4dGVybiBpbnQgICAgICAgICBuYl9vdXRwdXRfc3RyZWFtczsKLWV4dGVybiBPdXRwdXRGaWxlICAgKipvdXRwdXRfZmlsZXM7Ci1leHRlcm4gaW50ICAgICAgICAgbmJfb3V0cHV0X2ZpbGVzOwotCi1leHRlcm4gRmlsdGVyR3JhcGggKipmaWx0ZXJncmFwaHM7Ci1leHRlcm4gaW50ICAgICAgICBuYl9maWx0ZXJncmFwaHM7Ci0KLWV4dGVybiBjaGFyICp2c3RhdHNfZmlsZW5hbWU7Ci1leHRlcm4gY2hhciAqc2RwX2ZpbGVuYW1lOwotCi1leHRlcm4gZmxvYXQgYXVkaW9fZHJpZnRfdGhyZXNob2xkOwotZXh0ZXJuIGZsb2F0IGR0c19kZWx0YV90aHJlc2hvbGQ7Ci1leHRlcm4gZmxvYXQgZHRzX2Vycm9yX3RocmVzaG9sZDsKLQotZXh0ZXJuIGludCBhdWRpb192b2x1bWU7Ci1leHRlcm4gaW50IGF1ZGlvX3N5bmNfbWV0aG9kOwotZXh0ZXJuIGludCB2aWRlb19zeW5jX21ldGhvZDsKLWV4dGVybiBmbG9hdCBmcmFtZV9kcm9wX3RocmVzaG9sZDsKLWV4dGVybiBpbnQgZG9fYmVuY2htYXJrOwotZXh0ZXJuIGludCBkb19iZW5jaG1hcmtfYWxsOwotZXh0ZXJuIGludCBkb19kZWludGVybGFjZTsKLWV4dGVybiBpbnQgZG9faGV4X2R1bXA7Ci1leHRlcm4gaW50IGRvX3BrdF9kdW1wOwotZXh0ZXJuIGludCBjb3B5X3RzOwotZXh0ZXJuIGludCBzdGFydF9hdF96ZXJvOwotZXh0ZXJuIGludCBjb3B5X3RiOwotZXh0ZXJuIGludCBkZWJ1Z190czsKLWV4dGVybiBpbnQgZXhpdF9vbl9lcnJvcjsKLWV4dGVybiBpbnQgYWJvcnRfb25fZmxhZ3M7Ci1leHRlcm4gaW50IHByaW50X3N0YXRzOwotZXh0ZXJuIGludCBxcF9oaXN0OwotZXh0ZXJuIGludCBzdGRpbl9pbnRlcmFjdGlvbjsKLWV4dGVybiBpbnQgZnJhbWVfYml0c19wZXJfcmF3X3NhbXBsZTsKLWV4dGVybiBBVklPQ29udGV4dCAqcHJvZ3Jlc3NfYXZpbzsKLWV4dGVybiBmbG9hdCBtYXhfZXJyb3JfcmF0ZTsKLWV4dGVybiBpbnQgdmRwYXVfYXBpX3ZlcjsKLWV4dGVybiBjaGFyICp2aWRlb3Rvb2xib3hfcGl4Zm10OwotCi1leHRlcm4gY29uc3QgQVZJT0ludGVycnVwdENCIGludF9jYjsKLQotZXh0ZXJuIGNvbnN0IE9wdGlvbkRlZiBvcHRpb25zW107Ci1leHRlcm4gY29uc3QgSFdBY2NlbCBod2FjY2Vsc1tdOwotCi0KLXZvaWQgdGVybV9pbml0KHZvaWQpOwotdm9pZCB0ZXJtX2V4aXQodm9pZCk7Ci0KLXZvaWQgcmVzZXRfb3B0aW9ucyhPcHRpb25zQ29udGV4dCAqbywgaW50IGlzX2lucHV0KTsKLXZvaWQgc2hvd191c2FnZSh2b2lkKTsKLQotdm9pZCBvcHRfb3V0cHV0X2ZpbGUodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0KLXZvaWQgcmVtb3ZlX2F2b3B0aW9ucyhBVkRpY3Rpb25hcnkgKiphLCBBVkRpY3Rpb25hcnkgKmIpOwotdm9pZCBhc3NlcnRfYXZvcHRpb25zKEFWRGljdGlvbmFyeSAqbSk7Ci0KLWludCBndWVzc19pbnB1dF9jaGFubmVsX2xheW91dChJbnB1dFN0cmVhbSAqaXN0KTsKLQotZW51bSBBVlBpeGVsRm9ybWF0IGNob29zZV9waXhlbF9mbXQoQVZTdHJlYW0gKnN0LCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWQ29kZWMgKmNvZGVjLCBlbnVtIEFWUGl4ZWxGb3JtYXQgdGFyZ2V0KTsKLXZvaWQgY2hvb3NlX3NhbXBsZV9mbXQoQVZTdHJlYW0gKnN0LCBBVkNvZGVjICpjb2RlYyk7Ci0KLWludCBjb25maWd1cmVfZmlsdGVyZ3JhcGgoRmlsdGVyR3JhcGggKmZnKTsKLWludCBjb25maWd1cmVfb3V0cHV0X2ZpbHRlcihGaWx0ZXJHcmFwaCAqZmcsIE91dHB1dEZpbHRlciAqb2ZpbHRlciwgQVZGaWx0ZXJJbk91dCAqb3V0KTsKLWludCBpc3RfaW5fZmlsdGVyZ3JhcGgoRmlsdGVyR3JhcGggKmZnLCBJbnB1dFN0cmVhbSAqaXN0KTsKLUZpbHRlckdyYXBoICppbml0X3NpbXBsZV9maWx0ZXJncmFwaChJbnB1dFN0cmVhbSAqaXN0LCBPdXRwdXRTdHJlYW0gKm9zdCk7Ci1pbnQgaW5pdF9jb21wbGV4X2ZpbHRlcmdyYXBoKEZpbHRlckdyYXBoICpmZyk7Ci0KLWludCBmZm1wZWdfcGFyc2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOwotCi1pbnQgdmRwYXVfaW5pdChBVkNvZGVjQ29udGV4dCAqcyk7Ci1pbnQgZHh2YTJfaW5pdChBVkNvZGVjQ29udGV4dCAqcyk7Ci1pbnQgdmRhX2luaXQoQVZDb2RlY0NvbnRleHQgKnMpOwotaW50IHZpZGVvdG9vbGJveF9pbml0KEFWQ29kZWNDb250ZXh0ICpzKTsKLWludCBxc3ZfaW5pdChBVkNvZGVjQ29udGV4dCAqcyk7Ci1pbnQgcXN2X3RyYW5zY29kZV9pbml0KE91dHB1dFN0cmVhbSAqb3N0KTsKLQotI2VuZGlmIC8qIEZGTVBFR19IICovCmRpZmYgLS1naXQgYS9mZm1wZWdfZHh2YTIuYyBiL2ZmbXBlZ19keHZhMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDViZjg5Li4wMDAwMDAwCi0tLSBhL2ZmbXBlZ19keHZhMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM0ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotI2lmZGVmIF9XSU4zMl9XSU5OVAotI3VuZGVmIF9XSU4zMl9XSU5OVAotI2VuZGlmCi0jZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA2MDAKLSNkZWZpbmUgRFhWQTJBUElfVVNFX0JJVEZJRUxEUwotI2RlZmluZSBDT0JKTUFDUk9TCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPGQzZDkuaD4KLSNpbmNsdWRlIDxkeHZhMmFwaS5oPgotCi0jaW5jbHVkZSAiZmZtcGVnLmgiCi0KLSNpbmNsdWRlICJsaWJhdmNvZGVjL2R4dmEyLmgiCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgotCi0vKiBkZWZpbmUgYWxsIHRoZSBHVUlEcyB1c2VkIGRpcmVjdGx5IGhlcmUsCi0gICB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGluY29uc2lzdGVudCBkeHZhMmFwaS5oIHZlcnNpb25zIGluIG1pbmd3LXc2NCBhbmQgZGlmZmVyZW50IE1TVkMgdmVyc2lvbiAqLwotI2luY2x1ZGUgPGluaXRndWlkLmg+Ci1ERUZJTkVfR1VJRChJSURfSURpcmVjdFhWaWRlb0RlY29kZXJTZXJ2aWNlLCAweGZjNTFhNTUxLDB4ZDVlNywweDExZDksMHhhZiwweDU1LDB4MDAsMHgwNSwweDRlLDB4NDMsMHhmZiwweDAyKTsKLQotREVGSU5FX0dVSUQoRFhWQTJfTW9kZU1QRUcyX1ZMRCwgICAgICAweGVlMjc0MTdmLCAweDVlMjgsMHg0ZTY1LDB4YmUsMHhlYSwweDFkLDB4MjYsMHhiNSwweDA4LDB4YWQsMHhjOSk7Ci1ERUZJTkVfR1VJRChEWFZBMl9Nb2RlTVBFRzJhbmQxX1ZMRCwgIDB4ODY2OTVmMTIsIDB4MzQwZSwweDRmMDQsMHg5ZiwweGQzLDB4OTIsMHg1MywweGRkLDB4MzIsMHg3NCwweDYwKTsKLURFRklORV9HVUlEKERYVkEyX01vZGVIMjY0X0UsICAgICAgICAgMHgxYjgxYmU2OCwgMHhhMGM3LDB4MTFkMywweGI5LDB4ODQsMHgwMCwweGMwLDB4NGYsMHgyZSwweDczLDB4YzUpOwotREVGSU5FX0dVSUQoRFhWQTJfTW9kZUgyNjRfRiwgICAgICAgICAweDFiODFiZTY5LCAweGEwYzcsMHgxMWQzLDB4YjksMHg4NCwweDAwLDB4YzAsMHg0ZiwweDJlLDB4NzMsMHhjNSk7Ci1ERUZJTkVfR1VJRChEWFZBRERJX0ludGVsX01vZGVIMjY0X0UsIDB4NjA0RjhFNjgsIDB4NDk1MSwweDRDNTQsMHg4OCwweEZFLDB4QUIsMHhEMiwweDVDLDB4MTUsMHhCMywweEQ2KTsKLURFRklORV9HVUlEKERYVkEyX01vZGVWQzFfRCwgICAgICAgICAgMHgxYjgxYmVBMywgMHhhMGM3LDB4MTFkMywweGI5LDB4ODQsMHgwMCwweGMwLDB4NGYsMHgyZSwweDczLDB4YzUpOwotREVGSU5FX0dVSUQoRFhWQTJfTW9kZVZDMV9EMjAxMCwgICAgICAweDFiODFiZUE0LCAweGEwYzcsMHgxMWQzLDB4YjksMHg4NCwweDAwLDB4YzAsMHg0ZiwweDJlLDB4NzMsMHhjNSk7Ci1ERUZJTkVfR1VJRChEWFZBMl9Nb2RlSEVWQ19WTERfTWFpbiwgIDB4NWIxMWQ1MWIsIDB4MmY0YywweDQ0NTIsMHhiYywweGMzLDB4MDksMHhmMiwweGExLDB4MTYsMHgwYywweGMwKTsKLURFRklORV9HVUlEKERYVkEyX01vZGVWUDlfVkxEX1Byb2ZpbGUwLCAweDQ2MzcwN2Y4LCAweGExZDAsMHg0NTg1LDB4ODcsMHg2ZCwweDgzLDB4YWEsMHg2ZCwweDYwLDB4YjgsMHg5ZSk7Ci1ERUZJTkVfR1VJRChEWFZBMl9Ob0VuY3J5cHQsICAgICAgICAgIDB4MWI4MWJlRDAsIDB4YTBjNywweDExZDMsMHhiOSwweDg0LDB4MDAsMHhjMCwweDRmLDB4MmUsMHg3MywweGM1KTsKLURFRklORV9HVUlEKEdVSURfTlVMTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCwgMHgwMDAwLDB4MDAwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDApOwotCi10eXBlZGVmIElEaXJlY3QzRDkqIFdJTkFQSSBwRGlyZWN0M0RDcmVhdGU5KFVJTlQpOwotdHlwZWRlZiBIUkVTVUxUIFdJTkFQSSBwQ3JlYXRlRGV2aWNlTWFuYWdlcjkoVUlOVCAqLCBJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOSAqKik7Ci0KLXR5cGVkZWYgc3RydWN0IGR4dmEyX21vZGUgewotICBjb25zdCBHVUlEICAgICAqZ3VpZDsKLSAgZW51bSBBVkNvZGVjSUQgY29kZWM7Ci19IGR4dmEyX21vZGU7Ci0KLXN0YXRpYyBjb25zdCBkeHZhMl9tb2RlIGR4dmEyX21vZGVzW10gPSB7Ci0gICAgLyogTVBFRy0yICovCi0gICAgeyAmRFhWQTJfTW9kZU1QRUcyX1ZMRCwgICAgICBBVl9DT0RFQ19JRF9NUEVHMlZJREVPIH0sCi0gICAgeyAmRFhWQTJfTW9kZU1QRUcyYW5kMV9WTEQsICBBVl9DT0RFQ19JRF9NUEVHMlZJREVPIH0sCi0KLSAgICAvKiBILjI2NCAqLwotICAgIHsgJkRYVkEyX01vZGVIMjY0X0YsICAgICAgICAgQVZfQ09ERUNfSURfSDI2NCB9LAotICAgIHsgJkRYVkEyX01vZGVIMjY0X0UsICAgICAgICAgQVZfQ09ERUNfSURfSDI2NCB9LAotICAgIC8qIEludGVsIHNwZWNpZmljIEguMjY0IG1vZGUgKi8KLSAgICB7ICZEWFZBRERJX0ludGVsX01vZGVIMjY0X0UsIEFWX0NPREVDX0lEX0gyNjQgfSwKLQotICAgIC8qIFZDLTEgLyBXTVYzICovCi0gICAgeyAmRFhWQTJfTW9kZVZDMV9EMjAxMCwgICAgICBBVl9DT0RFQ19JRF9WQzEgIH0sCi0gICAgeyAmRFhWQTJfTW9kZVZDMV9EMjAxMCwgICAgICBBVl9DT0RFQ19JRF9XTVYzIH0sCi0gICAgeyAmRFhWQTJfTW9kZVZDMV9ELCAgICAgICAgICBBVl9DT0RFQ19JRF9WQzEgIH0sCi0gICAgeyAmRFhWQTJfTW9kZVZDMV9ELCAgICAgICAgICBBVl9DT0RFQ19JRF9XTVYzIH0sCi0KLSAgICAvKiBIRVZDL0guMjY1ICovCi0gICAgeyAmRFhWQTJfTW9kZUhFVkNfVkxEX01haW4sICBBVl9DT0RFQ19JRF9IRVZDIH0sCi0KLSAgICAvKiBWUDgvOSAqLwotICAgIHsgJkRYVkEyX01vZGVWUDlfVkxEX1Byb2ZpbGUwLCBBVl9DT0RFQ19JRF9WUDkgfSwKLQotICAgIHsgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgMCB9LAotfTsKLQotdHlwZWRlZiBzdHJ1Y3Qgc3VyZmFjZV9pbmZvIHsKLSAgICBpbnQgdXNlZDsKLSAgICB1aW50NjRfdCBhZ2U7Ci19IHN1cmZhY2VfaW5mbzsKLQotdHlwZWRlZiBzdHJ1Y3QgRFhWQTJDb250ZXh0IHsKLSAgICBITU9EVUxFIGQzZGxpYjsKLSAgICBITU9EVUxFIGR4dmEybGliOwotCi0gICAgSEFORExFICBkZXZpY2VIYW5kbGU7Ci0KLSAgICBJRGlyZWN0M0Q5ICAgICAgICAgICAgICAgICAgKmQzZDk7Ci0gICAgSURpcmVjdDNERGV2aWNlOSAgICAgICAgICAgICpkM2Q5ZGV2aWNlOwotICAgIElEaXJlY3QzRERldmljZU1hbmFnZXI5ICAgICAqZDNkOWRldm1ncjsKLSAgICBJRGlyZWN0WFZpZGVvRGVjb2RlclNlcnZpY2UgKmRlY29kZXJfc2VydmljZTsKLSAgICBJRGlyZWN0WFZpZGVvRGVjb2RlciAgICAgICAgKmRlY29kZXI7Ci0KLSAgICBHVUlEICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9ndWlkOwotICAgIERYVkEyX0NvbmZpZ1BpY3R1cmVEZWNvZGUgICBkZWNvZGVyX2NvbmZpZzsKLQotICAgIExQRElSRUNUM0RTVVJGQUNFOSAgICAgICAgICAqc3VyZmFjZXM7Ci0gICAgc3VyZmFjZV9pbmZvICAgICAgICAgICAgICAgICpzdXJmYWNlX2luZm9zOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBudW1fc3VyZmFjZXM7Ci0gICAgdWludDY0X3QgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfYWdlOwotCi0gICAgQVZGcmFtZSAgICAgICAgICAgICAgICAgICAgICp0bXBfZnJhbWU7Ci19IERYVkEyQ29udGV4dDsKLQotdHlwZWRlZiBzdHJ1Y3QgRFhWQTJTdXJmYWNlV3JhcHBlciB7Ci0gICAgRFhWQTJDb250ZXh0ICAgICAgICAgKmN0eDsKLSAgICBMUERJUkVDVDNEU1VSRkFDRTkgICBzdXJmYWNlOwotICAgIElEaXJlY3RYVmlkZW9EZWNvZGVyICpkZWNvZGVyOwotfSBEWFZBMlN1cmZhY2VXcmFwcGVyOwotCi1zdGF0aWMgdm9pZCBkeHZhMl9kZXN0cm95X2RlY29kZXIoQVZDb2RlY0NvbnRleHQgKnMpCi17Ci0gICAgSW5wdXRTdHJlYW0gICppc3QgPSBzLT5vcGFxdWU7Ci0gICAgRFhWQTJDb250ZXh0ICpjdHggPSBpc3QtPmh3YWNjZWxfY3R4OwotICAgIGludCBpOwotCi0gICAgaWYgKGN0eC0+c3VyZmFjZXMpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX3N1cmZhY2VzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjdHgtPnN1cmZhY2VzW2ldKQotICAgICAgICAgICAgICAgIElEaXJlY3QzRFN1cmZhY2U5X1JlbGVhc2UoY3R4LT5zdXJmYWNlc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXZfZnJlZXAoJmN0eC0+c3VyZmFjZXMpOwotICAgIGF2X2ZyZWVwKCZjdHgtPnN1cmZhY2VfaW5mb3MpOwotICAgIGN0eC0+bnVtX3N1cmZhY2VzID0gMDsKLSAgICBjdHgtPnN1cmZhY2VfYWdlICA9IDA7Ci0KLSAgICBpZiAoY3R4LT5kZWNvZGVyKSB7Ci0gICAgICAgIElEaXJlY3RYVmlkZW9EZWNvZGVyX1JlbGVhc2UoY3R4LT5kZWNvZGVyKTsKLSAgICAgICAgY3R4LT5kZWNvZGVyID0gTlVMTDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGR4dmEyX3VuaW5pdChBVkNvZGVjQ29udGV4dCAqcykKLXsKLSAgICBJbnB1dFN0cmVhbSAgKmlzdCA9IHMtPm9wYXF1ZTsKLSAgICBEWFZBMkNvbnRleHQgKmN0eCA9IGlzdC0+aHdhY2NlbF9jdHg7Ci0KLSAgICBpc3QtPmh3YWNjZWxfdW5pbml0ICAgICAgICA9IE5VTEw7Ci0gICAgaXN0LT5od2FjY2VsX2dldF9idWZmZXIgICAgPSBOVUxMOwotICAgIGlzdC0+aHdhY2NlbF9yZXRyaWV2ZV9kYXRhID0gTlVMTDsKLQotICAgIGlmIChjdHgtPmRlY29kZXIpCi0gICAgICAgIGR4dmEyX2Rlc3Ryb3lfZGVjb2RlcihzKTsKLQotICAgIGlmIChjdHgtPmRlY29kZXJfc2VydmljZSkKLSAgICAgICAgSURpcmVjdFhWaWRlb0RlY29kZXJTZXJ2aWNlX1JlbGVhc2UoY3R4LT5kZWNvZGVyX3NlcnZpY2UpOwotCi0gICAgaWYgKGN0eC0+ZDNkOWRldm1nciAmJiBjdHgtPmRldmljZUhhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICAgICAgSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfQ2xvc2VEZXZpY2VIYW5kbGUoY3R4LT5kM2Q5ZGV2bWdyLCBjdHgtPmRldmljZUhhbmRsZSk7Ci0KLSAgICBpZiAoY3R4LT5kM2Q5ZGV2bWdyKQotICAgICAgICBJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOV9SZWxlYXNlKGN0eC0+ZDNkOWRldm1ncik7Ci0KLSAgICBpZiAoY3R4LT5kM2Q5ZGV2aWNlKQotICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1JlbGVhc2UoY3R4LT5kM2Q5ZGV2aWNlKTsKLQotICAgIGlmIChjdHgtPmQzZDkpCi0gICAgICAgIElEaXJlY3QzRDlfUmVsZWFzZShjdHgtPmQzZDkpOwotCi0gICAgaWYgKGN0eC0+ZDNkbGliKQotICAgICAgICBGcmVlTGlicmFyeShjdHgtPmQzZGxpYik7Ci0KLSAgICBpZiAoY3R4LT5keHZhMmxpYikKLSAgICAgICAgRnJlZUxpYnJhcnkoY3R4LT5keHZhMmxpYik7Ci0KLSAgICBhdl9mcmFtZV9mcmVlKCZjdHgtPnRtcF9mcmFtZSk7Ci0KLSAgICBhdl9mcmVlcCgmaXN0LT5od2FjY2VsX2N0eCk7Ci0gICAgYXZfZnJlZXAoJnMtPmh3YWNjZWxfY29udGV4dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGR4dmEyX3JlbGVhc2VfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKLXsKLSAgICBEWFZBMlN1cmZhY2VXcmFwcGVyICp3ICAgPSBvcGFxdWU7Ci0gICAgRFhWQTJDb250ZXh0ICAgICAgICAqY3R4ID0gdy0+Y3R4OwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX3N1cmZhY2VzOyBpKyspIHsKLSAgICAgICAgaWYgKGN0eC0+c3VyZmFjZXNbaV0gPT0gdy0+c3VyZmFjZSkgewotICAgICAgICAgICAgY3R4LT5zdXJmYWNlX2luZm9zW2ldLnVzZWQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZSh3LT5zdXJmYWNlKTsKLSAgICBJRGlyZWN0WFZpZGVvRGVjb2Rlcl9SZWxlYXNlKHctPmRlY29kZXIpOwotICAgIGF2X2ZyZWUodyk7Ci19Ci0KLXN0YXRpYyBpbnQgZHh2YTJfZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncykKLXsKLSAgICBJbnB1dFN0cmVhbSAgKmlzdCA9IHMtPm9wYXF1ZTsKLSAgICBEWFZBMkNvbnRleHQgKmN0eCA9IGlzdC0+aHdhY2NlbF9jdHg7Ci0gICAgaW50IGksIG9sZF91bnVzZWQgPSAtMTsKLSAgICBMUERJUkVDVDNEU1VSRkFDRTkgc3VyZmFjZTsKLSAgICBEWFZBMlN1cmZhY2VXcmFwcGVyICp3ID0gTlVMTDsKLQotICAgIGF2X2Fzc2VydDAoZnJhbWUtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX0RYVkEyX1ZMRCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5udW1fc3VyZmFjZXM7IGkrKykgewotICAgICAgICBzdXJmYWNlX2luZm8gKmluZm8gPSAmY3R4LT5zdXJmYWNlX2luZm9zW2ldOwotICAgICAgICBpZiAoIWluZm8tPnVzZWQgJiYgKG9sZF91bnVzZWQgPT0gLTEgfHwgaW5mby0+YWdlIDwgY3R4LT5zdXJmYWNlX2luZm9zW29sZF91bnVzZWRdLmFnZSkpCi0gICAgICAgICAgICBvbGRfdW51c2VkID0gaTsKLSAgICB9Ci0gICAgaWYgKG9sZF91bnVzZWQgPT0gLTEpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk5vIGZyZWUgRFhWQTIgc3VyZmFjZSFcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLSAgICBpID0gb2xkX3VudXNlZDsKLQotICAgIHN1cmZhY2UgPSBjdHgtPnN1cmZhY2VzW2ldOwotCi0gICAgdyA9IGF2X21hbGxvY3ooc2l6ZW9mKCp3KSk7Ci0gICAgaWYgKCF3KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZnJhbWUtPmJ1ZlswXSA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QqKXN1cmZhY2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHh2YTJfcmVsZWFzZV9idWZmZXIsIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQlVGRkVSX0ZMQUdfUkVBRE9OTFkpOwotICAgIGlmICghZnJhbWUtPmJ1ZlswXSkgewotICAgICAgICBhdl9mcmVlKHcpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIHctPmN0eCAgICAgPSBjdHg7Ci0gICAgdy0+c3VyZmFjZSA9IHN1cmZhY2U7Ci0gICAgSURpcmVjdDNEU3VyZmFjZTlfQWRkUmVmKHctPnN1cmZhY2UpOwotICAgIHctPmRlY29kZXIgPSBjdHgtPmRlY29kZXI7Ci0gICAgSURpcmVjdFhWaWRlb0RlY29kZXJfQWRkUmVmKHctPmRlY29kZXIpOwotCi0gICAgY3R4LT5zdXJmYWNlX2luZm9zW2ldLnVzZWQgPSAxOwotICAgIGN0eC0+c3VyZmFjZV9pbmZvc1tpXS5hZ2UgID0gY3R4LT5zdXJmYWNlX2FnZSsrOwotCi0gICAgZnJhbWUtPmRhdGFbM10gPSAodWludDhfdCAqKXN1cmZhY2U7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkeHZhMl9yZXRyaWV2ZV9kYXRhKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKLXsKLSAgICBMUERJUkVDVDNEU1VSRkFDRTkgc3VyZmFjZSA9ICAoTFBESVJFQ1QzRFNVUkZBQ0U5KWZyYW1lLT5kYXRhWzNdOwotICAgIElucHV0U3RyZWFtICAgICAgICAqaXN0ID0gcy0+b3BhcXVlOwotICAgIERYVkEyQ29udGV4dCAgICAgICAqY3R4ID0gaXN0LT5od2FjY2VsX2N0eDsKLSAgICBEM0RTVVJGQUNFX0RFU0MgICAgc3VyZmFjZURlc2M7Ci0gICAgRDNETE9DS0VEX1JFQ1QgICAgIExvY2tlZFJlY3Q7Ci0gICAgSFJFU1VMVCAgICAgICAgICAgIGhyOwotICAgIGludCAgICAgICAgICAgICAgICByZXQ7Ci0KLSAgICBJRGlyZWN0M0RTdXJmYWNlOV9HZXREZXNjKHN1cmZhY2UsICZzdXJmYWNlRGVzYyk7Ci0KLSAgICBjdHgtPnRtcF9mcmFtZS0+d2lkdGggID0gZnJhbWUtPndpZHRoOwotICAgIGN0eC0+dG1wX2ZyYW1lLT5oZWlnaHQgPSBmcmFtZS0+aGVpZ2h0OwotICAgIGN0eC0+dG1wX2ZyYW1lLT5mb3JtYXQgPSBBVl9QSVhfRk1UX05WMTI7Ci0KLSAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKGN0eC0+dG1wX2ZyYW1lLCAzMik7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBociA9IElEaXJlY3QzRFN1cmZhY2U5X0xvY2tSZWN0KHN1cmZhY2UsICZMb2NrZWRSZWN0LCBOVUxMLCBEM0RMT0NLX1JFQURPTkxZKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGxvY2sgRFhWQTIgc3VyZmFjZVxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Ci0gICAgfQotCi0gICAgYXZfaW1hZ2VfY29weV9wbGFuZShjdHgtPnRtcF9mcmFtZS0+ZGF0YVswXSwgY3R4LT50bXBfZnJhbWUtPmxpbmVzaXplWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKUxvY2tlZFJlY3QucEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBMb2NrZWRSZWN0LlBpdGNoLCBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQpOwotCi0gICAgYXZfaW1hZ2VfY29weV9wbGFuZShjdHgtPnRtcF9mcmFtZS0+ZGF0YVsxXSwgY3R4LT50bXBfZnJhbWUtPmxpbmVzaXplWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKUxvY2tlZFJlY3QucEJpdHMgKyBMb2NrZWRSZWN0LlBpdGNoICogc3VyZmFjZURlc2MuSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgTG9ja2VkUmVjdC5QaXRjaCwgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0IC8gMik7Ci0KLSAgICBJRGlyZWN0M0RTdXJmYWNlOV9VbmxvY2tSZWN0KHN1cmZhY2UpOwotCi0gICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhjdHgtPnRtcF9mcmFtZSwgZnJhbWUpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7Ci0gICAgYXZfZnJhbWVfbW92ZV9yZWYoZnJhbWUsIGN0eC0+dG1wX2ZyYW1lKTsKLQotICAgIHJldHVybiAwOwotZmFpbDoKLSAgICBhdl9mcmFtZV91bnJlZihjdHgtPnRtcF9mcmFtZSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBkeHZhMl9hbGxvYyhBVkNvZGVjQ29udGV4dCAqcykKLXsKLSAgICBJbnB1dFN0cmVhbSAgKmlzdCA9IHMtPm9wYXF1ZTsKLSAgICBpbnQgbG9nbGV2ZWwgPSAoaXN0LT5od2FjY2VsX2lkID09IEhXQUNDRUxfQVVUTykgPyBBVl9MT0dfVkVSQk9TRSA6IEFWX0xPR19FUlJPUjsKLSAgICBEWFZBMkNvbnRleHQgKmN0eDsKLSAgICBwRGlyZWN0M0RDcmVhdGU5ICAgICAgKmNyZWF0ZUQzRCA9IE5VTEw7Ci0gICAgcENyZWF0ZURldmljZU1hbmFnZXI5ICpjcmVhdGVEZXZpY2VNYW5hZ2VyID0gTlVMTDsKLSAgICBIUkVTVUxUIGhyOwotICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBkM2RwcCA9IHswfTsKLSAgICBEM0RESVNQTEFZTU9ERSAgICAgICAgZDNkZG07Ci0gICAgdW5zaWduZWQgcmVzZXRUb2tlbiA9IDA7Ci0gICAgVUlOVCBhZGFwdGVyID0gRDNEQURBUFRFUl9ERUZBVUxUOwotCi0gICAgY3R4ID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eCkpOwotICAgIGlmICghY3R4KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgY3R4LT5kZXZpY2VIYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKLQotICAgIGlzdC0+aHdhY2NlbF9jdHggICAgICAgICAgID0gY3R4OwotICAgIGlzdC0+aHdhY2NlbF91bmluaXQgICAgICAgID0gZHh2YTJfdW5pbml0OwotICAgIGlzdC0+aHdhY2NlbF9nZXRfYnVmZmVyICAgID0gZHh2YTJfZ2V0X2J1ZmZlcjsKLSAgICBpc3QtPmh3YWNjZWxfcmV0cmlldmVfZGF0YSA9IGR4dmEyX3JldHJpZXZlX2RhdGE7Ci0KLSAgICBjdHgtPmQzZGxpYiA9IExvYWRMaWJyYXJ5KCJkM2Q5LmRsbCIpOwotICAgIGlmICghY3R4LT5kM2RsaWIpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIGxvZ2xldmVsLCAiRmFpbGVkIHRvIGxvYWQgRDNEOSBsaWJyYXJ5XG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBjdHgtPmR4dmEybGliID0gTG9hZExpYnJhcnkoImR4dmEyLmRsbCIpOwotICAgIGlmICghY3R4LT5keHZhMmxpYikgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJGYWlsZWQgdG8gbG9hZCBEWFZBMiBsaWJyYXJ5XG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGNyZWF0ZUQzRCA9IChwRGlyZWN0M0RDcmVhdGU5ICopR2V0UHJvY0FkZHJlc3MoY3R4LT5kM2RsaWIsICJEaXJlY3QzRENyZWF0ZTkiKTsKLSAgICBpZiAoIWNyZWF0ZUQzRCkgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJGYWlsZWQgdG8gbG9jYXRlIERpcmVjdDNEQ3JlYXRlOVxuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0gICAgY3JlYXRlRGV2aWNlTWFuYWdlciA9IChwQ3JlYXRlRGV2aWNlTWFuYWdlcjkgKilHZXRQcm9jQWRkcmVzcyhjdHgtPmR4dmEybGliLCAiRFhWQTJDcmVhdGVEaXJlY3QzRERldmljZU1hbmFnZXI5Iik7Ci0gICAgaWYgKCFjcmVhdGVEZXZpY2VNYW5hZ2VyKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIkZhaWxlZCB0byBsb2NhdGUgRFhWQTJDcmVhdGVEaXJlY3QzRERldmljZU1hbmFnZXI5XG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGN0eC0+ZDNkOSA9IGNyZWF0ZUQzRChEM0RfU0RLX1ZFUlNJT04pOwotICAgIGlmICghY3R4LT5kM2Q5KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEIG9iamVjdFxuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoaXN0LT5od2FjY2VsX2RldmljZSkgewotICAgICAgICBhZGFwdGVyID0gYXRvaShpc3QtPmh3YWNjZWxfZGV2aWNlKTsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiVXNpbmcgSFdBY2NlbCBkZXZpY2UgJWRcbiIsIGFkYXB0ZXIpOwotICAgIH0KLQotICAgIElEaXJlY3QzRDlfR2V0QWRhcHRlckRpc3BsYXlNb2RlKGN0eC0+ZDNkOSwgYWRhcHRlciwgJmQzZGRtKTsKLSAgICBkM2RwcC5XaW5kb3dlZCAgICAgICAgID0gVFJVRTsKLSAgICBkM2RwcC5CYWNrQnVmZmVyV2lkdGggID0gNjQwOwotICAgIGQzZHBwLkJhY2tCdWZmZXJIZWlnaHQgPSA0ODA7Ci0gICAgZDNkcHAuQmFja0J1ZmZlckNvdW50ICA9IDA7Ci0gICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKLSAgICBkM2RwcC5Td2FwRWZmZWN0ICAgICAgID0gRDNEU1dBUEVGRkVDVF9ESVNDQVJEOwotICAgIGQzZHBwLkZsYWdzICAgICAgICAgICAgPSBEM0RQUkVTRU5URkxBR19WSURFTzsKLQotICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoY3R4LT5kM2Q5LCBhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgR2V0RGVza3RvcFdpbmRvdygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcgfCBEM0RDUkVBVEVfTVVMVElUSFJFQURFRCB8IEQzRENSRUFURV9GUFVfUFJFU0VSVkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZDNkcHAsICZjdHgtPmQzZDlkZXZpY2UpOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIkZhaWxlZCB0byBjcmVhdGUgRGlyZWN0M0QgZGV2aWNlXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGhyID0gY3JlYXRlRGV2aWNlTWFuYWdlcigmcmVzZXRUb2tlbiwgJmN0eC0+ZDNkOWRldm1ncik7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIGxvZ2xldmVsLCAiRmFpbGVkIHRvIGNyZWF0ZSBEaXJlY3QzRCBkZXZpY2UgbWFuYWdlclxuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBociA9IElEaXJlY3QzRERldmljZU1hbmFnZXI5X1Jlc2V0RGV2aWNlKGN0eC0+ZDNkOWRldm1nciwgY3R4LT5kM2Q5ZGV2aWNlLCByZXNldFRva2VuKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJGYWlsZWQgdG8gYmluZCBEaXJlY3QzRCBkZXZpY2UgdG8gZGV2aWNlIG1hbmFnZXJcbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaHIgPSBJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOV9PcGVuRGV2aWNlSGFuZGxlKGN0eC0+ZDNkOWRldm1nciwgJmN0eC0+ZGV2aWNlSGFuZGxlKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJGYWlsZWQgdG8gb3BlbiBkZXZpY2UgaGFuZGxlXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGhyID0gSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfR2V0VmlkZW9TZXJ2aWNlKGN0eC0+ZDNkOWRldm1nciwgY3R4LT5kZXZpY2VIYW5kbGUsICZJSURfSURpcmVjdFhWaWRlb0RlY29kZXJTZXJ2aWNlLCAodm9pZCAqKikmY3R4LT5kZWNvZGVyX3NlcnZpY2UpOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdFhWaWRlb0RlY29kZXJTZXJ2aWNlXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGN0eC0+dG1wX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIWN0eC0+dG1wX2ZyYW1lKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBzLT5od2FjY2VsX2NvbnRleHQgPSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgZHh2YV9jb250ZXh0KSk7Ci0gICAgaWYgKCFzLT5od2FjY2VsX2NvbnRleHQpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIHJldHVybiAwOwotZmFpbDoKLSAgICBkeHZhMl91bmluaXQocyk7Ci0gICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLX0KLQotc3RhdGljIGludCBkeHZhMl9nZXRfZGVjb2Rlcl9jb25maWd1cmF0aW9uKEFWQ29kZWNDb250ZXh0ICpzLCBjb25zdCBHVUlEICpkZXZpY2VfZ3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEWFZBMl9WaWRlb0Rlc2MgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhWQTJfQ29uZmlnUGljdHVyZURlY29kZSAqY29uZmlnKQotewotICAgIElucHV0U3RyZWFtICAqaXN0ID0gcy0+b3BhcXVlOwotICAgIGludCBsb2dsZXZlbCA9IChpc3QtPmh3YWNjZWxfaWQgPT0gSFdBQ0NFTF9BVVRPKSA/IEFWX0xPR19WRVJCT1NFIDogQVZfTE9HX0VSUk9SOwotICAgIERYVkEyQ29udGV4dCAqY3R4ID0gaXN0LT5od2FjY2VsX2N0eDsKLSAgICB1bnNpZ25lZCBjZmdfY291bnQgPSAwLCBiZXN0X3Njb3JlID0gMDsKLSAgICBEWFZBMl9Db25maWdQaWN0dXJlRGVjb2RlICpjZmdfbGlzdCA9IE5VTEw7Ci0gICAgRFhWQTJfQ29uZmlnUGljdHVyZURlY29kZSBiZXN0X2NmZyA9IHt7MH19OwotICAgIEhSRVNVTFQgaHI7Ci0gICAgaW50IGk7Ci0KLSAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZV9HZXREZWNvZGVyQ29uZmlndXJhdGlvbnMoY3R4LT5kZWNvZGVyX3NlcnZpY2UsIGRldmljZV9ndWlkLCBkZXNjLCBOVUxMLCAmY2ZnX2NvdW50LCAmY2ZnX2xpc3QpOwotICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIlVuYWJsZSB0byByZXRyaWV2ZSBkZWNvZGVyIGNvbmZpZ3VyYXRpb25zXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY2ZnX2NvdW50OyBpKyspIHsKLSAgICAgICAgRFhWQTJfQ29uZmlnUGljdHVyZURlY29kZSAqY2ZnID0gJmNmZ19saXN0W2ldOwotCi0gICAgICAgIHVuc2lnbmVkIHNjb3JlOwotICAgICAgICBpZiAoY2ZnLT5Db25maWdCaXRzdHJlYW1SYXcgPT0gMSkKLSAgICAgICAgICAgIHNjb3JlID0gMTsKLSAgICAgICAgZWxzZSBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJiBjZmctPkNvbmZpZ0JpdHN0cmVhbVJhdyA9PSAyKQotICAgICAgICAgICAgc2NvcmUgPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKElzRXF1YWxHVUlEKCZjZmctPmd1aWRDb25maWdCaXRzdHJlYW1FbmNyeXB0aW9uLCAmRFhWQTJfTm9FbmNyeXB0KSkKLSAgICAgICAgICAgIHNjb3JlICs9IDE2OwotICAgICAgICBpZiAoc2NvcmUgPiBiZXN0X3Njb3JlKSB7Ci0gICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICBiZXN0X2NmZyAgID0gKmNmZzsKLSAgICAgICAgfQotICAgIH0KLSAgICBDb1Rhc2tNZW1GcmVlKGNmZ19saXN0KTsKLQotICAgIGlmICghYmVzdF9zY29yZSkgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJObyB2YWxpZCBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICAqY29uZmlnID0gYmVzdF9jZmc7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHh2YTJfY3JlYXRlX2RlY29kZXIoQVZDb2RlY0NvbnRleHQgKnMpCi17Ci0gICAgSW5wdXRTdHJlYW0gICppc3QgPSBzLT5vcGFxdWU7Ci0gICAgaW50IGxvZ2xldmVsID0gKGlzdC0+aHdhY2NlbF9pZCA9PSBIV0FDQ0VMX0FVVE8pID8gQVZfTE9HX1ZFUkJPU0UgOiBBVl9MT0dfRVJST1I7Ci0gICAgRFhWQTJDb250ZXh0ICpjdHggPSBpc3QtPmh3YWNjZWxfY3R4OwotICAgIHN0cnVjdCBkeHZhX2NvbnRleHQgKmR4dmFfY3R4ID0gcy0+aHdhY2NlbF9jb250ZXh0OwotICAgIEdVSUQgKmd1aWRfbGlzdCA9IE5VTEw7Ci0gICAgdW5zaWduZWQgZ3VpZF9jb3VudCA9IDAsIGksIGo7Ci0gICAgR1VJRCBkZXZpY2VfZ3VpZCA9IEdVSURfTlVMTDsKLSAgICBEM0RGT1JNQVQgdGFyZ2V0X2Zvcm1hdCA9IDA7Ci0gICAgRFhWQTJfVmlkZW9EZXNjIGRlc2MgPSB7IDAgfTsKLSAgICBEWFZBMl9Db25maWdQaWN0dXJlRGVjb2RlIGNvbmZpZzsKLSAgICBIUkVTVUxUIGhyOwotICAgIGludCBzdXJmYWNlX2FsaWdubWVudDsKLSAgICBpbnQgcmV0OwotCi0gICAgaHIgPSBJRGlyZWN0WFZpZGVvRGVjb2RlclNlcnZpY2VfR2V0RGVjb2RlckRldmljZUd1aWRzKGN0eC0+ZGVjb2Rlcl9zZXJ2aWNlLCAmZ3VpZF9jb3VudCwgJmd1aWRfbGlzdCk7Ci0gICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIGxvZ2xldmVsLCAiRmFpbGVkIHRvIHJldHJpZXZlIGRlY29kZXIgZGV2aWNlIEdVSURzXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGR4dmEyX21vZGVzW2ldLmd1aWQ7IGkrKykgewotICAgICAgICBEM0RGT1JNQVQgKnRhcmdldF9saXN0ID0gTlVMTDsKLSAgICAgICAgdW5zaWduZWQgdGFyZ2V0X2NvdW50ID0gMDsKLSAgICAgICAgY29uc3QgZHh2YTJfbW9kZSAqbW9kZSA9ICZkeHZhMl9tb2Rlc1tpXTsKLSAgICAgICAgaWYgKG1vZGUtPmNvZGVjICE9IHMtPmNvZGVjX2lkKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGd1aWRfY291bnQ7IGorKykgewotICAgICAgICAgICAgaWYgKElzRXF1YWxHVUlEKG1vZGUtPmd1aWQsICZndWlkX2xpc3Rbal0pKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChqID09IGd1aWRfY291bnQpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZV9HZXREZWNvZGVyUmVuZGVyVGFyZ2V0cyhjdHgtPmRlY29kZXJfc2VydmljZSwgbW9kZS0+Z3VpZCwgJnRhcmdldF9jb3VudCwgJnRhcmdldF9saXN0KTsKLSAgICAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB0YXJnZXRfY291bnQ7IGorKykgewotICAgICAgICAgICAgY29uc3QgRDNERk9STUFUIGZvcm1hdCA9IHRhcmdldF9saXN0W2pdOwotICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBNS1RBRygnTicsJ1YnLCcxJywnMicpKSB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0X2Zvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBDb1Rhc2tNZW1GcmVlKHRhcmdldF9saXN0KTsKLSAgICAgICAgaWYgKHRhcmdldF9mb3JtYXQpIHsKLSAgICAgICAgICAgIGRldmljZV9ndWlkID0gKm1vZGUtPmd1aWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBDb1Rhc2tNZW1GcmVlKGd1aWRfbGlzdCk7Ci0KLSAgICBpZiAoSXNFcXVhbEdVSUQoJmRldmljZV9ndWlkLCAmR1VJRF9OVUxMKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJObyBkZWNvZGVyIGRldmljZSBmb3IgY29kZWMgZm91bmRcbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgZGVzYy5TYW1wbGVXaWR0aCAgPSBzLT5jb2RlZF93aWR0aDsKLSAgICBkZXNjLlNhbXBsZUhlaWdodCA9IHMtPmNvZGVkX2hlaWdodDsKLSAgICBkZXNjLkZvcm1hdCAgICAgICA9IHRhcmdldF9mb3JtYXQ7Ci0KLSAgICByZXQgPSBkeHZhMl9nZXRfZGVjb2Rlcl9jb25maWd1cmF0aW9uKHMsICZkZXZpY2VfZ3VpZCwgJmRlc2MsICZjb25maWcpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvKiBkZWNvZGluZyBNUEVHLTIgcmVxdWlyZXMgYWRkaXRpb25hbCBhbGlnbm1lbnQgb24gc29tZSBJbnRlbCBHUFVzLAotICAgICAgIGJ1dCBpdCBjYXVzZXMgaXNzdWVzIGZvciBILjI2NCBvbiBjZXJ0YWluIEFNRCBHUFVzLi4uLi4gKi8KLSAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykKLSAgICAgICAgc3VyZmFjZV9hbGlnbm1lbnQgPSAzMjsKLSAgICAvKiB0aGUgSEVWQyBEWFZBMiBzcGVjIGFza3MgZm9yIDEyOCBwaXhlbCBhbGlnbmVkIHN1cmZhY2VzIHRvIGVuc3VyZQotICAgICAgIGFsbCBjb2RpbmcgZmVhdHVyZXMgaGF2ZSBlbm91Z2ggcm9vbSB0byB3b3JrIHdpdGggKi8KLSAgICBlbHNlIGlmICAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQykKLSAgICAgICAgc3VyZmFjZV9hbGlnbm1lbnQgPSAxMjg7Ci0gICAgZWxzZQotICAgICAgICBzdXJmYWNlX2FsaWdubWVudCA9IDE2OwotCi0gICAgLyogNCBiYXNlIHdvcmsgc3VyZmFjZXMgKi8KLSAgICBjdHgtPm51bV9zdXJmYWNlcyA9IDQ7Ci0KLSAgICAvKiBhZGQgc3VyZmFjZXMgYmFzZWQgb24gbnVtYmVyIG9mIHBvc3NpYmxlIHJlZnMgKi8KLSAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDKQotICAgICAgICBjdHgtPm51bV9zdXJmYWNlcyArPSAxNjsKLSAgICBlbHNlIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpCi0gICAgICAgIGN0eC0+bnVtX3N1cmZhY2VzICs9IDg7Ci0gICAgZWxzZQotICAgICAgICBjdHgtPm51bV9zdXJmYWNlcyArPSAyOwotCi0gICAgLyogYWRkIGV4dHJhIHN1cmZhY2VzIGZvciBmcmFtZSB0aHJlYWRpbmcgKi8KLSAgICBpZiAocy0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKQotICAgICAgICBjdHgtPm51bV9zdXJmYWNlcyArPSBzLT50aHJlYWRfY291bnQ7Ci0KLSAgICBjdHgtPnN1cmZhY2VzICAgICAgPSBhdl9tYWxsb2N6KGN0eC0+bnVtX3N1cmZhY2VzICogc2l6ZW9mKCpjdHgtPnN1cmZhY2VzKSk7Ci0gICAgY3R4LT5zdXJmYWNlX2luZm9zID0gYXZfbWFsbG9jeihjdHgtPm51bV9zdXJmYWNlcyAqIHNpemVvZigqY3R4LT5zdXJmYWNlX2luZm9zKSk7Ci0KLSAgICBpZiAoIWN0eC0+c3VyZmFjZXMgfHwgIWN0eC0+c3VyZmFjZV9pbmZvcykgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJVbmFibGUgdG8gYWxsb2NhdGUgc3VyZmFjZSBhcnJheXNcbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaHIgPSBJRGlyZWN0WFZpZGVvRGVjb2RlclNlcnZpY2VfQ3JlYXRlU3VyZmFjZShjdHgtPmRlY29kZXJfc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQUxJR04ocy0+Y29kZWRfd2lkdGgsIHN1cmZhY2VfYWxpZ25tZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQUxJR04ocy0+Y29kZWRfaGVpZ2h0LCBzdXJmYWNlX2FsaWdubWVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm51bV9zdXJmYWNlcyAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZm9ybWF0LCBEM0RQT09MX0RFRkFVTFQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9WaWRlb0RlY29kZXJSZW5kZXJUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnN1cmZhY2VzLCBOVUxMKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJGYWlsZWQgdG8gY3JlYXRlICVkIHZpZGVvIHN1cmZhY2VzXG4iLCBjdHgtPm51bV9zdXJmYWNlcyk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZV9DcmVhdGVWaWRlb0RlY29kZXIoY3R4LT5kZWNvZGVyX3NlcnZpY2UsICZkZXZpY2VfZ3VpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MsICZjb25maWcsIGN0eC0+c3VyZmFjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bnVtX3N1cmZhY2VzLCAmY3R4LT5kZWNvZGVyKTsKLSAgICBpZiAoRkFJTEVEKGhyKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJGYWlsZWQgdG8gY3JlYXRlIERYVkEyIHZpZGVvIGRlY29kZXJcbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgY3R4LT5kZWNvZGVyX2d1aWQgICA9IGRldmljZV9ndWlkOwotICAgIGN0eC0+ZGVjb2Rlcl9jb25maWcgPSBjb25maWc7Ci0KLSAgICBkeHZhX2N0eC0+Y2ZnICAgICAgICAgICA9ICZjdHgtPmRlY29kZXJfY29uZmlnOwotICAgIGR4dmFfY3R4LT5kZWNvZGVyICAgICAgID0gY3R4LT5kZWNvZGVyOwotICAgIGR4dmFfY3R4LT5zdXJmYWNlICAgICAgID0gY3R4LT5zdXJmYWNlczsKLSAgICBkeHZhX2N0eC0+c3VyZmFjZV9jb3VudCA9IGN0eC0+bnVtX3N1cmZhY2VzOwotCi0gICAgaWYgKElzRXF1YWxHVUlEKCZjdHgtPmRlY29kZXJfZ3VpZCwgJkRYVkFERElfSW50ZWxfTW9kZUgyNjRfRSkpCi0gICAgICAgIGR4dmFfY3R4LT53b3JrYXJvdW5kIHw9IEZGX0RYVkEyX1dPUktBUk9VTkRfSU5URUxfQ0xFQVJWSURFTzsKLQotICAgIHJldHVybiAwOwotZmFpbDoKLSAgICBkeHZhMl9kZXN0cm95X2RlY29kZXIocyk7Ci0gICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLX0KLQotaW50IGR4dmEyX2luaXQoQVZDb2RlY0NvbnRleHQgKnMpCi17Ci0gICAgSW5wdXRTdHJlYW0gKmlzdCA9IHMtPm9wYXF1ZTsKLSAgICBpbnQgbG9nbGV2ZWwgPSAoaXN0LT5od2FjY2VsX2lkID09IEhXQUNDRUxfQVVUTykgPyBBVl9MT0dfVkVSQk9TRSA6IEFWX0xPR19FUlJPUjsKLSAgICBEWFZBMkNvbnRleHQgKmN0eDsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKCFpc3QtPmh3YWNjZWxfY3R4KSB7Ci0gICAgICAgIHJldCA9IGR4dmEyX2FsbG9jKHMpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGN0eCA9IGlzdC0+aHdhY2NlbF9jdHg7Ci0KLSAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJgotICAgICAgICAocy0+cHJvZmlsZSAmIH5GRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORUQpID4gRkZfUFJPRklMRV9IMjY0X0hJR0gpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIGxvZ2xldmVsLCAiVW5zdXBwb3J0ZWQgSC4yNjQgcHJvZmlsZSBmb3IgRFhWQTIgSFdBY2NlbDogJWRcbiIsIHMtPnByb2ZpbGUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLQotICAgIGlmIChjdHgtPmRlY29kZXIpCi0gICAgICAgIGR4dmEyX2Rlc3Ryb3lfZGVjb2RlcihzKTsKLQotICAgIHJldCA9IGR4dmEyX2NyZWF0ZV9kZWNvZGVyKHMpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIkVycm9yIGNyZWF0aW5nIHRoZSBEWFZBMiBkZWNvZGVyXG4iKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2ZmbXBlZ19maWx0ZXIuYyBiL2ZmbXBlZ19maWx0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5NmE3OC4uMDAwMDAwMAotLS0gYS9mZm1wZWdfZmlsdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDgxICswLDAgQEAKLS8qCi0gKiBmZm1wZWcgZmlsdGVyIGNvbmZpZ3VyYXRpb24KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiZmZtcGVnLmgiCi0KLSNpbmNsdWRlICJsaWJhdmZpbHRlci9hdmZpbHRlci5oIgotI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2J1ZmZlcnNpbmsuaCIKLQotI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS5oIgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9kaXNwbGF5LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKLQotCi1zdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpnZXRfY29tcGxpYW5jZV91bm9mZmljaWFsX3BpeF9mbXRzKGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkLCBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZGVmYXVsdF9mb3JtYXRzW10pCi17Ci0gICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBtanBlZ19mb3JtYXRzW10gPQotICAgICAgICB7IEFWX1BJWF9GTVRfWVVWSjQyMFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCi0gICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgQVZfUElYX0ZNVF9ZVVY0NDRQLAotICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9OwotICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbGpwZWdfZm9ybWF0c1tdID0KLSAgICAgICAgeyBBVl9QSVhfRk1UX0JHUjI0ICAgLCBBVl9QSVhfRk1UX0JHUkEgICAgLCBBVl9QSVhfRk1UX0JHUjAsCi0gICAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKLSAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAgLCBBVl9QSVhfRk1UX1lVVjQ0NFAgLCBBVl9QSVhfRk1UX1lVVjQyMlAsCi0gICAgICAgICAgQVZfUElYX0ZNVF9OT05FfTsKLQotICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykgewotICAgICAgICByZXR1cm4gbWpwZWdfZm9ybWF0czsKLSAgICB9IGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0xKUEVHKSB7Ci0gICAgICAgIHJldHVybiBsanBlZ19mb3JtYXRzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0X2Zvcm1hdHM7Ci0gICAgfQotfQotCi1lbnVtIEFWUGl4ZWxGb3JtYXQgY2hvb3NlX3BpeGVsX2ZtdChBVlN0cmVhbSAqc3QsIEFWQ29kZWNDb250ZXh0ICplbmNfY3R4LCBBVkNvZGVjICpjb2RlYywgZW51bSBBVlBpeGVsRm9ybWF0IHRhcmdldCkKLXsKLSAgICBpZiAoY29kZWMgJiYgY29kZWMtPnBpeF9mbXRzKSB7Ci0gICAgICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcCA9IGNvZGVjLT5waXhfZm10czsKLSAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldCh0YXJnZXQpOwotICAgICAgICBpbnQgaGFzX2FscGhhID0gZGVzYyA/IGRlc2MtPm5iX2NvbXBvbmVudHMgJSAyID09IDAgOiAwOwotICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgYmVzdD0gQVZfUElYX0ZNVF9OT05FOwotCi0gICAgICAgIGlmIChlbmNfY3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPD0gRkZfQ09NUExJQU5DRV9VTk9GRklDSUFMKSB7Ci0gICAgICAgICAgICBwID0gZ2V0X2NvbXBsaWFuY2VfdW5vZmZpY2lhbF9waXhfZm10cyhlbmNfY3R4LT5jb2RlY19pZCwgcCk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yICg7ICpwICE9IEFWX1BJWF9GTVRfTk9ORTsgcCsrKSB7Ci0gICAgICAgICAgICBiZXN0PSBhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10X29mXzIoYmVzdCwgKnAsIHRhcmdldCwgaGFzX2FscGhhLCBOVUxMKTsKLSAgICAgICAgICAgIGlmICgqcCA9PSB0YXJnZXQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCpwID09IEFWX1BJWF9GTVRfTk9ORSkgewotICAgICAgICAgICAgaWYgKHRhcmdldCAhPSBBVl9QSVhfRk1UX05PTkUpCi0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAiSW5jb21wYXRpYmxlIHBpeGVsIGZvcm1hdCAnJXMnIGZvciBjb2RlYyAnJXMnLCBhdXRvLXNlbGVjdGluZyBmb3JtYXQgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZSh0YXJnZXQpLAotICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShiZXN0KSk7Ci0gICAgICAgICAgICByZXR1cm4gYmVzdDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdGFyZ2V0OwotfQotCi12b2lkIGNob29zZV9zYW1wbGVfZm10KEFWU3RyZWFtICpzdCwgQVZDb2RlYyAqY29kZWMpCi17Ci0gICAgaWYgKGNvZGVjICYmIGNvZGVjLT5zYW1wbGVfZm10cykgewotICAgICAgICBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0ICpwID0gY29kZWMtPnNhbXBsZV9mbXRzOwotICAgICAgICBmb3IgKDsgKnAgIT0gLTE7IHArKykgewotICAgICAgICAgICAgaWYgKCpwID09IHN0LT5jb2RlYy0+c2FtcGxlX2ZtdCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoKnAgPT0gLTEpIHsKLSAgICAgICAgICAgIGlmKChjb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0xPU1NMRVNTKSAmJiBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHN0LT5jb2RlYy0+c2FtcGxlX2ZtdCkgPiBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGNvZGVjLT5zYW1wbGVfZm10c1swXSkpCi0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvbnZlcnNpb24gd2lsbCBub3QgYmUgbG9zc2xlc3MuXG4iKTsKLSAgICAgICAgICAgIGlmKGF2X2dldF9zYW1wbGVfZm10X25hbWUoc3QtPmNvZGVjLT5zYW1wbGVfZm10KSkKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAiSW5jb21wYXRpYmxlIHNhbXBsZSBmb3JtYXQgJyVzJyBmb3IgY29kZWMgJyVzJywgYXV0by1zZWxlY3RpbmcgZm9ybWF0ICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShzdC0+Y29kZWMtPnNhbXBsZV9mbXQpLAotICAgICAgICAgICAgICAgICAgIGNvZGVjLT5uYW1lLAotICAgICAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoY29kZWMtPnNhbXBsZV9mbXRzWzBdKSk7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9mbXQgPSBjb2RlYy0+c2FtcGxlX2ZtdHNbMF07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBjaGFyICpjaG9vc2VfcGl4X2ZtdHMoT3V0cHV0U3RyZWFtICpvc3QpCi17Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKnN0cmljdF9kaWN0ID0gYXZfZGljdF9nZXQob3N0LT5lbmNvZGVyX29wdHMsICJzdHJpY3QiLCBOVUxMLCAwKTsKLSAgICBpZiAoc3RyaWN0X2RpY3QpCi0gICAgICAgIC8vIHVzZWQgYnkgY2hvb3NlX3BpeGVsX2ZtdCgpIGFuZCBiZWxvdwotICAgICAgICBhdl9vcHRfc2V0KG9zdC0+ZW5jX2N0eCwgInN0cmljdCIsIHN0cmljdF9kaWN0LT52YWx1ZSwgMCk7Ci0KLSAgICAgaWYgKG9zdC0+a2VlcF9waXhfZm10KSB7Ci0gICAgICAgIGlmIChvc3QtPmZpbHRlcikKLSAgICAgICAgICAgIGF2ZmlsdGVyX2dyYXBoX3NldF9hdXRvX2NvbnZlcnQob3N0LT5maWx0ZXItPmdyYXBoLT5ncmFwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGSUxURVJfQVVUT19DT05WRVJUX05PTkUpOwotICAgICAgICBpZiAob3N0LT5lbmNfY3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICByZXR1cm4gYXZfc3RyZHVwKGF2X2dldF9waXhfZm10X25hbWUob3N0LT5lbmNfY3R4LT5waXhfZm10KSk7Ci0gICAgfQotICAgIGlmIChvc3QtPmVuY19jdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FKSB7Ci0gICAgICAgIHJldHVybiBhdl9zdHJkdXAoYXZfZ2V0X3BpeF9mbXRfbmFtZShjaG9vc2VfcGl4ZWxfZm10KG9zdC0+c3QsIG9zdC0+ZW5jX2N0eCwgb3N0LT5lbmMsIG9zdC0+ZW5jX2N0eC0+cGl4X2ZtdCkpKTsKLSAgICB9IGVsc2UgaWYgKG9zdC0+ZW5jICYmIG9zdC0+ZW5jLT5waXhfZm10cykgewotICAgICAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnA7Ci0gICAgICAgIEFWSU9Db250ZXh0ICpzID0gTlVMTDsKLSAgICAgICAgdWludDhfdCAqcmV0OwotICAgICAgICBpbnQgbGVuOwotCi0gICAgICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcykgPCAwKQotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotCi0gICAgICAgIHAgPSBvc3QtPmVuYy0+cGl4X2ZtdHM7Ci0gICAgICAgIGlmIChvc3QtPmVuY19jdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8PSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKLSAgICAgICAgICAgIHAgPSBnZXRfY29tcGxpYW5jZV91bm9mZmljaWFsX3BpeF9mbXRzKG9zdC0+ZW5jX2N0eC0+Y29kZWNfaWQsIHApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICg7ICpwICE9IEFWX1BJWF9GTVRfTk9ORTsgcCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gYXZfZ2V0X3BpeF9mbXRfbmFtZSgqcCk7Ci0gICAgICAgICAgICBhdmlvX3ByaW50ZihzLCAiJXN8IiwgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuID0gYXZpb19jbG9zZV9keW5fYnVmKHMsICZyZXQpOwotICAgICAgICByZXRbbGVuIC0gMV0gPSAwOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0gZWxzZQotICAgICAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogRGVmaW5lIGEgZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaXN0IG9mCi0gKiBhbGxvd2VkIGZvcm1hdHMuICovCi0jZGVmaW5lIERFRl9DSE9PU0VfRk9STUFUKHR5cGUsIHZhciwgc3VwcG9ydGVkX2xpc3QsIG5vbmUsIGdldF9uYW1lKSAgICAgICAgICAgXAotc3RhdGljIGNoYXIgKmNob29zZV8gIyMgdmFyICMjIHMoT3V0cHV0U3RyZWFtICpvc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKG9zdC0+ZW5jX2N0eC0+dmFyICE9IG5vbmUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBnZXRfbmFtZShvc3QtPmVuY19jdHgtPnZhcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIGF2X3N0cmR1cChuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIGlmIChvc3QtPmVuYyAmJiBvc3QtPmVuYy0+c3VwcG9ydGVkX2xpc3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjb25zdCB0eXBlICpwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQVZJT0NvbnRleHQgKnMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVpbnQ4X3QgKnJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcykgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZm9yIChwID0gb3N0LT5lbmMtPnN1cHBvcnRlZF9saXN0OyAqcCAhPSBub25lOyBwKyspIHsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBnZXRfbmFtZSgqcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXZpb19wcmludGYocywgIiVzfCIsIG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihzLCAmcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXRbbGVuIC0gMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gREVGX0NIT09TRV9GT1JNQVQoZW51bSBBVlBpeGVsRm9ybWF0LCBwaXhfZm10LCBwaXhfZm10cywgQVZfUElYX0ZNVF9OT05FLAotLy8gICAgICAgICAgICAgICAgICAgR0VUX1BJWF9GTVRfTkFNRSkKLQotREVGX0NIT09TRV9GT1JNQVQoZW51bSBBVlNhbXBsZUZvcm1hdCwgc2FtcGxlX2ZtdCwgc2FtcGxlX2ZtdHMsCi0gICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUsIEdFVF9TQU1QTEVfRk1UX05BTUUpCi0KLURFRl9DSE9PU0VfRk9STUFUKGludCwgc2FtcGxlX3JhdGUsIHN1cHBvcnRlZF9zYW1wbGVyYXRlcywgMCwKLSAgICAgICAgICAgICAgICAgIEdFVF9TQU1QTEVfUkFURV9OQU1FKQotCi1ERUZfQ0hPT1NFX0ZPUk1BVCh1aW50NjRfdCwgY2hhbm5lbF9sYXlvdXQsIGNoYW5uZWxfbGF5b3V0cywgMCwKLSAgICAgICAgICAgICAgICAgIEdFVF9DSF9MQVlPVVRfTkFNRSkKLQotRmlsdGVyR3JhcGggKmluaXRfc2ltcGxlX2ZpbHRlcmdyYXBoKElucHV0U3RyZWFtICppc3QsIE91dHB1dFN0cmVhbSAqb3N0KQotewotICAgIEZpbHRlckdyYXBoICpmZyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmZykpOwotCi0gICAgaWYgKCFmZykKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIGZnLT5pbmRleCA9IG5iX2ZpbHRlcmdyYXBoczsKLQotICAgIEdST1dfQVJSQVkoZmctPm91dHB1dHMsIGZnLT5uYl9vdXRwdXRzKTsKLSAgICBpZiAoIShmZy0+b3V0cHV0c1swXSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmZy0+b3V0cHV0c1swXSkpKSkKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIGZnLT5vdXRwdXRzWzBdLT5vc3QgICA9IG9zdDsKLSAgICBmZy0+b3V0cHV0c1swXS0+Z3JhcGggPSBmZzsKLQotICAgIG9zdC0+ZmlsdGVyID0gZmctPm91dHB1dHNbMF07Ci0KLSAgICBHUk9XX0FSUkFZKGZnLT5pbnB1dHMsIGZnLT5uYl9pbnB1dHMpOwotICAgIGlmICghKGZnLT5pbnB1dHNbMF0gPSBhdl9tYWxsb2N6KHNpemVvZigqZmctPmlucHV0c1swXSkpKSkKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIGZnLT5pbnB1dHNbMF0tPmlzdCAgID0gaXN0OwotICAgIGZnLT5pbnB1dHNbMF0tPmdyYXBoID0gZmc7Ci0KLSAgICBHUk9XX0FSUkFZKGlzdC0+ZmlsdGVycywgaXN0LT5uYl9maWx0ZXJzKTsKLSAgICBpc3QtPmZpbHRlcnNbaXN0LT5uYl9maWx0ZXJzIC0gMV0gPSBmZy0+aW5wdXRzWzBdOwotCi0gICAgR1JPV19BUlJBWShmaWx0ZXJncmFwaHMsIG5iX2ZpbHRlcmdyYXBocyk7Ci0gICAgZmlsdGVyZ3JhcGhzW25iX2ZpbHRlcmdyYXBocyAtIDFdID0gZmc7Ci0KLSAgICByZXR1cm4gZmc7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfaW5wdXRfZmlsdGVyKEZpbHRlckdyYXBoICpmZywgQVZGaWx0ZXJJbk91dCAqaW4pCi17Ci0gICAgSW5wdXRTdHJlYW0gKmlzdCA9IE5VTEw7Ci0gICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlID0gYXZmaWx0ZXJfcGFkX2dldF90eXBlKGluLT5maWx0ZXJfY3R4LT5pbnB1dF9wYWRzLCBpbi0+cGFkX2lkeCk7Ci0gICAgaW50IGk7Ci0KLSAgICAvLyBUT0RPOiBzdXBwb3J0IG90aGVyIGZpbHRlciB0eXBlcwotICAgIGlmICh0eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyAmJiB0eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiT25seSB2aWRlbyBhbmQgYXVkaW8gZmlsdGVycyBzdXBwb3J0ZWQgIgotICAgICAgICAgICAgICAgImN1cnJlbnRseS5cbiIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgaWYgKGluLT5uYW1lKSB7Ci0gICAgICAgIEFWRm9ybWF0Q29udGV4dCAqczsKLSAgICAgICAgQVZTdHJlYW0gICAgICAgKnN0ID0gTlVMTDsKLSAgICAgICAgY2hhciAqcDsKLSAgICAgICAgaW50IGZpbGVfaWR4ID0gc3RydG9sKGluLT5uYW1lLCAmcCwgMCk7Ci0KLSAgICAgICAgaWYgKGZpbGVfaWR4IDwgMCB8fCBmaWxlX2lkeCA+PSBuYl9pbnB1dF9maWxlcykgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgZmlsZSBpbmRleCAlZCBpbiBmaWx0ZXJncmFwaCBkZXNjcmlwdGlvbiAlcy5cbiIsCi0gICAgICAgICAgICAgICAgICAgZmlsZV9pZHgsIGZnLT5ncmFwaF9kZXNjKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgICAgICBzID0gaW5wdXRfZmlsZXNbZmlsZV9pZHhdLT5jdHg7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgZW51bSBBVk1lZGlhVHlwZSBzdHJlYW1fdHlwZSA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlOwotICAgICAgICAgICAgaWYgKHN0cmVhbV90eXBlICE9IHR5cGUgJiYKLSAgICAgICAgICAgICAgICAhKHN0cmVhbV90eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSAmJgotICAgICAgICAgICAgICAgICAgdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gLyogc3ViMnZpZGVvIGhhY2sgKi8pKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIocywgcy0+c3RyZWFtc1tpXSwgKnAgPT0gJzonID8gcCArIDEgOiBwKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghc3QpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTdHJlYW0gc3BlY2lmaWVyICclcycgaW4gZmlsdGVyZ3JhcGggZGVzY3JpcHRpb24gJXMgIgotICAgICAgICAgICAgICAgICAgICJtYXRjaGVzIG5vIHN0cmVhbXMuXG4iLCBwLCBmZy0+Z3JhcGhfZGVzYyk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpbnB1dF9maWxlc1tmaWxlX2lkeF0tPmlzdF9pbmRleCArIHN0LT5pbmRleF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogZmluZCB0aGUgZmlyc3QgdW51c2VkIHN0cmVhbSBvZiBjb3JyZXNwb25kaW5nIHR5cGUgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgICAgIGlmIChpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGUgPT0gdHlwZSAmJiBpc3QtPmRpc2NhcmQpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gbmJfaW5wdXRfc3RyZWFtcykgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNhbm5vdCBmaW5kIGEgbWF0Y2hpbmcgc3RyZWFtIGZvciAiCi0gICAgICAgICAgICAgICAgICAgInVubGFiZWxlZCBpbnB1dCBwYWQgJWQgb24gZmlsdGVyICVzXG4iLCBpbi0+cGFkX2lkeCwKLSAgICAgICAgICAgICAgICAgICBpbi0+ZmlsdGVyX2N0eC0+bmFtZSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXZfYXNzZXJ0MChpc3QpOwotCi0gICAgaXN0LT5kaXNjYXJkICAgICAgICAgPSAwOwotICAgIGlzdC0+ZGVjb2RpbmdfbmVlZGVkIHw9IERFQ09ESU5HX0ZPUl9GSUxURVI7Ci0gICAgaXN0LT5zdC0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9OT05FOwotCi0gICAgR1JPV19BUlJBWShmZy0+aW5wdXRzLCBmZy0+bmJfaW5wdXRzKTsKLSAgICBpZiAoIShmZy0+aW5wdXRzW2ZnLT5uYl9pbnB1dHMgLSAxXSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmZy0+aW5wdXRzWzBdKSkpKQotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgZmctPmlucHV0c1tmZy0+bmJfaW5wdXRzIC0gMV0tPmlzdCAgID0gaXN0OwotICAgIGZnLT5pbnB1dHNbZmctPm5iX2lucHV0cyAtIDFdLT5ncmFwaCA9IGZnOwotCi0gICAgR1JPV19BUlJBWShpc3QtPmZpbHRlcnMsIGlzdC0+bmJfZmlsdGVycyk7Ci0gICAgaXN0LT5maWx0ZXJzW2lzdC0+bmJfZmlsdGVycyAtIDFdID0gZmctPmlucHV0c1tmZy0+bmJfaW5wdXRzIC0gMV07Ci19Ci0KLWludCBpbml0X2NvbXBsZXhfZmlsdGVyZ3JhcGgoRmlsdGVyR3JhcGggKmZnKQotewotICAgIEFWRmlsdGVySW5PdXQgKmlucHV0cywgKm91dHB1dHMsICpjdXI7Ci0gICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGg7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICAvKiB0aGlzIGdyYXBoIGlzIG9ubHkgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGtpbmRzIG9mIGlucHV0cwotICAgICAqIGFuZCBvdXRwdXRzIHdlIGhhdmUsIGFuZCBpcyBkaXNjYXJkZWQgb24gZXhpdCBmcm9tIHRoaXMgZnVuY3Rpb24gKi8KLSAgICBncmFwaCA9IGF2ZmlsdGVyX2dyYXBoX2FsbG9jKCk7Ci0gICAgaWYgKCFncmFwaCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX3BhcnNlMihncmFwaCwgZmctPmdyYXBoX2Rlc2MsICZpbnB1dHMsICZvdXRwdXRzKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgZm9yIChjdXIgPSBpbnB1dHM7IGN1cjsgY3VyID0gY3VyLT5uZXh0KQotICAgICAgICBpbml0X2lucHV0X2ZpbHRlcihmZywgY3VyKTsKLQotICAgIGZvciAoY3VyID0gb3V0cHV0czsgY3VyOykgewotICAgICAgICBHUk9XX0FSUkFZKGZnLT5vdXRwdXRzLCBmZy0+bmJfb3V0cHV0cyk7Ci0gICAgICAgIGZnLT5vdXRwdXRzW2ZnLT5uYl9vdXRwdXRzIC0gMV0gPSBhdl9tYWxsb2N6KHNpemVvZigqZmctPm91dHB1dHNbMF0pKTsKLSAgICAgICAgaWYgKCFmZy0+b3V0cHV0c1tmZy0+bmJfb3V0cHV0cyAtIDFdKQotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotCi0gICAgICAgIGZnLT5vdXRwdXRzW2ZnLT5uYl9vdXRwdXRzIC0gMV0tPmdyYXBoICAgPSBmZzsKLSAgICAgICAgZmctPm91dHB1dHNbZmctPm5iX291dHB1dHMgLSAxXS0+b3V0X3RtcCA9IGN1cjsKLSAgICAgICAgZmctPm91dHB1dHNbZmctPm5iX291dHB1dHMgLSAxXS0+dHlwZSAgICA9IGF2ZmlsdGVyX3BhZF9nZXRfdHlwZShjdXItPmZpbHRlcl9jdHgtPm91dHB1dF9wYWRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ci0+cGFkX2lkeCk7Ci0gICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKLSAgICAgICAgZmctPm91dHB1dHNbZmctPm5iX291dHB1dHMgLSAxXS0+b3V0X3RtcC0+bmV4dCA9IE5VTEw7Ci0gICAgfQotCi1mYWlsOgotICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJmlucHV0cyk7Ci0gICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmZ3JhcGgpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaW5zZXJ0X3RyaW0oaW50NjRfdCBzdGFydF90aW1lLCBpbnQ2NF90IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckNvbnRleHQgKipsYXN0X2ZpbHRlciwgaW50ICpwYWRfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWx0ZXJfbmFtZSkKLXsKLSAgICBBVkZpbHRlckdyYXBoICpncmFwaCA9ICgqbGFzdF9maWx0ZXIpLT5ncmFwaDsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eDsKLSAgICBjb25zdCBBVkZpbHRlciAqdHJpbTsKLSAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoKCpsYXN0X2ZpbHRlciktPm91dHB1dF9wYWRzLCAqcGFkX2lkeCk7Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9ICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgPyAidHJpbSIgOiAiYXRyaW0iOwotICAgIGludCByZXQgPSAwOwotCi0gICAgaWYgKGR1cmF0aW9uID09IElOVDY0X01BWCAmJiBzdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHRyaW0gPSBhdmZpbHRlcl9nZXRfYnlfbmFtZShuYW1lKTsKLSAgICBpZiAoIXRyaW0pIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVzIGZpbHRlciBub3QgcHJlc2VudCwgY2Fubm90IGxpbWl0ICIKLSAgICAgICAgICAgICAgICJyZWNvcmRpbmcgdGltZS5cbiIsIG5hbWUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9GSUxURVJfTk9UX0ZPVU5EOwotICAgIH0KLQotICAgIGN0eCA9IGF2ZmlsdGVyX2dyYXBoX2FsbG9jX2ZpbHRlcihncmFwaCwgdHJpbSwgZmlsdGVyX25hbWUpOwotICAgIGlmICghY3R4KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgaWYgKGR1cmF0aW9uICE9IElOVDY0X01BWCkgewotICAgICAgICByZXQgPSBhdl9vcHRfc2V0X2ludChjdHgsICJkdXJhdGlvbmkiLCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9DSElMRFJFTik7Ci0gICAgfQotICAgIGlmIChyZXQgPj0gMCAmJiBzdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgIHJldCA9IGF2X29wdF9zZXRfaW50KGN0eCwgInN0YXJ0aSIsIHN0YXJ0X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOwotICAgIH0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBjb25maWd1cmluZyB0aGUgJXMgZmlsdGVyIiwgbmFtZSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcmV0ID0gYXZmaWx0ZXJfaW5pdF9zdHIoY3R4LCBOVUxMKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIHJldCA9IGF2ZmlsdGVyX2xpbmsoKmxhc3RfZmlsdGVyLCAqcGFkX2lkeCwgY3R4LCAwKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICpsYXN0X2ZpbHRlciA9IGN0eDsKLSAgICAqcGFkX2lkeCAgICAgPSAwOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGluc2VydF9maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICoqbGFzdF9maWx0ZXIsIGludCAqcGFkX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWx0ZXJfbmFtZSwgY29uc3QgY2hhciAqYXJncykKLXsKLSAgICBBVkZpbHRlckdyYXBoICpncmFwaCA9ICgqbGFzdF9maWx0ZXIpLT5ncmFwaDsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eDsKLSAgICBpbnQgcmV0OwotCi0gICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoZmlsdGVyX25hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX25hbWUsIGFyZ3MsIE5VTEwsIGdyYXBoKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIHJldCA9IGF2ZmlsdGVyX2xpbmsoKmxhc3RfZmlsdGVyLCAqcGFkX2lkeCwgY3R4LCAwKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICpsYXN0X2ZpbHRlciA9IGN0eDsKLSAgICAqcGFkX2lkeCAgICAgPSAwOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvbmZpZ3VyZV9vdXRwdXRfdmlkZW9fZmlsdGVyKEZpbHRlckdyYXBoICpmZywgT3V0cHV0RmlsdGVyICpvZmlsdGVyLCBBVkZpbHRlckluT3V0ICpvdXQpCi17Ci0gICAgY2hhciAqcGl4X2ZtdHM7Ci0gICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvZmlsdGVyLT5vc3Q7Ci0gICAgT3V0cHV0RmlsZSAgICAqb2YgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBvc3QtPmVuY19jdHg7Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICpsYXN0X2ZpbHRlciA9IG91dC0+ZmlsdGVyX2N0eDsKLSAgICBpbnQgcGFkX2lkeCA9IG91dC0+cGFkX2lkeDsKLSAgICBpbnQgcmV0OwotICAgIGNoYXIgbmFtZVsyNTVdOwotCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAib3V0cHV0IHN0cmVhbSAlZDolZCIsIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmb2ZpbHRlci0+ZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImJ1ZmZlcnNpbmsiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIE5VTEwsIE5VTEwsIGZnLT5ncmFwaCk7Ci0KLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGlmIChjb2RlYy0+d2lkdGggfHwgY29kZWMtPmhlaWdodCkgewotICAgICAgICBjaGFyIGFyZ3NbMjU1XTsKLSAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXI7Ci0gICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICplID0gTlVMTDsKLQotICAgICAgICBzbnByaW50ZihhcmdzLCBzaXplb2YoYXJncyksICIlZDolZCIsCi0gICAgICAgICAgICAgICAgIGNvZGVjLT53aWR0aCwKLSAgICAgICAgICAgICAgICAgY29kZWMtPmhlaWdodCk7Ci0KLSAgICAgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQob3N0LT5zd3NfZGljdCwgIiIsIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7Ci0gICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICI6JXM9JXMiLCBlLT5rZXksIGUtPnZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInNjYWxlciBmb3Igb3V0cHV0IHN0cmVhbSAlZDolZCIsCi0gICAgICAgICAgICAgICAgIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmZmlsdGVyLCBhdmZpbHRlcl9nZXRfYnlfbmFtZSgic2NhbGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGFyZ3MsIE5VTEwsIGZnLT5ncmFwaCkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfbGluayhsYXN0X2ZpbHRlciwgcGFkX2lkeCwgZmlsdGVyLCAwKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICBsYXN0X2ZpbHRlciA9IGZpbHRlcjsKLSAgICAgICAgcGFkX2lkeCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKChwaXhfZm10cyA9IGNob29zZV9waXhfZm10cyhvc3QpKSkgewotICAgICAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlcjsKLSAgICAgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicGl4ZWwgZm9ybWF0IGZvciBvdXRwdXQgc3RyZWFtICVkOiVkIiwKLSAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKLSAgICAgICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJmb3JtYXQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IiwgcGl4X2ZtdHMsIE5VTEwsIGZnLT5ncmFwaCk7Ci0gICAgICAgIGF2X2ZyZWVwKCZwaXhfZm10cyk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCBwYWRfaWR4LCBmaWx0ZXIsIDApKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIGxhc3RfZmlsdGVyID0gZmlsdGVyOwotICAgICAgICBwYWRfaWR4ICAgICA9IDA7Ci0gICAgfQotCi0gICAgaWYgKG9zdC0+ZnJhbWVfcmF0ZS5udW0gJiYgMCkgewotICAgICAgICBBVkZpbHRlckNvbnRleHQgKmZwczsKLSAgICAgICAgY2hhciBhcmdzWzI1NV07Ci0KLSAgICAgICAgc25wcmludGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiZnBzPSVkLyVkIiwgb3N0LT5mcmFtZV9yYXRlLm51bSwKLSAgICAgICAgICAgICAgICAgb3N0LT5mcmFtZV9yYXRlLmRlbik7Ci0gICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImZwcyBmb3Igb3V0cHV0IHN0cmVhbSAlZDolZCIsCi0gICAgICAgICAgICAgICAgIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmZwcywgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImZwcyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGFyZ3MsIE5VTEwsIGZnLT5ncmFwaCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICByZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCBwYWRfaWR4LCBmcHMsIDApOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGxhc3RfZmlsdGVyID0gZnBzOwotICAgICAgICBwYWRfaWR4ID0gMDsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJ0cmltIGZvciBvdXRwdXQgc3RyZWFtICVkOiVkIiwKLSAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOwotICAgIHJldCA9IGluc2VydF90cmltKG9mLT5zdGFydF90aW1lLCBvZi0+cmVjb3JkaW5nX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgJmxhc3RfZmlsdGVyLCAmcGFkX2lkeCwgbmFtZSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLQotICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfbGluayhsYXN0X2ZpbHRlciwgcGFkX2lkeCwgb2ZpbHRlci0+ZmlsdGVyLCAwKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY29uZmlndXJlX291dHB1dF9hdWRpb19maWx0ZXIoRmlsdGVyR3JhcGggKmZnLCBPdXRwdXRGaWx0ZXIgKm9maWx0ZXIsIEFWRmlsdGVySW5PdXQgKm91dCkKLXsKLSAgICBPdXRwdXRTdHJlYW0gKm9zdCA9IG9maWx0ZXItPm9zdDsKLSAgICBPdXRwdXRGaWxlICAgICpvZiA9IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyAgPSBvc3QtPmVuY19jdHg7Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICpsYXN0X2ZpbHRlciA9IG91dC0+ZmlsdGVyX2N0eDsKLSAgICBpbnQgcGFkX2lkeCA9IG91dC0+cGFkX2lkeDsKLSAgICBjaGFyICpzYW1wbGVfZm10cywgKnNhbXBsZV9yYXRlcywgKmNoYW5uZWxfbGF5b3V0czsKLSAgICBjaGFyIG5hbWVbMjU1XTsKLSAgICBpbnQgcmV0OwotCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAib3V0cHV0IHN0cmVhbSAlZDolZCIsIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmb2ZpbHRlci0+ZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImFidWZmZXJzaW5rIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBOVUxMLCBOVUxMLCBmZy0+Z3JhcGgpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9pbnQob2ZpbHRlci0+ZmlsdGVyLCAiYWxsX2NoYW5uZWxfY291bnRzIiwgMSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotI2RlZmluZSBBVVRPX0lOU0VSVF9GSUxURVIob3B0X25hbWUsIGZpbHRlcl9uYW1lLCBhcmcpIGRvIHsgICAgICAgICAgICAgICAgIFwKLSAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRfY3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgb3B0X25hbWUgIiBpcyBmb3J3YXJkZWQgdG8gbGF2ZmkgIiAgICAgICAgICAgIFwKLSAgICAgICAgICAgInNpbWlsYXJseSB0byAtYWYgIiBmaWx0ZXJfbmFtZSAiPSVzLlxuIiwgYXJnKTsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmZpbHRfY3R4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKGZpbHRlcl9uYW1lKSwgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbmFtZSwgYXJnLCBOVUxMLCBmZy0+Z3JhcGgpOyAgXAotICAgIGlmIChyZXQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldCA9IGF2ZmlsdGVyX2xpbmsobGFzdF9maWx0ZXIsIHBhZF9pZHgsIGZpbHRfY3R4LCAwKTsgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsYXN0X2ZpbHRlciA9IGZpbHRfY3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcGFkX2lkeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLSAgICBpZiAob3N0LT5hdWRpb19jaGFubmVsc19tYXBwZWQpIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIEFWQlByaW50IHBhbl9idWY7Ci0gICAgICAgIGF2X2JwcmludF9pbml0KCZwYW5fYnVmLCAyNTYsIDgxOTIpOwotICAgICAgICBhdl9icHJpbnRmKCZwYW5fYnVmLCAiMHglIlBSSXg2NCwKLSAgICAgICAgICAgICAgICAgICBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChvc3QtPmF1ZGlvX2NoYW5uZWxzX21hcHBlZCkpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3N0LT5hdWRpb19jaGFubmVsc19tYXBwZWQ7IGkrKykKLSAgICAgICAgICAgIGlmIChvc3QtPmF1ZGlvX2NoYW5uZWxzX21hcFtpXSAhPSAtMSkKLSAgICAgICAgICAgICAgICBhdl9icHJpbnRmKCZwYW5fYnVmLCAifGMlZD1jJWQiLCBpLCBvc3QtPmF1ZGlvX2NoYW5uZWxzX21hcFtpXSk7Ci0KLSAgICAgICAgQVVUT19JTlNFUlRfRklMVEVSKCItbWFwX2NoYW5uZWwiLCAicGFuIiwgcGFuX2J1Zi5zdHIpOwotICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJnBhbl9idWYsIE5VTEwpOwotICAgIH0KLQotICAgIGlmIChjb2RlYy0+Y2hhbm5lbHMgJiYgIWNvZGVjLT5jaGFubmVsX2xheW91dCkKLSAgICAgICAgY29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQoY29kZWMtPmNoYW5uZWxzKTsKLQotICAgIHNhbXBsZV9mbXRzICAgICA9IGNob29zZV9zYW1wbGVfZm10cyhvc3QpOwotICAgIHNhbXBsZV9yYXRlcyAgICA9IGNob29zZV9zYW1wbGVfcmF0ZXMob3N0KTsKLSAgICBjaGFubmVsX2xheW91dHMgPSBjaG9vc2VfY2hhbm5lbF9sYXlvdXRzKG9zdCk7Ci0gICAgaWYgKHNhbXBsZV9mbXRzIHx8IHNhbXBsZV9yYXRlcyB8fCBjaGFubmVsX2xheW91dHMpIHsKLSAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpmb3JtYXQ7Ci0gICAgICAgIGNoYXIgYXJnc1syNTZdOwotICAgICAgICBhcmdzWzBdID0gMDsKLQotICAgICAgICBpZiAoc2FtcGxlX2ZtdHMpCi0gICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICJzYW1wbGVfZm10cz0lczoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9mbXRzKTsKLSAgICAgICAgaWYgKHNhbXBsZV9yYXRlcykKLSAgICAgICAgICAgIGF2X3N0cmxjYXRmKGFyZ3MsIHNpemVvZihhcmdzKSwgInNhbXBsZV9yYXRlcz0lczoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlcyk7Ci0gICAgICAgIGlmIChjaGFubmVsX2xheW91dHMpCi0gICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICJjaGFubmVsX2xheW91dHM9JXM6IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2xheW91dHMpOwotCi0gICAgICAgIGF2X2ZyZWVwKCZzYW1wbGVfZm10cyk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzYW1wbGVfcmF0ZXMpOwotICAgICAgICBhdl9mcmVlcCgmY2hhbm5lbF9sYXlvdXRzKTsKLQotICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJhdWRpbyBmb3JtYXQgZm9yIG91dHB1dCBzdHJlYW0gJWQ6JWQiLAotICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOwotICAgICAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImFmb3JtYXQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBhcmdzLCBOVUxMLCBmZy0+Z3JhcGgpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgcmV0ID0gYXZmaWx0ZXJfbGluayhsYXN0X2ZpbHRlciwgcGFkX2lkeCwgZm9ybWF0LCAwKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIGxhc3RfZmlsdGVyID0gZm9ybWF0OwotICAgICAgICBwYWRfaWR4ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9fdm9sdW1lICE9IDI1NiAmJiAwKSB7Ci0gICAgICAgIGNoYXIgYXJnc1syNTZdOwotCi0gICAgICAgIHNucHJpbnRmKGFyZ3MsIHNpemVvZihhcmdzKSwgIiVmIiwgYXVkaW9fdm9sdW1lIC8gMjU2Lik7Ci0gICAgICAgIEFVVE9fSU5TRVJUX0ZJTFRFUigiLXZvbCIsICJ2b2x1bWUiLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBpZiAob3N0LT5hcGFkICYmIG9mLT5zaG9ydGVzdCkgewotICAgICAgICBjaGFyIGFyZ3NbMjU2XTsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8b2YtPmN0eC0+bmJfc3RyZWFtczsgaSsrKQotICAgICAgICAgICAgaWYgKG9mLT5jdHgtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoaTxvZi0+Y3R4LT5uYl9zdHJlYW1zKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihhcmdzLCBzaXplb2YoYXJncyksICIlcyIsIG9zdC0+YXBhZCk7Ci0gICAgICAgICAgICBBVVRPX0lOU0VSVF9GSUxURVIoIi1hcGFkIiwgImFwYWQiLCBhcmdzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInRyaW0gZm9yIG91dHB1dCBzdHJlYW0gJWQ6JWQiLAotICAgICAgICAgICAgIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgcmV0ID0gaW5zZXJ0X3RyaW0ob2YtPnN0YXJ0X3RpbWUsIG9mLT5yZWNvcmRpbmdfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCBuYW1lKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfbGluayhsYXN0X2ZpbHRlciwgcGFkX2lkeCwgb2ZpbHRlci0+ZmlsdGVyLCAwKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgREVTQ1JJQkVfRklMVEVSX0xJTksoZiwgaW5vdXQsIGluKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5vdXQtPmZpbHRlcl9jdHg7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBVkZpbHRlclBhZCAqcGFkcyA9IGluID8gY3R4LT5pbnB1dF9wYWRzICA6IGN0eC0+b3V0cHV0X3BhZHM7ICBcCi0gICAgaW50ICAgICAgIG5iX3BhZHMgPSBpbiA/IGN0eC0+bmJfaW5wdXRzICAgOiBjdHgtPm5iX291dHB1dHM7ICAgXAotICAgIEFWSU9Db250ZXh0ICpwYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZwYikgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBleGl0X3Byb2dyYW0oMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXZpb19wcmludGYocGIsICIlcyIsIGN0eC0+ZmlsdGVyLT5uYW1lKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChuYl9wYWRzID4gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXZpb19wcmludGYocGIsICI6JXMiLCBhdmZpbHRlcl9wYWRfZ2V0X25hbWUocGFkcywgaW5vdXQtPnBhZF9pZHgpKTtcCi0gICAgYXZpb193OChwYiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGF2aW9fY2xvc2VfZHluX2J1ZihwYiwgJmYtPm5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotaW50IGNvbmZpZ3VyZV9vdXRwdXRfZmlsdGVyKEZpbHRlckdyYXBoICpmZywgT3V0cHV0RmlsdGVyICpvZmlsdGVyLCBBVkZpbHRlckluT3V0ICpvdXQpCi17Ci0gICAgYXZfZnJlZXAoJm9maWx0ZXItPm5hbWUpOwotICAgIERFU0NSSUJFX0ZJTFRFUl9MSU5LKG9maWx0ZXIsIG91dCwgMCk7Ci0KLSAgICBpZiAoIW9maWx0ZXItPm9zdCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRmlsdGVyICVzIGhhcyBhIHVuY29ubmVjdGVkIG91dHB1dFxuIiwgb2ZpbHRlci0+bmFtZSk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGF2ZmlsdGVyX3BhZF9nZXRfdHlwZShvdXQtPmZpbHRlcl9jdHgtPm91dHB1dF9wYWRzLCBvdXQtPnBhZF9pZHgpKSB7Ci0gICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86IHJldHVybiBjb25maWd1cmVfb3V0cHV0X3ZpZGVvX2ZpbHRlcihmZywgb2ZpbHRlciwgb3V0KTsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzogcmV0dXJuIGNvbmZpZ3VyZV9vdXRwdXRfYXVkaW9fZmlsdGVyKGZnLCBvZmlsdGVyLCBvdXQpOwotICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDAoMCk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IHN1YjJ2aWRlb19wcmVwYXJlKElucHV0U3RyZWFtICppc3QpCi17Ci0gICAgQVZGb3JtYXRDb250ZXh0ICphdmYgPSBpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT5jdHg7Ci0gICAgaW50IGksIHcsIGg7Ci0KLSAgICAvKiBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBjYW52YXMgZm9yIHRoZSBzdWJ0aXRsZXMgc3RyZWFtLgotICAgICAgIElmIHRoZSBzdWJ0aXRsZXMgY29kZWMgaGFzIHNldCBhIHNpemUsIHVzZSBpdC4gT3RoZXJ3aXNlIHVzZSB0aGUKLSAgICAgICBtYXhpbXVtIGRpbWVuc2lvbnMgb2YgdGhlIHZpZGVvIHN0cmVhbXMgaW4gdGhlIHNhbWUgZmlsZS4gKi8KLSAgICB3ID0gaXN0LT5kZWNfY3R4LT53aWR0aDsKLSAgICBoID0gaXN0LT5kZWNfY3R4LT5oZWlnaHQ7Ci0gICAgaWYgKCEodyAmJiBoKSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZmLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhdmYtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICAgICAgICAgIHcgPSBGRk1BWCh3LCBhdmYtPnN0cmVhbXNbaV0tPmNvZGVjLT53aWR0aCk7Ci0gICAgICAgICAgICAgICAgaCA9IEZGTUFYKGgsIGF2Zi0+c3RyZWFtc1tpXS0+Y29kZWMtPmhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEodyAmJiBoKSkgewotICAgICAgICAgICAgdyA9IEZGTUFYKHcsIDcyMCk7Ci0gICAgICAgICAgICBoID0gRkZNQVgoaCwgNTc2KTsKLSAgICAgICAgfQotICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfSU5GTywgInN1YjJ2aWRlbzogdXNpbmcgJWR4JWQgY2FudmFzXG4iLCB3LCBoKTsKLSAgICB9Ci0gICAgaXN0LT5zdWIydmlkZW8udyA9IGlzdC0+cmVzYW1wbGVfd2lkdGggID0gdzsKLSAgICBpc3QtPnN1YjJ2aWRlby5oID0gaXN0LT5yZXNhbXBsZV9oZWlnaHQgPSBoOwotCi0gICAgLyogcmVjdGFuZ2xlcyBhcmUgQVZfUElYX0ZNVF9QQUw4LCBidXQgd2UgaGF2ZSBubyBndWFyYW50ZWUgdGhhdCB0aGUKLSAgICAgICBwYWxldHRlcyBmb3IgYWxsIHJlY3RhbmdsZXMgYXJlIGlkZW50aWNhbCBvciBjb21wYXRpYmxlICovCi0gICAgaXN0LT5yZXNhbXBsZV9waXhfZm10ID0gaXN0LT5kZWNfY3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsKLQotICAgIGlzdC0+c3ViMnZpZGVvLmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIWlzdC0+c3ViMnZpZGVvLmZyYW1lKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIGlzdC0+c3ViMnZpZGVvLmxhc3RfcHRzID0gSU5UNjRfTUlOOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvbmZpZ3VyZV9pbnB1dF92aWRlb19maWx0ZXIoRmlsdGVyR3JhcGggKmZnLCBJbnB1dEZpbHRlciAqaWZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckluT3V0ICppbikKLXsKLSAgICBBVkZpbHRlckNvbnRleHQgKmxhc3RfZmlsdGVyOwotICAgIGNvbnN0IEFWRmlsdGVyICpidWZmZXJfZmlsdCA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJidWZmZXIiKTsKLSAgICBJbnB1dFN0cmVhbSAqaXN0ID0gaWZpbHRlci0+aXN0OwotICAgIElucHV0RmlsZSAgICAgKmYgPSBpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdOwotICAgIEFWUmF0aW9uYWwgdGIgPSBpc3QtPmZyYW1lcmF0ZS5udW0gPyBhdl9pbnZfcShpc3QtPmZyYW1lcmF0ZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3QtPnN0LT50aW1lX2Jhc2U7Ci0gICAgQVZSYXRpb25hbCBmciA9IGlzdC0+ZnJhbWVyYXRlOwotICAgIEFWUmF0aW9uYWwgc2FyOwotICAgIEFWQlByaW50IGFyZ3M7Ci0gICAgY2hhciBuYW1lWzI1NV07Ci0gICAgaW50IHJldCwgcGFkX2lkeCA9IDA7Ci0gICAgaW50NjRfdCB0c29mZnNldCA9IDA7Ci0KLSAgICBpZiAoaXN0LT5kZWNfY3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGNvbm5lY3QgdmlkZW8gZmlsdGVyIHRvIGF1ZGlvIGlucHV0XG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICBpZiAoIWZyLm51bSkKLSAgICAgICAgZnIgPSBhdl9ndWVzc19mcmFtZV9yYXRlKGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF0tPmN0eCwgaXN0LT5zdCwgTlVMTCk7Ci0KLSAgICBpZiAoaXN0LT5kZWNfY3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICByZXQgPSBzdWIydmlkZW9fcHJlcGFyZShpc3QpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgc2FyID0gaXN0LT5zdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPwotICAgICAgICAgIGlzdC0+c3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gOgotICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKLSAgICBpZighc2FyLmRlbikKLSAgICAgICAgc2FyID0gKEFWUmF0aW9uYWwpezAsMX07Ci0gICAgYXZfYnByaW50X2luaXQoJmFyZ3MsIDAsIDEpOwotICAgIGF2X2JwcmludGYoJmFyZ3MsCi0gICAgICAgICAgICAgInZpZGVvX3NpemU9JWR4JWQ6cGl4X2ZtdD0lZDp0aW1lX2Jhc2U9JWQvJWQ6IgotICAgICAgICAgICAgICJwaXhlbF9hc3BlY3Q9JWQvJWQ6c3dzX3BhcmFtPWZsYWdzPSVkIiwgaXN0LT5yZXNhbXBsZV93aWR0aCwKLSAgICAgICAgICAgICBpc3QtPnJlc2FtcGxlX2hlaWdodCwKLSAgICAgICAgICAgICBpc3QtPmh3YWNjZWxfcmV0cmlldmVfZGF0YSA/IGlzdC0+aHdhY2NlbF9yZXRyaWV2ZWRfcGl4X2ZtdCA6IGlzdC0+cmVzYW1wbGVfcGl4X2ZtdCwKLSAgICAgICAgICAgICB0Yi5udW0sIHRiLmRlbiwgc2FyLm51bSwgc2FyLmRlbiwKLSAgICAgICAgICAgICBTV1NfQklMSU5FQVIgKyAoKGlzdC0+ZGVjX2N0eC0+ZmxhZ3MmQVZfQ09ERUNfRkxBR19CSVRFWEFDVCkgPyBTV1NfQklURVhBQ1Q6MCkpOwotICAgIGlmIChmci5udW0gJiYgZnIuZGVuKQotICAgICAgICBhdl9icHJpbnRmKCZhcmdzLCAiOmZyYW1lX3JhdGU9JWQvJWQiLCBmci5udW0sIGZyLmRlbik7Ci0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZ3JhcGggJWQgaW5wdXQgZnJvbSBzdHJlYW0gJWQ6JWQiLCBmZy0+aW5kZXgsCi0gICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7Ci0KLSAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmlmaWx0ZXItPmZpbHRlciwgYnVmZmVyX2ZpbHQsIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Muc3RyLCBOVUxMLCBmZy0+Z3JhcGgpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgbGFzdF9maWx0ZXIgPSBpZmlsdGVyLT5maWx0ZXI7Ci0KLSAgICBpZiAoaXN0LT5hdXRvcm90YXRlKSB7Ci0gICAgICAgIGRvdWJsZSB0aGV0YSA9IGdldF9yb3RhdGlvbihpc3QtPnN0KTsKLQotICAgICAgICBpZiAoZmFicyh0aGV0YSAtIDkwKSA8IDEuMCkgewotICAgICAgICAgICAgcmV0ID0gaW5zZXJ0X2ZpbHRlcigmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCAidHJhbnNwb3NlIiwgImNsb2NrIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmFicyh0aGV0YSAtIDE4MCkgPCAxLjApIHsKLSAgICAgICAgICAgIHJldCA9IGluc2VydF9maWx0ZXIoJmxhc3RfZmlsdGVyLCAmcGFkX2lkeCwgImhmbGlwIiwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgcmV0ID0gaW5zZXJ0X2ZpbHRlcigmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCAidmZsaXAiLCBOVUxMKTsKLSAgICAgICAgfSBlbHNlIGlmIChmYWJzKHRoZXRhIC0gMjcwKSA8IDEuMCkgewotICAgICAgICAgICAgcmV0ID0gaW5zZXJ0X2ZpbHRlcigmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCAidHJhbnNwb3NlIiwgImNjbG9jayIpOwotICAgICAgICB9IGVsc2UgaWYgKGZhYnModGhldGEpID4gMS4wKSB7Ci0gICAgICAgICAgICBjaGFyIHJvdGF0ZV9idWZbNjRdOwotICAgICAgICAgICAgc25wcmludGYocm90YXRlX2J1Ziwgc2l6ZW9mKHJvdGF0ZV9idWYpLCAiJWYqUEkvMTgwIiwgdGhldGEpOwotICAgICAgICAgICAgcmV0ID0gaW5zZXJ0X2ZpbHRlcigmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCAicm90YXRlIiwgcm90YXRlX2J1Zik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGlmIChpc3QtPmZyYW1lcmF0ZS5udW0pIHsKLSAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpzZXRwdHM7Ci0KLSAgICAgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZm9yY2UgQ0ZSIGZvciBpbnB1dCBmcm9tIHN0cmVhbSAlZDolZCIsCi0gICAgICAgICAgICAgICAgIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgpOwotICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJnNldHB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJzZXRwdHMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICJOIiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnLT5ncmFwaCkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCAwLCBzZXRwdHMsIDApKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIGxhc3RfZmlsdGVyID0gc2V0cHRzOwotICAgIH0KLQotICAgIGlmIChkb19kZWludGVybGFjZSkgewotICAgICAgICBBVkZpbHRlckNvbnRleHQgKnlhZGlmOwotCi0gICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImRlaW50ZXJsYWNlIGlucHV0IGZyb20gc3RyZWFtICVkOiVkIiwKLSAgICAgICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7Ci0gICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmeWFkaWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmZpbHRlcl9nZXRfYnlfbmFtZSgieWFkaWYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICIiLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmctPmdyYXBoKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2xpbmsobGFzdF9maWx0ZXIsIDAsIHlhZGlmLCAwKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICBsYXN0X2ZpbHRlciA9IHlhZGlmOwotICAgIH0KLQotICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInRyaW0gZm9yIGlucHV0IHN0cmVhbSAlZDolZCIsCi0gICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7Ci0gICAgaWYgKGNvcHlfdHMpIHsKLSAgICAgICAgdHNvZmZzZXQgPSBmLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFID8gMCA6IGYtPnN0YXJ0X3RpbWU7Ci0gICAgICAgIGlmICghc3RhcnRfYXRfemVybyAmJiBmLT5jdHgtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICB0c29mZnNldCArPSBmLT5jdHgtPnN0YXJ0X3RpbWU7Ci0gICAgfQotICAgIHJldCA9IGluc2VydF90cmltKCgoZi0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgfHwgIWYtPmFjY3VyYXRlX3NlZWspID8KLSAgICAgICAgICAgICAgICAgICAgICBBVl9OT1BUU19WQUxVRSA6IHRzb2Zmc2V0LCBmLT5yZWNvcmRpbmdfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCBuYW1lKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfbGluayhsYXN0X2ZpbHRlciwgMCwgaW4tPmZpbHRlcl9jdHgsIGluLT5wYWRfaWR4KSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvbmZpZ3VyZV9pbnB1dF9hdWRpb19maWx0ZXIoRmlsdGVyR3JhcGggKmZnLCBJbnB1dEZpbHRlciAqaWZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckluT3V0ICppbikKLXsKLSAgICBBVkZpbHRlckNvbnRleHQgKmxhc3RfZmlsdGVyOwotICAgIGNvbnN0IEFWRmlsdGVyICphYnVmZmVyX2ZpbHQgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYWJ1ZmZlciIpOwotICAgIElucHV0U3RyZWFtICppc3QgPSBpZmlsdGVyLT5pc3Q7Ci0gICAgSW5wdXRGaWxlICAgICAqZiA9IGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF07Ci0gICAgQVZCUHJpbnQgYXJnczsKLSAgICBjaGFyIG5hbWVbMjU1XTsKLSAgICBpbnQgcmV0LCBwYWRfaWR4ID0gMDsKLSAgICBpbnQ2NF90IHRzb2Zmc2V0ID0gMDsKLQotICAgIGlmIChpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgY29ubmVjdCBhdWRpbyBmaWx0ZXIgdG8gbm9uIGF1ZGlvIGlucHV0XG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICBhdl9icHJpbnRfaW5pdCgmYXJncywgMCwgQVZfQlBSSU5UX1NJWkVfQVVUT01BVElDKTsKLSAgICBhdl9icHJpbnRmKCZhcmdzLCAidGltZV9iYXNlPSVkLyVkOnNhbXBsZV9yYXRlPSVkOnNhbXBsZV9mbXQ9JXMiLAotICAgICAgICAgICAgIDEsIGlzdC0+ZGVjX2N0eC0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgaXN0LT5kZWNfY3R4LT5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGlzdC0+ZGVjX2N0eC0+c2FtcGxlX2ZtdCkpOwotICAgIGlmIChpc3QtPmRlY19jdHgtPmNoYW5uZWxfbGF5b3V0KQotICAgICAgICBhdl9icHJpbnRmKCZhcmdzLCAiOmNoYW5uZWxfbGF5b3V0PTB4JSJQUkl4NjQsCi0gICAgICAgICAgICAgICAgICAgaXN0LT5kZWNfY3R4LT5jaGFubmVsX2xheW91dCk7Ci0gICAgZWxzZQotICAgICAgICBhdl9icHJpbnRmKCZhcmdzLCAiOmNoYW5uZWxzPSVkIiwgaXN0LT5kZWNfY3R4LT5jaGFubmVscyk7Ci0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZ3JhcGggJWQgaW5wdXQgZnJvbSBzdHJlYW0gJWQ6JWQiLCBmZy0+aW5kZXgsCi0gICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7Ci0KLSAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmlmaWx0ZXItPmZpbHRlciwgYWJ1ZmZlcl9maWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBhcmdzLnN0ciwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmctPmdyYXBoKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIGxhc3RfZmlsdGVyID0gaWZpbHRlci0+ZmlsdGVyOwotCi0jZGVmaW5lIEFVVE9fSU5TRVJUX0ZJTFRFUl9JTlBVVChvcHRfbmFtZSwgZmlsdGVyX25hbWUsIGFyZykgZG8geyAgICAgICAgICAgICAgICAgXAotICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdF9jdHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCBvcHRfbmFtZSAiIGlzIGZvcndhcmRlZCB0byBsYXZmaSAiICAgICAgICAgICAgXAotICAgICAgICAgICAic2ltaWxhcmx5IHRvIC1hZiAiIGZpbHRlcl9uYW1lICI9JXMuXG4iLCBhcmcpOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZ3JhcGggJWQgJXMgZm9yIGlucHV0IHN0cmVhbSAlZDolZCIsICAgICAgXAotICAgICAgICAgICAgICAgIGZnLT5pbmRleCwgZmlsdGVyX25hbWUsIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgpOyAgIFwKLSAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmaWx0X2N0eCwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmZpbHRlcl9nZXRfYnlfbmFtZShmaWx0ZXJfbmFtZSksICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYXJnLCBOVUxMLCBmZy0+Z3JhcGgpOyAgICAgICAgIFwKLSAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCAwLCBmaWx0X2N0eCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHJldCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGFzdF9maWx0ZXIgPSBmaWx0X2N0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotICAgIGlmIChhdWRpb19zeW5jX21ldGhvZCA+IDApIHsKLSAgICAgICAgY2hhciBhcmdzWzI1Nl0gPSB7MH07Ci0KLSAgICAgICAgYXZfc3RybGNhdGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiYXN5bmM9JWQiLCBhdWRpb19zeW5jX21ldGhvZCk7Ci0gICAgICAgIGlmIChhdWRpb19kcmlmdF90aHJlc2hvbGQgIT0gMC4xKQotICAgICAgICAgICAgYXZfc3RybGNhdGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiOm1pbl9oYXJkX2NvbXA9JWYiLCBhdWRpb19kcmlmdF90aHJlc2hvbGQpOwotICAgICAgICBpZiAoIWZnLT5yZWNvbmZpZ3VyYXRpb24pCi0gICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICI6Zmlyc3RfcHRzPTAiKTsKLSAgICAgICAgQVVUT19JTlNFUlRfRklMVEVSX0lOUFVUKCItYXN5bmMiLCAiYXJlc2FtcGxlIiwgYXJncyk7Ci0gICAgfQotCi0vLyAgICAgaWYgKG9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwcGVkKSB7Ci0vLyAgICAgICAgIGludCBpOwotLy8gICAgICAgICBBVkJQcmludCBwYW5fYnVmOwotLy8gICAgICAgICBhdl9icHJpbnRfaW5pdCgmcGFuX2J1ZiwgMjU2LCA4MTkyKTsKLS8vICAgICAgICAgYXZfYnByaW50ZigmcGFuX2J1ZiwgIjB4JSJQUkl4NjQsCi0vLyAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQob3N0LT5hdWRpb19jaGFubmVsc19tYXBwZWQpKTsKLS8vICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwcGVkOyBpKyspCi0vLyAgICAgICAgICAgICBpZiAob3N0LT5hdWRpb19jaGFubmVsc19tYXBbaV0gIT0gLTEpCi0vLyAgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmcGFuX2J1ZiwgIjpjJWQ9YyVkIiwgaSwgb3N0LT5hdWRpb19jaGFubmVsc19tYXBbaV0pOwotLy8gICAgICAgICBBVVRPX0lOU0VSVF9GSUxURVJfSU5QVVQoIi1tYXBfY2hhbm5lbCIsICJwYW4iLCBwYW5fYnVmLnN0cik7Ci0vLyAgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcGFuX2J1ZiwgTlVMTCk7Ci0vLyAgICAgfQotCi0gICAgaWYgKGF1ZGlvX3ZvbHVtZSAhPSAyNTYpIHsKLSAgICAgICAgY2hhciBhcmdzWzI1Nl07Ci0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiLXZvbCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgdGhlIHZvbHVtZSAiCi0gICAgICAgICAgICAgICAiYXVkaW8gZmlsdGVyIGluc3RlYWQuXG4iKTsKLQotICAgICAgICBzbnByaW50ZihhcmdzLCBzaXplb2YoYXJncyksICIlZiIsIGF1ZGlvX3ZvbHVtZSAvIDI1Ni4pOwotICAgICAgICBBVVRPX0lOU0VSVF9GSUxURVJfSU5QVVQoIi12b2wiLCAidm9sdW1lIiwgYXJncyk7Ci0gICAgfQotCi0gICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAidHJpbSBmb3IgaW5wdXQgc3RyZWFtICVkOiVkIiwKLSAgICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4KTsKLSAgICBpZiAoY29weV90cykgewotICAgICAgICB0c29mZnNldCA9IGYtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUgPyAwIDogZi0+c3RhcnRfdGltZTsKLSAgICAgICAgaWYgKCFzdGFydF9hdF96ZXJvICYmIGYtPmN0eC0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgIHRzb2Zmc2V0ICs9IGYtPmN0eC0+c3RhcnRfdGltZTsKLSAgICB9Ci0gICAgcmV0ID0gaW5zZXJ0X3RyaW0oKChmLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSB8fCAhZi0+YWNjdXJhdGVfc2VlaykgPwotICAgICAgICAgICAgICAgICAgICAgIEFWX05PUFRTX1ZBTFVFIDogdHNvZmZzZXQsIGYtPnJlY29yZGluZ190aW1lLAotICAgICAgICAgICAgICAgICAgICAgICZsYXN0X2ZpbHRlciwgJnBhZF9pZHgsIG5hbWUpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCAwLCBpbi0+ZmlsdGVyX2N0eCwgaW4tPnBhZF9pZHgpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb25maWd1cmVfaW5wdXRfZmlsdGVyKEZpbHRlckdyYXBoICpmZywgSW5wdXRGaWx0ZXIgKmlmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqaW4pCi17Ci0gICAgYXZfZnJlZXAoJmlmaWx0ZXItPm5hbWUpOwotICAgIERFU0NSSUJFX0ZJTFRFUl9MSU5LKGlmaWx0ZXIsIGluLCAxKTsKLQotICAgIGlmICghaWZpbHRlci0+aXN0LT5kZWMpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJObyBkZWNvZGVyIGZvciBzdHJlYW0gIyVkOiVkLCBmaWx0ZXJpbmcgaW1wb3NzaWJsZVxuIiwKLSAgICAgICAgICAgICAgIGlmaWx0ZXItPmlzdC0+ZmlsZV9pbmRleCwgaWZpbHRlci0+aXN0LT5zdC0+aW5kZXgpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9ERUNPREVSX05PVF9GT1VORDsKLSAgICB9Ci0gICAgc3dpdGNoIChhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoaW4tPmZpbHRlcl9jdHgtPmlucHV0X3BhZHMsIGluLT5wYWRfaWR4KSkgewotICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiByZXR1cm4gY29uZmlndXJlX2lucHV0X3ZpZGVvX2ZpbHRlcihmZywgaWZpbHRlciwgaW4pOwotICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOiByZXR1cm4gY29uZmlndXJlX2lucHV0X2F1ZGlvX2ZpbHRlcihmZywgaWZpbHRlciwgaW4pOwotICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDAoMCk7Ci0gICAgfQotfQotCi1pbnQgY29uZmlndXJlX2ZpbHRlcmdyYXBoKEZpbHRlckdyYXBoICpmZykKLXsKLSAgICBBVkZpbHRlckluT3V0ICppbnB1dHMsICpvdXRwdXRzLCAqY3VyOwotICAgIGludCByZXQsIGksIHNpbXBsZSA9ICFmZy0+Z3JhcGhfZGVzYzsKLSAgICBjb25zdCBjaGFyICpncmFwaF9kZXNjID0gc2ltcGxlID8gZmctPm91dHB1dHNbMF0tPm9zdC0+YXZmaWx0ZXIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZy0+Z3JhcGhfZGVzYzsKLQotICAgIGF2ZmlsdGVyX2dyYXBoX2ZyZWUoJmZnLT5ncmFwaCk7Ci0gICAgaWYgKCEoZmctPmdyYXBoID0gYXZmaWx0ZXJfZ3JhcGhfYWxsb2MoKSkpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICBpZiAoc2ltcGxlKSB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gZmctPm91dHB1dHNbMF0tPm9zdDsKLSAgICAgICAgY2hhciBhcmdzWzUxMl07Ci0gICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICplID0gTlVMTDsKLQotICAgICAgICBhcmdzWzBdID0gMDsKLSAgICAgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQob3N0LT5zd3NfZGljdCwgIiIsIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7Ci0gICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICIlcz0lczoiLCBlLT5rZXksIGUtPnZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RybGVuKGFyZ3MpKQotICAgICAgICAgICAgYXJnc1tzdHJsZW4oYXJncyktMV0gPSAwOwotICAgICAgICBmZy0+Z3JhcGgtPnNjYWxlX3N3c19vcHRzID0gYXZfc3RyZHVwKGFyZ3MpOwotCi0gICAgICAgIGFyZ3NbMF0gPSAwOwotICAgICAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldChvc3QtPnN3cl9vcHRzLCAiIiwgZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKLSAgICAgICAgICAgIGF2X3N0cmxjYXRmKGFyZ3MsIHNpemVvZihhcmdzKSwgIiVzPSVzOiIsIGUtPmtleSwgZS0+dmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdHJsZW4oYXJncykpCi0gICAgICAgICAgICBhcmdzW3N0cmxlbihhcmdzKS0xXSA9IDA7Ci0gICAgICAgIGF2X29wdF9zZXQoZmctPmdyYXBoLCAiYXJlc2FtcGxlX3N3cl9vcHRzIiwgYXJncywgMCk7Ci0KLSAgICAgICAgYXJnc1swXSA9ICdcMCc7Ci0gICAgICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGZnLT5vdXRwdXRzWzBdLT5vc3QtPnJlc2FtcGxlX29wdHMsICIiLCBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewotICAgICAgICAgICAgYXZfc3RybGNhdGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiJXM9JXM6IiwgZS0+a2V5LCBlLT52YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cmxlbihhcmdzKSkKLSAgICAgICAgICAgIGFyZ3Nbc3RybGVuKGFyZ3MpIC0gMV0gPSAnXDAnOwotICAgICAgICBmZy0+Z3JhcGgtPnJlc2FtcGxlX2xhdnJfb3B0cyA9IGF2X3N0cmR1cChhcmdzKTsKLQotICAgICAgICBlID0gYXZfZGljdF9nZXQob3N0LT5lbmNvZGVyX29wdHMsICJ0aHJlYWRzIiwgTlVMTCwgMCk7Ci0gICAgICAgIGlmIChlKQotICAgICAgICAgICAgYXZfb3B0X3NldChmZy0+Z3JhcGgsICJ0aHJlYWRzIiwgZS0+dmFsdWUsIDApOwotICAgIH0KLQotICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfcGFyc2UyKGZnLT5ncmFwaCwgZ3JhcGhfZGVzYywgJmlucHV0cywgJm91dHB1dHMpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBpZiAoc2ltcGxlICYmICghaW5wdXRzIHx8IGlucHV0cy0+bmV4dCB8fCAhb3V0cHV0cyB8fCBvdXRwdXRzLT5uZXh0KSkgewotICAgICAgICBjb25zdCBjaGFyICpudW1faW5wdXRzOwotICAgICAgICBjb25zdCBjaGFyICpudW1fb3V0cHV0czsKLSAgICAgICAgaWYgKCFvdXRwdXRzKSB7Ci0gICAgICAgICAgICBudW1fb3V0cHV0cyA9ICIwIjsKLSAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRzLT5uZXh0KSB7Ci0gICAgICAgICAgICBudW1fb3V0cHV0cyA9ICI+MSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBudW1fb3V0cHV0cyA9ICIxIjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlucHV0cykgewotICAgICAgICAgICAgbnVtX2lucHV0cyA9ICIwIjsKLSAgICAgICAgfSBlbHNlIGlmIChpbnB1dHMtPm5leHQpIHsKLSAgICAgICAgICAgIG51bV9pbnB1dHMgPSAiPjEiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtX2lucHV0cyA9ICIxIjsKLSAgICAgICAgfQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiU2ltcGxlIGZpbHRlcmdyYXBoICclcycgd2FzIGV4cGVjdGVkICIKLSAgICAgICAgICAgICAgICJ0byBoYXZlIGV4YWN0bHkgMSBpbnB1dCBhbmQgMSBvdXRwdXQuIgotICAgICAgICAgICAgICAgIiBIb3dldmVyLCBpdCBoYWQgJXMgaW5wdXQocykgYW5kICVzIG91dHB1dChzKS4iCi0gICAgICAgICAgICAgICAiIFBsZWFzZSBhZGp1c3QsIG9yIHVzZSBhIGNvbXBsZXggZmlsdGVyZ3JhcGggKC1maWx0ZXJfY29tcGxleCkgaW5zdGVhZC5cbiIsCi0gICAgICAgICAgICAgICBncmFwaF9kZXNjLCBudW1faW5wdXRzLCBudW1fb3V0cHV0cyk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotCi0gICAgZm9yIChjdXIgPSBpbnB1dHMsIGkgPSAwOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCwgaSsrKQotICAgICAgICBpZiAoKHJldCA9IGNvbmZpZ3VyZV9pbnB1dF9maWx0ZXIoZmcsIGZnLT5pbnB1dHNbaV0sIGN1cikpIDwgMCkgewotICAgICAgICAgICAgYXZmaWx0ZXJfaW5vdXRfZnJlZSgmaW5wdXRzKTsKLSAgICAgICAgICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJm91dHB1dHMpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJmlucHV0cyk7Ci0KLSAgICBmb3IgKGN1ciA9IG91dHB1dHMsIGkgPSAwOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCwgaSsrKQotICAgICAgICBjb25maWd1cmVfb3V0cHV0X2ZpbHRlcihmZywgZmctPm91dHB1dHNbaV0sIGN1cik7Ci0gICAgYXZmaWx0ZXJfaW5vdXRfZnJlZSgmb3V0cHV0cyk7Ci0KLSAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NvbmZpZyhmZy0+Z3JhcGgsIE5VTEwpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBmZy0+cmVjb25maWd1cmF0aW9uID0gMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBmZy0+bmJfb3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gZmctPm91dHB1dHNbaV0tPm9zdDsKLSAgICAgICAgaWYgKCFvc3QtPmVuYykgewotICAgICAgICAgICAgLyogaWRlbnRpY2FsIHRvIHRoZSBzYW1lIGNoZWNrIGluIGZmbXBlZy5jLCBuZWVkZWQgYmVjYXVzZQotICAgICAgICAgICAgICAgY29tcGxleCBmaWx0ZXIgZ3JhcGhzIGFyZSBpbml0aWFsaXplZCBlYXJsaWVyICovCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRW5jb2RlciAoY29kZWMgJXMpIG5vdCBmb3VuZCBmb3Igb3V0cHV0IHN0cmVhbSAjJWQ6JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKG9zdC0+c3QtPmNvZGVjLT5jb2RlY19pZCksIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChvc3QtPmVuYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKLSAgICAgICAgICAgICEob3N0LT5lbmMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9WQVJJQUJMRV9GUkFNRV9TSVpFKSkKLSAgICAgICAgICAgIGF2X2J1ZmZlcnNpbmtfc2V0X2ZyYW1lX3NpemUob3N0LT5maWx0ZXItPmZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5lbmNfY3R4LT5mcmFtZV9zaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGlzdF9pbl9maWx0ZXJncmFwaChGaWx0ZXJHcmFwaCAqZmcsIElucHV0U3RyZWFtICppc3QpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGZnLT5uYl9pbnB1dHM7IGkrKykKLSAgICAgICAgaWYgKGZnLT5pbnB1dHNbaV0tPmlzdCA9PSBpc3QpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICByZXR1cm4gMDsKLX0KLQpkaWZmIC0tZ2l0IGEvZmZtcGVnX29wdC5jIGIvZmZtcGVnX29wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzgzNTVlLi4wMDAwMDAwCi0tLSBhL2ZmbXBlZ19vcHQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0NTkgKzAsMCBAQAotLyoKLSAqIGZmbXBlZyBvcHRpb24gcGFyc2luZwotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJmZm1wZWcuaCIKLSNpbmNsdWRlICJjbWR1dGlscy5oIgotCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKLQotI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgotCi0jaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCIKLQotI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvdGltZV9pbnRlcm5hbC5oIgotCi0jZGVmaW5lIERFRkFVTFRfUEFTU19MT0dGSUxFTkFNRV9QUkVGSVggImZmbXBlZzJwYXNzIgotCi0jZGVmaW5lIE1BVENIX1BFUl9TVFJFQU1fT1BUKG5hbWUsIHR5cGUsIG91dHZhciwgZm10Y3R4LCBzdClcCi17XAotICAgIGludCBpLCByZXQ7XAotICAgIGZvciAoaSA9IDA7IGkgPCBvLT5uYl8gIyMgbmFtZTsgaSsrKSB7XAotICAgICAgICBjaGFyICpzcGVjID0gby0+bmFtZVtpXS5zcGVjaWZpZXI7XAotICAgICAgICBpZiAoKHJldCA9IGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIoZm10Y3R4LCBzdCwgc3BlYykpID4gMClcCi0gICAgICAgICAgICBvdXR2YXIgPSBvLT5uYW1lW2ldLnUudHlwZTtcCi0gICAgICAgIGVsc2UgaWYgKHJldCA8IDApXAotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpO1wKLSAgICB9XAotfQotCi0jZGVmaW5lIE1BVENIX1BFUl9UWVBFX09QVChuYW1lLCB0eXBlLCBvdXR2YXIsIGZtdGN0eCwgbWVkaWF0eXBlKVwKLXtcCi0gICAgaW50IGk7XAotICAgIGZvciAoaSA9IDA7IGkgPCBvLT5uYl8gIyMgbmFtZTsgaSsrKSB7XAotICAgICAgICBjaGFyICpzcGVjID0gby0+bmFtZVtpXS5zcGVjaWZpZXI7XAotICAgICAgICBpZiAoIXN0cmNtcChzcGVjLCBtZWRpYXR5cGUpKVwKLSAgICAgICAgICAgIG91dHZhciA9IG8tPm5hbWVbaV0udS50eXBlO1wKLSAgICB9XAotfQotCi1jb25zdCBIV0FjY2VsIGh3YWNjZWxzW10gPSB7Ci0jaWYgSEFWRV9WRFBBVV9YMTEKLSAgICB7ICJ2ZHBhdSIsIHZkcGF1X2luaXQsIEhXQUNDRUxfVkRQQVUsIEFWX1BJWF9GTVRfVkRQQVUgfSwKLSNlbmRpZgotI2lmIEhBVkVfRFhWQTJfTElCCi0gICAgeyAiZHh2YTIiLCBkeHZhMl9pbml0LCBIV0FDQ0VMX0RYVkEyLCBBVl9QSVhfRk1UX0RYVkEyX1ZMRCB9LAotI2VuZGlmCi0jaWYgQ09ORklHX1ZEQQotICAgIHsgInZkYSIsICAgdmlkZW90b29sYm94X2luaXQsICAgSFdBQ0NFTF9WREEsICAgQVZfUElYX0ZNVF9WREEgfSwKLSNlbmRpZgotI2lmIENPTkZJR19WSURFT1RPT0xCT1gKLSAgICB7ICJ2aWRlb3Rvb2xib3giLCAgIHZpZGVvdG9vbGJveF9pbml0LCAgIEhXQUNDRUxfVklERU9UT09MQk9YLCAgIEFWX1BJWF9GTVRfVklERU9UT09MQk9YIH0sCi0jZW5kaWYKLSNpZiBDT05GSUdfTElCTUZYCi0gICAgeyAicXN2IiwgICBxc3ZfaW5pdCwgICBIV0FDQ0VMX1FTViwgICBBVl9QSVhfRk1UX1FTViB9LAotI2VuZGlmCi0gICAgeyAwIH0sCi19OwotCi1jaGFyICp2c3RhdHNfZmlsZW5hbWU7Ci1jaGFyICpzZHBfZmlsZW5hbWU7Ci0KLWZsb2F0IGF1ZGlvX2RyaWZ0X3RocmVzaG9sZCA9IDAuMTsKLWZsb2F0IGR0c19kZWx0YV90aHJlc2hvbGQgICA9IDEwOwotZmxvYXQgZHRzX2Vycm9yX3RocmVzaG9sZCAgID0gMzYwMCozMDsKLQotaW50IGF1ZGlvX3ZvbHVtZSAgICAgID0gMjU2OwotaW50IGF1ZGlvX3N5bmNfbWV0aG9kID0gMDsKLWludCB2aWRlb19zeW5jX21ldGhvZCA9IFZTWU5DX0FVVE87Ci1mbG9hdCBmcmFtZV9kcm9wX3RocmVzaG9sZCA9IDA7Ci1pbnQgZG9fZGVpbnRlcmxhY2UgICAgPSAwOwotaW50IGRvX2JlbmNobWFyayAgICAgID0gMDsKLWludCBkb19iZW5jaG1hcmtfYWxsICA9IDA7Ci1pbnQgZG9faGV4X2R1bXAgICAgICAgPSAwOwotaW50IGRvX3BrdF9kdW1wICAgICAgID0gMDsKLWludCBjb3B5X3RzICAgICAgICAgICA9IDA7Ci1pbnQgc3RhcnRfYXRfemVybyAgICAgPSAwOwotaW50IGNvcHlfdGIgICAgICAgICAgID0gLTE7Ci1pbnQgZGVidWdfdHMgICAgICAgICAgPSAwOwotaW50IGV4aXRfb25fZXJyb3IgICAgID0gMDsKLWludCBhYm9ydF9vbl9mbGFncyAgICA9IDA7Ci1pbnQgcHJpbnRfc3RhdHMgICAgICAgPSAtMTsKLWludCBxcF9oaXN0ICAgICAgICAgICA9IDA7Ci1pbnQgc3RkaW5faW50ZXJhY3Rpb24gPSAxOwotaW50IGZyYW1lX2JpdHNfcGVyX3Jhd19zYW1wbGUgPSAwOwotZmxvYXQgbWF4X2Vycm9yX3JhdGUgID0gMi4wLzM7Ci0KLQotc3RhdGljIGludCBpbnRyYV9vbmx5ICAgICAgICAgPSAwOwotc3RhdGljIGludCBmaWxlX292ZXJ3cml0ZSAgICAgPSAwOwotc3RhdGljIGludCBub19maWxlX292ZXJ3cml0ZSAgPSAwOwotc3RhdGljIGludCBkb19wc25yICAgICAgICAgICAgPSAwOwotc3RhdGljIGludCBpbnB1dF9zeW5jOwotc3RhdGljIGludCBvdmVycmlkZV9mZnNlcnZlciAgPSAwOwotc3RhdGljIGludCBpbnB1dF9zdHJlYW1fcG90ZW50aWFsbHlfYXZhaWxhYmxlID0gMDsKLXN0YXRpYyBpbnQgaWdub3JlX3Vua25vd25fc3RyZWFtcyA9IDA7Ci1zdGF0aWMgaW50IGNvcHlfdW5rbm93bl9zdHJlYW1zID0gMDsKLQotc3RhdGljIHZvaWQgdW5pbml0X29wdGlvbnMoT3B0aW9uc0NvbnRleHQgKm8pCi17Ci0gICAgY29uc3QgT3B0aW9uRGVmICpwbyA9IG9wdGlvbnM7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBhbGwgT1BUX1NQRUMgYW5kIE9QVF9TVFJJTkcgY2FuIGJlIGZyZWVkIGluIGdlbmVyaWMgd2F5ICovCi0gICAgd2hpbGUgKHBvLT5uYW1lKSB7Ci0gICAgICAgIHZvaWQgKmRzdCA9ICh1aW50OF90KilvICsgcG8tPnUub2ZmOwotCi0gICAgICAgIGlmIChwby0+ZmxhZ3MgJiBPUFRfU1BFQykgewotICAgICAgICAgICAgU3BlY2lmaWVyT3B0ICoqc28gPSBkc3Q7Ci0gICAgICAgICAgICBpbnQgaSwgKmNvdW50ID0gKGludCopKHNvICsgMSk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBhdl9mcmVlcCgmKCpzbylbaV0uc3BlY2lmaWVyKTsKLSAgICAgICAgICAgICAgICBpZiAocG8tPmZsYWdzICYgT1BUX1NUUklORykKLSAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJigqc28pW2ldLnUuc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF2X2ZyZWVwKHNvKTsKLSAgICAgICAgICAgICpjb3VudCA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAocG8tPmZsYWdzICYgT1BUX09GRlNFVCAmJiBwby0+ZmxhZ3MgJiBPUFRfU1RSSU5HKQotICAgICAgICAgICAgYXZfZnJlZXAoZHN0KTsKLSAgICAgICAgcG8rKzsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgby0+bmJfc3RyZWFtX21hcHM7IGkrKykKLSAgICAgICAgYXZfZnJlZXAoJm8tPnN0cmVhbV9tYXBzW2ldLmxpbmtsYWJlbCk7Ci0gICAgYXZfZnJlZXAoJm8tPnN0cmVhbV9tYXBzKTsKLSAgICBhdl9mcmVlcCgmby0+YXVkaW9fY2hhbm5lbF9tYXBzKTsKLSAgICBhdl9mcmVlcCgmby0+c3RyZWFtaWRfbWFwKTsKLSAgICBhdl9mcmVlcCgmby0+YXR0YWNobWVudHMpOwotfQotCi1zdGF0aWMgdm9pZCBpbml0X29wdGlvbnMoT3B0aW9uc0NvbnRleHQgKm8pCi17Ci0gICAgbWVtc2V0KG8sIDAsIHNpemVvZigqbykpOwotCi0gICAgby0+c3RvcF90aW1lID0gSU5UNjRfTUFYOwotICAgIG8tPm11eF9tYXhfZGVsYXkgID0gMC43OwotICAgIG8tPnN0YXJ0X3RpbWUgICAgID0gQVZfTk9QVFNfVkFMVUU7Ci0gICAgby0+c3RhcnRfdGltZV9lb2YgPSBBVl9OT1BUU19WQUxVRTsKLSAgICBvLT5yZWNvcmRpbmdfdGltZSA9IElOVDY0X01BWDsKLSAgICBvLT5saW1pdF9maWxlc2l6ZSA9IFVJTlQ2NF9NQVg7Ci0gICAgby0+Y2hhcHRlcnNfaW5wdXRfZmlsZSA9IElOVF9NQVg7Ci0gICAgby0+YWNjdXJhdGVfc2VlayAgPSAxOwotfQotCi1zdGF0aWMgaW50IHNob3dfaHdhY2NlbHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBpbnQgaTsKLQotICAgIHByaW50ZigiSGFyZHdhcmUgYWNjZWxlcmF0aW9uIG1ldGhvZHM6XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaHdhY2NlbHMpIC0gMTsgaSsrKSB7Ci0gICAgICAgIHByaW50ZigiJXNcbiIsIGh3YWNjZWxzW2ldLm5hbWUpOwotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIHJldHVybiBhIGNvcHkgb2YgdGhlIGlucHV0IHdpdGggdGhlIHN0cmVhbSBzcGVjaWZpZXJzIHJlbW92ZWQgZnJvbSB0aGUga2V5cyAqLwotc3RhdGljIEFWRGljdGlvbmFyeSAqc3RyaXBfc3BlY2lmaWVycyhBVkRpY3Rpb25hcnkgKmRpY3QpCi17Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUgPSBOVUxMOwotICAgIEFWRGljdGlvbmFyeSAgICAqcmV0ID0gTlVMTDsKLQotICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewotICAgICAgICBjaGFyICpwID0gc3RyY2hyKGUtPmtleSwgJzonKTsKLQotICAgICAgICBpZiAocCkKLSAgICAgICAgICAgICpwID0gMDsKLSAgICAgICAgYXZfZGljdF9zZXQoJnJldCwgZS0+a2V5LCBlLT52YWx1ZSwgMCk7Ci0gICAgICAgIGlmIChwKQotICAgICAgICAgICAgKnAgPSAnOic7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X2Fib3J0X29uKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdHNbXSA9IHsKLSAgICAgICAgeyAiYWJvcnRfb24iICAgICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0ZMQUdTLCB7IC5pNjQgPSAwIH0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCAudW5pdCA9ICJmbGFncyIgfSwKLSAgICAgICAgeyAiZW1wdHlfb3V0cHV0IiAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBQk9SVF9PTl9GTEFHX0VNUFRZX09VVFBVVCAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCi0gICAgICAgIHsgTlVMTCB9LAotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IEFWQ2xhc3MgY2xhc3MgPSB7Ci0gICAgICAgIC5jbGFzc19uYW1lID0gIiIsCi0gICAgICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgICAgIC5vcHRpb24gICAgID0gb3B0cywKLSAgICAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi0gICAgfTsKLSAgICBjb25zdCBBVkNsYXNzICpwY2xhc3MgPSAmY2xhc3M7Ci0KLSAgICByZXR1cm4gYXZfb3B0X2V2YWxfZmxhZ3MoJnBjbGFzcywgJm9wdHNbMF0sIGFyZywgJmFib3J0X29uX2ZsYWdzKTsKLX0KLQotc3RhdGljIGludCBvcHRfc2FtZXEodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3B0aW9uICclcycgd2FzIHJlbW92ZWQuICIKLSAgICAgICAgICAgIklmIHlvdSBhcmUgbG9va2luZyBmb3IgYW4gb3B0aW9uIHRvIHByZXNlcnZlIHRoZSBxdWFsaXR5ICh3aGljaCBpcyBub3QgIgotICAgICAgICAgICAid2hhdCAtJXMgd2FzIGZvciksIHVzZSAtcXNjYWxlIDAgb3IgYW4gZXF1aXZhbGVudCBxdWFsaXR5IGZhY3RvciBvcHRpb24uXG4iLAotICAgICAgICAgICBvcHQsIG9wdCk7Ci0gICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLX0KLQotc3RhdGljIGludCBvcHRfdmlkZW9fY2hhbm5lbCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSAtY2hhbm5lbC5cbiIpOwotICAgIHJldHVybiBvcHRfZGVmYXVsdChvcHRjdHgsICJjaGFubmVsIiwgYXJnKTsKLX0KLQotc3RhdGljIGludCBvcHRfdmlkZW9fc3RhbmRhcmQodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJUaGlzIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLXN0YW5kYXJkLlxuIik7Ci0gICAgcmV0dXJuIG9wdF9kZWZhdWx0KG9wdGN0eCwgInN0YW5kYXJkIiwgYXJnKTsKLX0KLQotc3RhdGljIGludCBvcHRfYXVkaW9fY29kZWModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJjb2RlYzphIiwgYXJnLCBvcHRpb25zKTsKLX0KLQotc3RhdGljIGludCBvcHRfdmlkZW9fY29kZWModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJjb2RlYzp2IiwgYXJnLCBvcHRpb25zKTsKLX0KLQotc3RhdGljIGludCBvcHRfc3VidGl0bGVfY29kZWModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJjb2RlYzpzIiwgYXJnLCBvcHRpb25zKTsKLX0KLQotc3RhdGljIGludCBvcHRfZGF0YV9jb2RlYyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OwotICAgIHJldHVybiBwYXJzZV9vcHRpb24obywgImNvZGVjOmQiLCBhcmcsIG9wdGlvbnMpOwotfQotCi1zdGF0aWMgaW50IG9wdF9tYXAodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICBTdHJlYW1NYXAgKm0gPSBOVUxMOwotICAgIGludCBpLCBuZWdhdGl2ZSA9IDAsIGZpbGVfaWR4OwotICAgIGludCBzeW5jX2ZpbGVfaWR4ID0gLTEsIHN5bmNfc3RyZWFtX2lkeCA9IDA7Ci0gICAgY2hhciAqcCwgKnN5bmM7Ci0gICAgY2hhciAqbWFwOwotICAgIGNoYXIgKmFsbG93X3VudXNlZDsKLQotICAgIGlmICgqYXJnID09ICctJykgewotICAgICAgICBuZWdhdGl2ZSA9IDE7Ci0gICAgICAgIGFyZysrOwotICAgIH0KLSAgICBtYXAgPSBhdl9zdHJkdXAoYXJnKTsKLSAgICBpZiAoIW1hcCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIC8qIHBhcnNlIHN5bmMgc3RyZWFtIGZpcnN0LCBqdXN0IHBpY2sgZmlyc3QgbWF0Y2hpbmcgc3RyZWFtICovCi0gICAgaWYgKHN5bmMgPSBzdHJjaHIobWFwLCAnLCcpKSB7Ci0gICAgICAgICpzeW5jID0gMDsKLSAgICAgICAgc3luY19maWxlX2lkeCA9IHN0cnRvbChzeW5jICsgMSwgJnN5bmMsIDApOwotICAgICAgICBpZiAoc3luY19maWxlX2lkeCA+PSBuYl9pbnB1dF9maWxlcyB8fCBzeW5jX2ZpbGVfaWR4IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgc3luYyBmaWxlIGluZGV4OiAlZC5cbiIsIHN5bmNfZmlsZV9pZHgpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgqc3luYykKLSAgICAgICAgICAgIHN5bmMrKzsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGlucHV0X2ZpbGVzW3N5bmNfZmlsZV9pZHhdLT5uYl9zdHJlYW1zOyBpKyspCi0gICAgICAgICAgICBpZiAoY2hlY2tfc3RyZWFtX3NwZWNpZmllcihpbnB1dF9maWxlc1tzeW5jX2ZpbGVfaWR4XS0+Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZmlsZXNbc3luY19maWxlX2lkeF0tPmN0eC0+c3RyZWFtc1tpXSwgc3luYykgPT0gMSkgewotICAgICAgICAgICAgICAgIHN5bmNfc3RyZWFtX2lkeCA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGlmIChpID09IGlucHV0X2ZpbGVzW3N5bmNfZmlsZV9pZHhdLT5uYl9zdHJlYW1zKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU3luYyBzdHJlYW0gc3BlY2lmaWNhdGlvbiBpbiBtYXAgJXMgZG9lcyBub3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoIGFueSBzdHJlYW1zLlxuIiwgYXJnKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgaWYgKG1hcFswXSA9PSAnWycpIHsKLSAgICAgICAgLyogdGhpcyBtYXBwaW5nIHJlZmVycyB0byBsYXZmaSBvdXRwdXQgKi8KLSAgICAgICAgY29uc3QgY2hhciAqYyA9IG1hcCArIDE7Ci0gICAgICAgIEdST1dfQVJSQVkoby0+c3RyZWFtX21hcHMsIG8tPm5iX3N0cmVhbV9tYXBzKTsKLSAgICAgICAgbSA9ICZvLT5zdHJlYW1fbWFwc1tvLT5uYl9zdHJlYW1fbWFwcyAtIDFdOwotICAgICAgICBtLT5saW5rbGFiZWwgPSBhdl9nZXRfdG9rZW4oJmMsICJdIik7Ci0gICAgICAgIGlmICghbS0+bGlua2xhYmVsKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBvdXRwdXQgbGluayBsYWJlbDogJXMuXG4iLCBtYXApOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGFsbG93X3VudXNlZCA9IHN0cmNocihtYXAsICc/JykpCi0gICAgICAgICAgICAqYWxsb3dfdW51c2VkID0gMDsKLSAgICAgICAgZmlsZV9pZHggPSBzdHJ0b2wobWFwLCAmcCwgMCk7Ci0gICAgICAgIGlmIChmaWxlX2lkeCA+PSBuYl9pbnB1dF9maWxlcyB8fCBmaWxlX2lkeCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGlucHV0IGZpbGUgaW5kZXg6ICVkLlxuIiwgZmlsZV9pZHgpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWdhdGl2ZSkKLSAgICAgICAgICAgIC8qIGRpc2FibGUgc29tZSBhbHJlYWR5IGRlZmluZWQgbWFwcyAqLwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG8tPm5iX3N0cmVhbV9tYXBzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtID0gJm8tPnN0cmVhbV9tYXBzW2ldOwotICAgICAgICAgICAgICAgIGlmIChmaWxlX2lkeCA9PSBtLT5maWxlX2luZGV4ICYmCi0gICAgICAgICAgICAgICAgICAgIGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIoaW5wdXRfZmlsZXNbbS0+ZmlsZV9pbmRleF0tPmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9maWxlc1ttLT5maWxlX2luZGV4XS0+Y3R4LT5zdHJlYW1zW20tPnN0cmVhbV9pbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPT0gJzonID8gcCArIDEgOiBwKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIG0tPmRpc2FibGVkID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlucHV0X2ZpbGVzW2ZpbGVfaWR4XS0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIoaW5wdXRfZmlsZXNbZmlsZV9pZHhdLT5jdHgsIGlucHV0X2ZpbGVzW2ZpbGVfaWR4XS0+Y3R4LT5zdHJlYW1zW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwID09ICc6JyA/IHAgKyAxIDogcCkgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgR1JPV19BUlJBWShvLT5zdHJlYW1fbWFwcywgby0+bmJfc3RyZWFtX21hcHMpOwotICAgICAgICAgICAgICAgIG0gPSAmby0+c3RyZWFtX21hcHNbby0+bmJfc3RyZWFtX21hcHMgLSAxXTsKLQotICAgICAgICAgICAgICAgIG0tPmZpbGVfaW5kZXggICA9IGZpbGVfaWR4OwotICAgICAgICAgICAgICAgIG0tPnN0cmVhbV9pbmRleCA9IGk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3luY19maWxlX2lkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG0tPnN5bmNfZmlsZV9pbmRleCAgID0gc3luY19maWxlX2lkeDsKLSAgICAgICAgICAgICAgICAgICAgbS0+c3luY19zdHJlYW1faW5kZXggPSBzeW5jX3N0cmVhbV9pZHg7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbS0+c3luY19maWxlX2luZGV4ICAgPSBmaWxlX2lkeDsKLSAgICAgICAgICAgICAgICAgICAgbS0+c3luY19zdHJlYW1faW5kZXggPSBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIW0pIHsKLSAgICAgICAgaWYgKGFsbG93X3VudXNlZCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiU3RyZWFtIG1hcCAnJXMnIG1hdGNoZXMgbm8gc3RyZWFtczsgaWdub3JpbmcuXG4iLCBhcmcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlN0cmVhbSBtYXAgJyVzJyBtYXRjaGVzIG5vIHN0cmVhbXMuXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG8gaWdub3JlIHRoaXMsIGFkZCBhIHRyYWlsaW5nICc/JyB0byB0aGUgbWFwLlxuIiwgYXJnKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGF2X2ZyZWVwKCZtYXApOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9wdF9hdHRhY2godm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICBHUk9XX0FSUkFZKG8tPmF0dGFjaG1lbnRzLCBvLT5uYl9hdHRhY2htZW50cyk7Ci0gICAgby0+YXR0YWNobWVudHNbby0+bmJfYXR0YWNobWVudHMgLSAxXSA9IGFyZzsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvcHRfbWFwX2NoYW5uZWwodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICBpbnQgbjsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgQXVkaW9DaGFubmVsTWFwICptOwotCi0gICAgR1JPV19BUlJBWShvLT5hdWRpb19jaGFubmVsX21hcHMsIG8tPm5iX2F1ZGlvX2NoYW5uZWxfbWFwcyk7Ci0gICAgbSA9ICZvLT5hdWRpb19jaGFubmVsX21hcHNbby0+bmJfYXVkaW9fY2hhbm5lbF9tYXBzIC0gMV07Ci0KLSAgICAvKiBtdXRlZCBjaGFubmVsIHN5bnRheCAqLwotICAgIG4gPSBzc2NhbmYoYXJnLCAiJWQ6JWQuJWQiLCAmbS0+Y2hhbm5lbF9pZHgsICZtLT5vZmlsZV9pZHgsICZtLT5vc3RyZWFtX2lkeCk7Ci0gICAgaWYgKChuID09IDEgfHwgbiA9PSAzKSAmJiBtLT5jaGFubmVsX2lkeCA9PSAtMSkgewotICAgICAgICBtLT5maWxlX2lkeCA9IG0tPnN0cmVhbV9pZHggPSAtMTsKLSAgICAgICAgaWYgKG4gPT0gMSkKLSAgICAgICAgICAgIG0tPm9maWxlX2lkeCA9IG0tPm9zdHJlYW1faWR4ID0gLTE7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIG5vcm1hbCBzeW50YXggKi8KLSAgICBuID0gc3NjYW5mKGFyZywgIiVkLiVkLiVkOiVkLiVkIiwKLSAgICAgICAgICAgICAgICZtLT5maWxlX2lkeCwgICZtLT5zdHJlYW1faWR4LCAmbS0+Y2hhbm5lbF9pZHgsCi0gICAgICAgICAgICAgICAmbS0+b2ZpbGVfaWR4LCAmbS0+b3N0cmVhbV9pZHgpOwotCi0gICAgaWYgKG4gIT0gMyAmJiBuICE9IDUpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlN5bnRheCBlcnJvciwgbWFwY2hhbiB1c2FnZTogIgotICAgICAgICAgICAgICAgIltmaWxlLnN0cmVhbS5jaGFubmVsfC0xXVs6c3luY2ZpbGU6c3luY3N0cmVhbV1cbiIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgaWYgKG4gIT0gNSkgLy8gb25seSBmaWxlLnN0cmVhbS5jaGFubmVsIHNwZWNpZmllZAotICAgICAgICBtLT5vZmlsZV9pZHggPSBtLT5vc3RyZWFtX2lkeCA9IC0xOwotCi0gICAgLyogY2hlY2sgaW5wdXQgKi8KLSAgICBpZiAobS0+ZmlsZV9pZHggPCAwIHx8IG0tPmZpbGVfaWR4ID49IG5iX2lucHV0X2ZpbGVzKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJtYXBjaGFuOiBpbnZhbGlkIGlucHV0IGZpbGUgaW5kZXg6ICVkXG4iLAotICAgICAgICAgICAgICAgbS0+ZmlsZV9pZHgpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotICAgIGlmIChtLT5zdHJlYW1faWR4IDwgMCB8fAotICAgICAgICBtLT5zdHJlYW1faWR4ID49IGlucHV0X2ZpbGVzW20tPmZpbGVfaWR4XS0+bmJfc3RyZWFtcykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAibWFwY2hhbjogaW52YWxpZCBpbnB1dCBmaWxlIHN0cmVhbSBpbmRleCAjJWQuJWRcbiIsCi0gICAgICAgICAgICAgICBtLT5maWxlX2lkeCwgbS0+c3RyZWFtX2lkeCk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0gICAgc3QgPSBpbnB1dF9maWxlc1ttLT5maWxlX2lkeF0tPmN0eC0+c3RyZWFtc1ttLT5zdHJlYW1faWR4XTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAibWFwY2hhbjogc3RyZWFtICMlZC4lZCBpcyBub3QgYW4gYXVkaW8gc3RyZWFtLlxuIiwKLSAgICAgICAgICAgICAgIG0tPmZpbGVfaWR4LCBtLT5zdHJlYW1faWR4KTsKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIH0KLSAgICBpZiAobS0+Y2hhbm5lbF9pZHggPCAwIHx8IG0tPmNoYW5uZWxfaWR4ID49IHN0LT5jb2RlYy0+Y2hhbm5lbHMpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIm1hcGNoYW46IGludmFsaWQgYXVkaW8gY2hhbm5lbCAjJWQuJWQuJWRcbiIsCi0gICAgICAgICAgICAgICBtLT5maWxlX2lkeCwgbS0+c3RyZWFtX2lkeCwgbS0+Y2hhbm5lbF9pZHgpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9wdF9zZHBfZmlsZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGF2X2ZyZWUoc2RwX2ZpbGVuYW1lKTsKLSAgICBzZHBfZmlsZW5hbWUgPSBhdl9zdHJkdXAoYXJnKTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBQYXJzZSBhIG1ldGFkYXRhIHNwZWNpZmllciBwYXNzZWQgYXMgJ2FyZycgcGFyYW1ldGVyLgotICogQHBhcmFtIGFyZyAgbWV0YWRhdGEgc3RyaW5nIHRvIHBhcnNlCi0gKiBAcGFyYW0gdHlwZSBtZXRhZGF0YSB0eXBlIGlzIHdyaXR0ZW4gaGVyZSAtLSBnKGxvYmFsKS9zKHRyZWFtKS9jKGhhcHRlcikvcChyb2dyYW0pCi0gKiBAcGFyYW0gaW5kZXggZm9yIHR5cGUgYy9wLCBjaGFwdGVyL3Byb2dyYW0gaW5kZXggaXMgd3JpdHRlbiBoZXJlCi0gKiBAcGFyYW0gc3RyZWFtX3NwZWMgZm9yIHR5cGUgcywgdGhlIHN0cmVhbSBzcGVjaWZpZXIgaXMgd3JpdHRlbiBoZXJlCi0gKi8KLXN0YXRpYyB2b2lkIHBhcnNlX21ldGFfdHlwZShjaGFyICphcmcsIGNoYXIgKnR5cGUsIGludCAqaW5kZXgsIGNvbnN0IGNoYXIgKipzdHJlYW1fc3BlYykKLXsKLSAgICBpZiAoKmFyZykgewotICAgICAgICAqdHlwZSA9ICphcmc7Ci0gICAgICAgIHN3aXRjaCAoKmFyZykgewotICAgICAgICBjYXNlICdnJzoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgIGlmICgqKCsrYXJnKSAmJiAqYXJnICE9ICc6JykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIG1ldGFkYXRhIHNwZWNpZmllciAlcy5cbiIsIGFyZyk7Ci0gICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnN0cmVhbV9zcGVjID0gKmFyZyA9PSAnOicgPyBhcmcgKyAxIDogIiI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnYyc6Ci0gICAgICAgIGNhc2UgJ3AnOgotICAgICAgICAgICAgaWYgKCooKythcmcpID09ICc6JykKLSAgICAgICAgICAgICAgICAqaW5kZXggPSBzdHJ0b2woKythcmcsIE5VTEwsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBtZXRhZGF0YSB0eXBlICVjLlxuIiwgKmFyZyk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UKLSAgICAgICAgKnR5cGUgPSAnZyc7Ci19Ci0KLXN0YXRpYyBpbnQgY29weV9tZXRhZGF0YShjaGFyICpvdXRzcGVjLCBjaGFyICppbnNwZWMsIEFWRm9ybWF0Q29udGV4dCAqb2MsIEFWRm9ybWF0Q29udGV4dCAqaWMsIE9wdGlvbnNDb250ZXh0ICpvKQotewotICAgIEFWRGljdGlvbmFyeSAqKm1ldGFfaW4gPSBOVUxMOwotICAgIEFWRGljdGlvbmFyeSAqKm1ldGFfb3V0ID0gTlVMTDsKLSAgICBpbnQgaSwgcmV0ID0gMDsKLSAgICBjaGFyIHR5cGVfaW4sIHR5cGVfb3V0OwotICAgIGNvbnN0IGNoYXIgKmlzdHJlYW1fc3BlYyA9IE5VTEwsICpvc3RyZWFtX3NwZWMgPSBOVUxMOwotICAgIGludCBpZHhfaW4gPSAwLCBpZHhfb3V0ID0gMDsKLQotICAgIHBhcnNlX21ldGFfdHlwZShpbnNwZWMsICAmdHlwZV9pbiwgICZpZHhfaW4sICAmaXN0cmVhbV9zcGVjKTsKLSAgICBwYXJzZV9tZXRhX3R5cGUob3V0c3BlYywgJnR5cGVfb3V0LCAmaWR4X291dCwgJm9zdHJlYW1fc3BlYyk7Ci0KLSAgICBpZiAoIWljKSB7Ci0gICAgICAgIGlmICh0eXBlX291dCA9PSAnZycgfHwgISpvdXRzcGVjKQotICAgICAgICAgICAgby0+bWV0YWRhdGFfZ2xvYmFsX21hbnVhbCA9IDE7Ci0gICAgICAgIGlmICh0eXBlX291dCA9PSAncycgfHwgISpvdXRzcGVjKQotICAgICAgICAgICAgby0+bWV0YWRhdGFfc3RyZWFtc19tYW51YWwgPSAxOwotICAgICAgICBpZiAodHlwZV9vdXQgPT0gJ2MnIHx8ICEqb3V0c3BlYykKLSAgICAgICAgICAgIG8tPm1ldGFkYXRhX2NoYXB0ZXJzX21hbnVhbCA9IDE7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICh0eXBlX2luID09ICdnJyB8fCB0eXBlX291dCA9PSAnZycpCi0gICAgICAgIG8tPm1ldGFkYXRhX2dsb2JhbF9tYW51YWwgPSAxOwotICAgIGlmICh0eXBlX2luID09ICdzJyB8fCB0eXBlX291dCA9PSAncycpCi0gICAgICAgIG8tPm1ldGFkYXRhX3N0cmVhbXNfbWFudWFsID0gMTsKLSAgICBpZiAodHlwZV9pbiA9PSAnYycgfHwgdHlwZV9vdXQgPT0gJ2MnKQotICAgICAgICBvLT5tZXRhZGF0YV9jaGFwdGVyc19tYW51YWwgPSAxOwotCi0gICAgLyogaWMgaXMgTlVMTCB3aGVuIGp1c3QgZGlzYWJsaW5nIGF1dG9tYXRpYyBtYXBwaW5ncyAqLwotICAgIGlmICghaWMpCi0gICAgICAgIHJldHVybiAwOwotCi0jZGVmaW5lIE1FVEFEQVRBX0NIRUNLX0lOREVYKGluZGV4LCBuYl9lbGVtcywgZGVzYylcCi0gICAgaWYgKChpbmRleCkgPCAwIHx8IChpbmRleCkgPj0gKG5iX2VsZW1zKSkge1wKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgJXMgaW5kZXggJWQgd2hpbGUgcHJvY2Vzc2luZyBtZXRhZGF0YSBtYXBzLlxuIixcCi0gICAgICAgICAgICAgICAgKGRlc2MpLCAoaW5kZXgpKTtcCi0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTtcCi0gICAgfQotCi0jZGVmaW5lIFNFVF9ESUNUKHR5cGUsIG1ldGEsIGNvbnRleHQsIGluZGV4KVwKLSAgICAgICAgc3dpdGNoICh0eXBlKSB7XAotICAgICAgICBjYXNlICdnJzpcCi0gICAgICAgICAgICBtZXRhID0gJmNvbnRleHQtPm1ldGFkYXRhO1wKLSAgICAgICAgICAgIGJyZWFrO1wKLSAgICAgICAgY2FzZSAnYyc6XAotICAgICAgICAgICAgTUVUQURBVEFfQ0hFQ0tfSU5ERVgoaW5kZXgsIGNvbnRleHQtPm5iX2NoYXB0ZXJzLCAiY2hhcHRlciIpXAotICAgICAgICAgICAgbWV0YSA9ICZjb250ZXh0LT5jaGFwdGVyc1tpbmRleF0tPm1ldGFkYXRhO1wKLSAgICAgICAgICAgIGJyZWFrO1wKLSAgICAgICAgY2FzZSAncCc6XAotICAgICAgICAgICAgTUVUQURBVEFfQ0hFQ0tfSU5ERVgoaW5kZXgsIGNvbnRleHQtPm5iX3Byb2dyYW1zLCAicHJvZ3JhbSIpXAotICAgICAgICAgICAgbWV0YSA9ICZjb250ZXh0LT5wcm9ncmFtc1tpbmRleF0tPm1ldGFkYXRhO1wKLSAgICAgICAgICAgIGJyZWFrO1wKLSAgICAgICAgY2FzZSAncyc6XAotICAgICAgICAgICAgYnJlYWs7IC8qIGhhbmRsZWQgc2VwYXJhdGVseSBiZWxvdyAqLyBcCi0gICAgICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDAoMCk7XAotICAgICAgICB9XAotCi0gICAgU0VUX0RJQ1QodHlwZV9pbiwgbWV0YV9pbiwgaWMsIGlkeF9pbik7Ci0gICAgU0VUX0RJQ1QodHlwZV9vdXQsIG1ldGFfb3V0LCBvYywgaWR4X291dCk7Ci0KLSAgICAvKiBmb3IgaW5wdXQgc3RyZWFtcyBjaG9vc2UgZmlyc3QgbWF0Y2hpbmcgc3RyZWFtICovCi0gICAgaWYgKHR5cGVfaW4gPT0gJ3MnKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIoaWMsIGljLT5zdHJlYW1zW2ldLCBpc3RyZWFtX3NwZWMpKSA+IDApIHsKLSAgICAgICAgICAgICAgICBtZXRhX2luID0gJmljLT5zdHJlYW1zW2ldLT5tZXRhZGF0YTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtZXRhX2luKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU3RyZWFtIHNwZWNpZmllciAlcyBkb2VzIG5vdCBtYXRjaCAgYW55IHN0cmVhbXMuXG4iLCBpc3RyZWFtX3NwZWMpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHR5cGVfb3V0ID09ICdzJykgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2MtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgaWYgKChyZXQgPSBjaGVja19zdHJlYW1fc3BlY2lmaWVyKG9jLCBvYy0+c3RyZWFtc1tpXSwgb3N0cmVhbV9zcGVjKSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbWV0YV9vdXQgPSAmb2MtPnN0cmVhbXNbaV0tPm1ldGFkYXRhOwotICAgICAgICAgICAgICAgIGF2X2RpY3RfY29weShtZXRhX291dCwgKm1ldGFfaW4sIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBhdl9kaWN0X2NvcHkobWV0YV9vdXQsICptZXRhX2luLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9wdF9yZWNvcmRpbmdfdGltZXN0YW1wKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7Ci0gICAgY2hhciBidWZbMTI4XTsKLSAgICBpbnQ2NF90IHJlY29yZGluZ190aW1lc3RhbXAgPSBwYXJzZV90aW1lX29yX2RpZShvcHQsIGFyZywgMCkgLyAxRTY7Ci0gICAgc3RydWN0IHRtIHRpbWUgPSAqZ210aW1lKCh0aW1lX3QqKSZyZWNvcmRpbmdfdGltZXN0YW1wKTsKLSAgICBpZiAoIXN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJjcmVhdGlvbl90aW1lPSVZLSVtLSVkVCVIOiVNOiVTJXoiLCAmdGltZSkpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBwYXJzZV9vcHRpb24obywgIm1ldGFkYXRhIiwgYnVmLCBvcHRpb25zKTsKLQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIiVzIGlzIGRlcHJlY2F0ZWQsIHNldCB0aGUgJ2NyZWF0aW9uX3RpbWUnIG1ldGFkYXRhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWcgaW5zdGVhZC5cbiIsIG9wdCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBBVkNvZGVjICpmaW5kX2NvZGVjX29yX2RpZShjb25zdCBjaGFyICpuYW1lLCBlbnVtIEFWTWVkaWFUeXBlIHR5cGUsIGludCBlbmNvZGVyKQotewotICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjOwotICAgIGNvbnN0IGNoYXIgKmNvZGVjX3N0cmluZyA9IGVuY29kZXIgPyAiZW5jb2RlciIgOiAiZGVjb2RlciI7Ci0gICAgQVZDb2RlYyAqY29kZWM7Ci0KLSAgICBjb2RlYyA9IGVuY29kZXIgPwotICAgICAgICBhdmNvZGVjX2ZpbmRfZW5jb2Rlcl9ieV9uYW1lKG5hbWUpIDoKLSAgICAgICAgYXZjb2RlY19maW5kX2RlY29kZXJfYnlfbmFtZShuYW1lKTsKLQotICAgIGlmICghY29kZWMgJiYgKGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0X2J5X25hbWUobmFtZSkpKSB7Ci0gICAgICAgIGNvZGVjID0gZW5jb2RlciA/IGF2Y29kZWNfZmluZF9lbmNvZGVyKGRlc2MtPmlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZmluZF9kZWNvZGVyKGRlc2MtPmlkKTsKLSAgICAgICAgaWYgKGNvZGVjKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiTWF0Y2hlZCAlcyAnJXMnIGZvciBjb2RlYyAnJXMnLlxuIiwKLSAgICAgICAgICAgICAgICAgICBjb2RlY19zdHJpbmcsIGNvZGVjLT5uYW1lLCBkZXNjLT5uYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoIWNvZGVjKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbmtub3duICVzICclcydcbiIsIGNvZGVjX3N0cmluZywgbmFtZSk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0gICAgaWYgKGNvZGVjLT50eXBlICE9IHR5cGUpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgJXMgdHlwZSAnJXMnXG4iLCBjb2RlY19zdHJpbmcsIG5hbWUpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotICAgIHJldHVybiBjb2RlYzsKLX0KLQotc3RhdGljIEFWQ29kZWMgKmNob29zZV9kZWNvZGVyKE9wdGlvbnNDb250ZXh0ICpvLCBBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKLXsKLSAgICBjaGFyICpjb2RlY19uYW1lID0gTlVMTDsKLQotICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGNvZGVjX25hbWVzLCBzdHIsIGNvZGVjX25hbWUsIHMsIHN0KTsKLSAgICBpZiAoY29kZWNfbmFtZSkgewotICAgICAgICBBVkNvZGVjICpjb2RlYyA9IGZpbmRfY29kZWNfb3JfZGllKGNvZGVjX25hbWUsIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSwgMCk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBjb2RlYy0+aWQ7Ci0gICAgICAgIHJldHVybiBjb2RlYzsKLSAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIGF2Y29kZWNfZmluZF9kZWNvZGVyKHN0LT5jb2RlYy0+Y29kZWNfaWQpOwotfQotCi0vKiBBZGQgYWxsIHRoZSBzdHJlYW1zIGZyb20gdGhlIGdpdmVuIGlucHV0IGZpbGUgdG8gdGhlIGdsb2JhbAotICogbGlzdCBvZiBpbnB1dCBzdHJlYW1zLiAqLwotc3RhdGljIHZvaWQgYWRkX2lucHV0X3N0cmVhbXMoT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqaWMpCi17Ci0gICAgaW50IGksIHJldDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIEFWU3RyZWFtICpzdCA9IGljLT5zdHJlYW1zW2ldOwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqZGVjID0gc3QtPmNvZGVjOwotICAgICAgICBJbnB1dFN0cmVhbSAqaXN0ID0gYXZfbWFsbG9jeihzaXplb2YoKmlzdCkpOwotICAgICAgICBjaGFyICpmcmFtZXJhdGUgPSBOVUxMLCAqaHdhY2NlbCA9IE5VTEwsICpod2FjY2VsX2RldmljZSA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKmNvZGVjX3RhZyA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKm5leHQ7Ci0gICAgICAgIGNoYXIgKmRpc2NhcmRfc3RyID0gTlVMTDsKLSAgICAgICAgY29uc3QgQVZPcHRpb24gKmRpc2NhcmRfb3B0ID0gYXZfb3B0X2ZpbmQoZGVjLCAic2tpcF9mcmFtZSIsIE5VTEwsIDAsIDApOwotCi0gICAgICAgIGlmICghaXN0KQotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotCi0gICAgICAgIEdST1dfQVJSQVkoaW5wdXRfc3RyZWFtcywgbmJfaW5wdXRfc3RyZWFtcyk7Ci0gICAgICAgIGlucHV0X3N0cmVhbXNbbmJfaW5wdXRfc3RyZWFtcyAtIDFdID0gaXN0OwotCi0gICAgICAgIGlzdC0+c3QgPSBzdDsKLSAgICAgICAgaXN0LT5maWxlX2luZGV4ID0gbmJfaW5wdXRfZmlsZXM7Ci0gICAgICAgIGlzdC0+ZGlzY2FyZCA9IDE7Ci0gICAgICAgIHN0LT5kaXNjYXJkICA9IEFWRElTQ0FSRF9BTEw7Ci0gICAgICAgIGlzdC0+bmJfc2FtcGxlcyA9IDA7Ci0gICAgICAgIGlzdC0+bWluX3B0cyA9IElOVDY0X01BWDsKLSAgICAgICAgaXN0LT5tYXhfcHRzID0gSU5UNjRfTUlOOwotCi0gICAgICAgIGlzdC0+dHNfc2NhbGUgPSAxLjA7Ci0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHRzX3NjYWxlLCBkYmwsIGlzdC0+dHNfc2NhbGUsIGljLCBzdCk7Ci0KLSAgICAgICAgaXN0LT5hdXRvcm90YXRlID0gMTsKLSAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoYXV0b3JvdGF0ZSwgaSwgaXN0LT5hdXRvcm90YXRlLCBpYywgc3QpOwotCi0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGNvZGVjX3RhZ3MsIHN0ciwgY29kZWNfdGFnLCBpYywgc3QpOwotICAgICAgICBpZiAoY29kZWNfdGFnKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCB0YWcgPSBzdHJ0b2woY29kZWNfdGFnLCAmbmV4dCwgMCk7Ci0gICAgICAgICAgICBpZiAoKm5leHQpCi0gICAgICAgICAgICAgICAgdGFnID0gQVZfUkwzMihjb2RlY190YWcpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSB0YWc7Ci0gICAgICAgIH0KLQotICAgICAgICBpc3QtPmRlYyA9IGNob29zZV9kZWNvZGVyKG8sIGljLCBzdCk7Ci0gICAgICAgIGlzdC0+ZGVjb2Rlcl9vcHRzID0gZmlsdGVyX2NvZGVjX29wdHMoby0+Zy0+Y29kZWNfb3B0cywgaXN0LT5zdC0+Y29kZWMtPmNvZGVjX2lkLCBpYywgc3QsIGlzdC0+ZGVjKTsKLQotICAgICAgICBpc3QtPnJlaW5pdF9maWx0ZXJzID0gLTE7Ci0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHJlaW5pdF9maWx0ZXJzLCBpLCBpc3QtPnJlaW5pdF9maWx0ZXJzLCBpYywgc3QpOwotCi0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGRpc2NhcmQsIHN0ciwgZGlzY2FyZF9zdHIsIGljLCBzdCk7Ci0gICAgICAgIGlzdC0+dXNlcl9zZXRfZGlzY2FyZCA9IEFWRElTQ0FSRF9OT05FOwotICAgICAgICBpZiAoZGlzY2FyZF9zdHIgJiYgYXZfb3B0X2V2YWxfaW50KGRlYywgZGlzY2FyZF9vcHQsIGRpc2NhcmRfc3RyLCAmaXN0LT51c2VyX3NldF9kaXNjYXJkKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIGRpc2NhcmQgJXMuXG4iLAotICAgICAgICAgICAgICAgICAgICBkaXNjYXJkX3N0cik7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpc3QtPmZpbHRlcl9pbl9yZXNjYWxlX2RlbHRhX2xhc3QgPSBBVl9OT1BUU19WQUxVRTsKLQotICAgICAgICBpc3QtPmRlY19jdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGlzdC0+ZGVjKTsKLSAgICAgICAgaWYgKCFpc3QtPmRlY19jdHgpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIHRoZSBkZWNvZGVyIGNvbnRleHQuXG4iKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldCA9IGF2Y29kZWNfY29weV9jb250ZXh0KGlzdC0+ZGVjX2N0eCwgZGVjKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgdGhlIGRlY29kZXIgY29udGV4dC5cbiIpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChkZWMtPmNvZGVjX3R5cGUpIHsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICBpZighaXN0LT5kZWMpCi0gICAgICAgICAgICAgICAgaXN0LT5kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihkZWMtPmNvZGVjX2lkKTsKLSNpZiBGRl9BUElfRU1VX0VER0UKLSAgICAgICAgICAgIGlmIChhdl9jb2RlY19nZXRfbG93cmVzKGRlYykpIHsKLSAgICAgICAgICAgICAgICBkZWMtPmZsYWdzIHw9IENPREVDX0ZMQUdfRU1VX0VER0U7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgaXN0LT5yZXNhbXBsZV9oZWlnaHQgID0gaXN0LT5kZWNfY3R4LT5oZWlnaHQ7Ci0gICAgICAgICAgICBpc3QtPnJlc2FtcGxlX3dpZHRoICAgPSBpc3QtPmRlY19jdHgtPndpZHRoOwotICAgICAgICAgICAgaXN0LT5yZXNhbXBsZV9waXhfZm10ID0gaXN0LT5kZWNfY3R4LT5waXhfZm10OwotCi0gICAgICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmcmFtZV9yYXRlcywgc3RyLCBmcmFtZXJhdGUsIGljLCBzdCk7Ci0gICAgICAgICAgICBpZiAoZnJhbWVyYXRlICYmIGF2X3BhcnNlX3ZpZGVvX3JhdGUoJmlzdC0+ZnJhbWVyYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcmF0ZSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgZnJhbWVyYXRlICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVyYXRlKTsKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlzdC0+dG9wX2ZpZWxkX2ZpcnN0ID0gLTE7Ci0gICAgICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVCh0b3BfZmllbGRfZmlyc3QsIGksIGlzdC0+dG9wX2ZpZWxkX2ZpcnN0LCBpYywgc3QpOwotCi0gICAgICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChod2FjY2Vscywgc3RyLCBod2FjY2VsLCBpYywgc3QpOwotICAgICAgICAgICAgaWYgKGh3YWNjZWwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChod2FjY2VsLCAibm9uZSIpKQotICAgICAgICAgICAgICAgICAgICBpc3QtPmh3YWNjZWxfaWQgPSBIV0FDQ0VMX05PTkU7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChod2FjY2VsLCAiYXV0byIpKQotICAgICAgICAgICAgICAgICAgICBpc3QtPmh3YWNjZWxfaWQgPSBIV0FDQ0VMX0FVVE87Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBod2FjY2Vsc1tpXS5uYW1lOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGh3YWNjZWxzW2ldLm5hbWUsIGh3YWNjZWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5od2FjY2VsX2lkID0gaHdhY2NlbHNbaV0uaWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzdC0+aHdhY2NlbF9pZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlVucmVjb2duaXplZCBod2FjY2VsOiAlcy5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhY2NlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU3VwcG9ydGVkIGh3YWNjZWxzOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGh3YWNjZWxzW2ldLm5hbWU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiJXMgIiwgaHdhY2NlbHNbaV0ubmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoaHdhY2NlbF9kZXZpY2VzLCBzdHIsIGh3YWNjZWxfZGV2aWNlLCBpYywgc3QpOwotICAgICAgICAgICAgaWYgKGh3YWNjZWxfZGV2aWNlKSB7Ci0gICAgICAgICAgICAgICAgaXN0LT5od2FjY2VsX2RldmljZSA9IGF2X3N0cmR1cChod2FjY2VsX2RldmljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc3QtPmh3YWNjZWxfZGV2aWNlKQotICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpc3QtPmh3YWNjZWxfcGl4X2ZtdCA9IEFWX1BJWF9GTVRfTk9ORTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgaXN0LT5ndWVzc19sYXlvdXRfbWF4ID0gSU5UX01BWDsKLSAgICAgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGd1ZXNzX2xheW91dF9tYXgsIGksIGlzdC0+Z3Vlc3NfbGF5b3V0X21heCwgaWMsIHN0KTsKLSAgICAgICAgICAgIGd1ZXNzX2lucHV0X2NoYW5uZWxfbGF5b3V0KGlzdCk7Ci0KLSAgICAgICAgICAgIGlzdC0+cmVzYW1wbGVfc2FtcGxlX2ZtdCAgICAgPSBpc3QtPmRlY19jdHgtPnNhbXBsZV9mbXQ7Ci0gICAgICAgICAgICBpc3QtPnJlc2FtcGxlX3NhbXBsZV9yYXRlICAgID0gaXN0LT5kZWNfY3R4LT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgIGlzdC0+cmVzYW1wbGVfY2hhbm5lbHMgICAgICAgPSBpc3QtPmRlY19jdHgtPmNoYW5uZWxzOwotICAgICAgICAgICAgaXN0LT5yZXNhbXBsZV9jaGFubmVsX2xheW91dCA9IGlzdC0+ZGVjX2N0eC0+Y2hhbm5lbF9sYXlvdXQ7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRTogewotICAgICAgICAgICAgY2hhciAqY2FudmFzX3NpemUgPSBOVUxMOwotICAgICAgICAgICAgaWYoIWlzdC0+ZGVjKQotICAgICAgICAgICAgICAgIGlzdC0+ZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoZGVjLT5jb2RlY19pZCk7Ci0gICAgICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmaXhfc3ViX2R1cmF0aW9uLCBpLCBpc3QtPmZpeF9zdWJfZHVyYXRpb24sIGljLCBzdCk7Ci0gICAgICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChjYW52YXNfc2l6ZXMsIHN0ciwgY2FudmFzX3NpemUsIGljLCBzdCk7Ci0gICAgICAgICAgICBpZiAoY2FudmFzX3NpemUgJiYKLSAgICAgICAgICAgICAgICBhdl9wYXJzZV92aWRlb19zaXplKCZpc3QtPmRlY19jdHgtPndpZHRoLCAmaXN0LT5kZWNfY3R4LT5oZWlnaHQsIGNhbnZhc19zaXplKSA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBjYW52YXMgc2l6ZTogJXMuXG4iLCBjYW52YXNfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVDoKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVU5LTk9XTjoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXNzZXJ0X2ZpbGVfb3ZlcndyaXRlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIGlmIChmaWxlX292ZXJ3cml0ZSAmJiBub19maWxlX292ZXJ3cml0ZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yLCBib3RoIC15IGFuZCAtbiBzdXBwbGllZC4gRXhpdGluZy5cbiIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgaWYgKCFmaWxlX292ZXJ3cml0ZSkgewotICAgICAgICBjb25zdCBjaGFyICpwcm90b19uYW1lID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUoZmlsZW5hbWUpOwotICAgICAgICBpZiAocHJvdG9fbmFtZSAmJiAhc3RyY21wKHByb3RvX25hbWUsICJmaWxlIikgJiYgYXZpb19jaGVjayhmaWxlbmFtZSwgMCkgPT0gMCkgewotICAgICAgICAgICAgaWYgKHN0ZGluX2ludGVyYWN0aW9uICYmICFub19maWxlX292ZXJ3cml0ZSkgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJGaWxlICclcycgYWxyZWFkeSBleGlzdHMuIE92ZXJ3cml0ZSA/IFt5L05dICIsIGZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBmZmx1c2goc3RkZXJyKTsKLSAgICAgICAgICAgICAgICB0ZXJtX2V4aXQoKTsKLSAgICAgICAgICAgICAgICBzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKLSAgICAgICAgICAgICAgICBpZiAoIXJlYWRfeWVzbm8oKSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiTm90IG92ZXJ3cml0aW5nIC0gZXhpdGluZ1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGVybV9pbml0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRmlsZSAnJXMnIGFscmVhZHkgZXhpc3RzLiBFeGl0aW5nLlxuIiwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZHVtcF9hdHRhY2htZW50KEFWU3RyZWFtICpzdCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgaW50IHJldDsKLSAgICBBVklPQ29udGV4dCAqb3V0ID0gTlVMTDsKLSAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZTsKLQotICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJObyBleHRyYWRhdGEgdG8gZHVtcCBpbiBzdHJlYW0gIyVkOiVkLlxuIiwKLSAgICAgICAgICAgICAgIG5iX2lucHV0X2ZpbGVzIC0gMSwgc3QtPmluZGV4KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoISpmaWxlbmFtZSAmJiAoZSA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgImZpbGVuYW1lIiwgTlVMTCwgMCkpKQotICAgICAgICBmaWxlbmFtZSA9IGUtPnZhbHVlOwotICAgIGlmICghKmZpbGVuYW1lKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJObyBmaWxlbmFtZSBzcGVjaWZpZWQgYW5kIG5vICdmaWxlbmFtZScgdGFnIgotICAgICAgICAgICAgICAgImluIHN0cmVhbSAjJWQ6JWQuXG4iLCBuYl9pbnB1dF9maWxlcyAtIDEsIHN0LT5pbmRleCk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBhc3NlcnRfZmlsZV9vdmVyd3JpdGUoZmlsZW5hbWUpOwotCi0gICAgaWYgKChyZXQgPSBhdmlvX29wZW4yKCZvdXQsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZpbnRfY2IsIE5VTEwpKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMgZm9yIHdyaXRpbmcuXG4iLAotICAgICAgICAgICAgICAgZmlsZW5hbWUpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgYXZpb193cml0ZShvdXQsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKLSAgICBhdmlvX2ZsdXNoKG91dCk7Ci0gICAgYXZpb19jbG9zZShvdXQpOwotfQotCi1zdGF0aWMgaW50IG9wZW5faW5wdXRfZmlsZShPcHRpb25zQ29udGV4dCAqbywgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgSW5wdXRGaWxlICpmOwotICAgIEFWRm9ybWF0Q29udGV4dCAqaWM7Ci0gICAgQVZJbnB1dEZvcm1hdCAqZmlsZV9pZm9ybWF0ID0gTlVMTDsKLSAgICBpbnQgZXJyLCBpLCByZXQ7Ci0gICAgaW50NjRfdCB0aW1lc3RhbXA7Ci0gICAgQVZEaWN0aW9uYXJ5ICoqb3B0czsKLSAgICBBVkRpY3Rpb25hcnkgKnVudXNlZF9vcHRzID0gTlVMTDsKLSAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7Ci0gICAgaW50IG9yaWdfbmJfc3RyZWFtczsgICAgICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2Ygc3RyZWFtcyBiZWZvcmUgYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbwotICAgIGNoYXIgKiAgIHZpZGVvX2NvZGVjX25hbWUgPSBOVUxMOwotICAgIGNoYXIgKiAgIGF1ZGlvX2NvZGVjX25hbWUgPSBOVUxMOwotICAgIGNoYXIgKnN1YnRpdGxlX2NvZGVjX25hbWUgPSBOVUxMOwotICAgIGNoYXIgKiAgICBkYXRhX2NvZGVjX25hbWUgPSBOVUxMOwotICAgIGludCBzY2FuX2FsbF9wbXRzX3NldCA9IDA7Ci0KLSAgICBpZiAoby0+Zm9ybWF0KSB7Ci0gICAgICAgIGlmICghKGZpbGVfaWZvcm1hdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KG8tPmZvcm1hdCkpKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiVW5rbm93biBpbnB1dCBmb3JtYXQ6ICclcydcbiIsIG8tPmZvcm1hdCk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgIi0iKSkKLSAgICAgICAgZmlsZW5hbWUgPSAicGlwZToiOwotCi0gICAgc3RkaW5faW50ZXJhY3Rpb24gJj0gc3RybmNtcChmaWxlbmFtZSwgInBpcGU6IiwgNSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoZmlsZW5hbWUsICIvZGV2L3N0ZGluIik7Ci0KLSAgICAvKiBnZXQgZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gY29tbWFuZCBsaW5lICovCi0gICAgaWMgPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7Ci0gICAgaWYgKCFpYykgewotICAgICAgICBwcmludF9lcnJvcihmaWxlbmFtZSwgQVZFUlJPUihFTk9NRU0pKTsKLSAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgIH0KLSAgICBpZiAoby0+bmJfYXVkaW9fc2FtcGxlX3JhdGUpIHsKLSAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvLT5nLT5mb3JtYXRfb3B0cywgInNhbXBsZV9yYXRlIiwgby0+YXVkaW9fc2FtcGxlX3JhdGVbby0+bmJfYXVkaW9fc2FtcGxlX3JhdGUgLSAxXS51LmksIDApOwotICAgIH0KLSAgICBpZiAoby0+bmJfYXVkaW9fY2hhbm5lbHMpIHsKLSAgICAgICAgLyogYmVjYXVzZSB3ZSBzZXQgYXVkaW9fY2hhbm5lbHMgYmFzZWQgb24gYm90aCB0aGUgImFjIiBhbmQKLSAgICAgICAgICogImNoYW5uZWxfbGF5b3V0IiBvcHRpb25zLCB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiBkZW11eGVyIGFjdHVhbGx5IGhhcyB0aGUgImNoYW5uZWxzIiBvcHRpb24gYmVmb3JlIHNldHRpbmcgaXQgKi8KLSAgICAgICAgaWYgKGZpbGVfaWZvcm1hdCAmJiBmaWxlX2lmb3JtYXQtPnByaXZfY2xhc3MgJiYKLSAgICAgICAgICAgIGF2X29wdF9maW5kKCZmaWxlX2lmb3JtYXQtPnByaXZfY2xhc3MsICJjaGFubmVscyIsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKSkgewotICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvLT5nLT5mb3JtYXRfb3B0cywgImNoYW5uZWxzIiwgby0+YXVkaW9fY2hhbm5lbHNbby0+bmJfYXVkaW9fY2hhbm5lbHMgLSAxXS51LmksIDApOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChvLT5uYl9mcmFtZV9yYXRlcykgewotICAgICAgICAvKiBzZXQgdGhlIGZvcm1hdC1sZXZlbCBmcmFtZXJhdGUgb3B0aW9uOwotICAgICAgICAgKiB0aGlzIGlzIGltcG9ydGFudCBmb3IgdmlkZW8gZ3JhYmJlcnMsIGUuZy4geDExICovCi0gICAgICAgIGlmIChmaWxlX2lmb3JtYXQgJiYgZmlsZV9pZm9ybWF0LT5wcml2X2NsYXNzICYmCi0gICAgICAgICAgICBhdl9vcHRfZmluZCgmZmlsZV9pZm9ybWF0LT5wcml2X2NsYXNzLCAiZnJhbWVyYXRlIiwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSB7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldCgmby0+Zy0+Zm9ybWF0X29wdHMsICJmcmFtZXJhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgby0+ZnJhbWVfcmF0ZXNbby0+bmJfZnJhbWVfcmF0ZXMgLSAxXS51LnN0ciwgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG8tPm5iX2ZyYW1lX3NpemVzKSB7Ci0gICAgICAgIGF2X2RpY3Rfc2V0KCZvLT5nLT5mb3JtYXRfb3B0cywgInZpZGVvX3NpemUiLCBvLT5mcmFtZV9zaXplc1tvLT5uYl9mcmFtZV9zaXplcyAtIDFdLnUuc3RyLCAwKTsKLSAgICB9Ci0gICAgaWYgKG8tPm5iX2ZyYW1lX3BpeF9mbXRzKQotICAgICAgICBhdl9kaWN0X3NldCgmby0+Zy0+Zm9ybWF0X29wdHMsICJwaXhlbF9mb3JtYXQiLCBvLT5mcmFtZV9waXhfZm10c1tvLT5uYl9mcmFtZV9waXhfZm10cyAtIDFdLnUuc3RyLCAwKTsKLQotICAgIE1BVENIX1BFUl9UWVBFX09QVChjb2RlY19uYW1lcywgc3RyLCAgICB2aWRlb19jb2RlY19uYW1lLCBpYywgInYiKTsKLSAgICBNQVRDSF9QRVJfVFlQRV9PUFQoY29kZWNfbmFtZXMsIHN0ciwgICAgYXVkaW9fY29kZWNfbmFtZSwgaWMsICJhIik7Ci0gICAgTUFUQ0hfUEVSX1RZUEVfT1BUKGNvZGVjX25hbWVzLCBzdHIsIHN1YnRpdGxlX2NvZGVjX25hbWUsIGljLCAicyIpOwotICAgIE1BVENIX1BFUl9UWVBFX09QVChjb2RlY19uYW1lcywgc3RyLCAgICAgZGF0YV9jb2RlY19uYW1lLCBpYywgImQiKTsKLQotICAgIGljLT52aWRlb19jb2RlY19pZCAgID0gdmlkZW9fY29kZWNfbmFtZSA/Ci0gICAgICAgIGZpbmRfY29kZWNfb3JfZGllKHZpZGVvX2NvZGVjX25hbWUgICAsIEFWTUVESUFfVFlQRV9WSURFTyAgICwgMCktPmlkIDogQVZfQ09ERUNfSURfTk9ORTsKLSAgICBpYy0+YXVkaW9fY29kZWNfaWQgICA9IGF1ZGlvX2NvZGVjX25hbWUgPwotICAgICAgICBmaW5kX2NvZGVjX29yX2RpZShhdWRpb19jb2RlY19uYW1lICAgLCBBVk1FRElBX1RZUEVfQVVESU8gICAsIDApLT5pZCA6IEFWX0NPREVDX0lEX05PTkU7Ci0gICAgaWMtPnN1YnRpdGxlX2NvZGVjX2lkPSBzdWJ0aXRsZV9jb2RlY19uYW1lID8KLSAgICAgICAgZmluZF9jb2RlY19vcl9kaWUoc3VidGl0bGVfY29kZWNfbmFtZSwgQVZNRURJQV9UWVBFX1NVQlRJVExFLCAwKS0+aWQgOiBBVl9DT0RFQ19JRF9OT05FOwotICAgIGljLT5kYXRhX2NvZGVjX2lkICAgID0gZGF0YV9jb2RlY19uYW1lID8KLSAgICAgICAgZmluZF9jb2RlY19vcl9kaWUoZGF0YV9jb2RlY19uYW1lLCBBVk1FRElBX1RZUEVfREFUQSwgMCktPmlkIDogQVZfQ09ERUNfSURfTk9ORTsKLQotICAgIGlmICh2aWRlb19jb2RlY19uYW1lKQotICAgICAgICBhdl9mb3JtYXRfc2V0X3ZpZGVvX2NvZGVjICAgKGljLCBmaW5kX2NvZGVjX29yX2RpZSh2aWRlb19jb2RlY19uYW1lICAgLCBBVk1FRElBX1RZUEVfVklERU8gICAsIDApKTsKLSAgICBpZiAoYXVkaW9fY29kZWNfbmFtZSkKLSAgICAgICAgYXZfZm9ybWF0X3NldF9hdWRpb19jb2RlYyAgIChpYywgZmluZF9jb2RlY19vcl9kaWUoYXVkaW9fY29kZWNfbmFtZSAgICwgQVZNRURJQV9UWVBFX0FVRElPICAgLCAwKSk7Ci0gICAgaWYgKHN1YnRpdGxlX2NvZGVjX25hbWUpCi0gICAgICAgIGF2X2Zvcm1hdF9zZXRfc3VidGl0bGVfY29kZWMoaWMsIGZpbmRfY29kZWNfb3JfZGllKHN1YnRpdGxlX2NvZGVjX25hbWUsIEFWTUVESUFfVFlQRV9TVUJUSVRMRSwgMCkpOwotICAgIGlmIChkYXRhX2NvZGVjX25hbWUpCi0gICAgICAgIGF2X2Zvcm1hdF9zZXRfZGF0YV9jb2RlYyhpYywgZmluZF9jb2RlY19vcl9kaWUoZGF0YV9jb2RlY19uYW1lLCBBVk1FRElBX1RZUEVfREFUQSwgMCkpOwotCi0gICAgaWMtPmZsYWdzIHw9IEFWRk1UX0ZMQUdfTk9OQkxPQ0s7Ci0gICAgaWMtPmludGVycnVwdF9jYWxsYmFjayA9IGludF9jYjsKLQotICAgIGlmICghYXZfZGljdF9nZXQoby0+Zy0+Zm9ybWF0X29wdHMsICJzY2FuX2FsbF9wbXRzIiwgTlVMTCwgQVZfRElDVF9NQVRDSF9DQVNFKSkgewotICAgICAgICBhdl9kaWN0X3NldCgmby0+Zy0+Zm9ybWF0X29wdHMsICJzY2FuX2FsbF9wbXRzIiwgIjEiLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLSAgICAgICAgc2Nhbl9hbGxfcG10c19zZXQgPSAxOwotICAgIH0KLSAgICAvKiBvcGVuIHRoZSBpbnB1dCBmaWxlIHdpdGggZ2VuZXJpYyBhdmZvcm1hdCBmdW5jdGlvbiAqLwotICAgIGVyciA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmljLCBmaWxlbmFtZSwgZmlsZV9pZm9ybWF0LCAmby0+Zy0+Zm9ybWF0X29wdHMpOwotICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgIHByaW50X2Vycm9yKGZpbGVuYW1lLCBlcnIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotICAgIGlmIChzY2FuX2FsbF9wbXRzX3NldCkKLSAgICAgICAgYXZfZGljdF9zZXQoJm8tPmctPmZvcm1hdF9vcHRzLCAic2Nhbl9hbGxfcG10cyIsIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSk7Ci0gICAgcmVtb3ZlX2F2b3B0aW9ucygmby0+Zy0+Zm9ybWF0X29wdHMsIG8tPmctPmNvZGVjX29wdHMpOwotICAgIGFzc2VydF9hdm9wdGlvbnMoby0+Zy0+Zm9ybWF0X29wdHMpOwotCi0gICAgLyogYXBwbHkgZm9yY2VkIGNvZGVjIGlkcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKQotICAgICAgICBjaG9vc2VfZGVjb2RlcihvLCBpYywgaWMtPnN0cmVhbXNbaV0pOwotCi0gICAgLyogU2V0IEFWQ29kZWNDb250ZXh0IG9wdGlvbnMgZm9yIGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8gKi8KLSAgICBvcHRzID0gc2V0dXBfZmluZF9zdHJlYW1faW5mb19vcHRzKGljLCBvLT5nLT5jb2RlY19vcHRzKTsKLSAgICBvcmlnX25iX3N0cmVhbXMgPSBpYy0+bmJfc3RyZWFtczsKLQotICAgIC8qIElmIG5vdCBlbm91Z2ggaW5mbyB0byBnZXQgdGhlIHN0cmVhbSBwYXJhbWV0ZXJzLCB3ZSBkZWNvZGUgdGhlCi0gICAgICAgZmlyc3QgZnJhbWVzIHRvIGdldCBpdC4gKHVzZWQgaW4gbXBlZyBjYXNlIGZvciBleGFtcGxlKSAqLwotICAgIHJldCA9IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oaWMsIG9wdHMpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlczogY291bGQgbm90IGZpbmQgY29kZWMgcGFyYW1ldGVyc1xuIiwgZmlsZW5hbWUpOwotICAgICAgICBpZiAoaWMtPm5iX3N0cmVhbXMgPT0gMCkgewotICAgICAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmljKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChvLT5zdGFydF90aW1lX2VvZiAhPSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICBpZiAoaWMtPmR1cmF0aW9uPjApIHsKLSAgICAgICAgICAgIG8tPnN0YXJ0X3RpbWUgPSBvLT5zdGFydF90aW1lX2VvZiArIGljLT5kdXJhdGlvbjsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJDYW5ub3QgdXNlIC1zc2VvZiwgZHVyYXRpb24gb2YgJXMgbm90IGtub3duXG4iLCBmaWxlbmFtZSk7Ci0gICAgfQotICAgIHRpbWVzdGFtcCA9IChvLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSA/IDAgOiBvLT5zdGFydF90aW1lOwotICAgIC8qIGFkZCB0aGUgc3RyZWFtIHN0YXJ0IHRpbWUgKi8KLSAgICBpZiAoIW8tPnNlZWtfdGltZXN0YW1wICYmIGljLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICB0aW1lc3RhbXAgKz0gaWMtPnN0YXJ0X3RpbWU7Ci0KLSAgICAvKiBpZiBzZWVraW5nIHJlcXVlc3RlZCwgd2UgZXhlY3V0ZSBpdCAqLwotICAgIGlmIChvLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgIGludDY0X3Qgc2Vla190aW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0KLSAgICAgICAgaWYgKCEoaWMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfU0VFS19UT19QVFMpKSB7Ci0gICAgICAgICAgICBpbnQgZHRzX2hldXJpc3RpYyA9IDA7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxpYy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gaWMtPnN0cmVhbXNbaV0tPmNvZGVjOwotICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+aGFzX2JfZnJhbWVzKQotICAgICAgICAgICAgICAgICAgICBkdHNfaGV1cmlzdGljID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkdHNfaGV1cmlzdGljKSB7Ci0gICAgICAgICAgICAgICAgc2Vla190aW1lc3RhbXAgLT0gMypBVl9USU1FX0JBU0UgLyAyMzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXQgPSBhdmZvcm1hdF9zZWVrX2ZpbGUoaWMsIC0xLCBJTlQ2NF9NSU4sIHNlZWtfdGltZXN0YW1wLCBzZWVrX3RpbWVzdGFtcCwgMCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICIlczogY291bGQgbm90IHNlZWsgdG8gcG9zaXRpb24gJTAuM2ZcbiIsCi0gICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIChkb3VibGUpdGltZXN0YW1wIC8gQVZfVElNRV9CQVNFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHVwZGF0ZSB0aGUgY3VycmVudCBwYXJhbWV0ZXJzIHNvIHRoYXQgdGhleSBtYXRjaCB0aGUgb25lIG9mIHRoZSBpbnB1dCBzdHJlYW0gKi8KLSAgICBhZGRfaW5wdXRfc3RyZWFtcyhvLCBpYyk7Ci0KLSAgICAvKiBkdW1wIHRoZSBmaWxlIGNvbnRlbnQgKi8KLSAgICBhdl9kdW1wX2Zvcm1hdChpYywgbmJfaW5wdXRfZmlsZXMsIGZpbGVuYW1lLCAwKTsKLQotICAgIEdST1dfQVJSQVkoaW5wdXRfZmlsZXMsIG5iX2lucHV0X2ZpbGVzKTsKLSAgICBmID0gYXZfbWFsbG9jeihzaXplb2YoKmYpKTsKLSAgICBpZiAoIWYpCi0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICBpbnB1dF9maWxlc1tuYl9pbnB1dF9maWxlcyAtIDFdID0gZjsKLQotICAgIGYtPmN0eCAgICAgICAgPSBpYzsKLSAgICBmLT5pc3RfaW5kZXggID0gbmJfaW5wdXRfc3RyZWFtcyAtIGljLT5uYl9zdHJlYW1zOwotICAgIGYtPnN0YXJ0X3RpbWUgPSBvLT5zdGFydF90aW1lOwotICAgIGYtPnJlY29yZGluZ190aW1lID0gby0+cmVjb3JkaW5nX3RpbWU7Ci0gICAgZi0+aW5wdXRfdHNfb2Zmc2V0ID0gby0+aW5wdXRfdHNfb2Zmc2V0OwotICAgIGYtPnRzX29mZnNldCAgPSBvLT5pbnB1dF90c19vZmZzZXQgLSAoY29weV90cyA/IChzdGFydF9hdF96ZXJvICYmIGljLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFID8gaWMtPnN0YXJ0X3RpbWUgOiAwKSA6IHRpbWVzdGFtcCk7Ci0gICAgZi0+bmJfc3RyZWFtcyA9IGljLT5uYl9zdHJlYW1zOwotICAgIGYtPnJhdGVfZW11ICAgPSBvLT5yYXRlX2VtdTsKLSAgICBmLT5hY2N1cmF0ZV9zZWVrID0gby0+YWNjdXJhdGVfc2VlazsKLSAgICBmLT5sb29wID0gby0+bG9vcDsKLSAgICBmLT5kdXJhdGlvbiA9IDA7Ci0gICAgZi0+dGltZV9iYXNlID0gKEFWUmF0aW9uYWwpeyAxLCAxIH07Ci0jaWYgSEFWRV9QVEhSRUFEUwotICAgIGYtPnRocmVhZF9xdWV1ZV9zaXplID0gby0+dGhyZWFkX3F1ZXVlX3NpemUgPiAwID8gby0+dGhyZWFkX3F1ZXVlX3NpemUgOiA4OwotI2VuZGlmCi0KLSAgICAvKiBjaGVjayBpZiBhbGwgY29kZWMgb3B0aW9ucyBoYXZlIGJlZW4gdXNlZCAqLwotICAgIHVudXNlZF9vcHRzID0gc3RyaXBfc3BlY2lmaWVycyhvLT5nLT5jb2RlY19vcHRzKTsKLSAgICBmb3IgKGkgPSBmLT5pc3RfaW5kZXg7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgZSA9IE5VTEw7Ci0gICAgICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGlucHV0X3N0cmVhbXNbaV0tPmRlY29kZXJfb3B0cywgIiIsIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQotICAgICAgICAgICAgYXZfZGljdF9zZXQoJnVudXNlZF9vcHRzLCBlLT5rZXksIE5VTEwsIDApOwotICAgIH0KLQotICAgIGUgPSBOVUxMOwotICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KHVudXNlZF9vcHRzLCAiIiwgZSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKLSAgICAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3MgPSBhdmNvZGVjX2dldF9jbGFzcygpOwotICAgICAgICBjb25zdCBBVk9wdGlvbiAqb3B0aW9uID0gYXZfb3B0X2ZpbmQoJmNsYXNzLCBlLT5rZXksIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0NISUxEUkVOIHwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSik7Ci0gICAgICAgIGNvbnN0IEFWQ2xhc3MgKmZjbGFzcyA9IGF2Zm9ybWF0X2dldF9jbGFzcygpOwotICAgICAgICBjb25zdCBBVk9wdGlvbiAqZm9wdGlvbiA9IGF2X29wdF9maW5kKCZmY2xhc3MsIGUtPmtleSwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4gfCBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKTsKLSAgICAgICAgaWYgKCFvcHRpb24gfHwgZm9wdGlvbikKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0KLSAgICAgICAgaWYgKCEob3B0aW9uLT5mbGFncyAmIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNKSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvZGVjIEFWT3B0aW9uICVzICglcykgc3BlY2lmaWVkIGZvciAiCi0gICAgICAgICAgICAgICAgICAgImlucHV0IGZpbGUgIyVkICglcykgaXMgbm90IGEgZGVjb2Rpbmcgb3B0aW9uLlxuIiwgZS0+a2V5LAotICAgICAgICAgICAgICAgICAgIG9wdGlvbi0+aGVscCA/IG9wdGlvbi0+aGVscCA6ICIiLCBuYl9pbnB1dF9maWxlcyAtIDEsCi0gICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiQ29kZWMgQVZPcHRpb24gJXMgKCVzKSBzcGVjaWZpZWQgZm9yICIKLSAgICAgICAgICAgICAgICJpbnB1dCBmaWxlICMlZCAoJXMpIGhhcyBub3QgYmVlbiB1c2VkIGZvciBhbnkgc3RyZWFtLiBUaGUgbW9zdCAiCi0gICAgICAgICAgICAgICAibGlrZWx5IHJlYXNvbiBpcyBlaXRoZXIgd3JvbmcgdHlwZSAoZS5nLiBhIHZpZGVvIG9wdGlvbiB3aXRoICIKLSAgICAgICAgICAgICAgICJubyB2aWRlbyBzdHJlYW1zKSBvciB0aGF0IGl0IGlzIGEgcHJpdmF0ZSBvcHRpb24gb2Ygc29tZSBkZWNvZGVyICIKLSAgICAgICAgICAgICAgICJ3aGljaCB3YXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGFueSBzdHJlYW0uXG4iLCBlLT5rZXksCi0gICAgICAgICAgICAgICBvcHRpb24tPmhlbHAgPyBvcHRpb24tPmhlbHAgOiAiIiwgbmJfaW5wdXRfZmlsZXMgLSAxLCBmaWxlbmFtZSk7Ci0gICAgfQotICAgIGF2X2RpY3RfZnJlZSgmdW51c2VkX29wdHMpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG8tPm5iX2R1bXBfYXR0YWNobWVudDsgaSsrKSB7Ci0gICAgICAgIGludCBqOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBpYy0+bmJfc3RyZWFtczsgaisrKSB7Ci0gICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBpYy0+c3RyZWFtc1tqXTsKLQotICAgICAgICAgICAgaWYgKGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIoaWMsIHN0LCBvLT5kdW1wX2F0dGFjaG1lbnRbaV0uc3BlY2lmaWVyKSA9PSAxKQotICAgICAgICAgICAgICAgIGR1bXBfYXR0YWNobWVudChzdCwgby0+ZHVtcF9hdHRhY2htZW50W2ldLnUuc3RyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBvcmlnX25iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRzW2ldKTsKLSAgICBhdl9mcmVlcCgmb3B0cyk7Ci0KLSAgICBpbnB1dF9zdHJlYW1fcG90ZW50aWFsbHlfYXZhaWxhYmxlID0gMTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDhfdCAqZ2V0X2xpbmUoQVZJT0NvbnRleHQgKnMpCi17Ci0gICAgQVZJT0NvbnRleHQgKmxpbmU7Ci0gICAgdWludDhfdCAqYnVmOwotICAgIGNoYXIgYzsKLQotICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmbGluZSkgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3QgYWxsb2MgYnVmZmVyIGZvciByZWFkaW5nIHByZXNldC5cbiIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgd2hpbGUgKChjID0gYXZpb19yOChzKSkgJiYgYyAhPSAnXG4nKQotICAgICAgICBhdmlvX3c4KGxpbmUsIGMpOwotICAgIGF2aW9fdzgobGluZSwgMCk7Ci0gICAgYXZpb19jbG9zZV9keW5fYnVmKGxpbmUsICZidWYpOwotCi0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGludCBnZXRfcHJlc2V0X2ZpbGVfMihjb25zdCBjaGFyICpwcmVzZXRfbmFtZSwgY29uc3QgY2hhciAqY29kZWNfbmFtZSwgQVZJT0NvbnRleHQgKipzKQotewotICAgIGludCBpLCByZXQgPSAtMTsKLSAgICBjaGFyIGZpbGVuYW1lWzEwMDBdOwotICAgIGNvbnN0IGNoYXIgKmJhc2VbM10gPSB7IGdldGVudigiQVZDT05WX0RBVEFESVIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRlbnYoIkhPTUUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNPTlZfREFUQURJUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGJhc2UpICYmIHJldCA8IDA7IGkrKykgewotICAgICAgICBpZiAoIWJhc2VbaV0pCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGNvZGVjX25hbWUpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMlcy8lcy0lcy5hdnByZXNldCIsIGJhc2VbaV0sCi0gICAgICAgICAgICAgICAgICAgICBpICE9IDEgPyAiIiA6ICIvLmF2Y29udiIsIGNvZGVjX25hbWUsIHByZXNldF9uYW1lKTsKLSAgICAgICAgICAgIHJldCA9IGF2aW9fb3BlbjIocywgZmlsZW5hbWUsIEFWSU9fRkxBR19SRUFELCAmaW50X2NiLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcyVzLyVzLmF2cHJlc2V0IiwgYmFzZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgIGkgIT0gMSA/ICIiIDogIi8uYXZjb252IiwgcHJlc2V0X25hbWUpOwotICAgICAgICAgICAgcmV0ID0gYXZpb19vcGVuMihzLCBmaWxlbmFtZSwgQVZJT19GTEFHX1JFQUQsICZpbnRfY2IsIE5VTEwpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNob29zZV9lbmNvZGVyKE9wdGlvbnNDb250ZXh0ICpvLCBBVkZvcm1hdENvbnRleHQgKnMsIE91dHB1dFN0cmVhbSAqb3N0KQotewotICAgIGNoYXIgKmNvZGVjX25hbWUgPSBOVUxMOwotCi0gICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoY29kZWNfbmFtZXMsIHN0ciwgY29kZWNfbmFtZSwgcywgb3N0LT5zdCk7Ci0gICAgaWYgKCFjb2RlY19uYW1lKSB7Ci0gICAgICAgIG9zdC0+c3QtPmNvZGVjLT5jb2RlY19pZCA9IGF2X2d1ZXNzX2NvZGVjKHMtPm9mb3JtYXQsIE5VTEwsIHMtPmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBvc3QtPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSk7Ci0gICAgICAgIG9zdC0+ZW5jID0gYXZjb2RlY19maW5kX2VuY29kZXIob3N0LT5zdC0+Y29kZWMtPmNvZGVjX2lkKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY29kZWNfbmFtZSwgImNvcHkiKSkKLSAgICAgICAgb3N0LT5zdHJlYW1fY29weSA9IDE7Ci0gICAgZWxzZSB7Ci0gICAgICAgIG9zdC0+ZW5jID0gZmluZF9jb2RlY19vcl9kaWUoY29kZWNfbmFtZSwgb3N0LT5zdC0+Y29kZWMtPmNvZGVjX3R5cGUsIDEpOwotICAgICAgICBvc3QtPnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBvc3QtPmVuYy0+aWQ7Ci0gICAgfQotfQotCi1zdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfb3V0cHV0X3N0cmVhbShPcHRpb25zQ29udGV4dCAqbywgQVZGb3JtYXRDb250ZXh0ICpvYywgZW51bSBBVk1lZGlhVHlwZSB0eXBlLCBpbnQgc291cmNlX2luZGV4KQotewotICAgIE91dHB1dFN0cmVhbSAqb3N0OwotICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ob2MsIE5VTEwpOwotICAgIGludCBpZHggICAgICA9IG9jLT5uYl9zdHJlYW1zIC0gMSwgcmV0ID0gMDsKLSAgICBjaGFyICpic2YgPSBOVUxMLCAqbmV4dCwgKmNvZGVjX3RhZyA9IE5VTEw7Ci0gICAgQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLCAqYnNmY19wcmV2ID0gTlVMTDsKLSAgICBkb3VibGUgcXNjYWxlID0gLTE7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIXN0KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3QgYWxsb2Mgc3RyZWFtLlxuIik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBpZiAob2MtPm5iX3N0cmVhbXMgLSAxIDwgby0+bmJfc3RyZWFtaWRfbWFwKQotICAgICAgICBzdC0+aWQgPSBvLT5zdHJlYW1pZF9tYXBbb2MtPm5iX3N0cmVhbXMgLSAxXTsKLQotICAgIEdST1dfQVJSQVkob3V0cHV0X3N0cmVhbXMsIG5iX291dHB1dF9zdHJlYW1zKTsKLSAgICBpZiAoIShvc3QgPSBhdl9tYWxsb2N6KHNpemVvZigqb3N0KSkpKQotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgb3V0cHV0X3N0cmVhbXNbbmJfb3V0cHV0X3N0cmVhbXMgLSAxXSA9IG9zdDsKLQotICAgIG9zdC0+ZmlsZV9pbmRleCA9IG5iX291dHB1dF9maWxlcyAtIDE7Ci0gICAgb3N0LT5pbmRleCAgICAgID0gaWR4OwotICAgIG9zdC0+c3QgICAgICAgICA9IHN0OwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IHR5cGU7Ci0gICAgY2hvb3NlX2VuY29kZXIobywgb2MsIG9zdCk7Ci0KLSAgICBvc3QtPmVuY19jdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKG9zdC0+ZW5jKTsKLSAgICBpZiAoIW9zdC0+ZW5jX2N0eCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyB0aGUgZW5jb2RpbmcgY29udGV4dC5cbiIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotICAgIG9zdC0+ZW5jX2N0eC0+Y29kZWNfdHlwZSA9IHR5cGU7Ci0KLSAgICBpZiAob3N0LT5lbmMpIHsKLSAgICAgICAgQVZJT0NvbnRleHQgKnMgPSBOVUxMOwotICAgICAgICBjaGFyICpidWYgPSBOVUxMLCAqYXJnID0gTlVMTCwgKnByZXNldCA9IE5VTEw7Ci0KLSAgICAgICAgb3N0LT5lbmNvZGVyX29wdHMgID0gZmlsdGVyX2NvZGVjX29wdHMoby0+Zy0+Y29kZWNfb3B0cywgb3N0LT5lbmMtPmlkLCBvYywgc3QsIG9zdC0+ZW5jKTsKLQotICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChwcmVzZXRzLCBzdHIsIHByZXNldCwgb2MsIHN0KTsKLSAgICAgICAgaWYgKHByZXNldCAmJiAoIShyZXQgPSBnZXRfcHJlc2V0X2ZpbGVfMihwcmVzZXQsIG9zdC0+ZW5jLT5uYW1lLCAmcykpKSkgewotICAgICAgICAgICAgZG8gIHsKLSAgICAgICAgICAgICAgICBidWYgPSBnZXRfbGluZShzKTsKLSAgICAgICAgICAgICAgICBpZiAoIWJ1ZlswXSB8fCBidWZbMF0gPT0gJyMnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghKGFyZyA9IHN0cmNocihidWYsICc9JykpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGxpbmUgZm91bmQgaW4gdGhlIHByZXNldCBmaWxlLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKmFyZysrID0gMDsKLSAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3N0LT5lbmNvZGVyX29wdHMsIGJ1ZiwgYXJnLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLSAgICAgICAgICAgICAgICBhdl9mcmVlKGJ1Zik7Ci0gICAgICAgICAgICB9IHdoaWxlICghcy0+ZW9mX3JlYWNoZWQpOwotICAgICAgICAgICAgYXZpb19jbG9zZXAoJnMpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCi0gICAgICAgICAgICAgICAgICAgIlByZXNldCAlcyBzcGVjaWZpZWQgZm9yIHN0cmVhbSAlZDolZCwgYnV0IGNvdWxkIG5vdCBiZSBvcGVuZWQuXG4iLAotICAgICAgICAgICAgICAgICAgIHByZXNldCwgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9zdC0+ZW5jb2Rlcl9vcHRzID0gZmlsdGVyX2NvZGVjX29wdHMoby0+Zy0+Y29kZWNfb3B0cywgQVZfQ09ERUNfSURfTk9ORSwgb2MsIHN0LCBOVUxMKTsKLSAgICB9Ci0KLSAgICBvc3QtPm1heF9mcmFtZXMgPSBJTlQ2NF9NQVg7Ci0gICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQobWF4X2ZyYW1lcywgaTY0LCBvc3QtPm1heF9mcmFtZXMsIG9jLCBzdCk7Ci0gICAgZm9yIChpID0gMDsgaTxvLT5uYl9tYXhfZnJhbWVzOyBpKyspIHsKLSAgICAgICAgY2hhciAqcCA9IG8tPm1heF9mcmFtZXNbaV0uc3BlY2lmaWVyOwotICAgICAgICBpZiAoISpwICYmIHR5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJBcHBseWluZyB1bnNwZWNpZmljIC1mcmFtZXMgdG8gbm9uIHZpZGVvIHN0cmVhbXMsIG1heWJlIHlvdSBtZWFudCAtdmZyYW1lcyA/XG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb3N0LT5jb3B5X3ByaW9yX3N0YXJ0ID0gLTE7Ci0gICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoY29weV9wcmlvcl9zdGFydCwgaSwgb3N0LT5jb3B5X3ByaW9yX3N0YXJ0LCBvYyAsc3QpOwotCi0gICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoYml0c3RyZWFtX2ZpbHRlcnMsIHN0ciwgYnNmLCBvYywgc3QpOwotICAgIHdoaWxlIChic2YpIHsKLSAgICAgICAgY2hhciAqYXJnID0gTlVMTDsKLSAgICAgICAgaWYgKG5leHQgPSBzdHJjaHIoYnNmLCAnLCcpKQotICAgICAgICAgICAgKm5leHQrKyA9IDA7Ci0gICAgICAgIGlmIChhcmcgPSBzdHJjaHIoYnNmLCAnPScpKQotICAgICAgICAgICAgKmFyZysrID0gMDsKLSAgICAgICAgaWYgKCEoYnNmYyA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfaW5pdChic2YpKSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlVua25vd24gYml0c3RyZWFtIGZpbHRlciAlc1xuIiwgYnNmKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnNmY19wcmV2KQotICAgICAgICAgICAgYnNmY19wcmV2LT5uZXh0ID0gYnNmYzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgb3N0LT5iaXRzdHJlYW1fZmlsdGVycyA9IGJzZmM7Ci0gICAgICAgIGlmIChhcmcpCi0gICAgICAgICAgICBpZiAoIShic2ZjLT5hcmdzID0gYXZfc3RyZHVwKGFyZykpKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkJpdHN0cmVhbSBmaWx0ZXIgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgYnNmY19wcmV2ID0gYnNmYzsKLSAgICAgICAgYnNmICAgICAgID0gbmV4dDsKLSAgICB9Ci0KLSAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChjb2RlY190YWdzLCBzdHIsIGNvZGVjX3RhZywgb2MsIHN0KTsKLSAgICBpZiAoY29kZWNfdGFnKSB7Ci0gICAgICAgIHVpbnQzMl90IHRhZyA9IHN0cnRvbChjb2RlY190YWcsICZuZXh0LCAwKTsKLSAgICAgICAgaWYgKCpuZXh0KQotICAgICAgICAgICAgdGFnID0gQVZfUkwzMihjb2RlY190YWcpOwotICAgICAgICBvc3QtPnN0LT5jb2RlYy0+Y29kZWNfdGFnID0KLSAgICAgICAgb3N0LT5lbmNfY3R4LT5jb2RlY190YWcgPSB0YWc7Ci0gICAgfQotCi0gICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQocXNjYWxlLCBkYmwsIHFzY2FsZSwgb2MsIHN0KTsKLSAgICBpZiAocXNjYWxlID49IDApIHsKLSAgICAgICAgb3N0LT5lbmNfY3R4LT5mbGFncyB8PSBBVl9DT0RFQ19GTEFHX1FTQ0FMRTsKLSAgICAgICAgb3N0LT5lbmNfY3R4LT5nbG9iYWxfcXVhbGl0eSA9IEZGX1FQMkxBTUJEQSAqIHFzY2FsZTsKLSAgICB9Ci0KLSAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChkaXNwb3NpdGlvbiwgc3RyLCBvc3QtPmRpc3Bvc2l0aW9uLCBvYywgc3QpOwotICAgIG9zdC0+ZGlzcG9zaXRpb24gPSBhdl9zdHJkdXAob3N0LT5kaXNwb3NpdGlvbik7Ci0KLSAgICBpZiAob2MtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfR0xPQkFMSEVBREVSKQotICAgICAgICBvc3QtPmVuY19jdHgtPmZsYWdzIHw9IEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUjsKLQotICAgIGF2X2RpY3RfY29weSgmb3N0LT5zd3NfZGljdCwgby0+Zy0+c3dzX2RpY3QsIDApOwotCi0gICAgYXZfZGljdF9jb3B5KCZvc3QtPnN3cl9vcHRzLCBvLT5nLT5zd3Jfb3B0cywgMCk7Ci0gICAgaWYgKG9zdC0+ZW5jICYmIGF2X2dldF9leGFjdF9iaXRzX3Blcl9zYW1wbGUob3N0LT5lbmMtPmlkKSA9PSAyNCkKLSAgICAgICAgYXZfZGljdF9zZXQoJm9zdC0+c3dyX29wdHMsICJvdXRwdXRfc2FtcGxlX2JpdHMiLCAiMjQiLCAwKTsKLQotICAgIGF2X2RpY3RfY29weSgmb3N0LT5yZXNhbXBsZV9vcHRzLCBvLT5nLT5yZXNhbXBsZV9vcHRzLCAwKTsKLQotICAgIG9zdC0+c291cmNlX2luZGV4ID0gc291cmNlX2luZGV4OwotICAgIGlmIChzb3VyY2VfaW5kZXggPj0gMCkgewotICAgICAgICBvc3QtPnN5bmNfaXN0ID0gaW5wdXRfc3RyZWFtc1tzb3VyY2VfaW5kZXhdOwotICAgICAgICBpbnB1dF9zdHJlYW1zW3NvdXJjZV9pbmRleF0tPmRpc2NhcmQgPSAwOwotICAgICAgICBpbnB1dF9zdHJlYW1zW3NvdXJjZV9pbmRleF0tPnN0LT5kaXNjYXJkID0gaW5wdXRfc3RyZWFtc1tzb3VyY2VfaW5kZXhdLT51c2VyX3NldF9kaXNjYXJkOwotICAgIH0KLSAgICBvc3QtPmxhc3RfbXV4X2R0cyA9IEFWX05PUFRTX1ZBTFVFOwotCi0gICAgcmV0dXJuIG9zdDsKLX0KLQotc3RhdGljIHZvaWQgcGFyc2VfbWF0cml4X2NvZWZmcyh1aW50MTZfdCAqZGVzdCwgY29uc3QgY2hhciAqc3RyKQotewotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKnAgPSBzdHI7Ci0gICAgZm9yIChpID0gMDs7IGkrKykgewotICAgICAgICBkZXN0W2ldID0gYXRvaShwKTsKLSAgICAgICAgaWYgKGkgPT0gNjMpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgcCA9IHN0cmNocihwLCAnLCcpOwotICAgICAgICBpZiAoIXApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTeW50YXggZXJyb3IgaW4gbWF0cml4IFwiJXNcIiBhdCBjb2VmZiAlZFxuIiwgc3RyLCBpKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgICAgICBwKys7Ci0gICAgfQotfQotCi0vKiByZWFkIGZpbGUgY29udGVudHMgaW50byBhIHN0cmluZyAqLwotc3RhdGljIHVpbnQ4X3QgKnJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBBVklPQ29udGV4dCAqcGIgICAgICA9IE5VTEw7Ci0gICAgQVZJT0NvbnRleHQgKmR5bl9idWYgPSBOVUxMOwotICAgIGludCByZXQgPSBhdmlvX29wZW4oJnBiLCBmaWxlbmFtZSwgQVZJT19GTEFHX1JFQUQpOwotICAgIHVpbnQ4X3QgYnVmWzEwMjRdLCAqc3RyOwotCi0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIG9wZW5pbmcgZmlsZSAlcy5cbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bl9idWYpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2aW9fY2xvc2VwKCZwYik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICB3aGlsZSAoKHJldCA9IGF2aW9fcmVhZChwYiwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkKLSAgICAgICAgYXZpb193cml0ZShkeW5fYnVmLCBidWYsIHJldCk7Ci0gICAgYXZpb193OChkeW5fYnVmLCAwKTsKLSAgICBhdmlvX2Nsb3NlcCgmcGIpOwotCi0gICAgcmV0ID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9idWYsICZzdHIpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gc3RyOwotfQotCi1zdGF0aWMgY2hhciAqZ2V0X29zdF9maWx0ZXJzKE9wdGlvbnNDb250ZXh0ICpvLCBBVkZvcm1hdENvbnRleHQgKm9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCkKLXsKLSAgICBBVlN0cmVhbSAqc3QgPSBvc3QtPnN0OwotCi0gICAgaWYgKG9zdC0+ZmlsdGVyc19zY3JpcHQgJiYgb3N0LT5maWx0ZXJzKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJCb3RoIC1maWx0ZXIgYW5kIC1maWx0ZXJfc2NyaXB0IHNldCBmb3IgIgotICAgICAgICAgICAgICAgIm91dHB1dCBzdHJlYW0gIyVkOiVkLlxuIiwgbmJfb3V0cHV0X2ZpbGVzLCBzdC0+aW5kZXgpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgaWYgKG9zdC0+ZmlsdGVyc19zY3JpcHQpCi0gICAgICAgIHJldHVybiByZWFkX2ZpbGUob3N0LT5maWx0ZXJzX3NjcmlwdCk7Ci0gICAgZWxzZSBpZiAob3N0LT5maWx0ZXJzKQotICAgICAgICByZXR1cm4gYXZfc3RyZHVwKG9zdC0+ZmlsdGVycyk7Ci0KLSAgICByZXR1cm4gYXZfc3RyZHVwKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gPwotICAgICAgICAgICAgICAgICAgICAgIm51bGwiIDogImFudWxsIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX3N0cmVhbWNvcHlfZmlsdGVycyhPcHRpb25zQ29udGV4dCAqbywgQVZGb3JtYXRDb250ZXh0ICpvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRTdHJlYW0gKm9zdCwgZW51bSBBVk1lZGlhVHlwZSB0eXBlKQotewotICAgIGlmIChvc3QtPmZpbHRlcnNfc2NyaXB0IHx8IG9zdC0+ZmlsdGVycykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIiVzICclcycgd2FzIGRlZmluZWQgZm9yICVzIG91dHB1dCBzdHJlYW0gJWQ6JWQgYnV0IGNvZGVjIGNvcHkgd2FzIHNlbGVjdGVkLlxuIgotICAgICAgICAgICAgICAgIkZpbHRlcmluZyBhbmQgc3RyZWFtY29weSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5cbiIsCi0gICAgICAgICAgICAgICBvc3QtPmZpbHRlcnMgPyAiRmlsdGVyZ3JhcGgiIDogIkZpbHRlcmdyYXBoIHNjcmlwdCIsCi0gICAgICAgICAgICAgICBvc3QtPmZpbHRlcnMgPyBvc3QtPmZpbHRlcnMgOiBvc3QtPmZpbHRlcnNfc2NyaXB0LAotICAgICAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHR5cGUpLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotfQotCi1zdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfdmlkZW9fc3RyZWFtKE9wdGlvbnNDb250ZXh0ICpvLCBBVkZvcm1hdENvbnRleHQgKm9jLCBpbnQgc291cmNlX2luZGV4KQotewotICAgIEFWU3RyZWFtICpzdDsKLSAgICBPdXRwdXRTdHJlYW0gKm9zdDsKLSAgICBBVkNvZGVjQ29udGV4dCAqdmlkZW9fZW5jOwotICAgIGNoYXIgKmZyYW1lX3JhdGUgPSBOVUxMLCAqZnJhbWVfYXNwZWN0X3JhdGlvID0gTlVMTDsKLQotICAgIG9zdCA9IG5ld19vdXRwdXRfc3RyZWFtKG8sIG9jLCBBVk1FRElBX1RZUEVfVklERU8sIHNvdXJjZV9pbmRleCk7Ci0gICAgc3QgID0gb3N0LT5zdDsKLSAgICB2aWRlb19lbmMgPSBvc3QtPmVuY19jdHg7Ci0KLSAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmcmFtZV9yYXRlcywgc3RyLCBmcmFtZV9yYXRlLCBvYywgc3QpOwotICAgIGlmIChmcmFtZV9yYXRlICYmIGF2X3BhcnNlX3ZpZGVvX3JhdGUoJm9zdC0+ZnJhbWVfcmF0ZSwgZnJhbWVfcmF0ZSkgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGZyYW1lcmF0ZSB2YWx1ZTogJXNcbiIsIGZyYW1lX3JhdGUpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotICAgIGlmIChmcmFtZV9yYXRlICYmIHZpZGVvX3N5bmNfbWV0aG9kID09IFZTWU5DX1BBU1NUSFJPVUdIKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVXNpbmcgLXZzeW5jIDAgYW5kIC1yIGNhbiBwcm9kdWNlIGludmFsaWQgb3V0cHV0IGZpbGVzXG4iKTsKLQotICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGZyYW1lX2FzcGVjdF9yYXRpb3MsIHN0ciwgZnJhbWVfYXNwZWN0X3JhdGlvLCBvYywgc3QpOwotICAgIGlmIChmcmFtZV9hc3BlY3RfcmF0aW8pIHsKLSAgICAgICAgQVZSYXRpb25hbCBxOwotICAgICAgICBpZiAoYXZfcGFyc2VfcmF0aW8oJnEsIGZyYW1lX2FzcGVjdF9yYXRpbywgMjU1LCAwLCBOVUxMKSA8IDAgfHwKLSAgICAgICAgICAgIHEubnVtIDw9IDAgfHwgcS5kZW4gPD0gMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgYXNwZWN0IHJhdGlvOiAlc1xuIiwgZnJhbWVfYXNwZWN0X3JhdGlvKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgICAgICBvc3QtPmZyYW1lX2FzcGVjdF9yYXRpbyA9IHE7Ci0gICAgfQotCi0gICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZmlsdGVyX3NjcmlwdHMsIHN0ciwgb3N0LT5maWx0ZXJzX3NjcmlwdCwgb2MsIHN0KTsKLSAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmaWx0ZXJzLCAgICAgICAgc3RyLCBvc3QtPmZpbHRlcnMsICAgICAgICBvYywgc3QpOwotCi0gICAgaWYgKCFvc3QtPnN0cmVhbV9jb3B5KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnAgPSBOVUxMOwotICAgICAgICBjaGFyICpmcmFtZV9zaXplID0gTlVMTDsKLSAgICAgICAgY2hhciAqZnJhbWVfcGl4X2ZtdCA9IE5VTEw7Ci0gICAgICAgIGNoYXIgKmludHJhX21hdHJpeCA9IE5VTEwsICppbnRlcl9tYXRyaXggPSBOVUxMOwotICAgICAgICBjaGFyICpjaHJvbWFfaW50cmFfbWF0cml4ID0gTlVMTDsKLSAgICAgICAgaW50IGRvX3Bhc3MgPSAwOwotICAgICAgICBpbnQgaTsKLQotICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmcmFtZV9zaXplcywgc3RyLCBmcmFtZV9zaXplLCBvYywgc3QpOwotICAgICAgICBpZiAoZnJhbWVfc2l6ZSAmJiBhdl9wYXJzZV92aWRlb19zaXplKCZ2aWRlb19lbmMtPndpZHRoLCAmdmlkZW9fZW5jLT5oZWlnaHQsIGZyYW1lX3NpemUpIDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgZnJhbWUgc2l6ZTogJXMuXG4iLCBmcmFtZV9zaXplKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZpZGVvX2VuYy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IGZyYW1lX2JpdHNfcGVyX3Jhd19zYW1wbGU7Ci0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGZyYW1lX3BpeF9mbXRzLCBzdHIsIGZyYW1lX3BpeF9mbXQsIG9jLCBzdCk7Ci0gICAgICAgIGlmIChmcmFtZV9waXhfZm10ICYmICpmcmFtZV9waXhfZm10ID09ICcrJykgewotICAgICAgICAgICAgb3N0LT5rZWVwX3BpeF9mbXQgPSAxOwotICAgICAgICAgICAgaWYgKCEqKytmcmFtZV9waXhfZm10KQotICAgICAgICAgICAgICAgIGZyYW1lX3BpeF9mbXQgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmcmFtZV9waXhfZm10ICYmICh2aWRlb19lbmMtPnBpeF9mbXQgPSBhdl9nZXRfcGl4X2ZtdChmcmFtZV9waXhfZm10KSkgPT0gQVZfUElYX0ZNVF9OT05FKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiVW5rbm93biBwaXhlbCBmb3JtYXQgcmVxdWVzdGVkOiAlcy5cbiIsIGZyYW1lX3BpeF9mbXQpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gdmlkZW9fZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwotCi0gICAgICAgIGlmIChpbnRyYV9vbmx5KQotICAgICAgICAgICAgdmlkZW9fZW5jLT5nb3Bfc2l6ZSA9IDA7Ci0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGludHJhX21hdHJpY2VzLCBzdHIsIGludHJhX21hdHJpeCwgb2MsIHN0KTsKLSAgICAgICAgaWYgKGludHJhX21hdHJpeCkgewotICAgICAgICAgICAgaWYgKCEodmlkZW9fZW5jLT5pbnRyYV9tYXRyaXggPSBhdl9tYWxsb2N6KHNpemVvZigqdmlkZW9fZW5jLT5pbnRyYV9tYXRyaXgpICogNjQpKSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpbnRyYSBtYXRyaXguXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJzZV9tYXRyaXhfY29lZmZzKHZpZGVvX2VuYy0+aW50cmFfbWF0cml4LCBpbnRyYV9tYXRyaXgpOwotICAgICAgICB9Ci0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGNocm9tYV9pbnRyYV9tYXRyaWNlcywgc3RyLCBjaHJvbWFfaW50cmFfbWF0cml4LCBvYywgc3QpOwotICAgICAgICBpZiAoY2hyb21hX2ludHJhX21hdHJpeCkgewotICAgICAgICAgICAgdWludDE2X3QgKnAgPSBhdl9tYWxsb2N6KHNpemVvZigqdmlkZW9fZW5jLT5jaHJvbWFfaW50cmFfbWF0cml4KSAqIDY0KTsKLSAgICAgICAgICAgIGlmICghcCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpbnRyYSBtYXRyaXguXG4iKTsKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdl9jb2RlY19zZXRfY2hyb21hX2ludHJhX21hdHJpeCh2aWRlb19lbmMsIHApOwotICAgICAgICAgICAgcGFyc2VfbWF0cml4X2NvZWZmcyhwLCBjaHJvbWFfaW50cmFfbWF0cml4KTsKLSAgICAgICAgfQotICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChpbnRlcl9tYXRyaWNlcywgc3RyLCBpbnRlcl9tYXRyaXgsIG9jLCBzdCk7Ci0gICAgICAgIGlmIChpbnRlcl9tYXRyaXgpIHsKLSAgICAgICAgICAgIGlmICghKHZpZGVvX2VuYy0+aW50ZXJfbWF0cml4ID0gYXZfbWFsbG9jeihzaXplb2YoKnZpZGVvX2VuYy0+aW50ZXJfbWF0cml4KSAqIDY0KSkpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgaW50ZXIgbWF0cml4LlxuIik7Ci0gICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyc2VfbWF0cml4X2NvZWZmcyh2aWRlb19lbmMtPmludGVyX21hdHJpeCwgaW50ZXJfbWF0cml4KTsKLSAgICAgICAgfQotCi0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHJjX292ZXJyaWRlcywgc3RyLCBwLCBvYywgc3QpOwotICAgICAgICBmb3IgKGkgPSAwOyBwOyBpKyspIHsKLSAgICAgICAgICAgIGludCBzdGFydCwgZW5kLCBxOwotICAgICAgICAgICAgaW50IGUgPSBzc2NhbmYocCwgIiVkLCVkLCVkIiwgJnN0YXJ0LCAmZW5kLCAmcSk7Ci0gICAgICAgICAgICBpZiAoZSAhPSAzKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgImVycm9yIHBhcnNpbmcgcmNfb3ZlcnJpZGVcbiIpOwotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvX2VuYy0+cmNfb3ZlcnJpZGUgPQotICAgICAgICAgICAgICAgIGF2X3JlYWxsb2NfYXJyYXkodmlkZW9fZW5jLT5yY19vdmVycmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxLCBzaXplb2YoUmNPdmVycmlkZSkpOwotICAgICAgICAgICAgaWYgKCF2aWRlb19lbmMtPnJjX292ZXJyaWRlKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCAocmUpYWxsb2NhdGUgbWVtb3J5IGZvciByY19vdmVycmlkZS5cbiIpOwotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZGVvX2VuYy0+cmNfb3ZlcnJpZGVbaV0uc3RhcnRfZnJhbWUgPSBzdGFydDsKLSAgICAgICAgICAgIHZpZGVvX2VuYy0+cmNfb3ZlcnJpZGVbaV0uZW5kX2ZyYW1lICAgPSBlbmQ7Ci0gICAgICAgICAgICBpZiAocSA+IDApIHsKLSAgICAgICAgICAgICAgICB2aWRlb19lbmMtPnJjX292ZXJyaWRlW2ldLnFzY2FsZSAgICAgICAgID0gcTsKLSAgICAgICAgICAgICAgICB2aWRlb19lbmMtPnJjX292ZXJyaWRlW2ldLnF1YWxpdHlfZmFjdG9yID0gMS4wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmlkZW9fZW5jLT5yY19vdmVycmlkZVtpXS5xc2NhbGUgICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgdmlkZW9fZW5jLT5yY19vdmVycmlkZVtpXS5xdWFsaXR5X2ZhY3RvciA9IC1xLzEwMC4wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCA9IHN0cmNocihwLCAnLycpOwotICAgICAgICAgICAgaWYgKHApIHArKzsKLSAgICAgICAgfQotICAgICAgICB2aWRlb19lbmMtPnJjX292ZXJyaWRlX2NvdW50ID0gaTsKLQotICAgICAgICBpZiAoZG9fcHNucikKLSAgICAgICAgICAgIHZpZGVvX2VuYy0+ZmxhZ3N8PSBBVl9DT0RFQ19GTEFHX1BTTlI7Ci0KLSAgICAgICAgLyogdHdvIHBhc3MgbW9kZSAqLwotICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChwYXNzLCBpLCBkb19wYXNzLCBvYywgc3QpOwotICAgICAgICBpZiAoZG9fcGFzcykgewotICAgICAgICAgICAgaWYgKGRvX3Bhc3MgJiAxKSB7Ci0gICAgICAgICAgICAgICAgdmlkZW9fZW5jLT5mbGFncyB8PSBBVl9DT0RFQ19GTEFHX1BBU1MxOwotICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvc3QtPmVuY29kZXJfb3B0cywgImZsYWdzIiwgIitwYXNzMSIsIEFWX0RJQ1RfQVBQRU5EKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkb19wYXNzICYgMikgewotICAgICAgICAgICAgICAgIHZpZGVvX2VuYy0+ZmxhZ3MgfD0gQVZfQ09ERUNfRkxBR19QQVNTMjsKLSAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3N0LT5lbmNvZGVyX29wdHMsICJmbGFncyIsICIrcGFzczIiLCBBVl9ESUNUX0FQUEVORCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChwYXNzbG9nZmlsZXMsIHN0ciwgb3N0LT5sb2dmaWxlX3ByZWZpeCwgb2MsIHN0KTsKLSAgICAgICAgaWYgKG9zdC0+bG9nZmlsZV9wcmVmaXggJiYKLSAgICAgICAgICAgICEob3N0LT5sb2dmaWxlX3ByZWZpeCA9IGF2X3N0cmR1cChvc3QtPmxvZ2ZpbGVfcHJlZml4KSkpCi0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0KLSAgICAgICAgaWYgKGRvX3Bhc3MpIHsKLSAgICAgICAgICAgIGNoYXIgbG9nZmlsZW5hbWVbMTAyNF07Ci0gICAgICAgICAgICBGSUxFICpmOwotCi0gICAgICAgICAgICBzbnByaW50Zihsb2dmaWxlbmFtZSwgc2l6ZW9mKGxvZ2ZpbGVuYW1lKSwgIiVzLSVkLmxvZyIsCi0gICAgICAgICAgICAgICAgICAgICBvc3QtPmxvZ2ZpbGVfcHJlZml4ID8gb3N0LT5sb2dmaWxlX3ByZWZpeCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVNTX0xPR0ZJTEVOQU1FX1BSRUZJWCwKLSAgICAgICAgICAgICAgICAgICAgIGkpOwotICAgICAgICAgICAgaWYgKCFzdHJjbXAob3N0LT5lbmMtPm5hbWUsICJsaWJ4MjY0IikpIHsKLSAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3N0LT5lbmNvZGVyX29wdHMsICJzdGF0cyIsIGxvZ2ZpbGVuYW1lLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZpZGVvX2VuYy0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgICpsb2didWZmZXIgPSByZWFkX2ZpbGUobG9nZmlsZW5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghbG9nYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRXJyb3IgcmVhZGluZyBsb2cgZmlsZSAnJXMnIGZvciBwYXNzLTIgZW5jb2RpbmdcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvX2VuYy0+c3RhdHNfaW4gPSBsb2didWZmZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2aWRlb19lbmMtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QQVNTMSkgewotICAgICAgICAgICAgICAgICAgICBmID0gYXZfZm9wZW5fdXRmOChsb2dmaWxlbmFtZSwgIndiIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZikgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIGxvZyBmaWxlICclcycgZm9yIHBhc3MtMSBlbmNvZGluZzogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3N0LT5sb2dmaWxlID0gZjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmb3JjZWRfa2V5X2ZyYW1lcywgc3RyLCBvc3QtPmZvcmNlZF9rZXlmcmFtZXMsIG9jLCBzdCk7Ci0gICAgICAgIGlmIChvc3QtPmZvcmNlZF9rZXlmcmFtZXMpCi0gICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXMgPSBhdl9zdHJkdXAob3N0LT5mb3JjZWRfa2V5ZnJhbWVzKTsKLQotICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmb3JjZV9mcHMsIGksIG9zdC0+Zm9yY2VfZnBzLCBvYywgc3QpOwotCi0gICAgICAgIG9zdC0+dG9wX2ZpZWxkX2ZpcnN0ID0gLTE7Ci0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHRvcF9maWVsZF9maXJzdCwgaSwgb3N0LT50b3BfZmllbGRfZmlyc3QsIG9jLCBzdCk7Ci0KLQotICAgICAgICBvc3QtPmF2ZmlsdGVyID0gZ2V0X29zdF9maWx0ZXJzKG8sIG9jLCBvc3QpOwotICAgICAgICBpZiAoIW9zdC0+YXZmaWx0ZXIpCi0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoY29weV9pbml0aWFsX25vbmtleWZyYW1lcywgaSwgb3N0LT5jb3B5X2luaXRpYWxfbm9ua2V5ZnJhbWVzLCBvYyAsc3QpOwotICAgIH0KLQotICAgIGlmIChvc3QtPnN0cmVhbV9jb3B5KQotICAgICAgICBjaGVja19zdHJlYW1jb3B5X2ZpbHRlcnMobywgb2MsIG9zdCwgQVZNRURJQV9UWVBFX1ZJREVPKTsKLQotICAgIHJldHVybiBvc3Q7Ci19Ci0KLXN0YXRpYyBPdXRwdXRTdHJlYW0gKm5ld19hdWRpb19zdHJlYW0oT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqb2MsIGludCBzb3VyY2VfaW5kZXgpCi17Ci0gICAgaW50IG47Ci0gICAgQVZTdHJlYW0gKnN0OwotICAgIE91dHB1dFN0cmVhbSAqb3N0OwotICAgIEFWQ29kZWNDb250ZXh0ICphdWRpb19lbmM7Ci0KLSAgICBvc3QgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBvYywgQVZNRURJQV9UWVBFX0FVRElPLCBzb3VyY2VfaW5kZXgpOwotICAgIHN0ICA9IG9zdC0+c3Q7Ci0KLSAgICBhdWRpb19lbmMgPSBvc3QtPmVuY19jdHg7Ci0gICAgYXVkaW9fZW5jLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotCi0gICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZmlsdGVyX3NjcmlwdHMsIHN0ciwgb3N0LT5maWx0ZXJzX3NjcmlwdCwgb2MsIHN0KTsKLSAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmaWx0ZXJzLCAgICAgICAgc3RyLCBvc3QtPmZpbHRlcnMsICAgICAgICBvYywgc3QpOwotCi0gICAgaWYgKCFvc3QtPnN0cmVhbV9jb3B5KSB7Ci0gICAgICAgIGNoYXIgKnNhbXBsZV9mbXQgPSBOVUxMOwotCi0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGF1ZGlvX2NoYW5uZWxzLCBpLCBhdWRpb19lbmMtPmNoYW5uZWxzLCBvYywgc3QpOwotCi0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHNhbXBsZV9mbXRzLCBzdHIsIHNhbXBsZV9mbXQsIG9jLCBzdCk7Ci0gICAgICAgIGlmIChzYW1wbGVfZm10ICYmCi0gICAgICAgICAgICAoYXVkaW9fZW5jLT5zYW1wbGVfZm10ID0gYXZfZ2V0X3NhbXBsZV9mbXQoc2FtcGxlX2ZtdCkpID09IEFWX1NBTVBMRV9GTVRfTk9ORSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgc2FtcGxlIGZvcm1hdCAnJXMnXG4iLCBzYW1wbGVfZm10KTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGF1ZGlvX3NhbXBsZV9yYXRlLCBpLCBhdWRpb19lbmMtPnNhbXBsZV9yYXRlLCBvYywgc3QpOwotCi0gICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGFwYWQsIHN0ciwgb3N0LT5hcGFkLCBvYywgc3QpOwotICAgICAgICBvc3QtPmFwYWQgPSBhdl9zdHJkdXAob3N0LT5hcGFkKTsKLQotICAgICAgICBvc3QtPmF2ZmlsdGVyID0gZ2V0X29zdF9maWx0ZXJzKG8sIG9jLCBvc3QpOwotICAgICAgICBpZiAoIW9zdC0+YXZmaWx0ZXIpCi0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0KLSAgICAgICAgLyogY2hlY2sgZm9yIGNoYW5uZWwgbWFwcGluZyBmb3IgdGhpcyBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgZm9yIChuID0gMDsgbiA8IG8tPm5iX2F1ZGlvX2NoYW5uZWxfbWFwczsgbisrKSB7Ci0gICAgICAgICAgICBBdWRpb0NoYW5uZWxNYXAgKm1hcCA9ICZvLT5hdWRpb19jaGFubmVsX21hcHNbbl07Ci0gICAgICAgICAgICBpZiAoKG1hcC0+b2ZpbGVfaWR4ICAgPT0gLTEgfHwgb3N0LT5maWxlX2luZGV4ID09IG1hcC0+b2ZpbGVfaWR4KSAmJgotICAgICAgICAgICAgICAgIChtYXAtPm9zdHJlYW1faWR4ID09IC0xIHx8IG9zdC0+c3QtPmluZGV4ICA9PSBtYXAtPm9zdHJlYW1faWR4KSkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtICppc3Q7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWFwLT5jaGFubmVsX2lkeCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBpc3QgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3N0LT5zb3VyY2VfaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDYW5ub3QgZGV0ZXJtaW5lIGlucHV0IHN0cmVhbSBmb3IgY2hhbm5lbCBtYXBwaW5nICVkLiVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPnN0LT5pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghaXN0IHx8IChpc3QtPmZpbGVfaW5kZXggPT0gbWFwLT5maWxlX2lkeCAmJiBpc3QtPnN0LT5pbmRleCA9PSBtYXAtPnN0cmVhbV9pZHgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdl9yZWFsbG9jcF9hcnJheSgmb3N0LT5hdWRpb19jaGFubmVsc19tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmF1ZGlvX2NoYW5uZWxzX21hcHBlZCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA8IDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotCi0gICAgICAgICAgICAgICAgICAgIG9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwW29zdC0+YXVkaW9fY2hhbm5lbHNfbWFwcGVkKytdID0gbWFwLT5jaGFubmVsX2lkeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAob3N0LT5zdHJlYW1fY29weSkKLSAgICAgICAgY2hlY2tfc3RyZWFtY29weV9maWx0ZXJzKG8sIG9jLCBvc3QsIEFWTUVESUFfVFlQRV9BVURJTyk7Ci0KLSAgICByZXR1cm4gb3N0OwotfQotCi1zdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfZGF0YV9zdHJlYW0oT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqb2MsIGludCBzb3VyY2VfaW5kZXgpCi17Ci0gICAgT3V0cHV0U3RyZWFtICpvc3Q7Ci0KLSAgICBvc3QgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBvYywgQVZNRURJQV9UWVBFX0RBVEEsIHNvdXJjZV9pbmRleCk7Ci0gICAgaWYgKCFvc3QtPnN0cmVhbV9jb3B5KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJEYXRhIHN0cmVhbSBlbmNvZGluZyBub3Qgc3VwcG9ydGVkIHlldCAob25seSBzdHJlYW1jb3B5KVxuIik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3N0OwotfQotCi1zdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfdW5rbm93bl9zdHJlYW0oT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqb2MsIGludCBzb3VyY2VfaW5kZXgpCi17Ci0gICAgT3V0cHV0U3RyZWFtICpvc3Q7Ci0KLSAgICBvc3QgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBvYywgQVZNRURJQV9UWVBFX1VOS05PV04sIHNvdXJjZV9pbmRleCk7Ci0gICAgaWYgKCFvc3QtPnN0cmVhbV9jb3B5KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbmtub3duIHN0cmVhbSBlbmNvZGluZyBub3Qgc3VwcG9ydGVkIHlldCAob25seSBzdHJlYW1jb3B5KVxuIik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3N0OwotfQotCi1zdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfYXR0YWNobWVudF9zdHJlYW0oT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqb2MsIGludCBzb3VyY2VfaW5kZXgpCi17Ci0gICAgT3V0cHV0U3RyZWFtICpvc3QgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBvYywgQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQsIHNvdXJjZV9pbmRleCk7Ci0gICAgb3N0LT5zdHJlYW1fY29weSA9IDE7Ci0gICAgb3N0LT5maW5pc2hlZCAgICA9IDE7Ci0gICAgcmV0dXJuIG9zdDsKLX0KLQotc3RhdGljIE91dHB1dFN0cmVhbSAqbmV3X3N1YnRpdGxlX3N0cmVhbShPcHRpb25zQ29udGV4dCAqbywgQVZGb3JtYXRDb250ZXh0ICpvYywgaW50IHNvdXJjZV9pbmRleCkKLXsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgT3V0cHV0U3RyZWFtICpvc3Q7Ci0gICAgQVZDb2RlY0NvbnRleHQgKnN1YnRpdGxlX2VuYzsKLQotICAgIG9zdCA9IG5ld19vdXRwdXRfc3RyZWFtKG8sIG9jLCBBVk1FRElBX1RZUEVfU1VCVElUTEUsIHNvdXJjZV9pbmRleCk7Ci0gICAgc3QgID0gb3N0LT5zdDsKLSAgICBzdWJ0aXRsZV9lbmMgPSBvc3QtPmVuY19jdHg7Ci0KLSAgICBzdWJ0aXRsZV9lbmMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7Ci0KLSAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChjb3B5X2luaXRpYWxfbm9ua2V5ZnJhbWVzLCBpLCBvc3QtPmNvcHlfaW5pdGlhbF9ub25rZXlmcmFtZXMsIG9jLCBzdCk7Ci0KLSAgICBpZiAoIW9zdC0+c3RyZWFtX2NvcHkpIHsKLSAgICAgICAgY2hhciAqZnJhbWVfc2l6ZSA9IE5VTEw7Ci0KLSAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZnJhbWVfc2l6ZXMsIHN0ciwgZnJhbWVfc2l6ZSwgb2MsIHN0KTsKLSAgICAgICAgaWYgKGZyYW1lX3NpemUgJiYgYXZfcGFyc2VfdmlkZW9fc2l6ZSgmc3VidGl0bGVfZW5jLT53aWR0aCwgJnN1YnRpdGxlX2VuYy0+aGVpZ2h0LCBmcmFtZV9zaXplKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGZyYW1lIHNpemU6ICVzLlxuIiwgZnJhbWVfc2l6ZSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gb3N0OwotfQotCi0vKiBhcmcgZm9ybWF0IGlzICJvdXRwdXQtc3RyZWFtLWluZGV4OnN0cmVhbWlkLXZhbHVlIi4gKi8KLXN0YXRpYyBpbnQgb3B0X3N0cmVhbWlkKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7Ci0gICAgaW50IGlkeDsKLSAgICBjaGFyICpwOwotICAgIGNoYXIgaWR4X3N0clsxNl07Ci0KLSAgICBhdl9zdHJsY3B5KGlkeF9zdHIsIGFyZywgc2l6ZW9mKGlkeF9zdHIpKTsKLSAgICBwID0gc3RyY2hyKGlkeF9zdHIsICc6Jyk7Ci0gICAgaWYgKCFwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCi0gICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSAnJXMnIGZvciBvcHRpb24gJyVzJywgcmVxdWlyZWQgc3ludGF4IGlzICdpbmRleDp2YWx1ZSdcbiIsCi0gICAgICAgICAgICAgICBhcmcsIG9wdCk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0gICAgKnArKyA9ICdcMCc7Ci0gICAgaWR4ID0gcGFyc2VfbnVtYmVyX29yX2RpZShvcHQsIGlkeF9zdHIsIE9QVF9JTlQsIDAsIE1BWF9TVFJFQU1TLTEpOwotICAgIG8tPnN0cmVhbWlkX21hcCA9IGdyb3dfYXJyYXkoby0+c3RyZWFtaWRfbWFwLCBzaXplb2YoKm8tPnN0cmVhbWlkX21hcCksICZvLT5uYl9zdHJlYW1pZF9tYXAsIGlkeCsxKTsKLSAgICBvLT5zdHJlYW1pZF9tYXBbaWR4XSA9IHBhcnNlX251bWJlcl9vcl9kaWUob3B0LCBwLCBPUFRfSU5ULCAwLCBJTlRfTUFYKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb3B5X2NoYXB0ZXJzKElucHV0RmlsZSAqaWZpbGUsIE91dHB1dEZpbGUgKm9maWxlLCBpbnQgY29weV9tZXRhZGF0YSkKLXsKLSAgICBBVkZvcm1hdENvbnRleHQgKmlzID0gaWZpbGUtPmN0eDsKLSAgICBBVkZvcm1hdENvbnRleHQgKm9zID0gb2ZpbGUtPmN0eDsKLSAgICBBVkNoYXB0ZXIgKip0bXA7Ci0gICAgaW50IGk7Ci0KLSAgICB0bXAgPSBhdl9yZWFsbG9jX2Yob3MtPmNoYXB0ZXJzLCBpcy0+bmJfY2hhcHRlcnMgKyBvcy0+bmJfY2hhcHRlcnMsIHNpemVvZigqb3MtPmNoYXB0ZXJzKSk7Ci0gICAgaWYgKCF0bXApCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgb3MtPmNoYXB0ZXJzID0gdG1wOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGlzLT5uYl9jaGFwdGVyczsgaSsrKSB7Ci0gICAgICAgIEFWQ2hhcHRlciAqaW5fY2ggPSBpcy0+Y2hhcHRlcnNbaV0sICpvdXRfY2g7Ci0gICAgICAgIGludDY0X3Qgc3RhcnRfdGltZSA9IChvZmlsZS0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgPyAwIDogb2ZpbGUtPnN0YXJ0X3RpbWU7Ci0gICAgICAgIGludDY0X3QgdHNfb2ZmICAgPSBhdl9yZXNjYWxlX3Eoc3RhcnRfdGltZSAtIGlmaWxlLT50c19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSwgaW5fY2gtPnRpbWVfYmFzZSk7Ci0gICAgICAgIGludDY0X3QgcnQgICAgICAgPSAob2ZpbGUtPnJlY29yZGluZ190aW1lID09IElOVDY0X01BWCkgPyBJTlQ2NF9NQVggOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKG9maWxlLT5yZWNvcmRpbmdfdGltZSwgQVZfVElNRV9CQVNFX1EsIGluX2NoLT50aW1lX2Jhc2UpOwotCi0KLSAgICAgICAgaWYgKGluX2NoLT5lbmQgPCB0c19vZmYpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHJ0ICE9IElOVDY0X01BWCAmJiBpbl9jaC0+c3RhcnQgPiBydCArIHRzX29mZikKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIG91dF9jaCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWQ2hhcHRlcikpOwotICAgICAgICBpZiAoIW91dF9jaCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgb3V0X2NoLT5pZCAgICAgICAgPSBpbl9jaC0+aWQ7Ci0gICAgICAgIG91dF9jaC0+dGltZV9iYXNlID0gaW5fY2gtPnRpbWVfYmFzZTsKLSAgICAgICAgb3V0X2NoLT5zdGFydCAgICAgPSBGRk1BWCgwLCAgaW5fY2gtPnN0YXJ0IC0gdHNfb2ZmKTsKLSAgICAgICAgb3V0X2NoLT5lbmQgICAgICAgPSBGRk1JTihydCwgaW5fY2gtPmVuZCAgIC0gdHNfb2ZmKTsKLQotICAgICAgICBpZiAoY29weV9tZXRhZGF0YSkKLSAgICAgICAgICAgIGF2X2RpY3RfY29weSgmb3V0X2NoLT5tZXRhZGF0YSwgaW5fY2gtPm1ldGFkYXRhLCAwKTsKLQotICAgICAgICBvcy0+Y2hhcHRlcnNbb3MtPm5iX2NoYXB0ZXJzKytdID0gb3V0X2NoOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZWFkX2Zmc2VydmVyX3N0cmVhbXMoT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgaW50IGksIGVycjsKLSAgICBBVkZvcm1hdENvbnRleHQgKmljID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOwotCi0gICAgaWMtPmludGVycnVwdF9jYWxsYmFjayA9IGludF9jYjsKLSAgICBlcnIgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZpYywgZmlsZW5hbWUsIE5VTEwsIE5VTEwpOwotICAgIGlmIChlcnIgPCAwKQotICAgICAgICByZXR1cm4gZXJyOwotICAgIC8qIGNvcHkgc3RyZWFtIGZvcm1hdCAqLwotICAgIGZvcihpPTA7aTxpYy0+bmJfc3RyZWFtcztpKyspIHsKLSAgICAgICAgQVZTdHJlYW0gKnN0OwotICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdDsKLSAgICAgICAgQVZDb2RlYyAqY29kZWM7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmVuY19jb25maWc7Ci0KLSAgICAgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2RlcihpYy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkKTsKLSAgICAgICAgaWYgKCFjb2RlYykgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm5vIGVuY29kZXIgZm91bmQgZm9yIGNvZGVjIGlkICVpXG4iLCBpYy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvZGVjLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKLSAgICAgICAgICAgIG9wdF9hdWRpb19jb2RlYyhvLCAiYzphIiwgY29kZWMtPm5hbWUpOwotICAgICAgICBlbHNlIGlmIChjb2RlYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCi0gICAgICAgICAgICBvcHRfdmlkZW9fY29kZWMobywgImM6diIsIGNvZGVjLT5uYW1lKTsKLSAgICAgICAgb3N0ICAgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBzLCBjb2RlYy0+dHlwZSwgLTEpOwotICAgICAgICBzdCAgICA9IG9zdC0+c3Q7Ci0KLSAgICAgICAgYXZjb2RlY19nZXRfY29udGV4dF9kZWZhdWx0czMoc3QtPmNvZGVjLCBjb2RlYyk7Ci0gICAgICAgIGVuY19jb25maWcgPSBhdl9zdHJlYW1fZ2V0X3JlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbihpYy0+c3RyZWFtc1tpXSk7Ci0gICAgICAgIGlmIChlbmNfY29uZmlnKSB7Ci0gICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOwotICAgICAgICAgICAgYXZfZGljdF9wYXJzZV9zdHJpbmcoJm9wdHMsIGVuY19jb25maWcsICI9IiwgIiwiLCAwKTsKLSAgICAgICAgICAgIGF2X29wdF9zZXRfZGljdDIoc3QtPmNvZGVjLCAmb3B0cywgQVZfT1BUX1NFQVJDSF9DSElMRFJFTik7Ci0gICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgIW9zdC0+c3RyZWFtX2NvcHkpCi0gICAgICAgICAgICBjaG9vc2Vfc2FtcGxlX2ZtdChzdCwgY29kZWMpOwotICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmICFvc3QtPnN0cmVhbV9jb3B5KQotICAgICAgICAgICAgY2hvb3NlX3BpeGVsX2ZtdChzdCwgc3QtPmNvZGVjLCBjb2RlYywgc3QtPmNvZGVjLT5waXhfZm10KTsKLSAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQob3N0LT5lbmNfY3R4LCBzdC0+Y29kZWMpOwotICAgICAgICBpZiAoZW5jX2NvbmZpZykKLSAgICAgICAgICAgIGF2X2RpY3RfcGFyc2Vfc3RyaW5nKCZvc3QtPmVuY29kZXJfb3B0cywgZW5jX2NvbmZpZywgIj0iLCAiLCIsIDApOwotICAgIH0KLQotICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZpYyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9vdXRwdXRfZmlsdGVyKE91dHB1dEZpbHRlciAqb2ZpbHRlciwgT3B0aW9uc0NvbnRleHQgKm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpvYykKLXsKLSAgICBPdXRwdXRTdHJlYW0gKm9zdDsKLQotICAgIHN3aXRjaCAob2ZpbHRlci0+dHlwZSkgewotICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiBvc3QgPSBuZXdfdmlkZW9fc3RyZWFtKG8sIG9jLCAtMSk7IGJyZWFrOwotICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOiBvc3QgPSBuZXdfYXVkaW9fc3RyZWFtKG8sIG9jLCAtMSk7IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJPbmx5IHZpZGVvIGFuZCBhdWRpbyBmaWx0ZXJzIGFyZSBzdXBwb3J0ZWQgIgotICAgICAgICAgICAgICAgImN1cnJlbnRseS5cbiIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgb3N0LT5zb3VyY2VfaW5kZXggPSAtMTsKLSAgICBvc3QtPmZpbHRlciAgICAgICA9IG9maWx0ZXI7Ci0KLSAgICBvZmlsdGVyLT5vc3QgICAgICA9IG9zdDsKLQotICAgIGlmIChvc3QtPnN0cmVhbV9jb3B5KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJTdHJlYW1jb3B5IHJlcXVlc3RlZCBmb3Igb3V0cHV0IHN0cmVhbSAlZDolZCwgIgotICAgICAgICAgICAgICAgIndoaWNoIGlzIGZlZCBmcm9tIGEgY29tcGxleCBmaWx0ZXJncmFwaC4gRmlsdGVyaW5nIGFuZCBzdHJlYW1jb3B5ICIKLSAgICAgICAgICAgICAgICJjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5cbiIsIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBpZiAob3N0LT5hdmZpbHRlciAmJiAob3N0LT5maWx0ZXJzIHx8IG9zdC0+ZmlsdGVyc19zY3JpcHQpKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm9wdCA9IG9zdC0+ZmlsdGVycyA/ICItdmYvLWFmLy1maWx0ZXIiIDogIi1maWx0ZXJfc2NyaXB0IjsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICIlcyAnJXMnIHdhcyBzcGVjaWZpZWQgdGhyb3VnaCB0aGUgJXMgb3B0aW9uICIKLSAgICAgICAgICAgICAgICJmb3Igb3V0cHV0IHN0cmVhbSAlZDolZCwgd2hpY2ggaXMgZmVkIGZyb20gYSBjb21wbGV4IGZpbHRlcmdyYXBoLlxuIgotICAgICAgICAgICAgICAgIiVzIGFuZCAtZmlsdGVyX2NvbXBsZXggY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIgZm9yIHRoZSBzYW1lIHN0cmVhbS5cbiIsCi0gICAgICAgICAgICAgICBvc3QtPmZpbHRlcnMgPyAiRmlsdGVyZ3JhcGgiIDogIkZpbHRlcmdyYXBoIHNjcmlwdCIsCi0gICAgICAgICAgICAgICBvc3QtPmZpbHRlcnMgPyBvc3QtPmZpbHRlcnMgOiBvc3QtPmZpbHRlcnNfc2NyaXB0LAotICAgICAgICAgICAgICAgb3B0LCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIG9wdCk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBhdmZpbHRlcl9pbm91dF9mcmVlKCZvZmlsdGVyLT5vdXRfdG1wKTsKLX0KLQotc3RhdGljIGludCBpbml0X2NvbXBsZXhfZmlsdGVycyh2b2lkKQotewotICAgIGludCBpLCByZXQgPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX2ZpbHRlcmdyYXBoczsgaSsrKSB7Ci0gICAgICAgIHJldCA9IGluaXRfY29tcGxleF9maWx0ZXJncmFwaChmaWx0ZXJncmFwaHNbaV0pOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNvbmZpZ3VyZV9jb21wbGV4X2ZpbHRlcnModm9pZCkKLXsKLSAgICBpbnQgaSwgcmV0ID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9maWx0ZXJncmFwaHM7IGkrKykKLSAgICAgICAgaWYgKCFmaWx0ZXJncmFwaHNbaV0tPmdyYXBoICYmCi0gICAgICAgICAgICAocmV0ID0gY29uZmlndXJlX2ZpbHRlcmdyYXBoKGZpbHRlcmdyYXBoc1tpXSkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Blbl9vdXRwdXRfZmlsZShPcHRpb25zQ29udGV4dCAqbywgY29uc3QgY2hhciAqZmlsZW5hbWUpCi17Ci0gICAgQVZGb3JtYXRDb250ZXh0ICpvYzsKLSAgICBpbnQgaSwgaiwgZXJyOwotICAgIEFWT3V0cHV0Rm9ybWF0ICpmaWxlX29mb3JtYXQ7Ci0gICAgT3V0cHV0RmlsZSAqb2Y7Ci0gICAgT3V0cHV0U3RyZWFtICpvc3Q7Ci0gICAgSW5wdXRTdHJlYW0gICppc3Q7Ci0gICAgQVZEaWN0aW9uYXJ5ICp1bnVzZWRfb3B0cyA9IE5VTEw7Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUgPSBOVUxMOwotCi0KLSAgICBpZiAoby0+c3RvcF90aW1lICE9IElOVDY0X01BWCAmJiBvLT5yZWNvcmRpbmdfdGltZSAhPSBJTlQ2NF9NQVgpIHsKLSAgICAgICAgby0+c3RvcF90aW1lID0gSU5UNjRfTUFYOwotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICItdCBhbmQgLXRvIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyOyB1c2luZyAtdC5cbiIpOwotICAgIH0KLQotICAgIGlmIChvLT5zdG9wX3RpbWUgIT0gSU5UNjRfTUFYICYmIG8tPnJlY29yZGluZ190aW1lID09IElOVDY0X01BWCkgewotICAgICAgICBpbnQ2NF90IHN0YXJ0X3RpbWUgPSBvLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFID8gMCA6IG8tPnN0YXJ0X3RpbWU7Ci0gICAgICAgIGlmIChvLT5zdG9wX3RpbWUgPD0gc3RhcnRfdGltZSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIi10byB2YWx1ZSBzbWFsbGVyIHRoYW4gLXNzOyBhYm9ydGluZy5cbiIpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgby0+cmVjb3JkaW5nX3RpbWUgPSBvLT5zdG9wX3RpbWUgLSBzdGFydF90aW1lOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgR1JPV19BUlJBWShvdXRwdXRfZmlsZXMsIG5iX291dHB1dF9maWxlcyk7Ci0gICAgb2YgPSBhdl9tYWxsb2N6KHNpemVvZigqb2YpKTsKLSAgICBpZiAoIW9mKQotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgb3V0cHV0X2ZpbGVzW25iX291dHB1dF9maWxlcyAtIDFdID0gb2Y7Ci0KLSAgICBvZi0+b3N0X2luZGV4ICAgICAgPSBuYl9vdXRwdXRfc3RyZWFtczsKLSAgICBvZi0+cmVjb3JkaW5nX3RpbWUgPSBvLT5yZWNvcmRpbmdfdGltZTsKLSAgICBvZi0+c3RhcnRfdGltZSAgICAgPSBvLT5zdGFydF90aW1lOwotICAgIG9mLT5saW1pdF9maWxlc2l6ZSA9IG8tPmxpbWl0X2ZpbGVzaXplOwotICAgIG9mLT5zaG9ydGVzdCAgICAgICA9IG8tPnNob3J0ZXN0OwotICAgIGF2X2RpY3RfY29weSgmb2YtPm9wdHMsIG8tPmctPmZvcm1hdF9vcHRzLCAwKTsKLQotICAgIGlmICghc3RyY21wKGZpbGVuYW1lLCAiLSIpKQotICAgICAgICBmaWxlbmFtZSA9ICJwaXBlOiI7Ci0KLSAgICBlcnIgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJm9jLCBOVUxMLCBvLT5mb3JtYXQsIGZpbGVuYW1lKTsKLSAgICBpZiAoIW9jKSB7Ci0gICAgICAgIHByaW50X2Vycm9yKGZpbGVuYW1lLCBlcnIpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgb2YtPmN0eCA9IG9jOwotICAgIGlmIChvLT5yZWNvcmRpbmdfdGltZSAhPSBJTlQ2NF9NQVgpCi0gICAgICAgIG9jLT5kdXJhdGlvbiA9IG8tPnJlY29yZGluZ190aW1lOwotCi0gICAgZmlsZV9vZm9ybWF0PSBvYy0+b2Zvcm1hdDsKLSAgICBvYy0+aW50ZXJydXB0X2NhbGxiYWNrID0gaW50X2NiOwotCi0gICAgLyogY3JlYXRlIHN0cmVhbXMgZm9yIGFsbCB1bmxhYmVsZWQgb3V0cHV0IHBhZHMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZmlsdGVyZ3JhcGhzOyBpKyspIHsKLSAgICAgICAgRmlsdGVyR3JhcGggKmZnID0gZmlsdGVyZ3JhcGhzW2ldOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmctPm5iX291dHB1dHM7IGorKykgewotICAgICAgICAgICAgT3V0cHV0RmlsdGVyICpvZmlsdGVyID0gZmctPm91dHB1dHNbal07Ci0KLSAgICAgICAgICAgIGlmICghb2ZpbHRlci0+b3V0X3RtcCB8fCBvZmlsdGVyLT5vdXRfdG1wLT5uYW1lKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBzd2l0Y2ggKG9maWx0ZXItPnR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiAgICBvLT52aWRlb19kaXNhYmxlICAgID0gMTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzogICAgby0+YXVkaW9fZGlzYWJsZSAgICA9IDE7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6IG8tPnN1YnRpdGxlX2Rpc2FibGUgPSAxOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluaXRfb3V0cHV0X2ZpbHRlcihvZmlsdGVyLCBvLCBvYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBmZnNlcnZlciBzZWVraW5nIHdpdGggZGF0ZT0uLi4gbmVlZHMgYSBkYXRlIHJlZmVyZW5jZSAqLwotICAgIGlmICghc3RyY21wKGZpbGVfb2Zvcm1hdC0+bmFtZSwgImZmbSIpICYmCi0gICAgICAgIGF2X3N0cnN0YXJ0KGZpbGVuYW1lLCAiaHR0cDoiLCBOVUxMKSkgewotICAgICAgICBpbnQgZXJyID0gcGFyc2Vfb3B0aW9uKG8sICJtZXRhZGF0YSIsICJjcmVhdGlvbl90aW1lPW5vdyIsIG9wdGlvbnMpOwotICAgICAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICAgICAgcHJpbnRfZXJyb3IoZmlsZW5hbWUsIGVycik7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNtcChmaWxlX29mb3JtYXQtPm5hbWUsICJmZm0iKSAmJiAhb3ZlcnJpZGVfZmZzZXJ2ZXIgJiYKLSAgICAgICAgYXZfc3Ryc3RhcnQoZmlsZW5hbWUsICJodHRwOiIsIE5VTEwpKSB7Ci0gICAgICAgIGludCBqOwotICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGZpbGVzIHNlbnQgdG8gZmZzZXJ2ZXI6IHdlIGdldCB0aGUgc3RyZWFtCi0gICAgICAgICAgIHBhcmFtZXRlcnMgZnJvbSBmZnNlcnZlciAqLwotICAgICAgICBpbnQgZXJyID0gcmVhZF9mZnNlcnZlcl9zdHJlYW1zKG8sIG9jLCBmaWxlbmFtZSk7Ci0gICAgICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICBwcmludF9lcnJvcihmaWxlbmFtZSwgZXJyKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgICAgICBmb3IoaiA9IG5iX291dHB1dF9zdHJlYW1zIC0gb2MtPm5iX3N0cmVhbXM7IGogPCBuYl9vdXRwdXRfc3RyZWFtczsgaisrKSB7Ci0gICAgICAgICAgICBvc3QgPSBvdXRwdXRfc3RyZWFtc1tqXTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIGlmKGlzdC0+c3QtPmNvZGVjLT5jb2RlY190eXBlID09IG9zdC0+c3QtPmNvZGVjLT5jb2RlY190eXBlKXsKLSAgICAgICAgICAgICAgICAgICAgb3N0LT5zeW5jX2lzdD0gaXN0OwotICAgICAgICAgICAgICAgICAgICBvc3QtPnNvdXJjZV9pbmRleD0gaTsKLSAgICAgICAgICAgICAgICAgICAgaWYob3N0LT5zdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSBvc3QtPmF2ZmlsdGVyID0gYXZfc3RyZHVwKCJhbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICBpZihvc3QtPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIG9zdC0+YXZmaWx0ZXIgPSBhdl9zdHJkdXAoIm51bGwiKTsKLSAgICAgICAgICAgICAgICAgICAgaXN0LT5kaXNjYXJkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaXN0LT5zdC0+ZGlzY2FyZCA9IGlzdC0+dXNlcl9zZXRfZGlzY2FyZDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoIW9zdC0+c3luY19pc3QpewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJNaXNzaW5nICVzIHN0cmVhbSB3aGljaCBpcyByZXF1aXJlZCBieSB0aGlzIGZmbVxuIiwgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKG9zdC0+c3QtPmNvZGVjLT5jb2RlY190eXBlKSk7Ci0gICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghby0+bmJfc3RyZWFtX21hcHMpIHsKLSAgICAgICAgY2hhciAqc3VidGl0bGVfY29kZWNfbmFtZSA9IE5VTEw7Ci0gICAgICAgIC8qIHBpY2sgdGhlICJiZXN0IiBzdHJlYW0gb2YgZWFjaCB0eXBlICovCi0KLSAgICAgICAgLyogdmlkZW86IGhpZ2hlc3QgcmVzb2x1dGlvbiAqLwotICAgICAgICBpZiAoIW8tPnZpZGVvX2Rpc2FibGUgJiYgYXZfZ3Vlc3NfY29kZWMob2MtPm9mb3JtYXQsIE5VTEwsIGZpbGVuYW1lLCBOVUxMLCBBVk1FRElBX1RZUEVfVklERU8pICE9IEFWX0NPREVDX0lEX05PTkUpIHsKLSAgICAgICAgICAgIGludCBhcmVhID0gMCwgaWR4ID0gLTE7Ci0gICAgICAgICAgICBpbnQgcWNyID0gYXZmb3JtYXRfcXVlcnlfY29kZWMob2MtPm9mb3JtYXQsIG9jLT5vZm9ybWF0LT52aWRlb19jb2RlYywgMCk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5wdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IG5ld19hcmVhOwotICAgICAgICAgICAgICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgbmV3X2FyZWEgPSBpc3QtPnN0LT5jb2RlYy0+d2lkdGggKiBpc3QtPnN0LT5jb2RlYy0+aGVpZ2h0ICsgMTAwMDAwMDAwKiEhaXN0LT5zdC0+Y29kZWNfaW5mb19uYl9mcmFtZXM7Ci0gICAgICAgICAgICAgICAgaWYoKHFjciE9TUtUQUcoJ0EnLCAnUCcsICdJJywgJ0MnKSkgJiYgKGlzdC0+c3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDKSkKLSAgICAgICAgICAgICAgICAgICAgbmV3X2FyZWEgPSAxOwotICAgICAgICAgICAgICAgIGlmIChpc3QtPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKLSAgICAgICAgICAgICAgICAgICAgbmV3X2FyZWEgPiBhcmVhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChxY3I9PU1LVEFHKCdBJywgJ1AnLCAnSScsICdDJykpICYmICEoaXN0LT5zdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMpKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGFyZWEgPSBuZXdfYXJlYTsKLSAgICAgICAgICAgICAgICAgICAgaWR4ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaWR4ID49IDApCi0gICAgICAgICAgICAgICAgbmV3X3ZpZGVvX3N0cmVhbShvLCBvYywgaWR4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGF1ZGlvOiBtb3N0IGNoYW5uZWxzICovCi0gICAgICAgIGlmICghby0+YXVkaW9fZGlzYWJsZSAmJiBhdl9ndWVzc19jb2RlYyhvYy0+b2Zvcm1hdCwgTlVMTCwgZmlsZW5hbWUsIE5VTEwsIEFWTUVESUFfVFlQRV9BVURJTykgIT0gQVZfQ09ERUNfSURfTk9ORSkgewotICAgICAgICAgICAgaW50IGJlc3Rfc2NvcmUgPSAwLCBpZHggPSAtMTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpbnQgc2NvcmU7Ci0gICAgICAgICAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpXTsKLSAgICAgICAgICAgICAgICBzY29yZSA9IGlzdC0+c3QtPmNvZGVjLT5jaGFubmVscyArIDEwMDAwMDAwMCohIWlzdC0+c3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzOwotICAgICAgICAgICAgICAgIGlmIChpc3QtPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKLSAgICAgICAgICAgICAgICAgICAgc2NvcmUgPiBiZXN0X3Njb3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICAgICAgaWR4ID0gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaWR4ID49IDApCi0gICAgICAgICAgICAgICAgbmV3X2F1ZGlvX3N0cmVhbShvLCBvYywgaWR4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHN1YnRpdGxlczogcGljayBmaXJzdCAqLwotICAgICAgICBNQVRDSF9QRVJfVFlQRV9PUFQoY29kZWNfbmFtZXMsIHN0ciwgc3VidGl0bGVfY29kZWNfbmFtZSwgb2MsICJzIik7Ci0gICAgICAgIGlmICghby0+c3VidGl0bGVfZGlzYWJsZSAmJiAoYXZjb2RlY19maW5kX2VuY29kZXIob2MtPm9mb3JtYXQtPnN1YnRpdGxlX2NvZGVjKSB8fCBzdWJ0aXRsZV9jb2RlY19uYW1lKSkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X3N0cmVhbXM7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXRfc3RyZWFtc1tpXS0+c3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICAgICAgICAgICAgICBBVkNvZGVjRGVzY3JpcHRvciBjb25zdCAqaW5wdXRfZGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGlucHV0X3N0cmVhbXNbaV0tPnN0LT5jb2RlYy0+Y29kZWNfaWQpOwotICAgICAgICAgICAgICAgICAgICBBVkNvZGVjRGVzY3JpcHRvciBjb25zdCAqb3V0cHV0X2Rlc2NyaXB0b3IgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBBVkNvZGVjIGNvbnN0ICpvdXRwdXRfY29kZWMgPQotICAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19maW5kX2VuY29kZXIob2MtPm9mb3JtYXQtPnN1YnRpdGxlX2NvZGVjKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0X3Byb3BzID0gMCwgb3V0cHV0X3Byb3BzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dF9jb2RlYykKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kZXNjcmlwdG9yID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChvdXRwdXRfY29kZWMtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0X2Rlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9wcm9wcyA9IGlucHV0X2Rlc2NyaXB0b3ItPnByb3BzICYgKEFWX0NPREVDX1BST1BfVEVYVF9TVUIgfCBBVl9DT0RFQ19QUk9QX0JJVE1BUF9TVUIpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0X2Rlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcHJvcHMgPSBvdXRwdXRfZGVzY3JpcHRvci0+cHJvcHMgJiAoQVZfQ09ERUNfUFJPUF9URVhUX1NVQiB8IEFWX0NPREVDX1BST1BfQklUTUFQX1NVQik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdWJ0aXRsZV9jb2RlY19uYW1lIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9wcm9wcyAmIG91dHB1dF9wcm9wcyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFwIGR2YiB0ZWxldGV4dCB3aGljaCBoYXMgbmVpdGhlciBwcm9wZXJ0eSB0byBhbnkgb3V0cHV0IHN1YnRpdGxlIGVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2Rlc2NyaXB0b3IgJiYgb3V0cHV0X2Rlc2NyaXB0b3IgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICghaW5wdXRfZGVzY3JpcHRvci0+cHJvcHMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAhb3V0cHV0X2Rlc2NyaXB0b3ItPnByb3BzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3N1YnRpdGxlX3N0cmVhbShvLCBvYywgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBEYXRhIG9ubHkgaWYgY29kZWMgaWQgbWF0Y2ggKi8KLSAgICAgICAgaWYgKCFvLT5kYXRhX2Rpc2FibGUgKSB7Ci0gICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCA9IGF2X2d1ZXNzX2NvZGVjKG9jLT5vZm9ybWF0LCBOVUxMLCBmaWxlbmFtZSwgTlVMTCwgQVZNRURJQV9UWVBFX0RBVEEpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgY29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSAmJiBpIDwgbmJfaW5wdXRfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0X3N0cmVhbXNbaV0tPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQQotICAgICAgICAgICAgICAgICAgICAmJiBpbnB1dF9zdHJlYW1zW2ldLT5zdC0+Y29kZWMtPmNvZGVjX2lkID09IGNvZGVjX2lkICkKLSAgICAgICAgICAgICAgICAgICAgbmV3X2RhdGFfc3RyZWFtKG8sIG9jLCBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBvLT5uYl9zdHJlYW1fbWFwczsgaSsrKSB7Ci0gICAgICAgICAgICBTdHJlYW1NYXAgKm1hcCA9ICZvLT5zdHJlYW1fbWFwc1tpXTsKLQotICAgICAgICAgICAgaWYgKG1hcC0+ZGlzYWJsZWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGlmIChtYXAtPmxpbmtsYWJlbCkgewotICAgICAgICAgICAgICAgIEZpbHRlckdyYXBoICpmZzsKLSAgICAgICAgICAgICAgICBPdXRwdXRGaWx0ZXIgKm9maWx0ZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGludCBqLCBrOwotCi0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5iX2ZpbHRlcmdyYXBoczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZnID0gZmlsdGVyZ3JhcGhzW2pdOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZmctPm5iX291dHB1dHM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqb3V0ID0gZmctPm91dHB1dHNba10tPm91dF90bXA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0ICYmICFzdHJjbXAob3V0LT5uYW1lLCBtYXAtPmxpbmtsYWJlbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmlsdGVyID0gZmctPm91dHB1dHNba107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBsb29wX2VuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLWxvb3BfZW5kOgotICAgICAgICAgICAgICAgIGlmICghb2ZpbHRlcikgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiT3V0cHV0IHdpdGggbGFiZWwgJyVzJyBkb2VzIG5vdCBleGlzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gYW55IGRlZmluZWQgZmlsdGVyIGdyYXBoLCBvciB3YXMgYWxyZWFkeSB1c2VkIGVsc2V3aGVyZS5cbiIsIG1hcC0+bGlua2xhYmVsKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbml0X291dHB1dF9maWx0ZXIob2ZpbHRlciwgbywgb2MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgc3JjX2lkeCA9IGlucHV0X2ZpbGVzW21hcC0+ZmlsZV9pbmRleF0tPmlzdF9pbmRleCArIG1hcC0+c3RyZWFtX2luZGV4OwotCi0gICAgICAgICAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpbnB1dF9maWxlc1ttYXAtPmZpbGVfaW5kZXhdLT5pc3RfaW5kZXggKyBtYXAtPnN0cmVhbV9pbmRleF07Ci0gICAgICAgICAgICAgICAgaWYoby0+c3VidGl0bGVfZGlzYWJsZSAmJiBpc3QtPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmKG8tPiAgIGF1ZGlvX2Rpc2FibGUgJiYgaXN0LT5zdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZihvLT4gICB2aWRlb19kaXNhYmxlICYmIGlzdC0+c3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgaWYoby0+ICAgIGRhdGFfZGlzYWJsZSAmJiBpc3QtPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBvc3QgPSBOVUxMOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoaXN0LT5zdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzogICAgICBvc3QgPSBuZXdfdmlkZW9fc3RyZWFtICAgICAobywgb2MsIHNyY19pZHgpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzogICAgICBvc3QgPSBuZXdfYXVkaW9fc3RyZWFtICAgICAobywgb2MsIHNyY19pZHgpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRTogICBvc3QgPSBuZXdfc3VidGl0bGVfc3RyZWFtICAobywgb2MsIHNyY19pZHgpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOiAgICAgICBvc3QgPSBuZXdfZGF0YV9zdHJlYW0gICAgICAobywgb2MsIHNyY19pZHgpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UOiBvc3QgPSBuZXdfYXR0YWNobWVudF9zdHJlYW0obywgb2MsIHNyY19pZHgpOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9VTktOT1dOOgotICAgICAgICAgICAgICAgICAgICBpZiAoY29weV91bmtub3duX3N0cmVhbXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9zdCA9IG5ld191bmtub3duX3N0cmVhbSAgIChvLCBvYywgc3JjX2lkeCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBpZ25vcmVfdW5rbm93bl9zdHJlYW1zID8gQVZfTE9HX1dBUk5JTkcgOiBBVl9MT0dfRkFUQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IG1hcCBzdHJlYW0gIyVkOiVkIC0gdW5zdXBwb3J0ZWQgdHlwZS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAtPmZpbGVfaW5kZXgsIG1hcC0+c3RyZWFtX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpZ25vcmVfdW5rbm93bl9zdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJZiB5b3Ugd2FudCB1bnN1cHBvcnRlZCB0eXBlcyBpZ25vcmVkIGluc3RlYWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZiBmYWlsaW5nLCBwbGVhc2UgdXNlIHRoZSAtaWdub3JlX3Vua25vd24gb3B0aW9uXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklmIHlvdSB3YW50IHRoZW0gY29waWVkLCBwbGVhc2UgdXNlIC1jb3B5X3Vua25vd25cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChvc3QpCi0gICAgICAgICAgICAgICAgICAgIG9zdC0+c3luY19pc3QgPSBpbnB1dF9zdHJlYW1zWyAgaW5wdXRfZmlsZXNbbWFwLT5zeW5jX2ZpbGVfaW5kZXhdLT5pc3RfaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtYXAtPnN5bmNfc3RyZWFtX2luZGV4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGhhbmRsZSBhdHRhY2hlZCBmaWxlcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBvLT5uYl9hdHRhY2htZW50czsgaSsrKSB7Ci0gICAgICAgIEFWSU9Db250ZXh0ICpwYjsKLSAgICAgICAgdWludDhfdCAqYXR0YWNobWVudDsKLSAgICAgICAgY29uc3QgY2hhciAqcDsKLSAgICAgICAgaW50NjRfdCBsZW47Ci0KLSAgICAgICAgaWYgKChlcnIgPSBhdmlvX29wZW4yKCZwYiwgby0+YXR0YWNobWVudHNbaV0sIEFWSU9fRkxBR19SRUFELCAmaW50X2NiLCBOVUxMKSkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IG9wZW4gYXR0YWNobWVudCBmaWxlICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICBvLT5hdHRhY2htZW50c1tpXSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChsZW4gPSBhdmlvX3NpemUocGIpKSA8PSAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGdldCBzaXplIG9mIHRoZSBhdHRhY2htZW50ICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICBvLT5hdHRhY2htZW50c1tpXSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEoYXR0YWNobWVudCA9IGF2X21hbGxvYyhsZW4pKSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkF0dGFjaG1lbnQgJXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIG1lbW9yeS5cbiIsCi0gICAgICAgICAgICAgICAgICAgby0+YXR0YWNobWVudHNbaV0pOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgICAgIGF2aW9fcmVhZChwYiwgYXR0YWNobWVudCwgbGVuKTsKLQotICAgICAgICBvc3QgPSBuZXdfYXR0YWNobWVudF9zdHJlYW0obywgb2MsIC0xKTsKLSAgICAgICAgb3N0LT5zdHJlYW1fY29weSAgICAgICAgICAgICAgID0gMTsKLSAgICAgICAgb3N0LT5hdHRhY2htZW50X2ZpbGVuYW1lICAgICAgID0gby0+YXR0YWNobWVudHNbaV07Ci0gICAgICAgIG9zdC0+ZmluaXNoZWQgICAgICAgICAgICAgICAgICA9IDE7Ci0gICAgICAgIG9zdC0+c3QtPmNvZGVjLT5leHRyYWRhdGEgICAgICA9IGF0dGFjaG1lbnQ7Ci0gICAgICAgIG9zdC0+c3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IGxlbjsKLQotICAgICAgICBwID0gc3RycmNocihvLT5hdHRhY2htZW50c1tpXSwgJy8nKTsKLSAgICAgICAgYXZfZGljdF9zZXQoJm9zdC0+c3QtPm1ldGFkYXRhLCAiZmlsZW5hbWUiLCAocCAmJiAqcCkgPyBwICsgMSA6IG8tPmF0dGFjaG1lbnRzW2ldLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLSAgICAgICAgYXZpb19jbG9zZXAoJnBiKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSBuYl9vdXRwdXRfc3RyZWFtcyAtIG9jLT5uYl9zdHJlYW1zOyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgeyAvL2ZvciBhbGwgc3RyZWFtcyBvZiB0aGlzIG91dHB1dCBmaWxlCi0gICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICplOwotICAgICAgICBvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLQotICAgICAgICBpZiAoKG9zdC0+c3RyZWFtX2NvcHkgfHwgb3N0LT5hdHRhY2htZW50X2ZpbGVuYW1lKQotICAgICAgICAgICAgJiYgKGUgPSBhdl9kaWN0X2dldChvLT5nLT5jb2RlY19vcHRzLCAiZmxhZ3MiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKQotICAgICAgICAgICAgJiYgKCFlLT5rZXlbNV0gfHwgY2hlY2tfc3RyZWFtX3NwZWNpZmllcihvYywgb3N0LT5zdCwgZS0+a2V5KzYpKSkKLSAgICAgICAgICAgIGlmIChhdl9vcHRfc2V0KG9zdC0+c3QtPmNvZGVjLCAiZmxhZ3MiLCBlLT52YWx1ZSwgMCkgPCAwKQotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBpZiAoIW9jLT5uYl9zdHJlYW1zICYmICEob2MtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9TVFJFQU1TKSkgewotICAgICAgICBhdl9kdW1wX2Zvcm1hdChvYywgbmJfb3V0cHV0X2ZpbGVzIC0gMSwgb2MtPmZpbGVuYW1lLCAxKTsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk91dHB1dCBmaWxlICMlZCBkb2VzIG5vdCBjb250YWluIGFueSBzdHJlYW1cbiIsIG5iX291dHB1dF9maWxlcyAtIDEpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgaWYgYWxsIGNvZGVjIG9wdGlvbnMgaGF2ZSBiZWVuIHVzZWQgKi8KLSAgICB1bnVzZWRfb3B0cyA9IHN0cmlwX3NwZWNpZmllcnMoby0+Zy0+Y29kZWNfb3B0cyk7Ci0gICAgZm9yIChpID0gb2YtPm9zdF9pbmRleDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgZSA9IE5VTEw7Ci0gICAgICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KG91dHB1dF9zdHJlYW1zW2ldLT5lbmNvZGVyX29wdHMsICIiLCBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZ1bnVzZWRfb3B0cywgZS0+a2V5LCBOVUxMLCAwKTsKLSAgICB9Ci0KLSAgICBlID0gTlVMTDsKLSAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldCh1bnVzZWRfb3B0cywgIiIsIGUsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7Ci0gICAgICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzID0gYXZjb2RlY19nZXRfY2xhc3MoKTsKLSAgICAgICAgY29uc3QgQVZPcHRpb24gKm9wdGlvbiA9IGF2X29wdF9maW5kKCZjbGFzcywgZS0+a2V5LCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiB8IEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopOwotICAgICAgICBjb25zdCBBVkNsYXNzICpmY2xhc3MgPSBhdmZvcm1hdF9nZXRfY2xhc3MoKTsKLSAgICAgICAgY29uc3QgQVZPcHRpb24gKmZvcHRpb24gPSBhdl9vcHRfZmluZCgmZmNsYXNzLCBlLT5rZXksIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiB8IEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopOwotICAgICAgICBpZiAoIW9wdGlvbiB8fCBmb3B0aW9uKQotICAgICAgICAgICAgY29udGludWU7Ci0KLQotICAgICAgICBpZiAoIShvcHRpb24tPmZsYWdzICYgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0pKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ29kZWMgQVZPcHRpb24gJXMgKCVzKSBzcGVjaWZpZWQgZm9yICIKLSAgICAgICAgICAgICAgICAgICAib3V0cHV0IGZpbGUgIyVkICglcykgaXMgbm90IGFuIGVuY29kaW5nIG9wdGlvbi5cbiIsIGUtPmtleSwKLSAgICAgICAgICAgICAgICAgICBvcHRpb24tPmhlbHAgPyBvcHRpb24tPmhlbHAgOiAiIiwgbmJfb3V0cHV0X2ZpbGVzIC0gMSwKLSAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBnb3BfdGltZWNvZGUgaXMgaW5qZWN0ZWQgYnkgZ2VuZXJpYyBjb2RlIGJ1dCBub3QgYWx3YXlzIHVzZWQKLSAgICAgICAgaWYgKCFzdHJjbXAoZS0+a2V5LCAiZ29wX3RpbWVjb2RlIikpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJDb2RlYyBBVk9wdGlvbiAlcyAoJXMpIHNwZWNpZmllZCBmb3IgIgotICAgICAgICAgICAgICAgIm91dHB1dCBmaWxlICMlZCAoJXMpIGhhcyBub3QgYmVlbiB1c2VkIGZvciBhbnkgc3RyZWFtLiBUaGUgbW9zdCAiCi0gICAgICAgICAgICAgICAibGlrZWx5IHJlYXNvbiBpcyBlaXRoZXIgd3JvbmcgdHlwZSAoZS5nLiBhIHZpZGVvIG9wdGlvbiB3aXRoICIKLSAgICAgICAgICAgICAgICJubyB2aWRlbyBzdHJlYW1zKSBvciB0aGF0IGl0IGlzIGEgcHJpdmF0ZSBvcHRpb24gb2Ygc29tZSBlbmNvZGVyICIKLSAgICAgICAgICAgICAgICJ3aGljaCB3YXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGFueSBzdHJlYW0uXG4iLCBlLT5rZXksCi0gICAgICAgICAgICAgICBvcHRpb24tPmhlbHAgPyBvcHRpb24tPmhlbHAgOiAiIiwgbmJfb3V0cHV0X2ZpbGVzIC0gMSwgZmlsZW5hbWUpOwotICAgIH0KLSAgICBhdl9kaWN0X2ZyZWUoJnVudXNlZF9vcHRzKTsKLQotICAgIC8qIHNldCB0aGUgZW5jb2RpbmcvZGVjb2RpbmdfbmVlZGVkIGZsYWdzICovCi0gICAgZm9yIChpID0gb2YtPm9zdF9pbmRleDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKLQotICAgICAgICBvc3QtPmVuY29kaW5nX25lZWRlZCA9ICFvc3QtPnN0cmVhbV9jb3B5OwotICAgICAgICBpZiAob3N0LT5lbmNvZGluZ19uZWVkZWQgJiYgb3N0LT5zb3VyY2VfaW5kZXggPj0gMCkgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gKmlzdCA9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdOwotICAgICAgICAgICAgaXN0LT5kZWNvZGluZ19uZWVkZWQgfD0gREVDT0RJTkdfRk9SX09TVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNoZWNrIGZpbGVuYW1lIGluIGNhc2Ugb2YgYW4gaW1hZ2UgbnVtYmVyIGlzIGV4cGVjdGVkICovCi0gICAgaWYgKG9jLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX05FRUROVU1CRVIpIHsKLSAgICAgICAgaWYgKCFhdl9maWxlbmFtZV9udW1iZXJfdGVzdChvYy0+ZmlsZW5hbWUpKSB7Ci0gICAgICAgICAgICBwcmludF9lcnJvcihvYy0+ZmlsZW5hbWUsIEFWRVJST1IoRUlOVkFMKSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIShvYy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT1NUUkVBTVMpICYmICFpbnB1dF9zdHJlYW1fcG90ZW50aWFsbHlfYXZhaWxhYmxlKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiTm8gaW5wdXQgc3RyZWFtcyBidXQgb3V0cHV0IG5lZWRzIGFuIGlucHV0IHN0cmVhbVxuIik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBpZiAoIShvYy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpKSB7Ci0gICAgICAgIC8qIHRlc3QgaWYgaXQgYWxyZWFkeSBleGlzdHMgdG8gYXZvaWQgbG9zaW5nIHByZWNpb3VzIGZpbGVzICovCi0gICAgICAgIGFzc2VydF9maWxlX292ZXJ3cml0ZShmaWxlbmFtZSk7Ci0KLSAgICAgICAgLyogb3BlbiB0aGUgZmlsZSAqLwotICAgICAgICBpZiAoKGVyciA9IGF2aW9fb3BlbjIoJm9jLT5wYiwgZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYy0+aW50ZXJydXB0X2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mLT5vcHRzKSkgPCAwKSB7Ci0gICAgICAgICAgICBwcmludF9lcnJvcihmaWxlbmFtZSwgZXJyKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3RyY21wKG9jLT5vZm9ybWF0LT5uYW1lLCAiaW1hZ2UyIik9PTAgJiYgIWF2X2ZpbGVuYW1lX251bWJlcl90ZXN0KGZpbGVuYW1lKSkKLSAgICAgICAgYXNzZXJ0X2ZpbGVfb3ZlcndyaXRlKGZpbGVuYW1lKTsKLQotICAgIGlmIChvLT5tdXhfcHJlbG9hZCkgewotICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm9mLT5vcHRzLCAicHJlbG9hZCIsIG8tPm11eF9wcmVsb2FkKkFWX1RJTUVfQkFTRSwgMCk7Ci0gICAgfQotICAgIG9jLT5tYXhfZGVsYXkgPSAoaW50KShvLT5tdXhfbWF4X2RlbGF5ICogQVZfVElNRV9CQVNFKTsKLQotICAgIC8qIGNvcHkgbWV0YWRhdGEgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgby0+bmJfbWV0YWRhdGFfbWFwOyBpKyspIHsKLSAgICAgICAgY2hhciAqcDsKLSAgICAgICAgaW50IGluX2ZpbGVfaW5kZXggPSBzdHJ0b2woby0+bWV0YWRhdGFfbWFwW2ldLnUuc3RyLCAmcCwgMCk7Ci0KLSAgICAgICAgaWYgKGluX2ZpbGVfaW5kZXggPj0gbmJfaW5wdXRfZmlsZXMpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGlucHV0IGZpbGUgaW5kZXggJWQgd2hpbGUgcHJvY2Vzc2luZyBtZXRhZGF0YSBtYXBzXG4iLCBpbl9maWxlX2luZGV4KTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgICAgICBjb3B5X21ldGFkYXRhKG8tPm1ldGFkYXRhX21hcFtpXS5zcGVjaWZpZXIsICpwID8gcCArIDEgOiBwLCBvYywKLSAgICAgICAgICAgICAgICAgICAgICBpbl9maWxlX2luZGV4ID49IDAgPwotICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2ZpbGVzW2luX2ZpbGVfaW5kZXhdLT5jdHggOiBOVUxMLCBvKTsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IGNoYXB0ZXJzICovCi0gICAgaWYgKG8tPmNoYXB0ZXJzX2lucHV0X2ZpbGUgPj0gbmJfaW5wdXRfZmlsZXMpIHsKLSAgICAgICAgaWYgKG8tPmNoYXB0ZXJzX2lucHV0X2ZpbGUgPT0gSU5UX01BWCkgewotICAgICAgICAgICAgLyogY29weSBjaGFwdGVycyBmcm9tIHRoZSBmaXJzdCBpbnB1dCBmaWxlIHRoYXQgaGFzIHRoZW0qLwotICAgICAgICAgICAgby0+Y2hhcHRlcnNfaW5wdXRfZmlsZSA9IC0xOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X2ZpbGVzOyBpKyspCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0X2ZpbGVzW2ldLT5jdHgtPm5iX2NoYXB0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG8tPmNoYXB0ZXJzX2lucHV0X2ZpbGUgPSBpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBpbnB1dCBmaWxlIGluZGV4ICVkIGluIGNoYXB0ZXIgbWFwcGluZy5cbiIsCi0gICAgICAgICAgICAgICAgICAgby0+Y2hhcHRlcnNfaW5wdXRfZmlsZSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG8tPmNoYXB0ZXJzX2lucHV0X2ZpbGUgPj0gMCkKLSAgICAgICAgY29weV9jaGFwdGVycyhpbnB1dF9maWxlc1tvLT5jaGFwdGVyc19pbnB1dF9maWxlXSwgb2YsCi0gICAgICAgICAgICAgICAgICAgICAgIW8tPm1ldGFkYXRhX2NoYXB0ZXJzX21hbnVhbCk7Ci0KLSAgICAvKiBjb3B5IGdsb2JhbCBtZXRhZGF0YSBieSBkZWZhdWx0ICovCi0gICAgaWYgKCFvLT5tZXRhZGF0YV9nbG9iYWxfbWFudWFsICYmIG5iX2lucHV0X2ZpbGVzKXsKLSAgICAgICAgYXZfZGljdF9jb3B5KCZvYy0+bWV0YWRhdGEsIGlucHV0X2ZpbGVzWzBdLT5jdHgtPm1ldGFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX09WRVJXUklURSk7Ci0gICAgICAgIGlmKG8tPnJlY29yZGluZ190aW1lICE9IElOVDY0X01BWCkKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvYy0+bWV0YWRhdGEsICJkdXJhdGlvbiIsIE5VTEwsIDApOwotICAgICAgICBhdl9kaWN0X3NldCgmb2MtPm1ldGFkYXRhLCAiY3JlYXRpb25fdGltZSIsIE5VTEwsIDApOwotICAgIH0KLSAgICBpZiAoIW8tPm1ldGFkYXRhX3N0cmVhbXNfbWFudWFsKQotICAgICAgICBmb3IgKGkgPSBvZi0+b3N0X2luZGV4OyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgSW5wdXRTdHJlYW0gKmlzdDsKLSAgICAgICAgICAgIGlmIChvdXRwdXRfc3RyZWFtc1tpXS0+c291cmNlX2luZGV4IDwgMCkgICAgICAgICAvKiB0aGlzIGlzIHRydWUgZS5nLiBmb3IgYXR0YWNoZWQgZmlsZXMgKi8KLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbb3V0cHV0X3N0cmVhbXNbaV0tPnNvdXJjZV9pbmRleF07Ci0gICAgICAgICAgICBhdl9kaWN0X2NvcHkoJm91dHB1dF9zdHJlYW1zW2ldLT5zdC0+bWV0YWRhdGEsIGlzdC0+c3QtPm1ldGFkYXRhLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLSAgICAgICAgICAgIGlmICghb3V0cHV0X3N0cmVhbXNbaV0tPnN0cmVhbV9jb3B5KSB7Ci0gICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJm91dHB1dF9zdHJlYW1zW2ldLT5zdC0+bWV0YWRhdGEsICJlbmNvZGVyIiwgTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzdC0+YXV0b3JvdGF0ZSkKLSAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJm91dHB1dF9zdHJlYW1zW2ldLT5zdC0+bWV0YWRhdGEsICJyb3RhdGUiLCBOVUxMLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgLyogcHJvY2VzcyBtYW51YWxseSBzZXQgcHJvZ3JhbXMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgby0+bmJfcHJvZ3JhbTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnAgPSBvLT5wcm9ncmFtW2ldLnUuc3RyOwotICAgICAgICBpbnQgcHJvZ2lkID0gaSsxOwotICAgICAgICBBVlByb2dyYW0gKnByb2dyYW07Ci0KLSAgICAgICAgd2hpbGUoKnApIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAyID0gYXZfZ2V0X3Rva2VuKCZwLCAiOiIpOwotICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fZGVhbGxvYyA9IHAyOwotICAgICAgICAgICAgY2hhciAqa2V5OwotICAgICAgICAgICAgaWYgKCFwMikKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYoKnApIHArKzsKLQotICAgICAgICAgICAga2V5ID0gYXZfZ2V0X3Rva2VuKCZwMiwgIj0iKTsKLSAgICAgICAgICAgIGlmICgha2V5IHx8ICEqcDIpIHsKLSAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdG9fZGVhbGxvYyk7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZXAoJmtleSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwMisrOwotCi0gICAgICAgICAgICBpZiAoIXN0cmNtcChrZXksICJwcm9ncmFtX251bSIpKQotICAgICAgICAgICAgICAgIHByb2dpZCA9IHN0cnRvbChwMiwgTlVMTCwgMCk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmdG9fZGVhbGxvYyk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgma2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2dyYW0gPSBhdl9uZXdfcHJvZ3JhbShvYywgcHJvZ2lkKTsKLQotICAgICAgICBwID0gby0+cHJvZ3JhbVtpXS51LnN0cjsKLSAgICAgICAgd2hpbGUoKnApIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAyID0gYXZfZ2V0X3Rva2VuKCZwLCAiOiIpOwotICAgICAgICAgICAgY29uc3QgY2hhciAqdG9fZGVhbGxvYyA9IHAyOwotICAgICAgICAgICAgY2hhciAqa2V5OwotICAgICAgICAgICAgaWYgKCFwMikKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmKCpwKSBwKys7Ci0KLSAgICAgICAgICAgIGtleSA9IGF2X2dldF90b2tlbigmcDIsICI9Iik7Ci0gICAgICAgICAgICBpZiAoIWtleSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICJObyAnPScgY2hhcmFjdGVyIGluIHByb2dyYW0gc3RyaW5nICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcDIpOwotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghKnAyKQotICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIHAyKys7Ci0KLSAgICAgICAgICAgIGlmICghc3RyY21wKGtleSwgInRpdGxlIikpIHsKLSAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcHJvZ3JhbS0+bWV0YWRhdGEsICJ0aXRsZSIsIHAyLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJwcm9ncmFtX251bSIpKSB7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAic3QiKSkgewotICAgICAgICAgICAgICAgIGludCBzdF9udW0gPSBzdHJ0b2wocDIsIE5VTEwsIDApOwotICAgICAgICAgICAgICAgIGF2X3Byb2dyYW1fYWRkX3N0cmVhbV9pbmRleChvYywgcHJvZ2lkLCBzdF9udW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiVW5rbm93biBwcm9ncmFtIGtleSAlcy5cbiIsIGtleSk7Ci0gICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZfZnJlZXAoJnRvX2RlYWxsb2MpOwotICAgICAgICAgICAgYXZfZnJlZXAoJmtleSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwcm9jZXNzIG1hbnVhbGx5IHNldCBtZXRhZGF0YSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBvLT5uYl9tZXRhZGF0YTsgaSsrKSB7Ci0gICAgICAgIEFWRGljdGlvbmFyeSAqKm07Ci0gICAgICAgIGNoYXIgdHlwZSwgKnZhbDsKLSAgICAgICAgY29uc3QgY2hhciAqc3RyZWFtX3NwZWM7Ci0gICAgICAgIGludCBpbmRleCA9IDAsIGosIHJldCA9IDA7Ci0gICAgICAgIGNoYXIgbm93X3RpbWVbMjU2XTsKLQotICAgICAgICB2YWwgPSBzdHJjaHIoby0+bWV0YWRhdGFbaV0udS5zdHIsICc9Jyk7Ci0gICAgICAgIGlmICghdmFsKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiTm8gJz0nIGNoYXJhY3RlciBpbiBtZXRhZGF0YSBzdHJpbmcgJXMuXG4iLAotICAgICAgICAgICAgICAgICAgIG8tPm1ldGFkYXRhW2ldLnUuc3RyKTsKLSAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgfQotICAgICAgICAqdmFsKysgPSAwOwotCi0gICAgICAgIGlmICghc3RyY21wKG8tPm1ldGFkYXRhW2ldLnUuc3RyLCAiY3JlYXRpb25fdGltZSIpICYmCi0gICAgICAgICAgICAhc3RyY21wKHZhbCwgIm5vdyIpKSB7Ci0gICAgICAgICAgICB0aW1lX3Qgbm93ID0gdGltZSgwKTsKLSAgICAgICAgICAgIHN0cnVjdCB0bSAqcHRtLCB0bWJ1ZjsKLSAgICAgICAgICAgIHB0bSA9IGxvY2FsdGltZV9yKCZub3csICZ0bWJ1Zik7Ci0gICAgICAgICAgICBpZiAocHRtKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmZ0aW1lKG5vd190aW1lLCBzaXplb2Yobm93X3RpbWUpLCAiJVktJW0tJWQgJUg6JU06JVMiLCBwdG0pKQotICAgICAgICAgICAgICAgICAgICB2YWwgPSBub3dfdGltZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHBhcnNlX21ldGFfdHlwZShvLT5tZXRhZGF0YVtpXS5zcGVjaWZpZXIsICZ0eXBlLCAmaW5kZXgsICZzdHJlYW1fc3BlYyk7Ci0gICAgICAgIGlmICh0eXBlID09ICdzJykgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9jLT5uYl9zdHJlYW1zOyBqKyspIHsKLSAgICAgICAgICAgICAgICBvc3QgPSBvdXRwdXRfc3RyZWFtc1tuYl9vdXRwdXRfc3RyZWFtcyAtIG9jLT5uYl9zdHJlYW1zICsgal07Ci0gICAgICAgICAgICAgICAgaWYgKChyZXQgPSBjaGVja19zdHJlYW1fc3BlY2lmaWVyKG9jLCBvYy0+c3RyZWFtc1tqXSwgc3RyZWFtX3NwZWMpKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9jLT5zdHJlYW1zW2pdLT5tZXRhZGF0YSwgby0+bWV0YWRhdGFbaV0udS5zdHIsICp2YWwgPyB2YWwgOiBOVUxMLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoby0+bWV0YWRhdGFbaV0udS5zdHIsICJyb3RhdGUiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5yb3RhdGVfb3ZlcnJpZGRlbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSAnZyc6Ci0gICAgICAgICAgICAgICAgbSA9ICZvYy0+bWV0YWRhdGE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG9jLT5uYl9jaGFwdGVycykgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBjaGFwdGVyIGluZGV4ICVkIGluIG1ldGFkYXRhIHNwZWNpZmllci5cbiIsIGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtID0gJm9jLT5jaGFwdGVyc1tpbmRleF0tPm1ldGFkYXRhOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBvYy0+bmJfcHJvZ3JhbXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgcHJvZ3JhbSBpbmRleCAlZCBpbiBtZXRhZGF0YSBzcGVjaWZpZXIuXG4iLCBpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbSA9ICZvYy0+cHJvZ3JhbXNbaW5kZXhdLT5tZXRhZGF0YTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgbWV0YWRhdGEgc3BlY2lmaWVyICVzLlxuIiwgby0+bWV0YWRhdGFbaV0uc3BlY2lmaWVyKTsKLSAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdl9kaWN0X3NldChtLCBvLT5tZXRhZGF0YVtpXS51LnN0ciwgKnZhbCA/IHZhbCA6IE5VTEwsIDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3RhcmdldCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OwotICAgIGVudW0geyBQQUwsIE5UU0MsIEZJTE0sIFVOS05PV04gfSBub3JtID0gVU5LTk9XTjsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZnJhbWVfcmF0ZXNbXSA9IHsgIjI1IiwgIjMwMDAwLzEwMDEiLCAiMjQwMDAvMTAwMSIgfTsKLQotICAgIGlmICghc3RybmNtcChhcmcsICJwYWwtIiwgNCkpIHsKLSAgICAgICAgbm9ybSA9IFBBTDsKLSAgICAgICAgYXJnICs9IDQ7Ci0gICAgfSBlbHNlIGlmICghc3RybmNtcChhcmcsICJudHNjLSIsIDUpKSB7Ci0gICAgICAgIG5vcm0gPSBOVFNDOwotICAgICAgICBhcmcgKz0gNTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZywgImZpbG0tIiwgNSkpIHsKLSAgICAgICAgbm9ybSA9IEZJTE07Ci0gICAgICAgIGFyZyArPSA1OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFRyeSB0byBkZXRlcm1pbmUgUEFML05UU0MgYnkgcGVla2luZyBpbiB0aGUgaW5wdXQgZmlsZXMgKi8KLSAgICAgICAgaWYgKG5iX2lucHV0X2ZpbGVzKSB7Ci0gICAgICAgICAgICBpbnQgaSwgaiwgZnI7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmJfaW5wdXRfZmlsZXM7IGorKykgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnB1dF9maWxlc1tqXS0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjID0gaW5wdXRfZmlsZXNbal0tPmN0eC0+c3RyZWFtc1tpXS0+Y29kZWM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIWMtPnRpbWVfYmFzZS5udW0pCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgZnIgPSBjLT50aW1lX2Jhc2UuZGVuICogMTAwMCAvIGMtPnRpbWVfYmFzZS5udW07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmciA9PSAyNTAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9IFBBTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmciA9PSAyOTk3MCkgfHwgKGZyID09IDIzOTc2KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9IE5UU0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobm9ybSAhPSBVTktOT1dOKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobm9ybSAhPSBVTktOT1dOKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiQXNzdW1pbmcgJXMgZm9yIHRhcmdldC5cbiIsIG5vcm0gPT0gUEFMID8gIlBBTCIgOiAiTlRTQyIpOwotICAgIH0KLQotICAgIGlmIChub3JtID09IFVOS05PV04pIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCBkZXRlcm1pbmUgbm9ybSAoUEFML05UU0MvTlRTQy1GaWxtKSBmb3IgdGFyZ2V0LlxuIik7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJQbGVhc2UgcHJlZml4IHRhcmdldCB3aXRoIFwicGFsLVwiLCBcIm50c2MtXCIgb3IgXCJmaWxtLVwiLFxuIik7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJvciBzZXQgYSBmcmFtZXJhdGUgd2l0aCBcIi1yIHh4eFwiLlxuIik7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBpZiAoIXN0cmNtcChhcmcsICJ2Y2QiKSkgewotICAgICAgICBvcHRfdmlkZW9fY29kZWMobywgImM6diIsICJtcGVnMXZpZGVvIik7Ci0gICAgICAgIG9wdF9hdWRpb19jb2RlYyhvLCAiYzphIiwgIm1wMiIpOwotICAgICAgICBwYXJzZV9vcHRpb24obywgImYiLCAidmNkIiwgb3B0aW9ucyk7Ci0KLSAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJzIiwgbm9ybSA9PSBQQUwgPyAiMzUyeDI4OCIgOiAiMzUyeDI0MCIsIG9wdGlvbnMpOwotICAgICAgICBwYXJzZV9vcHRpb24obywgInIiLCBmcmFtZV9yYXRlc1tub3JtXSwgb3B0aW9ucyk7Ci0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJnIiwgbm9ybSA9PSBQQUwgPyAiMTUiIDogIjE4Iik7Ci0KLSAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImI6diIsICIxMTUwMDAwIik7Ci0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJtYXhyYXRlOnYiLCAiMTE1MDAwMCIpOwotICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAibWlucmF0ZTp2IiwgIjExNTAwMDAiKTsKLSAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImJ1ZnNpemU6diIsICIzMjc2ODAiKTsgLy8gNDAqMTAyNCo4OwotCi0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJiOmEiLCAiMjI0MDAwIik7Ci0gICAgICAgIHBhcnNlX29wdGlvbihvLCAiYXIiLCAiNDQxMDAiLCBvcHRpb25zKTsKLSAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJhYyIsICIyIiwgb3B0aW9ucyk7Ci0KLSAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgInBhY2tldHNpemUiLCAiMjMyNCIpOwotICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAibXV4cmF0ZSIsICIxNDExMjAwIik7IC8vIDIzNTIgKiA3NSAqIDg7Ci0KLSAgICAgICAgLyogV2UgaGF2ZSB0byBvZmZzZXQgdGhlIFBUUywgc28gdGhhdCBpdCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIFNDUi4KLSAgICAgICAgICAgU0NSIHN0YXJ0cyBhdCAzNjAwMCwgYnV0IHRoZSBmaXJzdCB0d28gcGFja3MgY29udGFpbiBvbmx5IHBhZGRpbmcKLSAgICAgICAgICAgYW5kIHRoZSBmaXJzdCBwYWNrIGZyb20gdGhlIG90aGVyIHN0cmVhbSwgcmVzcGVjdGl2ZWx5LCBtYXkgYWxzbyBoYXZlCi0gICAgICAgICAgIGJlZW4gd3JpdHRlbiBiZWZvcmUuCi0gICAgICAgICAgIFNvIHRoZSByZWFsIGRhdGEgc3RhcnRzIGF0IFNDUiAzNjAwMCszKjEyMDAuICovCi0gICAgICAgIG8tPm11eF9wcmVsb2FkID0gKDM2MDAwICsgMyAqIDEyMDApIC8gOTAwMDAuMDsgLy8gMC40NAotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmcsICJzdmNkIikpIHsKLQotICAgICAgICBvcHRfdmlkZW9fY29kZWMobywgImM6diIsICJtcGVnMnZpZGVvIik7Ci0gICAgICAgIG9wdF9hdWRpb19jb2RlYyhvLCAiYzphIiwgIm1wMiIpOwotICAgICAgICBwYXJzZV9vcHRpb24obywgImYiLCAic3ZjZCIsIG9wdGlvbnMpOwotCi0gICAgICAgIHBhcnNlX29wdGlvbihvLCAicyIsIG5vcm0gPT0gUEFMID8gIjQ4MHg1NzYiIDogIjQ4MHg0ODAiLCBvcHRpb25zKTsKLSAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJyIiwgZnJhbWVfcmF0ZXNbbm9ybV0sIG9wdGlvbnMpOwotICAgICAgICBwYXJzZV9vcHRpb24obywgInBpeF9mbXQiLCAieXV2NDIwcCIsIG9wdGlvbnMpOwotICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAiZyIsIG5vcm0gPT0gUEFMID8gIjE1IiA6ICIxOCIpOwotCi0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJiOnYiLCAiMjA0MDAwMCIpOwotICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAibWF4cmF0ZTp2IiwgIjI1MTYwMDAiKTsKLSAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgIm1pbnJhdGU6diIsICIwIik7IC8vIDExNDUwMDA7Ci0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJidWZzaXplOnYiLCAiMTgzNTAwOCIpOyAvLyAyMjQqMTAyNCo4OwotICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAic2Nhbl9vZmZzZXQiLCAiMSIpOwotCi0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJiOmEiLCAiMjI0MDAwIik7Ci0gICAgICAgIHBhcnNlX29wdGlvbihvLCAiYXIiLCAiNDQxMDAiLCBvcHRpb25zKTsKLQotICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAicGFja2V0c2l6ZSIsICIyMzI0Iik7Ci0KLSAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiZHZkIikpIHsKLQotICAgICAgICBvcHRfdmlkZW9fY29kZWMobywgImM6diIsICJtcGVnMnZpZGVvIik7Ci0gICAgICAgIG9wdF9hdWRpb19jb2RlYyhvLCAiYzphIiwgImFjMyIpOwotICAgICAgICBwYXJzZV9vcHRpb24obywgImYiLCAiZHZkIiwgb3B0aW9ucyk7Ci0KLSAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJzIiwgbm9ybSA9PSBQQUwgPyAiNzIweDU3NiIgOiAiNzIweDQ4MCIsIG9wdGlvbnMpOwotICAgICAgICBwYXJzZV9vcHRpb24obywgInIiLCBmcmFtZV9yYXRlc1tub3JtXSwgb3B0aW9ucyk7Ci0gICAgICAgIHBhcnNlX29wdGlvbihvLCAicGl4X2ZtdCIsICJ5dXY0MjBwIiwgb3B0aW9ucyk7Ci0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJnIiwgbm9ybSA9PSBQQUwgPyAiMTUiIDogIjE4Iik7Ci0KLSAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImI6diIsICI2MDAwMDAwIik7Ci0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJtYXhyYXRlOnYiLCAiOTAwMDAwMCIpOwotICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAibWlucmF0ZTp2IiwgIjAiKTsgLy8gMTUwMDAwMDsKLSAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImJ1ZnNpemU6diIsICIxODM1MDA4Iik7IC8vIDIyNCoxMDI0Kjg7Ci0KLSAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgInBhY2tldHNpemUiLCAiMjA0OCIpOyAgLy8gZnJvbSB3d3cubXB1Y29kZXIuY29tOiBEVkQgc2VjdG9ycyBjb250YWluIDIwNDggYnl0ZXMgb2YgZGF0YSwgdGhpcyBpcyBhbHNvIHRoZSBzaXplIG9mIG9uZSBwYWNrLgotICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAibXV4cmF0ZSIsICIxMDA4MDAwMCIpOyAvLyBmcm9tIG1wbGV4IHByb2plY3Q6IGRhdGFfcmF0ZSA9IDEyNjAwMDAuIG11eF9yYXRlID0gZGF0YV9yYXRlICogOAotCi0gICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJiOmEiLCAiNDQ4MDAwIik7Ci0gICAgICAgIHBhcnNlX29wdGlvbihvLCAiYXIiLCAiNDgwMDAiLCBvcHRpb25zKTsKLQotICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiZHYiLCAyKSkgewotCi0gICAgICAgIHBhcnNlX29wdGlvbihvLCAiZiIsICJkdiIsIG9wdGlvbnMpOwotCi0gICAgICAgIHBhcnNlX29wdGlvbihvLCAicyIsIG5vcm0gPT0gUEFMID8gIjcyMHg1NzYiIDogIjcyMHg0ODAiLCBvcHRpb25zKTsKLSAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJwaXhfZm10IiwgIXN0cm5jbXAoYXJnLCAiZHY1MCIsIDQpID8gInl1djQyMnAiIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9PSBQQUwgPyAieXV2NDIwcCIgOiAieXV2NDExcCIsIG9wdGlvbnMpOwotICAgICAgICBwYXJzZV9vcHRpb24obywgInIiLCBmcmFtZV9yYXRlc1tub3JtXSwgb3B0aW9ucyk7Ci0KLSAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJhciIsICI0ODAwMCIsIG9wdGlvbnMpOwotICAgICAgICBwYXJzZV9vcHRpb24obywgImFjIiwgIjIiLCBvcHRpb25zKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIHRhcmdldDogJXNcbiIsIGFyZyk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotCi0gICAgYXZfZGljdF9jb3B5KCZvLT5nLT5jb2RlY19vcHRzLCAgY29kZWNfb3B0cywgQVZfRElDVF9ET05UX09WRVJXUklURSk7Ci0gICAgYXZfZGljdF9jb3B5KCZvLT5nLT5mb3JtYXRfb3B0cywgZm9ybWF0X29wdHMsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3ZzdGF0c19maWxlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgYXZfZnJlZSAodnN0YXRzX2ZpbGVuYW1lKTsKLSAgICB2c3RhdHNfZmlsZW5hbWUgPSBhdl9zdHJkdXAgKGFyZyk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3ZzdGF0cyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNoYXIgZmlsZW5hbWVbNDBdOwotICAgIHRpbWVfdCB0b2RheTIgPSB0aW1lKE5VTEwpOwotICAgIHN0cnVjdCB0bSAqdG9kYXkgPSBsb2NhbHRpbWUoJnRvZGF5Mik7Ci0KLSAgICBpZiAoIXRvZGF5KSB7IC8vIG1heWJlIHRvbW9ycm93Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbmFibGUgdG8gZ2V0IGN1cnJlbnQgdGltZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKLSAgICB9Ci0KLSAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgInZzdGF0c18lMDJkJTAyZCUwMmQubG9nIiwgdG9kYXktPnRtX2hvdXIsIHRvZGF5LT50bV9taW4sCi0gICAgICAgICAgICAgdG9kYXktPnRtX3NlYyk7Ci0gICAgcmV0dXJuIG9wdF92c3RhdHNfZmlsZShOVUxMLCBvcHQsIGZpbGVuYW1lKTsKLX0KLQotc3RhdGljIGludCBvcHRfdmlkZW9fZnJhbWVzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7Ci0gICAgcmV0dXJuIHBhcnNlX29wdGlvbihvLCAiZnJhbWVzOnYiLCBhcmcsIG9wdGlvbnMpOwotfQotCi1zdGF0aWMgaW50IG9wdF9hdWRpb19mcmFtZXModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJmcmFtZXM6YSIsIGFyZywgb3B0aW9ucyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X2RhdGFfZnJhbWVzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7Ci0gICAgcmV0dXJuIHBhcnNlX29wdGlvbihvLCAiZnJhbWVzOmQiLCBhcmcsIG9wdGlvbnMpOwotfQotCi1zdGF0aWMgaW50IG9wdF9kZWZhdWx0X25ldyhPcHRpb25zQ29udGV4dCAqbywgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgaW50IHJldDsKLSAgICBBVkRpY3Rpb25hcnkgKmNiYWsgPSBjb2RlY19vcHRzOwotICAgIEFWRGljdGlvbmFyeSAqZmJhayA9IGZvcm1hdF9vcHRzOwotICAgIGNvZGVjX29wdHMgPSBOVUxMOwotICAgIGZvcm1hdF9vcHRzID0gTlVMTDsKLQotICAgIHJldCA9IG9wdF9kZWZhdWx0KE5VTEwsIG9wdCwgYXJnKTsKLQotICAgIGF2X2RpY3RfY29weSgmby0+Zy0+Y29kZWNfb3B0cyAsIGNvZGVjX29wdHMsIDApOwotICAgIGF2X2RpY3RfY29weSgmby0+Zy0+Zm9ybWF0X29wdHMsIGZvcm1hdF9vcHRzLCAwKTsKLSAgICBhdl9kaWN0X2ZyZWUoJmNvZGVjX29wdHMpOwotICAgIGF2X2RpY3RfZnJlZSgmZm9ybWF0X29wdHMpOwotICAgIGNvZGVjX29wdHMgPSBjYmFrOwotICAgIGZvcm1hdF9vcHRzID0gZmJhazsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3ByZXNldCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OwotICAgIEZJTEUgKmY9TlVMTDsKLSAgICBjaGFyIGZpbGVuYW1lWzEwMDBdLCBsaW5lWzEwMDBdLCB0bXBfbGluZVsxMDAwXTsKLSAgICBjb25zdCBjaGFyICpjb2RlY19uYW1lID0gTlVMTDsKLQotICAgIHRtcF9saW5lWzBdID0gKm9wdDsKLSAgICB0bXBfbGluZVsxXSA9IDA7Ci0gICAgTUFUQ0hfUEVSX1RZUEVfT1BUKGNvZGVjX25hbWVzLCBzdHIsIGNvZGVjX25hbWUsIE5VTEwsIHRtcF9saW5lKTsKLQotICAgIGlmICghKGYgPSBnZXRfcHJlc2V0X2ZpbGUoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIGFyZywgKm9wdCA9PSAnZicsIGNvZGVjX25hbWUpKSkgewotICAgICAgICBpZighc3RybmNtcChhcmcsICJsaWJ4MjY0LWxvc3NsZXNzIiwgc3RybGVuKCJsaWJ4MjY0LWxvc3NsZXNzIikpKXsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJQbGVhc2UgdXNlIC1wcmVzZXQgPHNwZWVkPiAtcXAgMFxuIik7Ci0gICAgICAgIH1lbHNlCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRmlsZSBmb3IgcHJlc2V0ICclcycgbm90IGZvdW5kXG4iLCBhcmcpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotCi0gICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKLSAgICAgICAgY2hhciAqa2V5ID0gdG1wX2xpbmUsICp2YWx1ZSwgKmVuZHB0cjsKLQotICAgICAgICBpZiAoc3RyY3NwbihsaW5lLCAiI1xuXHIiKSA9PSAwKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGF2X3N0cmxjcHkodG1wX2xpbmUsIGxpbmUsIHNpemVvZih0bXBfbGluZSkpOwotICAgICAgICBpZiAoIWF2X3N0cnRvayhrZXksICAgIj0iLCAgICAmdmFsdWUpIHx8Ci0gICAgICAgICAgICAhYXZfc3RydG9rKHZhbHVlLCAiXHJcbiIsICZlbmRwdHIpKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiJXM6IEludmFsaWQgc3ludGF4OiAnJXMnXG4iLCBmaWxlbmFtZSwgbGluZSk7Ci0gICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgImZmcHJlc2V0WyVzXTogc2V0ICclcycgPSAnJXMnXG4iLCBmaWxlbmFtZSwga2V5LCB2YWx1ZSk7Ci0KLSAgICAgICAgaWYgICAgICAoIXN0cmNtcChrZXksICJhY29kZWMiKSkgb3B0X2F1ZGlvX2NvZGVjICAgKG8sIGtleSwgdmFsdWUpOwotICAgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgInZjb2RlYyIpKSBvcHRfdmlkZW9fY29kZWMgICAobywga2V5LCB2YWx1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAic2NvZGVjIikpIG9wdF9zdWJ0aXRsZV9jb2RlYyhvLCBrZXksIHZhbHVlKTsKLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChrZXksICJkY29kZWMiKSkgb3B0X2RhdGFfY29kZWMgICAgKG8sIGtleSwgdmFsdWUpOwotICAgICAgICBlbHNlIGlmIChvcHRfZGVmYXVsdF9uZXcobywga2V5LCB2YWx1ZSkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiJXM6IEludmFsaWQgb3B0aW9uIG9yIGFyZ3VtZW50OiAnJXMnLCBwYXJzZWQgYXMgJyVzJyA9ICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmUsIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmNsb3NlKGYpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X29sZDJuZXcodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICBjaGFyICpzID0gYXZfYXNwcmludGYoIiVzOiVjIiwgb3B0ICsgMSwgKm9wdCk7Ci0gICAgaW50IHJldCA9IHBhcnNlX29wdGlvbihvLCBzLCBhcmcsIG9wdGlvbnMpOwotICAgIGF2X2ZyZWUocyk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBvcHRfYml0cmF0ZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OwotCi0gICAgaWYoIXN0cmNtcChvcHQsICJhYiIpKXsKLSAgICAgICAgYXZfZGljdF9zZXQoJm8tPmctPmNvZGVjX29wdHMsICJiOmEiLCBhcmcsIDApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgaWYoIXN0cmNtcChvcHQsICJiIikpewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJQbGVhc2UgdXNlIC1iOmEgb3IgLWI6diwgLWIgaXMgYW1iaWd1b3VzXG4iKTsKLSAgICAgICAgYXZfZGljdF9zZXQoJm8tPmctPmNvZGVjX29wdHMsICJiOnYiLCBhcmcsIDApOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgYXZfZGljdF9zZXQoJm8tPmctPmNvZGVjX29wdHMsIG9wdCwgYXJnLCAwKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvcHRfcXNjYWxlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7Ci0gICAgY2hhciAqczsKLSAgICBpbnQgcmV0OwotICAgIGlmKCFzdHJjbXAob3B0LCAicXNjYWxlIikpewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJQbGVhc2UgdXNlIC1xOmEgb3IgLXE6diwgLXFzY2FsZSBpcyBhbWJpZ3VvdXNcbiIpOwotICAgICAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJxOnYiLCBhcmcsIG9wdGlvbnMpOwotICAgIH0KLSAgICBzID0gYXZfYXNwcmludGYoInElcyIsIG9wdCArIDYpOwotICAgIHJldCA9IHBhcnNlX29wdGlvbihvLCBzLCBhcmcsIG9wdGlvbnMpOwotICAgIGF2X2ZyZWUocyk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBvcHRfcHJvZmlsZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OwotICAgIGlmKCFzdHJjbXAob3B0LCAicHJvZmlsZSIpKXsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiUGxlYXNlIHVzZSAtcHJvZmlsZTphIG9yIC1wcm9maWxlOnYsIC1wcm9maWxlIGlzIGFtYmlndW91c1xuIik7Ci0gICAgICAgIGF2X2RpY3Rfc2V0KCZvLT5nLT5jb2RlY19vcHRzLCAicHJvZmlsZTp2IiwgYXJnLCAwKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGF2X2RpY3Rfc2V0KCZvLT5nLT5jb2RlY19vcHRzLCBvcHQsIGFyZywgMCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3ZpZGVvX2ZpbHRlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJmaWx0ZXI6diIsIGFyZywgb3B0aW9ucyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X2F1ZGlvX2ZpbHRlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJmaWx0ZXI6YSIsIGFyZywgb3B0aW9ucyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3ZzeW5jKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgaWYgICAgICAoIWF2X3N0cmNhc2VjbXAoYXJnLCAiY2ZyIikpICAgICAgICAgdmlkZW9fc3luY19tZXRob2QgPSBWU1lOQ19DRlI7Ci0gICAgZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoYXJnLCAidmZyIikpICAgICAgICAgdmlkZW9fc3luY19tZXRob2QgPSBWU1lOQ19WRlI7Ci0gICAgZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoYXJnLCAicGFzc3Rocm91Z2giKSkgdmlkZW9fc3luY19tZXRob2QgPSBWU1lOQ19QQVNTVEhST1VHSDsKLSAgICBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChhcmcsICJkcm9wIikpICAgICAgICB2aWRlb19zeW5jX21ldGhvZCA9IFZTWU5DX0RST1A7Ci0KLSAgICBpZiAodmlkZW9fc3luY19tZXRob2QgPT0gVlNZTkNfQVVUTykKLSAgICAgICAgdmlkZW9fc3luY19tZXRob2QgPSBwYXJzZV9udW1iZXJfb3JfZGllKCJ2c3luYyIsIGFyZywgT1BUX0lOVCwgVlNZTkNfQVVUTywgVlNZTkNfVkZSKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvcHRfdGltZWNvZGUodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICBjaGFyICp0Y3IgPSBhdl9hc3ByaW50ZigidGltZWNvZGU9JXMiLCBhcmcpOwotICAgIGludCByZXQgPSBwYXJzZV9vcHRpb24obywgIm1ldGFkYXRhOmciLCB0Y3IsIG9wdGlvbnMpOwotICAgIGlmIChyZXQgPj0gMCkKLSAgICAgICAgcmV0ID0gYXZfZGljdF9zZXQoJm8tPmctPmNvZGVjX29wdHMsICJnb3BfdGltZWNvZGUiLCBhcmcsIDApOwotICAgIGF2X2ZyZWUodGNyKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvcHRfY2hhbm5lbF9sYXlvdXQodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICBjaGFyIGxheW91dF9zdHJbMzJdOwotICAgIGNoYXIgKnN0cmVhbV9zdHI7Ci0gICAgY2hhciAqYWNfc3RyOwotICAgIGludCByZXQsIGNoYW5uZWxzLCBhY19zdHJfc2l6ZTsKLSAgICB1aW50NjRfdCBsYXlvdXQ7Ci0KLSAgICBsYXlvdXQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXQoYXJnKTsKLSAgICBpZiAoIWxheW91dCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjaGFubmVsIGxheW91dDogJXNcbiIsIGFyZyk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIHNucHJpbnRmKGxheW91dF9zdHIsIHNpemVvZihsYXlvdXRfc3RyKSwgIiUiUFJJdTY0LCBsYXlvdXQpOwotICAgIHJldCA9IG9wdF9kZWZhdWx0X25ldyhvLCBvcHQsIGxheW91dF9zdHIpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgLyogc2V0ICdhYycgb3B0aW9uIGJhc2VkIG9uIGNoYW5uZWwgbGF5b3V0ICovCi0gICAgY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGF5b3V0KTsKLSAgICBzbnByaW50ZihsYXlvdXRfc3RyLCBzaXplb2YobGF5b3V0X3N0ciksICIlZCIsIGNoYW5uZWxzKTsKLSAgICBzdHJlYW1fc3RyID0gc3RyY2hyKG9wdCwgJzonKTsKLSAgICBhY19zdHJfc2l6ZSA9IDMgKyAoc3RyZWFtX3N0ciA/IHN0cmxlbihzdHJlYW1fc3RyKSA6IDApOwotICAgIGFjX3N0ciA9IGF2X21hbGxvY3ooYWNfc3RyX3NpemUpOwotICAgIGlmICghYWNfc3RyKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIGF2X3N0cmxjcHkoYWNfc3RyLCAiYWMiLCAzKTsKLSAgICBpZiAoc3RyZWFtX3N0cikKLSAgICAgICAgYXZfc3RybGNhdChhY19zdHIsIHN0cmVhbV9zdHIsIGFjX3N0cl9zaXplKTsKLSAgICByZXQgPSBwYXJzZV9vcHRpb24obywgYWNfc3RyLCBsYXlvdXRfc3RyLCBvcHRpb25zKTsKLSAgICBhdl9mcmVlKGFjX3N0cik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG9wdF9hdWRpb19xc2NhbGUodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKLSAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJxOmEiLCBhcmcsIG9wdGlvbnMpOwotfQotCi1zdGF0aWMgaW50IG9wdF9maWx0ZXJfY29tcGxleCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIEdST1dfQVJSQVkoZmlsdGVyZ3JhcGhzLCBuYl9maWx0ZXJncmFwaHMpOwotICAgIGlmICghKGZpbHRlcmdyYXBoc1tuYl9maWx0ZXJncmFwaHMgLSAxXSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmaWx0ZXJncmFwaHNbMF0pKSkpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgZmlsdGVyZ3JhcGhzW25iX2ZpbHRlcmdyYXBocyAtIDFdLT5pbmRleCAgICAgID0gbmJfZmlsdGVyZ3JhcGhzIC0gMTsKLSAgICBmaWx0ZXJncmFwaHNbbmJfZmlsdGVyZ3JhcGhzIC0gMV0tPmdyYXBoX2Rlc2MgPSBhdl9zdHJkdXAoYXJnKTsKLSAgICBpZiAoIWZpbHRlcmdyYXBoc1tuYl9maWx0ZXJncmFwaHMgLSAxXS0+Z3JhcGhfZGVzYykKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIGlucHV0X3N0cmVhbV9wb3RlbnRpYWxseV9hdmFpbGFibGUgPSAxOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X2ZpbHRlcl9jb21wbGV4X3NjcmlwdCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIHVpbnQ4X3QgKmdyYXBoX2Rlc2MgPSByZWFkX2ZpbGUoYXJnKTsKLSAgICBpZiAoIWdyYXBoX2Rlc2MpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0KLSAgICBHUk9XX0FSUkFZKGZpbHRlcmdyYXBocywgbmJfZmlsdGVyZ3JhcGhzKTsKLSAgICBpZiAoIShmaWx0ZXJncmFwaHNbbmJfZmlsdGVyZ3JhcGhzIC0gMV0gPSBhdl9tYWxsb2N6KHNpemVvZigqZmlsdGVyZ3JhcGhzWzBdKSkpKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIGZpbHRlcmdyYXBoc1tuYl9maWx0ZXJncmFwaHMgLSAxXS0+aW5kZXggICAgICA9IG5iX2ZpbHRlcmdyYXBocyAtIDE7Ci0gICAgZmlsdGVyZ3JhcGhzW25iX2ZpbHRlcmdyYXBocyAtIDFdLT5ncmFwaF9kZXNjID0gZ3JhcGhfZGVzYzsKLQotICAgIGlucHV0X3N0cmVhbV9wb3RlbnRpYWxseV9hdmFpbGFibGUgPSAxOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgc2hvd19oZWxwX2RlZmF1bHQoY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgLyogcGVyLWZpbGUgb3B0aW9ucyBoYXZlIGF0IGxlYXN0IG9uZSBvZiB0aG9zZSBzZXQgKi8KLSAgICBjb25zdCBpbnQgcGVyX2ZpbGUgPSBPUFRfU1BFQyB8IE9QVF9PRkZTRVQgfCBPUFRfUEVSRklMRTsKLSAgICBpbnQgc2hvd19hZHZhbmNlZCA9IDAsIHNob3dfYXZvcHRpb25zID0gMDsKLQotICAgIGlmIChvcHQgJiYgKm9wdCkgewotICAgICAgICBpZiAoIXN0cmNtcChvcHQsICJsb25nIikpCi0gICAgICAgICAgICBzaG93X2FkdmFuY2VkID0gMTsKLSAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChvcHQsICJmdWxsIikpCi0gICAgICAgICAgICBzaG93X2FkdmFuY2VkID0gc2hvd19hdm9wdGlvbnMgPSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBoZWxwIG9wdGlvbiAnJXMnLlxuIiwgb3B0KTsKLSAgICB9Ci0KLSAgICBzaG93X3VzYWdlKCk7Ci0KLSAgICBwcmludGYoIkdldHRpbmcgaGVscDpcbiIKLSAgICAgICAgICAgIiAgICAtaCAgICAgIC0tIHByaW50IGJhc2ljIG9wdGlvbnNcbiIKLSAgICAgICAgICAgIiAgICAtaCBsb25nIC0tIHByaW50IG1vcmUgb3B0aW9uc1xuIgotICAgICAgICAgICAiICAgIC1oIGZ1bGwgLS0gcHJpbnQgYWxsIG9wdGlvbnMgKGluY2x1ZGluZyBhbGwgZm9ybWF0IGFuZCBjb2RlYyBzcGVjaWZpYyBvcHRpb25zLCB2ZXJ5IGxvbmcpXG4iCi0gICAgICAgICAgICIgICAgLWggdHlwZT1uYW1lIC0tIHByaW50IGFsbCBvcHRpb25zIGZvciB0aGUgbmFtZWQgZGVjb2Rlci9lbmNvZGVyL2RlbXV4ZXIvbXV4ZXIvZmlsdGVyXG4iCi0gICAgICAgICAgICIgICAgU2VlIG1hbiAlcyBmb3IgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG9wdGlvbnMuXG4iCi0gICAgICAgICAgICJcbiIsIHByb2dyYW1fbmFtZSk7Ci0KLSAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiUHJpbnQgaGVscCAvIGluZm9ybWF0aW9uIC8gY2FwYWJpbGl0aWVzOiIsCi0gICAgICAgICAgICAgICAgICAgICAgT1BUX0VYSVQsIDAsIDApOwotCi0gICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIkdsb2JhbCBvcHRpb25zIChhZmZlY3Qgd2hvbGUgcHJvZ3JhbSAiCi0gICAgICAgICAgICAgICAgICAgICAgImluc3RlYWQgb2YganVzdCBvbmUgZmlsZToiLAotICAgICAgICAgICAgICAgICAgICAgIDAsIHBlcl9maWxlIHwgT1BUX0VYSVQgfCBPUFRfRVhQRVJULCAwKTsKLSAgICBpZiAoc2hvd19hZHZhbmNlZCkKLSAgICAgICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIkFkdmFuY2VkIGdsb2JhbCBvcHRpb25zOiIsIE9QVF9FWFBFUlQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBlcl9maWxlIHwgT1BUX0VYSVQsIDApOwotCi0gICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIlBlci1maWxlIG1haW4gb3B0aW9uczoiLCAwLAotICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWFBFUlQgfCBPUFRfQVVESU8gfCBPUFRfVklERU8gfCBPUFRfU1VCVElUTEUgfAotICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWElULCBwZXJfZmlsZSk7Ci0gICAgaWYgKHNob3dfYWR2YW5jZWQpCi0gICAgICAgIHNob3dfaGVscF9vcHRpb25zKG9wdGlvbnMsICJBZHZhbmNlZCBwZXItZmlsZSBvcHRpb25zOiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWFBFUlQsIE9QVF9BVURJTyB8IE9QVF9WSURFTyB8IE9QVF9TVUJUSVRMRSwgcGVyX2ZpbGUpOwotCi0gICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIlZpZGVvIG9wdGlvbnM6IiwKLSAgICAgICAgICAgICAgICAgICAgICBPUFRfVklERU8sIE9QVF9FWFBFUlQgfCBPUFRfQVVESU8sIDApOwotICAgIGlmIChzaG93X2FkdmFuY2VkKQotICAgICAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiQWR2YW5jZWQgVmlkZW8gb3B0aW9uczoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRfRVhQRVJUIHwgT1BUX1ZJREVPLCBPUFRfQVVESU8sIDApOwotCi0gICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIkF1ZGlvIG9wdGlvbnM6IiwKLSAgICAgICAgICAgICAgICAgICAgICBPUFRfQVVESU8sIE9QVF9FWFBFUlQgfCBPUFRfVklERU8sIDApOwotICAgIGlmIChzaG93X2FkdmFuY2VkKQotICAgICAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiQWR2YW5jZWQgQXVkaW8gb3B0aW9uczoiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRfRVhQRVJUIHwgT1BUX0FVRElPLCBPUFRfVklERU8sIDApOwotICAgIHNob3dfaGVscF9vcHRpb25zKG9wdGlvbnMsICJTdWJ0aXRsZSBvcHRpb25zOiIsCi0gICAgICAgICAgICAgICAgICAgICAgT1BUX1NVQlRJVExFLCAwLCAwKTsKLSAgICBwcmludGYoIlxuIik7Ci0KLSAgICBpZiAoc2hvd19hdm9wdGlvbnMpIHsKLSAgICAgICAgaW50IGZsYWdzID0gQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTTsKLSAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKGF2Y29kZWNfZ2V0X2NsYXNzKCksIGZsYWdzKTsKLSAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKGF2Zm9ybWF0X2dldF9jbGFzcygpLCBmbGFncyk7Ci0jaWYgQ09ORklHX1NXU0NBTEUKLSAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKHN3c19nZXRfY2xhc3MoKSwgZmxhZ3MpOwotI2VuZGlmCi0gICAgICAgIHNob3dfaGVscF9jaGlsZHJlbihzd3JfZ2V0X2NsYXNzKCksIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNKTsKLSAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKGF2ZmlsdGVyX2dldF9jbGFzcygpLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNKTsKLSAgICB9Ci19Ci0KLXZvaWQgc2hvd191c2FnZSh2b2lkKQotewotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIkh5cGVyIGZhc3QgQXVkaW8gYW5kIFZpZGVvIGVuY29kZXJcbiIpOwotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInVzYWdlOiAlcyBbb3B0aW9uc10gW1tpbmZpbGUgb3B0aW9uc10gLWkgaW5maWxlXS4uLiB7W291dGZpbGUgb3B0aW9uc10gb3V0ZmlsZX0uLi5cbiIsIHByb2dyYW1fbmFtZSk7Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiXG4iKTsKLX0KLQotZW51bSBPcHRHcm91cCB7Ci0gICAgR1JPVVBfT1VURklMRSwKLSAgICBHUk9VUF9JTkZJTEUsCi19OwotCi1zdGF0aWMgY29uc3QgT3B0aW9uR3JvdXBEZWYgZ3JvdXBzW10gPSB7Ci0gICAgW0dST1VQX09VVEZJTEVdID0geyAib3V0cHV0IGZpbGUiLCAgTlVMTCwgT1BUX09VVFBVVCB9LAotICAgIFtHUk9VUF9JTkZJTEVdICA9IHsgImlucHV0IGZpbGUiLCAgICJpIiwgIE9QVF9JTlBVVCB9LAotfTsKLQotc3RhdGljIGludCBvcGVuX2ZpbGVzKE9wdGlvbkdyb3VwTGlzdCAqbCwgY29uc3QgY2hhciAqaW5vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICgqb3Blbl9maWxlKShPcHRpb25zQ29udGV4dCosIGNvbnN0IGNoYXIqKSkKLXsKLSAgICBpbnQgaSwgcmV0OwotCi0gICAgZm9yIChpID0gMDsgaSA8IGwtPm5iX2dyb3VwczsgaSsrKSB7Ci0gICAgICAgIE9wdGlvbkdyb3VwICpnID0gJmwtPmdyb3Vwc1tpXTsKLSAgICAgICAgT3B0aW9uc0NvbnRleHQgbzsKLQotICAgICAgICBpbml0X29wdGlvbnMoJm8pOwotICAgICAgICBvLmcgPSBnOwotCi0gICAgICAgIHJldCA9IHBhcnNlX29wdGdyb3VwKCZvLCBnKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIG9wdGlvbnMgZm9yICVzIGZpbGUgIgotICAgICAgICAgICAgICAgICAgICIlcy5cbiIsIGlub3V0LCBnLT5hcmcpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJPcGVuaW5nIGFuICVzIGZpbGU6ICVzLlxuIiwgaW5vdXQsIGctPmFyZyk7Ci0gICAgICAgIHJldCA9IG9wZW5fZmlsZSgmbywgZy0+YXJnKTsKLSAgICAgICAgdW5pbml0X29wdGlvbnMoJm8pOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIG9wZW5pbmcgJXMgZmlsZSAlcy5cbiIsCi0gICAgICAgICAgICAgICAgICAgaW5vdXQsIGctPmFyZyk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJTdWNjZXNzZnVsbHkgb3BlbmVkIHRoZSBmaWxlLlxuIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBmZm1wZWdfcGFyc2Vfb3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgT3B0aW9uUGFyc2VDb250ZXh0IG9jdHg7Ci0gICAgdWludDhfdCBlcnJvclsxMjhdOwotICAgIGludCByZXQ7Ci0KLSAgICBtZW1zZXQoJm9jdHgsIDAsIHNpemVvZihvY3R4KSk7Ci0KLSAgICAvKiBzcGxpdCB0aGUgY29tbWFuZGxpbmUgaW50byBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAqLwotICAgIHJldCA9IHNwbGl0X2NvbW1hbmRsaW5lKCZvY3R4LCBhcmdjLCBhcmd2LCBvcHRpb25zLCBncm91cHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoZ3JvdXBzKSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkVycm9yIHNwbGl0dGluZyB0aGUgYXJndW1lbnQgbGlzdDogIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvKiBhcHBseSBnbG9iYWwgb3B0aW9ucyAqLwotICAgIHJldCA9IHBhcnNlX29wdGdyb3VwKE5VTEwsICZvY3R4Lmdsb2JhbF9vcHRzKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRXJyb3IgcGFyc2luZyBnbG9iYWwgb3B0aW9uczogIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIGlucHV0IGZpbGVzICovCi0gICAgcmV0ID0gb3Blbl9maWxlcygmb2N0eC5ncm91cHNbR1JPVVBfSU5GSUxFXSwgImlucHV0Iiwgb3Blbl9pbnB1dF9maWxlKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRXJyb3Igb3BlbmluZyBpbnB1dCBmaWxlczogIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvKiBjcmVhdGUgdGhlIGNvbXBsZXggZmlsdGVyZ3JhcGhzICovCi0gICAgcmV0ID0gaW5pdF9jb21wbGV4X2ZpbHRlcnMoKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRXJyb3IgaW5pdGlhbGl6aW5nIGNvbXBsZXggZmlsdGVycy5cbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgLyogb3BlbiBvdXRwdXQgZmlsZXMgKi8KLSAgICByZXQgPSBvcGVuX2ZpbGVzKCZvY3R4Lmdyb3Vwc1tHUk9VUF9PVVRGSUxFXSwgIm91dHB1dCIsIG9wZW5fb3V0cHV0X2ZpbGUpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlczogIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvKiBjb25maWd1cmUgdGhlIGNvbXBsZXggZmlsdGVyZ3JhcGhzICovCi0gICAgcmV0ID0gY29uZmlndXJlX2NvbXBsZXhfZmlsdGVycygpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJFcnJvciBjb25maWd1cmluZyBjb21wbGV4IGZpbHRlcnMuXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotZmFpbDoKLSAgICB1bmluaXRfcGFyc2VfY29udGV4dCgmb2N0eCk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfc3RyZXJyb3IocmV0LCBlcnJvciwgc2l6ZW9mKGVycm9yKSk7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlc1xuIiwgZXJyb3IpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG9wdF9wcm9ncmVzcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIEFWSU9Db250ZXh0ICphdmlvID0gTlVMTDsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKCFzdHJjbXAoYXJnLCAiLSIpKQotICAgICAgICBhcmcgPSAicGlwZToiOwotICAgIHJldCA9IGF2aW9fb3BlbjIoJmF2aW8sIGFyZywgQVZJT19GTEFHX1dSSVRFLCAmaW50X2NiLCBOVUxMKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gcHJvZ3Jlc3MgVVJMIFwiJXNcIjogJXNcbiIsCi0gICAgICAgICAgICAgICBhcmcsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIHByb2dyZXNzX2F2aW8gPSBhdmlvOwotICAgIHJldHVybiAwOwotfQotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihPcHRpb25zQ29udGV4dCwgeCkKLWNvbnN0IE9wdGlvbkRlZiBvcHRpb25zW10gPSB7Ci0gICAgLyogbWFpbiBvcHRpb25zICovCi0jaW5jbHVkZSAiY21kdXRpbHNfY29tbW9uX29wdHMuaCIKLSAgICB7ICJmIiwgICAgICAgICAgICAgIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX09GRlNFVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgICAgICAgPSBPRkZTRVQoZm9ybWF0KSB9LAotICAgICAgICAiZm9yY2UgZm9ybWF0IiwgImZtdCIgfSwKLSAgICB7ICJ5IiwgICAgICAgICAgICAgIE9QVF9CT09MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICZmaWxlX292ZXJ3cml0ZSB9LAotICAgICAgICAib3ZlcndyaXRlIG91dHB1dCBmaWxlcyIgfSwKLSAgICB7ICJuIiwgICAgICAgICAgICAgIE9QVF9CT09MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICZub19maWxlX292ZXJ3cml0ZSB9LAotICAgICAgICAibmV2ZXIgb3ZlcndyaXRlIG91dHB1dCBmaWxlcyIgfSwKLSAgICB7ICJpZ25vcmVfdW5rbm93biIsIE9QVF9CT09MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICZpZ25vcmVfdW5rbm93bl9zdHJlYW1zIH0sCi0gICAgICAgICJJZ25vcmUgdW5rbm93biBzdHJlYW0gdHlwZXMiIH0sCi0gICAgeyAiY29weV91bmtub3duIiwgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAmY29weV91bmtub3duX3N0cmVhbXMgfSwKLSAgICAgICAgIkNvcHkgdW5rbm93biBzdHJlYW0gdHlwZXMiIH0sCi0gICAgeyAiYyIsICAgICAgICAgICAgICBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiAgICAgICA9IE9GRlNFVChjb2RlY19uYW1lcykgfSwKLSAgICAgICAgImNvZGVjIG5hbWUiLCAiY29kZWMiIH0sCi0gICAgeyAiY29kZWMiLCAgICAgICAgICBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiAgICAgICA9IE9GRlNFVChjb2RlY19uYW1lcykgfSwKLSAgICAgICAgImNvZGVjIG5hbWUiLCAiY29kZWMiIH0sCi0gICAgeyAicHJlIiwgICAgICAgICAgICBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiAgICAgICA9IE9GRlNFVChwcmVzZXRzKSB9LAotICAgICAgICAicHJlc2V0IG5hbWUiLCAicHJlc2V0IiB9LAotICAgIHsgIm1hcCIsICAgICAgICAgICAgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfUEVSRklMRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9tYXAgfSwKLSAgICAgICAgInNldCBpbnB1dCBzdHJlYW0gbWFwcGluZyIsCi0gICAgICAgICJbLV1pbnB1dF9maWxlX2lkWzpzdHJlYW1fc3BlY2lmaWVyXVssc3luY19maWxlX2lkWzpzdHJlYW1fc3BlY2lmaWVyXV0iIH0sCi0gICAgeyAibWFwX2NoYW5uZWwiLCAgICBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgeyAuZnVuY19hcmcgPSBvcHRfbWFwX2NoYW5uZWwgfSwKLSAgICAgICAgIm1hcCBhbiBhdWRpbyBjaGFubmVsIGZyb20gb25lIHN0cmVhbSB0byBhbm90aGVyIiwgImZpbGUuc3RyZWFtLmNoYW5uZWxbOnN5bmNmaWxlLnN5bmNzdHJlYW1dIiB9LAotICAgIHsgIm1hcF9tZXRhZGF0YSIsICAgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgICAgICAgPSBPRkZTRVQobWV0YWRhdGFfbWFwKSB9LAotICAgICAgICAic2V0IG1ldGFkYXRhIGluZm9ybWF0aW9uIG9mIG91dGZpbGUgZnJvbSBpbmZpbGUiLAotICAgICAgICAib3V0ZmlsZVssbWV0YWRhdGFdOmluZmlsZVssbWV0YWRhdGFdIiB9LAotICAgIHsgIm1hcF9jaGFwdGVycyIsICAgSEFTX0FSRyB8IE9QVF9JTlQgfCBPUFRfRVhQRVJUIHwgT1BUX09GRlNFVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoY2hhcHRlcnNfaW5wdXRfZmlsZSkgfSwKLSAgICAgICAgInNldCBjaGFwdGVycyBtYXBwaW5nIiwgImlucHV0X2ZpbGVfaW5kZXgiIH0sCi0gICAgeyAidCIsICAgICAgICAgICAgICBIQVNfQVJHIHwgT1BUX1RJTUUgfCBPUFRfT0ZGU0VUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChyZWNvcmRpbmdfdGltZSkgfSwKLSAgICAgICAgInJlY29yZCBvciB0cmFuc2NvZGUgXCJkdXJhdGlvblwiIHNlY29uZHMgb2YgYXVkaW8vdmlkZW8iLAotICAgICAgICAiZHVyYXRpb24iIH0sCi0gICAgeyAidG8iLCAgICAgICAgICAgICBIQVNfQVJHIHwgT1BUX1RJTUUgfCBPUFRfT0ZGU0VUIHwgT1BUX09VVFBVVCwgIHsgLm9mZiA9IE9GRlNFVChzdG9wX3RpbWUpIH0sCi0gICAgICAgICJyZWNvcmQgb3IgdHJhbnNjb2RlIHN0b3AgdGltZSIsICJ0aW1lX3N0b3AiIH0sCi0gICAgeyAiZnMiLCAgICAgICAgICAgICBIQVNfQVJHIHwgT1BUX0lOVDY0IHwgT1BUX09GRlNFVCB8IE9QVF9PVVRQVVQsIHsgLm9mZiA9IE9GRlNFVChsaW1pdF9maWxlc2l6ZSkgfSwKLSAgICAgICAgInNldCB0aGUgbGltaXQgZmlsZSBzaXplIGluIGJ5dGVzIiwgImxpbWl0X3NpemUiIH0sCi0gICAgeyAic3MiLCAgICAgICAgICAgICBIQVNfQVJHIHwgT1BUX1RJTUUgfCBPUFRfT0ZGU0VUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChzdGFydF90aW1lKSB9LAotICAgICAgICAic2V0IHRoZSBzdGFydCB0aW1lIG9mZnNldCIsICJ0aW1lX29mZiIgfSwKLSAgICB7ICJzc2VvZiIsICAgICAgICAgIEhBU19BUkcgfCBPUFRfVElNRSB8IE9QVF9PRkZTRVQgfAotICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHN0YXJ0X3RpbWVfZW9mKSB9LAotICAgICAgICAic2V0IHRoZSBzdGFydCB0aW1lIG9mZnNldCByZWxhdGl2ZSB0byBFT0YiLCAidGltZV9vZmYiIH0sCi0gICAgeyAic2Vla190aW1lc3RhbXAiLCBIQVNfQVJHIHwgT1BUX0lOVCB8IE9QVF9PRkZTRVQgfAotICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHNlZWtfdGltZXN0YW1wKSB9LAotICAgICAgICAiZW5hYmxlL2Rpc2FibGUgc2Vla2luZyBieSB0aW1lc3RhbXAgd2l0aCAtc3MiIH0sCi0gICAgeyAiYWNjdXJhdGVfc2VlayIsICBPUFRfQk9PTCB8IE9QVF9PRkZTRVQgfCBPUFRfRVhQRVJUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChhY2N1cmF0ZV9zZWVrKSB9LAotICAgICAgICAiZW5hYmxlL2Rpc2FibGUgYWNjdXJhdGUgc2Vla2luZyB3aXRoIC1zcyIgfSwKLSAgICB7ICJpdHNvZmZzZXQiLCAgICAgIEhBU19BUkcgfCBPUFRfVElNRSB8IE9QVF9PRkZTRVQgfAotICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0VYUEVSVCB8IE9QVF9JTlBVVCwgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGlucHV0X3RzX29mZnNldCkgfSwKLSAgICAgICAgInNldCB0aGUgaW5wdXQgdHMgb2Zmc2V0IiwgInRpbWVfb2ZmIiB9LAotICAgIHsgIml0c3NjYWxlIiwgICAgICAgSEFTX0FSRyB8IE9QVF9ET1VCTEUgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfRVhQRVJUIHwgT1BUX0lOUFVULCAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQodHNfc2NhbGUpIH0sCi0gICAgICAgICJzZXQgdGhlIGlucHV0IHRzIHNjYWxlIiwgInNjYWxlIiB9LAotICAgIHsgInRpbWVzdGFtcCIsICAgICAgSEFTX0FSRyB8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfcmVjb3JkaW5nX3RpbWVzdGFtcCB9LAotICAgICAgICAic2V0IHRoZSByZWNvcmRpbmcgdGltZXN0YW1wICgnbm93JyB0byBzZXQgdGhlIGN1cnJlbnQgdGltZSkiLCAidGltZSIgfSwKLSAgICB7ICJtZXRhZGF0YSIsICAgICAgIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQobWV0YWRhdGEpIH0sCi0gICAgICAgICJhZGQgbWV0YWRhdGEiLCAic3RyaW5nPXN0cmluZyIgfSwKLSAgICB7ICJwcm9ncmFtIiwgICAgICAgIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQocHJvZ3JhbSkgfSwKLSAgICAgICAgImFkZCBwcm9ncmFtIHdpdGggc3BlY2lmaWVkIHN0cmVhbXMiLCAidGl0bGU9c3RyaW5nOnN0PW51bWJlci4uLiIgfSwKLSAgICB7ICJkZnJhbWVzIiwgICAgICAgIEhBU19BUkcgfCBPUFRfUEVSRklMRSB8IE9QVF9FWFBFUlQgfAotICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfZGF0YV9mcmFtZXMgfSwKLSAgICAgICAgInNldCB0aGUgbnVtYmVyIG9mIGRhdGEgZnJhbWVzIHRvIG91dHB1dCIsICJudW1iZXIiIH0sCi0gICAgeyAiYmVuY2htYXJrIiwgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICZkb19iZW5jaG1hcmsgfSwKLSAgICAgICAgImFkZCB0aW1pbmdzIGZvciBiZW5jaG1hcmtpbmciIH0sCi0gICAgeyAiYmVuY2htYXJrX2FsbCIsICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICZkb19iZW5jaG1hcmtfYWxsIH0sCi0gICAgICAiYWRkIHRpbWluZ3MgZm9yIGVhY2ggdGFzayIgfSwKLSAgICB7ICJwcm9ncmVzcyIsICAgICAgIEhBU19BUkcgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X3Byb2dyZXNzIH0sCi0gICAgICAid3JpdGUgcHJvZ3JhbS1yZWFkYWJsZSBwcm9ncmVzcyBpbmZvcm1hdGlvbiIsICJ1cmwiIH0sCi0gICAgeyAic3RkaW4iLCAgICAgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICZzdGRpbl9pbnRlcmFjdGlvbiB9LAotICAgICAgImVuYWJsZSBvciBkaXNhYmxlIGludGVyYWN0aW9uIG9uIHN0YW5kYXJkIGlucHV0IiB9LAotICAgIHsgInRpbWVsaW1pdCIsICAgICAgSEFTX0FSRyB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfdGltZWxpbWl0IH0sCi0gICAgICAgICJzZXQgbWF4IHJ1bnRpbWUgaW4gc2Vjb25kcyIsICJsaW1pdCIgfSwKLSAgICB7ICJkdW1wIiwgICAgICAgICAgIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgIHsgJmRvX3BrdF9kdW1wIH0sCi0gICAgICAgICJkdW1wIGVhY2ggaW5wdXQgcGFja2V0IiB9LAotICAgIHsgImhleCIsICAgICAgICAgICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgeyAmZG9faGV4X2R1bXAgfSwKLSAgICAgICAgIndoZW4gZHVtcGluZyBwYWNrZXRzLCBhbHNvIGR1bXAgdGhlIHBheWxvYWQiIH0sCi0gICAgeyAicmUiLCAgICAgICAgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQgfCBPUFRfT0ZGU0VUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChyYXRlX2VtdSkgfSwKLSAgICAgICAgInJlYWQgaW5wdXQgYXQgbmF0aXZlIGZyYW1lIHJhdGUiLCAiIiB9LAotICAgIHsgInRhcmdldCIsICAgICAgICAgSEFTX0FSRyB8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfdGFyZ2V0IH0sCi0gICAgICAgICJzcGVjaWZ5IHRhcmdldCBmaWxlIHR5cGUgKFwidmNkXCIsIFwic3ZjZFwiLCBcImR2ZFwiLCBcImR2XCIgb3IgXCJkdjUwXCIgIgotICAgICAgICAid2l0aCBvcHRpb25hbCBwcmVmaXhlcyBcInBhbC1cIiwgXCJudHNjLVwiIG9yIFwiZmlsbS1cIikiLCAidHlwZSIgfSwKLSAgICB7ICJ2c3luYyIsICAgICAgICAgIEhBU19BUkcgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X3ZzeW5jIH0sCi0gICAgICAgICJ2aWRlbyBzeW5jIG1ldGhvZCIsICIiIH0sCi0gICAgeyAiZnJhbWVfZHJvcF90aHJlc2hvbGQiLCBIQVNfQVJHIHwgT1BUX0ZMT0FUIHwgT1BUX0VYUEVSVCwgICAgICB7ICZmcmFtZV9kcm9wX3RocmVzaG9sZCB9LAotICAgICAgICAiZnJhbWUgZHJvcCB0aHJlc2hvbGQiLCAiIiB9LAotICAgIHsgImFzeW5jIiwgICAgICAgICAgSEFTX0FSRyB8IE9QVF9JTlQgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgeyAmYXVkaW9fc3luY19tZXRob2QgfSwKLSAgICAgICAgImF1ZGlvIHN5bmMgbWV0aG9kIiwgIiIgfSwKLSAgICB7ICJhZHJpZnRfdGhyZXNob2xkIiwgSEFTX0FSRyB8IE9QVF9GTE9BVCB8IE9QVF9FWFBFUlQsICAgICAgICAgIHsgJmF1ZGlvX2RyaWZ0X3RocmVzaG9sZCB9LAotICAgICAgICAiYXVkaW8gZHJpZnQgdGhyZXNob2xkIiwgInRocmVzaG9sZCIgfSwKLSAgICB7ICJjb3B5dHMiLCAgICAgICAgIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgIHsgJmNvcHlfdHMgfSwKLSAgICAgICAgImNvcHkgdGltZXN0YW1wcyIgfSwKLSAgICB7ICJzdGFydF9hdF96ZXJvIiwgIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgIHsgJnN0YXJ0X2F0X3plcm8gfSwKLSAgICAgICAgInNoaWZ0IGlucHV0IHRpbWVzdGFtcHMgdG8gc3RhcnQgYXQgMCB3aGVuIHVzaW5nIGNvcHl0cyIgfSwKLSAgICB7ICJjb3B5dGIiLCAgICAgICAgIEhBU19BUkcgfCBPUFRfSU5UIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgIHsgJmNvcHlfdGIgfSwKLSAgICAgICAgImNvcHkgaW5wdXQgc3RyZWFtIHRpbWUgYmFzZSB3aGVuIHN0cmVhbSBjb3B5aW5nIiwgIm1vZGUiIH0sCi0gICAgeyAic2hvcnRlc3QiLCAgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQgfCBPUFRfT0ZGU0VUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChzaG9ydGVzdCkgfSwKLSAgICAgICAgImZpbmlzaCBlbmNvZGluZyB3aXRoaW4gc2hvcnRlc3QgaW5wdXQiIH0sCi0gICAgeyAiYXBhZCIsICAgICAgICAgICBPUFRfU1RSSU5HIHwgSEFTX0FSRyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChhcGFkKSB9LAotICAgICAgICAiYXVkaW8gcGFkIiwgIiIgfSwKLSAgICB7ICJkdHNfZGVsdGFfdGhyZXNob2xkIiwgSEFTX0FSRyB8IE9QVF9GTE9BVCB8IE9QVF9FWFBFUlQsICAgICAgIHsgJmR0c19kZWx0YV90aHJlc2hvbGQgfSwKLSAgICAgICAgInRpbWVzdGFtcCBkaXNjb250aW51aXR5IGRlbHRhIHRocmVzaG9sZCIsICJ0aHJlc2hvbGQiIH0sCi0gICAgeyAiZHRzX2Vycm9yX3RocmVzaG9sZCIsIEhBU19BUkcgfCBPUFRfRkxPQVQgfCBPUFRfRVhQRVJULCAgICAgICB7ICZkdHNfZXJyb3JfdGhyZXNob2xkIH0sCi0gICAgICAgICJ0aW1lc3RhbXAgZXJyb3IgZGVsdGEgdGhyZXNob2xkIiwgInRocmVzaG9sZCIgfSwKLSAgICB7ICJ4ZXJyb3IiLCAgICAgICAgIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgIHsgJmV4aXRfb25fZXJyb3IgfSwKLSAgICAgICAgImV4aXQgb24gZXJyb3IiLCAiZXJyb3IiIH0sCi0gICAgeyAiYWJvcnRfb24iLCAgICAgICBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9hYm9ydF9vbiB9LAotICAgICAgICAiYWJvcnQgb24gdGhlIHNwZWNpZmllZCBjb25kaXRpb24gZmxhZ3MiLCAiZmxhZ3MiIH0sCi0gICAgeyAiY29weWlua2YiLCAgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoY29weV9pbml0aWFsX25vbmtleWZyYW1lcykgfSwKLSAgICAgICAgImNvcHkgaW5pdGlhbCBub24ta2V5ZnJhbWVzIiB9LAotICAgIHsgImNvcHlwcmlvcnNzIiwgICAgT1BUX0lOVCB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwgT1BUX1NQRUMgfCBPUFRfT1VUUFVULCAgIHsgLm9mZiA9IE9GRlNFVChjb3B5X3ByaW9yX3N0YXJ0KSB9LAotICAgICAgICAiY29weSBvciBkaXNjYXJkIGZyYW1lcyBiZWZvcmUgc3RhcnQgdGltZSIgfSwKLSAgICB7ICJmcmFtZXMiLCAgICAgICAgIE9QVF9JTlQ2NCB8IEhBU19BUkcgfCBPUFRfU1BFQyB8IE9QVF9PVVRQVVQsIHsgLm9mZiA9IE9GRlNFVChtYXhfZnJhbWVzKSB9LAotICAgICAgICAic2V0IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIG91dHB1dCIsICJudW1iZXIiIH0sCi0gICAgeyAidGFnIiwgICAgICAgICAgICBPUFRfU1RSSU5HIHwgSEFTX0FSRyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWFBFUlQgfCBPUFRfT1VUUFVUIHwgT1BUX0lOUFVULCAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChjb2RlY190YWdzKSB9LAotICAgICAgICAiZm9yY2UgY29kZWMgdGFnL2ZvdXJjYyIsICJmb3VyY2MvdGFnIiB9LAotICAgIHsgInEiLCAgICAgICAgICAgICAgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfRE9VQkxFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9TUEVDIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChxc2NhbGUpIH0sCi0gICAgICAgICJ1c2UgZml4ZWQgcXVhbGl0eSBzY2FsZSAoVkJSKSIsICJxIiB9LAotICAgIHsgInFzY2FsZSIsICAgICAgICAgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfUEVSRklMRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9xc2NhbGUgfSwKLSAgICAgICAgInVzZSBmaXhlZCBxdWFsaXR5IHNjYWxlIChWQlIpIiwgInEiIH0sCi0gICAgeyAicHJvZmlsZSIsICAgICAgICBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgeyAuZnVuY19hcmcgPSBvcHRfcHJvZmlsZSB9LAotICAgICAgICAic2V0IHByb2ZpbGUiLCAicHJvZmlsZSIgfSwKLSAgICB7ICJmaWx0ZXIiLCAgICAgICAgIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQoZmlsdGVycykgfSwKLSAgICAgICAgInNldCBzdHJlYW0gZmlsdGVyZ3JhcGgiLCAiZmlsdGVyX2dyYXBoIiB9LAotICAgIHsgImZpbHRlcl9zY3JpcHQiLCAgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8IE9QVF9PVVRQVVQsIHsgLm9mZiA9IE9GRlNFVChmaWx0ZXJfc2NyaXB0cykgfSwKLSAgICAgICAgInJlYWQgc3RyZWFtIGZpbHRlcmdyYXBoIGRlc2NyaXB0aW9uIGZyb20gYSBmaWxlIiwgImZpbGVuYW1lIiB9LAotICAgIHsgInJlaW5pdF9maWx0ZXIiLCAgSEFTX0FSRyB8IE9QVF9JTlQgfCBPUFRfU1BFQyB8IE9QVF9JTlBVVCwgICAgeyAub2ZmID0gT0ZGU0VUKHJlaW5pdF9maWx0ZXJzKSB9LAotICAgICAgICAicmVpbml0IGZpbHRlcmdyYXBoIG9uIGlucHV0IHBhcmFtZXRlciBjaGFuZ2VzIiwgIiIgfSwKLSAgICB7ICJmaWx0ZXJfY29tcGxleCIsIEhBU19BUkcgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2ZpbHRlcl9jb21wbGV4IH0sCi0gICAgICAgICJjcmVhdGUgYSBjb21wbGV4IGZpbHRlcmdyYXBoIiwgImdyYXBoX2Rlc2NyaXB0aW9uIiB9LAotICAgIHsgImxhdmZpIiwgICAgICAgICAgSEFTX0FSRyB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfZmlsdGVyX2NvbXBsZXggfSwKLSAgICAgICAgImNyZWF0ZSBhIGNvbXBsZXggZmlsdGVyZ3JhcGgiLCAiZ3JhcGhfZGVzY3JpcHRpb24iIH0sCi0gICAgeyAiZmlsdGVyX2NvbXBsZXhfc2NyaXB0IiwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9maWx0ZXJfY29tcGxleF9zY3JpcHQgfSwKLSAgICAgICAgInJlYWQgY29tcGxleCBmaWx0ZXJncmFwaCBkZXNjcmlwdGlvbiBmcm9tIGEgZmlsZSIsICJmaWxlbmFtZSIgfSwKLSAgICB7ICJzdGF0cyIsICAgICAgICAgIE9QVF9CT09MLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJnByaW50X3N0YXRzIH0sCi0gICAgICAgICJwcmludCBwcm9ncmVzcyByZXBvcnQgZHVyaW5nIGVuY29kaW5nIiwgfSwKLSAgICB7ICJhdHRhY2giLCAgICAgICAgIEhBU19BUkcgfCBPUFRfUEVSRklMRSB8IE9QVF9FWFBFUlQgfAotICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfYXR0YWNoIH0sCi0gICAgICAgICJhZGQgYW4gYXR0YWNobWVudCB0byB0aGUgb3V0cHV0IGZpbGUiLCAiZmlsZW5hbWUiIH0sCi0gICAgeyAiZHVtcF9hdHRhY2htZW50IiwgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0VYUEVSVCB8IE9QVF9JTlBVVCwgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoZHVtcF9hdHRhY2htZW50KSB9LAotICAgICAgICAiZXh0cmFjdCBhbiBhdHRhY2htZW50IGludG8gYSBmaWxlIiwgImZpbGVuYW1lIiB9LAotICAgIHsgInN0cmVhbV9sb29wIiwgT1BUX0lOVCB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwgT1BUX0lOUFVUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9PRkZTRVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChsb29wKSB9LCAic2V0IG51bWJlciBvZiB0aW1lcyBpbnB1dCBzdHJlYW0gc2hhbGwgYmUgbG9vcGVkIiwgImxvb3AgY291bnQiIH0sCi0gICAgeyAiZGVidWdfdHMiLCAgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICZkZWJ1Z190cyB9LAotICAgICAgICAicHJpbnQgdGltZXN0YW1wIGRlYnVnZ2luZyBpbmZvIiB9LAotICAgIHsgIm1heF9lcnJvcl9yYXRlIiwgIEhBU19BUkcgfCBPUFRfRkxPQVQsICAgICAgICAgICAgICAgICAgICAgICAgeyAmbWF4X2Vycm9yX3JhdGUgfSwKLSAgICAgICAgIm1heGltdW0gZXJyb3IgcmF0ZSIsICJyYXRpbyBvZiBlcnJvcnMgKDAuMDogbm8gZXJyb3JzLCAxLjA6IDEwMCUgZXJyb3JzKSBhYm92ZSB3aGljaCBmZm1wZWcgcmV0dXJucyBhbiBlcnJvciBpbnN0ZWFkIG9mIHN1Y2Nlc3MuIiB9LAotICAgIHsgImRpc2NhcmQiLCAgICAgICAgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoZGlzY2FyZCkgfSwKLSAgICAgICAgImRpc2NhcmQiLCAiIiB9LAotICAgIHsgImRpc3Bvc2l0aW9uIiwgICAgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoZGlzcG9zaXRpb24pIH0sCi0gICAgICAgICJkaXNwb3NpdGlvbiIsICIiIH0sCi0gICAgeyAidGhyZWFkX3F1ZXVlX3NpemUiLCBIQVNfQVJHIHwgT1BUX0lOVCB8IE9QVF9PRkZTRVQgfCBPUFRfRVhQRVJUIHwgT1BUX0lOUFVULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHRocmVhZF9xdWV1ZV9zaXplKSB9LAotICAgICAgICAic2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZWQgcGFja2V0cyBmcm9tIHRoZSBkZW11eGVyIiB9LAotCi0gICAgLyogdmlkZW8gb3B0aW9ucyAqLwotICAgIHsgInZmcmFtZXMiLCAgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfdmlkZW9fZnJhbWVzIH0sCi0gICAgICAgICJzZXQgdGhlIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgdG8gb3V0cHV0IiwgIm51bWJlciIgfSwKLSAgICB7ICJyIiwgICAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHICB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoZnJhbWVfcmF0ZXMpIH0sCi0gICAgICAgICJzZXQgZnJhbWUgcmF0ZSAoSHogdmFsdWUsIGZyYWN0aW9uIG9yIGFiYnJldmlhdGlvbikiLCAicmF0ZSIgfSwKLSAgICB7ICJzIiwgICAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX1NVQlRJVExFIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmcmFtZV9zaXplcykgfSwKLSAgICAgICAgInNldCBmcmFtZSBzaXplIChXeEggb3IgYWJicmV2aWF0aW9uKSIsICJzaXplIiB9LAotICAgIHsgImFzcGVjdCIsICAgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmcmFtZV9hc3BlY3RfcmF0aW9zKSB9LAotICAgICAgICAic2V0IGFzcGVjdCByYXRpbyAoNDozLCAxNjo5IG9yIDEuMzMzMywgMS43Nzc3KSIsICJhc3BlY3QiIH0sCi0gICAgeyAicGl4X2ZtdCIsICAgICAgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmcmFtZV9waXhfZm10cykgfSwKLSAgICAgICAgInNldCBwaXhlbCBmb3JtYXQiLCAiZm9ybWF0IiB9LAotICAgIHsgImJpdHNfcGVyX3Jhd19zYW1wbGUiLCBPUFRfVklERU8gfCBPUFRfSU5UIHwgSEFTX0FSRywgICAgICAgICAgICAgICAgICAgICAgeyAmZnJhbWVfYml0c19wZXJfcmF3X3NhbXBsZSB9LAotICAgICAgICAic2V0IHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcmF3IHNhbXBsZSIsICJudW1iZXIiIH0sCi0gICAgeyAiaW50cmEiLCAgICAgICAgT1BUX1ZJREVPIHwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgICB7ICZpbnRyYV9vbmx5IH0sCi0gICAgICAgICJkZXByZWNhdGVkIHVzZSAtZyAxIiB9LAotICAgIHsgInZuIiwgICAgICAgICAgIE9QVF9WSURFTyB8IE9QVF9CT09MICB8IE9QVF9PRkZTRVQgfCBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULHsgLm9mZiA9IE9GRlNFVCh2aWRlb19kaXNhYmxlKSB9LAotICAgICAgICAiZGlzYWJsZSB2aWRlbyIgfSwKLSAgICB7ICJyY19vdmVycmlkZSIsICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCAgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfAotICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHJjX292ZXJyaWRlcykgfSwKLSAgICAgICAgInJhdGUgY29udHJvbCBvdmVycmlkZSBmb3Igc3BlY2lmaWMgaW50ZXJ2YWxzIiwgIm92ZXJyaWRlIiB9LAotICAgIHsgInZjb2RlYyIsICAgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgIHwgT1BUX1BFUkZJTEUgfCBPUFRfSU5QVVQgfAotICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfdmlkZW9fY29kZWMgfSwKLSAgICAgICAgImZvcmNlIHZpZGVvIGNvZGVjICgnY29weScgdG8gY29weSBzdHJlYW0pIiwgImNvZGVjIiB9LAotICAgIHsgInNhbWVxIiwgICAgICAgIE9QVF9WSURFTyB8IE9QVF9FWFBFUlQgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfc2FtZXEgfSwKLSAgICAgICAgIlJlbW92ZWQiIH0sCi0gICAgeyAic2FtZV9xdWFudCIsICAgT1BUX1ZJREVPIHwgT1BUX0VYUEVSVCAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9zYW1lcSB9LAotICAgICAgICAiUmVtb3ZlZCIgfSwKLSAgICB7ICJ0aW1lY29kZSIsICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X3RpbWVjb2RlIH0sCi0gICAgICAgICJzZXQgaW5pdGlhbCBUaW1lQ29kZSB2YWx1ZS4iLCAiaGg6bW06c3NbOjsuXWZmIiB9LAotICAgIHsgInBhc3MiLCAgICAgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgfCBPUFRfU1BFQyB8IE9QVF9JTlQgfCBPUFRfT1VUUFVULCAgICAgeyAub2ZmID0gT0ZGU0VUKHBhc3MpIH0sCi0gICAgICAgICJzZWxlY3QgdGhlIHBhc3MgbnVtYmVyICgxIHRvIDMpIiwgIm4iIH0sCi0gICAgeyAicGFzc2xvZ2ZpbGUiLCAgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfRVhQRVJUIHwgT1BUX1NQRUMgfAotICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHBhc3Nsb2dmaWxlcykgfSwKLSAgICAgICAgInNlbGVjdCB0d28gcGFzcyBsb2cgZmlsZSBuYW1lIHByZWZpeCIsICJwcmVmaXgiIH0sCi0gICAgeyAiZGVpbnRlcmxhY2UiLCAgT1BUX1ZJREVPIHwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgICB7ICZkb19kZWludGVybGFjZSB9LAotICAgICAgICAidGhpcyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIHRoZSB5YWRpZiBmaWx0ZXIgaW5zdGVhZCIgfSwKLSAgICB7ICJwc25yIiwgICAgICAgICBPUFRfVklERU8gfCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICAgIHsgJmRvX3BzbnIgfSwKLSAgICAgICAgImNhbGN1bGF0ZSBQU05SIG9mIGNvbXByZXNzZWQgZnJhbWVzIiB9LAotICAgIHsgInZzdGF0cyIsICAgICAgIE9QVF9WSURFTyB8IE9QVF9FWFBFUlQgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfdnN0YXRzIH0sCi0gICAgICAgICJkdW1wIHZpZGVvIGNvZGluZyBzdGF0aXN0aWNzIHRvIGZpbGUiIH0sCi0gICAgeyAidnN0YXRzX2ZpbGUiLCAgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgLCAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF92c3RhdHNfZmlsZSB9LAotICAgICAgICAiZHVtcCB2aWRlbyBjb2Rpbmcgc3RhdGlzdGljcyB0byBmaWxlIiwgImZpbGUiIH0sCi0gICAgeyAidmYiLCAgICAgICAgICAgT1BUX1ZJREVPIHwgSEFTX0FSRyAgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF92aWRlb19maWx0ZXJzIH0sCi0gICAgICAgICJzZXQgdmlkZW8gZmlsdGVycyIsICJmaWx0ZXJfZ3JhcGgiIH0sCi0gICAgeyAiaW50cmFfbWF0cml4IiwgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChpbnRyYV9tYXRyaWNlcykgfSwKLSAgICAgICAgInNwZWNpZnkgaW50cmEgbWF0cml4IGNvZWZmcyIsICJtYXRyaXgiIH0sCi0gICAgeyAiaW50ZXJfbWF0cml4IiwgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChpbnRlcl9tYXRyaWNlcykgfSwKLSAgICAgICAgInNwZWNpZnkgaW50ZXIgbWF0cml4IGNvZWZmcyIsICJtYXRyaXgiIH0sCi0gICAgeyAiY2hyb21hX2ludHJhX21hdHJpeCIsIE9QVF9WSURFTyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUICB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoY2hyb21hX2ludHJhX21hdHJpY2VzKSB9LAotICAgICAgICAic3BlY2lmeSBpbnRyYSBtYXRyaXggY29lZmZzIiwgIm1hdHJpeCIgfSwKLSAgICB7ICJ0b3AiLCAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCAgfCBPUFRfSU5UfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQodG9wX2ZpZWxkX2ZpcnN0KSB9LAotICAgICAgICAidG9wPTEvYm90dG9tPTAvYXV0bz0tMSBmaWVsZCBmaXJzdCIsICIiIH0sCi0gICAgeyAidnRhZyIsICAgICAgICAgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgIHwgT1BUX1BFUkZJTEUgfAotICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfb2xkMm5ldyB9LAotICAgICAgICAiZm9yY2UgdmlkZW8gdGFnL2ZvdXJjYyIsICJmb3VyY2MvdGFnIiB9LAotICAgIHsgInFwaGlzdCIsICAgICAgIE9QVF9WSURFTyB8IE9QVF9CT09MIHwgT1BUX0VYUEVSVCAsICAgICAgICAgICAgICAgICAgICAgICAgeyAmcXBfaGlzdCB9LAotICAgICAgICAic2hvdyBRUCBoaXN0b2dyYW0iIH0sCi0gICAgeyAiZm9yY2VfZnBzIiwgICAgT1BUX1ZJREVPIHwgT1BUX0JPT0wgfCBPUFRfRVhQRVJUICB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmb3JjZV9mcHMpIH0sCi0gICAgICAgICJmb3JjZSB0aGUgc2VsZWN0ZWQgZnJhbWVyYXRlLCBkaXNhYmxlIHRoZSBiZXN0IHN1cHBvcnRlZCBmcmFtZXJhdGUgc2VsZWN0aW9uIiB9LAotICAgIHsgInN0cmVhbWlkIiwgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwgT1BUX1BFUkZJTEUgfAotICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfc3RyZWFtaWQgfSwKLSAgICAgICAgInNldCB0aGUgdmFsdWUgb2YgYW4gb3V0ZmlsZSBzdHJlYW1pZCIsICJzdHJlYW1JbmRleDp2YWx1ZSIgfSwKLSAgICB7ICJmb3JjZV9rZXlfZnJhbWVzIiwgT1BUX1ZJREVPIHwgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUX1NQRUMgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmb3JjZWRfa2V5X2ZyYW1lcykgfSwKLSAgICAgICAgImZvcmNlIGtleSBmcmFtZXMgYXQgc3BlY2lmaWVkIHRpbWVzdGFtcHMiLCAidGltZXN0YW1wcyIgfSwKLSAgICB7ICJhYiIsICAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2JpdHJhdGUgfSwKLSAgICAgICAgImF1ZGlvIGJpdHJhdGUgKHBsZWFzZSB1c2UgLWI6YSkiLCAiYml0cmF0ZSIgfSwKLSAgICB7ICJiIiwgICAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2JpdHJhdGUgfSwKLSAgICAgICAgInZpZGVvIGJpdHJhdGUgKHBsZWFzZSB1c2UgLWI6dikiLCAiYml0cmF0ZSIgfSwKLSAgICB7ICJod2FjY2VsIiwgICAgICAgICAgT1BUX1ZJREVPIHwgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUX1NQRUMgfCBPUFRfSU5QVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChod2FjY2VscykgfSwKLSAgICAgICAgInVzZSBIVyBhY2NlbGVyYXRlZCBkZWNvZGluZyIsICJod2FjY2VsIG5hbWUiIH0sCi0gICAgeyAiaHdhY2NlbF9kZXZpY2UiLCAgIE9QVF9WSURFTyB8IE9QVF9TVFJJTkcgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9TUEVDIHwgT1BUX0lOUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoaHdhY2NlbF9kZXZpY2VzKSB9LAotICAgICAgICAic2VsZWN0IGEgZGV2aWNlIGZvciBIVyBhY2NlbGVyYXRpb24iLCAiZGV2aWNlbmFtZSIgfSwKLSNpZiBIQVZFX1ZEUEFVX1gxMQotICAgIHsgInZkcGF1X2FwaV92ZXIiLCBIQVNfQVJHIHwgT1BUX0lOVCB8IE9QVF9FWFBFUlQsIHsgJnZkcGF1X2FwaV92ZXIgfSwgIiIgfSwKLSNlbmRpZgotI2lmIENPTkZJR19WREEgfHwgQ09ORklHX1ZJREVPVE9PTEJPWAotICAgIHsgInZpZGVvdG9vbGJveF9waXhmbXQiLCBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9FWFBFUlQsIHsgJnZpZGVvdG9vbGJveF9waXhmbXR9LCAiIiB9LAotI2VuZGlmCi0gICAgeyAiaHdhY2NlbHMiLCAgICAgICAgIE9QVF9FWElULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IHNob3dfaHdhY2NlbHMgfSwKLSAgICAgICAgInNob3cgYXZhaWxhYmxlIEhXIGFjY2VsZXJhdGlvbiBtZXRob2RzIiB9LAotICAgIHsgImF1dG9yb3RhdGUiLCAgICAgICBIQVNfQVJHIHwgT1BUX0JPT0wgfCBPUFRfU1BFQyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWFBFUlQgfCBPUFRfSU5QVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoYXV0b3JvdGF0ZSkgfSwKLSAgICAgICAgImF1dG9tYXRpY2FsbHkgaW5zZXJ0IGNvcnJlY3Qgcm90YXRlIGZpbHRlcnMiIH0sCi0KLSAgICAvKiBhdWRpbyBvcHRpb25zICovCi0gICAgeyAiYWZyYW1lcyIsICAgICAgICBPUFRfQVVESU8gfCBIQVNfQVJHICB8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2F1ZGlvX2ZyYW1lcyB9LAotICAgICAgICAic2V0IHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHRvIG91dHB1dCIsICJudW1iZXIiIH0sCi0gICAgeyAiYXEiLCAgICAgICAgICAgICBPUFRfQVVESU8gfCBIQVNfQVJHICB8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2F1ZGlvX3FzY2FsZSB9LAotICAgICAgICAic2V0IGF1ZGlvIHF1YWxpdHkgKGNvZGVjLXNwZWNpZmljKSIsICJxdWFsaXR5IiwgfSwKLSAgICB7ICJhciIsICAgICAgICAgICAgIE9QVF9BVURJTyB8IEhBU19BUkcgIHwgT1BUX0lOVCB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGF1ZGlvX3NhbXBsZV9yYXRlKSB9LAotICAgICAgICAic2V0IGF1ZGlvIHNhbXBsaW5nIHJhdGUgKGluIEh6KSIsICJyYXRlIiB9LAotICAgIHsgImFjIiwgICAgICAgICAgICAgT1BUX0FVRElPIHwgSEFTX0FSRyAgfCBPUFRfSU5UIHwgT1BUX1NQRUMgfAotICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoYXVkaW9fY2hhbm5lbHMpIH0sCi0gICAgICAgICJzZXQgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIiwgImNoYW5uZWxzIiB9LAotICAgIHsgImFuIiwgICAgICAgICAgICAgT1BUX0FVRElPIHwgT1BUX0JPT0wgfCBPUFRfT0ZGU0VUIHwgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCx7IC5vZmYgPSBPRkZTRVQoYXVkaW9fZGlzYWJsZSkgfSwKLSAgICAgICAgImRpc2FibGUgYXVkaW8iIH0sCi0gICAgeyAiYWNvZGVjIiwgICAgICAgICBPUFRfQVVESU8gfCBIQVNfQVJHICB8IE9QVF9QRVJGSUxFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfYXVkaW9fY29kZWMgfSwKLSAgICAgICAgImZvcmNlIGF1ZGlvIGNvZGVjICgnY29weScgdG8gY29weSBzdHJlYW0pIiwgImNvZGVjIiB9LAotICAgIHsgImF0YWciLCAgICAgICAgICAgT1BUX0FVRElPIHwgSEFTX0FSRyAgfCBPUFRfRVhQRVJUIHwgT1BUX1BFUkZJTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9vbGQybmV3IH0sCi0gICAgICAgICJmb3JjZSBhdWRpbyB0YWcvZm91cmNjIiwgImZvdXJjYy90YWciIH0sCi0gICAgeyAidm9sIiwgICAgICAgICAgICBPUFRfQVVESU8gfCBIQVNfQVJHICB8IE9QVF9JTlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJmF1ZGlvX3ZvbHVtZSB9LAotICAgICAgICAiY2hhbmdlIGF1ZGlvIHZvbHVtZSAoMjU2PW5vcm1hbCkiICwgInZvbHVtZSIgfSwKLSAgICB7ICJzYW1wbGVfZm10IiwgICAgIE9QVF9BVURJTyB8IEhBU19BUkcgIHwgT1BUX0VYUEVSVCB8IE9QVF9TUEVDIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9TVFJJTkcgfCBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHNhbXBsZV9mbXRzKSB9LAotICAgICAgICAic2V0IHNhbXBsZSBmb3JtYXQiLCAiZm9ybWF0IiB9LAotICAgIHsgImNoYW5uZWxfbGF5b3V0IiwgT1BUX0FVRElPIHwgSEFTX0FSRyAgfCBPUFRfRVhQRVJUIHwgT1BUX1BFUkZJTEUgfAotICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9jaGFubmVsX2xheW91dCB9LAotICAgICAgICAic2V0IGNoYW5uZWwgbGF5b3V0IiwgImxheW91dCIgfSwKLSAgICB7ICJhZiIsICAgICAgICAgICAgIE9QVF9BVURJTyB8IEhBU19BUkcgIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfYXVkaW9fZmlsdGVycyB9LAotICAgICAgICAic2V0IGF1ZGlvIGZpbHRlcnMiLCAiZmlsdGVyX2dyYXBoIiB9LAotICAgIHsgImd1ZXNzX2xheW91dF9tYXgiLCBPUFRfQVVESU8gfCBIQVNfQVJHIHwgT1BUX0lOVCB8IE9QVF9TUEVDIHwgT1BUX0VYUEVSVCB8IE9QVF9JTlBVVCwgeyAub2ZmID0gT0ZGU0VUKGd1ZXNzX2xheW91dF9tYXgpIH0sCi0gICAgICAic2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0byB0cnkgdG8gZ3Vlc3MgdGhlIGNoYW5uZWwgbGF5b3V0IiB9LAotCi0gICAgLyogc3VidGl0bGUgb3B0aW9ucyAqLwotICAgIHsgInNuIiwgICAgIE9QVF9TVUJUSVRMRSB8IE9QVF9CT09MIHwgT1BUX09GRlNFVCB8IE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsIHsgLm9mZiA9IE9GRlNFVChzdWJ0aXRsZV9kaXNhYmxlKSB9LAotICAgICAgICAiZGlzYWJsZSBzdWJ0aXRsZSIgfSwKLSAgICB7ICJzY29kZWMiLCBPUFRfU1VCVElUTEUgfCBIQVNfQVJHICB8IE9QVF9QRVJGSUxFIHwgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgeyAuZnVuY19hcmcgPSBvcHRfc3VidGl0bGVfY29kZWMgfSwKLSAgICAgICAgImZvcmNlIHN1YnRpdGxlIGNvZGVjICgnY29weScgdG8gY29weSBzdHJlYW0pIiwgImNvZGVjIiB9LAotICAgIHsgInN0YWciLCAgIE9QVF9TVUJUSVRMRSB8IEhBU19BUkcgIHwgT1BUX0VYUEVSVCAgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X29sZDJuZXcgfQotICAgICAgICAsICJmb3JjZSBzdWJ0aXRsZSB0YWcvZm91cmNjIiwgImZvdXJjYy90YWciIH0sCi0gICAgeyAiZml4X3N1Yl9kdXJhdGlvbiIsIE9QVF9CT09MIHwgT1BUX0VYUEVSVCB8IE9QVF9TVUJUSVRMRSB8IE9QVF9TUEVDIHwgT1BUX0lOUFVULCB7IC5vZmYgPSBPRkZTRVQoZml4X3N1Yl9kdXJhdGlvbikgfSwKLSAgICAgICAgImZpeCBzdWJ0aXRsZXMgZHVyYXRpb24iIH0sCi0gICAgeyAiY2FudmFzX3NpemUiLCBPUFRfU1VCVElUTEUgfCBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwgT1BUX0lOUFVULCB7IC5vZmYgPSBPRkZTRVQoY2FudmFzX3NpemVzKSB9LAotICAgICAgICAic2V0IGNhbnZhcyBzaXplIChXeEggb3IgYWJicmV2aWF0aW9uKSIsICJzaXplIiB9LAotCi0gICAgLyogZ3JhYiBvcHRpb25zICovCi0gICAgeyAidmMiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9WSURFTywgeyAuZnVuY19hcmcgPSBvcHRfdmlkZW9fY2hhbm5lbCB9LAotICAgICAgICAiZGVwcmVjYXRlZCwgdXNlIC1jaGFubmVsIiwgImNoYW5uZWwiIH0sCi0gICAgeyAidHZzdGQiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9WSURFTywgeyAuZnVuY19hcmcgPSBvcHRfdmlkZW9fc3RhbmRhcmQgfSwKLSAgICAgICAgImRlcHJlY2F0ZWQsIHVzZSAtc3RhbmRhcmQiLCAic3RhbmRhcmQiIH0sCi0gICAgeyAiaXN5bmMiLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsIHsgJmlucHV0X3N5bmMgfSwgInRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIGRvZXMgbm90aGluZyIsICIiIH0sCi0KLSAgICAvKiBtdXhlciBvcHRpb25zICovCi0gICAgeyAibXV4ZGVsYXkiLCAgIE9QVF9GTE9BVCB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwgT1BUX09GRlNFVCB8IE9QVF9PVVRQVVQsIHsgLm9mZiA9IE9GRlNFVChtdXhfbWF4X2RlbGF5KSB9LAotICAgICAgICAic2V0IHRoZSBtYXhpbXVtIGRlbXV4LWRlY29kZSBkZWxheSIsICJzZWNvbmRzIiB9LAotICAgIHsgIm11eHByZWxvYWQiLCBPUFRfRkxPQVQgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9PRkZTRVQgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQobXV4X3ByZWxvYWQpIH0sCi0gICAgICAgICJzZXQgdGhlIGluaXRpYWwgZGVtdXgtZGVjb2RlIGRlbGF5IiwgInNlY29uZHMiIH0sCi0gICAgeyAib3ZlcnJpZGVfZmZzZXJ2ZXIiLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQgfCBPUFRfT1VUUFVULCB7ICZvdmVycmlkZV9mZnNlcnZlciB9LAotICAgICAgICAib3ZlcnJpZGUgdGhlIG9wdGlvbnMgZnJvbSBmZnNlcnZlciIsICIiIH0sCi0gICAgeyAic2RwX2ZpbGUiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X3NkcF9maWxlIH0sCi0gICAgICAgICJzcGVjaWZ5IGEgZmlsZSBpbiB3aGljaCB0byBwcmludCBzZHAgaW5mb3JtYXRpb24iLCAiZmlsZSIgfSwKLQotICAgIHsgImJzZiIsIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfCBPUFRfRVhQRVJUIHwgT1BUX09VVFBVVCwgeyAub2ZmID0gT0ZGU0VUKGJpdHN0cmVhbV9maWx0ZXJzKSB9LAotICAgICAgICAiQSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBiaXRzdHJlYW0gZmlsdGVycyIsICJiaXRzdHJlYW1fZmlsdGVycyIgfSwKLSAgICB7ICJhYnNmIiwgSEFTX0FSRyB8IE9QVF9BVURJTyB8IE9QVF9FWFBFUlR8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgeyAuZnVuY19hcmcgPSBvcHRfb2xkMm5ldyB9LAotICAgICAgICAiZGVwcmVjYXRlZCIsICJhdWRpbyBiaXRzdHJlYW1fZmlsdGVycyIgfSwKLSAgICB7ICJ2YnNmIiwgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlR8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgeyAuZnVuY19hcmcgPSBvcHRfb2xkMm5ldyB9LAotICAgICAgICAiZGVwcmVjYXRlZCIsICJ2aWRlbyBiaXRzdHJlYW1fZmlsdGVycyIgfSwKLQotICAgIHsgImFwcmUiLCBIQVNfQVJHIHwgT1BUX0FVRElPIHwgT1BUX0VYUEVSVHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICB7IC5mdW5jX2FyZyA9IG9wdF9wcmVzZXQgfSwKLSAgICAgICAgInNldCB0aGUgYXVkaW8gb3B0aW9ucyB0byB0aGUgaW5kaWNhdGVkIHByZXNldCIsICJwcmVzZXQiIH0sCi0gICAgeyAidnByZSIsIE9QVF9WSURFTyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsICAgIHsgLmZ1bmNfYXJnID0gb3B0X3ByZXNldCB9LAotICAgICAgICAic2V0IHRoZSB2aWRlbyBvcHRpb25zIHRvIHRoZSBpbmRpY2F0ZWQgcHJlc2V0IiwgInByZXNldCIgfSwKLSAgICB7ICJzcHJlIiwgSEFTX0FSRyB8IE9QVF9TVUJUSVRMRSB8IE9QVF9FWFBFUlR8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgeyAuZnVuY19hcmcgPSBvcHRfcHJlc2V0IH0sCi0gICAgICAgICJzZXQgdGhlIHN1YnRpdGxlIG9wdGlvbnMgdG8gdGhlIGluZGljYXRlZCBwcmVzZXQiLCAicHJlc2V0IiB9LAotICAgIHsgImZwcmUiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9wcmVzZXQgfSwKLSAgICAgICAgInNldCBvcHRpb25zIGZyb20gaW5kaWNhdGVkIHByZXNldCBmaWxlIiwgImZpbGVuYW1lIiB9LAotICAgIC8qIGRhdGEgY29kZWMgc3VwcG9ydCAqLwotICAgIHsgImRjb2RlYyIsIEhBU19BUkcgfCBPUFRfREFUQSB8IE9QVF9QRVJGSUxFIHwgT1BUX0VYUEVSVCB8IE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X2RhdGFfY29kZWMgfSwKLSAgICAgICAgImZvcmNlIGRhdGEgY29kZWMgKCdjb3B5JyB0byBjb3B5IHN0cmVhbSkiLCAiY29kZWMiIH0sCi0gICAgeyAiZG4iLCBPUFRfQk9PTCB8IE9QVF9WSURFTyB8IE9QVF9PRkZTRVQgfCBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQoZGF0YV9kaXNhYmxlKSB9LAotICAgICAgICAiZGlzYWJsZSBkYXRhIiB9LAotCi0gICAgeyBOVUxMLCB9LAotfTsKZGlmZiAtLWdpdCBhL2ZmbXBlZ19xc3YuYyBiL2ZmbXBlZ19xc3YuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVhMjM1MS4uMDAwMDAwMAotLS0gYS9mZm1wZWdfcXN2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bWZ4L21meHZpZGVvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9xc3YuaCIKLQotI2luY2x1ZGUgImZmbXBlZy5oIgotCi10eXBlZGVmIHN0cnVjdCBRU1ZDb250ZXh0IHsKLSAgICBPdXRwdXRTdHJlYW0gKm9zdDsKLQotICAgIG1meFNlc3Npb24gc2Vzc2lvbjsKLQotICAgIG1meEV4dE9wYXF1ZVN1cmZhY2VBbGxvYyBvcGFxdWVfYWxsb2M7Ci0gICAgQVZCdWZmZXJSZWYgICAgICAgICAgICAgKm9wYXF1ZV9zdXJmYWNlc19idWY7Ci0KLSAgICB1aW50OF90ICAgICAgICAgICAqc3VyZmFjZV91c2VkOwotICAgIG1meEZyYW1lU3VyZmFjZTEgKipzdXJmYWNlX3B0cnM7Ci0gICAgaW50IG5iX3N1cmZhY2VzOwotCi0gICAgbWZ4RXh0QnVmZmVyICpleHRfYnVmZmVyc1sxXTsKLX0gUVNWQ29udGV4dDsKLQotc3RhdGljIHZvaWQgYnVmZmVyX3JlbGVhc2Uodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQotewotICAgICoodWludDhfdCopb3BhcXVlID0gMDsKLX0KLQotc3RhdGljIGludCBxc3ZfZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncykKLXsKLSAgICBJbnB1dFN0cmVhbSAqaXN0ID0gcy0+b3BhcXVlOwotICAgIFFTVkNvbnRleHQgICpxc3YgPSBpc3QtPmh3YWNjZWxfY3R4OwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHFzdi0+bmJfc3VyZmFjZXM7IGkrKykgewotICAgICAgICBpZiAocXN2LT5zdXJmYWNlX3VzZWRbaV0pCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmcmFtZS0+YnVmWzBdID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCopcXN2LT5zdXJmYWNlX3B0cnNbaV0sIHNpemVvZigqcXN2LT5zdXJmYWNlX3B0cnNbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfcmVsZWFzZSwgJnFzdi0+c3VyZmFjZV91c2VkW2ldLCAwKTsKLSAgICAgICAgaWYgKCFmcmFtZS0+YnVmWzBdKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZnJhbWUtPmRhdGFbM10gICAgICAgPSAodWludDhfdCopcXN2LT5zdXJmYWNlX3B0cnNbaV07Ci0gICAgICAgIHFzdi0+c3VyZmFjZV91c2VkW2ldID0gMTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLX0KLQotc3RhdGljIGludCBpbml0X29wYXF1ZV9zdXJmKFFTVkNvbnRleHQgKnFzdikKLXsKLSAgICBBVlFTVkNvbnRleHQgKmh3Y3R4X2VuYyA9IHFzdi0+b3N0LT5lbmNfY3R4LT5od2FjY2VsX2NvbnRleHQ7Ci0gICAgbWZ4RnJhbWVTdXJmYWNlMSAqc3VyZmFjZXM7Ci0gICAgaW50IGk7Ci0KLSAgICBxc3YtPm5iX3N1cmZhY2VzID0gaHdjdHhfZW5jLT5uYl9vcGFxdWVfc3VyZmFjZXM7Ci0KLSAgICBxc3YtPm9wYXF1ZV9zdXJmYWNlc19idWYgPSBhdl9idWZmZXJfcmVmKGh3Y3R4X2VuYy0+b3BhcXVlX3N1cmZhY2VzKTsKLSAgICBxc3YtPnN1cmZhY2VfcHRycyAgICAgICAgPSBhdl9tYWxsb2N6X2FycmF5KHFzdi0+bmJfc3VyZmFjZXMsIHNpemVvZigqcXN2LT5zdXJmYWNlX3B0cnMpKTsKLSAgICBxc3YtPnN1cmZhY2VfdXNlZCAgICAgICAgPSBhdl9tYWxsb2N6X2FycmF5KHFzdi0+bmJfc3VyZmFjZXMsIHNpemVvZigqcXN2LT5zdXJmYWNlX3VzZWQpKTsKLSAgICBpZiAoIXFzdi0+b3BhcXVlX3N1cmZhY2VzX2J1ZiB8fCAhcXN2LT5zdXJmYWNlX3B0cnMgfHwgIXFzdi0+c3VyZmFjZV91c2VkKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgc3VyZmFjZXMgPSAobWZ4RnJhbWVTdXJmYWNlMSopcXN2LT5vcGFxdWVfc3VyZmFjZXNfYnVmLT5kYXRhOwotICAgIGZvciAoaSA9IDA7IGkgPCBxc3YtPm5iX3N1cmZhY2VzOyBpKyspCi0gICAgICAgIHFzdi0+c3VyZmFjZV9wdHJzW2ldID0gc3VyZmFjZXMgKyBpOwotCi0gICAgcXN2LT5vcGFxdWVfYWxsb2MuT3V0LlN1cmZhY2VzICAgPSBxc3YtPnN1cmZhY2VfcHRyczsKLSAgICBxc3YtPm9wYXF1ZV9hbGxvYy5PdXQuTnVtU3VyZmFjZSA9IHFzdi0+bmJfc3VyZmFjZXM7Ci0gICAgcXN2LT5vcGFxdWVfYWxsb2MuT3V0LlR5cGUgICAgICAgPSBod2N0eF9lbmMtPm9wYXF1ZV9hbGxvY190eXBlOwotCi0gICAgcXN2LT5vcGFxdWVfYWxsb2MuSGVhZGVyLkJ1ZmZlcklkID0gTUZYX0VYVEJVRkZfT1BBUVVFX1NVUkZBQ0VfQUxMT0NBVElPTjsKLSAgICBxc3YtPm9wYXF1ZV9hbGxvYy5IZWFkZXIuQnVmZmVyU3ogPSBzaXplb2YocXN2LT5vcGFxdWVfYWxsb2MpOwotICAgIHFzdi0+ZXh0X2J1ZmZlcnNbMF0gICAgICAgICAgICAgICA9IChtZnhFeHRCdWZmZXIqKSZxc3YtPm9wYXF1ZV9hbGxvYzsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBxc3ZfdW5pbml0KEFWQ29kZWNDb250ZXh0ICpzKQotewotICAgIElucHV0U3RyZWFtICppc3QgPSBzLT5vcGFxdWU7Ci0gICAgUVNWQ29udGV4dCAgKnFzdiA9IGlzdC0+aHdhY2NlbF9jdHg7Ci0KLSAgICBhdl9mcmVlcCgmcXN2LT5vc3QtPmVuY19jdHgtPmh3YWNjZWxfY29udGV4dCk7Ci0gICAgYXZfZnJlZXAoJnMtPmh3YWNjZWxfY29udGV4dCk7Ci0KLSAgICBhdl9idWZmZXJfdW5yZWYoJnFzdi0+b3BhcXVlX3N1cmZhY2VzX2J1Zik7Ci0gICAgYXZfZnJlZXAoJnFzdi0+c3VyZmFjZV91c2VkKTsKLSAgICBhdl9mcmVlcCgmcXN2LT5zdXJmYWNlX3B0cnMpOwotCi0gICAgYXZfZnJlZXAoJnFzdik7Ci19Ci0KLWludCBxc3ZfaW5pdChBVkNvZGVjQ29udGV4dCAqcykKLXsKLSAgICBJbnB1dFN0cmVhbSAqaXN0ID0gcy0+b3BhcXVlOwotICAgIFFTVkNvbnRleHQgICpxc3YgPSBpc3QtPmh3YWNjZWxfY3R4OwotICAgIEFWUVNWQ29udGV4dCAqaHdjdHhfZGVjOwotICAgIGludCByZXQ7Ci0KLSAgICBpZiAoIXFzdikgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiUVNWIHRyYW5zY29kaW5nIGlzIG5vdCBpbml0aWFsaXplZC4gIgotICAgICAgICAgICAgICAgIi1od2FjY2VsIHFzdiBzaG91bGQgb25seSBiZSB1c2VkIGZvciBvbmUtdG8tb25lIFFTViB0cmFuc2NvZGluZyAiCi0gICAgICAgICAgICAgICAid2l0aCBubyBmaWx0ZXJzLlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKLSAgICB9Ci0KLSAgICByZXQgPSBpbml0X29wYXF1ZV9zdXJmKHFzdik7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBod2N0eF9kZWMgPSBhdl9xc3ZfYWxsb2NfY29udGV4dCgpOwotICAgIGlmICghaHdjdHhfZGVjKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgaHdjdHhfZGVjLT5zZXNzaW9uICAgICAgICA9IHFzdi0+c2Vzc2lvbjsKLSAgICBod2N0eF9kZWMtPmlvcGF0dGVybiAgICAgID0gTUZYX0lPUEFUVEVSTl9PVVRfT1BBUVVFX01FTU9SWTsKLSAgICBod2N0eF9kZWMtPmV4dF9idWZmZXJzICAgID0gcXN2LT5leHRfYnVmZmVyczsKLSAgICBod2N0eF9kZWMtPm5iX2V4dF9idWZmZXJzID0gRkZfQVJSQVlfRUxFTVMocXN2LT5leHRfYnVmZmVycyk7Ci0KLSAgICBhdl9mcmVlcCgmcy0+aHdhY2NlbF9jb250ZXh0KTsKLSAgICBzLT5od2FjY2VsX2NvbnRleHQgPSBod2N0eF9kZWM7Ci0KLSAgICBpc3QtPmh3YWNjZWxfZ2V0X2J1ZmZlciA9IHFzdl9nZXRfYnVmZmVyOwotICAgIGlzdC0+aHdhY2NlbF91bmluaXQgICAgID0gcXN2X3VuaW5pdDsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgbWZ4SU1QTCBjaG9vc2VfaW1wbGVtZW50YXRpb24oY29uc3QgSW5wdXRTdHJlYW0gKmlzdCkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgICAgbWZ4SU1QTCAgICAgaW1wbDsKLSAgICB9IGltcGxfbWFwW10gPSB7Ci0gICAgICAgIHsgImF1dG8iLCAgICAgTUZYX0lNUExfQVVUTyAgICAgICAgIH0sCi0gICAgICAgIHsgInN3IiwgICAgICAgTUZYX0lNUExfU09GVFdBUkUgICAgIH0sCi0gICAgICAgIHsgImh3IiwgICAgICAgTUZYX0lNUExfSEFSRFdBUkUgICAgIH0sCi0gICAgICAgIHsgImF1dG9fYW55IiwgTUZYX0lNUExfQVVUT19BTlkgICAgIH0sCi0gICAgICAgIHsgImh3X2FueSIsICAgTUZYX0lNUExfSEFSRFdBUkVfQU5ZIH0sCi0gICAgICAgIHsgImh3MiIsICAgICAgTUZYX0lNUExfSEFSRFdBUkUyICAgIH0sCi0gICAgICAgIHsgImh3MyIsICAgICAgTUZYX0lNUExfSEFSRFdBUkUzICAgIH0sCi0gICAgICAgIHsgImh3NCIsICAgICAgTUZYX0lNUExfSEFSRFdBUkU0ICAgIH0sCi0gICAgfTsKLQotICAgIG1meElNUEwgaW1wbCA9IE1GWF9JTVBMX0FVVE9fQU5ZOwotICAgIGludCBpOwotCi0gICAgaWYgKGlzdC0+aHdhY2NlbF9kZXZpY2UpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGltcGxfbWFwKTsgaSsrKQotICAgICAgICAgICAgaWYgKCFzdHJjbXAoaXN0LT5od2FjY2VsX2RldmljZSwgaW1wbF9tYXBbaV0ubmFtZSkpIHsKLSAgICAgICAgICAgICAgICBpbXBsID0gaW1wbF9tYXBbaV0uaW1wbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgaWYgKGkgPT0gRkZfQVJSQVlfRUxFTVMoaW1wbF9tYXApKQotICAgICAgICAgICAgaW1wbCA9IHN0cnRvbChpc3QtPmh3YWNjZWxfZGV2aWNlLCBOVUxMLCAwKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gaW1wbDsKLX0KLQotaW50IHFzdl90cmFuc2NvZGVfaW5pdChPdXRwdXRTdHJlYW0gKm9zdCkKLXsKLSAgICBJbnB1dFN0cmVhbSAqaXN0OwotICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdDsKLQotICAgIEFWRGljdGlvbmFyeUVudHJ5ICplOwotICAgIGNvbnN0IEFWT3B0aW9uICpvcHQ7Ci0gICAgaW50IGZsYWdzID0gMDsKLQotICAgIGludCBlcnIsIGk7Ci0KLSAgICBRU1ZDb250ZXh0ICpxc3YgPSBOVUxMOwotICAgIEFWUVNWQ29udGV4dCAqaHdjdHggPSBOVUxMOwotICAgIG1meElNUEwgaW1wbDsKLSAgICBtZnhWZXJzaW9uIHZlciA9IHsgeyAzLCAxIH0gfTsKLQotICAgIC8qIGNoZWNrIGlmIHRoZSBlbmNvZGVyIHN1cHBvcnRzIFFTViAqLwotICAgIGlmICghb3N0LT5lbmMtPnBpeF9mbXRzKQotICAgICAgICByZXR1cm4gMDsKLSAgICBmb3IgKHBpeF9mbXQgPSBvc3QtPmVuYy0+cGl4X2ZtdHM7ICpwaXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORTsgcGl4X2ZtdCsrKQotICAgICAgICBpZiAoKnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9RU1YpCi0gICAgICAgICAgICBicmVhazsKLSAgICBpZiAoKnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChzdHJjbXAob3N0LT5hdmZpbHRlciwgIm51bGwiKSB8fCBvc3QtPnNvdXJjZV9pbmRleCA8IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogY2hlY2sgaWYgdGhlIGRlY29kZXIgc3VwcG9ydHMgUVNWIGFuZCB0aGUgb3V0cHV0IG9ubHkgZ29lcyB0byB0aGlzIHN0cmVhbSAqLwotICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdOwotICAgIGlmIChpc3QtPm5iX2ZpbHRlcnMgfHwgaXN0LT5od2FjY2VsX2lkICE9IEhXQUNDRUxfUVNWIHx8Ci0gICAgICAgICFpc3QtPmRlYyB8fCAhaXN0LT5kZWMtPnBpeF9mbXRzKQotICAgICAgICByZXR1cm4gMDsKLSAgICBmb3IgKHBpeF9mbXQgPSBpc3QtPmRlYy0+cGl4X2ZtdHM7ICpwaXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORTsgcGl4X2ZtdCsrKQotICAgICAgICBpZiAoKnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9RU1YpCi0gICAgICAgICAgICBicmVhazsKLSAgICBpZiAoKnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKQotICAgICAgICBpZiAob3V0cHV0X3N0cmVhbXNbaV0gIT0gb3N0ICYmCi0gICAgICAgICAgICBvdXRwdXRfc3RyZWFtc1tpXS0+c291cmNlX2luZGV4ID09IG9zdC0+c291cmNlX2luZGV4KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJTZXR0aW5nIHVwIFFTViB0cmFuc2NvZGluZ1xuIik7Ci0KLSAgICBxc3YgICA9IGF2X21hbGxvY3ooc2l6ZW9mKCpxc3YpKTsKLSAgICBod2N0eCA9IGF2X3Fzdl9hbGxvY19jb250ZXh0KCk7Ci0gICAgaWYgKCFxc3YgfHwgIWh3Y3R4KQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBpbXBsID0gY2hvb3NlX2ltcGxlbWVudGF0aW9uKGlzdCk7Ci0KLSAgICBlcnIgPSBNRlhJbml0KGltcGwsICZ2ZXIsICZxc3YtPnNlc3Npb24pOwotICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgYW4gTUZYIHNlc3Npb246ICVkXG4iLCBlcnIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgZSA9IGF2X2RpY3RfZ2V0KG9zdC0+ZW5jb2Rlcl9vcHRzLCAiZmxhZ3MiLCBOVUxMLCAwKTsKLSAgICBvcHQgPSBhdl9vcHRfZmluZChvc3QtPmVuY19jdHgsICJmbGFncyIsIE5VTEwsIDAsIDApOwotICAgIGlmIChlICYmIG9wdCkKLSAgICAgICAgYXZfb3B0X2V2YWxfZmxhZ3Mob3N0LT5lbmNfY3R4LCBvcHQsIGUtPnZhbHVlLCAmZmxhZ3MpOwotCi0gICAgcXN2LT5vc3QgPSBvc3Q7Ci0KLSAgICBod2N0eC0+c2Vzc2lvbiAgICAgICAgICAgICAgICA9IHFzdi0+c2Vzc2lvbjsKLSAgICBod2N0eC0+aW9wYXR0ZXJuICAgICAgICAgICAgICA9IE1GWF9JT1BBVFRFUk5fSU5fT1BBUVVFX01FTU9SWTsKLSAgICBod2N0eC0+b3BhcXVlX2FsbG9jICAgICAgICAgICA9IDE7Ci0gICAgaHdjdHgtPm5iX29wYXF1ZV9zdXJmYWNlcyAgICAgPSAxNjsKLQotICAgIG9zdC0+aHdhY2NlbF9jdHggICAgICAgICAgICAgID0gcXN2OwotICAgIG9zdC0+ZW5jX2N0eC0+aHdhY2NlbF9jb250ZXh0ID0gaHdjdHg7Ci0gICAgb3N0LT5lbmNfY3R4LT5waXhfZm10ICAgICAgICAgPSBBVl9QSVhfRk1UX1FTVjsKLQotICAgIGlzdC0+aHdhY2NlbF9jdHggICAgICAgICAgICAgID0gcXN2OwotICAgIGlzdC0+ZGVjX2N0eC0+cGl4X2ZtdCAgICAgICAgID0gQVZfUElYX0ZNVF9RU1Y7Ci0gICAgaXN0LT5yZXNhbXBsZV9waXhfZm10ICAgICAgICAgPSBBVl9QSVhfRk1UX1FTVjsKLQotICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIGF2X2ZyZWVwKCZod2N0eCk7Ci0gICAgYXZfZnJlZXAoJnFzdik7Ci0gICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKLX0KZGlmZiAtLWdpdCBhL2ZmbXBlZ192ZHBhdS5jIGIvZmZtcGVnX3ZkcGF1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYTk4ZWEuLjAwMDAwMDAKLS0tIGEvZmZtcGVnX3ZkcGF1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx2ZHBhdS92ZHBhdS5oPgotI2luY2x1ZGUgPHZkcGF1L3ZkcGF1X3gxMS5oPgotCi0jaW5jbHVkZSA8WDExL1hsaWIuaD4KLQotI2luY2x1ZGUgImZmbXBlZy5oIgotCi0jaW5jbHVkZSAibGliYXZjb2RlYy92ZHBhdS5oIgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgVkRQQVVDb250ZXh0IHsKLSAgICBEaXNwbGF5ICpkcHk7Ci0KLSAgICBWZHBEZXZpY2UgIGRldmljZTsKLSAgICBWZHBEZWNvZGVyIGRlY29kZXI7Ci0gICAgVmRwR2V0UHJvY0FkZHJlc3MgKmdldF9wcm9jX2FkZHJlc3M7Ci0KLSAgICBWZHBHZXRFcnJvclN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZ2V0X2Vycm9yX3N0cmluZzsKLSAgICBWZHBHZXRJbmZvcm1hdGlvblN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAqZ2V0X2luZm9ybWF0aW9uX3N0cmluZzsKLSAgICBWZHBEZXZpY2VEZXN0cm95ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGV2aWNlX2Rlc3Ryb3k7Ci0jaWYgMSAvLyBmb3IgZmZtcGVncyBvbGRlciB2ZHBhdSBBUEksIG5vdCB0aGUgb2xkZXN0IHRob3VnaAotICAgIFZkcERlY29kZXJDcmVhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZWNvZGVyX2NyZWF0ZTsKLSAgICBWZHBEZWNvZGVyRGVzdHJveSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVjb2Rlcl9kZXN0cm95OwotICAgIFZkcERlY29kZXJSZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZWNvZGVyX3JlbmRlcjsKLSNlbmRpZgotICAgIFZkcFZpZGVvU3VyZmFjZUNyZWF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICp2aWRlb19zdXJmYWNlX2NyZWF0ZTsKLSAgICBWZHBWaWRlb1N1cmZhY2VEZXN0cm95ICAgICAgICAgICAgICAgICAgICAgICAgICAqdmlkZW9fc3VyZmFjZV9kZXN0cm95OwotICAgIFZkcFZpZGVvU3VyZmFjZUdldEJpdHNZQ2JDciAgICAgICAgICAgICAgICAgICAgICp2aWRlb19zdXJmYWNlX2dldF9iaXRzOwotICAgIFZkcFZpZGVvU3VyZmFjZUdldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICp2aWRlb19zdXJmYWNlX2dldF9wYXJhbWV0ZXJzOwotICAgIFZkcFZpZGVvU3VyZmFjZVF1ZXJ5R2V0UHV0Qml0c1lDYkNyQ2FwYWJpbGl0aWVzICp2aWRlb19zdXJmYWNlX3F1ZXJ5OwotCi0gICAgQVZGcmFtZSAqdG1wX2ZyYW1lOwotCi0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7Ci0gICAgVmRwWUNiQ3JGb3JtYXQgdmRwYXVfZm9ybWF0OwotfSBWRFBBVUNvbnRleHQ7Ci0KLWludCB2ZHBhdV9hcGlfdmVyID0gMjsKLQotc3RhdGljIHZvaWQgdmRwYXVfdW5pbml0KEFWQ29kZWNDb250ZXh0ICpzKQotewotICAgIElucHV0U3RyZWFtICAqaXN0ID0gcy0+b3BhcXVlOwotICAgIFZEUEFVQ29udGV4dCAqY3R4ID0gaXN0LT5od2FjY2VsX2N0eDsKLQotICAgIGlzdC0+aHdhY2NlbF91bmluaXQgICAgICAgID0gTlVMTDsKLSAgICBpc3QtPmh3YWNjZWxfZ2V0X2J1ZmZlciAgICA9IE5VTEw7Ci0gICAgaXN0LT5od2FjY2VsX3JldHJpZXZlX2RhdGEgPSBOVUxMOwotCi0gICAgaWYgKGN0eC0+ZGVjb2Rlcl9kZXN0cm95KQotICAgICAgICBjdHgtPmRlY29kZXJfZGVzdHJveShjdHgtPmRlY29kZXIpOwotCi0gICAgaWYgKGN0eC0+ZGV2aWNlX2Rlc3Ryb3kpCi0gICAgICAgIGN0eC0+ZGV2aWNlX2Rlc3Ryb3koY3R4LT5kZXZpY2UpOwotCi0gICAgaWYgKGN0eC0+ZHB5KQotICAgICAgICBYQ2xvc2VEaXNwbGF5KGN0eC0+ZHB5KTsKLQotICAgIGF2X2ZyYW1lX2ZyZWUoJmN0eC0+dG1wX2ZyYW1lKTsKLQotICAgIGF2X2ZyZWVwKCZpc3QtPmh3YWNjZWxfY3R4KTsKLSAgICBhdl9mcmVlcCgmcy0+aHdhY2NlbF9jb250ZXh0KTsKLX0KLQotc3RhdGljIHZvaWQgdmRwYXVfcmVsZWFzZV9idWZmZXIodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQotewotICAgIFZkcFZpZGVvU3VyZmFjZSBzdXJmYWNlID0gKihWZHBWaWRlb1N1cmZhY2UqKWRhdGE7Ci0gICAgVkRQQVVDb250ZXh0ICpjdHggPSBvcGFxdWU7Ci0KLSAgICBjdHgtPnZpZGVvX3N1cmZhY2VfZGVzdHJveShzdXJmYWNlKTsKLSAgICBhdl9mcmVlcCgmZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgdmRwYXVfZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncykKLXsKLSAgICBJbnB1dFN0cmVhbSAgICAgICAgICppc3QgPSBzLT5vcGFxdWU7Ci0gICAgVkRQQVVDb250ZXh0ICAgICAgICAqY3R4ID0gaXN0LT5od2FjY2VsX2N0eDsKLSAgICBWZHBWaWRlb1N1cmZhY2UgKnN1cmZhY2U7Ci0gICAgVmRwU3RhdHVzIGVycjsKLSAgICBWZHBDaHJvbWFUeXBlIGNocm9tYTsKLSAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotCi0gICAgYXZfYXNzZXJ0MChmcmFtZS0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfVkRQQVUpOwotCi0gICAgaWYgKGF2X3ZkcGF1X2dldF9zdXJmYWNlX3BhcmFtZXRlcnMocywgJmNocm9tYSwgJndpZHRoLCAmaGVpZ2h0KSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKLQotICAgIHN1cmZhY2UgPSBhdl9tYWxsb2Moc2l6ZW9mKCpzdXJmYWNlKSk7Ci0gICAgaWYgKCFzdXJmYWNlKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZnJhbWUtPmJ1ZlswXSA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QqKXN1cmZhY2UsIHNpemVvZigqc3VyZmFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRwYXVfcmVsZWFzZV9idWZmZXIsIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7Ci0gICAgaWYgKCFmcmFtZS0+YnVmWzBdKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZzdXJmYWNlKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICAvLyBwcm9wZXJseSB3ZSBzaG91bGQga2VlcCBhIHBvb2wgb2Ygc3VyZmFjZXMgaW5zdGVhZCBvZiBjcmVhdGluZwotICAgIC8vIHRoZW0gYW5ldyBmb3IgZWFjaCBmcmFtZSwgYnV0IHNpbmNlIHdlIGRvbid0IGNhcmUgYWJvdXQgc3BlZWQKLSAgICAvLyBtdWNoIGluIHRoaXMgY29kZSwgd2UgZG9uJ3QgYm90aGVyCi0gICAgZXJyID0gY3R4LT52aWRlb19zdXJmYWNlX2NyZWF0ZShjdHgtPmRldmljZSwgY2hyb21hLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZSk7Ci0gICAgaWYgKGVyciAhPSBWRFBfU1RBVFVTX09LKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIGEgVkRQQVUgdmlkZW8gc3VyZmFjZTogJXNcbiIsCi0gICAgICAgICAgICAgICBjdHgtPmdldF9lcnJvcl9zdHJpbmcoZXJyKSk7Ci0gICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPmJ1ZlswXSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Ci0gICAgfQotCi0gICAgZnJhbWUtPmRhdGFbM10gPSAodWludDhfdCopKHVpbnRwdHJfdCkqc3VyZmFjZTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZkcGF1X3JldHJpZXZlX2RhdGEoQVZDb2RlY0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQotewotICAgIFZkcFZpZGVvU3VyZmFjZSBzdXJmYWNlID0gKFZkcFZpZGVvU3VyZmFjZSkodWludHB0cl90KWZyYW1lLT5kYXRhWzNdOwotICAgIElucHV0U3RyZWFtICAgICAgICAqaXN0ID0gcy0+b3BhcXVlOwotICAgIFZEUEFVQ29udGV4dCAgICAgICAqY3R4ID0gaXN0LT5od2FjY2VsX2N0eDsKLSAgICBWZHBTdGF0dXMgZXJyOwotICAgIGludCByZXQsIGNocm9tYV90eXBlOwotCi0gICAgZXJyID0gY3R4LT52aWRlb19zdXJmYWNlX2dldF9wYXJhbWV0ZXJzKHN1cmZhY2UsICZjaHJvbWFfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+dG1wX2ZyYW1lLT53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+dG1wX2ZyYW1lLT5oZWlnaHQpOwotICAgIGlmIChlcnIgIT0gVkRQX1NUQVRVU19PSykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBzdXJmYWNlIHBhcmFtZXRlcnM6ICVzXG4iLAotICAgICAgICAgICAgICAgY3R4LT5nZXRfZXJyb3Jfc3RyaW5nKGVycikpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOwotICAgIH0KLSAgICBjdHgtPnRtcF9mcmFtZS0+Zm9ybWF0ID0gY3R4LT5waXhfZm10OwotCi0gICAgcmV0ID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcihjdHgtPnRtcF9mcmFtZSwgMzIpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgY3R4LT50bXBfZnJhbWUtPndpZHRoICA9IGZyYW1lLT53aWR0aDsKLSAgICBjdHgtPnRtcF9mcmFtZS0+aGVpZ2h0ID0gZnJhbWUtPmhlaWdodDsKLQotICAgIGVyciA9IGN0eC0+dmlkZW9fc3VyZmFjZV9nZXRfYml0cyhzdXJmYWNlLCBjdHgtPnZkcGF1X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiBjb25zdCAqKWN0eC0+dG1wX2ZyYW1lLT5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnRtcF9mcmFtZS0+bGluZXNpemUpOwotICAgIGlmIChlcnIgIT0gVkRQX1NUQVRVU19PSykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcmV0cmlldmluZyBmcmFtZSBkYXRhIGZyb20gVkRQQVU6ICVzXG4iLAotICAgICAgICAgICAgICAgY3R4LT5nZXRfZXJyb3Jfc3RyaW5nKGVycikpOwotICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoY3R4LT52ZHBhdV9mb3JtYXQgPT0gVkRQX1lDQkNSX0ZPUk1BVF9ZVjEyKQotICAgICAgICBGRlNXQVAodWludDhfdCosIGN0eC0+dG1wX2ZyYW1lLT5kYXRhWzFdLCBjdHgtPnRtcF9mcmFtZS0+ZGF0YVsyXSk7Ci0KLSAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKGN0eC0+dG1wX2ZyYW1lLCBmcmFtZSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKLSAgICBhdl9mcmFtZV9tb3ZlX3JlZihmcmFtZSwgY3R4LT50bXBfZnJhbWUpOwotICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIGF2X2ZyYW1lX3VucmVmKGN0eC0+dG1wX2ZyYW1lKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3QgaW50IHZkcGF1X2Zvcm1hdHNbXVsyXSA9IHsKLSAgICB7IFZEUF9ZQ0JDUl9GT1JNQVRfWVYxMiwgQVZfUElYX0ZNVF9ZVVY0MjBQIH0sCi0gICAgeyBWRFBfWUNCQ1JfRk9STUFUX05WMTIsIEFWX1BJWF9GTVRfTlYxMiB9LAotICAgIHsgVkRQX1lDQkNSX0ZPUk1BVF9ZVVlWLCBBVl9QSVhfRk1UX1lVWVY0MjIgfSwKLSAgICB7IFZEUF9ZQ0JDUl9GT1JNQVRfVVlWWSwgQVZfUElYX0ZNVF9VWVZZNDIyIH0sCi19OwotCi1zdGF0aWMgaW50IHZkcGF1X2FsbG9jKEFWQ29kZWNDb250ZXh0ICpzKQotewotICAgIElucHV0U3RyZWFtICAqaXN0ID0gcy0+b3BhcXVlOwotICAgIGludCBsb2dsZXZlbCA9IChpc3QtPmh3YWNjZWxfaWQgPT0gSFdBQ0NFTF9BVVRPKSA/IEFWX0xPR19WRVJCT1NFIDogQVZfTE9HX0VSUk9SOwotICAgIEFWVkRQQVVDb250ZXh0ICp2ZHBhdV9jdHg7Ci0gICAgVkRQQVVDb250ZXh0ICpjdHg7Ci0gICAgY29uc3QgY2hhciAqZGlzcGxheSwgKnZlbmRvcjsKLSAgICBWZHBTdGF0dXMgZXJyOwotICAgIGludCBpOwotCi0gICAgY3R4ID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eCkpOwotICAgIGlmICghY3R4KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgaXN0LT5od2FjY2VsX2N0eCAgICAgICAgICAgPSBjdHg7Ci0gICAgaXN0LT5od2FjY2VsX3VuaW5pdCAgICAgICAgPSB2ZHBhdV91bmluaXQ7Ci0gICAgaXN0LT5od2FjY2VsX2dldF9idWZmZXIgICAgPSB2ZHBhdV9nZXRfYnVmZmVyOwotICAgIGlzdC0+aHdhY2NlbF9yZXRyaWV2ZV9kYXRhID0gdmRwYXVfcmV0cmlldmVfZGF0YTsKLQotICAgIGN0eC0+dG1wX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIWN0eC0+dG1wX2ZyYW1lKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBjdHgtPmRweSA9IFhPcGVuRGlzcGxheShpc3QtPmh3YWNjZWxfZGV2aWNlKTsKLSAgICBpZiAoIWN0eC0+ZHB5KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIkNhbm5vdCBvcGVuIHRoZSBYMTEgZGlzcGxheSAlcy5cbiIsCi0gICAgICAgICAgICAgICBYRGlzcGxheU5hbWUoaXN0LT5od2FjY2VsX2RldmljZSkpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICAgIGRpc3BsYXkgPSBYRGlzcGxheVN0cmluZyhjdHgtPmRweSk7Ci0KLSAgICBlcnIgPSB2ZHBfZGV2aWNlX2NyZWF0ZV94MTEoY3R4LT5kcHksIFhEZWZhdWx0U2NyZWVuKGN0eC0+ZHB5KSwgJmN0eC0+ZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5nZXRfcHJvY19hZGRyZXNzKTsKLSAgICBpZiAoZXJyICE9IFZEUF9TVEFUVVNfT0spIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIGxvZ2xldmVsLCAiVkRQQVUgZGV2aWNlIGNyZWF0aW9uIG9uIFgxMSBkaXNwbGF5ICVzIGZhaWxlZC5cbiIsCi0gICAgICAgICAgICAgICBkaXNwbGF5KTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotI2RlZmluZSBHRVRfQ0FMTEJBQ0soaWQsIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2b2lkICp0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVyciA9IGN0eC0+Z2V0X3Byb2NfYWRkcmVzcyhjdHgtPmRldmljZSwgaWQsICZ0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGVyciAhPSBWRFBfU1RBVFVTX09LKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXZfbG9nKE5VTEwsIGxvZ2xldmVsLCAiRXJyb3IgZ2V0dGluZyB0aGUgIiAjaWQgIiBjYWxsYmFjay5cbiIpOyAgICAgICAgXAotICAgICAgICBnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjdHgtPnJlc3VsdCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotICAgIEdFVF9DQUxMQkFDSyhWRFBfRlVOQ19JRF9HRVRfRVJST1JfU1RSSU5HLCAgICAgICAgICAgICAgIGdldF9lcnJvcl9zdHJpbmcpOwotICAgIEdFVF9DQUxMQkFDSyhWRFBfRlVOQ19JRF9HRVRfSU5GT1JNQVRJT05fU1RSSU5HLCAgICAgICAgIGdldF9pbmZvcm1hdGlvbl9zdHJpbmcpOwotICAgIEdFVF9DQUxMQkFDSyhWRFBfRlVOQ19JRF9ERVZJQ0VfREVTVFJPWSwgICAgICAgICAgICAgICAgIGRldmljZV9kZXN0cm95KTsKLSAgICBpZiAodmRwYXVfYXBpX3ZlciA9PSAxKSB7Ci0gICAgICAgIEdFVF9DQUxMQkFDSyhWRFBfRlVOQ19JRF9ERUNPREVSX0NSRUFURSwgICAgICAgICAgICAgICAgIGRlY29kZXJfY3JlYXRlKTsKLSAgICAgICAgR0VUX0NBTExCQUNLKFZEUF9GVU5DX0lEX0RFQ09ERVJfREVTVFJPWSwgICAgICAgICAgICAgICAgZGVjb2Rlcl9kZXN0cm95KTsKLSAgICAgICAgR0VUX0NBTExCQUNLKFZEUF9GVU5DX0lEX0RFQ09ERVJfUkVOREVSLCAgICAgICAgICAgICAgICAgZGVjb2Rlcl9yZW5kZXIpOwotICAgIH0KLSAgICBHRVRfQ0FMTEJBQ0soVkRQX0ZVTkNfSURfVklERU9fU1VSRkFDRV9DUkVBVEUsICAgICAgICAgICB2aWRlb19zdXJmYWNlX2NyZWF0ZSk7Ci0gICAgR0VUX0NBTExCQUNLKFZEUF9GVU5DX0lEX1ZJREVPX1NVUkZBQ0VfREVTVFJPWSwgICAgICAgICAgdmlkZW9fc3VyZmFjZV9kZXN0cm95KTsKLSAgICBHRVRfQ0FMTEJBQ0soVkRQX0ZVTkNfSURfVklERU9fU1VSRkFDRV9HRVRfQklUU19ZX0NCX0NSLCB2aWRlb19zdXJmYWNlX2dldF9iaXRzKTsKLSAgICBHRVRfQ0FMTEJBQ0soVkRQX0ZVTkNfSURfVklERU9fU1VSRkFDRV9HRVRfUEFSQU1FVEVSUywgICB2aWRlb19zdXJmYWNlX2dldF9wYXJhbWV0ZXJzKTsKLSAgICBHRVRfQ0FMTEJBQ0soVkRQX0ZVTkNfSURfVklERU9fU1VSRkFDRV9RVUVSWV9HRVRfUFVUX0JJVFNfWV9DQl9DUl9DQVBBQklMSVRJRVMsCi0gICAgICAgICAgICAgICAgIHZpZGVvX3N1cmZhY2VfcXVlcnkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHZkcGF1X2Zvcm1hdHMpOyBpKyspIHsKLSAgICAgICAgVmRwQm9vbCBzdXBwb3J0ZWQ7Ci0gICAgICAgIGVyciA9IGN0eC0+dmlkZW9fc3VyZmFjZV9xdWVyeShjdHgtPmRldmljZSwgVkRQX0NIUk9NQV9UWVBFXzQyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkcGF1X2Zvcm1hdHNbaV1bMF0sICZzdXBwb3J0ZWQpOwotICAgICAgICBpZiAoZXJyICE9IFZEUF9TVEFUVVNfT0spIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAiRXJyb3IgcXVlcnlpbmcgVkRQQVUgc3VyZmFjZSBjYXBhYmlsaXRpZXM6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgIGN0eC0+Z2V0X2Vycm9yX3N0cmluZyhlcnIpKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3VwcG9ydGVkKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChpID09IEZGX0FSUkFZX0VMRU1TKHZkcGF1X2Zvcm1hdHMpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwKLSAgICAgICAgICAgICAgICJObyBzdXBwb3J0ZWQgVkRQQVUgZm9ybWF0IGZvciByZXRyaWV2aW5nIHRoZSBkYXRhLlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIGN0eC0+dmRwYXVfZm9ybWF0ID0gdmRwYXVfZm9ybWF0c1tpXVswXTsKLSAgICBjdHgtPnBpeF9mbXQgICAgICA9IHZkcGF1X2Zvcm1hdHNbaV1bMV07Ci0KLSAgICBpZiAodmRwYXVfYXBpX3ZlciA9PSAxKSB7Ci0gICAgICAgIHZkcGF1X2N0eCA9IGF2X3ZkcGF1X2FsbG9jX2NvbnRleHQoKTsKLSAgICAgICAgaWYgKCF2ZHBhdV9jdHgpCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIHZkcGF1X2N0eC0+cmVuZGVyID0gY3R4LT5kZWNvZGVyX3JlbmRlcjsKLQotICAgICAgICBzLT5od2FjY2VsX2NvbnRleHQgPSB2ZHBhdV9jdHg7Ci0gICAgfSBlbHNlCi0gICAgaWYgKGF2X3ZkcGF1X2JpbmRfY29udGV4dChzLCBjdHgtPmRldmljZSwgY3R4LT5nZXRfcHJvY19hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSFdBQ0NFTF9GTEFHX0lHTk9SRV9MRVZFTCkpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGN0eC0+Z2V0X2luZm9ybWF0aW9uX3N0cmluZygmdmVuZG9yKTsKLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJVc2luZyBWRFBBVSAtLSAlcyAtLSBvbiBYMTEgZGlzcGxheSAlcywgIgotICAgICAgICAgICAidG8gZGVjb2RlIGlucHV0IHN0cmVhbSAjJWQ6JWQuXG4iLCB2ZW5kb3IsCi0gICAgICAgICAgIGRpc3BsYXksIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgpOwotCi0gICAgcmV0dXJuIDA7Ci0KLWZhaWw6Ci0gICAgYXZfbG9nKE5VTEwsIGxvZ2xldmVsLCAiVkRQQVUgaW5pdCBmYWlsZWQgZm9yIHN0cmVhbSAjJWQ6JWQuXG4iLAotICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4KTsKLSAgICB2ZHBhdV91bmluaXQocyk7Ci0gICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLX0KLQotc3RhdGljIGludCB2ZHBhdV9vbGRfaW5pdChBVkNvZGVjQ29udGV4dCAqcykKLXsKLSAgICBJbnB1dFN0cmVhbSAqaXN0ID0gcy0+b3BhcXVlOwotICAgIGludCBsb2dsZXZlbCA9IChpc3QtPmh3YWNjZWxfaWQgPT0gSFdBQ0NFTF9BVVRPKSA/IEFWX0xPR19WRVJCT1NFIDogQVZfTE9HX0VSUk9SOwotICAgIEFWVkRQQVVDb250ZXh0ICp2ZHBhdV9jdHg7Ci0gICAgVkRQQVVDb250ZXh0ICpjdHg7Ci0gICAgVmRwU3RhdHVzIGVycjsKLSAgICBpbnQgcHJvZmlsZSwgcmV0OwotCi0gICAgaWYgKCFpc3QtPmh3YWNjZWxfY3R4KSB7Ci0gICAgICAgIHJldCA9IHZkcGF1X2FsbG9jKHMpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGN0eCAgICAgICA9IGlzdC0+aHdhY2NlbF9jdHg7Ci0gICAgdmRwYXVfY3R4ID0gcy0+aHdhY2NlbF9jb250ZXh0OwotCi0gICAgcmV0ID0gYXZfdmRwYXVfZ2V0X3Byb2ZpbGUocywgJnByb2ZpbGUpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIk5vIGtub3duIFZEUEFVIGRlY29kZXIgcHJvZmlsZSBmb3IgdGhpcyBzdHJlYW0uXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICBpZiAoY3R4LT5kZWNvZGVyKQotICAgICAgICBjdHgtPmRlY29kZXJfZGVzdHJveShjdHgtPmRlY29kZXIpOwotCi0gICAgZXJyID0gY3R4LT5kZWNvZGVyX2NyZWF0ZShjdHgtPmRldmljZSwgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvZGVkX3dpZHRoLCBzLT5jb2RlZF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgJmN0eC0+ZGVjb2Rlcik7Ci0gICAgaWYgKGVyciAhPSBWRFBfU1RBVFVTX09LKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBsb2dsZXZlbCwgIkVycm9yIGNyZWF0aW5nIHRoZSBWRFBBVSBkZWNvZGVyOiAlc1xuIiwKLSAgICAgICAgICAgICAgIGN0eC0+Z2V0X2Vycm9yX3N0cmluZyhlcnIpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKLSAgICB9Ci0KLSAgICB2ZHBhdV9jdHgtPmRlY29kZXIgPSBjdHgtPmRlY29kZXI7Ci0KLSAgICBpc3QtPmh3YWNjZWxfZ2V0X2J1ZmZlciAgICA9IHZkcGF1X2dldF9idWZmZXI7Ci0gICAgaXN0LT5od2FjY2VsX3JldHJpZXZlX2RhdGEgPSB2ZHBhdV9yZXRyaWV2ZV9kYXRhOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCB2ZHBhdV9pbml0KEFWQ29kZWNDb250ZXh0ICpzKQotewotICAgIElucHV0U3RyZWFtICppc3QgPSBzLT5vcGFxdWU7Ci0KLSAgICBpZiAodmRwYXVfYXBpX3ZlciA9PSAxKQotICAgICAgICByZXR1cm4gdmRwYXVfb2xkX2luaXQocyk7Ci0KLSAgICBpZiAoIWlzdC0+aHdhY2NlbF9jdHgpIHsKLSAgICAgICAgaW50IHJldCA9IHZkcGF1X2FsbG9jKHMpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgaXN0LT5od2FjY2VsX2dldF9idWZmZXIgICAgPSB2ZHBhdV9nZXRfYnVmZmVyOwotICAgIGlzdC0+aHdhY2NlbF9yZXRyaWV2ZV9kYXRhID0gdmRwYXVfcmV0cmlldmVfZGF0YTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZmZtcGVnX3ZpZGVvdG9vbGJveC5jIGIvZmZtcGVnX3ZpZGVvdG9vbGJveC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDRhMmEwLi4wMDAwMDAwCi0tLSBhL2ZmbXBlZ192aWRlb3Rvb2xib3guYworKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmIEhBVkVfVVRHRVRPU1RZUEVGUk9NU1RSSU5HCi0jaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKLSNpZiBDT05GSUdfVkRBCi0jICBpbmNsdWRlICJsaWJhdmNvZGVjL3ZkYS5oIgotI2VuZGlmCi0jaWYgQ09ORklHX1ZJREVPVE9PTEJPWAotIyAgaW5jbHVkZSAibGliYXZjb2RlYy92aWRlb3Rvb2xib3guaCIKLSNlbmRpZgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotI2luY2x1ZGUgImZmbXBlZy5oIgotCi10eXBlZGVmIHN0cnVjdCBWVENvbnRleHQgewotICAgIEFWRnJhbWUgKnRtcF9mcmFtZTsKLX0gVlRDb250ZXh0OwotCi1jaGFyICp2aWRlb3Rvb2xib3hfcGl4Zm10OwotCi1zdGF0aWMgaW50IHZpZGVvdG9vbGJveF9yZXRyaWV2ZV9kYXRhKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKLXsKLSAgICBJbnB1dFN0cmVhbSAqaXN0ID0gcy0+b3BhcXVlOwotICAgIFZUQ29udGV4dCAgKnZ0ID0gaXN0LT5od2FjY2VsX2N0eDsKLSAgICBDVlBpeGVsQnVmZmVyUmVmIHBpeGJ1ZiA9IChDVlBpeGVsQnVmZmVyUmVmKWZyYW1lLT5kYXRhWzNdOwotICAgIE9TVHlwZSBwaXhlbF9mb3JtYXQgPSBDVlBpeGVsQnVmZmVyR2V0UGl4ZWxGb3JtYXRUeXBlKHBpeGJ1Zik7Ci0gICAgQ1ZSZXR1cm4gZXJyOwotICAgIHVpbnQ4X3QgKmRhdGFbNF0gPSB7IDAgfTsKLSAgICBpbnQgbGluZXNpemVbNF0gPSB7IDAgfTsKLSAgICBpbnQgcGxhbmVzLCByZXQsIGk7Ci0gICAgY2hhciBjb2RlY19zdHJbMzJdOwotCi0gICAgYXZfZnJhbWVfdW5yZWYodnQtPnRtcF9mcmFtZSk7Ci0KLSAgICBzd2l0Y2ggKHBpeGVsX2Zvcm1hdCkgewotICAgIGNhc2Uga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMFlwQ2JDcjhQbGFuYXI6IHZ0LT50bXBfZnJhbWUtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsgYnJlYWs7Ci0gICAgY2FzZSBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIyWXBDYkNyODogICAgICAgdnQtPnRtcF9mcmFtZS0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9VWVZZNDIyOyBicmVhazsKLSAgICBjYXNlIGtDVlBpeGVsRm9ybWF0VHlwZV8zMkJHUkE6ICAgICAgICAgICB2dC0+dG1wX2ZyYW1lLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0JHUkE7IGJyZWFrOwotI2lmZGVmIGtDRkNvcmVGb3VuZGF0aW9uVmVyc2lvbk51bWJlcjEwXzcKLSAgICBjYXNlIGtDVlBpeGVsRm9ybWF0VHlwZV80MjBZcENiQ3I4QmlQbGFuYXJWaWRlb1JhbmdlOiB2dC0+dG1wX2ZyYW1lLT5mb3JtYXQgPSBBVl9QSVhfRk1UX05WMTI7IGJyZWFrOwotI2VuZGlmCi0gICAgZGVmYXVsdDoKLSAgICAgICAgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcoY29kZWNfc3RyLCBzaXplb2YoY29kZWNfc3RyKSwgcy0+Y29kZWNfdGFnKTsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICIlczogVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0OiAlc1xuIiwgY29kZWNfc3RyLCB2aWRlb3Rvb2xib3hfcGl4Zm10KTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKLSAgICB9Ci0KLSAgICB2dC0+dG1wX2ZyYW1lLT53aWR0aCAgPSBmcmFtZS0+d2lkdGg7Ci0gICAgdnQtPnRtcF9mcmFtZS0+aGVpZ2h0ID0gZnJhbWUtPmhlaWdodDsKLSAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKHZ0LT50bXBfZnJhbWUsIDMyKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGVyciA9IENWUGl4ZWxCdWZmZXJMb2NrQmFzZUFkZHJlc3MocGl4YnVmLCBrQ1ZQaXhlbEJ1ZmZlckxvY2tfUmVhZE9ubHkpOwotICAgIGlmIChlcnIgIT0ga0NWUmV0dXJuU3VjY2VzcykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgbG9ja2luZyB0aGUgcGl4ZWwgYnVmZmVyLlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Ci0gICAgfQotCi0gICAgaWYgKENWUGl4ZWxCdWZmZXJJc1BsYW5hcihwaXhidWYpKSB7Ci0KLSAgICAgICAgcGxhbmVzID0gQ1ZQaXhlbEJ1ZmZlckdldFBsYW5lQ291bnQocGl4YnVmKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lczsgaSsrKSB7Ci0gICAgICAgICAgICBkYXRhW2ldICAgICA9IENWUGl4ZWxCdWZmZXJHZXRCYXNlQWRkcmVzc09mUGxhbmUocGl4YnVmLCBpKTsKLSAgICAgICAgICAgIGxpbmVzaXplW2ldID0gQ1ZQaXhlbEJ1ZmZlckdldEJ5dGVzUGVyUm93T2ZQbGFuZShwaXhidWYsIGkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZGF0YVswXSA9IENWUGl4ZWxCdWZmZXJHZXRCYXNlQWRkcmVzcyhwaXhidWYpOwotICAgICAgICBsaW5lc2l6ZVswXSA9IENWUGl4ZWxCdWZmZXJHZXRCeXRlc1BlclJvdyhwaXhidWYpOwotICAgIH0KLQotICAgIGF2X2ltYWdlX2NvcHkodnQtPnRtcF9mcmFtZS0+ZGF0YSwgdnQtPnRtcF9mcmFtZS0+bGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKilkYXRhLCBsaW5lc2l6ZSwgdnQtPnRtcF9mcmFtZS0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0KTsKLQotICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHModnQtPnRtcF9mcmFtZSwgZnJhbWUpOwotICAgIENWUGl4ZWxCdWZmZXJVbmxvY2tCYXNlQWRkcmVzcyhwaXhidWYsIGtDVlBpeGVsQnVmZmVyTG9ja19SZWFkT25seSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7Ci0gICAgYXZfZnJhbWVfbW92ZV9yZWYoZnJhbWUsIHZ0LT50bXBfZnJhbWUpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpZGVvdG9vbGJveF91bmluaXQoQVZDb2RlY0NvbnRleHQgKnMpCi17Ci0gICAgSW5wdXRTdHJlYW0gKmlzdCA9IHMtPm9wYXF1ZTsKLSAgICBWVENvbnRleHQgICp2dCA9IGlzdC0+aHdhY2NlbF9jdHg7Ci0KLSAgICBpc3QtPmh3YWNjZWxfdW5pbml0ICAgICAgICA9IE5VTEw7Ci0gICAgaXN0LT5od2FjY2VsX3JldHJpZXZlX2RhdGEgPSBOVUxMOwotCi0gICAgYXZfZnJhbWVfZnJlZSgmdnQtPnRtcF9mcmFtZSk7Ci0KLSAgICBpZiAoaXN0LT5od2FjY2VsX2lkID09IEhXQUNDRUxfVklERU9UT09MQk9YKSB7Ci0jaWYgQ09ORklHX1ZJREVPVE9PTEJPWAotICAgICAgICBhdl92aWRlb3Rvb2xib3hfZGVmYXVsdF9mcmVlKHMpOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSNpZiBDT05GSUdfVkRBCi0gICAgICAgIGF2X3ZkYV9kZWZhdWx0X2ZyZWUocyk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgYXZfZnJlZXAoJmlzdC0+aHdhY2NlbF9jdHgpOwotfQotCi1pbnQgdmlkZW90b29sYm94X2luaXQoQVZDb2RlY0NvbnRleHQgKnMpCi17Ci0gICAgSW5wdXRTdHJlYW0gKmlzdCA9IHMtPm9wYXF1ZTsKLSAgICBpbnQgbG9nbGV2ZWwgPSAoaXN0LT5od2FjY2VsX2lkID09IEhXQUNDRUxfQVVUTykgPyBBVl9MT0dfVkVSQk9TRSA6IEFWX0xPR19FUlJPUjsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBWVENvbnRleHQgKnZ0OwotCi0gICAgdnQgPSBhdl9tYWxsb2N6KHNpemVvZigqdnQpKTsKLSAgICBpZiAoIXZ0KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgaXN0LT5od2FjY2VsX2N0eCAgICAgICAgICAgPSB2dDsKLSAgICBpc3QtPmh3YWNjZWxfdW5pbml0ICAgICAgICA9IHZpZGVvdG9vbGJveF91bmluaXQ7Ci0gICAgaXN0LT5od2FjY2VsX3JldHJpZXZlX2RhdGEgPSB2aWRlb3Rvb2xib3hfcmV0cmlldmVfZGF0YTsKLQotICAgIHZ0LT50bXBfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGlmICghdnQtPnRtcF9mcmFtZSkgewotICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoaXN0LT5od2FjY2VsX2lkID09IEhXQUNDRUxfVklERU9UT09MQk9YKSB7Ci0jaWYgQ09ORklHX1ZJREVPVE9PTEJPWAotICAgICAgICBpZiAoIXZpZGVvdG9vbGJveF9waXhmbXQpIHsKLSAgICAgICAgICAgIHJldCA9IGF2X3ZpZGVvdG9vbGJveF9kZWZhdWx0X2luaXQocyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBVlZpZGVvdG9vbGJveENvbnRleHQgKnZ0Y3R4ID0gYXZfdmlkZW90b29sYm94X2FsbG9jX2NvbnRleHQoKTsKLSAgICAgICAgICAgIENGU3RyaW5nUmVmIHBpeGZtdF9zdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKGtDRkFsbG9jYXRvckRlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3Rvb2xib3hfcGl4Zm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKLSNpZiBIQVZFX1VUR0VUT1NUWVBFRlJPTVNUUklORwotICAgICAgICAgICAgdnRjdHgtPmN2X3BpeF9mbXRfdHlwZSA9IFVUR2V0T1NUeXBlRnJvbVN0cmluZyhwaXhmbXRfc3RyKTsKLSNlbHNlCi0gICAgICAgICAgICBhdl9sb2cocywgbG9nbGV2ZWwsICJVVEdldE9TVHlwZUZyb21TdHJpbmcoKSBpcyBub3QgYXZhaWxhYmxlICIKLSAgICAgICAgICAgICAgICAgICAib24gdGhpcyBwbGF0Zm9ybSwgJXMgcGl4ZWwgZm9ybWF0IGNhbiBub3QgYmUgaG9ub3JlZCBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAidGhlIGNvbW1hbmQgbGluZVxuIiwgdmlkZW90b29sYm94X3BpeGZtdCk7Ci0jZW5kaWYKLSAgICAgICAgICAgIHJldCA9IGF2X3ZpZGVvdG9vbGJveF9kZWZhdWx0X2luaXQyKHMsIHZ0Y3R4KTsKLSAgICAgICAgICAgIENGUmVsZWFzZShwaXhmbXRfc3RyKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSNpZiBDT05GSUdfVkRBCi0gICAgICAgIGlmICghdmlkZW90b29sYm94X3BpeGZtdCkgewotICAgICAgICAgICAgcmV0ID0gYXZfdmRhX2RlZmF1bHRfaW5pdChzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFWVkRBQ29udGV4dCAqdmRhY3R4ID0gYXZfdmRhX2FsbG9jX2NvbnRleHQoKTsKLSAgICAgICAgICAgIENGU3RyaW5nUmVmIHBpeGZtdF9zdHIgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKGtDRkFsbG9jYXRvckRlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3Rvb2xib3hfcGl4Zm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKLSNpZiBIQVZFX1VUR0VUT1NUWVBFRlJPTVNUUklORwotICAgICAgICAgICAgdmRhY3R4LT5jdl9waXhfZm10X3R5cGUgPSBVVEdldE9TVHlwZUZyb21TdHJpbmcocGl4Zm10X3N0cik7Ci0jZWxzZQotICAgICAgICAgICAgYXZfbG9nKHMsIGxvZ2xldmVsLCAiVVRHZXRPU1R5cGVGcm9tU3RyaW5nKCkgaXMgbm90IGF2YWlsYWJsZSAiCi0gICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0sICVzIHBpeGVsIGZvcm1hdCBjYW4gbm90IGJlIGhvbm9yZWQgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgInRoZSBjb21tYW5kIGxpbmVcbiIsIHZpZGVvdG9vbGJveF9waXhmbXQpOwotI2VuZGlmCi0gICAgICAgICAgICByZXQgPSBhdl92ZGFfZGVmYXVsdF9pbml0MihzLCB2ZGFjdHgpOwotICAgICAgICAgICAgQ0ZSZWxlYXNlKHBpeGZtdF9zdHIpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIGxvZ2xldmVsLAotICAgICAgICAgICAgICAgIkVycm9yIGNyZWF0aW5nICVzIGRlY29kZXIuXG4iLCBpc3QtPmh3YWNjZWxfaWQgPT0gSFdBQ0NFTF9WSURFT1RPT0xCT1ggPyAiVmlkZW90b29sYm94IiA6ICJWREEiKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIHJldHVybiAwOwotZmFpbDoKLSAgICB2aWRlb3Rvb2xib3hfdW5pbml0KHMpOwotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9mZnBsYXkuYyBiL2ZmcGxheS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2ZkZjI2Li4wMDAwMDAwCi0tLSBhL2ZmcGxheS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSAqIEBmaWxlCi0gKiBzaW1wbGUgbWVkaWEgcGxheWVyIGJhc2VkIG9uIHRoZSBGRm1wZWcgbGlicmFyaWVzCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHNpZ25hbC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgotI2luY2x1ZGUgImxpYmF2ZGV2aWNlL2F2ZGV2aWNlLmgiCi0jaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZmZnQuaCIKLSNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaCIKLQotI2lmIENPTkZJR19BVkZJTFRFUgotIyBpbmNsdWRlICJsaWJhdmZpbHRlci9hdmZpbHRlci5oIgotIyBpbmNsdWRlICJsaWJhdmZpbHRlci9idWZmZXJzaW5rLmgiCi0jIGluY2x1ZGUgImxpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oIgotI2VuZGlmCi0KLSNpbmNsdWRlIDxTREwuaD4KLSNpbmNsdWRlIDxTRExfdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJjbWR1dGlscy5oIgotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLWNvbnN0IGNoYXIgcHJvZ3JhbV9uYW1lW10gPSAiZmZwbGF5IjsKLWNvbnN0IGludCBwcm9ncmFtX2JpcnRoX3llYXIgPSAyMDAzOwotCi0jZGVmaW5lIE1BWF9RVUVVRV9TSVpFICgxNSAqIDEwMjQgKiAxMDI0KQotI2RlZmluZSBNSU5fRlJBTUVTIDI1Ci0jZGVmaW5lIEVYVEVSTkFMX0NMT0NLX01JTl9GUkFNRVMgMgotI2RlZmluZSBFWFRFUk5BTF9DTE9DS19NQVhfRlJBTUVTIDEwCi0KLS8qIE1pbmltdW0gU0RMIGF1ZGlvIGJ1ZmZlciBzaXplLCBpbiBzYW1wbGVzLiAqLwotI2RlZmluZSBTRExfQVVESU9fTUlOX0JVRkZFUl9TSVpFIDUxMgotLyogQ2FsY3VsYXRlIGFjdHVhbCBidWZmZXIgc2l6ZSBrZWVwaW5nIGluIG1pbmQgbm90IGNhdXNlIHRvbyBmcmVxdWVudCBhdWRpbyBjYWxsYmFja3MgKi8KLSNkZWZpbmUgU0RMX0FVRElPX01BWF9DQUxMQkFDS1NfUEVSX1NFQyAzMAotCi0vKiBTdGVwIHNpemUgZm9yIHZvbHVtZSBjb250cm9sICovCi0jZGVmaW5lIFNETF9WT0xVTUVfU1RFUCAoU0RMX01JWF9NQVhWT0xVTUUgLyA1MCkKLQotLyogbm8gQVYgc3luYyBjb3JyZWN0aW9uIGlzIGRvbmUgaWYgYmVsb3cgdGhlIG1pbmltdW0gQVYgc3luYyB0aHJlc2hvbGQgKi8KLSNkZWZpbmUgQVZfU1lOQ19USFJFU0hPTERfTUlOIDAuMDQKLS8qIEFWIHN5bmMgY29ycmVjdGlvbiBpcyBkb25lIGlmIGFib3ZlIHRoZSBtYXhpbXVtIEFWIHN5bmMgdGhyZXNob2xkICovCi0jZGVmaW5lIEFWX1NZTkNfVEhSRVNIT0xEX01BWCAwLjEKLS8qIElmIGEgZnJhbWUgZHVyYXRpb24gaXMgbG9uZ2VyIHRoYW4gdGhpcywgaXQgd2lsbCBub3QgYmUgZHVwbGljYXRlZCB0byBjb21wZW5zYXRlIEFWIHN5bmMgKi8KLSNkZWZpbmUgQVZfU1lOQ19GUkFNRURVUF9USFJFU0hPTEQgMC4xCi0vKiBubyBBViBjb3JyZWN0aW9uIGlzIGRvbmUgaWYgdG9vIGJpZyBlcnJvciAqLwotI2RlZmluZSBBVl9OT1NZTkNfVEhSRVNIT0xEIDEwLjAKLQotLyogbWF4aW11bSBhdWRpbyBzcGVlZCBjaGFuZ2UgdG8gZ2V0IGNvcnJlY3Qgc3luYyAqLwotI2RlZmluZSBTQU1QTEVfQ09SUkVDVElPTl9QRVJDRU5UX01BWCAxMAotCi0vKiBleHRlcm5hbCBjbG9jayBzcGVlZCBhZGp1c3RtZW50IGNvbnN0YW50cyBmb3IgcmVhbHRpbWUgc291cmNlcyBiYXNlZCBvbiBidWZmZXIgZnVsbG5lc3MgKi8KLSNkZWZpbmUgRVhURVJOQUxfQ0xPQ0tfU1BFRURfTUlOICAwLjkwMAotI2RlZmluZSBFWFRFUk5BTF9DTE9DS19TUEVFRF9NQVggIDEuMDEwCi0jZGVmaW5lIEVYVEVSTkFMX0NMT0NLX1NQRUVEX1NURVAgMC4wMDEKLQotLyogd2UgdXNlIGFib3V0IEFVRElPX0RJRkZfQVZHX05CIEEtViBkaWZmZXJlbmNlcyB0byBtYWtlIHRoZSBhdmVyYWdlICovCi0jZGVmaW5lIEFVRElPX0RJRkZfQVZHX05CICAgMjAKLQotLyogcG9sbHMgZm9yIHBvc3NpYmxlIHJlcXVpcmVkIHNjcmVlbiByZWZyZXNoIGF0IGxlYXN0IHRoaXMgb2Z0ZW4sIHNob3VsZCBiZSBsZXNzIHRoYW4gMS9mcHMgKi8KLSNkZWZpbmUgUkVGUkVTSF9SQVRFIDAuMDEKLQotLyogTk9URTogdGhlIHNpemUgbXVzdCBiZSBiaWcgZW5vdWdoIHRvIGNvbXBlbnNhdGUgdGhlIGhhcmR3YXJlIGF1ZGlvIGJ1ZmZlcnNpemUgc2l6ZSAqLwotLyogVE9ETzogV2UgYXNzdW1lIHRoYXQgYSBkZWNvZGVkIGFuZCByZXNhbXBsZWQgZnJhbWUgZml0cyBpbnRvIHRoaXMgYnVmZmVyICovCi0jZGVmaW5lIFNBTVBMRV9BUlJBWV9TSVpFICg4ICogNjU1MzYpCi0KLSNkZWZpbmUgQ1VSU09SX0hJREVfREVMQVkgMTAwMDAwMAotCi1zdGF0aWMgdW5zaWduZWQgc3dzX2ZsYWdzID0gU1dTX0JJQ1VCSUM7Ci0KLXR5cGVkZWYgc3RydWN0IE15QVZQYWNrZXRMaXN0IHsKLSAgICBBVlBhY2tldCBwa3Q7Ci0gICAgc3RydWN0IE15QVZQYWNrZXRMaXN0ICpuZXh0OwotICAgIGludCBzZXJpYWw7Ci19IE15QVZQYWNrZXRMaXN0OwotCi10eXBlZGVmIHN0cnVjdCBQYWNrZXRRdWV1ZSB7Ci0gICAgTXlBVlBhY2tldExpc3QgKmZpcnN0X3BrdCwgKmxhc3RfcGt0OwotICAgIGludCBuYl9wYWNrZXRzOwotICAgIGludCBzaXplOwotICAgIGludCBhYm9ydF9yZXF1ZXN0OwotICAgIGludCBzZXJpYWw7Ci0gICAgU0RMX211dGV4ICptdXRleDsKLSAgICBTRExfY29uZCAqY29uZDsKLX0gUGFja2V0UXVldWU7Ci0KLSNkZWZpbmUgVklERU9fUElDVFVSRV9RVUVVRV9TSVpFIDMKLSNkZWZpbmUgU1VCUElDVFVSRV9RVUVVRV9TSVpFIDE2Ci0jZGVmaW5lIFNBTVBMRV9RVUVVRV9TSVpFIDkKLSNkZWZpbmUgRlJBTUVfUVVFVUVfU0laRSBGRk1BWChTQU1QTEVfUVVFVUVfU0laRSwgRkZNQVgoVklERU9fUElDVFVSRV9RVUVVRV9TSVpFLCBTVUJQSUNUVVJFX1FVRVVFX1NJWkUpKQotCi10eXBlZGVmIHN0cnVjdCBBdWRpb1BhcmFtcyB7Ci0gICAgaW50IGZyZXE7Ci0gICAgaW50IGNoYW5uZWxzOwotICAgIGludDY0X3QgY2hhbm5lbF9sYXlvdXQ7Ci0gICAgZW51bSBBVlNhbXBsZUZvcm1hdCBmbXQ7Ci0gICAgaW50IGZyYW1lX3NpemU7Ci0gICAgaW50IGJ5dGVzX3Blcl9zZWM7Ci19IEF1ZGlvUGFyYW1zOwotCi10eXBlZGVmIHN0cnVjdCBDbG9jayB7Ci0gICAgZG91YmxlIHB0czsgICAgICAgICAgIC8qIGNsb2NrIGJhc2UgKi8KLSAgICBkb3VibGUgcHRzX2RyaWZ0OyAgICAgLyogY2xvY2sgYmFzZSBtaW51cyB0aW1lIGF0IHdoaWNoIHdlIHVwZGF0ZWQgdGhlIGNsb2NrICovCi0gICAgZG91YmxlIGxhc3RfdXBkYXRlZDsKLSAgICBkb3VibGUgc3BlZWQ7Ci0gICAgaW50IHNlcmlhbDsgICAgICAgICAgIC8qIGNsb2NrIGlzIGJhc2VkIG9uIGEgcGFja2V0IHdpdGggdGhpcyBzZXJpYWwgKi8KLSAgICBpbnQgcGF1c2VkOwotICAgIGludCAqcXVldWVfc2VyaWFsOyAgICAvKiBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHBhY2tldCBxdWV1ZSBzZXJpYWwsIHVzZWQgZm9yIG9ic29sZXRlIGNsb2NrIGRldGVjdGlvbiAqLwotfSBDbG9jazsKLQotLyogQ29tbW9uIHN0cnVjdCBmb3IgaGFuZGxpbmcgYWxsIHR5cGVzIG9mIGRlY29kZWQgZGF0YSBhbmQgYWxsb2NhdGVkIHJlbmRlciBidWZmZXJzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgRnJhbWUgewotICAgIEFWRnJhbWUgKmZyYW1lOwotICAgIEFWU3VidGl0bGUgc3ViOwotICAgIEFWU3VidGl0bGVSZWN0ICoqc3VicmVjdHM7ICAvKiByZXNjYWxlZCBzdWJ0aXRsZSByZWN0YW5nbGVzIGluIHl1dmEgKi8KLSAgICBpbnQgc2VyaWFsOwotICAgIGRvdWJsZSBwdHM7ICAgICAgICAgICAvKiBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZvciB0aGUgZnJhbWUgKi8KLSAgICBkb3VibGUgZHVyYXRpb247ICAgICAgLyogZXN0aW1hdGVkIGR1cmF0aW9uIG9mIHRoZSBmcmFtZSAqLwotICAgIGludDY0X3QgcG9zOyAgICAgICAgICAvKiBieXRlIHBvc2l0aW9uIG9mIHRoZSBmcmFtZSBpbiB0aGUgaW5wdXQgZmlsZSAqLwotICAgIFNETF9PdmVybGF5ICpibXA7Ci0gICAgaW50IGFsbG9jYXRlZDsKLSAgICBpbnQgcmVhbGxvY2F0ZTsKLSAgICBpbnQgd2lkdGg7Ci0gICAgaW50IGhlaWdodDsKLSAgICBBVlJhdGlvbmFsIHNhcjsKLX0gRnJhbWU7Ci0KLXR5cGVkZWYgc3RydWN0IEZyYW1lUXVldWUgewotICAgIEZyYW1lIHF1ZXVlW0ZSQU1FX1FVRVVFX1NJWkVdOwotICAgIGludCByaW5kZXg7Ci0gICAgaW50IHdpbmRleDsKLSAgICBpbnQgc2l6ZTsKLSAgICBpbnQgbWF4X3NpemU7Ci0gICAgaW50IGtlZXBfbGFzdDsKLSAgICBpbnQgcmluZGV4X3Nob3duOwotICAgIFNETF9tdXRleCAqbXV0ZXg7Ci0gICAgU0RMX2NvbmQgKmNvbmQ7Ci0gICAgUGFja2V0UXVldWUgKnBrdHE7Ci19IEZyYW1lUXVldWU7Ci0KLWVudW0gewotICAgIEFWX1NZTkNfQVVESU9fTUFTVEVSLCAvKiBkZWZhdWx0IGNob2ljZSAqLwotICAgIEFWX1NZTkNfVklERU9fTUFTVEVSLAotICAgIEFWX1NZTkNfRVhURVJOQUxfQ0xPQ0ssIC8qIHN5bmNocm9uaXplIHRvIGFuIGV4dGVybmFsIGNsb2NrICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBEZWNvZGVyIHsKLSAgICBBVlBhY2tldCBwa3Q7Ci0gICAgQVZQYWNrZXQgcGt0X3RlbXA7Ci0gICAgUGFja2V0UXVldWUgKnF1ZXVlOwotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKLSAgICBpbnQgcGt0X3NlcmlhbDsKLSAgICBpbnQgZmluaXNoZWQ7Ci0gICAgaW50IHBhY2tldF9wZW5kaW5nOwotICAgIFNETF9jb25kICplbXB0eV9xdWV1ZV9jb25kOwotICAgIGludDY0X3Qgc3RhcnRfcHRzOwotICAgIEFWUmF0aW9uYWwgc3RhcnRfcHRzX3RiOwotICAgIGludDY0X3QgbmV4dF9wdHM7Ci0gICAgQVZSYXRpb25hbCBuZXh0X3B0c190YjsKLSAgICBTRExfVGhyZWFkICpkZWNvZGVyX3RpZDsKLX0gRGVjb2RlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgVmlkZW9TdGF0ZSB7Ci0gICAgU0RMX1RocmVhZCAqcmVhZF90aWQ7Ci0gICAgQVZJbnB1dEZvcm1hdCAqaWZvcm1hdDsKLSAgICBpbnQgYWJvcnRfcmVxdWVzdDsKLSAgICBpbnQgZm9yY2VfcmVmcmVzaDsKLSAgICBpbnQgcGF1c2VkOwotICAgIGludCBsYXN0X3BhdXNlZDsKLSAgICBpbnQgcXVldWVfYXR0YWNobWVudHNfcmVxOwotICAgIGludCBzZWVrX3JlcTsKLSAgICBpbnQgc2Vla19mbGFnczsKLSAgICBpbnQ2NF90IHNlZWtfcG9zOwotICAgIGludDY0X3Qgc2Vla19yZWw7Ci0gICAgaW50IHJlYWRfcGF1c2VfcmV0dXJuOwotICAgIEFWRm9ybWF0Q29udGV4dCAqaWM7Ci0gICAgaW50IHJlYWx0aW1lOwotCi0gICAgQ2xvY2sgYXVkY2xrOwotICAgIENsb2NrIHZpZGNsazsKLSAgICBDbG9jayBleHRjbGs7Ci0KLSAgICBGcmFtZVF1ZXVlIHBpY3RxOwotICAgIEZyYW1lUXVldWUgc3VicHE7Ci0gICAgRnJhbWVRdWV1ZSBzYW1wcTsKLQotICAgIERlY29kZXIgYXVkZGVjOwotICAgIERlY29kZXIgdmlkZGVjOwotICAgIERlY29kZXIgc3ViZGVjOwotCi0gICAgaW50IHZpZGRlY193aWR0aDsKLSAgICBpbnQgdmlkZGVjX2hlaWdodDsKLQotICAgIGludCBhdWRpb19zdHJlYW07Ci0KLSAgICBpbnQgYXZfc3luY190eXBlOwotCi0gICAgZG91YmxlIGF1ZGlvX2Nsb2NrOwotICAgIGludCBhdWRpb19jbG9ja19zZXJpYWw7Ci0gICAgZG91YmxlIGF1ZGlvX2RpZmZfY3VtOyAvKiB1c2VkIGZvciBBViBkaWZmZXJlbmNlIGF2ZXJhZ2UgY29tcHV0YXRpb24gKi8KLSAgICBkb3VibGUgYXVkaW9fZGlmZl9hdmdfY29lZjsKLSAgICBkb3VibGUgYXVkaW9fZGlmZl90aHJlc2hvbGQ7Ci0gICAgaW50IGF1ZGlvX2RpZmZfYXZnX2NvdW50OwotICAgIEFWU3RyZWFtICphdWRpb19zdDsKLSAgICBQYWNrZXRRdWV1ZSBhdWRpb3E7Ci0gICAgaW50IGF1ZGlvX2h3X2J1Zl9zaXplOwotICAgIHVpbnQ4X3Qgc2lsZW5jZV9idWZbU0RMX0FVRElPX01JTl9CVUZGRVJfU0laRV07Ci0gICAgdWludDhfdCAqYXVkaW9fYnVmOwotICAgIHVpbnQ4X3QgKmF1ZGlvX2J1ZjE7Ci0gICAgdW5zaWduZWQgaW50IGF1ZGlvX2J1Zl9zaXplOyAvKiBpbiBieXRlcyAqLwotICAgIHVuc2lnbmVkIGludCBhdWRpb19idWYxX3NpemU7Ci0gICAgaW50IGF1ZGlvX2J1Zl9pbmRleDsgLyogaW4gYnl0ZXMgKi8KLSAgICBpbnQgYXVkaW9fd3JpdGVfYnVmX3NpemU7Ci0gICAgaW50IGF1ZGlvX3ZvbHVtZTsKLSAgICBpbnQgbXV0ZWQ7Ci0gICAgc3RydWN0IEF1ZGlvUGFyYW1zIGF1ZGlvX3NyYzsKLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICBzdHJ1Y3QgQXVkaW9QYXJhbXMgYXVkaW9fZmlsdGVyX3NyYzsKLSNlbmRpZgotICAgIHN0cnVjdCBBdWRpb1BhcmFtcyBhdWRpb190Z3Q7Ci0gICAgc3RydWN0IFN3ckNvbnRleHQgKnN3cl9jdHg7Ci0gICAgaW50IGZyYW1lX2Ryb3BzX2Vhcmx5OwotICAgIGludCBmcmFtZV9kcm9wc19sYXRlOwotCi0gICAgZW51bSBTaG93TW9kZSB7Ci0gICAgICAgIFNIT1dfTU9ERV9OT05FID0gLTEsIFNIT1dfTU9ERV9WSURFTyA9IDAsIFNIT1dfTU9ERV9XQVZFUywgU0hPV19NT0RFX1JERlQsIFNIT1dfTU9ERV9OQgotICAgIH0gc2hvd19tb2RlOwotICAgIGludDE2X3Qgc2FtcGxlX2FycmF5W1NBTVBMRV9BUlJBWV9TSVpFXTsKLSAgICBpbnQgc2FtcGxlX2FycmF5X2luZGV4OwotICAgIGludCBsYXN0X2lfc3RhcnQ7Ci0gICAgUkRGVENvbnRleHQgKnJkZnQ7Ci0gICAgaW50IHJkZnRfYml0czsKLSAgICBGRlRTYW1wbGUgKnJkZnRfZGF0YTsKLSAgICBpbnQgeHBvczsKLSAgICBkb3VibGUgbGFzdF92aXNfdGltZTsKLQotICAgIGludCBzdWJ0aXRsZV9zdHJlYW07Ci0gICAgQVZTdHJlYW0gKnN1YnRpdGxlX3N0OwotICAgIFBhY2tldFF1ZXVlIHN1YnRpdGxlcTsKLQotICAgIGRvdWJsZSBmcmFtZV90aW1lcjsKLSAgICBkb3VibGUgZnJhbWVfbGFzdF9yZXR1cm5lZF90aW1lOwotICAgIGRvdWJsZSBmcmFtZV9sYXN0X2ZpbHRlcl9kZWxheTsKLSAgICBpbnQgdmlkZW9fc3RyZWFtOwotICAgIEFWU3RyZWFtICp2aWRlb19zdDsKLSAgICBQYWNrZXRRdWV1ZSB2aWRlb3E7Ci0gICAgZG91YmxlIG1heF9mcmFtZV9kdXJhdGlvbjsgICAgICAvLyBtYXhpbXVtIGR1cmF0aW9uIG9mIGEgZnJhbWUgLSBhYm92ZSB0aGlzLCB3ZSBjb25zaWRlciB0aGUganVtcCBhIHRpbWVzdGFtcCBkaXNjb250aW51aXR5Ci0jaWYgIUNPTkZJR19BVkZJTFRFUgotICAgIHN0cnVjdCBTd3NDb250ZXh0ICppbWdfY29udmVydF9jdHg7Ci0jZW5kaWYKLSAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqc3ViX2NvbnZlcnRfY3R4OwotICAgIFNETF9SZWN0IGxhc3RfZGlzcGxheV9yZWN0OwotICAgIGludCBlb2Y7Ci0KLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICBpbnQgd2lkdGgsIGhlaWdodCwgeGxlZnQsIHl0b3A7Ci0gICAgaW50IHN0ZXA7Ci0KLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICBpbnQgdmZpbHRlcl9pZHg7Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICppbl92aWRlb19maWx0ZXI7ICAgLy8gdGhlIGZpcnN0IGZpbHRlciBpbiB0aGUgdmlkZW8gY2hhaW4KLSAgICBBVkZpbHRlckNvbnRleHQgKm91dF92aWRlb19maWx0ZXI7ICAvLyB0aGUgbGFzdCBmaWx0ZXIgaW4gdGhlIHZpZGVvIGNoYWluCi0gICAgQVZGaWx0ZXJDb250ZXh0ICppbl9hdWRpb19maWx0ZXI7ICAgLy8gdGhlIGZpcnN0IGZpbHRlciBpbiB0aGUgYXVkaW8gY2hhaW4KLSAgICBBVkZpbHRlckNvbnRleHQgKm91dF9hdWRpb19maWx0ZXI7ICAvLyB0aGUgbGFzdCBmaWx0ZXIgaW4gdGhlIGF1ZGlvIGNoYWluCi0gICAgQVZGaWx0ZXJHcmFwaCAqYWdyYXBoOyAgICAgICAgICAgICAgLy8gYXVkaW8gZmlsdGVyIGdyYXBoCi0jZW5kaWYKLQotICAgIGludCBsYXN0X3ZpZGVvX3N0cmVhbSwgbGFzdF9hdWRpb19zdHJlYW0sIGxhc3Rfc3VidGl0bGVfc3RyZWFtOwotCi0gICAgU0RMX2NvbmQgKmNvbnRpbnVlX3JlYWRfdGhyZWFkOwotfSBWaWRlb1N0YXRlOwotCi0vKiBvcHRpb25zIHNwZWNpZmllZCBieSB0aGUgdXNlciAqLwotc3RhdGljIEFWSW5wdXRGb3JtYXQgKmZpbGVfaWZvcm1hdDsKLXN0YXRpYyBjb25zdCBjaGFyICppbnB1dF9maWxlbmFtZTsKLXN0YXRpYyBjb25zdCBjaGFyICp3aW5kb3dfdGl0bGU7Ci1zdGF0aWMgaW50IGZzX3NjcmVlbl93aWR0aDsKLXN0YXRpYyBpbnQgZnNfc2NyZWVuX2hlaWdodDsKLXN0YXRpYyBpbnQgZGVmYXVsdF93aWR0aCAgPSA2NDA7Ci1zdGF0aWMgaW50IGRlZmF1bHRfaGVpZ2h0ID0gNDgwOwotc3RhdGljIGludCBzY3JlZW5fd2lkdGggID0gMDsKLXN0YXRpYyBpbnQgc2NyZWVuX2hlaWdodCA9IDA7Ci1zdGF0aWMgaW50IGF1ZGlvX2Rpc2FibGU7Ci1zdGF0aWMgaW50IHZpZGVvX2Rpc2FibGU7Ci1zdGF0aWMgaW50IHN1YnRpdGxlX2Rpc2FibGU7Ci1zdGF0aWMgY29uc3QgY2hhciogd2FudGVkX3N0cmVhbV9zcGVjW0FWTUVESUFfVFlQRV9OQl0gPSB7MH07Ci1zdGF0aWMgaW50IHNlZWtfYnlfYnl0ZXMgPSAtMTsKLXN0YXRpYyBpbnQgZGlzcGxheV9kaXNhYmxlOwotc3RhdGljIGludCBzaG93X3N0YXR1cyA9IDE7Ci1zdGF0aWMgaW50IGF2X3N5bmNfdHlwZSA9IEFWX1NZTkNfQVVESU9fTUFTVEVSOwotc3RhdGljIGludDY0X3Qgc3RhcnRfdGltZSA9IEFWX05PUFRTX1ZBTFVFOwotc3RhdGljIGludDY0X3QgZHVyYXRpb24gPSBBVl9OT1BUU19WQUxVRTsKLXN0YXRpYyBpbnQgZmFzdCA9IDA7Ci1zdGF0aWMgaW50IGdlbnB0cyA9IDA7Ci1zdGF0aWMgaW50IGxvd3JlcyA9IDA7Ci1zdGF0aWMgaW50IGRlY29kZXJfcmVvcmRlcl9wdHMgPSAtMTsKLXN0YXRpYyBpbnQgYXV0b2V4aXQ7Ci1zdGF0aWMgaW50IGV4aXRfb25fa2V5ZG93bjsKLXN0YXRpYyBpbnQgZXhpdF9vbl9tb3VzZWRvd247Ci1zdGF0aWMgaW50IGxvb3AgPSAxOwotc3RhdGljIGludCBmcmFtZWRyb3AgPSAtMTsKLXN0YXRpYyBpbnQgaW5maW5pdGVfYnVmZmVyID0gLTE7Ci1zdGF0aWMgZW51bSBTaG93TW9kZSBzaG93X21vZGUgPSBTSE9XX01PREVfTk9ORTsKLXN0YXRpYyBjb25zdCBjaGFyICphdWRpb19jb2RlY19uYW1lOwotc3RhdGljIGNvbnN0IGNoYXIgKnN1YnRpdGxlX2NvZGVjX25hbWU7Ci1zdGF0aWMgY29uc3QgY2hhciAqdmlkZW9fY29kZWNfbmFtZTsKLWRvdWJsZSByZGZ0c3BlZWQgPSAwLjAyOwotc3RhdGljIGludDY0X3QgY3Vyc29yX2xhc3Rfc2hvd247Ci1zdGF0aWMgaW50IGN1cnNvcl9oaWRkZW4gPSAwOwotI2lmIENPTkZJR19BVkZJTFRFUgotc3RhdGljIGNvbnN0IGNoYXIgKip2ZmlsdGVyc19saXN0ID0gTlVMTDsKLXN0YXRpYyBpbnQgbmJfdmZpbHRlcnMgPSAwOwotc3RhdGljIGNoYXIgKmFmaWx0ZXJzID0gTlVMTDsKLSNlbmRpZgotc3RhdGljIGludCBhdXRvcm90YXRlID0gMTsKLQotLyogY3VycmVudCBjb250ZXh0ICovCi1zdGF0aWMgaW50IGlzX2Z1bGxfc2NyZWVuOwotc3RhdGljIGludDY0X3QgYXVkaW9fY2FsbGJhY2tfdGltZTsKLQotc3RhdGljIEFWUGFja2V0IGZsdXNoX3BrdDsKLQotI2RlZmluZSBGRl9BTExPQ19FVkVOVCAgIChTRExfVVNFUkVWRU5UKQotI2RlZmluZSBGRl9RVUlUX0VWRU5UICAgIChTRExfVVNFUkVWRU5UICsgMikKLQotc3RhdGljIFNETF9TdXJmYWNlICpzY3JlZW47Ci0KLSNpZiBDT05GSUdfQVZGSUxURVIKLXN0YXRpYyBpbnQgb3B0X2FkZF92ZmlsdGVyKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgR1JPV19BUlJBWSh2ZmlsdGVyc19saXN0LCBuYl92ZmlsdGVycyk7Ci0gICAgdmZpbHRlcnNfbGlzdFtuYl92ZmlsdGVycyAtIDFdID0gYXJnOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUKLWludCBjbXBfYXVkaW9fZm10cyhlbnVtIEFWU2FtcGxlRm9ybWF0IGZtdDEsIGludDY0X3QgY2hhbm5lbF9jb3VudDEsCi0gICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBmbXQyLCBpbnQ2NF90IGNoYW5uZWxfY291bnQyKQotewotICAgIC8qIElmIGNoYW5uZWwgY291bnQgPT0gMSwgcGxhbmFyIGFuZCBub24tcGxhbmFyIGZvcm1hdHMgYXJlIHRoZSBzYW1lICovCi0gICAgaWYgKGNoYW5uZWxfY291bnQxID09IDEgJiYgY2hhbm5lbF9jb3VudDIgPT0gMSkKLSAgICAgICAgcmV0dXJuIGF2X2dldF9wYWNrZWRfc2FtcGxlX2ZtdChmbXQxKSAhPSBhdl9nZXRfcGFja2VkX3NhbXBsZV9mbXQoZm10Mik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gY2hhbm5lbF9jb3VudDEgIT0gY2hhbm5lbF9jb3VudDIgfHwgZm10MSAhPSBmbXQyOwotfQotCi1zdGF0aWMgaW5saW5lCi1pbnQ2NF90IGdldF92YWxpZF9jaGFubmVsX2xheW91dChpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LCBpbnQgY2hhbm5lbHMpCi17Ci0gICAgaWYgKGNoYW5uZWxfbGF5b3V0ICYmIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhjaGFubmVsX2xheW91dCkgPT0gY2hhbm5lbHMpCi0gICAgICAgIHJldHVybiBjaGFubmVsX2xheW91dDsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX3BpY3R1cmUoRnJhbWUgKnZwKTsKLQotc3RhdGljIGludCBwYWNrZXRfcXVldWVfcHV0X3ByaXZhdGUoUGFja2V0UXVldWUgKnEsIEFWUGFja2V0ICpwa3QpCi17Ci0gICAgTXlBVlBhY2tldExpc3QgKnBrdDE7Ci0KLSAgICBpZiAocS0+YWJvcnRfcmVxdWVzdCkKLSAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBwa3QxID0gYXZfbWFsbG9jKHNpemVvZihNeUFWUGFja2V0TGlzdCkpOwotICAgIGlmICghcGt0MSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHBrdDEtPnBrdCA9ICpwa3Q7Ci0gICAgcGt0MS0+bmV4dCA9IE5VTEw7Ci0gICAgaWYgKHBrdCA9PSAmZmx1c2hfcGt0KQotICAgICAgICBxLT5zZXJpYWwrKzsKLSAgICBwa3QxLT5zZXJpYWwgPSBxLT5zZXJpYWw7Ci0KLSAgICBpZiAoIXEtPmxhc3RfcGt0KQotICAgICAgICBxLT5maXJzdF9wa3QgPSBwa3QxOwotICAgIGVsc2UKLSAgICAgICAgcS0+bGFzdF9wa3QtPm5leHQgPSBwa3QxOwotICAgIHEtPmxhc3RfcGt0ID0gcGt0MTsKLSAgICBxLT5uYl9wYWNrZXRzKys7Ci0gICAgcS0+c2l6ZSArPSBwa3QxLT5wa3Quc2l6ZSArIHNpemVvZigqcGt0MSk7Ci0gICAgLyogWFhYOiBzaG91bGQgZHVwbGljYXRlIHBhY2tldCBkYXRhIGluIERWIGNhc2UgKi8KLSAgICBTRExfQ29uZFNpZ25hbChxLT5jb25kKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwYWNrZXRfcXVldWVfcHV0KFBhY2tldFF1ZXVlICpxLCBBVlBhY2tldCAqcGt0KQotewotICAgIGludCByZXQ7Ci0KLSAgICBTRExfTG9ja011dGV4KHEtPm11dGV4KTsKLSAgICByZXQgPSBwYWNrZXRfcXVldWVfcHV0X3ByaXZhdGUocSwgcGt0KTsKLSAgICBTRExfVW5sb2NrTXV0ZXgocS0+bXV0ZXgpOwotCi0gICAgaWYgKHBrdCAhPSAmZmx1c2hfcGt0ICYmIHJldCA8IDApCi0gICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwYWNrZXRfcXVldWVfcHV0X251bGxwYWNrZXQoUGFja2V0UXVldWUgKnEsIGludCBzdHJlYW1faW5kZXgpCi17Ci0gICAgQVZQYWNrZXQgcGt0MSwgKnBrdCA9ICZwa3QxOwotICAgIGF2X2luaXRfcGFja2V0KHBrdCk7Ci0gICAgcGt0LT5kYXRhID0gTlVMTDsKLSAgICBwa3QtPnNpemUgPSAwOwotICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3RyZWFtX2luZGV4OwotICAgIHJldHVybiBwYWNrZXRfcXVldWVfcHV0KHEsIHBrdCk7Ci19Ci0KLS8qIHBhY2tldCBxdWV1ZSBoYW5kbGluZyAqLwotc3RhdGljIGludCBwYWNrZXRfcXVldWVfaW5pdChQYWNrZXRRdWV1ZSAqcSkKLXsKLSAgICBtZW1zZXQocSwgMCwgc2l6ZW9mKFBhY2tldFF1ZXVlKSk7Ci0gICAgcS0+bXV0ZXggPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLSAgICBpZiAoIXEtPm11dGV4KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTRExfQ3JlYXRlTXV0ZXgoKTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0gICAgcS0+Y29uZCA9IFNETF9DcmVhdGVDb25kKCk7Ci0gICAgaWYgKCFxLT5jb25kKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTRExfQ3JlYXRlQ29uZCgpOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLSAgICBxLT5hYm9ydF9yZXF1ZXN0ID0gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgcGFja2V0X3F1ZXVlX2ZsdXNoKFBhY2tldFF1ZXVlICpxKQotewotICAgIE15QVZQYWNrZXRMaXN0ICpwa3QsICpwa3QxOwotCi0gICAgU0RMX0xvY2tNdXRleChxLT5tdXRleCk7Ci0gICAgZm9yIChwa3QgPSBxLT5maXJzdF9wa3Q7IHBrdDsgcGt0ID0gcGt0MSkgewotICAgICAgICBwa3QxID0gcGt0LT5uZXh0OwotICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdC0+cGt0KTsKLSAgICAgICAgYXZfZnJlZXAoJnBrdCk7Ci0gICAgfQotICAgIHEtPmxhc3RfcGt0ID0gTlVMTDsKLSAgICBxLT5maXJzdF9wa3QgPSBOVUxMOwotICAgIHEtPm5iX3BhY2tldHMgPSAwOwotICAgIHEtPnNpemUgPSAwOwotICAgIFNETF9VbmxvY2tNdXRleChxLT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhY2tldF9xdWV1ZV9kZXN0cm95KFBhY2tldFF1ZXVlICpxKQotewotICAgIHBhY2tldF9xdWV1ZV9mbHVzaChxKTsKLSAgICBTRExfRGVzdHJveU11dGV4KHEtPm11dGV4KTsKLSAgICBTRExfRGVzdHJveUNvbmQocS0+Y29uZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHBhY2tldF9xdWV1ZV9hYm9ydChQYWNrZXRRdWV1ZSAqcSkKLXsKLSAgICBTRExfTG9ja011dGV4KHEtPm11dGV4KTsKLQotICAgIHEtPmFib3J0X3JlcXVlc3QgPSAxOwotCi0gICAgU0RMX0NvbmRTaWduYWwocS0+Y29uZCk7Ci0KLSAgICBTRExfVW5sb2NrTXV0ZXgocS0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBwYWNrZXRfcXVldWVfc3RhcnQoUGFja2V0UXVldWUgKnEpCi17Ci0gICAgU0RMX0xvY2tNdXRleChxLT5tdXRleCk7Ci0gICAgcS0+YWJvcnRfcmVxdWVzdCA9IDA7Ci0gICAgcGFja2V0X3F1ZXVlX3B1dF9wcml2YXRlKHEsICZmbHVzaF9wa3QpOwotICAgIFNETF9VbmxvY2tNdXRleChxLT5tdXRleCk7Ci19Ci0KLS8qIHJldHVybiA8IDAgaWYgYWJvcnRlZCwgMCBpZiBubyBwYWNrZXQgYW5kID4gMCBpZiBwYWNrZXQuICAqLwotc3RhdGljIGludCBwYWNrZXRfcXVldWVfZ2V0KFBhY2tldFF1ZXVlICpxLCBBVlBhY2tldCAqcGt0LCBpbnQgYmxvY2ssIGludCAqc2VyaWFsKQotewotICAgIE15QVZQYWNrZXRMaXN0ICpwa3QxOwotICAgIGludCByZXQ7Ci0KLSAgICBTRExfTG9ja011dGV4KHEtPm11dGV4KTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKHEtPmFib3J0X3JlcXVlc3QpIHsKLSAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBwa3QxID0gcS0+Zmlyc3RfcGt0OwotICAgICAgICBpZiAocGt0MSkgewotICAgICAgICAgICAgcS0+Zmlyc3RfcGt0ID0gcGt0MS0+bmV4dDsKLSAgICAgICAgICAgIGlmICghcS0+Zmlyc3RfcGt0KQotICAgICAgICAgICAgICAgIHEtPmxhc3RfcGt0ID0gTlVMTDsKLSAgICAgICAgICAgIHEtPm5iX3BhY2tldHMtLTsKLSAgICAgICAgICAgIHEtPnNpemUgLT0gcGt0MS0+cGt0LnNpemUgKyBzaXplb2YoKnBrdDEpOwotICAgICAgICAgICAgKnBrdCA9IHBrdDEtPnBrdDsKLSAgICAgICAgICAgIGlmIChzZXJpYWwpCi0gICAgICAgICAgICAgICAgKnNlcmlhbCA9IHBrdDEtPnNlcmlhbDsKLSAgICAgICAgICAgIGF2X2ZyZWUocGt0MSk7Ci0gICAgICAgICAgICByZXQgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWJsb2NrKSB7Ci0gICAgICAgICAgICByZXQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBTRExfQ29uZFdhaXQocS0+Y29uZCwgcS0+bXV0ZXgpOwotICAgICAgICB9Ci0gICAgfQotICAgIFNETF9VbmxvY2tNdXRleChxLT5tdXRleCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZGVjb2Rlcl9pbml0KERlY29kZXIgKmQsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUGFja2V0UXVldWUgKnF1ZXVlLCBTRExfY29uZCAqZW1wdHlfcXVldWVfY29uZCkgewotICAgIG1lbXNldChkLCAwLCBzaXplb2YoRGVjb2RlcikpOwotICAgIGQtPmF2Y3R4ID0gYXZjdHg7Ci0gICAgZC0+cXVldWUgPSBxdWV1ZTsKLSAgICBkLT5lbXB0eV9xdWV1ZV9jb25kID0gZW1wdHlfcXVldWVfY29uZDsKLSAgICBkLT5zdGFydF9wdHMgPSBBVl9OT1BUU19WQUxVRTsKLX0KLQotc3RhdGljIGludCBkZWNvZGVyX2RlY29kZV9mcmFtZShEZWNvZGVyICpkLCBBVkZyYW1lICpmcmFtZSwgQVZTdWJ0aXRsZSAqc3ViKSB7Ci0gICAgaW50IGdvdF9mcmFtZSA9IDA7Ci0KLSAgICBkbyB7Ci0gICAgICAgIGludCByZXQgPSAtMTsKLQotICAgICAgICBpZiAoZC0+cXVldWUtPmFib3J0X3JlcXVlc3QpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgaWYgKCFkLT5wYWNrZXRfcGVuZGluZyB8fCBkLT5xdWV1ZS0+c2VyaWFsICE9IGQtPnBrdF9zZXJpYWwpIHsKLSAgICAgICAgICAgIEFWUGFja2V0IHBrdDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoZC0+cXVldWUtPm5iX3BhY2tldHMgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgU0RMX0NvbmRTaWduYWwoZC0+ZW1wdHlfcXVldWVfY29uZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhY2tldF9xdWV1ZV9nZXQoZC0+cXVldWUsICZwa3QsIDEsICZkLT5wa3Rfc2VyaWFsKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBpZiAocGt0LmRhdGEgPT0gZmx1c2hfcGt0LmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19mbHVzaF9idWZmZXJzKGQtPmF2Y3R4KTsKLSAgICAgICAgICAgICAgICAgICAgZC0+ZmluaXNoZWQgPSAwOwotICAgICAgICAgICAgICAgICAgICBkLT5uZXh0X3B0cyA9IGQtPnN0YXJ0X3B0czsKLSAgICAgICAgICAgICAgICAgICAgZC0+bmV4dF9wdHNfdGIgPSBkLT5zdGFydF9wdHNfdGI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAocGt0LmRhdGEgPT0gZmx1c2hfcGt0LmRhdGEgfHwgZC0+cXVldWUtPnNlcmlhbCAhPSBkLT5wa3Rfc2VyaWFsKTsKLSAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmZC0+cGt0KTsKLSAgICAgICAgICAgIGQtPnBrdF90ZW1wID0gZC0+cGt0ID0gcGt0OwotICAgICAgICAgICAgZC0+cGFja2V0X3BlbmRpbmcgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChkLT5hdmN0eC0+Y29kZWNfdHlwZSkgewotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfdmlkZW8yKGQtPmF2Y3R4LCBmcmFtZSwgJmdvdF9mcmFtZSwgJmQtPnBrdF90ZW1wKTsKLSAgICAgICAgICAgICAgICBpZiAoZ290X2ZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyX3Jlb3JkZXJfcHRzID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cHRzID0gYXZfZnJhbWVfZ2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChmcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjb2Rlcl9yZW9yZGVyX3B0cykgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnB0cyA9IGZyYW1lLT5wa3RfcHRzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnB0cyA9IGZyYW1lLT5wa3RfZHRzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KGQtPmF2Y3R4LCBmcmFtZSwgJmdvdF9mcmFtZSwgJmQtPnBrdF90ZW1wKTsKLSAgICAgICAgICAgICAgICBpZiAoZ290X2ZyYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgdGIgPSAoQVZSYXRpb25hbCl7MSwgZnJhbWUtPnNhbXBsZV9yYXRlfTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9xKGZyYW1lLT5wdHMsIGQtPmF2Y3R4LT50aW1lX2Jhc2UsIHRiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZnJhbWUtPnBrdF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9xKGZyYW1lLT5wa3RfcHRzLCBhdl9jb2RlY19nZXRfcGt0X3RpbWViYXNlKGQtPmF2Y3R4KSwgdGIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkLT5uZXh0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBhdl9yZXNjYWxlX3EoZC0+bmV4dF9wdHMsIGQtPm5leHRfcHRzX3RiLCB0Yik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkLT5uZXh0X3B0cyA9IGZyYW1lLT5wdHMgKyBmcmFtZS0+bmJfc2FtcGxlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGQtPm5leHRfcHRzX3RiID0gdGI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKLSAgICAgICAgICAgICAgICByZXQgPSBhdmNvZGVjX2RlY29kZV9zdWJ0aXRsZTIoZC0+YXZjdHgsIHN1YiwgJmdvdF9mcmFtZSwgJmQtPnBrdF90ZW1wKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBkLT5wYWNrZXRfcGVuZGluZyA9IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkLT5wa3RfdGVtcC5kdHMgPQotICAgICAgICAgICAgZC0+cGt0X3RlbXAucHRzID0gQVZfTk9QVFNfVkFMVUU7Ci0gICAgICAgICAgICBpZiAoZC0+cGt0X3RlbXAuZGF0YSkgewotICAgICAgICAgICAgICAgIGlmIChkLT5hdmN0eC0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IGQtPnBrdF90ZW1wLnNpemU7Ci0gICAgICAgICAgICAgICAgZC0+cGt0X3RlbXAuZGF0YSArPSByZXQ7Ci0gICAgICAgICAgICAgICAgZC0+cGt0X3RlbXAuc2l6ZSAtPSByZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKGQtPnBrdF90ZW1wLnNpemUgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgZC0+cGFja2V0X3BlbmRpbmcgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIWdvdF9mcmFtZSkgewotICAgICAgICAgICAgICAgICAgICBkLT5wYWNrZXRfcGVuZGluZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGQtPmZpbmlzaGVkID0gZC0+cGt0X3NlcmlhbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlICghZ290X2ZyYW1lICYmICFkLT5maW5pc2hlZCk7Ci0KLSAgICByZXR1cm4gZ290X2ZyYW1lOwotfQotCi1zdGF0aWMgdm9pZCBkZWNvZGVyX2Rlc3Ryb3koRGVjb2RlciAqZCkgewotICAgIGF2X3BhY2tldF91bnJlZigmZC0+cGt0KTsKLX0KLQotc3RhdGljIHZvaWQgZnJhbWVfcXVldWVfdW5yZWZfaXRlbShGcmFtZSAqdnApCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHZwLT5zdWIubnVtX3JlY3RzOyBpKyspIHsKLSAgICAgICAgYXZfZnJlZXAoJnZwLT5zdWJyZWN0c1tpXS0+ZGF0YVswXSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZ2cC0+c3VicmVjdHNbaV0pOwotICAgIH0KLSAgICBhdl9mcmVlcCgmdnAtPnN1YnJlY3RzKTsKLSAgICBhdl9mcmFtZV91bnJlZih2cC0+ZnJhbWUpOwotICAgIGF2c3VidGl0bGVfZnJlZSgmdnAtPnN1Yik7Ci19Ci0KLXN0YXRpYyBpbnQgZnJhbWVfcXVldWVfaW5pdChGcmFtZVF1ZXVlICpmLCBQYWNrZXRRdWV1ZSAqcGt0cSwgaW50IG1heF9zaXplLCBpbnQga2VlcF9sYXN0KQotewotICAgIGludCBpOwotICAgIG1lbXNldChmLCAwLCBzaXplb2YoRnJhbWVRdWV1ZSkpOwotICAgIGlmICghKGYtPm11dGV4ID0gU0RMX0NyZWF0ZU11dGV4KCkpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTRExfQ3JlYXRlTXV0ZXgoKTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0gICAgaWYgKCEoZi0+Y29uZCA9IFNETF9DcmVhdGVDb25kKCkpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTRExfQ3JlYXRlQ29uZCgpOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLSAgICBmLT5wa3RxID0gcGt0cTsKLSAgICBmLT5tYXhfc2l6ZSA9IEZGTUlOKG1heF9zaXplLCBGUkFNRV9RVUVVRV9TSVpFKTsKLSAgICBmLT5rZWVwX2xhc3QgPSAhIWtlZXBfbGFzdDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZi0+bWF4X3NpemU7IGkrKykKLSAgICAgICAgaWYgKCEoZi0+cXVldWVbaV0uZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyYW1lX3F1ZXVlX2Rlc3RvcnkoRnJhbWVRdWV1ZSAqZikKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZi0+bWF4X3NpemU7IGkrKykgewotICAgICAgICBGcmFtZSAqdnAgPSAmZi0+cXVldWVbaV07Ci0gICAgICAgIGZyYW1lX3F1ZXVlX3VucmVmX2l0ZW0odnApOwotICAgICAgICBhdl9mcmFtZV9mcmVlKCZ2cC0+ZnJhbWUpOwotICAgICAgICBmcmVlX3BpY3R1cmUodnApOwotICAgIH0KLSAgICBTRExfRGVzdHJveU11dGV4KGYtPm11dGV4KTsKLSAgICBTRExfRGVzdHJveUNvbmQoZi0+Y29uZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyYW1lX3F1ZXVlX3NpZ25hbChGcmFtZVF1ZXVlICpmKQotewotICAgIFNETF9Mb2NrTXV0ZXgoZi0+bXV0ZXgpOwotICAgIFNETF9Db25kU2lnbmFsKGYtPmNvbmQpOwotICAgIFNETF9VbmxvY2tNdXRleChmLT5tdXRleCk7Ci19Ci0KLXN0YXRpYyBGcmFtZSAqZnJhbWVfcXVldWVfcGVlayhGcmFtZVF1ZXVlICpmKQotewotICAgIHJldHVybiAmZi0+cXVldWVbKGYtPnJpbmRleCArIGYtPnJpbmRleF9zaG93bikgJSBmLT5tYXhfc2l6ZV07Ci19Ci0KLXN0YXRpYyBGcmFtZSAqZnJhbWVfcXVldWVfcGVla19uZXh0KEZyYW1lUXVldWUgKmYpCi17Ci0gICAgcmV0dXJuICZmLT5xdWV1ZVsoZi0+cmluZGV4ICsgZi0+cmluZGV4X3Nob3duICsgMSkgJSBmLT5tYXhfc2l6ZV07Ci19Ci0KLXN0YXRpYyBGcmFtZSAqZnJhbWVfcXVldWVfcGVla19sYXN0KEZyYW1lUXVldWUgKmYpCi17Ci0gICAgcmV0dXJuICZmLT5xdWV1ZVtmLT5yaW5kZXhdOwotfQotCi1zdGF0aWMgRnJhbWUgKmZyYW1lX3F1ZXVlX3BlZWtfd3JpdGFibGUoRnJhbWVRdWV1ZSAqZikKLXsKLSAgICAvKiB3YWl0IHVudGlsIHdlIGhhdmUgc3BhY2UgdG8gcHV0IGEgbmV3IGZyYW1lICovCi0gICAgU0RMX0xvY2tNdXRleChmLT5tdXRleCk7Ci0gICAgd2hpbGUgKGYtPnNpemUgPj0gZi0+bWF4X3NpemUgJiYKLSAgICAgICAgICAgIWYtPnBrdHEtPmFib3J0X3JlcXVlc3QpIHsKLSAgICAgICAgU0RMX0NvbmRXYWl0KGYtPmNvbmQsIGYtPm11dGV4KTsKLSAgICB9Ci0gICAgU0RMX1VubG9ja011dGV4KGYtPm11dGV4KTsKLQotICAgIGlmIChmLT5wa3RxLT5hYm9ydF9yZXF1ZXN0KQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiAmZi0+cXVldWVbZi0+d2luZGV4XTsKLX0KLQotc3RhdGljIEZyYW1lICpmcmFtZV9xdWV1ZV9wZWVrX3JlYWRhYmxlKEZyYW1lUXVldWUgKmYpCi17Ci0gICAgLyogd2FpdCB1bnRpbCB3ZSBoYXZlIGEgcmVhZGFibGUgYSBuZXcgZnJhbWUgKi8KLSAgICBTRExfTG9ja011dGV4KGYtPm11dGV4KTsKLSAgICB3aGlsZSAoZi0+c2l6ZSAtIGYtPnJpbmRleF9zaG93biA8PSAwICYmCi0gICAgICAgICAgICFmLT5wa3RxLT5hYm9ydF9yZXF1ZXN0KSB7Ci0gICAgICAgIFNETF9Db25kV2FpdChmLT5jb25kLCBmLT5tdXRleCk7Ci0gICAgfQotICAgIFNETF9VbmxvY2tNdXRleChmLT5tdXRleCk7Ci0KLSAgICBpZiAoZi0+cGt0cS0+YWJvcnRfcmVxdWVzdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXR1cm4gJmYtPnF1ZXVlWyhmLT5yaW5kZXggKyBmLT5yaW5kZXhfc2hvd24pICUgZi0+bWF4X3NpemVdOwotfQotCi1zdGF0aWMgdm9pZCBmcmFtZV9xdWV1ZV9wdXNoKEZyYW1lUXVldWUgKmYpCi17Ci0gICAgaWYgKCsrZi0+d2luZGV4ID09IGYtPm1heF9zaXplKQotICAgICAgICBmLT53aW5kZXggPSAwOwotICAgIFNETF9Mb2NrTXV0ZXgoZi0+bXV0ZXgpOwotICAgIGYtPnNpemUrKzsKLSAgICBTRExfQ29uZFNpZ25hbChmLT5jb25kKTsKLSAgICBTRExfVW5sb2NrTXV0ZXgoZi0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBmcmFtZV9xdWV1ZV9uZXh0KEZyYW1lUXVldWUgKmYpCi17Ci0gICAgaWYgKGYtPmtlZXBfbGFzdCAmJiAhZi0+cmluZGV4X3Nob3duKSB7Ci0gICAgICAgIGYtPnJpbmRleF9zaG93biA9IDE7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZnJhbWVfcXVldWVfdW5yZWZfaXRlbSgmZi0+cXVldWVbZi0+cmluZGV4XSk7Ci0gICAgaWYgKCsrZi0+cmluZGV4ID09IGYtPm1heF9zaXplKQotICAgICAgICBmLT5yaW5kZXggPSAwOwotICAgIFNETF9Mb2NrTXV0ZXgoZi0+bXV0ZXgpOwotICAgIGYtPnNpemUtLTsKLSAgICBTRExfQ29uZFNpZ25hbChmLT5jb25kKTsKLSAgICBTRExfVW5sb2NrTXV0ZXgoZi0+bXV0ZXgpOwotfQotCi0vKiBqdW1wIGJhY2sgdG8gdGhlIHByZXZpb3VzIGZyYW1lIGlmIGF2YWlsYWJsZSBieSByZXNldHRpbmcgcmluZGV4X3Nob3duICovCi1zdGF0aWMgaW50IGZyYW1lX3F1ZXVlX3ByZXYoRnJhbWVRdWV1ZSAqZikKLXsKLSAgICBpbnQgcmV0ID0gZi0+cmluZGV4X3Nob3duOwotICAgIGYtPnJpbmRleF9zaG93biA9IDA7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyogcmV0dXJuIHRoZSBudW1iZXIgb2YgdW5kaXNwbGF5ZWQgZnJhbWVzIGluIHRoZSBxdWV1ZSAqLwotc3RhdGljIGludCBmcmFtZV9xdWV1ZV9uYl9yZW1haW5pbmcoRnJhbWVRdWV1ZSAqZikKLXsKLSAgICByZXR1cm4gZi0+c2l6ZSAtIGYtPnJpbmRleF9zaG93bjsKLX0KLQotLyogcmV0dXJuIGxhc3Qgc2hvd24gcG9zaXRpb24gKi8KLXN0YXRpYyBpbnQ2NF90IGZyYW1lX3F1ZXVlX2xhc3RfcG9zKEZyYW1lUXVldWUgKmYpCi17Ci0gICAgRnJhbWUgKmZwID0gJmYtPnF1ZXVlW2YtPnJpbmRleF07Ci0gICAgaWYgKGYtPnJpbmRleF9zaG93biAmJiBmcC0+c2VyaWFsID09IGYtPnBrdHEtPnNlcmlhbCkKLSAgICAgICAgcmV0dXJuIGZwLT5wb3M7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY29kZXJfYWJvcnQoRGVjb2RlciAqZCwgRnJhbWVRdWV1ZSAqZnEpCi17Ci0gICAgcGFja2V0X3F1ZXVlX2Fib3J0KGQtPnF1ZXVlKTsKLSAgICBmcmFtZV9xdWV1ZV9zaWduYWwoZnEpOwotICAgIFNETF9XYWl0VGhyZWFkKGQtPmRlY29kZXJfdGlkLCBOVUxMKTsKLSAgICBkLT5kZWNvZGVyX3RpZCA9IE5VTEw7Ci0gICAgcGFja2V0X3F1ZXVlX2ZsdXNoKGQtPnF1ZXVlKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZpbGxfcmVjdGFuZ2xlKFNETF9TdXJmYWNlICpzY3JlZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsIGludCBjb2xvciwgaW50IHVwZGF0ZSkKLXsKLSAgICBTRExfUmVjdCByZWN0OwotICAgIHJlY3QueCA9IHg7Ci0gICAgcmVjdC55ID0geTsKLSAgICByZWN0LncgPSB3OwotICAgIHJlY3QuaCA9IGg7Ci0gICAgU0RMX0ZpbGxSZWN0KHNjcmVlbiwgJnJlY3QsIGNvbG9yKTsKLSAgICBpZiAodXBkYXRlICYmIHcgPiAwICYmIGggPiAwKQotICAgICAgICBTRExfVXBkYXRlUmVjdChzY3JlZW4sIHgsIHksIHcsIGgpOwotfQotCi0vKiBkcmF3IG9ubHkgdGhlIGJvcmRlciBvZiBhIHJlY3RhbmdsZSAqLwotc3RhdGljIHZvaWQgZmlsbF9ib3JkZXIoaW50IHhsZWZ0LCBpbnQgeXRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwgaW50IGNvbG9yLCBpbnQgdXBkYXRlKQotewotICAgIGludCB3MSwgdzIsIGgxLCBoMjsKLQotICAgIC8qIGZpbGwgdGhlIGJhY2tncm91bmQgKi8KLSAgICB3MSA9IHg7Ci0gICAgaWYgKHcxIDwgMCkKLSAgICAgICAgdzEgPSAwOwotICAgIHcyID0gd2lkdGggLSAoeCArIHcpOwotICAgIGlmICh3MiA8IDApCi0gICAgICAgIHcyID0gMDsKLSAgICBoMSA9IHk7Ci0gICAgaWYgKGgxIDwgMCkKLSAgICAgICAgaDEgPSAwOwotICAgIGgyID0gaGVpZ2h0IC0gKHkgKyBoKTsKLSAgICBpZiAoaDIgPCAwKQotICAgICAgICBoMiA9IDA7Ci0gICAgZmlsbF9yZWN0YW5nbGUoc2NyZWVuLAotICAgICAgICAgICAgICAgICAgIHhsZWZ0LCB5dG9wLAotICAgICAgICAgICAgICAgICAgIHcxLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgY29sb3IsIHVwZGF0ZSk7Ci0gICAgZmlsbF9yZWN0YW5nbGUoc2NyZWVuLAotICAgICAgICAgICAgICAgICAgIHhsZWZ0ICsgd2lkdGggLSB3MiwgeXRvcCwKLSAgICAgICAgICAgICAgICAgICB3MiwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIGNvbG9yLCB1cGRhdGUpOwotICAgIGZpbGxfcmVjdGFuZ2xlKHNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICB4bGVmdCArIHcxLCB5dG9wLAotICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gdzEgLSB3MiwgaDEsCi0gICAgICAgICAgICAgICAgICAgY29sb3IsIHVwZGF0ZSk7Ci0gICAgZmlsbF9yZWN0YW5nbGUoc2NyZWVuLAotICAgICAgICAgICAgICAgICAgIHhsZWZ0ICsgdzEsIHl0b3AgKyBoZWlnaHQgLSBoMiwKLSAgICAgICAgICAgICAgICAgICB3aWR0aCAtIHcxIC0gdzIsIGgyLAotICAgICAgICAgICAgICAgICAgIGNvbG9yLCB1cGRhdGUpOwotfQotCi0jZGVmaW5lIEFMUEhBX0JMRU5EKGEsIG9sZHAsIG5ld3AsIHMpXAotKCgoKG9sZHAgPDwgcykgKiAoMjU1IC0gKGEpKSkgKyAobmV3cCAqIChhKSkpIC8gKDI1NSA8PCBzKSkKLQotCi0KLSNkZWZpbmUgQlBQIDEKLQotc3RhdGljIHZvaWQgYmxlbmRfc3VicmVjdCh1aW50OF90ICoqZGF0YSwgaW50ICpsaW5lc2l6ZSwgY29uc3QgQVZTdWJ0aXRsZVJlY3QgKnJlY3QsIGludCBpbWd3LCBpbnQgaW1naCkKLXsKLSAgICBpbnQgeCwgeSwgWSwgVSwgViwgQTsKLSAgICB1aW50OF90ICpsdW0sICpjYiwgKmNyOwotICAgIGludCBkc3R4LCBkc3R5LCBkc3R3LCBkc3RoOwotICAgIGNvbnN0IEFWU3VidGl0bGVSZWN0ICpzcmMgPSByZWN0OwotCi0gICAgZHN0dyA9IGF2X2NsaXAocmVjdC0+dywgMCwgaW1ndyk7Ci0gICAgZHN0aCA9IGF2X2NsaXAocmVjdC0+aCwgMCwgaW1naCk7Ci0gICAgZHN0eCA9IGF2X2NsaXAocmVjdC0+eCwgMCwgaW1ndyAtIGRzdHcpOwotICAgIGRzdHkgPSBhdl9jbGlwKHJlY3QtPnksIDAsIGltZ2ggLSBkc3RoKTsKLSAgICBsdW0gPSBkYXRhWzBdICsgZHN0eCArIGRzdHkgKiBsaW5lc2l6ZVswXTsKLSAgICBjYiAgPSBkYXRhWzFdICsgZHN0eC8yICsgKGRzdHkgPj4gMSkgKiBsaW5lc2l6ZVsxXTsKLSAgICBjciAgPSBkYXRhWzJdICsgZHN0eC8yICsgKGRzdHkgPj4gMSkgKiBsaW5lc2l6ZVsyXTsKLQotICAgIGZvciAoeSA9IDA7IHk8ZHN0aDsgeSsrKSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHg8ZHN0dzsgeCsrKSB7Ci0gICAgICAgICAgICBZID0gc3JjLT5kYXRhWzBdW3ggKyB5KnNyYy0+bGluZXNpemVbMF1dOwotICAgICAgICAgICAgQSA9IHNyYy0+ZGF0YVszXVt4ICsgeSpzcmMtPmxpbmVzaXplWzNdXTsKLSAgICAgICAgICAgIGx1bVswXSA9IEFMUEhBX0JMRU5EKEEsIGx1bVswXSwgWSwgMCk7Ci0gICAgICAgICAgICBsdW0rKzsKLSAgICAgICAgfQotICAgICAgICBsdW0gKz0gbGluZXNpemVbMF0gLSBkc3R3OwotICAgIH0KLQotICAgIGZvciAoeSA9IDA7IHk8ZHN0aC8yOyB5KyspIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeDxkc3R3LzI7IHgrKykgewotICAgICAgICAgICAgVSA9IHNyYy0+ZGF0YVsxXVt4ICsgeSpzcmMtPmxpbmVzaXplWzFdXTsKLSAgICAgICAgICAgIFYgPSBzcmMtPmRhdGFbMl1beCArIHkqc3JjLT5saW5lc2l6ZVsyXV07Ci0gICAgICAgICAgICBBID0gc3JjLT5kYXRhWzNdWzIqeCAgICAgKyAgMip5ICAgKnNyYy0+bGluZXNpemVbM11dCi0gICAgICAgICAgICAgICsgc3JjLT5kYXRhWzNdWzIqeCArIDEgKyAgMip5ICAgKnNyYy0+bGluZXNpemVbM11dCi0gICAgICAgICAgICAgICsgc3JjLT5kYXRhWzNdWzIqeCArIDEgKyAoMip5KzEpKnNyYy0+bGluZXNpemVbM11dCi0gICAgICAgICAgICAgICsgc3JjLT5kYXRhWzNdWzIqeCAgICAgKyAoMip5KzEpKnNyYy0+bGluZXNpemVbM11dOwotICAgICAgICAgICAgY2JbMF0gPSBBTFBIQV9CTEVORChBPj4yLCBjYlswXSwgVSwgMCk7Ci0gICAgICAgICAgICBjclswXSA9IEFMUEhBX0JMRU5EKEE+PjIsIGNyWzBdLCBWLCAwKTsKLSAgICAgICAgICAgIGNiKys7Ci0gICAgICAgICAgICBjcisrOwotICAgICAgICB9Ci0gICAgICAgIGNiICs9IGxpbmVzaXplWzFdIC0gZHN0dy8yOwotICAgICAgICBjciArPSBsaW5lc2l6ZVsyXSAtIGRzdHcvMjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfcGljdHVyZShGcmFtZSAqdnApCi17Ci0gICAgIGlmICh2cC0+Ym1wKSB7Ci0gICAgICAgICBTRExfRnJlZVlVVk92ZXJsYXkodnAtPmJtcCk7Ci0gICAgICAgICB2cC0+Ym1wID0gTlVMTDsKLSAgICAgfQotfQotCi1zdGF0aWMgdm9pZCBjYWxjdWxhdGVfZGlzcGxheV9yZWN0KFNETF9SZWN0ICpyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NyX3hsZWZ0LCBpbnQgc2NyX3l0b3AsIGludCBzY3Jfd2lkdGgsIGludCBzY3JfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljX3dpZHRoLCBpbnQgcGljX2hlaWdodCwgQVZSYXRpb25hbCBwaWNfc2FyKQotewotICAgIGZsb2F0IGFzcGVjdF9yYXRpbzsKLSAgICBpbnQgd2lkdGgsIGhlaWdodCwgeCwgeTsKLQotICAgIGlmIChwaWNfc2FyLm51bSA9PSAwKQotICAgICAgICBhc3BlY3RfcmF0aW8gPSAwOwotICAgIGVsc2UKLSAgICAgICAgYXNwZWN0X3JhdGlvID0gYXZfcTJkKHBpY19zYXIpOwotCi0gICAgaWYgKGFzcGVjdF9yYXRpbyA8PSAwLjApCi0gICAgICAgIGFzcGVjdF9yYXRpbyA9IDEuMDsKLSAgICBhc3BlY3RfcmF0aW8gKj0gKGZsb2F0KXBpY193aWR0aCAvIChmbG9hdClwaWNfaGVpZ2h0OwotCi0gICAgLyogWFhYOiB3ZSBzdXBwb3NlIHRoZSBzY3JlZW4gaGFzIGEgMS4wIHBpeGVsIHJhdGlvICovCi0gICAgaGVpZ2h0ID0gc2NyX2hlaWdodDsKLSAgICB3aWR0aCA9IGxyaW50KGhlaWdodCAqIGFzcGVjdF9yYXRpbykgJiB+MTsKLSAgICBpZiAod2lkdGggPiBzY3Jfd2lkdGgpIHsKLSAgICAgICAgd2lkdGggPSBzY3Jfd2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IGxyaW50KHdpZHRoIC8gYXNwZWN0X3JhdGlvKSAmIH4xOwotICAgIH0KLSAgICB4ID0gKHNjcl93aWR0aCAtIHdpZHRoKSAvIDI7Ci0gICAgeSA9IChzY3JfaGVpZ2h0IC0gaGVpZ2h0KSAvIDI7Ci0gICAgcmVjdC0+eCA9IHNjcl94bGVmdCArIHg7Ci0gICAgcmVjdC0+eSA9IHNjcl95dG9wICArIHk7Ci0gICAgcmVjdC0+dyA9IEZGTUFYKHdpZHRoLCAgMSk7Ci0gICAgcmVjdC0+aCA9IEZGTUFYKGhlaWdodCwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpZGVvX2ltYWdlX2Rpc3BsYXkoVmlkZW9TdGF0ZSAqaXMpCi17Ci0gICAgRnJhbWUgKnZwOwotICAgIEZyYW1lICpzcDsKLSAgICBTRExfUmVjdCByZWN0OwotICAgIGludCBpOwotCi0gICAgdnAgPSBmcmFtZV9xdWV1ZV9wZWVrKCZpcy0+cGljdHEpOwotICAgIGlmICh2cC0+Ym1wKSB7Ci0gICAgICAgIGlmIChpcy0+c3VidGl0bGVfc3QpIHsKLSAgICAgICAgICAgIGlmIChmcmFtZV9xdWV1ZV9uYl9yZW1haW5pbmcoJmlzLT5zdWJwcSkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc3AgPSBmcmFtZV9xdWV1ZV9wZWVrKCZpcy0+c3VicHEpOwotCi0gICAgICAgICAgICAgICAgaWYgKHZwLT5wdHMgPj0gc3AtPnB0cyArICgoZmxvYXQpIHNwLT5zdWIuc3RhcnRfZGlzcGxheV90aW1lIC8gMTAwMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YVs0XTsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplWzRdOwotCi0gICAgICAgICAgICAgICAgICAgIFNETF9Mb2NrWVVWT3ZlcmxheSAodnAtPmJtcCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZGF0YVswXSA9IHZwLT5ibXAtPnBpeGVsc1swXTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9IHZwLT5ibXAtPnBpeGVsc1syXTsKLSAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSA9IHZwLT5ibXAtPnBpeGVsc1sxXTsKLQotICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZVswXSA9IHZwLT5ibXAtPnBpdGNoZXNbMF07Ci0gICAgICAgICAgICAgICAgICAgIGxpbmVzaXplWzFdID0gdnAtPmJtcC0+cGl0Y2hlc1syXTsKLSAgICAgICAgICAgICAgICAgICAgbGluZXNpemVbMl0gPSB2cC0+Ym1wLT5waXRjaGVzWzFdOwotCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcC0+c3ViLm51bV9yZWN0czsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfc3VicmVjdChkYXRhLCBsaW5lc2l6ZSwgc3AtPnN1YnJlY3RzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cC0+Ym1wLT53LCB2cC0+Ym1wLT5oKTsKLQotICAgICAgICAgICAgICAgICAgICBTRExfVW5sb2NrWVVWT3ZlcmxheSAodnAtPmJtcCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2FsY3VsYXRlX2Rpc3BsYXlfcmVjdCgmcmVjdCwgaXMtPnhsZWZ0LCBpcy0+eXRvcCwgaXMtPndpZHRoLCBpcy0+aGVpZ2h0LCB2cC0+d2lkdGgsIHZwLT5oZWlnaHQsIHZwLT5zYXIpOwotCi0gICAgICAgIFNETF9EaXNwbGF5WVVWT3ZlcmxheSh2cC0+Ym1wLCAmcmVjdCk7Ci0KLSAgICAgICAgaWYgKHJlY3QueCAhPSBpcy0+bGFzdF9kaXNwbGF5X3JlY3QueCB8fCByZWN0LnkgIT0gaXMtPmxhc3RfZGlzcGxheV9yZWN0LnkgfHwgcmVjdC53ICE9IGlzLT5sYXN0X2Rpc3BsYXlfcmVjdC53IHx8IHJlY3QuaCAhPSBpcy0+bGFzdF9kaXNwbGF5X3JlY3QuaCB8fCBpcy0+Zm9yY2VfcmVmcmVzaCkgewotICAgICAgICAgICAgaW50IGJnY29sb3IgPSBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAweDAwLCAweDAwLCAweDAwKTsKLSAgICAgICAgICAgIGZpbGxfYm9yZGVyKGlzLT54bGVmdCwgaXMtPnl0b3AsIGlzLT53aWR0aCwgaXMtPmhlaWdodCwgcmVjdC54LCByZWN0LnksIHJlY3QudywgcmVjdC5oLCBiZ2NvbG9yLCAxKTsKLSAgICAgICAgICAgIGlzLT5sYXN0X2Rpc3BsYXlfcmVjdCA9IHJlY3Q7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGNvbXB1dGVfbW9kKGludCBhLCBpbnQgYikKLXsKLSAgICByZXR1cm4gYSA8IDAgPyBhJWIgKyBiIDogYSViOwotfQotCi1zdGF0aWMgdm9pZCB2aWRlb19hdWRpb19kaXNwbGF5KFZpZGVvU3RhdGUgKnMpCi17Ci0gICAgaW50IGksIGlfc3RhcnQsIHgsIHkxLCB5LCB5cywgZGVsYXksIG4sIG5iX2Rpc3BsYXlfY2hhbm5lbHM7Ci0gICAgaW50IGNoLCBjaGFubmVscywgaCwgaDIsIGJnY29sb3IsIGZnY29sb3I7Ci0gICAgaW50NjRfdCB0aW1lX2RpZmY7Ci0gICAgaW50IHJkZnRfYml0cywgbmJfZnJlcTsKLQotICAgIGZvciAocmRmdF9iaXRzID0gMTsgKDEgPDwgcmRmdF9iaXRzKSA8IDIgKiBzLT5oZWlnaHQ7IHJkZnRfYml0cysrKQotICAgICAgICA7Ci0gICAgbmJfZnJlcSA9IDEgPDwgKHJkZnRfYml0cyAtIDEpOwotCi0gICAgLyogY29tcHV0ZSBkaXNwbGF5IGluZGV4IDogY2VudGVyIG9uIGN1cnJlbnRseSBvdXRwdXQgc2FtcGxlcyAqLwotICAgIGNoYW5uZWxzID0gcy0+YXVkaW9fdGd0LmNoYW5uZWxzOwotICAgIG5iX2Rpc3BsYXlfY2hhbm5lbHMgPSBjaGFubmVsczsKLSAgICBpZiAoIXMtPnBhdXNlZCkgewotICAgICAgICBpbnQgZGF0YV91c2VkPSBzLT5zaG93X21vZGUgPT0gU0hPV19NT0RFX1dBVkVTID8gcy0+d2lkdGggOiAoMipuYl9mcmVxKTsKLSAgICAgICAgbiA9IDIgKiBjaGFubmVsczsKLSAgICAgICAgZGVsYXkgPSBzLT5hdWRpb193cml0ZV9idWZfc2l6ZTsKLSAgICAgICAgZGVsYXkgLz0gbjsKLQotICAgICAgICAvKiB0byBiZSBtb3JlIHByZWNpc2UsIHdlIHRha2UgaW50byBhY2NvdW50IHRoZSB0aW1lIHNwZW50IHNpbmNlCi0gICAgICAgICAgIHRoZSBsYXN0IGJ1ZmZlciBjb21wdXRhdGlvbiAqLwotICAgICAgICBpZiAoYXVkaW9fY2FsbGJhY2tfdGltZSkgewotICAgICAgICAgICAgdGltZV9kaWZmID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gYXVkaW9fY2FsbGJhY2tfdGltZTsKLSAgICAgICAgICAgIGRlbGF5IC09ICh0aW1lX2RpZmYgKiBzLT5hdWRpb190Z3QuZnJlcSkgLyAxMDAwMDAwOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVsYXkgKz0gMiAqIGRhdGFfdXNlZDsKLSAgICAgICAgaWYgKGRlbGF5IDwgZGF0YV91c2VkKQotICAgICAgICAgICAgZGVsYXkgPSBkYXRhX3VzZWQ7Ci0KLSAgICAgICAgaV9zdGFydD0geCA9IGNvbXB1dGVfbW9kKHMtPnNhbXBsZV9hcnJheV9pbmRleCAtIGRlbGF5ICogY2hhbm5lbHMsIFNBTVBMRV9BUlJBWV9TSVpFKTsKLSAgICAgICAgaWYgKHMtPnNob3dfbW9kZSA9PSBTSE9XX01PREVfV0FWRVMpIHsKLSAgICAgICAgICAgIGggPSBJTlRfTUlOOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkgKz0gY2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaWR4ID0gKFNBTVBMRV9BUlJBWV9TSVpFICsgeCAtIGkpICUgU0FNUExFX0FSUkFZX1NJWkU7Ci0gICAgICAgICAgICAgICAgaW50IGEgPSBzLT5zYW1wbGVfYXJyYXlbaWR4XTsKLSAgICAgICAgICAgICAgICBpbnQgYiA9IHMtPnNhbXBsZV9hcnJheVsoaWR4ICsgNCAqIGNoYW5uZWxzKSAlIFNBTVBMRV9BUlJBWV9TSVpFXTsKLSAgICAgICAgICAgICAgICBpbnQgYyA9IHMtPnNhbXBsZV9hcnJheVsoaWR4ICsgNSAqIGNoYW5uZWxzKSAlIFNBTVBMRV9BUlJBWV9TSVpFXTsKLSAgICAgICAgICAgICAgICBpbnQgZCA9IHMtPnNhbXBsZV9hcnJheVsoaWR4ICsgOSAqIGNoYW5uZWxzKSAlIFNBTVBMRV9BUlJBWV9TSVpFXTsKLSAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSBhIC0gZDsKLSAgICAgICAgICAgICAgICBpZiAoaCA8IHNjb3JlICYmIChiIF4gYykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGggPSBzY29yZTsKLSAgICAgICAgICAgICAgICAgICAgaV9zdGFydCA9IGlkeDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBzLT5sYXN0X2lfc3RhcnQgPSBpX3N0YXJ0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlfc3RhcnQgPSBzLT5sYXN0X2lfc3RhcnQ7Ci0gICAgfQotCi0gICAgYmdjb2xvciA9IFNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIDB4MDAsIDB4MDAsIDB4MDApOwotICAgIGlmIChzLT5zaG93X21vZGUgPT0gU0hPV19NT0RFX1dBVkVTKSB7Ci0gICAgICAgIGZpbGxfcmVjdGFuZ2xlKHNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgcy0+eGxlZnQsIHMtPnl0b3AsIHMtPndpZHRoLCBzLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGJnY29sb3IsIDApOwotCi0gICAgICAgIGZnY29sb3IgPSBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAweGZmLCAweGZmLCAweGZmKTsKLQotICAgICAgICAvKiB0b3RhbCBoZWlnaHQgZm9yIG9uZSBjaGFubmVsICovCi0gICAgICAgIGggPSBzLT5oZWlnaHQgLyBuYl9kaXNwbGF5X2NoYW5uZWxzOwotICAgICAgICAvKiBncmFwaCBoZWlnaHQgLyAyICovCi0gICAgICAgIGgyID0gKGggKiA5KSAvIDIwOwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuYl9kaXNwbGF5X2NoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICBpID0gaV9zdGFydCArIGNoOwotICAgICAgICAgICAgeTEgPSBzLT55dG9wICsgY2ggKiBoICsgKGggLyAyKTsgLyogcG9zaXRpb24gb2YgY2VudGVyIGxpbmUgKi8KLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT53aWR0aDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgeSA9IChzLT5zYW1wbGVfYXJyYXlbaV0gKiBoMikgPj4gMTU7Ci0gICAgICAgICAgICAgICAgaWYgKHkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHkgPSAteTsKLSAgICAgICAgICAgICAgICAgICAgeXMgPSB5MSAtIHk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgeXMgPSB5MTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoc2NyZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnhsZWZ0ICsgeCwgeXMsIDEsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmdjb2xvciwgMCk7Ci0gICAgICAgICAgICAgICAgaSArPSBjaGFubmVsczsKLSAgICAgICAgICAgICAgICBpZiAoaSA+PSBTQU1QTEVfQVJSQVlfU0laRSkKLSAgICAgICAgICAgICAgICAgICAgaSAtPSBTQU1QTEVfQVJSQVlfU0laRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZnY29sb3IgPSBTRExfTWFwUkdCKHNjcmVlbi0+Zm9ybWF0LCAweDAwLCAweDAwLCAweGZmKTsKLQotICAgICAgICBmb3IgKGNoID0gMTsgY2ggPCBuYl9kaXNwbGF5X2NoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICB5ID0gcy0+eXRvcCArIGNoICogaDsKLSAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKHNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnhsZWZ0LCB5LCBzLT53aWR0aCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnY29sb3IsIDApOwotICAgICAgICB9Ci0gICAgICAgIFNETF9VcGRhdGVSZWN0KHNjcmVlbiwgcy0+eGxlZnQsIHMtPnl0b3AsIHMtPndpZHRoLCBzLT5oZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG5iX2Rpc3BsYXlfY2hhbm5lbHM9IEZGTUlOKG5iX2Rpc3BsYXlfY2hhbm5lbHMsIDIpOwotICAgICAgICBpZiAocmRmdF9iaXRzICE9IHMtPnJkZnRfYml0cykgewotICAgICAgICAgICAgYXZfcmRmdF9lbmQocy0+cmRmdCk7Ci0gICAgICAgICAgICBhdl9mcmVlKHMtPnJkZnRfZGF0YSk7Ci0gICAgICAgICAgICBzLT5yZGZ0ID0gYXZfcmRmdF9pbml0KHJkZnRfYml0cywgREZUX1IyQyk7Ci0gICAgICAgICAgICBzLT5yZGZ0X2JpdHMgPSByZGZ0X2JpdHM7Ci0gICAgICAgICAgICBzLT5yZGZ0X2RhdGEgPSBhdl9tYWxsb2NfYXJyYXkobmJfZnJlcSwgNCAqc2l6ZW9mKCpzLT5yZGZ0X2RhdGEpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXMtPnJkZnQgfHwgIXMtPnJkZnRfZGF0YSl7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMgZm9yIFJERlQsIHN3aXRjaGluZyB0byB3YXZlcyBkaXNwbGF5XG4iKTsKLSAgICAgICAgICAgIHMtPnNob3dfbW9kZSA9IFNIT1dfTU9ERV9XQVZFUzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZGVFNhbXBsZSAqZGF0YVsyXTsKLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2Rpc3BsYXlfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgICAgICBkYXRhW2NoXSA9IHMtPnJkZnRfZGF0YSArIDIgKiBuYl9mcmVxICogY2g7Ci0gICAgICAgICAgICAgICAgaSA9IGlfc3RhcnQgKyBjaDsKLSAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgMiAqIG5iX2ZyZXE7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgdyA9ICh4LW5iX2ZyZXEpICogKDEuMCAvIG5iX2ZyZXEpOwotICAgICAgICAgICAgICAgICAgICBkYXRhW2NoXVt4XSA9IHMtPnNhbXBsZV9hcnJheVtpXSAqICgxLjAgLSB3ICogdyk7Ci0gICAgICAgICAgICAgICAgICAgIGkgKz0gY2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID49IFNBTVBMRV9BUlJBWV9TSVpFKQotICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSBTQU1QTEVfQVJSQVlfU0laRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnQsIGRhdGFbY2hdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIExlYXN0IGVmZmljaWVudCB3YXkgdG8gZG8gdGhpcywgd2Ugc2hvdWxkIG9mIGNvdXJzZQotICAgICAgICAgICAgICogZGlyZWN0bHkgYWNjZXNzIGl0IGJ1dCBpdCBpcyBtb3JlIHRoYW4gZmFzdCBlbm91Z2guICovCi0gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+aGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgdyA9IDEgLyBzcXJ0KG5iX2ZyZXEpOwotICAgICAgICAgICAgICAgIGludCBhID0gc3FydCh3ICogaHlwb3QoZGF0YVswXVsyICogeSArIDBdLCBkYXRhWzBdWzIgKiB5ICsgMV0pKTsKLSAgICAgICAgICAgICAgICBpbnQgYiA9IChuYl9kaXNwbGF5X2NoYW5uZWxzID09IDIgKSA/IHNxcnQodyAqIGh5cG90KGRhdGFbMV1bMiAqIHkgKyAwXSwgZGF0YVsxXVsyICogeSArIDFdKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGE7Ci0gICAgICAgICAgICAgICAgYSA9IEZGTUlOKGEsIDI1NSk7Ci0gICAgICAgICAgICAgICAgYiA9IEZGTUlOKGIsIDI1NSk7Ci0gICAgICAgICAgICAgICAgZmdjb2xvciA9IFNETF9NYXBSR0Ioc2NyZWVuLT5mb3JtYXQsIGEsIGIsIChhICsgYikgLyAyKTsKLQotICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKHNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT54cG9zLCBzLT5oZWlnaHQteSwgMSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZ2NvbG9yLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBTRExfVXBkYXRlUmVjdChzY3JlZW4sIHMtPnhwb3MsIHMtPnl0b3AsIDEsIHMtPmhlaWdodCk7Ci0gICAgICAgIGlmICghcy0+cGF1c2VkKQotICAgICAgICAgICAgcy0+eHBvcysrOwotICAgICAgICBpZiAocy0+eHBvcyA+PSBzLT53aWR0aCkKLSAgICAgICAgICAgIHMtPnhwb3M9IHMtPnhsZWZ0OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgc3RyZWFtX2NvbXBvbmVudF9jbG9zZShWaWRlb1N0YXRlICppcywgaW50IHN0cmVhbV9pbmRleCkKLXsKLSAgICBBVkZvcm1hdENvbnRleHQgKmljID0gaXMtPmljOwotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKLQotICAgIGlmIChzdHJlYW1faW5kZXggPCAwIHx8IHN0cmVhbV9pbmRleCA+PSBpYy0+bmJfc3RyZWFtcykKLSAgICAgICAgcmV0dXJuOwotICAgIGF2Y3R4ID0gaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWM7Ci0KLSAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY190eXBlKSB7Ci0gICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgIGRlY29kZXJfYWJvcnQoJmlzLT5hdWRkZWMsICZpcy0+c2FtcHEpOwotICAgICAgICBTRExfQ2xvc2VBdWRpbygpOwotICAgICAgICBkZWNvZGVyX2Rlc3Ryb3koJmlzLT5hdWRkZWMpOwotICAgICAgICBzd3JfZnJlZSgmaXMtPnN3cl9jdHgpOwotICAgICAgICBhdl9mcmVlcCgmaXMtPmF1ZGlvX2J1ZjEpOwotICAgICAgICBpcy0+YXVkaW9fYnVmMV9zaXplID0gMDsKLSAgICAgICAgaXMtPmF1ZGlvX2J1ZiA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKGlzLT5yZGZ0KSB7Ci0gICAgICAgICAgICBhdl9yZGZ0X2VuZChpcy0+cmRmdCk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmaXMtPnJkZnRfZGF0YSk7Ci0gICAgICAgICAgICBpcy0+cmRmdCA9IE5VTEw7Ci0gICAgICAgICAgICBpcy0+cmRmdF9iaXRzID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgZGVjb2Rlcl9hYm9ydCgmaXMtPnZpZGRlYywgJmlzLT5waWN0cSk7Ci0gICAgICAgIGRlY29kZXJfZGVzdHJveSgmaXMtPnZpZGRlYyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgotICAgICAgICBkZWNvZGVyX2Fib3J0KCZpcy0+c3ViZGVjLCAmaXMtPnN1YnBxKTsKLSAgICAgICAgZGVjb2Rlcl9kZXN0cm95KCZpcy0+c3ViZGVjKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9BTEw7Ci0gICAgYXZjb2RlY19jbG9zZShhdmN0eCk7Ci0gICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfdHlwZSkgewotICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICBpcy0+YXVkaW9fc3QgPSBOVUxMOwotICAgICAgICBpcy0+YXVkaW9fc3RyZWFtID0gLTE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICBpcy0+dmlkZW9fc3QgPSBOVUxMOwotICAgICAgICBpcy0+dmlkZW9fc3RyZWFtID0gLTE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgotICAgICAgICBpcy0+c3VidGl0bGVfc3QgPSBOVUxMOwotICAgICAgICBpcy0+c3VidGl0bGVfc3RyZWFtID0gLTE7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgc3RyZWFtX2Nsb3NlKFZpZGVvU3RhdGUgKmlzKQotewotICAgIC8qIFhYWDogdXNlIGEgc3BlY2lhbCB1cmxfc2h1dGRvd24gY2FsbCB0byBhYm9ydCBwYXJzZSBjbGVhbmx5ICovCi0gICAgaXMtPmFib3J0X3JlcXVlc3QgPSAxOwotICAgIFNETF9XYWl0VGhyZWFkKGlzLT5yZWFkX3RpZCwgTlVMTCk7Ci0KLSAgICAvKiBjbG9zZSBlYWNoIHN0cmVhbSAqLwotICAgIGlmIChpcy0+YXVkaW9fc3RyZWFtID49IDApCi0gICAgICAgIHN0cmVhbV9jb21wb25lbnRfY2xvc2UoaXMsIGlzLT5hdWRpb19zdHJlYW0pOwotICAgIGlmIChpcy0+dmlkZW9fc3RyZWFtID49IDApCi0gICAgICAgIHN0cmVhbV9jb21wb25lbnRfY2xvc2UoaXMsIGlzLT52aWRlb19zdHJlYW0pOwotICAgIGlmIChpcy0+c3VidGl0bGVfc3RyZWFtID49IDApCi0gICAgICAgIHN0cmVhbV9jb21wb25lbnRfY2xvc2UoaXMsIGlzLT5zdWJ0aXRsZV9zdHJlYW0pOwotCi0gICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmlzLT5pYyk7Ci0KLSAgICBwYWNrZXRfcXVldWVfZGVzdHJveSgmaXMtPnZpZGVvcSk7Ci0gICAgcGFja2V0X3F1ZXVlX2Rlc3Ryb3koJmlzLT5hdWRpb3EpOwotICAgIHBhY2tldF9xdWV1ZV9kZXN0cm95KCZpcy0+c3VidGl0bGVxKTsKLQotICAgIC8qIGZyZWUgYWxsIHBpY3R1cmVzICovCi0gICAgZnJhbWVfcXVldWVfZGVzdG9yeSgmaXMtPnBpY3RxKTsKLSAgICBmcmFtZV9xdWV1ZV9kZXN0b3J5KCZpcy0+c2FtcHEpOwotICAgIGZyYW1lX3F1ZXVlX2Rlc3RvcnkoJmlzLT5zdWJwcSk7Ci0gICAgU0RMX0Rlc3Ryb3lDb25kKGlzLT5jb250aW51ZV9yZWFkX3RocmVhZCk7Ci0jaWYgIUNPTkZJR19BVkZJTFRFUgotICAgIHN3c19mcmVlQ29udGV4dChpcy0+aW1nX2NvbnZlcnRfY3R4KTsKLSNlbmRpZgotICAgIHN3c19mcmVlQ29udGV4dChpcy0+c3ViX2NvbnZlcnRfY3R4KTsKLSAgICBhdl9mcmVlKGlzLT5maWxlbmFtZSk7Ci0gICAgYXZfZnJlZShpcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX2V4aXQoVmlkZW9TdGF0ZSAqaXMpCi17Ci0gICAgaWYgKGlzKSB7Ci0gICAgICAgIHN0cmVhbV9jbG9zZShpcyk7Ci0gICAgfQotICAgIGF2X2xvY2ttZ3JfcmVnaXN0ZXIoTlVMTCk7Ci0gICAgdW5pbml0X29wdHMoKTsKLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICBhdl9mcmVlcCgmdmZpbHRlcnNfbGlzdCk7Ci0jZW5kaWYKLSAgICBhdmZvcm1hdF9uZXR3b3JrX2RlaW5pdCgpOwotICAgIGlmIChzaG93X3N0YXR1cykKLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgIFNETF9RdWl0KCk7Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19RVUlFVCwgIiVzIiwgIiIpOwotICAgIGV4aXQoMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNpZ3Rlcm1faGFuZGxlcihpbnQgc2lnKQotewotICAgIGV4aXQoMTIzKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfd2luZG93X3NpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBBVlJhdGlvbmFsIHNhcikKLXsKLSAgICBTRExfUmVjdCByZWN0OwotICAgIGNhbGN1bGF0ZV9kaXNwbGF5X3JlY3QoJnJlY3QsIDAsIDAsIElOVF9NQVgsIGhlaWdodCwgd2lkdGgsIGhlaWdodCwgc2FyKTsKLSAgICBkZWZhdWx0X3dpZHRoICA9IHJlY3QudzsKLSAgICBkZWZhdWx0X2hlaWdodCA9IHJlY3QuaDsKLX0KLQotc3RhdGljIGludCB2aWRlb19vcGVuKFZpZGVvU3RhdGUgKmlzLCBpbnQgZm9yY2Vfc2V0X3ZpZGVvX21vZGUsIEZyYW1lICp2cCkKLXsKLSAgICBpbnQgZmxhZ3MgPSBTRExfSFdTVVJGQUNFIHwgU0RMX0FTWU5DQkxJVCB8IFNETF9IV0FDQ0VMOwotICAgIGludCB3LGg7Ci0KLSAgICBpZiAoaXNfZnVsbF9zY3JlZW4pIGZsYWdzIHw9IFNETF9GVUxMU0NSRUVOOwotICAgIGVsc2UgICAgICAgICAgICAgICAgZmxhZ3MgfD0gU0RMX1JFU0laQUJMRTsKLQotICAgIGlmICh2cCAmJiB2cC0+d2lkdGgpCi0gICAgICAgIHNldF9kZWZhdWx0X3dpbmRvd19zaXplKHZwLT53aWR0aCwgdnAtPmhlaWdodCwgdnAtPnNhcik7Ci0KLSAgICBpZiAoaXNfZnVsbF9zY3JlZW4gJiYgZnNfc2NyZWVuX3dpZHRoKSB7Ci0gICAgICAgIHcgPSBmc19zY3JlZW5fd2lkdGg7Ci0gICAgICAgIGggPSBmc19zY3JlZW5faGVpZ2h0OwotICAgIH0gZWxzZSBpZiAoIWlzX2Z1bGxfc2NyZWVuICYmIHNjcmVlbl93aWR0aCkgewotICAgICAgICB3ID0gc2NyZWVuX3dpZHRoOwotICAgICAgICBoID0gc2NyZWVuX2hlaWdodDsKLSAgICB9IGVsc2UgewotICAgICAgICB3ID0gZGVmYXVsdF93aWR0aDsKLSAgICAgICAgaCA9IGRlZmF1bHRfaGVpZ2h0OwotICAgIH0KLSAgICB3ID0gRkZNSU4oMTYzODMsIHcpOwotICAgIGlmIChzY3JlZW4gJiYgaXMtPndpZHRoID09IHNjcmVlbi0+dyAmJiBzY3JlZW4tPncgPT0gdwotICAgICAgICYmIGlzLT5oZWlnaHQ9PSBzY3JlZW4tPmggJiYgc2NyZWVuLT5oID09IGggJiYgIWZvcmNlX3NldF92aWRlb19tb2RlKQotICAgICAgICByZXR1cm4gMDsKLSAgICBzY3JlZW4gPSBTRExfU2V0VmlkZW9Nb2RlKHcsIGgsIDAsIGZsYWdzKTsKLSAgICBpZiAoIXNjcmVlbikgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU0RMOiBjb3VsZCBub3Qgc2V0IHZpZGVvIG1vZGUgLSBleGl0aW5nXG4iKTsKLSAgICAgICAgZG9fZXhpdChpcyk7Ci0gICAgfQotICAgIGlmICghd2luZG93X3RpdGxlKQotICAgICAgICB3aW5kb3dfdGl0bGUgPSBpbnB1dF9maWxlbmFtZTsKLSAgICBTRExfV01fU2V0Q2FwdGlvbih3aW5kb3dfdGl0bGUsIHdpbmRvd190aXRsZSk7Ci0KLSAgICBpcy0+d2lkdGggID0gc2NyZWVuLT53OwotICAgIGlzLT5oZWlnaHQgPSBzY3JlZW4tPmg7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogZGlzcGxheSB0aGUgY3VycmVudCBwaWN0dXJlLCBpZiBhbnkgKi8KLXN0YXRpYyB2b2lkIHZpZGVvX2Rpc3BsYXkoVmlkZW9TdGF0ZSAqaXMpCi17Ci0gICAgaWYgKCFzY3JlZW4pCi0gICAgICAgIHZpZGVvX29wZW4oaXMsIDAsIE5VTEwpOwotICAgIGlmIChpcy0+YXVkaW9fc3QgJiYgaXMtPnNob3dfbW9kZSAhPSBTSE9XX01PREVfVklERU8pCi0gICAgICAgIHZpZGVvX2F1ZGlvX2Rpc3BsYXkoaXMpOwotICAgIGVsc2UgaWYgKGlzLT52aWRlb19zdCkKLSAgICAgICAgdmlkZW9faW1hZ2VfZGlzcGxheShpcyk7Ci19Ci0KLXN0YXRpYyBkb3VibGUgZ2V0X2Nsb2NrKENsb2NrICpjKQotewotICAgIGlmICgqYy0+cXVldWVfc2VyaWFsICE9IGMtPnNlcmlhbCkKLSAgICAgICAgcmV0dXJuIE5BTjsKLSAgICBpZiAoYy0+cGF1c2VkKSB7Ci0gICAgICAgIHJldHVybiBjLT5wdHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZG91YmxlIHRpbWUgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLyAxMDAwMDAwLjA7Ci0gICAgICAgIHJldHVybiBjLT5wdHNfZHJpZnQgKyB0aW1lIC0gKHRpbWUgLSBjLT5sYXN0X3VwZGF0ZWQpICogKDEuMCAtIGMtPnNwZWVkKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9jbG9ja19hdChDbG9jayAqYywgZG91YmxlIHB0cywgaW50IHNlcmlhbCwgZG91YmxlIHRpbWUpCi17Ci0gICAgYy0+cHRzID0gcHRzOwotICAgIGMtPmxhc3RfdXBkYXRlZCA9IHRpbWU7Ci0gICAgYy0+cHRzX2RyaWZ0ID0gYy0+cHRzIC0gdGltZTsKLSAgICBjLT5zZXJpYWwgPSBzZXJpYWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9jbG9jayhDbG9jayAqYywgZG91YmxlIHB0cywgaW50IHNlcmlhbCkKLXsKLSAgICBkb3VibGUgdGltZSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAvIDEwMDAwMDAuMDsKLSAgICBzZXRfY2xvY2tfYXQoYywgcHRzLCBzZXJpYWwsIHRpbWUpOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfY2xvY2tfc3BlZWQoQ2xvY2sgKmMsIGRvdWJsZSBzcGVlZCkKLXsKLSAgICBzZXRfY2xvY2soYywgZ2V0X2Nsb2NrKGMpLCBjLT5zZXJpYWwpOwotICAgIGMtPnNwZWVkID0gc3BlZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfY2xvY2soQ2xvY2sgKmMsIGludCAqcXVldWVfc2VyaWFsKQotewotICAgIGMtPnNwZWVkID0gMS4wOwotICAgIGMtPnBhdXNlZCA9IDA7Ci0gICAgYy0+cXVldWVfc2VyaWFsID0gcXVldWVfc2VyaWFsOwotICAgIHNldF9jbG9jayhjLCBOQU4sIC0xKTsKLX0KLQotc3RhdGljIHZvaWQgc3luY19jbG9ja190b19zbGF2ZShDbG9jayAqYywgQ2xvY2sgKnNsYXZlKQotewotICAgIGRvdWJsZSBjbG9jayA9IGdldF9jbG9jayhjKTsKLSAgICBkb3VibGUgc2xhdmVfY2xvY2sgPSBnZXRfY2xvY2soc2xhdmUpOwotICAgIGlmICghaXNuYW4oc2xhdmVfY2xvY2spICYmIChpc25hbihjbG9jaykgfHwgZmFicyhjbG9jayAtIHNsYXZlX2Nsb2NrKSA+IEFWX05PU1lOQ19USFJFU0hPTEQpKQotICAgICAgICBzZXRfY2xvY2soYywgc2xhdmVfY2xvY2ssIHNsYXZlLT5zZXJpYWwpOwotfQotCi1zdGF0aWMgaW50IGdldF9tYXN0ZXJfc3luY190eXBlKFZpZGVvU3RhdGUgKmlzKSB7Ci0gICAgaWYgKGlzLT5hdl9zeW5jX3R5cGUgPT0gQVZfU1lOQ19WSURFT19NQVNURVIpIHsKLSAgICAgICAgaWYgKGlzLT52aWRlb19zdCkKLSAgICAgICAgICAgIHJldHVybiBBVl9TWU5DX1ZJREVPX01BU1RFUjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEFWX1NZTkNfQVVESU9fTUFTVEVSOwotICAgIH0gZWxzZSBpZiAoaXMtPmF2X3N5bmNfdHlwZSA9PSBBVl9TWU5DX0FVRElPX01BU1RFUikgewotICAgICAgICBpZiAoaXMtPmF1ZGlvX3N0KQotICAgICAgICAgICAgcmV0dXJuIEFWX1NZTkNfQVVESU9fTUFTVEVSOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gQVZfU1lOQ19FWFRFUk5BTF9DTE9DSzsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQVZfU1lOQ19FWFRFUk5BTF9DTE9DSzsKLSAgICB9Ci19Ci0KLS8qIGdldCB0aGUgY3VycmVudCBtYXN0ZXIgY2xvY2sgdmFsdWUgKi8KLXN0YXRpYyBkb3VibGUgZ2V0X21hc3Rlcl9jbG9jayhWaWRlb1N0YXRlICppcykKLXsKLSAgICBkb3VibGUgdmFsOwotCi0gICAgc3dpdGNoIChnZXRfbWFzdGVyX3N5bmNfdHlwZShpcykpIHsKLSAgICAgICAgY2FzZSBBVl9TWU5DX1ZJREVPX01BU1RFUjoKLSAgICAgICAgICAgIHZhbCA9IGdldF9jbG9jaygmaXMtPnZpZGNsayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVl9TWU5DX0FVRElPX01BU1RFUjoKLSAgICAgICAgICAgIHZhbCA9IGdldF9jbG9jaygmaXMtPmF1ZGNsayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHZhbCA9IGdldF9jbG9jaygmaXMtPmV4dGNsayk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfZXh0ZXJuYWxfY2xvY2tfc3BlZWQoVmlkZW9TdGF0ZSAqaXMpIHsKLSAgIGlmIChpcy0+dmlkZW9fc3RyZWFtID49IDAgJiYgaXMtPnZpZGVvcS5uYl9wYWNrZXRzIDw9IEVYVEVSTkFMX0NMT0NLX01JTl9GUkFNRVMgfHwKLSAgICAgICBpcy0+YXVkaW9fc3RyZWFtID49IDAgJiYgaXMtPmF1ZGlvcS5uYl9wYWNrZXRzIDw9IEVYVEVSTkFMX0NMT0NLX01JTl9GUkFNRVMpIHsKLSAgICAgICBzZXRfY2xvY2tfc3BlZWQoJmlzLT5leHRjbGssIEZGTUFYKEVYVEVSTkFMX0NMT0NLX1NQRUVEX01JTiwgaXMtPmV4dGNsay5zcGVlZCAtIEVYVEVSTkFMX0NMT0NLX1NQRUVEX1NURVApKTsKLSAgIH0gZWxzZSBpZiAoKGlzLT52aWRlb19zdHJlYW0gPCAwIHx8IGlzLT52aWRlb3EubmJfcGFja2V0cyA+IEVYVEVSTkFMX0NMT0NLX01BWF9GUkFNRVMpICYmCi0gICAgICAgICAgICAgIChpcy0+YXVkaW9fc3RyZWFtIDwgMCB8fCBpcy0+YXVkaW9xLm5iX3BhY2tldHMgPiBFWFRFUk5BTF9DTE9DS19NQVhfRlJBTUVTKSkgewotICAgICAgIHNldF9jbG9ja19zcGVlZCgmaXMtPmV4dGNsaywgRkZNSU4oRVhURVJOQUxfQ0xPQ0tfU1BFRURfTUFYLCBpcy0+ZXh0Y2xrLnNwZWVkICsgRVhURVJOQUxfQ0xPQ0tfU1BFRURfU1RFUCkpOwotICAgfSBlbHNlIHsKLSAgICAgICBkb3VibGUgc3BlZWQgPSBpcy0+ZXh0Y2xrLnNwZWVkOwotICAgICAgIGlmIChzcGVlZCAhPSAxLjApCi0gICAgICAgICAgIHNldF9jbG9ja19zcGVlZCgmaXMtPmV4dGNsaywgc3BlZWQgKyBFWFRFUk5BTF9DTE9DS19TUEVFRF9TVEVQICogKDEuMCAtIHNwZWVkKSAvIGZhYnMoMS4wIC0gc3BlZWQpKTsKLSAgIH0KLX0KLQotLyogc2VlayBpbiB0aGUgc3RyZWFtICovCi1zdGF0aWMgdm9pZCBzdHJlYW1fc2VlayhWaWRlb1N0YXRlICppcywgaW50NjRfdCBwb3MsIGludDY0X3QgcmVsLCBpbnQgc2Vla19ieV9ieXRlcykKLXsKLSAgICBpZiAoIWlzLT5zZWVrX3JlcSkgewotICAgICAgICBpcy0+c2Vla19wb3MgPSBwb3M7Ci0gICAgICAgIGlzLT5zZWVrX3JlbCA9IHJlbDsKLSAgICAgICAgaXMtPnNlZWtfZmxhZ3MgJj0gfkFWU0VFS19GTEFHX0JZVEU7Ci0gICAgICAgIGlmIChzZWVrX2J5X2J5dGVzKQotICAgICAgICAgICAgaXMtPnNlZWtfZmxhZ3MgfD0gQVZTRUVLX0ZMQUdfQllURTsKLSAgICAgICAgaXMtPnNlZWtfcmVxID0gMTsKLSAgICAgICAgU0RMX0NvbmRTaWduYWwoaXMtPmNvbnRpbnVlX3JlYWRfdGhyZWFkKTsKLSAgICB9Ci19Ci0KLS8qIHBhdXNlIG9yIHJlc3VtZSB0aGUgdmlkZW8gKi8KLXN0YXRpYyB2b2lkIHN0cmVhbV90b2dnbGVfcGF1c2UoVmlkZW9TdGF0ZSAqaXMpCi17Ci0gICAgaWYgKGlzLT5wYXVzZWQpIHsKLSAgICAgICAgaXMtPmZyYW1lX3RpbWVyICs9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAvIDEwMDAwMDAuMCAtIGlzLT52aWRjbGsubGFzdF91cGRhdGVkOwotICAgICAgICBpZiAoaXMtPnJlYWRfcGF1c2VfcmV0dXJuICE9IEFWRVJST1IoRU5PU1lTKSkgewotICAgICAgICAgICAgaXMtPnZpZGNsay5wYXVzZWQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIHNldF9jbG9jaygmaXMtPnZpZGNsaywgZ2V0X2Nsb2NrKCZpcy0+dmlkY2xrKSwgaXMtPnZpZGNsay5zZXJpYWwpOwotICAgIH0KLSAgICBzZXRfY2xvY2soJmlzLT5leHRjbGssIGdldF9jbG9jaygmaXMtPmV4dGNsayksIGlzLT5leHRjbGsuc2VyaWFsKTsKLSAgICBpcy0+cGF1c2VkID0gaXMtPmF1ZGNsay5wYXVzZWQgPSBpcy0+dmlkY2xrLnBhdXNlZCA9IGlzLT5leHRjbGsucGF1c2VkID0gIWlzLT5wYXVzZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHRvZ2dsZV9wYXVzZShWaWRlb1N0YXRlICppcykKLXsKLSAgICBzdHJlYW1fdG9nZ2xlX3BhdXNlKGlzKTsKLSAgICBpcy0+c3RlcCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHRvZ2dsZV9tdXRlKFZpZGVvU3RhdGUgKmlzKQotewotICAgIGlzLT5tdXRlZCA9ICFpcy0+bXV0ZWQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV92b2x1bWUoVmlkZW9TdGF0ZSAqaXMsIGludCBzaWduLCBpbnQgc3RlcCkKLXsKLSAgICBpcy0+YXVkaW9fdm9sdW1lID0gYXZfY2xpcChpcy0+YXVkaW9fdm9sdW1lICsgc2lnbiAqIHN0ZXAsIDAsIFNETF9NSVhfTUFYVk9MVU1FKTsKLX0KLQotc3RhdGljIHZvaWQgc3RlcF90b19uZXh0X2ZyYW1lKFZpZGVvU3RhdGUgKmlzKQotewotICAgIC8qIGlmIHRoZSBzdHJlYW0gaXMgcGF1c2VkIHVucGF1c2UgaXQsIHRoZW4gc3RlcCAqLwotICAgIGlmIChpcy0+cGF1c2VkKQotICAgICAgICBzdHJlYW1fdG9nZ2xlX3BhdXNlKGlzKTsKLSAgICBpcy0+c3RlcCA9IDE7Ci19Ci0KLXN0YXRpYyBkb3VibGUgY29tcHV0ZV90YXJnZXRfZGVsYXkoZG91YmxlIGRlbGF5LCBWaWRlb1N0YXRlICppcykKLXsKLSAgICBkb3VibGUgc3luY190aHJlc2hvbGQsIGRpZmYgPSAwOwotCi0gICAgLyogdXBkYXRlIGRlbGF5IHRvIGZvbGxvdyBtYXN0ZXIgc3luY2hyb25pc2F0aW9uIHNvdXJjZSAqLwotICAgIGlmIChnZXRfbWFzdGVyX3N5bmNfdHlwZShpcykgIT0gQVZfU1lOQ19WSURFT19NQVNURVIpIHsKLSAgICAgICAgLyogaWYgdmlkZW8gaXMgc2xhdmUsIHdlIHRyeSB0byBjb3JyZWN0IGJpZyBkZWxheXMgYnkKLSAgICAgICAgICAgZHVwbGljYXRpbmcgb3IgZGVsZXRpbmcgYSBmcmFtZSAqLwotICAgICAgICBkaWZmID0gZ2V0X2Nsb2NrKCZpcy0+dmlkY2xrKSAtIGdldF9tYXN0ZXJfY2xvY2soaXMpOwotCi0gICAgICAgIC8qIHNraXAgb3IgcmVwZWF0IGZyYW1lLiBXZSB0YWtlIGludG8gYWNjb3VudCB0aGUKLSAgICAgICAgICAgZGVsYXkgdG8gY29tcHV0ZSB0aGUgdGhyZXNob2xkLiBJIHN0aWxsIGRvbid0IGtub3cKLSAgICAgICAgICAgaWYgaXQgaXMgdGhlIGJlc3QgZ3Vlc3MgKi8KLSAgICAgICAgc3luY190aHJlc2hvbGQgPSBGRk1BWChBVl9TWU5DX1RIUkVTSE9MRF9NSU4sIEZGTUlOKEFWX1NZTkNfVEhSRVNIT0xEX01BWCwgZGVsYXkpKTsKLSAgICAgICAgaWYgKCFpc25hbihkaWZmKSAmJiBmYWJzKGRpZmYpIDwgaXMtPm1heF9mcmFtZV9kdXJhdGlvbikgewotICAgICAgICAgICAgaWYgKGRpZmYgPD0gLXN5bmNfdGhyZXNob2xkKQotICAgICAgICAgICAgICAgIGRlbGF5ID0gRkZNQVgoMCwgZGVsYXkgKyBkaWZmKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGRpZmYgPj0gc3luY190aHJlc2hvbGQgJiYgZGVsYXkgPiBBVl9TWU5DX0ZSQU1FRFVQX1RIUkVTSE9MRCkKLSAgICAgICAgICAgICAgICBkZWxheSA9IGRlbGF5ICsgZGlmZjsKLSAgICAgICAgICAgIGVsc2UgaWYgKGRpZmYgPj0gc3luY190aHJlc2hvbGQpCi0gICAgICAgICAgICAgICAgZGVsYXkgPSAyICogZGVsYXk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1RSQUNFLCAidmlkZW86IGRlbGF5PSUwLjNmIEEtVj0lZlxuIiwKLSAgICAgICAgICAgIGRlbGF5LCAtZGlmZik7Ci0KLSAgICByZXR1cm4gZGVsYXk7Ci19Ci0KLXN0YXRpYyBkb3VibGUgdnBfZHVyYXRpb24oVmlkZW9TdGF0ZSAqaXMsIEZyYW1lICp2cCwgRnJhbWUgKm5leHR2cCkgewotICAgIGlmICh2cC0+c2VyaWFsID09IG5leHR2cC0+c2VyaWFsKSB7Ci0gICAgICAgIGRvdWJsZSBkdXJhdGlvbiA9IG5leHR2cC0+cHRzIC0gdnAtPnB0czsKLSAgICAgICAgaWYgKGlzbmFuKGR1cmF0aW9uKSB8fCBkdXJhdGlvbiA8PSAwIHx8IGR1cmF0aW9uID4gaXMtPm1heF9mcmFtZV9kdXJhdGlvbikKLSAgICAgICAgICAgIHJldHVybiB2cC0+ZHVyYXRpb247Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBkdXJhdGlvbjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMC4wOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX3ZpZGVvX3B0cyhWaWRlb1N0YXRlICppcywgZG91YmxlIHB0cywgaW50NjRfdCBwb3MsIGludCBzZXJpYWwpIHsKLSAgICAvKiB1cGRhdGUgY3VycmVudCB2aWRlbyBwdHMgKi8KLSAgICBzZXRfY2xvY2soJmlzLT52aWRjbGssIHB0cywgc2VyaWFsKTsKLSAgICBzeW5jX2Nsb2NrX3RvX3NsYXZlKCZpcy0+ZXh0Y2xrLCAmaXMtPnZpZGNsayk7Ci19Ci0KLS8qIGNhbGxlZCB0byBkaXNwbGF5IGVhY2ggZnJhbWUgKi8KLXN0YXRpYyB2b2lkIHZpZGVvX3JlZnJlc2godm9pZCAqb3BhcXVlLCBkb3VibGUgKnJlbWFpbmluZ190aW1lKQotewotICAgIFZpZGVvU3RhdGUgKmlzID0gb3BhcXVlOwotICAgIGRvdWJsZSB0aW1lOwotCi0gICAgRnJhbWUgKnNwLCAqc3AyOwotCi0gICAgaWYgKCFpcy0+cGF1c2VkICYmIGdldF9tYXN0ZXJfc3luY190eXBlKGlzKSA9PSBBVl9TWU5DX0VYVEVSTkFMX0NMT0NLICYmIGlzLT5yZWFsdGltZSkKLSAgICAgICAgY2hlY2tfZXh0ZXJuYWxfY2xvY2tfc3BlZWQoaXMpOwotCi0gICAgaWYgKCFkaXNwbGF5X2Rpc2FibGUgJiYgaXMtPnNob3dfbW9kZSAhPSBTSE9XX01PREVfVklERU8gJiYgaXMtPmF1ZGlvX3N0KSB7Ci0gICAgICAgIHRpbWUgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLyAxMDAwMDAwLjA7Ci0gICAgICAgIGlmIChpcy0+Zm9yY2VfcmVmcmVzaCB8fCBpcy0+bGFzdF92aXNfdGltZSArIHJkZnRzcGVlZCA8IHRpbWUpIHsKLSAgICAgICAgICAgIHZpZGVvX2Rpc3BsYXkoaXMpOwotICAgICAgICAgICAgaXMtPmxhc3RfdmlzX3RpbWUgPSB0aW1lOwotICAgICAgICB9Ci0gICAgICAgICpyZW1haW5pbmdfdGltZSA9IEZGTUlOKCpyZW1haW5pbmdfdGltZSwgaXMtPmxhc3RfdmlzX3RpbWUgKyByZGZ0c3BlZWQgLSB0aW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoaXMtPnZpZGVvX3N0KSB7Ci0gICAgICAgIGludCByZWRpc3BsYXkgPSAwOwotICAgICAgICBpZiAoaXMtPmZvcmNlX3JlZnJlc2gpCi0gICAgICAgICAgICByZWRpc3BsYXkgPSBmcmFtZV9xdWV1ZV9wcmV2KCZpcy0+cGljdHEpOwotcmV0cnk6Ci0gICAgICAgIGlmIChmcmFtZV9xdWV1ZV9uYl9yZW1haW5pbmcoJmlzLT5waWN0cSkgPT0gMCkgewotICAgICAgICAgICAgLy8gbm90aGluZyB0byBkbywgbm8gcGljdHVyZSB0byBkaXNwbGF5IGluIHRoZSBxdWV1ZQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZG91YmxlIGxhc3RfZHVyYXRpb24sIGR1cmF0aW9uLCBkZWxheTsKLSAgICAgICAgICAgIEZyYW1lICp2cCwgKmxhc3R2cDsKLQotICAgICAgICAgICAgLyogZGVxdWV1ZSB0aGUgcGljdHVyZSAqLwotICAgICAgICAgICAgbGFzdHZwID0gZnJhbWVfcXVldWVfcGVla19sYXN0KCZpcy0+cGljdHEpOwotICAgICAgICAgICAgdnAgPSBmcmFtZV9xdWV1ZV9wZWVrKCZpcy0+cGljdHEpOwotCi0gICAgICAgICAgICBpZiAodnAtPnNlcmlhbCAhPSBpcy0+dmlkZW9xLnNlcmlhbCkgewotICAgICAgICAgICAgICAgIGZyYW1lX3F1ZXVlX25leHQoJmlzLT5waWN0cSk7Ci0gICAgICAgICAgICAgICAgcmVkaXNwbGF5ID0gMDsKLSAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGFzdHZwLT5zZXJpYWwgIT0gdnAtPnNlcmlhbCAmJiAhcmVkaXNwbGF5KQotICAgICAgICAgICAgICAgIGlzLT5mcmFtZV90aW1lciA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAvIDEwMDAwMDAuMDsKLQotICAgICAgICAgICAgaWYgKGlzLT5wYXVzZWQpCi0gICAgICAgICAgICAgICAgZ290byBkaXNwbGF5OwotCi0gICAgICAgICAgICAvKiBjb21wdXRlIG5vbWluYWwgbGFzdF9kdXJhdGlvbiAqLwotICAgICAgICAgICAgbGFzdF9kdXJhdGlvbiA9IHZwX2R1cmF0aW9uKGlzLCBsYXN0dnAsIHZwKTsKLSAgICAgICAgICAgIGlmIChyZWRpc3BsYXkpCi0gICAgICAgICAgICAgICAgZGVsYXkgPSAwLjA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVsYXkgPSBjb21wdXRlX3RhcmdldF9kZWxheShsYXN0X2R1cmF0aW9uLCBpcyk7Ci0KLSAgICAgICAgICAgIHRpbWU9IGF2X2dldHRpbWVfcmVsYXRpdmUoKS8xMDAwMDAwLjA7Ci0gICAgICAgICAgICBpZiAodGltZSA8IGlzLT5mcmFtZV90aW1lciArIGRlbGF5ICYmICFyZWRpc3BsYXkpIHsKLSAgICAgICAgICAgICAgICAqcmVtYWluaW5nX3RpbWUgPSBGRk1JTihpcy0+ZnJhbWVfdGltZXIgKyBkZWxheSAtIHRpbWUsICpyZW1haW5pbmdfdGltZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpcy0+ZnJhbWVfdGltZXIgKz0gZGVsYXk7Ci0gICAgICAgICAgICBpZiAoZGVsYXkgPiAwICYmIHRpbWUgLSBpcy0+ZnJhbWVfdGltZXIgPiBBVl9TWU5DX1RIUkVTSE9MRF9NQVgpCi0gICAgICAgICAgICAgICAgaXMtPmZyYW1lX3RpbWVyID0gdGltZTsKLQotICAgICAgICAgICAgU0RMX0xvY2tNdXRleChpcy0+cGljdHEubXV0ZXgpOwotICAgICAgICAgICAgaWYgKCFyZWRpc3BsYXkgJiYgIWlzbmFuKHZwLT5wdHMpKQotICAgICAgICAgICAgICAgIHVwZGF0ZV92aWRlb19wdHMoaXMsIHZwLT5wdHMsIHZwLT5wb3MsIHZwLT5zZXJpYWwpOwotICAgICAgICAgICAgU0RMX1VubG9ja011dGV4KGlzLT5waWN0cS5tdXRleCk7Ci0KLSAgICAgICAgICAgIGlmIChmcmFtZV9xdWV1ZV9uYl9yZW1haW5pbmcoJmlzLT5waWN0cSkgPiAxKSB7Ci0gICAgICAgICAgICAgICAgRnJhbWUgKm5leHR2cCA9IGZyYW1lX3F1ZXVlX3BlZWtfbmV4dCgmaXMtPnBpY3RxKTsKLSAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHZwX2R1cmF0aW9uKGlzLCB2cCwgbmV4dHZwKTsKLSAgICAgICAgICAgICAgICBpZighaXMtPnN0ZXAgJiYgKHJlZGlzcGxheSB8fCBmcmFtZWRyb3A+MCB8fCAoZnJhbWVkcm9wICYmIGdldF9tYXN0ZXJfc3luY190eXBlKGlzKSAhPSBBVl9TWU5DX1ZJREVPX01BU1RFUikpICYmIHRpbWUgPiBpcy0+ZnJhbWVfdGltZXIgKyBkdXJhdGlvbil7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghcmVkaXNwbGF5KQotICAgICAgICAgICAgICAgICAgICAgICAgaXMtPmZyYW1lX2Ryb3BzX2xhdGUrKzsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVfcXVldWVfbmV4dCgmaXMtPnBpY3RxKTsKLSAgICAgICAgICAgICAgICAgICAgcmVkaXNwbGF5ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpcy0+c3VidGl0bGVfc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lX3F1ZXVlX25iX3JlbWFpbmluZygmaXMtPnN1YnBxKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gZnJhbWVfcXVldWVfcGVlaygmaXMtPnN1YnBxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lX3F1ZXVlX25iX3JlbWFpbmluZygmaXMtPnN1YnBxKSA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AyID0gZnJhbWVfcXVldWVfcGVla19uZXh0KCZpcy0+c3VicHEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwMiA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcC0+c2VyaWFsICE9IGlzLT5zdWJ0aXRsZXEuc2VyaWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpcy0+dmlkY2xrLnB0cyA+IChzcC0+cHRzICsgKChmbG9hdCkgc3AtPnN1Yi5lbmRfZGlzcGxheV90aW1lIC8gMTAwMCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3AyICYmIGlzLT52aWRjbGsucHRzID4gKHNwMi0+cHRzICsgKChmbG9hdCkgc3AyLT5zdWIuc3RhcnRfZGlzcGxheV90aW1lIC8gMTAwMCkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9xdWV1ZV9uZXh0KCZpcy0+c3VicHEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi1kaXNwbGF5OgotICAgICAgICAgICAgLyogZGlzcGxheSBwaWN0dXJlICovCi0gICAgICAgICAgICBpZiAoIWRpc3BsYXlfZGlzYWJsZSAmJiBpcy0+c2hvd19tb2RlID09IFNIT1dfTU9ERV9WSURFTykKLSAgICAgICAgICAgICAgICB2aWRlb19kaXNwbGF5KGlzKTsKLQotICAgICAgICAgICAgZnJhbWVfcXVldWVfbmV4dCgmaXMtPnBpY3RxKTsKLQotICAgICAgICAgICAgaWYgKGlzLT5zdGVwICYmICFpcy0+cGF1c2VkKQotICAgICAgICAgICAgICAgIHN0cmVhbV90b2dnbGVfcGF1c2UoaXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlzLT5mb3JjZV9yZWZyZXNoID0gMDsKLSAgICBpZiAoc2hvd19zdGF0dXMpIHsKLSAgICAgICAgc3RhdGljIGludDY0X3QgbGFzdF90aW1lOwotICAgICAgICBpbnQ2NF90IGN1cl90aW1lOwotICAgICAgICBpbnQgYXFzaXplLCB2cXNpemUsIHNxc2l6ZTsKLSAgICAgICAgZG91YmxlIGF2X2RpZmY7Ci0KLSAgICAgICAgY3VyX3RpbWUgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7Ci0gICAgICAgIGlmICghbGFzdF90aW1lIHx8IChjdXJfdGltZSAtIGxhc3RfdGltZSkgPj0gMzAwMDApIHsKLSAgICAgICAgICAgIGFxc2l6ZSA9IDA7Ci0gICAgICAgICAgICB2cXNpemUgPSAwOwotICAgICAgICAgICAgc3FzaXplID0gMDsKLSAgICAgICAgICAgIGlmIChpcy0+YXVkaW9fc3QpCi0gICAgICAgICAgICAgICAgYXFzaXplID0gaXMtPmF1ZGlvcS5zaXplOwotICAgICAgICAgICAgaWYgKGlzLT52aWRlb19zdCkKLSAgICAgICAgICAgICAgICB2cXNpemUgPSBpcy0+dmlkZW9xLnNpemU7Ci0gICAgICAgICAgICBpZiAoaXMtPnN1YnRpdGxlX3N0KQotICAgICAgICAgICAgICAgIHNxc2l6ZSA9IGlzLT5zdWJ0aXRsZXEuc2l6ZTsKLSAgICAgICAgICAgIGF2X2RpZmYgPSAwOwotICAgICAgICAgICAgaWYgKGlzLT5hdWRpb19zdCAmJiBpcy0+dmlkZW9fc3QpCi0gICAgICAgICAgICAgICAgYXZfZGlmZiA9IGdldF9jbG9jaygmaXMtPmF1ZGNsaykgLSBnZXRfY2xvY2soJmlzLT52aWRjbGspOwotICAgICAgICAgICAgZWxzZSBpZiAoaXMtPnZpZGVvX3N0KQotICAgICAgICAgICAgICAgIGF2X2RpZmYgPSBnZXRfbWFzdGVyX2Nsb2NrKGlzKSAtIGdldF9jbG9jaygmaXMtPnZpZGNsayk7Ci0gICAgICAgICAgICBlbHNlIGlmIChpcy0+YXVkaW9fc3QpCi0gICAgICAgICAgICAgICAgYXZfZGlmZiA9IGdldF9tYXN0ZXJfY2xvY2soaXMpIC0gZ2V0X2Nsb2NrKCZpcy0+YXVkY2xrKTsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAiJTcuMmYgJXM6JTcuM2YgZmQ9JTRkIGFxPSU1ZEtCIHZxPSU1ZEtCIHNxPSU1ZEIgZj0lIlBSSWQ2NCIvJSJQUklkNjQiICAgXHIiLAotICAgICAgICAgICAgICAgICAgIGdldF9tYXN0ZXJfY2xvY2soaXMpLAotICAgICAgICAgICAgICAgICAgIChpcy0+YXVkaW9fc3QgJiYgaXMtPnZpZGVvX3N0KSA/ICJBLVYiIDogKGlzLT52aWRlb19zdCA/ICJNLVYiIDogKGlzLT5hdWRpb19zdCA/ICJNLUEiIDogIiAgICIpKSwKLSAgICAgICAgICAgICAgICAgICBhdl9kaWZmLAotICAgICAgICAgICAgICAgICAgIGlzLT5mcmFtZV9kcm9wc19lYXJseSArIGlzLT5mcmFtZV9kcm9wc19sYXRlLAotICAgICAgICAgICAgICAgICAgIGFxc2l6ZSAvIDEwMjQsCi0gICAgICAgICAgICAgICAgICAgdnFzaXplIC8gMTAyNCwKLSAgICAgICAgICAgICAgICAgICBzcXNpemUsCi0gICAgICAgICAgICAgICAgICAgaXMtPnZpZGVvX3N0ID8gaXMtPnZpZGVvX3N0LT5jb2RlYy0+cHRzX2NvcnJlY3Rpb25fbnVtX2ZhdWx0eV9kdHMgOiAwLAotICAgICAgICAgICAgICAgICAgIGlzLT52aWRlb19zdCA/IGlzLT52aWRlb19zdC0+Y29kZWMtPnB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfcHRzIDogMCk7Ci0gICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICAgICAgICAgIGxhc3RfdGltZSA9IGN1cl90aW1lOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBhbGxvY2F0ZSBhIHBpY3R1cmUgKG5lZWRzIHRvIGRvIHRoYXQgaW4gbWFpbiB0aHJlYWQgdG8gYXZvaWQKLSAgIHBvdGVudGlhbCBsb2NraW5nIHByb2JsZW1zICovCi1zdGF0aWMgdm9pZCBhbGxvY19waWN0dXJlKFZpZGVvU3RhdGUgKmlzKQotewotICAgIEZyYW1lICp2cDsKLSAgICBpbnQ2NF90IGJ1ZmZlcmRpZmY7Ci0KLSAgICB2cCA9ICZpcy0+cGljdHEucXVldWVbaXMtPnBpY3RxLndpbmRleF07Ci0KLSAgICBmcmVlX3BpY3R1cmUodnApOwotCi0gICAgdmlkZW9fb3BlbihpcywgMCwgdnApOwotCi0gICAgdnAtPmJtcCA9IFNETF9DcmVhdGVZVVZPdmVybGF5KHZwLT53aWR0aCwgdnAtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1lWMTJfT1ZFUkxBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuKTsKLSAgICBidWZmZXJkaWZmID0gdnAtPmJtcCA/IEZGTUFYKHZwLT5ibXAtPnBpeGVsc1swXSwgdnAtPmJtcC0+cGl4ZWxzWzFdKSAtIEZGTUlOKHZwLT5ibXAtPnBpeGVsc1swXSwgdnAtPmJtcC0+cGl4ZWxzWzFdKSA6IDA7Ci0gICAgaWYgKCF2cC0+Ym1wIHx8IHZwLT5ibXAtPnBpdGNoZXNbMF0gPCB2cC0+d2lkdGggfHwgYnVmZmVyZGlmZiA8IChpbnQ2NF90KXZwLT5oZWlnaHQgKiB2cC0+Ym1wLT5waXRjaGVzWzBdKSB7Ci0gICAgICAgIC8qIFNETCBhbGxvY2F0ZXMgYSBidWZmZXIgc21hbGxlciB0aGFuIHJlcXVlc3RlZCBpZiB0aGUgdmlkZW8KLSAgICAgICAgICogb3ZlcmxheSBoYXJkd2FyZSBpcyB1bmFibGUgdG8gc3VwcG9ydCB0aGUgcmVxdWVzdGVkIHNpemUuICovCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCi0gICAgICAgICAgICAgICAiRXJyb3I6IHRoZSB2aWRlbyBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBhbiBpbWFnZVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgb2YgJWR4JWQgcGl4ZWxzLiBUcnkgdXNpbmcgLWxvd3JlcyBvciAtdmYgXCJzY2FsZT13OmhcIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgInRvIHJlZHVjZSB0aGUgaW1hZ2Ugc2l6ZS5cbiIsIHZwLT53aWR0aCwgdnAtPmhlaWdodCApOwotICAgICAgICBkb19leGl0KGlzKTsKLSAgICB9Ci0KLSAgICBTRExfTG9ja011dGV4KGlzLT5waWN0cS5tdXRleCk7Ci0gICAgdnAtPmFsbG9jYXRlZCA9IDE7Ci0gICAgU0RMX0NvbmRTaWduYWwoaXMtPnBpY3RxLmNvbmQpOwotICAgIFNETF9VbmxvY2tNdXRleChpcy0+cGljdHEubXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBkdXBsaWNhdGVfcmlnaHRfYm9yZGVyX3BpeGVscyhTRExfT3ZlcmxheSAqYm1wKSB7Ci0gICAgaW50IGksIHdpZHRoLCBoZWlnaHQ7Ci0gICAgVWludDggKnAsICptYXhwOwotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgd2lkdGggID0gYm1wLT53OwotICAgICAgICBoZWlnaHQgPSBibXAtPmg7Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgd2lkdGggID4+PSAxOwotICAgICAgICAgICAgaGVpZ2h0ID4+PSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChibXAtPnBpdGNoZXNbaV0gPiB3aWR0aCkgewotICAgICAgICAgICAgbWF4cCA9IGJtcC0+cGl4ZWxzW2ldICsgYm1wLT5waXRjaGVzW2ldICogaGVpZ2h0IC0gMTsKLSAgICAgICAgICAgIGZvciAocCA9IGJtcC0+cGl4ZWxzW2ldICsgd2lkdGggLSAxOyBwIDwgbWF4cDsgcCArPSBibXAtPnBpdGNoZXNbaV0pCi0gICAgICAgICAgICAgICAgKihwKzEpID0gKnA7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgcXVldWVfcGljdHVyZShWaWRlb1N0YXRlICppcywgQVZGcmFtZSAqc3JjX2ZyYW1lLCBkb3VibGUgcHRzLCBkb3VibGUgZHVyYXRpb24sIGludDY0X3QgcG9zLCBpbnQgc2VyaWFsKQotewotICAgIEZyYW1lICp2cDsKLQotI2lmIGRlZmluZWQoREVCVUdfU1lOQykgJiYgMAotICAgIHByaW50ZigiZnJhbWVfdHlwZT0lYyBwdHM9JTAuM2ZcbiIsCi0gICAgICAgICAgIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihzcmNfZnJhbWUtPnBpY3RfdHlwZSksIHB0cyk7Ci0jZW5kaWYKLQotICAgIGlmICghKHZwID0gZnJhbWVfcXVldWVfcGVla193cml0YWJsZSgmaXMtPnBpY3RxKSkpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIHZwLT5zYXIgPSBzcmNfZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0KLSAgICAvKiBhbGxvYyBvciByZXNpemUgaGFyZHdhcmUgcGljdHVyZSBidWZmZXIgKi8KLSAgICBpZiAoIXZwLT5ibXAgfHwgdnAtPnJlYWxsb2NhdGUgfHwgIXZwLT5hbGxvY2F0ZWQgfHwKLSAgICAgICAgdnAtPndpZHRoICAhPSBzcmNfZnJhbWUtPndpZHRoIHx8Ci0gICAgICAgIHZwLT5oZWlnaHQgIT0gc3JjX2ZyYW1lLT5oZWlnaHQpIHsKLSAgICAgICAgU0RMX0V2ZW50IGV2ZW50OwotCi0gICAgICAgIHZwLT5hbGxvY2F0ZWQgID0gMDsKLSAgICAgICAgdnAtPnJlYWxsb2NhdGUgPSAwOwotICAgICAgICB2cC0+d2lkdGggPSBzcmNfZnJhbWUtPndpZHRoOwotICAgICAgICB2cC0+aGVpZ2h0ID0gc3JjX2ZyYW1lLT5oZWlnaHQ7Ci0KLSAgICAgICAgLyogdGhlIGFsbG9jYXRpb24gbXVzdCBiZSBkb25lIGluIHRoZSBtYWluIHRocmVhZCB0byBhdm9pZAotICAgICAgICAgICBsb2NraW5nIHByb2JsZW1zLiAqLwotICAgICAgICBldmVudC50eXBlID0gRkZfQUxMT0NfRVZFTlQ7Ci0gICAgICAgIGV2ZW50LnVzZXIuZGF0YTEgPSBpczsKLSAgICAgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOwotCi0gICAgICAgIC8qIHdhaXQgdW50aWwgdGhlIHBpY3R1cmUgaXMgYWxsb2NhdGVkICovCi0gICAgICAgIFNETF9Mb2NrTXV0ZXgoaXMtPnBpY3RxLm11dGV4KTsKLSAgICAgICAgd2hpbGUgKCF2cC0+YWxsb2NhdGVkICYmICFpcy0+dmlkZW9xLmFib3J0X3JlcXVlc3QpIHsKLSAgICAgICAgICAgIFNETF9Db25kV2FpdChpcy0+cGljdHEuY29uZCwgaXMtPnBpY3RxLm11dGV4KTsKLSAgICAgICAgfQotICAgICAgICAvKiBpZiB0aGUgcXVldWUgaXMgYWJvcnRlZCwgd2UgaGF2ZSB0byBwb3AgdGhlIHBlbmRpbmcgQUxMT0MgZXZlbnQgb3Igd2FpdCBmb3IgdGhlIGFsbG9jYXRpb24gdG8gY29tcGxldGUgKi8KLSAgICAgICAgaWYgKGlzLT52aWRlb3EuYWJvcnRfcmVxdWVzdCAmJiBTRExfUGVlcEV2ZW50cygmZXZlbnQsIDEsIFNETF9HRVRFVkVOVCwgU0RMX0VWRU5UTUFTSyhGRl9BTExPQ19FVkVOVCkpICE9IDEpIHsKLSAgICAgICAgICAgIHdoaWxlICghdnAtPmFsbG9jYXRlZCAmJiAhaXMtPmFib3J0X3JlcXVlc3QpIHsKLSAgICAgICAgICAgICAgICBTRExfQ29uZFdhaXQoaXMtPnBpY3RxLmNvbmQsIGlzLT5waWN0cS5tdXRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgU0RMX1VubG9ja011dGV4KGlzLT5waWN0cS5tdXRleCk7Ci0KLSAgICAgICAgaWYgKGlzLT52aWRlb3EuYWJvcnRfcmVxdWVzdCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBpZiB0aGUgZnJhbWUgaXMgbm90IHNraXBwZWQsIHRoZW4gZGlzcGxheSBpdCAqLwotICAgIGlmICh2cC0+Ym1wKSB7Ci0gICAgICAgIHVpbnQ4X3QgKmRhdGFbNF07Ci0gICAgICAgIGludCBsaW5lc2l6ZVs0XTsKLQotICAgICAgICAvKiBnZXQgYSBwb2ludGVyIG9uIHRoZSBiaXRtYXAgKi8KLSAgICAgICAgU0RMX0xvY2tZVVZPdmVybGF5ICh2cC0+Ym1wKTsKLQotICAgICAgICBkYXRhWzBdID0gdnAtPmJtcC0+cGl4ZWxzWzBdOwotICAgICAgICBkYXRhWzFdID0gdnAtPmJtcC0+cGl4ZWxzWzJdOwotICAgICAgICBkYXRhWzJdID0gdnAtPmJtcC0+cGl4ZWxzWzFdOwotCi0gICAgICAgIGxpbmVzaXplWzBdID0gdnAtPmJtcC0+cGl0Y2hlc1swXTsKLSAgICAgICAgbGluZXNpemVbMV0gPSB2cC0+Ym1wLT5waXRjaGVzWzJdOwotICAgICAgICBsaW5lc2l6ZVsyXSA9IHZwLT5ibXAtPnBpdGNoZXNbMV07Ci0KLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICAgICAgLy8gRklYTUUgdXNlIGRpcmVjdCByZW5kZXJpbmcKLSAgICAgICAgYXZfaW1hZ2VfY29weShkYXRhLCBsaW5lc2l6ZSwgKGNvbnN0IHVpbnQ4X3QgKiopc3JjX2ZyYW1lLT5kYXRhLCBzcmNfZnJhbWUtPmxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2ZyYW1lLT5mb3JtYXQsIHZwLT53aWR0aCwgdnAtPmhlaWdodCk7Ci0jZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IGF2X2RpY3RfZ2V0KHN3c19kaWN0LCAic3dzX2ZsYWdzIiwgTlVMTCwgMCk7Ci0gICAgICAgICAgICBpZiAoZSkgewotICAgICAgICAgICAgICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzID0gc3dzX2dldF9jbGFzcygpOwotICAgICAgICAgICAgICAgIGNvbnN0IEFWT3B0aW9uICAgICpvID0gYXZfb3B0X2ZpbmQoJmNsYXNzLCAic3dzX2ZsYWdzIiwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopOwotICAgICAgICAgICAgICAgIGludCByZXQgPSBhdl9vcHRfZXZhbF9mbGFncygmY2xhc3MsIG8sIGUtPnZhbHVlLCAmc3dzX2ZsYWdzKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlzLT5pbWdfY29udmVydF9jdHggPSBzd3NfZ2V0Q2FjaGVkQ29udGV4dChpcy0+aW1nX2NvbnZlcnRfY3R4LAotICAgICAgICAgICAgdnAtPndpZHRoLCB2cC0+aGVpZ2h0LCBzcmNfZnJhbWUtPmZvcm1hdCwgdnAtPndpZHRoLCB2cC0+aGVpZ2h0LAotICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBzd3NfZmxhZ3MsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICAgICBpZiAoIWlzLT5pbWdfY29udmVydF9jdHgpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDYW5ub3QgaW5pdGlhbGl6ZSB0aGUgY29udmVyc2lvbiBjb250ZXh0XG4iKTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLSAgICAgICAgc3dzX3NjYWxlKGlzLT5pbWdfY29udmVydF9jdHgsIHNyY19mcmFtZS0+ZGF0YSwgc3JjX2ZyYW1lLT5saW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgIDAsIHZwLT5oZWlnaHQsIGRhdGEsIGxpbmVzaXplKTsKLSNlbmRpZgotICAgICAgICAvKiB3b3JrYXJvdW5kIFNETCBQSVRDSF9XT1JLQVJPVU5EICovCi0gICAgICAgIGR1cGxpY2F0ZV9yaWdodF9ib3JkZXJfcGl4ZWxzKHZwLT5ibXApOwotICAgICAgICAvKiB1cGRhdGUgdGhlIGJpdG1hcCBjb250ZW50ICovCi0gICAgICAgIFNETF9VbmxvY2tZVVZPdmVybGF5KHZwLT5ibXApOwotCi0gICAgICAgIHZwLT5wdHMgPSBwdHM7Ci0gICAgICAgIHZwLT5kdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgICAgICB2cC0+cG9zID0gcG9zOwotICAgICAgICB2cC0+c2VyaWFsID0gc2VyaWFsOwotCi0gICAgICAgIC8qIG5vdyB3ZSBjYW4gdXBkYXRlIHRoZSBwaWN0dXJlIGNvdW50ICovCi0gICAgICAgIGZyYW1lX3F1ZXVlX3B1c2goJmlzLT5waWN0cSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdldF92aWRlb19mcmFtZShWaWRlb1N0YXRlICppcywgQVZGcmFtZSAqZnJhbWUpCi17Ci0gICAgaW50IGdvdF9waWN0dXJlOwotCi0gICAgaWYgKChnb3RfcGljdHVyZSA9IGRlY29kZXJfZGVjb2RlX2ZyYW1lKCZpcy0+dmlkZGVjLCBmcmFtZSwgTlVMTCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKGdvdF9waWN0dXJlKSB7Ci0gICAgICAgIGRvdWJsZSBkcHRzID0gTkFOOwotCi0gICAgICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICAgICAgZHB0cyA9IGF2X3EyZChpcy0+dmlkZW9fc3QtPnRpbWVfYmFzZSkgKiBmcmFtZS0+cHRzOwotCi0gICAgICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfZ3Vlc3Nfc2FtcGxlX2FzcGVjdF9yYXRpbyhpcy0+aWMsIGlzLT52aWRlb19zdCwgZnJhbWUpOwotCi0gICAgICAgIGlzLT52aWRkZWNfd2lkdGggID0gZnJhbWUtPndpZHRoOwotICAgICAgICBpcy0+dmlkZGVjX2hlaWdodCA9IGZyYW1lLT5oZWlnaHQ7Ci0KLSAgICAgICAgaWYgKGZyYW1lZHJvcD4wIHx8IChmcmFtZWRyb3AgJiYgZ2V0X21hc3Rlcl9zeW5jX3R5cGUoaXMpICE9IEFWX1NZTkNfVklERU9fTUFTVEVSKSkgewotICAgICAgICAgICAgaWYgKGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgZGlmZiA9IGRwdHMgLSBnZXRfbWFzdGVyX2Nsb2NrKGlzKTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzbmFuKGRpZmYpICYmIGZhYnMoZGlmZikgPCBBVl9OT1NZTkNfVEhSRVNIT0xEICYmCi0gICAgICAgICAgICAgICAgICAgIGRpZmYgLSBpcy0+ZnJhbWVfbGFzdF9maWx0ZXJfZGVsYXkgPCAwICYmCi0gICAgICAgICAgICAgICAgICAgIGlzLT52aWRkZWMucGt0X3NlcmlhbCA9PSBpcy0+dmlkY2xrLnNlcmlhbCAmJgotICAgICAgICAgICAgICAgICAgICBpcy0+dmlkZW9xLm5iX3BhY2tldHMpIHsKLSAgICAgICAgICAgICAgICAgICAgaXMtPmZyYW1lX2Ryb3BzX2Vhcmx5Kys7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgZ290X3BpY3R1cmUgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBnb3RfcGljdHVyZTsKLX0KLQotI2lmIENPTkZJR19BVkZJTFRFUgotc3RhdGljIGludCBjb25maWd1cmVfZmlsdGVyZ3JhcGgoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIGNvbnN0IGNoYXIgKmZpbHRlcmdyYXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpzb3VyY2VfY3R4LCBBVkZpbHRlckNvbnRleHQgKnNpbmtfY3R4KQotewotICAgIGludCByZXQsIGk7Ci0gICAgaW50IG5iX2ZpbHRlcnMgPSBncmFwaC0+bmJfZmlsdGVyczsKLSAgICBBVkZpbHRlckluT3V0ICpvdXRwdXRzID0gTlVMTCwgKmlucHV0cyA9IE5VTEw7Ci0KLSAgICBpZiAoZmlsdGVyZ3JhcGgpIHsKLSAgICAgICAgb3V0cHV0cyA9IGF2ZmlsdGVyX2lub3V0X2FsbG9jKCk7Ci0gICAgICAgIGlucHV0cyAgPSBhdmZpbHRlcl9pbm91dF9hbGxvYygpOwotICAgICAgICBpZiAoIW91dHB1dHMgfHwgIWlucHV0cykgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0cHV0cy0+bmFtZSAgICAgICA9IGF2X3N0cmR1cCgiaW4iKTsKLSAgICAgICAgb3V0cHV0cy0+ZmlsdGVyX2N0eCA9IHNvdXJjZV9jdHg7Ci0gICAgICAgIG91dHB1dHMtPnBhZF9pZHggICAgPSAwOwotICAgICAgICBvdXRwdXRzLT5uZXh0ICAgICAgID0gTlVMTDsKLQotICAgICAgICBpbnB1dHMtPm5hbWUgICAgICAgID0gYXZfc3RyZHVwKCJvdXQiKTsKLSAgICAgICAgaW5wdXRzLT5maWx0ZXJfY3R4ICA9IHNpbmtfY3R4OwotICAgICAgICBpbnB1dHMtPnBhZF9pZHggICAgID0gMDsKLSAgICAgICAgaW5wdXRzLT5uZXh0ICAgICAgICA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9ncmFwaF9wYXJzZV9wdHIoZ3JhcGgsIGZpbHRlcmdyYXBoLCAmaW5wdXRzLCAmb3V0cHV0cywgTlVMTCkpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2xpbmsoc291cmNlX2N0eCwgMCwgc2lua19jdHgsIDApKSA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgLyogUmVvcmRlciB0aGUgZmlsdGVycyB0byBlbnN1cmUgdGhhdCBpbnB1dHMgb2YgdGhlIGN1c3RvbSBmaWx0ZXJzIGFyZSBtZXJnZWQgZmlyc3QgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnMgLSBuYl9maWx0ZXJzOyBpKyspCi0gICAgICAgIEZGU1dBUChBVkZpbHRlckNvbnRleHQqLCBncmFwaC0+ZmlsdGVyc1tpXSwgZ3JhcGgtPmZpbHRlcnNbaSArIG5iX2ZpbHRlcnNdKTsKLQotICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NvbmZpZyhncmFwaCwgTlVMTCk7Ci1mYWlsOgotICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJm91dHB1dHMpOwotICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJmlucHV0cyk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjb25maWd1cmVfdmlkZW9fZmlsdGVycyhBVkZpbHRlckdyYXBoICpncmFwaCwgVmlkZW9TdGF0ZSAqaXMsIGNvbnN0IGNoYXIgKnZmaWx0ZXJzLCBBVkZyYW1lICpmcmFtZSkKLXsKLSAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7IEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9OT05FIH07Ci0gICAgY2hhciBzd3NfZmxhZ3Nfc3RyWzUxMl0gPSAiIjsKLSAgICBjaGFyIGJ1ZmZlcnNyY19hcmdzWzI1Nl07Ci0gICAgaW50IHJldDsKLSAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRfc3JjID0gTlVMTCwgKmZpbHRfb3V0ID0gTlVMTCwgKmxhc3RfZmlsdGVyID0gTlVMTDsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBpcy0+dmlkZW9fc3QtPmNvZGVjOwotICAgIEFWUmF0aW9uYWwgZnIgPSBhdl9ndWVzc19mcmFtZV9yYXRlKGlzLT5pYywgaXMtPnZpZGVvX3N0LCBOVUxMKTsKLSAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7Ci0KLSAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldChzd3NfZGljdCwgIiIsIGUsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGUtPmtleSwgInN3c19mbGFncyIpKSB7Ci0gICAgICAgICAgICBhdl9zdHJsY2F0Zihzd3NfZmxhZ3Nfc3RyLCBzaXplb2Yoc3dzX2ZsYWdzX3N0ciksICIlcz0lczoiLCAiZmxhZ3MiLCBlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYXZfc3RybGNhdGYoc3dzX2ZsYWdzX3N0ciwgc2l6ZW9mKHN3c19mbGFnc19zdHIpLCAiJXM9JXM6IiwgZS0+a2V5LCBlLT52YWx1ZSk7Ci0gICAgfQotICAgIGlmIChzdHJsZW4oc3dzX2ZsYWdzX3N0cikpCi0gICAgICAgIHN3c19mbGFnc19zdHJbc3RybGVuKHN3c19mbGFnc19zdHIpLTFdID0gJ1wwJzsKLQotICAgIGdyYXBoLT5zY2FsZV9zd3Nfb3B0cyA9IGF2X3N0cmR1cChzd3NfZmxhZ3Nfc3RyKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlcnNyY19hcmdzLCBzaXplb2YoYnVmZmVyc3JjX2FyZ3MpLAotICAgICAgICAgICAgICJ2aWRlb19zaXplPSVkeCVkOnBpeF9mbXQ9JWQ6dGltZV9iYXNlPSVkLyVkOnBpeGVsX2FzcGVjdD0lZC8lZCIsCi0gICAgICAgICAgICAgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0LCBmcmFtZS0+Zm9ybWF0LAotICAgICAgICAgICAgIGlzLT52aWRlb19zdC0+dGltZV9iYXNlLm51bSwgaXMtPnZpZGVvX3N0LT50aW1lX2Jhc2UuZGVuLAotICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgRkZNQVgoY29kZWMtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLCAxKSk7Ci0gICAgaWYgKGZyLm51bSAmJiBmci5kZW4pCi0gICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmZlcnNyY19hcmdzLCBzaXplb2YoYnVmZmVyc3JjX2FyZ3MpLCAiOmZyYW1lX3JhdGU9JWQvJWQiLCBmci5udW0sIGZyLmRlbik7Ci0KLSAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmZpbHRfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYnVmZmVyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZnBsYXlfYnVmZmVyIiwgYnVmZmVyc3JjX2FyZ3MsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoKSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmaWx0X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJidWZmZXJzaW5rIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmZwbGF5X2J1ZmZlcnNpbmsiLCBOVUxMLCBOVUxMLCBncmFwaCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9pbnRfbGlzdChmaWx0X291dCwgInBpeF9mbXRzIiwgcGl4X2ZtdHMsICBBVl9QSVhfRk1UX05PTkUsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pKSA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGxhc3RfZmlsdGVyID0gZmlsdF9vdXQ7Ci0KLS8qIE5vdGU6IHRoaXMgbWFjcm8gYWRkcyBhIGZpbHRlciBiZWZvcmUgdGhlIGxhc3RseSBhZGRlZCBmaWx0ZXIsIHNvIHRoZQotICogcHJvY2Vzc2luZyBvcmRlciBvZiB0aGUgZmlsdGVycyBpcyBpbiByZXZlcnNlICovCi0jZGVmaW5lIElOU0VSVF9GSUxUKG5hbWUsIGFyZykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRfY3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmZmlsdF9jdHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKG5hbWUpLCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZmcGxheV8iIG5hbWUsIGFyZywgTlVMTCwgZ3JhcGgpOyAgICBcCi0gICAgaWYgKHJldCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZ290byBmYWlsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0ID0gYXZmaWx0ZXJfbGluayhmaWx0X2N0eCwgMCwgbGFzdF9maWx0ZXIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsYXN0X2ZpbHRlciA9IGZpbHRfY3R4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotICAgIC8qIFNETCBZVVYgY29kZSBpcyBub3QgaGFuZGxpbmcgb2RkIHdpZHRoL2hlaWdodCBmb3Igc29tZSBkcml2ZXIKLSAgICAgKiBjb21iaW5hdGlvbnMsIHRoZXJlZm9yZSB3ZSBjcm9wIHRoZSBwaWN0dXJlIHRvIGFuIGV2ZW4gd2lkdGgvaGVpZ2h0LiAqLwotICAgIElOU0VSVF9GSUxUKCJjcm9wIiwgImZsb29yKGluX3cvMikqMjpmbG9vcihpbl9oLzIpKjIiKTsKLQotICAgIGlmIChhdXRvcm90YXRlKSB7Ci0gICAgICAgIGRvdWJsZSB0aGV0YSAgPSBnZXRfcm90YXRpb24oaXMtPnZpZGVvX3N0KTsKLQotICAgICAgICBpZiAoZmFicyh0aGV0YSAtIDkwKSA8IDEuMCkgewotICAgICAgICAgICAgSU5TRVJUX0ZJTFQoInRyYW5zcG9zZSIsICJjbG9jayIpOwotICAgICAgICB9IGVsc2UgaWYgKGZhYnModGhldGEgLSAxODApIDwgMS4wKSB7Ci0gICAgICAgICAgICBJTlNFUlRfRklMVCgiaGZsaXAiLCBOVUxMKTsKLSAgICAgICAgICAgIElOU0VSVF9GSUxUKCJ2ZmxpcCIsIE5VTEwpOwotICAgICAgICB9IGVsc2UgaWYgKGZhYnModGhldGEgLSAyNzApIDwgMS4wKSB7Ci0gICAgICAgICAgICBJTlNFUlRfRklMVCgidHJhbnNwb3NlIiwgImNjbG9jayIpOwotICAgICAgICB9IGVsc2UgaWYgKGZhYnModGhldGEpID4gMS4wKSB7Ci0gICAgICAgICAgICBjaGFyIHJvdGF0ZV9idWZbNjRdOwotICAgICAgICAgICAgc25wcmludGYocm90YXRlX2J1Ziwgc2l6ZW9mKHJvdGF0ZV9idWYpLCAiJWYqUEkvMTgwIiwgdGhldGEpOwotICAgICAgICAgICAgSU5TRVJUX0ZJTFQoInJvdGF0ZSIsIHJvdGF0ZV9idWYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChyZXQgPSBjb25maWd1cmVfZmlsdGVyZ3JhcGgoZ3JhcGgsIHZmaWx0ZXJzLCBmaWx0X3NyYywgbGFzdF9maWx0ZXIpKSA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGlzLT5pbl92aWRlb19maWx0ZXIgID0gZmlsdF9zcmM7Ci0gICAgaXMtPm91dF92aWRlb19maWx0ZXIgPSBmaWx0X291dDsKLQotZmFpbDoKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNvbmZpZ3VyZV9hdWRpb19maWx0ZXJzKFZpZGVvU3RhdGUgKmlzLCBjb25zdCBjaGFyICphZmlsdGVycywgaW50IGZvcmNlX291dHB1dF9mb3JtYXQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfTk9ORSB9OwotICAgIGludCBzYW1wbGVfcmF0ZXNbMl0gPSB7IDAsIC0xIH07Ci0gICAgaW50NjRfdCBjaGFubmVsX2xheW91dHNbMl0gPSB7IDAsIC0xIH07Ci0gICAgaW50IGNoYW5uZWxzWzJdID0geyAwLCAtMSB9OwotICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdF9hc3JjID0gTlVMTCwgKmZpbHRfYXNpbmsgPSBOVUxMOwotICAgIGNoYXIgYXJlc2FtcGxlX3N3cl9vcHRzWzUxMl0gPSAiIjsKLSAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7Ci0gICAgY2hhciBhc3JjX2FyZ3NbMjU2XTsKLSAgICBpbnQgcmV0OwotCi0gICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmaXMtPmFncmFwaCk7Ci0gICAgaWYgKCEoaXMtPmFncmFwaCA9IGF2ZmlsdGVyX2dyYXBoX2FsbG9jKCkpKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQoc3dyX29wdHMsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKLSAgICAgICAgYXZfc3RybGNhdGYoYXJlc2FtcGxlX3N3cl9vcHRzLCBzaXplb2YoYXJlc2FtcGxlX3N3cl9vcHRzKSwgIiVzPSVzOiIsIGUtPmtleSwgZS0+dmFsdWUpOwotICAgIGlmIChzdHJsZW4oYXJlc2FtcGxlX3N3cl9vcHRzKSkKLSAgICAgICAgYXJlc2FtcGxlX3N3cl9vcHRzW3N0cmxlbihhcmVzYW1wbGVfc3dyX29wdHMpLTFdID0gJ1wwJzsKLSAgICBhdl9vcHRfc2V0KGlzLT5hZ3JhcGgsICJhcmVzYW1wbGVfc3dyX29wdHMiLCBhcmVzYW1wbGVfc3dyX29wdHMsIDApOwotCi0gICAgcmV0ID0gc25wcmludGYoYXNyY19hcmdzLCBzaXplb2YoYXNyY19hcmdzKSwKLSAgICAgICAgICAgICAgICAgICAic2FtcGxlX3JhdGU9JWQ6c2FtcGxlX2ZtdD0lczpjaGFubmVscz0lZDp0aW1lX2Jhc2U9JWQvJWQiLAotICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmZyZXEsIGF2X2dldF9zYW1wbGVfZm10X25hbWUoaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuZm10KSwKLSAgICAgICAgICAgICAgICAgICBpcy0+YXVkaW9fZmlsdGVyX3NyYy5jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAxLCBpcy0+YXVkaW9fZmlsdGVyX3NyYy5mcmVxKTsKLSAgICBpZiAoaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQpCi0gICAgICAgIHNucHJpbnRmKGFzcmNfYXJncyArIHJldCwgc2l6ZW9mKGFzcmNfYXJncykgLSByZXQsCi0gICAgICAgICAgICAgICAgICI6Y2hhbm5lbF9sYXlvdXQ9MHglIlBSSXg2NCwgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmNoYW5uZWxfbGF5b3V0KTsKLQotICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmZpbHRfYXNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJhYnVmZmVyIiksICJmZnBsYXlfYWJ1ZmZlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3JjX2FyZ3MsIE5VTEwsIGlzLT5hZ3JhcGgpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIGVuZDsKLQotCi0gICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmZmlsdF9hc2luaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJhYnVmZmVyc2luayIpLCAiZmZwbGF5X2FidWZmZXJzaW5rIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIGlzLT5hZ3JhcGgpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIGVuZDsKLQotICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9pbnRfbGlzdChmaWx0X2FzaW5rLCAic2FtcGxlX2ZtdHMiLCBzYW1wbGVfZm10cywgIEFWX1NBTVBMRV9GTVRfTk9ORSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2ludChmaWx0X2FzaW5rLCAiYWxsX2NoYW5uZWxfY291bnRzIiwgMSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkKLSAgICAgICAgZ290byBlbmQ7Ci0KLSAgICBpZiAoZm9yY2Vfb3V0cHV0X2Zvcm1hdCkgewotICAgICAgICBjaGFubmVsX2xheW91dHNbMF0gPSBpcy0+YXVkaW9fdGd0LmNoYW5uZWxfbGF5b3V0OwotICAgICAgICBjaGFubmVscyAgICAgICBbMF0gPSBpcy0+YXVkaW9fdGd0LmNoYW5uZWxzOwotICAgICAgICBzYW1wbGVfcmF0ZXMgICBbMF0gPSBpcy0+YXVkaW9fdGd0LmZyZXE7Ci0gICAgICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9pbnQoZmlsdF9hc2luaywgImFsbF9jaGFubmVsX2NvdW50cyIsIDAsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pKSA8IDApCi0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2ludF9saXN0KGZpbHRfYXNpbmssICJjaGFubmVsX2xheW91dHMiLCBjaGFubmVsX2xheW91dHMsICAtMSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICBpZiAoKHJldCA9IGF2X29wdF9zZXRfaW50X2xpc3QoZmlsdF9hc2luaywgImNoYW5uZWxfY291bnRzIiAsIGNoYW5uZWxzICAgICAgICwgIC0xLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKSkgPCAwKQotICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9pbnRfbGlzdChmaWx0X2FzaW5rLCAic2FtcGxlX3JhdGVzIiAgICwgc2FtcGxlX3JhdGVzICAgLCAgLTEsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pKSA8IDApCi0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICB9Ci0KLQotICAgIGlmICgocmV0ID0gY29uZmlndXJlX2ZpbHRlcmdyYXBoKGlzLT5hZ3JhcGgsIGFmaWx0ZXJzLCBmaWx0X2FzcmMsIGZpbHRfYXNpbmspKSA8IDApCi0gICAgICAgIGdvdG8gZW5kOwotCi0gICAgaXMtPmluX2F1ZGlvX2ZpbHRlciAgPSBmaWx0X2FzcmM7Ci0gICAgaXMtPm91dF9hdWRpb19maWx0ZXIgPSBmaWx0X2FzaW5rOwotCi1lbmQ6Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGF2ZmlsdGVyX2dyYXBoX2ZyZWUoJmlzLT5hZ3JhcGgpOwotICAgIHJldHVybiByZXQ7Ci19Ci0jZW5kaWYgIC8qIENPTkZJR19BVkZJTFRFUiAqLwotCi1zdGF0aWMgaW50IGF1ZGlvX3RocmVhZCh2b2lkICphcmcpCi17Ci0gICAgVmlkZW9TdGF0ZSAqaXMgPSBhcmc7Ci0gICAgQVZGcmFtZSAqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIEZyYW1lICphZjsKLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICBpbnQgbGFzdF9zZXJpYWwgPSAtMTsKLSAgICBpbnQ2NF90IGRlY19jaGFubmVsX2xheW91dDsKLSAgICBpbnQgcmVjb25maWd1cmU7Ci0jZW5kaWYKLSAgICBpbnQgZ290X2ZyYW1lID0gMDsKLSAgICBBVlJhdGlvbmFsIHRiOwotICAgIGludCByZXQgPSAwOwotCi0gICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIGRvIHsKLSAgICAgICAgaWYgKChnb3RfZnJhbWUgPSBkZWNvZGVyX2RlY29kZV9mcmFtZSgmaXMtPmF1ZGRlYywgZnJhbWUsIE5VTEwpKSA8IDApCi0gICAgICAgICAgICBnb3RvIHRoZV9lbmQ7Ci0KLSAgICAgICAgaWYgKGdvdF9mcmFtZSkgewotICAgICAgICAgICAgICAgIHRiID0gKEFWUmF0aW9uYWwpezEsIGZyYW1lLT5zYW1wbGVfcmF0ZX07Ci0KLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICAgICAgICAgICAgICBkZWNfY2hhbm5lbF9sYXlvdXQgPSBnZXRfdmFsaWRfY2hhbm5lbF9sYXlvdXQoZnJhbWUtPmNoYW5uZWxfbGF5b3V0LCBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpKTsKLQotICAgICAgICAgICAgICAgIHJlY29uZmlndXJlID0KLSAgICAgICAgICAgICAgICAgICAgY21wX2F1ZGlvX2ZtdHMoaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuZm10LCBpcy0+YXVkaW9fZmlsdGVyX3NyYy5jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCwgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKSkgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQgIT0gZGVjX2NoYW5uZWxfbGF5b3V0IHx8Ci0gICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmZyZXEgICAgICAgICAgICE9IGZyYW1lLT5zYW1wbGVfcmF0ZSB8fAotICAgICAgICAgICAgICAgICAgICBpcy0+YXVkZGVjLnBrdF9zZXJpYWwgICAgICAgICAgICAgICAhPSBsYXN0X3NlcmlhbDsKLQotICAgICAgICAgICAgICAgIGlmIChyZWNvbmZpZ3VyZSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZjFbMTAyNF0sIGJ1ZjJbMTAyNF07Ci0gICAgICAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAtMSwgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQpOwotICAgICAgICAgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1ZjIsIHNpemVvZihidWYyKSwgLTEsIGRlY19jaGFubmVsX2xheW91dCk7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVkaW8gZnJhbWUgY2hhbmdlZCBmcm9tIHJhdGU6JWQgY2g6JWQgZm10OiVzIGxheW91dDolcyBzZXJpYWw6JWQgdG8gcmF0ZTolZCBjaDolZCBmbXQ6JXMgbGF5b3V0OiVzIHNlcmlhbDolZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmZyZXEsIGlzLT5hdWRpb19maWx0ZXJfc3JjLmNoYW5uZWxzLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGlzLT5hdWRpb19maWx0ZXJfc3JjLmZtdCksIGJ1ZjEsIGxhc3Rfc2VyaWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9yYXRlLCBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGZyYW1lLT5mb3JtYXQpLCBidWYyLCBpcy0+YXVkZGVjLnBrdF9zZXJpYWwpOwotCi0gICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmZtdCAgICAgICAgICAgID0gZnJhbWUtPmZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbHMgICAgICAgPSBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpOwotICAgICAgICAgICAgICAgICAgICBpcy0+YXVkaW9fZmlsdGVyX3NyYy5jaGFubmVsX2xheW91dCA9IGRlY19jaGFubmVsX2xheW91dDsKLSAgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuZnJlcSAgICAgICAgICAgPSBmcmFtZS0+c2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3Rfc2VyaWFsICAgICAgICAgICAgICAgICAgICAgICAgID0gaXMtPmF1ZGRlYy5wa3Rfc2VyaWFsOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gY29uZmlndXJlX2F1ZGlvX2ZpbHRlcnMoaXMsIGFmaWx0ZXJzLCAxKSkgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lKGlzLT5pbl9hdWRpb19maWx0ZXIsIGZyYW1lKSkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKLQotICAgICAgICAgICAgd2hpbGUgKChyZXQgPSBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9mbGFncyhpcy0+b3V0X2F1ZGlvX2ZpbHRlciwgZnJhbWUsIDApKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGIgPSBpcy0+b3V0X2F1ZGlvX2ZpbHRlci0+aW5wdXRzWzBdLT50aW1lX2Jhc2U7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAoIShhZiA9IGZyYW1lX3F1ZXVlX3BlZWtfd3JpdGFibGUoJmlzLT5zYW1wcSkpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIHRoZV9lbmQ7Ci0KLSAgICAgICAgICAgICAgICBhZi0+cHRzID0gKGZyYW1lLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpID8gTkFOIDogZnJhbWUtPnB0cyAqIGF2X3EyZCh0Yik7Ci0gICAgICAgICAgICAgICAgYWYtPnBvcyA9IGF2X2ZyYW1lX2dldF9wa3RfcG9zKGZyYW1lKTsKLSAgICAgICAgICAgICAgICBhZi0+c2VyaWFsID0gaXMtPmF1ZGRlYy5wa3Rfc2VyaWFsOwotICAgICAgICAgICAgICAgIGFmLT5kdXJhdGlvbiA9IGF2X3EyZCgoQVZSYXRpb25hbCl7ZnJhbWUtPm5iX3NhbXBsZXMsIGZyYW1lLT5zYW1wbGVfcmF0ZX0pOwotCi0gICAgICAgICAgICAgICAgYXZfZnJhbWVfbW92ZV9yZWYoYWYtPmZyYW1lLCBmcmFtZSk7Ci0gICAgICAgICAgICAgICAgZnJhbWVfcXVldWVfcHVzaCgmaXMtPnNhbXBxKTsKLQotI2lmIENPTkZJR19BVkZJTFRFUgotICAgICAgICAgICAgICAgIGlmIChpcy0+YXVkaW9xLnNlcmlhbCAhPSBpcy0+YXVkZGVjLnBrdF9zZXJpYWwpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikKLSAgICAgICAgICAgICAgICBpcy0+YXVkZGVjLmZpbmlzaGVkID0gaXMtPmF1ZGRlYy5wa3Rfc2VyaWFsOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9IHdoaWxlIChyZXQgPj0gMCB8fCByZXQgPT0gQVZFUlJPUihFQUdBSU4pIHx8IHJldCA9PSBBVkVSUk9SX0VPRik7Ci0gdGhlX2VuZDoKLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICBhdmZpbHRlcl9ncmFwaF9mcmVlKCZpcy0+YWdyYXBoKTsKLSNlbmRpZgotICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGRlY29kZXJfc3RhcnQoRGVjb2RlciAqZCwgaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKmFyZykKLXsKLSAgICBwYWNrZXRfcXVldWVfc3RhcnQoZC0+cXVldWUpOwotICAgIGQtPmRlY29kZXJfdGlkID0gU0RMX0NyZWF0ZVRocmVhZChmbiwgYXJnKTsKLSAgICBpZiAoIWQtPmRlY29kZXJfdGlkKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJTRExfQ3JlYXRlVGhyZWFkKCk6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGVvX3RocmVhZCh2b2lkICphcmcpCi17Ci0gICAgVmlkZW9TdGF0ZSAqaXMgPSBhcmc7Ci0gICAgQVZGcmFtZSAqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGRvdWJsZSBwdHM7Ci0gICAgZG91YmxlIGR1cmF0aW9uOwotICAgIGludCByZXQ7Ci0gICAgQVZSYXRpb25hbCB0YiA9IGlzLT52aWRlb19zdC0+dGltZV9iYXNlOwotICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZSA9IGF2X2d1ZXNzX2ZyYW1lX3JhdGUoaXMtPmljLCBpcy0+dmlkZW9fc3QsIE5VTEwpOwotCi0jaWYgQ09ORklHX0FWRklMVEVSCi0gICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGggPSBhdmZpbHRlcl9ncmFwaF9hbGxvYygpOwotICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdF9vdXQgPSBOVUxMLCAqZmlsdF9pbiA9IE5VTEw7Ci0gICAgaW50IGxhc3RfdyA9IDA7Ci0gICAgaW50IGxhc3RfaCA9IDA7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IGxhc3RfZm9ybWF0ID0gLTI7Ci0gICAgaW50IGxhc3Rfc2VyaWFsID0gLTE7Ci0gICAgaW50IGxhc3RfdmZpbHRlcl9pZHggPSAwOwotICAgIGlmICghZ3JhcGgpIHsKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICBpZiAoIWZyYW1lKSB7Ci0jaWYgQ09ORklHX0FWRklMVEVSCi0gICAgICAgIGF2ZmlsdGVyX2dyYXBoX2ZyZWUoJmdyYXBoKTsKLSNlbmRpZgotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgcmV0ID0gZ2V0X3ZpZGVvX2ZyYW1lKGlzLCBmcmFtZSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgZ290byB0aGVfZW5kOwotICAgICAgICBpZiAoIXJldCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0jaWYgQ09ORklHX0FWRklMVEVSCi0gICAgICAgIGlmICggICBsYXN0X3cgIT0gZnJhbWUtPndpZHRoCi0gICAgICAgICAgICB8fCBsYXN0X2ggIT0gZnJhbWUtPmhlaWdodAotICAgICAgICAgICAgfHwgbGFzdF9mb3JtYXQgIT0gZnJhbWUtPmZvcm1hdAotICAgICAgICAgICAgfHwgbGFzdF9zZXJpYWwgIT0gaXMtPnZpZGRlYy5wa3Rfc2VyaWFsCi0gICAgICAgICAgICB8fCBsYXN0X3ZmaWx0ZXJfaWR4ICE9IGlzLT52ZmlsdGVyX2lkeCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywKLSAgICAgICAgICAgICAgICAgICAiVmlkZW8gZnJhbWUgY2hhbmdlZCBmcm9tIHNpemU6JWR4JWQgZm9ybWF0OiVzIHNlcmlhbDolZCB0byBzaXplOiVkeCVkIGZvcm1hdDolcyBzZXJpYWw6JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgbGFzdF93LCBsYXN0X2gsCi0gICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilhdl94X2lmX251bGwoYXZfZ2V0X3BpeF9mbXRfbmFtZShsYXN0X2Zvcm1hdCksICJub25lIiksIGxhc3Rfc2VyaWFsLAotICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKWF2X3hfaWZfbnVsbChhdl9nZXRfcGl4X2ZtdF9uYW1lKGZyYW1lLT5mb3JtYXQpLCAibm9uZSIpLCBpcy0+dmlkZGVjLnBrdF9zZXJpYWwpOwotICAgICAgICAgICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmZ3JhcGgpOwotICAgICAgICAgICAgZ3JhcGggPSBhdmZpbHRlcl9ncmFwaF9hbGxvYygpOwotICAgICAgICAgICAgaWYgKChyZXQgPSBjb25maWd1cmVfdmlkZW9fZmlsdGVycyhncmFwaCwgaXMsIHZmaWx0ZXJzX2xpc3QgPyB2ZmlsdGVyc19saXN0W2lzLT52ZmlsdGVyX2lkeF0gOiBOVUxMLCBmcmFtZSkpIDwgMCkgewotICAgICAgICAgICAgICAgIFNETF9FdmVudCBldmVudDsKLSAgICAgICAgICAgICAgICBldmVudC50eXBlID0gRkZfUVVJVF9FVkVOVDsKLSAgICAgICAgICAgICAgICBldmVudC51c2VyLmRhdGExID0gaXM7Ci0gICAgICAgICAgICAgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOwotICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbHRfaW4gID0gaXMtPmluX3ZpZGVvX2ZpbHRlcjsKLSAgICAgICAgICAgIGZpbHRfb3V0ID0gaXMtPm91dF92aWRlb19maWx0ZXI7Ci0gICAgICAgICAgICBsYXN0X3cgPSBmcmFtZS0+d2lkdGg7Ci0gICAgICAgICAgICBsYXN0X2ggPSBmcmFtZS0+aGVpZ2h0OwotICAgICAgICAgICAgbGFzdF9mb3JtYXQgPSBmcmFtZS0+Zm9ybWF0OwotICAgICAgICAgICAgbGFzdF9zZXJpYWwgPSBpcy0+dmlkZGVjLnBrdF9zZXJpYWw7Ci0gICAgICAgICAgICBsYXN0X3ZmaWx0ZXJfaWR4ID0gaXMtPnZmaWx0ZXJfaWR4OwotICAgICAgICAgICAgZnJhbWVfcmF0ZSA9IGZpbHRfb3V0LT5pbnB1dHNbMF0tPmZyYW1lX3JhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXQgPSBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lKGZpbHRfaW4sIGZyYW1lKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIHRoZV9lbmQ7Ci0KLSAgICAgICAgd2hpbGUgKHJldCA+PSAwKSB7Ci0gICAgICAgICAgICBpcy0+ZnJhbWVfbGFzdF9yZXR1cm5lZF90aW1lID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC8gMTAwMDAwMC4wOwotCi0gICAgICAgICAgICByZXQgPSBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9mbGFncyhmaWx0X291dCwgZnJhbWUsIDApOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKQotICAgICAgICAgICAgICAgICAgICBpcy0+dmlkZGVjLmZpbmlzaGVkID0gaXMtPnZpZGRlYy5wa3Rfc2VyaWFsOwotICAgICAgICAgICAgICAgIHJldCA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlzLT5mcmFtZV9sYXN0X2ZpbHRlcl9kZWxheSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAvIDEwMDAwMDAuMCAtIGlzLT5mcmFtZV9sYXN0X3JldHVybmVkX3RpbWU7Ci0gICAgICAgICAgICBpZiAoZmFicyhpcy0+ZnJhbWVfbGFzdF9maWx0ZXJfZGVsYXkpID4gQVZfTk9TWU5DX1RIUkVTSE9MRCAvIDEwLjApCi0gICAgICAgICAgICAgICAgaXMtPmZyYW1lX2xhc3RfZmlsdGVyX2RlbGF5ID0gMDsKLSAgICAgICAgICAgIHRiID0gZmlsdF9vdXQtPmlucHV0c1swXS0+dGltZV9iYXNlOwotI2VuZGlmCi0gICAgICAgICAgICBkdXJhdGlvbiA9IChmcmFtZV9yYXRlLm51bSAmJiBmcmFtZV9yYXRlLmRlbiA/IGF2X3EyZCgoQVZSYXRpb25hbCl7ZnJhbWVfcmF0ZS5kZW4sIGZyYW1lX3JhdGUubnVtfSkgOiAwKTsKLSAgICAgICAgICAgIHB0cyA9IChmcmFtZS0+cHRzID09IEFWX05PUFRTX1ZBTFVFKSA/IE5BTiA6IGZyYW1lLT5wdHMgKiBhdl9xMmQodGIpOwotICAgICAgICAgICAgcmV0ID0gcXVldWVfcGljdHVyZShpcywgZnJhbWUsIHB0cywgZHVyYXRpb24sIGF2X2ZyYW1lX2dldF9wa3RfcG9zKGZyYW1lKSwgaXMtPnZpZGRlYy5wa3Rfc2VyaWFsKTsKLSAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIHRoZV9lbmQ7Ci0gICAgfQotIHRoZV9lbmQ6Ci0jaWYgQ09ORklHX0FWRklMVEVSCi0gICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmZ3JhcGgpOwotI2VuZGlmCi0gICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN1YnRpdGxlX3RocmVhZCh2b2lkICphcmcpCi17Ci0gICAgVmlkZW9TdGF0ZSAqaXMgPSBhcmc7Ci0gICAgRnJhbWUgKnNwOwotICAgIGludCBnb3Rfc3VidGl0bGU7Ci0gICAgZG91YmxlIHB0czsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKCEoc3AgPSBmcmFtZV9xdWV1ZV9wZWVrX3dyaXRhYmxlKCZpcy0+c3VicHEpKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGlmICgoZ290X3N1YnRpdGxlID0gZGVjb2Rlcl9kZWNvZGVfZnJhbWUoJmlzLT5zdWJkZWMsIE5VTEwsICZzcC0+c3ViKSkgPCAwKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgcHRzID0gMDsKLQotICAgICAgICBpZiAoZ290X3N1YnRpdGxlICYmIHNwLT5zdWIuZm9ybWF0ID09IDApIHsKLSAgICAgICAgICAgIGlmIChzcC0+c3ViLnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgICAgICBwdHMgPSBzcC0+c3ViLnB0cyAvIChkb3VibGUpQVZfVElNRV9CQVNFOwotICAgICAgICAgICAgc3AtPnB0cyA9IHB0czsKLSAgICAgICAgICAgIHNwLT5zZXJpYWwgPSBpcy0+c3ViZGVjLnBrdF9zZXJpYWw7Ci0gICAgICAgICAgICBpZiAoIShzcC0+c3VicmVjdHMgPSBhdl9tYWxsb2N6X2FycmF5KHNwLT5zdWIubnVtX3JlY3RzLCBzaXplb2YoQVZTdWJ0aXRsZVJlY3QqKSkpKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNhbm5vdCBhbGxvY2F0ZSBzdWJyZWN0c1xuIik7Ci0gICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwLT5zdWIubnVtX3JlY3RzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGluX3cgPSBzcC0+c3ViLnJlY3RzW2ldLT53OwotICAgICAgICAgICAgICAgIGludCBpbl9oID0gc3AtPnN1Yi5yZWN0c1tpXS0+aDsKLSAgICAgICAgICAgICAgICBpbnQgc3VidyA9IGlzLT5zdWJkZWMuYXZjdHgtPndpZHRoICA/IGlzLT5zdWJkZWMuYXZjdHgtPndpZHRoICA6IGlzLT52aWRkZWNfd2lkdGg7Ci0gICAgICAgICAgICAgICAgaW50IHN1YmggPSBpcy0+c3ViZGVjLmF2Y3R4LT5oZWlnaHQgPyBpcy0+c3ViZGVjLmF2Y3R4LT5oZWlnaHQgOiBpcy0+dmlkZGVjX2hlaWdodDsKLSAgICAgICAgICAgICAgICBpbnQgb3V0X3cgPSBpcy0+dmlkZGVjX3dpZHRoICA/IGluX3cgKiBpcy0+dmlkZGVjX3dpZHRoICAvIHN1YncgOiBpbl93OwotICAgICAgICAgICAgICAgIGludCBvdXRfaCA9IGlzLT52aWRkZWNfaGVpZ2h0ID8gaW5faCAqIGlzLT52aWRkZWNfaGVpZ2h0IC8gc3ViaCA6IGluX2g7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIShzcC0+c3VicmVjdHNbaV0gPSBhdl9tYWxsb2N6KHNpemVvZihBVlN1YnRpdGxlUmVjdCkpKSB8fAotICAgICAgICAgICAgICAgICAgICBhdl9pbWFnZV9hbGxvYyhzcC0+c3VicmVjdHNbaV0tPmRhdGEsIHNwLT5zdWJyZWN0c1tpXS0+bGluZXNpemUsIG91dF93LCBvdXRfaCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgMTYpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ2Fubm90IGFsbG9jYXRlIHN1YnRpdGxlIGRhdGFcbiIpOwotICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlzLT5zdWJfY29udmVydF9jdHggPSBzd3NfZ2V0Q2FjaGVkQ29udGV4dChpcy0+c3ViX2NvbnZlcnRfY3R4LAotICAgICAgICAgICAgICAgICAgICBpbl93LCBpbl9oLCBBVl9QSVhfRk1UX1BBTDgsIG91dF93LCBvdXRfaCwKLSAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgc3dzX2ZsYWdzLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAoIWlzLT5zdWJfY29udmVydF9jdHgpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNhbm5vdCBpbml0aWFsaXplIHRoZSBzdWIgY29udmVyc2lvbiBjb250ZXh0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3dzX3NjYWxlKGlzLT5zdWJfY29udmVydF9jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKilzcC0+c3ViLnJlY3RzW2ldLT5kYXRhLCBzcC0+c3ViLnJlY3RzW2ldLT5saW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW5faCwgc3AtPnN1YnJlY3RzW2ldLT5kYXRhLCBzcC0+c3VicmVjdHNbaV0tPmxpbmVzaXplKTsKLQotICAgICAgICAgICAgICAgIHNwLT5zdWJyZWN0c1tpXS0+dyA9IG91dF93OwotICAgICAgICAgICAgICAgIHNwLT5zdWJyZWN0c1tpXS0+aCA9IG91dF9oOwotICAgICAgICAgICAgICAgIHNwLT5zdWJyZWN0c1tpXS0+eCA9IHNwLT5zdWIucmVjdHNbaV0tPnggKiBvdXRfdyAvIGluX3c7Ci0gICAgICAgICAgICAgICAgc3AtPnN1YnJlY3RzW2ldLT55ID0gc3AtPnN1Yi5yZWN0c1tpXS0+eSAqIG91dF9oIC8gaW5faDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogbm93IHdlIGNhbiB1cGRhdGUgdGhlIHBpY3R1cmUgY291bnQgKi8KLSAgICAgICAgICAgIGZyYW1lX3F1ZXVlX3B1c2goJmlzLT5zdWJwcSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ290X3N1YnRpdGxlKSB7Ci0gICAgICAgICAgICBhdnN1YnRpdGxlX2ZyZWUoJnNwLT5zdWIpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiBjb3B5IHNhbXBsZXMgZm9yIHZpZXdpbmcgaW4gZWRpdG9yIHdpbmRvdyAqLwotc3RhdGljIHZvaWQgdXBkYXRlX3NhbXBsZV9kaXNwbGF5KFZpZGVvU3RhdGUgKmlzLCBzaG9ydCAqc2FtcGxlcywgaW50IHNhbXBsZXNfc2l6ZSkKLXsKLSAgICBpbnQgc2l6ZSwgbGVuOwotCi0gICAgc2l6ZSA9IHNhbXBsZXNfc2l6ZSAvIHNpemVvZihzaG9ydCk7Ci0gICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgIGxlbiA9IFNBTVBMRV9BUlJBWV9TSVpFIC0gaXMtPnNhbXBsZV9hcnJheV9pbmRleDsKLSAgICAgICAgaWYgKGxlbiA+IHNpemUpCi0gICAgICAgICAgICBsZW4gPSBzaXplOwotICAgICAgICBtZW1jcHkoaXMtPnNhbXBsZV9hcnJheSArIGlzLT5zYW1wbGVfYXJyYXlfaW5kZXgsIHNhbXBsZXMsIGxlbiAqIHNpemVvZihzaG9ydCkpOwotICAgICAgICBzYW1wbGVzICs9IGxlbjsKLSAgICAgICAgaXMtPnNhbXBsZV9hcnJheV9pbmRleCArPSBsZW47Ci0gICAgICAgIGlmIChpcy0+c2FtcGxlX2FycmF5X2luZGV4ID49IFNBTVBMRV9BUlJBWV9TSVpFKQotICAgICAgICAgICAgaXMtPnNhbXBsZV9hcnJheV9pbmRleCA9IDA7Ci0gICAgICAgIHNpemUgLT0gbGVuOwotICAgIH0KLX0KLQotLyogcmV0dXJuIHRoZSB3YW50ZWQgbnVtYmVyIG9mIHNhbXBsZXMgdG8gZ2V0IGJldHRlciBzeW5jIGlmIHN5bmNfdHlwZSBpcyB2aWRlbwotICogb3IgZXh0ZXJuYWwgbWFzdGVyIGNsb2NrICovCi1zdGF0aWMgaW50IHN5bmNocm9uaXplX2F1ZGlvKFZpZGVvU3RhdGUgKmlzLCBpbnQgbmJfc2FtcGxlcykKLXsKLSAgICBpbnQgd2FudGVkX25iX3NhbXBsZXMgPSBuYl9zYW1wbGVzOwotCi0gICAgLyogaWYgbm90IG1hc3RlciwgdGhlbiB3ZSB0cnkgdG8gcmVtb3ZlIG9yIGFkZCBzYW1wbGVzIHRvIGNvcnJlY3QgdGhlIGNsb2NrICovCi0gICAgaWYgKGdldF9tYXN0ZXJfc3luY190eXBlKGlzKSAhPSBBVl9TWU5DX0FVRElPX01BU1RFUikgewotICAgICAgICBkb3VibGUgZGlmZiwgYXZnX2RpZmY7Ci0gICAgICAgIGludCBtaW5fbmJfc2FtcGxlcywgbWF4X25iX3NhbXBsZXM7Ci0KLSAgICAgICAgZGlmZiA9IGdldF9jbG9jaygmaXMtPmF1ZGNsaykgLSBnZXRfbWFzdGVyX2Nsb2NrKGlzKTsKLQotICAgICAgICBpZiAoIWlzbmFuKGRpZmYpICYmIGZhYnMoZGlmZikgPCBBVl9OT1NZTkNfVEhSRVNIT0xEKSB7Ci0gICAgICAgICAgICBpcy0+YXVkaW9fZGlmZl9jdW0gPSBkaWZmICsgaXMtPmF1ZGlvX2RpZmZfYXZnX2NvZWYgKiBpcy0+YXVkaW9fZGlmZl9jdW07Ci0gICAgICAgICAgICBpZiAoaXMtPmF1ZGlvX2RpZmZfYXZnX2NvdW50IDwgQVVESU9fRElGRl9BVkdfTkIpIHsKLSAgICAgICAgICAgICAgICAvKiBub3QgZW5vdWdoIG1lYXN1cmVzIHRvIGhhdmUgYSBjb3JyZWN0IGVzdGltYXRlICovCi0gICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2RpZmZfYXZnX2NvdW50Kys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGVzdGltYXRlIHRoZSBBLVYgZGlmZmVyZW5jZSAqLwotICAgICAgICAgICAgICAgIGF2Z19kaWZmID0gaXMtPmF1ZGlvX2RpZmZfY3VtICogKDEuMCAtIGlzLT5hdWRpb19kaWZmX2F2Z19jb2VmKTsKLQotICAgICAgICAgICAgICAgIGlmIChmYWJzKGF2Z19kaWZmKSA+PSBpcy0+YXVkaW9fZGlmZl90aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgd2FudGVkX25iX3NhbXBsZXMgPSBuYl9zYW1wbGVzICsgKGludCkoZGlmZiAqIGlzLT5hdWRpb19zcmMuZnJlcSk7Ci0gICAgICAgICAgICAgICAgICAgIG1pbl9uYl9zYW1wbGVzID0gKChuYl9zYW1wbGVzICogKDEwMCAtIFNBTVBMRV9DT1JSRUNUSU9OX1BFUkNFTlRfTUFYKSAvIDEwMCkpOwotICAgICAgICAgICAgICAgICAgICBtYXhfbmJfc2FtcGxlcyA9ICgobmJfc2FtcGxlcyAqICgxMDAgKyBTQU1QTEVfQ09SUkVDVElPTl9QRVJDRU5UX01BWCkgLyAxMDApKTsKLSAgICAgICAgICAgICAgICAgICAgd2FudGVkX25iX3NhbXBsZXMgPSBhdl9jbGlwKHdhbnRlZF9uYl9zYW1wbGVzLCBtaW5fbmJfc2FtcGxlcywgbWF4X25iX3NhbXBsZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1RSQUNFLCAiZGlmZj0lZiBhZGlmZj0lZiBzYW1wbGVfZGlmZj0lZCBhcHRzPSUwLjNmICVmXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiwgYXZnX2RpZmYsIHdhbnRlZF9uYl9zYW1wbGVzIC0gbmJfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19jbG9jaywgaXMtPmF1ZGlvX2RpZmZfdGhyZXNob2xkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIHRvbyBiaWcgZGlmZmVyZW5jZSA6IG1heSBiZSBpbml0aWFsIFBUUyBlcnJvcnMsIHNvCi0gICAgICAgICAgICAgICByZXNldCBBLVYgZmlsdGVyICovCi0gICAgICAgICAgICBpcy0+YXVkaW9fZGlmZl9hdmdfY291bnQgPSAwOwotICAgICAgICAgICAgaXMtPmF1ZGlvX2RpZmZfY3VtICAgICAgID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB3YW50ZWRfbmJfc2FtcGxlczsKLX0KLQotLyoqCi0gKiBEZWNvZGUgb25lIGF1ZGlvIGZyYW1lIGFuZCByZXR1cm4gaXRzIHVuY29tcHJlc3NlZCBzaXplLgotICoKLSAqIFRoZSBwcm9jZXNzZWQgYXVkaW8gZnJhbWUgaXMgZGVjb2RlZCwgY29udmVydGVkIGlmIHJlcXVpcmVkLCBhbmQKLSAqIHN0b3JlZCBpbiBpcy0+YXVkaW9fYnVmLCB3aXRoIHNpemUgaW4gYnl0ZXMgZ2l2ZW4gYnkgdGhlIHJldHVybgotICogdmFsdWUuCi0gKi8KLXN0YXRpYyBpbnQgYXVkaW9fZGVjb2RlX2ZyYW1lKFZpZGVvU3RhdGUgKmlzKQotewotICAgIGludCBkYXRhX3NpemUsIHJlc2FtcGxlZF9kYXRhX3NpemU7Ci0gICAgaW50NjRfdCBkZWNfY2hhbm5lbF9sYXlvdXQ7Ci0gICAgYXZfdW51c2VkIGRvdWJsZSBhdWRpb19jbG9jazA7Ci0gICAgaW50IHdhbnRlZF9uYl9zYW1wbGVzOwotICAgIEZyYW1lICphZjsKLQotICAgIGlmIChpcy0+cGF1c2VkKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBkbyB7Ci0jaWYgZGVmaW5lZChfV0lOMzIpCi0gICAgICAgIHdoaWxlIChmcmFtZV9xdWV1ZV9uYl9yZW1haW5pbmcoJmlzLT5zYW1wcSkgPT0gMCkgewotICAgICAgICAgICAgaWYgKChhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSBhdWRpb19jYWxsYmFja190aW1lKSA+IDEwMDAwMDBMTCAqIGlzLT5hdWRpb19od19idWZfc2l6ZSAvIGlzLT5hdWRpb190Z3QuYnl0ZXNfcGVyX3NlYyAvIDIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgYXZfdXNsZWVwICgxMDAwKTsKLSAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIGlmICghKGFmID0gZnJhbWVfcXVldWVfcGVla19yZWFkYWJsZSgmaXMtPnNhbXBxKSkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGZyYW1lX3F1ZXVlX25leHQoJmlzLT5zYW1wcSk7Ci0gICAgfSB3aGlsZSAoYWYtPnNlcmlhbCAhPSBpcy0+YXVkaW9xLnNlcmlhbCk7Ci0KLSAgICBkYXRhX3NpemUgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZShOVUxMLCBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoYWYtPmZyYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZi0+ZnJhbWUtPm5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWYtPmZyYW1lLT5mb3JtYXQsIDEpOwotCi0gICAgZGVjX2NoYW5uZWxfbGF5b3V0ID0KLSAgICAgICAgKGFmLT5mcmFtZS0+Y2hhbm5lbF9sYXlvdXQgJiYgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGFmLT5mcmFtZSkgPT0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGFmLT5mcmFtZS0+Y2hhbm5lbF9sYXlvdXQpKSA/Ci0gICAgICAgIGFmLT5mcmFtZS0+Y2hhbm5lbF9sYXlvdXQgOiBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChhdl9mcmFtZV9nZXRfY2hhbm5lbHMoYWYtPmZyYW1lKSk7Ci0gICAgd2FudGVkX25iX3NhbXBsZXMgPSBzeW5jaHJvbml6ZV9hdWRpbyhpcywgYWYtPmZyYW1lLT5uYl9zYW1wbGVzKTsKLQotICAgIGlmIChhZi0+ZnJhbWUtPmZvcm1hdCAgICAgICAgIT0gaXMtPmF1ZGlvX3NyYy5mbXQgICAgICAgICAgICB8fAotICAgICAgICBkZWNfY2hhbm5lbF9sYXlvdXQgICAgICAgIT0gaXMtPmF1ZGlvX3NyYy5jaGFubmVsX2xheW91dCB8fAotICAgICAgICBhZi0+ZnJhbWUtPnNhbXBsZV9yYXRlICAgIT0gaXMtPmF1ZGlvX3NyYy5mcmVxICAgICAgICAgICB8fAotICAgICAgICAod2FudGVkX25iX3NhbXBsZXMgICAgICAgIT0gYWYtPmZyYW1lLT5uYl9zYW1wbGVzICYmICFpcy0+c3dyX2N0eCkpIHsKLSAgICAgICAgc3dyX2ZyZWUoJmlzLT5zd3JfY3R4KTsKLSAgICAgICAgaXMtPnN3cl9jdHggPSBzd3JfYWxsb2Nfc2V0X29wdHMoTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX3RndC5jaGFubmVsX2xheW91dCwgaXMtPmF1ZGlvX3RndC5mbXQsIGlzLT5hdWRpb190Z3QuZnJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjX2NoYW5uZWxfbGF5b3V0LCAgICAgICAgICAgYWYtPmZyYW1lLT5mb3JtYXQsIGFmLT5mcmFtZS0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwpOwotICAgICAgICBpZiAoIWlzLT5zd3JfY3R4IHx8IHN3cl9pbml0KGlzLT5zd3JfY3R4KSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgc2FtcGxlIHJhdGUgY29udmVydGVyIGZvciBjb252ZXJzaW9uIG9mICVkIEh6ICVzICVkIGNoYW5uZWxzIHRvICVkIEh6ICVzICVkIGNoYW5uZWxzIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgYWYtPmZyYW1lLT5zYW1wbGVfcmF0ZSwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShhZi0+ZnJhbWUtPmZvcm1hdCksIGF2X2ZyYW1lX2dldF9jaGFubmVscyhhZi0+ZnJhbWUpLAotICAgICAgICAgICAgICAgICAgICBpcy0+YXVkaW9fdGd0LmZyZXEsIGF2X2dldF9zYW1wbGVfZm10X25hbWUoaXMtPmF1ZGlvX3RndC5mbXQpLCBpcy0+YXVkaW9fdGd0LmNoYW5uZWxzKTsKLSAgICAgICAgICAgIHN3cl9mcmVlKCZpcy0+c3dyX2N0eCk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaXMtPmF1ZGlvX3NyYy5jaGFubmVsX2xheW91dCA9IGRlY19jaGFubmVsX2xheW91dDsKLSAgICAgICAgaXMtPmF1ZGlvX3NyYy5jaGFubmVscyAgICAgICA9IGF2X2ZyYW1lX2dldF9jaGFubmVscyhhZi0+ZnJhbWUpOwotICAgICAgICBpcy0+YXVkaW9fc3JjLmZyZXEgPSBhZi0+ZnJhbWUtPnNhbXBsZV9yYXRlOwotICAgICAgICBpcy0+YXVkaW9fc3JjLmZtdCA9IGFmLT5mcmFtZS0+Zm9ybWF0OwotICAgIH0KLQotICAgIGlmIChpcy0+c3dyX2N0eCkgewotICAgICAgICBjb25zdCB1aW50OF90ICoqaW4gPSAoY29uc3QgdWludDhfdCAqKilhZi0+ZnJhbWUtPmV4dGVuZGVkX2RhdGE7Ci0gICAgICAgIHVpbnQ4X3QgKipvdXQgPSAmaXMtPmF1ZGlvX2J1ZjE7Ci0gICAgICAgIGludCBvdXRfY291bnQgPSAoaW50NjRfdCl3YW50ZWRfbmJfc2FtcGxlcyAqIGlzLT5hdWRpb190Z3QuZnJlcSAvIGFmLT5mcmFtZS0+c2FtcGxlX3JhdGUgKyAyNTY7Ci0gICAgICAgIGludCBvdXRfc2l6ZSAgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZShOVUxMLCBpcy0+YXVkaW9fdGd0LmNoYW5uZWxzLCBvdXRfY291bnQsIGlzLT5hdWRpb190Z3QuZm10LCAwKTsKLSAgICAgICAgaW50IGxlbjI7Ci0gICAgICAgIGlmIChvdXRfc2l6ZSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZSgpIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdhbnRlZF9uYl9zYW1wbGVzICE9IGFmLT5mcmFtZS0+bmJfc2FtcGxlcykgewotICAgICAgICAgICAgaWYgKHN3cl9zZXRfY29tcGVuc2F0aW9uKGlzLT5zd3JfY3R4LCAod2FudGVkX25iX3NhbXBsZXMgLSBhZi0+ZnJhbWUtPm5iX3NhbXBsZXMpICogaXMtPmF1ZGlvX3RndC5mcmVxIC8gYWYtPmZyYW1lLT5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50ZWRfbmJfc2FtcGxlcyAqIGlzLT5hdWRpb190Z3QuZnJlcSAvIGFmLT5mcmFtZS0+c2FtcGxlX3JhdGUpIDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJzd3Jfc2V0X2NvbXBlbnNhdGlvbigpIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF2X2Zhc3RfbWFsbG9jKCZpcy0+YXVkaW9fYnVmMSwgJmlzLT5hdWRpb19idWYxX3NpemUsIG91dF9zaXplKTsKLSAgICAgICAgaWYgKCFpcy0+YXVkaW9fYnVmMSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGxlbjIgPSBzd3JfY29udmVydChpcy0+c3dyX2N0eCwgb3V0LCBvdXRfY291bnQsIGluLCBhZi0+ZnJhbWUtPm5iX3NhbXBsZXMpOwotICAgICAgICBpZiAobGVuMiA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJzd3JfY29udmVydCgpIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlbjIgPT0gb3V0X2NvdW50KSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJhdWRpbyBidWZmZXIgaXMgcHJvYmFibHkgdG9vIHNtYWxsXG4iKTsKLSAgICAgICAgICAgIGlmIChzd3JfaW5pdChpcy0+c3dyX2N0eCkgPCAwKQotICAgICAgICAgICAgICAgIHN3cl9mcmVlKCZpcy0+c3dyX2N0eCk7Ci0gICAgICAgIH0KLSAgICAgICAgaXMtPmF1ZGlvX2J1ZiA9IGlzLT5hdWRpb19idWYxOwotICAgICAgICByZXNhbXBsZWRfZGF0YV9zaXplID0gbGVuMiAqIGlzLT5hdWRpb190Z3QuY2hhbm5lbHMgKiBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShpcy0+YXVkaW9fdGd0LmZtdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaXMtPmF1ZGlvX2J1ZiA9IGFmLT5mcmFtZS0+ZGF0YVswXTsKLSAgICAgICAgcmVzYW1wbGVkX2RhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKLSAgICB9Ci0KLSAgICBhdWRpb19jbG9jazAgPSBpcy0+YXVkaW9fY2xvY2s7Ci0gICAgLyogdXBkYXRlIHRoZSBhdWRpbyBjbG9jayB3aXRoIHRoZSBwdHMgKi8KLSAgICBpZiAoIWlzbmFuKGFmLT5wdHMpKQotICAgICAgICBpcy0+YXVkaW9fY2xvY2sgPSBhZi0+cHRzICsgKGRvdWJsZSkgYWYtPmZyYW1lLT5uYl9zYW1wbGVzIC8gYWYtPmZyYW1lLT5zYW1wbGVfcmF0ZTsKLSAgICBlbHNlCi0gICAgICAgIGlzLT5hdWRpb19jbG9jayA9IE5BTjsKLSAgICBpcy0+YXVkaW9fY2xvY2tfc2VyaWFsID0gYWYtPnNlcmlhbDsKLSNpZmRlZiBERUJVRwotICAgIHsKLSAgICAgICAgc3RhdGljIGRvdWJsZSBsYXN0X2Nsb2NrOwotICAgICAgICBwcmludGYoImF1ZGlvOiBkZWxheT0lMC4zZiBjbG9jaz0lMC4zZiBjbG9jazA9JTAuM2ZcbiIsCi0gICAgICAgICAgICAgICBpcy0+YXVkaW9fY2xvY2sgLSBsYXN0X2Nsb2NrLAotICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2Nsb2NrLCBhdWRpb19jbG9jazApOwotICAgICAgICBsYXN0X2Nsb2NrID0gaXMtPmF1ZGlvX2Nsb2NrOwotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiByZXNhbXBsZWRfZGF0YV9zaXplOwotfQotCi0vKiBwcmVwYXJlIGEgbmV3IGF1ZGlvIGJ1ZmZlciAqLwotc3RhdGljIHZvaWQgc2RsX2F1ZGlvX2NhbGxiYWNrKHZvaWQgKm9wYXF1ZSwgVWludDggKnN0cmVhbSwgaW50IGxlbikKLXsKLSAgICBWaWRlb1N0YXRlICppcyA9IG9wYXF1ZTsKLSAgICBpbnQgYXVkaW9fc2l6ZSwgbGVuMTsKLQotICAgIGF1ZGlvX2NhbGxiYWNrX3RpbWUgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7Ci0KLSAgICB3aGlsZSAobGVuID4gMCkgewotICAgICAgICBpZiAoaXMtPmF1ZGlvX2J1Zl9pbmRleCA+PSBpcy0+YXVkaW9fYnVmX3NpemUpIHsKLSAgICAgICAgICAgYXVkaW9fc2l6ZSA9IGF1ZGlvX2RlY29kZV9mcmFtZShpcyk7Ci0gICAgICAgICAgIGlmIChhdWRpb19zaXplIDwgMCkgewotICAgICAgICAgICAgICAgIC8qIGlmIGVycm9yLCBqdXN0IG91dHB1dCBzaWxlbmNlICovCi0gICAgICAgICAgICAgICBpcy0+YXVkaW9fYnVmICAgICAgPSBpcy0+c2lsZW5jZV9idWY7Ci0gICAgICAgICAgICAgICBpcy0+YXVkaW9fYnVmX3NpemUgPSBzaXplb2YoaXMtPnNpbGVuY2VfYnVmKSAvIGlzLT5hdWRpb190Z3QuZnJhbWVfc2l6ZSAqIGlzLT5hdWRpb190Z3QuZnJhbWVfc2l6ZTsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgIGlmIChpcy0+c2hvd19tb2RlICE9IFNIT1dfTU9ERV9WSURFTykKLSAgICAgICAgICAgICAgICAgICB1cGRhdGVfc2FtcGxlX2Rpc3BsYXkoaXMsIChpbnQxNl90ICopaXMtPmF1ZGlvX2J1ZiwgYXVkaW9fc2l6ZSk7Ci0gICAgICAgICAgICAgICBpcy0+YXVkaW9fYnVmX3NpemUgPSBhdWRpb19zaXplOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlzLT5hdWRpb19idWZfaW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGxlbjEgPSBpcy0+YXVkaW9fYnVmX3NpemUgLSBpcy0+YXVkaW9fYnVmX2luZGV4OwotICAgICAgICBpZiAobGVuMSA+IGxlbikKLSAgICAgICAgICAgIGxlbjEgPSBsZW47Ci0gICAgICAgIGlmICghaXMtPm11dGVkICYmIGlzLT5hdWRpb192b2x1bWUgPT0gU0RMX01JWF9NQVhWT0xVTUUpCi0gICAgICAgICAgICBtZW1jcHkoc3RyZWFtLCAodWludDhfdCAqKWlzLT5hdWRpb19idWYgKyBpcy0+YXVkaW9fYnVmX2luZGV4LCBsZW4xKTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtZW1zZXQoc3RyZWFtLCBpcy0+c2lsZW5jZV9idWZbMF0sIGxlbjEpOwotICAgICAgICAgICAgaWYgKCFpcy0+bXV0ZWQpCi0gICAgICAgICAgICAgICAgU0RMX01peEF1ZGlvKHN0cmVhbSwgKHVpbnQ4X3QgKilpcy0+YXVkaW9fYnVmICsgaXMtPmF1ZGlvX2J1Zl9pbmRleCwgbGVuMSwgaXMtPmF1ZGlvX3ZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuIC09IGxlbjE7Ci0gICAgICAgIHN0cmVhbSArPSBsZW4xOwotICAgICAgICBpcy0+YXVkaW9fYnVmX2luZGV4ICs9IGxlbjE7Ci0gICAgfQotICAgIGlzLT5hdWRpb193cml0ZV9idWZfc2l6ZSA9IGlzLT5hdWRpb19idWZfc2l6ZSAtIGlzLT5hdWRpb19idWZfaW5kZXg7Ci0gICAgLyogTGV0J3MgYXNzdW1lIHRoZSBhdWRpbyBkcml2ZXIgdGhhdCBpcyB1c2VkIGJ5IFNETCBoYXMgdHdvIHBlcmlvZHMuICovCi0gICAgaWYgKCFpc25hbihpcy0+YXVkaW9fY2xvY2spKSB7Ci0gICAgICAgIHNldF9jbG9ja19hdCgmaXMtPmF1ZGNsaywgaXMtPmF1ZGlvX2Nsb2NrIC0gKGRvdWJsZSkoMiAqIGlzLT5hdWRpb19od19idWZfc2l6ZSArIGlzLT5hdWRpb193cml0ZV9idWZfc2l6ZSkgLyBpcy0+YXVkaW9fdGd0LmJ5dGVzX3Blcl9zZWMsIGlzLT5hdWRpb19jbG9ja19zZXJpYWwsIGF1ZGlvX2NhbGxiYWNrX3RpbWUgLyAxMDAwMDAwLjApOwotICAgICAgICBzeW5jX2Nsb2NrX3RvX3NsYXZlKCZpcy0+ZXh0Y2xrLCAmaXMtPmF1ZGNsayk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGF1ZGlvX29wZW4odm9pZCAqb3BhcXVlLCBpbnQ2NF90IHdhbnRlZF9jaGFubmVsX2xheW91dCwgaW50IHdhbnRlZF9uYl9jaGFubmVscywgaW50IHdhbnRlZF9zYW1wbGVfcmF0ZSwgc3RydWN0IEF1ZGlvUGFyYW1zICphdWRpb19od19wYXJhbXMpCi17Ci0gICAgU0RMX0F1ZGlvU3BlYyB3YW50ZWRfc3BlYywgc3BlYzsKLSAgICBjb25zdCBjaGFyICplbnY7Ci0gICAgc3RhdGljIGNvbnN0IGludCBuZXh0X25iX2NoYW5uZWxzW10gPSB7MCwgMCwgMSwgNiwgMiwgNiwgNCwgNn07Ci0gICAgc3RhdGljIGNvbnN0IGludCBuZXh0X3NhbXBsZV9yYXRlc1tdID0gezAsIDQ0MTAwLCA0ODAwMCwgOTYwMDAsIDE5MjAwMH07Ci0gICAgaW50IG5leHRfc2FtcGxlX3JhdGVfaWR4ID0gRkZfQVJSQVlfRUxFTVMobmV4dF9zYW1wbGVfcmF0ZXMpIC0gMTsKLQotICAgIGVudiA9IFNETF9nZXRlbnYoIlNETF9BVURJT19DSEFOTkVMUyIpOwotICAgIGlmIChlbnYpIHsKLSAgICAgICAgd2FudGVkX25iX2NoYW5uZWxzID0gYXRvaShlbnYpOwotICAgICAgICB3YW50ZWRfY2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dCh3YW50ZWRfbmJfY2hhbm5lbHMpOwotICAgIH0KLSAgICBpZiAoIXdhbnRlZF9jaGFubmVsX2xheW91dCB8fCB3YW50ZWRfbmJfY2hhbm5lbHMgIT0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHdhbnRlZF9jaGFubmVsX2xheW91dCkpIHsKLSAgICAgICAgd2FudGVkX2NoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQod2FudGVkX25iX2NoYW5uZWxzKTsKLSAgICAgICAgd2FudGVkX2NoYW5uZWxfbGF5b3V0ICY9IH5BVl9DSF9MQVlPVVRfU1RFUkVPX0RPV05NSVg7Ci0gICAgfQotICAgIHdhbnRlZF9uYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyh3YW50ZWRfY2hhbm5lbF9sYXlvdXQpOwotICAgIHdhbnRlZF9zcGVjLmNoYW5uZWxzID0gd2FudGVkX25iX2NoYW5uZWxzOwotICAgIHdhbnRlZF9zcGVjLmZyZXEgPSB3YW50ZWRfc2FtcGxlX3JhdGU7Ci0gICAgaWYgKHdhbnRlZF9zcGVjLmZyZXEgPD0gMCB8fCB3YW50ZWRfc3BlYy5jaGFubmVscyA8PSAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlIG9yIGNoYW5uZWwgY291bnQhXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICB3aGlsZSAobmV4dF9zYW1wbGVfcmF0ZV9pZHggJiYgbmV4dF9zYW1wbGVfcmF0ZXNbbmV4dF9zYW1wbGVfcmF0ZV9pZHhdID49IHdhbnRlZF9zcGVjLmZyZXEpCi0gICAgICAgIG5leHRfc2FtcGxlX3JhdGVfaWR4LS07Ci0gICAgd2FudGVkX3NwZWMuZm9ybWF0ID0gQVVESU9fUzE2U1lTOwotICAgIHdhbnRlZF9zcGVjLnNpbGVuY2UgPSAwOwotICAgIHdhbnRlZF9zcGVjLnNhbXBsZXMgPSBGRk1BWChTRExfQVVESU9fTUlOX0JVRkZFUl9TSVpFLCAyIDw8IGF2X2xvZzIod2FudGVkX3NwZWMuZnJlcSAvIFNETF9BVURJT19NQVhfQ0FMTEJBQ0tTX1BFUl9TRUMpKTsKLSAgICB3YW50ZWRfc3BlYy5jYWxsYmFjayA9IHNkbF9hdWRpb19jYWxsYmFjazsKLSAgICB3YW50ZWRfc3BlYy51c2VyZGF0YSA9IG9wYXF1ZTsKLSAgICB3aGlsZSAoU0RMX09wZW5BdWRpbygmd2FudGVkX3NwZWMsICZzcGVjKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiU0RMX09wZW5BdWRpbyAoJWQgY2hhbm5lbHMsICVkIEh6KTogJXNcbiIsCi0gICAgICAgICAgICAgICB3YW50ZWRfc3BlYy5jaGFubmVscywgd2FudGVkX3NwZWMuZnJlcSwgU0RMX0dldEVycm9yKCkpOwotICAgICAgICB3YW50ZWRfc3BlYy5jaGFubmVscyA9IG5leHRfbmJfY2hhbm5lbHNbRkZNSU4oNywgd2FudGVkX3NwZWMuY2hhbm5lbHMpXTsKLSAgICAgICAgaWYgKCF3YW50ZWRfc3BlYy5jaGFubmVscykgewotICAgICAgICAgICAgd2FudGVkX3NwZWMuZnJlcSA9IG5leHRfc2FtcGxlX3JhdGVzW25leHRfc2FtcGxlX3JhdGVfaWR4LS1dOwotICAgICAgICAgICAgd2FudGVkX3NwZWMuY2hhbm5lbHMgPSB3YW50ZWRfbmJfY2hhbm5lbHM7Ci0gICAgICAgICAgICBpZiAoIXdhbnRlZF9zcGVjLmZyZXEpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiTm8gbW9yZSBjb21iaW5hdGlvbnMgdG8gdHJ5LCBhdWRpbyBvcGVuIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdhbnRlZF9jaGFubmVsX2xheW91dCA9IGF2X2dldF9kZWZhdWx0X2NoYW5uZWxfbGF5b3V0KHdhbnRlZF9zcGVjLmNoYW5uZWxzKTsKLSAgICB9Ci0gICAgaWYgKHNwZWMuZm9ybWF0ICE9IEFVRElPX1MxNlNZUykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlNETCBhZHZpc2VkIGF1ZGlvIGZvcm1hdCAlZCBpcyBub3Qgc3VwcG9ydGVkIVxuIiwgc3BlYy5mb3JtYXQpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmIChzcGVjLmNoYW5uZWxzICE9IHdhbnRlZF9zcGVjLmNoYW5uZWxzKSB7Ci0gICAgICAgIHdhbnRlZF9jaGFubmVsX2xheW91dCA9IGF2X2dldF9kZWZhdWx0X2NoYW5uZWxfbGF5b3V0KHNwZWMuY2hhbm5lbHMpOwotICAgICAgICBpZiAoIXdhbnRlZF9jaGFubmVsX2xheW91dCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiU0RMIGFkdmlzZWQgY2hhbm5lbCBjb3VudCAlZCBpcyBub3Qgc3VwcG9ydGVkIVxuIiwgc3BlYy5jaGFubmVscyk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhdWRpb19od19wYXJhbXMtPmZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OwotICAgIGF1ZGlvX2h3X3BhcmFtcy0+ZnJlcSA9IHNwZWMuZnJlcTsKLSAgICBhdWRpb19od19wYXJhbXMtPmNoYW5uZWxfbGF5b3V0ID0gd2FudGVkX2NoYW5uZWxfbGF5b3V0OwotICAgIGF1ZGlvX2h3X3BhcmFtcy0+Y2hhbm5lbHMgPSAgc3BlYy5jaGFubmVsczsKLSAgICBhdWRpb19od19wYXJhbXMtPmZyYW1lX3NpemUgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZShOVUxMLCBhdWRpb19od19wYXJhbXMtPmNoYW5uZWxzLCAxLCBhdWRpb19od19wYXJhbXMtPmZtdCwgMSk7Ci0gICAgYXVkaW9faHdfcGFyYW1zLT5ieXRlc19wZXJfc2VjID0gYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoTlVMTCwgYXVkaW9faHdfcGFyYW1zLT5jaGFubmVscywgYXVkaW9faHdfcGFyYW1zLT5mcmVxLCBhdWRpb19od19wYXJhbXMtPmZtdCwgMSk7Ci0gICAgaWYgKGF1ZGlvX2h3X3BhcmFtcy0+Ynl0ZXNfcGVyX3NlYyA8PSAwIHx8IGF1ZGlvX2h3X3BhcmFtcy0+ZnJhbWVfc2l6ZSA8PSAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBzcGVjLnNpemU7Ci19Ci0KLS8qIG9wZW4gYSBnaXZlbiBzdHJlYW0uIFJldHVybiAwIGlmIE9LICovCi1zdGF0aWMgaW50IHN0cmVhbV9jb21wb25lbnRfb3BlbihWaWRlb1N0YXRlICppcywgaW50IHN0cmVhbV9pbmRleCkKLXsKLSAgICBBVkZvcm1hdENvbnRleHQgKmljID0gaXMtPmljOwotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKLSAgICBBVkNvZGVjICpjb2RlYzsKLSAgICBjb25zdCBjaGFyICpmb3JjZWRfY29kZWNfbmFtZSA9IE5VTEw7Ci0gICAgQVZEaWN0aW9uYXJ5ICpvcHRzOwotICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKLSAgICBpbnQgc2FtcGxlX3JhdGUsIG5iX2NoYW5uZWxzOwotICAgIGludDY0X3QgY2hhbm5lbF9sYXlvdXQ7Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgaW50IHN0cmVhbV9sb3dyZXMgPSBsb3dyZXM7Ci0KLSAgICBpZiAoc3RyZWFtX2luZGV4IDwgMCB8fCBzdHJlYW1faW5kZXggPj0gaWMtPm5iX3N0cmVhbXMpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBhdmN0eCA9IGljLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjOwotCi0gICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihhdmN0eC0+Y29kZWNfaWQpOwotCi0gICAgc3dpdGNoKGF2Y3R4LT5jb2RlY190eXBlKXsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU8gICA6IGlzLT5sYXN0X2F1ZGlvX3N0cmVhbSAgICA9IHN0cmVhbV9pbmRleDsgZm9yY2VkX2NvZGVjX25hbWUgPSAgICBhdWRpb19jb2RlY19uYW1lOyBicmVhazsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6IGlzLT5sYXN0X3N1YnRpdGxlX3N0cmVhbSA9IHN0cmVhbV9pbmRleDsgZm9yY2VkX2NvZGVjX25hbWUgPSBzdWJ0aXRsZV9jb2RlY19uYW1lOyBicmVhazsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU8gICA6IGlzLT5sYXN0X3ZpZGVvX3N0cmVhbSAgICA9IHN0cmVhbV9pbmRleDsgZm9yY2VkX2NvZGVjX25hbWUgPSAgICB2aWRlb19jb2RlY19uYW1lOyBicmVhazsKLSAgICB9Ci0gICAgaWYgKGZvcmNlZF9jb2RlY19uYW1lKQotICAgICAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyX2J5X25hbWUoZm9yY2VkX2NvZGVjX25hbWUpOwotICAgIGlmICghY29kZWMpIHsKLSAgICAgICAgaWYgKGZvcmNlZF9jb2RlY19uYW1lKSBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb2RlYyBjb3VsZCBiZSBmb3VuZCB3aXRoIG5hbWUgJyVzJ1xuIiwgZm9yY2VkX2NvZGVjX25hbWUpOwotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNvZGVjIGNvdWxkIGJlIGZvdW5kIHdpdGggaWQgJWRcbiIsIGF2Y3R4LT5jb2RlY19pZCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBhdmN0eC0+Y29kZWNfaWQgPSBjb2RlYy0+aWQ7Ci0gICAgaWYoc3RyZWFtX2xvd3JlcyA+IGF2X2NvZGVjX2dldF9tYXhfbG93cmVzKGNvZGVjKSl7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgbG93cmVzIHN1cHBvcnRlZCBieSB0aGUgZGVjb2RlciBpcyAlZFxuIiwKLSAgICAgICAgICAgICAgICBhdl9jb2RlY19nZXRfbWF4X2xvd3Jlcyhjb2RlYykpOwotICAgICAgICBzdHJlYW1fbG93cmVzID0gYXZfY29kZWNfZ2V0X21heF9sb3dyZXMoY29kZWMpOwotICAgIH0KLSAgICBhdl9jb2RlY19zZXRfbG93cmVzKGF2Y3R4LCBzdHJlYW1fbG93cmVzKTsKLQotI2lmIEZGX0FQSV9FTVVfRURHRQotICAgIGlmKHN0cmVhbV9sb3dyZXMpIGF2Y3R4LT5mbGFncyB8PSBDT0RFQ19GTEFHX0VNVV9FREdFOwotI2VuZGlmCi0gICAgaWYgKGZhc3QpCi0gICAgICAgIGF2Y3R4LT5mbGFnczIgfD0gQVZfQ09ERUNfRkxBRzJfRkFTVDsKLSNpZiBGRl9BUElfRU1VX0VER0UKLSAgICBpZihjb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RSMSkKLSAgICAgICAgYXZjdHgtPmZsYWdzIHw9IENPREVDX0ZMQUdfRU1VX0VER0U7Ci0jZW5kaWYKLQotICAgIG9wdHMgPSBmaWx0ZXJfY29kZWNfb3B0cyhjb2RlY19vcHRzLCBhdmN0eC0+Y29kZWNfaWQsIGljLCBpYy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLCBjb2RlYyk7Ci0gICAgaWYgKCFhdl9kaWN0X2dldChvcHRzLCAidGhyZWFkcyIsIE5VTEwsIDApKQotICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgInRocmVhZHMiLCAiYXV0byIsIDApOwotICAgIGlmIChzdHJlYW1fbG93cmVzKQotICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm9wdHMsICJsb3dyZXMiLCBzdHJlYW1fbG93cmVzLCAwKTsKLSAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8IGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKLSAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJyZWZjb3VudGVkX2ZyYW1lcyIsICIxIiwgMCk7Ci0gICAgaWYgKChyZXQgPSBhdmNvZGVjX29wZW4yKGF2Y3R4LCBjb2RlYywgJm9wdHMpKSA8IDApIHsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBpZiAoKHQgPSBhdl9kaWN0X2dldChvcHRzLCAiIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk9wdGlvbiAlcyBub3QgZm91bmQuXG4iLCB0LT5rZXkpOwotICAgICAgICByZXQgPSAgQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaXMtPmVvZiA9IDA7Ci0gICAgaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9ERUZBVUxUOwotICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSNpZiBDT05GSUdfQVZGSUxURVIKLSAgICAgICAgewotICAgICAgICAgICAgQVZGaWx0ZXJMaW5rICpsaW5rOwotCi0gICAgICAgICAgICBpcy0+YXVkaW9fZmlsdGVyX3NyYy5mcmVxICAgICAgICAgICA9IGF2Y3R4LT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmNoYW5uZWxzICAgICAgID0gYXZjdHgtPmNoYW5uZWxzOwotICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQgPSBnZXRfdmFsaWRfY2hhbm5lbF9sYXlvdXQoYXZjdHgtPmNoYW5uZWxfbGF5b3V0LCBhdmN0eC0+Y2hhbm5lbHMpOwotICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuZm10ICAgICAgICAgICAgPSBhdmN0eC0+c2FtcGxlX2ZtdDsKLSAgICAgICAgICAgIGlmICgocmV0ID0gY29uZmlndXJlX2F1ZGlvX2ZpbHRlcnMoaXMsIGFmaWx0ZXJzLCAwKSkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIGxpbmsgPSBpcy0+b3V0X2F1ZGlvX2ZpbHRlci0+aW5wdXRzWzBdOwotICAgICAgICAgICAgc2FtcGxlX3JhdGUgICAgPSBsaW5rLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgICAgIG5iX2NoYW5uZWxzICAgID0gbGluay0+Y2hhbm5lbHM7Ci0gICAgICAgICAgICBjaGFubmVsX2xheW91dCA9IGxpbmstPmNoYW5uZWxfbGF5b3V0OwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBzYW1wbGVfcmF0ZSAgICA9IGF2Y3R4LT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgbmJfY2hhbm5lbHMgICAgPSBhdmN0eC0+Y2hhbm5lbHM7Ci0gICAgICAgIGNoYW5uZWxfbGF5b3V0ID0gYXZjdHgtPmNoYW5uZWxfbGF5b3V0OwotI2VuZGlmCi0KLSAgICAgICAgLyogcHJlcGFyZSBhdWRpbyBvdXRwdXQgKi8KLSAgICAgICAgaWYgKChyZXQgPSBhdWRpb19vcGVuKGlzLCBjaGFubmVsX2xheW91dCwgbmJfY2hhbm5lbHMsIHNhbXBsZV9yYXRlLCAmaXMtPmF1ZGlvX3RndCkpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgaXMtPmF1ZGlvX2h3X2J1Zl9zaXplID0gcmV0OwotICAgICAgICBpcy0+YXVkaW9fc3JjID0gaXMtPmF1ZGlvX3RndDsKLSAgICAgICAgaXMtPmF1ZGlvX2J1Zl9zaXplICA9IDA7Ci0gICAgICAgIGlzLT5hdWRpb19idWZfaW5kZXggPSAwOwotCi0gICAgICAgIC8qIGluaXQgYXZlcmFnaW5nIGZpbHRlciAqLwotICAgICAgICBpcy0+YXVkaW9fZGlmZl9hdmdfY29lZiAgPSBleHAobG9nKDAuMDEpIC8gQVVESU9fRElGRl9BVkdfTkIpOwotICAgICAgICBpcy0+YXVkaW9fZGlmZl9hdmdfY291bnQgPSAwOwotICAgICAgICAvKiBzaW5jZSB3ZSBkbyBub3QgaGF2ZSBhIHByZWNpc2UgYW5vdWdoIGF1ZGlvIGZpZm8gZnVsbG5lc3MsCi0gICAgICAgICAgIHdlIGNvcnJlY3QgYXVkaW8gc3luYyBvbmx5IGlmIGxhcmdlciB0aGFuIHRoaXMgdGhyZXNob2xkICovCi0gICAgICAgIGlzLT5hdWRpb19kaWZmX3RocmVzaG9sZCA9IChkb3VibGUpKGlzLT5hdWRpb19od19idWZfc2l6ZSkgLyBpcy0+YXVkaW9fdGd0LmJ5dGVzX3Blcl9zZWM7Ci0KLSAgICAgICAgaXMtPmF1ZGlvX3N0cmVhbSA9IHN0cmVhbV9pbmRleDsKLSAgICAgICAgaXMtPmF1ZGlvX3N0ID0gaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKLQotICAgICAgICBkZWNvZGVyX2luaXQoJmlzLT5hdWRkZWMsIGF2Y3R4LCAmaXMtPmF1ZGlvcSwgaXMtPmNvbnRpbnVlX3JlYWRfdGhyZWFkKTsKLSAgICAgICAgaWYgKChpcy0+aWMtPmlmb3JtYXQtPmZsYWdzICYgKEFWRk1UX05PQklOU0VBUkNIIHwgQVZGTVRfTk9HRU5TRUFSQ0ggfCBBVkZNVF9OT19CWVRFX1NFRUspKSAmJiAhaXMtPmljLT5pZm9ybWF0LT5yZWFkX3NlZWspIHsKLSAgICAgICAgICAgIGlzLT5hdWRkZWMuc3RhcnRfcHRzID0gaXMtPmF1ZGlvX3N0LT5zdGFydF90aW1lOwotICAgICAgICAgICAgaXMtPmF1ZGRlYy5zdGFydF9wdHNfdGIgPSBpcy0+YXVkaW9fc3QtPnRpbWVfYmFzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHJldCA9IGRlY29kZXJfc3RhcnQoJmlzLT5hdWRkZWMsIGF1ZGlvX3RocmVhZCwgaXMpKSA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIFNETF9QYXVzZUF1ZGlvKDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgaXMtPnZpZGVvX3N0cmVhbSA9IHN0cmVhbV9pbmRleDsKLSAgICAgICAgaXMtPnZpZGVvX3N0ID0gaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKLQotICAgICAgICBpcy0+dmlkZGVjX3dpZHRoICA9IGF2Y3R4LT53aWR0aDsKLSAgICAgICAgaXMtPnZpZGRlY19oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OwotCi0gICAgICAgIGRlY29kZXJfaW5pdCgmaXMtPnZpZGRlYywgYXZjdHgsICZpcy0+dmlkZW9xLCBpcy0+Y29udGludWVfcmVhZF90aHJlYWQpOwotICAgICAgICBpZiAoKHJldCA9IGRlY29kZXJfc3RhcnQoJmlzLT52aWRkZWMsIHZpZGVvX3RocmVhZCwgaXMpKSA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGlzLT5xdWV1ZV9hdHRhY2htZW50c19yZXEgPSAxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKLSAgICAgICAgaXMtPnN1YnRpdGxlX3N0cmVhbSA9IHN0cmVhbV9pbmRleDsKLSAgICAgICAgaXMtPnN1YnRpdGxlX3N0ID0gaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKLQotICAgICAgICBkZWNvZGVyX2luaXQoJmlzLT5zdWJkZWMsIGF2Y3R4LCAmaXMtPnN1YnRpdGxlcSwgaXMtPmNvbnRpbnVlX3JlYWRfdGhyZWFkKTsKLSAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVyX3N0YXJ0KCZpcy0+c3ViZGVjLCBzdWJ0aXRsZV90aHJlYWQsIGlzKSkgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLWZhaWw6Ci0gICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZGVjb2RlX2ludGVycnVwdF9jYih2b2lkICpjdHgpCi17Ci0gICAgVmlkZW9TdGF0ZSAqaXMgPSBjdHg7Ci0gICAgcmV0dXJuIGlzLT5hYm9ydF9yZXF1ZXN0OwotfQotCi1zdGF0aWMgaW50IGlzX3JlYWx0aW1lKEFWRm9ybWF0Q29udGV4dCAqcykKLXsKLSAgICBpZiggICAhc3RyY21wKHMtPmlmb3JtYXQtPm5hbWUsICJydHAiKQotICAgICAgIHx8ICFzdHJjbXAocy0+aWZvcm1hdC0+bmFtZSwgInJ0c3AiKQotICAgICAgIHx8ICFzdHJjbXAocy0+aWZvcm1hdC0+bmFtZSwgInNkcCIpCi0gICAgKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGlmKHMtPnBiICYmICggICAhc3RybmNtcChzLT5maWxlbmFtZSwgInJ0cDoiLCA0KQotICAgICAgICAgICAgICAgICB8fCAhc3RybmNtcChzLT5maWxlbmFtZSwgInVkcDoiLCA0KQotICAgICAgICAgICAgICAgICkKLSAgICApCi0gICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi0vKiB0aGlzIHRocmVhZCBnZXRzIHRoZSBzdHJlYW0gZnJvbSB0aGUgZGlzayBvciB0aGUgbmV0d29yayAqLwotc3RhdGljIGludCByZWFkX3RocmVhZCh2b2lkICphcmcpCi17Ci0gICAgVmlkZW9TdGF0ZSAqaXMgPSBhcmc7Ci0gICAgQVZGb3JtYXRDb250ZXh0ICppYyA9IE5VTEw7Ci0gICAgaW50IGVyciwgaSwgcmV0OwotICAgIGludCBzdF9pbmRleFtBVk1FRElBX1RZUEVfTkJdOwotICAgIEFWUGFja2V0IHBrdDEsICpwa3QgPSAmcGt0MTsKLSAgICBpbnQ2NF90IHN0cmVhbV9zdGFydF90aW1lOwotICAgIGludCBwa3RfaW5fcGxheV9yYW5nZSA9IDA7Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7Ci0gICAgQVZEaWN0aW9uYXJ5ICoqb3B0czsKLSAgICBpbnQgb3JpZ19uYl9zdHJlYW1zOwotICAgIFNETF9tdXRleCAqd2FpdF9tdXRleCA9IFNETF9DcmVhdGVNdXRleCgpOwotICAgIGludCBzY2FuX2FsbF9wbXRzX3NldCA9IDA7Ci0gICAgaW50NjRfdCBwa3RfdHM7Ci0KLSAgICBpZiAoIXdhaXRfbXV0ZXgpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlNETF9DcmVhdGVNdXRleCgpOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOwotICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBtZW1zZXQoc3RfaW5kZXgsIC0xLCBzaXplb2Yoc3RfaW5kZXgpKTsKLSAgICBpcy0+bGFzdF92aWRlb19zdHJlYW0gPSBpcy0+dmlkZW9fc3RyZWFtID0gLTE7Ci0gICAgaXMtPmxhc3RfYXVkaW9fc3RyZWFtID0gaXMtPmF1ZGlvX3N0cmVhbSA9IC0xOwotICAgIGlzLT5sYXN0X3N1YnRpdGxlX3N0cmVhbSA9IGlzLT5zdWJ0aXRsZV9zdHJlYW0gPSAtMTsKLSAgICBpcy0+ZW9mID0gMDsKLQotICAgIGljID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOwotICAgIGlmICghaWMpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBjb250ZXh0LlxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBpYy0+aW50ZXJydXB0X2NhbGxiYWNrLmNhbGxiYWNrID0gZGVjb2RlX2ludGVycnVwdF9jYjsKLSAgICBpYy0+aW50ZXJydXB0X2NhbGxiYWNrLm9wYXF1ZSA9IGlzOwotICAgIGlmICghYXZfZGljdF9nZXQoZm9ybWF0X29wdHMsICJzY2FuX2FsbF9wbXRzIiwgTlVMTCwgQVZfRElDVF9NQVRDSF9DQVNFKSkgewotICAgICAgICBhdl9kaWN0X3NldCgmZm9ybWF0X29wdHMsICJzY2FuX2FsbF9wbXRzIiwgIjEiLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLSAgICAgICAgc2Nhbl9hbGxfcG10c19zZXQgPSAxOwotICAgIH0KLSAgICBlcnIgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZpYywgaXMtPmZpbGVuYW1lLCBpcy0+aWZvcm1hdCwgJmZvcm1hdF9vcHRzKTsKLSAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICBwcmludF9lcnJvcihpcy0+ZmlsZW5hbWUsIGVycik7Ci0gICAgICAgIHJldCA9IC0xOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICAgIGlmIChzY2FuX2FsbF9wbXRzX3NldCkKLSAgICAgICAgYXZfZGljdF9zZXQoJmZvcm1hdF9vcHRzLCAic2Nhbl9hbGxfcG10cyIsIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSk7Ci0KLSAgICBpZiAoKHQgPSBhdl9kaWN0X2dldChmb3JtYXRfb3B0cywgIiIsIE5VTEwsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJPcHRpb24gJXMgbm90IGZvdW5kLlxuIiwgdC0+a2V5KTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotICAgIGlzLT5pYyA9IGljOwotCi0gICAgaWYgKGdlbnB0cykKLSAgICAgICAgaWMtPmZsYWdzIHw9IEFWRk1UX0ZMQUdfR0VOUFRTOwotCi0gICAgYXZfZm9ybWF0X2luamVjdF9nbG9iYWxfc2lkZV9kYXRhKGljKTsKLQotICAgIG9wdHMgPSBzZXR1cF9maW5kX3N0cmVhbV9pbmZvX29wdHMoaWMsIGNvZGVjX29wdHMpOwotICAgIG9yaWdfbmJfc3RyZWFtcyA9IGljLT5uYl9zdHJlYW1zOwotCi0gICAgZXJyID0gYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhpYywgb3B0cyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgb3JpZ19uYl9zdHJlYW1zOyBpKyspCi0gICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0c1tpXSk7Ci0gICAgYXZfZnJlZXAoJm9wdHMpOwotCi0gICAgaWYgKGVyciA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIiVzOiBjb3VsZCBub3QgZmluZCBjb2RlYyBwYXJhbWV0ZXJzXG4iLCBpcy0+ZmlsZW5hbWUpOwotICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGlmIChpYy0+cGIpCi0gICAgICAgIGljLT5wYi0+ZW9mX3JlYWNoZWQgPSAwOyAvLyBGSVhNRSBoYWNrLCBmZnBsYXkgbWF5YmUgc2hvdWxkIG5vdCB1c2UgYXZpb19mZW9mKCkgdG8gdGVzdCBmb3IgdGhlIGVuZAotCi0gICAgaWYgKHNlZWtfYnlfYnl0ZXMgPCAwKQotICAgICAgICBzZWVrX2J5X2J5dGVzID0gISEoaWMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfVFNfRElTQ09OVCkgJiYgc3RyY21wKCJvZ2ciLCBpYy0+aWZvcm1hdC0+bmFtZSk7Ci0KLSAgICBpcy0+bWF4X2ZyYW1lX2R1cmF0aW9uID0gKGljLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX1RTX0RJU0NPTlQpID8gMTAuMCA6IDM2MDAuMDsKLQotICAgIGlmICghd2luZG93X3RpdGxlICYmICh0ID0gYXZfZGljdF9nZXQoaWMtPm1ldGFkYXRhLCAidGl0bGUiLCBOVUxMLCAwKSkpCi0gICAgICAgIHdpbmRvd190aXRsZSA9IGF2X2FzcHJpbnRmKCIlcyAtICVzIiwgdC0+dmFsdWUsIGlucHV0X2ZpbGVuYW1lKTsKLQotICAgIC8qIGlmIHNlZWtpbmcgcmVxdWVzdGVkLCB3ZSBleGVjdXRlIGl0ICovCi0gICAgaWYgKHN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7Ci0KLSAgICAgICAgdGltZXN0YW1wID0gc3RhcnRfdGltZTsKLSAgICAgICAgLyogYWRkIHRoZSBzdHJlYW0gc3RhcnQgdGltZSAqLwotICAgICAgICBpZiAoaWMtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICB0aW1lc3RhbXAgKz0gaWMtPnN0YXJ0X3RpbWU7Ci0gICAgICAgIHJldCA9IGF2Zm9ybWF0X3NlZWtfZmlsZShpYywgLTEsIElOVDY0X01JTiwgdGltZXN0YW1wLCBJTlQ2NF9NQVgsIDApOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiJXM6IGNvdWxkIG5vdCBzZWVrIHRvIHBvc2l0aW9uICUwLjNmXG4iLAotICAgICAgICAgICAgICAgICAgICBpcy0+ZmlsZW5hbWUsIChkb3VibGUpdGltZXN0YW1wIC8gQVZfVElNRV9CQVNFKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlzLT5yZWFsdGltZSA9IGlzX3JlYWx0aW1lKGljKTsKLQotICAgIGlmIChzaG93X3N0YXR1cykKLSAgICAgICAgYXZfZHVtcF9mb3JtYXQoaWMsIDAsIGlzLT5maWxlbmFtZSwgMCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBBVlN0cmVhbSAqc3QgPSBpYy0+c3RyZWFtc1tpXTsKLSAgICAgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlID0gc3QtPmNvZGVjLT5jb2RlY190eXBlOwotICAgICAgICBzdC0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9BTEw7Ci0gICAgICAgIGlmICh3YW50ZWRfc3RyZWFtX3NwZWNbdHlwZV0gJiYgc3RfaW5kZXhbdHlwZV0gPT0gLTEpCi0gICAgICAgICAgICBpZiAoYXZmb3JtYXRfbWF0Y2hfc3RyZWFtX3NwZWNpZmllcihpYywgc3QsIHdhbnRlZF9zdHJlYW1fc3BlY1t0eXBlXSkgPiAwKQotICAgICAgICAgICAgICAgIHN0X2luZGV4W3R5cGVdID0gaTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IEFWTUVESUFfVFlQRV9OQjsgaSsrKSB7Ci0gICAgICAgIGlmICh3YW50ZWRfc3RyZWFtX3NwZWNbaV0gJiYgc3RfaW5kZXhbaV0gPT0gLTEpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJTdHJlYW0gc3BlY2lmaWVyICVzIGRvZXMgbm90IG1hdGNoIGFueSAlcyBzdHJlYW1cbiIsIHdhbnRlZF9zdHJlYW1fc3BlY1tpXSwgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKGkpKTsKLSAgICAgICAgICAgIHN0X2luZGV4W2ldID0gSU5UX01BWDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghdmlkZW9fZGlzYWJsZSkKLSAgICAgICAgc3RfaW5kZXhbQVZNRURJQV9UWVBFX1ZJREVPXSA9Ci0gICAgICAgICAgICBhdl9maW5kX2Jlc3Rfc3RyZWFtKGljLCBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2luZGV4W0FWTUVESUFfVFlQRV9WSURFT10sIC0xLCBOVUxMLCAwKTsKLSAgICBpZiAoIWF1ZGlvX2Rpc2FibGUpCi0gICAgICAgIHN0X2luZGV4W0FWTUVESUFfVFlQRV9BVURJT10gPQotICAgICAgICAgICAgYXZfZmluZF9iZXN0X3N0cmVhbShpYywgQVZNRURJQV9UWVBFX0FVRElPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9pbmRleFtBVk1FRElBX1RZUEVfQVVESU9dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9pbmRleFtBVk1FRElBX1RZUEVfVklERU9dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKLSAgICBpZiAoIXZpZGVvX2Rpc2FibGUgJiYgIXN1YnRpdGxlX2Rpc2FibGUpCi0gICAgICAgIHN0X2luZGV4W0FWTUVESUFfVFlQRV9TVUJUSVRMRV0gPQotICAgICAgICAgICAgYXZfZmluZF9iZXN0X3N0cmVhbShpYywgQVZNRURJQV9UWVBFX1NVQlRJVExFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9pbmRleFtBVk1FRElBX1RZUEVfU1VCVElUTEVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RfaW5kZXhbQVZNRURJQV9UWVBFX0FVRElPXSA+PSAwID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2luZGV4W0FWTUVESUFfVFlQRV9BVURJT10gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfaW5kZXhbQVZNRURJQV9UWVBFX1ZJREVPXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOwotCi0gICAgaXMtPnNob3dfbW9kZSA9IHNob3dfbW9kZTsKLSAgICBpZiAoc3RfaW5kZXhbQVZNRURJQV9UWVBFX1ZJREVPXSA+PSAwKSB7Ci0gICAgICAgIEFWU3RyZWFtICpzdCA9IGljLT5zdHJlYW1zW3N0X2luZGV4W0FWTUVESUFfVFlQRV9WSURFT11dOwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzdC0+Y29kZWM7Ci0gICAgICAgIEFWUmF0aW9uYWwgc2FyID0gYXZfZ3Vlc3Nfc2FtcGxlX2FzcGVjdF9yYXRpbyhpYywgc3QsIE5VTEwpOwotICAgICAgICBpZiAoYXZjdHgtPndpZHRoKQotICAgICAgICAgICAgc2V0X2RlZmF1bHRfd2luZG93X3NpemUoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBzYXIpOwotICAgIH0KLQotICAgIC8qIG9wZW4gdGhlIHN0cmVhbXMgKi8KLSAgICBpZiAoc3RfaW5kZXhbQVZNRURJQV9UWVBFX0FVRElPXSA+PSAwKSB7Ci0gICAgICAgIHN0cmVhbV9jb21wb25lbnRfb3Blbihpcywgc3RfaW5kZXhbQVZNRURJQV9UWVBFX0FVRElPXSk7Ci0gICAgfQotCi0gICAgcmV0ID0gLTE7Ci0gICAgaWYgKHN0X2luZGV4W0FWTUVESUFfVFlQRV9WSURFT10gPj0gMCkgewotICAgICAgICByZXQgPSBzdHJlYW1fY29tcG9uZW50X29wZW4oaXMsIHN0X2luZGV4W0FWTUVESUFfVFlQRV9WSURFT10pOwotICAgIH0KLSAgICBpZiAoaXMtPnNob3dfbW9kZSA9PSBTSE9XX01PREVfTk9ORSkKLSAgICAgICAgaXMtPnNob3dfbW9kZSA9IHJldCA+PSAwID8gU0hPV19NT0RFX1ZJREVPIDogU0hPV19NT0RFX1JERlQ7Ci0KLSAgICBpZiAoc3RfaW5kZXhbQVZNRURJQV9UWVBFX1NVQlRJVExFXSA+PSAwKSB7Ci0gICAgICAgIHN0cmVhbV9jb21wb25lbnRfb3Blbihpcywgc3RfaW5kZXhbQVZNRURJQV9UWVBFX1NVQlRJVExFXSk7Ci0gICAgfQotCi0gICAgaWYgKGlzLT52aWRlb19zdHJlYW0gPCAwICYmIGlzLT5hdWRpb19zdHJlYW0gPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJGYWlsZWQgdG8gb3BlbiBmaWxlICclcycgb3IgY29uZmlndXJlIGZpbHRlcmdyYXBoXG4iLAotICAgICAgICAgICAgICAgaXMtPmZpbGVuYW1lKTsKLSAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoaW5maW5pdGVfYnVmZmVyIDwgMCAmJiBpcy0+cmVhbHRpbWUpCi0gICAgICAgIGluZmluaXRlX2J1ZmZlciA9IDE7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmIChpcy0+YWJvcnRfcmVxdWVzdCkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoaXMtPnBhdXNlZCAhPSBpcy0+bGFzdF9wYXVzZWQpIHsKLSAgICAgICAgICAgIGlzLT5sYXN0X3BhdXNlZCA9IGlzLT5wYXVzZWQ7Ci0gICAgICAgICAgICBpZiAoaXMtPnBhdXNlZCkKLSAgICAgICAgICAgICAgICBpcy0+cmVhZF9wYXVzZV9yZXR1cm4gPSBhdl9yZWFkX3BhdXNlKGljKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhdl9yZWFkX3BsYXkoaWMpOwotICAgICAgICB9Ci0jaWYgQ09ORklHX1JUU1BfREVNVVhFUiB8fCBDT05GSUdfTU1TSF9QUk9UT0NPTAotICAgICAgICBpZiAoaXMtPnBhdXNlZCAmJgotICAgICAgICAgICAgICAgICghc3RyY21wKGljLT5pZm9ybWF0LT5uYW1lLCAicnRzcCIpIHx8Ci0gICAgICAgICAgICAgICAgIChpYy0+cGIgJiYgIXN0cm5jbXAoaW5wdXRfZmlsZW5hbWUsICJtbXNoOiIsIDUpKSkpIHsKLSAgICAgICAgICAgIC8qIHdhaXQgMTAgbXMgdG8gYXZvaWQgdHJ5aW5nIHRvIGdldCBhbm90aGVyIHBhY2tldCAqLwotICAgICAgICAgICAgLyogWFhYOiBob3JyaWJsZSAqLwotICAgICAgICAgICAgU0RMX0RlbGF5KDEwKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKGlzLT5zZWVrX3JlcSkgewotICAgICAgICAgICAgaW50NjRfdCBzZWVrX3RhcmdldCA9IGlzLT5zZWVrX3BvczsKLSAgICAgICAgICAgIGludDY0X3Qgc2Vla19taW4gICAgPSBpcy0+c2Vla19yZWwgPiAwID8gc2Vla190YXJnZXQgLSBpcy0+c2Vla19yZWwgKyAyOiBJTlQ2NF9NSU47Ci0gICAgICAgICAgICBpbnQ2NF90IHNlZWtfbWF4ICAgID0gaXMtPnNlZWtfcmVsIDwgMCA/IHNlZWtfdGFyZ2V0IC0gaXMtPnNlZWtfcmVsIC0gMjogSU5UNjRfTUFYOwotLy8gRklYTUUgdGhlICstMiBpcyBkdWUgdG8gcm91bmRpbmcgYmVpbmcgbm90IGRvbmUgaW4gdGhlIGNvcnJlY3QgZGlyZWN0aW9uIGluIGdlbmVyYXRpb24KLS8vICAgICAgb2YgdGhlIHNlZWtfcG9zL3NlZWtfcmVsIHZhcmlhYmxlcwotCi0gICAgICAgICAgICByZXQgPSBhdmZvcm1hdF9zZWVrX2ZpbGUoaXMtPmljLCAtMSwgc2Vla19taW4sIHNlZWtfdGFyZ2V0LCBzZWVrX21heCwgaXMtPnNlZWtfZmxhZ3MpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGVycm9yIHdoaWxlIHNlZWtpbmdcbiIsIGlzLT5pYy0+ZmlsZW5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaXMtPmF1ZGlvX3N0cmVhbSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9mbHVzaCgmaXMtPmF1ZGlvcSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXQoJmlzLT5hdWRpb3EsICZmbHVzaF9wa3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaXMtPnN1YnRpdGxlX3N0cmVhbSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9mbHVzaCgmaXMtPnN1YnRpdGxlcSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXQoJmlzLT5zdWJ0aXRsZXEsICZmbHVzaF9wa3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaXMtPnZpZGVvX3N0cmVhbSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9mbHVzaCgmaXMtPnZpZGVvcSk7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXQoJmlzLT52aWRlb3EsICZmbHVzaF9wa3QpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaXMtPnNlZWtfZmxhZ3MgJiBBVlNFRUtfRkxBR19CWVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgc2V0X2Nsb2NrKCZpcy0+ZXh0Y2xrLCBOQU4sIDApOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgc2V0X2Nsb2NrKCZpcy0+ZXh0Y2xrLCBzZWVrX3RhcmdldCAvIChkb3VibGUpQVZfVElNRV9CQVNFLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpcy0+c2Vla19yZXEgPSAwOwotICAgICAgICAgICAgaXMtPnF1ZXVlX2F0dGFjaG1lbnRzX3JlcSA9IDE7Ci0gICAgICAgICAgICBpcy0+ZW9mID0gMDsKLSAgICAgICAgICAgIGlmIChpcy0+cGF1c2VkKQotICAgICAgICAgICAgICAgIHN0ZXBfdG9fbmV4dF9mcmFtZShpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzLT5xdWV1ZV9hdHRhY2htZW50c19yZXEpIHsKLSAgICAgICAgICAgIGlmIChpcy0+dmlkZW9fc3QgJiYgaXMtPnZpZGVvX3N0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykgewotICAgICAgICAgICAgICAgIEFWUGFja2V0IGNvcHk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9jb3B5X3BhY2tldCgmY29weSwgJmlzLT52aWRlb19zdC0+YXR0YWNoZWRfcGljKSkgPCAwKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX3B1dCgmaXMtPnZpZGVvcSwgJmNvcHkpOwotICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXRfbnVsbHBhY2tldCgmaXMtPnZpZGVvcSwgaXMtPnZpZGVvX3N0cmVhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpcy0+cXVldWVfYXR0YWNobWVudHNfcmVxID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlmIHRoZSBxdWV1ZSBhcmUgZnVsbCwgbm8gbmVlZCB0byByZWFkIG1vcmUgKi8KLSAgICAgICAgaWYgKGluZmluaXRlX2J1ZmZlcjwxICYmCi0gICAgICAgICAgICAgIChpcy0+YXVkaW9xLnNpemUgKyBpcy0+dmlkZW9xLnNpemUgKyBpcy0+c3VidGl0bGVxLnNpemUgPiBNQVhfUVVFVUVfU0laRQotICAgICAgICAgICAgfHwgKCAgIChpcy0+YXVkaW9xICAgLm5iX3BhY2tldHMgPiBNSU5fRlJBTUVTIHx8IGlzLT5hdWRpb19zdHJlYW0gPCAwIHx8IGlzLT5hdWRpb3EuYWJvcnRfcmVxdWVzdCkKLSAgICAgICAgICAgICAgICAmJiAoaXMtPnZpZGVvcSAgIC5uYl9wYWNrZXRzID4gTUlOX0ZSQU1FUyB8fCBpcy0+dmlkZW9fc3RyZWFtIDwgMCB8fCBpcy0+dmlkZW9xLmFib3J0X3JlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgfHwgKGlzLT52aWRlb19zdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMpKQotICAgICAgICAgICAgICAgICYmIChpcy0+c3VidGl0bGVxLm5iX3BhY2tldHMgPiBNSU5fRlJBTUVTIHx8IGlzLT5zdWJ0aXRsZV9zdHJlYW0gPCAwIHx8IGlzLT5zdWJ0aXRsZXEuYWJvcnRfcmVxdWVzdCkpKSkgewotICAgICAgICAgICAgLyogd2FpdCAxMCBtcyAqLwotICAgICAgICAgICAgU0RMX0xvY2tNdXRleCh3YWl0X211dGV4KTsKLSAgICAgICAgICAgIFNETF9Db25kV2FpdFRpbWVvdXQoaXMtPmNvbnRpbnVlX3JlYWRfdGhyZWFkLCB3YWl0X211dGV4LCAxMCk7Ci0gICAgICAgICAgICBTRExfVW5sb2NrTXV0ZXgod2FpdF9tdXRleCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWlzLT5wYXVzZWQgJiYKLSAgICAgICAgICAgICghaXMtPmF1ZGlvX3N0IHx8IChpcy0+YXVkZGVjLmZpbmlzaGVkID09IGlzLT5hdWRpb3Euc2VyaWFsICYmIGZyYW1lX3F1ZXVlX25iX3JlbWFpbmluZygmaXMtPnNhbXBxKSA9PSAwKSkgJiYKLSAgICAgICAgICAgICghaXMtPnZpZGVvX3N0IHx8IChpcy0+dmlkZGVjLmZpbmlzaGVkID09IGlzLT52aWRlb3Euc2VyaWFsICYmIGZyYW1lX3F1ZXVlX25iX3JlbWFpbmluZygmaXMtPnBpY3RxKSA9PSAwKSkpIHsKLSAgICAgICAgICAgIGlmIChsb29wICE9IDEgJiYgKCFsb29wIHx8IC0tbG9vcCkpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW1fc2Vlayhpcywgc3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSA/IHN0YXJ0X3RpbWUgOiAwLCAwLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0b2V4aXQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0VPRjsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gYXZfcmVhZF9mcmFtZShpYywgcGt0KTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGlmICgocmV0ID09IEFWRVJST1JfRU9GIHx8IGF2aW9fZmVvZihpYy0+cGIpKSAmJiAhaXMtPmVvZikgewotICAgICAgICAgICAgICAgIGlmIChpcy0+dmlkZW9fc3RyZWFtID49IDApCi0gICAgICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXRfbnVsbHBhY2tldCgmaXMtPnZpZGVvcSwgaXMtPnZpZGVvX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzLT5hdWRpb19zdHJlYW0gPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX3B1dF9udWxscGFja2V0KCZpcy0+YXVkaW9xLCBpcy0+YXVkaW9fc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpZiAoaXMtPnN1YnRpdGxlX3N0cmVhbSA+PSAwKQotICAgICAgICAgICAgICAgICAgICBwYWNrZXRfcXVldWVfcHV0X251bGxwYWNrZXQoJmlzLT5zdWJ0aXRsZXEsIGlzLT5zdWJ0aXRsZV9zdHJlYW0pOwotICAgICAgICAgICAgICAgIGlzLT5lb2YgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGljLT5wYiAmJiBpYy0+cGItPmVycm9yKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgU0RMX0xvY2tNdXRleCh3YWl0X211dGV4KTsKLSAgICAgICAgICAgIFNETF9Db25kV2FpdFRpbWVvdXQoaXMtPmNvbnRpbnVlX3JlYWRfdGhyZWFkLCB3YWl0X211dGV4LCAxMCk7Ci0gICAgICAgICAgICBTRExfVW5sb2NrTXV0ZXgod2FpdF9tdXRleCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlzLT5lb2YgPSAwOwotICAgICAgICB9Ci0gICAgICAgIC8qIGNoZWNrIGlmIHBhY2tldCBpcyBpbiBwbGF5IHJhbmdlIHNwZWNpZmllZCBieSB1c2VyLCB0aGVuIHF1ZXVlLCBvdGhlcndpc2UgZGlzY2FyZCAqLwotICAgICAgICBzdHJlYW1fc3RhcnRfdGltZSA9IGljLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+c3RhcnRfdGltZTsKLSAgICAgICAgcGt0X3RzID0gcGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgPyBwa3QtPmR0cyA6IHBrdC0+cHRzOwotICAgICAgICBwa3RfaW5fcGxheV9yYW5nZSA9IGR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFIHx8Ci0gICAgICAgICAgICAgICAgKHBrdF90cyAtIChzdHJlYW1fc3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSA/IHN0cmVhbV9zdGFydF90aW1lIDogMCkpICoKLSAgICAgICAgICAgICAgICBhdl9xMmQoaWMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT50aW1lX2Jhc2UpIC0KLSAgICAgICAgICAgICAgICAoZG91YmxlKShzdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFID8gc3RhcnRfdGltZSA6IDApIC8gMTAwMDAwMAotICAgICAgICAgICAgICAgIDw9ICgoZG91YmxlKWR1cmF0aW9uIC8gMTAwMDAwMCk7Ci0gICAgICAgIGlmIChwa3QtPnN0cmVhbV9pbmRleCA9PSBpcy0+YXVkaW9fc3RyZWFtICYmIHBrdF9pbl9wbGF5X3JhbmdlKSB7Ci0gICAgICAgICAgICBwYWNrZXRfcXVldWVfcHV0KCZpcy0+YXVkaW9xLCBwa3QpOwotICAgICAgICB9IGVsc2UgaWYgKHBrdC0+c3RyZWFtX2luZGV4ID09IGlzLT52aWRlb19zdHJlYW0gJiYgcGt0X2luX3BsYXlfcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAmJiAhKGlzLT52aWRlb19zdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMpKSB7Ci0gICAgICAgICAgICBwYWNrZXRfcXVldWVfcHV0KCZpcy0+dmlkZW9xLCBwa3QpOwotICAgICAgICB9IGVsc2UgaWYgKHBrdC0+c3RyZWFtX2luZGV4ID09IGlzLT5zdWJ0aXRsZV9zdHJlYW0gJiYgcGt0X2luX3BsYXlfcmFuZ2UpIHsKLSAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXQoJmlzLT5zdWJ0aXRsZXEsIHBrdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldCA9IDA7Ci0gZmFpbDoKLSAgICBpZiAoaWMgJiYgIWlzLT5pYykKLSAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmljKTsKLQotICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICBTRExfRXZlbnQgZXZlbnQ7Ci0KLSAgICAgICAgZXZlbnQudHlwZSA9IEZGX1FVSVRfRVZFTlQ7Ci0gICAgICAgIGV2ZW50LnVzZXIuZGF0YTEgPSBpczsKLSAgICAgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOwotICAgIH0KLSAgICBTRExfRGVzdHJveU11dGV4KHdhaXRfbXV0ZXgpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgVmlkZW9TdGF0ZSAqc3RyZWFtX29wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIEFWSW5wdXRGb3JtYXQgKmlmb3JtYXQpCi17Ci0gICAgVmlkZW9TdGF0ZSAqaXM7Ci0KLSAgICBpcyA9IGF2X21hbGxvY3ooc2l6ZW9mKFZpZGVvU3RhdGUpKTsKLSAgICBpZiAoIWlzKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpcy0+ZmlsZW5hbWUgPSBhdl9zdHJkdXAoZmlsZW5hbWUpOwotICAgIGlmICghaXMtPmZpbGVuYW1lKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgaXMtPmlmb3JtYXQgPSBpZm9ybWF0OwotICAgIGlzLT55dG9wICAgID0gMDsKLSAgICBpcy0+eGxlZnQgICA9IDA7Ci0KLSAgICAvKiBzdGFydCB2aWRlbyBkaXNwbGF5ICovCi0gICAgaWYgKGZyYW1lX3F1ZXVlX2luaXQoJmlzLT5waWN0cSwgJmlzLT52aWRlb3EsIFZJREVPX1BJQ1RVUkVfUVVFVUVfU0laRSwgMSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgaWYgKGZyYW1lX3F1ZXVlX2luaXQoJmlzLT5zdWJwcSwgJmlzLT5zdWJ0aXRsZXEsIFNVQlBJQ1RVUkVfUVVFVUVfU0laRSwgMCkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgaWYgKGZyYW1lX3F1ZXVlX2luaXQoJmlzLT5zYW1wcSwgJmlzLT5hdWRpb3EsIFNBTVBMRV9RVUVVRV9TSVpFLCAxKSA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGlmIChwYWNrZXRfcXVldWVfaW5pdCgmaXMtPnZpZGVvcSkgPCAwIHx8Ci0gICAgICAgIHBhY2tldF9xdWV1ZV9pbml0KCZpcy0+YXVkaW9xKSA8IDAgfHwKLSAgICAgICAgcGFja2V0X3F1ZXVlX2luaXQoJmlzLT5zdWJ0aXRsZXEpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgaWYgKCEoaXMtPmNvbnRpbnVlX3JlYWRfdGhyZWFkID0gU0RMX0NyZWF0ZUNvbmQoKSkpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlNETF9DcmVhdGVDb25kKCk6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpbml0X2Nsb2NrKCZpcy0+dmlkY2xrLCAmaXMtPnZpZGVvcS5zZXJpYWwpOwotICAgIGluaXRfY2xvY2soJmlzLT5hdWRjbGssICZpcy0+YXVkaW9xLnNlcmlhbCk7Ci0gICAgaW5pdF9jbG9jaygmaXMtPmV4dGNsaywgJmlzLT5leHRjbGsuc2VyaWFsKTsKLSAgICBpcy0+YXVkaW9fY2xvY2tfc2VyaWFsID0gLTE7Ci0gICAgaXMtPmF1ZGlvX3ZvbHVtZSA9IFNETF9NSVhfTUFYVk9MVU1FOwotICAgIGlzLT5tdXRlZCA9IDA7Ci0gICAgaXMtPmF2X3N5bmNfdHlwZSA9IGF2X3N5bmNfdHlwZTsKLSAgICBpcy0+cmVhZF90aWQgICAgID0gU0RMX0NyZWF0ZVRocmVhZChyZWFkX3RocmVhZCwgaXMpOwotICAgIGlmICghaXMtPnJlYWRfdGlkKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTRExfQ3JlYXRlVGhyZWFkKCk6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci1mYWlsOgotICAgICAgICBzdHJlYW1fY2xvc2UoaXMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGlzOwotfQotCi1zdGF0aWMgdm9pZCBzdHJlYW1fY3ljbGVfY2hhbm5lbChWaWRlb1N0YXRlICppcywgaW50IGNvZGVjX3R5cGUpCi17Ci0gICAgQVZGb3JtYXRDb250ZXh0ICppYyA9IGlzLT5pYzsKLSAgICBpbnQgc3RhcnRfaW5kZXgsIHN0cmVhbV9pbmRleDsKLSAgICBpbnQgb2xkX2luZGV4OwotICAgIEFWU3RyZWFtICpzdDsKLSAgICBBVlByb2dyYW0gKnAgPSBOVUxMOwotICAgIGludCBuYl9zdHJlYW1zID0gaXMtPmljLT5uYl9zdHJlYW1zOwotCi0gICAgaWYgKGNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgIHN0YXJ0X2luZGV4ID0gaXMtPmxhc3RfdmlkZW9fc3RyZWFtOwotICAgICAgICBvbGRfaW5kZXggPSBpcy0+dmlkZW9fc3RyZWFtOwotICAgIH0gZWxzZSBpZiAoY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgc3RhcnRfaW5kZXggPSBpcy0+bGFzdF9hdWRpb19zdHJlYW07Ci0gICAgICAgIG9sZF9pbmRleCA9IGlzLT5hdWRpb19zdHJlYW07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhcnRfaW5kZXggPSBpcy0+bGFzdF9zdWJ0aXRsZV9zdHJlYW07Ci0gICAgICAgIG9sZF9pbmRleCA9IGlzLT5zdWJ0aXRsZV9zdHJlYW07Ci0gICAgfQotICAgIHN0cmVhbV9pbmRleCA9IHN0YXJ0X2luZGV4OwotCi0gICAgaWYgKGNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGlzLT52aWRlb19zdHJlYW0gIT0gLTEpIHsKLSAgICAgICAgcCA9IGF2X2ZpbmRfcHJvZ3JhbV9mcm9tX3N0cmVhbShpYywgTlVMTCwgaXMtPnZpZGVvX3N0cmVhbSk7Ci0gICAgICAgIGlmIChwKSB7Ci0gICAgICAgICAgICBuYl9zdHJlYW1zID0gcC0+bmJfc3RyZWFtX2luZGV4ZXM7Ci0gICAgICAgICAgICBmb3IgKHN0YXJ0X2luZGV4ID0gMDsgc3RhcnRfaW5kZXggPCBuYl9zdHJlYW1zOyBzdGFydF9pbmRleCsrKQotICAgICAgICAgICAgICAgIGlmIChwLT5zdHJlYW1faW5kZXhbc3RhcnRfaW5kZXhdID09IHN0cmVhbV9pbmRleCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoc3RhcnRfaW5kZXggPT0gbmJfc3RyZWFtcykKLSAgICAgICAgICAgICAgICBzdGFydF9pbmRleCA9IC0xOwotICAgICAgICAgICAgc3RyZWFtX2luZGV4ID0gc3RhcnRfaW5kZXg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGlmICgrK3N0cmVhbV9pbmRleCA+PSBuYl9zdHJlYW1zKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyZWFtX2luZGV4ID0gLTE7Ci0gICAgICAgICAgICAgICAgaXMtPmxhc3Rfc3VidGl0bGVfc3RyZWFtID0gLTE7Ci0gICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0YXJ0X2luZGV4ID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIHN0cmVhbV9pbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA9PSBzdGFydF9pbmRleCkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgc3QgPSBpcy0+aWMtPnN0cmVhbXNbcCA/IHAtPnN0cmVhbV9pbmRleFtzdHJlYW1faW5kZXhdIDogc3RyZWFtX2luZGV4XTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBjb2RlY190eXBlKSB7Ci0gICAgICAgICAgICAvKiBjaGVjayB0aGF0IHBhcmFtZXRlcnMgYXJlIE9LICovCi0gICAgICAgICAgICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAhPSAwKQotICAgICAgICAgICAgICAgICAgICBnb3RvIHRoZV9lbmQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgotICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gdGhlX2VuZDoKLSAgICBpZiAocCAmJiBzdHJlYW1faW5kZXggIT0gLTEpCi0gICAgICAgIHN0cmVhbV9pbmRleCA9IHAtPnN0cmVhbV9pbmRleFtzdHJlYW1faW5kZXhdOwotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlN3aXRjaCAlcyBzdHJlYW0gZnJvbSAjJWQgdG8gIyVkXG4iLAotICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoY29kZWNfdHlwZSksCi0gICAgICAgICAgIG9sZF9pbmRleCwKLSAgICAgICAgICAgc3RyZWFtX2luZGV4KTsKLQotICAgIHN0cmVhbV9jb21wb25lbnRfY2xvc2UoaXMsIG9sZF9pbmRleCk7Ci0gICAgc3RyZWFtX2NvbXBvbmVudF9vcGVuKGlzLCBzdHJlYW1faW5kZXgpOwotfQotCi0KLXN0YXRpYyB2b2lkIHRvZ2dsZV9mdWxsX3NjcmVlbihWaWRlb1N0YXRlICppcykKLXsKLSNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgU0RMX1ZFUlNJT05fQVRMRUFTVCgxLCAyLCAxNCkKLSAgICAvKiBPUyBYIG5lZWRzIHRvIHJlYWxsb2NhdGUgdGhlIFNETCBvdmVybGF5cyAqLwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBWSURFT19QSUNUVVJFX1FVRVVFX1NJWkU7IGkrKykKLSAgICAgICAgaXMtPnBpY3RxLnF1ZXVlW2ldLnJlYWxsb2NhdGUgPSAxOwotI2VuZGlmCi0gICAgaXNfZnVsbF9zY3JlZW4gPSAhaXNfZnVsbF9zY3JlZW47Ci0gICAgdmlkZW9fb3BlbihpcywgMSwgTlVMTCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRvZ2dsZV9hdWRpb19kaXNwbGF5KFZpZGVvU3RhdGUgKmlzKQotewotICAgIGludCBiZ2NvbG9yID0gU0RMX01hcFJHQihzY3JlZW4tPmZvcm1hdCwgMHgwMCwgMHgwMCwgMHgwMCk7Ci0gICAgaW50IG5leHQgPSBpcy0+c2hvd19tb2RlOwotICAgIGRvIHsKLSAgICAgICAgbmV4dCA9IChuZXh0ICsgMSkgJSBTSE9XX01PREVfTkI7Ci0gICAgfSB3aGlsZSAobmV4dCAhPSBpcy0+c2hvd19tb2RlICYmIChuZXh0ID09IFNIT1dfTU9ERV9WSURFTyAmJiAhaXMtPnZpZGVvX3N0IHx8IG5leHQgIT0gU0hPV19NT0RFX1ZJREVPICYmICFpcy0+YXVkaW9fc3QpKTsKLSAgICBpZiAoaXMtPnNob3dfbW9kZSAhPSBuZXh0KSB7Ci0gICAgICAgIGZpbGxfcmVjdGFuZ2xlKHNjcmVlbiwKLSAgICAgICAgICAgICAgICAgICAgaXMtPnhsZWZ0LCBpcy0+eXRvcCwgaXMtPndpZHRoLCBpcy0+aGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBiZ2NvbG9yLCAxKTsKLSAgICAgICAgaXMtPmZvcmNlX3JlZnJlc2ggPSAxOwotICAgICAgICBpcy0+c2hvd19tb2RlID0gbmV4dDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlZnJlc2hfbG9vcF93YWl0X2V2ZW50KFZpZGVvU3RhdGUgKmlzLCBTRExfRXZlbnQgKmV2ZW50KSB7Ci0gICAgZG91YmxlIHJlbWFpbmluZ190aW1lID0gMC4wOwotICAgIFNETF9QdW1wRXZlbnRzKCk7Ci0gICAgd2hpbGUgKCFTRExfUGVlcEV2ZW50cyhldmVudCwgMSwgU0RMX0dFVEVWRU5ULCBTRExfQUxMRVZFTlRTKSkgewotICAgICAgICBpZiAoIWN1cnNvcl9oaWRkZW4gJiYgYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gY3Vyc29yX2xhc3Rfc2hvd24gPiBDVVJTT1JfSElERV9ERUxBWSkgewotICAgICAgICAgICAgU0RMX1Nob3dDdXJzb3IoMCk7Ci0gICAgICAgICAgICBjdXJzb3JfaGlkZGVuID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVtYWluaW5nX3RpbWUgPiAwLjApCi0gICAgICAgICAgICBhdl91c2xlZXAoKGludDY0X3QpKHJlbWFpbmluZ190aW1lICogMTAwMDAwMC4wKSk7Ci0gICAgICAgIHJlbWFpbmluZ190aW1lID0gUkVGUkVTSF9SQVRFOwotICAgICAgICBpZiAoaXMtPnNob3dfbW9kZSAhPSBTSE9XX01PREVfTk9ORSAmJiAoIWlzLT5wYXVzZWQgfHwgaXMtPmZvcmNlX3JlZnJlc2gpKQotICAgICAgICAgICAgdmlkZW9fcmVmcmVzaChpcywgJnJlbWFpbmluZ190aW1lKTsKLSAgICAgICAgU0RMX1B1bXBFdmVudHMoKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNlZWtfY2hhcHRlcihWaWRlb1N0YXRlICppcywgaW50IGluY3IpCi17Ci0gICAgaW50NjRfdCBwb3MgPSBnZXRfbWFzdGVyX2Nsb2NrKGlzKSAqIEFWX1RJTUVfQkFTRTsKLSAgICBpbnQgaTsKLQotICAgIGlmICghaXMtPmljLT5uYl9jaGFwdGVycykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogZmluZCB0aGUgY3VycmVudCBjaGFwdGVyICovCi0gICAgZm9yIChpID0gMDsgaSA8IGlzLT5pYy0+bmJfY2hhcHRlcnM7IGkrKykgewotICAgICAgICBBVkNoYXB0ZXIgKmNoID0gaXMtPmljLT5jaGFwdGVyc1tpXTsKLSAgICAgICAgaWYgKGF2X2NvbXBhcmVfdHMocG9zLCBBVl9USU1FX0JBU0VfUSwgY2gtPnN0YXJ0LCBjaC0+dGltZV9iYXNlKSA8IDApIHsKLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaSArPSBpbmNyOwotICAgIGkgPSBGRk1BWChpLCAwKTsKLSAgICBpZiAoaSA+PSBpcy0+aWMtPm5iX2NoYXB0ZXJzKQotICAgICAgICByZXR1cm47Ci0KLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJTZWVraW5nIHRvIGNoYXB0ZXIgJWQuXG4iLCBpKTsKLSAgICBzdHJlYW1fc2VlayhpcywgYXZfcmVzY2FsZV9xKGlzLT5pYy0+Y2hhcHRlcnNbaV0tPnN0YXJ0LCBpcy0+aWMtPmNoYXB0ZXJzW2ldLT50aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSksIDAsIDApOwotfQotCi0vKiBoYW5kbGUgYW4gZXZlbnQgc2VudCBieSB0aGUgR1VJICovCi1zdGF0aWMgdm9pZCBldmVudF9sb29wKFZpZGVvU3RhdGUgKmN1cl9zdHJlYW0pCi17Ci0gICAgU0RMX0V2ZW50IGV2ZW50OwotICAgIGRvdWJsZSBpbmNyLCBwb3MsIGZyYWM7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGRvdWJsZSB4OwotICAgICAgICByZWZyZXNoX2xvb3Bfd2FpdF9ldmVudChjdXJfc3RyZWFtLCAmZXZlbnQpOwotICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKLSAgICAgICAgY2FzZSBTRExfS0VZRE9XTjoKLSAgICAgICAgICAgIGlmIChleGl0X29uX2tleWRvd24pIHsKLSAgICAgICAgICAgICAgICBkb19leGl0KGN1cl9zdHJlYW0pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkua2V5c3ltLnN5bSkgewotICAgICAgICAgICAgY2FzZSBTRExLX0VTQ0FQRToKLSAgICAgICAgICAgIGNhc2UgU0RMS19xOgotICAgICAgICAgICAgICAgIGRvX2V4aXQoY3VyX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNETEtfZjoKLSAgICAgICAgICAgICAgICB0b2dnbGVfZnVsbF9zY3JlZW4oY3VyX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY3VyX3N0cmVhbS0+Zm9yY2VfcmVmcmVzaCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNETEtfcDoKLSAgICAgICAgICAgIGNhc2UgU0RMS19TUEFDRToKLSAgICAgICAgICAgICAgICB0b2dnbGVfcGF1c2UoY3VyX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNETEtfbToKLSAgICAgICAgICAgICAgICB0b2dnbGVfbXV0ZShjdXJfc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0RMS19LUF9NVUxUSVBMWToKLSAgICAgICAgICAgIGNhc2UgU0RMS18wOgotICAgICAgICAgICAgICAgIHVwZGF0ZV92b2x1bWUoY3VyX3N0cmVhbSwgMSwgU0RMX1ZPTFVNRV9TVEVQKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0RMS19LUF9ESVZJREU6Ci0gICAgICAgICAgICBjYXNlIFNETEtfOToKLSAgICAgICAgICAgICAgICB1cGRhdGVfdm9sdW1lKGN1cl9zdHJlYW0sIC0xLCBTRExfVk9MVU1FX1NURVApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTRExLX3M6IC8vIFM6IFN0ZXAgdG8gbmV4dCBmcmFtZQotICAgICAgICAgICAgICAgIHN0ZXBfdG9fbmV4dF9mcmFtZShjdXJfc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0RMS19hOgotICAgICAgICAgICAgICAgIHN0cmVhbV9jeWNsZV9jaGFubmVsKGN1cl9zdHJlYW0sIEFWTUVESUFfVFlQRV9BVURJTyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNETEtfdjoKLSAgICAgICAgICAgICAgICBzdHJlYW1fY3ljbGVfY2hhbm5lbChjdXJfc3RyZWFtLCBBVk1FRElBX1RZUEVfVklERU8pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTRExLX2M6Ci0gICAgICAgICAgICAgICAgc3RyZWFtX2N5Y2xlX2NoYW5uZWwoY3VyX3N0cmVhbSwgQVZNRURJQV9UWVBFX1ZJREVPKTsKLSAgICAgICAgICAgICAgICBzdHJlYW1fY3ljbGVfY2hhbm5lbChjdXJfc3RyZWFtLCBBVk1FRElBX1RZUEVfQVVESU8pOwotICAgICAgICAgICAgICAgIHN0cmVhbV9jeWNsZV9jaGFubmVsKGN1cl9zdHJlYW0sIEFWTUVESUFfVFlQRV9TVUJUSVRMRSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNETEtfdDoKLSAgICAgICAgICAgICAgICBzdHJlYW1fY3ljbGVfY2hhbm5lbChjdXJfc3RyZWFtLCBBVk1FRElBX1RZUEVfU1VCVElUTEUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTRExLX3c6Ci0jaWYgQ09ORklHX0FWRklMVEVSCi0gICAgICAgICAgICAgICAgaWYgKGN1cl9zdHJlYW0tPnNob3dfbW9kZSA9PSBTSE9XX01PREVfVklERU8gJiYgY3VyX3N0cmVhbS0+dmZpbHRlcl9pZHggPCBuYl92ZmlsdGVycyAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCsrY3VyX3N0cmVhbS0+dmZpbHRlcl9pZHggPj0gbmJfdmZpbHRlcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJfc3RyZWFtLT52ZmlsdGVyX2lkeCA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyX3N0cmVhbS0+dmZpbHRlcl9pZHggPSAwOwotICAgICAgICAgICAgICAgICAgICB0b2dnbGVfYXVkaW9fZGlzcGxheShjdXJfc3RyZWFtKTsKLSAgICAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgICAgIHRvZ2dsZV9hdWRpb19kaXNwbGF5KGN1cl9zdHJlYW0pOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNETEtfUEFHRVVQOgotICAgICAgICAgICAgICAgIGlmIChjdXJfc3RyZWFtLT5pYy0+bmJfY2hhcHRlcnMgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICBpbmNyID0gNjAwLjA7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZG9fc2VlazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vla19jaGFwdGVyKGN1cl9zdHJlYW0sIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTRExLX1BBR0VET1dOOgotICAgICAgICAgICAgICAgIGlmIChjdXJfc3RyZWFtLT5pYy0+bmJfY2hhcHRlcnMgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICBpbmNyID0gLTYwMC4wOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX3NlZWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlZWtfY2hhcHRlcihjdXJfc3RyZWFtLCAtMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNETEtfTEVGVDoKLSAgICAgICAgICAgICAgICBpbmNyID0gLTEwLjA7Ci0gICAgICAgICAgICAgICAgZ290byBkb19zZWVrOwotICAgICAgICAgICAgY2FzZSBTRExLX1JJR0hUOgotICAgICAgICAgICAgICAgIGluY3IgPSAxMC4wOwotICAgICAgICAgICAgICAgIGdvdG8gZG9fc2VlazsKLSAgICAgICAgICAgIGNhc2UgU0RMS19VUDoKLSAgICAgICAgICAgICAgICBpbmNyID0gNjAuMDsKLSAgICAgICAgICAgICAgICBnb3RvIGRvX3NlZWs7Ci0gICAgICAgICAgICBjYXNlIFNETEtfRE9XTjoKLSAgICAgICAgICAgICAgICBpbmNyID0gLTYwLjA7Ci0gICAgICAgICAgICBkb19zZWVrOgotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla19ieV9ieXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgMCAmJiBjdXJfc3RyZWFtLT52aWRlb19zdHJlYW0gPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBmcmFtZV9xdWV1ZV9sYXN0X3BvcygmY3VyX3N0cmVhbS0+cGljdHEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IDAgJiYgY3VyX3N0cmVhbS0+YXVkaW9fc3RyZWFtID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gZnJhbWVfcXVldWVfbGFzdF9wb3MoJmN1cl9zdHJlYW0tPnNhbXBxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGF2aW9fdGVsbChjdXJfc3RyZWFtLT5pYy0+cGIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cl9zdHJlYW0tPmljLT5iaXRfcmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICo9IGN1cl9zdHJlYW0tPmljLT5iaXRfcmF0ZSAvIDguMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICo9IDE4MDAwMC4wOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IGluY3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fc2VlayhjdXJfc3RyZWFtLCBwb3MsIGluY3IsIDEpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gZ2V0X21hc3Rlcl9jbG9jayhjdXJfc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc25hbihwb3MpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IChkb3VibGUpY3VyX3N0cmVhbS0+c2Vla19wb3MgLyBBVl9USU1FX0JBU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gaW5jcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfc3RyZWFtLT5pYy0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSAmJiBwb3MgPCBjdXJfc3RyZWFtLT5pYy0+c3RhcnRfdGltZSAvIChkb3VibGUpQVZfVElNRV9CQVNFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGN1cl9zdHJlYW0tPmljLT5zdGFydF90aW1lIC8gKGRvdWJsZSlBVl9USU1FX0JBU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fc2VlayhjdXJfc3RyZWFtLCAoaW50NjRfdCkocG9zICogQVZfVElNRV9CQVNFKSwgKGludDY0X3QpKGluY3IgKiBBVl9USU1FX0JBU0UpLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9WSURFT0VYUE9TRToKLSAgICAgICAgICAgIGN1cl9zdHJlYW0tPmZvcmNlX3JlZnJlc2ggPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0RMX01PVVNFQlVUVE9ORE9XTjoKLSAgICAgICAgICAgIGlmIChleGl0X29uX21vdXNlZG93bikgewotICAgICAgICAgICAgICAgIGRvX2V4aXQoY3VyX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXZlbnQuYnV0dG9uLmJ1dHRvbiA9PSBTRExfQlVUVE9OX0xFRlQpIHsKLSAgICAgICAgICAgICAgICBzdGF0aWMgaW50NjRfdCBsYXN0X21vdXNlX2xlZnRfY2xpY2sgPSAwOwotICAgICAgICAgICAgICAgIGlmIChhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSBsYXN0X21vdXNlX2xlZnRfY2xpY2sgPD0gNTAwMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRvZ2dsZV9mdWxsX3NjcmVlbihjdXJfc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgY3VyX3N0cmVhbS0+Zm9yY2VfcmVmcmVzaCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RfbW91c2VfbGVmdF9jbGljayA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdF9tb3VzZV9sZWZ0X2NsaWNrID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBTRExfTU9VU0VNT1RJT046Ci0gICAgICAgICAgICBpZiAoY3Vyc29yX2hpZGRlbikgewotICAgICAgICAgICAgICAgIFNETF9TaG93Q3Vyc29yKDEpOwotICAgICAgICAgICAgICAgIGN1cnNvcl9oaWRkZW4gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3Vyc29yX2xhc3Rfc2hvd24gPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7Ci0gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PSBTRExfTU9VU0VCVVRUT05ET1dOKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbi5idXR0b24gIT0gU0RMX0JVVFRPTl9SSUdIVCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgeCA9IGV2ZW50LmJ1dHRvbi54OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoIShldmVudC5tb3Rpb24uc3RhdGUgJiBTRExfQlVUVE9OX1JNQVNLKSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgeCA9IGV2ZW50Lm1vdGlvbi54OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzZWVrX2J5X2J5dGVzIHx8IGN1cl9zdHJlYW0tPmljLT5kdXJhdGlvbiA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHNpemUgPSAgYXZpb19zaXplKGN1cl9zdHJlYW0tPmljLT5wYik7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbV9zZWVrKGN1cl9zdHJlYW0sIHNpemUqeC9jdXJfc3RyZWFtLT53aWR0aCwgMCwgMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5zLCBoaCwgbW0sIHNzOwotICAgICAgICAgICAgICAgICAgICBpbnQgdG5zLCB0aGgsIHRtbSwgdHNzOwotICAgICAgICAgICAgICAgICAgICB0bnMgID0gY3VyX3N0cmVhbS0+aWMtPmR1cmF0aW9uIC8gMTAwMDAwMExMOwotICAgICAgICAgICAgICAgICAgICB0aGggID0gdG5zIC8gMzYwMDsKLSAgICAgICAgICAgICAgICAgICAgdG1tICA9ICh0bnMgJSAzNjAwKSAvIDYwOwotICAgICAgICAgICAgICAgICAgICB0c3MgID0gKHRucyAlIDYwKTsKLSAgICAgICAgICAgICAgICAgICAgZnJhYyA9IHggLyBjdXJfc3RyZWFtLT53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgbnMgICA9IGZyYWMgKiB0bnM7Ci0gICAgICAgICAgICAgICAgICAgIGhoICAgPSBucyAvIDM2MDA7Ci0gICAgICAgICAgICAgICAgICAgIG1tICAgPSAobnMgJSAzNjAwKSAvIDYwOwotICAgICAgICAgICAgICAgICAgICBzcyAgID0gKG5zICUgNjApOwotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VlayB0byAlMi4wZiUlICglMmQ6JTAyZDolMDJkKSBvZiB0b3RhbCBkdXJhdGlvbiAoJTJkOiUwMmQ6JTAyZCkgICAgICAgXG4iLCBmcmFjKjEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaCwgbW0sIHNzLCB0aGgsIHRtbSwgdHNzKTsKLSAgICAgICAgICAgICAgICAgICAgdHMgPSBmcmFjICogY3VyX3N0cmVhbS0+aWMtPmR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICBpZiAoY3VyX3N0cmVhbS0+aWMtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICB0cyArPSBjdXJfc3RyZWFtLT5pYy0+c3RhcnRfdGltZTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3NlZWsoY3VyX3N0cmVhbSwgdHMsIDAsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9WSURFT1JFU0laRToKLSAgICAgICAgICAgICAgICBzY3JlZW4gPSBTRExfU2V0VmlkZW9Nb2RlKEZGTUlOKDE2MzgzLCBldmVudC5yZXNpemUudyksIGV2ZW50LnJlc2l6ZS5oLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0hXU1VSRkFDRXwoaXNfZnVsbF9zY3JlZW4/U0RMX0ZVTExTQ1JFRU46U0RMX1JFU0laQUJMRSl8U0RMX0FTWU5DQkxJVHxTRExfSFdBQ0NFTCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzY3JlZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkZhaWxlZCB0byBzZXQgdmlkZW8gbW9kZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGRvX2V4aXQoY3VyX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNjcmVlbl93aWR0aCAgPSBjdXJfc3RyZWFtLT53aWR0aCAgPSBzY3JlZW4tPnc7Ci0gICAgICAgICAgICAgICAgc2NyZWVuX2hlaWdodCA9IGN1cl9zdHJlYW0tPmhlaWdodCA9IHNjcmVlbi0+aDsKLSAgICAgICAgICAgICAgICBjdXJfc3RyZWFtLT5mb3JjZV9yZWZyZXNoID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9RVUlUOgotICAgICAgICBjYXNlIEZGX1FVSVRfRVZFTlQ6Ci0gICAgICAgICAgICBkb19leGl0KGN1cl9zdHJlYW0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkZfQUxMT0NfRVZFTlQ6Ci0gICAgICAgICAgICBhbGxvY19waWN0dXJlKGV2ZW50LnVzZXIuZGF0YTEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGludCBvcHRfZnJhbWVfc2l6ZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk9wdGlvbiAtcyBpcyBkZXByZWNhdGVkLCB1c2UgLXZpZGVvX3NpemUuXG4iKTsKLSAgICByZXR1cm4gb3B0X2RlZmF1bHQoTlVMTCwgInZpZGVvX3NpemUiLCBhcmcpOwotfQotCi1zdGF0aWMgaW50IG9wdF93aWR0aCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIHNjcmVlbl93aWR0aCA9IHBhcnNlX251bWJlcl9vcl9kaWUob3B0LCBhcmcsIE9QVF9JTlQ2NCwgMSwgSU5UX01BWCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X2hlaWdodCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIHNjcmVlbl9oZWlnaHQgPSBwYXJzZV9udW1iZXJfb3JfZGllKG9wdCwgYXJnLCBPUFRfSU5UNjQsIDEsIElOVF9NQVgpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9wdF9mb3JtYXQodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBmaWxlX2lmb3JtYXQgPSBhdl9maW5kX2lucHV0X2Zvcm1hdChhcmcpOwotICAgIGlmICghZmlsZV9pZm9ybWF0KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbmtub3duIGlucHV0IGZvcm1hdDogJXNcbiIsIGFyZyk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9wdF9mcmFtZV9waXhfZm10KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiT3B0aW9uIC1waXhfZm10IGlzIGRlcHJlY2F0ZWQsIHVzZSAtcGl4ZWxfZm9ybWF0LlxuIik7Ci0gICAgcmV0dXJuIG9wdF9kZWZhdWx0KE5VTEwsICJwaXhlbF9mb3JtYXQiLCBhcmcpOwotfQotCi1zdGF0aWMgaW50IG9wdF9zeW5jKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgaWYgKCFzdHJjbXAoYXJnLCAiYXVkaW8iKSkKLSAgICAgICAgYXZfc3luY190eXBlID0gQVZfU1lOQ19BVURJT19NQVNURVI7Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChhcmcsICJ2aWRlbyIpKQotICAgICAgICBhdl9zeW5jX3R5cGUgPSBBVl9TWU5DX1ZJREVPX01BU1RFUjsKLSAgICBlbHNlIGlmICghc3RyY21wKGFyZywgImV4dCIpKQotICAgICAgICBhdl9zeW5jX3R5cGUgPSBBVl9TWU5DX0VYVEVSTkFMX0NMT0NLOwotICAgIGVsc2UgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biB2YWx1ZSBmb3IgJXM6ICVzXG4iLCBvcHQsIGFyZyk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG9wdF9zZWVrKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgc3RhcnRfdGltZSA9IHBhcnNlX3RpbWVfb3JfZGllKG9wdCwgYXJnLCAxKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvcHRfZHVyYXRpb24odm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBkdXJhdGlvbiA9IHBhcnNlX3RpbWVfb3JfZGllKG9wdCwgYXJnLCAxKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvcHRfc2hvd19tb2RlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgc2hvd19tb2RlID0gIXN0cmNtcChhcmcsICJ2aWRlbyIpID8gU0hPV19NT0RFX1ZJREVPIDoKLSAgICAgICAgICAgICAgICAhc3RyY21wKGFyZywgIndhdmVzIikgPyBTSE9XX01PREVfV0FWRVMgOgotICAgICAgICAgICAgICAgICFzdHJjbXAoYXJnLCAicmRmdCIgKSA/IFNIT1dfTU9ERV9SREZUICA6Ci0gICAgICAgICAgICAgICAgcGFyc2VfbnVtYmVyX29yX2RpZShvcHQsIGFyZywgT1BUX0lOVCwgMCwgU0hPV19NT0RFX05CLTEpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBvcHRfaW5wdXRfZmlsZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIGlmIChpbnB1dF9maWxlbmFtZSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLAotICAgICAgICAgICAgICAgIkFyZ3VtZW50ICclcycgcHJvdmlkZWQgYXMgaW5wdXQgZmlsZW5hbWUsIGJ1dCAnJXMnIHdhcyBhbHJlYWR5IHNwZWNpZmllZC5cbiIsCi0gICAgICAgICAgICAgICAgZmlsZW5hbWUsIGlucHV0X2ZpbGVuYW1lKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICItIikpCi0gICAgICAgIGZpbGVuYW1lID0gInBpcGU6IjsKLSAgICBpbnB1dF9maWxlbmFtZSA9IGZpbGVuYW1lOwotfQotCi1zdGF0aWMgaW50IG9wdF9jb2RlYyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgY29uc3QgY2hhciAqc3BlYyA9IHN0cmNocihvcHQsICc6Jyk7Ci0gICBpZiAoIXNwZWMpIHsKLSAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAiTm8gbWVkaWEgc3BlY2lmaWVyIHdhcyBzcGVjaWZpZWQgaW4gJyVzJyBpbiBvcHRpb24gJyVzJ1xuIiwKLSAgICAgICAgICAgICAgIGFyZywgb3B0KTsKLSAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgfQotICAgc3BlYysrOwotICAgc3dpdGNoIChzcGVjWzBdKSB7Ci0gICBjYXNlICdhJyA6ICAgIGF1ZGlvX2NvZGVjX25hbWUgPSBhcmc7IGJyZWFrOwotICAgY2FzZSAncycgOiBzdWJ0aXRsZV9jb2RlY19uYW1lID0gYXJnOyBicmVhazsKLSAgIGNhc2UgJ3YnIDogICAgdmlkZW9fY29kZWNfbmFtZSA9IGFyZzsgYnJlYWs7Ci0gICBkZWZhdWx0OgotICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICJJbnZhbGlkIG1lZGlhIHNwZWNpZmllciAnJXMnIGluIG9wdGlvbiAnJXMnXG4iLCBzcGVjLCBvcHQpOwotICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICB9Ci0gICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkdW1teTsKLQotc3RhdGljIGNvbnN0IE9wdGlvbkRlZiBvcHRpb25zW10gPSB7Ci0jaW5jbHVkZSAiY21kdXRpbHNfY29tbW9uX29wdHMuaCIKLSAgICB7ICJ4IiwgSEFTX0FSRywgeyAuZnVuY19hcmcgPSBvcHRfd2lkdGggfSwgImZvcmNlIGRpc3BsYXllZCB3aWR0aCIsICJ3aWR0aCIgfSwKLSAgICB7ICJ5IiwgSEFTX0FSRywgeyAuZnVuY19hcmcgPSBvcHRfaGVpZ2h0IH0sICJmb3JjZSBkaXNwbGF5ZWQgaGVpZ2h0IiwgImhlaWdodCIgfSwKLSAgICB7ICJzIiwgSEFTX0FSRyB8IE9QVF9WSURFTywgeyAuZnVuY19hcmcgPSBvcHRfZnJhbWVfc2l6ZSB9LCAic2V0IGZyYW1lIHNpemUgKFd4SCBvciBhYmJyZXZpYXRpb24pIiwgInNpemUiIH0sCi0gICAgeyAiZnMiLCBPUFRfQk9PTCwgeyAmaXNfZnVsbF9zY3JlZW4gfSwgImZvcmNlIGZ1bGwgc2NyZWVuIiB9LAotICAgIHsgImFuIiwgT1BUX0JPT0wsIHsgJmF1ZGlvX2Rpc2FibGUgfSwgImRpc2FibGUgYXVkaW8iIH0sCi0gICAgeyAidm4iLCBPUFRfQk9PTCwgeyAmdmlkZW9fZGlzYWJsZSB9LCAiZGlzYWJsZSB2aWRlbyIgfSwKLSAgICB7ICJzbiIsIE9QVF9CT09MLCB7ICZzdWJ0aXRsZV9kaXNhYmxlIH0sICJkaXNhYmxlIHN1YnRpdGxpbmciIH0sCi0gICAgeyAiYXN0IiwgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfRVhQRVJULCB7ICZ3YW50ZWRfc3RyZWFtX3NwZWNbQVZNRURJQV9UWVBFX0FVRElPXSB9LCAic2VsZWN0IGRlc2lyZWQgYXVkaW8gc3RyZWFtIiwgInN0cmVhbV9zcGVjaWZpZXIiIH0sCi0gICAgeyAidnN0IiwgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfRVhQRVJULCB7ICZ3YW50ZWRfc3RyZWFtX3NwZWNbQVZNRURJQV9UWVBFX1ZJREVPXSB9LCAic2VsZWN0IGRlc2lyZWQgdmlkZW8gc3RyZWFtIiwgInN0cmVhbV9zcGVjaWZpZXIiIH0sCi0gICAgeyAic3N0IiwgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfRVhQRVJULCB7ICZ3YW50ZWRfc3RyZWFtX3NwZWNbQVZNRURJQV9UWVBFX1NVQlRJVExFXSB9LCAic2VsZWN0IGRlc2lyZWQgc3VidGl0bGUgc3RyZWFtIiwgInN0cmVhbV9zcGVjaWZpZXIiIH0sCi0gICAgeyAic3MiLCBIQVNfQVJHLCB7IC5mdW5jX2FyZyA9IG9wdF9zZWVrIH0sICJzZWVrIHRvIGEgZ2l2ZW4gcG9zaXRpb24gaW4gc2Vjb25kcyIsICJwb3MiIH0sCi0gICAgeyAidCIsIEhBU19BUkcsIHsgLmZ1bmNfYXJnID0gb3B0X2R1cmF0aW9uIH0sICJwbGF5ICBcImR1cmF0aW9uXCIgc2Vjb25kcyBvZiBhdWRpby92aWRlbyIsICJkdXJhdGlvbiIgfSwKLSAgICB7ICJieXRlcyIsIE9QVF9JTlQgfCBIQVNfQVJHLCB7ICZzZWVrX2J5X2J5dGVzIH0sICJzZWVrIGJ5IGJ5dGVzIDA9b2ZmIDE9b24gLTE9YXV0byIsICJ2YWwiIH0sCi0gICAgeyAibm9kaXNwIiwgT1BUX0JPT0wsIHsgJmRpc3BsYXlfZGlzYWJsZSB9LCAiZGlzYWJsZSBncmFwaGljYWwgZGlzcGxheSIgfSwKLSAgICB7ICJmIiwgSEFTX0FSRywgeyAuZnVuY19hcmcgPSBvcHRfZm9ybWF0IH0sICJmb3JjZSBmb3JtYXQiLCAiZm10IiB9LAotICAgIHsgInBpeF9mbXQiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9WSURFTywgeyAuZnVuY19hcmcgPSBvcHRfZnJhbWVfcGl4X2ZtdCB9LCAic2V0IHBpeGVsIGZvcm1hdCIsICJmb3JtYXQiIH0sCi0gICAgeyAic3RhdHMiLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsIHsgJnNob3dfc3RhdHVzIH0sICJzaG93IHN0YXR1cyIsICIiIH0sCi0gICAgeyAiZmFzdCIsIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgeyAmZmFzdCB9LCAibm9uIHNwZWMgY29tcGxpYW50IG9wdGltaXphdGlvbnMiLCAiIiB9LAotICAgIHsgImdlbnB0cyIsIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgeyAmZ2VucHRzIH0sICJnZW5lcmF0ZSBwdHMiLCAiIiB9LAotICAgIHsgImRycCIsIE9QVF9JTlQgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgeyAmZGVjb2Rlcl9yZW9yZGVyX3B0cyB9LCAibGV0IGRlY29kZXIgcmVvcmRlciBwdHMgMD1vZmYgMT1vbiAtMT1hdXRvIiwgIiJ9LAotICAgIHsgImxvd3JlcyIsIE9QVF9JTlQgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgeyAmbG93cmVzIH0sICIiLCAiIiB9LAotICAgIHsgInN5bmMiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgeyAuZnVuY19hcmcgPSBvcHRfc3luYyB9LCAic2V0IGF1ZGlvLXZpZGVvIHN5bmMuIHR5cGUgKHR5cGU9YXVkaW8vdmlkZW8vZXh0KSIsICJ0eXBlIiB9LAotICAgIHsgImF1dG9leGl0IiwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCB7ICZhdXRvZXhpdCB9LCAiZXhpdCBhdCB0aGUgZW5kIiwgIiIgfSwKLSAgICB7ICJleGl0b25rZXlkb3duIiwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCB7ICZleGl0X29uX2tleWRvd24gfSwgImV4aXQgb24ga2V5IGRvd24iLCAiIiB9LAotICAgIHsgImV4aXRvbm1vdXNlZG93biIsIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgeyAmZXhpdF9vbl9tb3VzZWRvd24gfSwgImV4aXQgb24gbW91c2UgZG93biIsICIiIH0sCi0gICAgeyAibG9vcCIsIE9QVF9JTlQgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgeyAmbG9vcCB9LCAic2V0IG51bWJlciBvZiB0aW1lcyB0aGUgcGxheWJhY2sgc2hhbGwgYmUgbG9vcGVkIiwgImxvb3AgY291bnQiIH0sCi0gICAgeyAiZnJhbWVkcm9wIiwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCB7ICZmcmFtZWRyb3AgfSwgImRyb3AgZnJhbWVzIHdoZW4gY3B1IGlzIHRvbyBzbG93IiwgIiIgfSwKLSAgICB7ICJpbmZidWYiLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsIHsgJmluZmluaXRlX2J1ZmZlciB9LCAiZG9uJ3QgbGltaXQgdGhlIGlucHV0IGJ1ZmZlciBzaXplICh1c2VmdWwgd2l0aCByZWFsdGltZSBzdHJlYW1zKSIsICIiIH0sCi0gICAgeyAid2luZG93X3RpdGxlIiwgT1BUX1NUUklORyB8IEhBU19BUkcsIHsgJndpbmRvd190aXRsZSB9LCAic2V0IHdpbmRvdyB0aXRsZSIsICJ3aW5kb3cgdGl0bGUiIH0sCi0jaWYgQ09ORklHX0FWRklMVEVSCi0gICAgeyAidmYiLCBPUFRfRVhQRVJUIHwgSEFTX0FSRywgeyAuZnVuY19hcmcgPSBvcHRfYWRkX3ZmaWx0ZXIgfSwgInNldCB2aWRlbyBmaWx0ZXJzIiwgImZpbHRlcl9ncmFwaCIgfSwKLSAgICB7ICJhZiIsIE9QVF9TVFJJTkcgfCBIQVNfQVJHLCB7ICZhZmlsdGVycyB9LCAic2V0IGF1ZGlvIGZpbHRlcnMiLCAiZmlsdGVyX2dyYXBoIiB9LAotI2VuZGlmCi0gICAgeyAicmRmdHNwZWVkIiwgT1BUX0lOVCB8IEhBU19BUkd8IE9QVF9BVURJTyB8IE9QVF9FWFBFUlQsIHsgJnJkZnRzcGVlZCB9LCAicmRmdCBzcGVlZCIsICJtc2VjcyIgfSwKLSAgICB7ICJzaG93bW9kZSIsIEhBU19BUkcsIHsgLmZ1bmNfYXJnID0gb3B0X3Nob3dfbW9kZX0sICJzZWxlY3Qgc2hvdyBtb2RlICgwID0gdmlkZW8sIDEgPSB3YXZlcywgMiA9IFJERlQpIiwgIm1vZGUiIH0sCi0gICAgeyAiZGVmYXVsdCIsIEhBU19BUkcgfCBPUFRfQVVESU8gfCBPUFRfVklERU8gfCBPUFRfRVhQRVJULCB7IC5mdW5jX2FyZyA9IG9wdF9kZWZhdWx0IH0sICJnZW5lcmljIGNhdGNoIGFsbCBvcHRpb24iLCAiIiB9LAotICAgIHsgImkiLCBPUFRfQk9PTCwgeyAmZHVtbXl9LCAicmVhZCBzcGVjaWZpZWQgZmlsZSIsICJpbnB1dF9maWxlIn0sCi0gICAgeyAiY29kZWMiLCBIQVNfQVJHLCB7IC5mdW5jX2FyZyA9IG9wdF9jb2RlY30sICJmb3JjZSBkZWNvZGVyIiwgImRlY29kZXJfbmFtZSIgfSwKLSAgICB7ICJhY29kZWMiLCBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9FWFBFUlQsIHsgICAgJmF1ZGlvX2NvZGVjX25hbWUgfSwgImZvcmNlIGF1ZGlvIGRlY29kZXIiLCAgICAiZGVjb2Rlcl9uYW1lIiB9LAotICAgIHsgInNjb2RlYyIsIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX0VYUEVSVCwgeyAmc3VidGl0bGVfY29kZWNfbmFtZSB9LCAiZm9yY2Ugc3VidGl0bGUgZGVjb2RlciIsICJkZWNvZGVyX25hbWUiIH0sCi0gICAgeyAidmNvZGVjIiwgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfRVhQRVJULCB7ICAgICZ2aWRlb19jb2RlY19uYW1lIH0sICJmb3JjZSB2aWRlbyBkZWNvZGVyIiwgICAgImRlY29kZXJfbmFtZSIgfSwKLSAgICB7ICJhdXRvcm90YXRlIiwgT1BUX0JPT0wsIHsgJmF1dG9yb3RhdGUgfSwgImF1dG9tYXRpY2FsbHkgcm90YXRlIHZpZGVvIiwgIiIgfSwKLSAgICB7IE5VTEwsIH0sCi19OwotCi1zdGF0aWMgdm9pZCBzaG93X3VzYWdlKHZvaWQpCi17Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiU2ltcGxlIG1lZGlhIHBsYXllclxuIik7Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAidXNhZ2U6ICVzIFtvcHRpb25zXSBpbnB1dF9maWxlXG4iLCBwcm9ncmFtX25hbWUpOwotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7Ci19Ci0KLXZvaWQgc2hvd19oZWxwX2RlZmF1bHQoY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfaGVscCk7Ci0gICAgc2hvd191c2FnZSgpOwotICAgIHNob3dfaGVscF9vcHRpb25zKG9wdGlvbnMsICJNYWluIG9wdGlvbnM6IiwgMCwgT1BUX0VYUEVSVCwgMCk7Ci0gICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIkFkdmFuY2VkIG9wdGlvbnM6IiwgT1BUX0VYUEVSVCwgMCwgMCk7Ci0gICAgcHJpbnRmKCJcbiIpOwotICAgIHNob3dfaGVscF9jaGlsZHJlbihhdmNvZGVjX2dldF9jbGFzcygpLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSk7Ci0gICAgc2hvd19oZWxwX2NoaWxkcmVuKGF2Zm9ybWF0X2dldF9jbGFzcygpLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSk7Ci0jaWYgIUNPTkZJR19BVkZJTFRFUgotICAgIHNob3dfaGVscF9jaGlsZHJlbihzd3NfZ2V0X2NsYXNzKCksIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNKTsKLSNlbHNlCi0gICAgc2hvd19oZWxwX2NoaWxkcmVuKGF2ZmlsdGVyX2dldF9jbGFzcygpLCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0pOwotI2VuZGlmCi0gICAgcHJpbnRmKCJcbldoaWxlIHBsYXlpbmc6XG4iCi0gICAgICAgICAgICJxLCBFU0MgICAgICAgICAgICAgIHF1aXRcbiIKLSAgICAgICAgICAgImYgICAgICAgICAgICAgICAgICAgdG9nZ2xlIGZ1bGwgc2NyZWVuXG4iCi0gICAgICAgICAgICJwLCBTUEMgICAgICAgICAgICAgIHBhdXNlXG4iCi0gICAgICAgICAgICJtICAgICAgICAgICAgICAgICAgIHRvZ2dsZSBtdXRlXG4iCi0gICAgICAgICAgICI5LCAwICAgICAgICAgICAgICAgIGRlY3JlYXNlIGFuZCBpbmNyZWFzZSB2b2x1bWUgcmVzcGVjdGl2ZWx5XG4iCi0gICAgICAgICAgICIvLCAqICAgICAgICAgICAgICAgIGRlY3JlYXNlIGFuZCBpbmNyZWFzZSB2b2x1bWUgcmVzcGVjdGl2ZWx5XG4iCi0gICAgICAgICAgICJhICAgICAgICAgICAgICAgICAgIGN5Y2xlIGF1ZGlvIGNoYW5uZWwgaW4gdGhlIGN1cnJlbnQgcHJvZ3JhbVxuIgotICAgICAgICAgICAidiAgICAgICAgICAgICAgICAgICBjeWNsZSB2aWRlbyBjaGFubmVsXG4iCi0gICAgICAgICAgICJ0ICAgICAgICAgICAgICAgICAgIGN5Y2xlIHN1YnRpdGxlIGNoYW5uZWwgaW4gdGhlIGN1cnJlbnQgcHJvZ3JhbVxuIgotICAgICAgICAgICAiYyAgICAgICAgICAgICAgICAgICBjeWNsZSBwcm9ncmFtXG4iCi0gICAgICAgICAgICJ3ICAgICAgICAgICAgICAgICAgIGN5Y2xlIHZpZGVvIGZpbHRlcnMgb3Igc2hvdyBtb2Rlc1xuIgotICAgICAgICAgICAicyAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZSBmcmFtZS1zdGVwIG1vZGVcbiIKLSAgICAgICAgICAgImxlZnQvcmlnaHQgICAgICAgICAgc2VlayBiYWNrd2FyZC9mb3J3YXJkIDEwIHNlY29uZHNcbiIKLSAgICAgICAgICAgImRvd24vdXAgICAgICAgICAgICAgc2VlayBiYWNrd2FyZC9mb3J3YXJkIDEgbWludXRlXG4iCi0gICAgICAgICAgICJwYWdlIGRvd24vcGFnZSB1cCAgIHNlZWsgYmFja3dhcmQvZm9yd2FyZCAxMCBtaW51dGVzXG4iCi0gICAgICAgICAgICJyaWdodCBtb3VzZSBjbGljayAgIHNlZWsgdG8gcGVyY2VudGFnZSBpbiBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gZnJhY3Rpb24gb2Ygd2lkdGhcbiIKLSAgICAgICAgICAgImxlZnQgZG91YmxlLWNsaWNrICAgdG9nZ2xlIGZ1bGwgc2NyZWVuXG4iCi0gICAgICAgICAgICk7Ci19Ci0KLXN0YXRpYyBpbnQgbG9ja21ncih2b2lkICoqbXR4LCBlbnVtIEFWTG9ja09wIG9wKQotewotICAgc3dpdGNoKG9wKSB7Ci0gICAgICBjYXNlIEFWX0xPQ0tfQ1JFQVRFOgotICAgICAgICAgICptdHggPSBTRExfQ3JlYXRlTXV0ZXgoKTsKLSAgICAgICAgICBpZighKm10eCkgewotICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU0RMX0NyZWF0ZU11dGV4KCk6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgIGNhc2UgQVZfTE9DS19PQlRBSU46Ci0gICAgICAgICAgcmV0dXJuICEhU0RMX0xvY2tNdXRleCgqbXR4KTsKLSAgICAgIGNhc2UgQVZfTE9DS19SRUxFQVNFOgotICAgICAgICAgIHJldHVybiAhIVNETF9VbmxvY2tNdXRleCgqbXR4KTsKLSAgICAgIGNhc2UgQVZfTE9DS19ERVNUUk9ZOgotICAgICAgICAgIFNETF9EZXN0cm95TXV0ZXgoKm10eCk7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICB9Ci0gICByZXR1cm4gMTsKLX0KLQotLyogQ2FsbGVkIGZyb20gdGhlIG1haW4gKi8KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgZmxhZ3M7Ci0gICAgVmlkZW9TdGF0ZSAqaXM7Ci0gICAgY2hhciBkdW1teV92aWRlb2RyaXZlcltdID0gIlNETF9WSURFT0RSSVZFUj1kdW1teSI7Ci0KLSAgICBhdl9sb2dfc2V0X2ZsYWdzKEFWX0xPR19TS0lQX1JFUEVBVEVEKTsKLSAgICBwYXJzZV9sb2dsZXZlbChhcmdjLCBhcmd2LCBvcHRpb25zKTsKLQotICAgIC8qIHJlZ2lzdGVyIGFsbCBjb2RlY3MsIGRlbXV4IGFuZCBwcm90b2NvbHMgKi8KLSNpZiBDT05GSUdfQVZERVZJQ0UKLSAgICBhdmRldmljZV9yZWdpc3Rlcl9hbGwoKTsKLSNlbmRpZgotI2lmIENPTkZJR19BVkZJTFRFUgotICAgIGF2ZmlsdGVyX3JlZ2lzdGVyX2FsbCgpOwotI2VuZGlmCi0gICAgYXZfcmVnaXN0ZXJfYWxsKCk7Ci0gICAgYXZmb3JtYXRfbmV0d29ya19pbml0KCk7Ci0KLSAgICBpbml0X29wdHMoKTsKLQotICAgIHNpZ25hbChTSUdJTlQgLCBzaWd0ZXJtX2hhbmRsZXIpOyAvKiBJbnRlcnJ1cHQgKEFOU0kpLiAgICAqLwotICAgIHNpZ25hbChTSUdURVJNLCBzaWd0ZXJtX2hhbmRsZXIpOyAvKiBUZXJtaW5hdGlvbiAoQU5TSSkuICAqLwotCi0gICAgc2hvd19iYW5uZXIoYXJnYywgYXJndiwgb3B0aW9ucyk7Ci0KLSAgICBwYXJzZV9vcHRpb25zKE5VTEwsIGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIG9wdF9pbnB1dF9maWxlKTsKLQotICAgIGlmICghaW5wdXRfZmlsZW5hbWUpIHsKLSAgICAgICAgc2hvd191c2FnZSgpOwotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQW4gaW5wdXQgZmlsZSBtdXN0IGJlIHNwZWNpZmllZFxuIik7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCi0gICAgICAgICAgICAgICAiVXNlIC1oIHRvIGdldCBmdWxsIGhlbHAgb3IsIGV2ZW4gYmV0dGVyLCBydW4gJ21hbiAlcydcbiIsIHByb2dyYW1fbmFtZSk7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgaWYgKGRpc3BsYXlfZGlzYWJsZSkgewotICAgICAgICB2aWRlb19kaXNhYmxlID0gMTsKLSAgICB9Ci0gICAgZmxhZ3MgPSBTRExfSU5JVF9WSURFTyB8IFNETF9JTklUX0FVRElPIHwgU0RMX0lOSVRfVElNRVI7Ci0gICAgaWYgKGF1ZGlvX2Rpc2FibGUpCi0gICAgICAgIGZsYWdzICY9IH5TRExfSU5JVF9BVURJTzsKLSAgICBpZiAoZGlzcGxheV9kaXNhYmxlKQotICAgICAgICBTRExfcHV0ZW52KGR1bW15X3ZpZGVvZHJpdmVyKTsgLyogRm9yIHRoZSBldmVudCBxdWV1ZSwgd2UgYWx3YXlzIG5lZWQgYSB2aWRlbyBkcml2ZXIuICovCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0FQUExFX18pCi0gICAgZmxhZ3MgfD0gU0RMX0lOSVRfRVZFTlRUSFJFQUQ7IC8qIE5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyBvciBNYWMgT1MgWCAqLwotI2VuZGlmCi0gICAgaWYgKFNETF9Jbml0IChmbGFncykpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIFNETCAtICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIoRGlkIHlvdSBzZXQgdGhlIERJU1BMQVkgdmFyaWFibGU/KVxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotCi0gICAgaWYgKCFkaXNwbGF5X2Rpc2FibGUpIHsKLSAgICAgICAgY29uc3QgU0RMX1ZpZGVvSW5mbyAqdmkgPSBTRExfR2V0VmlkZW9JbmZvKCk7Ci0gICAgICAgIGZzX3NjcmVlbl93aWR0aCA9IHZpLT5jdXJyZW50X3c7Ci0gICAgICAgIGZzX3NjcmVlbl9oZWlnaHQgPSB2aS0+Y3VycmVudF9oOwotICAgIH0KLQotICAgIFNETF9FdmVudFN0YXRlKFNETF9BQ1RJVkVFVkVOVCwgU0RMX0lHTk9SRSk7Ci0gICAgU0RMX0V2ZW50U3RhdGUoU0RMX1NZU1dNRVZFTlQsIFNETF9JR05PUkUpOwotICAgIFNETF9FdmVudFN0YXRlKFNETF9VU0VSRVZFTlQsIFNETF9JR05PUkUpOwotCi0gICAgU0RMX0VuYWJsZUtleVJlcGVhdChTRExfREVGQVVMVF9SRVBFQVRfREVMQVksIFNETF9ERUZBVUxUX1JFUEVBVF9JTlRFUlZBTCk7Ci0KLSAgICBpZiAoYXZfbG9ja21ncl9yZWdpc3Rlcihsb2NrbWdyKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGluaXRpYWxpemUgbG9jayBtYW5hZ2VyIVxuIik7Ci0gICAgICAgIGRvX2V4aXQoTlVMTCk7Ci0gICAgfQotCi0gICAgYXZfaW5pdF9wYWNrZXQoJmZsdXNoX3BrdCk7Ci0gICAgZmx1c2hfcGt0LmRhdGEgPSAodWludDhfdCAqKSZmbHVzaF9wa3Q7Ci0KLSAgICBpcyA9IHN0cmVhbV9vcGVuKGlucHV0X2ZpbGVuYW1lLCBmaWxlX2lmb3JtYXQpOwotICAgIGlmICghaXMpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkZhaWxlZCB0byBpbml0aWFsaXplIFZpZGVvU3RhdGUhXG4iKTsKLSAgICAgICAgZG9fZXhpdChOVUxMKTsKLSAgICB9Ci0KLSAgICBldmVudF9sb29wKGlzKTsKLQotICAgIC8qIG5ldmVyIHJldHVybnMgKi8KLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZmZwcm9iZS5jIGIvZmZwcm9iZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2I1MWFkLi4wMDAwMDAwCi0tLSBhL2ZmcHJvYmUuYworKysgL2Rldi9udWxsCkBAIC0xLDMzMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNy0yMDEwIFN0ZWZhbm8gU2FiYXRpbmkKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogc2ltcGxlIG1lZGlhIHByb2JlciBiYXNlZCBvbiB0aGUgRkZtcGVnIGxpYnJhcmllcwotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZmZ2ZXJzaW9uLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9kaXNwbGF5LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2hhc2guaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgotI2luY2x1ZGUgImxpYmF2ZGV2aWNlL2F2ZGV2aWNlLmgiCi0jaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCi0jaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgiCi0jaW5jbHVkZSAibGlicG9zdHByb2MvcG9zdHByb2Nlc3MuaCIKLSNpbmNsdWRlICJjbWR1dGlscy5oIgotCi1jb25zdCBjaGFyIHByb2dyYW1fbmFtZVtdID0gImZmcHJvYmUiOwotY29uc3QgaW50IHByb2dyYW1fYmlydGhfeWVhciA9IDIwMDc7Ci0KLXN0YXRpYyBpbnQgZG9fYml0ZXhhY3QgPSAwOwotc3RhdGljIGludCBkb19jb3VudF9mcmFtZXMgPSAwOwotc3RhdGljIGludCBkb19jb3VudF9wYWNrZXRzID0gMDsKLXN0YXRpYyBpbnQgZG9fcmVhZF9mcmFtZXMgID0gMDsKLXN0YXRpYyBpbnQgZG9fcmVhZF9wYWNrZXRzID0gMDsKLXN0YXRpYyBpbnQgZG9fc2hvd19jaGFwdGVycyA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfZXJyb3IgICA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfZm9ybWF0ICA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfZnJhbWVzICA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfcGFja2V0cyA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfcHJvZ3JhbXMgPSAwOwotc3RhdGljIGludCBkb19zaG93X3N0cmVhbXMgPSAwOwotc3RhdGljIGludCBkb19zaG93X3N0cmVhbV9kaXNwb3NpdGlvbiA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfZGF0YSAgICA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfcHJvZ3JhbV92ZXJzaW9uICA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfbGlicmFyeV92ZXJzaW9ucyA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfcGl4ZWxfZm9ybWF0cyA9IDA7Ci1zdGF0aWMgaW50IGRvX3Nob3dfcGl4ZWxfZm9ybWF0X2ZsYWdzID0gMDsKLXN0YXRpYyBpbnQgZG9fc2hvd19waXhlbF9mb3JtYXRfY29tcG9uZW50cyA9IDA7Ci0KLXN0YXRpYyBpbnQgZG9fc2hvd19jaGFwdGVyX3RhZ3MgPSAwOwotc3RhdGljIGludCBkb19zaG93X2Zvcm1hdF90YWdzID0gMDsKLXN0YXRpYyBpbnQgZG9fc2hvd19mcmFtZV90YWdzID0gMDsKLXN0YXRpYyBpbnQgZG9fc2hvd19wcm9ncmFtX3RhZ3MgPSAwOwotc3RhdGljIGludCBkb19zaG93X3N0cmVhbV90YWdzID0gMDsKLXN0YXRpYyBpbnQgZG9fc2hvd19wYWNrZXRfdGFncyA9IDA7Ci0KLXN0YXRpYyBpbnQgc2hvd192YWx1ZV91bml0ICAgICAgICAgICAgICA9IDA7Ci1zdGF0aWMgaW50IHVzZV92YWx1ZV9wcmVmaXggICAgICAgICAgICAgPSAwOwotc3RhdGljIGludCB1c2VfYnl0ZV92YWx1ZV9iaW5hcnlfcHJlZml4ID0gMDsKLXN0YXRpYyBpbnQgdXNlX3ZhbHVlX3NleGFnZXNpbWFsX2Zvcm1hdCA9IDA7Ci1zdGF0aWMgaW50IHNob3dfcHJpdmF0ZV9kYXRhICAgICAgICAgICAgPSAxOwotCi1zdGF0aWMgY2hhciAqcHJpbnRfZm9ybWF0Owotc3RhdGljIGNoYXIgKnN0cmVhbV9zcGVjaWZpZXI7Ci1zdGF0aWMgY2hhciAqc2hvd19kYXRhX2hhc2g7Ci0KLXR5cGVkZWYgc3RydWN0IFJlYWRJbnRlcnZhbCB7Ci0gICAgaW50IGlkOyAgICAgICAgICAgICAvLy88IGlkZW50aWZpZXIKLSAgICBpbnQ2NF90IHN0YXJ0LCBlbmQ7IC8vLzwgc3RhcnQsIGVuZCBpbiBzZWNvbmQvQVZfVElNRV9CQVNFIHVuaXRzCi0gICAgaW50IGhhc19zdGFydCwgaGFzX2VuZDsKLSAgICBpbnQgc3RhcnRfaXNfb2Zmc2V0LCBlbmRfaXNfb2Zmc2V0OwotICAgIGludCBkdXJhdGlvbl9mcmFtZXM7Ci19IFJlYWRJbnRlcnZhbDsKLQotc3RhdGljIFJlYWRJbnRlcnZhbCAqcmVhZF9pbnRlcnZhbHM7Ci1zdGF0aWMgaW50IHJlYWRfaW50ZXJ2YWxzX25iID0gMDsKLQotLyogc2VjdGlvbiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiAqLwotCi0jZGVmaW5lIFNFQ1RJT05fTUFYX05CX0NISUxEUkVOIDEwCi0KLXN0cnVjdCBzZWN0aW9uIHsKLSAgICBpbnQgaWQ7ICAgICAgICAgICAgIC8vLzwgdW5pcXVlIGlkIGlkZW50aWZ5aW5nIGEgc2VjdGlvbgotICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSNkZWZpbmUgU0VDVElPTl9GTEFHX0lTX1dSQVBQRVIgICAgICAxIC8vLzwgdGhlIHNlY3Rpb24gb25seSBjb250YWlucyBvdGhlciBzZWN0aW9ucywgYnV0IGhhcyBubyBkYXRhIGF0IGl0cyBvd24gbGV2ZWwKLSNkZWZpbmUgU0VDVElPTl9GTEFHX0lTX0FSUkFZICAgICAgICAyIC8vLzwgdGhlIHNlY3Rpb24gY29udGFpbnMgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZQotI2RlZmluZSBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUyA0IC8vLzwgdGhlIHNlY3Rpb24gbWF5IGNvbnRhaW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgZmllbGRzIHdpdGggdmFyaWFibGUga2V5cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gIEZvciB0aGVzZSBzZWN0aW9ucyB0aGUgZWxlbWVudF9uYW1lIGZpZWxkIGlzIG1hbmRhdG9yeS4KLSAgICBpbnQgZmxhZ3M7Ci0gICAgaW50IGNoaWxkcmVuX2lkc1tTRUNUSU9OX01BWF9OQl9DSElMRFJFTisxXTsgLy8vPCBsaXN0IG9mIGNoaWxkcmVuIHNlY3Rpb24gSURTLCB0ZXJtaW5hdGVkIGJ5IC0xCi0gICAgY29uc3QgY2hhciAqZWxlbWVudF9uYW1lOyAvLy88IG5hbWUgb2YgdGhlIGNvbnRhaW5lZCBlbGVtZW50LCBpZiBwcm92aWRlZAotICAgIGNvbnN0IGNoYXIgKnVuaXF1ZV9uYW1lOyAgLy8vPCB1bmlxdWUgc2VjdGlvbiBuYW1lLCBpbiBjYXNlIHRoZSBuYW1lIGlzIGFtYmlndW91cwotICAgIEFWRGljdGlvbmFyeSAqZW50cmllc190b19zaG93OwotICAgIGludCBzaG93X2FsbF9lbnRyaWVzOwotfTsKLQotdHlwZWRlZiBlbnVtIHsKLSAgICBTRUNUSU9OX0lEX05PTkUgPSAtMSwKLSAgICBTRUNUSU9OX0lEX0NIQVBURVIsCi0gICAgU0VDVElPTl9JRF9DSEFQVEVSX1RBR1MsCi0gICAgU0VDVElPTl9JRF9DSEFQVEVSUywKLSAgICBTRUNUSU9OX0lEX0VSUk9SLAotICAgIFNFQ1RJT05fSURfRk9STUFULAotICAgIFNFQ1RJT05fSURfRk9STUFUX1RBR1MsCi0gICAgU0VDVElPTl9JRF9GUkFNRSwKLSAgICBTRUNUSU9OX0lEX0ZSQU1FUywKLSAgICBTRUNUSU9OX0lEX0ZSQU1FX1RBR1MsCi0gICAgU0VDVElPTl9JRF9GUkFNRV9TSURFX0RBVEFfTElTVCwKLSAgICBTRUNUSU9OX0lEX0ZSQU1FX1NJREVfREFUQSwKLSAgICBTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTiwKLSAgICBTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTlMsCi0gICAgU0VDVElPTl9JRF9QQUNLRVQsCi0gICAgU0VDVElPTl9JRF9QQUNLRVRfVEFHUywKLSAgICBTRUNUSU9OX0lEX1BBQ0tFVFMsCi0gICAgU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVMsCi0gICAgU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBX0xJU1QsCi0gICAgU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBLAotICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFULAotICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0ZMQUdTLAotICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0NPTVBPTkVOVCwKLSAgICBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVF9DT01QT05FTlRTLAotICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFUUywKLSAgICBTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNX0RJU1BPU0lUSU9OLAotICAgIFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1fVEFHUywKLSAgICBTRUNUSU9OX0lEX1BST0dSQU0sCi0gICAgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTVMsCi0gICAgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTSwKLSAgICBTRUNUSU9OX0lEX1BST0dSQU1fVEFHUywKLSAgICBTRUNUSU9OX0lEX1BST0dSQU1fVkVSU0lPTiwKLSAgICBTRUNUSU9OX0lEX1BST0dSQU1TLAotICAgIFNFQ1RJT05fSURfUk9PVCwKLSAgICBTRUNUSU9OX0lEX1NUUkVBTSwKLSAgICBTRUNUSU9OX0lEX1NUUkVBTV9ESVNQT1NJVElPTiwKLSAgICBTRUNUSU9OX0lEX1NUUkVBTVMsCi0gICAgU0VDVElPTl9JRF9TVFJFQU1fVEFHUywKLSAgICBTRUNUSU9OX0lEX1NUUkVBTV9TSURFX0RBVEFfTElTVCwKLSAgICBTRUNUSU9OX0lEX1NUUkVBTV9TSURFX0RBVEEsCi0gICAgU0VDVElPTl9JRF9TVUJUSVRMRSwKLX0gU2VjdGlvbklEOwotCi1zdGF0aWMgc3RydWN0IHNlY3Rpb24gc2VjdGlvbnNbXSA9IHsKLSAgICBbU0VDVElPTl9JRF9DSEFQVEVSU10gPSAgICAgICAgICAgeyBTRUNUSU9OX0lEX0NIQVBURVJTLCAiY2hhcHRlcnMiLCBTRUNUSU9OX0ZMQUdfSVNfQVJSQVksIHsgU0VDVElPTl9JRF9DSEFQVEVSLCAtMSB9IH0sCi0gICAgW1NFQ1RJT05fSURfQ0hBUFRFUl0gPSAgICAgICAgICAgIHsgU0VDVElPTl9JRF9DSEFQVEVSLCAiY2hhcHRlciIsIDAsIHsgU0VDVElPTl9JRF9DSEFQVEVSX1RBR1MsIC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9DSEFQVEVSX1RBR1NdID0gICAgICAgeyBTRUNUSU9OX0lEX0NIQVBURVJfVEFHUywgInRhZ3MiLCBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUywgeyAtMSB9LCAuZWxlbWVudF9uYW1lID0gInRhZyIsIC51bmlxdWVfbmFtZSA9ICJjaGFwdGVyX3RhZ3MiIH0sCi0gICAgW1NFQ1RJT05fSURfRVJST1JdID0gICAgICAgICAgICAgIHsgU0VDVElPTl9JRF9FUlJPUiwgImVycm9yIiwgMCwgeyAtMSB9IH0sCi0gICAgW1NFQ1RJT05fSURfRk9STUFUXSA9ICAgICAgICAgICAgIHsgU0VDVElPTl9JRF9GT1JNQVQsICJmb3JtYXQiLCAwLCB7IFNFQ1RJT05fSURfRk9STUFUX1RBR1MsIC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9GT1JNQVRfVEFHU10gPSAgICAgICAgeyBTRUNUSU9OX0lEX0ZPUk1BVF9UQUdTLCAidGFncyIsIFNFQ1RJT05fRkxBR19IQVNfVkFSSUFCTEVfRklFTERTLCB7IC0xIH0sIC5lbGVtZW50X25hbWUgPSAidGFnIiwgLnVuaXF1ZV9uYW1lID0gImZvcm1hdF90YWdzIiB9LAotICAgIFtTRUNUSU9OX0lEX0ZSQU1FU10gPSAgICAgICAgICAgICB7IFNFQ1RJT05fSURfRlJBTUVTLCAiZnJhbWVzIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfRlJBTUUsIFNFQ1RJT05fSURfU1VCVElUTEUsIC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9GUkFNRV0gPSAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX0ZSQU1FLCAiZnJhbWUiLCAwLCB7IFNFQ1RJT05fSURfRlJBTUVfVEFHUywgU0VDVElPTl9JRF9GUkFNRV9TSURFX0RBVEFfTElTVCwgLTEgfSB9LAotICAgIFtTRUNUSU9OX0lEX0ZSQU1FX1RBR1NdID0gICAgICAgICB7IFNFQ1RJT05fSURfRlJBTUVfVEFHUywgInRhZ3MiLCBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUywgeyAtMSB9LCAuZWxlbWVudF9uYW1lID0gInRhZyIsIC51bmlxdWVfbmFtZSA9ICJmcmFtZV90YWdzIiB9LAotICAgIFtTRUNUSU9OX0lEX0ZSQU1FX1NJREVfREFUQV9MSVNUXSA9eyBTRUNUSU9OX0lEX0ZSQU1FX1NJREVfREFUQV9MSVNULCAic2lkZV9kYXRhX2xpc3QiLCBTRUNUSU9OX0ZMQUdfSVNfQVJSQVksIHsgU0VDVElPTl9JRF9GUkFNRV9TSURFX0RBVEEsIC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9GUkFNRV9TSURFX0RBVEFdID0gICAgIHsgU0VDVElPTl9JRF9GUkFNRV9TSURFX0RBVEEsICJzaWRlX2RhdGEiLCAwLCB7IC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9MSUJSQVJZX1ZFUlNJT05TXSA9ICAgeyBTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTlMsICJsaWJyYXJ5X3ZlcnNpb25zIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OLCAtMSB9IH0sCi0gICAgW1NFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OXSA9ICAgIHsgU0VDVElPTl9JRF9MSUJSQVJZX1ZFUlNJT04sICJsaWJyYXJ5X3ZlcnNpb24iLCAwLCB7IC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9QQUNLRVRTXSA9ICAgICAgICAgICAgeyBTRUNUSU9OX0lEX1BBQ0tFVFMsICJwYWNrZXRzIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfUEFDS0VULCAtMX0gfSwKLSAgICBbU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVNdID0geyBTRUNUSU9OX0lEX1BBQ0tFVFNfQU5EX0ZSQU1FUywgInBhY2tldHNfYW5kX2ZyYW1lcyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX1BBQ0tFVCwgLTF9IH0sCi0gICAgW1NFQ1RJT05fSURfUEFDS0VUXSA9ICAgICAgICAgICAgIHsgU0VDVElPTl9JRF9QQUNLRVQsICJwYWNrZXQiLCAwLCB7IFNFQ1RJT05fSURfUEFDS0VUX1RBR1MsIFNFQ1RJT05fSURfUEFDS0VUX1NJREVfREFUQV9MSVNULCAtMSB9IH0sCi0gICAgW1NFQ1RJT05fSURfUEFDS0VUX1RBR1NdID0gICAgICAgIHsgU0VDVElPTl9JRF9QQUNLRVRfVEFHUywgInRhZ3MiLCBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUywgeyAtMSB9LCAuZWxlbWVudF9uYW1lID0gInRhZyIsIC51bmlxdWVfbmFtZSA9ICJwYWNrZXRfdGFncyIgfSwKLSAgICBbU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBX0xJU1RdID17IFNFQ1RJT05fSURfUEFDS0VUX1NJREVfREFUQV9MSVNULCAic2lkZV9kYXRhX2xpc3QiLCBTRUNUSU9OX0ZMQUdfSVNfQVJSQVksIHsgU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBLCAtMSB9IH0sCi0gICAgW1NFQ1RJT05fSURfUEFDS0VUX1NJREVfREFUQV0gPSAgICAgeyBTRUNUSU9OX0lEX1BBQ0tFVF9TSURFX0RBVEEsICJzaWRlX2RhdGEiLCAwLCB7IC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRTXSA9ICAgICAgeyBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVFMsICJwaXhlbF9mb3JtYXRzIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfUElYRUxfRk9STUFULCAtMSB9IH0sCi0gICAgW1NFQ1RJT05fSURfUElYRUxfRk9STUFUXSA9ICAgICAgIHsgU0VDVElPTl9JRF9QSVhFTF9GT1JNQVQsICJwaXhlbF9mb3JtYXQiLCAwLCB7IFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0ZMQUdTLCBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVF9DT01QT05FTlRTLCAtMSB9IH0sCi0gICAgW1NFQ1RJT05fSURfUElYRUxfRk9STUFUX0ZMQUdTXSA9IHsgU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRfRkxBR1MsICJmbGFncyIsIDAsIHsgLTEgfSwgLnVuaXF1ZV9uYW1lID0gInBpeGVsX2Zvcm1hdF9mbGFncyIgfSwKLSAgICBbU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRfQ09NUE9ORU5UU10gPSB7IFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0NPTVBPTkVOVFMsICJjb21wb25lbnRzIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7U0VDVElPTl9JRF9QSVhFTF9GT1JNQVRfQ09NUE9ORU5ULCAtMSB9LCAudW5pcXVlX25hbWUgPSAicGl4ZWxfZm9ybWF0X2NvbXBvbmVudHMiIH0sCi0gICAgW1NFQ1RJT05fSURfUElYRUxfRk9STUFUX0NPTVBPTkVOVF0gID0geyBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVF9DT01QT05FTlQsICJjb21wb25lbnQiLCAwLCB7IC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTV9ESVNQT1NJVElPTl0gPSB7IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1fRElTUE9TSVRJT04sICJkaXNwb3NpdGlvbiIsIDAsIHsgLTEgfSwgLnVuaXF1ZV9uYW1lID0gInByb2dyYW1fc3RyZWFtX2Rpc3Bvc2l0aW9uIiB9LAotICAgIFtTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNX1RBR1NdID0gICAgICAgIHsgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTV9UQUdTLCAidGFncyIsIFNFQ1RJT05fRkxBR19IQVNfVkFSSUFCTEVfRklFTERTLCB7IC0xIH0sIC5lbGVtZW50X25hbWUgPSAidGFnIiwgLnVuaXF1ZV9uYW1lID0gInByb2dyYW1fc3RyZWFtX3RhZ3MiIH0sCi0gICAgW1NFQ1RJT05fSURfUFJPR1JBTV0gPSAgICAgICAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX1BST0dSQU0sICJwcm9ncmFtIiwgMCwgeyBTRUNUSU9OX0lEX1BST0dSQU1fVEFHUywgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTVMsIC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTVNdID0gICAgICAgICAgICB7IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1TLCAic3RyZWFtcyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNLCAtMSB9LCAudW5pcXVlX25hbWUgPSAicHJvZ3JhbV9zdHJlYW1zIiB9LAotICAgIFtTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNXSA9ICAgICAgICAgICAgIHsgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTSwgInN0cmVhbSIsIDAsIHsgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTV9ESVNQT1NJVElPTiwgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTV9UQUdTLCAtMSB9LCAudW5pcXVlX25hbWUgPSAicHJvZ3JhbV9zdHJlYW0iIH0sCi0gICAgW1NFQ1RJT05fSURfUFJPR1JBTV9UQUdTXSA9ICAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX1BST0dSQU1fVEFHUywgInRhZ3MiLCBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUywgeyAtMSB9LCAuZWxlbWVudF9uYW1lID0gInRhZyIsIC51bmlxdWVfbmFtZSA9ICJwcm9ncmFtX3RhZ3MiIH0sCi0gICAgW1NFQ1RJT05fSURfUFJPR1JBTV9WRVJTSU9OXSA9ICAgIHsgU0VDVElPTl9JRF9QUk9HUkFNX1ZFUlNJT04sICJwcm9ncmFtX3ZlcnNpb24iLCAwLCB7IC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9QUk9HUkFNU10gPSAgICAgICAgICAgICAgICAgICB7IFNFQ1RJT05fSURfUFJPR1JBTVMsICJwcm9ncmFtcyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX1BST0dSQU0sIC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9ST09UXSA9ICAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX1JPT1QsICJyb290IiwgU0VDVElPTl9GTEFHX0lTX1dSQVBQRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX0NIQVBURVJTLCBTRUNUSU9OX0lEX0ZPUk1BVCwgU0VDVElPTl9JRF9GUkFNRVMsIFNFQ1RJT05fSURfUFJPR1JBTVMsIFNFQ1RJT05fSURfU1RSRUFNUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fSURfUEFDS0VUUywgU0VDVElPTl9JRF9FUlJPUiwgU0VDVElPTl9JRF9QUk9HUkFNX1ZFUlNJT04sIFNFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFUUywgLTF9IH0sCi0gICAgW1NFQ1RJT05fSURfU1RSRUFNU10gPSAgICAgICAgICAgIHsgU0VDVElPTl9JRF9TVFJFQU1TLCAic3RyZWFtcyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX1NUUkVBTSwgLTEgfSB9LAotICAgIFtTRUNUSU9OX0lEX1NUUkVBTV0gPSAgICAgICAgICAgICB7IFNFQ1RJT05fSURfU1RSRUFNLCAic3RyZWFtIiwgMCwgeyBTRUNUSU9OX0lEX1NUUkVBTV9ESVNQT1NJVElPTiwgU0VDVElPTl9JRF9TVFJFQU1fVEFHUywgU0VDVElPTl9JRF9TVFJFQU1fU0lERV9EQVRBX0xJU1QsIC0xIH0gfSwKLSAgICBbU0VDVElPTl9JRF9TVFJFQU1fRElTUE9TSVRJT05dID0geyBTRUNUSU9OX0lEX1NUUkVBTV9ESVNQT1NJVElPTiwgImRpc3Bvc2l0aW9uIiwgMCwgeyAtMSB9LCAudW5pcXVlX25hbWUgPSAic3RyZWFtX2Rpc3Bvc2l0aW9uIiB9LAotICAgIFtTRUNUSU9OX0lEX1NUUkVBTV9UQUdTXSA9ICAgICAgICB7IFNFQ1RJT05fSURfU1RSRUFNX1RBR1MsICJ0YWdzIiwgU0VDVElPTl9GTEFHX0hBU19WQVJJQUJMRV9GSUVMRFMsIHsgLTEgfSwgLmVsZW1lbnRfbmFtZSA9ICJ0YWciLCAudW5pcXVlX25hbWUgPSAic3RyZWFtX3RhZ3MiIH0sCi0gICAgW1NFQ1RJT05fSURfU1RSRUFNX1NJREVfREFUQV9MSVNUXSA9eyBTRUNUSU9OX0lEX1NUUkVBTV9TSURFX0RBVEFfTElTVCwgInNpZGVfZGF0YV9saXN0IiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfU1RSRUFNX1NJREVfREFUQSwgLTEgfSB9LAotICAgIFtTRUNUSU9OX0lEX1NUUkVBTV9TSURFX0RBVEFdID0gICAgIHsgU0VDVElPTl9JRF9TVFJFQU1fU0lERV9EQVRBLCAic2lkZV9kYXRhIiwgMCwgeyAtMSB9IH0sCi0gICAgW1NFQ1RJT05fSURfU1VCVElUTEVdID0gICAgICAgICAgIHsgU0VDVElPTl9JRF9TVUJUSVRMRSwgInN1YnRpdGxlIiwgMCwgeyAtMSB9IH0sCi19OwotCi1zdGF0aWMgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zOwotCi0vKiBGRnByb2JlIGNvbnRleHQgKi8KLXN0YXRpYyBjb25zdCBjaGFyICppbnB1dF9maWxlbmFtZTsKLXN0YXRpYyBBVklucHV0Rm9ybWF0ICppZm9ybWF0ID0gTlVMTDsKLQotc3RhdGljIHN0cnVjdCBBVkhhc2hDb250ZXh0ICpoYXNoOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICBkb3VibGUgYmluX3ZhbDsKLSAgICBkb3VibGUgZGVjX3ZhbDsKLSAgICBjb25zdCBjaGFyICpiaW5fc3RyOwotICAgIGNvbnN0IGNoYXIgKmRlY19zdHI7Ci19IHNpX3ByZWZpeGVzW10gPSB7Ci0gICAgeyAxLjAsIDEuMCwgIiIsICIiIH0sCi0gICAgeyAxLjAyNGUzLCAxZTMsICJLaSIsICJLIiB9LAotICAgIHsgMS4wNDg1NzZlNiwgMWU2LCAiTWkiLCAiTSIgfSwKLSAgICB7IDEuMDczNzQxODI0ZTksIDFlOSwgIkdpIiwgIkciIH0sCi0gICAgeyAxLjA5OTUxMTYyNzc3NmUxMiwgMWUxMiwgIlRpIiwgIlQiIH0sCi0gICAgeyAxLjEyNTg5OTkwNjg0MjYyNGUxNSwgMWUxNSwgIlBpIiwgIlAiIH0sCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciB1bml0X3NlY29uZF9zdHJbXSAgICAgICAgID0gInMiICAgIDsKLXN0YXRpYyBjb25zdCBjaGFyIHVuaXRfaGVydHpfc3RyW10gICAgICAgICAgPSAiSHoiICAgOwotc3RhdGljIGNvbnN0IGNoYXIgdW5pdF9ieXRlX3N0cltdICAgICAgICAgICA9ICJieXRlIiA7Ci1zdGF0aWMgY29uc3QgY2hhciB1bml0X2JpdF9wZXJfc2Vjb25kX3N0cltdID0gImJpdC9zIjsKLQotc3RhdGljIGludCBuYl9zdHJlYW1zOwotc3RhdGljIHVpbnQ2NF90ICpuYl9zdHJlYW1zX3BhY2tldHM7Ci1zdGF0aWMgdWludDY0X3QgKm5iX3N0cmVhbXNfZnJhbWVzOwotc3RhdGljIGludCAqc2VsZWN0ZWRfc3RyZWFtczsKLQotc3RhdGljIHZvaWQgZmZwcm9iZV9jbGVhbnVwKGludCByZXQpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNlY3Rpb25zKTsgaSsrKQotICAgICAgICBhdl9kaWN0X2ZyZWUoJihzZWN0aW9uc1tpXS5lbnRyaWVzX3RvX3Nob3cpKTsKLX0KLQotc3RydWN0IHVuaXRfdmFsdWUgewotICAgIHVuaW9uIHsgZG91YmxlIGQ7IGxvbmcgbG9uZyBpbnQgaTsgfSB2YWw7Ci0gICAgY29uc3QgY2hhciAqdW5pdDsKLX07Ci0KLXN0YXRpYyBjaGFyICp2YWx1ZV9zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIHN0cnVjdCB1bml0X3ZhbHVlIHV2KQotewotICAgIGRvdWJsZSB2YWxkOwotICAgIGxvbmcgbG9uZyBpbnQgdmFsaTsKLSAgICBpbnQgc2hvd19mbG9hdCA9IDA7Ci0KLSAgICBpZiAodXYudW5pdCA9PSB1bml0X3NlY29uZF9zdHIpIHsKLSAgICAgICAgdmFsZCA9IHV2LnZhbC5kOwotICAgICAgICBzaG93X2Zsb2F0ID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWxkID0gdmFsaSA9IHV2LnZhbC5pOwotICAgIH0KLQotICAgIGlmICh1di51bml0ID09IHVuaXRfc2Vjb25kX3N0ciAmJiB1c2VfdmFsdWVfc2V4YWdlc2ltYWxfZm9ybWF0KSB7Ci0gICAgICAgIGRvdWJsZSBzZWNzOwotICAgICAgICBpbnQgaG91cnMsIG1pbnM7Ci0gICAgICAgIHNlY3MgID0gdmFsZDsKLSAgICAgICAgbWlucyAgPSAoaW50KXNlY3MgLyA2MDsKLSAgICAgICAgc2VjcyAgPSBzZWNzIC0gbWlucyAqIDYwOwotICAgICAgICBob3VycyA9IG1pbnMgLyA2MDsKLSAgICAgICAgbWlucyAlPSA2MDsKLSAgICAgICAgc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiVkOiUwMmQ6JTA5LjZmIiwgaG91cnMsIG1pbnMsIHNlY3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeF9zdHJpbmcgPSAiIjsKLQotICAgICAgICBpZiAodXNlX3ZhbHVlX3ByZWZpeCAmJiB2YWxkID4gMSkgewotICAgICAgICAgICAgbG9uZyBsb25nIGludCBpbmRleDsKLQotICAgICAgICAgICAgaWYgKHV2LnVuaXQgPT0gdW5pdF9ieXRlX3N0ciAmJiB1c2VfYnl0ZV92YWx1ZV9iaW5hcnlfcHJlZml4KSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAobG9uZyBsb25nIGludCkgKGxvZzIodmFsZCkpIC8gMTA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBhdl9jbGlwKGluZGV4LCAwLCBGRl9BUlJBWV9FTEVNUyhzaV9wcmVmaXhlcykgLSAxKTsKLSAgICAgICAgICAgICAgICB2YWxkIC89IHNpX3ByZWZpeGVzW2luZGV4XS5iaW5fdmFsOwotICAgICAgICAgICAgICAgIHByZWZpeF9zdHJpbmcgPSBzaV9wcmVmaXhlc1tpbmRleF0uYmluX3N0cjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSAobG9uZyBsb25nIGludCkgKGxvZzEwKHZhbGQpKSAvIDM7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBhdl9jbGlwKGluZGV4LCAwLCBGRl9BUlJBWV9FTEVNUyhzaV9wcmVmaXhlcykgLSAxKTsKLSAgICAgICAgICAgICAgICB2YWxkIC89IHNpX3ByZWZpeGVzW2luZGV4XS5kZWNfdmFsOwotICAgICAgICAgICAgICAgIHByZWZpeF9zdHJpbmcgPSBzaV9wcmVmaXhlc1tpbmRleF0uZGVjX3N0cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbGkgPSB2YWxkOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNob3dfZmxvYXQgfHwgKHVzZV92YWx1ZV9wcmVmaXggJiYgdmFsZCAhPSAobG9uZyBsb25nIGludCl2YWxkKSkKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICIlZiIsIHZhbGQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJWxsZCIsIHZhbGkpOwotICAgICAgICBhdl9zdHJsY2F0ZihidWYsIGJ1Zl9zaXplLCAiJXMlcyVzIiwgKnByZWZpeF9zdHJpbmcgfHwgc2hvd192YWx1ZV91bml0ID8gIiAiIDogIiIsCi0gICAgICAgICAgICAgICAgIHByZWZpeF9zdHJpbmcsIHNob3dfdmFsdWVfdW5pdCA/IHV2LnVuaXQgOiAiIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotLyogV1JJVEVSUyBBUEkgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgV3JpdGVyQ29udGV4dCBXcml0ZXJDb250ZXh0OwotCi0jZGVmaW5lIFdSSVRFUl9GTEFHX0RJU1BMQVlfT1BUSU9OQUxfRklFTERTIDEKLSNkZWZpbmUgV1JJVEVSX0ZMQUdfUFVUX1BBQ0tFVFNfQU5EX0ZSQU1FU19JTl9TQU1FX0NIQVBURVIgMgotCi10eXBlZGVmIGVudW0gewotICAgIFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9GQUlMLAotICAgIFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9SRVBMQUNFLAotICAgIFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9JR05PUkUsCi0gICAgV1JJVEVSX1NUUklOR19WQUxJREFUSU9OX05CCi19IFN0cmluZ1ZhbGlkYXRpb247Ci0KLXR5cGVkZWYgc3RydWN0IFdyaXRlciB7Ci0gICAgY29uc3QgQVZDbGFzcyAqcHJpdl9jbGFzczsgICAgICAvLy88IHByaXZhdGUgY2xhc3Mgb2YgdGhlIHdyaXRlciwgaWYgYW55Ci0gICAgaW50IHByaXZfc2l6ZTsgICAgICAgICAgICAgICAgICAvLy88IHByaXZhdGUgc2l6ZSBmb3IgdGhlIHdyaXRlciBjb250ZXh0Ci0gICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgIGludCAgKCppbml0KSAgKFdyaXRlckNvbnRleHQgKndjdHgpOwotICAgIHZvaWQgKCp1bmluaXQpKFdyaXRlckNvbnRleHQgKndjdHgpOwotCi0gICAgdm9pZCAoKnByaW50X3NlY3Rpb25faGVhZGVyKShXcml0ZXJDb250ZXh0ICp3Y3R4KTsKLSAgICB2b2lkICgqcHJpbnRfc2VjdGlvbl9mb290ZXIpKFdyaXRlckNvbnRleHQgKndjdHgpOwotICAgIHZvaWQgKCpwcmludF9pbnRlZ2VyKSAgICAgICAoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqLCBsb25nIGxvbmcgaW50KTsKLSAgICB2b2lkICgqcHJpbnRfcmF0aW9uYWwpICAgICAgKFdyaXRlckNvbnRleHQgKndjdHgsIEFWUmF0aW9uYWwgKnEsIGNoYXIgKnNlcCk7Ci0gICAgdm9pZCAoKnByaW50X3N0cmluZykgICAgICAgIChXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7Ci0gICAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8vLzwgYSBjb21iaW5hdGlvbiBvciBXUklURVJfRkxBR18qCi19IFdyaXRlcjsKLQotI2RlZmluZSBTRUNUSU9OX01BWF9OQl9MRVZFTFMgMTAKLQotc3RydWN0IFdyaXRlckNvbnRleHQgewotICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgICAgICAgICAgLy8vPCBjbGFzcyBvZiB0aGUgd3JpdGVyCi0gICAgY29uc3QgV3JpdGVyICp3cml0ZXI7ICAgICAgICAgICAvLy88IHRoZSBXcml0ZXIgb2Ygd2hpY2ggdGhpcyBpcyBhbiBpbnN0YW5jZQotICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBuYW1lIG9mIHRoaXMgd3JpdGVyIGluc3RhbmNlCi0gICAgdm9pZCAqcHJpdjsgICAgICAgICAgICAgICAgICAgICAvLy88IHByaXZhdGUgZGF0YSBmb3IgdXNlIGJ5IHRoZSBmaWx0ZXIKLQotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uczsgLy8vPCBhcnJheSBjb250YWluaW5nIGFsbCBzZWN0aW9ucwotICAgIGludCBuYl9zZWN0aW9uczsgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc2VjdGlvbnMKLQotICAgIGludCBsZXZlbDsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGxldmVsLCBzdGFydGluZyBmcm9tIDAKLQotICAgIC8qKiBudW1iZXIgb2YgdGhlIGl0ZW0gcHJpbnRlZCBpbiB0aGUgZ2l2ZW4gc2VjdGlvbiwgc3RhcnRpbmcgZnJvbSAwICovCi0gICAgdW5zaWduZWQgaW50IG5iX2l0ZW1bU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsKLQotICAgIC8qKiBzZWN0aW9uIHBlciBlYWNoIGxldmVsICovCi0gICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb25bU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsKLSAgICBBVkJQcmludCBzZWN0aW9uX3BidWZbU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsgLy8vPCBnZW5lcmljIHByaW50IGJ1ZmZlciBkZWRpY2F0ZWQgdG8gZWFjaCBzZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gIHVzZWQgYnkgdmFyaW91cyB3cml0ZXJzCi0KLSAgICB1bnNpZ25lZCBpbnQgbmJfc2VjdGlvbl9wYWNrZXQ7IC8vLzwgbnVtYmVyIG9mIHRoZSBwYWNrZXQgc2VjdGlvbiBpbiBjYXNlIHdlIGFyZSBpbiAicGFja2V0c19hbmRfZnJhbWVzIiBzZWN0aW9uCi0gICAgdW5zaWduZWQgaW50IG5iX3NlY3Rpb25fZnJhbWU7ICAvLy88IG51bWJlciBvZiB0aGUgZnJhbWUgIHNlY3Rpb24gaW4gY2FzZSB3ZSBhcmUgaW4gInBhY2tldHNfYW5kX2ZyYW1lcyIgc2VjdGlvbgotICAgIHVuc2lnbmVkIGludCBuYl9zZWN0aW9uX3BhY2tldF9mcmFtZTsgLy8vPCBuYl9zZWN0aW9uX3BhY2tldCBvciBuYl9zZWN0aW9uX2ZyYW1lIGFjY29yZGluZyBpZiBpc19wYWNrZXRzX2FuZF9mcmFtZXMKLQotICAgIGludCBzdHJpbmdfdmFsaWRhdGlvbjsKLSAgICBjaGFyICpzdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudDsKLSAgICB1bnNpZ25lZCBpbnQgc3RyaW5nX3ZhbGlkYXRpb25fdXRmOF9mbGFnczsKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp3cml0ZXJfZ2V0X25hbWUodm9pZCAqcCkKLXsKLSAgICBXcml0ZXJDb250ZXh0ICp3Y3R4ID0gcDsKLSAgICByZXR1cm4gd2N0eC0+d3JpdGVyLT5uYW1lOwotfQotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihXcml0ZXJDb250ZXh0LCB4KQotCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gd3JpdGVyX29wdGlvbnNbXSA9IHsKLSAgICB7ICJzdHJpbmdfdmFsaWRhdGlvbiIsICJzZXQgc3RyaW5nIHZhbGlkYXRpb24gbW9kZSIsCi0gICAgICBPRkZTRVQoc3RyaW5nX3ZhbGlkYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9SRVBMQUNFfSwgMCwgV1JJVEVSX1NUUklOR19WQUxJREFUSU9OX05CLTEsIC51bml0ID0gInN2IiB9LAotICAgIHsgInN2IiwgInNldCBzdHJpbmcgdmFsaWRhdGlvbiBtb2RlIiwKLSAgICAgIE9GRlNFVChzdHJpbmdfdmFsaWRhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9V1JJVEVSX1NUUklOR19WQUxJREFUSU9OX1JFUExBQ0V9LCAwLCBXUklURVJfU1RSSU5HX1ZBTElEQVRJT05fTkItMSwgLnVuaXQgPSAic3YiIH0sCi0gICAgeyAiaWdub3JlIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9JR05PUkV9LCAgLnVuaXQgPSAic3YiIH0sCi0gICAgeyAicmVwbGFjZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9SRVBMQUNFfSwgLnVuaXQgPSAic3YiIH0sCi0gICAgeyAiZmFpbCIsICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9GQUlMfSwgICAgLnVuaXQgPSAic3YiIH0sCi0gICAgeyAic3RyaW5nX3ZhbGlkYXRpb25fcmVwbGFjZW1lbnQiLCAic2V0IHN0cmluZyB2YWxpZGF0aW9uIHJlcGxhY2VtZW50IHN0cmluZyIsIE9GRlNFVChzdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IiJ9fSwKLSAgICB7ICJzdnIiLCAic2V0IHN0cmluZyB2YWxpZGF0aW9uIHJlcGxhY2VtZW50IHN0cmluZyIsIE9GRlNFVChzdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9Ilx4RUZceEJGXHhCRCJ9fSwKLSAgICB7IE5VTEwgfQotfTsKLQotc3RhdGljIHZvaWQgKndyaXRlcl9jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKLXsKLSAgICBXcml0ZXJDb250ZXh0ICpjdHggPSBvYmo7Ci0gICAgaWYgKCFwcmV2ICYmIGN0eC0+d3JpdGVyICYmIGN0eC0+d3JpdGVyLT5wcml2X2NsYXNzICYmIGN0eC0+cHJpdikKLSAgICAgICAgcmV0dXJuIGN0eC0+cHJpdjsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IEFWQ2xhc3Mgd3JpdGVyX2NsYXNzID0gewotICAgIC5jbGFzc19uYW1lID0gIldyaXRlciIsCi0gICAgLml0ZW1fbmFtZSAgPSB3cml0ZXJfZ2V0X25hbWUsCi0gICAgLm9wdGlvbiAgICAgPSB3cml0ZXJfb3B0aW9ucywKLSAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLSAgICAuY2hpbGRfbmV4dCA9IHdyaXRlcl9jaGlsZF9uZXh0LAotfTsKLQotc3RhdGljIHZvaWQgd3JpdGVyX2Nsb3NlKFdyaXRlckNvbnRleHQgKip3Y3R4KQotewotICAgIGludCBpOwotCi0gICAgaWYgKCEqd2N0eCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCgqd2N0eCktPndyaXRlci0+dW5pbml0KQotICAgICAgICAoKndjdHgpLT53cml0ZXItPnVuaW5pdCgqd2N0eCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTUFYX05CX0xFVkVMUzsgaSsrKQotICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJigqd2N0eCktPnNlY3Rpb25fcGJ1ZltpXSwgTlVMTCk7Ci0gICAgaWYgKCgqd2N0eCktPndyaXRlci0+cHJpdl9jbGFzcykKLSAgICAgICAgYXZfb3B0X2ZyZWUoKCp3Y3R4KS0+cHJpdik7Ci0gICAgYXZfZnJlZXAoJigoKndjdHgpLT5wcml2KSk7Ci0gICAgYXZfb3B0X2ZyZWUoKndjdHgpOwotICAgIGF2X2ZyZWVwKHdjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBicHJpbnRfYnl0ZXMoQVZCUHJpbnQgKmJwLCBjb25zdCB1aW50OF90ICp1YnVmLCBzaXplX3QgdWJ1Zl9zaXplKQotewotICAgIGludCBpOwotICAgIGF2X2JwcmludGYoYnAsICIwWCIpOwotICAgIGZvciAoaSA9IDA7IGkgPCB1YnVmX3NpemU7IGkrKykKLSAgICAgICAgYXZfYnByaW50ZihicCwgIiUwMlgiLCB1YnVmW2ldKTsKLX0KLQotCi1zdGF0aWMgaW50IHdyaXRlcl9vcGVuKFdyaXRlckNvbnRleHQgKip3Y3R4LCBjb25zdCBXcml0ZXIgKndyaXRlciwgY29uc3QgY2hhciAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb25zLCBpbnQgbmJfc2VjdGlvbnMpCi17Ci0gICAgaW50IGksIHJldCA9IDA7Ci0KLSAgICBpZiAoISgqd2N0eCA9IGF2X21hbGxvY3ooc2l6ZW9mKFdyaXRlckNvbnRleHQpKSkpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaWYgKCEoKCp3Y3R4KS0+cHJpdiA9IGF2X21hbGxvY3ood3JpdGVyLT5wcml2X3NpemUpKSkgewotICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAoKndjdHgpLT5jbGFzcyA9ICZ3cml0ZXJfY2xhc3M7Ci0gICAgKCp3Y3R4KS0+d3JpdGVyID0gd3JpdGVyOwotICAgICgqd2N0eCktPmxldmVsID0gLTE7Ci0gICAgKCp3Y3R4KS0+c2VjdGlvbnMgPSBzZWN0aW9uczsKLSAgICAoKndjdHgpLT5uYl9zZWN0aW9ucyA9IG5iX3NlY3Rpb25zOwotCi0gICAgYXZfb3B0X3NldF9kZWZhdWx0cygqd2N0eCk7Ci0KLSAgICBpZiAod3JpdGVyLT5wcml2X2NsYXNzKSB7Ci0gICAgICAgIHZvaWQgKnByaXZfY3R4ID0gKCp3Y3R4KS0+cHJpdjsKLSAgICAgICAgKigoY29uc3QgQVZDbGFzcyAqKilwcml2X2N0eCkgPSB3cml0ZXItPnByaXZfY2xhc3M7Ci0gICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMocHJpdl9jdHgpOwotICAgIH0KLQotICAgIC8qIGNvbnZlcnQgb3B0aW9ucyB0byBkaWN0aW9uYXJ5ICovCi0gICAgaWYgKGFyZ3MpIHsKLSAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKLSAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKm9wdCA9IE5VTEw7Ci0KLSAgICAgICAgaWYgKChyZXQgPSBhdl9kaWN0X3BhcnNlX3N0cmluZygmb3B0cywgYXJncywgIj0iLCAiOiIsIDApKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZygqd2N0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHBhcnNlIG9wdGlvbiBzdHJpbmcgJyVzJyBwcm92aWRlZCB0byB3cml0ZXIgY29udGV4dFxuIiwgYXJncyk7Ci0gICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgd2hpbGUgKChvcHQgPSBhdl9kaWN0X2dldChvcHRzLCAiIiwgb3B0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewotICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0KCp3Y3R4LCBvcHQtPmtleSwgb3B0LT52YWx1ZSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZygqd2N0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBvcHRpb24gJyVzJyB3aXRoIHZhbHVlICclcycgcHJvdmlkZWQgdG8gd3JpdGVyIGNvbnRleHRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIG9wdC0+a2V5LCBvcHQtPnZhbHVlKTsKLSAgICAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7Ci0gICAgfQotCi0gICAgLyogdmFsaWRhdGUgcmVwbGFjZSBzdHJpbmcgKi8KLSAgICB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoKndjdHgpLT5zdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudDsKLSAgICAgICAgY29uc3QgdWludDhfdCAqZW5kcCA9IHAgKyBzdHJsZW4ocCk7Ci0gICAgICAgIHdoaWxlICgqcCkgewotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcDAgPSBwOwotICAgICAgICAgICAgaW50MzJfdCBjb2RlOwotICAgICAgICAgICAgcmV0ID0gYXZfdXRmOF9kZWNvZGUoJmNvZGUsICZwLCBlbmRwLCAoKndjdHgpLT5zdHJpbmdfdmFsaWRhdGlvbl91dGY4X2ZsYWdzKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQVZCUHJpbnQgYnA7Ci0gICAgICAgICAgICAgICAgYXZfYnByaW50X2luaXQoJmJwLCAwLCBBVl9CUFJJTlRfU0laRV9BVVRPTUFUSUMpOwotICAgICAgICAgICAgICAgIGJwcmludF9ieXRlcygmYnAsIHAwLCBwLXAwKSwKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHdjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFVURjggc2VxdWVuY2UgJXMgZm91bmQgaW4gc3RyaW5nIHZhbGlkYXRpb24gcmVwbGFjZSAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAuc3RyLCAoKndjdHgpLT5zdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX01BWF9OQl9MRVZFTFM7IGkrKykKLSAgICAgICAgYXZfYnByaW50X2luaXQoJigqd2N0eCktPnNlY3Rpb25fcGJ1ZltpXSwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKLQotICAgIGlmICgoKndjdHgpLT53cml0ZXItPmluaXQpCi0gICAgICAgIHJldCA9ICgqd2N0eCktPndyaXRlci0+aW5pdCgqd2N0eCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIHdyaXRlcl9jbG9zZSh3Y3R4KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKFdyaXRlckNvbnRleHQgKndjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWN0aW9uX2lkKQotewotICAgIGludCBwYXJlbnRfc2VjdGlvbl9pZDsKLSAgICB3Y3R4LT5sZXZlbCsrOwotICAgIGF2X2Fzc2VydDAod2N0eC0+bGV2ZWwgPCBTRUNUSU9OX01BWF9OQl9MRVZFTFMpOwotICAgIHBhcmVudF9zZWN0aW9uX2lkID0gd2N0eC0+bGV2ZWwgPwotICAgICAgICAod2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbC0xXSktPmlkIDogU0VDVElPTl9JRF9OT05FOwotCi0gICAgd2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0gPSAwOwotICAgIHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdID0gJndjdHgtPnNlY3Rpb25zW3NlY3Rpb25faWRdOwotCi0gICAgaWYgKHNlY3Rpb25faWQgPT0gU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVMpIHsKLSAgICAgICAgd2N0eC0+bmJfc2VjdGlvbl9wYWNrZXQgPSB3Y3R4LT5uYl9zZWN0aW9uX2ZyYW1lID0KLSAgICAgICAgd2N0eC0+bmJfc2VjdGlvbl9wYWNrZXRfZnJhbWUgPSAwOwotICAgIH0gZWxzZSBpZiAocGFyZW50X3NlY3Rpb25faWQgPT0gU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVMpIHsKLSAgICAgICAgd2N0eC0+bmJfc2VjdGlvbl9wYWNrZXRfZnJhbWUgPSBzZWN0aW9uX2lkID09IFNFQ1RJT05fSURfUEFDS0VUID8KLSAgICAgICAgICAgIHdjdHgtPm5iX3NlY3Rpb25fcGFja2V0IDogd2N0eC0+bmJfc2VjdGlvbl9mcmFtZTsKLSAgICB9Ci0KLSAgICBpZiAod2N0eC0+d3JpdGVyLT5wcmludF9zZWN0aW9uX2hlYWRlcikKLSAgICAgICAgd2N0eC0+d3JpdGVyLT5wcmludF9zZWN0aW9uX2hlYWRlcih3Y3R4KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3RlcihXcml0ZXJDb250ZXh0ICp3Y3R4KQotewotICAgIGludCBzZWN0aW9uX2lkID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF0tPmlkOwotICAgIGludCBwYXJlbnRfc2VjdGlvbl9pZCA9IHdjdHgtPmxldmVsID8KLSAgICAgICAgd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbC0xXS0+aWQgOiBTRUNUSU9OX0lEX05PTkU7Ci0KLSAgICBpZiAocGFyZW50X3NlY3Rpb25faWQgIT0gU0VDVElPTl9JRF9OT05FKQotICAgICAgICB3Y3R4LT5uYl9pdGVtW3djdHgtPmxldmVsLTFdKys7Ci0gICAgaWYgKHBhcmVudF9zZWN0aW9uX2lkID09IFNFQ1RJT05fSURfUEFDS0VUU19BTkRfRlJBTUVTKSB7Ci0gICAgICAgIGlmIChzZWN0aW9uX2lkID09IFNFQ1RJT05fSURfUEFDS0VUKSB3Y3R4LT5uYl9zZWN0aW9uX3BhY2tldCsrOwotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjdHgtPm5iX3NlY3Rpb25fZnJhbWUrKzsKLSAgICB9Ci0gICAgaWYgKHdjdHgtPndyaXRlci0+cHJpbnRfc2VjdGlvbl9mb290ZXIpCi0gICAgICAgIHdjdHgtPndyaXRlci0+cHJpbnRfc2VjdGlvbl9mb290ZXIod2N0eCk7Ci0gICAgd2N0eC0+bGV2ZWwtLTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcl9wcmludF9pbnRlZ2VyKFdyaXRlckNvbnRleHQgKndjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5LCBsb25nIGxvbmcgaW50IHZhbCkKLXsKLSAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc2VjdGlvbiA9IHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdOwotCi0gICAgaWYgKHNlY3Rpb24tPnNob3dfYWxsX2VudHJpZXMgfHwgYXZfZGljdF9nZXQoc2VjdGlvbi0+ZW50cmllc190b19zaG93LCBrZXksIE5VTEwsIDApKSB7Ci0gICAgICAgIHdjdHgtPndyaXRlci0+cHJpbnRfaW50ZWdlcih3Y3R4LCBrZXksIHZhbCk7Ci0gICAgICAgIHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWxdKys7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGludCB2YWxpZGF0ZV9zdHJpbmcoV3JpdGVyQ29udGV4dCAqd2N0eCwgY2hhciAqKmRzdHAsIGNvbnN0IGNoYXIgKnNyYykKLXsKLSAgICBjb25zdCB1aW50OF90ICpwLCAqZW5kcDsKLSAgICBBVkJQcmludCBkc3RidWY7Ci0gICAgaW50IGludmFsaWRfY2hhcnNfbmIgPSAwLCByZXQgPSAwOwotCi0gICAgYXZfYnByaW50X2luaXQoJmRzdGJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKLQotICAgIGVuZHAgPSBzcmMgKyBzdHJsZW4oc3JjKTsKLSAgICBmb3IgKHAgPSAodWludDhfdCAqKXNyYzsgKnA7KSB7Ci0gICAgICAgIHVpbnQzMl90IGNvZGU7Ci0gICAgICAgIGludCBpbnZhbGlkID0gMDsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcDAgPSBwOwotCi0gICAgICAgIGlmIChhdl91dGY4X2RlY29kZSgmY29kZSwgJnAsIGVuZHAsIHdjdHgtPnN0cmluZ192YWxpZGF0aW9uX3V0ZjhfZmxhZ3MpIDwgMCkgewotICAgICAgICAgICAgQVZCUHJpbnQgYnA7Ci0gICAgICAgICAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIEFWX0JQUklOVF9TSVpFX0FVVE9NQVRJQyk7Ci0gICAgICAgICAgICBicHJpbnRfYnl0ZXMoJmJwLCBwMCwgcC1wMCk7Ci0gICAgICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0RFQlVHLAotICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFVURi04IHNlcXVlbmNlICVzIGZvdW5kIGluIHN0cmluZyAnJXMnXG4iLCBicC5zdHIsIHNyYyk7Ci0gICAgICAgICAgICBpbnZhbGlkID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnZhbGlkKSB7Ci0gICAgICAgICAgICBpbnZhbGlkX2NoYXJzX25iKys7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAod2N0eC0+c3RyaW5nX3ZhbGlkYXRpb24pIHsKLSAgICAgICAgICAgIGNhc2UgV1JJVEVSX1NUUklOR19WQUxJREFUSU9OX0ZBSUw6Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHdjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgVVRGLTggc2VxdWVuY2UgZm91bmQgaW4gc3RyaW5nICclcydcbiIsIHNyYyk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBXUklURVJfU1RSSU5HX1ZBTElEQVRJT05fUkVQTEFDRToKLSAgICAgICAgICAgICAgICBhdl9icHJpbnRmKCZkc3RidWYsICIlcyIsIHdjdHgtPnN0cmluZ192YWxpZGF0aW9uX3JlcGxhY2VtZW50KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghaW52YWxpZCB8fCB3Y3R4LT5zdHJpbmdfdmFsaWRhdGlvbiA9PSBXUklURVJfU1RSSU5HX1ZBTElEQVRJT05fSUdOT1JFKQotICAgICAgICAgICAgYXZfYnByaW50X2FwcGVuZF9kYXRhKCZkc3RidWYsIHAwLCBwLXAwKTsKLSAgICB9Ci0KLSAgICBpZiAoaW52YWxpZF9jaGFyc19uYiAmJiB3Y3R4LT5zdHJpbmdfdmFsaWRhdGlvbiA9PSBXUklURVJfU1RSSU5HX1ZBTElEQVRJT05fUkVQTEFDRSkgewotICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAiJWQgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZShzKSBmb3VuZCBpbiBzdHJpbmcgJyVzJywgcmVwbGFjZWQgd2l0aCAnJXMnXG4iLAotICAgICAgICAgICAgICAgaW52YWxpZF9jaGFyc19uYiwgc3JjLCB3Y3R4LT5zdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudCk7Ci0gICAgfQotCi1lbmQ6Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZkc3RidWYsIGRzdHApOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgUFJJTlRfU1RSSU5HX09QVCAgICAgIDEKLSNkZWZpbmUgUFJJTlRfU1RSSU5HX1ZBTElEQVRFIDIKLQotc3RhdGljIGlubGluZSBpbnQgd3JpdGVyX3ByaW50X3N0cmluZyhXcml0ZXJDb250ZXh0ICp3Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCwgaW50IGZsYWdzKQotewotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAoKGZsYWdzICYgUFJJTlRfU1RSSU5HX09QVCkKLSAgICAgICAgJiYgISh3Y3R4LT53cml0ZXItPmZsYWdzICYgV1JJVEVSX0ZMQUdfRElTUExBWV9PUFRJT05BTF9GSUVMRFMpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChzZWN0aW9uLT5zaG93X2FsbF9lbnRyaWVzIHx8IGF2X2RpY3RfZ2V0KHNlY3Rpb24tPmVudHJpZXNfdG9fc2hvdywga2V5LCBOVUxMLCAwKSkgewotICAgICAgICBpZiAoZmxhZ3MgJiBQUklOVF9TVFJJTkdfVkFMSURBVEUpIHsKLSAgICAgICAgICAgIGNoYXIgKmtleTEgPSBOVUxMLCAqdmFsMSA9IE5VTEw7Ci0gICAgICAgICAgICByZXQgPSB2YWxpZGF0ZV9zdHJpbmcod2N0eCwgJmtleTEsIGtleSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgZ290byBlbmQ7Ci0gICAgICAgICAgICByZXQgPSB2YWxpZGF0ZV9zdHJpbmcod2N0eCwgJnZhbDEsIHZhbCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgZ290byBlbmQ7Ci0gICAgICAgICAgICB3Y3R4LT53cml0ZXItPnByaW50X3N0cmluZyh3Y3R4LCBrZXkxLCB2YWwxKTsKLSAgICAgICAgZW5kOgotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBrZXk9dmFsdWUgc3RyaW5nIGNvbWJpbmF0aW9uICVzPSVzIGluIHNlY3Rpb24gJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGtleSwgdmFsLCBzZWN0aW9uLT51bmlxdWVfbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdl9mcmVlKGtleTEpOwotICAgICAgICAgICAgYXZfZnJlZSh2YWwxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdjdHgtPndyaXRlci0+cHJpbnRfc3RyaW5nKHdjdHgsIGtleSwgdmFsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWxdKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcl9wcmludF9yYXRpb25hbChXcml0ZXJDb250ZXh0ICp3Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksIEFWUmF0aW9uYWwgcSwgY2hhciBzZXApCi17Ci0gICAgQVZCUHJpbnQgYnVmOwotICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIEFWX0JQUklOVF9TSVpFX0FVVE9NQVRJQyk7Ci0gICAgYXZfYnByaW50ZigmYnVmLCAiJWQlYyVkIiwgcS5udW0sIHNlcCwgcS5kZW4pOwotICAgIHdyaXRlcl9wcmludF9zdHJpbmcod2N0eCwga2V5LCBidWYuc3RyLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgd3JpdGVyX3ByaW50X3RpbWUoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0cywgY29uc3QgQVZSYXRpb25hbCAqdGltZV9iYXNlLCBpbnQgaXNfZHVyYXRpb24pCi17Ci0gICAgY2hhciBidWZbMTI4XTsKLQotICAgIGlmICgoIWlzX2R1cmF0aW9uICYmIHRzID09IEFWX05PUFRTX1ZBTFVFKSB8fCAoaXNfZHVyYXRpb24gJiYgdHMgPT0gMCkpIHsKLSAgICAgICAgd3JpdGVyX3ByaW50X3N0cmluZyh3Y3R4LCBrZXksICJOL0EiLCBQUklOVF9TVFJJTkdfT1BUKTsKLSAgICB9IGVsc2UgewotICAgICAgICBkb3VibGUgZCA9IHRzICogYXZfcTJkKCp0aW1lX2Jhc2UpOwotICAgICAgICBzdHJ1Y3QgdW5pdF92YWx1ZSB1djsKLSAgICAgICAgdXYudmFsLmQgPSBkOwotICAgICAgICB1di51bml0ID0gdW5pdF9zZWNvbmRfc3RyOwotICAgICAgICB2YWx1ZV9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgdXYpOwotICAgICAgICB3cml0ZXJfcHJpbnRfc3RyaW5nKHdjdHgsIGtleSwgYnVmLCAwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlcl9wcmludF90cyhXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdHMsIGludCBpc19kdXJhdGlvbikKLXsKLSAgICBpZiAoKCFpc19kdXJhdGlvbiAmJiB0cyA9PSBBVl9OT1BUU19WQUxVRSkgfHwgKGlzX2R1cmF0aW9uICYmIHRzID09IDApKSB7Ci0gICAgICAgIHdyaXRlcl9wcmludF9zdHJpbmcod2N0eCwga2V5LCAiTi9BIiwgUFJJTlRfU1RSSU5HX09QVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgd3JpdGVyX3ByaW50X2ludGVnZXIod2N0eCwga2V5LCB0cyk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCB3cml0ZXJfcHJpbnRfZGF0YShXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgaW50IHNpemUpCi17Ci0gICAgQVZCUHJpbnQgYnA7Ci0gICAgaW50IG9mZnNldCA9IDAsIGwsIGk7Ci0KLSAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7Ci0gICAgYXZfYnByaW50ZigmYnAsICJcbiIpOwotICAgIHdoaWxlIChzaXplKSB7Ci0gICAgICAgIGF2X2JwcmludGYoJmJwLCAiJTA4eDogIiwgb2Zmc2V0KTsKLSAgICAgICAgbCA9IEZGTUlOKHNpemUsIDE2KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgewotICAgICAgICAgICAgYXZfYnByaW50ZigmYnAsICIlMDJ4IiwgZGF0YVtpXSk7Ci0gICAgICAgICAgICBpZiAoaSAmIDEpCi0gICAgICAgICAgICAgICAgYXZfYnByaW50ZigmYnAsICIgIik7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfYnByaW50X2NoYXJzKCZicCwgJyAnLCA0MSAtIDIgKiBpIC0gaSAvIDIpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKQotICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKCZicCwgZGF0YVtpXSAtIDMyVSA8IDk1ID8gZGF0YVtpXSA6ICcuJywgMSk7Ci0gICAgICAgIGF2X2JwcmludGYoJmJwLCAiXG4iKTsKLSAgICAgICAgb2Zmc2V0ICs9IGw7Ci0gICAgICAgIGRhdGEgICArPSBsOwotICAgICAgICBzaXplICAgLT0gbDsKLSAgICB9Ci0gICAgd3JpdGVyX3ByaW50X3N0cmluZyh3Y3R4LCBuYW1lLCBicC5zdHIsIDApOwotICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnAsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCB3cml0ZXJfcHJpbnRfZGF0YV9oYXNoKFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQotewotICAgIGNoYXIgKnAsIGJ1ZltBVl9IQVNIX01BWF9TSVpFICogMiArIDY0XSA9IHsgMCB9OwotCi0gICAgaWYgKCFoYXNoKQotICAgICAgICByZXR1cm47Ci0gICAgYXZfaGFzaF9pbml0KGhhc2gpOwotICAgIGF2X2hhc2hfdXBkYXRlKGhhc2gsIGRhdGEsIHNpemUpOwotICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczoiLCBhdl9oYXNoX2dldF9uYW1lKGhhc2gpKTsKLSAgICBwID0gYnVmICsgc3RybGVuKGJ1Zik7Ci0gICAgYXZfaGFzaF9maW5hbF9oZXgoaGFzaCwgcCwgYnVmICsgc2l6ZW9mKGJ1ZikgLSBwKTsKLSAgICB3cml0ZXJfcHJpbnRfc3RyaW5nKHdjdHgsIG5hbWUsIGJ1ZiwgMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlcl9wcmludF9pbnRlZ2VycyhXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsIGludCBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbnMsIGludCBieXRlcywgaW50IG9mZnNldF9hZGQpCi17Ci0gICAgQVZCUHJpbnQgYnA7Ci0gICAgaW50IG9mZnNldCA9IDAsIGwsIGk7Ci0KLSAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7Ci0gICAgYXZfYnByaW50ZigmYnAsICJcbiIpOwotICAgIHdoaWxlIChzaXplKSB7Ci0gICAgICAgIGF2X2JwcmludGYoJmJwLCAiJTA4eDogIiwgb2Zmc2V0KTsKLSAgICAgICAgbCA9IEZGTUlOKHNpemUsIGNvbHVtbnMpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAgICAgIChieXRlcyA9PSAxKSBhdl9icHJpbnRmKCZicCwgZm9ybWF0LCAqZGF0YSk7Ci0gICAgICAgICAgICBlbHNlIGlmIChieXRlcyA9PSAyKSBhdl9icHJpbnRmKCZicCwgZm9ybWF0LCBBVl9STjE2KGRhdGEpKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGVzID09IDQpIGF2X2JwcmludGYoJmJwLCBmb3JtYXQsIEFWX1JOMzIoZGF0YSkpOwotICAgICAgICAgICAgZGF0YSArPSBieXRlczsKLSAgICAgICAgICAgIHNpemUgLS07Ci0gICAgICAgIH0KLSAgICAgICAgYXZfYnByaW50ZigmYnAsICJcbiIpOwotICAgICAgICBvZmZzZXQgKz0gb2Zmc2V0X2FkZDsKLSAgICB9Ci0gICAgd3JpdGVyX3ByaW50X3N0cmluZyh3Y3R4LCBuYW1lLCBicC5zdHIsIDApOwotICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnAsIE5VTEwpOwotfQotCi0jZGVmaW5lIE1BWF9SRUdJU1RFUkVEX1dSSVRFUlNfTkIgNjQKLQotc3RhdGljIGNvbnN0IFdyaXRlciAqcmVnaXN0ZXJlZF93cml0ZXJzW01BWF9SRUdJU1RFUkVEX1dSSVRFUlNfTkIgKyAxXTsKLQotc3RhdGljIGludCB3cml0ZXJfcmVnaXN0ZXIoY29uc3QgV3JpdGVyICp3cml0ZXIpCi17Ci0gICAgc3RhdGljIGludCBuZXh0X3JlZ2lzdGVyZWRfd3JpdGVyX2lkeCA9IDA7Ci0KLSAgICBpZiAobmV4dF9yZWdpc3RlcmVkX3dyaXRlcl9pZHggPT0gTUFYX1JFR0lTVEVSRURfV1JJVEVSU19OQikKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIHJlZ2lzdGVyZWRfd3JpdGVyc1tuZXh0X3JlZ2lzdGVyZWRfd3JpdGVyX2lkeCsrXSA9IHdyaXRlcjsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IFdyaXRlciAqd3JpdGVyX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyByZWdpc3RlcmVkX3dyaXRlcnNbaV07IGkrKykKLSAgICAgICAgaWYgKCFzdHJjbXAocmVnaXN0ZXJlZF93cml0ZXJzW2ldLT5uYW1lLCBuYW1lKSkKLSAgICAgICAgICAgIHJldHVybiByZWdpc3RlcmVkX3dyaXRlcnNbaV07Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vKiBXUklURVJTICovCi0KLSNkZWZpbmUgREVGSU5FX1dSSVRFUl9DTEFTUyhuYW1lKSAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgY29uc3QgY2hhciAqbmFtZSMjX2dldF9uYW1lKHZvaWQgKmN0eCkgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gI25hbWUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGNvbnN0IEFWQ2xhc3MgbmFtZSMjX2NsYXNzID0geyAgICAgICAgICAgICAgIFwKLSAgICAuY2xhc3NfbmFtZSA9ICNuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLml0ZW1fbmFtZSAgPSBuYW1lIyNfZ2V0X25hbWUsICAgICAgICAgICAgICAgICAgXAotICAgIC5vcHRpb24gICAgID0gbmFtZSMjX29wdGlvbnMgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLyogRGVmYXVsdCBvdXRwdXQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgRGVmYXVsdENvbnRleHQgewotICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwotICAgIGludCBub2tleTsKLSAgICBpbnQgbm9wcmludF93cmFwcGVyczsKLSAgICBpbnQgbmVzdGVkX3NlY3Rpb25bU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsKLX0gRGVmYXVsdENvbnRleHQ7Ci0KLSN1bmRlZiBPRkZTRVQKLSNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERlZmF1bHRDb250ZXh0LCB4KQotCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gZGVmYXVsdF9vcHRpb25zW10gPSB7Ci0gICAgeyAibm9wcmludF93cmFwcGVycyIsICJkbyBub3QgcHJpbnQgaGVhZGVycyBhbmQgZm9vdGVycyIsIE9GRlNFVChub3ByaW50X3dyYXBwZXJzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEgfSwKLSAgICB7ICJudyIsICAgICAgICAgICAgICAgImRvIG5vdCBwcmludCBoZWFkZXJzIGFuZCBmb290ZXJzIiwgT0ZGU0VUKG5vcHJpbnRfd3JhcHBlcnMpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSB9LAotICAgIHsgIm5va2V5IiwgICAgICAgICAgImZvcmNlIG5vIGtleSBwcmludGluZyIsICAgICBPRkZTRVQobm9rZXkpLCAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSB9LAotICAgIHsgIm5rIiwgICAgICAgICAgICAgImZvcmNlIG5vIGtleSBwcmludGluZyIsICAgICBPRkZTRVQobm9rZXkpLCAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSB9LAotICAgIHtOVUxMfSwKLX07Ci0KLURFRklORV9XUklURVJfQ0xBU1MoZGVmYXVsdCk7Ci0KLS8qIGxhbWUgdXBwZXJjYXNpbmcgcm91dGluZSwgYXNzdW1lcyB0aGUgc3RyaW5nIGlzIGxvd2VyIGNhc2UgQVNDSUkgKi8KLXN0YXRpYyBpbmxpbmUgY2hhciAqdXBjYXNlX3N0cmluZyhjaGFyICpkc3QsIHNpemVfdCBkc3Rfc2l6ZSwgY29uc3QgY2hhciAqc3JjKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IHNyY1tpXSAmJiBpIDwgZHN0X3NpemUtMTsgaSsrKQotICAgICAgICBkc3RbaV0gPSBhdl90b3VwcGVyKHNyY1tpXSk7Ci0gICAgZHN0W2ldID0gMDsKLSAgICByZXR1cm4gZHN0OwotfQotCi1zdGF0aWMgdm9pZCBkZWZhdWx0X3ByaW50X3NlY3Rpb25faGVhZGVyKFdyaXRlckNvbnRleHQgKndjdHgpCi17Ci0gICAgRGVmYXVsdENvbnRleHQgKmRlZiA9IHdjdHgtPnByaXY7Ci0gICAgY2hhciBidWZbMzJdOwotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07Ci0gICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnBhcmVudF9zZWN0aW9uID0gd2N0eC0+bGV2ZWwgPwotICAgICAgICB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsLTFdIDogTlVMTDsKLQotICAgIGF2X2JwcmludF9jbGVhcigmd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXSk7Ci0gICAgaWYgKHBhcmVudF9zZWN0aW9uICYmCi0gICAgICAgICEocGFyZW50X3NlY3Rpb24tPmZsYWdzICYgKFNFQ1RJT05fRkxBR19JU19XUkFQUEVSfFNFQ1RJT05fRkxBR19JU19BUlJBWSkpKSB7Ci0gICAgICAgIGRlZi0+bmVzdGVkX3NlY3Rpb25bd2N0eC0+bGV2ZWxdID0gMTsKLSAgICAgICAgYXZfYnByaW50Zigmd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXSwgIiVzJXM6IiwKLSAgICAgICAgICAgICAgICAgICB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWwtMV0uc3RyLAotICAgICAgICAgICAgICAgICAgIHVwY2FzZV9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3hfaWZfbnVsbChzZWN0aW9uLT5lbGVtZW50X25hbWUsIHNlY3Rpb24tPm5hbWUpKSk7Ci0gICAgfQotCi0gICAgaWYgKGRlZi0+bm9wcmludF93cmFwcGVycyB8fCBkZWYtPm5lc3RlZF9zZWN0aW9uW3djdHgtPmxldmVsXSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCEoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDVElPTl9GTEFHX0lTX1dSQVBQRVJ8U0VDVElPTl9GTEFHX0lTX0FSUkFZKSkpCi0gICAgICAgIHByaW50ZigiWyVzXVxuIiwgdXBjYXNlX3N0cmluZyhidWYsIHNpemVvZihidWYpLCBzZWN0aW9uLT5uYW1lKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlZmF1bHRfcHJpbnRfc2VjdGlvbl9mb290ZXIoV3JpdGVyQ29udGV4dCAqd2N0eCkKLXsKLSAgICBEZWZhdWx0Q29udGV4dCAqZGVmID0gd2N0eC0+cHJpdjsKLSAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc2VjdGlvbiA9IHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdOwotICAgIGNoYXIgYnVmWzMyXTsKLQotICAgIGlmIChkZWYtPm5vcHJpbnRfd3JhcHBlcnMgfHwgZGVmLT5uZXN0ZWRfc2VjdGlvblt3Y3R4LT5sZXZlbF0pCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmICghKHNlY3Rpb24tPmZsYWdzICYgKFNFQ1RJT05fRkxBR19JU19XUkFQUEVSfFNFQ1RJT05fRkxBR19JU19BUlJBWSkpKQotICAgICAgICBwcmludGYoIlsvJXNdXG4iLCB1cGNhc2Vfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHNlY3Rpb24tPm5hbWUpKTsKLX0KLQotc3RhdGljIHZvaWQgZGVmYXVsdF9wcmludF9zdHIoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKLXsKLSAgICBEZWZhdWx0Q29udGV4dCAqZGVmID0gd2N0eC0+cHJpdjsKLQotICAgIGlmICghZGVmLT5ub2tleSkKLSAgICAgICAgcHJpbnRmKCIlcyVzPSIsIHdjdHgtPnNlY3Rpb25fcGJ1Zlt3Y3R4LT5sZXZlbF0uc3RyLCBrZXkpOwotICAgIHByaW50ZigiJXNcbiIsIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgZGVmYXVsdF9wcmludF9pbnQoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBsb25nIGxvbmcgaW50IHZhbHVlKQotewotICAgIERlZmF1bHRDb250ZXh0ICpkZWYgPSB3Y3R4LT5wcml2OwotCi0gICAgaWYgKCFkZWYtPm5va2V5KQotICAgICAgICBwcmludGYoIiVzJXM9Iiwgd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXS5zdHIsIGtleSk7Ci0gICAgcHJpbnRmKCIlbGxkXG4iLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBXcml0ZXIgZGVmYXVsdF93cml0ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJkZWZhdWx0IiwKLSAgICAucHJpdl9zaXplICAgICAgICAgICAgID0gc2l6ZW9mKERlZmF1bHRDb250ZXh0KSwKLSAgICAucHJpbnRfc2VjdGlvbl9oZWFkZXIgID0gZGVmYXVsdF9wcmludF9zZWN0aW9uX2hlYWRlciwKLSAgICAucHJpbnRfc2VjdGlvbl9mb290ZXIgID0gZGVmYXVsdF9wcmludF9zZWN0aW9uX2Zvb3RlciwKLSAgICAucHJpbnRfaW50ZWdlciAgICAgICAgID0gZGVmYXVsdF9wcmludF9pbnQsCi0gICAgLnByaW50X3N0cmluZyAgICAgICAgICA9IGRlZmF1bHRfcHJpbnRfc3RyLAotICAgIC5mbGFncyA9IFdSSVRFUl9GTEFHX0RJU1BMQVlfT1BUSU9OQUxfRklFTERTLAotICAgIC5wcml2X2NsYXNzICAgICAgICAgICAgPSAmZGVmYXVsdF9jbGFzcywKLX07Ci0KLS8qIENvbXBhY3Qgb3V0cHV0ICovCi0KLS8qKgotICogQXBwbHkgQy1sYW5ndWFnZS1saWtlIHN0cmluZyBlc2NhcGluZy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmNfZXNjYXBlX3N0cihBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgc2VwLCB2b2lkICpsb2dfY3R4KQotewotICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICBmb3IgKHAgPSBzcmM7ICpwOyBwKyspIHsKLSAgICAgICAgc3dpdGNoICgqcCkgewotICAgICAgICBjYXNlICdcYic6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiXFxiIik7ICBicmVhazsKLSAgICAgICAgY2FzZSAnXGYnOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcZiIpOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzogYXZfYnByaW50Zihkc3QsICIlcyIsICJcXG4iKTsgIGJyZWFrOwotICAgICAgICBjYXNlICdccic6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiXFxyIik7ICBicmVhazsKLSAgICAgICAgY2FzZSAnXFwnOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcXFwiKTsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoKnAgPT0gc2VwKQotICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICdcXCcsIDEpOwotICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgKnAsIDEpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkc3QtPnN0cjsKLX0KLQotLyoqCi0gKiBRdW90ZSBmaWVsZHMgY29udGFpbmluZyBzcGVjaWFsIGNoYXJhY3RlcnMsIGNoZWNrIFJGQzQxODAuCi0gKi8KLXN0YXRpYyBjb25zdCBjaGFyICpjc3ZfZXNjYXBlX3N0cihBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgc2VwLCB2b2lkICpsb2dfY3R4KQotewotICAgIGNoYXIgbWV0YV9jaGFyc1tdID0geyBzZXAsICciJywgJ1xuJywgJ1xyJywgJ1wwJyB9OwotICAgIGludCBuZWVkc19xdW90aW5nID0gISFzcmNbc3RyY3NwbihzcmMsIG1ldGFfY2hhcnMpXTsKLQotICAgIGlmIChuZWVkc19xdW90aW5nKQotICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0LCAnIicsIDEpOwotCi0gICAgZm9yICg7ICpzcmM7IHNyYysrKSB7Ci0gICAgICAgIGlmICgqc3JjID09ICciJykKLSAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICciJywgMSk7Ci0gICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICpzcmMsIDEpOwotICAgIH0KLSAgICBpZiAobmVlZHNfcXVvdGluZykKLSAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgJyInLCAxKTsKLSAgICByZXR1cm4gZHN0LT5zdHI7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpub25lX2VzY2FwZV9zdHIoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyIHNlcCwgdm9pZCAqbG9nX2N0eCkKLXsKLSAgICByZXR1cm4gc3JjOwotfQotCi10eXBlZGVmIHN0cnVjdCBDb21wYWN0Q29udGV4dCB7Ci0gICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Ci0gICAgY2hhciAqaXRlbV9zZXBfc3RyOwotICAgIGNoYXIgaXRlbV9zZXA7Ci0gICAgaW50IG5va2V5OwotICAgIGludCBwcmludF9zZWN0aW9uOwotICAgIGNoYXIgKmVzY2FwZV9tb2RlX3N0cjsKLSAgICBjb25zdCBjaGFyICogKCplc2NhcGVfc3RyKShBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgc2VwLCB2b2lkICpsb2dfY3R4KTsKLSAgICBpbnQgbmVzdGVkX3NlY3Rpb25bU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsKLSAgICBpbnQgaGFzX25lc3RlZF9lbGVtc1tTRUNUSU9OX01BWF9OQl9MRVZFTFNdOwotICAgIGludCB0ZXJtaW5hdGVfbGluZVtTRUNUSU9OX01BWF9OQl9MRVZFTFNdOwotfSBDb21wYWN0Q29udGV4dDsKLQotI3VuZGVmIE9GRlNFVAotI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ29tcGFjdENvbnRleHQsIHgpCi0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBjb21wYWN0X29wdGlvbnNbXT0gewotICAgIHsiaXRlbV9zZXAiLCAic2V0IGl0ZW0gc2VwYXJhdG9yIiwgICAgT0ZGU0VUKGl0ZW1fc2VwX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9InwifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAotICAgIHsicyIsICAgICAgICAic2V0IGl0ZW0gc2VwYXJhdG9yIiwgICAgT0ZGU0VUKGl0ZW1fc2VwX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9InwifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAotICAgIHsibm9rZXkiLCAgICAiZm9yY2Ugbm8ga2V5IHByaW50aW5nIiwgT0ZGU0VUKG5va2V5KSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MH0sICAgIDAsICAgICAgICAxICAgICAgICB9LAotICAgIHsibmsiLCAgICAgICAiZm9yY2Ugbm8ga2V5IHByaW50aW5nIiwgT0ZGU0VUKG5va2V5KSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MH0sICAgIDAsICAgICAgICAxICAgICAgICB9LAotICAgIHsiZXNjYXBlIiwgICAic2V0IGVzY2FwZSBtb2RlIiwgICAgICAgT0ZGU0VUKGVzY2FwZV9tb2RlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImMifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAotICAgIHsiZSIsICAgICAgICAic2V0IGVzY2FwZSBtb2RlIiwgICAgICAgT0ZGU0VUKGVzY2FwZV9tb2RlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImMifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAotICAgIHsicHJpbnRfc2VjdGlvbiIsICJwcmludCBzZWN0aW9uIG5hbWUiLCBPRkZTRVQocHJpbnRfc2VjdGlvbiksIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgIDAsICAgICAgICAxICAgICAgICB9LAotICAgIHsicCIsICAgICAgICAgICAgICJwcmludCBzZWN0aW9uIG5hbWUiLCBPRkZTRVQocHJpbnRfc2VjdGlvbiksIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgIDAsICAgICAgICAxICAgICAgICB9LAotICAgIHtOVUxMfSwKLX07Ci0KLURFRklORV9XUklURVJfQ0xBU1MoY29tcGFjdCk7Ci0KLXN0YXRpYyBhdl9jb2xkIGludCBjb21wYWN0X2luaXQoV3JpdGVyQ29udGV4dCAqd2N0eCkKLXsKLSAgICBDb21wYWN0Q29udGV4dCAqY29tcGFjdCA9IHdjdHgtPnByaXY7Ci0KLSAgICBpZiAoc3RybGVuKGNvbXBhY3QtPml0ZW1fc2VwX3N0cikgIT0gMSkgewotICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLCAiSXRlbSBzZXBhcmF0b3IgJyVzJyBzcGVjaWZpZWQsIGJ1dCBtdXN0IGNvbnRhaW4gYSBzaW5nbGUgY2hhcmFjdGVyXG4iLAotICAgICAgICAgICAgICAgY29tcGFjdC0+aXRlbV9zZXBfc3RyKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0gICAgY29tcGFjdC0+aXRlbV9zZXAgPSBjb21wYWN0LT5pdGVtX3NlcF9zdHJbMF07Ci0KLSAgICBpZiAgICAgICghc3RyY21wKGNvbXBhY3QtPmVzY2FwZV9tb2RlX3N0ciwgIm5vbmUiKSkgY29tcGFjdC0+ZXNjYXBlX3N0ciA9IG5vbmVfZXNjYXBlX3N0cjsKLSAgICBlbHNlIGlmICghc3RyY21wKGNvbXBhY3QtPmVzY2FwZV9tb2RlX3N0ciwgImMiICAgKSkgY29tcGFjdC0+ZXNjYXBlX3N0ciA9IGNfZXNjYXBlX3N0cjsKLSAgICBlbHNlIGlmICghc3RyY21wKGNvbXBhY3QtPmVzY2FwZV9tb2RlX3N0ciwgImNzdiIgKSkgY29tcGFjdC0+ZXNjYXBlX3N0ciA9IGNzdl9lc2NhcGVfc3RyOwotICAgIGVsc2UgewotICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBlc2NhcGUgbW9kZSAnJXMnXG4iLCBjb21wYWN0LT5lc2NhcGVfbW9kZV9zdHIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjb21wYWN0X3ByaW50X3NlY3Rpb25faGVhZGVyKFdyaXRlckNvbnRleHQgKndjdHgpCi17Ci0gICAgQ29tcGFjdENvbnRleHQgKmNvbXBhY3QgPSB3Y3R4LT5wcml2OwotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07Ci0gICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnBhcmVudF9zZWN0aW9uID0gd2N0eC0+bGV2ZWwgPwotICAgICAgICB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsLTFdIDogTlVMTDsKLSAgICBjb21wYWN0LT50ZXJtaW5hdGVfbGluZVt3Y3R4LT5sZXZlbF0gPSAxOwotICAgIGNvbXBhY3QtPmhhc19uZXN0ZWRfZWxlbXNbd2N0eC0+bGV2ZWxdID0gMDsKLQotICAgIGF2X2JwcmludF9jbGVhcigmd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXSk7Ci0gICAgaWYgKCEoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpICYmIHBhcmVudF9zZWN0aW9uICYmCi0gICAgICAgICEocGFyZW50X3NlY3Rpb24tPmZsYWdzICYgKFNFQ1RJT05fRkxBR19JU19XUkFQUEVSfFNFQ1RJT05fRkxBR19JU19BUlJBWSkpKSB7Ci0gICAgICAgIGNvbXBhY3QtPm5lc3RlZF9zZWN0aW9uW3djdHgtPmxldmVsXSA9IDE7Ci0gICAgICAgIGNvbXBhY3QtPmhhc19uZXN0ZWRfZWxlbXNbd2N0eC0+bGV2ZWwtMV0gPSAxOwotICAgICAgICBhdl9icHJpbnRmKCZ3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdLCAiJXMlczoiLAotICAgICAgICAgICAgICAgICAgIHdjdHgtPnNlY3Rpb25fcGJ1Zlt3Y3R4LT5sZXZlbC0xXS5zdHIsCi0gICAgICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoc2VjdGlvbi0+ZWxlbWVudF9uYW1lLCBzZWN0aW9uLT5uYW1lKSk7Ci0gICAgICAgIHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWxdID0gd2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbC0xXTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocGFyZW50X3NlY3Rpb24gJiYgY29tcGFjdC0+aGFzX25lc3RlZF9lbGVtc1t3Y3R4LT5sZXZlbC0xXSAmJgotICAgICAgICAgICAgKHNlY3Rpb24tPmZsYWdzICYgU0VDVElPTl9GTEFHX0lTX0FSUkFZKSkgewotICAgICAgICAgICAgY29tcGFjdC0+dGVybWluYXRlX2xpbmVbd2N0eC0+bGV2ZWwtMV0gPSAwOwotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21wYWN0LT5wcmludF9zZWN0aW9uICYmCi0gICAgICAgICAgICAhKHNlY3Rpb24tPmZsYWdzICYgKFNFQ1RJT05fRkxBR19JU19XUkFQUEVSfFNFQ1RJT05fRkxBR19JU19BUlJBWSkpKQotICAgICAgICAgICAgcHJpbnRmKCIlcyVjIiwgc2VjdGlvbi0+bmFtZSwgY29tcGFjdC0+aXRlbV9zZXApOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29tcGFjdF9wcmludF9zZWN0aW9uX2Zvb3RlcihXcml0ZXJDb250ZXh0ICp3Y3R4KQotewotICAgIENvbXBhY3RDb250ZXh0ICpjb21wYWN0ID0gd2N0eC0+cHJpdjsKLQotICAgIGlmICghY29tcGFjdC0+bmVzdGVkX3NlY3Rpb25bd2N0eC0+bGV2ZWxdICYmCi0gICAgICAgIGNvbXBhY3QtPnRlcm1pbmF0ZV9saW5lW3djdHgtPmxldmVsXSAmJgotICAgICAgICAhKHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdLT5mbGFncyAmIChTRUNUSU9OX0ZMQUdfSVNfV1JBUFBFUnxTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpKSkKLSAgICAgICAgcHJpbnRmKCJcbiIpOwotfQotCi1zdGF0aWMgdm9pZCBjb21wYWN0X3ByaW50X3N0cihXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIENvbXBhY3RDb250ZXh0ICpjb21wYWN0ID0gd2N0eC0+cHJpdjsKLSAgICBBVkJQcmludCBidWY7Ci0KLSAgICBpZiAod2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0pIHByaW50ZigiJWMiLCBjb21wYWN0LT5pdGVtX3NlcCk7Ci0gICAgaWYgKCFjb21wYWN0LT5ub2tleSkKLSAgICAgICAgcHJpbnRmKCIlcyVzPSIsIHdjdHgtPnNlY3Rpb25fcGJ1Zlt3Y3R4LT5sZXZlbF0uc3RyLCBrZXkpOwotICAgIGF2X2JwcmludF9pbml0KCZidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7Ci0gICAgcHJpbnRmKCIlcyIsIGNvbXBhY3QtPmVzY2FwZV9zdHIoJmJ1ZiwgdmFsdWUsIGNvbXBhY3QtPml0ZW1fc2VwLCB3Y3R4KSk7Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBjb21wYWN0X3ByaW50X2ludChXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICprZXksIGxvbmcgbG9uZyBpbnQgdmFsdWUpCi17Ci0gICAgQ29tcGFjdENvbnRleHQgKmNvbXBhY3QgPSB3Y3R4LT5wcml2OwotCi0gICAgaWYgKHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWxdKSBwcmludGYoIiVjIiwgY29tcGFjdC0+aXRlbV9zZXApOwotICAgIGlmICghY29tcGFjdC0+bm9rZXkpCi0gICAgICAgIHByaW50ZigiJXMlcz0iLCB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdLnN0ciwga2V5KTsKLSAgICBwcmludGYoIiVsbGQiLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBXcml0ZXIgY29tcGFjdF93cml0ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgICAgICAgID0gImNvbXBhY3QiLAotICAgIC5wcml2X3NpemUgICAgICAgICAgICA9IHNpemVvZihDb21wYWN0Q29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgICAgICAgID0gY29tcGFjdF9pbml0LAotICAgIC5wcmludF9zZWN0aW9uX2hlYWRlciA9IGNvbXBhY3RfcHJpbnRfc2VjdGlvbl9oZWFkZXIsCi0gICAgLnByaW50X3NlY3Rpb25fZm9vdGVyID0gY29tcGFjdF9wcmludF9zZWN0aW9uX2Zvb3RlciwKLSAgICAucHJpbnRfaW50ZWdlciAgICAgICAgPSBjb21wYWN0X3ByaW50X2ludCwKLSAgICAucHJpbnRfc3RyaW5nICAgICAgICAgPSBjb21wYWN0X3ByaW50X3N0ciwKLSAgICAuZmxhZ3MgPSBXUklURVJfRkxBR19ESVNQTEFZX09QVElPTkFMX0ZJRUxEUywKLSAgICAucHJpdl9jbGFzcyAgICAgICAgICAgPSAmY29tcGFjdF9jbGFzcywKLX07Ci0KLS8qIENTViBvdXRwdXQgKi8KLQotI3VuZGVmIE9GRlNFVAotI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ29tcGFjdENvbnRleHQsIHgpCi0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBjc3Zfb3B0aW9uc1tdID0gewotICAgIHsiaXRlbV9zZXAiLCAic2V0IGl0ZW0gc2VwYXJhdG9yIiwgICAgT0ZGU0VUKGl0ZW1fc2VwX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IiwifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAotICAgIHsicyIsICAgICAgICAic2V0IGl0ZW0gc2VwYXJhdG9yIiwgICAgT0ZGU0VUKGl0ZW1fc2VwX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IiwifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAotICAgIHsibm9rZXkiLCAgICAiZm9yY2Ugbm8ga2V5IHByaW50aW5nIiwgT0ZGU0VUKG5va2V5KSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgIDAsICAgICAgICAxICAgICAgICB9LAotICAgIHsibmsiLCAgICAgICAiZm9yY2Ugbm8ga2V5IHByaW50aW5nIiwgT0ZGU0VUKG5va2V5KSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgIDAsICAgICAgICAxICAgICAgICB9LAotICAgIHsiZXNjYXBlIiwgICAic2V0IGVzY2FwZSBtb2RlIiwgICAgICAgT0ZGU0VUKGVzY2FwZV9tb2RlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImNzdiJ9LCBDSEFSX01JTiwgQ0hBUl9NQVggfSwKLSAgICB7ImUiLCAgICAgICAgInNldCBlc2NhcGUgbW9kZSIsICAgICAgIE9GRlNFVChlc2NhcGVfbW9kZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJjc3YifSwgQ0hBUl9NSU4sIENIQVJfTUFYIH0sCi0gICAgeyJwcmludF9zZWN0aW9uIiwgInByaW50IHNlY3Rpb24gbmFtZSIsIE9GRlNFVChwcmludF9zZWN0aW9uKSwgQVZfT1BUX1RZUEVfQk9PTCwgICB7Lmk2ND0xfSwgICAgMCwgICAgICAgIDEgICAgICAgIH0sCi0gICAgeyJwIiwgICAgICAgICAgICAgInByaW50IHNlY3Rpb24gbmFtZSIsIE9GRlNFVChwcmludF9zZWN0aW9uKSwgQVZfT1BUX1RZUEVfQk9PTCwgICB7Lmk2ND0xfSwgICAgMCwgICAgICAgIDEgICAgICAgIH0sCi0gICAge05VTEx9LAotfTsKLQotREVGSU5FX1dSSVRFUl9DTEFTUyhjc3YpOwotCi1zdGF0aWMgY29uc3QgV3JpdGVyIGNzdl93cml0ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgICAgICAgID0gImNzdiIsCi0gICAgLnByaXZfc2l6ZSAgICAgICAgICAgID0gc2l6ZW9mKENvbXBhY3RDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBjb21wYWN0X2luaXQsCi0gICAgLnByaW50X3NlY3Rpb25faGVhZGVyID0gY29tcGFjdF9wcmludF9zZWN0aW9uX2hlYWRlciwKLSAgICAucHJpbnRfc2VjdGlvbl9mb290ZXIgPSBjb21wYWN0X3ByaW50X3NlY3Rpb25fZm9vdGVyLAotICAgIC5wcmludF9pbnRlZ2VyICAgICAgICA9IGNvbXBhY3RfcHJpbnRfaW50LAotICAgIC5wcmludF9zdHJpbmcgICAgICAgICA9IGNvbXBhY3RfcHJpbnRfc3RyLAotICAgIC5mbGFncyA9IFdSSVRFUl9GTEFHX0RJU1BMQVlfT1BUSU9OQUxfRklFTERTLAotICAgIC5wcml2X2NsYXNzICAgICAgICAgICA9ICZjc3ZfY2xhc3MsCi19OwotCi0vKiBGbGF0IG91dHB1dCAqLwotCi10eXBlZGVmIHN0cnVjdCBGbGF0Q29udGV4dCB7Ci0gICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Ci0gICAgY29uc3QgY2hhciAqc2VwX3N0cjsKLSAgICBjaGFyIHNlcDsKLSAgICBpbnQgaGllcmFyY2hpY2FsOwotfSBGbGF0Q29udGV4dDsKLQotI3VuZGVmIE9GRlNFVAotI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRmxhdENvbnRleHQsIHgpCi0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBmbGF0X29wdGlvbnNbXT0gewotICAgIHsic2VwX2NoYXIiLCAic2V0IHNlcGFyYXRvciIsICAgIE9GRlNFVChzZXBfc3RyKSwgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iLiJ9LCAgQ0hBUl9NSU4sIENIQVJfTUFYIH0sCi0gICAgeyJzIiwgICAgICAgICJzZXQgc2VwYXJhdG9yIiwgICAgT0ZGU0VUKHNlcF9zdHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIuIn0sICBDSEFSX01JTiwgQ0hBUl9NQVggfSwKLSAgICB7ImhpZXJhcmNoaWNhbCIsICJzcGVjaWZ5IGlmIHRoZSBzZWN0aW9uIHNwZWNpZmljYXRpb24gc2hvdWxkIGJlIGhpZXJhcmNoaWNhbCIsIE9GRlNFVChoaWVyYXJjaGljYWwpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0xfSwgMCwgMSB9LAotICAgIHsiaCIsICAgICAgICAgICAgInNwZWNpZnkgaWYgdGhlIHNlY3Rpb24gc3BlY2lmaWNhdGlvbiBzaG91bGQgYmUgaGllcmFyY2hpY2FsIiwgT0ZGU0VUKGhpZXJhcmNoaWNhbCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTF9LCAwLCAxIH0sCi0gICAge05VTEx9LAotfTsKLQotREVGSU5FX1dSSVRFUl9DTEFTUyhmbGF0KTsKLQotc3RhdGljIGF2X2NvbGQgaW50IGZsYXRfaW5pdChXcml0ZXJDb250ZXh0ICp3Y3R4KQotewotICAgIEZsYXRDb250ZXh0ICpmbGF0ID0gd2N0eC0+cHJpdjsKLQotICAgIGlmIChzdHJsZW4oZmxhdC0+c2VwX3N0cikgIT0gMSkgewotICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLCAiSXRlbSBzZXBhcmF0b3IgJyVzJyBzcGVjaWZpZWQsIGJ1dCBtdXN0IGNvbnRhaW4gYSBzaW5nbGUgY2hhcmFjdGVyXG4iLAotICAgICAgICAgICAgICAgZmxhdC0+c2VwX3N0cik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIGZsYXQtPnNlcCA9IGZsYXQtPnNlcF9zdHJbMF07Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmZsYXRfZXNjYXBlX2tleV9zdHIoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyIHNlcCkKLXsKLSAgICBjb25zdCBjaGFyICpwOwotCi0gICAgZm9yIChwID0gc3JjOyAqcDsgcCsrKSB7Ci0gICAgICAgIGlmICghKCgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKSB8fAotICAgICAgICAgICAgICAoKnAgPj0gJ2EnICYmICpwIDw9ICd6JykgfHwKLSAgICAgICAgICAgICAgKCpwID49ICdBJyAmJiAqcCA8PSAnWicpKSkKLSAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICdfJywgMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICpwLCAxKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRzdC0+c3RyOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZmxhdF9lc2NhcGVfdmFsdWVfc3RyKEFWQlByaW50ICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKLXsKLSAgICBjb25zdCBjaGFyICpwOwotCi0gICAgZm9yIChwID0gc3JjOyAqcDsgcCsrKSB7Ci0gICAgICAgIHN3aXRjaCAoKnApIHsKLSAgICAgICAgY2FzZSAnXG4nOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcbiIpOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xyJzogYXZfYnByaW50Zihkc3QsICIlcyIsICJcXHIiKTsgIGJyZWFrOwotICAgICAgICBjYXNlICdcXCc6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiXFxcXCIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnIic6ICBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcXCIiKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2AnOiAgYXZfYnByaW50Zihkc3QsICIlcyIsICJcXGAiKTsgIGJyZWFrOwotICAgICAgICBjYXNlICckJzogIGF2X2JwcmludGYoZHN0LCAiJXMiLCAiXFwkIik7ICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogICBhdl9icHJpbnRfY2hhcnMoZHN0LCAqcCwgMSk7ICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRzdC0+c3RyOwotfQotCi1zdGF0aWMgdm9pZCBmbGF0X3ByaW50X3NlY3Rpb25faGVhZGVyKFdyaXRlckNvbnRleHQgKndjdHgpCi17Ci0gICAgRmxhdENvbnRleHQgKmZsYXQgPSB3Y3R4LT5wcml2OwotICAgIEFWQlByaW50ICpidWYgPSAmd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXTsKLSAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc2VjdGlvbiA9IHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdOwotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpwYXJlbnRfc2VjdGlvbiA9IHdjdHgtPmxldmVsID8KLSAgICAgICAgd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbC0xXSA6IE5VTEw7Ci0KLSAgICAvKiBidWlsZCBzZWN0aW9uIGhlYWRlciAqLwotICAgIGF2X2JwcmludF9jbGVhcihidWYpOwotICAgIGlmICghcGFyZW50X3NlY3Rpb24pCi0gICAgICAgIHJldHVybjsKLSAgICBhdl9icHJpbnRmKGJ1ZiwgIiVzIiwgd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsLTFdLnN0cik7Ci0KLSAgICBpZiAoZmxhdC0+aGllcmFyY2hpY2FsIHx8Ci0gICAgICAgICEoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDVElPTl9GTEFHX0lTX0FSUkFZfFNFQ1RJT05fRkxBR19JU19XUkFQUEVSKSkpIHsKLSAgICAgICAgYXZfYnByaW50ZihidWYsICIlcyVzIiwgd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF0tPm5hbWUsIGZsYXQtPnNlcF9zdHIpOwotCi0gICAgICAgIGlmIChwYXJlbnRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpIHsKLSAgICAgICAgICAgIGludCBuID0gcGFyZW50X3NlY3Rpb24tPmlkID09IFNFQ1RJT05fSURfUEFDS0VUU19BTkRfRlJBTUVTID8KLSAgICAgICAgICAgICAgICB3Y3R4LT5uYl9zZWN0aW9uX3BhY2tldF9mcmFtZSA6IHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWwtMV07Ci0gICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiVkJXMiLCBuLCBmbGF0LT5zZXBfc3RyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZmxhdF9wcmludF9pbnQoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBsb25nIGxvbmcgaW50IHZhbHVlKQotewotICAgIHByaW50ZigiJXMlcz0lbGxkXG4iLCB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdLnN0ciwga2V5LCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZsYXRfcHJpbnRfc3RyKFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gICAgRmxhdENvbnRleHQgKmZsYXQgPSB3Y3R4LT5wcml2OwotICAgIEFWQlByaW50IGJ1ZjsKLQotICAgIHByaW50ZigiJXMiLCB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdLnN0cik7Ci0gICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKLSAgICBwcmludGYoIiVzPSIsIGZsYXRfZXNjYXBlX2tleV9zdHIoJmJ1Ziwga2V5LCBmbGF0LT5zZXApKTsKLSAgICBhdl9icHJpbnRfY2xlYXIoJmJ1Zik7Ci0gICAgcHJpbnRmKCJcIiVzXCJcbiIsIGZsYXRfZXNjYXBlX3ZhbHVlX3N0cigmYnVmLCB2YWx1ZSkpOwotICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKLX0KLQotc3RhdGljIGNvbnN0IFdyaXRlciBmbGF0X3dyaXRlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gImZsYXQiLAotICAgIC5wcml2X3NpemUgICAgICAgICAgICAgPSBzaXplb2YoRmxhdENvbnRleHQpLAotICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBmbGF0X2luaXQsCi0gICAgLnByaW50X3NlY3Rpb25faGVhZGVyICA9IGZsYXRfcHJpbnRfc2VjdGlvbl9oZWFkZXIsCi0gICAgLnByaW50X2ludGVnZXIgICAgICAgICA9IGZsYXRfcHJpbnRfaW50LAotICAgIC5wcmludF9zdHJpbmcgICAgICAgICAgPSBmbGF0X3ByaW50X3N0ciwKLSAgICAuZmxhZ3MgPSBXUklURVJfRkxBR19ESVNQTEFZX09QVElPTkFMX0ZJRUxEU3xXUklURVJfRkxBR19QVVRfUEFDS0VUU19BTkRfRlJBTUVTX0lOX1NBTUVfQ0hBUFRFUiwKLSAgICAucHJpdl9jbGFzcyAgICAgICAgICAgID0gJmZsYXRfY2xhc3MsCi19OwotCi0vKiBJTkkgZm9ybWF0IG91dHB1dCAqLwotCi10eXBlZGVmIHN0cnVjdCBJTklDb250ZXh0IHsKLSAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKLSAgICBpbnQgaGllcmFyY2hpY2FsOwotfSBJTklDb250ZXh0OwotCi0jdW5kZWYgT0ZGU0VUCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihJTklDb250ZXh0LCB4KQotCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gaW5pX29wdGlvbnNbXSA9IHsKLSAgICB7ImhpZXJhcmNoaWNhbCIsICJzcGVjaWZ5IGlmIHRoZSBzZWN0aW9uIHNwZWNpZmljYXRpb24gc2hvdWxkIGJlIGhpZXJhcmNoaWNhbCIsIE9GRlNFVChoaWVyYXJjaGljYWwpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0xfSwgMCwgMSB9LAotICAgIHsiaCIsICAgICAgICAgICAgInNwZWNpZnkgaWYgdGhlIHNlY3Rpb24gc3BlY2lmaWNhdGlvbiBzaG91bGQgYmUgaGllcmFyY2hpY2FsIiwgT0ZGU0VUKGhpZXJhcmNoaWNhbCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTF9LCAwLCAxIH0sCi0gICAge05VTEx9LAotfTsKLQotREVGSU5FX1dSSVRFUl9DTEFTUyhpbmkpOwotCi1zdGF0aWMgY2hhciAqaW5pX2VzY2FwZV9zdHIoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjKQotewotICAgIGludCBpID0gMDsKLSAgICBjaGFyIGMgPSAwOwotCi0gICAgd2hpbGUgKGMgPSBzcmNbaSsrXSkgewotICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgY2FzZSAnXGInOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcYiIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXGYnOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcZiIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcbiIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcciIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcdCIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICBjYXNlICcjJyA6Ci0gICAgICAgIGNhc2UgJz0nIDoKLSAgICAgICAgY2FzZSAnOicgOiBhdl9icHJpbnRfY2hhcnMoZHN0LCAnXFwnLCAxKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmICgodW5zaWduZWQgY2hhciljIDwgMzIpCi0gICAgICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJcXHgwMCUwMngiLCBjICYgMHhmZik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgYywgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZHN0LT5zdHI7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaV9wcmludF9zZWN0aW9uX2hlYWRlcihXcml0ZXJDb250ZXh0ICp3Y3R4KQotewotICAgIElOSUNvbnRleHQgKmluaSA9IHdjdHgtPnByaXY7Ci0gICAgQVZCUHJpbnQgKmJ1ZiA9ICZ3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdOwotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07Ci0gICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnBhcmVudF9zZWN0aW9uID0gd2N0eC0+bGV2ZWwgPwotICAgICAgICB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsLTFdIDogTlVMTDsKLQotICAgIGF2X2JwcmludF9jbGVhcihidWYpOwotICAgIGlmICghcGFyZW50X3NlY3Rpb24pIHsKLSAgICAgICAgcHJpbnRmKCIjIGZmcHJvYmUgb3V0cHV0XG5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWwtMV0pCi0gICAgICAgIHByaW50ZigiXG4iKTsKLQotICAgIGF2X2JwcmludGYoYnVmLCAiJXMiLCB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWwtMV0uc3RyKTsKLSAgICBpZiAoaW5pLT5oaWVyYXJjaGljYWwgfHwKLSAgICAgICAgIShzZWN0aW9uLT5mbGFncyAmIChTRUNUSU9OX0ZMQUdfSVNfQVJSQVl8U0VDVElPTl9GTEFHX0lTX1dSQVBQRVIpKSkgewotICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiVzJXMiLCBidWYtPnN0clswXSA/ICIuIiA6ICIiLCB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsXS0+bmFtZSk7Ci0KLSAgICAgICAgaWYgKHBhcmVudF9zZWN0aW9uLT5mbGFncyAmIFNFQ1RJT05fRkxBR19JU19BUlJBWSkgewotICAgICAgICAgICAgaW50IG4gPSBwYXJlbnRfc2VjdGlvbi0+aWQgPT0gU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVMgPwotICAgICAgICAgICAgICAgIHdjdHgtPm5iX3NlY3Rpb25fcGFja2V0X2ZyYW1lIDogd2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbC0xXTsKLSAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiLiVkIiwgbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIShzZWN0aW9uLT5mbGFncyAmIChTRUNUSU9OX0ZMQUdfSVNfQVJSQVl8U0VDVElPTl9GTEFHX0lTX1dSQVBQRVIpKSkKLSAgICAgICAgcHJpbnRmKCJbJXNdXG4iLCBidWYtPnN0cik7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaV9wcmludF9zdHIoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKLXsKLSAgICBBVkJQcmludCBidWY7Ci0KLSAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAxLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwotICAgIHByaW50ZigiJXM9IiwgaW5pX2VzY2FwZV9zdHIoJmJ1Ziwga2V5KSk7Ci0gICAgYXZfYnByaW50X2NsZWFyKCZidWYpOwotICAgIHByaW50ZigiJXNcbiIsIGluaV9lc2NhcGVfc3RyKCZidWYsIHZhbHVlKSk7Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBpbmlfcHJpbnRfaW50KFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmtleSwgbG9uZyBsb25nIGludCB2YWx1ZSkKLXsKLSAgICBwcmludGYoIiVzPSVsbGRcbiIsIGtleSwgdmFsdWUpOwotfQotCi1zdGF0aWMgY29uc3QgV3JpdGVyIGluaV93cml0ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJpbmkiLAotICAgIC5wcml2X3NpemUgICAgICAgICAgICAgPSBzaXplb2YoSU5JQ29udGV4dCksCi0gICAgLnByaW50X3NlY3Rpb25faGVhZGVyICA9IGluaV9wcmludF9zZWN0aW9uX2hlYWRlciwKLSAgICAucHJpbnRfaW50ZWdlciAgICAgICAgID0gaW5pX3ByaW50X2ludCwKLSAgICAucHJpbnRfc3RyaW5nICAgICAgICAgID0gaW5pX3ByaW50X3N0ciwKLSAgICAuZmxhZ3MgPSBXUklURVJfRkxBR19ESVNQTEFZX09QVElPTkFMX0ZJRUxEU3xXUklURVJfRkxBR19QVVRfUEFDS0VUU19BTkRfRlJBTUVTX0lOX1NBTUVfQ0hBUFRFUiwKLSAgICAucHJpdl9jbGFzcyAgICAgICAgICAgID0gJmluaV9jbGFzcywKLX07Ci0KLS8qIEpTT04gb3V0cHV0ICovCi0KLXR5cGVkZWYgc3RydWN0IEpTT05Db250ZXh0IHsKLSAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKLSAgICBpbnQgaW5kZW50X2xldmVsOwotICAgIGludCBjb21wYWN0OwotICAgIGNvbnN0IGNoYXIgKml0ZW1fc2VwLCAqaXRlbV9zdGFydF9lbmQ7Ci19IEpTT05Db250ZXh0OwotCi0jdW5kZWYgT0ZGU0VUCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihKU09OQ29udGV4dCwgeCkKLQotc3RhdGljIGNvbnN0IEFWT3B0aW9uIGpzb25fb3B0aW9uc1tdPSB7Ci0gICAgeyAiY29tcGFjdCIsICJlbmFibGUgY29tcGFjdCBvdXRwdXQiLCBPRkZTRVQoY29tcGFjdCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxIH0sCi0gICAgeyAiYyIsICAgICAgICJlbmFibGUgY29tcGFjdCBvdXRwdXQiLCBPRkZTRVQoY29tcGFjdCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxIH0sCi0gICAgeyBOVUxMIH0KLX07Ci0KLURFRklORV9XUklURVJfQ0xBU1MoanNvbik7Ci0KLXN0YXRpYyBhdl9jb2xkIGludCBqc29uX2luaXQoV3JpdGVyQ29udGV4dCAqd2N0eCkKLXsKLSAgICBKU09OQ29udGV4dCAqanNvbiA9IHdjdHgtPnByaXY7Ci0KLSAgICBqc29uLT5pdGVtX3NlcCAgICAgICA9IGpzb24tPmNvbXBhY3QgPyAiLCAiIDogIixcbiI7Ci0gICAganNvbi0+aXRlbV9zdGFydF9lbmQgPSBqc29uLT5jb21wYWN0ID8gIiAiICA6ICJcbiI7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKmpzb25fZXNjYXBlX3N0cihBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmxvZ19jdHgpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIganNvbl9lc2NhcGVbXSA9IHsnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsIDB9OwotICAgIHN0YXRpYyBjb25zdCBjaGFyIGpzb25fc3Vic3RbXSAgPSB7JyInLCAnXFwnLCAgJ2InLCAgJ2YnLCAgJ24nLCAgJ3InLCAgJ3QnLCAwfTsKLSAgICBjb25zdCBjaGFyICpwOwotCi0gICAgZm9yIChwID0gc3JjOyAqcDsgcCsrKSB7Ci0gICAgICAgIGNoYXIgKnMgPSBzdHJjaHIoanNvbl9lc2NhcGUsICpwKTsKLSAgICAgICAgaWYgKHMpIHsKLSAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICdcXCcsIDEpOwotICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwganNvbl9zdWJzdFtzIC0ganNvbl9lc2NhcGVdLCAxKTsKLSAgICAgICAgfSBlbHNlIGlmICgodW5zaWduZWQgY2hhcikqcCA8IDMyKSB7Ci0gICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIlxcdTAwJTAyeCIsICpwICYgMHhmZik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0LCAqcCwgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRzdC0+c3RyOwotfQotCi0jZGVmaW5lIEpTT05fSU5ERU5UKCkgcHJpbnRmKCIlKmMiLCBqc29uLT5pbmRlbnRfbGV2ZWwgKiA0LCAnICcpCi0KLXN0YXRpYyB2b2lkIGpzb25fcHJpbnRfc2VjdGlvbl9oZWFkZXIoV3JpdGVyQ29udGV4dCAqd2N0eCkKLXsKLSAgICBKU09OQ29udGV4dCAqanNvbiA9IHdjdHgtPnByaXY7Ci0gICAgQVZCUHJpbnQgYnVmOwotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07Ci0gICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnBhcmVudF9zZWN0aW9uID0gd2N0eC0+bGV2ZWwgPwotICAgICAgICB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsLTFdIDogTlVMTDsKLQotICAgIGlmICh3Y3R4LT5sZXZlbCAmJiB3Y3R4LT5uYl9pdGVtW3djdHgtPmxldmVsLTFdKQotICAgICAgICBwcmludGYoIixcbiIpOwotCi0gICAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDVElPTl9GTEFHX0lTX1dSQVBQRVIpIHsKLSAgICAgICAgcHJpbnRmKCJ7XG4iKTsKLSAgICAgICAganNvbi0+aW5kZW50X2xldmVsKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKLSAgICAgICAganNvbl9lc2NhcGVfc3RyKCZidWYsIHNlY3Rpb24tPm5hbWUsIHdjdHgpOwotICAgICAgICBKU09OX0lOREVOVCgpOwotCi0gICAgICAgIGpzb24tPmluZGVudF9sZXZlbCsrOwotICAgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpIHsKLSAgICAgICAgICAgIHByaW50ZigiXCIlc1wiOiBbXG4iLCBidWYuc3RyKTsKLSAgICAgICAgfSBlbHNlIGlmIChwYXJlbnRfc2VjdGlvbiAmJiAhKHBhcmVudF9zZWN0aW9uLT5mbGFncyAmIFNFQ1RJT05fRkxBR19JU19BUlJBWSkpIHsKLSAgICAgICAgICAgIHByaW50ZigiXCIlc1wiOiB7JXMiLCBidWYuc3RyLCBqc29uLT5pdGVtX3N0YXJ0X2VuZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludGYoInslcyIsIGpzb24tPml0ZW1fc3RhcnRfZW5kKTsKLQotICAgICAgICAgICAgLyogdGhpcyBpcyByZXF1aXJlZCBzbyB0aGUgcGFyc2VyIGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIHBhY2tldHMgYW5kIGZyYW1lcyAqLwotICAgICAgICAgICAgaWYgKHBhcmVudF9zZWN0aW9uICYmIHBhcmVudF9zZWN0aW9uLT5pZCA9PSBTRUNUSU9OX0lEX1BBQ0tFVFNfQU5EX0ZSQU1FUykgewotICAgICAgICAgICAgICAgIGlmICghanNvbi0+Y29tcGFjdCkKLSAgICAgICAgICAgICAgICAgICAgSlNPTl9JTkRFTlQoKTsKLSAgICAgICAgICAgICAgICBwcmludGYoIlwidHlwZVwiOiBcIiVzXCIlcyIsIHNlY3Rpb24tPm5hbWUsIGpzb24tPml0ZW1fc2VwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBqc29uX3ByaW50X3NlY3Rpb25fZm9vdGVyKFdyaXRlckNvbnRleHQgKndjdHgpCi17Ci0gICAgSlNPTkNvbnRleHQgKmpzb24gPSB3Y3R4LT5wcml2OwotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07Ci0KLSAgICBpZiAod2N0eC0+bGV2ZWwgPT0gMCkgewotICAgICAgICBqc29uLT5pbmRlbnRfbGV2ZWwtLTsKLSAgICAgICAgcHJpbnRmKCJcbn1cbiIpOwotICAgIH0gZWxzZSBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpIHsKLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICBqc29uLT5pbmRlbnRfbGV2ZWwtLTsKLSAgICAgICAgSlNPTl9JTkRFTlQoKTsKLSAgICAgICAgcHJpbnRmKCJdIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCIlcyIsIGpzb24tPml0ZW1fc3RhcnRfZW5kKTsKLSAgICAgICAganNvbi0+aW5kZW50X2xldmVsLS07Ci0gICAgICAgIGlmICghanNvbi0+Y29tcGFjdCkKLSAgICAgICAgICAgIEpTT05fSU5ERU5UKCk7Ci0gICAgICAgIHByaW50ZigifSIpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGpzb25fcHJpbnRfaXRlbV9zdHIoV3JpdGVyQ29udGV4dCAqd2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gICAgQVZCUHJpbnQgYnVmOwotCi0gICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKLSAgICBwcmludGYoIlwiJXNcIjoiLCBqc29uX2VzY2FwZV9zdHIoJmJ1Ziwga2V5LCAgIHdjdHgpKTsKLSAgICBhdl9icHJpbnRfY2xlYXIoJmJ1Zik7Ci0gICAgcHJpbnRmKCIgXCIlc1wiIiwganNvbl9lc2NhcGVfc3RyKCZidWYsIHZhbHVlLCB3Y3R4KSk7Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX3ByaW50X3N0cihXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIEpTT05Db250ZXh0ICpqc29uID0gd2N0eC0+cHJpdjsKLQotICAgIGlmICh3Y3R4LT5uYl9pdGVtW3djdHgtPmxldmVsXSkKLSAgICAgICAgcHJpbnRmKCIlcyIsIGpzb24tPml0ZW1fc2VwKTsKLSAgICBpZiAoIWpzb24tPmNvbXBhY3QpCi0gICAgICAgIEpTT05fSU5ERU5UKCk7Ci0gICAganNvbl9wcmludF9pdGVtX3N0cih3Y3R4LCBrZXksIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQganNvbl9wcmludF9pbnQoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBsb25nIGxvbmcgaW50IHZhbHVlKQotewotICAgIEpTT05Db250ZXh0ICpqc29uID0gd2N0eC0+cHJpdjsKLSAgICBBVkJQcmludCBidWY7Ci0KLSAgICBpZiAod2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0pCi0gICAgICAgIHByaW50ZigiJXMiLCBqc29uLT5pdGVtX3NlcCk7Ci0gICAgaWYgKCFqc29uLT5jb21wYWN0KQotICAgICAgICBKU09OX0lOREVOVCgpOwotCi0gICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKLSAgICBwcmludGYoIlwiJXNcIjogJWxsZCIsIGpzb25fZXNjYXBlX3N0cigmYnVmLCBrZXksIHdjdHgpLCB2YWx1ZSk7Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwotfQotCi1zdGF0aWMgY29uc3QgV3JpdGVyIGpzb25fd3JpdGVyID0gewotICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJqc29uIiwKLSAgICAucHJpdl9zaXplICAgICAgICAgICAgPSBzaXplb2YoSlNPTkNvbnRleHQpLAotICAgIC5pbml0ICAgICAgICAgICAgICAgICA9IGpzb25faW5pdCwKLSAgICAucHJpbnRfc2VjdGlvbl9oZWFkZXIgPSBqc29uX3ByaW50X3NlY3Rpb25faGVhZGVyLAotICAgIC5wcmludF9zZWN0aW9uX2Zvb3RlciA9IGpzb25fcHJpbnRfc2VjdGlvbl9mb290ZXIsCi0gICAgLnByaW50X2ludGVnZXIgICAgICAgID0ganNvbl9wcmludF9pbnQsCi0gICAgLnByaW50X3N0cmluZyAgICAgICAgID0ganNvbl9wcmludF9zdHIsCi0gICAgLmZsYWdzID0gV1JJVEVSX0ZMQUdfUFVUX1BBQ0tFVFNfQU5EX0ZSQU1FU19JTl9TQU1FX0NIQVBURVIsCi0gICAgLnByaXZfY2xhc3MgICAgICAgICAgID0gJmpzb25fY2xhc3MsCi19OwotCi0vKiBYTUwgb3V0cHV0ICovCi0KLXR5cGVkZWYgc3RydWN0IFhNTENvbnRleHQgewotICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwotICAgIGludCB3aXRoaW5fdGFnOwotICAgIGludCBpbmRlbnRfbGV2ZWw7Ci0gICAgaW50IGZ1bGx5X3F1YWxpZmllZDsKLSAgICBpbnQgeHNkX3N0cmljdDsKLX0gWE1MQ29udGV4dDsKLQotI3VuZGVmIE9GRlNFVAotI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoWE1MQ29udGV4dCwgeCkKLQotc3RhdGljIGNvbnN0IEFWT3B0aW9uIHhtbF9vcHRpb25zW10gPSB7Ci0gICAgeyJmdWxseV9xdWFsaWZpZWQiLCAic3BlY2lmeSBpZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBmdWxseSBxdWFsaWZpZWQiLCBPRkZTRVQoZnVsbHlfcXVhbGlmaWVkKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sICAwLCAxIH0sCi0gICAgeyJxIiwgICAgICAgICAgICAgICAic3BlY2lmeSBpZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBmdWxseSBxdWFsaWZpZWQiLCBPRkZTRVQoZnVsbHlfcXVhbGlmaWVkKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sICAwLCAxIH0sCi0gICAgeyJ4c2Rfc3RyaWN0IiwgICAgICAiZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyBYU0QgY29tcGxpYW50IiwgICAgICAgICBPRkZTRVQoeHNkX3N0cmljdCksICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sICAwLCAxIH0sCi0gICAgeyJ4IiwgICAgICAgICAgICAgICAiZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyBYU0QgY29tcGxpYW50IiwgICAgICAgICBPRkZTRVQoeHNkX3N0cmljdCksICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sICAwLCAxIH0sCi0gICAge05VTEx9LAotfTsKLQotREVGSU5FX1dSSVRFUl9DTEFTUyh4bWwpOwotCi1zdGF0aWMgYXZfY29sZCBpbnQgeG1sX2luaXQoV3JpdGVyQ29udGV4dCAqd2N0eCkKLXsKLSAgICBYTUxDb250ZXh0ICp4bWwgPSB3Y3R4LT5wcml2OwotCi0gICAgaWYgKHhtbC0+eHNkX3N0cmljdCkgewotICAgICAgICB4bWwtPmZ1bGx5X3F1YWxpZmllZCA9IDE7Ci0jZGVmaW5lIENIRUNLX0NPTVBMSUFOQ0Uob3B0LCBvcHRfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChvcHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIlhTRC1jb21wbGlhbnQgb3V0cHV0IHNlbGVjdGVkIGJ1dCBvcHRpb24gJyVzJyB3YXMgc2VsZWN0ZWQsIFhNTCBvdXRwdXQgbWF5IGJlIG5vbi1jb21wbGlhbnQuXG4iIFwKLSAgICAgICAgICAgICAgICAgICAiWW91IG5lZWQgdG8gZGlzYWJsZSBzdWNoIG9wdGlvbiB3aXRoICctbm8lcydcbiIsIG9wdF9uYW1lLCBvcHRfbmFtZSk7IFwKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfQotICAgICAgICBDSEVDS19DT01QTElBTkNFKHNob3dfcHJpdmF0ZV9kYXRhLCAicHJpdmF0ZSIpOwotICAgICAgICBDSEVDS19DT01QTElBTkNFKHNob3dfdmFsdWVfdW5pdCwgICAidW5pdCIpOwotICAgICAgICBDSEVDS19DT01QTElBTkNFKHVzZV92YWx1ZV9wcmVmaXgsICAicHJlZml4Iik7Ci0KLSAgICAgICAgaWYgKGRvX3Nob3dfZnJhbWVzICYmIGRvX3Nob3dfcGFja2V0cykgewotICAgICAgICAgICAgYXZfbG9nKHdjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiSW50ZXJsZWF2ZWQgZnJhbWVzIGFuZCBwYWNrZXRzIGFyZSBub3QgYWxsb3dlZCBpbiBYU0QuICIKLSAgICAgICAgICAgICAgICAgICAiU2VsZWN0IG9ubHkgb25lIGJldHdlZW4gdGhlIC1zaG93X2ZyYW1lcyBhbmQgdGhlIC1zaG93X3BhY2tldHMgb3B0aW9ucy5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqeG1sX2VzY2FwZV9zdHIoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjLCB2b2lkICpsb2dfY3R4KQotewotICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICBmb3IgKHAgPSBzcmM7ICpwOyBwKyspIHsKLSAgICAgICAgc3dpdGNoICgqcCkgewotICAgICAgICBjYXNlICcmJyA6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJmFtcDsiKTsgIGJyZWFrOwotICAgICAgICBjYXNlICc8JyA6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJmx0OyIpOyAgIGJyZWFrOwotICAgICAgICBjYXNlICc+JyA6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJmd0OyIpOyAgIGJyZWFrOwotICAgICAgICBjYXNlICciJyA6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJnF1b3Q7Iik7IGJyZWFrOwotICAgICAgICBjYXNlICdcJyc6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJmFwb3M7Iik7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiBhdl9icHJpbnRfY2hhcnMoZHN0LCAqcCwgMSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZHN0LT5zdHI7Ci19Ci0KLSNkZWZpbmUgWE1MX0lOREVOVCgpIHByaW50ZigiJSpjIiwgeG1sLT5pbmRlbnRfbGV2ZWwgKiA0LCAnICcpCi0KLXN0YXRpYyB2b2lkIHhtbF9wcmludF9zZWN0aW9uX2hlYWRlcihXcml0ZXJDb250ZXh0ICp3Y3R4KQotewotICAgIFhNTENvbnRleHQgKnhtbCA9IHdjdHgtPnByaXY7Ci0gICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb24gPSB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsXTsKLSAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqcGFyZW50X3NlY3Rpb24gPSB3Y3R4LT5sZXZlbCA/Ci0gICAgICAgIHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWwtMV0gOiBOVUxMOwotCi0gICAgaWYgKHdjdHgtPmxldmVsID09IDApIHsKLSAgICAgICAgY29uc3QgY2hhciAqcXVhbCA9ICIgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgIgotICAgICAgICAgICAgInhtbG5zOmZmcHJvYmU9J2h0dHA6Ly93d3cuZmZtcGVnLm9yZy9zY2hlbWEvZmZwcm9iZScgIgotICAgICAgICAgICAgInhzaTpzY2hlbWFMb2NhdGlvbj0naHR0cDovL3d3dy5mZm1wZWcub3JnL3NjaGVtYS9mZnByb2JlIGZmcHJvYmUueHNkJyI7Ci0KLSAgICAgICAgcHJpbnRmKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOwotICAgICAgICBwcmludGYoIjwlc2ZmcHJvYmUlcz5cbiIsCi0gICAgICAgICAgICAgICB4bWwtPmZ1bGx5X3F1YWxpZmllZCA/ICJmZnByb2JlOiIgOiAiIiwKLSAgICAgICAgICAgICAgIHhtbC0+ZnVsbHlfcXVhbGlmaWVkID8gcXVhbCA6ICIiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICh4bWwtPndpdGhpbl90YWcpIHsKLSAgICAgICAgeG1sLT53aXRoaW5fdGFnID0gMDsKLSAgICAgICAgcHJpbnRmKCI+XG4iKTsKLSAgICB9Ci0gICAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDVElPTl9GTEFHX0hBU19WQVJJQUJMRV9GSUVMRFMpIHsKLSAgICAgICAgeG1sLT5pbmRlbnRfbGV2ZWwrKzsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocGFyZW50X3NlY3Rpb24gJiYgKHBhcmVudF9zZWN0aW9uLT5mbGFncyAmIFNFQ1RJT05fRkxBR19JU19XUkFQUEVSKSAmJgotICAgICAgICAgICAgd2N0eC0+bGV2ZWwgJiYgd2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbC0xXSkKLSAgICAgICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgeG1sLT5pbmRlbnRfbGV2ZWwrKzsKLQotICAgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpIHsKLSAgICAgICAgICAgIFhNTF9JTkRFTlQoKTsgcHJpbnRmKCI8JXM+XG4iLCBzZWN0aW9uLT5uYW1lKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFhNTF9JTkRFTlQoKTsgcHJpbnRmKCI8JXMgIiwgc2VjdGlvbi0+bmFtZSk7Ci0gICAgICAgICAgICB4bWwtPndpdGhpbl90YWcgPSAxOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCB4bWxfcHJpbnRfc2VjdGlvbl9mb290ZXIoV3JpdGVyQ29udGV4dCAqd2N0eCkKLXsKLSAgICBYTUxDb250ZXh0ICp4bWwgPSB3Y3R4LT5wcml2OwotICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07Ci0KLSAgICBpZiAod2N0eC0+bGV2ZWwgPT0gMCkgewotICAgICAgICBwcmludGYoIjwvJXNmZnByb2JlPlxuIiwgeG1sLT5mdWxseV9xdWFsaWZpZWQgPyAiZmZwcm9iZToiIDogIiIpOwotICAgIH0gZWxzZSBpZiAoeG1sLT53aXRoaW5fdGFnKSB7Ci0gICAgICAgIHhtbC0+d2l0aGluX3RhZyA9IDA7Ci0gICAgICAgIHByaW50ZigiLz5cbiIpOwotICAgICAgICB4bWwtPmluZGVudF9sZXZlbC0tOwotICAgIH0gZWxzZSBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUykgewotICAgICAgICB4bWwtPmluZGVudF9sZXZlbC0tOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFhNTF9JTkRFTlQoKTsgcHJpbnRmKCI8LyVzPlxuIiwgc2VjdGlvbi0+bmFtZSk7Ci0gICAgICAgIHhtbC0+aW5kZW50X2xldmVsLS07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCB4bWxfcHJpbnRfc3RyKFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCi17Ci0gICAgQVZCUHJpbnQgYnVmOwotICAgIFhNTENvbnRleHQgKnhtbCA9IHdjdHgtPnByaXY7Ci0gICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb24gPSB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsXTsKLQotICAgIGF2X2JwcmludF9pbml0KCZidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7Ci0KLSAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUykgewotICAgICAgICBYTUxfSU5ERU5UKCk7Ci0gICAgICAgIHByaW50ZigiPCVzIGtleT1cIiVzXCIiLAotICAgICAgICAgICAgICAgc2VjdGlvbi0+ZWxlbWVudF9uYW1lLCB4bWxfZXNjYXBlX3N0cigmYnVmLCBrZXksIHdjdHgpKTsKLSAgICAgICAgYXZfYnByaW50X2NsZWFyKCZidWYpOwotICAgICAgICBwcmludGYoIiB2YWx1ZT1cIiVzXCIvPlxuIiwgeG1sX2VzY2FwZV9zdHIoJmJ1ZiwgdmFsdWUsIHdjdHgpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAod2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0pCi0gICAgICAgICAgICBwcmludGYoIiAiKTsKLSAgICAgICAgcHJpbnRmKCIlcz1cIiVzXCIiLCBrZXksIHhtbF9lc2NhcGVfc3RyKCZidWYsIHZhbHVlLCB3Y3R4KSk7Ci0gICAgfQotCi0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwotfQotCi1zdGF0aWMgdm9pZCB4bWxfcHJpbnRfaW50KFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmtleSwgbG9uZyBsb25nIGludCB2YWx1ZSkKLXsKLSAgICBpZiAod2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0pCi0gICAgICAgIHByaW50ZigiICIpOwotICAgIHByaW50ZigiJXM9XCIlbGxkXCIiLCBrZXksIHZhbHVlKTsKLX0KLQotc3RhdGljIFdyaXRlciB4bWxfd3JpdGVyID0gewotICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJ4bWwiLAotICAgIC5wcml2X3NpemUgICAgICAgICAgICA9IHNpemVvZihYTUxDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSB4bWxfaW5pdCwKLSAgICAucHJpbnRfc2VjdGlvbl9oZWFkZXIgPSB4bWxfcHJpbnRfc2VjdGlvbl9oZWFkZXIsCi0gICAgLnByaW50X3NlY3Rpb25fZm9vdGVyID0geG1sX3ByaW50X3NlY3Rpb25fZm9vdGVyLAotICAgIC5wcmludF9pbnRlZ2VyICAgICAgICA9IHhtbF9wcmludF9pbnQsCi0gICAgLnByaW50X3N0cmluZyAgICAgICAgID0geG1sX3ByaW50X3N0ciwKLSAgICAuZmxhZ3MgPSBXUklURVJfRkxBR19QVVRfUEFDS0VUU19BTkRfRlJBTUVTX0lOX1NBTUVfQ0hBUFRFUiwKLSAgICAucHJpdl9jbGFzcyAgICAgICAgICAgPSAmeG1sX2NsYXNzLAotfTsKLQotc3RhdGljIHZvaWQgd3JpdGVyX3JlZ2lzdGVyX2FsbCh2b2lkKQotewotICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7Ci0KLSAgICBpZiAoaW5pdGlhbGl6ZWQpCi0gICAgICAgIHJldHVybjsKLSAgICBpbml0aWFsaXplZCA9IDE7Ci0KLSAgICB3cml0ZXJfcmVnaXN0ZXIoJmRlZmF1bHRfd3JpdGVyKTsKLSAgICB3cml0ZXJfcmVnaXN0ZXIoJmNvbXBhY3Rfd3JpdGVyKTsKLSAgICB3cml0ZXJfcmVnaXN0ZXIoJmNzdl93cml0ZXIpOwotICAgIHdyaXRlcl9yZWdpc3RlcigmZmxhdF93cml0ZXIpOwotICAgIHdyaXRlcl9yZWdpc3RlcigmaW5pX3dyaXRlcik7Ci0gICAgd3JpdGVyX3JlZ2lzdGVyKCZqc29uX3dyaXRlcik7Ci0gICAgd3JpdGVyX3JlZ2lzdGVyKCZ4bWxfd3JpdGVyKTsKLX0KLQotI2RlZmluZSBwcmludF9mbXQoaywgZiwgLi4uKSBkbyB7ICAgICAgICAgICAgICBcCi0gICAgYXZfYnByaW50X2NsZWFyKCZwYnVmKTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhdl9icHJpbnRmKCZwYnVmLCBmLCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgXAotICAgIHdyaXRlcl9wcmludF9zdHJpbmcodywgaywgcGJ1Zi5zdHIsIDApOyAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIHByaW50X2ludChrLCB2KSAgICAgICAgIHdyaXRlcl9wcmludF9pbnRlZ2VyKHcsIGssIHYpCi0jZGVmaW5lIHByaW50X3EoaywgdiwgcykgICAgICAgIHdyaXRlcl9wcmludF9yYXRpb25hbCh3LCBrLCB2LCBzKQotI2RlZmluZSBwcmludF9zdHIoaywgdikgICAgICAgICB3cml0ZXJfcHJpbnRfc3RyaW5nKHcsIGssIHYsIDApCi0jZGVmaW5lIHByaW50X3N0cl9vcHQoaywgdikgICAgIHdyaXRlcl9wcmludF9zdHJpbmcodywgaywgdiwgUFJJTlRfU1RSSU5HX09QVCkKLSNkZWZpbmUgcHJpbnRfc3RyX3ZhbGlkYXRlKGssIHYpIHdyaXRlcl9wcmludF9zdHJpbmcodywgaywgdiwgUFJJTlRfU1RSSU5HX1ZBTElEQVRFKQotI2RlZmluZSBwcmludF90aW1lKGssIHYsIHRiKSAgICB3cml0ZXJfcHJpbnRfdGltZSh3LCBrLCB2LCB0YiwgMCkKLSNkZWZpbmUgcHJpbnRfdHMoaywgdikgICAgICAgICAgd3JpdGVyX3ByaW50X3RzKHcsIGssIHYsIDApCi0jZGVmaW5lIHByaW50X2R1cmF0aW9uX3RpbWUoaywgdiwgdGIpIHdyaXRlcl9wcmludF90aW1lKHcsIGssIHYsIHRiLCAxKQotI2RlZmluZSBwcmludF9kdXJhdGlvbl90cyhrLCB2KSAgICAgICB3cml0ZXJfcHJpbnRfdHModywgaywgdiwgMSkKLSNkZWZpbmUgcHJpbnRfdmFsKGssIHYsIHUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0cnVjdCB1bml0X3ZhbHVlIHV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdXYudmFsLmkgPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1di51bml0ID0gdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdyaXRlcl9wcmludF9zdHJpbmcodywgaywgdmFsdWVfc3RyaW5nKHZhbF9zdHIsIHNpemVvZih2YWxfc3RyKSwgdXYpLCAwKTsgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBwcmludF9zZWN0aW9uX2hlYWRlcihzKSB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgcykKLSNkZWZpbmUgcHJpbnRfc2VjdGlvbl9mb290ZXIocykgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcsIHMpCi0KLSNkZWZpbmUgUkVBTExPQ1pfQVJSQVlfU1RSRUFNKHB0ciwgY3VyX24sIG5ld19uKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXQgPSBhdl9yZWFsbG9jcF9hcnJheSgmKHB0ciksIChuZXdfbiksIHNpemVvZigqKHB0cikpKTsgICAgICAgICAgIFwKLSAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZ290byBlbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBtZW1zZXQoIChwdHIpICsgKGN1cl9uKSwgMCwgKChuZXdfbikgLSAoY3VyX24pKSAqIHNpemVvZigqKHB0cikpICk7IFwKLX0KLQotc3RhdGljIGlubGluZSBpbnQgc2hvd190YWdzKFdyaXRlckNvbnRleHQgKncsIEFWRGljdGlvbmFyeSAqdGFncywgaW50IHNlY3Rpb25faWQpCi17Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRhZyA9IE5VTEw7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAoIXRhZ3MpCi0gICAgICAgIHJldHVybiAwOwotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBzZWN0aW9uX2lkKTsKLQotICAgIHdoaWxlICgodGFnID0gYXZfZGljdF9nZXQodGFncywgIiIsIHRhZywgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKLSAgICAgICAgaWYgKChyZXQgPSBwcmludF9zdHJfdmFsaWRhdGUodGFnLT5rZXksIHRhZy0+dmFsdWUpKSA8IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgc2hvd19wYWNrZXQoV3JpdGVyQ29udGV4dCAqdywgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4LCBBVlBhY2tldCAqcGt0LCBpbnQgcGFja2V0X2lkeCkKLXsKLSAgICBjaGFyIHZhbF9zdHJbMTI4XTsKLSAgICBBVlN0cmVhbSAqc3QgPSBmbXRfY3R4LT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKLSAgICBBVkJQcmludCBwYnVmOwotICAgIGNvbnN0IGNoYXIgKnM7Ci0KLSAgICBhdl9icHJpbnRfaW5pdCgmcGJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKLQotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1BBQ0tFVCk7Ci0KLSAgICBzID0gYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSk7Ci0gICAgaWYgKHMpIHByaW50X3N0ciAgICAoImNvZGVjX3R5cGUiLCBzKTsKLSAgICBlbHNlICAgcHJpbnRfc3RyX29wdCgiY29kZWNfdHlwZSIsICJ1bmtub3duIik7Ci0gICAgcHJpbnRfaW50KCJzdHJlYW1faW5kZXgiLCAgICAgcGt0LT5zdHJlYW1faW5kZXgpOwotICAgIHByaW50X3RzICAoInB0cyIsICAgICAgICAgICAgIHBrdC0+cHRzKTsKLSAgICBwcmludF90aW1lKCJwdHNfdGltZSIsICAgICAgICBwa3QtPnB0cywgJnN0LT50aW1lX2Jhc2UpOwotICAgIHByaW50X3RzICAoImR0cyIsICAgICAgICAgICAgIHBrdC0+ZHRzKTsKLSAgICBwcmludF90aW1lKCJkdHNfdGltZSIsICAgICAgICBwa3QtPmR0cywgJnN0LT50aW1lX2Jhc2UpOwotICAgIHByaW50X2R1cmF0aW9uX3RzKCJkdXJhdGlvbiIsICAgICAgICBwa3QtPmR1cmF0aW9uKTsKLSAgICBwcmludF9kdXJhdGlvbl90aW1lKCJkdXJhdGlvbl90aW1lIiwgcGt0LT5kdXJhdGlvbiwgJnN0LT50aW1lX2Jhc2UpOwotICAgIHByaW50X2R1cmF0aW9uX3RzKCJjb252ZXJnZW5jZV9kdXJhdGlvbiIsIHBrdC0+Y29udmVyZ2VuY2VfZHVyYXRpb24pOwotICAgIHByaW50X2R1cmF0aW9uX3RpbWUoImNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWUiLCBwa3QtPmNvbnZlcmdlbmNlX2R1cmF0aW9uLCAmc3QtPnRpbWVfYmFzZSk7Ci0gICAgcHJpbnRfdmFsKCJzaXplIiwgICAgICAgICAgICAgcGt0LT5zaXplLCB1bml0X2J5dGVfc3RyKTsKLSAgICBpZiAocGt0LT5wb3MgIT0gLTEpIHByaW50X2ZtdCAgICAoInBvcyIsICIlIlBSSWQ2NCwgcGt0LT5wb3MpOwotICAgIGVsc2UgICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgicG9zIiwgIk4vQSIpOwotICAgIHByaW50X2ZtdCgiZmxhZ3MiLCAiJWMiLCAgICAgIHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkgPyAnSycgOiAnXycpOwotCi0gICAgaWYgKHBrdC0+c2lkZV9kYXRhX2VsZW1zKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc2lkZV9tZXRhZGF0YTsKLQotICAgICAgICBzaWRlX21ldGFkYXRhID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9TVFJJTkdTX01FVEFEQVRBLCAmc2l6ZSk7Ci0gICAgICAgIGlmIChzaWRlX21ldGFkYXRhICYmIHNpemUgJiYgZG9fc2hvd19wYWNrZXRfdGFncykgewotICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpkaWN0ID0gTlVMTDsKLSAgICAgICAgICAgIGlmIChhdl9wYWNrZXRfdW5wYWNrX2RpY3Rpb25hcnkoc2lkZV9tZXRhZGF0YSwgc2l6ZSwgJmRpY3QpID49IDApCi0gICAgICAgICAgICAgICAgc2hvd190YWdzKHcsIGRpY3QsIFNFQ1RJT05fSURfUEFDS0VUX1RBR1MpOwotICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBX0xJU1QpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGt0LT5zaWRlX2RhdGFfZWxlbXM7IGkrKykgewotICAgICAgICAgICAgQVZQYWNrZXRTaWRlRGF0YSAqc2QgPSAmcGt0LT5zaWRlX2RhdGFbaV07Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gYXZfcGFja2V0X3NpZGVfZGF0YV9uYW1lKHNkLT50eXBlKTsKLSAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1BBQ0tFVF9TSURFX0RBVEEpOwotICAgICAgICAgICAgcHJpbnRfc3RyKCJzaWRlX2RhdGFfdHlwZSIsIG5hbWUgPyBuYW1lIDogInVua25vd24iKTsKLSAgICAgICAgICAgIHByaW50X2ludCgic2lkZV9kYXRhX3NpemUiLCBzZC0+c2l6ZSk7Ci0gICAgICAgICAgICBpZiAoc2QtPnR5cGUgPT0gQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWCAmJiBzZC0+c2l6ZSA+PSA5KjQpIHsKLSAgICAgICAgICAgICAgICB3cml0ZXJfcHJpbnRfaW50ZWdlcnModywgImRpc3BsYXltYXRyaXgiLCBzZC0+ZGF0YSwgOSwgIiAlMTFkIiwgMywgNCwgMSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfaW50KCJyb3RhdGlvbiIsIGF2X2Rpc3BsYXlfcm90YXRpb25fZ2V0KChpbnQzMl90ICopc2QtPmRhdGEpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Ci0gICAgfQotCi0gICAgaWYgKGRvX3Nob3dfZGF0YSkKLSAgICAgICAgd3JpdGVyX3ByaW50X2RhdGEodywgImRhdGEiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7Ci0gICAgd3JpdGVyX3ByaW50X2RhdGFfaGFzaCh3LCAiZGF0YV9oYXNoIiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOwotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLQotICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcGJ1ZiwgTlVMTCk7Ci0gICAgZmZsdXNoKHN0ZG91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHNob3dfc3VidGl0bGUoV3JpdGVyQ29udGV4dCAqdywgQVZTdWJ0aXRsZSAqc3ViLCBBVlN0cmVhbSAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgpCi17Ci0gICAgQVZCUHJpbnQgcGJ1ZjsKLQotICAgIGF2X2JwcmludF9pbml0KCZwYnVmLCAxLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwotCi0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfU1VCVElUTEUpOwotCi0gICAgcHJpbnRfc3RyICgibWVkaWFfdHlwZSIsICAgICAgICAgInN1YnRpdGxlIik7Ci0gICAgcHJpbnRfdHMgICgicHRzIiwgICAgICAgICAgICAgICAgIHN1Yi0+cHRzKTsKLSAgICBwcmludF90aW1lKCJwdHNfdGltZSIsICAgICAgICAgICAgc3ViLT5wdHMsICZBVl9USU1FX0JBU0VfUSk7Ci0gICAgcHJpbnRfaW50ICgiZm9ybWF0IiwgICAgICAgICAgICAgIHN1Yi0+Zm9ybWF0KTsKLSAgICBwcmludF9pbnQgKCJzdGFydF9kaXNwbGF5X3RpbWUiLCAgc3ViLT5zdGFydF9kaXNwbGF5X3RpbWUpOwotICAgIHByaW50X2ludCAoImVuZF9kaXNwbGF5X3RpbWUiLCAgICBzdWItPmVuZF9kaXNwbGF5X3RpbWUpOwotICAgIHByaW50X2ludCAoIm51bV9yZWN0cyIsICAgICAgICAgICBzdWItPm51bV9yZWN0cyk7Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Ci0KLSAgICBhdl9icHJpbnRfZmluYWxpemUoJnBidWYsIE5VTEwpOwotICAgIGZmbHVzaChzdGRvdXQpOwotfQotCi1zdGF0aWMgdm9pZCBzaG93X2ZyYW1lKFdyaXRlckNvbnRleHQgKncsIEFWRnJhbWUgKmZyYW1lLCBBVlN0cmVhbSAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgpCi17Ci0gICAgQVZCUHJpbnQgcGJ1ZjsKLSAgICBjaGFyIHZhbF9zdHJbMTI4XTsKLSAgICBjb25zdCBjaGFyICpzOwotICAgIGludCBpOwotCi0gICAgYXZfYnByaW50X2luaXQoJnBidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9GUkFNRSk7Ci0KLSAgICBzID0gYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUpOwotICAgIGlmIChzKSBwcmludF9zdHIgICAgKCJtZWRpYV90eXBlIiwgcyk7Ci0gICAgZWxzZSAgIHByaW50X3N0cl9vcHQoIm1lZGlhX3R5cGUiLCAidW5rbm93biIpOwotICAgIHByaW50X2ludCgic3RyZWFtX2luZGV4IiwgICAgICAgICAgIHN0cmVhbS0+aW5kZXgpOwotICAgIHByaW50X2ludCgia2V5X2ZyYW1lIiwgICAgICAgICAgICAgIGZyYW1lLT5rZXlfZnJhbWUpOwotICAgIHByaW50X3RzICAoInBrdF9wdHMiLCAgICAgICAgICAgICAgIGZyYW1lLT5wa3RfcHRzKTsKLSAgICBwcmludF90aW1lKCJwa3RfcHRzX3RpbWUiLCAgICAgICAgICBmcmFtZS0+cGt0X3B0cywgJnN0cmVhbS0+dGltZV9iYXNlKTsKLSAgICBwcmludF90cyAgKCJwa3RfZHRzIiwgICAgICAgICAgICAgICBmcmFtZS0+cGt0X2R0cyk7Ci0gICAgcHJpbnRfdGltZSgicGt0X2R0c190aW1lIiwgICAgICAgICAgZnJhbWUtPnBrdF9kdHMsICZzdHJlYW0tPnRpbWVfYmFzZSk7Ci0gICAgcHJpbnRfdHMgICgiYmVzdF9lZmZvcnRfdGltZXN0YW1wIiwgYXZfZnJhbWVfZ2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChmcmFtZSkpOwotICAgIHByaW50X3RpbWUoImJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lIiwgYXZfZnJhbWVfZ2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChmcmFtZSksICZzdHJlYW0tPnRpbWVfYmFzZSk7Ci0gICAgcHJpbnRfZHVyYXRpb25fdHMgICgicGt0X2R1cmF0aW9uIiwgICAgICBhdl9mcmFtZV9nZXRfcGt0X2R1cmF0aW9uKGZyYW1lKSk7Ci0gICAgcHJpbnRfZHVyYXRpb25fdGltZSgicGt0X2R1cmF0aW9uX3RpbWUiLCBhdl9mcmFtZV9nZXRfcGt0X2R1cmF0aW9uKGZyYW1lKSwgJnN0cmVhbS0+dGltZV9iYXNlKTsKLSAgICBpZiAoYXZfZnJhbWVfZ2V0X3BrdF9wb3MgKGZyYW1lKSAhPSAtMSkgcHJpbnRfZm10ICAgICgicGt0X3BvcyIsICIlIlBSSWQ2NCwgYXZfZnJhbWVfZ2V0X3BrdF9wb3MoZnJhbWUpKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoInBrdF9wb3MiLCAiTi9BIik7Ci0gICAgaWYgKGF2X2ZyYW1lX2dldF9wa3Rfc2l6ZShmcmFtZSkgIT0gLTEpIHByaW50X3ZhbCAgICAoInBrdF9zaXplIiwgYXZfZnJhbWVfZ2V0X3BrdF9zaXplKGZyYW1lKSwgdW5pdF9ieXRlX3N0cik7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgicGt0X3NpemUiLCAiTi9BIik7Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKLSAgICAgICAgQVZSYXRpb25hbCBzYXI7Ci0KLSAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgcHJpbnRfaW50KCJ3aWR0aCIsICAgICAgICAgICAgICAgICAgZnJhbWUtPndpZHRoKTsKLSAgICAgICAgcHJpbnRfaW50KCJoZWlnaHQiLCAgICAgICAgICAgICAgICAgZnJhbWUtPmhlaWdodCk7Ci0gICAgICAgIHMgPSBhdl9nZXRfcGl4X2ZtdF9uYW1lKGZyYW1lLT5mb3JtYXQpOwotICAgICAgICBpZiAocykgcHJpbnRfc3RyICAgICgicGl4X2ZtdCIsIHMpOwotICAgICAgICBlbHNlICAgcHJpbnRfc3RyX29wdCgicGl4X2ZtdCIsICJ1bmtub3duIik7Ci0gICAgICAgIHNhciA9IGF2X2d1ZXNzX3NhbXBsZV9hc3BlY3RfcmF0aW8oZm10X2N0eCwgc3RyZWFtLCBmcmFtZSk7Ci0gICAgICAgIGlmIChzYXIubnVtKSB7Ci0gICAgICAgICAgICBwcmludF9xKCJzYW1wbGVfYXNwZWN0X3JhdGlvIiwgc2FyLCAnOicpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgic2FtcGxlX2FzcGVjdF9yYXRpbyIsICJOL0EiKTsKLSAgICAgICAgfQotICAgICAgICBwcmludF9mbXQoInBpY3RfdHlwZSIsICAgICAgICAgICAgICAiJWMiLCBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIoZnJhbWUtPnBpY3RfdHlwZSkpOwotICAgICAgICBwcmludF9pbnQoImNvZGVkX3BpY3R1cmVfbnVtYmVyIiwgICBmcmFtZS0+Y29kZWRfcGljdHVyZV9udW1iZXIpOwotICAgICAgICBwcmludF9pbnQoImRpc3BsYXlfcGljdHVyZV9udW1iZXIiLCBmcmFtZS0+ZGlzcGxheV9waWN0dXJlX251bWJlcik7Ci0gICAgICAgIHByaW50X2ludCgiaW50ZXJsYWNlZF9mcmFtZSIsICAgICAgIGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lKTsKLSAgICAgICAgcHJpbnRfaW50KCJ0b3BfZmllbGRfZmlyc3QiLCAgICAgICAgZnJhbWUtPnRvcF9maWVsZF9maXJzdCk7Ci0gICAgICAgIHByaW50X2ludCgicmVwZWF0X3BpY3QiLCAgICAgICAgICAgIGZyYW1lLT5yZXBlYXRfcGljdCk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgIHMgPSBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGZyYW1lLT5mb3JtYXQpOwotICAgICAgICBpZiAocykgcHJpbnRfc3RyICAgICgic2FtcGxlX2ZtdCIsIHMpOwotICAgICAgICBlbHNlICAgcHJpbnRfc3RyX29wdCgic2FtcGxlX2ZtdCIsICJ1bmtub3duIik7Ci0gICAgICAgIHByaW50X2ludCgibmJfc2FtcGxlcyIsICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMpOwotICAgICAgICBwcmludF9pbnQoImNoYW5uZWxzIiwgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKSk7Ci0gICAgICAgIGlmIChhdl9mcmFtZV9nZXRfY2hhbm5lbF9sYXlvdXQoZnJhbWUpKSB7Ci0gICAgICAgICAgICBhdl9icHJpbnRfY2xlYXIoJnBidWYpOwotICAgICAgICAgICAgYXZfYnByaW50X2NoYW5uZWxfbGF5b3V0KCZwYnVmLCBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2dldF9jaGFubmVsX2xheW91dChmcmFtZSkpOwotICAgICAgICAgICAgcHJpbnRfc3RyICAgICgiY2hhbm5lbF9sYXlvdXQiLCBwYnVmLnN0cik7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgiY2hhbm5lbF9sYXlvdXQiLCAidW5rbm93biIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGRvX3Nob3dfZnJhbWVfdGFncykKLSAgICAgICAgc2hvd190YWdzKHcsIGF2X2ZyYW1lX2dldF9tZXRhZGF0YShmcmFtZSksIFNFQ1RJT05fSURfRlJBTUVfVEFHUyk7Ci0gICAgaWYgKGZyYW1lLT5uYl9zaWRlX2RhdGEpIHsKLSAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfRlJBTUVfU0lERV9EQVRBX0xJU1QpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX3NpZGVfZGF0YTsgaSsrKSB7Ci0gICAgICAgICAgICBBVkZyYW1lU2lkZURhdGEgKnNkID0gZnJhbWUtPnNpZGVfZGF0YVtpXTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX0ZSQU1FX1NJREVfREFUQSk7Ci0gICAgICAgICAgICBuYW1lID0gYXZfZnJhbWVfc2lkZV9kYXRhX25hbWUoc2QtPnR5cGUpOwotICAgICAgICAgICAgcHJpbnRfc3RyKCJzaWRlX2RhdGFfdHlwZSIsIG5hbWUgPyBuYW1lIDogInVua25vd24iKTsKLSAgICAgICAgICAgIHByaW50X2ludCgic2lkZV9kYXRhX3NpemUiLCBzZC0+c2l6ZSk7Ci0gICAgICAgICAgICBpZiAoc2QtPnR5cGUgPT0gQVZfRlJBTUVfREFUQV9ESVNQTEFZTUFUUklYICYmIHNkLT5zaXplID49IDkqNCkgewotICAgICAgICAgICAgICAgIHdyaXRlcl9wcmludF9pbnRlZ2Vycyh3LCAiZGlzcGxheW1hdHJpeCIsIHNkLT5kYXRhLCA5LCAiICUxMWQiLCAzLCA0LCAxKTsKLSAgICAgICAgICAgICAgICBwcmludF9pbnQoInJvdGF0aW9uIiwgYXZfZGlzcGxheV9yb3RhdGlvbl9nZXQoKGludDMyX3QgKilzZC0+ZGF0YSkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZC0+dHlwZSA9PSBBVl9GUkFNRV9EQVRBX0dPUF9USU1FQ09ERSAmJiBzZC0+c2l6ZSA+PSA4KSB7Ci0gICAgICAgICAgICAgICAgY2hhciB0Y2J1ZltBVl9USU1FQ09ERV9TVFJfU0laRV07Ci0gICAgICAgICAgICAgICAgYXZfdGltZWNvZGVfbWFrZV9tcGVnX3RjX3N0cmluZyh0Y2J1ZiwgKihpbnQ2NF90ICopKHNkLT5kYXRhKSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfc3RyKCJ0aW1lY29kZSIsIHRjYnVmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Ci0gICAgfQotCi0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOwotCi0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZwYnVmLCBOVUxMKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHByb2Nlc3NfZnJhbWUoV3JpdGVyQ29udGV4dCAqdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBBVlBhY2tldCAqcGt0KQotewotICAgIEFWQ29kZWNDb250ZXh0ICpkZWNfY3R4ID0gZm10X2N0eC0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjOwotICAgIEFWU3VidGl0bGUgc3ViOwotICAgIGludCByZXQgPSAwLCBnb3RfZnJhbWUgPSAwOwotCi0gICAgaWYgKGRlY19jdHgtPmNvZGVjKSB7Ci0gICAgICAgIHN3aXRjaCAoZGVjX2N0eC0+Y29kZWNfdHlwZSkgewotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihkZWNfY3R4LCBmcmFtZSwgJmdvdF9mcmFtZSwgcGt0KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KGRlY19jdHgsIGZyYW1lLCAmZ290X2ZyYW1lLCBwa3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6Ci0gICAgICAgICAgICByZXQgPSBhdmNvZGVjX2RlY29kZV9zdWJ0aXRsZTIoZGVjX2N0eCwgJnN1YiwgJmdvdF9mcmFtZSwgcGt0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0ID0gRkZNSU4ocmV0LCBwa3QtPnNpemUpOyAvKiBndWFyZCBhZ2FpbnN0IGJvZ3VzIHJldHVybiB2YWx1ZXMgKi8KLSAgICBwa3QtPmRhdGEgKz0gcmV0OwotICAgIHBrdC0+c2l6ZSAtPSByZXQ7Ci0gICAgaWYgKGdvdF9mcmFtZSkgewotICAgICAgICBpbnQgaXNfc3ViID0gKGRlY19jdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKTsKLSAgICAgICAgbmJfc3RyZWFtc19mcmFtZXNbcGt0LT5zdHJlYW1faW5kZXhdKys7Ci0gICAgICAgIGlmIChkb19zaG93X2ZyYW1lcykKLSAgICAgICAgICAgIGlmIChpc19zdWIpCi0gICAgICAgICAgICAgICAgc2hvd19zdWJ0aXRsZSh3LCAmc3ViLCBmbXRfY3R4LT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XSwgZm10X2N0eCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2hvd19mcmFtZSh3LCBmcmFtZSwgZm10X2N0eC0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0sIGZtdF9jdHgpOwotICAgICAgICBpZiAoaXNfc3ViKQotICAgICAgICAgICAgYXZzdWJ0aXRsZV9mcmVlKCZzdWIpOwotICAgIH0KLSAgICByZXR1cm4gZ290X2ZyYW1lOwotfQotCi1zdGF0aWMgdm9pZCBsb2dfcmVhZF9pbnRlcnZhbChjb25zdCBSZWFkSW50ZXJ2YWwgKmludGVydmFsLCB2b2lkICpsb2dfY3R4LCBpbnQgbG9nX2xldmVsKQotewotICAgIGF2X2xvZyhsb2dfY3R4LCBsb2dfbGV2ZWwsICJpZDolZCIsIGludGVydmFsLT5pZCk7Ci0KLSAgICBpZiAoaW50ZXJ2YWwtPmhhc19zdGFydCkgewotICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiIHN0YXJ0OiVzJXMiLCBpbnRlcnZhbC0+c3RhcnRfaXNfb2Zmc2V0ID8gIisiIDogIiIsCi0gICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGludGVydmFsLT5zdGFydCwgJkFWX1RJTUVfQkFTRV9RKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiBzdGFydDpOL0EiKTsKLSAgICB9Ci0KLSAgICBpZiAoaW50ZXJ2YWwtPmhhc19lbmQpIHsKLSAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiBlbmQ6JXMiLCBpbnRlcnZhbC0+ZW5kX2lzX29mZnNldCA/ICIrIiA6ICIiKTsKLSAgICAgICAgaWYgKGludGVydmFsLT5kdXJhdGlvbl9mcmFtZXMpCi0gICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiIyUiUFJJZDY0LCBpbnRlcnZhbC0+ZW5kKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiVzIiwgYXZfdHMydGltZXN0cihpbnRlcnZhbC0+ZW5kLCAmQVZfVElNRV9CQVNFX1EpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiIGVuZDpOL0EiKTsKLSAgICB9Ci0KLSAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiXG4iKTsKLX0KLQotc3RhdGljIGludCByZWFkX2ludGVydmFsX3BhY2tldHMoV3JpdGVyQ29udGV4dCAqdywgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVhZEludGVydmFsICppbnRlcnZhbCwgaW50NjRfdCAqY3VyX3RzKQotewotICAgIEFWUGFja2V0IHBrdCwgcGt0MTsKLSAgICBBVkZyYW1lICpmcmFtZSA9IE5VTEw7Ci0gICAgaW50IHJldCA9IDAsIGkgPSAwLCBmcmFtZV9jb3VudCA9IDA7Ci0gICAgaW50NjRfdCBzdGFydCA9IC1JTlQ2NF9NQVgsIGVuZCA9IGludGVydmFsLT5lbmQ7Ci0gICAgaW50IGhhc19zdGFydCA9IDAsIGhhc19lbmQgPSBpbnRlcnZhbC0+aGFzX2VuZCAmJiAhaW50ZXJ2YWwtPmVuZF9pc19vZmZzZXQ7Ci0KLSAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKLQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIlByb2Nlc3NpbmcgcmVhZCBpbnRlcnZhbCAiKTsKLSAgICBsb2dfcmVhZF9pbnRlcnZhbChpbnRlcnZhbCwgTlVMTCwgQVZfTE9HX1ZFUkJPU0UpOwotCi0gICAgaWYgKGludGVydmFsLT5oYXNfc3RhcnQpIHsKLSAgICAgICAgaW50NjRfdCB0YXJnZXQ7Ci0gICAgICAgIGlmIChpbnRlcnZhbC0+c3RhcnRfaXNfb2Zmc2V0KSB7Ci0gICAgICAgICAgICBpZiAoKmN1cl90cyA9PSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2VlayB0byByZWxhdGl2ZSBwb3NpdGlvbiBzaW5jZSBjdXJyZW50ICIKLSAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBpcyBub3QgZGVmaW5lZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFyZ2V0ID0gKmN1cl90cyArIGludGVydmFsLT5zdGFydDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRhcmdldCA9IGludGVydmFsLT5zdGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIlNlZWtpbmcgdG8gcmVhZCBpbnRlcnZhbCBzdGFydCBwb2ludCAlc1xuIiwKLSAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIodGFyZ2V0LCAmQVZfVElNRV9CQVNFX1EpKTsKLSAgICAgICAgaWYgKChyZXQgPSBhdmZvcm1hdF9zZWVrX2ZpbGUoZm10X2N0eCwgLTEsIC1JTlQ2NF9NQVgsIHRhcmdldCwgSU5UNjRfTUFYLCAwKSkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHNlZWsgdG8gcG9zaXRpb24gJSJQUklkNjQiOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC0+c3RhcnQsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIWZyYW1lKSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIHdoaWxlICghYXZfcmVhZF9mcmFtZShmbXRfY3R4LCAmcGt0KSkgewotICAgICAgICBpZiAoZm10X2N0eC0+bmJfc3RyZWFtcyA+IG5iX3N0cmVhbXMpIHsKLSAgICAgICAgICAgIFJFQUxMT0NaX0FSUkFZX1NUUkVBTShuYl9zdHJlYW1zX2ZyYW1lcywgIG5iX3N0cmVhbXMsIGZtdF9jdHgtPm5iX3N0cmVhbXMpOwotICAgICAgICAgICAgUkVBTExPQ1pfQVJSQVlfU1RSRUFNKG5iX3N0cmVhbXNfcGFja2V0cywgbmJfc3RyZWFtcywgZm10X2N0eC0+bmJfc3RyZWFtcyk7Ci0gICAgICAgICAgICBSRUFMTE9DWl9BUlJBWV9TVFJFQU0oc2VsZWN0ZWRfc3RyZWFtcywgICBuYl9zdHJlYW1zLCBmbXRfY3R4LT5uYl9zdHJlYW1zKTsKLSAgICAgICAgICAgIG5iX3N0cmVhbXMgPSBmbXRfY3R4LT5uYl9zdHJlYW1zOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RlZF9zdHJlYW1zW3BrdC5zdHJlYW1faW5kZXhdKSB7Ci0gICAgICAgICAgICBBVlJhdGlvbmFsIHRiID0gZm10X2N0eC0+c3RyZWFtc1twa3Quc3RyZWFtX2luZGV4XS0+dGltZV9iYXNlOwotCi0gICAgICAgICAgICBpZiAocGt0LnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgICAgICAqY3VyX3RzID0gYXZfcmVzY2FsZV9xKHBrdC5wdHMsIHRiLCBBVl9USU1FX0JBU0VfUSk7Ci0KLSAgICAgICAgICAgIGlmICghaGFzX3N0YXJ0ICYmICpjdXJfdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICBzdGFydCA9ICpjdXJfdHM7Ci0gICAgICAgICAgICAgICAgaGFzX3N0YXJ0ID0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGhhc19zdGFydCAmJiAhaGFzX2VuZCAmJiBpbnRlcnZhbC0+ZW5kX2lzX29mZnNldCkgewotICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgaW50ZXJ2YWwtPmVuZDsKLSAgICAgICAgICAgICAgICBoYXNfZW5kID0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGludGVydmFsLT5lbmRfaXNfb2Zmc2V0ICYmIGludGVydmFsLT5kdXJhdGlvbl9mcmFtZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJhbWVfY291bnQgPj0gaW50ZXJ2YWwtPmVuZCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGhhc19lbmQgJiYgKmN1cl90cyAhPSBBVl9OT1BUU19WQUxVRSAmJiAqY3VyX3RzID49IGVuZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmcmFtZV9jb3VudCsrOwotICAgICAgICAgICAgaWYgKGRvX3JlYWRfcGFja2V0cykgewotICAgICAgICAgICAgICAgIGlmIChkb19zaG93X3BhY2tldHMpCi0gICAgICAgICAgICAgICAgICAgIHNob3dfcGFja2V0KHcsIGZtdF9jdHgsICZwa3QsIGkrKyk7Ci0gICAgICAgICAgICAgICAgbmJfc3RyZWFtc19wYWNrZXRzW3BrdC5zdHJlYW1faW5kZXhdKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZG9fcmVhZF9mcmFtZXMpIHsKLSAgICAgICAgICAgICAgICBwa3QxID0gcGt0OwotICAgICAgICAgICAgICAgIHdoaWxlIChwa3QxLnNpemUgJiYgcHJvY2Vzc19mcmFtZSh3LCBmbXRfY3R4LCBmcmFtZSwgJnBrdDEpID4gMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwotICAgIH0KLSAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKLSAgICBwa3QuZGF0YSA9IE5VTEw7Ci0gICAgcGt0LnNpemUgPSAwOwotICAgIC8vRmx1c2ggcmVtYWluaW5nIGZyYW1lcyB0aGF0IGFyZSBjYWNoZWQgaW4gdGhlIGRlY29kZXIKLSAgICBmb3IgKGkgPSAwOyBpIDwgZm10X2N0eC0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIHBrdC5zdHJlYW1faW5kZXggPSBpOwotICAgICAgICBpZiAoZG9fcmVhZF9mcmFtZXMpCi0gICAgICAgICAgICB3aGlsZSAocHJvY2Vzc19mcmFtZSh3LCBmbXRfY3R4LCBmcmFtZSwgJnBrdCkgPiAwKTsKLSAgICB9Ci0KLWVuZDoKLSAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCByZWFkIHBhY2tldHMgaW4gaW50ZXJ2YWwgIik7Ci0gICAgICAgIGxvZ19yZWFkX2ludGVydmFsKGludGVydmFsLCBOVUxMLCBBVl9MT0dfRVJST1IpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHJlYWRfcGFja2V0cyhXcml0ZXJDb250ZXh0ICp3LCBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgpCi17Ci0gICAgaW50IGksIHJldCA9IDA7Ci0gICAgaW50NjRfdCBjdXJfdHMgPSBmbXRfY3R4LT5zdGFydF90aW1lOwotCi0gICAgaWYgKHJlYWRfaW50ZXJ2YWxzX25iID09IDApIHsKLSAgICAgICAgUmVhZEludGVydmFsIGludGVydmFsID0gKFJlYWRJbnRlcnZhbCkgeyAuaGFzX3N0YXJ0ID0gMCwgLmhhc19lbmQgPSAwIH07Ci0gICAgICAgIHJldCA9IHJlYWRfaW50ZXJ2YWxfcGFja2V0cyh3LCBmbXRfY3R4LCAmaW50ZXJ2YWwsICZjdXJfdHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCByZWFkX2ludGVydmFsc19uYjsgaSsrKSB7Ci0gICAgICAgICAgICByZXQgPSByZWFkX2ludGVydmFsX3BhY2tldHModywgZm10X2N0eCwgJnJlYWRfaW50ZXJ2YWxzW2ldLCAmY3VyX3RzKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzaG93X3N0cmVhbShXcml0ZXJDb250ZXh0ICp3LCBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgsIGludCBzdHJlYW1faWR4LCBpbnQgaW5fcHJvZ3JhbSkKLXsKLSAgICBBVlN0cmVhbSAqc3RyZWFtID0gZm10X2N0eC0+c3RyZWFtc1tzdHJlYW1faWR4XTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZGVjX2N0eDsKLSAgICBjb25zdCBBVkNvZGVjICpkZWM7Ci0gICAgY2hhciB2YWxfc3RyWzEyOF07Ci0gICAgY29uc3QgY2hhciAqczsKLSAgICBBVlJhdGlvbmFsIHNhciwgZGFyOwotICAgIEFWQlByaW50IHBidWY7Ci0gICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmNkOwotICAgIGludCByZXQgPSAwOwotCi0gICAgYXZfYnByaW50X2luaXQoJnBidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgaW5fcHJvZ3JhbSA/IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU0gOiBTRUNUSU9OX0lEX1NUUkVBTSk7Ci0KLSAgICBwcmludF9pbnQoImluZGV4Iiwgc3RyZWFtLT5pbmRleCk7Ci0KLSAgICBpZiAoKGRlY19jdHggPSBzdHJlYW0tPmNvZGVjKSkgewotICAgICAgICBjb25zdCBjaGFyICpwcm9maWxlID0gTlVMTDsKLSAgICAgICAgZGVjID0gZGVjX2N0eC0+Y29kZWM7Ci0gICAgICAgIGlmIChkZWMpIHsKLSAgICAgICAgICAgIHByaW50X3N0cigiY29kZWNfbmFtZSIsIGRlYy0+bmFtZSk7Ci0gICAgICAgICAgICBpZiAoIWRvX2JpdGV4YWN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlYy0+bG9uZ19uYW1lKSBwcmludF9zdHIgICAgKCJjb2RlY19sb25nX25hbWUiLCBkZWMtPmxvbmdfbmFtZSk7Ci0gICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJjb2RlY19sb25nX25hbWUiLCAidW5rbm93biIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKChjZCA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoc3RyZWFtLT5jb2RlYy0+Y29kZWNfaWQpKSkgewotICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgiY29kZWNfbmFtZSIsIGNkLT5uYW1lKTsKLSAgICAgICAgICAgIGlmICghZG9fYml0ZXhhY3QpIHsKLSAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJjb2RlY19sb25nX25hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2QtPmxvbmdfbmFtZSA/IGNkLT5sb25nX25hbWUgOiAidW5rbm93biIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgiY29kZWNfbmFtZSIsICJ1bmtub3duIik7Ci0gICAgICAgICAgICBpZiAoIWRvX2JpdGV4YWN0KSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgiY29kZWNfbG9uZ19uYW1lIiwgInVua25vd24iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghZG9fYml0ZXhhY3QgJiYgZGVjICYmIChwcm9maWxlID0gYXZfZ2V0X3Byb2ZpbGVfbmFtZShkZWMsIGRlY19jdHgtPnByb2ZpbGUpKSkKLSAgICAgICAgICAgIHByaW50X3N0cigicHJvZmlsZSIsIHByb2ZpbGUpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmIChkZWNfY3R4LT5wcm9maWxlICE9IEZGX1BST0ZJTEVfVU5LTk9XTikgewotICAgICAgICAgICAgICAgIGNoYXIgcHJvZmlsZV9udW1bMTJdOwotICAgICAgICAgICAgICAgIHNucHJpbnRmKHByb2ZpbGVfbnVtLCBzaXplb2YocHJvZmlsZV9udW0pLCAiJWQiLCBkZWNfY3R4LT5wcm9maWxlKTsKLSAgICAgICAgICAgICAgICBwcmludF9zdHIoInByb2ZpbGUiLCBwcm9maWxlX251bSk7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJwcm9maWxlIiwgInVua25vd24iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHMgPSBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoZGVjX2N0eC0+Y29kZWNfdHlwZSk7Ci0gICAgICAgIGlmIChzKSBwcmludF9zdHIgICAgKCJjb2RlY190eXBlIiwgcyk7Ci0gICAgICAgIGVsc2UgICBwcmludF9zdHJfb3B0KCJjb2RlY190eXBlIiwgInVua25vd24iKTsKLSAgICAgICAgcHJpbnRfcSgiY29kZWNfdGltZV9iYXNlIiwgZGVjX2N0eC0+dGltZV9iYXNlLCAnLycpOwotCi0gICAgICAgIC8qIHByaW50IEFWSS9Gb3VyQ0MgdGFnICovCi0gICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKHZhbF9zdHIsIHNpemVvZih2YWxfc3RyKSwgZGVjX2N0eC0+Y29kZWNfdGFnKTsKLSAgICAgICAgcHJpbnRfc3RyKCJjb2RlY190YWdfc3RyaW5nIiwgICAgdmFsX3N0cik7Ci0gICAgICAgIHByaW50X2ZtdCgiY29kZWNfdGFnIiwgIjB4JTA0eCIsIGRlY19jdHgtPmNvZGVjX3RhZyk7Ci0KLSAgICAgICAgc3dpdGNoIChkZWNfY3R4LT5jb2RlY190eXBlKSB7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgcHJpbnRfaW50KCJ3aWR0aCIsICAgICAgICBkZWNfY3R4LT53aWR0aCk7Ci0gICAgICAgICAgICBwcmludF9pbnQoImhlaWdodCIsICAgICAgIGRlY19jdHgtPmhlaWdodCk7Ci0gICAgICAgICAgICBwcmludF9pbnQoImNvZGVkX3dpZHRoIiwgIGRlY19jdHgtPmNvZGVkX3dpZHRoKTsKLSAgICAgICAgICAgIHByaW50X2ludCgiY29kZWRfaGVpZ2h0IiwgZGVjX2N0eC0+Y29kZWRfaGVpZ2h0KTsKLSAgICAgICAgICAgIHByaW50X2ludCgiaGFzX2JfZnJhbWVzIiwgZGVjX2N0eC0+aGFzX2JfZnJhbWVzKTsKLSAgICAgICAgICAgIHNhciA9IGF2X2d1ZXNzX3NhbXBsZV9hc3BlY3RfcmF0aW8oZm10X2N0eCwgc3RyZWFtLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChzYXIuZGVuKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRfcSgic2FtcGxlX2FzcGVjdF9yYXRpbyIsIHNhciwgJzonKTsKLSAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJmRhci5udW0sICZkYXIuZGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNfY3R4LT53aWR0aCAgKiBzYXIubnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNfY3R4LT5oZWlnaHQgKiBzYXIuZGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0KjEwMjQpOwotICAgICAgICAgICAgICAgIHByaW50X3EoImRpc3BsYXlfYXNwZWN0X3JhdGlvIiwgZGFyLCAnOicpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJzYW1wbGVfYXNwZWN0X3JhdGlvIiwgIk4vQSIpOwotICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImRpc3BsYXlfYXNwZWN0X3JhdGlvIiwgIk4vQSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcyA9IGF2X2dldF9waXhfZm10X25hbWUoZGVjX2N0eC0+cGl4X2ZtdCk7Ci0gICAgICAgICAgICBpZiAocykgcHJpbnRfc3RyICAgICgicGl4X2ZtdCIsIHMpOwotICAgICAgICAgICAgZWxzZSAgIHByaW50X3N0cl9vcHQoInBpeF9mbXQiLCAidW5rbm93biIpOwotICAgICAgICAgICAgcHJpbnRfaW50KCJsZXZlbCIsICAgZGVjX2N0eC0+bGV2ZWwpOwotICAgICAgICAgICAgaWYgKGRlY19jdHgtPmNvbG9yX3JhbmdlICE9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgIHByaW50X3N0ciAgICAoImNvbG9yX3JhbmdlIiwgYXZfY29sb3JfcmFuZ2VfbmFtZShkZWNfY3R4LT5jb2xvcl9yYW5nZSkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImNvbG9yX3JhbmdlIiwgIk4vQSIpOwotICAgICAgICAgICAgcyA9IGF2X2dldF9jb2xvcnNwYWNlX25hbWUoZGVjX2N0eC0+Y29sb3JzcGFjZSk7Ci0gICAgICAgICAgICBpZiAocykgcHJpbnRfc3RyICAgICgiY29sb3Jfc3BhY2UiLCBzKTsKLSAgICAgICAgICAgIGVsc2UgICBwcmludF9zdHJfb3B0KCJjb2xvcl9zcGFjZSIsICJ1bmtub3duIik7Ci0KLSAgICAgICAgICAgIGlmIChkZWNfY3R4LT5jb2xvcl90cmMgIT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgIHByaW50X3N0cigiY29sb3JfdHJhbnNmZXIiLCBhdl9jb2xvcl90cmFuc2Zlcl9uYW1lKGRlY19jdHgtPmNvbG9yX3RyYykpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImNvbG9yX3RyYW5zZmVyIiwgYXZfY29sb3JfdHJhbnNmZXJfbmFtZShkZWNfY3R4LT5jb2xvcl90cmMpKTsKLQotICAgICAgICAgICAgaWYgKGRlY19jdHgtPmNvbG9yX3ByaW1hcmllcyAhPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQpCi0gICAgICAgICAgICAgICAgcHJpbnRfc3RyKCJjb2xvcl9wcmltYXJpZXMiLCBhdl9jb2xvcl9wcmltYXJpZXNfbmFtZShkZWNfY3R4LT5jb2xvcl9wcmltYXJpZXMpKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJjb2xvcl9wcmltYXJpZXMiLCBhdl9jb2xvcl9wcmltYXJpZXNfbmFtZShkZWNfY3R4LT5jb2xvcl9wcmltYXJpZXMpKTsKLQotICAgICAgICAgICAgaWYgKGRlY19jdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gIT0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEKQotICAgICAgICAgICAgICAgIHByaW50X3N0cigiY2hyb21hX2xvY2F0aW9uIiwgYXZfY2hyb21hX2xvY2F0aW9uX25hbWUoZGVjX2N0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbikpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImNocm9tYV9sb2NhdGlvbiIsIGF2X2Nocm9tYV9sb2NhdGlvbl9uYW1lKGRlY19jdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24pKTsKLQotI2lmIEZGX0FQSV9QUklWQVRFX09QVAotICAgICAgICAgICAgaWYgKGRlY19jdHgtPnRpbWVjb2RlX2ZyYW1lX3N0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICBjaGFyIHRjYnVmW0FWX1RJTUVDT0RFX1NUUl9TSVpFXTsKLSAgICAgICAgICAgICAgICBhdl90aW1lY29kZV9tYWtlX21wZWdfdGNfc3RyaW5nKHRjYnVmLCBkZWNfY3R4LT50aW1lY29kZV9mcmFtZV9zdGFydCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfc3RyKCJ0aW1lY29kZSIsIHRjYnVmKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgidGltZWNvZGUiLCAiTi9BIik7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIHByaW50X2ludCgicmVmcyIsIGRlY19jdHgtPnJlZnMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICBzID0gYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShkZWNfY3R4LT5zYW1wbGVfZm10KTsKLSAgICAgICAgICAgIGlmIChzKSBwcmludF9zdHIgICAgKCJzYW1wbGVfZm10Iiwgcyk7Ci0gICAgICAgICAgICBlbHNlICAgcHJpbnRfc3RyX29wdCgic2FtcGxlX2ZtdCIsICJ1bmtub3duIik7Ci0gICAgICAgICAgICBwcmludF92YWwoInNhbXBsZV9yYXRlIiwgICAgIGRlY19jdHgtPnNhbXBsZV9yYXRlLCB1bml0X2hlcnR6X3N0cik7Ci0gICAgICAgICAgICBwcmludF9pbnQoImNoYW5uZWxzIiwgICAgICAgIGRlY19jdHgtPmNoYW5uZWxzKTsKLQotICAgICAgICAgICAgaWYgKGRlY19jdHgtPmNoYW5uZWxfbGF5b3V0KSB7Ci0gICAgICAgICAgICAgICAgYXZfYnByaW50X2NsZWFyKCZwYnVmKTsKLSAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2hhbm5lbF9sYXlvdXQoJnBidWYsIGRlY19jdHgtPmNoYW5uZWxzLCBkZWNfY3R4LT5jaGFubmVsX2xheW91dCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfc3RyICAgICgiY2hhbm5lbF9sYXlvdXQiLCBwYnVmLnN0cik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImNoYW5uZWxfbGF5b3V0IiwgInVua25vd24iKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpbnRfaW50KCJiaXRzX3Blcl9zYW1wbGUiLCBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGRlY19jdHgtPmNvZGVjX2lkKSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKLSAgICAgICAgICAgIGlmIChkZWNfY3R4LT53aWR0aCkKLSAgICAgICAgICAgICAgICBwcmludF9pbnQoIndpZHRoIiwgICAgICAgZGVjX2N0eC0+d2lkdGgpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoIndpZHRoIiwgICAiTi9BIik7Ci0gICAgICAgICAgICBpZiAoZGVjX2N0eC0+aGVpZ2h0KQotICAgICAgICAgICAgICAgIHByaW50X2ludCgiaGVpZ2h0IiwgICAgICBkZWNfY3R4LT5oZWlnaHQpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImhlaWdodCIsICAiTi9BIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50X3N0cl9vcHQoImNvZGVjX3R5cGUiLCAidW5rbm93biIpOwotICAgIH0KLSAgICBpZiAoZGVjX2N0eC0+Y29kZWMgJiYgZGVjX2N0eC0+Y29kZWMtPnByaXZfY2xhc3MgJiYgc2hvd19wcml2YXRlX2RhdGEpIHsKLSAgICAgICAgY29uc3QgQVZPcHRpb24gKm9wdCA9IE5VTEw7Ci0gICAgICAgIHdoaWxlIChvcHQgPSBhdl9vcHRfbmV4dChkZWNfY3R4LT5wcml2X2RhdGEsb3B0KSkgewotICAgICAgICAgICAgdWludDhfdCAqc3RyOwotICAgICAgICAgICAgaWYgKG9wdC0+ZmxhZ3MpIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKGF2X29wdF9nZXQoZGVjX2N0eC0+cHJpdl9kYXRhLCBvcHQtPm5hbWUsIDAsICZzdHIpID49IDApIHsKLSAgICAgICAgICAgICAgICBwcmludF9zdHIob3B0LT5uYW1lLCBzdHIpOwotICAgICAgICAgICAgICAgIGF2X2ZyZWUoc3RyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmbXRfY3R4LT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX1NIT1dfSURTKSBwcmludF9mbXQgICAgKCJpZCIsICIweCV4Iiwgc3RyZWFtLT5pZCk7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImlkIiwgIk4vQSIpOwotICAgIHByaW50X3EoInJfZnJhbWVfcmF0ZSIsICAgc3RyZWFtLT5yX2ZyYW1lX3JhdGUsICAgJy8nKTsKLSAgICBwcmludF9xKCJhdmdfZnJhbWVfcmF0ZSIsIHN0cmVhbS0+YXZnX2ZyYW1lX3JhdGUsICcvJyk7Ci0gICAgcHJpbnRfcSgidGltZV9iYXNlIiwgICAgICBzdHJlYW0tPnRpbWVfYmFzZSwgICAgICAnLycpOwotICAgIHByaW50X3RzICAoInN0YXJ0X3B0cyIsICAgc3RyZWFtLT5zdGFydF90aW1lKTsKLSAgICBwcmludF90aW1lKCJzdGFydF90aW1lIiwgIHN0cmVhbS0+c3RhcnRfdGltZSwgJnN0cmVhbS0+dGltZV9iYXNlKTsKLSAgICBwcmludF90cyAgKCJkdXJhdGlvbl90cyIsIHN0cmVhbS0+ZHVyYXRpb24pOwotICAgIHByaW50X3RpbWUoImR1cmF0aW9uIiwgICAgc3RyZWFtLT5kdXJhdGlvbiwgJnN0cmVhbS0+dGltZV9iYXNlKTsKLSAgICBpZiAoZGVjX2N0eC0+Yml0X3JhdGUgPiAwKSBwcmludF92YWwgICAgKCJiaXRfcmF0ZSIsIGRlY19jdHgtPmJpdF9yYXRlLCB1bml0X2JpdF9wZXJfc2Vjb25kX3N0cik7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgiYml0X3JhdGUiLCAiTi9BIik7Ci0gICAgaWYgKGRlY19jdHgtPnJjX21heF9yYXRlID4gMCkgcHJpbnRfdmFsICgibWF4X2JpdF9yYXRlIiwgZGVjX2N0eC0+cmNfbWF4X3JhdGUsIHVuaXRfYml0X3Blcl9zZWNvbmRfc3RyKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJtYXhfYml0X3JhdGUiLCAiTi9BIik7Ci0gICAgaWYgKGRlY19jdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPiAwKSBwcmludF9mbXQoImJpdHNfcGVyX3Jhd19zYW1wbGUiLCAiJWQiLCBkZWNfY3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJiaXRzX3Blcl9yYXdfc2FtcGxlIiwgIk4vQSIpOwotICAgIGlmIChzdHJlYW0tPm5iX2ZyYW1lcykgcHJpbnRfZm10ICAgICgibmJfZnJhbWVzIiwgIiUiUFJJZDY0LCBzdHJlYW0tPm5iX2ZyYW1lcyk7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJuYl9mcmFtZXMiLCAiTi9BIik7Ci0gICAgaWYgKG5iX3N0cmVhbXNfZnJhbWVzW3N0cmVhbV9pZHhdKSAgcHJpbnRfZm10ICAgICgibmJfcmVhZF9mcmFtZXMiLCAiJSJQUkl1NjQsIG5iX3N0cmVhbXNfZnJhbWVzW3N0cmVhbV9pZHhdKTsKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJuYl9yZWFkX2ZyYW1lcyIsICJOL0EiKTsKLSAgICBpZiAobmJfc3RyZWFtc19wYWNrZXRzW3N0cmVhbV9pZHhdKSBwcmludF9mbXQgICAgKCJuYl9yZWFkX3BhY2tldHMiLCAiJSJQUkl1NjQsIG5iX3N0cmVhbXNfcGFja2V0c1tzdHJlYW1faWR4XSk7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgibmJfcmVhZF9wYWNrZXRzIiwgIk4vQSIpOwotICAgIGlmIChkb19zaG93X2RhdGEpCi0gICAgICAgIHdyaXRlcl9wcmludF9kYXRhKHcsICJleHRyYWRhdGEiLCBkZWNfY3R4LT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNfY3R4LT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgd3JpdGVyX3ByaW50X2RhdGFfaGFzaCh3LCAiZXh0cmFkYXRhX2hhc2giLCBkZWNfY3R4LT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNfY3R4LT5leHRyYWRhdGFfc2l6ZSk7Ci0KLSAgICAvKiBQcmludCBkaXNwb3NpdGlvbiBpbmZvcm1hdGlvbiAqLwotI2RlZmluZSBQUklOVF9ESVNQT1NJVElPTihmbGFnbmFtZSwgbmFtZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBwcmludF9pbnQobmFtZSwgISEoc3RyZWFtLT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OXyMjZmxhZ25hbWUpKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLSAgICBpZiAoZG9fc2hvd19zdHJlYW1fZGlzcG9zaXRpb24pIHsKLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgaW5fcHJvZ3JhbSA/IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1fRElTUE9TSVRJT04gOiBTRUNUSU9OX0lEX1NUUkVBTV9ESVNQT1NJVElPTik7Ci0gICAgUFJJTlRfRElTUE9TSVRJT04oREVGQVVMVCwgICAgICAgICAgImRlZmF1bHQiKTsKLSAgICBQUklOVF9ESVNQT1NJVElPTihEVUIsICAgICAgICAgICAgICAiZHViIik7Ci0gICAgUFJJTlRfRElTUE9TSVRJT04oT1JJR0lOQUwsICAgICAgICAgIm9yaWdpbmFsIik7Ci0gICAgUFJJTlRfRElTUE9TSVRJT04oQ09NTUVOVCwgICAgICAgICAgImNvbW1lbnQiKTsKLSAgICBQUklOVF9ESVNQT1NJVElPTihMWVJJQ1MsICAgICAgICAgICAibHlyaWNzIik7Ci0gICAgUFJJTlRfRElTUE9TSVRJT04oS0FSQU9LRSwgICAgICAgICAgImthcmFva2UiKTsKLSAgICBQUklOVF9ESVNQT1NJVElPTihGT1JDRUQsICAgICAgICAgICAiZm9yY2VkIik7Ci0gICAgUFJJTlRfRElTUE9TSVRJT04oSEVBUklOR19JTVBBSVJFRCwgImhlYXJpbmdfaW1wYWlyZWQiKTsKLSAgICBQUklOVF9ESVNQT1NJVElPTihWSVNVQUxfSU1QQUlSRUQsICAidmlzdWFsX2ltcGFpcmVkIik7Ci0gICAgUFJJTlRfRElTUE9TSVRJT04oQ0xFQU5fRUZGRUNUUywgICAgImNsZWFuX2VmZmVjdHMiKTsKLSAgICBQUklOVF9ESVNQT1NJVElPTihBVFRBQ0hFRF9QSUMsICAgICAiYXR0YWNoZWRfcGljIik7Ci0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOwotICAgIH0KLQotICAgIGlmIChkb19zaG93X3N0cmVhbV90YWdzKQotICAgICAgICByZXQgPSBzaG93X3RhZ3Modywgc3RyZWFtLT5tZXRhZGF0YSwgaW5fcHJvZ3JhbSA/IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1fVEFHUyA6IFNFQ1RJT05fSURfU1RSRUFNX1RBR1MpOwotCi0gICAgaWYgKHN0cmVhbS0+bmJfc2lkZV9kYXRhKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9TVFJFQU1fU0lERV9EQVRBX0xJU1QpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyZWFtLT5uYl9zaWRlX2RhdGE7IGkrKykgewotICAgICAgICAgICAgQVZQYWNrZXRTaWRlRGF0YSAqc2QgPSAmc3RyZWFtLT5zaWRlX2RhdGFbaV07Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gYXZfcGFja2V0X3NpZGVfZGF0YV9uYW1lKHNkLT50eXBlKTsKLQotICAgICAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfU1RSRUFNX1NJREVfREFUQSk7Ci0gICAgICAgICAgICBwcmludF9zdHIoInNpZGVfZGF0YV90eXBlIiwgbmFtZSA/IG5hbWUgOiAidW5rbm93biIpOwotICAgICAgICAgICAgcHJpbnRfaW50KCJzaWRlX2RhdGFfc2l6ZSIsIHNkLT5zaXplKTsKLSAgICAgICAgICAgIGlmIChzZC0+dHlwZSA9PSBBVl9QS1RfREFUQV9ESVNQTEFZTUFUUklYICYmIHNkLT5zaXplID49IDkqNCkgewotICAgICAgICAgICAgICAgIHdyaXRlcl9wcmludF9pbnRlZ2Vycyh3LCAiZGlzcGxheW1hdHJpeCIsIHNkLT5kYXRhLCA5LCAiICUxMWQiLCAzLCA0LCAxKTsKLSAgICAgICAgICAgICAgICBwcmludF9pbnQoInJvdGF0aW9uIiwgYXZfZGlzcGxheV9yb3RhdGlvbl9nZXQoKGludDMyX3QgKilzZC0+ZGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLSAgICB9Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZwYnVmLCBOVUxMKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2hvd19zdHJlYW1zKFdyaXRlckNvbnRleHQgKncsIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCkKLXsKLSAgICBpbnQgaSwgcmV0ID0gMDsKLQotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1NUUkVBTVMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBmbXRfY3R4LT5uYl9zdHJlYW1zOyBpKyspCi0gICAgICAgIGlmIChzZWxlY3RlZF9zdHJlYW1zW2ldKSB7Ci0gICAgICAgICAgICByZXQgPSBzaG93X3N0cmVhbSh3LCBmbXRfY3R4LCBpLCAwKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzaG93X3Byb2dyYW0oV3JpdGVyQ29udGV4dCAqdywgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4LCBBVlByb2dyYW0gKnByb2dyYW0pCi17Ci0gICAgaW50IGksIHJldCA9IDA7Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QUk9HUkFNKTsKLSAgICBwcmludF9pbnQoInByb2dyYW1faWQiLCBwcm9ncmFtLT5pZCk7Ci0gICAgcHJpbnRfaW50KCJwcm9ncmFtX251bSIsIHByb2dyYW0tPnByb2dyYW1fbnVtKTsKLSAgICBwcmludF9pbnQoIm5iX3N0cmVhbXMiLCBwcm9ncmFtLT5uYl9zdHJlYW1faW5kZXhlcyk7Ci0gICAgcHJpbnRfaW50KCJwbXRfcGlkIiwgcHJvZ3JhbS0+cG10X3BpZCk7Ci0gICAgcHJpbnRfaW50KCJwY3JfcGlkIiwgcHJvZ3JhbS0+cGNyX3BpZCk7Ci0gICAgcHJpbnRfdHMoInN0YXJ0X3B0cyIsIHByb2dyYW0tPnN0YXJ0X3RpbWUpOwotICAgIHByaW50X3RpbWUoInN0YXJ0X3RpbWUiLCBwcm9ncmFtLT5zdGFydF90aW1lLCAmQVZfVElNRV9CQVNFX1EpOwotICAgIHByaW50X3RzKCJlbmRfcHRzIiwgcHJvZ3JhbS0+ZW5kX3RpbWUpOwotICAgIHByaW50X3RpbWUoImVuZF90aW1lIiwgcHJvZ3JhbS0+ZW5kX3RpbWUsICZBVl9USU1FX0JBU0VfUSk7Ci0gICAgaWYgKGRvX3Nob3dfcHJvZ3JhbV90YWdzKQotICAgICAgICByZXQgPSBzaG93X3RhZ3ModywgcHJvZ3JhbS0+bWV0YWRhdGEsIFNFQ1RJT05fSURfUFJPR1JBTV9UQUdTKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBlbmQ7Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTVMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBwcm9ncmFtLT5uYl9zdHJlYW1faW5kZXhlczsgaSsrKSB7Ci0gICAgICAgIGlmIChzZWxlY3RlZF9zdHJlYW1zW3Byb2dyYW0tPnN0cmVhbV9pbmRleFtpXV0pIHsKLSAgICAgICAgICAgIHJldCA9IHNob3dfc3RyZWFtKHcsIGZtdF9jdHgsIHByb2dyYW0tPnN0cmVhbV9pbmRleFtpXSwgMSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Ci0KLWVuZDoKLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzaG93X3Byb2dyYW1zKFdyaXRlckNvbnRleHQgKncsIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCkKLXsKLSAgICBpbnQgaSwgcmV0ID0gMDsKLQotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1BST0dSQU1TKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZm10X2N0eC0+bmJfcHJvZ3JhbXM7IGkrKykgewotICAgICAgICBBVlByb2dyYW0gKnByb2dyYW0gPSBmbXRfY3R4LT5wcm9ncmFtc1tpXTsKLSAgICAgICAgaWYgKCFwcm9ncmFtKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIHJldCA9IHNob3dfcHJvZ3JhbSh3LCBmbXRfY3R4LCBwcm9ncmFtKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgc2hvd19jaGFwdGVycyhXcml0ZXJDb250ZXh0ICp3LCBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgpCi17Ci0gICAgaW50IGksIHJldCA9IDA7Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9DSEFQVEVSUyk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGZtdF9jdHgtPm5iX2NoYXB0ZXJzOyBpKyspIHsKLSAgICAgICAgQVZDaGFwdGVyICpjaGFwdGVyID0gZm10X2N0eC0+Y2hhcHRlcnNbaV07Ci0KLSAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfQ0hBUFRFUik7Ci0gICAgICAgIHByaW50X2ludCgiaWQiLCBjaGFwdGVyLT5pZCk7Ci0gICAgICAgIHByaW50X3EgICgidGltZV9iYXNlIiwgY2hhcHRlci0+dGltZV9iYXNlLCAnLycpOwotICAgICAgICBwcmludF9pbnQoInN0YXJ0IiwgY2hhcHRlci0+c3RhcnQpOwotICAgICAgICBwcmludF90aW1lKCJzdGFydF90aW1lIiwgY2hhcHRlci0+c3RhcnQsICZjaGFwdGVyLT50aW1lX2Jhc2UpOwotICAgICAgICBwcmludF9pbnQoImVuZCIsIGNoYXB0ZXItPmVuZCk7Ci0gICAgICAgIHByaW50X3RpbWUoImVuZF90aW1lIiwgY2hhcHRlci0+ZW5kLCAmY2hhcHRlci0+dGltZV9iYXNlKTsKLSAgICAgICAgaWYgKGRvX3Nob3dfY2hhcHRlcl90YWdzKQotICAgICAgICAgICAgcmV0ID0gc2hvd190YWdzKHcsIGNoYXB0ZXItPm1ldGFkYXRhLCBTRUNUSU9OX0lEX0NIQVBURVJfVEFHUyk7Ci0gICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLSAgICB9Ci0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBzaG93X2Zvcm1hdChXcml0ZXJDb250ZXh0ICp3LCBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgpCi17Ci0gICAgY2hhciB2YWxfc3RyWzEyOF07Ci0gICAgaW50NjRfdCBzaXplID0gZm10X2N0eC0+cGIgPyBhdmlvX3NpemUoZm10X2N0eC0+cGIpIDogLTE7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9GT1JNQVQpOwotICAgIHByaW50X3N0cl92YWxpZGF0ZSgiZmlsZW5hbWUiLCBmbXRfY3R4LT5maWxlbmFtZSk7Ci0gICAgcHJpbnRfaW50KCJuYl9zdHJlYW1zIiwgICAgICAgZm10X2N0eC0+bmJfc3RyZWFtcyk7Ci0gICAgcHJpbnRfaW50KCJuYl9wcm9ncmFtcyIsICAgICAgZm10X2N0eC0+bmJfcHJvZ3JhbXMpOwotICAgIHByaW50X3N0cigiZm9ybWF0X25hbWUiLCAgICAgIGZtdF9jdHgtPmlmb3JtYXQtPm5hbWUpOwotICAgIGlmICghZG9fYml0ZXhhY3QpIHsKLSAgICAgICAgaWYgKGZtdF9jdHgtPmlmb3JtYXQtPmxvbmdfbmFtZSkgcHJpbnRfc3RyICAgICgiZm9ybWF0X2xvbmdfbmFtZSIsIGZtdF9jdHgtPmlmb3JtYXQtPmxvbmdfbmFtZSk7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImZvcm1hdF9sb25nX25hbWUiLCAidW5rbm93biIpOwotICAgIH0KLSAgICBwcmludF90aW1lKCJzdGFydF90aW1lIiwgICAgICBmbXRfY3R4LT5zdGFydF90aW1lLCAmQVZfVElNRV9CQVNFX1EpOwotICAgIHByaW50X3RpbWUoImR1cmF0aW9uIiwgICAgICAgIGZtdF9jdHgtPmR1cmF0aW9uLCAgICZBVl9USU1FX0JBU0VfUSk7Ci0gICAgaWYgKHNpemUgPj0gMCkgcHJpbnRfdmFsICAgICgic2l6ZSIsIHNpemUsIHVuaXRfYnl0ZV9zdHIpOwotICAgIGVsc2UgICAgICAgICAgIHByaW50X3N0cl9vcHQoInNpemUiLCAiTi9BIik7Ci0gICAgaWYgKGZtdF9jdHgtPmJpdF9yYXRlID4gMCkgcHJpbnRfdmFsICAgICgiYml0X3JhdGUiLCBmbXRfY3R4LT5iaXRfcmF0ZSwgdW5pdF9iaXRfcGVyX3NlY29uZF9zdHIpOwotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImJpdF9yYXRlIiwgIk4vQSIpOwotICAgIHByaW50X2ludCgicHJvYmVfc2NvcmUiLCBhdl9mb3JtYXRfZ2V0X3Byb2JlX3Njb3JlKGZtdF9jdHgpKTsKLSAgICBpZiAoZG9fc2hvd19mb3JtYXRfdGFncykKLSAgICAgICAgcmV0ID0gc2hvd190YWdzKHcsIGZtdF9jdHgtPm1ldGFkYXRhLCBTRUNUSU9OX0lEX0ZPUk1BVF9UQUdTKTsKLQotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzaG93X2Vycm9yKFdyaXRlckNvbnRleHQgKncsIGludCBlcnIpCi17Ci0gICAgY2hhciBlcnJidWZbMTI4XTsKLSAgICBjb25zdCBjaGFyICplcnJidWZfcHRyID0gZXJyYnVmOwotCi0gICAgaWYgKGF2X3N0cmVycm9yKGVyciwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKSkgPCAwKQotICAgICAgICBlcnJidWZfcHRyID0gc3RyZXJyb3IoQVZVTkVSUk9SKGVycikpOwotCi0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfRVJST1IpOwotICAgIHByaW50X2ludCgiY29kZSIsIGVycik7Ci0gICAgcHJpbnRfc3RyKCJzdHJpbmciLCBlcnJidWZfcHRyKTsKLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Ci19Ci0KLXN0YXRpYyBpbnQgb3Blbl9pbnB1dF9maWxlKEFWRm9ybWF0Q29udGV4dCAqKmZtdF9jdHhfcHRyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKLXsKLSAgICBpbnQgZXJyLCBpLCBvcmlnX25iX3N0cmVhbXM7Ci0gICAgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4ID0gTlVMTDsKLSAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdDsKLSAgICBBVkRpY3Rpb25hcnkgKipvcHRzOwotICAgIGludCBzY2FuX2FsbF9wbXRzX3NldCA9IDA7Ci0KLSAgICBpZiAoIWF2X2RpY3RfZ2V0KGZvcm1hdF9vcHRzLCAic2Nhbl9hbGxfcG10cyIsIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSkpIHsKLSAgICAgICAgYXZfZGljdF9zZXQoJmZvcm1hdF9vcHRzLCAic2Nhbl9hbGxfcG10cyIsICIxIiwgQVZfRElDVF9ET05UX09WRVJXUklURSk7Ci0gICAgICAgIHNjYW5fYWxsX3BtdHNfc2V0ID0gMTsKLSAgICB9Ci0gICAgaWYgKChlcnIgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZmbXRfY3R4LCBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZvcm1hdCwgJmZvcm1hdF9vcHRzKSkgPCAwKSB7Ci0gICAgICAgIHByaW50X2Vycm9yKGZpbGVuYW1lLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqZm10X2N0eF9wdHIgPSBmbXRfY3R4OwotICAgIGlmIChzY2FuX2FsbF9wbXRzX3NldCkKLSAgICAgICAgYXZfZGljdF9zZXQoJmZvcm1hdF9vcHRzLCAic2Nhbl9hbGxfcG10cyIsIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSk7Ci0gICAgaWYgKCh0ID0gYXZfZGljdF9nZXQoZm9ybWF0X29wdHMsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3B0aW9uICVzIG5vdCBmb3VuZC5cbiIsIHQtPmtleSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7Ci0gICAgfQotCi0gICAgLyogZmlsbCB0aGUgc3RyZWFtcyBpbiB0aGUgZm9ybWF0IGNvbnRleHQgKi8KLSAgICBvcHRzID0gc2V0dXBfZmluZF9zdHJlYW1faW5mb19vcHRzKGZtdF9jdHgsIGNvZGVjX29wdHMpOwotICAgIG9yaWdfbmJfc3RyZWFtcyA9IGZtdF9jdHgtPm5iX3N0cmVhbXM7Ci0KLSAgICBlcnIgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGZtdF9jdHgsIG9wdHMpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG9yaWdfbmJfc3RyZWFtczsgaSsrKQotICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHNbaV0pOwotICAgIGF2X2ZyZWVwKCZvcHRzKTsKLQotICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgIHByaW50X2Vycm9yKGZpbGVuYW1lLCBlcnIpOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGF2X2R1bXBfZm9ybWF0KGZtdF9jdHgsIDAsIGZpbGVuYW1lLCAwKTsKLQotICAgIC8qIGJpbmQgYSBkZWNvZGVyIHRvIGVhY2ggaW5wdXQgc3RyZWFtICovCi0gICAgZm9yIChpID0gMDsgaSA8IGZtdF9jdHgtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBBVlN0cmVhbSAqc3RyZWFtID0gZm10X2N0eC0+c3RyZWFtc1tpXTsKLSAgICAgICAgQVZDb2RlYyAqY29kZWM7Ci0KLSAgICAgICAgaWYgKHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BST0JFKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBwcm9iZSBjb2RlYyBmb3IgaW5wdXQgc3RyZWFtICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmluZGV4KTsKLSAgICAgICAgfSBlbHNlIGlmICghKGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoc3RyZWFtLT5jb2RlYy0+Y29kZWNfaWQpKSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgY29kZWMgd2l0aCBpZCAlZCBmb3IgaW5wdXQgc3RyZWFtICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCwgc3RyZWFtLT5pbmRleCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBmaWx0ZXJfY29kZWNfb3B0cyhjb2RlY19vcHRzLCBzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdF9jdHgsIHN0cmVhbSwgY29kZWMpOwotICAgICAgICAgICAgaWYgKGF2Y29kZWNfb3BlbjIoc3RyZWFtLT5jb2RlYywgY29kZWMsICZvcHRzKSA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJDb3VsZCBub3Qgb3BlbiBjb2RlYyBmb3IgaW5wdXQgc3RyZWFtICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgodCA9IGF2X2RpY3RfZ2V0KG9wdHMsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJPcHRpb24gJXMgZm9yIGlucHV0IHN0cmVhbSAlZCBub3QgZm91bmRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHQtPmtleSwgc3RyZWFtLT5pbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfT1BUSU9OX05PVF9GT1VORDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgICpmbXRfY3R4X3B0ciA9IGZtdF9jdHg7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlX2lucHV0X2ZpbGUoQVZGb3JtYXRDb250ZXh0ICoqY3R4X3B0cikKLXsKLSAgICBpbnQgaTsKLSAgICBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHggPSAqY3R4X3B0cjsKLQotICAgIC8qIGNsb3NlIGRlY29kZXIgZm9yIGVhY2ggc3RyZWFtICovCi0gICAgZm9yIChpID0gMDsgaSA8IGZtdF9jdHgtPm5iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgaWYgKGZtdF9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FKQotICAgICAgICAgICAgYXZjb2RlY19jbG9zZShmbXRfY3R4LT5zdHJlYW1zW2ldLT5jb2RlYyk7Ci0KLSAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dChjdHhfcHRyKTsKLX0KLQotc3RhdGljIGludCBwcm9iZV9maWxlKFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotewotICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCA9IE5VTEw7Ci0gICAgaW50IHJldCwgaTsKLSAgICBpbnQgc2VjdGlvbl9pZDsKLQotICAgIGRvX3JlYWRfZnJhbWVzID0gZG9fc2hvd19mcmFtZXMgfHwgZG9fY291bnRfZnJhbWVzOwotICAgIGRvX3JlYWRfcGFja2V0cyA9IGRvX3Nob3dfcGFja2V0cyB8fCBkb19jb3VudF9wYWNrZXRzOwotCi0gICAgcmV0ID0gb3Blbl9pbnB1dF9maWxlKCZmbXRfY3R4LCBmaWxlbmFtZSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZW5kOwotCi0jZGVmaW5lIENIRUNLX0VORCBpZiAocmV0IDwgMCkgZ290byBlbmQKLQotICAgIG5iX3N0cmVhbXMgPSBmbXRfY3R4LT5uYl9zdHJlYW1zOwotICAgIFJFQUxMT0NaX0FSUkFZX1NUUkVBTShuYl9zdHJlYW1zX2ZyYW1lcywwLGZtdF9jdHgtPm5iX3N0cmVhbXMpOwotICAgIFJFQUxMT0NaX0FSUkFZX1NUUkVBTShuYl9zdHJlYW1zX3BhY2tldHMsMCxmbXRfY3R4LT5uYl9zdHJlYW1zKTsKLSAgICBSRUFMTE9DWl9BUlJBWV9TVFJFQU0oc2VsZWN0ZWRfc3RyZWFtcywwLGZtdF9jdHgtPm5iX3N0cmVhbXMpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGZtdF9jdHgtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBpZiAoc3RyZWFtX3NwZWNpZmllcikgewotICAgICAgICAgICAgcmV0ID0gYXZmb3JtYXRfbWF0Y2hfc3RyZWFtX3NwZWNpZmllcihmbXRfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXRfY3R4LT5zdHJlYW1zW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fc3BlY2lmaWVyKTsKLSAgICAgICAgICAgIENIRUNLX0VORDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzZWxlY3RlZF9zdHJlYW1zW2ldID0gcmV0OwotICAgICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlbGVjdGVkX3N0cmVhbXNbaV0gPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGRvX3JlYWRfZnJhbWVzIHx8IGRvX3JlYWRfcGFja2V0cykgewotICAgICAgICBpZiAoZG9fc2hvd19mcmFtZXMgJiYgZG9fc2hvd19wYWNrZXRzICYmCi0gICAgICAgICAgICB3Y3R4LT53cml0ZXItPmZsYWdzICYgV1JJVEVSX0ZMQUdfUFVUX1BBQ0tFVFNfQU5EX0ZSQU1FU19JTl9TQU1FX0NIQVBURVIpCi0gICAgICAgICAgICBzZWN0aW9uX2lkID0gU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVM7Ci0gICAgICAgIGVsc2UgaWYgKGRvX3Nob3dfcGFja2V0cyAmJiAhZG9fc2hvd19mcmFtZXMpCi0gICAgICAgICAgICBzZWN0aW9uX2lkID0gU0VDVElPTl9JRF9QQUNLRVRTOwotICAgICAgICBlbHNlIC8vICghZG9fc2hvd19wYWNrZXRzICYmIGRvX3Nob3dfZnJhbWVzKQotICAgICAgICAgICAgc2VjdGlvbl9pZCA9IFNFQ1RJT05fSURfRlJBTUVTOwotICAgICAgICBpZiAoZG9fc2hvd19mcmFtZXMgfHwgZG9fc2hvd19wYWNrZXRzKQotICAgICAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHdjdHgsIHNlY3Rpb25faWQpOwotICAgICAgICByZXQgPSByZWFkX3BhY2tldHMod2N0eCwgZm10X2N0eCk7Ci0gICAgICAgIGlmIChkb19zaG93X2ZyYW1lcyB8fCBkb19zaG93X3BhY2tldHMpCi0gICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIod2N0eCk7Ci0gICAgICAgIENIRUNLX0VORDsKLSAgICB9Ci0KLSAgICBpZiAoZG9fc2hvd19wcm9ncmFtcykgewotICAgICAgICByZXQgPSBzaG93X3Byb2dyYW1zKHdjdHgsIGZtdF9jdHgpOwotICAgICAgICBDSEVDS19FTkQ7Ci0gICAgfQotCi0gICAgaWYgKGRvX3Nob3dfc3RyZWFtcykgewotICAgICAgICByZXQgPSBzaG93X3N0cmVhbXMod2N0eCwgZm10X2N0eCk7Ci0gICAgICAgIENIRUNLX0VORDsKLSAgICB9Ci0gICAgaWYgKGRvX3Nob3dfY2hhcHRlcnMpIHsKLSAgICAgICAgcmV0ID0gc2hvd19jaGFwdGVycyh3Y3R4LCBmbXRfY3R4KTsKLSAgICAgICAgQ0hFQ0tfRU5EOwotICAgIH0KLSAgICBpZiAoZG9fc2hvd19mb3JtYXQpIHsKLSAgICAgICAgcmV0ID0gc2hvd19mb3JtYXQod2N0eCwgZm10X2N0eCk7Ci0gICAgICAgIENIRUNLX0VORDsKLSAgICB9Ci0KLWVuZDoKLSAgICBpZiAoZm10X2N0eCkKLSAgICAgICAgY2xvc2VfaW5wdXRfZmlsZSgmZm10X2N0eCk7Ci0gICAgYXZfZnJlZXAoJm5iX3N0cmVhbXNfZnJhbWVzKTsKLSAgICBhdl9mcmVlcCgmbmJfc3RyZWFtc19wYWNrZXRzKTsKLSAgICBhdl9mcmVlcCgmc2VsZWN0ZWRfc3RyZWFtcyk7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBzaG93X3VzYWdlKHZvaWQpCi17Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiU2ltcGxlIG11bHRpbWVkaWEgc3RyZWFtcyBhbmFseXplclxuIik7Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAidXNhZ2U6ICVzIFtPUFRJT05TXSBbSU5QVVRfRklMRV1cbiIsIHByb2dyYW1fbmFtZSk7Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgZmZwcm9iZV9zaG93X3Byb2dyYW1fdmVyc2lvbihXcml0ZXJDb250ZXh0ICp3KQotewotICAgIEFWQlByaW50IHBidWY7Ci0gICAgYXZfYnByaW50X2luaXQoJnBidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7Ci0KLSAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QUk9HUkFNX1ZFUlNJT04pOwotICAgIHByaW50X3N0cigidmVyc2lvbiIsIEZGTVBFR19WRVJTSU9OKTsKLSAgICBwcmludF9mbXQoImNvcHlyaWdodCIsICJDb3B5cmlnaHQgKGMpICVkLSVkIHRoZSBGRm1wZWcgZGV2ZWxvcGVycyIsCi0gICAgICAgICAgICAgIHByb2dyYW1fYmlydGhfeWVhciwgQ09ORklHX1RISVNfWUVBUik7Ci0gICAgcHJpbnRfc3RyKCJjb21waWxlcl9pZGVudCIsIENDX0lERU5UKTsKLSAgICBwcmludF9zdHIoImNvbmZpZ3VyYXRpb24iLCBGRk1QRUdfQ09ORklHVVJBVElPTik7Ci0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOwotCi0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZwYnVmLCBOVUxMKTsKLX0KLQotI2RlZmluZSBTSE9XX0xJQl9WRVJTSU9OKGxpYm5hbWUsIExJQk5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoQ09ORklHXyMjTElCTkFNRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdW5zaWduZWQgaW50IHZlcnNpb24gPSBsaWJuYW1lIyNfdmVyc2lvbigpOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OKTsgXAotICAgICAgICAgICAgcHJpbnRfc3RyKCJuYW1lIiwgICAgImxpYiIgI2xpYm5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcHJpbnRfaW50KCJtYWpvciIsICAgTElCIyNMSUJOQU1FIyNfVkVSU0lPTl9NQUpPUik7ICAgICAgICAgXAotICAgICAgICAgICAgcHJpbnRfaW50KCJtaW5vciIsICAgTElCIyNMSUJOQU1FIyNfVkVSU0lPTl9NSU5PUik7ICAgICAgICAgXAotICAgICAgICAgICAgcHJpbnRfaW50KCJtaWNybyIsICAgTElCIyNMSUJOQU1FIyNfVkVSU0lPTl9NSUNSTyk7ICAgICAgICAgXAotICAgICAgICAgICAgcHJpbnRfaW50KCJ2ZXJzaW9uIiwgdmVyc2lvbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcHJpbnRfc3RyKCJpZGVudCIsICAgTElCIyNMSUJOQU1FIyNfSURFTlQpOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkIGZmcHJvYmVfc2hvd19saWJyYXJ5X3ZlcnNpb25zKFdyaXRlckNvbnRleHQgKncpCi17Ci0gICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OUyk7Ci0gICAgU0hPV19MSUJfVkVSU0lPTihhdnV0aWwsICAgICBBVlVUSUwpOwotICAgIFNIT1dfTElCX1ZFUlNJT04oYXZjb2RlYywgICAgQVZDT0RFQyk7Ci0gICAgU0hPV19MSUJfVkVSU0lPTihhdmZvcm1hdCwgICBBVkZPUk1BVCk7Ci0gICAgU0hPV19MSUJfVkVSU0lPTihhdmRldmljZSwgICBBVkRFVklDRSk7Ci0gICAgU0hPV19MSUJfVkVSU0lPTihhdmZpbHRlciwgICBBVkZJTFRFUik7Ci0gICAgU0hPV19MSUJfVkVSU0lPTihzd3NjYWxlLCAgICBTV1NDQUxFKTsKLSAgICBTSE9XX0xJQl9WRVJTSU9OKHN3cmVzYW1wbGUsIFNXUkVTQU1QTEUpOwotICAgIFNIT1dfTElCX1ZFUlNJT04ocG9zdHByb2MsICAgUE9TVFBST0MpOwotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLX0KLQotI2RlZmluZSBQUklOVF9QSVhfRk1UX0ZMQUcoZmxhZ25hbWUsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcHJpbnRfaW50KG5hbWUsICEhKHBpeGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHXyMjZmxhZ25hbWUpKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLXN0YXRpYyB2b2lkIGZmcHJvYmVfc2hvd19waXhlbF9mb3JtYXRzKFdyaXRlckNvbnRleHQgKncpCi17Ci0gICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhkZXNjID0gTlVMTDsKLSAgICBpbnQgaSwgbjsKLQotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVFMpOwotICAgIHdoaWxlIChwaXhkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX25leHQocGl4ZGVzYykpIHsKLSAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfUElYRUxfRk9STUFUKTsKLSAgICAgICAgcHJpbnRfc3RyKCJuYW1lIiwgcGl4ZGVzYy0+bmFtZSk7Ci0gICAgICAgIHByaW50X2ludCgibmJfY29tcG9uZW50cyIsIHBpeGRlc2MtPm5iX2NvbXBvbmVudHMpOwotICAgICAgICBpZiAoKHBpeGRlc2MtPm5iX2NvbXBvbmVudHMgPj0gMykgJiYgIShwaXhkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpKSB7Ci0gICAgICAgICAgICBwcmludF9pbnQgICAgKCJsb2cyX2Nocm9tYV93IiwgcGl4ZGVzYy0+bG9nMl9jaHJvbWFfdyk7Ci0gICAgICAgICAgICBwcmludF9pbnQgICAgKCJsb2cyX2Nocm9tYV9oIiwgcGl4ZGVzYy0+bG9nMl9jaHJvbWFfaCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwcmludF9zdHJfb3B0KCJsb2cyX2Nocm9tYV93IiwgIk4vQSIpOwotICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgibG9nMl9jaHJvbWFfaCIsICJOL0EiKTsKLSAgICAgICAgfQotICAgICAgICBuID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKHBpeGRlc2MpOwotICAgICAgICBpZiAobikgcHJpbnRfaW50ICAgICgiYml0c19wZXJfcGl4ZWwiLCBuKTsKLSAgICAgICAgZWxzZSAgIHByaW50X3N0cl9vcHQoImJpdHNfcGVyX3BpeGVsIiwgIk4vQSIpOwotICAgICAgICBpZiAoZG9fc2hvd19waXhlbF9mb3JtYXRfZmxhZ3MpIHsKLSAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVF9GTEFHUyk7Ci0gICAgICAgICAgICBQUklOVF9QSVhfRk1UX0ZMQUcoQkUsICAgICAgICAiYmlnX2VuZGlhbiIpOwotICAgICAgICAgICAgUFJJTlRfUElYX0ZNVF9GTEFHKFBBTCwgICAgICAgInBhbGV0dGUiKTsKLSAgICAgICAgICAgIFBSSU5UX1BJWF9GTVRfRkxBRyhCSVRTVFJFQU0sICJiaXRzdHJlYW0iKTsKLSAgICAgICAgICAgIFBSSU5UX1BJWF9GTVRfRkxBRyhIV0FDQ0VMLCAgICJod2FjY2VsIik7Ci0gICAgICAgICAgICBQUklOVF9QSVhfRk1UX0ZMQUcoUExBTkFSLCAgICAicGxhbmFyIik7Ci0gICAgICAgICAgICBQUklOVF9QSVhfRk1UX0ZMQUcoUkdCLCAgICAgICAicmdiIik7Ci0gICAgICAgICAgICBQUklOVF9QSVhfRk1UX0ZMQUcoUFNFVURPUEFMLCAicHNldWRvcGFsIik7Ci0gICAgICAgICAgICBQUklOVF9QSVhfRk1UX0ZMQUcoQUxQSEEsICAgICAiYWxwaGEiKTsKLSAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZG9fc2hvd19waXhlbF9mb3JtYXRfY29tcG9uZW50cyAmJiAocGl4ZGVzYy0+bmJfY29tcG9uZW50cyA+IDApKSB7Ci0gICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRfQ09NUE9ORU5UUyk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4ZGVzYy0+bmJfY29tcG9uZW50czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0NPTVBPTkVOVCk7Ci0gICAgICAgICAgICAgICAgcHJpbnRfaW50KCJpbmRleCIsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICBwcmludF9pbnQoImJpdF9kZXB0aCIsIHBpeGRlc2MtPmNvbXBbaV0uZGVwdGgpOwotICAgICAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Ci0gICAgfQotICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKLX0KLQotc3RhdGljIGludCBvcHRfZm9ybWF0KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgaWZvcm1hdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KGFyZyk7Ci0gICAgaWYgKCFpZm9ybWF0KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGlucHV0IGZvcm1hdDogJXNcbiIsIGFyZyk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbWFya19zZWN0aW9uX3Nob3dfZW50cmllcyhTZWN0aW9uSUQgc2VjdGlvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaG93X2FsbF9lbnRyaWVzLCBBVkRpY3Rpb25hcnkgKmVudHJpZXMpCi17Ci0gICAgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb24gPSAmc2VjdGlvbnNbc2VjdGlvbl9pZF07Ci0KLSAgICBzZWN0aW9uLT5zaG93X2FsbF9lbnRyaWVzID0gc2hvd19hbGxfZW50cmllczsKLSAgICBpZiAoc2hvd19hbGxfZW50cmllcykgewotICAgICAgICBTZWN0aW9uSUQgKmlkOwotICAgICAgICBmb3IgKGlkID0gc2VjdGlvbi0+Y2hpbGRyZW5faWRzOyAqaWQgIT0gLTE7IGlkKyspCi0gICAgICAgICAgICBtYXJrX3NlY3Rpb25fc2hvd19lbnRyaWVzKCppZCwgc2hvd19hbGxfZW50cmllcywgZW50cmllcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZfZGljdF9jb3B5KCZzZWN0aW9uLT5lbnRyaWVzX3RvX3Nob3csIGVudHJpZXMsIDApOwotICAgIH0KLX0KLQotc3RhdGljIGludCBtYXRjaF9zZWN0aW9uKGNvbnN0IGNoYXIgKnNlY3Rpb25fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hvd19hbGxfZW50cmllcywgQVZEaWN0aW9uYXJ5ICplbnRyaWVzKQotewotICAgIGludCBpLCByZXQgPSAwOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNlY3Rpb25zKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gJnNlY3Rpb25zW2ldOwotICAgICAgICBpZiAoIXN0cmNtcChzZWN0aW9uX25hbWUsIHNlY3Rpb24tPm5hbWUpIHx8Ci0gICAgICAgICAgICAoc2VjdGlvbi0+dW5pcXVlX25hbWUgJiYgIXN0cmNtcChzZWN0aW9uX25hbWUsIHNlY3Rpb24tPnVuaXF1ZV9uYW1lKSkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgIiclcycgbWF0Y2hlcyBzZWN0aW9uIHdpdGggdW5pcXVlIG5hbWUgJyVzJ1xuIiwgc2VjdGlvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgIChjaGFyICopYXZfeF9pZl9udWxsKHNlY3Rpb24tPnVuaXF1ZV9uYW1lLCBzZWN0aW9uLT5uYW1lKSk7Ci0gICAgICAgICAgICByZXQrKzsKLSAgICAgICAgICAgIG1hcmtfc2VjdGlvbl9zaG93X2VudHJpZXMoc2VjdGlvbi0+aWQsIHNob3dfYWxsX2VudHJpZXMsIGVudHJpZXMpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3Nob3dfZW50cmllcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGNvbnN0IGNoYXIgKnAgPSBhcmc7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICB3aGlsZSAoKnApIHsKLSAgICAgICAgQVZEaWN0aW9uYXJ5ICplbnRyaWVzID0gTlVMTDsKLSAgICAgICAgY2hhciAqc2VjdGlvbl9uYW1lID0gYXZfZ2V0X3Rva2VuKCZwLCAiPToiKTsKLSAgICAgICAgaW50IHNob3dfYWxsX2VudHJpZXMgPSAwOwotCi0gICAgICAgIGlmICghc2VjdGlvbl9uYW1lKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJNaXNzaW5nIHNlY3Rpb24gbmFtZSBmb3Igb3B0aW9uICclcydcbiIsIG9wdCk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCpwID09ICc9JykgewotICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAgd2hpbGUgKCpwICYmICpwICE9ICc6JykgewotICAgICAgICAgICAgICAgIGNoYXIgKmVudHJ5ID0gYXZfZ2V0X3Rva2VuKCZwLCAiLDoiKTsKLSAgICAgICAgICAgICAgICBpZiAoIWVudHJ5KQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICJBZGRpbmcgJyVzJyB0byB0aGUgZW50cmllcyB0byBzaG93IGluIHNlY3Rpb24gJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZW50cnksIHNlY3Rpb25fbmFtZSk7Ci0gICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJmVudHJpZXMsIGVudHJ5LCAiIiwgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkpOwotICAgICAgICAgICAgICAgIGlmICgqcCA9PSAnLCcpCi0gICAgICAgICAgICAgICAgICAgIHArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNob3dfYWxsX2VudHJpZXMgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gbWF0Y2hfc2VjdGlvbihzZWN0aW9uX25hbWUsIHNob3dfYWxsX2VudHJpZXMsIGVudHJpZXMpOwotICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJObyBtYXRjaCBmb3Igc2VjdGlvbiAnJXMnXG4iLCBzZWN0aW9uX25hbWUpOwotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICB9Ci0gICAgICAgIGF2X2RpY3RfZnJlZSgmZW50cmllcyk7Ci0gICAgICAgIGF2X2ZyZWUoc2VjdGlvbl9uYW1lKTsKLQotICAgICAgICBpZiAocmV0IDw9IDApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCpwKQotICAgICAgICAgICAgcCsrOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3Nob3dfZm9ybWF0X2VudHJ5KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgY2hhciAqYnVmID0gYXZfYXNwcmludGYoImZvcm1hdD0lcyIsIGFyZyk7Ci0gICAgaW50IHJldDsKLQotICAgIGlmICghYnVmKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAiT3B0aW9uICclcycgaXMgZGVwcmVjYXRlZCwgdXNlICctc2hvd19lbnRyaWVzIGZvcm1hdD0lcycgaW5zdGVhZFxuIiwKLSAgICAgICAgICAgb3B0LCBhcmcpOwotICAgIHJldCA9IG9wdF9zaG93X2VudHJpZXMob3B0Y3R4LCBvcHQsIGJ1Zik7Ci0gICAgYXZfZnJlZShidWYpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wdF9pbnB1dF9maWxlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGlmIChpbnB1dF9maWxlbmFtZSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICJBcmd1bWVudCAnJXMnIHByb3ZpZGVkIGFzIGlucHV0IGZpbGVuYW1lLCBidXQgJyVzJyB3YXMgYWxyZWFkeSBzcGVjaWZpZWQuXG4iLAotICAgICAgICAgICAgICAgIGFyZywgaW5wdXRfZmlsZW5hbWUpOwotICAgICAgICBleGl0X3Byb2dyYW0oMSk7Ci0gICAgfQotICAgIGlmICghc3RyY21wKGFyZywgIi0iKSkKLSAgICAgICAgYXJnID0gInBpcGU6IjsKLSAgICBpbnB1dF9maWxlbmFtZSA9IGFyZzsKLX0KLQotc3RhdGljIGludCBvcHRfaW5wdXRfZmlsZV9pKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgb3B0X2lucHV0X2ZpbGUob3B0Y3R4LCBhcmcpOwotICAgIHJldHVybiAwOwotfQotCi12b2lkIHNob3dfaGVscF9kZWZhdWx0KGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIGF2X2xvZ19zZXRfY2FsbGJhY2sobG9nX2NhbGxiYWNrX2hlbHApOwotICAgIHNob3dfdXNhZ2UoKTsKLSAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiTWFpbiBvcHRpb25zOiIsIDAsIDAsIDApOwotICAgIHByaW50ZigiXG4iKTsKLQotICAgIHNob3dfaGVscF9jaGlsZHJlbihhdmZvcm1hdF9nZXRfY2xhc3MoKSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0pOwotfQotCi0vKioKLSAqIFBhcnNlIGludGVydmFsIHNwZWNpZmljYXRpb24sIGFjY29yZGluZyB0byB0aGUgZm9ybWF0OgotICogSU5URVJWQUwgOjo9IFtTVEFSVHwrU1RBUlRfT0ZGU0VUXVslW0VORHwrRU5EX09GRlNFVF1dCi0gKiBJTlRFUlZBTFMgOjo9IElOVEVSVkFMWyxJTlRFUlZBTFNdCi0qLwotc3RhdGljIGludCBwYXJzZV9yZWFkX2ludGVydmFsKGNvbnN0IGNoYXIgKmludGVydmFsX3NwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZEludGVydmFsICppbnRlcnZhbCkKLXsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBjaGFyICpuZXh0LCAqcCwgKnNwZWMgPSBhdl9zdHJkdXAoaW50ZXJ2YWxfc3BlYyk7Ci0gICAgaWYgKCFzcGVjKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgaWYgKCEqc3BlYykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBlbXB0eSBpbnRlcnZhbCBzcGVjaWZpY2F0aW9uXG4iKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBnb3RvIGVuZDsKLSAgICB9Ci0KLSAgICBwID0gc3BlYzsKLSAgICBuZXh0ID0gc3RyY2hyKHNwZWMsICclJyk7Ci0gICAgaWYgKG5leHQpCi0gICAgICAgICpuZXh0KysgPSAwOwotCi0gICAgLyogcGFyc2UgZmlyc3QgcGFydCAqLwotICAgIGlmICgqcCkgewotICAgICAgICBpbnRlcnZhbC0+aGFzX3N0YXJ0ID0gMTsKLQotICAgICAgICBpZiAoKnAgPT0gJysnKSB7Ci0gICAgICAgICAgICBpbnRlcnZhbC0+c3RhcnRfaXNfb2Zmc2V0ID0gMTsKLSAgICAgICAgICAgIHArKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludGVydmFsLT5zdGFydF9pc19vZmZzZXQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gYXZfcGFyc2VfdGltZSgmaW50ZXJ2YWwtPnN0YXJ0LCBwLCAxKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGludGVydmFsIHN0YXJ0IHNwZWNpZmljYXRpb24gJyVzJ1xuIiwgcCk7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludGVydmFsLT5oYXNfc3RhcnQgPSAwOwotICAgIH0KLQotICAgIC8qIHBhcnNlIHNlY29uZCBwYXJ0ICovCi0gICAgcCA9IG5leHQ7Ci0gICAgaWYgKHAgJiYgKnApIHsKLSAgICAgICAgaW50NjRfdCB1czsKLSAgICAgICAgaW50ZXJ2YWwtPmhhc19lbmQgPSAxOwotCi0gICAgICAgIGlmICgqcCA9PSAnKycpIHsKLSAgICAgICAgICAgIGludGVydmFsLT5lbmRfaXNfb2Zmc2V0ID0gMTsKLSAgICAgICAgICAgIHArKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludGVydmFsLT5lbmRfaXNfb2Zmc2V0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnRlcnZhbC0+ZW5kX2lzX29mZnNldCAmJiAqcCA9PSAnIycpIHsKLSAgICAgICAgICAgIGxvbmcgbG9uZyBpbnQgbGxpOwotICAgICAgICAgICAgY2hhciAqdGFpbDsKLSAgICAgICAgICAgIGludGVydmFsLT5kdXJhdGlvbl9mcmFtZXMgPSAxOwotICAgICAgICAgICAgcCsrOwotICAgICAgICAgICAgbGxpID0gc3RydG9sbChwLCAmdGFpbCwgMTApOwotICAgICAgICAgICAgaWYgKCp0YWlsIHx8IGxsaSA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvciBuZWdhdGl2ZSB2YWx1ZSAnJXMnIGZvciBkdXJhdGlvbiBudW1iZXIgb2YgZnJhbWVzXG4iLCBwKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludGVydmFsLT5lbmQgPSBsbGk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBhdl9wYXJzZV90aW1lKCZ1cywgcCwgMSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGludGVydmFsIGVuZC9kdXJhdGlvbiBzcGVjaWZpY2F0aW9uICclcydcbiIsIHApOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50ZXJ2YWwtPmVuZCA9IHVzOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50ZXJ2YWwtPmhhc19lbmQgPSAwOwotICAgIH0KLQotZW5kOgotICAgIGF2X2ZyZWUoc3BlYyk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBwYXJzZV9yZWFkX2ludGVydmFscyhjb25zdCBjaGFyICppbnRlcnZhbHNfc3BlYykKLXsKLSAgICBpbnQgcmV0LCBuLCBpOwotICAgIGNoYXIgKnAsICpzcGVjID0gYXZfc3RyZHVwKGludGVydmFsc19zcGVjKTsKLSAgICBpZiAoIXNwZWMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAvKiBwcmVwYXJzZSBzcGVjaWZpY2F0aW9uLCBnZXQgbnVtYmVyIG9mIGludGVydmFscyAqLwotICAgIGZvciAobiA9IDAsIHAgPSBzcGVjOyAqcDsgcCsrKQotICAgICAgICBpZiAoKnAgPT0gJywnKQotICAgICAgICAgICAgbisrOwotICAgIG4rKzsKLQotICAgIHJlYWRfaW50ZXJ2YWxzID0gYXZfbWFsbG9jX2FycmF5KG4sIHNpemVvZigqcmVhZF9pbnRlcnZhbHMpKTsKLSAgICBpZiAoIXJlYWRfaW50ZXJ2YWxzKSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIHJlYWRfaW50ZXJ2YWxzX25iID0gbjsKLQotICAgIC8qIHBhcnNlIGludGVydmFscyAqLwotICAgIHAgPSBzcGVjOwotICAgIGZvciAoaSA9IDA7IHA7IGkrKykgewotICAgICAgICBjaGFyICpuZXh0OwotCi0gICAgICAgIGF2X2Fzc2VydDAoaSA8IHJlYWRfaW50ZXJ2YWxzX25iKTsKLSAgICAgICAgbmV4dCA9IHN0cmNocihwLCAnLCcpOwotICAgICAgICBpZiAobmV4dCkKLSAgICAgICAgICAgICpuZXh0KysgPSAwOwotCi0gICAgICAgIHJlYWRfaW50ZXJ2YWxzW2ldLmlkID0gaTsKLSAgICAgICAgcmV0ID0gcGFyc2VfcmVhZF9pbnRlcnZhbChwLCAmcmVhZF9pbnRlcnZhbHNbaV0pOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgcmVhZCBpbnRlcnZhbCAjJWQgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICBpLCBwKTsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIlBhcnNlZCBsb2cgaW50ZXJ2YWwgIik7Ci0gICAgICAgIGxvZ19yZWFkX2ludGVydmFsKCZyZWFkX2ludGVydmFsc1tpXSwgTlVMTCwgQVZfTE9HX1ZFUkJPU0UpOwotICAgICAgICBwID0gbmV4dDsKLSAgICB9Ci0gICAgYXZfYXNzZXJ0MChpID09IHJlYWRfaW50ZXJ2YWxzX25iKTsKLQotZW5kOgotICAgIGF2X2ZyZWUoc3BlYyk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBvcHRfcmVhZF9pbnRlcnZhbHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICByZXR1cm4gcGFyc2VfcmVhZF9pbnRlcnZhbHMoYXJnKTsKLX0KLQotc3RhdGljIGludCBvcHRfcHJldHR5KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgc2hvd192YWx1ZV91bml0ICAgICAgICAgICAgICA9IDE7Ci0gICAgdXNlX3ZhbHVlX3ByZWZpeCAgICAgICAgICAgICA9IDE7Ci0gICAgdXNlX2J5dGVfdmFsdWVfYmluYXJ5X3ByZWZpeCA9IDE7Ci0gICAgdXNlX3ZhbHVlX3NleGFnZXNpbWFsX2Zvcm1hdCA9IDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X3NlY3Rpb24oU2VjdGlvbklEIGlkLCBpbnQgbGV2ZWwpCi17Ci0gICAgY29uc3QgU2VjdGlvbklEICpwaWQ7Ci0gICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb24gPSAmc2VjdGlvbnNbaWRdOwotICAgIHByaW50ZigiJWMlYyVjIiwKLSAgICAgICAgICAgc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfV1JBUFBFUiAgICAgICAgICAgPyAnVycgOiAnLicsCi0gICAgICAgICAgIHNlY3Rpb24tPmZsYWdzICYgU0VDVElPTl9GTEFHX0lTX0FSUkFZICAgICAgICAgICAgID8gJ0EnIDogJy4nLAotICAgICAgICAgICBzZWN0aW9uLT5mbGFncyAmIFNFQ1RJT05fRkxBR19IQVNfVkFSSUFCTEVfRklFTERTICA/ICdWJyA6ICcuJyk7Ci0gICAgcHJpbnRmKCIlKmMgICVzIiwgbGV2ZWwgKiA0LCAnICcsIHNlY3Rpb24tPm5hbWUpOwotICAgIGlmIChzZWN0aW9uLT51bmlxdWVfbmFtZSkKLSAgICAgICAgcHJpbnRmKCIvJXMiLCBzZWN0aW9uLT51bmlxdWVfbmFtZSk7Ci0gICAgcHJpbnRmKCJcbiIpOwotCi0gICAgZm9yIChwaWQgPSBzZWN0aW9uLT5jaGlsZHJlbl9pZHM7ICpwaWQgIT0gLTE7IHBpZCsrKQotICAgICAgICBwcmludF9zZWN0aW9uKCpwaWQsIGxldmVsKzEpOwotfQotCi1zdGF0aWMgaW50IG9wdF9zZWN0aW9ucyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQotewotICAgIHByaW50ZigiU2VjdGlvbnM6XG4iCi0gICAgICAgICAgICJXLi4gPSBTZWN0aW9uIGlzIGEgd3JhcHBlciAoY29udGFpbnMgb3RoZXIgc2VjdGlvbnMsIG5vIGxvY2FsIGVudHJpZXMpXG4iCi0gICAgICAgICAgICIuQS4gPSBTZWN0aW9uIGNvbnRhaW5zIGFuIGFycmF5IG9mIGVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGVcbiIKLSAgICAgICAgICAgIi4uViA9IFNlY3Rpb24gbWF5IGNvbnRhaW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgZmllbGRzIHdpdGggdmFyaWFibGUga2V5c1xuIgotICAgICAgICAgICAiRkxBR1MgTkFNRS9VTklRVUVfTkFNRVxuIgotICAgICAgICAgICAiLS0tXG4iKTsKLSAgICBwcmludF9zZWN0aW9uKFNFQ1RJT05fSURfUk9PVCwgMCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3B0X3Nob3dfdmVyc2lvbnMoY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCi17Ci0gICAgbWFya19zZWN0aW9uX3Nob3dfZW50cmllcyhTRUNUSU9OX0lEX1BST0dSQU1fVkVSU0lPTiwgMSwgTlVMTCk7Ci0gICAgbWFya19zZWN0aW9uX3Nob3dfZW50cmllcyhTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTiwgMSwgTlVMTCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgREVGSU5FX09QVF9TSE9XX1NFQ1RJT04oc2VjdGlvbiwgdGFyZ2V0X3NlY3Rpb25faWQpICAgICAgICAgICAgIFwKLSAgICBzdGF0aWMgaW50IG9wdF9zaG93XyMjc2VjdGlvbihjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgbWFya19zZWN0aW9uX3Nob3dfZW50cmllcyhTRUNUSU9OX0lEXyMjdGFyZ2V0X3NlY3Rpb25faWQsIDEsIE5VTEwpOyBcCi0gICAgICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1ERUZJTkVfT1BUX1NIT1dfU0VDVElPTihjaGFwdGVycywgICAgICAgICBDSEFQVEVSUykKLURFRklORV9PUFRfU0hPV19TRUNUSU9OKGVycm9yLCAgICAgICAgICAgIEVSUk9SKQotREVGSU5FX09QVF9TSE9XX1NFQ1RJT04oZm9ybWF0LCAgICAgICAgICAgRk9STUFUKQotREVGSU5FX09QVF9TSE9XX1NFQ1RJT04oZnJhbWVzLCAgICAgICAgICAgRlJBTUVTKQotREVGSU5FX09QVF9TSE9XX1NFQ1RJT04obGlicmFyeV92ZXJzaW9ucywgTElCUkFSWV9WRVJTSU9OUykKLURFRklORV9PUFRfU0hPV19TRUNUSU9OKHBhY2tldHMsICAgICAgICAgIFBBQ0tFVFMpCi1ERUZJTkVfT1BUX1NIT1dfU0VDVElPTihwaXhlbF9mb3JtYXRzLCAgICBQSVhFTF9GT1JNQVRTKQotREVGSU5FX09QVF9TSE9XX1NFQ1RJT04ocHJvZ3JhbV92ZXJzaW9uLCAgUFJPR1JBTV9WRVJTSU9OKQotREVGSU5FX09QVF9TSE9XX1NFQ1RJT04oc3RyZWFtcywgICAgICAgICAgU1RSRUFNUykKLURFRklORV9PUFRfU0hPV19TRUNUSU9OKHByb2dyYW1zLCAgICAgICAgIFBST0dSQU1TKQotCi1zdGF0aWMgY29uc3QgT3B0aW9uRGVmIHJlYWxfb3B0aW9uc1tdID0gewotI2luY2x1ZGUgImNtZHV0aWxzX2NvbW1vbl9vcHRzLmgiCi0gICAgeyAiZiIsIEhBU19BUkcsIHsuZnVuY19hcmcgPSBvcHRfZm9ybWF0fSwgImZvcmNlIGZvcm1hdCIsICJmb3JtYXQiIH0sCi0gICAgeyAidW5pdCIsIE9QVF9CT09MLCB7JnNob3dfdmFsdWVfdW5pdH0sICJzaG93IHVuaXQgb2YgdGhlIGRpc3BsYXllZCB2YWx1ZXMiIH0sCi0gICAgeyAicHJlZml4IiwgT1BUX0JPT0wsIHsmdXNlX3ZhbHVlX3ByZWZpeH0sICJ1c2UgU0kgcHJlZml4ZXMgZm9yIHRoZSBkaXNwbGF5ZWQgdmFsdWVzIiB9LAotICAgIHsgImJ5dGVfYmluYXJ5X3ByZWZpeCIsIE9QVF9CT09MLCB7JnVzZV9ieXRlX3ZhbHVlX2JpbmFyeV9wcmVmaXh9LAotICAgICAgInVzZSBiaW5hcnkgcHJlZml4ZXMgZm9yIGJ5dGUgdW5pdHMiIH0sCi0gICAgeyAic2V4YWdlc2ltYWwiLCBPUFRfQk9PTCwgIHsmdXNlX3ZhbHVlX3NleGFnZXNpbWFsX2Zvcm1hdH0sCi0gICAgICAidXNlIHNleGFnZXNpbWFsIGZvcm1hdCBIT1VSUzpNTTpTUy5NSUNST1NFQ09ORFMgZm9yIHRpbWUgdW5pdHMiIH0sCi0gICAgeyAicHJldHR5IiwgMCwgey5mdW5jX2FyZyA9IG9wdF9wcmV0dHl9LAotICAgICAgInByZXR0aWZ5IHRoZSBmb3JtYXQgb2YgZGlzcGxheWVkIHZhbHVlcywgbWFrZSBpdCBtb3JlIGh1bWFuIHJlYWRhYmxlIiB9LAotICAgIHsgInByaW50X2Zvcm1hdCIsIE9QVF9TVFJJTkcgfCBIQVNfQVJHLCB7KHZvaWQqKSZwcmludF9mb3JtYXR9LAotICAgICAgInNldCB0aGUgb3V0cHV0IHByaW50aW5nIGZvcm1hdCAoYXZhaWxhYmxlIGZvcm1hdHMgYXJlOiBkZWZhdWx0LCBjb21wYWN0LCBjc3YsIGZsYXQsIGluaSwganNvbiwgeG1sKSIsICJmb3JtYXQiIH0sCi0gICAgeyAib2YiLCBPUFRfU1RSSU5HIHwgSEFTX0FSRywgeyh2b2lkKikmcHJpbnRfZm9ybWF0fSwgImFsaWFzIGZvciAtcHJpbnRfZm9ybWF0IiwgImZvcm1hdCIgfSwKLSAgICB7ICJzZWxlY3Rfc3RyZWFtcyIsIE9QVF9TVFJJTkcgfCBIQVNfQVJHLCB7KHZvaWQqKSZzdHJlYW1fc3BlY2lmaWVyfSwgInNlbGVjdCB0aGUgc3BlY2lmaWVkIHN0cmVhbXMiLCAic3RyZWFtX3NwZWNpZmllciIgfSwKLSAgICB7ICJzZWN0aW9ucyIsIE9QVF9FWElULCB7LmZ1bmNfYXJnID0gb3B0X3NlY3Rpb25zfSwgInByaW50IHNlY3Rpb25zIHN0cnVjdHVyZSBhbmQgc2VjdGlvbiBpbmZvcm1hdGlvbiwgYW5kIGV4aXQiIH0sCi0gICAgeyAic2hvd19kYXRhIiwgICAgT1BUX0JPT0wsIHsodm9pZCopJmRvX3Nob3dfZGF0YX0sICJzaG93IHBhY2tldHMgZGF0YSIgfSwKLSAgICB7ICJzaG93X2RhdGFfaGFzaCIsIE9QVF9TVFJJTkcgfCBIQVNfQVJHLCB7KHZvaWQqKSZzaG93X2RhdGFfaGFzaH0sICJzaG93IHBhY2tldHMgZGF0YSBoYXNoIiB9LAotICAgIHsgInNob3dfZXJyb3IiLCAgIDAsIHsodm9pZCopJm9wdF9zaG93X2Vycm9yfSwgICJzaG93IHByb2JpbmcgZXJyb3IiIH0sCi0gICAgeyAic2hvd19mb3JtYXQiLCAgMCwgeyh2b2lkKikmb3B0X3Nob3dfZm9ybWF0fSwgInNob3cgZm9ybWF0L2NvbnRhaW5lciBpbmZvIiB9LAotICAgIHsgInNob3dfZnJhbWVzIiwgIDAsIHsodm9pZCopJm9wdF9zaG93X2ZyYW1lc30sICJzaG93IGZyYW1lcyBpbmZvIiB9LAotICAgIHsgInNob3dfZm9ybWF0X2VudHJ5IiwgSEFTX0FSRywgey5mdW5jX2FyZyA9IG9wdF9zaG93X2Zvcm1hdF9lbnRyeX0sCi0gICAgICAic2hvdyBhIHBhcnRpY3VsYXIgZW50cnkgZnJvbSB0aGUgZm9ybWF0L2NvbnRhaW5lciBpbmZvIiwgImVudHJ5IiB9LAotICAgIHsgInNob3dfZW50cmllcyIsIEhBU19BUkcsIHsuZnVuY19hcmcgPSBvcHRfc2hvd19lbnRyaWVzfSwKLSAgICAgICJzaG93IGEgc2V0IG9mIHNwZWNpZmllZCBlbnRyaWVzIiwgImVudHJ5X2xpc3QiIH0sCi0gICAgeyAic2hvd19wYWNrZXRzIiwgMCwgeyh2b2lkKikmb3B0X3Nob3dfcGFja2V0c30sICJzaG93IHBhY2tldHMgaW5mbyIgfSwKLSAgICB7ICJzaG93X3Byb2dyYW1zIiwgMCwgeyh2b2lkKikmb3B0X3Nob3dfcHJvZ3JhbXN9LCAic2hvdyBwcm9ncmFtcyBpbmZvIiB9LAotICAgIHsgInNob3dfc3RyZWFtcyIsIDAsIHsodm9pZCopJm9wdF9zaG93X3N0cmVhbXN9LCAic2hvdyBzdHJlYW1zIGluZm8iIH0sCi0gICAgeyAic2hvd19jaGFwdGVycyIsIDAsIHsodm9pZCopJm9wdF9zaG93X2NoYXB0ZXJzfSwgInNob3cgY2hhcHRlcnMgaW5mbyIgfSwKLSAgICB7ICJjb3VudF9mcmFtZXMiLCBPUFRfQk9PTCwgeyh2b2lkKikmZG9fY291bnRfZnJhbWVzfSwgImNvdW50IHRoZSBudW1iZXIgb2YgZnJhbWVzIHBlciBzdHJlYW0iIH0sCi0gICAgeyAiY291bnRfcGFja2V0cyIsIE9QVF9CT09MLCB7KHZvaWQqKSZkb19jb3VudF9wYWNrZXRzfSwgImNvdW50IHRoZSBudW1iZXIgb2YgcGFja2V0cyBwZXIgc3RyZWFtIiB9LAotICAgIHsgInNob3dfcHJvZ3JhbV92ZXJzaW9uIiwgIDAsIHsodm9pZCopJm9wdF9zaG93X3Byb2dyYW1fdmVyc2lvbn0sICAic2hvdyBmZnByb2JlIHZlcnNpb24iIH0sCi0gICAgeyAic2hvd19saWJyYXJ5X3ZlcnNpb25zIiwgMCwgeyh2b2lkKikmb3B0X3Nob3dfbGlicmFyeV92ZXJzaW9uc30sICJzaG93IGxpYnJhcnkgdmVyc2lvbnMiIH0sCi0gICAgeyAic2hvd192ZXJzaW9ucyIsICAgICAgICAgMCwgeyh2b2lkKikmb3B0X3Nob3dfdmVyc2lvbnN9LCAic2hvdyBwcm9ncmFtIGFuZCBsaWJyYXJ5IHZlcnNpb25zIiB9LAotICAgIHsgInNob3dfcGl4ZWxfZm9ybWF0cyIsIDAsIHsodm9pZCopJm9wdF9zaG93X3BpeGVsX2Zvcm1hdHN9LCAic2hvdyBwaXhlbCBmb3JtYXQgZGVzY3JpcHRpb25zIiB9LAotICAgIHsgInNob3dfcHJpdmF0ZV9kYXRhIiwgT1BUX0JPT0wsIHsodm9pZCopJnNob3dfcHJpdmF0ZV9kYXRhfSwgInNob3cgcHJpdmF0ZSBkYXRhIiB9LAotICAgIHsgInByaXZhdGUiLCAgICAgICAgICAgT1BUX0JPT0wsIHsodm9pZCopJnNob3dfcHJpdmF0ZV9kYXRhfSwgInNhbWUgYXMgc2hvd19wcml2YXRlX2RhdGEiIH0sCi0gICAgeyAiYml0ZXhhY3QiLCBPUFRfQk9PTCwgeyZkb19iaXRleGFjdH0sICJmb3JjZSBiaXRleGFjdCBvdXRwdXQiIH0sCi0gICAgeyAicmVhZF9pbnRlcnZhbHMiLCBIQVNfQVJHLCB7LmZ1bmNfYXJnID0gb3B0X3JlYWRfaW50ZXJ2YWxzfSwgInNldCByZWFkIGludGVydmFscyIsICJyZWFkX2ludGVydmFscyIgfSwKLSAgICB7ICJkZWZhdWx0IiwgSEFTX0FSRyB8IE9QVF9BVURJTyB8IE9QVF9WSURFTyB8IE9QVF9FWFBFUlQsIHsuZnVuY19hcmcgPSBvcHRfZGVmYXVsdH0sICJnZW5lcmljIGNhdGNoIGFsbCBvcHRpb24iLCAiIiB9LAotICAgIHsgImkiLCBIQVNfQVJHLCB7LmZ1bmNfYXJnID0gb3B0X2lucHV0X2ZpbGVfaX0sICJyZWFkIHNwZWNpZmllZCBmaWxlIiwgImlucHV0X2ZpbGUifSwKLSAgICB7IE5VTEwsIH0sCi19OwotCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19zZWN0aW9uX3Nob3dfZW50cmllcyhpbnQgc2VjdGlvbl9pZCkKLXsKLSAgICBpbnQgKmlkOwotICAgIHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gJnNlY3Rpb25zW3NlY3Rpb25faWRdOwotICAgIGlmIChzZWN0aW9uc1tzZWN0aW9uX2lkXS5zaG93X2FsbF9lbnRyaWVzIHx8IHNlY3Rpb25zW3NlY3Rpb25faWRdLmVudHJpZXNfdG9fc2hvdykKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgZm9yIChpZCA9IHNlY3Rpb24tPmNoaWxkcmVuX2lkczsgKmlkICE9IC0xOyBpZCsrKQotICAgICAgICBpZiAoY2hlY2tfc2VjdGlvbl9zaG93X2VudHJpZXMoKmlkKSkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgIHJldHVybiAwOwotfQotCi0jZGVmaW5lIFNFVF9ET19TSE9XKGlkLCB2YXJuYW1lKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChjaGVja19zZWN0aW9uX3Nob3dfZW50cmllcyhTRUNUSU9OX0lEXyMjaWQpKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBkb19zaG93XyMjdmFybmFtZSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSAoMCkKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGNvbnN0IFdyaXRlciAqdzsKLSAgICBXcml0ZXJDb250ZXh0ICp3Y3R4OwotICAgIGNoYXIgKmJ1ZjsKLSAgICBjaGFyICp3X25hbWUgPSBOVUxMLCAqd19hcmdzID0gTlVMTDsKLSAgICBpbnQgcmV0LCBpOwotCi0gICAgYXZfbG9nX3NldF9mbGFncyhBVl9MT0dfU0tJUF9SRVBFQVRFRCk7Ci0gICAgcmVnaXN0ZXJfZXhpdChmZnByb2JlX2NsZWFudXApOwotCi0gICAgb3B0aW9ucyA9IHJlYWxfb3B0aW9uczsKLSAgICBwYXJzZV9sb2dsZXZlbChhcmdjLCBhcmd2LCBvcHRpb25zKTsKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLSAgICBhdmZvcm1hdF9uZXR3b3JrX2luaXQoKTsKLSAgICBpbml0X29wdHMoKTsKLSNpZiBDT05GSUdfQVZERVZJQ0UKLSAgICBhdmRldmljZV9yZWdpc3Rlcl9hbGwoKTsKLSNlbmRpZgotCi0gICAgc2hvd19iYW5uZXIoYXJnYywgYXJndiwgb3B0aW9ucyk7Ci0gICAgcGFyc2Vfb3B0aW9ucyhOVUxMLCBhcmdjLCBhcmd2LCBvcHRpb25zLCBvcHRfaW5wdXRfZmlsZSk7Ci0KLSAgICAvKiBtYXJrIHRoaW5ncyB0byBzaG93LCBiYXNlZCBvbiAtc2hvd19lbnRyaWVzICovCi0gICAgU0VUX0RPX1NIT1coQ0hBUFRFUlMsIGNoYXB0ZXJzKTsKLSAgICBTRVRfRE9fU0hPVyhFUlJPUiwgZXJyb3IpOwotICAgIFNFVF9ET19TSE9XKEZPUk1BVCwgZm9ybWF0KTsKLSAgICBTRVRfRE9fU0hPVyhGUkFNRVMsIGZyYW1lcyk7Ci0gICAgU0VUX0RPX1NIT1coTElCUkFSWV9WRVJTSU9OUywgbGlicmFyeV92ZXJzaW9ucyk7Ci0gICAgU0VUX0RPX1NIT1coUEFDS0VUUywgcGFja2V0cyk7Ci0gICAgU0VUX0RPX1NIT1coUElYRUxfRk9STUFUUywgcGl4ZWxfZm9ybWF0cyk7Ci0gICAgU0VUX0RPX1NIT1coUElYRUxfRk9STUFUX0ZMQUdTLCBwaXhlbF9mb3JtYXRfZmxhZ3MpOwotICAgIFNFVF9ET19TSE9XKFBJWEVMX0ZPUk1BVF9DT01QT05FTlRTLCBwaXhlbF9mb3JtYXRfY29tcG9uZW50cyk7Ci0gICAgU0VUX0RPX1NIT1coUFJPR1JBTV9WRVJTSU9OLCBwcm9ncmFtX3ZlcnNpb24pOwotICAgIFNFVF9ET19TSE9XKFBST0dSQU1TLCBwcm9ncmFtcyk7Ci0gICAgU0VUX0RPX1NIT1coU1RSRUFNUywgc3RyZWFtcyk7Ci0gICAgU0VUX0RPX1NIT1coU1RSRUFNX0RJU1BPU0lUSU9OLCBzdHJlYW1fZGlzcG9zaXRpb24pOwotICAgIFNFVF9ET19TSE9XKFBST0dSQU1fU1RSRUFNX0RJU1BPU0lUSU9OLCBzdHJlYW1fZGlzcG9zaXRpb24pOwotCi0gICAgU0VUX0RPX1NIT1coQ0hBUFRFUl9UQUdTLCBjaGFwdGVyX3RhZ3MpOwotICAgIFNFVF9ET19TSE9XKEZPUk1BVF9UQUdTLCBmb3JtYXRfdGFncyk7Ci0gICAgU0VUX0RPX1NIT1coRlJBTUVfVEFHUywgZnJhbWVfdGFncyk7Ci0gICAgU0VUX0RPX1NIT1coUFJPR1JBTV9UQUdTLCBwcm9ncmFtX3RhZ3MpOwotICAgIFNFVF9ET19TSE9XKFNUUkVBTV9UQUdTLCBzdHJlYW1fdGFncyk7Ci0gICAgU0VUX0RPX1NIT1coUEFDS0VUX1RBR1MsIHBhY2tldF90YWdzKTsKLQotICAgIGlmIChkb19iaXRleGFjdCAmJiAoZG9fc2hvd19wcm9ncmFtX3ZlcnNpb24gfHwgZG9fc2hvd19saWJyYXJ5X3ZlcnNpb25zKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIi1iaXRleGFjdCBhbmQgLXNob3dfcHJvZ3JhbV92ZXJzaW9uIG9yIC1zaG93X2xpYnJhcnlfdmVyc2lvbnMgIgotICAgICAgICAgICAgICAgIm9wdGlvbnMgYXJlIGluY29tcGF0aWJsZVxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotCi0gICAgd3JpdGVyX3JlZ2lzdGVyX2FsbCgpOwotCi0gICAgaWYgKCFwcmludF9mb3JtYXQpCi0gICAgICAgIHByaW50X2Zvcm1hdCA9IGF2X3N0cmR1cCgiZGVmYXVsdCIpOwotICAgIGlmICghcHJpbnRfZm9ybWF0KSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIHdfbmFtZSA9IGF2X3N0cnRvayhwcmludF9mb3JtYXQsICI9IiwgJmJ1Zik7Ci0gICAgd19hcmdzID0gYnVmOwotCi0gICAgaWYgKHNob3dfZGF0YV9oYXNoKSB7Ci0gICAgICAgIGlmICgocmV0ID0gYXZfaGFzaF9hbGxvYygmaGFzaCwgc2hvd19kYXRhX2hhc2gpKSA8IDApIHsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFSU5WQUwpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbjsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBoYXNoIGFsZ29yaXRobSAnJXMnXG5Lbm93biBhbGdvcml0aG1zOiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNob3dfZGF0YV9oYXNoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyAobiA9IGF2X2hhc2hfbmFtZXMoaSkpOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIgJXMiLCBuKTsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdyA9IHdyaXRlcl9nZXRfYnlfbmFtZSh3X25hbWUpOwotICAgIGlmICghdykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBvdXRwdXQgZm9ybWF0IHdpdGggbmFtZSAnJXMnXG4iLCB3X25hbWUpOwotICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLQotICAgIGlmICgocmV0ID0gd3JpdGVyX29wZW4oJndjdHgsIHcsIHdfYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25zLCBGRl9BUlJBWV9FTEVNUyhzZWN0aW9ucykpKSA+PSAwKSB7Ci0gICAgICAgIGlmICh3ID09ICZ4bWxfd3JpdGVyKQotICAgICAgICAgICAgd2N0eC0+c3RyaW5nX3ZhbGlkYXRpb25fdXRmOF9mbGFncyB8PSBBVl9VVEY4X0ZMQUdfRVhDTFVERV9YTUxfSU5WQUxJRF9DT05UUk9MX0NPREVTOwotCi0gICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3Y3R4LCBTRUNUSU9OX0lEX1JPT1QpOwotCi0gICAgICAgIGlmIChkb19zaG93X3Byb2dyYW1fdmVyc2lvbikKLSAgICAgICAgICAgIGZmcHJvYmVfc2hvd19wcm9ncmFtX3ZlcnNpb24od2N0eCk7Ci0gICAgICAgIGlmIChkb19zaG93X2xpYnJhcnlfdmVyc2lvbnMpCi0gICAgICAgICAgICBmZnByb2JlX3Nob3dfbGlicmFyeV92ZXJzaW9ucyh3Y3R4KTsKLSAgICAgICAgaWYgKGRvX3Nob3dfcGl4ZWxfZm9ybWF0cykKLSAgICAgICAgICAgIGZmcHJvYmVfc2hvd19waXhlbF9mb3JtYXRzKHdjdHgpOwotCi0gICAgICAgIGlmICghaW5wdXRfZmlsZW5hbWUgJiYKLSAgICAgICAgICAgICgoZG9fc2hvd19mb3JtYXQgfHwgZG9fc2hvd19wcm9ncmFtcyB8fCBkb19zaG93X3N0cmVhbXMgfHwgZG9fc2hvd19jaGFwdGVycyB8fCBkb19zaG93X3BhY2tldHMgfHwgZG9fc2hvd19lcnJvcikgfHwKLSAgICAgICAgICAgICAoIWRvX3Nob3dfcHJvZ3JhbV92ZXJzaW9uICYmICFkb19zaG93X2xpYnJhcnlfdmVyc2lvbnMgJiYgIWRvX3Nob3dfcGl4ZWxfZm9ybWF0cykpKSB7Ci0gICAgICAgICAgICBzaG93X3VzYWdlKCk7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiWW91IGhhdmUgdG8gc3BlY2lmeSBvbmUgaW5wdXQgZmlsZS5cbiIpOwotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVzZSAtaCB0byBnZXQgZnVsbCBoZWxwIG9yLCBldmVuIGJldHRlciwgcnVuICdtYW4gJXMnLlxuIiwgcHJvZ3JhbV9uYW1lKTsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgfSBlbHNlIGlmIChpbnB1dF9maWxlbmFtZSkgewotICAgICAgICAgICAgcmV0ID0gcHJvYmVfZmlsZSh3Y3R4LCBpbnB1dF9maWxlbmFtZSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCAmJiBkb19zaG93X2Vycm9yKQotICAgICAgICAgICAgICAgIHNob3dfZXJyb3Iod2N0eCwgcmV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3Y3R4KTsKLSAgICAgICAgd3JpdGVyX2Nsb3NlKCZ3Y3R4KTsKLSAgICB9Ci0KLWVuZDoKLSAgICBhdl9mcmVlcCgmcHJpbnRfZm9ybWF0KTsKLSAgICBhdl9mcmVlcCgmcmVhZF9pbnRlcnZhbHMpOwotICAgIGF2X2hhc2hfZnJlZXAoJmhhc2gpOwotCi0gICAgdW5pbml0X29wdHMoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc2VjdGlvbnMpOyBpKyspCi0gICAgICAgIGF2X2RpY3RfZnJlZSgmKHNlY3Rpb25zW2ldLmVudHJpZXNfdG9fc2hvdykpOwotCi0gICAgYXZmb3JtYXRfbmV0d29ya19kZWluaXQoKTsKLQotICAgIHJldHVybiByZXQgPCAwOwotfQpkaWZmIC0tZ2l0IGEvZmZzZXJ2ZXIuYyBiL2Zmc2VydmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjN2RiZWUuLjAwMDAwMDAKLS0tIGEvZmZzZXJ2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQwMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogbXVsdGlwbGUgZm9ybWF0IHN0cmVhbWluZyBzZXJ2ZXIgYmFzZWQgb24gdGhlIEZGbXBlZyBsaWJyYXJpZXMKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaWYgIUhBVkVfQ0xPU0VTT0NLRVQKLSNkZWZpbmUgY2xvc2Vzb2NrZXQgY2xvc2UKLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKLS8qIEZJWE1FOiB0aG9zZSBhcmUgaW50ZXJuYWwgaGVhZGVycywgZmZzZXJ2ZXIgX3JlYWxseV8gc2hvdWxkbid0IHVzZSB0aGVtICovCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvZmZtLmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvbmV0d29yay5oIgotI2luY2x1ZGUgImxpYmF2Zm9ybWF0L29zX3N1cHBvcnQuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9ydHBkZWMuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9ydHBwcm90by5oIgotI2luY2x1ZGUgImxpYmF2Zm9ybWF0L3J0c3AuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9ydHNwY29kZXMuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmlvX2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC91cmwuaCIKLQotI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcmFuZG9tX3NlZWQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpZiBIQVZFX1BPTExfSAotI2luY2x1ZGUgPHBvbGwuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+Ci0KLSNpbmNsdWRlICJjbWR1dGlscy5oIgotI2luY2x1ZGUgImZmc2VydmVyX2NvbmZpZy5oIgotCi0jZGVmaW5lIFBBVEhfTEVOR1RIIDEwMjQKLQotY29uc3QgY2hhciBwcm9ncmFtX25hbWVbXSA9ICJmZnNlcnZlciI7Ci1jb25zdCBpbnQgcHJvZ3JhbV9iaXJ0aF95ZWFyID0gMjAwMDsKLQotc3RhdGljIGNvbnN0IE9wdGlvbkRlZiBvcHRpb25zW107Ci0KLWVudW0gSFRUUFN0YXRlIHsKLSAgICBIVFRQU1RBVEVfV0FJVF9SRVFVRVNULAotICAgIEhUVFBTVEFURV9TRU5EX0hFQURFUiwKLSAgICBIVFRQU1RBVEVfU0VORF9EQVRBX0hFQURFUiwKLSAgICBIVFRQU1RBVEVfU0VORF9EQVRBLCAgICAgICAgICAvKiBzZW5kaW5nIFRDUCBvciBVRFAgZGF0YSAqLwotICAgIEhUVFBTVEFURV9TRU5EX0RBVEFfVFJBSUxFUiwKLSAgICBIVFRQU1RBVEVfUkVDRUlWRV9EQVRBLAotICAgIEhUVFBTVEFURV9XQUlUX0ZFRUQsICAgICAgICAgIC8qIHdhaXQgZm9yIGRhdGEgZnJvbSB0aGUgZmVlZCAqLwotICAgIEhUVFBTVEFURV9SRUFEWSwKLQotICAgIFJUU1BTVEFURV9XQUlUX1JFUVVFU1QsCi0gICAgUlRTUFNUQVRFX1NFTkRfUkVQTFksCi0gICAgUlRTUFNUQVRFX1NFTkRfUEFDS0VULAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBodHRwX3N0YXRlW10gPSB7Ci0gICAgIkhUVFBfV0FJVF9SRVFVRVNUIiwKLSAgICAiSFRUUF9TRU5EX0hFQURFUiIsCi0KLSAgICAiU0VORF9EQVRBX0hFQURFUiIsCi0gICAgIlNFTkRfREFUQSIsCi0gICAgIlNFTkRfREFUQV9UUkFJTEVSIiwKLSAgICAiUkVDRUlWRV9EQVRBIiwKLSAgICAiV0FJVF9GRUVEIiwKLSAgICAiUkVBRFkiLAotCi0gICAgIlJUU1BfV0FJVF9SRVFVRVNUIiwKLSAgICAiUlRTUF9TRU5EX1JFUExZIiwKLSAgICAiUlRTUF9TRU5EX1BBQ0tFVCIsCi19OwotCi0jZGVmaW5lIElPQlVGRkVSX0lOSVRfU0laRSA4MTkyCi0KLS8qIHRpbWVvdXRzIGFyZSBpbiBtcyAqLwotI2RlZmluZSBIVFRQX1JFUVVFU1RfVElNRU9VVCAoMTUgKiAxMDAwKQotI2RlZmluZSBSVFNQX1JFUVVFU1RfVElNRU9VVCAoMzYwMCAqIDI0ICogMTAwMCkKLQotI2RlZmluZSBTWU5DX1RJTUVPVVQgKDEwICogMTAwMCkKLQotdHlwZWRlZiBzdHJ1Y3QgUlRTUEFjdGlvblNlcnZlclNldHVwIHsKLSAgICB1aW50MzJfdCBpcGFkZHI7Ci0gICAgY2hhciB0cmFuc3BvcnRfb3B0aW9uWzUxMl07Ci19IFJUU1BBY3Rpb25TZXJ2ZXJTZXR1cDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludDY0X3QgY291bnQxLCBjb3VudDI7Ci0gICAgaW50NjRfdCB0aW1lMSwgdGltZTI7Ci19IERhdGFSYXRlRGF0YTsKLQotLyogY29udGV4dCBhc3NvY2lhdGVkIHdpdGggb25lIGNvbm5lY3Rpb24gKi8KLXR5cGVkZWYgc3RydWN0IEhUVFBDb250ZXh0IHsKLSAgICBlbnVtIEhUVFBTdGF0ZSBzdGF0ZTsKLSAgICBpbnQgZmQ7IC8qIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbV9hZGRyOyAvKiBvcmlnaW4gKi8KLSAgICBzdHJ1Y3QgcG9sbGZkICpwb2xsX2VudHJ5OyAvKiB1c2VkIHdoZW4gcG9sbGluZyAqLwotICAgIGludDY0X3QgdGltZW91dDsKLSAgICB1aW50OF90ICpidWZmZXJfcHRyLCAqYnVmZmVyX2VuZDsKLSAgICBpbnQgaHR0cF9lcnJvcjsKLSAgICBpbnQgcG9zdDsKLSAgICBpbnQgY2h1bmtlZF9lbmNvZGluZzsKLSAgICBpbnQgY2h1bmtfc2l6ZTsgICAgICAgICAgICAgICAvKiAwIGlmIGl0IG5lZWRzIHRvIGJlIHJlYWQgKi8KLSAgICBzdHJ1Y3QgSFRUUENvbnRleHQgKm5leHQ7Ci0gICAgaW50IGdvdF9rZXlfZnJhbWU7IC8qIHN0cmVhbSAwID0+IDEsIHN0cmVhbSAxID0+IDIsIHN0cmVhbSAyPT4gNCAqLwotICAgIGludDY0X3QgZGF0YV9jb3VudDsKLSAgICAvKiBmZWVkIGlucHV0ICovCi0gICAgaW50IGZlZWRfZmQ7Ci0gICAgLyogaW5wdXQgZm9ybWF0IGhhbmRsaW5nICovCi0gICAgQVZGb3JtYXRDb250ZXh0ICpmbXRfaW47Ci0gICAgaW50NjRfdCBzdGFydF90aW1lOyAgICAgICAgICAgIC8qIEluIG1pbGxpc2Vjb25kcyAtIHRoaXMgd3JhcHMgZmFpcmx5IG9mdGVuICovCi0gICAgaW50NjRfdCBmaXJzdF9wdHM7ICAgICAgICAgICAgLyogaW5pdGlhbCBwdHMgdmFsdWUgKi8KLSAgICBpbnQ2NF90IGN1cl9wdHM7ICAgICAgICAgICAgIC8qIGN1cnJlbnQgcHRzIHZhbHVlIGZyb20gdGhlIHN0cmVhbSBpbiB1cyAqLwotICAgIGludDY0X3QgY3VyX2ZyYW1lX2R1cmF0aW9uOyAgLyogZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdXMgKi8KLSAgICBpbnQgY3VyX2ZyYW1lX2J5dGVzOyAgICAgICAvKiBvdXRwdXQgZnJhbWUgc2l6ZSwgbmVlZGVkIHRvIGNvbXB1dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGltZSBhdCB3aGljaCB3ZSBzZW5kIGVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXQgKi8KLSAgICBpbnQgcHRzX3N0cmVhbV9pbmRleDsgICAgICAgIC8qIHN0cmVhbSB3ZSBjaG9vc2UgYXMgY2xvY2sgcmVmZXJlbmNlICovCi0gICAgaW50NjRfdCBjdXJfY2xvY2s7ICAgICAgICAgICAvKiBjdXJyZW50IGNsb2NrIHJlZmVyZW5jZSB2YWx1ZSBpbiB1cyAqLwotICAgIC8qIG91dHB1dCBmb3JtYXQgaGFuZGxpbmcgKi8KLSAgICBzdHJ1Y3QgRkZTZXJ2ZXJTdHJlYW0gKnN0cmVhbTsKLSAgICAvKiAtMSBpcyBpbnZhbGlkIHN0cmVhbSAqLwotICAgIGludCBmZWVkX3N0cmVhbXNbRkZTRVJWRVJfTUFYX1NUUkVBTVNdOyAvKiBpbmRleCBvZiBzdHJlYW1zIGluIHRoZSBmZWVkICovCi0gICAgaW50IHN3aXRjaF9mZWVkX3N0cmVhbXNbRkZTRVJWRVJfTUFYX1NUUkVBTVNdOyAvKiBpbmRleCBvZiBzdHJlYW1zIGluIHRoZSBmZWVkICovCi0gICAgaW50IHN3aXRjaF9wZW5kaW5nOwotICAgIEFWRm9ybWF0Q29udGV4dCBmbXRfY3R4OyAvKiBpbnN0YW5jZSBvZiBGRlNlcnZlclN0cmVhbSBmb3Igb25lIHVzZXIgKi8KLSAgICBpbnQgbGFzdF9wYWNrZXRfc2VudDsgLyogdHJ1ZSBpZiBsYXN0IGRhdGEgcGFja2V0IHdhcyBzZW50ICovCi0gICAgaW50IHN1cHByZXNzX2xvZzsKLSAgICBEYXRhUmF0ZURhdGEgZGF0YXJhdGU7Ci0gICAgaW50IHdtcF9jbGllbnRfaWQ7Ci0gICAgY2hhciBwcm90b2NvbFsxNl07Ci0gICAgY2hhciBtZXRob2RbMTZdOwotICAgIGNoYXIgdXJsWzEyOF07Ci0gICAgaW50IGJ1ZmZlcl9zaXplOwotICAgIHVpbnQ4X3QgKmJ1ZmZlcjsKLSAgICBpbnQgaXNfcGFja2V0aXplZDsgLyogaWYgdHJ1ZSwgdGhlIHN0cmVhbSBpcyBwYWNrZXRpemVkICovCi0gICAgaW50IHBhY2tldF9zdHJlYW1faW5kZXg7IC8qIGN1cnJlbnQgc3RyZWFtIGZvciBvdXRwdXQgaW4gc3RhdGUgbWFjaGluZSAqLwotCi0gICAgLyogUlRTUCBzdGF0ZSBzcGVjaWZpYyAqLwotICAgIHVpbnQ4X3QgKnBiX2J1ZmZlcjsgLyogWFhYOiB1c2UgdGhhdCBpbiBhbGwgdGhlIGNvZGUgKi8KLSAgICBBVklPQ29udGV4dCAqcGI7Ci0gICAgaW50IHNlcTsgLyogUlRTUCBzZXF1ZW5jZSBudW1iZXIgKi8KLQotICAgIC8qIFJUUCBzdGF0ZSBzcGVjaWZpYyAqLwotICAgIGVudW0gUlRTUExvd2VyVHJhbnNwb3J0IHJ0cF9wcm90b2NvbDsKLSAgICBjaGFyIHNlc3Npb25faWRbMzJdOyAvKiBzZXNzaW9uIGlkICovCi0gICAgQVZGb3JtYXRDb250ZXh0ICpydHBfY3R4W0ZGU0VSVkVSX01BWF9TVFJFQU1TXTsKLQotICAgIC8qIFJUUC9VRFAgc3BlY2lmaWMgKi8KLSAgICBVUkxDb250ZXh0ICpydHBfaGFuZGxlc1tGRlNFUlZFUl9NQVhfU1RSRUFNU107Ci0KLSAgICAvKiBSVFAvVENQIHNwZWNpZmljICovCi0gICAgc3RydWN0IEhUVFBDb250ZXh0ICpydHNwX2M7Ci0gICAgdWludDhfdCAqcGFja2V0X2J1ZmZlciwgKnBhY2tldF9idWZmZXJfcHRyLCAqcGFja2V0X2J1ZmZlcl9lbmQ7Ci19IEhUVFBDb250ZXh0OwotCi10eXBlZGVmIHN0cnVjdCBGZWVkRGF0YSB7Ci0gICAgbG9uZyBsb25nIGRhdGFfY291bnQ7Ci0gICAgZmxvYXQgYXZnX2ZyYW1lX3NpemU7ICAgLyogZnJhbWUgc2l6ZSBhdmVyYWdlZCBvdmVyIGxhc3QgZnJhbWVzIHdpdGggZXhwb25lbnRpYWwgbWVhbiAqLwotfSBGZWVkRGF0YTsKLQotc3RhdGljIEhUVFBDb250ZXh0ICpmaXJzdF9odHRwX2N0eDsKLQotc3RhdGljIEZGU2VydmVyQ29uZmlnIGNvbmZpZyA9IHsKLSAgICAubmJfbWF4X2h0dHBfY29ubmVjdGlvbnMgPSAyMDAwLAotICAgIC5uYl9tYXhfY29ubmVjdGlvbnMgPSA1LAotICAgIC5tYXhfYmFuZHdpZHRoID0gMTAwMCwKLSAgICAudXNlX2RlZmF1bHRzID0gMSwKLX07Ci0KLXN0YXRpYyB2b2lkIG5ld19jb25uZWN0aW9uKGludCBzZXJ2ZXJfZmQsIGludCBpc19ydHNwKTsKLXN0YXRpYyB2b2lkIGNsb3NlX2Nvbm5lY3Rpb24oSFRUUENvbnRleHQgKmMpOwotCi0vKiBIVFRQIGhhbmRsaW5nICovCi1zdGF0aWMgaW50IGhhbmRsZV9jb25uZWN0aW9uKEhUVFBDb250ZXh0ICpjKTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9zdHJlYW1fcGFyYW1zKEFWSU9Db250ZXh0ICpwYiwgRkZTZXJ2ZXJTdHJlYW0gKnN0cmVhbSk7Ci1zdGF0aWMgdm9pZCBjb21wdXRlX3N0YXR1cyhIVFRQQ29udGV4dCAqYyk7Ci1zdGF0aWMgaW50IG9wZW5faW5wdXRfc3RyZWFtKEhUVFBDb250ZXh0ICpjLCBjb25zdCBjaGFyICppbmZvKTsKLXN0YXRpYyBpbnQgaHR0cF9wYXJzZV9yZXF1ZXN0KEhUVFBDb250ZXh0ICpjKTsKLXN0YXRpYyBpbnQgaHR0cF9zZW5kX2RhdGEoSFRUUENvbnRleHQgKmMpOwotc3RhdGljIGludCBodHRwX3N0YXJ0X3JlY2VpdmVfZGF0YShIVFRQQ29udGV4dCAqYyk7Ci1zdGF0aWMgaW50IGh0dHBfcmVjZWl2ZV9kYXRhKEhUVFBDb250ZXh0ICpjKTsKLQotLyogUlRTUCBoYW5kbGluZyAqLwotc3RhdGljIGludCBydHNwX3BhcnNlX3JlcXVlc3QoSFRUUENvbnRleHQgKmMpOwotc3RhdGljIHZvaWQgcnRzcF9jbWRfZGVzY3JpYmUoSFRUUENvbnRleHQgKmMsIGNvbnN0IGNoYXIgKnVybCk7Ci1zdGF0aWMgdm9pZCBydHNwX2NtZF9vcHRpb25zKEhUVFBDb250ZXh0ICpjLCBjb25zdCBjaGFyICp1cmwpOwotc3RhdGljIHZvaWQgcnRzcF9jbWRfc2V0dXAoSFRUUENvbnRleHQgKmMsIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUU1BNZXNzYWdlSGVhZGVyICpoKTsKLXN0YXRpYyB2b2lkIHJ0c3BfY21kX3BsYXkoSFRUUENvbnRleHQgKmMsIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUlRTUE1lc3NhZ2VIZWFkZXIgKmgpOwotc3RhdGljIHZvaWQgcnRzcF9jbWRfaW50ZXJydXB0KEhUVFBDb250ZXh0ICpjLCBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRTUE1lc3NhZ2VIZWFkZXIgKmgsIGludCBwYXVzZV9vbmx5KTsKLQotLyogU0RQIGhhbmRsaW5nICovCi1zdGF0aWMgaW50IHByZXBhcmVfc2RwX2Rlc2NyaXB0aW9uKEZGU2VydmVyU3RyZWFtICpzdHJlYW0sIHVpbnQ4X3QgKipwYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaW5fYWRkciBteV9pcCk7Ci0KLS8qIFJUUCBoYW5kbGluZyAqLwotc3RhdGljIEhUVFBDb250ZXh0ICpydHBfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IHNvY2thZGRyX2luICpmcm9tX2FkZHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRlNlcnZlclN0cmVhbSAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gUlRTUExvd2VyVHJhbnNwb3J0IHJ0cF9wcm90b2NvbCk7Ci1zdGF0aWMgaW50IHJ0cF9uZXdfYXZfc3RyZWFtKEhUVFBDb250ZXh0ICpjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRlc3RfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnRleHQgKnJ0c3BfYyk7Ci0vKiB1dGlscyAqLwotc3RhdGljIHNpemVfdCBodG1sZW5jb2RlIChjb25zdCBjaGFyICpzcmMsIGNoYXIgKipkZXN0KTsKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcF9odG1sX2VudGl0eSAoY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICplbnRpdHkpOwotc3RhdGljIGlubGluZSBpbnQgY2hlY2tfY29kZWNfbWF0Y2goQVZDb2RlY0NvbnRleHQgKmNjZiwgQVZDb2RlY0NvbnRleHQgKmNjcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW0pOwotCi1zdGF0aWMgY29uc3QgY2hhciAqbXlfcHJvZ3JhbV9uYW1lOwotCi1zdGF0aWMgaW50IG5vX2xhdW5jaDsKLXN0YXRpYyBpbnQgbmVlZF90b19zdGFydF9jaGlsZHJlbjsKLQotLyogbWF4aW11bSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIEhUVFAgY29ubmVjdGlvbnMgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgbmJfY29ubmVjdGlvbnM7Ci0KLXN0YXRpYyB1aW50NjRfdCBjdXJyZW50X2JhbmR3aWR0aDsKLQotLyogTWFraW5nIHRoaXMgZ2xvYmFsIHNhdmVzIG9uIHBhc3NpbmcgaXQgYXJvdW5kIGV2ZXJ5d2hlcmUgKi8KLXN0YXRpYyBpbnQ2NF90IGN1cl90aW1lOwotCi1zdGF0aWMgQVZMRkcgcmFuZG9tX3N0YXRlOwotCi1zdGF0aWMgRklMRSAqbG9nZmlsZSA9IE5VTEw7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcF9odG1sX2VudGl0eSAoY2hhciAqYnVmZmVyLCBjb25zdCBjaGFyICplbnRpdHkpIHsKLSAgICBpZiAoIWJ1ZmZlciB8fCAhZW50aXR5KQotICAgICAgICByZXR1cm47Ci0gICAgd2hpbGUgKCplbnRpdHkpCi0gICAgICAgICpidWZmZXIrKyA9ICplbnRpdHkrKzsKLX0KLQotLyoqCi0gKiBTdWJzdGl0dXRlcyBrbm93biBjb25mbGljdGluZyBjaGFycyBvbiBhIHRleHQgc3RyaW5nIHdpdGgKLSAqIHRoZWlyIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy4KLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlICdlbmNvZGVkJyByZXByZXNlbnRhdGlvbgotICogbm90IGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgTlVMLgotICovCi1zdGF0aWMgc2l6ZV90IGh0bWxlbmNvZGUgKGNvbnN0IGNoYXIgKnNyYywgY2hhciAqKmRlc3QpIHsKLSAgICBjb25zdCBjaGFyICphbXAgPSAiJmFtcDsiOwotICAgIGNvbnN0IGNoYXIgKmx0ICA9ICImbHQ7IjsKLSAgICBjb25zdCBjaGFyICpndCAgPSAiJmd0OyI7Ci0gICAgY29uc3QgY2hhciAqc3RhcnQ7Ci0gICAgY2hhciAqdG1wOwotICAgIHNpemVfdCBmaW5hbF9zaXplID0gMDsKLQotICAgIGlmICghc3JjKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHN0YXJ0ID0gc3JjOwotCi0gICAgLyogQ29tcHV0ZSBuZWVkZWQgZGVzdCBzaXplICovCi0gICAgd2hpbGUgKCpzcmMgIT0gJ1wwJykgewotICAgICAgICBzd2l0Y2goKnNyYykgewotICAgICAgICAgICAgY2FzZSAzODogLyogJiAqLwotICAgICAgICAgICAgICAgIGZpbmFsX3NpemUgKz0gNTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjA6IC8qIDwgKi8KLSAgICAgICAgICAgIGNhc2UgNjI6IC8qID4gKi8KLSAgICAgICAgICAgICAgICBmaW5hbF9zaXplICs9IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGZpbmFsX3NpemUrKzsKLSAgICAgICAgfQotICAgICAgICBzcmMrKzsKLSAgICB9Ci0KLSAgICBzcmMgPSBzdGFydDsKLSAgICAqZGVzdCA9IGF2X21hbGxvY3ooZmluYWxfc2l6ZSArIDEpOwotICAgIGlmICghKmRlc3QpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogQnVpbGQgZGVzdCAqLwotICAgIHRtcCA9ICpkZXN0OwotICAgIHdoaWxlICgqc3JjICE9ICdcMCcpIHsKLSAgICAgICAgc3dpdGNoKCpzcmMpIHsKLSAgICAgICAgICAgIGNhc2UgMzg6IC8qICYgKi8KLSAgICAgICAgICAgICAgICBjcF9odG1sX2VudGl0eSAodG1wLCBhbXApOwotICAgICAgICAgICAgICAgIHRtcCArPSA1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2MDogLyogPCAqLwotICAgICAgICAgICAgICAgIGNwX2h0bWxfZW50aXR5ICh0bXAsIGx0KTsKLSAgICAgICAgICAgICAgICB0bXAgKz0gNDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNjI6IC8qID4gKi8KLSAgICAgICAgICAgICAgICBjcF9odG1sX2VudGl0eSAodG1wLCBndCk7Ci0gICAgICAgICAgICAgICAgdG1wICs9IDQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICp0bXAgPSAqc3JjOwotICAgICAgICAgICAgICAgIHRtcCArPSAxOwotICAgICAgICB9Ci0gICAgICAgIHNyYysrOwotICAgIH0KLSAgICAqdG1wID0gJ1wwJzsKLQotICAgIHJldHVybiBmaW5hbF9zaXplOwotfQotCi1zdGF0aWMgaW50NjRfdCBmZm1fcmVhZF93cml0ZV9pbmRleChpbnQgZmQpCi17Ci0gICAgdWludDhfdCBidWZbOF07Ci0KLSAgICBpZiAobHNlZWsoZmQsIDgsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Ci0gICAgaWYgKHJlYWQoZmQsIGJ1ZiwgOCkgIT0gOCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKLSAgICByZXR1cm4gQVZfUkI2NChidWYpOwotfQotCi1zdGF0aWMgaW50IGZmbV93cml0ZV93cml0ZV9pbmRleChpbnQgZmQsIGludDY0X3QgcG9zKQotewotICAgIHVpbnQ4X3QgYnVmWzhdOwotICAgIGludCBpOwotCi0gICAgZm9yKGk9MDtpPDg7aSsrKQotICAgICAgICBidWZbaV0gPSAocG9zID4+ICg1NiAtIGkgKiA4KSkgJiAweGZmOwotICAgIGlmIChsc2VlayhmZCwgOCwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgZ290byBiYWlsX2VpbzsKLSAgICBpZiAod3JpdGUoZmQsIGJ1ZiwgOCkgIT0gOCkKLSAgICAgICAgZ290byBiYWlsX2VpbzsKLQotICAgIHJldHVybiA4OwotCi1iYWlsX2VpbzoKLSAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotfQotCi1zdGF0aWMgdm9pZCBmZm1fc2V0X3dyaXRlX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZmlsZV9zaXplKQotewotICAgIGF2X29wdF9zZXRfaW50KHMsICJzZXJ2ZXJfYXR0YWNoZWQiLCAxLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKLSAgICBhdl9vcHRfc2V0X2ludChzLCAid3JpdGVfaW5kZXgiLCBwb3MsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOwotICAgIGF2X29wdF9zZXRfaW50KHMsICJmaWxlX3NpemUiLCBmaWxlX3NpemUsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOwotfQotCi1zdGF0aWMgY2hhciAqY3RpbWUxKGNoYXIgKmJ1ZjIsIHNpemVfdCBidWZfc2l6ZSkKLXsKLSAgICB0aW1lX3QgdGk7Ci0gICAgY2hhciAqcDsKLQotICAgIHRpID0gdGltZShOVUxMKTsKLSAgICBwID0gY3RpbWUoJnRpKTsKLSAgICBpZiAoIXAgfHwgISpwKSB7Ci0gICAgICAgICpidWYyID0gJ1wwJzsKLSAgICAgICAgcmV0dXJuIGJ1ZjI7Ci0gICAgfQotICAgIGF2X3N0cmxjcHkoYnVmMiwgcCwgYnVmX3NpemUpOwotICAgIHAgPSBidWYyICsgc3RybGVuKGJ1ZjIpIC0gMTsKLSAgICBpZiAoKnAgPT0gJ1xuJykKLSAgICAgICAgKnAgPSAnXDAnOwotICAgIHJldHVybiBidWYyOwotfQotCi1zdGF0aWMgdm9pZCBodHRwX3Zsb2coY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZhcmdzKQotewotICAgIHN0YXRpYyBpbnQgcHJpbnRfcHJlZml4ID0gMTsKLSAgICBjaGFyIGJ1ZlszMl07Ci0KLSAgICBpZiAoIWxvZ2ZpbGUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChwcmludF9wcmVmaXgpIHsKLSAgICAgICAgY3RpbWUxKGJ1Ziwgc2l6ZW9mKGJ1ZikpOwotICAgICAgICBmcHJpbnRmKGxvZ2ZpbGUsICIlcyAiLCBidWYpOwotICAgIH0KLSAgICBwcmludF9wcmVmaXggPSBzdHJzdHIoZm10LCAiXG4iKSAhPSBOVUxMOwotICAgIHZmcHJpbnRmKGxvZ2ZpbGUsIGZtdCwgdmFyZ3MpOwotICAgIGZmbHVzaChsb2dmaWxlKTsKLX0KLQotI2lmZGVmIF9fR05VQ19fCi1fX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSkKLSNlbmRpZgotc3RhdGljIHZvaWQgaHR0cF9sb2coY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCB2YXJnczsKLSAgICB2YV9zdGFydCh2YXJncywgZm10KTsKLSAgICBodHRwX3Zsb2coZm10LCB2YXJncyk7Ci0gICAgdmFfZW5kKHZhcmdzKTsKLX0KLQotc3RhdGljIHZvaWQgaHR0cF9hdl9sb2codm9pZCAqcHRyLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YXJncykKLXsKLSAgICBzdGF0aWMgaW50IHByaW50X3ByZWZpeCA9IDE7Ci0gICAgQVZDbGFzcyAqYXZjID0gcHRyID8gKihBVkNsYXNzKiopcHRyIDogTlVMTDsKLSAgICBpZiAobGV2ZWwgPiBhdl9sb2dfZ2V0X2xldmVsKCkpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAocHJpbnRfcHJlZml4ICYmIGF2YykKLSAgICAgICAgaHR0cF9sb2coIlslcyBAICVwXSIsIGF2Yy0+aXRlbV9uYW1lKHB0ciksIHB0cik7Ci0gICAgcHJpbnRfcHJlZml4ID0gc3Ryc3RyKGZtdCwgIlxuIikgIT0gTlVMTDsKLSAgICBodHRwX3Zsb2coZm10LCB2YXJncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxvZ19jb25uZWN0aW9uKEhUVFBDb250ZXh0ICpjKQotewotICAgIGlmIChjLT5zdXBwcmVzc19sb2cpCi0gICAgICAgIHJldHVybjsKLQotICAgIGh0dHBfbG9nKCIlcyAtIC0gWyVzXSBcIiVzICVzXCIgJWQgJSJQUklkNjQiXG4iLAotICAgICAgICAgICAgIGluZXRfbnRvYShjLT5mcm9tX2FkZHIuc2luX2FkZHIpLCBjLT5tZXRob2QsIGMtPnVybCwKLSAgICAgICAgICAgICBjLT5wcm90b2NvbCwgKGMtPmh0dHBfZXJyb3IgPyBjLT5odHRwX2Vycm9yIDogMjAwKSwgYy0+ZGF0YV9jb3VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9kYXRhcmF0ZShEYXRhUmF0ZURhdGEgKmRyZCwgaW50NjRfdCBjb3VudCkKLXsKLSAgICBpZiAoIWRyZC0+dGltZTEgJiYgIWRyZC0+Y291bnQxKSB7Ci0gICAgICAgIGRyZC0+dGltZTEgPSBkcmQtPnRpbWUyID0gY3VyX3RpbWU7Ci0gICAgICAgIGRyZC0+Y291bnQxID0gZHJkLT5jb3VudDIgPSBjb3VudDsKLSAgICB9IGVsc2UgaWYgKGN1cl90aW1lIC0gZHJkLT50aW1lMiA+IDUwMDApIHsKLSAgICAgICAgZHJkLT50aW1lMSA9IGRyZC0+dGltZTI7Ci0gICAgICAgIGRyZC0+Y291bnQxID0gZHJkLT5jb3VudDI7Ci0gICAgICAgIGRyZC0+dGltZTIgPSBjdXJfdGltZTsKLSAgICAgICAgZHJkLT5jb3VudDIgPSBjb3VudDsKLSAgICB9Ci19Ci0KLS8qIEluIGJ5dGVzIHBlciBzZWNvbmQgKi8KLXN0YXRpYyBpbnQgY29tcHV0ZV9kYXRhcmF0ZShEYXRhUmF0ZURhdGEgKmRyZCwgaW50NjRfdCBjb3VudCkKLXsKLSAgICBpZiAoY3VyX3RpbWUgPT0gZHJkLT50aW1lMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gKChjb3VudCAtIGRyZC0+Y291bnQxKSAqIDEwMDApIC8gKGN1cl90aW1lIC0gZHJkLT50aW1lMSk7Ci19Ci0KLQotc3RhdGljIHZvaWQgc3RhcnRfY2hpbGRyZW4oRkZTZXJ2ZXJTdHJlYW0gKmZlZWQpCi17Ci0gICAgY2hhciAqcGF0aG5hbWU7Ci0gICAgY2hhciAqc2xhc2g7Ci0gICAgaW50IGk7Ci0gICAgc2l6ZV90IGNtZF9sZW5ndGg7Ci0KLSAgICBpZiAobm9fbGF1bmNoKQotICAgICAgICByZXR1cm47Ci0KLSAgICBjbWRfbGVuZ3RoID0gc3RybGVuKG15X3Byb2dyYW1fbmFtZSk7Ci0KLSAgIC8qKgotICAgICogRklYTUU6IFdJUCBTYWZlZ3VhcmQuIFJlbW92ZSBhZnRlciBjbGVhcmluZyBhbGwgaGFyY29kZWQKLSAgICAqICcxMDI0JyBwYXRoIGxlbmd0aHMKLSAgICAqLwotICAgIGlmIChjbWRfbGVuZ3RoID4gUEFUSF9MRU5HVEggLSAxKSB7Ci0gICAgICAgIGh0dHBfbG9nKCJDb3VsZCBub3Qgc3RhcnQgY2hpbGRyZW4uIENvbW1hbmQgbGluZTogJyVzJyBleGNlZWRzICIKLSAgICAgICAgICAgICAgICAgICAgInBhdGggbGVuZ3RoIGxpbWl0ICglZClcbiIsIG15X3Byb2dyYW1fbmFtZSwgUEFUSF9MRU5HVEgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcGF0aG5hbWUgPSBhdl9zdHJkdXAgKG15X3Byb2dyYW1fbmFtZSk7Ci0gICAgaWYgKCFwYXRobmFtZSkgewotICAgICAgICBodHRwX2xvZygiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgY2hpbGRyZW4gY21kIGxpbmVcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgLyogcmVwbGFjZSAiZmZzZXJ2ZXIiIHdpdGggImZmbXBlZyIgaW4gdGhlIHBhdGggb2YgY3VycmVudAotICAgICogcHJvZ3JhbS4gSWdub3JlIHVzZXIgcHJvdmlkZWQgcGF0aCAqLwotCi0gICAgc2xhc2ggPSBzdHJyY2hyKHBhdGhuYW1lLCAnLycpOwotICAgIGlmICghc2xhc2gpCi0gICAgICAgIHNsYXNoID0gcGF0aG5hbWU7Ci0gICAgZWxzZQotICAgICAgICBzbGFzaCsrOwotICAgIHN0cmNweShzbGFzaCwgImZmbXBlZyIpOwotCi0gICAgZm9yICg7IGZlZWQ7IGZlZWQgPSBmZWVkLT5uZXh0KSB7Ci0KLSAgICAgICAgaWYgKCFmZWVkLT5jaGlsZF9hcmd2IHx8IGZlZWQtPnBpZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGZlZWQtPnBpZF9zdGFydCA9IHRpbWUoMCk7Ci0KLSAgICAgICAgZmVlZC0+cGlkID0gZm9yaygpOwotICAgICAgICBpZiAoZmVlZC0+cGlkIDwgMCkgewotICAgICAgICAgICAgaHR0cF9sb2coIlVuYWJsZSB0byBjcmVhdGUgY2hpbGRyZW46ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgYXZfZnJlZSAocGF0aG5hbWUpOwotICAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZlZWQtPnBpZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIEluIGNoaWxkICovCi0KLSAgICAgICAgaHR0cF9sb2coIkxhdW5jaCBjb21tYW5kIGxpbmU6ICIpOwotICAgICAgICBodHRwX2xvZygiJXMgIiwgcGF0aG5hbWUpOwotCi0gICAgICAgIGZvciAoaSA9IDE7IGZlZWQtPmNoaWxkX2FyZ3ZbaV0gJiYgZmVlZC0+Y2hpbGRfYXJndltpXVswXTsgaSsrKQotICAgICAgICAgICAgaHR0cF9sb2coIiVzICIsIGZlZWQtPmNoaWxkX2FyZ3ZbaV0pOwotICAgICAgICBodHRwX2xvZygiXG4iKTsKLQotICAgICAgICBmb3IgKGkgPSAzOyBpIDwgMjU2OyBpKyspCi0gICAgICAgICAgICBjbG9zZShpKTsKLQotICAgICAgICBpZiAoIWNvbmZpZy5kZWJ1ZykgewotICAgICAgICAgICAgaWYgKCFmcmVvcGVuKCIvZGV2L251bGwiLCAiciIsIHN0ZGluKSkKLSAgICAgICAgICAgICAgICBodHRwX2xvZygiZmFpbGVkIHRvIHJlZGlyZWN0IFNURElOIHRvIC9kZXYvbnVsbFxuOyIpOwotICAgICAgICAgICAgaWYgKCFmcmVvcGVuKCIvZGV2L251bGwiLCAidyIsIHN0ZG91dCkpCi0gICAgICAgICAgICAgICAgaHR0cF9sb2coImZhaWxlZCB0byByZWRpcmVjdCBTVERPVVQgdG8gL2Rldi9udWxsXG47Iik7Ci0gICAgICAgICAgICBpZiAoIWZyZW9wZW4oIi9kZXYvbnVsbCIsICJ3Iiwgc3RkZXJyKSkKLSAgICAgICAgICAgICAgICBodHRwX2xvZygiZmFpbGVkIHRvIHJlZGlyZWN0IFNUREVSUiB0byAvZGV2L251bGxcbjsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKLSAgICAgICAgZXhlY3ZwKHBhdGhuYW1lLCBmZWVkLT5jaGlsZF9hcmd2KTsKLSAgICAgICAgYXZfZnJlZSAocGF0aG5hbWUpOwotICAgICAgICBfZXhpdCgxKTsKLSAgICB9Ci0gICAgYXZfZnJlZSAocGF0aG5hbWUpOwotfQotCi0vKiBvcGVuIGEgbGlzdGVuaW5nIHNvY2tldCAqLwotc3RhdGljIGludCBzb2NrZXRfb3Blbl9saXN0ZW4oc3RydWN0IHNvY2thZGRyX2luICpteV9hZGRyKQotewotICAgIGludCBzZXJ2ZXJfZmQsIHRtcDsKLQotICAgIHNlcnZlcl9mZCA9IHNvY2tldChBRl9JTkVULFNPQ0tfU1RSRUFNLDApOwotICAgIGlmIChzZXJ2ZXJfZmQgPCAwKSB7Ci0gICAgICAgIHBlcnJvciAoInNvY2tldCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgdG1wID0gMTsKLSAgICBpZiAoc2V0c29ja29wdChzZXJ2ZXJfZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnRtcCwgc2l6ZW9mKHRtcCkpKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJzZXRzb2Nrb3B0IFNPX1JFVVNFQUREUiBmYWlsZWRcbiIpOwotCi0gICAgbXlfYWRkci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgaWYgKGJpbmQgKHNlcnZlcl9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSBteV9hZGRyLCBzaXplb2YgKCpteV9hZGRyKSkgPCAwKSB7Ci0gICAgICAgIGNoYXIgYmluZG1zZ1szMl07Ci0gICAgICAgIHNucHJpbnRmKGJpbmRtc2csIHNpemVvZihiaW5kbXNnKSwgImJpbmQocG9ydCAlZCkiLAotICAgICAgICAgICAgICAgICBudG9ocyhteV9hZGRyLT5zaW5fcG9ydCkpOwotICAgICAgICBwZXJyb3IgKGJpbmRtc2cpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaWYgKGxpc3RlbiAoc2VydmVyX2ZkLCA1KSA8IDApIHsKLSAgICAgICAgcGVycm9yICgibGlzdGVuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoZmZfc29ja2V0X25vbmJsb2NrKHNlcnZlcl9mZCwgMSkgPCAwKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJmZl9zb2NrZXRfbm9uYmxvY2sgZmFpbGVkXG4iKTsKLQotICAgIHJldHVybiBzZXJ2ZXJfZmQ7Ci0KLWZhaWw6Ci0gICAgY2xvc2Vzb2NrZXQoc2VydmVyX2ZkKTsKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8qIHN0YXJ0IGFsbCBtdWx0aWNhc3Qgc3RyZWFtcyAqLwotc3RhdGljIHZvaWQgc3RhcnRfbXVsdGljYXN0KHZvaWQpCi17Ci0gICAgRkZTZXJ2ZXJTdHJlYW0gKnN0cmVhbTsKLSAgICBjaGFyIHNlc3Npb25faWRbMzJdOwotICAgIEhUVFBDb250ZXh0ICpydHBfYzsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZGVzdF9hZGRyID0gezB9OwotICAgIGludCBkZWZhdWx0X3BvcnQsIHN0cmVhbV9pbmRleDsKLSAgICB1bnNpZ25lZCBpbnQgcmFuZG9tMCwgcmFuZG9tMTsKLQotICAgIGRlZmF1bHRfcG9ydCA9IDYwMDA7Ci0gICAgZm9yKHN0cmVhbSA9IGNvbmZpZy5maXJzdF9zdHJlYW07IHN0cmVhbTsgc3RyZWFtID0gc3RyZWFtLT5uZXh0KSB7Ci0KLSAgICAgICAgaWYgKCFzdHJlYW0tPmlzX211bHRpY2FzdCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHJhbmRvbTAgPSBhdl9sZmdfZ2V0KCZyYW5kb21fc3RhdGUpOwotICAgICAgICByYW5kb20xID0gYXZfbGZnX2dldCgmcmFuZG9tX3N0YXRlKTsKLQotICAgICAgICAvKiBvcGVuIHRoZSBSVFAgY29ubmVjdGlvbiAqLwotICAgICAgICBzbnByaW50ZihzZXNzaW9uX2lkLCBzaXplb2Yoc2Vzc2lvbl9pZCksICIlMDh4JTA4eCIsIHJhbmRvbTAsIHJhbmRvbTEpOwotCi0gICAgICAgIC8qIGNob29zZSBhIHBvcnQgaWYgbm9uZSBnaXZlbiAqLwotICAgICAgICBpZiAoc3RyZWFtLT5tdWx0aWNhc3RfcG9ydCA9PSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm11bHRpY2FzdF9wb3J0ID0gZGVmYXVsdF9wb3J0OwotICAgICAgICAgICAgZGVmYXVsdF9wb3J0ICs9IDEwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGRlc3RfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLSAgICAgICAgZGVzdF9hZGRyLnNpbl9hZGRyID0gc3RyZWFtLT5tdWx0aWNhc3RfaXA7Ci0gICAgICAgIGRlc3RfYWRkci5zaW5fcG9ydCA9IGh0b25zKHN0cmVhbS0+bXVsdGljYXN0X3BvcnQpOwotCi0gICAgICAgIHJ0cF9jID0gcnRwX25ld19jb25uZWN0aW9uKCZkZXN0X2FkZHIsIHN0cmVhbSwgc2Vzc2lvbl9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVURQX01VTFRJQ0FTVCk7Ci0gICAgICAgIGlmICghcnRwX2MpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAob3Blbl9pbnB1dF9zdHJlYW0ocnRwX2MsICIiKSA8IDApIHsKLSAgICAgICAgICAgIGh0dHBfbG9nKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCBzdHJlYW0gZm9yIHN0cmVhbSAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5maWxlbmFtZSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG9wZW4gZWFjaCBSVFAgc3RyZWFtICovCi0gICAgICAgIGZvcihzdHJlYW1faW5kZXggPSAwOyBzdHJlYW1faW5kZXggPCBzdHJlYW0tPm5iX3N0cmVhbXM7Ci0gICAgICAgICAgICBzdHJlYW1faW5kZXgrKykgewotICAgICAgICAgICAgZGVzdF9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoc3RyZWFtLT5tdWx0aWNhc3RfcG9ydCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICogc3RyZWFtX2luZGV4KTsKLSAgICAgICAgICAgIGlmIChydHBfbmV3X2F2X3N0cmVhbShydHBfYywgc3RyZWFtX2luZGV4LCAmZGVzdF9hZGRyLCBOVUxMKSA+PSAwKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBodHRwX2xvZygiQ291bGQgbm90IG9wZW4gb3V0cHV0IHN0cmVhbSAnJXMvc3RyZWFtaWQ9JWQnXG4iLAotICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5maWxlbmFtZSwgc3RyZWFtX2luZGV4KTsKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBydHBfYy0+c3RhdGUgPSBIVFRQU1RBVEVfU0VORF9EQVRBOwotICAgIH0KLX0KLQotLyogbWFpbiBsb29wIG9mIHRoZSBIVFRQIHNlcnZlciAqLwotc3RhdGljIGludCBodHRwX3NlcnZlcih2b2lkKQotewotICAgIGludCBzZXJ2ZXJfZmQgPSAwLCBydHNwX3NlcnZlcl9mZCA9IDA7Ci0gICAgaW50IHJldCwgZGVsYXk7Ci0gICAgc3RydWN0IHBvbGxmZCAqcG9sbF90YWJsZSwgKnBvbGxfZW50cnk7Ci0gICAgSFRUUENvbnRleHQgKmMsICpjX25leHQ7Ci0KLSAgICBwb2xsX3RhYmxlID0gYXZfbWFsbG9jel9hcnJheShjb25maWcubmJfbWF4X2h0dHBfY29ubmVjdGlvbnMgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcG9sbF90YWJsZSkpOwotICAgIGlmKCFwb2xsX3RhYmxlKSB7Ci0gICAgICAgIGh0dHBfbG9nKCJJbXBvc3NpYmxlIHRvIGFsbG9jYXRlIGEgcG9sbCB0YWJsZSBoYW5kbGluZyAlZCAiCi0gICAgICAgICAgICAgICAgICJjb25uZWN0aW9ucy5cbiIsIGNvbmZpZy5uYl9tYXhfaHR0cF9jb25uZWN0aW9ucyk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBpZiAoY29uZmlnLmh0dHBfYWRkci5zaW5fcG9ydCkgewotICAgICAgICBzZXJ2ZXJfZmQgPSBzb2NrZXRfb3Blbl9saXN0ZW4oJmNvbmZpZy5odHRwX2FkZHIpOwotICAgICAgICBpZiAoc2VydmVyX2ZkIDwgMCkKLSAgICAgICAgICAgIGdvdG8gcXVpdDsKLSAgICB9Ci0KLSAgICBpZiAoY29uZmlnLnJ0c3BfYWRkci5zaW5fcG9ydCkgewotICAgICAgICBydHNwX3NlcnZlcl9mZCA9IHNvY2tldF9vcGVuX2xpc3RlbigmY29uZmlnLnJ0c3BfYWRkcik7Ci0gICAgICAgIGlmIChydHNwX3NlcnZlcl9mZCA8IDApIHsKLSAgICAgICAgICAgIGNsb3Nlc29ja2V0KHNlcnZlcl9mZCk7Ci0gICAgICAgICAgICBnb3RvIHF1aXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXJ0c3Bfc2VydmVyX2ZkICYmICFzZXJ2ZXJfZmQpIHsKLSAgICAgICAgaHR0cF9sb2coIkhUVFAgYW5kIFJUU1AgZGlzYWJsZWQuXG4iKTsKLSAgICAgICAgZ290byBxdWl0OwotICAgIH0KLQotICAgIGh0dHBfbG9nKCJGRnNlcnZlciBzdGFydGVkLlxuIik7Ci0KLSAgICBzdGFydF9jaGlsZHJlbihjb25maWcuZmlyc3RfZmVlZCk7Ci0KLSAgICBzdGFydF9tdWx0aWNhc3QoKTsKLQotICAgIGZvcig7OykgewotICAgICAgICBwb2xsX2VudHJ5ID0gcG9sbF90YWJsZTsKLSAgICAgICAgaWYgKHNlcnZlcl9mZCkgewotICAgICAgICAgICAgcG9sbF9lbnRyeS0+ZmQgPSBzZXJ2ZXJfZmQ7Ci0gICAgICAgICAgICBwb2xsX2VudHJ5LT5ldmVudHMgPSBQT0xMSU47Ci0gICAgICAgICAgICBwb2xsX2VudHJ5Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ0c3Bfc2VydmVyX2ZkKSB7Ci0gICAgICAgICAgICBwb2xsX2VudHJ5LT5mZCA9IHJ0c3Bfc2VydmVyX2ZkOwotICAgICAgICAgICAgcG9sbF9lbnRyeS0+ZXZlbnRzID0gUE9MTElOOwotICAgICAgICAgICAgcG9sbF9lbnRyeSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogd2FpdCBmb3IgZXZlbnRzIG9uIGVhY2ggSFRUUCBoYW5kbGUgKi8KLSAgICAgICAgYyA9IGZpcnN0X2h0dHBfY3R4OwotICAgICAgICBkZWxheSA9IDEwMDA7Ci0gICAgICAgIHdoaWxlIChjKSB7Ci0gICAgICAgICAgICBpbnQgZmQ7Ci0gICAgICAgICAgICBmZCA9IGMtPmZkOwotICAgICAgICAgICAgc3dpdGNoKGMtPnN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIEhUVFBTVEFURV9TRU5EX0hFQURFUjoKLSAgICAgICAgICAgIGNhc2UgUlRTUFNUQVRFX1NFTkRfUkVQTFk6Ci0gICAgICAgICAgICBjYXNlIFJUU1BTVEFURV9TRU5EX1BBQ0tFVDoKLSAgICAgICAgICAgICAgICBjLT5wb2xsX2VudHJ5ID0gcG9sbF9lbnRyeTsKLSAgICAgICAgICAgICAgICBwb2xsX2VudHJ5LT5mZCA9IGZkOwotICAgICAgICAgICAgICAgIHBvbGxfZW50cnktPmV2ZW50cyA9IFBPTExPVVQ7Ci0gICAgICAgICAgICAgICAgcG9sbF9lbnRyeSsrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBIVFRQU1RBVEVfU0VORF9EQVRBX0hFQURFUjoKLSAgICAgICAgICAgIGNhc2UgSFRUUFNUQVRFX1NFTkRfREFUQToKLSAgICAgICAgICAgIGNhc2UgSFRUUFNUQVRFX1NFTkRfREFUQV9UUkFJTEVSOgotICAgICAgICAgICAgICAgIGlmICghYy0+aXNfcGFja2V0aXplZCkgewotICAgICAgICAgICAgICAgICAgICAvKiBmb3IgVENQLCB3ZSBvdXRwdXQgYXMgbXVjaCBhcyB3ZSBjYW4KLSAgICAgICAgICAgICAgICAgICAgICogKG1heSBuZWVkIHRvIHB1dCBhIGxpbWl0KSAqLwotICAgICAgICAgICAgICAgICAgICBjLT5wb2xsX2VudHJ5ID0gcG9sbF9lbnRyeTsKLSAgICAgICAgICAgICAgICAgICAgcG9sbF9lbnRyeS0+ZmQgPSBmZDsKLSAgICAgICAgICAgICAgICAgICAgcG9sbF9lbnRyeS0+ZXZlbnRzID0gUE9MTE9VVDsKLSAgICAgICAgICAgICAgICAgICAgcG9sbF9lbnRyeSsrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gZmZzZXJ2ZXIgaXMgZG9pbmcgdGhlIHRpbWluZywgd2Ugd29yayBieQotICAgICAgICAgICAgICAgICAgICAgKiBsb29raW5nIGF0IHdoaWNoIHBhY2tldCBuZWVkcyB0byBiZSBzZW50IGV2ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAqIDEwIG1zIChvbmUgdGljayB3YWl0IFhYWDogMTAgbXMgYXNzdW1lZCkgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGF5ID4gMTApCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA9IDEwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSFRUUFNUQVRFX1dBSVRfUkVRVUVTVDoKLSAgICAgICAgICAgIGNhc2UgSFRUUFNUQVRFX1JFQ0VJVkVfREFUQToKLSAgICAgICAgICAgIGNhc2UgSFRUUFNUQVRFX1dBSVRfRkVFRDoKLSAgICAgICAgICAgIGNhc2UgUlRTUFNUQVRFX1dBSVRfUkVRVUVTVDoKLSAgICAgICAgICAgICAgICAvKiBuZWVkIHRvIGNhdGNoIGVycm9ycyAqLwotICAgICAgICAgICAgICAgIGMtPnBvbGxfZW50cnkgPSBwb2xsX2VudHJ5OwotICAgICAgICAgICAgICAgIHBvbGxfZW50cnktPmZkID0gZmQ7Ci0gICAgICAgICAgICAgICAgcG9sbF9lbnRyeS0+ZXZlbnRzID0gUE9MTElOOy8qIE1heWJlIHRoaXMgd2lsbCB3b3JrICovCi0gICAgICAgICAgICAgICAgcG9sbF9lbnRyeSsrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjLT5wb2xsX2VudHJ5ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGMgPSBjLT5uZXh0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogd2FpdCBmb3IgYW4gZXZlbnQgb24gb25lIGNvbm5lY3Rpb24uIFdlIHBvbGwgYXQgbGVhc3QgZXZlcnkKLSAgICAgICAgICogc2Vjb25kIHRvIGhhbmRsZSB0aW1lb3V0cyAqLwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXQgPSBwb2xsKHBvbGxfdGFibGUsIHBvbGxfZW50cnkgLSBwb2xsX3RhYmxlLCBkZWxheSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCAmJiBmZl9uZXRlcnJubygpICE9IEFWRVJST1IoRUFHQUlOKSAmJgotICAgICAgICAgICAgICAgIGZmX25ldGVycm5vKCkgIT0gQVZFUlJPUihFSU5UUikpIHsKLSAgICAgICAgICAgICAgICBnb3RvIHF1aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKHJldCA8IDApOwotCi0gICAgICAgIGN1cl90aW1lID0gYXZfZ2V0dGltZSgpIC8gMTAwMDsKLQotICAgICAgICBpZiAobmVlZF90b19zdGFydF9jaGlsZHJlbikgewotICAgICAgICAgICAgbmVlZF90b19zdGFydF9jaGlsZHJlbiA9IDA7Ci0gICAgICAgICAgICBzdGFydF9jaGlsZHJlbihjb25maWcuZmlyc3RfZmVlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgaGFuZGxlIHRoZSBldmVudHMgKi8KLSAgICAgICAgZm9yKGMgPSBmaXJzdF9odHRwX2N0eDsgYzsgYyA9IGNfbmV4dCkgewotICAgICAgICAgICAgY19uZXh0ID0gYy0+bmV4dDsKLSAgICAgICAgICAgIGlmIChoYW5kbGVfY29ubmVjdGlvbihjKSA8IDApIHsKLSAgICAgICAgICAgICAgICBsb2dfY29ubmVjdGlvbihjKTsKLSAgICAgICAgICAgICAgICAvKiBjbG9zZSBhbmQgZnJlZSB0aGUgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgIGNsb3NlX2Nvbm5lY3Rpb24oYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwb2xsX2VudHJ5ID0gcG9sbF90YWJsZTsKLSAgICAgICAgaWYgKHNlcnZlcl9mZCkgewotICAgICAgICAgICAgLyogbmV3IEhUVFAgY29ubmVjdGlvbiByZXF1ZXN0ID8gKi8KLSAgICAgICAgICAgIGlmIChwb2xsX2VudHJ5LT5yZXZlbnRzICYgUE9MTElOKQotICAgICAgICAgICAgICAgIG5ld19jb25uZWN0aW9uKHNlcnZlcl9mZCwgMCk7Ci0gICAgICAgICAgICBwb2xsX2VudHJ5Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJ0c3Bfc2VydmVyX2ZkKSB7Ci0gICAgICAgICAgICAvKiBuZXcgUlRTUCBjb25uZWN0aW9uIHJlcXVlc3QgPyAqLwotICAgICAgICAgICAgaWYgKHBvbGxfZW50cnktPnJldmVudHMgJiBQT0xMSU4pCi0gICAgICAgICAgICAgICAgbmV3X2Nvbm5lY3Rpb24ocnRzcF9zZXJ2ZXJfZmQsIDEpOwotICAgICAgICB9Ci0gICAgfQotCi1xdWl0OgotICAgIGF2X2ZyZWUocG9sbF90YWJsZSk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKiBzdGFydCB3YWl0aW5nIGZvciBhIG5ldyBIVFRQL1JUU1AgcmVxdWVzdCAqLwotc3RhdGljIHZvaWQgc3RhcnRfd2FpdF9yZXF1ZXN0KEhUVFBDb250ZXh0ICpjLCBpbnQgaXNfcnRzcCkKLXsKLSAgICBjLT5idWZmZXJfcHRyID0gYy0+YnVmZmVyOwotICAgIGMtPmJ1ZmZlcl9lbmQgPSBjLT5idWZmZXIgKyBjLT5idWZmZXJfc2l6ZSAtIDE7IC8qIGxlYXZlIHJvb20gZm9yICdcMCcgKi8KLQotICAgIGMtPnN0YXRlID0gaXNfcnRzcCA/IFJUU1BTVEFURV9XQUlUX1JFUVVFU1QgOiBIVFRQU1RBVEVfV0FJVF9SRVFVRVNUOwotICAgIGMtPnRpbWVvdXQgPSBjdXJfdGltZSArCi0gICAgICAgICAgICAgICAgIChpc19ydHNwID8gUlRTUF9SRVFVRVNUX1RJTUVPVVQgOiBIVFRQX1JFUVVFU1RfVElNRU9VVCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGh0dHBfc2VuZF90b29fYnVzeV9yZXBseShpbnQgZmQpCi17Ci0gICAgY2hhciBidWZmZXJbNDAwXTsKLSAgICBpbnQgbGVuID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIkhUVFAvMS4wIDUwMyBTZXJ2ZXIgdG9vIGJ1c3lcclxuIgotICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcclxuIgotICAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sPlxuIgotICAgICAgICAgICAgICAgICAgICAgICAiPGh0bWw+PGhlYWQ+PHRpdGxlPlRvbyBidXN5PC90aXRsZT48L2hlYWQ+PGJvZHk+XHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIjxwPlRoZSBzZXJ2ZXIgaXMgdG9vIGJ1c3kgdG8gc2VydmUgeW91ciByZXF1ZXN0IGF0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgInRoaXMgdGltZS48L3A+XHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIjxwPlRoZSBudW1iZXIgb2YgY3VycmVudCBjb25uZWN0aW9ucyBpcyAldSwgYW5kIHRoaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAiZXhjZWVkcyB0aGUgbGltaXQgb2YgJXUuPC9wPlxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICI8L2JvZHk+PC9odG1sPlxyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBuYl9jb25uZWN0aW9ucywgY29uZmlnLm5iX21heF9jb25uZWN0aW9ucyk7Ci0gICAgYXZfYXNzZXJ0MChsZW4gPCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgaWYgKHNlbmQoZmQsIGJ1ZmZlciwgbGVuLCAwKSA8IGxlbikKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzZW5kIHRvby1idXN5IHJlcGx5LCBzZW5kKCkgZmFpbGVkXG4iKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBuZXdfY29ubmVjdGlvbihpbnQgc2VydmVyX2ZkLCBpbnQgaXNfcnRzcCkKLXsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbV9hZGRyOwotICAgIHNvY2tsZW5fdCBsZW47Ci0gICAgaW50IGZkOwotICAgIEhUVFBDb250ZXh0ICpjID0gTlVMTDsKLQotICAgIGxlbiA9IHNpemVvZihmcm9tX2FkZHIpOwotICAgIGZkID0gYWNjZXB0KHNlcnZlcl9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZmcm9tX2FkZHIsCi0gICAgICAgICAgICAgICAgJmxlbik7Ci0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBodHRwX2xvZygiZXJyb3IgZHVyaW5nIGFjY2VwdCAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZmZfc29ja2V0X25vbmJsb2NrKGZkLCAxKSA8IDApCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgImZmX3NvY2tldF9ub25ibG9jayBmYWlsZWRcbiIpOwotCi0gICAgaWYgKG5iX2Nvbm5lY3Rpb25zID49IGNvbmZpZy5uYl9tYXhfY29ubmVjdGlvbnMpIHsKLSAgICAgICAgaHR0cF9zZW5kX3Rvb19idXN5X3JlcGx5KGZkKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIC8qIGFkZCBhIG5ldyBjb25uZWN0aW9uICovCi0gICAgYyA9IGF2X21hbGxvY3ooc2l6ZW9mKEhUVFBDb250ZXh0KSk7Ci0gICAgaWYgKCFjKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBjLT5mZCA9IGZkOwotICAgIGMtPnBvbGxfZW50cnkgPSBOVUxMOwotICAgIGMtPmZyb21fYWRkciA9IGZyb21fYWRkcjsKLSAgICBjLT5idWZmZXJfc2l6ZSA9IElPQlVGRkVSX0lOSVRfU0laRTsKLSAgICBjLT5idWZmZXIgPSBhdl9tYWxsb2MoYy0+YnVmZmVyX3NpemUpOwotICAgIGlmICghYy0+YnVmZmVyKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBjLT5uZXh0ID0gZmlyc3RfaHR0cF9jdHg7Ci0gICAgZmlyc3RfaHR0cF9jdHggPSBjOwotICAgIG5iX2Nvbm5lY3Rpb25zKys7Ci0KLSAgICBzdGFydF93YWl0X3JlcXVlc3QoYywgaXNfcnRzcCk7Ci0KLSAgICByZXR1cm47Ci0KLSBmYWlsOgotICAgIGlmIChjKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZjLT5idWZmZXIpOwotICAgICAgICBhdl9mcmVlKGMpOwotICAgIH0KLSAgICBjbG9zZXNvY2tldChmZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNsb3NlX2Nvbm5lY3Rpb24oSFRUUENvbnRleHQgKmMpCi17Ci0gICAgSFRUUENvbnRleHQgKipjcCwgKmMxOwotICAgIGludCBpLCBuYl9zdHJlYW1zOwotICAgIEFWRm9ybWF0Q29udGV4dCAqY3R4OwotICAgIEFWU3RyZWFtICpzdDsKLQotICAgIC8qIHJlbW92ZSBjb25uZWN0aW9uIGZyb20gbGlzdCAqLwotICAgIGNwID0gJmZpcnN0X2h0dHBfY3R4OwotICAgIHdoaWxlICgqY3ApIHsKLSAgICAgICAgYzEgPSAqY3A7Ci0gICAgICAgIGlmIChjMSA9PSBjKQotICAgICAgICAgICAgKmNwID0gYy0+bmV4dDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgY3AgPSAmYzEtPm5leHQ7Ci0gICAgfQotCi0gICAgLyogcmVtb3ZlIHJlZmVyZW5jZXMsIGlmIGFueSAoWFhYOiBkbyBpdCBmYXN0ZXIpICovCi0gICAgZm9yKGMxID0gZmlyc3RfaHR0cF9jdHg7IGMxOyBjMSA9IGMxLT5uZXh0KSB7Ci0gICAgICAgIGlmIChjMS0+cnRzcF9jID09IGMpCi0gICAgICAgICAgICBjMS0+cnRzcF9jID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiByZW1vdmUgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHJlc291cmNlcyAqLwotICAgIGlmIChjLT5mZCA+PSAwKQotICAgICAgICBjbG9zZXNvY2tldChjLT5mZCk7Ci0gICAgaWYgKGMtPmZtdF9pbikgewotICAgICAgICAvKiBjbG9zZSBlYWNoIGZyYW1lIHBhcnNlciAqLwotICAgICAgICBmb3IoaT0wO2k8Yy0+Zm10X2luLT5uYl9zdHJlYW1zO2krKykgewotICAgICAgICAgICAgc3QgPSBjLT5mbXRfaW4tPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlYykKLSAgICAgICAgICAgICAgICBhdmNvZGVjX2Nsb3NlKHN0LT5jb2RlYyk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmMtPmZtdF9pbik7Ci0gICAgfQotCi0gICAgLyogZnJlZSBSVFAgb3V0cHV0IHN0cmVhbXMgaWYgYW55ICovCi0gICAgbmJfc3RyZWFtcyA9IDA7Ci0gICAgaWYgKGMtPnN0cmVhbSkKLSAgICAgICAgbmJfc3RyZWFtcyA9IGMtPnN0cmVhbS0+bmJfc3RyZWFtczsKLQotICAgIGZvcihpPTA7aTxuYl9zdHJlYW1zO2krKykgewotICAgICAgICBjdHggPSBjLT5ydHBfY3R4W2ldOwotICAgICAgICBpZiAoY3R4KSB7Ci0gICAgICAgICAgICBhdl93cml0ZV90cmFpbGVyKGN0eCk7Ci0gICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmN0eC0+bWV0YWRhdGEpOwotICAgICAgICAgICAgYXZfZnJlZXAoJmN0eC0+c3RyZWFtc1swXSk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmY3R4KTsKLSAgICAgICAgfQotICAgICAgICBmZnVybF9jbG9zZShjLT5ydHBfaGFuZGxlc1tpXSk7Ci0gICAgfQotCi0gICAgY3R4ID0gJmMtPmZtdF9jdHg7Ci0KLSAgICBpZiAoIWMtPmxhc3RfcGFja2V0X3NlbnQgJiYgYy0+c3RhdGUgPT0gSFRUUFNUQVRFX1NFTkRfREFUQV9UUkFJTEVSKSB7Ci0gICAgICAgIC8qIHByZXBhcmUgaGVhZGVyICovCi0gICAgICAgIGlmIChjdHgtPm9mb3JtYXQgJiYgYXZpb19vcGVuX2R5bl9idWYoJmN0eC0+cGIpID49IDApIHsKLSAgICAgICAgICAgIGF2X3dyaXRlX3RyYWlsZXIoY3R4KTsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZjLT5wYl9idWZmZXIpOwotICAgICAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKGN0eC0+cGIsICZjLT5wYl9idWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTxjdHgtPm5iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgYXZfZnJlZXAoJmN0eC0+c3RyZWFtc1tpXSk7Ci0gICAgYXZfZnJlZXAoJmN0eC0+c3RyZWFtcyk7Ci0gICAgYXZfZnJlZXAoJmN0eC0+cHJpdl9kYXRhKTsKLQotICAgIGlmIChjLT5zdHJlYW0gJiYgIWMtPnBvc3QgJiYgYy0+c3RyZWFtLT5zdHJlYW1fdHlwZSA9PSBTVFJFQU1fVFlQRV9MSVZFKQotICAgICAgICBjdXJyZW50X2JhbmR3aWR0aCAtPSBjLT5zdHJlYW0tPmJhbmR3aWR0aDsKLQotICAgIC8qIHNpZ25hbCB0aGF0IHRoZXJlIGlzIG5vIGZlZWQgaWYgd2UgYXJlIHRoZSBmZWVkZXIgc29ja2V0ICovCi0gICAgaWYgKGMtPnN0YXRlID09IEhUVFBTVEFURV9SRUNFSVZFX0RBVEEgJiYgYy0+c3RyZWFtKSB7Ci0gICAgICAgIGMtPnN0cmVhbS0+ZmVlZF9vcGVuZWQgPSAwOwotICAgICAgICBjbG9zZShjLT5mZWVkX2ZkKTsKLSAgICB9Ci0KLSAgICBhdl9mcmVlcCgmYy0+cGJfYnVmZmVyKTsKLSAgICBhdl9mcmVlcCgmYy0+cGFja2V0X2J1ZmZlcik7Ci0gICAgYXZfZnJlZXAoJmMtPmJ1ZmZlcik7Ci0gICAgYXZfZnJlZShjKTsKLSAgICBuYl9jb25uZWN0aW9ucy0tOwotfQotCi1zdGF0aWMgaW50IGhhbmRsZV9jb25uZWN0aW9uKEhUVFBDb250ZXh0ICpjKQotewotICAgIGludCBsZW4sIHJldDsKLSAgICB1aW50OF90ICpwdHI7Ci0KLSAgICBzd2l0Y2goYy0+c3RhdGUpIHsKLSAgICBjYXNlIEhUVFBTVEFURV9XQUlUX1JFUVVFU1Q6Ci0gICAgY2FzZSBSVFNQU1RBVEVfV0FJVF9SRVFVRVNUOgotICAgICAgICAvKiB0aW1lb3V0ID8gKi8KLSAgICAgICAgaWYgKChjLT50aW1lb3V0IC0gY3VyX3RpbWUpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGMtPnBvbGxfZW50cnktPnJldmVudHMgJiAoUE9MTEVSUiB8IFBPTExIVVApKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIC8qIG5vIG5lZWQgdG8gcmVhZCBpZiBubyBldmVudHMgKi8KLSAgICAgICAgaWYgKCEoYy0+cG9sbF9lbnRyeS0+cmV2ZW50cyAmIFBPTExJTikpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgLyogcmVhZCB0aGUgZGF0YSAqLwotICAgIHJlYWRfbG9vcDoKLSAgICAgICAgaWYgKCEobGVuID0gcmVjdihjLT5mZCwgYy0+YnVmZmVyX3B0ciwgMSwgMCkpKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgICAgICBpZiAoZmZfbmV0ZXJybm8oKSAhPSBBVkVSUk9SKEVBR0FJTikgJiYKLSAgICAgICAgICAgICAgICBmZl9uZXRlcnJubygpICE9IEFWRVJST1IoRUlOVFIpKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8qIHNlYXJjaCBmb3IgZW5kIG9mIHJlcXVlc3QuICovCi0gICAgICAgIGMtPmJ1ZmZlcl9wdHIgKz0gbGVuOwotICAgICAgICBwdHIgPSBjLT5idWZmZXJfcHRyOwotICAgICAgICBpZiAoKHB0ciA+PSBjLT5idWZmZXIgKyAyICYmICFtZW1jbXAocHRyLTIsICJcblxuIiwgMikpIHx8Ci0gICAgICAgICAgICAocHRyID49IGMtPmJ1ZmZlciArIDQgJiYgIW1lbWNtcChwdHItNCwgIlxyXG5cclxuIiwgNCkpKSB7Ci0gICAgICAgICAgICAvKiByZXF1ZXN0IGZvdW5kIDogcGFyc2UgaXQgYW5kIHJlcGx5ICovCi0gICAgICAgICAgICBpZiAoYy0+c3RhdGUgPT0gSFRUUFNUQVRFX1dBSVRfUkVRVUVTVCkKLSAgICAgICAgICAgICAgICByZXQgPSBodHRwX3BhcnNlX3JlcXVlc3QoYyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0ID0gcnRzcF9wYXJzZV9yZXF1ZXN0KGMpOwotCi0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0gZWxzZSBpZiAocHRyID49IGMtPmJ1ZmZlcl9lbmQpIHsKLSAgICAgICAgICAgIC8qIHJlcXVlc3QgdG9vIGxvbmc6IGNhbm5vdCBkbyBhbnl0aGluZyAqLwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9IGVsc2UgZ290byByZWFkX2xvb3A7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhUVFBTVEFURV9TRU5EX0hFQURFUjoKLSAgICAgICAgaWYgKGMtPnBvbGxfZW50cnktPnJldmVudHMgJiAoUE9MTEVSUiB8IFBPTExIVVApKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIC8qIG5vIG5lZWQgdG8gd3JpdGUgaWYgbm8gZXZlbnRzICovCi0gICAgICAgIGlmICghKGMtPnBvbGxfZW50cnktPnJldmVudHMgJiBQT0xMT1VUKSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBsZW4gPSBzZW5kKGMtPmZkLCBjLT5idWZmZXJfcHRyLCBjLT5idWZmZXJfZW5kIC0gYy0+YnVmZmVyX3B0ciwgMCk7Ci0gICAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgICAgICBpZiAoZmZfbmV0ZXJybm8oKSAhPSBBVkVSUk9SKEVBR0FJTikgJiYKLSAgICAgICAgICAgICAgICBmZl9uZXRlcnJubygpICE9IEFWRVJST1IoRUlOVFIpKSB7Ci0gICAgICAgICAgICAgICAgZ290byBjbG9zZV9jb25uZWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYy0+YnVmZmVyX3B0ciArPSBsZW47Ci0gICAgICAgIGlmIChjLT5zdHJlYW0pCi0gICAgICAgICAgICBjLT5zdHJlYW0tPmJ5dGVzX3NlcnZlZCArPSBsZW47Ci0gICAgICAgIGMtPmRhdGFfY291bnQgKz0gbGVuOwotICAgICAgICBpZiAoYy0+YnVmZmVyX3B0ciA+PSBjLT5idWZmZXJfZW5kKSB7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmYy0+cGJfYnVmZmVyKTsKLSAgICAgICAgICAgIC8qIGlmIGVycm9yLCBleGl0ICovCi0gICAgICAgICAgICBpZiAoYy0+aHR0cF9lcnJvcikKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAvKiBhbGwgdGhlIGJ1ZmZlciB3YXMgc2VudCA6IHN5bmNocm9uaXplIHRvIHRoZSBpbmNvbWluZwotICAgICAgICAgICAgICogc3RyZWFtICovCi0gICAgICAgICAgICBjLT5zdGF0ZSA9IEhUVFBTVEFURV9TRU5EX0RBVEFfSEVBREVSOwotICAgICAgICAgICAgYy0+YnVmZmVyX3B0ciA9IGMtPmJ1ZmZlcl9lbmQgPSBjLT5idWZmZXI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEhUVFBTVEFURV9TRU5EX0RBVEE6Ci0gICAgY2FzZSBIVFRQU1RBVEVfU0VORF9EQVRBX0hFQURFUjoKLSAgICBjYXNlIEhUVFBTVEFURV9TRU5EX0RBVEFfVFJBSUxFUjoKLSAgICAgICAgLyogZm9yIHBhY2tldGl6ZWQgb3V0cHV0LCB3ZSBjb25zaWRlciB3ZSBjYW4gYWx3YXlzIHdyaXRlICh0aGUKLSAgICAgICAgICogaW5wdXQgc3RyZWFtcyBzZXQgdGhlIHNwZWVkKS4gSXQgbWF5IGJlIGJldHRlciB0byB2ZXJpZnkKLSAgICAgICAgICogdGhhdCB3ZSBkbyBub3QgcmVseSB0b28gbXVjaCBvbiB0aGUga2VybmVsIHF1ZXVlcyAqLwotICAgICAgICBpZiAoIWMtPmlzX3BhY2tldGl6ZWQpIHsKLSAgICAgICAgICAgIGlmIChjLT5wb2xsX2VudHJ5LT5yZXZlbnRzICYgKFBPTExFUlIgfCBQT0xMSFVQKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgICAgIC8qIG5vIG5lZWQgdG8gcmVhZCBpZiBubyBldmVudHMgKi8KLSAgICAgICAgICAgIGlmICghKGMtPnBvbGxfZW50cnktPnJldmVudHMgJiBQT0xMT1VUKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaHR0cF9zZW5kX2RhdGEoYykgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAvKiBjbG9zZSBjb25uZWN0aW9uIGlmIHRyYWlsZXIgc2VudCAqLwotICAgICAgICBpZiAoYy0+c3RhdGUgPT0gSFRUUFNUQVRFX1NFTkRfREFUQV9UUkFJTEVSKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAvKiBDaGVjayBpZiBpdCBpcyBhIHNpbmdsZSBqcGVnIGZyYW1lIDEyMyAqLwotICAgICAgICBpZiAoYy0+c3RyZWFtLT5zaW5nbGVfZnJhbWUgJiYgYy0+ZGF0YV9jb3VudCA+IGMtPmN1cl9mcmFtZV9ieXRlcyAmJiBjLT5jdXJfZnJhbWVfYnl0ZXMgPiAwKSB7Ci0gICAgICAgICAgICBjbG9zZV9jb25uZWN0aW9uKGMpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSFRUUFNUQVRFX1JFQ0VJVkVfREFUQToKLSAgICAgICAgLyogbm8gbmVlZCB0byByZWFkIGlmIG5vIGV2ZW50cyAqLwotICAgICAgICBpZiAoYy0+cG9sbF9lbnRyeS0+cmV2ZW50cyAmIChQT0xMRVJSIHwgUE9MTEhVUCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmICghKGMtPnBvbGxfZW50cnktPnJldmVudHMgJiBQT0xMSU4pKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGlmIChodHRwX3JlY2VpdmVfZGF0YShjKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSFRUUFNUQVRFX1dBSVRfRkVFRDoKLSAgICAgICAgLyogbm8gbmVlZCB0byByZWFkIGlmIG5vIGV2ZW50cyAqLwotICAgICAgICBpZiAoYy0+cG9sbF9lbnRyeS0+cmV2ZW50cyAmIChQT0xMSU4gfCBQT0xMRVJSIHwgUE9MTEhVUCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgICAgLyogbm90aGluZyB0byBkbywgd2UnbGwgYmUgd2FrZW4gdXAgYnkgaW5jb21pbmcgZmVlZCBwYWNrZXRzICovCi0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBSVFNQU1RBVEVfU0VORF9SRVBMWToKLSAgICAgICAgaWYgKGMtPnBvbGxfZW50cnktPnJldmVudHMgJiAoUE9MTEVSUiB8IFBPTExIVVApKQotICAgICAgICAgICAgZ290byBjbG9zZV9jb25uZWN0aW9uOwotICAgICAgICAvKiBubyBuZWVkIHRvIHdyaXRlIGlmIG5vIGV2ZW50cyAqLwotICAgICAgICBpZiAoIShjLT5wb2xsX2VudHJ5LT5yZXZlbnRzICYgUE9MTE9VVCkpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgbGVuID0gc2VuZChjLT5mZCwgYy0+YnVmZmVyX3B0ciwgYy0+YnVmZmVyX2VuZCAtIGMtPmJ1ZmZlcl9wdHIsIDApOwotICAgICAgICBpZiAobGVuIDwgMCkgewotICAgICAgICAgICAgaWYgKGZmX25ldGVycm5vKCkgIT0gQVZFUlJPUihFQUdBSU4pICYmCi0gICAgICAgICAgICAgICAgZmZfbmV0ZXJybm8oKSAhPSBBVkVSUk9SKEVJTlRSKSkgewotICAgICAgICAgICAgICAgIGdvdG8gY2xvc2VfY29ubmVjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGMtPmJ1ZmZlcl9wdHIgKz0gbGVuOwotICAgICAgICBjLT5kYXRhX2NvdW50ICs9IGxlbjsKLSAgICAgICAgaWYgKGMtPmJ1ZmZlcl9wdHIgPj0gYy0+YnVmZmVyX2VuZCkgewotICAgICAgICAgICAgLyogYWxsIHRoZSBidWZmZXIgd2FzIHNlbnQgOiB3YWl0IGZvciBhIG5ldyByZXF1ZXN0ICovCi0gICAgICAgICAgICBhdl9mcmVlcCgmYy0+cGJfYnVmZmVyKTsKLSAgICAgICAgICAgIHN0YXJ0X3dhaXRfcmVxdWVzdChjLCAxKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJUU1BTVEFURV9TRU5EX1BBQ0tFVDoKLSAgICAgICAgaWYgKGMtPnBvbGxfZW50cnktPnJldmVudHMgJiAoUE9MTEVSUiB8IFBPTExIVVApKSB7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmYy0+cGFja2V0X2J1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogbm8gbmVlZCB0byB3cml0ZSBpZiBubyBldmVudHMgKi8KLSAgICAgICAgaWYgKCEoYy0+cG9sbF9lbnRyeS0+cmV2ZW50cyAmIFBPTExPVVQpKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGxlbiA9IHNlbmQoYy0+ZmQsIGMtPnBhY2tldF9idWZmZXJfcHRyLAotICAgICAgICAgICAgICAgICAgICBjLT5wYWNrZXRfYnVmZmVyX2VuZCAtIGMtPnBhY2tldF9idWZmZXJfcHRyLCAwKTsKLSAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgIGlmIChmZl9uZXRlcnJubygpICE9IEFWRVJST1IoRUFHQUlOKSAmJgotICAgICAgICAgICAgICAgIGZmX25ldGVycm5vKCkgIT0gQVZFUlJPUihFSU5UUikpIHsKLSAgICAgICAgICAgICAgICAvKiBlcnJvciA6IGNsb3NlIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBhdl9mcmVlcCgmYy0+cGFja2V0X2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYy0+cGFja2V0X2J1ZmZlcl9wdHIgKz0gbGVuOwotICAgICAgICBpZiAoYy0+cGFja2V0X2J1ZmZlcl9wdHIgPj0gYy0+cGFja2V0X2J1ZmZlcl9lbmQpIHsKLSAgICAgICAgICAgIC8qIGFsbCB0aGUgYnVmZmVyIHdhcyBzZW50IDogd2FpdCBmb3IgYSBuZXcgcmVxdWVzdCAqLwotICAgICAgICAgICAgYXZfZnJlZXAoJmMtPnBhY2tldF9idWZmZXIpOwotICAgICAgICAgICAgYy0+c3RhdGUgPSBSVFNQU1RBVEVfV0FJVF9SRVFVRVNUOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgSFRUUFNUQVRFX1JFQURZOgotICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci0KLWNsb3NlX2Nvbm5lY3Rpb246Ci0gICAgYXZfZnJlZXAoJmMtPnBiX2J1ZmZlcik7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGV4dHJhY3RfcmF0ZXMoY2hhciAqcmF0ZXMsIGludCByYXRlbGVuLCBjb25zdCBjaGFyICpyZXF1ZXN0KQotewotICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICBmb3IgKHAgPSByZXF1ZXN0OyAqcCAmJiAqcCAhPSAnXHInICYmICpwICE9ICdcbic7ICkgewotICAgICAgICBpZiAoYXZfc3RybmNhc2VjbXAocCwgIlByYWdtYToiLCA3KSA9PSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpxID0gcCArIDc7Ci0KLSAgICAgICAgICAgIHdoaWxlICgqcSAmJiAqcSAhPSAnXG4nICYmIGF2X2lzc3BhY2UoKnEpKQotICAgICAgICAgICAgICAgIHErKzsKLQotICAgICAgICAgICAgaWYgKGF2X3N0cm5jYXNlY21wKHEsICJzdHJlYW0tc3dpdGNoLWVudHJ5PSIsIDIwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0cmVhbV9ubzsKLSAgICAgICAgICAgICAgICBpbnQgcmF0ZV9ubzsKLQotICAgICAgICAgICAgICAgIHEgKz0gMjA7Ci0KLSAgICAgICAgICAgICAgICBtZW1zZXQocmF0ZXMsIDB4ZmYsIHJhdGVsZW4pOwotCi0gICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpxICYmICpxICE9ICdcbicgJiYgKnEgIT0gJzonKQotICAgICAgICAgICAgICAgICAgICAgICAgcSsrOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChzc2NhbmYocSwgIjolZDolZCIsICZzdHJlYW1fbm8sICZyYXRlX25vKSAhPSAyKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtX25vLS07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1fbm8gPCByYXRlbGVuICYmIHN0cmVhbV9ubyA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZXNbc3RyZWFtX25vXSA9IHJhdGVfbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCpxICYmICpxICE9ICdcbicgJiYgIWF2X2lzc3BhY2UoKnEpKQotICAgICAgICAgICAgICAgICAgICAgICAgcSsrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHAgPSBzdHJjaHIocCwgJ1xuJyk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmaW5kX3N0cmVhbV9pbl9mZWVkKEZGU2VydmVyU3RyZWFtICpmZWVkLCBBVkNvZGVjQ29udGV4dCAqY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdF9yYXRlKQotewotICAgIGludCBpOwotICAgIGludCBiZXN0X2JpdHJhdGUgPSAxMDAwMDAwMDA7Ci0gICAgaW50IGJlc3QgPSAtMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBmZWVkLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmZlZWRfY29kZWMgPSBmZWVkLT5zdHJlYW1zW2ldLT5jb2RlYzsKLQotICAgICAgICBpZiAoZmVlZF9jb2RlYy0+Y29kZWNfaWQgIT0gY29kZWMtPmNvZGVjX2lkIHx8Ci0gICAgICAgICAgICBmZWVkX2NvZGVjLT5zYW1wbGVfcmF0ZSAhPSBjb2RlYy0+c2FtcGxlX3JhdGUgfHwKLSAgICAgICAgICAgIGZlZWRfY29kZWMtPndpZHRoICE9IGNvZGVjLT53aWR0aCB8fAotICAgICAgICAgICAgZmVlZF9jb2RlYy0+aGVpZ2h0ICE9IGNvZGVjLT5oZWlnaHQpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBQb3RlbnRpYWwgc3RyZWFtICovCi0KLSAgICAgICAgLyogV2Ugd2FudCB0aGUgZmFzdGVzdCBzdHJlYW0gbGVzcyB0aGFuIGJpdF9yYXRlLCBvciB0aGUgc2xvd2VzdAotICAgICAgICAgKiBmYXN0ZXIgdGhhbiBiaXRfcmF0ZQotICAgICAgICAgKi8KLQotICAgICAgICBpZiAoZmVlZF9jb2RlYy0+Yml0X3JhdGUgPD0gYml0X3JhdGUpIHsKLSAgICAgICAgICAgIGlmIChiZXN0X2JpdHJhdGUgPiBiaXRfcmF0ZSB8fAotICAgICAgICAgICAgICAgIGZlZWRfY29kZWMtPmJpdF9yYXRlID4gYmVzdF9iaXRyYXRlKSB7Ci0gICAgICAgICAgICAgICAgYmVzdF9iaXRyYXRlID0gZmVlZF9jb2RlYy0+Yml0X3JhdGU7Ci0gICAgICAgICAgICAgICAgYmVzdCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZmVlZF9jb2RlYy0+Yml0X3JhdGUgPCBiZXN0X2JpdHJhdGUpIHsKLSAgICAgICAgICAgIGJlc3RfYml0cmF0ZSA9IGZlZWRfY29kZWMtPmJpdF9yYXRlOwotICAgICAgICAgICAgYmVzdCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJlc3Q7Ci19Ci0KLXN0YXRpYyBpbnQgbW9kaWZ5X2N1cnJlbnRfc3RyZWFtKEhUVFBDb250ZXh0ICpjLCBjaGFyICpyYXRlcykKLXsKLSAgICBpbnQgaTsKLSAgICBGRlNlcnZlclN0cmVhbSAqcmVxID0gYy0+c3RyZWFtOwotICAgIGludCBhY3Rpb25fcmVxdWlyZWQgPSAwOwotCi0gICAgLyogTm90IG11Y2ggd2UgY2FuIGRvIGZvciBhIGZlZWQgKi8KLSAgICBpZiAoIXJlcS0+ZmVlZCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcmVxLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcmVxLT5zdHJlYW1zW2ldLT5jb2RlYzsKLQotICAgICAgICBzd2l0Y2gocmF0ZXNbaV0pIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBjLT5zd2l0Y2hfZmVlZF9zdHJlYW1zW2ldID0gcmVxLT5mZWVkX3N0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgYy0+c3dpdGNoX2ZlZWRfc3RyZWFtc1tpXSA9IGZpbmRfc3RyZWFtX2luX2ZlZWQocmVxLT5mZWVkLCBjb2RlYywgY29kZWMtPmJpdF9yYXRlIC8gMik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgLyogV2FudHMgb2ZmIG9yIHNsb3cgKi8KLSAgICAgICAgICAgICAgICBjLT5zd2l0Y2hfZmVlZF9zdHJlYW1zW2ldID0gZmluZF9zdHJlYW1faW5fZmVlZChyZXEtPmZlZWQsIGNvZGVjLCBjb2RlYy0+Yml0X3JhdGUgLyA0KTsKLSNpZmRlZiBXQU5UU19PRkYKLSAgICAgICAgICAgICAgICAvKiBUaGlzIGRvZXNuJ3Qgd29yayB3ZWxsIHdoZW4gaXQgdHVybnMgb2ZmIHRoZSBvbmx5IHN0cmVhbSEgKi8KLSAgICAgICAgICAgICAgICBjLT5zd2l0Y2hfZmVlZF9zdHJlYW1zW2ldID0gLTI7Ci0gICAgICAgICAgICAgICAgYy0+ZmVlZF9zdHJlYW1zW2ldID0gLTI7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjLT5zd2l0Y2hfZmVlZF9zdHJlYW1zW2ldID49IDAgJiYKLSAgICAgICAgICAgIGMtPnN3aXRjaF9mZWVkX3N0cmVhbXNbaV0gIT0gYy0+ZmVlZF9zdHJlYW1zW2ldKSB7Ci0gICAgICAgICAgICBhY3Rpb25fcmVxdWlyZWQgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGFjdGlvbl9yZXF1aXJlZDsKLX0KLQotc3RhdGljIHZvaWQgZ2V0X3dvcmQoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKipwcCkKLXsKLSAgICBjb25zdCBjaGFyICpwOwotICAgIGNoYXIgKnE7Ci0KLSAgICBwID0gKnBwOwotICAgIHAgKz0gc3Ryc3BuKHAsIFNQQUNFX0NIQVJTKTsKLSAgICBxID0gYnVmOwotICAgIHdoaWxlICghYXZfaXNzcGFjZSgqcCkgJiYgKnAgIT0gJ1wwJykgewotICAgICAgICBpZiAoKHEgLSBidWYpIDwgYnVmX3NpemUgLSAxKQotICAgICAgICAgICAgKnErKyA9ICpwOwotICAgICAgICBwKys7Ci0gICAgfQotICAgIGlmIChidWZfc2l6ZSA+IDApCi0gICAgICAgICpxID0gJ1wwJzsKLSAgICAqcHAgPSBwOwotfQotCi1zdGF0aWMgRkZTZXJ2ZXJJUEFkZHJlc3NBQ0wqIHBhcnNlX2R5bmFtaWNfYWNsKEZGU2VydmVyU3RyZWFtICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBDb250ZXh0ICpjKQotewotICAgIEZJTEUqIGY7Ci0gICAgY2hhciBsaW5lWzEwMjRdOwotICAgIGNoYXIgIGNtZFsxMDI0XTsKLSAgICBGRlNlcnZlcklQQWRkcmVzc0FDTCAqYWNsID0gTlVMTDsKLSAgICBpbnQgbGluZV9udW0gPSAwOwotICAgIGNvbnN0IGNoYXIgKnA7Ci0KLSAgICBmID0gZm9wZW4oc3RyZWFtLT5keW5hbWljX2FjbCwgInIiKTsKLSAgICBpZiAoIWYpIHsKLSAgICAgICAgcGVycm9yKHN0cmVhbS0+ZHluYW1pY19hY2wpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBhY2wgPSBhdl9tYWxsb2N6KHNpemVvZihGRlNlcnZlcklQQWRkcmVzc0FDTCkpOwotICAgIGlmICghYWNsKSB7Ci0gICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogQnVpbGQgQUNMICovCi0gICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikpIHsKLSAgICAgICAgbGluZV9udW0rKzsKLSAgICAgICAgcCA9IGxpbmU7Ci0gICAgICAgIHdoaWxlIChhdl9pc3NwYWNlKCpwKSkKLSAgICAgICAgICAgIHArKzsKLSAgICAgICAgaWYgKCpwID09ICdcMCcgfHwgKnAgPT0gJyMnKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoY21kLCBzaXplb2YoY21kKSwgJnApOwotCi0gICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJBQ0wiKSkKLSAgICAgICAgICAgIGZmc2VydmVyX3BhcnNlX2FjbF9yb3coTlVMTCwgTlVMTCwgYWNsLCBwLCBzdHJlYW0tPmR5bmFtaWNfYWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bSk7Ci0gICAgfQotICAgIGZjbG9zZShmKTsKLSAgICByZXR1cm4gYWNsOwotfQotCi0KLXN0YXRpYyB2b2lkIGZyZWVfYWNsX2xpc3QoRkZTZXJ2ZXJJUEFkZHJlc3NBQ0wgKmluX2FjbCkKLXsKLSAgICBGRlNlcnZlcklQQWRkcmVzc0FDTCAqcGFjbCwgKnBhY2wyOwotCi0gICAgcGFjbCA9IGluX2FjbDsKLSAgICB3aGlsZShwYWNsKSB7Ci0gICAgICAgIHBhY2wyID0gcGFjbDsKLSAgICAgICAgcGFjbCA9IHBhY2wtPm5leHQ7Ci0gICAgICAgIGF2X2ZyZWVwKHBhY2wyKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfYWNsX2xpc3QoRkZTZXJ2ZXJJUEFkZHJlc3NBQ0wgKmluX2FjbCwgSFRUUENvbnRleHQgKmMpCi17Ci0gICAgZW51bSBGRlNlcnZlcklQQWRkcmVzc0FjdGlvbiBsYXN0X2FjdGlvbiA9IElQX0RFTlk7Ci0gICAgRkZTZXJ2ZXJJUEFkZHJlc3NBQ0wgKmFjbDsKLSAgICBzdHJ1Y3QgaW5fYWRkciAqc3JjID0gJmMtPmZyb21fYWRkci5zaW5fYWRkcjsKLSAgICB1bnNpZ25lZCBsb25nIHNyY19hZGRyID0gc3JjLT5zX2FkZHI7Ci0KLSAgICBmb3IgKGFjbCA9IGluX2FjbDsgYWNsOyBhY2wgPSBhY2wtPm5leHQpIHsKLSAgICAgICAgaWYgKHNyY19hZGRyID49IGFjbC0+Zmlyc3Quc19hZGRyICYmIHNyY19hZGRyIDw9IGFjbC0+bGFzdC5zX2FkZHIpCi0gICAgICAgICAgICByZXR1cm4gKGFjbC0+YWN0aW9uID09IElQX0FMTE9XKSA/IDEgOiAwOwotICAgICAgICBsYXN0X2FjdGlvbiA9IGFjbC0+YWN0aW9uOwotICAgIH0KLQotICAgIC8qIE5vdGhpbmcgbWF0Y2hlZCwgc28gcmV0dXJuIG5vdCB0aGUgbGFzdCBhY3Rpb24gKi8KLSAgICByZXR1cm4gKGxhc3RfYWN0aW9uID09IElQX0RFTlkpID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmFsaWRhdGVfYWNsKEZGU2VydmVyU3RyZWFtICpzdHJlYW0sIEhUVFBDb250ZXh0ICpjKQotewotICAgIGludCByZXQgPSAwOwotICAgIEZGU2VydmVySVBBZGRyZXNzQUNMICphY2w7Ci0KLSAgICAvKiBpZiBzdHJlYW0tPmFjbCBpcyBudWxsIHZhbGlkYXRlX2FjbF9saXN0IHdpbGwgcmV0dXJuIDEgKi8KLSAgICByZXQgPSB2YWxpZGF0ZV9hY2xfbGlzdChzdHJlYW0tPmFjbCwgYyk7Ci0KLSAgICBpZiAoc3RyZWFtLT5keW5hbWljX2FjbFswXSkgewotICAgICAgICBhY2wgPSBwYXJzZV9keW5hbWljX2FjbChzdHJlYW0sIGMpOwotICAgICAgICByZXQgPSB2YWxpZGF0ZV9hY2xfbGlzdChhY2wsIGMpOwotICAgICAgICBmcmVlX2FjbF9saXN0KGFjbCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBjb21wdXRlIHRoZSByZWFsIGZpbGVuYW1lIG9mIGEgZmlsZSBieSBtYXRjaGluZyBpdCB3aXRob3V0IGl0cwotICogZXh0ZW5zaW9ucyB0byBhbGwgdGhlIHN0cmVhbSdzIGZpbGVuYW1lcwotICovCi1zdGF0aWMgdm9pZCBjb21wdXRlX3JlYWxfZmlsZW5hbWUoY2hhciAqZmlsZW5hbWUsIGludCBtYXhfc2l6ZSkKLXsKLSAgICBjaGFyIGZpbGUxWzEwMjRdOwotICAgIGNoYXIgZmlsZTJbMTAyNF07Ci0gICAgY2hhciAqcDsKLSAgICBGRlNlcnZlclN0cmVhbSAqc3RyZWFtOwotCi0gICAgYXZfc3RybGNweShmaWxlMSwgZmlsZW5hbWUsIHNpemVvZihmaWxlMSkpOwotICAgIHAgPSBzdHJyY2hyKGZpbGUxLCAnLicpOwotICAgIGlmIChwKQotICAgICAgICAqcCA9ICdcMCc7Ci0gICAgZm9yKHN0cmVhbSA9IGNvbmZpZy5maXJzdF9zdHJlYW07IHN0cmVhbTsgc3RyZWFtID0gc3RyZWFtLT5uZXh0KSB7Ci0gICAgICAgIGF2X3N0cmxjcHkoZmlsZTIsIHN0cmVhbS0+ZmlsZW5hbWUsIHNpemVvZihmaWxlMikpOwotICAgICAgICBwID0gc3RycmNocihmaWxlMiwgJy4nKTsKLSAgICAgICAgaWYgKHApCi0gICAgICAgICAgICAqcCA9ICdcMCc7Ci0gICAgICAgIGlmICghc3RyY21wKGZpbGUxLCBmaWxlMikpIHsKLSAgICAgICAgICAgIGF2X3N0cmxjcHkoZmlsZW5hbWUsIHN0cmVhbS0+ZmlsZW5hbWUsIG1heF9zaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi1lbnVtIFJlZGlyVHlwZSB7Ci0gICAgUkVESVJfTk9ORSwKLSAgICBSRURJUl9BU1gsCi0gICAgUkVESVJfUkFNLAotICAgIFJFRElSX0FTRiwKLSAgICBSRURJUl9SVFNQLAotICAgIFJFRElSX1NEUCwKLX07Ci0KLS8qIHBhcnNlIEhUVFAgcmVxdWVzdCBhbmQgcHJlcGFyZSBoZWFkZXIgKi8KLXN0YXRpYyBpbnQgaHR0cF9wYXJzZV9yZXF1ZXN0KEhUVFBDb250ZXh0ICpjKQotewotICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgY2hhciAqcDE7Ci0gICAgZW51bSBSZWRpclR5cGUgcmVkaXJfdHlwZTsKLSAgICBjaGFyIGNtZFszMl07Ci0gICAgY2hhciBpbmZvWzEwMjRdLCBmaWxlbmFtZVsxMDI0XTsKLSAgICBjaGFyIHVybFsxMDI0XSwgKnE7Ci0gICAgY2hhciBwcm90b2NvbFszMl07Ci0gICAgY2hhciBtc2dbMTAyNF07Ci0gICAgY2hhciAqZW5jb2RlZF9tc2cgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIgKm1pbWVfdHlwZTsKLSAgICBGRlNlcnZlclN0cmVhbSAqc3RyZWFtOwotICAgIGludCBpOwotICAgIGNoYXIgcmF0ZWJ1ZlszMl07Ci0gICAgY29uc3QgY2hhciAqdXNlcmFnZW50ID0gMDsKLQotICAgIHAgPSBjLT5idWZmZXI7Ci0gICAgZ2V0X3dvcmQoY21kLCBzaXplb2YoY21kKSwgJnApOwotICAgIGF2X3N0cmxjcHkoYy0+bWV0aG9kLCBjbWQsIHNpemVvZihjLT5tZXRob2QpKTsKLQotICAgIGlmICghc3RyY21wKGNtZCwgIkdFVCIpKQotICAgICAgICBjLT5wb3N0ID0gMDsKLSAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgIlBPU1QiKSkKLSAgICAgICAgYy0+cG9zdCA9IDE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBnZXRfd29yZCh1cmwsIHNpemVvZih1cmwpLCAmcCk7Ci0gICAgYXZfc3RybGNweShjLT51cmwsIHVybCwgc2l6ZW9mKGMtPnVybCkpOwotCi0gICAgZ2V0X3dvcmQocHJvdG9jb2wsIHNpemVvZihwcm90b2NvbCksIChjb25zdCBjaGFyICoqKSZwKTsKLSAgICBpZiAoc3RyY21wKHByb3RvY29sLCAiSFRUUC8xLjAiKSAmJiBzdHJjbXAocHJvdG9jb2wsICJIVFRQLzEuMSIpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBhdl9zdHJsY3B5KGMtPnByb3RvY29sLCBwcm90b2NvbCwgc2l6ZW9mKGMtPnByb3RvY29sKSk7Ci0KLSAgICBpZiAoY29uZmlnLmRlYnVnKQotICAgICAgICBodHRwX2xvZygiJXMgLSAtIE5ldyBjb25uZWN0aW9uOiAlcyAlc1xuIiwKLSAgICAgICAgICAgICAgICAgaW5ldF9udG9hKGMtPmZyb21fYWRkci5zaW5fYWRkciksIGNtZCwgdXJsKTsKLQotICAgIC8qIGZpbmQgdGhlIGZpbGVuYW1lIGFuZCB0aGUgb3B0aW9uYWwgaW5mbyBzdHJpbmcgaW4gdGhlIHJlcXVlc3QgKi8KLSAgICBwMSA9IHN0cmNocih1cmwsICc/Jyk7Ci0gICAgaWYgKHAxKSB7Ci0gICAgICAgIGF2X3N0cmxjcHkoaW5mbywgcDEsIHNpemVvZihpbmZvKSk7Ci0gICAgICAgICpwMSA9ICdcMCc7Ci0gICAgfSBlbHNlCi0gICAgICAgIGluZm9bMF0gPSAnXDAnOwotCi0gICAgYXZfc3RybGNweShmaWxlbmFtZSwgdXJsICsgKCgqdXJsID09ICcvJykgPyAxIDogMCksIHNpemVvZihmaWxlbmFtZSktMSk7Ci0KLSAgICBmb3IgKHAgPSBjLT5idWZmZXI7ICpwICYmICpwICE9ICdccicgJiYgKnAgIT0gJ1xuJzsgKSB7Ci0gICAgICAgIGlmIChhdl9zdHJuY2FzZWNtcChwLCAiVXNlci1BZ2VudDoiLCAxMSkgPT0gMCkgewotICAgICAgICAgICAgdXNlcmFnZW50ID0gcCArIDExOwotICAgICAgICAgICAgaWYgKCp1c2VyYWdlbnQgJiYgKnVzZXJhZ2VudCAhPSAnXG4nICYmIGF2X2lzc3BhY2UoKnVzZXJhZ2VudCkpCi0gICAgICAgICAgICAgICAgdXNlcmFnZW50Kys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBwID0gc3RyY2hyKHAsICdcbicpOwotICAgICAgICBpZiAoIXApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBwKys7Ci0gICAgfQotCi0gICAgcmVkaXJfdHlwZSA9IFJFRElSX05PTkU7Ci0gICAgaWYgKGF2X21hdGNoX2V4dChmaWxlbmFtZSwgImFzeCIpKSB7Ci0gICAgICAgIHJlZGlyX3R5cGUgPSBSRURJUl9BU1g7Ci0gICAgICAgIGZpbGVuYW1lW3N0cmxlbihmaWxlbmFtZSktMV0gPSAnZic7Ci0gICAgfSBlbHNlIGlmIChhdl9tYXRjaF9leHQoZmlsZW5hbWUsICJhc2YiKSAmJgotICAgICAgICAoIXVzZXJhZ2VudCB8fCBhdl9zdHJuY2FzZWNtcCh1c2VyYWdlbnQsICJOU1BsYXllciIsIDgpKSkgewotICAgICAgICAvKiBpZiB0aGlzIGlzbid0IFdNUCBvciBsb29rYWxpa2UsIHJldHVybiB0aGUgcmVkaXJlY3RvciBmaWxlICovCi0gICAgICAgIHJlZGlyX3R5cGUgPSBSRURJUl9BU0Y7Ci0gICAgfSBlbHNlIGlmIChhdl9tYXRjaF9leHQoZmlsZW5hbWUsICJycG0scmFtIikpIHsKLSAgICAgICAgcmVkaXJfdHlwZSA9IFJFRElSX1JBTTsKLSAgICAgICAgc3RyY3B5KGZpbGVuYW1lICsgc3RybGVuKGZpbGVuYW1lKS0yLCAibSIpOwotICAgIH0gZWxzZSBpZiAoYXZfbWF0Y2hfZXh0KGZpbGVuYW1lLCAicnRzcCIpKSB7Ci0gICAgICAgIHJlZGlyX3R5cGUgPSBSRURJUl9SVFNQOwotICAgICAgICBjb21wdXRlX3JlYWxfZmlsZW5hbWUoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSkgLSAxKTsKLSAgICB9IGVsc2UgaWYgKGF2X21hdGNoX2V4dChmaWxlbmFtZSwgInNkcCIpKSB7Ci0gICAgICAgIHJlZGlyX3R5cGUgPSBSRURJUl9TRFA7Ci0gICAgICAgIGNvbXB1dGVfcmVhbF9maWxlbmFtZShmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSAtIDEpOwotICAgIH0KLQotICAgIC8qICJyZWRpcmVjdCIgcmVxdWVzdCB0byBpbmRleC5odG1sICovCi0gICAgaWYgKCFzdHJsZW4oZmlsZW5hbWUpKQotICAgICAgICBhdl9zdHJsY3B5KGZpbGVuYW1lLCAiaW5kZXguaHRtbCIsIHNpemVvZihmaWxlbmFtZSkgLSAxKTsKLQotICAgIHN0cmVhbSA9IGNvbmZpZy5maXJzdF9zdHJlYW07Ci0gICAgd2hpbGUgKHN0cmVhbSkgewotICAgICAgICBpZiAoIXN0cmNtcChzdHJlYW0tPmZpbGVuYW1lLCBmaWxlbmFtZSkgJiYgdmFsaWRhdGVfYWNsKHN0cmVhbSwgYykpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3RyZWFtID0gc3RyZWFtLT5uZXh0OwotICAgIH0KLSAgICBpZiAoIXN0cmVhbSkgewotICAgICAgICBzbnByaW50Zihtc2csIHNpemVvZihtc2cpLCAiRmlsZSAnJXMnIG5vdCBmb3VuZCIsIHVybCk7Ci0gICAgICAgIGh0dHBfbG9nKCJGaWxlICclcycgbm90IGZvdW5kXG4iLCB1cmwpOwotICAgICAgICBnb3RvIHNlbmRfZXJyb3I7Ci0gICAgfQotCi0gICAgYy0+c3RyZWFtID0gc3RyZWFtOwotICAgIG1lbWNweShjLT5mZWVkX3N0cmVhbXMsIHN0cmVhbS0+ZmVlZF9zdHJlYW1zLCBzaXplb2YoYy0+ZmVlZF9zdHJlYW1zKSk7Ci0gICAgbWVtc2V0KGMtPnN3aXRjaF9mZWVkX3N0cmVhbXMsIC0xLCBzaXplb2YoYy0+c3dpdGNoX2ZlZWRfc3RyZWFtcykpOwotCi0gICAgaWYgKHN0cmVhbS0+c3RyZWFtX3R5cGUgPT0gU1RSRUFNX1RZUEVfUkVESVJFQ1QpIHsKLSAgICAgICAgYy0+aHR0cF9lcnJvciA9IDMwMTsKLSAgICAgICAgcSA9IGMtPmJ1ZmZlcjsKLSAgICAgICAgc25wcmludGYocSwgYy0+YnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIkhUVFAvMS4wIDMwMSBNb3ZlZFxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIkxvY2F0aW9uOiAlc1xyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiPCFET0NUWVBFIGh0bWw+XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIjxodG1sPjxoZWFkPjx0aXRsZT5Nb3ZlZDwvdGl0bGU+PC9oZWFkPjxib2R5PlxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIllvdSBzaG91bGQgYmUgPGEgaHJlZj1cIiVzXCI+cmVkaXJlY3RlZDwvYT4uXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiPC9ib2R5PjwvaHRtbD5cclxuIiwKLSAgICAgICAgICAgICAgICAgc3RyZWFtLT5mZWVkX2ZpbGVuYW1lLCBzdHJlYW0tPmZlZWRfZmlsZW5hbWUpOwotICAgICAgICBxICs9IHN0cmxlbihxKTsKLSAgICAgICAgLyogcHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIGMtPmJ1ZmZlcl9wdHIgPSBjLT5idWZmZXI7Ci0gICAgICAgIGMtPmJ1ZmZlcl9lbmQgPSBxOwotICAgICAgICBjLT5zdGF0ZSA9IEhUVFBTVEFURV9TRU5EX0hFQURFUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogSWYgdGhpcyBpcyBXTVAsIGdldCB0aGUgcmF0ZSBpbmZvcm1hdGlvbiAqLwotICAgIGlmIChleHRyYWN0X3JhdGVzKHJhdGVidWYsIHNpemVvZihyYXRlYnVmKSwgYy0+YnVmZmVyKSkgewotICAgICAgICBpZiAobW9kaWZ5X2N1cnJlbnRfc3RyZWFtKGMsIHJhdGVidWYpKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoYy0+ZmVlZF9zdHJlYW1zKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMtPnN3aXRjaF9mZWVkX3N0cmVhbXNbaV0gPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgYy0+c3dpdGNoX2ZlZWRfc3RyZWFtc1tpXSA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGMtPnBvc3QgPT0gMCAmJiBzdHJlYW0tPnN0cmVhbV90eXBlID09IFNUUkVBTV9UWVBFX0xJVkUpCi0gICAgICAgIGN1cnJlbnRfYmFuZHdpZHRoICs9IHN0cmVhbS0+YmFuZHdpZHRoOwotCi0gICAgLyogSWYgYWxyZWFkeSBzdHJlYW1pbmcgdGhpcyBmZWVkLCBkbyBub3QgbGV0IGFub3RoZXIgZmVlZGVyIHN0YXJ0ICovCi0gICAgaWYgKHN0cmVhbS0+ZmVlZF9vcGVuZWQpIHsKLSAgICAgICAgc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIlRoaXMgZmVlZCBpcyBhbHJlYWR5IGJlaW5nIHJlY2VpdmVkLiIpOwotICAgICAgICBodHRwX2xvZygiRmVlZCAnJXMnIGFscmVhZHkgYmVpbmcgcmVjZWl2ZWRcbiIsIHN0cmVhbS0+ZmVlZF9maWxlbmFtZSk7Ci0gICAgICAgIGdvdG8gc2VuZF9lcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoYy0+cG9zdCA9PSAwICYmIGNvbmZpZy5tYXhfYmFuZHdpZHRoIDwgY3VycmVudF9iYW5kd2lkdGgpIHsKLSAgICAgICAgYy0+aHR0cF9lcnJvciA9IDUwMzsKLSAgICAgICAgcSA9IGMtPmJ1ZmZlcjsKLSAgICAgICAgc25wcmludGYocSwgYy0+YnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIkhUVFAvMS4wIDUwMyBTZXJ2ZXIgdG9vIGJ1c3lcclxuIgotICAgICAgICAgICAgICAgICAgICAgICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIlxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBodG1sPlxuIgotICAgICAgICAgICAgICAgICAgICAgICI8aHRtbD48aGVhZD48dGl0bGU+VG9vIGJ1c3k8L3RpdGxlPjwvaGVhZD48Ym9keT5cclxuIgotICAgICAgICAgICAgICAgICAgICAgICI8cD5UaGUgc2VydmVyIGlzIHRvbyBidXN5IHRvIHNlcnZlIHlvdXIgcmVxdWVzdCBhdCAiCi0gICAgICAgICAgICAgICAgICAgICAgInRoaXMgdGltZS48L3A+XHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiPHA+VGhlIGJhbmR3aWR0aCBiZWluZyBzZXJ2ZWQgKGluY2x1ZGluZyB5b3VyIHN0cmVhbSkgIgotICAgICAgICAgICAgICAgICAgICAgICJpcyAlIlBSSXU2NCJrYml0L3MsIGFuZCB0aGlzIGV4Y2VlZHMgdGhlIGxpbWl0IG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAiJSJQUkl1NjQia2JpdC9zLjwvcD5cclxuIgotICAgICAgICAgICAgICAgICAgICAgICI8L2JvZHk+PC9odG1sPlxyXG4iLAotICAgICAgICAgICAgICAgICBjdXJyZW50X2JhbmR3aWR0aCwgY29uZmlnLm1heF9iYW5kd2lkdGgpOwotICAgICAgICBxICs9IHN0cmxlbihxKTsKLSAgICAgICAgLyogcHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIGMtPmJ1ZmZlcl9wdHIgPSBjLT5idWZmZXI7Ci0gICAgICAgIGMtPmJ1ZmZlcl9lbmQgPSBxOwotICAgICAgICBjLT5zdGF0ZSA9IEhUVFBTVEFURV9TRU5EX0hFQURFUjsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHJlZGlyX3R5cGUgIT0gUkVESVJfTk9ORSkgewotICAgICAgICBjb25zdCBjaGFyICpob3N0aW5mbyA9IDA7Ci0KLSAgICAgICAgZm9yIChwID0gYy0+YnVmZmVyOyAqcCAmJiAqcCAhPSAnXHInICYmICpwICE9ICdcbic7ICkgewotICAgICAgICAgICAgaWYgKGF2X3N0cm5jYXNlY21wKHAsICJIb3N0OiIsIDUpID09IDApIHsKLSAgICAgICAgICAgICAgICBob3N0aW5mbyA9IHAgKyA1OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCA9IHN0cmNocihwLCAnXG4nKTsKLSAgICAgICAgICAgIGlmICghcCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgcCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhvc3RpbmZvKSB7Ci0gICAgICAgICAgICBjaGFyICplb2g7Ci0gICAgICAgICAgICBjaGFyIGhvc3RidWZbMjYwXTsKLQotICAgICAgICAgICAgd2hpbGUgKGF2X2lzc3BhY2UoKmhvc3RpbmZvKSkKLSAgICAgICAgICAgICAgICBob3N0aW5mbysrOwotCi0gICAgICAgICAgICBlb2ggPSBzdHJjaHIoaG9zdGluZm8sICdcbicpOwotICAgICAgICAgICAgaWYgKGVvaCkgewotICAgICAgICAgICAgICAgIGlmIChlb2hbLTFdID09ICdccicpCi0gICAgICAgICAgICAgICAgICAgIGVvaC0tOwotCi0gICAgICAgICAgICAgICAgaWYgKGVvaCAtIGhvc3RpbmZvIDwgc2l6ZW9mKGhvc3RidWYpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoaG9zdGJ1ZiwgaG9zdGluZm8sIGVvaCAtIGhvc3RpbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgaG9zdGJ1Zltlb2ggLSBob3N0aW5mb10gPSAwOwotCi0gICAgICAgICAgICAgICAgICAgIGMtPmh0dHBfZXJyb3IgPSAyMDA7Ci0gICAgICAgICAgICAgICAgICAgIHEgPSBjLT5idWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChyZWRpcl90eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUkVESVJfQVNYOgotICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYocSwgYy0+YnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIVFRQLzEuMCAyMDAgQVNYIEZvbGxvd3NcclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC10eXBlOiB2aWRlby94LW1zLWFzZlxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEFTWCBWZXJzaW9uPVwiM1wiPlxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIjwhLS0gQXV0b2dlbmVyYXRlZCBieSBmZnNlcnZlciAtLT5cclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPEVOVFJZPjxSRUYgSFJFRj1cImh0dHA6Ly8lcy8lcyVzXCIvPjwvRU5UUlk+XHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvQVNYPlxyXG4iLCBob3N0YnVmLCBmaWxlbmFtZSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxICs9IHN0cmxlbihxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFJFRElSX1JBTToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHEsIGMtPmJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSFRUUC8xLjAgMjAwIFJBTSBGb2xsb3dzXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtdHlwZTogYXVkaW8veC1wbi1yZWFsYXVkaW9cclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMgQXV0b2dlbmVyYXRlZCBieSBmZnNlcnZlclxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vJXMvJXMlc1xyXG4iLCBob3N0YnVmLCBmaWxlbmFtZSwgaW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxICs9IHN0cmxlbihxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFJFRElSX0FTRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHEsIGMtPmJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSFRUUC8xLjAgMjAwIEFTRiBSZWRpcmVjdCBmb2xsb3dzXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtdHlwZTogdmlkZW8veC1tcy1hc2ZcclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltSZWZlcmVuY2VdXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZjE9aHR0cDovLyVzLyVzJXNcclxuIiwgaG9zdGJ1ZiwgZmlsZW5hbWUsIGluZm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgcSArPSBzdHJsZW4ocSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBSRURJUl9SVFNQOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgaG9zdG5hbWVbMjU2XSwgKnA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmFjdCBvbmx5IGhvc3RuYW1lICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNweShob3N0bmFtZSwgaG9zdGJ1Ziwgc2l6ZW9mKGhvc3RuYW1lKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHN0cnJjaHIoaG9zdG5hbWUsICc6Jyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihxLCBjLT5idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIVFRQLzEuMCAyMDAgUlRTUCBSZWRpcmVjdCBmb2xsb3dzXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWDogaW5jb3JyZWN0IE1JTUUgdHlwZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXJ0c3BcclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnRzcDovLyVzOiVkLyVzXHJcbiIsIGhvc3RuYW1lLCBudG9ocyhjb25maWcucnRzcF9hZGRyLnNpbl9wb3J0KSwgZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gc3RybGVuKHEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUkVESVJfU0RQOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNkcF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZHBfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tsZW5fdCBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luIG15X2FkZHI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihxLCBjLT5idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIVFRQLzEuMCAyMDAgT0tcclxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbnRlbnQtdHlwZTogYXBwbGljYXRpb24vc2RwXHJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcSArPSBzdHJsZW4ocSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzaXplb2YobXlfYWRkcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IFNob3VsZCBwcm9iYWJseSBmYWlsPyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRzb2NrbmFtZShjLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZteV9hZGRyLCAmbGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9sb2coImdldHNvY2tuYW1lKCkgZmFpbGVkXG4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWDogc2hvdWxkIHVzZSBhIGR5bmFtaWMgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RwX2RhdGFfc2l6ZSA9IHByZXBhcmVfc2RwX2Rlc2NyaXB0aW9uKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNkcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9hZGRyLnNpbl9hZGRyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2RwX2RhdGFfc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHEsIHNkcF9kYXRhLCBzZHBfZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcSArPSBzZHBfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUoc2RwX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogcHJlcGFyZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgIGMtPmJ1ZmZlcl9wdHIgPSBjLT5idWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmJ1ZmZlcl9lbmQgPSBxOwotICAgICAgICAgICAgICAgICAgICBjLT5zdGF0ZSA9IEhUVFBTVEFURV9TRU5EX0hFQURFUjsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgIkFTWC9SQU0gZmlsZSBub3QgaGFuZGxlZCIpOwotICAgICAgICBnb3RvIHNlbmRfZXJyb3I7Ci0gICAgfQotCi0gICAgc3RyZWFtLT5jb25uc19zZXJ2ZWQrKzsKLQotICAgIC8qIFhYWDogYWRkIHRoZXJlIGF1dGhlbnRpY2F0ZSBhbmQgSVAgbWF0Y2ggKi8KLQotICAgIGlmIChjLT5wb3N0KSB7Ci0gICAgICAgIC8qIGlmIHBvc3QsIGl0IG1lYW5zIGEgZmVlZCBpcyBiZWluZyBzZW50ICovCi0gICAgICAgIGlmICghc3RyZWFtLT5pc19mZWVkKSB7Ci0gICAgICAgICAgICAvKiBIb3dldmVyIGl0IG1pZ2h0IGJlIGEgc3RhdHVzIHJlcG9ydCBmcm9tIFdNUCEgTGV0IHVzIGxvZyB0aGUKLSAgICAgICAgICAgICAqIGRhdGEgYXMgaXQgbWlnaHQgY29tZSBoYW5keSBvbmUgZGF5LiAqLwotICAgICAgICAgICAgY29uc3QgY2hhciAqbG9nbGluZSA9IDA7Ci0gICAgICAgICAgICBpbnQgY2xpZW50X2lkID0gMDsKLQotICAgICAgICAgICAgZm9yIChwID0gYy0+YnVmZmVyOyAqcCAmJiAqcCAhPSAnXHInICYmICpwICE9ICdcbic7ICkgewotICAgICAgICAgICAgICAgIGlmIChhdl9zdHJuY2FzZWNtcChwLCAiUHJhZ21hOiBsb2ctbGluZT0iLCAxNykgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBsb2dsaW5lID0gcDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhdl9zdHJuY2FzZWNtcChwLCAiUHJhZ21hOiBjbGllbnQtaWQ9IiwgMTgpID09IDApCi0gICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZCA9IHN0cnRvbChwICsgMTgsIDAsIDEwKTsKLSAgICAgICAgICAgICAgICBwID0gc3RyY2hyKHAsICdcbicpOwotICAgICAgICAgICAgICAgIGlmICghcCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsb2dsaW5lKSB7Ci0gICAgICAgICAgICAgICAgY2hhciAqZW9sID0gc3RyY2hyKGxvZ2xpbmUsICdcbicpOwotCi0gICAgICAgICAgICAgICAgbG9nbGluZSArPSAxNzsKLQotICAgICAgICAgICAgICAgIGlmIChlb2wpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVvbFstMV0gPT0gJ1xyJykKLSAgICAgICAgICAgICAgICAgICAgICAgIGVvbC0tOwotICAgICAgICAgICAgICAgICAgICBodHRwX2xvZygiJS4qc1xuIiwgKGludCkgKGVvbCAtIGxvZ2xpbmUpLCBsb2dsaW5lKTsKLSAgICAgICAgICAgICAgICAgICAgYy0+c3VwcHJlc3NfbG9nID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSNpZmRlZiBERUJVRwotICAgICAgICAgICAgaHR0cF9sb2coIlxuR290IHJlcXVlc3Q6XG4lc1xuIiwgYy0+YnVmZmVyKTsKLSNlbmRpZgotCi0gICAgICAgICAgICBpZiAoY2xpZW50X2lkICYmIGV4dHJhY3RfcmF0ZXMocmF0ZWJ1Ziwgc2l6ZW9mKHJhdGVidWYpLCBjLT5idWZmZXIpKSB7Ci0gICAgICAgICAgICAgICAgSFRUUENvbnRleHQgKndtcGM7Ci0KLSAgICAgICAgICAgICAgICAvKiBOb3cgd2UgaGF2ZSB0byBmaW5kIHRoZSBjbGllbnRfaWQgKi8KLSAgICAgICAgICAgICAgICBmb3IgKHdtcGMgPSBmaXJzdF9odHRwX2N0eDsgd21wYzsgd21wYyA9IHdtcGMtPm5leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdtcGMtPndtcF9jbGllbnRfaWQgPT0gY2xpZW50X2lkKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHdtcGMgJiYgbW9kaWZ5X2N1cnJlbnRfc3RyZWFtKHdtcGMsIHJhdGVidWYpKQotICAgICAgICAgICAgICAgICAgICB3bXBjLT5zd2l0Y2hfcGVuZGluZyA9IDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICJQT1NUIGNvbW1hbmQgbm90IGhhbmRsZWQiKTsKLSAgICAgICAgICAgIGMtPnN0cmVhbSA9IDA7Ci0gICAgICAgICAgICBnb3RvIHNlbmRfZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGh0dHBfc3RhcnRfcmVjZWl2ZV9kYXRhKGMpIDwgMCkgewotICAgICAgICAgICAgc25wcmludGYobXNnLCBzaXplb2YobXNnKSwgImNvdWxkIG5vdCBvcGVuIGZlZWQiKTsKLSAgICAgICAgICAgIGdvdG8gc2VuZF9lcnJvcjsKLSAgICAgICAgfQotICAgICAgICBjLT5odHRwX2Vycm9yID0gMDsKLSAgICAgICAgYy0+c3RhdGUgPSBIVFRQU1RBVEVfUkVDRUlWRV9EQVRBOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSNpZmRlZiBERUJVRwotICAgIGlmIChzdHJjbXAoc3RyZWFtLT5maWxlbmFtZSArIHN0cmxlbihzdHJlYW0tPmZpbGVuYW1lKSAtIDQsICIuYXNmIikgPT0gMCkKLSAgICAgICAgaHR0cF9sb2coIlxuR290IHJlcXVlc3Q6XG4lc1xuIiwgYy0+YnVmZmVyKTsKLSNlbmRpZgotCi0gICAgaWYgKGMtPnN0cmVhbS0+c3RyZWFtX3R5cGUgPT0gU1RSRUFNX1RZUEVfU1RBVFVTKQotICAgICAgICBnb3RvIHNlbmRfc3RhdHVzOwotCi0gICAgLyogb3BlbiBpbnB1dCBzdHJlYW0gKi8KLSAgICBpZiAob3Blbl9pbnB1dF9zdHJlYW0oYywgaW5mbykgPCAwKSB7Ci0gICAgICAgIHNucHJpbnRmKG1zZywgc2l6ZW9mKG1zZyksICJJbnB1dCBzdHJlYW0gY29ycmVzcG9uZGluZyB0byAnJXMnIG5vdCBmb3VuZCIsIHVybCk7Ci0gICAgICAgIGdvdG8gc2VuZF9lcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBwcmVwYXJlIEhUVFAgaGVhZGVyICovCi0gICAgYy0+YnVmZmVyWzBdID0gMDsKLSAgICBhdl9zdHJsY2F0ZihjLT5idWZmZXIsIGMtPmJ1ZmZlcl9zaXplLCAiSFRUUC8xLjAgMjAwIE9LXHJcbiIpOwotICAgIG1pbWVfdHlwZSA9IGMtPnN0cmVhbS0+Zm10LT5taW1lX3R5cGU7Ci0gICAgaWYgKCFtaW1lX3R5cGUpCi0gICAgICAgIG1pbWVfdHlwZSA9ICJhcHBsaWNhdGlvbi94LW9jdGV0LXN0cmVhbSI7Ci0gICAgYXZfc3RybGNhdGYoYy0+YnVmZmVyLCBjLT5idWZmZXJfc2l6ZSwgIlByYWdtYTogbm8tY2FjaGVcclxuIik7Ci0KLSAgICAvKiBmb3IgYXNmLCB3ZSBuZWVkIGV4dHJhIGhlYWRlcnMgKi8KLSAgICBpZiAoIXN0cmNtcChjLT5zdHJlYW0tPmZtdC0+bmFtZSwiYXNmX3N0cmVhbSIpKSB7Ci0gICAgICAgIC8qIE5lZWQgdG8gYWxsb2NhdGUgYSBjbGllbnQgaWQgKi8KLQotICAgICAgICBjLT53bXBfY2xpZW50X2lkID0gYXZfbGZnX2dldCgmcmFuZG9tX3N0YXRlKTsKLQotICAgICAgICBhdl9zdHJsY2F0ZihjLT5idWZmZXIsIGMtPmJ1ZmZlcl9zaXplLCAiU2VydmVyOiBDb3VnYXIgNC4xLjAuMzkyM1xyXG5DYWNoZS1Db250cm9sOiBuby1jYWNoZVxyXG5QcmFnbWE6IGNsaWVudC1pZD0lZFxyXG5QcmFnbWE6IGZlYXR1cmVzPVwiYnJvYWRjYXN0XCJcclxuIiwgYy0+d21wX2NsaWVudF9pZCk7Ci0gICAgfQotICAgIGF2X3N0cmxjYXRmKGMtPmJ1ZmZlciwgYy0+YnVmZmVyX3NpemUsICJDb250ZW50LVR5cGU6ICVzXHJcbiIsIG1pbWVfdHlwZSk7Ci0gICAgYXZfc3RybGNhdGYoYy0+YnVmZmVyLCBjLT5idWZmZXJfc2l6ZSwgIlxyXG4iKTsKLSAgICBxID0gYy0+YnVmZmVyICsgc3RybGVuKGMtPmJ1ZmZlcik7Ci0KLSAgICAvKiBwcmVwYXJlIG91dHB1dCBidWZmZXIgKi8KLSAgICBjLT5odHRwX2Vycm9yID0gMDsKLSAgICBjLT5idWZmZXJfcHRyID0gYy0+YnVmZmVyOwotICAgIGMtPmJ1ZmZlcl9lbmQgPSBxOwotICAgIGMtPnN0YXRlID0gSFRUUFNUQVRFX1NFTkRfSEVBREVSOwotICAgIHJldHVybiAwOwotIHNlbmRfZXJyb3I6Ci0gICAgYy0+aHR0cF9lcnJvciA9IDQwNDsKLSAgICBxID0gYy0+YnVmZmVyOwotICAgIGlmICghaHRtbGVuY29kZShtc2csICZlbmNvZGVkX21zZykpIHsKLSAgICAgICAgaHR0cF9sb2coIkNvdWxkIG5vdCBlbmNvZGUgZmlsZW5hbWUgJyVzJyBhcyBIVE1MXG4iLCBtc2cpOwotICAgIH0KLSAgICBzbnByaW50ZihxLCBjLT5idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICJIVFRQLzEuMCA0MDQgTm90IEZvdW5kXHJcbiIKLSAgICAgICAgICAgICAgICAgICJDb250ZW50LXR5cGU6IHRleHQvaHRtbFxyXG4iCi0gICAgICAgICAgICAgICAgICAiXHJcbiIKLSAgICAgICAgICAgICAgICAgICI8IURPQ1RZUEUgaHRtbD5cbiIKLSAgICAgICAgICAgICAgICAgICI8aHRtbD5cbiIKLSAgICAgICAgICAgICAgICAgICI8aGVhZD5cbiIKLSAgICAgICAgICAgICAgICAgICI8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiIKLSAgICAgICAgICAgICAgICAgICI8dGl0bGU+NDA0IE5vdCBGb3VuZDwvdGl0bGU+XG4iCi0gICAgICAgICAgICAgICAgICAiPC9oZWFkPlxuIgotICAgICAgICAgICAgICAgICAgIjxib2R5PiVzPC9ib2R5PlxuIgotICAgICAgICAgICAgICAgICAgIjwvaHRtbD5cbiIsIGVuY29kZWRfbXNnPyBlbmNvZGVkX21zZyA6ICJGaWxlIG5vdCBmb3VuZCIpOwotICAgIHEgKz0gc3RybGVuKHEpOwotICAgIC8qIHByZXBhcmUgb3V0cHV0IGJ1ZmZlciAqLwotICAgIGMtPmJ1ZmZlcl9wdHIgPSBjLT5idWZmZXI7Ci0gICAgYy0+YnVmZmVyX2VuZCA9IHE7Ci0gICAgYy0+c3RhdGUgPSBIVFRQU1RBVEVfU0VORF9IRUFERVI7Ci0gICAgYXZfZnJlZXAoJmVuY29kZWRfbXNnKTsKLSAgICByZXR1cm4gMDsKLSBzZW5kX3N0YXR1czoKLSAgICBjb21wdXRlX3N0YXR1cyhjKTsKLSAgICAvKiBob3JyaWJsZTogd2UgdXNlIHRoaXMgdmFsdWUgdG8gYXZvaWQKLSAgICAgKiBnb2luZyB0byB0aGUgc2VuZCBkYXRhIHN0YXRlICovCi0gICAgYy0+aHR0cF9lcnJvciA9IDIwMDsKLSAgICBjLT5zdGF0ZSA9IEhUVFBTVEFURV9TRU5EX0hFQURFUjsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZm10X2J5dGVjb3VudChBVklPQ29udGV4dCAqcGIsIGludDY0X3QgY291bnQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgc3VmZml4W10gPSAiIGtNR1RQIjsKLSAgICBjb25zdCBjaGFyICpzOwotCi0gICAgZm9yIChzID0gc3VmZml4OyBjb3VudCA+PSAxMDAwMDAgJiYgc1sxXTsgY291bnQgLz0gMTAwMCwgcysrKTsKLQotICAgIGF2aW9fcHJpbnRmKHBiLCAiJSJQUklkNjQiJWMiLCBjb3VudCwgKnMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfc3RyZWFtX3BhcmFtcyhBVklPQ29udGV4dCAqcGIsIEZGU2VydmVyU3RyZWFtICpzdHJlYW0pCi17Ci0gICAgaW50IGksIHN0cmVhbV9ubzsKLSAgICBjb25zdCBjaGFyICp0eXBlID0gInVua25vd24iOwotICAgIGNoYXIgcGFyYW1ldGVyc1s2NF07Ci0gICAgQVZTdHJlYW0gKnN0OwotICAgIEFWQ29kZWMgKmNvZGVjOwotCi0gICAgc3RyZWFtX25vID0gc3RyZWFtLT5uYl9zdHJlYW1zOwotCi0gICAgYXZpb19wcmludGYocGIsICI8dGFibGUgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz00Pjx0cj48dGg+U3RyZWFtPHRoPiIKLSAgICAgICAgICAgICAgICAgICAgInR5cGU8dGg+a2JpdC9zPHRoIGFsaWduPWxlZnQ+Y29kZWM8dGggYWxpZ249bGVmdD4iCi0gICAgICAgICAgICAgICAgICAgICJQYXJhbWV0ZXJzXG4iKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzdHJlYW1fbm87IGkrKykgewotICAgICAgICBzdCA9IHN0cmVhbS0+c3RyZWFtc1tpXTsKLSAgICAgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2RlcihzdC0+Y29kZWMtPmNvZGVjX2lkKTsKLQotICAgICAgICBwYXJhbWV0ZXJzWzBdID0gMDsKLQotICAgICAgICBzd2l0Y2goc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgdHlwZSA9ICJhdWRpbyI7Ci0gICAgICAgICAgICBzbnByaW50ZihwYXJhbWV0ZXJzLCBzaXplb2YocGFyYW1ldGVycyksICIlZCBjaGFubmVsKHMpLCAlZCBIeiIsCi0gICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgICAgIHR5cGUgPSAidmlkZW8iOwotICAgICAgICAgICAgc25wcmludGYocGFyYW1ldGVycywgc2l6ZW9mKHBhcmFtZXRlcnMpLAotICAgICAgICAgICAgICAgICAgICAgIiVkeCVkLCBxPSVkLSVkLCBmcHM9JWQiLCBzdC0+Y29kZWMtPndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQsIHN0LT5jb2RlYy0+cW1pbiwgc3QtPmNvZGVjLT5xbWF4LAotICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuIC8gc3QtPmNvZGVjLT50aW1lX2Jhc2UubnVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiPHRyPjx0ZCBhbGlnbj1yaWdodD4lZDx0ZD4lczx0ZCBhbGlnbj1yaWdodD4lIlBSSWQ2NAotICAgICAgICAgICAgICAgICAgICAgICAgIjx0ZD4lczx0ZD4lc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgdHlwZSwgKGludDY0X3Qpc3QtPmNvZGVjLT5iaXRfcmF0ZS8xMDAwLAotICAgICAgICAgICAgICAgICAgICBjb2RlYyA/IGNvZGVjLT5uYW1lIDogIiIsIHBhcmFtZXRlcnMpOwotICAgICB9Ci0KLSAgICAgYXZpb19wcmludGYocGIsICI8L3RhYmxlPlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbXB1dGVfc3RhdHVzKEhUVFBDb250ZXh0ICpjKQotewotICAgIEhUVFBDb250ZXh0ICpjMTsKLSAgICBGRlNlcnZlclN0cmVhbSAqc3RyZWFtOwotICAgIGNoYXIgKnA7Ci0gICAgdGltZV90IHRpOwotICAgIGludCBpLCBsZW47Ci0gICAgQVZJT0NvbnRleHQgKnBiOwotCi0gICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZwYikgPCAwKSB7Ci0gICAgICAgIC8qIFhYWDogcmV0dXJuIGFuIGVycm9yID8gKi8KLSAgICAgICAgYy0+YnVmZmVyX3B0ciA9IGMtPmJ1ZmZlcjsKLSAgICAgICAgYy0+YnVmZmVyX2VuZCA9IGMtPmJ1ZmZlcjsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF2aW9fcHJpbnRmKHBiLCAiSFRUUC8xLjAgMjAwIE9LXHJcbiIpOwotICAgIGF2aW9fcHJpbnRmKHBiLCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcclxuIik7Ci0gICAgYXZpb19wcmludGYocGIsICJQcmFnbWE6IG5vLWNhY2hlXHJcbiIpOwotICAgIGF2aW9fcHJpbnRmKHBiLCAiXHJcbiIpOwotCi0gICAgYXZpb19wcmludGYocGIsICI8IURPQ1RZUEUgaHRtbD5cbiIpOwotICAgIGF2aW9fcHJpbnRmKHBiLCAiPGh0bWw+PGhlYWQ+PHRpdGxlPiVzIFN0YXR1czwvdGl0bGU+XG4iLCBwcm9ncmFtX25hbWUpOwotICAgIGlmIChjLT5zdHJlYW0tPmZlZWRfZmlsZW5hbWVbMF0pCi0gICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiPGxpbmsgcmVsPVwic2hvcnRjdXQgaWNvblwiIGhyZWY9XCIlc1wiPlxuIiwKLSAgICAgICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5mZWVkX2ZpbGVuYW1lKTsKLSAgICBhdmlvX3ByaW50ZihwYiwgIjwvaGVhZD5cbjxib2R5PiIpOwotICAgIGF2aW9fcHJpbnRmKHBiLCAiPGgxPiVzIFN0YXR1czwvaDE+XG4iLCBwcm9ncmFtX25hbWUpOwotICAgIC8qIGZvcm1hdCBzdGF0dXMgKi8KLSAgICBhdmlvX3ByaW50ZihwYiwgIjxoMj5BdmFpbGFibGUgU3RyZWFtczwvaDI+XG4iKTsKLSAgICBhdmlvX3ByaW50ZihwYiwgIjx0YWJsZSBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTQ+XG4iKTsKLSAgICBhdmlvX3ByaW50ZihwYiwgIjx0cj48dGggdmFsaWduPXRvcD5QYXRoPHRoIGFsaWduPWxlZnQ+U2VydmVkPGJyPkNvbm5zPHRoPjxicj5ieXRlczx0aCB2YWxpZ249dG9wPkZvcm1hdDx0aD5CaXQgcmF0ZTxicj5rYml0L3M8dGggYWxpZ249bGVmdD5WaWRlbzxicj5rYml0L3M8dGg+PGJyPkNvZGVjPHRoIGFsaWduPWxlZnQ+QXVkaW88YnI+a2JpdC9zPHRoPjxicj5Db2RlYzx0aCBhbGlnbj1sZWZ0IHZhbGlnbj10b3A+RmVlZFxuIik7Ci0gICAgc3RyZWFtID0gY29uZmlnLmZpcnN0X3N0cmVhbTsKLSAgICB3aGlsZSAoc3RyZWFtKSB7Ci0gICAgICAgIGNoYXIgc2ZpbGVuYW1lWzEwMjRdOwotICAgICAgICBjaGFyICplb3NmOwotCi0gICAgICAgIGlmIChzdHJlYW0tPmZlZWQgPT0gc3RyZWFtKSB7Ci0gICAgICAgICAgICBzdHJlYW0gPSBzdHJlYW0tPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2X3N0cmxjcHkoc2ZpbGVuYW1lLCBzdHJlYW0tPmZpbGVuYW1lLCBzaXplb2Yoc2ZpbGVuYW1lKSAtIDEwKTsKLSAgICAgICAgZW9zZiA9IHNmaWxlbmFtZSArIHN0cmxlbihzZmlsZW5hbWUpOwotICAgICAgICBpZiAoZW9zZiAtIHNmaWxlbmFtZSA+PSA0KSB7Ci0gICAgICAgICAgICBpZiAoc3RyY21wKGVvc2YgLSA0LCAiLmFzZiIpID09IDApCi0gICAgICAgICAgICAgICAgc3RyY3B5KGVvc2YgLSA0LCAiLmFzeCIpOwotICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGVvc2YgLSAzLCAiLnJtIikgPT0gMCkKLSAgICAgICAgICAgICAgICBzdHJjcHkoZW9zZiAtIDMsICIucmFtIik7Ci0gICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0tPmZtdCAmJiAhc3RyY21wKHN0cmVhbS0+Zm10LT5uYW1lLCAicnRwIikpIHsKLSAgICAgICAgICAgICAgICAvKiBnZW5lcmF0ZSBhIHNhbXBsZSBSVFNQIGRpcmVjdG9yIGlmCi0gICAgICAgICAgICAgICAgICogdW5pY2FzdC4gR2VuZXJhdGUgYW4gU0RQIHJlZGlyZWN0b3IgaWYKLSAgICAgICAgICAgICAgICAgKiBtdWx0aWNhc3QgKi8KLSAgICAgICAgICAgICAgICBlb3NmID0gc3RycmNocihzZmlsZW5hbWUsICcuJyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFlb3NmKQotICAgICAgICAgICAgICAgICAgICBlb3NmID0gc2ZpbGVuYW1lICsgc3RybGVuKHNmaWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbS0+aXNfbXVsdGljYXN0KQotICAgICAgICAgICAgICAgICAgICBzdHJjcHkoZW9zZiwgIi5zZHAiKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0cmNweShlb3NmLCAiLnJ0c3AiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiPHRyPjx0ZD48YSBocmVmPVwiLyVzXCI+JXM8L2E+ICIsCi0gICAgICAgICAgICAgICAgICAgIHNmaWxlbmFtZSwgc3RyZWFtLT5maWxlbmFtZSk7Ci0gICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiPHRkIGFsaWduPXJpZ2h0PiAlZCA8dGQgYWxpZ249cmlnaHQ+ICIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y29ubnNfc2VydmVkKTsKLSAgICAgICAgZm10X2J5dGVjb3VudChwYiwgc3RyZWFtLT5ieXRlc19zZXJ2ZWQpOwotCi0gICAgICAgIHN3aXRjaChzdHJlYW0tPnN0cmVhbV90eXBlKSB7Ci0gICAgICAgIGNhc2UgU1RSRUFNX1RZUEVfTElWRTogewotICAgICAgICAgICAgaW50IGF1ZGlvX2JpdF9yYXRlID0gMDsKLSAgICAgICAgICAgIGludCB2aWRlb19iaXRfcmF0ZSA9IDA7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICphdWRpb19jb2RlY19uYW1lID0gIiI7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICp2aWRlb19jb2RlY19uYW1lID0gIiI7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICphdWRpb19jb2RlY19uYW1lX2V4dHJhID0gIiI7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICp2aWRlb19jb2RlY19uYW1lX2V4dHJhID0gIiI7Ci0KLSAgICAgICAgICAgIGZvcihpPTA7aTxzdHJlYW0tPm5iX3N0cmVhbXM7aSsrKSB7Ci0gICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gc3RyZWFtLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIEFWQ29kZWMgKmNvZGVjID0gYXZjb2RlY19maW5kX2VuY29kZXIoc3QtPmNvZGVjLT5jb2RlY19pZCk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2goc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2JpdF9yYXRlICs9IHN0LT5jb2RlYy0+Yml0X3JhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb2RlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCphdWRpb19jb2RlY19uYW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvZGVjX25hbWVfZXh0cmEgPSAiLi4uIjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvZGVjX25hbWUgPSBjb2RlYy0+bmFtZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgICAgICAgICAgICAgdmlkZW9fYml0X3JhdGUgKz0gc3QtPmNvZGVjLT5iaXRfcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnZpZGVvX2NvZGVjX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fY29kZWNfbmFtZV9leHRyYSA9ICIuLi4iOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fY29kZWNfbmFtZSA9IGNvZGVjLT5uYW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0RBVEE6Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvX2JpdF9yYXRlICs9IHN0LT5jb2RlYy0+Yml0X3JhdGU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdmlvX3ByaW50ZihwYiwgIjx0ZCBhbGlnbj1jZW50ZXI+ICVzIDx0ZCBhbGlnbj1yaWdodD4gJWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8dGQgYWxpZ249cmlnaHQ+ICVkIDx0ZD4gJXMgJXMgPHRkIGFsaWduPXJpZ2h0PiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIDx0ZD4gJXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5mbXQtPm5hbWUsIHN0cmVhbS0+YmFuZHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fYml0X3JhdGUgLyAxMDAwLCB2aWRlb19jb2RlY19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fY29kZWNfbmFtZV9leHRyYSwgYXVkaW9fYml0X3JhdGUgLyAxMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29kZWNfbmFtZSwgYXVkaW9fY29kZWNfbmFtZV9leHRyYSk7Ci0KLSAgICAgICAgICAgIGlmIChzdHJlYW0tPmZlZWQpCi0gICAgICAgICAgICAgICAgYXZpb19wcmludGYocGIsICI8dGQ+JXMiLCBzdHJlYW0tPmZlZWQtPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihwYiwgIjx0ZD4lcyIsIHN0cmVhbS0+ZmVlZF9maWxlbmFtZSk7Ci0gICAgICAgICAgICBhdmlvX3ByaW50ZihwYiwgIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXZpb19wcmludGYocGIsICI8dGQgYWxpZ249Y2VudGVyPiAtIDx0ZCBhbGlnbj1yaWdodD4gLSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIjx0ZCBhbGlnbj1yaWdodD4gLSA8dGQ+PHRkIGFsaWduPXJpZ2h0PiAtIDx0ZD5cbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyZWFtID0gc3RyZWFtLT5uZXh0OwotICAgIH0KLSAgICBhdmlvX3ByaW50ZihwYiwgIjwvdGFibGU+XG4iKTsKLQotICAgIHN0cmVhbSA9IGNvbmZpZy5maXJzdF9zdHJlYW07Ci0gICAgd2hpbGUgKHN0cmVhbSkgewotCi0gICAgICAgIGlmIChzdHJlYW0tPmZlZWQgIT0gc3RyZWFtKSB7Ci0gICAgICAgICAgICBzdHJlYW0gPSBzdHJlYW0tPm5leHQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiPGgyPkZlZWQgJXM8L2gyPiIsIHN0cmVhbS0+ZmlsZW5hbWUpOwotICAgICAgICBpZiAoc3RyZWFtLT5waWQpIHsKLSAgICAgICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiUnVubmluZyBhcyBwaWQgJSJQUklkNjQiLlxuIiwgKGludDY0X3QpIHN0cmVhbS0+cGlkKTsKLQotI2lmIGRlZmluZWQobGludXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRklMRSAqcGlkX3N0YXQ7Ci0gICAgICAgICAgICAgICAgY2hhciBwc19jbWRbNjRdOwotCi0gICAgICAgICAgICAgICAgLyogVGhpcyBpcyBzb21ld2hhdCBsaW51eCBzcGVjaWZpYyBJIGd1ZXNzICovCi0gICAgICAgICAgICAgICAgc25wcmludGYocHNfY21kLCBzaXplb2YocHNfY21kKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAicHMgLW8gXCIlJWNwdSxjcHV0aW1lXCIgLS1uby1oZWFkZXJzICUiUFJJZDY0IiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpIHN0cmVhbS0+cGlkKTsKLQotICAgICAgICAgICAgICAgICBwaWRfc3RhdCA9IHBvcGVuKHBzX2NtZCwgInIiKTsKLSAgICAgICAgICAgICAgICAgaWYgKHBpZF9zdGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICBjaGFyIGNwdXBlcmNbMTBdOwotICAgICAgICAgICAgICAgICAgICAgY2hhciBjcHV1c2VkWzY0XTsKLQotICAgICAgICAgICAgICAgICAgICAgaWYgKGZzY2FuZihwaWRfc3RhdCwgIiU5cyAlNjNzIiwgY3B1cGVyYywgY3B1dXNlZCkgPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiQ3VycmVudGx5IHVzaW5nICVzJSUgb2YgdGhlIGNwdS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVG90YWwgdGltZSB1c2VkICVzLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVwZXJjLCBjcHV1c2VkKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgIGZjbG9zZShwaWRfc3RhdCk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICBhdmlvX3ByaW50ZihwYiwgIjxwPiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpbnRfc3RyZWFtX3BhcmFtcyhwYiwgc3RyZWFtKTsKLSAgICAgICAgc3RyZWFtID0gc3RyZWFtLT5uZXh0OwotICAgIH0KLQotICAgIC8qIGNvbm5lY3Rpb24gc3RhdHVzICovCi0gICAgYXZpb19wcmludGYocGIsICI8aDI+Q29ubmVjdGlvbiBTdGF0dXM8L2gyPlxuIik7Ci0KLSAgICBhdmlvX3ByaW50ZihwYiwgIk51bWJlciBvZiBjb25uZWN0aW9uczogJWQgLyAlZDxicj5cbiIsCi0gICAgICAgICAgICAgICAgbmJfY29ubmVjdGlvbnMsIGNvbmZpZy5uYl9tYXhfY29ubmVjdGlvbnMpOwotCi0gICAgYXZpb19wcmludGYocGIsICJCYW5kd2lkdGggaW4gdXNlOiAlIlBSSXU2NCJrIC8gJSJQUkl1NjQiazxicj5cbiIsCi0gICAgICAgICAgICAgICAgY3VycmVudF9iYW5kd2lkdGgsIGNvbmZpZy5tYXhfYmFuZHdpZHRoKTsKLQotICAgIGF2aW9fcHJpbnRmKHBiLCAiPHRhYmxlPlxuIik7Ci0gICAgYXZpb19wcmludGYocGIsICI8dHI+PHRoPiM8dGg+RmlsZTx0aD5JUDx0aD5Qcm90bzx0aD5TdGF0ZTx0aD5UYXJnZXQgIgotICAgICAgICAgICAgICAgICAgICAiYml0L3M8dGg+QWN0dWFsIGJpdC9zPHRoPkJ5dGVzIHRyYW5zZmVycmVkXG4iKTsKLSAgICBjMSA9IGZpcnN0X2h0dHBfY3R4OwotICAgIGkgPSAwOwotICAgIHdoaWxlIChjMSkgewotICAgICAgICBpbnQgYml0cmF0ZTsKLSAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgYml0cmF0ZSA9IDA7Ci0gICAgICAgIGlmIChjMS0+c3RyZWFtKSB7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYzEtPnN0cmVhbS0+bmJfc3RyZWFtczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjMS0+c3RyZWFtLT5mZWVkKQotICAgICAgICAgICAgICAgICAgICBiaXRyYXRlICs9IGMxLT5zdHJlYW0tPnN0cmVhbXNbal0tPmNvZGVjLT5iaXRfcmF0ZTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjMS0+ZmVlZF9zdHJlYW1zW2pdID49IDApCi0gICAgICAgICAgICAgICAgICAgIGJpdHJhdGUgKz0gYzEtPnN0cmVhbS0+ZmVlZC0+c3RyZWFtc1tjMS0+ZmVlZF9zdHJlYW1zW2pdXS0+Y29kZWMtPmJpdF9yYXRlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaSsrOwotICAgICAgICBwID0gaW5ldF9udG9hKGMxLT5mcm9tX2FkZHIuc2luX2FkZHIpOwotICAgICAgICBhdmlvX3ByaW50ZihwYiwgIjx0cj48dGQ+PGI+JWQ8L2I+PHRkPiVzJXM8dGQ+JXM8dGQ+JXM8dGQ+JXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAiPHRkIGFsaWduPXJpZ2h0PiIsCi0gICAgICAgICAgICAgICAgICAgIGksIGMxLT5zdHJlYW0gPyBjMS0+c3RyZWFtLT5maWxlbmFtZSA6ICIiLAotICAgICAgICAgICAgICAgICAgICBjMS0+c3RhdGUgPT0gSFRUUFNUQVRFX1JFQ0VJVkVfREFUQSA/ICIoaW5wdXQpIiA6ICIiLCBwLAotICAgICAgICAgICAgICAgICAgICBjMS0+cHJvdG9jb2wsIGh0dHBfc3RhdGVbYzEtPnN0YXRlXSk7Ci0gICAgICAgIGZtdF9ieXRlY291bnQocGIsIGJpdHJhdGUpOwotICAgICAgICBhdmlvX3ByaW50ZihwYiwgIjx0ZCBhbGlnbj1yaWdodD4iKTsKLSAgICAgICAgZm10X2J5dGVjb3VudChwYiwgY29tcHV0ZV9kYXRhcmF0ZSgmYzEtPmRhdGFyYXRlLCBjMS0+ZGF0YV9jb3VudCkgKiA4KTsKLSAgICAgICAgYXZpb19wcmludGYocGIsICI8dGQgYWxpZ249cmlnaHQ+Iik7Ci0gICAgICAgIGZtdF9ieXRlY291bnQocGIsIGMxLT5kYXRhX2NvdW50KTsKLSAgICAgICAgYXZpb19wcmludGYocGIsICJcbiIpOwotICAgICAgICBjMSA9IGMxLT5uZXh0OwotICAgIH0KLSAgICBhdmlvX3ByaW50ZihwYiwgIjwvdGFibGU+XG4iKTsKLQotICAgIC8qIGRhdGUgKi8KLSAgICB0aSA9IHRpbWUoTlVMTCk7Ci0gICAgcCA9IGN0aW1lKCZ0aSk7Ci0gICAgYXZpb19wcmludGYocGIsICI8aHIgc2l6ZT0xIG5vc2hhZGU+R2VuZXJhdGVkIGF0ICVzIiwgcCk7Ci0gICAgYXZpb19wcmludGYocGIsICI8L2JvZHk+XG48L2h0bWw+XG4iKTsKLQotICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihwYiwgJmMtPnBiX2J1ZmZlcik7Ci0gICAgYy0+YnVmZmVyX3B0ciA9IGMtPnBiX2J1ZmZlcjsKLSAgICBjLT5idWZmZXJfZW5kID0gYy0+cGJfYnVmZmVyICsgbGVuOwotfQotCi1zdGF0aWMgaW50IG9wZW5faW5wdXRfc3RyZWFtKEhUVFBDb250ZXh0ICpjLCBjb25zdCBjaGFyICppbmZvKQotewotICAgIGNoYXIgYnVmWzEyOF07Ci0gICAgY2hhciBpbnB1dF9maWxlbmFtZVsxMDI0XTsKLSAgICBBVkZvcm1hdENvbnRleHQgKnMgPSBOVUxMOwotICAgIGludCBidWZfc2l6ZSwgaSwgcmV0OwotICAgIGludDY0X3Qgc3RyZWFtX3BvczsKLQotICAgIC8qIGZpbmQgZmlsZSBuYW1lICovCi0gICAgaWYgKGMtPnN0cmVhbS0+ZmVlZCkgewotICAgICAgICBzdHJjcHkoaW5wdXRfZmlsZW5hbWUsIGMtPnN0cmVhbS0+ZmVlZC0+ZmVlZF9maWxlbmFtZSk7Ci0gICAgICAgIGJ1Zl9zaXplID0gRkZNX1BBQ0tFVF9TSVpFOwotICAgICAgICAvKiBjb21wdXRlIHBvc2l0aW9uIChhYnNvbHV0ZSB0aW1lKSAqLwotICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiZGF0ZSIsIGluZm8pKSB7Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGF2X3BhcnNlX3RpbWUoJnN0cmVhbV9wb3MsIGJ1ZiwgMCkpIDwgMCkgewotICAgICAgICAgICAgICAgIGh0dHBfbG9nKCJJbnZhbGlkIGRhdGUgc3BlY2lmaWNhdGlvbiAnJXMnIGZvciBzdHJlYW1cbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJidWZmZXIiLCBpbmZvKSkgewotICAgICAgICAgICAgaW50IHByZWJ1ZmZlciA9IHN0cnRvbChidWYsIDAsIDEwKTsKLSAgICAgICAgICAgIHN0cmVhbV9wb3MgPSBhdl9nZXR0aW1lKCkgLSBwcmVidWZmZXIgKiAoaW50NjRfdCkxMDAwMDAwOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN0cmVhbV9wb3MgPSBhdl9nZXR0aW1lKCkgLSBjLT5zdHJlYW0tPnByZWJ1ZmZlciAqIChpbnQ2NF90KTEwMDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RyY3B5KGlucHV0X2ZpbGVuYW1lLCBjLT5zdHJlYW0tPmZlZWRfZmlsZW5hbWUpOwotICAgICAgICBidWZfc2l6ZSA9IDA7Ci0gICAgICAgIC8qIGNvbXB1dGUgcG9zaXRpb24gKHJlbGF0aXZlIHRpbWUpICovCi0gICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJkYXRlIiwgaW5mbykpIHsKLSAgICAgICAgICAgIGlmICgocmV0ID0gYXZfcGFyc2VfdGltZSgmc3RyZWFtX3BvcywgYnVmLCAxKSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaHR0cF9sb2coIkludmFsaWQgZGF0ZSBzcGVjaWZpY2F0aW9uICclcycgZm9yIHN0cmVhbVxuIiwgYnVmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN0cmVhbV9wb3MgPSAwOwotICAgIH0KLSAgICBpZiAoIWlucHV0X2ZpbGVuYW1lWzBdKSB7Ci0gICAgICAgIGh0dHBfbG9nKCJObyBmaWxlbmFtZSB3YXMgc3BlY2lmaWVkIGZvciBzdHJlYW1cbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLQotICAgIC8qIG9wZW4gc3RyZWFtICovCi0gICAgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmcywgaW5wdXRfZmlsZW5hbWUsIGMtPnN0cmVhbS0+aWZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5zdHJlYW0tPmluX29wdHMpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGh0dHBfbG9nKCJDb3VsZCBub3Qgb3BlbiBpbnB1dCAnJXMnOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgaW5wdXRfZmlsZW5hbWUsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyogc2V0IGJ1ZmZlciBzaXplICovCi0gICAgaWYgKGJ1Zl9zaXplID4gMCkgewotICAgICAgICByZXQgPSBmZmlvX3NldF9idWZfc2l6ZShzLT5wYiwgYnVmX3NpemUpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgaHR0cF9sb2coIkZhaWxlZCB0byBzZXQgYnVmZmVyIHNpemVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHMtPmZsYWdzIHw9IEFWRk1UX0ZMQUdfR0VOUFRTOwotICAgIGMtPmZtdF9pbiA9IHM7Ci0gICAgaWYgKHN0cmNtcChzLT5pZm9ybWF0LT5uYW1lLCAiZmZtIikgJiYKLSAgICAgICAgKHJldCA9IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oYy0+Zm10X2luLCBOVUxMKSkgPCAwKSB7Ci0gICAgICAgIGh0dHBfbG9nKCJDb3VsZCBub3QgZmluZCBzdHJlYW0gaW5mbyBmb3IgaW5wdXQgJyVzJ1xuIiwgaW5wdXRfZmlsZW5hbWUpOwotICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmcyk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyogY2hvb3NlIHN0cmVhbSBhcyBjbG9jayBzb3VyY2UgKHdlIGZhdm9yIHRoZSB2aWRlbyBzdHJlYW0gaWYKLSAgICAgKiBwcmVzZW50KSBmb3IgcGFja2V0IHNlbmRpbmcgKi8KLSAgICBjLT5wdHNfc3RyZWFtX2luZGV4ID0gMDsKLSAgICBmb3IoaT0wO2k8Yy0+c3RyZWFtLT5uYl9zdHJlYW1zO2krKykgewotICAgICAgICBpZiAoYy0+cHRzX3N0cmVhbV9pbmRleCA9PSAwICYmCi0gICAgICAgICAgICBjLT5zdHJlYW0tPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICAgICAgYy0+cHRzX3N0cmVhbV9pbmRleCA9IGk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYy0+Zm10X2luLT5pZm9ybWF0LT5yZWFkX3NlZWspCi0gICAgICAgIGF2X3NlZWtfZnJhbWUoYy0+Zm10X2luLCAtMSwgc3RyZWFtX3BvcywgMCk7Ci0gICAgLyogc2V0IHRoZSBzdGFydCB0aW1lIChuZWVkZWQgZm9yIG1heHRpbWUgYW5kIFJUUCBwYWNrZXQgdGltaW5nKSAqLwotICAgIGMtPnN0YXJ0X3RpbWUgPSBjdXJfdGltZTsKLSAgICBjLT5maXJzdF9wdHMgPSBBVl9OT1BUU19WQUxVRTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogcmV0dXJuIHRoZSBzZXJ2ZXIgY2xvY2sgKGluIHVzKSAqLwotc3RhdGljIGludDY0X3QgZ2V0X3NlcnZlcl9jbG9jayhIVFRQQ29udGV4dCAqYykKLXsKLSAgICAvKiBjb21wdXRlIGN1cnJlbnQgcHRzIHZhbHVlIGZyb20gc3lzdGVtIHRpbWUgKi8KLSAgICByZXR1cm4gKGN1cl90aW1lIC0gYy0+c3RhcnRfdGltZSkgKiAxMDAwOwotfQotCi0vKiByZXR1cm4gdGhlIGVzdGltYXRlZCB0aW1lIChpbiB1cykgYXQgd2hpY2ggdGhlIGN1cnJlbnQgcGFja2V0IG11c3QgYmUgc2VudCAqLwotc3RhdGljIGludDY0X3QgZ2V0X3BhY2tldF9zZW5kX2Nsb2NrKEhUVFBDb250ZXh0ICpjKQotewotICAgIGludCBieXRlc19sZWZ0LCBieXRlc19zZW50LCBmcmFtZV9ieXRlczsKLQotICAgIGZyYW1lX2J5dGVzID0gYy0+Y3VyX2ZyYW1lX2J5dGVzOwotICAgIGlmIChmcmFtZV9ieXRlcyA8PSAwKQotICAgICAgICByZXR1cm4gYy0+Y3VyX3B0czsKLQotICAgIGJ5dGVzX2xlZnQgPSBjLT5idWZmZXJfZW5kIC0gYy0+YnVmZmVyX3B0cjsKLSAgICBieXRlc19zZW50ID0gZnJhbWVfYnl0ZXMgLSBieXRlc19sZWZ0OwotICAgIHJldHVybiBjLT5jdXJfcHRzICsgKGMtPmN1cl9mcmFtZV9kdXJhdGlvbiAqIGJ5dGVzX3NlbnQpIC8gZnJhbWVfYnl0ZXM7Ci19Ci0KLQotc3RhdGljIGludCBodHRwX3ByZXBhcmVfZGF0YShIVFRQQ29udGV4dCAqYykKLXsKLSAgICBpbnQgaSwgbGVuLCByZXQ7Ci0gICAgQVZGb3JtYXRDb250ZXh0ICpjdHg7Ci0KLSAgICBhdl9mcmVlcCgmYy0+cGJfYnVmZmVyKTsKLSAgICBzd2l0Y2goYy0+c3RhdGUpIHsKLSAgICBjYXNlIEhUVFBTVEFURV9TRU5EX0RBVEFfSEVBREVSOgotICAgICAgICBjdHggPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7Ci0gICAgICAgIGlmICghY3R4KQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgYy0+Zm10X2N0eCA9ICpjdHg7Ci0gICAgICAgIGF2X2ZyZWVwKCZjdHgpOwotICAgICAgICBhdl9kaWN0X2NvcHkoJihjLT5mbXRfY3R4Lm1ldGFkYXRhKSwgYy0+c3RyZWFtLT5tZXRhZGF0YSwgMCk7Ci0gICAgICAgIGMtPmZtdF9jdHguc3RyZWFtcyA9IGF2X21hbGxvY3pfYXJyYXkoYy0+c3RyZWFtLT5uYl9zdHJlYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBVlN0cmVhbSAqKSk7Ci0gICAgICAgIGlmICghYy0+Zm10X2N0eC5zdHJlYW1zKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgICAgICBmb3IoaT0wO2k8Yy0+c3RyZWFtLT5uYl9zdHJlYW1zO2krKykgewotICAgICAgICAgICAgQVZTdHJlYW0gKnNyYzsKLSAgICAgICAgICAgIGMtPmZtdF9jdHguc3RyZWFtc1tpXSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWU3RyZWFtKSk7Ci0KLSAgICAgICAgICAgIC8qIGlmIGZpbGUgb3IgZmVlZCwgdGhlbiBqdXN0IHRha2Ugc3RyZWFtcyBmcm9tIEZGU2VydmVyU3RyZWFtCi0gICAgICAgICAgICAgKiBzdHJ1Y3QgKi8KLSAgICAgICAgICAgIGlmICghYy0+c3RyZWFtLT5mZWVkIHx8Ci0gICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5mZWVkID09IGMtPnN0cmVhbSkKLSAgICAgICAgICAgICAgICBzcmMgPSBjLT5zdHJlYW0tPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3JjID0gYy0+c3RyZWFtLT5mZWVkLT5zdHJlYW1zW2MtPnN0cmVhbS0+ZmVlZF9zdHJlYW1zW2ldXTsKLQotICAgICAgICAgICAgKihjLT5mbXRfY3R4LnN0cmVhbXNbaV0pID0gKnNyYzsKLSAgICAgICAgICAgIGMtPmZtdF9jdHguc3RyZWFtc1tpXS0+cHJpdl9kYXRhID0gMDsKLSAgICAgICAgICAgIC8qIFhYWDogc2hvdWxkIGJlIGRvbmUgaW4gQVZTdHJlYW0sIG5vdCBpbiBjb2RlYyAqLwotICAgICAgICAgICAgYy0+Zm10X2N0eC5zdHJlYW1zW2ldLT5jb2RlYy0+ZnJhbWVfbnVtYmVyID0gMDsKLSAgICAgICAgfQotICAgICAgICAvKiBzZXQgb3V0cHV0IGZvcm1hdCBwYXJhbWV0ZXJzICovCi0gICAgICAgIGMtPmZtdF9jdHgub2Zvcm1hdCA9IGMtPnN0cmVhbS0+Zm10OwotICAgICAgICBjLT5mbXRfY3R4Lm5iX3N0cmVhbXMgPSBjLT5zdHJlYW0tPm5iX3N0cmVhbXM7Ci0KLSAgICAgICAgYy0+Z290X2tleV9mcmFtZSA9IDA7Ci0KLSAgICAgICAgLyogcHJlcGFyZSBoZWFkZXIgYW5kIHNhdmUgaGVhZGVyIGRhdGEgaW4gYSBzdHJlYW0gKi8KLSAgICAgICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZjLT5mbXRfY3R4LnBiKSA8IDApIHsKLSAgICAgICAgICAgIC8qIFhYWDogcG90ZW50aWFsIGxlYWsgKi8KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBjLT5mbXRfY3R4LnBiLT5zZWVrYWJsZSA9IDA7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSEFDSyB0byBhdm9pZCBNUEVHLVBTIG11eGVyIHRvIHNwaXQgbWFueSB1bmRlcmZsb3cgZXJyb3JzCi0gICAgICAgICAqIERlZmF1bHQgdmFsdWUgZnJvbSBGRm1wZWcKLSAgICAgICAgICogVHJ5IHRvIHNldCBpdCB1c2luZyBjb25maWd1cmF0aW9uIG9wdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgYy0+Zm10X2N0eC5tYXhfZGVsYXkgPSAoaW50KSgwLjcqQVZfVElNRV9CQVNFKTsKLQotICAgICAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigmYy0+Zm10X2N0eCwgTlVMTCkpIDwgMCkgewotICAgICAgICAgICAgaHR0cF9sb2coIkVycm9yIHdyaXRpbmcgb3V0cHV0IGhlYWRlciBmb3Igc3RyZWFtICclcyc6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5maWxlbmFtZSwgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfZGljdF9mcmVlKCZjLT5mbXRfY3R4Lm1ldGFkYXRhKTsKLQotICAgICAgICBsZW4gPSBhdmlvX2Nsb3NlX2R5bl9idWYoYy0+Zm10X2N0eC5wYiwgJmMtPnBiX2J1ZmZlcik7Ci0gICAgICAgIGMtPmJ1ZmZlcl9wdHIgPSBjLT5wYl9idWZmZXI7Ci0gICAgICAgIGMtPmJ1ZmZlcl9lbmQgPSBjLT5wYl9idWZmZXIgKyBsZW47Ci0KLSAgICAgICAgYy0+c3RhdGUgPSBIVFRQU1RBVEVfU0VORF9EQVRBOwotICAgICAgICBjLT5sYXN0X3BhY2tldF9zZW50ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIVFRQU1RBVEVfU0VORF9EQVRBOgotICAgICAgICAvKiBmaW5kIGEgbmV3IHBhY2tldCAqLwotICAgICAgICAvKiByZWFkIGEgcGFja2V0IGZyb20gdGhlIGlucHV0IHN0cmVhbSAqLwotICAgICAgICBpZiAoYy0+c3RyZWFtLT5mZWVkKQotICAgICAgICAgICAgZmZtX3NldF93cml0ZV9pbmRleChjLT5mbXRfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnN0cmVhbS0+ZmVlZC0+ZmVlZF93cml0ZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5mZWVkLT5mZWVkX3NpemUpOwotCi0gICAgICAgIGlmIChjLT5zdHJlYW0tPm1heF90aW1lICYmCi0gICAgICAgICAgICBjLT5zdHJlYW0tPm1heF90aW1lICsgYy0+c3RhcnRfdGltZSAtIGN1cl90aW1lIDwgMCkKLSAgICAgICAgICAgIC8qIFdlIGhhdmUgdGltZWQgb3V0ICovCi0gICAgICAgICAgICBjLT5zdGF0ZSA9IEhUVFBTVEFURV9TRU5EX0RBVEFfVFJBSUxFUjsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBBVlBhY2tldCBwa3Q7Ci0gICAgICAgIHJlZG86Ci0gICAgICAgICAgICByZXQgPSBhdl9yZWFkX2ZyYW1lKGMtPmZtdF9pbiwgJnBrdCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGlmIChjLT5zdHJlYW0tPmZlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaWYgY29taW5nIGZyb20gZmVlZCwgaXQgbWVhbnMgd2UgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgKiBmZm0gZmlsZSwgc28gbXVzdCB3YWl0IGZvciBtb3JlIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgYy0+c3RhdGUgPSBIVFRQU1RBVEVfV0FJVF9GRUVEOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgLyogc3RhdGUgY2hhbmdlZCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkgewotICAgICAgICAgICAgICAgICAgICAvKiBpbnB1dCBub3QgcmVhZHksIGNvbWUgYmFjayBsYXRlciAqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGMtPnN0cmVhbS0+bG9vcCkgewotICAgICAgICAgICAgICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmYy0+Zm10X2luKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wZW5faW5wdXRfc3RyZWFtKGMsICIiKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIG5vX2xvb3A7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gcmVkbzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBub19sb29wOgotICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVzdCBzZW5kIHRyYWlsZXIgbm93IGJlY2F1c2UgRU9GIG9yIGVycm9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjLT5zdGF0ZSA9IEhUVFBTVEFURV9TRU5EX0RBVEFfVFJBSUxFUjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBzb3VyY2VfaW5kZXggPSBwa3Quc3RyZWFtX2luZGV4OwotICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBmaXJzdCBwdHMgaWYgbmVlZGVkICovCi0gICAgICAgICAgICAgICAgaWYgKGMtPmZpcnN0X3B0cyA9PSBBVl9OT1BUU19WQUxVRSAmJiBwa3QuZHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmZpcnN0X3B0cyA9IGF2X3Jlc2NhbGVfcShwa3QuZHRzLCBjLT5mbXRfaW4tPnN0cmVhbXNbcGt0LnN0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOwotICAgICAgICAgICAgICAgICAgICBjLT5zdGFydF90aW1lID0gY3VyX3RpbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIHNlbmQgaXQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0cmVhbSAqLwotICAgICAgICAgICAgICAgIGlmIChjLT5zdHJlYW0tPmZlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogaWYgY29taW5nIGZyb20gYSBmZWVkLCBzZWxlY3QgdGhlIHJpZ2h0IHN0cmVhbSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoYy0+c3dpdGNoX3BlbmRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMtPnN3aXRjaF9wZW5kaW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcihpPTA7aTxjLT5zdHJlYW0tPm5iX3N0cmVhbXM7aSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGMtPnN3aXRjaF9mZWVkX3N0cmVhbXNbaV0gPT0gcGt0LnN0cmVhbV9pbmRleCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrdC5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnN3aXRjaF9mZWVkX3N0cmVhbXNbaV0gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYy0+c3dpdGNoX2ZlZWRfc3RyZWFtc1tpXSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zd2l0Y2hfcGVuZGluZyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDtpPGMtPnN0cmVhbS0+bmJfc3RyZWFtcztpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLT5zdHJlYW0tPmZlZWRfc3RyZWFtc1tpXSA9PSBwa3Quc3RyZWFtX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gYy0+Zm10X2luLT5zdHJlYW1zW3NvdXJjZV9pbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LnN0cmVhbV9pbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrdC5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5uYl9zdHJlYW1zID09IDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5nb3Rfa2V5X2ZyYW1lID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMtPnN0cmVhbS0+c2VuZF9vbl9rZXkgfHwgYy0+Z290X2tleV9mcmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzZW5kX2l0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOwotICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqaXN0LCAqb3N0OwotICAgICAgICAgICAgICAgIHNlbmRfaXQ6Ci0gICAgICAgICAgICAgICAgICAgIGlzdCA9IGMtPmZtdF9pbi0+c3RyZWFtc1tzb3VyY2VfaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAvKiBzcGVjaWZpYyBoYW5kbGluZyBmb3IgUlRQOiB3ZSB1c2Ugc2V2ZXJhbAotICAgICAgICAgICAgICAgICAgICAgKiBvdXRwdXQgc3RyZWFtcyAob25lIGZvciBlYWNoIFJUUCBjb25uZWN0aW9uKS4KLSAgICAgICAgICAgICAgICAgICAgICogWFhYOiBuZWVkIG1vcmUgYWJzdHJhY3QgaGFuZGxpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGMtPmlzX3BhY2tldGl6ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgc2VuZCB0aW1lIGFuZCBkdXJhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5jdXJfcHRzID0gYXZfcmVzY2FsZV9xKHBrdC5kdHMsIGlzdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y3VyX3B0cyAtPSBjLT5maXJzdF9wdHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjLT5jdXJfZnJhbWVfZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EocGt0LmR1cmF0aW9uLCBpc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogZmluZCBSVFAgY29udGV4dCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGFja2V0X3N0cmVhbV9pbmRleCA9IHBrdC5zdHJlYW1faW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdHggPSBjLT5ydHBfY3R4W2MtPnBhY2tldF9zdHJlYW1faW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWN0eCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjID0gY3R4LT5zdHJlYW1zWzBdLT5jb2RlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgb25lIHN0cmVhbSBwZXIgUlRQIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBrdC5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgY3R4ID0gJmMtPmZtdF9jdHg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGdWRnZSBoZXJlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjb2RlYyA9IGN0eC0+c3RyZWFtc1twa3Quc3RyZWFtX2luZGV4XS0+Y29kZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoYy0+aXNfcGFja2V0aXplZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9wYWNrZXRfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjLT5ydHBfcHJvdG9jb2wgPT0gUlRTUF9MT1dFUl9UUkFOU1BPUlRfVENQKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wYWNrZXRfc2l6ZSA9IFJUU1BfVENQX01BWF9QQUNLRVRfU0laRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcGFja2V0X3NpemUgPSBjLT5ydHBfaGFuZGxlc1tjLT5wYWNrZXRfc3RyZWFtX2luZGV4XS0+bWF4X3BhY2tldF9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmZpb19vcGVuX2R5bl9wYWNrZXRfYnVmKCZjdHgtPnBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wYWNrZXRfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmN0eC0+cGIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IHBvdGVudGlhbCBsZWFrICovCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3N0ID0gY3R4LT5zdHJlYW1zW3BrdC5zdHJlYW1faW5kZXhdOwotCi0gICAgICAgICAgICAgICAgICAgIGN0eC0+cGItPnNlZWthYmxlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICAgICAgICAgICAgICBwa3QuZHRzID0gYXZfcmVzY2FsZV9xKHBrdC5kdHMsIGlzdC0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICAgICAgcGt0LnB0cyA9IGF2X3Jlc2NhbGVfcShwa3QucHRzLCBpc3QtPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgICAgICAgICBwa3QuZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EocGt0LmR1cmF0aW9uLCBpc3QtPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+dGltZV9iYXNlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBhdl93cml0ZV9mcmFtZShjdHgsICZwa3QpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBfbG9nKCJFcnJvciB3cml0aW5nIGZyYW1lIHRvIG91dHB1dCBmb3Igc3RyZWFtICclcyc6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5maWxlbmFtZSwgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMtPnN0YXRlID0gSFRUUFNUQVRFX1NFTkRfREFUQV9UUkFJTEVSOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmMtPnBiX2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihjdHgtPnBiLCAmYy0+cGJfYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5wYiA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmN1cl9mcmFtZV9ieXRlcyA9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgYy0+YnVmZmVyX3B0ciA9IGMtPnBiX2J1ZmZlcjsKLSAgICAgICAgICAgICAgICAgICAgYy0+YnVmZmVyX2VuZCA9IGMtPnBiX2J1ZmZlciArIGxlbjsKLQotICAgICAgICAgICAgICAgICAgICBjb2RlYy0+ZnJhbWVfbnVtYmVyKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZWRvOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgSFRUUFNUQVRFX1NFTkRfREFUQV9UUkFJTEVSOgotICAgICAgICAvKiBsYXN0IHBhY2tldCB0ZXN0ID8gKi8KLSAgICAgICAgaWYgKGMtPmxhc3RfcGFja2V0X3NlbnQgfHwgYy0+aXNfcGFja2V0aXplZCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgY3R4ID0gJmMtPmZtdF9jdHg7Ci0gICAgICAgIC8qIHByZXBhcmUgaGVhZGVyICovCi0gICAgICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmY3R4LT5wYikgPCAwKSB7Ci0gICAgICAgICAgICAvKiBYWFg6IHBvdGVudGlhbCBsZWFrICovCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYy0+Zm10X2N0eC5wYi0+c2Vla2FibGUgPSAwOwotICAgICAgICBhdl93cml0ZV90cmFpbGVyKGN0eCk7Ci0gICAgICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihjdHgtPnBiLCAmYy0+cGJfYnVmZmVyKTsKLSAgICAgICAgYy0+YnVmZmVyX3B0ciA9IGMtPnBiX2J1ZmZlcjsKLSAgICAgICAgYy0+YnVmZmVyX2VuZCA9IGMtPnBiX2J1ZmZlciArIGxlbjsKLQotICAgICAgICBjLT5sYXN0X3BhY2tldF9zZW50ID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiBzaG91bGQgY29udmVydCB0aGUgZm9ybWF0IGF0IHRoZSBzYW1lIHRpbWUgKi8KLS8qIHNlbmQgZGF0YSBzdGFydGluZyBhdCBjLT5idWZmZXJfcHRyIHRvIHRoZSBvdXRwdXQgY29ubmVjdGlvbgotICogKGVpdGhlciBVRFAgb3IgVENQKQotICovCi1zdGF0aWMgaW50IGh0dHBfc2VuZF9kYXRhKEhUVFBDb250ZXh0ICpjKQotewotICAgIGludCBsZW4sIHJldDsKLQotICAgIGZvcig7OykgewotICAgICAgICBpZiAoYy0+YnVmZmVyX3B0ciA+PSBjLT5idWZmZXJfZW5kKSB7Ci0gICAgICAgICAgICByZXQgPSBodHRwX3ByZXBhcmVfZGF0YShjKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJldCkKLSAgICAgICAgICAgICAgICAvKiBzdGF0ZSBjaGFuZ2UgcmVxdWVzdGVkICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYy0+aXNfcGFja2V0aXplZCkgewotICAgICAgICAgICAgICAgIC8qIFJUUCBkYXRhIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIGxlbiA9IGMtPmJ1ZmZlcl9lbmQgLSBjLT5idWZmZXJfcHRyOwotICAgICAgICAgICAgICAgIGlmIChsZW4gPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIGZhaWwgc2FmZSAtIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KLSAgICAgICAgICAgICAgICBmYWlsMToKLSAgICAgICAgICAgICAgICAgICAgYy0+YnVmZmVyX3B0ciA9IGMtPmJ1ZmZlcl9lbmQ7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW4gPSAoYy0+YnVmZmVyX3B0clswXSA8PCAyNCkgfAotICAgICAgICAgICAgICAgICAgICAoYy0+YnVmZmVyX3B0clsxXSA8PCAxNikgfAotICAgICAgICAgICAgICAgICAgICAoYy0+YnVmZmVyX3B0clsyXSA8PCA4KSB8Ci0gICAgICAgICAgICAgICAgICAgIChjLT5idWZmZXJfcHRyWzNdKTsKLSAgICAgICAgICAgICAgICBpZiAobGVuID4gKGMtPmJ1ZmZlcl9lbmQgLSBjLT5idWZmZXJfcHRyKSkKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsMTsKLSAgICAgICAgICAgICAgICBpZiAoKGdldF9wYWNrZXRfc2VuZF9jbG9jayhjKSAtIGdldF9zZXJ2ZXJfY2xvY2soYykpID4gMCkgewotICAgICAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIHNlbmQgeWV0OiB3ZSBjYW4gd2FpdCAqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjLT5kYXRhX2NvdW50ICs9IGxlbjsKLSAgICAgICAgICAgICAgICB1cGRhdGVfZGF0YXJhdGUoJmMtPmRhdGFyYXRlLCBjLT5kYXRhX2NvdW50KTsKLSAgICAgICAgICAgICAgICBpZiAoYy0+c3RyZWFtKQotICAgICAgICAgICAgICAgICAgICBjLT5zdHJlYW0tPmJ5dGVzX3NlcnZlZCArPSBsZW47Ci0KLSAgICAgICAgICAgICAgICBpZiAoYy0+cnRwX3Byb3RvY29sID09IFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUCkgewotICAgICAgICAgICAgICAgICAgICAvKiBSVFAgcGFja2V0cyBhcmUgc2VudCBpbnNpZGUgdGhlIFJUU1AgVENQIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgQVZJT0NvbnRleHQgKnBiOwotICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJsZWF2ZWRfaW5kZXgsIHNpemU7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaGVhZGVyWzRdOwotICAgICAgICAgICAgICAgICAgICBIVFRQQ29udGV4dCAqcnRzcF9jOwotCi0gICAgICAgICAgICAgICAgICAgIHJ0c3BfYyA9IGMtPnJ0c3BfYzsKLSAgICAgICAgICAgICAgICAgICAgLyogaWYgbm8gUlRTUCBjb25uZWN0aW9uIGxlZnQsIGVycm9yICovCi0gICAgICAgICAgICAgICAgICAgIGlmICghcnRzcF9jKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICAvKiBpZiBhbHJlYWR5IHNlbmRpbmcgc29tZXRoaW5nLCB0aGVuIHdhaXQuICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChydHNwX2MtPnN0YXRlICE9IFJUU1BTVEFURV9XQUlUX1JFUVVFU1QpCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZwYikgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsMTsKLSAgICAgICAgICAgICAgICAgICAgaW50ZXJsZWF2ZWRfaW5kZXggPSBjLT5wYWNrZXRfc3RyZWFtX2luZGV4ICogMjsKLSAgICAgICAgICAgICAgICAgICAgLyogUlRDUCBwYWNrZXRzIGFyZSBzZW50IGF0IG9kZCBpbmRleGVzICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChjLT5idWZmZXJfcHRyWzFdID09IDIwMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVybGVhdmVkX2luZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHdyaXRlIFJUU1AgVENQIGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMF0gPSAnJCc7Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsxXSA9IGludGVybGVhdmVkX2luZGV4OwotICAgICAgICAgICAgICAgICAgICBoZWFkZXJbMl0gPSBsZW4gPj4gODsKLSAgICAgICAgICAgICAgICAgICAgaGVhZGVyWzNdID0gbGVuOwotICAgICAgICAgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBoZWFkZXIsIDQpOwotICAgICAgICAgICAgICAgICAgICAvKiB3cml0ZSBSVFAgcGFja2V0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgYy0+YnVmZmVyX3B0ciArPSA0OwotICAgICAgICAgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBjLT5idWZmZXJfcHRyLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICBzaXplID0gYXZpb19jbG9zZV9keW5fYnVmKHBiLCAmYy0+cGFja2V0X2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgIC8qIHByZXBhcmUgYXN5bmNocm9ub3VzIFRDUCBzZW5kaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHJ0c3BfYy0+cGFja2V0X2J1ZmZlcl9wdHIgPSBjLT5wYWNrZXRfYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICBydHNwX2MtPnBhY2tldF9idWZmZXJfZW5kID0gYy0+cGFja2V0X2J1ZmZlciArIHNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmJ1ZmZlcl9wdHIgKz0gbGVuOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHNlbmQgZXZlcnl0aGluZyB3ZSBjYW4gTk9XICovCi0gICAgICAgICAgICAgICAgICAgIGxlbiA9IHNlbmQocnRzcF9jLT5mZCwgcnRzcF9jLT5wYWNrZXRfYnVmZmVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHNwX2MtPnBhY2tldF9idWZmZXJfZW5kIC0gcnRzcF9jLT5wYWNrZXRfYnVmZmVyX3B0ciwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9jLT5wYWNrZXRfYnVmZmVyX3B0ciArPSBsZW47Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydHNwX2MtPnBhY2tldF9idWZmZXJfcHRyIDwgcnRzcF9jLT5wYWNrZXRfYnVmZmVyX2VuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgd2UgY291bGQgbm90IHNlbmQgYWxsIHRoZSBkYXRhLCB3ZSB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBzZW5kIGl0IGxhdGVyLCBzbyBhIG5ldyBzdGF0ZSBpcyBuZWVkZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAqICJsb2NrIiB0aGUgUlRTUCBUQ1AgY29ubmVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9jLT5zdGF0ZSA9IFJUU1BTVEFURV9TRU5EX1BBQ0tFVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbCBkYXRhIGhhcyBiZWVuIHNlbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZjLT5wYWNrZXRfYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiBzZW5kIFJUUCBwYWNrZXQgZGlyZWN0bHkgaW4gVURQICovCi0gICAgICAgICAgICAgICAgICAgIGMtPmJ1ZmZlcl9wdHIgKz0gNDsKLSAgICAgICAgICAgICAgICAgICAgZmZ1cmxfd3JpdGUoYy0+cnRwX2hhbmRsZXNbYy0+cGFja2V0X3N0cmVhbV9pbmRleF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmJ1ZmZlcl9wdHIsIGxlbik7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmJ1ZmZlcl9wdHIgKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICAvKiBoZXJlIHdlIGNvbnRpbnVlIGFzIHdlIGNhbiBzZW5kIHNldmVyYWwgcGFja2V0cwotICAgICAgICAgICAgICAgICAgICAgKiBwZXIgMTAgbXMgc2xvdCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogVENQIGRhdGEgb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgbGVuID0gc2VuZChjLT5mZCwgYy0+YnVmZmVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmJ1ZmZlcl9lbmQgLSBjLT5idWZmZXJfcHRyLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmZfbmV0ZXJybm8oKSAhPSBBVkVSUk9SKEVBR0FJTikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGZmX25ldGVycm5vKCkgIT0gQVZFUlJPUihFSU5UUikpCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvciA6IGNsb3NlIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGMtPmJ1ZmZlcl9wdHIgKz0gbGVuOwotCi0gICAgICAgICAgICAgICAgYy0+ZGF0YV9jb3VudCArPSBsZW47Ci0gICAgICAgICAgICAgICAgdXBkYXRlX2RhdGFyYXRlKCZjLT5kYXRhcmF0ZSwgYy0+ZGF0YV9jb3VudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGMtPnN0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5ieXRlc19zZXJ2ZWQgKz0gbGVuOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSAvKiBmb3IoOzspICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaHR0cF9zdGFydF9yZWNlaXZlX2RhdGEoSFRUUENvbnRleHQgKmMpCi17Ci0gICAgaW50IGZkOwotICAgIGludCByZXQ7Ci0KLSAgICBpZiAoYy0+c3RyZWFtLT5mZWVkX29wZW5lZCkgewotICAgICAgICBodHRwX2xvZygiU3RyZWFtIGZlZWQgJyVzJyB3YXMgbm90IG9wZW5lZFxuIiwKLSAgICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5mZWVkX2ZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICAvKiBEb24ndCBwZXJtaXQgd3JpdGluZyB0byB0aGlzIG9uZSAqLwotICAgIGlmIChjLT5zdHJlYW0tPnJlYWRvbmx5KSB7Ci0gICAgICAgIGh0dHBfbG9nKCJDYW5ub3Qgd3JpdGUgdG8gcmVhZC1vbmx5IGZpbGUgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgYy0+c3RyZWFtLT5mZWVkX2ZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIGZlZWQgKi8KLSAgICBmZCA9IG9wZW4oYy0+c3RyZWFtLT5mZWVkX2ZpbGVuYW1lLCBPX1JEV1IpOwotICAgIGlmIChmZCA8IDApIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7Ci0gICAgICAgIGh0dHBfbG9nKCJDb3VsZCBub3Qgb3BlbiBmZWVkIGZpbGUgJyVzJzogJXNcbiIsCi0gICAgICAgICAgICAgICAgIGMtPnN0cmVhbS0+ZmVlZF9maWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgYy0+ZmVlZF9mZCA9IGZkOwotCi0gICAgaWYgKGMtPnN0cmVhbS0+dHJ1bmNhdGUpIHsKLSAgICAgICAgLyogdHJ1bmNhdGUgZmVlZCBmaWxlICovCi0gICAgICAgIGZmbV93cml0ZV93cml0ZV9pbmRleChjLT5mZWVkX2ZkLCBGRk1fUEFDS0VUX1NJWkUpOwotICAgICAgICBodHRwX2xvZygiVHJ1bmNhdGluZyBmZWVkIGZpbGUgJyVzJ1xuIiwgYy0+c3RyZWFtLT5mZWVkX2ZpbGVuYW1lKTsKLSAgICAgICAgaWYgKGZ0cnVuY2F0ZShjLT5mZWVkX2ZkLCBGRk1fUEFDS0VUX1NJWkUpIDwgMCkgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7Ci0gICAgICAgICAgICBodHRwX2xvZygiRXJyb3IgdHJ1bmNhdGluZyBmZWVkIGZpbGUgJyVzJzogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICBjLT5zdHJlYW0tPmZlZWRfZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gZmZtX3JlYWRfd3JpdGVfaW5kZXgoZmQpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgaHR0cF9sb2coIkVycm9yIHJlYWRpbmcgd3JpdGUgaW5kZXggZnJvbSBmZWVkIGZpbGUgJyVzJzogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICBjLT5zdHJlYW0tPmZlZWRfZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIGMtPnN0cmVhbS0+ZmVlZF93cml0ZV9pbmRleCA9IHJldDsKLSAgICB9Ci0KLSAgICBjLT5zdHJlYW0tPmZlZWRfd3JpdGVfaW5kZXggPSBGRk1BWChmZm1fcmVhZF93cml0ZV9pbmRleChmZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNX1BBQ0tFVF9TSVpFKTsKLSAgICBjLT5zdHJlYW0tPmZlZWRfc2l6ZSA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7Ci0gICAgbHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKLQotICAgIC8qIGluaXQgYnVmZmVyIGlucHV0ICovCi0gICAgYy0+YnVmZmVyX3B0ciA9IGMtPmJ1ZmZlcjsKLSAgICBjLT5idWZmZXJfZW5kID0gYy0+YnVmZmVyICsgRkZNX1BBQ0tFVF9TSVpFOwotICAgIGMtPnN0cmVhbS0+ZmVlZF9vcGVuZWQgPSAxOwotICAgIGMtPmNodW5rZWRfZW5jb2RpbmcgPSAhIWF2X3N0cmlzdHIoYy0+YnVmZmVyLCAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBodHRwX3JlY2VpdmVfZGF0YShIVFRQQ29udGV4dCAqYykKLXsKLSAgICBIVFRQQ29udGV4dCAqYzE7Ci0gICAgaW50IGxlbiwgbG9vcF9ydW4gPSAwOwotCi0gICAgd2hpbGUgKGMtPmNodW5rZWRfZW5jb2RpbmcgJiYgIWMtPmNodW5rX3NpemUgJiYKLSAgICAgICAgICAgYy0+YnVmZmVyX2VuZCA+IGMtPmJ1ZmZlcl9wdHIpIHsKLSAgICAgICAgLyogcmVhZCBjaHVuayBoZWFkZXIsIGlmIHByZXNlbnQgKi8KLSAgICAgICAgbGVuID0gcmVjdihjLT5mZCwgYy0+YnVmZmVyX3B0ciwgMSwgMCk7Ci0KLSAgICAgICAgaWYgKGxlbiA8IDApIHsKLSAgICAgICAgICAgIGlmIChmZl9uZXRlcnJubygpICE9IEFWRVJST1IoRUFHQUlOKSAmJgotICAgICAgICAgICAgICAgIGZmX25ldGVycm5vKCkgIT0gQVZFUlJPUihFSU5UUikpCi0gICAgICAgICAgICAgICAgLyogZXJyb3IgOiBjbG9zZSBjb25uZWN0aW9uICovCi0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0gZWxzZSBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgIC8qIGVuZCBvZiBjb25uZWN0aW9uIDogY2xvc2UgaXQgKi8KLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfSBlbHNlIGlmIChjLT5idWZmZXJfcHRyIC0gYy0+YnVmZmVyID49IDIgJiYKLSAgICAgICAgICAgICAgICAgICAhbWVtY21wKGMtPmJ1ZmZlcl9wdHIgLSAxLCAiXHJcbiIsIDIpKSB7Ci0gICAgICAgICAgICBjLT5jaHVua19zaXplID0gc3RydG9sKGMtPmJ1ZmZlciwgMCwgMTYpOwotICAgICAgICAgICAgaWYgKGMtPmNodW5rX3NpemUgPT0gMCkgLy8gZW5kIG9mIHN0cmVhbQotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIGMtPmJ1ZmZlcl9wdHIgPSBjLT5idWZmZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmICgrK2xvb3BfcnVuID4gMTApCi0gICAgICAgICAgICAvKiBubyBjaHVuayBoZWFkZXIsIGFib3J0ICovCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGMtPmJ1ZmZlcl9wdHIrKzsKLSAgICB9Ci0KLSAgICBpZiAoYy0+YnVmZmVyX2VuZCA+IGMtPmJ1ZmZlcl9wdHIpIHsKLSAgICAgICAgbGVuID0gcmVjdihjLT5mZCwgYy0+YnVmZmVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICBGRk1JTihjLT5jaHVua19zaXplLCBjLT5idWZmZXJfZW5kIC0gYy0+YnVmZmVyX3B0ciksIDApOwotICAgICAgICBpZiAobGVuIDwgMCkgewotICAgICAgICAgICAgaWYgKGZmX25ldGVycm5vKCkgIT0gQVZFUlJPUihFQUdBSU4pICYmCi0gICAgICAgICAgICAgICAgZmZfbmV0ZXJybm8oKSAhPSBBVkVSUk9SKEVJTlRSKSkKLSAgICAgICAgICAgICAgICAvKiBlcnJvciA6IGNsb3NlIGNvbm5lY3Rpb24gKi8KLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0gZWxzZSBpZiAobGVuID09IDApCi0gICAgICAgICAgICAvKiBlbmQgb2YgY29ubmVjdGlvbiA6IGNsb3NlIGl0ICovCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgYy0+Y2h1bmtfc2l6ZSAtPSBsZW47Ci0gICAgICAgICAgICBjLT5idWZmZXJfcHRyICs9IGxlbjsKLSAgICAgICAgICAgIGMtPmRhdGFfY291bnQgKz0gbGVuOwotICAgICAgICAgICAgdXBkYXRlX2RhdGFyYXRlKCZjLT5kYXRhcmF0ZSwgYy0+ZGF0YV9jb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYy0+YnVmZmVyX3B0ciAtIGMtPmJ1ZmZlciA+PSAyICYmIGMtPmRhdGFfY291bnQgPiBGRk1fUEFDS0VUX1NJWkUpIHsKLSAgICAgICAgaWYgKGMtPmJ1ZmZlclswXSAhPSAnZicgfHwKLSAgICAgICAgICAgIGMtPmJ1ZmZlclsxXSAhPSAnbScpIHsKLSAgICAgICAgICAgIGh0dHBfbG9nKCJGZWVkIHN0cmVhbSBoYXMgYmVjb21lIGRlc3luY2hyb25pemVkIC0tIGRpc2Nvbm5lY3RpbmdcbiIpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGMtPmJ1ZmZlcl9wdHIgPj0gYy0+YnVmZmVyX2VuZCkgewotICAgICAgICBGRlNlcnZlclN0cmVhbSAqZmVlZCA9IGMtPnN0cmVhbTsKLSAgICAgICAgLyogYSBwYWNrZXQgaGFzIGJlZW4gcmVjZWl2ZWQgOiB3cml0ZSBpdCBpbiB0aGUgc3RvcmUsIGV4Y2VwdAotICAgICAgICAgKiBpZiBoZWFkZXIgKi8KLSAgICAgICAgaWYgKGMtPmRhdGFfY291bnQgPiBGRk1fUEFDS0VUX1NJWkUpIHsKLSAgICAgICAgICAgIC8qIFhYWDogdXNlIGxsc2VlayBvciB1cmxfc2VlawotICAgICAgICAgICAgICogWFhYOiBTaG91bGQgcHJvYmFibHkgZmFpbD8gKi8KLSAgICAgICAgICAgIGlmIChsc2VlayhjLT5mZWVkX2ZkLCBmZWVkLT5mZWVkX3dyaXRlX2luZGV4LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgICAgICAgICAgICAgaHR0cF9sb2coIlNlZWsgdG8gJSJQUklkNjQiIGZhaWxlZFxuIiwgZmVlZC0+ZmVlZF93cml0ZV9pbmRleCk7Ci0KLSAgICAgICAgICAgIGlmICh3cml0ZShjLT5mZWVkX2ZkLCBjLT5idWZmZXIsIEZGTV9QQUNLRVRfU0laRSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaHR0cF9sb2coIkVycm9yIHdyaXRpbmcgdG8gZmVlZCBmaWxlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZlZWQtPmZlZWRfd3JpdGVfaW5kZXggKz0gRkZNX1BBQ0tFVF9TSVpFOwotICAgICAgICAgICAgLyogdXBkYXRlIGZpbGUgc2l6ZSAqLwotICAgICAgICAgICAgaWYgKGZlZWQtPmZlZWRfd3JpdGVfaW5kZXggPiBjLT5zdHJlYW0tPmZlZWRfc2l6ZSkKLSAgICAgICAgICAgICAgICBmZWVkLT5mZWVkX3NpemUgPSBmZWVkLT5mZWVkX3dyaXRlX2luZGV4OwotCi0gICAgICAgICAgICAvKiBoYW5kbGUgd3JhcCBhcm91bmQgaWYgbWF4IGZpbGUgc2l6ZSByZWFjaGVkICovCi0gICAgICAgICAgICBpZiAoYy0+c3RyZWFtLT5mZWVkX21heF9zaXplICYmCi0gICAgICAgICAgICAgICAgZmVlZC0+ZmVlZF93cml0ZV9pbmRleCA+PSBjLT5zdHJlYW0tPmZlZWRfbWF4X3NpemUpCi0gICAgICAgICAgICAgICAgZmVlZC0+ZmVlZF93cml0ZV9pbmRleCA9IEZGTV9QQUNLRVRfU0laRTsKLQotICAgICAgICAgICAgLyogd3JpdGUgaW5kZXggKi8KLSAgICAgICAgICAgIGlmIChmZm1fd3JpdGVfd3JpdGVfaW5kZXgoYy0+ZmVlZF9mZCwgZmVlZC0+ZmVlZF93cml0ZV9pbmRleCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaHR0cF9sb2coIkVycm9yIHdyaXRpbmcgaW5kZXggdG8gZmVlZCBmaWxlOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogd2FrZSB1cCBhbnkgd2FpdGluZyBjb25uZWN0aW9ucyAqLwotICAgICAgICAgICAgZm9yKGMxID0gZmlyc3RfaHR0cF9jdHg7IGMxOyBjMSA9IGMxLT5uZXh0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGMxLT5zdGF0ZSA9PSBIVFRQU1RBVEVfV0FJVF9GRUVEICYmCi0gICAgICAgICAgICAgICAgICAgIGMxLT5zdHJlYW0tPmZlZWQgPT0gYy0+c3RyZWFtLT5mZWVkKQotICAgICAgICAgICAgICAgICAgICBjMS0+c3RhdGUgPSBIVFRQU1RBVEVfU0VORF9EQVRBOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogV2UgaGF2ZSBhIGhlYWRlciBpbiBvdXIgaGFuZHMgdGhhdCBjb250YWlucyB1c2VmdWwgZGF0YSAqLwotICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOwotICAgICAgICAgICAgQVZJT0NvbnRleHQgKnBiOwotICAgICAgICAgICAgQVZJbnB1dEZvcm1hdCAqZm10X2luOwotICAgICAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgICAgIGlmICghcykKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICAgICAgICAgIC8qIHVzZSBmZWVkIG91dHB1dCBmb3JtYXQgbmFtZSB0byBmaW5kIGNvcnJlc3BvbmRpbmcgaW5wdXQgZm9ybWF0ICovCi0gICAgICAgICAgICBmbXRfaW4gPSBhdl9maW5kX2lucHV0X2Zvcm1hdChmZWVkLT5mbXQtPm5hbWUpOwotICAgICAgICAgICAgaWYgKCFmbXRfaW4pCi0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotCi0gICAgICAgICAgICBwYiA9IGF2aW9fYWxsb2NfY29udGV4dChjLT5idWZmZXIsIGMtPmJ1ZmZlcl9lbmQgLSBjLT5idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgIGlmICghcGIpCi0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotCi0gICAgICAgICAgICBwYi0+c2Vla2FibGUgPSAwOwotCi0gICAgICAgICAgICBzLT5wYiA9IHBiOwotICAgICAgICAgICAgaWYgKGF2Zm9ybWF0X29wZW5faW5wdXQoJnMsIGMtPnN0cmVhbS0+ZmVlZF9maWxlbmFtZSwgZm10X2luLCBOVUxMKSA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcGIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogTm93IHdlIGhhdmUgdGhlIGFjdHVhbCBzdHJlYW1zICovCi0gICAgICAgICAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSBmZWVkLT5uYl9zdHJlYW1zKSB7Ci0gICAgICAgICAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJnMpOwotICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwYik7Ci0gICAgICAgICAgICAgICAgaHR0cF9sb2coIkZlZWQgJyVzJyBzdHJlYW0gbnVtYmVyIGRvZXMgbm90IG1hdGNoIHJlZ2lzdGVyZWQgZmVlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zdHJlYW0tPmZlZWRfZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgICAgIEFWU3RyZWFtICpmc3QgPSBmZWVkLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQoZnN0LT5jb2RlYywgc3QtPmNvZGVjKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJnMpOwotICAgICAgICAgICAgYXZfZnJlZXAoJnBiKTsKLSAgICAgICAgfQotICAgICAgICBjLT5idWZmZXJfcHRyID0gYy0+YnVmZmVyOwotICAgIH0KLQotICAgIHJldHVybiAwOwotIGZhaWw6Ci0gICAgYy0+c3RyZWFtLT5mZWVkX29wZW5lZCA9IDA7Ci0gICAgY2xvc2UoYy0+ZmVlZF9mZCk7Ci0gICAgLyogd2FrZSB1cCBhbnkgd2FpdGluZyBjb25uZWN0aW9ucyB0byBzdG9wIHdhaXRpbmcgZm9yIGZlZWQgKi8KLSAgICBmb3IoYzEgPSBmaXJzdF9odHRwX2N0eDsgYzE7IGMxID0gYzEtPm5leHQpIHsKLSAgICAgICAgaWYgKGMxLT5zdGF0ZSA9PSBIVFRQU1RBVEVfV0FJVF9GRUVEICYmCi0gICAgICAgICAgICBjMS0+c3RyZWFtLT5mZWVkID09IGMtPnN0cmVhbS0+ZmVlZCkKLSAgICAgICAgICAgIGMxLT5zdGF0ZSA9IEhUVFBTVEFURV9TRU5EX0RBVEFfVFJBSUxFUjsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBSVFNQIGhhbmRsaW5nICovCi0KLXN0YXRpYyB2b2lkIHJ0c3BfcmVwbHlfaGVhZGVyKEhUVFBDb250ZXh0ICpjLCBlbnVtIFJUU1BTdGF0dXNDb2RlIGVycm9yX251bWJlcikKLXsKLSAgICBjb25zdCBjaGFyICpzdHI7Ci0gICAgdGltZV90IHRpOwotICAgIHN0cnVjdCB0bSAqdG07Ci0gICAgY2hhciBidWYyWzMyXTsKLQotICAgIHN0ciA9IFJUU1BfU1RBVFVTX0NPREUyU1RSSU5HKGVycm9yX251bWJlcik7Ci0gICAgaWYgKCFzdHIpCi0gICAgICAgIHN0ciA9ICJVbmtub3duIEVycm9yIjsKLQotICAgIGF2aW9fcHJpbnRmKGMtPnBiLCAiUlRTUC8xLjAgJWQgJXNcclxuIiwgZXJyb3JfbnVtYmVyLCBzdHIpOwotICAgIGF2aW9fcHJpbnRmKGMtPnBiLCAiQ1NlcTogJWRcclxuIiwgYy0+c2VxKTsKLQotICAgIC8qIG91dHB1dCBHTVQgdGltZSAqLwotICAgIHRpID0gdGltZShOVUxMKTsKLSAgICB0bSA9IGdtdGltZSgmdGkpOwotICAgIHN0cmZ0aW1lKGJ1ZjIsIHNpemVvZihidWYyKSwgIiVhLCAlZCAlYiAlWSAlSDolTTolUyIsIHRtKTsKLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIkRhdGU6ICVzIEdNVFxyXG4iLCBidWYyKTsKLX0KLQotc3RhdGljIHZvaWQgcnRzcF9yZXBseV9lcnJvcihIVFRQQ29udGV4dCAqYywgZW51bSBSVFNQU3RhdHVzQ29kZSBlcnJvcl9udW1iZXIpCi17Ci0gICAgcnRzcF9yZXBseV9oZWFkZXIoYywgZXJyb3JfbnVtYmVyKTsKLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlxyXG4iKTsKLX0KLQotc3RhdGljIGludCBydHNwX3BhcnNlX3JlcXVlc3QoSFRUUENvbnRleHQgKmMpCi17Ci0gICAgY29uc3QgY2hhciAqcCwgKnAxLCAqcDI7Ci0gICAgY2hhciBjbWRbMzJdOwotICAgIGNoYXIgdXJsWzEwMjRdOwotICAgIGNoYXIgcHJvdG9jb2xbMzJdOwotICAgIGNoYXIgbGluZVsxMDI0XTsKLSAgICBpbnQgbGVuOwotICAgIFJUU1BNZXNzYWdlSGVhZGVyIGhlYWRlcjEgPSB7IDAgfSwgKmhlYWRlciA9ICZoZWFkZXIxOwotCi0gICAgYy0+YnVmZmVyX3B0clswXSA9ICdcMCc7Ci0gICAgcCA9IGMtPmJ1ZmZlcjsKLQotICAgIGdldF93b3JkKGNtZCwgc2l6ZW9mKGNtZCksICZwKTsKLSAgICBnZXRfd29yZCh1cmwsIHNpemVvZih1cmwpLCAmcCk7Ci0gICAgZ2V0X3dvcmQocHJvdG9jb2wsIHNpemVvZihwcm90b2NvbCksICZwKTsKLQotICAgIGF2X3N0cmxjcHkoYy0+bWV0aG9kLCBjbWQsIHNpemVvZihjLT5tZXRob2QpKTsKLSAgICBhdl9zdHJsY3B5KGMtPnVybCwgdXJsLCBzaXplb2YoYy0+dXJsKSk7Ci0gICAgYXZfc3RybGNweShjLT5wcm90b2NvbCwgcHJvdG9jb2wsIHNpemVvZihjLT5wcm90b2NvbCkpOwotCi0gICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZjLT5wYikgPCAwKSB7Ci0gICAgICAgIC8qIFhYWDogY2Fubm90IGRvIG1vcmUgKi8KLSAgICAgICAgYy0+cGIgPSBOVUxMOyAvKiBzYWZldHkgKi8KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHZlcnNpb24gbmFtZSAqLwotICAgIGlmIChzdHJjbXAocHJvdG9jb2wsICJSVFNQLzEuMCIpKSB7Ci0gICAgICAgIHJ0c3BfcmVwbHlfZXJyb3IoYywgUlRTUF9TVEFUVVNfVkVSU0lPTik7Ci0gICAgICAgIGdvdG8gdGhlX2VuZDsKLSAgICB9Ci0KLSAgICAvKiBwYXJzZSBlYWNoIGhlYWRlciBsaW5lICovCi0gICAgLyogc2tpcCB0byBuZXh0IGxpbmUgKi8KLSAgICB3aGlsZSAoKnAgIT0gJ1xuJyAmJiAqcCAhPSAnXDAnKQotICAgICAgICBwKys7Ci0gICAgaWYgKCpwID09ICdcbicpCi0gICAgICAgIHArKzsKLSAgICB3aGlsZSAoKnAgIT0gJ1wwJykgewotICAgICAgICBwMSA9IG1lbWNocihwLCAnXG4nLCAoY2hhciAqKWMtPmJ1ZmZlcl9wdHIgLSBwKTsKLSAgICAgICAgaWYgKCFwMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBwMiA9IHAxOwotICAgICAgICBpZiAocDIgPiBwICYmIHAyWy0xXSA9PSAnXHInKQotICAgICAgICAgICAgcDItLTsKLSAgICAgICAgLyogc2tpcCBlbXB0eSBsaW5lICovCi0gICAgICAgIGlmIChwMiA9PSBwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGxlbiA9IHAyIC0gcDsKLSAgICAgICAgaWYgKGxlbiA+IHNpemVvZihsaW5lKSAtIDEpCi0gICAgICAgICAgICBsZW4gPSBzaXplb2YobGluZSkgLSAxOwotICAgICAgICBtZW1jcHkobGluZSwgcCwgbGVuKTsKLSAgICAgICAgbGluZVtsZW5dID0gJ1wwJzsKLSAgICAgICAgZmZfcnRzcF9wYXJzZV9saW5lKE5VTEwsIGhlYWRlciwgbGluZSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIHAgPSBwMSArIDE7Ci0gICAgfQotCi0gICAgLyogaGFuZGxlIHNlcXVlbmNlIG51bWJlciAqLwotICAgIGMtPnNlcSA9IGhlYWRlci0+c2VxOwotCi0gICAgaWYgKCFzdHJjbXAoY21kLCAiREVTQ1JJQkUiKSkKLSAgICAgICAgcnRzcF9jbWRfZGVzY3JpYmUoYywgdXJsKTsKLSAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgIk9QVElPTlMiKSkKLSAgICAgICAgcnRzcF9jbWRfb3B0aW9ucyhjLCB1cmwpOwotICAgIGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiU0VUVVAiKSkKLSAgICAgICAgcnRzcF9jbWRfc2V0dXAoYywgdXJsLCBoZWFkZXIpOwotICAgIGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiUExBWSIpKQotICAgICAgICBydHNwX2NtZF9wbGF5KGMsIHVybCwgaGVhZGVyKTsKLSAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgIlBBVVNFIikpCi0gICAgICAgIHJ0c3BfY21kX2ludGVycnVwdChjLCB1cmwsIGhlYWRlciwgMSk7Ci0gICAgZWxzZSBpZiAoIXN0cmNtcChjbWQsICJURUFSRE9XTiIpKQotICAgICAgICBydHNwX2NtZF9pbnRlcnJ1cHQoYywgdXJsLCBoZWFkZXIsIDApOwotICAgIGVsc2UKLSAgICAgICAgcnRzcF9yZXBseV9lcnJvcihjLCBSVFNQX1NUQVRVU19NRVRIT0QpOwotCi0gdGhlX2VuZDoKLSAgICBsZW4gPSBhdmlvX2Nsb3NlX2R5bl9idWYoYy0+cGIsICZjLT5wYl9idWZmZXIpOwotICAgIGMtPnBiID0gTlVMTDsgLyogc2FmZXR5ICovCi0gICAgaWYgKGxlbiA8IDApCi0gICAgICAgIC8qIFhYWDogY2Fubm90IGRvIG1vcmUgKi8KLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgYy0+YnVmZmVyX3B0ciA9IGMtPnBiX2J1ZmZlcjsKLSAgICBjLT5idWZmZXJfZW5kID0gYy0+cGJfYnVmZmVyICsgbGVuOwotICAgIGMtPnN0YXRlID0gUlRTUFNUQVRFX1NFTkRfUkVQTFk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHJlcGFyZV9zZHBfZGVzY3JpcHRpb24oRkZTZXJ2ZXJTdHJlYW0gKnN0cmVhbSwgdWludDhfdCAqKnBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9hZGRyIG15X2lwKQotewotICAgIEFWRm9ybWF0Q29udGV4dCAqYXZjOwotICAgIEFWU3RyZWFtICphdnMgPSBOVUxMOwotICAgIEFWT3V0cHV0Rm9ybWF0ICpydHBfZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KCJydHAiLCBOVUxMLCBOVUxMKTsKLSAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZW50cnkgPSBhdl9kaWN0X2dldChzdHJlYW0tPm1ldGFkYXRhLCAidGl0bGUiLCBOVUxMLCAwKTsKLSAgICBpbnQgaTsKLQotICAgICpwYnVmZmVyID0gTlVMTDsKLQotICAgIGF2YyA9ICBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7Ci0gICAgaWYgKCFhdmMgfHwgIXJ0cF9mb3JtYXQpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGF2Yy0+b2Zvcm1hdCA9IHJ0cF9mb3JtYXQ7Ci0gICAgYXZfZGljdF9zZXQoJmF2Yy0+bWV0YWRhdGEsICJ0aXRsZSIsCi0gICAgICAgICAgICAgICAgZW50cnkgPyBlbnRyeS0+dmFsdWUgOiAiTm8gVGl0bGUiLCAwKTsKLSAgICBhdmMtPm5iX3N0cmVhbXMgPSBzdHJlYW0tPm5iX3N0cmVhbXM7Ci0gICAgaWYgKHN0cmVhbS0+aXNfbXVsdGljYXN0KSB7Ci0gICAgICAgIHNucHJpbnRmKGF2Yy0+ZmlsZW5hbWUsIDEwMjQsICJydHA6Ly8lczolZD9tdWx0aWNhc3Q9MT90dGw9JWQiLAotICAgICAgICAgICAgICAgICBpbmV0X250b2Eoc3RyZWFtLT5tdWx0aWNhc3RfaXApLAotICAgICAgICAgICAgICAgICBzdHJlYW0tPm11bHRpY2FzdF9wb3J0LCBzdHJlYW0tPm11bHRpY2FzdF90dGwpOwotICAgIH0gZWxzZQotICAgICAgICBzbnByaW50ZihhdmMtPmZpbGVuYW1lLCAxMDI0LCAicnRwOi8vMC4wLjAuMCIpOwotCi0gICAgYXZjLT5zdHJlYW1zID0gYXZfbWFsbG9jX2FycmF5KGF2Yy0+bmJfc3RyZWFtcywgc2l6ZW9mKCphdmMtPnN0cmVhbXMpKTsKLSAgICBpZiAoIWF2Yy0+c3RyZWFtcykKLSAgICAgICAgZ290byBzZHBfZG9uZTsKLQotICAgIGF2cyA9IGF2X21hbGxvY19hcnJheShhdmMtPm5iX3N0cmVhbXMsIHNpemVvZigqYXZzKSk7Ci0gICAgaWYgKCFhdnMpCi0gICAgICAgIGdvdG8gc2RwX2RvbmU7Ci0KLSAgICBmb3IoaSA9IDA7IGkgPCBzdHJlYW0tPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBhdmMtPnN0cmVhbXNbaV0gPSAmYXZzW2ldOwotICAgICAgICBhdmMtPnN0cmVhbXNbaV0tPmNvZGVjID0gc3RyZWFtLT5zdHJlYW1zW2ldLT5jb2RlYzsKLSAgICB9Ci0gICAgKnBidWZmZXIgPSBhdl9tYWxsb2N6KDIwNDgpOwotICAgIGlmICghKnBidWZmZXIpCi0gICAgICAgIGdvdG8gc2RwX2RvbmU7Ci0gICAgYXZfc2RwX2NyZWF0ZSgmYXZjLCAxLCAqcGJ1ZmZlciwgMjA0OCk7Ci0KLSBzZHBfZG9uZToKLSAgICBhdl9mcmVlcCgmYXZjLT5zdHJlYW1zKTsKLSAgICBhdl9kaWN0X2ZyZWUoJmF2Yy0+bWV0YWRhdGEpOwotICAgIGF2X2ZyZWUoYXZjKTsKLSAgICBhdl9mcmVlKGF2cyk7Ci0KLSAgICByZXR1cm4gKnBidWZmZXIgPyBzdHJsZW4oKnBidWZmZXIpIDogQVZFUlJPUihFTk9NRU0pOwotfQotCi1zdGF0aWMgdm9pZCBydHNwX2NtZF9vcHRpb25zKEhUVFBDb250ZXh0ICpjLCBjb25zdCBjaGFyICp1cmwpCi17Ci0gICAgLyogcnRzcF9yZXBseV9oZWFkZXIoYywgUlRTUF9TVEFUVVNfT0spOyAqLwotICAgIGF2aW9fcHJpbnRmKGMtPnBiLCAiUlRTUC8xLjAgJWQgJXNcclxuIiwgUlRTUF9TVEFUVVNfT0ssICJPSyIpOwotICAgIGF2aW9fcHJpbnRmKGMtPnBiLCAiQ1NlcTogJWRcclxuIiwgYy0+c2VxKTsKLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlB1YmxpYzogJXNcclxuIiwKLSAgICAgICAgICAgICAgICAiT1BUSU9OUywgREVTQ1JJQkUsIFNFVFVQLCBURUFSRE9XTiwgUExBWSwgUEFVU0UiKTsKLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlxyXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgcnRzcF9jbWRfZGVzY3JpYmUoSFRUUENvbnRleHQgKmMsIGNvbnN0IGNoYXIgKnVybCkKLXsKLSAgICBGRlNlcnZlclN0cmVhbSAqc3RyZWFtOwotICAgIGNoYXIgcGF0aDFbMTAyNF07Ci0gICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICB1aW50OF90ICpjb250ZW50OwotICAgIGludCBjb250ZW50X2xlbmd0aDsKLSAgICBzb2NrbGVuX3QgbGVuOwotICAgIHN0cnVjdCBzb2NrYWRkcl9pbiBteV9hZGRyOwotCi0gICAgLyogZmluZCB3aGljaCBVUkwgaXMgYXNrZWQgKi8KLSAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgcGF0aDEsIHNpemVvZihwYXRoMSksIHVybCk7Ci0gICAgcGF0aCA9IHBhdGgxOwotICAgIGlmICgqcGF0aCA9PSAnLycpCi0gICAgICAgIHBhdGgrKzsKLQotICAgIGZvcihzdHJlYW0gPSBjb25maWcuZmlyc3Rfc3RyZWFtOyBzdHJlYW07IHN0cmVhbSA9IHN0cmVhbS0+bmV4dCkgewotICAgICAgICBpZiAoIXN0cmVhbS0+aXNfZmVlZCAmJgotICAgICAgICAgICAgc3RyZWFtLT5mbXQgJiYgIXN0cmNtcChzdHJlYW0tPmZtdC0+bmFtZSwgInJ0cCIpICYmCi0gICAgICAgICAgICAhc3RyY21wKHBhdGgsIHN0cmVhbS0+ZmlsZW5hbWUpKSB7Ci0gICAgICAgICAgICBnb3RvIGZvdW5kOwotICAgICAgICB9Ci0gICAgfQotICAgIC8qIG5vIHN0cmVhbSBmb3VuZCAqLwotICAgIHJ0c3BfcmVwbHlfZXJyb3IoYywgUlRTUF9TVEFUVVNfTk9UX0ZPVU5EKTsKLSAgICByZXR1cm47Ci0KLSBmb3VuZDoKLSAgICAvKiBwcmVwYXJlIHRoZSBtZWRpYSBkZXNjcmlwdGlvbiBpbiBTRFAgZm9ybWF0ICovCi0KLSAgICAvKiBnZXQgdGhlIGhvc3QgSVAgKi8KLSAgICBsZW4gPSBzaXplb2YobXlfYWRkcik7Ci0gICAgZ2V0c29ja25hbWUoYy0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbXlfYWRkciwgJmxlbik7Ci0gICAgY29udGVudF9sZW5ndGggPSBwcmVwYXJlX3NkcF9kZXNjcmlwdGlvbihzdHJlYW0sICZjb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfYWRkci5zaW5fYWRkcik7Ci0gICAgaWYgKGNvbnRlbnRfbGVuZ3RoIDwgMCkgewotICAgICAgICBydHNwX3JlcGx5X2Vycm9yKGMsIFJUU1BfU1RBVFVTX0lOVEVSTkFMKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBydHNwX3JlcGx5X2hlYWRlcihjLCBSVFNQX1NUQVRVU19PSyk7Ci0gICAgYXZpb19wcmludGYoYy0+cGIsICJDb250ZW50LUJhc2U6ICVzL1xyXG4iLCB1cmwpOwotICAgIGF2aW9fcHJpbnRmKGMtPnBiLCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9zZHBcclxuIik7Ci0gICAgYXZpb19wcmludGYoYy0+cGIsICJDb250ZW50LUxlbmd0aDogJWRcclxuIiwgY29udGVudF9sZW5ndGgpOwotICAgIGF2aW9fcHJpbnRmKGMtPnBiLCAiXHJcbiIpOwotICAgIGF2aW9fd3JpdGUoYy0+cGIsIGNvbnRlbnQsIGNvbnRlbnRfbGVuZ3RoKTsKLSAgICBhdl9mcmVlKGNvbnRlbnQpOwotfQotCi1zdGF0aWMgSFRUUENvbnRleHQgKmZpbmRfcnRwX3Nlc3Npb24oY29uc3QgY2hhciAqc2Vzc2lvbl9pZCkKLXsKLSAgICBIVFRQQ29udGV4dCAqYzsKLQotICAgIGlmIChzZXNzaW9uX2lkWzBdID09ICdcMCcpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZm9yKGMgPSBmaXJzdF9odHRwX2N0eDsgYzsgYyA9IGMtPm5leHQpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYy0+c2Vzc2lvbl9pZCwgc2Vzc2lvbl9pZCkpCi0gICAgICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBSVFNQVHJhbnNwb3J0RmllbGQgKmZpbmRfdHJhbnNwb3J0KFJUU1BNZXNzYWdlSGVhZGVyICpoLCBlbnVtIFJUU1BMb3dlclRyYW5zcG9ydCBsb3dlcl90cmFuc3BvcnQpCi17Ci0gICAgUlRTUFRyYW5zcG9ydEZpZWxkICp0aDsKLSAgICBpbnQgaTsKLQotICAgIGZvcihpPTA7aTxoLT5uYl90cmFuc3BvcnRzO2krKykgewotICAgICAgICB0aCA9ICZoLT50cmFuc3BvcnRzW2ldOwotICAgICAgICBpZiAodGgtPmxvd2VyX3RyYW5zcG9ydCA9PSBsb3dlcl90cmFuc3BvcnQpCi0gICAgICAgICAgICByZXR1cm4gdGg7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBydHNwX2NtZF9zZXR1cChIVFRQQ29udGV4dCAqYywgY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRTUE1lc3NhZ2VIZWFkZXIgKmgpCi17Ci0gICAgRkZTZXJ2ZXJTdHJlYW0gKnN0cmVhbTsKLSAgICBpbnQgc3RyZWFtX2luZGV4LCBydHBfcG9ydCwgcnRjcF9wb3J0OwotICAgIGNoYXIgYnVmWzEwMjRdOwotICAgIGNoYXIgcGF0aDFbMTAyNF07Ci0gICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICBIVFRQQ29udGV4dCAqcnRwX2M7Ci0gICAgUlRTUFRyYW5zcG9ydEZpZWxkICp0aDsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gZGVzdF9hZGRyOwotICAgIFJUU1BBY3Rpb25TZXJ2ZXJTZXR1cCBzZXR1cDsKLQotICAgIC8qIGZpbmQgd2hpY2ggVVJMIGlzIGFza2VkICovCi0gICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwsIHBhdGgxLCBzaXplb2YocGF0aDEpLCB1cmwpOwotICAgIHBhdGggPSBwYXRoMTsKLSAgICBpZiAoKnBhdGggPT0gJy8nKQotICAgICAgICBwYXRoKys7Ci0KLSAgICAvKiBub3cgY2hlY2sgZWFjaCBzdHJlYW0gKi8KLSAgICBmb3Ioc3RyZWFtID0gY29uZmlnLmZpcnN0X3N0cmVhbTsgc3RyZWFtOyBzdHJlYW0gPSBzdHJlYW0tPm5leHQpIHsKLSAgICAgICAgaWYgKHN0cmVhbS0+aXNfZmVlZCB8fCAhc3RyZWFtLT5mbXQgfHwKLSAgICAgICAgICAgIHN0cmNtcChzdHJlYW0tPmZtdC0+bmFtZSwgInJ0cCIpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvKiBhY2NlcHQgYWdncmVnYXRlIGZpbGVuYW1lcyBvbmx5IGlmIHNpbmdsZSBzdHJlYW0gKi8KLSAgICAgICAgaWYgKCFzdHJjbXAocGF0aCwgc3RyZWFtLT5maWxlbmFtZSkpIHsKLSAgICAgICAgICAgIGlmIChzdHJlYW0tPm5iX3N0cmVhbXMgIT0gMSkgewotICAgICAgICAgICAgICAgIHJ0c3BfcmVwbHlfZXJyb3IoYywgUlRTUF9TVEFUVVNfQUdHUkVHQVRFKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJlYW1faW5kZXggPSAwOwotICAgICAgICAgICAgZ290byBmb3VuZDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihzdHJlYW1faW5kZXggPSAwOyBzdHJlYW1faW5kZXggPCBzdHJlYW0tPm5iX3N0cmVhbXM7Ci0gICAgICAgICAgICBzdHJlYW1faW5kZXgrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzL3N0cmVhbWlkPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+ZmlsZW5hbWUsIHN0cmVhbV9pbmRleCk7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChwYXRoLCBidWYpKQotICAgICAgICAgICAgICAgIGdvdG8gZm91bmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLyogbm8gc3RyZWFtIGZvdW5kICovCi0gICAgcnRzcF9yZXBseV9lcnJvcihjLCBSVFNQX1NUQVRVU19TRVJWSUNFKTsgLyogWFhYOiByaWdodCBlcnJvciA/ICovCi0gICAgcmV0dXJuOwotIGZvdW5kOgotCi0gICAgLyogZ2VuZXJhdGUgc2Vzc2lvbiBpZCBpZiBuZWVkZWQgKi8KLSAgICBpZiAoaC0+c2Vzc2lvbl9pZFswXSA9PSAnXDAnKSB7Ci0gICAgICAgIHVuc2lnbmVkIHJhbmRvbTAgPSBhdl9sZmdfZ2V0KCZyYW5kb21fc3RhdGUpOwotICAgICAgICB1bnNpZ25lZCByYW5kb20xID0gYXZfbGZnX2dldCgmcmFuZG9tX3N0YXRlKTsKLSAgICAgICAgc25wcmludGYoaC0+c2Vzc2lvbl9pZCwgc2l6ZW9mKGgtPnNlc3Npb25faWQpLCAiJTA4eCUwOHgiLAotICAgICAgICAgICAgICAgICByYW5kb20wLCByYW5kb20xKTsKLSAgICB9Ci0KLSAgICAvKiBmaW5kIFJUUCBzZXNzaW9uLCBhbmQgY3JlYXRlIGl0IGlmIG5vbmUgZm91bmQgKi8KLSAgICBydHBfYyA9IGZpbmRfcnRwX3Nlc3Npb24oaC0+c2Vzc2lvbl9pZCk7Ci0gICAgaWYgKCFydHBfYykgewotICAgICAgICAvKiBhbHdheXMgcHJlZmVyIFVEUCAqLwotICAgICAgICB0aCA9IGZpbmRfdHJhbnNwb3J0KGgsIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUCk7Ci0gICAgICAgIGlmICghdGgpIHsKLSAgICAgICAgICAgIHRoID0gZmluZF90cmFuc3BvcnQoaCwgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVENQKTsKLSAgICAgICAgICAgIGlmICghdGgpIHsKLSAgICAgICAgICAgICAgICBydHNwX3JlcGx5X2Vycm9yKGMsIFJUU1BfU1RBVFVTX1RSQU5TUE9SVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcnRwX2MgPSBydHBfbmV3X2Nvbm5lY3Rpb24oJmMtPmZyb21fYWRkciwgc3RyZWFtLCBoLT5zZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+bG93ZXJfdHJhbnNwb3J0KTsKLSAgICAgICAgaWYgKCFydHBfYykgewotICAgICAgICAgICAgcnRzcF9yZXBseV9lcnJvcihjLCBSVFNQX1NUQVRVU19CQU5EV0lEVEgpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogb3BlbiBpbnB1dCBzdHJlYW0gKi8KLSAgICAgICAgaWYgKG9wZW5faW5wdXRfc3RyZWFtKHJ0cF9jLCAiIikgPCAwKSB7Ci0gICAgICAgICAgICBydHNwX3JlcGx5X2Vycm9yKGMsIFJUU1BfU1RBVFVTX0lOVEVSTkFMKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIHRlc3QgaWYgc3RyZWFtIGlzIE9LICh0ZXN0IG5lZWRlZCBiZWNhdXNlIHNldmVyYWwgU0VUVVAgbmVlZHMKLSAgICAgKiB0byBiZSBkb25lIGZvciBhIGdpdmVuIGZpbGUpICovCi0gICAgaWYgKHJ0cF9jLT5zdHJlYW0gIT0gc3RyZWFtKSB7Ci0gICAgICAgIHJ0c3BfcmVwbHlfZXJyb3IoYywgUlRTUF9TVEFUVVNfU0VSVklDRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiB0ZXN0IGlmIHN0cmVhbSBpcyBhbHJlYWR5IHNldCB1cCAqLwotICAgIGlmIChydHBfYy0+cnRwX2N0eFtzdHJlYW1faW5kZXhdKSB7Ci0gICAgICAgIHJ0c3BfcmVwbHlfZXJyb3IoYywgUlRTUF9TVEFUVVNfU1RBVEUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogY2hlY2sgdHJhbnNwb3J0ICovCi0gICAgdGggPSBmaW5kX3RyYW5zcG9ydChoLCBydHBfYy0+cnRwX3Byb3RvY29sKTsKLSAgICBpZiAoIXRoIHx8ICh0aC0+bG93ZXJfdHJhbnNwb3J0ID09IFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUCAmJgotICAgICAgICAgICAgICAgIHRoLT5jbGllbnRfcG9ydF9taW4gPD0gMCkpIHsKLSAgICAgICAgcnRzcF9yZXBseV9lcnJvcihjLCBSVFNQX1NUQVRVU19UUkFOU1BPUlQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogc2V0dXAgZGVmYXVsdCBvcHRpb25zICovCi0gICAgc2V0dXAudHJhbnNwb3J0X29wdGlvblswXSA9ICdcMCc7Ci0gICAgZGVzdF9hZGRyID0gcnRwX2MtPmZyb21fYWRkcjsKLSAgICBkZXN0X2FkZHIuc2luX3BvcnQgPSBodG9ucyh0aC0+Y2xpZW50X3BvcnRfbWluKTsKLQotICAgIC8qIHNldHVwIHN0cmVhbSAqLwotICAgIGlmIChydHBfbmV3X2F2X3N0cmVhbShydHBfYywgc3RyZWFtX2luZGV4LCAmZGVzdF9hZGRyLCBjKSA8IDApIHsKLSAgICAgICAgcnRzcF9yZXBseV9lcnJvcihjLCBSVFNQX1NUQVRVU19UUkFOU1BPUlQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogbm93IGV2ZXJ5dGhpbmcgaXMgT0ssIHNvIHdlIGNhbiBzZW5kIHRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgKi8KLSAgICBydHNwX3JlcGx5X2hlYWRlcihjLCBSVFNQX1NUQVRVU19PSyk7Ci0gICAgLyogc2Vzc2lvbiBJRCAqLwotICAgIGF2aW9fcHJpbnRmKGMtPnBiLCAiU2Vzc2lvbjogJXNcclxuIiwgcnRwX2MtPnNlc3Npb25faWQpOwotCi0gICAgc3dpdGNoKHJ0cF9jLT5ydHBfcHJvdG9jb2wpIHsKLSAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUDoKLSAgICAgICAgcnRwX3BvcnQgPSBmZl9ydHBfZ2V0X2xvY2FsX3J0cF9wb3J0KHJ0cF9jLT5ydHBfaGFuZGxlc1tzdHJlYW1faW5kZXhdKTsKLSAgICAgICAgcnRjcF9wb3J0ID0gZmZfcnRwX2dldF9sb2NhbF9ydGNwX3BvcnQocnRwX2MtPnJ0cF9oYW5kbGVzW3N0cmVhbV9pbmRleF0pOwotICAgICAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlRyYW5zcG9ydDogUlRQL0FWUC9VRFA7dW5pY2FzdDsiCi0gICAgICAgICAgICAgICAgICAgICJjbGllbnRfcG9ydD0lZC0lZDtzZXJ2ZXJfcG9ydD0lZC0lZCIsCi0gICAgICAgICAgICAgICAgICAgIHRoLT5jbGllbnRfcG9ydF9taW4sIHRoLT5jbGllbnRfcG9ydF9tYXgsCi0gICAgICAgICAgICAgICAgICAgIHJ0cF9wb3J0LCBydGNwX3BvcnQpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUDoKLSAgICAgICAgYXZpb19wcmludGYoYy0+cGIsICJUcmFuc3BvcnQ6IFJUUC9BVlAvVENQO2ludGVybGVhdmVkPSVkLSVkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2luZGV4ICogMiwgc3RyZWFtX2luZGV4ICogMiArIDEpOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKHNldHVwLnRyYW5zcG9ydF9vcHRpb25bMF0gIT0gJ1wwJykKLSAgICAgICAgYXZpb19wcmludGYoYy0+cGIsICI7JXMiLCBzZXR1cC50cmFuc3BvcnRfb3B0aW9uKTsKLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlxyXG4iKTsKLQotCi0gICAgYXZpb19wcmludGYoYy0+cGIsICJcclxuIik7Ci19Ci0KLQotLyoqCi0gKiBmaW5kIGFuIFJUUCBjb25uZWN0aW9uIGJ5IHVzaW5nIHRoZSBzZXNzaW9uIElELiBDaGVjayBjb25zaXN0ZW5jeQotICogd2l0aCBmaWxlbmFtZQotICovCi1zdGF0aWMgSFRUUENvbnRleHQgKmZpbmRfcnRwX3Nlc3Npb25fd2l0aF91cmwoY29uc3QgY2hhciAqdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnNlc3Npb25faWQpCi17Ci0gICAgSFRUUENvbnRleHQgKnJ0cF9jOwotICAgIGNoYXIgcGF0aDFbMTAyNF07Ci0gICAgY29uc3QgY2hhciAqcGF0aDsKLSAgICBjaGFyIGJ1ZlsxMDI0XTsKLSAgICBpbnQgcywgbGVuOwotCi0gICAgcnRwX2MgPSBmaW5kX3J0cF9zZXNzaW9uKHNlc3Npb25faWQpOwotICAgIGlmICghcnRwX2MpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogZmluZCB3aGljaCBVUkwgaXMgYXNrZWQgKi8KLSAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgMCwgTlVMTCwgcGF0aDEsIHNpemVvZihwYXRoMSksIHVybCk7Ci0gICAgcGF0aCA9IHBhdGgxOwotICAgIGlmICgqcGF0aCA9PSAnLycpCi0gICAgICAgIHBhdGgrKzsKLSAgICBpZighc3RyY21wKHBhdGgsIHJ0cF9jLT5zdHJlYW0tPmZpbGVuYW1lKSkgcmV0dXJuIHJ0cF9jOwotICAgIGZvcihzPTA7IHM8cnRwX2MtPnN0cmVhbS0+bmJfc3RyZWFtczsgKytzKSB7Ci0gICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMvc3RyZWFtaWQ9JWQiLAotICAgICAgICBydHBfYy0+c3RyZWFtLT5maWxlbmFtZSwgcyk7Ci0gICAgICBpZighc3RybmNtcChwYXRoLCBidWYsIHNpemVvZihidWYpKSkKLSAgICAgICAgLyogWFhYOiBTaG91bGQgd2UgcmVwbHkgd2l0aCBSVFNQX1NUQVRVU19PTkxZX0FHR1JFR0FURQotICAgICAgICAgKiBpZiBuYl9zdHJlYW1zPjE/ICovCi0gICAgICAgIHJldHVybiBydHBfYzsKLSAgICB9Ci0gICAgbGVuID0gc3RybGVuKHBhdGgpOwotICAgIGlmIChsZW4gPiAwICYmIHBhdGhbbGVuIC0gMV0gPT0gJy8nICYmCi0gICAgICAgICFzdHJuY21wKHBhdGgsIHJ0cF9jLT5zdHJlYW0tPmZpbGVuYW1lLCBsZW4gLSAxKSkKLSAgICAgICAgcmV0dXJuIHJ0cF9jOwotICAgIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBydHNwX2NtZF9wbGF5KEhUVFBDb250ZXh0ICpjLCBjb25zdCBjaGFyICp1cmwsIFJUU1BNZXNzYWdlSGVhZGVyICpoKQotewotICAgIEhUVFBDb250ZXh0ICpydHBfYzsKLQotICAgIHJ0cF9jID0gZmluZF9ydHBfc2Vzc2lvbl93aXRoX3VybCh1cmwsIGgtPnNlc3Npb25faWQpOwotICAgIGlmICghcnRwX2MpIHsKLSAgICAgICAgcnRzcF9yZXBseV9lcnJvcihjLCBSVFNQX1NUQVRVU19TRVNTSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChydHBfYy0+c3RhdGUgIT0gSFRUUFNUQVRFX1NFTkRfREFUQSAmJgotICAgICAgICBydHBfYy0+c3RhdGUgIT0gSFRUUFNUQVRFX1dBSVRfRkVFRCAmJgotICAgICAgICBydHBfYy0+c3RhdGUgIT0gSFRUUFNUQVRFX1JFQURZKSB7Ci0gICAgICAgIHJ0c3BfcmVwbHlfZXJyb3IoYywgUlRTUF9TVEFUVVNfU1RBVEUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcnRwX2MtPnN0YXRlID0gSFRUUFNUQVRFX1NFTkRfREFUQTsKLQotICAgIC8qIG5vdyBldmVyeXRoaW5nIGlzIE9LLCBzbyB3ZSBjYW4gc2VuZCB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgcnRzcF9yZXBseV9oZWFkZXIoYywgUlRTUF9TVEFUVVNfT0spOwotICAgIC8qIHNlc3Npb24gSUQgKi8KLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlNlc3Npb246ICVzXHJcbiIsIHJ0cF9jLT5zZXNzaW9uX2lkKTsKLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlxyXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgcnRzcF9jbWRfaW50ZXJydXB0KEhUVFBDb250ZXh0ICpjLCBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRTUE1lc3NhZ2VIZWFkZXIgKmgsIGludCBwYXVzZV9vbmx5KQotewotICAgIEhUVFBDb250ZXh0ICpydHBfYzsKLQotICAgIHJ0cF9jID0gZmluZF9ydHBfc2Vzc2lvbl93aXRoX3VybCh1cmwsIGgtPnNlc3Npb25faWQpOwotICAgIGlmICghcnRwX2MpIHsKLSAgICAgICAgcnRzcF9yZXBseV9lcnJvcihjLCBSVFNQX1NUQVRVU19TRVNTSU9OKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwYXVzZV9vbmx5KSB7Ci0gICAgICAgIGlmIChydHBfYy0+c3RhdGUgIT0gSFRUUFNUQVRFX1NFTkRfREFUQSAmJgotICAgICAgICAgICAgcnRwX2MtPnN0YXRlICE9IEhUVFBTVEFURV9XQUlUX0ZFRUQpIHsKLSAgICAgICAgICAgIHJ0c3BfcmVwbHlfZXJyb3IoYywgUlRTUF9TVEFUVVNfU1RBVEUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHJ0cF9jLT5zdGF0ZSA9IEhUVFBTVEFURV9SRUFEWTsKLSAgICAgICAgcnRwX2MtPmZpcnN0X3B0cyA9IEFWX05PUFRTX1ZBTFVFOwotICAgIH0KLQotICAgIC8qIG5vdyBldmVyeXRoaW5nIGlzIE9LLCBzbyB3ZSBjYW4gc2VuZCB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzICovCi0gICAgcnRzcF9yZXBseV9oZWFkZXIoYywgUlRTUF9TVEFUVVNfT0spOwotICAgIC8qIHNlc3Npb24gSUQgKi8KLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlNlc3Npb246ICVzXHJcbiIsIHJ0cF9jLT5zZXNzaW9uX2lkKTsKLSAgICBhdmlvX3ByaW50ZihjLT5wYiwgIlxyXG4iKTsKLQotICAgIGlmICghcGF1c2Vfb25seSkKLSAgICAgICAgY2xvc2VfY29ubmVjdGlvbihydHBfYyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFJUUCBoYW5kbGluZyAqLwotCi1zdGF0aWMgSFRUUENvbnRleHQgKnJ0cF9uZXdfY29ubmVjdGlvbihzdHJ1Y3Qgc29ja2FkZHJfaW4gKmZyb21fYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGU2VydmVyU3RyZWFtICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBSVFNQTG93ZXJUcmFuc3BvcnQgcnRwX3Byb3RvY29sKQotewotICAgIEhUVFBDb250ZXh0ICpjID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpwcm90b19zdHI7Ci0KLSAgICAvKiBYWFg6IHNob3VsZCBvdXRwdXQgYSB3YXJuaW5nIHBhZ2Ugd2hlbiBjb21pbmcKLSAgICAgKiBjbG9zZSB0byB0aGUgY29ubmVjdGlvbiBsaW1pdCAqLwotICAgIGlmIChuYl9jb25uZWN0aW9ucyA+PSBjb25maWcubmJfbWF4X2Nvbm5lY3Rpb25zKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICAvKiBhZGQgYSBuZXcgY29ubmVjdGlvbiAqLwotICAgIGMgPSBhdl9tYWxsb2N6KHNpemVvZihIVFRQQ29udGV4dCkpOwotICAgIGlmICghYykKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgYy0+ZmQgPSAtMTsKLSAgICBjLT5wb2xsX2VudHJ5ID0gTlVMTDsKLSAgICBjLT5mcm9tX2FkZHIgPSAqZnJvbV9hZGRyOwotICAgIGMtPmJ1ZmZlcl9zaXplID0gSU9CVUZGRVJfSU5JVF9TSVpFOwotICAgIGMtPmJ1ZmZlciA9IGF2X21hbGxvYyhjLT5idWZmZXJfc2l6ZSk7Ci0gICAgaWYgKCFjLT5idWZmZXIpCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBuYl9jb25uZWN0aW9ucysrOwotICAgIGMtPnN0cmVhbSA9IHN0cmVhbTsKLSAgICBhdl9zdHJsY3B5KGMtPnNlc3Npb25faWQsIHNlc3Npb25faWQsIHNpemVvZihjLT5zZXNzaW9uX2lkKSk7Ci0gICAgYy0+c3RhdGUgPSBIVFRQU1RBVEVfUkVBRFk7Ci0gICAgYy0+aXNfcGFja2V0aXplZCA9IDE7Ci0gICAgYy0+cnRwX3Byb3RvY29sID0gcnRwX3Byb3RvY29sOwotCi0gICAgLyogcHJvdG9jb2wgaXMgc2hvd24gaW4gc3RhdGlzdGljcyAqLwotICAgIHN3aXRjaChjLT5ydHBfcHJvdG9jb2wpIHsKLSAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUF9NVUxUSUNBU1Q6Ci0gICAgICAgIHByb3RvX3N0ciA9ICJNQ0FTVCI7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlRTUF9MT1dFUl9UUkFOU1BPUlRfVURQOgotICAgICAgICBwcm90b19zdHIgPSAiVURQIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1A6Ci0gICAgICAgIHByb3RvX3N0ciA9ICJUQ1AiOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBwcm90b19zdHIgPSAiPz8/IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGF2X3N0cmxjcHkoYy0+cHJvdG9jb2wsICJSVFAvIiwgc2l6ZW9mKGMtPnByb3RvY29sKSk7Ci0gICAgYXZfc3RybGNhdChjLT5wcm90b2NvbCwgcHJvdG9fc3RyLCBzaXplb2YoYy0+cHJvdG9jb2wpKTsKLQotICAgIGN1cnJlbnRfYmFuZHdpZHRoICs9IHN0cmVhbS0+YmFuZHdpZHRoOwotCi0gICAgYy0+bmV4dCA9IGZpcnN0X2h0dHBfY3R4OwotICAgIGZpcnN0X2h0dHBfY3R4ID0gYzsKLSAgICByZXR1cm4gYzsKLQotIGZhaWw6Ci0gICAgaWYgKGMpIHsKLSAgICAgICAgYXZfZnJlZXAoJmMtPmJ1ZmZlcik7Ci0gICAgICAgIGF2X2ZyZWUoYyk7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0vKioKLSAqIGFkZCBhIG5ldyBSVFAgc3RyZWFtIGluIGFuIFJUUCBjb25uZWN0aW9uICh1c2VkIGluIFJUU1AgU0VUVVAKLSAqIGNvbW1hbmQpLiBJZiBSVFAvVENQIHByb3RvY29sIGlzIHVzZWQsIFRDUCBjb25uZWN0aW9uICdydHNwX2MnIGlzCi0gKiB1c2VkLgotICovCi1zdGF0aWMgaW50IHJ0cF9uZXdfYXZfc3RyZWFtKEhUVFBDb250ZXh0ICpjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2luZGV4LCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmRlc3RfYWRkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUENvbnRleHQgKnJ0c3BfYykKLXsKLSAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgY2hhciAqaXBhZGRyOwotICAgIFVSTENvbnRleHQgKmggPSBOVUxMOwotICAgIHVpbnQ4X3QgKmR1bW15X2J1ZjsKLSAgICBpbnQgbWF4X3BhY2tldF9zaXplOwotICAgIHZvaWQgKnN0X2ludGVybmFsOwotCi0gICAgLyogbm93IHdlIGNhbiBvcGVuIHRoZSByZWxldmFudCBvdXRwdXQgc3RyZWFtICovCi0gICAgY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOwotICAgIGlmICghY3R4KQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgY3R4LT5vZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KCJydHAiLCBOVUxMLCBOVUxMKTsKLQotICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIE5VTEwpOwotICAgIGlmICghc3QpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMpOwotICAgIGF2X2ZyZWVwKCZzdC0+aW5mbyk7Ci0gICAgc3RfaW50ZXJuYWwgPSBzdC0+aW50ZXJuYWw7Ci0KLSAgICBpZiAoIWMtPnN0cmVhbS0+ZmVlZCB8fAotICAgICAgICBjLT5zdHJlYW0tPmZlZWQgPT0gYy0+c3RyZWFtKQotICAgICAgICBtZW1jcHkoc3QsIGMtPnN0cmVhbS0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLCBzaXplb2YoQVZTdHJlYW0pKTsKLSAgICBlbHNlCi0gICAgICAgIG1lbWNweShzdCwKLSAgICAgICAgICAgICAgIGMtPnN0cmVhbS0+ZmVlZC0+c3RyZWFtc1tjLT5zdHJlYW0tPmZlZWRfc3RyZWFtc1tzdHJlYW1faW5kZXhdXSwKLSAgICAgICAgICAgICAgIHNpemVvZihBVlN0cmVhbSkpOwotICAgIHN0LT5wcml2X2RhdGEgPSBOVUxMOwotICAgIHN0LT5pbnRlcm5hbCA9IHN0X2ludGVybmFsOwotCi0gICAgLyogYnVpbGQgZGVzdGluYXRpb24gUlRQIGFkZHJlc3MgKi8KLSAgICBpcGFkZHIgPSBpbmV0X250b2EoZGVzdF9hZGRyLT5zaW5fYWRkcik7Ci0KLSAgICBzd2l0Y2goYy0+cnRwX3Byb3RvY29sKSB7Ci0gICAgY2FzZSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFA6Ci0gICAgY2FzZSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFBfTVVMVElDQVNUOgotICAgICAgICAvKiBSVFAvVURQIGNhc2UgKi8KLQotICAgICAgICAvKiBYWFg6IGFsc28gcGFzcyBhcyBwYXJhbWV0ZXIgdG8gZnVuY3Rpb24gPyAqLwotICAgICAgICBpZiAoYy0+c3RyZWFtLT5pc19tdWx0aWNhc3QpIHsKLSAgICAgICAgICAgIGludCB0dGw7Ci0gICAgICAgICAgICB0dGwgPSBjLT5zdHJlYW0tPm11bHRpY2FzdF90dGw7Ci0gICAgICAgICAgICBpZiAoIXR0bCkKLSAgICAgICAgICAgICAgICB0dGwgPSAxNjsKLSAgICAgICAgICAgIHNucHJpbnRmKGN0eC0+ZmlsZW5hbWUsIHNpemVvZihjdHgtPmZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICJydHA6Ly8lczolZD9tdWx0aWNhc3Q9MSZ0dGw9JWQiLAotICAgICAgICAgICAgICAgICAgICAgaXBhZGRyLCBudG9ocyhkZXN0X2FkZHItPnNpbl9wb3J0KSwgdHRsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGN0eC0+ZmlsZW5hbWUsIHNpemVvZihjdHgtPmZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICJydHA6Ly8lczolZCIsIGlwYWRkciwgbnRvaHMoZGVzdF9hZGRyLT5zaW5fcG9ydCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZmdXJsX29wZW4oJmgsIGN0eC0+ZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwgTlVMTCwgTlVMTCkgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBjLT5ydHBfaGFuZGxlc1tzdHJlYW1faW5kZXhdID0gaDsKLSAgICAgICAgbWF4X3BhY2tldF9zaXplID0gaC0+bWF4X3BhY2tldF9zaXplOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUDoKLSAgICAgICAgLyogUlRQL1RDUCBjYXNlICovCi0gICAgICAgIGMtPnJ0c3BfYyA9IHJ0c3BfYzsKLSAgICAgICAgbWF4X3BhY2tldF9zaXplID0gUlRTUF9UQ1BfTUFYX1BBQ0tFVF9TSVpFOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaHR0cF9sb2coIiVzOiVkIC0gLSBcIlBMQVkgJXMvc3RyZWFtaWQ9JWQgJXNcIlxuIiwKLSAgICAgICAgICAgICBpcGFkZHIsIG50b2hzKGRlc3RfYWRkci0+c2luX3BvcnQpLAotICAgICAgICAgICAgIGMtPnN0cmVhbS0+ZmlsZW5hbWUsIHN0cmVhbV9pbmRleCwgYy0+cHJvdG9jb2wpOwotCi0gICAgLyogbm9ybWFsbHksIG5vIHBhY2tldHMgc2hvdWxkIGJlIG91dHB1dCBoZXJlLCBidXQgdGhlIHBhY2tldCBzaXplIG1heQotICAgICAqIGJlIGNoZWNrZWQgKi8KLSAgICBpZiAoZmZpb19vcGVuX2R5bl9wYWNrZXRfYnVmKCZjdHgtPnBiLCBtYXhfcGFja2V0X3NpemUpIDwgMCkKLSAgICAgICAgLyogWFhYOiBjbG9zZSBzdHJlYW0gKi8KLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgaWYgKGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihjdHgsIE5VTEwpIDwgMCkgewotICAgIGZhaWw6Ci0gICAgICAgIGlmIChoKQotICAgICAgICAgICAgZmZ1cmxfY2xvc2UoaCk7Ci0gICAgICAgIGF2X2ZyZWUoc3QpOwotICAgICAgICBhdl9mcmVlKGN0eCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgYXZpb19jbG9zZV9keW5fYnVmKGN0eC0+cGIsICZkdW1teV9idWYpOwotICAgIGN0eC0+cGIgPSBOVUxMOwotICAgIGF2X2ZyZWUoZHVtbXlfYnVmKTsKLQotICAgIGMtPnJ0cF9jdHhbc3RyZWFtX2luZGV4XSA9IGN0eDsKLSAgICByZXR1cm4gMDsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogZmZzZXJ2ZXIgaW5pdGlhbGl6YXRpb24gKi8KLQotLyogRklYTUU6IFRoaXMgY29kZSBzaG91bGQgdXNlIGF2Zm9ybWF0X25ld19zdHJlYW0oKSAqLwotc3RhdGljIEFWU3RyZWFtICphZGRfYXZfc3RyZWFtMShGRlNlcnZlclN0cmVhbSAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMsIGludCBjb3B5KQotewotICAgIEFWU3RyZWFtICpmc3Q7Ci0KLSAgICBpZihzdHJlYW0tPm5iX3N0cmVhbXMgPj0gRkZfQVJSQVlfRUxFTVMoc3RyZWFtLT5zdHJlYW1zKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmc3QgPSBhdl9tYWxsb2N6KHNpemVvZihBVlN0cmVhbSkpOwotICAgIGlmICghZnN0KQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoY29weSkgewotICAgICAgICBmc3QtPmNvZGVjID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYy0+Y29kZWMpOwotICAgICAgICBpZiAoIWZzdC0+Y29kZWMpIHsKLSAgICAgICAgICAgIGF2X2ZyZWUoZnN0KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGF2Y29kZWNfY29weV9jb250ZXh0KGZzdC0+Y29kZWMsIGNvZGVjKTsKLSAgICB9IGVsc2UKLSAgICAgICAgLyogbGl2ZSBzdHJlYW1zIG11c3QgdXNlIHRoZSBhY3R1YWwgZmVlZCdzIGNvZGVjIHNpbmNlIGl0IG1heSBiZQotICAgICAgICAgKiB1cGRhdGVkIGxhdGVyIHRvIGNhcnJ5IGV4dHJhZGF0YSBuZWVkZWQgYnkgdGhlbS4KLSAgICAgICAgICovCi0gICAgICAgIGZzdC0+Y29kZWMgPSBjb2RlYzsKLQotICAgIGZzdC0+cHJpdl9kYXRhID0gYXZfbWFsbG9jeihzaXplb2YoRmVlZERhdGEpKTsKLSAgICBmc3QtPmludGVybmFsID0gYXZfbWFsbG9jeihzaXplb2YoKmZzdC0+aW50ZXJuYWwpKTsKLSAgICBmc3QtPmluZGV4ID0gc3RyZWFtLT5uYl9zdHJlYW1zOwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oZnN0LCAzMywgMSwgOTAwMDApOwotICAgIGZzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwotICAgIHN0cmVhbS0+c3RyZWFtc1tzdHJlYW0tPm5iX3N0cmVhbXMrK10gPSBmc3Q7Ci0gICAgcmV0dXJuIGZzdDsKLX0KLQotLyogcmV0dXJuIHRoZSBzdHJlYW0gbnVtYmVyIGluIHRoZSBmZWVkICovCi1zdGF0aWMgaW50IGFkZF9hdl9zdHJlYW0oRkZTZXJ2ZXJTdHJlYW0gKmZlZWQsIEFWU3RyZWFtICpzdCkKLXsKLSAgICBBVlN0cmVhbSAqZnN0OwotICAgIEFWQ29kZWNDb250ZXh0ICphdiwgKmF2MTsKLSAgICBpbnQgaTsKLQotICAgIGF2ID0gc3QtPmNvZGVjOwotICAgIGZvcihpPTA7aTxmZWVkLT5uYl9zdHJlYW1zO2krKykgewotICAgICAgICBhdjEgPSBmZWVkLT5zdHJlYW1zW2ldLT5jb2RlYzsKLSAgICAgICAgaWYgKGF2MS0+Y29kZWNfaWQgPT0gYXYtPmNvZGVjX2lkICYmCi0gICAgICAgICAgICBhdjEtPmNvZGVjX3R5cGUgPT0gYXYtPmNvZGVjX3R5cGUgJiYKLSAgICAgICAgICAgIGF2MS0+Yml0X3JhdGUgPT0gYXYtPmJpdF9yYXRlKSB7Ci0KLSAgICAgICAgICAgIHN3aXRjaChhdi0+Y29kZWNfdHlwZSkgewotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICAgICAgaWYgKGF2MS0+Y2hhbm5lbHMgPT0gYXYtPmNoYW5uZWxzICYmCi0gICAgICAgICAgICAgICAgICAgIGF2MS0+c2FtcGxlX3JhdGUgPT0gYXYtPnNhbXBsZV9yYXRlKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgICAgIGlmIChhdjEtPndpZHRoID09IGF2LT53aWR0aCAmJgotICAgICAgICAgICAgICAgICAgICBhdjEtPmhlaWdodCA9PSBhdi0+aGVpZ2h0ICYmCi0gICAgICAgICAgICAgICAgICAgIGF2MS0+dGltZV9iYXNlLmRlbiA9PSBhdi0+dGltZV9iYXNlLmRlbiAmJgotICAgICAgICAgICAgICAgICAgICBhdjEtPnRpbWVfYmFzZS5udW0gPT0gYXYtPnRpbWVfYmFzZS5udW0gJiYKLSAgICAgICAgICAgICAgICAgICAgYXYxLT5nb3Bfc2l6ZSA9PSBhdi0+Z29wX3NpemUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhYm9ydCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZnN0ID0gYWRkX2F2X3N0cmVhbTEoZmVlZCwgYXYsIDApOwotICAgIGlmICghZnN0KQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGF2X3N0cmVhbV9nZXRfcmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKHN0KSkKLSAgICAgICAgYXZfc3RyZWFtX3NldF9yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24oZnN0LAotICAgICAgICAgICAgYXZfc3RyZHVwKGF2X3N0cmVhbV9nZXRfcmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKHN0KSkpOwotICAgIHJldHVybiBmZWVkLT5uYl9zdHJlYW1zIC0gMTsKLX0KLQotc3RhdGljIHZvaWQgcmVtb3ZlX3N0cmVhbShGRlNlcnZlclN0cmVhbSAqc3RyZWFtKQotewotICAgIEZGU2VydmVyU3RyZWFtICoqcHM7Ci0gICAgcHMgPSAmY29uZmlnLmZpcnN0X3N0cmVhbTsKLSAgICB3aGlsZSAoKnBzKSB7Ci0gICAgICAgIGlmICgqcHMgPT0gc3RyZWFtKQotICAgICAgICAgICAgKnBzID0gKCpwcyktPm5leHQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBzID0gJigqcHMpLT5uZXh0OwotICAgIH0KLX0KLQotLyogc3BlY2lmaWMgTVBFRzQgaGFuZGxpbmcgOiB3ZSBleHRyYWN0IHRoZSByYXcgcGFyYW1ldGVycyAqLwotc3RhdGljIHZvaWQgZXh0cmFjdF9tcGVnNF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICppbmZpbGUpCi17Ci0gICAgaW50IG1wZWc0X2NvdW50LCBpLCBzaXplOwotICAgIEFWUGFja2V0IHBrdDsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgY29uc3QgdWludDhfdCAqcDsKLQotICAgIGluZmlsZS0+ZmxhZ3MgfD0gQVZGTVRfRkxBR19OT0ZJTExJTiB8IEFWRk1UX0ZMQUdfTk9QQVJTRTsKLQotICAgIG1wZWc0X2NvdW50ID0gMDsKLSAgICBmb3IoaT0wO2k8aW5maWxlLT5uYl9zdHJlYW1zO2krKykgewotICAgICAgICBzdCA9IGluZmlsZS0+c3RyZWFtc1tpXTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgJiYKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPT0gMCkgewotICAgICAgICAgICAgbXBlZzRfY291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIW1wZWc0X2NvdW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBwcmludGYoIk1QRUc0IHdpdGhvdXQgZXh0cmEgZGF0YTogdHJ5aW5nIHRvIGZpbmQgaGVhZGVyIGluICVzXG4iLAotICAgICAgICAgICBpbmZpbGUtPmZpbGVuYW1lKTsKLSAgICB3aGlsZSAobXBlZzRfY291bnQgPiAwKSB7Ci0gICAgICAgIGlmIChhdl9yZWFkX2ZyYW1lKGluZmlsZSwgJnBrdCkgPCAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN0ID0gaW5maWxlLT5zdHJlYW1zW3BrdC5zdHJlYW1faW5kZXhdOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCAmJgotICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICAgICAgLyogZmlsbCBleHRyYWRhdGEgd2l0aCB0aGUgaGVhZGVyICovCi0gICAgICAgICAgICAvKiBYWFg6IHdlIG1ha2UgaGFyZCBzdXBwb3NpdGlvbnMgaGVyZSAhICovCi0gICAgICAgICAgICBwID0gcGt0LmRhdGE7Ci0gICAgICAgICAgICB3aGlsZSAocCA8IHBrdC5kYXRhICsgcGt0LnNpemUgLSA0KSB7Ci0gICAgICAgICAgICAgICAgLyogc3RvcCB3aGVuIHZvcCBoZWFkZXIgaXMgZm91bmQgKi8KLSAgICAgICAgICAgICAgICBpZiAocFswXSA9PSAweDAwICYmIHBbMV0gPT0gMHgwMCAmJgotICAgICAgICAgICAgICAgICAgICBwWzJdID09IDB4MDEgJiYgcFszXSA9PSAweGI2KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBwIC0gcGt0LmRhdGE7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihzaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBzaXplOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIHBrdC5kYXRhLCBzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHArKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1wZWc0X2NvdW50LS07Ci0gICAgICAgIH0KLSAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwotICAgIH0KLX0KLQotLyogY29tcHV0ZSB0aGUgbmVlZGVkIEFWU3RyZWFtIGZvciBlYWNoIGZpbGUgKi8KLXN0YXRpYyB2b2lkIGJ1aWxkX2ZpbGVfc3RyZWFtcyh2b2lkKQotewotICAgIEZGU2VydmVyU3RyZWFtICpzdHJlYW07Ci0gICAgQVZGb3JtYXRDb250ZXh0ICppbmZpbGU7Ci0gICAgaW50IGksIHJldDsKLQotICAgIC8qIGdhdGhlciBhbGwgc3RyZWFtcyAqLwotICAgIGZvcihzdHJlYW0gPSBjb25maWcuZmlyc3Rfc3RyZWFtOyBzdHJlYW07IHN0cmVhbSA9IHN0cmVhbS0+bmV4dCkgewotICAgICAgICBpbmZpbGUgPSBOVUxMOwotCi0gICAgICAgIGlmIChzdHJlYW0tPnN0cmVhbV90eXBlICE9IFNUUkVBTV9UWVBFX0xJVkUgfHwgc3RyZWFtLT5mZWVkKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogdGhlIHN0cmVhbSBjb21lcyBmcm9tIGEgZmlsZSAqLwotICAgICAgICAvKiB0cnkgdG8gb3BlbiB0aGUgZmlsZSAqLwotICAgICAgICAvKiBvcGVuIHN0cmVhbSAqLwotCi0KLSAgICAgICAgLyogc3BlY2lmaWMgY2FzZTogaWYgdHJhbnNwb3J0IHN0cmVhbSBvdXRwdXQgdG8gUlRQLAotICAgICAgICAgKiB3ZSB1c2UgYSByYXcgdHJhbnNwb3J0IHN0cmVhbSByZWFkZXIgKi8KLSAgICAgICAgaWYgKHN0cmVhbS0+Zm10ICYmICFzdHJjbXAoc3RyZWFtLT5mbXQtPm5hbWUsICJydHAiKSkKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdHJlYW0tPmluX29wdHMsICJtcGVnMnRzX2NvbXB1dGVfcGNyIiwgIjEiLCAwKTsKLQotICAgICAgICBpZiAoIXN0cmVhbS0+ZmVlZF9maWxlbmFtZVswXSkgewotICAgICAgICAgICAgaHR0cF9sb2coIlVuc3BlY2lmaWVkIGZlZWQgZmlsZSBmb3Igc3RyZWFtICclcydcbiIsCi0gICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGh0dHBfbG9nKCJPcGVuaW5nIGZlZWQgZmlsZSAnJXMnIGZvciBzdHJlYW0gJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgc3RyZWFtLT5mZWVkX2ZpbGVuYW1lLCBzdHJlYW0tPmZpbGVuYW1lKTsKLQotICAgICAgICByZXQgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZpbmZpbGUsIHN0cmVhbS0+ZmVlZF9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmlmbXQsICZzdHJlYW0tPmluX29wdHMpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgaHR0cF9sb2coIkNvdWxkIG5vdCBvcGVuICclcyc6ICVzXG4iLCBzdHJlYW0tPmZlZWRfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOwotICAgICAgICAgICAgLyogcmVtb3ZlIHN0cmVhbSAobm8gbmVlZCB0byBzcGVuZCBtb3JlIHRpbWUgb24gaXQpICovCi0gICAgICAgIGZhaWw6Ci0gICAgICAgICAgICByZW1vdmVfc3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBmaW5kIGFsbCB0aGUgQVZTdHJlYW1zIGluc2lkZSBhbmQgcmVmZXJlbmNlIHRoZW0gaW4KLSAgICAgICAgICAgICAqICdzdHJlYW0nICovCi0gICAgICAgICAgICBpZiAoYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhpbmZpbGUsIE5VTEwpIDwgMCkgewotICAgICAgICAgICAgICAgIGh0dHBfbG9nKCJDb3VsZCBub3QgZmluZCBjb2RlYyBwYXJhbWV0ZXJzIGZyb20gJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmZlZWRfZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZpbmZpbGUpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dHJhY3RfbXBlZzRfaGVhZGVyKGluZmlsZSk7Ci0KLSAgICAgICAgICAgIGZvcihpPTA7aTxpbmZpbGUtPm5iX3N0cmVhbXM7aSsrKQotICAgICAgICAgICAgICAgIGFkZF9hdl9zdHJlYW0xKHN0cmVhbSwgaW5maWxlLT5zdHJlYW1zW2ldLT5jb2RlYywgMSk7Ci0KLSAgICAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZpbmZpbGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lCi1pbnQgY2hlY2tfY29kZWNfbWF0Y2goQVZDb2RlY0NvbnRleHQgKmNjZiwgQVZDb2RlY0NvbnRleHQgKmNjcywgaW50IHN0cmVhbSkKLXsKLSAgICBpbnQgbWF0Y2hlcyA9IDE7Ci0KLSNkZWZpbmUgQ0hFQ0tfQ09ERUMoeCkgIChjY2YtPnggIT0gY2NzLT54KQotICAgIGlmIChDSEVDS19DT0RFQyhjb2RlY19pZCkgfHwgQ0hFQ0tfQ09ERUMoY29kZWNfdHlwZSkpIHsKLSAgICAgICAgaHR0cF9sb2coIkNvZGVjcyBkbyBub3QgbWF0Y2ggZm9yIHN0cmVhbSAlZFxuIiwgc3RyZWFtKTsKLSAgICAgICAgbWF0Y2hlcyA9IDA7Ci0gICAgfSBlbHNlIGlmIChDSEVDS19DT0RFQyhiaXRfcmF0ZSkgfHwgQ0hFQ0tfQ09ERUMoZmxhZ3MpKSB7Ci0gICAgICAgIGh0dHBfbG9nKCJDb2RlYyBiaXRyYXRlcyBkbyBub3QgbWF0Y2ggZm9yIHN0cmVhbSAlZFxuIiwgc3RyZWFtKTsKLSAgICAgICAgbWF0Y2hlcyA9IDA7Ci0gICAgfSBlbHNlIGlmIChjY2YtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgIGlmIChDSEVDS19DT0RFQyh0aW1lX2Jhc2UuZGVuKSB8fAotICAgICAgICAgICAgQ0hFQ0tfQ09ERUModGltZV9iYXNlLm51bSkgfHwKLSAgICAgICAgICAgIENIRUNLX0NPREVDKHdpZHRoKSB8fAotICAgICAgICAgICAgQ0hFQ0tfQ09ERUMoaGVpZ2h0KSkgewotICAgICAgICAgICAgaHR0cF9sb2coIkNvZGVjIHdpZHRoLCBoZWlnaHQgb3IgZnJhbWVyYXRlIGRvIG5vdCBtYXRjaCBmb3Igc3RyZWFtICVkXG4iLCBzdHJlYW0pOwotICAgICAgICAgICAgbWF0Y2hlcyA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNjZi0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgaWYgKENIRUNLX0NPREVDKHNhbXBsZV9yYXRlKSB8fAotICAgICAgICAgICAgQ0hFQ0tfQ09ERUMoY2hhbm5lbHMpIHx8Ci0gICAgICAgICAgICBDSEVDS19DT0RFQyhmcmFtZV9zaXplKSkgewotICAgICAgICAgICAgaHR0cF9sb2coIkNvZGVjIHNhbXBsZV9yYXRlLCBjaGFubmVscywgZnJhbWVfc2l6ZSBkbyBub3QgbWF0Y2ggZm9yIHN0cmVhbSAlZFxuIiwgc3RyZWFtKTsKLSAgICAgICAgICAgIG1hdGNoZXMgPSAwOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaHR0cF9sb2coIlVua25vd24gY29kZWMgdHlwZSBmb3Igc3RyZWFtICVkXG4iLCBzdHJlYW0pOwotICAgICAgICBtYXRjaGVzID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWF0Y2hlczsKLX0KLQotLyogY29tcHV0ZSB0aGUgbmVlZGVkIEFWU3RyZWFtIGZvciBlYWNoIGZlZWQgKi8KLXN0YXRpYyBpbnQgYnVpbGRfZmVlZF9zdHJlYW1zKHZvaWQpCi17Ci0gICAgRkZTZXJ2ZXJTdHJlYW0gKnN0cmVhbSwgKmZlZWQ7Ci0gICAgaW50IGksIGZkOwotCi0gICAgLyogZ2F0aGVyIGFsbCBzdHJlYW1zICovCi0gICAgZm9yKHN0cmVhbSA9IGNvbmZpZy5maXJzdF9zdHJlYW07IHN0cmVhbTsgc3RyZWFtID0gc3RyZWFtLT5uZXh0KSB7Ci0gICAgICAgIGZlZWQgPSBzdHJlYW0tPmZlZWQ7Ci0gICAgICAgIGlmICghZmVlZCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGlmIChzdHJlYW0tPmlzX2ZlZWQpIHsKLSAgICAgICAgICAgIGZvcihpPTA7aTxzdHJlYW0tPm5iX3N0cmVhbXM7aSsrKQotICAgICAgICAgICAgICAgIHN0cmVhbS0+ZmVlZF9zdHJlYW1zW2ldID0gaTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8qIHdlIGhhbmRsZSBhIHN0cmVhbSBjb21pbmcgZnJvbSBhIGZlZWQgKi8KLSAgICAgICAgZm9yKGk9MDtpPHN0cmVhbS0+bmJfc3RyZWFtcztpKyspCi0gICAgICAgICAgICBzdHJlYW0tPmZlZWRfc3RyZWFtc1tpXSA9IGFkZF9hdl9zdHJlYW0oZmVlZCwgc3RyZWFtLT5zdHJlYW1zW2ldKTsKLSAgICB9Ci0KLSAgICAvKiBjcmVhdGUgZmVlZCBmaWxlcyBpZiBuZWVkZWQgKi8KLSAgICBmb3IoZmVlZCA9IGNvbmZpZy5maXJzdF9mZWVkOyBmZWVkOyBmZWVkID0gZmVlZC0+bmV4dF9mZWVkKSB7Ci0KLSAgICAgICAgaWYgKGF2aW9fY2hlY2soZmVlZC0+ZmVlZF9maWxlbmFtZSwgQVZJT19GTEFHX1JFQUQpID4gMCkgewotICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gTlVMTDsKLSAgICAgICAgICAgIGludCBtYXRjaGVzID0gMDsKLQotICAgICAgICAgICAgLyogU2VlIGlmIGl0IG1hdGNoZXMgKi8KLQotICAgICAgICAgICAgaWYgKGF2Zm9ybWF0X29wZW5faW5wdXQoJnMsIGZlZWQtPmZlZWRfZmlsZW5hbWUsIE5VTEwsIE5VTEwpIDwgMCkgewotICAgICAgICAgICAgICAgIGh0dHBfbG9nKCJEZWxldGluZyBmZWVkIGZpbGUgJyVzJyBhcyBpdCBhcHBlYXJzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gYmUgY29ycnVwdFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmZWVkLT5mZWVkX2ZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBnb3RvIGRyb3A7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHNldCBidWZmZXIgc2l6ZSAqLwotICAgICAgICAgICAgaWYgKGZmaW9fc2V0X2J1Zl9zaXplKHMtPnBiLCBGRk1fUEFDS0VUX1NJWkUpIDwgMCkgewotICAgICAgICAgICAgICAgIGh0dHBfbG9nKCJGYWlsZWQgdG8gc2V0IGJ1ZmZlciBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmcyk7Ci0gICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBOb3cgc2VlIGlmIGl0IG1hdGNoZXMgKi8KLSAgICAgICAgICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IGZlZWQtPm5iX3N0cmVhbXMpIHsKLSAgICAgICAgICAgICAgICBodHRwX2xvZygiRGVsZXRpbmcgZmVlZCBmaWxlICclcycgYXMgc3RyZWFtIGNvdW50cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpZmZlciAoJWQgIT0gJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWQtPmZlZWRfZmlsZW5hbWUsIHMtPm5iX3N0cmVhbXMsIGZlZWQtPm5iX3N0cmVhbXMpOwotICAgICAgICAgICAgICAgIGdvdG8gZHJvcDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWF0Y2hlcyA9IDE7Ci0gICAgICAgICAgICBmb3IoaT0wO2k8cy0+bmJfc3RyZWFtcztpKyspIHsKLSAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc2YsICpzczsKLQotICAgICAgICAgICAgICAgIHNmID0gZmVlZC0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgICAgICBzcyA9IHMtPnN0cmVhbXNbaV07Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2YtPmluZGV4ICE9IHNzLT5pbmRleCB8fCBzZi0+aWQgIT0gc3MtPmlkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBfbG9nKCJJbmRleCAmIElkIGRvIG5vdCBtYXRjaCBmb3Igc3RyZWFtICVkICglcylcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGZlZWQtPmZlZWRfZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbWF0Y2hlcyA9IGNoZWNrX2NvZGVjX21hdGNoIChzZi0+Y29kZWMsIHNzLT5jb2RlYywgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotZHJvcDoKLSAgICAgICAgICAgIGlmIChzKQotICAgICAgICAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZzKTsKLQotICAgICAgICAgICAgaWYgKCFtYXRjaGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZlZWQtPnJlYWRvbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGh0dHBfbG9nKCJVbmFibGUgdG8gZGVsZXRlIHJlYWQtb25seSBmZWVkIGZpbGUgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlZC0+ZmVlZF9maWxlbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdW5saW5rKGZlZWQtPmZlZWRfZmlsZW5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF2aW9fY2hlY2soZmVlZC0+ZmVlZF9maWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFKSA8PSAwKSB7Ci0gICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKnMgPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICghcykgewotICAgICAgICAgICAgICAgIGh0dHBfbG9nKCJGYWlsZWQgdG8gYWxsb2NhdGUgY29udGV4dFxuIik7Ci0gICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZmVlZC0+cmVhZG9ubHkpIHsKLSAgICAgICAgICAgICAgICBodHRwX2xvZygiVW5hYmxlIHRvIGNyZWF0ZSBmZWVkIGZpbGUgJyVzJyBhcyBpdCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hcmtlZCByZWFkb25seVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmZWVkLT5mZWVkX2ZpbGVuYW1lKTsKLSAgICAgICAgICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQocyk7Ci0gICAgICAgICAgICAgICAgZ290byBiYWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBvbmx5IHdyaXRlIHRoZSBoZWFkZXIgb2YgdGhlIGZmbSBmaWxlICovCi0gICAgICAgICAgICBpZiAoYXZpb19vcGVuKCZzLT5wYiwgZmVlZC0+ZmVlZF9maWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFKSA8IDApIHsKLSAgICAgICAgICAgICAgICBodHRwX2xvZygiQ291bGQgbm90IG9wZW4gb3V0cHV0IGZlZWQgZmlsZSAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZlZWQtPmZlZWRfZmlsZW5hbWUpOwotICAgICAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChzKTsKLSAgICAgICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLT5vZm9ybWF0ID0gZmVlZC0+Zm10OwotICAgICAgICAgICAgcy0+bmJfc3RyZWFtcyA9IGZlZWQtPm5iX3N0cmVhbXM7Ci0gICAgICAgICAgICBzLT5zdHJlYW1zID0gZmVlZC0+c3RyZWFtczsKLSAgICAgICAgICAgIGlmIChhdmZvcm1hdF93cml0ZV9oZWFkZXIocywgTlVMTCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaHR0cF9sb2coIkNvbnRhaW5lciBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiIpOwotICAgICAgICAgICAgICAgIGF2aW9fY2xvc2VwKCZzLT5wYik7Ci0gICAgICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHMpOwotICAgICAgICAgICAgICAgIGdvdG8gYmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIFhYWDogbmVlZCBiZXR0ZXIgQVBJICovCi0gICAgICAgICAgICBhdl9mcmVlcCgmcy0+cHJpdl9kYXRhKTsKLSAgICAgICAgICAgIGF2aW9fY2xvc2VwKCZzLT5wYik7Ci0gICAgICAgICAgICBzLT5zdHJlYW1zID0gTlVMTDsKLSAgICAgICAgICAgIHMtPm5iX3N0cmVhbXMgPSAwOwotICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZ2V0IGZlZWQgc2l6ZSBhbmQgd3JpdGUgaW5kZXggKi8KLSAgICAgICAgZmQgPSBvcGVuKGZlZWQtPmZlZWRfZmlsZW5hbWUsIE9fUkRPTkxZKTsKLSAgICAgICAgaWYgKGZkIDwgMCkgewotICAgICAgICAgICAgaHR0cF9sb2coIkNvdWxkIG5vdCBvcGVuIG91dHB1dCBmZWVkIGZpbGUgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgZmVlZC0+ZmVlZF9maWxlbmFtZSk7Ci0gICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBmZWVkLT5mZWVkX3dyaXRlX2luZGV4ID0gRkZNQVgoZmZtX3JlYWRfd3JpdGVfaW5kZXgoZmQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNX1BBQ0tFVF9TSVpFKTsKLSAgICAgICAgZmVlZC0+ZmVlZF9zaXplID0gbHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKLSAgICAgICAgLyogZW5zdXJlIHRoYXQgd2UgZG8gbm90IHdyYXAgYmVmb3JlIHRoZSBlbmQgb2YgZmlsZSAqLwotICAgICAgICBpZiAoZmVlZC0+ZmVlZF9tYXhfc2l6ZSAmJiBmZWVkLT5mZWVkX21heF9zaXplIDwgZmVlZC0+ZmVlZF9zaXplKQotICAgICAgICAgICAgZmVlZC0+ZmVlZF9tYXhfc2l6ZSA9IGZlZWQtPmZlZWRfc2l6ZTsKLQotICAgICAgICBjbG9zZShmZCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotCi1iYWlsOgotICAgIHJldHVybiAtMTsKLX0KLQotLyogY29tcHV0ZSB0aGUgYmFuZHdpZHRoIHVzZWQgYnkgZWFjaCBzdHJlYW0gKi8KLXN0YXRpYyB2b2lkIGNvbXB1dGVfYmFuZHdpZHRoKHZvaWQpCi17Ci0gICAgdW5zaWduZWQgYmFuZHdpZHRoOwotICAgIGludCBpOwotICAgIEZGU2VydmVyU3RyZWFtICpzdHJlYW07Ci0KLSAgICBmb3Ioc3RyZWFtID0gY29uZmlnLmZpcnN0X3N0cmVhbTsgc3RyZWFtOyBzdHJlYW0gPSBzdHJlYW0tPm5leHQpIHsKLSAgICAgICAgYmFuZHdpZHRoID0gMDsKLSAgICAgICAgZm9yKGk9MDtpPHN0cmVhbS0+bmJfc3RyZWFtcztpKyspIHsKLSAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHN0cmVhbS0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgIHN3aXRjaChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICAgICAgYmFuZHdpZHRoICs9IHN0LT5jb2RlYy0+Yml0X3JhdGU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbS0+YmFuZHdpZHRoID0gKGJhbmR3aWR0aCArIDk5OSkgLyAxMDAwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgaGFuZGxlX2NoaWxkX2V4aXQoaW50IHNpZykKLXsKLSAgICBwaWRfdCBwaWQ7Ci0gICAgaW50IHN0YXR1czsKLSAgICB0aW1lX3QgdXB0aW1lOwotCi0gICAgd2hpbGUgKChwaWQgPSB3YWl0cGlkKC0xLCAmc3RhdHVzLCBXTk9IQU5HKSkgPiAwKSB7Ci0gICAgICAgIEZGU2VydmVyU3RyZWFtICpmZWVkOwotCi0gICAgICAgIGZvciAoZmVlZCA9IGNvbmZpZy5maXJzdF9mZWVkOyBmZWVkOyBmZWVkID0gZmVlZC0+bmV4dCkgewotICAgICAgICAgICAgaWYgKGZlZWQtPnBpZCAhPSBwaWQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIHVwdGltZSA9IHRpbWUoMCkgLSBmZWVkLT5waWRfc3RhcnQ7Ci0gICAgICAgICAgICBmZWVkLT5waWQgPSAwOwotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICIlczogUGlkICUiUFJJZDY0IiBleGl0ZWQgd2l0aCBzdGF0dXMgJWQgYWZ0ZXIgJSJQUklkNjQiICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmRzXG4iLAotICAgICAgICAgICAgICAgICAgICBmZWVkLT5maWxlbmFtZSwgKGludDY0X3QpIHBpZCwgc3RhdHVzLCAoaW50NjRfdCl1cHRpbWUpOwotCi0gICAgICAgICAgICBpZiAodXB0aW1lIDwgMzApCi0gICAgICAgICAgICAgICAgLyogVHVybiBvZmYgYW55IG1vcmUgcmVzdGFydHMgKi8KLSAgICAgICAgICAgICAgICBmZnNlcnZlcl9mcmVlX2NoaWxkX2FyZ3MoJmZlZWQtPmNoaWxkX2FyZ3YpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbmVlZF90b19zdGFydF9jaGlsZHJlbiA9IDE7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wdF9kZWJ1Zyh2b2lkKQotewotICAgIGNvbmZpZy5kZWJ1ZyA9IDE7Ci0gICAgc25wcmludGYoY29uZmlnLmxvZ2ZpbGVuYW1lLCBzaXplb2YoY29uZmlnLmxvZ2ZpbGVuYW1lKSwgIi0iKTsKLX0KLQotdm9pZCBzaG93X2hlbHBfZGVmYXVsdChjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKLXsKLSAgICBwcmludGYoInVzYWdlOiBmZnNlcnZlciBbb3B0aW9uc11cbiIKLSAgICAgICAgICAgIkh5cGVyIGZhc3QgbXVsdGkgZm9ybWF0IEF1ZGlvL1ZpZGVvIHN0cmVhbWluZyBzZXJ2ZXJcbiIpOwotICAgIHByaW50ZigiXG4iKTsKLSAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiTWFpbiBvcHRpb25zOiIsIDAsIDAsIDApOwotfQotCi1zdGF0aWMgY29uc3QgT3B0aW9uRGVmIG9wdGlvbnNbXSA9IHsKLSNpbmNsdWRlICJjbWR1dGlsc19jb21tb25fb3B0cy5oIgotICAgIHsgIm4iLCBPUFRfQk9PTCwgeyh2b2lkICopJm5vX2xhdW5jaCB9LCAiZW5hYmxlIG5vLWxhdW5jaCBtb2RlIiB9LAotICAgIHsgImQiLCAwLCB7KHZvaWQqKW9wdF9kZWJ1Z30sICJlbmFibGUgZGVidWcgbW9kZSIgfSwKLSAgICB7ICJmIiwgSEFTX0FSRyB8IE9QVF9TVFJJTkcsIHsodm9pZCopJmNvbmZpZy5maWxlbmFtZSB9LCAidXNlIGNvbmZpZ2ZpbGUgaW5zdGVhZCBvZiAvZXRjL2Zmc2VydmVyLmNvbmYiLCAiY29uZmlnZmlsZSIgfSwKLSAgICB7IE5VTEwgfSwKLX07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNpZ2FjdCA9IHsgeyAwIH0gfTsKLSAgICBpbnQgY2ZnX3BhcnNlZDsKLSAgICBpbnQgcmV0ID0gRVhJVF9GQUlMVVJFOwotCi0KLSAgICBjb25maWcuZmlsZW5hbWUgPSBhdl9zdHJkdXAoIi9ldGMvZmZzZXJ2ZXIuY29uZiIpOwotCi0gICAgcGFyc2VfbG9nbGV2ZWwoYXJnYywgYXJndiwgb3B0aW9ucyk7Ci0gICAgYXZfcmVnaXN0ZXJfYWxsKCk7Ci0gICAgYXZmb3JtYXRfbmV0d29ya19pbml0KCk7Ci0KLSAgICBzaG93X2Jhbm5lcihhcmdjLCBhcmd2LCBvcHRpb25zKTsKLQotICAgIG15X3Byb2dyYW1fbmFtZSA9IGFyZ3ZbMF07Ci0KLSAgICBwYXJzZV9vcHRpb25zKE5VTEwsIGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIE5VTEwpOwotCi0gICAgdW5zZXRlbnYoImh0dHBfcHJveHkiKTsgICAgICAgICAgICAgLyogS2lsbCB0aGUgaHR0cF9wcm94eSAqLwotCi0gICAgYXZfbGZnX2luaXQoJnJhbmRvbV9zdGF0ZSwgYXZfZ2V0X3JhbmRvbV9zZWVkKCkpOwotCi0gICAgc2lnYWN0LnNhX2hhbmRsZXIgPSBoYW5kbGVfY2hpbGRfZXhpdDsKLSAgICBzaWdhY3Quc2FfZmxhZ3MgPSBTQV9OT0NMRFNUT1AgfCBTQV9SRVNUQVJUOwotICAgIHNpZ2FjdGlvbihTSUdDSExELCAmc2lnYWN0LCAwKTsKLQotICAgIGlmICgoY2ZnX3BhcnNlZCA9IGZmc2VydmVyX3BhcnNlX2ZmY29uZmlnKGNvbmZpZy5maWxlbmFtZSwgJmNvbmZpZykpIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlYWRpbmcgY29uZmlndXJhdGlvbiBmaWxlICclcyc6ICVzXG4iLAotICAgICAgICAgICAgICAgIGNvbmZpZy5maWxlbmFtZSwgYXZfZXJyMnN0cihjZmdfcGFyc2VkKSk7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICAvKiBvcGVuIGxvZyBmaWxlIGlmIG5lZWRlZCAqLwotICAgIGlmIChjb25maWcubG9nZmlsZW5hbWVbMF0gIT0gJ1wwJykgewotICAgICAgICBpZiAoIXN0cmNtcChjb25maWcubG9nZmlsZW5hbWUsICItIikpCi0gICAgICAgICAgICBsb2dmaWxlID0gc3Rkb3V0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsb2dmaWxlID0gZm9wZW4oY29uZmlnLmxvZ2ZpbGVuYW1lLCAiYSIpOwotICAgICAgICBhdl9sb2dfc2V0X2NhbGxiYWNrKGh0dHBfYXZfbG9nKTsKLSAgICB9Ci0KLSAgICBidWlsZF9maWxlX3N0cmVhbXMoKTsKLQotICAgIGlmIChidWlsZF9mZWVkX3N0cmVhbXMoKSA8IDApIHsKLSAgICAgICAgaHR0cF9sb2coIkNvdWxkIG5vdCBzZXR1cCBmZWVkIHN0cmVhbXNcbiIpOwotICAgICAgICBnb3RvIGJhaWw7Ci0gICAgfQotCi0gICAgY29tcHV0ZV9iYW5kd2lkdGgoKTsKLQotICAgIC8qIHNpZ25hbCBpbml0ICovCi0gICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOwotCi0gICAgaWYgKGh0dHBfc2VydmVyKCkgPCAwKSB7Ci0gICAgICAgIGh0dHBfbG9nKCJDb3VsZCBub3Qgc3RhcnQgc2VydmVyXG4iKTsKLSAgICAgICAgZ290byBiYWlsOwotICAgIH0KLQotICAgIHJldD1FWElUX1NVQ0NFU1M7Ci0KLWJhaWw6Ci0gICAgYXZfZnJlZXAgKCZjb25maWcuZmlsZW5hbWUpOwotICAgIGF2Zm9ybWF0X25ldHdvcmtfZGVpbml0KCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2Zmc2VydmVyX2NvbmZpZy5jIGIvZmZzZXJ2ZXJfY29uZmlnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmYzFmMDAuLjAwMDAwMDAKLS0tIGEvZmZzZXJ2ZXJfY29uZmlnLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlIDxmbG9hdC5oPgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0KLS8vIEZJWE1FIHRob3NlIGFyZSBpbnRlcm5hbCBoZWFkZXJzLCBmZnNlcnZlciBfcmVhbGx5XyBzaG91bGRuJ3QgdXNlIHRoZW0KLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9mZm0uaCIKLQotI2luY2x1ZGUgImNtZHV0aWxzLmgiCi0jaW5jbHVkZSAiZmZzZXJ2ZXJfY29uZmlnLmgiCi0KLSNkZWZpbmUgTUFYX0NISUxEX0FSR1MgNjQKLQotc3RhdGljIGludCBmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnLCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRlNlcnZlckNvbmZpZyAqY29uZmlnKTsKLXN0YXRpYyB2b2lkIHZyZXBvcnRfY29uZmlnX2Vycm9yKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZV9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nX2xldmVsLCBpbnQgKmVycm9ycywgY29uc3QgY2hhciAqZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2bCk7Ci1zdGF0aWMgdm9pZCByZXBvcnRfY29uZmlnX2Vycm9yKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZV9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2dfbGV2ZWwsIGludCAqZXJyb3JzLCBjb25zdCBjaGFyICpmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7Ci0KLSNkZWZpbmUgRVJST1IoLi4uKSByZXBvcnRfY29uZmlnX2Vycm9yKGNvbmZpZy0+ZmlsZW5hbWUsIGNvbmZpZy0+bGluZV9udW0sXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SLCAmY29uZmlnLT5lcnJvcnMsIF9fVkFfQVJHU19fKQotI2RlZmluZSBXQVJOSU5HKC4uLikgcmVwb3J0X2NvbmZpZ19lcnJvcihjb25maWctPmZpbGVuYW1lLCBjb25maWctPmxpbmVfbnVtLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX1dBUk5JTkcsICZjb25maWctPndhcm5pbmdzLCBfX1ZBX0FSR1NfXykKLQotLyogRklYTUU6IG1ha2UgZmZzZXJ2ZXIgd29yayB3aXRoIElQdjYgKi8KLS8qIHJlc29sdmUgaG9zdCB3aXRoIGFsc28gSVAgYWRkcmVzcyBwYXJzaW5nICovCi1zdGF0aWMgaW50IHJlc29sdmVfaG9zdChzdHJ1Y3QgaW5fYWRkciAqc2luX2FkZHIsIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQotewotCi0gICAgaWYgKCFmZl9pbmV0X2F0b24oaG9zdG5hbWUsIHNpbl9hZGRyKSkgewotI2lmIEhBVkVfR0VUQUREUklORk8KLSAgICAgICAgc3RydWN0IGFkZHJpbmZvICphaSwgKmN1cjsKLSAgICAgICAgc3RydWN0IGFkZHJpbmZvIGhpbnRzID0geyAwIH07Ci0gICAgICAgIGhpbnRzLmFpX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgICAgIGlmIChnZXRhZGRyaW5mbyhob3N0bmFtZSwgTlVMTCwgJmhpbnRzLCAmYWkpKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAvKiBnZXRhZGRyaW5mbyByZXR1cm5zIGEgbGlua2VkIGxpc3Qgb2YgYWRkcmluZm8gc3RydWN0cy4KLSAgICAgICAgICogRXZlbiBpZiB3ZSBzZXQgYWlfZmFtaWx5ID0gQUZfSU5FVCBhYm92ZSwgbWFrZSBzdXJlCi0gICAgICAgICAqIHRoYXQgdGhlIHJldHVybmVkIG9uZSBhY3R1YWxseSBpcyBvZiB0aGUgY29ycmVjdCB0eXBlLiAqLwotICAgICAgICBmb3IgKGN1ciA9IGFpOyBjdXI7IGN1ciA9IGN1ci0+YWlfbmV4dCkgewotICAgICAgICAgICAgaWYgKGN1ci0+YWlfZmFtaWx5ID09IEFGX0lORVQpIHsKLSAgICAgICAgICAgICAgICAqc2luX2FkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKWN1ci0+YWlfYWRkciktPnNpbl9hZGRyOwotICAgICAgICAgICAgICAgIGZyZWVhZGRyaW5mbyhhaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZWFkZHJpbmZvKGFpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotI2Vsc2UKLSAgICAgICAgc3RydWN0IGhvc3RlbnQgKmhwOwotICAgICAgICBocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOwotICAgICAgICBpZiAoIWhwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBtZW1jcHkoc2luX2FkZHIsIGhwLT5oX2FkZHJfbGlzdFswXSwgc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZmZzZXJ2ZXJfZ2V0X2FyZyhjaGFyICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgY2hhciAqKnBwKQotewotICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgY2hhciAqcTsKLSAgICBpbnQgcXVvdGUgPSAwOwotCi0gICAgcCA9ICpwcDsKLSAgICBxID0gYnVmOwotCi0gICAgd2hpbGUgKGF2X2lzc3BhY2UoKnApKSBwKys7Ci0KLSAgICBpZiAoKnAgPT0gJ1wiJyB8fCAqcCA9PSAnXCcnKQotICAgICAgICBxdW90ZSA9ICpwKys7Ci0KLSAgICB3aGlsZSAoKnAgIT0gJ1wwJykgewotICAgICAgICBpZiAocXVvdGUgJiYgKnAgPT0gcXVvdGUgfHwgIXF1b3RlICYmIGF2X2lzc3BhY2UoKnApKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICgocSAtIGJ1ZikgPCBidWZfc2l6ZSAtIDEpCi0gICAgICAgICAgICAqcSsrID0gKnA7Ci0gICAgICAgIHArKzsKLSAgICB9Ci0KLSAgICAqcSA9ICdcMCc7Ci0gICAgaWYgKHF1b3RlICYmICpwID09IHF1b3RlKQotICAgICAgICBwKys7Ci0gICAgKnBwID0gcDsKLX0KLQotdm9pZCBmZnNlcnZlcl9wYXJzZV9hY2xfcm93KEZGU2VydmVyU3RyZWFtICpzdHJlYW0sIEZGU2VydmVyU3RyZWFtKiBmZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGU2VydmVySVBBZGRyZXNzQUNMICpleHRfYWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgbGluZV9udW0pCi17Ci0gICAgY2hhciBhcmdbMTAyNF07Ci0gICAgRkZTZXJ2ZXJJUEFkZHJlc3NBQ0wgYWNsOwotICAgIEZGU2VydmVySVBBZGRyZXNzQUNMICpuYWNsOwotICAgIEZGU2VydmVySVBBZGRyZXNzQUNMICoqbmFjbHA7Ci0KLSAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksICZwKTsKLSAgICBpZiAoYXZfc3RyY2FzZWNtcChhcmcsICJhbGxvdyIpID09IDApCi0gICAgICAgIGFjbC5hY3Rpb24gPSBJUF9BTExPVzsKLSAgICBlbHNlIGlmIChhdl9zdHJjYXNlY21wKGFyZywgImRlbnkiKSA9PSAwKQotICAgICAgICBhY2wuYWN0aW9uID0gSVBfREVOWTsKLSAgICBlbHNlIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczolZDogQUNMIGFjdGlvbiAnJXMnIHNob3VsZCBiZSBBTExPVyBvciBERU5ZLlxuIiwKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZV9udW0sIGFyZyk7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksICZwKTsKLQotICAgIGlmIChyZXNvbHZlX2hvc3QoJmFjbC5maXJzdCwgYXJnKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAiJXM6JWQ6IEFDTCByZWZlcnMgdG8gaW52YWxpZCBob3N0IG9yIElQIGFkZHJlc3MgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZV9udW0sIGFyZyk7Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBhY2wubGFzdCA9IGFjbC5maXJzdDsKLQotICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgJnApOwotCi0gICAgaWYgKGFyZ1swXSkgewotICAgICAgICBpZiAocmVzb2x2ZV9ob3N0KCZhY2wubGFzdCwgYXJnKSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICIlczolZDogQUNMIHJlZmVycyB0byBpbnZhbGlkIGhvc3Qgb3IgSVAgYWRkcmVzcyAnJXMnXG4iLAotICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZV9udW0sIGFyZyk7Ci0gICAgICAgICAgICBnb3RvIGJhaWw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBuYWNsID0gYXZfbWFsbG9jeihzaXplb2YoKm5hY2wpKTsKLSAgICBuYWNscCA9IDA7Ci0KLSAgICBhY2wubmV4dCA9IDA7Ci0gICAgKm5hY2wgPSBhY2w7Ci0KLSAgICBpZiAoc3RyZWFtKQotICAgICAgICBuYWNscCA9ICZzdHJlYW0tPmFjbDsKLSAgICBlbHNlIGlmIChmZWVkKQotICAgICAgICBuYWNscCA9ICZmZWVkLT5hY2w7Ci0gICAgZWxzZSBpZiAoZXh0X2FjbCkKLSAgICAgICAgbmFjbHAgPSAmZXh0X2FjbDsKLSAgICBlbHNlCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IEFDTCBmb3VuZCBub3QgaW4gPFN0cmVhbT4gb3IgPEZlZWQ+XG4iLAotICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lX251bSk7Ci0KLSAgICBpZiAobmFjbHApIHsKLSAgICAgICAgd2hpbGUgKCpuYWNscCkKLSAgICAgICAgICAgIG5hY2xwID0gJigqbmFjbHApLT5uZXh0OwotCi0gICAgICAgICpuYWNscCA9IG5hY2w7Ci0gICAgfSBlbHNlCi0gICAgICAgIGF2X2ZyZWUobmFjbCk7Ci0KLWJhaWw6Ci0gIHJldHVybjsKLQotfQotCi0vKiBhZGQgYSBjb2RlYyBhbmQgc2V0IHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLXN0YXRpYyB2b2lkIGFkZF9jb2RlYyhGRlNlcnZlclN0cmVhbSAqc3RyZWFtLCBBVkNvZGVjQ29udGV4dCAqYXYsCi0gICAgICAgICAgICAgICAgICAgICAgRkZTZXJ2ZXJDb25maWcgKmNvbmZpZykKLXsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgQVZEaWN0aW9uYXJ5ICoqb3B0cywgKnJlY29tbWVuZGVkID0gTlVMTDsKLSAgICBjaGFyICplbmNfY29uZmlnOwotCi0gICAgaWYoc3RyZWFtLT5uYl9zdHJlYW1zID49IEZGX0FSUkFZX0VMRU1TKHN0cmVhbS0+c3RyZWFtcykpCi0gICAgICAgIHJldHVybjsKLQotICAgIG9wdHMgPSBhdi0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gPwotICAgICAgICAgICAmY29uZmlnLT5hdWRpb19vcHRzIDogJmNvbmZpZy0+dmlkZW9fb3B0czsKLSAgICBhdl9kaWN0X2NvcHkoJnJlY29tbWVuZGVkLCAqb3B0cywgMCk7Ci0gICAgYXZfb3B0X3NldF9kaWN0Mihhdi0+cHJpdl9kYXRhLCBvcHRzLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKLSAgICBhdl9vcHRfc2V0X2RpY3QyKGF2LCBvcHRzLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKLQotICAgIGlmIChhdl9kaWN0X2NvdW50KCpvcHRzKSkKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIlNvbWV0aGluZyBpcyB3cm9uZywgJWQgb3B0aW9ucyBhcmUgbm90IHNldCFcbiIsCi0gICAgICAgICAgICAgICBhdl9kaWN0X2NvdW50KCpvcHRzKSk7Ci0KLSAgICBpZiAoIWNvbmZpZy0+c3RyZWFtX3VzZV9kZWZhdWx0cykgewotICAgICAgICBzd2l0Y2goYXYtPmNvZGVjX3R5cGUpIHsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICBpZiAoYXYtPmJpdF9yYXRlID09IDApCi0gICAgICAgICAgICAgICAgcmVwb3J0X2NvbmZpZ19lcnJvcihjb25maWctPmZpbGVuYW1lLCBjb25maWctPmxpbmVfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SLCAmY29uZmlnLT5lcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8gYml0IHJhdGUgaXMgbm90IHNldFxuIik7Ci0gICAgICAgICAgICBpZiAoYXYtPnNhbXBsZV9yYXRlID09IDApCi0gICAgICAgICAgICAgICAgcmVwb3J0X2NvbmZpZ19lcnJvcihjb25maWctPmZpbGVuYW1lLCBjb25maWctPmxpbmVfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SLCAmY29uZmlnLT5lcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8gc2FtcGxlIHJhdGUgaXMgbm90IHNldFxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICBpZiAoYXYtPndpZHRoID09IDAgfHwgYXYtPmhlaWdodCA9PSAwKQotICAgICAgICAgICAgICAgIHJlcG9ydF9jb25maWdfZXJyb3IoY29uZmlnLT5maWxlbmFtZSwgY29uZmlnLT5saW5lX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0xPR19FUlJPUiwgJmNvbmZpZy0+ZXJyb3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvIHNpemUgaXMgbm90IHNldFxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgZ290byBkb25lOwotICAgIH0KLQotICAgIC8qIHN0cmVhbV91c2VfZGVmYXVsdHMgPSB0cnVlICovCi0KLSAgICAvKiBjb21wdXRlIGRlZmF1bHQgcGFyYW1ldGVycyAqLwotICAgIHN3aXRjaChhdi0+Y29kZWNfdHlwZSkgewotICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICBpZiAoIWF2X2RpY3RfZ2V0KHJlY29tbWVuZGVkLCAiYiIsIE5VTEwsIDApKSB7Ci0gICAgICAgICAgICBhdi0+Yml0X3JhdGUgPSA2NDAwMDsKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmcmVjb21tZW5kZWQsICJiIiwgYXYtPmJpdF9yYXRlLCAwKTsKLSAgICAgICAgICAgIFdBUk5JTkcoIlNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgYXVkaW8gYml0IHJhdGUgPSAlZC4gIgotICAgICAgICAgICAgICAgICAgICAiVXNlIE5vRGVmYXVsdHMgdG8gZGlzYWJsZSBpdC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIGF2LT5iaXRfcmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFhdl9kaWN0X2dldChyZWNvbW1lbmRlZCwgImFyIiwgTlVMTCwgMCkpIHsKLSAgICAgICAgICAgIGF2LT5zYW1wbGVfcmF0ZSA9IDIyMDUwOwotICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZyZWNvbW1lbmRlZCwgImFyIiwgYXYtPnNhbXBsZV9yYXRlLCAwKTsKLSAgICAgICAgICAgIFdBUk5JTkcoIlNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgYXVkaW8gc2FtcGxlIHJhdGUgPSAlZC4gIgotICAgICAgICAgICAgICAgICAgICAiVXNlIE5vRGVmYXVsdHMgdG8gZGlzYWJsZSBpdC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIGF2LT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFhdl9kaWN0X2dldChyZWNvbW1lbmRlZCwgImFjIiwgTlVMTCwgMCkpIHsKLSAgICAgICAgICAgIGF2LT5jaGFubmVscyA9IDE7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldF9pbnQoJnJlY29tbWVuZGVkLCAiYWMiLCBhdi0+Y2hhbm5lbHMsIDApOwotICAgICAgICAgICAgV0FSTklORygiU2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciBhdWRpbyBjaGFubmVsIGNvdW50ID0gJWQuICIKLSAgICAgICAgICAgICAgICAgICAgIlVzZSBOb0RlZmF1bHRzIHRvIGRpc2FibGUgaXQuXG4iLAotICAgICAgICAgICAgICAgICAgICBhdi0+Y2hhbm5lbHMpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICBpZiAoIWF2X2RpY3RfZ2V0KHJlY29tbWVuZGVkLCAiYiIsIE5VTEwsIDApKSB7Ci0gICAgICAgICAgICBhdi0+Yml0X3JhdGUgPSA2NDAwMDsKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmcmVjb21tZW5kZWQsICJiIiwgYXYtPmJpdF9yYXRlLCAwKTsKLSAgICAgICAgICAgIFdBUk5JTkcoIlNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdmlkZW8gYml0IHJhdGUgPSAlZC4gIgotICAgICAgICAgICAgICAgICAgICAiVXNlIE5vRGVmYXVsdHMgdG8gZGlzYWJsZSBpdC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIGF2LT5iaXRfcmF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFhdl9kaWN0X2dldChyZWNvbW1lbmRlZCwgInRpbWVfYmFzZSIsIE5VTEwsIDApKXsKLSAgICAgICAgICAgIGF2LT50aW1lX2Jhc2UuZGVuID0gNTsKLSAgICAgICAgICAgIGF2LT50aW1lX2Jhc2UubnVtID0gMTsKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZyZWNvbW1lbmRlZCwgInRpbWVfYmFzZSIsICIxLzUiLCAwKTsKLSAgICAgICAgICAgIFdBUk5JTkcoIlNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdmlkZW8gZnJhbWUgcmF0ZSA9ICVkLiAiCi0gICAgICAgICAgICAgICAgICAgICJVc2UgTm9EZWZhdWx0cyB0byBkaXNhYmxlIGl0LlxuIiwKLSAgICAgICAgICAgICAgICAgICAgYXYtPnRpbWVfYmFzZS5kZW4pOwotICAgICAgICB9Ci0gICAgICAgIGlmICghYXZfZGljdF9nZXQocmVjb21tZW5kZWQsICJ2aWRlb19zaXplIiwgTlVMTCwgMCkpIHsKLSAgICAgICAgICAgIGF2LT53aWR0aCA9IDE2MDsKLSAgICAgICAgICAgIGF2LT5oZWlnaHQgPSAxMjg7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldCgmcmVjb21tZW5kZWQsICJ2aWRlb19zaXplIiwgIjE2MHgxMjgiLCAwKTsKLSAgICAgICAgICAgIFdBUk5JTkcoIlNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdmlkZW8gc2l6ZSA9ICVkeCVkLiAiCi0gICAgICAgICAgICAgICAgICAgICJVc2UgTm9EZWZhdWx0cyB0byBkaXNhYmxlIGl0LlxuIiwKLSAgICAgICAgICAgICAgICAgICAgYXYtPndpZHRoLCBhdi0+aGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvKiBCaXRyYXRlIHRvbGVyYW5jZSBpcyBsZXNzIGZvciBzdHJlYW1pbmcgKi8KLSAgICAgICAgaWYgKCFhdl9kaWN0X2dldChyZWNvbW1lbmRlZCwgImJ0IiwgTlVMTCwgMCkpIHsKLSAgICAgICAgICAgIGF2LT5iaXRfcmF0ZV90b2xlcmFuY2UgPSBGRk1BWChhdi0+Yml0X3JhdGUgLyA0LAotICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KWF2LT5iaXRfcmF0ZSphdi0+dGltZV9iYXNlLm51bS9hdi0+dGltZV9iYXNlLmRlbik7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldF9pbnQoJnJlY29tbWVuZGVkLCAiYnQiLCBhdi0+Yml0X3JhdGVfdG9sZXJhbmNlLCAwKTsKLSAgICAgICAgICAgIFdBUk5JTkcoIlNldHRpbmcgZGVmYXVsdCB2YWx1ZSBmb3IgdmlkZW8gYml0IHJhdGUgdG9sZXJhbmNlID0gJWQuICIKLSAgICAgICAgICAgICAgICAgICAgIlVzZSBOb0RlZmF1bHRzIHRvIGRpc2FibGUgaXQuXG4iLAotICAgICAgICAgICAgICAgICAgICBhdi0+Yml0X3JhdGVfdG9sZXJhbmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghYXZfZGljdF9nZXQocmVjb21tZW5kZWQsICJyY19lcSIsIE5VTEwsIDApKSB7Ci0gICAgICAgICAgICBhdi0+cmNfZXEgPSBhdl9zdHJkdXAoInRleF5xQ29tcCIpOwotICAgICAgICAgICAgYXZfZGljdF9zZXQoJnJlY29tbWVuZGVkLCAicmNfZXEiLCAidGV4XnFDb21wIiwgMCk7Ci0gICAgICAgICAgICBXQVJOSU5HKCJTZXR0aW5nIGRlZmF1bHQgdmFsdWUgZm9yIHZpZGVvIHJhdGUgY29udHJvbCBlcXVhdGlvbiA9ICIKLSAgICAgICAgICAgICAgICAgICAgIiVzLiBVc2UgTm9EZWZhdWx0cyB0byBkaXNhYmxlIGl0LlxuIiwKLSAgICAgICAgICAgICAgICAgICAgYXYtPnJjX2VxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWF2X2RpY3RfZ2V0KHJlY29tbWVuZGVkLCAibWF4cmF0ZSIsIE5VTEwsIDApKSB7Ci0gICAgICAgICAgICBhdi0+cmNfbWF4X3JhdGUgPSBhdi0+Yml0X3JhdGUgKiAyOwotICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZyZWNvbW1lbmRlZCwgIm1heHJhdGUiLCBhdi0+cmNfbWF4X3JhdGUsIDApOwotICAgICAgICAgICAgV0FSTklORygiU2V0dGluZyBkZWZhdWx0IHZhbHVlIGZvciB2aWRlbyBtYXggcmF0ZSA9ICVkLiAiCi0gICAgICAgICAgICAgICAgICAgICJVc2UgTm9EZWZhdWx0cyB0byBkaXNhYmxlIGl0LlxuIiwKLSAgICAgICAgICAgICAgICAgICAgYXYtPnJjX21heF9yYXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhdi0+cmNfbWF4X3JhdGUgJiYgIWF2X2RpY3RfZ2V0KHJlY29tbWVuZGVkLCAiYnVmc2l6ZSIsIE5VTEwsIDApKSB7Ci0gICAgICAgICAgICBhdi0+cmNfYnVmZmVyX3NpemUgPSBhdi0+cmNfbWF4X3JhdGU7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldF9pbnQoJnJlY29tbWVuZGVkLCAiYnVmc2l6ZSIsIGF2LT5yY19idWZmZXJfc2l6ZSwgMCk7Ci0gICAgICAgICAgICBXQVJOSU5HKCJTZXR0aW5nIGRlZmF1bHQgdmFsdWUgZm9yIHZpZGVvIGJ1ZmZlciBzaXplID0gJWQuICIKLSAgICAgICAgICAgICAgICAgICAgIlVzZSBOb0RlZmF1bHRzIHRvIGRpc2FibGUgaXQuXG4iLAotICAgICAgICAgICAgICAgICAgICBhdi0+cmNfYnVmZmVyX3NpemUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgfQotCi1kb25lOgotICAgIHN0ID0gYXZfbWFsbG9jeihzaXplb2YoQVZTdHJlYW0pKTsKLSAgICBpZiAoIXN0KQotICAgICAgICByZXR1cm47Ci0gICAgYXZfZGljdF9nZXRfc3RyaW5nKHJlY29tbWVuZGVkLCAmZW5jX2NvbmZpZywgJz0nLCAnLCcpOwotICAgIGF2X2RpY3RfZnJlZSgmcmVjb21tZW5kZWQpOwotICAgIGF2X3N0cmVhbV9zZXRfcmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKHN0LCBlbmNfY29uZmlnKTsKLSAgICBzdC0+Y29kZWMgPSBhdjsKLSAgICBzdHJlYW0tPnN0cmVhbXNbc3RyZWFtLT5uYl9zdHJlYW1zKytdID0gc3Q7Ci19Ci0KLXN0YXRpYyBpbnQgZmZzZXJ2ZXJfc2V0X2NvZGVjKEFWQ29kZWNDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmNvZGVjX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRlNlcnZlckNvbmZpZyAqY29uZmlnKQotewotICAgIGludCByZXQ7Ci0gICAgQVZDb2RlYyAqY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2Rlcl9ieV9uYW1lKGNvZGVjX25hbWUpOwotICAgIGlmICghY29kZWMgfHwgY29kZWMtPnR5cGUgIT0gY3R4LT5jb2RlY190eXBlKSB7Ci0gICAgICAgIHJlcG9ydF9jb25maWdfZXJyb3IoY29uZmlnLT5maWxlbmFtZSwgY29uZmlnLT5saW5lX251bSwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWctPmVycm9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb2RlYyBuYW1lOiAnJXMnXG4iLCBjb2RlY19uYW1lKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUgJiYgIWN0eC0+cHJpdl9kYXRhKSB7Ci0gICAgICAgIGlmICgocmV0ID0gYXZjb2RlY19nZXRfY29udGV4dF9kZWZhdWx0czMoY3R4LCBjb2RlYykpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGN0eC0+Y29kZWMgPSBjb2RlYzsKLSAgICB9Ci0gICAgaWYgKGN0eC0+Y29kZWNfaWQgIT0gY29kZWMtPmlkKQotICAgICAgICByZXBvcnRfY29uZmlnX2Vycm9yKGNvbmZpZy0+ZmlsZW5hbWUsIGNvbmZpZy0+bGluZV9udW0sIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5lcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29uc2lzdGVudCBjb25maWd1cmF0aW9uOiB0cnlpbmcgdG8gc2V0ICclcycgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RlYyBvcHRpb24sIGJ1dCAnJXMnIGNvZGVjIGlzIHVzZWQgcHJldmlvdXNseVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY19uYW1lLCBhdmNvZGVjX2dldF9uYW1lKGN0eC0+Y29kZWNfaWQpKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmZnNlcnZlcl9vcHRfcHJlc2V0KGNvbnN0IGNoYXIgKmFyZywgaW50IHR5cGUsIEZGU2VydmVyQ29uZmlnICpjb25maWcpCi17Ci0gICAgRklMRSAqZj1OVUxMOwotICAgIGNoYXIgZmlsZW5hbWVbMTAwMF0sIHRtcFsxMDAwXSwgdG1wMlsxMDAwXSwgbGluZVsxMDAwXTsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7Ci0gICAgY29uc3QgQVZDb2RlYyAqY29kZWM7Ci0KLSAgICBzd2l0Y2godHlwZSkgewotICAgIGNhc2UgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU06Ci0gICAgICAgIGF2Y3R4ID0gY29uZmlnLT5kdW1teV9hY3R4OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNOgotICAgICAgICBhdmN0eCA9IGNvbmZpZy0+ZHVtbXlfdmN0eDsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYXZfYXNzZXJ0MCgwKTsKLSAgICB9Ci0gICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2RlcihhdmN0eC0+Y29kZWNfaWQpOwotCi0gICAgaWYgKCEoZiA9IGdldF9wcmVzZXRfZmlsZShmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgYXJnLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMgPyBjb2RlYy0+bmFtZSA6IE5VTEwpKSkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRmlsZSBmb3IgcHJlc2V0ICclcycgbm90IGZvdW5kXG4iLCBhcmcpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLQotICAgIHdoaWxlKCFmZW9mKGYpKXsKLSAgICAgICAgaW50IGU9IGZzY2FuZihmLCAiJTk5OVteXG5dXG4iLCBsaW5lKSAtIDE7Ci0gICAgICAgIGlmKGxpbmVbMF0gPT0gJyMnICYmICFlKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGV8PSBzc2NhbmYobGluZSwgIiU5OTlbXj1dPSU5OTlbXlxuXVxuIiwgdG1wLCB0bXAyKSAtIDI7Ci0gICAgICAgIGlmKGUpewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVzOiBJbnZhbGlkIHN5bnRheDogJyVzJ1xuIiwgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgbGluZSk7Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcCh0bXAsICJhY29kZWMiKSAmJiBhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gfHwKLSAgICAgICAgICAgICFzdHJjbXAodG1wLCAidmNvZGVjIikgJiYgYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZmZzZXJ2ZXJfc2V0X2NvZGVjKGF2Y3R4LCB0bXAyLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHRtcCwgInNjb2RlYyIpKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiU3VidGl0bGVzIHByZXNldCBmb3VuZC5cbiIpOwotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbih0bXAsIHRtcDIsIHR5cGUsIGNvbmZpZykgPCAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZmNsb3NlKGYpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIEFWT3V0cHV0Rm9ybWF0ICpmZnNlcnZlcl9ndWVzc19mb3JtYXQoY29uc3QgY2hhciAqc2hvcnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZV90eXBlKQotewotICAgIEFWT3V0cHV0Rm9ybWF0ICpmbXQgPSBhdl9ndWVzc19mb3JtYXQoc2hvcnRfbmFtZSwgZmlsZW5hbWUsIG1pbWVfdHlwZSk7Ci0KLSAgICBpZiAoZm10KSB7Ci0gICAgICAgIEFWT3V0cHV0Rm9ybWF0ICpzdHJlYW1fZm10OwotICAgICAgICBjaGFyIHN0cmVhbV9mb3JtYXRfbmFtZVs2NF07Ci0KLSAgICAgICAgc25wcmludGYoc3RyZWFtX2Zvcm1hdF9uYW1lLCBzaXplb2Yoc3RyZWFtX2Zvcm1hdF9uYW1lKSwgIiVzX3N0cmVhbSIsCi0gICAgICAgICAgICAgICAgZm10LT5uYW1lKTsKLSAgICAgICAgc3RyZWFtX2ZtdCA9IGF2X2d1ZXNzX2Zvcm1hdChzdHJlYW1fZm9ybWF0X25hbWUsIE5VTEwsIE5VTEwpOwotCi0gICAgICAgIGlmIChzdHJlYW1fZm10KQotICAgICAgICAgICAgZm10ID0gc3RyZWFtX2ZtdDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZm10OwotfQotCi1zdGF0aWMgdm9pZCB2cmVwb3J0X2NvbmZpZ19lcnJvcihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZ19sZXZlbCwgaW50ICplcnJvcnMsIGNvbnN0IGNoYXIgKmZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgdmwpCi17Ci0gICAgYXZfbG9nKE5VTEwsIGxvZ19sZXZlbCwgIiVzOiVkOiAiLCBmaWxlbmFtZSwgbGluZV9udW0pOwotICAgIGF2X3Zsb2coTlVMTCwgbG9nX2xldmVsLCBmbXQsIHZsKTsKLSAgICBpZiAoZXJyb3JzKQotICAgICAgICAoKmVycm9ycykrKzsKLX0KLQotc3RhdGljIHZvaWQgcmVwb3J0X2NvbmZpZ19lcnJvcihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nX2xldmVsLCBpbnQgKmVycm9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCi17Ci0gICAgdmFfbGlzdCB2bDsKLSAgICB2YV9zdGFydCh2bCwgZm10KTsKLSAgICB2cmVwb3J0X2NvbmZpZ19lcnJvcihmaWxlbmFtZSwgbGluZV9udW0sIGxvZ19sZXZlbCwgZXJyb3JzLCBmbXQsIHZsKTsKLSAgICB2YV9lbmQodmwpOwotfQotCi1zdGF0aWMgaW50IGZmc2VydmVyX3NldF9pbnRfcGFyYW0oaW50ICpkZXN0LCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IGZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluLCBpbnQgbWF4LCBGRlNlcnZlckNvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yX21zZywgLi4uKQotewotICAgIGludCB0bXA7Ci0gICAgY2hhciAqdGFpbHA7Ci0gICAgaWYgKCF2YWx1ZSB8fCAhdmFsdWVbMF0pCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgZXJybm8gPSAwOwotICAgIHRtcCA9IHN0cnRvbCh2YWx1ZSwgJnRhaWxwLCAwKTsKLSAgICBpZiAodG1wIDwgbWluIHx8IHRtcCA+IG1heCkKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICBpZiAoZmFjdG9yKSB7Ci0gICAgICAgIGlmICh0bXAgPT0gSU5UX01JTiB8fCBGRkFCUyh0bXApID4gSU5UX01BWCAvIEZGQUJTKGZhY3RvcikpCi0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB0bXAgKj0gZmFjdG9yOwotICAgIH0KLSAgICBpZiAodGFpbHBbMF0gfHwgZXJybm8pCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgaWYgKGRlc3QpCi0gICAgICAgICpkZXN0ID0gdG1wOwotICAgIHJldHVybiAwOwotICBlcnJvcjoKLSAgICBpZiAoY29uZmlnKSB7Ci0gICAgICAgIHZhX2xpc3Qgdmw7Ci0gICAgICAgIHZhX3N0YXJ0KHZsLCBlcnJvcl9tc2cpOwotICAgICAgICB2cmVwb3J0X2NvbmZpZ19lcnJvcihjb25maWctPmZpbGVuYW1lLCBjb25maWctPmxpbmVfbnVtLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgJmNvbmZpZy0+ZXJyb3JzLCBlcnJvcl9tc2csIHZsKTsKLSAgICAgICAgdmFfZW5kKHZsKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLX0KLQotc3RhdGljIGludCBmZnNlcnZlcl9zZXRfZmxvYXRfcGFyYW0oZmxvYXQgKmRlc3QsIGNvbnN0IGNoYXIgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmFjdG9yLCBmbG9hdCBtaW4sIGZsb2F0IG1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGU2VydmVyQ29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcl9tc2csIC4uLikKLXsKLSAgICBkb3VibGUgdG1wOwotICAgIGNoYXIgKnRhaWxwOwotICAgIGlmICghdmFsdWUgfHwgIXZhbHVlWzBdKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIGVycm5vID0gMDsKLSAgICB0bXAgPSBzdHJ0b2QodmFsdWUsICZ0YWlscCk7Ci0gICAgaWYgKHRtcCA8IG1pbiB8fCB0bXAgPiBtYXgpCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgaWYgKGZhY3RvcikKLSAgICAgICAgdG1wICo9IGZhY3RvcjsKLSAgICBpZiAodGFpbHBbMF0gfHwgZXJybm8pCi0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgaWYgKGRlc3QpCi0gICAgICAgICpkZXN0ID0gdG1wOwotICAgIHJldHVybiAwOwotICBlcnJvcjoKLSAgICBpZiAoY29uZmlnKSB7Ci0gICAgICAgIHZhX2xpc3Qgdmw7Ci0gICAgICAgIHZhX3N0YXJ0KHZsLCBlcnJvcl9tc2cpOwotICAgICAgICB2cmVwb3J0X2NvbmZpZ19lcnJvcihjb25maWctPmZpbGVuYW1lLCBjb25maWctPmxpbmVfbnVtLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgJmNvbmZpZy0+ZXJyb3JzLCBlcnJvcl9tc2csIHZsKTsKLSAgICAgICAgdmFfZW5kKHZsKTsKLSAgICB9Ci0gICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLX0KLQotc3RhdGljIGludCBmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnLCBpbnQgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRlNlcnZlckNvbmZpZyAqY29uZmlnKQotewotICAgIHN0YXRpYyBpbnQgaGludGVkID0gMDsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZTsKLSAgICBjb25zdCBBVk9wdGlvbiAqbyA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqb3B0aW9uID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICpjb2RlY19uYW1lID0gTlVMTDsKLSAgICBjaGFyIGJ1ZmZbMTAyNF07Ci0gICAgQVZDb2RlY0NvbnRleHQgKmN0eDsKLSAgICBBVkRpY3Rpb25hcnkgKipkaWN0OwotICAgIGVudW0gQVZDb2RlY0lEIGd1ZXNzZWRfY29kZWNfaWQ7Ci0KLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNOgotICAgICAgICBjdHggPSBjb25maWctPmR1bW15X3ZjdHg7Ci0gICAgICAgIGRpY3QgPSAmY29uZmlnLT52aWRlb19vcHRzOwotICAgICAgICBndWVzc2VkX2NvZGVjX2lkID0gY29uZmlnLT5ndWVzc2VkX3ZpZGVvX2NvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkUgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5ndWVzc2VkX3ZpZGVvX2NvZGVjX2lkIDogQVZfQ09ERUNfSURfSDI2NDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9PUFRfRkxBR19BVURJT19QQVJBTToKLSAgICAgICAgY3R4ID0gY29uZmlnLT5kdW1teV9hY3R4OwotICAgICAgICBkaWN0ID0gJmNvbmZpZy0+YXVkaW9fb3B0czsKLSAgICAgICAgZ3Vlc3NlZF9jb2RlY19pZCA9IGNvbmZpZy0+Z3Vlc3NlZF9hdWRpb19jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Z3Vlc3NlZF9hdWRpb19jb2RlY19pZCA6IEFWX0NPREVDX0lEX0FBQzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYXZfYXNzZXJ0MCgwKTsKLSAgICB9Ci0KLSAgICBpZiAoc3RyY2hyKG9wdCwgJzonKSkgewotICAgICAgICAvL2V4cGxpY2l0IHByaXZhdGUgb3B0aW9uCi0gICAgICAgIHNucHJpbnRmKGJ1ZmYsIHNpemVvZihidWZmKSwgIiVzIiwgb3B0KTsKLSAgICAgICAgY29kZWNfbmFtZSA9IGJ1ZmY7Ci0gICAgICAgIGlmKCEob3B0aW9uID0gc3RyY2hyKGJ1ZmYsICc6JykpKXsKLSAgICAgICAgICAgIHJlcG9ydF9jb25maWdfZXJyb3IoY29uZmlnLT5maWxlbmFtZSwgY29uZmlnLT5saW5lX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SLCAmY29uZmlnLT5lcnJvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTeW50YXggZXJyb3IuIFVubWF0Y2hlZCAnOidcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIH0KLSAgICAgICAgYnVmZltvcHRpb24gLSBidWZmXSA9ICdcMCc7Ci0gICAgICAgIG9wdGlvbisrOwotICAgICAgICBpZiAoKHJldCA9IGZmc2VydmVyX3NldF9jb2RlYyhjdHgsIGNvZGVjX25hbWUsIGNvbmZpZykpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmICghY3R4LT5jb2RlYyB8fCAhY3R4LT5wcml2X2RhdGEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgb3B0aW9uID0gb3B0OwotICAgIH0KLQotICAgIG8gPSBhdl9vcHRfZmluZChjdHgsIG9wdGlvbiwgTlVMTCwgdHlwZSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLAotICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKLSAgICBpZiAoIW8gJiYKLSAgICAgICAgKCFzdHJjbXAob3B0aW9uLCAidGltZV9iYXNlIikgIHx8ICFzdHJjbXAob3B0aW9uLCAicGl4ZWxfZm9ybWF0IikgfHwKLSAgICAgICAgICFzdHJjbXAob3B0aW9uLCAidmlkZW9fc2l6ZSIpIHx8ICFzdHJjbXAob3B0aW9uLCAiY29kZWNfdGFnIikpKQotICAgICAgICBvID0gYXZfb3B0X2ZpbmQoY3R4LCBvcHRpb24sIE5VTEwsIDAsIDApOwotICAgIGlmICghbykgewotICAgICAgICByZXBvcnRfY29uZmlnX2Vycm9yKGNvbmZpZy0+ZmlsZW5hbWUsIGNvbmZpZy0+bGluZV9udW0sIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLT5lcnJvcnMsICJPcHRpb24gbm90IGZvdW5kOiAnJXMnXG4iLCBvcHQpOwotICAgICAgICBpZiAoIWhpbnRlZCAmJiBjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKLSAgICAgICAgICAgIGhpbnRlZCA9IDE7Ci0gICAgICAgICAgICByZXBvcnRfY29uZmlnX2Vycm9yKGNvbmZpZy0+ZmlsZW5hbWUsIGNvbmZpZy0+bGluZV9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0xPR19FUlJPUiwgTlVMTCwgIklmICclcycgaXMgYSBjb2RlYyBwcml2YXRlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uLCB0aGVuIHByZWZpeCBpdCB3aXRoIGNvZGVjIG5hbWUsIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGFtcGxlICclczolcyAlcycgb3IgZGVmaW5lIGNvZGVjIGVhcmxpZXIuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQsIGF2Y29kZWNfZ2V0X25hbWUoZ3Vlc3NlZF9jb2RlY19pZCkgLG9wdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoKHJldCA9IGF2X29wdF9zZXQoY3R4LCBvcHRpb24sIGFyZywgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkgewotICAgICAgICByZXBvcnRfY29uZmlnX2Vycm9yKGNvbmZpZy0+ZmlsZW5hbWUsIGNvbmZpZy0+bGluZV9udW0sIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAmY29uZmlnLT5lcnJvcnMsICJJbnZhbGlkIHZhbHVlIGZvciBvcHRpb24gJXMgKCVzKTogJXNcbiIsIG9wdCwKLSAgICAgICAgICAgICAgICBhcmcsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgfSBlbHNlIGlmICgoZSA9IGF2X2RpY3RfZ2V0KCpkaWN0LCBvcHRpb24sIE5VTEwsIDApKSkgewotICAgICAgICBpZiAoKG8tPnR5cGUgPT0gQVZfT1BUX1RZUEVfRkxBR1MpICYmIGFyZyAmJgotICAgICAgICAgICAgKGFyZ1swXSA9PSAnKycgfHwgYXJnWzBdID09ICctJykpCi0gICAgICAgICAgICByZXR1cm4gYXZfZGljdF9zZXQoZGljdCwgb3B0aW9uLCBhcmcsIEFWX0RJQ1RfQVBQRU5EKTsKLSAgICAgICAgcmVwb3J0X2NvbmZpZ19lcnJvcihjb25maWctPmZpbGVuYW1lLCBjb25maWctPmxpbmVfbnVtLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZy0+ZXJyb3JzLCAiUmVkZWNsYXJpbmcgdmFsdWUgb2Ygb3B0aW9uICclcycuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcmV2aW91cyB2YWx1ZSB3YXM6ICclcycuXG4iLCBvcHQsIGUtPnZhbHVlKTsKLSAgICB9IGVsc2UgaWYgKGF2X2RpY3Rfc2V0KGRpY3QsIG9wdGlvbiwgYXJnLCAwKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbl9pbnQoY29uc3QgY2hhciAqb3B0LCBpbnQ2NF90IGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIEZGU2VydmVyQ29uZmlnICpjb25maWcpCi17Ci0gICAgY2hhciBidWZbMjJdOwotICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlIlBSSWQ2NCwgYXJnKTsKLSAgICByZXR1cm4gZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbihvcHQsIGJ1ZiwgdHlwZSwgY29uZmlnKTsKLX0KLQotc3RhdGljIGludCBmZnNlcnZlcl9wYXJzZV9jb25maWdfZ2xvYmFsKEZGU2VydmVyQ29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqcCkKLXsKLSAgICBpbnQgdmFsOwotICAgIGNoYXIgYXJnWzEwMjRdOwotICAgIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJQb3J0IikgfHwgIWF2X3N0cmNhc2VjbXAoY21kLCAiSFRUUFBvcnQiKSkgewotICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiUG9ydCIpKQotICAgICAgICAgICAgV0FSTklORygiUG9ydCBvcHRpb24gaXMgZGVwcmVjYXRlZC4gVXNlIEhUVFBQb3J0IGluc3RlYWQuXG4iKTsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgZmZzZXJ2ZXJfc2V0X2ludF9wYXJhbSgmdmFsLCBhcmcsIDAsIDEsIDY1NTM1LCBjb25maWcsCi0gICAgICAgICAgICAgICAgIkludmFsaWQgcG9ydDogJXNcbiIsIGFyZyk7Ci0gICAgICAgIGlmICh2YWwgPCAxMDI0KQotICAgICAgICAgICAgV0FSTklORygiVHJ5aW5nIHRvIHVzZSBJRVRGIGFzc2lnbmVkIHN5c3RlbSBwb3J0OiAnJWQnXG4iLCB2YWwpOwotICAgICAgICBjb25maWctPmh0dHBfYWRkci5zaW5fcG9ydCA9IGh0b25zKHZhbCk7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJIVFRQQmluZEFkZHJlc3MiKSB8fAotICAgICAgICAgICAgICAgIWF2X3N0cmNhc2VjbXAoY21kLCAiQmluZEFkZHJlc3MiKSkgewotICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiQmluZEFkZHJlc3MiKSkKLSAgICAgICAgICAgIFdBUk5JTkcoIkJpbmRBZGRyZXNzIG9wdGlvbiBpcyBkZXByZWNhdGVkLiBVc2UgSFRUUEJpbmRBZGRyZXNzICIKLSAgICAgICAgICAgICAgICAgICAgImluc3RlYWQuXG4iKTsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgaWYgKHJlc29sdmVfaG9zdCgmY29uZmlnLT5odHRwX2FkZHIuc2luX2FkZHIsIGFyZykpCi0gICAgICAgICAgICBFUlJPUigiSW52YWxpZCBob3N0L0lQIGFkZHJlc3M6ICclcydcbiIsIGFyZyk7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJOb0RhZW1vbiIpKSB7Ci0gICAgICAgIFdBUk5JTkcoIk5vRGFlbW9uIG9wdGlvbiBoYXMgbm8gZWZmZWN0LiBZb3Ugc2hvdWxkIHJlbW92ZSBpdC5cbiIpOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiUlRTUFBvcnQiKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBmZnNlcnZlcl9zZXRfaW50X3BhcmFtKCZ2YWwsIGFyZywgMCwgMSwgNjU1MzUsIGNvbmZpZywKLSAgICAgICAgICAgICAgICAiSW52YWxpZCBwb3J0OiAlc1xuIiwgYXJnKTsKLSAgICAgICAgY29uZmlnLT5ydHNwX2FkZHIuc2luX3BvcnQgPSBodG9ucyh2YWwpOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiUlRTUEJpbmRBZGRyZXNzIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgaWYgKHJlc29sdmVfaG9zdCgmY29uZmlnLT5ydHNwX2FkZHIuc2luX2FkZHIsIGFyZykpCi0gICAgICAgICAgICBFUlJPUigiSW52YWxpZCBob3N0L0lQIGFkZHJlc3M6ICVzXG4iLCBhcmcpOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiTWF4SFRUUENvbm5lY3Rpb25zIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgZmZzZXJ2ZXJfc2V0X2ludF9wYXJhbSgmdmFsLCBhcmcsIDAsIDEsIDY1NTM1LCBjb25maWcsCi0gICAgICAgICAgICAgICAgIkludmFsaWQgTWF4SFRUUENvbm5lY3Rpb25zOiAlc1xuIiwgYXJnKTsKLSAgICAgICAgY29uZmlnLT5uYl9tYXhfaHR0cF9jb25uZWN0aW9ucyA9IHZhbDsKLSAgICAgICAgaWYgKGNvbmZpZy0+bmJfbWF4X2Nvbm5lY3Rpb25zID4gY29uZmlnLT5uYl9tYXhfaHR0cF9jb25uZWN0aW9ucykgewotICAgICAgICAgICAgRVJST1IoIkluY29uc2lzdGVudCBjb25maWd1cmF0aW9uOiBNYXhDbGllbnRzKCVkKSA+ICIKLSAgICAgICAgICAgICAgICAgICJNYXhIVFRQQ29ubmVjdGlvbnMoJWQpXG4iLCBjb25maWctPm5iX21heF9jb25uZWN0aW9ucywKLSAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bmJfbWF4X2h0dHBfY29ubmVjdGlvbnMpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJNYXhDbGllbnRzIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgZmZzZXJ2ZXJfc2V0X2ludF9wYXJhbSgmdmFsLCBhcmcsIDAsIDEsIDY1NTM1LCBjb25maWcsCi0gICAgICAgICAgICAgICAgIkludmFsaWQgTWF4Q2xpZW50czogJyVzJ1xuIiwgYXJnKTsKLSAgICAgICAgY29uZmlnLT5uYl9tYXhfY29ubmVjdGlvbnMgPSB2YWw7Ci0gICAgICAgIGlmIChjb25maWctPm5iX21heF9jb25uZWN0aW9ucyA+IGNvbmZpZy0+bmJfbWF4X2h0dHBfY29ubmVjdGlvbnMpIHsKLSAgICAgICAgICAgIEVSUk9SKCJJbmNvbnNpc3RlbnQgY29uZmlndXJhdGlvbjogTWF4Q2xpZW50cyglZCkgPiAiCi0gICAgICAgICAgICAgICAgICAiTWF4SFRUUENvbm5lY3Rpb25zKCVkKVxuIiwgY29uZmlnLT5uYl9tYXhfY29ubmVjdGlvbnMsCi0gICAgICAgICAgICAgICAgICBjb25maWctPm5iX21heF9odHRwX2Nvbm5lY3Rpb25zKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiTWF4QmFuZHdpZHRoIikpIHsKLSAgICAgICAgaW50NjRfdCBsbHZhbDsKLSAgICAgICAgY2hhciAqdGFpbHA7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGVycm5vID0gMDsKLSAgICAgICAgbGx2YWwgPSBzdHJ0b2xsKGFyZywgJnRhaWxwLCAxMCk7Ci0gICAgICAgIGlmIChsbHZhbCA8IDEwIHx8IGxsdmFsID4gMTAwMDAwMDAgfHwgdGFpbHBbMF0gfHwgZXJybm8pCi0gICAgICAgICAgICBFUlJPUigiSW52YWxpZCBNYXhCYW5kd2lkdGg6ICclcydcbiIsIGFyZyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvbmZpZy0+bWF4X2JhbmR3aWR0aCA9IGxsdmFsOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiQ3VzdG9tTG9nIikpIHsKLSAgICAgICAgaWYgKCFjb25maWctPmRlYnVnKSB7Ci0gICAgICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGNvbmZpZy0+bG9nZmlsZW5hbWUsIHNpemVvZihjb25maWctPmxvZ2ZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIkxvYWRNb2R1bGUiKSkgewotICAgICAgICBFUlJPUigiTG9hZGFibGUgbW9kdWxlcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZFxuIik7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJOb0RlZmF1bHRzIikpIHsKLSAgICAgICAgY29uZmlnLT51c2VfZGVmYXVsdHMgPSAwOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiVXNlRGVmYXVsdHMiKSkgewotICAgICAgICBjb25maWctPnVzZV9kZWZhdWx0cyA9IDE7Ci0gICAgfSBlbHNlCi0gICAgICAgIEVSUk9SKCJJbmNvcnJlY3Qga2V5d29yZDogJyVzJ1xuIiwgY21kKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmZnNlcnZlcl9wYXJzZV9jb25maWdfZmVlZChGRlNlcnZlckNvbmZpZyAqY29uZmlnLCBjb25zdCBjaGFyICpjbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipwLCBGRlNlcnZlclN0cmVhbSAqKnBmZWVkKQotewotICAgIEZGU2VydmVyU3RyZWFtICpmZWVkOwotICAgIGNoYXIgYXJnWzEwMjRdOwotICAgIGF2X2Fzc2VydDAocGZlZWQpOwotICAgIGZlZWQgPSAqcGZlZWQ7Ci0gICAgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIjxGZWVkIikpIHsKLSAgICAgICAgY2hhciAqcTsKLSAgICAgICAgRkZTZXJ2ZXJTdHJlYW0gKnM7Ci0gICAgICAgIGZlZWQgPSBhdl9tYWxsb2N6KHNpemVvZihGRlNlcnZlclN0cmVhbSkpOwotICAgICAgICBpZiAoIWZlZWQpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGZlZWQtPmZpbGVuYW1lLCBzaXplb2YoZmVlZC0+ZmlsZW5hbWUpLCBwKTsKLSAgICAgICAgcSA9IHN0cnJjaHIoZmVlZC0+ZmlsZW5hbWUsICc+Jyk7Ci0gICAgICAgIGlmICgqcSkKLSAgICAgICAgICAgICpxID0gJ1wwJzsKLQotICAgICAgICBmb3IgKHMgPSBjb25maWctPmZpcnN0X2ZlZWQ7IHM7IHMgPSBzLT5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChmZWVkLT5maWxlbmFtZSwgcy0+ZmlsZW5hbWUpKQotICAgICAgICAgICAgICAgIEVSUk9SKCJGZWVkICclcycgYWxyZWFkeSByZWdpc3RlcmVkXG4iLCBzLT5maWxlbmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmZWVkLT5mbXQgPSBhdl9ndWVzc19mb3JtYXQoImZmbSIsIE5VTEwsIE5VTEwpOwotICAgICAgICAvKiBkZWZhdWx0IGZlZWQgZmlsZSAqLwotICAgICAgICBzbnByaW50ZihmZWVkLT5mZWVkX2ZpbGVuYW1lLCBzaXplb2YoZmVlZC0+ZmVlZF9maWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICIvdG1wLyVzLmZmbSIsIGZlZWQtPmZpbGVuYW1lKTsKLSAgICAgICAgZmVlZC0+ZmVlZF9tYXhfc2l6ZSA9IDUgKiAxMDI0ICogMTAyNDsKLSAgICAgICAgZmVlZC0+aXNfZmVlZCA9IDE7Ci0gICAgICAgIGZlZWQtPmZlZWQgPSBmZWVkOyAvKiBzZWxmIGZlZWRpbmcgOi0pICovCi0gICAgICAgICpwZmVlZCA9IGZlZWQ7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBhdl9hc3NlcnQwKGZlZWQpOwotICAgIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJMYXVuY2giKSkgewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBmZWVkLT5jaGlsZF9hcmd2ID0gYXZfbWFsbG9jel9hcnJheShNQVhfQ0hJTERfQVJHUywgc2l6ZW9mKGNoYXIgKikpOwotICAgICAgICBpZiAoIWZlZWQtPmNoaWxkX2FyZ3YpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0NISUxEX0FSR1MgLSAyOyBpKyspIHsKLSAgICAgICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgICAgICBpZiAoIWFyZ1swXSkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZmVlZC0+Y2hpbGRfYXJndltpXSA9IGF2X3N0cmR1cChhcmcpOwotICAgICAgICAgICAgaWYgKCFmZWVkLT5jaGlsZF9hcmd2W2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmZWVkLT5jaGlsZF9hcmd2W2ldID0KLSAgICAgICAgICAgIGF2X2FzcHJpbnRmKCJodHRwOi8vJXM6JWQvJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+aHR0cF9hZGRyLnNpbl9hZGRyLnNfYWRkciA9PSBJTkFERFJfQU5ZKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAiMTI3LjAuMC4xIiA6IGluZXRfbnRvYShjb25maWctPmh0dHBfYWRkci5zaW5fYWRkciksCi0gICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhjb25maWctPmh0dHBfYWRkci5zaW5fcG9ydCksIGZlZWQtPmZpbGVuYW1lKTsKLSAgICAgICAgaWYgKCFmZWVkLT5jaGlsZF9hcmd2W2ldKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIkFDTCIpKSB7Ci0gICAgICAgIGZmc2VydmVyX3BhcnNlX2FjbF9yb3coTlVMTCwgZmVlZCwgTlVMTCwgKnAsIGNvbmZpZy0+ZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgY29uZmlnLT5saW5lX251bSk7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJGaWxlIikgfHwKLSAgICAgICAgICAgICAgICFhdl9zdHJjYXNlY21wKGNtZCwgIlJlYWRPbmx5RmlsZSIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoZmVlZC0+ZmVlZF9maWxlbmFtZSwgc2l6ZW9mKGZlZWQtPmZlZWRfZmlsZW5hbWUpLCBwKTsKLSAgICAgICAgZmVlZC0+cmVhZG9ubHkgPSAhYXZfc3RyY2FzZWNtcChjbWQsICJSZWFkT25seUZpbGUiKTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIlRydW5jYXRlIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgLyogYXNzdW1lIFRydW5jYXRlIGlzIHRydWUgaW4gY2FzZSBubyBhcmd1bWVudCBpcyBzcGVjaWZpZWQgKi8KLSAgICAgICAgaWYgKCFhcmdbMF0pIHsKLSAgICAgICAgICAgIGZlZWQtPnRydW5jYXRlID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFdBUk5JTkcoIlRydW5jYXRlIE4gc3ludGF4IGluIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBkZXByZWNhdGVkLiAiCi0gICAgICAgICAgICAgICAgICAgICJVc2UgVHJ1bmNhdGUgYWxvbmUgd2l0aCBubyBhcmd1bWVudHMuXG4iKTsKLSAgICAgICAgICAgIGZlZWQtPnRydW5jYXRlID0gc3RydG9kKGFyZywgTlVMTCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIkZpbGVNYXhTaXplIikpIHsKLSAgICAgICAgY2hhciAqcDE7Ci0gICAgICAgIGRvdWJsZSBmc2l6ZTsKLQotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBwMSA9IGFyZzsKLSAgICAgICAgZnNpemUgPSBzdHJ0b2QocDEsICZwMSk7Ci0gICAgICAgIHN3aXRjaChhdl90b3VwcGVyKCpwMSkpIHsKLSAgICAgICAgY2FzZSAnSyc6Ci0gICAgICAgICAgICBmc2l6ZSAqPSAxMDI0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICAgZnNpemUgKj0gMTAyNCAqIDEwMjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRyc6Ci0gICAgICAgICAgICBmc2l6ZSAqPSAxMDI0ICogMTAyNCAqIDEwMjQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEVSUk9SKCJJbnZhbGlkIGZpbGUgc2l6ZTogJyVzJ1xuIiwgYXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZlZWQtPmZlZWRfbWF4X3NpemUgPSAoaW50NjRfdClmc2l6ZTsKLSAgICAgICAgaWYgKGZlZWQtPmZlZWRfbWF4X3NpemUgPCBGRk1fUEFDS0VUX1NJWkUqNCkgewotICAgICAgICAgICAgRVJST1IoIkZlZWQgbWF4IGZpbGUgc2l6ZSBpcyB0b28gc21hbGwuIE11c3QgYmUgYXQgbGVhc3QgJWQuXG4iLAotICAgICAgICAgICAgICAgICAgRkZNX1BBQ0tFVF9TSVpFKjQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICI8L0ZlZWQ+IikpIHsKLSAgICAgICAgKnBmZWVkID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBFUlJPUigiSW52YWxpZCBlbnRyeSAnJXMnIGluc2lkZSA8RmVlZD48L0ZlZWQ+XG4iLCBjbWQpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmZnNlcnZlcl9wYXJzZV9jb25maWdfc3RyZWFtKEZGU2VydmVyQ29uZmlnICpjb25maWcsIGNvbnN0IGNoYXIgKmNtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRlNlcnZlclN0cmVhbSAqKnBzdHJlYW0pCi17Ci0gICAgY2hhciBhcmdbMTAyNF0sIGFyZzJbMTAyNF07Ci0gICAgRkZTZXJ2ZXJTdHJlYW0gKnN0cmVhbTsKLSAgICBpbnQgdmFsOwotCi0gICAgYXZfYXNzZXJ0MChwc3RyZWFtKTsKLSAgICBzdHJlYW0gPSAqcHN0cmVhbTsKLQotICAgIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICI8U3RyZWFtIikpIHsKLSAgICAgICAgY2hhciAqcTsKLSAgICAgICAgRkZTZXJ2ZXJTdHJlYW0gKnM7Ci0gICAgICAgIHN0cmVhbSA9IGF2X21hbGxvY3ooc2l6ZW9mKEZGU2VydmVyU3RyZWFtKSk7Ci0gICAgICAgIGlmICghc3RyZWFtKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgY29uZmlnLT5kdW1teV9hY3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhOVUxMKTsKLSAgICAgICAgY29uZmlnLT5kdW1teV92Y3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhOVUxMKTsKLSAgICAgICAgaWYgKCFjb25maWctPmR1bW15X3ZjdHggfHwgIWNvbmZpZy0+ZHVtbXlfYWN0eCkgewotICAgICAgICAgICAgYXZfZnJlZShzdHJlYW0pOwotICAgICAgICAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmNvbmZpZy0+ZHVtbXlfdmN0eCk7Ci0gICAgICAgICAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmY29uZmlnLT5kdW1teV9hY3R4KTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlnLT5kdW1teV9hY3R4LT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBjb25maWctPmR1bW15X3ZjdHgtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoc3RyZWFtLT5maWxlbmFtZSwgc2l6ZW9mKHN0cmVhbS0+ZmlsZW5hbWUpLCBwKTsKLSAgICAgICAgcSA9IHN0cnJjaHIoc3RyZWFtLT5maWxlbmFtZSwgJz4nKTsKLSAgICAgICAgaWYgKHEpCi0gICAgICAgICAgICAqcSA9ICdcMCc7Ci0KLSAgICAgICAgZm9yIChzID0gY29uZmlnLT5maXJzdF9zdHJlYW07IHM7IHMgPSBzLT5uZXh0KSB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChzdHJlYW0tPmZpbGVuYW1lLCBzLT5maWxlbmFtZSkpCi0gICAgICAgICAgICAgICAgRVJST1IoIlN0cmVhbSAnJXMnIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwgcy0+ZmlsZW5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RyZWFtLT5mbXQgPSBmZnNlcnZlcl9ndWVzc19mb3JtYXQoTlVMTCwgc3RyZWFtLT5maWxlbmFtZSwgTlVMTCk7Ci0gICAgICAgIGlmIChzdHJlYW0tPmZtdCkgewotICAgICAgICAgICAgY29uZmlnLT5ndWVzc2VkX2F1ZGlvX2NvZGVjX2lkID0gc3RyZWFtLT5mbXQtPmF1ZGlvX2NvZGVjOwotICAgICAgICAgICAgY29uZmlnLT5ndWVzc2VkX3ZpZGVvX2NvZGVjX2lkID0gc3RyZWFtLT5mbXQtPnZpZGVvX2NvZGVjOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uZmlnLT5ndWVzc2VkX2F1ZGlvX2NvZGVjX2lkID0gQVZfQ09ERUNfSURfTk9ORTsKLSAgICAgICAgICAgIGNvbmZpZy0+Z3Vlc3NlZF92aWRlb19jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7Ci0gICAgICAgIH0KLSAgICAgICAgY29uZmlnLT5zdHJlYW1fdXNlX2RlZmF1bHRzID0gY29uZmlnLT51c2VfZGVmYXVsdHM7Ci0gICAgICAgICpwc3RyZWFtID0gc3RyZWFtOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgYXZfYXNzZXJ0MChzdHJlYW0pOwotICAgIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJGZWVkIikpIHsKLSAgICAgICAgRkZTZXJ2ZXJTdHJlYW0gKnNmZWVkOwotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBzZmVlZCA9IGNvbmZpZy0+Zmlyc3RfZmVlZDsKLSAgICAgICAgd2hpbGUgKHNmZWVkKSB7Ci0gICAgICAgICAgICBpZiAoIXN0cmNtcChzZmVlZC0+ZmlsZW5hbWUsIGFyZykpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBzZmVlZCA9IHNmZWVkLT5uZXh0X2ZlZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzZmVlZCkKLSAgICAgICAgICAgIEVSUk9SKCJGZWVkIHdpdGggbmFtZSAnJXMnIGZvciBzdHJlYW0gJyVzJyBpcyBub3QgZGVmaW5lZFxuIiwgYXJnLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmZpbGVuYW1lKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgc3RyZWFtLT5mZWVkID0gc2ZlZWQ7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJGb3JtYXQiKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBpZiAoIXN0cmNtcChhcmcsICJzdGF0dXMiKSkgewotICAgICAgICAgICAgc3RyZWFtLT5zdHJlYW1fdHlwZSA9IFNUUkVBTV9UWVBFX1NUQVRVUzsKLSAgICAgICAgICAgIHN0cmVhbS0+Zm10ID0gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0cmVhbS0+c3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9MSVZFOwotICAgICAgICAgICAgLyogSlBFRyBjYW5ub3QgYmUgdXNlZCBoZXJlLCBzbyB1c2Ugc2luZ2xlIGZyYW1lIE1KUEVHICovCi0gICAgICAgICAgICBpZiAoIXN0cmNtcChhcmcsICJqcGVnIikpIHsKLSAgICAgICAgICAgICAgICBzdHJjcHkoYXJnLCAic2luZ2xlanBlZyIpOwotICAgICAgICAgICAgICAgIHN0cmVhbS0+c2luZ2xlX2ZyYW1lPTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJlYW0tPmZtdCA9IGZmc2VydmVyX2d1ZXNzX2Zvcm1hdChhcmcsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgaWYgKCFzdHJlYW0tPmZtdCkKLSAgICAgICAgICAgICAgICBFUlJPUigiVW5rbm93biBGb3JtYXQ6ICclcydcbiIsIGFyZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0cmVhbS0+Zm10KSB7Ci0gICAgICAgICAgICBjb25maWctPmd1ZXNzZWRfYXVkaW9fY29kZWNfaWQgPSBzdHJlYW0tPmZtdC0+YXVkaW9fY29kZWM7Ci0gICAgICAgICAgICBjb25maWctPmd1ZXNzZWRfdmlkZW9fY29kZWNfaWQgPSBzdHJlYW0tPmZtdC0+dmlkZW9fY29kZWM7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIklucHV0Rm9ybWF0IikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgc3RyZWFtLT5pZm10ID0gYXZfZmluZF9pbnB1dF9mb3JtYXQoYXJnKTsKLSAgICAgICAgaWYgKCFzdHJlYW0tPmlmbXQpCi0gICAgICAgICAgICBFUlJPUigiVW5rbm93biBpbnB1dCBmb3JtYXQ6ICclcydcbiIsIGFyZyk7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJGYXZpY29uVVJMIikpIHsKLSAgICAgICAgaWYgKHN0cmVhbS0+c3RyZWFtX3R5cGUgPT0gU1RSRUFNX1RZUEVfU1RBVFVTKQotICAgICAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhzdHJlYW0tPmZlZWRfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJlYW0tPmZlZWRfZmlsZW5hbWUpLCBwKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgRVJST1IoIkZhdmljb25VUkwgb25seSBwZXJtaXR0ZWQgZm9yIHN0YXR1cyBzdHJlYW1zXG4iKTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIkF1dGhvciIpICAgIHx8Ci0gICAgICAgICAgICAgICAhYXZfc3RyY2FzZWNtcChjbWQsICJDb21tZW50IikgICB8fAotICAgICAgICAgICAgICAgIWF2X3N0cmNhc2VjbXAoY21kLCAiQ29weXJpZ2h0IikgfHwKLSAgICAgICAgICAgICAgICFhdl9zdHJjYXNlY21wKGNtZCwgIlRpdGxlIikpIHsKLSAgICAgICAgY2hhciBrZXlbMzJdOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0cmxlbihjbWQpOyBpKyspCi0gICAgICAgICAgICBrZXlbaV0gPSBhdl90b2xvd2VyKGNtZFtpXSk7Ci0gICAgICAgIGtleVtpXSA9IDA7Ci0gICAgICAgIFdBUk5JTkcoIkRlcHJlY2F0ZWQgJyVzJyBvcHRpb24gaW4gY29uZmlndXJhdGlvbiBmaWxlLiBVc2UgIgotICAgICAgICAgICAgICAgICInTWV0YWRhdGEgJXMgVkFMVUUnIGluc3RlYWQuXG4iLCBjbWQsIGtleSk7Ci0gICAgICAgIGlmIChhdl9kaWN0X3NldCgmc3RyZWFtLT5tZXRhZGF0YSwga2V5LCBhcmcsIDApIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJNZXRhZGF0YSIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnMiwgc2l6ZW9mKGFyZzIpLCBwKTsKLSAgICAgICAgaWYgKGF2X2RpY3Rfc2V0KCZzdHJlYW0tPm1ldGFkYXRhLCBhcmcsIGFyZzIsIDApIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJQcmVyb2xsIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgc3RyZWFtLT5wcmVidWZmZXIgPSBhdG9mKGFyZykgKiAxMDAwOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiU3RhcnRTZW5kT25LZXkiKSkgewotICAgICAgICBzdHJlYW0tPnNlbmRfb25fa2V5ID0gMTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIkF1ZGlvQ29kZWMiKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBmZnNlcnZlcl9zZXRfY29kZWMoY29uZmlnLT5kdW1teV9hY3R4LCBhcmcsIGNvbmZpZyk7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJWaWRlb0NvZGVjIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgZmZzZXJ2ZXJfc2V0X2NvZGVjKGNvbmZpZy0+ZHVtbXlfdmN0eCwgYXJnLCBjb25maWcpOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiTWF4VGltZSIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIHN0cmVhbS0+bWF4X3RpbWUgPSBhdG9mKGFyZykgKiAxMDAwOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiQXVkaW9CaXRSYXRlIikpIHsKLSAgICAgICAgZmxvYXQgZjsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgZmZzZXJ2ZXJfc2V0X2Zsb2F0X3BhcmFtKCZmLCBhcmcsIDEwMDAsIC1GTFRfTUFYLCBGTFRfTUFYLCBjb25maWcsCi0gICAgICAgICAgICAgICAgIkludmFsaWQgJXM6ICclcydcbiIsIGNtZCwgYXJnKTsKLSAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb25faW50KCJiIiwgKGludDY0X3QpbHJpbnRmKGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0sIGNvbmZpZykgPCAwKQotICAgICAgICAgICAgZ290byBub21lbTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIkF1ZGlvQ2hhbm5lbHMiKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigiYWMiLCBhcmcsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJBdWRpb1NhbXBsZVJhdGUiKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigiYXIiLCBhcmcsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJWaWRlb0JpdFJhdGVSYW5nZSIpKSB7Ci0gICAgICAgIGludCBtaW5yYXRlLCBtYXhyYXRlOwotICAgICAgICBjaGFyICpkYXNoOwotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBkYXNoID0gc3RyY2hyKGFyZywgJy0nKTsKLSAgICAgICAgaWYgKGRhc2gpIHsKLSAgICAgICAgICAgICpkYXNoID0gJ1wwJzsKLSAgICAgICAgICAgIGRhc2grKzsKLSAgICAgICAgICAgIGlmIChmZnNlcnZlcl9zZXRfaW50X3BhcmFtKCZtaW5yYXRlLCBhcmcsICAxMDAwLCAwLCBJTlRfTUFYLCBjb25maWcsICJJbnZhbGlkICVzOiAnJXMnIiwgY21kLCBhcmcpID49IDAgJiYKLSAgICAgICAgICAgICAgICBmZnNlcnZlcl9zZXRfaW50X3BhcmFtKCZtYXhyYXRlLCBkYXNoLCAxMDAwLCAwLCBJTlRfTUFYLCBjb25maWcsICJJbnZhbGlkICVzOiAnJXMnIiwgY21kLCBhcmcpID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbl9pbnQoIm1pbnJhdGUiLCBtaW5yYXRlLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSwgY29uZmlnKSA8IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbl9pbnQoIm1heHJhdGUiLCBtYXhyYXRlLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSwgY29uZmlnKSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBub21lbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBFUlJPUigiSW5jb3JyZWN0IGZvcm1hdCBmb3IgVmlkZW9CaXRSYXRlUmFuZ2UuIEl0IHNob3VsZCBiZSAiCi0gICAgICAgICAgICAgICAgICAiPG1pbj4tPG1heD46ICclcycuXG4iLCBhcmcpOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiRGVidWciKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigiZGVidWciLCBhcmcsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNLCBjb25maWcpIDwgMCB8fAotICAgICAgICAgICAgZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigiZGVidWciLCBhcmcsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJTdHJpY3QiKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigic3RyaWN0IiwgYXJnLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSwgY29uZmlnKSA8IDAgfHwKLSAgICAgICAgICAgIGZmc2VydmVyX3NhdmVfYXZvcHRpb24oInN0cmljdCIsIGFyZywgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sIGNvbmZpZykgPCAwKQotICAgICAgICAgICAgZ290byBub21lbTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIlZpZGVvQnVmZmVyU2l6ZSIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGZmc2VydmVyX3NldF9pbnRfcGFyYW0oJnZhbCwgYXJnLCA4KjEwMjQsIDAsIElOVF9NQVgsIGNvbmZpZywKLSAgICAgICAgICAgICAgICAiSW52YWxpZCAlczogJyVzJyIsIGNtZCwgYXJnKTsKLSAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb25faW50KCJidWZzaXplIiwgdmFsLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSwgY29uZmlnKSA8IDApCi0gICAgICAgICAgICBnb3RvIG5vbWVtOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiVmlkZW9CaXRSYXRlVG9sZXJhbmNlIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgZmZzZXJ2ZXJfc2V0X2ludF9wYXJhbSgmdmFsLCBhcmcsIDEwMDAsIElOVF9NSU4sIElOVF9NQVgsIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCAlczogJyVzJyIsIGNtZCwgYXJnKTsKLSAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb25faW50KCJidCIsIHZhbCwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sIGNvbmZpZykgPCAwKQotICAgICAgICAgICAgZ290byBub21lbTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIlZpZGVvQml0UmF0ZSIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGZmc2VydmVyX3NldF9pbnRfcGFyYW0oJnZhbCwgYXJnLCAxMDAwLCBJTlRfTUlOLCBJTlRfTUFYLCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgJXM6ICclcyciLCBjbWQsIGFyZyk7Ci0gICAgICAgIGlmIChmZnNlcnZlcl9zYXZlX2F2b3B0aW9uX2ludCgiYiIsIHZhbCwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sIGNvbmZpZykgPCAwKQotICAgICAgICAgICBnb3RvIG5vbWVtOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiVmlkZW9TaXplIikpIHsKLSAgICAgICAgaW50IHJldCwgdywgaDsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgcmV0ID0gYXZfcGFyc2VfdmlkZW9fc2l6ZSgmdywgJmgsIGFyZyk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgRVJST1IoIkludmFsaWQgdmlkZW8gc2l6ZSAnJXMnXG4iLCBhcmcpOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICh3ICUgMiB8fCBoICUgMikKLSAgICAgICAgICAgICAgICBXQVJOSU5HKCJJbWFnZSBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIDJcbiIpOwotICAgICAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb24oInZpZGVvX3NpemUiLCBhcmcsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIG5vbWVtOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJWaWRlb0ZyYW1lUmF0ZSIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoJmFyZ1syXSwgc2l6ZW9mKGFyZykgLSAyLCBwKTsKLSAgICAgICAgYXJnWzBdID0gJzEnOyBhcmdbMV0gPSAnLyc7Ci0gICAgICAgIGlmIChmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKCJ0aW1lX2Jhc2UiLCBhcmcsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJQaXhlbEZvcm1hdCIpKSB7Ci0gICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OwotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBwaXhfZm10ID0gYXZfZ2V0X3BpeF9mbXQoYXJnKTsKLSAgICAgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKQotICAgICAgICAgICAgRVJST1IoIlVua25vd24gcGl4ZWwgZm9ybWF0OiAnJXMnXG4iLCBhcmcpOwotICAgICAgICBlbHNlIGlmIChmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKCJwaXhlbF9mb3JtYXQiLCBhcmcsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJWaWRlb0dvcFNpemUiKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigiZyIsIGFyZywgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sIGNvbmZpZykgPCAwKQotICAgICAgICAgICAgZ290byBub21lbTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIlZpZGVvSW50cmFPbmx5IikpIHsKLSAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb24oImciLCAiMSIsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJWaWRlb0hpZ2hRdWFsaXR5IikpIHsKLSAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb24oIm1iZCIsICIrYml0cyIsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJWaWRlbzRNb3Rpb25WZWN0b3IiKSkgewotICAgICAgICBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigibWJkIiwgIitiaXRzIiwgIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCB8fCAvL0ZJWE1FIHJlbW92ZQotICAgICAgICAgICAgZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigiZmxhZ3MiLCAiK212NCIsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJBVk9wdGlvblZpZGVvIikgfHwKLSAgICAgICAgICAgICAgICFhdl9zdHJjYXNlY21wKGNtZCwgIkFWT3B0aW9uQXVkaW8iKSkgewotICAgICAgICBpbnQgcmV0OwotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZzIsIHNpemVvZihhcmcyKSwgcCk7Ci0gICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJBVk9wdGlvblZpZGVvIikpCi0gICAgICAgICAgICByZXQgPSBmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKGFyZywgYXJnMiwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldCA9IGZmc2VydmVyX3NhdmVfYXZvcHRpb24oYXJnLCBhcmcyLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIG5vbWVtOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiQVZQcmVzZXRWaWRlbyIpIHx8Ci0gICAgICAgICAgICAgICAhYXZfc3RyY2FzZWNtcChjbWQsICJBVlByZXNldEF1ZGlvIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIkFWUHJlc2V0VmlkZW8iKSkKLSAgICAgICAgICAgIGZmc2VydmVyX29wdF9wcmVzZXQoYXJnLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSwgY29uZmlnKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmZzZXJ2ZXJfb3B0X3ByZXNldChhcmcsIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNLCBjb25maWcpOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiVmlkZW9UYWciKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBpZiAoc3RybGVuKGFyZykgPT0gNCAmJgotICAgICAgICAgICAgZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbl9pbnQoImNvZGVjX3RhZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNS1RBRyhhcmdbMF0sIGFyZ1sxXSwgYXJnWzJdLCBhcmdbM10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sIGNvbmZpZykgPCAwKQotICAgICAgICAgICAgZ290byBub21lbTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIkJpdEV4YWN0IikpIHsKLSAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb24oImZsYWdzIiwgIitiaXRleGFjdCIsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJEY3RGYXN0aW50IikpIHsKLSAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb24oImRjdCIsICJmYXN0aW50IiwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sIGNvbmZpZykgPCAwKQotICAgICAgICAgICAgZ290byBub21lbTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIklkY3RTaW1wbGUiKSkgewotICAgICAgICBpZiAoZmZzZXJ2ZXJfc2F2ZV9hdm9wdGlvbigiaWRjdCIsICJzaW1wbGUiLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSwgY29uZmlnKSA8IDApCi0gICAgICAgICAgICBnb3RvIG5vbWVtOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiUXNjYWxlIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgZmZzZXJ2ZXJfc2V0X2ludF9wYXJhbSgmdmFsLCBhcmcsIDAsIElOVF9NSU4sIElOVF9NQVgsIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBRc2NhbGU6ICclcydcbiIsIGFyZyk7Ci0gICAgICAgIGlmIChmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKCJmbGFncyIsICIrcXNjYWxlIiwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sIGNvbmZpZykgPCAwIHx8Ci0gICAgICAgICAgICBmZnNlcnZlcl9zYXZlX2F2b3B0aW9uX2ludCgiZ2xvYmFsX3F1YWxpdHkiLCBGRl9RUDJMQU1CREEgKiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfRkxBR19WSURFT19QQVJBTSwgY29uZmlnKSA8IDApCi0gICAgICAgICAgICBnb3RvIG5vbWVtOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiVmlkZW9RRGlmZiIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGlmIChmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKCJxZGlmZiIsIGFyZywgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0sIGNvbmZpZykgPCAwKQotICAgICAgICAgICAgZ290byBub21lbTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIlZpZGVvUU1heCIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGlmIChmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKCJxbWF4IiwgYXJnLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSwgY29uZmlnKSA8IDApCi0gICAgICAgICAgICBnb3RvIG5vbWVtOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiVmlkZW9RTWluIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhhcmcsIHNpemVvZihhcmcpLCBwKTsKLSAgICAgICAgaWYgKGZmc2VydmVyX3NhdmVfYXZvcHRpb24oInFtaW4iLCBhcmcsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJMdW1pTWFzayIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGlmIChmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKCJsdW1pX21hc2siLCBhcmcsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJEYXJrTWFzayIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGlmIChmZnNlcnZlcl9zYXZlX2F2b3B0aW9uKCJkYXJrX21hc2siLCBhcmcsIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNLCBjb25maWcpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gbm9tZW07Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJOb1ZpZGVvIikpIHsKLSAgICAgICAgY29uZmlnLT5ub192aWRlbyA9IDE7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJOb0F1ZGlvIikpIHsKLSAgICAgICAgY29uZmlnLT5ub19hdWRpbyA9IDE7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJBQ0wiKSkgewotICAgICAgICBmZnNlcnZlcl9wYXJzZV9hY2xfcm93KHN0cmVhbSwgTlVMTCwgTlVMTCwgKnAsIGNvbmZpZy0+ZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgY29uZmlnLT5saW5lX251bSk7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJEeW5hbWljQUNMIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhzdHJlYW0tPmR5bmFtaWNfYWNsLCBzaXplb2Yoc3RyZWFtLT5keW5hbWljX2FjbCksIHApOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiUlRTUE9wdGlvbiIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzdHJlYW0tPnJ0c3Bfb3B0aW9uKTsKLSAgICAgICAgc3RyZWFtLT5ydHNwX29wdGlvbiA9IGF2X3N0cmR1cChhcmcpOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiTXVsdGljYXN0QWRkcmVzcyIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGlmIChyZXNvbHZlX2hvc3QoJnN0cmVhbS0+bXVsdGljYXN0X2lwLCBhcmcpKQotICAgICAgICAgICAgRVJST1IoIkludmFsaWQgaG9zdC9JUCBhZGRyZXNzOiAnJXMnXG4iLCBhcmcpOwotICAgICAgICBzdHJlYW0tPmlzX211bHRpY2FzdCA9IDE7Ci0gICAgICAgIHN0cmVhbS0+bG9vcCA9IDE7IC8qIGRlZmF1bHQgaXMgbG9vcGluZyAqLwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiTXVsdGljYXN0UG9ydCIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoYXJnLCBzaXplb2YoYXJnKSwgcCk7Ci0gICAgICAgIGZmc2VydmVyX3NldF9pbnRfcGFyYW0oJnZhbCwgYXJnLCAwLCAxLCA2NTUzNSwgY29uZmlnLAotICAgICAgICAgICAgICAgICJJbnZhbGlkIE11bHRpY2FzdFBvcnQ6ICclcydcbiIsIGFyZyk7Ci0gICAgICAgIHN0cmVhbS0+bXVsdGljYXN0X3BvcnQgPSB2YWw7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJNdWx0aWNhc3RUVEwiKSkgewotICAgICAgICBmZnNlcnZlcl9nZXRfYXJnKGFyZywgc2l6ZW9mKGFyZyksIHApOwotICAgICAgICBmZnNlcnZlcl9zZXRfaW50X3BhcmFtKCZ2YWwsIGFyZywgMCwgSU5UX01JTiwgSU5UX01BWCwgY29uZmlnLAotICAgICAgICAgICAgICAgICJJbnZhbGlkIE11bHRpY2FzdFRUTDogJyVzJ1xuIiwgYXJnKTsKLSAgICAgICAgc3RyZWFtLT5tdWx0aWNhc3RfdHRsID0gdmFsOwotICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiTm9Mb29wIikpIHsKLSAgICAgICAgc3RyZWFtLT5sb29wID0gMDsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIjwvU3RyZWFtPiIpKSB7Ci0gICAgICAgIGNvbmZpZy0+c3RyZWFtX3VzZV9kZWZhdWx0cyAmPSAxOwotICAgICAgICBpZiAoc3RyZWFtLT5mZWVkICYmIHN0cmVhbS0+Zm10ICYmIHN0cmNtcChzdHJlYW0tPmZtdC0+bmFtZSwgImZmbSIpKSB7Ci0gICAgICAgICAgICBpZiAoY29uZmlnLT5kdW1teV9hY3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQotICAgICAgICAgICAgICAgIGNvbmZpZy0+ZHVtbXlfYWN0eC0+Y29kZWNfaWQgPSBjb25maWctPmd1ZXNzZWRfYXVkaW9fY29kZWNfaWQ7Ci0gICAgICAgICAgICBpZiAoIWNvbmZpZy0+bm9fYXVkaW8gJiYKLSAgICAgICAgICAgICAgICBjb25maWctPmR1bW15X2FjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXVkaW9fZW5jID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhhdmNvZGVjX2ZpbmRfZW5jb2Rlcihjb25maWctPmR1bW15X2FjdHgtPmNvZGVjX2lkKSk7Ci0gICAgICAgICAgICAgICAgYWRkX2NvZGVjKHN0cmVhbSwgYXVkaW9fZW5jLCBjb25maWcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNvbmZpZy0+ZHVtbXlfdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKLSAgICAgICAgICAgICAgICBjb25maWctPmR1bW15X3ZjdHgtPmNvZGVjX2lkID0gY29uZmlnLT5ndWVzc2VkX3ZpZGVvX2NvZGVjX2lkOwotICAgICAgICAgICAgaWYgKCFjb25maWctPm5vX3ZpZGVvICYmCi0gICAgICAgICAgICAgICAgY29uZmlnLT5kdW1teV92Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKnZpZGVvX2VuYyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoYXZjb2RlY19maW5kX2VuY29kZXIoY29uZmlnLT5kdW1teV92Y3R4LT5jb2RlY19pZCkpOwotICAgICAgICAgICAgICAgIGFkZF9jb2RlYyhzdHJlYW0sIHZpZGVvX2VuYywgY29uZmlnKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhdl9kaWN0X2ZyZWUoJmNvbmZpZy0+dmlkZW9fb3B0cyk7Ci0gICAgICAgIGF2X2RpY3RfZnJlZSgmY29uZmlnLT5hdWRpb19vcHRzKTsKLSAgICAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmNvbmZpZy0+ZHVtbXlfdmN0eCk7Ci0gICAgICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZjb25maWctPmR1bW15X2FjdHgpOwotICAgICAgICAqcHN0cmVhbSA9IE5VTEw7Ci0gICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjbWQsICJGaWxlIikgfHwKLSAgICAgICAgICAgICAgICFhdl9zdHJjYXNlY21wKGNtZCwgIlJlYWRPbmx5RmlsZSIpKSB7Ci0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoc3RyZWFtLT5mZWVkX2ZpbGVuYW1lLCBzaXplb2Yoc3RyZWFtLT5mZWVkX2ZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICBwKTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIlVzZURlZmF1bHRzIikpIHsKLSAgICAgICAgaWYgKGNvbmZpZy0+c3RyZWFtX3VzZV9kZWZhdWx0cyA+IDEpCi0gICAgICAgICAgICBXQVJOSU5HKCJNdWx0aXBsZSBVc2VEZWZhdWx0cy9Ob0RlZmF1bHRzIGVudHJpZXMuXG4iKTsKLSAgICAgICAgY29uZmlnLT5zdHJlYW1fdXNlX2RlZmF1bHRzID0gMzsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIk5vRGVmYXVsdHMiKSkgewotICAgICAgICBpZiAoY29uZmlnLT5zdHJlYW1fdXNlX2RlZmF1bHRzID4gMSkKLSAgICAgICAgICAgIFdBUk5JTkcoIk11bHRpcGxlIFVzZURlZmF1bHRzL05vRGVmYXVsdHMgZW50cmllcy5cbiIpOwotICAgICAgICBjb25maWctPnN0cmVhbV91c2VfZGVmYXVsdHMgPSAyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEVSUk9SKCJJbnZhbGlkIGVudHJ5ICclcycgaW5zaWRlIDxTdHJlYW0+PC9TdHJlYW0+XG4iLCBjbWQpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgbm9tZW06Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk91dCBvZiBtZW1vcnkuIEFib3J0aW5nLlxuIik7Ci0gICAgYXZfZGljdF9mcmVlKCZjb25maWctPnZpZGVvX29wdHMpOwotICAgIGF2X2RpY3RfZnJlZSgmY29uZmlnLT5hdWRpb19vcHRzKTsKLSAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmY29uZmlnLT5kdW1teV92Y3R4KTsKLSAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmY29uZmlnLT5kdW1teV9hY3R4KTsKLSAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotfQotCi1zdGF0aWMgaW50IGZmc2VydmVyX3BhcnNlX2NvbmZpZ19yZWRpcmVjdChGRlNlcnZlckNvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICoqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGU2VydmVyU3RyZWFtICoqcHJlZGlyZWN0KQotewotICAgIEZGU2VydmVyU3RyZWFtICpyZWRpcmVjdDsKLSAgICBhdl9hc3NlcnQwKHByZWRpcmVjdCk7Ci0gICAgcmVkaXJlY3QgPSAqcHJlZGlyZWN0OwotCi0gICAgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIjxSZWRpcmVjdCIpKSB7Ci0gICAgICAgIGNoYXIgKnE7Ci0gICAgICAgIHJlZGlyZWN0ID0gYXZfbWFsbG9jeihzaXplb2YoRkZTZXJ2ZXJTdHJlYW0pKTsKLSAgICAgICAgaWYgKCFyZWRpcmVjdCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhyZWRpcmVjdC0+ZmlsZW5hbWUsIHNpemVvZihyZWRpcmVjdC0+ZmlsZW5hbWUpLCBwKTsKLSAgICAgICAgcSA9IHN0cnJjaHIocmVkaXJlY3QtPmZpbGVuYW1lLCAnPicpOwotICAgICAgICBpZiAoKnEpCi0gICAgICAgICAgICAqcSA9ICdcMCc7Ci0gICAgICAgIHJlZGlyZWN0LT5zdHJlYW1fdHlwZSA9IFNUUkVBTV9UWVBFX1JFRElSRUNUOwotICAgICAgICAqcHJlZGlyZWN0ID0gcmVkaXJlY3Q7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBhdl9hc3NlcnQwKHJlZGlyZWN0KTsKLSAgICBpZiAoIWF2X3N0cmNhc2VjbXAoY21kLCAiVVJMIikpIHsKLSAgICAgICAgZmZzZXJ2ZXJfZ2V0X2FyZyhyZWRpcmVjdC0+ZmVlZF9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICBzaXplb2YocmVkaXJlY3QtPmZlZWRfZmlsZW5hbWUpLCBwKTsKLSAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGNtZCwgIjwvUmVkaXJlY3Q+IikpIHsKLSAgICAgICAgaWYgKCFyZWRpcmVjdC0+ZmVlZF9maWxlbmFtZVswXSkKLSAgICAgICAgICAgIEVSUk9SKCJObyBVUkwgZm91bmQgZm9yIDxSZWRpcmVjdD5cbiIpOwotICAgICAgICAqcHJlZGlyZWN0ID0gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBFUlJPUigiSW52YWxpZCBlbnRyeSAnJXMnIGluc2lkZSA8UmVkaXJlY3Q+PC9SZWRpcmVjdD5cbiIsIGNtZCk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgZmZzZXJ2ZXJfcGFyc2VfZmZjb25maWcoY29uc3QgY2hhciAqZmlsZW5hbWUsIEZGU2VydmVyQ29uZmlnICpjb25maWcpCi17Ci0gICAgRklMRSAqZjsKLSAgICBjaGFyIGxpbmVbMTAyNF07Ci0gICAgY2hhciBjbWRbNjRdOwotICAgIGNvbnN0IGNoYXIgKnA7Ci0gICAgRkZTZXJ2ZXJTdHJlYW0gKipsYXN0X3N0cmVhbSwgKnN0cmVhbSA9IE5VTEwsICpyZWRpcmVjdCA9IE5VTEw7Ci0gICAgRkZTZXJ2ZXJTdHJlYW0gKipsYXN0X2ZlZWQsICpmZWVkID0gTlVMTDsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIGF2X2Fzc2VydDAoY29uZmlnKTsKLQotICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKLSAgICBpZiAoIWYpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBvcGVuIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgJyVzJ1xuIiwgZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGNvbmZpZy0+Zmlyc3Rfc3RyZWFtID0gTlVMTDsKLSAgICBjb25maWctPmZpcnN0X2ZlZWQgPSBOVUxMOwotICAgIGNvbmZpZy0+ZXJyb3JzID0gY29uZmlnLT53YXJuaW5ncyA9IDA7Ci0KLSAgICBsYXN0X3N0cmVhbSA9ICZjb25maWctPmZpcnN0X3N0cmVhbTsKLSAgICBsYXN0X2ZlZWQgPSAmY29uZmlnLT5maXJzdF9mZWVkOwotCi0gICAgY29uZmlnLT5saW5lX251bSA9IDA7Ci0gICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZikgIT0gTlVMTCkgewotICAgICAgICBjb25maWctPmxpbmVfbnVtKys7Ci0gICAgICAgIHAgPSBsaW5lOwotICAgICAgICB3aGlsZSAoYXZfaXNzcGFjZSgqcCkpCi0gICAgICAgICAgICBwKys7Ci0gICAgICAgIGlmICgqcCA9PSAnXDAnIHx8ICpwID09ICcjJykKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGZmc2VydmVyX2dldF9hcmcoY21kLCBzaXplb2YoY21kKSwgJnApOwotCi0gICAgICAgIGlmIChmZWVkIHx8ICFhdl9zdHJjYXNlY21wKGNtZCwgIjxGZWVkIikpIHsKLSAgICAgICAgICAgIGludCBvcGVuaW5nID0gIWF2X3N0cmNhc2VjbXAoY21kLCAiPEZlZWQiKTsKLSAgICAgICAgICAgIGlmIChvcGVuaW5nICYmIChzdHJlYW0gfHwgZmVlZCB8fCByZWRpcmVjdCkpIHsKLSAgICAgICAgICAgICAgICBFUlJPUigiQWxyZWFkeSBpbiBhIHRhZ1xuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCA9IGZmc2VydmVyX3BhcnNlX2NvbmZpZ19mZWVkKGNvbmZpZywgY21kLCAmcCwgJmZlZWQpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZiAob3BlbmluZykgewotICAgICAgICAgICAgICAgICAgICAvKiBhZGQgaW4gc3RyZWFtICYgZmVlZCBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICpsYXN0X3N0cmVhbSA9IGZlZWQ7Ci0gICAgICAgICAgICAgICAgICAgICpsYXN0X2ZlZWQgPSBmZWVkOwotICAgICAgICAgICAgICAgICAgICBsYXN0X3N0cmVhbSA9ICZmZWVkLT5uZXh0OwotICAgICAgICAgICAgICAgICAgICBsYXN0X2ZlZWQgPSAmZmVlZC0+bmV4dF9mZWVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gfHwgIWF2X3N0cmNhc2VjbXAoY21kLCAiPFN0cmVhbSIpKSB7Ci0gICAgICAgICAgICBpbnQgb3BlbmluZyA9ICFhdl9zdHJjYXNlY21wKGNtZCwgIjxTdHJlYW0iKTsKLSAgICAgICAgICAgIGlmIChvcGVuaW5nICYmIChzdHJlYW0gfHwgZmVlZCB8fCByZWRpcmVjdCkpIHsKLSAgICAgICAgICAgICAgICBFUlJPUigiQWxyZWFkeSBpbiBhIHRhZ1xuIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldCA9IGZmc2VydmVyX3BhcnNlX2NvbmZpZ19zdHJlYW0oY29uZmlnLCBjbWQsICZwLCAmc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYWRkIGluIHN0cmVhbSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICpsYXN0X3N0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdF9zdHJlYW0gPSAmc3RyZWFtLT5uZXh0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChyZWRpcmVjdCB8fCAhYXZfc3RyY2FzZWNtcChjbWQsICI8UmVkaXJlY3QiKSkgewotICAgICAgICAgICAgaW50IG9wZW5pbmcgPSAhYXZfc3RyY2FzZWNtcChjbWQsICI8UmVkaXJlY3QiKTsKLSAgICAgICAgICAgIGlmIChvcGVuaW5nICYmIChzdHJlYW0gfHwgZmVlZCB8fCByZWRpcmVjdCkpCi0gICAgICAgICAgICAgICAgRVJST1IoIkFscmVhZHkgaW4gYSB0YWdcbiIpOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gZmZzZXJ2ZXJfcGFyc2VfY29uZmlnX3JlZGlyZWN0KGNvbmZpZywgY21kLCAmcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZGlyZWN0KTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZW5pbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYWRkIGluIHN0cmVhbSBsaXN0ICovCi0gICAgICAgICAgICAgICAgICAgICpsYXN0X3N0cmVhbSA9IHJlZGlyZWN0OwotICAgICAgICAgICAgICAgICAgICBsYXN0X3N0cmVhbSA9ICZyZWRpcmVjdC0+bmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmZnNlcnZlcl9wYXJzZV9jb25maWdfZ2xvYmFsKGNvbmZpZywgY21kLCAmcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHN0cmVhbSB8fCBmZWVkIHx8IHJlZGlyZWN0KQotICAgICAgICBFUlJPUigiTWlzc2luZyBjbG9zaW5nIDwvJXM+IHRhZ1xuIiwKLSAgICAgICAgICAgICAgc3RyZWFtID8gIlN0cmVhbSIgOiAoZmVlZCA/ICJGZWVkIiA6ICJSZWRpcmVjdCIpKTsKLQotICAgIGZjbG9zZShmKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoY29uZmlnLT5lcnJvcnMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gMDsKLX0KLQotI3VuZGVmIEVSUk9SCi0jdW5kZWYgV0FSTklORwotCi12b2lkIGZmc2VydmVyX2ZyZWVfY2hpbGRfYXJncyh2b2lkICphcmdzcCkKLXsKLSAgICBpbnQgaTsKLSAgICBjaGFyICoqYXJnczsKLSAgICBpZiAoIWFyZ3NwKQotICAgICAgICByZXR1cm47Ci0gICAgYXJncyA9ICooY2hhciAqKiopYXJnc3A7Ci0gICAgaWYgKCFhcmdzKQotICAgICAgICByZXR1cm47Ci0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9DSElMRF9BUkdTOyBpKyspCi0gICAgICAgIGF2X2ZyZWUoYXJnc1tpXSk7Ci0gICAgYXZfZnJlZXAoYXJnc3ApOwotfQpkaWZmIC0tZ2l0IGEvZmZzZXJ2ZXJfY29uZmlnLmggYi9mZnNlcnZlcl9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxMjE5NC4uMDAwMDAwMAotLS0gYS9mZnNlcnZlcl9jb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZuZGVmIEZGU0VSVkVSX0NPTkZJR19ICi0jZGVmaW5lIEZGU0VSVkVSX0NPTkZJR19ICi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgotI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvbmV0d29yay5oIgotCi0jZGVmaW5lIEZGU0VSVkVSX01BWF9TVFJFQU1TIDIwCi0KLS8qIGVhY2ggZ2VuZXJhdGVkIHN0cmVhbSBpcyBkZXNjcmliZWQgaGVyZSAqLwotZW51bSBGRlNlcnZlclN0cmVhbVR5cGUgewotICAgIFNUUkVBTV9UWVBFX0xJVkUsCi0gICAgU1RSRUFNX1RZUEVfU1RBVFVTLAotICAgIFNUUkVBTV9UWVBFX1JFRElSRUNULAotfTsKLQotZW51bSBGRlNlcnZlcklQQWRkcmVzc0FjdGlvbiB7Ci0gICAgSVBfQUxMT1cgPSAxLAotICAgIElQX0RFTlksCi19OwotCi10eXBlZGVmIHN0cnVjdCBGRlNlcnZlcklQQWRkcmVzc0FDTCB7Ci0gICAgc3RydWN0IEZGU2VydmVySVBBZGRyZXNzQUNMICpuZXh0OwotICAgIGVudW0gRkZTZXJ2ZXJJUEFkZHJlc3NBY3Rpb24gYWN0aW9uOwotICAgIC8qIFRoZXNlIGFyZSBpbiBob3N0IG9yZGVyICovCi0gICAgc3RydWN0IGluX2FkZHIgZmlyc3Q7Ci0gICAgc3RydWN0IGluX2FkZHIgbGFzdDsKLX0gRkZTZXJ2ZXJJUEFkZHJlc3NBQ0w7Ci0KLS8qIGRlc2NyaXB0aW9uIG9mIGVhY2ggc3RyZWFtIG9mIHRoZSBmZnNlcnZlci5jb25mIGZpbGUgKi8KLXR5cGVkZWYgc3RydWN0IEZGU2VydmVyU3RyZWFtIHsKLSAgICBlbnVtIEZGU2VydmVyU3RyZWFtVHlwZSBzdHJlYW1fdHlwZTsKLSAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOyAgICAgICAgICAvKiBzdHJlYW0gZmlsZW5hbWUgKi8KLSAgICBzdHJ1Y3QgRkZTZXJ2ZXJTdHJlYW0gKmZlZWQ7ICAvKiBmZWVkIHdlIGFyZSB1c2luZyAoY2FuIGJlIG51bGwgaWYgY29taW5nIGZyb20gZmlsZSkgKi8KLSAgICBBVkRpY3Rpb25hcnkgKmluX29wdHM7ICAgICAgICAvKiBpbnB1dCBwYXJhbWV0ZXJzICovCi0gICAgQVZEaWN0aW9uYXJ5ICptZXRhZGF0YTsgICAgICAgLyogbWV0YWRhdGEgdG8gc2V0IG9uIHRoZSBzdHJlYW0gKi8KLSAgICBBVklucHV0Rm9ybWF0ICppZm10OyAgICAgICAgICAvKiBpZiBub24gTlVMTCwgZm9yY2UgaW5wdXQgZm9ybWF0ICovCi0gICAgQVZPdXRwdXRGb3JtYXQgKmZtdDsKLSAgICBGRlNlcnZlcklQQWRkcmVzc0FDTCAqYWNsOwotICAgIGNoYXIgZHluYW1pY19hY2xbMTAyNF07Ci0gICAgaW50IG5iX3N0cmVhbXM7Ci0gICAgaW50IHByZWJ1ZmZlcjsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBlYXJseSB0byBzdGFydCAqLwotICAgIGludDY0X3QgbWF4X3RpbWU7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gcnVuICovCi0gICAgaW50IHNlbmRfb25fa2V5OwotICAgIEFWU3RyZWFtICpzdHJlYW1zW0ZGU0VSVkVSX01BWF9TVFJFQU1TXTsKLSAgICBpbnQgZmVlZF9zdHJlYW1zW0ZGU0VSVkVSX01BWF9TVFJFQU1TXTsgLyogaW5kZXggb2Ygc3RyZWFtcyBpbiB0aGUgZmVlZCAqLwotICAgIGNoYXIgZmVlZF9maWxlbmFtZVsxMDI0XTsgICAgIC8qIGZpbGUgbmFtZSBvZiB0aGUgZmVlZCBzdG9yYWdlLCBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGZpbGUgbmFtZSBmb3IgYSBzdHJlYW0gKi8KLSAgICBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAvKiBPZiBmZm1wZWcgcHJvY2VzcyAqLwotICAgIHRpbWVfdCBwaWRfc3RhcnQ7ICAgICAgICAgICAgIC8qIE9mIGZmbXBlZyBwcm9jZXNzICovCi0gICAgY2hhciAqKmNoaWxkX2FyZ3Y7Ci0gICAgc3RydWN0IEZGU2VydmVyU3RyZWFtICpuZXh0OwotICAgIHVuc2lnbmVkIGJhbmR3aWR0aDsgICAgICAgICAgIC8qIGJhbmR3aWR0aCwgaW4ga2JpdHMvcyAqLwotICAgIC8qIFJUU1Agb3B0aW9ucyAqLwotICAgIGNoYXIgKnJ0c3Bfb3B0aW9uOwotICAgIC8qIG11bHRpY2FzdCBzcGVjaWZpYyAqLwotICAgIGludCBpc19tdWx0aWNhc3Q7Ci0gICAgc3RydWN0IGluX2FkZHIgbXVsdGljYXN0X2lwOwotICAgIGludCBtdWx0aWNhc3RfcG9ydDsgICAgICAgICAgIC8qIGZpcnN0IHBvcnQgdXNlZCBmb3IgbXVsdGljYXN0ICovCi0gICAgaW50IG11bHRpY2FzdF90dGw7Ci0gICAgaW50IGxvb3A7ICAgICAgICAgICAgICAgICAgICAgLyogaWYgdHJ1ZSwgc2VuZCB0aGUgc3RyZWFtIGluIGxvb3BzIChvbmx5IG1lYW5pbmdmdWwgaWYgZmlsZSkgKi8KLSAgICBjaGFyIHNpbmdsZV9mcmFtZTsgICAgICAgICAgICAvKiBvbmx5IHNpbmdsZSBmcmFtZSAqLwotCi0gICAgLyogZmVlZCBzcGVjaWZpYyAqLwotICAgIGludCBmZWVkX29wZW5lZDsgICAgICAgICAgICAgIC8qIHRydWUgaWYgc29tZW9uZSBpcyB3cml0aW5nIHRvIHRoZSBmZWVkICovCi0gICAgaW50IGlzX2ZlZWQ7ICAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBpdCBpcyBhIGZlZWQgKi8KLSAgICBpbnQgcmVhZG9ubHk7ICAgICAgICAgICAgICAgICAvKiBUcnVlIGlmIHdyaXRpbmcgaXMgcHJvaGliaXRlZCB0byB0aGUgZmlsZSAqLwotICAgIGludCB0cnVuY2F0ZTsgICAgICAgICAgICAgICAgIC8qIFRydWUgaWYgZmVlZGVyIGNvbm5lY3Rpb24gdHJ1bmNhdGUgdGhlIGZlZWQgZmlsZSAqLwotICAgIGludCBjb25uc19zZXJ2ZWQ7Ci0gICAgaW50NjRfdCBieXRlc19zZXJ2ZWQ7Ci0gICAgaW50NjRfdCBmZWVkX21heF9zaXplOyAgICAgICAgLyogbWF4aW11bSBzdG9yYWdlIHNpemUsIHplcm8gbWVhbnMgdW5saW1pdGVkICovCi0gICAgaW50NjRfdCBmZWVkX3dyaXRlX2luZGV4OyAgICAgLyogY3VycmVudCB3cml0ZSBwb3NpdGlvbiBpbiBmZWVkIChpdCB3cmFwcyBhcm91bmQpICovCi0gICAgaW50NjRfdCBmZWVkX3NpemU7ICAgICAgICAgICAgLyogY3VycmVudCBzaXplIG9mIGZlZWQgKi8KLSAgICBzdHJ1Y3QgRkZTZXJ2ZXJTdHJlYW0gKm5leHRfZmVlZDsKLX0gRkZTZXJ2ZXJTdHJlYW07Ci0KLXR5cGVkZWYgc3RydWN0IEZGU2VydmVyQ29uZmlnIHsKLSAgICBjaGFyICpmaWxlbmFtZTsKLSAgICBGRlNlcnZlclN0cmVhbSAqZmlyc3RfZmVlZDsgICAvKiBjb250YWlucyBvbmx5IGZlZWRzICovCi0gICAgRkZTZXJ2ZXJTdHJlYW0gKmZpcnN0X3N0cmVhbTsgLyogY29udGFpbnMgYWxsIHN0cmVhbXMsIGluY2x1ZGluZyBmZWVkcyAqLwotICAgIHVuc2lnbmVkIGludCBuYl9tYXhfaHR0cF9jb25uZWN0aW9uczsKLSAgICB1bnNpZ25lZCBpbnQgbmJfbWF4X2Nvbm5lY3Rpb25zOwotICAgIHVpbnQ2NF90IG1heF9iYW5kd2lkdGg7Ci0gICAgaW50IGRlYnVnOwotICAgIGNoYXIgbG9nZmlsZW5hbWVbMTAyNF07Ci0gICAgc3RydWN0IHNvY2thZGRyX2luIGh0dHBfYWRkcjsKLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcnRzcF9hZGRyOwotICAgIGludCBlcnJvcnM7Ci0gICAgaW50IHdhcm5pbmdzOwotICAgIGludCB1c2VfZGVmYXVsdHM7Ci0gICAgLy8gRm9sbG93aW5nIHZhcmlhYmxlcyBNVVNUIE5PVCBiZSB1c2VkIG91dHNpZGUgY29uZmlndXJhdGlvbiBwYXJzaW5nIGNvZGUuCi0gICAgZW51bSBBVkNvZGVjSUQgZ3Vlc3NlZF9hdWRpb19jb2RlY19pZDsKLSAgICBlbnVtIEFWQ29kZWNJRCBndWVzc2VkX3ZpZGVvX2NvZGVjX2lkOwotICAgIEFWRGljdGlvbmFyeSAqdmlkZW9fb3B0czsgICAgIC8qIEFWT3B0aW9ucyBmb3IgdmlkZW8gZW5jb2RlciAqLwotICAgIEFWRGljdGlvbmFyeSAqYXVkaW9fb3B0czsgICAgIC8qIEFWT3B0aW9ucyBmb3IgYXVkaW8gZW5jb2RlciAqLwotICAgIEFWQ29kZWNDb250ZXh0ICpkdW1teV9hY3R4OyAgIC8qIFVzZWQgaW50ZXJuYWxseSB0byB0ZXN0IGF1ZGlvIEFWT3B0aW9ucy4gKi8KLSAgICBBVkNvZGVjQ29udGV4dCAqZHVtbXlfdmN0eDsgICAvKiBVc2VkIGludGVybmFsbHkgdG8gdGVzdCB2aWRlbyBBVk9wdGlvbnMuICovCi0gICAgaW50IG5vX2F1ZGlvOwotICAgIGludCBub192aWRlbzsKLSAgICBpbnQgbGluZV9udW07Ci0gICAgaW50IHN0cmVhbV91c2VfZGVmYXVsdHM7Ci19IEZGU2VydmVyQ29uZmlnOwotCi12b2lkIGZmc2VydmVyX2dldF9hcmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKipwcCk7Ci0KLXZvaWQgZmZzZXJ2ZXJfcGFyc2VfYWNsX3JvdyhGRlNlcnZlclN0cmVhbSAqc3RyZWFtLCBGRlNlcnZlclN0cmVhbSogZmVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRlNlcnZlcklQQWRkcmVzc0FDTCAqZXh0X2FjbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGxpbmVfbnVtKTsKLQotaW50IGZmc2VydmVyX3BhcnNlX2ZmY29uZmlnKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBGRlNlcnZlckNvbmZpZyAqY29uZmlnKTsKLQotdm9pZCBmZnNlcnZlcl9mcmVlX2NoaWxkX2FyZ3Modm9pZCAqYXJnc3ApOwotCi0jZW5kaWYgLyogRkZTRVJWRVJfQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL2ZmdG9vbHMvTWFrZWZpbGUgYi9mZnRvb2xzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTBmZjMKLS0tIC9kZXYvbnVsbAorKysgYi9mZnRvb2xzL01ha2VmaWxlCkBAIC0wLDAgKzEsNTQgQEAKK0FWUFJPR1MtJChDT05GSUdfRkZNUEVHKSAgICs9IGZmbXBlZworQVZQUk9HUy0kKENPTkZJR19GRlBMQVkpICAgKz0gZmZwbGF5CitBVlBST0dTLSQoQ09ORklHX0ZGUFJPQkUpICArPSBmZnByb2JlCisKK0FWUFJPR1MgICAgIDo9ICQoQVZQUk9HUy15ZXM6JT0lJChQUk9HU1NVRikkKEVYRVNVRikpCitQUk9HUyAgICAgICArPSAkKEFWUFJPR1MpCisKK0FWQkFTRU5BTUVTICA9IGZmbXBlZyBmZnBsYXkgZmZwcm9iZQorQUxMQVZQUk9HUyAgID0gJChBVkJBU0VOQU1FUzolPSUkKFBST0dTU1VGKSQoRVhFU1VGKSkKK0FMTEFWUFJPR1NfRyA9ICQoQVZCQVNFTkFNRVM6JT0lJChQUk9HU1NVRilfZyQoRVhFU1VGKSkKKworT0JKUy1mZm1wZWcgICAgICAgICAgICAgICAgICAgICAgICArPSBmZnRvb2xzL2ZmbXBlZ19vcHQubyBmZnRvb2xzL2ZmbXBlZ19maWx0ZXIubyBmZnRvb2xzL2ZmbXBlZ19ody5vCitPQkpTLWZmbXBlZy0kKENPTkZJR19DVVZJRCkgICAgICAgICs9IGZmdG9vbHMvZmZtcGVnX2N1dmlkLm8KK09CSlMtZmZtcGVnLSQoQ09ORklHX0xJQk1GWCkgICAgICAgKz0gZmZ0b29scy9mZm1wZWdfcXN2Lm8KK2lmbmRlZiBDT05GSUdfVklERU9UT09MQk9YCitPQkpTLWZmbXBlZy0kKENPTkZJR19WREEpICAgICAgICAgICs9IGZmdG9vbHMvZmZtcGVnX3ZpZGVvdG9vbGJveC5vCitlbmRpZgorT0JKUy1mZm1wZWctJChDT05GSUdfVklERU9UT09MQk9YKSArPSBmZnRvb2xzL2ZmbXBlZ192aWRlb3Rvb2xib3gubworCitkZWZpbmUgRE9GRlRPT0wKK09CSlMtJCgxKSArPSBmZnRvb2xzL2NtZHV0aWxzLm8gZmZ0b29scy8kKDEpLm8gJChPQkpTLSQoMSkteWVzKQorJCgxKSQoUFJPR1NTVUYpX2ckKEVYRVNVRik6ICQkKE9CSlMtJCgxKSkKKyQkKE9CSlMtJCgxKSk6IHwgZmZ0b29scworJCQoT0JKUy0kKDEpKTogQ0ZMQUdTICArPSAkKENGTEFHUy0kKDEpKQorJCgxKSQoUFJPR1NTVUYpX2ckKEVYRVNVRik6IExERkxBR1MgKz0gJChMREZMQUdTLSQoMSkpCiskKDEpJChQUk9HU1NVRilfZyQoRVhFU1VGKTogRkZfRVhUUkFMSUJTICs9ICQoRVhUUkFMSUJTLSQoMSkpCistaW5jbHVkZSAkJChPQkpTLSQoMSk6Lm89LmQpCitlbmRlZgorCiskKGZvcmVhY2ggUCwkKEFWUFJPR1MteWVzKSwkKGV2YWwgJChjYWxsIERPRkZUT09MLCQoUCkpKSkKKworYWxsOiAkKEFWUFJPR1MpCisKK2ZmdG9vbHMvZmZwcm9iZS5vIGZmdG9vbHMvY21kdXRpbHMubzogbGliYXZ1dGlsL2ZmdmVyc2lvbi5oIHwgZmZ0b29scworT0JKRElSUyArPSBmZnRvb2xzCisKK2lmZGVmIEFWUFJPR1MKK2luc3RhbGw6IGluc3RhbGwtcHJvZ3MgaW5zdGFsbC1kYXRhCitlbmRpZgorCitpbnN0YWxsLXByb2dzLXllczoKK2luc3RhbGwtcHJvZ3MtJChDT05GSUdfU0hBUkVEKTogaW5zdGFsbC1saWJzCisKK2luc3RhbGwtcHJvZ3M6IGluc3RhbGwtcHJvZ3MteWVzICQoQVZQUk9HUykKKwkkKFEpbWtkaXIgLXAgIiQoQklORElSKSIKKwkkKElOU1RBTEwpIC1jIC1tIDc1NSAkKEFWUFJPR1MpICIkKEJJTkRJUikiCisKK3VuaW5zdGFsbDogdW5pbnN0YWxsLXByb2dzCisKK3VuaW5zdGFsbC1wcm9nczoKKwkkKFJNKSAkKGFkZHByZWZpeCAiJChCSU5ESVIpLyIsICQoQUxMQVZQUk9HUykpCisKK2NsZWFuOjoKKwkkKFJNKSAkKEFMTEFWUFJPR1MpICQoQUxMQVZQUk9HU19HKSAkKENMRUFOU1VGRklYRVM6JT1mZnRvb2xzLyUpCmRpZmYgLS1naXQgYS9mZnRvb2xzL2NtZHV0aWxzLmMgYi9mZnRvb2xzL2NtZHV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmYzlkMgotLS0gL2Rldi9udWxsCisrKyBiL2ZmdG9vbHMvY21kdXRpbHMuYwpAQCAtMCwwICsxLDIzMjcgQEAKKy8qCisgKiBWYXJpb3VzIHV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIHRvb2xzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisvKiBJbmNsdWRlIG9ubHkgdGhlIGVuYWJsZWQgaGVhZGVycyBzaW5jZSBzb21lIGNvbXBpbGVycyAobmFtZWx5LCBTdW4KKyAgIFN0dWRpbykgd2lsbCBub3Qgb21pdCB1bnVzZWQgaW5saW5lIGZ1bmN0aW9ucyBhbmQgY3JlYXRlIHVuZGVmaW5lZAorICAgcmVmZXJlbmNlcyB0byBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGJlaW5nIGJ1aWx0LiAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiY29tcGF0L3ZhX2NvcHkuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2F2ZmlsdGVyLmgiCisjaW5jbHVkZSAibGliYXZkZXZpY2UvYXZkZXZpY2UuaCIKKyNpbmNsdWRlICJsaWJhdnJlc2FtcGxlL2F2cmVzYW1wbGUuaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGUuaCIKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaCIKKyNpbmNsdWRlICJsaWJwb3N0cHJvYy9wb3N0cHJvY2Vzcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaXNwbGF5LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmdmVyc2lvbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC92ZXJzaW9uLmgiCisjaW5jbHVkZSAiY21kdXRpbHMuaCIKKyNpZiBDT05GSUdfTkVUV09SSworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L25ldHdvcmsuaCIKKyNlbmRpZgorI2lmIEhBVkVfU1lTX1JFU09VUkNFX0gKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2VuZGlmCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdF9yZXBvcnQoY29uc3QgY2hhciAqZW52KTsKKworQVZEaWN0aW9uYXJ5ICpzd3NfZGljdDsKK0FWRGljdGlvbmFyeSAqc3dyX29wdHM7CitBVkRpY3Rpb25hcnkgKmZvcm1hdF9vcHRzLCAqY29kZWNfb3B0cywgKnJlc2FtcGxlX29wdHM7CisKK3N0YXRpYyBGSUxFICpyZXBvcnRfZmlsZTsKK3N0YXRpYyBpbnQgcmVwb3J0X2ZpbGVfbGV2ZWwgPSBBVl9MT0dfREVCVUc7CitpbnQgaGlkZV9iYW5uZXIgPSAwOworCitlbnVtIHNob3dfbXV4ZGVtdXhlcnMgeworICAgIFNIT1dfREVGQVVMVCwKKyAgICBTSE9XX0RFTVVYRVJTLAorICAgIFNIT1dfTVVYRVJTLAorfTsKKwordm9pZCBpbml0X29wdHModm9pZCkKK3sKKyAgICBhdl9kaWN0X3NldCgmc3dzX2RpY3QsICJmbGFncyIsICJiaWN1YmljIiwgMCk7Cit9CisKK3ZvaWQgdW5pbml0X29wdHModm9pZCkKK3sKKyAgICBhdl9kaWN0X2ZyZWUoJnN3cl9vcHRzKTsKKyAgICBhdl9kaWN0X2ZyZWUoJnN3c19kaWN0KTsKKyAgICBhdl9kaWN0X2ZyZWUoJmZvcm1hdF9vcHRzKTsKKyAgICBhdl9kaWN0X2ZyZWUoJmNvZGVjX29wdHMpOworICAgIGF2X2RpY3RfZnJlZSgmcmVzYW1wbGVfb3B0cyk7Cit9CisKK3ZvaWQgbG9nX2NhbGxiYWNrX2hlbHAodm9pZCAqcHRyLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2bCkKK3sKKyAgICB2ZnByaW50ZihzdGRvdXQsIGZtdCwgdmwpOworfQorCitzdGF0aWMgdm9pZCBsb2dfY2FsbGJhY2tfcmVwb3J0KHZvaWQgKnB0ciwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmwpCit7CisgICAgdmFfbGlzdCB2bDI7CisgICAgY2hhciBsaW5lWzEwMjRdOworICAgIHN0YXRpYyBpbnQgcHJpbnRfcHJlZml4ID0gMTsKKworICAgIHZhX2NvcHkodmwyLCB2bCk7CisgICAgYXZfbG9nX2RlZmF1bHRfY2FsbGJhY2socHRyLCBsZXZlbCwgZm10LCB2bCk7CisgICAgYXZfbG9nX2Zvcm1hdF9saW5lKHB0ciwgbGV2ZWwsIGZtdCwgdmwyLCBsaW5lLCBzaXplb2YobGluZSksICZwcmludF9wcmVmaXgpOworICAgIHZhX2VuZCh2bDIpOworICAgIGlmIChyZXBvcnRfZmlsZV9sZXZlbCA+PSBsZXZlbCkgeworICAgICAgICBmcHV0cyhsaW5lLCByZXBvcnRfZmlsZSk7CisgICAgICAgIGZmbHVzaChyZXBvcnRfZmlsZSk7CisgICAgfQorfQorCit2b2lkIGluaXRfZHlubG9hZCh2b2lkKQoreworI2lmZGVmIF9XSU4zMgorICAgIC8qIENhbGxpbmcgU2V0RGxsRGlyZWN0b3J5IHdpdGggdGhlIGVtcHR5IHN0cmluZyAoYnV0IG5vdCBOVUxMKSByZW1vdmVzIHRoZQorICAgICAqIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgZnJvbSB0aGUgRExMIHNlYXJjaCBwYXRoIGFzIGEgc2VjdXJpdHkgcHJlLWNhdXRpb24uICovCisgICAgU2V0RGxsRGlyZWN0b3J5KCIiKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCAoKnByb2dyYW1fZXhpdCkoaW50IHJldCk7CisKK3ZvaWQgcmVnaXN0ZXJfZXhpdCh2b2lkICgqY2IpKGludCByZXQpKQoreworICAgIHByb2dyYW1fZXhpdCA9IGNiOworfQorCit2b2lkIGV4aXRfcHJvZ3JhbShpbnQgcmV0KQoreworICAgIGlmIChwcm9ncmFtX2V4aXQpCisgICAgICAgIHByb2dyYW1fZXhpdChyZXQpOworCisgICAgZXhpdChyZXQpOworfQorCitkb3VibGUgcGFyc2VfbnVtYmVyX29yX2RpZShjb25zdCBjaGFyICpjb250ZXh0LCBjb25zdCBjaGFyICpudW1zdHIsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbiwgZG91YmxlIG1heCkKK3sKKyAgICBjaGFyICp0YWlsOworICAgIGNvbnN0IGNoYXIgKmVycm9yOworICAgIGRvdWJsZSBkID0gYXZfc3RydG9kKG51bXN0ciwgJnRhaWwpOworICAgIGlmICgqdGFpbCkKKyAgICAgICAgZXJyb3IgPSAiRXhwZWN0ZWQgbnVtYmVyIGZvciAlcyBidXQgZm91bmQ6ICVzXG4iOworICAgIGVsc2UgaWYgKGQgPCBtaW4gfHwgZCA+IG1heCkKKyAgICAgICAgZXJyb3IgPSAiVGhlIHZhbHVlIGZvciAlcyB3YXMgJXMgd2hpY2ggaXMgbm90IHdpdGhpbiAlZiAtICVmXG4iOworICAgIGVsc2UgaWYgKHR5cGUgPT0gT1BUX0lOVDY0ICYmIChpbnQ2NF90KWQgIT0gZCkKKyAgICAgICAgZXJyb3IgPSAiRXhwZWN0ZWQgaW50NjQgZm9yICVzIGJ1dCBmb3VuZCAlc1xuIjsKKyAgICBlbHNlIGlmICh0eXBlID09IE9QVF9JTlQgJiYgKGludClkICE9IGQpCisgICAgICAgIGVycm9yID0gIkV4cGVjdGVkIGludCBmb3IgJXMgYnV0IGZvdW5kICVzXG4iOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGQ7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgZXJyb3IsIGNvbnRleHQsIG51bXN0ciwgbWluLCBtYXgpOworICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50NjRfdCBwYXJzZV90aW1lX29yX2RpZShjb25zdCBjaGFyICpjb250ZXh0LCBjb25zdCBjaGFyICp0aW1lc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfZHVyYXRpb24pCit7CisgICAgaW50NjRfdCB1czsKKyAgICBpZiAoYXZfcGFyc2VfdGltZSgmdXMsIHRpbWVzdHIsIGlzX2R1cmF0aW9uKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgJXMgc3BlY2lmaWNhdGlvbiBmb3IgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgaXNfZHVyYXRpb24gPyAiZHVyYXRpb24iIDogImRhdGUiLCBjb250ZXh0LCB0aW1lc3RyKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKyAgICByZXR1cm4gdXM7Cit9CisKK3ZvaWQgc2hvd19oZWxwX29wdGlvbnMoY29uc3QgT3B0aW9uRGVmICpvcHRpb25zLCBjb25zdCBjaGFyICptc2csIGludCByZXFfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGludCByZWpfZmxhZ3MsIGludCBhbHRfZmxhZ3MpCit7CisgICAgY29uc3QgT3B0aW9uRGVmICpwbzsKKyAgICBpbnQgZmlyc3Q7CisKKyAgICBmaXJzdCA9IDE7CisgICAgZm9yIChwbyA9IG9wdGlvbnM7IHBvLT5uYW1lOyBwbysrKSB7CisgICAgICAgIGNoYXIgYnVmWzY0XTsKKworICAgICAgICBpZiAoKChwby0+ZmxhZ3MgJiByZXFfZmxhZ3MpICE9IHJlcV9mbGFncykgfHwKKyAgICAgICAgICAgIChhbHRfZmxhZ3MgJiYgIShwby0+ZmxhZ3MgJiBhbHRfZmxhZ3MpKSB8fAorICAgICAgICAgICAgKHBvLT5mbGFncyAmIHJlal9mbGFncykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIG1zZyk7CisgICAgICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYXZfc3RybGNweShidWYsIHBvLT5uYW1lLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGlmIChwby0+YXJnbmFtZSkgeworICAgICAgICAgICAgYXZfc3RybGNhdChidWYsICIgIiwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgYXZfc3RybGNhdChidWYsIHBvLT5hcmduYW1lLCBzaXplb2YoYnVmKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCItJS0xN3MgICVzXG4iLCBidWYsIHBvLT5oZWxwKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworfQorCit2b2lkIHNob3dfaGVscF9jaGlsZHJlbihjb25zdCBBVkNsYXNzICpjbGFzcywgaW50IGZsYWdzKQoreworICAgIGNvbnN0IEFWQ2xhc3MgKmNoaWxkID0gTlVMTDsKKyAgICBpZiAoY2xhc3MtPm9wdGlvbikgeworICAgICAgICBhdl9vcHRfc2hvdzIoJmNsYXNzLCBOVUxMLCBmbGFncywgMCk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisKKyAgICB3aGlsZSAoY2hpbGQgPSBhdl9vcHRfY2hpbGRfY2xhc3NfbmV4dChjbGFzcywgY2hpbGQpKQorICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oY2hpbGQsIGZsYWdzKTsKK30KKworc3RhdGljIGNvbnN0IE9wdGlvbkRlZiAqZmluZF9vcHRpb24oY29uc3QgT3B0aW9uRGVmICpwbywgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpwID0gc3RyY2hyKG5hbWUsICc6Jyk7CisgICAgaW50IGxlbiA9IHAgPyBwIC0gbmFtZSA6IHN0cmxlbihuYW1lKTsKKworICAgIHdoaWxlIChwby0+bmFtZSkgeworICAgICAgICBpZiAoIXN0cm5jbXAobmFtZSwgcG8tPm5hbWUsIGxlbikgJiYgc3RybGVuKHBvLT5uYW1lKSA9PSBsZW4pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcG8rKzsKKyAgICB9CisgICAgcmV0dXJuIHBvOworfQorCisvKiBfV0lOMzIgbWVhbnMgdXNpbmcgdGhlIHdpbmRvd3MgbGliYyAtIGN5Z3dpbiBkb2Vzbid0IGRlZmluZSB0aGF0CisgKiBieSBkZWZhdWx0LiBIQVZFX0NPTU1BTkRMSU5FVE9BUkdWVyBpcyB0cnVlIG9uIGN5Z3dpbiwgd2hpbGUKKyAqIGl0IGRvZXNuJ3QgcHJvdmlkZSB0aGUgYWN0dWFsIGNvbW1hbmQgbGluZSB2aWEgR2V0Q29tbWFuZExpbmVXKCkuICovCisjaWYgSEFWRV9DT01NQU5ETElORVRPQVJHVlcgJiYgZGVmaW5lZChfV0lOMzIpCisjaW5jbHVkZSA8c2hlbGxhcGkuaD4KKy8qIFdpbGwgYmUgbGVha2VkIG9uIGV4aXQgKi8KK3N0YXRpYyBjaGFyKiogd2luMzJfYXJndl91dGY4ID0gTlVMTDsKK3N0YXRpYyBpbnQgd2luMzJfYXJnYyA9IDA7CisKKy8qKgorICogUHJlcGFyZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBleGVjdXRhYmxlLgorICogRm9yIFdpbmRvd3MgLSBwZXJmb3JtIHdpZGUtY2hhciB0byBVVEYtOCBjb252ZXJzaW9uLgorICogSW5wdXQgYXJndW1lbnRzIHNob3VsZCBiZSBtYWluKCkgZnVuY3Rpb24gYXJndW1lbnRzLgorICogQHBhcmFtIGFyZ2NfcHRyIEFyZ3VtZW50cyBudW1iZXIgKGluY2x1ZGluZyBleGVjdXRhYmxlKQorICogQHBhcmFtIGFyZ3ZfcHRyIEFyZ3VtZW50cyBsaXN0LgorICovCitzdGF0aWMgdm9pZCBwcmVwYXJlX2FwcF9hcmd1bWVudHMoaW50ICphcmdjX3B0ciwgY2hhciAqKiphcmd2X3B0cikKK3sKKyAgICBjaGFyICphcmdzdHJfZmxhdDsKKyAgICB3Y2hhcl90ICoqYXJndl93OworICAgIGludCBpLCBidWZmc2l6ZSA9IDAsIG9mZnNldCA9IDA7CisKKyAgICBpZiAod2luMzJfYXJndl91dGY4KSB7CisgICAgICAgICphcmdjX3B0ciA9IHdpbjMyX2FyZ2M7CisgICAgICAgICphcmd2X3B0ciA9IHdpbjMyX2FyZ3ZfdXRmODsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdpbjMyX2FyZ2MgPSAwOworICAgIGFyZ3ZfdyA9IENvbW1hbmRMaW5lVG9Bcmd2VyhHZXRDb21tYW5kTGluZVcoKSwgJndpbjMyX2FyZ2MpOworICAgIGlmICh3aW4zMl9hcmdjIDw9IDAgfHwgIWFyZ3ZfdykKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogZGV0ZXJtaW5lIHRoZSBVVEYtOCBidWZmZXIgc2l6ZSAoaW5jbHVkaW5nIE5VTEwtdGVybWluYXRpb24gc3ltYm9scykgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgd2luMzJfYXJnYzsgaSsrKQorICAgICAgICBidWZmc2l6ZSArPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIGFyZ3Zfd1tpXSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisKKyAgICB3aW4zMl9hcmd2X3V0ZjggPSBhdl9tYWxsb2N6KHNpemVvZihjaGFyICopICogKHdpbjMyX2FyZ2MgKyAxKSArIGJ1ZmZzaXplKTsKKyAgICBhcmdzdHJfZmxhdCAgICAgPSAoY2hhciAqKXdpbjMyX2FyZ3ZfdXRmOCArIHNpemVvZihjaGFyICopICogKHdpbjMyX2FyZ2MgKyAxKTsKKyAgICBpZiAoIXdpbjMyX2FyZ3ZfdXRmOCkgeworICAgICAgICBMb2NhbEZyZWUoYXJndl93KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCB3aW4zMl9hcmdjOyBpKyspIHsKKyAgICAgICAgd2luMzJfYXJndl91dGY4W2ldID0gJmFyZ3N0cl9mbGF0W29mZnNldF07CisgICAgICAgIG9mZnNldCArPSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX1VURjgsIDAsIGFyZ3Zfd1tpXSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhcmdzdHJfZmxhdFtvZmZzZXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmc2l6ZSAtIG9mZnNldCwgTlVMTCwgTlVMTCk7CisgICAgfQorICAgIHdpbjMyX2FyZ3ZfdXRmOFtpXSA9IE5VTEw7CisgICAgTG9jYWxGcmVlKGFyZ3Zfdyk7CisKKyAgICAqYXJnY19wdHIgPSB3aW4zMl9hcmdjOworICAgICphcmd2X3B0ciA9IHdpbjMyX2FyZ3ZfdXRmODsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9hcHBfYXJndW1lbnRzKGludCAqYXJnY19wdHIsIGNoYXIgKioqYXJndl9wdHIpCit7CisgICAgLyogbm90aGluZyB0byBkbyAqLworfQorI2VuZGlmIC8qIEhBVkVfQ09NTUFORExJTkVUT0FSR1ZXICovCisKK3N0YXRpYyBpbnQgd3JpdGVfb3B0aW9uKHZvaWQgKm9wdGN0eCwgY29uc3QgT3B0aW9uRGVmICpwbywgY29uc3QgY2hhciAqb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnKQoreworICAgIC8qIG5ldy1zdHlsZSBvcHRpb25zIGNvbnRhaW4gYW4gb2Zmc2V0IGludG8gb3B0Y3R4LCBvbGQtc3R5bGUgYWRkcmVzcyBvZgorICAgICAqIGEgZ2xvYmFsIHZhciovCisgICAgdm9pZCAqZHN0ID0gcG8tPmZsYWdzICYgKE9QVF9PRkZTRVQgfCBPUFRfU1BFQykgPworICAgICAgICAgICAgICAgICh1aW50OF90ICopb3B0Y3R4ICsgcG8tPnUub2ZmIDogcG8tPnUuZHN0X3B0cjsKKyAgICBpbnQgKmRzdGNvdW50OworCisgICAgaWYgKHBvLT5mbGFncyAmIE9QVF9TUEVDKSB7CisgICAgICAgIFNwZWNpZmllck9wdCAqKnNvID0gZHN0OworICAgICAgICBjaGFyICpwID0gc3RyY2hyKG9wdCwgJzonKTsKKyAgICAgICAgY2hhciAqc3RyOworCisgICAgICAgIGRzdGNvdW50ID0gKGludCAqKShzbyArIDEpOworICAgICAgICAqc28gPSBncm93X2FycmF5KCpzbywgc2l6ZW9mKCoqc28pLCBkc3Rjb3VudCwgKmRzdGNvdW50ICsgMSk7CisgICAgICAgIHN0ciA9IGF2X3N0cmR1cChwID8gcCArIDEgOiAiIik7CisgICAgICAgIGlmICghc3RyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgKCpzbylbKmRzdGNvdW50IC0gMV0uc3BlY2lmaWVyID0gc3RyOworICAgICAgICBkc3QgPSAmKCpzbylbKmRzdGNvdW50IC0gMV0udTsKKyAgICB9CisKKyAgICBpZiAocG8tPmZsYWdzICYgT1BUX1NUUklORykgeworICAgICAgICBjaGFyICpzdHI7CisgICAgICAgIHN0ciA9IGF2X3N0cmR1cChhcmcpOworICAgICAgICBhdl9mcmVlcChkc3QpOworICAgICAgICBpZiAoIXN0cikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICooY2hhciAqKilkc3QgPSBzdHI7CisgICAgfSBlbHNlIGlmIChwby0+ZmxhZ3MgJiBPUFRfQk9PTCB8fCBwby0+ZmxhZ3MgJiBPUFRfSU5UKSB7CisgICAgICAgICooaW50ICopZHN0ID0gcGFyc2VfbnVtYmVyX29yX2RpZShvcHQsIGFyZywgT1BUX0lOVDY0LCBJTlRfTUlOLCBJTlRfTUFYKTsKKyAgICB9IGVsc2UgaWYgKHBvLT5mbGFncyAmIE9QVF9JTlQ2NCkgeworICAgICAgICAqKGludDY0X3QgKilkc3QgPSBwYXJzZV9udW1iZXJfb3JfZGllKG9wdCwgYXJnLCBPUFRfSU5UNjQsIElOVDY0X01JTiwgSU5UNjRfTUFYKTsKKyAgICB9IGVsc2UgaWYgKHBvLT5mbGFncyAmIE9QVF9USU1FKSB7CisgICAgICAgICooaW50NjRfdCAqKWRzdCA9IHBhcnNlX3RpbWVfb3JfZGllKG9wdCwgYXJnLCAxKTsKKyAgICB9IGVsc2UgaWYgKHBvLT5mbGFncyAmIE9QVF9GTE9BVCkgeworICAgICAgICAqKGZsb2F0ICopZHN0ID0gcGFyc2VfbnVtYmVyX29yX2RpZShvcHQsIGFyZywgT1BUX0ZMT0FULCAtSU5GSU5JVFksIElORklOSVRZKTsKKyAgICB9IGVsc2UgaWYgKHBvLT5mbGFncyAmIE9QVF9ET1VCTEUpIHsKKyAgICAgICAgKihkb3VibGUgKilkc3QgPSBwYXJzZV9udW1iZXJfb3JfZGllKG9wdCwgYXJnLCBPUFRfRE9VQkxFLCAtSU5GSU5JVFksIElORklOSVRZKTsKKyAgICB9IGVsc2UgaWYgKHBvLT51LmZ1bmNfYXJnKSB7CisgICAgICAgIGludCByZXQgPSBwby0+dS5mdW5jX2FyZyhvcHRjdHgsIG9wdCwgYXJnKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZXQgdmFsdWUgJyVzJyBmb3Igb3B0aW9uICclcyc6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGFyZywgb3B0LCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocG8tPmZsYWdzICYgT1BUX0VYSVQpCisgICAgICAgIGV4aXRfcHJvZ3JhbSgwKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgcGFyc2Vfb3B0aW9uKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcsCisgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucykKK3sKKyAgICBjb25zdCBPcHRpb25EZWYgKnBvOworICAgIGludCByZXQ7CisKKyAgICBwbyA9IGZpbmRfb3B0aW9uKG9wdGlvbnMsIG9wdCk7CisgICAgaWYgKCFwby0+bmFtZSAmJiBvcHRbMF0gPT0gJ24nICYmIG9wdFsxXSA9PSAnbycpIHsKKyAgICAgICAgLyogaGFuZGxlICdubycgYm9vbCBvcHRpb24gKi8KKyAgICAgICAgcG8gPSBmaW5kX29wdGlvbihvcHRpb25zLCBvcHQgKyAyKTsKKyAgICAgICAgaWYgKChwby0+bmFtZSAmJiAocG8tPmZsYWdzICYgT1BUX0JPT0wpKSkKKyAgICAgICAgICAgIGFyZyA9ICIwIjsKKyAgICB9IGVsc2UgaWYgKHBvLT5mbGFncyAmIE9QVF9CT09MKQorICAgICAgICBhcmcgPSAiMSI7CisKKyAgICBpZiAoIXBvLT5uYW1lKQorICAgICAgICBwbyA9IGZpbmRfb3B0aW9uKG9wdGlvbnMsICJkZWZhdWx0Iik7CisgICAgaWYgKCFwby0+bmFtZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5yZWNvZ25pemVkIG9wdGlvbiAnJXMnXG4iLCBvcHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAocG8tPmZsYWdzICYgSEFTX0FSRyAmJiAhYXJnKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIGFyZ3VtZW50IGZvciBvcHRpb24gJyVzJ1xuIiwgb3B0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXQgPSB3cml0ZV9vcHRpb24ob3B0Y3R4LCBwbywgb3B0LCBhcmcpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuICEhKHBvLT5mbGFncyAmIEhBU19BUkcpOworfQorCit2b2lkIHBhcnNlX29wdGlvbnModm9pZCAqb3B0Y3R4LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICB2b2lkICgqcGFyc2VfYXJnX2Z1bmN0aW9uKSh2b2lkICosIGNvbnN0IGNoYXIqKSkKK3sKKyAgICBjb25zdCBjaGFyICpvcHQ7CisgICAgaW50IG9wdGluZGV4LCBoYW5kbGVvcHRpb25zID0gMSwgcmV0OworCisgICAgLyogcGVyZm9ybSBzeXN0ZW0tZGVwZW5kZW50IGNvbnZlcnNpb25zIGZvciBhcmd1bWVudHMgbGlzdCAqLworICAgIHByZXBhcmVfYXBwX2FyZ3VtZW50cygmYXJnYywgJmFyZ3YpOworCisgICAgLyogcGFyc2Ugb3B0aW9ucyAqLworICAgIG9wdGluZGV4ID0gMTsKKyAgICB3aGlsZSAob3B0aW5kZXggPCBhcmdjKSB7CisgICAgICAgIG9wdCA9IGFyZ3Zbb3B0aW5kZXgrK107CisKKyAgICAgICAgaWYgKGhhbmRsZW9wdGlvbnMgJiYgb3B0WzBdID09ICctJyAmJiBvcHRbMV0gIT0gJ1wwJykgeworICAgICAgICAgICAgaWYgKG9wdFsxXSA9PSAnLScgJiYgb3B0WzJdID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVvcHRpb25zID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wdCsrOworCisgICAgICAgICAgICBpZiAoKHJldCA9IHBhcnNlX29wdGlvbihvcHRjdHgsIG9wdCwgYXJndltvcHRpbmRleF0sIG9wdGlvbnMpKSA8IDApCisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgb3B0aW5kZXggKz0gcmV0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBhcnNlX2FyZ19mdW5jdGlvbikKKyAgICAgICAgICAgICAgICBwYXJzZV9hcmdfZnVuY3Rpb24ob3B0Y3R4LCBvcHQpOworICAgICAgICB9CisgICAgfQorfQorCitpbnQgcGFyc2Vfb3B0Z3JvdXAodm9pZCAqb3B0Y3R4LCBPcHRpb25Hcm91cCAqZykKK3sKKyAgICBpbnQgaSwgcmV0OworCisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIlBhcnNpbmcgYSBncm91cCBvZiBvcHRpb25zOiAlcyAlcy5cbiIsCisgICAgICAgICAgIGctPmdyb3VwX2RlZi0+bmFtZSwgZy0+YXJnKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnLT5uYl9vcHRzOyBpKyspIHsKKyAgICAgICAgT3B0aW9uICpvID0gJmctPm9wdHNbaV07CisKKyAgICAgICAgaWYgKGctPmdyb3VwX2RlZi0+ZmxhZ3MgJiYKKyAgICAgICAgICAgICEoZy0+Z3JvdXBfZGVmLT5mbGFncyAmIG8tPm9wdC0+ZmxhZ3MpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3B0aW9uICVzICglcykgY2Fubm90IGJlIGFwcGxpZWQgdG8gIgorICAgICAgICAgICAgICAgICAgICIlcyAlcyAtLSB5b3UgYXJlIHRyeWluZyB0byBhcHBseSBhbiBpbnB1dCBvcHRpb24gdG8gYW4gIgorICAgICAgICAgICAgICAgICAgICJvdXRwdXQgZmlsZSBvciB2aWNlIHZlcnNhLiBNb3ZlIHRoaXMgb3B0aW9uIGJlZm9yZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICJmaWxlIGl0IGJlbG9uZ3MgdG8uXG4iLCBvLT5rZXksIG8tPm9wdC0+aGVscCwKKyAgICAgICAgICAgICAgICAgICBnLT5ncm91cF9kZWYtPm5hbWUsIGctPmFyZyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIkFwcGx5aW5nIG9wdGlvbiAlcyAoJXMpIHdpdGggYXJndW1lbnQgJXMuXG4iLAorICAgICAgICAgICAgICAgby0+a2V5LCBvLT5vcHQtPmhlbHAsIG8tPnZhbCk7CisKKyAgICAgICAgcmV0ID0gd3JpdGVfb3B0aW9uKG9wdGN0eCwgby0+b3B0LCBvLT5rZXksIG8tPnZhbCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiU3VjY2Vzc2Z1bGx5IHBhcnNlZCBhIGdyb3VwIG9mIG9wdGlvbnMuXG4iKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgbG9jYXRlX29wdGlvbihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm9wdG5hbWUpCit7CisgICAgY29uc3QgT3B0aW9uRGVmICpwbzsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqY3VyX29wdCA9IGFyZ3ZbaV07CisKKyAgICAgICAgaWYgKCpjdXJfb3B0KysgIT0gJy0nKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcG8gPSBmaW5kX29wdGlvbihvcHRpb25zLCBjdXJfb3B0KTsKKyAgICAgICAgaWYgKCFwby0+bmFtZSAmJiBjdXJfb3B0WzBdID09ICduJyAmJiBjdXJfb3B0WzFdID09ICdvJykKKyAgICAgICAgICAgIHBvID0gZmluZF9vcHRpb24ob3B0aW9ucywgY3VyX29wdCArIDIpOworCisgICAgICAgIGlmICgoIXBvLT5uYW1lICYmICFzdHJjbXAoY3VyX29wdCwgb3B0bmFtZSkpIHx8CisgICAgICAgICAgICAgKHBvLT5uYW1lICYmICFzdHJjbXAob3B0bmFtZSwgcG8tPm5hbWUpKSkKKyAgICAgICAgICAgIHJldHVybiBpOworCisgICAgICAgIGlmICghcG8tPm5hbWUgfHwgcG8tPmZsYWdzICYgSEFTX0FSRykKKyAgICAgICAgICAgIGkrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYXJndW1lbnQoY29uc3QgY2hhciAqYSkKK3sKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwOworCisgICAgZm9yIChwID0gYTsgKnA7IHArKykKKyAgICAgICAgaWYgKCEoKCpwID49ICcrJyAmJiAqcCA8PSAnOicpIHx8ICgqcCA+PSAnQCcgJiYgKnAgPD0gJ1onKSB8fAorICAgICAgICAgICAgICAqcCA9PSAnXycgfHwgKCpwID49ICdhJyAmJiAqcCA8PSAneicpKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmICghKnApIHsKKyAgICAgICAgZnB1dHMoYSwgcmVwb3J0X2ZpbGUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZwdXRjKCciJywgcmVwb3J0X2ZpbGUpOworICAgIGZvciAocCA9IGE7ICpwOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICdcXCcgfHwgKnAgPT0gJyInIHx8ICpwID09ICckJyB8fCAqcCA9PSAnYCcpCisgICAgICAgICAgICBmcHJpbnRmKHJlcG9ydF9maWxlLCAiXFwlYyIsICpwKTsKKyAgICAgICAgZWxzZSBpZiAoKnAgPCAnICcgfHwgKnAgPiAnficpCisgICAgICAgICAgICBmcHJpbnRmKHJlcG9ydF9maWxlLCAiXFx4JTAyeCIsICpwKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZnB1dGMoKnAsIHJlcG9ydF9maWxlKTsKKyAgICB9CisgICAgZnB1dGMoJyInLCByZXBvcnRfZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX29wdGlvbnMoY29uc3QgT3B0aW9uRGVmICpwbykKK3sKKyAgICB3aGlsZSAocG8tPm5hbWUpIHsKKyAgICAgICAgaWYgKHBvLT5mbGFncyAmIE9QVF9QRVJGSUxFKQorICAgICAgICAgICAgYXZfYXNzZXJ0MChwby0+ZmxhZ3MgJiAoT1BUX0lOUFVUIHwgT1BUX09VVFBVVCkpOworICAgICAgICBwbysrOworICAgIH0KK30KKwordm9pZCBwYXJzZV9sb2dsZXZlbChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucykKK3sKKyAgICBpbnQgaWR4ID0gbG9jYXRlX29wdGlvbihhcmdjLCBhcmd2LCBvcHRpb25zLCAibG9nbGV2ZWwiKTsKKyAgICBjb25zdCBjaGFyICplbnY7CisKKyAgICBjaGVja19vcHRpb25zKG9wdGlvbnMpOworCisgICAgaWYgKCFpZHgpCisgICAgICAgIGlkeCA9IGxvY2F0ZV9vcHRpb24oYXJnYywgYXJndiwgb3B0aW9ucywgInYiKTsKKyAgICBpZiAoaWR4ICYmIGFyZ3ZbaWR4ICsgMV0pCisgICAgICAgIG9wdF9sb2dsZXZlbChOVUxMLCAibG9nbGV2ZWwiLCBhcmd2W2lkeCArIDFdKTsKKyAgICBpZHggPSBsb2NhdGVfb3B0aW9uKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsICJyZXBvcnQiKTsKKyAgICBpZiAoKGVudiA9IGdldGVudigiRkZSRVBPUlQiKSkgfHwgaWR4KSB7CisgICAgICAgIGluaXRfcmVwb3J0KGVudik7CisgICAgICAgIGlmIChyZXBvcnRfZmlsZSkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmcHJpbnRmKHJlcG9ydF9maWxlLCAiQ29tbWFuZCBsaW5lOlxuIik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZHVtcF9hcmd1bWVudChhcmd2W2ldKTsKKyAgICAgICAgICAgICAgICBmcHV0YyhpIDwgYXJnYyAtIDEgPyAnICcgOiAnXG4nLCByZXBvcnRfZmlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZmx1c2gocmVwb3J0X2ZpbGUpOworICAgICAgICB9CisgICAgfQorICAgIGlkeCA9IGxvY2F0ZV9vcHRpb24oYXJnYywgYXJndiwgb3B0aW9ucywgImhpZGVfYmFubmVyIik7CisgICAgaWYgKGlkeCkKKyAgICAgICAgaGlkZV9iYW5uZXIgPSAxOworfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gKm9wdF9maW5kKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3B0X2ZsYWdzLCBpbnQgc2VhcmNoX2ZsYWdzKQoreworICAgIGNvbnN0IEFWT3B0aW9uICpvID0gYXZfb3B0X2ZpbmQob2JqLCBuYW1lLCB1bml0LCBvcHRfZmxhZ3MsIHNlYXJjaF9mbGFncyk7CisgICAgaWYobyAmJiAhby0+ZmxhZ3MpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBvOworfQorCisjZGVmaW5lIEZMQUdTIChvLT50eXBlID09IEFWX09QVF9UWVBFX0ZMQUdTICYmIChhcmdbMF09PSctJyB8fCBhcmdbMF09PScrJykpID8gQVZfRElDVF9BUFBFTkQgOiAwCitpbnQgb3B0X2RlZmF1bHQodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBjb25zdCBBVk9wdGlvbiAqbzsKKyAgICBpbnQgY29uc3VtZWQgPSAwOworICAgIGNoYXIgb3B0X3N0cmlwcGVkWzEyOF07CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjb25zdCBBVkNsYXNzICpjYyA9IGF2Y29kZWNfZ2V0X2NsYXNzKCksICpmYyA9IGF2Zm9ybWF0X2dldF9jbGFzcygpOworI2lmIENPTkZJR19BVlJFU0FNUExFCisgICAgY29uc3QgQVZDbGFzcyAqcmMgPSBhdnJlc2FtcGxlX2dldF9jbGFzcygpOworI2VuZGlmCisjaWYgQ09ORklHX1NXU0NBTEUKKyAgICBjb25zdCBBVkNsYXNzICpzYyA9IHN3c19nZXRfY2xhc3MoKTsKKyNlbmRpZgorI2lmIENPTkZJR19TV1JFU0FNUExFCisgICAgY29uc3QgQVZDbGFzcyAqc3dyX2NsYXNzID0gc3dyX2dldF9jbGFzcygpOworI2VuZGlmCisKKyAgICBpZiAoIXN0cmNtcChvcHQsICJkZWJ1ZyIpIHx8ICFzdHJjbXAob3B0LCAiZmRlYnVnIikpCisgICAgICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKKworICAgIGlmICghKHAgPSBzdHJjaHIob3B0LCAnOicpKSkKKyAgICAgICAgcCA9IG9wdCArIHN0cmxlbihvcHQpOworICAgIGF2X3N0cmxjcHkob3B0X3N0cmlwcGVkLCBvcHQsIEZGTUlOKHNpemVvZihvcHRfc3RyaXBwZWQpLCBwIC0gb3B0ICsgMSkpOworCisgICAgaWYgKChvID0gb3B0X2ZpbmQoJmNjLCBvcHRfc3RyaXBwZWQsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiB8IEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSB8fAorICAgICAgICAoKG9wdFswXSA9PSAndicgfHwgb3B0WzBdID09ICdhJyB8fCBvcHRbMF0gPT0gJ3MnKSAmJgorICAgICAgICAgKG8gPSBvcHRfZmluZCgmY2MsIG9wdCArIDEsIE5VTEwsIDAsIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSkpIHsKKyAgICAgICAgYXZfZGljdF9zZXQoJmNvZGVjX29wdHMsIG9wdCwgYXJnLCBGTEFHUyk7CisgICAgICAgIGNvbnN1bWVkID0gMTsKKyAgICB9CisgICAgaWYgKChvID0gb3B0X2ZpbmQoJmZjLCBvcHQsIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiB8IEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSkgeworICAgICAgICBhdl9kaWN0X3NldCgmZm9ybWF0X29wdHMsIG9wdCwgYXJnLCBGTEFHUyk7CisgICAgICAgIGlmIChjb25zdW1lZCkKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIlJvdXRpbmcgb3B0aW9uICVzIHRvIGJvdGggY29kZWMgYW5kIG11eGVyIGxheWVyXG4iLCBvcHQpOworICAgICAgICBjb25zdW1lZCA9IDE7CisgICAgfQorI2lmIENPTkZJR19TV1NDQUxFCisgICAgaWYgKCFjb25zdW1lZCAmJiAobyA9IG9wdF9maW5kKCZzYywgb3B0LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4gfCBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKSkpIHsKKyAgICAgICAgc3RydWN0IFN3c0NvbnRleHQgKnN3cyA9IHN3c19hbGxvY19jb250ZXh0KCk7CisgICAgICAgIGludCByZXQgPSBhdl9vcHRfc2V0KHN3cywgb3B0LCBhcmcsIDApOworICAgICAgICBzd3NfZnJlZUNvbnRleHQoc3dzKTsKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0LCAic3JjdyIpIHx8ICFzdHJjbXAob3B0LCAic3JjaCIpIHx8CisgICAgICAgICAgICAhc3RyY21wKG9wdCwgImRzdHciKSB8fCAhc3RyY21wKG9wdCwgImRzdGgiKSB8fAorICAgICAgICAgICAgIXN0cmNtcChvcHQsICJzcmNfZm9ybWF0IikgfHwgIXN0cmNtcChvcHQsICJkc3RfZm9ybWF0IikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJEaXJlY3RseSB1c2luZyBzd3NjYWxlIGRpbWVuc2lvbnMvZm9ybWF0IG9wdGlvbnMgaXMgbm90IHN1cHBvcnRlZCwgcGxlYXNlIHVzZSB0aGUgLXMgb3IgLXBpeF9mbXQgb3B0aW9uc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc2V0dGluZyBvcHRpb24gJXMuXG4iLCBvcHQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2RpY3Rfc2V0KCZzd3NfZGljdCwgb3B0LCBhcmcsIEZMQUdTKTsKKworICAgICAgICBjb25zdW1lZCA9IDE7CisgICAgfQorI2Vsc2UKKyAgICBpZiAoIWNvbnN1bWVkICYmICFzdHJjbXAob3B0LCAic3dzX2ZsYWdzIikpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiSWdub3JpbmcgJXMgJXMsIGR1ZSB0byBkaXNhYmxlZCBzd3NjYWxlXG4iLCBvcHQsIGFyZyk7CisgICAgICAgIGNvbnN1bWVkID0gMTsKKyAgICB9CisjZW5kaWYKKyNpZiBDT05GSUdfU1dSRVNBTVBMRQorICAgIGlmICghY29uc3VtZWQgJiYgKG89b3B0X2ZpbmQoJnN3cl9jbGFzcywgb3B0LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiB8IEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSkgeworICAgICAgICBzdHJ1Y3QgU3dyQ29udGV4dCAqc3dyID0gc3dyX2FsbG9jKCk7CisgICAgICAgIGludCByZXQgPSBhdl9vcHRfc2V0KHN3ciwgb3B0LCBhcmcsIDApOworICAgICAgICBzd3JfZnJlZSgmc3dyKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIG9wdGlvbiAlcy5cbiIsIG9wdCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGF2X2RpY3Rfc2V0KCZzd3Jfb3B0cywgb3B0LCBhcmcsIEZMQUdTKTsKKyAgICAgICAgY29uc3VtZWQgPSAxOworICAgIH0KKyNlbmRpZgorI2lmIENPTkZJR19BVlJFU0FNUExFCisgICAgaWYgKChvPW9wdF9maW5kKCZyYywgb3B0LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0NISUxEUkVOIHwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSikpKSB7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZyZXNhbXBsZV9vcHRzLCBvcHQsIGFyZywgRkxBR1MpOworICAgICAgICBjb25zdW1lZCA9IDE7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoY29uc3VtZWQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7Cit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIGdpdmVuIG9wdGlvbiBpcyBhIGdyb3VwIHNlcGFyYXRvci4KKyAqCisgKiBAcmV0dXJuIGluZGV4IG9mIHRoZSBncm91cCBkZWZpbml0aW9uIHRoYXQgbWF0Y2hlZCBvciAtMSBpZiBub25lCisgKi8KK3N0YXRpYyBpbnQgbWF0Y2hfZ3JvdXBfc2VwYXJhdG9yKGNvbnN0IE9wdGlvbkdyb3VwRGVmICpncm91cHMsIGludCBuYl9ncm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcHQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZ3JvdXBzOyBpKyspIHsKKyAgICAgICAgY29uc3QgT3B0aW9uR3JvdXBEZWYgKnAgPSAmZ3JvdXBzW2ldOworICAgICAgICBpZiAocC0+c2VwICYmICFzdHJjbXAocC0+c2VwLCBvcHQpKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCisvKgorICogRmluaXNoIHBhcnNpbmcgYW4gb3B0aW9uIGdyb3VwLgorICoKKyAqIEBwYXJhbSBncm91cF9pZHggd2hpY2ggZ3JvdXAgZGVmaW5pdGlvbiBzaG91bGQgdGhpcyBncm91cCBiZWxvbmcgdG8KKyAqIEBwYXJhbSBhcmcgYXJndW1lbnQgb2YgdGhlIGdyb3VwIGRlbGltaXRpbmcgb3B0aW9uCisgKi8KK3N0YXRpYyB2b2lkIGZpbmlzaF9ncm91cChPcHRpb25QYXJzZUNvbnRleHQgKm9jdHgsIGludCBncm91cF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbkdyb3VwTGlzdCAqbCA9ICZvY3R4LT5ncm91cHNbZ3JvdXBfaWR4XTsKKyAgICBPcHRpb25Hcm91cCAqZzsKKworICAgIEdST1dfQVJSQVkobC0+Z3JvdXBzLCBsLT5uYl9ncm91cHMpOworICAgIGcgPSAmbC0+Z3JvdXBzW2wtPm5iX2dyb3VwcyAtIDFdOworCisgICAgKmcgICAgICAgICAgICAgPSBvY3R4LT5jdXJfZ3JvdXA7CisgICAgZy0+YXJnICAgICAgICAgPSBhcmc7CisgICAgZy0+Z3JvdXBfZGVmICAgPSBsLT5ncm91cF9kZWY7CisgICAgZy0+c3dzX2RpY3QgICAgPSBzd3NfZGljdDsKKyAgICBnLT5zd3Jfb3B0cyAgICA9IHN3cl9vcHRzOworICAgIGctPmNvZGVjX29wdHMgID0gY29kZWNfb3B0czsKKyAgICBnLT5mb3JtYXRfb3B0cyA9IGZvcm1hdF9vcHRzOworICAgIGctPnJlc2FtcGxlX29wdHMgPSByZXNhbXBsZV9vcHRzOworCisgICAgY29kZWNfb3B0cyAgPSBOVUxMOworICAgIGZvcm1hdF9vcHRzID0gTlVMTDsKKyAgICByZXNhbXBsZV9vcHRzID0gTlVMTDsKKyAgICBzd3NfZGljdCAgICA9IE5VTEw7CisgICAgc3dyX29wdHMgICAgPSBOVUxMOworICAgIGluaXRfb3B0cygpOworCisgICAgbWVtc2V0KCZvY3R4LT5jdXJfZ3JvdXAsIDAsIHNpemVvZihvY3R4LT5jdXJfZ3JvdXApKTsKK30KKworLyoKKyAqIEFkZCBhbiBvcHRpb24gaW5zdGFuY2UgdG8gY3VycmVudGx5IHBhcnNlZCBncm91cC4KKyAqLworc3RhdGljIHZvaWQgYWRkX29wdChPcHRpb25QYXJzZUNvbnRleHQgKm9jdHgsIGNvbnN0IE9wdGlvbkRlZiAqb3B0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCkKK3sKKyAgICBpbnQgZ2xvYmFsID0gIShvcHQtPmZsYWdzICYgKE9QVF9QRVJGSUxFIHwgT1BUX1NQRUMgfCBPUFRfT0ZGU0VUKSk7CisgICAgT3B0aW9uR3JvdXAgKmcgPSBnbG9iYWwgPyAmb2N0eC0+Z2xvYmFsX29wdHMgOiAmb2N0eC0+Y3VyX2dyb3VwOworCisgICAgR1JPV19BUlJBWShnLT5vcHRzLCBnLT5uYl9vcHRzKTsKKyAgICBnLT5vcHRzW2ctPm5iX29wdHMgLSAxXS5vcHQgPSBvcHQ7CisgICAgZy0+b3B0c1tnLT5uYl9vcHRzIC0gMV0ua2V5ID0ga2V5OworICAgIGctPm9wdHNbZy0+bmJfb3B0cyAtIDFdLnZhbCA9IHZhbDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9wYXJzZV9jb250ZXh0KE9wdGlvblBhcnNlQ29udGV4dCAqb2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25Hcm91cERlZiAqZ3JvdXBzLCBpbnQgbmJfZ3JvdXBzKQoreworICAgIHN0YXRpYyBjb25zdCBPcHRpb25Hcm91cERlZiBnbG9iYWxfZ3JvdXAgPSB7ICJnbG9iYWwiIH07CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQob2N0eCwgMCwgc2l6ZW9mKCpvY3R4KSk7CisKKyAgICBvY3R4LT5uYl9ncm91cHMgPSBuYl9ncm91cHM7CisgICAgb2N0eC0+Z3JvdXBzICAgID0gYXZfbWFsbG9jel9hcnJheShvY3R4LT5uYl9ncm91cHMsIHNpemVvZigqb2N0eC0+Z3JvdXBzKSk7CisgICAgaWYgKCFvY3R4LT5ncm91cHMpCisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBvY3R4LT5uYl9ncm91cHM7IGkrKykKKyAgICAgICAgb2N0eC0+Z3JvdXBzW2ldLmdyb3VwX2RlZiA9ICZncm91cHNbaV07CisKKyAgICBvY3R4LT5nbG9iYWxfb3B0cy5ncm91cF9kZWYgPSAmZ2xvYmFsX2dyb3VwOworICAgIG9jdHgtPmdsb2JhbF9vcHRzLmFyZyAgICAgICA9ICIiOworCisgICAgaW5pdF9vcHRzKCk7Cit9CisKK3ZvaWQgdW5pbml0X3BhcnNlX2NvbnRleHQoT3B0aW9uUGFyc2VDb250ZXh0ICpvY3R4KQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IG9jdHgtPm5iX2dyb3VwczsgaSsrKSB7CisgICAgICAgIE9wdGlvbkdyb3VwTGlzdCAqbCA9ICZvY3R4LT5ncm91cHNbaV07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGwtPm5iX2dyb3VwczsgaisrKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmbC0+Z3JvdXBzW2pdLm9wdHMpOworICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZsLT5ncm91cHNbal0uY29kZWNfb3B0cyk7CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmwtPmdyb3Vwc1tqXS5mb3JtYXRfb3B0cyk7CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmwtPmdyb3Vwc1tqXS5yZXNhbXBsZV9vcHRzKTsKKworICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZsLT5ncm91cHNbal0uc3dzX2RpY3QpOworICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZsLT5ncm91cHNbal0uc3dyX29wdHMpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZsLT5ncm91cHMpOworICAgIH0KKyAgICBhdl9mcmVlcCgmb2N0eC0+Z3JvdXBzKTsKKworICAgIGF2X2ZyZWVwKCZvY3R4LT5jdXJfZ3JvdXAub3B0cyk7CisgICAgYXZfZnJlZXAoJm9jdHgtPmdsb2JhbF9vcHRzLm9wdHMpOworCisgICAgdW5pbml0X29wdHMoKTsKK30KKworaW50IHNwbGl0X2NvbW1hbmRsaW5lKE9wdGlvblBhcnNlQ29udGV4dCAqb2N0eCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uR3JvdXBEZWYgKmdyb3VwcywgaW50IG5iX2dyb3VwcykKK3sKKyAgICBpbnQgb3B0aW5kZXggPSAxOworICAgIGludCBkYXNoZGFzaCA9IC0yOworCisgICAgLyogcGVyZm9ybSBzeXN0ZW0tZGVwZW5kZW50IGNvbnZlcnNpb25zIGZvciBhcmd1bWVudHMgbGlzdCAqLworICAgIHByZXBhcmVfYXBwX2FyZ3VtZW50cygmYXJnYywgJmFyZ3YpOworCisgICAgaW5pdF9wYXJzZV9jb250ZXh0KG9jdHgsIGdyb3VwcywgbmJfZ3JvdXBzKTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiU3BsaXR0aW5nIHRoZSBjb21tYW5kbGluZS5cbiIpOworCisgICAgd2hpbGUgKG9wdGluZGV4IDwgYXJnYykgeworICAgICAgICBjb25zdCBjaGFyICpvcHQgPSBhcmd2W29wdGluZGV4KytdLCAqYXJnOworICAgICAgICBjb25zdCBPcHRpb25EZWYgKnBvOworICAgICAgICBpbnQgcmV0OworCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJSZWFkaW5nIG9wdGlvbiAnJXMnIC4uLiIsIG9wdCk7CisKKyAgICAgICAgaWYgKG9wdFswXSA9PSAnLScgJiYgb3B0WzFdID09ICctJyAmJiAhb3B0WzJdKSB7CisgICAgICAgICAgICBkYXNoZGFzaCA9IG9wdGluZGV4OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLyogdW5uYW1lZCBncm91cCBzZXBhcmF0b3JzLCBlLmcuIG91dHB1dCBmaWxlbmFtZSAqLworICAgICAgICBpZiAob3B0WzBdICE9ICctJyB8fCAhb3B0WzFdIHx8IGRhc2hkYXNoKzEgPT0gb3B0aW5kZXgpIHsKKyAgICAgICAgICAgIGZpbmlzaF9ncm91cChvY3R4LCAwLCBvcHQpOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiBtYXRjaGVkIGFzICVzLlxuIiwgZ3JvdXBzWzBdLm5hbWUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgb3B0Kys7CisKKyNkZWZpbmUgR0VUX0FSRyhhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFyZyA9IGFyZ3Zbb3B0aW5kZXgrK107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIWFyZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIGFyZ3VtZW50IGZvciBvcHRpb24gJyVzJy5cbiIsIG9wdCk7XAorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgICAgIC8qIG5hbWVkIGdyb3VwIHNlcGFyYXRvcnMsIGUuZy4gLWkgKi8KKyAgICAgICAgaWYgKChyZXQgPSBtYXRjaF9ncm91cF9zZXBhcmF0b3IoZ3JvdXBzLCBuYl9ncm91cHMsIG9wdCkpID49IDApIHsKKyAgICAgICAgICAgIEdFVF9BUkcoYXJnKTsKKyAgICAgICAgICAgIGZpbmlzaF9ncm91cChvY3R4LCByZXQsIGFyZyk7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiIG1hdGNoZWQgYXMgJXMgd2l0aCBhcmd1bWVudCAnJXMnLlxuIiwKKyAgICAgICAgICAgICAgICAgICBncm91cHNbcmV0XS5uYW1lLCBhcmcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBub3JtYWwgb3B0aW9ucyAqLworICAgICAgICBwbyA9IGZpbmRfb3B0aW9uKG9wdGlvbnMsIG9wdCk7CisgICAgICAgIGlmIChwby0+bmFtZSkgeworICAgICAgICAgICAgaWYgKHBvLT5mbGFncyAmIE9QVF9FWElUKSB7CisgICAgICAgICAgICAgICAgLyogb3B0aW9uYWwgYXJndW1lbnQsIGUuZy4gLWggKi8KKyAgICAgICAgICAgICAgICBhcmcgPSBhcmd2W29wdGluZGV4KytdOworICAgICAgICAgICAgfSBlbHNlIGlmIChwby0+ZmxhZ3MgJiBIQVNfQVJHKSB7CisgICAgICAgICAgICAgICAgR0VUX0FSRyhhcmcpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhcmcgPSAiMSI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFkZF9vcHQob2N0eCwgcG8sIG9wdCwgYXJnKTsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIgbWF0Y2hlZCBhcyBvcHRpb24gJyVzJyAoJXMpIHdpdGggIgorICAgICAgICAgICAgICAgICAgICJhcmd1bWVudCAnJXMnLlxuIiwgcG8tPm5hbWUsIHBvLT5oZWxwLCBhcmcpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBBVk9wdGlvbnMgKi8KKyAgICAgICAgaWYgKGFyZ3Zbb3B0aW5kZXhdKSB7CisgICAgICAgICAgICByZXQgPSBvcHRfZGVmYXVsdChOVUxMLCBvcHQsIGFyZ3Zbb3B0aW5kZXhdKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIgbWF0Y2hlZCBhcyBBVk9wdGlvbiAnJXMnIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgJyVzJy5cbiIsIG9wdCwgYXJndltvcHRpbmRleF0pOworICAgICAgICAgICAgICAgIG9wdGluZGV4Kys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyBvcHRpb24gJyVzJyAiCisgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIGFyZ3VtZW50ICclcycuXG4iLCBvcHQsIGFyZ3Zbb3B0aW5kZXhdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogYm9vbGVhbiAtbm9mb28gb3B0aW9ucyAqLworICAgICAgICBpZiAob3B0WzBdID09ICduJyAmJiBvcHRbMV0gPT0gJ28nICYmCisgICAgICAgICAgICAocG8gPSBmaW5kX29wdGlvbihvcHRpb25zLCBvcHQgKyAyKSkgJiYKKyAgICAgICAgICAgIHBvLT5uYW1lICYmIHBvLT5mbGFncyAmIE9QVF9CT09MKSB7CisgICAgICAgICAgICBhZGRfb3B0KG9jdHgsIHBvLCBvcHQsICIwIik7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiIG1hdGNoZWQgYXMgb3B0aW9uICclcycgKCVzKSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgMC5cbiIsIHBvLT5uYW1lLCBwby0+aGVscCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbnJlY29nbml6ZWQgb3B0aW9uICclcycuXG4iLCBvcHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgIH0KKworICAgIGlmIChvY3R4LT5jdXJfZ3JvdXAubmJfb3B0cyB8fCBjb2RlY19vcHRzIHx8IGZvcm1hdF9vcHRzIHx8IHJlc2FtcGxlX29wdHMpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlRyYWlsaW5nIG9wdGlvbnMgd2VyZSBmb3VuZCBvbiB0aGUgIgorICAgICAgICAgICAgICAgImNvbW1hbmRsaW5lLlxuIik7CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiRmluaXNoZWQgc3BsaXR0aW5nIHRoZSBjb21tYW5kbGluZS5cbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBvcHRfY3B1ZmxhZ3Modm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKChyZXQgPSBhdl9wYXJzZV9jcHVfY2FwcygmZmxhZ3MsIGFyZykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2X2ZvcmNlX2NwdV9mbGFncyhmbGFncyk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBvcHRfbG9nbGV2ZWwodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBjb25zdCBzdHJ1Y3QgeyBjb25zdCBjaGFyICpuYW1lOyBpbnQgbGV2ZWw7IH0gbG9nX2xldmVsc1tdID0geworICAgICAgICB7ICJxdWlldCIgICwgQVZfTE9HX1FVSUVUICAgfSwKKyAgICAgICAgeyAicGFuaWMiICAsIEFWX0xPR19QQU5JQyAgIH0sCisgICAgICAgIHsgImZhdGFsIiAgLCBBVl9MT0dfRkFUQUwgICB9LAorICAgICAgICB7ICJlcnJvciIgICwgQVZfTE9HX0VSUk9SICAgfSwKKyAgICAgICAgeyAid2FybmluZyIsIEFWX0xPR19XQVJOSU5HIH0sCisgICAgICAgIHsgImluZm8iICAgLCBBVl9MT0dfSU5GTyAgICB9LAorICAgICAgICB7ICJ2ZXJib3NlIiwgQVZfTE9HX1ZFUkJPU0UgfSwKKyAgICAgICAgeyAiZGVidWciICAsIEFWX0xPR19ERUJVRyAgIH0sCisgICAgICAgIHsgInRyYWNlIiAgLCBBVl9MT0dfVFJBQ0UgICB9LAorICAgIH07CisgICAgY29uc3QgY2hhciAqdG9rZW47CisgICAgY2hhciAqdGFpbDsKKyAgICBpbnQgZmxhZ3MgPSBhdl9sb2dfZ2V0X2ZsYWdzKCk7CisgICAgaW50IGxldmVsID0gYXZfbG9nX2dldF9sZXZlbCgpOworICAgIGludCBjbWQsIGkgPSAwOworCisgICAgYXZfYXNzZXJ0MChhcmcpOworICAgIHdoaWxlICgqYXJnKSB7CisgICAgICAgIHRva2VuID0gYXJnOworICAgICAgICBpZiAoKnRva2VuID09ICcrJyB8fCAqdG9rZW4gPT0gJy0nKSB7CisgICAgICAgICAgICBjbWQgPSAqdG9rZW4rKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNtZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpICYmICFjbWQpIHsKKyAgICAgICAgICAgIGZsYWdzID0gMDsgIC8qIG1pc3NpbmcgcmVsYXRpdmUgcHJlZml4LCBidWlsZCBhYnNvbHV0ZSB2YWx1ZSAqLworICAgICAgICB9CisgICAgICAgIGlmICghc3RybmNtcCh0b2tlbiwgInJlcGVhdCIsIDYpKSB7CisgICAgICAgICAgICBpZiAoY21kID09ICctJykgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEFWX0xPR19TS0lQX1JFUEVBVEVEOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmbGFncyAmPSB+QVZfTE9HX1NLSVBfUkVQRUFURUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcmcgPSB0b2tlbiArIDY7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAodG9rZW4sICJsZXZlbCIsIDUpKSB7CisgICAgICAgICAgICBpZiAoY21kID09ICctJykgeworICAgICAgICAgICAgICAgIGZsYWdzICY9IH5BVl9MT0dfUFJJTlRfTEVWRUw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZsYWdzIHw9IEFWX0xPR19QUklOVF9MRVZFTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFyZyA9IHRva2VuICsgNTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKCEqYXJnKSB7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0gZWxzZSBpZiAoKmFyZyA9PSAnKycpIHsKKyAgICAgICAgYXJnKys7CisgICAgfSBlbHNlIGlmICghaSkgeworICAgICAgICBmbGFncyA9IGF2X2xvZ19nZXRfZmxhZ3MoKTsgIC8qIGxldmVsIHZhbHVlIHdpdGhvdXQgcHJlZml4LCByZXNldCBmbGFncyAqLworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhsb2dfbGV2ZWxzKTsgaSsrKSB7CisgICAgICAgIGlmICghc3RyY21wKGxvZ19sZXZlbHNbaV0ubmFtZSwgYXJnKSkgeworICAgICAgICAgICAgbGV2ZWwgPSBsb2dfbGV2ZWxzW2ldLmxldmVsOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZXZlbCA9IHN0cnRvbChhcmcsICZ0YWlsLCAxMCk7CisgICAgaWYgKCp0YWlsKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGxvZ2xldmVsIFwiJXNcIi4gIgorICAgICAgICAgICAgICAgIlBvc3NpYmxlIGxldmVscyBhcmUgbnVtYmVycyBvcjpcbiIsIGFyZyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhsb2dfbGV2ZWxzKTsgaSsrKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlwiJXNcIlxuIiwgbG9nX2xldmVsc1tpXS5uYW1lKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworZW5kOgorICAgIGF2X2xvZ19zZXRfZmxhZ3MoZmxhZ3MpOworICAgIGF2X2xvZ19zZXRfbGV2ZWwobGV2ZWwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHBhbmRfZmlsZW5hbWVfdGVtcGxhdGUoQVZCUHJpbnQgKmJwLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdG0gKnRtKQoreworICAgIGludCBjOworCisgICAgd2hpbGUgKChjID0gKih0ZW1wbGF0ZSsrKSkpIHsKKyAgICAgICAgaWYgKGMgPT0gJyUnKSB7CisgICAgICAgICAgICBpZiAoIShjID0gKih0ZW1wbGF0ZSsrKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgICAgICAgIGF2X2JwcmludGYoYnAsICIlcyIsIHByb2dyYW1fbmFtZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGJwLCAiJTA0ZCUwMmQlMDJkLSUwMmQlMDJkJTAyZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1feWVhciArIDE5MDAsIHRtLT50bV9tb24gKyAxLCB0bS0+dG1fbWRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJyUnOgorICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhicCwgYywgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoYnAsIGMsIDEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGluaXRfcmVwb3J0KGNvbnN0IGNoYXIgKmVudikKK3sKKyAgICBjaGFyICpmaWxlbmFtZV90ZW1wbGF0ZSA9IE5VTEw7CisgICAgY2hhciAqa2V5LCAqdmFsOworICAgIGludCByZXQsIGNvdW50ID0gMDsKKyAgICB0aW1lX3Qgbm93OworICAgIHN0cnVjdCB0bSAqdG07CisgICAgQVZCUHJpbnQgZmlsZW5hbWU7CisKKyAgICBpZiAocmVwb3J0X2ZpbGUpIC8qIGFscmVhZHkgb3BlbmVkICovCisgICAgICAgIHJldHVybiAwOworICAgIHRpbWUoJm5vdyk7CisgICAgdG0gPSBsb2NhbHRpbWUoJm5vdyk7CisKKyAgICB3aGlsZSAoZW52ICYmICplbnYpIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfZ2V0X2tleV92YWx1ZSgmZW52LCAiPSIsICI6IiwgMCwgJmtleSwgJnZhbCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKGNvdW50KQorICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcGFyc2UgRkZSRVBPUlQgZW52aXJvbm1lbnQgdmFyaWFibGU6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCplbnYpCisgICAgICAgICAgICBlbnYrKzsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgaWYgKCFzdHJjbXAoa2V5LCAiZmlsZSIpKSB7CisgICAgICAgICAgICBhdl9mcmVlKGZpbGVuYW1lX3RlbXBsYXRlKTsKKyAgICAgICAgICAgIGZpbGVuYW1lX3RlbXBsYXRlID0gdmFsOworICAgICAgICAgICAgdmFsID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgImxldmVsIikpIHsKKyAgICAgICAgICAgIGNoYXIgKnRhaWw7CisgICAgICAgICAgICByZXBvcnRfZmlsZV9sZXZlbCA9IHN0cnRvbCh2YWwsICZ0YWlsLCAxMCk7CisgICAgICAgICAgICBpZiAoKnRhaWwpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCByZXBvcnQgZmlsZSBsZXZlbFxuIik7CisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24ga2V5ICclcycgaW4gRkZSRVBPUlRcbiIsIGtleSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZSh2YWwpOworICAgICAgICBhdl9mcmVlKGtleSk7CisgICAgfQorCisgICAgYXZfYnByaW50X2luaXQoJmZpbGVuYW1lLCAwLCAxKTsKKyAgICBleHBhbmRfZmlsZW5hbWVfdGVtcGxhdGUoJmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl94X2lmX251bGwoZmlsZW5hbWVfdGVtcGxhdGUsICIlcC0ldC5sb2ciKSwgdG0pOworICAgIGF2X2ZyZWUoZmlsZW5hbWVfdGVtcGxhdGUpOworICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKCZmaWxlbmFtZSkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk91dCBvZiBtZW1vcnkgYnVpbGRpbmcgcmVwb3J0IGZpbGUgbmFtZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmVwb3J0X2ZpbGUgPSBmb3BlbihmaWxlbmFtZS5zdHIsICJ3Iik7CisgICAgaWYgKCFyZXBvcnRfZmlsZSkgeworICAgICAgICBpbnQgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiByZXBvcnQgXCIlc1wiOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGZpbGVuYW1lLnN0ciwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfcmVwb3J0KTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICIlcyBzdGFydGVkIG9uICUwNGQtJTAyZC0lMDJkIGF0ICUwMmQ6JTAyZDolMDJkXG4iCisgICAgICAgICAgICJSZXBvcnQgd3JpdHRlbiB0byBcIiVzXCJcbiIsCisgICAgICAgICAgIHByb2dyYW1fbmFtZSwKKyAgICAgICAgICAgdG0tPnRtX3llYXIgKyAxOTAwLCB0bS0+dG1fbW9uICsgMSwgdG0tPnRtX21kYXksCisgICAgICAgICAgIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjLAorICAgICAgICAgICBmaWxlbmFtZS5zdHIpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmZmlsZW5hbWUsIE5VTEwpOworICAgIHJldHVybiAwOworfQorCitpbnQgb3B0X3JlcG9ydChjb25zdCBjaGFyICpvcHQpCit7CisgICAgcmV0dXJuIGluaXRfcmVwb3J0KE5VTEwpOworfQorCitpbnQgb3B0X21heF9hbGxvYyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGNoYXIgKnRhaWw7CisgICAgc2l6ZV90IG1heDsKKworICAgIG1heCA9IHN0cnRvbChhcmcsICZ0YWlsLCAxMCk7CisgICAgaWYgKCp0YWlsKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIG1heF9hbGxvYyBcIiVzXCIuXG4iLCBhcmcpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorICAgIGF2X21heF9hbGxvYyhtYXgpOworICAgIHJldHVybiAwOworfQorCitpbnQgb3B0X3RpbWVsaW1pdCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworI2lmIEhBVkVfU0VUUkxJTUlUCisgICAgaW50IGxpbSA9IHBhcnNlX251bWJlcl9vcl9kaWUob3B0LCBhcmcsIE9QVF9JTlQ2NCwgMCwgSU5UX01BWCk7CisgICAgc3RydWN0IHJsaW1pdCBybCA9IHsgbGltLCBsaW0gKyAxIH07CisgICAgaWYgKHNldHJsaW1pdChSTElNSVRfQ1BVLCAmcmwpKQorICAgICAgICBwZXJyb3IoInNldHJsaW1pdCIpOworI2Vsc2UKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICItJXMgbm90IGltcGxlbWVudGVkIG9uIHRoaXMgT1NcbiIsIG9wdCk7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBwcmludF9lcnJvcihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGVycikKK3sKKyAgICBjaGFyIGVycmJ1ZlsxMjhdOworICAgIGNvbnN0IGNoYXIgKmVycmJ1Zl9wdHIgPSBlcnJidWY7CisKKyAgICBpZiAoYXZfc3RyZXJyb3IoZXJyLCBlcnJidWYsIHNpemVvZihlcnJidWYpKSA8IDApCisgICAgICAgIGVycmJ1Zl9wdHIgPSBzdHJlcnJvcihBVlVORVJST1IoZXJyKSk7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVzOiAlc1xuIiwgZmlsZW5hbWUsIGVycmJ1Zl9wdHIpOworfQorCitzdGF0aWMgaW50IHdhcm5lZF9jZmcgPSAwOworCisjZGVmaW5lIElOREVOVCAgICAgICAgMQorI2RlZmluZSBTSE9XX1ZFUlNJT04gIDIKKyNkZWZpbmUgU0hPV19DT05GSUcgICA0CisjZGVmaW5lIFNIT1dfQ09QWVJJR0hUIDgKKworI2RlZmluZSBQUklOVF9MSUJfSU5GTyhsaWJuYW1lLCBMSUJOQU1FLCBmbGFncywgbGV2ZWwpICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChDT05GSUdfIyNMSUJOQU1FKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBjaGFyICppbmRlbnQgPSBmbGFncyAmIElOREVOVD8gIiAgIiA6ICIiOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmxhZ3MgJiBTSE9XX1ZFUlNJT04pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdW5zaWduZWQgaW50IHZlcnNpb24gPSBsaWJuYW1lIyNfdmVyc2lvbigpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIGxldmVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICIlc2xpYiUtMTFzICUyZC4lM2QuJTNkIC8gJTJkLiUzZC4lM2RcbiIsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGluZGVudCwgI2xpYm5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIExJQiMjTElCTkFNRSMjX1ZFUlNJT05fTUFKT1IsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIExJQiMjTElCTkFNRSMjX1ZFUlNJT05fTUlOT1IsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIExJQiMjTElCTkFNRSMjX1ZFUlNJT05fTUlDUk8sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIEFWX1ZFUlNJT05fTUFKT1IodmVyc2lvbiksIEFWX1ZFUlNJT05fTUlOT1IodmVyc2lvbiksXAorICAgICAgICAgICAgICAgICAgIEFWX1ZFUlNJT05fTUlDUk8odmVyc2lvbikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmxhZ3MgJiBTSE9XX0NPTkZJRykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgY2hhciAqY2ZnID0gbGlibmFtZSMjX2NvbmZpZ3VyYXRpb24oKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHN0cmNtcChGRk1QRUdfQ09ORklHVVJBVElPTiwgY2ZnKSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICghd2FybmVkX2NmZykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgbGV2ZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlc1dBUk5JTkc6IGxpYnJhcnkgY29uZmlndXJhdGlvbiBtaXNtYXRjaFxuIiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGVudCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB3YXJuZWRfY2ZnID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBsZXZlbCwgIiVzJS0xMXMgY29uZmlndXJhdGlvbjogJXNcbiIsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50LCAjbGlibmFtZSwgY2ZnKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitzdGF0aWMgdm9pZCBwcmludF9hbGxfbGlic19pbmZvKGludCBmbGFncywgaW50IGxldmVsKQoreworICAgIFBSSU5UX0xJQl9JTkZPKGF2dXRpbCwgICAgIEFWVVRJTCwgICAgIGZsYWdzLCBsZXZlbCk7CisgICAgUFJJTlRfTElCX0lORk8oYXZjb2RlYywgICAgQVZDT0RFQywgICAgZmxhZ3MsIGxldmVsKTsKKyAgICBQUklOVF9MSUJfSU5GTyhhdmZvcm1hdCwgICBBVkZPUk1BVCwgICBmbGFncywgbGV2ZWwpOworICAgIFBSSU5UX0xJQl9JTkZPKGF2ZGV2aWNlLCAgIEFWREVWSUNFLCAgIGZsYWdzLCBsZXZlbCk7CisgICAgUFJJTlRfTElCX0lORk8oYXZmaWx0ZXIsICAgQVZGSUxURVIsICAgZmxhZ3MsIGxldmVsKTsKKyAgICBQUklOVF9MSUJfSU5GTyhhdnJlc2FtcGxlLCBBVlJFU0FNUExFLCBmbGFncywgbGV2ZWwpOworICAgIFBSSU5UX0xJQl9JTkZPKHN3c2NhbGUsICAgIFNXU0NBTEUsICAgIGZsYWdzLCBsZXZlbCk7CisgICAgUFJJTlRfTElCX0lORk8oc3dyZXNhbXBsZSwgU1dSRVNBTVBMRSwgZmxhZ3MsIGxldmVsKTsKKyAgICBQUklOVF9MSUJfSU5GTyhwb3N0cHJvYywgICBQT1NUUFJPQywgICBmbGFncywgbGV2ZWwpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9wcm9ncmFtX2luZm8oaW50IGZsYWdzLCBpbnQgbGV2ZWwpCit7CisgICAgY29uc3QgY2hhciAqaW5kZW50ID0gZmxhZ3MgJiBJTkRFTlQ/ICIgICIgOiAiIjsKKworICAgIGF2X2xvZyhOVUxMLCBsZXZlbCwgIiVzIHZlcnNpb24gIiBGRk1QRUdfVkVSU0lPTiwgcHJvZ3JhbV9uYW1lKTsKKyAgICBpZiAoZmxhZ3MgJiBTSE9XX0NPUFlSSUdIVCkKKyAgICAgICAgYXZfbG9nKE5VTEwsIGxldmVsLCAiIENvcHlyaWdodCAoYykgJWQtJWQgdGhlIEZGbXBlZyBkZXZlbG9wZXJzIiwKKyAgICAgICAgICAgICAgIHByb2dyYW1fYmlydGhfeWVhciwgQ09ORklHX1RISVNfWUVBUik7CisgICAgYXZfbG9nKE5VTEwsIGxldmVsLCAiXG4iKTsKKyAgICBhdl9sb2coTlVMTCwgbGV2ZWwsICIlc2J1aWx0IHdpdGggJXNcbiIsIGluZGVudCwgQ0NfSURFTlQpOworCisgICAgYXZfbG9nKE5VTEwsIGxldmVsLCAiJXNjb25maWd1cmF0aW9uOiAiIEZGTVBFR19DT05GSUdVUkFUSU9OICJcbiIsIGluZGVudCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2J1aWxkY29uZihpbnQgZmxhZ3MsIGludCBsZXZlbCkKK3sKKyAgICBjb25zdCBjaGFyICppbmRlbnQgPSBmbGFncyAmIElOREVOVCA/ICIgICIgOiAiIjsKKyAgICBjaGFyIHN0cltdID0geyBGRk1QRUdfQ09ORklHVVJBVElPTiB9OworICAgIGNoYXIgKmNvbmZsaXN0LCAqcmVtb3ZlX3RpbGRlLCAqc3BsaXRjb25mOworCisgICAgLy8gQ2hhbmdlIGFsbCB0aGUgJyAtLScgc3RyaW5ncyB0byAnfi0tJyBzbyB0aGF0CisgICAgLy8gdGhleSBjYW4gYmUgaWRlbnRpZmllZCBhcyB0b2tlbnMuCisgICAgd2hpbGUgKChjb25mbGlzdCA9IHN0cnN0cihzdHIsICIgLS0iKSkgIT0gTlVMTCkgeworICAgICAgICBzdHJuY3B5KGNvbmZsaXN0LCAifi0tIiwgMyk7CisgICAgfQorCisgICAgLy8gQ29tcGVuc2F0ZSBmb3IgdGhlIHdlaXJkbmVzcyB0aGlzIHdvdWxkIGNhdXNlCisgICAgLy8gd2hlbiBwYXNzaW5nICdwa2ctY29uZmlnIC0tc3RhdGljJy4KKyAgICB3aGlsZSAoKHJlbW92ZV90aWxkZSA9IHN0cnN0cihzdHIsICJwa2ctY29uZmlnfiIpKSAhPSBOVUxMKSB7CisgICAgICAgIHN0cm5jcHkocmVtb3ZlX3RpbGRlLCAicGtnLWNvbmZpZyAiLCAxMSk7CisgICAgfQorCisgICAgc3BsaXRjb25mID0gc3RydG9rKHN0ciwgIn4iKTsKKyAgICBhdl9sb2coTlVMTCwgbGV2ZWwsICJcbiVzY29uZmlndXJhdGlvbjpcbiIsIGluZGVudCk7CisgICAgd2hpbGUgKHNwbGl0Y29uZiAhPSBOVUxMKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBsZXZlbCwgIiVzJXMlc1xuIiwgaW5kZW50LCBpbmRlbnQsIHNwbGl0Y29uZik7CisgICAgICAgIHNwbGl0Y29uZiA9IHN0cnRvayhOVUxMLCAifiIpOworICAgIH0KK30KKwordm9pZCBzaG93X2Jhbm5lcihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucykKK3sKKyAgICBpbnQgaWR4ID0gbG9jYXRlX29wdGlvbihhcmdjLCBhcmd2LCBvcHRpb25zLCAidmVyc2lvbiIpOworICAgIGlmIChoaWRlX2Jhbm5lciB8fCBpZHgpCisgICAgICAgIHJldHVybjsKKworICAgIHByaW50X3Byb2dyYW1faW5mbyAoSU5ERU5UfFNIT1dfQ09QWVJJR0hULCBBVl9MT0dfSU5GTyk7CisgICAgcHJpbnRfYWxsX2xpYnNfaW5mbyhJTkRFTlR8U0hPV19DT05GSUcsICBBVl9MT0dfSU5GTyk7CisgICAgcHJpbnRfYWxsX2xpYnNfaW5mbyhJTkRFTlR8U0hPV19WRVJTSU9OLCBBVl9MT0dfSU5GTyk7Cit9CisKK2ludCBzaG93X3ZlcnNpb24odm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBhdl9sb2dfc2V0X2NhbGxiYWNrKGxvZ19jYWxsYmFja19oZWxwKTsKKyAgICBwcmludF9wcm9ncmFtX2luZm8gKFNIT1dfQ09QWVJJR0hULCBBVl9MT0dfSU5GTyk7CisgICAgcHJpbnRfYWxsX2xpYnNfaW5mbyhTSE9XX1ZFUlNJT04sIEFWX0xPR19JTkZPKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgc2hvd19idWlsZGNvbmYodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBhdl9sb2dfc2V0X2NhbGxiYWNrKGxvZ19jYWxsYmFja19oZWxwKTsKKyAgICBwcmludF9idWlsZGNvbmYgICAgICAoSU5ERU5UfDAsIEFWX0xPR19JTkZPKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgc2hvd19saWNlbnNlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisjaWYgQ09ORklHX05PTkZSRUUKKyAgICBwcmludGYoCisgICAgIlRoaXMgdmVyc2lvbiBvZiAlcyBoYXMgbm9uZnJlZSBwYXJ0cyBjb21waWxlZCBpbi5cbiIKKyAgICAiVGhlcmVmb3JlIGl0IGlzIG5vdCBsZWdhbGx5IHJlZGlzdHJpYnV0YWJsZS5cbiIsCisgICAgcHJvZ3JhbV9uYW1lICk7CisjZWxpZiBDT05GSUdfR1BMVjMKKyAgICBwcmludGYoCisgICAgIiVzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiIKKyAgICAiaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiIKKyAgICAidGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcbiIKKyAgICAiKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiIKKyAgICAiXG4iCisgICAgIiVzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4iCisgICAgImJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4iCisgICAgIk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiIKKyAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiIKKyAgICAiXG4iCisgICAgIllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4iCisgICAgImFsb25nIHdpdGggJXMuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uXG4iLAorICAgIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX25hbWUgKTsKKyNlbGlmIENPTkZJR19HUEwKKyAgICBwcmludGYoCisgICAgIiVzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcbiIKKyAgICAiaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcbiIKKyAgICAidGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3JcbiIKKyAgICAiKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cbiIKKyAgICAiXG4iCisgICAgIiVzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsXG4iCisgICAgImJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mXG4iCisgICAgIk1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGVcbiIKKyAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiIKKyAgICAiXG4iCisgICAgIllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4iCisgICAgImFsb25nIHdpdGggJXM7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcbiIKKyAgICAiRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQVxuIiwKKyAgICBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV9uYW1lICk7CisjZWxpZiBDT05GSUdfTEdQTFYzCisgICAgcHJpbnRmKAorICAgICIlcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XG4iCisgICAgIml0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxuIgorICAgICJ0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxuIgorICAgICIoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuIgorICAgICJcbiIKKyAgICAiJXMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiIKKyAgICAiYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiIKKyAgICAiTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZVxuIgorICAgICJHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiIKKyAgICAiXG4iCisgICAgIllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZVxuIgorICAgICJhbG9uZyB3aXRoICVzLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LlxuIiwKKyAgICBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSwgcHJvZ3JhbV9uYW1lICk7CisjZWxzZQorICAgIHByaW50ZigKKyAgICAiJXMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG4iCisgICAgIm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbiIKKyAgICAiTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyXG4iCisgICAgInZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxuIgorICAgICJcbiIKKyAgICAiJXMgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxcbiIKKyAgICAiYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2ZcbiIKKyAgICAiTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlVcbiIKKyAgICAiTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cbiIKKyAgICAiXG4iCisgICAgIllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWNcbiIKKyAgICAiTGljZW5zZSBhbG9uZyB3aXRoICVzOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlXG4iCisgICAgIkZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0FcbiIsCisgICAgcHJvZ3JhbV9uYW1lLCBwcm9ncmFtX25hbWUsIHByb2dyYW1fbmFtZSApOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19kZXZpY2UoY29uc3QgQVZDbGFzcyAqYXZjbGFzcykKK3sKKyAgICBpZiAoIWF2Y2xhc3MpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBBVl9JU19JTlBVVF9ERVZJQ0UoYXZjbGFzcy0+Y2F0ZWdvcnkpIHx8IEFWX0lTX09VVFBVVF9ERVZJQ0UoYXZjbGFzcy0+Y2F0ZWdvcnkpOworfQorCitzdGF0aWMgaW50IHNob3dfZm9ybWF0c19kZXZpY2VzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcsIGludCBkZXZpY2Vfb25seSwgaW50IG11eGRlbXV4ZXJzKQoreworICAgIHZvaWQgKmlmbXRfb3BhcXVlID0gTlVMTDsKKyAgICBjb25zdCBBVklucHV0Rm9ybWF0ICppZm10ICA9IE5VTEw7CisgICAgdm9pZCAqb2ZtdF9vcGFxdWUgPSBOVUxMOworICAgIGNvbnN0IEFWT3V0cHV0Rm9ybWF0ICpvZm10ID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpsYXN0X25hbWU7CisgICAgaW50IGlzX2RldjsKKworICAgIHByaW50ZigiJXNcbiIKKyAgICAgICAgICAgIiBELiA9IERlbXV4aW5nIHN1cHBvcnRlZFxuIgorICAgICAgICAgICAiIC5FID0gTXV4aW5nIHN1cHBvcnRlZFxuIgorICAgICAgICAgICAiIC0tXG4iLCBkZXZpY2Vfb25seSA/ICJEZXZpY2VzOiIgOiAiRmlsZSBmb3JtYXRzOiIpOworICAgIGxhc3RfbmFtZSA9ICIwMDAiOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGRlY29kZSA9IDA7CisgICAgICAgIGludCBlbmNvZGUgPSAwOworICAgICAgICBjb25zdCBjaGFyICpuYW1lICAgICAgPSBOVUxMOworICAgICAgICBjb25zdCBjaGFyICpsb25nX25hbWUgPSBOVUxMOworCisgICAgICAgIGlmIChtdXhkZW11eGVycyAhPVNIT1dfREVNVVhFUlMpIHsKKyAgICAgICAgICAgIG9mbXRfb3BhcXVlID0gTlVMTDsKKyAgICAgICAgICAgIHdoaWxlICgob2ZtdCA9IGF2X211eGVyX2l0ZXJhdGUoJm9mbXRfb3BhcXVlKSkpIHsKKyAgICAgICAgICAgICAgICBpc19kZXYgPSBpc19kZXZpY2Uob2ZtdC0+cHJpdl9jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKCFpc19kZXYgJiYgZGV2aWNlX29ubHkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICgoIW5hbWUgfHwgc3RyY21wKG9mbXQtPm5hbWUsIG5hbWUpIDwgMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKG9mbXQtPm5hbWUsIGxhc3RfbmFtZSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICA9IG9mbXQtPm5hbWU7CisgICAgICAgICAgICAgICAgICAgIGxvbmdfbmFtZSA9IG9mbXQtPmxvbmdfbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlICAgID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG11eGRlbXV4ZXJzICE9IFNIT1dfTVVYRVJTKSB7CisgICAgICAgICAgICBpZm10X29wYXF1ZSA9IE5VTEw7CisgICAgICAgICAgICB3aGlsZSAoKGlmbXQgPSBhdl9kZW11eGVyX2l0ZXJhdGUoJmlmbXRfb3BhcXVlKSkpIHsKKyAgICAgICAgICAgICAgICBpc19kZXYgPSBpc19kZXZpY2UoaWZtdC0+cHJpdl9jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKCFpc19kZXYgJiYgZGV2aWNlX29ubHkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICgoIW5hbWUgfHwgc3RyY21wKGlmbXQtPm5hbWUsIG5hbWUpIDwgMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgc3RyY21wKGlmbXQtPm5hbWUsIGxhc3RfbmFtZSkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgICAgICA9IGlmbXQtPm5hbWU7CisgICAgICAgICAgICAgICAgICAgIGxvbmdfbmFtZSA9IGlmbXQtPmxvbmdfbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlICAgID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgJiYgc3RyY21wKGlmbXQtPm5hbWUsIG5hbWUpID09IDApCisgICAgICAgICAgICAgICAgICAgIGRlY29kZSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFuYW1lKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxhc3RfbmFtZSA9IG5hbWU7CisKKyAgICAgICAgcHJpbnRmKCIgJXMlcyAlLTE1cyAlc1xuIiwKKyAgICAgICAgICAgICAgIGRlY29kZSA/ICJEIiA6ICIgIiwKKyAgICAgICAgICAgICAgIGVuY29kZSA/ICJFIiA6ICIgIiwKKyAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBsb25nX25hbWUgPyBsb25nX25hbWU6IiAiKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzaG93X2Zvcm1hdHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICByZXR1cm4gc2hvd19mb3JtYXRzX2RldmljZXMob3B0Y3R4LCBvcHQsIGFyZywgMCwgU0hPV19ERUZBVUxUKTsKK30KKworaW50IHNob3dfbXV4ZXJzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgcmV0dXJuIHNob3dfZm9ybWF0c19kZXZpY2VzKG9wdGN0eCwgb3B0LCBhcmcsIDAsIFNIT1dfTVVYRVJTKTsKK30KKworaW50IHNob3dfZGVtdXhlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICByZXR1cm4gc2hvd19mb3JtYXRzX2RldmljZXMob3B0Y3R4LCBvcHQsIGFyZywgMCwgU0hPV19ERU1VWEVSUyk7Cit9CisKK2ludCBzaG93X2RldmljZXModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICByZXR1cm4gc2hvd19mb3JtYXRzX2RldmljZXMob3B0Y3R4LCBvcHQsIGFyZywgMSwgU0hPV19ERUZBVUxUKTsKK30KKworI2RlZmluZSBQUklOVF9DT0RFQ19TVVBQT1JURUQoY29kZWMsIGZpZWxkLCB0eXBlLCBsaXN0X25hbWUsIHRlcm0sIGdldF9uYW1lKSBcCisgICAgaWYgKGNvZGVjLT5maWVsZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdHlwZSAqcCA9IGNvZGVjLT5maWVsZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ZigiICAgIFN1cHBvcnRlZCAiIGxpc3RfbmFtZSAiOiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCpwICE9IHRlcm0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZ2V0X25hbWUoKnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwcmludGYoIiAlcyIsIG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHArKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50ZigiXG4iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitzdGF0aWMgdm9pZCBwcmludF9jb2RlYyhjb25zdCBBVkNvZGVjICpjKQoreworICAgIGludCBlbmNvZGVyID0gYXZfY29kZWNfaXNfZW5jb2RlcihjKTsKKworICAgIHByaW50ZigiJXMgJXMgWyVzXTpcbiIsIGVuY29kZXIgPyAiRW5jb2RlciIgOiAiRGVjb2RlciIsIGMtPm5hbWUsCisgICAgICAgICAgIGMtPmxvbmdfbmFtZSA/IGMtPmxvbmdfbmFtZSA6ICIiKTsKKworICAgIHByaW50ZigiICAgIEdlbmVyYWwgY2FwYWJpbGl0aWVzOiAiKTsKKyAgICBpZiAoYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCkKKyAgICAgICAgcHJpbnRmKCJob3JpemJhbmQgIik7CisgICAgaWYgKGMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9EUjEpCisgICAgICAgIHByaW50ZigiZHIxICIpOworICAgIGlmIChjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfVFJVTkNBVEVEKQorICAgICAgICBwcmludGYoInRydW5jICIpOworICAgIGlmIChjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfREVMQVkpCisgICAgICAgIHByaW50ZigiZGVsYXkgIik7CisgICAgaWYgKGMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FKQorICAgICAgICBwcmludGYoInNtYWxsICIpOworICAgIGlmIChjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfU1VCRlJBTUVTKQorICAgICAgICBwcmludGYoInN1YmZyYW1lcyAiKTsKKyAgICBpZiAoYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCkKKyAgICAgICAgcHJpbnRmKCJleHAgIik7CisgICAgaWYgKGMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9DSEFOTkVMX0NPTkYpCisgICAgICAgIHByaW50ZigiY2hjb25mICIpOworICAgIGlmIChjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfUEFSQU1fQ0hBTkdFKQorICAgICAgICBwcmludGYoInBhcmFtY2hhbmdlICIpOworICAgIGlmIChjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfVkFSSUFCTEVfRlJBTUVfU0laRSkKKyAgICAgICAgcHJpbnRmKCJ2YXJpYWJsZSAiKTsKKyAgICBpZiAoYy0+Y2FwYWJpbGl0aWVzICYgKEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9BVVRPX1RIUkVBRFMpKQorICAgICAgICBwcmludGYoInRocmVhZHMgIik7CisgICAgaWYgKCFjLT5jYXBhYmlsaXRpZXMpCisgICAgICAgIHByaW50Zigibm9uZSIpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGlmIChjLT50eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAorICAgICAgICBjLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBwcmludGYoIiAgICBUaHJlYWRpbmcgY2FwYWJpbGl0aWVzOiAiKTsKKyAgICAgICAgc3dpdGNoIChjLT5jYXBhYmlsaXRpZXMgJiAoQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9BVVRPX1RIUkVBRFMpKSB7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfAorICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTOiBwcmludGYoImZyYW1lIGFuZCBzbGljZSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUzogcHJpbnRmKCJmcmFtZSIpOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFM6IHByaW50Zigic2xpY2UiKTsgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0NBUF9BVVRPX1RIUkVBRFMgOiBwcmludGYoImF1dG8iKTsgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJub25lIik7ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKworICAgIGlmIChjLT5zdXBwb3J0ZWRfZnJhbWVyYXRlcykgeworICAgICAgICBjb25zdCBBVlJhdGlvbmFsICpmcHMgPSBjLT5zdXBwb3J0ZWRfZnJhbWVyYXRlczsKKworICAgICAgICBwcmludGYoIiAgICBTdXBwb3J0ZWQgZnJhbWVyYXRlczoiKTsKKyAgICAgICAgd2hpbGUgKGZwcy0+bnVtKSB7CisgICAgICAgICAgICBwcmludGYoIiAlZC8lZCIsIGZwcy0+bnVtLCBmcHMtPmRlbik7CisgICAgICAgICAgICBmcHMrKzsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICAgIFBSSU5UX0NPREVDX1NVUFBPUlRFRChjLCBwaXhfZm10cywgZW51bSBBVlBpeGVsRm9ybWF0LCAicGl4ZWwgZm9ybWF0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwgR0VUX1BJWF9GTVRfTkFNRSk7CisgICAgUFJJTlRfQ09ERUNfU1VQUE9SVEVEKGMsIHN1cHBvcnRlZF9zYW1wbGVyYXRlcywgaW50LCAic2FtcGxlIHJhdGVzIiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1NBTVBMRV9SQVRFX05BTUUpOworICAgIFBSSU5UX0NPREVDX1NVUFBPUlRFRChjLCBzYW1wbGVfZm10cywgZW51bSBBVlNhbXBsZUZvcm1hdCwgInNhbXBsZSBmb3JtYXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FLCBHRVRfU0FNUExFX0ZNVF9OQU1FKTsKKyAgICBQUklOVF9DT0RFQ19TVVBQT1JURUQoYywgY2hhbm5lbF9sYXlvdXRzLCB1aW50NjRfdCwgImNoYW5uZWwgbGF5b3V0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEdFVF9DSF9MQVlPVVRfREVTQyk7CisKKyAgICBpZiAoYy0+cHJpdl9jbGFzcykgeworICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oYy0+cHJpdl9jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNKTsKKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyIGdldF9tZWRpYV90eXBlX2NoYXIoZW51bSBBVk1lZGlhVHlwZSB0eXBlKQoreworICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzogICAgcmV0dXJuICdWJzsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86ICAgIHJldHVybiAnQSc7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0RBVEE6ICAgICByZXR1cm4gJ0QnOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRTogcmV0dXJuICdTJzsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVDpyZXR1cm4gJ1QnOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc/JzsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjICpuZXh0X2NvZGVjX2Zvcl9pZChlbnVtIEFWQ29kZWNJRCBpZCwgY29uc3QgQVZDb2RlYyAqcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jb2RlcikKK3sKKyAgICB3aGlsZSAoKHByZXYgPSBhdl9jb2RlY19uZXh0KHByZXYpKSkgeworICAgICAgICBpZiAocHJldi0+aWQgPT0gaWQgJiYKKyAgICAgICAgICAgIChlbmNvZGVyID8gYXZfY29kZWNfaXNfZW5jb2RlcihwcmV2KSA6IGF2X2NvZGVjX2lzX2RlY29kZXIocHJldikpKQorICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVfY29kZWNfZGVzYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICogY29uc3QgKmRhID0gYTsKKyAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqIGNvbnN0ICpkYiA9IGI7CisKKyAgICByZXR1cm4gKCpkYSktPnR5cGUgIT0gKCpkYiktPnR5cGUgPyBGRkRJRkZTSUdOKCgqZGEpLT50eXBlLCAoKmRiKS0+dHlwZSkgOgorICAgICAgICAgICBzdHJjbXAoKCpkYSktPm5hbWUsICgqZGIpLT5uYW1lKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGdldF9jb2RlY3Nfc29ydGVkKGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICoqKnJjb2RlY3MpCit7CisgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOworICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICoqY29kZWNzOworICAgIHVuc2lnbmVkIG5iX2NvZGVjcyA9IDAsIGkgPSAwOworCisgICAgd2hpbGUgKChkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX25leHQoZGVzYykpKQorICAgICAgICBuYl9jb2RlY3MrKzsKKyAgICBpZiAoIShjb2RlY3MgPSBhdl9jYWxsb2MobmJfY29kZWNzLCBzaXplb2YoKmNvZGVjcykpKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB9CisgICAgZGVzYyA9IE5VTEw7CisgICAgd2hpbGUgKChkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX25leHQoZGVzYykpKQorICAgICAgICBjb2RlY3NbaSsrXSA9IGRlc2M7CisgICAgYXZfYXNzZXJ0MChpID09IG5iX2NvZGVjcyk7CisgICAgcXNvcnQoY29kZWNzLCBuYl9jb2RlY3MsIHNpemVvZigqY29kZWNzKSwgY29tcGFyZV9jb2RlY19kZXNjKTsKKyAgICAqcmNvZGVjcyA9IGNvZGVjczsKKyAgICByZXR1cm4gbmJfY29kZWNzOworfQorCitzdGF0aWMgdm9pZCBwcmludF9jb2RlY3NfZm9yX2lkKGVudW0gQVZDb2RlY0lEIGlkLCBpbnQgZW5jb2RlcikKK3sKKyAgICBjb25zdCBBVkNvZGVjICpjb2RlYyA9IE5VTEw7CisKKyAgICBwcmludGYoIiAoJXM6ICIsIGVuY29kZXIgPyAiZW5jb2RlcnMiIDogImRlY29kZXJzIik7CisKKyAgICB3aGlsZSAoKGNvZGVjID0gbmV4dF9jb2RlY19mb3JfaWQoaWQsIGNvZGVjLCBlbmNvZGVyKSkpCisgICAgICAgIHByaW50ZigiJXMgIiwgY29kZWMtPm5hbWUpOworCisgICAgcHJpbnRmKCIpIik7Cit9CisKK2ludCBzaG93X2NvZGVjcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICoqY29kZWNzOworICAgIHVuc2lnbmVkIGksIG5iX2NvZGVjcyA9IGdldF9jb2RlY3Nfc29ydGVkKCZjb2RlY3MpOworCisgICAgcHJpbnRmKCJDb2RlY3M6XG4iCisgICAgICAgICAgICIgRC4uLi4uID0gRGVjb2Rpbmcgc3VwcG9ydGVkXG4iCisgICAgICAgICAgICIgLkUuLi4uID0gRW5jb2Rpbmcgc3VwcG9ydGVkXG4iCisgICAgICAgICAgICIgLi5WLi4uID0gVmlkZW8gY29kZWNcbiIKKyAgICAgICAgICAgIiAuLkEuLi4gPSBBdWRpbyBjb2RlY1xuIgorICAgICAgICAgICAiIC4uUy4uLiA9IFN1YnRpdGxlIGNvZGVjXG4iCisgICAgICAgICAgICIgLi4uSS4uID0gSW50cmEgZnJhbWUtb25seSBjb2RlY1xuIgorICAgICAgICAgICAiIC4uLi5MLiA9IExvc3N5IGNvbXByZXNzaW9uXG4iCisgICAgICAgICAgICIgLi4uLi5TID0gTG9zc2xlc3MgY29tcHJlc3Npb25cbiIKKyAgICAgICAgICAgIiAtLS0tLS0tXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfY29kZWNzOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2MgPSBjb2RlY3NbaV07CisgICAgICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjID0gTlVMTDsKKworICAgICAgICBpZiAoc3Ryc3RyKGRlc2MtPm5hbWUsICJfZGVwcmVjYXRlZCIpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcHJpbnRmKCIgIik7CisgICAgICAgIHByaW50ZihhdmNvZGVjX2ZpbmRfZGVjb2RlcihkZXNjLT5pZCkgPyAiRCIgOiAiLiIpOworICAgICAgICBwcmludGYoYXZjb2RlY19maW5kX2VuY29kZXIoZGVzYy0+aWQpID8gIkUiIDogIi4iKTsKKworICAgICAgICBwcmludGYoIiVjIiwgZ2V0X21lZGlhX3R5cGVfY2hhcihkZXNjLT50eXBlKSk7CisgICAgICAgIHByaW50ZigoZGVzYy0+cHJvcHMgJiBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkpID8gIkkiIDogIi4iKTsKKyAgICAgICAgcHJpbnRmKChkZXNjLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfTE9TU1kpICAgICAgPyAiTCIgOiAiLiIpOworICAgICAgICBwcmludGYoKGRlc2MtPnByb3BzICYgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUykgICA/ICJTIiA6ICIuIik7CisKKyAgICAgICAgcHJpbnRmKCIgJS0yMHMgJXMiLCBkZXNjLT5uYW1lLCBkZXNjLT5sb25nX25hbWUgPyBkZXNjLT5sb25nX25hbWUgOiAiIik7CisKKyAgICAgICAgLyogcHJpbnQgZGVjb2RlcnMvZW5jb2RlcnMgd2hlbiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgb3IgdGhlaXIKKyAgICAgICAgICogbmFtZXMgYXJlIGRpZmZlcmVudCBmcm9tIGNvZGVjIG5hbWUgKi8KKyAgICAgICAgd2hpbGUgKChjb2RlYyA9IG5leHRfY29kZWNfZm9yX2lkKGRlc2MtPmlkLCBjb2RlYywgMCkpKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGNvZGVjLT5uYW1lLCBkZXNjLT5uYW1lKSkgeworICAgICAgICAgICAgICAgIHByaW50X2NvZGVjc19mb3JfaWQoZGVzYy0+aWQsIDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvZGVjID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKChjb2RlYyA9IG5leHRfY29kZWNfZm9yX2lkKGRlc2MtPmlkLCBjb2RlYywgMSkpKSB7CisgICAgICAgICAgICBpZiAoc3RyY21wKGNvZGVjLT5uYW1lLCBkZXNjLT5uYW1lKSkgeworICAgICAgICAgICAgICAgIHByaW50X2NvZGVjc19mb3JfaWQoZGVzYy0+aWQsIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgIH0KKyAgICBhdl9mcmVlKGNvZGVjcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NvZGVjcyhpbnQgZW5jb2RlcikKK3sKKyAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqKmNvZGVjczsKKyAgICB1bnNpZ25lZCBpLCBuYl9jb2RlY3MgPSBnZXRfY29kZWNzX3NvcnRlZCgmY29kZWNzKTsKKworICAgIHByaW50ZigiJXM6XG4iCisgICAgICAgICAgICIgVi4uLi4uID0gVmlkZW9cbiIKKyAgICAgICAgICAgIiBBLi4uLi4gPSBBdWRpb1xuIgorICAgICAgICAgICAiIFMuLi4uLiA9IFN1YnRpdGxlXG4iCisgICAgICAgICAgICIgLkYuLi4uID0gRnJhbWUtbGV2ZWwgbXVsdGl0aHJlYWRpbmdcbiIKKyAgICAgICAgICAgIiAuLlMuLi4gPSBTbGljZS1sZXZlbCBtdWx0aXRocmVhZGluZ1xuIgorICAgICAgICAgICAiIC4uLlguLiA9IENvZGVjIGlzIGV4cGVyaW1lbnRhbFxuIgorICAgICAgICAgICAiIC4uLi5CLiA9IFN1cHBvcnRzIGRyYXdfaG9yaXpfYmFuZFxuIgorICAgICAgICAgICAiIC4uLi4uRCA9IFN1cHBvcnRzIGRpcmVjdCByZW5kZXJpbmcgbWV0aG9kIDFcbiIKKyAgICAgICAgICAgIiAtLS0tLS1cbiIsCisgICAgICAgICAgIGVuY29kZXIgPyAiRW5jb2RlcnMiIDogIkRlY29kZXJzIik7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvZGVjczsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjID0gY29kZWNzW2ldOworICAgICAgICBjb25zdCBBVkNvZGVjICpjb2RlYyA9IE5VTEw7CisKKyAgICAgICAgd2hpbGUgKChjb2RlYyA9IG5leHRfY29kZWNfZm9yX2lkKGRlc2MtPmlkLCBjb2RlYywgZW5jb2RlcikpKSB7CisgICAgICAgICAgICBwcmludGYoIiAlYyIsIGdldF9tZWRpYV90eXBlX2NoYXIoZGVzYy0+dHlwZSkpOworICAgICAgICAgICAgcHJpbnRmKChjb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMpID8gIkYiIDogIi4iKTsKKyAgICAgICAgICAgIHByaW50ZigoY29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTKSA/ICJTIiA6ICIuIik7CisgICAgICAgICAgICBwcmludGYoKGNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMKSAgPyAiWCIgOiAiLiIpOworICAgICAgICAgICAgcHJpbnRmKChjb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCk/IkIiIDogIi4iKTsKKyAgICAgICAgICAgIHByaW50ZigoY29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9EUjEpICAgICAgICAgICA/ICJEIiA6ICIuIik7CisKKyAgICAgICAgICAgIHByaW50ZigiICUtMjBzICVzIiwgY29kZWMtPm5hbWUsIGNvZGVjLT5sb25nX25hbWUgPyBjb2RlYy0+bG9uZ19uYW1lIDogIiIpOworICAgICAgICAgICAgaWYgKHN0cmNtcChjb2RlYy0+bmFtZSwgZGVzYy0+bmFtZSkpCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgKGNvZGVjICVzKSIsIGRlc2MtPm5hbWUpOworCisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZShjb2RlY3MpOworfQorCitpbnQgc2hvd19kZWNvZGVycyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIHByaW50X2NvZGVjcygwKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHNob3dfZW5jb2RlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBwcmludF9jb2RlY3MoMSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzaG93X2JzZnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqYnNmID0gTlVMTDsKKyAgICB2b2lkICpvcGFxdWUgPSBOVUxMOworCisgICAgcHJpbnRmKCJCaXRzdHJlYW0gZmlsdGVyczpcbiIpOworICAgIHdoaWxlICgoYnNmID0gYXZfYnNmX2l0ZXJhdGUoJm9wYXF1ZSkpKQorICAgICAgICBwcmludGYoIiVzXG4iLCBic2YtPm5hbWUpOworICAgIHByaW50ZigiXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHNob3dfcHJvdG9jb2xzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgdm9pZCAqb3BhcXVlID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgcHJpbnRmKCJTdXBwb3J0ZWQgZmlsZSBwcm90b2NvbHM6XG4iCisgICAgICAgICAgICJJbnB1dDpcbiIpOworICAgIHdoaWxlICgobmFtZSA9IGF2aW9fZW51bV9wcm90b2NvbHMoJm9wYXF1ZSwgMCkpKQorICAgICAgICBwcmludGYoIiAgJXNcbiIsIG5hbWUpOworICAgIHByaW50ZigiT3V0cHV0OlxuIik7CisgICAgd2hpbGUgKChuYW1lID0gYXZpb19lbnVtX3Byb3RvY29scygmb3BhcXVlLCAxKSkpCisgICAgICAgIHByaW50ZigiICAlc1xuIiwgbmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzaG93X2ZpbHRlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyNpZiBDT05GSUdfQVZGSUxURVIKKyAgICBjb25zdCBBVkZpbHRlciAqZmlsdGVyID0gTlVMTDsKKyAgICBjaGFyIGRlc2NyWzY0XSwgKmRlc2NyX2N1cjsKKyAgICB2b2lkICpvcGFxdWUgPSBOVUxMOworICAgIGludCBpLCBqOworICAgIGNvbnN0IEFWRmlsdGVyUGFkICpwYWQ7CisKKyAgICBwcmludGYoIkZpbHRlcnM6XG4iCisgICAgICAgICAgICIgIFQuLiA9IFRpbWVsaW5lIHN1cHBvcnRcbiIKKyAgICAgICAgICAgIiAgLlMuID0gU2xpY2UgdGhyZWFkaW5nXG4iCisgICAgICAgICAgICIgIC4uQyA9IENvbW1hbmQgc3VwcG9ydFxuIgorICAgICAgICAgICAiICBBID0gQXVkaW8gaW5wdXQvb3V0cHV0XG4iCisgICAgICAgICAgICIgIFYgPSBWaWRlbyBpbnB1dC9vdXRwdXRcbiIKKyAgICAgICAgICAgIiAgTiA9IER5bmFtaWMgbnVtYmVyIGFuZC9vciB0eXBlIG9mIGlucHV0L291dHB1dFxuIgorICAgICAgICAgICAiICB8ID0gU291cmNlIG9yIHNpbmsgZmlsdGVyXG4iKTsKKyAgICB3aGlsZSAoKGZpbHRlciA9IGF2X2ZpbHRlcl9pdGVyYXRlKCZvcGFxdWUpKSkgeworICAgICAgICBkZXNjcl9jdXIgPSBkZXNjcjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgICAqKGRlc2NyX2N1cisrKSA9ICctJzsKKyAgICAgICAgICAgICAgICAqKGRlc2NyX2N1cisrKSA9ICc+JzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhZCA9IGkgPyBmaWx0ZXItPm91dHB1dHMgOiBmaWx0ZXItPmlucHV0czsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IHBhZCAmJiBhdmZpbHRlcl9wYWRfZ2V0X25hbWUocGFkLCBqKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlc2NyX2N1ciA+PSBkZXNjciArIHNpemVvZihkZXNjcikgLSA0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAqKGRlc2NyX2N1cisrKSA9IGdldF9tZWRpYV90eXBlX2NoYXIoYXZmaWx0ZXJfcGFkX2dldF90eXBlKHBhZCwgaikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFqKQorICAgICAgICAgICAgICAgICooZGVzY3JfY3VyKyspID0gKCghaSAmJiAoZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaSAmJiAoZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19PVVRQVVRTKSkpID8gJ04nIDogJ3wnOworICAgICAgICB9CisgICAgICAgICpkZXNjcl9jdXIgPSAwOworICAgICAgICBwcmludGYoIiAlYyVjJWMgJS0xN3MgJS0xMHMgJXNcbiIsCisgICAgICAgICAgICAgICBmaWx0ZXItPmZsYWdzICYgQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FID8gJ1QnIDogJy4nLAorICAgICAgICAgICAgICAgZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUyAgICA/ICdTJyA6ICcuJywKKyAgICAgICAgICAgICAgIGZpbHRlci0+cHJvY2Vzc19jb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgPyAnQycgOiAnLicsCisgICAgICAgICAgICAgICBmaWx0ZXItPm5hbWUsIGRlc2NyLCBmaWx0ZXItPmRlc2NyaXB0aW9uKTsKKyAgICB9CisjZWxzZQorICAgIHByaW50ZigiTm8gZmlsdGVycyBhdmFpbGFibGU6IGxpYmF2ZmlsdGVyIGRpc2FibGVkXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiAwOworfQorCitpbnQgc2hvd19jb2xvcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIGNvbnN0IHVpbnQ4X3QgKnJnYjsKKyAgICBpbnQgaTsKKworICAgIHByaW50ZigiJS0zMnMgI1JSR0dCQlxuIiwgIm5hbWUiKTsKKworICAgIGZvciAoaSA9IDA7IG5hbWUgPSBhdl9nZXRfa25vd25fY29sb3JfbmFtZShpLCAmcmdiKTsgaSsrKQorICAgICAgICBwcmludGYoIiUtMzJzICMlMDJ4JTAyeCUwMnhcbiIsIG5hbWUsIHJnYlswXSwgcmdiWzFdLCByZ2JbMl0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzaG93X3BpeF9mbXRzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYyA9IE5VTEw7CisKKyAgICBwcmludGYoIlBpeGVsIGZvcm1hdHM6XG4iCisgICAgICAgICAgICJJLi4uLiA9IFN1cHBvcnRlZCBJbnB1dCAgZm9ybWF0IGZvciBjb252ZXJzaW9uXG4iCisgICAgICAgICAgICIuTy4uLiA9IFN1cHBvcnRlZCBPdXRwdXQgZm9ybWF0IGZvciBjb252ZXJzaW9uXG4iCisgICAgICAgICAgICIuLkguLiA9IEhhcmR3YXJlIGFjY2VsZXJhdGVkIGZvcm1hdFxuIgorICAgICAgICAgICAiLi4uUC4gPSBQYWxldHRlZCBmb3JtYXRcbiIKKyAgICAgICAgICAgIi4uLi5CID0gQml0c3RyZWFtIGZvcm1hdFxuIgorICAgICAgICAgICAiRkxBR1MgTkFNRSAgICAgICAgICAgIE5CX0NPTVBPTkVOVFMgQklUU19QRVJfUElYRUxcbiIKKyAgICAgICAgICAgIi0tLS0tXG4iKTsKKworI2lmICFDT05GSUdfU1dTQ0FMRQorIyAgIGRlZmluZSBzd3NfaXNTdXBwb3J0ZWRJbnB1dCh4KSAgMAorIyAgIGRlZmluZSBzd3NfaXNTdXBwb3J0ZWRPdXRwdXQoeCkgMAorI2VuZGlmCisKKyAgICB3aGlsZSAoKHBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX25leHQocGl4X2Rlc2MpKSkgeworICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgYXZfdW51c2VkIHBpeF9mbXQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0X2lkKHBpeF9kZXNjKTsKKyAgICAgICAgcHJpbnRmKCIlYyVjJWMlYyVjICUtMTZzICAgICAgICVkICAgICAgICAgICAgJTJkXG4iLAorICAgICAgICAgICAgICAgc3dzX2lzU3VwcG9ydGVkSW5wdXQgKHBpeF9mbXQpICAgICAgICAgICAgICA/ICdJJyA6ICcuJywKKyAgICAgICAgICAgICAgIHN3c19pc1N1cHBvcnRlZE91dHB1dChwaXhfZm10KSAgICAgICAgICAgICAgPyAnTycgOiAnLicsCisgICAgICAgICAgICAgICBwaXhfZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCAgID8gJ0gnIDogJy4nLAorICAgICAgICAgICAgICAgcGl4X2Rlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCAgICAgICA/ICdQJyA6ICcuJywKKyAgICAgICAgICAgICAgIHBpeF9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0gPyAnQicgOiAnLicsCisgICAgICAgICAgICAgICBwaXhfZGVzYy0+bmFtZSwKKyAgICAgICAgICAgICAgIHBpeF9kZXNjLT5uYl9jb21wb25lbnRzLAorICAgICAgICAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKHBpeF9kZXNjKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgc2hvd19sYXlvdXRzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgaW50IGkgPSAwOworICAgIHVpbnQ2NF90IGxheW91dCwgajsKKyAgICBjb25zdCBjaGFyICpuYW1lLCAqZGVzY3I7CisKKyAgICBwcmludGYoIkluZGl2aWR1YWwgY2hhbm5lbHM6XG4iCisgICAgICAgICAgICJOQU1FICAgICAgICAgICBERVNDUklQVElPTlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IDYzOyBpKyspIHsKKyAgICAgICAgbmFtZSA9IGF2X2dldF9jaGFubmVsX25hbWUoKHVpbnQ2NF90KTEgPDwgaSk7CisgICAgICAgIGlmICghbmFtZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBkZXNjciA9IGF2X2dldF9jaGFubmVsX2Rlc2NyaXB0aW9uKCh1aW50NjRfdCkxIDw8IGkpOworICAgICAgICBwcmludGYoIiUtMTRzICVzXG4iLCBuYW1lLCBkZXNjcik7CisgICAgfQorICAgIHByaW50ZigiXG5TdGFuZGFyZCBjaGFubmVsIGxheW91dHM6XG4iCisgICAgICAgICAgICJOQU1FICAgICAgICAgICBERUNPTVBPU0lUSU9OXG4iKTsKKyAgICBmb3IgKGkgPSAwOyAhYXZfZ2V0X3N0YW5kYXJkX2NoYW5uZWxfbGF5b3V0KGksICZsYXlvdXQsICZuYW1lKTsgaSsrKSB7CisgICAgICAgIGlmIChuYW1lKSB7CisgICAgICAgICAgICBwcmludGYoIiUtMTRzICIsIG5hbWUpOworICAgICAgICAgICAgZm9yIChqID0gMTsgajsgaiA8PD0gMSkKKyAgICAgICAgICAgICAgICBpZiAoKGxheW91dCAmIGopKQorICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzJXMiLCAobGF5b3V0ICYgKGogLSAxKSkgPyAiKyIgOiAiIiwgYXZfZ2V0X2NoYW5uZWxfbmFtZShqKSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBzaG93X3NhbXBsZV9mbXRzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgaW50IGk7CisgICAgY2hhciBmbXRfc3RyWzEyOF07CisgICAgZm9yIChpID0gLTE7IGkgPCBBVl9TQU1QTEVfRk1UX05COyBpKyspCisgICAgICAgIHByaW50ZigiJXNcbiIsIGF2X2dldF9zYW1wbGVfZm10X3N0cmluZyhmbXRfc3RyLCBzaXplb2YoZm10X3N0ciksIGkpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2hvd19oZWxwX2NvZGVjKGNvbnN0IGNoYXIgKm5hbWUsIGludCBlbmNvZGVyKQoreworICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjOworICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjOworCisgICAgaWYgKCFuYW1lKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJObyBjb2RlYyBuYW1lIHNwZWNpZmllZC5cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29kZWMgPSBlbmNvZGVyID8gYXZjb2RlY19maW5kX2VuY29kZXJfYnlfbmFtZShuYW1lKSA6CisgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19maW5kX2RlY29kZXJfYnlfbmFtZShuYW1lKTsKKworICAgIGlmIChjb2RlYykKKyAgICAgICAgcHJpbnRfY29kZWMoY29kZWMpOworICAgIGVsc2UgaWYgKChkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldF9ieV9uYW1lKG5hbWUpKSkgeworICAgICAgICBpbnQgcHJpbnRlZCA9IDA7CisKKyAgICAgICAgd2hpbGUgKChjb2RlYyA9IG5leHRfY29kZWNfZm9yX2lkKGRlc2MtPmlkLCBjb2RlYywgZW5jb2RlcikpKSB7CisgICAgICAgICAgICBwcmludGVkID0gMTsKKyAgICAgICAgICAgIHByaW50X2NvZGVjKGNvZGVjKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcHJpbnRlZCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvZGVjICclcycgaXMga25vd24gdG8gRkZtcGVnLCAiCisgICAgICAgICAgICAgICAgICAgImJ1dCBubyAlcyBmb3IgaXQgYXJlIGF2YWlsYWJsZS4gRkZtcGVnIG1pZ2h0IG5lZWQgdG8gYmUgIgorICAgICAgICAgICAgICAgICAgICJyZWNvbXBpbGVkIHdpdGggYWRkaXRpb25hbCBleHRlcm5hbCBsaWJyYXJpZXMuXG4iLAorICAgICAgICAgICAgICAgICAgIG5hbWUsIGVuY29kZXIgPyAiZW5jb2RlcnMiIDogImRlY29kZXJzIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ29kZWMgJyVzJyBpcyBub3QgcmVjb2duaXplZCBieSBGRm1wZWcuXG4iLAorICAgICAgICAgICAgICAgbmFtZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzaG93X2hlbHBfZGVtdXhlcihjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNvbnN0IEFWSW5wdXRGb3JtYXQgKmZtdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KG5hbWUpOworCisgICAgaWYgKCFmbXQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gZm9ybWF0ICclcycuXG4iLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByaW50ZigiRGVtdXhlciAlcyBbJXNdOlxuIiwgZm10LT5uYW1lLCBmbXQtPmxvbmdfbmFtZSk7CisKKyAgICBpZiAoZm10LT5leHRlbnNpb25zKQorICAgICAgICBwcmludGYoIiAgICBDb21tb24gZXh0ZW5zaW9uczogJXMuXG4iLCBmbXQtPmV4dGVuc2lvbnMpOworCisgICAgaWYgKGZtdC0+cHJpdl9jbGFzcykKKyAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKGZtdC0+cHJpdl9jbGFzcywgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0pOworfQorCitzdGF0aWMgdm9pZCBzaG93X2hlbHBfbXV4ZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqZGVzYzsKKyAgICBjb25zdCBBVk91dHB1dEZvcm1hdCAqZm10ID0gYXZfZ3Vlc3NfZm9ybWF0KG5hbWUsIE5VTEwsIE5VTEwpOworCisgICAgaWYgKCFmbXQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gZm9ybWF0ICclcycuXG4iLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByaW50ZigiTXV4ZXIgJXMgWyVzXTpcbiIsIGZtdC0+bmFtZSwgZm10LT5sb25nX25hbWUpOworCisgICAgaWYgKGZtdC0+ZXh0ZW5zaW9ucykKKyAgICAgICAgcHJpbnRmKCIgICAgQ29tbW9uIGV4dGVuc2lvbnM6ICVzLlxuIiwgZm10LT5leHRlbnNpb25zKTsKKyAgICBpZiAoZm10LT5taW1lX3R5cGUpCisgICAgICAgIHByaW50ZigiICAgIE1pbWUgdHlwZTogJXMuXG4iLCBmbXQtPm1pbWVfdHlwZSk7CisgICAgaWYgKGZtdC0+dmlkZW9fY29kZWMgIT0gQVZfQ09ERUNfSURfTk9ORSAmJgorICAgICAgICAoZGVzYyA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoZm10LT52aWRlb19jb2RlYykpKSB7CisgICAgICAgIHByaW50ZigiICAgIERlZmF1bHQgdmlkZW8gY29kZWM6ICVzLlxuIiwgZGVzYy0+bmFtZSk7CisgICAgfQorICAgIGlmIChmbXQtPmF1ZGlvX2NvZGVjICE9IEFWX0NPREVDX0lEX05PTkUgJiYKKyAgICAgICAgKGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGZtdC0+YXVkaW9fY29kZWMpKSkgeworICAgICAgICBwcmludGYoIiAgICBEZWZhdWx0IGF1ZGlvIGNvZGVjOiAlcy5cbiIsIGRlc2MtPm5hbWUpOworICAgIH0KKyAgICBpZiAoZm10LT5zdWJ0aXRsZV9jb2RlYyAhPSBBVl9DT0RFQ19JRF9OT05FICYmCisgICAgICAgIChkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChmbXQtPnN1YnRpdGxlX2NvZGVjKSkpIHsKKyAgICAgICAgcHJpbnRmKCIgICAgRGVmYXVsdCBzdWJ0aXRsZSBjb2RlYzogJXMuXG4iLCBkZXNjLT5uYW1lKTsKKyAgICB9CisKKyAgICBpZiAoZm10LT5wcml2X2NsYXNzKQorICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oZm10LT5wcml2X2NsYXNzLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSk7Cit9CisKKyNpZiBDT05GSUdfQVZGSUxURVIKK3N0YXRpYyB2b2lkIHNob3dfaGVscF9maWx0ZXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKyNpZiBDT05GSUdfQVZGSUxURVIKKyAgICBjb25zdCBBVkZpbHRlciAqZiA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKG5hbWUpOworICAgIGludCBpLCBjb3VudDsKKworICAgIGlmICghbmFtZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTm8gZmlsdGVyIG5hbWUgc3BlY2lmaWVkLlxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKCFmKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGZpbHRlciAnJXMnLlxuIiwgbmFtZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwcmludGYoIkZpbHRlciAlc1xuIiwgZi0+bmFtZSk7CisgICAgaWYgKGYtPmRlc2NyaXB0aW9uKQorICAgICAgICBwcmludGYoIiAgJXNcbiIsIGYtPmRlc2NyaXB0aW9uKTsKKworICAgIGlmIChmLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUykKKyAgICAgICAgcHJpbnRmKCIgICAgc2xpY2UgdGhyZWFkaW5nIHN1cHBvcnRlZFxuIik7CisKKyAgICBwcmludGYoIiAgICBJbnB1dHM6XG4iKTsKKyAgICBjb3VudCA9IGF2ZmlsdGVyX3BhZF9jb3VudChmLT5pbnB1dHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHByaW50ZigiICAgICAgICMlZDogJXMgKCVzKVxuIiwgaSwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKGYtPmlucHV0cywgaSksCisgICAgICAgICAgICAgICBtZWRpYV90eXBlX3N0cmluZyhhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoZi0+aW5wdXRzLCBpKSkpOworICAgIH0KKyAgICBpZiAoZi0+ZmxhZ3MgJiBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTKQorICAgICAgICBwcmludGYoIiAgICAgICAgZHluYW1pYyAoZGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zKVxuIik7CisgICAgZWxzZSBpZiAoIWNvdW50KQorICAgICAgICBwcmludGYoIiAgICAgICAgbm9uZSAoc291cmNlIGZpbHRlcilcbiIpOworCisgICAgcHJpbnRmKCIgICAgT3V0cHV0czpcbiIpOworICAgIGNvdW50ID0gYXZmaWx0ZXJfcGFkX2NvdW50KGYtPm91dHB1dHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIHByaW50ZigiICAgICAgICMlZDogJXMgKCVzKVxuIiwgaSwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKGYtPm91dHB1dHMsIGkpLAorICAgICAgICAgICAgICAgbWVkaWFfdHlwZV9zdHJpbmcoYXZmaWx0ZXJfcGFkX2dldF90eXBlKGYtPm91dHB1dHMsIGkpKSk7CisgICAgfQorICAgIGlmIChmLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19PVVRQVVRTKQorICAgICAgICBwcmludGYoIiAgICAgICAgZHluYW1pYyAoZGVwZW5kaW5nIG9uIHRoZSBvcHRpb25zKVxuIik7CisgICAgZWxzZSBpZiAoIWNvdW50KQorICAgICAgICBwcmludGYoIiAgICAgICAgbm9uZSAoc2luayBmaWx0ZXIpXG4iKTsKKworICAgIGlmIChmLT5wcml2X2NsYXNzKQorICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oZi0+cHJpdl9jbGFzcywgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0pOworICAgIGlmIChmLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORSkKKyAgICAgICAgcHJpbnRmKCJUaGlzIGZpbHRlciBoYXMgc3VwcG9ydCBmb3IgdGltZWxpbmUgdGhyb3VnaCB0aGUgJ2VuYWJsZScgb3B0aW9uLlxuIik7CisjZWxzZQorICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJCdWlsZCB3aXRob3V0IGxpYmF2ZmlsdGVyOyAiCisgICAgICAgICAgICJjYW4gbm90IHRvIHNhdGlzZnkgcmVxdWVzdFxuIik7CisjZW5kaWYKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzaG93X2hlbHBfYnNmKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmJzZiA9IGF2X2JzZl9nZXRfYnlfbmFtZShuYW1lKTsKKworICAgIGlmICghYnNmKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGJpdCBzdHJlYW0gZmlsdGVyICclcycuXG4iLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHByaW50ZigiQml0IHN0cmVhbSBmaWx0ZXIgJXNcbiIsIGJzZi0+bmFtZSk7CisgICAgUFJJTlRfQ09ERUNfU1VQUE9SVEVEKGJzZiwgY29kZWNfaWRzLCBlbnVtIEFWQ29kZWNJRCwgImNvZGVjcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX05PTkUsIEdFVF9DT0RFQ19OQU1FKTsKKyAgICBpZiAoYnNmLT5wcml2X2NsYXNzKQorICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oYnNmLT5wcml2X2NsYXNzLCBBVl9PUFRfRkxBR19CU0ZfUEFSQU0pOworfQorCitpbnQgc2hvd19oZWxwKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgY2hhciAqdG9waWMsICpwYXI7CisgICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfaGVscCk7CisKKyAgICB0b3BpYyA9IGF2X3N0cmR1cChhcmcgPyBhcmcgOiAiIik7CisgICAgaWYgKCF0b3BpYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBwYXIgPSBzdHJjaHIodG9waWMsICc9Jyk7CisgICAgaWYgKHBhcikKKyAgICAgICAgKnBhcisrID0gMDsKKworICAgIGlmICghKnRvcGljKSB7CisgICAgICAgIHNob3dfaGVscF9kZWZhdWx0KHRvcGljLCBwYXIpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcCh0b3BpYywgImRlY29kZXIiKSkgeworICAgICAgICBzaG93X2hlbHBfY29kZWMocGFyLCAwKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG9waWMsICJlbmNvZGVyIikpIHsKKyAgICAgICAgc2hvd19oZWxwX2NvZGVjKHBhciwgMSk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKHRvcGljLCAiZGVtdXhlciIpKSB7CisgICAgICAgIHNob3dfaGVscF9kZW11eGVyKHBhcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKHRvcGljLCAibXV4ZXIiKSkgeworICAgICAgICBzaG93X2hlbHBfbXV4ZXIocGFyKTsKKyNpZiBDT05GSUdfQVZGSUxURVIKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG9waWMsICJmaWx0ZXIiKSkgeworICAgICAgICBzaG93X2hlbHBfZmlsdGVyKHBhcik7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAodG9waWMsICJic2YiKSkgeworICAgICAgICBzaG93X2hlbHBfYnNmKHBhcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2hvd19oZWxwX2RlZmF1bHQodG9waWMsIHBhcik7CisgICAgfQorCisgICAgYXZfZnJlZXAoJnRvcGljKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IHJlYWRfeWVzbm8odm9pZCkKK3sKKyAgICBpbnQgYyA9IGdldGNoYXIoKTsKKyAgICBpbnQgeWVzbm8gPSAoYXZfdG91cHBlcihjKSA9PSAnWScpOworCisgICAgd2hpbGUgKGMgIT0gJ1xuJyAmJiBjICE9IEVPRikKKyAgICAgICAgYyA9IGdldGNoYXIoKTsKKworICAgIHJldHVybiB5ZXNubzsKK30KKworRklMRSAqZ2V0X3ByZXNldF9maWxlKGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgZmlsZW5hbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcmVzZXRfbmFtZSwgaW50IGlzX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29kZWNfbmFtZSkKK3sKKyAgICBGSUxFICpmID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBjb25zdCBjaGFyICpiYXNlWzNdID0geyBnZXRlbnYoIkZGTVBFR19EQVRBRElSIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0ZW52KCJIT01FIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNUEVHX0RBVEFESVIsIH07CisKKyAgICBpZiAoaXNfcGF0aCkgeworICAgICAgICBhdl9zdHJsY3B5KGZpbGVuYW1lLCBwcmVzZXRfbmFtZSwgZmlsZW5hbWVfc2l6ZSk7CisgICAgICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIF9XSU4zMgorICAgICAgICBjaGFyIGRhdGFkaXJbTUFYX1BBVEhdLCAqbHM7CisgICAgICAgIGJhc2VbMl0gPSBOVUxMOworCisgICAgICAgIGlmIChHZXRNb2R1bGVGaWxlTmFtZUEoR2V0TW9kdWxlSGFuZGxlQShOVUxMKSwgZGF0YWRpciwgc2l6ZW9mKGRhdGFkaXIpIC0gMSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAobHMgPSBkYXRhZGlyOyBscyA8IGRhdGFkaXIgKyBzdHJsZW4oZGF0YWRpcik7IGxzKyspCisgICAgICAgICAgICAgICAgaWYgKCpscyA9PSAnXFwnKSAqbHMgPSAnLyc7CisKKyAgICAgICAgICAgIGlmIChscyA9IHN0cnJjaHIoZGF0YWRpciwgJy8nKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqbHMgPSAwOworICAgICAgICAgICAgICAgIHN0cm5jYXQoZGF0YWRpciwgIi9mZnByZXNldHMiLCAgc2l6ZW9mKGRhdGFkaXIpIC0gMSAtIHN0cmxlbihkYXRhZGlyKSk7CisgICAgICAgICAgICAgICAgYmFzZVsyXSA9IGRhdGFkaXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMyAmJiAhZjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWJhc2VbaV0pCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgZmlsZW5hbWVfc2l6ZSwgIiVzJXMvJXMuZmZwcmVzZXQiLCBiYXNlW2ldLAorICAgICAgICAgICAgICAgICAgICAgaSAhPSAxID8gIiIgOiAiLy5mZm1wZWciLCBwcmVzZXRfbmFtZSk7CisgICAgICAgICAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgICAgICAgICBpZiAoIWYgJiYgY29kZWNfbmFtZSkgeworICAgICAgICAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBmaWxlbmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyVzLyVzLSVzLmZmcHJlc2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlW2ldLCBpICE9IDEgPyAiIiA6ICIvLmZmbXBlZyIsIGNvZGVjX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2V0X25hbWUpOworICAgICAgICAgICAgICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgInIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmOworfQorCitpbnQgY2hlY2tfc3RyZWFtX3NwZWNpZmllcihBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgY29uc3QgY2hhciAqc3BlYykKK3sKKyAgICBpbnQgcmV0ID0gYXZmb3JtYXRfbWF0Y2hfc3RyZWFtX3NwZWNpZmllcihzLCBzdCwgc3BlYyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN0cmVhbSBzcGVjaWZpZXI6ICVzLlxuIiwgc3BlYyk7CisgICAgcmV0dXJuIHJldDsKK30KKworQVZEaWN0aW9uYXJ5ICpmaWx0ZXJfY29kZWNfb3B0cyhBVkRpY3Rpb25hcnkgKm9wdHMsIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgQVZDb2RlYyAqY29kZWMpCit7CisgICAgQVZEaWN0aW9uYXJ5ICAgICpyZXQgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICBmbGFncyA9IHMtPm9mb3JtYXQgPyBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNOworICAgIGNoYXIgICAgICAgICAgcHJlZml4ID0gMDsKKyAgICBjb25zdCBBVkNsYXNzICAgICpjYyA9IGF2Y29kZWNfZ2V0X2NsYXNzKCk7CisKKyAgICBpZiAoIWNvZGVjKQorICAgICAgICBjb2RlYyAgICAgICAgICAgID0gcy0+b2Zvcm1hdCA/IGF2Y29kZWNfZmluZF9lbmNvZGVyKGNvZGVjX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF2Y29kZWNfZmluZF9kZWNvZGVyKGNvZGVjX2lkKTsKKworICAgIHN3aXRjaCAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIHByZWZpeCAgPSAndic7CisgICAgICAgIGZsYWdzICB8PSBBVl9PUFRfRkxBR19WSURFT19QQVJBTTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIHByZWZpeCAgPSAnYSc7CisgICAgICAgIGZsYWdzICB8PSBBVl9PUFRfRkxBR19BVURJT19QQVJBTTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgIHByZWZpeCAgPSAncyc7CisgICAgICAgIGZsYWdzICB8PSBBVl9PUFRfRkxBR19TVUJUSVRMRV9QQVJBTTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgd2hpbGUgKHQgPSBhdl9kaWN0X2dldChvcHRzLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkgeworICAgICAgICBjaGFyICpwID0gc3RyY2hyKHQtPmtleSwgJzonKTsKKworICAgICAgICAvKiBjaGVjayBzdHJlYW0gc3BlY2lmaWNhdGlvbiBpbiBvcHQgbmFtZSAqLworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgIHN3aXRjaCAoY2hlY2tfc3RyZWFtX3NwZWNpZmllcihzLCBzdCwgcCArIDEpKSB7CisgICAgICAgICAgICBjYXNlICAxOiAqcCA9IDA7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAgMDogICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgfQorCisgICAgICAgIGlmIChhdl9vcHRfZmluZCgmY2MsIHQtPmtleSwgTlVMTCwgZmxhZ3MsIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopIHx8CisgICAgICAgICAgICAhY29kZWMgfHwKKyAgICAgICAgICAgIChjb2RlYy0+cHJpdl9jbGFzcyAmJgorICAgICAgICAgICAgIGF2X29wdF9maW5kKCZjb2RlYy0+cHJpdl9jbGFzcywgdC0+a2V5LCBOVUxMLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKSkpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcmV0LCB0LT5rZXksIHQtPnZhbHVlLCAwKTsKKyAgICAgICAgZWxzZSBpZiAodC0+a2V5WzBdID09IHByZWZpeCAmJgorICAgICAgICAgICAgICAgICBhdl9vcHRfZmluZCgmY2MsIHQtPmtleSArIDEsIE5VTEwsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKSkKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZyZXQsIHQtPmtleSArIDEsIHQtPnZhbHVlLCAwKTsKKworICAgICAgICBpZiAocCkKKyAgICAgICAgICAgICpwID0gJzonOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitBVkRpY3Rpb25hcnkgKipzZXR1cF9maW5kX3N0cmVhbV9pbmZvX29wdHMoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqY29kZWNfb3B0cykKK3sKKyAgICBpbnQgaTsKKyAgICBBVkRpY3Rpb25hcnkgKipvcHRzOworCisgICAgaWYgKCFzLT5uYl9zdHJlYW1zKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBvcHRzID0gYXZfbWFsbG9jel9hcnJheShzLT5uYl9zdHJlYW1zLCBzaXplb2YoKm9wdHMpKTsKKyAgICBpZiAoIW9wdHMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2MgbWVtb3J5IGZvciBzdHJlYW0gb3B0aW9ucy5cbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgb3B0c1tpXSA9IGZpbHRlcl9jb2RlY19vcHRzKGNvZGVjX29wdHMsIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIHMtPnN0cmVhbXNbaV0sIE5VTEwpOworICAgIHJldHVybiBvcHRzOworfQorCit2b2lkICpncm93X2FycmF5KHZvaWQgKmFycmF5LCBpbnQgZWxlbV9zaXplLCBpbnQgKnNpemUsIGludCBuZXdfc2l6ZSkKK3sKKyAgICBpZiAobmV3X3NpemUgPj0gSU5UX01BWCAvIGVsZW1fc2l6ZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQXJyYXkgdG9vIGJpZy5cbiIpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorICAgIGlmICgqc2l6ZSA8IG5ld19zaXplKSB7CisgICAgICAgIHVpbnQ4X3QgKnRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoYXJyYXksIG5ld19zaXplLCBlbGVtX3NpemUpOworICAgICAgICBpZiAoIXRtcCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvYyBidWZmZXIuXG4iKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQodG1wICsgKnNpemUqZWxlbV9zaXplLCAwLCAobmV3X3NpemUtKnNpemUpICogZWxlbV9zaXplKTsKKyAgICAgICAgKnNpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisgICAgcmV0dXJuIGFycmF5OworfQorCitkb3VibGUgZ2V0X3JvdGF0aW9uKEFWU3RyZWFtICpzdCkKK3sKKyAgICB1aW50OF90KiBkaXNwbGF5bWF0cml4ID0gYXZfc3RyZWFtX2dldF9zaWRlX2RhdGEoc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVgsIE5VTEwpOworICAgIGRvdWJsZSB0aGV0YSA9IDA7CisgICAgaWYgKGRpc3BsYXltYXRyaXgpCisgICAgICAgIHRoZXRhID0gLWF2X2Rpc3BsYXlfcm90YXRpb25fZ2V0KChpbnQzMl90KikgZGlzcGxheW1hdHJpeCk7CisKKyAgICB0aGV0YSAtPSAzNjAqZmxvb3IodGhldGEvMzYwICsgMC45LzM2MCk7CisKKyAgICBpZiAoZmFicyh0aGV0YSAtIDkwKnJvdW5kKHRoZXRhLzkwKSkgPiAyKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJPZGQgcm90YXRpb24gYW5nbGUuXG4iCisgICAgICAgICAgICAgICAiSWYgeW91IHdhbnQgdG8gaGVscCwgdXBsb2FkIGEgc2FtcGxlICIKKyAgICAgICAgICAgICAgICJvZiB0aGlzIGZpbGUgdG8gZnRwOi8vdXBsb2FkLmZmbXBlZy5vcmcvaW5jb21pbmcvICIKKyAgICAgICAgICAgICAgICJhbmQgY29udGFjdCB0aGUgZmZtcGVnLWRldmVsIG1haWxpbmcgbGlzdC4gKGZmbXBlZy1kZXZlbEBmZm1wZWcub3JnKSIpOworCisgICAgcmV0dXJuIHRoZXRhOworfQorCisjaWYgQ09ORklHX0FWREVWSUNFCitzdGF0aWMgaW50IHByaW50X2RldmljZV9zb3VyY2VzKEFWSW5wdXRGb3JtYXQgKmZtdCwgQVZEaWN0aW9uYXJ5ICpvcHRzKQoreworICAgIGludCByZXQsIGk7CisgICAgQVZEZXZpY2VJbmZvTGlzdCAqZGV2aWNlX2xpc3QgPSBOVUxMOworCisgICAgaWYgKCFmbXQgfHwgIWZtdC0+cHJpdl9jbGFzcyAgfHwgIUFWX0lTX0lOUFVUX0RFVklDRShmbXQtPnByaXZfY2xhc3MtPmNhdGVnb3J5KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHByaW50ZigiQXV0by1kZXRlY3RlZCBzb3VyY2VzIGZvciAlczpcbiIsIGZtdC0+bmFtZSk7CisgICAgaWYgKCFmbXQtPmdldF9kZXZpY2VfbGlzdCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGxpc3Qgc291cmNlcy4gTm90IGltcGxlbWVudGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2ZGV2aWNlX2xpc3RfaW5wdXRfc291cmNlcyhmbXQsIE5VTEwsIG9wdHMsICZkZXZpY2VfbGlzdCkpIDwgMCkgeworICAgICAgICBwcmludGYoIkNhbm5vdCBsaXN0IHNvdXJjZXMuXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXZpY2VfbGlzdC0+bmJfZGV2aWNlczsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgWyVzXVxuIiwgZGV2aWNlX2xpc3QtPmRlZmF1bHRfZGV2aWNlID09IGkgPyAiKiIgOiAiICIsCisgICAgICAgICAgICAgICBkZXZpY2VfbGlzdC0+ZGV2aWNlc1tpXS0+ZGV2aWNlX25hbWUsIGRldmljZV9saXN0LT5kZXZpY2VzW2ldLT5kZXZpY2VfZGVzY3JpcHRpb24pOworICAgIH0KKworICBmYWlsOgorICAgIGF2ZGV2aWNlX2ZyZWVfbGlzdF9kZXZpY2VzKCZkZXZpY2VfbGlzdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwcmludF9kZXZpY2Vfc2lua3MoQVZPdXRwdXRGb3JtYXQgKmZtdCwgQVZEaWN0aW9uYXJ5ICpvcHRzKQoreworICAgIGludCByZXQsIGk7CisgICAgQVZEZXZpY2VJbmZvTGlzdCAqZGV2aWNlX2xpc3QgPSBOVUxMOworCisgICAgaWYgKCFmbXQgfHwgIWZtdC0+cHJpdl9jbGFzcyAgfHwgIUFWX0lTX09VVFBVVF9ERVZJQ0UoZm10LT5wcml2X2NsYXNzLT5jYXRlZ29yeSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBwcmludGYoIkF1dG8tZGV0ZWN0ZWQgc2lua3MgZm9yICVzOlxuIiwgZm10LT5uYW1lKTsKKyAgICBpZiAoIWZtdC0+Z2V0X2RldmljZV9saXN0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgbGlzdCBzaW5rcy4gTm90IGltcGxlbWVudGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2ZGV2aWNlX2xpc3Rfb3V0cHV0X3NpbmtzKGZtdCwgTlVMTCwgb3B0cywgJmRldmljZV9saXN0KSkgPCAwKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IGxpc3Qgc2lua3MuXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXZpY2VfbGlzdC0+bmJfZGV2aWNlczsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJXMgJXMgWyVzXVxuIiwgZGV2aWNlX2xpc3QtPmRlZmF1bHRfZGV2aWNlID09IGkgPyAiKiIgOiAiICIsCisgICAgICAgICAgICAgICBkZXZpY2VfbGlzdC0+ZGV2aWNlc1tpXS0+ZGV2aWNlX25hbWUsIGRldmljZV9saXN0LT5kZXZpY2VzW2ldLT5kZXZpY2VfZGVzY3JpcHRpb24pOworICAgIH0KKworICBmYWlsOgorICAgIGF2ZGV2aWNlX2ZyZWVfbGlzdF9kZXZpY2VzKCZkZXZpY2VfbGlzdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzaG93X3NpbmtzX3NvdXJjZXNfcGFyc2VfYXJnKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmRldiwgQVZEaWN0aW9uYXJ5ICoqb3B0cykKK3sKKyAgICBpbnQgcmV0OworICAgIGlmIChhcmcpIHsKKyAgICAgICAgY2hhciAqb3B0c19zdHIgPSBOVUxMOworICAgICAgICBhdl9hc3NlcnQwKGRldiAmJiBvcHRzKTsKKyAgICAgICAgKmRldiA9IGF2X3N0cmR1cChhcmcpOworICAgICAgICBpZiAoISpkZXYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZiAoKG9wdHNfc3RyID0gc3RyY2hyKCpkZXYsICcsJykpKSB7CisgICAgICAgICAgICAqKG9wdHNfc3RyKyspID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChvcHRzX3N0clswXSAmJiAoKHJldCA9IGF2X2RpY3RfcGFyc2Vfc3RyaW5nKG9wdHMsIG9wdHNfc3RyLCAiPSIsICI6IiwgMCkpIDwgMCkpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcChkZXYpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgcHJpbnRmKCJcbkRldmljZSBuYW1lIGlzIG5vdCBwcm92aWRlZC5cbiIKKyAgICAgICAgICAgICAgICAiWW91IGNhbiBwYXNzIGRldmljZW5hbWVbLG9wdDE9dmFsMVssb3B0Mj12YWwyLi4uXV0gYXMgYW4gYXJndW1lbnQuXG5cbiIpOworICAgIHJldHVybiAwOworfQorCitpbnQgc2hvd19zb3VyY2VzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgQVZJbnB1dEZvcm1hdCAqZm10ID0gTlVMTDsKKyAgICBjaGFyICpkZXYgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGVycm9yX2xldmVsID0gYXZfbG9nX2dldF9sZXZlbCgpOworCisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfRVJST1IpOworCisgICAgaWYgKChyZXQgPSBzaG93X3NpbmtzX3NvdXJjZXNfcGFyc2VfYXJnKGFyZywgJmRldiwgJm9wdHMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGRvIHsKKyAgICAgICAgZm10ID0gYXZfaW5wdXRfYXVkaW9fZGV2aWNlX25leHQoZm10KTsKKyAgICAgICAgaWYgKGZtdCkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoZm10LT5uYW1lLCAibGF2ZmkiKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy9pdCdzIHBvaW50bGVzcyB0byBwcm9iZSBsYXZmaQorICAgICAgICAgICAgaWYgKGRldiAmJiAhYXZfbWF0Y2hfbmFtZShkZXYsIGZtdC0+bmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBwcmludF9kZXZpY2Vfc291cmNlcyhmbXQsIG9wdHMpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoZm10KTsKKyAgICBkbyB7CisgICAgICAgIGZtdCA9IGF2X2lucHV0X3ZpZGVvX2RldmljZV9uZXh0KGZtdCk7CisgICAgICAgIGlmIChmbXQpIHsKKyAgICAgICAgICAgIGlmIChkZXYgJiYgIWF2X21hdGNoX25hbWUoZGV2LCBmbXQtPm5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcHJpbnRfZGV2aWNlX3NvdXJjZXMoZm10LCBvcHRzKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGZtdCk7CisgIGZhaWw6CisgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKKyAgICBhdl9mcmVlKGRldik7CisgICAgYXZfbG9nX3NldF9sZXZlbChlcnJvcl9sZXZlbCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHNob3dfc2lua3Modm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBBVk91dHB1dEZvcm1hdCAqZm10ID0gTlVMTDsKKyAgICBjaGFyICpkZXYgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGVycm9yX2xldmVsID0gYXZfbG9nX2dldF9sZXZlbCgpOworCisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfRVJST1IpOworCisgICAgaWYgKChyZXQgPSBzaG93X3NpbmtzX3NvdXJjZXNfcGFyc2VfYXJnKGFyZywgJmRldiwgJm9wdHMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGRvIHsKKyAgICAgICAgZm10ID0gYXZfb3V0cHV0X2F1ZGlvX2RldmljZV9uZXh0KGZtdCk7CisgICAgICAgIGlmIChmbXQpIHsKKyAgICAgICAgICAgIGlmIChkZXYgJiYgIWF2X21hdGNoX25hbWUoZGV2LCBmbXQtPm5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcHJpbnRfZGV2aWNlX3NpbmtzKGZtdCwgb3B0cyk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChmbXQpOworICAgIGRvIHsKKyAgICAgICAgZm10ID0gYXZfb3V0cHV0X3ZpZGVvX2RldmljZV9uZXh0KGZtdCk7CisgICAgICAgIGlmIChmbXQpIHsKKyAgICAgICAgICAgIGlmIChkZXYgJiYgIWF2X21hdGNoX25hbWUoZGV2LCBmbXQtPm5hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcHJpbnRfZGV2aWNlX3NpbmtzKGZtdCwgb3B0cyk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlIChmbXQpOworICBmYWlsOgorICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgYXZfZnJlZShkZXYpOworICAgIGF2X2xvZ19zZXRfbGV2ZWwoZXJyb3JfbGV2ZWwpOworICAgIHJldHVybiByZXQ7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZmZ0b29scy9jbWR1dGlscy5oIGIvZmZ0b29scy9jbWR1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmUwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9mZnRvb2xzL2NtZHV0aWxzLmgKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiBWYXJpb3VzIHV0aWxpdGllcyBmb3IgY29tbWFuZCBsaW5lIHRvb2xzCisgKiBjb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgRkZUT09MU19DTURVVElMU19ICisjZGVmaW5lIEZGVE9PTFNfQ01EVVRJTFNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9hdmZpbHRlci5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCisKKyNpZmRlZiBfV0lOMzIKKyN1bmRlZiBtYWluIC8qIFdlIGRvbid0IHdhbnQgU0RMIHRvIG92ZXJyaWRlIG91ciBtYWluKCkgKi8KKyNlbmRpZgorCisvKioKKyAqIHByb2dyYW0gbmFtZSwgZGVmaW5lZCBieSB0aGUgcHJvZ3JhbSBmb3Igc2hvd192ZXJzaW9uKCkuCisgKi8KK2V4dGVybiBjb25zdCBjaGFyIHByb2dyYW1fbmFtZVtdOworCisvKioKKyAqIHByb2dyYW0gYmlydGggeWVhciwgZGVmaW5lZCBieSB0aGUgcHJvZ3JhbSBmb3Igc2hvd19iYW5uZXIoKQorICovCitleHRlcm4gY29uc3QgaW50IHByb2dyYW1fYmlydGhfeWVhcjsKKworZXh0ZXJuIEFWQ29kZWNDb250ZXh0ICphdmNvZGVjX29wdHNbQVZNRURJQV9UWVBFX05CXTsKK2V4dGVybiBBVkZvcm1hdENvbnRleHQgKmF2Zm9ybWF0X29wdHM7CitleHRlcm4gQVZEaWN0aW9uYXJ5ICpzd3NfZGljdDsKK2V4dGVybiBBVkRpY3Rpb25hcnkgKnN3cl9vcHRzOworZXh0ZXJuIEFWRGljdGlvbmFyeSAqZm9ybWF0X29wdHMsICpjb2RlY19vcHRzLCAqcmVzYW1wbGVfb3B0czsKK2V4dGVybiBpbnQgaGlkZV9iYW5uZXI7CisKKy8qKgorICogUmVnaXN0ZXIgYSBwcm9ncmFtLXNwZWNpZmljIGNsZWFudXAgcm91dGluZS4KKyAqLwordm9pZCByZWdpc3Rlcl9leGl0KHZvaWQgKCpjYikoaW50IHJldCkpOworCisvKioKKyAqIFdyYXBzIGV4aXQgd2l0aCBhIHByb2dyYW0tc3BlY2lmaWMgY2xlYW51cCByb3V0aW5lLgorICovCit2b2lkIGV4aXRfcHJvZ3JhbShpbnQgcmV0KSBhdl9ub3JldHVybjsKKworLyoqCisgKiBJbml0aWFsaXplIGR5bmFtaWMgbGlicmFyeSBsb2FkaW5nCisgKi8KK3ZvaWQgaW5pdF9keW5sb2FkKHZvaWQpOworCisvKioKKyAqIEluaXRpYWxpemUgdGhlIGNtZHV0aWxzIG9wdGlvbiBzeXN0ZW0sIGluIHBhcnRpY3VsYXIKKyAqIGFsbG9jYXRlIHRoZSAqX29wdHMgY29udGV4dHMuCisgKi8KK3ZvaWQgaW5pdF9vcHRzKHZvaWQpOworLyoqCisgKiBVbmluaXRpYWxpemUgdGhlIGNtZHV0aWxzIG9wdGlvbiBzeXN0ZW0sIGluIHBhcnRpY3VsYXIKKyAqIGZyZWUgdGhlICpfb3B0cyBjb250ZXh0cyBhbmQgdGhlaXIgY29udGVudHMuCisgKi8KK3ZvaWQgdW5pbml0X29wdHModm9pZCk7CisKKy8qKgorICogVHJpdmlhbCBsb2cgY2FsbGJhY2suCisgKiBPbmx5IHN1aXRhYmxlIGZvciBvcHRfaGVscCBhbmQgc2ltaWxhciBzaW5jZSBpdCBsYWNrcyBwcmVmaXggaGFuZGxpbmcuCisgKi8KK3ZvaWQgbG9nX2NhbGxiYWNrX2hlbHAodm9pZCogcHRyLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCB2bCk7CisKKy8qKgorICogT3ZlcnJpZGUgdGhlIGNwdWZsYWdzLgorICovCitpbnQgb3B0X2NwdWZsYWdzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCisvKioKKyAqIEZhbGxiYWNrIGZvciBvcHRpb25zIHRoYXQgYXJlIG5vdCBleHBsaWNpdGx5IGhhbmRsZWQsIHRoZXNlIHdpbGwgYmUKKyAqIHBhcnNlZCB0aHJvdWdoIEFWT3B0aW9ucy4KKyAqLworaW50IG9wdF9kZWZhdWx0KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCisvKioKKyAqIFNldCB0aGUgbGliYXYqIGxpYnJhcmllcyBsb2cgbGV2ZWwuCisgKi8KK2ludCBvcHRfbG9nbGV2ZWwodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7CisKK2ludCBvcHRfcmVwb3J0KGNvbnN0IGNoYXIgKm9wdCk7CisKK2ludCBvcHRfbWF4X2FsbG9jKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCitpbnQgb3B0X2NvZGVjX2RlYnVnKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCisvKioKKyAqIExpbWl0IHRoZSBleGVjdXRpb24gdGltZS4KKyAqLworaW50IG9wdF90aW1lbGltaXQodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7CisKKy8qKgorICogUGFyc2UgYSBzdHJpbmcgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZyB2YWx1ZSBhcyBhIGRvdWJsZS4KKyAqIEV4aXQgZnJvbSB0aGUgYXBwbGljYXRpb24gaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgY29ycmVjdGx5CisgKiBwYXJzZWQgb3IgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMgaW52YWxpZC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBvZiB0aGUgdmFsdWUgdG8gYmUgc2V0IChlLmcuIHRoZQorICogY29ycmVzcG9uZGluZyBjb21tYW5kIGxpbmUgb3B0aW9uIG5hbWUpCisgKiBAcGFyYW0gbnVtc3RyIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSAoT1BUX0lOVDY0IG9yIE9QVF9GTE9BVCkgYXMgd2hpY2ggdGhlCisgKiBzdHJpbmcgc2hvdWxkIGJlIHBhcnNlZAorICogQHBhcmFtIG1pbiB0aGUgbWluaW11bSB2YWxpZCBhY2NlcHRlZCB2YWx1ZQorICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSB2YWxpZCBhY2NlcHRlZCB2YWx1ZQorICovCitkb3VibGUgcGFyc2VfbnVtYmVyX29yX2RpZShjb25zdCBjaGFyICpjb250ZXh0LCBjb25zdCBjaGFyICpudW1zdHIsIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbiwgZG91YmxlIG1heCk7CisKKy8qKgorICogUGFyc2UgYSBzdHJpbmcgc3BlY2lmeWluZyBhIHRpbWUgYW5kIHJldHVybiBpdHMgY29ycmVzcG9uZGluZworICogdmFsdWUgYXMgYSBudW1iZXIgb2YgbWljcm9zZWNvbmRzLiBFeGl0IGZyb20gdGhlIGFwcGxpY2F0aW9uIGlmCisgKiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBjb3JyZWN0bHkgcGFyc2VkLgorICoKKyAqIEBwYXJhbSBjb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSB2YWx1ZSB0byBiZSBzZXQgKGUuZy4gdGhlCisgKiBjb3JyZXNwb25kaW5nIGNvbW1hbmQgbGluZSBvcHRpb24gbmFtZSkKKyAqIEBwYXJhbSB0aW1lc3RyIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkCisgKiBAcGFyYW0gaXNfZHVyYXRpb24gYSBmbGFnIHdoaWNoIHRlbGxzIGhvdyB0byBpbnRlcnByZXQgdGltZXN0ciwgaWYKKyAqIG5vdCB6ZXJvIHRpbWVzdHIgaXMgaW50ZXJwcmV0ZWQgYXMgYSBkdXJhdGlvbiwgb3RoZXJ3aXNlIGFzIGEKKyAqIGRhdGUKKyAqCisgKiBAc2VlIGF2X3BhcnNlX3RpbWUoKQorICovCitpbnQ2NF90IHBhcnNlX3RpbWVfb3JfZGllKGNvbnN0IGNoYXIgKmNvbnRleHQsIGNvbnN0IGNoYXIgKnRpbWVzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19kdXJhdGlvbik7CisKK3R5cGVkZWYgc3RydWN0IFNwZWNpZmllck9wdCB7CisgICAgY2hhciAqc3BlY2lmaWVyOyAgICAvKio8IHN0cmVhbS9jaGFwdGVyL3Byb2dyYW0vLi4uIHNwZWNpZmllciAqLworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDhfdCAqc3RyOworICAgICAgICBpbnQgICAgICAgIGk7CisgICAgICAgIGludDY0X3QgIGk2NDsKKyAgICAgICAgdWludDY0X3QgdWk2NDsKKyAgICAgICAgZmxvYXQgICAgICBmOworICAgICAgICBkb3VibGUgICBkYmw7CisgICAgfSB1OworfSBTcGVjaWZpZXJPcHQ7CisKK3R5cGVkZWYgc3RydWN0IE9wdGlvbkRlZiB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgZmxhZ3M7CisjZGVmaW5lIEhBU19BUkcgICAgMHgwMDAxCisjZGVmaW5lIE9QVF9CT09MICAgMHgwMDAyCisjZGVmaW5lIE9QVF9FWFBFUlQgMHgwMDA0CisjZGVmaW5lIE9QVF9TVFJJTkcgMHgwMDA4CisjZGVmaW5lIE9QVF9WSURFTyAgMHgwMDEwCisjZGVmaW5lIE9QVF9BVURJTyAgMHgwMDIwCisjZGVmaW5lIE9QVF9JTlQgICAgMHgwMDgwCisjZGVmaW5lIE9QVF9GTE9BVCAgMHgwMTAwCisjZGVmaW5lIE9QVF9TVUJUSVRMRSAweDAyMDAKKyNkZWZpbmUgT1BUX0lOVDY0ICAweDA0MDAKKyNkZWZpbmUgT1BUX0VYSVQgICAweDA4MDAKKyNkZWZpbmUgT1BUX0RBVEEgICAweDEwMDAKKyNkZWZpbmUgT1BUX1BFUkZJTEUgIDB4MjAwMCAgICAgLyogdGhlIG9wdGlvbiBpcyBwZXItZmlsZSAoY3VycmVudGx5IGZmbXBlZy1vbmx5KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllZCBieSBPUFRfT0ZGU0VUIG9yIE9QVF9TUEVDICovCisjZGVmaW5lIE9QVF9PRkZTRVQgMHg0MDAwICAgICAgIC8qIG9wdGlvbiBpcyBzcGVjaWZpZWQgYXMgYW4gb2Zmc2V0IGluIGEgcGFzc2VkIG9wdGN0eCAqLworI2RlZmluZSBPUFRfU1BFQyAgIDB4ODAwMCAgICAgICAvKiBvcHRpb24gaXMgdG8gYmUgc3RvcmVkIGluIGFuIGFycmF5IG9mIFNwZWNpZmllck9wdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wbGllcyBPUFRfT0ZGU0VULiBOZXh0IGVsZW1lbnQgYWZ0ZXIgdGhlIG9mZnNldCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbnQgY29udGFpbmluZyBlbGVtZW50IGNvdW50IGluIHRoZSBhcnJheS4gKi8KKyNkZWZpbmUgT1BUX1RJTUUgIDB4MTAwMDAKKyNkZWZpbmUgT1BUX0RPVUJMRSAweDIwMDAwCisjZGVmaW5lIE9QVF9JTlBVVCAgMHg0MDAwMAorI2RlZmluZSBPUFRfT1VUUFVUIDB4ODAwMDAKKyAgICAgdW5pb24geworICAgICAgICB2b2lkICpkc3RfcHRyOworICAgICAgICBpbnQgKCpmdW5jX2FyZykodm9pZCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisgICAgICAgIHNpemVfdCBvZmY7CisgICAgfSB1OworICAgIGNvbnN0IGNoYXIgKmhlbHA7CisgICAgY29uc3QgY2hhciAqYXJnbmFtZTsKK30gT3B0aW9uRGVmOworCisvKioKKyAqIFByaW50IGhlbHAgZm9yIGFsbCBvcHRpb25zIG1hdGNoaW5nIHNwZWNpZmllZCBmbGFncy4KKyAqCisgKiBAcGFyYW0gb3B0aW9ucyBhIGxpc3Qgb2Ygb3B0aW9ucworICogQHBhcmFtIG1zZyB0aXRsZSBvZiB0aGlzIGdyb3VwLiBPbmx5IHByaW50ZWQgaWYgYXQgbGVhc3Qgb25lIG9wdGlvbiBtYXRjaGVzLgorICogQHBhcmFtIHJlcV9mbGFncyBwcmludCBvbmx5IG9wdGlvbnMgd2hpY2ggaGF2ZSBhbGwgdGhvc2UgZmxhZ3Mgc2V0LgorICogQHBhcmFtIHJlal9mbGFncyBkb24ndCBwcmludCBvcHRpb25zIHdoaWNoIGhhdmUgYW55IG9mIHRob3NlIGZsYWdzIHNldC4KKyAqIEBwYXJhbSBhbHRfZmxhZ3MgcHJpbnQgb25seSBvcHRpb25zIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgb2YgdGhvc2UgZmxhZ3Mgc2V0CisgKi8KK3ZvaWQgc2hvd19oZWxwX29wdGlvbnMoY29uc3QgT3B0aW9uRGVmICpvcHRpb25zLCBjb25zdCBjaGFyICptc2csIGludCByZXFfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGludCByZWpfZmxhZ3MsIGludCBhbHRfZmxhZ3MpOworCisjaWYgQ09ORklHX0FWREVWSUNFCisjZGVmaW5lIENNRFVUSUxTX0NPTU1PTl9PUFRJT05TX0FWREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAic291cmNlcyIgICAgLCBPUFRfRVhJVCB8IEhBU19BUkcsIHsgLmZ1bmNfYXJnID0gc2hvd19zb3VyY2VzIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAibGlzdCBzb3VyY2VzIG9mIHRoZSBpbnB1dCBkZXZpY2UiLCAiZGV2aWNlIiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAic2lua3MiICAgICAgLCBPUFRfRVhJVCB8IEhBU19BUkcsIHsgLmZ1bmNfYXJnID0gc2hvd19zaW5rcyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAibGlzdCBzaW5rcyBvZiB0aGUgb3V0cHV0IGRldmljZSIsICJkZXZpY2UiIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNlbHNlCisjZGVmaW5lIENNRFVUSUxTX0NPTU1PTl9PUFRJT05TX0FWREVWSUNFCisjZW5kaWYKKworI2RlZmluZSBDTURVVElMU19DT01NT05fT1BUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgIkwiLCAgICAgICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19saWNlbnNlIH0sICAgICAic2hvdyBsaWNlbnNlIiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgImgiLCAgICAgICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19oZWxwIH0sICAgICAgICAic2hvdyBoZWxwIiwgInRvcGljIiB9LCAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgIj8iLCAgICAgICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19oZWxwIH0sICAgICAgICAic2hvdyBoZWxwIiwgInRvcGljIiB9LCAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgImhlbHAiLCAgICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19oZWxwIH0sICAgICAgICAic2hvdyBoZWxwIiwgInRvcGljIiB9LCAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgIi1oZWxwIiwgICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19oZWxwIH0sICAgICAgICAic2hvdyBoZWxwIiwgInRvcGljIiB9LCAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgInZlcnNpb24iLCAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd192ZXJzaW9uIH0sICAgICAic2hvdyB2ZXJzaW9uIiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgImJ1aWxkY29uZiIsICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19idWlsZGNvbmYgfSwgICAic2hvdyBidWlsZCBjb25maWd1cmF0aW9uIiB9LCAgICAgICAgICAgICAgXAorICAgIHsgImZvcm1hdHMiLCAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19mb3JtYXRzIH0sICAgICAic2hvdyBhdmFpbGFibGUgZm9ybWF0cyIgfSwgICAgICAgICAgICAgICAgXAorICAgIHsgIm11eGVycyIsICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19tdXhlcnMgfSwgICAgICAic2hvdyBhdmFpbGFibGUgbXV4ZXJzIiB9LCAgICAgICAgICAgICAgICAgXAorICAgIHsgImRlbXV4ZXJzIiwgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19kZW11eGVycyB9LCAgICAic2hvdyBhdmFpbGFibGUgZGVtdXhlcnMiIH0sICAgICAgICAgICAgICAgXAorICAgIHsgImRldmljZXMiLCAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19kZXZpY2VzIH0sICAgICAic2hvdyBhdmFpbGFibGUgZGV2aWNlcyIgfSwgICAgICAgICAgICAgICAgXAorICAgIHsgImNvZGVjcyIsICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19jb2RlY3MgfSwgICAgICAic2hvdyBhdmFpbGFibGUgY29kZWNzIiB9LCAgICAgICAgICAgICAgICAgXAorICAgIHsgImRlY29kZXJzIiwgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19kZWNvZGVycyB9LCAgICAic2hvdyBhdmFpbGFibGUgZGVjb2RlcnMiIH0sICAgICAgICAgICAgICAgXAorICAgIHsgImVuY29kZXJzIiwgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19lbmNvZGVycyB9LCAgICAic2hvdyBhdmFpbGFibGUgZW5jb2RlcnMiIH0sICAgICAgICAgICAgICAgXAorICAgIHsgImJzZnMiLCAgICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19ic2ZzIH0sICAgICAgICAic2hvdyBhdmFpbGFibGUgYml0IHN0cmVhbSBmaWx0ZXJzIiB9LCAgICAgXAorICAgIHsgInByb3RvY29scyIsICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19wcm90b2NvbHMgfSwgICAic2hvdyBhdmFpbGFibGUgcHJvdG9jb2xzIiB9LCAgICAgICAgICAgICAgXAorICAgIHsgImZpbHRlcnMiLCAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19maWx0ZXJzIH0sICAgICAic2hvdyBhdmFpbGFibGUgZmlsdGVycyIgfSwgICAgICAgICAgICAgICAgXAorICAgIHsgInBpeF9mbXRzIiwgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19waXhfZm10cyB9LCAgICAic2hvdyBhdmFpbGFibGUgcGl4ZWwgZm9ybWF0cyIgfSwgICAgICAgICAgXAorICAgIHsgImxheW91dHMiLCAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19sYXlvdXRzIH0sICAgICAic2hvdyBzdGFuZGFyZCBjaGFubmVsIGxheW91dHMiIH0sICAgICAgICAgXAorICAgIHsgInNhbXBsZV9mbXRzIiwgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19zYW1wbGVfZm10cyB9LCAic2hvdyBhdmFpbGFibGUgYXVkaW8gc2FtcGxlIGZvcm1hdHMiIH0sICAgXAorICAgIHsgImNvbG9ycyIsICAgICAgT1BUX0VYSVQsICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gc2hvd19jb2xvcnMgfSwgICAgICAic2hvdyBhdmFpbGFibGUgY29sb3IgbmFtZXMiIH0sICAgICAgICAgICAgXAorICAgIHsgImxvZ2xldmVsIiwgICAgSEFTX0FSRywgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2xvZ2xldmVsIH0sICAgICAic2V0IGxvZ2dpbmcgbGV2ZWwiLCAibG9nbGV2ZWwiIH0sICAgICAgICAgXAorICAgIHsgInYiLCAgICAgICAgICAgSEFTX0FSRywgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2xvZ2xldmVsIH0sICAgICAic2V0IGxvZ2dpbmcgbGV2ZWwiLCAibG9nbGV2ZWwiIH0sICAgICAgICAgXAorICAgIHsgInJlcG9ydCIsICAgICAgMCwgICAgICAgICAgICAgICAgICAgIHsgKHZvaWQqKW9wdF9yZXBvcnQgfSwgICAgICAgICAgICAiZ2VuZXJhdGUgYSByZXBvcnQiIH0sICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgIm1heF9hbGxvYyIsICAgSEFTX0FSRywgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X21heF9hbGxvYyB9LCAgICAic2V0IG1heGltdW0gc2l6ZSBvZiBhIHNpbmdsZSBhbGxvY2F0ZWQgYmxvY2siLCAiYnl0ZXMiIH0sIFwKKyAgICB7ICJjcHVmbGFncyIsICAgIEhBU19BUkcgfCBPUFRfRVhQRVJULCB7IC5mdW5jX2FyZyA9IG9wdF9jcHVmbGFncyB9LCAgICAgImZvcmNlIHNwZWNpZmljIGNwdSBmbGFncyIsICJmbGFncyIgfSwgICAgIFwKKyAgICB7ICJoaWRlX2Jhbm5lciIsIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgeyZoaWRlX2Jhbm5lcn0sICAgICAiZG8gbm90IHNob3cgcHJvZ3JhbSBiYW5uZXIiLCAiaGlkZV9iYW5uZXIiIH0sICAgICAgICAgIFwKKyAgICBDTURVVElMU19DT01NT05fT1BUSU9OU19BVkRFVklDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworLyoqCisgKiBTaG93IGhlbHAgZm9yIGFsbCBvcHRpb25zIHdpdGggZ2l2ZW4gZmxhZ3MgaW4gY2xhc3MgYW5kIGFsbCBpdHMKKyAqIGNoaWxkcmVuLgorICovCit2b2lkIHNob3dfaGVscF9jaGlsZHJlbihjb25zdCBBVkNsYXNzICpjbGFzcywgaW50IGZsYWdzKTsKKworLyoqCisgKiBQZXItZmZ0b29sIHNwZWNpZmljIGhlbHAgaGFuZGxlci4gSW1wbGVtZW50ZWQgaW4gZWFjaAorICogZmZ0b29sLCBjYWxsZWQgYnkgc2hvd19oZWxwKCkuCisgKi8KK3ZvaWQgc2hvd19oZWxwX2RlZmF1bHQoY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCisvKioKKyAqIEdlbmVyaWMgLWggaGFuZGxlciBjb21tb24gdG8gYWxsIGZmdG9vbHMuCisgKi8KK2ludCBzaG93X2hlbHAodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7CisKKy8qKgorICogUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgKgorICogQHBhcmFtIG9wdGN0eCBhbiBvcGFxdWUgb3B0aW9ucyBjb250ZXh0CisgKiBAcGFyYW0gYXJnYyAgIG51bWJlciBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgKiBAcGFyYW0gYXJndiAgIHZhbHVlcyBvZiBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgKiBAcGFyYW0gb3B0aW9ucyBBcnJheSB3aXRoIHRoZSBkZWZpbml0aW9ucyByZXF1aXJlZCB0byBpbnRlcnByZXQgZXZlcnkKKyAqIG9wdGlvbiBvZiB0aGUgZm9ybTogLW9wdGlvbl9uYW1lIFthcmd1bWVudF0KKyAqIEBwYXJhbSBwYXJzZV9hcmdfZnVuY3Rpb24gTmFtZSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVkIHRvIHByb2Nlc3MgZXZlcnkKKyAqIGFyZ3VtZW50IHdpdGhvdXQgYSBsZWFkaW5nIG9wdGlvbiBuYW1lIGZsYWcuIE5VTEwgaWYgc3VjaCBhcmd1bWVudHMgZG8KKyAqIG5vdCBoYXZlIHRvIGJlIHByb2Nlc3NlZC4KKyAqLwordm9pZCBwYXJzZV9vcHRpb25zKHZvaWQgKm9wdGN0eCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgdm9pZCAoKiBwYXJzZV9hcmdfZnVuY3Rpb24pKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciopKTsKKworLyoqCisgKiBQYXJzZSBvbmUgZ2l2ZW4gb3B0aW9uLgorICoKKyAqIEByZXR1cm4gb24gc3VjY2VzcyAxIGlmIGFyZyB3YXMgY29uc3VtZWQsIDAgb3RoZXJ3aXNlOyBuZWdhdGl2ZSBudW1iZXIgb24gZXJyb3IKKyAqLworaW50IHBhcnNlX29wdGlvbih2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnLAorICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMpOworCisvKioKKyAqIEFuIG9wdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgY29tbWFuZGxpbmUuCisgKiBDYW5ub3QgdXNlIEFWRGljdGlvbmFyeSBiZWNhdXNlIG9mIG9wdGlvbnMgbGlrZSAtbWFwIHdoaWNoIGNhbiBiZQorICogdXNlZCBtdWx0aXBsZSB0aW1lcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT3B0aW9uIHsKKyAgICBjb25zdCBPcHRpb25EZWYgICpvcHQ7CisgICAgY29uc3QgY2hhciAgICAgICAqa2V5OworICAgIGNvbnN0IGNoYXIgICAgICAgKnZhbDsKK30gT3B0aW9uOworCit0eXBlZGVmIHN0cnVjdCBPcHRpb25Hcm91cERlZiB7CisgICAgLyoqPCBncm91cCBuYW1lICovCisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAvKioKKyAgICAgKiBPcHRpb24gdG8gYmUgdXNlZCBhcyBncm91cCBzZXBhcmF0b3IuIENhbiBiZSBOVUxMIGZvciBncm91cHMgd2hpY2gKKyAgICAgKiBhcmUgdGVybWluYXRlZCBieSBhIG5vbi1vcHRpb24gYXJndW1lbnQgKGUuZy4gZmZtcGVnIG91dHB1dCBmaWxlcykKKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpzZXA7CisgICAgLyoqCisgICAgICogT3B0aW9uIGZsYWdzIHRoYXQgbXVzdCBiZSBzZXQgb24gZWFjaCBvcHRpb24gdGhhdCBpcworICAgICAqIGFwcGxpZWQgdG8gdGhpcyBncm91cAorICAgICAqLworICAgIGludCBmbGFnczsKK30gT3B0aW9uR3JvdXBEZWY7CisKK3R5cGVkZWYgc3RydWN0IE9wdGlvbkdyb3VwIHsKKyAgICBjb25zdCBPcHRpb25Hcm91cERlZiAqZ3JvdXBfZGVmOworICAgIGNvbnN0IGNoYXIgKmFyZzsKKworICAgIE9wdGlvbiAqb3B0czsKKyAgICBpbnQgIG5iX29wdHM7CisKKyAgICBBVkRpY3Rpb25hcnkgKmNvZGVjX29wdHM7CisgICAgQVZEaWN0aW9uYXJ5ICpmb3JtYXRfb3B0czsKKyAgICBBVkRpY3Rpb25hcnkgKnJlc2FtcGxlX29wdHM7CisgICAgQVZEaWN0aW9uYXJ5ICpzd3NfZGljdDsKKyAgICBBVkRpY3Rpb25hcnkgKnN3cl9vcHRzOworfSBPcHRpb25Hcm91cDsKKworLyoqCisgKiBBIGxpc3Qgb2Ygb3B0aW9uIGdyb3VwcyB0aGF0IGFsbCBoYXZlIHRoZSBzYW1lIGdyb3VwIHR5cGUKKyAqIChlLmcuIGlucHV0IGZpbGVzIG9yIG91dHB1dCBmaWxlcykKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT3B0aW9uR3JvdXBMaXN0IHsKKyAgICBjb25zdCBPcHRpb25Hcm91cERlZiAqZ3JvdXBfZGVmOworCisgICAgT3B0aW9uR3JvdXAgKmdyb3VwczsKKyAgICBpbnQgICAgICAgbmJfZ3JvdXBzOworfSBPcHRpb25Hcm91cExpc3Q7CisKK3R5cGVkZWYgc3RydWN0IE9wdGlvblBhcnNlQ29udGV4dCB7CisgICAgT3B0aW9uR3JvdXAgZ2xvYmFsX29wdHM7CisKKyAgICBPcHRpb25Hcm91cExpc3QgKmdyb3VwczsKKyAgICBpbnQgICAgICAgICAgIG5iX2dyb3VwczsKKworICAgIC8qIHBhcnNpbmcgc3RhdGUgKi8KKyAgICBPcHRpb25Hcm91cCBjdXJfZ3JvdXA7Cit9IE9wdGlvblBhcnNlQ29udGV4dDsKKworLyoqCisgKiBQYXJzZSBhbiBvcHRpb25zIGdyb3VwIGFuZCB3cml0ZSByZXN1bHRzIGludG8gb3B0Y3R4LgorICoKKyAqIEBwYXJhbSBvcHRjdHggYW4gYXBwLXNwZWNpZmljIG9wdGlvbnMgY29udGV4dC4gTlVMTCBmb3IgZ2xvYmFsIG9wdGlvbnMgZ3JvdXAKKyAqLworaW50IHBhcnNlX29wdGdyb3VwKHZvaWQgKm9wdGN0eCwgT3B0aW9uR3JvdXAgKmcpOworCisvKioKKyAqIFNwbGl0IHRoZSBjb21tYW5kbGluZSBpbnRvIGFuIGludGVybWVkaWF0ZSBmb3JtIGNvbnZlbmllbnQgZm9yIGZ1cnRoZXIKKyAqIHByb2Nlc3NpbmcuCisgKgorICogVGhlIGNvbW1hbmRsaW5lIGlzIGFzc3VtZWQgdG8gYmUgY29tcG9zZWQgb2Ygb3B0aW9ucyB3aGljaCBlaXRoZXIgYmVsb25nIHRvIGEKKyAqIGdyb3VwICh0aG9zZSB3aXRoIE9QVF9TUEVDLCBPUFRfT0ZGU0VUIG9yIE9QVF9QRVJGSUxFKSBvciBhcmUgZ2xvYmFsCisgKiAoZXZlcnl0aGluZyBlbHNlKS4KKyAqCisgKiBBIGdyb3VwIChkZWZpbmVkIGJ5IGFuIE9wdGlvbkdyb3VwRGVmIHN0cnVjdCkgaXMgYSBzZXF1ZW5jZSBvZiBvcHRpb25zCisgKiB0ZXJtaW5hdGVkIGJ5IGVpdGhlciBhIGdyb3VwIHNlcGFyYXRvciBvcHRpb24gKGUuZy4gLWkpIG9yIGEgcGFyYW1ldGVyIHRoYXQKKyAqIGlzIG5vdCBhbiBvcHRpb24gKGRvZXNuJ3Qgc3RhcnQgd2l0aCAtKS4gQSBncm91cCB3aXRob3V0IGEgc2VwYXJhdG9yIG9wdGlvbgorICogbXVzdCBhbHdheXMgYmUgZmlyc3QgaW4gdGhlIHN1cHBsaWVkIGdyb3VwcyBsaXN0LgorICoKKyAqIEFsbCBvcHRpb25zIHdpdGhpbiB0aGUgc2FtZSBncm91cCBhcmUgc3RvcmVkIGluIG9uZSBPcHRpb25Hcm91cCBzdHJ1Y3QgaW4gYW4KKyAqIE9wdGlvbkdyb3VwTGlzdCwgYWxsIGdyb3VwcyB3aXRoIHRoZSBzYW1lIGdyb3VwIGRlZmluaXRpb24gYXJlIHN0b3JlZCBpbiBvbmUKKyAqIE9wdGlvbkdyb3VwTGlzdCBpbiBPcHRpb25QYXJzZUNvbnRleHQuZ3JvdXBzLiBUaGUgb3JkZXIgb2YgZ3JvdXAgbGlzdHMgaXMgdGhlCisgKiBzYW1lIGFzIHRoZSBvcmRlciBvZiBncm91cCBkZWZpbml0aW9ucy4KKyAqLworaW50IHNwbGl0X2NvbW1hbmRsaW5lKE9wdGlvblBhcnNlQ29udGV4dCAqb2N0eCwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uR3JvdXBEZWYgKmdyb3VwcywgaW50IG5iX2dyb3Vwcyk7CisKKy8qKgorICogRnJlZSBhbGwgYWxsb2NhdGVkIG1lbW9yeSBpbiBhbiBPcHRpb25QYXJzZUNvbnRleHQuCisgKi8KK3ZvaWQgdW5pbml0X3BhcnNlX2NvbnRleHQoT3B0aW9uUGFyc2VDb250ZXh0ICpvY3R4KTsKKworLyoqCisgKiBGaW5kIHRoZSAnLWxvZ2xldmVsJyBvcHRpb24gaW4gdGhlIGNvbW1hbmQgbGluZSBhcmdzIGFuZCBhcHBseSBpdC4KKyAqLwordm9pZCBwYXJzZV9sb2dsZXZlbChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucyk7CisKKy8qKgorICogUmV0dXJuIGluZGV4IG9mIG9wdGlvbiBvcHQgaW4gYXJndiBvciAwIGlmIG5vdCBmb3VuZC4KKyAqLworaW50IGxvY2F0ZV9vcHRpb24oaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjb25zdCBPcHRpb25EZWYgKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvcHRuYW1lKTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc3RyZWFtIG1hdGNoZXMgYSBzdHJlYW0gc3BlY2lmaWVyLgorICoKKyAqIEBwYXJhbSBzICBDb3JyZXNwb25kaW5nIGZvcm1hdCBjb250ZXh0LgorICogQHBhcmFtIHN0IFN0cmVhbSBmcm9tIHMgdG8gYmUgY2hlY2tlZC4KKyAqIEBwYXJhbSBzcGVjIEEgc3RyZWFtIHNwZWNpZmllciBvZiB0aGUgW3Z8YXxzfGRdOltcPHN0cmVhbSBpbmRleFw+XSBmb3JtLgorICoKKyAqIEByZXR1cm4gMSBpZiB0aGUgc3RyZWFtIG1hdGNoZXMsIDAgaWYgaXQgZG9lc24ndCwgPDAgb24gZXJyb3IKKyAqLworaW50IGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGNvbnN0IGNoYXIgKnNwZWMpOworCisvKioKKyAqIEZpbHRlciBvdXQgb3B0aW9ucyBmb3IgZ2l2ZW4gY29kZWMuCisgKgorICogQ3JlYXRlIGEgbmV3IG9wdGlvbnMgZGljdGlvbmFyeSBjb250YWluaW5nIG9ubHkgdGhlIG9wdGlvbnMgZnJvbQorICogb3B0cyB3aGljaCBhcHBseSB0byB0aGUgY29kZWMgd2l0aCBJRCBjb2RlY19pZC4KKyAqCisgKiBAcGFyYW0gb3B0cyAgICAgZGljdGlvbmFyeSB0byBwbGFjZSBvcHRpb25zIGluCisgKiBAcGFyYW0gY29kZWNfaWQgSUQgb2YgdGhlIGNvZGVjIHRoYXQgc2hvdWxkIGJlIGZpbHRlcmVkIGZvcgorICogQHBhcmFtIHMgQ29ycmVzcG9uZGluZyBmb3JtYXQgY29udGV4dC4KKyAqIEBwYXJhbSBzdCBBIHN0cmVhbSBmcm9tIHMgZm9yIHdoaWNoIHRoZSBvcHRpb25zIHNob3VsZCBiZSBmaWx0ZXJlZC4KKyAqIEBwYXJhbSBjb2RlYyBUaGUgcGFydGljdWxhciBjb2RlYyBmb3Igd2hpY2ggdGhlIG9wdGlvbnMgc2hvdWxkIGJlIGZpbHRlcmVkLgorICogICAgICAgICAgICAgIElmIG51bGwsIHRoZSBkZWZhdWx0IG9uZSBpcyBsb29rZWQgdXAgYWNjb3JkaW5nIHRvIHRoZSBjb2RlYyBpZC4KKyAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGRpY3Rpb25hcnkKKyAqLworQVZEaWN0aW9uYXJ5ICpmaWx0ZXJfY29kZWNfb3B0cyhBVkRpY3Rpb25hcnkgKm9wdHMsIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgQVZDb2RlYyAqY29kZWMpOworCisvKioKKyAqIFNldHVwIEFWQ29kZWNDb250ZXh0IG9wdGlvbnMgZm9yIGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oKS4KKyAqCisgKiBDcmVhdGUgYW4gYXJyYXkgb2YgZGljdGlvbmFyaWVzLCBvbmUgZGljdGlvbmFyeSBmb3IgZWFjaCBzdHJlYW0KKyAqIGNvbnRhaW5lZCBpbiBzLgorICogRWFjaCBkaWN0aW9uYXJ5IHdpbGwgY29udGFpbiB0aGUgb3B0aW9ucyBmcm9tIGNvZGVjX29wdHMgd2hpY2ggY2FuCisgKiBiZSBhcHBsaWVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0cmVhbSBjb2RlYyBjb250ZXh0LgorICoKKyAqIEByZXR1cm4gcG9pbnRlciB0byB0aGUgY3JlYXRlZCBhcnJheSBvZiBkaWN0aW9uYXJpZXMsIE5VTEwgaWYgaXQKKyAqIGNhbm5vdCBiZSBjcmVhdGVkCisgKi8KK0FWRGljdGlvbmFyeSAqKnNldHVwX2ZpbmRfc3RyZWFtX2luZm9fb3B0cyhBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpjb2RlY19vcHRzKTsKKworLyoqCisgKiBQcmludCBhbiBlcnJvciBtZXNzYWdlIHRvIHN0ZGVyciwgaW5kaWNhdGluZyBmaWxlbmFtZSBhbmQgYSBodW1hbgorICogcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yIGNvZGUgZXJyLgorICoKKyAqIElmIHN0cmVycm9yX3IoKSBpcyBub3QgYXZhaWxhYmxlIHRoZSB1c2Ugb2YgdGhpcyBmdW5jdGlvbiBpbiBhCisgKiBtdWx0aXRocmVhZGVkIGFwcGxpY2F0aW9uIG1heSBiZSB1bnNhZmUuCisgKgorICogQHNlZSBhdl9zdHJlcnJvcigpCisgKi8KK3ZvaWQgcHJpbnRfZXJyb3IoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBlcnIpOworCisvKioKKyAqIFByaW50IHRoZSBwcm9ncmFtIGJhbm5lciB0byBzdGRlcnIuIFRoZSBiYW5uZXIgY29udGVudHMgZGVwZW5kIG9uIHRoZQorICogY3VycmVudCB2ZXJzaW9uIG9mIHRoZSByZXBvc2l0b3J5IGFuZCBvZiB0aGUgbGliYXYqIGxpYnJhcmllcyB1c2VkIGJ5CisgKiB0aGUgcHJvZ3JhbS4KKyAqLwordm9pZCBzaG93X2Jhbm5lcihpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGNvbnN0IE9wdGlvbkRlZiAqb3B0aW9ucyk7CisKKy8qKgorICogUHJpbnQgdGhlIHZlcnNpb24gb2YgdGhlIHByb2dyYW0gdG8gc3Rkb3V0LiBUaGUgdmVyc2lvbiBtZXNzYWdlCisgKiBkZXBlbmRzIG9uIHRoZSBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSByZXBvc2l0b3J5IGFuZCBvZiB0aGUgbGliYXYqCisgKiBsaWJyYXJpZXMuCisgKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KKyAqLworaW50IHNob3dfdmVyc2lvbih2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiBvZiB0aGUgcHJvZ3JhbSB0byBzdGRvdXQuIFRoZSBjb250ZW50cworICogZGVwZW5kIG9uIHRoZSBkZWZpbml0aW9uIG9mIEZGTVBFR19DT05GSUdVUkFUSU9OLgorICogVGhpcyBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBkb2VzIG5vdCB1dGlsaXplIHRoZSBhcmd1bWVudHMuCisgKi8KK2ludCBzaG93X2J1aWxkY29uZih2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCB0aGUgbGljZW5zZSBvZiB0aGUgcHJvZ3JhbSB0byBzdGRvdXQuIFRoZSBsaWNlbnNlIGRlcGVuZHMgb24KKyAqIHRoZSBsaWNlbnNlIG9mIHRoZSBsaWJyYXJpZXMgY29tcGlsZWQgaW50byB0aGUgcHJvZ3JhbS4KKyAqIFRoaXMgb3B0aW9uIHByb2Nlc3NpbmcgZnVuY3Rpb24gZG9lcyBub3QgdXRpbGl6ZSB0aGUgYXJndW1lbnRzLgorICovCitpbnQgc2hvd19saWNlbnNlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCisvKioKKyAqIFByaW50IGEgbGlzdGluZyBjb250YWluaW5nIGFsbCB0aGUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBwcm9ncmFtIChpbmNsdWRpbmcgZGV2aWNlcykuCisgKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KKyAqLworaW50IHNob3dfZm9ybWF0cyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIG11eGVycyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBwcm9ncmFtIChpbmNsdWRpbmcgZGV2aWNlcykuCisgKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KKyAqLworaW50IHNob3dfbXV4ZXJzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCisvKioKKyAqIFByaW50IGEgbGlzdGluZyBjb250YWluaW5nIGFsbCB0aGUgZGVtdXhlciBzdXBwb3J0ZWQgYnkgdGhlCisgKiBwcm9ncmFtIChpbmNsdWRpbmcgZGV2aWNlcykuCisgKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KKyAqLworaW50IHNob3dfZGVtdXhlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7CisKKy8qKgorICogUHJpbnQgYSBsaXN0aW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGUKKyAqIHByb2dyYW0uCisgKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KKyAqLworaW50IHNob3dfZGV2aWNlcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworI2lmIENPTkZJR19BVkRFVklDRQorLyoqCisgKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhdXRvZGV0ZWN0ZWQgc2lua3Mgb2YgdGhlIG91dHB1dCBkZXZpY2UuCisgKiBEZXZpY2UgbmFtZSB3aXRoIG9wdGlvbnMgbWF5IGJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBsaW1pdCByZXN1bHRzLgorICovCitpbnQgc2hvd19zaW5rcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhdXRvZGV0ZWN0ZWQgc291cmNlcyBvZiB0aGUgaW5wdXQgZGV2aWNlLgorICogRGV2aWNlIG5hbWUgd2l0aCBvcHRpb25zIG1heSBiZSBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gbGltaXQgcmVzdWx0cy4KKyAqLworaW50IHNob3dfc291cmNlcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKyNlbmRpZgorCisvKioKKyAqIFByaW50IGEgbGlzdGluZyBjb250YWluaW5nIGFsbCB0aGUgY29kZWNzIHN1cHBvcnRlZCBieSB0aGUKKyAqIHByb2dyYW0uCisgKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KKyAqLworaW50IHNob3dfY29kZWNzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCisvKioKKyAqIFByaW50IGEgbGlzdGluZyBjb250YWluaW5nIGFsbCB0aGUgZGVjb2RlcnMgc3VwcG9ydGVkIGJ5IHRoZQorICogcHJvZ3JhbS4KKyAqLworaW50IHNob3dfZGVjb2RlcnModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7CisKKy8qKgorICogUHJpbnQgYSBsaXN0aW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBlbmNvZGVycyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBwcm9ncmFtLgorICovCitpbnQgc2hvd19lbmNvZGVycyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIGZpbHRlcnMgc3VwcG9ydGVkIGJ5IHRoZQorICogcHJvZ3JhbS4KKyAqIFRoaXMgb3B0aW9uIHByb2Nlc3NpbmcgZnVuY3Rpb24gZG9lcyBub3QgdXRpbGl6ZSB0aGUgYXJndW1lbnRzLgorICovCitpbnQgc2hvd19maWx0ZXJzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpOworCisvKioKKyAqIFByaW50IGEgbGlzdGluZyBjb250YWluaW5nIGFsbCB0aGUgYml0IHN0cmVhbSBmaWx0ZXJzIHN1cHBvcnRlZCBieSB0aGUKKyAqIHByb2dyYW0uCisgKiBUaGlzIG9wdGlvbiBwcm9jZXNzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IHV0aWxpemUgdGhlIGFyZ3VtZW50cy4KKyAqLworaW50IHNob3dfYnNmcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIHByb3RvY29scyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBwcm9ncmFtLgorICogVGhpcyBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBkb2VzIG5vdCB1dGlsaXplIHRoZSBhcmd1bWVudHMuCisgKi8KK2ludCBzaG93X3Byb3RvY29scyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIHBpeGVsIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZQorICogcHJvZ3JhbS4KKyAqIFRoaXMgb3B0aW9uIHByb2Nlc3NpbmcgZnVuY3Rpb24gZG9lcyBub3QgdXRpbGl6ZSB0aGUgYXJndW1lbnRzLgorICovCitpbnQgc2hvd19waXhfZm10cyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIHN0YW5kYXJkIGNoYW5uZWwgbGF5b3V0cyBzdXBwb3J0ZWQgYnkKKyAqIHRoZSBwcm9ncmFtLgorICogVGhpcyBvcHRpb24gcHJvY2Vzc2luZyBmdW5jdGlvbiBkb2VzIG5vdCB1dGlsaXplIHRoZSBhcmd1bWVudHMuCisgKi8KK2ludCBzaG93X2xheW91dHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZyk7CisKKy8qKgorICogUHJpbnQgYSBsaXN0aW5nIGNvbnRhaW5pbmcgYWxsIHRoZSBzYW1wbGUgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgdGhlCisgKiBwcm9ncmFtLgorICovCitpbnQgc2hvd19zYW1wbGVfZm10cyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBQcmludCBhIGxpc3RpbmcgY29udGFpbmluZyBhbGwgdGhlIGNvbG9yIG5hbWVzIGFuZCB2YWx1ZXMgcmVjb2duaXplZAorICogYnkgdGhlIHByb2dyYW0uCisgKi8KK2ludCBzaG93X2NvbG9ycyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKTsKKworLyoqCisgKiBSZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBpZiBhIGxpbmUgcmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0CisgKiBzdGFydHMgd2l0aCBbeVldLCBvdGhlcndpc2UgcmV0dXJuIDAuCisgKi8KK2ludCByZWFkX3llc25vKHZvaWQpOworCisvKioKKyAqIEdldCBhIGZpbGUgY29ycmVzcG9uZGluZyB0byBhIHByZXNldCBmaWxlLgorICoKKyAqIElmIGlzX3BhdGggaXMgbm9uLXplcm8sIGxvb2sgZm9yIHRoZSBmaWxlIGluIHRoZSBwYXRoIHByZXNldF9uYW1lLgorICogT3RoZXJ3aXNlIHNlYXJjaCBmb3IgYSBmaWxlIG5hbWVkIGFyZy5mZnByZXNldCBpbiB0aGUgZGlyZWN0b3JpZXMKKyAqICRGRk1QRUdfREFUQURJUiAoaWYgc2V0KSwgJEhPTUUvLmZmbXBlZywgYW5kIGluIHRoZSBkYXRhZGlyIGRlZmluZWQKKyAqIGF0IGNvbmZpZ3VyYXRpb24gdGltZSBvciBpbiBhICJmZnByZXNldHMiIGZvbGRlciBhbG9uZyB0aGUgZXhlY3V0YWJsZQorICogb24gd2luMzIsIGluIHRoYXQgb3JkZXIuIElmIG5vIHN1Y2ggZmlsZSBpcyBmb3VuZCBhbmQKKyAqIGNvZGVjX25hbWUgaXMgZGVmaW5lZCwgdGhlbiBzZWFyY2ggZm9yIGEgZmlsZSBuYW1lZAorICogY29kZWNfbmFtZS1wcmVzZXRfbmFtZS5hdnByZXNldCBpbiB0aGUgYWJvdmUtbWVudGlvbmVkIGRpcmVjdG9yaWVzLgorICoKKyAqIEBwYXJhbSBmaWxlbmFtZSBidWZmZXIgd2hlcmUgdGhlIG5hbWUgb2YgdGhlIGZvdW5kIGZpbGVuYW1lIGlzIHdyaXR0ZW4KKyAqIEBwYXJhbSBmaWxlbmFtZV9zaXplIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGVuYW1lIGJ1ZmZlcgorICogQHBhcmFtIHByZXNldF9uYW1lIG5hbWUgb2YgdGhlIHByZXNldCB0byBzZWFyY2gKKyAqIEBwYXJhbSBpc19wYXRoIHRlbGwgaWYgcHJlc2V0X25hbWUgaXMgYSBmaWxlbmFtZSBwYXRoCisgKiBAcGFyYW0gY29kZWNfbmFtZSBuYW1lIG9mIHRoZSBjb2RlYyBmb3Igd2hpY2ggdG8gbG9vayBmb3IgdGhlCisgKiBwcmVzZXQsIG1heSBiZSBOVUxMCisgKi8KK0ZJTEUgKmdldF9wcmVzZXRfZmlsZShjaGFyICpmaWxlbmFtZSwgc2l6ZV90IGZpbGVuYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcHJlc2V0X25hbWUsIGludCBpc19wYXRoLCBjb25zdCBjaGFyICpjb2RlY19uYW1lKTsKKworLyoqCisgKiBSZWFsbG9jIGFycmF5IHRvIGhvbGQgbmV3X3NpemUgZWxlbWVudHMgb2YgZWxlbV9zaXplLgorICogQ2FsbHMgZXhpdCgpIG9uIGZhaWx1cmUuCisgKgorICogQHBhcmFtIGFycmF5IGFycmF5IHRvIHJlYWxsb2NhdGUKKyAqIEBwYXJhbSBlbGVtX3NpemUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGVsZW1lbnQKKyAqIEBwYXJhbSBzaXplIG5ldyBlbGVtZW50IGNvdW50IHdpbGwgYmUgd3JpdHRlbiBoZXJlCisgKiBAcGFyYW0gbmV3X3NpemUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHBsYWNlIGluIHJlYWxsb2NhdGVkIGFycmF5CisgKiBAcmV0dXJuIHJlYWxsb2NhdGVkIGFycmF5CisgKi8KK3ZvaWQgKmdyb3dfYXJyYXkodm9pZCAqYXJyYXksIGludCBlbGVtX3NpemUsIGludCAqc2l6ZSwgaW50IG5ld19zaXplKTsKKworI2RlZmluZSBtZWRpYV90eXBlX3N0cmluZyBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcKKworI2RlZmluZSBHUk9XX0FSUkFZKGFycmF5LCBuYl9lbGVtcylcCisgICAgYXJyYXkgPSBncm93X2FycmF5KGFycmF5LCBzaXplb2YoKmFycmF5KSwgJm5iX2VsZW1zLCBuYl9lbGVtcyArIDEpCisKKyNkZWZpbmUgR0VUX1BJWF9GTVRfTkFNRShwaXhfZm10KVwKKyAgICBjb25zdCBjaGFyICpuYW1lID0gYXZfZ2V0X3BpeF9mbXRfbmFtZShwaXhfZm10KTsKKworI2RlZmluZSBHRVRfQ09ERUNfTkFNRShpZClcCisgICAgY29uc3QgY2hhciAqbmFtZSA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoaWQpLT5uYW1lOworCisjZGVmaW5lIEdFVF9TQU1QTEVfRk1UX05BTUUoc2FtcGxlX2ZtdClcCisgICAgY29uc3QgY2hhciAqbmFtZSA9IGF2X2dldF9zYW1wbGVfZm10X25hbWUoc2FtcGxlX2ZtdCkKKworI2RlZmluZSBHRVRfU0FNUExFX1JBVEVfTkFNRShyYXRlKVwKKyAgICBjaGFyIG5hbWVbMTZdO1wKKyAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlZCIsIHJhdGUpOworCisjZGVmaW5lIEdFVF9DSF9MQVlPVVRfTkFNRShjaF9sYXlvdXQpXAorICAgIGNoYXIgbmFtZVsxNl07XAorICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIjB4JSJQUkl4NjQsIGNoX2xheW91dCk7CisKKyNkZWZpbmUgR0VUX0NIX0xBWU9VVF9ERVNDKGNoX2xheW91dClcCisgICAgY2hhciBuYW1lWzEyOF07XAorICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcobmFtZSwgc2l6ZW9mKG5hbWUpLCAwLCBjaF9sYXlvdXQpOworCitkb3VibGUgZ2V0X3JvdGF0aW9uKEFWU3RyZWFtICpzdCk7CisKKyNlbmRpZiAvKiBGRlRPT0xTX0NNRFVUSUxTX0ggKi8KZGlmZiAtLWdpdCBhL2ZmdG9vbHMvZmZtcGVnLmMgYi9mZnRvb2xzL2ZmbXBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MzZhMGUKLS0tIC9kZXYvbnVsbAorKysgYi9mZnRvb2xzL2ZmbXBlZy5jCkBAIC0wLDAgKzEsNDg1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtdWx0aW1lZGlhIGNvbnZlcnRlciBiYXNlZCBvbiB0aGUgRkZtcGVnIGxpYnJhcmllcworICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgSEFWRV9JT19ICisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZgorI2lmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJhdmRldmljZS9hdmRldmljZS5oIgorI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tYXRob3BzLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvb3Nfc3VwcG9ydC5oIgorCisjIGluY2x1ZGUgImxpYmF2ZmlsdGVyL2F2ZmlsdGVyLmgiCisjIGluY2x1ZGUgImxpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oIgorIyBpbmNsdWRlICJsaWJhdmZpbHRlci9idWZmZXJzaW5rLmgiCisKKyNpZiBIQVZFX1NZU19SRVNPVVJDRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNlbGlmIEhBVkVfR0VUUFJPQ0VTU1RJTUVTCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisjaWYgSEFWRV9HRVRQUk9DRVNTTUVNT1JZSU5GTworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwc2FwaS5oPgorI2VuZGlmCisjaWYgSEFWRV9TRVRDT05TT0xFQ1RSTEhBTkRMRVIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworCisjaWYgSEFWRV9TWVNfU0VMRUNUX0gKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKworI2lmIEhBVkVfVEVSTUlPU19ICisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNlbGlmIEhBVkVfS0JISVQKKyNpbmNsdWRlIDxjb25pby5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlICJmZm1wZWcuaCIKKyNpbmNsdWRlICJjbWR1dGlscy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKK2NvbnN0IGNoYXIgcHJvZ3JhbV9uYW1lW10gPSAiZmZtcGVnIjsKK2NvbnN0IGludCBwcm9ncmFtX2JpcnRoX3llYXIgPSAyMDAwOworCitzdGF0aWMgRklMRSAqdnN0YXRzX2ZpbGU7CisKK2NvbnN0IGNoYXIgKmNvbnN0IGZvcmNlZF9rZXlmcmFtZXNfY29uc3RfbmFtZXNbXSA9IHsKKyAgICAibiIsCisgICAgIm5fZm9yY2VkIiwKKyAgICAicHJldl9mb3JjZWRfbiIsCisgICAgInByZXZfZm9yY2VkX3QiLAorICAgICJ0IiwKKyAgICBOVUxMCit9OworCitzdGF0aWMgdm9pZCBkb192aWRlb19zdGF0cyhPdXRwdXRTdHJlYW0gKm9zdCwgaW50IGZyYW1lX3NpemUpOworc3RhdGljIGludDY0X3QgZ2V0dXRpbWUodm9pZCk7CitzdGF0aWMgaW50NjRfdCBnZXRtYXhyc3Modm9pZCk7CitzdGF0aWMgaW50IGlmaWx0ZXJfaGFzX2FsbF9pbnB1dF9mb3JtYXRzKEZpbHRlckdyYXBoICpmZyk7CisKK3N0YXRpYyBpbnQgcnVuX2FzX2RhZW1vbiAgPSAwOworc3RhdGljIGludCBuYl9mcmFtZXNfZHVwID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBkdXBfd2FybmluZyA9IDEwMDA7CitzdGF0aWMgaW50IG5iX2ZyYW1lc19kcm9wID0gMDsKK3N0YXRpYyBpbnQ2NF90IGRlY29kZV9lcnJvcl9zdGF0WzJdOworCitzdGF0aWMgaW50IHdhbnRfc2RwID0gMTsKKworc3RhdGljIGludCBjdXJyZW50X3RpbWU7CitBVklPQ29udGV4dCAqcHJvZ3Jlc3NfYXZpbyA9IE5VTEw7CisKK3N0YXRpYyB1aW50OF90ICpzdWJ0aXRsZV9vdXQ7CisKK0lucHV0U3RyZWFtICoqaW5wdXRfc3RyZWFtcyA9IE5VTEw7CitpbnQgICAgICAgIG5iX2lucHV0X3N0cmVhbXMgPSAwOworSW5wdXRGaWxlICAgKippbnB1dF9maWxlcyAgID0gTlVMTDsKK2ludCAgICAgICAgbmJfaW5wdXRfZmlsZXMgICA9IDA7CisKK091dHB1dFN0cmVhbSAqKm91dHB1dF9zdHJlYW1zID0gTlVMTDsKK2ludCAgICAgICAgIG5iX291dHB1dF9zdHJlYW1zID0gMDsKK091dHB1dEZpbGUgICAqKm91dHB1dF9maWxlcyAgID0gTlVMTDsKK2ludCAgICAgICAgIG5iX291dHB1dF9maWxlcyAgID0gMDsKKworRmlsdGVyR3JhcGggKipmaWx0ZXJncmFwaHM7CitpbnQgICAgICAgIG5iX2ZpbHRlcmdyYXBoczsKKworI2lmIEhBVkVfVEVSTUlPU19ICisKKy8qIGluaXQgdGVybWluYWwgc28gdGhhdCB3ZSBjYW4gZ3JhYiBrZXlzICovCitzdGF0aWMgc3RydWN0IHRlcm1pb3Mgb2xkdHR5Oworc3RhdGljIGludCByZXN0b3JlX3R0eTsKKyNlbmRpZgorCisjaWYgSEFWRV9USFJFQURTCitzdGF0aWMgdm9pZCBmcmVlX2lucHV0X3RocmVhZHModm9pZCk7CisjZW5kaWYKKworLyogc3ViMnZpZGVvIGhhY2s6CisgICBDb252ZXJ0IHN1YnRpdGxlcyB0byB2aWRlbyB3aXRoIGFscGhhIHRvIGluc2VydCB0aGVtIGluIGZpbHRlciBncmFwaHMuCisgICBUaGlzIGlzIGEgdGVtcG9yYXJ5IHNvbHV0aW9uIHVudGlsIGxpYmF2ZmlsdGVyIGdldHMgcmVhbCBzdWJ0aXRsZXMgc3VwcG9ydC4KKyAqLworCitzdGF0aWMgaW50IHN1YjJ2aWRlb19nZXRfYmxhbmtfZnJhbWUoSW5wdXRTdHJlYW0gKmlzdCkKK3sKKyAgICBpbnQgcmV0OworICAgIEFWRnJhbWUgKmZyYW1lID0gaXN0LT5zdWIydmlkZW8uZnJhbWU7CisKKyAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgaXN0LT5zdWIydmlkZW8uZnJhbWUtPndpZHRoICA9IGlzdC0+ZGVjX2N0eC0+d2lkdGggID8gaXN0LT5kZWNfY3R4LT53aWR0aCAgOiBpc3QtPnN1YjJ2aWRlby53OworICAgIGlzdC0+c3ViMnZpZGVvLmZyYW1lLT5oZWlnaHQgPSBpc3QtPmRlY19jdHgtPmhlaWdodCA/IGlzdC0+ZGVjX2N0eC0+aGVpZ2h0IDogaXN0LT5zdWIydmlkZW8uaDsKKyAgICBpc3QtPnN1YjJ2aWRlby5mcmFtZS0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9SR0IzMjsKKyAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIoZnJhbWUsIDMyKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIG1lbXNldChmcmFtZS0+ZGF0YVswXSwgMCwgZnJhbWUtPmhlaWdodCAqIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN1YjJ2aWRlb19jb3B5X3JlY3QodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3VidGl0bGVSZWN0ICpyKQoreworICAgIHVpbnQzMl90ICpwYWwsICpkc3QyOworICAgIHVpbnQ4X3QgKnNyYywgKnNyYzI7CisgICAgaW50IHgsIHk7CisKKyAgICBpZiAoci0+dHlwZSAhPSBTVUJUSVRMRV9CSVRNQVApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAic3ViMnZpZGVvOiBub24tYml0bWFwIHN1YnRpdGxlXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoci0+eCA8IDAgfHwgci0+eCArIHItPncgPiB3IHx8IHItPnkgPCAwIHx8IHItPnkgKyByLT5oID4gaCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJzdWIydmlkZW86IHJlY3RhbmdsZSAoJWQgJWQgJWQgJWQpIG92ZXJmbG93aW5nICVkICVkXG4iLAorICAgICAgICAgICAgci0+eCwgci0+eSwgci0+dywgci0+aCwgdywgaAorICAgICAgICApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZHN0ICs9IHItPnkgKiBkc3RfbGluZXNpemUgKyByLT54ICogNDsKKyAgICBzcmMgPSByLT5kYXRhWzBdOworICAgIHBhbCA9ICh1aW50MzJfdCAqKXItPmRhdGFbMV07CisgICAgZm9yICh5ID0gMDsgeSA8IHItPmg7IHkrKykgeworICAgICAgICBkc3QyID0gKHVpbnQzMl90ICopZHN0OworICAgICAgICBzcmMyID0gc3JjOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgci0+dzsgeCsrKQorICAgICAgICAgICAgKihkc3QyKyspID0gcGFsWyooc3JjMisrKV07CisgICAgICAgIGRzdCArPSBkc3RfbGluZXNpemU7CisgICAgICAgIHNyYyArPSByLT5saW5lc2l6ZVswXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHN1YjJ2aWRlb19wdXNoX3JlZihJbnB1dFN0cmVhbSAqaXN0LCBpbnQ2NF90IHB0cykKK3sKKyAgICBBVkZyYW1lICpmcmFtZSA9IGlzdC0+c3ViMnZpZGVvLmZyYW1lOworICAgIGludCBpOworICAgIGludCByZXQ7CisKKyAgICBhdl9hc3NlcnQxKGZyYW1lLT5kYXRhWzBdKTsKKyAgICBpc3QtPnN1YjJ2aWRlby5sYXN0X3B0cyA9IGZyYW1lLT5wdHMgPSBwdHM7CisgICAgZm9yIChpID0gMDsgaSA8IGlzdC0+bmJfZmlsdGVyczsgaSsrKSB7CisgICAgICAgIHJldCA9IGF2X2J1ZmZlcnNyY19hZGRfZnJhbWVfZmxhZ3MoaXN0LT5maWx0ZXJzW2ldLT5maWx0ZXIsIGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0JVRkZFUlNSQ19GTEFHX0tFRVBfUkVGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJTUkNfRkxBR19QVVNIKTsKKyAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SX0VPRiAmJiByZXQgPCAwKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiRXJyb3Igd2hpbGUgYWRkIHRoZSBmcmFtZSB0byBidWZmZXIgc291cmNlKCVzKS5cbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICB9Cit9CisKK3ZvaWQgc3ViMnZpZGVvX3VwZGF0ZShJbnB1dFN0cmVhbSAqaXN0LCBBVlN1YnRpdGxlICpzdWIpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBpc3QtPnN1YjJ2aWRlby5mcmFtZTsKKyAgICBpbnQ4X3QgKmRzdDsKKyAgICBpbnQgICAgIGRzdF9saW5lc2l6ZTsKKyAgICBpbnQgbnVtX3JlY3RzLCBpOworICAgIGludDY0X3QgcHRzLCBlbmRfcHRzOworCisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChzdWIpIHsKKyAgICAgICAgcHRzICAgICAgID0gYXZfcmVzY2FsZV9xKHN1Yi0+cHRzICsgc3ViLT5zdGFydF9kaXNwbGF5X3RpbWUgKiAxMDAwTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSwgaXN0LT5zdC0+dGltZV9iYXNlKTsKKyAgICAgICAgZW5kX3B0cyAgID0gYXZfcmVzY2FsZV9xKHN1Yi0+cHRzICsgc3ViLT5lbmRfZGlzcGxheV90aW1lICAgKiAxMDAwTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSwgaXN0LT5zdC0+dGltZV9iYXNlKTsKKyAgICAgICAgbnVtX3JlY3RzID0gc3ViLT5udW1fcmVjdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRzICAgICAgID0gaXN0LT5zdWIydmlkZW8uZW5kX3B0czsKKyAgICAgICAgZW5kX3B0cyAgID0gSU5UNjRfTUFYOworICAgICAgICBudW1fcmVjdHMgPSAwOworICAgIH0KKyAgICBpZiAoc3ViMnZpZGVvX2dldF9ibGFua19mcmFtZShpc3QpIDwgMCkgeworICAgICAgICBhdl9sb2coaXN0LT5kZWNfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW1wb3NzaWJsZSB0byBnZXQgYSBibGFuayBjYW52YXMuXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkc3QgICAgICAgICAgPSBmcmFtZS0+ZGF0YSAgICBbMF07CisgICAgZHN0X2xpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcmVjdHM7IGkrKykKKyAgICAgICAgc3ViMnZpZGVvX2NvcHlfcmVjdChkc3QsIGRzdF9saW5lc2l6ZSwgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0LCBzdWItPnJlY3RzW2ldKTsKKyAgICBzdWIydmlkZW9fcHVzaF9yZWYoaXN0LCBwdHMpOworICAgIGlzdC0+c3ViMnZpZGVvLmVuZF9wdHMgPSBlbmRfcHRzOworfQorCitzdGF0aWMgdm9pZCBzdWIydmlkZW9faGVhcnRiZWF0KElucHV0U3RyZWFtICppc3QsIGludDY0X3QgcHRzKQoreworICAgIElucHV0RmlsZSAqaW5maWxlID0gaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XTsKKyAgICBpbnQgaSwgaiwgbmJfcmVxczsKKyAgICBpbnQ2NF90IHB0czI7CisKKyAgICAvKiBXaGVuIGEgZnJhbWUgaXMgcmVhZCBmcm9tIGEgZmlsZSwgZXhhbWluZSBhbGwgc3ViMnZpZGVvIHN0cmVhbXMgaW4KKyAgICAgICB0aGUgc2FtZSBmaWxlIGFuZCBzZW5kIHRoZSBzdWIydmlkZW8gZnJhbWUgYWdhaW4uIE90aGVyd2lzZSwgZGVjb2RlZAorICAgICAgIHZpZGVvIGZyYW1lcyBjb3VsZCBiZSBhY2N1bXVsYXRpbmcgaW4gdGhlIGZpbHRlciBncmFwaCB3aGlsZSBhIGZpbHRlcgorICAgICAgIChwb3NzaWJseSBvdmVybGF5KSBpcyBkZXNwZXJhdGVseSB3YWl0aW5nIGZvciBhIHN1YnRpdGxlIGZyYW1lLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBpbmZpbGUtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBJbnB1dFN0cmVhbSAqaXN0MiA9IGlucHV0X3N0cmVhbXNbaW5maWxlLT5pc3RfaW5kZXggKyBpXTsKKyAgICAgICAgaWYgKCFpc3QyLT5zdWIydmlkZW8uZnJhbWUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLyogc3VidGl0bGVzIHNlZW0gdG8gYmUgdXN1YWxseSBtdXhlZCBhaGVhZCBvZiBvdGhlciBzdHJlYW1zOworICAgICAgICAgICBpZiBub3QsIHN1YnRyYWN0aW5nIGEgbGFyZ2VyIHRpbWUgaGVyZSBpcyBuZWNlc3NhcnkgKi8KKyAgICAgICAgcHRzMiA9IGF2X3Jlc2NhbGVfcShwdHMsIGlzdC0+c3QtPnRpbWVfYmFzZSwgaXN0Mi0+c3QtPnRpbWVfYmFzZSkgLSAxOworICAgICAgICAvKiBkbyBub3Qgc2VuZCB0aGUgaGVhcnRiZWF0IGZyYW1lIGlmIHRoZSBzdWJ0aXRsZSBpcyBhbHJlYWR5IGFoZWFkICovCisgICAgICAgIGlmIChwdHMyIDw9IGlzdDItPnN1YjJ2aWRlby5sYXN0X3B0cykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocHRzMiA+PSBpc3QyLT5zdWIydmlkZW8uZW5kX3B0cyB8fAorICAgICAgICAgICAgKCFpc3QyLT5zdWIydmlkZW8uZnJhbWUtPmRhdGFbMF0gJiYgaXN0Mi0+c3ViMnZpZGVvLmVuZF9wdHMgPCBJTlQ2NF9NQVgpKQorICAgICAgICAgICAgc3ViMnZpZGVvX3VwZGF0ZShpc3QyLCBOVUxMKTsKKyAgICAgICAgZm9yIChqID0gMCwgbmJfcmVxcyA9IDA7IGogPCBpc3QyLT5uYl9maWx0ZXJzOyBqKyspCisgICAgICAgICAgICBuYl9yZXFzICs9IGF2X2J1ZmZlcnNyY19nZXRfbmJfZmFpbGVkX3JlcXVlc3RzKGlzdDItPmZpbHRlcnNbal0tPmZpbHRlcik7CisgICAgICAgIGlmIChuYl9yZXFzKQorICAgICAgICAgICAgc3ViMnZpZGVvX3B1c2hfcmVmKGlzdDIsIHB0czIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3ViMnZpZGVvX2ZsdXNoKElucHV0U3RyZWFtICppc3QpCit7CisgICAgaW50IGk7CisgICAgaW50IHJldDsKKworICAgIGlmIChpc3QtPnN1YjJ2aWRlby5lbmRfcHRzIDwgSU5UNjRfTUFYKQorICAgICAgICBzdWIydmlkZW9fdXBkYXRlKGlzdCwgTlVMTCk7CisgICAgZm9yIChpID0gMDsgaSA8IGlzdC0+bmJfZmlsdGVyczsgaSsrKSB7CisgICAgICAgIHJldCA9IGF2X2J1ZmZlcnNyY19hZGRfZnJhbWUoaXN0LT5maWx0ZXJzW2ldLT5maWx0ZXIsIE5VTEwpOworICAgICAgICBpZiAocmV0ICE9IEFWRVJST1JfRU9GICYmIHJldCA8IDApCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJGbHVzaCB0aGUgZnJhbWUgZXJyb3IuXG4iKTsKKyAgICB9Cit9CisKKy8qIGVuZCBvZiBzdWIydmlkZW8gaGFjayAqLworCitzdGF0aWMgdm9pZCB0ZXJtX2V4aXRfc2lnc2FmZSh2b2lkKQoreworI2lmIEhBVkVfVEVSTUlPU19ICisgICAgaWYocmVzdG9yZV90dHkpCisgICAgICAgIHRjc2V0YXR0ciAoMCwgVENTQU5PVywgJm9sZHR0eSk7CisjZW5kaWYKK30KKwordm9pZCB0ZXJtX2V4aXQodm9pZCkKK3sKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1FVSUVULCAiJXMiLCAiIik7CisgICAgdGVybV9leGl0X3NpZ3NhZmUoKTsKK30KKworc3RhdGljIHZvbGF0aWxlIGludCByZWNlaXZlZF9zaWd0ZXJtID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcmVjZWl2ZWRfbmJfc2lnbmFscyA9IDA7CitzdGF0aWMgYXRvbWljX2ludCB0cmFuc2NvZGVfaW5pdF9kb25lID0gQVRPTUlDX1ZBUl9JTklUKDApOworc3RhdGljIHZvbGF0aWxlIGludCBmZm1wZWdfZXhpdGVkID0gMDsKK3N0YXRpYyBpbnQgbWFpbl9yZXR1cm5fY29kZSA9IDA7CisKK3N0YXRpYyB2b2lkCitzaWd0ZXJtX2hhbmRsZXIoaW50IHNpZykKK3sKKyAgICBpbnQgcmV0OworICAgIHJlY2VpdmVkX3NpZ3Rlcm0gPSBzaWc7CisgICAgcmVjZWl2ZWRfbmJfc2lnbmFscysrOworICAgIHRlcm1fZXhpdF9zaWdzYWZlKCk7CisgICAgaWYocmVjZWl2ZWRfbmJfc2lnbmFscyA+IDMpIHsKKyAgICAgICAgcmV0ID0gd3JpdGUoMi8qU1RERVJSX0ZJTEVOTyovLCAiUmVjZWl2ZWQgPiAzIHN5c3RlbSBzaWduYWxzLCBoYXJkIGV4aXRpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgIHN0cmxlbigiUmVjZWl2ZWQgPiAzIHN5c3RlbSBzaWduYWxzLCBoYXJkIGV4aXRpbmdcbiIpKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsgLyogRG8gbm90aGluZyAqLyB9OworICAgICAgICBleGl0KDEyMyk7CisgICAgfQorfQorCisjaWYgSEFWRV9TRVRDT05TT0xFQ1RSTEhBTkRMRVIKK3N0YXRpYyBCT09MIFdJTkFQSSBDdHJsSGFuZGxlcihEV09SRCBmZHdDdHJsVHlwZSkKK3sKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiXG5SZWNlaXZlZCB3aW5kb3dzIHNpZ25hbCAlbGRcbiIsIGZkd0N0cmxUeXBlKTsKKworICAgIHN3aXRjaCAoZmR3Q3RybFR5cGUpCisgICAgeworICAgIGNhc2UgQ1RSTF9DX0VWRU5UOgorICAgIGNhc2UgQ1RSTF9CUkVBS19FVkVOVDoKKyAgICAgICAgc2lndGVybV9oYW5kbGVyKFNJR0lOVCk7CisgICAgICAgIHJldHVybiBUUlVFOworCisgICAgY2FzZSBDVFJMX0NMT1NFX0VWRU5UOgorICAgIGNhc2UgQ1RSTF9MT0dPRkZfRVZFTlQ6CisgICAgY2FzZSBDVFJMX1NIVVRET1dOX0VWRU5UOgorICAgICAgICBzaWd0ZXJtX2hhbmRsZXIoU0lHVEVSTSk7CisgICAgICAgIC8qIEJhc2ljYWxseSwgd2l0aCB0aGVzZSAzIGV2ZW50cywgd2hlbiB3ZSByZXR1cm4gZnJvbSB0aGlzIG1ldGhvZCB0aGUKKyAgICAgICAgICAgcHJvY2VzcyBpcyBoYXJkIHRlcm1pbmF0ZWQsIHNvIHN0YWxsIGFzIGxvbmcgYXMgd2UgbmVlZCB0bworICAgICAgICAgICB0byB0cnkgYW5kIGxldCB0aGUgbWFpbiB0aHJlYWQocykgY2xlYW4gdXAgYW5kIGdyYWNlZnVsbHkgdGVybWluYXRlCisgICAgICAgICAgICh3ZSBoYXZlIGF0IG1vc3QgNSBzZWNvbmRzLCBidXQgc2hvdWxkIGJlIGRvbmUgZmFyIGJlZm9yZSB0aGF0KS4gKi8KKyAgICAgICAgd2hpbGUgKCFmZm1wZWdfZXhpdGVkKSB7CisgICAgICAgICAgICBTbGVlcCgwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVFJVRTsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJSZWNlaXZlZCB1bmtub3duIHdpbmRvd3Mgc2lnbmFsICVsZFxuIiwgZmR3Q3RybFR5cGUpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorfQorI2VuZGlmCisKK3ZvaWQgdGVybV9pbml0KHZvaWQpCit7CisjaWYgSEFWRV9URVJNSU9TX0gKKyAgICBpZiAoIXJ1bl9hc19kYWVtb24gJiYgc3RkaW5faW50ZXJhY3Rpb24pIHsKKyAgICAgICAgc3RydWN0IHRlcm1pb3MgdHR5OworICAgICAgICBpZiAodGNnZXRhdHRyICgwLCAmdHR5KSA9PSAwKSB7CisgICAgICAgICAgICBvbGR0dHkgPSB0dHk7CisgICAgICAgICAgICByZXN0b3JlX3R0eSA9IDE7CisKKyAgICAgICAgICAgIHR0eS5jX2lmbGFnICY9IH4oSUdOQlJLfEJSS0lOVHxQQVJNUkt8SVNUUklQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxJTkxDUnxJR05DUnxJQ1JOTHxJWE9OKTsKKyAgICAgICAgICAgIHR0eS5jX29mbGFnIHw9IE9QT1NUOworICAgICAgICAgICAgdHR5LmNfbGZsYWcgJj0gfihFQ0hPfEVDSE9OTHxJQ0FOT058SUVYVEVOKTsKKyAgICAgICAgICAgIHR0eS5jX2NmbGFnICY9IH4oQ1NJWkV8UEFSRU5CKTsKKyAgICAgICAgICAgIHR0eS5jX2NmbGFnIHw9IENTODsKKyAgICAgICAgICAgIHR0eS5jX2NjW1ZNSU5dID0gMTsKKyAgICAgICAgICAgIHR0eS5jX2NjW1ZUSU1FXSA9IDA7CisKKyAgICAgICAgICAgIHRjc2V0YXR0ciAoMCwgVENTQU5PVywgJnR0eSk7CisgICAgICAgIH0KKyAgICAgICAgc2lnbmFsKFNJR1FVSVQsIHNpZ3Rlcm1faGFuZGxlcik7IC8qIFF1aXQgKFBPU0lYKS4gICovCisgICAgfQorI2VuZGlmCisKKyAgICBzaWduYWwoU0lHSU5UICwgc2lndGVybV9oYW5kbGVyKTsgLyogSW50ZXJydXB0IChBTlNJKS4gICAgKi8KKyAgICBzaWduYWwoU0lHVEVSTSwgc2lndGVybV9oYW5kbGVyKTsgLyogVGVybWluYXRpb24gKEFOU0kpLiAgKi8KKyNpZmRlZiBTSUdYQ1BVCisgICAgc2lnbmFsKFNJR1hDUFUsIHNpZ3Rlcm1faGFuZGxlcik7CisjZW5kaWYKKyNpZmRlZiBTSUdQSVBFCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOyAvKiBCcm9rZW4gcGlwZSAoUE9TSVgpLiAqLworI2VuZGlmCisjaWYgSEFWRV9TRVRDT05TT0xFQ1RSTEhBTkRMRVIKKyAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIoKFBIQU5ETEVSX1JPVVRJTkUpIEN0cmxIYW5kbGVyLCBUUlVFKTsKKyNlbmRpZgorfQorCisvKiByZWFkIGEga2V5IHdpdGhvdXQgYmxvY2tpbmcgKi8KK3N0YXRpYyBpbnQgcmVhZF9rZXkodm9pZCkKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGNoOworI2lmIEhBVkVfVEVSTUlPU19ICisgICAgaW50IG4gPSAxOworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGZkX3NldCByZmRzOworCisgICAgRkRfWkVSTygmcmZkcyk7CisgICAgRkRfU0VUKDAsICZyZmRzKTsKKyAgICB0di50dl9zZWMgPSAwOworICAgIHR2LnR2X3VzZWMgPSAwOworICAgIG4gPSBzZWxlY3QoMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisgICAgaWYgKG4gPiAwKSB7CisgICAgICAgIG4gPSByZWFkKDAsICZjaCwgMSk7CisgICAgICAgIGlmIChuID09IDEpCisgICAgICAgICAgICByZXR1cm4gY2g7CisKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorI2VsaWYgSEFWRV9LQkhJVAorIyAgICBpZiBIQVZFX1BFRUtOQU1FRFBJUEUKKyAgICBzdGF0aWMgaW50IGlzX3BpcGU7CisgICAgc3RhdGljIEhBTkRMRSBpbnB1dF9oYW5kbGU7CisgICAgRFdPUkQgZHcsIG5jaGFyczsKKyAgICBpZighaW5wdXRfaGFuZGxlKXsKKyAgICAgICAgaW5wdXRfaGFuZGxlID0gR2V0U3RkSGFuZGxlKFNURF9JTlBVVF9IQU5ETEUpOworICAgICAgICBpc19waXBlID0gIUdldENvbnNvbGVNb2RlKGlucHV0X2hhbmRsZSwgJmR3KTsKKyAgICB9CisKKyAgICBpZiAoaXNfcGlwZSkgeworICAgICAgICAvKiBXaGVuIHJ1bm5pbmcgdW5kZXIgYSBHVUksIHlvdSB3aWxsIGVuZCBoZXJlLiAqLworICAgICAgICBpZiAoIVBlZWtOYW1lZFBpcGUoaW5wdXRfaGFuZGxlLCBOVUxMLCAwLCBOVUxMLCAmbmNoYXJzLCBOVUxMKSkgeworICAgICAgICAgICAgLy8gaW5wdXQgcGlwZSBtYXkgaGF2ZSBiZWVuIGNsb3NlZCBieSB0aGUgcHJvZ3JhbSB0aGF0IHJhbiBmZm1wZWcKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvL1JlYWQgaXQKKyAgICAgICAgaWYobmNoYXJzICE9IDApIHsKKyAgICAgICAgICAgIHJlYWQoMCwgJmNoLCAxKTsKKyAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisjICAgIGVuZGlmCisgICAgaWYoa2JoaXQoKSkKKyAgICAgICAgcmV0dXJuKGdldGNoKCkpOworI2VuZGlmCisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGRlY29kZV9pbnRlcnJ1cHRfY2Iodm9pZCAqY3R4KQoreworICAgIHJldHVybiByZWNlaXZlZF9uYl9zaWduYWxzID4gYXRvbWljX2xvYWQoJnRyYW5zY29kZV9pbml0X2RvbmUpOworfQorCitjb25zdCBBVklPSW50ZXJydXB0Q0IgaW50X2NiID0geyBkZWNvZGVfaW50ZXJydXB0X2NiLCBOVUxMIH07CisKK3N0YXRpYyB2b2lkIGZmbXBlZ19jbGVhbnVwKGludCByZXQpCit7CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoZG9fYmVuY2htYXJrKSB7CisgICAgICAgIGludCBtYXhyc3MgPSBnZXRtYXhyc3MoKSAvIDEwMjQ7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImJlbmNoOiBtYXhyc3M9JWlrQlxuIiwgbWF4cnNzKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZmlsdGVyZ3JhcGhzOyBpKyspIHsKKyAgICAgICAgRmlsdGVyR3JhcGggKmZnID0gZmlsdGVyZ3JhcGhzW2ldOworICAgICAgICBhdmZpbHRlcl9ncmFwaF9mcmVlKCZmZy0+Z3JhcGgpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmctPm5iX2lucHV0czsgaisrKSB7CisgICAgICAgICAgICB3aGlsZSAoYXZfZmlmb19zaXplKGZnLT5pbnB1dHNbal0tPmZyYW1lX3F1ZXVlKSkgeworICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lOworICAgICAgICAgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKGZnLT5pbnB1dHNbal0tPmZyYW1lX3F1ZXVlLCAmZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZyYW1lKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZmlmb19mcmVlcCgmZmctPmlucHV0c1tqXS0+ZnJhbWVfcXVldWUpOworICAgICAgICAgICAgaWYgKGZnLT5pbnB1dHNbal0tPmlzdC0+c3ViMnZpZGVvLnN1Yl9xdWV1ZSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChhdl9maWZvX3NpemUoZmctPmlucHV0c1tqXS0+aXN0LT5zdWIydmlkZW8uc3ViX3F1ZXVlKSkgeworICAgICAgICAgICAgICAgICAgICBBVlN1YnRpdGxlIHN1YjsKKyAgICAgICAgICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQoZmctPmlucHV0c1tqXS0+aXN0LT5zdWIydmlkZW8uc3ViX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViLCBzaXplb2Yoc3ViKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGF2c3VidGl0bGVfZnJlZSgmc3ViKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfZmlmb19mcmVlcCgmZmctPmlucHV0c1tqXS0+aXN0LT5zdWIydmlkZW8uc3ViX3F1ZXVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZmctPmlucHV0c1tqXS0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICBhdl9mcmVlcCgmZmctPmlucHV0c1tqXS0+bmFtZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmZmctPmlucHV0c1tqXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZXAoJmZnLT5pbnB1dHMpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmctPm5iX291dHB1dHM7IGorKykgeworICAgICAgICAgICAgYXZfZnJlZXAoJmZnLT5vdXRwdXRzW2pdLT5uYW1lKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZmZy0+b3V0cHV0c1tqXS0+Zm9ybWF0cyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmZmctPm91dHB1dHNbal0tPmNoYW5uZWxfbGF5b3V0cyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmZmctPm91dHB1dHNbal0tPnNhbXBsZV9yYXRlcyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmZmctPm91dHB1dHNbal0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZmZy0+b3V0cHV0cyk7CisgICAgICAgIGF2X2ZyZWVwKCZmZy0+Z3JhcGhfZGVzYyk7CisKKyAgICAgICAgYXZfZnJlZXAoJmZpbHRlcmdyYXBoc1tpXSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZmaWx0ZXJncmFwaHMpOworCisgICAgYXZfZnJlZXAoJnN1YnRpdGxlX291dCk7CisKKyAgICAvKiBjbG9zZSBmaWxlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfZmlsZXM7IGkrKykgeworICAgICAgICBPdXRwdXRGaWxlICpvZiA9IG91dHB1dF9maWxlc1tpXTsKKyAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzOworICAgICAgICBpZiAoIW9mKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHMgPSBvZi0+Y3R4OworICAgICAgICBpZiAocyAmJiBzLT5vZm9ybWF0ICYmICEocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpKQorICAgICAgICAgICAgYXZpb19jbG9zZXAoJnMtPnBiKTsKKyAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHMpOworICAgICAgICBhdl9kaWN0X2ZyZWUoJm9mLT5vcHRzKTsKKworICAgICAgICBhdl9mcmVlcCgmb3V0cHV0X2ZpbGVzW2ldKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKKworICAgICAgICBpZiAoIW9zdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvc3QtPm5iX2JpdHN0cmVhbV9maWx0ZXJzOyBqKyspCisgICAgICAgICAgICBhdl9ic2ZfZnJlZSgmb3N0LT5ic2ZfY3R4W2pdKTsKKyAgICAgICAgYXZfZnJlZXAoJm9zdC0+YnNmX2N0eCk7CisKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3N0LT5maWx0ZXJlZF9mcmFtZSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm9zdC0+bGFzdF9mcmFtZSk7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmb3N0LT5lbmNvZGVyX29wdHMpOworCisgICAgICAgIGF2X2ZyZWVwKCZvc3QtPmZvcmNlZF9rZXlmcmFtZXMpOworICAgICAgICBhdl9leHByX2ZyZWUob3N0LT5mb3JjZWRfa2V5ZnJhbWVzX3BleHByKTsKKyAgICAgICAgYXZfZnJlZXAoJm9zdC0+YXZmaWx0ZXIpOworICAgICAgICBhdl9mcmVlcCgmb3N0LT5sb2dmaWxlX3ByZWZpeCk7CisKKyAgICAgICAgYXZfZnJlZXAoJm9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwKTsKKyAgICAgICAgb3N0LT5hdWRpb19jaGFubmVsc19tYXBwZWQgPSAwOworCisgICAgICAgIGF2X2RpY3RfZnJlZSgmb3N0LT5zd3NfZGljdCk7CisKKyAgICAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJm9zdC0+ZW5jX2N0eCk7CisgICAgICAgIGF2Y29kZWNfcGFyYW1ldGVyc19mcmVlKCZvc3QtPnJlZl9wYXIpOworCisgICAgICAgIGlmIChvc3QtPm11eGluZ19xdWV1ZSkgeworICAgICAgICAgICAgd2hpbGUgKGF2X2ZpZm9fc2l6ZShvc3QtPm11eGluZ19xdWV1ZSkpIHsKKyAgICAgICAgICAgICAgICBBVlBhY2tldCBwa3Q7CisgICAgICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQob3N0LT5tdXhpbmdfcXVldWUsICZwa3QsIHNpemVvZihwa3QpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9maWZvX2ZyZWVwKCZvc3QtPm11eGluZ19xdWV1ZSk7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlcCgmb3V0cHV0X3N0cmVhbXNbaV0pOworICAgIH0KKyNpZiBIQVZFX1RIUkVBRFMKKyAgICBmcmVlX2lucHV0X3RocmVhZHMoKTsKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9maWxlczsgaSsrKSB7CisgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZpbnB1dF9maWxlc1tpXS0+Y3R4KTsKKyAgICAgICAgYXZfZnJlZXAoJmlucHV0X2ZpbGVzW2ldKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X3N0cmVhbXM7IGkrKykgeworICAgICAgICBJbnB1dFN0cmVhbSAqaXN0ID0gaW5wdXRfc3RyZWFtc1tpXTsKKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpc3QtPmRlY29kZWRfZnJhbWUpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpc3QtPmZpbHRlcl9mcmFtZSk7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmaXN0LT5kZWNvZGVyX29wdHMpOworICAgICAgICBhdnN1YnRpdGxlX2ZyZWUoJmlzdC0+cHJldl9zdWIuc3VidGl0bGUpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpc3QtPnN1YjJ2aWRlby5mcmFtZSk7CisgICAgICAgIGF2X2ZyZWVwKCZpc3QtPmZpbHRlcnMpOworICAgICAgICBhdl9mcmVlcCgmaXN0LT5od2FjY2VsX2RldmljZSk7CisgICAgICAgIGF2X2ZyZWVwKCZpc3QtPmR0c19idWZmZXIpOworCisgICAgICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZpc3QtPmRlY19jdHgpOworCisgICAgICAgIGF2X2ZyZWVwKCZpbnB1dF9zdHJlYW1zW2ldKTsKKyAgICB9CisKKyAgICBpZiAodnN0YXRzX2ZpbGUpIHsKKyAgICAgICAgaWYgKGZjbG9zZSh2c3RhdHNfZmlsZSkpCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJFcnJvciBjbG9zaW5nIHZzdGF0cyBmaWxlLCBsb3NzIG9mIGluZm9ybWF0aW9uIHBvc3NpYmxlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKEFWRVJST1IoZXJybm8pKSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZ2c3RhdHNfZmlsZW5hbWUpOworCisgICAgYXZfZnJlZXAoJmlucHV0X3N0cmVhbXMpOworICAgIGF2X2ZyZWVwKCZpbnB1dF9maWxlcyk7CisgICAgYXZfZnJlZXAoJm91dHB1dF9zdHJlYW1zKTsKKyAgICBhdl9mcmVlcCgmb3V0cHV0X2ZpbGVzKTsKKworICAgIHVuaW5pdF9vcHRzKCk7CisKKyAgICBhdmZvcm1hdF9uZXR3b3JrX2RlaW5pdCgpOworCisgICAgaWYgKHJlY2VpdmVkX3NpZ3Rlcm0pIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiRXhpdGluZyBub3JtYWxseSwgcmVjZWl2ZWQgc2lnbmFsICVkLlxuIiwKKyAgICAgICAgICAgICAgIChpbnQpIHJlY2VpdmVkX3NpZ3Rlcm0pOworICAgIH0gZWxzZSBpZiAocmV0ICYmIGF0b21pY19sb2FkKCZ0cmFuc2NvZGVfaW5pdF9kb25lKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJDb252ZXJzaW9uIGZhaWxlZCFcbiIpOworICAgIH0KKyAgICB0ZXJtX2V4aXQoKTsKKyAgICBmZm1wZWdfZXhpdGVkID0gMTsKK30KKwordm9pZCByZW1vdmVfYXZvcHRpb25zKEFWRGljdGlvbmFyeSAqKmEsIEFWRGljdGlvbmFyeSAqYikKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IE5VTEw7CisKKyAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChiLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgYXZfZGljdF9zZXQoYSwgdC0+a2V5LCBOVUxMLCBBVl9ESUNUX01BVENIX0NBU0UpOworICAgIH0KK30KKwordm9pZCBhc3NlcnRfYXZvcHRpb25zKEFWRGljdGlvbmFyeSAqbSkKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdDsKKyAgICBpZiAoKHQgPSBhdl9kaWN0X2dldChtLCAiIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIk9wdGlvbiAlcyBub3QgZm91bmQuXG4iLCB0LT5rZXkpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhYm9ydF9jb2RlY19leHBlcmltZW50YWwoQVZDb2RlYyAqYywgaW50IGVuY29kZXIpCit7CisgICAgZXhpdF9wcm9ncmFtKDEpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfYmVuY2htYXJrKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIGlmIChkb19iZW5jaG1hcmtfYWxsKSB7CisgICAgICAgIGludDY0X3QgdCA9IGdldHV0aW1lKCk7CisgICAgICAgIHZhX2xpc3QgdmE7CisgICAgICAgIGNoYXIgYnVmWzEwMjRdOworCisgICAgICAgIGlmIChmbXQpIHsKKyAgICAgICAgICAgIHZhX3N0YXJ0KHZhLCBmbXQpOworICAgICAgICAgICAgdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgdmEpOworICAgICAgICAgICAgdmFfZW5kKHZhKTsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImJlbmNoOiAlOCJQUkl1NjQiICVzIFxuIiwgdCAtIGN1cnJlbnRfdGltZSwgYnVmKTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50X3RpbWUgPSB0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2xvc2VfYWxsX291dHB1dF9zdHJlYW1zKE91dHB1dFN0cmVhbSAqb3N0LCBPU1RGaW5pc2hlZCB0aGlzX3N0cmVhbSwgT1NURmluaXNoZWQgb3RoZXJzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3N0MiA9IG91dHB1dF9zdHJlYW1zW2ldOworICAgICAgICBvc3QyLT5maW5pc2hlZCB8PSBvc3QgPT0gb3N0MiA/IHRoaXNfc3RyZWFtIDogb3RoZXJzOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd3JpdGVfcGFja2V0KE91dHB1dEZpbGUgKm9mLCBBVlBhY2tldCAqcGt0LCBPdXRwdXRTdHJlYW0gKm9zdCwgaW50IHVucXVldWUpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gb2YtPmN0eDsKKyAgICBBVlN0cmVhbSAqc3QgPSBvc3QtPnN0OworICAgIGludCByZXQ7CisKKyAgICAvKgorICAgICAqIEF1ZGlvIGVuY29kZXJzIG1heSBzcGxpdCB0aGUgcGFja2V0cyAtLSAgI2ZyYW1lcyBpbiAhPSAjcGFja2V0cyBvdXQuCisgICAgICogQnV0IHRoZXJlIGlzIG5vIHJlb3JkZXJpbmcsIHNvIHdlIGNhbiBsaW1pdCB0aGUgbnVtYmVyIG9mIG91dHB1dCBwYWNrZXRzCisgICAgICogYnkgc2ltcGx5IGRyb3BwaW5nIHRoZW0gaGVyZS4KKyAgICAgKiBDb3VudGluZyBlbmNvZGVkIHZpZGVvIGZyYW1lcyBuZWVkcyB0byBiZSBkb25lIHNlcGFyYXRlbHkgYmVjYXVzZSBvZgorICAgICAqIHJlb3JkZXJpbmcsIHNlZSBkb192aWRlb19vdXQoKS4KKyAgICAgKiBEbyBub3QgY291bnQgdGhlIHBhY2tldCB3aGVuIHVucXVldWVkIGJlY2F1c2UgaXQgaGFzIGJlZW4gY291bnRlZCB3aGVuIHF1ZXVlZC4KKyAgICAgKi8KKyAgICBpZiAoIShzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIG9zdC0+ZW5jb2RpbmdfbmVlZGVkKSAmJiAhdW5xdWV1ZSkgeworICAgICAgICBpZiAob3N0LT5mcmFtZV9udW1iZXIgPj0gb3N0LT5tYXhfZnJhbWVzKSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBvc3QtPmZyYW1lX251bWJlcisrOworICAgIH0KKworICAgIGlmICghb2YtPmhlYWRlcl93cml0dGVuKSB7CisgICAgICAgIEFWUGFja2V0IHRtcF9wa3QgPSB7MH07CisgICAgICAgIC8qIHRoZSBtdXhlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LCBidWZmZXIgdGhlIHBhY2tldCAqLworICAgICAgICBpZiAoIWF2X2ZpZm9fc3BhY2Uob3N0LT5tdXhpbmdfcXVldWUpKSB7CisgICAgICAgICAgICBpbnQgbmV3X3NpemUgPSBGRk1JTigyICogYXZfZmlmb19zaXplKG9zdC0+bXV4aW5nX3F1ZXVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+bWF4X211eGluZ19xdWV1ZV9zaXplKTsKKyAgICAgICAgICAgIGlmIChuZXdfc2l6ZSA8PSBhdl9maWZvX3NpemUob3N0LT5tdXhpbmdfcXVldWUpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlRvbyBtYW55IHBhY2tldHMgYnVmZmVyZWQgZm9yIG91dHB1dCBzdHJlYW0gJWQ6JWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+c3QtPmluZGV4KTsKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBhdl9maWZvX3JlYWxsb2MyKG9zdC0+bXV4aW5nX3F1ZXVlLCBuZXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gYXZfcGFja2V0X3JlZigmdG1wX3BrdCwgcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShvc3QtPm11eGluZ19xdWV1ZSwgJnRtcF9wa3QsIHNpemVvZih0bXBfcGt0KSwgTlVMTCk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIHZpZGVvX3N5bmNfbWV0aG9kID09IFZTWU5DX0RST1ApIHx8CisgICAgICAgIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIGF1ZGlvX3N5bmNfbWV0aG9kIDwgMCkpCisgICAgICAgIHBrdC0+cHRzID0gcGt0LT5kdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGludCBpOworICAgICAgICB1aW50OF90ICpzZCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfUVVBTElUWV9TVEFUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgb3N0LT5xdWFsaXR5ID0gc2QgPyBBVl9STDMyKHNkKSA6IC0xOworICAgICAgICBvc3QtPnBpY3RfdHlwZSA9IHNkID8gc2RbNF0gOiBBVl9QSUNUVVJFX1RZUEVfTk9ORTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpPEZGX0FSUkFZX0VMRU1TKG9zdC0+ZXJyb3IpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzZCAmJiBpIDwgc2RbNV0pCisgICAgICAgICAgICAgICAgb3N0LT5lcnJvcltpXSA9IEFWX1JMNjQoc2QgKyA4ICsgOCppKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvc3QtPmVycm9yW2ldID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3N0LT5mcmFtZV9yYXRlLm51bSAmJiBvc3QtPmlzX2NmcikgeworICAgICAgICAgICAgaWYgKHBrdC0+ZHVyYXRpb24gPiAwKQorICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk92ZXJyaWRpbmcgcGFja2V0IGR1cmF0aW9uIGJ5IGZyYW1lIHJhdGUsIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW5cbiIpOworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcSgxLCBhdl9pbnZfcShvc3QtPmZyYW1lX3JhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPm11eF90aW1lYmFzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9wYWNrZXRfcmVzY2FsZV90cyhwa3QsIG9zdC0+bXV4X3RpbWViYXNlLCBvc3QtPnN0LT50aW1lX2Jhc2UpOworCisgICAgaWYgKCEocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT1RJTUVTVEFNUFMpKSB7CisgICAgICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgcGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgIHBrdC0+ZHRzID4gcGt0LT5wdHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgRFRTOiAlIlBSSWQ2NCIgUFRTOiAlIlBSSWQ2NCIgaW4gb3V0cHV0IHN0cmVhbSAlZDolZCwgcmVwbGFjaW5nIGJ5IGd1ZXNzXG4iLAorICAgICAgICAgICAgICAgICAgIHBrdC0+ZHRzLCBwa3QtPnB0cywKKyAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+c3QtPmluZGV4KTsKKyAgICAgICAgICAgIHBrdC0+cHRzID0KKyAgICAgICAgICAgIHBrdC0+ZHRzID0gcGt0LT5wdHMgKyBwa3QtPmR0cyArIG9zdC0+bGFzdF9tdXhfZHRzICsgMQorICAgICAgICAgICAgICAgICAgICAgLSBGRk1JTjMocGt0LT5wdHMsIHBrdC0+ZHRzLCBvc3QtPmxhc3RfbXV4X2R0cyArIDEpCisgICAgICAgICAgICAgICAgICAgICAtIEZGTUFYMyhwa3QtPnB0cywgcGt0LT5kdHMsIG9zdC0+bGFzdF9tdXhfZHRzICsgMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPIHx8IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pICYmCisgICAgICAgICAgICBwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgIShzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOSAmJiBvc3QtPnN0cmVhbV9jb3B5KSAmJgorICAgICAgICAgICAgb3N0LT5sYXN0X211eF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIGludDY0X3QgbWF4ID0gb3N0LT5sYXN0X211eF9kdHMgKyAhKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfVFNfTk9OU1RSSUNUKTsKKyAgICAgICAgICAgIGlmIChwa3QtPmR0cyA8IG1heCkgeworICAgICAgICAgICAgICAgIGludCBsb2dsZXZlbCA9IG1heCAtIHBrdC0+ZHRzID4gMiB8fCBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8gQVZfTE9HX1dBUk5JTkcgOiBBVl9MT0dfREVCVUc7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIGxvZ2xldmVsLCAiTm9uLW1vbm90b25vdXMgRFRTIGluIG91dHB1dCBzdHJlYW0gIgorICAgICAgICAgICAgICAgICAgICAgICAiJWQ6JWQ7IHByZXZpb3VzOiAlIlBSSWQ2NCIsIGN1cnJlbnQ6ICUiUFJJZDY0IjsgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPnN0LT5pbmRleCwgb3N0LT5sYXN0X211eF9kdHMsIHBrdC0+ZHRzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhpdF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiYWJvcnRpbmcuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9sb2cocywgbG9nbGV2ZWwsICJjaGFuZ2luZyB0byAlIlBSSWQ2NCIuIFRoaXMgbWF5IHJlc3VsdCAiCisgICAgICAgICAgICAgICAgICAgICAgICJpbiBpbmNvcnJlY3QgdGltZXN0YW1wcyBpbiB0aGUgb3V0cHV0IGZpbGUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBtYXgpOworICAgICAgICAgICAgICAgIGlmIChwa3QtPnB0cyA+PSBwa3QtPmR0cykKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5wdHMgPSBGRk1BWChwa3QtPnB0cywgbWF4KTsKKyAgICAgICAgICAgICAgICBwa3QtPmR0cyA9IG1heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBvc3QtPmxhc3RfbXV4X2R0cyA9IHBrdC0+ZHRzOworCisgICAgb3N0LT5kYXRhX3NpemUgKz0gcGt0LT5zaXplOworICAgIG9zdC0+cGFja2V0c193cml0dGVuKys7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IG9zdC0+aW5kZXg7CisKKyAgICBpZiAoZGVidWdfdHMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAibXV4ZXIgPC0gdHlwZTolcyAiCisgICAgICAgICAgICAgICAgInBrdF9wdHM6JXMgcGt0X3B0c190aW1lOiVzIHBrdF9kdHM6JXMgcGt0X2R0c190aW1lOiVzIHNpemU6JWRcbiIsCisgICAgICAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKG9zdC0+ZW5jX2N0eC0+Y29kZWNfdHlwZSksCisgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+cHRzKSwgYXZfdHMydGltZXN0cihwa3QtPnB0cywgJm9zdC0+c3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+ZHRzKSwgYXZfdHMydGltZXN0cihwa3QtPmR0cywgJm9zdC0+c3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICAgcGt0LT5zaXplCisgICAgICAgICAgICAgICk7CisgICAgfQorCisgICAgcmV0ID0gYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUocywgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBwcmludF9lcnJvcigiYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUoKSIsIHJldCk7CisgICAgICAgIG1haW5fcmV0dXJuX2NvZGUgPSAxOworICAgICAgICBjbG9zZV9hbGxfb3V0cHV0X3N0cmVhbXMob3N0LCBNVVhFUl9GSU5JU0hFRCB8IEVOQ09ERVJfRklOSVNIRUQsIEVOQ09ERVJfRklOSVNIRUQpOworICAgIH0KKyAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKK30KKworc3RhdGljIHZvaWQgY2xvc2Vfb3V0cHV0X3N0cmVhbShPdXRwdXRTdHJlYW0gKm9zdCkKK3sKKyAgICBPdXRwdXRGaWxlICpvZiA9IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdOworCisgICAgb3N0LT5maW5pc2hlZCB8PSBFTkNPREVSX0ZJTklTSEVEOworICAgIGlmIChvZi0+c2hvcnRlc3QpIHsKKyAgICAgICAgaW50NjRfdCBlbmQgPSBhdl9yZXNjYWxlX3Eob3N0LT5zeW5jX29wdHMgLSBvc3QtPmZpcnN0X3B0cywgb3N0LT5lbmNfY3R4LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgb2YtPnJlY29yZGluZ190aW1lID0gRkZNSU4ob2YtPnJlY29yZGluZ190aW1lLCBlbmQpOworICAgIH0KK30KKworLyoKKyAqIFNlbmQgYSBzaW5nbGUgcGFja2V0IHRvIHRoZSBvdXRwdXQsIGFwcGx5aW5nIGFueSBiaXRzdHJlYW0gZmlsdGVycworICogYXNzb2NpYXRlZCB3aXRoIHRoZSBvdXRwdXQgc3RyZWFtLiAgVGhpcyBtYXkgcmVzdWx0IGluIGFueSBudW1iZXIKKyAqIG9mIHBhY2tldHMgYWN0dWFsbHkgYmVpbmcgd3JpdHRlbiwgZGVwZW5kaW5nIG9uIHdoYXQgYml0c3RyZWFtCisgKiBmaWx0ZXJzIGFyZSBhcHBsaWVkLiAgVGhlIHN1cHBsaWVkIHBhY2tldCBpcyBjb25zdW1lZCBhbmQgd2lsbCBiZQorICogYmxhbmsgKGFzIGlmIG5ld2x5LWFsbG9jYXRlZCkgd2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgKgorICogSWYgZW9mIGlzIHNldCwgaW5zdGVhZCBpbmRpY2F0ZSBFT0YgdG8gYWxsIGJpdHN0cmVhbSBmaWx0ZXJzIGFuZAorICogdGhlcmVmb3JlIGZsdXNoIGFueSBkZWxheWVkIHBhY2tldHMgdG8gdGhlIG91dHB1dC4gIEEgYmxhbmsgcGFja2V0CisgKiBtdXN0IGJlIHN1cHBsaWVkIGluIHRoaXMgY2FzZS4KKyAqLworc3RhdGljIHZvaWQgb3V0cHV0X3BhY2tldChPdXRwdXRGaWxlICpvZiwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QsIGludCBlb2YpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICAvKiBhcHBseSB0aGUgb3V0cHV0IGJpdHN0cmVhbSBmaWx0ZXJzLCBpZiBhbnkgKi8KKyAgICBpZiAob3N0LT5uYl9iaXRzdHJlYW1fZmlsdGVycykgeworICAgICAgICBpbnQgaWR4OworCisgICAgICAgIHJldCA9IGF2X2JzZl9zZW5kX3BhY2tldChvc3QtPmJzZl9jdHhbMF0sIGVvZiA/IE5VTEwgOiBwa3QpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworCisgICAgICAgIGVvZiA9IDA7CisgICAgICAgIGlkeCA9IDE7CisgICAgICAgIHdoaWxlIChpZHgpIHsKKyAgICAgICAgICAgIC8qIGdldCBhIHBhY2tldCBmcm9tIHRoZSBwcmV2aW91cyBmaWx0ZXIgdXAgdGhlIGNoYWluICovCisgICAgICAgICAgICByZXQgPSBhdl9ic2ZfcmVjZWl2ZV9wYWNrZXQob3N0LT5ic2ZfY3R4W2lkeCAtIDFdLCBwa3QpOworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpIHsKKyAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgICAgIGlkeC0tOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgICAgICAgICBlb2YgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworCisgICAgICAgICAgICAvKiBzZW5kIGl0IHRvIHRoZSBuZXh0IGZpbHRlciBkb3duIHRoZSBjaGFpbiBvciB0byB0aGUgbXV4ZXIgKi8KKyAgICAgICAgICAgIGlmIChpZHggPCBvc3QtPm5iX2JpdHN0cmVhbV9maWx0ZXJzKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZfYnNmX3NlbmRfcGFja2V0KG9zdC0+YnNmX2N0eFtpZHhdLCBlb2YgPyBOVUxMIDogcGt0KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICAgICAgaWR4Kys7CisgICAgICAgICAgICAgICAgZW9mID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZW9mKQorICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHdyaXRlX3BhY2tldChvZiwgcGt0LCBvc3QsIDApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghZW9mKQorICAgICAgICB3cml0ZV9wYWNrZXQob2YsIHBrdCwgb3N0LCAwKTsKKworZmluaXNoOgorICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYXBwbHlpbmcgYml0c3RyZWFtIGZpbHRlcnMgdG8gYW4gb3V0cHV0ICIKKyAgICAgICAgICAgICAgICJwYWNrZXQgZm9yIHN0cmVhbSAjJWQ6JWQuXG4iLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICBpZihleGl0X29uX2Vycm9yKQorICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KK30KKworc3RhdGljIGludCBjaGVja19yZWNvcmRpbmdfdGltZShPdXRwdXRTdHJlYW0gKm9zdCkKK3sKKyAgICBPdXRwdXRGaWxlICpvZiA9IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdOworCisgICAgaWYgKG9mLT5yZWNvcmRpbmdfdGltZSAhPSBJTlQ2NF9NQVggJiYKKyAgICAgICAgYXZfY29tcGFyZV90cyhvc3QtPnN5bmNfb3B0cyAtIG9zdC0+Zmlyc3RfcHRzLCBvc3QtPmVuY19jdHgtPnRpbWVfYmFzZSwgb2YtPnJlY29yZGluZ190aW1lLAorICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKSA+PSAwKSB7CisgICAgICAgIGNsb3NlX291dHB1dF9zdHJlYW0ob3N0KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBkb19hdWRpb19vdXQoT3V0cHV0RmlsZSAqb2YsIE91dHB1dFN0cmVhbSAqb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBvc3QtPmVuY19jdHg7CisgICAgQVZQYWNrZXQgcGt0OworICAgIGludCByZXQ7CisKKyAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKKyAgICBwa3QuZGF0YSA9IE5VTEw7CisgICAgcGt0LnNpemUgPSAwOworCisgICAgaWYgKCFjaGVja19yZWNvcmRpbmdfdGltZShvc3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZnJhbWUtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSB8fCBhdWRpb19zeW5jX21ldGhvZCA8IDApCisgICAgICAgIGZyYW1lLT5wdHMgPSBvc3QtPnN5bmNfb3B0czsKKyAgICBvc3QtPnN5bmNfb3B0cyA9IGZyYW1lLT5wdHMgKyBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICBvc3QtPnNhbXBsZXNfZW5jb2RlZCArPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICBvc3QtPmZyYW1lc19lbmNvZGVkKys7CisKKyAgICBhdl9hc3NlcnQwKHBrdC5zaXplIHx8ICFwa3QuZGF0YSk7CisgICAgdXBkYXRlX2JlbmNobWFyayhOVUxMKTsKKyAgICBpZiAoZGVidWdfdHMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiZW5jb2RlciA8LSB0eXBlOmF1ZGlvICIKKyAgICAgICAgICAgICAgICJmcmFtZV9wdHM6JXMgZnJhbWVfcHRzX3RpbWU6JXMgdGltZV9iYXNlOiVkLyVkXG4iLAorICAgICAgICAgICAgICAgYXZfdHMyc3RyKGZyYW1lLT5wdHMpLCBhdl90czJ0aW1lc3RyKGZyYW1lLT5wdHMsICZlbmMtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICBlbmMtPnRpbWVfYmFzZS5udW0sIGVuYy0+dGltZV9iYXNlLmRlbik7CisgICAgfQorCisgICAgcmV0ID0gYXZjb2RlY19zZW5kX2ZyYW1lKGVuYywgZnJhbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcmV0ID0gYXZjb2RlY19yZWNlaXZlX3BhY2tldChlbmMsICZwa3QpOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgdXBkYXRlX2JlbmNobWFyaygiZW5jb2RlX2F1ZGlvICVkLiVkIiwgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKKworICAgICAgICBhdl9wYWNrZXRfcmVzY2FsZV90cygmcGt0LCBlbmMtPnRpbWVfYmFzZSwgb3N0LT5tdXhfdGltZWJhc2UpOworCisgICAgICAgIGlmIChkZWJ1Z190cykgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiZW5jb2RlciAtPiB0eXBlOmF1ZGlvICIKKyAgICAgICAgICAgICAgICAgICAicGt0X3B0czolcyBwa3RfcHRzX3RpbWU6JXMgcGt0X2R0czolcyBwa3RfZHRzX3RpbWU6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC5wdHMpLCBhdl90czJ0aW1lc3RyKHBrdC5wdHMsICZlbmMtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC5kdHMpLCBhdl90czJ0aW1lc3RyKHBrdC5kdHMsICZlbmMtPnRpbWVfYmFzZSkpOworICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0X3BhY2tldChvZiwgJnBrdCwgb3N0LCAwKTsKKyAgICB9CisKKyAgICByZXR1cm47CitlcnJvcjoKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQXVkaW8gZW5jb2RpbmcgZmFpbGVkXG4iKTsKKyAgICBleGl0X3Byb2dyYW0oMSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3N1YnRpdGxlX291dChPdXRwdXRGaWxlICpvZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN1YnRpdGxlICpzdWIpCit7CisgICAgaW50IHN1YnRpdGxlX291dF9tYXhfc2l6ZSA9IDEwMjQgKiAxMDI0OworICAgIGludCBzdWJ0aXRsZV9vdXRfc2l6ZSwgbmIsIGk7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYzsKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgaW50NjRfdCBwdHM7CisKKyAgICBpZiAoc3ViLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlN1YnRpdGxlIHBhY2tldHMgbXVzdCBoYXZlIGEgcHRzXG4iKTsKKyAgICAgICAgaWYgKGV4aXRfb25fZXJyb3IpCisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbmMgPSBvc3QtPmVuY19jdHg7CisKKyAgICBpZiAoIXN1YnRpdGxlX291dCkgeworICAgICAgICBzdWJ0aXRsZV9vdXQgPSBhdl9tYWxsb2Moc3VidGl0bGVfb3V0X21heF9zaXplKTsKKyAgICAgICAgaWYgKCFzdWJ0aXRsZV9vdXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJGYWlsZWQgdG8gYWxsb2NhdGUgc3VidGl0bGVfb3V0XG4iKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIE5vdGU6IERWQiBzdWJ0aXRsZSBuZWVkIG9uZSBwYWNrZXQgdG8gZHJhdyB0aGVtIGFuZCBvbmUgb3RoZXIKKyAgICAgICBwYWNrZXQgdG8gY2xlYXIgdGhlbSAqLworICAgIC8qIFhYWDogc2lnbmFsIGl0IGluIHRoZSBjb2RlYyBjb250ZXh0ID8gKi8KKyAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkJfU1VCVElUTEUpCisgICAgICAgIG5iID0gMjsKKyAgICBlbHNlCisgICAgICAgIG5iID0gMTsKKworICAgIC8qIHNoaWZ0IHRpbWVzdGFtcCB0byBob25vciAtc3MgYW5kIG1ha2UgY2hlY2tfcmVjb3JkaW5nX3RpbWUoKSB3b3JrIHdpdGggLXQgKi8KKyAgICBwdHMgPSBzdWItPnB0czsKKyAgICBpZiAob3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF0tPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHB0cyAtPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XS0+c3RhcnRfdGltZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmI7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBzYXZlX251bV9yZWN0cyA9IHN1Yi0+bnVtX3JlY3RzOworCisgICAgICAgIG9zdC0+c3luY19vcHRzID0gYXZfcmVzY2FsZV9xKHB0cywgQVZfVElNRV9CQVNFX1EsIGVuYy0+dGltZV9iYXNlKTsKKyAgICAgICAgaWYgKCFjaGVja19yZWNvcmRpbmdfdGltZShvc3QpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIHN1Yi0+cHRzID0gcHRzOworICAgICAgICAvLyBzdGFydF9kaXNwbGF5X3RpbWUgaXMgcmVxdWlyZWQgdG8gYmUgMAorICAgICAgICBzdWItPnB0cyAgICAgICAgICAgICAgICs9IGF2X3Jlc2NhbGVfcShzdWItPnN0YXJ0X2Rpc3BsYXlfdGltZSwgKEFWUmF0aW9uYWwpeyAxLCAxMDAwIH0sIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgc3ViLT5lbmRfZGlzcGxheV90aW1lICAtPSBzdWItPnN0YXJ0X2Rpc3BsYXlfdGltZTsKKyAgICAgICAgc3ViLT5zdGFydF9kaXNwbGF5X3RpbWUgPSAwOworICAgICAgICBpZiAoaSA9PSAxKQorICAgICAgICAgICAgc3ViLT5udW1fcmVjdHMgPSAwOworCisgICAgICAgIG9zdC0+ZnJhbWVzX2VuY29kZWQrKzsKKworICAgICAgICBzdWJ0aXRsZV9vdXRfc2l6ZSA9IGF2Y29kZWNfZW5jb2RlX3N1YnRpdGxlKGVuYywgc3VidGl0bGVfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRpdGxlX291dF9tYXhfc2l6ZSwgc3ViKTsKKyAgICAgICAgaWYgKGkgPT0gMSkKKyAgICAgICAgICAgIHN1Yi0+bnVtX3JlY3RzID0gc2F2ZV9udW1fcmVjdHM7CisgICAgICAgIGlmIChzdWJ0aXRsZV9vdXRfc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTdWJ0aXRsZSBlbmNvZGluZyBmYWlsZWRcbiIpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisgICAgICAgIHBrdC5kYXRhID0gc3VidGl0bGVfb3V0OworICAgICAgICBwa3Quc2l6ZSA9IHN1YnRpdGxlX291dF9zaXplOworICAgICAgICBwa3QucHRzICA9IGF2X3Jlc2NhbGVfcShzdWItPnB0cywgQVZfVElNRV9CQVNFX1EsIG9zdC0+bXV4X3RpbWViYXNlKTsKKyAgICAgICAgcGt0LmR1cmF0aW9uID0gYXZfcmVzY2FsZV9xKHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSwgKEFWUmF0aW9uYWwpeyAxLCAxMDAwIH0sIG9zdC0+bXV4X3RpbWViYXNlKTsKKyAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFKSB7CisgICAgICAgICAgICAvKiBYWFg6IHRoZSBwdHMgY29ycmVjdGlvbiBpcyBoYW5kbGVkIGhlcmUuIE1heWJlIGhhbmRsaW5nCisgICAgICAgICAgICAgICBpdCBpbiB0aGUgY29kZWMgd291bGQgYmUgYmV0dGVyICovCisgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgIHBrdC5wdHMgKz0gYXZfcmVzY2FsZV9xKHN1Yi0+c3RhcnRfZGlzcGxheV90aW1lLCAoQVZSYXRpb25hbCl7IDEsIDEwMDAgfSwgb3N0LT5tdXhfdGltZWJhc2UpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBrdC5wdHMgKz0gYXZfcmVzY2FsZV9xKHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSwgKEFWUmF0aW9uYWwpeyAxLCAxMDAwIH0sIG9zdC0+bXV4X3RpbWViYXNlKTsKKyAgICAgICAgfQorICAgICAgICBwa3QuZHRzID0gcGt0LnB0czsKKyAgICAgICAgb3V0cHV0X3BhY2tldChvZiwgJnBrdCwgb3N0LCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRvX3ZpZGVvX291dChPdXRwdXRGaWxlICpvZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpuZXh0X3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHN5bmNfaXB0cykKK3sKKyAgICBpbnQgcmV0LCBmb3JtYXRfdmlkZW9fc3luYzsKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IG9zdC0+ZW5jX2N0eDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqbXV4X3BhciA9IG9zdC0+c3QtPmNvZGVjcGFyOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKKyAgICBpbnQgbmJfZnJhbWVzLCBuYjBfZnJhbWVzLCBpOworICAgIGRvdWJsZSBkZWx0YSwgZGVsdGEwOworICAgIGRvdWJsZSBkdXJhdGlvbiA9IDA7CisgICAgaW50IGZyYW1lX3NpemUgPSAwOworICAgIElucHV0U3RyZWFtICppc3QgPSBOVUxMOworICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyID0gb3N0LT5maWx0ZXItPmZpbHRlcjsKKworICAgIGlmIChvc3QtPnNvdXJjZV9pbmRleCA+PSAwKQorICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XTsKKworICAgIGZyYW1lX3JhdGUgPSBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9yYXRlKGZpbHRlcik7CisgICAgaWYgKGZyYW1lX3JhdGUubnVtID4gMCAmJiBmcmFtZV9yYXRlLmRlbiA+IDApCisgICAgICAgIGR1cmF0aW9uID0gMS8oYXZfcTJkKGZyYW1lX3JhdGUpICogYXZfcTJkKGVuYy0+dGltZV9iYXNlKSk7CisKKyAgICBpZihpc3QgJiYgaXN0LT5zdC0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSAmJiBpc3QtPnN0LT5maXJzdF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgb3N0LT5mcmFtZV9yYXRlLm51bSkKKyAgICAgICAgZHVyYXRpb24gPSBGRk1JTihkdXJhdGlvbiwgMS8oYXZfcTJkKG9zdC0+ZnJhbWVfcmF0ZSkgKiBhdl9xMmQoZW5jLT50aW1lX2Jhc2UpKSk7CisKKyAgICBpZiAoIW9zdC0+ZmlsdGVyc19zY3JpcHQgJiYKKyAgICAgICAgIW9zdC0+ZmlsdGVycyAmJgorICAgICAgICBuZXh0X3BpY3R1cmUgJiYKKyAgICAgICAgaXN0ICYmCisgICAgICAgIGxyaW50ZihuZXh0X3BpY3R1cmUtPnBrdF9kdXJhdGlvbiAqIGF2X3EyZChpc3QtPnN0LT50aW1lX2Jhc2UpIC8gYXZfcTJkKGVuYy0+dGltZV9iYXNlKSkgPiAwKSB7CisgICAgICAgIGR1cmF0aW9uID0gbHJpbnRmKG5leHRfcGljdHVyZS0+cGt0X2R1cmF0aW9uICogYXZfcTJkKGlzdC0+c3QtPnRpbWVfYmFzZSkgLyBhdl9xMmQoZW5jLT50aW1lX2Jhc2UpKTsKKyAgICB9CisKKyAgICBpZiAoIW5leHRfcGljdHVyZSkgeworICAgICAgICAvL2VuZCwgZmx1c2hpbmcKKyAgICAgICAgbmIwX2ZyYW1lcyA9IG5iX2ZyYW1lcyA9IG1pZF9wcmVkKG9zdC0+bGFzdF9uYjBfZnJhbWVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5sYXN0X25iMF9mcmFtZXNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmxhc3RfbmIwX2ZyYW1lc1syXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVsdGEwID0gc3luY19pcHRzIC0gb3N0LT5zeW5jX29wdHM7IC8vIGRlbHRhMCBpcyB0aGUgImRyaWZ0IiBiZXR3ZWVuIHRoZSBpbnB1dCBmcmFtZSAobmV4dF9waWN0dXJlKSBhbmQgd2hlcmUgaXQgd291bGQgZmFsbCBpbiB0aGUgb3V0cHV0LgorICAgICAgICBkZWx0YSAgPSBkZWx0YTAgKyBkdXJhdGlvbjsKKworICAgICAgICAvKiBieSBkZWZhdWx0LCB3ZSBvdXRwdXQgYSBzaW5nbGUgZnJhbWUgKi8KKyAgICAgICAgbmIwX2ZyYW1lcyA9IDA7IC8vIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBQUkVWSU9VUyBmcmFtZSBzaG91bGQgYmUgZHVwbGljYXRlZCwgbW9zdGx5IGZvciB2YXJpYWJsZSBmcmFtZXJhdGUgKFZGUikKKyAgICAgICAgbmJfZnJhbWVzID0gMTsKKworICAgICAgICBmb3JtYXRfdmlkZW9fc3luYyA9IHZpZGVvX3N5bmNfbWV0aG9kOworICAgICAgICBpZiAoZm9ybWF0X3ZpZGVvX3N5bmMgPT0gVlNZTkNfQVVUTykgeworICAgICAgICAgICAgaWYoIXN0cmNtcChvZi0+Y3R4LT5vZm9ybWF0LT5uYW1lLCAiYXZpIikpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRfdmlkZW9fc3luYyA9IFZTWU5DX1ZGUjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGZvcm1hdF92aWRlb19zeW5jID0gKG9mLT5jdHgtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfVkFSSUFCTEVfRlBTKSA/ICgob2YtPmN0eC0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT1RJTUVTVEFNUFMpID8gVlNZTkNfUEFTU1RIUk9VR0ggOiBWU1lOQ19WRlIpIDogVlNZTkNfQ0ZSOworICAgICAgICAgICAgaWYgKCAgIGlzdAorICAgICAgICAgICAgICAgICYmIGZvcm1hdF92aWRlb19zeW5jID09IFZTWU5DX0NGUgorICAgICAgICAgICAgICAgICYmIGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF0tPmN0eC0+bmJfc3RyZWFtcyA9PSAxCisgICAgICAgICAgICAgICAgJiYgaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+aW5wdXRfdHNfb2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRfdmlkZW9fc3luYyA9IFZTWU5DX1ZTQ0ZSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvcm1hdF92aWRlb19zeW5jID09IFZTWU5DX0NGUiAmJiBjb3B5X3RzKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0X3ZpZGVvX3N5bmMgPSBWU1lOQ19WU0NGUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvc3QtPmlzX2NmciA9IChmb3JtYXRfdmlkZW9fc3luYyA9PSBWU1lOQ19DRlIgfHwgZm9ybWF0X3ZpZGVvX3N5bmMgPT0gVlNZTkNfVlNDRlIpOworCisgICAgICAgIGlmIChkZWx0YTAgPCAwICYmCisgICAgICAgICAgICBkZWx0YSA+IDAgJiYKKyAgICAgICAgICAgIGZvcm1hdF92aWRlb19zeW5jICE9IFZTWU5DX1BBU1NUSFJPVUdIICYmCisgICAgICAgICAgICBmb3JtYXRfdmlkZW9fc3luYyAhPSBWU1lOQ19EUk9QKSB7CisgICAgICAgICAgICBpZiAoZGVsdGEwIDwgLTAuNikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlBhc3QgZHVyYXRpb24gJWYgdG9vIGxhcmdlXG4iLCAtZGVsdGEwKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJDbGlwcGluZyBmcmFtZSBpbiByYXRlIGNvbnZlcnNpb24gYnkgJWZcbiIsIC1kZWx0YTApOworICAgICAgICAgICAgc3luY19pcHRzID0gb3N0LT5zeW5jX29wdHM7CisgICAgICAgICAgICBkdXJhdGlvbiArPSBkZWx0YTA7CisgICAgICAgICAgICBkZWx0YTAgPSAwOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChmb3JtYXRfdmlkZW9fc3luYykgeworICAgICAgICBjYXNlIFZTWU5DX1ZTQ0ZSOgorICAgICAgICAgICAgaWYgKG9zdC0+ZnJhbWVfbnVtYmVyID09IDAgJiYgZGVsdGEwID49IDAuNSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJOb3QgZHVwbGljYXRpbmcgJWQgaW5pdGlhbCBmcmFtZXNcbiIsIChpbnQpbHJpbnRmKGRlbHRhMCkpOworICAgICAgICAgICAgICAgIGRlbHRhID0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgZGVsdGEwID0gMDsKKyAgICAgICAgICAgICAgICBvc3QtPnN5bmNfb3B0cyA9IGxyaW50KHN5bmNfaXB0cyk7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgVlNZTkNfQ0ZSOgorICAgICAgICAgICAgLy8gRklYTUUgc2V0IHRvIDAuNSBhZnRlciB3ZSBmaXggc29tZSBkdHMvcHRzIGJ1Z3MgbGlrZSBpbiBhdmlkZWMuYworICAgICAgICAgICAgaWYgKGZyYW1lX2Ryb3BfdGhyZXNob2xkICYmIGRlbHRhIDwgZnJhbWVfZHJvcF90aHJlc2hvbGQgJiYgb3N0LT5mcmFtZV9udW1iZXIpIHsKKyAgICAgICAgICAgICAgICBuYl9mcmFtZXMgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZWx0YSA8IC0xLjEpCisgICAgICAgICAgICAgICAgbmJfZnJhbWVzID0gMDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRlbHRhID4gMS4xKSB7CisgICAgICAgICAgICAgICAgbmJfZnJhbWVzID0gbHJpbnRmKGRlbHRhKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVsdGEwID4gMS4xKQorICAgICAgICAgICAgICAgICAgICBuYjBfZnJhbWVzID0gbHJpbnRmKGRlbHRhMCAtIDAuNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBWU1lOQ19WRlI6CisgICAgICAgICAgICBpZiAoZGVsdGEgPD0gLTAuNikKKyAgICAgICAgICAgICAgICBuYl9mcmFtZXMgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoZGVsdGEgPiAwLjYpCisgICAgICAgICAgICAgICAgb3N0LT5zeW5jX29wdHMgPSBscmludChzeW5jX2lwdHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVlNZTkNfRFJPUDoKKyAgICAgICAgY2FzZSBWU1lOQ19QQVNTVEhST1VHSDoKKyAgICAgICAgICAgIG9zdC0+c3luY19vcHRzID0gbHJpbnQoc3luY19pcHRzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5iX2ZyYW1lcyA9IEZGTUlOKG5iX2ZyYW1lcywgb3N0LT5tYXhfZnJhbWVzIC0gb3N0LT5mcmFtZV9udW1iZXIpOworICAgIG5iMF9mcmFtZXMgPSBGRk1JTihuYjBfZnJhbWVzLCBuYl9mcmFtZXMpOworCisgICAgbWVtbW92ZShvc3QtPmxhc3RfbmIwX2ZyYW1lcyArIDEsCisgICAgICAgICAgICBvc3QtPmxhc3RfbmIwX2ZyYW1lcywKKyAgICAgICAgICAgIHNpemVvZihvc3QtPmxhc3RfbmIwX2ZyYW1lc1swXSkgKiAoRkZfQVJSQVlfRUxFTVMob3N0LT5sYXN0X25iMF9mcmFtZXMpIC0gMSkpOworICAgIG9zdC0+bGFzdF9uYjBfZnJhbWVzWzBdID0gbmIwX2ZyYW1lczsKKworICAgIGlmIChuYjBfZnJhbWVzID09IDAgJiYgb3N0LT5sYXN0X2Ryb3BwZWQpIHsKKyAgICAgICAgbmJfZnJhbWVzX2Ryb3ArKzsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgIioqKiBkcm9wcGluZyBmcmFtZSAlZCBmcm9tIHN0cmVhbSAlZCBhdCB0cyAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICBvc3QtPmZyYW1lX251bWJlciwgb3N0LT5zdC0+aW5kZXgsIG9zdC0+bGFzdF9mcmFtZS0+cHRzKTsKKyAgICB9CisgICAgaWYgKG5iX2ZyYW1lcyA+IChuYjBfZnJhbWVzICYmIG9zdC0+bGFzdF9kcm9wcGVkKSArIChuYl9mcmFtZXMgPiBuYjBfZnJhbWVzKSkgeworICAgICAgICBpZiAobmJfZnJhbWVzID4gZHRzX2Vycm9yX3RocmVzaG9sZCAqIDMwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgZnJhbWUgZHVwbGljYXRpb24gdG9vIGxhcmdlLCBza2lwcGluZ1xuIiwgbmJfZnJhbWVzIC0gMSk7CisgICAgICAgICAgICBuYl9mcmFtZXNfZHJvcCsrOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG5iX2ZyYW1lc19kdXAgKz0gbmJfZnJhbWVzIC0gKG5iMF9mcmFtZXMgJiYgb3N0LT5sYXN0X2Ryb3BwZWQpIC0gKG5iX2ZyYW1lcyA+IG5iMF9mcmFtZXMpOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIqKiogJWQgZHVwIVxuIiwgbmJfZnJhbWVzIC0gMSk7CisgICAgICAgIGlmIChuYl9mcmFtZXNfZHVwID4gZHVwX3dhcm5pbmcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk1vcmUgdGhhbiAlZCBmcmFtZXMgZHVwbGljYXRlZFxuIiwgZHVwX3dhcm5pbmcpOworICAgICAgICAgICAgZHVwX3dhcm5pbmcgKj0gMTA7CisgICAgICAgIH0KKyAgICB9CisgICAgb3N0LT5sYXN0X2Ryb3BwZWQgPSBuYl9mcmFtZXMgPT0gbmIwX2ZyYW1lcyAmJiBuZXh0X3BpY3R1cmU7CisKKyAgLyogZHVwbGljYXRlcyBmcmFtZSBpZiBuZWVkZWQgKi8KKyAgZm9yIChpID0gMDsgaSA8IG5iX2ZyYW1lczsgaSsrKSB7CisgICAgQVZGcmFtZSAqaW5fcGljdHVyZTsKKyAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKKyAgICBwa3QuZGF0YSA9IE5VTEw7CisgICAgcGt0LnNpemUgPSAwOworCisgICAgaWYgKGkgPCBuYjBfZnJhbWVzICYmIG9zdC0+bGFzdF9mcmFtZSkgeworICAgICAgICBpbl9waWN0dXJlID0gb3N0LT5sYXN0X2ZyYW1lOworICAgIH0gZWxzZQorICAgICAgICBpbl9waWN0dXJlID0gbmV4dF9waWN0dXJlOworCisgICAgaWYgKCFpbl9waWN0dXJlKQorICAgICAgICByZXR1cm47CisKKyAgICBpbl9waWN0dXJlLT5wdHMgPSBvc3QtPnN5bmNfb3B0czsKKworI2lmIDEKKyAgICBpZiAoIWNoZWNrX3JlY29yZGluZ190aW1lKG9zdCkpCisjZWxzZQorICAgIGlmIChvc3QtPmZyYW1lX251bWJlciA+PSBvc3QtPm1heF9mcmFtZXMpCisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworCisgICAgeworICAgICAgICBpbnQgZm9yY2VkX2tleWZyYW1lID0gMDsKKyAgICAgICAgZG91YmxlIHB0c190aW1lOworCisgICAgICAgIGlmIChlbmMtPmZsYWdzICYgKEFWX0NPREVDX0ZMQUdfSU5URVJMQUNFRF9EQ1QgfCBBVl9DT0RFQ19GTEFHX0lOVEVSTEFDRURfTUUpICYmCisgICAgICAgICAgICBvc3QtPnRvcF9maWVsZF9maXJzdCA+PSAwKQorICAgICAgICAgICAgaW5fcGljdHVyZS0+dG9wX2ZpZWxkX2ZpcnN0ID0gISFvc3QtPnRvcF9maWVsZF9maXJzdDsKKworICAgICAgICBpZiAoaW5fcGljdHVyZS0+aW50ZXJsYWNlZF9mcmFtZSkgeworICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX01KUEVHKQorICAgICAgICAgICAgICAgIG11eF9wYXItPmZpZWxkX29yZGVyID0gaW5fcGljdHVyZS0+dG9wX2ZpZWxkX2ZpcnN0ID8gQVZfRklFTERfVFQ6QVZfRklFTERfQkI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbXV4X3Bhci0+ZmllbGRfb3JkZXIgPSBpbl9waWN0dXJlLT50b3BfZmllbGRfZmlyc3QgPyBBVl9GSUVMRF9UQjpBVl9GSUVMRF9CVDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtdXhfcGFyLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOworCisgICAgICAgIGluX3BpY3R1cmUtPnF1YWxpdHkgPSBlbmMtPmdsb2JhbF9xdWFsaXR5OworICAgICAgICBpbl9waWN0dXJlLT5waWN0X3R5cGUgPSAwOworCisgICAgICAgIHB0c190aW1lID0gaW5fcGljdHVyZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFID8KKyAgICAgICAgICAgIGluX3BpY3R1cmUtPnB0cyAqIGF2X3EyZChlbmMtPnRpbWVfYmFzZSkgOiBOQU47CisgICAgICAgIGlmIChvc3QtPmZvcmNlZF9rZl9pbmRleCA8IG9zdC0+Zm9yY2VkX2tmX2NvdW50ICYmCisgICAgICAgICAgICBpbl9waWN0dXJlLT5wdHMgPj0gb3N0LT5mb3JjZWRfa2ZfcHRzW29zdC0+Zm9yY2VkX2tmX2luZGV4XSkgeworICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2ZfaW5kZXgrKzsKKyAgICAgICAgICAgIGZvcmNlZF9rZXlmcmFtZSA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAob3N0LT5mb3JjZWRfa2V5ZnJhbWVzX3BleHByKSB7CisgICAgICAgICAgICBkb3VibGUgcmVzOworICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9UXSA9IHB0c190aW1lOworICAgICAgICAgICAgcmVzID0gYXZfZXhwcl9ldmFsKG9zdC0+Zm9yY2VkX2tleWZyYW1lc19wZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXMsIE5VTEwpOworICAgICAgICAgICAgZmZfZGxvZyhOVUxMLCAiZm9yY2Vfa2V5X2ZyYW1lOiBuOiVmIG5fZm9yY2VkOiVmIHByZXZfZm9yY2VkX246JWYgdDolZiBwcmV2X2ZvcmNlZF90OiVmIC0+IHJlczolZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9OXSwKKyAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9OX0ZPUkNFRF0sCisgICAgICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfUFJFVl9GT1JDRURfTl0sCisgICAgICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfVF0sCisgICAgICAgICAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tleWZyYW1lc19leHByX2NvbnN0X3ZhbHVlc1tGS0ZfUFJFVl9GT1JDRURfVF0sCisgICAgICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgICAgICBpZiAocmVzKSB7CisgICAgICAgICAgICAgICAgZm9yY2VkX2tleWZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX1BSRVZfRk9SQ0VEX05dID0KKyAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9OXTsKKyAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX1BSRVZfRk9SQ0VEX1RdID0KKyAgICAgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9UXTsKKyAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX05fRk9SQ0VEXSArPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX05dICs9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzCisgICAgICAgICAgICAgICAgICAgJiYgIXN0cm5jbXAob3N0LT5mb3JjZWRfa2V5ZnJhbWVzLCAic291cmNlIiwgNikKKyAgICAgICAgICAgICAgICAgICAmJiBpbl9waWN0dXJlLT5rZXlfZnJhbWU9PTEpIHsKKyAgICAgICAgICAgIGZvcmNlZF9rZXlmcmFtZSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm9yY2VkX2tleWZyYW1lKSB7CisgICAgICAgICAgICBpbl9waWN0dXJlLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJGb3JjZWQga2V5ZnJhbWUgYXQgdGltZSAlZlxuIiwgcHRzX3RpbWUpOworICAgICAgICB9CisKKyAgICAgICAgdXBkYXRlX2JlbmNobWFyayhOVUxMKTsKKyAgICAgICAgaWYgKGRlYnVnX3RzKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlbmNvZGVyIDwtIHR5cGU6dmlkZW8gIgorICAgICAgICAgICAgICAgICAgICJmcmFtZV9wdHM6JXMgZnJhbWVfcHRzX3RpbWU6JXMgdGltZV9iYXNlOiVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X3RzMnN0cihpbl9waWN0dXJlLT5wdHMpLCBhdl90czJ0aW1lc3RyKGluX3BpY3R1cmUtPnB0cywgJmVuYy0+dGltZV9iYXNlKSwKKyAgICAgICAgICAgICAgICAgICBlbmMtPnRpbWVfYmFzZS5udW0sIGVuYy0+dGltZV9iYXNlLmRlbik7CisgICAgICAgIH0KKworICAgICAgICBvc3QtPmZyYW1lc19lbmNvZGVkKys7CisKKyAgICAgICAgcmV0ID0gYXZjb2RlY19zZW5kX2ZyYW1lKGVuYywgaW5fcGljdHVyZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19yZWNlaXZlX3BhY2tldChlbmMsICZwa3QpOworICAgICAgICAgICAgdXBkYXRlX2JlbmNobWFyaygiZW5jb2RlX3ZpZGVvICVkLiVkIiwgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAgICAgaWYgKGRlYnVnX3RzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiZW5jb2RlciAtPiB0eXBlOnZpZGVvICIKKyAgICAgICAgICAgICAgICAgICAgICAgInBrdF9wdHM6JXMgcGt0X3B0c190aW1lOiVzIHBrdF9kdHM6JXMgcGt0X2R0c190aW1lOiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LnB0cyksIGF2X3RzMnRpbWVzdHIocGt0LnB0cywgJmVuYy0+dGltZV9iYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC5kdHMpLCBhdl90czJ0aW1lc3RyKHBrdC5kdHMsICZlbmMtPnRpbWVfYmFzZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGt0LnB0cyA9PSBBVl9OT1BUU19WQUxVRSAmJiAhKGVuYy0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9ERUxBWSkpCisgICAgICAgICAgICAgICAgcGt0LnB0cyA9IG9zdC0+c3luY19vcHRzOworCisgICAgICAgICAgICBhdl9wYWNrZXRfcmVzY2FsZV90cygmcGt0LCBlbmMtPnRpbWVfYmFzZSwgb3N0LT5tdXhfdGltZWJhc2UpOworCisgICAgICAgICAgICBpZiAoZGVidWdfdHMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlbmNvZGVyIC0+IHR5cGU6dmlkZW8gIgorICAgICAgICAgICAgICAgICAgICAicGt0X3B0czolcyBwa3RfcHRzX3RpbWU6JXMgcGt0X2R0czolcyBwa3RfZHRzX3RpbWU6JXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QucHRzKSwgYXZfdHMydGltZXN0cihwa3QucHRzLCAmb3N0LT5tdXhfdGltZWJhc2UpLAorICAgICAgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LmR0cyksIGF2X3RzMnRpbWVzdHIocGt0LmR0cywgJm9zdC0+bXV4X3RpbWViYXNlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSBwa3Quc2l6ZTsKKyAgICAgICAgICAgIG91dHB1dF9wYWNrZXQob2YsICZwa3QsIG9zdCwgMCk7CisKKyAgICAgICAgICAgIC8qIGlmIHR3byBwYXNzLCBvdXRwdXQgbG9nICovCisgICAgICAgICAgICBpZiAob3N0LT5sb2dmaWxlICYmIGVuYy0+c3RhdHNfb3V0KSB7CisgICAgICAgICAgICAgICAgZnByaW50Zihvc3QtPmxvZ2ZpbGUsICIlcyIsIGVuYy0+c3RhdHNfb3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBvc3QtPnN5bmNfb3B0cysrOworICAgIC8qCisgICAgICogRm9yIHZpZGVvLCBudW1iZXIgb2YgZnJhbWVzIGluID09IG51bWJlciBvZiBwYWNrZXRzIG91dC4KKyAgICAgKiBCdXQgdGhlcmUgbWF5IGJlIHJlb3JkZXJpbmcsIHNvIHdlIGNhbid0IHRocm93IGF3YXkgZnJhbWVzIG9uIGVuY29kZXIKKyAgICAgKiBmbHVzaCwgd2UgbmVlZCB0byBsaW1pdCB0aGVtIGhlcmUsIGJlZm9yZSB0aGV5IGdvIGludG8gZW5jb2Rlci4KKyAgICAgKi8KKyAgICBvc3QtPmZyYW1lX251bWJlcisrOworCisgICAgaWYgKHZzdGF0c19maWxlbmFtZSAmJiBmcmFtZV9zaXplKQorICAgICAgICBkb192aWRlb19zdGF0cyhvc3QsIGZyYW1lX3NpemUpOworICB9CisKKyAgICBpZiAoIW9zdC0+bGFzdF9mcmFtZSkKKyAgICAgICAgb3N0LT5sYXN0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBhdl9mcmFtZV91bnJlZihvc3QtPmxhc3RfZnJhbWUpOworICAgIGlmIChuZXh0X3BpY3R1cmUgJiYgb3N0LT5sYXN0X2ZyYW1lKQorICAgICAgICBhdl9mcmFtZV9yZWYob3N0LT5sYXN0X2ZyYW1lLCBuZXh0X3BpY3R1cmUpOworICAgIGVsc2UKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3N0LT5sYXN0X2ZyYW1lKTsKKworICAgIHJldHVybjsKK2Vycm9yOgorICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJWaWRlbyBlbmNvZGluZyBmYWlsZWRcbiIpOworICAgIGV4aXRfcHJvZ3JhbSgxKTsKK30KKworc3RhdGljIGRvdWJsZSBwc25yKGRvdWJsZSBkKQoreworICAgIHJldHVybiAtMTAuMCAqIGxvZzEwKGQpOworfQorCitzdGF0aWMgdm9pZCBkb192aWRlb19zdGF0cyhPdXRwdXRTdHJlYW0gKm9zdCwgaW50IGZyYW1lX3NpemUpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYzsKKyAgICBpbnQgZnJhbWVfbnVtYmVyOworICAgIGRvdWJsZSB0aTEsIGJpdHJhdGUsIGF2Z19iaXRyYXRlOworCisgICAgLyogdGhpcyBpcyBleGVjdXRlZCBqdXN0IHRoZSBmaXJzdCB0aW1lIGRvX3ZpZGVvX3N0YXRzIGlzIGNhbGxlZCAqLworICAgIGlmICghdnN0YXRzX2ZpbGUpIHsKKyAgICAgICAgdnN0YXRzX2ZpbGUgPSBmb3Blbih2c3RhdHNfZmlsZW5hbWUsICJ3Iik7CisgICAgICAgIGlmICghdnN0YXRzX2ZpbGUpIHsKKyAgICAgICAgICAgIHBlcnJvcigiZm9wZW4iKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVuYyA9IG9zdC0+ZW5jX2N0eDsKKyAgICBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBmcmFtZV9udW1iZXIgPSBvc3QtPnN0LT5uYl9mcmFtZXM7CisgICAgICAgIGlmICh2c3RhdHNfdmVyc2lvbiA8PSAxKSB7CisgICAgICAgICAgICBmcHJpbnRmKHZzdGF0c19maWxlLCAiZnJhbWU9ICU1ZCBxPSAlMi4xZiAiLCBmcmFtZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIG9zdC0+cXVhbGl0eSAvIChmbG9hdClGRl9RUDJMQU1CREEpOworICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgIGZwcmludGYodnN0YXRzX2ZpbGUsICJvdXQ9ICUyZCBzdD0gJTJkIGZyYW1lPSAlNWQgcT0gJTIuMWYgIiwgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4LCBmcmFtZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIG9zdC0+cXVhbGl0eSAvIChmbG9hdClGRl9RUDJMQU1CREEpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9zdC0+ZXJyb3JbMF0+PTAgJiYgKGVuYy0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BTTlIpKQorICAgICAgICAgICAgZnByaW50Zih2c3RhdHNfZmlsZSwgIlBTTlI9ICU2LjJmICIsIHBzbnIob3N0LT5lcnJvclswXSAvIChlbmMtPndpZHRoICogZW5jLT5oZWlnaHQgKiAyNTUuMCAqIDI1NS4wKSkpOworCisgICAgICAgIGZwcmludGYodnN0YXRzX2ZpbGUsImZfc2l6ZT0gJTZkICIsIGZyYW1lX3NpemUpOworICAgICAgICAvKiBjb21wdXRlIHB0cyB2YWx1ZSAqLworICAgICAgICB0aTEgPSBhdl9zdHJlYW1fZ2V0X2VuZF9wdHMob3N0LT5zdCkgKiBhdl9xMmQob3N0LT5zdC0+dGltZV9iYXNlKTsKKyAgICAgICAgaWYgKHRpMSA8IDAuMDEpCisgICAgICAgICAgICB0aTEgPSAwLjAxOworCisgICAgICAgIGJpdHJhdGUgICAgID0gKGZyYW1lX3NpemUgKiA4KSAvIGF2X3EyZChlbmMtPnRpbWVfYmFzZSkgLyAxMDAwLjA7CisgICAgICAgIGF2Z19iaXRyYXRlID0gKGRvdWJsZSkob3N0LT5kYXRhX3NpemUgKiA4KSAvIHRpMSAvIDEwMDAuMDsKKyAgICAgICAgZnByaW50Zih2c3RhdHNfZmlsZSwgInNfc2l6ZT0gJTguMGZrQiB0aW1lPSAlMC4zZiBicj0gJTcuMWZrYml0cy9zIGF2Z19icj0gJTcuMWZrYml0cy9zICIsCisgICAgICAgICAgICAgICAoZG91YmxlKW9zdC0+ZGF0YV9zaXplIC8gMTAyNCwgdGkxLCBiaXRyYXRlLCBhdmdfYml0cmF0ZSk7CisgICAgICAgIGZwcmludGYodnN0YXRzX2ZpbGUsICJ0eXBlPSAlY1xuIiwgYXZfZ2V0X3BpY3R1cmVfdHlwZV9jaGFyKG9zdC0+cGljdF90eXBlKSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGluaXRfb3V0cHV0X3N0cmVhbShPdXRwdXRTdHJlYW0gKm9zdCwgY2hhciAqZXJyb3IsIGludCBlcnJvcl9sZW4pOworCitzdGF0aWMgdm9pZCBmaW5pc2hfb3V0cHV0X3N0cmVhbShPdXRwdXRTdHJlYW0gKm9zdCkKK3sKKyAgICBPdXRwdXRGaWxlICpvZiA9IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdOworICAgIGludCBpOworCisgICAgb3N0LT5maW5pc2hlZCA9IEVOQ09ERVJfRklOSVNIRUQgfCBNVVhFUl9GSU5JU0hFRDsKKworICAgIGlmIChvZi0+c2hvcnRlc3QpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9mLT5jdHgtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgICAgIG91dHB1dF9zdHJlYW1zW29mLT5vc3RfaW5kZXggKyBpXS0+ZmluaXNoZWQgPSBFTkNPREVSX0ZJTklTSEVEIHwgTVVYRVJfRklOSVNIRUQ7CisgICAgfQorfQorCisvKioKKyAqIEdldCBhbmQgZW5jb2RlIG5ldyBvdXRwdXQgZnJvbSBhbnkgb2YgdGhlIGZpbHRlcmdyYXBocywgd2l0aG91dCBjYXVzaW5nCisgKiBhY3Rpdml0eS4KKyAqCisgKiBAcmV0dXJuICAwIGZvciBzdWNjZXNzLCA8MCBmb3Igc2V2ZXJlIGVycm9ycworICovCitzdGF0aWMgaW50IHJlYXBfZmlsdGVycyhpbnQgZmx1c2gpCit7CisgICAgQVZGcmFtZSAqZmlsdGVyZWRfZnJhbWUgPSBOVUxMOworICAgIGludCBpOworCisgICAgLyogUmVhcCBhbGwgYnVmZmVycyBwcmVzZW50IGluIHRoZSBidWZmZXIgc2lua3MgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOworICAgICAgICBPdXRwdXRGaWxlICAgICpvZiA9IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdOworICAgICAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlcjsKKyAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IG9zdC0+ZW5jX2N0eDsKKyAgICAgICAgaW50IHJldCA9IDA7CisKKyAgICAgICAgaWYgKCFvc3QtPmZpbHRlciB8fCAhb3N0LT5maWx0ZXItPmdyYXBoLT5ncmFwaCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmaWx0ZXIgPSBvc3QtPmZpbHRlci0+ZmlsdGVyOworCisgICAgICAgIGlmICghb3N0LT5pbml0aWFsaXplZCkgeworICAgICAgICAgICAgY2hhciBlcnJvclsxMDI0XSA9ICIiOworICAgICAgICAgICAgcmV0ID0gaW5pdF9vdXRwdXRfc3RyZWFtKG9zdCwgZXJyb3IsIHNpemVvZihlcnJvcikpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIG91dHB1dCBzdHJlYW0gJWQ6JWQgLS0gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCwgZXJyb3IpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghb3N0LT5maWx0ZXJlZF9mcmFtZSAmJiAhKG9zdC0+ZmlsdGVyZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBmaWx0ZXJlZF9mcmFtZSA9IG9zdC0+ZmlsdGVyZWRfZnJhbWU7CisKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGRvdWJsZSBmbG9hdF9wdHMgPSBBVl9OT1BUU19WQUxVRTsgLy8gdGhpcyBpcyBpZGVudGljYWwgdG8gZmlsdGVyZWRfZnJhbWUucHRzIGJ1dCB3aXRoIGhpZ2hlciBwcmVjaXNpb24KKyAgICAgICAgICAgIHJldCA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX2ZsYWdzKGZpbHRlciwgZmlsdGVyZWRfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0JVRkZFUlNJTktfRkxBR19OT19SRVFVRVNUKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVBR0FJTikgJiYgcmV0ICE9IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpbiBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9mbGFncygpOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsdXNoICYmIHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgICAgICAgICBpZiAoYXZfYnVmZmVyc2lua19nZXRfdHlwZShmaWx0ZXIpID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvX3ZpZGVvX291dChvZiwgb3N0LCBOVUxMLCBBVl9OT1BUU19WQUxVRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9zdC0+ZmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmaWx0ZXJlZF9mcmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsdGVyZWRfZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRfdGltZSA9IChvZi0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgPyAwIDogb2YtPnN0YXJ0X3RpbWU7CisgICAgICAgICAgICAgICAgQVZSYXRpb25hbCBmaWx0ZXJfdGIgPSBhdl9idWZmZXJzaW5rX2dldF90aW1lX2Jhc2UoZmlsdGVyKTsKKyAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRiID0gZW5jLT50aW1lX2Jhc2U7CisgICAgICAgICAgICAgICAgaW50IGV4dHJhX2JpdHMgPSBhdl9jbGlwKDI5IC0gYXZfbG9nMih0Yi5kZW4pLCAwLCAxNik7CisKKyAgICAgICAgICAgICAgICB0Yi5kZW4gPDw9IGV4dHJhX2JpdHM7CisgICAgICAgICAgICAgICAgZmxvYXRfcHRzID0KKyAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGZpbHRlcmVkX2ZyYW1lLT5wdHMsIGZpbHRlcl90YiwgdGIpIC0KKyAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKHN0YXJ0X3RpbWUsIEFWX1RJTUVfQkFTRV9RLCB0Yik7CisgICAgICAgICAgICAgICAgZmxvYXRfcHRzIC89IDEgPDwgZXh0cmFfYml0czsKKyAgICAgICAgICAgICAgICAvLyBhdm9pZCBleGFjdCBtaWRvaW50cyB0byByZWR1Y2UgdGhlIGNoYW5jZSBvZiByb3VuZGluZyBkaWZmZXJlbmNlcywgdGhpcyBjYW4gYmUgcmVtb3ZlZCBpbiBjYXNlIHRoZSBmcHMgY29kZSBpcyBjaGFuZ2VkIHRvIHdvcmsgd2l0aCBpbnRlZ2VycworICAgICAgICAgICAgICAgIGZsb2F0X3B0cyArPSBGRlNJR04oZmxvYXRfcHRzKSAqIDEuMCAvICgxPDwxNyk7CisKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZF9mcmFtZS0+cHRzID0KKyAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGZpbHRlcmVkX2ZyYW1lLT5wdHMsIGZpbHRlcl90YiwgZW5jLT50aW1lX2Jhc2UpIC0KKyAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKHN0YXJ0X3RpbWUsIEFWX1RJTUVfQkFTRV9RLCBlbmMtPnRpbWVfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2lmIChvc3QtPnNvdXJjZV9pbmRleCA+PSAwKQorICAgICAgICAgICAgLy8gICAgKmZpbHRlcmVkX2ZyYW1lPSAqaW5wdXRfc3RyZWFtc1tvc3QtPnNvdXJjZV9pbmRleF0tPmRlY29kZWRfZnJhbWU7IC8vZm9yIG1lX3RocmVzaG9sZAorCisgICAgICAgICAgICBzd2l0Y2ggKGF2X2J1ZmZlcnNpbmtfZ2V0X3R5cGUoZmlsdGVyKSkgeworICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICAgICAgaWYgKCFvc3QtPmZyYW1lX2FzcGVjdF9yYXRpby5udW0pCisgICAgICAgICAgICAgICAgICAgIGVuYy0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGZpbHRlcmVkX2ZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgICAgICAgICAgICAgaWYgKGRlYnVnX3RzKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImZpbHRlciAtPiBwdHM6JXMgcHRzX3RpbWU6JXMgZXhhY3Q6JWYgdGltZV9iYXNlOiVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3RzMnN0cihmaWx0ZXJlZF9mcmFtZS0+cHRzKSwgYXZfdHMydGltZXN0cihmaWx0ZXJlZF9mcmFtZS0+cHRzLCAmZW5jLT50aW1lX2Jhc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPnRpbWVfYmFzZS5udW0sIGVuYy0+dGltZV9iYXNlLmRlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZG9fdmlkZW9fb3V0KG9mLCBvc3QsIGZpbHRlcmVkX2ZyYW1lLCBmbG9hdF9wdHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICAgICAgaWYgKCEoZW5jLT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX1BBUkFNX0NIQU5HRSkgJiYKKyAgICAgICAgICAgICAgICAgICAgZW5jLT5jaGFubmVscyAhPSBmaWx0ZXJlZF9mcmFtZS0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdWRpbyBmaWx0ZXIgZ3JhcGggb3V0cHV0IGlzIG5vdCBub3JtYWxpemVkIGFuZCBlbmNvZGVyIGRvZXMgbm90IHN1cHBvcnQgcGFyYW1ldGVyIGNoYW5nZXNcbiIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9fYXVkaW9fb3V0KG9mLCBvc3QsIGZpbHRlcmVkX2ZyYW1lKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gVE9ETyBzdXBwb3J0IHN1YnRpdGxlIGZpbHRlcnMKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmaWx0ZXJlZF9mcmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZmluYWxfc3RhdHMoaW50NjRfdCB0b3RhbF9zaXplKQoreworICAgIHVpbnQ2NF90IHZpZGVvX3NpemUgPSAwLCBhdWRpb19zaXplID0gMCwgZXh0cmFfc2l6ZSA9IDAsIG90aGVyX3NpemUgPSAwOworICAgIHVpbnQ2NF90IHN1YnRpdGxlX3NpemUgPSAwOworICAgIHVpbnQ2NF90IGRhdGFfc2l6ZSA9IDA7CisgICAgZmxvYXQgcGVyY2VudCA9IC0xLjA7CisgICAgaW50IGksIGo7CisgICAgaW50IHBhc3MxX3VzZWQgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKKyAgICAgICAgc3dpdGNoIChvc3QtPmVuY19jdHgtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiB2aWRlb19zaXplICs9IG9zdC0+ZGF0YV9zaXplOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOiBhdWRpb19zaXplICs9IG9zdC0+ZGF0YV9zaXplOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOiBzdWJ0aXRsZV9zaXplICs9IG9zdC0+ZGF0YV9zaXplOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICBvdGhlcl9zaXplICs9IG9zdC0+ZGF0YV9zaXplOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBleHRyYV9zaXplICs9IG9zdC0+ZW5jX2N0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIGRhdGFfc2l6ZSAgKz0gb3N0LT5kYXRhX3NpemU7CisgICAgICAgIGlmICggICAob3N0LT5lbmNfY3R4LT5mbGFncyAmIChBVl9DT0RFQ19GTEFHX1BBU1MxIHwgQVZfQ09ERUNfRkxBR19QQVNTMikpCisgICAgICAgICAgICAhPSBBVl9DT0RFQ19GTEFHX1BBU1MxKQorICAgICAgICAgICAgcGFzczFfdXNlZCA9IDA7CisgICAgfQorCisgICAgaWYgKGRhdGFfc2l6ZSAmJiB0b3RhbF9zaXplPjAgJiYgdG90YWxfc2l6ZSA+PSBkYXRhX3NpemUpCisgICAgICAgIHBlcmNlbnQgPSAxMDAuMCAqICh0b3RhbF9zaXplIC0gZGF0YV9zaXplKSAvIGRhdGFfc2l6ZTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInZpZGVvOiUxLjBma0IgYXVkaW86JTEuMGZrQiBzdWJ0aXRsZTolMS4wZmtCIG90aGVyIHN0cmVhbXM6JTEuMGZrQiBnbG9iYWwgaGVhZGVyczolMS4wZmtCIG11eGluZyBvdmVyaGVhZDogIiwKKyAgICAgICAgICAgdmlkZW9fc2l6ZSAvIDEwMjQuMCwKKyAgICAgICAgICAgYXVkaW9fc2l6ZSAvIDEwMjQuMCwKKyAgICAgICAgICAgc3VidGl0bGVfc2l6ZSAvIDEwMjQuMCwKKyAgICAgICAgICAgb3RoZXJfc2l6ZSAvIDEwMjQuMCwKKyAgICAgICAgICAgZXh0cmFfc2l6ZSAvIDEwMjQuMCk7CisgICAgaWYgKHBlcmNlbnQgPj0gMC4wKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlZiUlIiwgcGVyY2VudCk7CisgICAgZWxzZQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJ1bmtub3duIik7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiXG4iKTsKKworICAgIC8qIHByaW50IHZlcmJvc2UgcGVyLXN0cmVhbSBzdGF0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9maWxlczsgaSsrKSB7CisgICAgICAgIElucHV0RmlsZSAqZiA9IGlucHV0X2ZpbGVzW2ldOworICAgICAgICB1aW50NjRfdCB0b3RhbF9wYWNrZXRzID0gMCwgdG90YWxfc2l6ZSA9IDA7CisKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiSW5wdXQgZmlsZSAjJWQgKCVzKTpcbiIsCisgICAgICAgICAgICAgICBpLCBmLT5jdHgtPnVybCk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGYtPm5iX3N0cmVhbXM7IGorKykgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gKmlzdCA9IGlucHV0X3N0cmVhbXNbZi0+aXN0X2luZGV4ICsgal07CisgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGU7CisKKyAgICAgICAgICAgIHRvdGFsX3NpemUgICAgKz0gaXN0LT5kYXRhX3NpemU7CisgICAgICAgICAgICB0b3RhbF9wYWNrZXRzICs9IGlzdC0+bmJfcGFja2V0czsKKworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiICBJbnB1dCBzdHJlYW0gIyVkOiVkICglcyk6ICIsCisgICAgICAgICAgICAgICAgICAgaSwgaiwgbWVkaWFfdHlwZV9zdHJpbmcodHlwZSkpOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiJSJQUkl1NjQiIHBhY2tldHMgcmVhZCAoJSJQUkl1NjQiIGJ5dGVzKTsgIiwKKyAgICAgICAgICAgICAgICAgICBpc3QtPm5iX3BhY2tldHMsIGlzdC0+ZGF0YV9zaXplKTsKKworICAgICAgICAgICAgaWYgKGlzdC0+ZGVjb2RpbmdfbmVlZGVkKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiJSJQUkl1NjQiIGZyYW1lcyBkZWNvZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5mcmFtZXNfZGVjb2RlZCk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIgKCUiUFJJdTY0IiBzYW1wbGVzKSIsIGlzdC0+c2FtcGxlc19kZWNvZGVkKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICI7ICIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiICBUb3RhbDogJSJQUkl1NjQiIHBhY2tldHMgKCUiUFJJdTY0IiBieXRlcykgZGVtdXhlZFxuIiwKKyAgICAgICAgICAgICAgIHRvdGFsX3BhY2tldHMsIHRvdGFsX3NpemUpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfZmlsZXM7IGkrKykgeworICAgICAgICBPdXRwdXRGaWxlICpvZiA9IG91dHB1dF9maWxlc1tpXTsKKyAgICAgICAgdWludDY0X3QgdG90YWxfcGFja2V0cyA9IDAsIHRvdGFsX3NpemUgPSAwOworCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIk91dHB1dCBmaWxlICMlZCAoJXMpOlxuIiwKKyAgICAgICAgICAgICAgIGksIG9mLT5jdHgtPnVybCk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG9mLT5jdHgtPm5iX3N0cmVhbXM7IGorKykgeworICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tvZi0+b3N0X2luZGV4ICsgal07CisgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBvc3QtPmVuY19jdHgtPmNvZGVjX3R5cGU7CisKKyAgICAgICAgICAgIHRvdGFsX3NpemUgICAgKz0gb3N0LT5kYXRhX3NpemU7CisgICAgICAgICAgICB0b3RhbF9wYWNrZXRzICs9IG9zdC0+cGFja2V0c193cml0dGVuOworCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIgIE91dHB1dCBzdHJlYW0gIyVkOiVkICglcyk6ICIsCisgICAgICAgICAgICAgICAgICAgaSwgaiwgbWVkaWFfdHlwZV9zdHJpbmcodHlwZSkpOworICAgICAgICAgICAgaWYgKG9zdC0+ZW5jb2RpbmdfbmVlZGVkKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiJSJQUkl1NjQiIGZyYW1lcyBlbmNvZGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5mcmFtZXNfZW5jb2RlZCk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIgKCUiUFJJdTY0IiBzYW1wbGVzKSIsIG9zdC0+c2FtcGxlc19lbmNvZGVkKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICI7ICIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICIlIlBSSXU2NCIgcGFja2V0cyBtdXhlZCAoJSJQUkl1NjQiIGJ5dGVzKTsgIiwKKyAgICAgICAgICAgICAgICAgICBvc3QtPnBhY2tldHNfd3JpdHRlbiwgb3N0LT5kYXRhX3NpemUpOworCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiICBUb3RhbDogJSJQUkl1NjQiIHBhY2tldHMgKCUiUFJJdTY0IiBieXRlcykgbXV4ZWRcbiIsCisgICAgICAgICAgICAgICB0b3RhbF9wYWNrZXRzLCB0b3RhbF9zaXplKTsKKyAgICB9CisgICAgaWYodmlkZW9fc2l6ZSArIGRhdGFfc2l6ZSArIGF1ZGlvX3NpemUgKyBzdWJ0aXRsZV9zaXplICsgZXh0cmFfc2l6ZSA9PSAwKXsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiT3V0cHV0IGZpbGUgaXMgZW1wdHksIG5vdGhpbmcgd2FzIGVuY29kZWQgIik7CisgICAgICAgIGlmIChwYXNzMV91c2VkKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiKGNoZWNrIC1zcyAvIC10IC8gLWZyYW1lcyBwYXJhbWV0ZXJzIGlmIHVzZWQpXG4iKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfcmVwb3J0KGludCBpc19sYXN0X3JlcG9ydCwgaW50NjRfdCB0aW1lcl9zdGFydCwgaW50NjRfdCBjdXJfdGltZSkKK3sKKyAgICBBVkJQcmludCBidWYsIGJ1Zl9zY3JpcHQ7CisgICAgT3V0cHV0U3RyZWFtICpvc3Q7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYzsKKyAgICBpbnQ2NF90IHRvdGFsX3NpemU7CisgICAgQVZDb2RlY0NvbnRleHQgKmVuYzsKKyAgICBpbnQgZnJhbWVfbnVtYmVyLCB2aWQsIGk7CisgICAgZG91YmxlIGJpdHJhdGU7CisgICAgZG91YmxlIHNwZWVkOworICAgIGludDY0X3QgcHRzID0gSU5UNjRfTUlOICsgMTsKKyAgICBzdGF0aWMgaW50NjRfdCBsYXN0X3RpbWUgPSAtMTsKKyAgICBzdGF0aWMgaW50IHFwX2hpc3RvZ3JhbVs1Ml07CisgICAgaW50IGhvdXJzLCBtaW5zLCBzZWNzLCB1czsKKyAgICBjb25zdCBjaGFyICpob3Vyc19zaWduOworICAgIGludCByZXQ7CisgICAgZmxvYXQgdDsKKworICAgIGlmICghcHJpbnRfc3RhdHMgJiYgIWlzX2xhc3RfcmVwb3J0ICYmICFwcm9ncmVzc19hdmlvKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWlzX2xhc3RfcmVwb3J0KSB7CisgICAgICAgIGlmIChsYXN0X3RpbWUgPT0gLTEpIHsKKyAgICAgICAgICAgIGxhc3RfdGltZSA9IGN1cl90aW1lOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgoY3VyX3RpbWUgLSBsYXN0X3RpbWUpIDwgNTAwMDAwKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBsYXN0X3RpbWUgPSBjdXJfdGltZTsKKyAgICB9CisKKyAgICB0ID0gKGN1cl90aW1lLXRpbWVyX3N0YXJ0KSAvIDEwMDAwMDAuMDsKKworCisgICAgb2MgPSBvdXRwdXRfZmlsZXNbMF0tPmN0eDsKKworICAgIHRvdGFsX3NpemUgPSBhdmlvX3NpemUob2MtPnBiKTsKKyAgICBpZiAodG90YWxfc2l6ZSA8PSAwKSAvLyBGSVhNRSBpbXByb3ZlIGF2aW9fc2l6ZSgpIHNvIGl0IHdvcmtzIHdpdGggbm9uIHNlZWthYmxlIG91dHB1dCB0b28KKyAgICAgICAgdG90YWxfc2l6ZSA9IGF2aW9fdGVsbChvYy0+cGIpOworCisgICAgdmlkID0gMDsKKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9BVVRPTUFUSUMpOworICAgIGF2X2JwcmludF9pbml0KCZidWZfc2NyaXB0LCAwLCAxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgeworICAgICAgICBmbG9hdCBxID0gLTE7CisgICAgICAgIG9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOworICAgICAgICBlbmMgPSBvc3QtPmVuY19jdHg7CisgICAgICAgIGlmICghb3N0LT5zdHJlYW1fY29weSkKKyAgICAgICAgICAgIHEgPSBvc3QtPnF1YWxpdHkgLyAoZmxvYXQpIEZGX1FQMkxBTUJEQTsKKworICAgICAgICBpZiAodmlkICYmIGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgInE9JTIuMWYgIiwgcSk7CisgICAgICAgICAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAic3RyZWFtXyVkXyVkX3E9JS4xZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4LCBxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXZpZCAmJiBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBmbG9hdCBmcHM7CisKKyAgICAgICAgICAgIGZyYW1lX251bWJlciA9IG9zdC0+ZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgZnBzID0gdCA+IDEgPyBmcmFtZV9udW1iZXIgLyB0IDogMDsKKyAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgImZyYW1lPSU1ZCBmcHM9JTMuKmYgcT0lMy4xZiAiLAorICAgICAgICAgICAgICAgICAgICAgZnJhbWVfbnVtYmVyLCBmcHMgPCA5Ljk1LCBmcHMsIHEpOworICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgImZyYW1lPSVkXG4iLCBmcmFtZV9udW1iZXIpOworICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgImZwcz0lLjFmXG4iLCBmcHMpOworICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgInN0cmVhbV8lZF8lZF9xPSUuMWZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCwgcSk7CisgICAgICAgICAgICBpZiAoaXNfbGFzdF9yZXBvcnQpCisgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiTCIpOworICAgICAgICAgICAgaWYgKHFwX2hpc3QpIHsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICBpbnQgcXAgPSBscmludGYocSk7CisgICAgICAgICAgICAgICAgaWYgKHFwID49IDAgJiYgcXAgPCBGRl9BUlJBWV9FTEVNUyhxcF9oaXN0b2dyYW0pKQorICAgICAgICAgICAgICAgICAgICBxcF9oaXN0b2dyYW1bcXBdKys7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCisgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgIiVYIiwgYXZfbG9nMihxcF9oaXN0b2dyYW1bal0gKyAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZW5jLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUFNOUikgJiYgKG9zdC0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9OT05FIHx8IGlzX2xhc3RfcmVwb3J0KSkgeworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGRvdWJsZSBlcnJvciwgZXJyb3Jfc3VtID0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGUsIHNjYWxlX3N1bSA9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlIHA7CisgICAgICAgICAgICAgICAgY2hhciB0eXBlWzNdID0geyAnWScsJ1UnLCdWJyB9OworICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgIlBTTlI9Iik7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNfbGFzdF9yZXBvcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gZW5jLT5lcnJvcltqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gZW5jLT53aWR0aCAqIGVuYy0+aGVpZ2h0ICogMjU1LjAgKiAyNTUuMCAqIGZyYW1lX251bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yID0gb3N0LT5lcnJvcltqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gZW5jLT53aWR0aCAqIGVuYy0+aGVpZ2h0ICogMjU1LjAgKiAyNTUuMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoaikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlIC89IDQ7CisgICAgICAgICAgICAgICAgICAgIGVycm9yX3N1bSArPSBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVfc3VtICs9IHNjYWxlOworICAgICAgICAgICAgICAgICAgICBwID0gcHNucihlcnJvciAvIHNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiJWM6JTIuMmYgIiwgdHlwZVtqXSwgcCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJzdHJlYW1fJWRfJWRfcHNucl8lYz0lMi4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIHR5cGVbal0gfCAzMiwgcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAgPSBwc25yKGVycm9yX3N1bSAvIHNjYWxlX3N1bSk7CisgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiKjolMi4yZiAiLCBwc25yKGVycm9yX3N1bSAvIHNjYWxlX3N1bSkpOworICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJzdHJlYW1fJWRfJWRfcHNucl9hbGw9JTIuMmZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIHApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlkID0gMTsKKyAgICAgICAgfQorICAgICAgICAvKiBjb21wdXRlIG1pbiBvdXRwdXQgdmFsdWUgKi8KKyAgICAgICAgaWYgKGF2X3N0cmVhbV9nZXRfZW5kX3B0cyhvc3QtPnN0KSAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHB0cyA9IEZGTUFYKHB0cywgYXZfcmVzY2FsZV9xKGF2X3N0cmVhbV9nZXRfZW5kX3B0cyhvc3QtPnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+c3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpKTsKKyAgICAgICAgaWYgKGlzX2xhc3RfcmVwb3J0KQorICAgICAgICAgICAgbmJfZnJhbWVzX2Ryb3AgKz0gb3N0LT5sYXN0X2Ryb3BwZWQ7CisgICAgfQorCisgICAgc2VjcyA9IEZGQUJTKHB0cykgLyBBVl9USU1FX0JBU0U7CisgICAgdXMgPSBGRkFCUyhwdHMpICUgQVZfVElNRV9CQVNFOworICAgIG1pbnMgPSBzZWNzIC8gNjA7CisgICAgc2VjcyAlPSA2MDsKKyAgICBob3VycyA9IG1pbnMgLyA2MDsKKyAgICBtaW5zICU9IDYwOworICAgIGhvdXJzX3NpZ24gPSAocHRzIDwgMCkgPyAiLSIgOiAiIjsKKworICAgIGJpdHJhdGUgPSBwdHMgJiYgdG90YWxfc2l6ZSA+PSAwID8gdG90YWxfc2l6ZSAqIDggLyAocHRzIC8gMTAwMC4wKSA6IC0xOworICAgIHNwZWVkID0gdCAhPSAwLjAgPyAoZG91YmxlKXB0cyAvIEFWX1RJTUVfQkFTRSAvIHQgOiAtMTsKKworICAgIGlmICh0b3RhbF9zaXplIDwgMCkgYXZfYnByaW50ZigmYnVmLCAic2l6ZT1OL0EgdGltZT0iKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgInNpemU9JTguMGZrQiB0aW1lPSIsIHRvdGFsX3NpemUgLyAxMDI0LjApOworICAgIGlmIChwdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiTi9BICIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgIiVzJTAyZDolMDJkOiUwMmQuJTAyZCAiLAorICAgICAgICAgICAgICAgICAgIGhvdXJzX3NpZ24sIGhvdXJzLCBtaW5zLCBzZWNzLCAoMTAwICogdXMpIC8gQVZfVElNRV9CQVNFKTsKKyAgICB9CisKKyAgICBpZiAoYml0cmF0ZSA8IDApIHsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiYml0cmF0ZT1OL0EiKTsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgImJpdHJhdGU9Ti9BXG4iKTsKKyAgICB9ZWxzZXsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiYml0cmF0ZT0lNi4xZmtiaXRzL3MiLCBiaXRyYXRlKTsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgImJpdHJhdGU9JTYuMWZrYml0cy9zXG4iLCBiaXRyYXRlKTsKKyAgICB9CisKKyAgICBpZiAodG90YWxfc2l6ZSA8IDApIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJ0b3RhbF9zaXplPU4vQVxuIik7CisgICAgZWxzZSAgICAgICAgICAgICAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAidG90YWxfc2l6ZT0lIlBSSWQ2NCJcbiIsIHRvdGFsX3NpemUpOworICAgIGlmIChwdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgIm91dF90aW1lX21zPU4vQVxuIik7CisgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJvdXRfdGltZT1OL0FcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJvdXRfdGltZV9tcz0lIlBSSWQ2NCJcbiIsIHB0cyk7CisgICAgICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJvdXRfdGltZT0lcyUwMmQ6JTAyZDolMDJkLiUwNmRcbiIsCisgICAgICAgICAgICAgICAgICAgaG91cnNfc2lnbiwgaG91cnMsIG1pbnMsIHNlY3MsIHVzKTsKKyAgICB9CisKKyAgICBpZiAobmJfZnJhbWVzX2R1cCB8fCBuYl9mcmFtZXNfZHJvcCkKKyAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiIGR1cD0lZCBkcm9wPSVkIiwgbmJfZnJhbWVzX2R1cCwgbmJfZnJhbWVzX2Ryb3ApOworICAgIGF2X2JwcmludGYoJmJ1Zl9zY3JpcHQsICJkdXBfZnJhbWVzPSVkXG4iLCBuYl9mcmFtZXNfZHVwKTsKKyAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAiZHJvcF9mcmFtZXM9JWRcbiIsIG5iX2ZyYW1lc19kcm9wKTsKKworICAgIGlmIChzcGVlZCA8IDApIHsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiIHNwZWVkPU4vQSIpOworICAgICAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAic3BlZWQ9Ti9BXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9icHJpbnRmKCZidWYsICIgc3BlZWQ9JTQuM2d4Iiwgc3BlZWQpOworICAgICAgICBhdl9icHJpbnRmKCZidWZfc2NyaXB0LCAic3BlZWQ9JTQuM2d4XG4iLCBzcGVlZCk7CisgICAgfQorCisgICAgaWYgKHByaW50X3N0YXRzIHx8IGlzX2xhc3RfcmVwb3J0KSB7CisgICAgICAgIGNvbnN0IGNoYXIgZW5kID0gaXNfbGFzdF9yZXBvcnQgPyAnXG4nIDogJ1xyJzsKKyAgICAgICAgaWYgKHByaW50X3N0YXRzPT0xICYmIEFWX0xPR19JTkZPID4gYXZfbG9nX2dldF9sZXZlbCgpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzICAgICVjIiwgYnVmLnN0ciwgZW5kKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlcyAgICAlYyIsIGJ1Zi5zdHIsIGVuZCk7CisKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICB9CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworCisgICAgaWYgKHByb2dyZXNzX2F2aW8pIHsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmX3NjcmlwdCwgInByb2dyZXNzPSVzXG4iLAorICAgICAgICAgICAgICAgICAgIGlzX2xhc3RfcmVwb3J0ID8gImVuZCIgOiAiY29udGludWUiKTsKKyAgICAgICAgYXZpb193cml0ZShwcm9ncmVzc19hdmlvLCBidWZfc2NyaXB0LnN0ciwKKyAgICAgICAgICAgICAgICAgICBGRk1JTihidWZfc2NyaXB0LmxlbiwgYnVmX3NjcmlwdC5zaXplIC0gMSkpOworICAgICAgICBhdmlvX2ZsdXNoKHByb2dyZXNzX2F2aW8pOworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1Zl9zY3JpcHQsIE5VTEwpOworICAgICAgICBpZiAoaXNfbGFzdF9yZXBvcnQpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZpb19jbG9zZXAoJnByb2dyZXNzX2F2aW8pKSA8IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNsb3NpbmcgcHJvZ3Jlc3MgbG9nLCBsb3NzIG9mIGluZm9ybWF0aW9uIHBvc3NpYmxlOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpc19sYXN0X3JlcG9ydCkKKyAgICAgICAgcHJpbnRfZmluYWxfc3RhdHModG90YWxfc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGlmaWx0ZXJfcGFyYW1ldGVyc19mcm9tX2NvZGVjcGFyKElucHV0RmlsdGVyICppZmlsdGVyLCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyKQoreworICAgIC8vIFdlIG5ldmVyIGdvdCBhbnkgaW5wdXQuIFNldCBhIGZha2UgZm9ybWF0LCB3aGljaCB3aWxsCisgICAgLy8gY29tZSBmcm9tIGxpYmF2Zm9ybWF0LgorICAgIGlmaWx0ZXItPmZvcm1hdCAgICAgICAgICAgICAgICAgPSBwYXItPmZvcm1hdDsKKyAgICBpZmlsdGVyLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgID0gcGFyLT5zYW1wbGVfcmF0ZTsKKyAgICBpZmlsdGVyLT5jaGFubmVscyAgICAgICAgICAgICAgID0gcGFyLT5jaGFubmVsczsKKyAgICBpZmlsdGVyLT5jaGFubmVsX2xheW91dCAgICAgICAgID0gcGFyLT5jaGFubmVsX2xheW91dDsKKyAgICBpZmlsdGVyLT53aWR0aCAgICAgICAgICAgICAgICAgID0gcGFyLT53aWR0aDsKKyAgICBpZmlsdGVyLT5oZWlnaHQgICAgICAgICAgICAgICAgID0gcGFyLT5oZWlnaHQ7CisgICAgaWZpbHRlci0+c2FtcGxlX2FzcGVjdF9yYXRpbyAgICA9IHBhci0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKK30KKworc3RhdGljIHZvaWQgZmx1c2hfZW5jb2RlcnModm9pZCkKK3sKKyAgICBpbnQgaSwgcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICAgKm9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOworICAgICAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gb3N0LT5lbmNfY3R4OworICAgICAgICBPdXRwdXRGaWxlICAgICAgKm9mID0gb3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF07CisKKyAgICAgICAgaWYgKCFvc3QtPmVuY29kaW5nX25lZWRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIFRyeSB0byBlbmFibGUgZW5jb2Rpbmcgd2l0aCBubyBpbnB1dCBmcmFtZXMuCisgICAgICAgIC8vIE1heWJlIHdlIHNob3VsZCBqdXN0IGxldCBlbmNvZGluZyBmYWlsIGluc3RlYWQuCisgICAgICAgIGlmICghb3N0LT5pbml0aWFsaXplZCkgeworICAgICAgICAgICAgRmlsdGVyR3JhcGggKmZnID0gb3N0LT5maWx0ZXItPmdyYXBoOworICAgICAgICAgICAgY2hhciBlcnJvclsxMDI0XSA9ICIiOworCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkZpbmlzaGluZyBzdHJlYW0gJWQ6JWQgd2l0aG91dCBhbnkgZGF0YSB3cml0dGVuIHRvIGl0LlxuIiwKKyAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+c3QtPmluZGV4KTsKKworICAgICAgICAgICAgaWYgKG9zdC0+ZmlsdGVyICYmICFmZy0+Z3JhcGgpIHsKKyAgICAgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZmctPm5iX2lucHV0czsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIElucHV0RmlsdGVyICppZmlsdGVyID0gZmctPmlucHV0c1t4XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlmaWx0ZXItPmZvcm1hdCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBpZmlsdGVyX3BhcmFtZXRlcnNfZnJvbV9jb2RlY3BhcihpZmlsdGVyLCBpZmlsdGVyLT5pc3QtPnN0LT5jb2RlY3Bhcik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFpZmlsdGVyX2hhc19hbGxfaW5wdXRfZm9ybWF0cyhmZykpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgcmV0ID0gY29uZmlndXJlX2ZpbHRlcmdyYXBoKGZnKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY29uZmlndXJpbmcgZmlsdGVyIGdyYXBoXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmlzaF9vdXRwdXRfc3RyZWFtKG9zdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IGluaXRfb3V0cHV0X3N0cmVhbShvc3QsIGVycm9yLCBzaXplb2YoZXJyb3IpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBvdXRwdXQgc3RyZWFtICVkOiVkIC0tICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIGVycm9yKTsKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJiBlbmMtPmZyYW1lX3NpemUgPD0gMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGVuYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjID0gTlVMTDsKKyAgICAgICAgICAgIEFWUGFja2V0IHBrdDsKKyAgICAgICAgICAgIGludCBwa3Rfc2l6ZTsKKworICAgICAgICAgICAgc3dpdGNoIChlbmMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgICAgIGRlc2MgICA9ICJhdWRpbyI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgICAgICBkZXNjICAgPSAidmlkZW8iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisgICAgICAgICAgICAgICAgcGt0LmRhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgIHBrdC5zaXplID0gMDsKKworICAgICAgICAgICAgICAgIHVwZGF0ZV9iZW5jaG1hcmsoTlVMTCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9wYWNrZXQoZW5jLCAmcGt0KSkgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfc2VuZF9mcmFtZShlbmMsIE5VTEwpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIiVzIGVuY29kaW5nIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdXBkYXRlX2JlbmNobWFyaygiZmx1c2hfJXMgJWQuJWQiLCBkZXNjLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiJXMgZW5jb2RpbmcgZmFpbGVkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvc3QtPmxvZ2ZpbGUgJiYgZW5jLT5zdGF0c19vdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50Zihvc3QtPmxvZ2ZpbGUsICIlcyIsIGVuYy0+c3RhdHNfb3V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcGFja2V0KG9mLCAmcGt0LCBvc3QsIDEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9zdC0+ZmluaXNoZWQgJiBNVVhFUl9GSU5JU0hFRCkgeworICAgICAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9wYWNrZXRfcmVzY2FsZV90cygmcGt0LCBlbmMtPnRpbWVfYmFzZSwgb3N0LT5tdXhfdGltZWJhc2UpOworICAgICAgICAgICAgICAgIHBrdF9zaXplID0gcGt0LnNpemU7CisgICAgICAgICAgICAgICAgb3V0cHV0X3BhY2tldChvZiwgJnBrdCwgb3N0LCAwKTsKKyAgICAgICAgICAgICAgICBpZiAob3N0LT5lbmNfY3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiB2c3RhdHNfZmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZG9fdmlkZW9fc3RhdHMob3N0LCBwa3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKgorICogQ2hlY2sgd2hldGhlciBhIHBhY2tldCBmcm9tIGlzdCBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIG9zdCBhdCB0aGlzIHRpbWUKKyAqLworc3RhdGljIGludCBjaGVja19vdXRwdXRfY29uc3RyYWludHMoSW5wdXRTdHJlYW0gKmlzdCwgT3V0cHV0U3RyZWFtICpvc3QpCit7CisgICAgT3V0cHV0RmlsZSAqb2YgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKKyAgICBpbnQgaXN0X2luZGV4ICA9IGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF0tPmlzdF9pbmRleCArIGlzdC0+c3QtPmluZGV4OworCisgICAgaWYgKG9zdC0+c291cmNlX2luZGV4ICE9IGlzdF9pbmRleCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAob3N0LT5maW5pc2hlZCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAob2YtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgJiYgaXN0LT5wdHMgPCBvZi0+c3RhcnRfdGltZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgZG9fc3RyZWFtY29weShJbnB1dFN0cmVhbSAqaXN0LCBPdXRwdXRTdHJlYW0gKm9zdCwgY29uc3QgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBPdXRwdXRGaWxlICpvZiA9IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdOworICAgIElucHV0RmlsZSAgICpmID0gaW5wdXRfZmlsZXMgW2lzdC0+ZmlsZV9pbmRleF07CisgICAgaW50NjRfdCBzdGFydF90aW1lID0gKG9mLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSA/IDAgOiBvZi0+c3RhcnRfdGltZTsKKyAgICBpbnQ2NF90IG9zdF90Yl9zdGFydF90aW1lID0gYXZfcmVzY2FsZV9xKHN0YXJ0X3RpbWUsIEFWX1RJTUVfQkFTRV9RLCBvc3QtPm11eF90aW1lYmFzZSk7CisgICAgQVZQYWNrZXQgb3BrdCA9IHsgMCB9OworCisgICAgYXZfaW5pdF9wYWNrZXQoJm9wa3QpOworCisgICAgLy8gRU9GOiBmbHVzaCBvdXRwdXQgYml0c3RyZWFtIGZpbHRlcnMuCisgICAgaWYgKCFwa3QpIHsKKyAgICAgICAgb3V0cHV0X3BhY2tldChvZiwgJm9wa3QsIG9zdCwgMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKCFvc3QtPmZyYW1lX251bWJlciAmJiAhKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSAmJgorICAgICAgICAhb3N0LT5jb3B5X2luaXRpYWxfbm9ua2V5ZnJhbWVzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW9zdC0+ZnJhbWVfbnVtYmVyICYmICFvc3QtPmNvcHlfcHJpb3Jfc3RhcnQpIHsKKyAgICAgICAgaW50NjRfdCBjb21wX3N0YXJ0ID0gc3RhcnRfdGltZTsKKyAgICAgICAgaWYgKGNvcHlfdHMgJiYgZi0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIGNvbXBfc3RhcnQgPSBGRk1BWChzdGFydF90aW1lLCBmLT5zdGFydF90aW1lICsgZi0+dHNfb2Zmc2V0KTsKKyAgICAgICAgaWYgKHBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFID8KKyAgICAgICAgICAgIGlzdC0+cHRzIDwgY29tcF9zdGFydCA6CisgICAgICAgICAgICBwa3QtPnB0cyA8IGF2X3Jlc2NhbGVfcShjb21wX3N0YXJ0LCBBVl9USU1FX0JBU0VfUSwgaXN0LT5zdC0+dGltZV9iYXNlKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAob2YtPnJlY29yZGluZ190aW1lICE9IElOVDY0X01BWCAmJgorICAgICAgICBpc3QtPnB0cyA+PSBvZi0+cmVjb3JkaW5nX3RpbWUgKyBzdGFydF90aW1lKSB7CisgICAgICAgIGNsb3NlX291dHB1dF9zdHJlYW0ob3N0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChmLT5yZWNvcmRpbmdfdGltZSAhPSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgc3RhcnRfdGltZSA9IGYtPmN0eC0+c3RhcnRfdGltZTsKKyAgICAgICAgaWYgKGYtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgJiYgY29weV90cykKKyAgICAgICAgICAgIHN0YXJ0X3RpbWUgKz0gZi0+c3RhcnRfdGltZTsKKyAgICAgICAgaWYgKGlzdC0+cHRzID49IGYtPnJlY29yZGluZ190aW1lICsgc3RhcnRfdGltZSkgeworICAgICAgICAgICAgY2xvc2Vfb3V0cHV0X3N0cmVhbShvc3QpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZm9yY2UgdGhlIGlucHV0IHN0cmVhbSBQVFMgKi8KKyAgICBpZiAob3N0LT5lbmNfY3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgb3N0LT5zeW5jX29wdHMrKzsKKworICAgIGlmIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgb3BrdC5wdHMgPSBhdl9yZXNjYWxlX3EocGt0LT5wdHMsIGlzdC0+c3QtPnRpbWVfYmFzZSwgb3N0LT5tdXhfdGltZWJhc2UpIC0gb3N0X3RiX3N0YXJ0X3RpbWU7CisgICAgZWxzZQorICAgICAgICBvcGt0LnB0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgaWYgKHBrdC0+ZHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBvcGt0LmR0cyA9IGF2X3Jlc2NhbGVfcShpc3QtPmR0cywgQVZfVElNRV9CQVNFX1EsIG9zdC0+bXV4X3RpbWViYXNlKTsKKyAgICBlbHNlCisgICAgICAgIG9wa3QuZHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIG9zdC0+bXV4X3RpbWViYXNlKTsKKyAgICBvcGt0LmR0cyAtPSBvc3RfdGJfc3RhcnRfdGltZTsKKworICAgIGlmIChvc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgcGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaW50IGR1cmF0aW9uID0gYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKGlzdC0+ZGVjX2N0eCwgcGt0LT5zaXplKTsKKyAgICAgICAgaWYoIWR1cmF0aW9uKQorICAgICAgICAgICAgZHVyYXRpb24gPSBpc3QtPmRlY19jdHgtPmZyYW1lX3NpemU7CisgICAgICAgIG9wa3QuZHRzID0gb3BrdC5wdHMgPSBhdl9yZXNjYWxlX2RlbHRhKGlzdC0+c3QtPnRpbWVfYmFzZSwgcGt0LT5kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBpc3QtPmRlY19jdHgtPnNhbXBsZV9yYXRlfSwgZHVyYXRpb24sICZpc3QtPmZpbHRlcl9pbl9yZXNjYWxlX2RlbHRhX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zdC0+bXV4X3RpbWViYXNlKSAtIG9zdF90Yl9zdGFydF90aW1lOworICAgIH0KKworICAgIG9wa3QuZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EocGt0LT5kdXJhdGlvbiwgaXN0LT5zdC0+dGltZV9iYXNlLCBvc3QtPm11eF90aW1lYmFzZSk7CisKKyAgICBvcGt0LmZsYWdzICAgID0gcGt0LT5mbGFnczsKKworICAgIGlmIChwa3QtPmJ1ZikgeworICAgICAgICBvcGt0LmJ1ZiA9IGF2X2J1ZmZlcl9yZWYocGt0LT5idWYpOworICAgICAgICBpZiAoIW9wa3QuYnVmKQorICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKyAgICBvcGt0LmRhdGEgPSBwa3QtPmRhdGE7CisgICAgb3BrdC5zaXplID0gcGt0LT5zaXplOworCisgICAgYXZfY29weV9wYWNrZXRfc2lkZV9kYXRhKCZvcGt0LCBwa3QpOworCisgICAgb3V0cHV0X3BhY2tldChvZiwgJm9wa3QsIG9zdCwgMCk7Cit9CisKK2ludCBndWVzc19pbnB1dF9jaGFubmVsX2xheW91dChJbnB1dFN0cmVhbSAqaXN0KQoreworICAgIEFWQ29kZWNDb250ZXh0ICpkZWMgPSBpc3QtPmRlY19jdHg7CisKKyAgICBpZiAoIWRlYy0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgY2hhciBsYXlvdXRfbmFtZVsyNTZdOworCisgICAgICAgIGlmIChkZWMtPmNoYW5uZWxzID4gaXN0LT5ndWVzc19sYXlvdXRfbWF4KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGRlYy0+Y2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChkZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgaWYgKCFkZWMtPmNoYW5uZWxfbGF5b3V0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcobGF5b3V0X25hbWUsIHNpemVvZihsYXlvdXRfbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5jaGFubmVscywgZGVjLT5jaGFubmVsX2xheW91dCk7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIkd1ZXNzZWQgQ2hhbm5lbCBMYXlvdXQgZm9yIElucHV0IFN0cmVhbSAiCisgICAgICAgICAgICAgICAiIyVkLiVkIDogJXNcbiIsIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgsIGxheW91dF9uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2RlY29kZV9yZXN1bHQoSW5wdXRTdHJlYW0gKmlzdCwgaW50ICpnb3Rfb3V0cHV0LCBpbnQgcmV0KQoreworICAgIGlmICgqZ290X291dHB1dCB8fCByZXQ8MCkKKyAgICAgICAgZGVjb2RlX2Vycm9yX3N0YXRbcmV0PDBdICsrOworCisgICAgaWYgKHJldCA8IDAgJiYgZXhpdF9vbl9lcnJvcikKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworCisgICAgaWYgKGV4aXRfb25fZXJyb3IgJiYgKmdvdF9vdXRwdXQgJiYgaXN0KSB7CisgICAgICAgIGlmIChpc3QtPmRlY29kZWRfZnJhbWUtPmRlY29kZV9lcnJvcl9mbGFncyB8fCAoaXN0LT5kZWNvZGVkX2ZyYW1lLT5mbGFncyAmIEFWX0ZSQU1FX0ZMQUdfQ09SUlVQVCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlczogY29ycnVwdCBkZWNvZGVkIGZyYW1lIGluIHN0cmVhbSAlZFxuIiwgaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+Y3R4LT51cmwsIGlzdC0+c3QtPmluZGV4KTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gRmlsdGVycyBjYW4gYmUgY29uZmlndXJlZCBvbmx5IGlmIHRoZSBmb3JtYXRzIG9mIGFsbCBpbnB1dHMgYXJlIGtub3duLgorc3RhdGljIGludCBpZmlsdGVyX2hhc19hbGxfaW5wdXRfZm9ybWF0cyhGaWx0ZXJHcmFwaCAqZmcpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGZnLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpZiAoZmctPmlucHV0c1tpXS0+Zm9ybWF0IDwgMCAmJiAoZmctPmlucHV0c1tpXS0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnLT5pbnB1dHNbaV0tPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpZmlsdGVyX3NlbmRfZnJhbWUoSW5wdXRGaWx0ZXIgKmlmaWx0ZXIsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEZpbHRlckdyYXBoICpmZyA9IGlmaWx0ZXItPmdyYXBoOworICAgIGludCBuZWVkX3JlaW5pdCwgcmV0LCBpOworCisgICAgLyogZGV0ZXJtaW5lIGlmIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGlzIGlucHV0IGNoYW5nZWQgKi8KKyAgICBuZWVkX3JlaW5pdCA9IGlmaWx0ZXItPmZvcm1hdCAhPSBmcmFtZS0+Zm9ybWF0OworCisgICAgc3dpdGNoIChpZmlsdGVyLT5pc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBuZWVkX3JlaW5pdCB8PSBpZmlsdGVyLT5zYW1wbGVfcmF0ZSAgICAhPSBmcmFtZS0+c2FtcGxlX3JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaWZpbHRlci0+Y2hhbm5lbHMgICAgICAgIT0gZnJhbWUtPmNoYW5uZWxzIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGlmaWx0ZXItPmNoYW5uZWxfbGF5b3V0ICE9IGZyYW1lLT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIG5lZWRfcmVpbml0IHw9IGlmaWx0ZXItPndpZHRoICAhPSBmcmFtZS0+d2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgaWZpbHRlci0+aGVpZ2h0ICE9IGZyYW1lLT5oZWlnaHQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghaWZpbHRlci0+aXN0LT5yZWluaXRfZmlsdGVycyAmJiBmZy0+Z3JhcGgpCisgICAgICAgIG5lZWRfcmVpbml0ID0gMDsKKworICAgIGlmICghIWlmaWx0ZXItPmh3X2ZyYW1lc19jdHggIT0gISFmcmFtZS0+aHdfZnJhbWVzX2N0eCB8fAorICAgICAgICAoaWZpbHRlci0+aHdfZnJhbWVzX2N0eCAmJiBpZmlsdGVyLT5od19mcmFtZXNfY3R4LT5kYXRhICE9IGZyYW1lLT5od19mcmFtZXNfY3R4LT5kYXRhKSkKKyAgICAgICAgbmVlZF9yZWluaXQgPSAxOworCisgICAgaWYgKG5lZWRfcmVpbml0KSB7CisgICAgICAgIHJldCA9IGlmaWx0ZXJfcGFyYW1ldGVyc19mcm9tX2ZyYW1lKGlmaWx0ZXIsIGZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIChyZSlpbml0IHRoZSBncmFwaCBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIGJ1ZmZlciB0aGUgZnJhbWUgYW5kIHJldHVybiAqLworICAgIGlmIChuZWVkX3JlaW5pdCB8fCAhZmctPmdyYXBoKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmZy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghaWZpbHRlcl9oYXNfYWxsX2lucHV0X2Zvcm1hdHMoZmcpKSB7CisgICAgICAgICAgICAgICAgQVZGcmFtZSAqdG1wID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworICAgICAgICAgICAgICAgIGlmICghdG1wKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKworICAgICAgICAgICAgICAgIGlmICghYXZfZmlmb19zcGFjZShpZmlsdGVyLT5mcmFtZV9xdWV1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZfZmlmb19yZWFsbG9jMihpZmlsdGVyLT5mcmFtZV9xdWV1ZSwgMiAqIGF2X2ZpZm9fc2l6ZShpZmlsdGVyLT5mcmFtZV9xdWV1ZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmdG1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGlmaWx0ZXItPmZyYW1lX3F1ZXVlLCAmdG1wLCBzaXplb2YodG1wKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXQgPSByZWFwX2ZpbHRlcnMoMSk7CisgICAgICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoaWxlIGZpbHRlcmluZzogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gY29uZmlndXJlX2ZpbHRlcmdyYXBoKGZnKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciByZWluaXRpYWxpemluZyBmaWx0ZXJzIVxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZV9mbGFncyhpZmlsdGVyLT5maWx0ZXIsIGZyYW1lLCBBVl9CVUZGRVJTUkNfRkxBR19QVVNIKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAocmV0ICE9IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoaWxlIGZpbHRlcmluZzogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWZpbHRlcl9zZW5kX2VvZihJbnB1dEZpbHRlciAqaWZpbHRlciwgaW50NjRfdCBwdHMpCit7CisgICAgaW50IHJldDsKKworICAgIGlmaWx0ZXItPmVvZiA9IDE7CisKKyAgICBpZiAoaWZpbHRlci0+ZmlsdGVyKSB7CisgICAgICAgIHJldCA9IGF2X2J1ZmZlcnNyY19jbG9zZShpZmlsdGVyLT5maWx0ZXIsIHB0cywgQVZfQlVGRkVSU1JDX0ZMQUdfUFVTSCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB0aGUgZmlsdGVyZ3JhcGggd2FzIG5ldmVyIGNvbmZpZ3VyZWQKKyAgICAgICAgaWYgKGlmaWx0ZXItPmZvcm1hdCA8IDApCisgICAgICAgICAgICBpZmlsdGVyX3BhcmFtZXRlcnNfZnJvbV9jb2RlY3BhcihpZmlsdGVyLCBpZmlsdGVyLT5pc3QtPnN0LT5jb2RlY3Bhcik7CisgICAgICAgIGlmIChpZmlsdGVyLT5mb3JtYXQgPCAwICYmIChpZmlsdGVyLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyB8fCBpZmlsdGVyLT50eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgZGV0ZXJtaW5lIGZvcm1hdCBvZiBpbnB1dCBzdHJlYW0gJWQ6JWQgYWZ0ZXIgRU9GXG4iLCBpZmlsdGVyLT5pc3QtPmZpbGVfaW5kZXgsIGlmaWx0ZXItPmlzdC0+c3QtPmluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIFRoaXMgZG9lcyBub3QgcXVpdGUgd29yayBsaWtlIGF2Y29kZWNfZGVjb2RlX2F1ZGlvNC9hdmNvZGVjX2RlY29kZV92aWRlbzIuCisvLyBUaGVyZSBpcyB0aGUgZm9sbG93aW5nIGRpZmZlcmVuY2U6IGlmIHlvdSBnb3QgYSBmcmFtZSwgeW91IG11c3QgY2FsbAorLy8gaXQgYWdhaW4gd2l0aCBwa3Q9TlVMTC4gcGt0PT1OVUxMIGlzIHRyZWF0ZWQgZGlmZmVyZW50bHkgZnJvbSBwa3QtPnNpemU9PTAKKy8vIChwa3Q9PU5VTEwgbWVhbnMgZ2V0IG1vcmUgb3V0cHV0LCBwa3QtPnNpemU9PTAgaXMgYSBmbHVzaC9kcmFpbiBwYWNrZXQpCitzdGF0aWMgaW50IGRlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgKmdvdF9mcmFtZSA9IDA7CisKKyAgICBpZiAocGt0KSB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfc2VuZF9wYWNrZXQoYXZjdHgsIHBrdCk7CisgICAgICAgIC8vIEluIHBhcnRpY3VsYXIsIHdlIGRvbid0IGV4cGVjdCBBVkVSUk9SKEVBR0FJTiksIGJlY2F1c2Ugd2UgcmVhZCBhbGwKKyAgICAgICAgLy8gZGVjb2RlZCBmcmFtZXMgd2l0aCBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoKSB1bnRpbCBkb25lLgorICAgICAgICBpZiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9mcmFtZShhdmN0eCwgZnJhbWUpOworICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlbmRfZnJhbWVfdG9fZmlsdGVycyhJbnB1dFN0cmVhbSAqaXN0LCBBVkZyYW1lICpkZWNvZGVkX2ZyYW1lKQoreworICAgIGludCBpLCByZXQ7CisgICAgQVZGcmFtZSAqZjsKKworICAgIGF2X2Fzc2VydDEoaXN0LT5uYl9maWx0ZXJzID4gMCk7IC8qIGVuc3VyZSByZXQgaXMgaW5pdGlhbGl6ZWQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaXN0LT5uYl9maWx0ZXJzOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPCBpc3QtPm5iX2ZpbHRlcnMgLSAxKSB7CisgICAgICAgICAgICBmID0gaXN0LT5maWx0ZXJfZnJhbWU7CisgICAgICAgICAgICByZXQgPSBhdl9mcmFtZV9yZWYoZiwgZGVjb2RlZF9mcmFtZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBmID0gZGVjb2RlZF9mcmFtZTsKKyAgICAgICAgcmV0ID0gaWZpbHRlcl9zZW5kX2ZyYW1lKGlzdC0+ZmlsdGVyc1tpXSwgZik7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICByZXQgPSAwOyAvKiBpZ25vcmUgKi8KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbmplY3QgZnJhbWUgaW50byBmaWx0ZXIgbmV0d29yazogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdWRpbyhJbnB1dFN0cmVhbSAqaXN0LCBBVlBhY2tldCAqcGt0LCBpbnQgKmdvdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRlY29kZV9mYWlsZWQpCit7CisgICAgQVZGcmFtZSAqZGVjb2RlZF9mcmFtZTsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBpc3QtPmRlY19jdHg7CisgICAgaW50IHJldCwgZXJyID0gMDsKKyAgICBBVlJhdGlvbmFsIGRlY29kZWRfZnJhbWVfdGI7CisKKyAgICBpZiAoIWlzdC0+ZGVjb2RlZF9mcmFtZSAmJiAhKGlzdC0+ZGVjb2RlZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICghaXN0LT5maWx0ZXJfZnJhbWUgJiYgIShpc3QtPmZpbHRlcl9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGRlY29kZWRfZnJhbWUgPSBpc3QtPmRlY29kZWRfZnJhbWU7CisKKyAgICB1cGRhdGVfYmVuY2htYXJrKE5VTEwpOworICAgIHJldCA9IGRlY29kZShhdmN0eCwgZGVjb2RlZF9mcmFtZSwgZ290X291dHB1dCwgcGt0KTsKKyAgICB1cGRhdGVfYmVuY2htYXJrKCJkZWNvZGVfYXVkaW8gJWQuJWQiLCBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgKmRlY29kZV9mYWlsZWQgPSAxOworCisgICAgaWYgKHJldCA+PSAwICYmIGF2Y3R4LT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2FtcGxlIHJhdGUgJWQgaW52YWxpZFxuIiwgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAocmV0ICE9IEFWRVJST1JfRU9GKQorICAgICAgICBjaGVja19kZWNvZGVfcmVzdWx0KGlzdCwgZ290X291dHB1dCwgcmV0KTsKKworICAgIGlmICghKmdvdF9vdXRwdXQgfHwgcmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlzdC0+c2FtcGxlc19kZWNvZGVkICs9IGRlY29kZWRfZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgaXN0LT5mcmFtZXNfZGVjb2RlZCsrOworCisjaWYgMQorICAgIC8qIGluY3JlbWVudCBuZXh0X2R0cyB0byB1c2UgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBpbnB1dCBzdHJlYW0gZG9lcyBub3QKKyAgICAgICBoYXZlIHRpbWVzdGFtcHMgb3IgdGhlcmUgYXJlIG11bHRpcGxlIGZyYW1lcyBpbiB0aGUgcGFja2V0ICovCisgICAgaXN0LT5uZXh0X3B0cyArPSAoKGludDY0X3QpQVZfVElNRV9CQVNFICogZGVjb2RlZF9mcmFtZS0+bmJfc2FtcGxlcykgLworICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIGlzdC0+bmV4dF9kdHMgKz0gKChpbnQ2NF90KUFWX1RJTUVfQkFTRSAqIGRlY29kZWRfZnJhbWUtPm5iX3NhbXBsZXMpIC8KKyAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyNlbmRpZgorCisgICAgaWYgKGRlY29kZWRfZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBkZWNvZGVkX2ZyYW1lX3RiICAgPSBpc3QtPnN0LT50aW1lX2Jhc2U7CisgICAgfSBlbHNlIGlmIChwa3QgJiYgcGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgZGVjb2RlZF9mcmFtZS0+cHRzID0gcGt0LT5wdHM7CisgICAgICAgIGRlY29kZWRfZnJhbWVfdGIgICA9IGlzdC0+c3QtPnRpbWVfYmFzZTsKKyAgICB9ZWxzZSB7CisgICAgICAgIGRlY29kZWRfZnJhbWUtPnB0cyA9IGlzdC0+ZHRzOworICAgICAgICBkZWNvZGVkX2ZyYW1lX3RiICAgPSBBVl9USU1FX0JBU0VfUTsKKyAgICB9CisgICAgaWYgKGRlY29kZWRfZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgZGVjb2RlZF9mcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9kZWx0YShkZWNvZGVkX2ZyYW1lX3RiLCBkZWNvZGVkX2ZyYW1lLT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIGF2Y3R4LT5zYW1wbGVfcmF0ZX0sIGRlY29kZWRfZnJhbWUtPm5iX3NhbXBsZXMsICZpc3QtPmZpbHRlcl9pbl9yZXNjYWxlX2RlbHRhX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIGF2Y3R4LT5zYW1wbGVfcmF0ZX0pOworICAgIGlzdC0+bmJfc2FtcGxlcyA9IGRlY29kZWRfZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgZXJyID0gc2VuZF9mcmFtZV90b19maWx0ZXJzKGlzdCwgZGVjb2RlZF9mcmFtZSk7CisKKyAgICBhdl9mcmFtZV91bnJlZihpc3QtPmZpbHRlcl9mcmFtZSk7CisgICAgYXZfZnJhbWVfdW5yZWYoZGVjb2RlZF9mcmFtZSk7CisgICAgcmV0dXJuIGVyciA8IDAgPyBlcnIgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3ZpZGVvKElucHV0U3RyZWFtICppc3QsIEFWUGFja2V0ICpwa3QsIGludCAqZ290X291dHB1dCwgaW50NjRfdCAqZHVyYXRpb25fcHRzLCBpbnQgZW9mLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkZWNvZGVfZmFpbGVkKQoreworICAgIEFWRnJhbWUgKmRlY29kZWRfZnJhbWU7CisgICAgaW50IGksIHJldCA9IDAsIGVyciA9IDA7CisgICAgaW50NjRfdCBiZXN0X2VmZm9ydF90aW1lc3RhbXA7CisgICAgaW50NjRfdCBkdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBBVlBhY2tldCBhdnBrdDsKKworICAgIC8vIFdpdGggZmF0ZS1pbmRlbzMtMiwgd2UncmUgZ2V0dGluZyAwLXNpemVkIHBhY2tldHMgYmVmb3JlIEVPRiBmb3Igc29tZQorICAgIC8vIHJlYXNvbi4gVGhpcyBzZWVtcyBsaWtlIGEgc2VtaS1jcml0aWNhbCBidWcuIERvbid0IHRyaWdnZXIgRU9GLCBhbmQKKyAgICAvLyBza2lwIHRoZSBwYWNrZXQuCisgICAgaWYgKCFlb2YgJiYgcGt0ICYmIHBrdC0+c2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghaXN0LT5kZWNvZGVkX2ZyYW1lICYmICEoaXN0LT5kZWNvZGVkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKCFpc3QtPmZpbHRlcl9mcmFtZSAmJiAhKGlzdC0+ZmlsdGVyX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZGVjb2RlZF9mcmFtZSA9IGlzdC0+ZGVjb2RlZF9mcmFtZTsKKyAgICBpZiAoaXN0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGR0cyA9IGF2X3Jlc2NhbGVfcShpc3QtPmR0cywgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7CisgICAgaWYgKHBrdCkgeworICAgICAgICBhdnBrdCA9ICpwa3Q7CisgICAgICAgIGF2cGt0LmR0cyA9IGR0czsgLy8gZmZtcGVnLmMgcHJvYmFibHkgc2hvdWxkbid0IGRvIHRoaXMKKyAgICB9CisKKyAgICAvLyBUaGUgb2xkIGNvZGUgdXNlZCB0byBzZXQgZHRzIG9uIHRoZSBkcmFpbiBwYWNrZXQsIHdoaWNoIGRvZXMgbm90IHdvcmsKKyAgICAvLyB3aXRoIHRoZSBuZXcgQVBJIGFueW1vcmUuCisgICAgaWYgKGVvZikgeworICAgICAgICB2b2lkICpuZXcgPSBhdl9yZWFsbG9jX2FycmF5KGlzdC0+ZHRzX2J1ZmZlciwgaXN0LT5uYl9kdHNfYnVmZmVyICsgMSwgc2l6ZW9mKGlzdC0+ZHRzX2J1ZmZlclswXSkpOworICAgICAgICBpZiAoIW5ldykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlzdC0+ZHRzX2J1ZmZlciA9IG5ldzsKKyAgICAgICAgaXN0LT5kdHNfYnVmZmVyW2lzdC0+bmJfZHRzX2J1ZmZlcisrXSA9IGR0czsKKyAgICB9CisKKyAgICB1cGRhdGVfYmVuY2htYXJrKE5VTEwpOworICAgIHJldCA9IGRlY29kZShpc3QtPmRlY19jdHgsIGRlY29kZWRfZnJhbWUsIGdvdF9vdXRwdXQsIHBrdCA/ICZhdnBrdCA6IE5VTEwpOworICAgIHVwZGF0ZV9iZW5jaG1hcmsoImRlY29kZV92aWRlbyAlZC4lZCIsIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICAqZGVjb2RlX2ZhaWxlZCA9IDE7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgbWF5IGJlIHJlcXVpcmVkIGluIHNvbWUgY2FzZXMgd2hlcmUgdGhlcmUgaXMgbm8gcGFyc2VyCisgICAgLy8gb3IgdGhlIHBhcnNlciBkb2VzIG5vdCBoYXNfYl9mcmFtZXMgY29ycmVjdGx5CisgICAgaWYgKGlzdC0+c3QtPmNvZGVjcGFyLT52aWRlb19kZWxheSA8IGlzdC0+ZGVjX2N0eC0+aGFzX2JfZnJhbWVzKSB7CisgICAgICAgIGlmIChpc3QtPmRlY19jdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgICAgIGlzdC0+c3QtPmNvZGVjcGFyLT52aWRlb19kZWxheSA9IGlzdC0+ZGVjX2N0eC0+aGFzX2JfZnJhbWVzOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhpc3QtPmRlY19jdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJ2aWRlb19kZWxheSBpcyBsYXJnZXIgaW4gZGVjb2RlciB0aGFuIGRlbXV4ZXIgJWQgPiAlZC5cbiIKKyAgICAgICAgICAgICAgICAgICAiSWYgeW91IHdhbnQgdG8gaGVscCwgdXBsb2FkIGEgc2FtcGxlICIKKyAgICAgICAgICAgICAgICAgICAib2YgdGhpcyBmaWxlIHRvIGZ0cDovL3VwbG9hZC5mZm1wZWcub3JnL2luY29taW5nLyAiCisgICAgICAgICAgICAgICAgICAgImFuZCBjb250YWN0IHRoZSBmZm1wZWctZGV2ZWwgbWFpbGluZyBsaXN0LiAoZmZtcGVnLWRldmVsQGZmbXBlZy5vcmcpXG4iLAorICAgICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+aGFzX2JfZnJhbWVzLAorICAgICAgICAgICAgICAgICAgIGlzdC0+c3QtPmNvZGVjcGFyLT52aWRlb19kZWxheSk7CisgICAgfQorCisgICAgaWYgKHJldCAhPSBBVkVSUk9SX0VPRikKKyAgICAgICAgY2hlY2tfZGVjb2RlX3Jlc3VsdChpc3QsIGdvdF9vdXRwdXQsIHJldCk7CisKKyAgICBpZiAoKmdvdF9vdXRwdXQgJiYgcmV0ID49IDApIHsKKyAgICAgICAgaWYgKGlzdC0+ZGVjX2N0eC0+d2lkdGggICE9IGRlY29kZWRfZnJhbWUtPndpZHRoIHx8CisgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmhlaWdodCAhPSBkZWNvZGVkX2ZyYW1lLT5oZWlnaHQgfHwKKyAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+cGl4X2ZtdCAhPSBkZWNvZGVkX2ZyYW1lLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJGcmFtZSBwYXJhbWV0ZXJzIG1pc21hdGNoIGNvbnRleHQgJWQsJWQsJWQgIT0gJWQsJWQsJWRcbiIsCisgICAgICAgICAgICAgICAgZGVjb2RlZF9mcmFtZS0+d2lkdGgsCisgICAgICAgICAgICAgICAgZGVjb2RlZF9mcmFtZS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGRlY29kZWRfZnJhbWUtPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBpc3QtPmRlY19jdHgtPndpZHRoLAorICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+cGl4X2ZtdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoISpnb3Rfb3V0cHV0IHx8IHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZihpc3QtPnRvcF9maWVsZF9maXJzdD49MCkKKyAgICAgICAgZGVjb2RlZF9mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID0gaXN0LT50b3BfZmllbGRfZmlyc3Q7CisKKyAgICBpc3QtPmZyYW1lc19kZWNvZGVkKys7CisKKyAgICBpZiAoaXN0LT5od2FjY2VsX3JldHJpZXZlX2RhdGEgJiYgZGVjb2RlZF9mcmFtZS0+Zm9ybWF0ID09IGlzdC0+aHdhY2NlbF9waXhfZm10KSB7CisgICAgICAgIGVyciA9IGlzdC0+aHdhY2NlbF9yZXRyaWV2ZV9kYXRhKGlzdC0+ZGVjX2N0eCwgZGVjb2RlZF9mcmFtZSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpc3QtPmh3YWNjZWxfcmV0cmlldmVkX3BpeF9mbXQgPSBkZWNvZGVkX2ZyYW1lLT5mb3JtYXQ7CisKKyAgICBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IGRlY29kZWRfZnJhbWUtPmJlc3RfZWZmb3J0X3RpbWVzdGFtcDsKKyAgICAqZHVyYXRpb25fcHRzID0gZGVjb2RlZF9mcmFtZS0+cGt0X2R1cmF0aW9uOworCisgICAgaWYgKGlzdC0+ZnJhbWVyYXRlLm51bSkKKyAgICAgICAgYmVzdF9lZmZvcnRfdGltZXN0YW1wID0gaXN0LT5jZnJfbmV4dF9wdHMrKzsKKworICAgIGlmIChlb2YgJiYgYmVzdF9lZmZvcnRfdGltZXN0YW1wID09IEFWX05PUFRTX1ZBTFVFICYmIGlzdC0+bmJfZHRzX2J1ZmZlciA+IDApIHsKKyAgICAgICAgYmVzdF9lZmZvcnRfdGltZXN0YW1wID0gaXN0LT5kdHNfYnVmZmVyWzBdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3QtPm5iX2R0c19idWZmZXIgLSAxOyBpKyspCisgICAgICAgICAgICBpc3QtPmR0c19idWZmZXJbaV0gPSBpc3QtPmR0c19idWZmZXJbaSArIDFdOworICAgICAgICBpc3QtPm5iX2R0c19idWZmZXItLTsKKyAgICB9CisKKyAgICBpZihiZXN0X2VmZm9ydF90aW1lc3RhbXAgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaW50NjRfdCB0cyA9IGF2X3Jlc2NhbGVfcShkZWNvZGVkX2ZyYW1lLT5wdHMgPSBiZXN0X2VmZm9ydF90aW1lc3RhbXAsIGlzdC0+c3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOworCisgICAgICAgIGlmICh0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIGlzdC0+bmV4dF9wdHMgPSBpc3QtPnB0cyA9IHRzOworICAgIH0KKworICAgIGlmIChkZWJ1Z190cykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJkZWNvZGVyIC0+IGlzdF9pbmRleDolZCB0eXBlOnZpZGVvICIKKyAgICAgICAgICAgICAgICJmcmFtZV9wdHM6JXMgZnJhbWVfcHRzX3RpbWU6JXMgYmVzdF9lZmZvcnRfdHM6JSJQUklkNjQiIGJlc3RfZWZmb3J0X3RzX3RpbWU6JXMga2V5ZnJhbWU6JWQgZnJhbWVfdHlwZTolZCB0aW1lX2Jhc2U6JWQvJWRcbiIsCisgICAgICAgICAgICAgICBpc3QtPnN0LT5pbmRleCwgYXZfdHMyc3RyKGRlY29kZWRfZnJhbWUtPnB0cyksCisgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGRlY29kZWRfZnJhbWUtPnB0cywgJmlzdC0+c3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICBiZXN0X2VmZm9ydF90aW1lc3RhbXAsCisgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGJlc3RfZWZmb3J0X3RpbWVzdGFtcCwgJmlzdC0+c3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICBkZWNvZGVkX2ZyYW1lLT5rZXlfZnJhbWUsIGRlY29kZWRfZnJhbWUtPnBpY3RfdHlwZSwKKyAgICAgICAgICAgICAgIGlzdC0+c3QtPnRpbWVfYmFzZS5udW0sIGlzdC0+c3QtPnRpbWVfYmFzZS5kZW4pOworICAgIH0KKworICAgIGlmIChpc3QtPnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkKKyAgICAgICAgZGVjb2RlZF9mcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGlzdC0+c3QtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICBlcnIgPSBzZW5kX2ZyYW1lX3RvX2ZpbHRlcnMoaXN0LCBkZWNvZGVkX2ZyYW1lKTsKKworZmFpbDoKKyAgICBhdl9mcmFtZV91bnJlZihpc3QtPmZpbHRlcl9mcmFtZSk7CisgICAgYXZfZnJhbWVfdW5yZWYoZGVjb2RlZF9mcmFtZSk7CisgICAgcmV0dXJuIGVyciA8IDAgPyBlcnIgOiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNjb2RlX3N1YnRpdGxlcyhJbnB1dFN0cmVhbSAqaXN0LCBBVlBhY2tldCAqcGt0LCBpbnQgKmdvdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkZWNvZGVfZmFpbGVkKQoreworICAgIEFWU3VidGl0bGUgc3VidGl0bGU7CisgICAgaW50IGZyZWVfc3ViID0gMTsKKyAgICBpbnQgaSwgcmV0ID0gYXZjb2RlY19kZWNvZGVfc3VidGl0bGUyKGlzdC0+ZGVjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJ0aXRsZSwgZ290X291dHB1dCwgcGt0KTsKKworICAgIGNoZWNrX2RlY29kZV9yZXN1bHQoTlVMTCwgZ290X291dHB1dCwgcmV0KTsKKworICAgIGlmIChyZXQgPCAwIHx8ICEqZ290X291dHB1dCkgeworICAgICAgICAqZGVjb2RlX2ZhaWxlZCA9IDE7CisgICAgICAgIGlmICghcGt0LT5zaXplKQorICAgICAgICAgICAgc3ViMnZpZGVvX2ZsdXNoKGlzdCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGlzdC0+Zml4X3N1Yl9kdXJhdGlvbikgeworICAgICAgICBpbnQgZW5kID0gMTsKKyAgICAgICAgaWYgKGlzdC0+cHJldl9zdWIuZ290X291dHB1dCkgeworICAgICAgICAgICAgZW5kID0gYXZfcmVzY2FsZShzdWJ0aXRsZS5wdHMgLSBpc3QtPnByZXZfc3ViLnN1YnRpdGxlLnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCwgQVZfVElNRV9CQVNFKTsKKyAgICAgICAgICAgIGlmIChlbmQgPCBpc3QtPnByZXZfc3ViLnN1YnRpdGxlLmVuZF9kaXNwbGF5X3RpbWUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaXN0LT5kZWNfY3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICJTdWJ0aXRsZSBkdXJhdGlvbiByZWR1Y2VkIGZyb20gJSJQUklkMzIiIHRvICVkJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+cHJldl9zdWIuc3VidGl0bGUuZW5kX2Rpc3BsYXlfdGltZSwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICBlbmQgPD0gMCA/ICIsIGRyb3BwaW5nIGl0IiA6ICIiKTsKKyAgICAgICAgICAgICAgICBpc3QtPnByZXZfc3ViLnN1YnRpdGxlLmVuZF9kaXNwbGF5X3RpbWUgPSBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRkZTV0FQKGludCwgICAgICAgICpnb3Rfb3V0cHV0LCBpc3QtPnByZXZfc3ViLmdvdF9vdXRwdXQpOworICAgICAgICBGRlNXQVAoaW50LCAgICAgICAgcmV0LCAgICAgICAgIGlzdC0+cHJldl9zdWIucmV0KTsKKyAgICAgICAgRkZTV0FQKEFWU3VidGl0bGUsIHN1YnRpdGxlLCAgICBpc3QtPnByZXZfc3ViLnN1YnRpdGxlKTsKKyAgICAgICAgaWYgKGVuZCA8PSAwKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKCEqZ290X291dHB1dCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChpc3QtPnN1YjJ2aWRlby5mcmFtZSkgeworICAgICAgICBzdWIydmlkZW9fdXBkYXRlKGlzdCwgJnN1YnRpdGxlKTsKKyAgICB9IGVsc2UgaWYgKGlzdC0+bmJfZmlsdGVycykgeworICAgICAgICBpZiAoIWlzdC0+c3ViMnZpZGVvLnN1Yl9xdWV1ZSkKKyAgICAgICAgICAgIGlzdC0+c3ViMnZpZGVvLnN1Yl9xdWV1ZSA9IGF2X2ZpZm9fYWxsb2MoOCAqIHNpemVvZihBVlN1YnRpdGxlKSk7CisgICAgICAgIGlmICghaXN0LT5zdWIydmlkZW8uc3ViX3F1ZXVlKQorICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICBpZiAoIWF2X2ZpZm9fc3BhY2UoaXN0LT5zdWIydmlkZW8uc3ViX3F1ZXVlKSkgeworICAgICAgICAgICAgcmV0ID0gYXZfZmlmb19yZWFsbG9jMihpc3QtPnN1YjJ2aWRlby5zdWJfcXVldWUsIDIgKiBhdl9maWZvX3NpemUoaXN0LT5zdWIydmlkZW8uc3ViX3F1ZXVlKSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGlzdC0+c3ViMnZpZGVvLnN1Yl9xdWV1ZSwgJnN1YnRpdGxlLCBzaXplb2Yoc3VidGl0bGUpLCBOVUxMKTsKKyAgICAgICAgZnJlZV9zdWIgPSAwOworICAgIH0KKworICAgIGlmICghc3VidGl0bGUubnVtX3JlY3RzKQorICAgICAgICBnb3RvIG91dDsKKworICAgIGlzdC0+ZnJhbWVzX2RlY29kZWQrKzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gb3V0cHV0X3N0cmVhbXNbaV07CisKKyAgICAgICAgaWYgKCFjaGVja19vdXRwdXRfY29uc3RyYWludHMoaXN0LCBvc3QpIHx8ICFvc3QtPmVuY29kaW5nX25lZWRlZAorICAgICAgICAgICAgfHwgb3N0LT5lbmMtPnR5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZG9fc3VidGl0bGVfb3V0KG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdLCBvc3QsICZzdWJ0aXRsZSk7CisgICAgfQorCitvdXQ6CisgICAgaWYgKGZyZWVfc3ViKQorICAgICAgICBhdnN1YnRpdGxlX2ZyZWUoJnN1YnRpdGxlKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlbmRfZmlsdGVyX2VvZihJbnB1dFN0cmVhbSAqaXN0KQoreworICAgIGludCBpLCByZXQ7CisgICAgLyogVE9ETyBrZWVwIHB0cyBhbHNvIGluIHN0cmVhbSB0aW1lIGJhc2UgdG8gYXZvaWQgY29udmVydGluZyBiYWNrICovCisgICAgaW50NjRfdCBwdHMgPSBhdl9yZXNjYWxlX3Ffcm5kKGlzdC0+cHRzLCBBVl9USU1FX0JBU0VfUSwgaXN0LT5zdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9ORUFSX0lORiB8IEFWX1JPVU5EX1BBU1NfTUlOTUFYKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpc3QtPm5iX2ZpbHRlcnM7IGkrKykgeworICAgICAgICByZXQgPSBpZmlsdGVyX3NlbmRfZW9mKGlzdC0+ZmlsdGVyc1tpXSwgcHRzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogcGt0ID0gTlVMTCBtZWFucyBFT0YgKG5lZWRlZCB0byBmbHVzaCBkZWNvZGVyIGJ1ZmZlcnMpICovCitzdGF0aWMgaW50IHByb2Nlc3NfaW5wdXRfcGFja2V0KElucHV0U3RyZWFtICppc3QsIGNvbnN0IEFWUGFja2V0ICpwa3QsIGludCBub19lb2YpCit7CisgICAgaW50IHJldCA9IDAsIGk7CisgICAgaW50IHJlcGVhdGluZyA9IDA7CisgICAgaW50IGVvZl9yZWFjaGVkID0gMDsKKworICAgIEFWUGFja2V0IGF2cGt0OworICAgIGlmICghaXN0LT5zYXdfZmlyc3RfdHMpIHsKKyAgICAgICAgaXN0LT5kdHMgPSBpc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gPyAtIGlzdC0+ZGVjX2N0eC0+aGFzX2JfZnJhbWVzICogQVZfVElNRV9CQVNFIC8gYXZfcTJkKGlzdC0+c3QtPmF2Z19mcmFtZV9yYXRlKSA6IDA7CisgICAgICAgIGlzdC0+cHRzID0gMDsKKyAgICAgICAgaWYgKHBrdCAmJiBwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiAhaXN0LT5kZWNvZGluZ19uZWVkZWQpIHsKKyAgICAgICAgICAgIGlzdC0+ZHRzICs9IGF2X3Jlc2NhbGVfcShwa3QtPnB0cywgaXN0LT5zdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICBpc3QtPnB0cyA9IGlzdC0+ZHRzOyAvL3VudXNlZCBidXQgYmV0dGVyIHRvIHNldCBpdCB0byBhIHZhbHVlIHRoYXRzIG5vdCB0b3RhbGx5IHdyb25nCisgICAgICAgIH0KKyAgICAgICAgaXN0LT5zYXdfZmlyc3RfdHMgPSAxOworICAgIH0KKworICAgIGlmIChpc3QtPm5leHRfZHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBpc3QtPm5leHRfZHRzID0gaXN0LT5kdHM7CisgICAgaWYgKGlzdC0+bmV4dF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGlzdC0+bmV4dF9wdHMgPSBpc3QtPnB0czsKKworICAgIGlmICghcGt0KSB7CisgICAgICAgIC8qIEVPRiBoYW5kbGluZyAqLworICAgICAgICBhdl9pbml0X3BhY2tldCgmYXZwa3QpOworICAgICAgICBhdnBrdC5kYXRhID0gTlVMTDsKKyAgICAgICAgYXZwa3Quc2l6ZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZwa3QgPSAqcGt0OworICAgIH0KKworICAgIGlmIChwa3QgJiYgcGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaXN0LT5uZXh0X2R0cyA9IGlzdC0+ZHRzID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgaWYgKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gfHwgIWlzdC0+ZGVjb2RpbmdfbmVlZGVkKQorICAgICAgICAgICAgaXN0LT5uZXh0X3B0cyA9IGlzdC0+cHRzID0gaXN0LT5kdHM7CisgICAgfQorCisgICAgLy8gd2hpbGUgd2UgaGF2ZSBtb3JlIHRvIGRlY29kZSBvciB3aGlsZSB0aGUgZGVjb2RlciBkaWQgb3V0cHV0IHNvbWV0aGluZyBvbiBFT0YKKyAgICB3aGlsZSAoaXN0LT5kZWNvZGluZ19uZWVkZWQpIHsKKyAgICAgICAgaW50NjRfdCBkdXJhdGlvbl9kdHMgPSAwOworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uX3B0cyA9IDA7CisgICAgICAgIGludCBnb3Rfb3V0cHV0ID0gMDsKKyAgICAgICAgaW50IGRlY29kZV9mYWlsZWQgPSAwOworCisgICAgICAgIGlzdC0+cHRzID0gaXN0LT5uZXh0X3B0czsKKyAgICAgICAgaXN0LT5kdHMgPSBpc3QtPm5leHRfZHRzOworCisgICAgICAgIHN3aXRjaCAoaXN0LT5kZWNfY3R4LT5jb2RlY190eXBlKSB7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2F1ZGlvICAgIChpc3QsIHJlcGVhdGluZyA/IE5VTEwgOiAmYXZwa3QsICZnb3Rfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVjb2RlX2ZhaWxlZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfdmlkZW8gICAgKGlzdCwgcmVwZWF0aW5nID8gTlVMTCA6ICZhdnBrdCwgJmdvdF9vdXRwdXQsICZkdXJhdGlvbl9wdHMsICFwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZWNvZGVfZmFpbGVkKTsKKyAgICAgICAgICAgIGlmICghcmVwZWF0aW5nIHx8ICFwa3QgfHwgZ290X291dHB1dCkgeworICAgICAgICAgICAgICAgIGlmIChwa3QgJiYgcGt0LT5kdXJhdGlvbikgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9kdHMgPSBhdl9yZXNjYWxlX3EocGt0LT5kdXJhdGlvbiwgaXN0LT5zdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmKGlzdC0+ZGVjX2N0eC0+ZnJhbWVyYXRlLm51bSAhPSAwICYmIGlzdC0+ZGVjX2N0eC0+ZnJhbWVyYXRlLmRlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB0aWNrcz0gYXZfc3RyZWFtX2dldF9wYXJzZXIoaXN0LT5zdCkgPyBhdl9zdHJlYW1fZ2V0X3BhcnNlcihpc3QtPnN0KS0+cmVwZWF0X3BpY3QrMSA6IGlzdC0+ZGVjX2N0eC0+dGlja3NfcGVyX2ZyYW1lOworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9kdHMgPSAoKGludDY0X3QpQVZfVElNRV9CQVNFICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+ZnJhbWVyYXRlLmRlbiAqIHRpY2tzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmZyYW1lcmF0ZS5udW0gLyBpc3QtPmRlY19jdHgtPnRpY2tzX3Blcl9mcmFtZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZihpc3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBkdXJhdGlvbl9kdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaXN0LT5uZXh0X2R0cyArPSBkdXJhdGlvbl9kdHM7CisgICAgICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICAgICAgaXN0LT5uZXh0X2R0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZ290X291dHB1dCkgeworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvbl9wdHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlzdC0+bmV4dF9wdHMgKz0gYXZfcmVzY2FsZV9xKGR1cmF0aW9uX3B0cywgaXN0LT5zdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaXN0LT5uZXh0X3B0cyArPSBkdXJhdGlvbl9kdHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgICAgICAgICAgaWYgKHJlcGVhdGluZykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldCA9IHRyYW5zY29kZV9zdWJ0aXRsZXMoaXN0LCAmYXZwa3QsICZnb3Rfb3V0cHV0LCAmZGVjb2RlX2ZhaWxlZCk7CisgICAgICAgICAgICBpZiAoIXBrdCAmJiByZXQgPj0gMCkKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0VPRjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgZW9mX3JlYWNoZWQgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKGRlY29kZV9mYWlsZWQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hpbGUgZGVjb2Rpbmcgc3RyZWFtICMlZDolZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJFcnJvciB3aGlsZSBwcm9jZXNzaW5nIHRoZSBkZWNvZGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImRhdGEgZm9yIHN0cmVhbSAjJWQ6JWRcbiIsIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZWNvZGVfZmFpbGVkIHx8IGV4aXRfb25fZXJyb3IpCisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ290X291dHB1dCkKKyAgICAgICAgICAgIGlzdC0+Z290X291dHB1dCA9IDE7CisKKyAgICAgICAgaWYgKCFnb3Rfb3V0cHV0KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gRHVyaW5nIGRyYWluaW5nLCB3ZSBtaWdodCBnZXQgbXVsdGlwbGUgb3V0cHV0IGZyYW1lcyBpbiB0aGlzIGxvb3AuCisgICAgICAgIC8vIGZmbXBlZy5jIGRvZXMgbm90IGRyYWluIHRoZSBmaWx0ZXIgY2hhaW4gb24gY29uZmlndXJhdGlvbiBjaGFuZ2VzLAorICAgICAgICAvLyB3aGljaCBtZWFucyBpZiB3ZSBzZW5kIG11bHRpcGxlIGZyYW1lcyBhdCBvbmNlIHRvIHRoZSBmaWx0ZXJzLCBhbmQKKyAgICAgICAgLy8gb25lIG9mIHRob3NlIGZyYW1lcyBjaGFuZ2VzIGNvbmZpZ3VyYXRpb24sIHRoZSBidWZmZXJlZCBmcmFtZXMgd2lsbAorICAgICAgICAvLyBiZSBsb3N0LiBUaGlzIGNhbiB1cHNldCBjZXJ0YWluIEZBVEUgdGVzdHMuCisgICAgICAgIC8vIERlY29kZSBvbmx5IDEgZnJhbWUgcGVyIGNhbGwgb24gRU9GIHRvIGFwcGVhc2UgdGhlc2UgRkFURSB0ZXN0cy4KKyAgICAgICAgLy8gVGhlIGlkZWFsIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHJld3JpdGUgZGVjb2RpbmcgdG8gdXNlIHRoZSBuZXcKKyAgICAgICAgLy8gZGVjb2RpbmcgQVBJIGluIGEgYmV0dGVyIHdheS4KKyAgICAgICAgaWYgKCFwa3QpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICByZXBlYXRpbmcgPSAxOworICAgIH0KKworICAgIC8qIGFmdGVyIGZsdXNoaW5nLCBzZW5kIGFuIEVPRiBvbiBhbGwgdGhlIGZpbHRlciBpbnB1dHMgYXR0YWNoZWQgdG8gdGhlIHN0cmVhbSAqLworICAgIC8qIGV4Y2VwdCB3aGVuIGxvb3Bpbmcgd2UgbmVlZCB0byBmbHVzaCBidXQgbm90IHRvIHNlbmQgYW4gRU9GICovCisgICAgaWYgKCFwa3QgJiYgaXN0LT5kZWNvZGluZ19uZWVkZWQgJiYgZW9mX3JlYWNoZWQgJiYgIW5vX2VvZikgeworICAgICAgICBpbnQgcmV0ID0gc2VuZF9maWx0ZXJfZW9mKGlzdCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRXJyb3IgbWFya2luZyBmaWx0ZXJzIGFzIGZpbmlzaGVkXG4iKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGhhbmRsZSBzdHJlYW0gY29weSAqLworICAgIGlmICghaXN0LT5kZWNvZGluZ19uZWVkZWQgJiYgcGt0KSB7CisgICAgICAgIGlzdC0+ZHRzID0gaXN0LT5uZXh0X2R0czsKKyAgICAgICAgc3dpdGNoIChpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICBpZiAoaXN0LT5kZWNfY3R4LT5zYW1wbGVfcmF0ZSkgeworICAgICAgICAgICAgICAgIGlzdC0+bmV4dF9kdHMgKz0gKChpbnQ2NF90KUFWX1RJTUVfQkFTRSAqIGlzdC0+ZGVjX2N0eC0+ZnJhbWVfc2l6ZSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzdC0+bmV4dF9kdHMgKz0gYXZfcmVzY2FsZV9xKHBrdC0+ZHVyYXRpb24sIGlzdC0+c3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgaWYgKGlzdC0+ZnJhbWVyYXRlLm51bSkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB3b3JrLWFyb3VuZCBmb3IgYzk5LXRvLWM4OSBpc3N1ZSA3CisgICAgICAgICAgICAgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2VfcSA9IEFWX1RJTUVfQkFTRV9ROworICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dF9kdHMgPSBhdl9yZXNjYWxlX3EoaXN0LT5uZXh0X2R0cywgdGltZV9iYXNlX3EsIGF2X2ludl9xKGlzdC0+ZnJhbWVyYXRlKSk7CisgICAgICAgICAgICAgICAgaXN0LT5uZXh0X2R0cyA9IGF2X3Jlc2NhbGVfcShuZXh0X2R0cyArIDEsIGF2X2ludl9xKGlzdC0+ZnJhbWVyYXRlKSwgdGltZV9iYXNlX3EpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwa3QtPmR1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgaXN0LT5uZXh0X2R0cyArPSBhdl9yZXNjYWxlX3EocGt0LT5kdXJhdGlvbiwgaXN0LT5zdC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgICAgICB9IGVsc2UgaWYoaXN0LT5kZWNfY3R4LT5mcmFtZXJhdGUubnVtICE9IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgdGlja3M9IGF2X3N0cmVhbV9nZXRfcGFyc2VyKGlzdC0+c3QpID8gYXZfc3RyZWFtX2dldF9wYXJzZXIoaXN0LT5zdCktPnJlcGVhdF9waWN0ICsgMSA6IGlzdC0+ZGVjX2N0eC0+dGlja3NfcGVyX2ZyYW1lOworICAgICAgICAgICAgICAgIGlzdC0+bmV4dF9kdHMgKz0gKChpbnQ2NF90KUFWX1RJTUVfQkFTRSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5kZWNfY3R4LT5mcmFtZXJhdGUuZGVuICogdGlja3MpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmZyYW1lcmF0ZS5udW0gLyBpc3QtPmRlY19jdHgtPnRpY2tzX3Blcl9mcmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlzdC0+cHRzID0gaXN0LT5kdHM7CisgICAgICAgIGlzdC0+bmV4dF9wdHMgPSBpc3QtPm5leHRfZHRzOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOworCisgICAgICAgIGlmICghY2hlY2tfb3V0cHV0X2NvbnN0cmFpbnRzKGlzdCwgb3N0KSB8fCBvc3QtPmVuY29kaW5nX25lZWRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGRvX3N0cmVhbWNvcHkoaXN0LCBvc3QsIHBrdCk7CisgICAgfQorCisgICAgcmV0dXJuICFlb2ZfcmVhY2hlZDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2RwKHZvaWQpCit7CisgICAgY2hhciBzZHBbMTYzODRdOworICAgIGludCBpOworICAgIGludCBqOworICAgIEFWSU9Db250ZXh0ICpzZHBfcGI7CisgICAgQVZGb3JtYXRDb250ZXh0ICoqYXZjOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9maWxlczsgaSsrKSB7CisgICAgICAgIGlmICghb3V0cHV0X2ZpbGVzW2ldLT5oZWFkZXJfd3JpdHRlbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdmMgPSBhdl9tYWxsb2NfYXJyYXkobmJfb3V0cHV0X2ZpbGVzLCBzaXplb2YoKmF2YykpOworICAgIGlmICghYXZjKQorICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCBuYl9vdXRwdXRfZmlsZXM7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcChvdXRwdXRfZmlsZXNbaV0tPmN0eC0+b2Zvcm1hdC0+bmFtZSwgInJ0cCIpKSB7CisgICAgICAgICAgICBhdmNbal0gPSBvdXRwdXRfZmlsZXNbaV0tPmN0eDsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghaikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYXZfc2RwX2NyZWF0ZShhdmMsIGosIHNkcCwgc2l6ZW9mKHNkcCkpOworCisgICAgaWYgKCFzZHBfZmlsZW5hbWUpIHsKKyAgICAgICAgcHJpbnRmKCJTRFA6XG4lc1xuIiwgc2RwKTsKKyAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGF2aW9fb3BlbjIoJnNkcF9wYiwgc2RwX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZpbnRfY2IsIE5VTEwpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIHNkcCBmaWxlICclcydcbiIsIHNkcF9maWxlbmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihzZHBfcGIsICJTRFA6XG4lcyIsIHNkcCk7CisgICAgICAgICAgICBhdmlvX2Nsb3NlcCgmc2RwX3BiKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzZHBfZmlsZW5hbWUpOworICAgICAgICB9CisgICAgfQorCitmYWlsOgorICAgIGF2X2ZyZWVwKCZhdmMpOworfQorCitzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGdldF9mb3JtYXQoQVZDb2RlY0NvbnRleHQgKnMsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdHMpCit7CisgICAgSW5wdXRTdHJlYW0gKmlzdCA9IHMtPm9wYXF1ZTsKKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnA7CisgICAgaW50IHJldDsKKworICAgIGZvciAocCA9IHBpeF9mbXRzOyAqcCAhPSBBVl9QSVhfRk1UX05PTkU7IHArKykgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KCpwKTsKKyAgICAgICAgY29uc3QgQVZDb2RlY0hXQ29uZmlnICAqY29uZmlnID0gTlVMTDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoaXN0LT5od2FjY2VsX2lkID09IEhXQUNDRUxfR0VORVJJQyB8fAorICAgICAgICAgICAgaXN0LT5od2FjY2VsX2lkID09IEhXQUNDRUxfQVVUTykgeworICAgICAgICAgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IGF2Y29kZWNfZ2V0X2h3X2NvbmZpZyhzLT5jb2RlYywgaSk7CisgICAgICAgICAgICAgICAgaWYgKCFjb25maWcpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICghKGNvbmZpZy0+bWV0aG9kcyAmCisgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9IV19ERVZJQ0VfQ1RYKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+cGl4X2ZtdCA9PSAqcCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZykgeworICAgICAgICAgICAgaWYgKGNvbmZpZy0+ZGV2aWNlX3R5cGUgIT0gaXN0LT5od2FjY2VsX2RldmljZV90eXBlKSB7CisgICAgICAgICAgICAgICAgLy8gRGlmZmVyZW50IGh3YWNjZWwgb2ZmZXJlZCwgaWdub3JlLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBod2FjY2VsX2RlY29kZV9pbml0KHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaXN0LT5od2FjY2VsX2lkID09IEhXQUNDRUxfR0VORVJJQykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIGh3YWNjZWwgcmVxdWVzdGVkIGZvciBpbnB1dCBzdHJlYW0gIyVkOiVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9od2RldmljZV9nZXRfdHlwZV9uYW1lKGNvbmZpZy0+ZGV2aWNlX3R5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgSFdBY2NlbCAqaHdhY2NlbCA9IE5VTEw7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGh3YWNjZWxzW2ldLm5hbWU7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChod2FjY2Vsc1tpXS5waXhfZm10ID09ICpwKSB7CisgICAgICAgICAgICAgICAgICAgIGh3YWNjZWwgPSAmaHdhY2NlbHNbaV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaHdhY2NlbCkgeworICAgICAgICAgICAgICAgIC8vIE5vIGh3YWNjZWwgc3VwcG9ydGluZyB0aGlzIHBpeGZtdC4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChod2FjY2VsLT5pZCAhPSBpc3QtPmh3YWNjZWxfaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBEb2VzIG5vdCBtYXRjaCByZXF1ZXN0ZWQgaHdhY2NlbC4KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gaHdhY2NlbC0+aW5pdChzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzIGh3YWNjZWwgcmVxdWVzdGVkIGZvciBpbnB1dCBzdHJlYW0gIyVkOiVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJidXQgY2Fubm90IGJlIGluaXRpYWxpemVkLlxuIiwgaHdhY2NlbC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc3QtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgICAgIHMtPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKGlzdC0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICBpZiAoIXMtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKKyAgICAgICAgfQorCisgICAgICAgIGlzdC0+aHdhY2NlbF9waXhfZm10ID0gKnA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAqcDsKK30KKworc3RhdGljIGludCBnZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKQoreworICAgIElucHV0U3RyZWFtICppc3QgPSBzLT5vcGFxdWU7CisKKyAgICBpZiAoaXN0LT5od2FjY2VsX2dldF9idWZmZXIgJiYgZnJhbWUtPmZvcm1hdCA9PSBpc3QtPmh3YWNjZWxfcGl4X2ZtdCkKKyAgICAgICAgcmV0dXJuIGlzdC0+aHdhY2NlbF9nZXRfYnVmZmVyKHMsIGZyYW1lLCBmbGFncyk7CisKKyAgICByZXR1cm4gYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIyKHMsIGZyYW1lLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbnB1dF9zdHJlYW0oaW50IGlzdF9pbmRleCwgY2hhciAqZXJyb3IsIGludCBlcnJvcl9sZW4pCit7CisgICAgaW50IHJldDsKKyAgICBJbnB1dFN0cmVhbSAqaXN0ID0gaW5wdXRfc3RyZWFtc1tpc3RfaW5kZXhdOworCisgICAgaWYgKGlzdC0+ZGVjb2RpbmdfbmVlZGVkKSB7CisgICAgICAgIEFWQ29kZWMgKmNvZGVjID0gaXN0LT5kZWM7CisgICAgICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGVycm9yLCBlcnJvcl9sZW4sICJEZWNvZGVyIChjb2RlYyAlcykgbm90IGZvdW5kIGZvciBpbnB1dCBzdHJlYW0gIyVkOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShpc3QtPmRlY19jdHgtPmNvZGVjX2lkKSwgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaXN0LT5kZWNfY3R4LT5vcGFxdWUgICAgICAgICAgICAgICAgPSBpc3Q7CisgICAgICAgIGlzdC0+ZGVjX2N0eC0+Z2V0X2Zvcm1hdCAgICAgICAgICAgID0gZ2V0X2Zvcm1hdDsKKyAgICAgICAgaXN0LT5kZWNfY3R4LT5nZXRfYnVmZmVyMiAgICAgICAgICAgPSBnZXRfYnVmZmVyOworICAgICAgICBpc3QtPmRlY19jdHgtPnRocmVhZF9zYWZlX2NhbGxiYWNrcyA9IDE7CisKKyAgICAgICAgYXZfb3B0X3NldF9pbnQoaXN0LT5kZWNfY3R4LCAicmVmY291bnRlZF9mcmFtZXMiLCAxLCAwKTsKKyAgICAgICAgaWYgKGlzdC0+ZGVjX2N0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFICYmCisgICAgICAgICAgIChpc3QtPmRlY29kaW5nX25lZWRlZCAmIERFQ09ESU5HX0ZPUl9PU1QpKSB7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmaXN0LT5kZWNvZGVyX29wdHMsICJjb21wdXRlX2VkdCIsICIxIiwgQVZfRElDVF9ET05UX09WRVJXUklURSk7CisgICAgICAgICAgICBpZiAoaXN0LT5kZWNvZGluZ19uZWVkZWQgJiBERUNPRElOR19GT1JfRklMVEVSKQorICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIldhcm5pbmcgdXNpbmcgRFZCIHN1YnRpdGxlcyBmb3IgZmlsdGVyaW5nIGFuZCBvdXRwdXQgYXQgdGhlIHNhbWUgdGltZSBpcyBub3QgZnVsbHkgc3VwcG9ydGVkLCBhbHNvIHNlZSAtY29tcHV0ZV9lZHQgWzB8MV1cbiIpOworICAgICAgICB9CisKKyAgICAgICAgYXZfZGljdF9zZXQoJmlzdC0+ZGVjb2Rlcl9vcHRzLCAic3ViX3RleHRfZm9ybWF0IiwgImFzcyIsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOworCisgICAgICAgIC8qIFVzZWZ1bCBmb3Igc3VidGl0bGVzIHJldGltaW5nIGJ5IGxhdmYgKEZJWE1FKSwgc2tpcHBpbmcgc2FtcGxlcyBpbgorICAgICAgICAgKiBhdWRpbywgYW5kIHZpZGVvIGRlY29kZXJzIHN1Y2ggYXMgY3V2aWQgb3IgbWVkaWFjb2RlYyAqLworICAgICAgICBpc3QtPmRlY19jdHgtPnBrdF90aW1lYmFzZSA9IGlzdC0+c3QtPnRpbWVfYmFzZTsKKworICAgICAgICBpZiAoIWF2X2RpY3RfZ2V0KGlzdC0+ZGVjb2Rlcl9vcHRzLCAidGhyZWFkcyIsIE5VTEwsIDApKQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJmlzdC0+ZGVjb2Rlcl9vcHRzLCAidGhyZWFkcyIsICJhdXRvIiwgMCk7CisgICAgICAgIC8qIEF0dGFjaGVkIHBpY3MgYXJlIHNwYXJzZSwgdGhlcmVmb3JlIHdlIHdvdWxkIG5vdCB3YW50IHRvIGRlbGF5IHRoZWlyIGRlY29kaW5nIHRpbGwgRU9GLiAqLworICAgICAgICBpZiAoaXN0LT5zdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmaXN0LT5kZWNvZGVyX29wdHMsICJ0aHJlYWRzIiwgIjEiLCAwKTsKKworICAgICAgICByZXQgPSBod19kZXZpY2Vfc2V0dXBfZm9yX2RlY29kZShpc3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgc25wcmludGYoZXJyb3IsIGVycm9yX2xlbiwgIkRldmljZSBzZXR1cCBmYWlsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICJkZWNvZGVyIG9uIGlucHV0IHN0cmVhbSAjJWQ6JWQgOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4LCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gYXZjb2RlY19vcGVuMihpc3QtPmRlY19jdHgsIGNvZGVjLCAmaXN0LT5kZWNvZGVyX29wdHMpKSA8IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FWFBFUklNRU5UQUwpCisgICAgICAgICAgICAgICAgYWJvcnRfY29kZWNfZXhwZXJpbWVudGFsKGNvZGVjLCAwKTsKKworICAgICAgICAgICAgc25wcmludGYoZXJyb3IsIGVycm9yX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSBvcGVuaW5nIGRlY29kZXIgZm9yIGlucHV0IHN0cmVhbSAiCisgICAgICAgICAgICAgICAgICAgICAiIyVkOiVkIDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0X2F2b3B0aW9ucyhpc3QtPmRlY29kZXJfb3B0cyk7CisgICAgfQorCisgICAgaXN0LT5uZXh0X3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIGlzdC0+bmV4dF9kdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgSW5wdXRTdHJlYW0gKmdldF9pbnB1dF9zdHJlYW0oT3V0cHV0U3RyZWFtICpvc3QpCit7CisgICAgaWYgKG9zdC0+c291cmNlX2luZGV4ID49IDApCisgICAgICAgIHJldHVybiBpbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBjb21wYXJlX2ludDY0KGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgcmV0dXJuIEZGRElGRlNJR04oKihjb25zdCBpbnQ2NF90ICopYSwgKihjb25zdCBpbnQ2NF90ICopYik7Cit9CisKKy8qIG9wZW4gdGhlIG11eGVyIHdoZW4gYWxsIHRoZSBzdHJlYW1zIGFyZSBpbml0aWFsaXplZCAqLworc3RhdGljIGludCBjaGVja19pbml0X291dHB1dF9maWxlKE91dHB1dEZpbGUgKm9mLCBpbnQgZmlsZV9pbmRleCkKK3sKKyAgICBpbnQgcmV0LCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG9mLT5jdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCA9IG91dHB1dF9zdHJlYW1zW29mLT5vc3RfaW5kZXggKyBpXTsKKyAgICAgICAgaWYgKCFvc3QtPmluaXRpYWxpemVkKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgb2YtPmN0eC0+aW50ZXJydXB0X2NhbGxiYWNrID0gaW50X2NiOworCisgICAgcmV0ID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKG9mLT5jdHgsICZvZi0+b3B0cyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDb3VsZCBub3Qgd3JpdGUgaGVhZGVyIGZvciBvdXRwdXQgZmlsZSAjJWQgIgorICAgICAgICAgICAgICAgIihpbmNvcnJlY3QgY29kZWMgcGFyYW1ldGVycyA/KTogJXNcbiIsCisgICAgICAgICAgICAgICBmaWxlX2luZGV4LCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICAvL2Fzc2VydF9hdm9wdGlvbnMob2YtPm9wdHMpOworICAgIG9mLT5oZWFkZXJfd3JpdHRlbiA9IDE7CisKKyAgICBhdl9kdW1wX2Zvcm1hdChvZi0+Y3R4LCBmaWxlX2luZGV4LCBvZi0+Y3R4LT51cmwsIDEpOworCisgICAgaWYgKHNkcF9maWxlbmFtZSB8fCB3YW50X3NkcCkKKyAgICAgICAgcHJpbnRfc2RwKCk7CisKKyAgICAvKiBmbHVzaCB0aGUgbXV4aW5nIHF1ZXVlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBvZi0+Y3R4LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tvZi0+b3N0X2luZGV4ICsgaV07CisKKyAgICAgICAgLyogdHJ5IHRvIGltcHJvdmUgbXV4aW5nIHRpbWVfYmFzZSAob25seSBwb3NzaWJsZSBpZiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0KSAqLworICAgICAgICBpZiAoIWF2X2ZpZm9fc2l6ZShvc3QtPm11eGluZ19xdWV1ZSkpCisgICAgICAgICAgICBvc3QtPm11eF90aW1lYmFzZSA9IG9zdC0+c3QtPnRpbWVfYmFzZTsKKworICAgICAgICB3aGlsZSAoYXZfZmlmb19zaXplKG9zdC0+bXV4aW5nX3F1ZXVlKSkgeworICAgICAgICAgICAgQVZQYWNrZXQgcGt0OworICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQob3N0LT5tdXhpbmdfcXVldWUsICZwa3QsIHNpemVvZihwa3QpLCBOVUxMKTsKKyAgICAgICAgICAgIHdyaXRlX3BhY2tldChvZiwgJnBrdCwgb3N0LCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfb3V0cHV0X2JzZnMoT3V0cHV0U3RyZWFtICpvc3QpCit7CisgICAgQVZCU0ZDb250ZXh0ICpjdHg7CisgICAgaW50IGksIHJldDsKKworICAgIGlmICghb3N0LT5uYl9iaXRzdHJlYW1fZmlsdGVycykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3N0LT5uYl9iaXRzdHJlYW1fZmlsdGVyczsgaSsrKSB7CisgICAgICAgIGN0eCA9IG9zdC0+YnNmX2N0eFtpXTsKKworICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShjdHgtPnBhcl9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA/IG9zdC0+YnNmX2N0eFtpIC0gMV0tPnBhcl9vdXQgOiBvc3QtPnN0LT5jb2RlY3Bhcik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBjdHgtPnRpbWVfYmFzZV9pbiA9IGkgPyBvc3QtPmJzZl9jdHhbaSAtIDFdLT50aW1lX2Jhc2Vfb3V0IDogb3N0LT5zdC0+dGltZV9iYXNlOworCisgICAgICAgIHJldCA9IGF2X2JzZl9pbml0KGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIGJpdHN0cmVhbSBmaWx0ZXI6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIG9zdC0+YnNmX2N0eFtpXS0+ZmlsdGVyLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdHggPSBvc3QtPmJzZl9jdHhbb3N0LT5uYl9iaXRzdHJlYW1fZmlsdGVycyAtIDFdOworICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KG9zdC0+c3QtPmNvZGVjcGFyLCBjdHgtPnBhcl9vdXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgb3N0LT5zdC0+dGltZV9iYXNlID0gY3R4LT50aW1lX2Jhc2Vfb3V0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9vdXRwdXRfc3RyZWFtX3N0cmVhbWNvcHkoT3V0cHV0U3RyZWFtICpvc3QpCit7CisgICAgT3V0cHV0RmlsZSAqb2YgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKKyAgICBJbnB1dFN0cmVhbSAqaXN0ID0gZ2V0X2lucHV0X3N0cmVhbShvc3QpOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXJfZHN0ID0gb3N0LT5zdC0+Y29kZWNwYXI7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcl9zcmMgPSBvc3QtPnJlZl9wYXI7CisgICAgQVZSYXRpb25hbCBzYXI7CisgICAgaW50IGksIHJldDsKKyAgICB1aW50MzJfdCBjb2RlY190YWcgPSBwYXJfZHN0LT5jb2RlY190YWc7CisKKyAgICBhdl9hc3NlcnQwKGlzdCAmJiAhb3N0LT5maWx0ZXIpOworCisgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQob3N0LT5lbmNfY3R4LCBpc3QtPnN0LT5jb2RlY3Bhcik7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICByZXQgPSBhdl9vcHRfc2V0X2RpY3Qob3N0LT5lbmNfY3R4LCAmb3N0LT5lbmNvZGVyX29wdHMpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCisgICAgICAgICAgICAgICAiRXJyb3Igc2V0dGluZyB1cCBjb2RlYyBjb250ZXh0IG9wdGlvbnMuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2Zyb21fY29udGV4dChwYXJfc3JjLCBvc3QtPmVuY19jdHgpOworCisgICAgaWYgKCFjb2RlY190YWcpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGNvZGVjX3RhZ190bXA7CisgICAgICAgIGlmICghb2YtPmN0eC0+b2Zvcm1hdC0+Y29kZWNfdGFnIHx8CisgICAgICAgICAgICBhdl9jb2RlY19nZXRfaWQgKG9mLT5jdHgtPm9mb3JtYXQtPmNvZGVjX3RhZywgcGFyX3NyYy0+Y29kZWNfdGFnKSA9PSBwYXJfc3JjLT5jb2RlY19pZCB8fAorICAgICAgICAgICAgIWF2X2NvZGVjX2dldF90YWcyKG9mLT5jdHgtPm9mb3JtYXQtPmNvZGVjX3RhZywgcGFyX3NyYy0+Y29kZWNfaWQsICZjb2RlY190YWdfdG1wKSkKKyAgICAgICAgICAgIGNvZGVjX3RhZyA9IHBhcl9zcmMtPmNvZGVjX3RhZzsKKyAgICB9CisKKyAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShwYXJfZHN0LCBwYXJfc3JjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBhcl9kc3QtPmNvZGVjX3RhZyA9IGNvZGVjX3RhZzsKKworICAgIGlmICghb3N0LT5mcmFtZV9yYXRlLm51bSkKKyAgICAgICAgb3N0LT5mcmFtZV9yYXRlID0gaXN0LT5mcmFtZXJhdGU7CisgICAgb3N0LT5zdC0+YXZnX2ZyYW1lX3JhdGUgPSBvc3QtPmZyYW1lX3JhdGU7CisKKyAgICByZXQgPSBhdmZvcm1hdF90cmFuc2Zlcl9pbnRlcm5hbF9zdHJlYW1fdGltaW5nX2luZm8ob2YtPmN0eC0+b2Zvcm1hdCwgb3N0LT5zdCwgaXN0LT5zdCwgY29weV90Yik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvLyBjb3B5IHRpbWViYXNlIHdoaWxlIHJlbW92aW5nIGNvbW1vbiBmYWN0b3JzCisgICAgaWYgKG9zdC0+c3QtPnRpbWVfYmFzZS5udW0gPD0gMCB8fCBvc3QtPnN0LT50aW1lX2Jhc2UuZGVuIDw9IDApCisgICAgICAgIG9zdC0+c3QtPnRpbWVfYmFzZSA9IGF2X2FkZF9xKGF2X3N0cmVhbV9nZXRfY29kZWNfdGltZWJhc2Uob3N0LT5zdCksIChBVlJhdGlvbmFsKXswLCAxfSk7CisKKyAgICAvLyBjb3B5IGVzdGltYXRlZCBkdXJhdGlvbiBhcyBhIGhpbnQgdG8gdGhlIG11eGVyCisgICAgaWYgKG9zdC0+c3QtPmR1cmF0aW9uIDw9IDAgJiYgaXN0LT5zdC0+ZHVyYXRpb24gPiAwKQorICAgICAgICBvc3QtPnN0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShpc3QtPnN0LT5kdXJhdGlvbiwgaXN0LT5zdC0+dGltZV9iYXNlLCBvc3QtPnN0LT50aW1lX2Jhc2UpOworCisgICAgLy8gY29weSBkaXNwb3NpdGlvbgorICAgIG9zdC0+c3QtPmRpc3Bvc2l0aW9uID0gaXN0LT5zdC0+ZGlzcG9zaXRpb247CisKKyAgICBpZiAoaXN0LT5zdC0+bmJfc2lkZV9kYXRhKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpc3QtPnN0LT5uYl9zaWRlX2RhdGE7IGkrKykgeworICAgICAgICAgICAgY29uc3QgQVZQYWNrZXRTaWRlRGF0YSAqc2Rfc3JjID0gJmlzdC0+c3QtPnNpZGVfZGF0YVtpXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9kYXRhOworCisgICAgICAgICAgICBkc3RfZGF0YSA9IGF2X3N0cmVhbV9uZXdfc2lkZV9kYXRhKG9zdC0+c3QsIHNkX3NyYy0+dHlwZSwgc2Rfc3JjLT5zaXplKTsKKyAgICAgICAgICAgIGlmICghZHN0X2RhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShkc3RfZGF0YSwgc2Rfc3JjLT5kYXRhLCBzZF9zcmMtPnNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9zdC0+cm90YXRlX292ZXJyaWRkZW4pIHsKKyAgICAgICAgdWludDhfdCAqc2QgPSBhdl9zdHJlYW1fbmV3X3NpZGVfZGF0YShvc3QtPnN0LCBBVl9QS1RfREFUQV9ESVNQTEFZTUFUUklYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQzMl90KSAqIDkpOworICAgICAgICBpZiAoc2QpCisgICAgICAgICAgICBhdl9kaXNwbGF5X3JvdGF0aW9uX3NldCgoaW50MzJfdCAqKXNkLCAtb3N0LT5yb3RhdGVfb3ZlcnJpZGVfdmFsdWUpOworICAgIH0KKworICAgIHN3aXRjaCAocGFyX2RzdC0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBpZiAoYXVkaW9fdm9sdW1lICE9IDI1NikgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIi1hY29kZWMgY29weSBhbmQgLXZvbCBhcmUgaW5jb21wYXRpYmxlIChmcmFtZXMgYXJlIG5vdCBkZWNvZGVkKVxuIik7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYoKHBhcl9kc3QtPmJsb2NrX2FsaWduID09IDEgfHwgcGFyX2RzdC0+YmxvY2tfYWxpZ24gPT0gMTE1MiB8fCBwYXJfZHN0LT5ibG9ja19hbGlnbiA9PSA1NzYpICYmIHBhcl9kc3QtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMykKKyAgICAgICAgICAgIHBhcl9kc3QtPmJsb2NrX2FsaWduPSAwOworICAgICAgICBpZihwYXJfZHN0LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpCisgICAgICAgICAgICBwYXJfZHN0LT5ibG9ja19hbGlnbj0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIGlmIChvc3QtPmZyYW1lX2FzcGVjdF9yYXRpby5udW0pIHsgLy8gb3ZlcnJpZGRlbiBieSB0aGUgLWFzcGVjdCBjbGkgb3B0aW9uCisgICAgICAgICAgICBzYXIgPQorICAgICAgICAgICAgICAgIGF2X211bF9xKG9zdC0+ZnJhbWVfYXNwZWN0X3JhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgcGFyX2RzdC0+aGVpZ2h0LCBwYXJfZHN0LT53aWR0aCB9KTsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk92ZXJyaWRpbmcgYXNwZWN0IHJhdGlvICIKKyAgICAgICAgICAgICAgICAgICAid2l0aCBzdHJlYW0gY29weSBtYXkgcHJvZHVjZSBpbnZhbGlkIGZpbGVzXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoaXN0LT5zdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pCisgICAgICAgICAgICBzYXIgPSBpc3QtPnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzYXIgPSBwYXJfc3JjLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICBvc3QtPnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcGFyX2RzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHNhcjsKKyAgICAgICAgb3N0LT5zdC0+YXZnX2ZyYW1lX3JhdGUgPSBpc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZTsKKyAgICAgICAgb3N0LT5zdC0+cl9mcmFtZV9yYXRlID0gaXN0LT5zdC0+cl9mcmFtZV9yYXRlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBvc3QtPm11eF90aW1lYmFzZSA9IGlzdC0+c3QtPnRpbWVfYmFzZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfZW5jb2Rlcl9pZChPdXRwdXRGaWxlICpvZiwgT3V0cHV0U3RyZWFtICpvc3QpCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7CisKKyAgICB1aW50OF90ICplbmNvZGVyX3N0cmluZzsKKyAgICBpbnQgZW5jb2Rlcl9zdHJpbmdfbGVuOworICAgIGludCBmb3JtYXRfZmxhZ3MgPSAwOworICAgIGludCBjb2RlY19mbGFncyA9IG9zdC0+ZW5jX2N0eC0+ZmxhZ3M7CisKKyAgICBpZiAoYXZfZGljdF9nZXQob3N0LT5zdC0+bWV0YWRhdGEsICJlbmNvZGVyIiwgIE5VTEwsIDApKQorICAgICAgICByZXR1cm47CisKKyAgICBlID0gYXZfZGljdF9nZXQob2YtPm9wdHMsICJmZmxhZ3MiLCBOVUxMLCAwKTsKKyAgICBpZiAoZSkgeworICAgICAgICBjb25zdCBBVk9wdGlvbiAqbyA9IGF2X29wdF9maW5kKG9mLT5jdHgsICJmZmxhZ3MiLCBOVUxMLCAwLCAwKTsKKyAgICAgICAgaWYgKCFvKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBhdl9vcHRfZXZhbF9mbGFncyhvZi0+Y3R4LCBvLCBlLT52YWx1ZSwgJmZvcm1hdF9mbGFncyk7CisgICAgfQorICAgIGUgPSBhdl9kaWN0X2dldChvc3QtPmVuY29kZXJfb3B0cywgImZsYWdzIiwgTlVMTCwgMCk7CisgICAgaWYgKGUpIHsKKyAgICAgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZChvc3QtPmVuY19jdHgsICJmbGFncyIsIE5VTEwsIDAsIDApOworICAgICAgICBpZiAoIW8pCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGF2X29wdF9ldmFsX2ZsYWdzKG9zdC0+ZW5jX2N0eCwgbywgZS0+dmFsdWUsICZjb2RlY19mbGFncyk7CisgICAgfQorCisgICAgZW5jb2Rlcl9zdHJpbmdfbGVuID0gc2l6ZW9mKExJQkFWQ09ERUNfSURFTlQpICsgc3RybGVuKG9zdC0+ZW5jLT5uYW1lKSArIDI7CisgICAgZW5jb2Rlcl9zdHJpbmcgICAgID0gYXZfbWFsbG9jeihlbmNvZGVyX3N0cmluZ19sZW4pOworICAgIGlmICghZW5jb2Rlcl9zdHJpbmcpCisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKworICAgIGlmICghKGZvcm1hdF9mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QpICYmICEoY29kZWNfZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0JJVEVYQUNUKSkKKyAgICAgICAgYXZfc3RybGNweShlbmNvZGVyX3N0cmluZywgTElCQVZDT0RFQ19JREVOVCAiICIsIGVuY29kZXJfc3RyaW5nX2xlbik7CisgICAgZWxzZQorICAgICAgICBhdl9zdHJsY3B5KGVuY29kZXJfc3RyaW5nLCAiTGF2YyAiLCBlbmNvZGVyX3N0cmluZ19sZW4pOworICAgIGF2X3N0cmxjYXQoZW5jb2Rlcl9zdHJpbmcsIG9zdC0+ZW5jLT5uYW1lLCBlbmNvZGVyX3N0cmluZ19sZW4pOworICAgIGF2X2RpY3Rfc2V0KCZvc3QtPnN0LT5tZXRhZGF0YSwgImVuY29kZXIiLCAgZW5jb2Rlcl9zdHJpbmcsCisgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwgfCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfZm9yY2VkX2tleV9mcmFtZXMoY2hhciAqa2YsIE91dHB1dFN0cmVhbSAqb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGNoYXIgKnA7CisgICAgaW50IG4gPSAxLCBpLCBzaXplLCBpbmRleCA9IDA7CisgICAgaW50NjRfdCB0LCAqcHRzOworCisgICAgZm9yIChwID0ga2Y7ICpwOyBwKyspCisgICAgICAgIGlmICgqcCA9PSAnLCcpCisgICAgICAgICAgICBuKys7CisgICAgc2l6ZSA9IG47CisgICAgcHRzID0gYXZfbWFsbG9jX2FycmF5KHNpemUsIHNpemVvZigqcHRzKSk7CisgICAgaWYgKCFwdHMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmb3JjZWQga2V5IGZyYW1lcyBhcnJheS5cbiIpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgcCA9IGtmOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgY2hhciAqbmV4dCA9IHN0cmNocihwLCAnLCcpOworCisgICAgICAgIGlmIChuZXh0KQorICAgICAgICAgICAgKm5leHQrKyA9IDA7CisKKyAgICAgICAgaWYgKCFtZW1jbXAocCwgImNoYXB0ZXJzIiwgOCkpIHsKKworICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICphdmYgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XS0+Y3R4OworICAgICAgICAgICAgaW50IGo7CisKKyAgICAgICAgICAgIGlmIChhdmYtPm5iX2NoYXB0ZXJzID4gSU5UX01BWCAtIHNpemUgfHwKKyAgICAgICAgICAgICAgICAhKHB0cyA9IGF2X3JlYWxsb2NfZihwdHMsIHNpemUgKz0gYXZmLT5uYl9jaGFwdGVycyAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpwdHMpKSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIGZvcmNlZCBrZXkgZnJhbWVzIGFycmF5LlxuIik7CisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdCA9IHBbOF0gPyBwYXJzZV90aW1lX29yX2RpZSgiZm9yY2Vfa2V5X2ZyYW1lcyIsIHAgKyA4LCAxKSA6IDA7CisgICAgICAgICAgICB0ID0gYXZfcmVzY2FsZV9xKHQsIEFWX1RJTUVfQkFTRV9RLCBhdmN0eC0+dGltZV9iYXNlKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Zi0+bmJfY2hhcHRlcnM7IGorKykgeworICAgICAgICAgICAgICAgIEFWQ2hhcHRlciAqYyA9IGF2Zi0+Y2hhcHRlcnNbal07CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MShpbmRleCA8IHNpemUpOworICAgICAgICAgICAgICAgIHB0c1tpbmRleCsrXSA9IGF2X3Jlc2NhbGVfcShjLT5zdGFydCwgYy0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+dGltZV9iYXNlKSArIHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgdCA9IHBhcnNlX3RpbWVfb3JfZGllKCJmb3JjZV9rZXlfZnJhbWVzIiwgcCwgMSk7CisgICAgICAgICAgICBhdl9hc3NlcnQxKGluZGV4IDwgc2l6ZSk7CisgICAgICAgICAgICBwdHNbaW5kZXgrK10gPSBhdl9yZXNjYWxlX3EodCwgQVZfVElNRV9CQVNFX1EsIGF2Y3R4LT50aW1lX2Jhc2UpOworCisgICAgICAgIH0KKworICAgICAgICBwID0gbmV4dDsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKGluZGV4ID09IHNpemUpOworICAgIHFzb3J0KHB0cywgc2l6ZSwgc2l6ZW9mKCpwdHMpLCBjb21wYXJlX2ludDY0KTsKKyAgICBvc3QtPmZvcmNlZF9rZl9jb3VudCA9IHNpemU7CisgICAgb3N0LT5mb3JjZWRfa2ZfcHRzICAgPSBwdHM7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZW5jb2Rlcl90aW1lX2Jhc2UoT3V0cHV0U3RyZWFtICpvc3QsIEFWUmF0aW9uYWwgZGVmYXVsdF90aW1lX2Jhc2UpCit7CisgICAgSW5wdXRTdHJlYW0gKmlzdCA9IGdldF9pbnB1dF9zdHJlYW0ob3N0KTsKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jX2N0eCA9IG9zdC0+ZW5jX2N0eDsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jOworCisgICAgaWYgKG9zdC0+ZW5jX3RpbWViYXNlLm51bSA+IDApIHsKKyAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gb3N0LT5lbmNfdGltZWJhc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAob3N0LT5lbmNfdGltZWJhc2UubnVtIDwgMCkgeworICAgICAgICBpZiAoaXN0KSB7CisgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UgPSBpc3QtPnN0LT50aW1lX2Jhc2U7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvYyA9IG91dHB1dF9maWxlc1tvc3QtPmZpbGVfaW5kZXhdLT5jdHg7CisgICAgICAgIGF2X2xvZyhvYywgQVZfTE9HX1dBUk5JTkcsICJJbnB1dCBzdHJlYW0gZGF0YSBub3QgYXZhaWxhYmxlLCB1c2luZyBkZWZhdWx0IHRpbWUgYmFzZVxuIik7CisgICAgfQorCisgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gZGVmYXVsdF90aW1lX2Jhc2U7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9vdXRwdXRfc3RyZWFtX2VuY29kZShPdXRwdXRTdHJlYW0gKm9zdCkKK3sKKyAgICBJbnB1dFN0cmVhbSAqaXN0ID0gZ2V0X2lucHV0X3N0cmVhbShvc3QpOworICAgIEFWQ29kZWNDb250ZXh0ICplbmNfY3R4ID0gb3N0LT5lbmNfY3R4OworICAgIEFWQ29kZWNDb250ZXh0ICpkZWNfY3R4ID0gTlVMTDsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jID0gb3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF0tPmN0eDsKKyAgICBpbnQgaiwgcmV0OworCisgICAgc2V0X2VuY29kZXJfaWQob3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF0sIG9zdCk7CisKKyAgICAvLyBNdXhlcnMgdXNlIEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVggdG8gc2lnbmFsIHJvdGF0aW9uLiBPbiB0aGUgb3RoZXIKKyAgICAvLyBoYW5kLCB0aGUgbGVnYWN5IEFQSSBtYWtlcyBkZW11eGVycyBzZXQgInJvdGF0ZSIgbWV0YWRhdGEgZW50cmllcywKKyAgICAvLyB3aGljaCBoYXZlIHRvIGJlIGZpbHRlcmVkIG91dCB0byBwcmV2ZW50IGxlYWtpbmcgdGhlbSB0byBvdXRwdXQgZmlsZXMuCisgICAgYXZfZGljdF9zZXQoJm9zdC0+c3QtPm1ldGFkYXRhLCAicm90YXRlIiwgTlVMTCwgMCk7CisKKyAgICBpZiAoaXN0KSB7CisgICAgICAgIG9zdC0+c3QtPmRpc3Bvc2l0aW9uICAgICAgICAgID0gaXN0LT5zdC0+ZGlzcG9zaXRpb247CisKKyAgICAgICAgZGVjX2N0eCA9IGlzdC0+ZGVjX2N0eDsKKworICAgICAgICBlbmNfY3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gZGVjX2N0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2MtPm5iX3N0cmVhbXM7IGorKykgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gb2MtPnN0cmVhbXNbal07CisgICAgICAgICAgICBpZiAoc3QgIT0gb3N0LT5zdCAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gb3N0LT5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gb2MtPm5iX3N0cmVhbXMpCisgICAgICAgICAgICBpZiAob3N0LT5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPIHx8CisgICAgICAgICAgICAgICAgb3N0LT5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgICAgIG9zdC0+c3QtPmRpc3Bvc2l0aW9uID0gQVZfRElTUE9TSVRJT05fREVGQVVMVDsKKyAgICB9CisKKyAgICBpZiAoZW5jX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKCFvc3QtPmZyYW1lX3JhdGUubnVtKQorICAgICAgICAgICAgb3N0LT5mcmFtZV9yYXRlID0gYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfcmF0ZShvc3QtPmZpbHRlci0+ZmlsdGVyKTsKKyAgICAgICAgaWYgKGlzdCAmJiAhb3N0LT5mcmFtZV9yYXRlLm51bSkKKyAgICAgICAgICAgIG9zdC0+ZnJhbWVfcmF0ZSA9IGlzdC0+ZnJhbWVyYXRlOworICAgICAgICBpZiAoaXN0ICYmICFvc3QtPmZyYW1lX3JhdGUubnVtKQorICAgICAgICAgICAgb3N0LT5mcmFtZV9yYXRlID0gaXN0LT5zdC0+cl9mcmFtZV9yYXRlOworICAgICAgICBpZiAoaXN0ICYmICFvc3QtPmZyYW1lX3JhdGUubnVtKSB7CisgICAgICAgICAgICBvc3QtPmZyYW1lX3JhdGUgPSAoQVZSYXRpb25hbCl7MjUsIDF9OworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJObyBpbmZvcm1hdGlvbiAiCisgICAgICAgICAgICAgICAgICAgImFib3V0IHRoZSBpbnB1dCBmcmFtZXJhdGUgaXMgYXZhaWxhYmxlLiBGYWxsaW5nICIKKyAgICAgICAgICAgICAgICAgICAiYmFjayB0byBhIGRlZmF1bHQgdmFsdWUgb2YgMjVmcHMgZm9yIG91dHB1dCBzdHJlYW0gIyVkOiVkLiBVc2UgdGhlIC1yIG9wdGlvbiAiCisgICAgICAgICAgICAgICAgICAgImlmIHlvdSB3YW50IGEgZGlmZmVyZW50IGZyYW1lcmF0ZS5cbiIsCisgICAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKKyAgICAgICAgfQorLy8gICAgICBvc3QtPmZyYW1lX3JhdGUgPSBpc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gPyBpc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZSA6IChBVlJhdGlvbmFsKXsyNSwgMX07CisgICAgICAgIGlmIChvc3QtPmVuYy0+c3VwcG9ydGVkX2ZyYW1lcmF0ZXMgJiYgIW9zdC0+Zm9yY2VfZnBzKSB7CisgICAgICAgICAgICBpbnQgaWR4ID0gYXZfZmluZF9uZWFyZXN0X3FfaWR4KG9zdC0+ZnJhbWVfcmF0ZSwgb3N0LT5lbmMtPnN1cHBvcnRlZF9mcmFtZXJhdGVzKTsKKyAgICAgICAgICAgIG9zdC0+ZnJhbWVfcmF0ZSA9IG9zdC0+ZW5jLT5zdXBwb3J0ZWRfZnJhbWVyYXRlc1tpZHhdOworICAgICAgICB9CisgICAgICAgIC8vIHJlZHVjZSBmcmFtZSByYXRlIGZvciBtcGVnNCB0byBiZSB3aXRoaW4gdGhlIHNwZWMgbGltaXRzCisgICAgICAgIGlmIChlbmNfY3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgICAgICAgICAgYXZfcmVkdWNlKCZvc3QtPmZyYW1lX3JhdGUubnVtLCAmb3N0LT5mcmFtZV9yYXRlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZyYW1lX3JhdGUubnVtLCBvc3QtPmZyYW1lX3JhdGUuZGVuLCA2NTUzNSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGVuY19jdHgtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgZW5jX2N0eC0+c2FtcGxlX2ZtdCAgICAgPSBhdl9idWZmZXJzaW5rX2dldF9mb3JtYXQob3N0LT5maWx0ZXItPmZpbHRlcik7CisgICAgICAgIGlmIChkZWNfY3R4KQorICAgICAgICAgICAgZW5jX2N0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IEZGTUlOKGRlY19jdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoZW5jX2N0eC0+c2FtcGxlX2ZtdCkgPDwgMyk7CisgICAgICAgIGVuY19jdHgtPnNhbXBsZV9yYXRlICAgID0gYXZfYnVmZmVyc2lua19nZXRfc2FtcGxlX3JhdGUob3N0LT5maWx0ZXItPmZpbHRlcik7CisgICAgICAgIGVuY19jdHgtPmNoYW5uZWxfbGF5b3V0ID0gYXZfYnVmZmVyc2lua19nZXRfY2hhbm5lbF9sYXlvdXQob3N0LT5maWx0ZXItPmZpbHRlcik7CisgICAgICAgIGVuY19jdHgtPmNoYW5uZWxzICAgICAgID0gYXZfYnVmZmVyc2lua19nZXRfY2hhbm5lbHMob3N0LT5maWx0ZXItPmZpbHRlcik7CisKKyAgICAgICAgaW5pdF9lbmNvZGVyX3RpbWVfYmFzZShvc3QsIGF2X21ha2VfcSgxLCBlbmNfY3R4LT5zYW1wbGVfcmF0ZSkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBpbml0X2VuY29kZXJfdGltZV9iYXNlKG9zdCwgYXZfaW52X3Eob3N0LT5mcmFtZV9yYXRlKSk7CisKKyAgICAgICAgaWYgKCEoZW5jX2N0eC0+dGltZV9iYXNlLm51bSAmJiBlbmNfY3R4LT50aW1lX2Jhc2UuZGVuKSkKKyAgICAgICAgICAgIGVuY19jdHgtPnRpbWVfYmFzZSA9IGF2X2J1ZmZlcnNpbmtfZ2V0X3RpbWVfYmFzZShvc3QtPmZpbHRlci0+ZmlsdGVyKTsKKyAgICAgICAgaWYgKCAgIGF2X3EyZChlbmNfY3R4LT50aW1lX2Jhc2UpIDwgMC4wMDEgJiYgdmlkZW9fc3luY19tZXRob2QgIT0gVlNZTkNfUEFTU1RIUk9VR0gKKyAgICAgICAgICAgJiYgKHZpZGVvX3N5bmNfbWV0aG9kID09IFZTWU5DX0NGUiB8fCB2aWRlb19zeW5jX21ldGhvZCA9PSBWU1lOQ19WU0NGUiB8fCAodmlkZW9fc3luY19tZXRob2QgPT0gVlNZTkNfQVVUTyAmJiAhKG9jLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX1ZBUklBQkxFX0ZQUykpKSl7CisgICAgICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19XQVJOSU5HLCAiRnJhbWUgcmF0ZSB2ZXJ5IGhpZ2ggZm9yIGEgbXV4ZXIgbm90IGVmZmljaWVudGx5IHN1cHBvcnRpbmcgaXQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGNvbnNpZGVyIHNwZWNpZnlpbmcgYSBsb3dlciBmcmFtZXJhdGUsIGEgZGlmZmVyZW50IG11eGVyIG9yIC12c3luYyAyXG4iKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3N0LT5mb3JjZWRfa2ZfY291bnQ7IGorKykKKyAgICAgICAgICAgIG9zdC0+Zm9yY2VkX2tmX3B0c1tqXSA9IGF2X3Jlc2NhbGVfcShvc3QtPmZvcmNlZF9rZl9wdHNbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlKTsKKworICAgICAgICBlbmNfY3R4LT53aWR0aCAgPSBhdl9idWZmZXJzaW5rX2dldF93KG9zdC0+ZmlsdGVyLT5maWx0ZXIpOworICAgICAgICBlbmNfY3R4LT5oZWlnaHQgPSBhdl9idWZmZXJzaW5rX2dldF9oKG9zdC0+ZmlsdGVyLT5maWx0ZXIpOworICAgICAgICBlbmNfY3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gb3N0LT5zdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9CisgICAgICAgICAgICBvc3QtPmZyYW1lX2FzcGVjdF9yYXRpby5udW0gPyAvLyBvdmVycmlkZGVuIGJ5IHRoZSAtYXNwZWN0IGNsaSBvcHRpb24KKyAgICAgICAgICAgIGF2X211bF9xKG9zdC0+ZnJhbWVfYXNwZWN0X3JhdGlvLCAoQVZSYXRpb25hbCl7IGVuY19jdHgtPmhlaWdodCwgZW5jX2N0eC0+d2lkdGggfSkgOgorICAgICAgICAgICAgYXZfYnVmZmVyc2lua19nZXRfc2FtcGxlX2FzcGVjdF9yYXRpbyhvc3QtPmZpbHRlci0+ZmlsdGVyKTsKKworICAgICAgICBlbmNfY3R4LT5waXhfZm10ID0gYXZfYnVmZmVyc2lua19nZXRfZm9ybWF0KG9zdC0+ZmlsdGVyLT5maWx0ZXIpOworICAgICAgICBpZiAoZGVjX2N0eCkKKyAgICAgICAgICAgIGVuY19jdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBGRk1JTihkZWNfY3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3BpeF9mbXRfZGVzY19nZXQoZW5jX2N0eC0+cGl4X2ZtdCktPmNvbXBbMF0uZGVwdGgpOworCisgICAgICAgIGVuY19jdHgtPmZyYW1lcmF0ZSA9IG9zdC0+ZnJhbWVfcmF0ZTsKKworICAgICAgICBvc3QtPnN0LT5hdmdfZnJhbWVfcmF0ZSA9IG9zdC0+ZnJhbWVfcmF0ZTsKKworICAgICAgICBpZiAoIWRlY19jdHggfHwKKyAgICAgICAgICAgIGVuY19jdHgtPndpZHRoICAgIT0gZGVjX2N0eC0+d2lkdGggIHx8CisgICAgICAgICAgICBlbmNfY3R4LT5oZWlnaHQgICE9IGRlY19jdHgtPmhlaWdodCB8fAorICAgICAgICAgICAgZW5jX2N0eC0+cGl4X2ZtdCAhPSBkZWNfY3R4LT5waXhfZm10KSB7CisgICAgICAgICAgICBlbmNfY3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gZnJhbWVfYml0c19wZXJfcmF3X3NhbXBsZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvc3QtPmZvcmNlZF9rZXlmcmFtZXMpIHsKKyAgICAgICAgICAgIGlmICghc3RybmNtcChvc3QtPmZvcmNlZF9rZXlmcmFtZXMsICJleHByOiIsIDUpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgmb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX3BleHByLCBvc3QtPmZvcmNlZF9rZXlmcmFtZXMrNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlZF9rZXlmcmFtZXNfY29uc3RfbmFtZXMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmb3JjZV9rZXlfZnJhbWVzIGV4cHJlc3Npb24gJyVzJ1xuIiwgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzKzUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX05dID0gMDsKKyAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX05fRk9SQ0VEXSA9IDA7CisgICAgICAgICAgICAgICAgb3N0LT5mb3JjZWRfa2V5ZnJhbWVzX2V4cHJfY29uc3RfdmFsdWVzW0ZLRl9QUkVWX0ZPUkNFRF9OXSA9IE5BTjsKKyAgICAgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX1BSRVZfRk9SQ0VEX1RdID0gTkFOOworCisgICAgICAgICAgICAvLyBEb24ndCBwYXJzZSB0aGUgJ2ZvcmNlZF9rZXlmcmFtZXMnIGluIGNhc2Ugb2YgJ2tlZXAtc291cmNlLWtleWZyYW1lcycsCisgICAgICAgICAgICAvLyBwYXJzZSBpdCBvbmx5IGZvciBzdGF0aWMga2YgdGltaW5ncworICAgICAgICAgICAgfSBlbHNlIGlmKHN0cm5jbXAob3N0LT5mb3JjZWRfa2V5ZnJhbWVzLCAic291cmNlIiwgNikpIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9mb3JjZWRfa2V5X2ZyYW1lcyhvc3QtPmZvcmNlZF9rZXlmcmFtZXMsIG9zdCwgb3N0LT5lbmNfY3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gQVZfVElNRV9CQVNFX1E7CisgICAgICAgIGlmICghZW5jX2N0eC0+d2lkdGgpIHsKKyAgICAgICAgICAgIGVuY19jdHgtPndpZHRoICAgICA9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdLT5zdC0+Y29kZWNwYXItPndpZHRoOworICAgICAgICAgICAgZW5jX2N0eC0+aGVpZ2h0ICAgID0gaW5wdXRfc3RyZWFtc1tvc3QtPnNvdXJjZV9pbmRleF0tPnN0LT5jb2RlY3Bhci0+aGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0RBVEE6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFib3J0KCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG9zdC0+bXV4X3RpbWViYXNlID0gZW5jX2N0eC0+dGltZV9iYXNlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9vdXRwdXRfc3RyZWFtKE91dHB1dFN0cmVhbSAqb3N0LCBjaGFyICplcnJvciwgaW50IGVycm9yX2xlbikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmIChvc3QtPmVuY29kaW5nX25lZWRlZCkgeworICAgICAgICBBVkNvZGVjICAgICAgKmNvZGVjID0gb3N0LT5lbmM7CisgICAgICAgIEFWQ29kZWNDb250ZXh0ICpkZWMgPSBOVUxMOworICAgICAgICBJbnB1dFN0cmVhbSAqaXN0OworCisgICAgICAgIHJldCA9IGluaXRfb3V0cHV0X3N0cmVhbV9lbmNvZGUob3N0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmICgoaXN0ID0gZ2V0X2lucHV0X3N0cmVhbShvc3QpKSkKKyAgICAgICAgICAgIGRlYyA9IGlzdC0+ZGVjX2N0eDsKKyAgICAgICAgaWYgKGRlYyAmJiBkZWMtPnN1YnRpdGxlX2hlYWRlcikgeworICAgICAgICAgICAgLyogQVNTIGNvZGUgYXNzdW1lcyB0aGlzIGJ1ZmZlciBpcyBudWxsIHRlcm1pbmF0ZWQgc28gYWRkIGV4dHJhIGJ5dGUuICovCisgICAgICAgICAgICBvc3QtPmVuY19jdHgtPnN1YnRpdGxlX2hlYWRlciA9IGF2X21hbGxvY3ooZGVjLT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZSArIDEpOworICAgICAgICAgICAgaWYgKCFvc3QtPmVuY19jdHgtPnN1YnRpdGxlX2hlYWRlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbWVtY3B5KG9zdC0+ZW5jX2N0eC0+c3VidGl0bGVfaGVhZGVyLCBkZWMtPnN1YnRpdGxlX2hlYWRlciwgZGVjLT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZSk7CisgICAgICAgICAgICBvc3QtPmVuY19jdHgtPnN1YnRpdGxlX2hlYWRlcl9zaXplID0gZGVjLT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWF2X2RpY3RfZ2V0KG9zdC0+ZW5jb2Rlcl9vcHRzLCAidGhyZWFkcyIsIE5VTEwsIDApKQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9zdC0+ZW5jb2Rlcl9vcHRzLCAidGhyZWFkcyIsICJhdXRvIiwgMCk7CisgICAgICAgIGlmIChvc3QtPmVuYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICFjb2RlYy0+ZGVmYXVsdHMgJiYKKyAgICAgICAgICAgICFhdl9kaWN0X2dldChvc3QtPmVuY29kZXJfb3B0cywgImIiLCBOVUxMLCAwKSAmJgorICAgICAgICAgICAgIWF2X2RpY3RfZ2V0KG9zdC0+ZW5jb2Rlcl9vcHRzLCAiYWIiLCBOVUxMLCAwKSkKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvc3QtPmVuY29kZXJfb3B0cywgImIiLCAiMTI4MDAwIiwgMCk7CisKKyAgICAgICAgaWYgKG9zdC0+ZmlsdGVyICYmIGF2X2J1ZmZlcnNpbmtfZ2V0X2h3X2ZyYW1lc19jdHgob3N0LT5maWx0ZXItPmZpbHRlcikgJiYKKyAgICAgICAgICAgICgoQVZIV0ZyYW1lc0NvbnRleHQqKWF2X2J1ZmZlcnNpbmtfZ2V0X2h3X2ZyYW1lc19jdHgob3N0LT5maWx0ZXItPmZpbHRlciktPmRhdGEpLT5mb3JtYXQgPT0KKyAgICAgICAgICAgIGF2X2J1ZmZlcnNpbmtfZ2V0X2Zvcm1hdChvc3QtPmZpbHRlci0+ZmlsdGVyKSkgeworICAgICAgICAgICAgb3N0LT5lbmNfY3R4LT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihhdl9idWZmZXJzaW5rX2dldF9od19mcmFtZXNfY3R4KG9zdC0+ZmlsdGVyLT5maWx0ZXIpKTsKKyAgICAgICAgICAgIGlmICghb3N0LT5lbmNfY3R4LT5od19mcmFtZXNfY3R4KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBod19kZXZpY2Vfc2V0dXBfZm9yX2VuY29kZShvc3QpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihlcnJvciwgZXJyb3JfbGVuLCAiRGV2aWNlIHNldHVwIGZhaWxlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJlbmNvZGVyIG9uIG91dHB1dCBzdHJlYW0gIyVkOiVkIDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4LCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGF2Y29kZWNfb3BlbjIob3N0LT5lbmNfY3R4LCBjb2RlYywgJm9zdC0+ZW5jb2Rlcl9vcHRzKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRVhQRVJJTUVOVEFMKQorICAgICAgICAgICAgICAgIGFib3J0X2NvZGVjX2V4cGVyaW1lbnRhbChjb2RlYywgMSk7CisgICAgICAgICAgICBzbnByaW50ZihlcnJvciwgZXJyb3JfbGVuLAorICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIG9wZW5pbmcgZW5jb2RlciBmb3Igb3V0cHV0IHN0cmVhbSAjJWQ6JWQgLSAiCisgICAgICAgICAgICAgICAgICAgICAibWF5YmUgaW5jb3JyZWN0IHBhcmFtZXRlcnMgc3VjaCBhcyBiaXRfcmF0ZSwgcmF0ZSwgd2lkdGggb3IgaGVpZ2h0IiwKKyAgICAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9zdC0+ZW5jLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgIShvc3QtPmVuYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX1ZBUklBQkxFX0ZSQU1FX1NJWkUpKQorICAgICAgICAgICAgYXZfYnVmZmVyc2lua19zZXRfZnJhbWVfc2l6ZShvc3QtPmZpbHRlci0+ZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmVuY19jdHgtPmZyYW1lX3NpemUpOworICAgICAgICBhc3NlcnRfYXZvcHRpb25zKG9zdC0+ZW5jb2Rlcl9vcHRzKTsKKyAgICAgICAgaWYgKG9zdC0+ZW5jX2N0eC0+Yml0X3JhdGUgJiYgb3N0LT5lbmNfY3R4LT5iaXRfcmF0ZSA8IDEwMDAgJiYKKyAgICAgICAgICAgIG9zdC0+ZW5jX2N0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQ09ERUMyIC8qIGRvbid0IGNvbXBsYWluIGFib3V0IDcwMCBiaXQvcyBtb2RlcyAqLykKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlRoZSBiaXRyYXRlIHBhcmFtZXRlciBpcyBzZXQgdG9vIGxvdy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgSXQgdGFrZXMgYml0cy9zIGFzIGFyZ3VtZW50LCBub3Qga2JpdHMvc1xuIik7CisKKyAgICAgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2Zyb21fY29udGV4dChvc3QtPnN0LT5jb2RlY3Bhciwgb3N0LT5lbmNfY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgIkVycm9yIGluaXRpYWxpemluZyB0aGUgb3V0cHV0IHN0cmVhbSBjb2RlYyBjb250ZXh0LlxuIik7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgLyoKKyAgICAgICAgICogRklYTUU6IG9zdC0+c3QtPmNvZGVjIHNob3VsZCd0IGJlIG5lZWRlZCBoZXJlIGFueW1vcmUuCisgICAgICAgICAqLworICAgICAgICByZXQgPSBhdmNvZGVjX2NvcHlfY29udGV4dChvc3QtPnN0LT5jb2RlYywgb3N0LT5lbmNfY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGlmIChvc3QtPmVuY19jdHgtPm5iX2NvZGVkX3NpZGVfZGF0YSkgeworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvc3QtPmVuY19jdHgtPm5iX2NvZGVkX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQVZQYWNrZXRTaWRlRGF0YSAqc2Rfc3JjID0gJm9zdC0+ZW5jX2N0eC0+Y29kZWRfc2lkZV9kYXRhW2ldOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9kYXRhOworCisgICAgICAgICAgICAgICAgZHN0X2RhdGEgPSBhdl9zdHJlYW1fbmV3X3NpZGVfZGF0YShvc3QtPnN0LCBzZF9zcmMtPnR5cGUsIHNkX3NyYy0+c2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFkc3RfZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0X2RhdGEsIHNkX3NyYy0+ZGF0YSwgc2Rfc3JjLT5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFkZCBnbG9iYWwgaW5wdXQgc2lkZSBkYXRhLiBGb3Igbm93IHRoaXMgaXMgbmFpdmUsIGFuZCBjb3BpZXMgaXQKKyAgICAgICAgICogZnJvbSB0aGUgaW5wdXQgc3RyZWFtJ3MgZ2xvYmFsIHNpZGUgZGF0YS4gQWxsIHNpZGUgZGF0YSBzaG91bGQKKyAgICAgICAgICogcmVhbGx5IGJlIGZ1bm5lbGVkIG92ZXIgQVZGcmFtZSBhbmQgbGliYXZmaWx0ZXIsIHRoZW4gYWRkZWQgYmFjayB0bworICAgICAgICAgKiBwYWNrZXQgc2lkZSBkYXRhLCBhbmQgdGhlbiBwb3RlbnRpYWxseSB1c2luZyB0aGUgZmlyc3QgcGFja2V0IGZvcgorICAgICAgICAgKiBnbG9iYWwgc2lkZSBkYXRhLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGlzdCkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaXN0LT5zdC0+bmJfc2lkZV9kYXRhOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBVlBhY2tldFNpZGVEYXRhICpzZCA9ICZpc3QtPnN0LT5zaWRlX2RhdGFbaV07CisgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gYXZfc3RyZWFtX25ld19zaWRlX2RhdGEob3N0LT5zdCwgc2QtPnR5cGUsIHNkLT5zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzZC0+ZGF0YSwgc2QtPnNpemUpOworICAgICAgICAgICAgICAgIGlmIChpc3QtPmF1dG9yb3RhdGUgJiYgc2QtPnR5cGUgPT0gQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWCkKKyAgICAgICAgICAgICAgICAgICAgYXZfZGlzcGxheV9yb3RhdGlvbl9zZXQoKHVpbnQzMl90ICopZHN0LCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvcHkgdGltZWJhc2Ugd2hpbGUgcmVtb3ZpbmcgY29tbW9uIGZhY3RvcnMKKyAgICAgICAgaWYgKG9zdC0+c3QtPnRpbWVfYmFzZS5udW0gPD0gMCB8fCBvc3QtPnN0LT50aW1lX2Jhc2UuZGVuIDw9IDApCisgICAgICAgICAgICBvc3QtPnN0LT50aW1lX2Jhc2UgPSBhdl9hZGRfcShvc3QtPmVuY19jdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezAsIDF9KTsKKworICAgICAgICAvLyBjb3B5IGVzdGltYXRlZCBkdXJhdGlvbiBhcyBhIGhpbnQgdG8gdGhlIG11eGVyCisgICAgICAgIGlmIChvc3QtPnN0LT5kdXJhdGlvbiA8PSAwICYmIGlzdCAmJiBpc3QtPnN0LT5kdXJhdGlvbiA+IDApCisgICAgICAgICAgICBvc3QtPnN0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShpc3QtPnN0LT5kdXJhdGlvbiwgaXN0LT5zdC0+dGltZV9iYXNlLCBvc3QtPnN0LT50aW1lX2Jhc2UpOworCisgICAgICAgIG9zdC0+c3QtPmNvZGVjLT5jb2RlYz0gb3N0LT5lbmNfY3R4LT5jb2RlYzsKKyAgICB9IGVsc2UgaWYgKG9zdC0+c3RyZWFtX2NvcHkpIHsKKyAgICAgICAgcmV0ID0gaW5pdF9vdXRwdXRfc3RyZWFtX3N0cmVhbWNvcHkob3N0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIHBhcnNlIHVzZXIgcHJvdmlkZWQgZGlzcG9zaXRpb24sIGFuZCB1cGRhdGUgc3RyZWFtIHZhbHVlcworICAgIGlmIChvc3QtPmRpc3Bvc2l0aW9uKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRzW10gPSB7CisgICAgICAgICAgICB7ICJkaXNwb3NpdGlvbiIgICAgICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0ZMQUdTLCB7IC5pNjQgPSAwIH0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgICAgIHsgImRlZmF1bHQiICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0RFRkFVTFQgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICAgICAgeyAiZHViIiAgICAgICAgICAgICAgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfRElTUE9TSVRJT05fRFVCICAgICAgICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgICAgICB7ICJvcmlnaW5hbCIgICAgICAgICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ESVNQT1NJVElPTl9PUklHSU5BTCAgICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgICAgIHsgImNvbW1lbnQiICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0NPTU1FTlQgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICAgICAgeyAibHlyaWNzIiAgICAgICAgICAgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfRElTUE9TSVRJT05fTFlSSUNTICAgICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgICAgICB7ICJrYXJhb2tlIiAgICAgICAgICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ESVNQT1NJVElPTl9LQVJBT0tFICAgICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgICAgIHsgImZvcmNlZCIgICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0ZPUkNFRCAgICAgICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICAgICAgeyAiaGVhcmluZ19pbXBhaXJlZCIgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfRElTUE9TSVRJT05fSEVBUklOR19JTVBBSVJFRCAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgICAgICB7ICJ2aXN1YWxfaW1wYWlyZWQiICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ESVNQT1NJVElPTl9WSVNVQUxfSU1QQUlSRUQgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgICAgIHsgImNsZWFuX2VmZmVjdHMiICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0NMRUFOX0VGRkVDVFMgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICAgICAgeyAiYXR0YWNoZWRfcGljIiAgICAgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgICAgICB7ICJjYXB0aW9ucyIgICAgICAgICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ESVNQT1NJVElPTl9DQVBUSU9OUyAgICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgICAgIHsgImRlc2NyaXB0aW9ucyIgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0RJU1BPU0lUSU9OX0RFU0NSSVBUSU9OUyAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICAgICAgeyAiZGVwZW5kZW50IiAgICAgICAgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfRElTUE9TSVRJT05fREVQRU5ERU5UICAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgICAgICB7ICJtZXRhZGF0YSIgICAgICAgICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ESVNQT1NJVElPTl9NRVRBREFUQSAgICAgICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgICAgIHsgTlVMTCB9LAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgQVZDbGFzcyBjbGFzcyA9IHsKKyAgICAgICAgICAgIC5jbGFzc19uYW1lID0gIiIsCisgICAgICAgICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgICAgICAgICAgLm9wdGlvbiAgICAgPSBvcHRzLAorICAgICAgICAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IEFWQ2xhc3MgKnBjbGFzcyA9ICZjbGFzczsKKworICAgICAgICByZXQgPSBhdl9vcHRfZXZhbF9mbGFncygmcGNsYXNzLCAmb3B0c1swXSwgb3N0LT5kaXNwb3NpdGlvbiwgJm9zdC0+c3QtPmRpc3Bvc2l0aW9uKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgYml0c3RyZWFtIGZpbHRlcnMgZm9yIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICogbmVlZHMgdG8gYmUgZG9uZSBoZXJlLCBiZWNhdXNlIHRoZSBjb2RlYyBpZCBmb3Igc3RyZWFtY29weSBpcyBub3QKKyAgICAgKiBrbm93biB1bnRpbCBub3cgKi8KKyAgICByZXQgPSBpbml0X291dHB1dF9ic2ZzKG9zdCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBvc3QtPmluaXRpYWxpemVkID0gMTsKKworICAgIHJldCA9IGNoZWNrX2luaXRfb3V0cHV0X2ZpbGUob3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF0sIG9zdC0+ZmlsZV9pbmRleCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByZXBvcnRfbmV3X3N0cmVhbShpbnQgaW5wdXRfaW5kZXgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgSW5wdXRGaWxlICpmaWxlID0gaW5wdXRfZmlsZXNbaW5wdXRfaW5kZXhdOworICAgIEFWU3RyZWFtICpzdCA9IGZpbGUtPmN0eC0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisKKyAgICBpZiAocGt0LT5zdHJlYW1faW5kZXggPCBmaWxlLT5uYl9zdHJlYW1zX3dhcm4pCisgICAgICAgIHJldHVybjsKKyAgICBhdl9sb2coZmlsZS0+Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgIk5ldyAlcyBzdHJlYW0gJWQ6JWQgYXQgcG9zOiUiUFJJZDY0IiBhbmQgRFRTOiVzc1xuIiwKKyAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSksCisgICAgICAgICAgIGlucHV0X2luZGV4LCBwa3QtPnN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgcGt0LT5wb3MsIGF2X3RzMnRpbWVzdHIocGt0LT5kdHMsICZzdC0+dGltZV9iYXNlKSk7CisgICAgZmlsZS0+bmJfc3RyZWFtc193YXJuID0gcGt0LT5zdHJlYW1faW5kZXggKyAxOworfQorCitzdGF0aWMgaW50IHRyYW5zY29kZV9pbml0KHZvaWQpCit7CisgICAgaW50IHJldCA9IDAsIGksIGosIGs7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYzsKKyAgICBPdXRwdXRTdHJlYW0gKm9zdDsKKyAgICBJbnB1dFN0cmVhbSAqaXN0OworICAgIGNoYXIgZXJyb3JbMTAyNF0gPSB7MH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZmlsdGVyZ3JhcGhzOyBpKyspIHsKKyAgICAgICAgRmlsdGVyR3JhcGggKmZnID0gZmlsdGVyZ3JhcGhzW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmctPm5iX291dHB1dHM7IGorKykgeworICAgICAgICAgICAgT3V0cHV0RmlsdGVyICpvZmlsdGVyID0gZmctPm91dHB1dHNbal07CisgICAgICAgICAgICBpZiAoIW9maWx0ZXItPm9zdCB8fCBvZmlsdGVyLT5vc3QtPnNvdXJjZV9pbmRleCA+PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGZnLT5uYl9pbnB1dHMgIT0gMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoayA9IG5iX2lucHV0X3N0cmVhbXMtMTsgayA+PSAwIDsgay0tKQorICAgICAgICAgICAgICAgIGlmIChmZy0+aW5wdXRzWzBdLT5pc3QgPT0gaW5wdXRfc3RyZWFtc1trXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBvZmlsdGVyLT5vc3QtPnNvdXJjZV9pbmRleCA9IGs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpbml0IGZyYW1lcmF0ZSBlbXVsYXRpb24gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5wdXRfZmlsZXM7IGkrKykgeworICAgICAgICBJbnB1dEZpbGUgKmlmaWxlID0gaW5wdXRfZmlsZXNbaV07CisgICAgICAgIGlmIChpZmlsZS0+cmF0ZV9lbXUpCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaWZpbGUtPm5iX3N0cmVhbXM7IGorKykKKyAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW1zW2ogKyBpZmlsZS0+aXN0X2luZGV4XS0+c3RhcnQgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgfQorCisgICAgLyogaW5pdCBpbnB1dCBzdHJlYW1zICovCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X3N0cmVhbXM7IGkrKykKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X2lucHV0X3N0cmVhbShpLCBlcnJvciwgc2l6ZW9mKGVycm9yKSkpIDwgMCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBhdmNvZGVjX2Nsb3NlKG9zdC0+ZW5jX2N0eCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIGR1bXBfZm9ybWF0OworICAgICAgICB9CisKKyAgICAvKiBvcGVuIGVhY2ggZW5jb2RlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIC8vIHNraXAgc3RyZWFtcyBmZWQgZnJvbSBmaWx0ZXJncmFwaHMgdW50aWwgd2UgaGF2ZSBhIGZyYW1lIGZvciB0aGVtCisgICAgICAgIGlmIChvdXRwdXRfc3RyZWFtc1tpXS0+ZmlsdGVyKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcmV0ID0gaW5pdF9vdXRwdXRfc3RyZWFtKG91dHB1dF9zdHJlYW1zW2ldLCBlcnJvciwgc2l6ZW9mKGVycm9yKSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBkdW1wX2Zvcm1hdDsKKyAgICB9CisKKyAgICAvKiBkaXNjYXJkIHVudXNlZCBwcm9ncmFtcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9maWxlczsgaSsrKSB7CisgICAgICAgIElucHV0RmlsZSAqaWZpbGUgPSBpbnB1dF9maWxlc1tpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGlmaWxlLT5jdHgtPm5iX3Byb2dyYW1zOyBqKyspIHsKKyAgICAgICAgICAgIEFWUHJvZ3JhbSAqcCA9IGlmaWxlLT5jdHgtPnByb2dyYW1zW2pdOworICAgICAgICAgICAgaW50IGRpc2NhcmQgID0gQVZESVNDQVJEX0FMTDsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHAtPm5iX3N0cmVhbV9pbmRleGVzOyBrKyspCisgICAgICAgICAgICAgICAgaWYgKCFpbnB1dF9zdHJlYW1zW2lmaWxlLT5pc3RfaW5kZXggKyBwLT5zdHJlYW1faW5kZXhba11dLT5kaXNjYXJkKSB7CisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBBVkRJU0NBUkRfREVGQVVMVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgcC0+ZGlzY2FyZCA9IGRpc2NhcmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB3cml0ZSBoZWFkZXJzIGZvciBmaWxlcyB3aXRoIG5vIHN0cmVhbXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X2ZpbGVzOyBpKyspIHsKKyAgICAgICAgb2MgPSBvdXRwdXRfZmlsZXNbaV0tPmN0eDsKKyAgICAgICAgaWYgKG9jLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PU1RSRUFNUyAmJiBvYy0+bmJfc3RyZWFtcyA9PSAwKSB7CisgICAgICAgICAgICByZXQgPSBjaGVja19pbml0X291dHB1dF9maWxlKG91dHB1dF9maWxlc1tpXSwgaSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGR1bXBfZm9ybWF0OworICAgICAgICB9CisgICAgfQorCisgZHVtcF9mb3JtYXQ6CisgICAgLyogZHVtcCB0aGUgc3RyZWFtIG1hcHBpbmcgKi8KKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJTdHJlYW0gbWFwcGluZzpcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaXN0LT5uYl9maWx0ZXJzOyBqKyspIHsKKyAgICAgICAgICAgIGlmICghZmlsdGVyZ3JhcGhfaXNfc2ltcGxlKGlzdC0+ZmlsdGVyc1tqXS0+Z3JhcGgpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICBTdHJlYW0gIyVkOiVkICglcykgLT4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4LCBpc3QtPmRlYyA/IGlzdC0+ZGVjLT5uYW1lIDogIj8iLAorICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmZpbHRlcnNbal0tPm5hbWUpOworICAgICAgICAgICAgICAgIGlmIChuYl9maWx0ZXJncmFwaHMgPiAxKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKGdyYXBoICVkKSIsIGlzdC0+ZmlsdGVyc1tqXS0+Z3JhcGgtPmluZGV4KTsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgb3N0ID0gb3V0cHV0X3N0cmVhbXNbaV07CisKKyAgICAgICAgaWYgKG9zdC0+YXR0YWNobWVudF9maWxlbmFtZSkgeworICAgICAgICAgICAgLyogYW4gYXR0YWNoZWQgZmlsZSAqLworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICBGaWxlICVzIC0+IFN0cmVhbSAjJWQ6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgb3N0LT5hdHRhY2htZW50X2ZpbGVuYW1lLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAob3N0LT5maWx0ZXIgJiYgIWZpbHRlcmdyYXBoX2lzX3NpbXBsZShvc3QtPmZpbHRlci0+Z3JhcGgpKSB7CisgICAgICAgICAgICAvKiBvdXRwdXQgZnJvbSBhIGNvbXBsZXggZ3JhcGggKi8KKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAgJXMiLCBvc3QtPmZpbHRlci0+bmFtZSk7CisgICAgICAgICAgICBpZiAobmJfZmlsdGVyZ3JhcGhzID4gMSkKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKGdyYXBoICVkKSIsIG9zdC0+ZmlsdGVyLT5ncmFwaC0+aW5kZXgpOworCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgLT4gU3RyZWFtICMlZDolZCAoJXMpXG4iLCBvc3QtPmZpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgb3N0LT5pbmRleCwgb3N0LT5lbmMgPyBvc3QtPmVuYy0+bmFtZSA6ICI/Iik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAgU3RyZWFtICMlZDolZCAtPiAjJWQ6JWQiLAorICAgICAgICAgICAgICAgaW5wdXRfc3RyZWFtc1tvc3QtPnNvdXJjZV9pbmRleF0tPmZpbGVfaW5kZXgsCisgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XS0+c3QtPmluZGV4LAorICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LAorICAgICAgICAgICAgICAgb3N0LT5pbmRleCk7CisgICAgICAgIGlmIChvc3QtPnN5bmNfaXN0ICE9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIFtzeW5jICMlZDolZF0iLAorICAgICAgICAgICAgICAgICAgIG9zdC0+c3luY19pc3QtPmZpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgb3N0LT5zeW5jX2lzdC0+c3QtPmluZGV4KTsKKyAgICAgICAgaWYgKG9zdC0+c3RyZWFtX2NvcHkpCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKGNvcHkpIik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29uc3QgQVZDb2RlYyAqaW5fY29kZWMgICAgPSBpbnB1dF9zdHJlYW1zW29zdC0+c291cmNlX2luZGV4XS0+ZGVjOworICAgICAgICAgICAgY29uc3QgQVZDb2RlYyAqb3V0X2NvZGVjICAgPSBvc3QtPmVuYzsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlY29kZXJfbmFtZSAgID0gIj8iOworICAgICAgICAgICAgY29uc3QgY2hhciAqaW5fY29kZWNfbmFtZSAgPSAiPyI7CisgICAgICAgICAgICBjb25zdCBjaGFyICplbmNvZGVyX25hbWUgICA9ICI/IjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm91dF9jb2RlY19uYW1lID0gIj8iOworICAgICAgICAgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2M7CisKKyAgICAgICAgICAgIGlmIChpbl9jb2RlYykgeworICAgICAgICAgICAgICAgIGRlY29kZXJfbmFtZSAgPSBpbl9jb2RlYy0+bmFtZTsKKyAgICAgICAgICAgICAgICBkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChpbl9jb2RlYy0+aWQpOworICAgICAgICAgICAgICAgIGlmIChkZXNjKQorICAgICAgICAgICAgICAgICAgICBpbl9jb2RlY19uYW1lID0gZGVzYy0+bmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChkZWNvZGVyX25hbWUsIGluX2NvZGVjX25hbWUpKQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX25hbWUgPSAibmF0aXZlIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dF9jb2RlYykgeworICAgICAgICAgICAgICAgIGVuY29kZXJfbmFtZSAgID0gb3V0X2NvZGVjLT5uYW1lOworICAgICAgICAgICAgICAgIGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KG91dF9jb2RlYy0+aWQpOworICAgICAgICAgICAgICAgIGlmIChkZXNjKQorICAgICAgICAgICAgICAgICAgICBvdXRfY29kZWNfbmFtZSA9IGRlc2MtPm5hbWU7CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoZW5jb2Rlcl9uYW1lLCBvdXRfY29kZWNfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGVuY29kZXJfbmFtZSA9ICJuYXRpdmUiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKCVzICglcykgLT4gJXMgKCVzKSkiLAorICAgICAgICAgICAgICAgICAgIGluX2NvZGVjX25hbWUsIGRlY29kZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICBvdXRfY29kZWNfbmFtZSwgZW5jb2Rlcl9uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJcbiIpOworICAgIH0KKworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBlcnJvcik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXRvbWljX3N0b3JlKCZ0cmFuc2NvZGVfaW5pdF9kb25lLCAxKTsKKworICAgIHJldHVybiAwOworfQorCisvKiBSZXR1cm4gMSBpZiB0aGVyZSByZW1haW4gc3RyZWFtcyB3aGVyZSBtb3JlIG91dHB1dCBpcyB3YW50ZWQsIDAgb3RoZXJ3aXNlLiAqLworc3RhdGljIGludCBuZWVkX291dHB1dCh2b2lkKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgICAgPSBvdXRwdXRfc3RyZWFtc1tpXTsKKyAgICAgICAgT3V0cHV0RmlsZSAqb2YgICAgICAgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKKyAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpvcyAgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XS0+Y3R4OworCisgICAgICAgIGlmIChvc3QtPmZpbmlzaGVkIHx8CisgICAgICAgICAgICAob3MtPnBiICYmIGF2aW9fdGVsbChvcy0+cGIpID49IG9mLT5saW1pdF9maWxlc2l6ZSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKG9zdC0+ZnJhbWVfbnVtYmVyID49IG9zdC0+bWF4X2ZyYW1lcykgeworICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2YtPmN0eC0+bmJfc3RyZWFtczsgaisrKQorICAgICAgICAgICAgICAgIGNsb3NlX291dHB1dF9zdHJlYW0ob3V0cHV0X3N0cmVhbXNbb2YtPm9zdF9pbmRleCArIGpdKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2VsZWN0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHByb2Nlc3MuCisgKgorICogQHJldHVybiAgc2VsZWN0ZWQgb3V0cHV0IHN0cmVhbSwgb3IgTlVMTCBpZiBub25lIGF2YWlsYWJsZQorICovCitzdGF0aWMgT3V0cHV0U3RyZWFtICpjaG9vc2Vfb3V0cHV0KHZvaWQpCit7CisgICAgaW50IGk7CisgICAgaW50NjRfdCBvcHRzX21pbiA9IElOVDY0X01BWDsKKyAgICBPdXRwdXRTdHJlYW0gKm9zdF9taW4gPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKKyAgICAgICAgaW50NjRfdCBvcHRzID0gb3N0LT5zdC0+Y3VyX2R0cyA9PSBBVl9OT1BUU19WQUxVRSA/IElOVDY0X01JTiA6CisgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShvc3QtPnN0LT5jdXJfZHRzLCBvc3QtPnN0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgIGlmIChvc3QtPnN0LT5jdXJfZHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgImN1cl9kdHMgaXMgaW52YWxpZCAodGhpcyBpcyBoYXJtbGVzcyBpZiBpdCBvY2N1cnMgb25jZSBhdCB0aGUgc3RhcnQgcGVyIHN0cmVhbSlcbiIpOworCisgICAgICAgIGlmICghb3N0LT5pbml0aWFsaXplZCAmJiAhb3N0LT5pbnB1dHNfZG9uZSkKKyAgICAgICAgICAgIHJldHVybiBvc3Q7CisKKyAgICAgICAgaWYgKCFvc3QtPmZpbmlzaGVkICYmIG9wdHMgPCBvcHRzX21pbikgeworICAgICAgICAgICAgb3B0c19taW4gPSBvcHRzOworICAgICAgICAgICAgb3N0X21pbiAgPSBvc3QtPnVuYXZhaWxhYmxlID8gTlVMTCA6IG9zdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gb3N0X21pbjsKK30KKworc3RhdGljIHZvaWQgc2V0X3R0eV9lY2hvKGludCBvbikKK3sKKyNpZiBIQVZFX1RFUk1JT1NfSAorICAgIHN0cnVjdCB0ZXJtaW9zIHR0eTsKKyAgICBpZiAodGNnZXRhdHRyKDAsICZ0dHkpID09IDApIHsKKyAgICAgICAgaWYgKG9uKSB0dHkuY19sZmxhZyB8PSBFQ0hPOworICAgICAgICBlbHNlICAgIHR0eS5jX2xmbGFnICY9IH5FQ0hPOworICAgICAgICB0Y3NldGF0dHIoMCwgVENTQU5PVywgJnR0eSk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgY2hlY2tfa2V5Ym9hcmRfaW50ZXJhY3Rpb24oaW50NjRfdCBjdXJfdGltZSkKK3sKKyAgICBpbnQgaSwgcmV0LCBrZXk7CisgICAgc3RhdGljIGludDY0X3QgbGFzdF90aW1lOworICAgIGlmIChyZWNlaXZlZF9uYl9zaWduYWxzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIC8qIHJlYWRfa2V5KCkgcmV0dXJucyAwIG9uIEVPRiAqLworICAgIGlmKGN1cl90aW1lIC0gbGFzdF90aW1lID49IDEwMDAwMCAmJiAhcnVuX2FzX2RhZW1vbil7CisgICAgICAgIGtleSA9ICByZWFkX2tleSgpOworICAgICAgICBsYXN0X3RpbWUgPSBjdXJfdGltZTsKKyAgICB9ZWxzZQorICAgICAgICBrZXkgPSAtMTsKKyAgICBpZiAoa2V5ID09ICdxJykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKKyAgICBpZiAoa2V5ID09ICcrJykgYXZfbG9nX3NldF9sZXZlbChhdl9sb2dfZ2V0X2xldmVsKCkrMTApOworICAgIGlmIChrZXkgPT0gJy0nKSBhdl9sb2dfc2V0X2xldmVsKGF2X2xvZ19nZXRfbGV2ZWwoKS0xMCk7CisgICAgaWYgKGtleSA9PSAncycpIHFwX2hpc3QgICAgIF49IDE7CisgICAgaWYgKGtleSA9PSAnaCcpeworICAgICAgICBpZiAoZG9faGV4X2R1bXApeworICAgICAgICAgICAgZG9faGV4X2R1bXAgPSBkb19wa3RfZHVtcCA9IDA7CisgICAgICAgIH0gZWxzZSBpZihkb19wa3RfZHVtcCl7CisgICAgICAgICAgICBkb19oZXhfZHVtcCA9IDE7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZG9fcGt0X2R1bXAgPSAxOworICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisgICAgfQorICAgIGlmIChrZXkgPT0gJ2MnIHx8IGtleSA9PSAnQycpeworICAgICAgICBjaGFyIGJ1Zls0MDk2XSwgdGFyZ2V0WzY0XSwgY29tbWFuZFsyNTZdLCBhcmdbMjU2XSA9IHswfTsKKyAgICAgICAgZG91YmxlIHRpbWU7CisgICAgICAgIGludCBrLCBuID0gMDsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbkVudGVyIGNvbW1hbmQ6IDx0YXJnZXQ+fGFsbCA8dGltZT58LTEgPGNvbW1hbmQ+WyA8YXJndW1lbnQ+XVxuIik7CisgICAgICAgIGkgPSAwOworICAgICAgICBzZXRfdHR5X2VjaG8oMSk7CisgICAgICAgIHdoaWxlICgoayA9IHJlYWRfa2V5KCkpICE9ICdcbicgJiYgayAhPSAnXHInICYmIGkgPCBzaXplb2YoYnVmKS0xKQorICAgICAgICAgICAgaWYgKGsgPiAwKQorICAgICAgICAgICAgICAgIGJ1ZltpKytdID0gazsKKyAgICAgICAgYnVmW2ldID0gMDsKKyAgICAgICAgc2V0X3R0eV9lY2hvKDApOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgICAgIGlmIChrID4gMCAmJgorICAgICAgICAgICAgKG4gPSBzc2NhbmYoYnVmLCAiJTYzW14gXSAlbGYgJTI1NVteIF0gJTI1NVteXG5dIiwgdGFyZ2V0LCAmdGltZSwgY29tbWFuZCwgYXJnKSkgPj0gMykgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIlByb2Nlc3NpbmcgY29tbWFuZCB0YXJnZXQ6JXMgdGltZTolZiBjb21tYW5kOiVzIGFyZzolcyIsCisgICAgICAgICAgICAgICAgICAgdGFyZ2V0LCB0aW1lLCBjb21tYW5kLCBhcmcpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2ZpbHRlcmdyYXBoczsgaSsrKSB7CisgICAgICAgICAgICAgICAgRmlsdGVyR3JhcGggKmZnID0gZmlsdGVyZ3JhcGhzW2ldOworICAgICAgICAgICAgICAgIGlmIChmZy0+Z3JhcGgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9zZW5kX2NvbW1hbmQoZmctPmdyYXBoLCB0YXJnZXQsIGNvbW1hbmQsIGFyZywgYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ2MnID8gQVZGSUxURVJfQ01EX0ZMQUdfT05FIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbW1hbmQgcmVwbHkgZm9yIHN0cmVhbSAlZDogcmV0OiVkIHJlczpcbiVzIiwgaSwgcmV0LCBidWYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleSA9PSAnYycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiUXVldWluZyBjb21tYW5kcyBvbmx5IG9uIGZpbHRlcnMgc3VwcG9ydGluZyB0aGUgc3BlY2lmaWMgY29tbWFuZCBpcyB1bnN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX3F1ZXVlX2NvbW1hbmQoZmctPmdyYXBoLCB0YXJnZXQsIGNvbW1hbmQsIGFyZywgMCwgdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlF1ZXVpbmcgY29tbWFuZCBmYWlsZWQgd2l0aCBlcnJvciAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlBhcnNlIGVycm9yLCBhdCBsZWFzdCAzIGFyZ3VtZW50cyB3ZXJlIGV4cGVjdGVkLCAiCisgICAgICAgICAgICAgICAgICAgIm9ubHkgJWQgZ2l2ZW4gaW4gc3RyaW5nICclcydcbiIsIG4sIGJ1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGtleSA9PSAnZCcgfHwga2V5ID09ICdEJyl7CisgICAgICAgIGludCBkZWJ1Zz0wOworICAgICAgICBpZihrZXkgPT0gJ0QnKSB7CisgICAgICAgICAgICBkZWJ1ZyA9IGlucHV0X3N0cmVhbXNbMF0tPnN0LT5jb2RlYy0+ZGVidWc8PDE7CisgICAgICAgICAgICBpZighZGVidWcpIGRlYnVnID0gMTsKKyAgICAgICAgICAgIHdoaWxlKGRlYnVnICYgKEZGX0RFQlVHX0RDVF9DT0VGRgorI2lmIEZGX0FQSV9ERUJVR19NVgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfEZGX0RFQlVHX1ZJU19RUHxGRl9ERUJVR19WSVNfTUJfVFlQRQorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkgLy91bnN1cHBvcnRlZCwgd291bGQganVzdCBjcmFzaAorICAgICAgICAgICAgICAgIGRlYnVnICs9IGRlYnVnOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgICAgIGludCBrID0gMDsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgc2V0X3R0eV9lY2hvKDEpOworICAgICAgICAgICAgd2hpbGUgKChrID0gcmVhZF9rZXkoKSkgIT0gJ1xuJyAmJiBrICE9ICdccicgJiYgaSA8IHNpemVvZihidWYpLTEpCisgICAgICAgICAgICAgICAgaWYgKGsgPiAwKQorICAgICAgICAgICAgICAgICAgICBidWZbaSsrXSA9IGs7CisgICAgICAgICAgICBidWZbaV0gPSAwOworICAgICAgICAgICAgc2V0X3R0eV9lY2hvKDApOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgICAgICAgICAgaWYgKGsgPD0gMCB8fCBzc2NhbmYoYnVmLCAiJWQiLCAmZGVidWcpIT0xKQorICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJlcnJvciBwYXJzaW5nIGRlYnVnIHZhbHVlXG4iKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoaT0wO2k8bmJfaW5wdXRfc3RyZWFtcztpKyspIHsKKyAgICAgICAgICAgIGlucHV0X3N0cmVhbXNbaV0tPnN0LT5jb2RlYy0+ZGVidWcgPSBkZWJ1ZzsKKyAgICAgICAgfQorICAgICAgICBmb3IoaT0wO2k8bmJfb3V0cHV0X3N0cmVhbXM7aSsrKSB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOworICAgICAgICAgICAgb3N0LT5lbmNfY3R4LT5kZWJ1ZyA9IGRlYnVnOworICAgICAgICB9CisgICAgICAgIGlmKGRlYnVnKSBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCJkZWJ1Zz0lZFxuIiwgZGVidWcpOworICAgIH0KKyAgICBpZiAoa2V5ID09ICc/Jyl7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAia2V5ICAgIGZ1bmN0aW9uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiPyAgICAgIHNob3cgdGhpcyBoZWxwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiKyAgICAgIGluY3JlYXNlIHZlcmJvc2l0eVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIi0gICAgICBkZWNyZWFzZSB2ZXJib3NpdHlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJjICAgICAgU2VuZCBjb21tYW5kIHRvIGZpcnN0IG1hdGNoaW5nIGZpbHRlciBzdXBwb3J0aW5nIGl0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiQyAgICAgIFNlbmQvUXVldWUgY29tbWFuZCB0byBhbGwgbWF0Y2hpbmcgZmlsdGVyc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIkQgICAgICBjeWNsZSB0aHJvdWdoIGF2YWlsYWJsZSBkZWJ1ZyBtb2Rlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgImggICAgICBkdW1wIHBhY2tldHMvaGV4IHByZXNzIHRvIGN5Y2xlIHRocm91Z2ggdGhlIDMgc3RhdGVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAicSAgICAgIHF1aXRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzICAgICAgU2hvdyBRUCBoaXN0b2dyYW1cbiIKKyAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBIQVZFX1RIUkVBRFMKK3N0YXRpYyB2b2lkICppbnB1dF90aHJlYWQodm9pZCAqYXJnKQoreworICAgIElucHV0RmlsZSAqZiA9IGFyZzsKKyAgICB1bnNpZ25lZCBmbGFncyA9IGYtPm5vbl9ibG9ja2luZyA/IEFWX1RIUkVBRF9NRVNTQUdFX05PTkJMT0NLIDogMDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIEFWUGFja2V0IHBrdDsKKyAgICAgICAgcmV0ID0gYXZfcmVhZF9mcmFtZShmLT5jdHgsICZwa3QpOworCisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICBhdl91c2xlZXAoMTAwMDApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfcmVjdihmLT5pbl90aHJlYWRfcXVldWUsIHJldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZW5kKGYtPmluX3RocmVhZF9xdWV1ZSwgJnBrdCwgZmxhZ3MpOworICAgICAgICBpZiAoZmxhZ3MgJiYgcmV0ID09IEFWRVJST1IoRUFHQUlOKSkgeworICAgICAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICAgICAgcmV0ID0gYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2VuZChmLT5pbl90aHJlYWRfcXVldWUsICZwa3QsIGZsYWdzKTsKKyAgICAgICAgICAgIGF2X2xvZyhmLT5jdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJUaHJlYWQgbWVzc2FnZSBxdWV1ZSBibG9ja2luZzsgY29uc2lkZXIgcmFpc2luZyB0aGUgIgorICAgICAgICAgICAgICAgICAgICJ0aHJlYWRfcXVldWVfc2l6ZSBvcHRpb24gKGN1cnJlbnQgdmFsdWU6ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBmLT50aHJlYWRfcXVldWVfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgYXZfbG9nKGYtPmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNlbmQgcGFja2V0IHRvIG1haW4gdGhyZWFkOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKKyAgICAgICAgICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfcmVjdihmLT5pbl90aHJlYWRfcXVldWUsIHJldCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2lucHV0X3RocmVhZChpbnQgaSkKK3sKKyAgICBJbnB1dEZpbGUgKmYgPSBpbnB1dF9maWxlc1tpXTsKKyAgICBBVlBhY2tldCBwa3Q7CisKKyAgICBpZiAoIWYgfHwgIWYtPmluX3RocmVhZF9xdWV1ZSkKKyAgICAgICAgcmV0dXJuOworICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfc2VuZChmLT5pbl90aHJlYWRfcXVldWUsIEFWRVJST1JfRU9GKTsKKyAgICB3aGlsZSAoYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfcmVjdihmLT5pbl90aHJlYWRfcXVldWUsICZwa3QsIDApID49IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKKworICAgIHB0aHJlYWRfam9pbihmLT50aHJlYWQsIE5VTEwpOworICAgIGYtPmpvaW5lZCA9IDE7CisgICAgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfZnJlZSgmZi0+aW5fdGhyZWFkX3F1ZXVlKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9pbnB1dF90aHJlYWRzKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5wdXRfZmlsZXM7IGkrKykKKyAgICAgICAgZnJlZV9pbnB1dF90aHJlYWQoaSk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9pbnB1dF90aHJlYWQoaW50IGkpCit7CisgICAgaW50IHJldDsKKyAgICBJbnB1dEZpbGUgKmYgPSBpbnB1dF9maWxlc1tpXTsKKworICAgIGlmIChuYl9pbnB1dF9maWxlcyA9PSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChmLT5jdHgtPnBiID8gIWYtPmN0eC0+cGItPnNlZWthYmxlIDoKKyAgICAgICAgc3RyY21wKGYtPmN0eC0+aWZvcm1hdC0+bmFtZSwgImxhdmZpIikpCisgICAgICAgIGYtPm5vbl9ibG9ja2luZyA9IDE7CisgICAgcmV0ID0gYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfYWxsb2MoJmYtPmluX3RocmVhZF9xdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT50aHJlYWRfcXVldWVfc2l6ZSwgc2l6ZW9mKEFWUGFja2V0KSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IHB0aHJlYWRfY3JlYXRlKCZmLT50aHJlYWQsIE5VTEwsIGlucHV0X3RocmVhZCwgZikpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQ6ICVzLiBUcnkgdG8gaW5jcmVhc2UgYHVsaW1pdCAtdmAgb3IgZGVjcmVhc2UgYHVsaW1pdCAtc2AuXG4iLCBzdHJlcnJvcihyZXQpKTsKKyAgICAgICAgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfZnJlZSgmZi0+aW5fdGhyZWFkX3F1ZXVlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IocmV0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X2lucHV0X3RocmVhZHModm9pZCkKK3sKKyAgICBpbnQgaSwgcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X2ZpbGVzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gaW5pdF9pbnB1dF90aHJlYWQoaSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2lucHV0X3BhY2tldF9tdChJbnB1dEZpbGUgKmYsIEFWUGFja2V0ICpwa3QpCit7CisgICAgcmV0dXJuIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3JlY3YoZi0+aW5fdGhyZWFkX3F1ZXVlLCBwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+bm9uX2Jsb2NraW5nID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USFJFQURfTUVTU0FHRV9OT05CTE9DSyA6IDApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZ2V0X2lucHV0X3BhY2tldChJbnB1dEZpbGUgKmYsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaWYgKGYtPnJhdGVfZW11KSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSAqaXN0ID0gaW5wdXRfc3RyZWFtc1tmLT5pc3RfaW5kZXggKyBpXTsKKyAgICAgICAgICAgIGludDY0X3QgcHRzID0gYXZfcmVzY2FsZShpc3QtPmR0cywgMTAwMDAwMCwgQVZfVElNRV9CQVNFKTsKKyAgICAgICAgICAgIGludDY0X3Qgbm93ID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gaXN0LT5zdGFydDsKKyAgICAgICAgICAgIGlmIChwdHMgPiBub3cpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgfQorICAgIH0KKworI2lmIEhBVkVfVEhSRUFEUworICAgIGlmIChuYl9pbnB1dF9maWxlcyA+IDEpCisgICAgICAgIHJldHVybiBnZXRfaW5wdXRfcGFja2V0X210KGYsIHBrdCk7CisjZW5kaWYKKyAgICByZXR1cm4gYXZfcmVhZF9mcmFtZShmLT5jdHgsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgZ290X2VhZ2Fpbih2b2lkKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKQorICAgICAgICBpZiAob3V0cHV0X3N0cmVhbXNbaV0tPnVuYXZhaWxhYmxlKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2V0X2VhZ2Fpbih2b2lkKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9maWxlczsgaSsrKQorICAgICAgICBpbnB1dF9maWxlc1tpXS0+ZWFnYWluID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykKKyAgICAgICAgb3V0cHV0X3N0cmVhbXNbaV0tPnVuYXZhaWxhYmxlID0gMDsKK30KKworLy8gc2V0IGR1cmF0aW9uIHRvIG1heCh0bXAsIGR1cmF0aW9uKSBpbiBhIHByb3BlciB0aW1lIGJhc2UgYW5kIHJldHVybiBkdXJhdGlvbidzIHRpbWVfYmFzZQorc3RhdGljIEFWUmF0aW9uYWwgZHVyYXRpb25fbWF4KGludDY0X3QgdG1wLCBpbnQ2NF90ICpkdXJhdGlvbiwgQVZSYXRpb25hbCB0bXBfdGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCEqZHVyYXRpb24pIHsKKyAgICAgICAgKmR1cmF0aW9uID0gdG1wOworICAgICAgICByZXR1cm4gdG1wX3RpbWVfYmFzZTsKKyAgICB9CisKKyAgICByZXQgPSBhdl9jb21wYXJlX3RzKCpkdXJhdGlvbiwgdGltZV9iYXNlLCB0bXAsIHRtcF90aW1lX2Jhc2UpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICpkdXJhdGlvbiA9IHRtcDsKKyAgICAgICAgcmV0dXJuIHRtcF90aW1lX2Jhc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRpbWVfYmFzZTsKK30KKworc3RhdGljIGludCBzZWVrX3RvX3N0YXJ0KElucHV0RmlsZSAqaWZpbGUsIEFWRm9ybWF0Q29udGV4dCAqaXMpCit7CisgICAgSW5wdXRTdHJlYW0gKmlzdDsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgaW50IGksIHJldCwgaGFzX2F1ZGlvID0gMDsKKyAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKKworICAgIHJldCA9IGF2X3NlZWtfZnJhbWUoaXMsIC0xLCBpcy0+c3RhcnRfdGltZSwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWZpbGUtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpc3QgICA9IGlucHV0X3N0cmVhbXNbaWZpbGUtPmlzdF9pbmRleCArIGldOworICAgICAgICBhdmN0eCA9IGlzdC0+ZGVjX2N0eDsKKworICAgICAgICAvKiBkdXJhdGlvbiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IGZyYW1lIGluIGEgc3RyZWFtCisgICAgICAgICAqIHdoZW4gYXVkaW8gc3RyZWFtIGlzIHByZXNlbnQgd2UgZG9uJ3QgY2FyZSBhYm91dAorICAgICAgICAgKiBsYXN0IHZpZGVvIGZyYW1lIGxlbmd0aCBiZWNhdXNlIGl0J3Mgbm90IGRlZmluZWQgZXhhY3RseSAqLworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIGlzdC0+bmJfc2FtcGxlcykKKyAgICAgICAgICAgIGhhc19hdWRpbyA9IDE7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGlmaWxlLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaXN0ICAgPSBpbnB1dF9zdHJlYW1zW2lmaWxlLT5pc3RfaW5kZXggKyBpXTsKKyAgICAgICAgYXZjdHggPSBpc3QtPmRlY19jdHg7CisKKyAgICAgICAgaWYgKGhhc19hdWRpbykgeworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJiBpc3QtPm5iX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHNhbXBsZV9yYXRlID0gezEsIGF2Y3R4LT5zYW1wbGVfcmF0ZX07CisKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShpc3QtPm5iX3NhbXBsZXMsIHNhbXBsZV9yYXRlLCBpc3QtPnN0LT50aW1lX2Jhc2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpc3QtPmZyYW1lcmF0ZS5udW0pIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcSgxLCBhdl9pbnZfcShpc3QtPmZyYW1lcmF0ZSksIGlzdC0+c3QtPnRpbWVfYmFzZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzdC0+c3QtPmF2Z19mcmFtZV9yYXRlLm51bSkgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gYXZfcmVzY2FsZV9xKDEsIGF2X2ludl9xKGlzdC0+c3QtPmF2Z19mcmFtZV9yYXRlKSwgaXN0LT5zdC0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHVyYXRpb24gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghaWZpbGUtPmR1cmF0aW9uKQorICAgICAgICAgICAgaWZpbGUtPnRpbWVfYmFzZSA9IGlzdC0+c3QtPnRpbWVfYmFzZTsKKyAgICAgICAgLyogdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBzdHJlYW0sIG1heF9wdHMgLSBtaW5fcHRzIGlzCisgICAgICAgICAqIHRoZSBkdXJhdGlvbiBvZiB0aGUgc3RyZWFtIHdpdGhvdXQgdGhlIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgZHVyYXRpb24gKz0gaXN0LT5tYXhfcHRzIC0gaXN0LT5taW5fcHRzOworICAgICAgICBpZmlsZS0+dGltZV9iYXNlID0gZHVyYXRpb25fbWF4KGR1cmF0aW9uLCAmaWZpbGUtPmR1cmF0aW9uLCBpc3QtPnN0LT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZpbGUtPnRpbWVfYmFzZSk7CisgICAgfQorCisgICAgaWYgKGlmaWxlLT5sb29wID4gMCkKKyAgICAgICAgaWZpbGUtPmxvb3AtLTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZXR1cm4KKyAqIC0gMCAtLSBvbmUgcGFja2V0IHdhcyByZWFkIGFuZCBwcm9jZXNzZWQKKyAqIC0gQVZFUlJPUihFQUdBSU4pIC0tIG5vIHBhY2tldHMgd2VyZSBhdmFpbGFibGUgZm9yIHNlbGVjdGVkIGZpbGUsCisgKiAgIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbgorICogLSBBVkVSUk9SX0VPRiAtLSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGFnYWluCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19pbnB1dChpbnQgZmlsZV9pbmRleCkKK3sKKyAgICBJbnB1dEZpbGUgKmlmaWxlID0gaW5wdXRfZmlsZXNbZmlsZV9pbmRleF07CisgICAgQVZGb3JtYXRDb250ZXh0ICppczsKKyAgICBJbnB1dFN0cmVhbSAqaXN0OworICAgIEFWUGFja2V0IHBrdDsKKyAgICBpbnQgcmV0LCB0aHJlYWRfcmV0LCBpLCBqOworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50NjRfdCBwa3RfZHRzOworCisgICAgaXMgID0gaWZpbGUtPmN0eDsKKyAgICByZXQgPSBnZXRfaW5wdXRfcGFja2V0KGlmaWxlLCAmcGt0KTsKKworICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgIGlmaWxlLT5lYWdhaW4gPSAxOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAocmV0IDwgMCAmJiBpZmlsZS0+bG9vcCkgeworICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpZmlsZS0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW2lmaWxlLT5pc3RfaW5kZXggKyBpXTsKKyAgICAgICAgICAgIGF2Y3R4ID0gaXN0LT5kZWNfY3R4OworICAgICAgICAgICAgaWYgKGlzdC0+ZGVjb2RpbmdfbmVlZGVkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc19pbnB1dF9wYWNrZXQoaXN0LCBOVUxMLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0PjApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhhdmN0eCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZiBIQVZFX1RIUkVBRFMKKyAgICAgICAgZnJlZV9pbnB1dF90aHJlYWQoZmlsZV9pbmRleCk7CisjZW5kaWYKKyAgICAgICAgcmV0ID0gc2Vla190b19zdGFydChpZmlsZSwgaXMpOworI2lmIEhBVkVfVEhSRUFEUworICAgICAgICB0aHJlYWRfcmV0ID0gaW5pdF9pbnB1dF90aHJlYWQoZmlsZV9pbmRleCk7CisgICAgICAgIGlmICh0aHJlYWRfcmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiB0aHJlYWRfcmV0OworI2VuZGlmCisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiU2VlayB0byBzdGFydCBmYWlsZWQuXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gZ2V0X2lucHV0X3BhY2tldChpZmlsZSwgJnBrdCk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICBpZmlsZS0+ZWFnYWluID0gMTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgcHJpbnRfZXJyb3IoaXMtPnVybCwgcmV0KTsKKyAgICAgICAgICAgIGlmIChleGl0X29uX2Vycm9yKQorICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpZmlsZS0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW2lmaWxlLT5pc3RfaW5kZXggKyBpXTsKKyAgICAgICAgICAgIGlmIChpc3QtPmRlY29kaW5nX25lZWRlZCkgeworICAgICAgICAgICAgICAgIHJldCA9IHByb2Nlc3NfaW5wdXRfcGFja2V0KGlzdCwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHJldD4wKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbWFyayBhbGwgb3V0cHV0cyB0aGF0IGRvbid0IGdvIHRocm91Z2ggbGF2ZmkgYXMgZmluaXNoZWQgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9vdXRwdXRfc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvdXRwdXRfc3RyZWFtc1tqXTsKKworICAgICAgICAgICAgICAgIGlmIChvc3QtPnNvdXJjZV9pbmRleCA9PSBpZmlsZS0+aXN0X2luZGV4ICsgaSAmJgorICAgICAgICAgICAgICAgICAgICAob3N0LT5zdHJlYW1fY29weSB8fCBvc3QtPmVuYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpKQorICAgICAgICAgICAgICAgICAgICBmaW5pc2hfb3V0cHV0X3N0cmVhbShvc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWZpbGUtPmVvZl9yZWFjaGVkID0gMTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICByZXNldF9lYWdhaW4oKTsKKworICAgIGlmIChkb19wa3RfZHVtcCkgeworICAgICAgICBhdl9wa3RfZHVtcF9sb2cyKE5VTEwsIEFWX0xPR19JTkZPLCAmcGt0LCBkb19oZXhfZHVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcy0+c3RyZWFtc1twa3Quc3RyZWFtX2luZGV4XSk7CisgICAgfQorICAgIC8qIHRoZSBmb2xsb3dpbmcgdGVzdCBpcyBuZWVkZWQgaW4gY2FzZSBuZXcgc3RyZWFtcyBhcHBlYXIKKyAgICAgICBkeW5hbWljYWxseSBpbiBzdHJlYW0gOiB3ZSBpZ25vcmUgdGhlbSAqLworICAgIGlmIChwa3Quc3RyZWFtX2luZGV4ID49IGlmaWxlLT5uYl9zdHJlYW1zKSB7CisgICAgICAgIHJlcG9ydF9uZXdfc3RyZWFtKGZpbGVfaW5kZXgsICZwa3QpOworICAgICAgICBnb3RvIGRpc2NhcmRfcGFja2V0OworICAgIH0KKworICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbaWZpbGUtPmlzdF9pbmRleCArIHBrdC5zdHJlYW1faW5kZXhdOworCisgICAgaXN0LT5kYXRhX3NpemUgKz0gcGt0LnNpemU7CisgICAgaXN0LT5uYl9wYWNrZXRzKys7CisKKyAgICBpZiAoaXN0LT5kaXNjYXJkKQorICAgICAgICBnb3RvIGRpc2NhcmRfcGFja2V0OworCisgICAgaWYgKGV4aXRfb25fZXJyb3IgJiYgKHBrdC5mbGFncyAmIEFWX1BLVF9GTEFHX0NPUlJVUFQpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlczogY29ycnVwdCBpbnB1dCBwYWNrZXQgaW4gc3RyZWFtICVkXG4iLCBpcy0+dXJsLCBwa3Quc3RyZWFtX2luZGV4KTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGlmIChkZWJ1Z190cykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJkZW11eGVyIC0+IGlzdF9pbmRleDolZCB0eXBlOiVzICIKKyAgICAgICAgICAgICAgICJuZXh0X2R0czolcyBuZXh0X2R0c190aW1lOiVzIG5leHRfcHRzOiVzIG5leHRfcHRzX3RpbWU6JXMgcGt0X3B0czolcyBwa3RfcHRzX3RpbWU6JXMgcGt0X2R0czolcyBwa3RfZHRzX3RpbWU6JXMgb2ZmOiVzIG9mZl90aW1lOiVzXG4iLAorICAgICAgICAgICAgICAgaWZpbGUtPmlzdF9pbmRleCArIHBrdC5zdHJlYW1faW5kZXgsIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGUpLAorICAgICAgICAgICAgICAgYXZfdHMyc3RyKGlzdC0+bmV4dF9kdHMpLCBhdl90czJ0aW1lc3RyKGlzdC0+bmV4dF9kdHMsICZBVl9USU1FX0JBU0VfUSksCisgICAgICAgICAgICAgICBhdl90czJzdHIoaXN0LT5uZXh0X3B0cyksIGF2X3RzMnRpbWVzdHIoaXN0LT5uZXh0X3B0cywgJkFWX1RJTUVfQkFTRV9RKSwKKyAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QucHRzKSwgYXZfdHMydGltZXN0cihwa3QucHRzLCAmaXN0LT5zdC0+dGltZV9iYXNlKSwKKyAgICAgICAgICAgICAgIGF2X3RzMnN0cihwa3QuZHRzKSwgYXZfdHMydGltZXN0cihwa3QuZHRzLCAmaXN0LT5zdC0+dGltZV9iYXNlKSwKKyAgICAgICAgICAgICAgIGF2X3RzMnN0cihpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT50c19vZmZzZXQpLAorICAgICAgICAgICAgICAgYXZfdHMydGltZXN0cihpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT50c19vZmZzZXQsICZBVl9USU1FX0JBU0VfUSkpOworICAgIH0KKworICAgIGlmKCFpc3QtPndyYXBfY29ycmVjdGlvbl9kb25lICYmIGlzLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFICYmIGlzdC0+c3QtPnB0c193cmFwX2JpdHMgPCA2NCl7CisgICAgICAgIGludDY0X3Qgc3RpbWUsIHN0aW1lMjsKKyAgICAgICAgLy8gQ29ycmVjdGluZyBzdGFydHRpbWUgYmFzZWQgb24gdGhlIGVuYWJsZWQgc3RyZWFtcworICAgICAgICAvLyBGSVhNRSB0aGlzIGlkZWFsbHkgc2hvdWxkIGJlIGRvbmUgYmVmb3JlIHRoZSBmaXJzdCB1c2Ugb2Ygc3RhcnR0aW1lIGJ1dCB3ZSBkbyBub3Qga25vdyB3aGljaCBhcmUgdGhlIGVuYWJsZWQgc3RyZWFtcyBhdCB0aGF0IHBvaW50LgorICAgICAgICAvLyAgICAgICBzbyB3ZSBpbnN0ZWFkIGRvIGl0IGhlcmUgYXMgcGFydCBvZiBkaXNjb250aW51aXR5IGhhbmRsaW5nCisgICAgICAgIGlmICggICBpc3QtPm5leHRfZHRzID09IEFWX05PUFRTX1ZBTFVFCisgICAgICAgICAgICAmJiBpZmlsZS0+dHNfb2Zmc2V0ID09IC1pcy0+c3RhcnRfdGltZQorICAgICAgICAgICAgJiYgKGlzLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX1RTX0RJU0NPTlQpKSB7CisgICAgICAgICAgICBpbnQ2NF90IG5ld19zdGFydF90aW1lID0gSU5UNjRfTUFYOworICAgICAgICAgICAgZm9yIChpPTA7IGk8aXMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IGlzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIGlmKHN0LT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwgfHwgc3QtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIG5ld19zdGFydF90aW1lID0gRkZNSU4obmV3X3N0YXJ0X3RpbWUsIGF2X3Jlc2NhbGVfcShzdC0+c3RhcnRfdGltZSwgc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXdfc3RhcnRfdGltZSA+IGlzLT5zdGFydF90aW1lKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGlzLCBBVl9MT0dfVkVSQk9TRSwgIkNvcnJlY3Rpbmcgc3RhcnQgdGltZSBieSAlIlBSSWQ2NCJcbiIsIG5ld19zdGFydF90aW1lIC0gaXMtPnN0YXJ0X3RpbWUpOworICAgICAgICAgICAgICAgIGlmaWxlLT50c19vZmZzZXQgPSAtbmV3X3N0YXJ0X3RpbWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGltZSA9IGF2X3Jlc2NhbGVfcShpcy0+c3RhcnRfdGltZSwgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7CisgICAgICAgIHN0aW1lMj0gc3RpbWUgKyAoMVVMTDw8aXN0LT5zdC0+cHRzX3dyYXBfYml0cyk7CisgICAgICAgIGlzdC0+d3JhcF9jb3JyZWN0aW9uX2RvbmUgPSAxOworCisgICAgICAgIGlmKHN0aW1lMiA+IHN0aW1lICYmIHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LmR0cyA+IHN0aW1lICsgKDFMTDw8KGlzdC0+c3QtPnB0c193cmFwX2JpdHMtMSkpKSB7CisgICAgICAgICAgICBwa3QuZHRzIC09IDFVTEw8PGlzdC0+c3QtPnB0c193cmFwX2JpdHM7CisgICAgICAgICAgICBpc3QtPndyYXBfY29ycmVjdGlvbl9kb25lID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZihzdGltZTIgPiBzdGltZSAmJiBwa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHBrdC5wdHMgPiBzdGltZSArICgxTEw8PChpc3QtPnN0LT5wdHNfd3JhcF9iaXRzLTEpKSkgeworICAgICAgICAgICAgcGt0LnB0cyAtPSAxVUxMPDxpc3QtPnN0LT5wdHNfd3JhcF9iaXRzOworICAgICAgICAgICAgaXN0LT53cmFwX2NvcnJlY3Rpb25fZG9uZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBhZGQgdGhlIHN0cmVhbS1nbG9iYWwgc2lkZSBkYXRhIHRvIHRoZSBmaXJzdCBwYWNrZXQgKi8KKyAgICBpZiAoaXN0LT5uYl9wYWNrZXRzID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGlzdC0+c3QtPm5iX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgICAgICBBVlBhY2tldFNpZGVEYXRhICpzcmNfc2QgPSAmaXN0LT5zdC0+c2lkZV9kYXRhW2ldOworICAgICAgICAgICAgdWludDhfdCAqZHN0X2RhdGE7CisKKyAgICAgICAgICAgIGlmIChzcmNfc2QtPnR5cGUgPT0gQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKCZwa3QsIHNyY19zZC0+dHlwZSwgTlVMTCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGRzdF9kYXRhID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEoJnBrdCwgc3JjX3NkLT50eXBlLCBzcmNfc2QtPnNpemUpOworICAgICAgICAgICAgaWYgKCFkc3RfZGF0YSkKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisKKyAgICAgICAgICAgIG1lbWNweShkc3RfZGF0YSwgc3JjX3NkLT5kYXRhLCBzcmNfc2QtPnNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHBrdC5kdHMgKz0gYXZfcmVzY2FsZV9xKGlmaWxlLT50c19vZmZzZXQsIEFWX1RJTUVfQkFTRV9RLCBpc3QtPnN0LT50aW1lX2Jhc2UpOworICAgIGlmIChwa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBwa3QucHRzICs9IGF2X3Jlc2NhbGVfcShpZmlsZS0+dHNfb2Zmc2V0LCBBVl9USU1FX0JBU0VfUSwgaXN0LT5zdC0+dGltZV9iYXNlKTsKKworICAgIGlmIChwa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBwa3QucHRzICo9IGlzdC0+dHNfc2NhbGU7CisgICAgaWYgKHBrdC5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHBrdC5kdHMgKj0gaXN0LT50c19zY2FsZTsKKworICAgIHBrdF9kdHMgPSBhdl9yZXNjYWxlX3Ffcm5kKHBrdC5kdHMsIGlzdC0+c3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EsIEFWX1JPVU5EX05FQVJfSU5GfEFWX1JPVU5EX1BBU1NfTUlOTUFYKTsKKyAgICBpZiAoKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgIGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pICYmCisgICAgICAgIHBrdF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgaXN0LT5uZXh0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSAmJiAhY29weV90cworICAgICAgICAmJiAoaXMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfVFNfRElTQ09OVCkgJiYgaWZpbGUtPmxhc3RfdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaW50NjRfdCBkZWx0YSAgID0gcGt0X2R0cyAtIGlmaWxlLT5sYXN0X3RzOworICAgICAgICBpZiAoZGVsdGEgPCAtMUxMKmR0c19kZWx0YV90aHJlc2hvbGQqQVZfVElNRV9CQVNFIHx8CisgICAgICAgICAgICBkZWx0YSA+ICAxTEwqZHRzX2RlbHRhX3RocmVzaG9sZCpBVl9USU1FX0JBU0UpeworICAgICAgICAgICAgaWZpbGUtPnRzX29mZnNldCAtPSBkZWx0YTsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgIkludGVyIHN0cmVhbSB0aW1lc3RhbXAgZGlzY29udGludWl0eSAlIlBSSWQ2NCIsIG5ldyBvZmZzZXQ9ICUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgICAgICAgICBkZWx0YSwgaWZpbGUtPnRzX29mZnNldCk7CisgICAgICAgICAgICBwa3QuZHRzIC09IGF2X3Jlc2NhbGVfcShkZWx0YSwgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7CisgICAgICAgICAgICBpZiAocGt0LnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICBwa3QucHRzIC09IGF2X3Jlc2NhbGVfcShkZWx0YSwgQVZfVElNRV9CQVNFX1EsIGlzdC0+c3QtPnRpbWVfYmFzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShpZmlsZS0+ZHVyYXRpb24sIGlmaWxlLT50aW1lX2Jhc2UsIGlzdC0+c3QtPnRpbWVfYmFzZSk7CisgICAgaWYgKHBrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgcGt0LnB0cyArPSBkdXJhdGlvbjsKKyAgICAgICAgaXN0LT5tYXhfcHRzID0gRkZNQVgocGt0LnB0cywgaXN0LT5tYXhfcHRzKTsKKyAgICAgICAgaXN0LT5taW5fcHRzID0gRkZNSU4ocGt0LnB0cywgaXN0LT5taW5fcHRzKTsKKyAgICB9CisKKyAgICBpZiAocGt0LmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcGt0LmR0cyArPSBkdXJhdGlvbjsKKworICAgIHBrdF9kdHMgPSBhdl9yZXNjYWxlX3Ffcm5kKHBrdC5kdHMsIGlzdC0+c3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EsIEFWX1JPVU5EX05FQVJfSU5GfEFWX1JPVU5EX1BBU1NfTUlOTUFYKTsKKyAgICBpZiAoKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgIGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pICYmCisgICAgICAgICBwa3RfZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIGlzdC0+bmV4dF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgIWNvcHlfdHMpIHsKKyAgICAgICAgaW50NjRfdCBkZWx0YSAgID0gcGt0X2R0cyAtIGlzdC0+bmV4dF9kdHM7CisgICAgICAgIGlmIChpcy0+aWZvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9UU19ESVNDT05UKSB7CisgICAgICAgICAgICBpZiAoZGVsdGEgPCAtMUxMKmR0c19kZWx0YV90aHJlc2hvbGQqQVZfVElNRV9CQVNFIHx8CisgICAgICAgICAgICAgICAgZGVsdGEgPiAgMUxMKmR0c19kZWx0YV90aHJlc2hvbGQqQVZfVElNRV9CQVNFIHx8CisgICAgICAgICAgICAgICAgcGt0X2R0cyArIEFWX1RJTUVfQkFTRS8xMCA8IEZGTUFYKGlzdC0+cHRzLCBpc3QtPmR0cykpIHsKKyAgICAgICAgICAgICAgICBpZmlsZS0+dHNfb2Zmc2V0IC09IGRlbHRhOworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgZGlzY29udGludWl0eSAlIlBSSWQ2NCIsIG5ldyBvZmZzZXQ9ICUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEsIGlmaWxlLT50c19vZmZzZXQpOworICAgICAgICAgICAgICAgIHBrdC5kdHMgLT0gYXZfcmVzY2FsZV9xKGRlbHRhLCBBVl9USU1FX0JBU0VfUSwgaXN0LT5zdC0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICBpZiAocGt0LnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgcGt0LnB0cyAtPSBhdl9yZXNjYWxlX3EoZGVsdGEsIEFWX1RJTUVfQkFTRV9RLCBpc3QtPnN0LT50aW1lX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBkZWx0YSA8IC0xTEwqZHRzX2Vycm9yX3RocmVzaG9sZCpBVl9USU1FX0JBU0UgfHwKKyAgICAgICAgICAgICAgICAgZGVsdGEgPiAgMUxMKmR0c19lcnJvcl90aHJlc2hvbGQqQVZfVElNRV9CQVNFKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiRFRTICUiUFJJZDY0IiwgbmV4dDolIlBSSWQ2NCIgc3Q6JWQgaW52YWxpZCBkcm9wcGluZ1xuIiwgcGt0LmR0cywgaXN0LT5uZXh0X2R0cywgcGt0LnN0cmVhbV9pbmRleCk7CisgICAgICAgICAgICAgICAgcGt0LmR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpeworICAgICAgICAgICAgICAgIGludDY0X3QgcGt0X3B0cyA9IGF2X3Jlc2NhbGVfcShwa3QucHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgICAgICAgICBkZWx0YSAgID0gcGt0X3B0cyAtIGlzdC0+bmV4dF9kdHM7CisgICAgICAgICAgICAgICAgaWYgKCBkZWx0YSA8IC0xTEwqZHRzX2Vycm9yX3RocmVzaG9sZCpBVl9USU1FX0JBU0UgfHwKKyAgICAgICAgICAgICAgICAgICAgIGRlbHRhID4gIDFMTCpkdHNfZXJyb3JfdGhyZXNob2xkKkFWX1RJTUVfQkFTRSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJQVFMgJSJQUklkNjQiLCBuZXh0OiUiUFJJZDY0IiBpbnZhbGlkIGRyb3BwaW5nIHN0OiVkXG4iLCBwa3QucHRzLCBpc3QtPm5leHRfZHRzLCBwa3Quc3RyZWFtX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcGt0LnB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwa3QuZHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBpZmlsZS0+bGFzdF90cyA9IGF2X3Jlc2NhbGVfcShwa3QuZHRzLCBpc3QtPnN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKworICAgIGlmIChkZWJ1Z190cykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJkZW11eGVyK2ZmbXBlZyAtPiBpc3RfaW5kZXg6JWQgdHlwZTolcyBwa3RfcHRzOiVzIHBrdF9wdHNfdGltZTolcyBwa3RfZHRzOiVzIHBrdF9kdHNfdGltZTolcyBvZmY6JXMgb2ZmX3RpbWU6JXNcbiIsCisgICAgICAgICAgICAgICBpZmlsZS0+aXN0X2luZGV4ICsgcGt0LnN0cmVhbV9pbmRleCwgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSksCisgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LnB0cyksIGF2X3RzMnRpbWVzdHIocGt0LnB0cywgJmlzdC0+c3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICBhdl90czJzdHIocGt0LmR0cyksIGF2X3RzMnRpbWVzdHIocGt0LmR0cywgJmlzdC0+c3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICBhdl90czJzdHIoaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+dHNfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIoaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+dHNfb2Zmc2V0LCAmQVZfVElNRV9CQVNFX1EpKTsKKyAgICB9CisKKyAgICBzdWIydmlkZW9faGVhcnRiZWF0KGlzdCwgcGt0LnB0cyk7CisKKyAgICBwcm9jZXNzX2lucHV0X3BhY2tldChpc3QsICZwa3QsIDApOworCitkaXNjYXJkX3BhY2tldDoKKyAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBQZXJmb3JtIGEgc3RlcCBvZiB0cmFuc2NvZGluZyBmb3IgdGhlIHNwZWNpZmllZCBmaWx0ZXIgZ3JhcGguCisgKgorICogQHBhcmFtW2luXSAgZ3JhcGggICAgIGZpbHRlciBncmFwaCB0byBjb25zaWRlcgorICogQHBhcmFtW291dF0gYmVzdF9pc3QgIGlucHV0IHN0cmVhbSB3aGVyZSBhIGZyYW1lIHdvdWxkIGFsbG93IHRvIGNvbnRpbnVlCisgKiBAcmV0dXJuICAwIGZvciBzdWNjZXNzLCA8MCBmb3IgZXJyb3IKKyAqLworc3RhdGljIGludCB0cmFuc2NvZGVfZnJvbV9maWx0ZXIoRmlsdGVyR3JhcGggKmdyYXBoLCBJbnB1dFN0cmVhbSAqKmJlc3RfaXN0KQoreworICAgIGludCBpLCByZXQ7CisgICAgaW50IG5iX3JlcXVlc3RzLCBuYl9yZXF1ZXN0c19tYXggPSAwOworICAgIElucHV0RmlsdGVyICppZmlsdGVyOworICAgIElucHV0U3RyZWFtICppc3Q7CisKKyAgICAqYmVzdF9pc3QgPSBOVUxMOworICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX3JlcXVlc3Rfb2xkZXN0KGdyYXBoLT5ncmFwaCk7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICByZXR1cm4gcmVhcF9maWx0ZXJzKDApOworCisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICByZXQgPSByZWFwX2ZpbHRlcnMoMSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBncmFwaC0+bmJfb3V0cHV0czsgaSsrKQorICAgICAgICAgICAgY2xvc2Vfb3V0cHV0X3N0cmVhbShncmFwaC0+b3V0cHV0c1tpXS0+b3N0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGlmaWx0ZXIgPSBncmFwaC0+aW5wdXRzW2ldOworICAgICAgICBpc3QgPSBpZmlsdGVyLT5pc3Q7CisgICAgICAgIGlmIChpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT5lYWdhaW4gfHwKKyAgICAgICAgICAgIGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF0tPmVvZl9yZWFjaGVkKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG5iX3JlcXVlc3RzID0gYXZfYnVmZmVyc3JjX2dldF9uYl9mYWlsZWRfcmVxdWVzdHMoaWZpbHRlci0+ZmlsdGVyKTsKKyAgICAgICAgaWYgKG5iX3JlcXVlc3RzID4gbmJfcmVxdWVzdHNfbWF4KSB7CisgICAgICAgICAgICBuYl9yZXF1ZXN0c19tYXggPSBuYl9yZXF1ZXN0czsKKyAgICAgICAgICAgICpiZXN0X2lzdCA9IGlzdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghKmJlc3RfaXN0KQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX291dHB1dHM7IGkrKykKKyAgICAgICAgICAgIGdyYXBoLT5vdXRwdXRzW2ldLT5vc3QtPnVuYXZhaWxhYmxlID0gMTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJ1biBhIHNpbmdsZSBzdGVwIG9mIHRyYW5zY29kaW5nLgorICoKKyAqIEByZXR1cm4gIDAgZm9yIHN1Y2Nlc3MsIDwwIGZvciBlcnJvcgorICovCitzdGF0aWMgaW50IHRyYW5zY29kZV9zdGVwKHZvaWQpCit7CisgICAgT3V0cHV0U3RyZWFtICpvc3Q7CisgICAgSW5wdXRTdHJlYW0gICppc3QgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBvc3QgPSBjaG9vc2Vfb3V0cHV0KCk7CisgICAgaWYgKCFvc3QpIHsKKyAgICAgICAgaWYgKGdvdF9lYWdhaW4oKSkgeworICAgICAgICAgICAgcmVzZXRfZWFnYWluKCk7CisgICAgICAgICAgICBhdl91c2xlZXAoMTAwMDApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiTm8gbW9yZSBpbnB1dHMgdG8gcmVhZCBmcm9tLCBmaW5pc2hpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKworICAgIGlmIChvc3QtPmZpbHRlciAmJiAhb3N0LT5maWx0ZXItPmdyYXBoLT5ncmFwaCkgeworICAgICAgICBpZiAoaWZpbHRlcl9oYXNfYWxsX2lucHV0X2Zvcm1hdHMob3N0LT5maWx0ZXItPmdyYXBoKSkgeworICAgICAgICAgICAgcmV0ID0gY29uZmlndXJlX2ZpbHRlcmdyYXBoKG9zdC0+ZmlsdGVyLT5ncmFwaCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciByZWluaXRpYWxpemluZyBmaWx0ZXJzIVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvc3QtPmZpbHRlciAmJiBvc3QtPmZpbHRlci0+Z3JhcGgtPmdyYXBoKSB7CisgICAgICAgIGlmICghb3N0LT5pbml0aWFsaXplZCkgeworICAgICAgICAgICAgY2hhciBlcnJvclsxMDI0XSA9IHswfTsKKyAgICAgICAgICAgIHJldCA9IGluaXRfb3V0cHV0X3N0cmVhbShvc3QsIGVycm9yLCBzaXplb2YoZXJyb3IpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBvdXRwdXQgc3RyZWFtICVkOiVkIC0tICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIGVycm9yKTsKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSB0cmFuc2NvZGVfZnJvbV9maWx0ZXIob3N0LT5maWx0ZXItPmdyYXBoLCAmaXN0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKCFpc3QpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKG9zdC0+ZmlsdGVyKSB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3N0LT5maWx0ZXItPmdyYXBoLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICAgICAgSW5wdXRGaWx0ZXIgKmlmaWx0ZXIgPSBvc3QtPmZpbHRlci0+Z3JhcGgtPmlucHV0c1tpXTsKKyAgICAgICAgICAgIGlmICghaWZpbHRlci0+aXN0LT5nb3Rfb3V0cHV0ICYmICFpbnB1dF9maWxlc1tpZmlsdGVyLT5pc3QtPmZpbGVfaW5kZXhdLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICAgICAgICAgIGlzdCA9IGlmaWx0ZXItPmlzdDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWlzdCkgeworICAgICAgICAgICAgb3N0LT5pbnB1dHNfZG9uZSA9IDE7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Fzc2VydDAob3N0LT5zb3VyY2VfaW5kZXggPj0gMCk7CisgICAgICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdOworICAgIH0KKworICAgIHJldCA9IHByb2Nlc3NfaW5wdXQoaXN0LT5maWxlX2luZGV4KTsKKyAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkgeworICAgICAgICBpZiAoaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+ZWFnYWluKQorICAgICAgICAgICAgb3N0LT51bmF2YWlsYWJsZSA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0ID09IEFWRVJST1JfRU9GID8gMCA6IHJldDsKKworICAgIHJldHVybiByZWFwX2ZpbHRlcnMoMCk7Cit9CisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgaXMgdGhlIG1haW4gbG9vcCBvZiB0aGUgZmlsZSBjb252ZXJ0ZXIKKyAqLworc3RhdGljIGludCB0cmFuc2NvZGUodm9pZCkKK3sKKyAgICBpbnQgcmV0LCBpOworICAgIEFWRm9ybWF0Q29udGV4dCAqb3M7CisgICAgT3V0cHV0U3RyZWFtICpvc3Q7CisgICAgSW5wdXRTdHJlYW0gKmlzdDsKKyAgICBpbnQ2NF90IHRpbWVyX3N0YXJ0OworICAgIGludDY0X3QgdG90YWxfcGFja2V0c193cml0dGVuID0gMDsKKworICAgIHJldCA9IHRyYW5zY29kZV9pbml0KCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChzdGRpbl9pbnRlcmFjdGlvbikgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJQcmVzcyBbcV0gdG8gc3RvcCwgWz9dIGZvciBoZWxwXG4iKTsKKyAgICB9CisKKyAgICB0aW1lcl9zdGFydCA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKworI2lmIEhBVkVfVEhSRUFEUworICAgIGlmICgocmV0ID0gaW5pdF9pbnB1dF90aHJlYWRzKCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworI2VuZGlmCisKKyAgICB3aGlsZSAoIXJlY2VpdmVkX3NpZ3Rlcm0pIHsKKyAgICAgICAgaW50NjRfdCBjdXJfdGltZT0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworCisgICAgICAgIC8qIGlmICdxJyBwcmVzc2VkLCBleGl0cyAqLworICAgICAgICBpZiAoc3RkaW5faW50ZXJhY3Rpb24pCisgICAgICAgICAgICBpZiAoY2hlY2tfa2V5Ym9hcmRfaW50ZXJhY3Rpb24oY3VyX3RpbWUpIDwgMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvKiBjaGVjayBpZiB0aGVyZSdzIGFueSBzdHJlYW0gd2hlcmUgb3V0cHV0IGlzIHN0aWxsIG5lZWRlZCAqLworICAgICAgICBpZiAoIW5lZWRfb3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIk5vIG1vcmUgb3V0cHV0IHN0cmVhbXMgdG8gd3JpdGUgdG8sIGZpbmlzaGluZy5cbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0cmFuc2NvZGVfc3RlcCgpOworICAgICAgICBpZiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGlsZSBmaWx0ZXJpbmc6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvKiBkdW1wIHJlcG9ydCBieSB1c2luZyB0aGUgb3V0cHV0IGZpcnN0IHZpZGVvIGFuZCBhdWRpbyBzdHJlYW1zICovCisgICAgICAgIHByaW50X3JlcG9ydCgwLCB0aW1lcl9zdGFydCwgY3VyX3RpbWUpOworICAgIH0KKyNpZiBIQVZFX1RIUkVBRFMKKyAgICBmcmVlX2lucHV0X3RocmVhZHMoKTsKKyNlbmRpZgorCisgICAgLyogYXQgdGhlIGVuZCBvZiBzdHJlYW0sIHdlIG11c3QgZmx1c2ggdGhlIGRlY29kZXIgYnVmZmVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKCFpbnB1dF9maWxlc1tpc3QtPmZpbGVfaW5kZXhdLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICAgICAgcHJvY2Vzc19pbnB1dF9wYWNrZXQoaXN0LCBOVUxMLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmbHVzaF9lbmNvZGVycygpOworCisgICAgdGVybV9leGl0KCk7CisKKyAgICAvKiB3cml0ZSB0aGUgdHJhaWxlciBpZiBuZWVkZWQgYW5kIGNsb3NlIGZpbGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X2ZpbGVzOyBpKyspIHsKKyAgICAgICAgb3MgPSBvdXRwdXRfZmlsZXNbaV0tPmN0eDsKKyAgICAgICAgaWYgKCFvdXRwdXRfZmlsZXNbaV0tPmhlYWRlcl93cml0dGVuKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJOb3RoaW5nIHdhcyB3cml0dGVuIGludG8gb3V0cHV0IGZpbGUgJWQgKCVzKSwgYmVjYXVzZSAiCisgICAgICAgICAgICAgICAgICAgImF0IGxlYXN0IG9uZSBvZiBpdHMgc3RyZWFtcyByZWNlaXZlZCBubyBwYWNrZXRzLlxuIiwKKyAgICAgICAgICAgICAgICAgICBpLCBvcy0+dXJsKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gYXZfd3JpdGVfdHJhaWxlcihvcykpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdyaXRpbmcgdHJhaWxlciBvZiAlczogJXNcbiIsIG9zLT51cmwsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICBpZiAoZXhpdF9vbl9lcnJvcikKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBkdW1wIHJlcG9ydCBieSB1c2luZyB0aGUgZmlyc3QgdmlkZW8gYW5kIGF1ZGlvIHN0cmVhbXMgKi8KKyAgICBwcmludF9yZXBvcnQoMSwgdGltZXJfc3RhcnQsIGF2X2dldHRpbWVfcmVsYXRpdmUoKSk7CisKKyAgICAvKiBjbG9zZSBlYWNoIGVuY29kZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgeworICAgICAgICBvc3QgPSBvdXRwdXRfc3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKG9zdC0+ZW5jb2RpbmdfbmVlZGVkKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmb3N0LT5lbmNfY3R4LT5zdGF0c19pbik7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxfcGFja2V0c193cml0dGVuICs9IG9zdC0+cGFja2V0c193cml0dGVuOworICAgIH0KKworICAgIGlmICghdG90YWxfcGFja2V0c193cml0dGVuICYmIChhYm9ydF9vbl9mbGFncyAmIEFCT1JUX09OX0ZMQUdfRU1QVFlfT1VUUFVUKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRW1wdHkgb3V0cHV0XG4iKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIC8qIGNsb3NlIGVhY2ggZGVjb2RlciAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKGlzdC0+ZGVjb2RpbmdfbmVlZGVkKSB7CisgICAgICAgICAgICBhdmNvZGVjX2Nsb3NlKGlzdC0+ZGVjX2N0eCk7CisgICAgICAgICAgICBpZiAoaXN0LT5od2FjY2VsX3VuaW5pdCkKKyAgICAgICAgICAgICAgICBpc3QtPmh3YWNjZWxfdW5pbml0KGlzdC0+ZGVjX2N0eCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmh3X2RldmljZV9jdHgpOworICAgIGh3X2RldmljZV9mcmVlX2FsbCgpOworCisgICAgLyogZmluaXNoZWQgISAqLworICAgIHJldCA9IDA7CisKKyBmYWlsOgorI2lmIEhBVkVfVEhSRUFEUworICAgIGZyZWVfaW5wdXRfdGhyZWFkcygpOworI2VuZGlmCisKKyAgICBpZiAob3V0cHV0X3N0cmVhbXMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIG9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOworICAgICAgICAgICAgaWYgKG9zdCkgeworICAgICAgICAgICAgICAgIGlmIChvc3QtPmxvZ2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZjbG9zZShvc3QtPmxvZ2ZpbGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY2xvc2luZyBsb2dmaWxlLCBsb3NzIG9mIGluZm9ybWF0aW9uIHBvc3NpYmxlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKEFWRVJST1IoZXJybm8pKSk7CisgICAgICAgICAgICAgICAgICAgIG9zdC0+bG9nZmlsZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZvc3QtPmZvcmNlZF9rZl9wdHMpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZvc3QtPmFwYWQpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZvc3QtPmRpc3Bvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9zdC0+ZW5jb2Rlcl9vcHRzKTsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9zdC0+c3dzX2RpY3QpOworICAgICAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3N0LT5zd3Jfb3B0cyk7CisgICAgICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZvc3QtPnJlc2FtcGxlX29wdHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludDY0X3QgZ2V0dXRpbWUodm9pZCkKK3sKKyNpZiBIQVZFX0dFVFJVU0FHRQorICAgIHN0cnVjdCBydXNhZ2UgcnVzYWdlOworCisgICAgZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnVzYWdlKTsKKyAgICByZXR1cm4gKHJ1c2FnZS5ydV91dGltZS50dl9zZWMgKiAxMDAwMDAwTEwpICsgcnVzYWdlLnJ1X3V0aW1lLnR2X3VzZWM7CisjZWxpZiBIQVZFX0dFVFBST0NFU1NUSU1FUworICAgIEhBTkRMRSBwcm9jOworICAgIEZJTEVUSU1FIGMsIGUsIGssIHU7CisgICAgcHJvYyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisgICAgR2V0UHJvY2Vzc1RpbWVzKHByb2MsICZjLCAmZSwgJmssICZ1KTsKKyAgICByZXR1cm4gKChpbnQ2NF90KSB1LmR3SGlnaERhdGVUaW1lIDw8IDMyIHwgdS5kd0xvd0RhdGVUaW1lKSAvIDEwOworI2Vsc2UKKyAgICByZXR1cm4gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQ2NF90IGdldG1heHJzcyh2b2lkKQoreworI2lmIEhBVkVfR0VUUlVTQUdFICYmIEhBVkVfU1RSVUNUX1JVU0FHRV9SVV9NQVhSU1MKKyAgICBzdHJ1Y3QgcnVzYWdlIHJ1c2FnZTsKKyAgICBnZXRydXNhZ2UoUlVTQUdFX1NFTEYsICZydXNhZ2UpOworICAgIHJldHVybiAoaW50NjRfdClydXNhZ2UucnVfbWF4cnNzICogMTAyNDsKKyNlbGlmIEhBVkVfR0VUUFJPQ0VTU01FTU9SWUlORk8KKyAgICBIQU5ETEUgcHJvYzsKKyAgICBQUk9DRVNTX01FTU9SWV9DT1VOVEVSUyBtZW1jb3VudGVyczsKKyAgICBwcm9jID0gR2V0Q3VycmVudFByb2Nlc3MoKTsKKyAgICBtZW1jb3VudGVycy5jYiA9IHNpemVvZihtZW1jb3VudGVycyk7CisgICAgR2V0UHJvY2Vzc01lbW9yeUluZm8ocHJvYywgJm1lbWNvdW50ZXJzLCBzaXplb2YobWVtY291bnRlcnMpKTsKKyAgICByZXR1cm4gbWVtY291bnRlcnMuUGVha1BhZ2VmaWxlVXNhZ2U7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGxvZ19jYWxsYmFja19udWxsKHZvaWQgKnB0ciwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmwpCit7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaSwgcmV0OworICAgIGludDY0X3QgdGk7CisKKyAgICBpbml0X2R5bmxvYWQoKTsKKworICAgIHJlZ2lzdGVyX2V4aXQoZmZtcGVnX2NsZWFudXApOworCisgICAgc2V0dmJ1ZihzdGRlcnIsTlVMTCxfSU9OQkYsMCk7IC8qIHdpbjMyIHJ1bnRpbWUgbmVlZHMgdGhpcyAqLworCisgICAgYXZfbG9nX3NldF9mbGFncyhBVl9MT0dfU0tJUF9SRVBFQVRFRCk7CisgICAgcGFyc2VfbG9nbGV2ZWwoYXJnYywgYXJndiwgb3B0aW9ucyk7CisKKyAgICBpZihhcmdjPjEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLWQiKSl7CisgICAgICAgIHJ1bl9hc19kYWVtb249MTsKKyAgICAgICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfbnVsbCk7CisgICAgICAgIGFyZ2MtLTsKKyAgICAgICAgYXJndisrOworICAgIH0KKworI2lmIENPTkZJR19BVkRFVklDRQorICAgIGF2ZGV2aWNlX3JlZ2lzdGVyX2FsbCgpOworI2VuZGlmCisgICAgYXZmb3JtYXRfbmV0d29ya19pbml0KCk7CisKKyAgICBzaG93X2Jhbm5lcihhcmdjLCBhcmd2LCBvcHRpb25zKTsKKworICAgIC8qIHBhcnNlIG9wdGlvbnMgYW5kIG9wZW4gYWxsIGlucHV0L291dHB1dCBmaWxlcyAqLworICAgIHJldCA9IGZmbXBlZ19wYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisKKyAgICBpZiAobmJfb3V0cHV0X2ZpbGVzIDw9IDAgJiYgbmJfaW5wdXRfZmlsZXMgPT0gMCkgeworICAgICAgICBzaG93X3VzYWdlKCk7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlVzZSAtaCB0byBnZXQgZnVsbCBoZWxwIG9yLCBldmVuIGJldHRlciwgcnVuICdtYW4gJXMnXG4iLCBwcm9ncmFtX25hbWUpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgLyogZmlsZSBjb252ZXJ0ZXIgLyBncmFiICovCisgICAgaWYgKG5iX291dHB1dF9maWxlcyA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJBdCBsZWFzdCBvbmUgb3V0cHV0IGZpbGUgbXVzdCBiZSBzcGVjaWZpZWRcbiIpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisvLyAgICAgaWYgKG5iX2lucHV0X2ZpbGVzID09IDApIHsKKy8vICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkF0IGxlYXN0IG9uZSBpbnB1dCBmaWxlIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKKy8vICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworLy8gICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXRwdXRfZmlsZXM7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKG91dHB1dF9maWxlc1tpXS0+Y3R4LT5vZm9ybWF0LT5uYW1lLCAicnRwIikpCisgICAgICAgICAgICB3YW50X3NkcCA9IDA7CisgICAgfQorCisgICAgY3VycmVudF90aW1lID0gdGkgPSBnZXR1dGltZSgpOworICAgIGlmICh0cmFuc2NvZGUoKSA8IDApCisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB0aSA9IGdldHV0aW1lKCkgLSB0aTsKKyAgICBpZiAoZG9fYmVuY2htYXJrKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImJlbmNoOiB1dGltZT0lMC4zZnNcbiIsIHRpIC8gMTAwMDAwMC4wKTsKKyAgICB9CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiUiUFJJdTY0IiBmcmFtZXMgc3VjY2Vzc2Z1bGx5IGRlY29kZWQsICUiUFJJdTY0IiBkZWNvZGluZyBlcnJvcnNcbiIsCisgICAgICAgICAgIGRlY29kZV9lcnJvcl9zdGF0WzBdLCBkZWNvZGVfZXJyb3Jfc3RhdFsxXSk7CisgICAgaWYgKChkZWNvZGVfZXJyb3Jfc3RhdFswXSArIGRlY29kZV9lcnJvcl9zdGF0WzFdKSAqIG1heF9lcnJvcl9yYXRlIDwgZGVjb2RlX2Vycm9yX3N0YXRbMV0pCisgICAgICAgIGV4aXRfcHJvZ3JhbSg2OSk7CisKKyAgICBleGl0X3Byb2dyYW0ocmVjZWl2ZWRfbmJfc2lnbmFscyA/IDI1NSA6IG1haW5fcmV0dXJuX2NvZGUpOworICAgIHJldHVybiBtYWluX3JldHVybl9jb2RlOworfQpkaWZmIC0tZ2l0IGEvZmZ0b29scy9mZm1wZWcuaCBiL2ZmdG9vbHMvZmZtcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ0YjdhNQotLS0gL2Rldi9udWxsCisrKyBiL2ZmdG9vbHMvZmZtcGVnLmgKQEAgLTAsMCArMSw2NjcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBGRlRPT0xTX0ZGTVBFR19ICisjZGVmaW5lIEZGVE9PTFNfRkZNUEVHX0gKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgImNtZHV0aWxzLmgiCisKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2aW8uaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkbWVzc2FnZS5oIgorCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgiCisKKyNkZWZpbmUgVlNZTkNfQVVUTyAgICAgICAtMQorI2RlZmluZSBWU1lOQ19QQVNTVEhST1VHSCAwCisjZGVmaW5lIFZTWU5DX0NGUiAgICAgICAgIDEKKyNkZWZpbmUgVlNZTkNfVkZSICAgICAgICAgMgorI2RlZmluZSBWU1lOQ19WU0NGUiAgICAgICAweGZlCisjZGVmaW5lIFZTWU5DX0RST1AgICAgICAgIDB4ZmYKKworI2RlZmluZSBNQVhfU1RSRUFNUyAxMDI0ICAgIC8qIGFyYml0cmFyeSBzYW5pdHkgY2hlY2sgdmFsdWUgKi8KKworZW51bSBIV0FjY2VsSUQgeworICAgIEhXQUNDRUxfTk9ORSA9IDAsCisgICAgSFdBQ0NFTF9BVVRPLAorICAgIEhXQUNDRUxfR0VORVJJQywKKyAgICBIV0FDQ0VMX1ZJREVPVE9PTEJPWCwKKyAgICBIV0FDQ0VMX1FTViwKKyAgICBIV0FDQ0VMX0NVVklELAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgSFdBY2NlbCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBpbnQgKCppbml0KShBVkNvZGVjQ29udGV4dCAqcyk7CisgICAgZW51bSBIV0FjY2VsSUQgaWQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7Cit9IEhXQWNjZWw7CisKK3R5cGVkZWYgc3RydWN0IEhXRGV2aWNlIHsKKyAgICBjaGFyICpuYW1lOworICAgIGVudW0gQVZIV0RldmljZVR5cGUgdHlwZTsKKyAgICBBVkJ1ZmZlclJlZiAqZGV2aWNlX3JlZjsKK30gSFdEZXZpY2U7CisKKy8qIHNlbGVjdCBhbiBpbnB1dCBzdHJlYW0gZm9yIGFuIG91dHB1dCBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0IFN0cmVhbU1hcCB7CisgICAgaW50IGRpc2FibGVkOyAgICAgICAgICAgLyogMSBpcyB0aGlzIG1hcHBpbmcgaXMgZGlzYWJsZWQgYnkgYSBuZWdhdGl2ZSBtYXAgKi8KKyAgICBpbnQgZmlsZV9pbmRleDsKKyAgICBpbnQgc3RyZWFtX2luZGV4OworICAgIGludCBzeW5jX2ZpbGVfaW5kZXg7CisgICAgaW50IHN5bmNfc3RyZWFtX2luZGV4OworICAgIGNoYXIgKmxpbmtsYWJlbDsgICAgICAgLyogbmFtZSBvZiBhbiBvdXRwdXQgbGluaywgZm9yIG1hcHBpbmcgbGF2Zmkgb3V0cHV0cyAqLworfSBTdHJlYW1NYXA7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgIGZpbGVfaWR4LCAgc3RyZWFtX2lkeCwgIGNoYW5uZWxfaWR4OyAvLyBpbnB1dAorICAgIGludCBvZmlsZV9pZHgsIG9zdHJlYW1faWR4OyAgICAgICAgICAgICAgIC8vIG91dHB1dAorfSBBdWRpb0NoYW5uZWxNYXA7CisKK3R5cGVkZWYgc3RydWN0IE9wdGlvbnNDb250ZXh0IHsKKyAgICBPcHRpb25Hcm91cCAqZzsKKworICAgIC8qIGlucHV0L291dHB1dCBvcHRpb25zICovCisgICAgaW50NjRfdCBzdGFydF90aW1lOworICAgIGludDY0X3Qgc3RhcnRfdGltZV9lb2Y7CisgICAgaW50IHNlZWtfdGltZXN0YW1wOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdDsKKworICAgIFNwZWNpZmllck9wdCAqY29kZWNfbmFtZXM7CisgICAgaW50ICAgICAgICBuYl9jb2RlY19uYW1lczsKKyAgICBTcGVjaWZpZXJPcHQgKmF1ZGlvX2NoYW5uZWxzOworICAgIGludCAgICAgICAgbmJfYXVkaW9fY2hhbm5lbHM7CisgICAgU3BlY2lmaWVyT3B0ICphdWRpb19zYW1wbGVfcmF0ZTsKKyAgICBpbnQgICAgICAgIG5iX2F1ZGlvX3NhbXBsZV9yYXRlOworICAgIFNwZWNpZmllck9wdCAqZnJhbWVfcmF0ZXM7CisgICAgaW50ICAgICAgICBuYl9mcmFtZV9yYXRlczsKKyAgICBTcGVjaWZpZXJPcHQgKmZyYW1lX3NpemVzOworICAgIGludCAgICAgICAgbmJfZnJhbWVfc2l6ZXM7CisgICAgU3BlY2lmaWVyT3B0ICpmcmFtZV9waXhfZm10czsKKyAgICBpbnQgICAgICAgIG5iX2ZyYW1lX3BpeF9mbXRzOworCisgICAgLyogaW5wdXQgb3B0aW9ucyAqLworICAgIGludDY0X3QgaW5wdXRfdHNfb2Zmc2V0OworICAgIGludCBsb29wOworICAgIGludCByYXRlX2VtdTsKKyAgICBpbnQgYWNjdXJhdGVfc2VlazsKKyAgICBpbnQgdGhyZWFkX3F1ZXVlX3NpemU7CisKKyAgICBTcGVjaWZpZXJPcHQgKnRzX3NjYWxlOworICAgIGludCAgICAgICAgbmJfdHNfc2NhbGU7CisgICAgU3BlY2lmaWVyT3B0ICpkdW1wX2F0dGFjaG1lbnQ7CisgICAgaW50ICAgICAgICBuYl9kdW1wX2F0dGFjaG1lbnQ7CisgICAgU3BlY2lmaWVyT3B0ICpod2FjY2VsczsKKyAgICBpbnQgICAgICAgIG5iX2h3YWNjZWxzOworICAgIFNwZWNpZmllck9wdCAqaHdhY2NlbF9kZXZpY2VzOworICAgIGludCAgICAgICAgbmJfaHdhY2NlbF9kZXZpY2VzOworICAgIFNwZWNpZmllck9wdCAqaHdhY2NlbF9vdXRwdXRfZm9ybWF0czsKKyAgICBpbnQgICAgICAgIG5iX2h3YWNjZWxfb3V0cHV0X2Zvcm1hdHM7CisgICAgU3BlY2lmaWVyT3B0ICphdXRvcm90YXRlOworICAgIGludCAgICAgICAgbmJfYXV0b3JvdGF0ZTsKKworICAgIC8qIG91dHB1dCBvcHRpb25zICovCisgICAgU3RyZWFtTWFwICpzdHJlYW1fbWFwczsKKyAgICBpbnQgICAgIG5iX3N0cmVhbV9tYXBzOworICAgIEF1ZGlvQ2hhbm5lbE1hcCAqYXVkaW9fY2hhbm5lbF9tYXBzOyAvKiBvbmUgaW5mbyBlbnRyeSBwZXIgLW1hcF9jaGFubmVsICovCisgICAgaW50ICAgICAgICAgICBuYl9hdWRpb19jaGFubmVsX21hcHM7IC8qIG51bWJlciBvZiAodmFsaWQpIC1tYXBfY2hhbm5lbCBzZXR0aW5ncyAqLworICAgIGludCBtZXRhZGF0YV9nbG9iYWxfbWFudWFsOworICAgIGludCBtZXRhZGF0YV9zdHJlYW1zX21hbnVhbDsKKyAgICBpbnQgbWV0YWRhdGFfY2hhcHRlcnNfbWFudWFsOworICAgIGNvbnN0IGNoYXIgKiphdHRhY2htZW50czsKKyAgICBpbnQgICAgICAgbmJfYXR0YWNobWVudHM7CisKKyAgICBpbnQgY2hhcHRlcnNfaW5wdXRfZmlsZTsKKworICAgIGludDY0X3QgcmVjb3JkaW5nX3RpbWU7CisgICAgaW50NjRfdCBzdG9wX3RpbWU7CisgICAgdWludDY0X3QgbGltaXRfZmlsZXNpemU7CisgICAgZmxvYXQgbXV4X3ByZWxvYWQ7CisgICAgZmxvYXQgbXV4X21heF9kZWxheTsKKyAgICBpbnQgc2hvcnRlc3Q7CisgICAgaW50IGJpdGV4YWN0OworCisgICAgaW50IHZpZGVvX2Rpc2FibGU7CisgICAgaW50IGF1ZGlvX2Rpc2FibGU7CisgICAgaW50IHN1YnRpdGxlX2Rpc2FibGU7CisgICAgaW50IGRhdGFfZGlzYWJsZTsKKworICAgIC8qIGluZGV4ZWQgYnkgb3V0cHV0IGZpbGUgc3RyZWFtIGluZGV4ICovCisgICAgaW50ICAgKnN0cmVhbWlkX21hcDsKKyAgICBpbnQgbmJfc3RyZWFtaWRfbWFwOworCisgICAgU3BlY2lmaWVyT3B0ICptZXRhZGF0YTsKKyAgICBpbnQgICAgICAgIG5iX21ldGFkYXRhOworICAgIFNwZWNpZmllck9wdCAqbWF4X2ZyYW1lczsKKyAgICBpbnQgICAgICAgIG5iX21heF9mcmFtZXM7CisgICAgU3BlY2lmaWVyT3B0ICpiaXRzdHJlYW1fZmlsdGVyczsKKyAgICBpbnQgICAgICAgIG5iX2JpdHN0cmVhbV9maWx0ZXJzOworICAgIFNwZWNpZmllck9wdCAqY29kZWNfdGFnczsKKyAgICBpbnQgICAgICAgIG5iX2NvZGVjX3RhZ3M7CisgICAgU3BlY2lmaWVyT3B0ICpzYW1wbGVfZm10czsKKyAgICBpbnQgICAgICAgIG5iX3NhbXBsZV9mbXRzOworICAgIFNwZWNpZmllck9wdCAqcXNjYWxlOworICAgIGludCAgICAgICAgbmJfcXNjYWxlOworICAgIFNwZWNpZmllck9wdCAqZm9yY2VkX2tleV9mcmFtZXM7CisgICAgaW50ICAgICAgICBuYl9mb3JjZWRfa2V5X2ZyYW1lczsKKyAgICBTcGVjaWZpZXJPcHQgKmZvcmNlX2ZwczsKKyAgICBpbnQgICAgICAgIG5iX2ZvcmNlX2ZwczsKKyAgICBTcGVjaWZpZXJPcHQgKmZyYW1lX2FzcGVjdF9yYXRpb3M7CisgICAgaW50ICAgICAgICBuYl9mcmFtZV9hc3BlY3RfcmF0aW9zOworICAgIFNwZWNpZmllck9wdCAqcmNfb3ZlcnJpZGVzOworICAgIGludCAgICAgICAgbmJfcmNfb3ZlcnJpZGVzOworICAgIFNwZWNpZmllck9wdCAqaW50cmFfbWF0cmljZXM7CisgICAgaW50ICAgICAgICBuYl9pbnRyYV9tYXRyaWNlczsKKyAgICBTcGVjaWZpZXJPcHQgKmludGVyX21hdHJpY2VzOworICAgIGludCAgICAgICAgbmJfaW50ZXJfbWF0cmljZXM7CisgICAgU3BlY2lmaWVyT3B0ICpjaHJvbWFfaW50cmFfbWF0cmljZXM7CisgICAgaW50ICAgICAgICBuYl9jaHJvbWFfaW50cmFfbWF0cmljZXM7CisgICAgU3BlY2lmaWVyT3B0ICp0b3BfZmllbGRfZmlyc3Q7CisgICAgaW50ICAgICAgICBuYl90b3BfZmllbGRfZmlyc3Q7CisgICAgU3BlY2lmaWVyT3B0ICptZXRhZGF0YV9tYXA7CisgICAgaW50ICAgICAgICBuYl9tZXRhZGF0YV9tYXA7CisgICAgU3BlY2lmaWVyT3B0ICpwcmVzZXRzOworICAgIGludCAgICAgICAgbmJfcHJlc2V0czsKKyAgICBTcGVjaWZpZXJPcHQgKmNvcHlfaW5pdGlhbF9ub25rZXlmcmFtZXM7CisgICAgaW50ICAgICAgICBuYl9jb3B5X2luaXRpYWxfbm9ua2V5ZnJhbWVzOworICAgIFNwZWNpZmllck9wdCAqY29weV9wcmlvcl9zdGFydDsKKyAgICBpbnQgICAgICAgIG5iX2NvcHlfcHJpb3Jfc3RhcnQ7CisgICAgU3BlY2lmaWVyT3B0ICpmaWx0ZXJzOworICAgIGludCAgICAgICAgbmJfZmlsdGVyczsKKyAgICBTcGVjaWZpZXJPcHQgKmZpbHRlcl9zY3JpcHRzOworICAgIGludCAgICAgICAgbmJfZmlsdGVyX3NjcmlwdHM7CisgICAgU3BlY2lmaWVyT3B0ICpyZWluaXRfZmlsdGVyczsKKyAgICBpbnQgICAgICAgIG5iX3JlaW5pdF9maWx0ZXJzOworICAgIFNwZWNpZmllck9wdCAqZml4X3N1Yl9kdXJhdGlvbjsKKyAgICBpbnQgICAgICAgIG5iX2ZpeF9zdWJfZHVyYXRpb247CisgICAgU3BlY2lmaWVyT3B0ICpjYW52YXNfc2l6ZXM7CisgICAgaW50ICAgICAgICBuYl9jYW52YXNfc2l6ZXM7CisgICAgU3BlY2lmaWVyT3B0ICpwYXNzOworICAgIGludCAgICAgICAgbmJfcGFzczsKKyAgICBTcGVjaWZpZXJPcHQgKnBhc3Nsb2dmaWxlczsKKyAgICBpbnQgICAgICAgIG5iX3Bhc3Nsb2dmaWxlczsKKyAgICBTcGVjaWZpZXJPcHQgKm1heF9tdXhpbmdfcXVldWVfc2l6ZTsKKyAgICBpbnQgICAgICAgIG5iX21heF9tdXhpbmdfcXVldWVfc2l6ZTsKKyAgICBTcGVjaWZpZXJPcHQgKmd1ZXNzX2xheW91dF9tYXg7CisgICAgaW50ICAgICAgICBuYl9ndWVzc19sYXlvdXRfbWF4OworICAgIFNwZWNpZmllck9wdCAqYXBhZDsKKyAgICBpbnQgICAgICAgIG5iX2FwYWQ7CisgICAgU3BlY2lmaWVyT3B0ICpkaXNjYXJkOworICAgIGludCAgICAgICAgbmJfZGlzY2FyZDsKKyAgICBTcGVjaWZpZXJPcHQgKmRpc3Bvc2l0aW9uOworICAgIGludCAgICAgICAgbmJfZGlzcG9zaXRpb247CisgICAgU3BlY2lmaWVyT3B0ICpwcm9ncmFtOworICAgIGludCAgICAgICAgbmJfcHJvZ3JhbTsKKyAgICBTcGVjaWZpZXJPcHQgKnRpbWVfYmFzZXM7CisgICAgaW50ICAgICAgICBuYl90aW1lX2Jhc2VzOworICAgIFNwZWNpZmllck9wdCAqZW5jX3RpbWVfYmFzZXM7CisgICAgaW50ICAgICAgICBuYl9lbmNfdGltZV9iYXNlczsKK30gT3B0aW9uc0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IElucHV0RmlsdGVyIHsKKyAgICBBVkZpbHRlckNvbnRleHQgICAgKmZpbHRlcjsKKyAgICBzdHJ1Y3QgSW5wdXRTdHJlYW0gKmlzdDsKKyAgICBzdHJ1Y3QgRmlsdGVyR3JhcGggKmdyYXBoOworICAgIHVpbnQ4X3QgICAgICAgICAgICAqbmFtZTsKKyAgICBlbnVtIEFWTWVkaWFUeXBlICAgIHR5cGU7ICAgLy8gQVZNRURJQV9UWVBFX1NVQlRJVExFIGZvciBzdWIydmlkZW8KKworICAgIEFWRmlmb0J1ZmZlciAqZnJhbWVfcXVldWU7CisKKyAgICAvLyBwYXJhbWV0ZXJzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgaW5wdXQKKyAgICBpbnQgZm9ybWF0OworCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgQVZSYXRpb25hbCBzYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIGludCBjaGFubmVsczsKKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dDsKKworICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4OworCisgICAgaW50IGVvZjsKK30gSW5wdXRGaWx0ZXI7CisKK3R5cGVkZWYgc3RydWN0IE91dHB1dEZpbHRlciB7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgICAqZmlsdGVyOworICAgIHN0cnVjdCBPdXRwdXRTdHJlYW0gKm9zdDsKKyAgICBzdHJ1Y3QgRmlsdGVyR3JhcGggICpncmFwaDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICpuYW1lOworCisgICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgdW50aWwgc3RyZWFtIG1hcHMgYXJlIHByb2Nlc3NlZCAqLworICAgIEFWRmlsdGVySW5PdXQgICAgICAgKm91dF90bXA7CisgICAgZW51bSBBVk1lZGlhVHlwZSAgICAgdHlwZTsKKworICAgIC8qIGRlc2lyZWQgb3V0cHV0IHN0cmVhbSBwcm9wZXJ0aWVzICovCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgQVZSYXRpb25hbCBmcmFtZV9yYXRlOworICAgIGludCBmb3JtYXQ7CisgICAgaW50IHNhbXBsZV9yYXRlOworICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworCisgICAgLy8gdGhvc2UgYXJlIG9ubHkgc2V0IGlmIG5vIGZvcm1hdCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBlbmNvZGVyIGdpdmVzIHVzIG11bHRpcGxlIG9wdGlvbnMKKyAgICBpbnQgKmZvcm1hdHM7CisgICAgdWludDY0X3QgKmNoYW5uZWxfbGF5b3V0czsKKyAgICBpbnQgKnNhbXBsZV9yYXRlczsKK30gT3V0cHV0RmlsdGVyOworCit0eXBlZGVmIHN0cnVjdCBGaWx0ZXJHcmFwaCB7CisgICAgaW50ICAgICAgICAgICAgaW5kZXg7CisgICAgY29uc3QgY2hhciAgICAqZ3JhcGhfZGVzYzsKKworICAgIEFWRmlsdGVyR3JhcGggKmdyYXBoOworICAgIGludCByZWNvbmZpZ3VyYXRpb247CisKKyAgICBJbnB1dEZpbHRlciAgICoqaW5wdXRzOworICAgIGludCAgICAgICAgICBuYl9pbnB1dHM7CisgICAgT3V0cHV0RmlsdGVyICoqb3V0cHV0czsKKyAgICBpbnQgICAgICAgICBuYl9vdXRwdXRzOworfSBGaWx0ZXJHcmFwaDsKKwordHlwZWRlZiBzdHJ1Y3QgSW5wdXRTdHJlYW0geworICAgIGludCBmaWxlX2luZGV4OworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgZGlzY2FyZDsgICAgICAgICAgICAgLyogdHJ1ZSBpZiBzdHJlYW0gZGF0YSBzaG91bGQgYmUgZGlzY2FyZGVkICovCisgICAgaW50IHVzZXJfc2V0X2Rpc2NhcmQ7CisgICAgaW50IGRlY29kaW5nX25lZWRlZDsgICAgIC8qIG5vbiB6ZXJvIGlmIHRoZSBwYWNrZXRzIG11c3QgYmUgZGVjb2RlZCBpbiAncmF3X2ZpZm8nLCBzZWUgREVDT0RJTkdfRk9SXyogKi8KKyNkZWZpbmUgREVDT0RJTkdfRk9SX09TVCAgICAxCisjZGVmaW5lIERFQ09ESU5HX0ZPUl9GSUxURVIgMgorCisgICAgQVZDb2RlY0NvbnRleHQgKmRlY19jdHg7CisgICAgQVZDb2RlYyAqZGVjOworICAgIEFWRnJhbWUgKmRlY29kZWRfZnJhbWU7CisgICAgQVZGcmFtZSAqZmlsdGVyX2ZyYW1lOyAvKiBhIHJlZiBvZiBkZWNvZGVkX2ZyYW1lLCB0byBiZSBzZW50IHRvIGZpbHRlcnMgKi8KKworICAgIGludDY0X3QgICAgICAgc3RhcnQ7ICAgICAvKiB0aW1lIHdoZW4gcmVhZCBzdGFydGVkICovCisgICAgLyogcHJlZGljdGVkIGR0cyBvZiB0aGUgbmV4dCBwYWNrZXQgcmVhZCBmb3IgdGhpcyBzdHJlYW0gb3IgKHdoZW4gdGhlcmUgYXJlCisgICAgICogc2V2ZXJhbCBmcmFtZXMgaW4gYSBwYWNrZXQpIG9mIHRoZSBuZXh0IGZyYW1lIGluIGN1cnJlbnQgcGFja2V0IChpbiBBVl9USU1FX0JBU0UgdW5pdHMpICovCisgICAgaW50NjRfdCAgICAgICBuZXh0X2R0czsKKyAgICBpbnQ2NF90ICAgICAgIGR0czsgICAgICAgLy8vPCBkdHMgb2YgdGhlIGxhc3QgcGFja2V0IHJlYWQgZm9yIHRoaXMgc3RyZWFtIChpbiBBVl9USU1FX0JBU0UgdW5pdHMpCisKKyAgICBpbnQ2NF90ICAgICAgIG5leHRfcHRzOyAgLy8vPCBzeW50aGV0aWMgcHRzIGZvciB0aGUgbmV4dCBkZWNvZGUgZnJhbWUgKGluIEFWX1RJTUVfQkFTRSB1bml0cykKKyAgICBpbnQ2NF90ICAgICAgIHB0czsgICAgICAgLy8vPCBjdXJyZW50IHB0cyBvZiB0aGUgZGVjb2RlZCBmcmFtZSAgKGluIEFWX1RJTUVfQkFTRSB1bml0cykKKyAgICBpbnQgICAgICAgICAgIHdyYXBfY29ycmVjdGlvbl9kb25lOworCisgICAgaW50NjRfdCBmaWx0ZXJfaW5fcmVzY2FsZV9kZWx0YV9sYXN0OworCisgICAgaW50NjRfdCBtaW5fcHRzOyAvKiBwdHMgd2l0aCB0aGUgc21hbGxlc3QgdmFsdWUgaW4gYSBjdXJyZW50IHN0cmVhbSAqLworICAgIGludDY0X3QgbWF4X3B0czsgLyogcHRzIHdpdGggdGhlIGhpZ2hlciB2YWx1ZSBpbiBhIGN1cnJlbnQgc3RyZWFtICovCisKKyAgICAvLyB3aGVuIGZvcmNpbmcgY29uc3RhbnQgaW5wdXQgZnJhbWVyYXRlIHRocm91Z2ggLXIsCisgICAgLy8gdGhpcyBjb250YWlucyB0aGUgcHRzIHRoYXQgd2lsbCBiZSBnaXZlbiB0byB0aGUgbmV4dCBkZWNvZGVkIGZyYW1lCisgICAgaW50NjRfdCBjZnJfbmV4dF9wdHM7CisKKyAgICBpbnQ2NF90IG5iX3NhbXBsZXM7IC8qIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBsYXN0IGRlY29kZWQgYXVkaW8gZnJhbWUgYmVmb3JlIGxvb3BpbmcgKi8KKworICAgIGRvdWJsZSB0c19zY2FsZTsKKyAgICBpbnQgc2F3X2ZpcnN0X3RzOworICAgIEFWRGljdGlvbmFyeSAqZGVjb2Rlcl9vcHRzOworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgICAgICAgICAgICAgIC8qIGZyYW1lcmF0ZSBmb3JjZWQgd2l0aCAtciAqLworICAgIGludCB0b3BfZmllbGRfZmlyc3Q7CisgICAgaW50IGd1ZXNzX2xheW91dF9tYXg7CisKKyAgICBpbnQgYXV0b3JvdGF0ZTsKKworICAgIGludCBmaXhfc3ViX2R1cmF0aW9uOworICAgIHN0cnVjdCB7IC8qIHByZXZpb3VzIGRlY29kZWQgc3VidGl0bGUgYW5kIHJlbGF0ZWQgdmFyaWFibGVzICovCisgICAgICAgIGludCBnb3Rfb3V0cHV0OworICAgICAgICBpbnQgcmV0OworICAgICAgICBBVlN1YnRpdGxlIHN1YnRpdGxlOworICAgIH0gcHJldl9zdWI7CisKKyAgICBzdHJ1Y3Qgc3ViMnZpZGVvIHsKKyAgICAgICAgaW50NjRfdCBsYXN0X3B0czsKKyAgICAgICAgaW50NjRfdCBlbmRfcHRzOworICAgICAgICBBVkZpZm9CdWZmZXIgKnN1Yl9xdWV1ZTsgICAgLy8vPCBxdWV1ZSBvZiBBVlN1YnRpdGxlKiBiZWZvcmUgZmlsdGVyIGluaXQKKyAgICAgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgICAgIGludCB3LCBoOworICAgIH0gc3ViMnZpZGVvOworCisgICAgaW50IGRyMTsKKworICAgIC8qIGRlY29kZWQgZGF0YSBmcm9tIHRoaXMgc3RyZWFtIGdvZXMgaW50byBhbGwgdGhvc2UgZmlsdGVycworICAgICAqIGN1cnJlbnRseSB2aWRlbyBhbmQgYXVkaW8gb25seSAqLworICAgIElucHV0RmlsdGVyICoqZmlsdGVyczsKKyAgICBpbnQgICAgICAgIG5iX2ZpbHRlcnM7CisKKyAgICBpbnQgcmVpbml0X2ZpbHRlcnM7CisKKyAgICAvKiBod2FjY2VsIG9wdGlvbnMgKi8KKyAgICBlbnVtIEhXQWNjZWxJRCBod2FjY2VsX2lkOworICAgIGVudW0gQVZIV0RldmljZVR5cGUgaHdhY2NlbF9kZXZpY2VfdHlwZTsKKyAgICBjaGFyICAqaHdhY2NlbF9kZXZpY2U7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGh3YWNjZWxfb3V0cHV0X2Zvcm1hdDsKKworICAgIC8qIGh3YWNjZWwgY29udGV4dCAqLworICAgIHZvaWQgICpod2FjY2VsX2N0eDsKKyAgICB2b2lkICgqaHdhY2NlbF91bmluaXQpKEFWQ29kZWNDb250ZXh0ICpzKTsKKyAgICBpbnQgICgqaHdhY2NlbF9nZXRfYnVmZmVyKShBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7CisgICAgaW50ICAoKmh3YWNjZWxfcmV0cmlldmVfZGF0YSkoQVZDb2RlY0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgaHdhY2NlbF9waXhfZm10OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBod2FjY2VsX3JldHJpZXZlZF9waXhfZm10OworICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4OworCisgICAgLyogc3RhdHMgKi8KKyAgICAvLyBjb21iaW5lZCBzaXplIG9mIGFsbCB0aGUgcGFja2V0cyByZWFkCisgICAgdWludDY0X3QgZGF0YV9zaXplOworICAgIC8qIG51bWJlciBvZiBwYWNrZXRzIHN1Y2Nlc3NmdWxseSByZWFkIGZvciB0aGlzIHN0cmVhbSAqLworICAgIHVpbnQ2NF90IG5iX3BhY2tldHM7CisgICAgLy8gbnVtYmVyIG9mIGZyYW1lcy9zYW1wbGVzIHJldHJpZXZlZCBmcm9tIHRoZSBkZWNvZGVyCisgICAgdWludDY0X3QgZnJhbWVzX2RlY29kZWQ7CisgICAgdWludDY0X3Qgc2FtcGxlc19kZWNvZGVkOworCisgICAgaW50NjRfdCAqZHRzX2J1ZmZlcjsKKyAgICBpbnQgbmJfZHRzX2J1ZmZlcjsKKworICAgIGludCBnb3Rfb3V0cHV0OworfSBJbnB1dFN0cmVhbTsKKwordHlwZWRlZiBzdHJ1Y3QgSW5wdXRGaWxlIHsKKyAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKKyAgICBpbnQgZW9mX3JlYWNoZWQ7ICAgICAgLyogdHJ1ZSBpZiBlb2YgcmVhY2hlZCAqLworICAgIGludCBlYWdhaW47ICAgICAgICAgICAvKiB0cnVlIGlmIGxhc3QgcmVhZCBhdHRlbXB0IHJldHVybmVkIEVBR0FJTiAqLworICAgIGludCBpc3RfaW5kZXg7ICAgICAgICAvKiBpbmRleCBvZiBmaXJzdCBzdHJlYW0gaW4gaW5wdXRfc3RyZWFtcyAqLworICAgIGludCBsb29wOyAgICAgICAgICAgICAvKiBzZXQgbnVtYmVyIG9mIHRpbWVzIGlucHV0IHN0cmVhbSBzaG91bGQgYmUgbG9vcGVkICovCisgICAgaW50NjRfdCBkdXJhdGlvbjsgICAgIC8qIGFjdHVhbCBkdXJhdGlvbiBvZiB0aGUgbG9uZ2VzdCBzdHJlYW0gaW4gYSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0IHRoZSBtb21lbnQgd2hlbiBsb29waW5nIGhhcHBlbnMgKi8KKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsgLyogdGltZSBiYXNlIG9mIHRoZSBkdXJhdGlvbiAqLworICAgIGludDY0X3QgaW5wdXRfdHNfb2Zmc2V0OworCisgICAgaW50NjRfdCB0c19vZmZzZXQ7CisgICAgaW50NjRfdCBsYXN0X3RzOworICAgIGludDY0X3Qgc3RhcnRfdGltZTsgICAvKiB1c2VyLXNwZWNpZmllZCBzdGFydCB0aW1lIGluIEFWX1RJTUVfQkFTRSBvciBBVl9OT1BUU19WQUxVRSAqLworICAgIGludCBzZWVrX3RpbWVzdGFtcDsKKyAgICBpbnQ2NF90IHJlY29yZGluZ190aW1lOworICAgIGludCBuYl9zdHJlYW1zOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyZWFtIHRoYXQgZmZtcGVnIGlzIGF3YXJlIG9mOyBtYXkgYmUgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gY3R4Lm5iX3N0cmVhbXMgaWYgbmV3IHN0cmVhbXMgYXBwZWFyIGR1cmluZyBhdl9yZWFkX2ZyYW1lKCkgKi8KKyAgICBpbnQgbmJfc3RyZWFtc193YXJuOyAgLyogbnVtYmVyIG9mIHN0cmVhbXMgdGhhdCB0aGUgdXNlciB3YXMgd2FybmVkIG9mICovCisgICAgaW50IHJhdGVfZW11OworICAgIGludCBhY2N1cmF0ZV9zZWVrOworCisjaWYgSEFWRV9USFJFQURTCisgICAgQVZUaHJlYWRNZXNzYWdlUXVldWUgKmluX3RocmVhZF9xdWV1ZTsKKyAgICBwdGhyZWFkX3QgdGhyZWFkOyAgICAgICAgICAgLyogdGhyZWFkIHJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgKi8KKyAgICBpbnQgbm9uX2Jsb2NraW5nOyAgICAgICAgICAgLyogcmVhZGluZyBwYWNrZXRzIGZyb20gdGhlIHRocmVhZCBzaG91bGQgbm90IGJsb2NrICovCisgICAgaW50IGpvaW5lZDsgICAgICAgICAgICAgICAgIC8qIHRoZSB0aHJlYWQgaGFzIGJlZW4gam9pbmVkICovCisgICAgaW50IHRocmVhZF9xdWV1ZV9zaXplOyAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIHF1ZXVlZCBwYWNrZXRzICovCisjZW5kaWYKK30gSW5wdXRGaWxlOworCitlbnVtIGZvcmNlZF9rZXlmcmFtZXNfY29uc3QgeworICAgIEZLRl9OLAorICAgIEZLRl9OX0ZPUkNFRCwKKyAgICBGS0ZfUFJFVl9GT1JDRURfTiwKKyAgICBGS0ZfUFJFVl9GT1JDRURfVCwKKyAgICBGS0ZfVCwKKyAgICBGS0ZfTkIKK307CisKKyNkZWZpbmUgQUJPUlRfT05fRkxBR19FTVBUWV9PVVRQVVQgKDEgPDwgIDApCisKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBmb3JjZWRfa2V5ZnJhbWVzX2NvbnN0X25hbWVzW107CisKK3R5cGVkZWYgZW51bSB7CisgICAgRU5DT0RFUl9GSU5JU0hFRCA9IDEsCisgICAgTVVYRVJfRklOSVNIRUQgPSAyLAorfSBPU1RGaW5pc2hlZCA7CisKK3R5cGVkZWYgc3RydWN0IE91dHB1dFN0cmVhbSB7CisgICAgaW50IGZpbGVfaW5kZXg7ICAgICAgICAgIC8qIGZpbGUgaW5kZXggKi8KKyAgICBpbnQgaW5kZXg7ICAgICAgICAgICAgICAgLyogc3RyZWFtIGluZGV4IGluIHRoZSBvdXRwdXQgZmlsZSAqLworICAgIGludCBzb3VyY2VfaW5kZXg7ICAgICAgICAvKiBJbnB1dFN0cmVhbSBpbmRleCAqLworICAgIEFWU3RyZWFtICpzdDsgICAgICAgICAgICAvKiBzdHJlYW0gaW4gdGhlIG91dHB1dCBmaWxlICovCisgICAgaW50IGVuY29kaW5nX25lZWRlZDsgICAgIC8qIHRydWUgaWYgZW5jb2RpbmcgbmVlZGVkIGZvciB0aGlzIHN0cmVhbSAqLworICAgIGludCBmcmFtZV9udW1iZXI7CisgICAgLyogaW5wdXQgcHRzIGFuZCBjb3JyZXNwb25kaW5nIG91dHB1dCBwdHMKKyAgICAgICBmb3IgQS9WIHN5bmMgKi8KKyAgICBzdHJ1Y3QgSW5wdXRTdHJlYW0gKnN5bmNfaXN0OyAvKiBpbnB1dCBzdHJlYW0gdG8gc3luYyBhZ2FpbnN0ICovCisgICAgaW50NjRfdCBzeW5jX29wdHM7ICAgICAgIC8qIG91dHB1dCBmcmFtZSBjb3VudGVyLCBjb3VsZCBiZSBjaGFuZ2VkIHRvIHNvbWUgdHJ1ZSB0aW1lc3RhbXAgKi8gLy8gRklYTUUgbG9vayBhdCBmcmFtZV9udW1iZXIKKyAgICAvKiBwdHMgb2YgdGhlIGZpcnN0IGZyYW1lIGVuY29kZWQgZm9yIHRoaXMgc3RyZWFtLCB1c2VkIGZvciBsaW1pdGluZworICAgICAqIHJlY29yZGluZyB0aW1lICovCisgICAgaW50NjRfdCBmaXJzdF9wdHM7CisgICAgLyogZHRzIG9mIHRoZSBsYXN0IHBhY2tldCBzZW50IHRvIHRoZSBtdXhlciAqLworICAgIGludDY0X3QgbGFzdF9tdXhfZHRzOworICAgIC8vIHRoZSB0aW1lYmFzZSBvZiB0aGUgcGFja2V0cyBzZW50IHRvIHRoZSBtdXhlcgorICAgIEFWUmF0aW9uYWwgbXV4X3RpbWViYXNlOworICAgIEFWUmF0aW9uYWwgZW5jX3RpbWViYXNlOworCisgICAgaW50ICAgICAgICAgICAgICAgICAgICBuYl9iaXRzdHJlYW1fZmlsdGVyczsKKyAgICBBVkJTRkNvbnRleHQgICAgICAgICAgICAqKmJzZl9jdHg7CisKKyAgICBBVkNvZGVjQ29udGV4dCAqZW5jX2N0eDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcmVmX3BhcjsgLyogYXNzb2NpYXRlZCBpbnB1dCBjb2RlYyBwYXJhbWV0ZXJzIHdpdGggZW5jb2RlcnMgb3B0aW9ucyBhcHBsaWVkICovCisgICAgQVZDb2RlYyAqZW5jOworICAgIGludDY0X3QgbWF4X2ZyYW1lczsKKyAgICBBVkZyYW1lICpmaWx0ZXJlZF9mcmFtZTsKKyAgICBBVkZyYW1lICpsYXN0X2ZyYW1lOworICAgIGludCBsYXN0X2Ryb3BwZWQ7CisgICAgaW50IGxhc3RfbmIwX2ZyYW1lc1szXTsKKworICAgIHZvaWQgICpod2FjY2VsX2N0eDsKKworICAgIC8qIHZpZGVvIG9ubHkgKi8KKyAgICBBVlJhdGlvbmFsIGZyYW1lX3JhdGU7CisgICAgaW50IGlzX2NmcjsKKyAgICBpbnQgZm9yY2VfZnBzOworICAgIGludCB0b3BfZmllbGRfZmlyc3Q7CisgICAgaW50IHJvdGF0ZV9vdmVycmlkZGVuOworICAgIGRvdWJsZSByb3RhdGVfb3ZlcnJpZGVfdmFsdWU7CisKKyAgICBBVlJhdGlvbmFsIGZyYW1lX2FzcGVjdF9yYXRpbzsKKworICAgIC8qIGZvcmNlZCBrZXkgZnJhbWVzICovCisgICAgaW50NjRfdCAqZm9yY2VkX2tmX3B0czsKKyAgICBpbnQgZm9yY2VkX2tmX2NvdW50OworICAgIGludCBmb3JjZWRfa2ZfaW5kZXg7CisgICAgY2hhciAqZm9yY2VkX2tleWZyYW1lczsKKyAgICBBVkV4cHIgKmZvcmNlZF9rZXlmcmFtZXNfcGV4cHI7CisgICAgZG91YmxlIGZvcmNlZF9rZXlmcmFtZXNfZXhwcl9jb25zdF92YWx1ZXNbRktGX05CXTsKKworICAgIC8qIGF1ZGlvIG9ubHkgKi8KKyAgICBpbnQgKmF1ZGlvX2NoYW5uZWxzX21hcDsgICAgICAgICAgICAgLyogbGlzdCBvZiB0aGUgY2hhbm5lbHMgaWQgdG8gcGljayBmcm9tIHRoZSBzb3VyY2Ugc3RyZWFtICovCisgICAgaW50IGF1ZGlvX2NoYW5uZWxzX21hcHBlZDsgICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyBpbiBhdWRpb19jaGFubmVsc19tYXAgKi8KKworICAgIGNoYXIgKmxvZ2ZpbGVfcHJlZml4OworICAgIEZJTEUgKmxvZ2ZpbGU7CisKKyAgICBPdXRwdXRGaWx0ZXIgKmZpbHRlcjsKKyAgICBjaGFyICphdmZpbHRlcjsKKyAgICBjaGFyICpmaWx0ZXJzOyAgICAgICAgIC8vLzwgZmlsdGVyZ3JhcGggYXNzb2NpYXRlZCB0byB0aGUgLWZpbHRlciBvcHRpb24KKyAgICBjaGFyICpmaWx0ZXJzX3NjcmlwdDsgIC8vLzwgZmlsdGVyZ3JhcGggc2NyaXB0IGFzc29jaWF0ZWQgdG8gdGhlIC1maWx0ZXJfc2NyaXB0IG9wdGlvbgorCisgICAgQVZEaWN0aW9uYXJ5ICplbmNvZGVyX29wdHM7CisgICAgQVZEaWN0aW9uYXJ5ICpzd3NfZGljdDsKKyAgICBBVkRpY3Rpb25hcnkgKnN3cl9vcHRzOworICAgIEFWRGljdGlvbmFyeSAqcmVzYW1wbGVfb3B0czsKKyAgICBjaGFyICphcGFkOworICAgIE9TVEZpbmlzaGVkIGZpbmlzaGVkOyAgICAgICAgLyogbm8gbW9yZSBwYWNrZXRzIHNob3VsZCBiZSB3cml0dGVuIGZvciB0aGlzIHN0cmVhbSAqLworICAgIGludCB1bmF2YWlsYWJsZTsgICAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHRoZSBzdGVyYW0gaXMgdW5hdmFpbGFibGUgKHBvc3NpYmx5IHRlbXBvcmFyaWx5KSAqLworICAgIGludCBzdHJlYW1fY29weTsKKworICAgIC8vIGluaXRfb3V0cHV0X3N0cmVhbSgpIGhhcyBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzdHJlYW0KKyAgICAvLyBUaGUgZW5jb2RlciBhbmQgdGhlIGJpdHN0cmVhbSBmaWx0ZXJzIGhhdmUgYmVlbiBpbml0aWFsaXplZCBhbmQgdGhlIHN0cmVhbQorICAgIC8vIHBhcmFtZXRlcnMgYXJlIHNldCBpbiB0aGUgQVZTdHJlYW0uCisgICAgaW50IGluaXRpYWxpemVkOworCisgICAgaW50IGlucHV0c19kb25lOworCisgICAgY29uc3QgY2hhciAqYXR0YWNobWVudF9maWxlbmFtZTsKKyAgICBpbnQgY29weV9pbml0aWFsX25vbmtleWZyYW1lczsKKyAgICBpbnQgY29weV9wcmlvcl9zdGFydDsKKyAgICBjaGFyICpkaXNwb3NpdGlvbjsKKworICAgIGludCBrZWVwX3BpeF9mbXQ7CisKKyAgICAvKiBzdGF0cyAqLworICAgIC8vIGNvbWJpbmVkIHNpemUgb2YgYWxsIHRoZSBwYWNrZXRzIHdyaXR0ZW4KKyAgICB1aW50NjRfdCBkYXRhX3NpemU7CisgICAgLy8gbnVtYmVyIG9mIHBhY2tldHMgc2VuZCB0byB0aGUgbXV4ZXIKKyAgICB1aW50NjRfdCBwYWNrZXRzX3dyaXR0ZW47CisgICAgLy8gbnVtYmVyIG9mIGZyYW1lcy9zYW1wbGVzIHNlbnQgdG8gdGhlIGVuY29kZXIKKyAgICB1aW50NjRfdCBmcmFtZXNfZW5jb2RlZDsKKyAgICB1aW50NjRfdCBzYW1wbGVzX2VuY29kZWQ7CisKKyAgICAvKiBwYWNrZXQgcXVhbGl0eSBmYWN0b3IgKi8KKyAgICBpbnQgcXVhbGl0eTsKKworICAgIGludCBtYXhfbXV4aW5nX3F1ZXVlX3NpemU7CisKKyAgICAvKiB0aGUgcGFja2V0cyBhcmUgYnVmZmVyZWQgaGVyZSB1bnRpbCB0aGUgbXV4ZXIgaXMgcmVhZHkgdG8gYmUgaW5pdGlhbGl6ZWQgKi8KKyAgICBBVkZpZm9CdWZmZXIgKm11eGluZ19xdWV1ZTsKKworICAgIC8qIHBhY2tldCBwaWN0dXJlIHR5cGUgKi8KKyAgICBpbnQgcGljdF90eXBlOworCisgICAgLyogZnJhbWUgZW5jb2RlIHN1bSBvZiBzcXVhcmVkIGVycm9yIHZhbHVlcyAqLworICAgIGludDY0X3QgZXJyb3JbNF07Cit9IE91dHB1dFN0cmVhbTsKKwordHlwZWRlZiBzdHJ1Y3QgT3V0cHV0RmlsZSB7CisgICAgQVZGb3JtYXRDb250ZXh0ICpjdHg7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRzOworICAgIGludCBvc3RfaW5kZXg7ICAgICAgIC8qIGluZGV4IG9mIHRoZSBmaXJzdCBzdHJlYW0gaW4gb3V0cHV0X3N0cmVhbXMgKi8KKyAgICBpbnQ2NF90IHJlY29yZGluZ190aW1lOyAgLy8vPCBkZXNpcmVkIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIGZpbGUgaW4gbWljcm9zZWNvbmRzID09IEFWX1RJTUVfQkFTRSB1bml0cworICAgIGludDY0X3Qgc3RhcnRfdGltZTsgICAgICAvLy88IHN0YXJ0IHRpbWUgaW4gbWljcm9zZWNvbmRzID09IEFWX1RJTUVfQkFTRSB1bml0cworICAgIHVpbnQ2NF90IGxpbWl0X2ZpbGVzaXplOyAvKiBmaWxlc2l6ZSBsaW1pdCBleHByZXNzZWQgaW4gYnl0ZXMgKi8KKworICAgIGludCBzaG9ydGVzdDsKKworICAgIGludCBoZWFkZXJfd3JpdHRlbjsKK30gT3V0cHV0RmlsZTsKKworZXh0ZXJuIElucHV0U3RyZWFtICoqaW5wdXRfc3RyZWFtczsKK2V4dGVybiBpbnQgICAgICAgIG5iX2lucHV0X3N0cmVhbXM7CitleHRlcm4gSW5wdXRGaWxlICAgKippbnB1dF9maWxlczsKK2V4dGVybiBpbnQgICAgICAgIG5iX2lucHV0X2ZpbGVzOworCitleHRlcm4gT3V0cHV0U3RyZWFtICoqb3V0cHV0X3N0cmVhbXM7CitleHRlcm4gaW50ICAgICAgICAgbmJfb3V0cHV0X3N0cmVhbXM7CitleHRlcm4gT3V0cHV0RmlsZSAgICoqb3V0cHV0X2ZpbGVzOworZXh0ZXJuIGludCAgICAgICAgIG5iX291dHB1dF9maWxlczsKKworZXh0ZXJuIEZpbHRlckdyYXBoICoqZmlsdGVyZ3JhcGhzOworZXh0ZXJuIGludCAgICAgICAgbmJfZmlsdGVyZ3JhcGhzOworCitleHRlcm4gY2hhciAqdnN0YXRzX2ZpbGVuYW1lOworZXh0ZXJuIGNoYXIgKnNkcF9maWxlbmFtZTsKKworZXh0ZXJuIGZsb2F0IGF1ZGlvX2RyaWZ0X3RocmVzaG9sZDsKK2V4dGVybiBmbG9hdCBkdHNfZGVsdGFfdGhyZXNob2xkOworZXh0ZXJuIGZsb2F0IGR0c19lcnJvcl90aHJlc2hvbGQ7CisKK2V4dGVybiBpbnQgYXVkaW9fdm9sdW1lOworZXh0ZXJuIGludCBhdWRpb19zeW5jX21ldGhvZDsKK2V4dGVybiBpbnQgdmlkZW9fc3luY19tZXRob2Q7CitleHRlcm4gZmxvYXQgZnJhbWVfZHJvcF90aHJlc2hvbGQ7CitleHRlcm4gaW50IGRvX2JlbmNobWFyazsKK2V4dGVybiBpbnQgZG9fYmVuY2htYXJrX2FsbDsKK2V4dGVybiBpbnQgZG9fZGVpbnRlcmxhY2U7CitleHRlcm4gaW50IGRvX2hleF9kdW1wOworZXh0ZXJuIGludCBkb19wa3RfZHVtcDsKK2V4dGVybiBpbnQgY29weV90czsKK2V4dGVybiBpbnQgc3RhcnRfYXRfemVybzsKK2V4dGVybiBpbnQgY29weV90YjsKK2V4dGVybiBpbnQgZGVidWdfdHM7CitleHRlcm4gaW50IGV4aXRfb25fZXJyb3I7CitleHRlcm4gaW50IGFib3J0X29uX2ZsYWdzOworZXh0ZXJuIGludCBwcmludF9zdGF0czsKK2V4dGVybiBpbnQgcXBfaGlzdDsKK2V4dGVybiBpbnQgc3RkaW5faW50ZXJhY3Rpb247CitleHRlcm4gaW50IGZyYW1lX2JpdHNfcGVyX3Jhd19zYW1wbGU7CitleHRlcm4gQVZJT0NvbnRleHQgKnByb2dyZXNzX2F2aW87CitleHRlcm4gZmxvYXQgbWF4X2Vycm9yX3JhdGU7CitleHRlcm4gY2hhciAqdmlkZW90b29sYm94X3BpeGZtdDsKKworZXh0ZXJuIGludCBmaWx0ZXJfbmJ0aHJlYWRzOworZXh0ZXJuIGludCBmaWx0ZXJfY29tcGxleF9uYnRocmVhZHM7CitleHRlcm4gaW50IHZzdGF0c192ZXJzaW9uOworCitleHRlcm4gY29uc3QgQVZJT0ludGVycnVwdENCIGludF9jYjsKKworZXh0ZXJuIGNvbnN0IE9wdGlvbkRlZiBvcHRpb25zW107CitleHRlcm4gY29uc3QgSFdBY2NlbCBod2FjY2Vsc1tdOworZXh0ZXJuIEFWQnVmZmVyUmVmICpod19kZXZpY2VfY3R4OworI2lmIENPTkZJR19RU1YKK2V4dGVybiBjaGFyICpxc3ZfZGV2aWNlOworI2VuZGlmCitleHRlcm4gSFdEZXZpY2UgKmZpbHRlcl9od19kZXZpY2U7CisKKwordm9pZCB0ZXJtX2luaXQodm9pZCk7Cit2b2lkIHRlcm1fZXhpdCh2b2lkKTsKKwordm9pZCByZXNldF9vcHRpb25zKE9wdGlvbnNDb250ZXh0ICpvLCBpbnQgaXNfaW5wdXQpOwordm9pZCBzaG93X3VzYWdlKHZvaWQpOworCit2b2lkIG9wdF9vdXRwdXRfZmlsZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKwordm9pZCByZW1vdmVfYXZvcHRpb25zKEFWRGljdGlvbmFyeSAqKmEsIEFWRGljdGlvbmFyeSAqYik7Cit2b2lkIGFzc2VydF9hdm9wdGlvbnMoQVZEaWN0aW9uYXJ5ICptKTsKKworaW50IGd1ZXNzX2lucHV0X2NoYW5uZWxfbGF5b3V0KElucHV0U3RyZWFtICppc3QpOworCitlbnVtIEFWUGl4ZWxGb3JtYXQgY2hvb3NlX3BpeGVsX2ZtdChBVlN0cmVhbSAqc3QsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZDb2RlYyAqY29kZWMsIGVudW0gQVZQaXhlbEZvcm1hdCB0YXJnZXQpOwordm9pZCBjaG9vc2Vfc2FtcGxlX2ZtdChBVlN0cmVhbSAqc3QsIEFWQ29kZWMgKmNvZGVjKTsKKworaW50IGNvbmZpZ3VyZV9maWx0ZXJncmFwaChGaWx0ZXJHcmFwaCAqZmcpOworaW50IGNvbmZpZ3VyZV9vdXRwdXRfZmlsdGVyKEZpbHRlckdyYXBoICpmZywgT3V0cHV0RmlsdGVyICpvZmlsdGVyLCBBVkZpbHRlckluT3V0ICpvdXQpOwordm9pZCBjaGVja19maWx0ZXJfb3V0cHV0cyh2b2lkKTsKK2ludCBpc3RfaW5fZmlsdGVyZ3JhcGgoRmlsdGVyR3JhcGggKmZnLCBJbnB1dFN0cmVhbSAqaXN0KTsKK2ludCBmaWx0ZXJncmFwaF9pc19zaW1wbGUoRmlsdGVyR3JhcGggKmZnKTsKK2ludCBpbml0X3NpbXBsZV9maWx0ZXJncmFwaChJbnB1dFN0cmVhbSAqaXN0LCBPdXRwdXRTdHJlYW0gKm9zdCk7CitpbnQgaW5pdF9jb21wbGV4X2ZpbHRlcmdyYXBoKEZpbHRlckdyYXBoICpmZyk7CisKK3ZvaWQgc3ViMnZpZGVvX3VwZGF0ZShJbnB1dFN0cmVhbSAqaXN0LCBBVlN1YnRpdGxlICpzdWIpOworCitpbnQgaWZpbHRlcl9wYXJhbWV0ZXJzX2Zyb21fZnJhbWUoSW5wdXRGaWx0ZXIgKmlmaWx0ZXIsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKKworaW50IGZmbXBlZ19wYXJzZV9vcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKK2ludCB2aWRlb3Rvb2xib3hfaW5pdChBVkNvZGVjQ29udGV4dCAqcyk7CitpbnQgcXN2X2luaXQoQVZDb2RlY0NvbnRleHQgKnMpOworaW50IGN1dmlkX2luaXQoQVZDb2RlY0NvbnRleHQgKnMpOworCitIV0RldmljZSAqaHdfZGV2aWNlX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGh3X2RldmljZV9pbml0X2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKmFyZywgSFdEZXZpY2UgKipkZXYpOwordm9pZCBod19kZXZpY2VfZnJlZV9hbGwodm9pZCk7CisKK2ludCBod19kZXZpY2Vfc2V0dXBfZm9yX2RlY29kZShJbnB1dFN0cmVhbSAqaXN0KTsKK2ludCBod19kZXZpY2Vfc2V0dXBfZm9yX2VuY29kZShPdXRwdXRTdHJlYW0gKm9zdCk7CisKK2ludCBod2FjY2VsX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKyNlbmRpZiAvKiBGRlRPT0xTX0ZGTVBFR19IICovCmRpZmYgLS1naXQgYS9mZnRvb2xzL2ZmbXBlZ19jdXZpZC5jIGIvZmZ0b29scy9mZm1wZWdfY3V2aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmYzYjQwCi0tLSAvZGV2L251bGwKKysrIGIvZmZ0b29scy9mZm1wZWdfY3V2aWQuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImZmbXBlZy5oIgorCitzdGF0aWMgdm9pZCBjdXZpZF91bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIElucHV0U3RyZWFtICppc3QgPSBhdmN0eC0+b3BhcXVlOworICAgIGF2X2J1ZmZlcl91bnJlZigmaXN0LT5od19mcmFtZXNfY3R4KTsKK30KKworaW50IGN1dmlkX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIElucHV0U3RyZWFtICppc3QgPSBhdmN0eC0+b3BhcXVlOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmcmFtZXNfY3R4OworICAgIGludCByZXQ7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiSW5pdGlhbGl6aW5nIGN1dmlkIGh3YWNjZWxcbiIpOworCisgICAgaWYgKCFod19kZXZpY2VfY3R4KSB7CisgICAgICAgIHJldCA9IGF2X2h3ZGV2aWNlX2N0eF9jcmVhdGUoJmh3X2RldmljZV9jdHgsIEFWX0hXREVWSUNFX1RZUEVfQ1VEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmh3YWNjZWxfZGV2aWNlLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcgYSBDVURBIGRldmljZVxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgYXZfYnVmZmVyX3VucmVmKCZpc3QtPmh3X2ZyYW1lc19jdHgpOworICAgIGlzdC0+aHdfZnJhbWVzX2N0eCA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGh3X2RldmljZV9jdHgpOworICAgIGlmICghaXN0LT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcgYSBDVURBIGZyYW1lcyBjb250ZXh0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0Kilpc3QtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICBmcmFtZXNfY3R4LT5mb3JtYXQgPSBBVl9QSVhfRk1UX0NVREE7CisgICAgZnJhbWVzX2N0eC0+c3dfZm9ybWF0ID0gYXZjdHgtPnN3X3BpeF9mbXQ7CisgICAgZnJhbWVzX2N0eC0+d2lkdGggPSBhdmN0eC0+d2lkdGg7CisgICAgZnJhbWVzX2N0eC0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW5pdGlhbGl6aW5nIENVREEgZnJhbWVzIGNvbnRleHQ6IHN3X2Zvcm1hdCA9ICVzLCB3aWR0aCA9ICVkLCBoZWlnaHQgPSAlZFxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShmcmFtZXNfY3R4LT5zd19mb3JtYXQpLCBmcmFtZXNfY3R4LT53aWR0aCwgZnJhbWVzX2N0eC0+aGVpZ2h0KTsKKworICAgIHJldCA9IGF2X2h3ZnJhbWVfY3R4X2luaXQoaXN0LT5od19mcmFtZXNfY3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBhIENVREEgZnJhbWUgcG9vbFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaXN0LT5od2FjY2VsX3VuaW5pdCA9IGN1dmlkX3VuaW5pdDsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZ0b29scy9mZm1wZWdfZmlsdGVyLmMgYi9mZnRvb2xzL2ZmbXBlZ19maWx0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzdmZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvZmZ0b29scy9mZm1wZWdfZmlsdGVyLmMKQEAgLTAsMCArMSwxMjExIEBACisvKgorICogZmZtcGVnIGZpbHRlciBjb25maWd1cmF0aW9uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImZmbXBlZy5oIgorCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9idWZmZXJzaW5rLmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvYnVmZmVyc3JjLmgiCisKKyNpbmNsdWRlICJsaWJhdnJlc2FtcGxlL2F2cmVzYW1wbGUuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmdldF9jb21wbGlhbmNlX3Vub2ZmaWNpYWxfcGl4X2ZtdHMoZW51bSBBVkNvZGVjSUQgY29kZWNfaWQsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBkZWZhdWx0X2Zvcm1hdHNbXSkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG1qcGVnX2Zvcm1hdHNbXSA9CisgICAgICAgIHsgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBsanBlZ19mb3JtYXRzW10gPQorICAgICAgICB7IEFWX1BJWF9GTVRfQkdSMjQgICAsIEFWX1BJWF9GTVRfQkdSQSAgICAsIEFWX1BJWF9GTVRfQkdSMCwKKyAgICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCAsIEFWX1BJWF9GTVRfWVVWNDQ0UCAsIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgICBBVl9QSVhfRk1UX05PTkV9OworCisgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX01KUEVHKSB7CisgICAgICAgIHJldHVybiBtanBlZ19mb3JtYXRzOworICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTEpQRUcpIHsKKyAgICAgICAgcmV0dXJuIGxqcGVnX2Zvcm1hdHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRfZm9ybWF0czsKKyAgICB9Cit9CisKK2VudW0gQVZQaXhlbEZvcm1hdCBjaG9vc2VfcGl4ZWxfZm10KEFWU3RyZWFtICpzdCwgQVZDb2RlY0NvbnRleHQgKmVuY19jdHgsIEFWQ29kZWMgKmNvZGVjLCBlbnVtIEFWUGl4ZWxGb3JtYXQgdGFyZ2V0KQoreworICAgIGlmIChjb2RlYyAmJiBjb2RlYy0+cGl4X2ZtdHMpIHsKKyAgICAgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwID0gY29kZWMtPnBpeF9mbXRzOworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHRhcmdldCk7CisgICAgICAgIGludCBoYXNfYWxwaGEgPSBkZXNjID8gZGVzYy0+bmJfY29tcG9uZW50cyAlIDIgPT0gMCA6IDA7CisgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBiZXN0PSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICAgICAgaWYgKGVuY19jdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8PSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKKyAgICAgICAgICAgIHAgPSBnZXRfY29tcGxpYW5jZV91bm9mZmljaWFsX3BpeF9mbXRzKGVuY19jdHgtPmNvZGVjX2lkLCBwKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgKnAgIT0gQVZfUElYX0ZNVF9OT05FOyBwKyspIHsKKyAgICAgICAgICAgIGJlc3Q9IGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXRfb2ZfMihiZXN0LCAqcCwgdGFyZ2V0LCBoYXNfYWxwaGEsIE5VTEwpOworICAgICAgICAgICAgaWYgKCpwID09IHRhcmdldCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnAgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgICAgICBpZiAodGFyZ2V0ICE9IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBhdGlibGUgcGl4ZWwgZm9ybWF0ICclcycgZm9yIGNvZGVjICclcycsIGF1dG8tc2VsZWN0aW5nIGZvcm1hdCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHRhcmdldCksCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGJlc3QpKTsKKyAgICAgICAgICAgIHJldHVybiBiZXN0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0YXJnZXQ7Cit9CisKK3ZvaWQgY2hvb3NlX3NhbXBsZV9mbXQoQVZTdHJlYW0gKnN0LCBBVkNvZGVjICpjb2RlYykKK3sKKyAgICBpZiAoY29kZWMgJiYgY29kZWMtPnNhbXBsZV9mbXRzKSB7CisgICAgICAgIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgKnAgPSBjb2RlYy0+c2FtcGxlX2ZtdHM7CisgICAgICAgIGZvciAoOyAqcCAhPSAtMTsgcCsrKSB7CisgICAgICAgICAgICBpZiAoKnAgPT0gc3QtPmNvZGVjcGFyLT5mb3JtYXQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpwID09IC0xKSB7CisgICAgICAgICAgICBpZigoY29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9MT1NTTEVTUykgJiYgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShzdC0+Y29kZWNwYXItPmZvcm1hdCkgPiBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGNvZGVjLT5zYW1wbGVfZm10c1swXSkpCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvbnZlcnNpb24gd2lsbCBub3QgYmUgbG9zc2xlc3MuXG4iKTsKKyAgICAgICAgICAgIGlmKGF2X2dldF9zYW1wbGVfZm10X25hbWUoc3QtPmNvZGVjcGFyLT5mb3JtYXQpKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJJbmNvbXBhdGlibGUgc2FtcGxlIGZvcm1hdCAnJXMnIGZvciBjb2RlYyAnJXMnLCBhdXRvLXNlbGVjdGluZyBmb3JtYXQgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHN0LT5jb2RlY3Bhci0+Zm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICBjb2RlYy0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGNvZGVjLT5zYW1wbGVfZm10c1swXSkpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBjb2RlYy0+c2FtcGxlX2ZtdHNbMF07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBjaGFyICpjaG9vc2VfcGl4X2ZtdHMoT3V0cHV0RmlsdGVyICpvZmlsdGVyKQoreworICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gb2ZpbHRlci0+b3N0OworICAgIEFWRGljdGlvbmFyeUVudHJ5ICpzdHJpY3RfZGljdCA9IGF2X2RpY3RfZ2V0KG9zdC0+ZW5jb2Rlcl9vcHRzLCAic3RyaWN0IiwgTlVMTCwgMCk7CisgICAgaWYgKHN0cmljdF9kaWN0KQorICAgICAgICAvLyB1c2VkIGJ5IGNob29zZV9waXhlbF9mbXQoKSBhbmQgYmVsb3cKKyAgICAgICAgYXZfb3B0X3NldChvc3QtPmVuY19jdHgsICJzdHJpY3QiLCBzdHJpY3RfZGljdC0+dmFsdWUsIDApOworCisgICAgIGlmIChvc3QtPmtlZXBfcGl4X2ZtdCkgeworICAgICAgICBhdmZpbHRlcl9ncmFwaF9zZXRfYXV0b19jb252ZXJ0KG9maWx0ZXItPmdyYXBoLT5ncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGSUxURVJfQVVUT19DT05WRVJUX05PTkUpOworICAgICAgICBpZiAob3N0LT5lbmNfY3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gYXZfc3RyZHVwKGF2X2dldF9waXhfZm10X25hbWUob3N0LT5lbmNfY3R4LT5waXhfZm10KSk7CisgICAgfQorICAgIGlmIChvc3QtPmVuY19jdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIHJldHVybiBhdl9zdHJkdXAoYXZfZ2V0X3BpeF9mbXRfbmFtZShjaG9vc2VfcGl4ZWxfZm10KG9zdC0+c3QsIG9zdC0+ZW5jX2N0eCwgb3N0LT5lbmMsIG9zdC0+ZW5jX2N0eC0+cGl4X2ZtdCkpKTsKKyAgICB9IGVsc2UgaWYgKG9zdC0+ZW5jICYmIG9zdC0+ZW5jLT5waXhfZm10cykgeworICAgICAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnA7CisgICAgICAgIEFWSU9Db250ZXh0ICpzID0gTlVMTDsKKyAgICAgICAgdWludDhfdCAqcmV0OworICAgICAgICBpbnQgbGVuOworCisgICAgICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcykgPCAwKQorICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworCisgICAgICAgIHAgPSBvc3QtPmVuYy0+cGl4X2ZtdHM7CisgICAgICAgIGlmIChvc3QtPmVuY19jdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8PSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKKyAgICAgICAgICAgIHAgPSBnZXRfY29tcGxpYW5jZV91bm9mZmljaWFsX3BpeF9mbXRzKG9zdC0+ZW5jX2N0eC0+Y29kZWNfaWQsIHApOworICAgICAgICB9CisKKyAgICAgICAgZm9yICg7ICpwICE9IEFWX1BJWF9GTVRfTk9ORTsgcCsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gYXZfZ2V0X3BpeF9mbXRfbmFtZSgqcCk7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihzLCAiJXN8IiwgbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gYXZpb19jbG9zZV9keW5fYnVmKHMsICZyZXQpOworICAgICAgICByZXRbbGVuIC0gMV0gPSAwOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworLyogRGVmaW5lIGEgZnVuY3Rpb24gZm9yIGJ1aWxkaW5nIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBsaXN0IG9mCisgKiBhbGxvd2VkIGZvcm1hdHMuICovCisjZGVmaW5lIERFRl9DSE9PU0VfRk9STUFUKHN1ZmZpeCwgdHlwZSwgdmFyLCBzdXBwb3J0ZWRfbGlzdCwgbm9uZSwgZ2V0X25hbWUpICAgXAorc3RhdGljIGNoYXIgKmNob29zZV8gIyMgc3VmZml4IChPdXRwdXRGaWx0ZXIgKm9maWx0ZXIpICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG9maWx0ZXItPnZhciAhPSBub25lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnZXRfbmFtZShvZmlsdGVyLT52YXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIGF2X3N0cmR1cChuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChvZmlsdGVyLT5zdXBwb3J0ZWRfbGlzdCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB0eXBlICpwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQVZJT0NvbnRleHQgKnMgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ4X3QgKnJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcykgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChwID0gb2ZpbHRlci0+c3VwcG9ydGVkX2xpc3Q7ICpwICE9IG5vbmU7IHArKykgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnZXRfbmFtZSgqcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZpb19wcmludGYocywgIiVzfCIsIG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihzLCAmcmV0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXRbbGVuIC0gMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy9ERUZfQ0hPT1NFX0ZPUk1BVChwaXhfZm10cywgZW51bSBBVlBpeGVsRm9ybWF0LCBmb3JtYXQsIGZvcm1hdHMsIEFWX1BJWF9GTVRfTk9ORSwKKy8vICAgICAgICAgICAgICAgICAgR0VUX1BJWF9GTVRfTkFNRSkKKworREVGX0NIT09TRV9GT1JNQVQoc2FtcGxlX2ZtdHMsIGVudW0gQVZTYW1wbGVGb3JtYXQsIGZvcm1hdCwgZm9ybWF0cywKKyAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSwgR0VUX1NBTVBMRV9GTVRfTkFNRSkKKworREVGX0NIT09TRV9GT1JNQVQoc2FtcGxlX3JhdGVzLCBpbnQsIHNhbXBsZV9yYXRlLCBzYW1wbGVfcmF0ZXMsIDAsCisgICAgICAgICAgICAgICAgICBHRVRfU0FNUExFX1JBVEVfTkFNRSkKKworREVGX0NIT09TRV9GT1JNQVQoY2hhbm5lbF9sYXlvdXRzLCB1aW50NjRfdCwgY2hhbm5lbF9sYXlvdXQsIGNoYW5uZWxfbGF5b3V0cywgMCwKKyAgICAgICAgICAgICAgICAgIEdFVF9DSF9MQVlPVVRfTkFNRSkKKworaW50IGluaXRfc2ltcGxlX2ZpbHRlcmdyYXBoKElucHV0U3RyZWFtICppc3QsIE91dHB1dFN0cmVhbSAqb3N0KQoreworICAgIEZpbHRlckdyYXBoICpmZyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmZykpOworCisgICAgaWYgKCFmZykKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIGZnLT5pbmRleCA9IG5iX2ZpbHRlcmdyYXBoczsKKworICAgIEdST1dfQVJSQVkoZmctPm91dHB1dHMsIGZnLT5uYl9vdXRwdXRzKTsKKyAgICBpZiAoIShmZy0+b3V0cHV0c1swXSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmZy0+b3V0cHV0c1swXSkpKSkKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIGZnLT5vdXRwdXRzWzBdLT5vc3QgICA9IG9zdDsKKyAgICBmZy0+b3V0cHV0c1swXS0+Z3JhcGggPSBmZzsKKyAgICBmZy0+b3V0cHV0c1swXS0+Zm9ybWF0ID0gLTE7CisKKyAgICBvc3QtPmZpbHRlciA9IGZnLT5vdXRwdXRzWzBdOworCisgICAgR1JPV19BUlJBWShmZy0+aW5wdXRzLCBmZy0+bmJfaW5wdXRzKTsKKyAgICBpZiAoIShmZy0+aW5wdXRzWzBdID0gYXZfbWFsbG9jeihzaXplb2YoKmZnLT5pbnB1dHNbMF0pKSkpCisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICBmZy0+aW5wdXRzWzBdLT5pc3QgICA9IGlzdDsKKyAgICBmZy0+aW5wdXRzWzBdLT5ncmFwaCA9IGZnOworICAgIGZnLT5pbnB1dHNbMF0tPmZvcm1hdCA9IC0xOworCisgICAgZmctPmlucHV0c1swXS0+ZnJhbWVfcXVldWUgPSBhdl9maWZvX2FsbG9jKDggKiBzaXplb2YoQVZGcmFtZSopKTsKKyAgICBpZiAoIWZnLT5pbnB1dHNbMF0tPmZyYW1lX3F1ZXVlKQorICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisKKyAgICBHUk9XX0FSUkFZKGlzdC0+ZmlsdGVycywgaXN0LT5uYl9maWx0ZXJzKTsKKyAgICBpc3QtPmZpbHRlcnNbaXN0LT5uYl9maWx0ZXJzIC0gMV0gPSBmZy0+aW5wdXRzWzBdOworCisgICAgR1JPV19BUlJBWShmaWx0ZXJncmFwaHMsIG5iX2ZpbHRlcmdyYXBocyk7CisgICAgZmlsdGVyZ3JhcGhzW25iX2ZpbHRlcmdyYXBocyAtIDFdID0gZmc7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKmRlc2NyaWJlX2ZpbHRlcl9saW5rKEZpbHRlckdyYXBoICpmZywgQVZGaWx0ZXJJbk91dCAqaW5vdXQsIGludCBpbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlub3V0LT5maWx0ZXJfY3R4OworICAgIEFWRmlsdGVyUGFkICpwYWRzID0gaW4gPyBjdHgtPmlucHV0X3BhZHMgIDogY3R4LT5vdXRwdXRfcGFkczsKKyAgICBpbnQgICAgICAgbmJfcGFkcyA9IGluID8gY3R4LT5uYl9pbnB1dHMgICA6IGN0eC0+bmJfb3V0cHV0czsKKyAgICBBVklPQ29udGV4dCAqcGI7CisgICAgdWludDhfdCAqcmVzID0gTlVMTDsKKworICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmcGIpIDwgMCkKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworCisgICAgYXZpb19wcmludGYocGIsICIlcyIsIGN0eC0+ZmlsdGVyLT5uYW1lKTsKKyAgICBpZiAobmJfcGFkcyA+IDEpCisgICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiOiVzIiwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKHBhZHMsIGlub3V0LT5wYWRfaWR4KSk7CisgICAgYXZpb193OChwYiwgMCk7CisgICAgYXZpb19jbG9zZV9keW5fYnVmKHBiLCAmcmVzKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBpbml0X2lucHV0X2ZpbHRlcihGaWx0ZXJHcmFwaCAqZmcsIEFWRmlsdGVySW5PdXQgKmluKQoreworICAgIElucHV0U3RyZWFtICppc3QgPSBOVUxMOworICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZSA9IGF2ZmlsdGVyX3BhZF9nZXRfdHlwZShpbi0+ZmlsdGVyX2N0eC0+aW5wdXRfcGFkcywgaW4tPnBhZF9pZHgpOworICAgIGludCBpOworCisgICAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciBmaWx0ZXIgdHlwZXMKKyAgICBpZiAodHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gJiYgdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIk9ubHkgdmlkZW8gYW5kIGF1ZGlvIGZpbHRlcnMgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICJjdXJyZW50bHkuXG4iKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGlmIChpbi0+bmFtZSkgeworICAgICAgICBBVkZvcm1hdENvbnRleHQgKnM7CisgICAgICAgIEFWU3RyZWFtICAgICAgICpzdCA9IE5VTEw7CisgICAgICAgIGNoYXIgKnA7CisgICAgICAgIGludCBmaWxlX2lkeCA9IHN0cnRvbChpbi0+bmFtZSwgJnAsIDApOworCisgICAgICAgIGlmIChmaWxlX2lkeCA8IDAgfHwgZmlsZV9pZHggPj0gbmJfaW5wdXRfZmlsZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGZpbGUgaW5kZXggJWQgaW4gZmlsdGVyZ3JhcGggZGVzY3JpcHRpb24gJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIGZpbGVfaWR4LCBmZy0+Z3JhcGhfZGVzYyk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgcyA9IGlucHV0X2ZpbGVzW2ZpbGVfaWR4XS0+Y3R4OworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgc3RyZWFtX3R5cGUgPSBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZTsKKyAgICAgICAgICAgIGlmIChzdHJlYW1fdHlwZSAhPSB0eXBlICYmCisgICAgICAgICAgICAgICAgIShzdHJlYW1fdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUgJiYKKyAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIC8qIHN1YjJ2aWRlbyBoYWNrICovKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChjaGVja19zdHJlYW1fc3BlY2lmaWVyKHMsIHMtPnN0cmVhbXNbaV0sICpwID09ICc6JyA/IHAgKyAxIDogcCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0KSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU3RyZWFtIHNwZWNpZmllciAnJXMnIGluIGZpbHRlcmdyYXBoIGRlc2NyaXB0aW9uICVzICIKKyAgICAgICAgICAgICAgICAgICAibWF0Y2hlcyBubyBzdHJlYW1zLlxuIiwgcCwgZmctPmdyYXBoX2Rlc2MpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbaW5wdXRfZmlsZXNbZmlsZV9pZHhdLT5pc3RfaW5kZXggKyBzdC0+aW5kZXhdOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZpbmQgdGhlIGZpcnN0IHVudXNlZCBzdHJlYW0gb2YgY29ycmVzcG9uZGluZyB0eXBlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbaV07CisgICAgICAgICAgICBpZiAoaXN0LT5kZWNfY3R4LT5jb2RlY190eXBlID09IHR5cGUgJiYgaXN0LT5kaXNjYXJkKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IG5iX2lucHV0X3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDYW5ub3QgZmluZCBhIG1hdGNoaW5nIHN0cmVhbSBmb3IgIgorICAgICAgICAgICAgICAgICAgICJ1bmxhYmVsZWQgaW5wdXQgcGFkICVkIG9uIGZpbHRlciAlc1xuIiwgaW4tPnBhZF9pZHgsCisgICAgICAgICAgICAgICAgICAgaW4tPmZpbHRlcl9jdHgtPm5hbWUpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgfQorICAgIGF2X2Fzc2VydDAoaXN0KTsKKworICAgIGlzdC0+ZGlzY2FyZCAgICAgICAgID0gMDsKKyAgICBpc3QtPmRlY29kaW5nX25lZWRlZCB8PSBERUNPRElOR19GT1JfRklMVEVSOworICAgIGlzdC0+c3QtPmRpc2NhcmQgPSBBVkRJU0NBUkRfTk9ORTsKKworICAgIEdST1dfQVJSQVkoZmctPmlucHV0cywgZmctPm5iX2lucHV0cyk7CisgICAgaWYgKCEoZmctPmlucHV0c1tmZy0+bmJfaW5wdXRzIC0gMV0gPSBhdl9tYWxsb2N6KHNpemVvZigqZmctPmlucHV0c1swXSkpKSkKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIGZnLT5pbnB1dHNbZmctPm5iX2lucHV0cyAtIDFdLT5pc3QgICA9IGlzdDsKKyAgICBmZy0+aW5wdXRzW2ZnLT5uYl9pbnB1dHMgLSAxXS0+Z3JhcGggPSBmZzsKKyAgICBmZy0+aW5wdXRzW2ZnLT5uYl9pbnB1dHMgLSAxXS0+Zm9ybWF0ID0gLTE7CisgICAgZmctPmlucHV0c1tmZy0+bmJfaW5wdXRzIC0gMV0tPnR5cGUgPSBpc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZTsKKyAgICBmZy0+aW5wdXRzW2ZnLT5uYl9pbnB1dHMgLSAxXS0+bmFtZSA9IGRlc2NyaWJlX2ZpbHRlcl9saW5rKGZnLCBpbiwgMSk7CisKKyAgICBmZy0+aW5wdXRzW2ZnLT5uYl9pbnB1dHMgLSAxXS0+ZnJhbWVfcXVldWUgPSBhdl9maWZvX2FsbG9jKDggKiBzaXplb2YoQVZGcmFtZSopKTsKKyAgICBpZiAoIWZnLT5pbnB1dHNbZmctPm5iX2lucHV0cyAtIDFdLT5mcmFtZV9xdWV1ZSkKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworCisgICAgR1JPV19BUlJBWShpc3QtPmZpbHRlcnMsIGlzdC0+bmJfZmlsdGVycyk7CisgICAgaXN0LT5maWx0ZXJzW2lzdC0+bmJfZmlsdGVycyAtIDFdID0gZmctPmlucHV0c1tmZy0+bmJfaW5wdXRzIC0gMV07Cit9CisKK2ludCBpbml0X2NvbXBsZXhfZmlsdGVyZ3JhcGgoRmlsdGVyR3JhcGggKmZnKQoreworICAgIEFWRmlsdGVySW5PdXQgKmlucHV0cywgKm91dHB1dHMsICpjdXI7CisgICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGg7CisgICAgaW50IHJldCA9IDA7CisKKyAgICAvKiB0aGlzIGdyYXBoIGlzIG9ubHkgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIGtpbmRzIG9mIGlucHV0cworICAgICAqIGFuZCBvdXRwdXRzIHdlIGhhdmUsIGFuZCBpcyBkaXNjYXJkZWQgb24gZXhpdCBmcm9tIHRoaXMgZnVuY3Rpb24gKi8KKyAgICBncmFwaCA9IGF2ZmlsdGVyX2dyYXBoX2FsbG9jKCk7CisgICAgaWYgKCFncmFwaCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBncmFwaC0+bmJfdGhyZWFkcyA9IDE7CisKKyAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9wYXJzZTIoZ3JhcGgsIGZnLT5ncmFwaF9kZXNjLCAmaW5wdXRzLCAmb3V0cHV0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZvciAoY3VyID0gaW5wdXRzOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkKKyAgICAgICAgaW5pdF9pbnB1dF9maWx0ZXIoZmcsIGN1cik7CisKKyAgICBmb3IgKGN1ciA9IG91dHB1dHM7IGN1cjspIHsKKyAgICAgICAgR1JPV19BUlJBWShmZy0+b3V0cHV0cywgZmctPm5iX291dHB1dHMpOworICAgICAgICBmZy0+b3V0cHV0c1tmZy0+bmJfb3V0cHV0cyAtIDFdID0gYXZfbWFsbG9jeihzaXplb2YoKmZnLT5vdXRwdXRzWzBdKSk7CisgICAgICAgIGlmICghZmctPm91dHB1dHNbZmctPm5iX291dHB1dHMgLSAxXSkKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKworICAgICAgICBmZy0+b3V0cHV0c1tmZy0+bmJfb3V0cHV0cyAtIDFdLT5ncmFwaCAgID0gZmc7CisgICAgICAgIGZnLT5vdXRwdXRzW2ZnLT5uYl9vdXRwdXRzIC0gMV0tPm91dF90bXAgPSBjdXI7CisgICAgICAgIGZnLT5vdXRwdXRzW2ZnLT5uYl9vdXRwdXRzIC0gMV0tPnR5cGUgICAgPSBhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoY3VyLT5maWx0ZXJfY3R4LT5vdXRwdXRfcGFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXItPnBhZF9pZHgpOworICAgICAgICBmZy0+b3V0cHV0c1tmZy0+bmJfb3V0cHV0cyAtIDFdLT5uYW1lID0gZGVzY3JpYmVfZmlsdGVyX2xpbmsoZmcsIGN1ciwgMCk7CisgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKKyAgICAgICAgZmctPm91dHB1dHNbZmctPm5iX291dHB1dHMgLSAxXS0+b3V0X3RtcC0+bmV4dCA9IE5VTEw7CisgICAgfQorCitmYWlsOgorICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJmlucHV0cyk7CisgICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmZ3JhcGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW5zZXJ0X3RyaW0oaW50NjRfdCBzdGFydF90aW1lLCBpbnQ2NF90IGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckNvbnRleHQgKipsYXN0X2ZpbHRlciwgaW50ICpwYWRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWx0ZXJfbmFtZSkKK3sKKyAgICBBVkZpbHRlckdyYXBoICpncmFwaCA9ICgqbGFzdF9maWx0ZXIpLT5ncmFwaDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eDsKKyAgICBjb25zdCBBVkZpbHRlciAqdHJpbTsKKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoKCpsYXN0X2ZpbHRlciktPm91dHB1dF9wYWRzLCAqcGFkX2lkeCk7CisgICAgY29uc3QgY2hhciAqbmFtZSA9ICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgPyAidHJpbSIgOiAiYXRyaW0iOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGR1cmF0aW9uID09IElOVDY0X01BWCAmJiBzdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHRyaW0gPSBhdmZpbHRlcl9nZXRfYnlfbmFtZShuYW1lKTsKKyAgICBpZiAoIXRyaW0pIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVzIGZpbHRlciBub3QgcHJlc2VudCwgY2Fubm90IGxpbWl0ICIKKyAgICAgICAgICAgICAgICJyZWNvcmRpbmcgdGltZS5cbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9GSUxURVJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIGN0eCA9IGF2ZmlsdGVyX2dyYXBoX2FsbG9jX2ZpbHRlcihncmFwaCwgdHJpbSwgZmlsdGVyX25hbWUpOworICAgIGlmICghY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGR1cmF0aW9uICE9IElOVDY0X01BWCkgeworICAgICAgICByZXQgPSBhdl9vcHRfc2V0X2ludChjdHgsICJkdXJhdGlvbmkiLCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9DSElMRFJFTik7CisgICAgfQorICAgIGlmIChyZXQgPj0gMCAmJiBzdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHJldCA9IGF2X29wdF9zZXRfaW50KGN0eCwgInN0YXJ0aSIsIHN0YXJ0X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pOworICAgIH0KKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBjb25maWd1cmluZyB0aGUgJXMgZmlsdGVyIiwgbmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gYXZmaWx0ZXJfaW5pdF9zdHIoY3R4LCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGF2ZmlsdGVyX2xpbmsoKmxhc3RfZmlsdGVyLCAqcGFkX2lkeCwgY3R4LCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpsYXN0X2ZpbHRlciA9IGN0eDsKKyAgICAqcGFkX2lkeCAgICAgPSAwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluc2VydF9maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICoqbGFzdF9maWx0ZXIsIGludCAqcGFkX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWx0ZXJfbmFtZSwgY29uc3QgY2hhciAqYXJncykKK3sKKyAgICBBVkZpbHRlckdyYXBoICpncmFwaCA9ICgqbGFzdF9maWx0ZXIpLT5ncmFwaDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eDsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoZmlsdGVyX25hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX25hbWUsIGFyZ3MsIE5VTEwsIGdyYXBoKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGF2ZmlsdGVyX2xpbmsoKmxhc3RfZmlsdGVyLCAqcGFkX2lkeCwgY3R4LCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpsYXN0X2ZpbHRlciA9IGN0eDsKKyAgICAqcGFkX2lkeCAgICAgPSAwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ3VyZV9vdXRwdXRfdmlkZW9fZmlsdGVyKEZpbHRlckdyYXBoICpmZywgT3V0cHV0RmlsdGVyICpvZmlsdGVyLCBBVkZpbHRlckluT3V0ICpvdXQpCit7CisgICAgY2hhciAqcGl4X2ZtdHM7CisgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBvZmlsdGVyLT5vc3Q7CisgICAgT3V0cHV0RmlsZSAgICAqb2YgPSBvdXRwdXRfZmlsZXNbb3N0LT5maWxlX2luZGV4XTsKKyAgICBBVkZpbHRlckNvbnRleHQgKmxhc3RfZmlsdGVyID0gb3V0LT5maWx0ZXJfY3R4OworICAgIGludCBwYWRfaWR4ID0gb3V0LT5wYWRfaWR4OworICAgIGludCByZXQ7CisgICAgY2hhciBuYW1lWzI1NV07CisKKyAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJvdXRfJWRfJWQiLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJm9maWx0ZXItPmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJidWZmZXJzaW5rIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBOVUxMLCBOVUxMLCBmZy0+Z3JhcGgpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAob2ZpbHRlci0+d2lkdGggfHwgb2ZpbHRlci0+aGVpZ2h0KSB7CisgICAgICAgIGNoYXIgYXJnc1syNTVdOworICAgICAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlcjsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUgPSBOVUxMOworCisgICAgICAgIHNucHJpbnRmKGFyZ3MsIHNpemVvZihhcmdzKSwgIiVkOiVkIiwKKyAgICAgICAgICAgICAgICAgb2ZpbHRlci0+d2lkdGgsIG9maWx0ZXItPmhlaWdodCk7CisKKyAgICAgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQob3N0LT5zd3NfZGljdCwgIiIsIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICI6JXM9JXMiLCBlLT5rZXksIGUtPnZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInNjYWxlcl9vdXRfJWRfJWQiLAorICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmZpbHRlciwgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoInNjYWxlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBhcmdzLCBOVUxMLCBmZy0+Z3JhcGgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2xpbmsobGFzdF9maWx0ZXIsIHBhZF9pZHgsIGZpbHRlciwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgbGFzdF9maWx0ZXIgPSBmaWx0ZXI7CisgICAgICAgIHBhZF9pZHggPSAwOworICAgIH0KKworICAgIGlmICgocGl4X2ZtdHMgPSBjaG9vc2VfcGl4X2ZtdHMob2ZpbHRlcikpKSB7CisgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyOworICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJmb3JtYXRfb3V0XyVkXyVkIiwKKyAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKKyAgICAgICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJmb3JtYXQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IiwgcGl4X2ZtdHMsIE5VTEwsIGZnLT5ncmFwaCk7CisgICAgICAgIGF2X2ZyZWVwKCZwaXhfZm10cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCBwYWRfaWR4LCBmaWx0ZXIsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGxhc3RfZmlsdGVyID0gZmlsdGVyOworICAgICAgICBwYWRfaWR4ICAgICA9IDA7CisgICAgfQorCisgICAgaWYgKG9zdC0+ZnJhbWVfcmF0ZS5udW0gJiYgMCkgeworICAgICAgICBBVkZpbHRlckNvbnRleHQgKmZwczsKKyAgICAgICAgY2hhciBhcmdzWzI1NV07CisKKyAgICAgICAgc25wcmludGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiZnBzPSVkLyVkIiwgb3N0LT5mcmFtZV9yYXRlLm51bSwKKyAgICAgICAgICAgICAgICAgb3N0LT5mcmFtZV9yYXRlLmRlbik7CisgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImZwc19vdXRfJWRfJWQiLAorICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmcHMsIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJmcHMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBhcmdzLCBOVUxMLCBmZy0+Z3JhcGgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gYXZmaWx0ZXJfbGluayhsYXN0X2ZpbHRlciwgcGFkX2lkeCwgZnBzLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBsYXN0X2ZpbHRlciA9IGZwczsKKyAgICAgICAgcGFkX2lkeCA9IDA7CisgICAgfQorCisgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAidHJpbV9vdXRfJWRfJWQiLAorICAgICAgICAgICAgIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7CisgICAgcmV0ID0gaW5zZXJ0X3RyaW0ob2YtPnN0YXJ0X3RpbWUsIG9mLT5yZWNvcmRpbmdfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCBuYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworCisgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCBwYWRfaWR4LCBvZmlsdGVyLT5maWx0ZXIsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWd1cmVfb3V0cHV0X2F1ZGlvX2ZpbHRlcihGaWx0ZXJHcmFwaCAqZmcsIE91dHB1dEZpbHRlciAqb2ZpbHRlciwgQVZGaWx0ZXJJbk91dCAqb3V0KQoreworICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gb2ZpbHRlci0+b3N0OworICAgIE91dHB1dEZpbGUgICAgKm9mID0gb3V0cHV0X2ZpbGVzW29zdC0+ZmlsZV9pbmRleF07CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjICA9IG9zdC0+ZW5jX2N0eDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmxhc3RfZmlsdGVyID0gb3V0LT5maWx0ZXJfY3R4OworICAgIGludCBwYWRfaWR4ID0gb3V0LT5wYWRfaWR4OworICAgIGNoYXIgKnNhbXBsZV9mbXRzLCAqc2FtcGxlX3JhdGVzLCAqY2hhbm5lbF9sYXlvdXRzOworICAgIGNoYXIgbmFtZVsyNTVdOworICAgIGludCByZXQ7CisKKyAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJvdXRfJWRfJWQiLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJm9maWx0ZXItPmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJhYnVmZmVyc2luayIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgTlVMTCwgTlVMTCwgZmctPmdyYXBoKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IGF2X29wdF9zZXRfaW50KG9maWx0ZXItPmZpbHRlciwgImFsbF9jaGFubmVsX2NvdW50cyIsIDEsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyNkZWZpbmUgQVVUT19JTlNFUlRfRklMVEVSKG9wdF9uYW1lLCBmaWx0ZXJfbmFtZSwgYXJnKSBkbyB7ICAgICAgICAgICAgICAgICBcCisgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0X2N0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sIG9wdF9uYW1lICIgaXMgZm9yd2FyZGVkIHRvIGxhdmZpICIgICAgICAgICAgICBcCisgICAgICAgICAgICJzaW1pbGFybHkgdG8gLWFmICIgZmlsdGVyX25hbWUgIj0lcy5cbiIsIGFyZyk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmaWx0X2N0eCwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmZpbHRlcl9nZXRfYnlfbmFtZShmaWx0ZXJfbmFtZSksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX25hbWUsIGFyZywgTlVMTCwgZmctPmdyYXBoKTsgIFwKKyAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCBwYWRfaWR4LCBmaWx0X2N0eCwgMCk7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbGFzdF9maWx0ZXIgPSBmaWx0X2N0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBhZF9pZHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisgICAgaWYgKG9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwcGVkKSB7CisgICAgICAgIGludCBpOworICAgICAgICBBVkJQcmludCBwYW5fYnVmOworICAgICAgICBhdl9icHJpbnRfaW5pdCgmcGFuX2J1ZiwgMjU2LCA4MTkyKTsKKyAgICAgICAgYXZfYnByaW50ZigmcGFuX2J1ZiwgIjB4JSJQUkl4NjQsCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQob3N0LT5hdWRpb19jaGFubmVsc19tYXBwZWQpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwcGVkOyBpKyspCisgICAgICAgICAgICBpZiAob3N0LT5hdWRpb19jaGFubmVsc19tYXBbaV0gIT0gLTEpCisgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmcGFuX2J1ZiwgInxjJWQ9YyVkIiwgaSwgb3N0LT5hdWRpb19jaGFubmVsc19tYXBbaV0pOworCisgICAgICAgIEFVVE9fSU5TRVJUX0ZJTFRFUigiLW1hcF9jaGFubmVsIiwgInBhbiIsIHBhbl9idWYuc3RyKTsKKyAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZwYW5fYnVmLCBOVUxMKTsKKyAgICB9CisKKyAgICBpZiAoY29kZWMtPmNoYW5uZWxzICYmICFjb2RlYy0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgIGNvZGVjLT5jaGFubmVsX2xheW91dCA9IGF2X2dldF9kZWZhdWx0X2NoYW5uZWxfbGF5b3V0KGNvZGVjLT5jaGFubmVscyk7CisKKyAgICBzYW1wbGVfZm10cyAgICAgPSBjaG9vc2Vfc2FtcGxlX2ZtdHMob2ZpbHRlcik7CisgICAgc2FtcGxlX3JhdGVzICAgID0gY2hvb3NlX3NhbXBsZV9yYXRlcyhvZmlsdGVyKTsKKyAgICBjaGFubmVsX2xheW91dHMgPSBjaG9vc2VfY2hhbm5lbF9sYXlvdXRzKG9maWx0ZXIpOworICAgIGlmIChzYW1wbGVfZm10cyB8fCBzYW1wbGVfcmF0ZXMgfHwgY2hhbm5lbF9sYXlvdXRzKSB7CisgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqZm9ybWF0OworICAgICAgICBjaGFyIGFyZ3NbMjU2XTsKKyAgICAgICAgYXJnc1swXSA9IDA7CisKKyAgICAgICAgaWYgKHNhbXBsZV9mbXRzKQorICAgICAgICAgICAgYXZfc3RybGNhdGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAic2FtcGxlX2ZtdHM9JXM6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfZm10cyk7CisgICAgICAgIGlmIChzYW1wbGVfcmF0ZXMpCisgICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICJzYW1wbGVfcmF0ZXM9JXM6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVfcmF0ZXMpOworICAgICAgICBpZiAoY2hhbm5lbF9sYXlvdXRzKQorICAgICAgICAgICAgYXZfc3RybGNhdGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiY2hhbm5lbF9sYXlvdXRzPSVzOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9sYXlvdXRzKTsKKworICAgICAgICBhdl9mcmVlcCgmc2FtcGxlX2ZtdHMpOworICAgICAgICBhdl9mcmVlcCgmc2FtcGxlX3JhdGVzKTsKKyAgICAgICAgYXZfZnJlZXAoJmNoYW5uZWxfbGF5b3V0cyk7CisKKyAgICAgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiZm9ybWF0X291dF8lZF8lZCIsCisgICAgICAgICAgICAgICAgIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCk7CisgICAgICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYWZvcm1hdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGFyZ3MsIE5VTEwsIGZnLT5ncmFwaCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICByZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCBwYWRfaWR4LCBmb3JtYXQsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgbGFzdF9maWx0ZXIgPSBmb3JtYXQ7CisgICAgICAgIHBhZF9pZHggPSAwOworICAgIH0KKworICAgIGlmIChhdWRpb192b2x1bWUgIT0gMjU2ICYmIDApIHsKKyAgICAgICAgY2hhciBhcmdzWzI1Nl07CisKKyAgICAgICAgc25wcmludGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiJWYiLCBhdWRpb192b2x1bWUgLyAyNTYuKTsKKyAgICAgICAgQVVUT19JTlNFUlRfRklMVEVSKCItdm9sIiwgInZvbHVtZSIsIGFyZ3MpOworICAgIH0KKworICAgIGlmIChvc3QtPmFwYWQgJiYgb2YtPnNob3J0ZXN0KSB7CisgICAgICAgIGNoYXIgYXJnc1syNTZdOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGk9MDsgaTxvZi0+Y3R4LT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBpZiAob2YtPmN0eC0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChpPG9mLT5jdHgtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIHNucHJpbnRmKGFyZ3MsIHNpemVvZihhcmdzKSwgIiVzIiwgb3N0LT5hcGFkKTsKKyAgICAgICAgICAgIEFVVE9fSU5TRVJUX0ZJTFRFUigiLWFwYWQiLCAiYXBhZCIsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAidHJpbSBmb3Igb3V0cHV0IHN0cmVhbSAlZDolZCIsCisgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKKyAgICByZXQgPSBpbnNlcnRfdHJpbShvZi0+c3RhcnRfdGltZSwgb2YtPnJlY29yZGluZ190aW1lLAorICAgICAgICAgICAgICAgICAgICAgICZsYXN0X2ZpbHRlciwgJnBhZF9pZHgsIG5hbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCBwYWRfaWR4LCBvZmlsdGVyLT5maWx0ZXIsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGNvbmZpZ3VyZV9vdXRwdXRfZmlsdGVyKEZpbHRlckdyYXBoICpmZywgT3V0cHV0RmlsdGVyICpvZmlsdGVyLCBBVkZpbHRlckluT3V0ICpvdXQpCit7CisgICAgaWYgKCFvZmlsdGVyLT5vc3QpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkZpbHRlciAlcyBoYXMgYW4gdW5jb25uZWN0ZWQgb3V0cHV0XG4iLCBvZmlsdGVyLT5uYW1lKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIHN3aXRjaCAoYXZmaWx0ZXJfcGFkX2dldF90eXBlKG91dC0+ZmlsdGVyX2N0eC0+b3V0cHV0X3BhZHMsIG91dC0+cGFkX2lkeCkpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzogcmV0dXJuIGNvbmZpZ3VyZV9vdXRwdXRfdmlkZW9fZmlsdGVyKGZnLCBvZmlsdGVyLCBvdXQpOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOiByZXR1cm4gY29uZmlndXJlX291dHB1dF9hdWRpb19maWx0ZXIoZmcsIG9maWx0ZXIsIG91dCk7CisgICAgZGVmYXVsdDogYXZfYXNzZXJ0MCgwKTsKKyAgICB9Cit9CisKK3ZvaWQgY2hlY2tfZmlsdGVyX291dHB1dHModm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZmlsdGVyZ3JhcGhzOyBpKyspIHsKKyAgICAgICAgaW50IG47CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBmaWx0ZXJncmFwaHNbaV0tPm5iX291dHB1dHM7IG4rKykgeworICAgICAgICAgICAgT3V0cHV0RmlsdGVyICpvdXRwdXQgPSBmaWx0ZXJncmFwaHNbaV0tPm91dHB1dHNbbl07CisgICAgICAgICAgICBpZiAoIW91dHB1dC0+b3N0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkZpbHRlciAlcyBoYXMgYW4gdW5jb25uZWN0ZWQgb3V0cHV0XG4iLCBvdXRwdXQtPm5hbWUpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBzdWIydmlkZW9fcHJlcGFyZShJbnB1dFN0cmVhbSAqaXN0LCBJbnB1dEZpbHRlciAqaWZpbHRlcikKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZiA9IGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF0tPmN0eDsKKyAgICBpbnQgaSwgdywgaDsKKworICAgIC8qIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGNhbnZhcyBmb3IgdGhlIHN1YnRpdGxlcyBzdHJlYW0uCisgICAgICAgSWYgdGhlIHN1YnRpdGxlcyBjb2RlY3BhciBoYXMgc2V0IGEgc2l6ZSwgdXNlIGl0LiBPdGhlcndpc2UgdXNlIHRoZQorICAgICAgIG1heGltdW0gZGltZW5zaW9ucyBvZiB0aGUgdmlkZW8gc3RyZWFtcyBpbiB0aGUgc2FtZSBmaWxlLiAqLworICAgIHcgPSBpZmlsdGVyLT53aWR0aDsKKyAgICBoID0gaWZpbHRlci0+aGVpZ2h0OworICAgIGlmICghKHcgJiYgaCkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Zi0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXZmLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICB3ID0gRkZNQVgodywgYXZmLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+d2lkdGgpOworICAgICAgICAgICAgICAgIGggPSBGRk1BWChoLCBhdmYtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5oZWlnaHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKHcgJiYgaCkpIHsKKyAgICAgICAgICAgIHcgPSBGRk1BWCh3LCA3MjApOworICAgICAgICAgICAgaCA9IEZGTUFYKGgsIDU3Nik7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0lORk8sICJzdWIydmlkZW86IHVzaW5nICVkeCVkIGNhbnZhc1xuIiwgdywgaCk7CisgICAgfQorICAgIGlzdC0+c3ViMnZpZGVvLncgPSBpZmlsdGVyLT53aWR0aCAgPSB3OworICAgIGlzdC0+c3ViMnZpZGVvLmggPSBpZmlsdGVyLT5oZWlnaHQgPSBoOworCisgICAgaWZpbHRlci0+d2lkdGggID0gaXN0LT5kZWNfY3R4LT53aWR0aCAgPyBpc3QtPmRlY19jdHgtPndpZHRoICA6IGlzdC0+c3ViMnZpZGVvLnc7CisgICAgaWZpbHRlci0+aGVpZ2h0ID0gaXN0LT5kZWNfY3R4LT5oZWlnaHQgPyBpc3QtPmRlY19jdHgtPmhlaWdodCA6IGlzdC0+c3ViMnZpZGVvLmg7CisKKyAgICAvKiByZWN0YW5nbGVzIGFyZSBBVl9QSVhfRk1UX1BBTDgsIGJ1dCB3ZSBoYXZlIG5vIGd1YXJhbnRlZSB0aGF0IHRoZQorICAgICAgIHBhbGV0dGVzIGZvciBhbGwgcmVjdGFuZ2xlcyBhcmUgaWRlbnRpY2FsIG9yIGNvbXBhdGlibGUgKi8KKyAgICBpZmlsdGVyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1JHQjMyOworCisgICAgaXN0LT5zdWIydmlkZW8uZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghaXN0LT5zdWIydmlkZW8uZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaXN0LT5zdWIydmlkZW8ubGFzdF9wdHMgPSBJTlQ2NF9NSU47CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlndXJlX2lucHV0X3ZpZGVvX2ZpbHRlcihGaWx0ZXJHcmFwaCAqZmcsIElucHV0RmlsdGVyICppZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVySW5PdXQgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqbGFzdF9maWx0ZXI7CisgICAgY29uc3QgQVZGaWx0ZXIgKmJ1ZmZlcl9maWx0ID0gYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImJ1ZmZlciIpOworICAgIElucHV0U3RyZWFtICppc3QgPSBpZmlsdGVyLT5pc3Q7CisgICAgSW5wdXRGaWxlICAgICAqZiA9IGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF07CisgICAgQVZSYXRpb25hbCB0YiA9IGlzdC0+ZnJhbWVyYXRlLm51bSA/IGF2X2ludl9xKGlzdC0+ZnJhbWVyYXRlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+c3QtPnRpbWVfYmFzZTsKKyAgICBBVlJhdGlvbmFsIGZyID0gaXN0LT5mcmFtZXJhdGU7CisgICAgQVZSYXRpb25hbCBzYXI7CisgICAgQVZCUHJpbnQgYXJnczsKKyAgICBjaGFyIG5hbWVbMjU1XTsKKyAgICBpbnQgcmV0LCBwYWRfaWR4ID0gMDsKKyAgICBpbnQ2NF90IHRzb2Zmc2V0ID0gMDsKKyAgICBBVkJ1ZmZlclNyY1BhcmFtZXRlcnMgKnBhciA9IGF2X2J1ZmZlcnNyY19wYXJhbWV0ZXJzX2FsbG9jKCk7CisKKyAgICBpZiAoIXBhcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZW1zZXQocGFyLCAwLCBzaXplb2YoKnBhcikpOworICAgIHBhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgaWYgKGlzdC0+ZGVjX2N0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBjb25uZWN0IHZpZGVvIGZpbHRlciB0byBhdWRpbyBpbnB1dFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICghZnIubnVtKQorICAgICAgICBmciA9IGF2X2d1ZXNzX2ZyYW1lX3JhdGUoaW5wdXRfZmlsZXNbaXN0LT5maWxlX2luZGV4XS0+Y3R4LCBpc3QtPnN0LCBOVUxMKTsKKworICAgIGlmIChpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgIHJldCA9IHN1YjJ2aWRlb19wcmVwYXJlKGlzdCwgaWZpbHRlcik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHNhciA9IGlmaWx0ZXItPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgaWYoIXNhci5kZW4pCisgICAgICAgIHNhciA9IChBVlJhdGlvbmFsKXswLDF9OworICAgIGF2X2JwcmludF9pbml0KCZhcmdzLCAwLCAxKTsKKyAgICBhdl9icHJpbnRmKCZhcmdzLAorICAgICAgICAgICAgICJ2aWRlb19zaXplPSVkeCVkOnBpeF9mbXQ9JWQ6dGltZV9iYXNlPSVkLyVkOiIKKyAgICAgICAgICAgICAicGl4ZWxfYXNwZWN0PSVkLyVkOnN3c19wYXJhbT1mbGFncz0lZCIsCisgICAgICAgICAgICAgaWZpbHRlci0+d2lkdGgsIGlmaWx0ZXItPmhlaWdodCwgaWZpbHRlci0+Zm9ybWF0LAorICAgICAgICAgICAgIHRiLm51bSwgdGIuZGVuLCBzYXIubnVtLCBzYXIuZGVuLAorICAgICAgICAgICAgIFNXU19CSUxJTkVBUiArICgoaXN0LT5kZWNfY3R4LT5mbGFncyZBVl9DT0RFQ19GTEFHX0JJVEVYQUNUKSA/IFNXU19CSVRFWEFDVDowKSk7CisgICAgaWYgKGZyLm51bSAmJiBmci5kZW4pCisgICAgICAgIGF2X2JwcmludGYoJmFyZ3MsICI6ZnJhbWVfcmF0ZT0lZC8lZCIsIGZyLm51bSwgZnIuZGVuKTsKKyAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJncmFwaCAlZCBpbnB1dCBmcm9tIHN0cmVhbSAlZDolZCIsIGZnLT5pbmRleCwKKyAgICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4KTsKKworCisgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZpZmlsdGVyLT5maWx0ZXIsIGJ1ZmZlcl9maWx0LCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnN0ciwgTlVMTCwgZmctPmdyYXBoKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcGFyLT5od19mcmFtZXNfY3R4ID0gaWZpbHRlci0+aHdfZnJhbWVzX2N0eDsKKyAgICByZXQgPSBhdl9idWZmZXJzcmNfcGFyYW1ldGVyc19zZXQoaWZpbHRlci0+ZmlsdGVyLCBwYXIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYXZfZnJlZXAoJnBhcik7CisgICAgbGFzdF9maWx0ZXIgPSBpZmlsdGVyLT5maWx0ZXI7CisKKyAgICBpZiAoaXN0LT5hdXRvcm90YXRlKSB7CisgICAgICAgIGRvdWJsZSB0aGV0YSA9IGdldF9yb3RhdGlvbihpc3QtPnN0KTsKKworICAgICAgICBpZiAoZmFicyh0aGV0YSAtIDkwKSA8IDEuMCkgeworICAgICAgICAgICAgcmV0ID0gaW5zZXJ0X2ZpbHRlcigmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCAidHJhbnNwb3NlIiwgImNsb2NrIik7CisgICAgICAgIH0gZWxzZSBpZiAoZmFicyh0aGV0YSAtIDE4MCkgPCAxLjApIHsKKyAgICAgICAgICAgIHJldCA9IGluc2VydF9maWx0ZXIoJmxhc3RfZmlsdGVyLCAmcGFkX2lkeCwgImhmbGlwIiwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0ID0gaW5zZXJ0X2ZpbHRlcigmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCAidmZsaXAiLCBOVUxMKTsKKyAgICAgICAgfSBlbHNlIGlmIChmYWJzKHRoZXRhIC0gMjcwKSA8IDEuMCkgeworICAgICAgICAgICAgcmV0ID0gaW5zZXJ0X2ZpbHRlcigmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCAidHJhbnNwb3NlIiwgImNjbG9jayIpOworICAgICAgICB9IGVsc2UgaWYgKGZhYnModGhldGEpID4gMS4wKSB7CisgICAgICAgICAgICBjaGFyIHJvdGF0ZV9idWZbNjRdOworICAgICAgICAgICAgc25wcmludGYocm90YXRlX2J1Ziwgc2l6ZW9mKHJvdGF0ZV9idWYpLCAiJWYqUEkvMTgwIiwgdGhldGEpOworICAgICAgICAgICAgcmV0ID0gaW5zZXJ0X2ZpbHRlcigmbGFzdF9maWx0ZXIsICZwYWRfaWR4LCAicm90YXRlIiwgcm90YXRlX2J1Zik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChkb19kZWludGVybGFjZSkgeworICAgICAgICBBVkZpbHRlckNvbnRleHQgKnlhZGlmOworCisgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImRlaW50ZXJsYWNlX2luXyVkXyVkIiwKKyAgICAgICAgICAgICAgICAgaXN0LT5maWxlX2luZGV4LCBpc3QtPnN0LT5pbmRleCk7CisgICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmeWFkaWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmZpbHRlcl9nZXRfYnlfbmFtZSgieWFkaWYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsICIiLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmctPmdyYXBoKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2xpbmsobGFzdF9maWx0ZXIsIDAsIHlhZGlmLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBsYXN0X2ZpbHRlciA9IHlhZGlmOworICAgIH0KKworICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgInRyaW1faW5fJWRfJWQiLAorICAgICAgICAgICAgIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgpOworICAgIGlmIChjb3B5X3RzKSB7CisgICAgICAgIHRzb2Zmc2V0ID0gZi0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSA/IDAgOiBmLT5zdGFydF90aW1lOworICAgICAgICBpZiAoIXN0YXJ0X2F0X3plcm8gJiYgZi0+Y3R4LT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgdHNvZmZzZXQgKz0gZi0+Y3R4LT5zdGFydF90aW1lOworICAgIH0KKyAgICByZXQgPSBpbnNlcnRfdHJpbSgoKGYtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpIHx8ICFmLT5hY2N1cmF0ZV9zZWVrKSA/CisgICAgICAgICAgICAgICAgICAgICAgQVZfTk9QVFNfVkFMVUUgOiB0c29mZnNldCwgZi0+cmVjb3JkaW5nX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgJmxhc3RfZmlsdGVyLCAmcGFkX2lkeCwgbmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGF2ZmlsdGVyX2xpbmsobGFzdF9maWx0ZXIsIDAsIGluLT5maWx0ZXJfY3R4LCBpbi0+cGFkX2lkeCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfZnJlZXAoJnBhcik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbmZpZ3VyZV9pbnB1dF9hdWRpb19maWx0ZXIoRmlsdGVyR3JhcGggKmZnLCBJbnB1dEZpbHRlciAqaWZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckluT3V0ICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmxhc3RfZmlsdGVyOworICAgIGNvbnN0IEFWRmlsdGVyICphYnVmZmVyX2ZpbHQgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZSgiYWJ1ZmZlciIpOworICAgIElucHV0U3RyZWFtICppc3QgPSBpZmlsdGVyLT5pc3Q7CisgICAgSW5wdXRGaWxlICAgICAqZiA9IGlucHV0X2ZpbGVzW2lzdC0+ZmlsZV9pbmRleF07CisgICAgQVZCUHJpbnQgYXJnczsKKyAgICBjaGFyIG5hbWVbMjU1XTsKKyAgICBpbnQgcmV0LCBwYWRfaWR4ID0gMDsKKyAgICBpbnQ2NF90IHRzb2Zmc2V0ID0gMDsKKworICAgIGlmIChpc3QtPmRlY19jdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgY29ubmVjdCBhdWRpbyBmaWx0ZXIgdG8gbm9uIGF1ZGlvIGlucHV0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYXJncywgMCwgQVZfQlBSSU5UX1NJWkVfQVVUT01BVElDKTsKKyAgICBhdl9icHJpbnRmKCZhcmdzLCAidGltZV9iYXNlPSVkLyVkOnNhbXBsZV9yYXRlPSVkOnNhbXBsZV9mbXQ9JXMiLAorICAgICAgICAgICAgIDEsIGlmaWx0ZXItPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgIGlmaWx0ZXItPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoaWZpbHRlci0+Zm9ybWF0KSk7CisgICAgaWYgKGlmaWx0ZXItPmNoYW5uZWxfbGF5b3V0KQorICAgICAgICBhdl9icHJpbnRmKCZhcmdzLCAiOmNoYW5uZWxfbGF5b3V0PTB4JSJQUkl4NjQsCisgICAgICAgICAgICAgICAgICAgaWZpbHRlci0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGVsc2UKKyAgICAgICAgYXZfYnByaW50ZigmYXJncywgIjpjaGFubmVscz0lZCIsIGlmaWx0ZXItPmNoYW5uZWxzKTsKKyAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJncmFwaF8lZF9pbl8lZF8lZCIsIGZnLT5pbmRleCwKKyAgICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4KTsKKworICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmaWZpbHRlci0+ZmlsdGVyLCBhYnVmZmVyX2ZpbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGFyZ3Muc3RyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZy0+Z3JhcGgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgbGFzdF9maWx0ZXIgPSBpZmlsdGVyLT5maWx0ZXI7CisKKyNkZWZpbmUgQVVUT19JTlNFUlRfRklMVEVSX0lOUFVUKG9wdF9uYW1lLCBmaWx0ZXJfbmFtZSwgYXJnKSBkbyB7ICAgICAgICAgICAgICAgICBcCisgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0X2N0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sIG9wdF9uYW1lICIgaXMgZm9yd2FyZGVkIHRvIGxhdmZpICIgICAgICAgICAgICBcCisgICAgICAgICAgICJzaW1pbGFybHkgdG8gLWFmICIgZmlsdGVyX25hbWUgIj0lcy5cbiIsIGFyZyk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJncmFwaF8lZF8lc19pbl8lZF8lZCIsICAgICAgXAorICAgICAgICAgICAgICAgIGZnLT5pbmRleCwgZmlsdGVyX25hbWUsIGlzdC0+ZmlsZV9pbmRleCwgaXN0LT5zdC0+aW5kZXgpOyAgIFwKKyAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmaWx0X2N0eCwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmZpbHRlcl9nZXRfYnlfbmFtZShmaWx0ZXJfbmFtZSksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgYXJnLCBOVUxMLCBmZy0+Z3JhcGgpOyAgICAgICAgIFwKKyAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCAwLCBmaWx0X2N0eCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldCA8IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbGFzdF9maWx0ZXIgPSBmaWx0X2N0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworICAgIGlmIChhdWRpb19zeW5jX21ldGhvZCA+IDApIHsKKyAgICAgICAgY2hhciBhcmdzWzI1Nl0gPSB7MH07CisKKyAgICAgICAgYXZfc3RybGNhdGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiYXN5bmM9JWQiLCBhdWRpb19zeW5jX21ldGhvZCk7CisgICAgICAgIGlmIChhdWRpb19kcmlmdF90aHJlc2hvbGQgIT0gMC4xKQorICAgICAgICAgICAgYXZfc3RybGNhdGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiOm1pbl9oYXJkX2NvbXA9JWYiLCBhdWRpb19kcmlmdF90aHJlc2hvbGQpOworICAgICAgICBpZiAoIWZnLT5yZWNvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICI6Zmlyc3RfcHRzPTAiKTsKKyAgICAgICAgQVVUT19JTlNFUlRfRklMVEVSX0lOUFVUKCItYXN5bmMiLCAiYXJlc2FtcGxlIiwgYXJncyk7CisgICAgfQorCisvLyAgICAgaWYgKG9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwcGVkKSB7CisvLyAgICAgICAgIGludCBpOworLy8gICAgICAgICBBVkJQcmludCBwYW5fYnVmOworLy8gICAgICAgICBhdl9icHJpbnRfaW5pdCgmcGFuX2J1ZiwgMjU2LCA4MTkyKTsKKy8vICAgICAgICAgYXZfYnByaW50ZigmcGFuX2J1ZiwgIjB4JSJQUkl4NjQsCisvLyAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQob3N0LT5hdWRpb19jaGFubmVsc19tYXBwZWQpKTsKKy8vICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwcGVkOyBpKyspCisvLyAgICAgICAgICAgICBpZiAob3N0LT5hdWRpb19jaGFubmVsc19tYXBbaV0gIT0gLTEpCisvLyAgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmcGFuX2J1ZiwgIjpjJWQ9YyVkIiwgaSwgb3N0LT5hdWRpb19jaGFubmVsc19tYXBbaV0pOworLy8gICAgICAgICBBVVRPX0lOU0VSVF9GSUxURVJfSU5QVVQoIi1tYXBfY2hhbm5lbCIsICJwYW4iLCBwYW5fYnVmLnN0cik7CisvLyAgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcGFuX2J1ZiwgTlVMTCk7CisvLyAgICAgfQorCisgICAgaWYgKGF1ZGlvX3ZvbHVtZSAhPSAyNTYpIHsKKyAgICAgICAgY2hhciBhcmdzWzI1Nl07CisKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiLXZvbCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgdGhlIHZvbHVtZSAiCisgICAgICAgICAgICAgICAiYXVkaW8gZmlsdGVyIGluc3RlYWQuXG4iKTsKKworICAgICAgICBzbnByaW50ZihhcmdzLCBzaXplb2YoYXJncyksICIlZiIsIGF1ZGlvX3ZvbHVtZSAvIDI1Ni4pOworICAgICAgICBBVVRPX0lOU0VSVF9GSUxURVJfSU5QVVQoIi12b2wiLCAidm9sdW1lIiwgYXJncyk7CisgICAgfQorCisgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAidHJpbSBmb3IgaW5wdXQgc3RyZWFtICVkOiVkIiwKKyAgICAgICAgICAgICBpc3QtPmZpbGVfaW5kZXgsIGlzdC0+c3QtPmluZGV4KTsKKyAgICBpZiAoY29weV90cykgeworICAgICAgICB0c29mZnNldCA9IGYtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUgPyAwIDogZi0+c3RhcnRfdGltZTsKKyAgICAgICAgaWYgKCFzdGFydF9hdF96ZXJvICYmIGYtPmN0eC0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHRzb2Zmc2V0ICs9IGYtPmN0eC0+c3RhcnRfdGltZTsKKyAgICB9CisgICAgcmV0ID0gaW5zZXJ0X3RyaW0oKChmLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSB8fCAhZi0+YWNjdXJhdGVfc2VlaykgPworICAgICAgICAgICAgICAgICAgICAgIEFWX05PUFRTX1ZBTFVFIDogdHNvZmZzZXQsIGYtPnJlY29yZGluZ190aW1lLAorICAgICAgICAgICAgICAgICAgICAgICZsYXN0X2ZpbHRlciwgJnBhZF9pZHgsIG5hbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKGxhc3RfZmlsdGVyLCAwLCBpbi0+ZmlsdGVyX2N0eCwgaW4tPnBhZF9pZHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWd1cmVfaW5wdXRfZmlsdGVyKEZpbHRlckdyYXBoICpmZywgSW5wdXRGaWx0ZXIgKmlmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGaWx0ZXJJbk91dCAqaW4pCit7CisgICAgaWYgKCFpZmlsdGVyLT5pc3QtPmRlYykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vIGRlY29kZXIgZm9yIHN0cmVhbSAjJWQ6JWQsIGZpbHRlcmluZyBpbXBvc3NpYmxlXG4iLAorICAgICAgICAgICAgICAgaWZpbHRlci0+aXN0LT5maWxlX2luZGV4LCBpZmlsdGVyLT5pc3QtPnN0LT5pbmRleCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0RFQ09ERVJfTk9UX0ZPVU5EOworICAgIH0KKyAgICBzd2l0Y2ggKGF2ZmlsdGVyX3BhZF9nZXRfdHlwZShpbi0+ZmlsdGVyX2N0eC0+aW5wdXRfcGFkcywgaW4tPnBhZF9pZHgpKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86IHJldHVybiBjb25maWd1cmVfaW5wdXRfdmlkZW9fZmlsdGVyKGZnLCBpZmlsdGVyLCBpbik7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86IHJldHVybiBjb25maWd1cmVfaW5wdXRfYXVkaW9fZmlsdGVyKGZnLCBpZmlsdGVyLCBpbik7CisgICAgZGVmYXVsdDogYXZfYXNzZXJ0MCgwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfZmlsdGVyZ3JhcGgoRmlsdGVyR3JhcGggKmZnKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBmZy0+bmJfb3V0cHV0czsgaSsrKQorICAgICAgICBmZy0+b3V0cHV0c1tpXS0+ZmlsdGVyID0gKEFWRmlsdGVyQ29udGV4dCAqKU5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IGZnLT5uYl9pbnB1dHM7IGkrKykKKyAgICAgICAgZmctPmlucHV0c1tpXS0+ZmlsdGVyID0gKEFWRmlsdGVyQ29udGV4dCAqKU5VTEw7CisgICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmZmctPmdyYXBoKTsKK30KKworaW50IGNvbmZpZ3VyZV9maWx0ZXJncmFwaChGaWx0ZXJHcmFwaCAqZmcpCit7CisgICAgQVZGaWx0ZXJJbk91dCAqaW5wdXRzLCAqb3V0cHV0cywgKmN1cjsKKyAgICBpbnQgcmV0LCBpLCBzaW1wbGUgPSBmaWx0ZXJncmFwaF9pc19zaW1wbGUoZmcpOworICAgIGNvbnN0IGNoYXIgKmdyYXBoX2Rlc2MgPSBzaW1wbGUgPyBmZy0+b3V0cHV0c1swXS0+b3N0LT5hdmZpbHRlciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZnLT5ncmFwaF9kZXNjOworCisgICAgY2xlYW51cF9maWx0ZXJncmFwaChmZyk7CisgICAgaWYgKCEoZmctPmdyYXBoID0gYXZmaWx0ZXJfZ3JhcGhfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoc2ltcGxlKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3N0ID0gZmctPm91dHB1dHNbMF0tPm9zdDsKKyAgICAgICAgY2hhciBhcmdzWzUxMl07CisgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICplID0gTlVMTDsKKworICAgICAgICBmZy0+Z3JhcGgtPm5iX3RocmVhZHMgPSBmaWx0ZXJfbmJ0aHJlYWRzOworCisgICAgICAgIGFyZ3NbMF0gPSAwOworICAgICAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldChvc3QtPnN3c19kaWN0LCAiIiwgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKGFyZ3MsIHNpemVvZihhcmdzKSwgIiVzPSVzOiIsIGUtPmtleSwgZS0+dmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJsZW4oYXJncykpCisgICAgICAgICAgICBhcmdzW3N0cmxlbihhcmdzKS0xXSA9IDA7CisgICAgICAgIGZnLT5ncmFwaC0+c2NhbGVfc3dzX29wdHMgPSBhdl9zdHJkdXAoYXJncyk7CisKKyAgICAgICAgYXJnc1swXSA9IDA7CisgICAgICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KG9zdC0+c3dyX29wdHMsICIiLCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICAgICAgYXZfc3RybGNhdGYoYXJncywgc2l6ZW9mKGFyZ3MpLCAiJXM9JXM6IiwgZS0+a2V5LCBlLT52YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cmxlbihhcmdzKSkKKyAgICAgICAgICAgIGFyZ3Nbc3RybGVuKGFyZ3MpLTFdID0gMDsKKyAgICAgICAgYXZfb3B0X3NldChmZy0+Z3JhcGgsICJhcmVzYW1wbGVfc3dyX29wdHMiLCBhcmdzLCAwKTsKKworICAgICAgICBhcmdzWzBdID0gJ1wwJzsKKyAgICAgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQoZmctPm91dHB1dHNbMF0tPm9zdC0+cmVzYW1wbGVfb3B0cywgIiIsIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgICAgICBhdl9zdHJsY2F0ZihhcmdzLCBzaXplb2YoYXJncyksICIlcz0lczoiLCBlLT5rZXksIGUtPnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybGVuKGFyZ3MpKQorICAgICAgICAgICAgYXJnc1tzdHJsZW4oYXJncykgLSAxXSA9ICdcMCc7CisKKyAgICAgICAgZSA9IGF2X2RpY3RfZ2V0KG9zdC0+ZW5jb2Rlcl9vcHRzLCAidGhyZWFkcyIsIE5VTEwsIDApOworICAgICAgICBpZiAoZSkKKyAgICAgICAgICAgIGF2X29wdF9zZXQoZmctPmdyYXBoLCAidGhyZWFkcyIsIGUtPnZhbHVlLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmZy0+Z3JhcGgtPm5iX3RocmVhZHMgPSBmaWx0ZXJfY29tcGxleF9uYnRocmVhZHM7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9ncmFwaF9wYXJzZTIoZmctPmdyYXBoLCBncmFwaF9kZXNjLCAmaW5wdXRzLCAmb3V0cHV0cykpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKGZpbHRlcl9od19kZXZpY2UgfHwgaHdfZGV2aWNlX2N0eCkgeworICAgICAgICBBVkJ1ZmZlclJlZiAqZGV2aWNlID0gZmlsdGVyX2h3X2RldmljZSA/IGZpbHRlcl9od19kZXZpY2UtPmRldmljZV9yZWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBod19kZXZpY2VfY3R4OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmctPmdyYXBoLT5uYl9maWx0ZXJzOyBpKyspIHsKKyAgICAgICAgICAgIGZnLT5ncmFwaC0+ZmlsdGVyc1tpXS0+aHdfZGV2aWNlX2N0eCA9IGF2X2J1ZmZlcl9yZWYoZGV2aWNlKTsKKyAgICAgICAgICAgIGlmICghZmctPmdyYXBoLT5maWx0ZXJzW2ldLT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzaW1wbGUgJiYgKCFpbnB1dHMgfHwgaW5wdXRzLT5uZXh0IHx8ICFvdXRwdXRzIHx8IG91dHB1dHMtPm5leHQpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm51bV9pbnB1dHM7CisgICAgICAgIGNvbnN0IGNoYXIgKm51bV9vdXRwdXRzOworICAgICAgICBpZiAoIW91dHB1dHMpIHsKKyAgICAgICAgICAgIG51bV9vdXRwdXRzID0gIjAiOworICAgICAgICB9IGVsc2UgaWYgKG91dHB1dHMtPm5leHQpIHsKKyAgICAgICAgICAgIG51bV9vdXRwdXRzID0gIj4xIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bV9vdXRwdXRzID0gIjEiOworICAgICAgICB9CisgICAgICAgIGlmICghaW5wdXRzKSB7CisgICAgICAgICAgICBudW1faW5wdXRzID0gIjAiOworICAgICAgICB9IGVsc2UgaWYgKGlucHV0cy0+bmV4dCkgeworICAgICAgICAgICAgbnVtX2lucHV0cyA9ICI+MSI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1faW5wdXRzID0gIjEiOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJTaW1wbGUgZmlsdGVyZ3JhcGggJyVzJyB3YXMgZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgInRvIGhhdmUgZXhhY3RseSAxIGlucHV0IGFuZCAxIG91dHB1dC4iCisgICAgICAgICAgICAgICAiIEhvd2V2ZXIsIGl0IGhhZCAlcyBpbnB1dChzKSBhbmQgJXMgb3V0cHV0KHMpLiIKKyAgICAgICAgICAgICAgICIgUGxlYXNlIGFkanVzdCwgb3IgdXNlIGEgY29tcGxleCBmaWx0ZXJncmFwaCAoLWZpbHRlcl9jb21wbGV4KSBpbnN0ZWFkLlxuIiwKKyAgICAgICAgICAgICAgIGdyYXBoX2Rlc2MsIG51bV9pbnB1dHMsIG51bV9vdXRwdXRzKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZm9yIChjdXIgPSBpbnB1dHMsIGkgPSAwOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCwgaSsrKQorICAgICAgICBpZiAoKHJldCA9IGNvbmZpZ3VyZV9pbnB1dF9maWx0ZXIoZmcsIGZnLT5pbnB1dHNbaV0sIGN1cikpIDwgMCkgeworICAgICAgICAgICAgYXZmaWx0ZXJfaW5vdXRfZnJlZSgmaW5wdXRzKTsKKyAgICAgICAgICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJm91dHB1dHMpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgYXZmaWx0ZXJfaW5vdXRfZnJlZSgmaW5wdXRzKTsKKworICAgIGZvciAoY3VyID0gb3V0cHV0cywgaSA9IDA7IGN1cjsgY3VyID0gY3VyLT5uZXh0LCBpKyspCisgICAgICAgIGNvbmZpZ3VyZV9vdXRwdXRfZmlsdGVyKGZnLCBmZy0+b3V0cHV0c1tpXSwgY3VyKTsKKyAgICBhdmZpbHRlcl9pbm91dF9mcmVlKCZvdXRwdXRzKTsKKworICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY29uZmlnKGZnLT5ncmFwaCwgTlVMTCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgLyogbGltaXQgdGhlIGxpc3RzIG9mIGFsbG93ZWQgZm9ybWF0cyB0byB0aGUgb25lcyBzZWxlY3RlZCwgdG8KKyAgICAgKiBtYWtlIHN1cmUgdGhleSBzdGF5IHRoZSBzYW1lIGlmIHRoZSBmaWx0ZXJncmFwaCBpcyByZWNvbmZpZ3VyZWQgbGF0ZXIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZmctPm5iX291dHB1dHM7IGkrKykgeworICAgICAgICBPdXRwdXRGaWx0ZXIgKm9maWx0ZXIgPSBmZy0+b3V0cHV0c1tpXTsKKyAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpzaW5rID0gb2ZpbHRlci0+ZmlsdGVyOworCisgICAgICAgIG9maWx0ZXItPmZvcm1hdCA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2Zvcm1hdChzaW5rKTsKKworICAgICAgICBvZmlsdGVyLT53aWR0aCAgPSBhdl9idWZmZXJzaW5rX2dldF93KHNpbmspOworICAgICAgICBvZmlsdGVyLT5oZWlnaHQgPSBhdl9idWZmZXJzaW5rX2dldF9oKHNpbmspOworCisgICAgICAgIG9maWx0ZXItPnNhbXBsZV9yYXRlICAgID0gYXZfYnVmZmVyc2lua19nZXRfc2FtcGxlX3JhdGUoc2luayk7CisgICAgICAgIG9maWx0ZXItPmNoYW5uZWxfbGF5b3V0ID0gYXZfYnVmZmVyc2lua19nZXRfY2hhbm5lbF9sYXlvdXQoc2luayk7CisgICAgfQorCisgICAgZmctPnJlY29uZmlndXJhdGlvbiA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmctPm5iX291dHB1dHM7IGkrKykgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCA9IGZnLT5vdXRwdXRzW2ldLT5vc3Q7CisgICAgICAgIGlmICghb3N0LT5lbmMpIHsKKyAgICAgICAgICAgIC8qIGlkZW50aWNhbCB0byB0aGUgc2FtZSBjaGVjayBpbiBmZm1wZWcuYywgbmVlZGVkIGJlY2F1c2UKKyAgICAgICAgICAgICAgIGNvbXBsZXggZmlsdGVyIGdyYXBocyBhcmUgaW5pdGlhbGl6ZWQgZWFybGllciAqLworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVuY29kZXIgKGNvZGVjICVzKSBub3QgZm91bmQgZm9yIG91dHB1dCBzdHJlYW0gIyVkOiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShvc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChvc3QtPmVuYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICEob3N0LT5lbmMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9WQVJJQUJMRV9GUkFNRV9TSVpFKSkKKyAgICAgICAgICAgIGF2X2J1ZmZlcnNpbmtfc2V0X2ZyYW1lX3NpemUob3N0LT5maWx0ZXItPmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5lbmNfY3R4LT5mcmFtZV9zaXplKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmctPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIHdoaWxlIChhdl9maWZvX3NpemUoZmctPmlucHV0c1tpXS0+ZnJhbWVfcXVldWUpKSB7CisgICAgICAgICAgICBBVkZyYW1lICp0bXA7CisgICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChmZy0+aW5wdXRzW2ldLT5mcmFtZV9xdWV1ZSwgJnRtcCwgc2l6ZW9mKHRtcCksIE5VTEwpOworICAgICAgICAgICAgcmV0ID0gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZShmZy0+aW5wdXRzW2ldLT5maWx0ZXIsIHRtcCk7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogc2VuZCB0aGUgRU9GcyBmb3IgdGhlIGZpbmlzaGVkIGlucHV0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBmZy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKGZnLT5pbnB1dHNbaV0tPmVvZikgeworICAgICAgICAgICAgcmV0ID0gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZShmZy0+aW5wdXRzW2ldLT5maWx0ZXIsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogcHJvY2VzcyBxdWV1ZWQgdXAgc3VidGl0bGUgcGFja2V0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBmZy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gKmlzdCA9IGZnLT5pbnB1dHNbaV0tPmlzdDsKKyAgICAgICAgaWYgKGlzdC0+c3ViMnZpZGVvLnN1Yl9xdWV1ZSAmJiBpc3QtPnN1YjJ2aWRlby5mcmFtZSkgeworICAgICAgICAgICAgd2hpbGUgKGF2X2ZpZm9fc2l6ZShpc3QtPnN1YjJ2aWRlby5zdWJfcXVldWUpKSB7CisgICAgICAgICAgICAgICAgQVZTdWJ0aXRsZSB0bXA7CisgICAgICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQoaXN0LT5zdWIydmlkZW8uc3ViX3F1ZXVlLCAmdG1wLCBzaXplb2YodG1wKSwgTlVMTCk7CisgICAgICAgICAgICAgICAgc3ViMnZpZGVvX3VwZGF0ZShpc3QsICZ0bXApOworICAgICAgICAgICAgICAgIGF2c3VidGl0bGVfZnJlZSgmdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGNsZWFudXBfZmlsdGVyZ3JhcGgoZmcpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBpZmlsdGVyX3BhcmFtZXRlcnNfZnJvbV9mcmFtZShJbnB1dEZpbHRlciAqaWZpbHRlciwgY29uc3QgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgYXZfYnVmZmVyX3VucmVmKCZpZmlsdGVyLT5od19mcmFtZXNfY3R4KTsKKworICAgIGlmaWx0ZXItPmZvcm1hdCA9IGZyYW1lLT5mb3JtYXQ7CisKKyAgICBpZmlsdGVyLT53aWR0aCAgICAgICAgICAgICAgID0gZnJhbWUtPndpZHRoOworICAgIGlmaWx0ZXItPmhlaWdodCAgICAgICAgICAgICAgPSBmcmFtZS0+aGVpZ2h0OworICAgIGlmaWx0ZXItPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgIGlmaWx0ZXItPnNhbXBsZV9yYXRlICAgICAgICAgPSBmcmFtZS0+c2FtcGxlX3JhdGU7CisgICAgaWZpbHRlci0+Y2hhbm5lbHMgICAgICAgICAgICA9IGZyYW1lLT5jaGFubmVsczsKKyAgICBpZmlsdGVyLT5jaGFubmVsX2xheW91dCAgICAgID0gZnJhbWUtPmNoYW5uZWxfbGF5b3V0OworCisgICAgaWYgKGZyYW1lLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGlmaWx0ZXItPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKGZyYW1lLT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgaWYgKCFpZmlsdGVyLT5od19mcmFtZXNfY3R4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGlzdF9pbl9maWx0ZXJncmFwaChGaWx0ZXJHcmFwaCAqZmcsIElucHV0U3RyZWFtICppc3QpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGZnLT5uYl9pbnB1dHM7IGkrKykKKyAgICAgICAgaWYgKGZnLT5pbnB1dHNbaV0tPmlzdCA9PSBpc3QpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZpbHRlcmdyYXBoX2lzX3NpbXBsZShGaWx0ZXJHcmFwaCAqZmcpCit7CisgICAgcmV0dXJuICFmZy0+Z3JhcGhfZGVzYzsKK30KZGlmZiAtLWdpdCBhL2ZmdG9vbHMvZmZtcGVnX2h3LmMgYi9mZnRvb2xzL2ZmbXBlZ19ody5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzE4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9mZnRvb2xzL2ZmbXBlZ19ody5jCkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorCisjaW5jbHVkZSAiZmZtcGVnLmgiCisKK3N0YXRpYyBpbnQgbmJfaHdfZGV2aWNlczsKK3N0YXRpYyBIV0RldmljZSAqKmh3X2RldmljZXM7CisKK3N0YXRpYyBIV0RldmljZSAqaHdfZGV2aWNlX2dldF9ieV90eXBlKGVudW0gQVZIV0RldmljZVR5cGUgdHlwZSkKK3sKKyAgICBIV0RldmljZSAqZm91bmQgPSBOVUxMOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9od19kZXZpY2VzOyBpKyspIHsKKyAgICAgICAgaWYgKGh3X2RldmljZXNbaV0tPnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgaWYgKGZvdW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgZm91bmQgPSBod19kZXZpY2VzW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmb3VuZDsKK30KKworSFdEZXZpY2UgKmh3X2RldmljZV9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9od19kZXZpY2VzOyBpKyspIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoaHdfZGV2aWNlc1tpXS0+bmFtZSwgbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gaHdfZGV2aWNlc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBIV0RldmljZSAqaHdfZGV2aWNlX2FkZCh2b2lkKQoreworICAgIGludCBlcnI7CisgICAgZXJyID0gYXZfcmVhbGxvY3BfYXJyYXkoJmh3X2RldmljZXMsIG5iX2h3X2RldmljZXMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHdfZGV2aWNlcykpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgbmJfaHdfZGV2aWNlcyA9IDA7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBod19kZXZpY2VzW25iX2h3X2RldmljZXNdID0gYXZfbWFsbG9jeihzaXplb2YoSFdEZXZpY2UpKTsKKyAgICBpZiAoIWh3X2RldmljZXNbbmJfaHdfZGV2aWNlc10pCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiBod19kZXZpY2VzW25iX2h3X2RldmljZXMrK107Cit9CisKK3N0YXRpYyBjaGFyICpod19kZXZpY2VfZGVmYXVsdF9uYW1lKGVudW0gQVZIV0RldmljZVR5cGUgdHlwZSkKK3sKKyAgICAvLyBNYWtlIGFuIGF1dG9tYXRpYyBuYW1lIG9mIHRoZSBmb3JtICJ0eXBlJWQiLiAgV2UgYXJiaXRyYXJpbHkKKyAgICAvLyBsaW1pdCBhdCAxMDAwIGFub255bW91cyBkZXZpY2VzIG9mIHRoZSBzYW1lIHR5cGUgLSB0aGVyZSBpcworICAgIC8vIHByb2JhYmx5IHNvbWV0aGluZyBlbHNlIHZlcnkgd3JvbmcgaWYgeW91IGdldCB0byB0aGlzIGxpbWl0LgorICAgIGNvbnN0IGNoYXIgKnR5cGVfbmFtZSA9IGF2X2h3ZGV2aWNlX2dldF90eXBlX25hbWUodHlwZSk7CisgICAgY2hhciAqbmFtZTsKKyAgICBzaXplX3QgaW5kZXhfcG9zOworICAgIGludCBpbmRleCwgaW5kZXhfbGltaXQgPSAxMDAwOworICAgIGluZGV4X3BvcyA9IHN0cmxlbih0eXBlX25hbWUpOworICAgIG5hbWUgPSBhdl9tYWxsb2MoaW5kZXhfcG9zICsgNCk7CisgICAgaWYgKCFuYW1lKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBpbmRleF9saW1pdDsgaW5kZXgrKykgeworICAgICAgICBzbnByaW50ZihuYW1lLCBpbmRleF9wb3MgKyA0LCAiJXMlZCIsIHR5cGVfbmFtZSwgaW5kZXgpOworICAgICAgICBpZiAoIWh3X2RldmljZV9nZXRfYnlfbmFtZShuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaW5kZXggPj0gaW5kZXhfbGltaXQpIHsKKyAgICAgICAgYXZfZnJlZXAoJm5hbWUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIG5hbWU7Cit9CisKK2ludCBod19kZXZpY2VfaW5pdF9mcm9tX3N0cmluZyhjb25zdCBjaGFyICphcmcsIEhXRGV2aWNlICoqZGV2X291dCkKK3sKKyAgICAvLyAidHlwZT1uYW1lOmRldmljZSxrZXk9dmFsdWUsa2V5Mj12YWx1ZTIiCisgICAgLy8gInR5cGU6ZGV2aWNlLGtleT12YWx1ZSxrZXkyPXZhbHVlMiIKKyAgICAvLyAtPiBhdl9od2RldmljZV9jdHhfY3JlYXRlKCkKKyAgICAvLyAidHlwZT1uYW1lQG5hbWUiCisgICAgLy8gInR5cGVAbmFtZSIKKyAgICAvLyAtPiBhdl9od2RldmljZV9jdHhfY3JlYXRlX2Rlcml2ZWQoKQorCisgICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zID0gTlVMTDsKKyAgICBjaGFyICp0eXBlX25hbWUgPSBOVUxMLCAqbmFtZSA9IE5VTEwsICpkZXZpY2UgPSBOVUxMOworICAgIGVudW0gQVZIV0RldmljZVR5cGUgdHlwZTsKKyAgICBIV0RldmljZSAqZGV2LCAqc3JjOworICAgIEFWQnVmZmVyUmVmICpkZXZpY2VfcmVmID0gTlVMTDsKKyAgICBpbnQgZXJyOworICAgIGNvbnN0IGNoYXIgKmVycm1zZywgKnAsICpxOworICAgIHNpemVfdCBrOworCisgICAgayA9IHN0cmNzcG4oYXJnLCAiOj1AIik7CisgICAgcCA9IGFyZyArIGs7CisKKyAgICB0eXBlX25hbWUgPSBhdl9zdHJuZHVwKGFyZywgayk7CisgICAgaWYgKCF0eXBlX25hbWUpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHR5cGUgPSBhdl9od2RldmljZV9maW5kX3R5cGVfYnlfbmFtZSh0eXBlX25hbWUpOworICAgIGlmICh0eXBlID09IEFWX0hXREVWSUNFX1RZUEVfTk9ORSkgeworICAgICAgICBlcnJtc2cgPSAidW5rbm93biBkZXZpY2UgdHlwZSI7CisgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisKKyAgICBpZiAoKnAgPT0gJz0nKSB7CisgICAgICAgIGsgPSBzdHJjc3BuKHAgKyAxLCAiOkAiKTsKKworICAgICAgICBuYW1lID0gYXZfc3RybmR1cChwICsgMSwgayk7CisgICAgICAgIGlmICghbmFtZSkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChod19kZXZpY2VfZ2V0X2J5X25hbWUobmFtZSkpIHsKKyAgICAgICAgICAgIGVycm1zZyA9ICJuYW1lZCBkZXZpY2UgYWxyZWFkeSBleGlzdHMiOworICAgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICB9CisKKyAgICAgICAgcCArPSAxICsgazsKKyAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gaHdfZGV2aWNlX2RlZmF1bHRfbmFtZSh0eXBlKTsKKyAgICAgICAgaWYgKCFuYW1lKSB7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoISpwKSB7CisgICAgICAgIC8vIE5ldyBkZXZpY2Ugd2l0aCBubyBwYXJhbWV0ZXJzLgorICAgICAgICBlcnIgPSBhdl9od2RldmljZV9jdHhfY3JlYXRlKCZkZXZpY2VfcmVmLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDApOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgIH0gZWxzZSBpZiAoKnAgPT0gJzonKSB7CisgICAgICAgIC8vIE5ldyBkZXZpY2Ugd2l0aCBzb21lIHBhcmFtZXRlcnMuCisgICAgICAgICsrcDsKKyAgICAgICAgcSA9IHN0cmNocihwLCAnLCcpOworICAgICAgICBpZiAocSkgeworICAgICAgICAgICAgZGV2aWNlID0gYXZfc3RybmR1cChwLCBxIC0gcCk7CisgICAgICAgICAgICBpZiAoIWRldmljZSkgeworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBhdl9kaWN0X3BhcnNlX3N0cmluZygmb3B0aW9ucywgcSArIDEsICI9IiwgIiwiLCAwKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgZXJybXNnID0gImZhaWxlZCB0byBwYXJzZSBvcHRpb25zIjsKKyAgICAgICAgICAgICAgICBnb3RvIGludmFsaWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBhdl9od2RldmljZV9jdHhfY3JlYXRlKCZkZXZpY2VfcmVmLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSA/IGRldmljZSA6IHAsIG9wdGlvbnMsIDApOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgIH0gZWxzZSBpZiAoKnAgPT0gJ0AnKSB7CisgICAgICAgIC8vIERlcml2ZSBmcm9tIGV4aXN0aW5nIGRldmljZS4KKworICAgICAgICBzcmMgPSBod19kZXZpY2VfZ2V0X2J5X25hbWUocCArIDEpOworICAgICAgICBpZiAoIXNyYykgeworICAgICAgICAgICAgZXJybXNnID0gImludmFsaWQgc291cmNlIGRldmljZSBuYW1lIjsKKyAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGF2X2h3ZGV2aWNlX2N0eF9jcmVhdGVfZGVyaXZlZCgmZGV2aWNlX3JlZiwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+ZGV2aWNlX3JlZiwgMCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0gZWxzZSB7CisgICAgICAgIGVycm1zZyA9ICJwYXJzZSBlcnJvciI7CisgICAgICAgIGdvdG8gaW52YWxpZDsKKyAgICB9CisKKyAgICBkZXYgPSBod19kZXZpY2VfYWRkKCk7CisgICAgaWYgKCFkZXYpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZGV2LT5uYW1lID0gbmFtZTsKKyAgICBkZXYtPnR5cGUgPSB0eXBlOworICAgIGRldi0+ZGV2aWNlX3JlZiA9IGRldmljZV9yZWY7CisKKyAgICBpZiAoZGV2X291dCkKKyAgICAgICAgKmRldl9vdXQgPSBkZXY7CisKKyAgICBuYW1lID0gTlVMTDsKKyAgICBlcnIgPSAwOworZG9uZToKKyAgICBhdl9mcmVlcCgmdHlwZV9uYW1lKTsKKyAgICBhdl9mcmVlcCgmbmFtZSk7CisgICAgYXZfZnJlZXAoJmRldmljZSk7CisgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKKyAgICByZXR1cm4gZXJyOworaW52YWxpZDoKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAiSW52YWxpZCBkZXZpY2Ugc3BlY2lmaWNhdGlvbiBcIiVzXCI6ICVzXG4iLCBhcmcsIGVycm1zZyk7CisgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgIGdvdG8gZG9uZTsKK2ZhaWw6CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgIkRldmljZSBjcmVhdGlvbiBmYWlsZWQ6ICVkLlxuIiwgZXJyKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmRldmljZV9yZWYpOworICAgIGdvdG8gZG9uZTsKK30KKworc3RhdGljIGludCBod19kZXZpY2VfaW5pdF9mcm9tX3R5cGUoZW51bSBBVkhXRGV2aWNlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdEZXZpY2UgKipkZXZfb3V0KQoreworICAgIEFWQnVmZmVyUmVmICpkZXZpY2VfcmVmID0gTlVMTDsKKyAgICBIV0RldmljZSAqZGV2OworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IGVycjsKKworICAgIG5hbWUgPSBod19kZXZpY2VfZGVmYXVsdF9uYW1lKHR5cGUpOworICAgIGlmICghbmFtZSkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9od2RldmljZV9jdHhfY3JlYXRlKCZkZXZpY2VfcmVmLCB0eXBlLCBkZXZpY2UsIE5VTEwsIDApOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRGV2aWNlIGNyZWF0aW9uIGZhaWxlZDogJWQuXG4iLCBlcnIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZGV2ID0gaHdfZGV2aWNlX2FkZCgpOworICAgIGlmICghZGV2KSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGRldi0+bmFtZSA9IG5hbWU7CisgICAgZGV2LT50eXBlID0gdHlwZTsKKyAgICBkZXYtPmRldmljZV9yZWYgPSBkZXZpY2VfcmVmOworCisgICAgaWYgKGRldl9vdXQpCisgICAgICAgICpkZXZfb3V0ID0gZGV2OworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfZnJlZXAoJm5hbWUpOworICAgIGF2X2J1ZmZlcl91bnJlZigmZGV2aWNlX3JlZik7CisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBod19kZXZpY2VfZnJlZV9hbGwodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaHdfZGV2aWNlczsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZod19kZXZpY2VzW2ldLT5uYW1lKTsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZod19kZXZpY2VzW2ldLT5kZXZpY2VfcmVmKTsKKyAgICAgICAgYXZfZnJlZXAoJmh3X2RldmljZXNbaV0pOworICAgIH0KKyAgICBhdl9mcmVlcCgmaHdfZGV2aWNlcyk7CisgICAgbmJfaHdfZGV2aWNlcyA9IDA7Cit9CisKK3N0YXRpYyBIV0RldmljZSAqaHdfZGV2aWNlX21hdGNoX2J5X2NvZGVjKGNvbnN0IEFWQ29kZWMgKmNvZGVjKQoreworICAgIGNvbnN0IEFWQ29kZWNIV0NvbmZpZyAqY29uZmlnOworICAgIEhXRGV2aWNlICpkZXY7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgICBjb25maWcgPSBhdmNvZGVjX2dldF9od19jb25maWcoY29kZWMsIGkpOworICAgICAgICBpZiAoIWNvbmZpZykKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICBpZiAoIShjb25maWctPm1ldGhvZHMgJiBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0hXX0RFVklDRV9DVFgpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRldiA9IGh3X2RldmljZV9nZXRfYnlfdHlwZShjb25maWctPmRldmljZV90eXBlKTsKKyAgICAgICAgaWYgKGRldikKKyAgICAgICAgICAgIHJldHVybiBkZXY7CisgICAgfQorfQorCitpbnQgaHdfZGV2aWNlX3NldHVwX2Zvcl9kZWNvZGUoSW5wdXRTdHJlYW0gKmlzdCkKK3sKKyAgICBjb25zdCBBVkNvZGVjSFdDb25maWcgKmNvbmZpZzsKKyAgICBlbnVtIEFWSFdEZXZpY2VUeXBlIHR5cGU7CisgICAgSFdEZXZpY2UgKmRldiA9IE5VTEw7CisgICAgaW50IGVyciwgYXV0b19kZXZpY2UgPSAwOworCisgICAgaWYgKGlzdC0+aHdhY2NlbF9kZXZpY2UpIHsKKyAgICAgICAgZGV2ID0gaHdfZGV2aWNlX2dldF9ieV9uYW1lKGlzdC0+aHdhY2NlbF9kZXZpY2UpOworICAgICAgICBpZiAoIWRldikgeworICAgICAgICAgICAgaWYgKGlzdC0+aHdhY2NlbF9pZCA9PSBIV0FDQ0VMX0FVVE8pIHsKKyAgICAgICAgICAgICAgICBhdXRvX2RldmljZSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzdC0+aHdhY2NlbF9pZCA9PSBIV0FDQ0VMX0dFTkVSSUMpIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gaXN0LT5od2FjY2VsX2RldmljZV90eXBlOworICAgICAgICAgICAgICAgIGVyciA9IGh3X2RldmljZV9pbml0X2Zyb21fdHlwZSh0eXBlLCBpc3QtPmh3YWNjZWxfZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGRlYWx0IHdpdGggYnkgQVBJLXNwZWNpZmljIGluaXRpYWxpc2F0aW9uCisgICAgICAgICAgICAgICAgLy8gKHVzaW5nIGh3YWNjZWxfZGV2aWNlKSwgc28gbm90aGluZyBmdXJ0aGVyIG5lZWRlZCBoZXJlLgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlzdC0+aHdhY2NlbF9pZCA9PSBIV0FDQ0VMX0FVVE8pIHsKKyAgICAgICAgICAgICAgICBpc3QtPmh3YWNjZWxfZGV2aWNlX3R5cGUgPSBkZXYtPnR5cGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzdC0+aHdhY2NlbF9kZXZpY2VfdHlwZSAhPSBkZXYtPnR5cGUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaXN0LT5kZWNfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGh3YWNjZWwgZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZmllZCBmb3IgZGVjb2RlcjogZGV2aWNlICVzIG9mIHR5cGUgJXMgaXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInVzYWJsZSB3aXRoIGh3YWNjZWwgJXMuXG4iLCBkZXYtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2h3ZGV2aWNlX2dldF90eXBlX25hbWUoZGV2LT50eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfaHdkZXZpY2VfZ2V0X3R5cGVfbmFtZShpc3QtPmh3YWNjZWxfZGV2aWNlX3R5cGUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGlzdC0+aHdhY2NlbF9pZCA9PSBIV0FDQ0VMX0FVVE8pIHsKKyAgICAgICAgICAgIGF1dG9fZGV2aWNlID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChpc3QtPmh3YWNjZWxfaWQgPT0gSFdBQ0NFTF9HRU5FUklDKSB7CisgICAgICAgICAgICB0eXBlID0gaXN0LT5od2FjY2VsX2RldmljZV90eXBlOworICAgICAgICAgICAgZGV2ID0gaHdfZGV2aWNlX2dldF9ieV90eXBlKHR5cGUpOworICAgICAgICAgICAgaWYgKCFkZXYpCisgICAgICAgICAgICAgICAgZXJyID0gaHdfZGV2aWNlX2luaXRfZnJvbV90eXBlKHR5cGUsIE5VTEwsICZkZXYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGV2ID0gaHdfZGV2aWNlX21hdGNoX2J5X2NvZGVjKGlzdC0+ZGVjKTsKKyAgICAgICAgICAgIGlmICghZGV2KSB7CisgICAgICAgICAgICAgICAgLy8gTm8gZGV2aWNlIGZvciB0aGlzIGNvZGVjLCBidXQgbm90IHVzaW5nIGdlbmVyaWMgaHdhY2NlbAorICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVyZWZvcmUgbWF5IHdlbGwgbm90IG5lZWQgb25lIC0gaWdub3JlLgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1dG9fZGV2aWNlKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAoIWF2Y29kZWNfZ2V0X2h3X2NvbmZpZyhpc3QtPmRlYywgMCkpIHsKKyAgICAgICAgICAgIC8vIERlY29kZXIgZG9lcyBub3Qgc3VwcG9ydCBhbnkgaGFyZHdhcmUgZGV2aWNlcy4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7ICFkZXY7IGkrKykgeworICAgICAgICAgICAgY29uZmlnID0gYXZjb2RlY19nZXRfaHdfY29uZmlnKGlzdC0+ZGVjLCBpKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgdHlwZSA9IGNvbmZpZy0+ZGV2aWNlX3R5cGU7CisgICAgICAgICAgICBkZXYgPSBod19kZXZpY2VfZ2V0X2J5X3R5cGUodHlwZSk7CisgICAgICAgICAgICBpZiAoZGV2KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGlzdC0+ZGVjX2N0eCwgQVZfTE9HX0lORk8sICJVc2luZyBhdXRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgImh3YWNjZWwgdHlwZSAlcyB3aXRoIGV4aXN0aW5nIGRldmljZSAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2h3ZGV2aWNlX2dldF90eXBlX25hbWUodHlwZSksIGRldi0+bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgIWRldjsgaSsrKSB7CisgICAgICAgICAgICBjb25maWcgPSBhdmNvZGVjX2dldF9od19jb25maWcoaXN0LT5kZWMsIGkpOworICAgICAgICAgICAgaWYgKCFjb25maWcpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0eXBlID0gY29uZmlnLT5kZXZpY2VfdHlwZTsKKyAgICAgICAgICAgIC8vIFRyeSB0byBtYWtlIGEgbmV3IGRldmljZSBvZiB0aGlzIHR5cGUuCisgICAgICAgICAgICBlcnIgPSBod19kZXZpY2VfaW5pdF9mcm9tX3R5cGUodHlwZSwgaXN0LT5od2FjY2VsX2RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2KTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbWFrZSBhIGRldmljZSBvZiB0aGlzIHR5cGUuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXN0LT5od2FjY2VsX2RldmljZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhpc3QtPmRlY19jdHgsIEFWX0xPR19JTkZPLCAiVXNpbmcgYXV0byAiCisgICAgICAgICAgICAgICAgICAgICAgICJod2FjY2VsIHR5cGUgJXMgd2l0aCBuZXcgZGV2aWNlIGNyZWF0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSAlcy5cbiIsIGF2X2h3ZGV2aWNlX2dldF90eXBlX25hbWUodHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+aHdhY2NlbF9kZXZpY2UpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaXN0LT5kZWNfY3R4LCBBVl9MT0dfSU5GTywgIlVzaW5nIGF1dG8gIgorICAgICAgICAgICAgICAgICAgICAgICAiaHdhY2NlbCB0eXBlICVzIHdpdGggbmV3IGRlZmF1bHQgZGV2aWNlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfaHdkZXZpY2VfZ2V0X3R5cGVfbmFtZSh0eXBlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldikgeworICAgICAgICAgICAgaXN0LT5od2FjY2VsX2RldmljZV90eXBlID0gdHlwZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhpc3QtPmRlY19jdHgsIEFWX0xPR19JTkZPLCAiQXV0byBod2FjY2VsICIKKyAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWQ6IG5vIGRldmljZSBmb3VuZC5cbiIpOworICAgICAgICAgICAgaXN0LT5od2FjY2VsX2lkID0gSFdBQ0NFTF9OT05FOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRldikgeworICAgICAgICBhdl9sb2coaXN0LT5kZWNfY3R4LCBBVl9MT0dfRVJST1IsICJObyBkZXZpY2UgYXZhaWxhYmxlICIKKyAgICAgICAgICAgICAgICJmb3IgZGVjb2RlcjogZGV2aWNlIHR5cGUgJXMgbmVlZGVkIGZvciBjb2RlYyAlcy5cbiIsCisgICAgICAgICAgICAgICBhdl9od2RldmljZV9nZXRfdHlwZV9uYW1lKHR5cGUpLCBpc3QtPmRlYy0+bmFtZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaXN0LT5kZWNfY3R4LT5od19kZXZpY2VfY3R4ID0gYXZfYnVmZmVyX3JlZihkZXYtPmRldmljZV9yZWYpOworICAgIGlmICghaXN0LT5kZWNfY3R4LT5od19kZXZpY2VfY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBod19kZXZpY2Vfc2V0dXBfZm9yX2VuY29kZShPdXRwdXRTdHJlYW0gKm9zdCkKK3sKKyAgICBIV0RldmljZSAqZGV2OworCisgICAgZGV2ID0gaHdfZGV2aWNlX21hdGNoX2J5X2NvZGVjKG9zdC0+ZW5jKTsKKyAgICBpZiAoZGV2KSB7CisgICAgICAgIG9zdC0+ZW5jX2N0eC0+aHdfZGV2aWNlX2N0eCA9IGF2X2J1ZmZlcl9yZWYoZGV2LT5kZXZpY2VfcmVmKTsKKyAgICAgICAgaWYgKCFvc3QtPmVuY19jdHgtPmh3X2RldmljZV9jdHgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBObyBkZXZpY2UgcmVxdWlyZWQsIG9yIG5vIGRldmljZSBhdmFpbGFibGUuCisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBod2FjY2VsX3JldHJpZXZlX2RhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICppbnB1dCkKK3sKKyAgICBJbnB1dFN0cmVhbSAqaXN0ID0gYXZjdHgtPm9wYXF1ZTsKKyAgICBBVkZyYW1lICpvdXRwdXQgPSBOVUxMOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBvdXRwdXRfZm9ybWF0ID0gaXN0LT5od2FjY2VsX291dHB1dF9mb3JtYXQ7CisgICAgaW50IGVycjsKKworICAgIGlmIChpbnB1dC0+Zm9ybWF0ID09IG91dHB1dF9mb3JtYXQpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkby4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgb3V0cHV0ID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIW91dHB1dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIG91dHB1dC0+Zm9ybWF0ID0gb3V0cHV0X2Zvcm1hdDsKKworICAgIGVyciA9IGF2X2h3ZnJhbWVfdHJhbnNmZXJfZGF0YShvdXRwdXQsIGlucHV0LCAwKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB0cmFuc2ZlciBkYXRhIHRvICIKKyAgICAgICAgICAgICAgICJvdXRwdXQgZnJhbWU6ICVkLlxuIiwgZXJyKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0cHV0LCBpbnB1dCk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYob3V0cHV0KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGF2X2ZyYW1lX3VucmVmKGlucHV0KTsKKyAgICBhdl9mcmFtZV9tb3ZlX3JlZihpbnB1dCwgb3V0cHV0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXQpOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfZnJhbWVfZnJlZSgmb3V0cHV0KTsKKyAgICByZXR1cm4gZXJyOworfQorCitpbnQgaHdhY2NlbF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSW5wdXRTdHJlYW0gKmlzdCA9IGF2Y3R4LT5vcGFxdWU7CisKKyAgICBpc3QtPmh3YWNjZWxfcmV0cmlldmVfZGF0YSA9ICZod2FjY2VsX3JldHJpZXZlX2RhdGE7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmdG9vbHMvZmZtcGVnX29wdC5jIGIvZmZ0b29scy9mZm1wZWdfb3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhN2ViMAotLS0gL2Rldi9udWxsCisrKyBiL2ZmdG9vbHMvZmZtcGVnX29wdC5jCkBAIC0wLDAgKzEsMzY4MCBAQAorLyoKKyAqIGZmbXBlZyBvcHRpb24gcGFyc2luZworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJmZm1wZWcuaCIKKyNpbmNsdWRlICJjbWR1dGlscy5oIgorCisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKworI2RlZmluZSBERUZBVUxUX1BBU1NfTE9HRklMRU5BTUVfUFJFRklYICJmZm1wZWcycGFzcyIKKworI2RlZmluZSBNQVRDSF9QRVJfU1RSRUFNX09QVChuYW1lLCB0eXBlLCBvdXR2YXIsIGZtdGN0eCwgc3QpXAore1wKKyAgICBpbnQgaSwgcmV0O1wKKyAgICBmb3IgKGkgPSAwOyBpIDwgby0+bmJfICMjIG5hbWU7IGkrKykge1wKKyAgICAgICAgY2hhciAqc3BlYyA9IG8tPm5hbWVbaV0uc3BlY2lmaWVyO1wKKyAgICAgICAgaWYgKChyZXQgPSBjaGVja19zdHJlYW1fc3BlY2lmaWVyKGZtdGN0eCwgc3QsIHNwZWMpKSA+IDApXAorICAgICAgICAgICAgb3V0dmFyID0gby0+bmFtZVtpXS51LnR5cGU7XAorICAgICAgICBlbHNlIGlmIChyZXQgPCAwKVwKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTtcCisgICAgfVwKK30KKworI2RlZmluZSBNQVRDSF9QRVJfVFlQRV9PUFQobmFtZSwgdHlwZSwgb3V0dmFyLCBmbXRjdHgsIG1lZGlhdHlwZSlcCit7XAorICAgIGludCBpO1wKKyAgICBmb3IgKGkgPSAwOyBpIDwgby0+bmJfICMjIG5hbWU7IGkrKykge1wKKyAgICAgICAgY2hhciAqc3BlYyA9IG8tPm5hbWVbaV0uc3BlY2lmaWVyO1wKKyAgICAgICAgaWYgKCFzdHJjbXAoc3BlYywgbWVkaWF0eXBlKSlcCisgICAgICAgICAgICBvdXR2YXIgPSBvLT5uYW1lW2ldLnUudHlwZTtcCisgICAgfVwKK30KKworY29uc3QgSFdBY2NlbCBod2FjY2Vsc1tdID0geworI2lmIENPTkZJR19WSURFT1RPT0xCT1gKKyAgICB7ICJ2aWRlb3Rvb2xib3giLCB2aWRlb3Rvb2xib3hfaW5pdCwgSFdBQ0NFTF9WSURFT1RPT0xCT1gsIEFWX1BJWF9GTVRfVklERU9UT09MQk9YIH0sCisjZW5kaWYKKyNpZiBDT05GSUdfTElCTUZYCisgICAgeyAicXN2IiwgICBxc3ZfaW5pdCwgICBIV0FDQ0VMX1FTViwgICBBVl9QSVhfRk1UX1FTViB9LAorI2VuZGlmCisjaWYgQ09ORklHX0NVVklECisgICAgeyAiY3V2aWQiLCBjdXZpZF9pbml0LCBIV0FDQ0VMX0NVVklELCBBVl9QSVhfRk1UX0NVREEgfSwKKyNlbmRpZgorICAgIHsgMCB9LAorfTsKK0FWQnVmZmVyUmVmICpod19kZXZpY2VfY3R4OworSFdEZXZpY2UgKmZpbHRlcl9od19kZXZpY2U7CisKK2NoYXIgKnZzdGF0c19maWxlbmFtZTsKK2NoYXIgKnNkcF9maWxlbmFtZTsKKworZmxvYXQgYXVkaW9fZHJpZnRfdGhyZXNob2xkID0gMC4xOworZmxvYXQgZHRzX2RlbHRhX3RocmVzaG9sZCAgID0gMTA7CitmbG9hdCBkdHNfZXJyb3JfdGhyZXNob2xkICAgPSAzNjAwKjMwOworCitpbnQgYXVkaW9fdm9sdW1lICAgICAgPSAyNTY7CitpbnQgYXVkaW9fc3luY19tZXRob2QgPSAwOworaW50IHZpZGVvX3N5bmNfbWV0aG9kID0gVlNZTkNfQVVUTzsKK2Zsb2F0IGZyYW1lX2Ryb3BfdGhyZXNob2xkID0gMDsKK2ludCBkb19kZWludGVybGFjZSAgICA9IDA7CitpbnQgZG9fYmVuY2htYXJrICAgICAgPSAwOworaW50IGRvX2JlbmNobWFya19hbGwgID0gMDsKK2ludCBkb19oZXhfZHVtcCAgICAgICA9IDA7CitpbnQgZG9fcGt0X2R1bXAgICAgICAgPSAwOworaW50IGNvcHlfdHMgICAgICAgICAgID0gMDsKK2ludCBzdGFydF9hdF96ZXJvICAgICA9IDA7CitpbnQgY29weV90YiAgICAgICAgICAgPSAtMTsKK2ludCBkZWJ1Z190cyAgICAgICAgICA9IDA7CitpbnQgZXhpdF9vbl9lcnJvciAgICAgPSAwOworaW50IGFib3J0X29uX2ZsYWdzICAgID0gMDsKK2ludCBwcmludF9zdGF0cyAgICAgICA9IC0xOworaW50IHFwX2hpc3QgICAgICAgICAgID0gMDsKK2ludCBzdGRpbl9pbnRlcmFjdGlvbiA9IDE7CitpbnQgZnJhbWVfYml0c19wZXJfcmF3X3NhbXBsZSA9IDA7CitmbG9hdCBtYXhfZXJyb3JfcmF0ZSAgPSAyLjAvMzsKK2ludCBmaWx0ZXJfbmJ0aHJlYWRzID0gMDsKK2ludCBmaWx0ZXJfY29tcGxleF9uYnRocmVhZHMgPSAwOworaW50IHZzdGF0c192ZXJzaW9uID0gMjsKKworCitzdGF0aWMgaW50IGludHJhX29ubHkgICAgICAgICA9IDA7CitzdGF0aWMgaW50IGZpbGVfb3ZlcndyaXRlICAgICA9IDA7CitzdGF0aWMgaW50IG5vX2ZpbGVfb3ZlcndyaXRlICA9IDA7CitzdGF0aWMgaW50IGRvX3BzbnIgICAgICAgICAgICA9IDA7CitzdGF0aWMgaW50IGlucHV0X3N5bmM7CitzdGF0aWMgaW50IGlucHV0X3N0cmVhbV9wb3RlbnRpYWxseV9hdmFpbGFibGUgPSAwOworc3RhdGljIGludCBpZ25vcmVfdW5rbm93bl9zdHJlYW1zID0gMDsKK3N0YXRpYyBpbnQgY29weV91bmtub3duX3N0cmVhbXMgPSAwOworc3RhdGljIGludCBmaW5kX3N0cmVhbV9pbmZvID0gMTsKKworc3RhdGljIHZvaWQgdW5pbml0X29wdGlvbnMoT3B0aW9uc0NvbnRleHQgKm8pCit7CisgICAgY29uc3QgT3B0aW9uRGVmICpwbyA9IG9wdGlvbnM7CisgICAgaW50IGk7CisKKyAgICAvKiBhbGwgT1BUX1NQRUMgYW5kIE9QVF9TVFJJTkcgY2FuIGJlIGZyZWVkIGluIGdlbmVyaWMgd2F5ICovCisgICAgd2hpbGUgKHBvLT5uYW1lKSB7CisgICAgICAgIHZvaWQgKmRzdCA9ICh1aW50OF90KilvICsgcG8tPnUub2ZmOworCisgICAgICAgIGlmIChwby0+ZmxhZ3MgJiBPUFRfU1BFQykgeworICAgICAgICAgICAgU3BlY2lmaWVyT3B0ICoqc28gPSBkc3Q7CisgICAgICAgICAgICBpbnQgaSwgKmNvdW50ID0gKGludCopKHNvICsgMSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmKCpzbylbaV0uc3BlY2lmaWVyKTsKKyAgICAgICAgICAgICAgICBpZiAocG8tPmZsYWdzICYgT1BUX1NUUklORykKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJigqc28pW2ldLnUuc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWVwKHNvKTsKKyAgICAgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAocG8tPmZsYWdzICYgT1BUX09GRlNFVCAmJiBwby0+ZmxhZ3MgJiBPUFRfU1RSSU5HKQorICAgICAgICAgICAgYXZfZnJlZXAoZHN0KTsKKyAgICAgICAgcG8rKzsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgby0+bmJfc3RyZWFtX21hcHM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJm8tPnN0cmVhbV9tYXBzW2ldLmxpbmtsYWJlbCk7CisgICAgYXZfZnJlZXAoJm8tPnN0cmVhbV9tYXBzKTsKKyAgICBhdl9mcmVlcCgmby0+YXVkaW9fY2hhbm5lbF9tYXBzKTsKKyAgICBhdl9mcmVlcCgmby0+c3RyZWFtaWRfbWFwKTsKKyAgICBhdl9mcmVlcCgmby0+YXR0YWNobWVudHMpOworfQorCitzdGF0aWMgdm9pZCBpbml0X29wdGlvbnMoT3B0aW9uc0NvbnRleHQgKm8pCit7CisgICAgbWVtc2V0KG8sIDAsIHNpemVvZigqbykpOworCisgICAgby0+c3RvcF90aW1lID0gSU5UNjRfTUFYOworICAgIG8tPm11eF9tYXhfZGVsYXkgID0gMC43OworICAgIG8tPnN0YXJ0X3RpbWUgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgby0+c3RhcnRfdGltZV9lb2YgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBvLT5yZWNvcmRpbmdfdGltZSA9IElOVDY0X01BWDsKKyAgICBvLT5saW1pdF9maWxlc2l6ZSA9IFVJTlQ2NF9NQVg7CisgICAgby0+Y2hhcHRlcnNfaW5wdXRfZmlsZSA9IElOVF9NQVg7CisgICAgby0+YWNjdXJhdGVfc2VlayAgPSAxOworfQorCitzdGF0aWMgaW50IHNob3dfaHdhY2NlbHModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBlbnVtIEFWSFdEZXZpY2VUeXBlIHR5cGUgPSBBVl9IV0RFVklDRV9UWVBFX05PTkU7CisgICAgaW50IGk7CisKKyAgICBwcmludGYoIkhhcmR3YXJlIGFjY2VsZXJhdGlvbiBtZXRob2RzOlxuIik7CisgICAgd2hpbGUgKCh0eXBlID0gYXZfaHdkZXZpY2VfaXRlcmF0ZV90eXBlcyh0eXBlKSkgIT0KKyAgICAgICAgICAgQVZfSFdERVZJQ0VfVFlQRV9OT05FKQorICAgICAgICBwcmludGYoIiVzXG4iLCBhdl9od2RldmljZV9nZXRfdHlwZV9uYW1lKHR5cGUpKTsKKyAgICBmb3IgKGkgPSAwOyBod2FjY2Vsc1tpXS5uYW1lOyBpKyspCisgICAgICAgIHByaW50ZigiJXNcbiIsIGh3YWNjZWxzW2ldLm5hbWUpOworICAgIHByaW50ZigiXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworLyogcmV0dXJuIGEgY29weSBvZiB0aGUgaW5wdXQgd2l0aCB0aGUgc3RyZWFtIHNwZWNpZmllcnMgcmVtb3ZlZCBmcm9tIHRoZSBrZXlzICovCitzdGF0aWMgQVZEaWN0aW9uYXJ5ICpzdHJpcF9zcGVjaWZpZXJzKEFWRGljdGlvbmFyeSAqZGljdCkKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5ICAgICpyZXQgPSBOVUxMOworCisgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQoZGljdCwgIiIsIGUsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoZS0+a2V5LCAnOicpOworCisgICAgICAgIGlmIChwKQorICAgICAgICAgICAgKnAgPSAwOworICAgICAgICBhdl9kaWN0X3NldCgmcmV0LCBlLT5rZXksIGUtPnZhbHVlLCAwKTsKKyAgICAgICAgaWYgKHApCisgICAgICAgICAgICAqcCA9ICc6JzsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcHRfYWJvcnRfb24odm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0c1tdID0geworICAgICAgICB7ICJhYm9ydF9vbiIgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfRkxBR1MsIHsgLmk2NCA9IDAgfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIC51bml0ID0gImZsYWdzIiB9LAorICAgICAgICB7ICJlbXB0eV9vdXRwdXQiICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFCT1JUX09OX0ZMQUdfRU1QVFlfT1VUUFVUICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKKyAgICAgICAgeyBOVUxMIH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgQVZDbGFzcyBjbGFzcyA9IHsKKyAgICAgICAgLmNsYXNzX25hbWUgPSAiIiwKKyAgICAgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAgICAgLm9wdGlvbiAgICAgPSBvcHRzLAorICAgICAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICB9OworICAgIGNvbnN0IEFWQ2xhc3MgKnBjbGFzcyA9ICZjbGFzczsKKworICAgIHJldHVybiBhdl9vcHRfZXZhbF9mbGFncygmcGNsYXNzLCAmb3B0c1swXSwgYXJnLCAmYWJvcnRfb25fZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG9wdF9zYW1lcSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJPcHRpb24gJyVzJyB3YXMgcmVtb3ZlZC4gIgorICAgICAgICAgICAiSWYgeW91IGFyZSBsb29raW5nIGZvciBhbiBvcHRpb24gdG8gcHJlc2VydmUgdGhlIHF1YWxpdHkgKHdoaWNoIGlzIG5vdCAiCisgICAgICAgICAgICJ3aGF0IC0lcyB3YXMgZm9yKSwgdXNlIC1xc2NhbGUgMCBvciBhbiBlcXVpdmFsZW50IHF1YWxpdHkgZmFjdG9yIG9wdGlvbi5cbiIsCisgICAgICAgICAgIG9wdCwgb3B0KTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCitzdGF0aWMgaW50IG9wdF92aWRlb19jaGFubmVsKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiVGhpcyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1jaGFubmVsLlxuIik7CisgICAgcmV0dXJuIG9wdF9kZWZhdWx0KG9wdGN0eCwgImNoYW5uZWwiLCBhcmcpOworfQorCitzdGF0aWMgaW50IG9wdF92aWRlb19zdGFuZGFyZCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSAtc3RhbmRhcmQuXG4iKTsKKyAgICByZXR1cm4gb3B0X2RlZmF1bHQob3B0Y3R4LCAic3RhbmRhcmQiLCBhcmcpOworfQorCitzdGF0aWMgaW50IG9wdF9hdWRpb19jb2RlYyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIHJldHVybiBwYXJzZV9vcHRpb24obywgImNvZGVjOmEiLCBhcmcsIG9wdGlvbnMpOworfQorCitzdGF0aWMgaW50IG9wdF92aWRlb19jb2RlYyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIHJldHVybiBwYXJzZV9vcHRpb24obywgImNvZGVjOnYiLCBhcmcsIG9wdGlvbnMpOworfQorCitzdGF0aWMgaW50IG9wdF9zdWJ0aXRsZV9jb2RlYyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIHJldHVybiBwYXJzZV9vcHRpb24obywgImNvZGVjOnMiLCBhcmcsIG9wdGlvbnMpOworfQorCitzdGF0aWMgaW50IG9wdF9kYXRhX2NvZGVjKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7CisgICAgcmV0dXJuIHBhcnNlX29wdGlvbihvLCAiY29kZWM6ZCIsIGFyZywgb3B0aW9ucyk7Cit9CisKK3N0YXRpYyBpbnQgb3B0X21hcCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIFN0cmVhbU1hcCAqbSA9IE5VTEw7CisgICAgaW50IGksIG5lZ2F0aXZlID0gMCwgZmlsZV9pZHg7CisgICAgaW50IHN5bmNfZmlsZV9pZHggPSAtMSwgc3luY19zdHJlYW1faWR4ID0gMDsKKyAgICBjaGFyICpwLCAqc3luYzsKKyAgICBjaGFyICptYXA7CisgICAgY2hhciAqYWxsb3dfdW51c2VkOworCisgICAgaWYgKCphcmcgPT0gJy0nKSB7CisgICAgICAgIG5lZ2F0aXZlID0gMTsKKyAgICAgICAgYXJnKys7CisgICAgfQorICAgIG1hcCA9IGF2X3N0cmR1cChhcmcpOworICAgIGlmICghbWFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLyogcGFyc2Ugc3luYyBzdHJlYW0gZmlyc3QsIGp1c3QgcGljayBmaXJzdCBtYXRjaGluZyBzdHJlYW0gKi8KKyAgICBpZiAoc3luYyA9IHN0cmNocihtYXAsICcsJykpIHsKKyAgICAgICAgKnN5bmMgPSAwOworICAgICAgICBzeW5jX2ZpbGVfaWR4ID0gc3RydG9sKHN5bmMgKyAxLCAmc3luYywgMCk7CisgICAgICAgIGlmIChzeW5jX2ZpbGVfaWR4ID49IG5iX2lucHV0X2ZpbGVzIHx8IHN5bmNfZmlsZV9pZHggPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBzeW5jIGZpbGUgaW5kZXg6ICVkLlxuIiwgc3luY19maWxlX2lkeCk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzeW5jKQorICAgICAgICAgICAgc3luYysrOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRfZmlsZXNbc3luY19maWxlX2lkeF0tPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgICAgIGlmIChjaGVja19zdHJlYW1fc3BlY2lmaWVyKGlucHV0X2ZpbGVzW3N5bmNfZmlsZV9pZHhdLT5jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9maWxlc1tzeW5jX2ZpbGVfaWR4XS0+Y3R4LT5zdHJlYW1zW2ldLCBzeW5jKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgc3luY19zdHJlYW1faWR4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gaW5wdXRfZmlsZXNbc3luY19maWxlX2lkeF0tPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTeW5jIHN0cmVhbSBzcGVjaWZpY2F0aW9uIGluIG1hcCAlcyBkb2VzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2ggYW55IHN0cmVhbXMuXG4iLCBhcmcpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAobWFwWzBdID09ICdbJykgeworICAgICAgICAvKiB0aGlzIG1hcHBpbmcgcmVmZXJzIHRvIGxhdmZpIG91dHB1dCAqLworICAgICAgICBjb25zdCBjaGFyICpjID0gbWFwICsgMTsKKyAgICAgICAgR1JPV19BUlJBWShvLT5zdHJlYW1fbWFwcywgby0+bmJfc3RyZWFtX21hcHMpOworICAgICAgICBtID0gJm8tPnN0cmVhbV9tYXBzW28tPm5iX3N0cmVhbV9tYXBzIC0gMV07CisgICAgICAgIG0tPmxpbmtsYWJlbCA9IGF2X2dldF90b2tlbigmYywgIl0iKTsKKyAgICAgICAgaWYgKCFtLT5saW5rbGFiZWwpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG91dHB1dCBsaW5rIGxhYmVsOiAlcy5cbiIsIG1hcCk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYWxsb3dfdW51c2VkID0gc3RyY2hyKG1hcCwgJz8nKSkKKyAgICAgICAgICAgICphbGxvd191bnVzZWQgPSAwOworICAgICAgICBmaWxlX2lkeCA9IHN0cnRvbChtYXAsICZwLCAwKTsKKyAgICAgICAgaWYgKGZpbGVfaWR4ID49IG5iX2lucHV0X2ZpbGVzIHx8IGZpbGVfaWR4IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgaW5wdXQgZmlsZSBpbmRleDogJWQuXG4iLCBmaWxlX2lkeCk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZ2F0aXZlKQorICAgICAgICAgICAgLyogZGlzYWJsZSBzb21lIGFscmVhZHkgZGVmaW5lZCBtYXBzICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgby0+bmJfc3RyZWFtX21hcHM7IGkrKykgeworICAgICAgICAgICAgICAgIG0gPSAmby0+c3RyZWFtX21hcHNbaV07CisgICAgICAgICAgICAgICAgaWYgKGZpbGVfaWR4ID09IG0tPmZpbGVfaW5kZXggJiYKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfc3RyZWFtX3NwZWNpZmllcihpbnB1dF9maWxlc1ttLT5maWxlX2luZGV4XS0+Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2ZpbGVzW20tPmZpbGVfaW5kZXhdLT5jdHgtPnN0cmVhbXNbbS0+c3RyZWFtX2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcCA9PSAnOicgPyBwICsgMSA6IHApID4gMCkKKyAgICAgICAgICAgICAgICAgICAgbS0+ZGlzYWJsZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5wdXRfZmlsZXNbZmlsZV9pZHhdLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tfc3RyZWFtX3NwZWNpZmllcihpbnB1dF9maWxlc1tmaWxlX2lkeF0tPmN0eCwgaW5wdXRfZmlsZXNbZmlsZV9pZHhdLT5jdHgtPnN0cmVhbXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnAgPT0gJzonID8gcCArIDEgOiBwKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBHUk9XX0FSUkFZKG8tPnN0cmVhbV9tYXBzLCBvLT5uYl9zdHJlYW1fbWFwcyk7CisgICAgICAgICAgICAgICAgbSA9ICZvLT5zdHJlYW1fbWFwc1tvLT5uYl9zdHJlYW1fbWFwcyAtIDFdOworCisgICAgICAgICAgICAgICAgbS0+ZmlsZV9pbmRleCAgID0gZmlsZV9pZHg7CisgICAgICAgICAgICAgICAgbS0+c3RyZWFtX2luZGV4ID0gaTsKKworICAgICAgICAgICAgICAgIGlmIChzeW5jX2ZpbGVfaWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbS0+c3luY19maWxlX2luZGV4ICAgPSBzeW5jX2ZpbGVfaWR4OworICAgICAgICAgICAgICAgICAgICBtLT5zeW5jX3N0cmVhbV9pbmRleCA9IHN5bmNfc3RyZWFtX2lkeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtLT5zeW5jX2ZpbGVfaW5kZXggICA9IGZpbGVfaWR4OworICAgICAgICAgICAgICAgICAgICBtLT5zeW5jX3N0cmVhbV9pbmRleCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbSkgeworICAgICAgICBpZiAoYWxsb3dfdW51c2VkKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJTdHJlYW0gbWFwICclcycgbWF0Y2hlcyBubyBzdHJlYW1zOyBpZ25vcmluZy5cbiIsIGFyZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU3RyZWFtIG1hcCAnJXMnIG1hdGNoZXMgbm8gc3RyZWFtcy5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUbyBpZ25vcmUgdGhpcywgYWRkIGEgdHJhaWxpbmcgJz8nIHRvIHRoZSBtYXAuXG4iLCBhcmcpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJlZXAoJm1hcCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2F0dGFjaCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIEdST1dfQVJSQVkoby0+YXR0YWNobWVudHMsIG8tPm5iX2F0dGFjaG1lbnRzKTsKKyAgICBvLT5hdHRhY2htZW50c1tvLT5uYl9hdHRhY2htZW50cyAtIDFdID0gYXJnOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdF9tYXBfY2hhbm5lbCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIGludCBuOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBdWRpb0NoYW5uZWxNYXAgKm07CisgICAgY2hhciAqYWxsb3dfdW51c2VkOworICAgIGNoYXIgKm1hcGNoYW47CisgICAgbWFwY2hhbiA9IGF2X3N0cmR1cChhcmcpOworICAgIGlmICghbWFwY2hhbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIEdST1dfQVJSQVkoby0+YXVkaW9fY2hhbm5lbF9tYXBzLCBvLT5uYl9hdWRpb19jaGFubmVsX21hcHMpOworICAgIG0gPSAmby0+YXVkaW9fY2hhbm5lbF9tYXBzW28tPm5iX2F1ZGlvX2NoYW5uZWxfbWFwcyAtIDFdOworCisgICAgLyogbXV0ZWQgY2hhbm5lbCBzeW50YXggKi8KKyAgICBuID0gc3NjYW5mKGFyZywgIiVkOiVkLiVkIiwgJm0tPmNoYW5uZWxfaWR4LCAmbS0+b2ZpbGVfaWR4LCAmbS0+b3N0cmVhbV9pZHgpOworICAgIGlmICgobiA9PSAxIHx8IG4gPT0gMykgJiYgbS0+Y2hhbm5lbF9pZHggPT0gLTEpIHsKKyAgICAgICAgbS0+ZmlsZV9pZHggPSBtLT5zdHJlYW1faWR4ID0gLTE7CisgICAgICAgIGlmIChuID09IDEpCisgICAgICAgICAgICBtLT5vZmlsZV9pZHggPSBtLT5vc3RyZWFtX2lkeCA9IC0xOworICAgICAgICBhdl9mcmVlKG1hcGNoYW4pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBub3JtYWwgc3ludGF4ICovCisgICAgbiA9IHNzY2FuZihhcmcsICIlZC4lZC4lZDolZC4lZCIsCisgICAgICAgICAgICAgICAmbS0+ZmlsZV9pZHgsICAmbS0+c3RyZWFtX2lkeCwgJm0tPmNoYW5uZWxfaWR4LAorICAgICAgICAgICAgICAgJm0tPm9maWxlX2lkeCwgJm0tPm9zdHJlYW1faWR4KTsKKworICAgIGlmIChuICE9IDMgJiYgbiAhPSA1KSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTeW50YXggZXJyb3IsIG1hcGNoYW4gdXNhZ2U6ICIKKyAgICAgICAgICAgICAgICJbZmlsZS5zdHJlYW0uY2hhbm5lbHwtMV1bOnN5bmNmaWxlOnN5bmNzdHJlYW1dXG4iKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGlmIChuICE9IDUpIC8vIG9ubHkgZmlsZS5zdHJlYW0uY2hhbm5lbCBzcGVjaWZpZWQKKyAgICAgICAgbS0+b2ZpbGVfaWR4ID0gbS0+b3N0cmVhbV9pZHggPSAtMTsKKworICAgIC8qIGNoZWNrIGlucHV0ICovCisgICAgaWYgKG0tPmZpbGVfaWR4IDwgMCB8fCBtLT5maWxlX2lkeCA+PSBuYl9pbnB1dF9maWxlcykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAibWFwY2hhbjogaW52YWxpZCBpbnB1dCBmaWxlIGluZGV4OiAlZFxuIiwKKyAgICAgICAgICAgICAgIG0tPmZpbGVfaWR4KTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKyAgICBpZiAobS0+c3RyZWFtX2lkeCA8IDAgfHwKKyAgICAgICAgbS0+c3RyZWFtX2lkeCA+PSBpbnB1dF9maWxlc1ttLT5maWxlX2lkeF0tPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIm1hcGNoYW46IGludmFsaWQgaW5wdXQgZmlsZSBzdHJlYW0gaW5kZXggIyVkLiVkXG4iLAorICAgICAgICAgICAgICAgbS0+ZmlsZV9pZHgsIG0tPnN0cmVhbV9pZHgpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorICAgIHN0ID0gaW5wdXRfZmlsZXNbbS0+ZmlsZV9pZHhdLT5jdHgtPnN0cmVhbXNbbS0+c3RyZWFtX2lkeF07CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIm1hcGNoYW46IHN0cmVhbSAjJWQuJWQgaXMgbm90IGFuIGF1ZGlvIHN0cmVhbS5cbiIsCisgICAgICAgICAgICAgICBtLT5maWxlX2lkeCwgbS0+c3RyZWFtX2lkeCk7CisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB9CisgICAgLyogYWxsb3cgdHJhaWxpbmcgPyB0byBtYXBfY2hhbm5lbCAqLworICAgIGlmIChhbGxvd191bnVzZWQgPSBzdHJjaHIobWFwY2hhbiwgJz8nKSkKKyAgICAgICAgKmFsbG93X3VudXNlZCA9IDA7CisgICAgaWYgKG0tPmNoYW5uZWxfaWR4IDwgMCB8fCBtLT5jaGFubmVsX2lkeCA+PSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKSB7CisgICAgICAgIGlmIChhbGxvd191bnVzZWQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIm1hcGNoYW46IGludmFsaWQgYXVkaW8gY2hhbm5lbCAjJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIG0tPmZpbGVfaWR4LCBtLT5zdHJlYW1faWR4LCBtLT5jaGFubmVsX2lkeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAgIm1hcGNoYW46IGludmFsaWQgYXVkaW8gY2hhbm5lbCAjJWQuJWQuJWRcbiIKKyAgICAgICAgICAgICAgICAgICAgIlRvIGlnbm9yZSB0aGlzLCBhZGQgYSB0cmFpbGluZyAnPycgdG8gdGhlIG1hcF9jaGFubmVsLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgbS0+ZmlsZV9pZHgsIG0tPnN0cmVhbV9pZHgsIG0tPmNoYW5uZWxfaWR4KTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGF2X2ZyZWUobWFwY2hhbik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3B0X3NkcF9maWxlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgYXZfZnJlZShzZHBfZmlsZW5hbWUpOworICAgIHNkcF9maWxlbmFtZSA9IGF2X3N0cmR1cChhcmcpOworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX1ZBQVBJCitzdGF0aWMgaW50IG9wdF92YWFwaV9kZXZpY2Uodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBIV0RldmljZSAqZGV2OworICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICJ2YWFwaToiOworICAgIGNoYXIgKnRtcDsKKyAgICBpbnQgZXJyOworICAgIHRtcCA9IGF2X2FzcHJpbnRmKCIlcyVzIiwgcHJlZml4LCBhcmcpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGVyciA9IGh3X2RldmljZV9pbml0X2Zyb21fc3RyaW5nKHRtcCwgJmRldik7CisgICAgYXZfZnJlZSh0bXApOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGh3X2RldmljZV9jdHggPSBhdl9idWZmZXJfcmVmKGRldi0+ZGV2aWNlX3JlZik7CisgICAgaWYgKCFod19kZXZpY2VfY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgb3B0X2luaXRfaHdfZGV2aWNlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgaWYgKCFzdHJjbXAoYXJnLCAibGlzdCIpKSB7CisgICAgICAgIGVudW0gQVZIV0RldmljZVR5cGUgdHlwZSA9IEFWX0hXREVWSUNFX1RZUEVfTk9ORTsKKyAgICAgICAgcHJpbnRmKCJTdXBwb3J0ZWQgaGFyZHdhcmUgZGV2aWNlIHR5cGVzOlxuIik7CisgICAgICAgIHdoaWxlICgodHlwZSA9IGF2X2h3ZGV2aWNlX2l0ZXJhdGVfdHlwZXModHlwZSkpICE9CisgICAgICAgICAgICAgICBBVl9IV0RFVklDRV9UWVBFX05PTkUpCisgICAgICAgICAgICBwcmludGYoIiVzXG4iLCBhdl9od2RldmljZV9nZXRfdHlwZV9uYW1lKHR5cGUpKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBleGl0X3Byb2dyYW0oMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGh3X2RldmljZV9pbml0X2Zyb21fc3RyaW5nKGFyZywgTlVMTCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9wdF9maWx0ZXJfaHdfZGV2aWNlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgaWYgKGZpbHRlcl9od19kZXZpY2UpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk9ubHkgb25lIGZpbHRlciBkZXZpY2UgY2FuIGJlIHVzZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgZmlsdGVyX2h3X2RldmljZSA9IGh3X2RldmljZV9nZXRfYnlfbmFtZShhcmcpOworICAgIGlmICghZmlsdGVyX2h3X2RldmljZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmaWx0ZXIgZGV2aWNlICVzLlxuIiwgYXJnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2UgYSBtZXRhZGF0YSBzcGVjaWZpZXIgcGFzc2VkIGFzICdhcmcnIHBhcmFtZXRlci4KKyAqIEBwYXJhbSBhcmcgIG1ldGFkYXRhIHN0cmluZyB0byBwYXJzZQorICogQHBhcmFtIHR5cGUgbWV0YWRhdGEgdHlwZSBpcyB3cml0dGVuIGhlcmUgLS0gZyhsb2JhbCkvcyh0cmVhbSkvYyhoYXB0ZXIpL3Aocm9ncmFtKQorICogQHBhcmFtIGluZGV4IGZvciB0eXBlIGMvcCwgY2hhcHRlci9wcm9ncmFtIGluZGV4IGlzIHdyaXR0ZW4gaGVyZQorICogQHBhcmFtIHN0cmVhbV9zcGVjIGZvciB0eXBlIHMsIHRoZSBzdHJlYW0gc3BlY2lmaWVyIGlzIHdyaXR0ZW4gaGVyZQorICovCitzdGF0aWMgdm9pZCBwYXJzZV9tZXRhX3R5cGUoY2hhciAqYXJnLCBjaGFyICp0eXBlLCBpbnQgKmluZGV4LCBjb25zdCBjaGFyICoqc3RyZWFtX3NwZWMpCit7CisgICAgaWYgKCphcmcpIHsKKyAgICAgICAgKnR5cGUgPSAqYXJnOworICAgICAgICBzd2l0Y2ggKCphcmcpIHsKKyAgICAgICAgY2FzZSAnZyc6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICBpZiAoKigrK2FyZykgJiYgKmFyZyAhPSAnOicpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBtZXRhZGF0YSBzcGVjaWZpZXIgJXMuXG4iLCBhcmcpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpzdHJlYW1fc3BlYyA9ICphcmcgPT0gJzonID8gYXJnICsgMSA6ICIiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgIGlmICgqKCsrYXJnKSA9PSAnOicpCisgICAgICAgICAgICAgICAgKmluZGV4ID0gc3RydG9sKCsrYXJnLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgbWV0YWRhdGEgdHlwZSAlYy5cbiIsICphcmcpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgICp0eXBlID0gJ2cnOworfQorCitzdGF0aWMgaW50IGNvcHlfbWV0YWRhdGEoY2hhciAqb3V0c3BlYywgY2hhciAqaW5zcGVjLCBBVkZvcm1hdENvbnRleHQgKm9jLCBBVkZvcm1hdENvbnRleHQgKmljLCBPcHRpb25zQ29udGV4dCAqbykKK3sKKyAgICBBVkRpY3Rpb25hcnkgKiptZXRhX2luID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnkgKiptZXRhX291dCA9IE5VTEw7CisgICAgaW50IGksIHJldCA9IDA7CisgICAgY2hhciB0eXBlX2luLCB0eXBlX291dDsKKyAgICBjb25zdCBjaGFyICppc3RyZWFtX3NwZWMgPSBOVUxMLCAqb3N0cmVhbV9zcGVjID0gTlVMTDsKKyAgICBpbnQgaWR4X2luID0gMCwgaWR4X291dCA9IDA7CisKKyAgICBwYXJzZV9tZXRhX3R5cGUoaW5zcGVjLCAgJnR5cGVfaW4sICAmaWR4X2luLCAgJmlzdHJlYW1fc3BlYyk7CisgICAgcGFyc2VfbWV0YV90eXBlKG91dHNwZWMsICZ0eXBlX291dCwgJmlkeF9vdXQsICZvc3RyZWFtX3NwZWMpOworCisgICAgaWYgKCFpYykgeworICAgICAgICBpZiAodHlwZV9vdXQgPT0gJ2cnIHx8ICEqb3V0c3BlYykKKyAgICAgICAgICAgIG8tPm1ldGFkYXRhX2dsb2JhbF9tYW51YWwgPSAxOworICAgICAgICBpZiAodHlwZV9vdXQgPT0gJ3MnIHx8ICEqb3V0c3BlYykKKyAgICAgICAgICAgIG8tPm1ldGFkYXRhX3N0cmVhbXNfbWFudWFsID0gMTsKKyAgICAgICAgaWYgKHR5cGVfb3V0ID09ICdjJyB8fCAhKm91dHNwZWMpCisgICAgICAgICAgICBvLT5tZXRhZGF0YV9jaGFwdGVyc19tYW51YWwgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAodHlwZV9pbiA9PSAnZycgfHwgdHlwZV9vdXQgPT0gJ2cnKQorICAgICAgICBvLT5tZXRhZGF0YV9nbG9iYWxfbWFudWFsID0gMTsKKyAgICBpZiAodHlwZV9pbiA9PSAncycgfHwgdHlwZV9vdXQgPT0gJ3MnKQorICAgICAgICBvLT5tZXRhZGF0YV9zdHJlYW1zX21hbnVhbCA9IDE7CisgICAgaWYgKHR5cGVfaW4gPT0gJ2MnIHx8IHR5cGVfb3V0ID09ICdjJykKKyAgICAgICAgby0+bWV0YWRhdGFfY2hhcHRlcnNfbWFudWFsID0gMTsKKworICAgIC8qIGljIGlzIE5VTEwgd2hlbiBqdXN0IGRpc2FibGluZyBhdXRvbWF0aWMgbWFwcGluZ3MgKi8KKyAgICBpZiAoIWljKQorICAgICAgICByZXR1cm4gMDsKKworI2RlZmluZSBNRVRBREFUQV9DSEVDS19JTkRFWChpbmRleCwgbmJfZWxlbXMsIGRlc2MpXAorICAgIGlmICgoaW5kZXgpIDwgMCB8fCAoaW5kZXgpID49IChuYl9lbGVtcykpIHtcCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkICVzIGluZGV4ICVkIHdoaWxlIHByb2Nlc3NpbmcgbWV0YWRhdGEgbWFwcy5cbiIsXAorICAgICAgICAgICAgICAgIChkZXNjKSwgKGluZGV4KSk7XAorICAgICAgICBleGl0X3Byb2dyYW0oMSk7XAorICAgIH0KKworI2RlZmluZSBTRVRfRElDVCh0eXBlLCBtZXRhLCBjb250ZXh0LCBpbmRleClcCisgICAgICAgIHN3aXRjaCAodHlwZSkge1wKKyAgICAgICAgY2FzZSAnZyc6XAorICAgICAgICAgICAgbWV0YSA9ICZjb250ZXh0LT5tZXRhZGF0YTtcCisgICAgICAgICAgICBicmVhaztcCisgICAgICAgIGNhc2UgJ2MnOlwKKyAgICAgICAgICAgIE1FVEFEQVRBX0NIRUNLX0lOREVYKGluZGV4LCBjb250ZXh0LT5uYl9jaGFwdGVycywgImNoYXB0ZXIiKVwKKyAgICAgICAgICAgIG1ldGEgPSAmY29udGV4dC0+Y2hhcHRlcnNbaW5kZXhdLT5tZXRhZGF0YTtcCisgICAgICAgICAgICBicmVhaztcCisgICAgICAgIGNhc2UgJ3AnOlwKKyAgICAgICAgICAgIE1FVEFEQVRBX0NIRUNLX0lOREVYKGluZGV4LCBjb250ZXh0LT5uYl9wcm9ncmFtcywgInByb2dyYW0iKVwKKyAgICAgICAgICAgIG1ldGEgPSAmY29udGV4dC0+cHJvZ3JhbXNbaW5kZXhdLT5tZXRhZGF0YTtcCisgICAgICAgICAgICBicmVhaztcCisgICAgICAgIGNhc2UgJ3MnOlwKKyAgICAgICAgICAgIGJyZWFrOyAvKiBoYW5kbGVkIHNlcGFyYXRlbHkgYmVsb3cgKi8gXAorICAgICAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApO1wKKyAgICAgICAgfVwKKworICAgIFNFVF9ESUNUKHR5cGVfaW4sIG1ldGFfaW4sIGljLCBpZHhfaW4pOworICAgIFNFVF9ESUNUKHR5cGVfb3V0LCBtZXRhX291dCwgb2MsIGlkeF9vdXQpOworCisgICAgLyogZm9yIGlucHV0IHN0cmVhbXMgY2hvb3NlIGZpcnN0IG1hdGNoaW5nIHN0cmVhbSAqLworICAgIGlmICh0eXBlX2luID09ICdzJykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgaWYgKChyZXQgPSBjaGVja19zdHJlYW1fc3BlY2lmaWVyKGljLCBpYy0+c3RyZWFtc1tpXSwgaXN0cmVhbV9zcGVjKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgbWV0YV9pbiA9ICZpYy0+c3RyZWFtc1tpXS0+bWV0YWRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgICAgIGlmICghbWV0YV9pbikgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlN0cmVhbSBzcGVjaWZpZXIgJXMgZG9lcyBub3QgbWF0Y2ggIGFueSBzdHJlYW1zLlxuIiwgaXN0cmVhbV9zcGVjKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0eXBlX291dCA9PSAncycpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9jLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gY2hlY2tfc3RyZWFtX3NwZWNpZmllcihvYywgb2MtPnN0cmVhbXNbaV0sIG9zdHJlYW1fc3BlYykpID4gMCkgeworICAgICAgICAgICAgICAgIG1ldGFfb3V0ID0gJm9jLT5zdHJlYW1zW2ldLT5tZXRhZGF0YTsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X2NvcHkobWV0YV9vdXQsICptZXRhX2luLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgYXZfZGljdF9jb3B5KG1ldGFfb3V0LCAqbWV0YV9pbiwgQVZfRElDVF9ET05UX09WRVJXUklURSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfcmVjb3JkaW5nX3RpbWVzdGFtcCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIGNoYXIgYnVmWzEyOF07CisgICAgaW50NjRfdCByZWNvcmRpbmdfdGltZXN0YW1wID0gcGFyc2VfdGltZV9vcl9kaWUob3B0LCBhcmcsIDApIC8gMUU2OworICAgIHN0cnVjdCB0bSB0aW1lID0gKmdtdGltZSgodGltZV90KikmcmVjb3JkaW5nX3RpbWVzdGFtcCk7CisgICAgaWYgKCFzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiY3JlYXRpb25fdGltZT0lWS0lbS0lZFQlSDolTTolUyV6IiwgJnRpbWUpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcGFyc2Vfb3B0aW9uKG8sICJtZXRhZGF0YSIsIGJ1Ziwgb3B0aW9ucyk7CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICIlcyBpcyBkZXByZWNhdGVkLCBzZXQgdGhlICdjcmVhdGlvbl90aW1lJyBtZXRhZGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnIGluc3RlYWQuXG4iLCBvcHQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQVZDb2RlYyAqZmluZF9jb2RlY19vcl9kaWUoY29uc3QgY2hhciAqbmFtZSwgZW51bSBBVk1lZGlhVHlwZSB0eXBlLCBpbnQgZW5jb2RlcikKK3sKKyAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqZGVzYzsKKyAgICBjb25zdCBjaGFyICpjb2RlY19zdHJpbmcgPSBlbmNvZGVyID8gImVuY29kZXIiIDogImRlY29kZXIiOworICAgIEFWQ29kZWMgKmNvZGVjOworCisgICAgY29kZWMgPSBlbmNvZGVyID8KKyAgICAgICAgYXZjb2RlY19maW5kX2VuY29kZXJfYnlfbmFtZShuYW1lKSA6CisgICAgICAgIGF2Y29kZWNfZmluZF9kZWNvZGVyX2J5X25hbWUobmFtZSk7CisKKyAgICBpZiAoIWNvZGVjICYmIChkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldF9ieV9uYW1lKG5hbWUpKSkgeworICAgICAgICBjb2RlYyA9IGVuY29kZXIgPyBhdmNvZGVjX2ZpbmRfZW5jb2RlcihkZXNjLT5pZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2ZpbmRfZGVjb2RlcihkZXNjLT5pZCk7CisgICAgICAgIGlmIChjb2RlYykKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIk1hdGNoZWQgJXMgJyVzJyBmb3IgY29kZWMgJyVzJy5cbiIsCisgICAgICAgICAgICAgICAgICAgY29kZWNfc3RyaW5nLCBjb2RlYy0+bmFtZSwgZGVzYy0+bmFtZSk7CisgICAgfQorCisgICAgaWYgKCFjb2RlYykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiVW5rbm93biAlcyAnJXMnXG4iLCBjb2RlY19zdHJpbmcsIG5hbWUpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorICAgIGlmIChjb2RlYy0+dHlwZSAhPSB0eXBlKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkICVzIHR5cGUgJyVzJ1xuIiwgY29kZWNfc3RyaW5nLCBuYW1lKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKyAgICByZXR1cm4gY29kZWM7Cit9CisKK3N0YXRpYyBBVkNvZGVjICpjaG9vc2VfZGVjb2RlcihPcHRpb25zQ29udGV4dCAqbywgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgY2hhciAqY29kZWNfbmFtZSA9IE5VTEw7CisKKyAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChjb2RlY19uYW1lcywgc3RyLCBjb2RlY19uYW1lLCBzLCBzdCk7CisgICAgaWYgKGNvZGVjX25hbWUpIHsKKyAgICAgICAgQVZDb2RlYyAqY29kZWMgPSBmaW5kX2NvZGVjX29yX2RpZShjb2RlY19uYW1lLCBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUsIDApOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gY29kZWMtPmlkOworICAgICAgICByZXR1cm4gY29kZWM7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBhdmNvZGVjX2ZpbmRfZGVjb2RlcihzdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKK30KKworLyogQWRkIGFsbCB0aGUgc3RyZWFtcyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBmaWxlIHRvIHRoZSBnbG9iYWwKKyAqIGxpc3Qgb2YgaW5wdXQgc3RyZWFtcy4gKi8KK3N0YXRpYyB2b2lkIGFkZF9pbnB1dF9zdHJlYW1zKE9wdGlvbnNDb250ZXh0ICpvLCBBVkZvcm1hdENvbnRleHQgKmljKQoreworICAgIGludCBpLCByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBpYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKKyAgICAgICAgSW5wdXRTdHJlYW0gKmlzdCA9IGF2X21hbGxvY3ooc2l6ZW9mKCppc3QpKTsKKyAgICAgICAgY2hhciAqZnJhbWVyYXRlID0gTlVMTCwgKmh3YWNjZWxfZGV2aWNlID0gTlVMTDsKKyAgICAgICAgY29uc3QgY2hhciAqaHdhY2NlbCA9IE5VTEw7CisgICAgICAgIGNoYXIgKmh3YWNjZWxfb3V0cHV0X2Zvcm1hdCA9IE5VTEw7CisgICAgICAgIGNoYXIgKmNvZGVjX3RhZyA9IE5VTEw7CisgICAgICAgIGNoYXIgKm5leHQ7CisgICAgICAgIGNoYXIgKmRpc2NhcmRfc3RyID0gTlVMTDsKKyAgICAgICAgY29uc3QgQVZDbGFzcyAqY2MgPSBhdmNvZGVjX2dldF9jbGFzcygpOworICAgICAgICBjb25zdCBBVk9wdGlvbiAqZGlzY2FyZF9vcHQgPSBhdl9vcHRfZmluZCgmY2MsICJza2lwX2ZyYW1lIiwgTlVMTCwgMCwgMCk7CisKKyAgICAgICAgaWYgKCFpc3QpCisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisKKyAgICAgICAgR1JPV19BUlJBWShpbnB1dF9zdHJlYW1zLCBuYl9pbnB1dF9zdHJlYW1zKTsKKyAgICAgICAgaW5wdXRfc3RyZWFtc1tuYl9pbnB1dF9zdHJlYW1zIC0gMV0gPSBpc3Q7CisKKyAgICAgICAgaXN0LT5zdCA9IHN0OworICAgICAgICBpc3QtPmZpbGVfaW5kZXggPSBuYl9pbnB1dF9maWxlczsKKyAgICAgICAgaXN0LT5kaXNjYXJkID0gMTsKKyAgICAgICAgc3QtPmRpc2NhcmQgID0gQVZESVNDQVJEX0FMTDsKKyAgICAgICAgaXN0LT5uYl9zYW1wbGVzID0gMDsKKyAgICAgICAgaXN0LT5taW5fcHRzID0gSU5UNjRfTUFYOworICAgICAgICBpc3QtPm1heF9wdHMgPSBJTlQ2NF9NSU47CisKKyAgICAgICAgaXN0LT50c19zY2FsZSA9IDEuMDsKKyAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQodHNfc2NhbGUsIGRibCwgaXN0LT50c19zY2FsZSwgaWMsIHN0KTsKKworICAgICAgICBpc3QtPmF1dG9yb3RhdGUgPSAxOworICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChhdXRvcm90YXRlLCBpLCBpc3QtPmF1dG9yb3RhdGUsIGljLCBzdCk7CisKKyAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoY29kZWNfdGFncywgc3RyLCBjb2RlY190YWcsIGljLCBzdCk7CisgICAgICAgIGlmIChjb2RlY190YWcpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRhZyA9IHN0cnRvbChjb2RlY190YWcsICZuZXh0LCAwKTsKKyAgICAgICAgICAgIGlmICgqbmV4dCkKKyAgICAgICAgICAgICAgICB0YWcgPSBBVl9STDMyKGNvZGVjX3RhZyk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IHRhZzsKKyAgICAgICAgfQorCisgICAgICAgIGlzdC0+ZGVjID0gY2hvb3NlX2RlY29kZXIobywgaWMsIHN0KTsKKyAgICAgICAgaXN0LT5kZWNvZGVyX29wdHMgPSBmaWx0ZXJfY29kZWNfb3B0cyhvLT5nLT5jb2RlY19vcHRzLCBpc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQsIGljLCBzdCwgaXN0LT5kZWMpOworCisgICAgICAgIGlzdC0+cmVpbml0X2ZpbHRlcnMgPSAtMTsKKyAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQocmVpbml0X2ZpbHRlcnMsIGksIGlzdC0+cmVpbml0X2ZpbHRlcnMsIGljLCBzdCk7CisKKyAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZGlzY2FyZCwgc3RyLCBkaXNjYXJkX3N0ciwgaWMsIHN0KTsKKyAgICAgICAgaXN0LT51c2VyX3NldF9kaXNjYXJkID0gQVZESVNDQVJEX05PTkU7CisgICAgICAgIGlmIChkaXNjYXJkX3N0ciAmJiBhdl9vcHRfZXZhbF9pbnQoJmNjLCBkaXNjYXJkX29wdCwgZGlzY2FyZF9zdHIsICZpc3QtPnVzZXJfc2V0X2Rpc2NhcmQpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgZGlzY2FyZCAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgIGRpc2NhcmRfc3RyKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlzdC0+ZmlsdGVyX2luX3Jlc2NhbGVfZGVsdGFfbGFzdCA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgICAgIGlzdC0+ZGVjX2N0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoaXN0LT5kZWMpOworICAgICAgICBpZiAoIWlzdC0+ZGVjX2N0eCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGhlIGRlY29kZXIgY29udGV4dC5cbiIpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoaXN0LT5kZWNfY3R4LCBwYXIpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyB0aGUgZGVjb2RlciBjb250ZXh0LlxuIik7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoby0+Yml0ZXhhY3QpCisgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmZsYWdzIHw9IEFWX0NPREVDX0ZMQUdfQklURVhBQ1Q7CisKKyAgICAgICAgc3dpdGNoIChwYXItPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICBpZighaXN0LT5kZWMpCisgICAgICAgICAgICAgICAgaXN0LT5kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihwYXItPmNvZGVjX2lkKTsKKyNpZiBGRl9BUElfTE9XUkVTCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5sb3dyZXMpIHsKKyAgICAgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmxvd3JlcyA9IHN0LT5jb2RlYy0+bG93cmVzOworICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+d2lkdGggID0gc3QtPmNvZGVjLT53aWR0aDsKKyAgICAgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmhlaWdodCA9IHN0LT5jb2RlYy0+aGVpZ2h0OworICAgICAgICAgICAgICAgIGlzdC0+ZGVjX2N0eC0+Y29kZWRfd2lkdGggID0gc3QtPmNvZGVjLT5jb2RlZF93aWR0aDsKKyAgICAgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmNvZGVkX2hlaWdodCA9IHN0LT5jb2RlYy0+Y29kZWRfaGVpZ2h0OworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIC8vIGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oKSBkb2Vzbid0IHNldCB0aGlzIGZvciB1cyBhbnltb3JlLgorICAgICAgICAgICAgaXN0LT5kZWNfY3R4LT5mcmFtZXJhdGUgPSBzdC0+YXZnX2ZyYW1lX3JhdGU7CisKKyAgICAgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGZyYW1lX3JhdGVzLCBzdHIsIGZyYW1lcmF0ZSwgaWMsIHN0KTsKKyAgICAgICAgICAgIGlmIChmcmFtZXJhdGUgJiYgYXZfcGFyc2VfdmlkZW9fcmF0ZSgmaXN0LT5mcmFtZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVyYXRlKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyBmcmFtZXJhdGUgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXJhdGUpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaXN0LT50b3BfZmllbGRfZmlyc3QgPSAtMTsKKyAgICAgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHRvcF9maWVsZF9maXJzdCwgaSwgaXN0LT50b3BfZmllbGRfZmlyc3QsIGljLCBzdCk7CisKKyAgICAgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGh3YWNjZWxzLCBzdHIsIGh3YWNjZWwsIGljLCBzdCk7CisgICAgICAgICAgICBpZiAoaHdhY2NlbCkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBOVkRFQyBod2FjY2VscyB1c2UgYSBDVURBIGRldmljZSwgc28gcmVtYXAgdGhlIG5hbWUgaGVyZS4KKyAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChod2FjY2VsLCAibnZkZWMiKSkKKyAgICAgICAgICAgICAgICAgICAgaHdhY2NlbCA9ICJjdWRhIjsKKworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGh3YWNjZWwsICJub25lIikpCisgICAgICAgICAgICAgICAgICAgIGlzdC0+aHdhY2NlbF9pZCA9IEhXQUNDRUxfTk9ORTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGh3YWNjZWwsICJhdXRvIikpCisgICAgICAgICAgICAgICAgICAgIGlzdC0+aHdhY2NlbF9pZCA9IEhXQUNDRUxfQVVUTzsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZW51bSBBVkhXRGV2aWNlVHlwZSB0eXBlOworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaHdhY2NlbHNbaV0ubmFtZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChod2FjY2Vsc1tpXS5uYW1lLCBod2FjY2VsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+aHdhY2NlbF9pZCA9IGh3YWNjZWxzW2ldLmlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3QtPmh3YWNjZWxfaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBhdl9od2RldmljZV9maW5kX3R5cGVfYnlfbmFtZShod2FjY2VsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IEFWX0hXREVWSUNFX1RZUEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+aHdhY2NlbF9pZCA9IEhXQUNDRUxfR0VORVJJQzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc3QtPmh3YWNjZWxfZGV2aWNlX3R5cGUgPSB0eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc3QtPmh3YWNjZWxfaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbnJlY29nbml6ZWQgaHdhY2NlbDogJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3YWNjZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlN1cHBvcnRlZCBod2FjY2VsczogIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gQVZfSFdERVZJQ0VfVFlQRV9OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh0eXBlID0gYXZfaHdkZXZpY2VfaXRlcmF0ZV90eXBlcyh0eXBlKSkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9IV0RFVklDRV9UWVBFX05PTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIiVzICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2h3ZGV2aWNlX2dldF90eXBlX25hbWUodHlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaHdhY2NlbHNbaV0ubmFtZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlcyAiLCBod2FjY2Vsc1tpXS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChod2FjY2VsX2RldmljZXMsIHN0ciwgaHdhY2NlbF9kZXZpY2UsIGljLCBzdCk7CisgICAgICAgICAgICBpZiAoaHdhY2NlbF9kZXZpY2UpIHsKKyAgICAgICAgICAgICAgICBpc3QtPmh3YWNjZWxfZGV2aWNlID0gYXZfc3RyZHVwKGh3YWNjZWxfZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzdC0+aHdhY2NlbF9kZXZpY2UpCisgICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoaHdhY2NlbF9vdXRwdXRfZm9ybWF0cywgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhY2NlbF9vdXRwdXRfZm9ybWF0LCBpYywgc3QpOworICAgICAgICAgICAgaWYgKGh3YWNjZWxfb3V0cHV0X2Zvcm1hdCkgeworICAgICAgICAgICAgICAgIGlzdC0+aHdhY2NlbF9vdXRwdXRfZm9ybWF0ID0gYXZfZ2V0X3BpeF9mbXQoaHdhY2NlbF9vdXRwdXRfZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpZiAoaXN0LT5od2FjY2VsX291dHB1dF9mb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbnJlY29nbmlzZWQgaHdhY2NlbCBvdXRwdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdDogJXMiLCBod2FjY2VsX291dHB1dF9mb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXN0LT5od2FjY2VsX291dHB1dF9mb3JtYXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlzdC0+aHdhY2NlbF9waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICBpc3QtPmd1ZXNzX2xheW91dF9tYXggPSBJTlRfTUFYOworICAgICAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZ3Vlc3NfbGF5b3V0X21heCwgaSwgaXN0LT5ndWVzc19sYXlvdXRfbWF4LCBpYywgc3QpOworICAgICAgICAgICAgZ3Vlc3NfaW5wdXRfY2hhbm5lbF9sYXlvdXQoaXN0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgorICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRTogeworICAgICAgICAgICAgY2hhciAqY2FudmFzX3NpemUgPSBOVUxMOworICAgICAgICAgICAgaWYoIWlzdC0+ZGVjKQorICAgICAgICAgICAgICAgIGlzdC0+ZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIocGFyLT5jb2RlY19pZCk7CisgICAgICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmaXhfc3ViX2R1cmF0aW9uLCBpLCBpc3QtPmZpeF9zdWJfZHVyYXRpb24sIGljLCBzdCk7CisgICAgICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChjYW52YXNfc2l6ZXMsIHN0ciwgY2FudmFzX3NpemUsIGljLCBzdCk7CisgICAgICAgICAgICBpZiAoY2FudmFzX3NpemUgJiYKKyAgICAgICAgICAgICAgICBhdl9wYXJzZV92aWRlb19zaXplKCZpc3QtPmRlY19jdHgtPndpZHRoLCAmaXN0LT5kZWNfY3R4LT5oZWlnaHQsIGNhbnZhc19zaXplKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBjYW52YXMgc2l6ZTogJXMuXG4iLCBjYW52YXNfc2l6ZSk7CisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVDoKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVU5LTk9XTjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQocGFyLCBpc3QtPmRlY19jdHgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyB0aGUgZGVjb2RlciBjb250ZXh0LlxuIik7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFzc2VydF9maWxlX292ZXJ3cml0ZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBpZiAoZmlsZV9vdmVyd3JpdGUgJiYgbm9fZmlsZV9vdmVyd3JpdGUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciwgYm90aCAteSBhbmQgLW4gc3VwcGxpZWQuIEV4aXRpbmcuXG4iKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGlmICghZmlsZV9vdmVyd3JpdGUpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcHJvdG9fbmFtZSA9IGF2aW9fZmluZF9wcm90b2NvbF9uYW1lKGZpbGVuYW1lKTsKKyAgICAgICAgaWYgKHByb3RvX25hbWUgJiYgIXN0cmNtcChwcm90b19uYW1lLCAiZmlsZSIpICYmIGF2aW9fY2hlY2soZmlsZW5hbWUsIDApID09IDApIHsKKyAgICAgICAgICAgIGlmIChzdGRpbl9pbnRlcmFjdGlvbiAmJiAhbm9fZmlsZV9vdmVyd3JpdGUpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRmlsZSAnJXMnIGFscmVhZHkgZXhpc3RzLiBPdmVyd3JpdGUgPyBbeS9OXSAiLCBmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGVycik7CisgICAgICAgICAgICAgICAgdGVybV9leGl0KCk7CisgICAgICAgICAgICAgICAgc2lnbmFsKFNJR0lOVCwgU0lHX0RGTCk7CisgICAgICAgICAgICAgICAgaWYgKCFyZWFkX3llc25vKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIk5vdCBvdmVyd3JpdGluZyAtIGV4aXRpbmdcbiIpOworICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlcm1faW5pdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkZpbGUgJyVzJyBhbHJlYWR5IGV4aXN0cy4gRXhpdGluZy5cbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfYXR0YWNobWVudChBVlN0cmVhbSAqc3QsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIGludCByZXQ7CisgICAgQVZJT0NvbnRleHQgKm91dCA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7CisKKyAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiTm8gZXh0cmFkYXRhIHRvIGR1bXAgaW4gc3RyZWFtICMlZDolZC5cbiIsCisgICAgICAgICAgICAgICBuYl9pbnB1dF9maWxlcyAtIDEsIHN0LT5pbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCEqZmlsZW5hbWUgJiYgKGUgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJmaWxlbmFtZSIsIE5VTEwsIDApKSkKKyAgICAgICAgZmlsZW5hbWUgPSBlLT52YWx1ZTsKKyAgICBpZiAoISpmaWxlbmFtZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiTm8gZmlsZW5hbWUgc3BlY2lmaWVkIGFuZCBubyAnZmlsZW5hbWUnIHRhZyIKKyAgICAgICAgICAgICAgICJpbiBzdHJlYW0gIyVkOiVkLlxuIiwgbmJfaW5wdXRfZmlsZXMgLSAxLCBzdC0+aW5kZXgpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgYXNzZXJ0X2ZpbGVfb3ZlcndyaXRlKGZpbGVuYW1lKTsKKworICAgIGlmICgocmV0ID0gYXZpb19vcGVuMigmb3V0LCBmaWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFLCAmaW50X2NiLCBOVUxMKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIGZvciB3cml0aW5nLlxuIiwKKyAgICAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGF2aW9fd3JpdGUob3V0LCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgYXZpb19mbHVzaChvdXQpOworICAgIGF2aW9fY2xvc2Uob3V0KTsKK30KKworc3RhdGljIGludCBvcGVuX2lucHV0X2ZpbGUoT3B0aW9uc0NvbnRleHQgKm8sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIElucHV0RmlsZSAqZjsKKyAgICBBVkZvcm1hdENvbnRleHQgKmljOworICAgIEFWSW5wdXRGb3JtYXQgKmZpbGVfaWZvcm1hdCA9IE5VTEw7CisgICAgaW50IGVyciwgaSwgcmV0OworICAgIGludDY0X3QgdGltZXN0YW1wOworICAgIEFWRGljdGlvbmFyeSAqdW51c2VkX29wdHMgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICplID0gTlVMTDsKKyAgICBjaGFyICogICB2aWRlb19jb2RlY19uYW1lID0gTlVMTDsKKyAgICBjaGFyICogICBhdWRpb19jb2RlY19uYW1lID0gTlVMTDsKKyAgICBjaGFyICpzdWJ0aXRsZV9jb2RlY19uYW1lID0gTlVMTDsKKyAgICBjaGFyICogICAgZGF0YV9jb2RlY19uYW1lID0gTlVMTDsKKyAgICBpbnQgc2Nhbl9hbGxfcG10c19zZXQgPSAwOworCisgICAgaWYgKG8tPnN0b3BfdGltZSAhPSBJTlQ2NF9NQVggJiYgby0+cmVjb3JkaW5nX3RpbWUgIT0gSU5UNjRfTUFYKSB7CisgICAgICAgIG8tPnN0b3BfdGltZSA9IElOVDY0X01BWDsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiLXQgYW5kIC10byBjYW5ub3QgYmUgdXNlZCB0b2dldGhlcjsgdXNpbmcgLXQuXG4iKTsKKyAgICB9CisKKyAgICBpZiAoby0+c3RvcF90aW1lICE9IElOVDY0X01BWCAmJiBvLT5yZWNvcmRpbmdfdGltZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgaW50NjRfdCBzdGFydF90aW1lID0gby0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSA/IDAgOiBvLT5zdGFydF90aW1lOworICAgICAgICBpZiAoby0+c3RvcF90aW1lIDw9IHN0YXJ0X3RpbWUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICItdG8gdmFsdWUgc21hbGxlciB0aGFuIC1zczsgYWJvcnRpbmcuXG4iKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG8tPnJlY29yZGluZ190aW1lID0gby0+c3RvcF90aW1lIC0gc3RhcnRfdGltZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvLT5mb3JtYXQpIHsKKyAgICAgICAgaWYgKCEoZmlsZV9pZm9ybWF0ID0gYXZfZmluZF9pbnB1dF9mb3JtYXQoby0+Zm9ybWF0KSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbmtub3duIGlucHV0IGZvcm1hdDogJyVzJ1xuIiwgby0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc3RyY21wKGZpbGVuYW1lLCAiLSIpKQorICAgICAgICBmaWxlbmFtZSA9ICJwaXBlOiI7CisKKyAgICBzdGRpbl9pbnRlcmFjdGlvbiAmPSBzdHJuY21wKGZpbGVuYW1lLCAicGlwZToiLCA1KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChmaWxlbmFtZSwgIi9kZXYvc3RkaW4iKTsKKworICAgIC8qIGdldCBkZWZhdWx0IHBhcmFtZXRlcnMgZnJvbSBjb21tYW5kIGxpbmUgKi8KKyAgICBpYyA9IGF2Zm9ybWF0X2FsbG9jX2NvbnRleHQoKTsKKyAgICBpZiAoIWljKSB7CisgICAgICAgIHByaW50X2Vycm9yKGZpbGVuYW1lLCBBVkVSUk9SKEVOT01FTSkpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorICAgIGlmIChvLT5uYl9hdWRpb19zYW1wbGVfcmF0ZSkgeworICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm8tPmctPmZvcm1hdF9vcHRzLCAic2FtcGxlX3JhdGUiLCBvLT5hdWRpb19zYW1wbGVfcmF0ZVtvLT5uYl9hdWRpb19zYW1wbGVfcmF0ZSAtIDFdLnUuaSwgMCk7CisgICAgfQorICAgIGlmIChvLT5uYl9hdWRpb19jaGFubmVscykgeworICAgICAgICAvKiBiZWNhdXNlIHdlIHNldCBhdWRpb19jaGFubmVscyBiYXNlZCBvbiBib3RoIHRoZSAiYWMiIGFuZAorICAgICAgICAgKiAiY2hhbm5lbF9sYXlvdXQiIG9wdGlvbnMsIHdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqIGRlbXV4ZXIgYWN0dWFsbHkgaGFzIHRoZSAiY2hhbm5lbHMiIG9wdGlvbiBiZWZvcmUgc2V0dGluZyBpdCAqLworICAgICAgICBpZiAoZmlsZV9pZm9ybWF0ICYmIGZpbGVfaWZvcm1hdC0+cHJpdl9jbGFzcyAmJgorICAgICAgICAgICAgYXZfb3B0X2ZpbmQoJmZpbGVfaWZvcm1hdC0+cHJpdl9jbGFzcywgImNoYW5uZWxzIiwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSB7CisgICAgICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm8tPmctPmZvcm1hdF9vcHRzLCAiY2hhbm5lbHMiLCBvLT5hdWRpb19jaGFubmVsc1tvLT5uYl9hdWRpb19jaGFubmVscyAtIDFdLnUuaSwgMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG8tPm5iX2ZyYW1lX3JhdGVzKSB7CisgICAgICAgIC8qIHNldCB0aGUgZm9ybWF0LWxldmVsIGZyYW1lcmF0ZSBvcHRpb247CisgICAgICAgICAqIHRoaXMgaXMgaW1wb3J0YW50IGZvciB2aWRlbyBncmFiYmVycywgZS5nLiB4MTEgKi8KKyAgICAgICAgaWYgKGZpbGVfaWZvcm1hdCAmJiBmaWxlX2lmb3JtYXQtPnByaXZfY2xhc3MgJiYKKyAgICAgICAgICAgIGF2X29wdF9maW5kKCZmaWxlX2lmb3JtYXQtPnByaXZfY2xhc3MsICJmcmFtZXJhdGUiLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1NFQVJDSF9GQUtFX09CSikpIHsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvLT5nLT5mb3JtYXRfb3B0cywgImZyYW1lcmF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBvLT5mcmFtZV9yYXRlc1tvLT5uYl9mcmFtZV9yYXRlcyAtIDFdLnUuc3RyLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoby0+bmJfZnJhbWVfc2l6ZXMpIHsKKyAgICAgICAgYXZfZGljdF9zZXQoJm8tPmctPmZvcm1hdF9vcHRzLCAidmlkZW9fc2l6ZSIsIG8tPmZyYW1lX3NpemVzW28tPm5iX2ZyYW1lX3NpemVzIC0gMV0udS5zdHIsIDApOworICAgIH0KKyAgICBpZiAoby0+bmJfZnJhbWVfcGl4X2ZtdHMpCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvLT5nLT5mb3JtYXRfb3B0cywgInBpeGVsX2Zvcm1hdCIsIG8tPmZyYW1lX3BpeF9mbXRzW28tPm5iX2ZyYW1lX3BpeF9mbXRzIC0gMV0udS5zdHIsIDApOworCisgICAgTUFUQ0hfUEVSX1RZUEVfT1BUKGNvZGVjX25hbWVzLCBzdHIsICAgIHZpZGVvX2NvZGVjX25hbWUsIGljLCAidiIpOworICAgIE1BVENIX1BFUl9UWVBFX09QVChjb2RlY19uYW1lcywgc3RyLCAgICBhdWRpb19jb2RlY19uYW1lLCBpYywgImEiKTsKKyAgICBNQVRDSF9QRVJfVFlQRV9PUFQoY29kZWNfbmFtZXMsIHN0ciwgc3VidGl0bGVfY29kZWNfbmFtZSwgaWMsICJzIik7CisgICAgTUFUQ0hfUEVSX1RZUEVfT1BUKGNvZGVjX25hbWVzLCBzdHIsICAgICBkYXRhX2NvZGVjX25hbWUsIGljLCAiZCIpOworCisgICAgaWYgKHZpZGVvX2NvZGVjX25hbWUpCisgICAgICAgIGljLT52aWRlb19jb2RlYyAgICA9IGZpbmRfY29kZWNfb3JfZGllKHZpZGVvX2NvZGVjX25hbWUgICAsIEFWTUVESUFfVFlQRV9WSURFTyAgICwgMCk7CisgICAgaWYgKGF1ZGlvX2NvZGVjX25hbWUpCisgICAgICAgIGljLT5hdWRpb19jb2RlYyAgICA9IGZpbmRfY29kZWNfb3JfZGllKGF1ZGlvX2NvZGVjX25hbWUgICAsIEFWTUVESUFfVFlQRV9BVURJTyAgICwgMCk7CisgICAgaWYgKHN1YnRpdGxlX2NvZGVjX25hbWUpCisgICAgICAgIGljLT5zdWJ0aXRsZV9jb2RlYyA9IGZpbmRfY29kZWNfb3JfZGllKHN1YnRpdGxlX2NvZGVjX25hbWUsIEFWTUVESUFfVFlQRV9TVUJUSVRMRSwgMCk7CisgICAgaWYgKGRhdGFfY29kZWNfbmFtZSkKKyAgICAgICAgaWMtPmRhdGFfY29kZWMgICAgID0gZmluZF9jb2RlY19vcl9kaWUoZGF0YV9jb2RlY19uYW1lICAgICwgQVZNRURJQV9UWVBFX0RBVEEgICAgLCAwKTsKKworICAgIGljLT52aWRlb19jb2RlY19pZCAgICAgPSB2aWRlb19jb2RlY19uYW1lICAgID8gaWMtPnZpZGVvX2NvZGVjLT5pZCAgICA6IEFWX0NPREVDX0lEX05PTkU7CisgICAgaWMtPmF1ZGlvX2NvZGVjX2lkICAgICA9IGF1ZGlvX2NvZGVjX25hbWUgICAgPyBpYy0+YXVkaW9fY29kZWMtPmlkICAgIDogQVZfQ09ERUNfSURfTk9ORTsKKyAgICBpYy0+c3VidGl0bGVfY29kZWNfaWQgID0gc3VidGl0bGVfY29kZWNfbmFtZSA/IGljLT5zdWJ0aXRsZV9jb2RlYy0+aWQgOiBBVl9DT0RFQ19JRF9OT05FOworICAgIGljLT5kYXRhX2NvZGVjX2lkICAgICAgPSBkYXRhX2NvZGVjX25hbWUgICAgID8gaWMtPmRhdGFfY29kZWMtPmlkICAgICA6IEFWX0NPREVDX0lEX05PTkU7CisKKyAgICBpYy0+ZmxhZ3MgfD0gQVZGTVRfRkxBR19OT05CTE9DSzsKKyAgICBpZiAoby0+Yml0ZXhhY3QpCisgICAgICAgIGljLT5mbGFncyB8PSBBVkZNVF9GTEFHX0JJVEVYQUNUOworICAgIGljLT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSBpbnRfY2I7CisKKyAgICBpZiAoIWF2X2RpY3RfZ2V0KG8tPmctPmZvcm1hdF9vcHRzLCAic2Nhbl9hbGxfcG10cyIsIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSkpIHsKKyAgICAgICAgYXZfZGljdF9zZXQoJm8tPmctPmZvcm1hdF9vcHRzLCAic2Nhbl9hbGxfcG10cyIsICIxIiwgQVZfRElDVF9ET05UX09WRVJXUklURSk7CisgICAgICAgIHNjYW5fYWxsX3BtdHNfc2V0ID0gMTsKKyAgICB9CisgICAgLyogb3BlbiB0aGUgaW5wdXQgZmlsZSB3aXRoIGdlbmVyaWMgYXZmb3JtYXQgZnVuY3Rpb24gKi8KKyAgICBlcnIgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZpYywgZmlsZW5hbWUsIGZpbGVfaWZvcm1hdCwgJm8tPmctPmZvcm1hdF9vcHRzKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBwcmludF9lcnJvcihmaWxlbmFtZSwgZXJyKTsKKyAgICAgICAgaWYgKGVyciA9PSBBVkVSUk9SX1BST1RPQ09MX05PVF9GT1VORCkKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJEaWQgeW91IG1lYW4gZmlsZTolcz9cbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKyAgICBpZiAoc2Nhbl9hbGxfcG10c19zZXQpCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvLT5nLT5mb3JtYXRfb3B0cywgInNjYW5fYWxsX3BtdHMiLCBOVUxMLCBBVl9ESUNUX01BVENIX0NBU0UpOworICAgIHJlbW92ZV9hdm9wdGlvbnMoJm8tPmctPmZvcm1hdF9vcHRzLCBvLT5nLT5jb2RlY19vcHRzKTsKKyAgICBhc3NlcnRfYXZvcHRpb25zKG8tPmctPmZvcm1hdF9vcHRzKTsKKworICAgIC8qIGFwcGx5IGZvcmNlZCBjb2RlYyBpZHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgY2hvb3NlX2RlY29kZXIobywgaWMsIGljLT5zdHJlYW1zW2ldKTsKKworICAgIGlmIChmaW5kX3N0cmVhbV9pbmZvKSB7CisgICAgICAgIEFWRGljdGlvbmFyeSAqKm9wdHMgPSBzZXR1cF9maW5kX3N0cmVhbV9pbmZvX29wdHMoaWMsIG8tPmctPmNvZGVjX29wdHMpOworICAgICAgICBpbnQgb3JpZ19uYl9zdHJlYW1zID0gaWMtPm5iX3N0cmVhbXM7CisKKyAgICAgICAgLyogSWYgbm90IGVub3VnaCBpbmZvIHRvIGdldCB0aGUgc3RyZWFtIHBhcmFtZXRlcnMsIHdlIGRlY29kZSB0aGUKKyAgICAgICAgICAgZmlyc3QgZnJhbWVzIHRvIGdldCBpdC4gKHVzZWQgaW4gbXBlZyBjYXNlIGZvciBleGFtcGxlKSAqLworICAgICAgICByZXQgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGljLCBvcHRzKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JpZ19uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHNbaV0pOworICAgICAgICBhdl9mcmVlcCgmb3B0cyk7CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlczogY291bGQgbm90IGZpbmQgY29kZWMgcGFyYW1ldGVyc1xuIiwgZmlsZW5hbWUpOworICAgICAgICAgICAgaWYgKGljLT5uYl9zdHJlYW1zID09IDApIHsKKyAgICAgICAgICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmaWMpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvLT5zdGFydF90aW1lX2VvZiAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpZiAoaWMtPmR1cmF0aW9uPjApIHsKKyAgICAgICAgICAgIG8tPnN0YXJ0X3RpbWUgPSBvLT5zdGFydF90aW1lX2VvZiArIGljLT5kdXJhdGlvbjsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJDYW5ub3QgdXNlIC1zc2VvZiwgZHVyYXRpb24gb2YgJXMgbm90IGtub3duXG4iLCBmaWxlbmFtZSk7CisgICAgfQorICAgIHRpbWVzdGFtcCA9IChvLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSA/IDAgOiBvLT5zdGFydF90aW1lOworICAgIC8qIGFkZCB0aGUgc3RyZWFtIHN0YXJ0IHRpbWUgKi8KKyAgICBpZiAoIW8tPnNlZWtfdGltZXN0YW1wICYmIGljLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICB0aW1lc3RhbXAgKz0gaWMtPnN0YXJ0X3RpbWU7CisKKyAgICAvKiBpZiBzZWVraW5nIHJlcXVlc3RlZCwgd2UgZXhlY3V0ZSBpdCAqLworICAgIGlmIChvLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGludDY0X3Qgc2Vla190aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICAgICAgaWYgKCEoaWMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfU0VFS19UT19QVFMpKSB7CisgICAgICAgICAgICBpbnQgZHRzX2hldXJpc3RpYyA9IDA7CisgICAgICAgICAgICBmb3IgKGk9MDsgaTxpYy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IGljLT5zdHJlYW1zW2ldLT5jb2RlY3BhcjsKKyAgICAgICAgICAgICAgICBpZiAocGFyLT52aWRlb19kZWxheSkKKyAgICAgICAgICAgICAgICAgICAgZHRzX2hldXJpc3RpYyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZHRzX2hldXJpc3RpYykgeworICAgICAgICAgICAgICAgIHNlZWtfdGltZXN0YW1wIC09IDMqQVZfVElNRV9CQVNFIC8gMjM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gYXZmb3JtYXRfc2Vla19maWxlKGljLCAtMSwgSU5UNjRfTUlOLCBzZWVrX3RpbWVzdGFtcCwgc2Vla190aW1lc3RhbXAsIDApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiJXM6IGNvdWxkIG5vdCBzZWVrIHRvIHBvc2l0aW9uICUwLjNmXG4iLAorICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCAoZG91YmxlKXRpbWVzdGFtcCAvIEFWX1RJTUVfQkFTRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1cGRhdGUgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyBzbyB0aGF0IHRoZXkgbWF0Y2ggdGhlIG9uZSBvZiB0aGUgaW5wdXQgc3RyZWFtICovCisgICAgYWRkX2lucHV0X3N0cmVhbXMobywgaWMpOworCisgICAgLyogZHVtcCB0aGUgZmlsZSBjb250ZW50ICovCisgICAgYXZfZHVtcF9mb3JtYXQoaWMsIG5iX2lucHV0X2ZpbGVzLCBmaWxlbmFtZSwgMCk7CisKKyAgICBHUk9XX0FSUkFZKGlucHV0X2ZpbGVzLCBuYl9pbnB1dF9maWxlcyk7CisgICAgZiA9IGF2X21hbGxvY3ooc2l6ZW9mKCpmKSk7CisgICAgaWYgKCFmKQorICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgaW5wdXRfZmlsZXNbbmJfaW5wdXRfZmlsZXMgLSAxXSA9IGY7CisKKyAgICBmLT5jdHggICAgICAgID0gaWM7CisgICAgZi0+aXN0X2luZGV4ICA9IG5iX2lucHV0X3N0cmVhbXMgLSBpYy0+bmJfc3RyZWFtczsKKyAgICBmLT5zdGFydF90aW1lID0gby0+c3RhcnRfdGltZTsKKyAgICBmLT5yZWNvcmRpbmdfdGltZSA9IG8tPnJlY29yZGluZ190aW1lOworICAgIGYtPmlucHV0X3RzX29mZnNldCA9IG8tPmlucHV0X3RzX29mZnNldDsKKyAgICBmLT50c19vZmZzZXQgID0gby0+aW5wdXRfdHNfb2Zmc2V0IC0gKGNvcHlfdHMgPyAoc3RhcnRfYXRfemVybyAmJiBpYy0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSA/IGljLT5zdGFydF90aW1lIDogMCkgOiB0aW1lc3RhbXApOworICAgIGYtPm5iX3N0cmVhbXMgPSBpYy0+bmJfc3RyZWFtczsKKyAgICBmLT5yYXRlX2VtdSAgID0gby0+cmF0ZV9lbXU7CisgICAgZi0+YWNjdXJhdGVfc2VlayA9IG8tPmFjY3VyYXRlX3NlZWs7CisgICAgZi0+bG9vcCA9IG8tPmxvb3A7CisgICAgZi0+ZHVyYXRpb24gPSAwOworICAgIGYtPnRpbWVfYmFzZSA9IChBVlJhdGlvbmFsKXsgMSwgMSB9OworI2lmIEhBVkVfVEhSRUFEUworICAgIGYtPnRocmVhZF9xdWV1ZV9zaXplID0gby0+dGhyZWFkX3F1ZXVlX3NpemUgPiAwID8gby0+dGhyZWFkX3F1ZXVlX3NpemUgOiA4OworI2VuZGlmCisKKyAgICAvKiBjaGVjayBpZiBhbGwgY29kZWMgb3B0aW9ucyBoYXZlIGJlZW4gdXNlZCAqLworICAgIHVudXNlZF9vcHRzID0gc3RyaXBfc3BlY2lmaWVycyhvLT5nLT5jb2RlY19vcHRzKTsKKyAgICBmb3IgKGkgPSBmLT5pc3RfaW5kZXg7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgZSA9IE5VTEw7CisgICAgICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGlucHV0X3N0cmVhbXNbaV0tPmRlY29kZXJfb3B0cywgIiIsIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJnVudXNlZF9vcHRzLCBlLT5rZXksIE5VTEwsIDApOworICAgIH0KKworICAgIGUgPSBOVUxMOworICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KHVudXNlZF9vcHRzLCAiIiwgZSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3MgPSBhdmNvZGVjX2dldF9jbGFzcygpOworICAgICAgICBjb25zdCBBVk9wdGlvbiAqb3B0aW9uID0gYXZfb3B0X2ZpbmQoJmNsYXNzLCBlLT5rZXksIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfU0VBUkNIX0NISUxEUkVOIHwgQVZfT1BUX1NFQVJDSF9GQUtFX09CSik7CisgICAgICAgIGNvbnN0IEFWQ2xhc3MgKmZjbGFzcyA9IGF2Zm9ybWF0X2dldF9jbGFzcygpOworICAgICAgICBjb25zdCBBVk9wdGlvbiAqZm9wdGlvbiA9IGF2X29wdF9maW5kKCZmY2xhc3MsIGUtPmtleSwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4gfCBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKTsKKyAgICAgICAgaWYgKCFvcHRpb24gfHwgZm9wdGlvbikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisKKyAgICAgICAgaWYgKCEob3B0aW9uLT5mbGFncyAmIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNKSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvZGVjIEFWT3B0aW9uICVzICglcykgc3BlY2lmaWVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgImlucHV0IGZpbGUgIyVkICglcykgaXMgbm90IGEgZGVjb2Rpbmcgb3B0aW9uLlxuIiwgZS0+a2V5LAorICAgICAgICAgICAgICAgICAgIG9wdGlvbi0+aGVscCA/IG9wdGlvbi0+aGVscCA6ICIiLCBuYl9pbnB1dF9maWxlcyAtIDEsCisgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiQ29kZWMgQVZPcHRpb24gJXMgKCVzKSBzcGVjaWZpZWQgZm9yICIKKyAgICAgICAgICAgICAgICJpbnB1dCBmaWxlICMlZCAoJXMpIGhhcyBub3QgYmVlbiB1c2VkIGZvciBhbnkgc3RyZWFtLiBUaGUgbW9zdCAiCisgICAgICAgICAgICAgICAibGlrZWx5IHJlYXNvbiBpcyBlaXRoZXIgd3JvbmcgdHlwZSAoZS5nLiBhIHZpZGVvIG9wdGlvbiB3aXRoICIKKyAgICAgICAgICAgICAgICJubyB2aWRlbyBzdHJlYW1zKSBvciB0aGF0IGl0IGlzIGEgcHJpdmF0ZSBvcHRpb24gb2Ygc29tZSBkZWNvZGVyICIKKyAgICAgICAgICAgICAgICJ3aGljaCB3YXMgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGFueSBzdHJlYW0uXG4iLCBlLT5rZXksCisgICAgICAgICAgICAgICBvcHRpb24tPmhlbHAgPyBvcHRpb24tPmhlbHAgOiAiIiwgbmJfaW5wdXRfZmlsZXMgLSAxLCBmaWxlbmFtZSk7CisgICAgfQorICAgIGF2X2RpY3RfZnJlZSgmdW51c2VkX29wdHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IG8tPm5iX2R1bXBfYXR0YWNobWVudDsgaSsrKSB7CisgICAgICAgIGludCBqOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpYy0+bmJfc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBpYy0+c3RyZWFtc1tqXTsKKworICAgICAgICAgICAgaWYgKGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIoaWMsIHN0LCBvLT5kdW1wX2F0dGFjaG1lbnRbaV0uc3BlY2lmaWVyKSA9PSAxKQorICAgICAgICAgICAgICAgIGR1bXBfYXR0YWNobWVudChzdCwgby0+ZHVtcF9hdHRhY2htZW50W2ldLnUuc3RyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlucHV0X3N0cmVhbV9wb3RlbnRpYWxseV9hdmFpbGFibGUgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1aW50OF90ICpnZXRfbGluZShBVklPQ29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqbGluZTsKKyAgICB1aW50OF90ICpidWY7CisgICAgY2hhciBjOworCisgICAgaWYgKGF2aW9fb3Blbl9keW5fYnVmKCZsaW5lKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCBhbGxvYyBidWZmZXIgZm9yIHJlYWRpbmcgcHJlc2V0LlxuIik7CisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB9CisKKyAgICB3aGlsZSAoKGMgPSBhdmlvX3I4KHMpKSAmJiBjICE9ICdcbicpCisgICAgICAgIGF2aW9fdzgobGluZSwgYyk7CisgICAgYXZpb193OChsaW5lLCAwKTsKKyAgICBhdmlvX2Nsb3NlX2R5bl9idWYobGluZSwgJmJ1Zik7CisKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgaW50IGdldF9wcmVzZXRfZmlsZV8yKGNvbnN0IGNoYXIgKnByZXNldF9uYW1lLCBjb25zdCBjaGFyICpjb2RlY19uYW1lLCBBVklPQ29udGV4dCAqKnMpCit7CisgICAgaW50IGksIHJldCA9IC0xOworICAgIGNoYXIgZmlsZW5hbWVbMTAwMF07CisgICAgY29uc3QgY2hhciAqYmFzZVszXSA9IHsgZ2V0ZW52KCJBVkNPTlZfREFUQURJUiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGVudigiSE9NRSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ09OVl9EQVRBRElSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoYmFzZSkgJiYgcmV0IDwgMDsgaSsrKSB7CisgICAgICAgIGlmICghYmFzZVtpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoY29kZWNfbmFtZSkgeworICAgICAgICAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcyVzLyVzLSVzLmF2cHJlc2V0IiwgYmFzZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgIGkgIT0gMSA/ICIiIDogIi8uYXZjb252IiwgY29kZWNfbmFtZSwgcHJlc2V0X25hbWUpOworICAgICAgICAgICAgcmV0ID0gYXZpb19vcGVuMihzLCBmaWxlbmFtZSwgQVZJT19GTEFHX1JFQUQsICZpbnRfY2IsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzJXMvJXMuYXZwcmVzZXQiLCBiYXNlW2ldLAorICAgICAgICAgICAgICAgICAgICAgaSAhPSAxID8gIiIgOiAiLy5hdmNvbnYiLCBwcmVzZXRfbmFtZSk7CisgICAgICAgICAgICByZXQgPSBhdmlvX29wZW4yKHMsIGZpbGVuYW1lLCBBVklPX0ZMQUdfUkVBRCwgJmludF9jYiwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjaG9vc2VfZW5jb2RlcihPcHRpb25zQ29udGV4dCAqbywgQVZGb3JtYXRDb250ZXh0ICpzLCBPdXRwdXRTdHJlYW0gKm9zdCkKK3sKKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBvc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZTsKKyAgICBjaGFyICpjb2RlY19uYW1lID0gTlVMTDsKKworICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fCB0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyB8fCB0eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChjb2RlY19uYW1lcywgc3RyLCBjb2RlY19uYW1lLCBzLCBvc3QtPnN0KTsKKyAgICAgICAgaWYgKCFjb2RlY19uYW1lKSB7CisgICAgICAgICAgICBvc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBhdl9ndWVzc19jb2RlYyhzLT5vZm9ybWF0LCBOVUxMLCBzLT51cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBvc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSk7CisgICAgICAgICAgICBvc3QtPmVuYyA9IGF2Y29kZWNfZmluZF9lbmNvZGVyKG9zdC0+c3QtPmNvZGVjcGFyLT5jb2RlY19pZCk7CisgICAgICAgICAgICBpZiAoIW9zdC0+ZW5jKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkF1dG9tYXRpYyBlbmNvZGVyIHNlbGVjdGlvbiBmYWlsZWQgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBzdHJlYW0gIyVkOiVkLiBEZWZhdWx0IGVuY29kZXIgZm9yIGZvcm1hdCAlcyAoY29kZWMgJXMpIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgInByb2JhYmx5IGRpc2FibGVkLiBQbGVhc2UgY2hvb3NlIGFuIGVuY29kZXIgbWFudWFsbHkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgsIHMtPm9mb3JtYXQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUob3N0LT5zdC0+Y29kZWNwYXItPmNvZGVjX2lkKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU5DT0RFUl9OT1RfRk9VTkQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjb2RlY19uYW1lLCAiY29weSIpKQorICAgICAgICAgICAgb3N0LT5zdHJlYW1fY29weSA9IDE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb3N0LT5lbmMgPSBmaW5kX2NvZGVjX29yX2RpZShjb2RlY19uYW1lLCBvc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSwgMSk7CisgICAgICAgICAgICBvc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBvc3QtPmVuYy0+aWQ7CisgICAgICAgIH0KKyAgICAgICAgb3N0LT5lbmNvZGluZ19uZWVkZWQgPSAhb3N0LT5zdHJlYW1fY29weTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBubyBlbmNvZGluZyBzdXBwb3J0ZWQgZm9yIG90aGVyIG1lZGlhIHR5cGVzICovCisgICAgICAgIG9zdC0+c3RyZWFtX2NvcHkgICAgID0gMTsKKyAgICAgICAgb3N0LT5lbmNvZGluZ19uZWVkZWQgPSAwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfb3V0cHV0X3N0cmVhbShPcHRpb25zQ29udGV4dCAqbywgQVZGb3JtYXRDb250ZXh0ICpvYywgZW51bSBBVk1lZGlhVHlwZSB0eXBlLCBpbnQgc291cmNlX2luZGV4KQoreworICAgIE91dHB1dFN0cmVhbSAqb3N0OworICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ob2MsIE5VTEwpOworICAgIGludCBpZHggICAgICA9IG9jLT5uYl9zdHJlYW1zIC0gMSwgcmV0ID0gMDsKKyAgICBjb25zdCBjaGFyICpic2ZzID0gTlVMTCwgKnRpbWVfYmFzZSA9IE5VTEw7CisgICAgY2hhciAqbmV4dCwgKmNvZGVjX3RhZyA9IE5VTEw7CisgICAgZG91YmxlIHFzY2FsZSA9IC0xOworICAgIGludCBpOworCisgICAgaWYgKCFzdCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGFsbG9jIHN0cmVhbS5cbiIpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgaWYgKG9jLT5uYl9zdHJlYW1zIC0gMSA8IG8tPm5iX3N0cmVhbWlkX21hcCkKKyAgICAgICAgc3QtPmlkID0gby0+c3RyZWFtaWRfbWFwW29jLT5uYl9zdHJlYW1zIC0gMV07CisKKyAgICBHUk9XX0FSUkFZKG91dHB1dF9zdHJlYW1zLCBuYl9vdXRwdXRfc3RyZWFtcyk7CisgICAgaWYgKCEob3N0ID0gYXZfbWFsbG9jeihzaXplb2YoKm9zdCkpKSkKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIG91dHB1dF9zdHJlYW1zW25iX291dHB1dF9zdHJlYW1zIC0gMV0gPSBvc3Q7CisKKyAgICBvc3QtPmZpbGVfaW5kZXggPSBuYl9vdXRwdXRfZmlsZXMgLSAxOworICAgIG9zdC0+aW5kZXggICAgICA9IGlkeDsKKyAgICBvc3QtPnN0ICAgICAgICAgPSBzdDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSB0eXBlOworCisgICAgcmV0ID0gY2hvb3NlX2VuY29kZXIobywgb2MsIG9zdCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkVycm9yIHNlbGVjdGluZyBhbiBlbmNvZGVyIGZvciBzdHJlYW0gIgorICAgICAgICAgICAgICAgIiVkOiVkXG4iLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgb3N0LT5lbmNfY3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhvc3QtPmVuYyk7CisgICAgaWYgKCFvc3QtPmVuY19jdHgpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGhlIGVuY29kaW5nIGNvbnRleHQuXG4iKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKyAgICBvc3QtPmVuY19jdHgtPmNvZGVjX3R5cGUgPSB0eXBlOworCisgICAgb3N0LT5yZWZfcGFyID0gYXZjb2RlY19wYXJhbWV0ZXJzX2FsbG9jKCk7CisgICAgaWYgKCFvc3QtPnJlZl9wYXIpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMuXG4iKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGlmIChvc3QtPmVuYykgeworICAgICAgICBBVklPQ29udGV4dCAqcyA9IE5VTEw7CisgICAgICAgIGNoYXIgKmJ1ZiA9IE5VTEwsICphcmcgPSBOVUxMLCAqcHJlc2V0ID0gTlVMTDsKKworICAgICAgICBvc3QtPmVuY29kZXJfb3B0cyAgPSBmaWx0ZXJfY29kZWNfb3B0cyhvLT5nLT5jb2RlY19vcHRzLCBvc3QtPmVuYy0+aWQsIG9jLCBzdCwgb3N0LT5lbmMpOworCisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHByZXNldHMsIHN0ciwgcHJlc2V0LCBvYywgc3QpOworICAgICAgICBpZiAocHJlc2V0ICYmICghKHJldCA9IGdldF9wcmVzZXRfZmlsZV8yKHByZXNldCwgb3N0LT5lbmMtPm5hbWUsICZzKSkpKSB7CisgICAgICAgICAgICBkbyAgeworICAgICAgICAgICAgICAgIGJ1ZiA9IGdldF9saW5lKHMpOworICAgICAgICAgICAgICAgIGlmICghYnVmWzBdIHx8IGJ1ZlswXSA9PSAnIycpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCEoYXJnID0gc3RyY2hyKGJ1ZiwgJz0nKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgbGluZSBmb3VuZCBpbiB0aGUgcHJlc2V0IGZpbGUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqYXJnKysgPSAwOworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvc3QtPmVuY29kZXJfb3B0cywgYnVmLCBhcmcsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKCFzLT5lb2ZfcmVhY2hlZCk7CisgICAgICAgICAgICBhdmlvX2Nsb3NlcCgmcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAiUHJlc2V0ICVzIHNwZWNpZmllZCBmb3Igc3RyZWFtICVkOiVkLCBidXQgY291bGQgbm90IGJlIG9wZW5lZC5cbiIsCisgICAgICAgICAgICAgICAgICAgcHJlc2V0LCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3N0LT5lbmNvZGVyX29wdHMgPSBmaWx0ZXJfY29kZWNfb3B0cyhvLT5nLT5jb2RlY19vcHRzLCBBVl9DT0RFQ19JRF9OT05FLCBvYywgc3QsIE5VTEwpOworICAgIH0KKworCisgICAgaWYgKG8tPmJpdGV4YWN0KQorICAgICAgICBvc3QtPmVuY19jdHgtPmZsYWdzIHw9IEFWX0NPREVDX0ZMQUdfQklURVhBQ1Q7CisKKyAgICBNQVRDSF9QRVJfU1RSRUFNX09QVCh0aW1lX2Jhc2VzLCBzdHIsIHRpbWVfYmFzZSwgb2MsIHN0KTsKKyAgICBpZiAodGltZV9iYXNlKSB7CisgICAgICAgIEFWUmF0aW9uYWwgcTsKKyAgICAgICAgaWYgKGF2X3BhcnNlX3JhdGlvKCZxLCB0aW1lX2Jhc2UsIElOVF9NQVgsIDAsIE5VTEwpIDwgMCB8fAorICAgICAgICAgICAgcS5udW0gPD0gMCB8fCBxLmRlbiA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCB0aW1lIGJhc2U6ICVzXG4iLCB0aW1lX2Jhc2UpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgICAgIHN0LT50aW1lX2Jhc2UgPSBxOworICAgIH0KKworICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGVuY190aW1lX2Jhc2VzLCBzdHIsIHRpbWVfYmFzZSwgb2MsIHN0KTsKKyAgICBpZiAodGltZV9iYXNlKSB7CisgICAgICAgIEFWUmF0aW9uYWwgcTsKKyAgICAgICAgaWYgKGF2X3BhcnNlX3JhdGlvKCZxLCB0aW1lX2Jhc2UsIElOVF9NQVgsIDAsIE5VTEwpIDwgMCB8fAorICAgICAgICAgICAgcS5kZW4gPD0gMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgdGltZSBiYXNlOiAlc1xuIiwgdGltZV9iYXNlKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgICAgICBvc3QtPmVuY190aW1lYmFzZSA9IHE7CisgICAgfQorCisgICAgb3N0LT5tYXhfZnJhbWVzID0gSU5UNjRfTUFYOworICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKG1heF9mcmFtZXMsIGk2NCwgb3N0LT5tYXhfZnJhbWVzLCBvYywgc3QpOworICAgIGZvciAoaSA9IDA7IGk8by0+bmJfbWF4X2ZyYW1lczsgaSsrKSB7CisgICAgICAgIGNoYXIgKnAgPSBvLT5tYXhfZnJhbWVzW2ldLnNwZWNpZmllcjsKKyAgICAgICAgaWYgKCEqcCAmJiB0eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiQXBwbHlpbmcgdW5zcGVjaWZpYyAtZnJhbWVzIHRvIG5vbiB2aWRlbyBzdHJlYW1zLCBtYXliZSB5b3UgbWVhbnQgLXZmcmFtZXMgP1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9zdC0+Y29weV9wcmlvcl9zdGFydCA9IC0xOworICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGNvcHlfcHJpb3Jfc3RhcnQsIGksIG9zdC0+Y29weV9wcmlvcl9zdGFydCwgb2MgLHN0KTsKKworICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGJpdHN0cmVhbV9maWx0ZXJzLCBzdHIsIGJzZnMsIG9jLCBzdCk7CisgICAgd2hpbGUgKGJzZnMgJiYgKmJzZnMpIHsKKyAgICAgICAgY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmZpbHRlcjsKKyAgICAgICAgY2hhciAqYnNmLCAqYnNmX29wdGlvbnNfc3RyLCAqYnNmX25hbWU7CisKKyAgICAgICAgYnNmID0gYXZfZ2V0X3Rva2VuKCZic2ZzLCAiLCIpOworICAgICAgICBpZiAoIWJzZikKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgYnNmX25hbWUgPSBhdl9zdHJ0b2soYnNmLCAiPSIsICZic2Zfb3B0aW9uc19zdHIpOworICAgICAgICBpZiAoIWJzZl9uYW1lKQorICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworCisgICAgICAgIGZpbHRlciA9IGF2X2JzZl9nZXRfYnlfbmFtZShic2ZfbmFtZSk7CisgICAgICAgIGlmICghZmlsdGVyKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiVW5rbm93biBiaXRzdHJlYW0gZmlsdGVyICVzXG4iLCBic2ZfbmFtZSk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKworICAgICAgICBvc3QtPmJzZl9jdHggPSBhdl9yZWFsbG9jX2FycmF5KG9zdC0+YnNmX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPm5iX2JpdHN0cmVhbV9maWx0ZXJzICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm9zdC0+YnNmX2N0eCkpOworICAgICAgICBpZiAoIW9zdC0+YnNmX2N0eCkKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKworICAgICAgICByZXQgPSBhdl9ic2ZfYWxsb2MoZmlsdGVyLCAmb3N0LT5ic2ZfY3R4W29zdC0+bmJfYml0c3RyZWFtX2ZpbHRlcnNdKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIGEgYml0c3RyZWFtIGZpbHRlciBjb250ZXh0XG4iKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorCisgICAgICAgIG9zdC0+bmJfYml0c3RyZWFtX2ZpbHRlcnMrKzsKKworICAgICAgICBpZiAoYnNmX29wdGlvbnNfc3RyICYmIGZpbHRlci0+cHJpdl9jbGFzcykgeworICAgICAgICAgICAgY29uc3QgQVZPcHRpb24gKm9wdCA9IGF2X29wdF9uZXh0KG9zdC0+YnNmX2N0eFtvc3QtPm5iX2JpdHN0cmVhbV9maWx0ZXJzLTFdLT5wcml2X2RhdGEsIE5VTEwpOworICAgICAgICAgICAgY29uc3QgY2hhciAqIHNob3J0aGFuZFsyXSA9IHtOVUxMfTsKKworICAgICAgICAgICAgaWYgKG9wdCkKKyAgICAgICAgICAgICAgICBzaG9ydGhhbmRbMF0gPSBvcHQtPm5hbWU7CisKKyAgICAgICAgICAgIHJldCA9IGF2X29wdF9zZXRfZnJvbV9zdHJpbmcob3N0LT5ic2ZfY3R4W29zdC0+bmJfYml0c3RyZWFtX2ZpbHRlcnMtMV0tPnByaXZfZGF0YSwgYnNmX29wdGlvbnNfc3RyLCBzaG9ydGhhbmQsICI9IiwgIjoiKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgb3B0aW9ucyBmb3IgYml0c3RyZWFtIGZpbHRlciAlc1xuIiwgYnNmX25hbWUpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmYnNmKTsKKworICAgICAgICBpZiAoKmJzZnMpCisgICAgICAgICAgICBic2ZzKys7CisgICAgfQorCisgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoY29kZWNfdGFncywgc3RyLCBjb2RlY190YWcsIG9jLCBzdCk7CisgICAgaWYgKGNvZGVjX3RhZykgeworICAgICAgICB1aW50MzJfdCB0YWcgPSBzdHJ0b2woY29kZWNfdGFnLCAmbmV4dCwgMCk7CisgICAgICAgIGlmICgqbmV4dCkKKyAgICAgICAgICAgIHRhZyA9IEFWX1JMMzIoY29kZWNfdGFnKTsKKyAgICAgICAgb3N0LT5zdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9CisgICAgICAgIG9zdC0+ZW5jX2N0eC0+Y29kZWNfdGFnID0gdGFnOworICAgIH0KKworICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHFzY2FsZSwgZGJsLCBxc2NhbGUsIG9jLCBzdCk7CisgICAgaWYgKHFzY2FsZSA+PSAwKSB7CisgICAgICAgIG9zdC0+ZW5jX2N0eC0+ZmxhZ3MgfD0gQVZfQ09ERUNfRkxBR19RU0NBTEU7CisgICAgICAgIG9zdC0+ZW5jX2N0eC0+Z2xvYmFsX3F1YWxpdHkgPSBGRl9RUDJMQU1CREEgKiBxc2NhbGU7CisgICAgfQorCisgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZGlzcG9zaXRpb24sIHN0ciwgb3N0LT5kaXNwb3NpdGlvbiwgb2MsIHN0KTsKKyAgICBvc3QtPmRpc3Bvc2l0aW9uID0gYXZfc3RyZHVwKG9zdC0+ZGlzcG9zaXRpb24pOworCisgICAgb3N0LT5tYXhfbXV4aW5nX3F1ZXVlX3NpemUgPSAxMjg7CisgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQobWF4X211eGluZ19xdWV1ZV9zaXplLCBpLCBvc3QtPm1heF9tdXhpbmdfcXVldWVfc2l6ZSwgb2MsIHN0KTsKKyAgICBvc3QtPm1heF9tdXhpbmdfcXVldWVfc2l6ZSAqPSBzaXplb2YoQVZQYWNrZXQpOworCisgICAgaWYgKG9jLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX0dMT0JBTEhFQURFUikKKyAgICAgICAgb3N0LT5lbmNfY3R4LT5mbGFncyB8PSBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVI7CisKKyAgICBhdl9kaWN0X2NvcHkoJm9zdC0+c3dzX2RpY3QsIG8tPmctPnN3c19kaWN0LCAwKTsKKworICAgIGF2X2RpY3RfY29weSgmb3N0LT5zd3Jfb3B0cywgby0+Zy0+c3dyX29wdHMsIDApOworICAgIGlmIChvc3QtPmVuYyAmJiBhdl9nZXRfZXhhY3RfYml0c19wZXJfc2FtcGxlKG9zdC0+ZW5jLT5pZCkgPT0gMjQpCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvc3QtPnN3cl9vcHRzLCAib3V0cHV0X3NhbXBsZV9iaXRzIiwgIjI0IiwgMCk7CisKKyAgICBhdl9kaWN0X2NvcHkoJm9zdC0+cmVzYW1wbGVfb3B0cywgby0+Zy0+cmVzYW1wbGVfb3B0cywgMCk7CisKKyAgICBvc3QtPnNvdXJjZV9pbmRleCA9IHNvdXJjZV9pbmRleDsKKyAgICBpZiAoc291cmNlX2luZGV4ID49IDApIHsKKyAgICAgICAgb3N0LT5zeW5jX2lzdCA9IGlucHV0X3N0cmVhbXNbc291cmNlX2luZGV4XTsKKyAgICAgICAgaW5wdXRfc3RyZWFtc1tzb3VyY2VfaW5kZXhdLT5kaXNjYXJkID0gMDsKKyAgICAgICAgaW5wdXRfc3RyZWFtc1tzb3VyY2VfaW5kZXhdLT5zdC0+ZGlzY2FyZCA9IGlucHV0X3N0cmVhbXNbc291cmNlX2luZGV4XS0+dXNlcl9zZXRfZGlzY2FyZDsKKyAgICB9CisgICAgb3N0LT5sYXN0X211eF9kdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIG9zdC0+bXV4aW5nX3F1ZXVlID0gYXZfZmlmb19hbGxvYyg4ICogc2l6ZW9mKEFWUGFja2V0KSk7CisgICAgaWYgKCFvc3QtPm11eGluZ19xdWV1ZSkKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworCisgICAgcmV0dXJuIG9zdDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfbWF0cml4X2NvZWZmcyh1aW50MTZfdCAqZGVzdCwgY29uc3QgY2hhciAqc3RyKQoreworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKnAgPSBzdHI7CisgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgICBkZXN0W2ldID0gYXRvaShwKTsKKyAgICAgICAgaWYgKGkgPT0gNjMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcCA9IHN0cmNocihwLCAnLCcpOworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTeW50YXggZXJyb3IgaW4gbWF0cml4IFwiJXNcIiBhdCBjb2VmZiAlZFxuIiwgc3RyLCBpKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgICAgICBwKys7CisgICAgfQorfQorCisvKiByZWFkIGZpbGUgY29udGVudHMgaW50byBhIHN0cmluZyAqLworc3RhdGljIHVpbnQ4X3QgKnJlYWRfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgICAgICA9IE5VTEw7CisgICAgQVZJT0NvbnRleHQgKmR5bl9idWYgPSBOVUxMOworICAgIGludCByZXQgPSBhdmlvX29wZW4oJnBiLCBmaWxlbmFtZSwgQVZJT19GTEFHX1JFQUQpOworICAgIHVpbnQ4X3QgYnVmWzEwMjRdLCAqc3RyOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIG9wZW5pbmcgZmlsZSAlcy5cbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bl9idWYpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2aW9fY2xvc2VwKCZwYik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICB3aGlsZSAoKHJldCA9IGF2aW9fcmVhZChwYiwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkKKyAgICAgICAgYXZpb193cml0ZShkeW5fYnVmLCBidWYsIHJldCk7CisgICAgYXZpb193OChkeW5fYnVmLCAwKTsKKyAgICBhdmlvX2Nsb3NlcCgmcGIpOworCisgICAgcmV0ID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9idWYsICZzdHIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgY2hhciAqZ2V0X29zdF9maWx0ZXJzKE9wdGlvbnNDb250ZXh0ICpvLCBBVkZvcm1hdENvbnRleHQgKm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCkKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBvc3QtPnN0OworCisgICAgaWYgKG9zdC0+ZmlsdGVyc19zY3JpcHQgJiYgb3N0LT5maWx0ZXJzKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJCb3RoIC1maWx0ZXIgYW5kIC1maWx0ZXJfc2NyaXB0IHNldCBmb3IgIgorICAgICAgICAgICAgICAgIm91dHB1dCBzdHJlYW0gIyVkOiVkLlxuIiwgbmJfb3V0cHV0X2ZpbGVzLCBzdC0+aW5kZXgpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgaWYgKG9zdC0+ZmlsdGVyc19zY3JpcHQpCisgICAgICAgIHJldHVybiByZWFkX2ZpbGUob3N0LT5maWx0ZXJzX3NjcmlwdCk7CisgICAgZWxzZSBpZiAob3N0LT5maWx0ZXJzKQorICAgICAgICByZXR1cm4gYXZfc3RyZHVwKG9zdC0+ZmlsdGVycyk7CisKKyAgICByZXR1cm4gYXZfc3RyZHVwKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gPworICAgICAgICAgICAgICAgICAgICAgIm51bGwiIDogImFudWxsIik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N0cmVhbWNvcHlfZmlsdGVycyhPcHRpb25zQ29udGV4dCAqbywgQVZGb3JtYXRDb250ZXh0ICpvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRTdHJlYW0gKm9zdCwgZW51bSBBVk1lZGlhVHlwZSB0eXBlKQoreworICAgIGlmIChvc3QtPmZpbHRlcnNfc2NyaXB0IHx8IG9zdC0+ZmlsdGVycykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzICclcycgd2FzIGRlZmluZWQgZm9yICVzIG91dHB1dCBzdHJlYW0gJWQ6JWQgYnV0IGNvZGVjIGNvcHkgd2FzIHNlbGVjdGVkLlxuIgorICAgICAgICAgICAgICAgIkZpbHRlcmluZyBhbmQgc3RyZWFtY29weSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci5cbiIsCisgICAgICAgICAgICAgICBvc3QtPmZpbHRlcnMgPyAiRmlsdGVyZ3JhcGgiIDogIkZpbHRlcmdyYXBoIHNjcmlwdCIsCisgICAgICAgICAgICAgICBvc3QtPmZpbHRlcnMgPyBvc3QtPmZpbHRlcnMgOiBvc3QtPmZpbHRlcnNfc2NyaXB0LAorICAgICAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHR5cGUpLCBvc3QtPmZpbGVfaW5kZXgsIG9zdC0+aW5kZXgpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorfQorCitzdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfdmlkZW9fc3RyZWFtKE9wdGlvbnNDb250ZXh0ICpvLCBBVkZvcm1hdENvbnRleHQgKm9jLCBpbnQgc291cmNlX2luZGV4KQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBPdXRwdXRTdHJlYW0gKm9zdDsKKyAgICBBVkNvZGVjQ29udGV4dCAqdmlkZW9fZW5jOworICAgIGNoYXIgKmZyYW1lX3JhdGUgPSBOVUxMLCAqZnJhbWVfYXNwZWN0X3JhdGlvID0gTlVMTDsKKworICAgIG9zdCA9IG5ld19vdXRwdXRfc3RyZWFtKG8sIG9jLCBBVk1FRElBX1RZUEVfVklERU8sIHNvdXJjZV9pbmRleCk7CisgICAgc3QgID0gb3N0LT5zdDsKKyAgICB2aWRlb19lbmMgPSBvc3QtPmVuY19jdHg7CisKKyAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmcmFtZV9yYXRlcywgc3RyLCBmcmFtZV9yYXRlLCBvYywgc3QpOworICAgIGlmIChmcmFtZV9yYXRlICYmIGF2X3BhcnNlX3ZpZGVvX3JhdGUoJm9zdC0+ZnJhbWVfcmF0ZSwgZnJhbWVfcmF0ZSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGZyYW1lcmF0ZSB2YWx1ZTogJXNcbiIsIGZyYW1lX3JhdGUpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorICAgIGlmIChmcmFtZV9yYXRlICYmIHZpZGVvX3N5bmNfbWV0aG9kID09IFZTWU5DX1BBU1NUSFJPVUdIKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVXNpbmcgLXZzeW5jIDAgYW5kIC1yIGNhbiBwcm9kdWNlIGludmFsaWQgb3V0cHV0IGZpbGVzXG4iKTsKKworICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGZyYW1lX2FzcGVjdF9yYXRpb3MsIHN0ciwgZnJhbWVfYXNwZWN0X3JhdGlvLCBvYywgc3QpOworICAgIGlmIChmcmFtZV9hc3BlY3RfcmF0aW8pIHsKKyAgICAgICAgQVZSYXRpb25hbCBxOworICAgICAgICBpZiAoYXZfcGFyc2VfcmF0aW8oJnEsIGZyYW1lX2FzcGVjdF9yYXRpbywgMjU1LCAwLCBOVUxMKSA8IDAgfHwKKyAgICAgICAgICAgIHEubnVtIDw9IDAgfHwgcS5kZW4gPD0gMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgYXNwZWN0IHJhdGlvOiAlc1xuIiwgZnJhbWVfYXNwZWN0X3JhdGlvKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgICAgICBvc3QtPmZyYW1lX2FzcGVjdF9yYXRpbyA9IHE7CisgICAgfQorCisgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZmlsdGVyX3NjcmlwdHMsIHN0ciwgb3N0LT5maWx0ZXJzX3NjcmlwdCwgb2MsIHN0KTsKKyAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmaWx0ZXJzLCAgICAgICAgc3RyLCBvc3QtPmZpbHRlcnMsICAgICAgICBvYywgc3QpOworCisgICAgaWYgKCFvc3QtPnN0cmVhbV9jb3B5KSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnAgPSBOVUxMOworICAgICAgICBjaGFyICpmcmFtZV9zaXplID0gTlVMTDsKKyAgICAgICAgY2hhciAqZnJhbWVfcGl4X2ZtdCA9IE5VTEw7CisgICAgICAgIGNoYXIgKmludHJhX21hdHJpeCA9IE5VTEwsICppbnRlcl9tYXRyaXggPSBOVUxMOworICAgICAgICBjaGFyICpjaHJvbWFfaW50cmFfbWF0cml4ID0gTlVMTDsKKyAgICAgICAgaW50IGRvX3Bhc3MgPSAwOworICAgICAgICBpbnQgaTsKKworICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmcmFtZV9zaXplcywgc3RyLCBmcmFtZV9zaXplLCBvYywgc3QpOworICAgICAgICBpZiAoZnJhbWVfc2l6ZSAmJiBhdl9wYXJzZV92aWRlb19zaXplKCZ2aWRlb19lbmMtPndpZHRoLCAmdmlkZW9fZW5jLT5oZWlnaHQsIGZyYW1lX3NpemUpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgZnJhbWUgc2l6ZTogJXMuXG4iLCBmcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorCisgICAgICAgIHZpZGVvX2VuYy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IGZyYW1lX2JpdHNfcGVyX3Jhd19zYW1wbGU7CisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGZyYW1lX3BpeF9mbXRzLCBzdHIsIGZyYW1lX3BpeF9mbXQsIG9jLCBzdCk7CisgICAgICAgIGlmIChmcmFtZV9waXhfZm10ICYmICpmcmFtZV9waXhfZm10ID09ICcrJykgeworICAgICAgICAgICAgb3N0LT5rZWVwX3BpeF9mbXQgPSAxOworICAgICAgICAgICAgaWYgKCEqKytmcmFtZV9waXhfZm10KQorICAgICAgICAgICAgICAgIGZyYW1lX3BpeF9mbXQgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmIChmcmFtZV9waXhfZm10ICYmICh2aWRlb19lbmMtPnBpeF9mbXQgPSBhdl9nZXRfcGl4X2ZtdChmcmFtZV9waXhfZm10KSkgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiVW5rbm93biBwaXhlbCBmb3JtYXQgcmVxdWVzdGVkOiAlcy5cbiIsIGZyYW1lX3BpeF9mbXQpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gdmlkZW9fZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgICAgIGlmIChpbnRyYV9vbmx5KQorICAgICAgICAgICAgdmlkZW9fZW5jLT5nb3Bfc2l6ZSA9IDA7CisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGludHJhX21hdHJpY2VzLCBzdHIsIGludHJhX21hdHJpeCwgb2MsIHN0KTsKKyAgICAgICAgaWYgKGludHJhX21hdHJpeCkgeworICAgICAgICAgICAgaWYgKCEodmlkZW9fZW5jLT5pbnRyYV9tYXRyaXggPSBhdl9tYWxsb2N6KHNpemVvZigqdmlkZW9fZW5jLT5pbnRyYV9tYXRyaXgpICogNjQpKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpbnRyYSBtYXRyaXguXG4iKTsKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJzZV9tYXRyaXhfY29lZmZzKHZpZGVvX2VuYy0+aW50cmFfbWF0cml4LCBpbnRyYV9tYXRyaXgpOworICAgICAgICB9CisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGNocm9tYV9pbnRyYV9tYXRyaWNlcywgc3RyLCBjaHJvbWFfaW50cmFfbWF0cml4LCBvYywgc3QpOworICAgICAgICBpZiAoY2hyb21hX2ludHJhX21hdHJpeCkgeworICAgICAgICAgICAgdWludDE2X3QgKnAgPSBhdl9tYWxsb2N6KHNpemVvZigqdmlkZW9fZW5jLT5jaHJvbWFfaW50cmFfbWF0cml4KSAqIDY0KTsKKyAgICAgICAgICAgIGlmICghcCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBpbnRyYSBtYXRyaXguXG4iKTsKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2aWRlb19lbmMtPmNocm9tYV9pbnRyYV9tYXRyaXggPSBwOworICAgICAgICAgICAgcGFyc2VfbWF0cml4X2NvZWZmcyhwLCBjaHJvbWFfaW50cmFfbWF0cml4KTsKKyAgICAgICAgfQorICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChpbnRlcl9tYXRyaWNlcywgc3RyLCBpbnRlcl9tYXRyaXgsIG9jLCBzdCk7CisgICAgICAgIGlmIChpbnRlcl9tYXRyaXgpIHsKKyAgICAgICAgICAgIGlmICghKHZpZGVvX2VuYy0+aW50ZXJfbWF0cml4ID0gYXZfbWFsbG9jeihzaXplb2YoKnZpZGVvX2VuYy0+aW50ZXJfbWF0cml4KSAqIDY0KSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgaW50ZXIgbWF0cml4LlxuIik7CisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFyc2VfbWF0cml4X2NvZWZmcyh2aWRlb19lbmMtPmludGVyX21hdHJpeCwgaW50ZXJfbWF0cml4KTsKKyAgICAgICAgfQorCisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHJjX292ZXJyaWRlcywgc3RyLCBwLCBvYywgc3QpOworICAgICAgICBmb3IgKGkgPSAwOyBwOyBpKyspIHsKKyAgICAgICAgICAgIGludCBzdGFydCwgZW5kLCBxOworICAgICAgICAgICAgaW50IGUgPSBzc2NhbmYocCwgIiVkLCVkLCVkIiwgJnN0YXJ0LCAmZW5kLCAmcSk7CisgICAgICAgICAgICBpZiAoZSAhPSAzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgImVycm9yIHBhcnNpbmcgcmNfb3ZlcnJpZGVcbiIpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZGVvX2VuYy0+cmNfb3ZlcnJpZGUgPQorICAgICAgICAgICAgICAgIGF2X3JlYWxsb2NfYXJyYXkodmlkZW9fZW5jLT5yY19vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKyAxLCBzaXplb2YoUmNPdmVycmlkZSkpOworICAgICAgICAgICAgaWYgKCF2aWRlb19lbmMtPnJjX292ZXJyaWRlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCAocmUpYWxsb2NhdGUgbWVtb3J5IGZvciByY19vdmVycmlkZS5cbiIpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpZGVvX2VuYy0+cmNfb3ZlcnJpZGVbaV0uc3RhcnRfZnJhbWUgPSBzdGFydDsKKyAgICAgICAgICAgIHZpZGVvX2VuYy0+cmNfb3ZlcnJpZGVbaV0uZW5kX2ZyYW1lICAgPSBlbmQ7CisgICAgICAgICAgICBpZiAocSA+IDApIHsKKyAgICAgICAgICAgICAgICB2aWRlb19lbmMtPnJjX292ZXJyaWRlW2ldLnFzY2FsZSAgICAgICAgID0gcTsKKyAgICAgICAgICAgICAgICB2aWRlb19lbmMtPnJjX292ZXJyaWRlW2ldLnF1YWxpdHlfZmFjdG9yID0gMS4wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdmlkZW9fZW5jLT5yY19vdmVycmlkZVtpXS5xc2NhbGUgICAgICAgICA9IDA7CisgICAgICAgICAgICAgICAgdmlkZW9fZW5jLT5yY19vdmVycmlkZVtpXS5xdWFsaXR5X2ZhY3RvciA9IC1xLzEwMC4wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcCA9IHN0cmNocihwLCAnLycpOworICAgICAgICAgICAgaWYgKHApIHArKzsKKyAgICAgICAgfQorICAgICAgICB2aWRlb19lbmMtPnJjX292ZXJyaWRlX2NvdW50ID0gaTsKKworICAgICAgICBpZiAoZG9fcHNucikKKyAgICAgICAgICAgIHZpZGVvX2VuYy0+ZmxhZ3N8PSBBVl9DT0RFQ19GTEFHX1BTTlI7CisKKyAgICAgICAgLyogdHdvIHBhc3MgbW9kZSAqLworICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChwYXNzLCBpLCBkb19wYXNzLCBvYywgc3QpOworICAgICAgICBpZiAoZG9fcGFzcykgeworICAgICAgICAgICAgaWYgKGRvX3Bhc3MgJiAxKSB7CisgICAgICAgICAgICAgICAgdmlkZW9fZW5jLT5mbGFncyB8PSBBVl9DT0RFQ19GTEFHX1BBU1MxOworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvc3QtPmVuY29kZXJfb3B0cywgImZsYWdzIiwgIitwYXNzMSIsIEFWX0RJQ1RfQVBQRU5EKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChkb19wYXNzICYgMikgeworICAgICAgICAgICAgICAgIHZpZGVvX2VuYy0+ZmxhZ3MgfD0gQVZfQ09ERUNfRkxBR19QQVNTMjsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3N0LT5lbmNvZGVyX29wdHMsICJmbGFncyIsICIrcGFzczIiLCBBVl9ESUNUX0FQUEVORCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChwYXNzbG9nZmlsZXMsIHN0ciwgb3N0LT5sb2dmaWxlX3ByZWZpeCwgb2MsIHN0KTsKKyAgICAgICAgaWYgKG9zdC0+bG9nZmlsZV9wcmVmaXggJiYKKyAgICAgICAgICAgICEob3N0LT5sb2dmaWxlX3ByZWZpeCA9IGF2X3N0cmR1cChvc3QtPmxvZ2ZpbGVfcHJlZml4KSkpCisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisKKyAgICAgICAgaWYgKGRvX3Bhc3MpIHsKKyAgICAgICAgICAgIGNoYXIgbG9nZmlsZW5hbWVbMTAyNF07CisgICAgICAgICAgICBGSUxFICpmOworCisgICAgICAgICAgICBzbnByaW50Zihsb2dmaWxlbmFtZSwgc2l6ZW9mKGxvZ2ZpbGVuYW1lKSwgIiVzLSVkLmxvZyIsCisgICAgICAgICAgICAgICAgICAgICBvc3QtPmxvZ2ZpbGVfcHJlZml4ID8gb3N0LT5sb2dmaWxlX3ByZWZpeCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QQVNTX0xPR0ZJTEVOQU1FX1BSRUZJWCwKKyAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgICAgICAgaWYgKCFzdHJjbXAob3N0LT5lbmMtPm5hbWUsICJsaWJ4MjY0IikpIHsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3N0LT5lbmNvZGVyX29wdHMsICJzdGF0cyIsIGxvZ2ZpbGVuYW1lLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHZpZGVvX2VuYy0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MyKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgICpsb2didWZmZXIgPSByZWFkX2ZpbGUobG9nZmlsZW5hbWUpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghbG9nYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRXJyb3IgcmVhZGluZyBsb2cgZmlsZSAnJXMnIGZvciBwYXNzLTIgZW5jb2RpbmdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHZpZGVvX2VuYy0+c3RhdHNfaW4gPSBsb2didWZmZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh2aWRlb19lbmMtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QQVNTMSkgeworICAgICAgICAgICAgICAgICAgICBmID0gYXZfZm9wZW5fdXRmOChsb2dmaWxlbmFtZSwgIndiIik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZikgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIGxvZyBmaWxlICclcycgZm9yIHBhc3MtMSBlbmNvZGluZzogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3N0LT5sb2dmaWxlID0gZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmb3JjZWRfa2V5X2ZyYW1lcywgc3RyLCBvc3QtPmZvcmNlZF9rZXlmcmFtZXMsIG9jLCBzdCk7CisgICAgICAgIGlmIChvc3QtPmZvcmNlZF9rZXlmcmFtZXMpCisgICAgICAgICAgICBvc3QtPmZvcmNlZF9rZXlmcmFtZXMgPSBhdl9zdHJkdXAob3N0LT5mb3JjZWRfa2V5ZnJhbWVzKTsKKworICAgICAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmb3JjZV9mcHMsIGksIG9zdC0+Zm9yY2VfZnBzLCBvYywgc3QpOworCisgICAgICAgIG9zdC0+dG9wX2ZpZWxkX2ZpcnN0ID0gLTE7CisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHRvcF9maWVsZF9maXJzdCwgaSwgb3N0LT50b3BfZmllbGRfZmlyc3QsIG9jLCBzdCk7CisKKworICAgICAgICBvc3QtPmF2ZmlsdGVyID0gZ2V0X29zdF9maWx0ZXJzKG8sIG9jLCBvc3QpOworICAgICAgICBpZiAoIW9zdC0+YXZmaWx0ZXIpCisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoY29weV9pbml0aWFsX25vbmtleWZyYW1lcywgaSwgb3N0LT5jb3B5X2luaXRpYWxfbm9ua2V5ZnJhbWVzLCBvYyAsc3QpOworICAgIH0KKworICAgIGlmIChvc3QtPnN0cmVhbV9jb3B5KQorICAgICAgICBjaGVja19zdHJlYW1jb3B5X2ZpbHRlcnMobywgb2MsIG9zdCwgQVZNRURJQV9UWVBFX1ZJREVPKTsKKworICAgIHJldHVybiBvc3Q7Cit9CisKK3N0YXRpYyBPdXRwdXRTdHJlYW0gKm5ld19hdWRpb19zdHJlYW0oT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqb2MsIGludCBzb3VyY2VfaW5kZXgpCit7CisgICAgaW50IG47CisgICAgQVZTdHJlYW0gKnN0OworICAgIE91dHB1dFN0cmVhbSAqb3N0OworICAgIEFWQ29kZWNDb250ZXh0ICphdWRpb19lbmM7CisKKyAgICBvc3QgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBvYywgQVZNRURJQV9UWVBFX0FVRElPLCBzb3VyY2VfaW5kZXgpOworICAgIHN0ICA9IG9zdC0+c3Q7CisKKyAgICBhdWRpb19lbmMgPSBvc3QtPmVuY19jdHg7CisgICAgYXVkaW9fZW5jLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworCisgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZmlsdGVyX3NjcmlwdHMsIHN0ciwgb3N0LT5maWx0ZXJzX3NjcmlwdCwgb2MsIHN0KTsKKyAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChmaWx0ZXJzLCAgICAgICAgc3RyLCBvc3QtPmZpbHRlcnMsICAgICAgICBvYywgc3QpOworCisgICAgaWYgKCFvc3QtPnN0cmVhbV9jb3B5KSB7CisgICAgICAgIGNoYXIgKnNhbXBsZV9mbXQgPSBOVUxMOworCisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGF1ZGlvX2NoYW5uZWxzLCBpLCBhdWRpb19lbmMtPmNoYW5uZWxzLCBvYywgc3QpOworCisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKHNhbXBsZV9mbXRzLCBzdHIsIHNhbXBsZV9mbXQsIG9jLCBzdCk7CisgICAgICAgIGlmIChzYW1wbGVfZm10ICYmCisgICAgICAgICAgICAoYXVkaW9fZW5jLT5zYW1wbGVfZm10ID0gYXZfZ2V0X3NhbXBsZV9mbXQoc2FtcGxlX2ZtdCkpID09IEFWX1NBTVBMRV9GTVRfTk9ORSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgc2FtcGxlIGZvcm1hdCAnJXMnXG4iLCBzYW1wbGVfZm10KTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorCisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGF1ZGlvX3NhbXBsZV9yYXRlLCBpLCBhdWRpb19lbmMtPnNhbXBsZV9yYXRlLCBvYywgc3QpOworCisgICAgICAgIE1BVENIX1BFUl9TVFJFQU1fT1BUKGFwYWQsIHN0ciwgb3N0LT5hcGFkLCBvYywgc3QpOworICAgICAgICBvc3QtPmFwYWQgPSBhdl9zdHJkdXAob3N0LT5hcGFkKTsKKworICAgICAgICBvc3QtPmF2ZmlsdGVyID0gZ2V0X29zdF9maWx0ZXJzKG8sIG9jLCBvc3QpOworICAgICAgICBpZiAoIW9zdC0+YXZmaWx0ZXIpCisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisKKyAgICAgICAgLyogY2hlY2sgZm9yIGNoYW5uZWwgbWFwcGluZyBmb3IgdGhpcyBhdWRpbyBzdHJlYW0gKi8KKyAgICAgICAgZm9yIChuID0gMDsgbiA8IG8tPm5iX2F1ZGlvX2NoYW5uZWxfbWFwczsgbisrKSB7CisgICAgICAgICAgICBBdWRpb0NoYW5uZWxNYXAgKm1hcCA9ICZvLT5hdWRpb19jaGFubmVsX21hcHNbbl07CisgICAgICAgICAgICBpZiAoKG1hcC0+b2ZpbGVfaWR4ICAgPT0gLTEgfHwgb3N0LT5maWxlX2luZGV4ID09IG1hcC0+b2ZpbGVfaWR4KSAmJgorICAgICAgICAgICAgICAgIChtYXAtPm9zdHJlYW1faWR4ID09IC0xIHx8IG9zdC0+c3QtPmluZGV4ICA9PSBtYXAtPm9zdHJlYW1faWR4KSkgeworICAgICAgICAgICAgICAgIElucHV0U3RyZWFtICppc3Q7CisKKyAgICAgICAgICAgICAgICBpZiAobWFwLT5jaGFubmVsX2lkeCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpc3QgPSBOVUxMOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3N0LT5zb3VyY2VfaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDYW5ub3QgZGV0ZXJtaW5lIGlucHV0IHN0cmVhbSBmb3IgY2hhbm5lbCBtYXBwaW5nICVkLiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3N0LT5maWxlX2luZGV4LCBvc3QtPnN0LT5pbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlzdCA9IGlucHV0X3N0cmVhbXNbb3N0LT5zb3VyY2VfaW5kZXhdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghaXN0IHx8IChpc3QtPmZpbGVfaW5kZXggPT0gbWFwLT5maWxlX2lkeCAmJiBpc3QtPnN0LT5pbmRleCA9PSBtYXAtPnN0cmVhbV9pZHgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9yZWFsbG9jcF9hcnJheSgmb3N0LT5hdWRpb19jaGFubmVsc19tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmF1ZGlvX2NoYW5uZWxzX21hcHBlZCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKm9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSA8IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworCisgICAgICAgICAgICAgICAgICAgIG9zdC0+YXVkaW9fY2hhbm5lbHNfbWFwW29zdC0+YXVkaW9fY2hhbm5lbHNfbWFwcGVkKytdID0gbWFwLT5jaGFubmVsX2lkeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3N0LT5zdHJlYW1fY29weSkKKyAgICAgICAgY2hlY2tfc3RyZWFtY29weV9maWx0ZXJzKG8sIG9jLCBvc3QsIEFWTUVESUFfVFlQRV9BVURJTyk7CisKKyAgICByZXR1cm4gb3N0OworfQorCitzdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfZGF0YV9zdHJlYW0oT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqb2MsIGludCBzb3VyY2VfaW5kZXgpCit7CisgICAgT3V0cHV0U3RyZWFtICpvc3Q7CisKKyAgICBvc3QgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBvYywgQVZNRURJQV9UWVBFX0RBVEEsIHNvdXJjZV9pbmRleCk7CisgICAgaWYgKCFvc3QtPnN0cmVhbV9jb3B5KSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJEYXRhIHN0cmVhbSBlbmNvZGluZyBub3Qgc3VwcG9ydGVkIHlldCAob25seSBzdHJlYW1jb3B5KVxuIik7CisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3N0OworfQorCitzdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfdW5rbm93bl9zdHJlYW0oT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqb2MsIGludCBzb3VyY2VfaW5kZXgpCit7CisgICAgT3V0cHV0U3RyZWFtICpvc3Q7CisKKyAgICBvc3QgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBvYywgQVZNRURJQV9UWVBFX1VOS05PV04sIHNvdXJjZV9pbmRleCk7CisgICAgaWYgKCFvc3QtPnN0cmVhbV9jb3B5KSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbmtub3duIHN0cmVhbSBlbmNvZGluZyBub3Qgc3VwcG9ydGVkIHlldCAob25seSBzdHJlYW1jb3B5KVxuIik7CisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB9CisKKyAgICByZXR1cm4gb3N0OworfQorCitzdGF0aWMgT3V0cHV0U3RyZWFtICpuZXdfYXR0YWNobWVudF9zdHJlYW0oT3B0aW9uc0NvbnRleHQgKm8sIEFWRm9ybWF0Q29udGV4dCAqb2MsIGludCBzb3VyY2VfaW5kZXgpCit7CisgICAgT3V0cHV0U3RyZWFtICpvc3QgPSBuZXdfb3V0cHV0X3N0cmVhbShvLCBvYywgQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQsIHNvdXJjZV9pbmRleCk7CisgICAgb3N0LT5zdHJlYW1fY29weSA9IDE7CisgICAgb3N0LT5maW5pc2hlZCAgICA9IDE7CisgICAgcmV0dXJuIG9zdDsKK30KKworc3RhdGljIE91dHB1dFN0cmVhbSAqbmV3X3N1YnRpdGxlX3N0cmVhbShPcHRpb25zQ29udGV4dCAqbywgQVZGb3JtYXRDb250ZXh0ICpvYywgaW50IHNvdXJjZV9pbmRleCkKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgT3V0cHV0U3RyZWFtICpvc3Q7CisgICAgQVZDb2RlY0NvbnRleHQgKnN1YnRpdGxlX2VuYzsKKworICAgIG9zdCA9IG5ld19vdXRwdXRfc3RyZWFtKG8sIG9jLCBBVk1FRElBX1RZUEVfU1VCVElUTEUsIHNvdXJjZV9pbmRleCk7CisgICAgc3QgID0gb3N0LT5zdDsKKyAgICBzdWJ0aXRsZV9lbmMgPSBvc3QtPmVuY19jdHg7CisKKyAgICBzdWJ0aXRsZV9lbmMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisKKyAgICBNQVRDSF9QRVJfU1RSRUFNX09QVChjb3B5X2luaXRpYWxfbm9ua2V5ZnJhbWVzLCBpLCBvc3QtPmNvcHlfaW5pdGlhbF9ub25rZXlmcmFtZXMsIG9jLCBzdCk7CisKKyAgICBpZiAoIW9zdC0+c3RyZWFtX2NvcHkpIHsKKyAgICAgICAgY2hhciAqZnJhbWVfc2l6ZSA9IE5VTEw7CisKKyAgICAgICAgTUFUQ0hfUEVSX1NUUkVBTV9PUFQoZnJhbWVfc2l6ZXMsIHN0ciwgZnJhbWVfc2l6ZSwgb2MsIHN0KTsKKyAgICAgICAgaWYgKGZyYW1lX3NpemUgJiYgYXZfcGFyc2VfdmlkZW9fc2l6ZSgmc3VidGl0bGVfZW5jLT53aWR0aCwgJnN1YnRpdGxlX2VuYy0+aGVpZ2h0LCBmcmFtZV9zaXplKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGZyYW1lIHNpemU6ICVzLlxuIiwgZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3N0OworfQorCisvKiBhcmcgZm9ybWF0IGlzICJvdXRwdXQtc3RyZWFtLWluZGV4OnN0cmVhbWlkLXZhbHVlIi4gKi8KK3N0YXRpYyBpbnQgb3B0X3N0cmVhbWlkKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7CisgICAgaW50IGlkeDsKKyAgICBjaGFyICpwOworICAgIGNoYXIgaWR4X3N0clsxNl07CisKKyAgICBhdl9zdHJsY3B5KGlkeF9zdHIsIGFyZywgc2l6ZW9mKGlkeF9zdHIpKTsKKyAgICBwID0gc3RyY2hyKGlkeF9zdHIsICc6Jyk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCisgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSAnJXMnIGZvciBvcHRpb24gJyVzJywgcmVxdWlyZWQgc3ludGF4IGlzICdpbmRleDp2YWx1ZSdcbiIsCisgICAgICAgICAgICAgICBhcmcsIG9wdCk7CisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB9CisgICAgKnArKyA9ICdcMCc7CisgICAgaWR4ID0gcGFyc2VfbnVtYmVyX29yX2RpZShvcHQsIGlkeF9zdHIsIE9QVF9JTlQsIDAsIE1BWF9TVFJFQU1TLTEpOworICAgIG8tPnN0cmVhbWlkX21hcCA9IGdyb3dfYXJyYXkoby0+c3RyZWFtaWRfbWFwLCBzaXplb2YoKm8tPnN0cmVhbWlkX21hcCksICZvLT5uYl9zdHJlYW1pZF9tYXAsIGlkeCsxKTsKKyAgICBvLT5zdHJlYW1pZF9tYXBbaWR4XSA9IHBhcnNlX251bWJlcl9vcl9kaWUob3B0LCBwLCBPUFRfSU5ULCAwLCBJTlRfTUFYKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb3B5X2NoYXB0ZXJzKElucHV0RmlsZSAqaWZpbGUsIE91dHB1dEZpbGUgKm9maWxlLCBpbnQgY29weV9tZXRhZGF0YSkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmlzID0gaWZpbGUtPmN0eDsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9zID0gb2ZpbGUtPmN0eDsKKyAgICBBVkNoYXB0ZXIgKip0bXA7CisgICAgaW50IGk7CisKKyAgICB0bXAgPSBhdl9yZWFsbG9jX2Yob3MtPmNoYXB0ZXJzLCBpcy0+bmJfY2hhcHRlcnMgKyBvcy0+bmJfY2hhcHRlcnMsIHNpemVvZigqb3MtPmNoYXB0ZXJzKSk7CisgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgb3MtPmNoYXB0ZXJzID0gdG1wOworCisgICAgZm9yIChpID0gMDsgaSA8IGlzLT5uYl9jaGFwdGVyczsgaSsrKSB7CisgICAgICAgIEFWQ2hhcHRlciAqaW5fY2ggPSBpcy0+Y2hhcHRlcnNbaV0sICpvdXRfY2g7CisgICAgICAgIGludDY0X3Qgc3RhcnRfdGltZSA9IChvZmlsZS0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgPyAwIDogb2ZpbGUtPnN0YXJ0X3RpbWU7CisgICAgICAgIGludDY0X3QgdHNfb2ZmICAgPSBhdl9yZXNjYWxlX3Eoc3RhcnRfdGltZSAtIGlmaWxlLT50c19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSwgaW5fY2gtPnRpbWVfYmFzZSk7CisgICAgICAgIGludDY0X3QgcnQgICAgICAgPSAob2ZpbGUtPnJlY29yZGluZ190aW1lID09IElOVDY0X01BWCkgPyBJTlQ2NF9NQVggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKG9maWxlLT5yZWNvcmRpbmdfdGltZSwgQVZfVElNRV9CQVNFX1EsIGluX2NoLT50aW1lX2Jhc2UpOworCisKKyAgICAgICAgaWYgKGluX2NoLT5lbmQgPCB0c19vZmYpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHJ0ICE9IElOVDY0X01BWCAmJiBpbl9jaC0+c3RhcnQgPiBydCArIHRzX29mZikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG91dF9jaCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWQ2hhcHRlcikpOworICAgICAgICBpZiAoIW91dF9jaCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgb3V0X2NoLT5pZCAgICAgICAgPSBpbl9jaC0+aWQ7CisgICAgICAgIG91dF9jaC0+dGltZV9iYXNlID0gaW5fY2gtPnRpbWVfYmFzZTsKKyAgICAgICAgb3V0X2NoLT5zdGFydCAgICAgPSBGRk1BWCgwLCAgaW5fY2gtPnN0YXJ0IC0gdHNfb2ZmKTsKKyAgICAgICAgb3V0X2NoLT5lbmQgICAgICAgPSBGRk1JTihydCwgaW5fY2gtPmVuZCAgIC0gdHNfb2ZmKTsKKworICAgICAgICBpZiAoY29weV9tZXRhZGF0YSkKKyAgICAgICAgICAgIGF2X2RpY3RfY29weSgmb3V0X2NoLT5tZXRhZGF0YSwgaW5fY2gtPm1ldGFkYXRhLCAwKTsKKworICAgICAgICBvcy0+Y2hhcHRlcnNbb3MtPm5iX2NoYXB0ZXJzKytdID0gb3V0X2NoOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdF9vdXRwdXRfZmlsdGVyKE91dHB1dEZpbHRlciAqb2ZpbHRlciwgT3B0aW9uc0NvbnRleHQgKm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpvYykKK3sKKyAgICBPdXRwdXRTdHJlYW0gKm9zdDsKKworICAgIHN3aXRjaCAob2ZpbHRlci0+dHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiBvc3QgPSBuZXdfdmlkZW9fc3RyZWFtKG8sIG9jLCAtMSk7IGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOiBvc3QgPSBuZXdfYXVkaW9fc3RyZWFtKG8sIG9jLCAtMSk7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJPbmx5IHZpZGVvIGFuZCBhdWRpbyBmaWx0ZXJzIGFyZSBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgImN1cnJlbnRseS5cbiIpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgb3N0LT5zb3VyY2VfaW5kZXggPSAtMTsKKyAgICBvc3QtPmZpbHRlciAgICAgICA9IG9maWx0ZXI7CisKKyAgICBvZmlsdGVyLT5vc3QgICAgICA9IG9zdDsKKyAgICBvZmlsdGVyLT5mb3JtYXQgICA9IC0xOworCisgICAgaWYgKG9zdC0+c3RyZWFtX2NvcHkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlN0cmVhbWNvcHkgcmVxdWVzdGVkIGZvciBvdXRwdXQgc3RyZWFtICVkOiVkLCAiCisgICAgICAgICAgICAgICAid2hpY2ggaXMgZmVkIGZyb20gYSBjb21wbGV4IGZpbHRlcmdyYXBoLiBGaWx0ZXJpbmcgYW5kIHN0cmVhbWNvcHkgIgorICAgICAgICAgICAgICAgImNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLlxuIiwgb3N0LT5maWxlX2luZGV4LCBvc3QtPmluZGV4KTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGlmIChvc3QtPmF2ZmlsdGVyICYmIChvc3QtPmZpbHRlcnMgfHwgb3N0LT5maWx0ZXJzX3NjcmlwdCkpIHsKKyAgICAgICAgY29uc3QgY2hhciAqb3B0ID0gb3N0LT5maWx0ZXJzID8gIi12Zi8tYWYvLWZpbHRlciIgOiAiLWZpbHRlcl9zY3JpcHQiOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzICclcycgd2FzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSAlcyBvcHRpb24gIgorICAgICAgICAgICAgICAgImZvciBvdXRwdXQgc3RyZWFtICVkOiVkLCB3aGljaCBpcyBmZWQgZnJvbSBhIGNvbXBsZXggZmlsdGVyZ3JhcGguXG4iCisgICAgICAgICAgICAgICAiJXMgYW5kIC1maWx0ZXJfY29tcGxleCBjYW5ub3QgYmUgdXNlZCB0b2dldGhlciBmb3IgdGhlIHNhbWUgc3RyZWFtLlxuIiwKKyAgICAgICAgICAgICAgIG9zdC0+ZmlsdGVycyA/ICJGaWx0ZXJncmFwaCIgOiAiRmlsdGVyZ3JhcGggc2NyaXB0IiwKKyAgICAgICAgICAgICAgIG9zdC0+ZmlsdGVycyA/IG9zdC0+ZmlsdGVycyA6IG9zdC0+ZmlsdGVyc19zY3JpcHQsCisgICAgICAgICAgICAgICBvcHQsIG9zdC0+ZmlsZV9pbmRleCwgb3N0LT5pbmRleCwgb3B0KTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGF2ZmlsdGVyX2lub3V0X2ZyZWUoJm9maWx0ZXItPm91dF90bXApOworfQorCitzdGF0aWMgaW50IGluaXRfY29tcGxleF9maWx0ZXJzKHZvaWQpCit7CisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZmlsdGVyZ3JhcGhzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gaW5pdF9jb21wbGV4X2ZpbHRlcmdyYXBoKGZpbHRlcmdyYXBoc1tpXSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9vdXRwdXRfZmlsZShPcHRpb25zQ29udGV4dCAqbywgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYzsKKyAgICBpbnQgaSwgaiwgZXJyOworICAgIE91dHB1dEZpbGUgKm9mOworICAgIE91dHB1dFN0cmVhbSAqb3N0OworICAgIElucHV0U3RyZWFtICAqaXN0OworICAgIEFWRGljdGlvbmFyeSAqdW51c2VkX29wdHMgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICplID0gTlVMTDsKKyAgICBpbnQgZm9ybWF0X2ZsYWdzID0gMDsKKworICAgIGlmIChvLT5zdG9wX3RpbWUgIT0gSU5UNjRfTUFYICYmIG8tPnJlY29yZGluZ190aW1lICE9IElOVDY0X01BWCkgeworICAgICAgICBvLT5zdG9wX3RpbWUgPSBJTlQ2NF9NQVg7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIi10IGFuZCAtdG8gY2Fubm90IGJlIHVzZWQgdG9nZXRoZXI7IHVzaW5nIC10LlxuIik7CisgICAgfQorCisgICAgaWYgKG8tPnN0b3BfdGltZSAhPSBJTlQ2NF9NQVggJiYgby0+cmVjb3JkaW5nX3RpbWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgIGludDY0X3Qgc3RhcnRfdGltZSA9IG8tPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUgPyAwIDogby0+c3RhcnRfdGltZTsKKyAgICAgICAgaWYgKG8tPnN0b3BfdGltZSA8PSBzdGFydF90aW1lKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiLXRvIHZhbHVlIHNtYWxsZXIgdGhhbiAtc3M7IGFib3J0aW5nLlxuIik7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvLT5yZWNvcmRpbmdfdGltZSA9IG8tPnN0b3BfdGltZSAtIHN0YXJ0X3RpbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBHUk9XX0FSUkFZKG91dHB1dF9maWxlcywgbmJfb3V0cHV0X2ZpbGVzKTsKKyAgICBvZiA9IGF2X21hbGxvY3ooc2l6ZW9mKCpvZikpOworICAgIGlmICghb2YpCisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICBvdXRwdXRfZmlsZXNbbmJfb3V0cHV0X2ZpbGVzIC0gMV0gPSBvZjsKKworICAgIG9mLT5vc3RfaW5kZXggICAgICA9IG5iX291dHB1dF9zdHJlYW1zOworICAgIG9mLT5yZWNvcmRpbmdfdGltZSA9IG8tPnJlY29yZGluZ190aW1lOworICAgIG9mLT5zdGFydF90aW1lICAgICA9IG8tPnN0YXJ0X3RpbWU7CisgICAgb2YtPmxpbWl0X2ZpbGVzaXplID0gby0+bGltaXRfZmlsZXNpemU7CisgICAgb2YtPnNob3J0ZXN0ICAgICAgID0gby0+c2hvcnRlc3Q7CisgICAgYXZfZGljdF9jb3B5KCZvZi0+b3B0cywgby0+Zy0+Zm9ybWF0X29wdHMsIDApOworCisgICAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICItIikpCisgICAgICAgIGZpbGVuYW1lID0gInBpcGU6IjsKKworICAgIGVyciA9IGF2Zm9ybWF0X2FsbG9jX291dHB1dF9jb250ZXh0Migmb2MsIE5VTEwsIG8tPmZvcm1hdCwgZmlsZW5hbWUpOworICAgIGlmICghb2MpIHsKKyAgICAgICAgcHJpbnRfZXJyb3IoZmlsZW5hbWUsIGVycik7CisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB9CisKKyAgICBvZi0+Y3R4ID0gb2M7CisgICAgaWYgKG8tPnJlY29yZGluZ190aW1lICE9IElOVDY0X01BWCkKKyAgICAgICAgb2MtPmR1cmF0aW9uID0gby0+cmVjb3JkaW5nX3RpbWU7CisKKyAgICBvYy0+aW50ZXJydXB0X2NhbGxiYWNrID0gaW50X2NiOworCisgICAgZSA9IGF2X2RpY3RfZ2V0KG8tPmctPmZvcm1hdF9vcHRzLCAiZmZsYWdzIiwgTlVMTCwgMCk7CisgICAgaWYgKGUpIHsKKyAgICAgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZChvYywgImZmbGFncyIsIE5VTEwsIDAsIDApOworICAgICAgICBhdl9vcHRfZXZhbF9mbGFncyhvYywgbywgZS0+dmFsdWUsICZmb3JtYXRfZmxhZ3MpOworICAgIH0KKyAgICBpZiAoby0+Yml0ZXhhY3QpIHsKKyAgICAgICAgZm9ybWF0X2ZsYWdzIHw9IEFWRk1UX0ZMQUdfQklURVhBQ1Q7CisgICAgICAgIG9jLT5mbGFncyAgICB8PSBBVkZNVF9GTEFHX0JJVEVYQUNUOworICAgIH0KKworICAgIC8qIGNyZWF0ZSBzdHJlYW1zIGZvciBhbGwgdW5sYWJlbGVkIG91dHB1dCBwYWRzICovCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2ZpbHRlcmdyYXBoczsgaSsrKSB7CisgICAgICAgIEZpbHRlckdyYXBoICpmZyA9IGZpbHRlcmdyYXBoc1tpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZnLT5uYl9vdXRwdXRzOyBqKyspIHsKKyAgICAgICAgICAgIE91dHB1dEZpbHRlciAqb2ZpbHRlciA9IGZnLT5vdXRwdXRzW2pdOworCisgICAgICAgICAgICBpZiAoIW9maWx0ZXItPm91dF90bXAgfHwgb2ZpbHRlci0+b3V0X3RtcC0+bmFtZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgc3dpdGNoIChvZmlsdGVyLT50eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzogICAgby0+dmlkZW9fZGlzYWJsZSAgICA9IDE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86ICAgIG8tPmF1ZGlvX2Rpc2FibGUgICAgPSAxOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOiBvLT5zdWJ0aXRsZV9kaXNhYmxlID0gMTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbml0X291dHB1dF9maWx0ZXIob2ZpbHRlciwgbywgb2MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFvLT5uYl9zdHJlYW1fbWFwcykgeworICAgICAgICBjaGFyICpzdWJ0aXRsZV9jb2RlY19uYW1lID0gTlVMTDsKKyAgICAgICAgLyogcGljayB0aGUgImJlc3QiIHN0cmVhbSBvZiBlYWNoIHR5cGUgKi8KKworICAgICAgICAvKiB2aWRlbzogaGlnaGVzdCByZXNvbHV0aW9uICovCisgICAgICAgIGlmICghby0+dmlkZW9fZGlzYWJsZSAmJiBhdl9ndWVzc19jb2RlYyhvYy0+b2Zvcm1hdCwgTlVMTCwgZmlsZW5hbWUsIE5VTEwsIEFWTUVESUFfVFlQRV9WSURFTykgIT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgaW50IGFyZWEgPSAwLCBpZHggPSAtMTsKKyAgICAgICAgICAgIGludCBxY3IgPSBhdmZvcm1hdF9xdWVyeV9jb2RlYyhvYy0+b2Zvcm1hdCwgb2MtPm9mb3JtYXQtPnZpZGVvX2NvZGVjLCAwKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3X2FyZWE7CisgICAgICAgICAgICAgICAgaXN0ID0gaW5wdXRfc3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICBuZXdfYXJlYSA9IGlzdC0+c3QtPmNvZGVjcGFyLT53aWR0aCAqIGlzdC0+c3QtPmNvZGVjcGFyLT5oZWlnaHQgKyAxMDAwMDAwMDAqISFpc3QtPnN0LT5jb2RlY19pbmZvX25iX2ZyYW1lczsKKyAgICAgICAgICAgICAgICBpZigocWNyIT1NS1RBRygnQScsICdQJywgJ0knLCAnQycpKSAmJiAoaXN0LT5zdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMpKQorICAgICAgICAgICAgICAgICAgICBuZXdfYXJlYSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGlzdC0+c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgICAgICAgICBuZXdfYXJlYSA+IGFyZWEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKHFjcj09TUtUQUcoJ0EnLCAnUCcsICdJJywgJ0MnKSkgJiYgIShpc3QtPnN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgYXJlYSA9IG5ld19hcmVhOworICAgICAgICAgICAgICAgICAgICBpZHggPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZHggPj0gMCkKKyAgICAgICAgICAgICAgICBuZXdfdmlkZW9fc3RyZWFtKG8sIG9jLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgLyogYXVkaW86IG1vc3QgY2hhbm5lbHMgKi8KKyAgICAgICAgaWYgKCFvLT5hdWRpb19kaXNhYmxlICYmIGF2X2d1ZXNzX2NvZGVjKG9jLT5vZm9ybWF0LCBOVUxMLCBmaWxlbmFtZSwgTlVMTCwgQVZNRURJQV9UWVBFX0FVRElPKSAhPSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgICAgICBpbnQgYmVzdF9zY29yZSA9IDAsIGlkeCA9IC0xOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2lucHV0X3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBzY29yZTsKKyAgICAgICAgICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIHNjb3JlID0gaXN0LT5zdC0+Y29kZWNwYXItPmNoYW5uZWxzICsgMTAwMDAwMDAwKiEhaXN0LT5zdC0+Y29kZWNfaW5mb19uYl9mcmFtZXM7CisgICAgICAgICAgICAgICAgaWYgKGlzdC0+c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgICAgICBzY29yZSA+IGJlc3Rfc2NvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOworICAgICAgICAgICAgICAgICAgICBpZHggPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpZHggPj0gMCkKKyAgICAgICAgICAgICAgICBuZXdfYXVkaW9fc3RyZWFtKG8sIG9jLCBpZHgpOworICAgICAgICB9CisKKyAgICAgICAgLyogc3VidGl0bGVzOiBwaWNrIGZpcnN0ICovCisgICAgICAgIE1BVENIX1BFUl9UWVBFX09QVChjb2RlY19uYW1lcywgc3RyLCBzdWJ0aXRsZV9jb2RlY19uYW1lLCBvYywgInMiKTsKKyAgICAgICAgaWYgKCFvLT5zdWJ0aXRsZV9kaXNhYmxlICYmIChhdmNvZGVjX2ZpbmRfZW5jb2RlcihvYy0+b2Zvcm1hdC0+c3VidGl0bGVfY29kZWMpIHx8IHN1YnRpdGxlX2NvZGVjX25hbWUpKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW5wdXRfc3RyZWFtczsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChpbnB1dF9zdHJlYW1zW2ldLT5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNEZXNjcmlwdG9yIGNvbnN0ICppbnB1dF9kZXNjcmlwdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoaW5wdXRfc3RyZWFtc1tpXS0+c3QtPmNvZGVjcGFyLT5jb2RlY19pZCk7CisgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNEZXNjcmlwdG9yIGNvbnN0ICpvdXRwdXRfZGVzY3JpcHRvciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIEFWQ29kZWMgY29uc3QgKm91dHB1dF9jb2RlYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2ZpbmRfZW5jb2RlcihvYy0+b2Zvcm1hdC0+c3VidGl0bGVfY29kZWMpOworICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRfcHJvcHMgPSAwLCBvdXRwdXRfcHJvcHMgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0X2NvZGVjKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rlc2NyaXB0b3IgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KG91dHB1dF9jb2RlYy0+aWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXRfZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3Byb3BzID0gaW5wdXRfZGVzY3JpcHRvci0+cHJvcHMgJiAoQVZfQ09ERUNfUFJPUF9URVhUX1NVQiB8IEFWX0NPREVDX1BST1BfQklUTUFQX1NVQik7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRfZGVzY3JpcHRvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9wcm9wcyA9IG91dHB1dF9kZXNjcmlwdG9yLT5wcm9wcyAmIChBVl9DT0RFQ19QUk9QX1RFWFRfU1VCIHwgQVZfQ09ERUNfUFJPUF9CSVRNQVBfU1VCKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlX2NvZGVjX25hbWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3Byb3BzICYgb3V0cHV0X3Byb3BzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXAgZHZiIHRlbGV0ZXh0IHdoaWNoIGhhcyBuZWl0aGVyIHByb3BlcnR5IHRvIGFueSBvdXRwdXQgc3VidGl0bGUgZW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZGVzY3JpcHRvciAmJiBvdXRwdXRfZGVzY3JpcHRvciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCFpbnB1dF9kZXNjcmlwdG9yLT5wcm9wcyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICFvdXRwdXRfZGVzY3JpcHRvci0+cHJvcHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfc3VidGl0bGVfc3RyZWFtKG8sIG9jLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIERhdGEgb25seSBpZiBjb2RlYyBpZCBtYXRjaCAqLworICAgICAgICBpZiAoIW8tPmRhdGFfZGlzYWJsZSApIHsKKyAgICAgICAgICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkID0gYXZfZ3Vlc3NfY29kZWMob2MtPm9mb3JtYXQsIE5VTEwsIGZpbGVuYW1lLCBOVUxMLCBBVk1FRElBX1RZUEVfREFUQSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FICYmIGkgPCBuYl9pbnB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRfc3RyZWFtc1tpXS0+c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBCisgICAgICAgICAgICAgICAgICAgICYmIGlucHV0X3N0cmVhbXNbaV0tPnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gY29kZWNfaWQgKQorICAgICAgICAgICAgICAgICAgICBuZXdfZGF0YV9zdHJlYW0obywgb2MsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG8tPm5iX3N0cmVhbV9tYXBzOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmVhbU1hcCAqbWFwID0gJm8tPnN0cmVhbV9tYXBzW2ldOworCisgICAgICAgICAgICBpZiAobWFwLT5kaXNhYmxlZCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKG1hcC0+bGlua2xhYmVsKSB7CisgICAgICAgICAgICAgICAgRmlsdGVyR3JhcGggKmZnOworICAgICAgICAgICAgICAgIE91dHB1dEZpbHRlciAqb2ZpbHRlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW50IGosIGs7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmJfZmlsdGVyZ3JhcGhzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmcgPSBmaWx0ZXJncmFwaHNbal07CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBmZy0+bmJfb3V0cHV0czsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckluT3V0ICpvdXQgPSBmZy0+b3V0cHV0c1trXS0+b3V0X3RtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXQgJiYgIXN0cmNtcChvdXQtPm5hbWUsIG1hcC0+bGlua2xhYmVsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9maWx0ZXIgPSBmZy0+b3V0cHV0c1trXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGxvb3BfZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorbG9vcF9lbmQ6CisgICAgICAgICAgICAgICAgaWYgKCFvZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJPdXRwdXQgd2l0aCBsYWJlbCAnJXMnIGRvZXMgbm90IGV4aXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBhbnkgZGVmaW5lZCBmaWx0ZXIgZ3JhcGgsIG9yIHdhcyBhbHJlYWR5IHVzZWQgZWxzZXdoZXJlLlxuIiwgbWFwLT5saW5rbGFiZWwpOworICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluaXRfb3V0cHV0X2ZpbHRlcihvZmlsdGVyLCBvLCBvYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBzcmNfaWR4ID0gaW5wdXRfZmlsZXNbbWFwLT5maWxlX2luZGV4XS0+aXN0X2luZGV4ICsgbWFwLT5zdHJlYW1faW5kZXg7CisKKyAgICAgICAgICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW2lucHV0X2ZpbGVzW21hcC0+ZmlsZV9pbmRleF0tPmlzdF9pbmRleCArIG1hcC0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgICAgICBpZihvLT5zdWJ0aXRsZV9kaXNhYmxlICYmIGlzdC0+c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYoby0+ICAgYXVkaW9fZGlzYWJsZSAmJiBpc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmKG8tPiAgIHZpZGVvX2Rpc2FibGUgJiYgaXN0LT5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZihvLT4gICAgZGF0YV9kaXNhYmxlICYmIGlzdC0+c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIG9zdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgc3dpdGNoIChpc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiAgICAgIG9zdCA9IG5ld192aWRlb19zdHJlYW0gICAgIChvLCBvYywgc3JjX2lkeCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOiAgICAgIG9zdCA9IG5ld19hdWRpb19zdHJlYW0gICAgIChvLCBvYywgc3JjX2lkeCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOiAgIG9zdCA9IG5ld19zdWJ0aXRsZV9zdHJlYW0gIChvLCBvYywgc3JjX2lkeCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0RBVEE6ICAgICAgIG9zdCA9IG5ld19kYXRhX3N0cmVhbSAgICAgIChvLCBvYywgc3JjX2lkeCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ6IG9zdCA9IG5ld19hdHRhY2htZW50X3N0cmVhbShvLCBvYywgc3JjX2lkeCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1VOS05PV046CisgICAgICAgICAgICAgICAgICAgIGlmIChjb3B5X3Vua25vd25fc3RyZWFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3N0ID0gbmV3X3Vua25vd25fc3RyZWFtICAgKG8sIG9jLCBzcmNfaWR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIGlnbm9yZV91bmtub3duX3N0cmVhbXMgPyBBVl9MT0dfV0FSTklORyA6IEFWX0xPR19GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgbWFwIHN0cmVhbSAjJWQ6JWQgLSB1bnN1cHBvcnRlZCB0eXBlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC0+ZmlsZV9pbmRleCwgbWFwLT5zdHJlYW1faW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWlnbm9yZV91bmtub3duX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklmIHlvdSB3YW50IHVuc3VwcG9ydGVkIHR5cGVzIGlnbm9yZWQgaW5zdGVhZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIGZhaWxpbmcsIHBsZWFzZSB1c2UgdGhlIC1pZ25vcmVfdW5rbm93biBvcHRpb25cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWYgeW91IHdhbnQgdGhlbSBjb3BpZWQsIHBsZWFzZSB1c2UgLWNvcHlfdW5rbm93blxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9zdCkKKyAgICAgICAgICAgICAgICAgICAgb3N0LT5zeW5jX2lzdCA9IGlucHV0X3N0cmVhbXNbICBpbnB1dF9maWxlc1ttYXAtPnN5bmNfZmlsZV9pbmRleF0tPmlzdF9pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1hcC0+c3luY19zdHJlYW1faW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogaGFuZGxlIGF0dGFjaGVkIGZpbGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IG8tPm5iX2F0dGFjaG1lbnRzOyBpKyspIHsKKyAgICAgICAgQVZJT0NvbnRleHQgKnBiOworICAgICAgICB1aW50OF90ICphdHRhY2htZW50OworICAgICAgICBjb25zdCBjaGFyICpwOworICAgICAgICBpbnQ2NF90IGxlbjsKKworICAgICAgICBpZiAoKGVyciA9IGF2aW9fb3BlbjIoJnBiLCBvLT5hdHRhY2htZW50c1tpXSwgQVZJT19GTEFHX1JFQUQsICZpbnRfY2IsIE5VTEwpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3Qgb3BlbiBhdHRhY2htZW50IGZpbGUgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIG8tPmF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGxlbiA9IGF2aW9fc2l6ZShwYikpIDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJDb3VsZCBub3QgZ2V0IHNpemUgb2YgdGhlIGF0dGFjaG1lbnQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIG8tPmF0dGFjaG1lbnRzW2ldKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShhdHRhY2htZW50ID0gYXZfbWFsbG9jKGxlbikpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQXR0YWNobWVudCAlcyB0b28gbGFyZ2UgdG8gZml0IGludG8gbWVtb3J5LlxuIiwKKyAgICAgICAgICAgICAgICAgICBvLT5hdHRhY2htZW50c1tpXSk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19yZWFkKHBiLCBhdHRhY2htZW50LCBsZW4pOworCisgICAgICAgIG9zdCA9IG5ld19hdHRhY2htZW50X3N0cmVhbShvLCBvYywgLTEpOworICAgICAgICBvc3QtPnN0cmVhbV9jb3B5ICAgICAgICAgICAgICAgPSAwOworICAgICAgICBvc3QtPmF0dGFjaG1lbnRfZmlsZW5hbWUgICAgICAgPSBvLT5hdHRhY2htZW50c1tpXTsKKyAgICAgICAgb3N0LT5zdC0+Y29kZWNwYXItPmV4dHJhZGF0YSAgICAgID0gYXR0YWNobWVudDsKKyAgICAgICAgb3N0LT5zdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gbGVuOworCisgICAgICAgIHAgPSBzdHJyY2hyKG8tPmF0dGFjaG1lbnRzW2ldLCAnLycpOworICAgICAgICBhdl9kaWN0X3NldCgmb3N0LT5zdC0+bWV0YWRhdGEsICJmaWxlbmFtZSIsIChwICYmICpwKSA/IHAgKyAxIDogby0+YXR0YWNobWVudHNbaV0sIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOworICAgICAgICBhdmlvX2Nsb3NlcCgmcGIpOworICAgIH0KKworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgZm9yIChpID0gbmJfb3V0cHV0X3N0cmVhbXMgLSBvYy0+bmJfc3RyZWFtczsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsgLy9mb3IgYWxsIHN0cmVhbXMgb2YgdGhpcyBvdXRwdXQgZmlsZQorICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZTsKKyAgICAgICAgb3N0ID0gb3V0cHV0X3N0cmVhbXNbaV07CisKKyAgICAgICAgaWYgKChvc3QtPnN0cmVhbV9jb3B5IHx8IG9zdC0+YXR0YWNobWVudF9maWxlbmFtZSkKKyAgICAgICAgICAgICYmIChlID0gYXZfZGljdF9nZXQoby0+Zy0+Y29kZWNfb3B0cywgImZsYWdzIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkKKyAgICAgICAgICAgICYmICghZS0+a2V5WzVdIHx8IGNoZWNrX3N0cmVhbV9zcGVjaWZpZXIob2MsIG9zdC0+c3QsIGUtPmtleSs2KSkpCisgICAgICAgICAgICBpZiAoYXZfb3B0X3NldChvc3QtPnN0LT5jb2RlYywgImZsYWdzIiwgZS0+dmFsdWUsIDApIDwgMCkKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIW9jLT5uYl9zdHJlYW1zICYmICEob2MtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9TVFJFQU1TKSkgeworICAgICAgICBhdl9kdW1wX2Zvcm1hdChvYywgbmJfb3V0cHV0X2ZpbGVzIC0gMSwgb2MtPnVybCwgMSk7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJPdXRwdXQgZmlsZSAjJWQgZG9lcyBub3QgY29udGFpbiBhbnkgc3RyZWFtXG4iLCBuYl9vdXRwdXRfZmlsZXMgLSAxKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIC8qIGNoZWNrIGlmIGFsbCBjb2RlYyBvcHRpb25zIGhhdmUgYmVlbiB1c2VkICovCisgICAgdW51c2VkX29wdHMgPSBzdHJpcF9zcGVjaWZpZXJzKG8tPmctPmNvZGVjX29wdHMpOworICAgIGZvciAoaSA9IG9mLT5vc3RfaW5kZXg7IGkgPCBuYl9vdXRwdXRfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGUgPSBOVUxMOworICAgICAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldChvdXRwdXRfc3RyZWFtc1tpXS0+ZW5jb2Rlcl9vcHRzLCAiIiwgZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmdW51c2VkX29wdHMsIGUtPmtleSwgTlVMTCwgMCk7CisgICAgfQorCisgICAgZSA9IE5VTEw7CisgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQodW51c2VkX29wdHMsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICBjb25zdCBBVkNsYXNzICpjbGFzcyA9IGF2Y29kZWNfZ2V0X2NsYXNzKCk7CisgICAgICAgIGNvbnN0IEFWT3B0aW9uICpvcHRpb24gPSBhdl9vcHRfZmluZCgmY2xhc3MsIGUtPmtleSwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4gfCBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKTsKKyAgICAgICAgY29uc3QgQVZDbGFzcyAqZmNsYXNzID0gYXZmb3JtYXRfZ2V0X2NsYXNzKCk7CisgICAgICAgIGNvbnN0IEFWT3B0aW9uICpmb3B0aW9uID0gYXZfb3B0X2ZpbmQoJmZjbGFzcywgZS0+a2V5LCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4gfCBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKKTsKKyAgICAgICAgaWYgKCFvcHRpb24gfHwgZm9wdGlvbikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisKKyAgICAgICAgaWYgKCEob3B0aW9uLT5mbGFncyAmIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNKSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvZGVjIEFWT3B0aW9uICVzICglcykgc3BlY2lmaWVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgIm91dHB1dCBmaWxlICMlZCAoJXMpIGlzIG5vdCBhbiBlbmNvZGluZyBvcHRpb24uXG4iLCBlLT5rZXksCisgICAgICAgICAgICAgICAgICAgb3B0aW9uLT5oZWxwID8gb3B0aW9uLT5oZWxwIDogIiIsIG5iX291dHB1dF9maWxlcyAtIDEsCisgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ29wX3RpbWVjb2RlIGlzIGluamVjdGVkIGJ5IGdlbmVyaWMgY29kZSBidXQgbm90IGFsd2F5cyB1c2VkCisgICAgICAgIGlmICghc3RyY21wKGUtPmtleSwgImdvcF90aW1lY29kZSIpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiQ29kZWMgQVZPcHRpb24gJXMgKCVzKSBzcGVjaWZpZWQgZm9yICIKKyAgICAgICAgICAgICAgICJvdXRwdXQgZmlsZSAjJWQgKCVzKSBoYXMgbm90IGJlZW4gdXNlZCBmb3IgYW55IHN0cmVhbS4gVGhlIG1vc3QgIgorICAgICAgICAgICAgICAgImxpa2VseSByZWFzb24gaXMgZWl0aGVyIHdyb25nIHR5cGUgKGUuZy4gYSB2aWRlbyBvcHRpb24gd2l0aCAiCisgICAgICAgICAgICAgICAibm8gdmlkZW8gc3RyZWFtcykgb3IgdGhhdCBpdCBpcyBhIHByaXZhdGUgb3B0aW9uIG9mIHNvbWUgZW5jb2RlciAiCisgICAgICAgICAgICAgICAid2hpY2ggd2FzIG5vdCBhY3R1YWxseSB1c2VkIGZvciBhbnkgc3RyZWFtLlxuIiwgZS0+a2V5LAorICAgICAgICAgICAgICAgb3B0aW9uLT5oZWxwID8gb3B0aW9uLT5oZWxwIDogIiIsIG5iX291dHB1dF9maWxlcyAtIDEsIGZpbGVuYW1lKTsKKyAgICB9CisgICAgYXZfZGljdF9mcmVlKCZ1bnVzZWRfb3B0cyk7CisKKyAgICAvKiBzZXQgdGhlIGRlY29kaW5nX25lZWRlZCBmbGFncyBhbmQgY3JlYXRlIHNpbXBsZSBmaWx0ZXJncmFwaHMgKi8KKyAgICBmb3IgKGkgPSBvZi0+b3N0X2luZGV4OyBpIDwgbmJfb3V0cHV0X3N0cmVhbXM7IGkrKykgeworICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCA9IG91dHB1dF9zdHJlYW1zW2ldOworCisgICAgICAgIGlmIChvc3QtPmVuY29kaW5nX25lZWRlZCAmJiBvc3QtPnNvdXJjZV9pbmRleCA+PSAwKSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSAqaXN0ID0gaW5wdXRfc3RyZWFtc1tvc3QtPnNvdXJjZV9pbmRleF07CisgICAgICAgICAgICBpc3QtPmRlY29kaW5nX25lZWRlZCB8PSBERUNPRElOR19GT1JfT1NUOworCisgICAgICAgICAgICBpZiAob3N0LT5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICAgICAgICAgb3N0LT5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAgICAgZXJyID0gaW5pdF9zaW1wbGVfZmlsdGVyZ3JhcGgoaXN0LCBvc3QpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW5pdGlhbGl6aW5nIGEgc2ltcGxlIGZpbHRlcmdyYXBoIGJldHdlZW4gc3RyZWFtcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWQ6JWQtPiVkOiVkXG4iLCBpc3QtPmZpbGVfaW5kZXgsIG9zdC0+c291cmNlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfb3V0cHV0X2ZpbGVzIC0gMSwgb3N0LT5zdC0+aW5kZXgpOworICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogc2V0IHRoZSBmaWx0ZXIgb3V0cHV0IGNvbnN0cmFpbnRzICovCisgICAgICAgIGlmIChvc3QtPmZpbHRlcikgeworICAgICAgICAgICAgT3V0cHV0RmlsdGVyICpmID0gb3N0LT5maWx0ZXI7CisgICAgICAgICAgICBpbnQgY291bnQ7CisgICAgICAgICAgICBzd2l0Y2ggKG9zdC0+ZW5jX2N0eC0+Y29kZWNfdHlwZSkgeworICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICAgICAgZi0+ZnJhbWVfcmF0ZSA9IG9zdC0+ZnJhbWVfcmF0ZTsKKyAgICAgICAgICAgICAgICBmLT53aWR0aCAgICAgID0gb3N0LT5lbmNfY3R4LT53aWR0aDsKKyAgICAgICAgICAgICAgICBmLT5oZWlnaHQgICAgID0gb3N0LT5lbmNfY3R4LT5oZWlnaHQ7CisgICAgICAgICAgICAgICAgaWYgKG9zdC0+ZW5jX2N0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgZi0+Zm9ybWF0ID0gb3N0LT5lbmNfY3R4LT5waXhfZm10OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3N0LT5lbmMtPnBpeF9mbXRzKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9zdC0+ZW5jLT5waXhfZm10c1tjb3VudF0gIT0gQVZfUElYX0ZNVF9OT05FKQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgZi0+Zm9ybWF0cyA9IGF2X21hbGxvY3pfYXJyYXkoY291bnQgKyAxLCBzaXplb2YoKmYtPmZvcm1hdHMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLT5mb3JtYXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZi0+Zm9ybWF0cywgb3N0LT5lbmMtPnBpeF9mbXRzLCAoY291bnQgKyAxKSAqIHNpemVvZigqZi0+Zm9ybWF0cykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgICAgIGlmIChvc3QtPmVuY19jdHgtPnNhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9OT05FKSB7CisgICAgICAgICAgICAgICAgICAgIGYtPmZvcm1hdCA9IG9zdC0+ZW5jX2N0eC0+c2FtcGxlX2ZtdDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9zdC0+ZW5jLT5zYW1wbGVfZm10cykgeworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvc3QtPmVuYy0+c2FtcGxlX2ZtdHNbY291bnRdICE9IEFWX1NBTVBMRV9GTVRfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGYtPmZvcm1hdHMgPSBhdl9tYWxsb2N6X2FycmF5KGNvdW50ICsgMSwgc2l6ZW9mKCpmLT5mb3JtYXRzKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZi0+Zm9ybWF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGYtPmZvcm1hdHMsIG9zdC0+ZW5jLT5zYW1wbGVfZm10cywgKGNvdW50ICsgMSkgKiBzaXplb2YoKmYtPmZvcm1hdHMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9zdC0+ZW5jX2N0eC0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZi0+c2FtcGxlX3JhdGUgPSBvc3QtPmVuY19jdHgtPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3N0LT5lbmMtPnN1cHBvcnRlZF9zYW1wbGVyYXRlcykgeworICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvc3QtPmVuYy0+c3VwcG9ydGVkX3NhbXBsZXJhdGVzW2NvdW50XSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGYtPnNhbXBsZV9yYXRlcyA9IGF2X21hbGxvY3pfYXJyYXkoY291bnQgKyAxLCBzaXplb2YoKmYtPnNhbXBsZV9yYXRlcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWYtPnNhbXBsZV9yYXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGYtPnNhbXBsZV9yYXRlcywgb3N0LT5lbmMtPnN1cHBvcnRlZF9zYW1wbGVyYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb3VudCArIDEpICogc2l6ZW9mKCpmLT5zYW1wbGVfcmF0ZXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG9zdC0+ZW5jX2N0eC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZi0+Y2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChvc3QtPmVuY19jdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9zdC0+ZW5jLT5jaGFubmVsX2xheW91dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3N0LT5lbmMtPmNoYW5uZWxfbGF5b3V0c1tjb3VudF0pCisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgICAgICBmLT5jaGFubmVsX2xheW91dHMgPSBhdl9tYWxsb2N6X2FycmF5KGNvdW50ICsgMSwgc2l6ZW9mKCpmLT5jaGFubmVsX2xheW91dHMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmLT5jaGFubmVsX2xheW91dHMpCisgICAgICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShmLT5jaGFubmVsX2xheW91dHMsIG9zdC0+ZW5jLT5jaGFubmVsX2xheW91dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnQgKyAxKSAqIHNpemVvZigqZi0+Y2hhbm5lbF9sYXlvdXRzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogY2hlY2sgZmlsZW5hbWUgaW4gY2FzZSBvZiBhbiBpbWFnZSBudW1iZXIgaXMgZXhwZWN0ZWQgKi8KKyAgICBpZiAob2MtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTkVFRE5VTUJFUikgeworICAgICAgICBpZiAoIWF2X2ZpbGVuYW1lX251bWJlcl90ZXN0KG9jLT51cmwpKSB7CisgICAgICAgICAgICBwcmludF9lcnJvcihvYy0+dXJsLCBBVkVSUk9SKEVJTlZBTCkpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCEob2MtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9TVFJFQU1TKSAmJiAhaW5wdXRfc3RyZWFtX3BvdGVudGlhbGx5X2F2YWlsYWJsZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vIGlucHV0IHN0cmVhbXMgYnV0IG91dHB1dCBuZWVkcyBhbiBpbnB1dCBzdHJlYW1cbiIpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgaWYgKCEob2MtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSkgeworICAgICAgICAvKiB0ZXN0IGlmIGl0IGFscmVhZHkgZXhpc3RzIHRvIGF2b2lkIGxvc2luZyBwcmVjaW91cyBmaWxlcyAqLworICAgICAgICBhc3NlcnRfZmlsZV9vdmVyd3JpdGUoZmlsZW5hbWUpOworCisgICAgICAgIC8qIG9wZW4gdGhlIGZpbGUgKi8KKyAgICAgICAgaWYgKChlcnIgPSBhdmlvX29wZW4yKCZvYy0+cGIsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2MtPmludGVycnVwdF9jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvZi0+b3B0cykpIDwgMCkgeworICAgICAgICAgICAgcHJpbnRfZXJyb3IoZmlsZW5hbWUsIGVycik7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN0cmNtcChvYy0+b2Zvcm1hdC0+bmFtZSwgImltYWdlMiIpPT0wICYmICFhdl9maWxlbmFtZV9udW1iZXJfdGVzdChmaWxlbmFtZSkpCisgICAgICAgIGFzc2VydF9maWxlX292ZXJ3cml0ZShmaWxlbmFtZSk7CisKKyAgICBpZiAoby0+bXV4X3ByZWxvYWQpIHsKKyAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvZi0+b3B0cywgInByZWxvYWQiLCBvLT5tdXhfcHJlbG9hZCpBVl9USU1FX0JBU0UsIDApOworICAgIH0KKyAgICBvYy0+bWF4X2RlbGF5ID0gKGludCkoby0+bXV4X21heF9kZWxheSAqIEFWX1RJTUVfQkFTRSk7CisKKyAgICAvKiBjb3B5IG1ldGFkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IG8tPm5iX21ldGFkYXRhX21hcDsgaSsrKSB7CisgICAgICAgIGNoYXIgKnA7CisgICAgICAgIGludCBpbl9maWxlX2luZGV4ID0gc3RydG9sKG8tPm1ldGFkYXRhX21hcFtpXS51LnN0ciwgJnAsIDApOworCisgICAgICAgIGlmIChpbl9maWxlX2luZGV4ID49IG5iX2lucHV0X2ZpbGVzKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBpbnB1dCBmaWxlIGluZGV4ICVkIHdoaWxlIHByb2Nlc3NpbmcgbWV0YWRhdGEgbWFwc1xuIiwgaW5fZmlsZV9pbmRleCk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICAgICAgY29weV9tZXRhZGF0YShvLT5tZXRhZGF0YV9tYXBbaV0uc3BlY2lmaWVyLCAqcCA/IHAgKyAxIDogcCwgb2MsCisgICAgICAgICAgICAgICAgICAgICAgaW5fZmlsZV9pbmRleCA+PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9maWxlc1tpbl9maWxlX2luZGV4XS0+Y3R4IDogTlVMTCwgbyk7CisgICAgfQorCisgICAgLyogY29weSBjaGFwdGVycyAqLworICAgIGlmIChvLT5jaGFwdGVyc19pbnB1dF9maWxlID49IG5iX2lucHV0X2ZpbGVzKSB7CisgICAgICAgIGlmIChvLT5jaGFwdGVyc19pbnB1dF9maWxlID09IElOVF9NQVgpIHsKKyAgICAgICAgICAgIC8qIGNvcHkgY2hhcHRlcnMgZnJvbSB0aGUgZmlyc3QgaW5wdXQgZmlsZSB0aGF0IGhhcyB0aGVtKi8KKyAgICAgICAgICAgIG8tPmNoYXB0ZXJzX2lucHV0X2ZpbGUgPSAtMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pbnB1dF9maWxlczsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChpbnB1dF9maWxlc1tpXS0+Y3R4LT5uYl9jaGFwdGVycykgeworICAgICAgICAgICAgICAgICAgICBvLT5jaGFwdGVyc19pbnB1dF9maWxlID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgaW5wdXQgZmlsZSBpbmRleCAlZCBpbiBjaGFwdGVyIG1hcHBpbmcuXG4iLAorICAgICAgICAgICAgICAgICAgIG8tPmNoYXB0ZXJzX2lucHV0X2ZpbGUpOworICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChvLT5jaGFwdGVyc19pbnB1dF9maWxlID49IDApCisgICAgICAgIGNvcHlfY2hhcHRlcnMoaW5wdXRfZmlsZXNbby0+Y2hhcHRlcnNfaW5wdXRfZmlsZV0sIG9mLAorICAgICAgICAgICAgICAgICAgICAgICFvLT5tZXRhZGF0YV9jaGFwdGVyc19tYW51YWwpOworCisgICAgLyogY29weSBnbG9iYWwgbWV0YWRhdGEgYnkgZGVmYXVsdCAqLworICAgIGlmICghby0+bWV0YWRhdGFfZ2xvYmFsX21hbnVhbCAmJiBuYl9pbnB1dF9maWxlcyl7CisgICAgICAgIGF2X2RpY3RfY29weSgmb2MtPm1ldGFkYXRhLCBpbnB1dF9maWxlc1swXS0+Y3R4LT5tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOworICAgICAgICBpZihvLT5yZWNvcmRpbmdfdGltZSAhPSBJTlQ2NF9NQVgpCisgICAgICAgICAgICBhdl9kaWN0X3NldCgmb2MtPm1ldGFkYXRhLCAiZHVyYXRpb24iLCBOVUxMLCAwKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJm9jLT5tZXRhZGF0YSwgImNyZWF0aW9uX3RpbWUiLCBOVUxMLCAwKTsKKyAgICB9CisgICAgaWYgKCFvLT5tZXRhZGF0YV9zdHJlYW1zX21hbnVhbCkKKyAgICAgICAgZm9yIChpID0gb2YtPm9zdF9pbmRleDsgaSA8IG5iX291dHB1dF9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtICppc3Q7CisgICAgICAgICAgICBpZiAob3V0cHV0X3N0cmVhbXNbaV0tPnNvdXJjZV9pbmRleCA8IDApICAgICAgICAgLyogdGhpcyBpcyB0cnVlIGUuZy4gZm9yIGF0dGFjaGVkIGZpbGVzICovCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpc3QgPSBpbnB1dF9zdHJlYW1zW291dHB1dF9zdHJlYW1zW2ldLT5zb3VyY2VfaW5kZXhdOworICAgICAgICAgICAgYXZfZGljdF9jb3B5KCZvdXRwdXRfc3RyZWFtc1tpXS0+c3QtPm1ldGFkYXRhLCBpc3QtPnN0LT5tZXRhZGF0YSwgQVZfRElDVF9ET05UX09WRVJXUklURSk7CisgICAgICAgICAgICBpZiAoIW91dHB1dF9zdHJlYW1zW2ldLT5zdHJlYW1fY29weSkgeworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvdXRwdXRfc3RyZWFtc1tpXS0+c3QtPm1ldGFkYXRhLCAiZW5jb2RlciIsIE5VTEwsIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAvKiBwcm9jZXNzIG1hbnVhbGx5IHNldCBwcm9ncmFtcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBvLT5uYl9wcm9ncmFtOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqcCA9IG8tPnByb2dyYW1baV0udS5zdHI7CisgICAgICAgIGludCBwcm9naWQgPSBpKzE7CisgICAgICAgIEFWUHJvZ3JhbSAqcHJvZ3JhbTsKKworICAgICAgICB3aGlsZSgqcCkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqcDIgPSBhdl9nZXRfdG9rZW4oJnAsICI6Iik7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0b19kZWFsbG9jID0gcDI7CisgICAgICAgICAgICBjaGFyICprZXk7CisgICAgICAgICAgICBpZiAoIXAyKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZigqcCkgcCsrOworCisgICAgICAgICAgICBrZXkgPSBhdl9nZXRfdG9rZW4oJnAyLCAiPSIpOworICAgICAgICAgICAgaWYgKCFrZXkgfHwgISpwMikgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ0b19kZWFsbG9jKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgma2V5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAyKys7CisKKyAgICAgICAgICAgIGlmICghc3RyY21wKGtleSwgInByb2dyYW1fbnVtIikpCisgICAgICAgICAgICAgICAgcHJvZ2lkID0gc3RydG9sKHAyLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ0b19kZWFsbG9jKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZrZXkpOworICAgICAgICB9CisKKyAgICAgICAgcHJvZ3JhbSA9IGF2X25ld19wcm9ncmFtKG9jLCBwcm9naWQpOworCisgICAgICAgIHAgPSBvLT5wcm9ncmFtW2ldLnUuc3RyOworICAgICAgICB3aGlsZSgqcCkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqcDIgPSBhdl9nZXRfdG9rZW4oJnAsICI6Iik7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0b19kZWFsbG9jID0gcDI7CisgICAgICAgICAgICBjaGFyICprZXk7CisgICAgICAgICAgICBpZiAoIXAyKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYoKnApIHArKzsKKworICAgICAgICAgICAga2V5ID0gYXZfZ2V0X3Rva2VuKCZwMiwgIj0iKTsKKyAgICAgICAgICAgIGlmICgha2V5KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vICc9JyBjaGFyYWN0ZXIgaW4gcHJvZ3JhbSBzdHJpbmcgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwMik7CisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEqcDIpCisgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgcDIrKzsKKworICAgICAgICAgICAgaWYgKCFzdHJjbXAoa2V5LCAidGl0bGUiKSkgeworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZwcm9ncmFtLT5tZXRhZGF0YSwgInRpdGxlIiwgcDIsIDApOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgInByb2dyYW1fbnVtIikpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJzdCIpKSB7CisgICAgICAgICAgICAgICAgaW50IHN0X251bSA9IHN0cnRvbChwMiwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgYXZfcHJvZ3JhbV9hZGRfc3RyZWFtX2luZGV4KG9jLCBwcm9naWQsIHN0X251bSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJVbmtub3duIHByb2dyYW0ga2V5ICVzLlxuIiwga2V5KTsKKyAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mcmVlcCgmdG9fZGVhbGxvYyk7CisgICAgICAgICAgICBhdl9mcmVlcCgma2V5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIHByb2Nlc3MgbWFudWFsbHkgc2V0IG1ldGFkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IG8tPm5iX21ldGFkYXRhOyBpKyspIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5ICoqbTsKKyAgICAgICAgY2hhciB0eXBlLCAqdmFsOworICAgICAgICBjb25zdCBjaGFyICpzdHJlYW1fc3BlYzsKKyAgICAgICAgaW50IGluZGV4ID0gMCwgaiwgcmV0ID0gMDsKKworICAgICAgICB2YWwgPSBzdHJjaHIoby0+bWV0YWRhdGFbaV0udS5zdHIsICc9Jyk7CisgICAgICAgIGlmICghdmFsKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiTm8gJz0nIGNoYXJhY3RlciBpbiBtZXRhZGF0YSBzdHJpbmcgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIG8tPm1ldGFkYXRhW2ldLnUuc3RyKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgICAgICAqdmFsKysgPSAwOworCisgICAgICAgIHBhcnNlX21ldGFfdHlwZShvLT5tZXRhZGF0YVtpXS5zcGVjaWZpZXIsICZ0eXBlLCAmaW5kZXgsICZzdHJlYW1fc3BlYyk7CisgICAgICAgIGlmICh0eXBlID09ICdzJykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9jLT5uYl9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgICAgICBvc3QgPSBvdXRwdXRfc3RyZWFtc1tuYl9vdXRwdXRfc3RyZWFtcyAtIG9jLT5uYl9zdHJlYW1zICsgal07CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBjaGVja19zdHJlYW1fc3BlY2lmaWVyKG9jLCBvYy0+c3RyZWFtc1tqXSwgc3RyZWFtX3NwZWMpKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoby0+bWV0YWRhdGFbaV0udS5zdHIsICJyb3RhdGUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdGFpbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aGV0YSA9IGF2X3N0cnRvZCh2YWwsICZ0YWlsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKnRhaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPnJvdGF0ZV9vdmVycmlkZGVuID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPnJvdGF0ZV9vdmVycmlkZV92YWx1ZSA9IHRoZXRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9jLT5zdHJlYW1zW2pdLT5tZXRhZGF0YSwgby0+bWV0YWRhdGFbaV0udS5zdHIsICp2YWwgPyB2YWwgOiBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgICAgICAgICBtID0gJm9jLT5tZXRhZGF0YTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2MnOgorICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gb2MtPm5iX2NoYXB0ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGNoYXB0ZXIgaW5kZXggJWQgaW4gbWV0YWRhdGEgc3BlY2lmaWVyLlxuIiwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG0gPSAmb2MtPmNoYXB0ZXJzW2luZGV4XS0+bWV0YWRhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG9jLT5uYl9wcm9ncmFtcykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBwcm9ncmFtIGluZGV4ICVkIGluIG1ldGFkYXRhIHNwZWNpZmllci5cbiIsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtID0gJm9jLT5wcm9ncmFtc1tpbmRleF0tPm1ldGFkYXRhOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBtZXRhZGF0YSBzcGVjaWZpZXIgJXMuXG4iLCBvLT5tZXRhZGF0YVtpXS5zcGVjaWZpZXIpOworICAgICAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KG0sIG8tPm1ldGFkYXRhW2ldLnUuc3RyLCAqdmFsID8gdmFsIDogTlVMTCwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfdGFyZ2V0KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7CisgICAgZW51bSB7IFBBTCwgTlRTQywgRklMTSwgVU5LTk9XTiB9IG5vcm0gPSBVTktOT1dOOworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmcmFtZV9yYXRlc1tdID0geyAiMjUiLCAiMzAwMDAvMTAwMSIsICIyNDAwMC8xMDAxIiB9OworCisgICAgaWYgKCFzdHJuY21wKGFyZywgInBhbC0iLCA0KSkgeworICAgICAgICBub3JtID0gUEFMOworICAgICAgICBhcmcgKz0gNDsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZywgIm50c2MtIiwgNSkpIHsKKyAgICAgICAgbm9ybSA9IE5UU0M7CisgICAgICAgIGFyZyArPSA1OworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJnLCAiZmlsbS0iLCA1KSkgeworICAgICAgICBub3JtID0gRklMTTsKKyAgICAgICAgYXJnICs9IDU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVHJ5IHRvIGRldGVybWluZSBQQUwvTlRTQyBieSBwZWVraW5nIGluIHRoZSBpbnB1dCBmaWxlcyAqLworICAgICAgICBpZiAobmJfaW5wdXRfZmlsZXMpIHsKKyAgICAgICAgICAgIGludCBpLCBqLCBmcjsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9pbnB1dF9maWxlczsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlucHV0X2ZpbGVzW2pdLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gaW5wdXRfZmlsZXNbal0tPmN0eC0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgZnIgPSBzdC0+dGltZV9iYXNlLmRlbiAqIDEwMDAgLyBzdC0+dGltZV9iYXNlLm51bTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyID09IDI1MDAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gUEFMOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZyID09IDI5OTcwKSB8fCAoZnIgPT0gMjM5NzYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gTlRTQzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChub3JtICE9IFVOS05PV04pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub3JtICE9IFVOS05PV04pCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJBc3N1bWluZyAlcyBmb3IgdGFyZ2V0LlxuIiwgbm9ybSA9PSBQQUwgPyAiUEFMIiA6ICJOVFNDIik7CisgICAgfQorCisgICAgaWYgKG5vcm0gPT0gVU5LTk9XTikgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGRldGVybWluZSBub3JtIChQQUwvTlRTQy9OVFNDLUZpbG0pIGZvciB0YXJnZXQuXG4iKTsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlBsZWFzZSBwcmVmaXggdGFyZ2V0IHdpdGggXCJwYWwtXCIsIFwibnRzYy1cIiBvciBcImZpbG0tXCIsXG4iKTsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIm9yIHNldCBhIGZyYW1lcmF0ZSB3aXRoIFwiLXIgeHh4XCIuXG4iKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIGlmICghc3RyY21wKGFyZywgInZjZCIpKSB7CisgICAgICAgIG9wdF92aWRlb19jb2RlYyhvLCAiYzp2IiwgIm1wZWcxdmlkZW8iKTsKKyAgICAgICAgb3B0X2F1ZGlvX2NvZGVjKG8sICJjOmEiLCAibXAyIik7CisgICAgICAgIHBhcnNlX29wdGlvbihvLCAiZiIsICJ2Y2QiLCBvcHRpb25zKTsKKworICAgICAgICBwYXJzZV9vcHRpb24obywgInMiLCBub3JtID09IFBBTCA/ICIzNTJ4Mjg4IiA6ICIzNTJ4MjQwIiwgb3B0aW9ucyk7CisgICAgICAgIHBhcnNlX29wdGlvbihvLCAiciIsIGZyYW1lX3JhdGVzW25vcm1dLCBvcHRpb25zKTsKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImciLCBub3JtID09IFBBTCA/ICIxNSIgOiAiMTgiKTsKKworICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAiYjp2IiwgIjExNTAwMDAiKTsKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgIm1heHJhdGU6diIsICIxMTUwMDAwIik7CisgICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJtaW5yYXRlOnYiLCAiMTE1MDAwMCIpOworICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAiYnVmc2l6ZTp2IiwgIjMyNzY4MCIpOyAvLyA0MCoxMDI0Kjg7CisKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImI6YSIsICIyMjQwMDAiKTsKKyAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJhciIsICI0NDEwMCIsIG9wdGlvbnMpOworICAgICAgICBwYXJzZV9vcHRpb24obywgImFjIiwgIjIiLCBvcHRpb25zKTsKKworICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAicGFja2V0c2l6ZSIsICIyMzI0Iik7CisgICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJtdXhyYXRlIiwgIjE0MTEyMDAiKTsgLy8gMjM1MiAqIDc1ICogODsKKworICAgICAgICAvKiBXZSBoYXZlIHRvIG9mZnNldCB0aGUgUFRTLCBzbyB0aGF0IGl0IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgU0NSLgorICAgICAgICAgICBTQ1Igc3RhcnRzIGF0IDM2MDAwLCBidXQgdGhlIGZpcnN0IHR3byBwYWNrcyBjb250YWluIG9ubHkgcGFkZGluZworICAgICAgICAgICBhbmQgdGhlIGZpcnN0IHBhY2sgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLCByZXNwZWN0aXZlbHksIG1heSBhbHNvIGhhdmUKKyAgICAgICAgICAgYmVlbiB3cml0dGVuIGJlZm9yZS4KKyAgICAgICAgICAgU28gdGhlIHJlYWwgZGF0YSBzdGFydHMgYXQgU0NSIDM2MDAwKzMqMTIwMC4gKi8KKyAgICAgICAgby0+bXV4X3ByZWxvYWQgPSAoMzYwMDAgKyAzICogMTIwMCkgLyA5MDAwMC4wOyAvLyAwLjQ0CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZywgInN2Y2QiKSkgeworCisgICAgICAgIG9wdF92aWRlb19jb2RlYyhvLCAiYzp2IiwgIm1wZWcydmlkZW8iKTsKKyAgICAgICAgb3B0X2F1ZGlvX2NvZGVjKG8sICJjOmEiLCAibXAyIik7CisgICAgICAgIHBhcnNlX29wdGlvbihvLCAiZiIsICJzdmNkIiwgb3B0aW9ucyk7CisKKyAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJzIiwgbm9ybSA9PSBQQUwgPyAiNDgweDU3NiIgOiAiNDgweDQ4MCIsIG9wdGlvbnMpOworICAgICAgICBwYXJzZV9vcHRpb24obywgInIiLCBmcmFtZV9yYXRlc1tub3JtXSwgb3B0aW9ucyk7CisgICAgICAgIHBhcnNlX29wdGlvbihvLCAicGl4X2ZtdCIsICJ5dXY0MjBwIiwgb3B0aW9ucyk7CisgICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJnIiwgbm9ybSA9PSBQQUwgPyAiMTUiIDogIjE4Iik7CisKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImI6diIsICIyMDQwMDAwIik7CisgICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJtYXhyYXRlOnYiLCAiMjUxNjAwMCIpOworICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAibWlucmF0ZTp2IiwgIjAiKTsgLy8gMTE0NTAwMDsKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImJ1ZnNpemU6diIsICIxODM1MDA4Iik7IC8vIDIyNCoxMDI0Kjg7CisgICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJzY2FuX29mZnNldCIsICIxIik7CisKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImI6YSIsICIyMjQwMDAiKTsKKyAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJhciIsICI0NDEwMCIsIG9wdGlvbnMpOworCisgICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJwYWNrZXRzaXplIiwgIjIzMjQiKTsKKworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmcsICJkdmQiKSkgeworCisgICAgICAgIG9wdF92aWRlb19jb2RlYyhvLCAiYzp2IiwgIm1wZWcydmlkZW8iKTsKKyAgICAgICAgb3B0X2F1ZGlvX2NvZGVjKG8sICJjOmEiLCAiYWMzIik7CisgICAgICAgIHBhcnNlX29wdGlvbihvLCAiZiIsICJkdmQiLCBvcHRpb25zKTsKKworICAgICAgICBwYXJzZV9vcHRpb24obywgInMiLCBub3JtID09IFBBTCA/ICI3MjB4NTc2IiA6ICI3MjB4NDgwIiwgb3B0aW9ucyk7CisgICAgICAgIHBhcnNlX29wdGlvbihvLCAiciIsIGZyYW1lX3JhdGVzW25vcm1dLCBvcHRpb25zKTsKKyAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJwaXhfZm10IiwgInl1djQyMHAiLCBvcHRpb25zKTsKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImciLCBub3JtID09IFBBTCA/ICIxNSIgOiAiMTgiKTsKKworICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAiYjp2IiwgIjYwMDAwMDAiKTsKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgIm1heHJhdGU6diIsICI5MDAwMDAwIik7CisgICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJtaW5yYXRlOnYiLCAiMCIpOyAvLyAxNTAwMDAwOworICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAiYnVmc2l6ZTp2IiwgIjE4MzUwMDgiKTsgLy8gMjI0KjEwMjQqODsKKworICAgICAgICBvcHRfZGVmYXVsdChOVUxMLCAicGFja2V0c2l6ZSIsICIyMDQ4Iik7ICAvLyBmcm9tIHd3dy5tcHVjb2Rlci5jb206IERWRCBzZWN0b3JzIGNvbnRhaW4gMjA0OCBieXRlcyBvZiBkYXRhLCB0aGlzIGlzIGFsc28gdGhlIHNpemUgb2Ygb25lIHBhY2suCisgICAgICAgIG9wdF9kZWZhdWx0KE5VTEwsICJtdXhyYXRlIiwgIjEwMDgwMDAwIik7IC8vIGZyb20gbXBsZXggcHJvamVjdDogZGF0YV9yYXRlID0gMTI2MDAwMC4gbXV4X3JhdGUgPSBkYXRhX3JhdGUgKiA4CisKKyAgICAgICAgb3B0X2RlZmF1bHQoTlVMTCwgImI6YSIsICI0NDgwMDAiKTsKKyAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJhciIsICI0ODAwMCIsIG9wdGlvbnMpOworCisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmcsICJkdiIsIDIpKSB7CisKKyAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJmIiwgImR2Iiwgb3B0aW9ucyk7CisKKyAgICAgICAgcGFyc2Vfb3B0aW9uKG8sICJzIiwgbm9ybSA9PSBQQUwgPyAiNzIweDU3NiIgOiAiNzIweDQ4MCIsIG9wdGlvbnMpOworICAgICAgICBwYXJzZV9vcHRpb24obywgInBpeF9mbXQiLCAhc3RybmNtcChhcmcsICJkdjUwIiwgNCkgPyAieXV2NDIycCIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID09IFBBTCA/ICJ5dXY0MjBwIiA6ICJ5dXY0MTFwIiwgb3B0aW9ucyk7CisgICAgICAgIHBhcnNlX29wdGlvbihvLCAiciIsIGZyYW1lX3JhdGVzW25vcm1dLCBvcHRpb25zKTsKKworICAgICAgICBwYXJzZV9vcHRpb24obywgImFyIiwgIjQ4MDAwIiwgb3B0aW9ucyk7CisgICAgICAgIHBhcnNlX29wdGlvbihvLCAiYWMiLCAiMiIsIG9wdGlvbnMpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gdGFyZ2V0OiAlc1xuIiwgYXJnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9kaWN0X2NvcHkoJm8tPmctPmNvZGVjX29wdHMsICBjb2RlY19vcHRzLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKKyAgICBhdl9kaWN0X2NvcHkoJm8tPmctPmZvcm1hdF9vcHRzLCBmb3JtYXRfb3B0cywgQVZfRElDVF9ET05UX09WRVJXUklURSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfdnN0YXRzX2ZpbGUodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBhdl9mcmVlICh2c3RhdHNfZmlsZW5hbWUpOworICAgIHZzdGF0c19maWxlbmFtZSA9IGF2X3N0cmR1cCAoYXJnKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfdnN0YXRzKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgY2hhciBmaWxlbmFtZVs0MF07CisgICAgdGltZV90IHRvZGF5MiA9IHRpbWUoTlVMTCk7CisgICAgc3RydWN0IHRtICp0b2RheSA9IGxvY2FsdGltZSgmdG9kYXkyKTsKKworICAgIGlmICghdG9kYXkpIHsgLy8gbWF5YmUgdG9tb3Jyb3cKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlVuYWJsZSB0byBnZXQgY3VycmVudCB0aW1lOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKworICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAidnN0YXRzXyUwMmQlMDJkJTAyZC5sb2ciLCB0b2RheS0+dG1faG91ciwgdG9kYXktPnRtX21pbiwKKyAgICAgICAgICAgICB0b2RheS0+dG1fc2VjKTsKKyAgICByZXR1cm4gb3B0X3ZzdGF0c19maWxlKE5VTEwsIG9wdCwgZmlsZW5hbWUpOworfQorCitzdGF0aWMgaW50IG9wdF92aWRlb19mcmFtZXModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKKyAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJmcmFtZXM6diIsIGFyZywgb3B0aW9ucyk7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2F1ZGlvX2ZyYW1lcyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIHJldHVybiBwYXJzZV9vcHRpb24obywgImZyYW1lczphIiwgYXJnLCBvcHRpb25zKTsKK30KKworc3RhdGljIGludCBvcHRfZGF0YV9mcmFtZXModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKKyAgICByZXR1cm4gcGFyc2Vfb3B0aW9uKG8sICJmcmFtZXM6ZCIsIGFyZywgb3B0aW9ucyk7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2RlZmF1bHRfbmV3KE9wdGlvbnNDb250ZXh0ICpvLCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBpbnQgcmV0OworICAgIEFWRGljdGlvbmFyeSAqY2JhayA9IGNvZGVjX29wdHM7CisgICAgQVZEaWN0aW9uYXJ5ICpmYmFrID0gZm9ybWF0X29wdHM7CisgICAgY29kZWNfb3B0cyA9IE5VTEw7CisgICAgZm9ybWF0X29wdHMgPSBOVUxMOworCisgICAgcmV0ID0gb3B0X2RlZmF1bHQoTlVMTCwgb3B0LCBhcmcpOworCisgICAgYXZfZGljdF9jb3B5KCZvLT5nLT5jb2RlY19vcHRzICwgY29kZWNfb3B0cywgMCk7CisgICAgYXZfZGljdF9jb3B5KCZvLT5nLT5mb3JtYXRfb3B0cywgZm9ybWF0X29wdHMsIDApOworICAgIGF2X2RpY3RfZnJlZSgmY29kZWNfb3B0cyk7CisgICAgYXZfZGljdF9mcmVlKCZmb3JtYXRfb3B0cyk7CisgICAgY29kZWNfb3B0cyA9IGNiYWs7CisgICAgZm9ybWF0X29wdHMgPSBmYmFrOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcHRfcHJlc2V0KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7CisgICAgRklMRSAqZj1OVUxMOworICAgIGNoYXIgZmlsZW5hbWVbMTAwMF0sIGxpbmVbMTAwMF0sIHRtcF9saW5lWzEwMDBdOworICAgIGNvbnN0IGNoYXIgKmNvZGVjX25hbWUgPSBOVUxMOworCisgICAgdG1wX2xpbmVbMF0gPSAqb3B0OworICAgIHRtcF9saW5lWzFdID0gMDsKKyAgICBNQVRDSF9QRVJfVFlQRV9PUFQoY29kZWNfbmFtZXMsIHN0ciwgY29kZWNfbmFtZSwgTlVMTCwgdG1wX2xpbmUpOworCisgICAgaWYgKCEoZiA9IGdldF9wcmVzZXRfZmlsZShmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgYXJnLCAqb3B0ID09ICdmJywgY29kZWNfbmFtZSkpKSB7CisgICAgICAgIGlmKCFzdHJuY21wKGFyZywgImxpYngyNjQtbG9zc2xlc3MiLCBzdHJsZW4oImxpYngyNjQtbG9zc2xlc3MiKSkpeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlBsZWFzZSB1c2UgLXByZXNldCA8c3BlZWQ+IC1xcCAwXG4iKTsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJGaWxlIGZvciBwcmVzZXQgJyVzJyBub3QgZm91bmRcbiIsIGFyZyk7CisgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICB9CisKKyAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmKSkgeworICAgICAgICBjaGFyICprZXkgPSB0bXBfbGluZSwgKnZhbHVlLCAqZW5kcHRyOworCisgICAgICAgIGlmIChzdHJjc3BuKGxpbmUsICIjXG5cciIpID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYXZfc3RybGNweSh0bXBfbGluZSwgbGluZSwgc2l6ZW9mKHRtcF9saW5lKSk7CisgICAgICAgIGlmICghYXZfc3RydG9rKGtleSwgICAiPSIsICAgICZ2YWx1ZSkgfHwKKyAgICAgICAgICAgICFhdl9zdHJ0b2sodmFsdWUsICJcclxuIiwgJmVuZHB0cikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlczogSW52YWxpZCBzeW50YXg6ICclcydcbiIsIGZpbGVuYW1lLCBsaW5lKTsKKyAgICAgICAgICAgIGV4aXRfcHJvZ3JhbSgxKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiZmZwcmVzZXRbJXNdOiBzZXQgJyVzJyA9ICclcydcbiIsIGZpbGVuYW1lLCBrZXksIHZhbHVlKTsKKworICAgICAgICBpZiAgICAgICghc3RyY21wKGtleSwgImFjb2RlYyIpKSBvcHRfYXVkaW9fY29kZWMgICAobywga2V5LCB2YWx1ZSk7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAidmNvZGVjIikpIG9wdF92aWRlb19jb2RlYyAgIChvLCBrZXksIHZhbHVlKTsKKyAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChrZXksICJzY29kZWMiKSkgb3B0X3N1YnRpdGxlX2NvZGVjKG8sIGtleSwgdmFsdWUpOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgImRjb2RlYyIpKSBvcHRfZGF0YV9jb2RlYyAgICAobywga2V5LCB2YWx1ZSk7CisgICAgICAgIGVsc2UgaWYgKG9wdF9kZWZhdWx0X25ldyhvLCBrZXksIHZhbHVlKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIlczogSW52YWxpZCBvcHRpb24gb3IgYXJndW1lbnQ6ICclcycsIHBhcnNlZCBhcyAnJXMnID0gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZSwga2V5LCB2YWx1ZSk7CisgICAgICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmY2xvc2UoZik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfb2xkMm5ldyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIGNoYXIgKnMgPSBhdl9hc3ByaW50ZigiJXM6JWMiLCBvcHQgKyAxLCAqb3B0KTsKKyAgICBpbnQgcmV0ID0gcGFyc2Vfb3B0aW9uKG8sIHMsIGFyZywgb3B0aW9ucyk7CisgICAgYXZfZnJlZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wdF9iaXRyYXRlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7CisKKyAgICBpZighc3RyY21wKG9wdCwgImFiIikpeworICAgICAgICBhdl9kaWN0X3NldCgmby0+Zy0+Y29kZWNfb3B0cywgImI6YSIsIGFyZywgMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZighc3RyY21wKG9wdCwgImIiKSl7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlBsZWFzZSB1c2UgLWI6YSBvciAtYjp2LCAtYiBpcyBhbWJpZ3VvdXNcbiIpOworICAgICAgICBhdl9kaWN0X3NldCgmby0+Zy0+Y29kZWNfb3B0cywgImI6diIsIGFyZywgMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdl9kaWN0X3NldCgmby0+Zy0+Y29kZWNfb3B0cywgb3B0LCBhcmcsIDApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdF9xc2NhbGUodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBPcHRpb25zQ29udGV4dCAqbyA9IG9wdGN0eDsKKyAgICBjaGFyICpzOworICAgIGludCByZXQ7CisgICAgaWYoIXN0cmNtcChvcHQsICJxc2NhbGUiKSl7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlBsZWFzZSB1c2UgLXE6YSBvciAtcTp2LCAtcXNjYWxlIGlzIGFtYmlndW91c1xuIik7CisgICAgICAgIHJldHVybiBwYXJzZV9vcHRpb24obywgInE6diIsIGFyZywgb3B0aW9ucyk7CisgICAgfQorICAgIHMgPSBhdl9hc3ByaW50ZigicSVzIiwgb3B0ICsgNik7CisgICAgcmV0ID0gcGFyc2Vfb3B0aW9uKG8sIHMsIGFyZywgb3B0aW9ucyk7CisgICAgYXZfZnJlZShzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wdF9wcm9maWxlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7CisgICAgaWYoIXN0cmNtcChvcHQsICJwcm9maWxlIikpeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJQbGVhc2UgdXNlIC1wcm9maWxlOmEgb3IgLXByb2ZpbGU6diwgLXByb2ZpbGUgaXMgYW1iaWd1b3VzXG4iKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJm8tPmctPmNvZGVjX29wdHMsICJwcm9maWxlOnYiLCBhcmcsIDApOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXZfZGljdF9zZXQoJm8tPmctPmNvZGVjX29wdHMsIG9wdCwgYXJnLCAwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfdmlkZW9fZmlsdGVycyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIHJldHVybiBwYXJzZV9vcHRpb24obywgImZpbHRlcjp2IiwgYXJnLCBvcHRpb25zKTsKK30KKworc3RhdGljIGludCBvcHRfYXVkaW9fZmlsdGVycyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIHJldHVybiBwYXJzZV9vcHRpb24obywgImZpbHRlcjphIiwgYXJnLCBvcHRpb25zKTsKK30KKworc3RhdGljIGludCBvcHRfdnN5bmModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBpZiAgICAgICghYXZfc3RyY2FzZWNtcChhcmcsICJjZnIiKSkgICAgICAgICB2aWRlb19zeW5jX21ldGhvZCA9IFZTWU5DX0NGUjsKKyAgICBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChhcmcsICJ2ZnIiKSkgICAgICAgICB2aWRlb19zeW5jX21ldGhvZCA9IFZTWU5DX1ZGUjsKKyAgICBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChhcmcsICJwYXNzdGhyb3VnaCIpKSB2aWRlb19zeW5jX21ldGhvZCA9IFZTWU5DX1BBU1NUSFJPVUdIOworICAgIGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGFyZywgImRyb3AiKSkgICAgICAgIHZpZGVvX3N5bmNfbWV0aG9kID0gVlNZTkNfRFJPUDsKKworICAgIGlmICh2aWRlb19zeW5jX21ldGhvZCA9PSBWU1lOQ19BVVRPKQorICAgICAgICB2aWRlb19zeW5jX21ldGhvZCA9IHBhcnNlX251bWJlcl9vcl9kaWUoInZzeW5jIiwgYXJnLCBPUFRfSU5ULCBWU1lOQ19BVVRPLCBWU1lOQ19WRlIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdF90aW1lY29kZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIE9wdGlvbnNDb250ZXh0ICpvID0gb3B0Y3R4OworICAgIGNoYXIgKnRjciA9IGF2X2FzcHJpbnRmKCJ0aW1lY29kZT0lcyIsIGFyZyk7CisgICAgaW50IHJldCA9IHBhcnNlX29wdGlvbihvLCAibWV0YWRhdGE6ZyIsIHRjciwgb3B0aW9ucyk7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICByZXQgPSBhdl9kaWN0X3NldCgmby0+Zy0+Y29kZWNfb3B0cywgImdvcF90aW1lY29kZSIsIGFyZywgMCk7CisgICAgYXZfZnJlZSh0Y3IpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2NoYW5uZWxfbGF5b3V0KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7CisgICAgY2hhciBsYXlvdXRfc3RyWzMyXTsKKyAgICBjaGFyICpzdHJlYW1fc3RyOworICAgIGNoYXIgKmFjX3N0cjsKKyAgICBpbnQgcmV0LCBjaGFubmVscywgYWNfc3RyX3NpemU7CisgICAgdWludDY0X3QgbGF5b3V0OworCisgICAgbGF5b3V0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KGFyZyk7CisgICAgaWYgKCFsYXlvdXQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY2hhbm5lbCBsYXlvdXQ6ICVzXG4iLCBhcmcpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBzbnByaW50ZihsYXlvdXRfc3RyLCBzaXplb2YobGF5b3V0X3N0ciksICIlIlBSSXU2NCwgbGF5b3V0KTsKKyAgICByZXQgPSBvcHRfZGVmYXVsdF9uZXcobywgb3B0LCBsYXlvdXRfc3RyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIHNldCAnYWMnIG9wdGlvbiBiYXNlZCBvbiBjaGFubmVsIGxheW91dCAqLworICAgIGNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGxheW91dCk7CisgICAgc25wcmludGYobGF5b3V0X3N0ciwgc2l6ZW9mKGxheW91dF9zdHIpLCAiJWQiLCBjaGFubmVscyk7CisgICAgc3RyZWFtX3N0ciA9IHN0cmNocihvcHQsICc6Jyk7CisgICAgYWNfc3RyX3NpemUgPSAzICsgKHN0cmVhbV9zdHIgPyBzdHJsZW4oc3RyZWFtX3N0cikgOiAwKTsKKyAgICBhY19zdHIgPSBhdl9tYWxsb2N6KGFjX3N0cl9zaXplKTsKKyAgICBpZiAoIWFjX3N0cikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdl9zdHJsY3B5KGFjX3N0ciwgImFjIiwgMyk7CisgICAgaWYgKHN0cmVhbV9zdHIpCisgICAgICAgIGF2X3N0cmxjYXQoYWNfc3RyLCBzdHJlYW1fc3RyLCBhY19zdHJfc2l6ZSk7CisgICAgcmV0ID0gcGFyc2Vfb3B0aW9uKG8sIGFjX3N0ciwgbGF5b3V0X3N0ciwgb3B0aW9ucyk7CisgICAgYXZfZnJlZShhY19zdHIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcHRfYXVkaW9fcXNjYWxlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgT3B0aW9uc0NvbnRleHQgKm8gPSBvcHRjdHg7CisgICAgcmV0dXJuIHBhcnNlX29wdGlvbihvLCAicTphIiwgYXJnLCBvcHRpb25zKTsKK30KKworc3RhdGljIGludCBvcHRfZmlsdGVyX2NvbXBsZXgodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBHUk9XX0FSUkFZKGZpbHRlcmdyYXBocywgbmJfZmlsdGVyZ3JhcGhzKTsKKyAgICBpZiAoIShmaWx0ZXJncmFwaHNbbmJfZmlsdGVyZ3JhcGhzIC0gMV0gPSBhdl9tYWxsb2N6KHNpemVvZigqZmlsdGVyZ3JhcGhzWzBdKSkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZpbHRlcmdyYXBoc1tuYl9maWx0ZXJncmFwaHMgLSAxXS0+aW5kZXggICAgICA9IG5iX2ZpbHRlcmdyYXBocyAtIDE7CisgICAgZmlsdGVyZ3JhcGhzW25iX2ZpbHRlcmdyYXBocyAtIDFdLT5ncmFwaF9kZXNjID0gYXZfc3RyZHVwKGFyZyk7CisgICAgaWYgKCFmaWx0ZXJncmFwaHNbbmJfZmlsdGVyZ3JhcGhzIC0gMV0tPmdyYXBoX2Rlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpbnB1dF9zdHJlYW1fcG90ZW50aWFsbHlfYXZhaWxhYmxlID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdF9maWx0ZXJfY29tcGxleF9zY3JpcHQodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICB1aW50OF90ICpncmFwaF9kZXNjID0gcmVhZF9maWxlKGFyZyk7CisgICAgaWYgKCFncmFwaF9kZXNjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgR1JPV19BUlJBWShmaWx0ZXJncmFwaHMsIG5iX2ZpbHRlcmdyYXBocyk7CisgICAgaWYgKCEoZmlsdGVyZ3JhcGhzW25iX2ZpbHRlcmdyYXBocyAtIDFdID0gYXZfbWFsbG9jeihzaXplb2YoKmZpbHRlcmdyYXBoc1swXSkpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmaWx0ZXJncmFwaHNbbmJfZmlsdGVyZ3JhcGhzIC0gMV0tPmluZGV4ICAgICAgPSBuYl9maWx0ZXJncmFwaHMgLSAxOworICAgIGZpbHRlcmdyYXBoc1tuYl9maWx0ZXJncmFwaHMgLSAxXS0+Z3JhcGhfZGVzYyA9IGdyYXBoX2Rlc2M7CisKKyAgICBpbnB1dF9zdHJlYW1fcG90ZW50aWFsbHlfYXZhaWxhYmxlID0gMTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIHNob3dfaGVscF9kZWZhdWx0KGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIC8qIHBlci1maWxlIG9wdGlvbnMgaGF2ZSBhdCBsZWFzdCBvbmUgb2YgdGhvc2Ugc2V0ICovCisgICAgY29uc3QgaW50IHBlcl9maWxlID0gT1BUX1NQRUMgfCBPUFRfT0ZGU0VUIHwgT1BUX1BFUkZJTEU7CisgICAgaW50IHNob3dfYWR2YW5jZWQgPSAwLCBzaG93X2F2b3B0aW9ucyA9IDA7CisKKyAgICBpZiAob3B0ICYmICpvcHQpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAob3B0LCAibG9uZyIpKQorICAgICAgICAgICAgc2hvd19hZHZhbmNlZCA9IDE7CisgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiZnVsbCIpKQorICAgICAgICAgICAgc2hvd19hZHZhbmNlZCA9IHNob3dfYXZvcHRpb25zID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gaGVscCBvcHRpb24gJyVzJy5cbiIsIG9wdCk7CisgICAgfQorCisgICAgc2hvd191c2FnZSgpOworCisgICAgcHJpbnRmKCJHZXR0aW5nIGhlbHA6XG4iCisgICAgICAgICAgICIgICAgLWggICAgICAtLSBwcmludCBiYXNpYyBvcHRpb25zXG4iCisgICAgICAgICAgICIgICAgLWggbG9uZyAtLSBwcmludCBtb3JlIG9wdGlvbnNcbiIKKyAgICAgICAgICAgIiAgICAtaCBmdWxsIC0tIHByaW50IGFsbCBvcHRpb25zIChpbmNsdWRpbmcgYWxsIGZvcm1hdCBhbmQgY29kZWMgc3BlY2lmaWMgb3B0aW9ucywgdmVyeSBsb25nKVxuIgorICAgICAgICAgICAiICAgIC1oIHR5cGU9bmFtZSAtLSBwcmludCBhbGwgb3B0aW9ucyBmb3IgdGhlIG5hbWVkIGRlY29kZXIvZW5jb2Rlci9kZW11eGVyL211eGVyL2ZpbHRlci9ic2ZcbiIKKyAgICAgICAgICAgIiAgICBTZWUgbWFuICVzIGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgb3B0aW9ucy5cbiIKKyAgICAgICAgICAgIlxuIiwgcHJvZ3JhbV9uYW1lKTsKKworICAgIHNob3dfaGVscF9vcHRpb25zKG9wdGlvbnMsICJQcmludCBoZWxwIC8gaW5mb3JtYXRpb24gLyBjYXBhYmlsaXRpZXM6IiwKKyAgICAgICAgICAgICAgICAgICAgICBPUFRfRVhJVCwgMCwgMCk7CisKKyAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiR2xvYmFsIG9wdGlvbnMgKGFmZmVjdCB3aG9sZSBwcm9ncmFtICIKKyAgICAgICAgICAgICAgICAgICAgICAiaW5zdGVhZCBvZiBqdXN0IG9uZSBmaWxlOiIsCisgICAgICAgICAgICAgICAgICAgICAgMCwgcGVyX2ZpbGUgfCBPUFRfRVhJVCB8IE9QVF9FWFBFUlQsIDApOworICAgIGlmIChzaG93X2FkdmFuY2VkKQorICAgICAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiQWR2YW5jZWQgZ2xvYmFsIG9wdGlvbnM6IiwgT1BUX0VYUEVSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyX2ZpbGUgfCBPUFRfRVhJVCwgMCk7CisKKyAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiUGVyLWZpbGUgbWFpbiBvcHRpb25zOiIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgT1BUX0VYUEVSVCB8IE9QVF9BVURJTyB8IE9QVF9WSURFTyB8IE9QVF9TVUJUSVRMRSB8CisgICAgICAgICAgICAgICAgICAgICAgT1BUX0VYSVQsIHBlcl9maWxlKTsKKyAgICBpZiAoc2hvd19hZHZhbmNlZCkKKyAgICAgICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIkFkdmFuY2VkIHBlci1maWxlIG9wdGlvbnM6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0VYUEVSVCwgT1BUX0FVRElPIHwgT1BUX1ZJREVPIHwgT1BUX1NVQlRJVExFLCBwZXJfZmlsZSk7CisKKyAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiVmlkZW8gb3B0aW9uczoiLAorICAgICAgICAgICAgICAgICAgICAgIE9QVF9WSURFTywgT1BUX0VYUEVSVCB8IE9QVF9BVURJTywgMCk7CisgICAgaWYgKHNob3dfYWR2YW5jZWQpCisgICAgICAgIHNob3dfaGVscF9vcHRpb25zKG9wdGlvbnMsICJBZHZhbmNlZCBWaWRlbyBvcHRpb25zOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWFBFUlQgfCBPUFRfVklERU8sIE9QVF9BVURJTywgMCk7CisKKyAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiQXVkaW8gb3B0aW9uczoiLAorICAgICAgICAgICAgICAgICAgICAgIE9QVF9BVURJTywgT1BUX0VYUEVSVCB8IE9QVF9WSURFTywgMCk7CisgICAgaWYgKHNob3dfYWR2YW5jZWQpCisgICAgICAgIHNob3dfaGVscF9vcHRpb25zKG9wdGlvbnMsICJBZHZhbmNlZCBBdWRpbyBvcHRpb25zOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWFBFUlQgfCBPUFRfQVVESU8sIE9QVF9WSURFTywgMCk7CisgICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIlN1YnRpdGxlIG9wdGlvbnM6IiwKKyAgICAgICAgICAgICAgICAgICAgICBPUFRfU1VCVElUTEUsIDAsIDApOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGlmIChzaG93X2F2b3B0aW9ucykgeworICAgICAgICBpbnQgZmxhZ3MgPSBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNOworICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oYXZjb2RlY19nZXRfY2xhc3MoKSwgZmxhZ3MpOworICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oYXZmb3JtYXRfZ2V0X2NsYXNzKCksIGZsYWdzKTsKKyNpZiBDT05GSUdfU1dTQ0FMRQorICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oc3dzX2dldF9jbGFzcygpLCBmbGFncyk7CisjZW5kaWYKKyAgICAgICAgc2hvd19oZWxwX2NoaWxkcmVuKHN3cl9nZXRfY2xhc3MoKSwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0pOworICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oYXZmaWx0ZXJfZ2V0X2NsYXNzKCksIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0pOworICAgICAgICBzaG93X2hlbHBfY2hpbGRyZW4oYXZfYnNmX2dldF9jbGFzcygpLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQlNGX1BBUkFNKTsKKyAgICB9Cit9CisKK3ZvaWQgc2hvd191c2FnZSh2b2lkKQoreworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIkh5cGVyIGZhc3QgQXVkaW8gYW5kIFZpZGVvIGVuY29kZXJcbiIpOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInVzYWdlOiAlcyBbb3B0aW9uc10gW1tpbmZpbGUgb3B0aW9uc10gLWkgaW5maWxlXS4uLiB7W291dGZpbGUgb3B0aW9uc10gb3V0ZmlsZX0uLi5cbiIsIHByb2dyYW1fbmFtZSk7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiXG4iKTsKK30KKworZW51bSBPcHRHcm91cCB7CisgICAgR1JPVVBfT1VURklMRSwKKyAgICBHUk9VUF9JTkZJTEUsCit9OworCitzdGF0aWMgY29uc3QgT3B0aW9uR3JvdXBEZWYgZ3JvdXBzW10gPSB7CisgICAgW0dST1VQX09VVEZJTEVdID0geyAib3V0cHV0IHVybCIsICBOVUxMLCBPUFRfT1VUUFVUIH0sCisgICAgW0dST1VQX0lORklMRV0gID0geyAiaW5wdXQgdXJsIiwgICAiaSIsICBPUFRfSU5QVVQgfSwKK307CisKK3N0YXRpYyBpbnQgb3Blbl9maWxlcyhPcHRpb25Hcm91cExpc3QgKmwsIGNvbnN0IGNoYXIgKmlub3V0LAorICAgICAgICAgICAgICAgICAgICAgIGludCAoKm9wZW5fZmlsZSkoT3B0aW9uc0NvbnRleHQqLCBjb25zdCBjaGFyKikpCit7CisgICAgaW50IGksIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsLT5uYl9ncm91cHM7IGkrKykgeworICAgICAgICBPcHRpb25Hcm91cCAqZyA9ICZsLT5ncm91cHNbaV07CisgICAgICAgIE9wdGlvbnNDb250ZXh0IG87CisKKyAgICAgICAgaW5pdF9vcHRpb25zKCZvKTsKKyAgICAgICAgby5nID0gZzsKKworICAgICAgICByZXQgPSBwYXJzZV9vcHRncm91cCgmbywgZyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyBvcHRpb25zIGZvciAlcyBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAiJXMuXG4iLCBpbm91dCwgZy0+YXJnKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiT3BlbmluZyBhbiAlcyBmaWxlOiAlcy5cbiIsIGlub3V0LCBnLT5hcmcpOworICAgICAgICByZXQgPSBvcGVuX2ZpbGUoJm8sIGctPmFyZyk7CisgICAgICAgIHVuaW5pdF9vcHRpb25zKCZvKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBvcGVuaW5nICVzIGZpbGUgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIGlub3V0LCBnLT5hcmcpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiU3VjY2Vzc2Z1bGx5IG9wZW5lZCB0aGUgZmlsZS5cbiIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZtcGVnX3BhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIE9wdGlvblBhcnNlQ29udGV4dCBvY3R4OworICAgIHVpbnQ4X3QgZXJyb3JbMTI4XTsKKyAgICBpbnQgcmV0OworCisgICAgbWVtc2V0KCZvY3R4LCAwLCBzaXplb2Yob2N0eCkpOworCisgICAgLyogc3BsaXQgdGhlIGNvbW1hbmRsaW5lIGludG8gYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKi8KKyAgICByZXQgPSBzcGxpdF9jb21tYW5kbGluZSgmb2N0eCwgYXJnYywgYXJndiwgb3B0aW9ucywgZ3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0FSUkFZX0VMRU1TKGdyb3VwcykpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJFcnJvciBzcGxpdHRpbmcgdGhlIGFyZ3VtZW50IGxpc3Q6ICIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogYXBwbHkgZ2xvYmFsIG9wdGlvbnMgKi8KKyAgICByZXQgPSBwYXJzZV9vcHRncm91cChOVUxMLCAmb2N0eC5nbG9iYWxfb3B0cyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkVycm9yIHBhcnNpbmcgZ2xvYmFsIG9wdGlvbnM6ICIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogY29uZmlndXJlIHRlcm1pbmFsIGFuZCBzZXR1cCBzaWduYWwgaGFuZGxlcnMgKi8KKyAgICB0ZXJtX2luaXQoKTsKKworICAgIC8qIG9wZW4gaW5wdXQgZmlsZXMgKi8KKyAgICByZXQgPSBvcGVuX2ZpbGVzKCZvY3R4Lmdyb3Vwc1tHUk9VUF9JTkZJTEVdLCAiaW5wdXQiLCBvcGVuX2lucHV0X2ZpbGUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJFcnJvciBvcGVuaW5nIGlucHV0IGZpbGVzOiAiKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIGNyZWF0ZSB0aGUgY29tcGxleCBmaWx0ZXJncmFwaHMgKi8KKyAgICByZXQgPSBpbml0X2NvbXBsZXhfZmlsdGVycygpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJFcnJvciBpbml0aWFsaXppbmcgY29tcGxleCBmaWx0ZXJzLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBvcGVuIG91dHB1dCBmaWxlcyAqLworICAgIHJldCA9IG9wZW5fZmlsZXMoJm9jdHguZ3JvdXBzW0dST1VQX09VVEZJTEVdLCAib3V0cHV0Iiwgb3Blbl9vdXRwdXRfZmlsZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGVzOiAiKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGNoZWNrX2ZpbHRlcl9vdXRwdXRzKCk7CisKK2ZhaWw6CisgICAgdW5pbml0X3BhcnNlX2NvbnRleHQoJm9jdHgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X3N0cmVycm9yKHJldCwgZXJyb3IsIHNpemVvZihlcnJvcikpOworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiJXNcbiIsIGVycm9yKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcHRfcHJvZ3Jlc3Modm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBBVklPQ29udGV4dCAqYXZpbyA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIGlmICghc3RyY21wKGFyZywgIi0iKSkKKyAgICAgICAgYXJnID0gInBpcGU6IjsKKyAgICByZXQgPSBhdmlvX29wZW4yKCZhdmlvLCBhcmcsIEFWSU9fRkxBR19XUklURSwgJmludF9jYiwgTlVMTCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIHByb2dyZXNzIFVSTCBcIiVzXCI6ICVzXG4iLAorICAgICAgICAgICAgICAgYXJnLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBwcm9ncmVzc19hdmlvID0gYXZpbzsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoT3B0aW9uc0NvbnRleHQsIHgpCitjb25zdCBPcHRpb25EZWYgb3B0aW9uc1tdID0geworICAgIC8qIG1haW4gb3B0aW9ucyAqLworICAgIENNRFVUSUxTX0NPTU1PTl9PUFRJT05TCisgICAgeyAiZiIsICAgICAgICAgICAgICBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9PRkZTRVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmICAgICAgID0gT0ZGU0VUKGZvcm1hdCkgfSwKKyAgICAgICAgImZvcmNlIGZvcm1hdCIsICJmbXQiIH0sCisgICAgeyAieSIsICAgICAgICAgICAgICBPUFRfQk9PTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAmZmlsZV9vdmVyd3JpdGUgfSwKKyAgICAgICAgIm92ZXJ3cml0ZSBvdXRwdXQgZmlsZXMiIH0sCisgICAgeyAibiIsICAgICAgICAgICAgICBPUFRfQk9PTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAmbm9fZmlsZV9vdmVyd3JpdGUgfSwKKyAgICAgICAgIm5ldmVyIG92ZXJ3cml0ZSBvdXRwdXQgZmlsZXMiIH0sCisgICAgeyAiaWdub3JlX3Vua25vd24iLCBPUFRfQk9PTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAmaWdub3JlX3Vua25vd25fc3RyZWFtcyB9LAorICAgICAgICAiSWdub3JlIHVua25vd24gc3RyZWFtIHR5cGVzIiB9LAorICAgIHsgImNvcHlfdW5rbm93biIsICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgJmNvcHlfdW5rbm93bl9zdHJlYW1zIH0sCisgICAgICAgICJDb3B5IHVua25vd24gc3RyZWFtIHR5cGVzIiB9LAorICAgIHsgImMiLCAgICAgICAgICAgICAgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgICAgICAgPSBPRkZTRVQoY29kZWNfbmFtZXMpIH0sCisgICAgICAgICJjb2RlYyBuYW1lIiwgImNvZGVjIiB9LAorICAgIHsgImNvZGVjIiwgICAgICAgICAgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgICAgICAgPSBPRkZTRVQoY29kZWNfbmFtZXMpIH0sCisgICAgICAgICJjb2RlYyBuYW1lIiwgImNvZGVjIiB9LAorICAgIHsgInByZSIsICAgICAgICAgICAgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgICAgICAgPSBPRkZTRVQocHJlc2V0cykgfSwKKyAgICAgICAgInByZXNldCBuYW1lIiwgInByZXNldCIgfSwKKyAgICB7ICJtYXAiLCAgICAgICAgICAgIEhBU19BUkcgfCBPUFRfRVhQRVJUIHwgT1BUX1BFUkZJTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfbWFwIH0sCisgICAgICAgICJzZXQgaW5wdXQgc3RyZWFtIG1hcHBpbmciLAorICAgICAgICAiWy1daW5wdXRfZmlsZV9pZFs6c3RyZWFtX3NwZWNpZmllcl1bLHN5bmNfZmlsZV9pZFs6c3RyZWFtX3NwZWNpZmllcl1dIiB9LAorICAgIHsgIm1hcF9jaGFubmVsIiwgICAgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X21hcF9jaGFubmVsIH0sCisgICAgICAgICJtYXAgYW4gYXVkaW8gY2hhbm5lbCBmcm9tIG9uZSBzdHJlYW0gdG8gYW5vdGhlciIsICJmaWxlLnN0cmVhbS5jaGFubmVsWzpzeW5jZmlsZS5zeW5jc3RyZWFtXSIgfSwKKyAgICB7ICJtYXBfbWV0YWRhdGEiLCAgIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmICAgICAgID0gT0ZGU0VUKG1ldGFkYXRhX21hcCkgfSwKKyAgICAgICAgInNldCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBvZiBvdXRmaWxlIGZyb20gaW5maWxlIiwKKyAgICAgICAgIm91dGZpbGVbLG1ldGFkYXRhXTppbmZpbGVbLG1ldGFkYXRhXSIgfSwKKyAgICB7ICJtYXBfY2hhcHRlcnMiLCAgIEhBU19BUkcgfCBPUFRfSU5UIHwgT1BUX0VYUEVSVCB8IE9QVF9PRkZTRVQgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGNoYXB0ZXJzX2lucHV0X2ZpbGUpIH0sCisgICAgICAgICJzZXQgY2hhcHRlcnMgbWFwcGluZyIsICJpbnB1dF9maWxlX2luZGV4IiB9LAorICAgIHsgInQiLCAgICAgICAgICAgICAgSEFTX0FSRyB8IE9QVF9USU1FIHwgT1BUX09GRlNFVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQocmVjb3JkaW5nX3RpbWUpIH0sCisgICAgICAgICJyZWNvcmQgb3IgdHJhbnNjb2RlIFwiZHVyYXRpb25cIiBzZWNvbmRzIG9mIGF1ZGlvL3ZpZGVvIiwKKyAgICAgICAgImR1cmF0aW9uIiB9LAorICAgIHsgInRvIiwgICAgICAgICAgICAgSEFTX0FSRyB8IE9QVF9USU1FIHwgT1BUX09GRlNFVCB8IE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICB7IC5vZmYgPSBPRkZTRVQoc3RvcF90aW1lKSB9LAorICAgICAgICAicmVjb3JkIG9yIHRyYW5zY29kZSBzdG9wIHRpbWUiLCAidGltZV9zdG9wIiB9LAorICAgIHsgImZzIiwgICAgICAgICAgICAgSEFTX0FSRyB8IE9QVF9JTlQ2NCB8IE9QVF9PRkZTRVQgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQobGltaXRfZmlsZXNpemUpIH0sCisgICAgICAgICJzZXQgdGhlIGxpbWl0IGZpbGUgc2l6ZSBpbiBieXRlcyIsICJsaW1pdF9zaXplIiB9LAorICAgIHsgInNzIiwgICAgICAgICAgICAgSEFTX0FSRyB8IE9QVF9USU1FIHwgT1BUX09GRlNFVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoc3RhcnRfdGltZSkgfSwKKyAgICAgICAgInNldCB0aGUgc3RhcnQgdGltZSBvZmZzZXQiLCAidGltZV9vZmYiIH0sCisgICAgeyAic3Nlb2YiLCAgICAgICAgICBIQVNfQVJHIHwgT1BUX1RJTUUgfCBPUFRfT0ZGU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChzdGFydF90aW1lX2VvZikgfSwKKyAgICAgICAgInNldCB0aGUgc3RhcnQgdGltZSBvZmZzZXQgcmVsYXRpdmUgdG8gRU9GIiwgInRpbWVfb2ZmIiB9LAorICAgIHsgInNlZWtfdGltZXN0YW1wIiwgSEFTX0FSRyB8IE9QVF9JTlQgfCBPUFRfT0ZGU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChzZWVrX3RpbWVzdGFtcCkgfSwKKyAgICAgICAgImVuYWJsZS9kaXNhYmxlIHNlZWtpbmcgYnkgdGltZXN0YW1wIHdpdGggLXNzIiB9LAorICAgIHsgImFjY3VyYXRlX3NlZWsiLCAgT1BUX0JPT0wgfCBPUFRfT0ZGU0VUIHwgT1BUX0VYUEVSVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoYWNjdXJhdGVfc2VlaykgfSwKKyAgICAgICAgImVuYWJsZS9kaXNhYmxlIGFjY3VyYXRlIHNlZWtpbmcgd2l0aCAtc3MiIH0sCisgICAgeyAiaXRzb2Zmc2V0IiwgICAgICBIQVNfQVJHIHwgT1BUX1RJTUUgfCBPUFRfT0ZGU0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWFBFUlQgfCBPUFRfSU5QVVQsICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChpbnB1dF90c19vZmZzZXQpIH0sCisgICAgICAgICJzZXQgdGhlIGlucHV0IHRzIG9mZnNldCIsICJ0aW1lX29mZiIgfSwKKyAgICB7ICJpdHNzY2FsZSIsICAgICAgIEhBU19BUkcgfCBPUFRfRE9VQkxFIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0VYUEVSVCB8IE9QVF9JTlBVVCwgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHRzX3NjYWxlKSB9LAorICAgICAgICAic2V0IHRoZSBpbnB1dCB0cyBzY2FsZSIsICJzY2FsZSIgfSwKKyAgICB7ICJ0aW1lc3RhbXAiLCAgICAgIEhBU19BUkcgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X3JlY29yZGluZ190aW1lc3RhbXAgfSwKKyAgICAgICAgInNldCB0aGUgcmVjb3JkaW5nIHRpbWVzdGFtcCAoJ25vdycgdG8gc2V0IHRoZSBjdXJyZW50IHRpbWUpIiwgInRpbWUiIH0sCisgICAgeyAibWV0YWRhdGEiLCAgICAgICBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwgT1BUX09VVFBVVCwgeyAub2ZmID0gT0ZGU0VUKG1ldGFkYXRhKSB9LAorICAgICAgICAiYWRkIG1ldGFkYXRhIiwgInN0cmluZz1zdHJpbmciIH0sCisgICAgeyAicHJvZ3JhbSIsICAgICAgICBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwgT1BUX09VVFBVVCwgeyAub2ZmID0gT0ZGU0VUKHByb2dyYW0pIH0sCisgICAgICAgICJhZGQgcHJvZ3JhbSB3aXRoIHNwZWNpZmllZCBzdHJlYW1zIiwgInRpdGxlPXN0cmluZzpzdD1udW1iZXIuLi4iIH0sCisgICAgeyAiZGZyYW1lcyIsICAgICAgICBIQVNfQVJHIHwgT1BUX1BFUkZJTEUgfCBPUFRfRVhQRVJUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2RhdGFfZnJhbWVzIH0sCisgICAgICAgICJzZXQgdGhlIG51bWJlciBvZiBkYXRhIGZyYW1lcyB0byBvdXRwdXQiLCAibnVtYmVyIiB9LAorICAgIHsgImJlbmNobWFyayIsICAgICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgeyAmZG9fYmVuY2htYXJrIH0sCisgICAgICAgICJhZGQgdGltaW5ncyBmb3IgYmVuY2htYXJraW5nIiB9LAorICAgIHsgImJlbmNobWFya19hbGwiLCAgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgeyAmZG9fYmVuY2htYXJrX2FsbCB9LAorICAgICAgImFkZCB0aW1pbmdzIGZvciBlYWNoIHRhc2siIH0sCisgICAgeyAicHJvZ3Jlc3MiLCAgICAgICBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9wcm9ncmVzcyB9LAorICAgICAgIndyaXRlIHByb2dyYW0tcmVhZGFibGUgcHJvZ3Jlc3MgaW5mb3JtYXRpb24iLCAidXJsIiB9LAorICAgIHsgInN0ZGluIiwgICAgICAgICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgeyAmc3RkaW5faW50ZXJhY3Rpb24gfSwKKyAgICAgICJlbmFibGUgb3IgZGlzYWJsZSBpbnRlcmFjdGlvbiBvbiBzdGFuZGFyZCBpbnB1dCIgfSwKKyAgICB7ICJ0aW1lbGltaXQiLCAgICAgIEhBU19BUkcgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X3RpbWVsaW1pdCB9LAorICAgICAgICAic2V0IG1heCBydW50aW1lIGluIHNlY29uZHMiLCAibGltaXQiIH0sCisgICAgeyAiZHVtcCIsICAgICAgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICZkb19wa3RfZHVtcCB9LAorICAgICAgICAiZHVtcCBlYWNoIGlucHV0IHBhY2tldCIgfSwKKyAgICB7ICJoZXgiLCAgICAgICAgICAgIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgIHsgJmRvX2hleF9kdW1wIH0sCisgICAgICAgICJ3aGVuIGR1bXBpbmcgcGFja2V0cywgYWxzbyBkdW1wIHRoZSBwYXlsb2FkIiB9LAorICAgIHsgInJlIiwgICAgICAgICAgICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJUIHwgT1BUX09GRlNFVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQocmF0ZV9lbXUpIH0sCisgICAgICAgICJyZWFkIGlucHV0IGF0IG5hdGl2ZSBmcmFtZSByYXRlIiwgIiIgfSwKKyAgICB7ICJ0YXJnZXQiLCAgICAgICAgIEhBU19BUkcgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X3RhcmdldCB9LAorICAgICAgICAic3BlY2lmeSB0YXJnZXQgZmlsZSB0eXBlIChcInZjZFwiLCBcInN2Y2RcIiwgXCJkdmRcIiwgXCJkdlwiIG9yIFwiZHY1MFwiICIKKyAgICAgICAgIndpdGggb3B0aW9uYWwgcHJlZml4ZXMgXCJwYWwtXCIsIFwibnRzYy1cIiBvciBcImZpbG0tXCIpIiwgInR5cGUiIH0sCisgICAgeyAidnN5bmMiLCAgICAgICAgICBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF92c3luYyB9LAorICAgICAgICAidmlkZW8gc3luYyBtZXRob2QiLCAiIiB9LAorICAgIHsgImZyYW1lX2Ryb3BfdGhyZXNob2xkIiwgSEFTX0FSRyB8IE9QVF9GTE9BVCB8IE9QVF9FWFBFUlQsICAgICAgeyAmZnJhbWVfZHJvcF90aHJlc2hvbGQgfSwKKyAgICAgICAgImZyYW1lIGRyb3AgdGhyZXNob2xkIiwgIiIgfSwKKyAgICB7ICJhc3luYyIsICAgICAgICAgIEhBU19BUkcgfCBPUFRfSU5UIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgIHsgJmF1ZGlvX3N5bmNfbWV0aG9kIH0sCisgICAgICAgICJhdWRpbyBzeW5jIG1ldGhvZCIsICIiIH0sCisgICAgeyAiYWRyaWZ0X3RocmVzaG9sZCIsIEhBU19BUkcgfCBPUFRfRkxPQVQgfCBPUFRfRVhQRVJULCAgICAgICAgICB7ICZhdWRpb19kcmlmdF90aHJlc2hvbGQgfSwKKyAgICAgICAgImF1ZGlvIGRyaWZ0IHRocmVzaG9sZCIsICJ0aHJlc2hvbGQiIH0sCisgICAgeyAiY29weXRzIiwgICAgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICZjb3B5X3RzIH0sCisgICAgICAgICJjb3B5IHRpbWVzdGFtcHMiIH0sCisgICAgeyAic3RhcnRfYXRfemVybyIsICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICZzdGFydF9hdF96ZXJvIH0sCisgICAgICAgICJzaGlmdCBpbnB1dCB0aW1lc3RhbXBzIHRvIHN0YXJ0IGF0IDAgd2hlbiB1c2luZyBjb3B5dHMiIH0sCisgICAgeyAiY29weXRiIiwgICAgICAgICBIQVNfQVJHIHwgT1BUX0lOVCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICB7ICZjb3B5X3RiIH0sCisgICAgICAgICJjb3B5IGlucHV0IHN0cmVhbSB0aW1lIGJhc2Ugd2hlbiBzdHJlYW0gY29weWluZyIsICJtb2RlIiB9LAorICAgIHsgInNob3J0ZXN0IiwgICAgICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJUIHwgT1BUX09GRlNFVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoc2hvcnRlc3QpIH0sCisgICAgICAgICJmaW5pc2ggZW5jb2Rpbmcgd2l0aGluIHNob3J0ZXN0IGlucHV0IiB9LAorICAgIHsgImJpdGV4YWN0IiwgICAgICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJUIHwgT1BUX09GRlNFVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVUIHwgT1BUX0lOUFVULCAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoYml0ZXhhY3QpIH0sCisgICAgICAgICJiaXRleGFjdCBtb2RlIiB9LAorICAgIHsgImFwYWQiLCAgICAgICAgICAgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoYXBhZCkgfSwKKyAgICAgICAgImF1ZGlvIHBhZCIsICIiIH0sCisgICAgeyAiZHRzX2RlbHRhX3RocmVzaG9sZCIsIEhBU19BUkcgfCBPUFRfRkxPQVQgfCBPUFRfRVhQRVJULCAgICAgICB7ICZkdHNfZGVsdGFfdGhyZXNob2xkIH0sCisgICAgICAgICJ0aW1lc3RhbXAgZGlzY29udGludWl0eSBkZWx0YSB0aHJlc2hvbGQiLCAidGhyZXNob2xkIiB9LAorICAgIHsgImR0c19lcnJvcl90aHJlc2hvbGQiLCBIQVNfQVJHIHwgT1BUX0ZMT0FUIHwgT1BUX0VYUEVSVCwgICAgICAgeyAmZHRzX2Vycm9yX3RocmVzaG9sZCB9LAorICAgICAgICAidGltZXN0YW1wIGVycm9yIGRlbHRhIHRocmVzaG9sZCIsICJ0aHJlc2hvbGQiIH0sCisgICAgeyAieGVycm9yIiwgICAgICAgICBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICB7ICZleGl0X29uX2Vycm9yIH0sCisgICAgICAgICJleGl0IG9uIGVycm9yIiwgImVycm9yIiB9LAorICAgIHsgImFib3J0X29uIiwgICAgICAgSEFTX0FSRyB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfYWJvcnRfb24gfSwKKyAgICAgICAgImFib3J0IG9uIHRoZSBzcGVjaWZpZWQgY29uZGl0aW9uIGZsYWdzIiwgImZsYWdzIiB9LAorICAgIHsgImNvcHlpbmtmIiwgICAgICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJUIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGNvcHlfaW5pdGlhbF9ub25rZXlmcmFtZXMpIH0sCisgICAgICAgICJjb3B5IGluaXRpYWwgbm9uLWtleWZyYW1lcyIgfSwKKyAgICB7ICJjb3B5cHJpb3JzcyIsICAgIE9QVF9JTlQgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9TUEVDIHwgT1BUX09VVFBVVCwgICB7IC5vZmYgPSBPRkZTRVQoY29weV9wcmlvcl9zdGFydCkgfSwKKyAgICAgICAgImNvcHkgb3IgZGlzY2FyZCBmcmFtZXMgYmVmb3JlIHN0YXJ0IHRpbWUiIH0sCisgICAgeyAiZnJhbWVzIiwgICAgICAgICBPUFRfSU5UNjQgfCBIQVNfQVJHIHwgT1BUX1NQRUMgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQobWF4X2ZyYW1lcykgfSwKKyAgICAgICAgInNldCB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0byBvdXRwdXQiLCAibnVtYmVyIiB9LAorICAgIHsgInRhZyIsICAgICAgICAgICAgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfRVhQRVJUIHwgT1BUX09VVFBVVCB8IE9QVF9JTlBVVCwgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoY29kZWNfdGFncykgfSwKKyAgICAgICAgImZvcmNlIGNvZGVjIHRhZy9mb3VyY2MiLCAiZm91cmNjL3RhZyIgfSwKKyAgICB7ICJxIiwgICAgICAgICAgICAgIEhBU19BUkcgfCBPUFRfRVhQRVJUIHwgT1BUX0RPVUJMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfU1BFQyB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQocXNjYWxlKSB9LAorICAgICAgICAidXNlIGZpeGVkIHF1YWxpdHkgc2NhbGUgKFZCUikiLCAicSIgfSwKKyAgICB7ICJxc2NhbGUiLCAgICAgICAgIEhBU19BUkcgfCBPUFRfRVhQRVJUIHwgT1BUX1BFUkZJTEUgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfcXNjYWxlIH0sCisgICAgICAgICJ1c2UgZml4ZWQgcXVhbGl0eSBzY2FsZSAoVkJSKSIsICJxIiB9LAorICAgIHsgInByb2ZpbGUiLCAgICAgICAgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X3Byb2ZpbGUgfSwKKyAgICAgICAgInNldCBwcm9maWxlIiwgInByb2ZpbGUiIH0sCisgICAgeyAiZmlsdGVyIiwgICAgICAgICBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwgT1BUX09VVFBVVCwgeyAub2ZmID0gT0ZGU0VUKGZpbHRlcnMpIH0sCisgICAgICAgICJzZXQgc3RyZWFtIGZpbHRlcmdyYXBoIiwgImZpbHRlcl9ncmFwaCIgfSwKKyAgICB7ICJmaWx0ZXJfdGhyZWFkcyIsICBIQVNfQVJHIHwgT1BUX0lOVCwgICAgICAgICAgICAgICAgICAgICAgICAgIHsgJmZpbHRlcl9uYnRocmVhZHMgfSwKKyAgICAgICAgIm51bWJlciBvZiBub24tY29tcGxleCBmaWx0ZXIgdGhyZWFkcyIgfSwKKyAgICB7ICJmaWx0ZXJfc2NyaXB0IiwgIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQoZmlsdGVyX3NjcmlwdHMpIH0sCisgICAgICAgICJyZWFkIHN0cmVhbSBmaWx0ZXJncmFwaCBkZXNjcmlwdGlvbiBmcm9tIGEgZmlsZSIsICJmaWxlbmFtZSIgfSwKKyAgICB7ICJyZWluaXRfZmlsdGVyIiwgIEhBU19BUkcgfCBPUFRfSU5UIHwgT1BUX1NQRUMgfCBPUFRfSU5QVVQsICAgIHsgLm9mZiA9IE9GRlNFVChyZWluaXRfZmlsdGVycykgfSwKKyAgICAgICAgInJlaW5pdCBmaWx0ZXJncmFwaCBvbiBpbnB1dCBwYXJhbWV0ZXIgY2hhbmdlcyIsICIiIH0sCisgICAgeyAiZmlsdGVyX2NvbXBsZXgiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9maWx0ZXJfY29tcGxleCB9LAorICAgICAgICAiY3JlYXRlIGEgY29tcGxleCBmaWx0ZXJncmFwaCIsICJncmFwaF9kZXNjcmlwdGlvbiIgfSwKKyAgICB7ICJmaWx0ZXJfY29tcGxleF90aHJlYWRzIiwgSEFTX0FSRyB8IE9QVF9JTlQsICAgICAgICAgICAgICAgICAgIHsgJmZpbHRlcl9jb21wbGV4X25idGhyZWFkcyB9LAorICAgICAgICAibnVtYmVyIG9mIHRocmVhZHMgZm9yIC1maWx0ZXJfY29tcGxleCIgfSwKKyAgICB7ICJsYXZmaSIsICAgICAgICAgIEhBU19BUkcgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2ZpbHRlcl9jb21wbGV4IH0sCisgICAgICAgICJjcmVhdGUgYSBjb21wbGV4IGZpbHRlcmdyYXBoIiwgImdyYXBoX2Rlc2NyaXB0aW9uIiB9LAorICAgIHsgImZpbHRlcl9jb21wbGV4X3NjcmlwdCIsIEhBU19BUkcgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfZmlsdGVyX2NvbXBsZXhfc2NyaXB0IH0sCisgICAgICAgICJyZWFkIGNvbXBsZXggZmlsdGVyZ3JhcGggZGVzY3JpcHRpb24gZnJvbSBhIGZpbGUiLCAiZmlsZW5hbWUiIH0sCisgICAgeyAic3RhdHMiLCAgICAgICAgICBPUFRfQk9PTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICZwcmludF9zdGF0cyB9LAorICAgICAgICAicHJpbnQgcHJvZ3Jlc3MgcmVwb3J0IGR1cmluZyBlbmNvZGluZyIsIH0sCisgICAgeyAiYXR0YWNoIiwgICAgICAgICBIQVNfQVJHIHwgT1BUX1BFUkZJTEUgfCBPUFRfRVhQRVJUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2F0dGFjaCB9LAorICAgICAgICAiYWRkIGFuIGF0dGFjaG1lbnQgdG8gdGhlIG91dHB1dCBmaWxlIiwgImZpbGVuYW1lIiB9LAorICAgIHsgImR1bXBfYXR0YWNobWVudCIsIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9FWFBFUlQgfCBPUFRfSU5QVVQsICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGR1bXBfYXR0YWNobWVudCkgfSwKKyAgICAgICAgImV4dHJhY3QgYW4gYXR0YWNobWVudCBpbnRvIGEgZmlsZSIsICJmaWxlbmFtZSIgfSwKKyAgICB7ICJzdHJlYW1fbG9vcCIsIE9QVF9JTlQgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9JTlBVVCB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfT0ZGU0VULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQobG9vcCkgfSwgInNldCBudW1iZXIgb2YgdGltZXMgaW5wdXQgc3RyZWFtIHNoYWxsIGJlIGxvb3BlZCIsICJsb29wIGNvdW50IiB9LAorICAgIHsgImRlYnVnX3RzIiwgICAgICAgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgeyAmZGVidWdfdHMgfSwKKyAgICAgICAgInByaW50IHRpbWVzdGFtcCBkZWJ1Z2dpbmcgaW5mbyIgfSwKKyAgICB7ICJtYXhfZXJyb3JfcmF0ZSIsICBIQVNfQVJHIHwgT1BUX0ZMT0FULCAgICAgICAgICAgICAgICAgICAgICAgIHsgJm1heF9lcnJvcl9yYXRlIH0sCisgICAgICAgICJyYXRpbyBvZiBlcnJvcnMgKDAuMDogbm8gZXJyb3JzLCAxLjA6IDEwMCUgZXJyb3JzKSBhYm92ZSB3aGljaCBmZm1wZWcgcmV0dXJucyBhbiBlcnJvciBpbnN0ZWFkIG9mIHN1Y2Nlc3MuIiwgIm1heGltdW0gZXJyb3IgcmF0ZSIgfSwKKyAgICB7ICJkaXNjYXJkIiwgICAgICAgIE9QVF9TVFJJTkcgfCBIQVNfQVJHIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGRpc2NhcmQpIH0sCisgICAgICAgICJkaXNjYXJkIiwgIiIgfSwKKyAgICB7ICJkaXNwb3NpdGlvbiIsICAgIE9QVF9TVFJJTkcgfCBIQVNfQVJHIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGRpc3Bvc2l0aW9uKSB9LAorICAgICAgICAiZGlzcG9zaXRpb24iLCAiIiB9LAorICAgIHsgInRocmVhZF9xdWV1ZV9zaXplIiwgSEFTX0FSRyB8IE9QVF9JTlQgfCBPUFRfT0ZGU0VUIHwgT1BUX0VYUEVSVCB8IE9QVF9JTlBVVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVCh0aHJlYWRfcXVldWVfc2l6ZSkgfSwKKyAgICAgICAgInNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcXVldWVkIHBhY2tldHMgZnJvbSB0aGUgZGVtdXhlciIgfSwKKyAgICB7ICJmaW5kX3N0cmVhbV9pbmZvIiwgT1BUX0JPT0wgfCBPUFRfUEVSRklMRSB8IE9QVF9JTlBVVCB8IE9QVF9FWFBFUlQsIHsgJmZpbmRfc3RyZWFtX2luZm8gfSwKKyAgICAgICAgInJlYWQgYW5kIGRlY29kZSB0aGUgc3RyZWFtcyB0byBmaWxsIG1pc3NpbmcgaW5mb3JtYXRpb24gd2l0aCBoZXVyaXN0aWNzIiB9LAorCisgICAgLyogdmlkZW8gb3B0aW9ucyAqLworICAgIHsgInZmcmFtZXMiLCAgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfdmlkZW9fZnJhbWVzIH0sCisgICAgICAgICJzZXQgdGhlIG51bWJlciBvZiB2aWRlbyBmcmFtZXMgdG8gb3V0cHV0IiwgIm51bWJlciIgfSwKKyAgICB7ICJyIiwgICAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHICB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoZnJhbWVfcmF0ZXMpIH0sCisgICAgICAgICJzZXQgZnJhbWUgcmF0ZSAoSHogdmFsdWUsIGZyYWN0aW9uIG9yIGFiYnJldmlhdGlvbikiLCAicmF0ZSIgfSwKKyAgICB7ICJzIiwgICAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX1NVQlRJVExFIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKKyAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmcmFtZV9zaXplcykgfSwKKyAgICAgICAgInNldCBmcmFtZSBzaXplIChXeEggb3IgYWJicmV2aWF0aW9uKSIsICJzaXplIiB9LAorICAgIHsgImFzcGVjdCIsICAgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKKyAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmcmFtZV9hc3BlY3RfcmF0aW9zKSB9LAorICAgICAgICAic2V0IGFzcGVjdCByYXRpbyAoNDozLCAxNjo5IG9yIDEuMzMzMywgMS43Nzc3KSIsICJhc3BlY3QiIH0sCisgICAgeyAicGl4X2ZtdCIsICAgICAgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKKyAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmcmFtZV9waXhfZm10cykgfSwKKyAgICAgICAgInNldCBwaXhlbCBmb3JtYXQiLCAiZm9ybWF0IiB9LAorICAgIHsgImJpdHNfcGVyX3Jhd19zYW1wbGUiLCBPUFRfVklERU8gfCBPUFRfSU5UIHwgSEFTX0FSRywgICAgICAgICAgICAgICAgICAgICAgeyAmZnJhbWVfYml0c19wZXJfcmF3X3NhbXBsZSB9LAorICAgICAgICAic2V0IHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcmF3IHNhbXBsZSIsICJudW1iZXIiIH0sCisgICAgeyAiaW50cmEiLCAgICAgICAgT1BUX1ZJREVPIHwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgICB7ICZpbnRyYV9vbmx5IH0sCisgICAgICAgICJkZXByZWNhdGVkIHVzZSAtZyAxIiB9LAorICAgIHsgInZuIiwgICAgICAgICAgIE9QVF9WSURFTyB8IE9QVF9CT09MICB8IE9QVF9PRkZTRVQgfCBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULHsgLm9mZiA9IE9GRlNFVCh2aWRlb19kaXNhYmxlKSB9LAorICAgICAgICAiZGlzYWJsZSB2aWRlbyIgfSwKKyAgICB7ICJyY19vdmVycmlkZSIsICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCAgfCBPUFRfU1RSSU5HIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHJjX292ZXJyaWRlcykgfSwKKyAgICAgICAgInJhdGUgY29udHJvbCBvdmVycmlkZSBmb3Igc3BlY2lmaWMgaW50ZXJ2YWxzIiwgIm92ZXJyaWRlIiB9LAorICAgIHsgInZjb2RlYyIsICAgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgIHwgT1BUX1BFUkZJTEUgfCBPUFRfSU5QVVQgfAorICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfdmlkZW9fY29kZWMgfSwKKyAgICAgICAgImZvcmNlIHZpZGVvIGNvZGVjICgnY29weScgdG8gY29weSBzdHJlYW0pIiwgImNvZGVjIiB9LAorICAgIHsgInNhbWVxIiwgICAgICAgIE9QVF9WSURFTyB8IE9QVF9FWFBFUlQgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfc2FtZXEgfSwKKyAgICAgICAgIlJlbW92ZWQiIH0sCisgICAgeyAic2FtZV9xdWFudCIsICAgT1BUX1ZJREVPIHwgT1BUX0VYUEVSVCAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9zYW1lcSB9LAorICAgICAgICAiUmVtb3ZlZCIgfSwKKyAgICB7ICJ0aW1lY29kZSIsICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X3RpbWVjb2RlIH0sCisgICAgICAgICJzZXQgaW5pdGlhbCBUaW1lQ29kZSB2YWx1ZS4iLCAiaGg6bW06c3NbOjsuXWZmIiB9LAorICAgIHsgInBhc3MiLCAgICAgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgfCBPUFRfU1BFQyB8IE9QVF9JTlQgfCBPUFRfT1VUUFVULCAgICAgeyAub2ZmID0gT0ZGU0VUKHBhc3MpIH0sCisgICAgICAgICJzZWxlY3QgdGhlIHBhc3MgbnVtYmVyICgxIHRvIDMpIiwgIm4iIH0sCisgICAgeyAicGFzc2xvZ2ZpbGUiLCAgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfRVhQRVJUIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKHBhc3Nsb2dmaWxlcykgfSwKKyAgICAgICAgInNlbGVjdCB0d28gcGFzcyBsb2cgZmlsZSBuYW1lIHByZWZpeCIsICJwcmVmaXgiIH0sCisgICAgeyAiZGVpbnRlcmxhY2UiLCAgT1BUX1ZJREVPIHwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCAgICAgICAgICAgICAgICAgICAgICAgICB7ICZkb19kZWludGVybGFjZSB9LAorICAgICAgICAidGhpcyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIHRoZSB5YWRpZiBmaWx0ZXIgaW5zdGVhZCIgfSwKKyAgICB7ICJwc25yIiwgICAgICAgICBPUFRfVklERU8gfCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsICAgICAgICAgICAgICAgICAgICAgICAgIHsgJmRvX3BzbnIgfSwKKyAgICAgICAgImNhbGN1bGF0ZSBQU05SIG9mIGNvbXByZXNzZWQgZnJhbWVzIiB9LAorICAgIHsgInZzdGF0cyIsICAgICAgIE9QVF9WSURFTyB8IE9QVF9FWFBFUlQgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfdnN0YXRzIH0sCisgICAgICAgICJkdW1wIHZpZGVvIGNvZGluZyBzdGF0aXN0aWNzIHRvIGZpbGUiIH0sCisgICAgeyAidnN0YXRzX2ZpbGUiLCAgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgLCAgICAgICAgICAgICAgICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF92c3RhdHNfZmlsZSB9LAorICAgICAgICAiZHVtcCB2aWRlbyBjb2Rpbmcgc3RhdGlzdGljcyB0byBmaWxlIiwgImZpbGUiIH0sCisgICAgeyAidnN0YXRzX3ZlcnNpb24iLCAgT1BUX1ZJREVPIHwgT1BUX0lOVCB8IEhBU19BUkcgfCBPUFRfRVhQRVJUICwgICAgICAgICAgICB7ICZ2c3RhdHNfdmVyc2lvbiB9LAorICAgICAgICAiVmVyc2lvbiBvZiB0aGUgdnN0YXRzIGZvcm1hdCB0byB1c2UuIn0sCisgICAgeyAidmYiLCAgICAgICAgICAgT1BUX1ZJREVPIHwgSEFTX0FSRyAgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF92aWRlb19maWx0ZXJzIH0sCisgICAgICAgICJzZXQgdmlkZW8gZmlsdGVycyIsICJmaWx0ZXJfZ3JhcGgiIH0sCisgICAgeyAiaW50cmFfbWF0cml4IiwgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKKyAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChpbnRyYV9tYXRyaWNlcykgfSwKKyAgICAgICAgInNwZWNpZnkgaW50cmEgbWF0cml4IGNvZWZmcyIsICJtYXRyaXgiIH0sCisgICAgeyAiaW50ZXJfbWF0cml4IiwgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwKKyAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChpbnRlcl9tYXRyaWNlcykgfSwKKyAgICAgICAgInNwZWNpZnkgaW50ZXIgbWF0cml4IGNvZWZmcyIsICJtYXRyaXgiIH0sCisgICAgeyAiY2hyb21hX2ludHJhX21hdHJpeCIsIE9QVF9WSURFTyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUICB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoY2hyb21hX2ludHJhX21hdHJpY2VzKSB9LAorICAgICAgICAic3BlY2lmeSBpbnRyYSBtYXRyaXggY29lZmZzIiwgIm1hdHJpeCIgfSwKKyAgICB7ICJ0b3AiLCAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCAgfCBPUFRfSU5UfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQodG9wX2ZpZWxkX2ZpcnN0KSB9LAorICAgICAgICAidG9wPTEvYm90dG9tPTAvYXV0bz0tMSBmaWVsZCBmaXJzdCIsICIiIH0sCisgICAgeyAidnRhZyIsICAgICAgICAgT1BUX1ZJREVPIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgIHwgT1BUX1BFUkZJTEUgfAorICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfb2xkMm5ldyB9LAorICAgICAgICAiZm9yY2UgdmlkZW8gdGFnL2ZvdXJjYyIsICJmb3VyY2MvdGFnIiB9LAorICAgIHsgInFwaGlzdCIsICAgICAgIE9QVF9WSURFTyB8IE9QVF9CT09MIHwgT1BUX0VYUEVSVCAsICAgICAgICAgICAgICAgICAgICAgICAgeyAmcXBfaGlzdCB9LAorICAgICAgICAic2hvdyBRUCBoaXN0b2dyYW0iIH0sCisgICAgeyAiZm9yY2VfZnBzIiwgICAgT1BUX1ZJREVPIHwgT1BUX0JPT0wgfCBPUFRfRVhQRVJUICB8IE9QVF9TUEVDIHwKKyAgICAgICAgICAgICAgICAgICAgICBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmb3JjZV9mcHMpIH0sCisgICAgICAgICJmb3JjZSB0aGUgc2VsZWN0ZWQgZnJhbWVyYXRlLCBkaXNhYmxlIHRoZSBiZXN0IHN1cHBvcnRlZCBmcmFtZXJhdGUgc2VsZWN0aW9uIiB9LAorICAgIHsgInN0cmVhbWlkIiwgICAgIE9QVF9WSURFTyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwgT1BUX1BFUkZJTEUgfAorICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfc3RyZWFtaWQgfSwKKyAgICAgICAgInNldCB0aGUgdmFsdWUgb2YgYW4gb3V0ZmlsZSBzdHJlYW1pZCIsICJzdHJlYW1JbmRleDp2YWx1ZSIgfSwKKyAgICB7ICJmb3JjZV9rZXlfZnJhbWVzIiwgT1BUX1ZJREVPIHwgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUX1NQRUMgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChmb3JjZWRfa2V5X2ZyYW1lcykgfSwKKyAgICAgICAgImZvcmNlIGtleSBmcmFtZXMgYXQgc3BlY2lmaWVkIHRpbWVzdGFtcHMiLCAidGltZXN0YW1wcyIgfSwKKyAgICB7ICJhYiIsICAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2JpdHJhdGUgfSwKKyAgICAgICAgImF1ZGlvIGJpdHJhdGUgKHBsZWFzZSB1c2UgLWI6YSkiLCAiYml0cmF0ZSIgfSwKKyAgICB7ICJiIiwgICAgICAgICAgICBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2JpdHJhdGUgfSwKKyAgICAgICAgInZpZGVvIGJpdHJhdGUgKHBsZWFzZSB1c2UgLWI6dikiLCAiYml0cmF0ZSIgfSwKKyAgICB7ICJod2FjY2VsIiwgICAgICAgICAgT1BUX1ZJREVPIHwgT1BUX1NUUklORyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BUX1NQRUMgfCBPUFRfSU5QVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChod2FjY2VscykgfSwKKyAgICAgICAgInVzZSBIVyBhY2NlbGVyYXRlZCBkZWNvZGluZyIsICJod2FjY2VsIG5hbWUiIH0sCisgICAgeyAiaHdhY2NlbF9kZXZpY2UiLCAgIE9QVF9WSURFTyB8IE9QVF9TVFJJTkcgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9TUEVDIHwgT1BUX0lOUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC5vZmYgPSBPRkZTRVQoaHdhY2NlbF9kZXZpY2VzKSB9LAorICAgICAgICAic2VsZWN0IGEgZGV2aWNlIGZvciBIVyBhY2NlbGVyYXRpb24iLCAiZGV2aWNlbmFtZSIgfSwKKyAgICB7ICJod2FjY2VsX291dHB1dF9mb3JtYXQiLCBPUFRfVklERU8gfCBPUFRfU1RSSU5HIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRfU1BFQyB8IE9QVF9JTlBVVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGh3YWNjZWxfb3V0cHV0X2Zvcm1hdHMpIH0sCisgICAgICAgICJzZWxlY3Qgb3V0cHV0IGZvcm1hdCB1c2VkIHdpdGggSFcgYWNjZWxlcmF0ZWQgZGVjb2RpbmciLCAiZm9ybWF0IiB9LAorI2lmIENPTkZJR19WSURFT1RPT0xCT1gKKyAgICB7ICJ2aWRlb3Rvb2xib3hfcGl4Zm10IiwgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfRVhQRVJULCB7ICZ2aWRlb3Rvb2xib3hfcGl4Zm10fSwgIiIgfSwKKyNlbmRpZgorICAgIHsgImh3YWNjZWxzIiwgICAgICAgICBPUFRfRVhJVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBzaG93X2h3YWNjZWxzIH0sCisgICAgICAgICJzaG93IGF2YWlsYWJsZSBIVyBhY2NlbGVyYXRpb24gbWV0aG9kcyIgfSwKKyAgICB7ICJhdXRvcm90YXRlIiwgICAgICAgSEFTX0FSRyB8IE9QVF9CT09MIHwgT1BUX1NQRUMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUFRfRVhQRVJUIHwgT1BUX0lOUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGF1dG9yb3RhdGUpIH0sCisgICAgICAgICJhdXRvbWF0aWNhbGx5IGluc2VydCBjb3JyZWN0IHJvdGF0ZSBmaWx0ZXJzIiB9LAorCisgICAgLyogYXVkaW8gb3B0aW9ucyAqLworICAgIHsgImFmcmFtZXMiLCAgICAgICAgT1BUX0FVRElPIHwgSEFTX0FSRyAgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9hdWRpb19mcmFtZXMgfSwKKyAgICAgICAgInNldCB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB0byBvdXRwdXQiLCAibnVtYmVyIiB9LAorICAgIHsgImFxIiwgICAgICAgICAgICAgT1BUX0FVRElPIHwgSEFTX0FSRyAgfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsICAgICAgICAgICB7IC5mdW5jX2FyZyA9IG9wdF9hdWRpb19xc2NhbGUgfSwKKyAgICAgICAgInNldCBhdWRpbyBxdWFsaXR5IChjb2RlYy1zcGVjaWZpYykiLCAicXVhbGl0eSIsIH0sCisgICAgeyAiYXIiLCAgICAgICAgICAgICBPUFRfQVVESU8gfCBIQVNfQVJHICB8IE9QVF9JTlQgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChhdWRpb19zYW1wbGVfcmF0ZSkgfSwKKyAgICAgICAgInNldCBhdWRpbyBzYW1wbGluZyByYXRlIChpbiBIeikiLCAicmF0ZSIgfSwKKyAgICB7ICJhYyIsICAgICAgICAgICAgIE9QVF9BVURJTyB8IEhBU19BUkcgIHwgT1BUX0lOVCB8IE9QVF9TUEVDIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAub2ZmID0gT0ZGU0VUKGF1ZGlvX2NoYW5uZWxzKSB9LAorICAgICAgICAic2V0IG51bWJlciBvZiBhdWRpbyBjaGFubmVscyIsICJjaGFubmVscyIgfSwKKyAgICB7ICJhbiIsICAgICAgICAgICAgIE9QVF9BVURJTyB8IE9QVF9CT09MIHwgT1BUX09GRlNFVCB8IE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQseyAub2ZmID0gT0ZGU0VUKGF1ZGlvX2Rpc2FibGUpIH0sCisgICAgICAgICJkaXNhYmxlIGF1ZGlvIiB9LAorICAgIHsgImFjb2RlYyIsICAgICAgICAgT1BUX0FVRElPIHwgSEFTX0FSRyAgfCBPUFRfUEVSRklMRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2F1ZGlvX2NvZGVjIH0sCisgICAgICAgICJmb3JjZSBhdWRpbyBjb2RlYyAoJ2NvcHknIHRvIGNvcHkgc3RyZWFtKSIsICJjb2RlYyIgfSwKKyAgICB7ICJhdGFnIiwgICAgICAgICAgIE9QVF9BVURJTyB8IEhBU19BUkcgIHwgT1BUX0VYUEVSVCB8IE9QVF9QRVJGSUxFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfb2xkMm5ldyB9LAorICAgICAgICAiZm9yY2UgYXVkaW8gdGFnL2ZvdXJjYyIsICJmb3VyY2MvdGFnIiB9LAorICAgIHsgInZvbCIsICAgICAgICAgICAgT1BUX0FVRElPIHwgSEFTX0FSRyAgfCBPUFRfSU5ULCAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICZhdWRpb192b2x1bWUgfSwKKyAgICAgICAgImNoYW5nZSBhdWRpbyB2b2x1bWUgKDI1Nj1ub3JtYWwpIiAsICJ2b2x1bWUiIH0sCisgICAgeyAic2FtcGxlX2ZtdCIsICAgICBPUFRfQVVESU8gfCBIQVNfQVJHICB8IE9QVF9FWFBFUlQgfCBPUFRfU1BFQyB8CisgICAgICAgICAgICAgICAgICAgICAgICBPUFRfU1RSSU5HIHwgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgICAgICAgIHsgLm9mZiA9IE9GRlNFVChzYW1wbGVfZm10cykgfSwKKyAgICAgICAgInNldCBzYW1wbGUgZm9ybWF0IiwgImZvcm1hdCIgfSwKKyAgICB7ICJjaGFubmVsX2xheW91dCIsIE9QVF9BVURJTyB8IEhBU19BUkcgIHwgT1BUX0VYUEVSVCB8IE9QVF9QRVJGSUxFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfY2hhbm5lbF9sYXlvdXQgfSwKKyAgICAgICAgInNldCBjaGFubmVsIGxheW91dCIsICJsYXlvdXQiIH0sCisgICAgeyAiYWYiLCAgICAgICAgICAgICBPUFRfQVVESU8gfCBIQVNfQVJHICB8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgICAgICAgICAgIHsgLmZ1bmNfYXJnID0gb3B0X2F1ZGlvX2ZpbHRlcnMgfSwKKyAgICAgICAgInNldCBhdWRpbyBmaWx0ZXJzIiwgImZpbHRlcl9ncmFwaCIgfSwKKyAgICB7ICJndWVzc19sYXlvdXRfbWF4IiwgT1BUX0FVRElPIHwgSEFTX0FSRyB8IE9QVF9JTlQgfCBPUFRfU1BFQyB8IE9QVF9FWFBFUlQgfCBPUFRfSU5QVVQsIHsgLm9mZiA9IE9GRlNFVChndWVzc19sYXlvdXRfbWF4KSB9LAorICAgICAgInNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgdG8gdHJ5IHRvIGd1ZXNzIHRoZSBjaGFubmVsIGxheW91dCIgfSwKKworICAgIC8qIHN1YnRpdGxlIG9wdGlvbnMgKi8KKyAgICB7ICJzbiIsICAgICBPUFRfU1VCVElUTEUgfCBPUFRfQk9PTCB8IE9QVF9PRkZTRVQgfCBPUFRfSU5QVVQgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQoc3VidGl0bGVfZGlzYWJsZSkgfSwKKyAgICAgICAgImRpc2FibGUgc3VidGl0bGUiIH0sCisgICAgeyAic2NvZGVjIiwgT1BUX1NVQlRJVExFIHwgSEFTX0FSRyAgfCBPUFRfUEVSRklMRSB8IE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X3N1YnRpdGxlX2NvZGVjIH0sCisgICAgICAgICJmb3JjZSBzdWJ0aXRsZSBjb2RlYyAoJ2NvcHknIHRvIGNvcHkgc3RyZWFtKSIsICJjb2RlYyIgfSwKKyAgICB7ICJzdGFnIiwgICBPUFRfU1VCVElUTEUgfCBIQVNfQVJHICB8IE9QVF9FWFBFUlQgIHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCB7IC5mdW5jX2FyZyA9IG9wdF9vbGQybmV3IH0KKyAgICAgICAgLCAiZm9yY2Ugc3VidGl0bGUgdGFnL2ZvdXJjYyIsICJmb3VyY2MvdGFnIiB9LAorICAgIHsgImZpeF9zdWJfZHVyYXRpb24iLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQgfCBPUFRfU1VCVElUTEUgfCBPUFRfU1BFQyB8IE9QVF9JTlBVVCwgeyAub2ZmID0gT0ZGU0VUKGZpeF9zdWJfZHVyYXRpb24pIH0sCisgICAgICAgICJmaXggc3VidGl0bGVzIGR1cmF0aW9uIiB9LAorICAgIHsgImNhbnZhc19zaXplIiwgT1BUX1NVQlRJVExFIHwgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfU1BFQyB8IE9QVF9JTlBVVCwgeyAub2ZmID0gT0ZGU0VUKGNhbnZhc19zaXplcykgfSwKKyAgICAgICAgInNldCBjYW52YXMgc2l6ZSAoV3hIIG9yIGFiYnJldmlhdGlvbikiLCAic2l6ZSIgfSwKKworICAgIC8qIGdyYWIgb3B0aW9ucyAqLworICAgIHsgInZjIiwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfVklERU8sIHsgLmZ1bmNfYXJnID0gb3B0X3ZpZGVvX2NoYW5uZWwgfSwKKyAgICAgICAgImRlcHJlY2F0ZWQsIHVzZSAtY2hhbm5lbCIsICJjaGFubmVsIiB9LAorICAgIHsgInR2c3RkIiwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfVklERU8sIHsgLmZ1bmNfYXJnID0gb3B0X3ZpZGVvX3N0YW5kYXJkIH0sCisgICAgICAgICJkZXByZWNhdGVkLCB1c2UgLXN0YW5kYXJkIiwgInN0YW5kYXJkIiB9LAorICAgIHsgImlzeW5jIiwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCB7ICZpbnB1dF9zeW5jIH0sICJ0aGlzIG9wdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBkb2VzIG5vdGhpbmciLCAiIiB9LAorCisgICAgLyogbXV4ZXIgb3B0aW9ucyAqLworICAgIHsgIm11eGRlbGF5IiwgICBPUFRfRkxPQVQgfCBIQVNfQVJHIHwgT1BUX0VYUEVSVCB8IE9QVF9PRkZTRVQgfCBPUFRfT1VUUFVULCB7IC5vZmYgPSBPRkZTRVQobXV4X21heF9kZWxheSkgfSwKKyAgICAgICAgInNldCB0aGUgbWF4aW11bSBkZW11eC1kZWNvZGUgZGVsYXkiLCAic2Vjb25kcyIgfSwKKyAgICB7ICJtdXhwcmVsb2FkIiwgT1BUX0ZMT0FUIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfT0ZGU0VUIHwgT1BUX09VVFBVVCwgeyAub2ZmID0gT0ZGU0VUKG11eF9wcmVsb2FkKSB9LAorICAgICAgICAic2V0IHRoZSBpbml0aWFsIGRlbXV4LWRlY29kZSBkZWxheSIsICJzZWNvbmRzIiB9LAorICAgIHsgInNkcF9maWxlIiwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfT1VUUFVULCB7IC5mdW5jX2FyZyA9IG9wdF9zZHBfZmlsZSB9LAorICAgICAgICAic3BlY2lmeSBhIGZpbGUgaW4gd2hpY2ggdG8gcHJpbnQgc2RwIGluZm9ybWF0aW9uIiwgImZpbGUiIH0sCisKKyAgICB7ICJ0aW1lX2Jhc2UiLCBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9FWFBFUlQgfCBPUFRfU1BFQyB8IE9QVF9PVVRQVVQsIHsgLm9mZiA9IE9GRlNFVCh0aW1lX2Jhc2VzKSB9LAorICAgICAgICAic2V0IHRoZSBkZXNpcmVkIHRpbWUgYmFzZSBoaW50IGZvciBvdXRwdXQgc3RyZWFtICgxOjI0LCAxOjQ4MDAwIG9yIDAuMDQxNjYsIDIuMDgzM2UtNSkiLCAicmF0aW8iIH0sCisgICAgeyAiZW5jX3RpbWVfYmFzZSIsIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX0VYUEVSVCB8IE9QVF9TUEVDIHwgT1BUX09VVFBVVCwgeyAub2ZmID0gT0ZGU0VUKGVuY190aW1lX2Jhc2VzKSB9LAorICAgICAgICAic2V0IHRoZSBkZXNpcmVkIHRpbWUgYmFzZSBmb3IgdGhlIGVuY29kZXIgKDE6MjQsIDE6NDgwMDAgb3IgMC4wNDE2NiwgMi4wODMzZS01KS4gIgorICAgICAgICAidHdvIHNwZWNpYWwgdmFsdWVzIGFyZSBkZWZpbmVkIC0gIgorICAgICAgICAiMCA9IHVzZSBmcmFtZSByYXRlICh2aWRlbykgb3Igc2FtcGxlIHJhdGUgKGF1ZGlvKSwiCisgICAgICAgICItMSA9IG1hdGNoIHNvdXJjZSB0aW1lIGJhc2UiLCAicmF0aW8iIH0sCisKKyAgICB7ICJic2YiLCBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9TUEVDIHwgT1BUX0VYUEVSVCB8IE9QVF9PVVRQVVQsIHsgLm9mZiA9IE9GRlNFVChiaXRzdHJlYW1fZmlsdGVycykgfSwKKyAgICAgICAgIkEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYml0c3RyZWFtIGZpbHRlcnMiLCAiYml0c3RyZWFtX2ZpbHRlcnMiIH0sCisgICAgeyAiYWJzZiIsIEhBU19BUkcgfCBPUFRfQVVESU8gfCBPUFRfRVhQRVJUfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X29sZDJuZXcgfSwKKyAgICAgICAgImRlcHJlY2F0ZWQiLCAiYXVkaW8gYml0c3RyZWFtX2ZpbHRlcnMiIH0sCisgICAgeyAidmJzZiIsIE9QVF9WSURFTyB8IEhBU19BUkcgfCBPUFRfRVhQRVJUfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X29sZDJuZXcgfSwKKyAgICAgICAgImRlcHJlY2F0ZWQiLCAidmlkZW8gYml0c3RyZWFtX2ZpbHRlcnMiIH0sCisKKyAgICB7ICJhcHJlIiwgSEFTX0FSRyB8IE9QVF9BVURJTyB8IE9QVF9FWFBFUlR8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgICAgeyAuZnVuY19hcmcgPSBvcHRfcHJlc2V0IH0sCisgICAgICAgICJzZXQgdGhlIGF1ZGlvIG9wdGlvbnMgdG8gdGhlIGluZGljYXRlZCBwcmVzZXQiLCAicHJlc2V0IiB9LAorICAgIHsgInZwcmUiLCBPUFRfVklERU8gfCBIQVNfQVJHIHwgT1BUX0VYUEVSVHwgT1BUX1BFUkZJTEUgfCBPUFRfT1VUUFVULCAgICB7IC5mdW5jX2FyZyA9IG9wdF9wcmVzZXQgfSwKKyAgICAgICAgInNldCB0aGUgdmlkZW8gb3B0aW9ucyB0byB0aGUgaW5kaWNhdGVkIHByZXNldCIsICJwcmVzZXQiIH0sCisgICAgeyAic3ByZSIsIEhBU19BUkcgfCBPUFRfU1VCVElUTEUgfCBPUFRfRVhQRVJUfCBPUFRfUEVSRklMRSB8IE9QVF9PVVRQVVQsIHsgLmZ1bmNfYXJnID0gb3B0X3ByZXNldCB9LAorICAgICAgICAic2V0IHRoZSBzdWJ0aXRsZSBvcHRpb25zIHRvIHRoZSBpbmRpY2F0ZWQgcHJlc2V0IiwgInByZXNldCIgfSwKKyAgICB7ICJmcHJlIiwgSEFTX0FSRyB8IE9QVF9FWFBFUlR8IE9QVF9QRVJGSUxFIHwgT1BUX09VVFBVVCwgICAgICAgICAgICAgICAgeyAuZnVuY19hcmcgPSBvcHRfcHJlc2V0IH0sCisgICAgICAgICJzZXQgb3B0aW9ucyBmcm9tIGluZGljYXRlZCBwcmVzZXQgZmlsZSIsICJmaWxlbmFtZSIgfSwKKworICAgIHsgIm1heF9tdXhpbmdfcXVldWVfc2l6ZSIsIEhBU19BUkcgfCBPUFRfSU5UIHwgT1BUX1NQRUMgfCBPUFRfRVhQRVJUIHwgT1BUX09VVFBVVCwgeyAub2ZmID0gT0ZGU0VUKG1heF9tdXhpbmdfcXVldWVfc2l6ZSkgfSwKKyAgICAgICAgIm1heGltdW0gbnVtYmVyIG9mIHBhY2tldHMgdGhhdCBjYW4gYmUgYnVmZmVyZWQgd2hpbGUgd2FpdGluZyBmb3IgYWxsIHN0cmVhbXMgdG8gaW5pdGlhbGl6ZSIsICJwYWNrZXRzIiB9LAorCisgICAgLyogZGF0YSBjb2RlYyBzdXBwb3J0ICovCisgICAgeyAiZGNvZGVjIiwgSEFTX0FSRyB8IE9QVF9EQVRBIHwgT1BUX1BFUkZJTEUgfCBPUFRfRVhQRVJUIHwgT1BUX0lOUFVUIHwgT1BUX09VVFBVVCwgeyAuZnVuY19hcmcgPSBvcHRfZGF0YV9jb2RlYyB9LAorICAgICAgICAiZm9yY2UgZGF0YSBjb2RlYyAoJ2NvcHknIHRvIGNvcHkgc3RyZWFtKSIsICJjb2RlYyIgfSwKKyAgICB7ICJkbiIsIE9QVF9CT09MIHwgT1BUX1ZJREVPIHwgT1BUX09GRlNFVCB8IE9QVF9JTlBVVCB8IE9QVF9PVVRQVVQsIHsgLm9mZiA9IE9GRlNFVChkYXRhX2Rpc2FibGUpIH0sCisgICAgICAgICJkaXNhYmxlIGRhdGEiIH0sCisKKyNpZiBDT05GSUdfVkFBUEkKKyAgICB7ICJ2YWFwaV9kZXZpY2UiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgeyAuZnVuY19hcmcgPSBvcHRfdmFhcGlfZGV2aWNlIH0sCisgICAgICAgICJzZXQgVkFBUEkgaGFyZHdhcmUgZGV2aWNlIChEUk0gcGF0aCBvciBYMTEgZGlzcGxheSBuYW1lKSIsICJkZXZpY2UiIH0sCisjZW5kaWYKKworI2lmIENPTkZJR19RU1YKKyAgICB7ICJxc3ZfZGV2aWNlIiwgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfRVhQRVJULCB7ICZxc3ZfZGV2aWNlIH0sCisgICAgICAgICJzZXQgUVNWIGhhcmR3YXJlIGRldmljZSAoRGlyZWN0WCBhZGFwdGVyIGluZGV4LCBEUk0gcGF0aCBvciBYMTEgZGlzcGxheSBuYW1lKSIsICJkZXZpY2UifSwKKyNlbmRpZgorCisgICAgeyAiaW5pdF9od19kZXZpY2UiLCBIQVNfQVJHIHwgT1BUX0VYUEVSVCwgeyAuZnVuY19hcmcgPSBvcHRfaW5pdF9od19kZXZpY2UgfSwKKyAgICAgICAgImluaXRpYWxpc2UgaGFyZHdhcmUgZGV2aWNlIiwgImFyZ3MiIH0sCisgICAgeyAiZmlsdGVyX2h3X2RldmljZSIsIEhBU19BUkcgfCBPUFRfRVhQRVJULCB7IC5mdW5jX2FyZyA9IG9wdF9maWx0ZXJfaHdfZGV2aWNlIH0sCisgICAgICAgICJzZXQgaGFyZHdhcmUgZGV2aWNlIHVzZWQgd2hlbiBmaWx0ZXJpbmciLCAiZGV2aWNlIiB9LAorCisgICAgeyBOVUxMLCB9LAorfTsKZGlmZiAtLWdpdCBhL2ZmdG9vbHMvZmZtcGVnX3Fzdi5jIGIvZmZ0b29scy9mZm1wZWdfcXN2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0Mjc1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZmdG9vbHMvZmZtcGVnX3Fzdi5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxtZngvbWZ4dmlkZW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfcXN2LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3Fzdi5oIgorCisjaW5jbHVkZSAiZmZtcGVnLmgiCisKK2NoYXIgKnFzdl9kZXZpY2UgPSBOVUxMOworCitzdGF0aWMgaW50IHFzdl9nZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKQoreworICAgIElucHV0U3RyZWFtICppc3QgPSBzLT5vcGFxdWU7CisKKyAgICByZXR1cm4gYXZfaHdmcmFtZV9nZXRfYnVmZmVyKGlzdC0+aHdfZnJhbWVzX2N0eCwgZnJhbWUsIDApOworfQorCitzdGF0aWMgdm9pZCBxc3ZfdW5pbml0KEFWQ29kZWNDb250ZXh0ICpzKQoreworICAgIElucHV0U3RyZWFtICppc3QgPSBzLT5vcGFxdWU7CisgICAgYXZfYnVmZmVyX3VucmVmKCZpc3QtPmh3X2ZyYW1lc19jdHgpOworfQorCitzdGF0aWMgaW50IHFzdl9kZXZpY2VfaW5pdChJbnB1dFN0cmVhbSAqaXN0KQoreworICAgIGludCBlcnI7CisgICAgQVZEaWN0aW9uYXJ5ICpkaWN0ID0gTlVMTDsKKworICAgIGlmIChxc3ZfZGV2aWNlKSB7CisgICAgICAgIGVyciA9IGF2X2RpY3Rfc2V0KCZkaWN0LCAiY2hpbGRfZGV2aWNlIiwgcXN2X2RldmljZSwgMCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9od2RldmljZV9jdHhfY3JlYXRlKCZod19kZXZpY2VfY3R4LCBBVl9IV0RFVklDRV9UWVBFX1FTViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzdC0+aHdhY2NlbF9kZXZpY2UsIGRpY3QsIDApOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBjcmVhdGluZyBhIFFTViBkZXZpY2VcbiIpOworICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgfQorCitlcnJfb3V0OgorICAgIGlmIChkaWN0KQorICAgICAgICBhdl9kaWN0X2ZyZWUoJmRpY3QpOworCisgICAgcmV0dXJuIGVycjsKK30KKworaW50IHFzdl9pbml0KEFWQ29kZWNDb250ZXh0ICpzKQoreworICAgIElucHV0U3RyZWFtICppc3QgPSBzLT5vcGFxdWU7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHg7CisgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICpmcmFtZXNfaHdjdHg7CisgICAgaW50IHJldDsKKworICAgIGlmICghaHdfZGV2aWNlX2N0eCkgeworICAgICAgICByZXQgPSBxc3ZfZGV2aWNlX2luaXQoaXN0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGF2X2J1ZmZlcl91bnJlZigmaXN0LT5od19mcmFtZXNfY3R4KTsKKyAgICBpc3QtPmh3X2ZyYW1lc19jdHggPSBhdl9od2ZyYW1lX2N0eF9hbGxvYyhod19kZXZpY2VfY3R4KTsKKyAgICBpZiAoIWlzdC0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZyYW1lc19jdHggICA9IChBVkhXRnJhbWVzQ29udGV4dCopaXN0LT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgIGZyYW1lc19od2N0eCA9IGZyYW1lc19jdHgtPmh3Y3R4OworCisgICAgZnJhbWVzX2N0eC0+d2lkdGggICAgICAgICAgICAgPSBGRkFMSUdOKHMtPmNvZGVkX3dpZHRoLCAgMzIpOworICAgIGZyYW1lc19jdHgtPmhlaWdodCAgICAgICAgICAgID0gRkZBTElHTihzLT5jb2RlZF9oZWlnaHQsIDMyKTsKKyAgICBmcmFtZXNfY3R4LT5mb3JtYXQgICAgICAgICAgICA9IEFWX1BJWF9GTVRfUVNWOworICAgIGZyYW1lc19jdHgtPnN3X2Zvcm1hdCAgICAgICAgID0gcy0+c3dfcGl4X2ZtdDsKKyAgICBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSA9IDY0OworICAgIGZyYW1lc19od2N0eC0+ZnJhbWVfdHlwZSAgICAgID0gTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX0RFQ09ERVJfVEFSR0VUOworCisgICAgcmV0ID0gYXZfaHdmcmFtZV9jdHhfaW5pdChpc3QtPmh3X2ZyYW1lc19jdHgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgYSBRU1YgZnJhbWUgcG9vbFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaXN0LT5od2FjY2VsX2dldF9idWZmZXIgPSBxc3ZfZ2V0X2J1ZmZlcjsKKyAgICBpc3QtPmh3YWNjZWxfdW5pbml0ICAgICA9IHFzdl91bmluaXQ7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2ZmdG9vbHMvZmZtcGVnX3ZpZGVvdG9vbGJveC5jIGIvZmZ0b29scy9mZm1wZWdfdmlkZW90b29sYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyMGFlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZmdG9vbHMvZmZtcGVnX3ZpZGVvdG9vbGJveC5jCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEhBVkVfVVRHRVRPU1RZUEVGUk9NU1RSSU5HCisjaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZpZGVvdG9vbGJveC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImZmbXBlZy5oIgorCit0eXBlZGVmIHN0cnVjdCBWVENvbnRleHQgeworICAgIEFWRnJhbWUgKnRtcF9mcmFtZTsKK30gVlRDb250ZXh0OworCitjaGFyICp2aWRlb3Rvb2xib3hfcGl4Zm10OworCitzdGF0aWMgaW50IHZpZGVvdG9vbGJveF9yZXRyaWV2ZV9kYXRhKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBJbnB1dFN0cmVhbSAqaXN0ID0gcy0+b3BhcXVlOworICAgIFZUQ29udGV4dCAgKnZ0ID0gaXN0LT5od2FjY2VsX2N0eDsKKyAgICBDVlBpeGVsQnVmZmVyUmVmIHBpeGJ1ZiA9IChDVlBpeGVsQnVmZmVyUmVmKWZyYW1lLT5kYXRhWzNdOworICAgIE9TVHlwZSBwaXhlbF9mb3JtYXQgPSBDVlBpeGVsQnVmZmVyR2V0UGl4ZWxGb3JtYXRUeXBlKHBpeGJ1Zik7CisgICAgQ1ZSZXR1cm4gZXJyOworICAgIHVpbnQ4X3QgKmRhdGFbNF0gPSB7IDAgfTsKKyAgICBpbnQgbGluZXNpemVbNF0gPSB7IDAgfTsKKyAgICBpbnQgcGxhbmVzLCByZXQsIGk7CisKKyAgICBhdl9mcmFtZV91bnJlZih2dC0+dG1wX2ZyYW1lKTsKKworICAgIHN3aXRjaCAocGl4ZWxfZm9ybWF0KSB7CisgICAgY2FzZSBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIwWXBDYkNyOFBsYW5hcjogdnQtPnRtcF9mcmFtZS0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOyBicmVhazsKKyAgICBjYXNlIGtDVlBpeGVsRm9ybWF0VHlwZV80MjJZcENiQ3I4OiAgICAgICB2dC0+dG1wX2ZyYW1lLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1VZVlk0MjI7IGJyZWFrOworICAgIGNhc2Uga0NWUGl4ZWxGb3JtYXRUeXBlXzMyQkdSQTogICAgICAgICAgIHZ0LT50bXBfZnJhbWUtPmZvcm1hdCA9IEFWX1BJWF9GTVRfQkdSQTsgYnJlYWs7CisjaWZkZWYga0NGQ29yZUZvdW5kYXRpb25WZXJzaW9uTnVtYmVyMTBfNworICAgIGNhc2Uga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMFlwQ2JDcjhCaVBsYW5hclZpZGVvUmFuZ2U6IHZ0LT50bXBfZnJhbWUtPmZvcm1hdCA9IEFWX1BJWF9GTVRfTlYxMjsgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIiVzOiBVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cihzLT5jb2RlY190YWcpLCB2aWRlb3Rvb2xib3hfcGl4Zm10KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICB2dC0+dG1wX2ZyYW1lLT53aWR0aCAgPSBmcmFtZS0+d2lkdGg7CisgICAgdnQtPnRtcF9mcmFtZS0+aGVpZ2h0ID0gZnJhbWUtPmhlaWdodDsKKyAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKHZ0LT50bXBfZnJhbWUsIDMyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGVyciA9IENWUGl4ZWxCdWZmZXJMb2NrQmFzZUFkZHJlc3MocGl4YnVmLCBrQ1ZQaXhlbEJ1ZmZlckxvY2tfUmVhZE9ubHkpOworICAgIGlmIChlcnIgIT0ga0NWUmV0dXJuU3VjY2VzcykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgbG9ja2luZyB0aGUgcGl4ZWwgYnVmZmVyLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKENWUGl4ZWxCdWZmZXJJc1BsYW5hcihwaXhidWYpKSB7CisKKyAgICAgICAgcGxhbmVzID0gQ1ZQaXhlbEJ1ZmZlckdldFBsYW5lQ291bnQocGl4YnVmKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lczsgaSsrKSB7CisgICAgICAgICAgICBkYXRhW2ldICAgICA9IENWUGl4ZWxCdWZmZXJHZXRCYXNlQWRkcmVzc09mUGxhbmUocGl4YnVmLCBpKTsKKyAgICAgICAgICAgIGxpbmVzaXplW2ldID0gQ1ZQaXhlbEJ1ZmZlckdldEJ5dGVzUGVyUm93T2ZQbGFuZShwaXhidWYsIGkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YVswXSA9IENWUGl4ZWxCdWZmZXJHZXRCYXNlQWRkcmVzcyhwaXhidWYpOworICAgICAgICBsaW5lc2l6ZVswXSA9IENWUGl4ZWxCdWZmZXJHZXRCeXRlc1BlclJvdyhwaXhidWYpOworICAgIH0KKworICAgIGF2X2ltYWdlX2NvcHkodnQtPnRtcF9mcmFtZS0+ZGF0YSwgdnQtPnRtcF9mcmFtZS0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKilkYXRhLCBsaW5lc2l6ZSwgdnQtPnRtcF9mcmFtZS0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0KTsKKworICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHModnQtPnRtcF9mcmFtZSwgZnJhbWUpOworICAgIENWUGl4ZWxCdWZmZXJVbmxvY2tCYXNlQWRkcmVzcyhwaXhidWYsIGtDVlBpeGVsQnVmZmVyTG9ja19SZWFkT25seSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgYXZfZnJhbWVfbW92ZV9yZWYoZnJhbWUsIHZ0LT50bXBfZnJhbWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpZGVvdG9vbGJveF91bmluaXQoQVZDb2RlY0NvbnRleHQgKnMpCit7CisgICAgSW5wdXRTdHJlYW0gKmlzdCA9IHMtPm9wYXF1ZTsKKyAgICBWVENvbnRleHQgICp2dCA9IGlzdC0+aHdhY2NlbF9jdHg7CisKKyAgICBpc3QtPmh3YWNjZWxfdW5pbml0ICAgICAgICA9IE5VTEw7CisgICAgaXN0LT5od2FjY2VsX3JldHJpZXZlX2RhdGEgPSBOVUxMOworCisgICAgYXZfZnJhbWVfZnJlZSgmdnQtPnRtcF9mcmFtZSk7CisKKyAgICBhdl92aWRlb3Rvb2xib3hfZGVmYXVsdF9mcmVlKHMpOworICAgIGF2X2ZyZWVwKCZpc3QtPmh3YWNjZWxfY3R4KTsKK30KKworaW50IHZpZGVvdG9vbGJveF9pbml0KEFWQ29kZWNDb250ZXh0ICpzKQoreworICAgIElucHV0U3RyZWFtICppc3QgPSBzLT5vcGFxdWU7CisgICAgaW50IGxvZ2xldmVsID0gKGlzdC0+aHdhY2NlbF9pZCA9PSBIV0FDQ0VMX0FVVE8pID8gQVZfTE9HX1ZFUkJPU0UgOiBBVl9MT0dfRVJST1I7CisgICAgaW50IHJldCA9IDA7CisgICAgVlRDb250ZXh0ICp2dDsKKworICAgIHZ0ID0gYXZfbWFsbG9jeihzaXplb2YoKnZ0KSk7CisgICAgaWYgKCF2dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlzdC0+aHdhY2NlbF9jdHggICAgICAgICAgID0gdnQ7CisgICAgaXN0LT5od2FjY2VsX3VuaW5pdCAgICAgICAgPSB2aWRlb3Rvb2xib3hfdW5pbml0OworICAgIGlzdC0+aHdhY2NlbF9yZXRyaWV2ZV9kYXRhID0gdmlkZW90b29sYm94X3JldHJpZXZlX2RhdGE7CisKKyAgICB2dC0+dG1wX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXZ0LT50bXBfZnJhbWUpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLy8gVE9ETzogcmVpbmRlbnQKKyAgICAgICAgaWYgKCF2aWRlb3Rvb2xib3hfcGl4Zm10KSB7CisgICAgICAgICAgICByZXQgPSBhdl92aWRlb3Rvb2xib3hfZGVmYXVsdF9pbml0KHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVZWaWRlb3Rvb2xib3hDb250ZXh0ICp2dGN0eCA9IGF2X3ZpZGVvdG9vbGJveF9hbGxvY19jb250ZXh0KCk7CisgICAgICAgICAgICBDRlN0cmluZ1JlZiBwaXhmbXRfc3RyID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyhrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW90b29sYm94X3BpeGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7CisjaWYgSEFWRV9VVEdFVE9TVFlQRUZST01TVFJJTkcKKyAgICAgICAgICAgIHZ0Y3R4LT5jdl9waXhfZm10X3R5cGUgPSBVVEdldE9TVHlwZUZyb21TdHJpbmcocGl4Zm10X3N0cik7CisjZWxzZQorICAgICAgICAgICAgYXZfbG9nKHMsIGxvZ2xldmVsLCAiVVRHZXRPU1R5cGVGcm9tU3RyaW5nKCkgaXMgbm90IGF2YWlsYWJsZSAiCisgICAgICAgICAgICAgICAgICAgIm9uIHRoaXMgcGxhdGZvcm0sICVzIHBpeGVsIGZvcm1hdCBjYW4gbm90IGJlIGhvbm9yZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgInRoZSBjb21tYW5kIGxpbmVcbiIsIHZpZGVvdG9vbGJveF9waXhmbXQpOworI2VuZGlmCisgICAgICAgICAgICByZXQgPSBhdl92aWRlb3Rvb2xib3hfZGVmYXVsdF9pbml0MihzLCB2dGN0eCk7CisgICAgICAgICAgICBDRlJlbGVhc2UocGl4Zm10X3N0cik7CisgICAgICAgIH0KKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgbG9nbGV2ZWwsICJFcnJvciBjcmVhdGluZyBWaWRlb3Rvb2xib3ggZGVjb2Rlci5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIHZpZGVvdG9vbGJveF91bmluaXQocyk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2ZmdG9vbHMvZmZwbGF5LmMgYi9mZnRvb2xzL2ZmcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjY2E5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9mZnRvb2xzL2ZmcGxheS5jCkBAIC0wLDAgKzEsMzc0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogc2ltcGxlIG1lZGlhIHBsYXllciBiYXNlZCBvbiB0aGUgRkZtcGVnIGxpYnJhcmllcworICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJhdmRldmljZS9hdmRldmljZS5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2ZmZ0LmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgiCisKKyNpZiBDT05GSUdfQVZGSUxURVIKKyMgaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCIKKyMgaW5jbHVkZSAibGliYXZmaWx0ZXIvYnVmZmVyc2luay5oIgorIyBpbmNsdWRlICJsaWJhdmZpbHRlci9idWZmZXJzcmMuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8U0RMLmg+CisjaW5jbHVkZSA8U0RMX3RocmVhZC5oPgorCisjaW5jbHVkZSAiY21kdXRpbHMuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCitjb25zdCBjaGFyIHByb2dyYW1fbmFtZVtdID0gImZmcGxheSI7Citjb25zdCBpbnQgcHJvZ3JhbV9iaXJ0aF95ZWFyID0gMjAwMzsKKworI2RlZmluZSBNQVhfUVVFVUVfU0laRSAoMTUgKiAxMDI0ICogMTAyNCkKKyNkZWZpbmUgTUlOX0ZSQU1FUyAyNQorI2RlZmluZSBFWFRFUk5BTF9DTE9DS19NSU5fRlJBTUVTIDIKKyNkZWZpbmUgRVhURVJOQUxfQ0xPQ0tfTUFYX0ZSQU1FUyAxMAorCisvKiBNaW5pbXVtIFNETCBhdWRpbyBidWZmZXIgc2l6ZSwgaW4gc2FtcGxlcy4gKi8KKyNkZWZpbmUgU0RMX0FVRElPX01JTl9CVUZGRVJfU0laRSA1MTIKKy8qIENhbGN1bGF0ZSBhY3R1YWwgYnVmZmVyIHNpemUga2VlcGluZyBpbiBtaW5kIG5vdCBjYXVzZSB0b28gZnJlcXVlbnQgYXVkaW8gY2FsbGJhY2tzICovCisjZGVmaW5lIFNETF9BVURJT19NQVhfQ0FMTEJBQ0tTX1BFUl9TRUMgMzAKKworLyogU3RlcCBzaXplIGZvciB2b2x1bWUgY29udHJvbCBpbiBkQiAqLworI2RlZmluZSBTRExfVk9MVU1FX1NURVAgKDAuNzUpCisKKy8qIG5vIEFWIHN5bmMgY29ycmVjdGlvbiBpcyBkb25lIGlmIGJlbG93IHRoZSBtaW5pbXVtIEFWIHN5bmMgdGhyZXNob2xkICovCisjZGVmaW5lIEFWX1NZTkNfVEhSRVNIT0xEX01JTiAwLjA0CisvKiBBViBzeW5jIGNvcnJlY3Rpb24gaXMgZG9uZSBpZiBhYm92ZSB0aGUgbWF4aW11bSBBViBzeW5jIHRocmVzaG9sZCAqLworI2RlZmluZSBBVl9TWU5DX1RIUkVTSE9MRF9NQVggMC4xCisvKiBJZiBhIGZyYW1lIGR1cmF0aW9uIGlzIGxvbmdlciB0aGFuIHRoaXMsIGl0IHdpbGwgbm90IGJlIGR1cGxpY2F0ZWQgdG8gY29tcGVuc2F0ZSBBViBzeW5jICovCisjZGVmaW5lIEFWX1NZTkNfRlJBTUVEVVBfVEhSRVNIT0xEIDAuMQorLyogbm8gQVYgY29ycmVjdGlvbiBpcyBkb25lIGlmIHRvbyBiaWcgZXJyb3IgKi8KKyNkZWZpbmUgQVZfTk9TWU5DX1RIUkVTSE9MRCAxMC4wCisKKy8qIG1heGltdW0gYXVkaW8gc3BlZWQgY2hhbmdlIHRvIGdldCBjb3JyZWN0IHN5bmMgKi8KKyNkZWZpbmUgU0FNUExFX0NPUlJFQ1RJT05fUEVSQ0VOVF9NQVggMTAKKworLyogZXh0ZXJuYWwgY2xvY2sgc3BlZWQgYWRqdXN0bWVudCBjb25zdGFudHMgZm9yIHJlYWx0aW1lIHNvdXJjZXMgYmFzZWQgb24gYnVmZmVyIGZ1bGxuZXNzICovCisjZGVmaW5lIEVYVEVSTkFMX0NMT0NLX1NQRUVEX01JTiAgMC45MDAKKyNkZWZpbmUgRVhURVJOQUxfQ0xPQ0tfU1BFRURfTUFYICAxLjAxMAorI2RlZmluZSBFWFRFUk5BTF9DTE9DS19TUEVFRF9TVEVQIDAuMDAxCisKKy8qIHdlIHVzZSBhYm91dCBBVURJT19ESUZGX0FWR19OQiBBLVYgZGlmZmVyZW5jZXMgdG8gbWFrZSB0aGUgYXZlcmFnZSAqLworI2RlZmluZSBBVURJT19ESUZGX0FWR19OQiAgIDIwCisKKy8qIHBvbGxzIGZvciBwb3NzaWJsZSByZXF1aXJlZCBzY3JlZW4gcmVmcmVzaCBhdCBsZWFzdCB0aGlzIG9mdGVuLCBzaG91bGQgYmUgbGVzcyB0aGFuIDEvZnBzICovCisjZGVmaW5lIFJFRlJFU0hfUkFURSAwLjAxCisKKy8qIE5PVEU6IHRoZSBzaXplIG11c3QgYmUgYmlnIGVub3VnaCB0byBjb21wZW5zYXRlIHRoZSBoYXJkd2FyZSBhdWRpbyBidWZmZXJzaXplIHNpemUgKi8KKy8qIFRPRE86IFdlIGFzc3VtZSB0aGF0IGEgZGVjb2RlZCBhbmQgcmVzYW1wbGVkIGZyYW1lIGZpdHMgaW50byB0aGlzIGJ1ZmZlciAqLworI2RlZmluZSBTQU1QTEVfQVJSQVlfU0laRSAoOCAqIDY1NTM2KQorCisjZGVmaW5lIENVUlNPUl9ISURFX0RFTEFZIDEwMDAwMDAKKworI2RlZmluZSBVU0VfT05FUEFTU19TVUJUSVRMRV9SRU5ERVIgMQorCitzdGF0aWMgdW5zaWduZWQgc3dzX2ZsYWdzID0gU1dTX0JJQ1VCSUM7CisKK3R5cGVkZWYgc3RydWN0IE15QVZQYWNrZXRMaXN0IHsKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgc3RydWN0IE15QVZQYWNrZXRMaXN0ICpuZXh0OworICAgIGludCBzZXJpYWw7Cit9IE15QVZQYWNrZXRMaXN0OworCit0eXBlZGVmIHN0cnVjdCBQYWNrZXRRdWV1ZSB7CisgICAgTXlBVlBhY2tldExpc3QgKmZpcnN0X3BrdCwgKmxhc3RfcGt0OworICAgIGludCBuYl9wYWNrZXRzOworICAgIGludCBzaXplOworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50IGFib3J0X3JlcXVlc3Q7CisgICAgaW50IHNlcmlhbDsKKyAgICBTRExfbXV0ZXggKm11dGV4OworICAgIFNETF9jb25kICpjb25kOworfSBQYWNrZXRRdWV1ZTsKKworI2RlZmluZSBWSURFT19QSUNUVVJFX1FVRVVFX1NJWkUgMworI2RlZmluZSBTVUJQSUNUVVJFX1FVRVVFX1NJWkUgMTYKKyNkZWZpbmUgU0FNUExFX1FVRVVFX1NJWkUgOQorI2RlZmluZSBGUkFNRV9RVUVVRV9TSVpFIEZGTUFYKFNBTVBMRV9RVUVVRV9TSVpFLCBGRk1BWChWSURFT19QSUNUVVJFX1FVRVVFX1NJWkUsIFNVQlBJQ1RVUkVfUVVFVUVfU0laRSkpCisKK3R5cGVkZWYgc3RydWN0IEF1ZGlvUGFyYW1zIHsKKyAgICBpbnQgZnJlcTsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50NjRfdCBjaGFubmVsX2xheW91dDsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGZtdDsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICBpbnQgYnl0ZXNfcGVyX3NlYzsKK30gQXVkaW9QYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IENsb2NrIHsKKyAgICBkb3VibGUgcHRzOyAgICAgICAgICAgLyogY2xvY2sgYmFzZSAqLworICAgIGRvdWJsZSBwdHNfZHJpZnQ7ICAgICAvKiBjbG9jayBiYXNlIG1pbnVzIHRpbWUgYXQgd2hpY2ggd2UgdXBkYXRlZCB0aGUgY2xvY2sgKi8KKyAgICBkb3VibGUgbGFzdF91cGRhdGVkOworICAgIGRvdWJsZSBzcGVlZDsKKyAgICBpbnQgc2VyaWFsOyAgICAgICAgICAgLyogY2xvY2sgaXMgYmFzZWQgb24gYSBwYWNrZXQgd2l0aCB0aGlzIHNlcmlhbCAqLworICAgIGludCBwYXVzZWQ7CisgICAgaW50ICpxdWV1ZV9zZXJpYWw7ICAgIC8qIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcGFja2V0IHF1ZXVlIHNlcmlhbCwgdXNlZCBmb3Igb2Jzb2xldGUgY2xvY2sgZGV0ZWN0aW9uICovCit9IENsb2NrOworCisvKiBDb21tb24gc3RydWN0IGZvciBoYW5kbGluZyBhbGwgdHlwZXMgb2YgZGVjb2RlZCBkYXRhIGFuZCBhbGxvY2F0ZWQgcmVuZGVyIGJ1ZmZlcnMuICovCit0eXBlZGVmIHN0cnVjdCBGcmFtZSB7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgQVZTdWJ0aXRsZSBzdWI7CisgICAgaW50IHNlcmlhbDsKKyAgICBkb3VibGUgcHRzOyAgICAgICAgICAgLyogcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmb3IgdGhlIGZyYW1lICovCisgICAgZG91YmxlIGR1cmF0aW9uOyAgICAgIC8qIGVzdGltYXRlZCBkdXJhdGlvbiBvZiB0aGUgZnJhbWUgKi8KKyAgICBpbnQ2NF90IHBvczsgICAgICAgICAgLyogYnl0ZSBwb3NpdGlvbiBvZiB0aGUgZnJhbWUgaW4gdGhlIGlucHV0IGZpbGUgKi8KKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgZm9ybWF0OworICAgIEFWUmF0aW9uYWwgc2FyOworICAgIGludCB1cGxvYWRlZDsKKyAgICBpbnQgZmxpcF92OworfSBGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgRnJhbWVRdWV1ZSB7CisgICAgRnJhbWUgcXVldWVbRlJBTUVfUVVFVUVfU0laRV07CisgICAgaW50IHJpbmRleDsKKyAgICBpbnQgd2luZGV4OworICAgIGludCBzaXplOworICAgIGludCBtYXhfc2l6ZTsKKyAgICBpbnQga2VlcF9sYXN0OworICAgIGludCByaW5kZXhfc2hvd247CisgICAgU0RMX211dGV4ICptdXRleDsKKyAgICBTRExfY29uZCAqY29uZDsKKyAgICBQYWNrZXRRdWV1ZSAqcGt0cTsKK30gRnJhbWVRdWV1ZTsKKworZW51bSB7CisgICAgQVZfU1lOQ19BVURJT19NQVNURVIsIC8qIGRlZmF1bHQgY2hvaWNlICovCisgICAgQVZfU1lOQ19WSURFT19NQVNURVIsCisgICAgQVZfU1lOQ19FWFRFUk5BTF9DTE9DSywgLyogc3luY2hyb25pemUgdG8gYW4gZXh0ZXJuYWwgY2xvY2sgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IERlY29kZXIgeworICAgIEFWUGFja2V0IHBrdDsKKyAgICBQYWNrZXRRdWV1ZSAqcXVldWU7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCBwa3Rfc2VyaWFsOworICAgIGludCBmaW5pc2hlZDsKKyAgICBpbnQgcGFja2V0X3BlbmRpbmc7CisgICAgU0RMX2NvbmQgKmVtcHR5X3F1ZXVlX2NvbmQ7CisgICAgaW50NjRfdCBzdGFydF9wdHM7CisgICAgQVZSYXRpb25hbCBzdGFydF9wdHNfdGI7CisgICAgaW50NjRfdCBuZXh0X3B0czsKKyAgICBBVlJhdGlvbmFsIG5leHRfcHRzX3RiOworICAgIFNETF9UaHJlYWQgKmRlY29kZXJfdGlkOworfSBEZWNvZGVyOworCit0eXBlZGVmIHN0cnVjdCBWaWRlb1N0YXRlIHsKKyAgICBTRExfVGhyZWFkICpyZWFkX3RpZDsKKyAgICBBVklucHV0Rm9ybWF0ICppZm9ybWF0OworICAgIGludCBhYm9ydF9yZXF1ZXN0OworICAgIGludCBmb3JjZV9yZWZyZXNoOworICAgIGludCBwYXVzZWQ7CisgICAgaW50IGxhc3RfcGF1c2VkOworICAgIGludCBxdWV1ZV9hdHRhY2htZW50c19yZXE7CisgICAgaW50IHNlZWtfcmVxOworICAgIGludCBzZWVrX2ZsYWdzOworICAgIGludDY0X3Qgc2Vla19wb3M7CisgICAgaW50NjRfdCBzZWVrX3JlbDsKKyAgICBpbnQgcmVhZF9wYXVzZV9yZXR1cm47CisgICAgQVZGb3JtYXRDb250ZXh0ICppYzsKKyAgICBpbnQgcmVhbHRpbWU7CisKKyAgICBDbG9jayBhdWRjbGs7CisgICAgQ2xvY2sgdmlkY2xrOworICAgIENsb2NrIGV4dGNsazsKKworICAgIEZyYW1lUXVldWUgcGljdHE7CisgICAgRnJhbWVRdWV1ZSBzdWJwcTsKKyAgICBGcmFtZVF1ZXVlIHNhbXBxOworCisgICAgRGVjb2RlciBhdWRkZWM7CisgICAgRGVjb2RlciB2aWRkZWM7CisgICAgRGVjb2RlciBzdWJkZWM7CisKKyAgICBpbnQgYXVkaW9fc3RyZWFtOworCisgICAgaW50IGF2X3N5bmNfdHlwZTsKKworICAgIGRvdWJsZSBhdWRpb19jbG9jazsKKyAgICBpbnQgYXVkaW9fY2xvY2tfc2VyaWFsOworICAgIGRvdWJsZSBhdWRpb19kaWZmX2N1bTsgLyogdXNlZCBmb3IgQVYgZGlmZmVyZW5jZSBhdmVyYWdlIGNvbXB1dGF0aW9uICovCisgICAgZG91YmxlIGF1ZGlvX2RpZmZfYXZnX2NvZWY7CisgICAgZG91YmxlIGF1ZGlvX2RpZmZfdGhyZXNob2xkOworICAgIGludCBhdWRpb19kaWZmX2F2Z19jb3VudDsKKyAgICBBVlN0cmVhbSAqYXVkaW9fc3Q7CisgICAgUGFja2V0UXVldWUgYXVkaW9xOworICAgIGludCBhdWRpb19od19idWZfc2l6ZTsKKyAgICB1aW50OF90ICphdWRpb19idWY7CisgICAgdWludDhfdCAqYXVkaW9fYnVmMTsKKyAgICB1bnNpZ25lZCBpbnQgYXVkaW9fYnVmX3NpemU7IC8qIGluIGJ5dGVzICovCisgICAgdW5zaWduZWQgaW50IGF1ZGlvX2J1ZjFfc2l6ZTsKKyAgICBpbnQgYXVkaW9fYnVmX2luZGV4OyAvKiBpbiBieXRlcyAqLworICAgIGludCBhdWRpb193cml0ZV9idWZfc2l6ZTsKKyAgICBpbnQgYXVkaW9fdm9sdW1lOworICAgIGludCBtdXRlZDsKKyAgICBzdHJ1Y3QgQXVkaW9QYXJhbXMgYXVkaW9fc3JjOworI2lmIENPTkZJR19BVkZJTFRFUgorICAgIHN0cnVjdCBBdWRpb1BhcmFtcyBhdWRpb19maWx0ZXJfc3JjOworI2VuZGlmCisgICAgc3RydWN0IEF1ZGlvUGFyYW1zIGF1ZGlvX3RndDsKKyAgICBzdHJ1Y3QgU3dyQ29udGV4dCAqc3dyX2N0eDsKKyAgICBpbnQgZnJhbWVfZHJvcHNfZWFybHk7CisgICAgaW50IGZyYW1lX2Ryb3BzX2xhdGU7CisKKyAgICBlbnVtIFNob3dNb2RlIHsKKyAgICAgICAgU0hPV19NT0RFX05PTkUgPSAtMSwgU0hPV19NT0RFX1ZJREVPID0gMCwgU0hPV19NT0RFX1dBVkVTLCBTSE9XX01PREVfUkRGVCwgU0hPV19NT0RFX05CCisgICAgfSBzaG93X21vZGU7CisgICAgaW50MTZfdCBzYW1wbGVfYXJyYXlbU0FNUExFX0FSUkFZX1NJWkVdOworICAgIGludCBzYW1wbGVfYXJyYXlfaW5kZXg7CisgICAgaW50IGxhc3RfaV9zdGFydDsKKyAgICBSREZUQ29udGV4dCAqcmRmdDsKKyAgICBpbnQgcmRmdF9iaXRzOworICAgIEZGVFNhbXBsZSAqcmRmdF9kYXRhOworICAgIGludCB4cG9zOworICAgIGRvdWJsZSBsYXN0X3Zpc190aW1lOworICAgIFNETF9UZXh0dXJlICp2aXNfdGV4dHVyZTsKKyAgICBTRExfVGV4dHVyZSAqc3ViX3RleHR1cmU7CisgICAgU0RMX1RleHR1cmUgKnZpZF90ZXh0dXJlOworCisgICAgaW50IHN1YnRpdGxlX3N0cmVhbTsKKyAgICBBVlN0cmVhbSAqc3VidGl0bGVfc3Q7CisgICAgUGFja2V0UXVldWUgc3VidGl0bGVxOworCisgICAgZG91YmxlIGZyYW1lX3RpbWVyOworICAgIGRvdWJsZSBmcmFtZV9sYXN0X3JldHVybmVkX3RpbWU7CisgICAgZG91YmxlIGZyYW1lX2xhc3RfZmlsdGVyX2RlbGF5OworICAgIGludCB2aWRlb19zdHJlYW07CisgICAgQVZTdHJlYW0gKnZpZGVvX3N0OworICAgIFBhY2tldFF1ZXVlIHZpZGVvcTsKKyAgICBkb3VibGUgbWF4X2ZyYW1lX2R1cmF0aW9uOyAgICAgIC8vIG1heGltdW0gZHVyYXRpb24gb2YgYSBmcmFtZSAtIGFib3ZlIHRoaXMsIHdlIGNvbnNpZGVyIHRoZSBqdW1wIGEgdGltZXN0YW1wIGRpc2NvbnRpbnVpdHkKKyAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqaW1nX2NvbnZlcnRfY3R4OworICAgIHN0cnVjdCBTd3NDb250ZXh0ICpzdWJfY29udmVydF9jdHg7CisgICAgaW50IGVvZjsKKworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCB3aWR0aCwgaGVpZ2h0LCB4bGVmdCwgeXRvcDsKKyAgICBpbnQgc3RlcDsKKworI2lmIENPTkZJR19BVkZJTFRFUgorICAgIGludCB2ZmlsdGVyX2lkeDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmluX3ZpZGVvX2ZpbHRlcjsgICAvLyB0aGUgZmlyc3QgZmlsdGVyIGluIHRoZSB2aWRlbyBjaGFpbgorICAgIEFWRmlsdGVyQ29udGV4dCAqb3V0X3ZpZGVvX2ZpbHRlcjsgIC8vIHRoZSBsYXN0IGZpbHRlciBpbiB0aGUgdmlkZW8gY2hhaW4KKyAgICBBVkZpbHRlckNvbnRleHQgKmluX2F1ZGlvX2ZpbHRlcjsgICAvLyB0aGUgZmlyc3QgZmlsdGVyIGluIHRoZSBhdWRpbyBjaGFpbgorICAgIEFWRmlsdGVyQ29udGV4dCAqb3V0X2F1ZGlvX2ZpbHRlcjsgIC8vIHRoZSBsYXN0IGZpbHRlciBpbiB0aGUgYXVkaW8gY2hhaW4KKyAgICBBVkZpbHRlckdyYXBoICphZ3JhcGg7ICAgICAgICAgICAgICAvLyBhdWRpbyBmaWx0ZXIgZ3JhcGgKKyNlbmRpZgorCisgICAgaW50IGxhc3RfdmlkZW9fc3RyZWFtLCBsYXN0X2F1ZGlvX3N0cmVhbSwgbGFzdF9zdWJ0aXRsZV9zdHJlYW07CisKKyAgICBTRExfY29uZCAqY29udGludWVfcmVhZF90aHJlYWQ7Cit9IFZpZGVvU3RhdGU7CisKKy8qIG9wdGlvbnMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyICovCitzdGF0aWMgQVZJbnB1dEZvcm1hdCAqZmlsZV9pZm9ybWF0Oworc3RhdGljIGNvbnN0IGNoYXIgKmlucHV0X2ZpbGVuYW1lOworc3RhdGljIGNvbnN0IGNoYXIgKndpbmRvd190aXRsZTsKK3N0YXRpYyBpbnQgZGVmYXVsdF93aWR0aCAgPSA2NDA7CitzdGF0aWMgaW50IGRlZmF1bHRfaGVpZ2h0ID0gNDgwOworc3RhdGljIGludCBzY3JlZW5fd2lkdGggID0gMDsKK3N0YXRpYyBpbnQgc2NyZWVuX2hlaWdodCA9IDA7CitzdGF0aWMgaW50IGF1ZGlvX2Rpc2FibGU7CitzdGF0aWMgaW50IHZpZGVvX2Rpc2FibGU7CitzdGF0aWMgaW50IHN1YnRpdGxlX2Rpc2FibGU7CitzdGF0aWMgY29uc3QgY2hhciogd2FudGVkX3N0cmVhbV9zcGVjW0FWTUVESUFfVFlQRV9OQl0gPSB7MH07CitzdGF0aWMgaW50IHNlZWtfYnlfYnl0ZXMgPSAtMTsKK3N0YXRpYyBpbnQgZGlzcGxheV9kaXNhYmxlOworc3RhdGljIGludCBib3JkZXJsZXNzOworc3RhdGljIGludCBzdGFydHVwX3ZvbHVtZSA9IDEwMDsKK3N0YXRpYyBpbnQgc2hvd19zdGF0dXMgPSAxOworc3RhdGljIGludCBhdl9zeW5jX3R5cGUgPSBBVl9TWU5DX0FVRElPX01BU1RFUjsKK3N0YXRpYyBpbnQ2NF90IHN0YXJ0X3RpbWUgPSBBVl9OT1BUU19WQUxVRTsKK3N0YXRpYyBpbnQ2NF90IGR1cmF0aW9uID0gQVZfTk9QVFNfVkFMVUU7CitzdGF0aWMgaW50IGZhc3QgPSAwOworc3RhdGljIGludCBnZW5wdHMgPSAwOworc3RhdGljIGludCBsb3dyZXMgPSAwOworc3RhdGljIGludCBkZWNvZGVyX3Jlb3JkZXJfcHRzID0gLTE7CitzdGF0aWMgaW50IGF1dG9leGl0Oworc3RhdGljIGludCBleGl0X29uX2tleWRvd247CitzdGF0aWMgaW50IGV4aXRfb25fbW91c2Vkb3duOworc3RhdGljIGludCBsb29wID0gMTsKK3N0YXRpYyBpbnQgZnJhbWVkcm9wID0gLTE7CitzdGF0aWMgaW50IGluZmluaXRlX2J1ZmZlciA9IC0xOworc3RhdGljIGVudW0gU2hvd01vZGUgc2hvd19tb2RlID0gU0hPV19NT0RFX05PTkU7CitzdGF0aWMgY29uc3QgY2hhciAqYXVkaW9fY29kZWNfbmFtZTsKK3N0YXRpYyBjb25zdCBjaGFyICpzdWJ0aXRsZV9jb2RlY19uYW1lOworc3RhdGljIGNvbnN0IGNoYXIgKnZpZGVvX2NvZGVjX25hbWU7Citkb3VibGUgcmRmdHNwZWVkID0gMC4wMjsKK3N0YXRpYyBpbnQ2NF90IGN1cnNvcl9sYXN0X3Nob3duOworc3RhdGljIGludCBjdXJzb3JfaGlkZGVuID0gMDsKKyNpZiBDT05GSUdfQVZGSUxURVIKK3N0YXRpYyBjb25zdCBjaGFyICoqdmZpbHRlcnNfbGlzdCA9IE5VTEw7CitzdGF0aWMgaW50IG5iX3ZmaWx0ZXJzID0gMDsKK3N0YXRpYyBjaGFyICphZmlsdGVycyA9IE5VTEw7CisjZW5kaWYKK3N0YXRpYyBpbnQgYXV0b3JvdGF0ZSA9IDE7CitzdGF0aWMgaW50IGZpbmRfc3RyZWFtX2luZm8gPSAxOworCisvKiBjdXJyZW50IGNvbnRleHQgKi8KK3N0YXRpYyBpbnQgaXNfZnVsbF9zY3JlZW47CitzdGF0aWMgaW50NjRfdCBhdWRpb19jYWxsYmFja190aW1lOworCitzdGF0aWMgQVZQYWNrZXQgZmx1c2hfcGt0OworCisjZGVmaW5lIEZGX1FVSVRfRVZFTlQgICAgKFNETF9VU0VSRVZFTlQgKyAyKQorCitzdGF0aWMgU0RMX1dpbmRvdyAqd2luZG93Oworc3RhdGljIFNETF9SZW5kZXJlciAqcmVuZGVyZXI7CitzdGF0aWMgU0RMX1JlbmRlcmVySW5mbyByZW5kZXJlcl9pbmZvID0gezB9Oworc3RhdGljIFNETF9BdWRpb0RldmljZUlEIGF1ZGlvX2RldjsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBUZXh0dXJlRm9ybWF0RW50cnkgeworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQ7CisgICAgaW50IHRleHR1cmVfZm10OworfSBzZGxfdGV4dHVyZV9mb3JtYXRfbWFwW10gPSB7CisgICAgeyBBVl9QSVhfRk1UX1JHQjgsICAgICAgICAgICBTRExfUElYRUxGT1JNQVRfUkdCMzMyIH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjQ0NCwgICAgICAgICBTRExfUElYRUxGT1JNQVRfUkdCNDQ0IH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjU1NSwgICAgICAgICBTRExfUElYRUxGT1JNQVRfUkdCNTU1IH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjU1NSwgICAgICAgICBTRExfUElYRUxGT1JNQVRfQkdSNTU1IH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjU2NSwgICAgICAgICBTRExfUElYRUxGT1JNQVRfUkdCNTY1IH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjU2NSwgICAgICAgICBTRExfUElYRUxGT1JNQVRfQkdSNTY1IH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjI0LCAgICAgICAgICBTRExfUElYRUxGT1JNQVRfUkdCMjQgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSMjQsICAgICAgICAgIFNETF9QSVhFTEZPUk1BVF9CR1IyNCB9LAorICAgIHsgQVZfUElYX0ZNVF8wUkdCMzIsICAgICAgICAgU0RMX1BJWEVMRk9STUFUX1JHQjg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF8wQkdSMzIsICAgICAgICAgU0RMX1BJWEVMRk9STUFUX0JHUjg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9ORShSR0IwLCAwQkdSKSwgU0RMX1BJWEVMRk9STUFUX1JHQlg4ODg4IH0sCisgICAgeyBBVl9QSVhfRk1UX05FKEJHUjAsIDBSR0IpLCBTRExfUElYRUxGT1JNQVRfQkdSWDg4ODggfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCMzIsICAgICAgICAgIFNETF9QSVhFTEZPUk1BVF9BUkdCODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0IzMl8xLCAgICAgICAgU0RMX1BJWEVMRk9STUFUX1JHQkE4ODg4IH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjMyLCAgICAgICAgICBTRExfUElYRUxGT1JNQVRfQUJHUjg4ODggfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSMzJfMSwgICAgICAgIFNETF9QSVhFTEZPUk1BVF9CR1JBODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgICAgICAgU0RMX1BJWEVMRk9STUFUX0lZVVYgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVZVjQyMiwgICAgICAgIFNETF9QSVhFTEZPUk1BVF9ZVVkyIH0sCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsICAgICAgICBTRExfUElYRUxGT1JNQVRfVVlWWSB9LAorICAgIHsgQVZfUElYX0ZNVF9OT05FLCAgICAgICAgICAgU0RMX1BJWEVMRk9STUFUX1VOS05PV04gfSwKK307CisKKyNpZiBDT05GSUdfQVZGSUxURVIKK3N0YXRpYyBpbnQgb3B0X2FkZF92ZmlsdGVyKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgR1JPV19BUlJBWSh2ZmlsdGVyc19saXN0LCBuYl92ZmlsdGVycyk7CisgICAgdmZpbHRlcnNfbGlzdFtuYl92ZmlsdGVycyAtIDFdID0gYXJnOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUKK2ludCBjbXBfYXVkaW9fZm10cyhlbnVtIEFWU2FtcGxlRm9ybWF0IGZtdDEsIGludDY0X3QgY2hhbm5lbF9jb3VudDEsCisgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBmbXQyLCBpbnQ2NF90IGNoYW5uZWxfY291bnQyKQoreworICAgIC8qIElmIGNoYW5uZWwgY291bnQgPT0gMSwgcGxhbmFyIGFuZCBub24tcGxhbmFyIGZvcm1hdHMgYXJlIHRoZSBzYW1lICovCisgICAgaWYgKGNoYW5uZWxfY291bnQxID09IDEgJiYgY2hhbm5lbF9jb3VudDIgPT0gMSkKKyAgICAgICAgcmV0dXJuIGF2X2dldF9wYWNrZWRfc2FtcGxlX2ZtdChmbXQxKSAhPSBhdl9nZXRfcGFja2VkX3NhbXBsZV9mbXQoZm10Mik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gY2hhbm5lbF9jb3VudDEgIT0gY2hhbm5lbF9jb3VudDIgfHwgZm10MSAhPSBmbXQyOworfQorCitzdGF0aWMgaW5saW5lCitpbnQ2NF90IGdldF92YWxpZF9jaGFubmVsX2xheW91dChpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LCBpbnQgY2hhbm5lbHMpCit7CisgICAgaWYgKGNoYW5uZWxfbGF5b3V0ICYmIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhjaGFubmVsX2xheW91dCkgPT0gY2hhbm5lbHMpCisgICAgICAgIHJldHVybiBjaGFubmVsX2xheW91dDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhY2tldF9xdWV1ZV9wdXRfcHJpdmF0ZShQYWNrZXRRdWV1ZSAqcSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNeUFWUGFja2V0TGlzdCAqcGt0MTsKKworICAgIGlmIChxLT5hYm9ydF9yZXF1ZXN0KQorICAgICAgIHJldHVybiAtMTsKKworICAgIHBrdDEgPSBhdl9tYWxsb2Moc2l6ZW9mKE15QVZQYWNrZXRMaXN0KSk7CisgICAgaWYgKCFwa3QxKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcGt0MS0+cGt0ID0gKnBrdDsKKyAgICBwa3QxLT5uZXh0ID0gTlVMTDsKKyAgICBpZiAocGt0ID09ICZmbHVzaF9wa3QpCisgICAgICAgIHEtPnNlcmlhbCsrOworICAgIHBrdDEtPnNlcmlhbCA9IHEtPnNlcmlhbDsKKworICAgIGlmICghcS0+bGFzdF9wa3QpCisgICAgICAgIHEtPmZpcnN0X3BrdCA9IHBrdDE7CisgICAgZWxzZQorICAgICAgICBxLT5sYXN0X3BrdC0+bmV4dCA9IHBrdDE7CisgICAgcS0+bGFzdF9wa3QgPSBwa3QxOworICAgIHEtPm5iX3BhY2tldHMrKzsKKyAgICBxLT5zaXplICs9IHBrdDEtPnBrdC5zaXplICsgc2l6ZW9mKCpwa3QxKTsKKyAgICBxLT5kdXJhdGlvbiArPSBwa3QxLT5wa3QuZHVyYXRpb247CisgICAgLyogWFhYOiBzaG91bGQgZHVwbGljYXRlIHBhY2tldCBkYXRhIGluIERWIGNhc2UgKi8KKyAgICBTRExfQ29uZFNpZ25hbChxLT5jb25kKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYWNrZXRfcXVldWVfcHV0KFBhY2tldFF1ZXVlICpxLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludCByZXQ7CisKKyAgICBTRExfTG9ja011dGV4KHEtPm11dGV4KTsKKyAgICByZXQgPSBwYWNrZXRfcXVldWVfcHV0X3ByaXZhdGUocSwgcGt0KTsKKyAgICBTRExfVW5sb2NrTXV0ZXgocS0+bXV0ZXgpOworCisgICAgaWYgKHBrdCAhPSAmZmx1c2hfcGt0ICYmIHJldCA8IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYWNrZXRfcXVldWVfcHV0X251bGxwYWNrZXQoUGFja2V0UXVldWUgKnEsIGludCBzdHJlYW1faW5kZXgpCit7CisgICAgQVZQYWNrZXQgcGt0MSwgKnBrdCA9ICZwa3QxOworICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CisgICAgcGt0LT5kYXRhID0gTlVMTDsKKyAgICBwa3QtPnNpemUgPSAwOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3RyZWFtX2luZGV4OworICAgIHJldHVybiBwYWNrZXRfcXVldWVfcHV0KHEsIHBrdCk7Cit9CisKKy8qIHBhY2tldCBxdWV1ZSBoYW5kbGluZyAqLworc3RhdGljIGludCBwYWNrZXRfcXVldWVfaW5pdChQYWNrZXRRdWV1ZSAqcSkKK3sKKyAgICBtZW1zZXQocSwgMCwgc2l6ZW9mKFBhY2tldFF1ZXVlKSk7CisgICAgcS0+bXV0ZXggPSBTRExfQ3JlYXRlTXV0ZXgoKTsKKyAgICBpZiAoIXEtPm11dGV4KSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTRExfQ3JlYXRlTXV0ZXgoKTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcS0+Y29uZCA9IFNETF9DcmVhdGVDb25kKCk7CisgICAgaWYgKCFxLT5jb25kKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJTRExfQ3JlYXRlQ29uZCgpOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBxLT5hYm9ydF9yZXF1ZXN0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFja2V0X3F1ZXVlX2ZsdXNoKFBhY2tldFF1ZXVlICpxKQoreworICAgIE15QVZQYWNrZXRMaXN0ICpwa3QsICpwa3QxOworCisgICAgU0RMX0xvY2tNdXRleChxLT5tdXRleCk7CisgICAgZm9yIChwa3QgPSBxLT5maXJzdF9wa3Q7IHBrdDsgcGt0ID0gcGt0MSkgeworICAgICAgICBwa3QxID0gcGt0LT5uZXh0OworICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdC0+cGt0KTsKKyAgICAgICAgYXZfZnJlZXAoJnBrdCk7CisgICAgfQorICAgIHEtPmxhc3RfcGt0ID0gTlVMTDsKKyAgICBxLT5maXJzdF9wa3QgPSBOVUxMOworICAgIHEtPm5iX3BhY2tldHMgPSAwOworICAgIHEtPnNpemUgPSAwOworICAgIHEtPmR1cmF0aW9uID0gMDsKKyAgICBTRExfVW5sb2NrTXV0ZXgocS0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBwYWNrZXRfcXVldWVfZGVzdHJveShQYWNrZXRRdWV1ZSAqcSkKK3sKKyAgICBwYWNrZXRfcXVldWVfZmx1c2gocSk7CisgICAgU0RMX0Rlc3Ryb3lNdXRleChxLT5tdXRleCk7CisgICAgU0RMX0Rlc3Ryb3lDb25kKHEtPmNvbmQpOworfQorCitzdGF0aWMgdm9pZCBwYWNrZXRfcXVldWVfYWJvcnQoUGFja2V0UXVldWUgKnEpCit7CisgICAgU0RMX0xvY2tNdXRleChxLT5tdXRleCk7CisKKyAgICBxLT5hYm9ydF9yZXF1ZXN0ID0gMTsKKworICAgIFNETF9Db25kU2lnbmFsKHEtPmNvbmQpOworCisgICAgU0RMX1VubG9ja011dGV4KHEtPm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgcGFja2V0X3F1ZXVlX3N0YXJ0KFBhY2tldFF1ZXVlICpxKQoreworICAgIFNETF9Mb2NrTXV0ZXgocS0+bXV0ZXgpOworICAgIHEtPmFib3J0X3JlcXVlc3QgPSAwOworICAgIHBhY2tldF9xdWV1ZV9wdXRfcHJpdmF0ZShxLCAmZmx1c2hfcGt0KTsKKyAgICBTRExfVW5sb2NrTXV0ZXgocS0+bXV0ZXgpOworfQorCisvKiByZXR1cm4gPCAwIGlmIGFib3J0ZWQsIDAgaWYgbm8gcGFja2V0IGFuZCA+IDAgaWYgcGFja2V0LiAgKi8KK3N0YXRpYyBpbnQgcGFja2V0X3F1ZXVlX2dldChQYWNrZXRRdWV1ZSAqcSwgQVZQYWNrZXQgKnBrdCwgaW50IGJsb2NrLCBpbnQgKnNlcmlhbCkKK3sKKyAgICBNeUFWUGFja2V0TGlzdCAqcGt0MTsKKyAgICBpbnQgcmV0OworCisgICAgU0RMX0xvY2tNdXRleChxLT5tdXRleCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChxLT5hYm9ydF9yZXF1ZXN0KSB7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcGt0MSA9IHEtPmZpcnN0X3BrdDsKKyAgICAgICAgaWYgKHBrdDEpIHsKKyAgICAgICAgICAgIHEtPmZpcnN0X3BrdCA9IHBrdDEtPm5leHQ7CisgICAgICAgICAgICBpZiAoIXEtPmZpcnN0X3BrdCkKKyAgICAgICAgICAgICAgICBxLT5sYXN0X3BrdCA9IE5VTEw7CisgICAgICAgICAgICBxLT5uYl9wYWNrZXRzLS07CisgICAgICAgICAgICBxLT5zaXplIC09IHBrdDEtPnBrdC5zaXplICsgc2l6ZW9mKCpwa3QxKTsKKyAgICAgICAgICAgIHEtPmR1cmF0aW9uIC09IHBrdDEtPnBrdC5kdXJhdGlvbjsKKyAgICAgICAgICAgICpwa3QgPSBwa3QxLT5wa3Q7CisgICAgICAgICAgICBpZiAoc2VyaWFsKQorICAgICAgICAgICAgICAgICpzZXJpYWwgPSBwa3QxLT5zZXJpYWw7CisgICAgICAgICAgICBhdl9mcmVlKHBrdDEpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKCFibG9jaykgeworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0RMX0NvbmRXYWl0KHEtPmNvbmQsIHEtPm11dGV4KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBTRExfVW5sb2NrTXV0ZXgocS0+bXV0ZXgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZXJfaW5pdChEZWNvZGVyICpkLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFBhY2tldFF1ZXVlICpxdWV1ZSwgU0RMX2NvbmQgKmVtcHR5X3F1ZXVlX2NvbmQpIHsKKyAgICBtZW1zZXQoZCwgMCwgc2l6ZW9mKERlY29kZXIpKTsKKyAgICBkLT5hdmN0eCA9IGF2Y3R4OworICAgIGQtPnF1ZXVlID0gcXVldWU7CisgICAgZC0+ZW1wdHlfcXVldWVfY29uZCA9IGVtcHR5X3F1ZXVlX2NvbmQ7CisgICAgZC0+c3RhcnRfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgZC0+cGt0X3NlcmlhbCA9IC0xOworfQorCitzdGF0aWMgaW50IGRlY29kZXJfZGVjb2RlX2ZyYW1lKERlY29kZXIgKmQsIEFWRnJhbWUgKmZyYW1lLCBBVlN1YnRpdGxlICpzdWIpIHsKKyAgICBpbnQgcmV0ID0gQVZFUlJPUihFQUdBSU4pOworCisgICAgZm9yICg7OykgeworICAgICAgICBBVlBhY2tldCBwa3Q7CisKKyAgICAgICAgaWYgKGQtPnF1ZXVlLT5zZXJpYWwgPT0gZC0+cGt0X3NlcmlhbCkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGlmIChkLT5xdWV1ZS0+YWJvcnRfcmVxdWVzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgc3dpdGNoIChkLT5hdmN0eC0+Y29kZWNfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9mcmFtZShkLT5hdmN0eCwgZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJfcmVvcmRlcl9wdHMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnB0cyA9IGZyYW1lLT5iZXN0X2VmZm9ydF90aW1lc3RhbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGVjb2Rlcl9yZW9yZGVyX3B0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cHRzID0gZnJhbWUtPnBrdF9kdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19yZWNlaXZlX2ZyYW1lKGQtPmF2Y3R4LCBmcmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRiID0gKEFWUmF0aW9uYWwpezEsIGZyYW1lLT5zYW1wbGVfcmF0ZX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBhdl9yZXNjYWxlX3EoZnJhbWUtPnB0cywgZC0+YXZjdHgtPnBrdF90aW1lYmFzZSwgdGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQtPm5leHRfcHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9xKGQtPm5leHRfcHRzLCBkLT5uZXh0X3B0c190YiwgdGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPm5leHRfcHRzID0gZnJhbWUtPnB0cyArIGZyYW1lLT5uYl9zYW1wbGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5uZXh0X3B0c190YiA9IHRiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICAgICAgICAgIGQtPmZpbmlzaGVkID0gZC0+cGt0X3NlcmlhbDsKKyAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19mbHVzaF9idWZmZXJzKGQtPmF2Y3R4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9IHdoaWxlIChyZXQgIT0gQVZFUlJPUihFQUdBSU4pKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChkLT5xdWV1ZS0+bmJfcGFja2V0cyA9PSAwKQorICAgICAgICAgICAgICAgIFNETF9Db25kU2lnbmFsKGQtPmVtcHR5X3F1ZXVlX2NvbmQpOworICAgICAgICAgICAgaWYgKGQtPnBhY2tldF9wZW5kaW5nKSB7CisgICAgICAgICAgICAgICAgYXZfcGFja2V0X21vdmVfcmVmKCZwa3QsICZkLT5wa3QpOworICAgICAgICAgICAgICAgIGQtPnBhY2tldF9wZW5kaW5nID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBhY2tldF9xdWV1ZV9nZXQoZC0+cXVldWUsICZwa3QsIDEsICZkLT5wa3Rfc2VyaWFsKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoZC0+cXVldWUtPnNlcmlhbCAhPSBkLT5wa3Rfc2VyaWFsKTsKKworICAgICAgICBpZiAocGt0LmRhdGEgPT0gZmx1c2hfcGt0LmRhdGEpIHsKKyAgICAgICAgICAgIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhkLT5hdmN0eCk7CisgICAgICAgICAgICBkLT5maW5pc2hlZCA9IDA7CisgICAgICAgICAgICBkLT5uZXh0X3B0cyA9IGQtPnN0YXJ0X3B0czsKKyAgICAgICAgICAgIGQtPm5leHRfcHRzX3RiID0gZC0+c3RhcnRfcHRzX3RiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGQtPmF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICAgICAgICAgIGludCBnb3RfZnJhbWUgPSAwOworICAgICAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMihkLT5hdmN0eCwgc3ViLCAmZ290X2ZyYW1lLCAmcGt0KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdvdF9mcmFtZSAmJiAhcGt0LmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZC0+cGFja2V0X3BlbmRpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICBhdl9wYWNrZXRfbW92ZV9yZWYoJmQtPnBrdCwgJnBrdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZ290X2ZyYW1lID8gMCA6IChwa3QuZGF0YSA/IEFWRVJST1IoRUFHQUlOKSA6IEFWRVJST1JfRU9GKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhdmNvZGVjX3NlbmRfcGFja2V0KGQtPmF2Y3R4LCAmcGt0KSA9PSBBVkVSUk9SKEVBR0FJTikpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGQtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWNlaXZlX2ZyYW1lIGFuZCBzZW5kX3BhY2tldCBib3RoIHJldHVybmVkIEVBR0FJTiwgd2hpY2ggaXMgYW4gQVBJIHZpb2xhdGlvbi5cbiIpOworICAgICAgICAgICAgICAgICAgICBkLT5wYWNrZXRfcGVuZGluZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGF2X3BhY2tldF9tb3ZlX3JlZigmZC0+cGt0LCAmcGt0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZXJfZGVzdHJveShEZWNvZGVyICpkKSB7CisgICAgYXZfcGFja2V0X3VucmVmKCZkLT5wa3QpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZkLT5hdmN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyYW1lX3F1ZXVlX3VucmVmX2l0ZW0oRnJhbWUgKnZwKQoreworICAgIGF2X2ZyYW1lX3VucmVmKHZwLT5mcmFtZSk7CisgICAgYXZzdWJ0aXRsZV9mcmVlKCZ2cC0+c3ViKTsKK30KKworc3RhdGljIGludCBmcmFtZV9xdWV1ZV9pbml0KEZyYW1lUXVldWUgKmYsIFBhY2tldFF1ZXVlICpwa3RxLCBpbnQgbWF4X3NpemUsIGludCBrZWVwX2xhc3QpCit7CisgICAgaW50IGk7CisgICAgbWVtc2V0KGYsIDAsIHNpemVvZihGcmFtZVF1ZXVlKSk7CisgICAgaWYgKCEoZi0+bXV0ZXggPSBTRExfQ3JlYXRlTXV0ZXgoKSkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlNETF9DcmVhdGVNdXRleCgpOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBpZiAoIShmLT5jb25kID0gU0RMX0NyZWF0ZUNvbmQoKSkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlNETF9DcmVhdGVDb25kKCk6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGYtPnBrdHEgPSBwa3RxOworICAgIGYtPm1heF9zaXplID0gRkZNSU4obWF4X3NpemUsIEZSQU1FX1FVRVVFX1NJWkUpOworICAgIGYtPmtlZXBfbGFzdCA9ICEha2VlcF9sYXN0OworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5tYXhfc2l6ZTsgaSsrKQorICAgICAgICBpZiAoIShmLT5xdWV1ZVtpXS5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJhbWVfcXVldWVfZGVzdG9yeShGcmFtZVF1ZXVlICpmKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5tYXhfc2l6ZTsgaSsrKSB7CisgICAgICAgIEZyYW1lICp2cCA9ICZmLT5xdWV1ZVtpXTsKKyAgICAgICAgZnJhbWVfcXVldWVfdW5yZWZfaXRlbSh2cCk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnZwLT5mcmFtZSk7CisgICAgfQorICAgIFNETF9EZXN0cm95TXV0ZXgoZi0+bXV0ZXgpOworICAgIFNETF9EZXN0cm95Q29uZChmLT5jb25kKTsKK30KKworc3RhdGljIHZvaWQgZnJhbWVfcXVldWVfc2lnbmFsKEZyYW1lUXVldWUgKmYpCit7CisgICAgU0RMX0xvY2tNdXRleChmLT5tdXRleCk7CisgICAgU0RMX0NvbmRTaWduYWwoZi0+Y29uZCk7CisgICAgU0RMX1VubG9ja011dGV4KGYtPm11dGV4KTsKK30KKworc3RhdGljIEZyYW1lICpmcmFtZV9xdWV1ZV9wZWVrKEZyYW1lUXVldWUgKmYpCit7CisgICAgcmV0dXJuICZmLT5xdWV1ZVsoZi0+cmluZGV4ICsgZi0+cmluZGV4X3Nob3duKSAlIGYtPm1heF9zaXplXTsKK30KKworc3RhdGljIEZyYW1lICpmcmFtZV9xdWV1ZV9wZWVrX25leHQoRnJhbWVRdWV1ZSAqZikKK3sKKyAgICByZXR1cm4gJmYtPnF1ZXVlWyhmLT5yaW5kZXggKyBmLT5yaW5kZXhfc2hvd24gKyAxKSAlIGYtPm1heF9zaXplXTsKK30KKworc3RhdGljIEZyYW1lICpmcmFtZV9xdWV1ZV9wZWVrX2xhc3QoRnJhbWVRdWV1ZSAqZikKK3sKKyAgICByZXR1cm4gJmYtPnF1ZXVlW2YtPnJpbmRleF07Cit9CisKK3N0YXRpYyBGcmFtZSAqZnJhbWVfcXVldWVfcGVla193cml0YWJsZShGcmFtZVF1ZXVlICpmKQoreworICAgIC8qIHdhaXQgdW50aWwgd2UgaGF2ZSBzcGFjZSB0byBwdXQgYSBuZXcgZnJhbWUgKi8KKyAgICBTRExfTG9ja011dGV4KGYtPm11dGV4KTsKKyAgICB3aGlsZSAoZi0+c2l6ZSA+PSBmLT5tYXhfc2l6ZSAmJgorICAgICAgICAgICAhZi0+cGt0cS0+YWJvcnRfcmVxdWVzdCkgeworICAgICAgICBTRExfQ29uZFdhaXQoZi0+Y29uZCwgZi0+bXV0ZXgpOworICAgIH0KKyAgICBTRExfVW5sb2NrTXV0ZXgoZi0+bXV0ZXgpOworCisgICAgaWYgKGYtPnBrdHEtPmFib3J0X3JlcXVlc3QpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuICZmLT5xdWV1ZVtmLT53aW5kZXhdOworfQorCitzdGF0aWMgRnJhbWUgKmZyYW1lX3F1ZXVlX3BlZWtfcmVhZGFibGUoRnJhbWVRdWV1ZSAqZikKK3sKKyAgICAvKiB3YWl0IHVudGlsIHdlIGhhdmUgYSByZWFkYWJsZSBhIG5ldyBmcmFtZSAqLworICAgIFNETF9Mb2NrTXV0ZXgoZi0+bXV0ZXgpOworICAgIHdoaWxlIChmLT5zaXplIC0gZi0+cmluZGV4X3Nob3duIDw9IDAgJiYKKyAgICAgICAgICAgIWYtPnBrdHEtPmFib3J0X3JlcXVlc3QpIHsKKyAgICAgICAgU0RMX0NvbmRXYWl0KGYtPmNvbmQsIGYtPm11dGV4KTsKKyAgICB9CisgICAgU0RMX1VubG9ja011dGV4KGYtPm11dGV4KTsKKworICAgIGlmIChmLT5wa3RxLT5hYm9ydF9yZXF1ZXN0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiAmZi0+cXVldWVbKGYtPnJpbmRleCArIGYtPnJpbmRleF9zaG93bikgJSBmLT5tYXhfc2l6ZV07Cit9CisKK3N0YXRpYyB2b2lkIGZyYW1lX3F1ZXVlX3B1c2goRnJhbWVRdWV1ZSAqZikKK3sKKyAgICBpZiAoKytmLT53aW5kZXggPT0gZi0+bWF4X3NpemUpCisgICAgICAgIGYtPndpbmRleCA9IDA7CisgICAgU0RMX0xvY2tNdXRleChmLT5tdXRleCk7CisgICAgZi0+c2l6ZSsrOworICAgIFNETF9Db25kU2lnbmFsKGYtPmNvbmQpOworICAgIFNETF9VbmxvY2tNdXRleChmLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyYW1lX3F1ZXVlX25leHQoRnJhbWVRdWV1ZSAqZikKK3sKKyAgICBpZiAoZi0+a2VlcF9sYXN0ICYmICFmLT5yaW5kZXhfc2hvd24pIHsKKyAgICAgICAgZi0+cmluZGV4X3Nob3duID0gMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcmFtZV9xdWV1ZV91bnJlZl9pdGVtKCZmLT5xdWV1ZVtmLT5yaW5kZXhdKTsKKyAgICBpZiAoKytmLT5yaW5kZXggPT0gZi0+bWF4X3NpemUpCisgICAgICAgIGYtPnJpbmRleCA9IDA7CisgICAgU0RMX0xvY2tNdXRleChmLT5tdXRleCk7CisgICAgZi0+c2l6ZS0tOworICAgIFNETF9Db25kU2lnbmFsKGYtPmNvbmQpOworICAgIFNETF9VbmxvY2tNdXRleChmLT5tdXRleCk7Cit9CisKKy8qIHJldHVybiB0aGUgbnVtYmVyIG9mIHVuZGlzcGxheWVkIGZyYW1lcyBpbiB0aGUgcXVldWUgKi8KK3N0YXRpYyBpbnQgZnJhbWVfcXVldWVfbmJfcmVtYWluaW5nKEZyYW1lUXVldWUgKmYpCit7CisgICAgcmV0dXJuIGYtPnNpemUgLSBmLT5yaW5kZXhfc2hvd247Cit9CisKKy8qIHJldHVybiBsYXN0IHNob3duIHBvc2l0aW9uICovCitzdGF0aWMgaW50NjRfdCBmcmFtZV9xdWV1ZV9sYXN0X3BvcyhGcmFtZVF1ZXVlICpmKQoreworICAgIEZyYW1lICpmcCA9ICZmLT5xdWV1ZVtmLT5yaW5kZXhdOworICAgIGlmIChmLT5yaW5kZXhfc2hvd24gJiYgZnAtPnNlcmlhbCA9PSBmLT5wa3RxLT5zZXJpYWwpCisgICAgICAgIHJldHVybiBmcC0+cG9zOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBkZWNvZGVyX2Fib3J0KERlY29kZXIgKmQsIEZyYW1lUXVldWUgKmZxKQoreworICAgIHBhY2tldF9xdWV1ZV9hYm9ydChkLT5xdWV1ZSk7CisgICAgZnJhbWVfcXVldWVfc2lnbmFsKGZxKTsKKyAgICBTRExfV2FpdFRocmVhZChkLT5kZWNvZGVyX3RpZCwgTlVMTCk7CisgICAgZC0+ZGVjb2Rlcl90aWQgPSBOVUxMOworICAgIHBhY2tldF9xdWV1ZV9mbHVzaChkLT5xdWV1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX3JlY3RhbmdsZShpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCkKK3sKKyAgICBTRExfUmVjdCByZWN0OworICAgIHJlY3QueCA9IHg7CisgICAgcmVjdC55ID0geTsKKyAgICByZWN0LncgPSB3OworICAgIHJlY3QuaCA9IGg7CisgICAgaWYgKHcgJiYgaCkKKyAgICAgICAgU0RMX1JlbmRlckZpbGxSZWN0KHJlbmRlcmVyLCAmcmVjdCk7Cit9CisKK3N0YXRpYyBpbnQgcmVhbGxvY190ZXh0dXJlKFNETF9UZXh0dXJlICoqdGV4dHVyZSwgVWludDMyIG5ld19mb3JtYXQsIGludCBuZXdfd2lkdGgsIGludCBuZXdfaGVpZ2h0LCBTRExfQmxlbmRNb2RlIGJsZW5kbW9kZSwgaW50IGluaXRfdGV4dHVyZSkKK3sKKyAgICBVaW50MzIgZm9ybWF0OworICAgIGludCBhY2Nlc3MsIHcsIGg7CisgICAgaWYgKCEqdGV4dHVyZSB8fCBTRExfUXVlcnlUZXh0dXJlKCp0ZXh0dXJlLCAmZm9ybWF0LCAmYWNjZXNzLCAmdywgJmgpIDwgMCB8fCBuZXdfd2lkdGggIT0gdyB8fCBuZXdfaGVpZ2h0ICE9IGggfHwgbmV3X2Zvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgdm9pZCAqcGl4ZWxzOworICAgICAgICBpbnQgcGl0Y2g7CisgICAgICAgIGlmICgqdGV4dHVyZSkKKyAgICAgICAgICAgIFNETF9EZXN0cm95VGV4dHVyZSgqdGV4dHVyZSk7CisgICAgICAgIGlmICghKCp0ZXh0dXJlID0gU0RMX0NyZWF0ZVRleHR1cmUocmVuZGVyZXIsIG5ld19mb3JtYXQsIFNETF9URVhUVVJFQUNDRVNTX1NUUkVBTUlORywgbmV3X3dpZHRoLCBuZXdfaGVpZ2h0KSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChTRExfU2V0VGV4dHVyZUJsZW5kTW9kZSgqdGV4dHVyZSwgYmxlbmRtb2RlKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChpbml0X3RleHR1cmUpIHsKKyAgICAgICAgICAgIGlmIChTRExfTG9ja1RleHR1cmUoKnRleHR1cmUsIE5VTEwsICZwaXhlbHMsICZwaXRjaCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIG1lbXNldChwaXhlbHMsIDAsIHBpdGNoICogbmV3X2hlaWdodCk7CisgICAgICAgICAgICBTRExfVW5sb2NrVGV4dHVyZSgqdGV4dHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiQ3JlYXRlZCAlZHglZCB0ZXh0dXJlIHdpdGggJXMuXG4iLCBuZXdfd2lkdGgsIG5ld19oZWlnaHQsIFNETF9HZXRQaXhlbEZvcm1hdE5hbWUobmV3X2Zvcm1hdCkpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2FsY3VsYXRlX2Rpc3BsYXlfcmVjdChTRExfUmVjdCAqcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjcl94bGVmdCwgaW50IHNjcl95dG9wLCBpbnQgc2NyX3dpZHRoLCBpbnQgc2NyX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpY193aWR0aCwgaW50IHBpY19oZWlnaHQsIEFWUmF0aW9uYWwgcGljX3NhcikKK3sKKyAgICBmbG9hdCBhc3BlY3RfcmF0aW87CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIHgsIHk7CisKKyAgICBpZiAocGljX3Nhci5udW0gPT0gMCkKKyAgICAgICAgYXNwZWN0X3JhdGlvID0gMDsKKyAgICBlbHNlCisgICAgICAgIGFzcGVjdF9yYXRpbyA9IGF2X3EyZChwaWNfc2FyKTsKKworICAgIGlmIChhc3BlY3RfcmF0aW8gPD0gMC4wKQorICAgICAgICBhc3BlY3RfcmF0aW8gPSAxLjA7CisgICAgYXNwZWN0X3JhdGlvICo9IChmbG9hdClwaWNfd2lkdGggLyAoZmxvYXQpcGljX2hlaWdodDsKKworICAgIC8qIFhYWDogd2Ugc3VwcG9zZSB0aGUgc2NyZWVuIGhhcyBhIDEuMCBwaXhlbCByYXRpbyAqLworICAgIGhlaWdodCA9IHNjcl9oZWlnaHQ7CisgICAgd2lkdGggPSBscmludChoZWlnaHQgKiBhc3BlY3RfcmF0aW8pICYgfjE7CisgICAgaWYgKHdpZHRoID4gc2NyX3dpZHRoKSB7CisgICAgICAgIHdpZHRoID0gc2NyX3dpZHRoOworICAgICAgICBoZWlnaHQgPSBscmludCh3aWR0aCAvIGFzcGVjdF9yYXRpbykgJiB+MTsKKyAgICB9CisgICAgeCA9IChzY3Jfd2lkdGggLSB3aWR0aCkgLyAyOworICAgIHkgPSAoc2NyX2hlaWdodCAtIGhlaWdodCkgLyAyOworICAgIHJlY3QtPnggPSBzY3JfeGxlZnQgKyB4OworICAgIHJlY3QtPnkgPSBzY3JfeXRvcCAgKyB5OworICAgIHJlY3QtPncgPSBGRk1BWCh3aWR0aCwgIDEpOworICAgIHJlY3QtPmggPSBGRk1BWChoZWlnaHQsIDEpOworfQorCitzdGF0aWMgdm9pZCBnZXRfc2RsX3BpeF9mbXRfYW5kX2JsZW5kbW9kZShpbnQgZm9ybWF0LCBVaW50MzIgKnNkbF9waXhfZm10LCBTRExfQmxlbmRNb2RlICpzZGxfYmxlbmRtb2RlKQoreworICAgIGludCBpOworICAgICpzZGxfYmxlbmRtb2RlID0gU0RMX0JMRU5ETU9ERV9OT05FOworICAgICpzZGxfcGl4X2ZtdCA9IFNETF9QSVhFTEZPUk1BVF9VTktOT1dOOworICAgIGlmIChmb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0IzMiAgIHx8CisgICAgICAgIGZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjMyXzEgfHwKKyAgICAgICAgZm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSMzIgICB8fAorICAgICAgICBmb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1IzMl8xKQorICAgICAgICAqc2RsX2JsZW5kbW9kZSA9IFNETF9CTEVORE1PREVfQkxFTkQ7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNkbF90ZXh0dXJlX2Zvcm1hdF9tYXApIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChmb3JtYXQgPT0gc2RsX3RleHR1cmVfZm9ybWF0X21hcFtpXS5mb3JtYXQpIHsKKyAgICAgICAgICAgICpzZGxfcGl4X2ZtdCA9IHNkbF90ZXh0dXJlX2Zvcm1hdF9tYXBbaV0udGV4dHVyZV9mbXQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdXBsb2FkX3RleHR1cmUoU0RMX1RleHR1cmUgKip0ZXgsIEFWRnJhbWUgKmZyYW1lLCBzdHJ1Y3QgU3dzQ29udGV4dCAqKmltZ19jb252ZXJ0X2N0eCkgeworICAgIGludCByZXQgPSAwOworICAgIFVpbnQzMiBzZGxfcGl4X2ZtdDsKKyAgICBTRExfQmxlbmRNb2RlIHNkbF9ibGVuZG1vZGU7CisgICAgZ2V0X3NkbF9waXhfZm10X2FuZF9ibGVuZG1vZGUoZnJhbWUtPmZvcm1hdCwgJnNkbF9waXhfZm10LCAmc2RsX2JsZW5kbW9kZSk7CisgICAgaWYgKHJlYWxsb2NfdGV4dHVyZSh0ZXgsIHNkbF9waXhfZm10ID09IFNETF9QSVhFTEZPUk1BVF9VTktOT1dOID8gU0RMX1BJWEVMRk9STUFUX0FSR0I4ODg4IDogc2RsX3BpeF9mbXQsIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgc2RsX2JsZW5kbW9kZSwgMCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgc3dpdGNoIChzZGxfcGl4X2ZtdCkgeworICAgICAgICBjYXNlIFNETF9QSVhFTEZPUk1BVF9VTktOT1dOOgorICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgd2UgYXJlIG5vdCB1c2luZyBhdmZpbHRlci4uLiAqLworICAgICAgICAgICAgKmltZ19jb252ZXJ0X2N0eCA9IHN3c19nZXRDYWNoZWRDb250ZXh0KCppbWdfY29udmVydF9jdHgsCisgICAgICAgICAgICAgICAgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0LCBmcmFtZS0+Zm9ybWF0LCBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9CR1JBLCBzd3NfZmxhZ3MsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKCppbWdfY29udmVydF9jdHggIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBpeGVsc1s0XTsKKyAgICAgICAgICAgICAgICBpbnQgcGl0Y2hbNF07CisgICAgICAgICAgICAgICAgaWYgKCFTRExfTG9ja1RleHR1cmUoKnRleCwgTlVMTCwgKHZvaWQgKiopcGl4ZWxzLCBwaXRjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dzX3NjYWxlKCppbWdfY29udmVydF9jdHgsIChjb25zdCB1aW50OF90ICogY29uc3QgKilmcmFtZS0+ZGF0YSwgZnJhbWUtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZnJhbWUtPmhlaWdodCwgcGl4ZWxzLCBwaXRjaCk7CisgICAgICAgICAgICAgICAgICAgIFNETF9VbmxvY2tUZXh0dXJlKCp0ZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNhbm5vdCBpbml0aWFsaXplIHRoZSBjb252ZXJzaW9uIGNvbnRleHRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX1BJWEVMRk9STUFUX0lZVVY6CisgICAgICAgICAgICBpZiAoZnJhbWUtPmxpbmVzaXplWzBdID4gMCAmJiBmcmFtZS0+bGluZXNpemVbMV0gPiAwICYmIGZyYW1lLT5saW5lc2l6ZVsyXSA+IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBTRExfVXBkYXRlWVVWVGV4dHVyZSgqdGV4LCBOVUxMLCBmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhWzFdLCBmcmFtZS0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMl0sIGZyYW1lLT5saW5lc2l6ZVsyXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZyYW1lLT5saW5lc2l6ZVswXSA8IDAgJiYgZnJhbWUtPmxpbmVzaXplWzFdIDwgMCAmJiBmcmFtZS0+bGluZXNpemVbMl0gPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gU0RMX1VwZGF0ZVlVVlRleHR1cmUoKnRleCwgTlVMTCwgZnJhbWUtPmRhdGFbMF0gKyBmcmFtZS0+bGluZXNpemVbMF0gKiAoZnJhbWUtPmhlaWdodCAgICAgICAgICAgICAgICAgICAgLSAxKSwgLWZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVsxXSArIGZyYW1lLT5saW5lc2l6ZVsxXSAqIChBVl9DRUlMX1JTSElGVChmcmFtZS0+aGVpZ2h0LCAxKSAtIDEpLCAtZnJhbWUtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhWzJdICsgZnJhbWUtPmxpbmVzaXplWzJdICogKEFWX0NFSUxfUlNISUZUKGZyYW1lLT5oZWlnaHQsIDEpIC0gMSksIC1mcmFtZS0+bGluZXNpemVbMl0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTWl4ZWQgbmVnYXRpdmUgYW5kIHBvc2l0aXZlIGxpbmVzaXplcyBhcmUgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGZyYW1lLT5saW5lc2l6ZVswXSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBTRExfVXBkYXRlVGV4dHVyZSgqdGV4LCBOVUxMLCBmcmFtZS0+ZGF0YVswXSArIGZyYW1lLT5saW5lc2l6ZVswXSAqIChmcmFtZS0+aGVpZ2h0IC0gMSksIC1mcmFtZS0+bGluZXNpemVbMF0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBTRExfVXBkYXRlVGV4dHVyZSgqdGV4LCBOVUxMLCBmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB2aWRlb19pbWFnZV9kaXNwbGF5KFZpZGVvU3RhdGUgKmlzKQoreworICAgIEZyYW1lICp2cDsKKyAgICBGcmFtZSAqc3AgPSBOVUxMOworICAgIFNETF9SZWN0IHJlY3Q7CisKKyAgICB2cCA9IGZyYW1lX3F1ZXVlX3BlZWtfbGFzdCgmaXMtPnBpY3RxKTsKKyAgICBpZiAoaXMtPnN1YnRpdGxlX3N0KSB7CisgICAgICAgIGlmIChmcmFtZV9xdWV1ZV9uYl9yZW1haW5pbmcoJmlzLT5zdWJwcSkgPiAwKSB7CisgICAgICAgICAgICBzcCA9IGZyYW1lX3F1ZXVlX3BlZWsoJmlzLT5zdWJwcSk7CisKKyAgICAgICAgICAgIGlmICh2cC0+cHRzID49IHNwLT5wdHMgKyAoKGZsb2F0KSBzcC0+c3ViLnN0YXJ0X2Rpc3BsYXlfdGltZSAvIDEwMDApKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzcC0+dXBsb2FkZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcGl4ZWxzWzRdOworICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hbNF07CisgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXNwLT53aWR0aCB8fCAhc3AtPmhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3AtPndpZHRoID0gdnAtPndpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgc3AtPmhlaWdodCA9IHZwLT5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWxsb2NfdGV4dHVyZSgmaXMtPnN1Yl90ZXh0dXJlLCBTRExfUElYRUxGT1JNQVRfQVJHQjg4ODgsIHNwLT53aWR0aCwgc3AtPmhlaWdodCwgU0RMX0JMRU5ETU9ERV9CTEVORCwgMSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcC0+c3ViLm51bV9yZWN0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVlN1YnRpdGxlUmVjdCAqc3ViX3JlY3QgPSBzcC0+c3ViLnJlY3RzW2ldOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJfcmVjdC0+eCA9IGF2X2NsaXAoc3ViX3JlY3QtPngsIDAsIHNwLT53aWR0aCApOworICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3JlY3QtPnkgPSBhdl9jbGlwKHN1Yl9yZWN0LT55LCAwLCBzcC0+aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9yZWN0LT53ID0gYXZfY2xpcChzdWJfcmVjdC0+dywgMCwgc3AtPndpZHRoICAtIHN1Yl9yZWN0LT54KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9yZWN0LT5oID0gYXZfY2xpcChzdWJfcmVjdC0+aCwgMCwgc3AtPmhlaWdodCAtIHN1Yl9yZWN0LT55KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaXMtPnN1Yl9jb252ZXJ0X2N0eCA9IHN3c19nZXRDYWNoZWRDb250ZXh0KGlzLT5zdWJfY29udmVydF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3JlY3QtPncsIHN1Yl9yZWN0LT5oLCBBVl9QSVhfRk1UX1BBTDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3JlY3QtPncsIHN1Yl9yZWN0LT5oLCBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzLT5zdWJfY29udmVydF9jdHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ2Fubm90IGluaXRpYWxpemUgdGhlIGNvbnZlcnNpb24gY29udGV4dFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTRExfTG9ja1RleHR1cmUoaXMtPnN1Yl90ZXh0dXJlLCAoU0RMX1JlY3QgKilzdWJfcmVjdCwgKHZvaWQgKiopcGl4ZWxzLCBwaXRjaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd3Nfc2NhbGUoaXMtPnN1Yl9jb252ZXJ0X2N0eCwgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCAqKXN1Yl9yZWN0LT5kYXRhLCBzdWJfcmVjdC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHN1Yl9yZWN0LT5oLCBwaXhlbHMsIHBpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfVW5sb2NrVGV4dHVyZShpcy0+c3ViX3RleHR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwLT51cGxvYWRlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgc3AgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgY2FsY3VsYXRlX2Rpc3BsYXlfcmVjdCgmcmVjdCwgaXMtPnhsZWZ0LCBpcy0+eXRvcCwgaXMtPndpZHRoLCBpcy0+aGVpZ2h0LCB2cC0+d2lkdGgsIHZwLT5oZWlnaHQsIHZwLT5zYXIpOworCisgICAgaWYgKCF2cC0+dXBsb2FkZWQpIHsKKyAgICAgICAgaWYgKHVwbG9hZF90ZXh0dXJlKCZpcy0+dmlkX3RleHR1cmUsIHZwLT5mcmFtZSwgJmlzLT5pbWdfY29udmVydF9jdHgpIDwgMCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgdnAtPnVwbG9hZGVkID0gMTsKKyAgICAgICAgdnAtPmZsaXBfdiA9IHZwLT5mcmFtZS0+bGluZXNpemVbMF0gPCAwOworICAgIH0KKworICAgIFNETF9SZW5kZXJDb3B5RXgocmVuZGVyZXIsIGlzLT52aWRfdGV4dHVyZSwgTlVMTCwgJnJlY3QsIDAsIE5VTEwsIHZwLT5mbGlwX3YgPyBTRExfRkxJUF9WRVJUSUNBTCA6IDApOworICAgIGlmIChzcCkgeworI2lmIFVTRV9PTkVQQVNTX1NVQlRJVExFX1JFTkRFUgorICAgICAgICBTRExfUmVuZGVyQ29weShyZW5kZXJlciwgaXMtPnN1Yl90ZXh0dXJlLCBOVUxMLCAmcmVjdCk7CisjZWxzZQorICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIHhyYXRpbyA9IChkb3VibGUpcmVjdC53IC8gKGRvdWJsZSlzcC0+d2lkdGg7CisgICAgICAgIGRvdWJsZSB5cmF0aW8gPSAoZG91YmxlKXJlY3QuaCAvIChkb3VibGUpc3AtPmhlaWdodDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwLT5zdWIubnVtX3JlY3RzOyBpKyspIHsKKyAgICAgICAgICAgIFNETF9SZWN0ICpzdWJfcmVjdCA9IChTRExfUmVjdCopc3AtPnN1Yi5yZWN0c1tpXTsKKyAgICAgICAgICAgIFNETF9SZWN0IHRhcmdldCA9IHsueCA9IHJlY3QueCArIHN1Yl9yZWN0LT54ICogeHJhdGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC55ID0gcmVjdC55ICsgc3ViX3JlY3QtPnkgKiB5cmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLncgPSBzdWJfcmVjdC0+dyAqIHhyYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaCA9IHN1Yl9yZWN0LT5oICogeXJhdGlvfTsKKyAgICAgICAgICAgIFNETF9SZW5kZXJDb3B5KHJlbmRlcmVyLCBpcy0+c3ViX3RleHR1cmUsIHN1Yl9yZWN0LCAmdGFyZ2V0KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBjb21wdXRlX21vZChpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGEgPCAwID8gYSViICsgYiA6IGElYjsKK30KKworc3RhdGljIHZvaWQgdmlkZW9fYXVkaW9fZGlzcGxheShWaWRlb1N0YXRlICpzKQoreworICAgIGludCBpLCBpX3N0YXJ0LCB4LCB5MSwgeSwgeXMsIGRlbGF5LCBuLCBuYl9kaXNwbGF5X2NoYW5uZWxzOworICAgIGludCBjaCwgY2hhbm5lbHMsIGgsIGgyOworICAgIGludDY0X3QgdGltZV9kaWZmOworICAgIGludCByZGZ0X2JpdHMsIG5iX2ZyZXE7CisKKyAgICBmb3IgKHJkZnRfYml0cyA9IDE7ICgxIDw8IHJkZnRfYml0cykgPCAyICogcy0+aGVpZ2h0OyByZGZ0X2JpdHMrKykKKyAgICAgICAgOworICAgIG5iX2ZyZXEgPSAxIDw8IChyZGZ0X2JpdHMgLSAxKTsKKworICAgIC8qIGNvbXB1dGUgZGlzcGxheSBpbmRleCA6IGNlbnRlciBvbiBjdXJyZW50bHkgb3V0cHV0IHNhbXBsZXMgKi8KKyAgICBjaGFubmVscyA9IHMtPmF1ZGlvX3RndC5jaGFubmVsczsKKyAgICBuYl9kaXNwbGF5X2NoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgaWYgKCFzLT5wYXVzZWQpIHsKKyAgICAgICAgaW50IGRhdGFfdXNlZD0gcy0+c2hvd19tb2RlID09IFNIT1dfTU9ERV9XQVZFUyA/IHMtPndpZHRoIDogKDIqbmJfZnJlcSk7CisgICAgICAgIG4gPSAyICogY2hhbm5lbHM7CisgICAgICAgIGRlbGF5ID0gcy0+YXVkaW9fd3JpdGVfYnVmX3NpemU7CisgICAgICAgIGRlbGF5IC89IG47CisKKyAgICAgICAgLyogdG8gYmUgbW9yZSBwcmVjaXNlLCB3ZSB0YWtlIGludG8gYWNjb3VudCB0aGUgdGltZSBzcGVudCBzaW5jZQorICAgICAgICAgICB0aGUgbGFzdCBidWZmZXIgY29tcHV0YXRpb24gKi8KKyAgICAgICAgaWYgKGF1ZGlvX2NhbGxiYWNrX3RpbWUpIHsKKyAgICAgICAgICAgIHRpbWVfZGlmZiA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIGF1ZGlvX2NhbGxiYWNrX3RpbWU7CisgICAgICAgICAgICBkZWxheSAtPSAodGltZV9kaWZmICogcy0+YXVkaW9fdGd0LmZyZXEpIC8gMTAwMDAwMDsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGF5ICs9IDIgKiBkYXRhX3VzZWQ7CisgICAgICAgIGlmIChkZWxheSA8IGRhdGFfdXNlZCkKKyAgICAgICAgICAgIGRlbGF5ID0gZGF0YV91c2VkOworCisgICAgICAgIGlfc3RhcnQ9IHggPSBjb21wdXRlX21vZChzLT5zYW1wbGVfYXJyYXlfaW5kZXggLSBkZWxheSAqIGNoYW5uZWxzLCBTQU1QTEVfQVJSQVlfU0laRSk7CisgICAgICAgIGlmIChzLT5zaG93X21vZGUgPT0gU0hPV19NT0RFX1dBVkVTKSB7CisgICAgICAgICAgICBoID0gSU5UX01JTjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpICs9IGNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IChTQU1QTEVfQVJSQVlfU0laRSArIHggLSBpKSAlIFNBTVBMRV9BUlJBWV9TSVpFOworICAgICAgICAgICAgICAgIGludCBhID0gcy0+c2FtcGxlX2FycmF5W2lkeF07CisgICAgICAgICAgICAgICAgaW50IGIgPSBzLT5zYW1wbGVfYXJyYXlbKGlkeCArIDQgKiBjaGFubmVscykgJSBTQU1QTEVfQVJSQVlfU0laRV07CisgICAgICAgICAgICAgICAgaW50IGMgPSBzLT5zYW1wbGVfYXJyYXlbKGlkeCArIDUgKiBjaGFubmVscykgJSBTQU1QTEVfQVJSQVlfU0laRV07CisgICAgICAgICAgICAgICAgaW50IGQgPSBzLT5zYW1wbGVfYXJyYXlbKGlkeCArIDkgKiBjaGFubmVscykgJSBTQU1QTEVfQVJSQVlfU0laRV07CisgICAgICAgICAgICAgICAgaW50IHNjb3JlID0gYSAtIGQ7CisgICAgICAgICAgICAgICAgaWYgKGggPCBzY29yZSAmJiAoYiBeIGMpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBoID0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgIGlfc3RhcnQgPSBpZHg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+bGFzdF9pX3N0YXJ0ID0gaV9zdGFydDsKKyAgICB9IGVsc2UgeworICAgICAgICBpX3N0YXJ0ID0gcy0+bGFzdF9pX3N0YXJ0OworICAgIH0KKworICAgIGlmIChzLT5zaG93X21vZGUgPT0gU0hPV19NT0RFX1dBVkVTKSB7CisgICAgICAgIFNETF9TZXRSZW5kZXJEcmF3Q29sb3IocmVuZGVyZXIsIDI1NSwgMjU1LCAyNTUsIDI1NSk7CisKKyAgICAgICAgLyogdG90YWwgaGVpZ2h0IGZvciBvbmUgY2hhbm5lbCAqLworICAgICAgICBoID0gcy0+aGVpZ2h0IC8gbmJfZGlzcGxheV9jaGFubmVsczsKKyAgICAgICAgLyogZ3JhcGggaGVpZ2h0IC8gMiAqLworICAgICAgICBoMiA9IChoICogOSkgLyAyMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbmJfZGlzcGxheV9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgaSA9IGlfc3RhcnQgKyBjaDsKKyAgICAgICAgICAgIHkxID0gcy0+eXRvcCArIGNoICogaCArIChoIC8gMik7IC8qIHBvc2l0aW9uIG9mIGNlbnRlciBsaW5lICovCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIHkgPSAocy0+c2FtcGxlX2FycmF5W2ldICogaDIpID4+IDE1OworICAgICAgICAgICAgICAgIGlmICh5IDwgMCkgeworICAgICAgICAgICAgICAgICAgICB5ID0gLXk7CisgICAgICAgICAgICAgICAgICAgIHlzID0geTEgLSB5OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHlzID0geTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKHMtPnhsZWZ0ICsgeCwgeXMsIDEsIHkpOworICAgICAgICAgICAgICAgIGkgKz0gY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gU0FNUExFX0FSUkFZX1NJWkUpCisgICAgICAgICAgICAgICAgICAgIGkgLT0gU0FNUExFX0FSUkFZX1NJWkU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTRExfU2V0UmVuZGVyRHJhd0NvbG9yKHJlbmRlcmVyLCAwLCAwLCAyNTUsIDI1NSk7CisKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDwgbmJfZGlzcGxheV9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgeSA9IHMtPnl0b3AgKyBjaCAqIGg7CisgICAgICAgICAgICBmaWxsX3JlY3RhbmdsZShzLT54bGVmdCwgeSwgcy0+d2lkdGgsIDEpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHJlYWxsb2NfdGV4dHVyZSgmcy0+dmlzX3RleHR1cmUsIFNETF9QSVhFTEZPUk1BVF9BUkdCODg4OCwgcy0+d2lkdGgsIHMtPmhlaWdodCwgU0RMX0JMRU5ETU9ERV9OT05FLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgbmJfZGlzcGxheV9jaGFubmVscz0gRkZNSU4obmJfZGlzcGxheV9jaGFubmVscywgMik7CisgICAgICAgIGlmIChyZGZ0X2JpdHMgIT0gcy0+cmRmdF9iaXRzKSB7CisgICAgICAgICAgICBhdl9yZGZ0X2VuZChzLT5yZGZ0KTsKKyAgICAgICAgICAgIGF2X2ZyZWUocy0+cmRmdF9kYXRhKTsKKyAgICAgICAgICAgIHMtPnJkZnQgPSBhdl9yZGZ0X2luaXQocmRmdF9iaXRzLCBERlRfUjJDKTsKKyAgICAgICAgICAgIHMtPnJkZnRfYml0cyA9IHJkZnRfYml0czsKKyAgICAgICAgICAgIHMtPnJkZnRfZGF0YSA9IGF2X21hbGxvY19hcnJheShuYl9mcmVxLCA0ICpzaXplb2YoKnMtPnJkZnRfZGF0YSkpOworICAgICAgICB9CisgICAgICAgIGlmICghcy0+cmRmdCB8fCAhcy0+cmRmdF9kYXRhKXsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVycyBmb3IgUkRGVCwgc3dpdGNoaW5nIHRvIHdhdmVzIGRpc3BsYXlcbiIpOworICAgICAgICAgICAgcy0+c2hvd19tb2RlID0gU0hPV19NT0RFX1dBVkVTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRkZUU2FtcGxlICpkYXRhWzJdOworICAgICAgICAgICAgU0RMX1JlY3QgcmVjdCA9IHsueCA9IHMtPnhwb3MsIC55ID0gMCwgLncgPSAxLCAuaCA9IHMtPmhlaWdodH07CisgICAgICAgICAgICB1aW50MzJfdCAqcGl4ZWxzOworICAgICAgICAgICAgaW50IHBpdGNoOworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbmJfZGlzcGxheV9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgIGRhdGFbY2hdID0gcy0+cmRmdF9kYXRhICsgMiAqIG5iX2ZyZXEgKiBjaDsKKyAgICAgICAgICAgICAgICBpID0gaV9zdGFydCArIGNoOworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAyICogbmJfZnJlcTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3ID0gKHgtbmJfZnJlcSkgKiAoMS4wIC8gbmJfZnJlcSk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFbY2hdW3hdID0gcy0+c2FtcGxlX2FycmF5W2ldICogKDEuMCAtIHcgKiB3KTsKKyAgICAgICAgICAgICAgICAgICAgaSArPSBjaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gU0FNUExFX0FSUkFZX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICBpIC09IFNBTVBMRV9BUlJBWV9TSVpFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9yZGZ0X2NhbGMocy0+cmRmdCwgZGF0YVtjaF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogTGVhc3QgZWZmaWNpZW50IHdheSB0byBkbyB0aGlzLCB3ZSBzaG91bGQgb2YgY291cnNlCisgICAgICAgICAgICAgKiBkaXJlY3RseSBhY2Nlc3MgaXQgYnV0IGl0IGlzIG1vcmUgdGhhbiBmYXN0IGVub3VnaC4gKi8KKyAgICAgICAgICAgIGlmICghU0RMX0xvY2tUZXh0dXJlKHMtPnZpc190ZXh0dXJlLCAmcmVjdCwgKHZvaWQgKiopJnBpeGVscywgJnBpdGNoKSkgeworICAgICAgICAgICAgICAgIHBpdGNoID4+PSAyOworICAgICAgICAgICAgICAgIHBpeGVscyArPSBwaXRjaCAqIHMtPmhlaWdodDsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHcgPSAxIC8gc3FydChuYl9mcmVxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBzcXJ0KHcgKiBzcXJ0KGRhdGFbMF1bMiAqIHkgKyAwXSAqIGRhdGFbMF1bMiAqIHkgKyAwXSArIGRhdGFbMF1bMiAqIHkgKyAxXSAqIGRhdGFbMF1bMiAqIHkgKyAxXSkpOworICAgICAgICAgICAgICAgICAgICBpbnQgYiA9IChuYl9kaXNwbGF5X2NoYW5uZWxzID09IDIgKSA/IHNxcnQodyAqIGh5cG90KGRhdGFbMV1bMiAqIHkgKyAwXSwgZGF0YVsxXVsyICogeSArIDFdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhOworICAgICAgICAgICAgICAgICAgICBhID0gRkZNSU4oYSwgMjU1KTsKKyAgICAgICAgICAgICAgICAgICAgYiA9IEZGTUlOKGIsIDI1NSk7CisgICAgICAgICAgICAgICAgICAgIHBpeGVscyAtPSBwaXRjaDsKKyAgICAgICAgICAgICAgICAgICAgKnBpeGVscyA9IChhIDw8IDE2KSArIChiIDw8IDgpICsgKChhK2IpID4+IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTRExfVW5sb2NrVGV4dHVyZShzLT52aXNfdGV4dHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTRExfUmVuZGVyQ29weShyZW5kZXJlciwgcy0+dmlzX3RleHR1cmUsIE5VTEwsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGlmICghcy0+cGF1c2VkKQorICAgICAgICAgICAgcy0+eHBvcysrOworICAgICAgICBpZiAocy0+eHBvcyA+PSBzLT53aWR0aCkKKyAgICAgICAgICAgIHMtPnhwb3M9IHMtPnhsZWZ0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3RyZWFtX2NvbXBvbmVudF9jbG9zZShWaWRlb1N0YXRlICppcywgaW50IHN0cmVhbV9pbmRleCkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmljID0gaXMtPmljOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpjb2RlY3BhcjsKKworICAgIGlmIChzdHJlYW1faW5kZXggPCAwIHx8IHN0cmVhbV9pbmRleCA+PSBpYy0+bmJfc3RyZWFtcykKKyAgICAgICAgcmV0dXJuOworICAgIGNvZGVjcGFyID0gaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXI7CisKKyAgICBzd2l0Y2ggKGNvZGVjcGFyLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGRlY29kZXJfYWJvcnQoJmlzLT5hdWRkZWMsICZpcy0+c2FtcHEpOworICAgICAgICBTRExfQ2xvc2VBdWRpb0RldmljZShhdWRpb19kZXYpOworICAgICAgICBkZWNvZGVyX2Rlc3Ryb3koJmlzLT5hdWRkZWMpOworICAgICAgICBzd3JfZnJlZSgmaXMtPnN3cl9jdHgpOworICAgICAgICBhdl9mcmVlcCgmaXMtPmF1ZGlvX2J1ZjEpOworICAgICAgICBpcy0+YXVkaW9fYnVmMV9zaXplID0gMDsKKyAgICAgICAgaXMtPmF1ZGlvX2J1ZiA9IE5VTEw7CisKKyAgICAgICAgaWYgKGlzLT5yZGZ0KSB7CisgICAgICAgICAgICBhdl9yZGZ0X2VuZChpcy0+cmRmdCk7CisgICAgICAgICAgICBhdl9mcmVlcCgmaXMtPnJkZnRfZGF0YSk7CisgICAgICAgICAgICBpcy0+cmRmdCA9IE5VTEw7CisgICAgICAgICAgICBpcy0+cmRmdF9iaXRzID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgZGVjb2Rlcl9hYm9ydCgmaXMtPnZpZGRlYywgJmlzLT5waWN0cSk7CisgICAgICAgIGRlY29kZXJfZGVzdHJveSgmaXMtPnZpZGRlYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgICAgICBkZWNvZGVyX2Fib3J0KCZpcy0+c3ViZGVjLCAmaXMtPnN1YnBxKTsKKyAgICAgICAgZGVjb2Rlcl9kZXN0cm95KCZpcy0+c3ViZGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9BTEw7CisgICAgc3dpdGNoIChjb2RlY3Bhci0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBpcy0+YXVkaW9fc3QgPSBOVUxMOworICAgICAgICBpcy0+YXVkaW9fc3RyZWFtID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBpcy0+dmlkZW9fc3QgPSBOVUxMOworICAgICAgICBpcy0+dmlkZW9fc3RyZWFtID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgICAgICBpcy0+c3VidGl0bGVfc3QgPSBOVUxMOworICAgICAgICBpcy0+c3VidGl0bGVfc3RyZWFtID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3RyZWFtX2Nsb3NlKFZpZGVvU3RhdGUgKmlzKQoreworICAgIC8qIFhYWDogdXNlIGEgc3BlY2lhbCB1cmxfc2h1dGRvd24gY2FsbCB0byBhYm9ydCBwYXJzZSBjbGVhbmx5ICovCisgICAgaXMtPmFib3J0X3JlcXVlc3QgPSAxOworICAgIFNETF9XYWl0VGhyZWFkKGlzLT5yZWFkX3RpZCwgTlVMTCk7CisKKyAgICAvKiBjbG9zZSBlYWNoIHN0cmVhbSAqLworICAgIGlmIChpcy0+YXVkaW9fc3RyZWFtID49IDApCisgICAgICAgIHN0cmVhbV9jb21wb25lbnRfY2xvc2UoaXMsIGlzLT5hdWRpb19zdHJlYW0pOworICAgIGlmIChpcy0+dmlkZW9fc3RyZWFtID49IDApCisgICAgICAgIHN0cmVhbV9jb21wb25lbnRfY2xvc2UoaXMsIGlzLT52aWRlb19zdHJlYW0pOworICAgIGlmIChpcy0+c3VidGl0bGVfc3RyZWFtID49IDApCisgICAgICAgIHN0cmVhbV9jb21wb25lbnRfY2xvc2UoaXMsIGlzLT5zdWJ0aXRsZV9zdHJlYW0pOworCisgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmlzLT5pYyk7CisKKyAgICBwYWNrZXRfcXVldWVfZGVzdHJveSgmaXMtPnZpZGVvcSk7CisgICAgcGFja2V0X3F1ZXVlX2Rlc3Ryb3koJmlzLT5hdWRpb3EpOworICAgIHBhY2tldF9xdWV1ZV9kZXN0cm95KCZpcy0+c3VidGl0bGVxKTsKKworICAgIC8qIGZyZWUgYWxsIHBpY3R1cmVzICovCisgICAgZnJhbWVfcXVldWVfZGVzdG9yeSgmaXMtPnBpY3RxKTsKKyAgICBmcmFtZV9xdWV1ZV9kZXN0b3J5KCZpcy0+c2FtcHEpOworICAgIGZyYW1lX3F1ZXVlX2Rlc3RvcnkoJmlzLT5zdWJwcSk7CisgICAgU0RMX0Rlc3Ryb3lDb25kKGlzLT5jb250aW51ZV9yZWFkX3RocmVhZCk7CisgICAgc3dzX2ZyZWVDb250ZXh0KGlzLT5pbWdfY29udmVydF9jdHgpOworICAgIHN3c19mcmVlQ29udGV4dChpcy0+c3ViX2NvbnZlcnRfY3R4KTsKKyAgICBhdl9mcmVlKGlzLT5maWxlbmFtZSk7CisgICAgaWYgKGlzLT52aXNfdGV4dHVyZSkKKyAgICAgICAgU0RMX0Rlc3Ryb3lUZXh0dXJlKGlzLT52aXNfdGV4dHVyZSk7CisgICAgaWYgKGlzLT52aWRfdGV4dHVyZSkKKyAgICAgICAgU0RMX0Rlc3Ryb3lUZXh0dXJlKGlzLT52aWRfdGV4dHVyZSk7CisgICAgaWYgKGlzLT5zdWJfdGV4dHVyZSkKKyAgICAgICAgU0RMX0Rlc3Ryb3lUZXh0dXJlKGlzLT5zdWJfdGV4dHVyZSk7CisgICAgYXZfZnJlZShpcyk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2V4aXQoVmlkZW9TdGF0ZSAqaXMpCit7CisgICAgaWYgKGlzKSB7CisgICAgICAgIHN0cmVhbV9jbG9zZShpcyk7CisgICAgfQorICAgIGlmIChyZW5kZXJlcikKKyAgICAgICAgU0RMX0Rlc3Ryb3lSZW5kZXJlcihyZW5kZXJlcik7CisgICAgaWYgKHdpbmRvdykKKyAgICAgICAgU0RMX0Rlc3Ryb3lXaW5kb3cod2luZG93KTsKKyAgICB1bmluaXRfb3B0cygpOworI2lmIENPTkZJR19BVkZJTFRFUgorICAgIGF2X2ZyZWVwKCZ2ZmlsdGVyc19saXN0KTsKKyNlbmRpZgorICAgIGF2Zm9ybWF0X25ldHdvcmtfZGVpbml0KCk7CisgICAgaWYgKHNob3dfc3RhdHVzKQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgU0RMX1F1aXQoKTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1FVSUVULCAiJXMiLCAiIik7CisgICAgZXhpdCgwKTsKK30KKworc3RhdGljIHZvaWQgc2lndGVybV9oYW5kbGVyKGludCBzaWcpCit7CisgICAgZXhpdCgxMjMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF93aW5kb3dfc2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIEFWUmF0aW9uYWwgc2FyKQoreworICAgIFNETF9SZWN0IHJlY3Q7CisgICAgY2FsY3VsYXRlX2Rpc3BsYXlfcmVjdCgmcmVjdCwgMCwgMCwgSU5UX01BWCwgaGVpZ2h0LCB3aWR0aCwgaGVpZ2h0LCBzYXIpOworICAgIGRlZmF1bHRfd2lkdGggID0gcmVjdC53OworICAgIGRlZmF1bHRfaGVpZ2h0ID0gcmVjdC5oOworfQorCitzdGF0aWMgaW50IHZpZGVvX29wZW4oVmlkZW9TdGF0ZSAqaXMpCit7CisgICAgaW50IHcsaDsKKworICAgIGlmIChzY3JlZW5fd2lkdGgpIHsKKyAgICAgICAgdyA9IHNjcmVlbl93aWR0aDsKKyAgICAgICAgaCA9IHNjcmVlbl9oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdyA9IGRlZmF1bHRfd2lkdGg7CisgICAgICAgIGggPSBkZWZhdWx0X2hlaWdodDsKKyAgICB9CisKKyAgICBpZiAoIXdpbmRvd190aXRsZSkKKyAgICAgICAgd2luZG93X3RpdGxlID0gaW5wdXRfZmlsZW5hbWU7CisgICAgU0RMX1NldFdpbmRvd1RpdGxlKHdpbmRvdywgd2luZG93X3RpdGxlKTsKKworICAgIFNETF9TZXRXaW5kb3dTaXplKHdpbmRvdywgdywgaCk7CisgICAgU0RMX1NldFdpbmRvd1Bvc2l0aW9uKHdpbmRvdywgU0RMX1dJTkRPV1BPU19DRU5URVJFRCwgU0RMX1dJTkRPV1BPU19DRU5URVJFRCk7CisgICAgaWYgKGlzX2Z1bGxfc2NyZWVuKQorICAgICAgICBTRExfU2V0V2luZG93RnVsbHNjcmVlbih3aW5kb3csIFNETF9XSU5ET1dfRlVMTFNDUkVFTl9ERVNLVE9QKTsKKyAgICBTRExfU2hvd1dpbmRvdyh3aW5kb3cpOworCisgICAgaXMtPndpZHRoICA9IHc7CisgICAgaXMtPmhlaWdodCA9IGg7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogZGlzcGxheSB0aGUgY3VycmVudCBwaWN0dXJlLCBpZiBhbnkgKi8KK3N0YXRpYyB2b2lkIHZpZGVvX2Rpc3BsYXkoVmlkZW9TdGF0ZSAqaXMpCit7CisgICAgaWYgKCFpcy0+d2lkdGgpCisgICAgICAgIHZpZGVvX29wZW4oaXMpOworCisgICAgU0RMX1NldFJlbmRlckRyYXdDb2xvcihyZW5kZXJlciwgMCwgMCwgMCwgMjU1KTsKKyAgICBTRExfUmVuZGVyQ2xlYXIocmVuZGVyZXIpOworICAgIGlmIChpcy0+YXVkaW9fc3QgJiYgaXMtPnNob3dfbW9kZSAhPSBTSE9XX01PREVfVklERU8pCisgICAgICAgIHZpZGVvX2F1ZGlvX2Rpc3BsYXkoaXMpOworICAgIGVsc2UgaWYgKGlzLT52aWRlb19zdCkKKyAgICAgICAgdmlkZW9faW1hZ2VfZGlzcGxheShpcyk7CisgICAgU0RMX1JlbmRlclByZXNlbnQocmVuZGVyZXIpOworfQorCitzdGF0aWMgZG91YmxlIGdldF9jbG9jayhDbG9jayAqYykKK3sKKyAgICBpZiAoKmMtPnF1ZXVlX3NlcmlhbCAhPSBjLT5zZXJpYWwpCisgICAgICAgIHJldHVybiBOQU47CisgICAgaWYgKGMtPnBhdXNlZCkgeworICAgICAgICByZXR1cm4gYy0+cHRzOworICAgIH0gZWxzZSB7CisgICAgICAgIGRvdWJsZSB0aW1lID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC8gMTAwMDAwMC4wOworICAgICAgICByZXR1cm4gYy0+cHRzX2RyaWZ0ICsgdGltZSAtICh0aW1lIC0gYy0+bGFzdF91cGRhdGVkKSAqICgxLjAgLSBjLT5zcGVlZCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfY2xvY2tfYXQoQ2xvY2sgKmMsIGRvdWJsZSBwdHMsIGludCBzZXJpYWwsIGRvdWJsZSB0aW1lKQoreworICAgIGMtPnB0cyA9IHB0czsKKyAgICBjLT5sYXN0X3VwZGF0ZWQgPSB0aW1lOworICAgIGMtPnB0c19kcmlmdCA9IGMtPnB0cyAtIHRpbWU7CisgICAgYy0+c2VyaWFsID0gc2VyaWFsOworfQorCitzdGF0aWMgdm9pZCBzZXRfY2xvY2soQ2xvY2sgKmMsIGRvdWJsZSBwdHMsIGludCBzZXJpYWwpCit7CisgICAgZG91YmxlIHRpbWUgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLyAxMDAwMDAwLjA7CisgICAgc2V0X2Nsb2NrX2F0KGMsIHB0cywgc2VyaWFsLCB0aW1lKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2Nsb2NrX3NwZWVkKENsb2NrICpjLCBkb3VibGUgc3BlZWQpCit7CisgICAgc2V0X2Nsb2NrKGMsIGdldF9jbG9jayhjKSwgYy0+c2VyaWFsKTsKKyAgICBjLT5zcGVlZCA9IHNwZWVkOworfQorCitzdGF0aWMgdm9pZCBpbml0X2Nsb2NrKENsb2NrICpjLCBpbnQgKnF1ZXVlX3NlcmlhbCkKK3sKKyAgICBjLT5zcGVlZCA9IDEuMDsKKyAgICBjLT5wYXVzZWQgPSAwOworICAgIGMtPnF1ZXVlX3NlcmlhbCA9IHF1ZXVlX3NlcmlhbDsKKyAgICBzZXRfY2xvY2soYywgTkFOLCAtMSk7Cit9CisKK3N0YXRpYyB2b2lkIHN5bmNfY2xvY2tfdG9fc2xhdmUoQ2xvY2sgKmMsIENsb2NrICpzbGF2ZSkKK3sKKyAgICBkb3VibGUgY2xvY2sgPSBnZXRfY2xvY2soYyk7CisgICAgZG91YmxlIHNsYXZlX2Nsb2NrID0gZ2V0X2Nsb2NrKHNsYXZlKTsKKyAgICBpZiAoIWlzbmFuKHNsYXZlX2Nsb2NrKSAmJiAoaXNuYW4oY2xvY2spIHx8IGZhYnMoY2xvY2sgLSBzbGF2ZV9jbG9jaykgPiBBVl9OT1NZTkNfVEhSRVNIT0xEKSkKKyAgICAgICAgc2V0X2Nsb2NrKGMsIHNsYXZlX2Nsb2NrLCBzbGF2ZS0+c2VyaWFsKTsKK30KKworc3RhdGljIGludCBnZXRfbWFzdGVyX3N5bmNfdHlwZShWaWRlb1N0YXRlICppcykgeworICAgIGlmIChpcy0+YXZfc3luY190eXBlID09IEFWX1NZTkNfVklERU9fTUFTVEVSKSB7CisgICAgICAgIGlmIChpcy0+dmlkZW9fc3QpCisgICAgICAgICAgICByZXR1cm4gQVZfU1lOQ19WSURFT19NQVNURVI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBBVl9TWU5DX0FVRElPX01BU1RFUjsKKyAgICB9IGVsc2UgaWYgKGlzLT5hdl9zeW5jX3R5cGUgPT0gQVZfU1lOQ19BVURJT19NQVNURVIpIHsKKyAgICAgICAgaWYgKGlzLT5hdWRpb19zdCkKKyAgICAgICAgICAgIHJldHVybiBBVl9TWU5DX0FVRElPX01BU1RFUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFWX1NZTkNfRVhURVJOQUxfQ0xPQ0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWX1NZTkNfRVhURVJOQUxfQ0xPQ0s7CisgICAgfQorfQorCisvKiBnZXQgdGhlIGN1cnJlbnQgbWFzdGVyIGNsb2NrIHZhbHVlICovCitzdGF0aWMgZG91YmxlIGdldF9tYXN0ZXJfY2xvY2soVmlkZW9TdGF0ZSAqaXMpCit7CisgICAgZG91YmxlIHZhbDsKKworICAgIHN3aXRjaCAoZ2V0X21hc3Rlcl9zeW5jX3R5cGUoaXMpKSB7CisgICAgICAgIGNhc2UgQVZfU1lOQ19WSURFT19NQVNURVI6CisgICAgICAgICAgICB2YWwgPSBnZXRfY2xvY2soJmlzLT52aWRjbGspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfU1lOQ19BVURJT19NQVNURVI6CisgICAgICAgICAgICB2YWwgPSBnZXRfY2xvY2soJmlzLT5hdWRjbGspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB2YWwgPSBnZXRfY2xvY2soJmlzLT5leHRjbGspOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2V4dGVybmFsX2Nsb2NrX3NwZWVkKFZpZGVvU3RhdGUgKmlzKSB7CisgICBpZiAoaXMtPnZpZGVvX3N0cmVhbSA+PSAwICYmIGlzLT52aWRlb3EubmJfcGFja2V0cyA8PSBFWFRFUk5BTF9DTE9DS19NSU5fRlJBTUVTIHx8CisgICAgICAgaXMtPmF1ZGlvX3N0cmVhbSA+PSAwICYmIGlzLT5hdWRpb3EubmJfcGFja2V0cyA8PSBFWFRFUk5BTF9DTE9DS19NSU5fRlJBTUVTKSB7CisgICAgICAgc2V0X2Nsb2NrX3NwZWVkKCZpcy0+ZXh0Y2xrLCBGRk1BWChFWFRFUk5BTF9DTE9DS19TUEVFRF9NSU4sIGlzLT5leHRjbGsuc3BlZWQgLSBFWFRFUk5BTF9DTE9DS19TUEVFRF9TVEVQKSk7CisgICB9IGVsc2UgaWYgKChpcy0+dmlkZW9fc3RyZWFtIDwgMCB8fCBpcy0+dmlkZW9xLm5iX3BhY2tldHMgPiBFWFRFUk5BTF9DTE9DS19NQVhfRlJBTUVTKSAmJgorICAgICAgICAgICAgICAoaXMtPmF1ZGlvX3N0cmVhbSA8IDAgfHwgaXMtPmF1ZGlvcS5uYl9wYWNrZXRzID4gRVhURVJOQUxfQ0xPQ0tfTUFYX0ZSQU1FUykpIHsKKyAgICAgICBzZXRfY2xvY2tfc3BlZWQoJmlzLT5leHRjbGssIEZGTUlOKEVYVEVSTkFMX0NMT0NLX1NQRUVEX01BWCwgaXMtPmV4dGNsay5zcGVlZCArIEVYVEVSTkFMX0NMT0NLX1NQRUVEX1NURVApKTsKKyAgIH0gZWxzZSB7CisgICAgICAgZG91YmxlIHNwZWVkID0gaXMtPmV4dGNsay5zcGVlZDsKKyAgICAgICBpZiAoc3BlZWQgIT0gMS4wKQorICAgICAgICAgICBzZXRfY2xvY2tfc3BlZWQoJmlzLT5leHRjbGssIHNwZWVkICsgRVhURVJOQUxfQ0xPQ0tfU1BFRURfU1RFUCAqICgxLjAgLSBzcGVlZCkgLyBmYWJzKDEuMCAtIHNwZWVkKSk7CisgICB9Cit9CisKKy8qIHNlZWsgaW4gdGhlIHN0cmVhbSAqLworc3RhdGljIHZvaWQgc3RyZWFtX3NlZWsoVmlkZW9TdGF0ZSAqaXMsIGludDY0X3QgcG9zLCBpbnQ2NF90IHJlbCwgaW50IHNlZWtfYnlfYnl0ZXMpCit7CisgICAgaWYgKCFpcy0+c2Vla19yZXEpIHsKKyAgICAgICAgaXMtPnNlZWtfcG9zID0gcG9zOworICAgICAgICBpcy0+c2Vla19yZWwgPSByZWw7CisgICAgICAgIGlzLT5zZWVrX2ZsYWdzICY9IH5BVlNFRUtfRkxBR19CWVRFOworICAgICAgICBpZiAoc2Vla19ieV9ieXRlcykKKyAgICAgICAgICAgIGlzLT5zZWVrX2ZsYWdzIHw9IEFWU0VFS19GTEFHX0JZVEU7CisgICAgICAgIGlzLT5zZWVrX3JlcSA9IDE7CisgICAgICAgIFNETF9Db25kU2lnbmFsKGlzLT5jb250aW51ZV9yZWFkX3RocmVhZCk7CisgICAgfQorfQorCisvKiBwYXVzZSBvciByZXN1bWUgdGhlIHZpZGVvICovCitzdGF0aWMgdm9pZCBzdHJlYW1fdG9nZ2xlX3BhdXNlKFZpZGVvU3RhdGUgKmlzKQoreworICAgIGlmIChpcy0+cGF1c2VkKSB7CisgICAgICAgIGlzLT5mcmFtZV90aW1lciArPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLyAxMDAwMDAwLjAgLSBpcy0+dmlkY2xrLmxhc3RfdXBkYXRlZDsKKyAgICAgICAgaWYgKGlzLT5yZWFkX3BhdXNlX3JldHVybiAhPSBBVkVSUk9SKEVOT1NZUykpIHsKKyAgICAgICAgICAgIGlzLT52aWRjbGsucGF1c2VkID0gMDsKKyAgICAgICAgfQorICAgICAgICBzZXRfY2xvY2soJmlzLT52aWRjbGssIGdldF9jbG9jaygmaXMtPnZpZGNsayksIGlzLT52aWRjbGsuc2VyaWFsKTsKKyAgICB9CisgICAgc2V0X2Nsb2NrKCZpcy0+ZXh0Y2xrLCBnZXRfY2xvY2soJmlzLT5leHRjbGspLCBpcy0+ZXh0Y2xrLnNlcmlhbCk7CisgICAgaXMtPnBhdXNlZCA9IGlzLT5hdWRjbGsucGF1c2VkID0gaXMtPnZpZGNsay5wYXVzZWQgPSBpcy0+ZXh0Y2xrLnBhdXNlZCA9ICFpcy0+cGF1c2VkOworfQorCitzdGF0aWMgdm9pZCB0b2dnbGVfcGF1c2UoVmlkZW9TdGF0ZSAqaXMpCit7CisgICAgc3RyZWFtX3RvZ2dsZV9wYXVzZShpcyk7CisgICAgaXMtPnN0ZXAgPSAwOworfQorCitzdGF0aWMgdm9pZCB0b2dnbGVfbXV0ZShWaWRlb1N0YXRlICppcykKK3sKKyAgICBpcy0+bXV0ZWQgPSAhaXMtPm11dGVkOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfdm9sdW1lKFZpZGVvU3RhdGUgKmlzLCBpbnQgc2lnbiwgZG91YmxlIHN0ZXApCit7CisgICAgZG91YmxlIHZvbHVtZV9sZXZlbCA9IGlzLT5hdWRpb192b2x1bWUgPyAoMjAgKiBsb2coaXMtPmF1ZGlvX3ZvbHVtZSAvIChkb3VibGUpU0RMX01JWF9NQVhWT0xVTUUpIC8gbG9nKDEwKSkgOiAtMTAwMC4wOworICAgIGludCBuZXdfdm9sdW1lID0gbHJpbnQoU0RMX01JWF9NQVhWT0xVTUUgKiBwb3coMTAuMCwgKHZvbHVtZV9sZXZlbCArIHNpZ24gKiBzdGVwKSAvIDIwLjApKTsKKyAgICBpcy0+YXVkaW9fdm9sdW1lID0gYXZfY2xpcChpcy0+YXVkaW9fdm9sdW1lID09IG5ld192b2x1bWUgPyAoaXMtPmF1ZGlvX3ZvbHVtZSArIHNpZ24pIDogbmV3X3ZvbHVtZSwgMCwgU0RMX01JWF9NQVhWT0xVTUUpOworfQorCitzdGF0aWMgdm9pZCBzdGVwX3RvX25leHRfZnJhbWUoVmlkZW9TdGF0ZSAqaXMpCit7CisgICAgLyogaWYgdGhlIHN0cmVhbSBpcyBwYXVzZWQgdW5wYXVzZSBpdCwgdGhlbiBzdGVwICovCisgICAgaWYgKGlzLT5wYXVzZWQpCisgICAgICAgIHN0cmVhbV90b2dnbGVfcGF1c2UoaXMpOworICAgIGlzLT5zdGVwID0gMTsKK30KKworc3RhdGljIGRvdWJsZSBjb21wdXRlX3RhcmdldF9kZWxheShkb3VibGUgZGVsYXksIFZpZGVvU3RhdGUgKmlzKQoreworICAgIGRvdWJsZSBzeW5jX3RocmVzaG9sZCwgZGlmZiA9IDA7CisKKyAgICAvKiB1cGRhdGUgZGVsYXkgdG8gZm9sbG93IG1hc3RlciBzeW5jaHJvbmlzYXRpb24gc291cmNlICovCisgICAgaWYgKGdldF9tYXN0ZXJfc3luY190eXBlKGlzKSAhPSBBVl9TWU5DX1ZJREVPX01BU1RFUikgeworICAgICAgICAvKiBpZiB2aWRlbyBpcyBzbGF2ZSwgd2UgdHJ5IHRvIGNvcnJlY3QgYmlnIGRlbGF5cyBieQorICAgICAgICAgICBkdXBsaWNhdGluZyBvciBkZWxldGluZyBhIGZyYW1lICovCisgICAgICAgIGRpZmYgPSBnZXRfY2xvY2soJmlzLT52aWRjbGspIC0gZ2V0X21hc3Rlcl9jbG9jayhpcyk7CisKKyAgICAgICAgLyogc2tpcCBvciByZXBlYXQgZnJhbWUuIFdlIHRha2UgaW50byBhY2NvdW50IHRoZQorICAgICAgICAgICBkZWxheSB0byBjb21wdXRlIHRoZSB0aHJlc2hvbGQuIEkgc3RpbGwgZG9uJ3Qga25vdworICAgICAgICAgICBpZiBpdCBpcyB0aGUgYmVzdCBndWVzcyAqLworICAgICAgICBzeW5jX3RocmVzaG9sZCA9IEZGTUFYKEFWX1NZTkNfVEhSRVNIT0xEX01JTiwgRkZNSU4oQVZfU1lOQ19USFJFU0hPTERfTUFYLCBkZWxheSkpOworICAgICAgICBpZiAoIWlzbmFuKGRpZmYpICYmIGZhYnMoZGlmZikgPCBpcy0+bWF4X2ZyYW1lX2R1cmF0aW9uKSB7CisgICAgICAgICAgICBpZiAoZGlmZiA8PSAtc3luY190aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgZGVsYXkgPSBGRk1BWCgwLCBkZWxheSArIGRpZmYpOworICAgICAgICAgICAgZWxzZSBpZiAoZGlmZiA+PSBzeW5jX3RocmVzaG9sZCAmJiBkZWxheSA+IEFWX1NZTkNfRlJBTUVEVVBfVEhSRVNIT0xEKQorICAgICAgICAgICAgICAgIGRlbGF5ID0gZGVsYXkgKyBkaWZmOworICAgICAgICAgICAgZWxzZSBpZiAoZGlmZiA+PSBzeW5jX3RocmVzaG9sZCkKKyAgICAgICAgICAgICAgICBkZWxheSA9IDIgKiBkZWxheTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVFJBQ0UsICJ2aWRlbzogZGVsYXk9JTAuM2YgQS1WPSVmXG4iLAorICAgICAgICAgICAgZGVsYXksIC1kaWZmKTsKKworICAgIHJldHVybiBkZWxheTsKK30KKworc3RhdGljIGRvdWJsZSB2cF9kdXJhdGlvbihWaWRlb1N0YXRlICppcywgRnJhbWUgKnZwLCBGcmFtZSAqbmV4dHZwKSB7CisgICAgaWYgKHZwLT5zZXJpYWwgPT0gbmV4dHZwLT5zZXJpYWwpIHsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gbmV4dHZwLT5wdHMgLSB2cC0+cHRzOworICAgICAgICBpZiAoaXNuYW4oZHVyYXRpb24pIHx8IGR1cmF0aW9uIDw9IDAgfHwgZHVyYXRpb24gPiBpcy0+bWF4X2ZyYW1lX2R1cmF0aW9uKQorICAgICAgICAgICAgcmV0dXJuIHZwLT5kdXJhdGlvbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwLjA7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfdmlkZW9fcHRzKFZpZGVvU3RhdGUgKmlzLCBkb3VibGUgcHRzLCBpbnQ2NF90IHBvcywgaW50IHNlcmlhbCkgeworICAgIC8qIHVwZGF0ZSBjdXJyZW50IHZpZGVvIHB0cyAqLworICAgIHNldF9jbG9jaygmaXMtPnZpZGNsaywgcHRzLCBzZXJpYWwpOworICAgIHN5bmNfY2xvY2tfdG9fc2xhdmUoJmlzLT5leHRjbGssICZpcy0+dmlkY2xrKTsKK30KKworLyogY2FsbGVkIHRvIGRpc3BsYXkgZWFjaCBmcmFtZSAqLworc3RhdGljIHZvaWQgdmlkZW9fcmVmcmVzaCh2b2lkICpvcGFxdWUsIGRvdWJsZSAqcmVtYWluaW5nX3RpbWUpCit7CisgICAgVmlkZW9TdGF0ZSAqaXMgPSBvcGFxdWU7CisgICAgZG91YmxlIHRpbWU7CisKKyAgICBGcmFtZSAqc3AsICpzcDI7CisKKyAgICBpZiAoIWlzLT5wYXVzZWQgJiYgZ2V0X21hc3Rlcl9zeW5jX3R5cGUoaXMpID09IEFWX1NZTkNfRVhURVJOQUxfQ0xPQ0sgJiYgaXMtPnJlYWx0aW1lKQorICAgICAgICBjaGVja19leHRlcm5hbF9jbG9ja19zcGVlZChpcyk7CisKKyAgICBpZiAoIWRpc3BsYXlfZGlzYWJsZSAmJiBpcy0+c2hvd19tb2RlICE9IFNIT1dfTU9ERV9WSURFTyAmJiBpcy0+YXVkaW9fc3QpIHsKKyAgICAgICAgdGltZSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAvIDEwMDAwMDAuMDsKKyAgICAgICAgaWYgKGlzLT5mb3JjZV9yZWZyZXNoIHx8IGlzLT5sYXN0X3Zpc190aW1lICsgcmRmdHNwZWVkIDwgdGltZSkgeworICAgICAgICAgICAgdmlkZW9fZGlzcGxheShpcyk7CisgICAgICAgICAgICBpcy0+bGFzdF92aXNfdGltZSA9IHRpbWU7CisgICAgICAgIH0KKyAgICAgICAgKnJlbWFpbmluZ190aW1lID0gRkZNSU4oKnJlbWFpbmluZ190aW1lLCBpcy0+bGFzdF92aXNfdGltZSArIHJkZnRzcGVlZCAtIHRpbWUpOworICAgIH0KKworICAgIGlmIChpcy0+dmlkZW9fc3QpIHsKK3JldHJ5OgorICAgICAgICBpZiAoZnJhbWVfcXVldWVfbmJfcmVtYWluaW5nKCZpcy0+cGljdHEpID09IDApIHsKKyAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8sIG5vIHBpY3R1cmUgdG8gZGlzcGxheSBpbiB0aGUgcXVldWUKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvdWJsZSBsYXN0X2R1cmF0aW9uLCBkdXJhdGlvbiwgZGVsYXk7CisgICAgICAgICAgICBGcmFtZSAqdnAsICpsYXN0dnA7CisKKyAgICAgICAgICAgIC8qIGRlcXVldWUgdGhlIHBpY3R1cmUgKi8KKyAgICAgICAgICAgIGxhc3R2cCA9IGZyYW1lX3F1ZXVlX3BlZWtfbGFzdCgmaXMtPnBpY3RxKTsKKyAgICAgICAgICAgIHZwID0gZnJhbWVfcXVldWVfcGVlaygmaXMtPnBpY3RxKTsKKworICAgICAgICAgICAgaWYgKHZwLT5zZXJpYWwgIT0gaXMtPnZpZGVvcS5zZXJpYWwpIHsKKyAgICAgICAgICAgICAgICBmcmFtZV9xdWV1ZV9uZXh0KCZpcy0+cGljdHEpOworICAgICAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXN0dnAtPnNlcmlhbCAhPSB2cC0+c2VyaWFsKQorICAgICAgICAgICAgICAgIGlzLT5mcmFtZV90aW1lciA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAvIDEwMDAwMDAuMDsKKworICAgICAgICAgICAgaWYgKGlzLT5wYXVzZWQpCisgICAgICAgICAgICAgICAgZ290byBkaXNwbGF5OworCisgICAgICAgICAgICAvKiBjb21wdXRlIG5vbWluYWwgbGFzdF9kdXJhdGlvbiAqLworICAgICAgICAgICAgbGFzdF9kdXJhdGlvbiA9IHZwX2R1cmF0aW9uKGlzLCBsYXN0dnAsIHZwKTsKKyAgICAgICAgICAgIGRlbGF5ID0gY29tcHV0ZV90YXJnZXRfZGVsYXkobGFzdF9kdXJhdGlvbiwgaXMpOworCisgICAgICAgICAgICB0aW1lPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkvMTAwMDAwMC4wOworICAgICAgICAgICAgaWYgKHRpbWUgPCBpcy0+ZnJhbWVfdGltZXIgKyBkZWxheSkgeworICAgICAgICAgICAgICAgICpyZW1haW5pbmdfdGltZSA9IEZGTUlOKGlzLT5mcmFtZV90aW1lciArIGRlbGF5IC0gdGltZSwgKnJlbWFpbmluZ190aW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGRpc3BsYXk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlzLT5mcmFtZV90aW1lciArPSBkZWxheTsKKyAgICAgICAgICAgIGlmIChkZWxheSA+IDAgJiYgdGltZSAtIGlzLT5mcmFtZV90aW1lciA+IEFWX1NZTkNfVEhSRVNIT0xEX01BWCkKKyAgICAgICAgICAgICAgICBpcy0+ZnJhbWVfdGltZXIgPSB0aW1lOworCisgICAgICAgICAgICBTRExfTG9ja011dGV4KGlzLT5waWN0cS5tdXRleCk7CisgICAgICAgICAgICBpZiAoIWlzbmFuKHZwLT5wdHMpKQorICAgICAgICAgICAgICAgIHVwZGF0ZV92aWRlb19wdHMoaXMsIHZwLT5wdHMsIHZwLT5wb3MsIHZwLT5zZXJpYWwpOworICAgICAgICAgICAgU0RMX1VubG9ja011dGV4KGlzLT5waWN0cS5tdXRleCk7CisKKyAgICAgICAgICAgIGlmIChmcmFtZV9xdWV1ZV9uYl9yZW1haW5pbmcoJmlzLT5waWN0cSkgPiAxKSB7CisgICAgICAgICAgICAgICAgRnJhbWUgKm5leHR2cCA9IGZyYW1lX3F1ZXVlX3BlZWtfbmV4dCgmaXMtPnBpY3RxKTsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHZwX2R1cmF0aW9uKGlzLCB2cCwgbmV4dHZwKTsKKyAgICAgICAgICAgICAgICBpZighaXMtPnN0ZXAgJiYgKGZyYW1lZHJvcD4wIHx8IChmcmFtZWRyb3AgJiYgZ2V0X21hc3Rlcl9zeW5jX3R5cGUoaXMpICE9IEFWX1NZTkNfVklERU9fTUFTVEVSKSkgJiYgdGltZSA+IGlzLT5mcmFtZV90aW1lciArIGR1cmF0aW9uKXsKKyAgICAgICAgICAgICAgICAgICAgaXMtPmZyYW1lX2Ryb3BzX2xhdGUrKzsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVfcXVldWVfbmV4dCgmaXMtPnBpY3RxKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpcy0+c3VidGl0bGVfc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGZyYW1lX3F1ZXVlX25iX3JlbWFpbmluZygmaXMtPnN1YnBxKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwID0gZnJhbWVfcXVldWVfcGVlaygmaXMtPnN1YnBxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyYW1lX3F1ZXVlX25iX3JlbWFpbmluZygmaXMtPnN1YnBxKSA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AyID0gZnJhbWVfcXVldWVfcGVla19uZXh0KCZpcy0+c3VicHEpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwMiA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcC0+c2VyaWFsICE9IGlzLT5zdWJ0aXRsZXEuc2VyaWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChpcy0+dmlkY2xrLnB0cyA+IChzcC0+cHRzICsgKChmbG9hdCkgc3AtPnN1Yi5lbmRfZGlzcGxheV90aW1lIC8gMTAwMCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3AyICYmIGlzLT52aWRjbGsucHRzID4gKHNwMi0+cHRzICsgKChmbG9hdCkgc3AyLT5zdWIuc3RhcnRfZGlzcGxheV90aW1lIC8gMTAwMCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3AtPnVwbG9hZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3AtPnN1Yi5udW1fcmVjdHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdWJ0aXRsZVJlY3QgKnN1Yl9yZWN0ID0gc3AtPnN1Yi5yZWN0c1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBpeGVsczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgajsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFTRExfTG9ja1RleHR1cmUoaXMtPnN1Yl90ZXh0dXJlLCAoU0RMX1JlY3QgKilzdWJfcmVjdCwgKHZvaWQgKiopJnBpeGVscywgJnBpdGNoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJfcmVjdC0+aDsgaisrLCBwaXhlbHMgKz0gcGl0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChwaXhlbHMsIDAsIHN1Yl9yZWN0LT53IDw8IDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9VbmxvY2tUZXh0dXJlKGlzLT5zdWJfdGV4dHVyZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfcXVldWVfbmV4dCgmaXMtPnN1YnBxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnJhbWVfcXVldWVfbmV4dCgmaXMtPnBpY3RxKTsKKyAgICAgICAgICAgIGlzLT5mb3JjZV9yZWZyZXNoID0gMTsKKworICAgICAgICAgICAgaWYgKGlzLT5zdGVwICYmICFpcy0+cGF1c2VkKQorICAgICAgICAgICAgICAgIHN0cmVhbV90b2dnbGVfcGF1c2UoaXMpOworICAgICAgICB9CitkaXNwbGF5OgorICAgICAgICAvKiBkaXNwbGF5IHBpY3R1cmUgKi8KKyAgICAgICAgaWYgKCFkaXNwbGF5X2Rpc2FibGUgJiYgaXMtPmZvcmNlX3JlZnJlc2ggJiYgaXMtPnNob3dfbW9kZSA9PSBTSE9XX01PREVfVklERU8gJiYgaXMtPnBpY3RxLnJpbmRleF9zaG93bikKKyAgICAgICAgICAgIHZpZGVvX2Rpc3BsYXkoaXMpOworICAgIH0KKyAgICBpcy0+Zm9yY2VfcmVmcmVzaCA9IDA7CisgICAgaWYgKHNob3dfc3RhdHVzKSB7CisgICAgICAgIHN0YXRpYyBpbnQ2NF90IGxhc3RfdGltZTsKKyAgICAgICAgaW50NjRfdCBjdXJfdGltZTsKKyAgICAgICAgaW50IGFxc2l6ZSwgdnFzaXplLCBzcXNpemU7CisgICAgICAgIGRvdWJsZSBhdl9kaWZmOworCisgICAgICAgIGN1cl90aW1lID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworICAgICAgICBpZiAoIWxhc3RfdGltZSB8fCAoY3VyX3RpbWUgLSBsYXN0X3RpbWUpID49IDMwMDAwKSB7CisgICAgICAgICAgICBhcXNpemUgPSAwOworICAgICAgICAgICAgdnFzaXplID0gMDsKKyAgICAgICAgICAgIHNxc2l6ZSA9IDA7CisgICAgICAgICAgICBpZiAoaXMtPmF1ZGlvX3N0KQorICAgICAgICAgICAgICAgIGFxc2l6ZSA9IGlzLT5hdWRpb3Euc2l6ZTsKKyAgICAgICAgICAgIGlmIChpcy0+dmlkZW9fc3QpCisgICAgICAgICAgICAgICAgdnFzaXplID0gaXMtPnZpZGVvcS5zaXplOworICAgICAgICAgICAgaWYgKGlzLT5zdWJ0aXRsZV9zdCkKKyAgICAgICAgICAgICAgICBzcXNpemUgPSBpcy0+c3VidGl0bGVxLnNpemU7CisgICAgICAgICAgICBhdl9kaWZmID0gMDsKKyAgICAgICAgICAgIGlmIChpcy0+YXVkaW9fc3QgJiYgaXMtPnZpZGVvX3N0KQorICAgICAgICAgICAgICAgIGF2X2RpZmYgPSBnZXRfY2xvY2soJmlzLT5hdWRjbGspIC0gZ2V0X2Nsb2NrKCZpcy0+dmlkY2xrKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGlzLT52aWRlb19zdCkKKyAgICAgICAgICAgICAgICBhdl9kaWZmID0gZ2V0X21hc3Rlcl9jbG9jayhpcykgLSBnZXRfY2xvY2soJmlzLT52aWRjbGspOworICAgICAgICAgICAgZWxzZSBpZiAoaXMtPmF1ZGlvX3N0KQorICAgICAgICAgICAgICAgIGF2X2RpZmYgPSBnZXRfbWFzdGVyX2Nsb2NrKGlzKSAtIGdldF9jbG9jaygmaXMtPmF1ZGNsayk7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgIiU3LjJmICVzOiU3LjNmIGZkPSU0ZCBhcT0lNWRLQiB2cT0lNWRLQiBzcT0lNWRCIGY9JSJQUklkNjQiLyUiUFJJZDY0IiAgIFxyIiwKKyAgICAgICAgICAgICAgICAgICBnZXRfbWFzdGVyX2Nsb2NrKGlzKSwKKyAgICAgICAgICAgICAgICAgICAoaXMtPmF1ZGlvX3N0ICYmIGlzLT52aWRlb19zdCkgPyAiQS1WIiA6IChpcy0+dmlkZW9fc3QgPyAiTS1WIiA6IChpcy0+YXVkaW9fc3QgPyAiTS1BIiA6ICIgICAiKSksCisgICAgICAgICAgICAgICAgICAgYXZfZGlmZiwKKyAgICAgICAgICAgICAgICAgICBpcy0+ZnJhbWVfZHJvcHNfZWFybHkgKyBpcy0+ZnJhbWVfZHJvcHNfbGF0ZSwKKyAgICAgICAgICAgICAgICAgICBhcXNpemUgLyAxMDI0LAorICAgICAgICAgICAgICAgICAgIHZxc2l6ZSAvIDEwMjQsCisgICAgICAgICAgICAgICAgICAgc3FzaXplLAorICAgICAgICAgICAgICAgICAgIGlzLT52aWRlb19zdCA/IGlzLT52aWRkZWMuYXZjdHgtPnB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfZHRzIDogMCwKKyAgICAgICAgICAgICAgICAgICBpcy0+dmlkZW9fc3QgPyBpcy0+dmlkZGVjLmF2Y3R4LT5wdHNfY29ycmVjdGlvbl9udW1fZmF1bHR5X3B0cyA6IDApOworICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgICAgICAgICBsYXN0X3RpbWUgPSBjdXJfdGltZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBxdWV1ZV9waWN0dXJlKFZpZGVvU3RhdGUgKmlzLCBBVkZyYW1lICpzcmNfZnJhbWUsIGRvdWJsZSBwdHMsIGRvdWJsZSBkdXJhdGlvbiwgaW50NjRfdCBwb3MsIGludCBzZXJpYWwpCit7CisgICAgRnJhbWUgKnZwOworCisjaWYgZGVmaW5lZChERUJVR19TWU5DKQorICAgIHByaW50ZigiZnJhbWVfdHlwZT0lYyBwdHM9JTAuM2ZcbiIsCisgICAgICAgICAgIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihzcmNfZnJhbWUtPnBpY3RfdHlwZSksIHB0cyk7CisjZW5kaWYKKworICAgIGlmICghKHZwID0gZnJhbWVfcXVldWVfcGVla193cml0YWJsZSgmaXMtPnBpY3RxKSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHZwLT5zYXIgPSBzcmNfZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgdnAtPnVwbG9hZGVkID0gMDsKKworICAgIHZwLT53aWR0aCA9IHNyY19mcmFtZS0+d2lkdGg7CisgICAgdnAtPmhlaWdodCA9IHNyY19mcmFtZS0+aGVpZ2h0OworICAgIHZwLT5mb3JtYXQgPSBzcmNfZnJhbWUtPmZvcm1hdDsKKworICAgIHZwLT5wdHMgPSBwdHM7CisgICAgdnAtPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgdnAtPnBvcyA9IHBvczsKKyAgICB2cC0+c2VyaWFsID0gc2VyaWFsOworCisgICAgc2V0X2RlZmF1bHRfd2luZG93X3NpemUodnAtPndpZHRoLCB2cC0+aGVpZ2h0LCB2cC0+c2FyKTsKKworICAgIGF2X2ZyYW1lX21vdmVfcmVmKHZwLT5mcmFtZSwgc3JjX2ZyYW1lKTsKKyAgICBmcmFtZV9xdWV1ZV9wdXNoKCZpcy0+cGljdHEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF92aWRlb19mcmFtZShWaWRlb1N0YXRlICppcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGdvdF9waWN0dXJlOworCisgICAgaWYgKChnb3RfcGljdHVyZSA9IGRlY29kZXJfZGVjb2RlX2ZyYW1lKCZpcy0+dmlkZGVjLCBmcmFtZSwgTlVMTCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKGdvdF9waWN0dXJlKSB7CisgICAgICAgIGRvdWJsZSBkcHRzID0gTkFOOworCisgICAgICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgZHB0cyA9IGF2X3EyZChpcy0+dmlkZW9fc3QtPnRpbWVfYmFzZSkgKiBmcmFtZS0+cHRzOworCisgICAgICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfZ3Vlc3Nfc2FtcGxlX2FzcGVjdF9yYXRpbyhpcy0+aWMsIGlzLT52aWRlb19zdCwgZnJhbWUpOworCisgICAgICAgIGlmIChmcmFtZWRyb3A+MCB8fCAoZnJhbWVkcm9wICYmIGdldF9tYXN0ZXJfc3luY190eXBlKGlzKSAhPSBBVl9TWU5DX1ZJREVPX01BU1RFUikpIHsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIGRpZmYgPSBkcHRzIC0gZ2V0X21hc3Rlcl9jbG9jayhpcyk7CisgICAgICAgICAgICAgICAgaWYgKCFpc25hbihkaWZmKSAmJiBmYWJzKGRpZmYpIDwgQVZfTk9TWU5DX1RIUkVTSE9MRCAmJgorICAgICAgICAgICAgICAgICAgICBkaWZmIC0gaXMtPmZyYW1lX2xhc3RfZmlsdGVyX2RlbGF5IDwgMCAmJgorICAgICAgICAgICAgICAgICAgICBpcy0+dmlkZGVjLnBrdF9zZXJpYWwgPT0gaXMtPnZpZGNsay5zZXJpYWwgJiYKKyAgICAgICAgICAgICAgICAgICAgaXMtPnZpZGVvcS5uYl9wYWNrZXRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlzLT5mcmFtZV9kcm9wc19lYXJseSsrOworICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGdvdF9waWN0dXJlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZ290X3BpY3R1cmU7Cit9CisKKyNpZiBDT05GSUdfQVZGSUxURVIKK3N0YXRpYyBpbnQgY29uZmlndXJlX2ZpbHRlcmdyYXBoKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICpmaWx0ZXJncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyQ29udGV4dCAqc291cmNlX2N0eCwgQVZGaWx0ZXJDb250ZXh0ICpzaW5rX2N0eCkKK3sKKyAgICBpbnQgcmV0LCBpOworICAgIGludCBuYl9maWx0ZXJzID0gZ3JhcGgtPm5iX2ZpbHRlcnM7CisgICAgQVZGaWx0ZXJJbk91dCAqb3V0cHV0cyA9IE5VTEwsICppbnB1dHMgPSBOVUxMOworCisgICAgaWYgKGZpbHRlcmdyYXBoKSB7CisgICAgICAgIG91dHB1dHMgPSBhdmZpbHRlcl9pbm91dF9hbGxvYygpOworICAgICAgICBpbnB1dHMgID0gYXZmaWx0ZXJfaW5vdXRfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFvdXRwdXRzIHx8ICFpbnB1dHMpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dHMtPm5hbWUgICAgICAgPSBhdl9zdHJkdXAoImluIik7CisgICAgICAgIG91dHB1dHMtPmZpbHRlcl9jdHggPSBzb3VyY2VfY3R4OworICAgICAgICBvdXRwdXRzLT5wYWRfaWR4ICAgID0gMDsKKyAgICAgICAgb3V0cHV0cy0+bmV4dCAgICAgICA9IE5VTEw7CisKKyAgICAgICAgaW5wdXRzLT5uYW1lICAgICAgICA9IGF2X3N0cmR1cCgib3V0Iik7CisgICAgICAgIGlucHV0cy0+ZmlsdGVyX2N0eCAgPSBzaW5rX2N0eDsKKyAgICAgICAgaW5wdXRzLT5wYWRfaWR4ICAgICA9IDA7CisgICAgICAgIGlucHV0cy0+bmV4dCAgICAgICAgPSBOVUxMOworCisgICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfcGFyc2VfcHRyKGdyYXBoLCBmaWx0ZXJncmFwaCwgJmlucHV0cywgJm91dHB1dHMsIE5VTEwpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdmZpbHRlcl9saW5rKHNvdXJjZV9jdHgsIDAsIHNpbmtfY3R4LCAwKSkgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIFJlb3JkZXIgdGhlIGZpbHRlcnMgdG8gZW5zdXJlIHRoYXQgaW5wdXRzIG9mIHRoZSBjdXN0b20gZmlsdGVycyBhcmUgbWVyZ2VkIGZpcnN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGdyYXBoLT5uYl9maWx0ZXJzIC0gbmJfZmlsdGVyczsgaSsrKQorICAgICAgICBGRlNXQVAoQVZGaWx0ZXJDb250ZXh0KiwgZ3JhcGgtPmZpbHRlcnNbaV0sIGdyYXBoLT5maWx0ZXJzW2kgKyBuYl9maWx0ZXJzXSk7CisKKyAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jb25maWcoZ3JhcGgsIE5VTEwpOworZmFpbDoKKyAgICBhdmZpbHRlcl9pbm91dF9mcmVlKCZvdXRwdXRzKTsKKyAgICBhdmZpbHRlcl9pbm91dF9mcmVlKCZpbnB1dHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlndXJlX3ZpZGVvX2ZpbHRlcnMoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIFZpZGVvU3RhdGUgKmlzLCBjb25zdCBjaGFyICp2ZmlsdGVycywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW0ZGX0FSUkFZX0VMRU1TKHNkbF90ZXh0dXJlX2Zvcm1hdF9tYXApXTsKKyAgICBjaGFyIHN3c19mbGFnc19zdHJbNTEyXSA9ICIiOworICAgIGNoYXIgYnVmZmVyc3JjX2FyZ3NbMjU2XTsKKyAgICBpbnQgcmV0OworICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdF9zcmMgPSBOVUxMLCAqZmlsdF9vdXQgPSBOVUxMLCAqbGFzdF9maWx0ZXIgPSBOVUxMOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpjb2RlY3BhciA9IGlzLT52aWRlb19zdC0+Y29kZWNwYXI7CisgICAgQVZSYXRpb25hbCBmciA9IGF2X2d1ZXNzX2ZyYW1lX3JhdGUoaXMtPmljLCBpcy0+dmlkZW9fc3QsIE5VTEwpOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICplID0gTlVMTDsKKyAgICBpbnQgbmJfcGl4X2ZtdHMgPSAwOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IHJlbmRlcmVyX2luZm8ubnVtX3RleHR1cmVfZm9ybWF0czsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBGRl9BUlJBWV9FTEVNUyhzZGxfdGV4dHVyZV9mb3JtYXRfbWFwKSAtIDE7IGorKykgeworICAgICAgICAgICAgaWYgKHJlbmRlcmVyX2luZm8udGV4dHVyZV9mb3JtYXRzW2ldID09IHNkbF90ZXh0dXJlX2Zvcm1hdF9tYXBbal0udGV4dHVyZV9mbXQpIHsKKyAgICAgICAgICAgICAgICBwaXhfZm10c1tuYl9waXhfZm10cysrXSA9IHNkbF90ZXh0dXJlX2Zvcm1hdF9tYXBbal0uZm9ybWF0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBpeF9mbXRzW25iX3BpeF9mbXRzXSA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KHN3c19kaWN0LCAiIiwgZSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAoZS0+a2V5LCAic3dzX2ZsYWdzIikpIHsKKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKHN3c19mbGFnc19zdHIsIHNpemVvZihzd3NfZmxhZ3Nfc3RyKSwgIiVzPSVzOiIsICJmbGFncyIsIGUtPnZhbHVlKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBhdl9zdHJsY2F0Zihzd3NfZmxhZ3Nfc3RyLCBzaXplb2Yoc3dzX2ZsYWdzX3N0ciksICIlcz0lczoiLCBlLT5rZXksIGUtPnZhbHVlKTsKKyAgICB9CisgICAgaWYgKHN0cmxlbihzd3NfZmxhZ3Nfc3RyKSkKKyAgICAgICAgc3dzX2ZsYWdzX3N0cltzdHJsZW4oc3dzX2ZsYWdzX3N0ciktMV0gPSAnXDAnOworCisgICAgZ3JhcGgtPnNjYWxlX3N3c19vcHRzID0gYXZfc3RyZHVwKHN3c19mbGFnc19zdHIpOworCisgICAgc25wcmludGYoYnVmZmVyc3JjX2FyZ3MsIHNpemVvZihidWZmZXJzcmNfYXJncyksCisgICAgICAgICAgICAgInZpZGVvX3NpemU9JWR4JWQ6cGl4X2ZtdD0lZDp0aW1lX2Jhc2U9JWQvJWQ6cGl4ZWxfYXNwZWN0PSVkLyVkIiwKKyAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsIGZyYW1lLT5mb3JtYXQsCisgICAgICAgICAgICAgaXMtPnZpZGVvX3N0LT50aW1lX2Jhc2UubnVtLCBpcy0+dmlkZW9fc3QtPnRpbWVfYmFzZS5kZW4sCisgICAgICAgICAgICAgY29kZWNwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBGRk1BWChjb2RlY3Bhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sIDEpKTsKKyAgICBpZiAoZnIubnVtICYmIGZyLmRlbikKKyAgICAgICAgYXZfc3RybGNhdGYoYnVmZmVyc3JjX2FyZ3MsIHNpemVvZihidWZmZXJzcmNfYXJncyksICI6ZnJhbWVfcmF0ZT0lZC8lZCIsIGZyLm51bSwgZnIuZGVuKTsKKworICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmZmlsdF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJidWZmZXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZmcGxheV9idWZmZXIiLCBidWZmZXJzcmNfYXJncywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldCA9IGF2ZmlsdGVyX2dyYXBoX2NyZWF0ZV9maWx0ZXIoJmZpbHRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImJ1ZmZlcnNpbmsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZnBsYXlfYnVmZmVyc2luayIsIE5VTEwsIE5VTEwsIGdyYXBoKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2ludF9saXN0KGZpbHRfb3V0LCAicGl4X2ZtdHMiLCBwaXhfZm10cywgIEFWX1BJWF9GTVRfTk9ORSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgbGFzdF9maWx0ZXIgPSBmaWx0X291dDsKKworLyogTm90ZTogdGhpcyBtYWNybyBhZGRzIGEgZmlsdGVyIGJlZm9yZSB0aGUgbGFzdGx5IGFkZGVkIGZpbHRlciwgc28gdGhlCisgKiBwcm9jZXNzaW5nIG9yZGVyIG9mIHRoZSBmaWx0ZXJzIGlzIGluIHJldmVyc2UgKi8KKyNkZWZpbmUgSU5TRVJUX0ZJTFQobmFtZSwgYXJnKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdF9jdHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmaWx0X2N0eCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUobmFtZSksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmZwbGF5XyIgbmFtZSwgYXJnLCBOVUxMLCBncmFwaCk7ICAgIFwKKyAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBhdmZpbHRlcl9saW5rKGZpbHRfY3R4LCAwLCBsYXN0X2ZpbHRlciwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChyZXQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdvdG8gZmFpbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxhc3RfZmlsdGVyID0gZmlsdF9jdHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgaWYgKGF1dG9yb3RhdGUpIHsKKyAgICAgICAgZG91YmxlIHRoZXRhICA9IGdldF9yb3RhdGlvbihpcy0+dmlkZW9fc3QpOworCisgICAgICAgIGlmIChmYWJzKHRoZXRhIC0gOTApIDwgMS4wKSB7CisgICAgICAgICAgICBJTlNFUlRfRklMVCgidHJhbnNwb3NlIiwgImNsb2NrIik7CisgICAgICAgIH0gZWxzZSBpZiAoZmFicyh0aGV0YSAtIDE4MCkgPCAxLjApIHsKKyAgICAgICAgICAgIElOU0VSVF9GSUxUKCJoZmxpcCIsIE5VTEwpOworICAgICAgICAgICAgSU5TRVJUX0ZJTFQoInZmbGlwIiwgTlVMTCk7CisgICAgICAgIH0gZWxzZSBpZiAoZmFicyh0aGV0YSAtIDI3MCkgPCAxLjApIHsKKyAgICAgICAgICAgIElOU0VSVF9GSUxUKCJ0cmFuc3Bvc2UiLCAiY2Nsb2NrIik7CisgICAgICAgIH0gZWxzZSBpZiAoZmFicyh0aGV0YSkgPiAxLjApIHsKKyAgICAgICAgICAgIGNoYXIgcm90YXRlX2J1Zls2NF07CisgICAgICAgICAgICBzbnByaW50Zihyb3RhdGVfYnVmLCBzaXplb2Yocm90YXRlX2J1ZiksICIlZipQSS8xODAiLCB0aGV0YSk7CisgICAgICAgICAgICBJTlNFUlRfRklMVCgicm90YXRlIiwgcm90YXRlX2J1Zik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGNvbmZpZ3VyZV9maWx0ZXJncmFwaChncmFwaCwgdmZpbHRlcnMsIGZpbHRfc3JjLCBsYXN0X2ZpbHRlcikpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaXMtPmluX3ZpZGVvX2ZpbHRlciAgPSBmaWx0X3NyYzsKKyAgICBpcy0+b3V0X3ZpZGVvX2ZpbHRlciA9IGZpbHRfb3V0OworCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlndXJlX2F1ZGlvX2ZpbHRlcnMoVmlkZW9TdGF0ZSAqaXMsIGNvbnN0IGNoYXIgKmFmaWx0ZXJzLCBpbnQgZm9yY2Vfb3V0cHV0X2Zvcm1hdCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geyBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9OT05FIH07CisgICAgaW50IHNhbXBsZV9yYXRlc1syXSA9IHsgMCwgLTEgfTsKKyAgICBpbnQ2NF90IGNoYW5uZWxfbGF5b3V0c1syXSA9IHsgMCwgLTEgfTsKKyAgICBpbnQgY2hhbm5lbHNbMl0gPSB7IDAsIC0xIH07CisgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWx0X2FzcmMgPSBOVUxMLCAqZmlsdF9hc2luayA9IE5VTEw7CisgICAgY2hhciBhcmVzYW1wbGVfc3dyX29wdHNbNTEyXSA9ICIiOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICplID0gTlVMTDsKKyAgICBjaGFyIGFzcmNfYXJnc1syNTZdOworICAgIGludCByZXQ7CisKKyAgICBhdmZpbHRlcl9ncmFwaF9mcmVlKCZpcy0+YWdyYXBoKTsKKyAgICBpZiAoIShpcy0+YWdyYXBoID0gYXZmaWx0ZXJfZ3JhcGhfYWxsb2MoKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB3aGlsZSAoKGUgPSBhdl9kaWN0X2dldChzd3Jfb3B0cywgIiIsIGUsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQorICAgICAgICBhdl9zdHJsY2F0ZihhcmVzYW1wbGVfc3dyX29wdHMsIHNpemVvZihhcmVzYW1wbGVfc3dyX29wdHMpLCAiJXM9JXM6IiwgZS0+a2V5LCBlLT52YWx1ZSk7CisgICAgaWYgKHN0cmxlbihhcmVzYW1wbGVfc3dyX29wdHMpKQorICAgICAgICBhcmVzYW1wbGVfc3dyX29wdHNbc3RybGVuKGFyZXNhbXBsZV9zd3Jfb3B0cyktMV0gPSAnXDAnOworICAgIGF2X29wdF9zZXQoaXMtPmFncmFwaCwgImFyZXNhbXBsZV9zd3Jfb3B0cyIsIGFyZXNhbXBsZV9zd3Jfb3B0cywgMCk7CisKKyAgICByZXQgPSBzbnByaW50Zihhc3JjX2FyZ3MsIHNpemVvZihhc3JjX2FyZ3MpLAorICAgICAgICAgICAgICAgICAgICJzYW1wbGVfcmF0ZT0lZDpzYW1wbGVfZm10PSVzOmNoYW5uZWxzPSVkOnRpbWVfYmFzZT0lZC8lZCIsCisgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuZnJlcSwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShpcy0+YXVkaW9fZmlsdGVyX3NyYy5mbXQpLAorICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIDEsIGlzLT5hdWRpb19maWx0ZXJfc3JjLmZyZXEpOworICAgIGlmIChpcy0+YXVkaW9fZmlsdGVyX3NyYy5jaGFubmVsX2xheW91dCkKKyAgICAgICAgc25wcmludGYoYXNyY19hcmdzICsgcmV0LCBzaXplb2YoYXNyY19hcmdzKSAtIHJldCwKKyAgICAgICAgICAgICAgICAgIjpjaGFubmVsX2xheW91dD0weCUiUFJJeDY0LCAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQpOworCisgICAgcmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmZmlsdF9hc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImFidWZmZXIiKSwgImZmcGxheV9hYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzcmNfYXJncywgTlVMTCwgaXMtPmFncmFwaCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisKKyAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmaWx0X2FzaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImFidWZmZXJzaW5rIiksICJmZnBsYXlfYWJ1ZmZlcnNpbmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgaXMtPmFncmFwaCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2ludF9saXN0KGZpbHRfYXNpbmssICJzYW1wbGVfZm10cyIsIHNhbXBsZV9mbXRzLCAgQVZfU0FNUExFX0ZNVF9OT05FLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBpZiAoKHJldCA9IGF2X29wdF9zZXRfaW50KGZpbHRfYXNpbmssICJhbGxfY2hhbm5lbF9jb3VudHMiLCAxLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIGlmIChmb3JjZV9vdXRwdXRfZm9ybWF0KSB7CisgICAgICAgIGNoYW5uZWxfbGF5b3V0c1swXSA9IGlzLT5hdWRpb190Z3QuY2hhbm5lbF9sYXlvdXQ7CisgICAgICAgIGNoYW5uZWxzICAgICAgIFswXSA9IGlzLT5hdWRpb190Z3QuY2hhbm5lbHM7CisgICAgICAgIHNhbXBsZV9yYXRlcyAgIFswXSA9IGlzLT5hdWRpb190Z3QuZnJlcTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2ludChmaWx0X2FzaW5rLCAiYWxsX2NoYW5uZWxfY291bnRzIiwgMCwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAoKHJldCA9IGF2X29wdF9zZXRfaW50X2xpc3QoZmlsdF9hc2luaywgImNoYW5uZWxfbGF5b3V0cyIsIGNoYW5uZWxfbGF5b3V0cywgIC0xLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9pbnRfbGlzdChmaWx0X2FzaW5rLCAiY2hhbm5lbF9jb3VudHMiICwgY2hhbm5lbHMgICAgICAgLCAgLTEsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4pKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0X2ludF9saXN0KGZpbHRfYXNpbmssICJzYW1wbGVfcmF0ZXMiICAgLCBzYW1wbGVfcmF0ZXMgICAsICAtMSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworCisgICAgaWYgKChyZXQgPSBjb25maWd1cmVfZmlsdGVyZ3JhcGgoaXMtPmFncmFwaCwgYWZpbHRlcnMsIGZpbHRfYXNyYywgZmlsdF9hc2luaykpIDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBpcy0+aW5fYXVkaW9fZmlsdGVyICA9IGZpbHRfYXNyYzsKKyAgICBpcy0+b3V0X2F1ZGlvX2ZpbHRlciA9IGZpbHRfYXNpbms7CisKK2VuZDoKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmaXMtPmFncmFwaCk7CisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZiAgLyogQ09ORklHX0FWRklMVEVSICovCisKK3N0YXRpYyBpbnQgYXVkaW9fdGhyZWFkKHZvaWQgKmFyZykKK3sKKyAgICBWaWRlb1N0YXRlICppcyA9IGFyZzsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgRnJhbWUgKmFmOworI2lmIENPTkZJR19BVkZJTFRFUgorICAgIGludCBsYXN0X3NlcmlhbCA9IC0xOworICAgIGludDY0X3QgZGVjX2NoYW5uZWxfbGF5b3V0OworICAgIGludCByZWNvbmZpZ3VyZTsKKyNlbmRpZgorICAgIGludCBnb3RfZnJhbWUgPSAwOworICAgIEFWUmF0aW9uYWwgdGI7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZG8geworICAgICAgICBpZiAoKGdvdF9mcmFtZSA9IGRlY29kZXJfZGVjb2RlX2ZyYW1lKCZpcy0+YXVkZGVjLCBmcmFtZSwgTlVMTCkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKKworICAgICAgICBpZiAoZ290X2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgdGIgPSAoQVZSYXRpb25hbCl7MSwgZnJhbWUtPnNhbXBsZV9yYXRlfTsKKworI2lmIENPTkZJR19BVkZJTFRFUgorICAgICAgICAgICAgICAgIGRlY19jaGFubmVsX2xheW91dCA9IGdldF92YWxpZF9jaGFubmVsX2xheW91dChmcmFtZS0+Y2hhbm5lbF9sYXlvdXQsIGZyYW1lLT5jaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICByZWNvbmZpZ3VyZSA9CisgICAgICAgICAgICAgICAgICAgIGNtcF9hdWRpb19mbXRzKGlzLT5hdWRpb19maWx0ZXJfc3JjLmZtdCwgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQsIGZyYW1lLT5jaGFubmVscykgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQgIT0gZGVjX2NoYW5uZWxfbGF5b3V0IHx8CisgICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmZyZXEgICAgICAgICAgICE9IGZyYW1lLT5zYW1wbGVfcmF0ZSB8fAorICAgICAgICAgICAgICAgICAgICBpcy0+YXVkZGVjLnBrdF9zZXJpYWwgICAgICAgICAgICAgICAhPSBsYXN0X3NlcmlhbDsKKworICAgICAgICAgICAgICAgIGlmIChyZWNvbmZpZ3VyZSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIGJ1ZjFbMTAyNF0sIGJ1ZjJbMTAyNF07CisgICAgICAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAtMSwgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1ZjIsIHNpemVvZihidWYyKSwgLTEsIGRlY19jaGFubmVsX2xheW91dCk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXVkaW8gZnJhbWUgY2hhbmdlZCBmcm9tIHJhdGU6JWQgY2g6JWQgZm10OiVzIGxheW91dDolcyBzZXJpYWw6JWQgdG8gcmF0ZTolZCBjaDolZCBmbXQ6JXMgbGF5b3V0OiVzIHNlcmlhbDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmZyZXEsIGlzLT5hdWRpb19maWx0ZXJfc3JjLmNoYW5uZWxzLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGlzLT5hdWRpb19maWx0ZXJfc3JjLmZtdCksIGJ1ZjEsIGxhc3Rfc2VyaWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9yYXRlLCBmcmFtZS0+Y2hhbm5lbHMsIGF2X2dldF9zYW1wbGVfZm10X25hbWUoZnJhbWUtPmZvcm1hdCksIGJ1ZjIsIGlzLT5hdWRkZWMucGt0X3NlcmlhbCk7CisKKyAgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuZm10ICAgICAgICAgICAgPSBmcmFtZS0+Zm9ybWF0OworICAgICAgICAgICAgICAgICAgICBpcy0+YXVkaW9fZmlsdGVyX3NyYy5jaGFubmVscyAgICAgICA9IGZyYW1lLT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQgPSBkZWNfY2hhbm5lbF9sYXlvdXQ7CisgICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmZyZXEgICAgICAgICAgID0gZnJhbWUtPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBsYXN0X3NlcmlhbCAgICAgICAgICAgICAgICAgICAgICAgICA9IGlzLT5hdWRkZWMucGt0X3NlcmlhbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGNvbmZpZ3VyZV9hdWRpb19maWx0ZXJzKGlzLCBhZmlsdGVycywgMSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZShpcy0+aW5fYXVkaW9fZmlsdGVyLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIHRoZV9lbmQ7CisKKyAgICAgICAgICAgIHdoaWxlICgocmV0ID0gYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfZmxhZ3MoaXMtPm91dF9hdWRpb19maWx0ZXIsIGZyYW1lLCAwKSkgPj0gMCkgeworICAgICAgICAgICAgICAgIHRiID0gYXZfYnVmZmVyc2lua19nZXRfdGltZV9iYXNlKGlzLT5vdXRfYXVkaW9fZmlsdGVyKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGlmICghKGFmID0gZnJhbWVfcXVldWVfcGVla193cml0YWJsZSgmaXMtPnNhbXBxKSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKKworICAgICAgICAgICAgICAgIGFmLT5wdHMgPSAoZnJhbWUtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkgPyBOQU4gOiBmcmFtZS0+cHRzICogYXZfcTJkKHRiKTsKKyAgICAgICAgICAgICAgICBhZi0+cG9zID0gZnJhbWUtPnBrdF9wb3M7CisgICAgICAgICAgICAgICAgYWYtPnNlcmlhbCA9IGlzLT5hdWRkZWMucGt0X3NlcmlhbDsKKyAgICAgICAgICAgICAgICBhZi0+ZHVyYXRpb24gPSBhdl9xMmQoKEFWUmF0aW9uYWwpe2ZyYW1lLT5uYl9zYW1wbGVzLCBmcmFtZS0+c2FtcGxlX3JhdGV9KTsKKworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX21vdmVfcmVmKGFmLT5mcmFtZSwgZnJhbWUpOworICAgICAgICAgICAgICAgIGZyYW1lX3F1ZXVlX3B1c2goJmlzLT5zYW1wcSk7CisKKyNpZiBDT05GSUdfQVZGSUxURVIKKyAgICAgICAgICAgICAgICBpZiAoaXMtPmF1ZGlvcS5zZXJpYWwgIT0gaXMtPmF1ZGRlYy5wa3Rfc2VyaWFsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgaXMtPmF1ZGRlYy5maW5pc2hlZCA9IGlzLT5hdWRkZWMucGt0X3NlcmlhbDsKKyNlbmRpZgorICAgICAgICB9CisgICAgfSB3aGlsZSAocmV0ID49IDAgfHwgcmV0ID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpOworIHRoZV9lbmQ6CisjaWYgQ09ORklHX0FWRklMVEVSCisgICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmaXMtPmFncmFwaCk7CisjZW5kaWYKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZWNvZGVyX3N0YXJ0KERlY29kZXIgKmQsIGludCAoKmZuKSh2b2lkICopLCB2b2lkICphcmcpCit7CisgICAgcGFja2V0X3F1ZXVlX3N0YXJ0KGQtPnF1ZXVlKTsKKyAgICBkLT5kZWNvZGVyX3RpZCA9IFNETF9DcmVhdGVUaHJlYWQoZm4sICJkZWNvZGVyIiwgYXJnKTsKKyAgICBpZiAoIWQtPmRlY29kZXJfdGlkKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJTRExfQ3JlYXRlVGhyZWFkKCk6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGVvX3RocmVhZCh2b2lkICphcmcpCit7CisgICAgVmlkZW9TdGF0ZSAqaXMgPSBhcmc7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGRvdWJsZSBwdHM7CisgICAgZG91YmxlIGR1cmF0aW9uOworICAgIGludCByZXQ7CisgICAgQVZSYXRpb25hbCB0YiA9IGlzLT52aWRlb19zdC0+dGltZV9iYXNlOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZSA9IGF2X2d1ZXNzX2ZyYW1lX3JhdGUoaXMtPmljLCBpcy0+dmlkZW9fc3QsIE5VTEwpOworCisjaWYgQ09ORklHX0FWRklMVEVSCisgICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGggPSBhdmZpbHRlcl9ncmFwaF9hbGxvYygpOworICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdF9vdXQgPSBOVUxMLCAqZmlsdF9pbiA9IE5VTEw7CisgICAgaW50IGxhc3RfdyA9IDA7CisgICAgaW50IGxhc3RfaCA9IDA7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGxhc3RfZm9ybWF0ID0gLTI7CisgICAgaW50IGxhc3Rfc2VyaWFsID0gLTE7CisgICAgaW50IGxhc3RfdmZpbHRlcl9pZHggPSAwOworICAgIGlmICghZ3JhcGgpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworI2VuZGlmCisKKyAgICBpZiAoIWZyYW1lKSB7CisjaWYgQ09ORklHX0FWRklMVEVSCisgICAgICAgIGF2ZmlsdGVyX2dyYXBoX2ZyZWUoJmdyYXBoKTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgcmV0ID0gZ2V0X3ZpZGVvX2ZyYW1lKGlzLCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisjaWYgQ09ORklHX0FWRklMVEVSCisgICAgICAgIGlmICggICBsYXN0X3cgIT0gZnJhbWUtPndpZHRoCisgICAgICAgICAgICB8fCBsYXN0X2ggIT0gZnJhbWUtPmhlaWdodAorICAgICAgICAgICAgfHwgbGFzdF9mb3JtYXQgIT0gZnJhbWUtPmZvcm1hdAorICAgICAgICAgICAgfHwgbGFzdF9zZXJpYWwgIT0gaXMtPnZpZGRlYy5wa3Rfc2VyaWFsCisgICAgICAgICAgICB8fCBsYXN0X3ZmaWx0ZXJfaWR4ICE9IGlzLT52ZmlsdGVyX2lkeCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiVmlkZW8gZnJhbWUgY2hhbmdlZCBmcm9tIHNpemU6JWR4JWQgZm9ybWF0OiVzIHNlcmlhbDolZCB0byBzaXplOiVkeCVkIGZvcm1hdDolcyBzZXJpYWw6JWRcbiIsCisgICAgICAgICAgICAgICAgICAgbGFzdF93LCBsYXN0X2gsCisgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKilhdl94X2lmX251bGwoYXZfZ2V0X3BpeF9mbXRfbmFtZShsYXN0X2Zvcm1hdCksICJub25lIiksIGxhc3Rfc2VyaWFsLAorICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKWF2X3hfaWZfbnVsbChhdl9nZXRfcGl4X2ZtdF9uYW1lKGZyYW1lLT5mb3JtYXQpLCAibm9uZSIpLCBpcy0+dmlkZGVjLnBrdF9zZXJpYWwpOworICAgICAgICAgICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmZ3JhcGgpOworICAgICAgICAgICAgZ3JhcGggPSBhdmZpbHRlcl9ncmFwaF9hbGxvYygpOworICAgICAgICAgICAgaWYgKChyZXQgPSBjb25maWd1cmVfdmlkZW9fZmlsdGVycyhncmFwaCwgaXMsIHZmaWx0ZXJzX2xpc3QgPyB2ZmlsdGVyc19saXN0W2lzLT52ZmlsdGVyX2lkeF0gOiBOVUxMLCBmcmFtZSkpIDwgMCkgeworICAgICAgICAgICAgICAgIFNETF9FdmVudCBldmVudDsKKyAgICAgICAgICAgICAgICBldmVudC50eXBlID0gRkZfUVVJVF9FVkVOVDsKKyAgICAgICAgICAgICAgICBldmVudC51c2VyLmRhdGExID0gaXM7CisgICAgICAgICAgICAgICAgU0RMX1B1c2hFdmVudCgmZXZlbnQpOworICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbHRfaW4gID0gaXMtPmluX3ZpZGVvX2ZpbHRlcjsKKyAgICAgICAgICAgIGZpbHRfb3V0ID0gaXMtPm91dF92aWRlb19maWx0ZXI7CisgICAgICAgICAgICBsYXN0X3cgPSBmcmFtZS0+d2lkdGg7CisgICAgICAgICAgICBsYXN0X2ggPSBmcmFtZS0+aGVpZ2h0OworICAgICAgICAgICAgbGFzdF9mb3JtYXQgPSBmcmFtZS0+Zm9ybWF0OworICAgICAgICAgICAgbGFzdF9zZXJpYWwgPSBpcy0+dmlkZGVjLnBrdF9zZXJpYWw7CisgICAgICAgICAgICBsYXN0X3ZmaWx0ZXJfaWR4ID0gaXMtPnZmaWx0ZXJfaWR4OworICAgICAgICAgICAgZnJhbWVfcmF0ZSA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX3JhdGUoZmlsdF9vdXQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZfYnVmZmVyc3JjX2FkZF9mcmFtZShmaWx0X2luLCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byB0aGVfZW5kOworCisgICAgICAgIHdoaWxlIChyZXQgPj0gMCkgeworICAgICAgICAgICAgaXMtPmZyYW1lX2xhc3RfcmV0dXJuZWRfdGltZSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAvIDEwMDAwMDAuMDsKKworICAgICAgICAgICAgcmV0ID0gYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfZmxhZ3MoZmlsdF9vdXQsIGZyYW1lLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgICAgICAgICAgaXMtPnZpZGRlYy5maW5pc2hlZCA9IGlzLT52aWRkZWMucGt0X3NlcmlhbDsKKyAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpcy0+ZnJhbWVfbGFzdF9maWx0ZXJfZGVsYXkgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLyAxMDAwMDAwLjAgLSBpcy0+ZnJhbWVfbGFzdF9yZXR1cm5lZF90aW1lOworICAgICAgICAgICAgaWYgKGZhYnMoaXMtPmZyYW1lX2xhc3RfZmlsdGVyX2RlbGF5KSA+IEFWX05PU1lOQ19USFJFU0hPTEQgLyAxMC4wKQorICAgICAgICAgICAgICAgIGlzLT5mcmFtZV9sYXN0X2ZpbHRlcl9kZWxheSA9IDA7CisgICAgICAgICAgICB0YiA9IGF2X2J1ZmZlcnNpbmtfZ2V0X3RpbWVfYmFzZShmaWx0X291dCk7CisjZW5kaWYKKyAgICAgICAgICAgIGR1cmF0aW9uID0gKGZyYW1lX3JhdGUubnVtICYmIGZyYW1lX3JhdGUuZGVuID8gYXZfcTJkKChBVlJhdGlvbmFsKXtmcmFtZV9yYXRlLmRlbiwgZnJhbWVfcmF0ZS5udW19KSA6IDApOworICAgICAgICAgICAgcHRzID0gKGZyYW1lLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpID8gTkFOIDogZnJhbWUtPnB0cyAqIGF2X3EyZCh0Yik7CisgICAgICAgICAgICByZXQgPSBxdWV1ZV9waWN0dXJlKGlzLCBmcmFtZSwgcHRzLCBkdXJhdGlvbiwgZnJhbWUtPnBrdF9wb3MsIGlzLT52aWRkZWMucGt0X3NlcmlhbCk7CisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisjaWYgQ09ORklHX0FWRklMVEVSCisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgIH0KKyB0aGVfZW5kOgorI2lmIENPTkZJR19BVkZJTFRFUgorICAgIGF2ZmlsdGVyX2dyYXBoX2ZyZWUoJmdyYXBoKTsKKyNlbmRpZgorICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJ0aXRsZV90aHJlYWQodm9pZCAqYXJnKQoreworICAgIFZpZGVvU3RhdGUgKmlzID0gYXJnOworICAgIEZyYW1lICpzcDsKKyAgICBpbnQgZ290X3N1YnRpdGxlOworICAgIGRvdWJsZSBwdHM7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICghKHNwID0gZnJhbWVfcXVldWVfcGVla193cml0YWJsZSgmaXMtPnN1YnBxKSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpZiAoKGdvdF9zdWJ0aXRsZSA9IGRlY29kZXJfZGVjb2RlX2ZyYW1lKCZpcy0+c3ViZGVjLCBOVUxMLCAmc3AtPnN1YikpIDwgMCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHB0cyA9IDA7CisKKyAgICAgICAgaWYgKGdvdF9zdWJ0aXRsZSAmJiBzcC0+c3ViLmZvcm1hdCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoc3AtPnN1Yi5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgcHRzID0gc3AtPnN1Yi5wdHMgLyAoZG91YmxlKUFWX1RJTUVfQkFTRTsKKyAgICAgICAgICAgIHNwLT5wdHMgPSBwdHM7CisgICAgICAgICAgICBzcC0+c2VyaWFsID0gaXMtPnN1YmRlYy5wa3Rfc2VyaWFsOworICAgICAgICAgICAgc3AtPndpZHRoID0gaXMtPnN1YmRlYy5hdmN0eC0+d2lkdGg7CisgICAgICAgICAgICBzcC0+aGVpZ2h0ID0gaXMtPnN1YmRlYy5hdmN0eC0+aGVpZ2h0OworICAgICAgICAgICAgc3AtPnVwbG9hZGVkID0gMDsKKworICAgICAgICAgICAgLyogbm93IHdlIGNhbiB1cGRhdGUgdGhlIHBpY3R1cmUgY291bnQgKi8KKyAgICAgICAgICAgIGZyYW1lX3F1ZXVlX3B1c2goJmlzLT5zdWJwcSk7CisgICAgICAgIH0gZWxzZSBpZiAoZ290X3N1YnRpdGxlKSB7CisgICAgICAgICAgICBhdnN1YnRpdGxlX2ZyZWUoJnNwLT5zdWIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBjb3B5IHNhbXBsZXMgZm9yIHZpZXdpbmcgaW4gZWRpdG9yIHdpbmRvdyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3NhbXBsZV9kaXNwbGF5KFZpZGVvU3RhdGUgKmlzLCBzaG9ydCAqc2FtcGxlcywgaW50IHNhbXBsZXNfc2l6ZSkKK3sKKyAgICBpbnQgc2l6ZSwgbGVuOworCisgICAgc2l6ZSA9IHNhbXBsZXNfc2l6ZSAvIHNpemVvZihzaG9ydCk7CisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIGxlbiA9IFNBTVBMRV9BUlJBWV9TSVpFIC0gaXMtPnNhbXBsZV9hcnJheV9pbmRleDsKKyAgICAgICAgaWYgKGxlbiA+IHNpemUpCisgICAgICAgICAgICBsZW4gPSBzaXplOworICAgICAgICBtZW1jcHkoaXMtPnNhbXBsZV9hcnJheSArIGlzLT5zYW1wbGVfYXJyYXlfaW5kZXgsIHNhbXBsZXMsIGxlbiAqIHNpemVvZihzaG9ydCkpOworICAgICAgICBzYW1wbGVzICs9IGxlbjsKKyAgICAgICAgaXMtPnNhbXBsZV9hcnJheV9pbmRleCArPSBsZW47CisgICAgICAgIGlmIChpcy0+c2FtcGxlX2FycmF5X2luZGV4ID49IFNBTVBMRV9BUlJBWV9TSVpFKQorICAgICAgICAgICAgaXMtPnNhbXBsZV9hcnJheV9pbmRleCA9IDA7CisgICAgICAgIHNpemUgLT0gbGVuOworICAgIH0KK30KKworLyogcmV0dXJuIHRoZSB3YW50ZWQgbnVtYmVyIG9mIHNhbXBsZXMgdG8gZ2V0IGJldHRlciBzeW5jIGlmIHN5bmNfdHlwZSBpcyB2aWRlbworICogb3IgZXh0ZXJuYWwgbWFzdGVyIGNsb2NrICovCitzdGF0aWMgaW50IHN5bmNocm9uaXplX2F1ZGlvKFZpZGVvU3RhdGUgKmlzLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgd2FudGVkX25iX3NhbXBsZXMgPSBuYl9zYW1wbGVzOworCisgICAgLyogaWYgbm90IG1hc3RlciwgdGhlbiB3ZSB0cnkgdG8gcmVtb3ZlIG9yIGFkZCBzYW1wbGVzIHRvIGNvcnJlY3QgdGhlIGNsb2NrICovCisgICAgaWYgKGdldF9tYXN0ZXJfc3luY190eXBlKGlzKSAhPSBBVl9TWU5DX0FVRElPX01BU1RFUikgeworICAgICAgICBkb3VibGUgZGlmZiwgYXZnX2RpZmY7CisgICAgICAgIGludCBtaW5fbmJfc2FtcGxlcywgbWF4X25iX3NhbXBsZXM7CisKKyAgICAgICAgZGlmZiA9IGdldF9jbG9jaygmaXMtPmF1ZGNsaykgLSBnZXRfbWFzdGVyX2Nsb2NrKGlzKTsKKworICAgICAgICBpZiAoIWlzbmFuKGRpZmYpICYmIGZhYnMoZGlmZikgPCBBVl9OT1NZTkNfVEhSRVNIT0xEKSB7CisgICAgICAgICAgICBpcy0+YXVkaW9fZGlmZl9jdW0gPSBkaWZmICsgaXMtPmF1ZGlvX2RpZmZfYXZnX2NvZWYgKiBpcy0+YXVkaW9fZGlmZl9jdW07CisgICAgICAgICAgICBpZiAoaXMtPmF1ZGlvX2RpZmZfYXZnX2NvdW50IDwgQVVESU9fRElGRl9BVkdfTkIpIHsKKyAgICAgICAgICAgICAgICAvKiBub3QgZW5vdWdoIG1lYXN1cmVzIHRvIGhhdmUgYSBjb3JyZWN0IGVzdGltYXRlICovCisgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2RpZmZfYXZnX2NvdW50Kys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIGVzdGltYXRlIHRoZSBBLVYgZGlmZmVyZW5jZSAqLworICAgICAgICAgICAgICAgIGF2Z19kaWZmID0gaXMtPmF1ZGlvX2RpZmZfY3VtICogKDEuMCAtIGlzLT5hdWRpb19kaWZmX2F2Z19jb2VmKTsKKworICAgICAgICAgICAgICAgIGlmIChmYWJzKGF2Z19kaWZmKSA+PSBpcy0+YXVkaW9fZGlmZl90aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgd2FudGVkX25iX3NhbXBsZXMgPSBuYl9zYW1wbGVzICsgKGludCkoZGlmZiAqIGlzLT5hdWRpb19zcmMuZnJlcSk7CisgICAgICAgICAgICAgICAgICAgIG1pbl9uYl9zYW1wbGVzID0gKChuYl9zYW1wbGVzICogKDEwMCAtIFNBTVBMRV9DT1JSRUNUSU9OX1BFUkNFTlRfTUFYKSAvIDEwMCkpOworICAgICAgICAgICAgICAgICAgICBtYXhfbmJfc2FtcGxlcyA9ICgobmJfc2FtcGxlcyAqICgxMDAgKyBTQU1QTEVfQ09SUkVDVElPTl9QRVJDRU5UX01BWCkgLyAxMDApKTsKKyAgICAgICAgICAgICAgICAgICAgd2FudGVkX25iX3NhbXBsZXMgPSBhdl9jbGlwKHdhbnRlZF9uYl9zYW1wbGVzLCBtaW5fbmJfc2FtcGxlcywgbWF4X25iX3NhbXBsZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1RSQUNFLCAiZGlmZj0lZiBhZGlmZj0lZiBzYW1wbGVfZGlmZj0lZCBhcHRzPSUwLjNmICVmXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiwgYXZnX2RpZmYsIHdhbnRlZF9uYl9zYW1wbGVzIC0gbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb19jbG9jaywgaXMtPmF1ZGlvX2RpZmZfdGhyZXNob2xkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHRvbyBiaWcgZGlmZmVyZW5jZSA6IG1heSBiZSBpbml0aWFsIFBUUyBlcnJvcnMsIHNvCisgICAgICAgICAgICAgICByZXNldCBBLVYgZmlsdGVyICovCisgICAgICAgICAgICBpcy0+YXVkaW9fZGlmZl9hdmdfY291bnQgPSAwOworICAgICAgICAgICAgaXMtPmF1ZGlvX2RpZmZfY3VtICAgICAgID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3YW50ZWRfbmJfc2FtcGxlczsKK30KKworLyoqCisgKiBEZWNvZGUgb25lIGF1ZGlvIGZyYW1lIGFuZCByZXR1cm4gaXRzIHVuY29tcHJlc3NlZCBzaXplLgorICoKKyAqIFRoZSBwcm9jZXNzZWQgYXVkaW8gZnJhbWUgaXMgZGVjb2RlZCwgY29udmVydGVkIGlmIHJlcXVpcmVkLCBhbmQKKyAqIHN0b3JlZCBpbiBpcy0+YXVkaW9fYnVmLCB3aXRoIHNpemUgaW4gYnl0ZXMgZ2l2ZW4gYnkgdGhlIHJldHVybgorICogdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgYXVkaW9fZGVjb2RlX2ZyYW1lKFZpZGVvU3RhdGUgKmlzKQoreworICAgIGludCBkYXRhX3NpemUsIHJlc2FtcGxlZF9kYXRhX3NpemU7CisgICAgaW50NjRfdCBkZWNfY2hhbm5lbF9sYXlvdXQ7CisgICAgYXZfdW51c2VkIGRvdWJsZSBhdWRpb19jbG9jazA7CisgICAgaW50IHdhbnRlZF9uYl9zYW1wbGVzOworICAgIEZyYW1lICphZjsKKworICAgIGlmIChpcy0+cGF1c2VkKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBkbyB7CisjaWYgZGVmaW5lZChfV0lOMzIpCisgICAgICAgIHdoaWxlIChmcmFtZV9xdWV1ZV9uYl9yZW1haW5pbmcoJmlzLT5zYW1wcSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKChhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSBhdWRpb19jYWxsYmFja190aW1lKSA+IDEwMDAwMDBMTCAqIGlzLT5hdWRpb19od19idWZfc2l6ZSAvIGlzLT5hdWRpb190Z3QuYnl0ZXNfcGVyX3NlYyAvIDIpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgYXZfdXNsZWVwICgxMDAwKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmICghKGFmID0gZnJhbWVfcXVldWVfcGVla19yZWFkYWJsZSgmaXMtPnNhbXBxKSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGZyYW1lX3F1ZXVlX25leHQoJmlzLT5zYW1wcSk7CisgICAgfSB3aGlsZSAoYWYtPnNlcmlhbCAhPSBpcy0+YXVkaW9xLnNlcmlhbCk7CisKKyAgICBkYXRhX3NpemUgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZShOVUxMLCBhZi0+ZnJhbWUtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmLT5mcmFtZS0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZi0+ZnJhbWUtPmZvcm1hdCwgMSk7CisKKyAgICBkZWNfY2hhbm5lbF9sYXlvdXQgPQorICAgICAgICAoYWYtPmZyYW1lLT5jaGFubmVsX2xheW91dCAmJiBhZi0+ZnJhbWUtPmNoYW5uZWxzID09IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhhZi0+ZnJhbWUtPmNoYW5uZWxfbGF5b3V0KSkgPworICAgICAgICBhZi0+ZnJhbWUtPmNoYW5uZWxfbGF5b3V0IDogYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQoYWYtPmZyYW1lLT5jaGFubmVscyk7CisgICAgd2FudGVkX25iX3NhbXBsZXMgPSBzeW5jaHJvbml6ZV9hdWRpbyhpcywgYWYtPmZyYW1lLT5uYl9zYW1wbGVzKTsKKworICAgIGlmIChhZi0+ZnJhbWUtPmZvcm1hdCAgICAgICAgIT0gaXMtPmF1ZGlvX3NyYy5mbXQgICAgICAgICAgICB8fAorICAgICAgICBkZWNfY2hhbm5lbF9sYXlvdXQgICAgICAgIT0gaXMtPmF1ZGlvX3NyYy5jaGFubmVsX2xheW91dCB8fAorICAgICAgICBhZi0+ZnJhbWUtPnNhbXBsZV9yYXRlICAgIT0gaXMtPmF1ZGlvX3NyYy5mcmVxICAgICAgICAgICB8fAorICAgICAgICAod2FudGVkX25iX3NhbXBsZXMgICAgICAgIT0gYWYtPmZyYW1lLT5uYl9zYW1wbGVzICYmICFpcy0+c3dyX2N0eCkpIHsKKyAgICAgICAgc3dyX2ZyZWUoJmlzLT5zd3JfY3R4KTsKKyAgICAgICAgaXMtPnN3cl9jdHggPSBzd3JfYWxsb2Nfc2V0X29wdHMoTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMtPmF1ZGlvX3RndC5jaGFubmVsX2xheW91dCwgaXMtPmF1ZGlvX3RndC5mbXQsIGlzLT5hdWRpb190Z3QuZnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjX2NoYW5uZWxfbGF5b3V0LCAgICAgICAgICAgYWYtPmZyYW1lLT5mb3JtYXQsIGFmLT5mcmFtZS0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwpOworICAgICAgICBpZiAoIWlzLT5zd3JfY3R4IHx8IHN3cl9pbml0KGlzLT5zd3JfY3R4KSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgc2FtcGxlIHJhdGUgY29udmVydGVyIGZvciBjb252ZXJzaW9uIG9mICVkIEh6ICVzICVkIGNoYW5uZWxzIHRvICVkIEh6ICVzICVkIGNoYW5uZWxzIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgYWYtPmZyYW1lLT5zYW1wbGVfcmF0ZSwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShhZi0+ZnJhbWUtPmZvcm1hdCksIGFmLT5mcmFtZS0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgIGlzLT5hdWRpb190Z3QuZnJlcSwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShpcy0+YXVkaW9fdGd0LmZtdCksIGlzLT5hdWRpb190Z3QuY2hhbm5lbHMpOworICAgICAgICAgICAgc3dyX2ZyZWUoJmlzLT5zd3JfY3R4KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpcy0+YXVkaW9fc3JjLmNoYW5uZWxfbGF5b3V0ID0gZGVjX2NoYW5uZWxfbGF5b3V0OworICAgICAgICBpcy0+YXVkaW9fc3JjLmNoYW5uZWxzICAgICAgID0gYWYtPmZyYW1lLT5jaGFubmVsczsKKyAgICAgICAgaXMtPmF1ZGlvX3NyYy5mcmVxID0gYWYtPmZyYW1lLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgaXMtPmF1ZGlvX3NyYy5mbXQgPSBhZi0+ZnJhbWUtPmZvcm1hdDsKKyAgICB9CisKKyAgICBpZiAoaXMtPnN3cl9jdHgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqKmluID0gKGNvbnN0IHVpbnQ4X3QgKiopYWYtPmZyYW1lLT5leHRlbmRlZF9kYXRhOworICAgICAgICB1aW50OF90ICoqb3V0ID0gJmlzLT5hdWRpb19idWYxOworICAgICAgICBpbnQgb3V0X2NvdW50ID0gKGludDY0X3Qpd2FudGVkX25iX3NhbXBsZXMgKiBpcy0+YXVkaW9fdGd0LmZyZXEgLyBhZi0+ZnJhbWUtPnNhbXBsZV9yYXRlICsgMjU2OworICAgICAgICBpbnQgb3V0X3NpemUgID0gYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoTlVMTCwgaXMtPmF1ZGlvX3RndC5jaGFubmVscywgb3V0X2NvdW50LCBpcy0+YXVkaW9fdGd0LmZtdCwgMCk7CisgICAgICAgIGludCBsZW4yOworICAgICAgICBpZiAob3V0X3NpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmICh3YW50ZWRfbmJfc2FtcGxlcyAhPSBhZi0+ZnJhbWUtPm5iX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIGlmIChzd3Jfc2V0X2NvbXBlbnNhdGlvbihpcy0+c3dyX2N0eCwgKHdhbnRlZF9uYl9zYW1wbGVzIC0gYWYtPmZyYW1lLT5uYl9zYW1wbGVzKSAqIGlzLT5hdWRpb190Z3QuZnJlcSAvIGFmLT5mcmFtZS0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudGVkX25iX3NhbXBsZXMgKiBpcy0+YXVkaW9fdGd0LmZyZXEgLyBhZi0+ZnJhbWUtPnNhbXBsZV9yYXRlKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAic3dyX3NldF9jb21wZW5zYXRpb24oKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9mYXN0X21hbGxvYygmaXMtPmF1ZGlvX2J1ZjEsICZpcy0+YXVkaW9fYnVmMV9zaXplLCBvdXRfc2l6ZSk7CisgICAgICAgIGlmICghaXMtPmF1ZGlvX2J1ZjEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBsZW4yID0gc3dyX2NvbnZlcnQoaXMtPnN3cl9jdHgsIG91dCwgb3V0X2NvdW50LCBpbiwgYWYtPmZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKGxlbjIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAic3dyX2NvbnZlcnQoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChsZW4yID09IG91dF9jb3VudCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiYXVkaW8gYnVmZmVyIGlzIHByb2JhYmx5IHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICBpZiAoc3dyX2luaXQoaXMtPnN3cl9jdHgpIDwgMCkKKyAgICAgICAgICAgICAgICBzd3JfZnJlZSgmaXMtPnN3cl9jdHgpOworICAgICAgICB9CisgICAgICAgIGlzLT5hdWRpb19idWYgPSBpcy0+YXVkaW9fYnVmMTsKKyAgICAgICAgcmVzYW1wbGVkX2RhdGFfc2l6ZSA9IGxlbjIgKiBpcy0+YXVkaW9fdGd0LmNoYW5uZWxzICogYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoaXMtPmF1ZGlvX3RndC5mbXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlzLT5hdWRpb19idWYgPSBhZi0+ZnJhbWUtPmRhdGFbMF07CisgICAgICAgIHJlc2FtcGxlZF9kYXRhX3NpemUgPSBkYXRhX3NpemU7CisgICAgfQorCisgICAgYXVkaW9fY2xvY2swID0gaXMtPmF1ZGlvX2Nsb2NrOworICAgIC8qIHVwZGF0ZSB0aGUgYXVkaW8gY2xvY2sgd2l0aCB0aGUgcHRzICovCisgICAgaWYgKCFpc25hbihhZi0+cHRzKSkKKyAgICAgICAgaXMtPmF1ZGlvX2Nsb2NrID0gYWYtPnB0cyArIChkb3VibGUpIGFmLT5mcmFtZS0+bmJfc2FtcGxlcyAvIGFmLT5mcmFtZS0+c2FtcGxlX3JhdGU7CisgICAgZWxzZQorICAgICAgICBpcy0+YXVkaW9fY2xvY2sgPSBOQU47CisgICAgaXMtPmF1ZGlvX2Nsb2NrX3NlcmlhbCA9IGFmLT5zZXJpYWw7CisjaWZkZWYgREVCVUcKKyAgICB7CisgICAgICAgIHN0YXRpYyBkb3VibGUgbGFzdF9jbG9jazsKKyAgICAgICAgcHJpbnRmKCJhdWRpbzogZGVsYXk9JTAuM2YgY2xvY2s9JTAuM2YgY2xvY2swPSUwLjNmXG4iLAorICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2Nsb2NrIC0gbGFzdF9jbG9jaywKKyAgICAgICAgICAgICAgIGlzLT5hdWRpb19jbG9jaywgYXVkaW9fY2xvY2swKTsKKyAgICAgICAgbGFzdF9jbG9jayA9IGlzLT5hdWRpb19jbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcmVzYW1wbGVkX2RhdGFfc2l6ZTsKK30KKworLyogcHJlcGFyZSBhIG5ldyBhdWRpbyBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIHNkbF9hdWRpb19jYWxsYmFjayh2b2lkICpvcGFxdWUsIFVpbnQ4ICpzdHJlYW0sIGludCBsZW4pCit7CisgICAgVmlkZW9TdGF0ZSAqaXMgPSBvcGFxdWU7CisgICAgaW50IGF1ZGlvX3NpemUsIGxlbjE7CisKKyAgICBhdWRpb19jYWxsYmFja190aW1lID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworCisgICAgd2hpbGUgKGxlbiA+IDApIHsKKyAgICAgICAgaWYgKGlzLT5hdWRpb19idWZfaW5kZXggPj0gaXMtPmF1ZGlvX2J1Zl9zaXplKSB7CisgICAgICAgICAgIGF1ZGlvX3NpemUgPSBhdWRpb19kZWNvZGVfZnJhbWUoaXMpOworICAgICAgICAgICBpZiAoYXVkaW9fc2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBlcnJvciwganVzdCBvdXRwdXQgc2lsZW5jZSAqLworICAgICAgICAgICAgICAgaXMtPmF1ZGlvX2J1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICBpcy0+YXVkaW9fYnVmX3NpemUgPSBTRExfQVVESU9fTUlOX0JVRkZFUl9TSVpFIC8gaXMtPmF1ZGlvX3RndC5mcmFtZV9zaXplICogaXMtPmF1ZGlvX3RndC5mcmFtZV9zaXplOworICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgaWYgKGlzLT5zaG93X21vZGUgIT0gU0hPV19NT0RFX1ZJREVPKQorICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9zYW1wbGVfZGlzcGxheShpcywgKGludDE2X3QgKilpcy0+YXVkaW9fYnVmLCBhdWRpb19zaXplKTsKKyAgICAgICAgICAgICAgIGlzLT5hdWRpb19idWZfc2l6ZSA9IGF1ZGlvX3NpemU7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgaXMtPmF1ZGlvX2J1Zl9pbmRleCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbGVuMSA9IGlzLT5hdWRpb19idWZfc2l6ZSAtIGlzLT5hdWRpb19idWZfaW5kZXg7CisgICAgICAgIGlmIChsZW4xID4gbGVuKQorICAgICAgICAgICAgbGVuMSA9IGxlbjsKKyAgICAgICAgaWYgKCFpcy0+bXV0ZWQgJiYgaXMtPmF1ZGlvX2J1ZiAmJiBpcy0+YXVkaW9fdm9sdW1lID09IFNETF9NSVhfTUFYVk9MVU1FKQorICAgICAgICAgICAgbWVtY3B5KHN0cmVhbSwgKHVpbnQ4X3QgKilpcy0+YXVkaW9fYnVmICsgaXMtPmF1ZGlvX2J1Zl9pbmRleCwgbGVuMSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KHN0cmVhbSwgMCwgbGVuMSk7CisgICAgICAgICAgICBpZiAoIWlzLT5tdXRlZCAmJiBpcy0+YXVkaW9fYnVmKQorICAgICAgICAgICAgICAgIFNETF9NaXhBdWRpb0Zvcm1hdChzdHJlYW0sICh1aW50OF90ICopaXMtPmF1ZGlvX2J1ZiArIGlzLT5hdWRpb19idWZfaW5kZXgsIEFVRElPX1MxNlNZUywgbGVuMSwgaXMtPmF1ZGlvX3ZvbHVtZSk7CisgICAgICAgIH0KKyAgICAgICAgbGVuIC09IGxlbjE7CisgICAgICAgIHN0cmVhbSArPSBsZW4xOworICAgICAgICBpcy0+YXVkaW9fYnVmX2luZGV4ICs9IGxlbjE7CisgICAgfQorICAgIGlzLT5hdWRpb193cml0ZV9idWZfc2l6ZSA9IGlzLT5hdWRpb19idWZfc2l6ZSAtIGlzLT5hdWRpb19idWZfaW5kZXg7CisgICAgLyogTGV0J3MgYXNzdW1lIHRoZSBhdWRpbyBkcml2ZXIgdGhhdCBpcyB1c2VkIGJ5IFNETCBoYXMgdHdvIHBlcmlvZHMuICovCisgICAgaWYgKCFpc25hbihpcy0+YXVkaW9fY2xvY2spKSB7CisgICAgICAgIHNldF9jbG9ja19hdCgmaXMtPmF1ZGNsaywgaXMtPmF1ZGlvX2Nsb2NrIC0gKGRvdWJsZSkoMiAqIGlzLT5hdWRpb19od19idWZfc2l6ZSArIGlzLT5hdWRpb193cml0ZV9idWZfc2l6ZSkgLyBpcy0+YXVkaW9fdGd0LmJ5dGVzX3Blcl9zZWMsIGlzLT5hdWRpb19jbG9ja19zZXJpYWwsIGF1ZGlvX2NhbGxiYWNrX3RpbWUgLyAxMDAwMDAwLjApOworICAgICAgICBzeW5jX2Nsb2NrX3RvX3NsYXZlKCZpcy0+ZXh0Y2xrLCAmaXMtPmF1ZGNsayk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGF1ZGlvX29wZW4odm9pZCAqb3BhcXVlLCBpbnQ2NF90IHdhbnRlZF9jaGFubmVsX2xheW91dCwgaW50IHdhbnRlZF9uYl9jaGFubmVscywgaW50IHdhbnRlZF9zYW1wbGVfcmF0ZSwgc3RydWN0IEF1ZGlvUGFyYW1zICphdWRpb19od19wYXJhbXMpCit7CisgICAgU0RMX0F1ZGlvU3BlYyB3YW50ZWRfc3BlYywgc3BlYzsKKyAgICBjb25zdCBjaGFyICplbnY7CisgICAgc3RhdGljIGNvbnN0IGludCBuZXh0X25iX2NoYW5uZWxzW10gPSB7MCwgMCwgMSwgNiwgMiwgNiwgNCwgNn07CisgICAgc3RhdGljIGNvbnN0IGludCBuZXh0X3NhbXBsZV9yYXRlc1tdID0gezAsIDQ0MTAwLCA0ODAwMCwgOTYwMDAsIDE5MjAwMH07CisgICAgaW50IG5leHRfc2FtcGxlX3JhdGVfaWR4ID0gRkZfQVJSQVlfRUxFTVMobmV4dF9zYW1wbGVfcmF0ZXMpIC0gMTsKKworICAgIGVudiA9IFNETF9nZXRlbnYoIlNETF9BVURJT19DSEFOTkVMUyIpOworICAgIGlmIChlbnYpIHsKKyAgICAgICAgd2FudGVkX25iX2NoYW5uZWxzID0gYXRvaShlbnYpOworICAgICAgICB3YW50ZWRfY2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dCh3YW50ZWRfbmJfY2hhbm5lbHMpOworICAgIH0KKyAgICBpZiAoIXdhbnRlZF9jaGFubmVsX2xheW91dCB8fCB3YW50ZWRfbmJfY2hhbm5lbHMgIT0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHdhbnRlZF9jaGFubmVsX2xheW91dCkpIHsKKyAgICAgICAgd2FudGVkX2NoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQod2FudGVkX25iX2NoYW5uZWxzKTsKKyAgICAgICAgd2FudGVkX2NoYW5uZWxfbGF5b3V0ICY9IH5BVl9DSF9MQVlPVVRfU1RFUkVPX0RPV05NSVg7CisgICAgfQorICAgIHdhbnRlZF9uYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyh3YW50ZWRfY2hhbm5lbF9sYXlvdXQpOworICAgIHdhbnRlZF9zcGVjLmNoYW5uZWxzID0gd2FudGVkX25iX2NoYW5uZWxzOworICAgIHdhbnRlZF9zcGVjLmZyZXEgPSB3YW50ZWRfc2FtcGxlX3JhdGU7CisgICAgaWYgKHdhbnRlZF9zcGVjLmZyZXEgPD0gMCB8fCB3YW50ZWRfc3BlYy5jaGFubmVscyA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlIG9yIGNoYW5uZWwgY291bnQhXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICB3aGlsZSAobmV4dF9zYW1wbGVfcmF0ZV9pZHggJiYgbmV4dF9zYW1wbGVfcmF0ZXNbbmV4dF9zYW1wbGVfcmF0ZV9pZHhdID49IHdhbnRlZF9zcGVjLmZyZXEpCisgICAgICAgIG5leHRfc2FtcGxlX3JhdGVfaWR4LS07CisgICAgd2FudGVkX3NwZWMuZm9ybWF0ID0gQVVESU9fUzE2U1lTOworICAgIHdhbnRlZF9zcGVjLnNpbGVuY2UgPSAwOworICAgIHdhbnRlZF9zcGVjLnNhbXBsZXMgPSBGRk1BWChTRExfQVVESU9fTUlOX0JVRkZFUl9TSVpFLCAyIDw8IGF2X2xvZzIod2FudGVkX3NwZWMuZnJlcSAvIFNETF9BVURJT19NQVhfQ0FMTEJBQ0tTX1BFUl9TRUMpKTsKKyAgICB3YW50ZWRfc3BlYy5jYWxsYmFjayA9IHNkbF9hdWRpb19jYWxsYmFjazsKKyAgICB3YW50ZWRfc3BlYy51c2VyZGF0YSA9IG9wYXF1ZTsKKyAgICB3aGlsZSAoIShhdWRpb19kZXYgPSBTRExfT3BlbkF1ZGlvRGV2aWNlKE5VTEwsIDAsICZ3YW50ZWRfc3BlYywgJnNwZWMsIFNETF9BVURJT19BTExPV19GUkVRVUVOQ1lfQ0hBTkdFIHwgU0RMX0FVRElPX0FMTE9XX0NIQU5ORUxTX0NIQU5HRSkpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlNETF9PcGVuQXVkaW8gKCVkIGNoYW5uZWxzLCAlZCBIeik6ICVzXG4iLAorICAgICAgICAgICAgICAgd2FudGVkX3NwZWMuY2hhbm5lbHMsIHdhbnRlZF9zcGVjLmZyZXEsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgd2FudGVkX3NwZWMuY2hhbm5lbHMgPSBuZXh0X25iX2NoYW5uZWxzW0ZGTUlOKDcsIHdhbnRlZF9zcGVjLmNoYW5uZWxzKV07CisgICAgICAgIGlmICghd2FudGVkX3NwZWMuY2hhbm5lbHMpIHsKKyAgICAgICAgICAgIHdhbnRlZF9zcGVjLmZyZXEgPSBuZXh0X3NhbXBsZV9yYXRlc1tuZXh0X3NhbXBsZV9yYXRlX2lkeC0tXTsKKyAgICAgICAgICAgIHdhbnRlZF9zcGVjLmNoYW5uZWxzID0gd2FudGVkX25iX2NoYW5uZWxzOworICAgICAgICAgICAgaWYgKCF3YW50ZWRfc3BlYy5mcmVxKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk5vIG1vcmUgY29tYmluYXRpb25zIHRvIHRyeSwgYXVkaW8gb3BlbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3YW50ZWRfY2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dCh3YW50ZWRfc3BlYy5jaGFubmVscyk7CisgICAgfQorICAgIGlmIChzcGVjLmZvcm1hdCAhPSBBVURJT19TMTZTWVMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJTREwgYWR2aXNlZCBhdWRpbyBmb3JtYXQgJWQgaXMgbm90IHN1cHBvcnRlZCFcbiIsIHNwZWMuZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoc3BlYy5jaGFubmVscyAhPSB3YW50ZWRfc3BlYy5jaGFubmVscykgeworICAgICAgICB3YW50ZWRfY2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChzcGVjLmNoYW5uZWxzKTsKKyAgICAgICAgaWYgKCF3YW50ZWRfY2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlNETCBhZHZpc2VkIGNoYW5uZWwgY291bnQgJWQgaXMgbm90IHN1cHBvcnRlZCFcbiIsIHNwZWMuY2hhbm5lbHMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgYXVkaW9faHdfcGFyYW1zLT5mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICBhdWRpb19od19wYXJhbXMtPmZyZXEgPSBzcGVjLmZyZXE7CisgICAgYXVkaW9faHdfcGFyYW1zLT5jaGFubmVsX2xheW91dCA9IHdhbnRlZF9jaGFubmVsX2xheW91dDsKKyAgICBhdWRpb19od19wYXJhbXMtPmNoYW5uZWxzID0gIHNwZWMuY2hhbm5lbHM7CisgICAgYXVkaW9faHdfcGFyYW1zLT5mcmFtZV9zaXplID0gYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoTlVMTCwgYXVkaW9faHdfcGFyYW1zLT5jaGFubmVscywgMSwgYXVkaW9faHdfcGFyYW1zLT5mbXQsIDEpOworICAgIGF1ZGlvX2h3X3BhcmFtcy0+Ynl0ZXNfcGVyX3NlYyA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKE5VTEwsIGF1ZGlvX2h3X3BhcmFtcy0+Y2hhbm5lbHMsIGF1ZGlvX2h3X3BhcmFtcy0+ZnJlcSwgYXVkaW9faHdfcGFyYW1zLT5mbXQsIDEpOworICAgIGlmIChhdWRpb19od19wYXJhbXMtPmJ5dGVzX3Blcl9zZWMgPD0gMCB8fCBhdWRpb19od19wYXJhbXMtPmZyYW1lX3NpemUgPD0gMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICByZXR1cm4gc3BlYy5zaXplOworfQorCisvKiBvcGVuIGEgZ2l2ZW4gc3RyZWFtLiBSZXR1cm4gMCBpZiBPSyAqLworc3RhdGljIGludCBzdHJlYW1fY29tcG9uZW50X29wZW4oVmlkZW9TdGF0ZSAqaXMsIGludCBzdHJlYW1faW5kZXgpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICppYyA9IGlzLT5pYzsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZDb2RlYyAqY29kZWM7CisgICAgY29uc3QgY2hhciAqZm9yY2VkX2NvZGVjX25hbWUgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOworICAgIGludCBzYW1wbGVfcmF0ZSwgbmJfY2hhbm5lbHM7CisgICAgaW50NjRfdCBjaGFubmVsX2xheW91dDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgc3RyZWFtX2xvd3JlcyA9IGxvd3JlczsKKworICAgIGlmIChzdHJlYW1faW5kZXggPCAwIHx8IHN0cmVhbV9pbmRleCA+PSBpYy0+bmJfc3RyZWFtcykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYXZjdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworICAgIGlmICghYXZjdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChhdmN0eCwgaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYXZjdHgtPnBrdF90aW1lYmFzZSA9IGljLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnRpbWVfYmFzZTsKKworICAgIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoYXZjdHgtPmNvZGVjX2lkKTsKKworICAgIHN3aXRjaChhdmN0eC0+Y29kZWNfdHlwZSl7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPICAgOiBpcy0+bGFzdF9hdWRpb19zdHJlYW0gICAgPSBzdHJlYW1faW5kZXg7IGZvcmNlZF9jb2RlY19uYW1lID0gICAgYXVkaW9fY29kZWNfbmFtZTsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOiBpcy0+bGFzdF9zdWJ0aXRsZV9zdHJlYW0gPSBzdHJlYW1faW5kZXg7IGZvcmNlZF9jb2RlY19uYW1lID0gc3VidGl0bGVfY29kZWNfbmFtZTsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPICAgOiBpcy0+bGFzdF92aWRlb19zdHJlYW0gICAgPSBzdHJlYW1faW5kZXg7IGZvcmNlZF9jb2RlY19uYW1lID0gICAgdmlkZW9fY29kZWNfbmFtZTsgYnJlYWs7CisgICAgfQorICAgIGlmIChmb3JjZWRfY29kZWNfbmFtZSkKKyAgICAgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2Rlcl9ieV9uYW1lKGZvcmNlZF9jb2RlY19uYW1lKTsKKyAgICBpZiAoIWNvZGVjKSB7CisgICAgICAgIGlmIChmb3JjZWRfY29kZWNfbmFtZSkgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY29kZWMgY291bGQgYmUgZm91bmQgd2l0aCBuYW1lICclcydcbiIsIGZvcmNlZF9jb2RlY19uYW1lKTsKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjb2RlYyBjb3VsZCBiZSBmb3VuZCB3aXRoIGlkICVkXG4iLCBhdmN0eC0+Y29kZWNfaWQpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdmN0eC0+Y29kZWNfaWQgPSBjb2RlYy0+aWQ7CisgICAgaWYgKHN0cmVhbV9sb3dyZXMgPiBjb2RlYy0+bWF4X2xvd3JlcykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlIG1heGltdW0gdmFsdWUgZm9yIGxvd3JlcyBzdXBwb3J0ZWQgYnkgdGhlIGRlY29kZXIgaXMgJWRcbiIsCisgICAgICAgICAgICAgICAgY29kZWMtPm1heF9sb3dyZXMpOworICAgICAgICBzdHJlYW1fbG93cmVzID0gY29kZWMtPm1heF9sb3dyZXM7CisgICAgfQorICAgIGF2Y3R4LT5sb3dyZXMgPSBzdHJlYW1fbG93cmVzOworCisgICAgaWYgKGZhc3QpCisgICAgICAgIGF2Y3R4LT5mbGFnczIgfD0gQVZfQ09ERUNfRkxBRzJfRkFTVDsKKworICAgIG9wdHMgPSBmaWx0ZXJfY29kZWNfb3B0cyhjb2RlY19vcHRzLCBhdmN0eC0+Y29kZWNfaWQsIGljLCBpYy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLCBjb2RlYyk7CisgICAgaWYgKCFhdl9kaWN0X2dldChvcHRzLCAidGhyZWFkcyIsIE5VTEwsIDApKQorICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgInRocmVhZHMiLCAiYXV0byIsIDApOworICAgIGlmIChzdHJlYW1fbG93cmVzKQorICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm9wdHMsICJsb3dyZXMiLCBzdHJlYW1fbG93cmVzLCAwKTsKKyAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8IGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJyZWZjb3VudGVkX2ZyYW1lcyIsICIxIiwgMCk7CisgICAgaWYgKChyZXQgPSBhdmNvZGVjX29wZW4yKGF2Y3R4LCBjb2RlYywgJm9wdHMpKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoKHQgPSBhdl9kaWN0X2dldChvcHRzLCAiIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk9wdGlvbiAlcyBub3QgZm91bmQuXG4iLCB0LT5rZXkpOworICAgICAgICByZXQgPSAgQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaXMtPmVvZiA9IDA7CisgICAgaWMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9ERUZBVUxUOworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyNpZiBDT05GSUdfQVZGSUxURVIKKyAgICAgICAgeworICAgICAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpzaW5rOworCisgICAgICAgICAgICBpcy0+YXVkaW9fZmlsdGVyX3NyYy5mcmVxICAgICAgICAgICA9IGF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGlzLT5hdWRpb19maWx0ZXJfc3JjLmNoYW5uZWxzICAgICAgID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuY2hhbm5lbF9sYXlvdXQgPSBnZXRfdmFsaWRfY2hhbm5lbF9sYXlvdXQoYXZjdHgtPmNoYW5uZWxfbGF5b3V0LCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgaXMtPmF1ZGlvX2ZpbHRlcl9zcmMuZm10ICAgICAgICAgICAgPSBhdmN0eC0+c2FtcGxlX2ZtdDsKKyAgICAgICAgICAgIGlmICgocmV0ID0gY29uZmlndXJlX2F1ZGlvX2ZpbHRlcnMoaXMsIGFmaWx0ZXJzLCAwKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIHNpbmsgPSBpcy0+b3V0X2F1ZGlvX2ZpbHRlcjsKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlICAgID0gYXZfYnVmZmVyc2lua19nZXRfc2FtcGxlX3JhdGUoc2luayk7CisgICAgICAgICAgICBuYl9jaGFubmVscyAgICA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2NoYW5uZWxzKHNpbmspOworICAgICAgICAgICAgY2hhbm5lbF9sYXlvdXQgPSBhdl9idWZmZXJzaW5rX2dldF9jaGFubmVsX2xheW91dChzaW5rKTsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgc2FtcGxlX3JhdGUgICAgPSBhdmN0eC0+c2FtcGxlX3JhdGU7CisgICAgICAgIG5iX2NoYW5uZWxzICAgID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICBjaGFubmVsX2xheW91dCA9IGF2Y3R4LT5jaGFubmVsX2xheW91dDsKKyNlbmRpZgorCisgICAgICAgIC8qIHByZXBhcmUgYXVkaW8gb3V0cHV0ICovCisgICAgICAgIGlmICgocmV0ID0gYXVkaW9fb3BlbihpcywgY2hhbm5lbF9sYXlvdXQsIG5iX2NoYW5uZWxzLCBzYW1wbGVfcmF0ZSwgJmlzLT5hdWRpb190Z3QpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlzLT5hdWRpb19od19idWZfc2l6ZSA9IHJldDsKKyAgICAgICAgaXMtPmF1ZGlvX3NyYyA9IGlzLT5hdWRpb190Z3Q7CisgICAgICAgIGlzLT5hdWRpb19idWZfc2l6ZSAgPSAwOworICAgICAgICBpcy0+YXVkaW9fYnVmX2luZGV4ID0gMDsKKworICAgICAgICAvKiBpbml0IGF2ZXJhZ2luZyBmaWx0ZXIgKi8KKyAgICAgICAgaXMtPmF1ZGlvX2RpZmZfYXZnX2NvZWYgID0gZXhwKGxvZygwLjAxKSAvIEFVRElPX0RJRkZfQVZHX05CKTsKKyAgICAgICAgaXMtPmF1ZGlvX2RpZmZfYXZnX2NvdW50ID0gMDsKKyAgICAgICAgLyogc2luY2Ugd2UgZG8gbm90IGhhdmUgYSBwcmVjaXNlIGFub3VnaCBhdWRpbyBGSUZPIGZ1bGxuZXNzLAorICAgICAgICAgICB3ZSBjb3JyZWN0IGF1ZGlvIHN5bmMgb25seSBpZiBsYXJnZXIgdGhhbiB0aGlzIHRocmVzaG9sZCAqLworICAgICAgICBpcy0+YXVkaW9fZGlmZl90aHJlc2hvbGQgPSAoZG91YmxlKShpcy0+YXVkaW9faHdfYnVmX3NpemUpIC8gaXMtPmF1ZGlvX3RndC5ieXRlc19wZXJfc2VjOworCisgICAgICAgIGlzLT5hdWRpb19zdHJlYW0gPSBzdHJlYW1faW5kZXg7CisgICAgICAgIGlzLT5hdWRpb19zdCA9IGljLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisKKyAgICAgICAgZGVjb2Rlcl9pbml0KCZpcy0+YXVkZGVjLCBhdmN0eCwgJmlzLT5hdWRpb3EsIGlzLT5jb250aW51ZV9yZWFkX3RocmVhZCk7CisgICAgICAgIGlmICgoaXMtPmljLT5pZm9ybWF0LT5mbGFncyAmIChBVkZNVF9OT0JJTlNFQVJDSCB8IEFWRk1UX05PR0VOU0VBUkNIIHwgQVZGTVRfTk9fQllURV9TRUVLKSkgJiYgIWlzLT5pYy0+aWZvcm1hdC0+cmVhZF9zZWVrKSB7CisgICAgICAgICAgICBpcy0+YXVkZGVjLnN0YXJ0X3B0cyA9IGlzLT5hdWRpb19zdC0+c3RhcnRfdGltZTsKKyAgICAgICAgICAgIGlzLT5hdWRkZWMuc3RhcnRfcHRzX3RiID0gaXMtPmF1ZGlvX3N0LT50aW1lX2Jhc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVyX3N0YXJ0KCZpcy0+YXVkZGVjLCBhdWRpb190aHJlYWQsIGlzKSkgPCAwKQorICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIFNETF9QYXVzZUF1ZGlvRGV2aWNlKGF1ZGlvX2RldiwgMCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBpcy0+dmlkZW9fc3RyZWFtID0gc3RyZWFtX2luZGV4OworICAgICAgICBpcy0+dmlkZW9fc3QgPSBpYy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworCisgICAgICAgIGRlY29kZXJfaW5pdCgmaXMtPnZpZGRlYywgYXZjdHgsICZpcy0+dmlkZW9xLCBpcy0+Y29udGludWVfcmVhZF90aHJlYWQpOworICAgICAgICBpZiAoKHJldCA9IGRlY29kZXJfc3RhcnQoJmlzLT52aWRkZWMsIHZpZGVvX3RocmVhZCwgaXMpKSA8IDApCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgaXMtPnF1ZXVlX2F0dGFjaG1lbnRzX3JlcSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgICAgICBpcy0+c3VidGl0bGVfc3RyZWFtID0gc3RyZWFtX2luZGV4OworICAgICAgICBpcy0+c3VidGl0bGVfc3QgPSBpYy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworCisgICAgICAgIGRlY29kZXJfaW5pdCgmaXMtPnN1YmRlYywgYXZjdHgsICZpcy0+c3VidGl0bGVxLCBpcy0+Y29udGludWVfcmVhZF90aHJlYWQpOworICAgICAgICBpZiAoKHJldCA9IGRlY29kZXJfc3RhcnQoJmlzLT5zdWJkZWMsIHN1YnRpdGxlX3RocmVhZCwgaXMpKSA8IDApCisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGdvdG8gb3V0OworCitmYWlsOgorICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdmN0eCk7CitvdXQ6CisgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ludGVycnVwdF9jYih2b2lkICpjdHgpCit7CisgICAgVmlkZW9TdGF0ZSAqaXMgPSBjdHg7CisgICAgcmV0dXJuIGlzLT5hYm9ydF9yZXF1ZXN0OworfQorCitzdGF0aWMgaW50IHN0cmVhbV9oYXNfZW5vdWdoX3BhY2tldHMoQVZTdHJlYW0gKnN0LCBpbnQgc3RyZWFtX2lkLCBQYWNrZXRRdWV1ZSAqcXVldWUpIHsKKyAgICByZXR1cm4gc3RyZWFtX2lkIDwgMCB8fAorICAgICAgICAgICBxdWV1ZS0+YWJvcnRfcmVxdWVzdCB8fAorICAgICAgICAgICAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDKSB8fAorICAgICAgICAgICBxdWV1ZS0+bmJfcGFja2V0cyA+IE1JTl9GUkFNRVMgJiYgKCFxdWV1ZS0+ZHVyYXRpb24gfHwgYXZfcTJkKHN0LT50aW1lX2Jhc2UpICogcXVldWUtPmR1cmF0aW9uID4gMS4wKTsKK30KKworc3RhdGljIGludCBpc19yZWFsdGltZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaWYoICAgIXN0cmNtcChzLT5pZm9ybWF0LT5uYW1lLCAicnRwIikKKyAgICAgICB8fCAhc3RyY21wKHMtPmlmb3JtYXQtPm5hbWUsICJydHNwIikKKyAgICAgICB8fCAhc3RyY21wKHMtPmlmb3JtYXQtPm5hbWUsICJzZHAiKQorICAgICkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZihzLT5wYiAmJiAoICAgIXN0cm5jbXAocy0+dXJsLCAicnRwOiIsIDQpCisgICAgICAgICAgICAgICAgIHx8ICFzdHJuY21wKHMtPnVybCwgInVkcDoiLCA0KQorICAgICAgICAgICAgICAgICkKKyAgICApCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisvKiB0aGlzIHRocmVhZCBnZXRzIHRoZSBzdHJlYW0gZnJvbSB0aGUgZGlzayBvciB0aGUgbmV0d29yayAqLworc3RhdGljIGludCByZWFkX3RocmVhZCh2b2lkICphcmcpCit7CisgICAgVmlkZW9TdGF0ZSAqaXMgPSBhcmc7CisgICAgQVZGb3JtYXRDb250ZXh0ICppYyA9IE5VTEw7CisgICAgaW50IGVyciwgaSwgcmV0OworICAgIGludCBzdF9pbmRleFtBVk1FRElBX1RZUEVfTkJdOworICAgIEFWUGFja2V0IHBrdDEsICpwa3QgPSAmcGt0MTsKKyAgICBpbnQ2NF90IHN0cmVhbV9zdGFydF90aW1lOworICAgIGludCBwa3RfaW5fcGxheV9yYW5nZSA9IDA7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7CisgICAgU0RMX211dGV4ICp3YWl0X211dGV4ID0gU0RMX0NyZWF0ZU11dGV4KCk7CisgICAgaW50IHNjYW5fYWxsX3BtdHNfc2V0ID0gMDsKKyAgICBpbnQ2NF90IHBrdF90czsKKworICAgIGlmICghd2FpdF9tdXRleCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU0RMX0NyZWF0ZU11dGV4KCk6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG1lbXNldChzdF9pbmRleCwgLTEsIHNpemVvZihzdF9pbmRleCkpOworICAgIGlzLT5sYXN0X3ZpZGVvX3N0cmVhbSA9IGlzLT52aWRlb19zdHJlYW0gPSAtMTsKKyAgICBpcy0+bGFzdF9hdWRpb19zdHJlYW0gPSBpcy0+YXVkaW9fc3RyZWFtID0gLTE7CisgICAgaXMtPmxhc3Rfc3VidGl0bGVfc3RyZWFtID0gaXMtPnN1YnRpdGxlX3N0cmVhbSA9IC0xOworICAgIGlzLT5lb2YgPSAwOworCisgICAgaWMgPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7CisgICAgaWYgKCFpYykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGFsbG9jYXRlIGNvbnRleHQuXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGljLT5pbnRlcnJ1cHRfY2FsbGJhY2suY2FsbGJhY2sgPSBkZWNvZGVfaW50ZXJydXB0X2NiOworICAgIGljLT5pbnRlcnJ1cHRfY2FsbGJhY2sub3BhcXVlID0gaXM7CisgICAgaWYgKCFhdl9kaWN0X2dldChmb3JtYXRfb3B0cywgInNjYW5fYWxsX3BtdHMiLCBOVUxMLCBBVl9ESUNUX01BVENIX0NBU0UpKSB7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZmb3JtYXRfb3B0cywgInNjYW5fYWxsX3BtdHMiLCAiMSIsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOworICAgICAgICBzY2FuX2FsbF9wbXRzX3NldCA9IDE7CisgICAgfQorICAgIGVyciA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmljLCBpcy0+ZmlsZW5hbWUsIGlzLT5pZm9ybWF0LCAmZm9ybWF0X29wdHMpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIHByaW50X2Vycm9yKGlzLT5maWxlbmFtZSwgZXJyKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKHNjYW5fYWxsX3BtdHNfc2V0KQorICAgICAgICBhdl9kaWN0X3NldCgmZm9ybWF0X29wdHMsICJzY2FuX2FsbF9wbXRzIiwgTlVMTCwgQVZfRElDVF9NQVRDSF9DQVNFKTsKKworICAgIGlmICgodCA9IGF2X2RpY3RfZ2V0KGZvcm1hdF9vcHRzLCAiIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk9wdGlvbiAlcyBub3QgZm91bmQuXG4iLCB0LT5rZXkpOworICAgICAgICByZXQgPSBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaXMtPmljID0gaWM7CisKKyAgICBpZiAoZ2VucHRzKQorICAgICAgICBpYy0+ZmxhZ3MgfD0gQVZGTVRfRkxBR19HRU5QVFM7CisKKyAgICBhdl9mb3JtYXRfaW5qZWN0X2dsb2JhbF9zaWRlX2RhdGEoaWMpOworCisgICAgaWYgKGZpbmRfc3RyZWFtX2luZm8pIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5ICoqb3B0cyA9IHNldHVwX2ZpbmRfc3RyZWFtX2luZm9fb3B0cyhpYywgY29kZWNfb3B0cyk7CisgICAgICAgIGludCBvcmlnX25iX3N0cmVhbXMgPSBpYy0+bmJfc3RyZWFtczsKKworICAgICAgICBlcnIgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGljLCBvcHRzKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JpZ19uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHNbaV0pOworICAgICAgICBhdl9mcmVlcCgmb3B0cyk7CisKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiJXM6IGNvdWxkIG5vdCBmaW5kIGNvZGVjIHBhcmFtZXRlcnNcbiIsIGlzLT5maWxlbmFtZSk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpYy0+cGIpCisgICAgICAgIGljLT5wYi0+ZW9mX3JlYWNoZWQgPSAwOyAvLyBGSVhNRSBoYWNrLCBmZnBsYXkgbWF5YmUgc2hvdWxkIG5vdCB1c2UgYXZpb19mZW9mKCkgdG8gdGVzdCBmb3IgdGhlIGVuZAorCisgICAgaWYgKHNlZWtfYnlfYnl0ZXMgPCAwKQorICAgICAgICBzZWVrX2J5X2J5dGVzID0gISEoaWMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfVFNfRElTQ09OVCkgJiYgc3RyY21wKCJvZ2ciLCBpYy0+aWZvcm1hdC0+bmFtZSk7CisKKyAgICBpcy0+bWF4X2ZyYW1lX2R1cmF0aW9uID0gKGljLT5pZm9ybWF0LT5mbGFncyAmIEFWRk1UX1RTX0RJU0NPTlQpID8gMTAuMCA6IDM2MDAuMDsKKworICAgIGlmICghd2luZG93X3RpdGxlICYmICh0ID0gYXZfZGljdF9nZXQoaWMtPm1ldGFkYXRhLCAidGl0bGUiLCBOVUxMLCAwKSkpCisgICAgICAgIHdpbmRvd190aXRsZSA9IGF2X2FzcHJpbnRmKCIlcyAtICVzIiwgdC0+dmFsdWUsIGlucHV0X2ZpbGVuYW1lKTsKKworICAgIC8qIGlmIHNlZWtpbmcgcmVxdWVzdGVkLCB3ZSBleGVjdXRlIGl0ICovCisgICAgaWYgKHN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7CisKKyAgICAgICAgdGltZXN0YW1wID0gc3RhcnRfdGltZTsKKyAgICAgICAgLyogYWRkIHRoZSBzdHJlYW0gc3RhcnQgdGltZSAqLworICAgICAgICBpZiAoaWMtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICB0aW1lc3RhbXAgKz0gaWMtPnN0YXJ0X3RpbWU7CisgICAgICAgIHJldCA9IGF2Zm9ybWF0X3NlZWtfZmlsZShpYywgLTEsIElOVDY0X01JTiwgdGltZXN0YW1wLCBJTlQ2NF9NQVgsIDApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiJXM6IGNvdWxkIG5vdCBzZWVrIHRvIHBvc2l0aW9uICUwLjNmXG4iLAorICAgICAgICAgICAgICAgICAgICBpcy0+ZmlsZW5hbWUsIChkb3VibGUpdGltZXN0YW1wIC8gQVZfVElNRV9CQVNFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlzLT5yZWFsdGltZSA9IGlzX3JlYWx0aW1lKGljKTsKKworICAgIGlmIChzaG93X3N0YXR1cykKKyAgICAgICAgYXZfZHVtcF9mb3JtYXQoaWMsIDAsIGlzLT5maWxlbmFtZSwgMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBpYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlID0gc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlOworICAgICAgICBzdC0+ZGlzY2FyZCA9IEFWRElTQ0FSRF9BTEw7CisgICAgICAgIGlmICh0eXBlID49IDAgJiYgd2FudGVkX3N0cmVhbV9zcGVjW3R5cGVdICYmIHN0X2luZGV4W3R5cGVdID09IC0xKQorICAgICAgICAgICAgaWYgKGF2Zm9ybWF0X21hdGNoX3N0cmVhbV9zcGVjaWZpZXIoaWMsIHN0LCB3YW50ZWRfc3RyZWFtX3NwZWNbdHlwZV0pID4gMCkKKyAgICAgICAgICAgICAgICBzdF9pbmRleFt0eXBlXSA9IGk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBBVk1FRElBX1RZUEVfTkI7IGkrKykgeworICAgICAgICBpZiAod2FudGVkX3N0cmVhbV9zcGVjW2ldICYmIHN0X2luZGV4W2ldID09IC0xKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiU3RyZWFtIHNwZWNpZmllciAlcyBkb2VzIG5vdCBtYXRjaCBhbnkgJXMgc3RyZWFtXG4iLCB3YW50ZWRfc3RyZWFtX3NwZWNbaV0sIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhpKSk7CisgICAgICAgICAgICBzdF9pbmRleFtpXSA9IElOVF9NQVg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXZpZGVvX2Rpc2FibGUpCisgICAgICAgIHN0X2luZGV4W0FWTUVESUFfVFlQRV9WSURFT10gPQorICAgICAgICAgICAgYXZfZmluZF9iZXN0X3N0cmVhbShpYywgQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9pbmRleFtBVk1FRElBX1RZUEVfVklERU9dLCAtMSwgTlVMTCwgMCk7CisgICAgaWYgKCFhdWRpb19kaXNhYmxlKQorICAgICAgICBzdF9pbmRleFtBVk1FRElBX1RZUEVfQVVESU9dID0KKyAgICAgICAgICAgIGF2X2ZpbmRfYmVzdF9zdHJlYW0oaWMsIEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfaW5kZXhbQVZNRURJQV9UWVBFX0FVRElPXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfaW5kZXhbQVZNRURJQV9UWVBFX1ZJREVPXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7CisgICAgaWYgKCF2aWRlb19kaXNhYmxlICYmICFzdWJ0aXRsZV9kaXNhYmxlKQorICAgICAgICBzdF9pbmRleFtBVk1FRElBX1RZUEVfU1VCVElUTEVdID0KKyAgICAgICAgICAgIGF2X2ZpbmRfYmVzdF9zdHJlYW0oaWMsIEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RfaW5kZXhbQVZNRURJQV9UWVBFX1NVQlRJVExFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0X2luZGV4W0FWTUVESUFfVFlQRV9BVURJT10gPj0gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdF9pbmRleFtBVk1FRElBX1RZUEVfQVVESU9dIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0X2luZGV4W0FWTUVESUFfVFlQRV9WSURFT10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKKworICAgIGlzLT5zaG93X21vZGUgPSBzaG93X21vZGU7CisgICAgaWYgKHN0X2luZGV4W0FWTUVESUFfVFlQRV9WSURFT10gPj0gMCkgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBpYy0+c3RyZWFtc1tzdF9pbmRleFtBVk1FRElBX1RZUEVfVklERU9dXTsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmNvZGVjcGFyID0gc3QtPmNvZGVjcGFyOworICAgICAgICBBVlJhdGlvbmFsIHNhciA9IGF2X2d1ZXNzX3NhbXBsZV9hc3BlY3RfcmF0aW8oaWMsIHN0LCBOVUxMKTsKKyAgICAgICAgaWYgKGNvZGVjcGFyLT53aWR0aCkKKyAgICAgICAgICAgIHNldF9kZWZhdWx0X3dpbmRvd19zaXplKGNvZGVjcGFyLT53aWR0aCwgY29kZWNwYXItPmhlaWdodCwgc2FyKTsKKyAgICB9CisKKyAgICAvKiBvcGVuIHRoZSBzdHJlYW1zICovCisgICAgaWYgKHN0X2luZGV4W0FWTUVESUFfVFlQRV9BVURJT10gPj0gMCkgeworICAgICAgICBzdHJlYW1fY29tcG9uZW50X29wZW4oaXMsIHN0X2luZGV4W0FWTUVESUFfVFlQRV9BVURJT10pOworICAgIH0KKworICAgIHJldCA9IC0xOworICAgIGlmIChzdF9pbmRleFtBVk1FRElBX1RZUEVfVklERU9dID49IDApIHsKKyAgICAgICAgcmV0ID0gc3RyZWFtX2NvbXBvbmVudF9vcGVuKGlzLCBzdF9pbmRleFtBVk1FRElBX1RZUEVfVklERU9dKTsKKyAgICB9CisgICAgaWYgKGlzLT5zaG93X21vZGUgPT0gU0hPV19NT0RFX05PTkUpCisgICAgICAgIGlzLT5zaG93X21vZGUgPSByZXQgPj0gMCA/IFNIT1dfTU9ERV9WSURFTyA6IFNIT1dfTU9ERV9SREZUOworCisgICAgaWYgKHN0X2luZGV4W0FWTUVESUFfVFlQRV9TVUJUSVRMRV0gPj0gMCkgeworICAgICAgICBzdHJlYW1fY29tcG9uZW50X29wZW4oaXMsIHN0X2luZGV4W0FWTUVESUFfVFlQRV9TVUJUSVRMRV0pOworICAgIH0KKworICAgIGlmIChpcy0+dmlkZW9fc3RyZWFtIDwgMCAmJiBpcy0+YXVkaW9fc3RyZWFtIDwgMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnIG9yIGNvbmZpZ3VyZSBmaWx0ZXJncmFwaFxuIiwKKyAgICAgICAgICAgICAgIGlzLT5maWxlbmFtZSk7CisgICAgICAgIHJldCA9IC0xOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGluZmluaXRlX2J1ZmZlciA8IDAgJiYgaXMtPnJlYWx0aW1lKQorICAgICAgICBpbmZpbml0ZV9idWZmZXIgPSAxOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoaXMtPmFib3J0X3JlcXVlc3QpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGlzLT5wYXVzZWQgIT0gaXMtPmxhc3RfcGF1c2VkKSB7CisgICAgICAgICAgICBpcy0+bGFzdF9wYXVzZWQgPSBpcy0+cGF1c2VkOworICAgICAgICAgICAgaWYgKGlzLT5wYXVzZWQpCisgICAgICAgICAgICAgICAgaXMtPnJlYWRfcGF1c2VfcmV0dXJuID0gYXZfcmVhZF9wYXVzZShpYyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfcmVhZF9wbGF5KGljKTsKKyAgICAgICAgfQorI2lmIENPTkZJR19SVFNQX0RFTVVYRVIgfHwgQ09ORklHX01NU0hfUFJPVE9DT0wKKyAgICAgICAgaWYgKGlzLT5wYXVzZWQgJiYKKyAgICAgICAgICAgICAgICAoIXN0cmNtcChpYy0+aWZvcm1hdC0+bmFtZSwgInJ0c3AiKSB8fAorICAgICAgICAgICAgICAgICAoaWMtPnBiICYmICFzdHJuY21wKGlucHV0X2ZpbGVuYW1lLCAibW1zaDoiLCA1KSkpKSB7CisgICAgICAgICAgICAvKiB3YWl0IDEwIG1zIHRvIGF2b2lkIHRyeWluZyB0byBnZXQgYW5vdGhlciBwYWNrZXQgKi8KKyAgICAgICAgICAgIC8qIFhYWDogaG9ycmlibGUgKi8KKyAgICAgICAgICAgIFNETF9EZWxheSgxMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChpcy0+c2Vla19yZXEpIHsKKyAgICAgICAgICAgIGludDY0X3Qgc2Vla190YXJnZXQgPSBpcy0+c2Vla19wb3M7CisgICAgICAgICAgICBpbnQ2NF90IHNlZWtfbWluICAgID0gaXMtPnNlZWtfcmVsID4gMCA/IHNlZWtfdGFyZ2V0IC0gaXMtPnNlZWtfcmVsICsgMjogSU5UNjRfTUlOOworICAgICAgICAgICAgaW50NjRfdCBzZWVrX21heCAgICA9IGlzLT5zZWVrX3JlbCA8IDAgPyBzZWVrX3RhcmdldCAtIGlzLT5zZWVrX3JlbCAtIDI6IElOVDY0X01BWDsKKy8vIEZJWE1FIHRoZSArLTIgaXMgZHVlIHRvIHJvdW5kaW5nIGJlaW5nIG5vdCBkb25lIGluIHRoZSBjb3JyZWN0IGRpcmVjdGlvbiBpbiBnZW5lcmF0aW9uCisvLyAgICAgIG9mIHRoZSBzZWVrX3Bvcy9zZWVrX3JlbCB2YXJpYWJsZXMKKworICAgICAgICAgICAgcmV0ID0gYXZmb3JtYXRfc2Vla19maWxlKGlzLT5pYywgLTEsIHNlZWtfbWluLCBzZWVrX3RhcmdldCwgc2Vla19tYXgsIGlzLT5zZWVrX2ZsYWdzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBlcnJvciB3aGlsZSBzZWVraW5nXG4iLCBpcy0+aWMtPnVybCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpcy0+YXVkaW9fc3RyZWFtID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX2ZsdXNoKCZpcy0+YXVkaW9xKTsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX3B1dCgmaXMtPmF1ZGlvcSwgJmZsdXNoX3BrdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpcy0+c3VidGl0bGVfc3RyZWFtID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX2ZsdXNoKCZpcy0+c3VidGl0bGVxKTsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX3B1dCgmaXMtPnN1YnRpdGxlcSwgJmZsdXNoX3BrdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpcy0+dmlkZW9fc3RyZWFtID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX2ZsdXNoKCZpcy0+dmlkZW9xKTsKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX3B1dCgmaXMtPnZpZGVvcSwgJmZsdXNoX3BrdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpcy0+c2Vla19mbGFncyAmIEFWU0VFS19GTEFHX0JZVEUpIHsKKyAgICAgICAgICAgICAgICAgICBzZXRfY2xvY2soJmlzLT5leHRjbGssIE5BTiwgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICBzZXRfY2xvY2soJmlzLT5leHRjbGssIHNlZWtfdGFyZ2V0IC8gKGRvdWJsZSlBVl9USU1FX0JBU0UsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlzLT5zZWVrX3JlcSA9IDA7CisgICAgICAgICAgICBpcy0+cXVldWVfYXR0YWNobWVudHNfcmVxID0gMTsKKyAgICAgICAgICAgIGlzLT5lb2YgPSAwOworICAgICAgICAgICAgaWYgKGlzLT5wYXVzZWQpCisgICAgICAgICAgICAgICAgc3RlcF90b19uZXh0X2ZyYW1lKGlzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXMtPnF1ZXVlX2F0dGFjaG1lbnRzX3JlcSkgeworICAgICAgICAgICAgaWYgKGlzLT52aWRlb19zdCAmJiBpcy0+dmlkZW9fc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDKSB7CisgICAgICAgICAgICAgICAgQVZQYWNrZXQgY29weSA9IHsgMCB9OworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZfcGFja2V0X3JlZigmY29weSwgJmlzLT52aWRlb19zdC0+YXR0YWNoZWRfcGljKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX3B1dCgmaXMtPnZpZGVvcSwgJmNvcHkpOworICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXRfbnVsbHBhY2tldCgmaXMtPnZpZGVvcSwgaXMtPnZpZGVvX3N0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpcy0+cXVldWVfYXR0YWNobWVudHNfcmVxID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGlmIHRoZSBxdWV1ZSBhcmUgZnVsbCwgbm8gbmVlZCB0byByZWFkIG1vcmUgKi8KKyAgICAgICAgaWYgKGluZmluaXRlX2J1ZmZlcjwxICYmCisgICAgICAgICAgICAgIChpcy0+YXVkaW9xLnNpemUgKyBpcy0+dmlkZW9xLnNpemUgKyBpcy0+c3VidGl0bGVxLnNpemUgPiBNQVhfUVVFVUVfU0laRQorICAgICAgICAgICAgfHwgKHN0cmVhbV9oYXNfZW5vdWdoX3BhY2tldHMoaXMtPmF1ZGlvX3N0LCBpcy0+YXVkaW9fc3RyZWFtLCAmaXMtPmF1ZGlvcSkgJiYKKyAgICAgICAgICAgICAgICBzdHJlYW1faGFzX2Vub3VnaF9wYWNrZXRzKGlzLT52aWRlb19zdCwgaXMtPnZpZGVvX3N0cmVhbSwgJmlzLT52aWRlb3EpICYmCisgICAgICAgICAgICAgICAgc3RyZWFtX2hhc19lbm91Z2hfcGFja2V0cyhpcy0+c3VidGl0bGVfc3QsIGlzLT5zdWJ0aXRsZV9zdHJlYW0sICZpcy0+c3VidGl0bGVxKSkpKSB7CisgICAgICAgICAgICAvKiB3YWl0IDEwIG1zICovCisgICAgICAgICAgICBTRExfTG9ja011dGV4KHdhaXRfbXV0ZXgpOworICAgICAgICAgICAgU0RMX0NvbmRXYWl0VGltZW91dChpcy0+Y29udGludWVfcmVhZF90aHJlYWQsIHdhaXRfbXV0ZXgsIDEwKTsKKyAgICAgICAgICAgIFNETF9VbmxvY2tNdXRleCh3YWl0X211dGV4KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICghaXMtPnBhdXNlZCAmJgorICAgICAgICAgICAgKCFpcy0+YXVkaW9fc3QgfHwgKGlzLT5hdWRkZWMuZmluaXNoZWQgPT0gaXMtPmF1ZGlvcS5zZXJpYWwgJiYgZnJhbWVfcXVldWVfbmJfcmVtYWluaW5nKCZpcy0+c2FtcHEpID09IDApKSAmJgorICAgICAgICAgICAgKCFpcy0+dmlkZW9fc3QgfHwgKGlzLT52aWRkZWMuZmluaXNoZWQgPT0gaXMtPnZpZGVvcS5zZXJpYWwgJiYgZnJhbWVfcXVldWVfbmJfcmVtYWluaW5nKCZpcy0+cGljdHEpID09IDApKSkgeworICAgICAgICAgICAgaWYgKGxvb3AgIT0gMSAmJiAoIWxvb3AgfHwgLS1sb29wKSkgeworICAgICAgICAgICAgICAgIHN0cmVhbV9zZWVrKGlzLCBzdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFID8gc3RhcnRfdGltZSA6IDAsIDAsIDApOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdXRvZXhpdCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdl9yZWFkX2ZyYW1lKGljLCBwa3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKChyZXQgPT0gQVZFUlJPUl9FT0YgfHwgYXZpb19mZW9mKGljLT5wYikpICYmICFpcy0+ZW9mKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzLT52aWRlb19zdHJlYW0gPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgcGFja2V0X3F1ZXVlX3B1dF9udWxscGFja2V0KCZpcy0+dmlkZW9xLCBpcy0+dmlkZW9fc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAoaXMtPmF1ZGlvX3N0cmVhbSA+PSAwKQorICAgICAgICAgICAgICAgICAgICBwYWNrZXRfcXVldWVfcHV0X251bGxwYWNrZXQoJmlzLT5hdWRpb3EsIGlzLT5hdWRpb19zdHJlYW0pOworICAgICAgICAgICAgICAgIGlmIChpcy0+c3VidGl0bGVfc3RyZWFtID49IDApCisgICAgICAgICAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXRfbnVsbHBhY2tldCgmaXMtPnN1YnRpdGxlcSwgaXMtPnN1YnRpdGxlX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgaXMtPmVvZiA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaWMtPnBiICYmIGljLT5wYi0+ZXJyb3IpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBTRExfTG9ja011dGV4KHdhaXRfbXV0ZXgpOworICAgICAgICAgICAgU0RMX0NvbmRXYWl0VGltZW91dChpcy0+Y29udGludWVfcmVhZF90aHJlYWQsIHdhaXRfbXV0ZXgsIDEwKTsKKyAgICAgICAgICAgIFNETF9VbmxvY2tNdXRleCh3YWl0X211dGV4KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXMtPmVvZiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgLyogY2hlY2sgaWYgcGFja2V0IGlzIGluIHBsYXkgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHVzZXIsIHRoZW4gcXVldWUsIG90aGVyd2lzZSBkaXNjYXJkICovCisgICAgICAgIHN0cmVhbV9zdGFydF90aW1lID0gaWMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5zdGFydF90aW1lOworICAgICAgICBwa3RfdHMgPSBwa3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/IHBrdC0+ZHRzIDogcGt0LT5wdHM7CisgICAgICAgIHBrdF9pbl9wbGF5X3JhbmdlID0gZHVyYXRpb24gPT0gQVZfTk9QVFNfVkFMVUUgfHwKKyAgICAgICAgICAgICAgICAocGt0X3RzIC0gKHN0cmVhbV9zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFID8gc3RyZWFtX3N0YXJ0X3RpbWUgOiAwKSkgKgorICAgICAgICAgICAgICAgIGF2X3EyZChpYy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSkgLQorICAgICAgICAgICAgICAgIChkb3VibGUpKHN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgPyBzdGFydF90aW1lIDogMCkgLyAxMDAwMDAwCisgICAgICAgICAgICAgICAgPD0gKChkb3VibGUpZHVyYXRpb24gLyAxMDAwMDAwKTsKKyAgICAgICAgaWYgKHBrdC0+c3RyZWFtX2luZGV4ID09IGlzLT5hdWRpb19zdHJlYW0gJiYgcGt0X2luX3BsYXlfcmFuZ2UpIHsKKyAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXQoJmlzLT5hdWRpb3EsIHBrdCk7CisgICAgICAgIH0gZWxzZSBpZiAocGt0LT5zdHJlYW1faW5kZXggPT0gaXMtPnZpZGVvX3N0cmVhbSAmJiBwa3RfaW5fcGxheV9yYW5nZQorICAgICAgICAgICAgICAgICAgICYmICEoaXMtPnZpZGVvX3N0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykpIHsKKyAgICAgICAgICAgIHBhY2tldF9xdWV1ZV9wdXQoJmlzLT52aWRlb3EsIHBrdCk7CisgICAgICAgIH0gZWxzZSBpZiAocGt0LT5zdHJlYW1faW5kZXggPT0gaXMtPnN1YnRpdGxlX3N0cmVhbSAmJiBwa3RfaW5fcGxheV9yYW5nZSkgeworICAgICAgICAgICAgcGFja2V0X3F1ZXVlX3B1dCgmaXMtPnN1YnRpdGxlcSwgcGt0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gMDsKKyBmYWlsOgorICAgIGlmIChpYyAmJiAhaXMtPmljKQorICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmaWMpOworCisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIFNETF9FdmVudCBldmVudDsKKworICAgICAgICBldmVudC50eXBlID0gRkZfUVVJVF9FVkVOVDsKKyAgICAgICAgZXZlbnQudXNlci5kYXRhMSA9IGlzOworICAgICAgICBTRExfUHVzaEV2ZW50KCZldmVudCk7CisgICAgfQorICAgIFNETF9EZXN0cm95TXV0ZXgod2FpdF9tdXRleCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBWaWRlb1N0YXRlICpzdHJlYW1fb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgQVZJbnB1dEZvcm1hdCAqaWZvcm1hdCkKK3sKKyAgICBWaWRlb1N0YXRlICppczsKKworICAgIGlzID0gYXZfbWFsbG9jeihzaXplb2YoVmlkZW9TdGF0ZSkpOworICAgIGlmICghaXMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlzLT5maWxlbmFtZSA9IGF2X3N0cmR1cChmaWxlbmFtZSk7CisgICAgaWYgKCFpcy0+ZmlsZW5hbWUpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpcy0+aWZvcm1hdCA9IGlmb3JtYXQ7CisgICAgaXMtPnl0b3AgICAgPSAwOworICAgIGlzLT54bGVmdCAgID0gMDsKKworICAgIC8qIHN0YXJ0IHZpZGVvIGRpc3BsYXkgKi8KKyAgICBpZiAoZnJhbWVfcXVldWVfaW5pdCgmaXMtPnBpY3RxLCAmaXMtPnZpZGVvcSwgVklERU9fUElDVFVSRV9RVUVVRV9TSVpFLCAxKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoZnJhbWVfcXVldWVfaW5pdCgmaXMtPnN1YnBxLCAmaXMtPnN1YnRpdGxlcSwgU1VCUElDVFVSRV9RVUVVRV9TSVpFLCAwKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoZnJhbWVfcXVldWVfaW5pdCgmaXMtPnNhbXBxLCAmaXMtPmF1ZGlvcSwgU0FNUExFX1FVRVVFX1NJWkUsIDEpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKHBhY2tldF9xdWV1ZV9pbml0KCZpcy0+dmlkZW9xKSA8IDAgfHwKKyAgICAgICAgcGFja2V0X3F1ZXVlX2luaXQoJmlzLT5hdWRpb3EpIDwgMCB8fAorICAgICAgICBwYWNrZXRfcXVldWVfaW5pdCgmaXMtPnN1YnRpdGxlcSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoIShpcy0+Y29udGludWVfcmVhZF90aHJlYWQgPSBTRExfQ3JlYXRlQ29uZCgpKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU0RMX0NyZWF0ZUNvbmQoKTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGluaXRfY2xvY2soJmlzLT52aWRjbGssICZpcy0+dmlkZW9xLnNlcmlhbCk7CisgICAgaW5pdF9jbG9jaygmaXMtPmF1ZGNsaywgJmlzLT5hdWRpb3Euc2VyaWFsKTsKKyAgICBpbml0X2Nsb2NrKCZpcy0+ZXh0Y2xrLCAmaXMtPmV4dGNsay5zZXJpYWwpOworICAgIGlzLT5hdWRpb19jbG9ja19zZXJpYWwgPSAtMTsKKyAgICBpZiAoc3RhcnR1cF92b2x1bWUgPCAwKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICItdm9sdW1lPSVkIDwgMCwgc2V0dGluZyB0byAwXG4iLCBzdGFydHVwX3ZvbHVtZSk7CisgICAgaWYgKHN0YXJ0dXBfdm9sdW1lID4gMTAwKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICItdm9sdW1lPSVkID4gMTAwLCBzZXR0aW5nIHRvIDEwMFxuIiwgc3RhcnR1cF92b2x1bWUpOworICAgIHN0YXJ0dXBfdm9sdW1lID0gYXZfY2xpcChzdGFydHVwX3ZvbHVtZSwgMCwgMTAwKTsKKyAgICBzdGFydHVwX3ZvbHVtZSA9IGF2X2NsaXAoU0RMX01JWF9NQVhWT0xVTUUgKiBzdGFydHVwX3ZvbHVtZSAvIDEwMCwgMCwgU0RMX01JWF9NQVhWT0xVTUUpOworICAgIGlzLT5hdWRpb192b2x1bWUgPSBzdGFydHVwX3ZvbHVtZTsKKyAgICBpcy0+bXV0ZWQgPSAwOworICAgIGlzLT5hdl9zeW5jX3R5cGUgPSBhdl9zeW5jX3R5cGU7CisgICAgaXMtPnJlYWRfdGlkICAgICA9IFNETF9DcmVhdGVUaHJlYWQocmVhZF90aHJlYWQsICJyZWFkX3RocmVhZCIsIGlzKTsKKyAgICBpZiAoIWlzLT5yZWFkX3RpZCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiU0RMX0NyZWF0ZVRocmVhZCgpOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworZmFpbDoKKyAgICAgICAgc3RyZWFtX2Nsb3NlKGlzKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiBpczsKK30KKworc3RhdGljIHZvaWQgc3RyZWFtX2N5Y2xlX2NoYW5uZWwoVmlkZW9TdGF0ZSAqaXMsIGludCBjb2RlY190eXBlKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqaWMgPSBpcy0+aWM7CisgICAgaW50IHN0YXJ0X2luZGV4LCBzdHJlYW1faW5kZXg7CisgICAgaW50IG9sZF9pbmRleDsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZQcm9ncmFtICpwID0gTlVMTDsKKyAgICBpbnQgbmJfc3RyZWFtcyA9IGlzLT5pYy0+bmJfc3RyZWFtczsKKworICAgIGlmIChjb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBzdGFydF9pbmRleCA9IGlzLT5sYXN0X3ZpZGVvX3N0cmVhbTsKKyAgICAgICAgb2xkX2luZGV4ID0gaXMtPnZpZGVvX3N0cmVhbTsKKyAgICB9IGVsc2UgaWYgKGNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIHN0YXJ0X2luZGV4ID0gaXMtPmxhc3RfYXVkaW9fc3RyZWFtOworICAgICAgICBvbGRfaW5kZXggPSBpcy0+YXVkaW9fc3RyZWFtOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXJ0X2luZGV4ID0gaXMtPmxhc3Rfc3VidGl0bGVfc3RyZWFtOworICAgICAgICBvbGRfaW5kZXggPSBpcy0+c3VidGl0bGVfc3RyZWFtOworICAgIH0KKyAgICBzdHJlYW1faW5kZXggPSBzdGFydF9pbmRleDsKKworICAgIGlmIChjb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyAmJiBpcy0+dmlkZW9fc3RyZWFtICE9IC0xKSB7CisgICAgICAgIHAgPSBhdl9maW5kX3Byb2dyYW1fZnJvbV9zdHJlYW0oaWMsIE5VTEwsIGlzLT52aWRlb19zdHJlYW0pOworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgbmJfc3RyZWFtcyA9IHAtPm5iX3N0cmVhbV9pbmRleGVzOworICAgICAgICAgICAgZm9yIChzdGFydF9pbmRleCA9IDA7IHN0YXJ0X2luZGV4IDwgbmJfc3RyZWFtczsgc3RhcnRfaW5kZXgrKykKKyAgICAgICAgICAgICAgICBpZiAocC0+c3RyZWFtX2luZGV4W3N0YXJ0X2luZGV4XSA9PSBzdHJlYW1faW5kZXgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHN0YXJ0X2luZGV4ID09IG5iX3N0cmVhbXMpCisgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXggPSAtMTsKKyAgICAgICAgICAgIHN0cmVhbV9pbmRleCA9IHN0YXJ0X2luZGV4OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoKytzdHJlYW1faW5kZXggPj0gbmJfc3RyZWFtcykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmVhbV9pbmRleCA9IC0xOworICAgICAgICAgICAgICAgIGlzLT5sYXN0X3N1YnRpdGxlX3N0cmVhbSA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFydF9pbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzdHJlYW1faW5kZXggPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJlYW1faW5kZXggPT0gc3RhcnRfaW5kZXgpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHN0ID0gaXMtPmljLT5zdHJlYW1zW3AgPyBwLT5zdHJlYW1faW5kZXhbc3RyZWFtX2luZGV4XSA6IHN0cmVhbV9pbmRleF07CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gY29kZWNfdHlwZSkgeworICAgICAgICAgICAgLyogY2hlY2sgdGhhdCBwYXJhbWV0ZXJzIGFyZSBPSyAqLworICAgICAgICAgICAgc3dpdGNoIChjb2RlY190eXBlKSB7CisgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKKyAgICAgICAgICAgICAgICBnb3RvIHRoZV9lbmQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIHRoZV9lbmQ6CisgICAgaWYgKHAgJiYgc3RyZWFtX2luZGV4ICE9IC0xKQorICAgICAgICBzdHJlYW1faW5kZXggPSBwLT5zdHJlYW1faW5kZXhbc3RyZWFtX2luZGV4XTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJTd2l0Y2ggJXMgc3RyZWFtIGZyb20gIyVkIHRvICMlZFxuIiwKKyAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKGNvZGVjX3R5cGUpLAorICAgICAgICAgICBvbGRfaW5kZXgsCisgICAgICAgICAgIHN0cmVhbV9pbmRleCk7CisKKyAgICBzdHJlYW1fY29tcG9uZW50X2Nsb3NlKGlzLCBvbGRfaW5kZXgpOworICAgIHN0cmVhbV9jb21wb25lbnRfb3Blbihpcywgc3RyZWFtX2luZGV4KTsKK30KKworCitzdGF0aWMgdm9pZCB0b2dnbGVfZnVsbF9zY3JlZW4oVmlkZW9TdGF0ZSAqaXMpCit7CisgICAgaXNfZnVsbF9zY3JlZW4gPSAhaXNfZnVsbF9zY3JlZW47CisgICAgU0RMX1NldFdpbmRvd0Z1bGxzY3JlZW4od2luZG93LCBpc19mdWxsX3NjcmVlbiA/IFNETF9XSU5ET1dfRlVMTFNDUkVFTl9ERVNLVE9QIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRvZ2dsZV9hdWRpb19kaXNwbGF5KFZpZGVvU3RhdGUgKmlzKQoreworICAgIGludCBuZXh0ID0gaXMtPnNob3dfbW9kZTsKKyAgICBkbyB7CisgICAgICAgIG5leHQgPSAobmV4dCArIDEpICUgU0hPV19NT0RFX05COworICAgIH0gd2hpbGUgKG5leHQgIT0gaXMtPnNob3dfbW9kZSAmJiAobmV4dCA9PSBTSE9XX01PREVfVklERU8gJiYgIWlzLT52aWRlb19zdCB8fCBuZXh0ICE9IFNIT1dfTU9ERV9WSURFTyAmJiAhaXMtPmF1ZGlvX3N0KSk7CisgICAgaWYgKGlzLT5zaG93X21vZGUgIT0gbmV4dCkgeworICAgICAgICBpcy0+Zm9yY2VfcmVmcmVzaCA9IDE7CisgICAgICAgIGlzLT5zaG93X21vZGUgPSBuZXh0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgcmVmcmVzaF9sb29wX3dhaXRfZXZlbnQoVmlkZW9TdGF0ZSAqaXMsIFNETF9FdmVudCAqZXZlbnQpIHsKKyAgICBkb3VibGUgcmVtYWluaW5nX3RpbWUgPSAwLjA7CisgICAgU0RMX1B1bXBFdmVudHMoKTsKKyAgICB3aGlsZSAoIVNETF9QZWVwRXZlbnRzKGV2ZW50LCAxLCBTRExfR0VURVZFTlQsIFNETF9GSVJTVEVWRU5ULCBTRExfTEFTVEVWRU5UKSkgeworICAgICAgICBpZiAoIWN1cnNvcl9oaWRkZW4gJiYgYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gY3Vyc29yX2xhc3Rfc2hvd24gPiBDVVJTT1JfSElERV9ERUxBWSkgeworICAgICAgICAgICAgU0RMX1Nob3dDdXJzb3IoMCk7CisgICAgICAgICAgICBjdXJzb3JfaGlkZGVuID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVtYWluaW5nX3RpbWUgPiAwLjApCisgICAgICAgICAgICBhdl91c2xlZXAoKGludDY0X3QpKHJlbWFpbmluZ190aW1lICogMTAwMDAwMC4wKSk7CisgICAgICAgIHJlbWFpbmluZ190aW1lID0gUkVGUkVTSF9SQVRFOworICAgICAgICBpZiAoaXMtPnNob3dfbW9kZSAhPSBTSE9XX01PREVfTk9ORSAmJiAoIWlzLT5wYXVzZWQgfHwgaXMtPmZvcmNlX3JlZnJlc2gpKQorICAgICAgICAgICAgdmlkZW9fcmVmcmVzaChpcywgJnJlbWFpbmluZ190aW1lKTsKKyAgICAgICAgU0RMX1B1bXBFdmVudHMoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNlZWtfY2hhcHRlcihWaWRlb1N0YXRlICppcywgaW50IGluY3IpCit7CisgICAgaW50NjRfdCBwb3MgPSBnZXRfbWFzdGVyX2Nsb2NrKGlzKSAqIEFWX1RJTUVfQkFTRTsKKyAgICBpbnQgaTsKKworICAgIGlmICghaXMtPmljLT5uYl9jaGFwdGVycykKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogZmluZCB0aGUgY3VycmVudCBjaGFwdGVyICovCisgICAgZm9yIChpID0gMDsgaSA8IGlzLT5pYy0+bmJfY2hhcHRlcnM7IGkrKykgeworICAgICAgICBBVkNoYXB0ZXIgKmNoID0gaXMtPmljLT5jaGFwdGVyc1tpXTsKKyAgICAgICAgaWYgKGF2X2NvbXBhcmVfdHMocG9zLCBBVl9USU1FX0JBU0VfUSwgY2gtPnN0YXJ0LCBjaC0+dGltZV9iYXNlKSA8IDApIHsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaSArPSBpbmNyOworICAgIGkgPSBGRk1BWChpLCAwKTsKKyAgICBpZiAoaSA+PSBpcy0+aWMtPm5iX2NoYXB0ZXJzKQorICAgICAgICByZXR1cm47CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJTZWVraW5nIHRvIGNoYXB0ZXIgJWQuXG4iLCBpKTsKKyAgICBzdHJlYW1fc2VlayhpcywgYXZfcmVzY2FsZV9xKGlzLT5pYy0+Y2hhcHRlcnNbaV0tPnN0YXJ0LCBpcy0+aWMtPmNoYXB0ZXJzW2ldLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSksIDAsIDApOworfQorCisvKiBoYW5kbGUgYW4gZXZlbnQgc2VudCBieSB0aGUgR1VJICovCitzdGF0aWMgdm9pZCBldmVudF9sb29wKFZpZGVvU3RhdGUgKmN1cl9zdHJlYW0pCit7CisgICAgU0RMX0V2ZW50IGV2ZW50OworICAgIGRvdWJsZSBpbmNyLCBwb3MsIGZyYWM7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGRvdWJsZSB4OworICAgICAgICByZWZyZXNoX2xvb3Bfd2FpdF9ldmVudChjdXJfc3RyZWFtLCAmZXZlbnQpOworICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKyAgICAgICAgY2FzZSBTRExfS0VZRE9XTjoKKyAgICAgICAgICAgIGlmIChleGl0X29uX2tleWRvd24pIHsKKyAgICAgICAgICAgICAgICBkb19leGl0KGN1cl9zdHJlYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkua2V5c3ltLnN5bSkgeworICAgICAgICAgICAgY2FzZSBTRExLX0VTQ0FQRToKKyAgICAgICAgICAgIGNhc2UgU0RMS19xOgorICAgICAgICAgICAgICAgIGRvX2V4aXQoY3VyX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNETEtfZjoKKyAgICAgICAgICAgICAgICB0b2dnbGVfZnVsbF9zY3JlZW4oY3VyX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgY3VyX3N0cmVhbS0+Zm9yY2VfcmVmcmVzaCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNETEtfcDoKKyAgICAgICAgICAgIGNhc2UgU0RMS19TUEFDRToKKyAgICAgICAgICAgICAgICB0b2dnbGVfcGF1c2UoY3VyX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNETEtfbToKKyAgICAgICAgICAgICAgICB0b2dnbGVfbXV0ZShjdXJfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0RMS19LUF9NVUxUSVBMWToKKyAgICAgICAgICAgIGNhc2UgU0RMS18wOgorICAgICAgICAgICAgICAgIHVwZGF0ZV92b2x1bWUoY3VyX3N0cmVhbSwgMSwgU0RMX1ZPTFVNRV9TVEVQKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0RMS19LUF9ESVZJREU6CisgICAgICAgICAgICBjYXNlIFNETEtfOToKKyAgICAgICAgICAgICAgICB1cGRhdGVfdm9sdW1lKGN1cl9zdHJlYW0sIC0xLCBTRExfVk9MVU1FX1NURVApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRExLX3M6IC8vIFM6IFN0ZXAgdG8gbmV4dCBmcmFtZQorICAgICAgICAgICAgICAgIHN0ZXBfdG9fbmV4dF9mcmFtZShjdXJfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU0RMS19hOgorICAgICAgICAgICAgICAgIHN0cmVhbV9jeWNsZV9jaGFubmVsKGN1cl9zdHJlYW0sIEFWTUVESUFfVFlQRV9BVURJTyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNETEtfdjoKKyAgICAgICAgICAgICAgICBzdHJlYW1fY3ljbGVfY2hhbm5lbChjdXJfc3RyZWFtLCBBVk1FRElBX1RZUEVfVklERU8pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRExLX2M6CisgICAgICAgICAgICAgICAgc3RyZWFtX2N5Y2xlX2NoYW5uZWwoY3VyX3N0cmVhbSwgQVZNRURJQV9UWVBFX1ZJREVPKTsKKyAgICAgICAgICAgICAgICBzdHJlYW1fY3ljbGVfY2hhbm5lbChjdXJfc3RyZWFtLCBBVk1FRElBX1RZUEVfQVVESU8pOworICAgICAgICAgICAgICAgIHN0cmVhbV9jeWNsZV9jaGFubmVsKGN1cl9zdHJlYW0sIEFWTUVESUFfVFlQRV9TVUJUSVRMRSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNETEtfdDoKKyAgICAgICAgICAgICAgICBzdHJlYW1fY3ljbGVfY2hhbm5lbChjdXJfc3RyZWFtLCBBVk1FRElBX1RZUEVfU1VCVElUTEUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRExLX3c6CisjaWYgQ09ORklHX0FWRklMVEVSCisgICAgICAgICAgICAgICAgaWYgKGN1cl9zdHJlYW0tPnNob3dfbW9kZSA9PSBTSE9XX01PREVfVklERU8gJiYgY3VyX3N0cmVhbS0+dmZpbHRlcl9pZHggPCBuYl92ZmlsdGVycyAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCsrY3VyX3N0cmVhbS0+dmZpbHRlcl9pZHggPj0gbmJfdmZpbHRlcnMpCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfc3RyZWFtLT52ZmlsdGVyX2lkeCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyX3N0cmVhbS0+dmZpbHRlcl9pZHggPSAwOworICAgICAgICAgICAgICAgICAgICB0b2dnbGVfYXVkaW9fZGlzcGxheShjdXJfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIHRvZ2dsZV9hdWRpb19kaXNwbGF5KGN1cl9zdHJlYW0pOworI2VuZGlmCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNETEtfUEFHRVVQOgorICAgICAgICAgICAgICAgIGlmIChjdXJfc3RyZWFtLT5pYy0+bmJfY2hhcHRlcnMgPD0gMSkgeworICAgICAgICAgICAgICAgICAgICBpbmNyID0gNjAwLjA7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9fc2VlazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2Vla19jaGFwdGVyKGN1cl9zdHJlYW0sIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRExLX1BBR0VET1dOOgorICAgICAgICAgICAgICAgIGlmIChjdXJfc3RyZWFtLT5pYy0+bmJfY2hhcHRlcnMgPD0gMSkgeworICAgICAgICAgICAgICAgICAgICBpbmNyID0gLTYwMC4wOworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvX3NlZWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNlZWtfY2hhcHRlcihjdXJfc3RyZWFtLCAtMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNETEtfTEVGVDoKKyAgICAgICAgICAgICAgICBpbmNyID0gLTEwLjA7CisgICAgICAgICAgICAgICAgZ290byBkb19zZWVrOworICAgICAgICAgICAgY2FzZSBTRExLX1JJR0hUOgorICAgICAgICAgICAgICAgIGluY3IgPSAxMC4wOworICAgICAgICAgICAgICAgIGdvdG8gZG9fc2VlazsKKyAgICAgICAgICAgIGNhc2UgU0RMS19VUDoKKyAgICAgICAgICAgICAgICBpbmNyID0gNjAuMDsKKyAgICAgICAgICAgICAgICBnb3RvIGRvX3NlZWs7CisgICAgICAgICAgICBjYXNlIFNETEtfRE9XTjoKKyAgICAgICAgICAgICAgICBpbmNyID0gLTYwLjA7CisgICAgICAgICAgICBkb19zZWVrOgorICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla19ieV9ieXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgMCAmJiBjdXJfc3RyZWFtLT52aWRlb19zdHJlYW0gPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBmcmFtZV9xdWV1ZV9sYXN0X3BvcygmY3VyX3N0cmVhbS0+cGljdHEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IDAgJiYgY3VyX3N0cmVhbS0+YXVkaW9fc3RyZWFtID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gZnJhbWVfcXVldWVfbGFzdF9wb3MoJmN1cl9zdHJlYW0tPnNhbXBxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGF2aW9fdGVsbChjdXJfc3RyZWFtLT5pYy0+cGIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cl9zdHJlYW0tPmljLT5iaXRfcmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICo9IGN1cl9zdHJlYW0tPmljLT5iaXRfcmF0ZSAvIDguMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICo9IDE4MDAwMC4wOworICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fc2VlayhjdXJfc3RyZWFtLCBwb3MsIGluY3IsIDEpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcG9zID0gZ2V0X21hc3Rlcl9jbG9jayhjdXJfc3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc25hbihwb3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IChkb3VibGUpY3VyX3N0cmVhbS0+c2Vla19wb3MgLyBBVl9USU1FX0JBU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgKz0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfc3RyZWFtLT5pYy0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSAmJiBwb3MgPCBjdXJfc3RyZWFtLT5pYy0+c3RhcnRfdGltZSAvIChkb3VibGUpQVZfVElNRV9CQVNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGN1cl9zdHJlYW0tPmljLT5zdGFydF90aW1lIC8gKGRvdWJsZSlBVl9USU1FX0JBU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fc2VlayhjdXJfc3RyZWFtLCAoaW50NjRfdCkocG9zICogQVZfVElNRV9CQVNFKSwgKGludDY0X3QpKGluY3IgKiBBVl9USU1FX0JBU0UpLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNETF9NT1VTRUJVVFRPTkRPV046CisgICAgICAgICAgICBpZiAoZXhpdF9vbl9tb3VzZWRvd24pIHsKKyAgICAgICAgICAgICAgICBkb19leGl0KGN1cl9zdHJlYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbi5idXR0b24gPT0gU0RMX0JVVFRPTl9MRUZUKSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGludDY0X3QgbGFzdF9tb3VzZV9sZWZ0X2NsaWNrID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gbGFzdF9tb3VzZV9sZWZ0X2NsaWNrIDw9IDUwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICB0b2dnbGVfZnVsbF9zY3JlZW4oY3VyX3N0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGN1cl9zdHJlYW0tPmZvcmNlX3JlZnJlc2ggPSAxOworICAgICAgICAgICAgICAgICAgICBsYXN0X21vdXNlX2xlZnRfY2xpY2sgPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxhc3RfbW91c2VfbGVmdF9jbGljayA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgU0RMX01PVVNFTU9USU9OOgorICAgICAgICAgICAgaWYgKGN1cnNvcl9oaWRkZW4pIHsKKyAgICAgICAgICAgICAgICBTRExfU2hvd0N1cnNvcigxKTsKKyAgICAgICAgICAgICAgICBjdXJzb3JfaGlkZGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnNvcl9sYXN0X3Nob3duID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT0gU0RMX01PVVNFQlVUVE9ORE9XTikgeworICAgICAgICAgICAgICAgIGlmIChldmVudC5idXR0b24uYnV0dG9uICE9IFNETF9CVVRUT05fUklHSFQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHggPSBldmVudC5idXR0b24ueDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCEoZXZlbnQubW90aW9uLnN0YXRlICYgU0RMX0JVVFRPTl9STUFTSykpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHggPSBldmVudC5tb3Rpb24ueDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2Vla19ieV9ieXRlcyB8fCBjdXJfc3RyZWFtLT5pYy0+ZHVyYXRpb24gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzaXplID0gIGF2aW9fc2l6ZShjdXJfc3RyZWFtLT5pYy0+cGIpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1fc2VlayhjdXJfc3RyZWFtLCBzaXplKngvY3VyX3N0cmVhbS0+d2lkdGgsIDAsIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdHM7CisgICAgICAgICAgICAgICAgICAgIGludCBucywgaGgsIG1tLCBzczsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRucywgdGhoLCB0bW0sIHRzczsKKyAgICAgICAgICAgICAgICAgICAgdG5zICA9IGN1cl9zdHJlYW0tPmljLT5kdXJhdGlvbiAvIDEwMDAwMDBMTDsKKyAgICAgICAgICAgICAgICAgICAgdGhoICA9IHRucyAvIDM2MDA7CisgICAgICAgICAgICAgICAgICAgIHRtbSAgPSAodG5zICUgMzYwMCkgLyA2MDsKKyAgICAgICAgICAgICAgICAgICAgdHNzICA9ICh0bnMgJSA2MCk7CisgICAgICAgICAgICAgICAgICAgIGZyYWMgPSB4IC8gY3VyX3N0cmVhbS0+d2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG5zICAgPSBmcmFjICogdG5zOworICAgICAgICAgICAgICAgICAgICBoaCAgID0gbnMgLyAzNjAwOworICAgICAgICAgICAgICAgICAgICBtbSAgID0gKG5zICUgMzYwMCkgLyA2MDsKKyAgICAgICAgICAgICAgICAgICAgc3MgICA9IChucyAlIDYwKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlZWsgdG8gJTIuMGYlJSAoJTJkOiUwMmQ6JTAyZCkgb2YgdG90YWwgZHVyYXRpb24gKCUyZDolMDJkOiUwMmQpICAgICAgIFxuIiwgZnJhYyoxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGgsIG1tLCBzcywgdGhoLCB0bW0sIHRzcyk7CisgICAgICAgICAgICAgICAgICAgIHRzID0gZnJhYyAqIGN1cl9zdHJlYW0tPmljLT5kdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cl9zdHJlYW0tPmljLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgdHMgKz0gY3VyX3N0cmVhbS0+aWMtPnN0YXJ0X3RpbWU7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbV9zZWVrKGN1cl9zdHJlYW0sIHRzLCAwLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRExfV0lORE9XRVZFTlQ6CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LndpbmRvdy5ldmVudCkgeworICAgICAgICAgICAgICAgIGNhc2UgU0RMX1dJTkRPV0VWRU5UX1JFU0laRUQ6CisgICAgICAgICAgICAgICAgICAgIHNjcmVlbl93aWR0aCAgPSBjdXJfc3RyZWFtLT53aWR0aCAgPSBldmVudC53aW5kb3cuZGF0YTE7CisgICAgICAgICAgICAgICAgICAgIHNjcmVlbl9oZWlnaHQgPSBjdXJfc3RyZWFtLT5oZWlnaHQgPSBldmVudC53aW5kb3cuZGF0YTI7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfc3RyZWFtLT52aXNfdGV4dHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU0RMX0Rlc3Ryb3lUZXh0dXJlKGN1cl9zdHJlYW0tPnZpc190ZXh0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9zdHJlYW0tPnZpc190ZXh0dXJlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgU0RMX1dJTkRPV0VWRU5UX0VYUE9TRUQ6CisgICAgICAgICAgICAgICAgICAgIGN1cl9zdHJlYW0tPmZvcmNlX3JlZnJlc2ggPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU0RMX1FVSVQ6CisgICAgICAgIGNhc2UgRkZfUVVJVF9FVkVOVDoKKyAgICAgICAgICAgIGRvX2V4aXQoY3VyX3N0cmVhbSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IG9wdF9mcmFtZV9zaXplKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiT3B0aW9uIC1zIGlzIGRlcHJlY2F0ZWQsIHVzZSAtdmlkZW9fc2l6ZS5cbiIpOworICAgIHJldHVybiBvcHRfZGVmYXVsdChOVUxMLCAidmlkZW9fc2l6ZSIsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgb3B0X3dpZHRoKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgc2NyZWVuX3dpZHRoID0gcGFyc2VfbnVtYmVyX29yX2RpZShvcHQsIGFyZywgT1BUX0lOVDY0LCAxLCBJTlRfTUFYKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfaGVpZ2h0KHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgc2NyZWVuX2hlaWdodCA9IHBhcnNlX251bWJlcl9vcl9kaWUob3B0LCBhcmcsIE9QVF9JTlQ2NCwgMSwgSU5UX01BWCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2Zvcm1hdCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGZpbGVfaWZvcm1hdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KGFyZyk7CisgICAgaWYgKCFmaWxlX2lmb3JtYXQpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlVua25vd24gaW5wdXQgZm9ybWF0OiAlc1xuIiwgYXJnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2ZyYW1lX3BpeF9mbXQodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJPcHRpb24gLXBpeF9mbXQgaXMgZGVwcmVjYXRlZCwgdXNlIC1waXhlbF9mb3JtYXQuXG4iKTsKKyAgICByZXR1cm4gb3B0X2RlZmF1bHQoTlVMTCwgInBpeGVsX2Zvcm1hdCIsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgb3B0X3N5bmModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBpZiAoIXN0cmNtcChhcmcsICJhdWRpbyIpKQorICAgICAgICBhdl9zeW5jX3R5cGUgPSBBVl9TWU5DX0FVRElPX01BU1RFUjsKKyAgICBlbHNlIGlmICghc3RyY21wKGFyZywgInZpZGVvIikpCisgICAgICAgIGF2X3N5bmNfdHlwZSA9IEFWX1NZTkNfVklERU9fTUFTVEVSOworICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJnLCAiZXh0IikpCisgICAgICAgIGF2X3N5bmNfdHlwZSA9IEFWX1NZTkNfRVhURVJOQUxfQ0xPQ0s7CisgICAgZWxzZSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIHZhbHVlIGZvciAlczogJXNcbiIsIG9wdCwgYXJnKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3B0X3NlZWsodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBzdGFydF90aW1lID0gcGFyc2VfdGltZV9vcl9kaWUob3B0LCBhcmcsIDEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdF9kdXJhdGlvbih2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGR1cmF0aW9uID0gcGFyc2VfdGltZV9vcl9kaWUob3B0LCBhcmcsIDEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wdF9zaG93X21vZGUodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBzaG93X21vZGUgPSAhc3RyY21wKGFyZywgInZpZGVvIikgPyBTSE9XX01PREVfVklERU8gOgorICAgICAgICAgICAgICAgICFzdHJjbXAoYXJnLCAid2F2ZXMiKSA/IFNIT1dfTU9ERV9XQVZFUyA6CisgICAgICAgICAgICAgICAgIXN0cmNtcChhcmcsICJyZGZ0IiApID8gU0hPV19NT0RFX1JERlQgIDoKKyAgICAgICAgICAgICAgICBwYXJzZV9udW1iZXJfb3JfZGllKG9wdCwgYXJnLCBPUFRfSU5ULCAwLCBTSE9XX01PREVfTkItMSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9wdF9pbnB1dF9maWxlKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgaWYgKGlucHV0X2ZpbGVuYW1lKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsCisgICAgICAgICAgICAgICAiQXJndW1lbnQgJyVzJyBwcm92aWRlZCBhcyBpbnB1dCBmaWxlbmFtZSwgYnV0ICclcycgd2FzIGFscmVhZHkgc3BlY2lmaWVkLlxuIiwKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSwgaW5wdXRfZmlsZW5hbWUpOworICAgICAgICBleGl0KDEpOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChmaWxlbmFtZSwgIi0iKSkKKyAgICAgICAgZmlsZW5hbWUgPSAicGlwZToiOworICAgIGlucHV0X2ZpbGVuYW1lID0gZmlsZW5hbWU7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2NvZGVjKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICBjb25zdCBjaGFyICpzcGVjID0gc3RyY2hyKG9wdCwgJzonKTsKKyAgIGlmICghc3BlYykgeworICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICJObyBtZWRpYSBzcGVjaWZpZXIgd2FzIHNwZWNpZmllZCBpbiAnJXMnIGluIG9wdGlvbiAnJXMnXG4iLAorICAgICAgICAgICAgICAgYXJnLCBvcHQpOworICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICB9CisgICBzcGVjKys7CisgICBzd2l0Y2ggKHNwZWNbMF0pIHsKKyAgIGNhc2UgJ2EnIDogICAgYXVkaW9fY29kZWNfbmFtZSA9IGFyZzsgYnJlYWs7CisgICBjYXNlICdzJyA6IHN1YnRpdGxlX2NvZGVjX25hbWUgPSBhcmc7IGJyZWFrOworICAgY2FzZSAndicgOiAgICB2aWRlb19jb2RlY19uYW1lID0gYXJnOyBicmVhazsKKyAgIGRlZmF1bHQ6CisgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgIkludmFsaWQgbWVkaWEgc3BlY2lmaWVyICclcycgaW4gb3B0aW9uICclcydcbiIsIHNwZWMsIG9wdCk7CisgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgIH0KKyAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bW15OworCitzdGF0aWMgY29uc3QgT3B0aW9uRGVmIG9wdGlvbnNbXSA9IHsKKyAgICBDTURVVElMU19DT01NT05fT1BUSU9OUworICAgIHsgIngiLCBIQVNfQVJHLCB7IC5mdW5jX2FyZyA9IG9wdF93aWR0aCB9LCAiZm9yY2UgZGlzcGxheWVkIHdpZHRoIiwgIndpZHRoIiB9LAorICAgIHsgInkiLCBIQVNfQVJHLCB7IC5mdW5jX2FyZyA9IG9wdF9oZWlnaHQgfSwgImZvcmNlIGRpc3BsYXllZCBoZWlnaHQiLCAiaGVpZ2h0IiB9LAorICAgIHsgInMiLCBIQVNfQVJHIHwgT1BUX1ZJREVPLCB7IC5mdW5jX2FyZyA9IG9wdF9mcmFtZV9zaXplIH0sICJzZXQgZnJhbWUgc2l6ZSAoV3hIIG9yIGFiYnJldmlhdGlvbikiLCAic2l6ZSIgfSwKKyAgICB7ICJmcyIsIE9QVF9CT09MLCB7ICZpc19mdWxsX3NjcmVlbiB9LCAiZm9yY2UgZnVsbCBzY3JlZW4iIH0sCisgICAgeyAiYW4iLCBPUFRfQk9PTCwgeyAmYXVkaW9fZGlzYWJsZSB9LCAiZGlzYWJsZSBhdWRpbyIgfSwKKyAgICB7ICJ2biIsIE9QVF9CT09MLCB7ICZ2aWRlb19kaXNhYmxlIH0sICJkaXNhYmxlIHZpZGVvIiB9LAorICAgIHsgInNuIiwgT1BUX0JPT0wsIHsgJnN1YnRpdGxlX2Rpc2FibGUgfSwgImRpc2FibGUgc3VidGl0bGluZyIgfSwKKyAgICB7ICJhc3QiLCBPUFRfU1RSSU5HIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsIHsgJndhbnRlZF9zdHJlYW1fc3BlY1tBVk1FRElBX1RZUEVfQVVESU9dIH0sICJzZWxlY3QgZGVzaXJlZCBhdWRpbyBzdHJlYW0iLCAic3RyZWFtX3NwZWNpZmllciIgfSwKKyAgICB7ICJ2c3QiLCBPUFRfU1RSSU5HIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsIHsgJndhbnRlZF9zdHJlYW1fc3BlY1tBVk1FRElBX1RZUEVfVklERU9dIH0sICJzZWxlY3QgZGVzaXJlZCB2aWRlbyBzdHJlYW0iLCAic3RyZWFtX3NwZWNpZmllciIgfSwKKyAgICB7ICJzc3QiLCBPUFRfU1RSSU5HIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsIHsgJndhbnRlZF9zdHJlYW1fc3BlY1tBVk1FRElBX1RZUEVfU1VCVElUTEVdIH0sICJzZWxlY3QgZGVzaXJlZCBzdWJ0aXRsZSBzdHJlYW0iLCAic3RyZWFtX3NwZWNpZmllciIgfSwKKyAgICB7ICJzcyIsIEhBU19BUkcsIHsgLmZ1bmNfYXJnID0gb3B0X3NlZWsgfSwgInNlZWsgdG8gYSBnaXZlbiBwb3NpdGlvbiBpbiBzZWNvbmRzIiwgInBvcyIgfSwKKyAgICB7ICJ0IiwgSEFTX0FSRywgeyAuZnVuY19hcmcgPSBvcHRfZHVyYXRpb24gfSwgInBsYXkgIFwiZHVyYXRpb25cIiBzZWNvbmRzIG9mIGF1ZGlvL3ZpZGVvIiwgImR1cmF0aW9uIiB9LAorICAgIHsgImJ5dGVzIiwgT1BUX0lOVCB8IEhBU19BUkcsIHsgJnNlZWtfYnlfYnl0ZXMgfSwgInNlZWsgYnkgYnl0ZXMgMD1vZmYgMT1vbiAtMT1hdXRvIiwgInZhbCIgfSwKKyAgICB7ICJub2Rpc3AiLCBPUFRfQk9PTCwgeyAmZGlzcGxheV9kaXNhYmxlIH0sICJkaXNhYmxlIGdyYXBoaWNhbCBkaXNwbGF5IiB9LAorICAgIHsgIm5vYm9yZGVyIiwgT1BUX0JPT0wsIHsgJmJvcmRlcmxlc3MgfSwgImJvcmRlcmxlc3Mgd2luZG93IiB9LAorICAgIHsgInZvbHVtZSIsIE9QVF9JTlQgfCBIQVNfQVJHLCB7ICZzdGFydHVwX3ZvbHVtZX0sICJzZXQgc3RhcnR1cCB2b2x1bWUgMD1taW4gMTAwPW1heCIsICJ2b2x1bWUiIH0sCisgICAgeyAiZiIsIEhBU19BUkcsIHsgLmZ1bmNfYXJnID0gb3B0X2Zvcm1hdCB9LCAiZm9yY2UgZm9ybWF0IiwgImZtdCIgfSwKKyAgICB7ICJwaXhfZm10IiwgSEFTX0FSRyB8IE9QVF9FWFBFUlQgfCBPUFRfVklERU8sIHsgLmZ1bmNfYXJnID0gb3B0X2ZyYW1lX3BpeF9mbXQgfSwgInNldCBwaXhlbCBmb3JtYXQiLCAiZm9ybWF0IiB9LAorICAgIHsgInN0YXRzIiwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCB7ICZzaG93X3N0YXR1cyB9LCAic2hvdyBzdGF0dXMiLCAiIiB9LAorICAgIHsgImZhc3QiLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsIHsgJmZhc3QgfSwgIm5vbiBzcGVjIGNvbXBsaWFudCBvcHRpbWl6YXRpb25zIiwgIiIgfSwKKyAgICB7ICJnZW5wdHMiLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsIHsgJmdlbnB0cyB9LCAiZ2VuZXJhdGUgcHRzIiwgIiIgfSwKKyAgICB7ICJkcnAiLCBPUFRfSU5UIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsIHsgJmRlY29kZXJfcmVvcmRlcl9wdHMgfSwgImxldCBkZWNvZGVyIHJlb3JkZXIgcHRzIDA9b2ZmIDE9b24gLTE9YXV0byIsICIifSwKKyAgICB7ICJsb3dyZXMiLCBPUFRfSU5UIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsIHsgJmxvd3JlcyB9LCAiIiwgIiIgfSwKKyAgICB7ICJzeW5jIiwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsIHsgLmZ1bmNfYXJnID0gb3B0X3N5bmMgfSwgInNldCBhdWRpby12aWRlbyBzeW5jLiB0eXBlICh0eXBlPWF1ZGlvL3ZpZGVvL2V4dCkiLCAidHlwZSIgfSwKKyAgICB7ICJhdXRvZXhpdCIsIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgeyAmYXV0b2V4aXQgfSwgImV4aXQgYXQgdGhlIGVuZCIsICIiIH0sCisgICAgeyAiZXhpdG9ua2V5ZG93biIsIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgeyAmZXhpdF9vbl9rZXlkb3duIH0sICJleGl0IG9uIGtleSBkb3duIiwgIiIgfSwKKyAgICB7ICJleGl0b25tb3VzZWRvd24iLCBPUFRfQk9PTCB8IE9QVF9FWFBFUlQsIHsgJmV4aXRfb25fbW91c2Vkb3duIH0sICJleGl0IG9uIG1vdXNlIGRvd24iLCAiIiB9LAorICAgIHsgImxvb3AiLCBPUFRfSU5UIHwgSEFTX0FSRyB8IE9QVF9FWFBFUlQsIHsgJmxvb3AgfSwgInNldCBudW1iZXIgb2YgdGltZXMgdGhlIHBsYXliYWNrIHNoYWxsIGJlIGxvb3BlZCIsICJsb29wIGNvdW50IiB9LAorICAgIHsgImZyYW1lZHJvcCIsIE9QVF9CT09MIHwgT1BUX0VYUEVSVCwgeyAmZnJhbWVkcm9wIH0sICJkcm9wIGZyYW1lcyB3aGVuIGNwdSBpcyB0b28gc2xvdyIsICIiIH0sCisgICAgeyAiaW5mYnVmIiwgT1BUX0JPT0wgfCBPUFRfRVhQRVJULCB7ICZpbmZpbml0ZV9idWZmZXIgfSwgImRvbid0IGxpbWl0IHRoZSBpbnB1dCBidWZmZXIgc2l6ZSAodXNlZnVsIHdpdGggcmVhbHRpbWUgc3RyZWFtcykiLCAiIiB9LAorICAgIHsgIndpbmRvd190aXRsZSIsIE9QVF9TVFJJTkcgfCBIQVNfQVJHLCB7ICZ3aW5kb3dfdGl0bGUgfSwgInNldCB3aW5kb3cgdGl0bGUiLCAid2luZG93IHRpdGxlIiB9LAorI2lmIENPTkZJR19BVkZJTFRFUgorICAgIHsgInZmIiwgT1BUX0VYUEVSVCB8IEhBU19BUkcsIHsgLmZ1bmNfYXJnID0gb3B0X2FkZF92ZmlsdGVyIH0sICJzZXQgdmlkZW8gZmlsdGVycyIsICJmaWx0ZXJfZ3JhcGgiIH0sCisgICAgeyAiYWYiLCBPUFRfU1RSSU5HIHwgSEFTX0FSRywgeyAmYWZpbHRlcnMgfSwgInNldCBhdWRpbyBmaWx0ZXJzIiwgImZpbHRlcl9ncmFwaCIgfSwKKyNlbmRpZgorICAgIHsgInJkZnRzcGVlZCIsIE9QVF9JTlQgfCBIQVNfQVJHfCBPUFRfQVVESU8gfCBPUFRfRVhQRVJULCB7ICZyZGZ0c3BlZWQgfSwgInJkZnQgc3BlZWQiLCAibXNlY3MiIH0sCisgICAgeyAic2hvd21vZGUiLCBIQVNfQVJHLCB7IC5mdW5jX2FyZyA9IG9wdF9zaG93X21vZGV9LCAic2VsZWN0IHNob3cgbW9kZSAoMCA9IHZpZGVvLCAxID0gd2F2ZXMsIDIgPSBSREZUKSIsICJtb2RlIiB9LAorICAgIHsgImRlZmF1bHQiLCBIQVNfQVJHIHwgT1BUX0FVRElPIHwgT1BUX1ZJREVPIHwgT1BUX0VYUEVSVCwgeyAuZnVuY19hcmcgPSBvcHRfZGVmYXVsdCB9LCAiZ2VuZXJpYyBjYXRjaCBhbGwgb3B0aW9uIiwgIiIgfSwKKyAgICB7ICJpIiwgT1BUX0JPT0wsIHsgJmR1bW15fSwgInJlYWQgc3BlY2lmaWVkIGZpbGUiLCAiaW5wdXRfZmlsZSJ9LAorICAgIHsgImNvZGVjIiwgSEFTX0FSRywgeyAuZnVuY19hcmcgPSBvcHRfY29kZWN9LCAiZm9yY2UgZGVjb2RlciIsICJkZWNvZGVyX25hbWUiIH0sCisgICAgeyAiYWNvZGVjIiwgSEFTX0FSRyB8IE9QVF9TVFJJTkcgfCBPUFRfRVhQRVJULCB7ICAgICZhdWRpb19jb2RlY19uYW1lIH0sICJmb3JjZSBhdWRpbyBkZWNvZGVyIiwgICAgImRlY29kZXJfbmFtZSIgfSwKKyAgICB7ICJzY29kZWMiLCBIQVNfQVJHIHwgT1BUX1NUUklORyB8IE9QVF9FWFBFUlQsIHsgJnN1YnRpdGxlX2NvZGVjX25hbWUgfSwgImZvcmNlIHN1YnRpdGxlIGRlY29kZXIiLCAiZGVjb2Rlcl9uYW1lIiB9LAorICAgIHsgInZjb2RlYyIsIEhBU19BUkcgfCBPUFRfU1RSSU5HIHwgT1BUX0VYUEVSVCwgeyAgICAmdmlkZW9fY29kZWNfbmFtZSB9LCAiZm9yY2UgdmlkZW8gZGVjb2RlciIsICAgICJkZWNvZGVyX25hbWUiIH0sCisgICAgeyAiYXV0b3JvdGF0ZSIsIE9QVF9CT09MLCB7ICZhdXRvcm90YXRlIH0sICJhdXRvbWF0aWNhbGx5IHJvdGF0ZSB2aWRlbyIsICIiIH0sCisgICAgeyAiZmluZF9zdHJlYW1faW5mbyIsIE9QVF9CT09MIHwgT1BUX0lOUFVUIHwgT1BUX0VYUEVSVCwgeyAmZmluZF9zdHJlYW1faW5mbyB9LAorICAgICAgICAicmVhZCBhbmQgZGVjb2RlIHRoZSBzdHJlYW1zIHRvIGZpbGwgbWlzc2luZyBpbmZvcm1hdGlvbiB3aXRoIGhldXJpc3RpY3MiIH0sCisgICAgeyBOVUxMLCB9LAorfTsKKworc3RhdGljIHZvaWQgc2hvd191c2FnZSh2b2lkKQoreworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlNpbXBsZSBtZWRpYSBwbGF5ZXJcbiIpOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInVzYWdlOiAlcyBbb3B0aW9uc10gaW5wdXRfZmlsZVxuIiwgcHJvZ3JhbV9uYW1lKTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJcbiIpOworfQorCit2b2lkIHNob3dfaGVscF9kZWZhdWx0KGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGF2X2xvZ19zZXRfY2FsbGJhY2sobG9nX2NhbGxiYWNrX2hlbHApOworICAgIHNob3dfdXNhZ2UoKTsKKyAgICBzaG93X2hlbHBfb3B0aW9ucyhvcHRpb25zLCAiTWFpbiBvcHRpb25zOiIsIDAsIE9QVF9FWFBFUlQsIDApOworICAgIHNob3dfaGVscF9vcHRpb25zKG9wdGlvbnMsICJBZHZhbmNlZCBvcHRpb25zOiIsIE9QVF9FWFBFUlQsIDAsIDApOworICAgIHByaW50ZigiXG4iKTsKKyAgICBzaG93X2hlbHBfY2hpbGRyZW4oYXZjb2RlY19nZXRfY2xhc3MoKSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0pOworICAgIHNob3dfaGVscF9jaGlsZHJlbihhdmZvcm1hdF9nZXRfY2xhc3MoKSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0pOworI2lmICFDT05GSUdfQVZGSUxURVIKKyAgICBzaG93X2hlbHBfY2hpbGRyZW4oc3dzX2dldF9jbGFzcygpLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSk7CisjZWxzZQorICAgIHNob3dfaGVscF9jaGlsZHJlbihhdmZpbHRlcl9nZXRfY2xhc3MoKSwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNKTsKKyNlbmRpZgorICAgIHByaW50ZigiXG5XaGlsZSBwbGF5aW5nOlxuIgorICAgICAgICAgICAicSwgRVNDICAgICAgICAgICAgICBxdWl0XG4iCisgICAgICAgICAgICJmICAgICAgICAgICAgICAgICAgIHRvZ2dsZSBmdWxsIHNjcmVlblxuIgorICAgICAgICAgICAicCwgU1BDICAgICAgICAgICAgICBwYXVzZVxuIgorICAgICAgICAgICAibSAgICAgICAgICAgICAgICAgICB0b2dnbGUgbXV0ZVxuIgorICAgICAgICAgICAiOSwgMCAgICAgICAgICAgICAgICBkZWNyZWFzZSBhbmQgaW5jcmVhc2Ugdm9sdW1lIHJlc3BlY3RpdmVseVxuIgorICAgICAgICAgICAiLywgKiAgICAgICAgICAgICAgICBkZWNyZWFzZSBhbmQgaW5jcmVhc2Ugdm9sdW1lIHJlc3BlY3RpdmVseVxuIgorICAgICAgICAgICAiYSAgICAgICAgICAgICAgICAgICBjeWNsZSBhdWRpbyBjaGFubmVsIGluIHRoZSBjdXJyZW50IHByb2dyYW1cbiIKKyAgICAgICAgICAgInYgICAgICAgICAgICAgICAgICAgY3ljbGUgdmlkZW8gY2hhbm5lbFxuIgorICAgICAgICAgICAidCAgICAgICAgICAgICAgICAgICBjeWNsZSBzdWJ0aXRsZSBjaGFubmVsIGluIHRoZSBjdXJyZW50IHByb2dyYW1cbiIKKyAgICAgICAgICAgImMgICAgICAgICAgICAgICAgICAgY3ljbGUgcHJvZ3JhbVxuIgorICAgICAgICAgICAidyAgICAgICAgICAgICAgICAgICBjeWNsZSB2aWRlbyBmaWx0ZXJzIG9yIHNob3cgbW9kZXNcbiIKKyAgICAgICAgICAgInMgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUgZnJhbWUtc3RlcCBtb2RlXG4iCisgICAgICAgICAgICJsZWZ0L3JpZ2h0ICAgICAgICAgIHNlZWsgYmFja3dhcmQvZm9yd2FyZCAxMCBzZWNvbmRzXG4iCisgICAgICAgICAgICJkb3duL3VwICAgICAgICAgICAgIHNlZWsgYmFja3dhcmQvZm9yd2FyZCAxIG1pbnV0ZVxuIgorICAgICAgICAgICAicGFnZSBkb3duL3BhZ2UgdXAgICBzZWVrIGJhY2t3YXJkL2ZvcndhcmQgMTAgbWludXRlc1xuIgorICAgICAgICAgICAicmlnaHQgbW91c2UgY2xpY2sgICBzZWVrIHRvIHBlcmNlbnRhZ2UgaW4gZmlsZSBjb3JyZXNwb25kaW5nIHRvIGZyYWN0aW9uIG9mIHdpZHRoXG4iCisgICAgICAgICAgICJsZWZ0IGRvdWJsZS1jbGljayAgIHRvZ2dsZSBmdWxsIHNjcmVlblxuIgorICAgICAgICAgICApOworfQorCisvKiBDYWxsZWQgZnJvbSB0aGUgbWFpbiAqLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBmbGFnczsKKyAgICBWaWRlb1N0YXRlICppczsKKworICAgIGluaXRfZHlubG9hZCgpOworCisgICAgYXZfbG9nX3NldF9mbGFncyhBVl9MT0dfU0tJUF9SRVBFQVRFRCk7CisgICAgcGFyc2VfbG9nbGV2ZWwoYXJnYywgYXJndiwgb3B0aW9ucyk7CisKKyAgICAvKiByZWdpc3RlciBhbGwgY29kZWNzLCBkZW11eCBhbmQgcHJvdG9jb2xzICovCisjaWYgQ09ORklHX0FWREVWSUNFCisgICAgYXZkZXZpY2VfcmVnaXN0ZXJfYWxsKCk7CisjZW5kaWYKKyAgICBhdmZvcm1hdF9uZXR3b3JrX2luaXQoKTsKKworICAgIGluaXRfb3B0cygpOworCisgICAgc2lnbmFsKFNJR0lOVCAsIHNpZ3Rlcm1faGFuZGxlcik7IC8qIEludGVycnVwdCAoQU5TSSkuICAgICovCisgICAgc2lnbmFsKFNJR1RFUk0sIHNpZ3Rlcm1faGFuZGxlcik7IC8qIFRlcm1pbmF0aW9uIChBTlNJKS4gICovCisKKyAgICBzaG93X2Jhbm5lcihhcmdjLCBhcmd2LCBvcHRpb25zKTsKKworICAgIHBhcnNlX29wdGlvbnMoTlVMTCwgYXJnYywgYXJndiwgb3B0aW9ucywgb3B0X2lucHV0X2ZpbGUpOworCisgICAgaWYgKCFpbnB1dF9maWxlbmFtZSkgeworICAgICAgICBzaG93X3VzYWdlKCk7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJBbiBpbnB1dCBmaWxlIG11c3QgYmUgc3BlY2lmaWVkXG4iKTsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwKKyAgICAgICAgICAgICAgICJVc2UgLWggdG8gZ2V0IGZ1bGwgaGVscCBvciwgZXZlbiBiZXR0ZXIsIHJ1biAnbWFuICVzJ1xuIiwgcHJvZ3JhbV9uYW1lKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBpZiAoZGlzcGxheV9kaXNhYmxlKSB7CisgICAgICAgIHZpZGVvX2Rpc2FibGUgPSAxOworICAgIH0KKyAgICBmbGFncyA9IFNETF9JTklUX1ZJREVPIHwgU0RMX0lOSVRfQVVESU8gfCBTRExfSU5JVF9USU1FUjsKKyAgICBpZiAoYXVkaW9fZGlzYWJsZSkKKyAgICAgICAgZmxhZ3MgJj0gflNETF9JTklUX0FVRElPOworICAgIGVsc2UgeworICAgICAgICAvKiBUcnkgdG8gd29yayBhcm91bmQgYW4gb2NjYXNpb25hbCBBTFNBIGJ1ZmZlciB1bmRlcmZsb3cgaXNzdWUgd2hlbiB0aGUKKyAgICAgICAgICogcGVyaW9kIHNpemUgaXMgTlBPVCBkdWUgdG8gQUxTQSByZXNhbXBsaW5nIGJ5IGZvcmNpbmcgdGhlIGJ1ZmZlciBzaXplLiAqLworICAgICAgICBpZiAoIVNETF9nZXRlbnYoIlNETF9BVURJT19BTFNBX1NFVF9CVUZGRVJfU0laRSIpKQorICAgICAgICAgICAgU0RMX3NldGVudigiU0RMX0FVRElPX0FMU0FfU0VUX0JVRkZFUl9TSVpFIiwiMSIsIDEpOworICAgIH0KKyAgICBpZiAoZGlzcGxheV9kaXNhYmxlKQorICAgICAgICBmbGFncyAmPSB+U0RMX0lOSVRfVklERU87CisgICAgaWYgKFNETF9Jbml0IChmbGFncykpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkNvdWxkIG5vdCBpbml0aWFsaXplIFNETCAtICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICIoRGlkIHlvdSBzZXQgdGhlIERJU1BMQVkgdmFyaWFibGU/KVxuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgU0RMX0V2ZW50U3RhdGUoU0RMX1NZU1dNRVZFTlQsIFNETF9JR05PUkUpOworICAgIFNETF9FdmVudFN0YXRlKFNETF9VU0VSRVZFTlQsIFNETF9JR05PUkUpOworCisgICAgYXZfaW5pdF9wYWNrZXQoJmZsdXNoX3BrdCk7CisgICAgZmx1c2hfcGt0LmRhdGEgPSAodWludDhfdCAqKSZmbHVzaF9wa3Q7CisKKyAgICBpZiAoIWRpc3BsYXlfZGlzYWJsZSkgeworICAgICAgICBpbnQgZmxhZ3MgPSBTRExfV0lORE9XX0hJRERFTjsKKyAgICAgICAgaWYgKGJvcmRlcmxlc3MpCisgICAgICAgICAgICBmbGFncyB8PSBTRExfV0lORE9XX0JPUkRFUkxFU1M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZsYWdzIHw9IFNETF9XSU5ET1dfUkVTSVpBQkxFOworICAgICAgICB3aW5kb3cgPSBTRExfQ3JlYXRlV2luZG93KHByb2dyYW1fbmFtZSwgU0RMX1dJTkRPV1BPU19VTkRFRklORUQsIFNETF9XSU5ET1dQT1NfVU5ERUZJTkVELCBkZWZhdWx0X3dpZHRoLCBkZWZhdWx0X2hlaWdodCwgZmxhZ3MpOworICAgICAgICBTRExfU2V0SGludChTRExfSElOVF9SRU5ERVJfU0NBTEVfUVVBTElUWSwgImxpbmVhciIpOworICAgICAgICBpZiAod2luZG93KSB7CisgICAgICAgICAgICByZW5kZXJlciA9IFNETF9DcmVhdGVSZW5kZXJlcih3aW5kb3csIC0xLCBTRExfUkVOREVSRVJfQUNDRUxFUkFURUQgfCBTRExfUkVOREVSRVJfUFJFU0VOVFZTWU5DKTsKKyAgICAgICAgICAgIGlmICghcmVuZGVyZXIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhIGhhcmR3YXJlIGFjY2VsZXJhdGVkIHJlbmRlcmVyOiAlc1xuIiwgU0RMX0dldEVycm9yKCkpOworICAgICAgICAgICAgICAgIHJlbmRlcmVyID0gU0RMX0NyZWF0ZVJlbmRlcmVyKHdpbmRvdywgLTEsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlbmRlcmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFTRExfR2V0UmVuZGVyZXJJbmZvKHJlbmRlcmVyLCAmcmVuZGVyZXJfaW5mbykpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVkVSQk9TRSwgIkluaXRpYWxpemVkICVzIHJlbmRlcmVyLlxuIiwgcmVuZGVyZXJfaW5mby5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdpbmRvdyB8fCAhcmVuZGVyZXIgfHwgIXJlbmRlcmVyX2luZm8ubnVtX3RleHR1cmVfZm9ybWF0cykgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkZhaWxlZCB0byBjcmVhdGUgd2luZG93IG9yIHJlbmRlcmVyOiAlcyIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgICAgIGRvX2V4aXQoTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpcyA9IHN0cmVhbV9vcGVuKGlucHV0X2ZpbGVuYW1lLCBmaWxlX2lmb3JtYXQpOworICAgIGlmICghaXMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIkZhaWxlZCB0byBpbml0aWFsaXplIFZpZGVvU3RhdGUhXG4iKTsKKyAgICAgICAgZG9fZXhpdChOVUxMKTsKKyAgICB9CisKKyAgICBldmVudF9sb29wKGlzKTsKKworICAgIC8qIG5ldmVyIHJldHVybnMgKi8KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZmZ0b29scy9mZnByb2JlLmMgYi9mZnRvb2xzL2ZmcHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDQ3ODZlCi0tLSAvZGV2L251bGwKKysrIGIvZmZ0b29scy9mZnByb2JlLmMKQEAgLTAsMCArMSwzNjk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTAgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBzaW1wbGUgbWVkaWEgcHJvYmVyIGJhc2VkIG9uIHRoZSBGRm1wZWcgbGlicmFyaWVzCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZnZlcnNpb24uaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaGFzaC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zcGhlcmljYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc3RlcmVvM2QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgorI2luY2x1ZGUgImxpYmF2ZGV2aWNlL2F2ZGV2aWNlLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCisjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgiCisjaW5jbHVkZSAibGlicG9zdHByb2MvcG9zdHByb2Nlc3MuaCIKKyNpbmNsdWRlICJjbWR1dGlscy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgorCisjaWYgIUhBVkVfVEhSRUFEUworIyAgaWZkZWYgcHRocmVhZF9tdXRleF9sb2NrCisjICAgIHVuZGVmIHB0aHJlYWRfbXV0ZXhfbG9jaworIyAgZW5kaWYKKyMgIGRlZmluZSBwdGhyZWFkX211dGV4X2xvY2soYSkgZG97fXdoaWxlKDApCisjICBpZmRlZiBwdGhyZWFkX211dGV4X3VubG9jaworIyAgICB1bmRlZiBwdGhyZWFkX211dGV4X3VubG9jaworIyAgZW5kaWYKKyMgIGRlZmluZSBwdGhyZWFkX211dGV4X3VubG9jayhhKSBkb3t9d2hpbGUoMCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBJbnB1dFN0cmVhbSB7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgQVZDb2RlY0NvbnRleHQgKmRlY19jdHg7Cit9IElucHV0U3RyZWFtOworCit0eXBlZGVmIHN0cnVjdCBJbnB1dEZpbGUgeworICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eDsKKworICAgIElucHV0U3RyZWFtICpzdHJlYW1zOworICAgIGludCAgICAgICBuYl9zdHJlYW1zOworfSBJbnB1dEZpbGU7CisKK2NvbnN0IGNoYXIgcHJvZ3JhbV9uYW1lW10gPSAiZmZwcm9iZSI7Citjb25zdCBpbnQgcHJvZ3JhbV9iaXJ0aF95ZWFyID0gMjAwNzsKKworc3RhdGljIGludCBkb19iaXRleGFjdCA9IDA7CitzdGF0aWMgaW50IGRvX2NvdW50X2ZyYW1lcyA9IDA7CitzdGF0aWMgaW50IGRvX2NvdW50X3BhY2tldHMgPSAwOworc3RhdGljIGludCBkb19yZWFkX2ZyYW1lcyAgPSAwOworc3RhdGljIGludCBkb19yZWFkX3BhY2tldHMgPSAwOworc3RhdGljIGludCBkb19zaG93X2NoYXB0ZXJzID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19lcnJvciAgID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19mb3JtYXQgID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19mcmFtZXMgID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19wYWNrZXRzID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19wcm9ncmFtcyA9IDA7CitzdGF0aWMgaW50IGRvX3Nob3dfc3RyZWFtcyA9IDA7CitzdGF0aWMgaW50IGRvX3Nob3dfc3RyZWFtX2Rpc3Bvc2l0aW9uID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19kYXRhICAgID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19wcm9ncmFtX3ZlcnNpb24gID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19saWJyYXJ5X3ZlcnNpb25zID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19waXhlbF9mb3JtYXRzID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19waXhlbF9mb3JtYXRfZmxhZ3MgPSAwOworc3RhdGljIGludCBkb19zaG93X3BpeGVsX2Zvcm1hdF9jb21wb25lbnRzID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19sb2cgPSAwOworCitzdGF0aWMgaW50IGRvX3Nob3dfY2hhcHRlcl90YWdzID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19mb3JtYXRfdGFncyA9IDA7CitzdGF0aWMgaW50IGRvX3Nob3dfZnJhbWVfdGFncyA9IDA7CitzdGF0aWMgaW50IGRvX3Nob3dfcHJvZ3JhbV90YWdzID0gMDsKK3N0YXRpYyBpbnQgZG9fc2hvd19zdHJlYW1fdGFncyA9IDA7CitzdGF0aWMgaW50IGRvX3Nob3dfcGFja2V0X3RhZ3MgPSAwOworCitzdGF0aWMgaW50IHNob3dfdmFsdWVfdW5pdCAgICAgICAgICAgICAgPSAwOworc3RhdGljIGludCB1c2VfdmFsdWVfcHJlZml4ICAgICAgICAgICAgID0gMDsKK3N0YXRpYyBpbnQgdXNlX2J5dGVfdmFsdWVfYmluYXJ5X3ByZWZpeCA9IDA7CitzdGF0aWMgaW50IHVzZV92YWx1ZV9zZXhhZ2VzaW1hbF9mb3JtYXQgPSAwOworc3RhdGljIGludCBzaG93X3ByaXZhdGVfZGF0YSAgICAgICAgICAgID0gMTsKKworc3RhdGljIGNoYXIgKnByaW50X2Zvcm1hdDsKK3N0YXRpYyBjaGFyICpzdHJlYW1fc3BlY2lmaWVyOworc3RhdGljIGNoYXIgKnNob3dfZGF0YV9oYXNoOworCit0eXBlZGVmIHN0cnVjdCBSZWFkSW50ZXJ2YWwgeworICAgIGludCBpZDsgICAgICAgICAgICAgLy8vPCBpZGVudGlmaWVyCisgICAgaW50NjRfdCBzdGFydCwgZW5kOyAvLy88IHN0YXJ0LCBlbmQgaW4gc2Vjb25kL0FWX1RJTUVfQkFTRSB1bml0cworICAgIGludCBoYXNfc3RhcnQsIGhhc19lbmQ7CisgICAgaW50IHN0YXJ0X2lzX29mZnNldCwgZW5kX2lzX29mZnNldDsKKyAgICBpbnQgZHVyYXRpb25fZnJhbWVzOworfSBSZWFkSW50ZXJ2YWw7CisKK3N0YXRpYyBSZWFkSW50ZXJ2YWwgKnJlYWRfaW50ZXJ2YWxzOworc3RhdGljIGludCByZWFkX2ludGVydmFsc19uYiA9IDA7CisKK3N0YXRpYyBpbnQgZmluZF9zdHJlYW1faW5mbyAgPSAxOworCisvKiBzZWN0aW9uIHN0cnVjdHVyZSBkZWZpbml0aW9uICovCisKKyNkZWZpbmUgU0VDVElPTl9NQVhfTkJfQ0hJTERSRU4gMTAKKworc3RydWN0IHNlY3Rpb24geworICAgIGludCBpZDsgICAgICAgICAgICAgLy8vPCB1bmlxdWUgaWQgaWRlbnRpZnlpbmcgYSBzZWN0aW9uCisgICAgY29uc3QgY2hhciAqbmFtZTsKKworI2RlZmluZSBTRUNUSU9OX0ZMQUdfSVNfV1JBUFBFUiAgICAgIDEgLy8vPCB0aGUgc2VjdGlvbiBvbmx5IGNvbnRhaW5zIG90aGVyIHNlY3Rpb25zLCBidXQgaGFzIG5vIGRhdGEgYXQgaXRzIG93biBsZXZlbAorI2RlZmluZSBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkgICAgICAgIDIgLy8vPCB0aGUgc2VjdGlvbiBjb250YWlucyBhbiBhcnJheSBvZiBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlCisjZGVmaW5lIFNFQ1RJT05fRkxBR19IQVNfVkFSSUFCTEVfRklFTERTIDQgLy8vPCB0aGUgc2VjdGlvbiBtYXkgY29udGFpbiBhIHZhcmlhYmxlIG51bWJlciBvZiBmaWVsZHMgd2l0aCB2YXJpYWJsZSBrZXlzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyAgRm9yIHRoZXNlIHNlY3Rpb25zIHRoZSBlbGVtZW50X25hbWUgZmllbGQgaXMgbWFuZGF0b3J5LgorICAgIGludCBmbGFnczsKKyAgICBpbnQgY2hpbGRyZW5faWRzW1NFQ1RJT05fTUFYX05CX0NISUxEUkVOKzFdOyAvLy88IGxpc3Qgb2YgY2hpbGRyZW4gc2VjdGlvbiBJRFMsIHRlcm1pbmF0ZWQgYnkgLTEKKyAgICBjb25zdCBjaGFyICplbGVtZW50X25hbWU7IC8vLzwgbmFtZSBvZiB0aGUgY29udGFpbmVkIGVsZW1lbnQsIGlmIHByb3ZpZGVkCisgICAgY29uc3QgY2hhciAqdW5pcXVlX25hbWU7ICAvLy88IHVuaXF1ZSBzZWN0aW9uIG5hbWUsIGluIGNhc2UgdGhlIG5hbWUgaXMgYW1iaWd1b3VzCisgICAgQVZEaWN0aW9uYXJ5ICplbnRyaWVzX3RvX3Nob3c7CisgICAgaW50IHNob3dfYWxsX2VudHJpZXM7Cit9OworCit0eXBlZGVmIGVudW0geworICAgIFNFQ1RJT05fSURfTk9ORSA9IC0xLAorICAgIFNFQ1RJT05fSURfQ0hBUFRFUiwKKyAgICBTRUNUSU9OX0lEX0NIQVBURVJfVEFHUywKKyAgICBTRUNUSU9OX0lEX0NIQVBURVJTLAorICAgIFNFQ1RJT05fSURfRVJST1IsCisgICAgU0VDVElPTl9JRF9GT1JNQVQsCisgICAgU0VDVElPTl9JRF9GT1JNQVRfVEFHUywKKyAgICBTRUNUSU9OX0lEX0ZSQU1FLAorICAgIFNFQ1RJT05fSURfRlJBTUVTLAorICAgIFNFQ1RJT05fSURfRlJBTUVfVEFHUywKKyAgICBTRUNUSU9OX0lEX0ZSQU1FX1NJREVfREFUQV9MSVNULAorICAgIFNFQ1RJT05fSURfRlJBTUVfU0lERV9EQVRBLAorICAgIFNFQ1RJT05fSURfRlJBTUVfTE9HLAorICAgIFNFQ1RJT05fSURfRlJBTUVfTE9HUywKKyAgICBTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTiwKKyAgICBTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTlMsCisgICAgU0VDVElPTl9JRF9QQUNLRVQsCisgICAgU0VDVElPTl9JRF9QQUNLRVRfVEFHUywKKyAgICBTRUNUSU9OX0lEX1BBQ0tFVFMsCisgICAgU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVMsCisgICAgU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBX0xJU1QsCisgICAgU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBLAorICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFULAorICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0ZMQUdTLAorICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0NPTVBPTkVOVCwKKyAgICBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVF9DT01QT05FTlRTLAorICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFUUywKKyAgICBTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNX0RJU1BPU0lUSU9OLAorICAgIFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1fVEFHUywKKyAgICBTRUNUSU9OX0lEX1BST0dSQU0sCisgICAgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTVMsCisgICAgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTSwKKyAgICBTRUNUSU9OX0lEX1BST0dSQU1fVEFHUywKKyAgICBTRUNUSU9OX0lEX1BST0dSQU1fVkVSU0lPTiwKKyAgICBTRUNUSU9OX0lEX1BST0dSQU1TLAorICAgIFNFQ1RJT05fSURfUk9PVCwKKyAgICBTRUNUSU9OX0lEX1NUUkVBTSwKKyAgICBTRUNUSU9OX0lEX1NUUkVBTV9ESVNQT1NJVElPTiwKKyAgICBTRUNUSU9OX0lEX1NUUkVBTVMsCisgICAgU0VDVElPTl9JRF9TVFJFQU1fVEFHUywKKyAgICBTRUNUSU9OX0lEX1NUUkVBTV9TSURFX0RBVEFfTElTVCwKKyAgICBTRUNUSU9OX0lEX1NUUkVBTV9TSURFX0RBVEEsCisgICAgU0VDVElPTl9JRF9TVUJUSVRMRSwKK30gU2VjdGlvbklEOworCitzdGF0aWMgc3RydWN0IHNlY3Rpb24gc2VjdGlvbnNbXSA9IHsKKyAgICBbU0VDVElPTl9JRF9DSEFQVEVSU10gPSAgICAgICAgICAgeyBTRUNUSU9OX0lEX0NIQVBURVJTLCAiY2hhcHRlcnMiLCBTRUNUSU9OX0ZMQUdfSVNfQVJSQVksIHsgU0VDVElPTl9JRF9DSEFQVEVSLCAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfQ0hBUFRFUl0gPSAgICAgICAgICAgIHsgU0VDVElPTl9JRF9DSEFQVEVSLCAiY2hhcHRlciIsIDAsIHsgU0VDVElPTl9JRF9DSEFQVEVSX1RBR1MsIC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9DSEFQVEVSX1RBR1NdID0gICAgICAgeyBTRUNUSU9OX0lEX0NIQVBURVJfVEFHUywgInRhZ3MiLCBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUywgeyAtMSB9LCAuZWxlbWVudF9uYW1lID0gInRhZyIsIC51bmlxdWVfbmFtZSA9ICJjaGFwdGVyX3RhZ3MiIH0sCisgICAgW1NFQ1RJT05fSURfRVJST1JdID0gICAgICAgICAgICAgIHsgU0VDVElPTl9JRF9FUlJPUiwgImVycm9yIiwgMCwgeyAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfRk9STUFUXSA9ICAgICAgICAgICAgIHsgU0VDVElPTl9JRF9GT1JNQVQsICJmb3JtYXQiLCAwLCB7IFNFQ1RJT05fSURfRk9STUFUX1RBR1MsIC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9GT1JNQVRfVEFHU10gPSAgICAgICAgeyBTRUNUSU9OX0lEX0ZPUk1BVF9UQUdTLCAidGFncyIsIFNFQ1RJT05fRkxBR19IQVNfVkFSSUFCTEVfRklFTERTLCB7IC0xIH0sIC5lbGVtZW50X25hbWUgPSAidGFnIiwgLnVuaXF1ZV9uYW1lID0gImZvcm1hdF90YWdzIiB9LAorICAgIFtTRUNUSU9OX0lEX0ZSQU1FU10gPSAgICAgICAgICAgICB7IFNFQ1RJT05fSURfRlJBTUVTLCAiZnJhbWVzIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfRlJBTUUsIFNFQ1RJT05fSURfU1VCVElUTEUsIC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9GUkFNRV0gPSAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX0ZSQU1FLCAiZnJhbWUiLCAwLCB7IFNFQ1RJT05fSURfRlJBTUVfVEFHUywgU0VDVElPTl9JRF9GUkFNRV9TSURFX0RBVEFfTElTVCwgU0VDVElPTl9JRF9GUkFNRV9MT0dTLCAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfRlJBTUVfVEFHU10gPSAgICAgICAgIHsgU0VDVElPTl9JRF9GUkFNRV9UQUdTLCAidGFncyIsIFNFQ1RJT05fRkxBR19IQVNfVkFSSUFCTEVfRklFTERTLCB7IC0xIH0sIC5lbGVtZW50X25hbWUgPSAidGFnIiwgLnVuaXF1ZV9uYW1lID0gImZyYW1lX3RhZ3MiIH0sCisgICAgW1NFQ1RJT05fSURfRlJBTUVfU0lERV9EQVRBX0xJU1RdID17IFNFQ1RJT05fSURfRlJBTUVfU0lERV9EQVRBX0xJU1QsICJzaWRlX2RhdGFfbGlzdCIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX0ZSQU1FX1NJREVfREFUQSwgLTEgfSwgLmVsZW1lbnRfbmFtZSA9ICJzaWRlX2RhdGEiLCAudW5pcXVlX25hbWUgPSAiZnJhbWVfc2lkZV9kYXRhX2xpc3QiIH0sCisgICAgW1NFQ1RJT05fSURfRlJBTUVfU0lERV9EQVRBXSA9ICAgICB7IFNFQ1RJT05fSURfRlJBTUVfU0lERV9EQVRBLCAic2lkZV9kYXRhIiwgMCwgeyAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfRlJBTUVfTE9HU10gPSAgICAgICAgIHsgU0VDVElPTl9JRF9GUkFNRV9MT0dTLCAibG9ncyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX0ZSQU1FX0xPRywgLTEgfSB9LAorICAgIFtTRUNUSU9OX0lEX0ZSQU1FX0xPR10gPSAgICAgICAgICB7IFNFQ1RJT05fSURfRlJBTUVfTE9HLCAibG9nIiwgMCwgeyAtMSB9LCAgfSwKKyAgICBbU0VDVElPTl9JRF9MSUJSQVJZX1ZFUlNJT05TXSA9ICAgeyBTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTlMsICJsaWJyYXJ5X3ZlcnNpb25zIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OLCAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OXSA9ICAgIHsgU0VDVElPTl9JRF9MSUJSQVJZX1ZFUlNJT04sICJsaWJyYXJ5X3ZlcnNpb24iLCAwLCB7IC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9QQUNLRVRTXSA9ICAgICAgICAgICAgeyBTRUNUSU9OX0lEX1BBQ0tFVFMsICJwYWNrZXRzIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfUEFDS0VULCAtMX0gfSwKKyAgICBbU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVNdID0geyBTRUNUSU9OX0lEX1BBQ0tFVFNfQU5EX0ZSQU1FUywgInBhY2tldHNfYW5kX2ZyYW1lcyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX1BBQ0tFVCwgLTF9IH0sCisgICAgW1NFQ1RJT05fSURfUEFDS0VUXSA9ICAgICAgICAgICAgIHsgU0VDVElPTl9JRF9QQUNLRVQsICJwYWNrZXQiLCAwLCB7IFNFQ1RJT05fSURfUEFDS0VUX1RBR1MsIFNFQ1RJT05fSURfUEFDS0VUX1NJREVfREFUQV9MSVNULCAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfUEFDS0VUX1RBR1NdID0gICAgICAgIHsgU0VDVElPTl9JRF9QQUNLRVRfVEFHUywgInRhZ3MiLCBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUywgeyAtMSB9LCAuZWxlbWVudF9uYW1lID0gInRhZyIsIC51bmlxdWVfbmFtZSA9ICJwYWNrZXRfdGFncyIgfSwKKyAgICBbU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBX0xJU1RdID17IFNFQ1RJT05fSURfUEFDS0VUX1NJREVfREFUQV9MSVNULCAic2lkZV9kYXRhX2xpc3QiLCBTRUNUSU9OX0ZMQUdfSVNfQVJSQVksIHsgU0VDVElPTl9JRF9QQUNLRVRfU0lERV9EQVRBLCAtMSB9LCAuZWxlbWVudF9uYW1lID0gInNpZGVfZGF0YSIsIC51bmlxdWVfbmFtZSA9ICJwYWNrZXRfc2lkZV9kYXRhX2xpc3QiIH0sCisgICAgW1NFQ1RJT05fSURfUEFDS0VUX1NJREVfREFUQV0gPSAgICAgeyBTRUNUSU9OX0lEX1BBQ0tFVF9TSURFX0RBVEEsICJzaWRlX2RhdGEiLCAwLCB7IC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRTXSA9ICAgICAgeyBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVFMsICJwaXhlbF9mb3JtYXRzIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfUElYRUxfRk9STUFULCAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfUElYRUxfRk9STUFUXSA9ICAgICAgIHsgU0VDVElPTl9JRF9QSVhFTF9GT1JNQVQsICJwaXhlbF9mb3JtYXQiLCAwLCB7IFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0ZMQUdTLCBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVF9DT01QT05FTlRTLCAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfUElYRUxfRk9STUFUX0ZMQUdTXSA9IHsgU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRfRkxBR1MsICJmbGFncyIsIDAsIHsgLTEgfSwgLnVuaXF1ZV9uYW1lID0gInBpeGVsX2Zvcm1hdF9mbGFncyIgfSwKKyAgICBbU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRfQ09NUE9ORU5UU10gPSB7IFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0NPTVBPTkVOVFMsICJjb21wb25lbnRzIiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7U0VDVElPTl9JRF9QSVhFTF9GT1JNQVRfQ09NUE9ORU5ULCAtMSB9LCAudW5pcXVlX25hbWUgPSAicGl4ZWxfZm9ybWF0X2NvbXBvbmVudHMiIH0sCisgICAgW1NFQ1RJT05fSURfUElYRUxfRk9STUFUX0NPTVBPTkVOVF0gID0geyBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVF9DT01QT05FTlQsICJjb21wb25lbnQiLCAwLCB7IC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTV9ESVNQT1NJVElPTl0gPSB7IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1fRElTUE9TSVRJT04sICJkaXNwb3NpdGlvbiIsIDAsIHsgLTEgfSwgLnVuaXF1ZV9uYW1lID0gInByb2dyYW1fc3RyZWFtX2Rpc3Bvc2l0aW9uIiB9LAorICAgIFtTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNX1RBR1NdID0gICAgICAgIHsgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTV9UQUdTLCAidGFncyIsIFNFQ1RJT05fRkxBR19IQVNfVkFSSUFCTEVfRklFTERTLCB7IC0xIH0sIC5lbGVtZW50X25hbWUgPSAidGFnIiwgLnVuaXF1ZV9uYW1lID0gInByb2dyYW1fc3RyZWFtX3RhZ3MiIH0sCisgICAgW1NFQ1RJT05fSURfUFJPR1JBTV0gPSAgICAgICAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX1BST0dSQU0sICJwcm9ncmFtIiwgMCwgeyBTRUNUSU9OX0lEX1BST0dSQU1fVEFHUywgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTVMsIC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTVNdID0gICAgICAgICAgICB7IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1TLCAic3RyZWFtcyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNLCAtMSB9LCAudW5pcXVlX25hbWUgPSAicHJvZ3JhbV9zdHJlYW1zIiB9LAorICAgIFtTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNXSA9ICAgICAgICAgICAgIHsgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTSwgInN0cmVhbSIsIDAsIHsgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTV9ESVNQT1NJVElPTiwgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTV9UQUdTLCAtMSB9LCAudW5pcXVlX25hbWUgPSAicHJvZ3JhbV9zdHJlYW0iIH0sCisgICAgW1NFQ1RJT05fSURfUFJPR1JBTV9UQUdTXSA9ICAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX1BST0dSQU1fVEFHUywgInRhZ3MiLCBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUywgeyAtMSB9LCAuZWxlbWVudF9uYW1lID0gInRhZyIsIC51bmlxdWVfbmFtZSA9ICJwcm9ncmFtX3RhZ3MiIH0sCisgICAgW1NFQ1RJT05fSURfUFJPR1JBTV9WRVJTSU9OXSA9ICAgIHsgU0VDVElPTl9JRF9QUk9HUkFNX1ZFUlNJT04sICJwcm9ncmFtX3ZlcnNpb24iLCAwLCB7IC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9QUk9HUkFNU10gPSAgICAgICAgICAgICAgICAgICB7IFNFQ1RJT05fSURfUFJPR1JBTVMsICJwcm9ncmFtcyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX1BST0dSQU0sIC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9ST09UXSA9ICAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX1JPT1QsICJyb290IiwgU0VDVElPTl9GTEFHX0lTX1dSQVBQRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBTRUNUSU9OX0lEX0NIQVBURVJTLCBTRUNUSU9OX0lEX0ZPUk1BVCwgU0VDVElPTl9JRF9GUkFNRVMsIFNFQ1RJT05fSURfUFJPR1JBTVMsIFNFQ1RJT05fSURfU1RSRUFNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fSURfUEFDS0VUUywgU0VDVElPTl9JRF9FUlJPUiwgU0VDVElPTl9JRF9QUk9HUkFNX1ZFUlNJT04sIFNFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fSURfUElYRUxfRk9STUFUUywgLTF9IH0sCisgICAgW1NFQ1RJT05fSURfU1RSRUFNU10gPSAgICAgICAgICAgIHsgU0VDVElPTl9JRF9TVFJFQU1TLCAic3RyZWFtcyIsIFNFQ1RJT05fRkxBR19JU19BUlJBWSwgeyBTRUNUSU9OX0lEX1NUUkVBTSwgLTEgfSB9LAorICAgIFtTRUNUSU9OX0lEX1NUUkVBTV0gPSAgICAgICAgICAgICB7IFNFQ1RJT05fSURfU1RSRUFNLCAic3RyZWFtIiwgMCwgeyBTRUNUSU9OX0lEX1NUUkVBTV9ESVNQT1NJVElPTiwgU0VDVElPTl9JRF9TVFJFQU1fVEFHUywgU0VDVElPTl9JRF9TVFJFQU1fU0lERV9EQVRBX0xJU1QsIC0xIH0gfSwKKyAgICBbU0VDVElPTl9JRF9TVFJFQU1fRElTUE9TSVRJT05dID0geyBTRUNUSU9OX0lEX1NUUkVBTV9ESVNQT1NJVElPTiwgImRpc3Bvc2l0aW9uIiwgMCwgeyAtMSB9LCAudW5pcXVlX25hbWUgPSAic3RyZWFtX2Rpc3Bvc2l0aW9uIiB9LAorICAgIFtTRUNUSU9OX0lEX1NUUkVBTV9UQUdTXSA9ICAgICAgICB7IFNFQ1RJT05fSURfU1RSRUFNX1RBR1MsICJ0YWdzIiwgU0VDVElPTl9GTEFHX0hBU19WQVJJQUJMRV9GSUVMRFMsIHsgLTEgfSwgLmVsZW1lbnRfbmFtZSA9ICJ0YWciLCAudW5pcXVlX25hbWUgPSAic3RyZWFtX3RhZ3MiIH0sCisgICAgW1NFQ1RJT05fSURfU1RSRUFNX1NJREVfREFUQV9MSVNUXSA9eyBTRUNUSU9OX0lEX1NUUkVBTV9TSURFX0RBVEFfTElTVCwgInNpZGVfZGF0YV9saXN0IiwgU0VDVElPTl9GTEFHX0lTX0FSUkFZLCB7IFNFQ1RJT05fSURfU1RSRUFNX1NJREVfREFUQSwgLTEgfSwgLmVsZW1lbnRfbmFtZSA9ICJzaWRlX2RhdGEiLCAudW5pcXVlX25hbWUgPSAic3RyZWFtX3NpZGVfZGF0YV9saXN0IiB9LAorICAgIFtTRUNUSU9OX0lEX1NUUkVBTV9TSURFX0RBVEFdID0gICAgIHsgU0VDVElPTl9JRF9TVFJFQU1fU0lERV9EQVRBLCAic2lkZV9kYXRhIiwgMCwgeyAtMSB9IH0sCisgICAgW1NFQ1RJT05fSURfU1VCVElUTEVdID0gICAgICAgICAgIHsgU0VDVElPTl9JRF9TVUJUSVRMRSwgInN1YnRpdGxlIiwgMCwgeyAtMSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgT3B0aW9uRGVmICpvcHRpb25zOworCisvKiBGRnByb2JlIGNvbnRleHQgKi8KK3N0YXRpYyBjb25zdCBjaGFyICppbnB1dF9maWxlbmFtZTsKK3N0YXRpYyBBVklucHV0Rm9ybWF0ICppZm9ybWF0ID0gTlVMTDsKKworc3RhdGljIHN0cnVjdCBBVkhhc2hDb250ZXh0ICpoYXNoOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBkb3VibGUgYmluX3ZhbDsKKyAgICBkb3VibGUgZGVjX3ZhbDsKKyAgICBjb25zdCBjaGFyICpiaW5fc3RyOworICAgIGNvbnN0IGNoYXIgKmRlY19zdHI7Cit9IHNpX3ByZWZpeGVzW10gPSB7CisgICAgeyAxLjAsIDEuMCwgIiIsICIiIH0sCisgICAgeyAxLjAyNGUzLCAxZTMsICJLaSIsICJLIiB9LAorICAgIHsgMS4wNDg1NzZlNiwgMWU2LCAiTWkiLCAiTSIgfSwKKyAgICB7IDEuMDczNzQxODI0ZTksIDFlOSwgIkdpIiwgIkciIH0sCisgICAgeyAxLjA5OTUxMTYyNzc3NmUxMiwgMWUxMiwgIlRpIiwgIlQiIH0sCisgICAgeyAxLjEyNTg5OTkwNjg0MjYyNGUxNSwgMWUxNSwgIlBpIiwgIlAiIH0sCit9OworCitzdGF0aWMgY29uc3QgY2hhciB1bml0X3NlY29uZF9zdHJbXSAgICAgICAgID0gInMiICAgIDsKK3N0YXRpYyBjb25zdCBjaGFyIHVuaXRfaGVydHpfc3RyW10gICAgICAgICAgPSAiSHoiICAgOworc3RhdGljIGNvbnN0IGNoYXIgdW5pdF9ieXRlX3N0cltdICAgICAgICAgICA9ICJieXRlIiA7CitzdGF0aWMgY29uc3QgY2hhciB1bml0X2JpdF9wZXJfc2Vjb25kX3N0cltdID0gImJpdC9zIjsKKworc3RhdGljIGludCBuYl9zdHJlYW1zOworc3RhdGljIHVpbnQ2NF90ICpuYl9zdHJlYW1zX3BhY2tldHM7CitzdGF0aWMgdWludDY0X3QgKm5iX3N0cmVhbXNfZnJhbWVzOworc3RhdGljIGludCAqc2VsZWN0ZWRfc3RyZWFtczsKKworI2lmIEhBVkVfVEhSRUFEUworcHRocmVhZF9tdXRleF90IGxvZ19tdXRleDsKKyNlbmRpZgordHlwZWRlZiBzdHJ1Y3QgTG9nQnVmZmVyIHsKKyAgICBjaGFyICpjb250ZXh0X25hbWU7CisgICAgaW50IGxvZ19sZXZlbDsKKyAgICBjaGFyICpsb2dfbWVzc2FnZTsKKyAgICBBVkNsYXNzQ2F0ZWdvcnkgY2F0ZWdvcnk7CisgICAgY2hhciAqcGFyZW50X25hbWU7CisgICAgQVZDbGFzc0NhdGVnb3J5IHBhcmVudF9jYXRlZ29yeTsKK31Mb2dCdWZmZXI7CisKK3N0YXRpYyBMb2dCdWZmZXIgKmxvZ19idWZmZXI7CitzdGF0aWMgaW50IGxvZ19idWZmZXJfc2l6ZTsKKworc3RhdGljIHZvaWQgbG9nX2NhbGxiYWNrKHZvaWQgKnB0ciwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmwpCit7CisgICAgQVZDbGFzcyogYXZjID0gcHRyID8gKihBVkNsYXNzICoqKSBwdHIgOiBOVUxMOworICAgIHZhX2xpc3QgdmwyOworICAgIGNoYXIgbGluZVsxMDI0XTsKKyAgICBzdGF0aWMgaW50IHByaW50X3ByZWZpeCA9IDE7CisgICAgdm9pZCAqbmV3X2xvZ19idWZmZXI7CisKKyAgICB2YV9jb3B5KHZsMiwgdmwpOworICAgIGF2X2xvZ19kZWZhdWx0X2NhbGxiYWNrKHB0ciwgbGV2ZWwsIGZtdCwgdmwpOworICAgIGF2X2xvZ19mb3JtYXRfbGluZShwdHIsIGxldmVsLCBmbXQsIHZsMiwgbGluZSwgc2l6ZW9mKGxpbmUpLCAmcHJpbnRfcHJlZml4KTsKKyAgICB2YV9lbmQodmwyKTsKKworI2lmIEhBVkVfVEhSRUFEUworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbG9nX211dGV4KTsKKworICAgIG5ld19sb2dfYnVmZmVyID0gYXZfcmVhbGxvY19hcnJheShsb2dfYnVmZmVyLCBsb2dfYnVmZmVyX3NpemUgKyAxLCBzaXplb2YoKmxvZ19idWZmZXIpKTsKKyAgICBpZiAobmV3X2xvZ19idWZmZXIpIHsKKyAgICAgICAgY2hhciAqbXNnOworICAgICAgICBpbnQgaTsKKworICAgICAgICBsb2dfYnVmZmVyID0gbmV3X2xvZ19idWZmZXI7CisgICAgICAgIG1lbXNldCgmbG9nX2J1ZmZlcltsb2dfYnVmZmVyX3NpemVdLCAwLCBzaXplb2YobG9nX2J1ZmZlcltsb2dfYnVmZmVyX3NpemVdKSk7CisgICAgICAgIGxvZ19idWZmZXJbbG9nX2J1ZmZlcl9zaXplXS5jb250ZXh0X25hbWU9IGF2YyA/IGF2X3N0cmR1cChhdmMtPml0ZW1fbmFtZShwdHIpKSA6IE5VTEw7CisgICAgICAgIGlmIChhdmMpIHsKKyAgICAgICAgICAgIGlmIChhdmMtPmdldF9jYXRlZ29yeSkgbG9nX2J1ZmZlcltsb2dfYnVmZmVyX3NpemVdLmNhdGVnb3J5ID0gYXZjLT5nZXRfY2F0ZWdvcnkocHRyKTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgbG9nX2J1ZmZlcltsb2dfYnVmZmVyX3NpemVdLmNhdGVnb3J5ID0gYXZjLT5jYXRlZ29yeTsKKyAgICAgICAgfQorICAgICAgICBsb2dfYnVmZmVyW2xvZ19idWZmZXJfc2l6ZV0ubG9nX2xldmVsICAgPSBsZXZlbDsKKyAgICAgICAgbXNnID0gbG9nX2J1ZmZlcltsb2dfYnVmZmVyX3NpemVdLmxvZ19tZXNzYWdlID0gYXZfc3RyZHVwKGxpbmUpOworICAgICAgICBmb3IgKGk9c3RybGVuKG1zZykgLSAxOyBpPj0wICYmIG1zZ1tpXSA9PSAnXG4nOyBpLS0pIHsKKyAgICAgICAgICAgIG1zZ1tpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2YyAmJiBhdmMtPnBhcmVudF9sb2dfY29udGV4dF9vZmZzZXQpIHsKKyAgICAgICAgICAgIEFWQ2xhc3MqKiBwYXJlbnQgPSAqKEFWQ2xhc3MgKioqKSAoKCh1aW50OF90ICopIHB0cikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmMtPnBhcmVudF9sb2dfY29udGV4dF9vZmZzZXQpOworICAgICAgICAgICAgaWYgKHBhcmVudCAmJiAqcGFyZW50KSB7CisgICAgICAgICAgICAgICAgbG9nX2J1ZmZlcltsb2dfYnVmZmVyX3NpemVdLnBhcmVudF9uYW1lID0gYXZfc3RyZHVwKCgqcGFyZW50KS0+aXRlbV9uYW1lKHBhcmVudCkpOworICAgICAgICAgICAgICAgIGxvZ19idWZmZXJbbG9nX2J1ZmZlcl9zaXplXS5wYXJlbnRfY2F0ZWdvcnkgPQorICAgICAgICAgICAgICAgICAgICAoKnBhcmVudCktPmdldF9jYXRlZ29yeSA/ICgqcGFyZW50KS0+Z2V0X2NhdGVnb3J5KHBhcmVudCkgOigqcGFyZW50KS0+Y2F0ZWdvcnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9nX2J1ZmZlcl9zaXplICsrOworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2dfbXV0ZXgpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGZmcHJvYmVfY2xlYW51cChpbnQgcmV0KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzZWN0aW9ucyk7IGkrKykKKyAgICAgICAgYXZfZGljdF9mcmVlKCYoc2VjdGlvbnNbaV0uZW50cmllc190b19zaG93KSk7CisKKyNpZiBIQVZFX1RIUkVBRFMKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmxvZ19tdXRleCk7CisjZW5kaWYKK30KKworc3RydWN0IHVuaXRfdmFsdWUgeworICAgIHVuaW9uIHsgZG91YmxlIGQ7IGxvbmcgbG9uZyBpbnQgaTsgfSB2YWw7CisgICAgY29uc3QgY2hhciAqdW5pdDsKK307CisKK3N0YXRpYyBjaGFyICp2YWx1ZV9zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIHN0cnVjdCB1bml0X3ZhbHVlIHV2KQoreworICAgIGRvdWJsZSB2YWxkOworICAgIGxvbmcgbG9uZyBpbnQgdmFsaTsKKyAgICBpbnQgc2hvd19mbG9hdCA9IDA7CisKKyAgICBpZiAodXYudW5pdCA9PSB1bml0X3NlY29uZF9zdHIpIHsKKyAgICAgICAgdmFsZCA9IHV2LnZhbC5kOworICAgICAgICBzaG93X2Zsb2F0ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICB2YWxkID0gdmFsaSA9IHV2LnZhbC5pOworICAgIH0KKworICAgIGlmICh1di51bml0ID09IHVuaXRfc2Vjb25kX3N0ciAmJiB1c2VfdmFsdWVfc2V4YWdlc2ltYWxfZm9ybWF0KSB7CisgICAgICAgIGRvdWJsZSBzZWNzOworICAgICAgICBpbnQgaG91cnMsIG1pbnM7CisgICAgICAgIHNlY3MgID0gdmFsZDsKKyAgICAgICAgbWlucyAgPSAoaW50KXNlY3MgLyA2MDsKKyAgICAgICAgc2VjcyAgPSBzZWNzIC0gbWlucyAqIDYwOworICAgICAgICBob3VycyA9IG1pbnMgLyA2MDsKKyAgICAgICAgbWlucyAlPSA2MDsKKyAgICAgICAgc25wcmludGYoYnVmLCBidWZfc2l6ZSwgIiVkOiUwMmQ6JTA5LjZmIiwgaG91cnMsIG1pbnMsIHNlY3MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnByZWZpeF9zdHJpbmcgPSAiIjsKKworICAgICAgICBpZiAodXNlX3ZhbHVlX3ByZWZpeCAmJiB2YWxkID4gMSkgeworICAgICAgICAgICAgbG9uZyBsb25nIGludCBpbmRleDsKKworICAgICAgICAgICAgaWYgKHV2LnVuaXQgPT0gdW5pdF9ieXRlX3N0ciAmJiB1c2VfYnl0ZV92YWx1ZV9iaW5hcnlfcHJlZml4KSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSAobG9uZyBsb25nIGludCkgKGxvZzIodmFsZCkpIC8gMTA7CisgICAgICAgICAgICAgICAgaW5kZXggPSBhdl9jbGlwKGluZGV4LCAwLCBGRl9BUlJBWV9FTEVNUyhzaV9wcmVmaXhlcykgLSAxKTsKKyAgICAgICAgICAgICAgICB2YWxkIC89IHNpX3ByZWZpeGVzW2luZGV4XS5iaW5fdmFsOworICAgICAgICAgICAgICAgIHByZWZpeF9zdHJpbmcgPSBzaV9wcmVmaXhlc1tpbmRleF0uYmluX3N0cjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSAobG9uZyBsb25nIGludCkgKGxvZzEwKHZhbGQpKSAvIDM7CisgICAgICAgICAgICAgICAgaW5kZXggPSBhdl9jbGlwKGluZGV4LCAwLCBGRl9BUlJBWV9FTEVNUyhzaV9wcmVmaXhlcykgLSAxKTsKKyAgICAgICAgICAgICAgICB2YWxkIC89IHNpX3ByZWZpeGVzW2luZGV4XS5kZWNfdmFsOworICAgICAgICAgICAgICAgIHByZWZpeF9zdHJpbmcgPSBzaV9wcmVmaXhlc1tpbmRleF0uZGVjX3N0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbGkgPSB2YWxkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNob3dfZmxvYXQgfHwgKHVzZV92YWx1ZV9wcmVmaXggJiYgdmFsZCAhPSAobG9uZyBsb25nIGludCl2YWxkKSkKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiwgYnVmX3NpemUsICIlZiIsIHZhbGQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzbnByaW50ZihidWYsIGJ1Zl9zaXplLCAiJWxsZCIsIHZhbGkpOworICAgICAgICBhdl9zdHJsY2F0ZihidWYsIGJ1Zl9zaXplLCAiJXMlcyVzIiwgKnByZWZpeF9zdHJpbmcgfHwgc2hvd192YWx1ZV91bml0ID8gIiAiIDogIiIsCisgICAgICAgICAgICAgICAgIHByZWZpeF9zdHJpbmcsIHNob3dfdmFsdWVfdW5pdCA/IHV2LnVuaXQgOiAiIik7CisgICAgfQorCisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyogV1JJVEVSUyBBUEkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgV3JpdGVyQ29udGV4dCBXcml0ZXJDb250ZXh0OworCisjZGVmaW5lIFdSSVRFUl9GTEFHX0RJU1BMQVlfT1BUSU9OQUxfRklFTERTIDEKKyNkZWZpbmUgV1JJVEVSX0ZMQUdfUFVUX1BBQ0tFVFNfQU5EX0ZSQU1FU19JTl9TQU1FX0NIQVBURVIgMgorCit0eXBlZGVmIGVudW0geworICAgIFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9GQUlMLAorICAgIFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9SRVBMQUNFLAorICAgIFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9JR05PUkUsCisgICAgV1JJVEVSX1NUUklOR19WQUxJREFUSU9OX05CCit9IFN0cmluZ1ZhbGlkYXRpb247CisKK3R5cGVkZWYgc3RydWN0IFdyaXRlciB7CisgICAgY29uc3QgQVZDbGFzcyAqcHJpdl9jbGFzczsgICAgICAvLy88IHByaXZhdGUgY2xhc3Mgb2YgdGhlIHdyaXRlciwgaWYgYW55CisgICAgaW50IHByaXZfc2l6ZTsgICAgICAgICAgICAgICAgICAvLy88IHByaXZhdGUgc2l6ZSBmb3IgdGhlIHdyaXRlciBjb250ZXh0CisgICAgY29uc3QgY2hhciAqbmFtZTsKKworICAgIGludCAgKCppbml0KSAgKFdyaXRlckNvbnRleHQgKndjdHgpOworICAgIHZvaWQgKCp1bmluaXQpKFdyaXRlckNvbnRleHQgKndjdHgpOworCisgICAgdm9pZCAoKnByaW50X3NlY3Rpb25faGVhZGVyKShXcml0ZXJDb250ZXh0ICp3Y3R4KTsKKyAgICB2b2lkICgqcHJpbnRfc2VjdGlvbl9mb290ZXIpKFdyaXRlckNvbnRleHQgKndjdHgpOworICAgIHZvaWQgKCpwcmludF9pbnRlZ2VyKSAgICAgICAoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqLCBsb25nIGxvbmcgaW50KTsKKyAgICB2b2lkICgqcHJpbnRfcmF0aW9uYWwpICAgICAgKFdyaXRlckNvbnRleHQgKndjdHgsIEFWUmF0aW9uYWwgKnEsIGNoYXIgKnNlcCk7CisgICAgdm9pZCAoKnByaW50X3N0cmluZykgICAgICAgIChXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisgICAgaW50IGZsYWdzOyAgICAgICAgICAgICAgICAgIC8vLzwgYSBjb21iaW5hdGlvbiBvciBXUklURVJfRkxBR18qCit9IFdyaXRlcjsKKworI2RlZmluZSBTRUNUSU9OX01BWF9OQl9MRVZFTFMgMTAKKworc3RydWN0IFdyaXRlckNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgICAgICAgICAgLy8vPCBjbGFzcyBvZiB0aGUgd3JpdGVyCisgICAgY29uc3QgV3JpdGVyICp3cml0ZXI7ICAgICAgICAgICAvLy88IHRoZSBXcml0ZXIgb2Ygd2hpY2ggdGhpcyBpcyBhbiBpbnN0YW5jZQorICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBuYW1lIG9mIHRoaXMgd3JpdGVyIGluc3RhbmNlCisgICAgdm9pZCAqcHJpdjsgICAgICAgICAgICAgICAgICAgICAvLy88IHByaXZhdGUgZGF0YSBmb3IgdXNlIGJ5IHRoZSBmaWx0ZXIKKworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uczsgLy8vPCBhcnJheSBjb250YWluaW5nIGFsbCBzZWN0aW9ucworICAgIGludCBuYl9zZWN0aW9uczsgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2Ygc2VjdGlvbnMKKworICAgIGludCBsZXZlbDsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGxldmVsLCBzdGFydGluZyBmcm9tIDAKKworICAgIC8qKiBudW1iZXIgb2YgdGhlIGl0ZW0gcHJpbnRlZCBpbiB0aGUgZ2l2ZW4gc2VjdGlvbiwgc3RhcnRpbmcgZnJvbSAwICovCisgICAgdW5zaWduZWQgaW50IG5iX2l0ZW1bU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsKKworICAgIC8qKiBzZWN0aW9uIHBlciBlYWNoIGxldmVsICovCisgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb25bU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsKKyAgICBBVkJQcmludCBzZWN0aW9uX3BidWZbU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsgLy8vPCBnZW5lcmljIHByaW50IGJ1ZmZlciBkZWRpY2F0ZWQgdG8gZWFjaCBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gIHVzZWQgYnkgdmFyaW91cyB3cml0ZXJzCisKKyAgICB1bnNpZ25lZCBpbnQgbmJfc2VjdGlvbl9wYWNrZXQ7IC8vLzwgbnVtYmVyIG9mIHRoZSBwYWNrZXQgc2VjdGlvbiBpbiBjYXNlIHdlIGFyZSBpbiAicGFja2V0c19hbmRfZnJhbWVzIiBzZWN0aW9uCisgICAgdW5zaWduZWQgaW50IG5iX3NlY3Rpb25fZnJhbWU7ICAvLy88IG51bWJlciBvZiB0aGUgZnJhbWUgIHNlY3Rpb24gaW4gY2FzZSB3ZSBhcmUgaW4gInBhY2tldHNfYW5kX2ZyYW1lcyIgc2VjdGlvbgorICAgIHVuc2lnbmVkIGludCBuYl9zZWN0aW9uX3BhY2tldF9mcmFtZTsgLy8vPCBuYl9zZWN0aW9uX3BhY2tldCBvciBuYl9zZWN0aW9uX2ZyYW1lIGFjY29yZGluZyBpZiBpc19wYWNrZXRzX2FuZF9mcmFtZXMKKworICAgIGludCBzdHJpbmdfdmFsaWRhdGlvbjsKKyAgICBjaGFyICpzdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudDsKKyAgICB1bnNpZ25lZCBpbnQgc3RyaW5nX3ZhbGlkYXRpb25fdXRmOF9mbGFnczsKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp3cml0ZXJfZ2V0X25hbWUodm9pZCAqcCkKK3sKKyAgICBXcml0ZXJDb250ZXh0ICp3Y3R4ID0gcDsKKyAgICByZXR1cm4gd2N0eC0+d3JpdGVyLT5uYW1lOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihXcml0ZXJDb250ZXh0LCB4KQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gd3JpdGVyX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzdHJpbmdfdmFsaWRhdGlvbiIsICJzZXQgc3RyaW5nIHZhbGlkYXRpb24gbW9kZSIsCisgICAgICBPRkZTRVQoc3RyaW5nX3ZhbGlkYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9SRVBMQUNFfSwgMCwgV1JJVEVSX1NUUklOR19WQUxJREFUSU9OX05CLTEsIC51bml0ID0gInN2IiB9LAorICAgIHsgInN2IiwgInNldCBzdHJpbmcgdmFsaWRhdGlvbiBtb2RlIiwKKyAgICAgIE9GRlNFVChzdHJpbmdfdmFsaWRhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9V1JJVEVSX1NUUklOR19WQUxJREFUSU9OX1JFUExBQ0V9LCAwLCBXUklURVJfU1RSSU5HX1ZBTElEQVRJT05fTkItMSwgLnVuaXQgPSAic3YiIH0sCisgICAgeyAiaWdub3JlIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9JR05PUkV9LCAgLnVuaXQgPSAic3YiIH0sCisgICAgeyAicmVwbGFjZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9SRVBMQUNFfSwgLnVuaXQgPSAic3YiIH0sCisgICAgeyAiZmFpbCIsICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFdSSVRFUl9TVFJJTkdfVkFMSURBVElPTl9GQUlMfSwgICAgLnVuaXQgPSAic3YiIH0sCisgICAgeyAic3RyaW5nX3ZhbGlkYXRpb25fcmVwbGFjZW1lbnQiLCAic2V0IHN0cmluZyB2YWxpZGF0aW9uIHJlcGxhY2VtZW50IHN0cmluZyIsIE9GRlNFVChzdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IiJ9fSwKKyAgICB7ICJzdnIiLCAic2V0IHN0cmluZyB2YWxpZGF0aW9uIHJlcGxhY2VtZW50IHN0cmluZyIsIE9GRlNFVChzdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9Ilx4RUZceEJGXHhCRCJ9fSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIHZvaWQgKndyaXRlcl9jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKK3sKKyAgICBXcml0ZXJDb250ZXh0ICpjdHggPSBvYmo7CisgICAgaWYgKCFwcmV2ICYmIGN0eC0+d3JpdGVyICYmIGN0eC0+d3JpdGVyLT5wcml2X2NsYXNzICYmIGN0eC0+cHJpdikKKyAgICAgICAgcmV0dXJuIGN0eC0+cHJpdjsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgd3JpdGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIldyaXRlciIsCisgICAgLml0ZW1fbmFtZSAgPSB3cml0ZXJfZ2V0X25hbWUsCisgICAgLm9wdGlvbiAgICAgPSB3cml0ZXJfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2hpbGRfbmV4dCA9IHdyaXRlcl9jaGlsZF9uZXh0LAorfTsKKworc3RhdGljIHZvaWQgd3JpdGVyX2Nsb3NlKFdyaXRlckNvbnRleHQgKip3Y3R4KQoreworICAgIGludCBpOworCisgICAgaWYgKCEqd2N0eCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCgqd2N0eCktPndyaXRlci0+dW5pbml0KQorICAgICAgICAoKndjdHgpLT53cml0ZXItPnVuaW5pdCgqd2N0eCk7CisgICAgZm9yIChpID0gMDsgaSA8IFNFQ1RJT05fTUFYX05CX0xFVkVMUzsgaSsrKQorICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJigqd2N0eCktPnNlY3Rpb25fcGJ1ZltpXSwgTlVMTCk7CisgICAgaWYgKCgqd2N0eCktPndyaXRlci0+cHJpdl9jbGFzcykKKyAgICAgICAgYXZfb3B0X2ZyZWUoKCp3Y3R4KS0+cHJpdik7CisgICAgYXZfZnJlZXAoJigoKndjdHgpLT5wcml2KSk7CisgICAgYXZfb3B0X2ZyZWUoKndjdHgpOworICAgIGF2X2ZyZWVwKHdjdHgpOworfQorCitzdGF0aWMgdm9pZCBicHJpbnRfYnl0ZXMoQVZCUHJpbnQgKmJwLCBjb25zdCB1aW50OF90ICp1YnVmLCBzaXplX3QgdWJ1Zl9zaXplKQoreworICAgIGludCBpOworICAgIGF2X2JwcmludGYoYnAsICIwWCIpOworICAgIGZvciAoaSA9IDA7IGkgPCB1YnVmX3NpemU7IGkrKykKKyAgICAgICAgYXZfYnByaW50ZihicCwgIiUwMlgiLCB1YnVmW2ldKTsKK30KKworCitzdGF0aWMgaW50IHdyaXRlcl9vcGVuKFdyaXRlckNvbnRleHQgKip3Y3R4LCBjb25zdCBXcml0ZXIgKndyaXRlciwgY29uc3QgY2hhciAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb25zLCBpbnQgbmJfc2VjdGlvbnMpCit7CisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBpZiAoISgqd2N0eCA9IGF2X21hbGxvY3ooc2l6ZW9mKFdyaXRlckNvbnRleHQpKSkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKCEoKCp3Y3R4KS0+cHJpdiA9IGF2X21hbGxvY3ood3JpdGVyLT5wcml2X3NpemUpKSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAoKndjdHgpLT5jbGFzcyA9ICZ3cml0ZXJfY2xhc3M7CisgICAgKCp3Y3R4KS0+d3JpdGVyID0gd3JpdGVyOworICAgICgqd2N0eCktPmxldmVsID0gLTE7CisgICAgKCp3Y3R4KS0+c2VjdGlvbnMgPSBzZWN0aW9uczsKKyAgICAoKndjdHgpLT5uYl9zZWN0aW9ucyA9IG5iX3NlY3Rpb25zOworCisgICAgYXZfb3B0X3NldF9kZWZhdWx0cygqd2N0eCk7CisKKyAgICBpZiAod3JpdGVyLT5wcml2X2NsYXNzKSB7CisgICAgICAgIHZvaWQgKnByaXZfY3R4ID0gKCp3Y3R4KS0+cHJpdjsKKyAgICAgICAgKigoY29uc3QgQVZDbGFzcyAqKilwcml2X2N0eCkgPSB3cml0ZXItPnByaXZfY2xhc3M7CisgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMocHJpdl9jdHgpOworICAgIH0KKworICAgIC8qIGNvbnZlcnQgb3B0aW9ucyB0byBkaWN0aW9uYXJ5ICovCisgICAgaWYgKGFyZ3MpIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKm9wdCA9IE5VTEw7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdl9kaWN0X3BhcnNlX3N0cmluZygmb3B0cywgYXJncywgIj0iLCAiOiIsIDApKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZygqd2N0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHBhcnNlIG9wdGlvbiBzdHJpbmcgJyVzJyBwcm92aWRlZCB0byB3cml0ZXIgY29udGV4dFxuIiwgYXJncyk7CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKChvcHQgPSBhdl9kaWN0X2dldChvcHRzLCAiIiwgb3B0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0KCp3Y3R4LCBvcHQtPmtleSwgb3B0LT52YWx1ZSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZygqd2N0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBvcHRpb24gJyVzJyB3aXRoIHZhbHVlICclcycgcHJvdmlkZWQgdG8gd3JpdGVyIGNvbnRleHRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG9wdC0+a2V5LCBvcHQtPnZhbHVlKTsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgfQorCisgICAgLyogdmFsaWRhdGUgcmVwbGFjZSBzdHJpbmcgKi8KKyAgICB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSAoKndjdHgpLT5zdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZW5kcCA9IHAgKyBzdHJsZW4ocCk7CisgICAgICAgIHdoaWxlICgqcCkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcDAgPSBwOworICAgICAgICAgICAgaW50MzJfdCBjb2RlOworICAgICAgICAgICAgcmV0ID0gYXZfdXRmOF9kZWNvZGUoJmNvZGUsICZwLCBlbmRwLCAoKndjdHgpLT5zdHJpbmdfdmFsaWRhdGlvbl91dGY4X2ZsYWdzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgQVZCUHJpbnQgYnA7CisgICAgICAgICAgICAgICAgYXZfYnByaW50X2luaXQoJmJwLCAwLCBBVl9CUFJJTlRfU0laRV9BVVRPTUFUSUMpOworICAgICAgICAgICAgICAgIGJwcmludF9ieXRlcygmYnAsIHAwLCBwLXAwKSwKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHdjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFVURjggc2VxdWVuY2UgJXMgZm91bmQgaW4gc3RyaW5nIHZhbGlkYXRpb24gcmVwbGFjZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnAuc3RyLCAoKndjdHgpLT5zdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBTRUNUSU9OX01BWF9OQl9MRVZFTFM7IGkrKykKKyAgICAgICAgYXZfYnByaW50X2luaXQoJigqd2N0eCktPnNlY3Rpb25fcGJ1ZltpXSwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIGlmICgoKndjdHgpLT53cml0ZXItPmluaXQpCisgICAgICAgIHJldCA9ICgqd2N0eCktPndyaXRlci0+aW5pdCgqd2N0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHdyaXRlcl9jbG9zZSh3Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKFdyaXRlckNvbnRleHQgKndjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWN0aW9uX2lkKQoreworICAgIGludCBwYXJlbnRfc2VjdGlvbl9pZDsKKyAgICB3Y3R4LT5sZXZlbCsrOworICAgIGF2X2Fzc2VydDAod2N0eC0+bGV2ZWwgPCBTRUNUSU9OX01BWF9OQl9MRVZFTFMpOworICAgIHBhcmVudF9zZWN0aW9uX2lkID0gd2N0eC0+bGV2ZWwgPworICAgICAgICAod2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbC0xXSktPmlkIDogU0VDVElPTl9JRF9OT05FOworCisgICAgd2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0gPSAwOworICAgIHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdID0gJndjdHgtPnNlY3Rpb25zW3NlY3Rpb25faWRdOworCisgICAgaWYgKHNlY3Rpb25faWQgPT0gU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVMpIHsKKyAgICAgICAgd2N0eC0+bmJfc2VjdGlvbl9wYWNrZXQgPSB3Y3R4LT5uYl9zZWN0aW9uX2ZyYW1lID0KKyAgICAgICAgd2N0eC0+bmJfc2VjdGlvbl9wYWNrZXRfZnJhbWUgPSAwOworICAgIH0gZWxzZSBpZiAocGFyZW50X3NlY3Rpb25faWQgPT0gU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVMpIHsKKyAgICAgICAgd2N0eC0+bmJfc2VjdGlvbl9wYWNrZXRfZnJhbWUgPSBzZWN0aW9uX2lkID09IFNFQ1RJT05fSURfUEFDS0VUID8KKyAgICAgICAgICAgIHdjdHgtPm5iX3NlY3Rpb25fcGFja2V0IDogd2N0eC0+bmJfc2VjdGlvbl9mcmFtZTsKKyAgICB9CisKKyAgICBpZiAod2N0eC0+d3JpdGVyLT5wcmludF9zZWN0aW9uX2hlYWRlcikKKyAgICAgICAgd2N0eC0+d3JpdGVyLT5wcmludF9zZWN0aW9uX2hlYWRlcih3Y3R4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3RlcihXcml0ZXJDb250ZXh0ICp3Y3R4KQoreworICAgIGludCBzZWN0aW9uX2lkID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF0tPmlkOworICAgIGludCBwYXJlbnRfc2VjdGlvbl9pZCA9IHdjdHgtPmxldmVsID8KKyAgICAgICAgd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbC0xXS0+aWQgOiBTRUNUSU9OX0lEX05PTkU7CisKKyAgICBpZiAocGFyZW50X3NlY3Rpb25faWQgIT0gU0VDVElPTl9JRF9OT05FKQorICAgICAgICB3Y3R4LT5uYl9pdGVtW3djdHgtPmxldmVsLTFdKys7CisgICAgaWYgKHBhcmVudF9zZWN0aW9uX2lkID09IFNFQ1RJT05fSURfUEFDS0VUU19BTkRfRlJBTUVTKSB7CisgICAgICAgIGlmIChzZWN0aW9uX2lkID09IFNFQ1RJT05fSURfUEFDS0VUKSB3Y3R4LT5uYl9zZWN0aW9uX3BhY2tldCsrOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjdHgtPm5iX3NlY3Rpb25fZnJhbWUrKzsKKyAgICB9CisgICAgaWYgKHdjdHgtPndyaXRlci0+cHJpbnRfc2VjdGlvbl9mb290ZXIpCisgICAgICAgIHdjdHgtPndyaXRlci0+cHJpbnRfc2VjdGlvbl9mb290ZXIod2N0eCk7CisgICAgd2N0eC0+bGV2ZWwtLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcl9wcmludF9pbnRlZ2VyKFdyaXRlckNvbnRleHQgKndjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5LCBsb25nIGxvbmcgaW50IHZhbCkKK3sKKyAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc2VjdGlvbiA9IHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdOworCisgICAgaWYgKHNlY3Rpb24tPnNob3dfYWxsX2VudHJpZXMgfHwgYXZfZGljdF9nZXQoc2VjdGlvbi0+ZW50cmllc190b19zaG93LCBrZXksIE5VTEwsIDApKSB7CisgICAgICAgIHdjdHgtPndyaXRlci0+cHJpbnRfaW50ZWdlcih3Y3R4LCBrZXksIHZhbCk7CisgICAgICAgIHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWxdKys7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCB2YWxpZGF0ZV9zdHJpbmcoV3JpdGVyQ29udGV4dCAqd2N0eCwgY2hhciAqKmRzdHAsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICBjb25zdCB1aW50OF90ICpwLCAqZW5kcDsKKyAgICBBVkJQcmludCBkc3RidWY7CisgICAgaW50IGludmFsaWRfY2hhcnNfbmIgPSAwLCByZXQgPSAwOworCisgICAgYXZfYnByaW50X2luaXQoJmRzdGJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIGVuZHAgPSBzcmMgKyBzdHJsZW4oc3JjKTsKKyAgICBmb3IgKHAgPSAodWludDhfdCAqKXNyYzsgKnA7KSB7CisgICAgICAgIHVpbnQzMl90IGNvZGU7CisgICAgICAgIGludCBpbnZhbGlkID0gMDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcDAgPSBwOworCisgICAgICAgIGlmIChhdl91dGY4X2RlY29kZSgmY29kZSwgJnAsIGVuZHAsIHdjdHgtPnN0cmluZ192YWxpZGF0aW9uX3V0ZjhfZmxhZ3MpIDwgMCkgeworICAgICAgICAgICAgQVZCUHJpbnQgYnA7CisgICAgICAgICAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIEFWX0JQUklOVF9TSVpFX0FVVE9NQVRJQyk7CisgICAgICAgICAgICBicHJpbnRfYnl0ZXMoJmJwLCBwMCwgcC1wMCk7CisgICAgICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFVURi04IHNlcXVlbmNlICVzIGZvdW5kIGluIHN0cmluZyAnJXMnXG4iLCBicC5zdHIsIHNyYyk7CisgICAgICAgICAgICBpbnZhbGlkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnZhbGlkKSB7CisgICAgICAgICAgICBpbnZhbGlkX2NoYXJzX25iKys7CisKKyAgICAgICAgICAgIHN3aXRjaCAod2N0eC0+c3RyaW5nX3ZhbGlkYXRpb24pIHsKKyAgICAgICAgICAgIGNhc2UgV1JJVEVSX1NUUklOR19WQUxJREFUSU9OX0ZBSUw6CisgICAgICAgICAgICAgICAgYXZfbG9nKHdjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgVVRGLTggc2VxdWVuY2UgZm91bmQgaW4gc3RyaW5nICclcydcbiIsIHNyYyk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBXUklURVJfU1RSSU5HX1ZBTElEQVRJT05fUkVQTEFDRToKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRmKCZkc3RidWYsICIlcyIsIHdjdHgtPnN0cmluZ192YWxpZGF0aW9uX3JlcGxhY2VtZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaW52YWxpZCB8fCB3Y3R4LT5zdHJpbmdfdmFsaWRhdGlvbiA9PSBXUklURVJfU1RSSU5HX1ZBTElEQVRJT05fSUdOT1JFKQorICAgICAgICAgICAgYXZfYnByaW50X2FwcGVuZF9kYXRhKCZkc3RidWYsIHAwLCBwLXAwKTsKKyAgICB9CisKKyAgICBpZiAoaW52YWxpZF9jaGFyc19uYiAmJiB3Y3R4LT5zdHJpbmdfdmFsaWRhdGlvbiA9PSBXUklURVJfU1RSSU5HX1ZBTElEQVRJT05fUkVQTEFDRSkgeworICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiJWQgaW52YWxpZCBVVEYtOCBzZXF1ZW5jZShzKSBmb3VuZCBpbiBzdHJpbmcgJyVzJywgcmVwbGFjZWQgd2l0aCAnJXMnXG4iLAorICAgICAgICAgICAgICAgaW52YWxpZF9jaGFyc19uYiwgc3JjLCB3Y3R4LT5zdHJpbmdfdmFsaWRhdGlvbl9yZXBsYWNlbWVudCk7CisgICAgfQorCitlbmQ6CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZkc3RidWYsIGRzdHApOworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgUFJJTlRfU1RSSU5HX09QVCAgICAgIDEKKyNkZWZpbmUgUFJJTlRfU1RSSU5HX1ZBTElEQVRFIDIKKworc3RhdGljIGlubGluZSBpbnQgd3JpdGVyX3ByaW50X3N0cmluZyhXcml0ZXJDb250ZXh0ICp3Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbCwgaW50IGZsYWdzKQoreworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoKGZsYWdzICYgUFJJTlRfU1RSSU5HX09QVCkKKyAgICAgICAgJiYgISh3Y3R4LT53cml0ZXItPmZsYWdzICYgV1JJVEVSX0ZMQUdfRElTUExBWV9PUFRJT05BTF9GSUVMRFMpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzZWN0aW9uLT5zaG93X2FsbF9lbnRyaWVzIHx8IGF2X2RpY3RfZ2V0KHNlY3Rpb24tPmVudHJpZXNfdG9fc2hvdywga2V5LCBOVUxMLCAwKSkgeworICAgICAgICBpZiAoZmxhZ3MgJiBQUklOVF9TVFJJTkdfVkFMSURBVEUpIHsKKyAgICAgICAgICAgIGNoYXIgKmtleTEgPSBOVUxMLCAqdmFsMSA9IE5VTEw7CisgICAgICAgICAgICByZXQgPSB2YWxpZGF0ZV9zdHJpbmcod2N0eCwgJmtleTEsIGtleSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgZ290byBlbmQ7CisgICAgICAgICAgICByZXQgPSB2YWxpZGF0ZV9zdHJpbmcod2N0eCwgJnZhbDEsIHZhbCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgZ290byBlbmQ7CisgICAgICAgICAgICB3Y3R4LT53cml0ZXItPnByaW50X3N0cmluZyh3Y3R4LCBrZXkxLCB2YWwxKTsKKyAgICAgICAgZW5kOgorICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBrZXk9dmFsdWUgc3RyaW5nIGNvbWJpbmF0aW9uICVzPSVzIGluIHNlY3Rpb24gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGtleSwgdmFsLCBzZWN0aW9uLT51bmlxdWVfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mcmVlKGtleTEpOworICAgICAgICAgICAgYXZfZnJlZSh2YWwxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdjdHgtPndyaXRlci0+cHJpbnRfc3RyaW5nKHdjdHgsIGtleSwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWxdKys7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlcl9wcmludF9yYXRpb25hbChXcml0ZXJDb250ZXh0ICp3Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICprZXksIEFWUmF0aW9uYWwgcSwgY2hhciBzZXApCit7CisgICAgQVZCUHJpbnQgYnVmOworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIEFWX0JQUklOVF9TSVpFX0FVVE9NQVRJQyk7CisgICAgYXZfYnByaW50ZigmYnVmLCAiJWQlYyVkIiwgcS5udW0sIHNlcCwgcS5kZW4pOworICAgIHdyaXRlcl9wcmludF9zdHJpbmcod2N0eCwga2V5LCBidWYuc3RyLCAwKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVyX3ByaW50X3RpbWUoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0cywgY29uc3QgQVZSYXRpb25hbCAqdGltZV9iYXNlLCBpbnQgaXNfZHVyYXRpb24pCit7CisgICAgY2hhciBidWZbMTI4XTsKKworICAgIGlmICgoIWlzX2R1cmF0aW9uICYmIHRzID09IEFWX05PUFRTX1ZBTFVFKSB8fCAoaXNfZHVyYXRpb24gJiYgdHMgPT0gMCkpIHsKKyAgICAgICAgd3JpdGVyX3ByaW50X3N0cmluZyh3Y3R4LCBrZXksICJOL0EiLCBQUklOVF9TVFJJTkdfT1BUKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkb3VibGUgZCA9IHRzICogYXZfcTJkKCp0aW1lX2Jhc2UpOworICAgICAgICBzdHJ1Y3QgdW5pdF92YWx1ZSB1djsKKyAgICAgICAgdXYudmFsLmQgPSBkOworICAgICAgICB1di51bml0ID0gdW5pdF9zZWNvbmRfc3RyOworICAgICAgICB2YWx1ZV9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgdXYpOworICAgICAgICB3cml0ZXJfcHJpbnRfc3RyaW5nKHdjdHgsIGtleSwgYnVmLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlcl9wcmludF90cyhXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdHMsIGludCBpc19kdXJhdGlvbikKK3sKKyAgICBpZiAoKCFpc19kdXJhdGlvbiAmJiB0cyA9PSBBVl9OT1BUU19WQUxVRSkgfHwgKGlzX2R1cmF0aW9uICYmIHRzID09IDApKSB7CisgICAgICAgIHdyaXRlcl9wcmludF9zdHJpbmcod2N0eCwga2V5LCAiTi9BIiwgUFJJTlRfU1RSSU5HX09QVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd3JpdGVyX3ByaW50X2ludGVnZXIod2N0eCwga2V5LCB0cyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB3cml0ZXJfcHJpbnRfZGF0YShXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgaW50IHNpemUpCit7CisgICAgQVZCUHJpbnQgYnA7CisgICAgaW50IG9mZnNldCA9IDAsIGwsIGk7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgYXZfYnByaW50ZigmYnAsICJcbiIpOworICAgIHdoaWxlIChzaXplKSB7CisgICAgICAgIGF2X2JwcmludGYoJmJwLCAiJTA4eDogIiwgb2Zmc2V0KTsKKyAgICAgICAgbCA9IEZGTUlOKHNpemUsIDE2KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgICAgICAgICAgYXZfYnByaW50ZigmYnAsICIlMDJ4IiwgZGF0YVtpXSk7CisgICAgICAgICAgICBpZiAoaSAmIDEpCisgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmYnAsICIgIik7CisgICAgICAgIH0KKyAgICAgICAgYXZfYnByaW50X2NoYXJzKCZicCwgJyAnLCA0MSAtIDIgKiBpIC0gaSAvIDIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKQorICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKCZicCwgZGF0YVtpXSAtIDMyVSA8IDk1ID8gZGF0YVtpXSA6ICcuJywgMSk7CisgICAgICAgIGF2X2JwcmludGYoJmJwLCAiXG4iKTsKKyAgICAgICAgb2Zmc2V0ICs9IGw7CisgICAgICAgIGRhdGEgICArPSBsOworICAgICAgICBzaXplICAgLT0gbDsKKyAgICB9CisgICAgd3JpdGVyX3ByaW50X3N0cmluZyh3Y3R4LCBuYW1lLCBicC5zdHIsIDApOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnAsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZXJfcHJpbnRfZGF0YV9oYXNoKFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQoreworICAgIGNoYXIgKnAsIGJ1ZltBVl9IQVNIX01BWF9TSVpFICogMiArIDY0XSA9IHsgMCB9OworCisgICAgaWYgKCFoYXNoKQorICAgICAgICByZXR1cm47CisgICAgYXZfaGFzaF9pbml0KGhhc2gpOworICAgIGF2X2hhc2hfdXBkYXRlKGhhc2gsIGRhdGEsIHNpemUpOworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlczoiLCBhdl9oYXNoX2dldF9uYW1lKGhhc2gpKTsKKyAgICBwID0gYnVmICsgc3RybGVuKGJ1Zik7CisgICAgYXZfaGFzaF9maW5hbF9oZXgoaGFzaCwgcCwgYnVmICsgc2l6ZW9mKGJ1ZikgLSBwKTsKKyAgICB3cml0ZXJfcHJpbnRfc3RyaW5nKHdjdHgsIG5hbWUsIGJ1ZiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlcl9wcmludF9pbnRlZ2VycyhXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsIGludCBzaXplLCBjb25zdCBjaGFyICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbnMsIGludCBieXRlcywgaW50IG9mZnNldF9hZGQpCit7CisgICAgQVZCUHJpbnQgYnA7CisgICAgaW50IG9mZnNldCA9IDAsIGwsIGk7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgYXZfYnByaW50ZigmYnAsICJcbiIpOworICAgIHdoaWxlIChzaXplKSB7CisgICAgICAgIGF2X2JwcmludGYoJmJwLCAiJTA4eDogIiwgb2Zmc2V0KTsKKyAgICAgICAgbCA9IEZGTUlOKHNpemUsIGNvbHVtbnMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKSB7CisgICAgICAgICAgICBpZiAgICAgIChieXRlcyA9PSAxKSBhdl9icHJpbnRmKCZicCwgZm9ybWF0LCAqZGF0YSk7CisgICAgICAgICAgICBlbHNlIGlmIChieXRlcyA9PSAyKSBhdl9icHJpbnRmKCZicCwgZm9ybWF0LCBBVl9STjE2KGRhdGEpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJ5dGVzID09IDQpIGF2X2JwcmludGYoJmJwLCBmb3JtYXQsIEFWX1JOMzIoZGF0YSkpOworICAgICAgICAgICAgZGF0YSArPSBieXRlczsKKyAgICAgICAgICAgIHNpemUgLS07CisgICAgICAgIH0KKyAgICAgICAgYXZfYnByaW50ZigmYnAsICJcbiIpOworICAgICAgICBvZmZzZXQgKz0gb2Zmc2V0X2FkZDsKKyAgICB9CisgICAgd3JpdGVyX3ByaW50X3N0cmluZyh3Y3R4LCBuYW1lLCBicC5zdHIsIDApOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnAsIE5VTEwpOworfQorCisjZGVmaW5lIE1BWF9SRUdJU1RFUkVEX1dSSVRFUlNfTkIgNjQKKworc3RhdGljIGNvbnN0IFdyaXRlciAqcmVnaXN0ZXJlZF93cml0ZXJzW01BWF9SRUdJU1RFUkVEX1dSSVRFUlNfTkIgKyAxXTsKKworc3RhdGljIGludCB3cml0ZXJfcmVnaXN0ZXIoY29uc3QgV3JpdGVyICp3cml0ZXIpCit7CisgICAgc3RhdGljIGludCBuZXh0X3JlZ2lzdGVyZWRfd3JpdGVyX2lkeCA9IDA7CisKKyAgICBpZiAobmV4dF9yZWdpc3RlcmVkX3dyaXRlcl9pZHggPT0gTUFYX1JFR0lTVEVSRURfV1JJVEVSU19OQikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJlZ2lzdGVyZWRfd3JpdGVyc1tuZXh0X3JlZ2lzdGVyZWRfd3JpdGVyX2lkeCsrXSA9IHdyaXRlcjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IFdyaXRlciAqd3JpdGVyX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyByZWdpc3RlcmVkX3dyaXRlcnNbaV07IGkrKykKKyAgICAgICAgaWYgKCFzdHJjbXAocmVnaXN0ZXJlZF93cml0ZXJzW2ldLT5uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiByZWdpc3RlcmVkX3dyaXRlcnNbaV07CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvKiBXUklURVJTICovCisKKyNkZWZpbmUgREVGSU5FX1dSSVRFUl9DTEFTUyhuYW1lKSAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgY29uc3QgY2hhciAqbmFtZSMjX2dldF9uYW1lKHZvaWQgKmN0eCkgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gI25hbWUgOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IEFWQ2xhc3MgbmFtZSMjX2NsYXNzID0geyAgICAgICAgICAgICAgIFwKKyAgICAuY2xhc3NfbmFtZSA9ICNuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLml0ZW1fbmFtZSAgPSBuYW1lIyNfZ2V0X25hbWUsICAgICAgICAgICAgICAgICAgXAorICAgIC5vcHRpb24gICAgID0gbmFtZSMjX29wdGlvbnMgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyogRGVmYXVsdCBvdXRwdXQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgRGVmYXVsdENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBub2tleTsKKyAgICBpbnQgbm9wcmludF93cmFwcGVyczsKKyAgICBpbnQgbmVzdGVkX3NlY3Rpb25bU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsKK30gRGVmYXVsdENvbnRleHQ7CisKKyN1bmRlZiBPRkZTRVQKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERlZmF1bHRDb250ZXh0LCB4KQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZGVmYXVsdF9vcHRpb25zW10gPSB7CisgICAgeyAibm9wcmludF93cmFwcGVycyIsICJkbyBub3QgcHJpbnQgaGVhZGVycyBhbmQgZm9vdGVycyIsIE9GRlNFVChub3ByaW50X3dyYXBwZXJzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEgfSwKKyAgICB7ICJudyIsICAgICAgICAgICAgICAgImRvIG5vdCBwcmludCBoZWFkZXJzIGFuZCBmb290ZXJzIiwgT0ZGU0VUKG5vcHJpbnRfd3JhcHBlcnMpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSB9LAorICAgIHsgIm5va2V5IiwgICAgICAgICAgImZvcmNlIG5vIGtleSBwcmludGluZyIsICAgICBPRkZTRVQobm9rZXkpLCAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSB9LAorICAgIHsgIm5rIiwgICAgICAgICAgICAgImZvcmNlIG5vIGtleSBwcmludGluZyIsICAgICBPRkZTRVQobm9rZXkpLCAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSB9LAorICAgIHtOVUxMfSwKK307CisKK0RFRklORV9XUklURVJfQ0xBU1MoZGVmYXVsdCk7CisKKy8qIGxhbWUgdXBwZXJjYXNpbmcgcm91dGluZSwgYXNzdW1lcyB0aGUgc3RyaW5nIGlzIGxvd2VyIGNhc2UgQVNDSUkgKi8KK3N0YXRpYyBpbmxpbmUgY2hhciAqdXBjYXNlX3N0cmluZyhjaGFyICpkc3QsIHNpemVfdCBkc3Rfc2l6ZSwgY29uc3QgY2hhciAqc3JjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IHNyY1tpXSAmJiBpIDwgZHN0X3NpemUtMTsgaSsrKQorICAgICAgICBkc3RbaV0gPSBhdl90b3VwcGVyKHNyY1tpXSk7CisgICAgZHN0W2ldID0gMDsKKyAgICByZXR1cm4gZHN0OworfQorCitzdGF0aWMgdm9pZCBkZWZhdWx0X3ByaW50X3NlY3Rpb25faGVhZGVyKFdyaXRlckNvbnRleHQgKndjdHgpCit7CisgICAgRGVmYXVsdENvbnRleHQgKmRlZiA9IHdjdHgtPnByaXY7CisgICAgY2hhciBidWZbMzJdOworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07CisgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnBhcmVudF9zZWN0aW9uID0gd2N0eC0+bGV2ZWwgPworICAgICAgICB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsLTFdIDogTlVMTDsKKworICAgIGF2X2JwcmludF9jbGVhcigmd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXSk7CisgICAgaWYgKHBhcmVudF9zZWN0aW9uICYmCisgICAgICAgICEocGFyZW50X3NlY3Rpb24tPmZsYWdzICYgKFNFQ1RJT05fRkxBR19JU19XUkFQUEVSfFNFQ1RJT05fRkxBR19JU19BUlJBWSkpKSB7CisgICAgICAgIGRlZi0+bmVzdGVkX3NlY3Rpb25bd2N0eC0+bGV2ZWxdID0gMTsKKyAgICAgICAgYXZfYnByaW50Zigmd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXSwgIiVzJXM6IiwKKyAgICAgICAgICAgICAgICAgICB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWwtMV0uc3RyLAorICAgICAgICAgICAgICAgICAgIHVwY2FzZV9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3hfaWZfbnVsbChzZWN0aW9uLT5lbGVtZW50X25hbWUsIHNlY3Rpb24tPm5hbWUpKSk7CisgICAgfQorCisgICAgaWYgKGRlZi0+bm9wcmludF93cmFwcGVycyB8fCBkZWYtPm5lc3RlZF9zZWN0aW9uW3djdHgtPmxldmVsXSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCEoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDVElPTl9GTEFHX0lTX1dSQVBQRVJ8U0VDVElPTl9GTEFHX0lTX0FSUkFZKSkpCisgICAgICAgIHByaW50ZigiWyVzXVxuIiwgdXBjYXNlX3N0cmluZyhidWYsIHNpemVvZihidWYpLCBzZWN0aW9uLT5uYW1lKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfcHJpbnRfc2VjdGlvbl9mb290ZXIoV3JpdGVyQ29udGV4dCAqd2N0eCkKK3sKKyAgICBEZWZhdWx0Q29udGV4dCAqZGVmID0gd2N0eC0+cHJpdjsKKyAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc2VjdGlvbiA9IHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdOworICAgIGNoYXIgYnVmWzMyXTsKKworICAgIGlmIChkZWYtPm5vcHJpbnRfd3JhcHBlcnMgfHwgZGVmLT5uZXN0ZWRfc2VjdGlvblt3Y3R4LT5sZXZlbF0pCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghKHNlY3Rpb24tPmZsYWdzICYgKFNFQ1RJT05fRkxBR19JU19XUkFQUEVSfFNFQ1RJT05fRkxBR19JU19BUlJBWSkpKQorICAgICAgICBwcmludGYoIlsvJXNdXG4iLCB1cGNhc2Vfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHNlY3Rpb24tPm5hbWUpKTsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9wcmludF9zdHIoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBEZWZhdWx0Q29udGV4dCAqZGVmID0gd2N0eC0+cHJpdjsKKworICAgIGlmICghZGVmLT5ub2tleSkKKyAgICAgICAgcHJpbnRmKCIlcyVzPSIsIHdjdHgtPnNlY3Rpb25fcGJ1Zlt3Y3R4LT5sZXZlbF0uc3RyLCBrZXkpOworICAgIHByaW50ZigiJXNcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgZGVmYXVsdF9wcmludF9pbnQoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBsb25nIGxvbmcgaW50IHZhbHVlKQoreworICAgIERlZmF1bHRDb250ZXh0ICpkZWYgPSB3Y3R4LT5wcml2OworCisgICAgaWYgKCFkZWYtPm5va2V5KQorICAgICAgICBwcmludGYoIiVzJXM9Iiwgd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXS5zdHIsIGtleSk7CisgICAgcHJpbnRmKCIlbGxkXG4iLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBXcml0ZXIgZGVmYXVsdF93cml0ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAucHJpdl9zaXplICAgICAgICAgICAgID0gc2l6ZW9mKERlZmF1bHRDb250ZXh0KSwKKyAgICAucHJpbnRfc2VjdGlvbl9oZWFkZXIgID0gZGVmYXVsdF9wcmludF9zZWN0aW9uX2hlYWRlciwKKyAgICAucHJpbnRfc2VjdGlvbl9mb290ZXIgID0gZGVmYXVsdF9wcmludF9zZWN0aW9uX2Zvb3RlciwKKyAgICAucHJpbnRfaW50ZWdlciAgICAgICAgID0gZGVmYXVsdF9wcmludF9pbnQsCisgICAgLnByaW50X3N0cmluZyAgICAgICAgICA9IGRlZmF1bHRfcHJpbnRfc3RyLAorICAgIC5mbGFncyA9IFdSSVRFUl9GTEFHX0RJU1BMQVlfT1BUSU9OQUxfRklFTERTLAorICAgIC5wcml2X2NsYXNzICAgICAgICAgICAgPSAmZGVmYXVsdF9jbGFzcywKK307CisKKy8qIENvbXBhY3Qgb3V0cHV0ICovCisKKy8qKgorICogQXBwbHkgQy1sYW5ndWFnZS1saWtlIHN0cmluZyBlc2NhcGluZy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNfZXNjYXBlX3N0cihBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgc2VwLCB2b2lkICpsb2dfY3R4KQoreworICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICBmb3IgKHAgPSBzcmM7ICpwOyBwKyspIHsKKyAgICAgICAgc3dpdGNoICgqcCkgeworICAgICAgICBjYXNlICdcYic6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiXFxiIik7ICBicmVhazsKKyAgICAgICAgY2FzZSAnXGYnOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcZiIpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xuJzogYXZfYnByaW50Zihkc3QsICIlcyIsICJcXG4iKTsgIGJyZWFrOworICAgICAgICBjYXNlICdccic6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiXFxyIik7ICBicmVhazsKKyAgICAgICAgY2FzZSAnXFwnOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcXFwiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoKnAgPT0gc2VwKQorICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICdcXCcsIDEpOworICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgKnAsIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkc3QtPnN0cjsKK30KKworLyoqCisgKiBRdW90ZSBmaWVsZHMgY29udGFpbmluZyBzcGVjaWFsIGNoYXJhY3RlcnMsIGNoZWNrIFJGQzQxODAuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjc3ZfZXNjYXBlX3N0cihBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgc2VwLCB2b2lkICpsb2dfY3R4KQoreworICAgIGNoYXIgbWV0YV9jaGFyc1tdID0geyBzZXAsICciJywgJ1xuJywgJ1xyJywgJ1wwJyB9OworICAgIGludCBuZWVkc19xdW90aW5nID0gISFzcmNbc3RyY3NwbihzcmMsIG1ldGFfY2hhcnMpXTsKKworICAgIGlmIChuZWVkc19xdW90aW5nKQorICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0LCAnIicsIDEpOworCisgICAgZm9yICg7ICpzcmM7IHNyYysrKSB7CisgICAgICAgIGlmICgqc3JjID09ICciJykKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICciJywgMSk7CisgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICpzcmMsIDEpOworICAgIH0KKyAgICBpZiAobmVlZHNfcXVvdGluZykKKyAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgJyInLCAxKTsKKyAgICByZXR1cm4gZHN0LT5zdHI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpub25lX2VzY2FwZV9zdHIoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyIHNlcCwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICByZXR1cm4gc3JjOworfQorCit0eXBlZGVmIHN0cnVjdCBDb21wYWN0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY2hhciAqaXRlbV9zZXBfc3RyOworICAgIGNoYXIgaXRlbV9zZXA7CisgICAgaW50IG5va2V5OworICAgIGludCBwcmludF9zZWN0aW9uOworICAgIGNoYXIgKmVzY2FwZV9tb2RlX3N0cjsKKyAgICBjb25zdCBjaGFyICogKCplc2NhcGVfc3RyKShBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgc2VwLCB2b2lkICpsb2dfY3R4KTsKKyAgICBpbnQgbmVzdGVkX3NlY3Rpb25bU0VDVElPTl9NQVhfTkJfTEVWRUxTXTsKKyAgICBpbnQgaGFzX25lc3RlZF9lbGVtc1tTRUNUSU9OX01BWF9OQl9MRVZFTFNdOworICAgIGludCB0ZXJtaW5hdGVfbGluZVtTRUNUSU9OX01BWF9OQl9MRVZFTFNdOworfSBDb21wYWN0Q29udGV4dDsKKworI3VuZGVmIE9GRlNFVAorI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ29tcGFjdENvbnRleHQsIHgpCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjb21wYWN0X29wdGlvbnNbXT0geworICAgIHsiaXRlbV9zZXAiLCAic2V0IGl0ZW0gc2VwYXJhdG9yIiwgICAgT0ZGU0VUKGl0ZW1fc2VwX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9InwifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAorICAgIHsicyIsICAgICAgICAic2V0IGl0ZW0gc2VwYXJhdG9yIiwgICAgT0ZGU0VUKGl0ZW1fc2VwX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9InwifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAorICAgIHsibm9rZXkiLCAgICAiZm9yY2Ugbm8ga2V5IHByaW50aW5nIiwgT0ZGU0VUKG5va2V5KSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MH0sICAgIDAsICAgICAgICAxICAgICAgICB9LAorICAgIHsibmsiLCAgICAgICAiZm9yY2Ugbm8ga2V5IHByaW50aW5nIiwgT0ZGU0VUKG5va2V5KSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MH0sICAgIDAsICAgICAgICAxICAgICAgICB9LAorICAgIHsiZXNjYXBlIiwgICAic2V0IGVzY2FwZSBtb2RlIiwgICAgICAgT0ZGU0VUKGVzY2FwZV9tb2RlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImMifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAorICAgIHsiZSIsICAgICAgICAic2V0IGVzY2FwZSBtb2RlIiwgICAgICAgT0ZGU0VUKGVzY2FwZV9tb2RlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImMifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAorICAgIHsicHJpbnRfc2VjdGlvbiIsICJwcmludCBzZWN0aW9uIG5hbWUiLCBPRkZTRVQocHJpbnRfc2VjdGlvbiksIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgIDAsICAgICAgICAxICAgICAgICB9LAorICAgIHsicCIsICAgICAgICAgICAgICJwcmludCBzZWN0aW9uIG5hbWUiLCBPRkZTRVQocHJpbnRfc2VjdGlvbiksIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgIDAsICAgICAgICAxICAgICAgICB9LAorICAgIHtOVUxMfSwKK307CisKK0RFRklORV9XUklURVJfQ0xBU1MoY29tcGFjdCk7CisKK3N0YXRpYyBhdl9jb2xkIGludCBjb21wYWN0X2luaXQoV3JpdGVyQ29udGV4dCAqd2N0eCkKK3sKKyAgICBDb21wYWN0Q29udGV4dCAqY29tcGFjdCA9IHdjdHgtPnByaXY7CisKKyAgICBpZiAoc3RybGVuKGNvbXBhY3QtPml0ZW1fc2VwX3N0cikgIT0gMSkgeworICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLCAiSXRlbSBzZXBhcmF0b3IgJyVzJyBzcGVjaWZpZWQsIGJ1dCBtdXN0IGNvbnRhaW4gYSBzaW5nbGUgY2hhcmFjdGVyXG4iLAorICAgICAgICAgICAgICAgY29tcGFjdC0+aXRlbV9zZXBfc3RyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgY29tcGFjdC0+aXRlbV9zZXAgPSBjb21wYWN0LT5pdGVtX3NlcF9zdHJbMF07CisKKyAgICBpZiAgICAgICghc3RyY21wKGNvbXBhY3QtPmVzY2FwZV9tb2RlX3N0ciwgIm5vbmUiKSkgY29tcGFjdC0+ZXNjYXBlX3N0ciA9IG5vbmVfZXNjYXBlX3N0cjsKKyAgICBlbHNlIGlmICghc3RyY21wKGNvbXBhY3QtPmVzY2FwZV9tb2RlX3N0ciwgImMiICAgKSkgY29tcGFjdC0+ZXNjYXBlX3N0ciA9IGNfZXNjYXBlX3N0cjsKKyAgICBlbHNlIGlmICghc3RyY21wKGNvbXBhY3QtPmVzY2FwZV9tb2RlX3N0ciwgImNzdiIgKSkgY29tcGFjdC0+ZXNjYXBlX3N0ciA9IGNzdl9lc2NhcGVfc3RyOworICAgIGVsc2UgeworICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBlc2NhcGUgbW9kZSAnJXMnXG4iLCBjb21wYWN0LT5lc2NhcGVfbW9kZV9zdHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb21wYWN0X3ByaW50X3NlY3Rpb25faGVhZGVyKFdyaXRlckNvbnRleHQgKndjdHgpCit7CisgICAgQ29tcGFjdENvbnRleHQgKmNvbXBhY3QgPSB3Y3R4LT5wcml2OworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07CisgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnBhcmVudF9zZWN0aW9uID0gd2N0eC0+bGV2ZWwgPworICAgICAgICB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsLTFdIDogTlVMTDsKKyAgICBjb21wYWN0LT50ZXJtaW5hdGVfbGluZVt3Y3R4LT5sZXZlbF0gPSAxOworICAgIGNvbXBhY3QtPmhhc19uZXN0ZWRfZWxlbXNbd2N0eC0+bGV2ZWxdID0gMDsKKworICAgIGF2X2JwcmludF9jbGVhcigmd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXSk7CisgICAgaWYgKCEoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpICYmIHBhcmVudF9zZWN0aW9uICYmCisgICAgICAgICEocGFyZW50X3NlY3Rpb24tPmZsYWdzICYgKFNFQ1RJT05fRkxBR19JU19XUkFQUEVSfFNFQ1RJT05fRkxBR19JU19BUlJBWSkpKSB7CisgICAgICAgIGNvbXBhY3QtPm5lc3RlZF9zZWN0aW9uW3djdHgtPmxldmVsXSA9IDE7CisgICAgICAgIGNvbXBhY3QtPmhhc19uZXN0ZWRfZWxlbXNbd2N0eC0+bGV2ZWwtMV0gPSAxOworICAgICAgICBhdl9icHJpbnRmKCZ3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdLCAiJXMlczoiLAorICAgICAgICAgICAgICAgICAgIHdjdHgtPnNlY3Rpb25fcGJ1Zlt3Y3R4LT5sZXZlbC0xXS5zdHIsCisgICAgICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoc2VjdGlvbi0+ZWxlbWVudF9uYW1lLCBzZWN0aW9uLT5uYW1lKSk7CisgICAgICAgIHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWxdID0gd2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbC0xXTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocGFyZW50X3NlY3Rpb24gJiYgY29tcGFjdC0+aGFzX25lc3RlZF9lbGVtc1t3Y3R4LT5sZXZlbC0xXSAmJgorICAgICAgICAgICAgKHNlY3Rpb24tPmZsYWdzICYgU0VDVElPTl9GTEFHX0lTX0FSUkFZKSkgeworICAgICAgICAgICAgY29tcGFjdC0+dGVybWluYXRlX2xpbmVbd2N0eC0+bGV2ZWwtMV0gPSAwOworICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb21wYWN0LT5wcmludF9zZWN0aW9uICYmCisgICAgICAgICAgICAhKHNlY3Rpb24tPmZsYWdzICYgKFNFQ1RJT05fRkxBR19JU19XUkFQUEVSfFNFQ1RJT05fRkxBR19JU19BUlJBWSkpKQorICAgICAgICAgICAgcHJpbnRmKCIlcyVjIiwgc2VjdGlvbi0+bmFtZSwgY29tcGFjdC0+aXRlbV9zZXApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29tcGFjdF9wcmludF9zZWN0aW9uX2Zvb3RlcihXcml0ZXJDb250ZXh0ICp3Y3R4KQoreworICAgIENvbXBhY3RDb250ZXh0ICpjb21wYWN0ID0gd2N0eC0+cHJpdjsKKworICAgIGlmICghY29tcGFjdC0+bmVzdGVkX3NlY3Rpb25bd2N0eC0+bGV2ZWxdICYmCisgICAgICAgIGNvbXBhY3QtPnRlcm1pbmF0ZV9saW5lW3djdHgtPmxldmVsXSAmJgorICAgICAgICAhKHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdLT5mbGFncyAmIChTRUNUSU9OX0ZMQUdfSVNfV1JBUFBFUnxTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpKSkKKyAgICAgICAgcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBjb21wYWN0X3ByaW50X3N0cihXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIENvbXBhY3RDb250ZXh0ICpjb21wYWN0ID0gd2N0eC0+cHJpdjsKKyAgICBBVkJQcmludCBidWY7CisKKyAgICBpZiAod2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0pIHByaW50ZigiJWMiLCBjb21wYWN0LT5pdGVtX3NlcCk7CisgICAgaWYgKCFjb21wYWN0LT5ub2tleSkKKyAgICAgICAgcHJpbnRmKCIlcyVzPSIsIHdjdHgtPnNlY3Rpb25fcGJ1Zlt3Y3R4LT5sZXZlbF0uc3RyLCBrZXkpOworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgcHJpbnRmKCIlcyIsIGNvbXBhY3QtPmVzY2FwZV9zdHIoJmJ1ZiwgdmFsdWUsIGNvbXBhY3QtPml0ZW1fc2VwLCB3Y3R4KSk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjb21wYWN0X3ByaW50X2ludChXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICprZXksIGxvbmcgbG9uZyBpbnQgdmFsdWUpCit7CisgICAgQ29tcGFjdENvbnRleHQgKmNvbXBhY3QgPSB3Y3R4LT5wcml2OworCisgICAgaWYgKHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWxdKSBwcmludGYoIiVjIiwgY29tcGFjdC0+aXRlbV9zZXApOworICAgIGlmICghY29tcGFjdC0+bm9rZXkpCisgICAgICAgIHByaW50ZigiJXMlcz0iLCB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdLnN0ciwga2V5KTsKKyAgICBwcmludGYoIiVsbGQiLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBjb25zdCBXcml0ZXIgY29tcGFjdF93cml0ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgID0gImNvbXBhY3QiLAorICAgIC5wcml2X3NpemUgICAgICAgICAgICA9IHNpemVvZihDb21wYWN0Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgID0gY29tcGFjdF9pbml0LAorICAgIC5wcmludF9zZWN0aW9uX2hlYWRlciA9IGNvbXBhY3RfcHJpbnRfc2VjdGlvbl9oZWFkZXIsCisgICAgLnByaW50X3NlY3Rpb25fZm9vdGVyID0gY29tcGFjdF9wcmludF9zZWN0aW9uX2Zvb3RlciwKKyAgICAucHJpbnRfaW50ZWdlciAgICAgICAgPSBjb21wYWN0X3ByaW50X2ludCwKKyAgICAucHJpbnRfc3RyaW5nICAgICAgICAgPSBjb21wYWN0X3ByaW50X3N0ciwKKyAgICAuZmxhZ3MgPSBXUklURVJfRkxBR19ESVNQTEFZX09QVElPTkFMX0ZJRUxEUywKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgPSAmY29tcGFjdF9jbGFzcywKK307CisKKy8qIENTViBvdXRwdXQgKi8KKworI3VuZGVmIE9GRlNFVAorI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ29tcGFjdENvbnRleHQsIHgpCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjc3Zfb3B0aW9uc1tdID0geworICAgIHsiaXRlbV9zZXAiLCAic2V0IGl0ZW0gc2VwYXJhdG9yIiwgICAgT0ZGU0VUKGl0ZW1fc2VwX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IiwifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAorICAgIHsicyIsICAgICAgICAic2V0IGl0ZW0gc2VwYXJhdG9yIiwgICAgT0ZGU0VUKGl0ZW1fc2VwX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IiwifSwgIENIQVJfTUlOLCBDSEFSX01BWCB9LAorICAgIHsibm9rZXkiLCAgICAiZm9yY2Ugbm8ga2V5IHByaW50aW5nIiwgT0ZGU0VUKG5va2V5KSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgIDAsICAgICAgICAxICAgICAgICB9LAorICAgIHsibmsiLCAgICAgICAiZm9yY2Ugbm8ga2V5IHByaW50aW5nIiwgT0ZGU0VUKG5va2V5KSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgIDAsICAgICAgICAxICAgICAgICB9LAorICAgIHsiZXNjYXBlIiwgICAic2V0IGVzY2FwZSBtb2RlIiwgICAgICAgT0ZGU0VUKGVzY2FwZV9tb2RlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9ImNzdiJ9LCBDSEFSX01JTiwgQ0hBUl9NQVggfSwKKyAgICB7ImUiLCAgICAgICAgInNldCBlc2NhcGUgbW9kZSIsICAgICAgIE9GRlNFVChlc2NhcGVfbW9kZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJjc3YifSwgQ0hBUl9NSU4sIENIQVJfTUFYIH0sCisgICAgeyJwcmludF9zZWN0aW9uIiwgInByaW50IHNlY3Rpb24gbmFtZSIsIE9GRlNFVChwcmludF9zZWN0aW9uKSwgQVZfT1BUX1RZUEVfQk9PTCwgICB7Lmk2ND0xfSwgICAgMCwgICAgICAgIDEgICAgICAgIH0sCisgICAgeyJwIiwgICAgICAgICAgICAgInByaW50IHNlY3Rpb24gbmFtZSIsIE9GRlNFVChwcmludF9zZWN0aW9uKSwgQVZfT1BUX1RZUEVfQk9PTCwgICB7Lmk2ND0xfSwgICAgMCwgICAgICAgIDEgICAgICAgIH0sCisgICAge05VTEx9LAorfTsKKworREVGSU5FX1dSSVRFUl9DTEFTUyhjc3YpOworCitzdGF0aWMgY29uc3QgV3JpdGVyIGNzdl93cml0ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgID0gImNzdiIsCisgICAgLnByaXZfc2l6ZSAgICAgICAgICAgID0gc2l6ZW9mKENvbXBhY3RDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBjb21wYWN0X2luaXQsCisgICAgLnByaW50X3NlY3Rpb25faGVhZGVyID0gY29tcGFjdF9wcmludF9zZWN0aW9uX2hlYWRlciwKKyAgICAucHJpbnRfc2VjdGlvbl9mb290ZXIgPSBjb21wYWN0X3ByaW50X3NlY3Rpb25fZm9vdGVyLAorICAgIC5wcmludF9pbnRlZ2VyICAgICAgICA9IGNvbXBhY3RfcHJpbnRfaW50LAorICAgIC5wcmludF9zdHJpbmcgICAgICAgICA9IGNvbXBhY3RfcHJpbnRfc3RyLAorICAgIC5mbGFncyA9IFdSSVRFUl9GTEFHX0RJU1BMQVlfT1BUSU9OQUxfRklFTERTLAorICAgIC5wcml2X2NsYXNzICAgICAgICAgICA9ICZjc3ZfY2xhc3MsCit9OworCisvKiBGbGF0IG91dHB1dCAqLworCit0eXBlZGVmIHN0cnVjdCBGbGF0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY29uc3QgY2hhciAqc2VwX3N0cjsKKyAgICBjaGFyIHNlcDsKKyAgICBpbnQgaGllcmFyY2hpY2FsOworfSBGbGF0Q29udGV4dDsKKworI3VuZGVmIE9GRlNFVAorI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRmxhdENvbnRleHQsIHgpCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmbGF0X29wdGlvbnNbXT0geworICAgIHsic2VwX2NoYXIiLCAic2V0IHNlcGFyYXRvciIsICAgIE9GRlNFVChzZXBfc3RyKSwgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iLiJ9LCAgQ0hBUl9NSU4sIENIQVJfTUFYIH0sCisgICAgeyJzIiwgICAgICAgICJzZXQgc2VwYXJhdG9yIiwgICAgT0ZGU0VUKHNlcF9zdHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIuIn0sICBDSEFSX01JTiwgQ0hBUl9NQVggfSwKKyAgICB7ImhpZXJhcmNoaWNhbCIsICJzcGVjaWZ5IGlmIHRoZSBzZWN0aW9uIHNwZWNpZmljYXRpb24gc2hvdWxkIGJlIGhpZXJhcmNoaWNhbCIsIE9GRlNFVChoaWVyYXJjaGljYWwpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0xfSwgMCwgMSB9LAorICAgIHsiaCIsICAgICAgICAgICAgInNwZWNpZnkgaWYgdGhlIHNlY3Rpb24gc3BlY2lmaWNhdGlvbiBzaG91bGQgYmUgaGllcmFyY2hpY2FsIiwgT0ZGU0VUKGhpZXJhcmNoaWNhbCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTF9LCAwLCAxIH0sCisgICAge05VTEx9LAorfTsKKworREVGSU5FX1dSSVRFUl9DTEFTUyhmbGF0KTsKKworc3RhdGljIGF2X2NvbGQgaW50IGZsYXRfaW5pdChXcml0ZXJDb250ZXh0ICp3Y3R4KQoreworICAgIEZsYXRDb250ZXh0ICpmbGF0ID0gd2N0eC0+cHJpdjsKKworICAgIGlmIChzdHJsZW4oZmxhdC0+c2VwX3N0cikgIT0gMSkgeworICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLCAiSXRlbSBzZXBhcmF0b3IgJyVzJyBzcGVjaWZpZWQsIGJ1dCBtdXN0IGNvbnRhaW4gYSBzaW5nbGUgY2hhcmFjdGVyXG4iLAorICAgICAgICAgICAgICAgZmxhdC0+c2VwX3N0cik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGZsYXQtPnNlcCA9IGZsYXQtPnNlcF9zdHJbMF07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmZsYXRfZXNjYXBlX2tleV9zdHIoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBjb25zdCBjaGFyIHNlcCkKK3sKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgZm9yIChwID0gc3JjOyAqcDsgcCsrKSB7CisgICAgICAgIGlmICghKCgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKSB8fAorICAgICAgICAgICAgICAoKnAgPj0gJ2EnICYmICpwIDw9ICd6JykgfHwKKyAgICAgICAgICAgICAgKCpwID49ICdBJyAmJiAqcCA8PSAnWicpKSkKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICdfJywgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICpwLCAxKTsKKyAgICB9CisgICAgcmV0dXJuIGRzdC0+c3RyOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmxhdF9lc2NhcGVfdmFsdWVfc3RyKEFWQlByaW50ICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgZm9yIChwID0gc3JjOyAqcDsgcCsrKSB7CisgICAgICAgIHN3aXRjaCAoKnApIHsKKyAgICAgICAgY2FzZSAnXG4nOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcbiIpOyAgYnJlYWs7CisgICAgICAgIGNhc2UgJ1xyJzogYXZfYnByaW50Zihkc3QsICIlcyIsICJcXHIiKTsgIGJyZWFrOworICAgICAgICBjYXNlICdcXCc6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiXFxcXCIpOyBicmVhazsKKyAgICAgICAgY2FzZSAnIic6ICBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcXCIiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgJ2AnOiAgYXZfYnByaW50Zihkc3QsICIlcyIsICJcXGAiKTsgIGJyZWFrOworICAgICAgICBjYXNlICckJzogIGF2X2JwcmludGYoZHN0LCAiJXMiLCAiXFwkIik7ICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogICBhdl9icHJpbnRfY2hhcnMoZHN0LCAqcCwgMSk7ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRzdC0+c3RyOworfQorCitzdGF0aWMgdm9pZCBmbGF0X3ByaW50X3NlY3Rpb25faGVhZGVyKFdyaXRlckNvbnRleHQgKndjdHgpCit7CisgICAgRmxhdENvbnRleHQgKmZsYXQgPSB3Y3R4LT5wcml2OworICAgIEFWQlByaW50ICpidWYgPSAmd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsXTsKKyAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc2VjdGlvbiA9IHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWxdOworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpwYXJlbnRfc2VjdGlvbiA9IHdjdHgtPmxldmVsID8KKyAgICAgICAgd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbC0xXSA6IE5VTEw7CisKKyAgICAvKiBidWlsZCBzZWN0aW9uIGhlYWRlciAqLworICAgIGF2X2JwcmludF9jbGVhcihidWYpOworICAgIGlmICghcGFyZW50X3NlY3Rpb24pCisgICAgICAgIHJldHVybjsKKyAgICBhdl9icHJpbnRmKGJ1ZiwgIiVzIiwgd2N0eC0+c2VjdGlvbl9wYnVmW3djdHgtPmxldmVsLTFdLnN0cik7CisKKyAgICBpZiAoZmxhdC0+aGllcmFyY2hpY2FsIHx8CisgICAgICAgICEoc2VjdGlvbi0+ZmxhZ3MgJiAoU0VDVElPTl9GTEFHX0lTX0FSUkFZfFNFQ1RJT05fRkxBR19JU19XUkFQUEVSKSkpIHsKKyAgICAgICAgYXZfYnByaW50ZihidWYsICIlcyVzIiwgd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF0tPm5hbWUsIGZsYXQtPnNlcF9zdHIpOworCisgICAgICAgIGlmIChwYXJlbnRfc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpIHsKKyAgICAgICAgICAgIGludCBuID0gcGFyZW50X3NlY3Rpb24tPmlkID09IFNFQ1RJT05fSURfUEFDS0VUU19BTkRfRlJBTUVTID8KKyAgICAgICAgICAgICAgICB3Y3R4LT5uYl9zZWN0aW9uX3BhY2tldF9mcmFtZSA6IHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWwtMV07CisgICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiVkJXMiLCBuLCBmbGF0LT5zZXBfc3RyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZmxhdF9wcmludF9pbnQoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBsb25nIGxvbmcgaW50IHZhbHVlKQoreworICAgIHByaW50ZigiJXMlcz0lbGxkXG4iLCB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdLnN0ciwga2V5LCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZsYXRfcHJpbnRfc3RyKFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgRmxhdENvbnRleHQgKmZsYXQgPSB3Y3R4LT5wcml2OworICAgIEFWQlByaW50IGJ1ZjsKKworICAgIHByaW50ZigiJXMiLCB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdLnN0cik7CisgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBwcmludGYoIiVzPSIsIGZsYXRfZXNjYXBlX2tleV9zdHIoJmJ1Ziwga2V5LCBmbGF0LT5zZXApKTsKKyAgICBhdl9icHJpbnRfY2xlYXIoJmJ1Zik7CisgICAgcHJpbnRmKCJcIiVzXCJcbiIsIGZsYXRfZXNjYXBlX3ZhbHVlX3N0cigmYnVmLCB2YWx1ZSkpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IFdyaXRlciBmbGF0X3dyaXRlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gImZsYXQiLAorICAgIC5wcml2X3NpemUgICAgICAgICAgICAgPSBzaXplb2YoRmxhdENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBmbGF0X2luaXQsCisgICAgLnByaW50X3NlY3Rpb25faGVhZGVyICA9IGZsYXRfcHJpbnRfc2VjdGlvbl9oZWFkZXIsCisgICAgLnByaW50X2ludGVnZXIgICAgICAgICA9IGZsYXRfcHJpbnRfaW50LAorICAgIC5wcmludF9zdHJpbmcgICAgICAgICAgPSBmbGF0X3ByaW50X3N0ciwKKyAgICAuZmxhZ3MgPSBXUklURVJfRkxBR19ESVNQTEFZX09QVElPTkFMX0ZJRUxEU3xXUklURVJfRkxBR19QVVRfUEFDS0VUU19BTkRfRlJBTUVTX0lOX1NBTUVfQ0hBUFRFUiwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgID0gJmZsYXRfY2xhc3MsCit9OworCisvKiBJTkkgZm9ybWF0IG91dHB1dCAqLworCit0eXBlZGVmIHN0cnVjdCBJTklDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgaGllcmFyY2hpY2FsOworfSBJTklDb250ZXh0OworCisjdW5kZWYgT0ZGU0VUCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihJTklDb250ZXh0LCB4KQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaW5pX29wdGlvbnNbXSA9IHsKKyAgICB7ImhpZXJhcmNoaWNhbCIsICJzcGVjaWZ5IGlmIHRoZSBzZWN0aW9uIHNwZWNpZmljYXRpb24gc2hvdWxkIGJlIGhpZXJhcmNoaWNhbCIsIE9GRlNFVChoaWVyYXJjaGljYWwpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0xfSwgMCwgMSB9LAorICAgIHsiaCIsICAgICAgICAgICAgInNwZWNpZnkgaWYgdGhlIHNlY3Rpb24gc3BlY2lmaWNhdGlvbiBzaG91bGQgYmUgaGllcmFyY2hpY2FsIiwgT0ZGU0VUKGhpZXJhcmNoaWNhbCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTF9LCAwLCAxIH0sCisgICAge05VTEx9LAorfTsKKworREVGSU5FX1dSSVRFUl9DTEFTUyhpbmkpOworCitzdGF0aWMgY2hhciAqaW5pX2VzY2FwZV9zdHIoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworICAgIGludCBpID0gMDsKKyAgICBjaGFyIGMgPSAwOworCisgICAgd2hpbGUgKGMgPSBzcmNbaSsrXSkgeworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnXGInOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcYiIpOyBicmVhazsKKyAgICAgICAgY2FzZSAnXGYnOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcZiIpOyBicmVhazsKKyAgICAgICAgY2FzZSAnXG4nOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcbiIpOyBicmVhazsKKyAgICAgICAgY2FzZSAnXHInOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcciIpOyBicmVhazsKKyAgICAgICAgY2FzZSAnXHQnOiBhdl9icHJpbnRmKGRzdCwgIiVzIiwgIlxcdCIpOyBicmVhazsKKyAgICAgICAgY2FzZSAnXFwnOgorICAgICAgICBjYXNlICcjJyA6CisgICAgICAgIGNhc2UgJz0nIDoKKyAgICAgICAgY2FzZSAnOicgOiBhdl9icHJpbnRfY2hhcnMoZHN0LCAnXFwnLCAxKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICgodW5zaWduZWQgY2hhciljIDwgMzIpCisgICAgICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJcXHgwMCUwMngiLCBjICYgMHhmZik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgYywgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZHN0LT5zdHI7Cit9CisKK3N0YXRpYyB2b2lkIGluaV9wcmludF9zZWN0aW9uX2hlYWRlcihXcml0ZXJDb250ZXh0ICp3Y3R4KQoreworICAgIElOSUNvbnRleHQgKmluaSA9IHdjdHgtPnByaXY7CisgICAgQVZCUHJpbnQgKmJ1ZiA9ICZ3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWxdOworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07CisgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnBhcmVudF9zZWN0aW9uID0gd2N0eC0+bGV2ZWwgPworICAgICAgICB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsLTFdIDogTlVMTDsKKworICAgIGF2X2JwcmludF9jbGVhcihidWYpOworICAgIGlmICghcGFyZW50X3NlY3Rpb24pIHsKKyAgICAgICAgcHJpbnRmKCIjIGZmcHJvYmUgb3V0cHV0XG5cbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHdjdHgtPm5iX2l0ZW1bd2N0eC0+bGV2ZWwtMV0pCisgICAgICAgIHByaW50ZigiXG4iKTsKKworICAgIGF2X2JwcmludGYoYnVmLCAiJXMiLCB3Y3R4LT5zZWN0aW9uX3BidWZbd2N0eC0+bGV2ZWwtMV0uc3RyKTsKKyAgICBpZiAoaW5pLT5oaWVyYXJjaGljYWwgfHwKKyAgICAgICAgIShzZWN0aW9uLT5mbGFncyAmIChTRUNUSU9OX0ZMQUdfSVNfQVJSQVl8U0VDVElPTl9GTEFHX0lTX1dSQVBQRVIpKSkgeworICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIiVzJXMiLCBidWYtPnN0clswXSA/ICIuIiA6ICIiLCB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsXS0+bmFtZSk7CisKKyAgICAgICAgaWYgKHBhcmVudF9zZWN0aW9uLT5mbGFncyAmIFNFQ1RJT05fRkxBR19JU19BUlJBWSkgeworICAgICAgICAgICAgaW50IG4gPSBwYXJlbnRfc2VjdGlvbi0+aWQgPT0gU0VDVElPTl9JRF9QQUNLRVRTX0FORF9GUkFNRVMgPworICAgICAgICAgICAgICAgIHdjdHgtPm5iX3NlY3Rpb25fcGFja2V0X2ZyYW1lIDogd2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbC0xXTsKKyAgICAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiLiVkIiwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIShzZWN0aW9uLT5mbGFncyAmIChTRUNUSU9OX0ZMQUdfSVNfQVJSQVl8U0VDVElPTl9GTEFHX0lTX1dSQVBQRVIpKSkKKyAgICAgICAgcHJpbnRmKCJbJXNdXG4iLCBidWYtPnN0cik7Cit9CisKK3N0YXRpYyB2b2lkIGluaV9wcmludF9zdHIoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKyAgICBBVkJQcmludCBidWY7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAxLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIHByaW50ZigiJXM9IiwgaW5pX2VzY2FwZV9zdHIoJmJ1Ziwga2V5KSk7CisgICAgYXZfYnByaW50X2NsZWFyKCZidWYpOworICAgIHByaW50ZigiJXNcbiIsIGluaV9lc2NhcGVfc3RyKCZidWYsIHZhbHVlKSk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBpbmlfcHJpbnRfaW50KFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmtleSwgbG9uZyBsb25nIGludCB2YWx1ZSkKK3sKKyAgICBwcmludGYoIiVzPSVsbGRcbiIsIGtleSwgdmFsdWUpOworfQorCitzdGF0aWMgY29uc3QgV3JpdGVyIGluaV93cml0ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJpbmkiLAorICAgIC5wcml2X3NpemUgICAgICAgICAgICAgPSBzaXplb2YoSU5JQ29udGV4dCksCisgICAgLnByaW50X3NlY3Rpb25faGVhZGVyICA9IGluaV9wcmludF9zZWN0aW9uX2hlYWRlciwKKyAgICAucHJpbnRfaW50ZWdlciAgICAgICAgID0gaW5pX3ByaW50X2ludCwKKyAgICAucHJpbnRfc3RyaW5nICAgICAgICAgID0gaW5pX3ByaW50X3N0ciwKKyAgICAuZmxhZ3MgPSBXUklURVJfRkxBR19ESVNQTEFZX09QVElPTkFMX0ZJRUxEU3xXUklURVJfRkxBR19QVVRfUEFDS0VUU19BTkRfRlJBTUVTX0lOX1NBTUVfQ0hBUFRFUiwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgID0gJmluaV9jbGFzcywKK307CisKKy8qIEpTT04gb3V0cHV0ICovCisKK3R5cGVkZWYgc3RydWN0IEpTT05Db250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgaW5kZW50X2xldmVsOworICAgIGludCBjb21wYWN0OworICAgIGNvbnN0IGNoYXIgKml0ZW1fc2VwLCAqaXRlbV9zdGFydF9lbmQ7Cit9IEpTT05Db250ZXh0OworCisjdW5kZWYgT0ZGU0VUCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihKU09OQ29udGV4dCwgeCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGpzb25fb3B0aW9uc1tdPSB7CisgICAgeyAiY29tcGFjdCIsICJlbmFibGUgY29tcGFjdCBvdXRwdXQiLCBPRkZTRVQoY29tcGFjdCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxIH0sCisgICAgeyAiYyIsICAgICAgICJlbmFibGUgY29tcGFjdCBvdXRwdXQiLCBPRkZTRVQoY29tcGFjdCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxIH0sCisgICAgeyBOVUxMIH0KK307CisKK0RFRklORV9XUklURVJfQ0xBU1MoanNvbik7CisKK3N0YXRpYyBhdl9jb2xkIGludCBqc29uX2luaXQoV3JpdGVyQ29udGV4dCAqd2N0eCkKK3sKKyAgICBKU09OQ29udGV4dCAqanNvbiA9IHdjdHgtPnByaXY7CisKKyAgICBqc29uLT5pdGVtX3NlcCAgICAgICA9IGpzb24tPmNvbXBhY3QgPyAiLCAiIDogIixcbiI7CisgICAganNvbi0+aXRlbV9zdGFydF9lbmQgPSBqc29uLT5jb21wYWN0ID8gIiAiICA6ICJcbiI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmpzb25fZXNjYXBlX3N0cihBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICpzcmMsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIganNvbl9lc2NhcGVbXSA9IHsnIicsICdcXCcsICdcYicsICdcZicsICdcbicsICdccicsICdcdCcsIDB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyIGpzb25fc3Vic3RbXSAgPSB7JyInLCAnXFwnLCAgJ2InLCAgJ2YnLCAgJ24nLCAgJ3InLCAgJ3QnLCAwfTsKKyAgICBjb25zdCBjaGFyICpwOworCisgICAgZm9yIChwID0gc3JjOyAqcDsgcCsrKSB7CisgICAgICAgIGNoYXIgKnMgPSBzdHJjaHIoanNvbl9lc2NhcGUsICpwKTsKKyAgICAgICAgaWYgKHMpIHsKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICdcXCcsIDEpOworICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwganNvbl9zdWJzdFtzIC0ganNvbl9lc2NhcGVdLCAxKTsKKyAgICAgICAgfSBlbHNlIGlmICgodW5zaWduZWQgY2hhcikqcCA8IDMyKSB7CisgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIlxcdTAwJTAyeCIsICpwICYgMHhmZik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0LCAqcCwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRzdC0+c3RyOworfQorCisjZGVmaW5lIEpTT05fSU5ERU5UKCkgcHJpbnRmKCIlKmMiLCBqc29uLT5pbmRlbnRfbGV2ZWwgKiA0LCAnICcpCisKK3N0YXRpYyB2b2lkIGpzb25fcHJpbnRfc2VjdGlvbl9oZWFkZXIoV3JpdGVyQ29udGV4dCAqd2N0eCkKK3sKKyAgICBKU09OQ29udGV4dCAqanNvbiA9IHdjdHgtPnByaXY7CisgICAgQVZCUHJpbnQgYnVmOworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07CisgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnBhcmVudF9zZWN0aW9uID0gd2N0eC0+bGV2ZWwgPworICAgICAgICB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsLTFdIDogTlVMTDsKKworICAgIGlmICh3Y3R4LT5sZXZlbCAmJiB3Y3R4LT5uYl9pdGVtW3djdHgtPmxldmVsLTFdKQorICAgICAgICBwcmludGYoIixcbiIpOworCisgICAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDVElPTl9GTEFHX0lTX1dSQVBQRVIpIHsKKyAgICAgICAgcHJpbnRmKCJ7XG4iKTsKKyAgICAgICAganNvbi0+aW5kZW50X2xldmVsKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICAgICAganNvbl9lc2NhcGVfc3RyKCZidWYsIHNlY3Rpb24tPm5hbWUsIHdjdHgpOworICAgICAgICBKU09OX0lOREVOVCgpOworCisgICAgICAgIGpzb24tPmluZGVudF9sZXZlbCsrOworICAgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpIHsKKyAgICAgICAgICAgIHByaW50ZigiXCIlc1wiOiBbXG4iLCBidWYuc3RyKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJlbnRfc2VjdGlvbiAmJiAhKHBhcmVudF9zZWN0aW9uLT5mbGFncyAmIFNFQ1RJT05fRkxBR19JU19BUlJBWSkpIHsKKyAgICAgICAgICAgIHByaW50ZigiXCIlc1wiOiB7JXMiLCBidWYuc3RyLCBqc29uLT5pdGVtX3N0YXJ0X2VuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoInslcyIsIGpzb24tPml0ZW1fc3RhcnRfZW5kKTsKKworICAgICAgICAgICAgLyogdGhpcyBpcyByZXF1aXJlZCBzbyB0aGUgcGFyc2VyIGNhbiBkaXN0aW5ndWlzaCBiZXR3ZWVuIHBhY2tldHMgYW5kIGZyYW1lcyAqLworICAgICAgICAgICAgaWYgKHBhcmVudF9zZWN0aW9uICYmIHBhcmVudF9zZWN0aW9uLT5pZCA9PSBTRUNUSU9OX0lEX1BBQ0tFVFNfQU5EX0ZSQU1FUykgeworICAgICAgICAgICAgICAgIGlmICghanNvbi0+Y29tcGFjdCkKKyAgICAgICAgICAgICAgICAgICAgSlNPTl9JTkRFTlQoKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIlwidHlwZVwiOiBcIiVzXCIlcyIsIHNlY3Rpb24tPm5hbWUsIGpzb24tPml0ZW1fc2VwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBqc29uX3ByaW50X3NlY3Rpb25fZm9vdGVyKFdyaXRlckNvbnRleHQgKndjdHgpCit7CisgICAgSlNPTkNvbnRleHQgKmpzb24gPSB3Y3R4LT5wcml2OworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07CisKKyAgICBpZiAod2N0eC0+bGV2ZWwgPT0gMCkgeworICAgICAgICBqc29uLT5pbmRlbnRfbGV2ZWwtLTsKKyAgICAgICAgcHJpbnRmKCJcbn1cbiIpOworICAgIH0gZWxzZSBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpIHsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBqc29uLT5pbmRlbnRfbGV2ZWwtLTsKKyAgICAgICAgSlNPTl9JTkRFTlQoKTsKKyAgICAgICAgcHJpbnRmKCJdIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIlcyIsIGpzb24tPml0ZW1fc3RhcnRfZW5kKTsKKyAgICAgICAganNvbi0+aW5kZW50X2xldmVsLS07CisgICAgICAgIGlmICghanNvbi0+Y29tcGFjdCkKKyAgICAgICAgICAgIEpTT05fSU5ERU5UKCk7CisgICAgICAgIHByaW50ZigifSIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGpzb25fcHJpbnRfaXRlbV9zdHIoV3JpdGVyQ29udGV4dCAqd2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgQVZCUHJpbnQgYnVmOworCisgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBwcmludGYoIlwiJXNcIjoiLCBqc29uX2VzY2FwZV9zdHIoJmJ1Ziwga2V5LCAgIHdjdHgpKTsKKyAgICBhdl9icHJpbnRfY2xlYXIoJmJ1Zik7CisgICAgcHJpbnRmKCIgXCIlc1wiIiwganNvbl9lc2NhcGVfc3RyKCZidWYsIHZhbHVlLCB3Y3R4KSk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBqc29uX3ByaW50X3N0cihXcml0ZXJDb250ZXh0ICp3Y3R4LCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIEpTT05Db250ZXh0ICpqc29uID0gd2N0eC0+cHJpdjsKKworICAgIGlmICh3Y3R4LT5uYl9pdGVtW3djdHgtPmxldmVsXSkKKyAgICAgICAgcHJpbnRmKCIlcyIsIGpzb24tPml0ZW1fc2VwKTsKKyAgICBpZiAoIWpzb24tPmNvbXBhY3QpCisgICAgICAgIEpTT05fSU5ERU5UKCk7CisgICAganNvbl9wcmludF9pdGVtX3N0cih3Y3R4LCBrZXksIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQganNvbl9wcmludF9pbnQoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqa2V5LCBsb25nIGxvbmcgaW50IHZhbHVlKQoreworICAgIEpTT05Db250ZXh0ICpqc29uID0gd2N0eC0+cHJpdjsKKyAgICBBVkJQcmludCBidWY7CisKKyAgICBpZiAod2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0pCisgICAgICAgIHByaW50ZigiJXMiLCBqc29uLT5pdGVtX3NlcCk7CisgICAgaWYgKCFqc29uLT5jb21wYWN0KQorICAgICAgICBKU09OX0lOREVOVCgpOworCisgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBwcmludGYoIlwiJXNcIjogJWxsZCIsIGpzb25fZXNjYXBlX3N0cigmYnVmLCBrZXksIHdjdHgpLCB2YWx1ZSk7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgV3JpdGVyIGpzb25fd3JpdGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJqc29uIiwKKyAgICAucHJpdl9zaXplICAgICAgICAgICAgPSBzaXplb2YoSlNPTkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICA9IGpzb25faW5pdCwKKyAgICAucHJpbnRfc2VjdGlvbl9oZWFkZXIgPSBqc29uX3ByaW50X3NlY3Rpb25faGVhZGVyLAorICAgIC5wcmludF9zZWN0aW9uX2Zvb3RlciA9IGpzb25fcHJpbnRfc2VjdGlvbl9mb290ZXIsCisgICAgLnByaW50X2ludGVnZXIgICAgICAgID0ganNvbl9wcmludF9pbnQsCisgICAgLnByaW50X3N0cmluZyAgICAgICAgID0ganNvbl9wcmludF9zdHIsCisgICAgLmZsYWdzID0gV1JJVEVSX0ZMQUdfUFVUX1BBQ0tFVFNfQU5EX0ZSQU1FU19JTl9TQU1FX0NIQVBURVIsCisgICAgLnByaXZfY2xhc3MgICAgICAgICAgID0gJmpzb25fY2xhc3MsCit9OworCisvKiBYTUwgb3V0cHV0ICovCisKK3R5cGVkZWYgc3RydWN0IFhNTENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCB3aXRoaW5fdGFnOworICAgIGludCBpbmRlbnRfbGV2ZWw7CisgICAgaW50IGZ1bGx5X3F1YWxpZmllZDsKKyAgICBpbnQgeHNkX3N0cmljdDsKK30gWE1MQ29udGV4dDsKKworI3VuZGVmIE9GRlNFVAorI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoWE1MQ29udGV4dCwgeCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHhtbF9vcHRpb25zW10gPSB7CisgICAgeyJmdWxseV9xdWFsaWZpZWQiLCAic3BlY2lmeSBpZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBmdWxseSBxdWFsaWZpZWQiLCBPRkZTRVQoZnVsbHlfcXVhbGlmaWVkKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sICAwLCAxIH0sCisgICAgeyJxIiwgICAgICAgICAgICAgICAic3BlY2lmeSBpZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBmdWxseSBxdWFsaWZpZWQiLCBPRkZTRVQoZnVsbHlfcXVhbGlmaWVkKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sICAwLCAxIH0sCisgICAgeyJ4c2Rfc3RyaWN0IiwgICAgICAiZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyBYU0QgY29tcGxpYW50IiwgICAgICAgICBPRkZTRVQoeHNkX3N0cmljdCksICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sICAwLCAxIH0sCisgICAgeyJ4IiwgICAgICAgICAgICAgICAiZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBpcyBYU0QgY29tcGxpYW50IiwgICAgICAgICBPRkZTRVQoeHNkX3N0cmljdCksICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sICAwLCAxIH0sCisgICAge05VTEx9LAorfTsKKworREVGSU5FX1dSSVRFUl9DTEFTUyh4bWwpOworCitzdGF0aWMgYXZfY29sZCBpbnQgeG1sX2luaXQoV3JpdGVyQ29udGV4dCAqd2N0eCkKK3sKKyAgICBYTUxDb250ZXh0ICp4bWwgPSB3Y3R4LT5wcml2OworCisgICAgaWYgKHhtbC0+eHNkX3N0cmljdCkgeworICAgICAgICB4bWwtPmZ1bGx5X3F1YWxpZmllZCA9IDE7CisjZGVmaW5lIENIRUNLX0NPTVBMSUFOQ0Uob3B0LCBvcHRfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChvcHQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2cod2N0eCwgQVZfTE9HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIlhTRC1jb21wbGlhbnQgb3V0cHV0IHNlbGVjdGVkIGJ1dCBvcHRpb24gJyVzJyB3YXMgc2VsZWN0ZWQsIFhNTCBvdXRwdXQgbWF5IGJlIG5vbi1jb21wbGlhbnQuXG4iIFwKKyAgICAgICAgICAgICAgICAgICAiWW91IG5lZWQgdG8gZGlzYWJsZSBzdWNoIG9wdGlvbiB3aXRoICctbm8lcydcbiIsIG9wdF9uYW1lLCBvcHRfbmFtZSk7IFwKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorICAgICAgICBDSEVDS19DT01QTElBTkNFKHNob3dfcHJpdmF0ZV9kYXRhLCAicHJpdmF0ZSIpOworICAgICAgICBDSEVDS19DT01QTElBTkNFKHNob3dfdmFsdWVfdW5pdCwgICAidW5pdCIpOworICAgICAgICBDSEVDS19DT01QTElBTkNFKHVzZV92YWx1ZV9wcmVmaXgsICAicHJlZml4Iik7CisKKyAgICAgICAgaWYgKGRvX3Nob3dfZnJhbWVzICYmIGRvX3Nob3dfcGFja2V0cykgeworICAgICAgICAgICAgYXZfbG9nKHdjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW50ZXJsZWF2ZWQgZnJhbWVzIGFuZCBwYWNrZXRzIGFyZSBub3QgYWxsb3dlZCBpbiBYU0QuICIKKyAgICAgICAgICAgICAgICAgICAiU2VsZWN0IG9ubHkgb25lIGJldHdlZW4gdGhlIC1zaG93X2ZyYW1lcyBhbmQgdGhlIC1zaG93X3BhY2tldHMgb3B0aW9ucy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqeG1sX2VzY2FwZV9zdHIoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqc3JjLCB2b2lkICpsb2dfY3R4KQoreworICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICBmb3IgKHAgPSBzcmM7ICpwOyBwKyspIHsKKyAgICAgICAgc3dpdGNoICgqcCkgeworICAgICAgICBjYXNlICcmJyA6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJmFtcDsiKTsgIGJyZWFrOworICAgICAgICBjYXNlICc8JyA6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJmx0OyIpOyAgIGJyZWFrOworICAgICAgICBjYXNlICc+JyA6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJmd0OyIpOyAgIGJyZWFrOworICAgICAgICBjYXNlICciJyA6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJnF1b3Q7Iik7IGJyZWFrOworICAgICAgICBjYXNlICdcJyc6IGF2X2JwcmludGYoZHN0LCAiJXMiLCAiJmFwb3M7Iik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBhdl9icHJpbnRfY2hhcnMoZHN0LCAqcCwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZHN0LT5zdHI7Cit9CisKKyNkZWZpbmUgWE1MX0lOREVOVCgpIHByaW50ZigiJSpjIiwgeG1sLT5pbmRlbnRfbGV2ZWwgKiA0LCAnICcpCisKK3N0YXRpYyB2b2lkIHhtbF9wcmludF9zZWN0aW9uX2hlYWRlcihXcml0ZXJDb250ZXh0ICp3Y3R4KQoreworICAgIFhNTENvbnRleHQgKnhtbCA9IHdjdHgtPnByaXY7CisgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb24gPSB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsXTsKKyAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqcGFyZW50X3NlY3Rpb24gPSB3Y3R4LT5sZXZlbCA/CisgICAgICAgIHdjdHgtPnNlY3Rpb25bd2N0eC0+bGV2ZWwtMV0gOiBOVUxMOworCisgICAgaWYgKHdjdHgtPmxldmVsID09IDApIHsKKyAgICAgICAgY29uc3QgY2hhciAqcXVhbCA9ICIgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgIgorICAgICAgICAgICAgInhtbG5zOmZmcHJvYmU9J2h0dHA6Ly93d3cuZmZtcGVnLm9yZy9zY2hlbWEvZmZwcm9iZScgIgorICAgICAgICAgICAgInhzaTpzY2hlbWFMb2NhdGlvbj0naHR0cDovL3d3dy5mZm1wZWcub3JnL3NjaGVtYS9mZnByb2JlIGZmcHJvYmUueHNkJyI7CisKKyAgICAgICAgcHJpbnRmKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpOworICAgICAgICBwcmludGYoIjwlc2ZmcHJvYmUlcz5cbiIsCisgICAgICAgICAgICAgICB4bWwtPmZ1bGx5X3F1YWxpZmllZCA/ICJmZnByb2JlOiIgOiAiIiwKKyAgICAgICAgICAgICAgIHhtbC0+ZnVsbHlfcXVhbGlmaWVkID8gcXVhbCA6ICIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICh4bWwtPndpdGhpbl90YWcpIHsKKyAgICAgICAgeG1sLT53aXRoaW5fdGFnID0gMDsKKyAgICAgICAgcHJpbnRmKCI+XG4iKTsKKyAgICB9CisgICAgaWYgKHNlY3Rpb24tPmZsYWdzICYgU0VDVElPTl9GTEFHX0hBU19WQVJJQUJMRV9GSUVMRFMpIHsKKyAgICAgICAgeG1sLT5pbmRlbnRfbGV2ZWwrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocGFyZW50X3NlY3Rpb24gJiYgKHBhcmVudF9zZWN0aW9uLT5mbGFncyAmIFNFQ1RJT05fRkxBR19JU19XUkFQUEVSKSAmJgorICAgICAgICAgICAgd2N0eC0+bGV2ZWwgJiYgd2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbC0xXSkKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgeG1sLT5pbmRlbnRfbGV2ZWwrKzsKKworICAgICAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkpIHsKKyAgICAgICAgICAgIFhNTF9JTkRFTlQoKTsgcHJpbnRmKCI8JXM+XG4iLCBzZWN0aW9uLT5uYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFhNTF9JTkRFTlQoKTsgcHJpbnRmKCI8JXMgIiwgc2VjdGlvbi0+bmFtZSk7CisgICAgICAgICAgICB4bWwtPndpdGhpbl90YWcgPSAxOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB4bWxfcHJpbnRfc2VjdGlvbl9mb290ZXIoV3JpdGVyQ29udGV4dCAqd2N0eCkKK3sKKyAgICBYTUxDb250ZXh0ICp4bWwgPSB3Y3R4LT5wcml2OworICAgIGNvbnN0IHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gd2N0eC0+c2VjdGlvblt3Y3R4LT5sZXZlbF07CisKKyAgICBpZiAod2N0eC0+bGV2ZWwgPT0gMCkgeworICAgICAgICBwcmludGYoIjwvJXNmZnByb2JlPlxuIiwgeG1sLT5mdWxseV9xdWFsaWZpZWQgPyAiZmZwcm9iZToiIDogIiIpOworICAgIH0gZWxzZSBpZiAoeG1sLT53aXRoaW5fdGFnKSB7CisgICAgICAgIHhtbC0+d2l0aGluX3RhZyA9IDA7CisgICAgICAgIHByaW50ZigiLz5cbiIpOworICAgICAgICB4bWwtPmluZGVudF9sZXZlbC0tOworICAgIH0gZWxzZSBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUykgeworICAgICAgICB4bWwtPmluZGVudF9sZXZlbC0tOworICAgIH0gZWxzZSB7CisgICAgICAgIFhNTF9JTkRFTlQoKTsgcHJpbnRmKCI8LyVzPlxuIiwgc2VjdGlvbi0+bmFtZSk7CisgICAgICAgIHhtbC0+aW5kZW50X2xldmVsLS07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB4bWxfcHJpbnRfc3RyKFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmtleSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisgICAgQVZCUHJpbnQgYnVmOworICAgIFhNTENvbnRleHQgKnhtbCA9IHdjdHgtPnByaXY7CisgICAgY29uc3Qgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb24gPSB3Y3R4LT5zZWN0aW9uW3djdHgtPmxldmVsXTsKKworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisKKyAgICBpZiAoc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSEFTX1ZBUklBQkxFX0ZJRUxEUykgeworICAgICAgICBYTUxfSU5ERU5UKCk7CisgICAgICAgIHByaW50ZigiPCVzIGtleT1cIiVzXCIiLAorICAgICAgICAgICAgICAgc2VjdGlvbi0+ZWxlbWVudF9uYW1lLCB4bWxfZXNjYXBlX3N0cigmYnVmLCBrZXksIHdjdHgpKTsKKyAgICAgICAgYXZfYnByaW50X2NsZWFyKCZidWYpOworICAgICAgICBwcmludGYoIiB2YWx1ZT1cIiVzXCIvPlxuIiwgeG1sX2VzY2FwZV9zdHIoJmJ1ZiwgdmFsdWUsIHdjdHgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAod2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0pCisgICAgICAgICAgICBwcmludGYoIiAiKTsKKyAgICAgICAgcHJpbnRmKCIlcz1cIiVzXCIiLCBrZXksIHhtbF9lc2NhcGVfc3RyKCZidWYsIHZhbHVlLCB3Y3R4KSk7CisgICAgfQorCisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCB4bWxfcHJpbnRfaW50KFdyaXRlckNvbnRleHQgKndjdHgsIGNvbnN0IGNoYXIgKmtleSwgbG9uZyBsb25nIGludCB2YWx1ZSkKK3sKKyAgICBpZiAod2N0eC0+bmJfaXRlbVt3Y3R4LT5sZXZlbF0pCisgICAgICAgIHByaW50ZigiICIpOworICAgIHByaW50ZigiJXM9XCIlbGxkXCIiLCBrZXksIHZhbHVlKTsKK30KKworc3RhdGljIFdyaXRlciB4bWxfd3JpdGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJ4bWwiLAorICAgIC5wcml2X3NpemUgICAgICAgICAgICA9IHNpemVvZihYTUxDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSB4bWxfaW5pdCwKKyAgICAucHJpbnRfc2VjdGlvbl9oZWFkZXIgPSB4bWxfcHJpbnRfc2VjdGlvbl9oZWFkZXIsCisgICAgLnByaW50X3NlY3Rpb25fZm9vdGVyID0geG1sX3ByaW50X3NlY3Rpb25fZm9vdGVyLAorICAgIC5wcmludF9pbnRlZ2VyICAgICAgICA9IHhtbF9wcmludF9pbnQsCisgICAgLnByaW50X3N0cmluZyAgICAgICAgID0geG1sX3ByaW50X3N0ciwKKyAgICAuZmxhZ3MgPSBXUklURVJfRkxBR19QVVRfUEFDS0VUU19BTkRfRlJBTUVTX0lOX1NBTUVfQ0hBUFRFUiwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgPSAmeG1sX2NsYXNzLAorfTsKKworc3RhdGljIHZvaWQgd3JpdGVyX3JlZ2lzdGVyX2FsbCh2b2lkKQoreworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisKKyAgICBpZiAoaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKyAgICBpbml0aWFsaXplZCA9IDE7CisKKyAgICB3cml0ZXJfcmVnaXN0ZXIoJmRlZmF1bHRfd3JpdGVyKTsKKyAgICB3cml0ZXJfcmVnaXN0ZXIoJmNvbXBhY3Rfd3JpdGVyKTsKKyAgICB3cml0ZXJfcmVnaXN0ZXIoJmNzdl93cml0ZXIpOworICAgIHdyaXRlcl9yZWdpc3RlcigmZmxhdF93cml0ZXIpOworICAgIHdyaXRlcl9yZWdpc3RlcigmaW5pX3dyaXRlcik7CisgICAgd3JpdGVyX3JlZ2lzdGVyKCZqc29uX3dyaXRlcik7CisgICAgd3JpdGVyX3JlZ2lzdGVyKCZ4bWxfd3JpdGVyKTsKK30KKworI2RlZmluZSBwcmludF9mbXQoaywgZiwgLi4uKSBkbyB7ICAgICAgICAgICAgICBcCisgICAgYXZfYnByaW50X2NsZWFyKCZwYnVmKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9icHJpbnRmKCZwYnVmLCBmLCBfX1ZBX0FSR1NfXyk7ICAgICAgICAgXAorICAgIHdyaXRlcl9wcmludF9zdHJpbmcodywgaywgcGJ1Zi5zdHIsIDApOyAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHByaW50X2ludChrLCB2KSAgICAgICAgIHdyaXRlcl9wcmludF9pbnRlZ2VyKHcsIGssIHYpCisjZGVmaW5lIHByaW50X3EoaywgdiwgcykgICAgICAgIHdyaXRlcl9wcmludF9yYXRpb25hbCh3LCBrLCB2LCBzKQorI2RlZmluZSBwcmludF9zdHIoaywgdikgICAgICAgICB3cml0ZXJfcHJpbnRfc3RyaW5nKHcsIGssIHYsIDApCisjZGVmaW5lIHByaW50X3N0cl9vcHQoaywgdikgICAgIHdyaXRlcl9wcmludF9zdHJpbmcodywgaywgdiwgUFJJTlRfU1RSSU5HX09QVCkKKyNkZWZpbmUgcHJpbnRfc3RyX3ZhbGlkYXRlKGssIHYpIHdyaXRlcl9wcmludF9zdHJpbmcodywgaywgdiwgUFJJTlRfU1RSSU5HX1ZBTElEQVRFKQorI2RlZmluZSBwcmludF90aW1lKGssIHYsIHRiKSAgICB3cml0ZXJfcHJpbnRfdGltZSh3LCBrLCB2LCB0YiwgMCkKKyNkZWZpbmUgcHJpbnRfdHMoaywgdikgICAgICAgICAgd3JpdGVyX3ByaW50X3RzKHcsIGssIHYsIDApCisjZGVmaW5lIHByaW50X2R1cmF0aW9uX3RpbWUoaywgdiwgdGIpIHdyaXRlcl9wcmludF90aW1lKHcsIGssIHYsIHRiLCAxKQorI2RlZmluZSBwcmludF9kdXJhdGlvbl90cyhrLCB2KSAgICAgICB3cml0ZXJfcHJpbnRfdHModywgaywgdiwgMSkKKyNkZWZpbmUgcHJpbnRfdmFsKGssIHYsIHUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCB1bml0X3ZhbHVlIHV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXYudmFsLmkgPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1di51bml0ID0gdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdyaXRlcl9wcmludF9zdHJpbmcodywgaywgdmFsdWVfc3RyaW5nKHZhbF9zdHIsIHNpemVvZih2YWxfc3RyKSwgdXYpLCAwKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBwcmludF9zZWN0aW9uX2hlYWRlcihzKSB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgcykKKyNkZWZpbmUgcHJpbnRfc2VjdGlvbl9mb290ZXIocykgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcsIHMpCisKKyNkZWZpbmUgUkVBTExPQ1pfQVJSQVlfU1RSRUFNKHB0ciwgY3VyX24sIG5ld19uKSAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBhdl9yZWFsbG9jcF9hcnJheSgmKHB0ciksIChuZXdfbiksIHNpemVvZigqKHB0cikpKTsgICAgICAgICAgIFwKKyAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBlbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1zZXQoIChwdHIpICsgKGN1cl9uKSwgMCwgKChuZXdfbikgLSAoY3VyX24pKSAqIHNpemVvZigqKHB0cikpICk7IFwKK30KKworc3RhdGljIGlubGluZSBpbnQgc2hvd190YWdzKFdyaXRlckNvbnRleHQgKncsIEFWRGljdGlvbmFyeSAqdGFncywgaW50IHNlY3Rpb25faWQpCit7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRhZyA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIXRhZ3MpCisgICAgICAgIHJldHVybiAwOworICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBzZWN0aW9uX2lkKTsKKworICAgIHdoaWxlICgodGFnID0gYXZfZGljdF9nZXQodGFncywgIiIsIHRhZywgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgaWYgKChyZXQgPSBwcmludF9zdHJfdmFsaWRhdGUodGFnLT5rZXksIHRhZy0+dmFsdWUpKSA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcGt0X3NpZGVfZGF0YShXcml0ZXJDb250ZXh0ICp3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldFNpZGVEYXRhICpzaWRlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zaWRlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25JRCBpZF9kYXRhX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25JRCBpZF9kYXRhKQoreworICAgIGludCBpOworCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIGlkX2RhdGFfbGlzdCk7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX3NpZGVfZGF0YTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFWUGFja2V0U2lkZURhdGEgKnNkID0gJnNpZGVfZGF0YVtpXTsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGF2X3BhY2tldF9zaWRlX2RhdGFfbmFtZShzZC0+dHlwZSk7CisKKyAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIGlkX2RhdGEpOworICAgICAgICBwcmludF9zdHIoInNpZGVfZGF0YV90eXBlIiwgbmFtZSA/IG5hbWUgOiAidW5rbm93biIpOworICAgICAgICBpZiAoc2QtPnR5cGUgPT0gQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWCAmJiBzZC0+c2l6ZSA+PSA5KjQpIHsKKyAgICAgICAgICAgIHdyaXRlcl9wcmludF9pbnRlZ2Vycyh3LCAiZGlzcGxheW1hdHJpeCIsIHNkLT5kYXRhLCA5LCAiICUxMWQiLCAzLCA0LCAxKTsKKyAgICAgICAgICAgIHByaW50X2ludCgicm90YXRpb24iLCBhdl9kaXNwbGF5X3JvdGF0aW9uX2dldCgoaW50MzJfdCAqKXNkLT5kYXRhKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2QtPnR5cGUgPT0gQVZfUEtUX0RBVEFfU1RFUkVPM0QpIHsKKyAgICAgICAgICAgIGNvbnN0IEFWU3RlcmVvM0QgKnN0ZXJlbyA9IChBVlN0ZXJlbzNEICopc2QtPmRhdGE7CisgICAgICAgICAgICBwcmludF9zdHIoInR5cGUiLCBhdl9zdGVyZW8zZF90eXBlX25hbWUoc3RlcmVvLT50eXBlKSk7CisgICAgICAgICAgICBwcmludF9pbnQoImludmVydGVkIiwgISEoc3RlcmVvLT5mbGFncyAmIEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc2QtPnR5cGUgPT0gQVZfUEtUX0RBVEFfU1BIRVJJQ0FMKSB7CisgICAgICAgICAgICBjb25zdCBBVlNwaGVyaWNhbE1hcHBpbmcgKnNwaGVyaWNhbCA9IChBVlNwaGVyaWNhbE1hcHBpbmcgKilzZC0+ZGF0YTsKKyAgICAgICAgICAgIHByaW50X3N0cigicHJvamVjdGlvbiIsIGF2X3NwaGVyaWNhbF9wcm9qZWN0aW9uX25hbWUoc3BoZXJpY2FsLT5wcm9qZWN0aW9uKSk7CisgICAgICAgICAgICBpZiAoc3BoZXJpY2FsLT5wcm9qZWN0aW9uID09IEFWX1NQSEVSSUNBTF9DVUJFTUFQKSB7CisgICAgICAgICAgICAgICAgcHJpbnRfaW50KCJwYWRkaW5nIiwgc3BoZXJpY2FsLT5wYWRkaW5nKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3BoZXJpY2FsLT5wcm9qZWN0aW9uID09IEFWX1NQSEVSSUNBTF9FUVVJUkVDVEFOR1VMQVJfVElMRSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBsLCB0LCByLCBiOworICAgICAgICAgICAgICAgIGF2X3NwaGVyaWNhbF90aWxlX2JvdW5kcyhzcGhlcmljYWwsIHBhci0+d2lkdGgsIHBhci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbCwgJnQsICZyLCAmYik7CisgICAgICAgICAgICAgICAgcHJpbnRfaW50KCJib3VuZF9sZWZ0IiwgbCk7CisgICAgICAgICAgICAgICAgcHJpbnRfaW50KCJib3VuZF90b3AiLCB0KTsKKyAgICAgICAgICAgICAgICBwcmludF9pbnQoImJvdW5kX3JpZ2h0Iiwgcik7CisgICAgICAgICAgICAgICAgcHJpbnRfaW50KCJib3VuZF9ib3R0b20iLCBiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRfaW50KCJ5YXciLCAoZG91YmxlKSBzcGhlcmljYWwtPnlhdyAvICgxIDw8IDE2KSk7CisgICAgICAgICAgICBwcmludF9pbnQoInBpdGNoIiwgKGRvdWJsZSkgc3BoZXJpY2FsLT5waXRjaCAvICgxIDw8IDE2KSk7CisgICAgICAgICAgICBwcmludF9pbnQoInJvbGwiLCAoZG91YmxlKSBzcGhlcmljYWwtPnJvbGwgLyAoMSA8PCAxNikpOworICAgICAgICB9IGVsc2UgaWYgKHNkLT50eXBlID09IEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUyAmJiBzZC0+c2l6ZSA9PSAxMCkgeworICAgICAgICAgICAgcHJpbnRfaW50KCJza2lwX3NhbXBsZXMiLCAgICBBVl9STDMyKHNkLT5kYXRhKSk7CisgICAgICAgICAgICBwcmludF9pbnQoImRpc2NhcmRfcGFkZGluZyIsIEFWX1JMMzIoc2QtPmRhdGEgKyA0KSk7CisgICAgICAgICAgICBwcmludF9pbnQoInNraXBfcmVhc29uIiwgICAgIEFWX1JMOChzZC0+ZGF0YSArIDgpKTsKKyAgICAgICAgICAgIHByaW50X2ludCgiZGlzY2FyZF9yZWFzb24iLCAgQVZfUkw4KHNkLT5kYXRhICsgOSkpOworICAgICAgICB9IGVsc2UgaWYgKHNkLT50eXBlID09IEFWX1BLVF9EQVRBX01BU1RFUklOR19ESVNQTEFZX01FVEFEQVRBKSB7CisgICAgICAgICAgICBBVk1hc3RlcmluZ0Rpc3BsYXlNZXRhZGF0YSAqbWV0YWRhdGEgPSAoQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEgKilzZC0+ZGF0YTsKKworICAgICAgICAgICAgaWYgKG1ldGFkYXRhLT5oYXNfcHJpbWFyaWVzKSB7CisgICAgICAgICAgICAgICAgcHJpbnRfcSgicmVkX3giLCBtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMF1bMF0sICcvJyk7CisgICAgICAgICAgICAgICAgcHJpbnRfcSgicmVkX3kiLCBtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMF1bMV0sICcvJyk7CisgICAgICAgICAgICAgICAgcHJpbnRfcSgiZ3JlZW5feCIsIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1sxXVswXSwgJy8nKTsKKyAgICAgICAgICAgICAgICBwcmludF9xKCJncmVlbl95IiwgbWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzFdWzFdLCAnLycpOworICAgICAgICAgICAgICAgIHByaW50X3EoImJsdWVfeCIsIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1syXVswXSwgJy8nKTsKKyAgICAgICAgICAgICAgICBwcmludF9xKCJibHVlX3kiLCBtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMl1bMV0sICcvJyk7CisKKyAgICAgICAgICAgICAgICBwcmludF9xKCJ3aGl0ZV9wb2ludF94IiwgbWV0YWRhdGEtPndoaXRlX3BvaW50WzBdLCAnLycpOworICAgICAgICAgICAgICAgIHByaW50X3EoIndoaXRlX3BvaW50X3kiLCBtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMV0sICcvJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtZXRhZGF0YS0+aGFzX2x1bWluYW5jZSkgeworICAgICAgICAgICAgICAgIHByaW50X3EoIm1pbl9sdW1pbmFuY2UiLCBtZXRhZGF0YS0+bWluX2x1bWluYW5jZSwgJy8nKTsKKyAgICAgICAgICAgICAgICBwcmludF9xKCJtYXhfbHVtaW5hbmNlIiwgbWV0YWRhdGEtPm1heF9sdW1pbmFuY2UsICcvJyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc2QtPnR5cGUgPT0gQVZfUEtUX0RBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTCkgeworICAgICAgICAgICAgQVZDb250ZW50TGlnaHRNZXRhZGF0YSAqbWV0YWRhdGEgPSAoQVZDb250ZW50TGlnaHRNZXRhZGF0YSAqKXNkLT5kYXRhOworICAgICAgICAgICAgcHJpbnRfaW50KCJtYXhfY29udGVudCIsIG1ldGFkYXRhLT5NYXhDTEwpOworICAgICAgICAgICAgcHJpbnRfaW50KCJtYXhfYXZlcmFnZSIsIG1ldGFkYXRhLT5NYXhGQUxMKTsKKyAgICAgICAgfQorICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisgICAgfQorICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfY29sb3JfcmFuZ2UoV3JpdGVyQ29udGV4dCAqdywgZW51bSBBVkNvbG9yUmFuZ2UgY29sb3JfcmFuZ2UpCit7CisgICAgY29uc3QgY2hhciAqdmFsID0gYXZfY29sb3JfcmFuZ2VfbmFtZShjb2xvcl9yYW5nZSk7CisgICAgaWYgKCF2YWwgfHwgY29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgcHJpbnRfc3RyX29wdCgiY29sb3JfcmFuZ2UiLCAidW5rbm93biIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50X3N0cigiY29sb3JfcmFuZ2UiLCB2YWwpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfY29sb3Jfc3BhY2UoV3JpdGVyQ29udGV4dCAqdywgZW51bSBBVkNvbG9yU3BhY2UgY29sb3Jfc3BhY2UpCit7CisgICAgY29uc3QgY2hhciAqdmFsID0gYXZfY29sb3Jfc3BhY2VfbmFtZShjb2xvcl9zcGFjZSk7CisgICAgaWYgKCF2YWwgfHwgY29sb3Jfc3BhY2UgPT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHByaW50X3N0cl9vcHQoImNvbG9yX3NwYWNlIiwgInVua25vd24iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcmludF9zdHIoImNvbG9yX3NwYWNlIiwgdmFsKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3ByaW1hcmllcyhXcml0ZXJDb250ZXh0ICp3LCBlbnVtIEFWQ29sb3JQcmltYXJpZXMgY29sb3JfcHJpbWFyaWVzKQoreworICAgIGNvbnN0IGNoYXIgKnZhbCA9IGF2X2NvbG9yX3ByaW1hcmllc19uYW1lKGNvbG9yX3ByaW1hcmllcyk7CisgICAgaWYgKCF2YWwgfHwgY29sb3JfcHJpbWFyaWVzID09IEFWQ09MX1BSSV9VTlNQRUNJRklFRCkgeworICAgICAgICBwcmludF9zdHJfb3B0KCJjb2xvcl9wcmltYXJpZXMiLCAidW5rbm93biIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50X3N0cigiY29sb3JfcHJpbWFyaWVzIiwgdmFsKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2NvbG9yX3RyYyhXcml0ZXJDb250ZXh0ICp3LCBlbnVtIEFWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljIGNvbG9yX3RyYykKK3sKKyAgICBjb25zdCBjaGFyICp2YWwgPSBhdl9jb2xvcl90cmFuc2Zlcl9uYW1lKGNvbG9yX3RyYyk7CisgICAgaWYgKCF2YWwgfHwgY29sb3JfdHJjID09IEFWQ09MX1RSQ19VTlNQRUNJRklFRCkgeworICAgICAgICBwcmludF9zdHJfb3B0KCJjb2xvcl90cmFuc2ZlciIsICJ1bmtub3duIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRfc3RyKCJjb2xvcl90cmFuc2ZlciIsIHZhbCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9jaHJvbWFfbG9jYXRpb24oV3JpdGVyQ29udGV4dCAqdywgZW51bSBBVkNocm9tYUxvY2F0aW9uIGNocm9tYV9sb2NhdGlvbikKK3sKKyAgICBjb25zdCBjaGFyICp2YWwgPSBhdl9jaHJvbWFfbG9jYXRpb25fbmFtZShjaHJvbWFfbG9jYXRpb24pOworICAgIGlmICghdmFsIHx8IGNocm9tYV9sb2NhdGlvbiA9PSBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgcHJpbnRfc3RyX29wdCgiY2hyb21hX2xvY2F0aW9uIiwgInVuc3BlY2lmaWVkIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRfc3RyKCJjaHJvbWFfbG9jYXRpb24iLCB2YWwpOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBjbGVhcl9sb2coaW50IG5lZWRfbG9jaykKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChuZWVkX2xvY2spCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbG9nX211dGV4KTsKKyAgICBmb3IgKGk9MDsgaTxsb2dfYnVmZmVyX3NpemU7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmbG9nX2J1ZmZlcltpXS5jb250ZXh0X25hbWUpOworICAgICAgICBhdl9mcmVlcCgmbG9nX2J1ZmZlcltpXS5wYXJlbnRfbmFtZSk7CisgICAgICAgIGF2X2ZyZWVwKCZsb2dfYnVmZmVyW2ldLmxvZ19tZXNzYWdlKTsKKyAgICB9CisgICAgbG9nX2J1ZmZlcl9zaXplID0gMDsKKyAgICBpZihuZWVkX2xvY2spCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2dfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IHNob3dfbG9nKFdyaXRlckNvbnRleHQgKncsIGludCBzZWN0aW9uX2lkcywgaW50IHNlY3Rpb25faWQsIGludCBsb2dfbGV2ZWwpCit7CisgICAgaW50IGk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZsb2dfbXV0ZXgpOworICAgIGlmICghbG9nX2J1ZmZlcl9zaXplKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2dfbXV0ZXgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIHNlY3Rpb25faWRzKTsKKworICAgIGZvciAoaT0wOyBpPGxvZ19idWZmZXJfc2l6ZTsgaSsrKSB7CisgICAgICAgIGlmIChsb2dfYnVmZmVyW2ldLmxvZ19sZXZlbCA8PSBsb2dfbGV2ZWwpIHsKKyAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBzZWN0aW9uX2lkKTsKKyAgICAgICAgICAgIHByaW50X3N0cigiY29udGV4dCIsIGxvZ19idWZmZXJbaV0uY29udGV4dF9uYW1lKTsKKyAgICAgICAgICAgIHByaW50X2ludCgibGV2ZWwiLCBsb2dfYnVmZmVyW2ldLmxvZ19sZXZlbCk7CisgICAgICAgICAgICBwcmludF9pbnQoImNhdGVnb3J5IiwgbG9nX2J1ZmZlcltpXS5jYXRlZ29yeSk7CisgICAgICAgICAgICBpZiAobG9nX2J1ZmZlcltpXS5wYXJlbnRfbmFtZSkgeworICAgICAgICAgICAgICAgIHByaW50X3N0cigicGFyZW50X2NvbnRleHQiLCBsb2dfYnVmZmVyW2ldLnBhcmVudF9uYW1lKTsKKyAgICAgICAgICAgICAgICBwcmludF9pbnQoInBhcmVudF9jYXRlZ29yeSIsIGxvZ19idWZmZXJbaV0ucGFyZW50X2NhdGVnb3J5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgicGFyZW50X2NvbnRleHQiLCAiTi9BIik7CisgICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgicGFyZW50X2NhdGVnb3J5IiwgIk4vQSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRfc3RyKCJtZXNzYWdlIiwgbG9nX2J1ZmZlcltpXS5sb2dfbWVzc2FnZSk7CisgICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisgICAgICAgIH0KKyAgICB9CisgICAgY2xlYXJfbG9nKDApOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2dfbXV0ZXgpOworCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfcGFja2V0KFdyaXRlckNvbnRleHQgKncsIElucHV0RmlsZSAqaWZpbGUsIEFWUGFja2V0ICpwa3QsIGludCBwYWNrZXRfaWR4KQoreworICAgIGNoYXIgdmFsX3N0clsxMjhdOworICAgIEFWU3RyZWFtICpzdCA9IGlmaWxlLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS5zdDsKKyAgICBBVkJQcmludCBwYnVmOworICAgIGNvbnN0IGNoYXIgKnM7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmcGJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1BBQ0tFVCk7CisKKyAgICBzID0gYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSk7CisgICAgaWYgKHMpIHByaW50X3N0ciAgICAoImNvZGVjX3R5cGUiLCBzKTsKKyAgICBlbHNlICAgcHJpbnRfc3RyX29wdCgiY29kZWNfdHlwZSIsICJ1bmtub3duIik7CisgICAgcHJpbnRfaW50KCJzdHJlYW1faW5kZXgiLCAgICAgcGt0LT5zdHJlYW1faW5kZXgpOworICAgIHByaW50X3RzICAoInB0cyIsICAgICAgICAgICAgIHBrdC0+cHRzKTsKKyAgICBwcmludF90aW1lKCJwdHNfdGltZSIsICAgICAgICBwa3QtPnB0cywgJnN0LT50aW1lX2Jhc2UpOworICAgIHByaW50X3RzICAoImR0cyIsICAgICAgICAgICAgIHBrdC0+ZHRzKTsKKyAgICBwcmludF90aW1lKCJkdHNfdGltZSIsICAgICAgICBwa3QtPmR0cywgJnN0LT50aW1lX2Jhc2UpOworICAgIHByaW50X2R1cmF0aW9uX3RzKCJkdXJhdGlvbiIsICAgICAgICBwa3QtPmR1cmF0aW9uKTsKKyAgICBwcmludF9kdXJhdGlvbl90aW1lKCJkdXJhdGlvbl90aW1lIiwgcGt0LT5kdXJhdGlvbiwgJnN0LT50aW1lX2Jhc2UpOworICAgIHByaW50X2R1cmF0aW9uX3RzKCJjb252ZXJnZW5jZV9kdXJhdGlvbiIsIHBrdC0+Y29udmVyZ2VuY2VfZHVyYXRpb24pOworICAgIHByaW50X2R1cmF0aW9uX3RpbWUoImNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWUiLCBwa3QtPmNvbnZlcmdlbmNlX2R1cmF0aW9uLCAmc3QtPnRpbWVfYmFzZSk7CisgICAgcHJpbnRfdmFsKCJzaXplIiwgICAgICAgICAgICAgcGt0LT5zaXplLCB1bml0X2J5dGVfc3RyKTsKKyAgICBpZiAocGt0LT5wb3MgIT0gLTEpIHByaW50X2ZtdCAgICAoInBvcyIsICIlIlBSSWQ2NCwgcGt0LT5wb3MpOworICAgIGVsc2UgICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgicG9zIiwgIk4vQSIpOworICAgIHByaW50X2ZtdCgiZmxhZ3MiLCAiJWMlYyIsICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSA/ICdLJyA6ICdfJywKKyAgICAgICAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0RJU0NBUkQgPyAnRCcgOiAnXycpOworCisgICAgaWYgKHBrdC0+c2lkZV9kYXRhX2VsZW1zKSB7CisgICAgICAgIGludCBzaXplOworICAgICAgICBjb25zdCB1aW50OF90ICpzaWRlX21ldGFkYXRhOworCisgICAgICAgIHNpZGVfbWV0YWRhdGEgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1NUUklOR1NfTUVUQURBVEEsICZzaXplKTsKKyAgICAgICAgaWYgKHNpZGVfbWV0YWRhdGEgJiYgc2l6ZSAmJiBkb19zaG93X3BhY2tldF90YWdzKSB7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKmRpY3QgPSBOVUxMOworICAgICAgICAgICAgaWYgKGF2X3BhY2tldF91bnBhY2tfZGljdGlvbmFyeShzaWRlX21ldGFkYXRhLCBzaXplLCAmZGljdCkgPj0gMCkKKyAgICAgICAgICAgICAgICBzaG93X3RhZ3ModywgZGljdCwgU0VDVElPTl9JRF9QQUNLRVRfVEFHUyk7CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmRpY3QpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRfcGt0X3NpZGVfZGF0YSh3LCBzdC0+Y29kZWNwYXIsIHBrdC0+c2lkZV9kYXRhLCBwa3QtPnNpZGVfZGF0YV9lbGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0lEX1BBQ0tFVF9TSURFX0RBVEFfTElTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0lEX1BBQ0tFVF9TSURFX0RBVEEpOworICAgIH0KKworICAgIGlmIChkb19zaG93X2RhdGEpCisgICAgICAgIHdyaXRlcl9wcmludF9kYXRhKHcsICJkYXRhIiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIHdyaXRlcl9wcmludF9kYXRhX2hhc2godywgImRhdGFfaGFzaCIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJnBidWYsIE5VTEwpOworICAgIGZmbHVzaChzdGRvdXQpOworfQorCitzdGF0aWMgdm9pZCBzaG93X3N1YnRpdGxlKFdyaXRlckNvbnRleHQgKncsIEFWU3VidGl0bGUgKnN1YiwgQVZTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4KQoreworICAgIEFWQlByaW50IHBidWY7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmcGJ1ZiwgMSwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1NVQlRJVExFKTsKKworICAgIHByaW50X3N0ciAoIm1lZGlhX3R5cGUiLCAgICAgICAgICJzdWJ0aXRsZSIpOworICAgIHByaW50X3RzICAoInB0cyIsICAgICAgICAgICAgICAgICBzdWItPnB0cyk7CisgICAgcHJpbnRfdGltZSgicHRzX3RpbWUiLCAgICAgICAgICAgIHN1Yi0+cHRzLCAmQVZfVElNRV9CQVNFX1EpOworICAgIHByaW50X2ludCAoImZvcm1hdCIsICAgICAgICAgICAgICBzdWItPmZvcm1hdCk7CisgICAgcHJpbnRfaW50ICgic3RhcnRfZGlzcGxheV90aW1lIiwgIHN1Yi0+c3RhcnRfZGlzcGxheV90aW1lKTsKKyAgICBwcmludF9pbnQgKCJlbmRfZGlzcGxheV90aW1lIiwgICAgc3ViLT5lbmRfZGlzcGxheV90aW1lKTsKKyAgICBwcmludF9pbnQgKCJudW1fcmVjdHMiLCAgICAgICAgICAgc3ViLT5udW1fcmVjdHMpOworCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworCisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZwYnVmLCBOVUxMKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKK30KKworc3RhdGljIHZvaWQgc2hvd19mcmFtZShXcml0ZXJDb250ZXh0ICp3LCBBVkZyYW1lICpmcmFtZSwgQVZTdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4KQoreworICAgIEFWQlByaW50IHBidWY7CisgICAgY2hhciB2YWxfc3RyWzEyOF07CisgICAgY29uc3QgY2hhciAqczsKKyAgICBpbnQgaTsKKworICAgIGF2X2JwcmludF9pbml0KCZwYnVmLCAxLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfRlJBTUUpOworCisgICAgcyA9IGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190eXBlKTsKKyAgICBpZiAocykgcHJpbnRfc3RyICAgICgibWVkaWFfdHlwZSIsIHMpOworICAgIGVsc2UgICBwcmludF9zdHJfb3B0KCJtZWRpYV90eXBlIiwgInVua25vd24iKTsKKyAgICBwcmludF9pbnQoInN0cmVhbV9pbmRleCIsICAgICAgICAgICBzdHJlYW0tPmluZGV4KTsKKyAgICBwcmludF9pbnQoImtleV9mcmFtZSIsICAgICAgICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lKTsKKyAgICBwcmludF90cyAgKCJwa3RfcHRzIiwgICAgICAgICAgICAgICBmcmFtZS0+cHRzKTsKKyAgICBwcmludF90aW1lKCJwa3RfcHRzX3RpbWUiLCAgICAgICAgICBmcmFtZS0+cHRzLCAmc3RyZWFtLT50aW1lX2Jhc2UpOworICAgIHByaW50X3RzICAoInBrdF9kdHMiLCAgICAgICAgICAgICAgIGZyYW1lLT5wa3RfZHRzKTsKKyAgICBwcmludF90aW1lKCJwa3RfZHRzX3RpbWUiLCAgICAgICAgICBmcmFtZS0+cGt0X2R0cywgJnN0cmVhbS0+dGltZV9iYXNlKTsKKyAgICBwcmludF90cyAgKCJiZXN0X2VmZm9ydF90aW1lc3RhbXAiLCBmcmFtZS0+YmVzdF9lZmZvcnRfdGltZXN0YW1wKTsKKyAgICBwcmludF90aW1lKCJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSIsIGZyYW1lLT5iZXN0X2VmZm9ydF90aW1lc3RhbXAsICZzdHJlYW0tPnRpbWVfYmFzZSk7CisgICAgcHJpbnRfZHVyYXRpb25fdHMgICgicGt0X2R1cmF0aW9uIiwgICAgICBmcmFtZS0+cGt0X2R1cmF0aW9uKTsKKyAgICBwcmludF9kdXJhdGlvbl90aW1lKCJwa3RfZHVyYXRpb25fdGltZSIsIGZyYW1lLT5wa3RfZHVyYXRpb24sICZzdHJlYW0tPnRpbWVfYmFzZSk7CisgICAgaWYgKGZyYW1lLT5wa3RfcG9zICE9IC0xKSBwcmludF9mbXQgICAgKCJwa3RfcG9zIiwgIiUiUFJJZDY0LCBmcmFtZS0+cGt0X3Bvcyk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJwa3RfcG9zIiwgIk4vQSIpOworICAgIGlmIChmcmFtZS0+cGt0X3NpemUgIT0gLTEpIHByaW50X3ZhbCAgICAoInBrdF9zaXplIiwgZnJhbWUtPnBrdF9zaXplLCB1bml0X2J5dGVfc3RyKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJwa3Rfc2l6ZSIsICJOL0EiKTsKKworICAgIHN3aXRjaCAoc3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSkgeworICAgICAgICBBVlJhdGlvbmFsIHNhcjsKKworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBwcmludF9pbnQoIndpZHRoIiwgICAgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgpOworICAgICAgICBwcmludF9pbnQoImhlaWdodCIsICAgICAgICAgICAgICAgICBmcmFtZS0+aGVpZ2h0KTsKKyAgICAgICAgcyA9IGF2X2dldF9waXhfZm10X25hbWUoZnJhbWUtPmZvcm1hdCk7CisgICAgICAgIGlmIChzKSBwcmludF9zdHIgICAgKCJwaXhfZm10Iiwgcyk7CisgICAgICAgIGVsc2UgICBwcmludF9zdHJfb3B0KCJwaXhfZm10IiwgInVua25vd24iKTsKKyAgICAgICAgc2FyID0gYXZfZ3Vlc3Nfc2FtcGxlX2FzcGVjdF9yYXRpbyhmbXRfY3R4LCBzdHJlYW0sIGZyYW1lKTsKKyAgICAgICAgaWYgKHNhci5udW0pIHsKKyAgICAgICAgICAgIHByaW50X3EoInNhbXBsZV9hc3BlY3RfcmF0aW8iLCBzYXIsICc6Jyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJzYW1wbGVfYXNwZWN0X3JhdGlvIiwgIk4vQSIpOworICAgICAgICB9CisgICAgICAgIHByaW50X2ZtdCgicGljdF90eXBlIiwgICAgICAgICAgICAgICIlYyIsIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihmcmFtZS0+cGljdF90eXBlKSk7CisgICAgICAgIHByaW50X2ludCgiY29kZWRfcGljdHVyZV9udW1iZXIiLCAgIGZyYW1lLT5jb2RlZF9waWN0dXJlX251bWJlcik7CisgICAgICAgIHByaW50X2ludCgiZGlzcGxheV9waWN0dXJlX251bWJlciIsIGZyYW1lLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyKTsKKyAgICAgICAgcHJpbnRfaW50KCJpbnRlcmxhY2VkX2ZyYW1lIiwgICAgICAgZnJhbWUtPmludGVybGFjZWRfZnJhbWUpOworICAgICAgICBwcmludF9pbnQoInRvcF9maWVsZF9maXJzdCIsICAgICAgICBmcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0KTsKKyAgICAgICAgcHJpbnRfaW50KCJyZXBlYXRfcGljdCIsICAgICAgICAgICAgZnJhbWUtPnJlcGVhdF9waWN0KTsKKworICAgICAgICBwcmludF9jb2xvcl9yYW5nZSh3LCBmcmFtZS0+Y29sb3JfcmFuZ2UpOworICAgICAgICBwcmludF9jb2xvcl9zcGFjZSh3LCBmcmFtZS0+Y29sb3JzcGFjZSk7CisgICAgICAgIHByaW50X3ByaW1hcmllcyh3LCBmcmFtZS0+Y29sb3JfcHJpbWFyaWVzKTsKKyAgICAgICAgcHJpbnRfY29sb3JfdHJjKHcsIGZyYW1lLT5jb2xvcl90cmMpOworICAgICAgICBwcmludF9jaHJvbWFfbG9jYXRpb24odywgZnJhbWUtPmNocm9tYV9sb2NhdGlvbik7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIHMgPSBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGZyYW1lLT5mb3JtYXQpOworICAgICAgICBpZiAocykgcHJpbnRfc3RyICAgICgic2FtcGxlX2ZtdCIsIHMpOworICAgICAgICBlbHNlICAgcHJpbnRfc3RyX29wdCgic2FtcGxlX2ZtdCIsICJ1bmtub3duIik7CisgICAgICAgIHByaW50X2ludCgibmJfc2FtcGxlcyIsICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICAgICBwcmludF9pbnQoImNoYW5uZWxzIiwgZnJhbWUtPmNoYW5uZWxzKTsKKyAgICAgICAgaWYgKGZyYW1lLT5jaGFubmVsX2xheW91dCkgeworICAgICAgICAgICAgYXZfYnByaW50X2NsZWFyKCZwYnVmKTsKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFubmVsX2xheW91dCgmcGJ1ZiwgZnJhbWUtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCk7CisgICAgICAgICAgICBwcmludF9zdHIgICAgKCJjaGFubmVsX2xheW91dCIsIHBidWYuc3RyKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJjaGFubmVsX2xheW91dCIsICJ1bmtub3duIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoZG9fc2hvd19mcmFtZV90YWdzKQorICAgICAgICBzaG93X3RhZ3ModywgZnJhbWUtPm1ldGFkYXRhLCBTRUNUSU9OX0lEX0ZSQU1FX1RBR1MpOworICAgIGlmIChkb19zaG93X2xvZykKKyAgICAgICAgc2hvd19sb2codywgU0VDVElPTl9JRF9GUkFNRV9MT0dTLCBTRUNUSU9OX0lEX0ZSQU1FX0xPRywgZG9fc2hvd19sb2cpOworICAgIGlmIChmcmFtZS0+bmJfc2lkZV9kYXRhKSB7CisgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX0ZSQU1FX1NJREVfREFUQV9MSVNUKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9zaWRlX2RhdGE7IGkrKykgeworICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9IGZyYW1lLT5zaWRlX2RhdGFbaV07CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworCisgICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9GUkFNRV9TSURFX0RBVEEpOworICAgICAgICAgICAgbmFtZSA9IGF2X2ZyYW1lX3NpZGVfZGF0YV9uYW1lKHNkLT50eXBlKTsKKyAgICAgICAgICAgIHByaW50X3N0cigic2lkZV9kYXRhX3R5cGUiLCBuYW1lID8gbmFtZSA6ICJ1bmtub3duIik7CisgICAgICAgICAgICBpZiAoc2QtPnR5cGUgPT0gQVZfRlJBTUVfREFUQV9ESVNQTEFZTUFUUklYICYmIHNkLT5zaXplID49IDkqNCkgeworICAgICAgICAgICAgICAgIHdyaXRlcl9wcmludF9pbnRlZ2Vycyh3LCAiZGlzcGxheW1hdHJpeCIsIHNkLT5kYXRhLCA5LCAiICUxMWQiLCAzLCA0LCAxKTsKKyAgICAgICAgICAgICAgICBwcmludF9pbnQoInJvdGF0aW9uIiwgYXZfZGlzcGxheV9yb3RhdGlvbl9nZXQoKGludDMyX3QgKilzZC0+ZGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZC0+dHlwZSA9PSBBVl9GUkFNRV9EQVRBX0dPUF9USU1FQ09ERSAmJiBzZC0+c2l6ZSA+PSA4KSB7CisgICAgICAgICAgICAgICAgY2hhciB0Y2J1ZltBVl9USU1FQ09ERV9TVFJfU0laRV07CisgICAgICAgICAgICAgICAgYXZfdGltZWNvZGVfbWFrZV9tcGVnX3RjX3N0cmluZyh0Y2J1ZiwgKihpbnQ2NF90ICopKHNkLT5kYXRhKSk7CisgICAgICAgICAgICAgICAgcHJpbnRfc3RyKCJ0aW1lY29kZSIsIHRjYnVmKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2QtPnR5cGUgPT0gQVZfRlJBTUVfREFUQV9NQVNURVJJTkdfRElTUExBWV9NRVRBREFUQSkgeworICAgICAgICAgICAgICAgIEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhICptZXRhZGF0YSA9IChBVk1hc3RlcmluZ0Rpc3BsYXlNZXRhZGF0YSAqKXNkLT5kYXRhOworCisgICAgICAgICAgICAgICAgaWYgKG1ldGFkYXRhLT5oYXNfcHJpbWFyaWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50X3EoInJlZF94IiwgbWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzBdWzBdLCAnLycpOworICAgICAgICAgICAgICAgICAgICBwcmludF9xKCJyZWRfeSIsIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1swXVsxXSwgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfcSgiZ3JlZW5feCIsIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1sxXVswXSwgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfcSgiZ3JlZW5feSIsIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1sxXVsxXSwgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfcSgiYmx1ZV94IiwgbWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzJdWzBdLCAnLycpOworICAgICAgICAgICAgICAgICAgICBwcmludF9xKCJibHVlX3kiLCBtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMl1bMV0sICcvJyk7CisKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfcSgid2hpdGVfcG9pbnRfeCIsIG1ldGFkYXRhLT53aGl0ZV9wb2ludFswXSwgJy8nKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfcSgid2hpdGVfcG9pbnRfeSIsIG1ldGFkYXRhLT53aGl0ZV9wb2ludFsxXSwgJy8nKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEtPmhhc19sdW1pbmFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfcSgibWluX2x1bWluYW5jZSIsIG1ldGFkYXRhLT5taW5fbHVtaW5hbmNlLCAnLycpOworICAgICAgICAgICAgICAgICAgICBwcmludF9xKCJtYXhfbHVtaW5hbmNlIiwgbWV0YWRhdGEtPm1heF9sdW1pbmFuY2UsICcvJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChzZC0+dHlwZSA9PSBBVl9GUkFNRV9EQVRBX0NPTlRFTlRfTElHSFRfTEVWRUwpIHsKKyAgICAgICAgICAgICAgICBBVkNvbnRlbnRMaWdodE1ldGFkYXRhICptZXRhZGF0YSA9IChBVkNvbnRlbnRMaWdodE1ldGFkYXRhICopc2QtPmRhdGE7CisgICAgICAgICAgICAgICAgcHJpbnRfaW50KCJtYXhfY29udGVudCIsIG1ldGFkYXRhLT5NYXhDTEwpOworICAgICAgICAgICAgICAgIHByaW50X2ludCgibWF4X2F2ZXJhZ2UiLCBtZXRhZGF0YS0+TWF4RkFMTCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNkLT50eXBlID09IEFWX0ZSQU1FX0RBVEFfSUNDX1BST0ZJTEUpIHsKKyAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gYXZfZGljdF9nZXQoc2QtPm1ldGFkYXRhLCAibmFtZSIsIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSk7CisgICAgICAgICAgICAgICAgaWYgKHRhZykKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RyKHRhZy0+a2V5LCB0YWctPnZhbHVlKTsKKyAgICAgICAgICAgICAgICBwcmludF9pbnQoInNpemUiLCBzZC0+c2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworICAgIH0KKworICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKKworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcGJ1ZiwgTlVMTCk7CisgICAgZmZsdXNoKHN0ZG91dCk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBwcm9jZXNzX2ZyYW1lKFdyaXRlckNvbnRleHQgKncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEZpbGUgKmlmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnBhY2tldF9uZXcpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4ID0gaWZpbGUtPmZtdF9jdHg7CisgICAgQVZDb2RlY0NvbnRleHQgKmRlY19jdHggPSBpZmlsZS0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0uZGVjX2N0eDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gaWZpbGUtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLnN0LT5jb2RlY3BhcjsKKyAgICBBVlN1YnRpdGxlIHN1YjsKKyAgICBpbnQgcmV0ID0gMCwgZ290X2ZyYW1lID0gMDsKKworICAgIGNsZWFyX2xvZygxKTsKKyAgICBpZiAoZGVjX2N0eCAmJiBkZWNfY3R4LT5jb2RlYykgeworICAgICAgICBzd2l0Y2ggKHBhci0+Y29kZWNfdHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgICAgICBpZiAoKnBhY2tldF9uZXcpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhdmNvZGVjX3NlbmRfcGFja2V0KGRlY19jdHgsIHBrdCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA+PSAwIHx8IHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAqcGFja2V0X25ldyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19yZWNlaXZlX2ZyYW1lKGRlY19jdHgsIGZyYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZ290X2ZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikgfHwgcmV0ID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgICAgICBpZiAoKnBhY2tldF9uZXcpCisgICAgICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfc3VidGl0bGUyKGRlY19jdHgsICZzdWIsICZnb3RfZnJhbWUsIHBrdCk7CisgICAgICAgICAgICAqcGFja2V0X25ldyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICpwYWNrZXRfbmV3ID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpwYWNrZXRfbmV3ID0gMDsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoZ290X2ZyYW1lKSB7CisgICAgICAgIGludCBpc19zdWIgPSAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSk7CisgICAgICAgIG5iX3N0cmVhbXNfZnJhbWVzW3BrdC0+c3RyZWFtX2luZGV4XSsrOworICAgICAgICBpZiAoZG9fc2hvd19mcmFtZXMpCisgICAgICAgICAgICBpZiAoaXNfc3ViKQorICAgICAgICAgICAgICAgIHNob3dfc3VidGl0bGUodywgJnN1YiwgaWZpbGUtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLnN0LCBmbXRfY3R4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzaG93X2ZyYW1lKHcsIGZyYW1lLCBpZmlsZS0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0uc3QsIGZtdF9jdHgpOworICAgICAgICBpZiAoaXNfc3ViKQorICAgICAgICAgICAgYXZzdWJ0aXRsZV9mcmVlKCZzdWIpOworICAgIH0KKyAgICByZXR1cm4gZ290X2ZyYW1lIHx8ICpwYWNrZXRfbmV3OworfQorCitzdGF0aWMgdm9pZCBsb2dfcmVhZF9pbnRlcnZhbChjb25zdCBSZWFkSW50ZXJ2YWwgKmludGVydmFsLCB2b2lkICpsb2dfY3R4LCBpbnQgbG9nX2xldmVsKQoreworICAgIGF2X2xvZyhsb2dfY3R4LCBsb2dfbGV2ZWwsICJpZDolZCIsIGludGVydmFsLT5pZCk7CisKKyAgICBpZiAoaW50ZXJ2YWwtPmhhc19zdGFydCkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiIHN0YXJ0OiVzJXMiLCBpbnRlcnZhbC0+c3RhcnRfaXNfb2Zmc2V0ID8gIisiIDogIiIsCisgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGludGVydmFsLT5zdGFydCwgJkFWX1RJTUVfQkFTRV9RKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiBzdGFydDpOL0EiKTsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJ2YWwtPmhhc19lbmQpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiBlbmQ6JXMiLCBpbnRlcnZhbC0+ZW5kX2lzX29mZnNldCA/ICIrIiA6ICIiKTsKKyAgICAgICAgaWYgKGludGVydmFsLT5kdXJhdGlvbl9mcmFtZXMpCisgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiIyUiUFJJZDY0LCBpbnRlcnZhbC0+ZW5kKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiVzIiwgYXZfdHMydGltZXN0cihpbnRlcnZhbC0+ZW5kLCAmQVZfVElNRV9CQVNFX1EpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiIGVuZDpOL0EiKTsKKyAgICB9CisKKyAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiXG4iKTsKK30KKworc3RhdGljIGludCByZWFkX2ludGVydmFsX3BhY2tldHMoV3JpdGVyQ29udGV4dCAqdywgSW5wdXRGaWxlICppZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlYWRJbnRlcnZhbCAqaW50ZXJ2YWwsIGludDY0X3QgKmN1cl90cykKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHggPSBpZmlsZS0+Zm10X2N0eDsKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBOVUxMOworICAgIGludCByZXQgPSAwLCBpID0gMCwgZnJhbWVfY291bnQgPSAwOworICAgIGludDY0X3Qgc3RhcnQgPSAtSU5UNjRfTUFYLCBlbmQgPSBpbnRlcnZhbC0+ZW5kOworICAgIGludCBoYXNfc3RhcnQgPSAwLCBoYXNfZW5kID0gaW50ZXJ2YWwtPmhhc19lbmQgJiYgIWludGVydmFsLT5lbmRfaXNfb2Zmc2V0OworCisgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJQcm9jZXNzaW5nIHJlYWQgaW50ZXJ2YWwgIik7CisgICAgbG9nX3JlYWRfaW50ZXJ2YWwoaW50ZXJ2YWwsIE5VTEwsIEFWX0xPR19WRVJCT1NFKTsKKworICAgIGlmIChpbnRlcnZhbC0+aGFzX3N0YXJ0KSB7CisgICAgICAgIGludDY0X3QgdGFyZ2V0OworICAgICAgICBpZiAoaW50ZXJ2YWwtPnN0YXJ0X2lzX29mZnNldCkgeworICAgICAgICAgICAgaWYgKCpjdXJfdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IHNlZWsgdG8gcmVsYXRpdmUgcG9zaXRpb24gc2luY2UgY3VycmVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lc3RhbXAgaXMgbm90IGRlZmluZWRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldCA9ICpjdXJfdHMgKyBpbnRlcnZhbC0+c3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YXJnZXQgPSBpbnRlcnZhbC0+c3RhcnQ7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJTZWVraW5nIHRvIHJlYWQgaW50ZXJ2YWwgc3RhcnQgcG9pbnQgJXNcbiIsCisgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKHRhcmdldCwgJkFWX1RJTUVfQkFTRV9RKSk7CisgICAgICAgIGlmICgocmV0ID0gYXZmb3JtYXRfc2Vla19maWxlKGZtdF9jdHgsIC0xLCAtSU5UNjRfTUFYLCB0YXJnZXQsIElOVDY0X01BWCwgMCkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzZWVrIHRvIHBvc2l0aW9uICUiUFJJZDY0IjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPnN0YXJ0LCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFmcmFtZSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICB3aGlsZSAoIWF2X3JlYWRfZnJhbWUoZm10X2N0eCwgJnBrdCkpIHsKKyAgICAgICAgaWYgKGZtdF9jdHgtPm5iX3N0cmVhbXMgPiBuYl9zdHJlYW1zKSB7CisgICAgICAgICAgICBSRUFMTE9DWl9BUlJBWV9TVFJFQU0obmJfc3RyZWFtc19mcmFtZXMsICBuYl9zdHJlYW1zLCBmbXRfY3R4LT5uYl9zdHJlYW1zKTsKKyAgICAgICAgICAgIFJFQUxMT0NaX0FSUkFZX1NUUkVBTShuYl9zdHJlYW1zX3BhY2tldHMsIG5iX3N0cmVhbXMsIGZtdF9jdHgtPm5iX3N0cmVhbXMpOworICAgICAgICAgICAgUkVBTExPQ1pfQVJSQVlfU1RSRUFNKHNlbGVjdGVkX3N0cmVhbXMsICAgbmJfc3RyZWFtcywgZm10X2N0eC0+bmJfc3RyZWFtcyk7CisgICAgICAgICAgICBuYl9zdHJlYW1zID0gZm10X2N0eC0+bmJfc3RyZWFtczsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VsZWN0ZWRfc3RyZWFtc1twa3Quc3RyZWFtX2luZGV4XSkgeworICAgICAgICAgICAgQVZSYXRpb25hbCB0YiA9IGlmaWxlLT5zdHJlYW1zW3BrdC5zdHJlYW1faW5kZXhdLnN0LT50aW1lX2Jhc2U7CisKKyAgICAgICAgICAgIGlmIChwa3QucHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICpjdXJfdHMgPSBhdl9yZXNjYWxlX3EocGt0LnB0cywgdGIsIEFWX1RJTUVfQkFTRV9RKTsKKworICAgICAgICAgICAgaWYgKCFoYXNfc3RhcnQgJiYgKmN1cl90cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIHN0YXJ0ID0gKmN1cl90czsKKyAgICAgICAgICAgICAgICBoYXNfc3RhcnQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaGFzX3N0YXJ0ICYmICFoYXNfZW5kICYmIGludGVydmFsLT5lbmRfaXNfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBpbnRlcnZhbC0+ZW5kOworICAgICAgICAgICAgICAgIGhhc19lbmQgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW50ZXJ2YWwtPmVuZF9pc19vZmZzZXQgJiYgaW50ZXJ2YWwtPmR1cmF0aW9uX2ZyYW1lcykgeworICAgICAgICAgICAgICAgIGlmIChmcmFtZV9jb3VudCA+PSBpbnRlcnZhbC0+ZW5kKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaGFzX2VuZCAmJiAqY3VyX3RzICE9IEFWX05PUFRTX1ZBTFVFICYmICpjdXJfdHMgPj0gZW5kKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lX2NvdW50Kys7CisgICAgICAgICAgICBpZiAoZG9fcmVhZF9wYWNrZXRzKSB7CisgICAgICAgICAgICAgICAgaWYgKGRvX3Nob3dfcGFja2V0cykKKyAgICAgICAgICAgICAgICAgICAgc2hvd19wYWNrZXQodywgaWZpbGUsICZwa3QsIGkrKyk7CisgICAgICAgICAgICAgICAgbmJfc3RyZWFtc19wYWNrZXRzW3BrdC5zdHJlYW1faW5kZXhdKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZG9fcmVhZF9mcmFtZXMpIHsKKyAgICAgICAgICAgICAgICBpbnQgcGFja2V0X25ldyA9IDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKHByb2Nlc3NfZnJhbWUodywgaWZpbGUsIGZyYW1lLCAmcGt0LCAmcGFja2V0X25ldykgPiAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgfQorICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOworICAgIHBrdC5kYXRhID0gTlVMTDsKKyAgICBwa3Quc2l6ZSA9IDA7CisgICAgLy9GbHVzaCByZW1haW5pbmcgZnJhbWVzIHRoYXQgYXJlIGNhY2hlZCBpbiB0aGUgZGVjb2RlcgorICAgIGZvciAoaSA9IDA7IGkgPCBmbXRfY3R4LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgcGt0LnN0cmVhbV9pbmRleCA9IGk7CisgICAgICAgIGlmIChkb19yZWFkX2ZyYW1lcykKKyAgICAgICAgICAgIHdoaWxlIChwcm9jZXNzX2ZyYW1lKHcsIGlmaWxlLCBmcmFtZSwgJnBrdCwgJihpbnQpezF9KSA+IDApOworICAgIH0KKworZW5kOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHJlYWQgcGFja2V0cyBpbiBpbnRlcnZhbCAiKTsKKyAgICAgICAgbG9nX3JlYWRfaW50ZXJ2YWwoaW50ZXJ2YWwsIE5VTEwsIEFWX0xPR19FUlJPUik7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXRzKFdyaXRlckNvbnRleHQgKncsIElucHV0RmlsZSAqaWZpbGUpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4ID0gaWZpbGUtPmZtdF9jdHg7CisgICAgaW50IGksIHJldCA9IDA7CisgICAgaW50NjRfdCBjdXJfdHMgPSBmbXRfY3R4LT5zdGFydF90aW1lOworCisgICAgaWYgKHJlYWRfaW50ZXJ2YWxzX25iID09IDApIHsKKyAgICAgICAgUmVhZEludGVydmFsIGludGVydmFsID0gKFJlYWRJbnRlcnZhbCkgeyAuaGFzX3N0YXJ0ID0gMCwgLmhhc19lbmQgPSAwIH07CisgICAgICAgIHJldCA9IHJlYWRfaW50ZXJ2YWxfcGFja2V0cyh3LCBpZmlsZSwgJmludGVydmFsLCAmY3VyX3RzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVhZF9pbnRlcnZhbHNfbmI7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gcmVhZF9pbnRlcnZhbF9wYWNrZXRzKHcsIGlmaWxlLCAmcmVhZF9pbnRlcnZhbHNbaV0sICZjdXJfdHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNob3dfc3RyZWFtKFdyaXRlckNvbnRleHQgKncsIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCwgaW50IHN0cmVhbV9pZHgsIElucHV0U3RyZWFtICppc3QsIGludCBpbl9wcm9ncmFtKQoreworICAgIEFWU3RyZWFtICpzdHJlYW0gPSBpc3QtPnN0OworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXI7CisgICAgQVZDb2RlY0NvbnRleHQgKmRlY19jdHg7CisgICAgY2hhciB2YWxfc3RyWzEyOF07CisgICAgY29uc3QgY2hhciAqczsKKyAgICBBVlJhdGlvbmFsIHNhciwgZGFyOworICAgIEFWQlByaW50IHBidWY7CisgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmNkOworICAgIGludCByZXQgPSAwOworICAgIGNvbnN0IGNoYXIgKnByb2ZpbGUgPSBOVUxMOworCisgICAgYXZfYnByaW50X2luaXQoJnBidWYsIDEsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisKKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgaW5fcHJvZ3JhbSA/IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU0gOiBTRUNUSU9OX0lEX1NUUkVBTSk7CisKKyAgICBwcmludF9pbnQoImluZGV4Iiwgc3RyZWFtLT5pbmRleCk7CisKKyAgICBwYXIgICAgID0gc3RyZWFtLT5jb2RlY3BhcjsKKyAgICBkZWNfY3R4ID0gaXN0LT5kZWNfY3R4OworICAgIGlmIChjZCA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQocGFyLT5jb2RlY19pZCkpIHsKKyAgICAgICAgcHJpbnRfc3RyKCJjb2RlY19uYW1lIiwgY2QtPm5hbWUpOworICAgICAgICBpZiAoIWRvX2JpdGV4YWN0KSB7CisgICAgICAgICAgICBwcmludF9zdHIoImNvZGVjX2xvbmdfbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgY2QtPmxvbmdfbmFtZSA/IGNkLT5sb25nX25hbWUgOiAidW5rbm93biIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRfc3RyX29wdCgiY29kZWNfbmFtZSIsICJ1bmtub3duIik7CisgICAgICAgIGlmICghZG9fYml0ZXhhY3QpIHsKKyAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImNvZGVjX2xvbmdfbmFtZSIsICJ1bmtub3duIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWRvX2JpdGV4YWN0ICYmIChwcm9maWxlID0gYXZjb2RlY19wcm9maWxlX25hbWUocGFyLT5jb2RlY19pZCwgcGFyLT5wcm9maWxlKSkpCisgICAgICAgIHByaW50X3N0cigicHJvZmlsZSIsIHByb2ZpbGUpOworICAgIGVsc2UgeworICAgICAgICBpZiAocGFyLT5wcm9maWxlICE9IEZGX1BST0ZJTEVfVU5LTk9XTikgeworICAgICAgICAgICAgY2hhciBwcm9maWxlX251bVsxMl07CisgICAgICAgICAgICBzbnByaW50Zihwcm9maWxlX251bSwgc2l6ZW9mKHByb2ZpbGVfbnVtKSwgIiVkIiwgcGFyLT5wcm9maWxlKTsKKyAgICAgICAgICAgIHByaW50X3N0cigicHJvZmlsZSIsIHByb2ZpbGVfbnVtKTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJwcm9maWxlIiwgInVua25vd24iKTsKKyAgICB9CisKKyAgICBzID0gYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHBhci0+Y29kZWNfdHlwZSk7CisgICAgaWYgKHMpIHByaW50X3N0ciAgICAoImNvZGVjX3R5cGUiLCBzKTsKKyAgICBlbHNlICAgcHJpbnRfc3RyX29wdCgiY29kZWNfdHlwZSIsICJ1bmtub3duIik7CisjaWYgRkZfQVBJX0xBVkZfQVZDVFgKKyAgICBpZiAoZGVjX2N0eCkKKyAgICAgICAgcHJpbnRfcSgiY29kZWNfdGltZV9iYXNlIiwgZGVjX2N0eC0+dGltZV9iYXNlLCAnLycpOworI2VuZGlmCisKKyAgICAvKiBwcmludCBBVkkvRm91ckNDIHRhZyAqLworICAgIHByaW50X3N0cigiY29kZWNfdGFnX3N0cmluZyIsICAgIGF2X2ZvdXJjYzJzdHIocGFyLT5jb2RlY190YWcpKTsKKyAgICBwcmludF9mbXQoImNvZGVjX3RhZyIsICIweCUwNCJQUkl4MzIsIHBhci0+Y29kZWNfdGFnKTsKKworICAgIHN3aXRjaCAocGFyLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIHByaW50X2ludCgid2lkdGgiLCAgICAgICAgcGFyLT53aWR0aCk7CisgICAgICAgIHByaW50X2ludCgiaGVpZ2h0IiwgICAgICAgcGFyLT5oZWlnaHQpOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgICAgIGlmIChkZWNfY3R4KSB7CisgICAgICAgICAgICBwcmludF9pbnQoImNvZGVkX3dpZHRoIiwgIGRlY19jdHgtPmNvZGVkX3dpZHRoKTsKKyAgICAgICAgICAgIHByaW50X2ludCgiY29kZWRfaGVpZ2h0IiwgZGVjX2N0eC0+Y29kZWRfaGVpZ2h0KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHByaW50X2ludCgiaGFzX2JfZnJhbWVzIiwgcGFyLT52aWRlb19kZWxheSk7CisgICAgICAgIHNhciA9IGF2X2d1ZXNzX3NhbXBsZV9hc3BlY3RfcmF0aW8oZm10X2N0eCwgc3RyZWFtLCBOVUxMKTsKKyAgICAgICAgaWYgKHNhci5udW0pIHsKKyAgICAgICAgICAgIHByaW50X3EoInNhbXBsZV9hc3BlY3RfcmF0aW8iLCBzYXIsICc6Jyk7CisgICAgICAgICAgICBhdl9yZWR1Y2UoJmRhci5udW0sICZkYXIuZGVuLAorICAgICAgICAgICAgICAgICAgICAgIHBhci0+d2lkdGggICogc2FyLm51bSwKKyAgICAgICAgICAgICAgICAgICAgICBwYXItPmhlaWdodCAqIHNhci5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgMTAyNCoxMDI0KTsKKyAgICAgICAgICAgIHByaW50X3EoImRpc3BsYXlfYXNwZWN0X3JhdGlvIiwgZGFyLCAnOicpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgic2FtcGxlX2FzcGVjdF9yYXRpbyIsICJOL0EiKTsKKyAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImRpc3BsYXlfYXNwZWN0X3JhdGlvIiwgIk4vQSIpOworICAgICAgICB9CisgICAgICAgIHMgPSBhdl9nZXRfcGl4X2ZtdF9uYW1lKHBhci0+Zm9ybWF0KTsKKyAgICAgICAgaWYgKHMpIHByaW50X3N0ciAgICAoInBpeF9mbXQiLCBzKTsKKyAgICAgICAgZWxzZSAgIHByaW50X3N0cl9vcHQoInBpeF9mbXQiLCAidW5rbm93biIpOworICAgICAgICBwcmludF9pbnQoImxldmVsIiwgICBwYXItPmxldmVsKTsKKworICAgICAgICBwcmludF9jb2xvcl9yYW5nZSh3LCBwYXItPmNvbG9yX3JhbmdlKTsKKyAgICAgICAgcHJpbnRfY29sb3Jfc3BhY2UodywgcGFyLT5jb2xvcl9zcGFjZSk7CisgICAgICAgIHByaW50X2NvbG9yX3RyYyh3LCBwYXItPmNvbG9yX3RyYyk7CisgICAgICAgIHByaW50X3ByaW1hcmllcyh3LCBwYXItPmNvbG9yX3ByaW1hcmllcyk7CisgICAgICAgIHByaW50X2Nocm9tYV9sb2NhdGlvbih3LCBwYXItPmNocm9tYV9sb2NhdGlvbik7CisKKyAgICAgICAgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfUFJPR1JFU1NJVkUpCisgICAgICAgICAgICBwcmludF9zdHIoImZpZWxkX29yZGVyIiwgInByb2dyZXNzaXZlIik7CisgICAgICAgIGVsc2UgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVFQpCisgICAgICAgICAgICBwcmludF9zdHIoImZpZWxkX29yZGVyIiwgInR0Iik7CisgICAgICAgIGVsc2UgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQkIpCisgICAgICAgICAgICBwcmludF9zdHIoImZpZWxkX29yZGVyIiwgImJiIik7CisgICAgICAgIGVsc2UgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVEIpCisgICAgICAgICAgICBwcmludF9zdHIoImZpZWxkX29yZGVyIiwgInRiIik7CisgICAgICAgIGVsc2UgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQlQpCisgICAgICAgICAgICBwcmludF9zdHIoImZpZWxkX29yZGVyIiwgImJ0Iik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImZpZWxkX29yZGVyIiwgInVua25vd24iKTsKKworI2lmIEZGX0FQSV9QUklWQVRFX09QVAorICAgICAgICBpZiAoZGVjX2N0eCAmJiBkZWNfY3R4LT50aW1lY29kZV9mcmFtZV9zdGFydCA+PSAwKSB7CisgICAgICAgICAgICBjaGFyIHRjYnVmW0FWX1RJTUVDT0RFX1NUUl9TSVpFXTsKKyAgICAgICAgICAgIGF2X3RpbWVjb2RlX21ha2VfbXBlZ190Y19zdHJpbmcodGNidWYsIGRlY19jdHgtPnRpbWVjb2RlX2ZyYW1lX3N0YXJ0KTsKKyAgICAgICAgICAgIHByaW50X3N0cigidGltZWNvZGUiLCB0Y2J1Zik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJ0aW1lY29kZSIsICJOL0EiKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChkZWNfY3R4KQorICAgICAgICAgICAgcHJpbnRfaW50KCJyZWZzIiwgZGVjX2N0eC0+cmVmcyk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIHMgPSBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHBhci0+Zm9ybWF0KTsKKyAgICAgICAgaWYgKHMpIHByaW50X3N0ciAgICAoInNhbXBsZV9mbXQiLCBzKTsKKyAgICAgICAgZWxzZSAgIHByaW50X3N0cl9vcHQoInNhbXBsZV9mbXQiLCAidW5rbm93biIpOworICAgICAgICBwcmludF92YWwoInNhbXBsZV9yYXRlIiwgICAgIHBhci0+c2FtcGxlX3JhdGUsIHVuaXRfaGVydHpfc3RyKTsKKyAgICAgICAgcHJpbnRfaW50KCJjaGFubmVscyIsICAgICAgICBwYXItPmNoYW5uZWxzKTsKKworICAgICAgICBpZiAocGFyLT5jaGFubmVsX2xheW91dCkgeworICAgICAgICAgICAgYXZfYnByaW50X2NsZWFyKCZwYnVmKTsKKyAgICAgICAgICAgIGF2X2JwcmludF9jaGFubmVsX2xheW91dCgmcGJ1ZiwgcGFyLT5jaGFubmVscywgcGFyLT5jaGFubmVsX2xheW91dCk7CisgICAgICAgICAgICBwcmludF9zdHIgICAgKCJjaGFubmVsX2xheW91dCIsIHBidWYuc3RyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImNoYW5uZWxfbGF5b3V0IiwgInVua25vd24iKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50X2ludCgiYml0c19wZXJfc2FtcGxlIiwgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShwYXItPmNvZGVjX2lkKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgIGlmIChwYXItPndpZHRoKQorICAgICAgICAgICAgcHJpbnRfaW50KCJ3aWR0aCIsICAgICAgIHBhci0+d2lkdGgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJ3aWR0aCIsICAgIk4vQSIpOworICAgICAgICBpZiAocGFyLT5oZWlnaHQpCisgICAgICAgICAgICBwcmludF9pbnQoImhlaWdodCIsICAgICAgcGFyLT5oZWlnaHQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJoZWlnaHQiLCAgIk4vQSIpOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoZGVjX2N0eCAmJiBkZWNfY3R4LT5jb2RlYyAmJiBkZWNfY3R4LT5jb2RlYy0+cHJpdl9jbGFzcyAmJiBzaG93X3ByaXZhdGVfZGF0YSkgeworICAgICAgICBjb25zdCBBVk9wdGlvbiAqb3B0ID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKG9wdCA9IGF2X29wdF9uZXh0KGRlY19jdHgtPnByaXZfZGF0YSxvcHQpKSB7CisgICAgICAgICAgICB1aW50OF90ICpzdHI7CisgICAgICAgICAgICBpZiAob3B0LT5mbGFncykgY29udGludWU7CisgICAgICAgICAgICBpZiAoYXZfb3B0X2dldChkZWNfY3R4LT5wcml2X2RhdGEsIG9wdC0+bmFtZSwgMCwgJnN0cikgPj0gMCkgeworICAgICAgICAgICAgICAgIHByaW50X3N0cihvcHQtPm5hbWUsIHN0cik7CisgICAgICAgICAgICAgICAgYXZfZnJlZShzdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZtdF9jdHgtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfU0hPV19JRFMpIHByaW50X2ZtdCAgICAoImlkIiwgIjB4JXgiLCBzdHJlYW0tPmlkKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgiaWQiLCAiTi9BIik7CisgICAgcHJpbnRfcSgicl9mcmFtZV9yYXRlIiwgICBzdHJlYW0tPnJfZnJhbWVfcmF0ZSwgICAnLycpOworICAgIHByaW50X3EoImF2Z19mcmFtZV9yYXRlIiwgc3RyZWFtLT5hdmdfZnJhbWVfcmF0ZSwgJy8nKTsKKyAgICBwcmludF9xKCJ0aW1lX2Jhc2UiLCAgICAgIHN0cmVhbS0+dGltZV9iYXNlLCAgICAgICcvJyk7CisgICAgcHJpbnRfdHMgICgic3RhcnRfcHRzIiwgICBzdHJlYW0tPnN0YXJ0X3RpbWUpOworICAgIHByaW50X3RpbWUoInN0YXJ0X3RpbWUiLCAgc3RyZWFtLT5zdGFydF90aW1lLCAmc3RyZWFtLT50aW1lX2Jhc2UpOworICAgIHByaW50X3RzICAoImR1cmF0aW9uX3RzIiwgc3RyZWFtLT5kdXJhdGlvbik7CisgICAgcHJpbnRfdGltZSgiZHVyYXRpb24iLCAgICBzdHJlYW0tPmR1cmF0aW9uLCAmc3RyZWFtLT50aW1lX2Jhc2UpOworICAgIGlmIChwYXItPmJpdF9yYXRlID4gMCkgICAgIHByaW50X3ZhbCAgICAoImJpdF9yYXRlIiwgcGFyLT5iaXRfcmF0ZSwgdW5pdF9iaXRfcGVyX3NlY29uZF9zdHIpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImJpdF9yYXRlIiwgIk4vQSIpOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgaWYgKHN0cmVhbS0+Y29kZWMtPnJjX21heF9yYXRlID4gMCkgcHJpbnRfdmFsICgibWF4X2JpdF9yYXRlIiwgc3RyZWFtLT5jb2RlYy0+cmNfbWF4X3JhdGUsIHVuaXRfYml0X3Blcl9zZWNvbmRfc3RyKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJtYXhfYml0X3JhdGUiLCAiTi9BIik7CisjZW5kaWYKKyAgICBpZiAoZGVjX2N0eCAmJiBkZWNfY3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID4gMCkgcHJpbnRfZm10KCJiaXRzX3Blcl9yYXdfc2FtcGxlIiwgIiVkIiwgZGVjX2N0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImJpdHNfcGVyX3Jhd19zYW1wbGUiLCAiTi9BIik7CisgICAgaWYgKHN0cmVhbS0+bmJfZnJhbWVzKSBwcmludF9mbXQgICAgKCJuYl9mcmFtZXMiLCAiJSJQUklkNjQsIHN0cmVhbS0+bmJfZnJhbWVzKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoIm5iX2ZyYW1lcyIsICJOL0EiKTsKKyAgICBpZiAobmJfc3RyZWFtc19mcmFtZXNbc3RyZWFtX2lkeF0pICBwcmludF9mbXQgICAgKCJuYl9yZWFkX2ZyYW1lcyIsICIlIlBSSXU2NCwgbmJfc3RyZWFtc19mcmFtZXNbc3RyZWFtX2lkeF0pOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoIm5iX3JlYWRfZnJhbWVzIiwgIk4vQSIpOworICAgIGlmIChuYl9zdHJlYW1zX3BhY2tldHNbc3RyZWFtX2lkeF0pIHByaW50X2ZtdCAgICAoIm5iX3JlYWRfcGFja2V0cyIsICIlIlBSSXU2NCwgbmJfc3RyZWFtc19wYWNrZXRzW3N0cmVhbV9pZHhdKTsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdHJfb3B0KCJuYl9yZWFkX3BhY2tldHMiLCAiTi9BIik7CisgICAgaWYgKGRvX3Nob3dfZGF0YSkKKyAgICAgICAgd3JpdGVyX3ByaW50X2RhdGEodywgImV4dHJhZGF0YSIsIHBhci0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgd3JpdGVyX3ByaW50X2RhdGFfaGFzaCh3LCAiZXh0cmFkYXRhX2hhc2giLCBwYXItPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgLyogUHJpbnQgZGlzcG9zaXRpb24gaW5mb3JtYXRpb24gKi8KKyNkZWZpbmUgUFJJTlRfRElTUE9TSVRJT04oZmxhZ25hbWUsIG5hbWUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpbnRfaW50KG5hbWUsICEhKHN0cmVhbS0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl8jI2ZsYWduYW1lKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgaWYgKGRvX3Nob3dfc3RyZWFtX2Rpc3Bvc2l0aW9uKSB7CisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIGluX3Byb2dyYW0gPyBTRUNUSU9OX0lEX1BST0dSQU1fU1RSRUFNX0RJU1BPU0lUSU9OIDogU0VDVElPTl9JRF9TVFJFQU1fRElTUE9TSVRJT04pOworICAgIFBSSU5UX0RJU1BPU0lUSU9OKERFRkFVTFQsICAgICAgICAgICJkZWZhdWx0Iik7CisgICAgUFJJTlRfRElTUE9TSVRJT04oRFVCLCAgICAgICAgICAgICAgImR1YiIpOworICAgIFBSSU5UX0RJU1BPU0lUSU9OKE9SSUdJTkFMLCAgICAgICAgICJvcmlnaW5hbCIpOworICAgIFBSSU5UX0RJU1BPU0lUSU9OKENPTU1FTlQsICAgICAgICAgICJjb21tZW50Iik7CisgICAgUFJJTlRfRElTUE9TSVRJT04oTFlSSUNTLCAgICAgICAgICAgImx5cmljcyIpOworICAgIFBSSU5UX0RJU1BPU0lUSU9OKEtBUkFPS0UsICAgICAgICAgICJrYXJhb2tlIik7CisgICAgUFJJTlRfRElTUE9TSVRJT04oRk9SQ0VELCAgICAgICAgICAgImZvcmNlZCIpOworICAgIFBSSU5UX0RJU1BPU0lUSU9OKEhFQVJJTkdfSU1QQUlSRUQsICJoZWFyaW5nX2ltcGFpcmVkIik7CisgICAgUFJJTlRfRElTUE9TSVRJT04oVklTVUFMX0lNUEFJUkVELCAgInZpc3VhbF9pbXBhaXJlZCIpOworICAgIFBSSU5UX0RJU1BPU0lUSU9OKENMRUFOX0VGRkVDVFMsICAgICJjbGVhbl9lZmZlY3RzIik7CisgICAgUFJJTlRfRElTUE9TSVRJT04oQVRUQUNIRURfUElDLCAgICAgImF0dGFjaGVkX3BpYyIpOworICAgIFBSSU5UX0RJU1BPU0lUSU9OKFRJTUVEX1RIVU1CTkFJTFMsICJ0aW1lZF90aHVtYm5haWxzIik7CisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworICAgIH0KKworICAgIGlmIChkb19zaG93X3N0cmVhbV90YWdzKQorICAgICAgICByZXQgPSBzaG93X3RhZ3Modywgc3RyZWFtLT5tZXRhZGF0YSwgaW5fcHJvZ3JhbSA/IFNFQ1RJT05fSURfUFJPR1JBTV9TVFJFQU1fVEFHUyA6IFNFQ1RJT05fSURfU1RSRUFNX1RBR1MpOworCisgICAgaWYgKHN0cmVhbS0+bmJfc2lkZV9kYXRhKSB7CisgICAgICAgIHByaW50X3BrdF9zaWRlX2RhdGEodywgc3RyZWFtLT5jb2RlY3Bhciwgc3RyZWFtLT5zaWRlX2RhdGEsIHN0cmVhbS0+bmJfc2lkZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fSURfU1RSRUFNX1NJREVfREFUQV9MSVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ1RJT05fSURfU1RSRUFNX1NJREVfREFUQSk7CisgICAgfQorCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcGJ1ZiwgTlVMTCk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNob3dfc3RyZWFtcyhXcml0ZXJDb250ZXh0ICp3LCBJbnB1dEZpbGUgKmlmaWxlKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCA9IGlmaWxlLT5mbXRfY3R4OworICAgIGludCBpLCByZXQgPSAwOworCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfU1RSRUFNUyk7CisgICAgZm9yIChpID0gMDsgaSA8IGlmaWxlLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgIGlmIChzZWxlY3RlZF9zdHJlYW1zW2ldKSB7CisgICAgICAgICAgICByZXQgPSBzaG93X3N0cmVhbSh3LCBmbXRfY3R4LCBpLCAmaWZpbGUtPnN0cmVhbXNbaV0sIDApOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNob3dfcHJvZ3JhbShXcml0ZXJDb250ZXh0ICp3LCBJbnB1dEZpbGUgKmlmaWxlLCBBVlByb2dyYW0gKnByb2dyYW0pCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4ID0gaWZpbGUtPmZtdF9jdHg7CisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QUk9HUkFNKTsKKyAgICBwcmludF9pbnQoInByb2dyYW1faWQiLCBwcm9ncmFtLT5pZCk7CisgICAgcHJpbnRfaW50KCJwcm9ncmFtX251bSIsIHByb2dyYW0tPnByb2dyYW1fbnVtKTsKKyAgICBwcmludF9pbnQoIm5iX3N0cmVhbXMiLCBwcm9ncmFtLT5uYl9zdHJlYW1faW5kZXhlcyk7CisgICAgcHJpbnRfaW50KCJwbXRfcGlkIiwgcHJvZ3JhbS0+cG10X3BpZCk7CisgICAgcHJpbnRfaW50KCJwY3JfcGlkIiwgcHJvZ3JhbS0+cGNyX3BpZCk7CisgICAgcHJpbnRfdHMoInN0YXJ0X3B0cyIsIHByb2dyYW0tPnN0YXJ0X3RpbWUpOworICAgIHByaW50X3RpbWUoInN0YXJ0X3RpbWUiLCBwcm9ncmFtLT5zdGFydF90aW1lLCAmQVZfVElNRV9CQVNFX1EpOworICAgIHByaW50X3RzKCJlbmRfcHRzIiwgcHJvZ3JhbS0+ZW5kX3RpbWUpOworICAgIHByaW50X3RpbWUoImVuZF90aW1lIiwgcHJvZ3JhbS0+ZW5kX3RpbWUsICZBVl9USU1FX0JBU0VfUSk7CisgICAgaWYgKGRvX3Nob3dfcHJvZ3JhbV90YWdzKQorICAgICAgICByZXQgPSBzaG93X3RhZ3ModywgcHJvZ3JhbS0+bWV0YWRhdGEsIFNFQ1RJT05fSURfUFJPR1JBTV9UQUdTKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QUk9HUkFNX1NUUkVBTVMpOworICAgIGZvciAoaSA9IDA7IGkgPCBwcm9ncmFtLT5uYl9zdHJlYW1faW5kZXhlczsgaSsrKSB7CisgICAgICAgIGlmIChzZWxlY3RlZF9zdHJlYW1zW3Byb2dyYW0tPnN0cmVhbV9pbmRleFtpXV0pIHsKKyAgICAgICAgICAgIHJldCA9IHNob3dfc3RyZWFtKHcsIGZtdF9jdHgsIHByb2dyYW0tPnN0cmVhbV9pbmRleFtpXSwgJmlmaWxlLT5zdHJlYW1zW3Byb2dyYW0tPnN0cmVhbV9pbmRleFtpXV0sIDEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworCitlbmQ6CisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19wcm9ncmFtcyhXcml0ZXJDb250ZXh0ICp3LCBJbnB1dEZpbGUgKmlmaWxlKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCA9IGlmaWxlLT5mbXRfY3R4OworICAgIGludCBpLCByZXQgPSAwOworCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfUFJPR1JBTVMpOworICAgIGZvciAoaSA9IDA7IGkgPCBmbXRfY3R4LT5uYl9wcm9ncmFtczsgaSsrKSB7CisgICAgICAgIEFWUHJvZ3JhbSAqcHJvZ3JhbSA9IGZtdF9jdHgtPnByb2dyYW1zW2ldOworICAgICAgICBpZiAoIXByb2dyYW0pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0ID0gc2hvd19wcm9ncmFtKHcsIGlmaWxlLCBwcm9ncmFtKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19jaGFwdGVycyhXcml0ZXJDb250ZXh0ICp3LCBJbnB1dEZpbGUgKmlmaWxlKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCA9IGlmaWxlLT5mbXRfY3R4OworICAgIGludCBpLCByZXQgPSAwOworCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfQ0hBUFRFUlMpOworICAgIGZvciAoaSA9IDA7IGkgPCBmbXRfY3R4LT5uYl9jaGFwdGVyczsgaSsrKSB7CisgICAgICAgIEFWQ2hhcHRlciAqY2hhcHRlciA9IGZtdF9jdHgtPmNoYXB0ZXJzW2ldOworCisgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX0NIQVBURVIpOworICAgICAgICBwcmludF9pbnQoImlkIiwgY2hhcHRlci0+aWQpOworICAgICAgICBwcmludF9xICAoInRpbWVfYmFzZSIsIGNoYXB0ZXItPnRpbWVfYmFzZSwgJy8nKTsKKyAgICAgICAgcHJpbnRfaW50KCJzdGFydCIsIGNoYXB0ZXItPnN0YXJ0KTsKKyAgICAgICAgcHJpbnRfdGltZSgic3RhcnRfdGltZSIsIGNoYXB0ZXItPnN0YXJ0LCAmY2hhcHRlci0+dGltZV9iYXNlKTsKKyAgICAgICAgcHJpbnRfaW50KCJlbmQiLCBjaGFwdGVyLT5lbmQpOworICAgICAgICBwcmludF90aW1lKCJlbmRfdGltZSIsIGNoYXB0ZXItPmVuZCwgJmNoYXB0ZXItPnRpbWVfYmFzZSk7CisgICAgICAgIGlmIChkb19zaG93X2NoYXB0ZXJfdGFncykKKyAgICAgICAgICAgIHJldCA9IHNob3dfdGFncyh3LCBjaGFwdGVyLT5tZXRhZGF0YSwgU0VDVElPTl9JRF9DSEFQVEVSX1RBR1MpOworICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisgICAgfQorICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2hvd19mb3JtYXQoV3JpdGVyQ29udGV4dCAqdywgSW5wdXRGaWxlICppZmlsZSkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHggPSBpZmlsZS0+Zm10X2N0eDsKKyAgICBjaGFyIHZhbF9zdHJbMTI4XTsKKyAgICBpbnQ2NF90IHNpemUgPSBmbXRfY3R4LT5wYiA/IGF2aW9fc2l6ZShmbXRfY3R4LT5wYikgOiAtMTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX0ZPUk1BVCk7CisgICAgcHJpbnRfc3RyX3ZhbGlkYXRlKCJmaWxlbmFtZSIsIGZtdF9jdHgtPnVybCk7CisgICAgcHJpbnRfaW50KCJuYl9zdHJlYW1zIiwgICAgICAgZm10X2N0eC0+bmJfc3RyZWFtcyk7CisgICAgcHJpbnRfaW50KCJuYl9wcm9ncmFtcyIsICAgICAgZm10X2N0eC0+bmJfcHJvZ3JhbXMpOworICAgIHByaW50X3N0cigiZm9ybWF0X25hbWUiLCAgICAgIGZtdF9jdHgtPmlmb3JtYXQtPm5hbWUpOworICAgIGlmICghZG9fYml0ZXhhY3QpIHsKKyAgICAgICAgaWYgKGZtdF9jdHgtPmlmb3JtYXQtPmxvbmdfbmFtZSkgcHJpbnRfc3RyICAgICgiZm9ybWF0X2xvbmdfbmFtZSIsIGZtdF9jdHgtPmlmb3JtYXQtPmxvbmdfbmFtZSk7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImZvcm1hdF9sb25nX25hbWUiLCAidW5rbm93biIpOworICAgIH0KKyAgICBwcmludF90aW1lKCJzdGFydF90aW1lIiwgICAgICBmbXRfY3R4LT5zdGFydF90aW1lLCAmQVZfVElNRV9CQVNFX1EpOworICAgIHByaW50X3RpbWUoImR1cmF0aW9uIiwgICAgICAgIGZtdF9jdHgtPmR1cmF0aW9uLCAgICZBVl9USU1FX0JBU0VfUSk7CisgICAgaWYgKHNpemUgPj0gMCkgcHJpbnRfdmFsICAgICgic2l6ZSIsIHNpemUsIHVuaXRfYnl0ZV9zdHIpOworICAgIGVsc2UgICAgICAgICAgIHByaW50X3N0cl9vcHQoInNpemUiLCAiTi9BIik7CisgICAgaWYgKGZtdF9jdHgtPmJpdF9yYXRlID4gMCkgcHJpbnRfdmFsICAgICgiYml0X3JhdGUiLCBmbXRfY3R4LT5iaXRfcmF0ZSwgdW5pdF9iaXRfcGVyX3NlY29uZF9zdHIpOworICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImJpdF9yYXRlIiwgIk4vQSIpOworICAgIHByaW50X2ludCgicHJvYmVfc2NvcmUiLCBmbXRfY3R4LT5wcm9iZV9zY29yZSk7CisgICAgaWYgKGRvX3Nob3dfZm9ybWF0X3RhZ3MpCisgICAgICAgIHJldCA9IHNob3dfdGFncyh3LCBmbXRfY3R4LT5tZXRhZGF0YSwgU0VDVElPTl9JRF9GT1JNQVRfVEFHUyk7CisKKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2hvd19lcnJvcihXcml0ZXJDb250ZXh0ICp3LCBpbnQgZXJyKQoreworICAgIGNoYXIgZXJyYnVmWzEyOF07CisgICAgY29uc3QgY2hhciAqZXJyYnVmX3B0ciA9IGVycmJ1ZjsKKworICAgIGlmIChhdl9zdHJlcnJvcihlcnIsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpIDwgMCkKKyAgICAgICAgZXJyYnVmX3B0ciA9IHN0cmVycm9yKEFWVU5FUlJPUihlcnIpKTsKKworICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX0VSUk9SKTsKKyAgICBwcmludF9pbnQoImNvZGUiLCBlcnIpOworICAgIHByaW50X3N0cigic3RyaW5nIiwgZXJyYnVmX3B0cik7CisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworfQorCitzdGF0aWMgaW50IG9wZW5faW5wdXRfZmlsZShJbnB1dEZpbGUgKmlmaWxlLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKyAgICBpbnQgZXJyLCBpOworICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQ7CisgICAgaW50IHNjYW5fYWxsX3BtdHNfc2V0ID0gMDsKKworICAgIGZtdF9jdHggPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7CisgICAgaWYgKCFmbXRfY3R4KSB7CisgICAgICAgIHByaW50X2Vycm9yKGZpbGVuYW1lLCBBVkVSUk9SKEVOT01FTSkpOworICAgICAgICBleGl0X3Byb2dyYW0oMSk7CisgICAgfQorCisgICAgaWYgKCFhdl9kaWN0X2dldChmb3JtYXRfb3B0cywgInNjYW5fYWxsX3BtdHMiLCBOVUxMLCBBVl9ESUNUX01BVENIX0NBU0UpKSB7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZmb3JtYXRfb3B0cywgInNjYW5fYWxsX3BtdHMiLCAiMSIsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOworICAgICAgICBzY2FuX2FsbF9wbXRzX3NldCA9IDE7CisgICAgfQorICAgIGlmICgoZXJyID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmZm10X2N0eCwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmb3JtYXQsICZmb3JtYXRfb3B0cykpIDwgMCkgeworICAgICAgICBwcmludF9lcnJvcihmaWxlbmFtZSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWZpbGUtPmZtdF9jdHggPSBmbXRfY3R4OworICAgIGlmIChzY2FuX2FsbF9wbXRzX3NldCkKKyAgICAgICAgYXZfZGljdF9zZXQoJmZvcm1hdF9vcHRzLCAic2Nhbl9hbGxfcG10cyIsIE5VTEwsIEFWX0RJQ1RfTUFUQ0hfQ0FTRSk7CisgICAgaWYgKCh0ID0gYXZfZGljdF9nZXQoZm9ybWF0X29wdHMsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3B0aW9uICVzIG5vdCBmb3VuZC5cbiIsIHQtPmtleSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgaWYgKGZpbmRfc3RyZWFtX2luZm8pIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5ICoqb3B0cyA9IHNldHVwX2ZpbmRfc3RyZWFtX2luZm9fb3B0cyhmbXRfY3R4LCBjb2RlY19vcHRzKTsKKyAgICAgICAgaW50IG9yaWdfbmJfc3RyZWFtcyA9IGZtdF9jdHgtPm5iX3N0cmVhbXM7CisKKyAgICAgICAgZXJyID0gYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhmbXRfY3R4LCBvcHRzKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JpZ19uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHNbaV0pOworICAgICAgICBhdl9mcmVlcCgmb3B0cyk7CisKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIHByaW50X2Vycm9yKGZpbGVuYW1lLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2R1bXBfZm9ybWF0KGZtdF9jdHgsIDAsIGZpbGVuYW1lLCAwKTsKKworICAgIGlmaWxlLT5zdHJlYW1zID0gYXZfbWFsbG9jel9hcnJheShmbXRfY3R4LT5uYl9zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmlmaWxlLT5zdHJlYW1zKSk7CisgICAgaWYgKCFpZmlsZS0+c3RyZWFtcykKKyAgICAgICAgZXhpdCgxKTsKKyAgICBpZmlsZS0+bmJfc3RyZWFtcyA9IGZtdF9jdHgtPm5iX3N0cmVhbXM7CisKKyAgICAvKiBiaW5kIGEgZGVjb2RlciB0byBlYWNoIGlucHV0IHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBmbXRfY3R4LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgSW5wdXRTdHJlYW0gKmlzdCA9ICZpZmlsZS0+c3RyZWFtc1tpXTsKKyAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSA9IGZtdF9jdHgtPnN0cmVhbXNbaV07CisgICAgICAgIEFWQ29kZWMgKmNvZGVjOworCisgICAgICAgIGlzdC0+c3QgPSBzdHJlYW07CisKKyAgICAgICAgaWYgKHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BST0JFKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBwcm9iZSBjb2RlYyBmb3IgaW5wdXQgc3RyZWFtICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmluZGV4KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY19pZCk7CisgICAgICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGNvZGVjIHdpdGggaWQgJWQgZm9yIGlucHV0IHN0cmVhbSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfaWQsIHN0cmVhbS0+aW5kZXgpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gZmlsdGVyX2NvZGVjX29wdHMoY29kZWNfb3B0cywgc3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXRfY3R4LCBzdHJlYW0sIGNvZGVjKTsKKworICAgICAgICAgICAgaXN0LT5kZWNfY3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYyk7CisgICAgICAgICAgICBpZiAoIWlzdC0+ZGVjX2N0eCkKKyAgICAgICAgICAgICAgICBleGl0KDEpOworCisgICAgICAgICAgICBlcnIgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChpc3QtPmRlY19jdHgsIHN0cmVhbS0+Y29kZWNwYXIpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKworICAgICAgICAgICAgaWYgKGRvX3Nob3dfbG9nKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGxvZ2luZyBpdCBpcyBuZWVkZWQgdG8gZGlzYWJsZSBhdCBsZWFzdCBmcmFtZSB0aHJlYWRzIGFzIG90aGVyd2lzZQorICAgICAgICAgICAgICAgIC8vIHRoZSBsb2cgaW5mb3JtYXRpb24gd291bGQgbmVlZCB0byBiZSByZW9yZGVyZWQgYW5kIG1hdGNoZXMgdXAgdG8gY29udGV4dHMgYW5kIGZyYW1lcworICAgICAgICAgICAgICAgIC8vIFRoYXQgaXMgaW4gZmFjdCBwb3NzaWJsZSBidXQgbm90IHRyaXZpYWwKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmY29kZWNfb3B0cywgInRocmVhZHMiLCAiMSIsIDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpc3QtPmRlY19jdHgtPnBrdF90aW1lYmFzZSA9IHN0cmVhbS0+dGltZV9iYXNlOworICAgICAgICAgICAgaXN0LT5kZWNfY3R4LT5mcmFtZXJhdGUgPSBzdHJlYW0tPmF2Z19mcmFtZV9yYXRlOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmNvZGVkX3dpZHRoID0gc3RyZWFtLT5jb2RlYy0+Y29kZWRfd2lkdGg7CisgICAgICAgICAgICBpc3QtPmRlY19jdHgtPmNvZGVkX2hlaWdodCA9IHN0cmVhbS0+Y29kZWMtPmNvZGVkX2hlaWdodDsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoYXZjb2RlY19vcGVuMihpc3QtPmRlY19jdHgsIGNvZGVjLCAmb3B0cykgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IG9wZW4gY29kZWMgZm9yIGlucHV0IHN0cmVhbSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5pbmRleCk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCh0ID0gYXZfZGljdF9nZXQob3B0cywgIiIsIE5VTEwsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk9wdGlvbiAlcyBmb3IgaW5wdXQgc3RyZWFtICVkIG5vdCBmb3VuZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdC0+a2V5LCBzdHJlYW0tPmluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9PUFRJT05fTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWZpbGUtPmZtdF9jdHggPSBmbXRfY3R4OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9pbnB1dF9maWxlKElucHV0RmlsZSAqaWZpbGUpCit7CisgICAgaW50IGk7CisKKyAgICAvKiBjbG9zZSBkZWNvZGVyIGZvciBlYWNoIHN0cmVhbSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBpZmlsZS0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICBpZiAoaWZpbGUtPnN0cmVhbXNbaV0uc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmlmaWxlLT5zdHJlYW1zW2ldLmRlY19jdHgpOworCisgICAgYXZfZnJlZXAoJmlmaWxlLT5zdHJlYW1zKTsKKyAgICBpZmlsZS0+bmJfc3RyZWFtcyA9IDA7CisKKyAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmaWZpbGUtPmZtdF9jdHgpOworfQorCitzdGF0aWMgaW50IHByb2JlX2ZpbGUoV3JpdGVyQ29udGV4dCAqd2N0eCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgSW5wdXRGaWxlIGlmaWxlID0geyAwIH07CisgICAgaW50IHJldCwgaTsKKyAgICBpbnQgc2VjdGlvbl9pZDsKKworICAgIGRvX3JlYWRfZnJhbWVzID0gZG9fc2hvd19mcmFtZXMgfHwgZG9fY291bnRfZnJhbWVzOworICAgIGRvX3JlYWRfcGFja2V0cyA9IGRvX3Nob3dfcGFja2V0cyB8fCBkb19jb3VudF9wYWNrZXRzOworCisgICAgcmV0ID0gb3Blbl9pbnB1dF9maWxlKCZpZmlsZSwgZmlsZW5hbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworI2RlZmluZSBDSEVDS19FTkQgaWYgKHJldCA8IDApIGdvdG8gZW5kCisKKyAgICBuYl9zdHJlYW1zID0gaWZpbGUuZm10X2N0eC0+bmJfc3RyZWFtczsKKyAgICBSRUFMTE9DWl9BUlJBWV9TVFJFQU0obmJfc3RyZWFtc19mcmFtZXMsMCxpZmlsZS5mbXRfY3R4LT5uYl9zdHJlYW1zKTsKKyAgICBSRUFMTE9DWl9BUlJBWV9TVFJFQU0obmJfc3RyZWFtc19wYWNrZXRzLDAsaWZpbGUuZm10X2N0eC0+bmJfc3RyZWFtcyk7CisgICAgUkVBTExPQ1pfQVJSQVlfU1RSRUFNKHNlbGVjdGVkX3N0cmVhbXMsMCxpZmlsZS5mbXRfY3R4LT5uYl9zdHJlYW1zKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBpZmlsZS5mbXRfY3R4LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKHN0cmVhbV9zcGVjaWZpZXIpIHsKKyAgICAgICAgICAgIHJldCA9IGF2Zm9ybWF0X21hdGNoX3N0cmVhbV9zcGVjaWZpZXIoaWZpbGUuZm10X2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZpbGUuZm10X2N0eC0+c3RyZWFtc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3NwZWNpZmllcik7CisgICAgICAgICAgICBDSEVDS19FTkQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2VsZWN0ZWRfc3RyZWFtc1tpXSA9IHJldDsKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWxlY3RlZF9zdHJlYW1zW2ldID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXNlbGVjdGVkX3N0cmVhbXNbaV0pCisgICAgICAgICAgICBpZmlsZS5mbXRfY3R4LT5zdHJlYW1zW2ldLT5kaXNjYXJkID0gQVZESVNDQVJEX0FMTDsKKyAgICB9CisKKyAgICBpZiAoZG9fcmVhZF9mcmFtZXMgfHwgZG9fcmVhZF9wYWNrZXRzKSB7CisgICAgICAgIGlmIChkb19zaG93X2ZyYW1lcyAmJiBkb19zaG93X3BhY2tldHMgJiYKKyAgICAgICAgICAgIHdjdHgtPndyaXRlci0+ZmxhZ3MgJiBXUklURVJfRkxBR19QVVRfUEFDS0VUU19BTkRfRlJBTUVTX0lOX1NBTUVfQ0hBUFRFUikKKyAgICAgICAgICAgIHNlY3Rpb25faWQgPSBTRUNUSU9OX0lEX1BBQ0tFVFNfQU5EX0ZSQU1FUzsKKyAgICAgICAgZWxzZSBpZiAoZG9fc2hvd19wYWNrZXRzICYmICFkb19zaG93X2ZyYW1lcykKKyAgICAgICAgICAgIHNlY3Rpb25faWQgPSBTRUNUSU9OX0lEX1BBQ0tFVFM7CisgICAgICAgIGVsc2UgLy8gKCFkb19zaG93X3BhY2tldHMgJiYgZG9fc2hvd19mcmFtZXMpCisgICAgICAgICAgICBzZWN0aW9uX2lkID0gU0VDVElPTl9JRF9GUkFNRVM7CisgICAgICAgIGlmIChkb19zaG93X2ZyYW1lcyB8fCBkb19zaG93X3BhY2tldHMpCisgICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIod2N0eCwgc2VjdGlvbl9pZCk7CisgICAgICAgIHJldCA9IHJlYWRfcGFja2V0cyh3Y3R4LCAmaWZpbGUpOworICAgICAgICBpZiAoZG9fc2hvd19mcmFtZXMgfHwgZG9fc2hvd19wYWNrZXRzKQorICAgICAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHdjdHgpOworICAgICAgICBDSEVDS19FTkQ7CisgICAgfQorCisgICAgaWYgKGRvX3Nob3dfcHJvZ3JhbXMpIHsKKyAgICAgICAgcmV0ID0gc2hvd19wcm9ncmFtcyh3Y3R4LCAmaWZpbGUpOworICAgICAgICBDSEVDS19FTkQ7CisgICAgfQorCisgICAgaWYgKGRvX3Nob3dfc3RyZWFtcykgeworICAgICAgICByZXQgPSBzaG93X3N0cmVhbXMod2N0eCwgJmlmaWxlKTsKKyAgICAgICAgQ0hFQ0tfRU5EOworICAgIH0KKyAgICBpZiAoZG9fc2hvd19jaGFwdGVycykgeworICAgICAgICByZXQgPSBzaG93X2NoYXB0ZXJzKHdjdHgsICZpZmlsZSk7CisgICAgICAgIENIRUNLX0VORDsKKyAgICB9CisgICAgaWYgKGRvX3Nob3dfZm9ybWF0KSB7CisgICAgICAgIHJldCA9IHNob3dfZm9ybWF0KHdjdHgsICZpZmlsZSk7CisgICAgICAgIENIRUNLX0VORDsKKyAgICB9CisKK2VuZDoKKyAgICBpZiAoaWZpbGUuZm10X2N0eCkKKyAgICAgICAgY2xvc2VfaW5wdXRfZmlsZSgmaWZpbGUpOworICAgIGF2X2ZyZWVwKCZuYl9zdHJlYW1zX2ZyYW1lcyk7CisgICAgYXZfZnJlZXAoJm5iX3N0cmVhbXNfcGFja2V0cyk7CisgICAgYXZfZnJlZXAoJnNlbGVjdGVkX3N0cmVhbXMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2hvd191c2FnZSh2b2lkKQoreworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlNpbXBsZSBtdWx0aW1lZGlhIHN0cmVhbXMgYW5hbHl6ZXJcbiIpOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInVzYWdlOiAlcyBbT1BUSU9OU10gW0lOUFVUX0ZJTEVdXG4iLCBwcm9ncmFtX25hbWUpOworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGZmcHJvYmVfc2hvd19wcm9ncmFtX3ZlcnNpb24oV3JpdGVyQ29udGV4dCAqdykKK3sKKyAgICBBVkJQcmludCBwYnVmOworICAgIGF2X2JwcmludF9pbml0KCZwYnVmLCAxLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfUFJPR1JBTV9WRVJTSU9OKTsKKyAgICBwcmludF9zdHIoInZlcnNpb24iLCBGRk1QRUdfVkVSU0lPTik7CisgICAgcHJpbnRfZm10KCJjb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChjKSAlZC0lZCB0aGUgRkZtcGVnIGRldmVsb3BlcnMiLAorICAgICAgICAgICAgICBwcm9ncmFtX2JpcnRoX3llYXIsIENPTkZJR19USElTX1lFQVIpOworICAgIHByaW50X3N0cigiY29tcGlsZXJfaWRlbnQiLCBDQ19JREVOVCk7CisgICAgcHJpbnRfc3RyKCJjb25maWd1cmF0aW9uIiwgRkZNUEVHX0NPTkZJR1VSQVRJT04pOworICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsKKworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcGJ1ZiwgTlVMTCk7Cit9CisKKyNkZWZpbmUgU0hPV19MSUJfVkVSU0lPTihsaWJuYW1lLCBMSUJOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKENPTkZJR18jI0xJQk5BTUUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2ZXJzaW9uID0gbGlibmFtZSMjX3ZlcnNpb24oKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTik7IFwKKyAgICAgICAgICAgIHByaW50X3N0cigibmFtZSIsICAgICJsaWIiICNsaWJuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHByaW50X2ludCgibWFqb3IiLCAgIExJQiMjTElCTkFNRSMjX1ZFUlNJT05fTUFKT1IpOyAgICAgICAgIFwKKyAgICAgICAgICAgIHByaW50X2ludCgibWlub3IiLCAgIExJQiMjTElCTkFNRSMjX1ZFUlNJT05fTUlOT1IpOyAgICAgICAgIFwKKyAgICAgICAgICAgIHByaW50X2ludCgibWljcm8iLCAgIExJQiMjTElCTkFNRSMjX1ZFUlNJT05fTUlDUk8pOyAgICAgICAgIFwKKyAgICAgICAgICAgIHByaW50X2ludCgidmVyc2lvbiIsIHZlcnNpb24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHByaW50X3N0cigiaWRlbnQiLCAgIExJQiMjTElCTkFNRSMjX0lERU5UKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2Zvb3Rlcih3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBmZnByb2JlX3Nob3dfbGlicmFyeV92ZXJzaW9ucyhXcml0ZXJDb250ZXh0ICp3KQoreworICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX0xJQlJBUllfVkVSU0lPTlMpOworICAgIFNIT1dfTElCX1ZFUlNJT04oYXZ1dGlsLCAgICAgQVZVVElMKTsKKyAgICBTSE9XX0xJQl9WRVJTSU9OKGF2Y29kZWMsICAgIEFWQ09ERUMpOworICAgIFNIT1dfTElCX1ZFUlNJT04oYXZmb3JtYXQsICAgQVZGT1JNQVQpOworICAgIFNIT1dfTElCX1ZFUlNJT04oYXZkZXZpY2UsICAgQVZERVZJQ0UpOworICAgIFNIT1dfTElCX1ZFUlNJT04oYXZmaWx0ZXIsICAgQVZGSUxURVIpOworICAgIFNIT1dfTElCX1ZFUlNJT04oc3dzY2FsZSwgICAgU1dTQ0FMRSk7CisgICAgU0hPV19MSUJfVkVSU0lPTihzd3Jlc2FtcGxlLCBTV1JFU0FNUExFKTsKKyAgICBTSE9XX0xJQl9WRVJTSU9OKHBvc3Rwcm9jLCAgIFBPU1RQUk9DKTsKKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Cit9CisKKyNkZWZpbmUgUFJJTlRfUElYX0ZNVF9GTEFHKGZsYWduYW1lLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByaW50X2ludChuYW1lLCAhIShwaXhkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR18jI2ZsYWduYW1lKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBmZnByb2JlX3Nob3dfcGl4ZWxfZm9ybWF0cyhXcml0ZXJDb250ZXh0ICp3KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYyA9IE5VTEw7CisgICAgaW50IGksIG47CisKKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRTKTsKKyAgICB3aGlsZSAocGl4ZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19uZXh0KHBpeGRlc2MpKSB7CisgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVCk7CisgICAgICAgIHByaW50X3N0cigibmFtZSIsIHBpeGRlc2MtPm5hbWUpOworICAgICAgICBwcmludF9pbnQoIm5iX2NvbXBvbmVudHMiLCBwaXhkZXNjLT5uYl9jb21wb25lbnRzKTsKKyAgICAgICAgaWYgKChwaXhkZXNjLT5uYl9jb21wb25lbnRzID49IDMpICYmICEocGl4ZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKSkgeworICAgICAgICAgICAgcHJpbnRfaW50ICAgICgibG9nMl9jaHJvbWFfdyIsIHBpeGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgICAgICAgICAgcHJpbnRfaW50ICAgICgibG9nMl9jaHJvbWFfaCIsIHBpeGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRfc3RyX29wdCgibG9nMl9jaHJvbWFfdyIsICJOL0EiKTsKKyAgICAgICAgICAgIHByaW50X3N0cl9vcHQoImxvZzJfY2hyb21hX2giLCAiTi9BIik7CisgICAgICAgIH0KKyAgICAgICAgbiA9IGF2X2dldF9iaXRzX3Blcl9waXhlbChwaXhkZXNjKTsKKyAgICAgICAgaWYgKG4pIHByaW50X2ludCAgICAoImJpdHNfcGVyX3BpeGVsIiwgbik7CisgICAgICAgIGVsc2UgICBwcmludF9zdHJfb3B0KCJiaXRzX3Blcl9waXhlbCIsICJOL0EiKTsKKyAgICAgICAgaWYgKGRvX3Nob3dfcGl4ZWxfZm9ybWF0X2ZsYWdzKSB7CisgICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9oZWFkZXIodywgU0VDVElPTl9JRF9QSVhFTF9GT1JNQVRfRkxBR1MpOworICAgICAgICAgICAgUFJJTlRfUElYX0ZNVF9GTEFHKEJFLCAgICAgICAgImJpZ19lbmRpYW4iKTsKKyAgICAgICAgICAgIFBSSU5UX1BJWF9GTVRfRkxBRyhQQUwsICAgICAgICJwYWxldHRlIik7CisgICAgICAgICAgICBQUklOVF9QSVhfRk1UX0ZMQUcoQklUU1RSRUFNLCAiYml0c3RyZWFtIik7CisgICAgICAgICAgICBQUklOVF9QSVhfRk1UX0ZMQUcoSFdBQ0NFTCwgICAiaHdhY2NlbCIpOworICAgICAgICAgICAgUFJJTlRfUElYX0ZNVF9GTEFHKFBMQU5BUiwgICAgInBsYW5hciIpOworICAgICAgICAgICAgUFJJTlRfUElYX0ZNVF9GTEFHKFJHQiwgICAgICAgInJnYiIpOworI2lmIEZGX0FQSV9QU0VVRE9QQUwKKyAgICAgICAgICAgIFBSSU5UX1BJWF9GTVRfRkxBRyhQU0VVRE9QQUwsICJwc2V1ZG9wYWwiKTsKKyNlbmRpZgorICAgICAgICAgICAgUFJJTlRfUElYX0ZNVF9GTEFHKEFMUEhBLCAgICAgImFscGhhIik7CisgICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRvX3Nob3dfcGl4ZWxfZm9ybWF0X2NvbXBvbmVudHMgJiYgKHBpeGRlc2MtPm5iX2NvbXBvbmVudHMgPiAwKSkgeworICAgICAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHcsIFNFQ1RJT05fSURfUElYRUxfRk9STUFUX0NPTVBPTkVOVFMpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeGRlc2MtPm5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICAgICAgICAgIHdyaXRlcl9wcmludF9zZWN0aW9uX2hlYWRlcih3LCBTRUNUSU9OX0lEX1BJWEVMX0ZPUk1BVF9DT01QT05FTlQpOworICAgICAgICAgICAgICAgIHByaW50X2ludCgiaW5kZXgiLCBpICsgMSk7CisgICAgICAgICAgICAgICAgcHJpbnRfaW50KCJiaXRfZGVwdGgiLCBwaXhkZXNjLT5jb21wW2ldLmRlcHRoKTsKKyAgICAgICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHcpOworICAgIH0KKyAgICB3cml0ZXJfcHJpbnRfc2VjdGlvbl9mb290ZXIodyk7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2Zvcm1hdCh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGlmb3JtYXQgPSBhdl9maW5kX2lucHV0X2Zvcm1hdChhcmcpOworICAgIGlmICghaWZvcm1hdCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBpbnB1dCBmb3JtYXQ6ICVzXG4iLCBhcmcpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1hcmtfc2VjdGlvbl9zaG93X2VudHJpZXMoU2VjdGlvbklEIHNlY3Rpb25faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hvd19hbGxfZW50cmllcywgQVZEaWN0aW9uYXJ5ICplbnRyaWVzKQoreworICAgIHN0cnVjdCBzZWN0aW9uICpzZWN0aW9uID0gJnNlY3Rpb25zW3NlY3Rpb25faWRdOworCisgICAgc2VjdGlvbi0+c2hvd19hbGxfZW50cmllcyA9IHNob3dfYWxsX2VudHJpZXM7CisgICAgaWYgKHNob3dfYWxsX2VudHJpZXMpIHsKKyAgICAgICAgU2VjdGlvbklEICppZDsKKyAgICAgICAgZm9yIChpZCA9IHNlY3Rpb24tPmNoaWxkcmVuX2lkczsgKmlkICE9IC0xOyBpZCsrKQorICAgICAgICAgICAgbWFya19zZWN0aW9uX3Nob3dfZW50cmllcygqaWQsIHNob3dfYWxsX2VudHJpZXMsIGVudHJpZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2RpY3RfY29weSgmc2VjdGlvbi0+ZW50cmllc190b19zaG93LCBlbnRyaWVzLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbWF0Y2hfc2VjdGlvbihjb25zdCBjaGFyICpzZWN0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNob3dfYWxsX2VudHJpZXMsIEFWRGljdGlvbmFyeSAqZW50cmllcykKK3sKKyAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzZWN0aW9ucyk7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc2VjdGlvbiA9ICZzZWN0aW9uc1tpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAoc2VjdGlvbl9uYW1lLCBzZWN0aW9uLT5uYW1lKSB8fAorICAgICAgICAgICAgKHNlY3Rpb24tPnVuaXF1ZV9uYW1lICYmICFzdHJjbXAoc2VjdGlvbl9uYW1lLCBzZWN0aW9uLT51bmlxdWVfbmFtZSkpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICInJXMnIG1hdGNoZXMgc2VjdGlvbiB3aXRoIHVuaXF1ZSBuYW1lICclcydcbiIsIHNlY3Rpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAoY2hhciAqKWF2X3hfaWZfbnVsbChzZWN0aW9uLT51bmlxdWVfbmFtZSwgc2VjdGlvbi0+bmFtZSkpOworICAgICAgICAgICAgcmV0Kys7CisgICAgICAgICAgICBtYXJrX3NlY3Rpb25fc2hvd19lbnRyaWVzKHNlY3Rpb24tPmlkLCBzaG93X2FsbF9lbnRyaWVzLCBlbnRyaWVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wdF9zaG93X2VudHJpZXModm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBjb25zdCBjaGFyICpwID0gYXJnOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKCpwKSB7CisgICAgICAgIEFWRGljdGlvbmFyeSAqZW50cmllcyA9IE5VTEw7CisgICAgICAgIGNoYXIgKnNlY3Rpb25fbmFtZSA9IGF2X2dldF90b2tlbigmcCwgIj06Iik7CisgICAgICAgIGludCBzaG93X2FsbF9lbnRyaWVzID0gMDsKKworICAgICAgICBpZiAoIXNlY3Rpb25fbmFtZSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBzZWN0aW9uIG5hbWUgZm9yIG9wdGlvbiAnJXMnXG4iLCBvcHQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqcCA9PSAnPScpIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIHdoaWxlICgqcCAmJiAqcCAhPSAnOicpIHsKKyAgICAgICAgICAgICAgICBjaGFyICplbnRyeSA9IGF2X2dldF90b2tlbigmcCwgIiw6Iik7CisgICAgICAgICAgICAgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgICAgICAgICAiQWRkaW5nICclcycgdG8gdGhlIGVudHJpZXMgdG8gc2hvdyBpbiBzZWN0aW9uICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LCBzZWN0aW9uX25hbWUpOworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZlbnRyaWVzLCBlbnRyeSwgIiIsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZKTsKKyAgICAgICAgICAgICAgICBpZiAoKnAgPT0gJywnKQorICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaG93X2FsbF9lbnRyaWVzID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IG1hdGNoX3NlY3Rpb24oc2VjdGlvbl9uYW1lLCBzaG93X2FsbF9lbnRyaWVzLCBlbnRyaWVzKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTm8gbWF0Y2ggZm9yIHNlY3Rpb24gJyVzJ1xuIiwgc2VjdGlvbl9uYW1lKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBhdl9kaWN0X2ZyZWUoJmVudHJpZXMpOworICAgICAgICBhdl9mcmVlKHNlY3Rpb25fbmFtZSk7CisKKyAgICAgICAgaWYgKHJldCA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICgqcCkKKyAgICAgICAgICAgIHArKzsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wdF9zaG93X2Zvcm1hdF9lbnRyeSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGNoYXIgKmJ1ZiA9IGF2X2FzcHJpbnRmKCJmb3JtYXQ9JXMiLCBhcmcpOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgIk9wdGlvbiAnJXMnIGlzIGRlcHJlY2F0ZWQsIHVzZSAnLXNob3dfZW50cmllcyBmb3JtYXQ9JXMnIGluc3RlYWRcbiIsCisgICAgICAgICAgIG9wdCwgYXJnKTsKKyAgICByZXQgPSBvcHRfc2hvd19lbnRyaWVzKG9wdGN0eCwgb3B0LCBidWYpOworICAgIGF2X2ZyZWUoYnVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBvcHRfaW5wdXRfZmlsZSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBpZiAoaW5wdXRfZmlsZW5hbWUpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAiQXJndW1lbnQgJyVzJyBwcm92aWRlZCBhcyBpbnB1dCBmaWxlbmFtZSwgYnV0ICclcycgd2FzIGFscmVhZHkgc3BlY2lmaWVkLlxuIiwKKyAgICAgICAgICAgICAgICBhcmcsIGlucHV0X2ZpbGVuYW1lKTsKKyAgICAgICAgZXhpdF9wcm9ncmFtKDEpOworICAgIH0KKyAgICBpZiAoIXN0cmNtcChhcmcsICItIikpCisgICAgICAgIGFyZyA9ICJwaXBlOiI7CisgICAgaW5wdXRfZmlsZW5hbWUgPSBhcmc7Cit9CisKK3N0YXRpYyBpbnQgb3B0X2lucHV0X2ZpbGVfaSh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIG9wdF9pbnB1dF9maWxlKG9wdGN0eCwgYXJnKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBzaG93X2hlbHBfZGVmYXVsdChjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBhdl9sb2dfc2V0X2NhbGxiYWNrKGxvZ19jYWxsYmFja19oZWxwKTsKKyAgICBzaG93X3VzYWdlKCk7CisgICAgc2hvd19oZWxwX29wdGlvbnMob3B0aW9ucywgIk1haW4gb3B0aW9uczoiLCAwLCAwLCAwKTsKKyAgICBwcmludGYoIlxuIik7CisKKyAgICBzaG93X2hlbHBfY2hpbGRyZW4oYXZmb3JtYXRfZ2V0X2NsYXNzKCksIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNKTsKKyAgICBzaG93X2hlbHBfY2hpbGRyZW4oYXZjb2RlY19nZXRfY2xhc3MoKSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0pOworfQorCisvKioKKyAqIFBhcnNlIGludGVydmFsIHNwZWNpZmljYXRpb24sIGFjY29yZGluZyB0byB0aGUgZm9ybWF0OgorICogSU5URVJWQUwgOjo9IFtTVEFSVHwrU1RBUlRfT0ZGU0VUXVslW0VORHwrRU5EX09GRlNFVF1dCisgKiBJTlRFUlZBTFMgOjo9IElOVEVSVkFMWyxJTlRFUlZBTFNdCisqLworc3RhdGljIGludCBwYXJzZV9yZWFkX2ludGVydmFsKGNvbnN0IGNoYXIgKmludGVydmFsX3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZEludGVydmFsICppbnRlcnZhbCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBjaGFyICpuZXh0LCAqcCwgKnNwZWMgPSBhdl9zdHJkdXAoaW50ZXJ2YWxfc3BlYyk7CisgICAgaWYgKCFzcGVjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKCEqc3BlYykgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBlbXB0eSBpbnRlcnZhbCBzcGVjaWZpY2F0aW9uXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBwID0gc3BlYzsKKyAgICBuZXh0ID0gc3RyY2hyKHNwZWMsICclJyk7CisgICAgaWYgKG5leHQpCisgICAgICAgICpuZXh0KysgPSAwOworCisgICAgLyogcGFyc2UgZmlyc3QgcGFydCAqLworICAgIGlmICgqcCkgeworICAgICAgICBpbnRlcnZhbC0+aGFzX3N0YXJ0ID0gMTsKKworICAgICAgICBpZiAoKnAgPT0gJysnKSB7CisgICAgICAgICAgICBpbnRlcnZhbC0+c3RhcnRfaXNfb2Zmc2V0ID0gMTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludGVydmFsLT5zdGFydF9pc19vZmZzZXQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZfcGFyc2VfdGltZSgmaW50ZXJ2YWwtPnN0YXJ0LCBwLCAxKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGludGVydmFsIHN0YXJ0IHNwZWNpZmljYXRpb24gJyVzJ1xuIiwgcCk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludGVydmFsLT5oYXNfc3RhcnQgPSAwOworICAgIH0KKworICAgIC8qIHBhcnNlIHNlY29uZCBwYXJ0ICovCisgICAgcCA9IG5leHQ7CisgICAgaWYgKHAgJiYgKnApIHsKKyAgICAgICAgaW50NjRfdCB1czsKKyAgICAgICAgaW50ZXJ2YWwtPmhhc19lbmQgPSAxOworCisgICAgICAgIGlmICgqcCA9PSAnKycpIHsKKyAgICAgICAgICAgIGludGVydmFsLT5lbmRfaXNfb2Zmc2V0ID0gMTsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludGVydmFsLT5lbmRfaXNfb2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnRlcnZhbC0+ZW5kX2lzX29mZnNldCAmJiAqcCA9PSAnIycpIHsKKyAgICAgICAgICAgIGxvbmcgbG9uZyBpbnQgbGxpOworICAgICAgICAgICAgY2hhciAqdGFpbDsKKyAgICAgICAgICAgIGludGVydmFsLT5kdXJhdGlvbl9mcmFtZXMgPSAxOworICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgbGxpID0gc3RydG9sbChwLCAmdGFpbCwgMTApOworICAgICAgICAgICAgaWYgKCp0YWlsIHx8IGxsaSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvciBuZWdhdGl2ZSB2YWx1ZSAnJXMnIGZvciBkdXJhdGlvbiBudW1iZXIgb2YgZnJhbWVzXG4iLCBwKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludGVydmFsLT5lbmQgPSBsbGk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRlcnZhbC0+ZHVyYXRpb25fZnJhbWVzID0gMDsKKyAgICAgICAgICAgIHJldCA9IGF2X3BhcnNlX3RpbWUoJnVzLCBwLCAxKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaW50ZXJ2YWwgZW5kL2R1cmF0aW9uIHNwZWNpZmljYXRpb24gJyVzJ1xuIiwgcCk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnRlcnZhbC0+ZW5kID0gdXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnRlcnZhbC0+aGFzX2VuZCA9IDA7CisgICAgfQorCitlbmQ6CisgICAgYXZfZnJlZShzcGVjKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHBhcnNlX3JlYWRfaW50ZXJ2YWxzKGNvbnN0IGNoYXIgKmludGVydmFsc19zcGVjKQoreworICAgIGludCByZXQsIG4sIGk7CisgICAgY2hhciAqcCwgKnNwZWMgPSBhdl9zdHJkdXAoaW50ZXJ2YWxzX3NwZWMpOworICAgIGlmICghc3BlYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIHByZXBhcnNlIHNwZWNpZmljYXRpb24sIGdldCBudW1iZXIgb2YgaW50ZXJ2YWxzICovCisgICAgZm9yIChuID0gMCwgcCA9IHNwZWM7ICpwOyBwKyspCisgICAgICAgIGlmICgqcCA9PSAnLCcpCisgICAgICAgICAgICBuKys7CisgICAgbisrOworCisgICAgcmVhZF9pbnRlcnZhbHMgPSBhdl9tYWxsb2NfYXJyYXkobiwgc2l6ZW9mKCpyZWFkX2ludGVydmFscykpOworICAgIGlmICghcmVhZF9pbnRlcnZhbHMpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisgICAgcmVhZF9pbnRlcnZhbHNfbmIgPSBuOworCisgICAgLyogcGFyc2UgaW50ZXJ2YWxzICovCisgICAgcCA9IHNwZWM7CisgICAgZm9yIChpID0gMDsgcDsgaSsrKSB7CisgICAgICAgIGNoYXIgKm5leHQ7CisKKyAgICAgICAgYXZfYXNzZXJ0MChpIDwgcmVhZF9pbnRlcnZhbHNfbmIpOworICAgICAgICBuZXh0ID0gc3RyY2hyKHAsICcsJyk7CisgICAgICAgIGlmIChuZXh0KQorICAgICAgICAgICAgKm5leHQrKyA9IDA7CisKKyAgICAgICAgcmVhZF9pbnRlcnZhbHNbaV0uaWQgPSBpOworICAgICAgICByZXQgPSBwYXJzZV9yZWFkX2ludGVydmFsKHAsICZyZWFkX2ludGVydmFsc1tpXSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyByZWFkIGludGVydmFsICMlZCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgIGksIHApOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLCAiUGFyc2VkIGxvZyBpbnRlcnZhbCAiKTsKKyAgICAgICAgbG9nX3JlYWRfaW50ZXJ2YWwoJnJlYWRfaW50ZXJ2YWxzW2ldLCBOVUxMLCBBVl9MT0dfVkVSQk9TRSk7CisgICAgICAgIHAgPSBuZXh0OworICAgIH0KKyAgICBhdl9hc3NlcnQwKGkgPT0gcmVhZF9pbnRlcnZhbHNfbmIpOworCitlbmQ6CisgICAgYXZfZnJlZShzcGVjKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9wdF9yZWFkX2ludGVydmFscyh2b2lkICpvcHRjdHgsIGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIHJldHVybiBwYXJzZV9yZWFkX2ludGVydmFscyhhcmcpOworfQorCitzdGF0aWMgaW50IG9wdF9wcmV0dHkodm9pZCAqb3B0Y3R4LCBjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBzaG93X3ZhbHVlX3VuaXQgICAgICAgICAgICAgID0gMTsKKyAgICB1c2VfdmFsdWVfcHJlZml4ICAgICAgICAgICAgID0gMTsKKyAgICB1c2VfYnl0ZV92YWx1ZV9iaW5hcnlfcHJlZml4ID0gMTsKKyAgICB1c2VfdmFsdWVfc2V4YWdlc2ltYWxfZm9ybWF0ID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2VjdGlvbihTZWN0aW9uSUQgaWQsIGludCBsZXZlbCkKK3sKKyAgICBjb25zdCBTZWN0aW9uSUQgKnBpZDsKKyAgICBjb25zdCBzdHJ1Y3Qgc2VjdGlvbiAqc2VjdGlvbiA9ICZzZWN0aW9uc1tpZF07CisgICAgcHJpbnRmKCIlYyVjJWMiLAorICAgICAgICAgICBzZWN0aW9uLT5mbGFncyAmIFNFQ1RJT05fRkxBR19JU19XUkFQUEVSICAgICAgICAgICA/ICdXJyA6ICcuJywKKyAgICAgICAgICAgc2VjdGlvbi0+ZmxhZ3MgJiBTRUNUSU9OX0ZMQUdfSVNfQVJSQVkgICAgICAgICAgICAgPyAnQScgOiAnLicsCisgICAgICAgICAgIHNlY3Rpb24tPmZsYWdzICYgU0VDVElPTl9GTEFHX0hBU19WQVJJQUJMRV9GSUVMRFMgID8gJ1YnIDogJy4nKTsKKyAgICBwcmludGYoIiUqYyAgJXMiLCBsZXZlbCAqIDQsICcgJywgc2VjdGlvbi0+bmFtZSk7CisgICAgaWYgKHNlY3Rpb24tPnVuaXF1ZV9uYW1lKQorICAgICAgICBwcmludGYoIi8lcyIsIHNlY3Rpb24tPnVuaXF1ZV9uYW1lKTsKKyAgICBwcmludGYoIlxuIik7CisKKyAgICBmb3IgKHBpZCA9IHNlY3Rpb24tPmNoaWxkcmVuX2lkczsgKnBpZCAhPSAtMTsgcGlkKyspCisgICAgICAgIHByaW50X3NlY3Rpb24oKnBpZCwgbGV2ZWwrMSk7Cit9CisKK3N0YXRpYyBpbnQgb3B0X3NlY3Rpb25zKHZvaWQgKm9wdGN0eCwgY29uc3QgY2hhciAqb3B0LCBjb25zdCBjaGFyICphcmcpCit7CisgICAgcHJpbnRmKCJTZWN0aW9uczpcbiIKKyAgICAgICAgICAgIlcuLiA9IFNlY3Rpb24gaXMgYSB3cmFwcGVyIChjb250YWlucyBvdGhlciBzZWN0aW9ucywgbm8gbG9jYWwgZW50cmllcylcbiIKKyAgICAgICAgICAgIi5BLiA9IFNlY3Rpb24gY29udGFpbnMgYW4gYXJyYXkgb2YgZWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZVxuIgorICAgICAgICAgICAiLi5WID0gU2VjdGlvbiBtYXkgY29udGFpbiBhIHZhcmlhYmxlIG51bWJlciBvZiBmaWVsZHMgd2l0aCB2YXJpYWJsZSBrZXlzXG4iCisgICAgICAgICAgICJGTEFHUyBOQU1FL1VOSVFVRV9OQU1FXG4iCisgICAgICAgICAgICItLS1cbiIpOworICAgIHByaW50X3NlY3Rpb24oU0VDVElPTl9JRF9ST09ULCAwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcHRfc2hvd192ZXJzaW9ucyhjb25zdCBjaGFyICpvcHQsIGNvbnN0IGNoYXIgKmFyZykKK3sKKyAgICBtYXJrX3NlY3Rpb25fc2hvd19lbnRyaWVzKFNFQ1RJT05fSURfUFJPR1JBTV9WRVJTSU9OLCAxLCBOVUxMKTsKKyAgICBtYXJrX3NlY3Rpb25fc2hvd19lbnRyaWVzKFNFQ1RJT05fSURfTElCUkFSWV9WRVJTSU9OLCAxLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBERUZJTkVfT1BUX1NIT1dfU0VDVElPTihzZWN0aW9uLCB0YXJnZXRfc2VjdGlvbl9pZCkgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbnQgb3B0X3Nob3dfIyNzZWN0aW9uKGNvbnN0IGNoYXIgKm9wdCwgY29uc3QgY2hhciAqYXJnKSAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtYXJrX3NlY3Rpb25fc2hvd19lbnRyaWVzKFNFQ1RJT05fSURfIyN0YXJnZXRfc2VjdGlvbl9pZCwgMSwgTlVMTCk7IFwKKyAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKK0RFRklORV9PUFRfU0hPV19TRUNUSU9OKGNoYXB0ZXJzLCAgICAgICAgIENIQVBURVJTKQorREVGSU5FX09QVF9TSE9XX1NFQ1RJT04oZXJyb3IsICAgICAgICAgICAgRVJST1IpCitERUZJTkVfT1BUX1NIT1dfU0VDVElPTihmb3JtYXQsICAgICAgICAgICBGT1JNQVQpCitERUZJTkVfT1BUX1NIT1dfU0VDVElPTihmcmFtZXMsICAgICAgICAgICBGUkFNRVMpCitERUZJTkVfT1BUX1NIT1dfU0VDVElPTihsaWJyYXJ5X3ZlcnNpb25zLCBMSUJSQVJZX1ZFUlNJT05TKQorREVGSU5FX09QVF9TSE9XX1NFQ1RJT04ocGFja2V0cywgICAgICAgICAgUEFDS0VUUykKK0RFRklORV9PUFRfU0hPV19TRUNUSU9OKHBpeGVsX2Zvcm1hdHMsICAgIFBJWEVMX0ZPUk1BVFMpCitERUZJTkVfT1BUX1NIT1dfU0VDVElPTihwcm9ncmFtX3ZlcnNpb24sICBQUk9HUkFNX1ZFUlNJT04pCitERUZJTkVfT1BUX1NIT1dfU0VDVElPTihzdHJlYW1zLCAgICAgICAgICBTVFJFQU1TKQorREVGSU5FX09QVF9TSE9XX1NFQ1RJT04ocHJvZ3JhbXMsICAgICAgICAgUFJPR1JBTVMpCisKK3N0YXRpYyBjb25zdCBPcHRpb25EZWYgcmVhbF9vcHRpb25zW10gPSB7CisgICAgQ01EVVRJTFNfQ09NTU9OX09QVElPTlMKKyAgICB7ICJmIiwgSEFTX0FSRywgey5mdW5jX2FyZyA9IG9wdF9mb3JtYXR9LCAiZm9yY2UgZm9ybWF0IiwgImZvcm1hdCIgfSwKKyAgICB7ICJ1bml0IiwgT1BUX0JPT0wsIHsmc2hvd192YWx1ZV91bml0fSwgInNob3cgdW5pdCBvZiB0aGUgZGlzcGxheWVkIHZhbHVlcyIgfSwKKyAgICB7ICJwcmVmaXgiLCBPUFRfQk9PTCwgeyZ1c2VfdmFsdWVfcHJlZml4fSwgInVzZSBTSSBwcmVmaXhlcyBmb3IgdGhlIGRpc3BsYXllZCB2YWx1ZXMiIH0sCisgICAgeyAiYnl0ZV9iaW5hcnlfcHJlZml4IiwgT1BUX0JPT0wsIHsmdXNlX2J5dGVfdmFsdWVfYmluYXJ5X3ByZWZpeH0sCisgICAgICAidXNlIGJpbmFyeSBwcmVmaXhlcyBmb3IgYnl0ZSB1bml0cyIgfSwKKyAgICB7ICJzZXhhZ2VzaW1hbCIsIE9QVF9CT09MLCAgeyZ1c2VfdmFsdWVfc2V4YWdlc2ltYWxfZm9ybWF0fSwKKyAgICAgICJ1c2Ugc2V4YWdlc2ltYWwgZm9ybWF0IEhPVVJTOk1NOlNTLk1JQ1JPU0VDT05EUyBmb3IgdGltZSB1bml0cyIgfSwKKyAgICB7ICJwcmV0dHkiLCAwLCB7LmZ1bmNfYXJnID0gb3B0X3ByZXR0eX0sCisgICAgICAicHJldHRpZnkgdGhlIGZvcm1hdCBvZiBkaXNwbGF5ZWQgdmFsdWVzLCBtYWtlIGl0IG1vcmUgaHVtYW4gcmVhZGFibGUiIH0sCisgICAgeyAicHJpbnRfZm9ybWF0IiwgT1BUX1NUUklORyB8IEhBU19BUkcsIHsodm9pZCopJnByaW50X2Zvcm1hdH0sCisgICAgICAic2V0IHRoZSBvdXRwdXQgcHJpbnRpbmcgZm9ybWF0IChhdmFpbGFibGUgZm9ybWF0cyBhcmU6IGRlZmF1bHQsIGNvbXBhY3QsIGNzdiwgZmxhdCwgaW5pLCBqc29uLCB4bWwpIiwgImZvcm1hdCIgfSwKKyAgICB7ICJvZiIsIE9QVF9TVFJJTkcgfCBIQVNfQVJHLCB7KHZvaWQqKSZwcmludF9mb3JtYXR9LCAiYWxpYXMgZm9yIC1wcmludF9mb3JtYXQiLCAiZm9ybWF0IiB9LAorICAgIHsgInNlbGVjdF9zdHJlYW1zIiwgT1BUX1NUUklORyB8IEhBU19BUkcsIHsodm9pZCopJnN0cmVhbV9zcGVjaWZpZXJ9LCAic2VsZWN0IHRoZSBzcGVjaWZpZWQgc3RyZWFtcyIsICJzdHJlYW1fc3BlY2lmaWVyIiB9LAorICAgIHsgInNlY3Rpb25zIiwgT1BUX0VYSVQsIHsuZnVuY19hcmcgPSBvcHRfc2VjdGlvbnN9LCAicHJpbnQgc2VjdGlvbnMgc3RydWN0dXJlIGFuZCBzZWN0aW9uIGluZm9ybWF0aW9uLCBhbmQgZXhpdCIgfSwKKyAgICB7ICJzaG93X2RhdGEiLCAgICBPUFRfQk9PTCwgeyh2b2lkKikmZG9fc2hvd19kYXRhfSwgInNob3cgcGFja2V0cyBkYXRhIiB9LAorICAgIHsgInNob3dfZGF0YV9oYXNoIiwgT1BUX1NUUklORyB8IEhBU19BUkcsIHsodm9pZCopJnNob3dfZGF0YV9oYXNofSwgInNob3cgcGFja2V0cyBkYXRhIGhhc2giIH0sCisgICAgeyAic2hvd19lcnJvciIsICAgMCwgeyh2b2lkKikmb3B0X3Nob3dfZXJyb3J9LCAgInNob3cgcHJvYmluZyBlcnJvciIgfSwKKyAgICB7ICJzaG93X2Zvcm1hdCIsICAwLCB7KHZvaWQqKSZvcHRfc2hvd19mb3JtYXR9LCAic2hvdyBmb3JtYXQvY29udGFpbmVyIGluZm8iIH0sCisgICAgeyAic2hvd19mcmFtZXMiLCAgMCwgeyh2b2lkKikmb3B0X3Nob3dfZnJhbWVzfSwgInNob3cgZnJhbWVzIGluZm8iIH0sCisgICAgeyAic2hvd19mb3JtYXRfZW50cnkiLCBIQVNfQVJHLCB7LmZ1bmNfYXJnID0gb3B0X3Nob3dfZm9ybWF0X2VudHJ5fSwKKyAgICAgICJzaG93IGEgcGFydGljdWxhciBlbnRyeSBmcm9tIHRoZSBmb3JtYXQvY29udGFpbmVyIGluZm8iLCAiZW50cnkiIH0sCisgICAgeyAic2hvd19lbnRyaWVzIiwgSEFTX0FSRywgey5mdW5jX2FyZyA9IG9wdF9zaG93X2VudHJpZXN9LAorICAgICAgInNob3cgYSBzZXQgb2Ygc3BlY2lmaWVkIGVudHJpZXMiLCAiZW50cnlfbGlzdCIgfSwKKyNpZiBIQVZFX1RIUkVBRFMKKyAgICB7ICJzaG93X2xvZyIsIE9QVF9JTlR8SEFTX0FSRywgeyh2b2lkKikmZG9fc2hvd19sb2d9LCAic2hvdyBsb2ciIH0sCisjZW5kaWYKKyAgICB7ICJzaG93X3BhY2tldHMiLCAwLCB7KHZvaWQqKSZvcHRfc2hvd19wYWNrZXRzfSwgInNob3cgcGFja2V0cyBpbmZvIiB9LAorICAgIHsgInNob3dfcHJvZ3JhbXMiLCAwLCB7KHZvaWQqKSZvcHRfc2hvd19wcm9ncmFtc30sICJzaG93IHByb2dyYW1zIGluZm8iIH0sCisgICAgeyAic2hvd19zdHJlYW1zIiwgMCwgeyh2b2lkKikmb3B0X3Nob3dfc3RyZWFtc30sICJzaG93IHN0cmVhbXMgaW5mbyIgfSwKKyAgICB7ICJzaG93X2NoYXB0ZXJzIiwgMCwgeyh2b2lkKikmb3B0X3Nob3dfY2hhcHRlcnN9LCAic2hvdyBjaGFwdGVycyBpbmZvIiB9LAorICAgIHsgImNvdW50X2ZyYW1lcyIsIE9QVF9CT09MLCB7KHZvaWQqKSZkb19jb3VudF9mcmFtZXN9LCAiY291bnQgdGhlIG51bWJlciBvZiBmcmFtZXMgcGVyIHN0cmVhbSIgfSwKKyAgICB7ICJjb3VudF9wYWNrZXRzIiwgT1BUX0JPT0wsIHsodm9pZCopJmRvX2NvdW50X3BhY2tldHN9LCAiY291bnQgdGhlIG51bWJlciBvZiBwYWNrZXRzIHBlciBzdHJlYW0iIH0sCisgICAgeyAic2hvd19wcm9ncmFtX3ZlcnNpb24iLCAgMCwgeyh2b2lkKikmb3B0X3Nob3dfcHJvZ3JhbV92ZXJzaW9ufSwgICJzaG93IGZmcHJvYmUgdmVyc2lvbiIgfSwKKyAgICB7ICJzaG93X2xpYnJhcnlfdmVyc2lvbnMiLCAwLCB7KHZvaWQqKSZvcHRfc2hvd19saWJyYXJ5X3ZlcnNpb25zfSwgInNob3cgbGlicmFyeSB2ZXJzaW9ucyIgfSwKKyAgICB7ICJzaG93X3ZlcnNpb25zIiwgICAgICAgICAwLCB7KHZvaWQqKSZvcHRfc2hvd192ZXJzaW9uc30sICJzaG93IHByb2dyYW0gYW5kIGxpYnJhcnkgdmVyc2lvbnMiIH0sCisgICAgeyAic2hvd19waXhlbF9mb3JtYXRzIiwgMCwgeyh2b2lkKikmb3B0X3Nob3dfcGl4ZWxfZm9ybWF0c30sICJzaG93IHBpeGVsIGZvcm1hdCBkZXNjcmlwdGlvbnMiIH0sCisgICAgeyAic2hvd19wcml2YXRlX2RhdGEiLCBPUFRfQk9PTCwgeyh2b2lkKikmc2hvd19wcml2YXRlX2RhdGF9LCAic2hvdyBwcml2YXRlIGRhdGEiIH0sCisgICAgeyAicHJpdmF0ZSIsICAgICAgICAgICBPUFRfQk9PTCwgeyh2b2lkKikmc2hvd19wcml2YXRlX2RhdGF9LCAic2FtZSBhcyBzaG93X3ByaXZhdGVfZGF0YSIgfSwKKyAgICB7ICJiaXRleGFjdCIsIE9QVF9CT09MLCB7JmRvX2JpdGV4YWN0fSwgImZvcmNlIGJpdGV4YWN0IG91dHB1dCIgfSwKKyAgICB7ICJyZWFkX2ludGVydmFscyIsIEhBU19BUkcsIHsuZnVuY19hcmcgPSBvcHRfcmVhZF9pbnRlcnZhbHN9LCAic2V0IHJlYWQgaW50ZXJ2YWxzIiwgInJlYWRfaW50ZXJ2YWxzIiB9LAorICAgIHsgImRlZmF1bHQiLCBIQVNfQVJHIHwgT1BUX0FVRElPIHwgT1BUX1ZJREVPIHwgT1BUX0VYUEVSVCwgey5mdW5jX2FyZyA9IG9wdF9kZWZhdWx0fSwgImdlbmVyaWMgY2F0Y2ggYWxsIG9wdGlvbiIsICIiIH0sCisgICAgeyAiaSIsIEhBU19BUkcsIHsuZnVuY19hcmcgPSBvcHRfaW5wdXRfZmlsZV9pfSwgInJlYWQgc3BlY2lmaWVkIGZpbGUiLCAiaW5wdXRfZmlsZSJ9LAorICAgIHsgImZpbmRfc3RyZWFtX2luZm8iLCBPUFRfQk9PTCB8IE9QVF9JTlBVVCB8IE9QVF9FWFBFUlQsIHsgJmZpbmRfc3RyZWFtX2luZm8gfSwKKyAgICAgICAgInJlYWQgYW5kIGRlY29kZSB0aGUgc3RyZWFtcyB0byBmaWxsIG1pc3NpbmcgaW5mb3JtYXRpb24gd2l0aCBoZXVyaXN0aWNzIiB9LAorICAgIHsgTlVMTCwgfSwKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NlY3Rpb25fc2hvd19lbnRyaWVzKGludCBzZWN0aW9uX2lkKQoreworICAgIGludCAqaWQ7CisgICAgc3RydWN0IHNlY3Rpb24gKnNlY3Rpb24gPSAmc2VjdGlvbnNbc2VjdGlvbl9pZF07CisgICAgaWYgKHNlY3Rpb25zW3NlY3Rpb25faWRdLnNob3dfYWxsX2VudHJpZXMgfHwgc2VjdGlvbnNbc2VjdGlvbl9pZF0uZW50cmllc190b19zaG93KQorICAgICAgICByZXR1cm4gMTsKKyAgICBmb3IgKGlkID0gc2VjdGlvbi0+Y2hpbGRyZW5faWRzOyAqaWQgIT0gLTE7IGlkKyspCisgICAgICAgIGlmIChjaGVja19zZWN0aW9uX3Nob3dfZW50cmllcygqaWQpKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0VUX0RPX1NIT1coaWQsIHZhcm5hbWUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNoZWNrX3NlY3Rpb25fc2hvd19lbnRyaWVzKFNFQ1RJT05fSURfIyNpZCkpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvX3Nob3dfIyN2YXJuYW1lID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgY29uc3QgV3JpdGVyICp3OworICAgIFdyaXRlckNvbnRleHQgKndjdHg7CisgICAgY2hhciAqYnVmOworICAgIGNoYXIgKndfbmFtZSA9IE5VTEwsICp3X2FyZ3MgPSBOVUxMOworICAgIGludCByZXQsIGk7CisKKyAgICBpbml0X2R5bmxvYWQoKTsKKworI2lmIEhBVkVfVEhSRUFEUworICAgIHJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmbG9nX211dGV4LCBOVUxMKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorI2VuZGlmCisgICAgYXZfbG9nX3NldF9mbGFncyhBVl9MT0dfU0tJUF9SRVBFQVRFRCk7CisgICAgcmVnaXN0ZXJfZXhpdChmZnByb2JlX2NsZWFudXApOworCisgICAgb3B0aW9ucyA9IHJlYWxfb3B0aW9uczsKKyAgICBwYXJzZV9sb2dsZXZlbChhcmdjLCBhcmd2LCBvcHRpb25zKTsKKyAgICBhdmZvcm1hdF9uZXR3b3JrX2luaXQoKTsKKyAgICBpbml0X29wdHMoKTsKKyNpZiBDT05GSUdfQVZERVZJQ0UKKyAgICBhdmRldmljZV9yZWdpc3Rlcl9hbGwoKTsKKyNlbmRpZgorCisgICAgc2hvd19iYW5uZXIoYXJnYywgYXJndiwgb3B0aW9ucyk7CisgICAgcGFyc2Vfb3B0aW9ucyhOVUxMLCBhcmdjLCBhcmd2LCBvcHRpb25zLCBvcHRfaW5wdXRfZmlsZSk7CisKKyAgICBpZiAoZG9fc2hvd19sb2cpCisgICAgICAgIGF2X2xvZ19zZXRfY2FsbGJhY2sobG9nX2NhbGxiYWNrKTsKKworICAgIC8qIG1hcmsgdGhpbmdzIHRvIHNob3csIGJhc2VkIG9uIC1zaG93X2VudHJpZXMgKi8KKyAgICBTRVRfRE9fU0hPVyhDSEFQVEVSUywgY2hhcHRlcnMpOworICAgIFNFVF9ET19TSE9XKEVSUk9SLCBlcnJvcik7CisgICAgU0VUX0RPX1NIT1coRk9STUFULCBmb3JtYXQpOworICAgIFNFVF9ET19TSE9XKEZSQU1FUywgZnJhbWVzKTsKKyAgICBTRVRfRE9fU0hPVyhMSUJSQVJZX1ZFUlNJT05TLCBsaWJyYXJ5X3ZlcnNpb25zKTsKKyAgICBTRVRfRE9fU0hPVyhQQUNLRVRTLCBwYWNrZXRzKTsKKyAgICBTRVRfRE9fU0hPVyhQSVhFTF9GT1JNQVRTLCBwaXhlbF9mb3JtYXRzKTsKKyAgICBTRVRfRE9fU0hPVyhQSVhFTF9GT1JNQVRfRkxBR1MsIHBpeGVsX2Zvcm1hdF9mbGFncyk7CisgICAgU0VUX0RPX1NIT1coUElYRUxfRk9STUFUX0NPTVBPTkVOVFMsIHBpeGVsX2Zvcm1hdF9jb21wb25lbnRzKTsKKyAgICBTRVRfRE9fU0hPVyhQUk9HUkFNX1ZFUlNJT04sIHByb2dyYW1fdmVyc2lvbik7CisgICAgU0VUX0RPX1NIT1coUFJPR1JBTVMsIHByb2dyYW1zKTsKKyAgICBTRVRfRE9fU0hPVyhTVFJFQU1TLCBzdHJlYW1zKTsKKyAgICBTRVRfRE9fU0hPVyhTVFJFQU1fRElTUE9TSVRJT04sIHN0cmVhbV9kaXNwb3NpdGlvbik7CisgICAgU0VUX0RPX1NIT1coUFJPR1JBTV9TVFJFQU1fRElTUE9TSVRJT04sIHN0cmVhbV9kaXNwb3NpdGlvbik7CisKKyAgICBTRVRfRE9fU0hPVyhDSEFQVEVSX1RBR1MsIGNoYXB0ZXJfdGFncyk7CisgICAgU0VUX0RPX1NIT1coRk9STUFUX1RBR1MsIGZvcm1hdF90YWdzKTsKKyAgICBTRVRfRE9fU0hPVyhGUkFNRV9UQUdTLCBmcmFtZV90YWdzKTsKKyAgICBTRVRfRE9fU0hPVyhQUk9HUkFNX1RBR1MsIHByb2dyYW1fdGFncyk7CisgICAgU0VUX0RPX1NIT1coU1RSRUFNX1RBR1MsIHN0cmVhbV90YWdzKTsKKyAgICBTRVRfRE9fU0hPVyhQUk9HUkFNX1NUUkVBTV9UQUdTLCBzdHJlYW1fdGFncyk7CisgICAgU0VUX0RPX1NIT1coUEFDS0VUX1RBR1MsIHBhY2tldF90YWdzKTsKKworICAgIGlmIChkb19iaXRleGFjdCAmJiAoZG9fc2hvd19wcm9ncmFtX3ZlcnNpb24gfHwgZG9fc2hvd19saWJyYXJ5X3ZlcnNpb25zKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIi1iaXRleGFjdCBhbmQgLXNob3dfcHJvZ3JhbV92ZXJzaW9uIG9yIC1zaG93X2xpYnJhcnlfdmVyc2lvbnMgIgorICAgICAgICAgICAgICAgIm9wdGlvbnMgYXJlIGluY29tcGF0aWJsZVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgd3JpdGVyX3JlZ2lzdGVyX2FsbCgpOworCisgICAgaWYgKCFwcmludF9mb3JtYXQpCisgICAgICAgIHByaW50X2Zvcm1hdCA9IGF2X3N0cmR1cCgiZGVmYXVsdCIpOworICAgIGlmICghcHJpbnRfZm9ybWF0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIHdfbmFtZSA9IGF2X3N0cnRvayhwcmludF9mb3JtYXQsICI9IiwgJmJ1Zik7CisgICAgaWYgKCF3X25hbWUpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJObyBuYW1lIHNwZWNpZmllZCBmb3IgdGhlIG91dHB1dCBmb3JtYXRcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICB3X2FyZ3MgPSBidWY7CisKKyAgICBpZiAoc2hvd19kYXRhX2hhc2gpIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9oYXNoX2FsbG9jKCZoYXNoLCBzaG93X2RhdGFfaGFzaCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVJTlZBTCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuOworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIGhhc2ggYWxnb3JpdGhtICclcydcbktub3duIGFsZ29yaXRobXM6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2hvd19kYXRhX2hhc2gpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IChuID0gYXZfaGFzaF9uYW1lcyhpKSk7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiAlcyIsIG4pOworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3ID0gd3JpdGVyX2dldF9ieV9uYW1lKHdfbmFtZSk7CisgICAgaWYgKCF3KSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIG91dHB1dCBmb3JtYXQgd2l0aCBuYW1lICclcydcbiIsIHdfbmFtZSk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSB3cml0ZXJfb3Blbigmd2N0eCwgdywgd19hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbnMsIEZGX0FSUkFZX0VMRU1TKHNlY3Rpb25zKSkpID49IDApIHsKKyAgICAgICAgaWYgKHcgPT0gJnhtbF93cml0ZXIpCisgICAgICAgICAgICB3Y3R4LT5zdHJpbmdfdmFsaWRhdGlvbl91dGY4X2ZsYWdzIHw9IEFWX1VURjhfRkxBR19FWENMVURFX1hNTF9JTlZBTElEX0NPTlRST0xfQ09ERVM7CisKKyAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25faGVhZGVyKHdjdHgsIFNFQ1RJT05fSURfUk9PVCk7CisKKyAgICAgICAgaWYgKGRvX3Nob3dfcHJvZ3JhbV92ZXJzaW9uKQorICAgICAgICAgICAgZmZwcm9iZV9zaG93X3Byb2dyYW1fdmVyc2lvbih3Y3R4KTsKKyAgICAgICAgaWYgKGRvX3Nob3dfbGlicmFyeV92ZXJzaW9ucykKKyAgICAgICAgICAgIGZmcHJvYmVfc2hvd19saWJyYXJ5X3ZlcnNpb25zKHdjdHgpOworICAgICAgICBpZiAoZG9fc2hvd19waXhlbF9mb3JtYXRzKQorICAgICAgICAgICAgZmZwcm9iZV9zaG93X3BpeGVsX2Zvcm1hdHMod2N0eCk7CisKKyAgICAgICAgaWYgKCFpbnB1dF9maWxlbmFtZSAmJgorICAgICAgICAgICAgKChkb19zaG93X2Zvcm1hdCB8fCBkb19zaG93X3Byb2dyYW1zIHx8IGRvX3Nob3dfc3RyZWFtcyB8fCBkb19zaG93X2NoYXB0ZXJzIHx8IGRvX3Nob3dfcGFja2V0cyB8fCBkb19zaG93X2Vycm9yKSB8fAorICAgICAgICAgICAgICghZG9fc2hvd19wcm9ncmFtX3ZlcnNpb24gJiYgIWRvX3Nob3dfbGlicmFyeV92ZXJzaW9ucyAmJiAhZG9fc2hvd19waXhlbF9mb3JtYXRzKSkpIHsKKyAgICAgICAgICAgIHNob3dfdXNhZ2UoKTsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJZb3UgaGF2ZSB0byBzcGVjaWZ5IG9uZSBpbnB1dCBmaWxlLlxuIik7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVXNlIC1oIHRvIGdldCBmdWxsIGhlbHAgb3IsIGV2ZW4gYmV0dGVyLCBydW4gJ21hbiAlcycuXG4iLCBwcm9ncmFtX25hbWUpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9IGVsc2UgaWYgKGlucHV0X2ZpbGVuYW1lKSB7CisgICAgICAgICAgICByZXQgPSBwcm9iZV9maWxlKHdjdHgsIGlucHV0X2ZpbGVuYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIGRvX3Nob3dfZXJyb3IpCisgICAgICAgICAgICAgICAgc2hvd19lcnJvcih3Y3R4LCByZXQpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVyX3ByaW50X3NlY3Rpb25fZm9vdGVyKHdjdHgpOworICAgICAgICB3cml0ZXJfY2xvc2UoJndjdHgpOworICAgIH0KKworZW5kOgorICAgIGF2X2ZyZWVwKCZwcmludF9mb3JtYXQpOworICAgIGF2X2ZyZWVwKCZyZWFkX2ludGVydmFscyk7CisgICAgYXZfaGFzaF9mcmVlcCgmaGFzaCk7CisKKyAgICB1bmluaXRfb3B0cygpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzZWN0aW9ucyk7IGkrKykKKyAgICAgICAgYXZfZGljdF9mcmVlKCYoc2VjdGlvbnNbaV0uZW50cmllc190b19zaG93KSk7CisKKyAgICBhdmZvcm1hdF9uZXR3b3JrX2RlaW5pdCgpOworCisgICAgcmV0dXJuIHJldCA8IDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjLzR4bS5jIGIvbGliYXZjb2RlYy80eG0uYwppbmRleCBhN2E3NTdhLi44ZTA1YTRjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjLzR4bS5jCisrKyBiL2xpYmF2Y29kZWMvNHhtLmMKQEAgLTQ5OCw3ICs0OTgsNyBAQAogCiAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmYtPmdiKSA8IDIpewogICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIiVkIGJpdHMgbGVmdCBiZWZvcmUgZGVjb2RlX2lfYmxvY2soKVxuIiwgZ2V0X2JpdHNfbGVmdCgmZi0+Z2IpKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKICAgICAvKiBEQyBjb2VmICovCkBAIC01MzIsNyArNTMyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGkgICAgKz0gY29kZSA+PiA0OwogICAgICAgICAgICAgaWYgKGkgPj0gNjQpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJ1biAlZCBvdmVmbG93XG4iLCBpKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJ1biAlZCBvdmVyZmxvd1xuIiwgaSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CiAKQEAgLTczMiw3ICs3MzIsNyBAQAogICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMTYpIHsKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb2xvcls0XSA9IHsgMCB9LCBiaXRzOwogICAgICAgICAgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCA4KQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIC8vIHdhcm5pbmcgZm9sbG93aW5nIGlzIHB1cmVseSBndWVzc2VkIC4uLgogICAgICAgICAgICAgY29sb3JbMF0gPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmczKTsKICAgICAgICAgICAgIGNvbG9yWzFdID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnMyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjLzhicHMuYyBiL2xpYmF2Y29kZWMvOGJwcy5jCmluZGV4IDJlNDQ2NGQuLmFhMjMxOGYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvOGJwcy5jCisrKyBiL2xpYmF2Y29kZWMvOGJwcy5jCkBAIC0yOCw3ICsyOCw2IEBACiAgKiBTdXBwb3J0czogUEFMOCAoUkdCIDhicHAsIHBhbGV0dGVkKQogICogICAgICAgICA6IEJHUjI0IChSR0IgMjRicHApIChjYW4gYWxzbyBvdXRwdXQgaXQgYXMgUkdCMzIpCiAgKiAgICAgICAgIDogUkdCMzIgKFJHQiAzMmJwcCwgNHRoIHBsYW5lIGlzIGFscGhhKQotICoKICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTQyLDcgKzQxLDcgQEAKIAogCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGZtdF9yZ2IyNFtdID0gewotICAgIEFWX1BJWF9GTVRfQkdSMjQsIEFWX1BJWF9GTVRfUkdCMzIsIEFWX1BJWF9GTVRfTk9ORSB9OworICAgIEFWX1BJWF9GTVRfQkdSMjQsIEFWX1BJWF9GTVRfMFJHQjMyLCBBVl9QSVhfRk1UX05PTkUgfTsKIAogdHlwZWRlZiBzdHJ1Y3QgRWlnaHRCcHNDb250ZXh0IHsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CkBAIC02Niw2ICs2NSw3IEBACiAgICAgdW5zaWduZWQgaW50IGRsZW4sIHAsIHJvdzsKICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpscCwgKmRwLCAqZXA7CiAgICAgdW5zaWduZWQgY2hhciBjb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgcHhfaW5jOwogICAgIHVuc2lnbmVkIGludCBwbGFuZXMgICAgID0gYy0+cGxhbmVzOwogICAgIHVuc2lnbmVkIGNoYXIgKnBsYW5lbWFwID0gYy0+cGxhbmVtYXA7CiAgICAgaW50IHJldDsKQEAgLTc4LDYgKzc4LDggQEAKICAgICAvKiBTZXQgZGF0YSBwb2ludGVyIGFmdGVyIGxpbmUgbGVuZ3RocyAqLwogICAgIGRwID0gZW5jb2RlZCArIHBsYW5lcyAqIChoZWlnaHQgPDwgMSk7CiAKKyAgICBweF9pbmMgPSBwbGFuZXMgKyAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF8wUkdCMzIpOworCiAgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lczsgcCsrKSB7CiAgICAgICAgIC8qIExpbmVzIGxlbmd0aCBwb2ludGVyIGZvciB0aGlzIHBsYW5lICovCiAgICAgICAgIGxwID0gZW5jb2RlZCArIHAgKiAoaGVpZ2h0IDw8IDEpOwpAQCAtOTYsMjEgKzk4LDIxIEBACiAgICAgICAgICAgICAgICAgaWYgKChjb3VudCA9ICpkcCsrKSA8PSAxMjcpIHsKICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgZGxlbiAtPSBjb3VudCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaXhwdHJfZW5kIC0gcGl4cHRyIDwgY291bnQgKiBwbGFuZXMpCisgICAgICAgICAgICAgICAgICAgIGlmIChwaXhwdHJfZW5kIC0gcGl4cHRyIDwgY291bnQgKiBweF9pbmMpCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgaWYgKGVwIC0gZHAgPCBjb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY291bnQtLSkgewogICAgICAgICAgICAgICAgICAgICAgICAgKnBpeHB0ciA9ICpkcCsrOwotICAgICAgICAgICAgICAgICAgICAgICAgcGl4cHRyICs9IHBsYW5lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeHB0ciArPSBweF9pbmM7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDI1NyAtIGNvdW50OwotICAgICAgICAgICAgICAgICAgICBpZiAocGl4cHRyX2VuZCAtIHBpeHB0ciA8IGNvdW50ICogcGxhbmVzKQorICAgICAgICAgICAgICAgICAgICBpZiAocGl4cHRyX2VuZCAtIHBpeHB0ciA8IGNvdW50ICogcHhfaW5jKQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudC0tKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAqcGl4cHRyID0gKmRwOwotICAgICAgICAgICAgICAgICAgICAgICAgcGl4cHRyICs9IHBsYW5lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeHB0ciArPSBweF9pbmM7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZHArKzsKICAgICAgICAgICAgICAgICAgICAgZGxlbiAtPSAyOwpAQCAtMTIwLDEyICsxMjIsMTUgQEAKICAgICB9CiAKICAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSA4KSB7CisgICAgICAgIGludCBzaXplOwogICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfUEFMRVRURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIGlmIChwYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpOworICAgICAgICBpZiAocGFsICYmIHNpemUgPT0gQVZQQUxFVFRFX1NJWkUpIHsKICAgICAgICAgICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKICAgICAgICAgICAgIG1lbWNweShjLT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgICAgICB9IGVsc2UgaWYgKHBhbCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWxldHRlIHNpemUgJWQgaXMgd3JvbmdcbiIsIHNpemUpOwogICAgICAgICB9CiAKICAgICAgICAgbWVtY3B5IChmcmFtZS0+ZGF0YVsxXSwgYy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL01ha2VmaWxlIGIvbGliYXZjb2RlYy9NYWtlZmlsZQppbmRleCBmNmE0ZmJiLi40YjhhZDEyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL01ha2VmaWxlCisrKyBiL2xpYmF2Y29kZWMvTWFrZWZpbGUKQEAgLTEsNTUgKzEsNzAgQEAKLWluY2x1ZGUgJChTVUJESVIpLi4vY29uZmlnLm1hawotCiBOQU1FID0gYXZjb2RlYworREVTQyA9IEZGbXBlZyBjb2RlYyBsaWJyYXJ5CiAKLUhFQURFUlMgPSBhdmNvZGVjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0hFQURFUlMgPSBhYzNfcGFyc2VyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBhZHRzX3BhcnNlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBhdmNvZGVjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBhdmRjdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBhdmZmdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkdl9wcm9maWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBkM2QxMXZhLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBkaXJhYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBkdl9wcm9maWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBkeHZhMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBqbmkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBtZWRpYWNvZGVjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBxc3YuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB2YWFwaS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZGEuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB2ZHBhdS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB2ZXJzaW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB2aWRlb3Rvb2xib3guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB2b3JiaXNfcGFyc2VyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB4dm1jLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAotT0JKUyA9IGFsbGNvZGVjcy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGF1ZGlvY29udmVydC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorT0JKUyA9IGFjM19wYXJzZXIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGFkdHNfcGFyc2VyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGFsbGNvZGVjcy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGF2ZGN0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGF2cGFja2V0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGF2cGljdHVyZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGJpdHN0cmVhbS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGJpdHN0cmVhbV9maWx0ZXIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGJpdHN0cmVhbV9maWx0ZXJzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGJzZi5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNvZGVjX2Rlc2MubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGQzZDExdmEubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGRlY29kZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRpcmFjLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGR2X3Byb2ZpbGUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGVuY29kZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGltZ2NvbnZlcnQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGpuaS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG1hdGh0YWJsZXMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG1lZGlhY29kZWMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG1wZWcxMmZyYW1lcmF0ZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9wdGlvbnMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIG1qcGVnZW5jX2h1ZmZtYW4ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHBhcnNlci5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHByb2ZpbGVzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHFzdl9hcGkubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHJhdy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHJlc2FtcGxlLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHJlc2FtcGxlMi5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHV0aWxzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHZvcmJpc19wYXJzZXIubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHhpcGgubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiAjIHN1YnN5c3RlbXMKIE9CSlMtJChDT05GSUdfQUFORENUVEFCTEVTKSAgICAgICAgICAgICs9IGFhbmRjdHRhYi5vCi1PQkpTLSQoQ09ORklHX0FDM0RTUCkgICAgICAgICAgICAgICAgICArPSBhYzNkc3AubworT0JKUy0kKENPTkZJR19BQzNEU1ApICAgICAgICAgICAgICAgICAgKz0gYWMzZHNwLm8gYWMzLm8gYWMzdGFiLm8KK09CSlMtJChDT05GSUdfQURUU19IRUFERVIpICAgICAgICAgICAgICs9IGFkdHNfaGVhZGVyLm8gbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX0FNRikgICAgICAgICAgICAgICAgICAgICArPSBhbWZlbmMubwogT0JKUy0kKENPTkZJR19BVURJT19GUkFNRV9RVUVVRSkgICAgICAgKz0gYXVkaW9fZnJhbWVfcXVldWUubwogT0JKUy0kKENPTkZJR19BVURJT0RTUCkgICAgICAgICAgICAgICAgKz0gYXVkaW9kc3AubwogT0JKUy0kKENPTkZJR19CTE9DS0RTUCkgICAgICAgICAgICAgICAgKz0gYmxvY2tkc3AubwogT0JKUy0kKENPTkZJR19CU1dBUERTUCkgICAgICAgICAgICAgICAgKz0gYnN3YXBkc3AubwogT0JKUy0kKENPTkZJR19DQUJBQykgICAgICAgICAgICAgICAgICAgKz0gY2FiYWMubworT0JKUy0kKENPTkZJR19DQlMpICAgICAgICAgICAgICAgICAgICAgKz0gY2JzLm8KK09CSlMtJChDT05GSUdfQ0JTX0gyNjQpICAgICAgICAgICAgICAgICs9IGNic19oMjY0NS5vIGgyNjQ1X3BhcnNlLm8KK09CSlMtJChDT05GSUdfQ0JTX0gyNjUpICAgICAgICAgICAgICAgICs9IGNic19oMjY0NS5vIGgyNjQ1X3BhcnNlLm8KK09CSlMtJChDT05GSUdfQ0JTX01QRUcyKSAgICAgICAgICAgICAgICs9IGNic19tcGVnMi5vCiBPQkpTLSQoQ09ORklHX0NSWVNUQUxIRCkgICAgICAgICAgICAgICArPSBjcnlzdGFsaGQubwogT0JKUy0kKENPTkZJR19EQ1QpICAgICAgICAgICAgICAgICAgICAgKz0gZGN0Lm8gZGN0MzJfZml4ZWQubyBkY3QzMl9mbG9hdC5vCiBPQkpTLSQoQ09ORklHX0VSUk9SX1JFU0lMSUVOQ0UpICAgICAgICArPSBlcnJvcl9yZXNpbGllbmNlLm8KQEAgLTY3LDMzICs4MiwzNyBAQAogT0JKUy0kKENPTkZJR19IMjYzRFNQKSAgICAgICAgICAgICAgICAgKz0gaDI2M2RzcC5vCiBPQkpTLSQoQ09ORklHX0gyNjRDSFJPTUEpICAgICAgICAgICAgICArPSBoMjY0Y2hyb21hLm8KIE9CSlMtJChDT05GSUdfSDI2NERTUCkgICAgICAgICAgICAgICAgICs9IGgyNjRkc3AubyBoMjY0aWRjdC5vCitPQkpTLSQoQ09ORklHX0gyNjRQQVJTRSkgICAgICAgICAgICAgICArPSBoMjY0X3BhcnNlLm8gaDI2NDVfcGFyc2UubyBoMjY0X3BzLm8KIE9CSlMtJChDT05GSUdfSDI2NFBSRUQpICAgICAgICAgICAgICAgICs9IGgyNjRwcmVkLm8KIE9CSlMtJChDT05GSUdfSDI2NFFQRUwpICAgICAgICAgICAgICAgICs9IGgyNjRxcGVsLm8KK09CSlMtJChDT05GSUdfSEVWQ1BBUlNFKSAgICAgICAgICAgICAgICs9IGhldmNfcGFyc2UubyBoMjY0NV9wYXJzZS5vIGhldmNfcHMubyBoZXZjX3NlaS5vIGhldmNfZGF0YS5vCiBPQkpTLSQoQ09ORklHX0hQRUxEU1ApICAgICAgICAgICAgICAgICArPSBocGVsZHNwLm8KIE9CSlMtJChDT05GSUdfSFVGRk1BTikgICAgICAgICAgICAgICAgICs9IGh1ZmZtYW4ubwogT0JKUy0kKENPTkZJR19IVUZGWVVWRFNQKSAgICAgICAgICAgICAgKz0gaHVmZnl1dmRzcC5vCiBPQkpTLSQoQ09ORklHX0hVRkZZVVZFTkNEU1ApICAgICAgICAgICArPSBodWZmeXV2ZW5jZHNwLm8KIE9CSlMtJChDT05GSUdfSURDVERTUCkgICAgICAgICAgICAgICAgICs9IGlkY3Rkc3AubyBzaW1wbGVfaWRjdC5vIGpyZXZkY3QubwogT0JKUy0kKENPTkZJR19JSVJGSUxURVIpICAgICAgICAgICAgICAgKz0gaWlyZmlsdGVyLm8KLU9CSlMtJChDT05GSUdfSU1EQ1QxNSkgICAgICAgICAgICAgICAgICs9IGltZGN0MTUubwotT0JKUy0kKENPTkZJR19JTlRSQVg4KSAgICAgICAgICAgICAgICAgKz0gaW50cmF4OC5vIGludHJheDhkc3AubworT0JKUy0kKENPTkZJR19NRENUMTUpICAgICAgICAgICAgICAgICAgKz0gbWRjdDE1Lm8KK09CSlMtJChDT05GSUdfSU5UUkFYOCkgICAgICAgICAgICAgICAgICs9IGludHJheDgubyBpbnRyYXg4ZHNwLm8gbXNtcGVnNGRhdGEubwogT0JKUy0kKENPTkZJR19JVklEU1ApICAgICAgICAgICAgICAgICAgKz0gaXZpX2RzcC5vCitPQkpTLSQoQ09ORklHX0pOSSkgICAgICAgICAgICAgICAgICAgICArPSBmZmpuaS5vIGpuaS5vCiBPQkpTLSQoQ09ORklHX0pQRUdUQUJMRVMpICAgICAgICAgICAgICArPSBqcGVndGFibGVzLm8KLU9CSlMtJChDT05GSUdfTElCWFZJRCkgICAgICAgICAgICAgICAgICs9IGxpYnh2aWRfcmMubwogT0JKUy0kKENPTkZJR19MTEFVRERTUCkgICAgICAgICAgICAgICAgKz0gbG9zc2xlc3NfYXVkaW9kc3AubwogT0JKUy0kKENPTkZJR19MTFZJRERTUCkgICAgICAgICAgICAgICAgKz0gbG9zc2xlc3NfdmlkZW9kc3AubworT0JKUy0kKENPTkZJR19MTFZJREVOQ0RTUCkgICAgICAgICAgICAgKz0gbG9zc2xlc3NfdmlkZW9lbmNkc3AubwogT0JKUy0kKENPTkZJR19MUEMpICAgICAgICAgICAgICAgICAgICAgKz0gbHBjLm8KIE9CSlMtJChDT05GSUdfTFNQKSAgICAgICAgICAgICAgICAgICAgICs9IGxzcC5vCiBPQkpTLSQoQ09ORklHX0xaRikgICAgICAgICAgICAgICAgICAgICArPSBsemYubwogT0JKUy0kKENPTkZJR19NRENUKSAgICAgICAgICAgICAgICAgICAgKz0gbWRjdF9maXhlZC5vIG1kY3RfZmxvYXQubyBtZGN0X2ZpeGVkXzMyLm8KIE9CSlMtJChDT05GSUdfTUVfQ01QKSAgICAgICAgICAgICAgICAgICs9IG1lX2NtcC5vCitPQkpTLSQoQ09ORklHX01FRElBQ09ERUMpICAgICAgICAgICAgICArPSBtZWRpYWNvZGVjZGVjX2NvbW1vbi5vIG1lZGlhY29kZWNfc3VyZmFjZS5vIG1lZGlhY29kZWNfd3JhcHBlci5vIG1lZGlhY29kZWNfc3dfYnVmZmVyLm8KIE9CSlMtJChDT05GSUdfTVBFR19FUikgICAgICAgICAgICAgICAgICs9IG1wZWdfZXIubwotT0JKUy0kKENPTkZJR19NUEVHQVVESU8pICAgICAgICAgICAgICAgKz0gbXBlZ2F1ZGlvLm8gbXBlZ2F1ZGlvZGF0YS5vICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZ2F1ZGlvZGVjaGVhZGVyLm8KK09CSlMtJChDT05GSUdfTVBFR0FVRElPKSAgICAgICAgICAgICAgICs9IG1wZWdhdWRpby5vCiBPQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICAgICAgICArPSBtcGVnYXVkaW9kc3AubyAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnYXVkaW9kc3BfZGF0YS5vICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnYXVkaW9kc3BfZml4ZWQubyAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnYXVkaW9kc3BfZmxvYXQubworT0JKUy0kKENPTkZJR19NUEVHQVVESU9IRUFERVIpICAgICAgICAgKz0gbXBlZ2F1ZGlvZGVjaGVhZGVyLm8gbXBlZ2F1ZGlvZGF0YS5vCiBPQkpTLSQoQ09ORklHX01QRUdWSURFTykgICAgICAgICAgICAgICArPSBtcGVndmlkZW8ubyBtcGVndmlkZW9kc3AubyBybC5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWd2aWRlb19tb3Rpb24ubyBtcGVndXRpbHMubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVndmlkZW9kYXRhLm8gbXBlZ3BpY3R1cmUubwpAQCAtMTA4LDggKzEyNyw3IEBACiBPQkpTLSQoQ09ORklHX1FTVkRFQykgICAgICAgICAgICAgICAgICArPSBxc3ZkZWMubwogT0JKUy0kKENPTkZJR19RU1ZFTkMpICAgICAgICAgICAgICAgICAgKz0gcXN2ZW5jLm8KIE9CSlMtJChDT05GSUdfUkFOR0VDT0RFUikgICAgICAgICAgICAgICs9IHJhbmdlY29kZXIubwotUkRGVC1PQkpTLSQoQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMpICAgKz0gc2luX3RhYmxlcy5vCi1PQkpTLSQoQ09ORklHX1JERlQpICAgICAgICAgICAgICAgICAgICArPSByZGZ0Lm8gJChSREZULU9CSlMteWVzKQorT0JKUy0kKENPTkZJR19SREZUKSAgICAgICAgICAgICAgICAgICAgKz0gcmRmdC5vCiBPQkpTLSQoQ09ORklHX1JWMzREU1ApICAgICAgICAgICAgICAgICArPSBydjM0ZHNwLm8KIE9CSlMtJChDT05GSUdfU0hBUkVEKSAgICAgICAgICAgICAgICAgICs9IGxvZzJfdGFiLm8gcmV2ZXJzZS5vCiBPQkpTLSQoQ09ORklHX1NJTkVXSU4pICAgICAgICAgICAgICAgICArPSBzaW5ld2luLm8gc2luZXdpbl9maXhlZC5vCkBAIC0xMTgsMTAgKzEzNiwxMyBAQAogT0JKUy0kKENPTkZJR19URVhUVVJFRFNQKSAgICAgICAgICAgICAgKz0gdGV4dHVyZWRzcC5vCiBPQkpTLSQoQ09ORklHX1RFWFRVUkVEU1BFTkMpICAgICAgICAgICArPSB0ZXh0dXJlZHNwZW5jLm8KIE9CSlMtJChDT05GSUdfVFBFTERTUCkgICAgICAgICAgICAgICAgICs9IHRwZWxkc3AubworT0JKUy0kKENPTkZJR19WQUFQSV9FTkNPREUpICAgICAgICAgICAgKz0gdmFhcGlfZW5jb2RlLm8KK09CSlMtJChDT05GSUdfVkMxRFNQKSAgICAgICAgICAgICAgICAgICs9IHZjMWRzcC5vCiBPQkpTLSQoQ09ORklHX1ZJREVPRFNQKSAgICAgICAgICAgICAgICArPSB2aWRlb2RzcC5vCiBPQkpTLSQoQ09ORklHX1ZQM0RTUCkgICAgICAgICAgICAgICAgICArPSB2cDNkc3AubwogT0JKUy0kKENPTkZJR19WUDU2RFNQKSAgICAgICAgICAgICAgICAgKz0gdnA1NmRzcC5vCiBPQkpTLSQoQ09ORklHX1ZQOERTUCkgICAgICAgICAgICAgICAgICArPSB2cDhkc3AubworT0JKUy0kKENPTkZJR19WNEwyX00yTSkgICAgICAgICAgICAgICAgKz0gdjRsMl9tMm0ubyB2NGwyX2NvbnRleHQubyB2NGwyX2J1ZmZlcnMubyB2NGwyX2ZtdC5vCiBPQkpTLSQoQ09ORklHX1dNQV9GUkVRUykgICAgICAgICAgICAgICArPSB3bWFfZnJlcXMubwogT0JKUy0kKENPTkZJR19XTVYyRFNQKSAgICAgICAgICAgICAgICAgKz0gd212MmRzcC5vCiAKQEAgLTEzMCwyMSArMTUxLDIxIEBACiBPQkpTLSQoQ09ORklHX0E2NE1VTFRJX0VOQ09ERVIpICAgICAgICArPSBhNjRtdWx0aWVuYy5vIGVsYmcubwogT0JKUy0kKENPTkZJR19BNjRNVUxUSTVfRU5DT0RFUikgICAgICAgKz0gYTY0bXVsdGllbmMubyBlbGJnLm8KIE9CSlMtJChDT05GSUdfQUFDX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFhY2RlYy5vIGFhY3RhYi5vIGFhY3Nici5vIGFhY3BzX2Zsb2F0Lm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjYWR0c2RlYy5vIG1wZWc0YXVkaW8ubyBrYmR3aW4ubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJkc3AubyBhYWNwc2RzcF9mbG9hdC5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnNGF1ZGlvLm8ga2Jkd2luLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JyZHNwLm8gYWFjcHNkc3BfZmxvYXQubyBjYnJ0X2RhdGEubwogT0JKUy0kKENPTkZJR19BQUNfRklYRURfREVDT0RFUikgICAgICAgKz0gYWFjZGVjX2ZpeGVkLm8gYWFjdGFiLm8gYWFjc2JyX2ZpeGVkLm8gYWFjcHNfZml4ZWQubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWNhZHRzZGVjLm8gbXBlZzRhdWRpby5vIGtiZHdpbi5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNicmRzcF9maXhlZC5vIGFhY3BzZHNwX2ZpeGVkLm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWc0YXVkaW8ubyBrYmR3aW4ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJkc3BfZml4ZWQubyBhYWNwc2RzcF9maXhlZC5vIGNicnRfZGF0YV9maXhlZC5vCiBPQkpTLSQoQ09ORklHX0FBQ19FTkNPREVSKSAgICAgICAgICAgICArPSBhYWNlbmMubyBhYWNjb2Rlci5vIGFhY2VuY3RhYi5vICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY3BzeS5vIGFhY3RhYi5vICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjZW5jX2lzLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjZW5jX3Rucy5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhY2VuY19sdHAubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWNlbmNfcHJlZC5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeW1vZGVsLm8gbXBlZzRhdWRpby5vIGtiZHdpbi5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc3ltb2RlbC5vIG1wZWc0YXVkaW8ubyBrYmR3aW4ubyBjYnJ0X2RhdGEubwogT0JKUy0kKENPTkZJR19BQVNDX0RFQ09ERVIpICAgICAgICAgICAgKz0gYWFzYy5vIG1zcmxlZGVjLm8KLU9CSlMtJChDT05GSUdfQUMzX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFjM2RlY19mbG9hdC5vIGFjM2RlY19kYXRhLm8gYWMzLm8ga2Jkd2luLm8KLU9CSlMtJChDT05GSUdfQUMzX0ZJWEVEX0RFQ09ERVIpICAgICAgICs9IGFjM2RlY19maXhlZC5vIGFjM2RlY19kYXRhLm8gYWMzLm8ga2Jkd2luLm8KK09CSlMtJChDT05GSUdfQUMzX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFjM2RlY19mbG9hdC5vIGFjM2RlY19kYXRhLm8gYWMzLm8ga2Jkd2luLm8gYWMzdGFiLm8KK09CSlMtJChDT05GSUdfQUMzX0ZJWEVEX0RFQ09ERVIpICAgICAgICs9IGFjM2RlY19maXhlZC5vIGFjM2RlY19kYXRhLm8gYWMzLm8ga2Jkd2luLm8gYWMzdGFiLm8KIE9CSlMtJChDT05GSUdfQUMzX0VOQ09ERVIpICAgICAgICAgICAgICs9IGFjM2VuY19mbG9hdC5vIGFjM2VuYy5vIGFjM3RhYi5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjMy5vIGtiZHdpbi5vCiBPQkpTLSQoQ09ORklHX0FDM19GSVhFRF9FTkNPREVSKSAgICAgICArPSBhYzNlbmNfZml4ZWQubyBhYzNlbmMubyBhYzN0YWIubyBhYzMubwpAQCAtMTUzLDcgKzE3NCw3IEBACiBPQkpTLSQoQ09ORklHX0FMQUNfRU5DT0RFUikgICAgICAgICAgICArPSBhbGFjZW5jLm8gYWxhY19kYXRhLm8KIE9CSlMtJChDT05GSUdfQUxJQVNfUElYX0RFQ09ERVIpICAgICAgICs9IGFsaWFzcGl4ZGVjLm8KIE9CSlMtJChDT05GSUdfQUxJQVNfUElYX0VOQ09ERVIpICAgICAgICs9IGFsaWFzcGl4ZW5jLm8KLU9CSlMtJChDT05GSUdfQUxTX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFsc2RlYy5vIGJnbWMubyBtcGVnNGF1ZGlvLm8KK09CSlMtJChDT05GSUdfQUxTX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFsc2RlYy5vIGJnbWMubyBtbHoubyBtcGVnNGF1ZGlvLm8KIE9CSlMtJChDT05GSUdfQU1STkJfREVDT0RFUikgICAgICAgICAgICs9IGFtcm5iZGVjLm8gY2VscF9maWx0ZXJzLm8gICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxwX21hdGgubyBhY2VscF9maWx0ZXJzLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNlbHBfdmVjdG9ycy5vICAgICAgICAgICAgIFwKQEAgLTE2MywxNyArMTg0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2VscF92ZWN0b3JzLm8gICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNlbHBfcGl0Y2hfZGVsYXkubwogT0JKUy0kKENPTkZJR19BTVZfRU5DT0RFUikgICAgICAgICAgICAgKz0gbWpwZWdlbmMubyBtanBlZ2VuY19jb21tb24ubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVndmlkZW9fZW5jLm8gbW90aW9uX2VzdC5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGVjb250cm9sLm8gbXBlZzEyZGF0YS5vICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZ3ZpZGVvLm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1qcGVnZW5jX2h1ZmZtYW4ubwogT0JKUy0kKENPTkZJR19BTk1fREVDT0RFUikgICAgICAgICAgICAgKz0gYW5tLm8KIE9CSlMtJChDT05GSUdfQU5TSV9ERUNPREVSKSAgICAgICAgICAgICs9IGFuc2kubyBjZ2FfZGF0YS5vCiBPQkpTLSQoQ09ORklHX0FQRV9ERUNPREVSKSAgICAgICAgICAgICArPSBhcGVkZWMubworT0JKUy0kKENPTkZJR19BUFRYX0RFQ09ERVIpICAgICAgICAgICAgKz0gYXB0eC5vCitPQkpTLSQoQ09ORklHX0FQVFhfRU5DT0RFUikgICAgICAgICAgICArPSBhcHR4Lm8KK09CSlMtJChDT05GSUdfQVBUWF9IRF9ERUNPREVSKSAgICAgICAgICs9IGFwdHgubworT0JKUy0kKENPTkZJR19BUFRYX0hEX0VOQ09ERVIpICAgICAgICAgKz0gYXB0eC5vCiBPQkpTLSQoQ09ORklHX0FQTkdfREVDT0RFUikgICAgICAgICAgICArPSBwbmcubyBwbmdkZWMubyBwbmdkc3AubwogT0JKUy0kKENPTkZJR19BUE5HX0VOQ09ERVIpICAgICAgICAgICAgKz0gcG5nLm8gcG5nZW5jLm8KLU9CSlMtJChDT05GSUdfU1NBX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFzc2RlYy5vIGFzcy5vIGFzc19zcGxpdC5vCitPQkpTLSQoQ09ORklHX1NTQV9ERUNPREVSKSAgICAgICAgICAgICArPSBhc3NkZWMubyBhc3MubwogT0JKUy0kKENPTkZJR19TU0FfRU5DT0RFUikgICAgICAgICAgICAgKz0gYXNzZW5jLm8gYXNzLm8KLU9CSlMtJChDT05GSUdfQVNTX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFzc2RlYy5vIGFzcy5vIGFzc19zcGxpdC5vCitPQkpTLSQoQ09ORklHX0FTU19ERUNPREVSKSAgICAgICAgICAgICArPSBhc3NkZWMubyBhc3MubwogT0JKUy0kKENPTkZJR19BU1NfRU5DT0RFUikgICAgICAgICAgICAgKz0gYXNzZW5jLm8gYXNzLm8KIE9CSlMtJChDT05GSUdfQVNWMV9ERUNPREVSKSAgICAgICAgICAgICs9IGFzdmRlYy5vIGFzdi5vIG1wZWcxMmRhdGEubwogT0JKUy0kKENPTkZJR19BU1YxX0VOQ09ERVIpICAgICAgICAgICAgKz0gYXN2ZW5jLm8gYXN2Lm8gbXBlZzEyZGF0YS5vCkBAIC0xODEsOCArMjA0LDExIEBACiBPQkpTLSQoQ09ORklHX0FTVjJfRU5DT0RFUikgICAgICAgICAgICArPSBhc3ZlbmMubyBhc3YubyBtcGVnMTJkYXRhLm8KIE9CSlMtJChDT05GSUdfQVRSQUMxX0RFQ09ERVIpICAgICAgICAgICs9IGF0cmFjMS5vIGF0cmFjLm8KIE9CSlMtJChDT05GSUdfQVRSQUMzX0RFQ09ERVIpICAgICAgICAgICs9IGF0cmFjMy5vIGF0cmFjLm8KK09CSlMtJChDT05GSUdfQVRSQUMzQUxfREVDT0RFUikgICAgICAgICs9IGF0cmFjMy5vIGF0cmFjLm8KIE9CSlMtJChDT05GSUdfQVRSQUMzUF9ERUNPREVSKSAgICAgICAgICs9IGF0cmFjM3BsdXNkZWMubyBhdHJhYzNwbHVzLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRyYWMzcGx1c2RzcC5vIGF0cmFjLm8KK09CSlMtJChDT05GSUdfQVRSQUMzUEFMX0RFQ09ERVIpICAgICAgICs9IGF0cmFjM3BsdXNkZWMubyBhdHJhYzNwbHVzLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRyYWMzcGx1c2RzcC5vIGF0cmFjLm8KIE9CSlMtJChDT05GSUdfQVVSQV9ERUNPREVSKSAgICAgICAgICAgICs9IGN5dXYubwogT0JKUy0kKENPTkZJR19BVVJBMl9ERUNPREVSKSAgICAgICAgICAgKz0gYXVyYS5vCiBPQkpTLSQoQ09ORklHX0FWUk5fREVDT0RFUikgICAgICAgICAgICArPSBhdnJuZGVjLm8gbWpwZWdkZWMubwpAQCAtMTk5LDYgKzIyNSw3IEBACiBPQkpTLSQoQ09ORklHX0JJTktBVURJT19EQ1RfREVDT0RFUikgICArPSBiaW5rYXVkaW8ubwogT0JKUy0kKENPTkZJR19CSU5LQVVESU9fUkRGVF9ERUNPREVSKSAgKz0gYmlua2F1ZGlvLm8KIE9CSlMtJChDT05GSUdfQklOVEVYVF9ERUNPREVSKSAgICAgICAgICs9IGJpbnRleHQubyBjZ2FfZGF0YS5vCitPQkpTLSQoQ09ORklHX0JJVFBBQ0tFRF9ERUNPREVSKSAgICAgICArPSBiaXRwYWNrZWQubwogT0JKUy0kKENPTkZJR19CTVBfREVDT0RFUikgICAgICAgICAgICAgKz0gYm1wLm8gbXNybGVkZWMubwogT0JKUy0kKENPTkZJR19CTVBfRU5DT0RFUikgICAgICAgICAgICAgKz0gYm1wZW5jLm8KIE9CSlMtJChDT05GSUdfQk1WX0FVRElPX0RFQ09ERVIpICAgICAgICs9IGJtdmF1ZGlvLm8KQEAgLTIwNiw0MSArMjMzLDQ1IEBACiBPQkpTLSQoQ09ORklHX0JSRU5ERVJfUElYX0RFQ09ERVIpICAgICArPSBicmVuZGVycGl4Lm8KIE9CSlMtJChDT05GSUdfQzkzX0RFQ09ERVIpICAgICAgICAgICAgICs9IGM5My5vCiBPQkpTLSQoQ09ORklHX0NBVlNfREVDT0RFUikgICAgICAgICAgICArPSBjYXZzLm8gY2F2c2RlYy5vIGNhdnNkc3AubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXZzZGF0YS5vIG1wZWcxMmRhdGEubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F2c2RhdGEubwogT0JKUy0kKENPTkZJR19DQ0FQVElPTl9ERUNPREVSKSAgICAgICAgKz0gY2NhcHRpb25fZGVjLm8KIE9CSlMtJChDT05GSUdfQ0RHUkFQSElDU19ERUNPREVSKSAgICAgICs9IGNkZ3JhcGhpY3MubwogT0JKUy0kKENPTkZJR19DRFhMX0RFQ09ERVIpICAgICAgICAgICAgKz0gY2R4bC5vCiBPQkpTLSQoQ09ORklHX0NGSERfREVDT0RFUikgICAgICAgICAgICArPSBjZmhkLm8gY2ZoZGRhdGEubwogT0JKUy0kKENPTkZJR19DSU5FUEFLX0RFQ09ERVIpICAgICAgICAgKz0gY2luZXBhay5vCiBPQkpTLSQoQ09ORklHX0NJTkVQQUtfRU5DT0RFUikgICAgICAgICArPSBjaW5lcGFrZW5jLm8gZWxiZy5vCitPQkpTLSQoQ09ORklHX0NMRUFSVklERU9fREVDT0RFUikgICAgICArPSBjbGVhcnZpZGVvLm8KIE9CSlMtJChDT05GSUdfQ0xKUl9ERUNPREVSKSAgICAgICAgICAgICs9IGNsanJkZWMubwogT0JKUy0kKENPTkZJR19DTEpSX0VOQ09ERVIpICAgICAgICAgICAgKz0gY2xqcmVuYy5vCiBPQkpTLSQoQ09ORklHX0NMTENfREVDT0RFUikgICAgICAgICAgICArPSBjbGxjLm8gY2Fub3B1cy5vCi1PQkpTLSQoQ09ORklHX0NPT0tfREVDT0RFUikgICAgICAgICAgICArPSBjb29rLm8KIE9CSlMtJChDT05GSUdfQ09NRk9SVE5PSVNFX0RFQ09ERVIpICAgICs9IGNuZ2RlYy5vIGNlbHBfZmlsdGVycy5vCiBPQkpTLSQoQ09ORklHX0NPTUZPUlROT0lTRV9FTkNPREVSKSAgICArPSBjbmdlbmMubworT0JKUy0kKENPTkZJR19DT09LX0RFQ09ERVIpICAgICAgICAgICAgKz0gY29vay5vCiBPQkpTLSQoQ09ORklHX0NQSUFfREVDT0RFUikgICAgICAgICAgICArPSBjcGlhLm8KIE9CSlMtJChDT05GSUdfQ1NDRF9ERUNPREVSKSAgICAgICAgICAgICs9IGNzY2QubwogT0JKUy0kKENPTkZJR19DWVVWX0RFQ09ERVIpICAgICAgICAgICAgKz0gY3l1di5vCi1PQkpTLSQoQ09ORklHX0RDQV9ERUNPREVSKSAgICAgICAgICAgICArPSBkY2FkZWMubyBkY2EubyBkY2FkYXRhLm8gICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjYV9jb3JlLm8gZGNhX2V4c3MubyBkY2FfeGxsLm8gXAorT0JKUy0kKENPTkZJR19EQ0FfREVDT0RFUikgICAgICAgICAgICAgKz0gZGNhZGVjLm8gZGNhLm8gZGNhZGF0YS5vIGRjYWh1ZmYubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2FfY29yZS5vIGRjYV9leHNzLm8gZGNhX3hsbC5vIGRjYV9sYnIubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY2Fkc3AubyBkY2FkY3QubyBzeW50aF9maWx0ZXIubwotT0JKUy0kKENPTkZJR19EQ0FfRU5DT0RFUikgICAgICAgICAgICAgKz0gZGNhZW5jLm8gZGNhLm8gZGNhZGF0YS5vCitPQkpTLSQoQ09ORklHX0RDQV9FTkNPREVSKSAgICAgICAgICAgICArPSBkY2FlbmMubyBkY2EubyBkY2FkYXRhLm8gZGNhaHVmZi5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjYWFkcGNtLm8KIE9CSlMtJChDT05GSUdfRERTX0RFQ09ERVIpICAgICAgICAgICAgICs9IGRkcy5vCiBPQkpTLSQoQ09ORklHX0RJUkFDX0RFQ09ERVIpICAgICAgICAgICArPSBkaXJhY2RlYy5vIGRpcmFjLm8gZGlyYWNkc3AubyBkaXJhY3RhYi5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmFjX2FyaXRoLm8gbXBlZzEyZGF0YS5vIGRpcmFjX2R3dC5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJhY19hcml0aC5vIGRpcmFjX2R3dC5vIGRpcmFjX3ZsYy5vCiBPQkpTLSQoQ09ORklHX0RGQV9ERUNPREVSKSAgICAgICAgICAgICArPSBkZmEubwogT0JKUy0kKENPTkZJR19ETlhIRF9ERUNPREVSKSAgICAgICAgICAgKz0gZG54aGRkZWMubyBkbnhoZGRhdGEubwogT0JKUy0kKENPTkZJR19ETlhIRF9FTkNPREVSKSAgICAgICAgICAgKz0gZG54aGRlbmMubyBkbnhoZGRhdGEubworT0JKUy0kKENPTkZJR19ET0xCWV9FX0RFQ09ERVIpICAgICAgICAgKz0gZG9sYnlfZS5vIGtiZHdpbi5vCiBPQkpTLSQoQ09ORklHX0RQWF9ERUNPREVSKSAgICAgICAgICAgICArPSBkcHgubwogT0JKUy0kKENPTkZJR19EUFhfRU5DT0RFUikgICAgICAgICAgICAgKz0gZHB4ZW5jLm8KLU9CSlMtJChDT05GSUdfRFNEX0xTQkZfREVDT0RFUikgICAgICAgICs9IGRzZGRlYy5vCi1PQkpTLSQoQ09ORklHX0RTRF9NU0JGX0RFQ09ERVIpICAgICAgICArPSBkc2RkZWMubwotT0JKUy0kKENPTkZJR19EU0RfTFNCRl9QTEFOQVJfREVDT0RFUikgKz0gZHNkZGVjLm8KLU9CSlMtJChDT05GSUdfRFNEX01TQkZfUExBTkFSX0RFQ09ERVIpICs9IGRzZGRlYy5vCitPQkpTLSQoQ09ORklHX0RTRF9MU0JGX0RFQ09ERVIpICAgICAgICArPSBkc2RkZWMubyBkc2QubworT0JKUy0kKENPTkZJR19EU0RfTVNCRl9ERUNPREVSKSAgICAgICAgKz0gZHNkZGVjLm8gZHNkLm8KK09CSlMtJChDT05GSUdfRFNEX0xTQkZfUExBTkFSX0RFQ09ERVIpICs9IGRzZGRlYy5vIGRzZC5vCitPQkpTLSQoQ09ORklHX0RTRF9NU0JGX1BMQU5BUl9ERUNPREVSKSArPSBkc2RkZWMubyBkc2QubwogT0JKUy0kKENPTkZJR19EU0lDSU5BVURJT19ERUNPREVSKSAgICAgKz0gZHNpY2luYXVkaW8ubwogT0JKUy0kKENPTkZJR19EU0lDSU5WSURFT19ERUNPREVSKSAgICAgKz0gZHNpY2ludmlkZW8ubwogT0JKUy0kKENPTkZJR19EU1NfU1BfREVDT0RFUikgICAgICAgICAgKz0gZHNzX3NwLm8KK09CSlMtJChDT05GSUdfRFNUX0RFQ09ERVIpICAgICAgICAgICAgICs9IGRzdGRlYy5vIGRzZC5vCiBPQkpTLSQoQ09ORklHX0RWQlNVQl9ERUNPREVSKSAgICAgICAgICArPSBkdmJzdWJkZWMubwogT0JKUy0kKENPTkZJR19EVkJTVUJfRU5DT0RFUikgICAgICAgICAgKz0gZHZic3ViLm8KIE9CSlMtJChDT05GSUdfRFZEU1VCX0RFQ09ERVIpICAgICAgICAgICs9IGR2ZHN1YmRlYy5vCkBAIC0yNTgsMTggKzI4OSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzEyZGF0YS5vCiBPQkpTLSQoQ09ORklHX0VBVEdRX0RFQ09ERVIpICAgICAgICAgICArPSBlYXRncS5vIGVhaWRjdC5vCiBPQkpTLSQoQ09ORklHX0VBVEdWX0RFQ09ERVIpICAgICAgICAgICArPSBlYXRndi5vCi1PQkpTLSQoQ09ORklHX0VBVFFJX0RFQ09ERVIpICAgICAgICAgICArPSBlYXRxaS5vIGVhaWRjdC5vCitPQkpTLSQoQ09ORklHX0VBVFFJX0RFQ09ERVIpICAgICAgICAgICArPSBlYXRxaS5vIGVhaWRjdC5vIG1wZWcxMi5vIG1wZWcxMmRhdGEubyBtcGVndmlkZW9kYXRhLm8gcmwubwogT0JKUy0kKENPTkZJR19FSUdIVEJQU19ERUNPREVSKSAgICAgICAgKz0gOGJwcy5vCiBPQkpTLSQoQ09ORklHX0VJR0hUU1ZYX0VYUF9ERUNPREVSKSAgICArPSA4c3Z4Lm8KIE9CSlMtJChDT05GSUdfRUlHSFRTVlhfRklCX0RFQ09ERVIpICAgICs9IDhzdngubwogT0JKUy0kKENPTkZJR19FU0NBUEUxMjRfREVDT0RFUikgICAgICAgKz0gZXNjYXBlMTI0Lm8KIE9CSlMtJChDT05GSUdfRVNDQVBFMTMwX0RFQ09ERVIpICAgICAgICs9IGVzY2FwZTEzMC5vCiBPQkpTLSQoQ09ORklHX0VWUkNfREVDT0RFUikgICAgICAgICAgICArPSBldnJjZGVjLm8gYWNlbHBfdmVjdG9ycy5vIGxzcC5vCi1PQkpTLSQoQ09ORklHX0VYUl9ERUNPREVSKSAgICAgICAgICAgICArPSBleHIubworT0JKUy0kKENPTkZJR19FWFJfREVDT0RFUikgICAgICAgICAgICAgKz0gZXhyLm8gZXhyZHNwLm8KIE9CSlMtJChDT05GSUdfRkZWMV9ERUNPREVSKSAgICAgICAgICAgICs9IGZmdjFkZWMubyBmZnYxLm8KIE9CSlMtJChDT05GSUdfRkZWMV9FTkNPREVSKSAgICAgICAgICAgICs9IGZmdjFlbmMubyBmZnYxLm8KIE9CSlMtJChDT05GSUdfRkZXQVZFU1lOVEhfREVDT0RFUikgICAgICs9IGZmd2F2ZXN5bnRoLm8KIE9CSlMtJChDT05GSUdfRklDX0RFQ09ERVIpICAgICAgICAgICAgICs9IGZpYy5vCitPQkpTLSQoQ09ORklHX0ZJVFNfREVDT0RFUikgICAgICAgICAgICArPSBmaXRzZGVjLm8gZml0cy5vCitPQkpTLSQoQ09ORklHX0ZJVFNfRU5DT0RFUikgICAgICAgICAgICArPSBmaXRzZW5jLm8KIE9CSlMtJChDT05GSUdfRkxBQ19ERUNPREVSKSAgICAgICAgICAgICs9IGZsYWNkZWMubyBmbGFjZGF0YS5vIGZsYWMubwogT0JKUy0kKENPTkZJR19GTEFDX0VOQ09ERVIpICAgICAgICAgICAgKz0gZmxhY2VuYy5vIGZsYWNkYXRhLm8gZmxhYy5vIHZvcmJpc19kYXRhLm8KIE9CSlMtJChDT05GSUdfRkxBU0hTVl9ERUNPREVSKSAgICAgICAgICs9IGZsYXNoc3YubwpAQCAtMjc3LDYgKzMxMCw3IEBACiBPQkpTLSQoQ09ORklHX0ZMQVNIU1YyX0VOQ09ERVIpICAgICAgICArPSBmbGFzaHN2MmVuYy5vCiBPQkpTLSQoQ09ORklHX0ZMQVNIU1YyX0RFQ09ERVIpICAgICAgICArPSBmbGFzaHN2Lm8KIE9CSlMtJChDT05GSUdfRkxJQ19ERUNPREVSKSAgICAgICAgICAgICs9IGZsaWN2aWRlby5vCitPQkpTLSQoQ09ORklHX0ZNVkNfREVDT0RFUikgICAgICAgICAgICArPSBmbXZjLm8KIE9CSlMtJChDT05GSUdfRk9VUlhNX0RFQ09ERVIpICAgICAgICAgICs9IDR4bS5vCiBPQkpTLSQoQ09ORklHX0ZSQVBTX0RFQ09ERVIpICAgICAgICAgICArPSBmcmFwcy5vCiBPQkpTLSQoQ09ORklHX0ZSV1VfREVDT0RFUikgICAgICAgICAgICArPSBmcnd1Lm8KQEAgLTI4NSw5ICszMTksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjZWxwX3ZlY3RvcnMubyBjZWxwX2ZpbHRlcnMubyBjZWxwX21hdGgubwogT0JKUy0kKENPTkZJR19HNzIzXzFfRU5DT0RFUikgICAgICAgICAgKz0gZzcyM18xZW5jLm8gZzcyM18xLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNlbHBfdmVjdG9ycy5vIGNlbHBfZmlsdGVycy5vIGNlbHBfbWF0aC5vCi1PQkpTLSQoQ09ORklHX0c3MjlfREVDT0RFUikgICAgICAgICAgICArPSBnNzI5ZGVjLm8gbHNwLm8gY2VscF9tYXRoLm8gYWNlbHBfZmlsdGVycy5vIGFjZWxwX3BpdGNoX2RlbGF5Lm8gYWNlbHBfdmVjdG9ycy5vIGc3Mjlwb3N0ZmlsdGVyLm8KK09CSlMtJChDT05GSUdfRzcyOV9ERUNPREVSKSAgICAgICAgICAgICs9IGc3MjlkZWMubyBsc3AubyBjZWxwX21hdGgubyBjZWxwX2ZpbHRlcnMubyBhY2VscF9maWx0ZXJzLm8gYWNlbHBfcGl0Y2hfZGVsYXkubyBhY2VscF92ZWN0b3JzLm8gZzcyOXBvc3RmaWx0ZXIubworT0JKUy0kKENPTkZJR19HRFZfREVDT0RFUikgICAgICAgICAgICAgKz0gZ2R2Lm8KIE9CSlMtJChDT05GSUdfR0lGX0RFQ09ERVIpICAgICAgICAgICAgICs9IGdpZmRlYy5vIGx6dy5vCiBPQkpTLSQoQ09ORklHX0dJRl9FTkNPREVSKSAgICAgICAgICAgICArPSBnaWYubyBsendlbmMubworT0JKUy0kKENPTkZJR19HUkVNTElOX0RQQ01fREVDT0RFUikgICAgKz0gZHBjbS5vCiBPQkpTLSQoQ09ORklHX0dTTV9ERUNPREVSKSAgICAgICAgICAgICArPSBnc21kZWMubyBnc21kZWNfZGF0YS5vIG1zZ3NtZGVjLm8KIE9CSlMtJChDT05GSUdfR1NNX01TX0RFQ09ERVIpICAgICAgICAgICs9IGdzbWRlYy5vIGdzbWRlY19kYXRhLm8gbXNnc21kZWMubwogT0JKUy0kKENPTkZJR19IMjYxX0RFQ09ERVIpICAgICAgICAgICAgKz0gaDI2MWRlYy5vIGgyNjFkYXRhLm8gaDI2MS5vCkBAIC0yOTYsMjIgKzMzMiw0NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzR2aWRlby5vIG1wZWc0dmlkZW9kZWMubyBmbHZkZWMub1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVsaDI2M2RlYy5vIGgyNjNkYXRhLm8KIE9CSlMtJChDT05GSUdfSDI2M19FTkNPREVSKSAgICAgICAgICAgICs9IG1wZWc0dmlkZW9lbmMubyBtcGVnNHZpZGVvLm8gIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjMubyBoMjYzZGF0YS5vIGl0dWgyNjNlbmMubyBmbHZlbmMubwotT0JKUy0kKENPTkZJR19IMjY0X0RFQ09ERVIpICAgICAgICAgICAgKz0gaDI2NC5vIGgyNjRfY2FiYWMubyBoMjY0X2NhdmxjLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2My5vIGl0dWgyNjNlbmMubyBmbHZlbmMubyBoMjYzZGF0YS5vCitPQkpTLSQoQ09ORklHX0gyNjNfVjRMMk0yTV9ERUNPREVSKSAgICArPSB2NGwyX20ybV9kZWMubworT0JKUy0kKENPTkZJR19IMjYzX1Y0TDJNMk1fRU5DT0RFUikgICAgKz0gdjRsMl9tMm1fZW5jLm8KK09CSlMtJChDT05GSUdfSDI2NF9ERUNPREVSKSAgICAgICAgICAgICs9IGgyNjRkZWMubyBoMjY0X2NhYmFjLm8gaDI2NF9jYXZsYy5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfZGlyZWN0Lm8gaDI2NF9sb29wZmlsdGVyLm8gIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfbWIubyBoMjY0X3BpY3R1cmUubyBoMjY0X3BzLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NF9yZWZzLm8gaDI2NF9zZWkubyBoMjY0X3NsaWNlLm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfbWIubyBoMjY0X3BpY3R1cmUubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMjY0X3JlZnMubyBoMjY0X3NlaS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjRfc2xpY2UubyBoMjY0ZGF0YS5vCitPQkpTLSQoQ09ORklHX0gyNjRfQU1GX0VOQ09ERVIpICAgICAgICArPSBhbWZlbmNfaDI2NC5vCitPQkpTLSQoQ09ORklHX0gyNjRfQ1VWSURfREVDT0RFUikgICAgICArPSBjdXZpZGRlYy5vCitPQkpTLSQoQ09ORklHX0gyNjRfTUVESUFDT0RFQ19ERUNPREVSKSArPSBtZWRpYWNvZGVjZGVjLm8KIE9CSlMtJChDT05GSUdfSDI2NF9NTUFMX0RFQ09ERVIpICAgICAgICs9IG1tYWxkZWMubwotT0JKUy0kKENPTkZJR19IMjY0X1ZEQV9ERUNPREVSKSAgICAgICAgKz0gdmRhX2gyNjRfZGVjLm8KK09CSlMtJChDT05GSUdfSDI2NF9OVkVOQ19FTkNPREVSKSAgICAgICs9IG52ZW5jX2gyNjQubworT0JKUy0kKENPTkZJR19OVkVOQ19FTkNPREVSKSAgICAgICAgICAgKz0gbnZlbmNfaDI2NC5vCitPQkpTLSQoQ09ORklHX05WRU5DX0gyNjRfRU5DT0RFUikgICAgICArPSBudmVuY19oMjY0Lm8KK09CSlMtJChDT05GSUdfSDI2NF9PTVhfRU5DT0RFUikgICAgICAgICs9IG9teC5vCiBPQkpTLSQoQ09ORklHX0gyNjRfUVNWX0RFQ09ERVIpICAgICAgICArPSBxc3ZkZWNfaDI2NDUubwogT0JKUy0kKENPTkZJR19IMjY0X1FTVl9FTkNPREVSKSAgICAgICAgKz0gcXN2ZW5jX2gyNjQubworT0JKUy0kKENPTkZJR19IMjY0X1JLTVBQX0RFQ09ERVIpICAgICAgKz0gcmttcHBkZWMubworT0JKUy0kKENPTkZJR19IMjY0X1ZBQVBJX0VOQ09ERVIpICAgICAgKz0gdmFhcGlfZW5jb2RlX2gyNjQubworT0JKUy0kKENPTkZJR19IMjY0X1ZJREVPVE9PTEJPWF9FTkNPREVSKSArPSB2aWRlb3Rvb2xib3hlbmMubworT0JKUy0kKENPTkZJR19IMjY0X1Y0TDJNMk1fREVDT0RFUikgICAgKz0gdjRsMl9tMm1fZGVjLm8KK09CSlMtJChDT05GSUdfSDI2NF9WNEwyTTJNX0VOQ09ERVIpICAgICs9IHY0bDJfbTJtX2VuYy5vCiBPQkpTLSQoQ09ORklHX0hBUF9ERUNPREVSKSAgICAgICAgICAgICArPSBoYXBkZWMubyBoYXAubwogT0JKUy0kKENPTkZJR19IQVBfRU5DT0RFUikgICAgICAgICAgICAgKz0gaGFwZW5jLm8gaGFwLm8KLU9CSlMtJChDT05GSUdfSEVWQ19ERUNPREVSKSAgICAgICAgICAgICs9IGhldmMubyBoZXZjX212cy5vIGhldmNfcHMubyBoZXZjX3NlaS5vIFwKK09CSlMtJChDT05GSUdfSEVWQ19ERUNPREVSKSAgICAgICAgICAgICs9IGhldmNkZWMubyBoZXZjX212cy5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNfY2FiYWMubyBoZXZjX3JlZnMubyBoZXZjcHJlZC5vICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhldmNkc3AubyBoZXZjX2ZpbHRlci5vIGhldmNfcGFyc2UubyBoZXZjX2RhdGEubworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV2Y2RzcC5vIGhldmNfZmlsdGVyLm8gaGV2Y19kYXRhLm8KK09CSlMtJChDT05GSUdfSEVWQ19BTUZfRU5DT0RFUikgICAgICAgICs9IGFtZmVuY19oZXZjLm8KK09CSlMtJChDT05GSUdfSEVWQ19DVVZJRF9ERUNPREVSKSAgICAgICs9IGN1dmlkZGVjLm8KK09CSlMtJChDT05GSUdfSEVWQ19NRURJQUNPREVDX0RFQ09ERVIpICs9IG1lZGlhY29kZWNkZWMubworT0JKUy0kKENPTkZJR19IRVZDX05WRU5DX0VOQ09ERVIpICAgICAgKz0gbnZlbmNfaGV2Yy5vCitPQkpTLSQoQ09ORklHX05WRU5DX0hFVkNfRU5DT0RFUikgICAgICArPSBudmVuY19oZXZjLm8KIE9CSlMtJChDT05GSUdfSEVWQ19RU1ZfREVDT0RFUikgICAgICAgICs9IHFzdmRlY19oMjY0NS5vCi1PQkpTLSQoQ09ORklHX0hFVkNfUVNWX0VOQ09ERVIpICAgICAgICArPSBxc3ZlbmNfaGV2Yy5vIGhldmNfcHNfZW5jLm8gaGV2Y19wYXJzZS5vCitPQkpTLSQoQ09ORklHX0hFVkNfUVNWX0VOQ09ERVIpICAgICAgICArPSBxc3ZlbmNfaGV2Yy5vIGhldmNfcHNfZW5jLm8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV2Y19kYXRhLm8KK09CSlMtJChDT05GSUdfSEVWQ19SS01QUF9ERUNPREVSKSAgICAgICs9IHJrbXBwZGVjLm8KK09CSlMtJChDT05GSUdfSEVWQ19WQUFQSV9FTkNPREVSKSAgICAgICs9IHZhYXBpX2VuY29kZV9oMjY1Lm8KK09CSlMtJChDT05GSUdfSEVWQ19WNEwyTTJNX0RFQ09ERVIpICAgICs9IHY0bDJfbTJtX2RlYy5vCitPQkpTLSQoQ09ORklHX0hFVkNfVjRMMk0yTV9FTkNPREVSKSAgICArPSB2NGwyX20ybV9lbmMubwogT0JKUy0kKENPTkZJR19ITk00X1ZJREVPX0RFQ09ERVIpICAgICAgKz0gaG5tNHZpZGVvLm8KIE9CSlMtJChDT05GSUdfSFFfSFFBX0RFQ09ERVIpICAgICAgICAgICs9IGhxX2hxYS5vIGhxX2hxYWRhdGEubyBocV9ocWFkc3AubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5vcHVzLm8KQEAgLTM0MiwxNyArNDAyLDI1IEBACiBPQkpTLSQoQ09ORklHX0xBR0FSSVRIX0RFQ09ERVIpICAgICAgICArPSBsYWdhcml0aC5vIGxhZ2FyaXRocmFjLm8KIE9CSlMtJChDT05GSUdfTEpQRUdfRU5DT0RFUikgICAgICAgICAgICs9IGxqcGVnZW5jLm8gbWpwZWdlbmNfY29tbW9uLm8KIE9CSlMtJChDT05GSUdfTE9DT19ERUNPREVSKSAgICAgICAgICAgICs9IGxvY28ubworT0JKUy0kKENPTkZJR19NMTAxX0RFQ09ERVIpICAgICAgICAgICAgKz0gbTEwMS5vCiBPQkpTLSQoQ09ORklHX01BQ0UzX0RFQ09ERVIpICAgICAgICAgICArPSBtYWNlLm8KIE9CSlMtJChDT05GSUdfTUFDRTZfREVDT0RFUikgICAgICAgICAgICs9IG1hY2UubworT0JKUy0kKENPTkZJR19NQUdJQ1lVVl9ERUNPREVSKSAgICAgICAgKz0gbWFnaWN5dXYubworT0JKUy0kKENPTkZJR19NQUdJQ1lVVl9FTkNPREVSKSAgICAgICAgKz0gbWFnaWN5dXZlbmMubwogT0JKUy0kKENPTkZJR19NREVDX0RFQ09ERVIpICAgICAgICAgICAgKz0gbWRlYy5vIG1wZWcxMi5vIG1wZWcxMmRhdGEubwogT0JKUy0kKENPTkZJR19NRVRBU09VTkRfREVDT0RFUikgICAgICAgKz0gbWV0YXNvdW5kLm8gbWV0YXNvdW5kX2RhdGEubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d2ludnEubwogT0JKUy0kKENPTkZJR19NSUNST0RWRF9ERUNPREVSKSAgICAgICAgKz0gbWljcm9kdmRkZWMubyBhc3MubwogT0JKUy0kKENPTkZJR19NSU1JQ19ERUNPREVSKSAgICAgICAgICAgKz0gbWltaWMubwogT0JKUy0kKENPTkZJR19NSlBFR19ERUNPREVSKSAgICAgICAgICAgKz0gbWpwZWdkZWMubwotT0JKUy0kKENPTkZJR19NSlBFR19FTkNPREVSKSAgICAgICAgICAgKz0gbWpwZWdlbmMubyBtanBlZ2VuY19jb21tb24ubworT0JKUy0kKENPTkZJR19NSlBFR19FTkNPREVSKSAgICAgICAgICAgKz0gbWpwZWdlbmMubyBtanBlZ2VuY19jb21tb24ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtanBlZ2VuY19odWZmbWFuLm8KIE9CSlMtJChDT05GSUdfTUpQRUdCX0RFQ09ERVIpICAgICAgICAgICs9IG1qcGVnYmRlYy5vCitPQkpTLSQoQ09ORklHX01KUEVHX0NVVklEX0RFQ09ERVIpICAgICArPSBjdXZpZGRlYy5vCitPQkpTLSQoQ09ORklHX01KUEVHX1FTVl9FTkNPREVSKSAgICAgICArPSBxc3ZlbmNfanBlZy5vCitPQkpTLSQoQ09ORklHX01KUEVHX1ZBQVBJX0VOQ09ERVIpICAgICArPSB2YWFwaV9lbmNvZGVfbWpwZWcubwogT0JKUy0kKENPTkZJR19NTFBfREVDT0RFUikgICAgICAgICAgICAgKz0gbWxwZGVjLm8gbWxwZHNwLm8KK09CSlMtJChDT05GSUdfTUxQX0VOQ09ERVIpICAgICAgICAgICAgICs9IG1scGVuYy5vIG1scC5vCiBPQkpTLSQoQ09ORklHX01NVklERU9fREVDT0RFUikgICAgICAgICArPSBtbXZpZGVvLm8KIE9CSlMtJChDT05GSUdfTU9USU9OUElYRUxTX0RFQ09ERVIpICAgICs9IG1vdGlvbnBpeGVscy5vCiBPQkpTLSQoQ09ORklHX01PVlRFWFRfREVDT0RFUikgICAgICAgICArPSBtb3Z0ZXh0ZGVjLm8gYXNzLm8KQEAgLTM3NiwyMiArNDQ0LDM0IEBACiBPQkpTLSQoQ09ORklHX01QRUdWSURFT19ERUNPREVSKSAgICAgICArPSBtcGVnMTJkZWMubyBtcGVnMTIubyBtcGVnMTJkYXRhLm8KIE9CSlMtJChDT05GSUdfTVBFRzFWSURFT19ERUNPREVSKSAgICAgICs9IG1wZWcxMmRlYy5vIG1wZWcxMi5vIG1wZWcxMmRhdGEubwogT0JKUy0kKENPTkZJR19NUEVHMVZJREVPX0VOQ09ERVIpICAgICAgKz0gbXBlZzEyZW5jLm8gbXBlZzEyLm8KK09CSlMtJChDT05GSUdfTVBFRzFfQ1VWSURfREVDT0RFUikgICAgICs9IGN1dmlkZGVjLm8KK09CSlMtJChDT05GSUdfTVBFRzFfVjRMMk0yTV9ERUNPREVSKSAgICs9IHY0bDJfbTJtX2RlYy5vCitPQkpTLSQoQ09ORklHX01QRUcyX01NQUxfREVDT0RFUikgICAgICArPSBtbWFsZGVjLm8KK09CSlMtJChDT05GSUdfTVBFRzJfUVNWX0RFQ09ERVIpICAgICAgICs9IHFzdmRlY19vdGhlci5vCitPQkpTLSQoQ09ORklHX01QRUcyX1FTVl9FTkNPREVSKSAgICAgICArPSBxc3ZlbmNfbXBlZzIubwogT0JKUy0kKENPTkZJR19NUEVHMlZJREVPX0RFQ09ERVIpICAgICAgKz0gbXBlZzEyZGVjLm8gbXBlZzEyLm8gbXBlZzEyZGF0YS5vCiBPQkpTLSQoQ09ORklHX01QRUcyVklERU9fRU5DT0RFUikgICAgICArPSBtcGVnMTJlbmMubyBtcGVnMTIubwotT0JKUy0kKENPTkZJR19NUEVHMl9NTUFMX0RFQ09ERVIpICAgICAgKz0gbW1hbGRlYy5vCi1PQkpTLSQoQ09ORklHX01QRUcyX1FTVl9ERUNPREVSKSAgICAgICArPSBxc3ZkZWNfbXBlZzIubwotT0JKUy0kKENPTkZJR19NUEVHMl9RU1ZfRU5DT0RFUikgICAgICAgKz0gcXN2ZW5jX21wZWcyLm8KK09CSlMtJChDT05GSUdfTVBFRzJfQ1VWSURfREVDT0RFUikgICAgICs9IGN1dmlkZGVjLm8KK09CSlMtJChDT05GSUdfTVBFRzJfTUVESUFDT0RFQ19ERUNPREVSKSArPSBtZWRpYWNvZGVjZGVjLm8KK09CSlMtJChDT05GSUdfTVBFRzJfVkFBUElfRU5DT0RFUikgICAgICs9IHZhYXBpX2VuY29kZV9tcGVnMi5vCitPQkpTLSQoQ09ORklHX01QRUcyX1Y0TDJNMk1fREVDT0RFUikgICArPSB2NGwyX20ybV9kZWMubwogT0JKUy0kKENPTkZJR19NUEVHNF9ERUNPREVSKSAgICAgICAgICAgKz0geHZpZGlkY3QubworT0JKUy0kKENPTkZJR19NUEVHNF9DVVZJRF9ERUNPREVSKSAgICAgKz0gY3V2aWRkZWMubworT0JKUy0kKENPTkZJR19NUEVHNF9NRURJQUNPREVDX0RFQ09ERVIpICs9IG1lZGlhY29kZWNkZWMubworT0JKUy0kKENPTkZJR19NUEVHNF9PTVhfRU5DT0RFUikgICAgICAgKz0gb214Lm8KK09CSlMtJChDT05GSUdfTVBFRzRfVjRMMk0yTV9ERUNPREVSKSAgICs9IHY0bDJfbTJtX2RlYy5vCitPQkpTLSQoQ09ORklHX01QRUc0X1Y0TDJNMk1fRU5DT0RFUikgICArPSB2NGwyX20ybV9lbmMubwogT0JKUy0kKENPTkZJR19NUEwyX0RFQ09ERVIpICAgICAgICAgICAgKz0gbXBsMmRlYy5vIGFzcy5vCitPQkpTLSQoQ09ORklHX01TQTFfREVDT0RFUikgICAgICAgICAgICArPSBtc3MzLm8KK09CSlMtJChDT05GSUdfTVNDQ19ERUNPREVSKSAgICAgICAgICAgICs9IG1zY2MubwogT0JKUy0kKENPTkZJR19NU01QRUc0VjFfREVDT0RFUikgICAgICAgKz0gbXNtcGVnNGRlYy5vIG1zbXBlZzQubyBtc21wZWc0ZGF0YS5vCiBPQkpTLSQoQ09ORklHX01TTVBFRzRWMl9ERUNPREVSKSAgICAgICArPSBtc21wZWc0ZGVjLm8gbXNtcGVnNC5vIG1zbXBlZzRkYXRhLm8KIE9CSlMtJChDT05GSUdfTVNNUEVHNFYyX0VOQ09ERVIpICAgICAgICs9IG1zbXBlZzRlbmMubyBtc21wZWc0Lm8gbXNtcGVnNGRhdGEubwogT0JKUy0kKENPTkZJR19NU01QRUc0VjNfREVDT0RFUikgICAgICAgKz0gbXNtcGVnNGRlYy5vIG1zbXBlZzQubyBtc21wZWc0ZGF0YS5vCiBPQkpTLSQoQ09ORklHX01TTVBFRzRWM19FTkNPREVSKSAgICAgICArPSBtc21wZWc0ZW5jLm8gbXNtcGVnNC5vIG1zbXBlZzRkYXRhLm8KIE9CSlMtJChDT05GSUdfTVNSTEVfREVDT0RFUikgICAgICAgICAgICs9IG1zcmxlLm8gbXNybGVkZWMubwotT0JKUy0kKENPTkZJR19NU0ExX0RFQ09ERVIpICAgICAgICAgICAgKz0gbXNzMy5vCiBPQkpTLSQoQ09ORklHX01TUzFfREVDT0RFUikgICAgICAgICAgICArPSBtc3MxLm8gbXNzMTIubwotT0JKUy0kKENPTkZJR19NU1MyX0RFQ09ERVIpICAgICAgICAgICAgKz0gbXNzMi5vIG1zczEyLm8gbXNzMmRzcC5vCitPQkpTLSQoQ09ORklHX01TUzJfREVDT0RFUikgICAgICAgICAgICArPSBtc3MyLm8gbXNzMTIubyBtc3MyZHNwLm8gd212MmRhdGEubwogT0JKUy0kKENPTkZJR19NU1ZJREVPMV9ERUNPREVSKSAgICAgICAgKz0gbXN2aWRlbzEubwogT0JKUy0kKENPTkZJR19NU1ZJREVPMV9FTkNPREVSKSAgICAgICAgKz0gbXN2aWRlbzFlbmMubyBlbGJnLm8KIE9CSlMtJChDT05GSUdfTVNaSF9ERUNPREVSKSAgICAgICAgICAgICs9IGxjbGRlYy5vCkBAIC00MDMsOCArNDgzLDEwIEBACiBPQkpTLSQoQ09ORklHX05FTExZTU9TRVJfRU5DT0RFUikgICAgICArPSBuZWxseW1vc2VyZW5jLm8gbmVsbHltb3Nlci5vCiBPQkpTLSQoQ09ORklHX05VVl9ERUNPREVSKSAgICAgICAgICAgICArPSBudXYubyBydGpwZWcubwogT0JKUy0kKENPTkZJR19PTjJBVkNfREVDT0RFUikgICAgICAgICAgKz0gb24yYXZjLm8gb24yYXZjZGF0YS5vCi1PQkpTLSQoQ09ORklHX09QVVNfREVDT0RFUikgICAgICAgICAgICArPSBvcHVzZGVjLm8gb3B1cy5vIG9wdXNfY2VsdC5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc2lsay5vIHZvcmJpc19kYXRhLm8KK09CSlMtJChDT05GSUdfT1BVU19ERUNPREVSKSAgICAgICAgICAgICs9IG9wdXNkZWMubyBvcHVzLm8gb3B1c19jZWx0Lm8gb3B1c19yYy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXNfcHZxLm8gb3B1c19zaWxrLm8gb3B1c3RhYi5vIHZvcmJpc19kYXRhLm8KK09CSlMtJChDT05GSUdfT1BVU19FTkNPREVSKSAgICAgICAgICAgICs9IG9wdXNlbmMubyBvcHVzLm8gb3B1c19yYy5vIG9wdXN0YWIubyBvcHVzX3B2cS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXNlbmNfcHN5Lm8KIE9CSlMtJChDT05GSUdfUEFGX0FVRElPX0RFQ09ERVIpICAgICAgICs9IHBhZmF1ZGlvLm8KIE9CSlMtJChDT05GSUdfUEFGX1ZJREVPX0RFQ09ERVIpICAgICAgICs9IHBhZnZpZGVvLm8KIE9CSlMtJChDT05GSUdfUEFNX0RFQ09ERVIpICAgICAgICAgICAgICs9IHBubWRlYy5vIHBubS5vCkBAIC00MTksNiArNTAxLDcgQEAKIE9CSlMtJChDT05GSUdfUEdNWVVWX0VOQ09ERVIpICAgICAgICAgICs9IHBubWVuYy5vCiBPQkpTLSQoQ09ORklHX1BHU1NVQl9ERUNPREVSKSAgICAgICAgICArPSBwZ3NzdWJkZWMubwogT0JKUy0kKENPTkZJR19QSUNUT1JfREVDT0RFUikgICAgICAgICAgKz0gcGljdG9yZGVjLm8gY2dhX2RhdGEubworT0JKUy0kKENPTkZJR19QSVhMRVRfREVDT0RFUikgICAgICAgICAgKz0gcGl4bGV0Lm8KIE9CSlMtJChDT05GSUdfUEpTX0RFQ09ERVIpICAgICAgICAgICAgICs9IHRleHRkZWMubyBhc3MubwogT0JKUy0kKENPTkZJR19QTkdfREVDT0RFUikgICAgICAgICAgICAgKz0gcG5nLm8gcG5nZGVjLm8gcG5nZHNwLm8KIE9CSlMtJChDT05GSUdfUE5HX0VOQ09ERVIpICAgICAgICAgICAgICs9IHBuZy5vIHBuZ2VuYy5vCkBAIC00MjksMTEgKzUxMiwxMyBAQAogT0JKUy0kKENPTkZJR19QUk9SRVNfRU5DT0RFUikgICAgICAgICAgKz0gcHJvcmVzZW5jX2FuYXRvbGl5Lm8KIE9CSlMtJChDT05GSUdfUFJPUkVTX0FXX0VOQ09ERVIpICAgICAgICs9IHByb3Jlc2VuY19hbmF0b2xpeS5vCiBPQkpTLSQoQ09ORklHX1BST1JFU19LU19FTkNPREVSKSAgICAgICArPSBwcm9yZXNlbmNfa29zdHlhLm8gcHJvcmVzZGF0YS5vCitPQkpTLSQoQ09ORklHX1BTRF9ERUNPREVSKSAgICAgICAgICAgICArPSBwc2QubwogT0JKUy0kKENPTkZJR19QVFhfREVDT0RFUikgICAgICAgICAgICAgKz0gcHR4Lm8KIE9CSlMtJChDT05GSUdfUUNFTFBfREVDT0RFUikgICAgICAgICAgICs9IHFjZWxwZGVjLm8gICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxwX2ZpbHRlcnMubyBhY2VscF92ZWN0b3JzLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNlbHBfZmlsdGVycy5vCiBPQkpTLSQoQ09ORklHX1FETTJfREVDT0RFUikgICAgICAgICAgICArPSBxZG0yLm8KK09CSlMtJChDT05GSUdfUURNQ19ERUNPREVSKSAgICAgICAgICAgICs9IHFkbWMubwogT0JKUy0kKENPTkZJR19RRFJBV19ERUNPREVSKSAgICAgICAgICAgKz0gcWRydy5vCiBPQkpTLSQoQ09ORklHX1FQRUdfREVDT0RFUikgICAgICAgICAgICArPSBxcGVnLm8KIE9CSlMtJChDT05GSUdfUVRSTEVfREVDT0RFUikgICAgICAgICAgICs9IHF0cmxlLm8KQEAgLTQ2NiwxMSArNTUxLDEzIEBACiBPQkpTLSQoQ09ORklHX1MzMDJNX0RFQ09ERVIpICAgICAgICAgICArPSBzMzAybS5vCiBPQkpTLSQoQ09ORklHX1MzMDJNX0VOQ09ERVIpICAgICAgICAgICArPSBzMzAybWVuYy5vCiBPQkpTLSQoQ09ORklHX1NBTk1fREVDT0RFUikgICAgICAgICAgICArPSBzYW5tLm8KK09CSlMtJChDT05GSUdfU0NQUl9ERUNPREVSKSAgICAgICAgICAgICs9IHNjcHIubwogT0JKUy0kKENPTkZJR19TQ1JFRU5QUkVTU09fREVDT0RFUikgICAgKz0gc2NyZWVucHJlc3NvLm8KIE9CSlMtJChDT05GSUdfU0RYMl9EUENNX0RFQ09ERVIpICAgICAgICs9IGRwY20ubwogT0JKUy0kKENPTkZJR19TR0lfREVDT0RFUikgICAgICAgICAgICAgKz0gc2dpZGVjLm8KIE9CSlMtJChDT05GSUdfU0dJX0VOQ09ERVIpICAgICAgICAgICAgICs9IHNnaWVuYy5vIHJsZS5vCiBPQkpTLSQoQ09ORklHX1NHSVJMRV9ERUNPREVSKSAgICAgICAgICArPSBzZ2lybGVkZWMubworT0JKUy0kKENPTkZJR19TSEVFUlZJREVPX0RFQ09ERVIpICAgICAgKz0gc2hlZXJ2aWRlby5vCiBPQkpTLSQoQ09ORklHX1NIT1JURU5fREVDT0RFUikgICAgICAgICArPSBzaG9ydGVuLm8KIE9CSlMtJChDT05GSUdfU0lQUl9ERUNPREVSKSAgICAgICAgICAgICs9IHNpcHIubyBhY2VscF9waXRjaF9kZWxheS5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbHBfbWF0aC5vIGFjZWxwX3ZlY3RvcnMubyBcCkBAIC00ODcsNyArNTc0LDkgQEAKIE9CSlMtJChDT05GSUdfU09OSUNfREVDT0RFUikgICAgICAgICAgICs9IHNvbmljLm8KIE9CSlMtJChDT05GSUdfU09OSUNfRU5DT0RFUikgICAgICAgICAgICs9IHNvbmljLm8KIE9CSlMtJChDT05GSUdfU09OSUNfTFNfRU5DT0RFUikgICAgICAgICs9IHNvbmljLm8KK09CSlMtJChDT05GSUdfU1BFRURIUV9ERUNPREVSKSAgICAgICAgICs9IHNwZWVkaHEubyBzaW1wbGVfaWRjdC5vCiBPQkpTLSQoQ09ORklHX1NQNVhfREVDT0RFUikgICAgICAgICAgICArPSBzcDV4ZGVjLm8KK09CSlMtJChDT05GSUdfU1JHQ19ERUNPREVSKSAgICAgICAgICAgICs9IG1zY2MubwogT0JKUy0kKENPTkZJR19TUlRfREVDT0RFUikgICAgICAgICAgICAgKz0gc3J0ZGVjLm8gYXNzLm8gaHRtbHN1YnRpdGxlcy5vCiBPQkpTLSQoQ09ORklHX1NSVF9FTkNPREVSKSAgICAgICAgICAgICArPSBzcnRlbmMubyBhc3Nfc3BsaXQubwogT0JKUy0kKENPTkZJR19TVExfREVDT0RFUikgICAgICAgICAgICAgKz0gdGV4dGRlYy5vIGFzcy5vCkBAIC00OTcsMTAgKzU4NiwxMyBAQAogT0JKUy0kKENPTkZJR19TVUJWSUVXRVJfREVDT0RFUikgICAgICAgKz0gc3Vidmlld2VyZGVjLm8gYXNzLm8KIE9CSlMtJChDT05GSUdfU1VOUkFTVF9ERUNPREVSKSAgICAgICAgICs9IHN1bnJhc3QubwogT0JKUy0kKENPTkZJR19TVU5SQVNUX0VOQ09ERVIpICAgICAgICAgKz0gc3VucmFzdGVuYy5vCi1PQkpTLSQoQ09ORklHX1NWUTFfREVDT0RFUikgICAgICAgICAgICArPSBzdnExZGVjLm8gc3ZxMS5vIHN2cTEzLm8gaDI2My5vCi1PQkpTLSQoQ09ORklHX1NWUTFfRU5DT0RFUikgICAgICAgICAgICArPSBzdnExZW5jLm8gc3ZxMS5vICAgIFwKK09CSlMtJChDT05GSUdfTElCUlNWR19ERUNPREVSKSAgICAgICAgICs9IGxpYnJzdmdkZWMubworT0JKUy0kKENPTkZJR19TQkNfREVDT0RFUikgICAgICAgICAgICAgKz0gc2JjZGVjLm8gc2JjZGVjX2RhdGEubyBzYmMubworT0JKUy0kKENPTkZJR19TQkNfRU5DT0RFUikgICAgICAgICAgICAgKz0gc2JjZW5jLm8gc2JjLm8gc2JjZHNwLm8gc2JjZHNwX2RhdGEubworT0JKUy0kKENPTkZJR19TVlExX0RFQ09ERVIpICAgICAgICAgICAgKz0gc3ZxMWRlYy5vIHN2cTEubyBzdnExMy5vIGgyNjNkYXRhLm8KK09CSlMtJChDT05GSUdfU1ZRMV9FTkNPREVSKSAgICAgICAgICAgICs9IHN2cTFlbmMubyBzdnExLm8gIGgyNjNkYXRhLm8gIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjMubyBpdHVoMjYzZW5jLm8KLU9CSlMtJChDT05GSUdfU1ZRM19ERUNPREVSKSAgICAgICAgICAgICs9IHN2cTMubyBzdnExMy5vIG1wZWd1dGlscy5vCitPQkpTLSQoQ09ORklHX1NWUTNfREVDT0RFUikgICAgICAgICAgICArPSBzdnEzLm8gc3ZxMTMubyBtcGVndXRpbHMubyBoMjY0ZGF0YS5vCiBPQkpTLSQoQ09ORklHX1RFWFRfREVDT0RFUikgICAgICAgICAgICArPSB0ZXh0ZGVjLm8gYXNzLm8KIE9CSlMtJChDT05GSUdfVEVYVF9FTkNPREVSKSAgICAgICAgICAgICs9IHNydGVuYy5vIGFzc19zcGxpdC5vCiBPQkpTLSQoQ09ORklHX1RBS19ERUNPREVSKSAgICAgICAgICAgICArPSB0YWtkZWMubyB0YWsubyB0YWtkc3AubwpAQCAtNTEzLDM2ICs2MDUsMzkgQEAKIE9CSlMtJChDT05GSUdfVElGRl9FTkNPREVSKSAgICAgICAgICAgICs9IHRpZmZlbmMubyBybGUubyBsendlbmMubyB0aWZmX2RhdGEubwogT0JKUy0kKENPTkZJR19UTVZfREVDT0RFUikgICAgICAgICAgICAgKz0gdG12Lm8gY2dhX2RhdGEubwogT0JKUy0kKENPTkZJR19UUlVFSERfREVDT0RFUikgICAgICAgICAgKz0gbWxwZGVjLm8gbWxwZHNwLm8KK09CSlMtJChDT05GSUdfVFJVRUhEX0VOQ09ERVIpICAgICAgICAgICs9IG1scGVuYy5vIG1scC5vCiBPQkpTLSQoQ09ORklHX1RSVUVNT1RJT04xX0RFQ09ERVIpICAgICArPSB0cnVlbW90aW9uMS5vCiBPQkpTLSQoQ09ORklHX1RSVUVNT1RJT04yX0RFQ09ERVIpICAgICArPSB0cnVlbW90aW9uMi5vCitPQkpTLSQoQ09ORklHX1RSVUVNT1RJT04yUlRfREVDT0RFUikgICArPSB0cnVlbW90aW9uMnJ0Lm8KIE9CSlMtJChDT05GSUdfVFJVRVNQRUVDSF9ERUNPREVSKSAgICAgICs9IHRydWVzcGVlY2gubwogT0JKUy0kKENPTkZJR19UU0NDX0RFQ09ERVIpICAgICAgICAgICAgKz0gdHNjYy5vIG1zcmxlZGVjLm8KIE9CSlMtJChDT05GSUdfVFNDQzJfREVDT0RFUikgICAgICAgICAgICs9IHRzY2MyLm8KIE9CSlMtJChDT05GSUdfVFRBX0RFQ09ERVIpICAgICAgICAgICAgICs9IHR0YS5vIHR0YWRhdGEubyB0dGFkc3AubwotT0JKUy0kKENPTkZJR19UVEFfRU5DT0RFUikgICAgICAgICAgICAgKz0gdHRhZW5jLm8gdHRhZGF0YS5vCitPQkpTLSQoQ09ORklHX1RUQV9FTkNPREVSKSAgICAgICAgICAgICArPSB0dGFlbmMubyB0dGFlbmNkc3AubyB0dGFkYXRhLm8KIE9CSlMtJChDT05GSUdfVFdJTlZRX0RFQ09ERVIpICAgICAgICAgICs9IHR3aW52cWRlYy5vIHR3aW52cS5vCiBPQkpTLSQoQ09ORklHX1RYRF9ERUNPREVSKSAgICAgICAgICAgICArPSB0eGQubwogT0JKUy0kKENPTkZJR19VTFRJX0RFQ09ERVIpICAgICAgICAgICAgKz0gdWx0aS5vCi1PQkpTLSQoQ09ORklHX1VUVklERU9fREVDT0RFUikgICAgICAgICArPSB1dHZpZGVvZGVjLm8gdXR2aWRlby5vCitPQkpTLSQoQ09ORklHX1VUVklERU9fREVDT0RFUikgICAgICAgICArPSB1dHZpZGVvZGVjLm8gdXR2aWRlby5vIHV0dmlkZW9kc3AubwogT0JKUy0kKENPTkZJR19VVFZJREVPX0VOQ09ERVIpICAgICAgICAgKz0gdXR2aWRlb2VuYy5vIHV0dmlkZW8ubwogT0JKUy0kKENPTkZJR19WMjEwX0RFQ09ERVIpICAgICAgICAgICAgKz0gdjIxMGRlYy5vCiBPQkpTLSQoQ09ORklHX1YyMTBfRU5DT0RFUikgICAgICAgICAgICArPSB2MjEwZW5jLm8KK09CSlMtJChDT05GSUdfVjIxMFhfREVDT0RFUikgICAgICAgICAgICs9IHYyMTB4Lm8KIE9CSlMtJChDT05GSUdfVjMwOF9ERUNPREVSKSAgICAgICAgICAgICs9IHYzMDhkZWMubwogT0JKUy0kKENPTkZJR19WMzA4X0VOQ09ERVIpICAgICAgICAgICAgKz0gdjMwOGVuYy5vCiBPQkpTLSQoQ09ORklHX1Y0MDhfREVDT0RFUikgICAgICAgICAgICArPSB2NDA4ZGVjLm8KIE9CSlMtJChDT05GSUdfVjQwOF9FTkNPREVSKSAgICAgICAgICAgICs9IHY0MDhlbmMubwogT0JKUy0kKENPTkZJR19WNDEwX0RFQ09ERVIpICAgICAgICAgICAgKz0gdjQxMGRlYy5vCiBPQkpTLSQoQ09ORklHX1Y0MTBfRU5DT0RFUikgICAgICAgICAgICArPSB2NDEwZW5jLm8KLU9CSlMtJChDT05GSUdfVjIxMFhfREVDT0RFUikgICAgICAgICAgICs9IHYyMTB4Lm8KIE9CSlMtJChDT05GSUdfVkJfREVDT0RFUikgICAgICAgICAgICAgICs9IHZiLm8KIE9CSlMtJChDT05GSUdfVkJMRV9ERUNPREVSKSAgICAgICAgICAgICs9IHZibGUubwogT0JKUy0kKENPTkZJR19WQzFfREVDT0RFUikgICAgICAgICAgICAgKz0gdmMxZGVjLm8gdmMxX2Jsb2NrLm8gdmMxX2xvb3BmaWx0ZXIubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YzFfbWMubyB2YzFfcHJlZC5vIHZjMS5vIHZjMWRhdGEubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YzFkc3AubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc21wZWc0ZGVjLm8gbXNtcGVnNC5vIG1zbXBlZzRkYXRhLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd212MmRzcC5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bXYyZHNwLm8gd212MmRhdGEubworT0JKUy0kKENPTkZJR19WQzFfQ1VWSURfREVDT0RFUikgICAgICAgKz0gY3V2aWRkZWMubwogT0JKUy0kKENPTkZJR19WQzFfTU1BTF9ERUNPREVSKSAgICAgICAgKz0gbW1hbGRlYy5vCi1PQkpTLSQoQ09ORklHX1ZDMV9RU1ZfREVDT0RFUikgICAgICAgICArPSBxc3ZkZWNfdmMxLm8KK09CSlMtJChDT05GSUdfVkMxX1FTVl9ERUNPREVSKSAgICAgICAgICs9IHFzdmRlY19vdGhlci5vCitPQkpTLSQoQ09ORklHX1ZDMV9WNEwyTTJNX0RFQ09ERVIpICAgICArPSB2NGwyX20ybV9kZWMubwogT0JKUy0kKENPTkZJR19WQzJfRU5DT0RFUikgICAgICAgICAgICAgKz0gdmMyZW5jLm8gdmMyZW5jX2R3dC5vIGRpcmFjdGFiLm8KIE9CSlMtJChDT05GSUdfVkNSMV9ERUNPREVSKSAgICAgICAgICAgICs9IHZjcjEubwogT0JKUy0kKENPTkZJR19WTURBVURJT19ERUNPREVSKSAgICAgICAgKz0gdm1kYXVkaW8ubwpAQCAtNTU4LDkgKzY1MywyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA2ZHNwLm8gdnA1NnJhYy5vCiBPQkpTLSQoQ09ORklHX1ZQN19ERUNPREVSKSAgICAgICAgICAgICArPSB2cDgubyB2cDU2cmFjLm8KIE9CSlMtJChDT05GSUdfVlA4X0RFQ09ERVIpICAgICAgICAgICAgICs9IHZwOC5vIHZwNTZyYWMubwotT0JKUy0kKENPTkZJR19WUDlfREVDT0RFUikgICAgICAgICAgICAgKz0gdnA5Lm8gdnA5ZHNwLm8gdnA1NnJhYy5vIHZwOWRzcF84YnBwLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA5ZHNwXzEwYnBwLm8gdnA5ZHNwXzEyYnBwLm8KK09CSlMtJChDT05GSUdfVlA4X0NVVklEX0RFQ09ERVIpICAgICAgICs9IGN1dmlkZGVjLm8KK09CSlMtJChDT05GSUdfVlA4X01FRElBQ09ERUNfREVDT0RFUikgICs9IG1lZGlhY29kZWNkZWMubworT0JKUy0kKENPTkZJR19WUDhfUVNWX0RFQ09ERVIpICAgICAgICAgKz0gcXN2ZGVjX290aGVyLm8KK09CSlMtJChDT05GSUdfVlA4X1JLTVBQX0RFQ09ERVIpICAgICAgICs9IHJrbXBwZGVjLm8KK09CSlMtJChDT05GSUdfVlA4X1ZBQVBJX0VOQ09ERVIpICAgICAgICs9IHZhYXBpX2VuY29kZV92cDgubworT0JKUy0kKENPTkZJR19WUDhfVjRMMk0yTV9ERUNPREVSKSAgICAgKz0gdjRsMl9tMm1fZGVjLm8KK09CSlMtJChDT05GSUdfVlA4X1Y0TDJNMk1fRU5DT0RFUikgICAgICs9IHY0bDJfbTJtX2VuYy5vCitPQkpTLSQoQ09ORklHX1ZQOV9ERUNPREVSKSAgICAgICAgICAgICArPSB2cDkubyB2cDlkYXRhLm8gdnA5ZHNwLm8gdnA5bHBmLm8gdnA5cmVjb24ubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDlibG9jay5vIHZwOXByb2IubyB2cDltdnMubyB2cDU2cmFjLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA5ZHNwXzhicHAubyB2cDlkc3BfMTBicHAubyB2cDlkc3BfMTJicHAubworT0JKUy0kKENPTkZJR19WUDlfQ1VWSURfREVDT0RFUikgICAgICAgKz0gY3V2aWRkZWMubworT0JKUy0kKENPTkZJR19WUDlfTUVESUFDT0RFQ19ERUNPREVSKSAgKz0gbWVkaWFjb2RlY2RlYy5vCitPQkpTLSQoQ09ORklHX1ZQOV9SS01QUF9ERUNPREVSKSAgICAgICArPSBya21wcGRlYy5vCitPQkpTLSQoQ09ORklHX1ZQOV9WQUFQSV9FTkNPREVSKSAgICAgICArPSB2YWFwaV9lbmNvZGVfdnA5Lm8KIE9CSlMtJChDT05GSUdfVlBMQVlFUl9ERUNPREVSKSAgICAgICAgICs9IHRleHRkZWMubyBhc3MubworT0JKUy0kKENPTkZJR19WUDlfVjRMMk0yTV9ERUNPREVSKSAgICAgKz0gdjRsMl9tMm1fZGVjLm8KIE9CSlMtJChDT05GSUdfVlFBX0RFQ09ERVIpICAgICAgICAgICAgICs9IHZxYXZpZGVvLm8KIE9CSlMtJChDT05GSUdfV0FWUEFDS19ERUNPREVSKSAgICAgICAgICs9IHdhdnBhY2subwogT0JKUy0kKENPTkZJR19XQVZQQUNLX0VOQ09ERVIpICAgICAgICAgKz0gd2F2cGFja2VuYy5vCkBAIC01NzgsMTMgKzY4NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNlbHBfdmVjdG9ycy5vIGFjZWxwX2ZpbHRlcnMubwogT0JKUy0kKENPTkZJR19XTVYxX0RFQ09ERVIpICAgICAgICAgICAgKz0gbXNtcGVnNGRlYy5vIG1zbXBlZzQubyBtc21wZWc0ZGF0YS5vCiBPQkpTLSQoQ09ORklHX1dNVjFfRU5DT0RFUikgICAgICAgICAgICArPSBtc21wZWc0ZW5jLm8KLU9CSlMtJChDT05GSUdfV01WMl9ERUNPREVSKSAgICAgICAgICAgICs9IHdtdjJkZWMubyB3bXYyLm8gXAorT0JKUy0kKENPTkZJR19XTVYyX0RFQ09ERVIpICAgICAgICAgICAgKz0gd212MmRlYy5vIHdtdjIubyB3bXYyZGF0YS5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zbXBlZzRkZWMubyBtc21wZWc0Lm8gbXNtcGVnNGRhdGEubwotT0JKUy0kKENPTkZJR19XTVYyX0VOQ09ERVIpICAgICAgICAgICAgKz0gd212MmVuYy5vIHdtdjIubyBcCitPQkpTLSQoQ09ORklHX1dNVjJfRU5DT0RFUikgICAgICAgICAgICArPSB3bXYyZW5jLm8gd212Mi5vIHdtdjJkYXRhLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNtcGVnNC5vIG1zbXBlZzRlbmMubyBtc21wZWc0ZGF0YS5vCiBPQkpTLSQoQ09ORklHX1dOVjFfREVDT0RFUikgICAgICAgICAgICArPSB3bnYxLm8KLU9CSlMtJChDT05GSUdfV1NfU05EMV9ERUNPREVSKSAgICAgICAgICs9IHdzLXNuZDEubworT0JKUy0kKENPTkZJR19XUkFQUEVEX0FWRlJBTUVfREVDT0RFUikgKz0gd3JhcHBlZF9hdmZyYW1lLm8KIE9CSlMtJChDT05GSUdfV1JBUFBFRF9BVkZSQU1FX0VOQ09ERVIpICs9IHdyYXBwZWRfYXZmcmFtZS5vCitPQkpTLSQoQ09ORklHX1dTX1NORDFfREVDT0RFUikgICAgICAgICArPSB3cy1zbmQxLm8KIE9CSlMtJChDT05GSUdfWEFOX0RQQ01fREVDT0RFUikgICAgICAgICs9IGRwY20ubwogT0JKUy0kKENPTkZJR19YQU5fV0MzX0RFQ09ERVIpICAgICAgICAgKz0geGFuLm8KIE9CSlMtJChDT05GSUdfWEFOX1dDNF9ERUNPREVSKSAgICAgICAgICs9IHh4YW4ubwpAQCAtNTk2LDEyICs3MDUsMTQgQEAKIE9CSlMtJChDT05GSUdfWExfREVDT0RFUikgICAgICAgICAgICAgICs9IHhsLm8KIE9CSlMtJChDT05GSUdfWE1BMV9ERUNPREVSKSAgICAgICAgICAgICs9IHdtYXByb2RlYy5vIHdtYS5vIHdtYV9jb21tb24ubwogT0JKUy0kKENPTkZJR19YTUEyX0RFQ09ERVIpICAgICAgICAgICAgKz0gd21hcHJvZGVjLm8gd21hLm8gd21hX2NvbW1vbi5vCitPQkpTLSQoQ09ORklHX1hQTV9ERUNPREVSKSAgICAgICAgICAgICArPSB4cG1kZWMubwogT0JKUy0kKENPTkZJR19YU1VCX0RFQ09ERVIpICAgICAgICAgICAgKz0geHN1YmRlYy5vCiBPQkpTLSQoQ09ORklHX1hTVUJfRU5DT0RFUikgICAgICAgICAgICArPSB4c3ViZW5jLm8KIE9CSlMtJChDT05GSUdfWFdEX0RFQ09ERVIpICAgICAgICAgICAgICs9IHh3ZGRlYy5vCiBPQkpTLSQoQ09ORklHX1hXRF9FTkNPREVSKSAgICAgICAgICAgICArPSB4d2RlbmMubwogT0JKUy0kKENPTkZJR19ZNDFQX0RFQ09ERVIpICAgICAgICAgICAgKz0geTQxcGRlYy5vCiBPQkpTLSQoQ09ORklHX1k0MVBfRU5DT0RFUikgICAgICAgICAgICArPSB5NDFwZW5jLm8KK09CSlMtJChDT05GSUdfWUxDX0RFQ09ERVIpICAgICAgICAgICAgICs9IHlsYy5vCiBPQkpTLSQoQ09ORklHX1lPUF9ERUNPREVSKSAgICAgICAgICAgICArPSB5b3AubwogT0JKUy0kKENPTkZJR19ZVVY0X0RFQ09ERVIpICAgICAgICAgICAgKz0geXV2NGRlYy5vCiBPQkpTLSQoQ09ORklHX1lVVjRfRU5DT0RFUikgICAgICAgICAgICArPSB5dXY0ZW5jLm8KQEAgLTYxNiw2ICs3MjcsOCBAQAogT0JKUy0kKENPTkZJR19QQ01fQUxBV19FTkNPREVSKSAgICAgICAgICAgKz0gcGNtLm8KIE9CSlMtJChDT05GSUdfUENNX0JMVVJBWV9ERUNPREVSKSAgICAgICAgICs9IHBjbS1ibHVyYXkubwogT0JKUy0kKENPTkZJR19QQ01fRFZEX0RFQ09ERVIpICAgICAgICAgICAgKz0gcGNtLWR2ZC5vCitPQkpTLSQoQ09ORklHX1BDTV9GMTZMRV9ERUNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fRjI0TEVfREVDT0RFUikgICAgICAgICAgKz0gcGNtLm8KIE9CSlMtJChDT05GSUdfUENNX0YzMkJFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCiBPQkpTLSQoQ09ORklHX1BDTV9GMzJCRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubwogT0JKUy0kKENPTkZJR19QQ01fRjMyTEVfREVDT0RFUikgICAgICAgICAgKz0gcGNtLm8KQEAgLTY1Myw2ICs3NjYsMTAgQEAKIE9CSlMtJChDT05GSUdfUENNX1MzMkxFX0VOQ09ERVIpICAgICAgICAgICs9IHBjbS5vCiBPQkpTLSQoQ09ORklHX1BDTV9TMzJMRV9QTEFOQVJfREVDT0RFUikgICArPSBwY20ubwogT0JKUy0kKENPTkZJR19QQ01fUzMyTEVfUExBTkFSX0VOQ09ERVIpICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1M2NEJFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCitPQkpTLSQoQ09ORklHX1BDTV9TNjRCRV9FTkNPREVSKSAgICAgICAgICArPSBwY20ubworT0JKUy0kKENPTkZJR19QQ01fUzY0TEVfREVDT0RFUikgICAgICAgICAgKz0gcGNtLm8KK09CSlMtJChDT05GSUdfUENNX1M2NExFX0VOQ09ERVIpICAgICAgICAgICs9IHBjbS5vCiBPQkpTLSQoQ09ORklHX1BDTV9VOF9ERUNPREVSKSAgICAgICAgICAgICArPSBwY20ubwogT0JKUy0kKENPTkZJR19QQ01fVThfRU5DT0RFUikgICAgICAgICAgICAgKz0gcGNtLm8KIE9CSlMtJChDT05GSUdfUENNX1UxNkJFX0RFQ09ERVIpICAgICAgICAgICs9IHBjbS5vCkBAIC02ODcsOCArODA0LDEwIEBACiBPQkpTLSQoQ09ORklHX0FEUENNX0c3MjZfREVDT0RFUikgICAgICAgICArPSBnNzI2Lm8KIE9CSlMtJChDT05GSUdfQURQQ01fRzcyNl9FTkNPREVSKSAgICAgICAgICs9IGc3MjYubwogT0JKUy0kKENPTkZJR19BRFBDTV9HNzI2TEVfREVDT0RFUikgICAgICAgKz0gZzcyNi5vCitPQkpTLSQoQ09ORklHX0FEUENNX0c3MjZMRV9FTkNPREVSKSAgICAgICArPSBnNzI2Lm8KIE9CSlMtJChDT05GSUdfQURQQ01fSU1BX0FNVl9ERUNPREVSKSAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCiBPQkpTLSQoQ09ORklHX0FEUENNX0lNQV9BUENfREVDT0RFUikgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9JTUFfREFUNF9ERUNPREVSKSAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KIE9CSlMtJChDT05GSUdfQURQQ01fSU1BX0RLM19ERUNPREVSKSAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCiBPQkpTLSQoQ09ORklHX0FEUENNX0lNQV9ESzRfREVDT0RFUikgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubwogT0JKUy0kKENPTkZJR19BRFBDTV9JTUFfRUFfRUFDU19ERUNPREVSKSAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KQEAgLTcwNCw2ICs4MjMsNyBAQAogT0JKUy0kKENPTkZJR19BRFBDTV9JTUFfV1NfREVDT0RFUikgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KIE9CSlMtJChDT05GSUdfQURQQ01fTVNfREVDT0RFUikgICAgICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCiBPQkpTLSQoQ09ORklHX0FEUENNX01TX0VOQ09ERVIpICAgICAgICAgICArPSBhZHBjbWVuYy5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9NVEFGX0RFQ09ERVIpICAgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KIE9CSlMtJChDT05GSUdfQURQQ01fUFNYX0RFQ09ERVIpICAgICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCiBPQkpTLSQoQ09ORklHX0FEUENNX1NCUFJPXzJfREVDT0RFUikgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubwogT0JKUy0kKENPTkZJR19BRFBDTV9TQlBST18zX0RFQ09ERVIpICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KQEAgLTcxMSw2ICs4MzEsNyBAQAogT0JKUy0kKENPTkZJR19BRFBDTV9TV0ZfREVDT0RFUikgICAgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KIE9CSlMtJChDT05GSUdfQURQQ01fU1dGX0VOQ09ERVIpICAgICAgICAgICs9IGFkcGNtZW5jLm8gYWRwY21fZGF0YS5vCiBPQkpTLSQoQ09ORklHX0FEUENNX1RIUF9ERUNPREVSKSAgICAgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubworT0JKUy0kKENPTkZJR19BRFBDTV9USFBfTEVfREVDT0RFUikgICAgICAgKz0gYWRwY20ubyBhZHBjbV9kYXRhLm8KIE9CSlMtJChDT05GSUdfQURQQ01fVklNQV9ERUNPREVSKSAgICAgICAgICs9IHZpbWEubyBhZHBjbV9kYXRhLm8KIE9CSlMtJChDT05GSUdfQURQQ01fWEFfREVDT0RFUikgICAgICAgICAgICs9IGFkcGNtLm8gYWRwY21fZGF0YS5vCiBPQkpTLSQoQ09ORklHX0FEUENNX1lBTUFIQV9ERUNPREVSKSAgICAgICArPSBhZHBjbS5vIGFkcGNtX2RhdGEubwpAQCAtNzE5LDggKzg0MCw4IEBACiAjIGhhcmR3YXJlIGFjY2VsZXJhdG9ycwogT0JKUy0kKENPTkZJR19EM0QxMVZBKSAgICAgICAgICAgICAgICAgICAgKz0gZHh2YTIubwogT0JKUy0kKENPTkZJR19EWFZBMikgICAgICAgICAgICAgICAgICAgICAgKz0gZHh2YTIubwotT0JKUy0kKENPTkZJR19WQUFQSSkgICAgICAgICAgICAgICAgICAgICAgKz0gdmFhcGkubwotT0JKUy0kKENPTkZJR19WREEpICAgICAgICAgICAgICAgICAgICAgICAgKz0gdmRhLm8gdmlkZW90b29sYm94Lm8KK09CSlMtJChDT05GSUdfTlZERUMpICAgICAgICAgICAgICAgICAgICAgICs9IG52ZGVjLm8KK09CSlMtJChDT05GSUdfVkFBUEkpICAgICAgICAgICAgICAgICAgICAgICs9IHZhYXBpX2RlY29kZS5vCiBPQkpTLSQoQ09ORklHX1ZJREVPVE9PTEJPWCkgICAgICAgICAgICAgICArPSB2aWRlb3Rvb2xib3gubwogT0JKUy0kKENPTkZJR19WRFBBVSkgICAgICAgICAgICAgICAgICAgICAgKz0gdmRwYXUubwogCkBAIC03MjgsODEgKzg0OSwxMDEgQEAKIE9CSlMtJChDT05GSUdfSDI2M19WSURFT1RPT0xCT1hfSFdBQ0NFTCkgICs9IHZpZGVvdG9vbGJveC5vCiBPQkpTLSQoQ09ORklHX0gyNjRfRDNEMTFWQV9IV0FDQ0VMKSAgICAgICArPSBkeHZhMl9oMjY0Lm8KIE9CSlMtJChDT05GSUdfSDI2NF9EWFZBMl9IV0FDQ0VMKSAgICAgICAgICs9IGR4dmEyX2gyNjQubworT0JKUy0kKENPTkZJR19IMjY0X05WREVDX0hXQUNDRUwpICAgICAgICAgKz0gbnZkZWNfaDI2NC5vCitPQkpTLSQoQ09ORklHX0gyNjRfUVNWX0hXQUNDRUwpICAgICAgICAgICArPSBxc3ZkZWNfaDI2NDUubwogT0JKUy0kKENPTkZJR19IMjY0X1ZBQVBJX0hXQUNDRUwpICAgICAgICAgKz0gdmFhcGlfaDI2NC5vCi1PQkpTLSQoQ09ORklHX0gyNjRfVkRBX0hXQUNDRUwpICAgICAgICAgICArPSB2ZGFfaDI2NC5vCiBPQkpTLSQoQ09ORklHX0gyNjRfVkRQQVVfSFdBQ0NFTCkgICAgICAgICArPSB2ZHBhdV9oMjY0Lm8KIE9CSlMtJChDT05GSUdfSDI2NF9WSURFT1RPT0xCT1hfSFdBQ0NFTCkgICs9IHZpZGVvdG9vbGJveC5vCiBPQkpTLSQoQ09ORklHX0hFVkNfRDNEMTFWQV9IV0FDQ0VMKSAgICAgICArPSBkeHZhMl9oZXZjLm8KIE9CSlMtJChDT05GSUdfSEVWQ19EWFZBMl9IV0FDQ0VMKSAgICAgICAgICs9IGR4dmEyX2hldmMubworT0JKUy0kKENPTkZJR19IRVZDX05WREVDX0hXQUNDRUwpICAgICAgICAgKz0gbnZkZWNfaGV2Yy5vCitPQkpTLSQoQ09ORklHX0hFVkNfUVNWX0hXQUNDRUwpICAgICAgICAgICArPSBxc3ZkZWNfaDI2NDUubwogT0JKUy0kKENPTkZJR19IRVZDX1ZBQVBJX0hXQUNDRUwpICAgICAgICAgKz0gdmFhcGlfaGV2Yy5vCiBPQkpTLSQoQ09ORklHX0hFVkNfVkRQQVVfSFdBQ0NFTCkgICAgICAgICArPSB2ZHBhdV9oZXZjLm8KK09CSlMtJChDT05GSUdfTUpQRUdfTlZERUNfSFdBQ0NFTCkgICAgICAgICs9IG52ZGVjX21qcGVnLm8KK09CSlMtJChDT05GSUdfTUpQRUdfVkFBUElfSFdBQ0NFTCkgICAgICAgICs9IHZhYXBpX21qcGVnLm8KK09CSlMtJChDT05GSUdfTVBFRzFfTlZERUNfSFdBQ0NFTCkgICAgICAgICs9IG52ZGVjX21wZWcxMi5vCiBPQkpTLSQoQ09ORklHX01QRUcxX1ZEUEFVX0hXQUNDRUwpICAgICAgICArPSB2ZHBhdV9tcGVnMTIubwogT0JKUy0kKENPTkZJR19NUEVHMV9WSURFT1RPT0xCT1hfSFdBQ0NFTCkgKz0gdmlkZW90b29sYm94Lm8KIE9CSlMtJChDT05GSUdfTVBFRzFfWFZNQ19IV0FDQ0VMKSAgICAgICAgICs9IG1wZWd2aWRlb194dm1jLm8KIE9CSlMtJChDT05GSUdfTVBFRzJfRDNEMTFWQV9IV0FDQ0VMKSAgICAgICs9IGR4dmEyX21wZWcyLm8KIE9CSlMtJChDT05GSUdfTVBFRzJfRFhWQTJfSFdBQ0NFTCkgICAgICAgICs9IGR4dmEyX21wZWcyLm8KK09CSlMtJChDT05GSUdfTVBFRzJfTlZERUNfSFdBQ0NFTCkgICAgICAgICs9IG52ZGVjX21wZWcxMi5vCitPQkpTLSQoQ09ORklHX01QRUcyX1FTVl9IV0FDQ0VMKSAgICAgICAgICArPSBxc3ZkZWNfb3RoZXIubwogT0JKUy0kKENPTkZJR19NUEVHMl9WQUFQSV9IV0FDQ0VMKSAgICAgICAgKz0gdmFhcGlfbXBlZzIubwogT0JKUy0kKENPTkZJR19NUEVHMl9WRFBBVV9IV0FDQ0VMKSAgICAgICAgKz0gdmRwYXVfbXBlZzEyLm8KIE9CSlMtJChDT05GSUdfTVBFRzJfVklERU9UT09MQk9YX0hXQUNDRUwpICs9IHZpZGVvdG9vbGJveC5vCiBPQkpTLSQoQ09ORklHX01QRUcyX1hWTUNfSFdBQ0NFTCkgICAgICAgICArPSBtcGVndmlkZW9feHZtYy5vCitPQkpTLSQoQ09ORklHX01QRUc0X05WREVDX0hXQUNDRUwpICAgICAgICArPSBudmRlY19tcGVnNC5vCiBPQkpTLSQoQ09ORklHX01QRUc0X1ZBQVBJX0hXQUNDRUwpICAgICAgICArPSB2YWFwaV9tcGVnNC5vCiBPQkpTLSQoQ09ORklHX01QRUc0X1ZEUEFVX0hXQUNDRUwpICAgICAgICArPSB2ZHBhdV9tcGVnNC5vCiBPQkpTLSQoQ09ORklHX01QRUc0X1ZJREVPVE9PTEJPWF9IV0FDQ0VMKSArPSB2aWRlb3Rvb2xib3gubwogT0JKUy0kKENPTkZJR19WQzFfRDNEMTFWQV9IV0FDQ0VMKSAgICAgICAgKz0gZHh2YTJfdmMxLm8KIE9CSlMtJChDT05GSUdfVkMxX0RYVkEyX0hXQUNDRUwpICAgICAgICAgICs9IGR4dmEyX3ZjMS5vCitPQkpTLSQoQ09ORklHX1ZDMV9OVkRFQ19IV0FDQ0VMKSAgICAgICAgICArPSBudmRlY192YzEubworT0JKUy0kKENPTkZJR19WQzFfUVNWX0hXQUNDRUwpICAgICAgICAgICAgKz0gcXN2ZGVjX290aGVyLm8KIE9CSlMtJChDT05GSUdfVkMxX1ZBQVBJX0hXQUNDRUwpICAgICAgICAgICs9IHZhYXBpX3ZjMS5vCiBPQkpTLSQoQ09ORklHX1ZDMV9WRFBBVV9IV0FDQ0VMKSAgICAgICAgICArPSB2ZHBhdV92YzEubworT0JKUy0kKENPTkZJR19WUDhfTlZERUNfSFdBQ0NFTCkgICAgICAgICAgKz0gbnZkZWNfdnA4Lm8KK09CSlMtJChDT05GSUdfVlA4X1ZBQVBJX0hXQUNDRUwpICAgICAgICAgICs9IHZhYXBpX3ZwOC5vCiBPQkpTLSQoQ09ORklHX1ZQOV9EM0QxMVZBX0hXQUNDRUwpICAgICAgICArPSBkeHZhMl92cDkubwogT0JKUy0kKENPTkZJR19WUDlfRFhWQTJfSFdBQ0NFTCkgICAgICAgICAgKz0gZHh2YTJfdnA5Lm8KK09CSlMtJChDT05GSUdfVlA5X05WREVDX0hXQUNDRUwpICAgICAgICAgICs9IG52ZGVjX3ZwOS5vCiBPQkpTLSQoQ09ORklHX1ZQOV9WQUFQSV9IV0FDQ0VMKSAgICAgICAgICArPSB2YWFwaV92cDkubworT0JKUy0kKENPTkZJR19WUDhfUVNWX0hXQUNDRUwpICAgICAgICAgICAgKz0gcXN2ZGVjX290aGVyLm8KIAogIyBsaWJhdmZvcm1hdCBkZXBlbmRlbmNpZXMKK09CSlMtJChDT05GSUdfSVNPX01FRElBKSAgICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubyBtcGVnYXVkaW9kYXRhLm8KKwogT0JKUy0kKENPTkZJR19BRFRTX01VWEVSKSAgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vCi1PQkpTLSQoQ09ORklHX0FWSV9ERU1VWEVSKSAgICAgICAgICAgICArPSBtcGVnNGF1ZGlvLm8gbXBlZ2F1ZGlvZGF0YS5vCi1PQkpTLSQoQ09ORklHX0NBRl9ERU1VWEVSKSAgICAgICAgICAgICArPSBtcGVnNGF1ZGlvLm8gbXBlZ2F1ZGlvZGF0YS5vICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYzN0YWIubwotT0JKUy0kKENPTkZJR19GTEFDX0RFTVVYRVIpICAgICAgICAgICAgKz0gZmxhYy5vIGZsYWNkYXRhLm8gdm9yYmlzX2RhdGEubwotT0JKUy0kKENPTkZJR19GTEFDX01VWEVSKSAgICAgICAgICAgICAgKz0gZmxhYy5vIGZsYWNkYXRhLm8gdm9yYmlzX2RhdGEubworT0JKUy0kKENPTkZJR19DQUZfREVNVVhFUikgICAgICAgICAgICAgKz0gYWMzdGFiLm8KK09CSlMtJChDT05GSUdfQ09ERUMyX0RFTVVYRVIpICAgICAgICAgICs9IGNvZGVjMnV0aWxzLm8KK09CSlMtJChDT05GSUdfQ09ERUMyX01VWEVSKSAgICAgICAgICAgICs9IGNvZGVjMnV0aWxzLm8KK09CSlMtJChDT05GSUdfQ09ERUMyUkFXX0RFTVVYRVIpICAgICAgICs9IGNvZGVjMnV0aWxzLm8KK09CSlMtJChDT05GSUdfRE5YSERfREVNVVhFUikgICAgICAgICAgICs9IGRueGhkZGF0YS5vCitPQkpTLSQoQ09ORklHX0ZJVFNfREVNVVhFUikgICAgICAgICAgICArPSBmaXRzLm8KIE9CSlMtJChDT05GSUdfRkxWX0RFTVVYRVIpICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubwotT0JKUy0kKENPTkZJR19HWEZfREVNVVhFUikgICAgICAgICAgICAgKz0gbXBlZzEyZGF0YS5vCi1PQkpTLSQoQ09ORklHX0lGRl9ERU1VWEVSKSAgICAgICAgICAgICArPSBpZmYubwotT0JKUy0kKENPTkZJR19JU01WX01VWEVSKSAgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vIG1wZWdhdWRpb2RhdGEubwogT0JKUy0kKENPTkZJR19MQVRNX01VWEVSKSAgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vCi1PQkpTLSQoQ09ORklHX01BVFJPU0tBX0FVRElPX01VWEVSKSAgICArPSBtcGVnNGF1ZGlvLm8gdm9yYmlzX2RhdGEubyAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFjLm8gZmxhY2RhdGEubwotT0JKUy0kKENPTkZJR19NQVRST1NLQV9ERU1VWEVSKSAgICAgICAgKz0gbXBlZzRhdWRpby5vIG1wZWdhdWRpb2RhdGEubwotT0JKUy0kKENPTkZJR19NQVRST1NLQV9NVVhFUikgICAgICAgICAgKz0gbXBlZzRhdWRpby5vIG1wZWdhdWRpb2RhdGEubyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhYy5vIGZsYWNkYXRhLm8gdm9yYmlzX2RhdGEubwotT0JKUy0kKENPTkZJR19NUDJfTVVYRVIpICAgICAgICAgICAgICAgKz0gbXBlZ2F1ZGlvZGF0YS5vIG1wZWdhdWRpb2RlY2hlYWRlci5vCi1PQkpTLSQoQ09ORklHX01QM19NVVhFUikgICAgICAgICAgICAgICArPSBtcGVnYXVkaW9kYXRhLm8gbXBlZ2F1ZGlvZGVjaGVhZGVyLm8KLU9CSlMtJChDT05GSUdfTU9WX0RFTVVYRVIpICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubyBtcGVnYXVkaW9kYXRhLm8gYWMzdGFiLm8KLU9CSlMtJChDT05GSUdfTU9WX01VWEVSKSAgICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubyBtcGVnYXVkaW9kYXRhLm8KLU9CSlMtJChDT05GSUdfTVBFR1RTX01VWEVSKSAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubwotT0JKUy0kKENPTkZJR19NUEVHVFNfREVNVVhFUikgICAgICAgICAgKz0gbXBlZzRhdWRpby5vIG1wZWdhdWRpb2RhdGEubworT0JKUy0kKENPTkZJR19NQVRST1NLQV9BVURJT19NVVhFUikgICAgKz0gbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX01BVFJPU0tBX01VWEVSKSAgICAgICAgICArPSBtcGVnNGF1ZGlvLm8KK09CSlMtJChDT05GSUdfTU9WX0RFTVVYRVIpICAgICAgICAgICAgICs9IGFjM3RhYi5vCiBPQkpTLSQoQ09ORklHX01YRl9NVVhFUikgICAgICAgICAgICAgICArPSBkbnhoZGRhdGEubwogT0JKUy0kKENPTkZJR19OVVRfTVVYRVIpICAgICAgICAgICAgICAgKz0gbXBlZ2F1ZGlvZGF0YS5vCiBPQkpTLSQoQ09ORklHX05VVF9ERU1VWEVSKSAgICAgICAgICAgICArPSBtcGVnYXVkaW9kYXRhLm8gbXBlZzRhdWRpby5vCi1PQkpTLSQoQ09ORklHX09HQV9NVVhFUikgICAgICAgICAgICAgICArPSBmbGFjLm8gZmxhY2RhdGEubwotT0JKUy0kKENPTkZJR19PR0dfREVNVVhFUikgICAgICAgICAgICAgKz0gbXBlZzEyZGF0YS5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmFjLm8gdm9yYmlzX2RhdGEubwotT0JKUy0kKENPTkZJR19PR0dfTVVYRVIpICAgICAgICAgICAgICAgKz0gZmxhYy5vIGZsYWNkYXRhLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2RhdGEubwogT0JKUy0kKENPTkZJR19SVFBfTVVYRVIpICAgICAgICAgICAgICAgKz0gbXBlZzRhdWRpby5vCi1PQkpTLSQoQ09ORklHX1NQRElGX0RFTVVYRVIpICAgICAgICAgICArPSBhYWNhZHRzZGVjLm8gbXBlZzRhdWRpby5vCiBPQkpTLSQoQ09ORklHX1NQRElGX01VWEVSKSAgICAgICAgICAgICArPSBkY2EubwogT0JKUy0kKENPTkZJR19UQUtfREVNVVhFUikgICAgICAgICAgICAgKz0gdGFrLm8KLU9CSlMtJChDT05GSUdfV0VCTV9NVVhFUikgICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubyBtcGVnYXVkaW9kYXRhLm8gIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWMubyBmbGFjZGF0YS5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19kYXRhLm8KLU9CSlMtJChDT05GSUdfV1RWX0RFTVVYRVIpICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubyBtcGVnYXVkaW9kYXRhLm8KK09CSlMtJChDT05GSUdfV0VCTV9NVVhFUikgICAgICAgICAgICAgICs9IG1wZWc0YXVkaW8ubwogCiAjIGxpYmF2ZmlsdGVyIGRlcGVuZGVuY2llcwogT0JKUy0kKENPTkZJR19FTEJHX0ZJTFRFUikgICAgICAgICAgICAgKz0gZWxiZy5vCiAKICMgZXh0ZXJuYWwgY29kZWMgbGlicmFyaWVzCitPQkpTLSQoQ09ORklHX0FBQ19BVF9ERUNPREVSKSAgICAgICAgICAgICArPSBhdWRpb3Rvb2xib3hkZWMubworT0JKUy0kKENPTkZJR19BQzNfQVRfREVDT0RFUikgICAgICAgICAgICAgKz0gYXVkaW90b29sYm94ZGVjLm8KK09CSlMtJChDT05GSUdfQURQQ01fSU1BX1FUX0FUX0RFQ09ERVIpICAgICs9IGF1ZGlvdG9vbGJveGRlYy5vCitPQkpTLSQoQ09ORklHX0FMQUNfQVRfREVDT0RFUikgICAgICAgICAgICArPSBhdWRpb3Rvb2xib3hkZWMubworT0JKUy0kKENPTkZJR19BTVJfTkJfQVRfREVDT0RFUikgICAgICAgICAgKz0gYXVkaW90b29sYm94ZGVjLm8KK09CSlMtJChDT05GSUdfRUFDM19BVF9ERUNPREVSKSAgICAgICAgICAgICs9IGF1ZGlvdG9vbGJveGRlYy5vCitPQkpTLSQoQ09ORklHX0dTTV9NU19BVF9ERUNPREVSKSAgICAgICAgICArPSBhdWRpb3Rvb2xib3hkZWMubworT0JKUy0kKENPTkZJR19JTEJDX0FUX0RFQ09ERVIpICAgICAgICAgICAgKz0gYXVkaW90b29sYm94ZGVjLm8KK09CSlMtJChDT05GSUdfTVAxX0FUX0RFQ09ERVIpICAgICAgICAgICAgICs9IGF1ZGlvdG9vbGJveGRlYy5vCitPQkpTLSQoQ09ORklHX01QMl9BVF9ERUNPREVSKSAgICAgICAgICAgICArPSBhdWRpb3Rvb2xib3hkZWMubworT0JKUy0kKENPTkZJR19NUDNfQVRfREVDT0RFUikgICAgICAgICAgICAgKz0gYXVkaW90b29sYm94ZGVjLm8KK09CSlMtJChDT05GSUdfUENNX01VTEFXX0FUX0RFQ09ERVIpICAgICAgICs9IGF1ZGlvdG9vbGJveGRlYy5vCitPQkpTLSQoQ09ORklHX1BDTV9BTEFXX0FUX0RFQ09ERVIpICAgICAgICArPSBhdWRpb3Rvb2xib3hkZWMubworT0JKUy0kKENPTkZJR19RRE1DX0FUX0RFQ09ERVIpICAgICAgICAgICAgKz0gYXVkaW90b29sYm94ZGVjLm8KK09CSlMtJChDT05GSUdfUURNMl9BVF9ERUNPREVSKSAgICAgICAgICAgICs9IGF1ZGlvdG9vbGJveGRlYy5vCitPQkpTLSQoQ09ORklHX0FBQ19BVF9FTkNPREVSKSAgICAgICAgICAgICArPSBhdWRpb3Rvb2xib3hlbmMubworT0JKUy0kKENPTkZJR19BTEFDX0FUX0VOQ09ERVIpICAgICAgICAgICAgKz0gYXVkaW90b29sYm94ZW5jLm8KK09CSlMtJChDT05GSUdfSUxCQ19BVF9FTkNPREVSKSAgICAgICAgICAgICs9IGF1ZGlvdG9vbGJveGVuYy5vCitPQkpTLSQoQ09ORklHX1BDTV9BTEFXX0FUX0VOQ09ERVIpICAgICAgICArPSBhdWRpb3Rvb2xib3hlbmMubworT0JKUy0kKENPTkZJR19QQ01fTVVMQVdfQVRfRU5DT0RFUikgICAgICAgKz0gYXVkaW90b29sYm94ZW5jLm8KK09CSlMtJChDT05GSUdfTElCQU9NX0FWMV9ERUNPREVSKSAgICAgICAgICs9IGxpYmFvbWRlYy5vCitPQkpTLSQoQ09ORklHX0xJQkFPTV9BVjFfRU5DT0RFUikgICAgICAgICArPSBsaWJhb21lbmMubwogT0JKUy0kKENPTkZJR19MSUJDRUxUX0RFQ09ERVIpICAgICAgICAgICAgKz0gbGliY2VsdF9kZWMubwotT0JKUy0kKENPTkZJR19MSUJEQ0FERUNfREVDT0RFUikgICAgICAgICAgKz0gbGliZGNhZGVjLm8gZGNhLm8KLU9CSlMtJChDT05GSUdfTElCRkFBQ19FTkNPREVSKSAgICAgICAgICAgICs9IGxpYmZhYWMubworT0JKUy0kKENPTkZJR19MSUJDT0RFQzJfREVDT0RFUikgICAgICAgICAgKz0gbGliY29kZWMyLm8gY29kZWMydXRpbHMubworT0JKUy0kKENPTkZJR19MSUJDT0RFQzJfRU5DT0RFUikgICAgICAgICAgKz0gbGliY29kZWMyLm8gY29kZWMydXRpbHMubwogT0JKUy0kKENPTkZJR19MSUJGREtfQUFDX0RFQ09ERVIpICAgICAgICAgKz0gbGliZmRrLWFhY2RlYy5vCiBPQkpTLSQoQ09ORklHX0xJQkZES19BQUNfRU5DT0RFUikgICAgICAgICArPSBsaWJmZGstYWFjZW5jLm8KIE9CSlMtJChDT05GSUdfTElCR1NNX0RFQ09ERVIpICAgICAgICAgICAgICs9IGxpYmdzbWRlYy5vCkBAIC04MTIsMjggKzk1MywyMyBAQAogT0JKUy0kKENPTkZJR19MSUJJTEJDX0RFQ09ERVIpICAgICAgICAgICAgKz0gbGliaWxiYy5vCiBPQkpTLSQoQ09ORklHX0xJQklMQkNfRU5DT0RFUikgICAgICAgICAgICArPSBsaWJpbGJjLm8KIE9CSlMtJChDT05GSUdfTElCS1ZBWkFBUl9FTkNPREVSKSAgICAgICAgICs9IGxpYmt2YXphYXIubwotT0JKUy0kKENPTkZJR19MSUJNUDNMQU1FX0VOQ09ERVIpICAgICAgICAgKz0gbGlibXAzbGFtZS5vIG1wZWdhdWRpb2RlY2hlYWRlci5vCitPQkpTLSQoQ09ORklHX0xJQk1QM0xBTUVfRU5DT0RFUikgICAgICAgICArPSBsaWJtcDNsYW1lLm8KIE9CSlMtJChDT05GSUdfTElCT1BFTkNPUkVfQU1STkJfREVDT0RFUikgICs9IGxpYm9wZW5jb3JlLWFtci5vCiBPQkpTLSQoQ09ORklHX0xJQk9QRU5DT1JFX0FNUk5CX0VOQ09ERVIpICArPSBsaWJvcGVuY29yZS1hbXIubwogT0JKUy0kKENPTkZJR19MSUJPUEVOQ09SRV9BTVJXQl9ERUNPREVSKSAgKz0gbGlib3BlbmNvcmUtYW1yLm8KLU9CSlMtJChDT05GSUdfTElCT1BFTkgyNjRfRU5DT0RFUikgICAgICAgICs9IGxpYm9wZW5oMjY0ZW5jLm8KK09CSlMtJChDT05GSUdfTElCT1BFTkgyNjRfREVDT0RFUikgICAgICAgICs9IGxpYm9wZW5oMjY0ZGVjLm8gbGlib3BlbmgyNjQubworT0JKUy0kKENPTkZJR19MSUJPUEVOSDI2NF9FTkNPREVSKSAgICAgICAgKz0gbGlib3BlbmgyNjRlbmMubyBsaWJvcGVuaDI2NC5vCiBPQkpTLSQoQ09ORklHX0xJQk9QRU5KUEVHX0RFQ09ERVIpICAgICAgICArPSBsaWJvcGVuanBlZ2RlYy5vCiBPQkpTLSQoQ09ORklHX0xJQk9QRU5KUEVHX0VOQ09ERVIpICAgICAgICArPSBsaWJvcGVuanBlZ2VuYy5vCiBPQkpTLSQoQ09ORklHX0xJQk9QVVNfREVDT0RFUikgICAgICAgICAgICArPSBsaWJvcHVzZGVjLm8gbGlib3B1cy5vICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZGF0YS5vCiBPQkpTLSQoQ09ORklHX0xJQk9QVVNfRU5DT0RFUikgICAgICAgICAgICArPSBsaWJvcHVzZW5jLm8gbGlib3B1cy5vICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZGF0YS5vCi1PQkpTLSQoQ09ORklHX0xJQlNDSFJPRURJTkdFUl9ERUNPREVSKSAgICArPSBsaWJzY2hyb2VkaW5nZXJkZWMubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJzY2hyb2VkaW5nZXIubwotT0JKUy0kKENPTkZJR19MSUJTQ0hST0VESU5HRVJfRU5DT0RFUikgICAgKz0gbGlic2Nocm9lZGluZ2VyZW5jLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlic2Nocm9lZGluZ2VyLm8KIE9CSlMtJChDT05GSUdfTElCU0hJTkVfRU5DT0RFUikgICAgICAgICAgICs9IGxpYnNoaW5lLm8KIE9CSlMtJChDT05GSUdfTElCU1BFRVhfREVDT0RFUikgICAgICAgICAgICs9IGxpYnNwZWV4ZGVjLm8KIE9CSlMtJChDT05GSUdfTElCU1BFRVhfRU5DT0RFUikgICAgICAgICAgICs9IGxpYnNwZWV4ZW5jLm8KIE9CSlMtJChDT05GSUdfTElCVEhFT1JBX0VOQ09ERVIpICAgICAgICAgICs9IGxpYnRoZW9yYWVuYy5vCiBPQkpTLSQoQ09ORklHX0xJQlRXT0xBTUVfRU5DT0RFUikgICAgICAgICArPSBsaWJ0d29sYW1lLm8KLU9CSlMtJChDT05GSUdfTElCVVRWSURFT19ERUNPREVSKSAgICAgICAgICs9IGxpYnV0dmlkZW9kZWMubwotT0JKUy0kKENPTkZJR19MSUJVVFZJREVPX0VOQ09ERVIpICAgICAgICAgKz0gbGlidXR2aWRlb2VuYy5vCiBPQkpTLSQoQ09ORklHX0xJQlZPX0FNUldCRU5DX0VOQ09ERVIpICAgICArPSBsaWJ2by1hbXJ3YmVuYy5vCiBPQkpTLSQoQ09ORklHX0xJQlZPUkJJU19ERUNPREVSKSAgICAgICAgICArPSBsaWJ2b3JiaXNkZWMubwogT0JKUy0kKENPTkZJR19MSUJWT1JCSVNfRU5DT0RFUikgICAgICAgICAgKz0gbGlidm9yYmlzZW5jLm8gXApAQCAtODQ5LDIyICs5ODUsMjEgQEAKIE9CSlMtJChDT05GSUdfTElCWDI2NF9FTkNPREVSKSAgICAgICAgICAgICs9IGxpYngyNjQubwogT0JKUy0kKENPTkZJR19MSUJYMjY1X0VOQ09ERVIpICAgICAgICAgICAgKz0gbGlieDI2NS5vCiBPQkpTLSQoQ09ORklHX0xJQlhBVlNfRU5DT0RFUikgICAgICAgICAgICArPSBsaWJ4YXZzLm8KLU9CSlMtJChDT05GSUdfTElCWFZJRF9FTkNPREVSKSAgICAgICAgICAgICs9IGxpYnh2aWQubwotT0JKUy0kKENPTkZJR19MSUJaVkJJX1RFTEVURVhUX0RFQ09ERVIpICAgKz0gbGlienZiaS10ZWxldGV4dGRlYy5vCitPQkpTLSQoQ09ORklHX0xJQlhWSURfRU5DT0RFUikgICAgICAgICAgICArPSBsaWJ4dmlkLm8gbGlieHZpZF9yYy5vCitPQkpTLSQoQ09ORklHX0xJQlpWQklfVEVMRVRFWFRfREVDT0RFUikgICArPSBsaWJ6dmJpLXRlbGV0ZXh0ZGVjLm8gYXNzLm8KIAogIyBwYXJzZXJzCi1PQkpTLSQoQ09ORklHX0FBQ19QQVJTRVIpICAgICAgICAgICAgICArPSBhYWNfcGFyc2VyLm8gYWFjX2FjM19wYXJzZXIubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYWNhZHRzZGVjLm8gbXBlZzRhdWRpby5vCiBPQkpTLSQoQ09ORklHX0FBQ19MQVRNX1BBUlNFUikgICAgICAgICArPSBsYXRtX3BhcnNlci5vCi1PQkpTLSQoQ09ORklHX0FDM19QQVJTRVIpICAgICAgICAgICAgICArPSBhYzNfcGFyc2VyLm8gYWMzdGFiLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjX2FjM19wYXJzZXIubworT0JKUy0kKENPTkZJR19BQUNfUEFSU0VSKSAgICAgICAgICAgICAgKz0gYWFjX3BhcnNlci5vIGFhY19hYzNfcGFyc2VyLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzRhdWRpby5vCitPQkpTLSQoQ09ORklHX0FDM19QQVJTRVIpICAgICAgICAgICAgICArPSBhYzN0YWIubyBhYWNfYWMzX3BhcnNlci5vCiBPQkpTLSQoQ09ORklHX0FEWF9QQVJTRVIpICAgICAgICAgICAgICArPSBhZHhfcGFyc2VyLm8gYWR4Lm8KIE9CSlMtJChDT05GSUdfQk1QX1BBUlNFUikgICAgICAgICAgICAgICs9IGJtcF9wYXJzZXIubwogT0JKUy0kKENPTkZJR19DQVZTVklERU9fUEFSU0VSKSAgICAgICAgKz0gY2F2c19wYXJzZXIubwogT0JKUy0kKENPTkZJR19DT09LX1BBUlNFUikgICAgICAgICAgICAgKz0gY29va19wYXJzZXIubwotT0JKUy0kKENPTkZJR19EQ0FfUEFSU0VSKSAgICAgICAgICAgICAgKz0gZGNhX3BhcnNlci5vIGRjYS5vCitPQkpTLSQoQ09ORklHX0RDQV9QQVJTRVIpICAgICAgICAgICAgICArPSBkY2FfcGFyc2VyLm8gZGNhX2V4c3MubyBkY2EubwogT0JKUy0kKENPTkZJR19ESVJBQ19QQVJTRVIpICAgICAgICAgICAgKz0gZGlyYWNfcGFyc2VyLm8KLU9CSlMtJChDT05GSUdfRE5YSERfUEFSU0VSKSAgICAgICAgICAgICs9IGRueGhkX3BhcnNlci5vCitPQkpTLSQoQ09ORklHX0ROWEhEX1BBUlNFUikgICAgICAgICAgICArPSBkbnhoZF9wYXJzZXIubyBkbnhoZGRhdGEubwogT0JKUy0kKENPTkZJR19EUFhfUEFSU0VSKSAgICAgICAgICAgICAgKz0gZHB4X3BhcnNlci5vCiBPQkpTLSQoQ09ORklHX0RWQVVESU9fUEFSU0VSKSAgICAgICAgICArPSBkdmF1ZGlvX3BhcnNlci5vCiBPQkpTLSQoQ09ORklHX0RWQlNVQl9QQVJTRVIpICAgICAgICAgICArPSBkdmJzdWJfcGFyc2VyLm8KQEAgLTg3NiwzNSArMTAxMSw0NyBAQAogT0JKUy0kKENPTkZJR19HU01fUEFSU0VSKSAgICAgICAgICAgICAgKz0gZ3NtX3BhcnNlci5vCiBPQkpTLSQoQ09ORklHX0gyNjFfUEFSU0VSKSAgICAgICAgICAgICArPSBoMjYxX3BhcnNlci5vCiBPQkpTLSQoQ09ORklHX0gyNjNfUEFSU0VSKSAgICAgICAgICAgICArPSBoMjYzX3BhcnNlci5vCi1PQkpTLSQoQ09ORklHX0gyNjRfUEFSU0VSKSAgICAgICAgICAgICArPSBoMjY0X3BhcnNlci5vCi1PQkpTLSQoQ09ORklHX0hFVkNfUEFSU0VSKSAgICAgICAgICAgICArPSBoZXZjX3BhcnNlci5vIGhldmNfcGFyc2UubyBoZXZjX3BzLm8gaGV2Y19kYXRhLm8KK09CSlMtJChDT05GSUdfSDI2NF9QQVJTRVIpICAgICAgICAgICAgICs9IGgyNjRfcGFyc2VyLm8gaDI2NF9zZWkubyBoMjY0ZGF0YS5vCitPQkpTLSQoQ09ORklHX0hFVkNfUEFSU0VSKSAgICAgICAgICAgICArPSBoZXZjX3BhcnNlci5vIGhldmNfZGF0YS5vCiBPQkpTLSQoQ09ORklHX01KUEVHX1BBUlNFUikgICAgICAgICAgICArPSBtanBlZ19wYXJzZXIubwogT0JKUy0kKENPTkZJR19NTFBfUEFSU0VSKSAgICAgICAgICAgICAgKz0gbWxwX3BhcnNlci5vIG1scC5vCiBPQkpTLSQoQ09ORklHX01QRUc0VklERU9fUEFSU0VSKSAgICAgICArPSBtcGVnNHZpZGVvX3BhcnNlci5vIGgyNjMubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnNHZpZGVvZGVjLm8gbXBlZzR2aWRlby5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0dWgyNjNkZWMubyBoMjYzZGVjLm8gaDI2M2RhdGEubwogT0JKUy0kKENPTkZJR19QTkdfUEFSU0VSKSAgICAgICAgICAgICAgKz0gcG5nX3BhcnNlci5vCi1PQkpTLSQoQ09ORklHX01QRUdBVURJT19QQVJTRVIpICAgICAgICArPSBtcGVnYXVkaW9fcGFyc2VyLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZ2F1ZGlvZGVjaGVhZGVyLm8gbXBlZ2F1ZGlvZGF0YS5vCitPQkpTLSQoQ09ORklHX01QRUdBVURJT19QQVJTRVIpICAgICAgICArPSBtcGVnYXVkaW9fcGFyc2VyLm8KIE9CSlMtJChDT05GSUdfTVBFR1ZJREVPX1BBUlNFUikgICAgICAgICs9IG1wZWd2aWRlb19wYXJzZXIubyAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMTIubyBtcGVnMTJkYXRhLm8KLU9CSlMtJChDT05GSUdfT1BVU19QQVJTRVIpICAgICAgICAgICAgICs9IG9wdXNfcGFyc2VyLm8gb3B1cy5vIHZvcmJpc19kYXRhLm8KK09CSlMtJChDT05GSUdfT1BVU19QQVJTRVIpICAgICAgICAgICAgICs9IG9wdXNfcGFyc2VyLm8gb3B1cy5vIG9wdXN0YWIubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHVzX3JjLm8gdm9yYmlzX2RhdGEubwogT0JKUy0kKENPTkZJR19QTkdfUEFSU0VSKSAgICAgICAgICAgICAgKz0gcG5nX3BhcnNlci5vCiBPQkpTLSQoQ09ORklHX1BOTV9QQVJTRVIpICAgICAgICAgICAgICArPSBwbm1fcGFyc2VyLm8gcG5tLm8KIE9CSlMtJChDT05GSUdfUlYzMF9QQVJTRVIpICAgICAgICAgICAgICs9IHJ2MzRfcGFyc2VyLm8KIE9CSlMtJChDT05GSUdfUlY0MF9QQVJTRVIpICAgICAgICAgICAgICs9IHJ2MzRfcGFyc2VyLm8KK09CSlMtJChDT05GSUdfU0JDX1BBUlNFUikgICAgICAgICAgICAgICs9IHNiY19wYXJzZXIubworT0JKUy0kKENPTkZJR19TSVBSX1BBUlNFUikgICAgICAgICAgICAgKz0gc2lwcl9wYXJzZXIubwogT0JKUy0kKENPTkZJR19UQUtfUEFSU0VSKSAgICAgICAgICAgICAgKz0gdGFrX3BhcnNlci5vIHRhay5vCi1PQkpTLSQoQ09ORklHX1ZDMV9QQVJTRVIpICAgICAgICAgICAgICArPSB2YzFfcGFyc2VyLm8KK09CSlMtJChDT05GSUdfVkMxX1BBUlNFUikgICAgICAgICAgICAgICs9IHZjMV9wYXJzZXIubyB2YzEubyB2YzFkYXRhLm8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZV9pZGN0Lm8gd212MmRhdGEubwogT0JKUy0kKENPTkZJR19WUDNfUEFSU0VSKSAgICAgICAgICAgICAgKz0gdnAzX3BhcnNlci5vCiBPQkpTLSQoQ09ORklHX1ZQOF9QQVJTRVIpICAgICAgICAgICAgICArPSB2cDhfcGFyc2VyLm8KIE9CSlMtJChDT05GSUdfVlA5X1BBUlNFUikgICAgICAgICAgICAgICs9IHZwOV9wYXJzZXIubworT0JKUy0kKENPTkZJR19YTUFfUEFSU0VSKSAgICAgICAgICAgICAgKz0geG1hX3BhcnNlci5vCiAKICMgYml0c3RyZWFtIGZpbHRlcnMKLU9CSlMtJChDT05GSUdfQUFDX0FEVFNUT0FTQ19CU0YpICAgICAgICAgICs9IGFhY19hZHRzdG9hc2NfYnNmLm8gYWFjYWR0c2RlYy5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWc0YXVkaW8ubworT0JKUy0kKENPTkZJR19BQUNfQURUU1RPQVNDX0JTRikgICAgICAgICAgKz0gYWFjX2FkdHN0b2FzY19ic2YubyBtcGVnNGF1ZGlvLm8KIE9CSlMtJChDT05GSUdfQ0hPTVBfQlNGKSAgICAgICAgICAgICAgICAgICs9IGNob21wX2JzZi5vCiBPQkpTLSQoQ09ORklHX0RVTVBfRVhUUkFEQVRBX0JTRikgICAgICAgICArPSBkdW1wX2V4dHJhZGF0YV9ic2YubworT0JKUy0kKENPTkZJR19EQ0FfQ09SRV9CU0YpICAgICAgICAgICAgICAgKz0gZGNhX2NvcmVfYnNmLm8KK09CSlMtJChDT05GSUdfRUFDM19DT1JFX0JTRikgICAgICAgICAgICAgICs9IGVhYzNfY29yZV9ic2YubworT0JKUy0kKENPTkZJR19FWFRSQUNUX0VYVFJBREFUQV9CU0YpICAgICAgKz0gZXh0cmFjdF9leHRyYWRhdGFfYnNmLm8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NDVfcGFyc2UubworT0JKUy0kKENPTkZJR19GSUxURVJfVU5JVFNfQlNGKSAgICAgICAgICAgKz0gZmlsdGVyX3VuaXRzX2JzZi5vCitPQkpTLSQoQ09ORklHX0gyNjRfTUVUQURBVEFfQlNGKSAgICAgICAgICArPSBoMjY0X21ldGFkYXRhX2JzZi5vCiBPQkpTLSQoQ09ORklHX0gyNjRfTVA0VE9BTk5FWEJfQlNGKSAgICAgICArPSBoMjY0X21wNHRvYW5uZXhiX2JzZi5vCitPQkpTLSQoQ09ORklHX0gyNjRfUkVEVU5EQU5UX1BQU19CU0YpICAgICArPSBoMjY0X3JlZHVuZGFudF9wcHNfYnNmLm8KK09CSlMtJChDT05GSUdfSEFQUUFfRVhUUkFDVF9CU0YpICAgICAgICAgICs9IGhhcHFhX2V4dHJhY3RfYnNmLm8gaGFwLm8KK09CSlMtJChDT05GSUdfSEVWQ19NRVRBREFUQV9CU0YpICAgICAgICAgICs9IGgyNjVfbWV0YWRhdGFfYnNmLm8KIE9CSlMtJChDT05GSUdfSEVWQ19NUDRUT0FOTkVYQl9CU0YpICAgICAgICs9IGhldmNfbXA0dG9hbm5leGJfYnNmLm8KIE9CSlMtJChDT05GSUdfSU1YX0RVTVBfSEVBREVSX0JTRikgICAgICAgICs9IGlteF9kdW1wX2hlYWRlcl9ic2YubwogT0JKUy0kKENPTkZJR19NSlBFRzJKUEVHX0JTRikgICAgICAgICAgICAgKz0gbWpwZWcyanBlZ19ic2YubwpAQCAtOTEzLDkgKzEwNjAsMTUgQEAKIE9CSlMtJChDT05GSUdfTU9WMlRFWFRTVUJfQlNGKSAgICAgICAgICAgICs9IG1vdnN1Yl9ic2YubwogT0JKUy0kKENPTkZJR19NUDNfSEVBREVSX0RFQ09NUFJFU1NfQlNGKSAgKz0gbXAzX2hlYWRlcl9kZWNvbXByZXNzX2JzZi5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWdhdWRpb2RhdGEubworT0JKUy0kKENPTkZJR19NUEVHMl9NRVRBREFUQV9CU0YpICAgICAgICAgKz0gbXBlZzJfbWV0YWRhdGFfYnNmLm8KIE9CSlMtJChDT05GSUdfTk9JU0VfQlNGKSAgICAgICAgICAgICAgICAgICs9IG5vaXNlX2JzZi5vCitPQkpTLSQoQ09ORklHX05VTExfQlNGKSAgICAgICAgICAgICAgICAgICArPSBudWxsX2JzZi5vCiBPQkpTLSQoQ09ORklHX1JFTU9WRV9FWFRSQURBVEFfQlNGKSAgICAgICArPSByZW1vdmVfZXh0cmFkYXRhX2JzZi5vCiBPQkpTLSQoQ09ORklHX1RFWFQyTU9WU1VCX0JTRikgICAgICAgICAgICArPSBtb3ZzdWJfYnNmLm8KK09CSlMtJChDT05GSUdfVFJBQ0VfSEVBREVSU19CU0YpICAgICAgICAgICs9IHRyYWNlX2hlYWRlcnNfYnNmLm8KK09CSlMtJChDT05GSUdfVlA5X1JBV19SRU9SREVSX0JTRikgICAgICAgICs9IHZwOV9yYXdfcmVvcmRlcl9ic2YubworT0JKUy0kKENPTkZJR19WUDlfU1VQRVJGUkFNRV9CU0YpICAgICAgICAgKz0gdnA5X3N1cGVyZnJhbWVfYnNmLm8KK09CSlMtJChDT05GSUdfVlA5X1NVUEVSRlJBTUVfU1BMSVRfQlNGKSAgICs9IHZwOV9zdXBlcmZyYW1lX3NwbGl0X2JzZi5vCiAKICMgdGhyZWFkIGxpYnJhcmllcwogT0JKUy0kKEhBVkVfTElCQ19NU1ZDUlQpICAgICAgICAgICAgICAgKz0gZmlsZV9vcGVuLm8KQEAgLTkzNywzMyArMTA5MCw0MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFjZW5jX3F1YW50aXphdGlvbl9taXNjLmggICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChBUkNIKS92cDU2X2FyaXRoLmggICAgICAgICAgXAogCitTS0lQSEVBREVSUy0kKENPTkZJR19BTUYpICAgICAgICAgICAgICArPSBhbWZlbmMuaAogU0tJUEhFQURFUlMtJChDT05GSUdfRDNEMTFWQSkgICAgICAgICAgKz0gZDNkMTF2YS5oIGR4dmEyX2ludGVybmFsLmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX0RYVkEyKSAgICAgICAgICAgICs9IGR4dmEyLmggZHh2YTJfaW50ZXJuYWwuaAotU0tJUEhFQURFUlMtJChDT05GSUdfTElCU0NIUk9FRElOR0VSKSAgKz0gbGlic2Nocm9lZGluZ2VyLmgKLVNLSVBIRUFERVJTLSQoQ09ORklHX0xJQlVUVklERU8pICAgICAgICs9IGxpYnV0dmlkZW8uaAorU0tJUEhFQURFUlMtJChDT05GSUdfSk5JKSAgICAgICAgICAgICAgKz0gZmZqbmkuaAogU0tJUEhFQURFUlMtJChDT05GSUdfTElCVlBYKSAgICAgICAgICAgKz0gbGlidnB4LmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX0xJQldFQlBfRU5DT0RFUikgICs9IGxpYndlYnBlbmNfY29tbW9uLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX01FRElBQ09ERUMpICAgICAgICs9IG1lZGlhY29kZWNkZWNfY29tbW9uLmggbWVkaWFjb2RlY19zdXJmYWNlLmggbWVkaWFjb2RlY193cmFwcGVyLmggbWVkaWFjb2RlY19zd19idWZmZXIuaAorU0tJUEhFQURFUlMtJChDT05GSUdfTlZERUMpICAgICAgICAgICAgKz0gbnZkZWMuaAorU0tJUEhFQURFUlMtJChDT05GSUdfTlZFTkMpICAgICAgICAgICAgKz0gbnZlbmMuaAogU0tJUEhFQURFUlMtJChDT05GSUdfUVNWKSAgICAgICAgICAgICAgKz0gcXN2LmggcXN2X2ludGVybmFsLmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX1FTVkRFQykgICAgICAgICAgICs9IHFzdmRlYy5oCiBTS0lQSEVBREVSUy0kKENPTkZJR19RU1ZFTkMpICAgICAgICAgICArPSBxc3ZlbmMuaAogU0tJUEhFQURFUlMtJChDT05GSUdfWFZNQykgICAgICAgICAgICAgKz0geHZtYy5oCi1TS0lQSEVBREVSUy0kKENPTkZJR19WQUFQSSkgICAgICAgICAgICArPSB2YWFwaV9pbnRlcm5hbC5oCi1TS0lQSEVBREVSUy0kKENPTkZJR19WREEpICAgICAgICAgICAgICArPSB2ZGEuaCB2ZGFfdnRfaW50ZXJuYWwuaAorU0tJUEhFQURFUlMtJChDT05GSUdfVkFBUEkpICAgICAgICAgICAgKz0gdmFhcGlfZGVjb2RlLmggdmFhcGlfZW5jb2RlLmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX1ZEUEFVKSAgICAgICAgICAgICs9IHZkcGF1LmggdmRwYXVfaW50ZXJuYWwuaAotU0tJUEhFQURFUlMtJChDT05GSUdfVklERU9UT09MQk9YKSAgICAgKz0gdmlkZW90b29sYm94LmggdmRhX3Z0X2ludGVybmFsLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX1ZJREVPVE9PTEJPWCkgICAgICs9IHZpZGVvdG9vbGJveC5oIHZ0X2ludGVybmFsLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX1Y0TDJfTTJNKSAgICAgICAgICs9IHY0bDJfYnVmZmVycy5oIHY0bDJfY29udGV4dC5oIHY0bDJfbTJtLmgKIAotVEVTVFBST0dTID0gaW1nY29udmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorVEVTVFBST0dTID0gYXZwYWNrZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2VscF9tYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29kZWNfZGVzYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaHRtbHN1YnRpdGxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW1nY29udmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAganBlZzIwMDBkd3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgbWF0aG9wcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBvcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhdmZmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtanBlZ2VuY19odWZmbWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1dGlscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAKIFRFU1RQUk9HUy0kKENPTkZJR19DQUJBQykgICAgICAgICAgICAgICAgICs9IGNhYmFjCitURVNUUFJPR1MtJChDT05GSUdfRENUKSAgICAgICAgICAgICAgICAgICArPSBhdmZmdAogVEVTVFBST0dTLSQoQ09ORklHX0ZGVCkgICAgICAgICAgICAgICAgICAgKz0gZmZ0IGZmdC1maXhlZCBmZnQtZml4ZWQzMgorVEVTVFBST0dTLSQoQ09ORklHX0dPTE9NQikgICAgICAgICAgICAgICAgKz0gZ29sb21iCiBURVNUUFJPR1MtJChDT05GSUdfSURDVERTUCkgICAgICAgICAgICAgICArPSBkY3QKIFRFU1RQUk9HUy0kKENPTkZJR19JSVJGSUxURVIpICAgICAgICAgICAgICs9IGlpcmZpbHRlcgogVEVTVFBST0dTLSQoSEFWRV9NTVgpICAgICAgICAgICAgICAgICAgICAgKz0gbW90aW9uCi1URVNUUFJPR1MtJChDT05GSUdfR09MT01CKSAgICAgICAgICAgICAgICArPSBnb2xvbWIKK1RFU1RQUk9HUy0kKENPTkZJR19NUEVHVklERU8pICAgICAgICAgICAgICs9IG1wZWcxMmZyYW1lcmF0ZQogVEVTVFBST0dTLSQoQ09ORklHX1JBTkdFQ09ERVIpICAgICAgICAgICAgKz0gcmFuZ2Vjb2RlcgogVEVTVFBST0dTLSQoQ09ORklHX1NOT1dfRU5DT0RFUikgICAgICAgICAgKz0gc25vd2VuYwogCkBAIC05ODYsNyArMTE0OSw3IEBACiAKIENMRUFORklMRVMgPSAqX3RhYmxlcy5jICpfdGFibGVzLmggKl90YWJsZWdlbiQoSE9TVEVYRVNVRikKIAotJChTVUJESVIpZGN0LXRlc3QkKEVYRVNVRik6ICQoU1VCRElSKWRjdHJlZi5vICQoU1VCRElSKWFhbmRjdHRhYi5vCiskKFNVQkRJUil0ZXN0cy9kY3QkKEVYRVNVRik6ICQoU1VCRElSKWRjdHJlZi5vICQoU1VCRElSKWFhbmRjdHRhYi5vCiAkKFNVQkRJUilkdl90YWJsZWdlbiQoSE9TVEVYRVNVRik6ICQoU1VCRElSKWR2ZGF0YV9ob3N0Lm8KIAogVFJJR19UQUJMRVMgID0gY29zIGNvc19maXhlZCBzaW4KQEAgLTEwMTEsMTcgKzExNzQsMTcgQEAKIAkkKE0pLi8kPCA+ICRACiAKIGlmZGVmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCi0kKFNVQkRJUilhYWNkZWMubzogJChTVUJESVIpY2JydF90YWJsZXMuaAotJChTVUJESVIpYWFjZGVjX2ZpeGVkLm86ICQoU1VCRElSKWNicnRfZml4ZWRfdGFibGVzLmgKKyQoU1VCRElSKWNicnRfZGF0YS5vOiAkKFNVQkRJUiljYnJ0X3RhYmxlcy5oCiskKFNVQkRJUiljYnJ0X2RhdGFfZml4ZWQubzogJChTVUJESVIpY2JydF9maXhlZF90YWJsZXMuaAogJChTVUJESVIpYWFjcHNfZmxvYXQubzogJChTVUJESVIpYWFjcHNfdGFibGVzLmgKICQoU1VCRElSKWFhY3BzX2ZpeGVkLm86ICQoU1VCRElSKWFhY3BzX2ZpeGVkX3RhYmxlcy5oCiAkKFNVQkRJUilhYWN0YWJfZml4ZWQubzogJChTVUJESVIpYWFjX2ZpeGVkX3RhYmxlcy5oCiAkKFNVQkRJUilkdmVuYy5vOiAkKFNVQkRJUilkdl90YWJsZXMuaAotJChTVUJESVIpc2luZXdpbi5vOiAkKFNVQkRJUilzaW5ld2luX3RhYmxlcy5oCi0kKFNVQkRJUilzaW5ld2luX2ZpeGVkLm86ICQoU1VCRElSKXNpbmV3aW5fZml4ZWRfdGFibGVzLmgKKyQoU1VCRElSKW1vdGlvbnBpeGVscy5vOiAkKFNVQkRJUiltb3Rpb25waXhlbHNfdGFibGVzLmgKICQoU1VCRElSKW1wZWdhdWRpb2RlY19maXhlZC5vOiAkKFNVQkRJUiltcGVnYXVkaW9fdGFibGVzLmgKICQoU1VCRElSKW1wZWdhdWRpb2RlY19mbG9hdC5vOiAkKFNVQkRJUiltcGVnYXVkaW9fdGFibGVzLmgKLSQoU1VCRElSKW1vdGlvbnBpeGVscy5vOiAkKFNVQkRJUiltb3Rpb25waXhlbHNfdGFibGVzLmgKICQoU1VCRElSKXBjbS5vOiAkKFNVQkRJUilwY21fdGFibGVzLmgKICQoU1VCRElSKXFkbTIubzogJChTVUJESVIpcWRtMl90YWJsZXMuaAorJChTVUJESVIpc2luZXdpbi5vOiAkKFNVQkRJUilzaW5ld2luX3RhYmxlcy5oCiskKFNVQkRJUilzaW5ld2luX2ZpeGVkLm86ICQoU1VCRElSKXNpbmV3aW5fZml4ZWRfdGFibGVzLmgKIGVuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhYy5oIGIvbGliYXZjb2RlYy9hYWMuaAppbmRleCBiMWY0YWE3Li4wNWJjOTUzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhYy5oCisrKyBiL2xpYmF2Y29kZWMvYWFjLmgKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvZml4ZWRfZHNwLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2lmICFVU0VfRklYRUQKLSNpbmNsdWRlICJpbWRjdDE1LmgiCisjaW5jbHVkZSAibWRjdDE1LmgiCiAjZW5kaWYKICNpbmNsdWRlICJmZnQuaCIKICNpbmNsdWRlICJtcGVnNGF1ZGlvLmgiCkBAIC0zMjcsNyArMzI3LDkgQEAKICNpZiBVU0VfRklYRUQKICAgICBBVkZpeGVkRFNQQ29udGV4dCAqZmRzcDsKICNlbHNlCi0gICAgSU1EQ1QxNUNvbnRleHQgKm1kY3Q0ODA7CisgICAgTURDVDE1Q29udGV4dCAqbWRjdDEyMDsKKyAgICBNRENUMTVDb250ZXh0ICptZGN0NDgwOworICAgIE1EQ1QxNUNvbnRleHQgKm1kY3Q5NjA7CiAgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3A7CiAjZW5kaWYgLyogVVNFX0ZJWEVEICovCiAgICAgaW50IHJhbmRvbV9zdGF0ZTsKQEAgLTM1Myw2ICszNTUsOSBAQAogCiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvY1syXTsKICAgICBpbnQgd2FybmVkX251bV9hYWNfZnJhbWVzOworICAgIGludCB3YXJuZWRfOTYwX3NicjsKKworICAgIGludCB3YXJuZWRfZ2Fpbl9jb250cm9sOwogCiAgICAgLyogYWFjZGVjIGZ1bmN0aW9ucyBwb2ludGVycyAqLwogICAgIHZvaWQgKCppbWRjdF9hbmRfd2luZG93aW5nKShBQUNDb250ZXh0ICphYywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY19hYzNfcGFyc2VyLmMgYi9saWJhdmNvZGVjL2FhY19hYzNfcGFyc2VyLmMKaW5kZXggMmY3ZDU2OC4uNTRlNDU5OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNfYWMzX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvYWFjX2FjM19wYXJzZXIuYwpAQCAtMzQsNiArMzQsNyBAQAogICAgIFBhcnNlQ29udGV4dCAqcGMgPSAmcy0+cGM7CiAgICAgaW50IGxlbiwgaTsKICAgICBpbnQgbmV3X2ZyYW1lX3N0YXJ0OworICAgIGludCBnb3RfZnJhbWUgPSAwOwogCiBnZXRfbmV4dDoKICAgICBpPUVORF9OT1RfRk9VTkQ7CkBAIC01MSw2ICs1Miw3IEBACiAgICAgICAgICAgICBpZihsZW48PTApewogICAgICAgICAgICAgICAgIGk9RU5EX05PVF9GT1VORDsKICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGdvdF9mcmFtZSA9IDE7CiAgICAgICAgICAgICAgICAgcy0+c3RhdGU9MDsKICAgICAgICAgICAgICAgICBpLT0gcy0+aGVhZGVyX3NpemUgLTE7CiAgICAgICAgICAgICAgICAgcy0+cmVtYWluaW5nX3NpemUgPSBsZW47CkBAIC01OCw2ICs2MCw5IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPnJlbWFpbmluZ19zaXplICs9IGk7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZ2V0X25leHQ7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnJlbWFpbmluZ19zaXplICs9IGk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNzYsMzEgKzgxLDI1IEBACiAgICAgaWYocy0+Y29kZWNfaWQpCiAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9IHMtPmNvZGVjX2lkOwogCi0gICAgLyogRHVlIHRvIGJhY2t3YXJkcyBjb21wYXRpYmxlIEhFLUFBQyB0aGUgc2FtcGxlIHJhdGUsIGNoYW5uZWwgY291bnQsCi0gICAgICAgYW5kIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGZvdW5kIGluIGFuIEFBQyBBRFRTIGhlYWRlciBhcmUgbm90Ci0gICAgICAgcmVsaWFibGUuIEJpdCByYXRlIGlzIHN0aWxsIGFjY3VyYXRlIGJlY2F1c2UgdGhlIHRvdGFsIGZyYW1lIGR1cmF0aW9uIGluCi0gICAgICAgc2Vjb25kcyBpcyBzdGlsbCBjb3JyZWN0IChhcyBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGZyYW1lKS4gKi8KLSAgICBpZiAoYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0FBQykgewotICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZTsKLQotICAgICAgICAvKiAoRS0pQUMtMzogYWxsb3cgZG93bm1peGluZyB0byBzdGVyZW8gb3IgbW9ubyAqLwotICAgICAgICBpZiAocy0+Y2hhbm5lbHMgPiAxICYmCi0gICAgICAgICAgICBhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfTU9OTykgewotICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMTsKLSAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwotICAgICAgICB9IGVsc2UgaWYgKHMtPmNoYW5uZWxzID4gMiAmJgotICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF9TVEVSRU8pIHsKLSAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IDI7Ci0gICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gcy0+Y2hhbm5lbHM7Ci0gICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBzLT5jaGFubmVsX2xheW91dDsKKyAgICBpZiAoZ290X2ZyYW1lKSB7CisgICAgICAgIC8qIER1ZSB0byBiYWNrd2FyZHMgY29tcGF0aWJsZSBIRS1BQUMgdGhlIHNhbXBsZSByYXRlLCBjaGFubmVsIGNvdW50LAorICAgICAgICAgICBhbmQgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgZm91bmQgaW4gYW4gQUFDIEFEVFMgaGVhZGVyIGFyZSBub3QKKyAgICAgICAgICAgcmVsaWFibGUuIEJpdCByYXRlIGlzIHN0aWxsIGFjY3VyYXRlIGJlY2F1c2UgdGhlIHRvdGFsIGZyYW1lCisgICAgICAgICAgIGR1cmF0aW9uIGluIHNlY29uZHMgaXMgc3RpbGwgY29ycmVjdCAoYXMgaXMgdGhlIG51bWJlciBvZiBiaXRzIGluCisgICAgICAgICAgIHRoZSBmcmFtZSkuICovCisgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfRUFDMykgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyA9IHMtPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IHMtPmNoYW5uZWxfbGF5b3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgczEtPmR1cmF0aW9uID0gcy0+c2FtcGxlczsKKyAgICAgICAgICAgIGF2Y3R4LT5hdWRpb19zZXJ2aWNlX3R5cGUgPSBzLT5zZXJ2aWNlX3R5cGU7CiAgICAgICAgIH0KLSAgICAgICAgczEtPmR1cmF0aW9uID0gcy0+c2FtcGxlczsKLSAgICAgICAgYXZjdHgtPmF1ZGlvX3NlcnZpY2VfdHlwZSA9IHMtPnNlcnZpY2VfdHlwZTsKLSAgICB9CiAKLSAgICBhdmN0eC0+Yml0X3JhdGUgPSBzLT5iaXRfcmF0ZTsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9FQUMzKQorICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gcy0+Yml0X3JhdGU7CisgICAgfQogCiAgICAgcmV0dXJuIGk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY19hZHRzdG9hc2NfYnNmLmMgYi9saWJhdmNvZGVjL2FhY19hZHRzdG9hc2NfYnNmLmMKaW5kZXggOWMxMTdjNi4uNjU0MWIxMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNfYWR0c3RvYXNjX2JzZi5jCisrKyBiL2xpYmF2Y29kZWMvYWFjX2FkdHN0b2FzY19ic2YuYwpAQCAtMTksOCArMTksMTAgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAiYWR0c19oZWFkZXIuaCIKKyNpbmNsdWRlICJhZHRzX3BhcnNlci5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJhYWNhZHRzZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAjaW5jbHVkZSAicHV0X2JpdHMuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgIm1wZWc0YXVkaW8uaCIKQEAgLTM0LDY4ICszNiw3NSBAQAogICogVGhpcyBmaWx0ZXIgY3JlYXRlcyBhbiBNUEVHLTQgQXVkaW9TcGVjaWZpY0NvbmZpZyBmcm9tIGFuIE1QRUctMi80CiAgKiBBRFRTIGhlYWRlciBhbmQgcmVtb3ZlcyB0aGUgQURUUyBoZWFkZXIuCiAgKi8KLXN0YXRpYyBpbnQgYWFjX2FkdHN0b2FzY19maWx0ZXIoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50ICAgICAgYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlmcmFtZSkKK3N0YXRpYyBpbnQgYWFjX2FkdHN0b2FzY19maWx0ZXIoQVZCU0ZDb250ZXh0ICpic2ZjLCBBVlBhY2tldCAqcGt0KQogeworICAgIEFBQ0JTRkNvbnRleHQgKmN0eCA9IGJzZmMtPnByaXZfZGF0YTsKKwogICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgUHV0Qml0Q29udGV4dCBwYjsKICAgICBBQUNBRFRTSGVhZGVySW5mbyBoZHI7CisgICAgaW50IHJldDsKIAotICAgIEFBQ0JTRkNvbnRleHQgKmN0eCA9IGJzZmMtPnByaXZfZGF0YTsKKyAgICByZXQgPSBmZl9ic2ZfZ2V0X3BhY2tldF9yZWYoYnNmYywgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIEFBQ19BRFRTX0hFQURFUl9TSVpFKjgpOworICAgIGlmIChic2ZjLT5wYXJfaW4tPmV4dHJhZGF0YSAmJiBwa3QtPnNpemUgPj0gMiAmJiAoQVZfUkIxNihwa3QtPmRhdGEpID4+IDQpICE9IDB4ZmZmKQorICAgICAgICByZXR1cm4gMDsKIAotICAgICpwb3V0YnVmID0gKHVpbnQ4X3QqKSBidWY7Ci0gICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIGlmIChwa3QtPnNpemUgPCBBVl9BQUNfQURUU19IRUFERVJfU0laRSkKKyAgICAgICAgZ290byBwYWNrZXRfdG9vX3NtYWxsOwogCi0gICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEpCi0gICAgICAgIGlmIChzaG93X2JpdHMoJmdiLCAxMikgIT0gMHhmZmYpCi0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICBpbml0X2dldF9iaXRzKCZnYiwgcGt0LT5kYXRhLCBBVl9BQUNfQURUU19IRUFERVJfU0laRSAqIDgpOwogCi0gICAgaWYgKGF2cHJpdl9hYWNfcGFyc2VfaGVhZGVyKCZnYiwgJmhkcikgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyBBRFRTIGZyYW1lIGhlYWRlciFcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoZmZfYWR0c19oZWFkZXJfcGFyc2UoJmdiLCAmaGRyKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGJzZmMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgQURUUyBmcmFtZSBoZWFkZXIhXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAogICAgIGlmICghaGRyLmNyY19hYnNlbnQgJiYgaGRyLm51bV9hYWNfZnJhbWVzID4gMSkgewotICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYnNmYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIFJEQnMgcGVyIGZyYW1lIHdpdGggQ1JDIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBidWYgICAgICArPSBBQUNfQURUU19IRUFERVJfU0laRSArIDIqIWhkci5jcmNfYWJzZW50OwotICAgIGJ1Zl9zaXplIC09IEFBQ19BRFRTX0hFQURFUl9TSVpFICsgMiohaGRyLmNyY19hYnNlbnQ7CisgICAgcGt0LT5zaXplIC09IEFWX0FBQ19BRFRTX0hFQURFUl9TSVpFICsgMiAqICFoZHIuY3JjX2Fic2VudDsKKyAgICBpZiAocGt0LT5zaXplIDw9IDApCisgICAgICAgIGdvdG8gcGFja2V0X3Rvb19zbWFsbDsKKyAgICBwa3QtPmRhdGEgKz0gQVZfQUFDX0FEVFNfSEVBREVSX1NJWkUgKyAyICogIWhkci5jcmNfYWJzZW50OwogCiAgICAgaWYgKCFjdHgtPmZpcnN0X2ZyYW1lX2RvbmUpIHsKICAgICAgICAgaW50ICAgICAgICAgICAgcGNlX3NpemUgPSAwOwogICAgICAgICB1aW50OF90ICAgICAgICBwY2VfZGF0YVtNQVhfUENFX1NJWkVdOworICAgICAgICB1aW50OF90ICAgICAgICpleHRyYWRhdGE7CisKICAgICAgICAgaWYgKCFoZHIuY2hhbl9jb25maWcpIHsKLSAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplICogOCk7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUgKiA4KTsKICAgICAgICAgICAgIGlmIChnZXRfYml0cygmZ2IsIDMpICE9IDUpIHsKLSAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShic2ZjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQ0UtYmFzZWQgY2hhbm5lbCBjb25maWd1cmF0aW9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aG91dCBQQ0UgYXMgZmlyc3Qgc3ludGF4ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgcGNlX2RhdGEsIE1BWF9QQ0VfU0laRSk7Ci0gICAgICAgICAgICBwY2Vfc2l6ZSA9IGF2cHJpdl9jb3B5X3BjZV9kYXRhKCZwYiwgJmdiKS84OworICAgICAgICAgICAgcGNlX3NpemUgPSBmZl9jb3B5X3BjZV9kYXRhKCZwYiwgJmdiKSAvIDg7CiAgICAgICAgICAgICBmbHVzaF9wdXRfYml0cygmcGIpOwotICAgICAgICAgICAgYnVmX3NpemUgLT0gZ2V0X2JpdHNfY291bnQoJmdiKS84OwotICAgICAgICAgICAgYnVmICAgICAgKz0gZ2V0X2JpdHNfY291bnQoJmdiKS84OwotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyZWUoYXZjdHgtPmV4dHJhZGF0YSk7Ci0gICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDIgKyBwY2Vfc2l6ZTsKLSAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooYXZjdHgtPmV4dHJhZGF0YV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgewotICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBwa3QtPnNpemUgLT0gZ2V0X2JpdHNfY291bnQoJmdiKS84OworICAgICAgICAgICAgcGt0LT5kYXRhICs9IGdldF9iaXRzX2NvdW50KCZnYikvODsKICAgICAgICAgfQogCi0gICAgICAgIGluaXRfcHV0X2JpdHMoJnBiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBleHRyYWRhdGEgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKyBwY2Vfc2l6ZSk7CisgICAgICAgIGlmICghZXh0cmFkYXRhKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgZXh0cmFkYXRhLCAyICsgcGNlX3NpemUpOwogICAgICAgICBwdXRfYml0cygmcGIsIDUsIGhkci5vYmplY3RfdHlwZSk7CiAgICAgICAgIHB1dF9iaXRzKCZwYiwgNCwgaGRyLnNhbXBsaW5nX2luZGV4KTsKICAgICAgICAgcHV0X2JpdHMoJnBiLCA0LCBoZHIuY2hhbl9jb25maWcpOwpAQCAtMTA0LDIwICsxMTMsNDYgQEAKICAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLy9pcyBub3QgZXh0ZW5zaW9uCiAgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CiAgICAgICAgIGlmIChwY2Vfc2l6ZSkgewotICAgICAgICAgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEgKyAyLCBwY2VfZGF0YSwgcGNlX3NpemUpOworICAgICAgICAgICAgbWVtY3B5KGV4dHJhZGF0YSArIDIsIHBjZV9kYXRhLCBwY2Vfc2l6ZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjdHgtPmZpcnN0X2ZyYW1lX2RvbmUgPSAxOwogICAgIH0KIAotICAgICpwb3V0YnVmID0gKHVpbnQ4X3QqKSBidWY7Ci0gICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiAwOworCitwYWNrZXRfdG9vX3NtYWxsOgorICAgIGF2X2xvZyhic2ZjLCBBVl9MT0dfRVJST1IsICJJbnB1dCBwYWNrZXQgdG9vIHNtYWxsXG4iKTsKKyAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworZmFpbDoKKyAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFhY19hZHRzdG9hc2NfaW5pdChBVkJTRkNvbnRleHQgKmN0eCkKK3sKKyAgICAvKiBWYWxpZGF0ZSB0aGUgZXh0cmFkYXRhIGlmIHRoZSBzdHJlYW0gaXMgYWxyZWFkeSBNUEVHLTQgQXVkaW9TcGVjaWZpY0NvbmZpZyAqLworICAgIGlmIChjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhKSB7CisgICAgICAgIE1QRUc0QXVkaW9Db25maWcgbXA0YWM7CisgICAgICAgIGludCByZXQgPSBhdnByaXZfbXBlZzRhdWRpb19nZXRfY29uZmlnKCZtcDRhYywgY3R4LT5wYXJfaW4tPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wYXJfaW4tPmV4dHJhZGF0YV9zaXplICogOCwgMSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIEF1ZGlvU3BlY2lmaWNDb25maWcgZXh0cmFkYXRhIVxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLUFWQml0U3RyZWFtRmlsdGVyIGZmX2FhY19hZHRzdG9hc2NfYnNmID0geworc3RhdGljIGNvbnN0IGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkc1tdID0geworICAgIEFWX0NPREVDX0lEX0FBQywgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX2FhY19hZHRzdG9hc2NfYnNmID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJhYWNfYWR0c3RvYXNjIiwKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQUFDQlNGQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gYWFjX2FkdHN0b2FzY19pbml0LAogICAgIC5maWx0ZXIgICAgICAgICA9IGFhY19hZHRzdG9hc2NfZmlsdGVyLAorICAgIC5jb2RlY19pZHMgICAgICA9IGNvZGVjX2lkcywKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY19kZWZpbmVzLmggYi9saWJhdmNvZGVjL2FhY19kZWZpbmVzLmgKaW5kZXggZWZmNjNiMy4uNDM4ZDc4YSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNfZGVmaW5lcy5oCisrKyBiL2xpYmF2Y29kZWMvYWFjX2RlZmluZXMuaApAQCAtMzUsNiArMzUsNyBAQAogI2RlZmluZSBBQUNfUkVOQU1FKHgpICAgICAgIHggIyMgX2ZpeGVkCiAjZGVmaW5lIEFBQ19SRU5BTUVfMzIoeCkgICAgeCAjIyBfZml4ZWRfMzIKIHR5cGVkZWYgaW50ICAgICAgICAgICAgICAgICBJTlRGTE9BVDsKK3R5cGVkZWYgdW5zaWduZWQgICAgICAgICAgICBVSU5URkxPQVQ7ICAvLy88IEVxdWl2YWxlbnQgdG8gSU5URkxPQVQsIFVzZWQgYXMgdGVtcG9yYWwgY2FzdCB0byBhdm9pZCB1bmRlZmluZWQgc2lnbiBvdmVyZmxvdyBvcGVyYXRpb25zLgogdHlwZWRlZiBpbnQ2NF90ICAgICAgICAgICAgIElOVDY0RkxPQVQ7CiB0eXBlZGVmIGludDE2X3QgICAgICAgICAgICAgU0hPUlRGTE9BVDsKIHR5cGVkZWYgU29mdEZsb2F0ICAgICAgICAgICBBQUNfRkxPQVQ7CkBAIC00NSw3ICs0Niw3IEBACiAjZGVmaW5lIFEzMCh4KSAgICAgICAgICAgICAgKGludCkoKHgpKjEwNzM3NDE4MjQuMCArIDAuNSkKICNkZWZpbmUgUTMxKHgpICAgICAgICAgICAgICAoaW50KSgoeCkqMjE0NzQ4MzY0OC4wICsgMC41KQogI2RlZmluZSBSQU5HRTE1KHgpICAgICAgICAgIHgKLSNkZWZpbmUgR0VUX0dBSU4oeCwgeSkgICAgICAoLSh5KSA8PCAoeCkpICsgMTAyNAorI2RlZmluZSBHRVRfR0FJTih4LCB5KSAgICAgICgtKHkpICogKDEgPDwgKHgpKSkgKyAxMDI0CiAjZGVmaW5lIEFBQ19NVUwxNih4LCB5KSAgICAgKGludCkoKChpbnQ2NF90KSh4KSAqICh5KSArIDB4ODAwMCkgPj4gMTYpCiAjZGVmaW5lIEFBQ19NVUwyNih4LCB5KSAgICAgKGludCkoKChpbnQ2NF90KSh4KSAqICh5KSArIDB4MjAwMDAwMCkgPj4gMjYpCiAjZGVmaW5lIEFBQ19NVUwzMCh4LCB5KSAgICAgKGludCkoKChpbnQ2NF90KSh4KSAqICh5KSArIDB4MjAwMDAwMDApID4+IDMwKQpAQCAtNzIsNyArNzMsNyBAQAogI2RlZmluZSBBQUNfTVNVQjMxX1YzKHgsIHksIHopICAgIChpbnQpKCgoKGludDY0X3QpKHgpICogKHopKSAtIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KSh5KSAqICh6KSkgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMCkgPj4gMzEpCi0jZGVmaW5lIEFBQ19IQUxGX1NVTSh4LCB5KSAgKHgpID4+IDEgKyAoeSkgPj4gMQorI2RlZmluZSBBQUNfSEFMRl9TVU0oeCwgeSkgICgoKHgpID4+IDEpICsgKCh5KSA+PiAxKSkKICNkZWZpbmUgQUFDX1NSQV9SKHgsIHkpICAgICAoaW50KSgoKHgpICsgKDEgPDwgKCh5KSAtIDEpKSkgPj4gKHkpKQogCiAjZWxzZQpAQCAtODMsMTUgKzg0LDE2IEBACiAjZGVmaW5lIEFBQ19SRU5BTUUoeCkgICAgICAgeAogI2RlZmluZSBBQUNfUkVOQU1FXzMyKHgpICAgIHgKIHR5cGVkZWYgZmxvYXQgICAgICAgICAgICAgICBJTlRGTE9BVDsKK3R5cGVkZWYgZmxvYXQgICAgICAgICAgICAgICBVSU5URkxPQVQ7CiB0eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAgSU5UNjRGTE9BVDsKIHR5cGVkZWYgZmxvYXQgICAgICAgICAgICAgICBTSE9SVEZMT0FUOwogdHlwZWRlZiBmbG9hdCAgICAgICAgICAgICAgIEFBQ19GTE9BVDsKIHR5cGVkZWYgdW5zaWduZWQgICAgICAgICAgICBBQUNfU0lHTkU7CiAjZGVmaW5lIEZJWFIoeCkgICAgICAgICAgICAgKChmbG9hdCkoeCkpCiAjZGVmaW5lIEZJWFIxMCh4KSAgICAgICAgICAgKChmbG9hdCkoeCkpCi0jZGVmaW5lIFEyMyh4KSAgICAgICAgICAgICAgeAotI2RlZmluZSBRMzAoeCkgICAgICAgICAgICAgIHgKLSNkZWZpbmUgUTMxKHgpICAgICAgICAgICAgICB4CisjZGVmaW5lIFEyMyh4KSAgICAgICAgICAgICAgKChmbG9hdCkoeCkpCisjZGVmaW5lIFEzMCh4KSAgICAgICAgICAgICAgKChmbG9hdCkoeCkpCisjZGVmaW5lIFEzMSh4KSAgICAgICAgICAgICAgKChmbG9hdCkoeCkpCiAjZGVmaW5lIFJBTkdFMTUoeCkgICAgICAgICAgKDMyNzY4LjAgKiAoeCkpCiAjZGVmaW5lIEdFVF9HQUlOKHgsIHkpICAgICAgcG93ZigoeCksIC0oeSkpCiAjZGVmaW5lIEFBQ19NVUwxNih4LCB5KSAgICAgKCh4KSAqICh5KSkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjX3BhcnNlci5jIGIvbGliYXZjb2RlYy9hYWNfcGFyc2VyLmMKaW5kZXggMGI4NjhlZC4uYjg2OTI2MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNfcGFyc2VyLmMKKysrIGIvbGliYXZjb2RlYy9hYWNfcGFyc2VyLmMKQEAgLTIyLDcgKzIyLDggQEAKIAogI2luY2x1ZGUgInBhcnNlci5oIgogI2luY2x1ZGUgImFhY19hYzNfcGFyc2VyLmgiCi0jaW5jbHVkZSAiYWFjYWR0c2RlYy5oIgorI2luY2x1ZGUgImFkdHNfaGVhZGVyLmgiCisjaW5jbHVkZSAiYWR0c19wYXJzZXIuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgIm1wZWc0YXVkaW8uaCIKIApAQCAtMzgsOSArMzksMTAgQEAKICAgICB9IHRtcDsKIAogICAgIHRtcC51NjQgPSBhdl9iZTJuZTY0KHN0YXRlKTsKLSAgICBpbml0X2dldF9iaXRzKCZiaXRzLCB0bXAudTgrOC1BQUNfQURUU19IRUFERVJfU0laRSwgQUFDX0FEVFNfSEVBREVSX1NJWkUgKiA4KTsKKyAgICBpbml0X2dldF9iaXRzKCZiaXRzLCB0bXAudTggKyA4IC0gQVZfQUFDX0FEVFNfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICBBVl9BQUNfQURUU19IRUFERVJfU0laRSAqIDgpOwogCi0gICAgaWYgKChzaXplID0gYXZwcml2X2FhY19wYXJzZV9oZWFkZXIoJmJpdHMsICZoZHIpKSA8IDApCisgICAgaWYgKChzaXplID0gZmZfYWR0c19oZWFkZXJfcGFyc2UoJmJpdHMsICZoZHIpKSA8IDApCiAgICAgICAgIHJldHVybiAwOwogICAgICpuZWVkX25leHRfaGVhZGVyID0gMDsKICAgICAqbmV3X2ZyYW1lX3N0YXJ0ICA9IDE7CkBAIC01NCw3ICs1Niw3IEBACiBzdGF0aWMgYXZfY29sZCBpbnQgYWFjX3BhcnNlX2luaXQoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMxKQogewogICAgIEFBQ0FDM1BhcnNlQ29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7Ci0gICAgcy0+aGVhZGVyX3NpemUgPSBBQUNfQURUU19IRUFERVJfU0laRTsKKyAgICBzLT5oZWFkZXJfc2l6ZSA9IEFWX0FBQ19BRFRTX0hFQURFUl9TSVpFOwogICAgIHMtPnN5bmMgPSBhYWNfc3luYzsKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjYWR0c2RlYy5jIGIvbGliYXZjb2RlYy9hYWNhZHRzZGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwODE0YWMuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9hYWNhZHRzZGVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQXVkaW8gYW5kIFZpZGVvIGZyYW1lIGV4dHJhY3Rpb24KLSAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKLSAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgQWxleCBDb252ZXJzZQotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSAiYWFjX2FjM19wYXJzZXIuaCIKLSNpbmNsdWRlICJhYWNhZHRzZGVjLmgiCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKLSNpbmNsdWRlICJtcGVnNGF1ZGlvLmgiCi0KLWludCBhdnByaXZfYWFjX3BhcnNlX2hlYWRlcihHZXRCaXRDb250ZXh0ICpnYmMsIEFBQ0FEVFNIZWFkZXJJbmZvICpoZHIpCi17Ci0gICAgaW50IHNpemUsIHJkYiwgY2gsIHNyOwotICAgIGludCBhb3QsIGNyY19hYnM7Ci0KLSAgICBpZiAoZ2V0X2JpdHMoZ2JjLCAxMikgIT0gMHhmZmYpCi0gICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX1NZTkM7Ci0KLSAgICBza2lwX2JpdHMxKGdiYyk7ICAgICAgICAgICAgIC8qIGlkICovCi0gICAgc2tpcF9iaXRzKGdiYywgMik7ICAgICAgICAgICAvKiBsYXllciAqLwotICAgIGNyY19hYnMgPSBnZXRfYml0czEoZ2JjKTsgICAgLyogcHJvdGVjdGlvbl9hYnNlbnQgKi8KLSAgICBhb3QgICAgID0gZ2V0X2JpdHMoZ2JjLCAyKTsgIC8qIHByb2ZpbGVfb2JqZWN0dHlwZSAqLwotICAgIHNyICAgICAgPSBnZXRfYml0cyhnYmMsIDQpOyAgLyogc2FtcGxlX2ZyZXF1ZW5jeV9pbmRleCAqLwotICAgIGlmICghYXZwcml2X21wZWc0YXVkaW9fc2FtcGxlX3JhdGVzW3NyXSkKLSAgICAgICAgcmV0dXJuIEFBQ19BQzNfUEFSU0VfRVJST1JfU0FNUExFX1JBVEU7Ci0gICAgc2tpcF9iaXRzMShnYmMpOyAgICAgICAgICAgICAvKiBwcml2YXRlX2JpdCAqLwotICAgIGNoID0gZ2V0X2JpdHMoZ2JjLCAzKTsgICAgICAgLyogY2hhbm5lbF9jb25maWd1cmF0aW9uICovCi0KLSAgICBza2lwX2JpdHMxKGdiYyk7ICAgICAgICAgICAgIC8qIG9yaWdpbmFsL2NvcHkgKi8KLSAgICBza2lwX2JpdHMxKGdiYyk7ICAgICAgICAgICAgIC8qIGhvbWUgKi8KLQotICAgIC8qIGFkdHNfdmFyaWFibGVfaGVhZGVyICovCi0gICAgc2tpcF9iaXRzMShnYmMpOyAgICAgICAgICAgICAvKiBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fYml0ICovCi0gICAgc2tpcF9iaXRzMShnYmMpOyAgICAgICAgICAgICAvKiBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fc3RhcnQgKi8KLSAgICBzaXplID0gZ2V0X2JpdHMoZ2JjLCAxMyk7ICAgIC8qIGFhY19mcmFtZV9sZW5ndGggKi8KLSAgICBpZiAoc2l6ZSA8IEFBQ19BRFRTX0hFQURFUl9TSVpFKQotICAgICAgICByZXR1cm4gQUFDX0FDM19QQVJTRV9FUlJPUl9GUkFNRV9TSVpFOwotCi0gICAgc2tpcF9iaXRzKGdiYywgMTEpOyAgICAgICAgICAvKiBhZHRzX2J1ZmZlcl9mdWxsbmVzcyAqLwotICAgIHJkYiA9IGdldF9iaXRzKGdiYywgMik7ICAgICAgLyogbnVtYmVyX29mX3Jhd19kYXRhX2Jsb2Nrc19pbl9mcmFtZSAqLwotCi0gICAgaGRyLT5vYmplY3RfdHlwZSAgICA9IGFvdCArIDE7Ci0gICAgaGRyLT5jaGFuX2NvbmZpZyAgICA9IGNoOwotICAgIGhkci0+Y3JjX2Fic2VudCAgICAgPSBjcmNfYWJzOwotICAgIGhkci0+bnVtX2FhY19mcmFtZXMgPSByZGIgKyAxOwotICAgIGhkci0+c2FtcGxpbmdfaW5kZXggPSBzcjsKLSAgICBoZHItPnNhbXBsZV9yYXRlICAgID0gYXZwcml2X21wZWc0YXVkaW9fc2FtcGxlX3JhdGVzW3NyXTsKLSAgICBoZHItPnNhbXBsZXMgICAgICAgID0gKHJkYiArIDEpICogMTAyNDsKLSAgICBoZHItPmJpdF9yYXRlICAgICAgID0gc2l6ZSAqIDggKiBoZHItPnNhbXBsZV9yYXRlIC8gaGRyLT5zYW1wbGVzOwotCi0gICAgcmV0dXJuIHNpemU7Ci19CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY2FkdHNkZWMuaCBiL2xpYmF2Y29kZWMvYWFjYWR0c2RlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU4NGVmLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvYWFjYWR0c2RlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIEFBQyBBRFRTIGhlYWRlciBkZWNvZGluZyBwcm90b3R5cGVzIGFuZCBzdHJ1Y3R1cmVzCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZuZGVmIEFWQ09ERUNfQUFDQURUU0RFQ19ICi0jZGVmaW5lIEFWQ09ERUNfQUFDQURUU0RFQ19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJnZXRfYml0cy5oIgotCi0jZGVmaW5lIEFBQ19BRFRTX0hFQURFUl9TSVpFIDcKLQotdHlwZWRlZiBzdHJ1Y3QgQUFDQURUU0hlYWRlckluZm8gewotICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlOwotICAgIHVpbnQzMl90IHNhbXBsZXM7Ci0gICAgdWludDMyX3QgYml0X3JhdGU7Ci0gICAgdWludDhfdCAgY3JjX2Fic2VudDsKLSAgICB1aW50OF90ICBvYmplY3RfdHlwZTsKLSAgICB1aW50OF90ICBzYW1wbGluZ19pbmRleDsKLSAgICB1aW50OF90ICBjaGFuX2NvbmZpZzsKLSAgICB1aW50OF90ICBudW1fYWFjX2ZyYW1lczsKLX0gQUFDQURUU0hlYWRlckluZm87Ci0KLS8qKgotICogUGFyc2UgQUFDIGZyYW1lIGhlYWRlci4KLSAqIFBhcnNlIHRoZSBBRFRTIGZyYW1lIGhlYWRlciB0byB0aGUgZW5kIG9mIHRoZSB2YXJpYWJsZSBoZWFkZXIsIHdoaWNoIGlzCi0gKiB0aGUgZmlyc3QgNTQgYml0cy4KLSAqIEBwYXJhbVtpbl0gIGdiYyBCaXRDb250ZXh0IGNvbnRhaW5pbmcgdGhlIGZpcnN0IDU0IGJpdHMgb2YgdGhlIGZyYW1lLgotICogQHBhcmFtW291dF0gaGRyIFBvaW50ZXIgdG8gc3RydWN0IHdoZXJlIGhlYWRlciBpbmZvIGlzIHdyaXR0ZW4uCi0gKiBAcmV0dXJuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBpZiB0aGVyZSBpcyBhIHN5bmMgd29yZCBtaXNtYXRjaCwKLSAqIC0yIGlmIHRoZSB2ZXJzaW9uIGVsZW1lbnQgaXMgaW52YWxpZCwgLTMgaWYgdGhlIHNhbXBsZSByYXRlCi0gKiBlbGVtZW50IGlzIGludmFsaWQsIG9yIC00IGlmIHRoZSBiaXQgcmF0ZSBlbGVtZW50IGlzIGludmFsaWQuCi0gKi8KLWludCBhdnByaXZfYWFjX3BhcnNlX2hlYWRlcihHZXRCaXRDb250ZXh0ICpnYmMsIEFBQ0FEVFNIZWFkZXJJbmZvICpoZHIpOwotCi0jZW5kaWYgLyogQVZDT0RFQ19BQUNBRFRTREVDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjY29kZXIuYyBiL2xpYmF2Y29kZWMvYWFjY29kZXIuYwppbmRleCBiY2ExZjU5Li5iYWE4MjQ4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhY2NvZGVyLmMKKysrIGIvbGliYXZjb2RlYy9hYWNjb2Rlci5jCkBAIC04OCw3ICs4OCw3IEBACiAgICAgZmxvYXQgbmV4dF9taW5yZCA9IElORklOSVRZOwogICAgIGludCBuZXh0X21pbmNiID0gMDsKIAotICAgIGFic19wb3czNF92KHMtPnNjb2Vmcywgc2NlLT5jb2VmZnMsIDEwMjQpOworICAgIHMtPmFic19wb3czNChzLT5zY29lZnMsIHNjZS0+Y29lZmZzLCAxMDI0KTsKICAgICBzdGFydCA9IHdpbioxMjg7CiAgICAgZm9yIChjYiA9IDA7IGNiIDwgQ0JfVE9UX0FMTDsgY2IrKykgewogICAgICAgICBwYXRoWzBdW2NiXS5jb3N0ICAgICA9IDAuMGY7CkBAIC0yMDAsNyArMjAwLDcgQEAKICAgICBpbnQgYmFuZHMgPSAwOwogCiAgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgewotICAgICAgICBmb3IgKGcgPSAwOyAgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CiAgICAgICAgICAgICBpZiAoc2NlLT56ZXJvZXNbdyoxNitnXSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChzY2UtPmJhbmRfdHlwZVt3KjE2K2ddID09IElOVEVOU0lUWV9CVCB8fCBzY2UtPmJhbmRfdHlwZVt3KjE2K2ddID09IElOVEVOU0lUWV9CVDIpIHsKQEAgLTIyMCw3ICsyMjAsNyBAQAogCiAgICAgLyogQ2xpcCB0aGUgc2NhbGVmYWN0b3IgaW5kaWNlcyAqLwogICAgIGZvciAodyA9IDA7IHcgPCBzY2UtPmljcy5udW1fd2luZG93czsgdyArPSBzY2UtPmljcy5ncm91cF9sZW5bd10pIHsKLSAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKKyAgICAgICAgZm9yIChnID0gMDsgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgewogICAgICAgICAgICAgaWYgKHNjZS0+emVyb2VzW3cqMTYrZ10pCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBpZiAoc2NlLT5iYW5kX3R5cGVbdyoxNitnXSA9PSBJTlRFTlNJVFlfQlQgfHwgc2NlLT5iYW5kX3R5cGVbdyoxNitnXSA9PSBJTlRFTlNJVFlfQlQyKSB7CkBAIC0yOTksNyArMjk5LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZHggPSAxOwotICAgIGFic19wb3czNF92KHMtPnNjb2Vmcywgc2NlLT5jb2VmZnMsIDEwMjQpOworICAgIHMtPmFic19wb3czNChzLT5zY29lZnMsIHNjZS0+Y29lZmZzLCAxMDI0KTsKICAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKSB7CiAgICAgICAgIHN0YXJ0ID0gdyoxMjg7CiAgICAgICAgIGZvciAoZyA9IDA7IGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKQEAgLTM4Nyw3ICszODcsNyBAQAogICAgIH0KICAgICAvL3NldCB0aGUgc2FtZSBxdWFudGl6ZXJzIGluc2lkZSB3aW5kb3cgZ3JvdXBzCiAgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkKLSAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspCisgICAgICAgIGZvciAoZyA9IDA7IGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspCiAgICAgICAgICAgICBmb3IgKHcyID0gMTsgdzIgPCBzY2UtPmljcy5ncm91cF9sZW5bd107IHcyKyspCiAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbKHcrdzIpKjE2K2ddID0gc2NlLT5zZl9pZHhbdyoxNitnXTsKIH0KQEAgLTM5NiwzNCArMzk2LDE0OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxhbWJkYSkKIHsKLSAgICBpbnQgaSwgdywgdzIsIGc7Ci0gICAgaW50IG1pbnEgPSAyNTU7CisgICAgaW50IHN0YXJ0ID0gMCwgaSwgdywgdzIsIGc7CisgICAgaW50IGRlc3RiaXRzID0gYXZjdHgtPmJpdF9yYXRlICogMTAyNC4wIC8gYXZjdHgtPnNhbXBsZV9yYXRlIC8gYXZjdHgtPmNoYW5uZWxzICogKGxhbWJkYSAvIDEyMC5mKTsKKyAgICBmbG9hdCBkaXN0c1sxMjhdID0geyAwIH0sIHVwbGltc1sxMjhdID0geyAwIH07CisgICAgZmxvYXQgbWF4dmFsc1sxMjhdOworICAgIGludCBmZmxhZywgbWluc2NhbGVyOworICAgIGludCBpdHMgID0gMDsKKyAgICBpbnQgYWxseiA9IDA7CisgICAgZmxvYXQgbWludGhyID0gSU5GSU5JVFk7CiAKLSAgICBtZW1zZXQoc2NlLT5zZl9pZHgsIDAsIHNpemVvZihzY2UtPnNmX2lkeCkpOworICAgIC8vIGZvciB2YWx1ZXMgYWJvdmUgdGhpcyB0aGUgZGVjb2RlciBtaWdodCBlbmQgdXAgaW4gYW4gZW5kbGVzcyBsb29wCisgICAgLy8gZHVlIHRvIGFsd2F5cyBoYXZpbmcgbW9yZSBiaXRzIHRoYW4gd2hhdCBjYW4gYmUgZW5jb2RlZC4KKyAgICBkZXN0Yml0cyA9IEZGTUlOKGRlc3RiaXRzLCA1ODAwKTsKKyAgICAvL3NvbWUgaGV1cmlzdGljIHRvIGRldGVybWluZSBpbml0aWFsIHF1YW50aXplcnMgd2lsbCByZWR1Y2Ugc2VhcmNoIHRpbWUKKyAgICAvL2RldGVybWluZSB6ZXJvIGJhbmRzIGFuZCB1cHBlciBsaW1pdHMKICAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKSB7CisgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgZm9yIChnID0gMDsgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICAgICAgaW50IG56ID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHVwbGltID0gMC4wZiwgZW5lcmd5ID0gMC4wZjsKICAgICAgICAgICAgIGZvciAodzIgPSAwOyB3MiA8IHNjZS0+aWNzLmdyb3VwX2xlblt3XTsgdzIrKykgewogICAgICAgICAgICAgICAgIEZGUHN5QmFuZCAqYmFuZCA9ICZzLT5wc3kuY2hbcy0+Y3VyX2NoYW5uZWxdLnBzeV9iYW5kc1sodyt3MikqMTYrZ107Ci0gICAgICAgICAgICAgICAgaWYgKGJhbmQtPmVuZXJneSA8PSBiYW5kLT50aHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbKHcrdzIpKjE2K2ddID0gMjE4OworICAgICAgICAgICAgICAgIHVwbGltICs9IGJhbmQtPnRocmVzaG9sZDsKKyAgICAgICAgICAgICAgICBlbmVyZ3kgKz0gYmFuZC0+ZW5lcmd5OworICAgICAgICAgICAgICAgIGlmIChiYW5kLT5lbmVyZ3kgPD0gYmFuZC0+dGhyZXNob2xkIHx8IGJhbmQtPnRocmVzaG9sZCA9PSAwLjBmKSB7CiAgICAgICAgICAgICAgICAgICAgIHNjZS0+emVyb2VzWyh3K3cyKSoxNitnXSA9IDE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbKHcrdzIpKjE2K2ddID0gYXZfY2xpcChTQ0FMRV9PTkVfUE9TIC0gU0NBTEVfRElWXzUxMiArIGxvZzJmKGJhbmQtPnRocmVzaG9sZCksIDgwLCAyMTgpOwotICAgICAgICAgICAgICAgICAgICBzY2UtPnplcm9lc1sodyt3MikqMTYrZ10gPSAwOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWlucSA9IEZGTUlOKG1pbnEsIHNjZS0+c2ZfaWR4Wyh3K3cyKSoxNitnXSk7CisgICAgICAgICAgICAgICAgbnogPSAxOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBsaW1zW3cqMTYrZ10gPSB1cGxpbSAqNTEyOworICAgICAgICAgICAgc2NlLT5iYW5kX3R5cGVbdyoxNitnXSA9IDA7CisgICAgICAgICAgICBzY2UtPnplcm9lc1t3KjE2K2ddID0gIW56OworICAgICAgICAgICAgaWYgKG56KQorICAgICAgICAgICAgICAgIG1pbnRociA9IEZGTUlOKG1pbnRociwgdXBsaW0pOworICAgICAgICAgICAgYWxseiB8PSBuejsKKyAgICAgICAgICAgIHN0YXJ0ICs9IHNjZS0+aWNzLnN3Yl9zaXplc1tnXTsKICAgICAgICAgfQogICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKLSAgICAgICAgc2NlLT5zZl9pZHhbaV0gPSAxNDA7Ci0gICAgICAgIC8vYXZfY2xpcChzY2UtPnNmX2lkeFtpXSwgbWlucSwgbWlucSArIFNDQUxFX01BWF9ESUZGIC0gMSk7CisgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgeworICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICBpZiAoc2NlLT56ZXJvZXNbdyoxNitnXSkgeworICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W3cqMTYrZ10gPSBTQ0FMRV9PTkVfUE9TOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSA9IFNDQUxFX09ORV9QT1MgKyBGRk1JTihsb2cyZih1cGxpbXNbdyoxNitnXS9taW50aHIpKjQsNTkpOworICAgICAgICB9CiAgICAgfQotICAgIC8vc2V0IHRoZSBzYW1lIHF1YW50aXplcnMgaW5zaWRlIHdpbmRvdyBncm91cHMKLSAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKQotICAgICAgICBmb3IgKGcgPSAwOyAgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykKLSAgICAgICAgICAgIGZvciAodzIgPSAxOyB3MiA8IHNjZS0+aWNzLmdyb3VwX2xlblt3XTsgdzIrKykKLSAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFsodyt3MikqMTYrZ10gPSBzY2UtPnNmX2lkeFt3KjE2K2ddOworCisgICAgaWYgKCFhbGx6KQorICAgICAgICByZXR1cm47CisgICAgcy0+YWJzX3BvdzM0KHMtPnNjb2Vmcywgc2NlLT5jb2VmZnMsIDEwMjQpOworICAgIGZmX3F1YW50aXplX2JhbmRfY29zdF9jYWNoZV9pbml0KHMpOworCisgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgeworICAgICAgICBzdGFydCA9IHcqMTI4OworICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqc2NhbGVkID0gcy0+c2NvZWZzICsgc3RhcnQ7CisgICAgICAgICAgICBtYXh2YWxzW3cqMTYrZ10gPSBmaW5kX21heF92YWwoc2NlLT5pY3MuZ3JvdXBfbGVuW3ddLCBzY2UtPmljcy5zd2Jfc2l6ZXNbZ10sIHNjYWxlZCk7CisgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3BlcmZvcm0gdHdvLWxvb3Agc2VhcmNoCisgICAgLy9vdXRlciBsb29wIC0gaW1wcm92ZSBxdWFsaXR5CisgICAgZG8geworICAgICAgICBpbnQgdGJpdHMsIHFzdGVwOworICAgICAgICBtaW5zY2FsZXIgPSBzY2UtPnNmX2lkeFswXTsKKyAgICAgICAgLy9pbm5lciBsb29wIC0gcXVhbnRpemUgc3BlY3RydW0gdG8gZml0IGludG8gZ2l2ZW4gbnVtYmVyIG9mIGJpdHMKKyAgICAgICAgcXN0ZXAgPSBpdHMgPyAxIDogMzI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludCBwcmV2ID0gLTE7CisgICAgICAgICAgICB0Yml0cyA9IDA7CisgICAgICAgICAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKSB7CisgICAgICAgICAgICAgICAgc3RhcnQgPSB3KjEyODsKKyAgICAgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb2VmcyA9IHNjZS0+Y29lZmZzICsgc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZWQgPSBzLT5zY29lZnMgKyBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgY2I7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRpc3QgPSAwLjBmOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzY2UtPnplcm9lc1t3KjE2K2ddIHx8IHNjZS0+c2ZfaWR4W3cqMTYrZ10gPj0gMjE4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArPSBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtaW5zY2FsZXIgPSBGRk1JTihtaW5zY2FsZXIsIHNjZS0+c2ZfaWR4W3cqMTYrZ10pOworICAgICAgICAgICAgICAgICAgICBjYiA9IGZpbmRfbWluX2Jvb2sobWF4dmFsc1t3KjE2K2ddLCBzY2UtPnNmX2lkeFt3KjE2K2ddKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh3MiA9IDA7IHcyIDwgc2NlLT5pY3MuZ3JvdXBfbGVuW3ddOyB3MisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gcXVhbnRpemVfYmFuZF9jb3N0X2NhY2hlZChzLCB3ICsgdzIsIGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnMgKyB3MioxMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkICsgdzIqMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFt3KjE2K2ddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiLCAxLjBmLCBJTkZJTklUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYiwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IGI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGlzdHNbdyoxNitnXSA9IGRpc3QgLSBiaXRzOworICAgICAgICAgICAgICAgICAgICBpZiAocHJldiAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSBmZl9hYWNfc2NhbGVmYWN0b3JfYml0c1tzY2UtPnNmX2lkeFt3KjE2K2ddIC0gcHJldiArIFNDQUxFX0RJRkZfWkVST107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGJpdHMgKz0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gc2NlLT5pY3Muc3diX3NpemVzW2ddOworICAgICAgICAgICAgICAgICAgICBwcmV2ID0gc2NlLT5zZl9pZHhbdyoxNitnXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGJpdHMgPiBkZXN0Yml0cykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjZS0+c2ZfaWR4W2ldIDwgMjE4IC0gcXN0ZXApCisgICAgICAgICAgICAgICAgICAgICAgICBzY2UtPnNmX2lkeFtpXSArPSBxc3RlcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoc2NlLT5zZl9pZHhbaV0gPiA2MCAtIHFzdGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbaV0gLT0gcXN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxc3RlcCA+Pj0gMTsKKyAgICAgICAgICAgIGlmICghcXN0ZXAgJiYgdGJpdHMgPiBkZXN0Yml0cyoxLjAyICYmIHNjZS0+c2ZfaWR4WzBdIDwgMjE3KQorICAgICAgICAgICAgICAgIHFzdGVwID0gMTsKKyAgICAgICAgfSB3aGlsZSAocXN0ZXApOworCisgICAgICAgIGZmbGFnID0gMDsKKyAgICAgICAgbWluc2NhbGVyID0gYXZfY2xpcChtaW5zY2FsZXIsIDYwLCAyNTUgLSBTQ0FMRV9NQVhfRElGRik7CisKKyAgICAgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgeworICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICAgICAgICAgIGludCBwcmV2c2MgPSBzY2UtPnNmX2lkeFt3KjE2K2ddOworICAgICAgICAgICAgICAgIGlmIChkaXN0c1t3KjE2K2ddID4gdXBsaW1zW3cqMTYrZ10gJiYgc2NlLT5zZl9pZHhbdyoxNitnXSA+IDYwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kX21pbl9ib29rKG1heHZhbHNbdyoxNitnXSwgc2NlLT5zZl9pZHhbdyoxNitnXS0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W3cqMTYrZ10tLTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAvL1RyeSB0byBtYWtlIHN1cmUgdGhlcmUgaXMgc29tZSBlbmVyZ3kgaW4gZXZlcnkgYmFuZAorICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXS09MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSA9IGF2X2NsaXAoc2NlLT5zZl9pZHhbdyoxNitnXSwgbWluc2NhbGVyLCBtaW5zY2FsZXIgKyBTQ0FMRV9NQVhfRElGRik7CisgICAgICAgICAgICAgICAgc2NlLT5zZl9pZHhbdyoxNitnXSA9IEZGTUlOKHNjZS0+c2ZfaWR4W3cqMTYrZ10sIDIxOSk7CisgICAgICAgICAgICAgICAgaWYgKHNjZS0+c2ZfaWR4W3cqMTYrZ10gIT0gcHJldnNjKQorICAgICAgICAgICAgICAgICAgICBmZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgc2NlLT5iYW5kX3R5cGVbdyoxNitnXSA9IGZpbmRfbWluX2Jvb2sobWF4dmFsc1t3KjE2K2ddLCBzY2UtPnNmX2lkeFt3KjE2K2ddKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdHMrKzsKKyAgICB9IHdoaWxlIChmZmxhZyAmJiBpdHMgPCAxMCk7CiB9CiAKIHN0YXRpYyB2b2lkIHNlYXJjaF9mb3JfcG5zKEFBQ0VuY0NvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSkKQEAgLTQ0MywxMyArNTU3LDEzIEBACiAgICAgY29uc3QgZmxvYXQgcG5zX3RyYW5zaWVudF9lbmVyZ3lfciA9IEZGTUlOKDAuN2YsIGxhbWJkYSAvIDE0MC5mKTsKIAogICAgIGludCByZWZiaXRzID0gYXZjdHgtPmJpdF9yYXRlICogMTAyNC4wIC8gYXZjdHgtPnNhbXBsZV9yYXRlCi0gICAgICAgIC8gKChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkgPyAyLjBmIDogYXZjdHgtPmNoYW5uZWxzKQorICAgICAgICAvICgoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19RU0NBTEUpID8gMi4wZiA6IGF2Y3R4LT5jaGFubmVscykKICAgICAgICAgKiAobGFtYmRhIC8gMTIwLmYpOwogCiAgICAgLyoqIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdHdvbG9vcCdzIGN1dG9mZiBzZWxlY3Rpb24gKi8KICAgICBmbG9hdCByYXRlX2JhbmR3aWR0aF9tdWx0aXBsaWVyID0gMS41ZjsKICAgICBpbnQgcHJldiA9IC0xMDAwLCBwcmV2X3NmID0gLTE7Ci0gICAgaW50IGZyYW1lX2JpdF9yYXRlID0gKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKQorICAgIGludCBmcmFtZV9iaXRfcmF0ZSA9IChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FTQ0FMRSkKICAgICAgICAgPyAocmVmYml0cyAqIHJhdGVfYmFuZHdpZHRoX211bHRpcGxpZXIgKiBhdmN0eC0+c2FtcGxlX3JhdGUgLyAxMDI0KQogICAgICAgICA6IChhdmN0eC0+Yml0X3JhdGUgLyBhdmN0eC0+Y2hhbm5lbHMpOwogCkBAIC00NjcsNyArNTgxLDcgQEAKICAgICBmZl9pbml0X25leHRiYW5kX21hcChzY2UsIG5leHRiYW5kKTsKICAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKSB7CiAgICAgICAgIGludCB3c3RhcnQgPSB3KjEyODsKLSAgICAgICAgZm9yIChnID0gMDsgIGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKKyAgICAgICAgZm9yIChnID0gMDsgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgewogICAgICAgICAgICAgaW50IG5vaXNlX3NmaTsKICAgICAgICAgICAgIGZsb2F0IGRpc3QxID0gMC4wZiwgZGlzdDIgPSAwLjBmLCBub2lzZV9hbXA7CiAgICAgICAgICAgICBmbG9hdCBwbnNfZW5lcmd5ID0gMC4wZiwgcG5zX3RndF9lbmVyZ3ksIGVuZXJneV9yYXRpbywgZGlzdF90aHJlc2g7CkBAIC01MjksMTkgKzY0MywxNyBAQAogICAgICAgICAgICAgICAgIGZsb2F0IGJhbmRfZW5lcmd5LCBzY2FsZSwgcG5zX3NlbmVyZ3k7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0YXJ0X2MgPSAodyt3MikqMTI4K3NjZS0+aWNzLnN3Yl9vZmZzZXRbZ107CiAgICAgICAgICAgICAgICAgYmFuZCA9ICZzLT5wc3kuY2hbcy0+Y3VyX2NoYW5uZWxdLnBzeV9iYW5kc1sodyt3MikqMTYrZ107Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjZS0+aWNzLnN3Yl9zaXplc1tnXTsgaSs9MikgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgcm5kWzJdOwotICAgICAgICAgICAgICAgICAgICBhdl9ibWdfZ2V0KCZzLT5sZmcsIHJuZCk7Ci0gICAgICAgICAgICAgICAgICAgIFBOU1tpKzBdID0gKGZsb2F0KXJuZFswXTsKLSAgICAgICAgICAgICAgICAgICAgUE5TW2krMV0gPSAoZmxvYXQpcm5kWzFdOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzY2UtPmljcy5zd2Jfc2l6ZXNbZ107IGkrKykgeworICAgICAgICAgICAgICAgICAgICBzLT5yYW5kb21fc3RhdGUgID0gbGNnX3JhbmRvbShzLT5yYW5kb21fc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBQTlNbaV0gPSBzLT5yYW5kb21fc3RhdGU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJhbmRfZW5lcmd5ID0gcy0+ZmRzcC0+c2NhbGFycHJvZHVjdF9mbG9hdChQTlMsIFBOUywgc2NlLT5pY3Muc3diX3NpemVzW2ddKTsKICAgICAgICAgICAgICAgICBzY2FsZSA9IG5vaXNlX2FtcC9zcXJ0ZihiYW5kX2VuZXJneSk7CiAgICAgICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKFBOUywgUE5TLCBzY2FsZSwgc2NlLT5pY3Muc3diX3NpemVzW2ddKTsKICAgICAgICAgICAgICAgICBwbnNfc2VuZXJneSA9IHMtPmZkc3AtPnNjYWxhcnByb2R1Y3RfZmxvYXQoUE5TLCBQTlMsIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSk7CiAgICAgICAgICAgICAgICAgcG5zX2VuZXJneSArPSBwbnNfc2VuZXJneTsKLSAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihOT1IzNCwgJnNjZS0+Y29lZmZzW3N0YXJ0X2NdLCBzY2UtPmljcy5zd2Jfc2l6ZXNbZ10pOwotICAgICAgICAgICAgICAgIGFic19wb3czNF92KFBOUzM0LCBQTlMsIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSk7CisgICAgICAgICAgICAgICAgcy0+YWJzX3BvdzM0KE5PUjM0LCAmc2NlLT5jb2VmZnNbc3RhcnRfY10sIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSk7CisgICAgICAgICAgICAgICAgcy0+YWJzX3BvdzM0KFBOUzM0LCBQTlMsIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSk7CiAgICAgICAgICAgICAgICAgZGlzdDEgKz0gcXVhbnRpemVfYmFuZF9jb3N0KHMsICZzY2UtPmNvZWZmc1tzdGFydF9jXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9SMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSwKQEAgLTU4MiwxMiArNjk0LDEyIEBACiAgICAgY29uc3QgZmxvYXQgcG5zX3RyYW5zaWVudF9lbmVyZ3lfciA9IEZGTUlOKDAuN2YsIGxhbWJkYSAvIDE0MC5mKTsKIAogICAgIGludCByZWZiaXRzID0gYXZjdHgtPmJpdF9yYXRlICogMTAyNC4wIC8gYXZjdHgtPnNhbXBsZV9yYXRlCi0gICAgICAgIC8gKChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkgPyAyLjBmIDogYXZjdHgtPmNoYW5uZWxzKQorICAgICAgICAvICgoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19RU0NBTEUpID8gMi4wZiA6IGF2Y3R4LT5jaGFubmVscykKICAgICAgICAgKiAobGFtYmRhIC8gMTIwLmYpOwogCiAgICAgLyoqIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggdHdvbG9vcCdzIGN1dG9mZiBzZWxlY3Rpb24gKi8KICAgICBmbG9hdCByYXRlX2JhbmR3aWR0aF9tdWx0aXBsaWVyID0gMS41ZjsKLSAgICBpbnQgZnJhbWVfYml0X3JhdGUgPSAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpCisgICAgaW50IGZyYW1lX2JpdF9yYXRlID0gKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKQogICAgICAgICA/IChyZWZiaXRzICogcmF0ZV9iYW5kd2lkdGhfbXVsdGlwbGllciAqIGF2Y3R4LT5zYW1wbGVfcmF0ZSAvIDEwMjQpCiAgICAgICAgIDogKGF2Y3R4LT5iaXRfcmF0ZSAvIGF2Y3R4LT5jaGFubmVscyk7CiAKQEAgLTYwMyw3ICs3MTUsNyBAQAogCiAgICAgbWVtY3B5KHNjZS0+YmFuZF9hbHQsIHNjZS0+YmFuZF90eXBlLCBzaXplb2Yoc2NlLT5iYW5kX3R5cGUpKTsKICAgICBmb3IgKHcgPSAwOyB3IDwgc2NlLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlLT5pY3MuZ3JvdXBfbGVuW3ddKSB7Ci0gICAgICAgIGZvciAoZyA9IDA7ICBnIDwgc2NlLT5pY3MubnVtX3N3YjsgZysrKSB7CisgICAgICAgIGZvciAoZyA9IDA7IGcgPCBzY2UtPmljcy5udW1fc3diOyBnKyspIHsKICAgICAgICAgICAgIGZsb2F0IHNmYl9lbmVyZ3kgPSAwLjBmLCB0aHJlc2hvbGQgPSAwLjBmLCBzcHJlYWQgPSAyLjBmOwogICAgICAgICAgICAgZmxvYXQgbWluX2VuZXJneSA9IC0xLjBmLCBtYXhfZW5lcmd5ID0gMC4wZjsKICAgICAgICAgICAgIGNvbnN0IGludCBzdGFydCA9IHNjZS0+aWNzLnN3Yl9vZmZzZXRbZ107CkBAIC02NDUsOCArNzU3LDkgQEAKIHsKICAgICBpbnQgc3RhcnQgPSAwLCBpLCB3LCB3MiwgZywgc2lkX3NmX2Jvb3N0LCBwcmV2X21pZCwgcHJldl9zaWRlOwogICAgIHVpbnQ4X3QgbmV4dGJhbmQwWzEyOF0sIG5leHRiYW5kMVsxMjhdOwotICAgIGZsb2F0IE1bMTI4XSwgU1sxMjhdOwotICAgIGZsb2F0ICpMMzQgPSBzLT5zY29lZnMsICpSMzQgPSBzLT5zY29lZnMgKyAxMjgsICpNMzQgPSBzLT5zY29lZnMgKyAxMjgqMiwgKlMzNCA9IHMtPnNjb2VmcyArIDEyOCozOworICAgIGZsb2F0ICpNICAgPSBzLT5zY29lZnMgKyAxMjgqMCwgKlMgICA9IHMtPnNjb2VmcyArIDEyOCoxOworICAgIGZsb2F0ICpMMzQgPSBzLT5zY29lZnMgKyAxMjgqMiwgKlIzNCA9IHMtPnNjb2VmcyArIDEyOCozOworICAgIGZsb2F0ICpNMzQgPSBzLT5zY29lZnMgKyAxMjgqNCwgKlMzNCA9IHMtPnNjb2VmcyArIDEyOCo1OwogICAgIGNvbnN0IGZsb2F0IGxhbWJkYSA9IHMtPmxhbWJkYTsKICAgICBjb25zdCBmbG9hdCBtc2xhbWJkYSA9IEZGTUlOKDEuMGYsIGxhbWJkYSAvIDEyMC5mKTsKICAgICBTaW5nbGVDaGFubmVsRWxlbWVudCAqc2NlMCA9ICZjcGUtPmNoWzBdOwpAQCAtNjYyLDcgKzc3NSw3IEBACiAgICAgcHJldl9zaWRlID0gc2NlMS0+c2ZfaWR4WzBdOwogICAgIGZvciAodyA9IDA7IHcgPCBzY2UwLT5pY3MubnVtX3dpbmRvd3M7IHcgKz0gc2NlMC0+aWNzLmdyb3VwX2xlblt3XSkgewogICAgICAgICBzdGFydCA9IDA7Ci0gICAgICAgIGZvciAoZyA9IDA7ICBnIDwgc2NlMC0+aWNzLm51bV9zd2I7IGcrKykgeworICAgICAgICBmb3IgKGcgPSAwOyBnIDwgc2NlMC0+aWNzLm51bV9zd2I7IGcrKykgewogICAgICAgICAgICAgZmxvYXQgYm1heCA9IGJ2YWwyYm1heChnICogMTcuMGYgLyBzY2UwLT5pY3MubnVtX3N3YikgLyAwLjAwNDVmOwogICAgICAgICAgICAgaWYgKCFjcGUtPmlzX21hc2tbdyoxNitnXSkKICAgICAgICAgICAgICAgICBjcGUtPm1zX21hc2tbdyoxNitnXSA9IDA7CkBAIC02NzcsOCArNzkwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIFNbaV0gPSAgTVtpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzY2UxLT5jb2VmZnNbc3RhcnQrKHcrdzIpKjEyOCtpXTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihNMzQsIE0sIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOwotICAgICAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihTMzQsIFMsIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOworICAgICAgICAgICAgICAgICAgICBzLT5hYnNfcG93MzQoTTM0LCBNLCBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+YWJzX3BvdzM0KFMzNCwgUywgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzY2UwLT5pY3Muc3diX3NpemVzW2ddOyBpKysgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBNbWF4ID0gRkZNQVgoTW1heCwgTTM0W2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFNtYXggPSBGRk1BWChTbWF4LCBTMzRbaV0pOwpAQCAtNzIxLDEwICs4MzQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNjZTEtPmNvZWZmc1tzdGFydCsodyt3MikqMTI4K2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihMMzQsIHNjZTAtPmNvZWZmcytzdGFydCsodyt3MikqMTI4LCBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFic19wb3czNF92KFIzNCwgc2NlMS0+Y29lZmZzK3N0YXJ0Kyh3K3cyKSoxMjgsIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOwotICAgICAgICAgICAgICAgICAgICAgICAgYWJzX3BvdzM0X3YoTTM0LCBNLCAgICAgICAgICAgICAgICAgICAgICAgICBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFic19wb3czNF92KFMzNCwgUywgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5hYnNfcG93MzQoTDM0LCBzY2UwLT5jb2VmZnMrc3RhcnQrKHcrdzIpKjEyOCwgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5hYnNfcG93MzQoUjM0LCBzY2UxLT5jb2VmZnMrc3RhcnQrKHcrdzIpKjEyOCwgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5hYnNfcG93MzQoTTM0LCBNLCAgICAgICAgICAgICAgICAgICAgICAgICBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmFic19wb3czNChTMzQsIFMsICAgICAgICAgICAgICAgICAgICAgICAgIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOwogICAgICAgICAgICAgICAgICAgICAgICAgZGlzdDEgKz0gcXVhbnRpemVfYmFuZF9jb3N0KHMsICZzY2UwLT5jb2VmZnNbc3RhcnQgKyAodyt3MikqMTI4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSwKQEAgLTc4MSw3ICs4OTQsNyBAQAogICAgIH0KIH0KIAotQUFDQ29lZmZpY2llbnRzRW5jb2RlciBmZl9hYWNfY29kZXJzW0FBQ19DT0RFUl9OQl0gPSB7Citjb25zdCBBQUNDb2VmZmljaWVudHNFbmNvZGVyIGZmX2FhY19jb2RlcnNbQUFDX0NPREVSX05CXSA9IHsKICAgICBbQUFDX0NPREVSX0FOTVJdID0gewogICAgICAgICBzZWFyY2hfZm9yX3F1YW50aXplcnNfYW5tciwKICAgICAgICAgZW5jb2RlX3dpbmRvd19iYW5kc19pbmZvLApAQCAtODI4LDcgKzk0MSw3IEBACiAgICAgfSwKICAgICBbQUFDX0NPREVSX0ZBU1RdID0gewogICAgICAgICBzZWFyY2hfZm9yX3F1YW50aXplcnNfZmFzdCwKLSAgICAgICAgZW5jb2RlX3dpbmRvd19iYW5kc19pbmZvLAorICAgICAgICBjb2RlYm9va190cmVsbGlzX3JhdGUsCiAgICAgICAgIHF1YW50aXplX2FuZF9lbmNvZGVfYmFuZCwKICAgICAgICAgZmZfYWFjX2VuY29kZV90bnNfaW5mbywKICAgICAgICAgZmZfYWFjX2VuY29kZV9sdHBfaW5mbywKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjY29kZXJfdHJlbGxpcy5oIGIvbGliYXZjb2RlYy9hYWNjb2Rlcl90cmVsbGlzLmgKaW5kZXggMDIzMDA1Mi4uOTQwZWJmMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNjb2Rlcl90cmVsbGlzLmgKKysrIGIvbGliYXZjb2RlYy9hYWNjb2Rlcl90cmVsbGlzLmgKQEAgLTcwLDcgKzcwLDcgQEAKICAgICBmbG9hdCBuZXh0X21pbmJpdHMgPSBJTkZJTklUWTsKICAgICBpbnQgbmV4dF9taW5jYiA9IDA7CiAKLSAgICBhYnNfcG93MzRfdihzLT5zY29lZnMsIHNjZS0+Y29lZmZzLCAxMDI0KTsKKyAgICBzLT5hYnNfcG93MzQocy0+c2NvZWZzLCBzY2UtPmNvZWZmcywgMTAyNCk7CiAgICAgc3RhcnQgPSB3aW4qMTI4OwogICAgIGZvciAoY2IgPSAwOyBjYiA8IENCX1RPVF9BTEw7IGNiKyspIHsKICAgICAgICAgcGF0aFswXVtjYl0uY29zdCAgICAgPSBydW5fYml0cys0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWNjb2Rlcl90d29sb29wLmggYi9saWJhdmNvZGVjL2FhY2NvZGVyX3R3b2xvb3AuaAppbmRleCAzOTdhNGRiLi44ZTFiYzg4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhY2NvZGVyX3R3b2xvb3AuaAorKysgYi9saWJhdmNvZGVjL2FhY2NvZGVyX3R3b2xvb3AuaApAQCAtNzEsMTMgKzcxLDEzIEBACiB7CiAgICAgaW50IHN0YXJ0ID0gMCwgaSwgdywgdzIsIGcsIHJlY29tcHJkOwogICAgIGludCBkZXN0Yml0cyA9IGF2Y3R4LT5iaXRfcmF0ZSAqIDEwMjQuMCAvIGF2Y3R4LT5zYW1wbGVfcmF0ZQotICAgICAgICAvICgoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpID8gMi4wZiA6IGF2Y3R4LT5jaGFubmVscykKKyAgICAgICAgLyAoKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKSA/IDIuMGYgOiBhdmN0eC0+Y2hhbm5lbHMpCiAgICAgICAgICogKGxhbWJkYSAvIDEyMC5mKTsKICAgICBpbnQgcmVmYml0cyA9IGRlc3RiaXRzOwogICAgIGludCB0b29tYW55Yml0cywgdG9vZmV3Yml0czsKICAgICBjaGFyIG56c1sxMjhdOwogICAgIHVpbnQ4X3QgbmV4dGJhbmRbMTI4XTsKLSAgICBpbnQgbWF4c2ZbMTI4XTsKKyAgICBpbnQgbWF4c2ZbMTI4XSwgbWluc2ZbMTI4XTsKICAgICBmbG9hdCBkaXN0c1sxMjhdID0geyAwIH0sIHFlbmVyZ2llc1sxMjhdID0geyAwIH0sIHVwbGltc1sxMjhdLCBldXBsaW1zWzEyOF0sIGVuZXJnaWVzWzEyOF07CiAgICAgZmxvYXQgbWF4dmFsc1sxMjhdLCBzcHJlYWRfdGhyX3JbMTI4XTsKICAgICBmbG9hdCBtaW5fc3ByZWFkX3Rocl9yLCBtYXhfc3ByZWFkX3Rocl9yOwpAQCAtODcsNyArODcsNyBAQAogICAgICAqIHdpbGwga2VlcCBpdGVyYXRpbmcgdW50aWwgaXQgZmFpbHMgdG8gbG93ZXIgaXQgb3IgaXQgcmVhY2hlcwogICAgICAqIHVsaW1pdCAqIHJkbGFtYmRhLiBLZWVwaW5nIGl0IGxvdyBpbmNyZWFzZXMgcXVhbGl0eSBvbiBkaWZmaWN1bHQKICAgICAgKiBzaWduYWxzLCBidXQgbG93ZXIgaXQgdG9vIG11Y2gsIGFuZCBiaXRzIHdpbGwgYmUgdGFrZW4gZnJvbSB3ZWFrCi0gICAgICogc2lnbmFscywgY3JlYXRpbmcgImhvbGVzIi4gQSBiYWxhbmNlIGlzIG5lY2VzYXJ5LgorICAgICAqIHNpZ25hbHMsIGNyZWF0aW5nICJob2xlcyIuIEEgYmFsYW5jZSBpcyBuZWNlc3NhcnkuCiAgICAgICogcmRtYXggYW5kIHJkbWluIHNwZWNpZnkgdGhlIHJlbGF0aXZlIGRldmlhdGlvbiBmcm9tIHJkbGFtYmRhCiAgICAgICogYWxsb3dlZCBmb3IgdG9uYWxpdHkgY29tcGVuc2F0aW9uCiAgICAgICovCkBAIC0xMzYsNyArMTM2LDcgQEAKICAgICAgICAgICAgICogKGxhbWJkYSAvIChhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgPyBhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgOiAxMjApKTsKICAgICB9CiAKLSAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpIHsKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19RU0NBTEUpIHsKICAgICAgICAgLyoqCiAgICAgICAgICAqIENvbnN0YW50IFEtc2NhbGUgZG9lc24ndCBjb21wZW5zYXRlIE1TIGNvZGluZyBvbiBpdHMgb3duCiAgICAgICAgICAqIE5vIG5lZWQgdG8gYmUgb3Zlcmx5IHByZWNpc2UsIHRoaXMgb25seSBjb250cm9scyBSRApAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgICAqIEFBQ19DVVRPRkZfRlJPTV9CSVRSQVRFIGlzIGNhbGlicmF0ZWQgZm9yIGVmZmVjdGl2ZSBiaXRyYXRlLgogICAgICAgICAgKi8KICAgICAgICAgZmxvYXQgcmF0ZV9iYW5kd2lkdGhfbXVsdGlwbGllciA9IDEuNWY7Ci0gICAgICAgIGludCBmcmFtZV9iaXRfcmF0ZSA9IChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkKKyAgICAgICAgaW50IGZyYW1lX2JpdF9yYXRlID0gKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKQogICAgICAgICAgICAgPyAocmVmYml0cyAqIHJhdGVfYmFuZHdpZHRoX211bHRpcGxpZXIgKiBhdmN0eC0+c2FtcGxlX3JhdGUgLyAxMDI0KQogICAgICAgICAgICAgOiAoYXZjdHgtPmJpdF9yYXRlIC8gYXZjdHgtPmNoYW5uZWxzKTsKIApAQCAtMjkxLDE0ICsyOTEsMjIgQEAKIAogICAgIGlmICghYWxseikKICAgICAgICAgcmV0dXJuOwotICAgIGFic19wb3czNF92KHMtPnNjb2Vmcywgc2NlLT5jb2VmZnMsIDEwMjQpOworICAgIHMtPmFic19wb3czNChzLT5zY29lZnMsIHNjZS0+Y29lZmZzLCAxMDI0KTsKICAgICBmZl9xdWFudGl6ZV9iYW5kX2Nvc3RfY2FjaGVfaW5pdChzKTsKIAorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YobWluc2YpIC8gc2l6ZW9mKG1pbnNmWzBdKTsgKytpKQorICAgICAgICBtaW5zZltpXSA9IDA7CiAgICAgZm9yICh3ID0gMDsgdyA8IHNjZS0+aWNzLm51bV93aW5kb3dzOyB3ICs9IHNjZS0+aWNzLmdyb3VwX2xlblt3XSkgewogICAgICAgICBzdGFydCA9IHcqMTI4OwogICAgICAgICBmb3IgKGcgPSAwOyAgZyA8IHNjZS0+aWNzLm51bV9zd2I7IGcrKykgewogICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNjYWxlZCA9IHMtPnNjb2VmcyArIHN0YXJ0OworICAgICAgICAgICAgaW50IG1pbnNmaWR4OwogICAgICAgICAgICAgbWF4dmFsc1t3KjE2K2ddID0gZmluZF9tYXhfdmFsKHNjZS0+aWNzLmdyb3VwX2xlblt3XSwgc2NlLT5pY3Muc3diX3NpemVzW2ddLCBzY2FsZWQpOworICAgICAgICAgICAgaWYgKG1heHZhbHNbdyoxNitnXSA+IDApIHsKKyAgICAgICAgICAgICAgICBtaW5zZmlkeCA9IGNvZWYybWluc2YobWF4dmFsc1t3KjE2K2ddKTsKKyAgICAgICAgICAgICAgICBmb3IgKHcyID0gMDsgdzIgPCBzY2UtPmljcy5ncm91cF9sZW5bd107IHcyKyspCisgICAgICAgICAgICAgICAgICAgIG1pbnNmWyh3K3cyKSoxNitnXSA9IG1pbnNmaWR4OworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhcnQgKz0gc2NlLT5pY3Muc3diX3NpemVzW2ddOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI0LDcgKzMzMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNjZS0+Y29lZmZzICsgc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgIG56c2xvcGUgKiBjbGVhbnVwX2ZhY3Rvcik7CiAgICAgICAgICAgICAgICAgZW5lcmd5MnVwbGltICo9IGRlX3BzeV9mYWN0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19RU0NBTEUpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qKiBJbiBBQlIsIHdlIG5lZWQgdG8gcHJpb3JpemUgbGVzcyBhbmQgbGV0IHJhdGUgY29udHJvbCBkbyBpdHMgdGhpbmcgKi8KICAgICAgICAgICAgICAgICAgICAgZW5lcmd5MnVwbGltID0gc3FydGYoZW5lcmd5MnVwbGltKTsKICAgICAgICAgICAgICAgICB9CkBAIC0zMzgsNyArMzQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2NlLT5jb2VmZnMgKyBzdGFydCwKICAgICAgICAgICAgICAgICAgICAgMi4wZik7CiAgICAgICAgICAgICAgICAgZW5lcmd5MnVwbGltICo9IGRlX3BzeV9mYWN0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCEoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19RU0NBTEUpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qKiBJbiBBQlIsIHdlIG5lZWQgdG8gcHJpb3JpemUgbGVzcyBhbmQgbGV0IHJhdGUgY29udHJvbCBkbyBpdHMgdGhpbmcgKi8KICAgICAgICAgICAgICAgICAgICAgZW5lcmd5MnVwbGltID0gc3FydGYoZW5lcmd5MnVwbGltKTsKICAgICAgICAgICAgICAgICB9CkBAIC00MjUsNyArNDMzLDcgQEAKICAgICAgICAgICAgICAgICByZWNvbXByZCA9IDE7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzY2UtPnNmX2lkeFtpXSA+IFNDQUxFX09ORV9QT1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfc2YgPSBGRk1BWChTQ0FMRV9PTkVfUE9TLCBzY2UtPnNmX2lkeFtpXSAtIHFzdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfc2YgPSBGRk1BWDMobWluc2ZbaV0sIFNDQUxFX09ORV9QT1MsIHNjZS0+c2ZfaWR4W2ldIC0gcXN0ZXApOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld19zZiAhPSBzY2UtPnNmX2lkeFtpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4W2ldID0gbmV3X3NmOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOwpAQCAtNTk1LDcgKzYwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGludCBjbWIgPSBmaW5kX21pbl9ib29rKG1heHZhbHNbdyoxNitnXSwgc2NlLT5zZl9pZHhbdyoxNitnXSk7CiAgICAgICAgICAgICAgICAgICAgIGludCBtaW5kZWx0YXNmID0gRkZNQVgoMCwgcHJldiAtIFNDQUxFX01BWF9ESUZGKTsKICAgICAgICAgICAgICAgICAgICAgaW50IG1heGRlbHRhc2YgPSBGRk1JTihTQ0FMRV9NQVhfUE9TIC0gU0NBTEVfRElWXzUxMiwgcHJldiArIFNDQUxFX01BWF9ESUZGKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCghY21iIHx8IGRpc3RzW3cqMTYrZ10gPiB1cGxpbXNbdyoxNitnXSkgJiYgc2NlLT5zZl9pZHhbdyoxNitnXSA+IG1pbmRlbHRhc2YpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCghY21iIHx8IGRpc3RzW3cqMTYrZ10gPiB1cGxpbXNbdyoxNitnXSkgJiYgc2NlLT5zZl9pZHhbdyoxNitnXSA+IEZGTUFYKG1pbmRlbHRhc2YsIG1pbnNmW3cqMTYrZ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gbWFrZSBzdXJlIHRoZXJlIGlzIHNvbWUgZW5lcmd5IGluIGV2ZXJ5IG5vbnplcm8gYmFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICogTk9URTogVGhpcyBhbGdvcml0aG0gbXVzdCBiZSBmb3JjaWJseSBpbWJhbGFuY2VkLCBwdXNoaW5nIGhhcmRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICogIG9uIGhvbGVzIG9yIG1vcmUgZGlzdG9ydGVkIGJhbmRzIGF0IGZpcnN0LCBvdGhlcndpc2UgdGhlcmUncwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWNkZWMuYyBiL2xpYmF2Y29kZWMvYWFjZGVjLmMKaW5kZXggMjZiZGVhMS4uZDM5NDcwMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNkZWMuYworKysgYi9saWJhdmNvZGVjL2FhY2RlYy5jCkBAIC00Miw3ICs0Miw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImZmdC5oIgotI2luY2x1ZGUgImltZGN0MTUuaCIKKyNpbmNsdWRlICJtZGN0MTUuaCIKICNpbmNsdWRlICJscGMuaCIKICNpbmNsdWRlICJrYmR3aW4uaCIKICNpbmNsdWRlICJzaW5ld2luLmgiCkBAIC01MCwxMSArNTAsMTEgQEAKICNpbmNsdWRlICJhYWMuaCIKICNpbmNsdWRlICJhYWN0YWIuaCIKICNpbmNsdWRlICJhYWNkZWN0YWIuaCIKLSNpbmNsdWRlICJjYnJ0X3RhYmxlZ2VuLmgiCisjaW5jbHVkZSAiYWR0c19oZWFkZXIuaCIKKyNpbmNsdWRlICJjYnJ0X2RhdGEuaCIKICNpbmNsdWRlICJzYnIuaCIKICNpbmNsdWRlICJhYWNzYnIuaCIKICNpbmNsdWRlICJtcGVnNGF1ZGlvLmgiCi0jaW5jbHVkZSAiYWFjYWR0c2RlYy5oIgogI2luY2x1ZGUgInByb2ZpbGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCiAKQEAgLTI4NCw0MiArMjg0LDQ4IEBACiAgICAgQUFDQ29udGV4dCAqYWMgICAgICAgID0gJmxhdG1jdHgtPmFhY19jdHg7CiAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gYWMtPmF2Y3R4OwogICAgIE1QRUc0QXVkaW9Db25maWcgbTRhYyA9IHsgMCB9OworICAgIEdldEJpdENvbnRleHQgZ2JjOwogICAgIGludCBjb25maWdfc3RhcnRfYml0ICA9IGdldF9iaXRzX2NvdW50KGdiKTsKICAgICBpbnQgc3luY19leHRlbnNpb24gICAgPSAwOwotICAgIGludCBiaXRzX2NvbnN1bWVkLCBlc2l6ZTsKKyAgICBpbnQgYml0c19jb25zdW1lZCwgZXNpemUsIGk7CiAKLSAgICBpZiAoYXNjbGVuKSB7CisgICAgaWYgKGFzY2xlbiA+IDApIHsKICAgICAgICAgc3luY19leHRlbnNpb24gPSAxOwogICAgICAgICBhc2NsZW4gICAgICAgICA9IEZGTUlOKGFzY2xlbiwgZ2V0X2JpdHNfbGVmdChnYikpOwotICAgIH0gZWxzZQotICAgICAgICBhc2NsZW4gICAgICAgICA9IGdldF9iaXRzX2xlZnQoZ2IpOwotCi0gICAgaWYgKGNvbmZpZ19zdGFydF9iaXQgJSA4KSB7Ci0gICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShsYXRtY3R4LT5hYWNfY3R4LmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1ieXRlLWFsaWduZWQgYXVkaW8tc3BlY2lmaWMgY29uZmlnIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2JjLCBnYi0+YnVmZmVyLCBjb25maWdfc3RhcnRfYml0ICsgYXNjbGVuKTsKKyAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiYywgY29uZmlnX3N0YXJ0X2JpdCk7CisgICAgfSBlbHNlIGlmIChhc2NsZW4gPT0gMCkgeworICAgICAgICBnYmMgPSAqZ2I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIGlmIChhc2NsZW4gPD0gMCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgYml0c19jb25zdW1lZCA9IGRlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWcoTlVMTCwgYXZjdHgsICZtNGFjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYi0+YnVmZmVyICsgKGNvbmZpZ19zdGFydF9iaXQgLyA4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNjbGVuLCBzeW5jX2V4dGVuc2lvbik7CiAKLSAgICBpZiAoYml0c19jb25zdW1lZCA8IDApCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCisgICAgYml0c19jb25zdW1lZCA9IGRlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWdfZ2IoTlVMTCwgYXZjdHgsICZtNGFjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnYmMsIGNvbmZpZ19zdGFydF9iaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19leHRlbnNpb24pOworCisgICAgaWYgKGJpdHNfY29uc3VtZWQgPCBjb25maWdfc3RhcnRfYml0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBiaXRzX2NvbnN1bWVkIC09IGNvbmZpZ19zdGFydF9iaXQ7CisKKyAgICBpZiAoYXNjbGVuID09IDApCisgICAgICBhc2NsZW4gPSBiaXRzX2NvbnN1bWVkOworCiAgICAgaWYgKCFsYXRtY3R4LT5pbml0aWFsaXplZCB8fAogICAgICAgICBhYy0+b2NbMV0ubTRhYy5zYW1wbGVfcmF0ZSAhPSBtNGFjLnNhbXBsZV9yYXRlIHx8CiAgICAgICAgIGFjLT5vY1sxXS5tNGFjLmNoYW5fY29uZmlnICE9IG00YWMuY2hhbl9jb25maWcpIHsKIAotICAgICAgICBpZihsYXRtY3R4LT5pbml0aWFsaXplZCkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgImF1ZGlvIGNvbmZpZyBjaGFuZ2VkXG4iKTsKKyAgICAgICAgaWYgKGxhdG1jdHgtPmluaXRpYWxpemVkKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiYXVkaW8gY29uZmlnIGNoYW5nZWQgKHNhbXBsZV9yYXRlPSVkLCBjaGFuX2NvbmZpZz0lZClcbiIsIG00YWMuc2FtcGxlX3JhdGUsIG00YWMuY2hhbl9jb25maWcpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJpbml0aWFsaXppbmcgbGF0bWN0eFxuIik7CiAgICAgICAgIH0KICAgICAgICAgbGF0bWN0eC0+aW5pdGlhbGl6ZWQgPSAwOwogCi0gICAgICAgIGVzaXplID0gKGJpdHNfY29uc3VtZWQrNykgLyA4OworICAgICAgICBlc2l6ZSA9IChhc2NsZW4gKyA3KSAvIDg7CiAKICAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IGVzaXplKSB7CiAgICAgICAgICAgICBhdl9mcmVlKGF2Y3R4LT5leHRyYWRhdGEpOwpAQCAtMzI5LDEyICszMzUsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IGVzaXplOwotICAgICAgICBtZW1jcHkoYXZjdHgtPmV4dHJhZGF0YSwgZ2ItPmJ1ZmZlciArIChjb25maWdfc3RhcnRfYml0LzgpLCBlc2l6ZSk7CisgICAgICAgIGdiYyA9ICpnYjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGVzaXplOyBpKyspIHsKKyAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhW2ldID0gZ2V0X2JpdHMoJmdiYywgOCk7CisgICAgICAgIH0KICAgICAgICAgbWVtc2V0KGF2Y3R4LT5leHRyYWRhdGErZXNpemUsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgIH0KLSAgICBza2lwX2JpdHNfbG9uZyhnYiwgYml0c19jb25zdW1lZCk7CisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGFzY2xlbik7CiAKLSAgICByZXR1cm4gYml0c19jb25zdW1lZDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCByZWFkX3N0cmVhbV9tdXhfY29uZmlnKHN0cnVjdCBMQVRNQ29udGV4dCAqbGF0bWN0eCwKQEAgLTM3NSw4ICszODQsNiBAQAogICAgICAgICAgICAgaW50IGFzY0xlbiA9IGxhdG1fZ2V0X3ZhbHVlKGdiKTsKICAgICAgICAgICAgIGlmICgocmV0ID0gbGF0bV9kZWNvZGVfYXVkaW9fc3BlY2lmaWNfY29uZmlnKGxhdG1jdHgsIGdiLCBhc2NMZW4pKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIGFzY0xlbiAtPSByZXQ7Ci0gICAgICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgYXNjTGVuKTsKICAgICAgICAgfQogCiAgICAgICAgIGxhdG1jdHgtPmZyYW1lX2xlbmd0aF90eXBlID0gZ2V0X2JpdHMoZ2IsIDMpOwpAQCAtNDI0LDYgKzQzMSw4IEBACiAgICAgaWYgKGN0eC0+ZnJhbWVfbGVuZ3RoX3R5cGUgPT0gMCkgewogICAgICAgICBpbnQgbXV4X3Nsb3RfbGVuZ3RoID0gMDsKICAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIHRtcCA9IGdldF9iaXRzKGdiLCA4KTsKICAgICAgICAgICAgIG11eF9zbG90X2xlbmd0aCArPSB0bXA7CiAgICAgICAgIH0gd2hpbGUgKHRtcCA9PSAyNTUpOwpAQCAtNDQ5LDExICs0NTgsMTEgQEAKICAgICB9IGVsc2UgaWYgKCFsYXRtY3R4LT5hYWNfY3R4LmF2Y3R4LT5leHRyYWRhdGEpIHsKICAgICAgICAgYXZfbG9nKGxhdG1jdHgtPmFhY19jdHguYXZjdHgsIEFWX0xPR19ERUJVRywKICAgICAgICAgICAgICAgICJubyBkZWNvZGVyIGNvbmZpZyBmb3VuZFxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBpZiAobGF0bWN0eC0+YXVkaW9fbXV4X3ZlcnNpb25fQSA9PSAwKSB7CiAgICAgICAgIGludCBtdXhfc2xvdF9sZW5ndGhfYnl0ZXMgPSByZWFkX3BheWxvYWRfbGVuZ3RoX2luZm8obGF0bWN0eCwgZ2IpOwotICAgICAgICBpZiAobXV4X3Nsb3RfbGVuZ3RoX2J5dGVzICogOCA+IGdldF9iaXRzX2xlZnQoZ2IpKSB7CisgICAgICAgIGlmIChtdXhfc2xvdF9sZW5ndGhfYnl0ZXMgPCAwIHx8IG11eF9zbG90X2xlbmd0aF9ieXRlcyAqIDhMTCA+IGdldF9iaXRzX2xlZnQoZ2IpKSB7CiAgICAgICAgICAgICBhdl9sb2cobGF0bWN0eC0+YWFjX2N0eC5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW5jb21wbGV0ZSBmcmFtZVxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfSBlbHNlIGlmIChtdXhfc2xvdF9sZW5ndGhfYnl0ZXMgKiA4ICsgMjU2IDwgZ2V0X2JpdHNfbGVmdChnYikpIHsKQEAgLTQ4Niw4ICs0OTUsOCBAQAogICAgIGlmIChtdXhsZW5ndGggPiBhdnBrdC0+c2l6ZSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBpZiAoKGVyciA9IHJlYWRfYXVkaW9fbXV4X2VsZW1lbnQobGF0bWN0eCwgJmdiKSkgPCAwKQotICAgICAgICByZXR1cm4gZXJyOworICAgIGlmICgoZXJyID0gcmVhZF9hdWRpb19tdXhfZWxlbWVudChsYXRtY3R4LCAmZ2IpKSkKKyAgICAgICAgcmV0dXJuIChlcnIgPCAwKSA/IGVyciA6IGF2cGt0LT5zaXplOwogCiAgICAgaWYgKCFsYXRtY3R4LT5pbml0aWFsaXplZCkgewogICAgICAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjZGVjX2ZpeGVkLmMgYi9saWJhdmNvZGVjL2FhY2RlY19maXhlZC5jCmluZGV4IDM5NmE4NzQuLjFiZGI5M2YgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjZGVjX2ZpeGVkLmMKKysrIGIvbGliYXZjb2RlYy9hYWNkZWNfZml4ZWQuYwpAQCAtNzUsMTEgKzc1LDExIEBACiAjaW5jbHVkZSAiYWFjLmgiCiAjaW5jbHVkZSAiYWFjdGFiLmgiCiAjaW5jbHVkZSAiYWFjZGVjdGFiLmgiCi0jaW5jbHVkZSAiY2JydF90YWJsZWdlbi5oIgorI2luY2x1ZGUgImFkdHNfaGVhZGVyLmgiCisjaW5jbHVkZSAiY2JydF9kYXRhLmgiCiAjaW5jbHVkZSAic2JyLmgiCiAjaW5jbHVkZSAiYWFjc2JyLmgiCiAjaW5jbHVkZSAibXBlZzRhdWRpby5oIgotI2luY2x1ZGUgImFhY2FkdHNkZWMuaCIKICNpbmNsdWRlICJwcm9maWxlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgogCkBAIC0xMjUsNyArMTI1LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50ICpERUNfVVBBSVIoaW50ICpkc3QsIHVuc2lnbmVkIGlkeCwgdW5zaWduZWQgc2lnbikKIHsKICAgICBkc3RbMF0gPSAoaWR4ICYgMTUpICogKDEgLSAoc2lnbiAmIDB4RkZGRkZGRkUpKTsKLSAgICBkc3RbMV0gPSAoaWR4ID4+IDQgJiAxNSkgKiAoMSAtICgoc2lnbiAmIDEpIDw8IDEpKTsKKyAgICBkc3RbMV0gPSAoaWR4ID4+IDQgJiAxNSkgKiAoMSAtICgoc2lnbiAmIDEpICogMikpOwogCiAgICAgcmV0dXJuIGRzdCArIDI7CiB9CkBAIC0xMzQsMTYgKzEzNCwxNiBAQAogewogICAgIHVuc2lnbmVkIG56ID0gaWR4ID4+IDEyOwogCi0gICAgZHN0WzBdID0gKGlkeCAmIDMpICogKDEgKyAoKChpbnQpc2lnbiA+PiAzMSkgPDwgMSkpOworICAgIGRzdFswXSA9IChpZHggJiAzKSAqICgxICsgKCgoaW50KXNpZ24gPj4gMzEpICogMikpOwogICAgIHNpZ24gPDw9IG56ICYgMTsKICAgICBueiA+Pj0gMTsKLSAgICBkc3RbMV0gPSAoaWR4ID4+IDIgJiAzKSAqICgxICsgKCgoaW50KXNpZ24gPj4gMzEpIDw8IDEpKTsKKyAgICBkc3RbMV0gPSAoaWR4ID4+IDIgJiAzKSAqICgxICsgKCgoaW50KXNpZ24gPj4gMzEpICogMikpOwogICAgIHNpZ24gPDw9IG56ICYgMTsKICAgICBueiA+Pj0gMTsKLSAgICBkc3RbMl0gPSAoaWR4ID4+IDQgJiAzKSAqICgxICsgKCgoaW50KXNpZ24gPj4gMzEpIDw8IDEpKTsKKyAgICBkc3RbMl0gPSAoaWR4ID4+IDQgJiAzKSAqICgxICsgKCgoaW50KXNpZ24gPj4gMzEpICogMikpOwogICAgIHNpZ24gPDw9IG56ICYgMTsKICAgICBueiA+Pj0gMTsKLSAgICBkc3RbM10gPSAoaWR4ID4+IDYgJiAzKSAqICgxICsgKCgoaW50KXNpZ24gPj4gMzEpIDw8IDEpKTsKKyAgICBkc3RbM10gPSAoaWR4ID4+IDYgJiAzKSAqICgxICsgKCgoaW50KXNpZ24gPj4gMzEpICogMikpOwogCiAgICAgcmV0dXJuIGRzdCArIDQ7CiB9CkBAIC0xNTUsOSArMTU1LDkgQEAKICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgewogICAgICAgICBjb2VmID0gY29lZnNbaV07CiAgICAgICAgIGlmIChjb2VmIDwgMCkKLSAgICAgICAgICAgIGNvZWYgPSAtKGludCljYnJ0X3RhYlstY29lZl07CisgICAgICAgICAgICBjb2VmID0gLShpbnQpZmZfY2JydF90YWJfZml4ZWRbLWNvZWZdOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBjb2VmID0gKGludCljYnJ0X3RhYltjb2VmXTsKKyAgICAgICAgICAgIGNvZWYgPSAoaW50KWZmX2NicnRfdGFiX2ZpeGVkW2NvZWZdOwogICAgICAgICBjb2Vmc1tpXSA9IGNvZWY7CiAgICAgfQogfQpAQCAtMTcxLDIwICsxNzEsMjUgQEAKIAogICAgIHMgPSBvZmZzZXQgLSAocyA+PiAyKTsKIAotICAgIGlmIChzID4gMCkgeworICAgIGlmIChzID4gMzEpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKKyAgICAgICAgICAgIGRzdFtpXSA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMgPiAwKSB7CiAgICAgICAgIHJvdW5kID0gMSA8PCAocy0xKTsKICAgICAgICAgZm9yIChpPTA7IGk8bGVuOyBpKyspIHsKICAgICAgICAgICAgIG91dCA9IChpbnQpKCgoaW50NjRfdClzcmNbaV0gKiBjKSA+PiAzMik7CiAgICAgICAgICAgICBkc3RbaV0gPSAoKGludCkob3V0K3JvdW5kKSA+PiBzKSAqIHNzaWduOwogICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgeworICAgIH0gZWxzZSBpZiAocyA+IC0zMikgewogICAgICAgICBzID0gcyArIDMyOwotICAgICAgICByb3VuZCA9IDEgPDwgKHMtMSk7CisgICAgICAgIHJvdW5kID0gMVUgPDwgKHMtMSk7CiAgICAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CiAgICAgICAgICAgICBvdXQgPSAoaW50KSgoaW50NjRfdCkoKGludDY0X3Qpc3JjW2ldICogYyArIHJvdW5kKSA+PiBzKTsKLSAgICAgICAgICAgIGRzdFtpXSA9IG91dCAqIHNzaWduOworICAgICAgICAgICAgZHN0W2ldID0gb3V0ICogKHVuc2lnbmVkKXNzaWduOwogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk92ZXJmbG93IGluIHN1YmJhbmRfc2NhbGUoKVxuIik7CiAgICAgfQogfQogCkBAIC0yMDMsOCArMjA4LDEyIEBACiAgICAgYyAvPSBiYW5kX2VuZXJneTsKICAgICBzID0gMjEgKyBubHogLSAocyA+PiAyKTsKIAotICAgIGlmIChzID4gMCkgewotICAgICAgICByb3VuZCA9IDEgPDwgKHMtMSk7CisgICAgaWYgKHMgPiAzMSkgeworICAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrKykgeworICAgICAgICAgICAgY29lZnNbaV0gPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzID49IDApIHsKKyAgICAgICAgcm91bmQgPSBzID8gMSA8PCAocy0xKSA6IDA7CiAgICAgICAgIGZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CiAgICAgICAgICAgICBvdXQgPSAoaW50KSgoKGludDY0X3QpY29lZnNbaV0gKiBjKSA+PiAzMik7CiAgICAgICAgICAgICBjb2Vmc1tpXSA9ICgoaW50KShvdXQrcm91bmQpID4+IHMpICogc3NpZ247CkBAIC0yOTYsOCArMzA1LDEyIEBACiAgICAgaWYgKG91dHB1dF9lbmFibGUpIHsKICAgICAgICAgaW50IHNoaWZ0ID0gMjggLSBwdi5leHA7CiAKLSAgICAgICAgaWYgKHNoaWZ0IDwgMzEpCi0gICAgICAgICAgICAqY29lZiArPSAocHYubWFudCArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQ7CisgICAgICAgIGlmIChzaGlmdCA8IDMxKSB7CisgICAgICAgICAgICBpZiAoc2hpZnQgPiAwKSB7CisgICAgICAgICAgICAgICAgKmNvZWYgKz0gKHVuc2lnbmVkKSgocHYubWFudCArICgxIDw8IChzaGlmdCAtIDEpKSkgPj4gc2hpZnQpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgKmNvZWYgKz0gKHVuc2lnbmVkKXB2Lm1hbnQgPDwgLXNoaWZ0OworICAgICAgICB9CiAgICAgfQogCiAgICAgZTAgPSBhdl9pbnQyc2YoKmNvZWYsIDIpOwpAQCAtMzYyLDcgKzM3NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gKGdhaW4tMTAyNCkgPj4gMzsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNoaWZ0IDwgLTMxKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IC1zaGlmdDsKICAgICAgICAgICAgICAgICAgICAgcm91bmQgPSAxIDw8IChzaGlmdCAtIDEpOwogCkBAIC0zNzAsNyArMzg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IG9mZnNldHNbaV07IGsgPCBvZmZzZXRzW2kgKyAxXTsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gKGludCkoKChpbnQ2NF90KXNyY1tncm91cCAqIDEyOCArIGtdICogYyArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KTB4MTAwMDAwMDAwMCkgPj4gMzcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZ3JvdXAgKiAxMjggKyBrXSArPSAodG1wICsgcm91bmQpID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbZ3JvdXAgKiAxMjggKyBrXSArPSAodG1wICsgKGludDY0X3Qpcm91bmQpID4+IHNoaWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMzc5LDcgKzM5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSBvZmZzZXRzW2ldOyBrIDwgb2Zmc2V0c1tpICsgMV07IGsrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IChpbnQpKCgoaW50NjRfdClzcmNbZ3JvdXAgKiAxMjggKyBrXSAqIGMgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpMHgxMDAwMDAwMDAwKSA+PiAzNyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFtncm91cCAqIDEyOCArIGtdICs9IHRtcCA8PCBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2dyb3VwICogMTI4ICsga10gKz0gdG1wICogKDFVIDw8IHNoaWZ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTQwMiwxMiArNDE3LDE0IEBACiAgICAgaW50IGksIGMsIHNoaWZ0LCByb3VuZCwgdG1wOwogICAgIGNvbnN0IGludCBnYWluID0gY2NlLT5jb3VwLmdhaW5baW5kZXhdWzBdOwogICAgIGNvbnN0IGludCAqc3JjID0gY2NlLT5jaFswXS5yZXQ7Ci0gICAgaW50ICpkZXN0ID0gdGFyZ2V0LT5yZXQ7CisgICAgdW5zaWduZWQgaW50ICpkZXN0ID0gdGFyZ2V0LT5yZXQ7CiAgICAgY29uc3QgaW50IGxlbiA9IDEwMjQgPDwgKGFjLT5vY1sxXS5tNGFjLnNiciA9PSAxKTsKIAogICAgIGMgPSBjY2Vfc2NhbGVfZml4ZWRbZ2FpbiAmIDddOwogICAgIHNoaWZ0ID0gKGdhaW4tMTAyNCkgPj4gMzsKLSAgICBpZiAoc2hpZnQgPCAwKSB7CisgICAgaWYgKHNoaWZ0IDwgLTMxKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMCkgewogICAgICAgICBzaGlmdCA9IC1zaGlmdDsKICAgICAgICAgcm91bmQgPSAxIDw8IChzaGlmdCAtIDEpOwogCkBAIC00MTksNyArNDM2LDcgQEAKICAgICBlbHNlIHsKICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgIHRtcCA9IChpbnQpKCgoaW50NjRfdClzcmNbaV0gKiBjICsgKGludDY0X3QpMHgxMDAwMDAwMDAwKSA+PiAzNyk7Ci0gICAgICAgICAgZGVzdFtpXSArPSB0bXAgPDwgc2hpZnQ7CisgICAgICAgICAgZGVzdFtpXSArPSB0bXAgKiAoMVUgPDwgc2hpZnQpOwogICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjZGVjX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2FhY2RlY190ZW1wbGF0ZS5jCmluZGV4IDZiYzk0YzguLmNmOTcxODEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjZGVjX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9hYWNkZWNfdGVtcGxhdGUuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgICAgIGlmICghYWMtPmNoZVt0eXBlXVtpZF0pIHsKICAgICAgICAgICAgIGlmICghKGFjLT5jaGVbdHlwZV1baWRdID0gYXZfbWFsbG9jeihzaXplb2YoQ2hhbm5lbEVsZW1lbnQpKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIEFBQ19SRU5BTUUoZmZfYWFjX3Nicl9jdHhfaW5pdCkoYWMsICZhYy0+Y2hlW3R5cGVdW2lkXS0+c2JyKTsKKyAgICAgICAgICAgIEFBQ19SRU5BTUUoZmZfYWFjX3Nicl9jdHhfaW5pdCkoYWMsICZhYy0+Y2hlW3R5cGVdW2lkXS0+c2JyLCB0eXBlKTsKICAgICAgICAgfQogICAgICAgICBpZiAodHlwZSAhPSBUWVBFX0NDRSkgewogICAgICAgICAgICAgaWYgKCpjaGFubmVscyA+PSBNQVhfQ0hBTk5FTFMgLSAodHlwZSA9PSBUWVBFX0NQRSB8fCAodHlwZSA9PSBUWVBFX1NDRSAmJiBhYy0+b2NbMV0ubTRhYy5wcyA9PSAxKSkpIHsKQEAgLTQwNiwxMSArNDA2LDE1IEBACiAvKioKICAqIFNhdmUgY3VycmVudCBvdXRwdXQgY29uZmlndXJhdGlvbiBpZiBhbmQgb25seSBpZiBpdCBoYXMgYmVlbiBsb2NrZWQuCiAgKi8KLXN0YXRpYyB2b2lkIHB1c2hfb3V0cHV0X2NvbmZpZ3VyYXRpb24oQUFDQ29udGV4dCAqYWMpIHsKK3N0YXRpYyBpbnQgcHVzaF9vdXRwdXRfY29uZmlndXJhdGlvbihBQUNDb250ZXh0ICphYykgeworICAgIGludCBwdXNoZWQgPSAwOworCiAgICAgaWYgKGFjLT5vY1sxXS5zdGF0dXMgPT0gT0NfTE9DS0VEIHx8IGFjLT5vY1swXS5zdGF0dXMgPT0gT0NfTk9ORSkgewogICAgICAgICBhYy0+b2NbMF0gPSBhYy0+b2NbMV07CisgICAgICAgIHB1c2hlZCA9IDE7CiAgICAgfQogICAgIGFjLT5vY1sxXS5zdGF0dXMgPSBPQ19OT05FOworICAgIHJldHVybiBwdXNoZWQ7CiB9CiAKIC8qKgpAQCAtNDUyLDcgKzQ1Niw3IEBACiAgICAgICAgIGludCBpZCA9ICAgICAgICAgICBsYXlvdXRfbWFwW2ldWzFdOwogICAgICAgICBpZF9tYXBbdHlwZV1baWRdID0gdHlwZV9jb3VudHNbdHlwZV0rKzsKICAgICAgICAgaWYgKGlkX21hcFt0eXBlXVtpZF0gPj0gTUFYX0VMRU1fSUQpIHsKLSAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhYy0+YXZjdHgsICJSZW1hcHBlZCBpZCB0b28gbGFyZ2VcbiIpOworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGFjLT5hdmN0eCwgIlRvbyBsYXJnZSByZW1hcHBlZCBpZCIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9CiAgICAgfQpAQCAtNzE1LDYgKzcxOSwxMyBAQAogICAgIH0KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHJlbGF0aXZlX2FsaWduX2dldF9iaXRzKEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWZlcmVuY2VfcG9zaXRpb24pIHsKKyAgICBpbnQgbiA9IChyZWZlcmVuY2VfcG9zaXRpb24gLSBnZXRfYml0c19jb3VudChnYikgJiA3KTsKKyAgICBpZiAobikKKyAgICAgICAgc2tpcF9iaXRzKGdiLCBuKTsKK30KKwogLyoqCiAgKiBEZWNvZGUgcHJvZ3JhbSBjb25maWd1cmF0aW9uIGVsZW1lbnQ7IHJlZmVyZW5jZTogdGFibGUgNC4yLgogICoKQEAgLTcyMiw3ICs3MzMsNyBAQAogICovCiBzdGF0aWMgaW50IGRlY29kZV9wY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBNUEVHNEF1ZGlvQ29uZmlnICptNGFjLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKCpsYXlvdXRfbWFwKVszXSwKLSAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYikKKyAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwgaW50IGJ5dGVfYWxpZ25fcmVmKQogewogICAgIGludCBudW1fZnJvbnQsIG51bV9zaWRlLCBudW1fYmFjaywgbnVtX2xmZSwgbnVtX2Fzc29jX2RhdGEsIG51bV9jYzsKICAgICBpbnQgc2FtcGxpbmdfaW5kZXg7CkBAIC03NTIsNyArNzYzLDcgQEAKICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKICAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsgLy8gbWl4ZG93bl9jb2VmZl9pbmRleCBhbmQgcHNldWRvX3N1cnJvdW5kCiAKLSAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA0ICogKG51bV9mcm9udCArIG51bV9zaWRlICsgbnVtX2JhY2sgKyBudW1fbGZlICsgbnVtX2Fzc29jX2RhdGEgKyBudW1fY2MpKSB7CisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgNSAqIChudW1fZnJvbnQgKyBudW1fc2lkZSArIG51bV9iYWNrICsgbnVtX2NjKSArIDQgKihudW1fbGZlICsgbnVtX2Fzc29jX2RhdGEgKyBudW1fY2MpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX3BjZTogIiBvdmVycmVhZF9lcnIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtNzcwLDcgKzc4MSw3IEBACiAgICAgZGVjb2RlX2NoYW5uZWxfbWFwKGxheW91dF9tYXAgKyB0YWdzLCBBQUNfQ0hBTk5FTF9DQywgICAgZ2IsIG51bV9jYyk7CiAgICAgdGFncyArPSBudW1fY2M7CiAKLSAgICBhbGlnbl9nZXRfYml0cyhnYik7CisgICAgcmVsYXRpdmVfYWxpZ25fZ2V0X2JpdHMoZ2IsIGJ5dGVfYWxpZ25fcmVmKTsKIAogICAgIC8qIGNvbW1lbnQgZmllbGQsIGZpcnN0IGJ5dGUgaXMgbGVuZ3RoICovCiAgICAgY29tbWVudF9sZW4gPSBnZXRfYml0cyhnYiwgOCkgKiA4OwpAQCAtNzkyLDYgKzgwMyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZGVjb2RlX2dhX3NwZWNpZmljX2NvbmZpZyhBQUNDb250ZXh0ICphYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnZXRfYml0X2FsaWdubWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHNEF1ZGlvQ29uZmlnICptNGFjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2NvbmZpZykKIHsKQEAgLTc5OSwxMSArODExLDIxIEBACiAgICAgdWludDhfdCBsYXlvdXRfbWFwW01BWF9FTEVNX0lEKjRdWzNdOwogICAgIGludCB0YWdzID0gMDsKIAorI2lmIFVTRV9GSVhFRAogICAgIGlmIChnZXRfYml0czEoZ2IpKSB7IC8vIGZyYW1lTGVuZ3RoRmxhZwotICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICI5NjAvMTIwIE1EQ1Qgd2luZG93Iik7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiRml4ZWQgcG9pbnQgOTYwLzEyMCBNRENUIHdpbmRvdyIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogICAgIG00YWMtPmZyYW1lX2xlbmd0aF9zaG9ydCA9IDA7CisjZWxzZQorICAgIG00YWMtPmZyYW1lX2xlbmd0aF9zaG9ydCA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKG00YWMtPmZyYW1lX2xlbmd0aF9zaG9ydCAmJiBtNGFjLT5zYnIgPT0gMSkgeworICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJTQlIgd2l0aCA5NjAgZnJhbWUgbGVuZ3RoIik7CisgICAgICBpZiAoYWMpIGFjLT53YXJuZWRfOTYwX3NiciA9IDE7CisgICAgICBtNGFjLT5zYnIgPSAwOworICAgICAgbTRhYy0+cHMgPSAwOworICAgIH0KKyNlbmRpZgogCiAgICAgaWYgKGdldF9iaXRzMShnYikpICAgICAgIC8vIGRlcGVuZHNPbkNvcmVDb2RlcgogICAgICAgICBza2lwX2JpdHMoZ2IsIDE0KTsgICAvLyBjb3JlQ29kZXJEZWxheQpAQCAtODE1LDcgKzgzNyw3IEBACiAKICAgICBpZiAoY2hhbm5lbF9jb25maWcgPT0gMCkgewogICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOyAgLy8gZWxlbWVudF9pbnN0YW5jZV90YWcKLSAgICAgICAgdGFncyA9IGRlY29kZV9wY2UoYXZjdHgsIG00YWMsIGxheW91dF9tYXAsIGdiKTsKKyAgICAgICAgdGFncyA9IGRlY29kZV9wY2UoYXZjdHgsIG00YWMsIGxheW91dF9tYXAsIGdiLCBnZXRfYml0X2FsaWdubWVudCk7CiAgICAgICAgIGlmICh0YWdzIDwgMCkKICAgICAgICAgICAgIHJldHVybiB0YWdzOwogICAgIH0gZWxzZSB7CkBAIC05MzcsMzcgKzk1OSwyNSBAQAogICogQHBhcmFtICAgYWMgICAgICAgICAgcG9pbnRlciB0byBBQUNDb250ZXh0LCBtYXkgYmUgbnVsbAogICogQHBhcmFtICAgYXZjdHggICAgICAgcG9pbnRlciB0byBBVkNDb2RlY0NvbnRleHQsIHVzZWQgZm9yIGxvZ2dpbmcKICAqIEBwYXJhbSAgIG00YWMgICAgICAgIHBvaW50ZXIgdG8gTVBFRzRBdWRpb0NvbmZpZywgdXNlZCBmb3IgcGFyc2luZwotICogQHBhcmFtICAgZGF0YSAgICAgICAgcG9pbnRlciB0byBidWZmZXIgaG9sZGluZyBhbiBhdWRpbyBzcGVjaWZpYyBjb25maWcKLSAqIEBwYXJhbSAgIGJpdF9zaXplICAgIHNpemUgb2YgYXVkaW8gc3BlY2lmaWMgY29uZmlnIG9yIGRhdGEgaW4gYml0cworICogQHBhcmFtICAgZ2IgICAgICAgICAgYnVmZmVyIGhvbGRpbmcgYW4gYXVkaW8gc3BlY2lmaWMgY29uZmlnCisgKiBAcGFyYW0gICBnZXRfYml0X2FsaWdubWVudCByZWxhdGl2ZSBhbGlnbm1lbnQgZm9yIGJ5dGUgYWxpZ24gb3BlcmF0aW9ucwogICogQHBhcmFtICAgc3luY19leHRlbnNpb24gbG9vayBmb3IgYW4gYXBwZW5kZWQgc3luYyBleHRlbnNpb24KICAqCiAgKiBAcmV0dXJuICBSZXR1cm5zIGVycm9yIHN0YXR1cyBvciBudW1iZXIgb2YgY29uc3VtZWQgYml0cy4gPDAgLSBlcnJvcgogICovCi1zdGF0aWMgaW50IGRlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWcoQUFDQ29udGV4dCAqYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUc0QXVkaW9Db25maWcgKm00YWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgaW50NjRfdCBiaXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3luY19leHRlbnNpb24pCitzdGF0aWMgaW50IGRlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWdfZ2IoQUFDQ29udGV4dCAqYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUc0QXVkaW9Db25maWcgKm00YWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdldF9iaXRfYWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeW5jX2V4dGVuc2lvbikKIHsKLSAgICBHZXRCaXRDb250ZXh0IGdiOwogICAgIGludCBpLCByZXQ7CisgICAgR2V0Qml0Q29udGV4dCBnYmMgPSAqZ2I7CiAKLSAgICBpZiAoYml0X3NpemUgPCAwIHx8IGJpdF9zaXplID4gSU5UX01BWCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkF1ZGlvIHNwZWNpZmljIGNvbmZpZyBzaXplIGlzIGludmFsaWRcbiIpOworICAgIGlmICgoaSA9IGZmX21wZWc0YXVkaW9fZ2V0X2NvbmZpZ19nYihtNGFjLCAmZ2JjLCBzeW5jX2V4dGVuc2lvbikpIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQogCi0gICAgZmZfZGxvZyhhdmN0eCwgImF1ZGlvIHNwZWNpZmljIGNvbmZpZyBzaXplICVkXG4iLCAoaW50KWJpdF9zaXplID4+IDMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBiaXRfc2l6ZSA+PiAzOyBpKyspCi0gICAgICAgIGZmX2Rsb2coYXZjdHgsICIlMDJ4ICIsIGRhdGFbaV0pOwotICAgIGZmX2Rsb2coYXZjdHgsICJcbiIpOwotCi0gICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzKCZnYiwgZGF0YSwgYml0X3NpemUpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBpZiAoKGkgPSBhdnByaXZfbXBlZzRhdWRpb19nZXRfY29uZmlnKG00YWMsIGRhdGEsIGJpdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY19leHRlbnNpb24pKSA8IDApCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGlmIChtNGFjLT5zYW1wbGluZ19pbmRleCA+IDEyKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgImludmFsaWQgc2FtcGxpbmcgcmF0ZSBpbmRleCAlZFxuIiwKQEAgLTk4MiwyMCArOTkyLDIxIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIHNraXBfYml0c19sb25nKCZnYiwgaSk7CisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIGkpOwogCiAgICAgc3dpdGNoIChtNGFjLT5vYmplY3RfdHlwZSkgewogICAgIGNhc2UgQU9UX0FBQ19NQUlOOgogICAgIGNhc2UgQU9UX0FBQ19MQzoKKyAgICBjYXNlIEFPVF9BQUNfU1NSOgogICAgIGNhc2UgQU9UX0FBQ19MVFA6CiAgICAgY2FzZSBBT1RfRVJfQUFDX0xDOgogICAgIGNhc2UgQU9UX0VSX0FBQ19MRDoKLSAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfZ2Ffc3BlY2lmaWNfY29uZmlnKGFjLCBhdmN0eCwgJmdiLAorICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9nYV9zcGVjaWZpY19jb25maWcoYWMsIGF2Y3R4LCBnYiwgZ2V0X2JpdF9hbGlnbm1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG00YWMsIG00YWMtPmNoYW5fY29uZmlnKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBT1RfRVJfQUFDX0VMRDoKLSAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfZWxkX3NwZWNpZmljX2NvbmZpZyhhYywgYXZjdHgsICZnYiwKKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfZWxkX3NwZWNpZmljX2NvbmZpZyhhYywgYXZjdHgsIGdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG00YWMsIG00YWMtPmNoYW5fY29uZmlnKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgYnJlYWs7CkBAIC0xMDEzLDcgKzEwMjQsMzMgQEAKICAgICAgICAgICAgIG00YWMtPnNhbXBsZV9yYXRlLCBtNGFjLT5zYnIsCiAgICAgICAgICAgICBtNGFjLT5wcyk7CiAKLSAgICByZXR1cm4gZ2V0X2JpdHNfY291bnQoJmdiKTsKKyAgICByZXR1cm4gZ2V0X2JpdHNfY291bnQoZ2IpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hdWRpb19zcGVjaWZpY19jb25maWcoQUFDQ29udGV4dCAqYWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUc0QXVkaW9Db25maWcgKm00YWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgaW50NjRfdCBiaXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3luY19leHRlbnNpb24pCit7CisgICAgaW50IGksIHJldDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgaWYgKGJpdF9zaXplIDwgMCB8fCBiaXRfc2l6ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBdWRpbyBzcGVjaWZpYyBjb25maWcgc2l6ZSBpcyBpbnZhbGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZmZfZGxvZyhhdmN0eCwgImF1ZGlvIHNwZWNpZmljIGNvbmZpZyBzaXplICVkXG4iLCAoaW50KWJpdF9zaXplID4+IDMpOworICAgIGZvciAoaSA9IDA7IGkgPCBiaXRfc2l6ZSA+PiAzOyBpKyspCisgICAgICAgIGZmX2Rsb2coYXZjdHgsICIlMDJ4ICIsIGRhdGFbaV0pOworICAgIGZmX2Rsb2coYXZjdHgsICJcbiIpOworCisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzKCZnYiwgZGF0YSwgYml0X3NpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gZGVjb2RlX2F1ZGlvX3NwZWNpZmljX2NvbmZpZ19nYihhYywgYXZjdHgsIG00YWMsICZnYiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jX2V4dGVuc2lvbik7CiB9CiAKIC8qKgpAQCAtMTEwMCwxMSArMTEzNywxNyBAQAogICAgIC8vIHdpbmRvdyBpbml0aWFsaXphdGlvbgogICAgIEFBQ19SRU5BTUUoZmZfa2JkX3dpbmRvd19pbml0KShBQUNfUkVOQU1FKGZmX2FhY19rYmRfbG9uZ18xMDI0KSwgNC4wLCAxMDI0KTsKICAgICBBQUNfUkVOQU1FKGZmX2tiZF93aW5kb3dfaW5pdCkoQUFDX1JFTkFNRShmZl9hYWNfa2JkX3Nob3J0XzEyOCksIDYuMCwgMTI4KTsKKyNpZiAhVVNFX0ZJWEVECisgICAgQUFDX1JFTkFNRShmZl9rYmRfd2luZG93X2luaXQpKEFBQ19SRU5BTUUoZmZfYWFjX2tiZF9sb25nXzk2MCksIDQuMCwgOTYwKTsKKyAgICBBQUNfUkVOQU1FKGZmX2tiZF93aW5kb3dfaW5pdCkoQUFDX1JFTkFNRShmZl9hYWNfa2JkX3Nob3J0XzEyMCksIDYuMCwgMTIwKTsKKyAgICBBQUNfUkVOQU1FKGZmX3NpbmVfd2luZG93X2luaXQpKEFBQ19SRU5BTUUoZmZfc2luZV85NjApLCA5NjApOworICAgIEFBQ19SRU5BTUUoZmZfc2luZV93aW5kb3dfaW5pdCkoQUFDX1JFTkFNRShmZl9zaW5lXzEyMCksIDEyMCk7CisjZW5kaWYKICAgICBBQUNfUkVOQU1FKGZmX2luaXRfZmZfc2luZV93aW5kb3dzKSgxMCk7CiAgICAgQUFDX1JFTkFNRShmZl9pbml0X2ZmX3NpbmVfd2luZG93cykoIDkpOwogICAgIEFBQ19SRU5BTUUoZmZfaW5pdF9mZl9zaW5lX3dpbmRvd3MpKCA3KTsKIAotICAgIEFBQ19SRU5BTUUoY2JydF90YWJsZWluaXQpKCk7CisgICAgQUFDX1JFTkFNRShmZl9jYnJ0X3RhYmxlaW5pdCkoKTsKIH0KIAogc3RhdGljIEFWT25jZSBhYWNfdGFibGVfaW5pdCA9IEFWX09OQ0VfSU5JVDsKQEAgLTExODUsNyArMTIyOCwxMyBAQAogICAgIEFBQ19SRU5BTUVfMzIoZmZfbWRjdF9pbml0KSgmYWMtPm1kY3Rfc21hbGwsICA4LCAxLCAxLjAgLyBSQU5HRTE1KDEyOC4wKSk7CiAgICAgQUFDX1JFTkFNRV8zMihmZl9tZGN0X2luaXQpKCZhYy0+bWRjdF9sdHAsICAgMTEsIDAsIFJBTkdFMTUoLTIuMCkpOwogI2lmICFVU0VfRklYRUQKLSAgICByZXQgPSBmZl9pbWRjdDE1X2luaXQoJmFjLT5tZGN0NDgwLCA1KTsKKyAgICByZXQgPSBmZl9tZGN0MTVfaW5pdCgmYWMtPm1kY3QxMjAsIDEsIDMsIDEuMGYvKDE2KjEwMjQqMTIwKjIpKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBmZl9tZGN0MTVfaW5pdCgmYWMtPm1kY3Q0ODAsIDEsIDUsIDEuMGYvKDE2KjEwMjQqOTYwKSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gZmZfbWRjdDE1X2luaXQoJmFjLT5tZGN0OTYwLCAxLCA2LCAxLjBmLygxNioxMDI0Kjk2MCoyKSk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAjZW5kaWYKQEAgLTEyNTUsNiArMTMwNCw4IEBACiAgICAgY29uc3QgTVBFRzRBdWRpb0NvbmZpZyAqY29uc3QgbTRhYyA9ICZhYy0+b2NbMV0ubTRhYzsKICAgICBjb25zdCBpbnQgYW90ID0gbTRhYy0+b2JqZWN0X3R5cGU7CiAgICAgY29uc3QgaW50IHNhbXBsaW5nX2luZGV4ID0gbTRhYy0+c2FtcGxpbmdfaW5kZXg7CisgICAgaW50IHJldF9mYWlsID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIGlmIChhb3QgIT0gQU9UX0VSX0FBQ19FTEQpIHsKICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKICAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlc2VydmVkIGJpdCBzZXQuXG4iKTsKQEAgLTEyODgsOCArMTMzOSwxMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGljcy0+bnVtX3dpbmRvd3MgICAgICAgPSA4OwotICAgICAgICBpY3MtPnN3Yl9vZmZzZXQgICAgICAgID0gICAgZmZfc3diX29mZnNldF8xMjhbc2FtcGxpbmdfaW5kZXhdOwotICAgICAgICBpY3MtPm51bV9zd2IgICAgICAgICAgID0gICBmZl9hYWNfbnVtX3N3Yl8xMjhbc2FtcGxpbmdfaW5kZXhdOworICAgICAgICBpZiAobTRhYy0+ZnJhbWVfbGVuZ3RoX3Nob3J0KSB7CisgICAgICAgICAgICBpY3MtPnN3Yl9vZmZzZXQgICAgPSAgZmZfc3diX29mZnNldF8xMjBbc2FtcGxpbmdfaW5kZXhdOworICAgICAgICAgICAgaWNzLT5udW1fc3diICAgICAgID0gZmZfYWFjX251bV9zd2JfMTIwW3NhbXBsaW5nX2luZGV4XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGljcy0+c3diX29mZnNldCAgICA9ICBmZl9zd2Jfb2Zmc2V0XzEyOFtzYW1wbGluZ19pbmRleF07CisgICAgICAgICAgICBpY3MtPm51bV9zd2IgICAgICAgPSBmZl9hYWNfbnVtX3N3Yl8xMjhbc2FtcGxpbmdfaW5kZXhdOworICAgICAgICB9CiAgICAgICAgIGljcy0+dG5zX21heF9iYW5kcyAgICAgPSBmZl90bnNfbWF4X2JhbmRzXzEyOFtzYW1wbGluZ19pbmRleF07CiAgICAgICAgIGljcy0+cHJlZGljdG9yX3ByZXNlbnQgPSAwOwogICAgIH0gZWxzZSB7CkBAIC0xMzA1LDExICsxMzYxLDE4IEBACiAgICAgICAgICAgICAgICAgaWNzLT5udW1fc3diICAgICAgID0gICAgZmZfYWFjX251bV9zd2JfNTEyW3NhbXBsaW5nX2luZGV4XTsKICAgICAgICAgICAgICAgICBpY3MtPnRuc19tYXhfYmFuZHMgPSAgZmZfdG5zX21heF9iYW5kc181MTJbc2FtcGxpbmdfaW5kZXhdOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFpY3MtPm51bV9zd2IgfHwgIWljcy0+c3diX29mZnNldCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgICAgICAgICBpZiAoIWljcy0+bnVtX3N3YiB8fCAhaWNzLT5zd2Jfb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgcmV0X2ZhaWwgPSBBVkVSUk9SX0JVRzsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpY3MtPnN3Yl9vZmZzZXQgICAgPSAgICBmZl9zd2Jfb2Zmc2V0XzEwMjRbc2FtcGxpbmdfaW5kZXhdOwotICAgICAgICAgICAgaWNzLT5udW1fc3diICAgICAgID0gICBmZl9hYWNfbnVtX3N3Yl8xMDI0W3NhbXBsaW5nX2luZGV4XTsKKyAgICAgICAgICAgIGlmIChtNGFjLT5mcmFtZV9sZW5ndGhfc2hvcnQpIHsKKyAgICAgICAgICAgICAgICBpY3MtPm51bV9zd2IgICAgPSBmZl9hYWNfbnVtX3N3Yl85NjBbc2FtcGxpbmdfaW5kZXhdOworICAgICAgICAgICAgICAgIGljcy0+c3diX29mZnNldCA9IGZmX3N3Yl9vZmZzZXRfOTYwW3NhbXBsaW5nX2luZGV4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWNzLT5udW1fc3diICAgID0gZmZfYWFjX251bV9zd2JfMTAyNFtzYW1wbGluZ19pbmRleF07CisgICAgICAgICAgICAgICAgaWNzLT5zd2Jfb2Zmc2V0ID0gZmZfc3diX29mZnNldF8xMDI0W3NhbXBsaW5nX2luZGV4XTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGljcy0+dG5zX21heF9iYW5kcyA9IGZmX3Ruc19tYXhfYmFuZHNfMTAyNFtzYW1wbGluZ19pbmRleF07CiAgICAgICAgIH0KICAgICAgICAgaWYgKGFvdCAhPSBBT1RfRVJfQUFDX0VMRCkgewpAQCAtMTMzMCw3ICsxMzkzLDggQEAKICAgICAgICAgICAgICAgICBpZiAoYW90ID09IEFPVF9FUl9BQUNfTEQpIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxUUCBpbiBFUiBBQUMgTEQgbm90IHlldCBpbXBsZW1lbnRlZC5cbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgICAgIHJldF9mYWlsID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKChpY3MtPmx0cC5wcmVzZW50ID0gZ2V0X2JpdHMoZ2IsIDEpKSkKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2x0cCgmaWNzLT5sdHAsIGdiLCBpY3MtPm1heF9zZmIpOwpAQCAtMTM0OSw3ICsxNDEzLDcgQEAKICAgICByZXR1cm4gMDsKIGZhaWw6CiAgICAgaWNzLT5tYXhfc2ZiID0gMDsKLSAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICByZXR1cm4gcmV0X2ZhaWw7CiB9CiAKIC8qKgpAQCAtMTc5NSw3ICsxODU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gLXY7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaWNmKysgPSB2OwogI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICppY2YrKyA9IGNicnRfdGFiW25dIHwgKGJpdHMgJiAxVTw8MzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmljZisrID0gZmZfY2JydF90YWJbbl0gfCAoYml0cyAmIDFVPDwzMSk7CiAjZW5kaWYgLyogVVNFX0ZJWEVEICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzIDw8PSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTkwNCw2ICsxOTY4LDMzIEBACiAgICAgICAgIHJlc2V0X2FsbF9wcmVkaWN0b3JzKHNjZS0+cHJlZGljdG9yX3N0YXRlKTsKIH0KIAorc3RhdGljIHZvaWQgZGVjb2RlX2dhaW5fY29udHJvbChTaW5nbGVDaGFubmVsRWxlbWVudCAqIHNjZSwgR2V0Qml0Q29udGV4dCAqIGdiKQoreworICAgIC8vIHdkX251bSwgd2RfdGVzdCwgYWxvY19zaXplCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ2Fpbl9tb2RlWzRdWzNdID0geworICAgICAgICB7MSwgMCwgNX0sICAvLyBPTkxZX0xPTkdfU0VRVUVOQ0UgPSAwLAorICAgICAgICB7MiwgMSwgMn0sICAvLyBMT05HX1NUQVJUX1NFUVVFTkNFLAorICAgICAgICB7OCwgMCwgMn0sICAvLyBFSUdIVF9TSE9SVF9TRVFVRU5DRSwKKyAgICAgICAgezIsIDEsIDV9LCAgLy8gTE9OR19TVE9QX1NFUVVFTkNFCisgICAgfTsKKworICAgIGNvbnN0IGludCBtb2RlID0gc2NlLT5pY3Mud2luZG93X3NlcXVlbmNlWzBdOworICAgIHVpbnQ4X3QgYmQsIHdkLCBhZDsKKworICAgIC8vIEZJWE1FOiBTdG9yZSB0aGUgZ2FpbiBjb250cm9sIGRhdGEgb24gfHNjZXwgYW5kIGRvIHNvbWV0aGluZyB3aXRoIGl0LgorICAgIHVpbnQ4X3QgbWF4X2JhbmQgPSBnZXRfYml0cyhnYiwgMik7CisgICAgZm9yIChiZCA9IDA7IGJkIDwgbWF4X2JhbmQ7IGJkKyspIHsKKyAgICAgICAgZm9yICh3ZCA9IDA7IHdkIDwgZ2Fpbl9tb2RlW21vZGVdWzBdOyB3ZCsrKSB7CisgICAgICAgICAgICB1aW50OF90IGFkanVzdF9udW0gPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgICAgICBmb3IgKGFkID0gMDsgYWQgPCBhZGp1c3RfbnVtOyBhZCsrKSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA0ICsgKCh3ZCA9PSAwICYmIGdhaW5fbW9kZVttb2RlXVsxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdhaW5fbW9kZVttb2RlXVsyXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiAvKioKICAqIERlY29kZSBhbiBpbmRpdmlkdWFsX2NoYW5uZWxfc3RyZWFtIHBheWxvYWQ7IHJlZmVyZW5jZTogdGFibGUgNC40NC4KICAqCkBAIC0xOTM2LDE2ICsyMDI3LDE3IEBACiAgICAgZ2xvYmFsX2dhaW4gPSBnZXRfYml0cyhnYiwgOCk7CiAKICAgICBpZiAoIWNvbW1vbl93aW5kb3cgJiYgIXNjYWxlX2ZsYWcpIHsKLSAgICAgICAgaWYgKGRlY29kZV9pY3NfaW5mbyhhYywgaWNzLCBnYikgPCAwKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHJldCA9IGRlY29kZV9pY3NfaW5mbyhhYywgaWNzLCBnYik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAogICAgIGlmICgocmV0ID0gZGVjb2RlX2JhbmRfdHlwZXMoYWMsIHNjZS0+YmFuZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5iYW5kX3R5cGVfcnVuX2VuZCwgZ2IsIGljcykpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZ290byBmYWlsOwogICAgIGlmICgocmV0ID0gZGVjb2RlX3NjYWxlZmFjdG9ycyhhYywgc2NlLT5zZiwgZ2IsIGdsb2JhbF9nYWluLCBpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NlLT5iYW5kX3R5cGUsIHNjZS0+YmFuZF90eXBlX3J1bl9lbmQpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGdvdG8gZmFpbDsKIAogICAgIHB1bHNlX3ByZXNlbnQgPSAwOwogICAgIGlmICghc2NhbGVfZmxhZykgewpAQCAtMTk1MywzNyArMjA0NSw1MCBAQAogICAgICAgICAgICAgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IEVJR0hUX1NIT1JUX1NFUVVFTkNFKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiUHVsc2UgdG9vbCBub3QgYWxsb3dlZCBpbiBlaWdodCBzaG9ydCBzZXF1ZW5jZS5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGRlY29kZV9wdWxzZXMoJnB1bHNlLCBnYiwgaWNzLT5zd2Jfb2Zmc2V0LCBpY3MtPm51bV9zd2IpKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiUHVsc2UgZGF0YSBjb3JydXB0IG9yIGludmFsaWQuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICB0bnMtPnByZXNlbnQgPSBnZXRfYml0czEoZ2IpOwotICAgICAgICBpZiAodG5zLT5wcmVzZW50ICYmICFlcl9zeW50YXgpCi0gICAgICAgICAgICBpZiAoZGVjb2RlX3RucyhhYywgdG5zLCBnYiwgaWNzKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmICh0bnMtPnByZXNlbnQgJiYgIWVyX3N5bnRheCkgeworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3RucyhhYywgdG5zLCBnYiwgaWNzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQogICAgICAgICBpZiAoIWVsZF9zeW50YXggJiYgZ2V0X2JpdHMxKGdiKSkgewotICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGFjLT5hdmN0eCwgIlNTUiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgZGVjb2RlX2dhaW5fY29udHJvbChzY2UsIGdiKTsKKyAgICAgICAgICAgIGlmICghYWMtPndhcm5lZF9nYWluX2NvbnRyb2wpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhYy0+YXZjdHgsICJHYWluIGNvbnRyb2wiKTsKKyAgICAgICAgICAgICAgICBhYy0+d2FybmVkX2dhaW5fY29udHJvbCA9IDE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gSSBzZWUgbm8gdGV4dHVhbCBiYXNpcyBpbiB0aGUgc3BlYyBmb3IgdGhpcyBvY2N1cnJpbmcgYWZ0ZXIgU1NSIGdhaW4KICAgICAgICAgLy8gY29udHJvbCwgYnV0IHRoaXMgaXMgd2hhdCBib3RoIHJlZmVyZW5jZSBhbmQgcmVhbCBpbXBsbWVudGF0aW9ucyBkbwotICAgICAgICBpZiAodG5zLT5wcmVzZW50ICYmIGVyX3N5bnRheCkKLSAgICAgICAgICAgIGlmIChkZWNvZGVfdG5zKGFjLCB0bnMsIGdiLCBpY3MpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKHRucy0+cHJlc2VudCAmJiBlcl9zeW50YXgpIHsKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV90bnMoYWMsIHRucywgZ2IsIGljcyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoZGVjb2RlX3NwZWN0cnVtX2FuZF9kZXF1YW50KGFjLCBvdXQsIGdiLCBzY2UtPnNmLCBwdWxzZV9wcmVzZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB1bHNlLCBpY3MsIHNjZS0+YmFuZF90eXBlKSA8IDApCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHJldCA9IGRlY29kZV9zcGVjdHJ1bV9hbmRfZGVxdWFudChhYywgb3V0LCBnYiwgc2NlLT5zZiwgcHVsc2VfcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdWxzZSwgaWNzLCBzY2UtPmJhbmRfdHlwZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKIAogICAgIGlmIChhYy0+b2NbMV0ubTRhYy5vYmplY3RfdHlwZSA9PSBBT1RfQUFDX01BSU4gJiYgIWNvbW1vbl93aW5kb3cpCiAgICAgICAgIGFwcGx5X3ByZWRpY3Rpb24oYWMsIHNjZSk7CiAKICAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgdG5zLT5wcmVzZW50ID0gMDsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTIxNTUsNyArMjI2MCwxMSBAQAogICAgIGNvdXAtPmNvdXBsaW5nX3BvaW50ICs9IGdldF9iaXRzMShnYikgfHwgKGNvdXAtPmNvdXBsaW5nX3BvaW50ID4+IDEpOwogCiAgICAgc2lnbiAgPSBnZXRfYml0cyhnYiwgMSk7Ci0gICAgc2NhbGUgPSBBQUNfUkVOQU1FKGNjZV9zY2FsZSlbZ2V0X2JpdHMoZ2IsIDIpXTsKKyNpZiBVU0VfRklYRUQKKyAgICBzY2FsZSA9IGdldF9iaXRzKGdiLCAyKTsKKyNlbHNlCisgICAgc2NhbGUgPSBjY2Vfc2NhbGVbZ2V0X2JpdHMoZ2IsIDIpXTsKKyNlbmRpZgogCiAgICAgaWYgKChyZXQgPSBkZWNvZGVfaWNzKGFjLCBzY2UsIGdiLCAwLCAwKSkpCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC0yMTY5LDYgKzIyNzgsMTAgQEAKICAgICAgICAgICAgIGNnZSA9IGNvdXAtPmNvdXBsaW5nX3BvaW50ID09IEFGVEVSX0lNRENUID8gMSA6IGdldF9iaXRzMShnYik7CiAgICAgICAgICAgICBnYWluID0gY2dlID8gZ2V0X3ZsYzIoZ2IsIHZsY19zY2FsZWZhY3RvcnMudGFibGUsIDcsIDMpIC0gNjA6IDA7CiAgICAgICAgICAgICBnYWluX2NhY2hlID0gR0VUX0dBSU4oc2NhbGUsIGdhaW4pOworI2lmIFVTRV9GSVhFRAorICAgICAgICAgICAgaWYgKChhYnMoZ2Fpbl9jYWNoZSktMTAyNCkgPj4gMyA+IDMwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVSQU5HRSk7CisjZW5kaWYKICAgICAgICAgfQogICAgICAgICBpZiAoY291cC0+Y291cGxpbmdfcG9pbnQgPT0gQUZURVJfSU1EQ1QpIHsKICAgICAgICAgICAgIGNvdXAtPmdhaW5bY11bMF0gPSBnYWluX2NhY2hlOwpAQCAtMjE4Niw2ICsyMjk5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID4+PSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fY2FjaGUgPSBHRVRfR0FJTihzY2FsZSwgdCkgKiBzOworI2lmIFVTRV9GSVhFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGFicyhnYWluX2NhY2hlKS0xMDI0KSA+PiAzID4gMzApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgY291cC0+Z2FpbltjXVtpZHhdID0gZ2Fpbl9jYWNoZTsKQEAgLTIzMTgsNiArMjQzNSwxMyBAQAogICAgICAgICBpZiAoIWNoZSkgewogICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU0JSIHdhcyBmb3VuZCBiZWZvcmUgdGhlIGZpcnN0IGNoYW5uZWwgZWxlbWVudC5cbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfSBlbHNlIGlmIChhYy0+b2NbMV0ubTRhYy5mcmFtZV9sZW5ndGhfc2hvcnQpIHsKKyAgICAgICAgICAgIGlmICghYWMtPndhcm5lZF85NjBfc2JyKQorICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhYy0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTQlIgd2l0aCA5NjAgZnJhbWUgbGVuZ3RoIik7CisgICAgICAgICAgICBhYy0+d2FybmVkXzk2MF9zYnIgPSAxOworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDggKiBjbnQgLSA0KTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0gZWxzZSBpZiAoIWFjLT5vY1sxXS5tNGFjLnNicikgewogICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU0JSIHNpZ25hbGVkIHRvIGJlIG5vdC1wcmVzZW50IGJ1dCB3YXMgZm91bmQgaW4gdGhlIGJpdHN0cmVhbS5cbiIpOwogICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDggKiBjbnQgLSA0KTsKQEAgLTIzNTksNyArMjQ4Myw3IEBACiAgKiBAcGFyYW0gICBkZWNvZGUgIDEgaWYgdG9vbCBpcyB1c2VkIG5vcm1hbGx5LCAwIGlmIHRvb2wgaXMgdXNlZCBpbiBMVFAuCiAgKiBAcGFyYW0gICBjb2VmICAgIHNwZWN0cmFsIGNvZWZmaWNpZW50cwogICovCi1zdGF0aWMgdm9pZCBhcHBseV90bnMoSU5URkxPQVQgY29lZlsxMDI0XSwgVGVtcG9yYWxOb2lzZVNoYXBpbmcgKnRucywKK3N0YXRpYyB2b2lkIGFwcGx5X3RucyhJTlRGTE9BVCBjb2VmX3BhcmFtWzEwMjRdLCBUZW1wb3JhbE5vaXNlU2hhcGluZyAqdG5zLAogICAgICAgICAgICAgICAgICAgICAgIEluZGl2aWR1YWxDaGFubmVsU3RyZWFtICppY3MsIGludCBkZWNvZGUpCiB7CiAgICAgY29uc3QgaW50IG1tbSA9IEZGTUlOKGljcy0+dG5zX21heF9iYW5kcywgaWNzLT5tYXhfc2ZiKTsKQEAgLTIzNjcsNiArMjQ5MSw3IEBACiAgICAgaW50IGJvdHRvbSwgdG9wLCBvcmRlciwgc3RhcnQsIGVuZCwgc2l6ZSwgaW5jOwogICAgIElOVEZMT0FUIGxwY1tUTlNfTUFYX09SREVSXTsKICAgICBJTlRGTE9BVCB0bXBbVE5TX01BWF9PUkRFUisxXTsKKyAgICBVSU5URkxPQVQgKmNvZWYgPSBjb2VmX3BhcmFtOwogCiAgICAgZm9yICh3ID0gMDsgdyA8IGljcy0+bnVtX3dpbmRvd3M7IHcrKykgewogICAgICAgICBib3R0b20gPSBpY3MtPm51bV9zd2I7CkBAIC0yMzk2LDcgKzI1MjEsNyBAQAogICAgICAgICAgICAgICAgIC8vIGFyIGZpbHRlcgogICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBzaXplOyBtKyssIHN0YXJ0ICs9IGluYykKICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBGRk1JTihtLCBvcmRlcik7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZbc3RhcnRdIC09IEFBQ19NVUwyNihjb2VmW3N0YXJ0IC0gaSAqIGluY10sIGxwY1tpIC0gMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY29lZltzdGFydF0gLT0gQUFDX01VTDI2KChJTlRGTE9BVCljb2VmW3N0YXJ0IC0gaSAqIGluY10sIGxwY1tpIC0gMV0pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBtYSBmaWx0ZXIKICAgICAgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgc2l6ZTsgbSsrLCBzdGFydCArPSBpbmMpIHsKQEAgLTI0NjYsNyArMjU5MSw3IEBACiAgICAgICAgIGZvciAoc2ZiID0gMDsgc2ZiIDwgRkZNSU4oc2NlLT5pY3MubWF4X3NmYiwgTUFYX0xUUF9MT05HX1NGQik7IHNmYisrKQogICAgICAgICAgICAgaWYgKGx0cC0+dXNlZFtzZmJdKQogICAgICAgICAgICAgICAgIGZvciAoaSA9IG9mZnNldHNbc2ZiXTsgaSA8IG9mZnNldHNbc2ZiICsgMV07IGkrKykKLSAgICAgICAgICAgICAgICAgICAgc2NlLT5jb2VmZnNbaV0gKz0gcHJlZEZyZXFbaV07CisgICAgICAgICAgICAgICAgICAgIHNjZS0+Y29lZmZzW2ldICs9IChVSU5URkxPQVQpcHJlZEZyZXFbaV07CiAgICAgfQogfQogCkBAIC0yNTc2LDYgKzI3MDEsNzIgQEAKICAgICB9CiB9CiAKKy8qKgorICogQ29uZHVjdCBJTURDVCBhbmQgd2luZG93aW5nLgorICovCitzdGF0aWMgdm9pZCBpbWRjdF9hbmRfd2luZG93aW5nXzk2MChBQUNDb250ZXh0ICphYywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSkKK3sKKyNpZiAhVVNFX0ZJWEVECisgICAgSW5kaXZpZHVhbENoYW5uZWxTdHJlYW0gKmljcyA9ICZzY2UtPmljczsKKyAgICBJTlRGTE9BVCAqaW4gICAgPSBzY2UtPmNvZWZmczsKKyAgICBJTlRGTE9BVCAqb3V0ICAgPSBzY2UtPnJldDsKKyAgICBJTlRGTE9BVCAqc2F2ZWQgPSBzY2UtPnNhdmVkOworICAgIGNvbnN0IElOVEZMT0FUICpzd2luZG93ICAgICAgPSBpY3MtPnVzZV9rYl93aW5kb3dbMF0gPyBBQUNfUkVOQU1FKGZmX2FhY19rYmRfc2hvcnRfMTIwKSA6IEFBQ19SRU5BTUUoZmZfc2luZV8xMjApOworICAgIGNvbnN0IElOVEZMT0FUICpsd2luZG93X3ByZXYgPSBpY3MtPnVzZV9rYl93aW5kb3dbMV0gPyBBQUNfUkVOQU1FKGZmX2FhY19rYmRfbG9uZ185NjApIDogQUFDX1JFTkFNRShmZl9zaW5lXzk2MCk7CisgICAgY29uc3QgSU5URkxPQVQgKnN3aW5kb3dfcHJldiA9IGljcy0+dXNlX2tiX3dpbmRvd1sxXSA/IEFBQ19SRU5BTUUoZmZfYWFjX2tiZF9zaG9ydF8xMjApIDogQUFDX1JFTkFNRShmZl9zaW5lXzEyMCk7CisgICAgSU5URkxPQVQgKmJ1ZiAgPSBhYy0+YnVmX21kY3Q7CisgICAgSU5URkxPQVQgKnRlbXAgPSBhYy0+dGVtcDsKKyAgICBpbnQgaTsKKworICAgIC8vIGltZGN0CisgICAgaWYgKGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IEVJR0hUX1NIT1JUX1NFUVVFTkNFKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBhYy0+bWRjdDEyMC0+aW1kY3RfaGFsZihhYy0+bWRjdDEyMCwgYnVmICsgaSAqIDEyMCwgaW4gKyBpICogMTI4LCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhYy0+bWRjdDk2MC0+aW1kY3RfaGFsZihhYy0+bWRjdDk2MCwgYnVmLCBpbiwgMSk7CisgICAgfQorCisgICAgLyogd2luZG93IG92ZXJsYXBwaW5nCisgICAgICogTk9URTogVG8gc2ltcGxpZnkgdGhlIG92ZXJsYXBwaW5nIGNvZGUsIGFsbCAnbWVhbmluZ2xlc3MnIHNob3J0IHRvIGxvbmcKKyAgICAgKiBhbmQgbG9uZyB0byBzaG9ydCB0cmFuc2l0aW9ucyBhcmUgY29uc2lkZXJlZCB0byBiZSBzaG9ydCB0byBzaG9ydAorICAgICAqIHRyYW5zaXRpb25zLiBUaGlzIGxlYXZlcyBqdXN0IHR3byBjYXNlcyAobG9uZyB0byBsb25nIGFuZCBzaG9ydCB0byBzaG9ydCkKKyAgICAgKiB3aXRoIGEgbGl0dGxlIHNwZWNpYWwgc2F1Y2UgZm9yIEVJR0hUX1NIT1JUX1NFUVVFTkNFLgorICAgICAqLworCisgICAgaWYgKChpY3MtPndpbmRvd19zZXF1ZW5jZVsxXSA9PSBPTkxZX0xPTkdfU0VRVUVOQ0UgfHwgaWNzLT53aW5kb3dfc2VxdWVuY2VbMV0gPT0gTE9OR19TVE9QX1NFUVVFTkNFKSAmJgorICAgICAgICAoaWNzLT53aW5kb3dfc2VxdWVuY2VbMF0gPT0gT05MWV9MT05HX1NFUVVFTkNFIHx8IGljcy0+d2luZG93X3NlcXVlbmNlWzBdID09IExPTkdfU1RBUlRfU0VRVUVOQ0UpKSB7CisgICAgICAgIGFjLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3coICAgIG91dCwgICAgICAgICAgICAgICBzYXZlZCwgICAgICAgICAgICBidWYsICAgICAgICAgbHdpbmRvd19wcmV2LCA0ODApOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweSggICAgICAgICAgICAgICAgICAgICAgICAgIG91dCwgICAgICAgICAgICAgICBzYXZlZCwgICAgICAgICAgICA0MjAgKiBzaXplb2YoKm91dCkpOworCisgICAgICAgIGlmIChpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9PSBFSUdIVF9TSE9SVF9TRVFVRU5DRSkgeworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0MjAgKyAwKjEyMCwgc2F2ZWQgKyA0MjAsICAgICAgYnVmICsgMCoxMjAsIHN3aW5kb3dfcHJldiwgNjApOworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0MjAgKyAxKjEyMCwgYnVmICsgMCoxMjAgKyA2MCwgYnVmICsgMSoxMjAsIHN3aW5kb3csICAgICAgNjApOworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0MjAgKyAyKjEyMCwgYnVmICsgMSoxMjAgKyA2MCwgYnVmICsgMioxMjAsIHN3aW5kb3csICAgICAgNjApOworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0MjAgKyAzKjEyMCwgYnVmICsgMioxMjAgKyA2MCwgYnVmICsgMyoxMjAsIHN3aW5kb3csICAgICAgNjApOworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyh0ZW1wLCAgICAgICAgICAgICAgYnVmICsgMyoxMjAgKyA2MCwgYnVmICsgNCoxMjAsIHN3aW5kb3csICAgICAgNjApOworICAgICAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgICBvdXQgKyA0MjAgKyA0KjEyMCwgdGVtcCwgNjAgKiBzaXplb2YoKm91dCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWMtPmZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvdXQgKyA0MjAsICAgICAgICAgc2F2ZWQgKyA0MjAsICAgICAgYnVmLCAgICAgICAgIHN3aW5kb3dfcHJldiwgNjApOworICAgICAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgICBvdXQgKyA1NDAsICAgICAgICAgYnVmICsgNjAsICAgICAgICAgNDIwICogc2l6ZW9mKCpvdXQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGJ1ZmZlciB1cGRhdGUKKyAgICBpZiAoaWNzLT53aW5kb3dfc2VxdWVuY2VbMF0gPT0gRUlHSFRfU0hPUlRfU0VRVUVOQ0UpIHsKKyAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgICBzYXZlZCwgICAgICAgdGVtcCArIDYwLCAgICAgICAgIDYwICogc2l6ZW9mKCpzYXZlZCkpOworICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHNhdmVkICsgNjAsICBidWYgKyA0KjEyMCArIDYwLCBidWYgKyA1KjEyMCwgc3dpbmRvdywgNjApOworICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHNhdmVkICsgMTgwLCBidWYgKyA1KjEyMCArIDYwLCBidWYgKyA2KjEyMCwgc3dpbmRvdywgNjApOworICAgICAgICBhYy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KHNhdmVkICsgMzAwLCBidWYgKyA2KjEyMCArIDYwLCBidWYgKyA3KjEyMCwgc3dpbmRvdywgNjApOworICAgICAgICBtZW1jcHkoICAgICAgICAgICAgICAgICAgICAgIHNhdmVkICsgNDIwLCBidWYgKyA3KjEyMCArIDYwLCAgNjAgKiBzaXplb2YoKnNhdmVkKSk7CisgICAgfSBlbHNlIGlmIChpY3MtPndpbmRvd19zZXF1ZW5jZVswXSA9PSBMT05HX1NUQVJUX1NFUVVFTkNFKSB7CisgICAgICAgIG1lbWNweSggICAgICAgICAgICAgICAgICAgICAgc2F2ZWQsICAgICAgIGJ1ZiArIDQ4MCwgICAgICAgIDQyMCAqIHNpemVvZigqc2F2ZWQpKTsKKyAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgICBzYXZlZCArIDQyMCwgYnVmICsgNyoxMjAgKyA2MCwgIDYwICogc2l6ZW9mKCpzYXZlZCkpOworICAgIH0gZWxzZSB7IC8vIExPTkdfU1RPUCBvciBPTkxZX0xPTkcKKyAgICAgICAgbWVtY3B5KCAgICAgICAgICAgICAgICAgICAgICBzYXZlZCwgICAgICAgYnVmICsgNDgwLCAgICAgICAgNDgwICogc2l6ZW9mKCpzYXZlZCkpOworICAgIH0KKyNlbmRpZgorfQogc3RhdGljIHZvaWQgaW1kY3RfYW5kX3dpbmRvd2luZ19sZChBQUNDb250ZXh0ICphYywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSkKIHsKICAgICBJbmRpdmlkdWFsQ2hhbm5lbFN0cmVhbSAqaWNzID0gJnNjZS0+aWNzOwpAQCAtMjYzNCw3ICsyODI1LDcgQEAKICAgICB9CiAjaWYgIVVTRV9GSVhFRAogICAgIGlmIChuID09IDQ4MCkKLSAgICAgICAgYWMtPm1kY3Q0ODAtPmltZGN0X2hhbGYoYWMtPm1kY3Q0ODAsIGJ1ZiwgaW4sIDEsIC0xLmYvKDE2KjEwMjQqOTYwKSk7CisgICAgICAgIGFjLT5tZGN0NDgwLT5pbWRjdF9oYWxmKGFjLT5tZGN0NDgwLCBidWYsIGluLCAxKTsKICAgICBlbHNlCiAjZW5kaWYKICAgICAgICAgYWMtPm1kY3QuaW1kY3RfaGFsZigmYWMtPm1kY3RfbGQsIGJ1ZiwgaW4pOwpAQCAtMjcyNyw3ICsyOTE4LDEwIEBACiAgICAgICAgIGltZGN0X2FuZF93aW5kb3cgPSBpbWRjdF9hbmRfd2luZG93aW5nX2VsZDsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgaW1kY3RfYW5kX3dpbmRvdyA9IGFjLT5pbWRjdF9hbmRfd2luZG93aW5nOworICAgICAgICBpZiAoYWMtPm9jWzFdLm00YWMuZnJhbWVfbGVuZ3RoX3Nob3J0KQorICAgICAgICAgICAgaW1kY3RfYW5kX3dpbmRvdyA9IGltZGN0X2FuZF93aW5kb3dpbmdfOTYwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbWRjdF9hbmRfd2luZG93ID0gYWMtPmltZGN0X2FuZF93aW5kb3dpbmc7CiAgICAgfQogICAgIGZvciAodHlwZSA9IDM7IHR5cGUgPj0gMDsgdHlwZS0tKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRUxFTV9JRDsgaSsrKSB7CkBAIC0yNzcwLDkgKzI5NjQsOSBAQAogICAgICAgICAgICAgICAgICAgICBpbnQgajsKICAgICAgICAgICAgICAgICAgICAgLyogcHJlcGFyYXRpb24gZm9yIHJlc2FtcGxlciAqLwogICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGo8c2FtcGxlczsgaisrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZS0+Y2hbMF0ucmV0W2pdID0gKGludDMyX3QpYXZfY2xpcGxfaW50MzIoKGludDY0X3QpY2hlLT5jaFswXS5yZXRbal08PDcpKzB4ODAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoZS0+Y2hbMF0ucmV0W2pdID0gKGludDMyX3QpYXZfY2xpcDY0KChpbnQ2NF90KWNoZS0+Y2hbMF0ucmV0W2pdKjEyOCwgSU5UMzJfTUlOLCBJTlQzMl9NQVgtMHg4MDAwKSsweDgwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlID09IFRZUEVfQ1BFKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZS0+Y2hbMV0ucmV0W2pdID0gKGludDMyX3QpYXZfY2xpcGxfaW50MzIoKGludDY0X3QpY2hlLT5jaFsxXS5yZXRbal08PDcpKzB4ODAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGUtPmNoWzFdLnJldFtqXSA9IChpbnQzMl90KWF2X2NsaXA2NCgoaW50NjRfdCljaGUtPmNoWzFdLnJldFtqXSoxMjgsIElOVDMyX01JTiwgSU5UMzJfTUFYLTB4ODAwMCkrMHg4MDAwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogI2VuZGlmIC8qIFVTRV9GSVhFRCAqLwpAQCAtMjc5MSw3ICsyOTg1LDcgQEAKICAgICB1aW50OF90IGxheW91dF9tYXBbTUFYX0VMRU1fSUQqNF1bM107CiAgICAgaW50IGxheW91dF9tYXBfdGFncywgcmV0OwogCi0gICAgc2l6ZSA9IGF2cHJpdl9hYWNfcGFyc2VfaGVhZGVyKGdiLCAmaGRyX2luZm8pOworICAgIHNpemUgPSBmZl9hZHRzX2hlYWRlcl9wYXJzZShnYiwgJmhkcl9pbmZvKTsKICAgICBpZiAoc2l6ZSA+IDApIHsKICAgICAgICAgaWYgKCFhYy0+d2FybmVkX251bV9hYWNfZnJhbWVzICYmIGhkcl9pbmZvLm51bV9hYWNfZnJhbWVzICE9IDEpIHsKICAgICAgICAgICAgIC8vIFRoaXMgaXMgMiBmb3IgIlZMQiAiIGF1ZGlvIGluIE5TViBmaWxlcy4KQEAgLTI5MjMsMTAgKzMxMTcsMTEgQEAKIHsKICAgICBBQUNDb250ZXh0ICphYyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgQ2hhbm5lbEVsZW1lbnQgKmNoZSA9IE5VTEwsICpjaGVfcHJldiA9IE5VTEw7Ci0gICAgZW51bSBSYXdEYXRhQmxvY2tUeXBlIGVsZW1fdHlwZSwgZWxlbV90eXBlX3ByZXYgPSBUWVBFX0VORDsKKyAgICBlbnVtIFJhd0RhdGFCbG9ja1R5cGUgZWxlbV90eXBlLCBjaGVfcHJldl90eXBlID0gVFlQRV9FTkQ7CiAgICAgaW50IGVyciwgZWxlbV9pZDsKICAgICBpbnQgc2FtcGxlcyA9IDAsIG11bHRpcGxpZXIsIGF1ZGlvX2ZvdW5kID0gMCwgcGNlX2ZvdW5kID0gMDsKICAgICBpbnQgaXNfZG1vbm8sIHNjZV9jb3VudCA9IDA7CisgICAgaW50IHBheWxvYWRfYWxpZ25tZW50OwogCiAgICAgYWMtPmZyYW1lID0gZGF0YTsKIApAQCAtMjk0OSw2ICszMTQ0LDcgQEAKICAgICAvLyBUaGlzIG1heSBsZWFkIHRvIGFuIHVuZGVmaW5lZCBwcm9maWxlIGJlaW5nIHNpZ25hbGVkCiAgICAgYWMtPmF2Y3R4LT5wcm9maWxlID0gYWMtPm9jWzFdLm00YWMub2JqZWN0X3R5cGUgLSAxOwogCisgICAgcGF5bG9hZF9hbGlnbm1lbnQgPSBnZXRfYml0c19jb3VudChnYik7CiAgICAgYWMtPnRhZ3NfbWFwcGVkID0gMDsKICAgICAvLyBwYXJzZQogICAgIHdoaWxlICgoZWxlbV90eXBlID0gZ2V0X2JpdHMoZ2IsIDMpKSAhPSBUWVBFX0VORCkgewpAQCAtMjk2OSw3ICszMTY1LDcgQEAKICAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhbXBsZXMgPSAxMDI0OworICAgICAgICAgICAgc2FtcGxlcyA9IGFjLT5vY1sxXS5tNGFjLmZyYW1lX2xlbmd0aF9zaG9ydCA/IDk2MCA6IDEwMjQ7CiAgICAgICAgICAgICBjaGUtPnByZXNlbnQgPSAxOwogICAgICAgICB9CiAKQEAgLTMwMDIsOCArMzE5OCwxNSBAQAogICAgICAgICBjYXNlIFRZUEVfUENFOiB7CiAgICAgICAgICAgICB1aW50OF90IGxheW91dF9tYXBbTUFYX0VMRU1fSUQqNF1bM107CiAgICAgICAgICAgICBpbnQgdGFnczsKLSAgICAgICAgICAgIHB1c2hfb3V0cHV0X2NvbmZpZ3VyYXRpb24oYWMpOwotICAgICAgICAgICAgdGFncyA9IGRlY29kZV9wY2UoYXZjdHgsICZhYy0+b2NbMV0ubTRhYywgbGF5b3V0X21hcCwgZ2IpOworCisgICAgICAgICAgICBpbnQgcHVzaGVkID0gcHVzaF9vdXRwdXRfY29uZmlndXJhdGlvbihhYyk7CisgICAgICAgICAgICBpZiAocGNlX2ZvdW5kICYmICFwdXNoZWQpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGFncyA9IGRlY29kZV9wY2UoYXZjdHgsICZhYy0+b2NbMV0ubTRhYywgbGF5b3V0X21hcCwgZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX2FsaWdubWVudCk7CiAgICAgICAgICAgICBpZiAodGFncyA8IDApIHsKICAgICAgICAgICAgICAgICBlcnIgPSB0YWdzOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzAxMSw2ICszMjE0LDcgQEAKICAgICAgICAgICAgIGlmIChwY2VfZm91bmQpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBldmFsdWF0aW5nIGEgZnVydGhlciBwcm9ncmFtX2NvbmZpZ19lbGVtZW50IGFzIHRoaXMgY29uc3RydWN0IGlzIGR1YmlvdXMgYXQgYmVzdC5cbiIpOworICAgICAgICAgICAgICAgIHBvcF9vdXRwdXRfY29uZmlndXJhdGlvbihhYyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVyciA9IG91dHB1dF9jb25maWd1cmUoYWMsIGxheW91dF9tYXAsIHRhZ3MsIE9DX1RSSUFMX1BDRSwgMSk7CiAgICAgICAgICAgICAgICAgaWYgKCFlcnIpCkBAIC0zMDI5LDcgKzMyMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB3aGlsZSAoZWxlbV9pZCA+IDApCi0gICAgICAgICAgICAgICAgZWxlbV9pZCAtPSBkZWNvZGVfZXh0ZW5zaW9uX3BheWxvYWQoYWMsIGdiLCBlbGVtX2lkLCBjaGVfcHJldiwgZWxlbV90eXBlX3ByZXYpOworICAgICAgICAgICAgICAgIGVsZW1faWQgLT0gZGVjb2RlX2V4dGVuc2lvbl9wYXlsb2FkKGFjLCBnYiwgZWxlbV9pZCwgY2hlX3ByZXYsIGNoZV9wcmV2X3R5cGUpOwogICAgICAgICAgICAgZXJyID0gMDsgLyogRklYTUUgKi8KICAgICAgICAgICAgIGJyZWFrOwogCkBAIC0zMDM4LDggKzMyNDIsMTAgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2hlX3ByZXYgICAgICAgPSBjaGU7Ci0gICAgICAgIGVsZW1fdHlwZV9wcmV2ID0gZWxlbV90eXBlOworICAgICAgICBpZiAoZWxlbV90eXBlIDwgVFlQRV9EU0UpIHsKKyAgICAgICAgICAgIGNoZV9wcmV2ICAgICAgPSBjaGU7CisgICAgICAgICAgICBjaGVfcHJldl90eXBlID0gZWxlbV90eXBlOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGVycikKICAgICAgICAgICAgIGdvdG8gZmFpbDsKQEAgLTMwNjcsMTIgKzMyNzMsOCBAQAogICAgICAgICBhYy0+b2NbMV0uc3RhdHVzID0gT0NfTE9DS0VEOwogICAgIH0KIAotICAgIGlmIChtdWx0aXBsaWVyKSB7Ci0gICAgICAgIGludCBzaWRlX3NpemU7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZGUgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfU0tJUF9TQU1QTEVTLCAmc2lkZV9zaXplKTsKLSAgICAgICAgaWYgKHNpZGUgJiYgc2lkZV9zaXplPj00KQotICAgICAgICAgICAgQVZfV0wzMihzaWRlLCAyKkFWX1JMMzIoc2lkZSkpOwotICAgIH0KKyAgICBpZiAobXVsdGlwbGllcikKKyAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXNfbXVsdGlwbGllciA9IDI7CiAKICAgICBpZiAoIWFjLT5mcmFtZS0+ZGF0YVswXSAmJiBzYW1wbGVzKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibm8gZnJhbWUgZGF0YSBmb3VuZFxuIik7CkBAIC0zMTkwLDcgKzMzOTIsOSBAQAogICAgIGZmX21kY3RfZW5kKCZhYy0+bWRjdF9sZCk7CiAgICAgZmZfbWRjdF9lbmQoJmFjLT5tZGN0X2x0cCk7CiAjaWYgIVVTRV9GSVhFRAotICAgIGZmX2ltZGN0MTVfdW5pbml0KCZhYy0+bWRjdDQ4MCk7CisgICAgZmZfbWRjdDE1X3VuaW5pdCgmYWMtPm1kY3QxMjApOworICAgIGZmX21kY3QxNV91bmluaXQoJmFjLT5tZGN0NDgwKTsKKyAgICBmZl9tZGN0MTVfdW5pbml0KCZhYy0+bWRjdDk2MCk7CiAjZW5kaWYKICAgICBhdl9mcmVlcCgmYWMtPmZkc3ApOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWNlbmMuYyBiL2xpYmF2Y29kZWMvYWFjZW5jLmMKaW5kZXggNWE3MGRhMS4uNmQ5NGM3NiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNlbmMuYworKysgYi9saWJhdmNvZGVjL2FhY2VuYy5jCkBAIC01MCwxNyArNTAsNTkgQEAKIAogc3RhdGljIEFWT25jZSBhYWNfdGFibGVfaW5pdCA9IEFWX09OQ0VfSU5JVDsKIAorc3RhdGljIHZvaWQgcHV0X3BjZShQdXRCaXRDb250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBpLCBqOworICAgIEFBQ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFBQ1BDRUluZm8gKnBjZSA9ICZzLT5wY2U7CisgICAgY29uc3QgaW50IGJpdGV4YWN0ID0gYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19CSVRFWEFDVDsKKyAgICBjb25zdCBjaGFyICphdXhfZGF0YSA9IGJpdGV4YWN0ID8gIkxhdmMiIDogTElCQVZDT0RFQ19JREVOVDsKKworICAgIHB1dF9iaXRzKHBiLCA0LCAwKTsKKworICAgIHB1dF9iaXRzKHBiLCAyLCBhdmN0eC0+cHJvZmlsZSk7CisgICAgcHV0X2JpdHMocGIsIDQsIHMtPnNhbXBsZXJhdGVfaW5kZXgpOworCisgICAgcHV0X2JpdHMocGIsIDQsIHBjZS0+bnVtX2VsZVswXSk7IC8qIEZyb250ICovCisgICAgcHV0X2JpdHMocGIsIDQsIHBjZS0+bnVtX2VsZVsxXSk7IC8qIFNpZGUgKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgcGNlLT5udW1fZWxlWzJdKTsgLyogQmFjayAqLworICAgIHB1dF9iaXRzKHBiLCAyLCBwY2UtPm51bV9lbGVbM10pOyAvKiBMRkUgKi8KKyAgICBwdXRfYml0cyhwYiwgMywgMCk7IC8qIEFzc29jIGRhdGEgKi8KKyAgICBwdXRfYml0cyhwYiwgNCwgMCk7IC8qIENDcyAqLworCisgICAgcHV0X2JpdHMocGIsIDEsIDApOyAvKiBTdGVyZW8gbWl4ZG93biAqLworICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsgLyogTW9ubyBtaXhkb3duICovCisgICAgcHV0X2JpdHMocGIsIDEsIDApOyAvKiBTb21ldGhpbmcgZWxzZSAqLworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGNlLT5udW1fZWxlW2ldOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChpIDwgMykKKyAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgcGNlLT5wYWlyaW5nW2ldW2pdKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCA0LCBwY2UtPmluZGV4W2ldW2pdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cyhwYik7CisgICAgcHV0X2JpdHMocGIsIDgsIHN0cmxlbihhdXhfZGF0YSkpOworICAgIGF2cHJpdl9wdXRfc3RyaW5nKHBiLCBhdXhfZGF0YSwgMCk7Cit9CisKIC8qKgogICogTWFrZSBBQUMgYXVkaW8gY29uZmlnIG9iamVjdC4KICAqIEBzZWUgMS42LjIuMSAiU3ludGF4IC0gQXVkaW9TcGVjaWZpY0NvbmZpZyIKICAqLwotc3RhdGljIHZvaWQgcHV0X2F1ZGlvX3NwZWNpZmljX2NvbmZpZyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCitzdGF0aWMgaW50IHB1dF9hdWRpb19zcGVjaWZpY19jb25maWcoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIFB1dEJpdENvbnRleHQgcGI7CiAgICAgQUFDRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IGNoYW5uZWxzID0gcy0+Y2hhbm5lbHMgLSAocy0+Y2hhbm5lbHMgPT0gOCA/IDEgOiAwKTsKKyAgICBpbnQgY2hhbm5lbHMgPSAoIXMtPm5lZWRzX3BjZSkqKHMtPmNoYW5uZWxzIC0gKHMtPmNoYW5uZWxzID09IDggPyAxIDogMCkpOworICAgIGNvbnN0IGludCBtYXhfc2l6ZSA9IDMyOwogCi0gICAgaW5pdF9wdXRfYml0cygmcGIsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3oobWF4X3NpemUpOworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGluaXRfcHV0X2JpdHMoJnBiLCBhdmN0eC0+ZXh0cmFkYXRhLCBtYXhfc2l6ZSk7CiAgICAgcHV0X2JpdHMoJnBiLCA1LCBzLT5wcm9maWxlKzEpOyAvL3Byb2ZpbGUKICAgICBwdXRfYml0cygmcGIsIDQsIHMtPnNhbXBsZXJhdGVfaW5kZXgpOyAvL3NhbXBsZSByYXRlIGluZGV4CiAgICAgcHV0X2JpdHMoJnBiLCA0LCBjaGFubmVscyk7CkBAIC02OCwyMSArMTEwLDI1IEBACiAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLy9mcmFtZSBsZW5ndGggLSAxMDI0IHNhbXBsZXMKICAgICBwdXRfYml0cygmcGIsIDEsIDApOyAvL2RvZXMgbm90IGRlcGVuZCBvbiBjb3JlIGNvZGVyCiAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLy9pcyBub3QgZXh0ZW5zaW9uCisgICAgaWYgKHMtPm5lZWRzX3BjZSkKKyAgICAgICAgcHV0X3BjZSgmcGIsIGF2Y3R4KTsKIAogICAgIC8vRXhwbGljaXRseSBNYXJrIFNCUiBhYnNlbnQKICAgICBwdXRfYml0cygmcGIsIDExLCAweDJiNyk7IC8vc3luYyBleHRlbnNpb24KICAgICBwdXRfYml0cygmcGIsIDUsICBBT1RfU0JSKTsKICAgICBwdXRfYml0cygmcGIsIDEsICAwKTsKICAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHB1dF9iaXRzX2NvdW50KCZwYikgPj4gMzsKKworICAgIHJldHVybiAwOwogfQogCiB2b2lkIGZmX3F1YW50aXplX2JhbmRfY29zdF9jYWNoZV9pbml0KHN0cnVjdCBBQUNFbmNDb250ZXh0ICpzKQogewotICAgIGludCBzZiwgZzsKLSAgICBmb3IgKHNmID0gMDsgc2YgPCAyNTY7IHNmKyspIHsKLSAgICAgICAgZm9yIChnID0gMDsgZyA8IDEyODsgZysrKSB7Ci0gICAgICAgICAgICBzLT5xdWFudGl6ZV9iYW5kX2Nvc3RfY2FjaGVbc2ZdW2ddLmJpdHMgPSAtMTsKLSAgICAgICAgfQorICAgICsrcy0+cXVhbnRpemVfYmFuZF9jb3N0X2NhY2hlX2dlbmVyYXRpb247CisgICAgaWYgKHMtPnF1YW50aXplX2JhbmRfY29zdF9jYWNoZV9nZW5lcmF0aW9uID09IDApIHsKKyAgICAgICAgbWVtc2V0KHMtPnF1YW50aXplX2JhbmRfY29zdF9jYWNoZSwgMCwgc2l6ZW9mKHMtPnF1YW50aXplX2JhbmRfY29zdF9jYWNoZSkpOworICAgICAgICBzLT5xdWFudGl6ZV9iYW5kX2Nvc3RfY2FjaGVfZ2VuZXJhdGlvbiA9IDE7CiAgICAgfQogfQogCkBAIC00ODksNyArNTM1LDcgQEAKIHsKICAgICBpbnQgY2g7CiAgICAgaW50IGVuZCA9IDIwNDggKyAoZnJhbWUgPyBmcmFtZS0+bmJfc2FtcGxlcyA6IDApOwotICAgIGNvbnN0IHVpbnQ4X3QgKmNoYW5uZWxfbWFwID0gYWFjX2NoYW5fbWFwc1tzLT5jaGFubmVscyAtIDFdOworICAgIGNvbnN0IHVpbnQ4X3QgKmNoYW5uZWxfbWFwID0gcy0+cmVvcmRlcl9tYXA7CiAKICAgICAvKiBjb3B5IGFuZCByZW1hcCBpbnB1dCBzYW1wbGVzICovCiAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspIHsKQEAgLTUyMSwxMyArNTY3LDEzIEBACiAgICAgaW50IGNoYW5fZWxfY291bnRlcls0XTsKICAgICBGRlBzeVdpbmRvd0luZm8gd2luZG93c1tBQUNfTUFYX0NIQU5ORUxTXTsKIAotICAgIGlmIChzLT5sYXN0X2ZyYW1lID09IDIpCi0gICAgICAgIHJldHVybiAwOwotCiAgICAgLyogYWRkIGN1cnJlbnQgZnJhbWUgdG8gcXVldWUgKi8KICAgICBpZiAoZnJhbWUpIHsKICAgICAgICAgaWYgKChyZXQgPSBmZl9hZl9xdWV1ZV9hZGQoJnMtPmFmcSwgZnJhbWUpKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghcy0+YWZxLnJlbWFpbmluZ19zYW1wbGVzIHx8ICghcy0+YWZxLmZyYW1lX2FsbG9jICYmICFzLT5hZnEuZnJhbWVfY291bnQpKQorICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgY29weV9pbnB1dF9zYW1wbGVzKHMsIGZyYW1lKTsKQEAgLTU1NSwxMCArNjAxLDExIEBACiAgICAgICAgICAgICBpZiAoIWZyYW1lKQogICAgICAgICAgICAgICAgIGxhID0gTlVMTDsKICAgICAgICAgICAgIGlmICh0YWcgPT0gVFlQRV9MRkUpIHsKLSAgICAgICAgICAgICAgICB3aVtjaF0ud2luZG93X3R5cGVbMF0gPSBPTkxZX0xPTkdfU0VRVUVOQ0U7CisgICAgICAgICAgICAgICAgd2lbY2hdLndpbmRvd190eXBlWzBdID0gd2lbY2hdLndpbmRvd190eXBlWzFdID0gT05MWV9MT05HX1NFUVVFTkNFOwogICAgICAgICAgICAgICAgIHdpW2NoXS53aW5kb3dfc2hhcGUgICA9IDA7CiAgICAgICAgICAgICAgICAgd2lbY2hdLm51bV93aW5kb3dzICAgID0gMTsKICAgICAgICAgICAgICAgICB3aVtjaF0uZ3JvdXBpbmdbMF0gICAgPSAxOworICAgICAgICAgICAgICAgIHdpW2NoXS5jbGlwcGluZ1swXSAgICA9IDA7CiAKICAgICAgICAgICAgICAgICAvKiBPbmx5IHRoZSBsb3dlc3QgMTIgY29lZmZpY2llbnRzIGFyZSB1c2VkIGluIGEgTEZFIGNoYW5uZWwuCiAgICAgICAgICAgICAgICAgICogVGhlIGV4cHJlc3Npb24gYmVsb3cgcmVzdWx0cyBpbiBvbmx5IHRoZSBib3R0b20gOCBjb2VmZmljaWVudHMKQEAgLTU4Myw5ICs2MzAsMjIgQEAKICAgICAgICAgICAgIGljcy0+dG5zX21heF9iYW5kcyAgICAgID0gd2lbY2hdLndpbmRvd190eXBlWzBdID09IEVJR0hUX1NIT1JUX1NFUVVFTkNFID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl90bnNfbWF4X2JhbmRzXzEyOCBbcy0+c2FtcGxlcmF0ZV9pbmRleF06CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdG5zX21heF9iYW5kc18xMDI0W3MtPnNhbXBsZXJhdGVfaW5kZXhdOwotICAgICAgICAgICAgY2xpcF9hdm9pZGFuY2VfZmFjdG9yID0gMC4wZjsKKwogICAgICAgICAgICAgZm9yICh3ID0gMDsgdyA8IGljcy0+bnVtX3dpbmRvd3M7IHcrKykKICAgICAgICAgICAgICAgICBpY3MtPmdyb3VwX2xlblt3XSA9IHdpW2NoXS5ncm91cGluZ1t3XTsKKworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIGlucHV0IHNhbXBsZSBtYXhpbXVtcyBhbmQgZXZhbHVhdGUgY2xpcHBpbmcgcmlzayAqLworICAgICAgICAgICAgY2xpcF9hdm9pZGFuY2VfZmFjdG9yID0gMC4wZjsKKyAgICAgICAgICAgIGZvciAodyA9IDA7IHcgPCBpY3MtPm51bV93aW5kb3dzOyB3KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqd2J1ZiA9IG92ZXJsYXAgKyB3ICogMTI4OworICAgICAgICAgICAgICAgIGNvbnN0IGludCB3bGVuID0gMjA0OCAvIGljcy0+bnVtX3dpbmRvd3M7CisgICAgICAgICAgICAgICAgZmxvYXQgbWF4ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAvKiBtZGN0IGlucHV0IGlzIDIgKiBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2xlbjsgaisrKQorICAgICAgICAgICAgICAgICAgICBtYXggPSBGRk1BWChtYXgsIGZhYnNmKHdidWZbal0pKTsKKyAgICAgICAgICAgICAgICB3aVtjaF0uY2xpcHBpbmdbd10gPSBtYXg7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKHcgPSAwOyB3IDwgaWNzLT5udW1fd2luZG93czsgdysrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHdpW2NoXS5jbGlwcGluZ1t3XSA+IENMSVBfQVZPSURBTkNFX0ZBQ1RPUikgewogICAgICAgICAgICAgICAgICAgICBpY3MtPndpbmRvd19jbGlwcGluZ1t3XSA9IDE7CkBAIC02MDksOCArNjY5LDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDEwMjQ7IGsrKykgewotICAgICAgICAgICAgICAgIGlmICghaXNmaW5pdGUoY3BlLT5jaFtjaF0uY29lZmZzW2tdKSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIklucHV0IGNvbnRhaW5zIE5hTi8rLUluZlxuIik7CisgICAgICAgICAgICAgICAgaWYgKCEoZmFicyhjcGUtPmNoW2NoXS5jb2VmZnNba10pIDwgMUUxNikpIHsgLy8gRW5zdXJlIGhlYWRyb29tIGZvciBlbmVyZ3kgY2FsY3VsYXRpb24KKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dCBjb250YWlucyAobmVhcikgTmFOLystSW5mXG4iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC03NTYsNyArODE2LDcgQEAKICAgICAgICAgICAgIHN0YXJ0X2NoICs9IGNoYW5zOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGF2Y3R4LT5mbGFncyAmIENPREVDX0ZMQUdfUVNDQUxFKSB7CisgICAgICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FTQ0FMRSkgewogICAgICAgICAgICAgLyogV2hlbiB1c2luZyBhIGNvbnN0YW50IFEtc2NhbGUsIGRvbid0IG1lc3Mgd2l0aCBsYW1iZGEgKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC04MjgsOSArODg4LDYgQEAKICAgICBzLT5sYW1iZGFfc3VtICs9IHMtPmxhbWJkYTsKICAgICBzLT5sYW1iZGFfY291bnQrKzsKIAotICAgIGlmICghZnJhbWUpCi0gICAgICAgIHMtPmxhc3RfZnJhbWUrKzsKLQogICAgIGZmX2FmX3F1ZXVlX3JlbW92ZSgmcy0+YWZxLCBhdmN0eC0+ZnJhbWVfc2l6ZSwgJmF2cGt0LT5wdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICZhdnBrdC0+ZHVyYXRpb24pOwogCkBAIC04ODUsNyArOTQyLDYgQEAKICAgICBpbnQgY2g7CiAgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIHMtPmJ1ZmZlci5zYW1wbGVzLCBzLT5jaGFubmVscywgMyAqIDEwMjQgKiBzaXplb2Yocy0+YnVmZmVyLnNhbXBsZXNbMF0pLCBhbGxvY19mYWlsKTsKICAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhhdmN0eCwgcy0+Y3BlLCBzLT5jaGFuX21hcFswXSwgc2l6ZW9mKENoYW5uZWxFbGVtZW50KSwgYWxsb2NfZmFpbCk7Ci0gICAgRkZfQUxMT0NaX09SX0dPVE8oYXZjdHgsIGF2Y3R4LT5leHRyYWRhdGEsIDUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFLCBhbGxvY19mYWlsKTsKIAogICAgIGZvcihjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspCiAgICAgICAgIHMtPnBsYW5hcl9zYW1wbGVzW2NoXSA9IHMtPmJ1ZmZlci5zYW1wbGVzICsgMyAqIDEwMjQgKiBjaDsKQEAgLTkxMCwxNiArOTY2LDM1IEBACiAKICAgICAvKiBDb25zdGFudHMgKi8KICAgICBzLT5sYXN0X2ZyYW1lX3BiX2NvdW50ID0gMDsKLSAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSA1OwogICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gMTAyNDsKICAgICBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nID0gMTAyNDsKICAgICBzLT5sYW1iZGEgPSBhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgPiAwID8gYXZjdHgtPmdsb2JhbF9xdWFsaXR5IDogMTIwOwogCiAgICAgLyogQ2hhbm5lbCBtYXAgYW5kIHVuc3BlY2lmaWVkIGJpdHJhdGUgZ3Vlc3NpbmcgKi8KICAgICBzLT5jaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKLSAgICBFUlJPUl9JRihzLT5jaGFubmVscyA+IEFBQ19NQVhfQ0hBTk5FTFMgfHwgcy0+Y2hhbm5lbHMgPT0gNywKLSAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzOiAlZFxuIiwgcy0+Y2hhbm5lbHMpOwotICAgIHMtPmNoYW5fbWFwID0gYWFjX2NoYW5fY29uZmlnc1tzLT5jaGFubmVscy0xXTsKKworICAgIHMtPm5lZWRzX3BjZSA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGFhY19ub3JtYWxfY2hhbl9sYXlvdXRzKTsgaSsrKSB7CisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPT0gYWFjX25vcm1hbF9jaGFuX2xheW91dHNbaV0pIHsKKyAgICAgICAgICAgIHMtPm5lZWRzX3BjZSA9IHMtPm9wdGlvbnMucGNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+bmVlZHNfcGNlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhhYWNfcGNlX2NvbmZpZ3MpOyBpKyspCisgICAgICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID09IGFhY19wY2VfY29uZmlnc1tpXS5sYXlvdXQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIEVSUk9SX0lGKGkgPT0gRkZfQVJSQVlfRUxFTVMoYWFjX3BjZV9jb25maWdzKSwgIlVuc3VwcG9ydGVkIGNoYW5uZWwgbGF5b3V0XG4iKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlVzaW5nIGEgUENFIHRvIGVuY29kZSBjaGFubmVsIGxheW91dFxuIik7CisgICAgICAgIHMtPnBjZSA9IGFhY19wY2VfY29uZmlnc1tpXTsKKyAgICAgICAgcy0+cmVvcmRlcl9tYXAgPSBzLT5wY2UucmVvcmRlcl9tYXA7CisgICAgICAgIHMtPmNoYW5fbWFwID0gcy0+cGNlLmNvbmZpZ19tYXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+cmVvcmRlcl9tYXAgPSBhYWNfY2hhbl9tYXBzW3MtPmNoYW5uZWxzIC0gMV07CisgICAgICAgIHMtPmNoYW5fbWFwID0gYWFjX2NoYW5fY29uZmlnc1tzLT5jaGFubmVscyAtIDFdOworICAgIH0KKwogICAgIGlmICghYXZjdHgtPmJpdF9yYXRlKSB7CiAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gcy0+Y2hhbl9tYXBbMF07IGkrKykgewogICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlICs9IHMtPmNoYW5fbWFwW2ldID09IFRZUEVfQ1BFID8gMTI4MDAwIDogLyogUGFpciAqLwpAQCAtOTg2LDkgKzEwNjEsOSBAQAogCiAgICAgLyogQ29kZXIgbGltaXRhdGlvbnMgKi8KICAgICBzLT5jb2RlciA9ICZmZl9hYWNfY29kZXJzW3MtPm9wdGlvbnMuY29kZXJdOwotICAgIGlmIChzLT5vcHRpb25zLmNvZGVyICE9IEFBQ19DT0RFUl9UV09MT09QKSB7CisgICAgaWYgKHMtPm9wdGlvbnMuY29kZXIgPT0gQUFDX0NPREVSX0FOTVIpIHsKICAgICAgICAgRVJST1JfSUYoYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMLAotICAgICAgICAgICAgICAgICAiQ29kZXJzIG90aGVyIHRoYW4gdHdvbG9vcCByZXF1aXJlIC1zdHJpY3QgLTIgYW5kIHNvbWUgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZVxuIik7CisgICAgICAgICAgICAgICAgICJUaGUgQU5NUiBjb2RlciBpcyBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCwgYWRkIC1zdHJpY3QgLTIgdG8gZW5hYmxlIVxuIik7CiAgICAgICAgIHMtPm9wdGlvbnMuaW50ZW5zaXR5X3N0ZXJlbyA9IDA7CiAgICAgICAgIHMtPm9wdGlvbnMucG5zID0gMDsKICAgICB9CkBAIC0xMDA1LDcgKzEwODAsOCBAQAogICAgIGlmICgocmV0ID0gYWxsb2NfYnVmZmVycyhhdmN0eCwgcykpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCi0gICAgcHV0X2F1ZGlvX3NwZWNpZmljX2NvbmZpZyhhdmN0eCk7CisgICAgaWYgKChyZXQgPSBwdXRfYXVkaW9fc3BlY2lmaWNfY29uZmlnKGF2Y3R4KSkpCisgICAgICAgIGdvdG8gZmFpbDsKIAogICAgIHNpemVzWzBdICAgPSBmZl9hYWNfc3diX3NpemVfMTAyNFtzLT5zYW1wbGVyYXRlX2luZGV4XTsKICAgICBzaXplc1sxXSAgID0gZmZfYWFjX3N3Yl9zaXplXzEyOFtzLT5zYW1wbGVyYXRlX2luZGV4XTsKQEAgLTEwMTgsNyArMTA5NCwxMyBAQAogICAgICAgICBnb3RvIGZhaWw7CiAgICAgcy0+cHN5cHAgPSBmZl9wc3lfcHJlcHJvY2Vzc19pbml0KGF2Y3R4KTsKICAgICBmZl9scGNfaW5pdCgmcy0+bHBjLCAyKmF2Y3R4LT5mcmFtZV9zaXplLCBUTlNfTUFYX09SREVSLCBGRl9MUENfVFlQRV9MRVZJTlNPTik7Ci0gICAgYXZfbGZnX2luaXQoJnMtPmxmZywgMHg3MmFkY2E1NSk7CisgICAgcy0+cmFuZG9tX3N0YXRlID0gMHgxZjJlM2Q0YzsKKworICAgIHMtPmFic19wb3czNCAgID0gYWJzX3BvdzM0X3Y7CisgICAgcy0+cXVhbnRfYmFuZHMgPSBxdWFudGl6ZV9iYW5kczsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfYWFjX2RzcF9pbml0X3g4NihzKTsKIAogICAgIGlmIChIQVZFX01JUFNEU1ApCiAgICAgICAgIGZmX2FhY19jb2Rlcl9pbml0X21pcHMocyk7CkBAIC0xMDM2LDI0ICsxMTE4LDI1IEBACiAKICNkZWZpbmUgQUFDRU5DX0ZMQUdTIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBhYWNlbmNfb3B0aW9uc1tdID0gewotICAgIHsiYWFjX2NvZGVyIiwgIkNvZGluZyBhbGdvcml0aG0iLCBvZmZzZXRvZihBQUNFbmNDb250ZXh0LCBvcHRpb25zLmNvZGVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFBQ19DT0RFUl9UV09MT09QfSwgMCwgQUFDX0NPREVSX05CLTEsIEFBQ0VOQ19GTEFHUywgImNvZGVyIn0sCisgICAgeyJhYWNfY29kZXIiLCAiQ29kaW5nIGFsZ29yaXRobSIsIG9mZnNldG9mKEFBQ0VuY0NvbnRleHQsIG9wdGlvbnMuY29kZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQUFDX0NPREVSX0ZBU1R9LCAwLCBBQUNfQ09ERVJfTkItMSwgQUFDRU5DX0ZMQUdTLCAiY29kZXIifSwKICAgICAgICAgeyJhbm1yIiwgICAgICJBTk1SIG1ldGhvZCIsICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUFDX0NPREVSX0FOTVJ9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBBQUNFTkNfRkxBR1MsICJjb2RlciJ9LAogICAgICAgICB7InR3b2xvb3AiLCAgIlR3byBsb29wIHNlYXJjaGluZyBtZXRob2QiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBQUNfQ09ERVJfVFdPTE9PUH0sIElOVF9NSU4sIElOVF9NQVgsIEFBQ0VOQ19GTEFHUywgImNvZGVyIn0sCi0gICAgICAgIHsiZmFzdCIsICAgICAiQ29uc3RhbnQgcXVhbnRpemVyIiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFBQ19DT0RFUl9GQVNUfSwgICAgSU5UX01JTiwgSU5UX01BWCwgQUFDRU5DX0ZMQUdTLCAiY29kZXIifSwKKyAgICAgICAgeyJmYXN0IiwgICAgICJEZWZhdWx0IGZhc3Qgc2VhcmNoIiwgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQUFDX0NPREVSX0ZBU1R9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBBQUNFTkNfRkxBR1MsICJjb2RlciJ9LAogICAgIHsiYWFjX21zIiwgIkZvcmNlIE0vUyBzdGVyZW8gY29kaW5nIiwgb2Zmc2V0b2YoQUFDRW5jQ29udGV4dCwgb3B0aW9ucy5taWRfc2lkZSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gLTF9LCAtMSwgMSwgQUFDRU5DX0ZMQUdTfSwKICAgICB7ImFhY19pcyIsICJJbnRlbnNpdHkgc3RlcmVvIGNvZGluZyIsIG9mZnNldG9mKEFBQ0VuY0NvbnRleHQsIG9wdGlvbnMuaW50ZW5zaXR5X3N0ZXJlbyksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMX0sIC0xLCAxLCBBQUNFTkNfRkxBR1N9LAogICAgIHsiYWFjX3BucyIsICJQZXJjZXB0dWFsIG5vaXNlIHN1YnN0aXR1dGlvbiIsIG9mZnNldG9mKEFBQ0VuY0NvbnRleHQsIG9wdGlvbnMucG5zKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAxfSwgLTEsIDEsIEFBQ0VOQ19GTEFHU30sCiAgICAgeyJhYWNfdG5zIiwgIlRlbXBvcmFsIG5vaXNlIHNoYXBpbmciLCBvZmZzZXRvZihBQUNFbmNDb250ZXh0LCBvcHRpb25zLnRucyksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMX0sIC0xLCAxLCBBQUNFTkNfRkxBR1N9LAogICAgIHsiYWFjX2x0cCIsICJMb25nIHRlcm0gcHJlZGljdGlvbiIsIG9mZnNldG9mKEFBQ0VuY0NvbnRleHQsIG9wdGlvbnMubHRwKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgLTEsIDEsIEFBQ0VOQ19GTEFHU30sCiAgICAgeyJhYWNfcHJlZCIsICJBQUMtTWFpbiBwcmVkaWN0aW9uIiwgb2Zmc2V0b2YoQUFDRW5jQ29udGV4dCwgb3B0aW9ucy5wcmVkKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgLTEsIDEsIEFBQ0VOQ19GTEFHU30sCisgICAgeyJhYWNfcGNlIiwgIkZvcmNlcyB0aGUgdXNlIG9mIFBDRXMiLCBvZmZzZXRvZihBQUNFbmNDb250ZXh0LCBvcHRpb25zLnBjZSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIC0xLCAxLCBBQUNFTkNfRkxBR1N9LAogICAgIHtOVUxMfQogfTsKIAogc3RhdGljIGNvbnN0IEFWQ2xhc3MgYWFjZW5jX2NsYXNzID0gewotICAgICJBQUMgZW5jb2RlciIsCi0gICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgYWFjZW5jX29wdGlvbnMsCi0gICAgTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jbGFzc19uYW1lID0gIkFBQyBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gYWFjZW5jX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCiBzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgYWFjX2VuY29kZV9kZWZhdWx0c1tdID0gewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWNlbmMuaCBiL2xpYmF2Y29kZWMvYWFjZW5jLmgKaW5kZXggMjI1MmUyOS4uNWEwMTVjYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNlbmMuaAorKysgYi9saWJhdmNvZGVjL2FhY2VuYy5oCkBAIC0yMyw3ICsyMyw2IEBACiAjZGVmaW5lIEFWQ09ERUNfQUFDRU5DX0gKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgInB1dF9iaXRzLmgiCiAKQEAgLTQ2LDYgKzQ1LDcgQEAKICAgICBpbnQgcG5zOwogICAgIGludCB0bnM7CiAgICAgaW50IGx0cDsKKyAgICBpbnQgcGNlOwogICAgIGludCBwcmVkOwogICAgIGludCBtaWRfc2lkZTsKICAgICBpbnQgaW50ZW5zaXR5X3N0ZXJlbzsKQEAgLTc5LDE3ICs3OSwyOTcgQEAKICAgICB2b2lkICgqc2VhcmNoX2Zvcl9wcmVkKShzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcywgU2luZ2xlQ2hhbm5lbEVsZW1lbnQgKnNjZSk7CiB9IEFBQ0NvZWZmaWNpZW50c0VuY29kZXI7CiAKLWV4dGVybiBBQUNDb2VmZmljaWVudHNFbmNvZGVyIGZmX2FhY19jb2RlcnNbXTsKK2V4dGVybiBjb25zdCBBQUNDb2VmZmljaWVudHNFbmNvZGVyIGZmX2FhY19jb2RlcnNbXTsKIAogdHlwZWRlZiBzdHJ1Y3QgQUFDUXVhbnRpemVCYW5kQ29zdENhY2hlRW50cnkgewogICAgIGZsb2F0IHJkOwogICAgIGZsb2F0IGVuZXJneTsKLSAgICBpbnQgYml0czsgLy8vPCAtMSBtZWFucyB1bmluaXRpYWxpemVkIGVudHJ5CisgICAgaW50IGJpdHM7CiAgICAgY2hhciBjYjsKICAgICBjaGFyIHJ0ejsKLSAgICBjaGFyIHBhZGRpbmdbMl07IC8vLzwgS2VlcHMgdGhlIGVudHJ5IHNpemUgYSBtdWx0aXBsZSBvZiAzMiBiaXRzCisgICAgdWludDE2X3QgZ2VuZXJhdGlvbjsKIH0gQUFDUXVhbnRpemVCYW5kQ29zdENhY2hlRW50cnk7CiAKK3R5cGVkZWYgc3RydWN0IEFBQ1BDRUluZm8geworICAgIGludDY0X3QgbGF5b3V0OworICAgIGludCBudW1fZWxlWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJvbnQsIHNpZGUsIGJhY2ssIGxmZQorICAgIGludCBwYWlyaW5nWzNdWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZnJvbnQsIHNpZGUsIGJhY2sKKyAgICBpbnQgaW5kZXhbNF1bOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZyb250LCBzaWRlLCBiYWNrLCBsZmUKKyAgICB1aW50OF90IGNvbmZpZ19tYXBbMTZdOyAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvbmZpZ3MgdGhlIGVuY29kZXIncyBjaGFubmVsIHNwZWNpZmljIHNldHRpbmdzCisgICAgdWludDhfdCByZW9yZGVyX21hcFsxNl07ICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXBzIGNoYW5uZWxzIGZyb20gbGF2YyB0byBhYWMgb3JkZXIKK30gQUFDUENFSW5mbzsKKworLyoqCisgKiBMaXN0IG9mIFBDRSAoUHJvZ3JhbSBDb25maWd1cmF0aW9uIEVsZW1lbnQpIGZvciB0aGUgY2hhbm5lbCBsYXlvdXRzIGxpc3RlZAorICogaW4gY2hhbm5lbF9sYXlvdXQuaAorICoKKyAqIEZvciB0aG9zZSB3aXNoaW5nIGluIHRoZSBmdXR1cmUgdG8gYWRkIG90aGVyIGxheW91dHM6CisgKgorICogLSBudW1fZWxlOiBudW1iZXIgb2YgZWxlbWVudHMgaW4gZWFjaCBncm91cCBvZiBmcm9udCwgc2lkZSwgYmFjaywgbGZlIGNoYW5uZWxzCisgKiAgICAgICAgICAgIChhbiBlbGVtZW50IGlzIG9mIHR5cGUgU0NFIChzaW5nbGUgY2hhbm5lbCksIENQRSAoY2hhbm5lbCBwYWlyKSBmb3IKKyAqICAgICAgICAgICAgdGhlIGZpcnN0IDMgZ3JvdXBzOyBhbmQgaXMgTEZFIGZvciBMRkUgZ3JvdXApLgorICoKKyAqIC0gcGFpcmluZzogMCBmb3IgYW4gU0NFIGVsZW1lbnQgb3IgMSBmb3IgYSBDUEU7IGRvZXMgbm90IGFwcGx5IHRvIExGRSBncm91cAorICoKKyAqIC0gaW5kZXg6IHRoZXJlIGFyZSB0aHJlZSBpbmRlcGVuZGVudCBpbmRpY2VzIGZvciBTQ0UsIENQRSBhbmQgTEZFOworICogICAgIHRoZXkgYXJlIGluY3JlbWVudGVkIGlycmVzcGVjdGl2ZSBvZiB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhlIGVsZW1lbnQgYmVsb25nczsKKyAqICAgICB0aGV5IGFyZSBub3QgcmVzZXQgd2hlbiBnb2luZyBmcm9tIG9uZSBncm91cCB0byBhbm90aGVyCisgKgorICogICAgIEV4YW1wbGU6IGZvciA3LjAgY2hhbm5lbCBsYXlvdXQsCisgKiAgICAgICAgLnBhaXJpbmcgPSB7IHsgMSwgMCB9LCB7IDEgfSwgeyAxIH0sIH0sICgzIENQRSBhbmQgMSBTQ0UgaW4gZnJvbnQgZ3JvdXApCisgKiAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAxIH0sIHsgMiB9LCB9LAorICogICAgICAgICAgICAgICAoaW5kZXggaXMgMCBmb3IgdGhlIHNpbmdsZSBTQ0UgYnV0IGdvZXMgZnJvbSAwIHRvIDIgZm9yIHRoZSBDUEVzKQorICoKKyAqICAgICBUaGUgaW5kZXggb3JkZXIgaW1wYWN0cyB0aGUgY2hhbm5lbCBvcmRlcmluZy4gQnV0IGlzIG90aGVyd2lzZSBhcmJpdHJhcnkKKyAqICAgICAodGhlIHNlcXVlbmNlIGNvdWxkIGhhdmUgYmVlbiAyLCAwLCAxIGluc3RlYWQgb2YgMCwgMSwgMikuCisgKgorICogICAgIFNwZWMgYWxsb3dzIGZvciBkaXNjb250aW51b3VzIGluZGljZXMsIGUuZy4gaWYgb25lIGhhcyBhIHRvdGFsIG9mIHR3byBTQ0UsCisgKiAgICAgU0NFLjAgU0NFLjE1IGlzIE9LIHBlciBzcGVjOyBCVVQgaXQgd29uJ3QgYmUgZGVjb2RlZCBieSBvdXIgQUFDIGRlY29kZXIKKyAqICAgICB3aGljaCBhdCB0aGlzIHRpbWUgcmVxdWlyZXMgdGhhdCBpbmRpY2VzIGZ1bGx5IGNvdmVyIHNvbWUgcmFuZ2Ugc3RhcnRpbmcKKyAqICAgICBmcm9tIDAgKFNDRS4xIFNDRS4wIGlzIE9LIGJ1dCBub3QgU0NFLjAgU0NFLjE1KS4KKyAqCisgKiAtIGNvbmZpZ19tYXA6IHRvdGFsIG51bWJlciBvZiBlbGVtZW50cyBhbmQgdGhlaXIgdHlwZXMuIEJld2FyZSwgdGhlIHdheSB0aGUKKyAqICAgICAgICAgICAgICAgdHlwZXMgYXJlIG9yZGVyZWQgaW1wYWN0cyB0aGUgZmluYWwgY2hhbm5lbCBvcmRlcmluZy4KKyAqCisgKiAtIHJlb3JkZXJfbWFwOiByZW9yZGVycyB0aGUgY2hhbm5lbHMuCisgKgorICovCitzdGF0aWMgY29uc3QgQUFDUENFSW5mbyBhYWNfcGNlX2NvbmZpZ3NbXSA9IHsKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICAgICAgLm51bV9lbGUgPSB7IDEsIDAsIDAsIDAgfSwKKyAgICAgICAgLnBhaXJpbmcgPSB7IHsgMCB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCB9LCB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgMSwgVFlQRV9TQ0UsIH0sCisgICAgICAgIC5yZW9yZGVyX21hcCA9IHsgMCB9LAorICAgIH0sCisgICAgeworICAgICAgICAubGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTywKKyAgICAgICAgLm51bV9lbGUgPSB7IDEsIDAsIDAsIDAgfSwKKyAgICAgICAgLnBhaXJpbmcgPSB7IHsgMSB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCB9LCB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgMSwgVFlQRV9DUEUsIH0sCisgICAgICAgIC5yZW9yZGVyX21hcCA9IHsgMCwgMSB9LAorICAgIH0sCisgICAgeworICAgICAgICAubGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzJQT0lOVDEsCisgICAgICAgIC5udW1fZWxlID0geyAxLCAwLCAwLCAxIH0sCisgICAgICAgIC5wYWlyaW5nID0geyB7IDEgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAgfSx7IDAgfSx7IDAgfSx7IDAgfSB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgMiwgVFlQRV9DUEUsIFRZUEVfTEZFIH0sCisgICAgICAgIC5yZW9yZGVyX21hcCA9IHsgMCwgMSwgMiB9LAorICAgIH0sCisgICAgeworICAgICAgICAubGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzJfMSwKKyAgICAgICAgLm51bV9lbGUgPSB7IDEsIDAsIDEsIDAgfSwKKyAgICAgICAgLnBhaXJpbmcgPSB7IHsgMSB9LHsgMCB9LHsgMCB9IH0sCisgICAgICAgIC5pbmRleCA9IHsgeyAwIH0seyAwIH0seyAwIH0sIH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyAyLCBUWVBFX0NQRSwgVFlQRV9TQ0UgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1VSUk9VTkQsCisgICAgICAgIC5udW1fZWxlID0geyAyLCAwLCAwLCAwIH0sCisgICAgICAgIC5wYWlyaW5nID0geyB7IDEsIDAgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDIsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfM1BPSU5UMSwKKyAgICAgICAgLm51bV9lbGUgPSB7IDIsIDAsIDAsIDEgfSwKKyAgICAgICAgLnBhaXJpbmcgPSB7IHsgMSwgMCB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCwgMCB9LCB7IDAgfSwgeyAwIH0sIHsgMCB9LCB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgMywgVFlQRV9DUEUsIFRZUEVfU0NFLCBUWVBFX0xGRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF80UE9JTlQwLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMCwgMSwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0sIHsgMCB9LCB7IDAgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAwIH0sIHsgMSB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyAzLCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfU0NFIH0sCisgICAgICAgIC5yZW9yZGVyX21hcCA9IHsgIDAsIDEsIDIsIDMgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF80UE9JTlQxLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMSwgMSwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0sIHsgMCB9LCB7IDAgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAxIH0sIHsgMiB9LCB7IDAgfSB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgNCwgVFlQRV9DUEUsIFRZUEVfU0NFLCBUWVBFX1NDRSwgVFlQRV9TQ0UgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfMl8yLAorICAgICAgICAubnVtX2VsZSA9IHsgMSwgMSwgMCwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxIH0sIHsgMSB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCB9LCB7IDEgfSwgfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDIsIFRZUEVfQ1BFLCBUWVBFX0NQRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF9RVUFELAorICAgICAgICAubnVtX2VsZSA9IHsgMSwgMCwgMSwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxIH0sIHsgMCB9LCB7IDEgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAgfSwgeyAwIH0sIHsgMSB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyAyLCBUWVBFX0NQRSwgVFlQRV9DUEUgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzIH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfNVBPSU5UMCwKKyAgICAgICAgLm51bV9lbGUgPSB7IDIsIDEsIDAsIDAgfSwKKyAgICAgICAgLnBhaXJpbmcgPSB7IHsgMSwgMCB9LCB7IDEgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAxIH0gfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDMsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgVFlQRV9DUEUgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfNVBPSU5UMSwKKyAgICAgICAgLm51bV9lbGUgPSB7IDIsIDEsIDEsIDAgfSwKKyAgICAgICAgLnBhaXJpbmcgPSB7IHsgMSwgMCB9LCB7IDAgfSwgeyAxIH0sIH0sCisgICAgICAgIC5pbmRleCA9IHsgeyAwLCAwIH0sIHsgMSB9LCB7IDEgfSB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgNCwgVFlQRV9DUEUsIFRZUEVfU0NFLCBUWVBFX1NDRSwgVFlQRV9DUEUgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0LCA1IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMCwgMSwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0sIHsgMCB9LCB7IDEgfSB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCwgMCB9LCB7IDAgfSwgeyAxIH0gfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDMsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgVFlQRV9DUEUgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMSwgMSwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0sIHsgMCB9LCB7IDEgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAxIH0sIHsgMSB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyA0LCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfU0NFLCBUWVBFX0NQRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMsIDQsIDUgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF82UE9JTlQwLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMSwgMSwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0sIHsgMSB9LCB7IDAgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAxIH0sIHsgMSB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyA0LCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfQ1BFLCBUWVBFX1NDRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMsIDQsIDUgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF82UE9JTlQwX0ZST05ULAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMSwgMCwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAxIH0sIHsgMSB9IH0sCisgICAgICAgIC5pbmRleCA9IHsgeyAxLCAwIH0sIHsgMiB9LCB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgMywgVFlQRV9DUEUsIFRZUEVfQ1BFLCBUWVBFX0NQRSwgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0LCA1IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfSEVYQUdPTkFMLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMCwgMiwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0seyAwIH0seyAxLCAwIH0sIH0sCisgICAgICAgIC5pbmRleCA9IHsgeyAwLCAwIH0seyAwIH0seyAxLCAxIH0gfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDQsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgVFlQRV9DUEUsIFRZUEVfU0NFLCB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMsIDQsIDUgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF82UE9JTlQxLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMSwgMiwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0seyAwIH0seyAxLCAwIH0sIH0sCisgICAgICAgIC5pbmRleCA9IHsgeyAwLCAwIH0seyAxIH0seyAxLCAyIH0gfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDUsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgVFlQRV9TQ0UsIFRZUEVfQ1BFLCBUWVBFX1NDRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF82UE9JTlQxX0JBQ0ssCisgICAgICAgIC5udW1fZWxlID0geyAyLCAxLCAyLCAwIH0sCisgICAgICAgIC5wYWlyaW5nID0geyB7IDEsIDAgfSwgeyAwIH0sIHsgMSwgMCB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCwgMCB9LCB7IDEgfSwgeyAxLCAyIH0gfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDUsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgVFlQRV9TQ0UsIFRZUEVfQ1BFLCBUWVBFX1NDRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF82UE9JTlQxX0ZST05ULAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMSwgMiwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0sIHsgMCB9LCB7IDEsIDAgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAxIH0sIHsgMSwgMiB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyA1LCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9TQ0UgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfN1BPSU5UMCwKKyAgICAgICAgLm51bV9lbGUgPSB7IDIsIDEsIDEsIDAgfSwKKyAgICAgICAgLnBhaXJpbmcgPSB7IHsgMSwgMCB9LCB7IDEgfSwgeyAxIH0sIH0sCisgICAgICAgIC5pbmRleCA9IHsgeyAwLCAwIH0sIHsgMSB9LCB7IDIgfSwgfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDQsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgVFlQRV9DUEUsIFRZUEVfQ1BFIH0sCisgICAgICAgIC5yZW9yZGVyX21hcCA9IHsgMCwgMSwgMiwgMywgNCwgNSwgNiB9LAorICAgIH0sCisgICAgeworICAgICAgICAubGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzdQT0lOVDBfRlJPTlQsCisgICAgICAgIC5udW1fZWxlID0geyAyLCAxLCAxLCAwIH0sCisgICAgICAgIC5wYWlyaW5nID0geyB7IDEsIDAgfSwgeyAxIH0sIHsgMSB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCwgMCB9LCB7IDEgfSwgeyAyIH0sIH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyA0LCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfQ1BFLCBUWVBFX0NQRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF83UE9JTlQxLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMSwgMiwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0sIHsgMCB9LCB7IDEsIDEgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAxIH0sIHsgMSwgMiB9LCB7IDAgfSB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgNSwgVFlQRV9DUEUsIFRZUEVfU0NFLCAgVFlQRV9TQ0UsIFRZUEVfQ1BFLCBUWVBFX0NQRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREUsCisgICAgICAgIC5udW1fZWxlID0geyAyLCAxLCAyLCAwIH0sCisgICAgICAgIC5wYWlyaW5nID0geyB7IDEsIDAgfSwgeyAwIH0seyAgMSwgMSB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCwgMCB9LCB7IDEgfSwgeyAxLCAyIH0sIHsgMCB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyA1LCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9DUEUgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFX0JBQ0ssCisgICAgICAgIC5udW1fZWxlID0geyAyLCAxLCAyLCAwIH0sCisgICAgICAgIC5wYWlyaW5nID0geyB7IDEsIDAgfSwgeyAwIH0sIHsgMSwgMSB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCwgMCB9LCB7IDEgfSwgeyAxLCAyIH0sIHsgMCB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyA1LCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9DUEUgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3IH0sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5sYXlvdXQgPSBBVl9DSF9MQVlPVVRfT0NUQUdPTkFMLAorICAgICAgICAubnVtX2VsZSA9IHsgMiwgMSwgMiwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwIH0sIHsgMSB9LCB7IDEsIDAgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAgfSwgeyAxIH0sIHsgMiwgMSB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyA1LCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfQ1BFLCBUWVBFX0NQRSwgVFlQRV9TQ0UgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3IH0sCisgICAgfSwKKyAgICB7ICAgLyogTWVhbnQgZm9yIG9yZGVyIDIvbWl4ZWQgYW1iaXNvbmljcyAqLworICAgICAgICAubGF5b3V0ID0gQVZfQ0hfTEFZT1VUX09DVEFHT05BTCB8IEFWX0NIX1RPUF9DRU5URVIsCisgICAgICAgIC5udW1fZWxlID0geyAyLCAyLCAyLCAwIH0sCisgICAgICAgIC5wYWlyaW5nID0geyB7IDEsIDAgfSwgeyAxLCAwIH0sIHsgMSwgMCB9LCB9LAorICAgICAgICAuaW5kZXggPSB7IHsgMCwgMCB9LCB7IDEsIDEgfSwgeyAyLCAyIH0gfSwKKyAgICAgICAgLmNvbmZpZ19tYXAgPSB7IDYsIFRZUEVfQ1BFLCBUWVBFX1NDRSwgVFlQRV9DUEUsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9TQ0UgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH0sCisgICAgfSwKKyAgICB7ICAgLyogTWVhbnQgZm9yIG9yZGVyIDIvbWl4ZWQgYW1iaXNvbmljcyAqLworICAgICAgICAubGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzZQT0lOVDBfRlJPTlQgfCBBVl9DSF9CQUNLX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgICBBVl9DSF9CQUNLX0xFRlQgfCBBVl9DSF9CQUNLX1JJR0hUIHwgQVZfQ0hfVE9QX0NFTlRFUiwKKyAgICAgICAgLm51bV9lbGUgPSB7IDIsIDIsIDIsIDAgfSwKKyAgICAgICAgLnBhaXJpbmcgPSB7IHsgMSwgMSB9LCB7IDEsIDAgfSwgeyAxLCAwIH0sIH0sCisgICAgICAgIC5pbmRleCA9IHsgeyAwLCAxIH0sIHsgMiwgMCB9LCB7IDMsIDEgfSB9LAorICAgICAgICAuY29uZmlnX21hcCA9IHsgNiwgVFlQRV9DUEUsIFRZUEVfQ1BFLCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfQ1BFLCBUWVBFX1NDRSB9LAorICAgICAgICAucmVvcmRlcl9tYXAgPSB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmxheW91dCA9IEFWX0NIX0xBWU9VVF9IRVhBREVDQUdPTkFMLAorICAgICAgICAubnVtX2VsZSA9IHsgNCwgMiwgNCwgMCB9LAorICAgICAgICAucGFpcmluZyA9IHsgeyAxLCAwLCAxLCAwIH0sIHsgMSwgMSB9LCB7IDEsIDAsIDEsIDAgfSwgfSwKKyAgICAgICAgLmluZGV4ID0geyB7IDAsIDAsIDEsIDEgfSwgeyAyLCAzIH0sIHsgNCwgMiwgNSwgMyB9IH0sCisgICAgICAgIC5jb25maWdfbWFwID0geyAxMCwgVFlQRV9DUEUsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9TQ0UsIFRZUEVfQ1BFLCBUWVBFX0NQRSwgVFlQRV9DUEUsIFRZUEVfU0NFLCBUWVBFX0NQRSwgVFlQRV9TQ0UgfSwKKyAgICAgICAgLnJlb3JkZXJfbWFwID0geyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH0sCisgICAgfSwKK307CisKIC8qKgogICogQUFDIGVuY29kZXIgY29udGV4dAogICovCkBAIC0xMDAsMjEgKzM4MCwyMiBAQAogICAgIEZGVENvbnRleHQgbWRjdDEwMjQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbG9uZyAoMTAyNCBzYW1wbGVzKSBmcmFtZSB0cmFuc2Zvcm0gY29udGV4dAogICAgIEZGVENvbnRleHQgbWRjdDEyODsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc2hvcnQgKDEyOCBzYW1wbGVzKSBmcmFtZSB0cmFuc2Zvcm0gY29udGV4dAogICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOwotICAgIEFWTEZHIGxmZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgUFJORyBuZWVkZWQgZm9yIFBOUwotICAgIGZsb2F0ICpwbGFuYXJfc2FtcGxlc1s4XTsgICAgICAgICAgICAgICAgICAgIC8vLzwgc2F2ZWQgcHJlcHJvY2Vzc2VkIGlucHV0CisgICAgQUFDUENFSW5mbyBwY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBQQ0UgZGF0YSwgaWYgbmVlZGVkCisgICAgZmxvYXQgKnBsYW5hcl9zYW1wbGVzWzE2XTsgICAgICAgICAgICAgICAgICAgLy8vPCBzYXZlZCBwcmVwcm9jZXNzZWQgaW5wdXQKIAogICAgIGludCBwcm9maWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29waWVkIGZyb20gYXZjdHgKKyAgICBpbnQgbmVlZHNfcGNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZsYWcgZm9yIG5vbi1zdGFuZGFyZCBsYXlvdXQKICAgICBMUENDb250ZXh0IGxwYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHVzZWQgYnkgVE5TCiAgICAgaW50IHNhbXBsZXJhdGVfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgc2FtcGxlcmF0ZSBpbmRleAogICAgIGludCBjaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2hhbm5lbCBjb3VudAorICAgIGNvbnN0IHVpbnQ4X3QgKnJlb3JkZXJfbWFwOyAgICAgICAgICAgICAgICAgIC8vLzwgbGF2YyB0byBhYWMgcmVvcmRlciBtYXAKICAgICBjb25zdCB1aW50OF90ICpjaGFuX21hcDsgICAgICAgICAgICAgICAgICAgICAvLy88IGNoYW5uZWwgY29uZmlndXJhdGlvbiBtYXAKIAogICAgIENoYW5uZWxFbGVtZW50ICpjcGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2hhbm5lbCBlbGVtZW50cwogICAgIEZGUHN5Q29udGV4dCBwc3k7CiAgICAgc3RydWN0IEZGUHN5UHJlcHJvY2Vzc0NvbnRleHQqIHBzeXBwOwotICAgIEFBQ0NvZWZmaWNpZW50c0VuY29kZXIgKmNvZGVyOworICAgIGNvbnN0IEFBQ0NvZWZmaWNpZW50c0VuY29kZXIgKmNvZGVyOwogICAgIGludCBjdXJfY2hhbm5lbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBjaGFubmVsIGZvciBjb2RlciBjb250ZXh0Ci0gICAgaW50IGxhc3RfZnJhbWU7CiAgICAgaW50IHJhbmRvbV9zdGF0ZTsKICAgICBmbG9hdCBsYW1iZGE7CiAgICAgaW50IGxhc3RfZnJhbWVfcGJfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYml0cyBmb3IgdGhlIHByZXZpb3VzIGZyYW1lCkBAIC0xMjYsMTMgKzQwNywyMCBAQAogICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50LCAgIHFjb2VmcylbOTZdOyAgICAgIC8vLzwgcXVhbnRpemVkIGNvZWZmaWNpZW50cwogICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNjb2VmcylbMTAyNF07ICAgIC8vLzwgc2NhbGVkIGNvZWZmaWNpZW50cwogCisgICAgdWludDE2X3QgcXVhbnRpemVfYmFuZF9jb3N0X2NhY2hlX2dlbmVyYXRpb247CiAgICAgQUFDUXVhbnRpemVCYW5kQ29zdENhY2hlRW50cnkgcXVhbnRpemVfYmFuZF9jb3N0X2NhY2hlWzI1Nl1bMTI4XTsgLy8vPCBtZW1vaXphdGlvbiBhcmVhIGZvciBxdWFudGl6ZV9iYW5kX2Nvc3QKIAorICAgIHZvaWQgKCphYnNfcG93MzQpKGZsb2F0ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgaW50IHNpemUpOworICAgIHZvaWQgKCpxdWFudF9iYW5kcykoaW50ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKnNjYWxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaXNfc2lnbmVkLCBpbnQgbWF4dmFsLCBjb25zdCBmbG9hdCBRMzQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCByb3VuZGluZyk7CisKICAgICBzdHJ1Y3QgewogICAgICAgICBmbG9hdCAqc2FtcGxlczsKICAgICB9IGJ1ZmZlcjsKIH0gQUFDRW5jQ29udGV4dDsKIAordm9pZCBmZl9hYWNfZHNwX2luaXRfeDg2KEFBQ0VuY0NvbnRleHQgKnMpOwogdm9pZCBmZl9hYWNfY29kZXJfaW5pdF9taXBzKEFBQ0VuY0NvbnRleHQgKmMpOwogdm9pZCBmZl9xdWFudGl6ZV9iYW5kX2Nvc3RfY2FjaGVfaW5pdChzdHJ1Y3QgQUFDRW5jQ29udGV4dCAqcyk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjZW5jX2lzLmMgYi9saWJhdmNvZGVjL2FhY2VuY19pcy5jCmluZGV4IDQ3Mzg5N2IuLjJmNWI3ZWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjZW5jX2lzLmMKKysrIGIvbGliYXZjb2RlYy9hYWNlbmNfaXMuYwpAQCAtNTksOSArNTksOSBAQAogICAgICAgICBmbG9hdCBtaW50aHIgPSBGRk1JTihiYW5kMC0+dGhyZXNob2xkLCBiYW5kMS0+dGhyZXNob2xkKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ107IGkrKykKICAgICAgICAgICAgIElTW2ldID0gKExbc3RhcnQrKHcrdzIpKjEyOCtpXSArIHBoYXNlKlJbc3RhcnQrKHcrdzIpKjEyOCtpXSkqc3FydChlbmVyMC9lbmVyMDEpOwotICAgICAgICBhYnNfcG93MzRfdihMMzQsICZMW3N0YXJ0Kyh3K3cyKSoxMjhdLCBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKLSAgICAgICAgYWJzX3BvdzM0X3YoUjM0LCAmUltzdGFydCsodyt3MikqMTI4XSwgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSk7Ci0gICAgICAgIGFic19wb3czNF92KEkzNCwgSVMsICAgICAgICAgICAgICAgICAgIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOworICAgICAgICBzLT5hYnNfcG93MzQoTDM0LCAmTFtzdGFydCsodyt3MikqMTI4XSwgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSk7CisgICAgICAgIHMtPmFic19wb3czNChSMzQsICZSW3N0YXJ0Kyh3K3cyKSoxMjhdLCBzY2UwLT5pY3Muc3diX3NpemVzW2ddKTsKKyAgICAgICAgcy0+YWJzX3BvdzM0KEkzNCwgSVMsICAgICAgICAgICAgICAgICAgIHNjZTAtPmljcy5zd2Jfc2l6ZXNbZ10pOwogICAgICAgICBtYXh2YWwgPSBmaW5kX21heF92YWwoMSwgc2NlMC0+aWNzLnN3Yl9zaXplc1tnXSwgSTM0KTsKICAgICAgICAgaXNfYmFuZF90eXBlID0gZmluZF9taW5fYm9vayhtYXh2YWwsIGlzX3NmX2lkeCk7CiAgICAgICAgIGRpc3QxICs9IHF1YW50aXplX2JhbmRfY29zdChzLCAmTFtzdGFydCArICh3K3cyKSoxMjhdLCBMMzQsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY2VuY19sdHAuYyBiL2xpYmF2Y29kZWMvYWFjZW5jX2x0cC5jCmluZGV4IGI5ZDQzYjQuLjY3NGEyYTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjZW5jX2x0cC5jCisrKyBiL2xpYmF2Y29kZWMvYWFjZW5jX2x0cC5jCkBAIC03NCw4ICs3NCw4IEBACiAKIHN0YXRpYyB2b2lkIGdldF9sYWcoZmxvYXQgKmJ1ZiwgY29uc3QgZmxvYXQgKm5ldywgTG9uZ1Rlcm1QcmVkaWN0aW9uICpsdHApCiB7Ci0gICAgaW50IGksIGosIGxhZywgbWF4X2NvcnIgPSAwOwotICAgIGZsb2F0IG1heF9yYXRpbzsKKyAgICBpbnQgaSwgaiwgbGFnID0gMCwgbWF4X2NvcnIgPSAwOworICAgIGZsb2F0IG1heF9yYXRpbyA9IDAuMGY7CiAgICAgZm9yIChpID0gMDsgaSA8IDIwNDg7IGkrKykgewogICAgICAgICBmbG9hdCBjb3JyLCBzMCA9IDAuMGYsIHMxID0gMC4wZjsKICAgICAgICAgY29uc3QgaW50IHN0YXJ0ID0gRkZNQVgoMCwgaSAtIDEwMjQpOwpAQCAtMTkwLDggKzE5MCw4IEBACiAgICAgICAgICAgICAgICAgRkZQc3lCYW5kICpiYW5kID0gJnMtPnBzeS5jaFtzLT5jdXJfY2hhbm5lbF0ucHN5X2JhbmRzWyh3K3cyKSoxNitnXTsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2NlLT5pY3Muc3diX3NpemVzW2ddOyBpKyspCiAgICAgICAgICAgICAgICAgICAgIFBDRFtpXSA9IHNjZS0+Y29lZmZzW3N0YXJ0Kyh3K3cyKSoxMjgraV0gLSBzY2UtPmxjb2VmZnNbc3RhcnQrKHcrdzIpKjEyOCtpXTsKLSAgICAgICAgICAgICAgICBhYnNfcG93MzRfdihDMzQsICAmc2NlLT5jb2VmZnNbc3RhcnQrKHcrdzIpKjEyOF0sICBzY2UtPmljcy5zd2Jfc2l6ZXNbZ10pOwotICAgICAgICAgICAgICAgIGFic19wb3czNF92KFBDRDM0LCBQQ0QsIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSk7CisgICAgICAgICAgICAgICAgcy0+YWJzX3BvdzM0KEMzNCwgICZzY2UtPmNvZWZmc1tzdGFydCsodyt3MikqMTI4XSwgIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSk7CisgICAgICAgICAgICAgICAgcy0+YWJzX3BvdzM0KFBDRDM0LCBQQ0QsIHNjZS0+aWNzLnN3Yl9zaXplc1tnXSk7CiAgICAgICAgICAgICAgICAgZGlzdDEgKz0gcXVhbnRpemVfYmFuZF9jb3N0KHMsICZzY2UtPmNvZWZmc1tzdGFydCsodyt3MikqMTI4XSwgQzM0LCBzY2UtPmljcy5zd2Jfc2l6ZXNbZ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjZS0+c2ZfaWR4Wyh3K3cyKSoxNitnXSwgc2NlLT5iYW5kX3R5cGVbKHcrdzIpKjE2K2ddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYW1iZGEvYmFuZC0+dGhyZXNob2xkLCBJTkZJTklUWSwgJmJpdHNfdG1wMSwgTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY2VuY19wcmVkLmMgYi9saWJhdmNvZGVjL2FhY2VuY19wcmVkLmMKaW5kZXggZTc3YTNkZS4uZDExMTE5MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNlbmNfcHJlZC5jCisrKyBiL2xpYmF2Y29kZWMvYWFjZW5jX3ByZWQuYwpAQCAtMjcwLDcgKzI3MCw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAvKiBOb3JtYWwgY29lZmZpY2llbnRzICovCi0gICAgICAgIGFic19wb3czNF92KE8zNCwgJnNjZS0+Y29lZmZzW3N0YXJ0X2NvZWZdLCBudW1fY29lZmZzKTsKKyAgICAgICAgcy0+YWJzX3BvdzM0KE8zNCwgJnNjZS0+Y29lZmZzW3N0YXJ0X2NvZWZdLCBudW1fY29lZmZzKTsKICAgICAgICAgZGlzdDEgPSBxdWFudGl6ZV9hbmRfZW5jb2RlX2JhbmRfY29zdChzLCBOVUxMLCAmc2NlLT5jb2VmZnNbc3RhcnRfY29lZl0sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTzM0LCBudW1fY29lZmZzLCBzY2UtPnNmX2lkeFtzZmJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX24sIHMtPmxhbWJkYSAvIGJhbmQtPnRocmVzaG9sZCwgSU5GSU5JVFksICZjb3N0MSwgTlVMTCwgMCk7CkBAIC0yNzksNyArMjc5LDcgQEAKICAgICAgICAgLyogRW5jb2RlZCBjb2VmZmljaWVudHMgLSBuZWVkZWQgZm9yICNiaXRzLCBiYW5kIHR5cGUgYW5kIHF1YW50LiBlcnJvciAqLwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvZWZmczsgaSsrKQogICAgICAgICAgICAgU0VOVFtpXSA9IHNjZS0+Y29lZmZzW3N0YXJ0X2NvZWYgKyBpXSAtIHNjZS0+cHJjb2VmZnNbc3RhcnRfY29lZiArIGldOwotICAgICAgICBhYnNfcG93MzRfdihTMzQsIFNFTlQsIG51bV9jb2VmZnMpOworICAgICAgICBzLT5hYnNfcG93MzQoUzM0LCBTRU5ULCBudW1fY29lZmZzKTsKICAgICAgICAgaWYgKGNiX24gPCBSRVNFUlZFRF9CVCkKICAgICAgICAgICAgIGNiX3AgPSBhdl9jbGlwKGZpbmRfbWluX2Jvb2soZmluZF9tYXhfdmFsKDEsIG51bV9jb2VmZnMsIFMzNCksIHNjZS0+c2ZfaWR4W3NmYl0pLCBjYl9taW4sIGNiX21heCk7CiAgICAgICAgIGVsc2UKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgICAgICAvKiBSZWNvbnN0cnVjdGVkIGNvZWZmaWNpZW50cyAtIG5lZWRlZCBmb3IgZGlzdG9ydGlvbiBtZWFzdXJlbWVudHMgKi8KICAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2VmZnM7IGkrKykKICAgICAgICAgICAgIHNjZS0+cHJjb2VmZnNbc3RhcnRfY29lZiArIGldICs9IFFFUlJbaV0gIT0gMC4wZiA/IChzY2UtPnByY29lZmZzW3N0YXJ0X2NvZWYgKyBpXSAtIFFFUlJbaV0pIDogMC4wZjsKLSAgICAgICAgYWJzX3BvdzM0X3YoUDM0LCAmc2NlLT5wcmNvZWZmc1tzdGFydF9jb2VmXSwgbnVtX2NvZWZmcyk7CisgICAgICAgIHMtPmFic19wb3czNChQMzQsICZzY2UtPnByY29lZmZzW3N0YXJ0X2NvZWZdLCBudW1fY29lZmZzKTsKICAgICAgICAgaWYgKGNiX24gPCBSRVNFUlZFRF9CVCkKICAgICAgICAgICAgIGNiX3AgPSBhdl9jbGlwKGZpbmRfbWluX2Jvb2soZmluZF9tYXhfdmFsKDEsIG51bV9jb2VmZnMsIFAzNCksIHNjZS0+c2ZfaWR4W3NmYl0pLCBjYl9taW4sIGNiX21heCk7CiAgICAgICAgIGVsc2UKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjZW5jX3F1YW50aXphdGlvbi5oIGIvbGliYXZjb2RlYy9hYWNlbmNfcXVhbnRpemF0aW9uLmgKaW5kZXggNDI1MDQwNy4uZmM1YTQ2YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNlbmNfcXVhbnRpemF0aW9uLmgKKysrIGIvbGliYXZjb2RlYy9hYWNlbmNfcXVhbnRpemF0aW9uLmgKQEAgLTc0LDEwICs3NCwxMCBAQAogICAgICAgICByZXR1cm4gY29zdCAqIGxhbWJkYTsKICAgICB9CiAgICAgaWYgKCFzY2FsZWQpIHsKLSAgICAgICAgYWJzX3BvdzM0X3Yocy0+c2NvZWZzLCBpbiwgc2l6ZSk7CisgICAgICAgIHMtPmFic19wb3czNChzLT5zY29lZnMsIGluLCBzaXplKTsKICAgICAgICAgc2NhbGVkID0gcy0+c2NvZWZzOwogICAgIH0KLSAgICBxdWFudGl6ZV9iYW5kcyhzLT5xY29lZnMsIGluLCBzY2FsZWQsIHNpemUsIFEzNCwgIUJUX1VOU0lHTkVELCBhYWNfY2JfbWF4dmFsW2NiXSwgUk9VTkRJTkcpOworICAgIHMtPnF1YW50X2JhbmRzKHMtPnFjb2VmcywgaW4sIHNjYWxlZCwgc2l6ZSwgIUJUX1VOU0lHTkVELCBhYWNfY2JfbWF4dmFsW2NiXSwgUTM0LCBST1VORElORyk7CiAgICAgaWYgKEJUX1VOU0lHTkVEKSB7CiAgICAgICAgIG9mZiA9IDA7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjZW5jX3F1YW50aXphdGlvbl9taXNjLmggYi9saWJhdmNvZGVjL2FhY2VuY19xdWFudGl6YXRpb25fbWlzYy5oCmluZGV4IGVhYTcxYzkuLjI4Njc2Y2EgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjZW5jX3F1YW50aXphdGlvbl9taXNjLmgKKysrIGIvbGliYXZjb2RlYy9hYWNlbmNfcXVhbnRpemF0aW9uX21pc2MuaApAQCAtMzYsMTEgKzM2LDEyIEBACiAgICAgQUFDUXVhbnRpemVCYW5kQ29zdENhY2hlRW50cnkgKmVudHJ5OwogICAgIGF2X2Fzc2VydDEoc2NhbGVfaWR4ID49IDAgJiYgc2NhbGVfaWR4IDwgMjU2KTsKICAgICBlbnRyeSA9ICZzLT5xdWFudGl6ZV9iYW5kX2Nvc3RfY2FjaGVbc2NhbGVfaWR4XVt3KjE2K2ddOwotICAgIGlmIChlbnRyeS0+Yml0cyA8IDAgfHwgZW50cnktPmNiICE9IGNiIHx8IGVudHJ5LT5ydHogIT0gcnR6KSB7CisgICAgaWYgKGVudHJ5LT5nZW5lcmF0aW9uICE9IHMtPnF1YW50aXplX2JhbmRfY29zdF9jYWNoZV9nZW5lcmF0aW9uIHx8IGVudHJ5LT5jYiAhPSBjYiB8fCBlbnRyeS0+cnR6ICE9IHJ0eikgewogICAgICAgICBlbnRyeS0+cmQgPSBxdWFudGl6ZV9iYW5kX2Nvc3QocywgaW4sIHNjYWxlZCwgc2l6ZSwgc2NhbGVfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2IsIGxhbWJkYSwgdXBsaW0sICZlbnRyeS0+Yml0cywgJmVudHJ5LT5lbmVyZ3ksIHJ0eik7CiAgICAgICAgIGVudHJ5LT5jYiA9IGNiOwogICAgICAgICBlbnRyeS0+cnR6ID0gcnR6OworICAgICAgICBlbnRyeS0+Z2VuZXJhdGlvbiA9IHMtPnF1YW50aXplX2JhbmRfY29zdF9jYWNoZV9nZW5lcmF0aW9uOwogICAgIH0KICAgICBpZiAoYml0cykKICAgICAgICAgKmJpdHMgPSBlbnRyeS0+Yml0czsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjZW5jX3V0aWxzLmggYi9saWJhdmNvZGVjL2FhY2VuY191dGlscy5oCmluZGV4IGNiNWJjOGQuLmJlZjRjMTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjZW5jX3V0aWxzLmgKKysrIGIvbGliYXZjb2RlYy9hYWNlbmNfdXRpbHMuaApAQCAtMjgsNiArMjgsNyBAQAogI2lmbmRlZiBBVkNPREVDX0FBQ0VOQ19VVElMU19ICiAjZGVmaW5lIEFWQ09ERUNfQUFDRU5DX1VUSUxTX0gKIAorI2luY2x1ZGUgImxpYmF2dXRpbC9mZm1hdGguaCIKICNpbmNsdWRlICJhYWMuaCIKICNpbmNsdWRlICJhYWNlbmN0YWIuaCIKICNpbmNsdWRlICJhYWN0YWIuaCIKQEAgLTYyLDE3ICs2MywxNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcXVhbnRpemVfYmFuZHMoaW50ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKnNjYWxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgZmxvYXQgUTM0LCBpbnQgaXNfc2lnbmVkLCBpbnQgbWF4dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaXNfc2lnbmVkLCBpbnQgbWF4dmFsLCBjb25zdCBmbG9hdCBRMzQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcm91bmRpbmcpCiB7CiAgICAgaW50IGk7Ci0gICAgZG91YmxlIHFjOwogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcWMgPSBzY2FsZWRbaV0gKiBRMzQ7Ci0gICAgICAgIG91dFtpXSA9IChpbnQpRkZNSU4ocWMgKyByb3VuZGluZywgKGRvdWJsZSltYXh2YWwpOworICAgICAgICBmbG9hdCBxYyA9IHNjYWxlZFtpXSAqIFEzNDsKKyAgICAgICAgaW50IHRtcCA9IChpbnQpRkZNSU4ocWMgKyByb3VuZGluZywgKGZsb2F0KW1heHZhbCk7CiAgICAgICAgIGlmIChpc19zaWduZWQgJiYgaW5baV0gPCAwLjBmKSB7Ci0gICAgICAgICAgICBvdXRbaV0gPSAtb3V0W2ldOworICAgICAgICAgICAgdG1wID0gLXRtcDsKICAgICAgICAgfQorICAgICAgICBvdXRbaV0gPSB0bXA7CiAgICAgfQogfQogCkBAIC05MCw4ICs5MSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGZpbmRfbWluX2Jvb2soZmxvYXQgbWF4dmFsLCBpbnQgc2YpCiB7Ci0gICAgZmxvYXQgUSA9IGZmX2FhY19wb3cyc2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNmICsgU0NBTEVfT05FX1BPUyAtIFNDQUxFX0RJVl81MTJdOwotICAgIGZsb2F0IFEzNCA9IHNxcnRmKFEgKiBzcXJ0ZihRKSk7CisgICAgZmxvYXQgUTM0ID0gZmZfYWFjX3BvdzM0c2ZfdGFiW1BPV19TRjJfWkVSTyAtIHNmICsgU0NBTEVfT05FX1BPUyAtIFNDQUxFX0RJVl81MTJdOwogICAgIGludCBxbWF4dmFsLCBjYjsKICAgICBxbWF4dmFsID0gbWF4dmFsICogUTM0ICsgQ19RVUFOVDsKICAgICBpZiAocW1heHZhbCA+PSAoRkZfQVJSQVlfRUxFTVMoYWFjX21heHZhbF9jYikpKQpAQCAtMTIzLDcgKzEyMywxMCBAQAogICAgICAgICAgICAgaWYgKHMgPj0gZXRocmVzaCkgewogICAgICAgICAgICAgICAgIG56bCArPSAxLjBmOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBuemwgKz0gcG93ZihzIC8gZXRocmVzaCwgbnpzbG9wZSk7CisgICAgICAgICAgICAgICAgaWYgKG56c2xvcGUgPT0gMi5mKQorICAgICAgICAgICAgICAgICAgICBuemwgKz0gKHMgLyBldGhyZXNoKSAqIChzIC8gZXRocmVzaCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBuemwgKz0gZmZfZmFzdF9wb3dmKHMgLyBldGhyZXNoLCBuenNsb3BlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoZTIgPiB0aHJlc2gpIHsKQEAgLTI0OSw2ICsyNTIsMTkgQEAKICAgICAgICAgJiYgc2NlLT5zZl9pZHhbbmV4dGJhbmRbYmFuZF1dIDw9IChuZXdfc2YgKyBTQ0FMRV9NQVhfRElGRik7CiB9CiAKKy8qKgorICogbGluZWFyIGNvbmdydWVudGlhbCBwc2V1ZG9yYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICoKKyAqIEBwYXJhbSAgIHByZXZpb3VzX3ZhbCAgICBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBnZW5lcmF0b3IKKyAqCisgKiBAcmV0dXJuICBSZXR1cm5zIGEgMzItYml0IHBzZXVkb3JhbmRvbSBpbnRlZ2VyCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBsY2dfcmFuZG9tKHVuc2lnbmVkIHByZXZpb3VzX3ZhbCkKK3sKKyAgICB1bmlvbiB7IHVuc2lnbmVkIHU7IGludCBzOyB9IHYgPSB7IHByZXZpb3VzX3ZhbCAqIDE2NjQ1MjV1ICsgMTAxMzkwNDIyMyB9OworICAgIHJldHVybiB2LnM7Cit9CisKICNkZWZpbmUgRVJST1JfSUYoY29uZCwgLi4uKSBcCiAgICAgaWYgKGNvbmQpIHsgXAogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgX19WQV9BUkdTX18pOyBcCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY2VuY3RhYi5oIGIvbGliYXZjb2RlYy9hYWNlbmN0YWIuaAppbmRleCA1ZmM5NDExLi42NDkzMmQ3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhY2VuY3RhYi5oCisrKyBiL2xpYmF2Y29kZWMvYWFjZW5jdGFiLmgKQEAgLTM2LDEzICszNiwyNCBAQAogLyoqIFRvdGFsIG51bWJlciBvZiBjb2RlYm9va3MsIGluY2x1ZGluZyBzcGVjaWFsIG9uZXMgKiovCiAjZGVmaW5lIENCX1RPVF9BTEwgMTUKIAotI2RlZmluZSBBQUNfTUFYX0NIQU5ORUxTIDgKKyNkZWZpbmUgQUFDX01BWF9DSEFOTkVMUyAxNgogCiBleHRlcm4gY29uc3QgdWludDhfdCAqZmZfYWFjX3N3Yl9zaXplXzEwMjRbXTsKIGV4dGVybiBjb25zdCBpbnQgICAgICBmZl9hYWNfc3diX3NpemVfMTAyNF9sZW47CiBleHRlcm4gY29uc3QgdWludDhfdCAqZmZfYWFjX3N3Yl9zaXplXzEyOFtdOwogZXh0ZXJuIGNvbnN0IGludCAgICAgIGZmX2FhY19zd2Jfc2l6ZV8xMjhfbGVuOwogCisvKiBTdXBwb3J0ZWQgbGF5b3V0cyB3aXRob3V0IHVzaW5nIGEgUENFICovCitzdGF0aWMgY29uc3QgaW50NjRfdCBhYWNfbm9ybWFsX2NoYW5fbGF5b3V0c1s3XSA9IHsKKyAgICBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgIEFWX0NIX0xBWU9VVF9TVVJST1VORCwKKyAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0ssCisgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDEsCit9OworCiAvKiogZGVmYXVsdCBjaGFubmVsIGNvbmZpZ3VyYXRpb25zICovCiBzdGF0aWMgY29uc3QgdWludDhfdCBhYWNfY2hhbl9jb25maWdzW0FBQ19NQVhfQ0hBTk5FTFNdWzZdID0gewogICAgIHsxLCBUWVBFX1NDRX0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxIGNoYW5uZWwgIC0gc2luZ2xlIGNoYW5uZWwgZWxlbWVudApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWNwcy5jIGIvbGliYXZjb2RlYy9hYWNwcy5jCmluZGV4IGNjYzc5ZmYuLmIxNmMzMzkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjcHMuYworKysgYi9saWJhdmNvZGVjL2FhY3BzLmMKQEAgLTE5Niw4ICsxOTYsMTMgQEAKIAogICAgIHBzLT5ib3JkZXJfcG9zaXRpb25bMF0gPSAtMTsKICAgICBpZiAocHMtPmZyYW1lX2NsYXNzKSB7Ci0gICAgICAgIGZvciAoZSA9IDE7IGUgPD0gcHMtPm51bV9lbnY7IGUrKykKKyAgICAgICAgZm9yIChlID0gMTsgZSA8PSBwcy0+bnVtX2VudjsgZSsrKSB7CiAgICAgICAgICAgICBwcy0+Ym9yZGVyX3Bvc2l0aW9uW2VdID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgICAgICAgICAgaWYgKHBzLT5ib3JkZXJfcG9zaXRpb25bZV0gPCBwcy0+Ym9yZGVyX3Bvc2l0aW9uW2UtMV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJvcmRlcl9wb3NpdGlvbiBub24gbW9ub3RvbmUuXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0gZWxzZQogICAgICAgICBmb3IgKGUgPSAxOyBlIDw9IHBzLT5udW1fZW52OyBlKyspCiAgICAgICAgICAgICBwcy0+Ym9yZGVyX3Bvc2l0aW9uW2VdID0gKGUgKiBudW1RTUZTbG90cyA+PiBmZl9sb2cyX3RhYltwcy0+bnVtX2Vudl0pIC0gMTsKQEAgLTQ5OSwxMyArNTA0LDEzIEBACiBzdGF0aWMgdm9pZCBtYXBfdmFsXzM0X3RvXzIwKElOVEZMT0FUIHBhcltQU19NQVhfTlJfSUlESUNDXSkKIHsKICNpZiBVU0VfRklYRUQKLSAgICBwYXJbIDBdID0gKGludCkoKChpbnQ2NF90KShwYXJbIDBdICsgKHBhclsgMV0+PjEpKSAqIDE0MzE2NTU3NjUgKyBcCisgICAgcGFyWyAwXSA9IChpbnQpKCgoaW50NjRfdCkocGFyWyAwXSArICh1bnNpZ25lZCkocGFyWyAxXT4+MSkpICogMTQzMTY1NTc2NSArIFwKICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwKSA+PiAzMSk7Ci0gICAgcGFyWyAxXSA9IChpbnQpKCgoaW50NjRfdCkoKHBhclsgMV0+PjEpICsgcGFyWyAyXSkgKiAxNDMxNjU1NzY1ICsgXAorICAgIHBhclsgMV0gPSAoaW50KSgoKGludDY0X3QpKChwYXJbIDFdPj4xKSArICh1bnNpZ25lZClwYXJbIDJdKSAqIDE0MzE2NTU3NjUgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMCkgPj4gMzEpOwotICAgIHBhclsgMl0gPSAoaW50KSgoKGludDY0X3QpKHBhclsgM10gKyAocGFyWyA0XT4+MSkpICogMTQzMTY1NTc2NSArIFwKKyAgICBwYXJbIDJdID0gKGludCkoKChpbnQ2NF90KShwYXJbIDNdICsgKHVuc2lnbmVkKShwYXJbIDRdPj4xKSkgKiAxNDMxNjU1NzY1ICsgXAogICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDApID4+IDMxKTsKLSAgICBwYXJbIDNdID0gKGludCkoKChpbnQ2NF90KSgocGFyWyA0XT4+MSkgKyBwYXJbIDVdKSAqIDE0MzE2NTU3NjUgKyBcCisgICAgcGFyWyAzXSA9IChpbnQpKCgoaW50NjRfdCkoKHBhclsgNF0+PjEpICsgKHVuc2lnbmVkKXBhclsgNV0pICogMTQzMTY1NTc2NSArIFwKICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwKSA+PiAzMSk7CiAjZWxzZQogICAgIHBhclsgMF0gPSAoMipwYXJbIDBdICsgICBwYXJbIDFdKSAqIDAuMzMzMzMzMzNmOwpAQCAtNjkyLDI2ICs2OTcsMTcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgTlJfUEFSX0JBTkRTW2lzMzRdOyBpKyspIHsKICAgICAgICAgZm9yIChuID0gbjA7IG4gPCBuTDsgbisrKSB7CiAgICAgICAgICAgICBpbnQgZGVjYXllZF9wZWFrOwotICAgICAgICAgICAgaW50IGRlbm9tOwotCiAgICAgICAgICAgICBkZWNheWVkX3BlYWsgPSAoaW50KSgoKGludDY0X3QpcGVha19kZWNheV9mYWN0b3IgKiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVha19kZWNheV9ucmdbaV0gKyAweDQwMDAwMDAwKSA+PiAzMSk7CiAgICAgICAgICAgICBwZWFrX2RlY2F5X25yZ1tpXSA9IEZGTUFYKGRlY2F5ZWRfcGVhaywgcG93ZXJbaV1bbl0pOwotICAgICAgICAgICAgcG93ZXJfc21vb3RoW2ldICs9IChwb3dlcltpXVtuXSAtIHBvd2VyX3Ntb290aFtpXSArIDIpID4+IDI7Ci0gICAgICAgICAgICBwZWFrX2RlY2F5X2RpZmZfc21vb3RoW2ldICs9IChwZWFrX2RlY2F5X25yZ1tpXSAtIHBvd2VyW2ldW25dIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVha19kZWNheV9kaWZmX3Ntb290aFtpXSArIDIpID4+IDI7Ci0gICAgICAgICAgICBkZW5vbSA9IHBlYWtfZGVjYXlfZGlmZl9zbW9vdGhbaV0gKyAocGVha19kZWNheV9kaWZmX3Ntb290aFtpXSA+PiAxKTsKLSAgICAgICAgICAgIGlmIChkZW5vbSA+IHBvd2VyX3Ntb290aFtpXSkgewotICAgICAgICAgICAgICBpbnQgcCA9IHBvd2VyX3Ntb290aFtpXTsKLSAgICAgICAgICAgICAgd2hpbGUgKGRlbm9tIDwgMHg0MDAwMDAwMCkgewotICAgICAgICAgICAgICAgIGRlbm9tIDw8PSAxOwotICAgICAgICAgICAgICAgIHAgPDw9IDE7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgdHJhbnNpZW50X2dhaW5baV1bbl0gPSBwIC8gKGRlbm9tID4+IDE2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB0cmFuc2llbnRfZ2FpbltpXVtuXSA9IDEgPDwgMTY7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBwb3dlcl9zbW9vdGhbaV0gKz0gKHBvd2VyW2ldW25dICsgMkxMIC0gcG93ZXJfc21vb3RoW2ldKSA+PiAyOworICAgICAgICAgICAgcGVha19kZWNheV9kaWZmX3Ntb290aFtpXSArPSAocGVha19kZWNheV9ucmdbaV0gKyAyTEwgLSBwb3dlcltpXVtuXSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlYWtfZGVjYXlfZGlmZl9zbW9vdGhbaV0pID4+IDI7CisKKyAgICAgICAgICAgIGlmIChwZWFrX2RlY2F5X2RpZmZfc21vb3RoW2ldKSB7CisgICAgICAgICAgICAgICAgdHJhbnNpZW50X2dhaW5baV1bbl0gPSBGRk1JTihwb3dlcl9zbW9vdGhbaV0qNDM2OTFMTCAvIHBlYWtfZGVjYXlfZGlmZl9zbW9vdGhbaV0sIDE8PDE2KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHRyYW5zaWVudF9nYWluW2ldW25dID0gMSA8PCAxNjsKICAgICAgICAgfQogICAgIH0KICNlbHNlCkBAIC05NDIsNyArOTM4LDcgQEAKICAgICAgICAgICAgIGludCBzdG9wICA9IHBzLT5ib3JkZXJfcG9zaXRpb25bZSsxXTsKICAgICAgICAgICAgIElOVEZMT0FUIHdpZHRoID0gUTMwKDEuZikgLyAoKHN0b3AgLSBzdGFydCkgPyAoc3RvcCAtIHN0YXJ0KSA6IDEpOwogI2lmIFVTRV9GSVhFRAotICAgICAgICAgICAgd2lkdGggPDw9IDE7CisgICAgICAgICAgICB3aWR0aCA9IEZGTUlOKDJVKndpZHRoLCBJTlRfTUFYKTsKICNlbmRpZgogICAgICAgICAgICAgYiA9IGtfdG9faVtrXTsKICAgICAgICAgICAgIGhbMF1bMF0gPSBIMTFbMF1bZV1bYl07CkBAIC05NzQsOSArOTcwLDEwIEBACiAgICAgICAgICAgICAgICAgaF9zdGVwWzFdWzJdID0gQUFDX01TVUIzMV9WMyhIMjFbMV1bZSsxXVtiXSwgaFsxXVsyXSwgd2lkdGgpOwogICAgICAgICAgICAgICAgIGhfc3RlcFsxXVszXSA9IEFBQ19NU1VCMzFfVjMoSDIyWzFdW2UrMV1bYl0sIGhbMV1bM10sIHdpZHRoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBzLT5kc3Auc3RlcmVvX2ludGVycG9sYXRlWyFQU19CQVNFTElORSAmJiBwcy0+ZW5hYmxlX2lwZG9wZF0oCi0gICAgICAgICAgICAgICAgbFtrXSArIHN0YXJ0ICsgMSwgcltrXSArIHN0YXJ0ICsgMSwKLSAgICAgICAgICAgICAgICBoLCBoX3N0ZXAsIHN0b3AgLSBzdGFydCk7CisgICAgICAgICAgICBpZiAoc3RvcCAtIHN0YXJ0KQorICAgICAgICAgICAgICAgIHBzLT5kc3Auc3RlcmVvX2ludGVycG9sYXRlWyFQU19CQVNFTElORSAmJiBwcy0+ZW5hYmxlX2lwZG9wZF0oCisgICAgICAgICAgICAgICAgICAgIGxba10gKyAxICsgc3RhcnQsIHJba10gKyAxICsgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGgsIGhfc3RlcCwgc3RvcCAtIHN0YXJ0KTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjcHNkc3AuaCBiL2xpYmF2Y29kZWMvYWFjcHNkc3AuaAppbmRleCBhZDliYmI4Li45MTdhYzUzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhY3BzZHNwLmgKKysrIGIvbGliYXZjb2RlYy9hYWNwc2RzcC5oCkBAIC0yMSw2ICsyMSw4IEBACiAjaWZuZGVmIEFWQ09ERUNfQUFDUFNEU1BfSAogI2RlZmluZSBBVkNPREVDX0FBQ1BTRFNQX0gKIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCiAjaW5jbHVkZSAiYWFjX2RlZmluZXMuaCIKIAogI2RlZmluZSBQU19RTUZfVElNRV9TTE9UUyAzMgpAQCAtMzMsNyArMzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKTsKICAgICB2b2lkICgqaHlicmlkX2FuYWx5c2lzKShJTlRGTE9BVCAoKm91dClbMl0sIElOVEZMT0FUICgqaW4pWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVEZMT0FUICgqZmlsdGVyKVs4XVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IG4pOwogICAgIHZvaWQgKCpoeWJyaWRfYW5hbHlzaXNfaWxlYXZlKShJTlRGTE9BVCAoKm91dClbMzJdWzJdLCBJTlRGTE9BVCBMWzJdWzM4XVs2NF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbGVuKTsKICAgICB2b2lkICgqaHlicmlkX3N5bnRoZXNpc19kZWludCkoSU5URkxPQVQgb3V0WzJdWzM4XVs2NF0sIElOVEZMT0FUICgqaW4pWzMyXVsyXSwKQEAgLTUxLDYgKzUzLDcgQEAKIAogdm9pZCBBQUNfUkVOQU1FKGZmX3BzZHNwX2luaXQpKFBTRFNQQ29udGV4dCAqcyk7CiB2b2lkIGZmX3BzZHNwX2luaXRfYXJtKFBTRFNQQ29udGV4dCAqcyk7Cit2b2lkIGZmX3BzZHNwX2luaXRfYWFyY2g2NChQU0RTUENvbnRleHQgKnMpOwogdm9pZCBmZl9wc2RzcF9pbml0X21pcHMoUFNEU1BDb250ZXh0ICpzKTsKIHZvaWQgZmZfcHNkc3BfaW5pdF94ODYoUFNEU1BDb250ZXh0ICpzKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWNwc2RzcF90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9hYWNwc2RzcF90ZW1wbGF0ZS5jCmluZGV4IDMwNDljZTguLjVmNGJlMDEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjcHNkc3BfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2FhY3BzZHNwX3RlbXBsYXRlLmMKQEAgLTMwLDcgKzMwLDcgQEAKIHsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQotICAgICAgICBkc3RbaV0gKz0gQUFDX01BREQyOChzcmNbaV1bMF0sIHNyY1tpXVswXSwgc3JjW2ldWzFdLCBzcmNbaV1bMV0pOworICAgICAgICBkc3RbaV0gKz0gKFVJTlRGTE9BVClBQUNfTUFERDI4KHNyY1tpXVswXSwgc3JjW2ldWzBdLCBzcmNbaV1bMV0sIHNyY1tpXVsxXSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBzX211bF9wYWlyX3NpbmdsZV9jKElOVEZMT0FUICgqZHN0KVsyXSwgSU5URkxPQVQgKCpzcmMwKVsyXSwgSU5URkxPQVQgKnNyYzEsCkBAIC00NSw3ICs0NSw3IEBACiAKIHN0YXRpYyB2b2lkIHBzX2h5YnJpZF9hbmFseXNpc19jKElOVEZMT0FUICgqb3V0KVsyXSwgSU5URkxPQVQgKCppbilbMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlRGTE9BVCAoKmZpbHRlcilbOF1bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBuKQogewogICAgIGludCBpLCBqOwogCkBAIC03Miw2ICs3Miw3IEBACiAjZW5kaWYgLyogVVNFX0ZJWEVEICovCiAgICAgfQogfQorCiBzdGF0aWMgdm9pZCBwc19oeWJyaWRfYW5hbHlzaXNfaWxlYXZlX2MoSU5URkxPQVQgKCpvdXQpWzMyXVsyXSwgSU5URkxPQVQgTFsyXVszOF1bNjRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxlbikKIHsKQEAgLTEyOSwxMiArMTMwLDEyIEBACiAgICAgICAgICAgICBJTlRGTE9BVCBhcGRfaW0gPSBpbl9pbTsKICAgICAgICAgICAgIGluX3JlID0gQUFDX01TVUIzMChsaW5rX2RlbGF5X3JlLCBmcmFjdGlvbmFsX2RlbGF5X3JlLAogICAgICAgICAgICAgICAgICAgICBsaW5rX2RlbGF5X2ltLCBmcmFjdGlvbmFsX2RlbGF5X2ltKTsKLSAgICAgICAgICAgIGluX3JlIC09IGFfcmU7CisgICAgICAgICAgICBpbl9yZSAtPSAoVUlOVEZMT0FUKWFfcmU7CiAgICAgICAgICAgICBpbl9pbSA9IEFBQ19NQUREMzAobGlua19kZWxheV9yZSwgZnJhY3Rpb25hbF9kZWxheV9pbSwKICAgICAgICAgICAgICAgICAgICAgbGlua19kZWxheV9pbSwgZnJhY3Rpb25hbF9kZWxheV9yZSk7Ci0gICAgICAgICAgICBpbl9pbSAtPSBhX2ltOwotICAgICAgICAgICAgYXBfZGVsYXlbbV1bbis1XVswXSA9IGFwZF9yZSArIEFBQ19NVUwzMShhZ1ttXSwgaW5fcmUpOwotICAgICAgICAgICAgYXBfZGVsYXlbbV1bbis1XVsxXSA9IGFwZF9pbSArIEFBQ19NVUwzMShhZ1ttXSwgaW5faW0pOworICAgICAgICAgICAgaW5faW0gLT0gKFVJTlRGTE9BVClhX2ltOworICAgICAgICAgICAgYXBfZGVsYXlbbV1bbis1XVswXSA9IGFwZF9yZSArIChVSU5URkxPQVQpQUFDX01VTDMxKGFnW21dLCBpbl9yZSk7CisgICAgICAgICAgICBhcF9kZWxheVttXVtuKzVdWzFdID0gYXBkX2ltICsgKFVJTlRGTE9BVClBQUNfTVVMMzEoYWdbbV0sIGluX2ltKTsKICAgICAgICAgfQogICAgICAgICBvdXRbbl1bMF0gPSBBQUNfTVVMMTYodHJhbnNpZW50X2dhaW5bbl0sIGluX3JlKTsKICAgICAgICAgb3V0W25dWzFdID0gQUFDX01VTDE2KHRyYW5zaWVudF9nYWluW25dLCBpbl9pbSk7CkBAIC0xNDksMTAgKzE1MCwxMCBAQAogICAgIElOVEZMT0FUIGgxID0gaFswXVsxXTsKICAgICBJTlRGTE9BVCBoMiA9IGhbMF1bMl07CiAgICAgSU5URkxPQVQgaDMgPSBoWzBdWzNdOwotICAgIElOVEZMT0FUIGhzMCA9IGhfc3RlcFswXVswXTsKLSAgICBJTlRGTE9BVCBoczEgPSBoX3N0ZXBbMF1bMV07Ci0gICAgSU5URkxPQVQgaHMyID0gaF9zdGVwWzBdWzJdOwotICAgIElOVEZMT0FUIGhzMyA9IGhfc3RlcFswXVszXTsKKyAgICBVSU5URkxPQVQgaHMwID0gaF9zdGVwWzBdWzBdOworICAgIFVJTlRGTE9BVCBoczEgPSBoX3N0ZXBbMF1bMV07CisgICAgVUlOVEZMT0FUIGhzMiA9IGhfc3RlcFswXVsyXTsKKyAgICBVSU5URkxPQVQgaHMzID0gaF9zdGVwWzBdWzNdOwogICAgIGludCBuOwogCiAgICAgZm9yIChuID0gMDsgbiA8IGxlbjsgbisrKSB7CkBAIC0xNjUsMTAgKzE2NiwxMCBAQAogICAgICAgICBoMSArPSBoczE7CiAgICAgICAgIGgyICs9IGhzMjsKICAgICAgICAgaDMgKz0gaHMzOwotICAgICAgICBsW25dWzBdID0gQUFDX01BREQzMChoMCwgIGxfcmUsICBoMiwgcl9yZSk7Ci0gICAgICAgIGxbbl1bMV0gPSBBQUNfTUFERDMwKGgwLCAgbF9pbSwgIGgyLCAgcl9pbSk7Ci0gICAgICAgIHJbbl1bMF0gPSBBQUNfTUFERDMwKGgxLCAgbF9yZSwgIGgzLCAgcl9yZSk7Ci0gICAgICAgIHJbbl1bMV0gPSBBQUNfTUFERDMwKGgxLCAgbF9pbSwgIGgzLCAgcl9pbSk7CisgICAgICAgIGxbbl1bMF0gPSBBQUNfTUFERDMwKGgwLCBsX3JlLCBoMiwgcl9yZSk7CisgICAgICAgIGxbbl1bMV0gPSBBQUNfTUFERDMwKGgwLCBsX2ltLCBoMiwgcl9pbSk7CisgICAgICAgIHJbbl1bMF0gPSBBQUNfTUFERDMwKGgxLCBsX3JlLCBoMywgcl9yZSk7CisgICAgICAgIHJbbl1bMV0gPSBBQUNfTUFERDMwKGgxLCBsX2ltLCBoMywgcl9pbSk7CiAgICAgfQogfQogCkBAIC0xODAsMTAgKzE4MSwxMCBAQAogICAgIElOVEZMT0FUIGgwMSAgPSBoWzBdWzFdLCAgICAgIGgxMSAgPSBoWzFdWzFdOwogICAgIElOVEZMT0FUIGgwMiAgPSBoWzBdWzJdLCAgICAgIGgxMiAgPSBoWzFdWzJdOwogICAgIElOVEZMT0FUIGgwMyAgPSBoWzBdWzNdLCAgICAgIGgxMyAgPSBoWzFdWzNdOwotICAgIElOVEZMT0FUIGhzMDAgPSBoX3N0ZXBbMF1bMF0sIGhzMTAgPSBoX3N0ZXBbMV1bMF07Ci0gICAgSU5URkxPQVQgaHMwMSA9IGhfc3RlcFswXVsxXSwgaHMxMSA9IGhfc3RlcFsxXVsxXTsKLSAgICBJTlRGTE9BVCBoczAyID0gaF9zdGVwWzBdWzJdLCBoczEyID0gaF9zdGVwWzFdWzJdOwotICAgIElOVEZMT0FUIGhzMDMgPSBoX3N0ZXBbMF1bM10sIGhzMTMgPSBoX3N0ZXBbMV1bM107CisgICAgVUlOVEZMT0FUIGhzMDAgPSBoX3N0ZXBbMF1bMF0sIGhzMTAgPSBoX3N0ZXBbMV1bMF07CisgICAgVUlOVEZMT0FUIGhzMDEgPSBoX3N0ZXBbMF1bMV0sIGhzMTEgPSBoX3N0ZXBbMV1bMV07CisgICAgVUlOVEZMT0FUIGhzMDIgPSBoX3N0ZXBbMF1bMl0sIGhzMTIgPSBoX3N0ZXBbMV1bMl07CisgICAgVUlOVEZMT0FUIGhzMDMgPSBoX3N0ZXBbMF1bM10sIGhzMTMgPSBoX3N0ZXBbMV1bM107CiAgICAgaW50IG47CiAKICAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyBuKyspIHsKQEAgLTIyMiw2ICsyMjMsOCBAQAogI2lmICFVU0VfRklYRUQKICAgICBpZiAoQVJDSF9BUk0pCiAgICAgICAgIGZmX3BzZHNwX2luaXRfYXJtKHMpOworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIGZmX3BzZHNwX2luaXRfYWFyY2g2NChzKTsKICAgICBpZiAoQVJDSF9NSVBTKQogICAgICAgICBmZl9wc2RzcF9pbml0X21pcHMocyk7CiAgICAgaWYgKEFSQ0hfWDg2KQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWNwc3kuYyBiL2xpYmF2Y29kZWMvYWFjcHN5LmMKaW5kZXggODY0M2ZlNy4uZmNhNjkyYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNwc3kuYworKysgYi9saWJhdmNvZGVjL2FhY3BzeS5jCkBAIC0yNSw4ICsyNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmZtYXRoLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiYWFjdGFiLmgiCkBAIC0zMDQsNyArMzAzLDcgQEAKICAgICBmbG9hdCBiYXJrOwogICAgIGludCBpLCBqLCBnLCBzdGFydDsKICAgICBmbG9hdCBwcmV2LCBtaW5zY2FsZSwgbWluYXRoLCBtaW5zbnIsIHBlX21pbjsKLSAgICBpbnQgY2hhbl9iaXRyYXRlID0gY3R4LT5hdmN0eC0+Yml0X3JhdGUgLyAoKGN0eC0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpID8gMi4wZiA6IGN0eC0+YXZjdHgtPmNoYW5uZWxzKTsKKyAgICBpbnQgY2hhbl9iaXRyYXRlID0gY3R4LT5hdmN0eC0+Yml0X3JhdGUgLyAoKGN0eC0+YXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19RU0NBTEUpID8gMi4wZiA6IGN0eC0+YXZjdHgtPmNoYW5uZWxzKTsKIAogICAgIGNvbnN0IGludCBiYW5kd2lkdGggICAgPSBjdHgtPmN1dG9mZiA/IGN0eC0+Y3V0b2ZmIDogQUFDX0NVVE9GRihjdHgtPmF2Y3R4KTsKICAgICBjb25zdCBmbG9hdCBudW1fYmFyayAgID0gY2FsY19iYXJrKChmbG9hdCliYW5kd2lkdGgpOwpAQCAtMzEyLDEwICszMTEsMTAgQEAKICAgICBjdHgtPm1vZGVsX3ByaXZfZGF0YSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFhY1BzeUNvbnRleHQpKTsKICAgICBpZiAoIWN0eC0+bW9kZWxfcHJpdl9kYXRhKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHBjdHggPSAoQWFjUHN5Q29udGV4dCopIGN0eC0+bW9kZWxfcHJpdl9kYXRhOworICAgIHBjdHggPSBjdHgtPm1vZGVsX3ByaXZfZGF0YTsKICAgICBwY3R4LT5nbG9iYWxfcXVhbGl0eSA9IChjdHgtPmF2Y3R4LT5nbG9iYWxfcXVhbGl0eSA/IGN0eC0+YXZjdHgtPmdsb2JhbF9xdWFsaXR5IDogMTIwKSAqIDAuMDFmOwogCi0gICAgaWYgKGN0eC0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpIHsKKyAgICBpZiAoY3R4LT5hdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FTQ0FMRSkgewogICAgICAgICAvKiBVc2UgdGhlIHRhcmdldCBhdmVyYWdlIGJpdHJhdGUgdG8gY29tcHV0ZSBzcHJlYWQgcGFyYW1ldGVycyAqLwogICAgICAgICBjaGFuX2JpdHJhdGUgPSAoaW50KShjaGFuX2JpdHJhdGUgLyAxMjAuMCAqIChjdHgtPmF2Y3R4LT5nbG9iYWxfcXVhbGl0eSA/IGN0eC0+YXZjdHgtPmdsb2JhbF9xdWFsaXR5IDogMTIwKSk7CiAgICAgfQpAQCAtNjg2LDcgKzY4NSw3IEBACiAKICAgICAgICAgICAgIGJhbmQtPnRocl9xdWlldCA9IGJhbmQtPnRociA9IEZGTUFYKGJhbmQtPnRociwgY29lZmZzW2ddLmF0aCk7CiAgICAgICAgICAgICAvLzUuNC4yLjUgIlByZS1lY2hvIGNvbnRyb2wiCi0gICAgICAgICAgICBpZiAoISh3aS0+d2luZG93X3R5cGVbMF0gPT0gTE9OR19TVE9QX1NFUVVFTkNFIHx8ICh3aS0+d2luZG93X3R5cGVbMV0gPT0gTE9OR19TVEFSVF9TRVFVRU5DRSAmJiAhdykpKQorICAgICAgICAgICAgaWYgKCEod2ktPndpbmRvd190eXBlWzBdID09IExPTkdfU1RPUF9TRVFVRU5DRSB8fCAoIXcgJiYgd2ktPndpbmRvd190eXBlWzFdID09IExPTkdfU1RBUlRfU0VRVUVOQ0UpKSkKICAgICAgICAgICAgICAgICBiYW5kLT50aHIgPSBGRk1BWChQU1lfM0dQUF9SUEVNSU4qYmFuZC0+dGhyLCBGRk1JTihiYW5kLT50aHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNZXzNHUFBfUlBFTEVWKnBjaC0+cHJldl9iYW5kW3crZ10udGhyX3F1aWV0KSk7CiAKQEAgLTcwNSw3ICs3MDQsNyBAQAogCiAgICAgLyogNS42LjEuMy4yICJDYWxjdWxhdGlvbiBvZiB0aGUgZGVzaXJlZCBwZXJjZXB0dWFsIGVudHJvcHkiICovCiAgICAgY3R4LT5jaFtjaGFubmVsXS5lbnRyb3B5ID0gcGU7Ci0gICAgaWYgKGN0eC0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19RU0NBTEUpIHsKKyAgICBpZiAoY3R4LT5hdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FTQ0FMRSkgewogICAgICAgICAvKiAoMi41ICogMTIwKSBhY2hpZXZlcyBhbG1vc3QgdHJhbnNwYXJlbnQgcmF0ZSwgYW5kIHdlIHdhbnQgdG8gZ2l2ZQogICAgICAgICAgKiBhbXBsZSByb29tIGRvd253YXJkcywgc28gd2UgbWFrZSB0aGF0IGVxdWl2YWxlbnQgdG8gUVNDQUxFPTIuNAogICAgICAgICAgKi8KQEAgLTg4NiwxMyArODg1LDEyIEBACiAgICAgaW50IGdyb3VwaW5nICAgICA9IDA7CiAgICAgaW50IHVzZWxvbmdibG9jayA9IDE7CiAgICAgaW50IGF0dGFja3NbQUFDX05VTV9CTE9DS1NfU0hPUlQgKyAxXSA9IHsgMCB9OwotICAgIGZsb2F0IGNsaXBwaW5nc1tBQUNfTlVNX0JMT0NLU19TSE9SVF07CiAgICAgaW50IGk7CiAgICAgRkZQc3lXaW5kb3dJbmZvIHdpID0geyB7IDAgfSB9OwogCiAgICAgaWYgKGxhKSB7CiAgICAgICAgIGZsb2F0IGhwZnNtcGxbQUFDX0JMT0NLX1NJWkVfTE9OR107Ci0gICAgICAgIGZsb2F0IGNvbnN0ICpwZiA9IGhwZnNtcGw7CisgICAgICAgIGNvbnN0IGZsb2F0ICpwZiA9IGhwZnNtcGw7CiAgICAgICAgIGZsb2F0IGF0dGFja19pbnRlbnNpdHlbKEFBQ19OVU1fQkxPQ0tTX1NIT1JUICsgMSkgKiBQU1lfTEFNRV9OVU1fU1VCQkxPQ0tTXTsKICAgICAgICAgZmxvYXQgZW5lcmd5X3N1YnNob3J0WyhBQUNfTlVNX0JMT0NLU19TSE9SVCArIDEpICogUFNZX0xBTUVfTlVNX1NVQkJMT0NLU107CiAgICAgICAgIGZsb2F0IGVuZXJneV9zaG9ydFtBQUNfTlVNX0JMT0NLU19TSE9SVCArIDFdID0geyAwIH07CkBAIC05MTEsNyArOTA5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBQUNfTlVNX0JMT0NLU19TSE9SVCAqIFBTWV9MQU1FX05VTV9TVUJCTE9DS1M7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgY29uc3QgKmNvbnN0IHBmZSA9IHBmICsgQUFDX0JMT0NLX1NJWkVfTE9ORyAvIChBQUNfTlVNX0JMT0NLU19TSE9SVCAqIFBTWV9MQU1FX05VTV9TVUJCTE9DS1MpOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvbnN0IHBmZSA9IHBmICsgQUFDX0JMT0NLX1NJWkVfTE9ORyAvIChBQUNfTlVNX0JMT0NLU19TSE9SVCAqIFBTWV9MQU1FX05VTV9TVUJCTE9DS1MpOwogICAgICAgICAgICAgZmxvYXQgcCA9IDEuMGY7CiAgICAgICAgICAgICBmb3IgKDsgcGYgPCBwZmU7IHBmKyspCiAgICAgICAgICAgICAgICAgcCA9IEZGTUFYKHAsIGZhYnNmKCpwZikpOwpAQCAtOTQ0LDkgKzk0Miw5IEBACiAgICAgICAgIC8qIEdCOiB0dW5lZCAoMSkgdG8gYXZvaWQgdG9vIG1hbnkgc2hvcnQgYmxvY2tzIGZvciB0ZXN0IHNhbXBsZSBUUlVNUEVUICovCiAgICAgICAgIC8qIFJIOiB0dW5lZCAoMikgdG8gbGV0IGVub3VnaCBzaG9ydCBibG9ja3MgdGhyb3VnaCBmb3IgdGVzdCBzYW1wbGUgRlNPTCBhbmQgU05BUFMgKi8KICAgICAgICAgZm9yIChpID0gMTsgaSA8IEFBQ19OVU1fQkxPQ0tTX1NIT1JUICsgMTsgaSsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBjb25zdCB1ID0gZW5lcmd5X3Nob3J0W2kgLSAxXTsKLSAgICAgICAgICAgIGZsb2F0IGNvbnN0IHYgPSBlbmVyZ3lfc2hvcnRbaV07Ci0gICAgICAgICAgICBmbG9hdCBjb25zdCBtID0gRkZNQVgodSwgdik7CisgICAgICAgICAgICBjb25zdCBmbG9hdCB1ID0gZW5lcmd5X3Nob3J0W2kgLSAxXTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHYgPSBlbmVyZ3lfc2hvcnRbaV07CisgICAgICAgICAgICBjb25zdCBmbG9hdCBtID0gRkZNQVgodSwgdik7CiAgICAgICAgICAgICBpZiAobSA8IDQwMDAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoMikgKi8KICAgICAgICAgICAgICAgICBpZiAodSA8IDEuN2YgKiB2ICYmIHYgPCAxLjdmICogdSkgeyAgIC8qICgxKSAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxICYmIGF0dGFja3NbMF0gPCBhdHRhY2tzW2ldKQpAQCAtOTc2LDI0ICs5NzQsOCBAQAogCiAgICAgbGFtZV9hcHBseV9ibG9ja190eXBlKHBjaCwgJndpLCB1c2Vsb25nYmxvY2spOwogCi0gICAgLyogQ2FsY3VsYXRlIGlucHV0IHNhbXBsZSBtYXhpbXVtcyBhbmQgZXZhbHVhdGUgY2xpcHBpbmcgcmlzayAqLwotICAgIGlmIChhdWRpbykgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUFDX05VTV9CTE9DS1NfU0hPUlQ7IGkrKykgewotICAgICAgICAgICAgY29uc3QgZmxvYXQgKndidWYgPSBhdWRpbyArIGkgKiBBQUNfQkxPQ0tfU0laRV9TSE9SVDsKLSAgICAgICAgICAgIGZsb2F0IG1heCA9IDA7Ci0gICAgICAgICAgICBpbnQgajsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBBQUNfQkxPQ0tfU0laRV9TSE9SVDsgaisrKQotICAgICAgICAgICAgICAgIG1heCA9IEZGTUFYKG1heCwgZmFic2Yod2J1ZltqXSkpOwotICAgICAgICAgICAgY2xpcHBpbmdzW2ldID0gbWF4OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgICAgIGNsaXBwaW5nc1tpXSA9IDA7Ci0gICAgfQotCiAgICAgd2kud2luZG93X3R5cGVbMV0gPSBwcmV2X3R5cGU7CiAgICAgaWYgKHdpLndpbmRvd190eXBlWzBdICE9IEVJR0hUX1NIT1JUX1NFUVVFTkNFKSB7Ci0gICAgICAgIGZsb2F0IGNsaXBwaW5nID0gMC4wZjsKIAogICAgICAgICB3aS5udW1fd2luZG93cyAgPSAxOwogICAgICAgICB3aS5ncm91cGluZ1swXSAgPSAxOwpAQCAtMTAwMiw5ICs5ODQsNiBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICB3aS53aW5kb3dfc2hhcGUgPSAxOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgICAgICBjbGlwcGluZyA9IEZGTUFYKGNsaXBwaW5nLCBjbGlwcGluZ3NbaV0pOwotICAgICAgICB3aS5jbGlwcGluZ1swXSA9IGNsaXBwaW5nOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBsYXN0Z3JwID0gMDsKIApAQCAtMTAxNSwxNCArOTk0LDYgQEAKICAgICAgICAgICAgICAgICBsYXN0Z3JwID0gaTsKICAgICAgICAgICAgIHdpLmdyb3VwaW5nW2xhc3RncnBdKys7CiAgICAgICAgIH0KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSB3aS5ncm91cGluZ1tpXSkgewotICAgICAgICAgICAgaW50IHc7Ci0gICAgICAgICAgICBmbG9hdCBjbGlwcGluZyA9IDAuMGY7Ci0gICAgICAgICAgICBmb3IgKHcgPSAwOyB3IDwgd2kuZ3JvdXBpbmdbaV0gJiYgIWNsaXBwaW5nOyB3KyspCi0gICAgICAgICAgICAgICAgY2xpcHBpbmcgPSBGRk1BWChjbGlwcGluZywgY2xpcHBpbmdzW2krd10pOwotICAgICAgICAgICAgd2kuY2xpcHBpbmdbaV0gPSBjbGlwcGluZzsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8qIERldGVybWluZSBncm91cGluZywgYmFzZWQgb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBhdHRhY2ssIGFuZCBzYXZlIGZvcgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWNzYnIuYyBiL2xpYmF2Y29kZWMvYWFjc2JyLmMKaW5kZXggMTU5NTZlMy4uMWQyYThkNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWNzYnIuYworKysgYi9saWJhdmNvZGVjL2FhY3Nici5jCkBAIC0yNDEsNiArMjQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgxLjBmICsgc2JyLT5lX2N1cnJbZV1bbV0pICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLjBmICsgc2JyLT5xX21hcHBlZFtlXVttXSkpKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2JyLT5nYWluW2VdW21dICs9IEZMVF9NSU47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKG0gPSBzYnItPmZfdGFibGVsaW1ba10gLSBzYnItPmt4WzFdOyBtIDwgc2JyLT5mX3RhYmxlbGltW2sgKyAxXSAtIHNici0+a3hbMV07IG0rKykgewogICAgICAgICAgICAgICAgIHN1bVswXSArPSBzYnItPmVfb3JpZ21hcHBlZFtlXVttXTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjc2JyLmggYi9saWJhdmNvZGVjL2FhY3Nici5oCmluZGV4IDg4YzRkOGEuLmRkOGI2NmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjc2JyLmgKKysrIGIvbGliYXZjb2RlYy9hYWNzYnIuaApAQCAtODEsNyArODEsNyBAQAogLyoqIEluaXRpYWxpemUgU0JSLiAqLwogdm9pZCBBQUNfUkVOQU1FKGZmX2FhY19zYnJfaW5pdCkodm9pZCk7CiAvKiogSW5pdGlhbGl6ZSBvbmUgU0JSIGNvbnRleHQuICovCi12b2lkIEFBQ19SRU5BTUUoZmZfYWFjX3Nicl9jdHhfaW5pdCkoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIpOwordm9pZCBBQUNfUkVOQU1FKGZmX2FhY19zYnJfY3R4X2luaXQpKEFBQ0NvbnRleHQgKmFjLCBTcGVjdHJhbEJhbmRSZXBsaWNhdGlvbiAqc2JyLCBpbnQgaWRfYWFjKTsKIC8qKiBDbG9zZSBvbmUgU0JSIGNvbnRleHQuICovCiB2b2lkIEFBQ19SRU5BTUUoZmZfYWFjX3Nicl9jdHhfY2xvc2UpKFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIpOwogLyoqIERlY29kZSBvbmUgU0JSIGVsZW1lbnQuICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY3Nicl9maXhlZC5jIGIvbGliYXZjb2RlYy9hYWNzYnJfZml4ZWQuYwppbmRleCBiMjYzMTRhLi41OWNiYmExIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhY3Nicl9maXhlZC5jCisrKyBiL2xpYmF2Y29kZWMvYWFjc2JyX2ZpeGVkLmMKQEAgLTI4OCwxMSArMjg4LDEyIEBACiAgICAgICAgIHNoaWZ0ID0gYTAwLmV4cDsKICAgICAgICAgaWYgKHNoaWZ0ID49IDMpCiAgICAgICAgICAgICBhbHBoYTBba11bMF0gPSAweDdmZmZmZmZmOworICAgICAgICBlbHNlIGlmIChzaGlmdCA8PSAtMzApCisgICAgICAgICAgICBhbHBoYTBba11bMF0gPSAwOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGEwMC5tYW50IDw8PSAxOwotICAgICAgICAgICAgc2hpZnQgPSAyLXNoaWZ0OwotICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCi0gICAgICAgICAgICAgICAgYWxwaGEwW2tdWzBdID0gYTAwLm1hbnQ7CisgICAgICAgICAgICBzaGlmdCA9IDEtc2hpZnQ7CisgICAgICAgICAgICBpZiAoc2hpZnQgPD0gMCkKKyAgICAgICAgICAgICAgICBhbHBoYTBba11bMF0gPSBhMDAubWFudCAqICgxPDwtc2hpZnQpOwogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgcm91bmQgPSAxIDw8IChzaGlmdC0xKTsKICAgICAgICAgICAgICAgICBhbHBoYTBba11bMF0gPSAoYTAwLm1hbnQgKyByb3VuZCkgPj4gc2hpZnQ7CkBAIC0zMDIsMTEgKzMwMywxMiBAQAogICAgICAgICBzaGlmdCA9IGEwMS5leHA7CiAgICAgICAgIGlmIChzaGlmdCA+PSAzKQogICAgICAgICAgICAgYWxwaGEwW2tdWzFdID0gMHg3ZmZmZmZmZjsKKyAgICAgICAgZWxzZSBpZiAoc2hpZnQgPD0gLTMwKQorICAgICAgICAgICAgYWxwaGEwW2tdWzFdID0gMDsKICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBhMDEubWFudCA8PD0gMTsKLSAgICAgICAgICAgIHNoaWZ0ID0gMi1zaGlmdDsKLSAgICAgICAgICAgIGlmIChzaGlmdCA9PSAwKQotICAgICAgICAgICAgICAgIGFscGhhMFtrXVsxXSA9IGEwMS5tYW50OworICAgICAgICAgICAgc2hpZnQgPSAxLXNoaWZ0OworICAgICAgICAgICAgaWYgKHNoaWZ0IDw9IDApCisgICAgICAgICAgICAgICAgYWxwaGEwW2tdWzFdID0gYTAxLm1hbnQgKiAoMTw8LXNoaWZ0KTsKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIHJvdW5kID0gMSA8PCAoc2hpZnQtMSk7CiAgICAgICAgICAgICAgICAgYWxwaGEwW2tdWzFdID0gKGEwMS5tYW50ICsgcm91bmQpID4+IHNoaWZ0OwpAQCAtMzE1LDExICszMTcsMTIgQEAKICAgICAgICAgc2hpZnQgPSBhMTAuZXhwOwogICAgICAgICBpZiAoc2hpZnQgPj0gMykKICAgICAgICAgICAgIGFscGhhMVtrXVswXSA9IDB4N2ZmZmZmZmY7CisgICAgICAgIGVsc2UgaWYgKHNoaWZ0IDw9IC0zMCkKKyAgICAgICAgICAgIGFscGhhMVtrXVswXSA9IDA7CiAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgYTEwLm1hbnQgPDw9IDE7Ci0gICAgICAgICAgICBzaGlmdCA9IDItc2hpZnQ7Ci0gICAgICAgICAgICBpZiAoc2hpZnQgPT0gMCkKLSAgICAgICAgICAgICAgICBhbHBoYTFba11bMF0gPSBhMTAubWFudDsKKyAgICAgICAgICAgIHNoaWZ0ID0gMS1zaGlmdDsKKyAgICAgICAgICAgIGlmIChzaGlmdCA8PSAwKQorICAgICAgICAgICAgICAgIGFscGhhMVtrXVswXSA9IGExMC5tYW50ICogKDE8PC1zaGlmdCk7CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICByb3VuZCA9IDEgPDwgKHNoaWZ0LTEpOwogICAgICAgICAgICAgICAgIGFscGhhMVtrXVswXSA9IChhMTAubWFudCArIHJvdW5kKSA+PiBzaGlmdDsKQEAgLTMyOSwxMSArMzMyLDEyIEBACiAgICAgICAgIHNoaWZ0ID0gYTExLmV4cDsKICAgICAgICAgaWYgKHNoaWZ0ID49IDMpCiAgICAgICAgICAgICBhbHBoYTFba11bMV0gPSAweDdmZmZmZmZmOworICAgICAgICBlbHNlIGlmIChzaGlmdCA8PSAtMzApCisgICAgICAgICAgICBhbHBoYTFba11bMV0gPSAwOwogICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGExMS5tYW50IDw8PSAxOwotICAgICAgICAgICAgc2hpZnQgPSAyLXNoaWZ0OwotICAgICAgICAgICAgaWYgKHNoaWZ0ID09IDApCi0gICAgICAgICAgICAgICAgYWxwaGExW2tdWzFdID0gYTExLm1hbnQ7CisgICAgICAgICAgICBzaGlmdCA9IDEtc2hpZnQ7CisgICAgICAgICAgICBpZiAoc2hpZnQgPD0gMCkKKyAgICAgICAgICAgICAgICBhbHBoYTFba11bMV0gPSBhMTEubWFudCAqICgxPDwtc2hpZnQpOwogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgcm91bmQgPSAxIDw8IChzaGlmdC0xKTsKICAgICAgICAgICAgICAgICBhbHBoYTFba11bMV0gPSAoYTExLm1hbnQgKyByb3VuZCkgPj4gc2hpZnQ7CkBAIC00MjksNiArNDMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2FkZF9zZihGTE9BVF8xLCBzYnItPmVfY3VycltlXVttXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9hZGRfc2YoRkxPQVRfMSwgc2JyLT5xX21hcHBlZFtlXVttXSkpKSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNici0+Z2FpbltlXVttXSA9IGF2X2FkZF9zZihzYnItPmdhaW5bZV1bbV0sIEZMT0FUX01JTik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKG0gPSBzYnItPmZfdGFibGVsaW1ba10gLSBzYnItPmt4WzFdOyBtIDwgc2JyLT5mX3RhYmxlbGltW2sgKyAxXSAtIHNici0+a3hbMV07IG0rKykgewogICAgICAgICAgICAgICAgIHN1bVswXSA9IGF2X2FkZF9zZihzdW1bMF0sIHNici0+ZV9vcmlnbWFwcGVkW2VdW21dKTsKQEAgLTU2MiwyNSArNTY3LDM5IEBACiAgICAgICAgICAgICAgICAgaW50IGlkeCA9IGluZGV4c2luZSYxOwogICAgICAgICAgICAgICAgIGludCBBID0gKDEtKChpbmRleHNpbmUrKGt4ICYgMSkpJjIpKTsKICAgICAgICAgICAgICAgICBpbnQgQiA9IChBXigtaWR4KSkgKyBpZHg7Ci0gICAgICAgICAgICAgICAgaW50ICpvdXQgPSAmWTFbaV1ba3hdW2lkeF07Ci0gICAgICAgICAgICAgICAgaW50IHNoaWZ0LCByb3VuZDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCAqb3V0ID0gJlkxW2ldW2t4XVtpZHhdOworICAgICAgICAgICAgICAgIGludCBzaGlmdDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3VuZDsKIAogICAgICAgICAgICAgICAgIFNvZnRGbG9hdCAqaW4gID0gc2JyLT5zX21bZV07CiAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSsxIDwgbV9tYXg7IG0rPTIpIHsKLSAgICAgICAgICAgICAgICAgIHNoaWZ0ID0gMjIgLSBpblttICBdLmV4cDsKLSAgICAgICAgICAgICAgICAgIHJvdW5kID0gMSA8PCAoc2hpZnQtMSk7Ci0gICAgICAgICAgICAgICAgICBvdXRbMiptICBdICs9IChpblttICBdLm1hbnQgKiBBICsgcm91bmQpID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQyOworICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDIyIC0gaW5bbSAgXS5leHA7CisgICAgICAgICAgICAgICAgICAgIHNoaWZ0Mj0gMjIgLSBpblttKzFdLmV4cDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0IDwgMSB8fCBzaGlmdDIgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3ZlcmZsb3cgaW4gc2JyX2hmX2Fzc2VtYmxlLCBzaGlmdD0lZCwlZFxuIiwgc2hpZnQsIHNoaWZ0Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNoaWZ0IDwgMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kID0gMSA8PCAoc2hpZnQtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbMiptICBdICs9IChpbnQpKGluW20gIF0ubWFudCAqIEEgKyByb3VuZCkgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgc2hpZnQgPSAyMiAtIGluW20rMV0uZXhwOwotICAgICAgICAgICAgICAgICAgcm91bmQgPSAxIDw8IChzaGlmdC0xKTsKLSAgICAgICAgICAgICAgICAgIG91dFsyKm0rMl0gKz0gKGluW20rMV0ubWFudCAqIEIgKyByb3VuZCkgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaGlmdDIgPCAzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgcm91bmQgPSAxIDw8IChzaGlmdDItMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbMiptKzJdICs9IChpbnQpKGluW20rMV0ubWFudCAqIEIgKyByb3VuZCkgPj4gc2hpZnQyOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmKG1fbWF4JjEpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgc2hpZnQgPSAyMiAtIGluW20gIF0uZXhwOwotICAgICAgICAgICAgICAgICAgcm91bmQgPSAxIDw8IChzaGlmdC0xKTsKLQotICAgICAgICAgICAgICAgICAgb3V0WzIqbSAgXSArPSAoaW5bbSAgXS5tYW50ICogQSArIHJvdW5kKSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSAyMiAtIGluW20gIF0uZXhwOworICAgICAgICAgICAgICAgICAgICBpZiAoc2hpZnQgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3ZlcmZsb3cgaW4gc2JyX2hmX2Fzc2VtYmxlLCBzaGlmdD0lZFxuIiwgc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kID0gMSA8PCAoc2hpZnQtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbMiptICBdICs9IChpbnQpKGluW20gIF0ubWFudCAqIEEgKyByb3VuZCkgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbmRleG5vaXNlID0gKGluZGV4bm9pc2UgKyBtX21heCkgJiAweDFmZjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFjc2JyX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2FhY3Nicl90ZW1wbGF0ZS5jCmluZGV4IDczM2U2MTkuLjNmZTc4ZDUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFjc2JyX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9hYWNzYnJfdGVtcGxhdGUuYwpAQCAtODEsMTEgKzgxLDEyIEBACiAgICAgbWVtc2V0KCZzYnItPnNwZWN0cnVtX3BhcmFtcywgLTEsIHNpemVvZihTcGVjdHJ1bVBhcmFtZXRlcnMpKTsKIH0KIAotYXZfY29sZCB2b2lkIEFBQ19SRU5BTUUoZmZfYWFjX3Nicl9jdHhfaW5pdCkoQUFDQ29udGV4dCAqYWMsIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIpCithdl9jb2xkIHZvaWQgQUFDX1JFTkFNRShmZl9hYWNfc2JyX2N0eF9pbml0KShBQUNDb250ZXh0ICphYywgU3BlY3RyYWxCYW5kUmVwbGljYXRpb24gKnNiciwgaW50IGlkX2FhYykKIHsKICAgICBpZihzYnItPm1kY3QubWRjdF9iaXRzKQogICAgICAgICByZXR1cm47CiAgICAgc2JyLT5reFswXSA9IHNici0+a3hbMV07CisgICAgc2JyLT5pZF9hYWMgPSBpZF9hYWM7CiAgICAgc2JyX3R1cm5vZmYoc2JyKTsKICAgICBzYnItPmRhdGFbMF0uc3ludGhlc2lzX2ZpbHRlcmJhbmtfc2FtcGxlc19vZmZzZXQgPSBTQlJfU1lOVEhFU0lTX0JVRl9TSVpFIC0gKDEyODAgLSAxMjgpOwogICAgIHNici0+ZGF0YVsxXS5zeW50aGVzaXNfZmlsdGVyYmFua19zYW1wbGVzX29mZnNldCA9IFNCUl9TWU5USEVTSVNfQlVGX1NJWkUgLSAoMTI4MCAtIDEyOCk7CkBAIC0yNjAsMTMgKzI2MSw2IEBACiAgICAgY29uc3QgaW50OF90ICpzYnJfb2Zmc2V0X3B0cjsKICAgICBpbnQxNl90IHN0b3BfZGtbMTNdOwogCi0gICAgaWYgKHNici0+c2FtcGxlX3JhdGUgPCAzMjAwMCkgewotICAgICAgICB0ZW1wID0gMzAwMDsKLSAgICB9IGVsc2UgaWYgKHNici0+c2FtcGxlX3JhdGUgPCA2NDAwMCkgewotICAgICAgICB0ZW1wID0gNDAwMDsKLSAgICB9IGVsc2UKLSAgICAgICAgdGVtcCA9IDUwMDA7Ci0KICAgICBzd2l0Y2ggKHNici0+c2FtcGxlX3JhdGUpIHsKICAgICBjYXNlIDE2MDAwOgogICAgICAgICBzYnJfb2Zmc2V0X3B0ciA9IHNicl9vZmZzZXRbMF07CkBAIC0yOTIsNiArMjg2LDEzIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKKyAgICBpZiAoc2JyLT5zYW1wbGVfcmF0ZSA8IDMyMDAwKSB7CisgICAgICAgIHRlbXAgPSAzMDAwOworICAgIH0gZWxzZSBpZiAoc2JyLT5zYW1wbGVfcmF0ZSA8IDY0MDAwKSB7CisgICAgICAgIHRlbXAgPSA0MDAwOworICAgIH0gZWxzZQorICAgICAgICB0ZW1wID0gNTAwMDsKKwogICAgIHN0YXJ0X21pbiA9ICgodGVtcCA8PCA3KSArIChzYnItPnNhbXBsZV9yYXRlID4+IDEpKSAvIHNici0+c2FtcGxlX3JhdGU7CiAgICAgc3RvcF9taW4gID0gKCh0ZW1wIDw8IDgpICsgKHNici0+c2FtcGxlX3JhdGUgPj4gMSkpIC8gc2JyLT5zYW1wbGVfcmF0ZTsKIApAQCAtNjIzLDI0ICs2MjQsMjYgQEAKICAgICBpbnQgYWJzX2JvcmRfdHJhaWwgPSAxNjsKICAgICBpbnQgbnVtX3JlbF9sZWFkLCBudW1fcmVsX3RyYWlsOwogICAgIHVuc2lnbmVkIGJzX251bV9lbnZfb2xkID0gY2hfZGF0YS0+YnNfbnVtX2VudjsKKyAgICBpbnQgYnNfZnJhbWVfY2xhc3MsIGJzX251bV9lbnY7CiAKICAgICBjaF9kYXRhLT5ic19mcmVxX3Jlc1swXSA9IGNoX2RhdGEtPmJzX2ZyZXFfcmVzW2NoX2RhdGEtPmJzX251bV9lbnZdOwogICAgIGNoX2RhdGEtPmJzX2FtcF9yZXMgPSBzYnItPmJzX2FtcF9yZXNfaGVhZGVyOwogICAgIGNoX2RhdGEtPnRfZW52X251bV9lbnZfb2xkID0gY2hfZGF0YS0+dF9lbnZbYnNfbnVtX2Vudl9vbGRdOwogCi0gICAgc3dpdGNoIChjaF9kYXRhLT5ic19mcmFtZV9jbGFzcyA9IGdldF9iaXRzKGdiLCAyKSkgeworICAgIHN3aXRjaCAoYnNfZnJhbWVfY2xhc3MgPSBnZXRfYml0cyhnYiwgMikpIHsKICAgICBjYXNlIEZJWEZJWDoKLSAgICAgICAgY2hfZGF0YS0+YnNfbnVtX2VudiAgICAgICAgICAgICAgICAgPSAxIDw8IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgYnNfbnVtX2VudiA9IDEgPDwgZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBpZiAoYnNfbnVtX2VudiA+IDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBiaXRzdHJlYW0sIHRvbyBtYW55IFNCUiBlbnZlbG9wZXMgaW4gRklYRklYIHR5cGUgU0JSIGZyYW1lOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBic19udW1fZW52KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBjaF9kYXRhLT5ic19udW1fZW52ID0gYnNfbnVtX2VudjsKICAgICAgICAgbnVtX3JlbF9sZWFkICAgICAgICAgICAgICAgICAgICAgICAgPSBjaF9kYXRhLT5ic19udW1fZW52IC0gMTsKICAgICAgICAgaWYgKGNoX2RhdGEtPmJzX251bV9lbnYgPT0gMSkKICAgICAgICAgICAgIGNoX2RhdGEtPmJzX2FtcF9yZXMgPSAwOwogCi0gICAgICAgIGlmIChjaF9kYXRhLT5ic19udW1fZW52ID4gNCkgewotICAgICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJpdHN0cmVhbSwgdG9vIG1hbnkgU0JSIGVudmVsb3BlcyBpbiBGSVhGSVggdHlwZSBTQlIgZnJhbWU6ICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGNoX2RhdGEtPmJzX251bV9lbnYpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CiAKICAgICAgICAgY2hfZGF0YS0+dF9lbnZbMF0gICAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgICBjaF9kYXRhLT50X2VudltjaF9kYXRhLT5ic19udW1fZW52XSA9IGFic19ib3JkX3RyYWlsOwpAQCAtNjg4LDE0ICs2OTEsMTUgQEAKICAgICAgICAgYWJzX2JvcmRfdHJhaWwgICAgICAgICAgICAgICAgICAgICArPSBnZXRfYml0cyhnYiwgMik7CiAgICAgICAgIG51bV9yZWxfbGVhZCAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOwogICAgICAgICBudW1fcmVsX3RyYWlsICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzKGdiLCAyKTsKLSAgICAgICAgY2hfZGF0YS0+YnNfbnVtX2VudiAgICAgICAgICAgICAgICAgPSBudW1fcmVsX2xlYWQgKyBudW1fcmVsX3RyYWlsICsgMTsKKyAgICAgICAgYnNfbnVtX2VudiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBudW1fcmVsX2xlYWQgKyBudW1fcmVsX3RyYWlsICsgMTsKIAotICAgICAgICBpZiAoY2hfZGF0YS0+YnNfbnVtX2VudiA+IDUpIHsKKyAgICAgICAgaWYgKGJzX251bV9lbnYgPiA1KSB7CiAgICAgICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYml0c3RyZWFtLCB0b28gbWFueSBTQlIgZW52ZWxvcGVzIGluIFZBUlZBUiB0eXBlIFNCUiBmcmFtZTogJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgY2hfZGF0YS0+YnNfbnVtX2Vudik7CisgICAgICAgICAgICAgICAgICAgYnNfbnVtX2Vudik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KKyAgICAgICAgY2hfZGF0YS0+YnNfbnVtX2VudiA9IGJzX251bV9lbnY7CiAKICAgICAgICAgY2hfZGF0YS0+dF9lbnZbY2hfZGF0YS0+YnNfbnVtX2Vudl0gPSBhYnNfYm9yZF90cmFpbDsKIApAQCAtNzEwLDYgKzcxNCw3IEBACiAgICAgICAgIGdldF9iaXRzMV92ZWN0b3IoZ2IsIGNoX2RhdGEtPmJzX2ZyZXFfcmVzICsgMSwgY2hfZGF0YS0+YnNfbnVtX2Vudik7CiAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBjaF9kYXRhLT5ic19mcmFtZV9jbGFzcyA9IGJzX2ZyYW1lX2NsYXNzOwogCiAgICAgYXZfYXNzZXJ0MChic19wb2ludGVyID49IDApOwogICAgIGlmIChic19wb2ludGVyID4gY2hfZGF0YS0+YnNfbnVtX2VudiArIDEpIHsKQEAgLTk0MCwxNCArOTQ1LDggQEAKICAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCAqbnVtX2JpdHNfbGVmdCk7IC8vIGJzX2ZpbGxfYml0cwogICAgICAgICAgICAgKm51bV9iaXRzX2xlZnQgPSAwOwogICAgICAgICB9IGVsc2UgewotI2lmIDEKICAgICAgICAgICAgICpudW1fYml0c19sZWZ0IC09IEFBQ19SRU5BTUUoZmZfcHNfcmVhZF9kYXRhKShhYy0+YXZjdHgsIGdiLCAmc2JyLT5wcywgKm51bV9iaXRzX2xlZnQpOwogICAgICAgICAgICAgYWMtPmF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9BQUNfSEVfVjI7Ci0jZWxzZQotICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYWMtPmF2Y3R4LCAiUGFyYW1ldHJpYyBTdGVyZW8iKTsKLSAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCAqbnVtX2JpdHNfbGVmdCk7IC8vIGJzX2ZpbGxfYml0cwotICAgICAgICAgICAgKm51bV9iaXRzX2xlZnQgPSAwOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTExNDIsNiArMTE0MSw3IEBACiAgICAgaWYgKGJ5dGVzX3JlYWQgPiBjbnQpIHsKICAgICAgICAgYXZfbG9nKGFjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIkV4cGVjdGVkIHRvIHJlYWQgJWQgU0JSIGJ5dGVzIGFjdHVhbGx5IHJlYWQgJWQuXG4iLCBjbnQsIGJ5dGVzX3JlYWQpOworICAgICAgICBzYnJfdHVybm9mZihzYnIpOwogICAgIH0KICAgICByZXR1cm4gY250OwogfQpAQCAtMTQ3Myw3ICsxNDczLDcgQEAKICAgICBpbnQgZXJyOwogCiAgICAgaWYgKGlkX2FhYyAhPSBzYnItPmlkX2FhYykgewotICAgICAgICBhdl9sb2coYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgIGF2X2xvZyhhYy0+YXZjdHgsIGlkX2FhYyA9PSBUWVBFX0xGRSA/IEFWX0xPR19WRVJCT1NFIDogQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAiZWxlbWVudCB0eXBlIG1pc21hdGNoICVkICE9ICVkXG4iLCBpZF9hYWMsIHNici0+aWRfYWFjKTsKICAgICAgICAgc2JyX3R1cm5vZmYoc2JyKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhY3RhYi5jIGIvbGliYXZjb2RlYy9hYWN0YWIuYwppbmRleCA3N2Q4NzMyLi5kZjU1MWIwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhY3RhYi5jCisrKyBiL2xpYmF2Y29kZWMvYWFjdGFiLmMKQEAgLTM3LDYgKzM3LDggQEAKIAogREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgIGZmX2FhY19rYmRfbG9uZ18xMDI0KVsxMDI0XTsKIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsICBmZl9hYWNfa2JkX3Nob3J0XzEyOClbMTI4XTsKK0RFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsICBmZl9hYWNfa2JkX2xvbmdfOTYwKVs5NjBdOworREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgIGZmX2FhY19rYmRfc2hvcnRfMTIwKVsxMjBdOwogREVDTEFSRV9BTElHTkVEKDMyLCBpbnQsICAgIGZmX2FhY19rYmRfbG9uZ18xMDI0X2ZpeGVkKVsxMDI0XTsKIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50LCAgICBmZl9hYWNfa2JkX3Nob3J0XzEyOF9maXhlZClbMTI4XTsKIApAQCAtNDQsNiArNDYsMTAgQEAKICAgICA0MSwgNDEsIDQ3LCA0OSwgNDksIDUxLCA0NywgNDcsIDQzLCA0MywgNDMsIDQwLCA0MAogfTsKIAorY29uc3QgdWludDhfdCBmZl9hYWNfbnVtX3N3Yl85NjBbXSA9IHsKKyAgICA0MCwgNDAsIDQ2LCA0OSwgNDksIDQ5LCA0NiwgNDYsIDQyLCA0MiwgNDIsIDQwLCA0MAorfTsKKwogY29uc3QgdWludDhfdCBmZl9hYWNfbnVtX3N3Yl81MTJbXSA9IHsKICAgICAgMCwgIDAsICAwLCAzNiwgMzYsIDM3LCAzMSwgMzEsICAwLCAgMCwgIDAsICAwLCAgMAogfTsKQEAgLTU2LDYgKzYyLDEwIEBACiAgICAgMTIsIDEyLCAxMiwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUKIH07CiAKK2NvbnN0IHVpbnQ4X3QgZmZfYWFjX251bV9zd2JfMTIwW10gPSB7CisgICAgMTIsIDEyLCAxMiwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUKK307CisKIGNvbnN0IHVpbnQ4X3QgZmZfYWFjX3ByZWRfc2ZiX21heFtdID0gewogICAgIDMzLCAzMywgMzgsIDQwLCA0MCwgNDAsIDQxLCA0MSwgMzcsIDM3LCAzNywgMzQsIDM0CiB9OwpAQCAtMTIyOSw2ICsxMjM5LDEwMCBAQAogICAgIDM2LCAgNDQsICA1MiwgIDYwLCAgNzIsICA4OCwgMTA4LCAxMjgKIH07CiAKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0Xzk2MF85NltdID0KK3sKKyAgICAwLCAgIDQsICAgOCwgICAxMiwgIDE2LCAgMjAsICAyNCwgIDI4LCAgMzIsICAzNiwKKyAgICA0MCwgIDQ0LCAgNDgsICA1MiwgIDU2LCAgNjQsICA3MiwgIDgwLCAgODgsICA5NiwKKyAgICAxMDgsIDEyMCwgMTMyLCAxNDQsIDE1NiwgMTcyLCAxODgsIDIxMiwgMjQwLCAyNzYsCisgICAgMzIwLCAzODQsIDQ0OCwgNTEyLCA1NzYsIDY0MCwgNzA0LCA3NjgsIDgzMiwgODk2LAorICAgIDk2MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfOTYwXzY0W10gPQoreworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LAorICAgIDQwLCAgNDQsICA0OCwgIDUyLCAgNTYsICA2NCwgIDcyLCAgODAsICA4OCwgIDEwMCwKKyAgICAxMTIsIDEyNCwgMTQwLCAxNTYsIDE3MiwgMTkyLCAyMTYsIDI0MCwgMjY4LCAzMDQsCisgICAgMzQ0LCAzODQsIDQyNCwgNDY0LCA1MDQsIDU0NCwgNTg0LCA2MjQsIDY2NCwgNzA0LAorICAgIDc0NCwgNzg0LCA4MjQsIDg2NCwgOTA0LCA5NDQsIDk2MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfOTYwXzQ4W10gPQoreworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LAorICAgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsICAxMDgsIDEyMCwKKyAgICAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsCisgICAgMzUyLCAzODQsIDQxNiwgNDQ4LCA0ODAsIDUxMiwgNTQ0LCA1NzYsIDYwOCwgNjQwLAorICAgIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDk2MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfOTYwXzMyW10gPQoreworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LAorICAgIDQwLCAgNDgsICA1NiwgIDY0LCAgNzIsICA4MCwgIDg4LCAgOTYsICAxMDgsIDEyMCwKKyAgICAxMzIsIDE0NCwgMTYwLCAxNzYsIDE5NiwgMjE2LCAyNDAsIDI2NCwgMjkyLCAzMjAsCisgICAgMzUyLCAzODQsIDQxNiwgNDQ4LCA0ODAsIDUxMiwgNTQ0LCA1NzYsIDYwOCwgNjQwLAorICAgIDY3MiwgNzA0LCA3MzYsIDc2OCwgODAwLCA4MzIsIDg2NCwgODk2LCA5MjgsIDk2MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfOTYwXzI0W10gPQoreworICAgIDAsICAgNCwgICA4LCAgIDEyLCAgMTYsICAyMCwgIDI0LCAgMjgsICAzMiwgIDM2LAorICAgIDQwLCAgNDQsICA1MiwgIDYwLCAgNjgsICA3NiwgIDg0LCAgOTIsICAxMDAsIDEwOCwKKyAgICAxMTYsIDEyNCwgMTM2LCAxNDgsIDE2MCwgMTcyLCAxODgsIDIwNCwgMjIwLCAyNDAsCisgICAgMjYwLCAyODQsIDMwOCwgMzM2LCAzNjQsIDM5NiwgNDMyLCA0NjgsIDUwOCwgNTUyLAorICAgIDYwMCwgNjUyLCA3MDQsIDc2OCwgODMyLCA4OTYsIDk2MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfOTYwXzE2W10gPQoreworICAgIDAsICAgOCwgICAxNiwgIDI0LCAgMzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDcyLAorICAgIDgwLCAgODgsICAxMDAsIDExMiwgMTI0LCAxMzYsIDE0OCwgMTYwLCAxNzIsIDE4NCwKKyAgICAxOTYsIDIxMiwgMjI4LCAyNDQsIDI2MCwgMjgwLCAzMDAsIDMyMCwgMzQ0LCAzNjgsCisgICAgMzk2LCA0MjQsIDQ1NiwgNDkyLCA1MzIsIDU3MiwgNjE2LCA2NjQsIDcxNiwgNzcyLAorICAgIDgzMiwgODk2LCA5NjAKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0Xzk2MF84W10gPQoreworICAgIDAsICAgMTIsICAyNCwgIDM2LCAgNDgsICA2MCwgIDcyLCAgODQsICA5NiwgIDEwOCwKKyAgICAxMjAsIDEzMiwgMTQ0LCAxNTYsIDE3MiwgMTg4LCAyMDQsIDIyMCwgMjM2LCAyNTIsCisgICAgMjY4LCAyODgsIDMwOCwgMzI4LCAzNDgsIDM3MiwgMzk2LCA0MjAsIDQ0OCwgNDc2LAorICAgIDUwOCwgNTQ0LCA1ODAsIDYyMCwgNjY0LCA3MTIsIDc2NCwgODIwLCA4ODAsIDk0NCwKKyAgICA5NjAKK307CisKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTIwXzk2W10gPQoreworICAgIDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTIwXzY0W10gPQoreworICAgIDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAzMiwgNDAsIDQ4LCA2NCwgOTIsIDEyMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTIwXzQ4W10gPQoreworICAgIDAsICA0LCA4LCAxMiwgMTYsIDIwLCAyOCwgMzYsIDQ0LCA1NiwgNjgsIDgwLCA5NiwgMTEyLCAxMjAKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzd2Jfb2Zmc2V0XzEyMF8yNFtdID0KK3sKKyAgICAwLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjgsIDM2LCA0NCwgNTIsIDY0LCA3NiwgOTIsIDEwOCwgMTIwCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc3diX29mZnNldF8xMjBfMTZbXSA9Cit7CisgICAgMCwgNCwgOCwgMTIsIDE2LCAyMCwgMjQsIDI4LCAzMiwgNDAsIDQ4LCA2MCwgNzIsIDg4LCAxMDgsIDEyMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN3Yl9vZmZzZXRfMTIwXzhbXSA9Cit7CisgICAgMCwgNCwgOCwgMTIsIDE2LCAgMjAsIDI0LCAyOCwgMzYsIDQ0LCA1MiwgNjAsIDcyLCA4OCwgMTA4LCAxMjAKK307CisKIGNvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfc3diX29mZnNldF8xMDI0W10gPSB7CiAgICAgc3diX29mZnNldF8xMDI0Xzk2LCBzd2Jfb2Zmc2V0XzEwMjRfOTYsIHN3Yl9vZmZzZXRfMTAyNF82NCwKICAgICBzd2Jfb2Zmc2V0XzEwMjRfNDgsIHN3Yl9vZmZzZXRfMTAyNF80OCwgc3diX29mZnNldF8xMDI0XzMyLApAQCAtMTIzNyw2ICsxMzQxLDE0IEBACiAgICAgc3diX29mZnNldF8xMDI0XzgKIH07CiAKK2NvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfc3diX29mZnNldF85NjBbXSA9IHsKKyAgICBzd2Jfb2Zmc2V0Xzk2MF85Niwgc3diX29mZnNldF85NjBfOTYsIHN3Yl9vZmZzZXRfOTYwXzY0LAorICAgIHN3Yl9vZmZzZXRfOTYwXzQ4LCBzd2Jfb2Zmc2V0Xzk2MF80OCwgc3diX29mZnNldF85NjBfMzIsCisgICAgc3diX29mZnNldF85NjBfMjQsIHN3Yl9vZmZzZXRfOTYwXzI0LCBzd2Jfb2Zmc2V0Xzk2MF8xNiwKKyAgICBzd2Jfb2Zmc2V0Xzk2MF8xNiwgc3diX29mZnNldF85NjBfMTYsIHN3Yl9vZmZzZXRfOTYwXzgsCisgICAgc3diX29mZnNldF85NjBfOAorfTsKKwogY29uc3QgdWludDE2X3QgKiBjb25zdCBmZl9zd2Jfb2Zmc2V0XzUxMltdID0gewogICAgIE5VTEwsICAgICAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICBOVUxMLAogICAgIHN3Yl9vZmZzZXRfNTEyXzQ4LCAgc3diX29mZnNldF81MTJfNDgsICBzd2Jfb2Zmc2V0XzUxMl8zMiwKQEAgLTEyNjMsNiArMTM3NSwxNCBAQAogICAgIHN3Yl9vZmZzZXRfMTI4XzgKIH07CiAKK2NvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfc3diX29mZnNldF8xMjBbXSA9IHsKKyAgICBzd2Jfb2Zmc2V0XzEyMF85Niwgc3diX29mZnNldF8xMjBfOTYsIHN3Yl9vZmZzZXRfMTIwXzk2LAorICAgIHN3Yl9vZmZzZXRfMTIwXzQ4LCBzd2Jfb2Zmc2V0XzEyMF80OCwgc3diX29mZnNldF8xMjBfNDgsCisgICAgc3diX29mZnNldF8xMjBfMjQsIHN3Yl9vZmZzZXRfMTIwXzI0LCBzd2Jfb2Zmc2V0XzEyMF8xNiwKKyAgICBzd2Jfb2Zmc2V0XzEyMF8xNiwgc3diX29mZnNldF8xMjBfMTYsIHN3Yl9vZmZzZXRfMTIwXzgsCisgICAgc3diX29mZnNldF8xMjBfOAorfTsKKwogLy8gQH0KIAogLyogQG5hbWUgZmZfdG5zX21heF9iYW5kcwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYWN0YWIuaCBiL2xpYmF2Y29kZWMvYWFjdGFiLmgKaW5kZXggYjQ4ZTdkYS4uN2NkODEyOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYWN0YWIuaAorKysgYi9saWJhdmNvZGVjL2FhY3RhYi5oCkBAIC05Miw4ICs5Miw4IEBACiAgKiBUYWJsZSBvZiB0aGUgTFRQIGNvZWZmaWNpZW50cwogICovCiBzdGF0aWMgY29uc3QgSU5URkxPQVQgbHRwX2NvZWZbOF0gPSB7Ci0gICAgUTMwKDAuNTcwODI5ZiksIFEzMCgwLjY5NjYxNmYpLCBRMzAoMC44MTMwMDRmKSwgUTMwKDAuOTExMzA0ZiksCi0gICAgUTMwKDAuOTg0OTAwZiksIFEzMCgxLjA2Nzg5NGYpLCBRMzAoMS4xOTQ2MDFmKSwgUTMwKDEuMzY5NTMzZiksCisgICAgUTMwKDAuNTcwODI5KSwgUTMwKDAuNjk2NjE2KSwgUTMwKDAuODEzMDA0KSwgUTMwKDAuOTExMzA0KSwKKyAgICBRMzAoMC45ODQ5MDApLCBRMzAoMS4wNjc4OTQpLCBRMzAoMS4xOTQ2MDEpLCBRMzAoMS4zNjk1MzMpLAogfTsKIAogLyogQG5hbWUgdG5zX3RtcDJfbWFwCkBAIC0xMDMsMjQgKzEwMywyNCBAQAogICogQHsKICAqLwogc3RhdGljIGNvbnN0IElOVEZMT0FUIHRuc190bXAyX21hcF8xXzNbNF0gPSB7Ci0gICAgUTMxKDAuMDAwMDAwMDBmKSwgUTMxKC0wLjQzMzg4MzczZiksICBRMzEoMC42NDI3ODc1OGYpLCAgUTMxKDAuMzQyMDIwMTVmKSwKKyAgICBRMzEoMC4wMDAwMDAwMCksIFEzMSgtMC40MzM4ODM3MyksICBRMzEoMC42NDI3ODc1OCksICBRMzEoMC4zNDIwMjAxNSksCiB9OwogCiBzdGF0aWMgY29uc3QgSU5URkxPQVQgdG5zX3RtcDJfbWFwXzBfM1s4XSA9IHsKLSAgICBRMzEoMC4wMDAwMDAwMGYpLCBRMzEoLTAuNDMzODgzNzNmKSwgUTMxKC0wLjc4MTgzMTUwZiksIFEzMSgtMC45NzQ5Mjc5MGYpLAotICAgIFEzMSgwLjk4NDgwNzczZiksIFEzMSggMC44NjYwMjUzOWYpLCBRMzEoIDAuNjQyNzg3NThmKSwgUTMxKCAwLjM0MjAyMDE1ZiksCisgICAgUTMxKDAuMDAwMDAwMDApLCBRMzEoLTAuNDMzODgzNzMpLCBRMzEoLTAuNzgxODMxNTApLCBRMzEoLTAuOTc0OTI3OTApLAorICAgIFEzMSgwLjk4NDgwNzczKSwgUTMxKCAwLjg2NjAyNTM5KSwgUTMxKCAwLjY0Mjc4NzU4KSwgUTMxKCAwLjM0MjAyMDE1KSwKIH07CiAKIHN0YXRpYyBjb25zdCBJTlRGTE9BVCB0bnNfdG1wMl9tYXBfMV80WzhdID0gewotICAgIFEzMSgwLjAwMDAwMDAwZiksIFEzMSgtMC4yMDc5MTE3MGYpLCBRMzEoLTAuNDA2NzM2NjRmKSwgUTMxKC0wLjU4Nzc4NTI0ZiksCi0gICAgUTMxKDAuNjczNjk1NjJmKSwgUTMxKCAwLjUyNjQzMjE2ZiksIFEzMSggMC4zNjEyNDE2N2YpLCBRMzEoIDAuMTgzNzQ5NTFmKSwKKyAgICBRMzEoMC4wMDAwMDAwMCksIFEzMSgtMC4yMDc5MTE3MCksIFEzMSgtMC40MDY3MzY2NCksIFEzMSgtMC41ODc3ODUyNCksCisgICAgUTMxKDAuNjczNjk1NjIpLCBRMzEoIDAuNTI2NDMyMTYpLCBRMzEoIDAuMzYxMjQxNjcpLCBRMzEoIDAuMTgzNzQ5NTEpLAogfTsKIAogc3RhdGljIGNvbnN0IElOVEZMT0FUIHRuc190bXAyX21hcF8wXzRbMTZdID0gewotICAgIFEzMSggMC4wMDAwMDAwMGYpLCBRMzEoLTAuMjA3OTExNzBmKSwgUTMxKC0wLjQwNjczNjY0ZiksIFEzMSgtMC41ODc3ODUyNGYpLAotICAgIFEzMSgtMC43NDMxNDQ4MWYpLCBRMzEoLTAuODY2MDI1MzlmKSwgUTMxKC0wLjk1MTA1NjU0ZiksIFEzMSgtMC45OTQ1MjE5MmYpLAotICAgIFEzMSggMC45OTU3MzQxNmYpLCBRMzEoIDAuOTYxODI1NjFmKSwgUTMxKCAwLjg5NTE2MzMwZiksIFEzMSggMC43OTgwMTcyMGYpLAotICAgIFEzMSggMC42NzM2OTU2MmYpLCBRMzEoIDAuNTI2NDMyMTZmKSwgUTMxKCAwLjM2MTI0MTY3ZiksIFEzMSggMC4xODM3NDk1MWYpLAorICAgIFEzMSggMC4wMDAwMDAwMCksIFEzMSgtMC4yMDc5MTE3MCksIFEzMSgtMC40MDY3MzY2NCksIFEzMSgtMC41ODc3ODUyNCksCisgICAgUTMxKC0wLjc0MzE0NDgxKSwgUTMxKC0wLjg2NjAyNTM5KSwgUTMxKC0wLjk1MTA1NjU0KSwgUTMxKC0wLjk5NDUyMTkyKSwKKyAgICBRMzEoIDAuOTk1NzM0MTYpLCBRMzEoIDAuOTYxODI1NjEpLCBRMzEoIDAuODk1MTYzMzApLCBRMzEoIDAuNzk4MDE3MjApLAorICAgIFEzMSggMC42NzM2OTU2MiksIFEzMSggMC41MjY0MzIxNiksIFEzMSggMC4zNjEyNDE2NyksIFEzMSggMC4xODM3NDk1MSksCiB9OwogCiBzdGF0aWMgY29uc3QgSU5URkxPQVQgKiBjb25zdCB0bnNfdG1wMl9tYXBbNF0gPSB7CkBAIC0xMzYsMjIgKzEzNiwyNiBAQAogICovCiBERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBmbG9hdCwgIGZmX2FhY19rYmRfbG9uZ18xMDI0KVsxMDI0XTsKIERFQ0xBUkVfQUxJR05FRCgzMiwgZXh0ZXJuIGZsb2F0LCAgZmZfYWFjX2tiZF9zaG9ydF8xMjgpWzEyOF07CitERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBmbG9hdCwgIGZmX2FhY19rYmRfbG9uZ185NjApWzk2MF07CitERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBmbG9hdCwgIGZmX2FhY19rYmRfc2hvcnRfMTIwKVsxMjBdOwogREVDTEFSRV9BTElHTkVEKDMyLCBleHRlcm4gaW50LCAgICBmZl9hYWNfa2JkX2xvbmdfMTAyNF9maXhlZClbMTAyNF07CiBERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBpbnQsICAgIGZmX2FhY19rYmRfbG9uZ181MTJfZml4ZWQpWzUxMl07CiBERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBpbnQsICAgIGZmX2FhY19rYmRfc2hvcnRfMTI4X2ZpeGVkKVsxMjhdOwotY29uc3QgREVDTEFSRV9BTElHTkVEKDMyLCBleHRlcm4gZmxvYXQsIGZmX2FhY19lbGRfd2luZG93XzUxMilbMTkyMF07Ci1jb25zdCBERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBpbnQsICAgZmZfYWFjX2VsZF93aW5kb3dfNTEyX2ZpeGVkKVsxOTIwXTsKLWNvbnN0IERFQ0xBUkVfQUxJR05FRCgzMiwgZXh0ZXJuIGZsb2F0LCBmZl9hYWNfZWxkX3dpbmRvd180ODApWzE4MDBdOwotY29uc3QgREVDTEFSRV9BTElHTkVEKDMyLCBleHRlcm4gaW50LCAgIGZmX2FhY19lbGRfd2luZG93XzQ4MF9maXhlZClbMTgwMF07CitERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBjb25zdCBmbG9hdCwgZmZfYWFjX2VsZF93aW5kb3dfNTEyKVsxOTIwXTsKK0RFQ0xBUkVfQUxJR05FRCgzMiwgZXh0ZXJuIGNvbnN0IGludCwgICBmZl9hYWNfZWxkX3dpbmRvd181MTJfZml4ZWQpWzE5MjBdOworREVDTEFSRV9BTElHTkVEKDMyLCBleHRlcm4gY29uc3QgZmxvYXQsIGZmX2FhY19lbGRfd2luZG93XzQ4MClbMTgwMF07CitERUNMQVJFX0FMSUdORUQoMzIsIGV4dGVybiBjb25zdCBpbnQsICAgZmZfYWFjX2VsZF93aW5kb3dfNDgwX2ZpeGVkKVsxODAwXTsKIC8vIEB9CiAKIC8qIEBuYW1lIG51bWJlciBvZiBzY2FsZWZhY3RvciB3aW5kb3cgYmFuZHMgZm9yIGxvbmcgYW5kIHNob3J0IHRyYW5zZm9ybSB3aW5kb3dzIHJlc3BlY3RpdmVseQogICogQHsKICAqLwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWFjX251bV9zd2JfMTAyNFtdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWFjX251bV9zd2JfOTYwIFtdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWFjX251bV9zd2JfNTEyIFtdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWFjX251bV9zd2JfNDgwIFtdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWFjX251bV9zd2JfMTI4IFtdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWFjX251bV9zd2JfMTIwIFtdOwogLy8gQH0KIAogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfYWFjX3ByZWRfc2ZiX21heCBbXTsKQEAgLTE2OCw5ICsxNzIsMTEgQEAKIGV4dGVybiBjb25zdCB1aW50MTZfdCAqZmZfYWFjX2NvZGVib29rX3ZlY3Rvcl9pZHhbXTsKIAogZXh0ZXJuIGNvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfc3diX29mZnNldF8xMDI0WzEzXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCAqIGNvbnN0IGZmX3N3Yl9vZmZzZXRfOTYwIFsxM107CiBleHRlcm4gY29uc3QgdWludDE2X3QgKiBjb25zdCBmZl9zd2Jfb2Zmc2V0XzUxMiBbMTNdOwogZXh0ZXJuIGNvbnN0IHVpbnQxNl90ICogY29uc3QgZmZfc3diX29mZnNldF80ODAgWzEzXTsKIGV4dGVybiBjb25zdCB1aW50MTZfdCAqIGNvbnN0IGZmX3N3Yl9vZmZzZXRfMTI4IFsxM107CitleHRlcm4gY29uc3QgdWludDE2X3QgKiBjb25zdCBmZl9zd2Jfb2Zmc2V0XzEyMCBbMTNdOwogCiBleHRlcm4gY29uc3QgdWludDhfdCBmZl90bnNfbWF4X2JhbmRzXzEwMjRbMTNdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdG5zX21heF9iYW5kc181MTIgWzEzXTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC9NYWtlZmlsZSBiL2xpYmF2Y29kZWMvYWFyY2g2NC9NYWtlZmlsZQppbmRleCBmZDg5MDM1Li43MjA4MGMyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhcmNoNjQvTWFrZWZpbGUKKysrIGIvbGliYXZjb2RlYy9hYXJjaDY0L01ha2VmaWxlCkBAIC0xLDQgKzEsNCBAQAotT0JKUy0kKENPTkZJR19EQ0FfREVDT0RFUikgICAgICAgICAgICAgICs9IGFhcmNoNjQvc3ludGhfZmlsdGVyX2luaXQubworIyBzdWJzeXN0ZW1zCiBPQkpTLSQoQ09ORklHX0ZGVCkgICAgICAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9mZnRfaW5pdF9hYXJjaDY0Lm8KIE9CSlMtJChDT05GSUdfRk1UQ09OVkVSVCkgICAgICAgICAgICAgICArPSBhYXJjaDY0L2ZtdGNvbnZlcnRfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0gyNjRDSFJPTUEpICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9oMjY0Y2hyb21hX2luaXRfYWFyY2g2NC5vCkBAIC02LDE4ICs2LDMwIEBACiBPQkpTLSQoQ09ORklHX0gyNjRQUkVEKSAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9oMjY0cHJlZF9pbml0Lm8KIE9CSlMtJChDT05GSUdfSDI2NFFQRUwpICAgICAgICAgICAgICAgICArPSBhYXJjaDY0L2gyNjRxcGVsX2luaXRfYWFyY2g2NC5vCiBPQkpTLSQoQ09ORklHX0hQRUxEU1ApICAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9ocGVsZHNwX2luaXRfYWFyY2g2NC5vCi1PQkpTLSQoQ09ORklHX0lNRENUMTUpICAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9pbWRjdDE1X2luaXQubwogT0JKUy0kKENPTkZJR19NUEVHQVVESU9EU1ApICAgICAgICAgICAgICs9IGFhcmNoNjQvbXBlZ2F1ZGlvZHNwX2luaXQubwogT0JKUy0kKENPTkZJR19ORU9OX0NMT0JCRVJfVEVTVCkgICAgICAgICs9IGFhcmNoNjQvbmVvbnRlc3QubwogT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvdmlkZW9kc3BfaW5pdC5vCiAKKyMgZGVjb2RlcnMvZW5jb2RlcnMKK09CSlMtJChDT05GSUdfQUFDX0RFQ09ERVIpICAgICAgICAgICAgICArPSBhYXJjaDY0L2FhY3BzZHNwX2luaXRfYWFyY2g2NC5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXJjaDY0L3NicmRzcF9pbml0X2FhcmNoNjQubworT0JKUy0kKENPTkZJR19EQ0FfREVDT0RFUikgICAgICAgICAgICAgICs9IGFhcmNoNjQvc3ludGhfZmlsdGVyX2luaXQubwogT0JKUy0kKENPTkZJR19SVjQwX0RFQ09ERVIpICAgICAgICAgICAgICs9IGFhcmNoNjQvcnY0MGRzcF9pbml0X2FhcmNoNjQubwotT0JKUy0kKENPTkZJR19WQzFfREVDT0RFUikgICAgICAgICAgICAgICs9IGFhcmNoNjQvdmMxZHNwX2luaXRfYWFyY2g2NC5vCitPQkpTLSQoQ09ORklHX1ZDMURTUCkgICAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC92YzFkc3BfaW5pdF9hYXJjaDY0Lm8KIE9CSlMtJChDT05GSUdfVk9SQklTX0RFQ09ERVIpICAgICAgICAgICArPSBhYXJjaDY0L3ZvcmJpc2RzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfVlA5X0RFQ09ERVIpICAgICAgICAgICAgICArPSBhYXJjaDY0L3ZwOWRzcF9pbml0XzEwYnBwX2FhcmNoNjQubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFyY2g2NC92cDlkc3BfaW5pdF8xMmJwcF9hYXJjaDY0Lm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhcmNoNjQvdnA5ZHNwX2luaXRfYWFyY2g2NC5vCiAKKyMgQVJNdjggb3B0aW1pemF0aW9ucworCisjIHN1YnN5c3RlbXMKIEFSTVY4LU9CSlMtJChDT05GSUdfVklERU9EU1ApICAgICAgICAgICArPSBhYXJjaDY0L3ZpZGVvZHNwLm8KIAotTkVPTi1PQkpTLSQoQ09ORklHX0RDQV9ERUNPREVSKSAgICAgICAgICs9IGFhcmNoNjQvc3ludGhfZmlsdGVyX25lb24ubworIyBORU9OIG9wdGltaXphdGlvbnMKKworIyBzdWJzeXN0ZW1zCitORU9OLU9CSlMtJChDT05GSUdfQUFDX0RFQ09ERVIpICAgICAgICAgKz0gYWFyY2g2NC9zYnJkc3BfbmVvbi5vCiBORU9OLU9CSlMtJChDT05GSUdfRkZUKSAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9mZnRfbmVvbi5vCiBORU9OLU9CSlMtJChDT05GSUdfRk1UQ09OVkVSVCkgICAgICAgICAgKz0gYWFyY2g2NC9mbXRjb252ZXJ0X25lb24ubwogTkVPTi1PQkpTLSQoQ09ORklHX0gyNjRDSFJPTUEpICAgICAgICAgICs9IGFhcmNoNjQvaDI2NGNtY19uZW9uLm8KQEAgLTI3LDggKzM5LDE4IEBACiBORU9OLU9CSlMtJChDT05GSUdfSDI2NFFQRUwpICAgICAgICAgICAgKz0gYWFyY2g2NC9oMjY0cXBlbF9uZW9uLm8gICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhcmNoNjQvaHBlbGRzcF9uZW9uLm8KIE5FT04tT0JKUy0kKENPTkZJR19IUEVMRFNQKSAgICAgICAgICAgICArPSBhYXJjaDY0L2hwZWxkc3BfbmVvbi5vCi1ORU9OLU9CSlMtJChDT05GSUdfSU1EQ1QxNSkgICAgICAgICAgICAgKz0gYWFyY2g2NC9pbWRjdDE1X25lb24ubwotTkVPTi1PQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICAgICs9IGFhcmNoNjQvbXBlZ2F1ZGlvZHNwX25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICAgICs9IGFhcmNoNjQvaWRjdGRzcF9pbml0X2FhcmNoNjQubyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXJjaDY0L3NpbXBsZV9pZGN0X25lb24ubwogTkVPTi1PQkpTLSQoQ09ORklHX01EQ1QpICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvbWRjdF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19NUEVHQVVESU9EU1ApICAgICAgICArPSBhYXJjaDY0L21wZWdhdWRpb2RzcF9uZW9uLm8KIAorIyBkZWNvZGVycy9lbmNvZGVycworTkVPTi1PQkpTLSQoQ09ORklHX0FBQ19ERUNPREVSKSAgICAgICAgICs9IGFhcmNoNjQvYWFjcHNkc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfRENBX0RFQ09ERVIpICAgICAgICAgKz0gYWFyY2g2NC9zeW50aF9maWx0ZXJfbmVvbi5vCiBORU9OLU9CSlMtJChDT05GSUdfVk9SQklTX0RFQ09ERVIpICAgICAgKz0gYWFyY2g2NC92b3JiaXNkc3BfbmVvbi5vCitORU9OLU9CSlMtJChDT05GSUdfVlA5X0RFQ09ERVIpICAgICAgICAgKz0gYWFyY2g2NC92cDlpdHhmbV8xNmJwcF9uZW9uLm8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhcmNoNjQvdnA5aXR4Zm1fbmVvbi5vICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXJjaDY0L3ZwOWxwZl8xNmJwcF9uZW9uLm8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFyY2g2NC92cDlscGZfbmVvbi5vICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhcmNoNjQvdnA5bWNfMTZicHBfbmVvbi5vICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXJjaDY0L3ZwOW1jX25lb24ubwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L2FhY3BzZHNwX2luaXRfYWFyY2g2NC5jIGIvbGliYXZjb2RlYy9hYXJjaDY0L2FhY3BzZHNwX2luaXRfYWFyY2g2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlN2UxOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvYWFjcHNkc3BfaW5pdF9hYXJjaDY0LmMKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FhY3BzZHNwLmgiCisKK3ZvaWQgZmZfcHNfYWRkX3NxdWFyZXNfbmVvbihmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAoKnNyYylbMl0sIGludCBuKTsKK3ZvaWQgZmZfcHNfbXVsX3BhaXJfc2luZ2xlX25lb24oZmxvYXQgKCpkc3QpWzJdLCBmbG9hdCAoKnNyYzApWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc3JjMSwgaW50IG4pOwordm9pZCBmZl9wc19oeWJyaWRfYW5hbHlzaXNfbmVvbihmbG9hdCAoKm91dClbMl0sIGZsb2F0ICgqaW4pWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAoKmZpbHRlcilbOF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBuKTsKK3ZvaWQgZmZfcHNfc3RlcmVvX2ludGVycG9sYXRlX25lb24oZmxvYXQgKCpsKVsyXSwgZmxvYXQgKCpyKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaFsyXVs0XSwgZmxvYXQgaF9zdGVwWzJdWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKK3ZvaWQgZmZfcHNfc3RlcmVvX2ludGVycG9sYXRlX2lwZG9wZF9uZW9uKGZsb2F0ICgqbClbMl0sIGZsb2F0ICgqcilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoWzJdWzRdLCBmbG9hdCBoX3N0ZXBbMl1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKworYXZfY29sZCB2b2lkIGZmX3BzZHNwX2luaXRfYWFyY2g2NChQU0RTUENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5hZGRfc3F1YXJlcyAgICAgICAgICAgPSBmZl9wc19hZGRfc3F1YXJlc19uZW9uOworICAgICAgICBzLT5tdWxfcGFpcl9zaW5nbGUgICAgICAgPSBmZl9wc19tdWxfcGFpcl9zaW5nbGVfbmVvbjsKKyAgICAgICAgcy0+aHlicmlkX2FuYWx5c2lzICAgICAgID0gZmZfcHNfaHlicmlkX2FuYWx5c2lzX25lb247CisgICAgICAgIHMtPnN0ZXJlb19pbnRlcnBvbGF0ZVswXSA9IGZmX3BzX3N0ZXJlb19pbnRlcnBvbGF0ZV9uZW9uOworICAgICAgICBzLT5zdGVyZW9faW50ZXJwb2xhdGVbMV0gPSBmZl9wc19zdGVyZW9faW50ZXJwb2xhdGVfaXBkb3BkX25lb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L2FhY3BzZHNwX25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9hYWNwc2RzcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0ZTZlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9hYWNwc2RzcF9uZW9uLlMKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIgorCitmdW5jdGlvbiBmZl9wc19hZGRfc3F1YXJlc19uZW9uLCBleHBvcnQ9MQorMTogICAgICBsZDEgICAgICAgICB7djAuNFMsdjEuNFN9LCBbeDFdLCAjMzIKKyAgICAgICAgZm11bCAgICAgICAgdjAuNFMsIHYwLjRTLCB2MC40UworICAgICAgICBmbXVsICAgICAgICB2MS40UywgdjEuNFMsIHYxLjRTCisgICAgICAgIGZhZGRwICAgICAgIHYyLjRTLCB2MC40UywgdjEuNFMKKyAgICAgICAgbGQxICAgICAgICAge3YzLjRTfSwgW3gwXQorICAgICAgICBmYWRkICAgICAgICB2My40UywgdjMuNFMsIHYyLjRTCisgICAgICAgIHN0MSAgICAgICAgIHt2My40U30sIFt4MF0sICMxNgorICAgICAgICBzdWJzICAgICAgICB3MiwgdzIsICM0CisgICAgICAgIGIuZ3QgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wc19tdWxfcGFpcl9zaW5nbGVfbmVvbiwgZXhwb3J0PTEKKzE6ICAgICAgbGQxICAgICAgICAge3YwLjRTLHYxLjRTfSwgW3gxXSwgIzMyCisgICAgICAgIGxkMSAgICAgICAgIHt2Mi40U30sICAgICAgIFt4Ml0sICMxNgorICAgICAgICB6aXAxICAgICAgICB2My40UywgdjIuNFMsIHYyLjRTCisgICAgICAgIHppcDIgICAgICAgIHY0LjRTLCB2Mi40UywgdjIuNFMKKyAgICAgICAgZm11bCAgICAgICAgdjAuNFMsIHYwLjRTLCB2My40UworICAgICAgICBmbXVsICAgICAgICB2MS40UywgdjEuNFMsIHY0LjRTCisgICAgICAgIHN0MSAgICAgICAgIHt2MC40Uyx2MS40U30sIFt4MF0sICMzMgorICAgICAgICBzdWJzICAgICAgICB3MywgdzMsICM0CisgICAgICAgIGIuZ3QgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wc19zdGVyZW9faW50ZXJwb2xhdGVfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGQxICAgICAgICAge3YwLjRTfSwgW3gyXQorICAgICAgICBsZDEgICAgICAgICB7djEuNFN9LCBbeDNdCisgICAgICAgIHppcDEgICAgICAgIHY0LjRTLCB2MC40UywgdjAuNFMKKyAgICAgICAgemlwMiAgICAgICAgdjUuNFMsIHYwLjRTLCB2MC40UworICAgICAgICB6aXAxICAgICAgICB2Ni40UywgdjEuNFMsIHYxLjRTCisgICAgICAgIHppcDIgICAgICAgIHY3LjRTLCB2MS40UywgdjEuNFMKKzE6ICAgICAgbGQxICAgICAgICAge3YyLjJTfSwgW3gwXQorICAgICAgICBsZDEgICAgICAgICB7djMuMlN9LCBbeDFdCisgICAgICAgIGZhZGQgICAgICAgIHY0LjRTLCB2NC40UywgdjYuNFMKKyAgICAgICAgZmFkZCAgICAgICAgdjUuNFMsIHY1LjRTLCB2Ny40UworICAgICAgICBtb3YgICAgICAgICB2Mi5EWzFdLCB2Mi5EWzBdCisgICAgICAgIG1vdiAgICAgICAgIHYzLkRbMV0sIHYzLkRbMF0KKyAgICAgICAgZm11bCAgICAgICAgdjIuNFMsIHYyLjRTLCB2NC40UworICAgICAgICBmbWxhICAgICAgICB2Mi40UywgdjMuNFMsIHY1LjRTCisgICAgICAgIHN0MSAgICAgICAgIHt2Mi5EfVswXSwgW3gwXSwgIzgKKyAgICAgICAgc3QxICAgICAgICAge3YyLkR9WzFdLCBbeDFdLCAjOAorICAgICAgICBzdWJzICAgICAgICB3NCwgdzQsICMxCisgICAgICAgIGIuZ3QgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9wc19zdGVyZW9faW50ZXJwb2xhdGVfaXBkb3BkX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkMSAgICAgICAgIHt2MC40Uyx2MS40U30sIFt4Ml0KKyAgICAgICAgbGQxICAgICAgICAge3Y2LjRTLHY3LjRTfSwgW3gzXQorICAgICAgICBmbmVnICAgICAgICB2Mi40UywgdjEuNFMKKyAgICAgICAgZm5lZyAgICAgICAgdjMuNFMsIHY3LjRTCisgICAgICAgIHppcDEgICAgICAgIHYxNi40UywgdjAuNFMsIHYwLjRTCisgICAgICAgIHppcDIgICAgICAgIHYxNy40UywgdjAuNFMsIHYwLjRTCisgICAgICAgIHppcDEgICAgICAgIHYxOC40UywgdjIuNFMsIHYxLjRTCisgICAgICAgIHppcDIgICAgICAgIHYxOS40UywgdjIuNFMsIHYxLjRTCisgICAgICAgIHppcDEgICAgICAgIHYyMC40UywgdjYuNFMsIHY2LjRTCisgICAgICAgIHppcDIgICAgICAgIHYyMS40UywgdjYuNFMsIHY2LjRTCisgICAgICAgIHppcDEgICAgICAgIHYyMi40UywgdjMuNFMsIHY3LjRTCisgICAgICAgIHppcDIgICAgICAgIHYyMy40UywgdjMuNFMsIHY3LjRTCisxOiAgICAgIGxkMSAgICAgICAgIHt2Mi4yU30sIFt4MF0KKyAgICAgICAgbGQxICAgICAgICAge3YzLjJTfSwgW3gxXQorICAgICAgICBmYWRkICAgICAgICB2MTYuNFMsIHYxNi40UywgdjIwLjRTCisgICAgICAgIGZhZGQgICAgICAgIHYxNy40UywgdjE3LjRTLCB2MjEuNFMKKyAgICAgICAgbW92ICAgICAgICAgdjIuRFsxXSwgdjIuRFswXQorICAgICAgICBtb3YgICAgICAgICB2My5EWzFdLCB2My5EWzBdCisgICAgICAgIGZtdWwgICAgICAgIHY0LjRTLCB2Mi40UywgdjE2LjRTCisgICAgICAgIGZtbGEgICAgICAgIHY0LjRTLCB2My40UywgdjE3LjRTCisgICAgICAgIGZhZGQgICAgICAgIHYxOC40UywgdjE4LjRTLCB2MjIuNFMKKyAgICAgICAgZmFkZCAgICAgICAgdjE5LjRTLCB2MTkuNFMsIHYyMy40UworICAgICAgICBleHQgICAgICAgICB2Mi4xNkIsIHYyLjE2QiwgdjIuMTZCLCAjNAorICAgICAgICBleHQgICAgICAgICB2My4xNkIsIHYzLjE2QiwgdjMuMTZCLCAjNAorICAgICAgICBmbWxhICAgICAgICB2NC40UywgdjIuNFMsIHYxOC40UworICAgICAgICBmbWxhICAgICAgICB2NC40UywgdjMuNFMsIHYxOS40UworICAgICAgICBzdDEgICAgICAgICB7djQuRH1bMF0sIFt4MF0sICM4CisgICAgICAgIHN0MSAgICAgICAgIHt2NC5EfVsxXSwgW3gxXSwgIzgKKyAgICAgICAgc3VicyAgICAgICAgdzQsIHc0LCAjMQorICAgICAgICBiLmd0ICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcHNfaHlicmlkX2FuYWx5c2lzX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxzbCAgICAgICAgIHgzLCB4MywgIzMKKyAgICAgICAgbGQyICAgICAgICAge3YwLjRTLHYxLjRTfSwgW3gxXSwgIzMyCisgICAgICAgIGxkMiAgICAgICAgIHt2Mi4yUyx2My4yU30sIFt4MV0sICMxNgorICAgICAgICBsZDEgICAgICAgICB7djI0LjJTfSwgICAgICBbeDFdLCAjOAorICAgICAgICBsZDIgICAgICAgICB7djQuMlMsdjUuMlN9LCBbeDFdLCAjMTYKKyAgICAgICAgbGQyICAgICAgICAge3Y2LjRTLHY3LjRTfSwgW3gxXQorICAgICAgICByZXY2NCAgICAgICB2Ni40UywgdjYuNFMKKyAgICAgICAgcmV2NjQgICAgICAgdjcuNFMsIHY3LjRTCisgICAgICAgIGV4dCAgICAgICAgIHY2LjE2QiwgdjYuMTZCLCB2Ni4xNkIsICM4CisgICAgICAgIGV4dCAgICAgICAgIHY3LjE2QiwgdjcuMTZCLCB2Ny4xNkIsICM4CisgICAgICAgIHJldjY0ICAgICAgIHY0LjJTLCB2NC4yUworICAgICAgICByZXY2NCAgICAgICB2NS4yUywgdjUuMlMKKyAgICAgICAgbW92ICAgICAgICAgdjIuRFsxXSwgdjMuRFswXQorICAgICAgICBtb3YgICAgICAgICB2NC5EWzFdLCB2NS5EWzBdCisgICAgICAgIG1vdiAgICAgICAgIHY1LkRbMV0sIHYyLkRbMF0KKyAgICAgICAgbW92ICAgICAgICAgdjMuRFsxXSwgdjQuRFswXQorICAgICAgICBmYWRkICAgICAgICB2MTYuNFMsIHYwLjRTLCB2Ni40UworICAgICAgICBmYWRkICAgICAgICB2MTcuNFMsIHYxLjRTLCB2Ny40UworICAgICAgICBmc3ViICAgICAgICB2MTguNFMsIHYxLjRTLCB2Ny40UworICAgICAgICBmc3ViICAgICAgICB2MTkuNFMsIHYwLjRTLCB2Ni40UworICAgICAgICBmYWRkICAgICAgICB2MjIuNFMsIHYyLjRTLCB2NC40UworICAgICAgICBmc3ViICAgICAgICB2MjMuNFMsIHY1LjRTLCB2My40UworICAgICAgICB0cm4xICAgICAgICB2MjAuMkQsIHYyMi4yRCwgdjIzLjJEICAgICAgLy8ge3JlNCtyZTgsIHJlNStyZTcsIGltOC1pbTQsIGltNy1pbTV9CisgICAgICAgIHRybjIgICAgICAgIHYyMS4yRCwgdjIyLjJELCB2MjMuMkQgICAgICAvLyB7aW00K2ltOCwgaW01K2ltNywgcmU0LXJlOCwgcmU1LXJlN30KKzE6ICAgICAgbGQyICAgICAgICAge3YyLjRTLHYzLjRTfSwgW3gyXSwgIzMyCisgICAgICAgIGxkMiAgICAgICAgIHt2NC4yUyx2NS4yU30sIFt4Ml0sICMxNgorICAgICAgICBsZDEgICAgICAgICB7djYuMlN9LCAgICAgICBbeDJdLCAjOAorICAgICAgICBhZGQgICAgICAgICB4MiwgeDIsICM4CisgICAgICAgIG1vdiAgICAgICAgIHY0LkRbMV0sIHY1LkRbMF0KKyAgICAgICAgbW92ICAgICAgICAgdjYuU1sxXSwgdjYuU1swXQorICAgICAgICBmbXVsICAgICAgICB2Ni4yUywgdjYuMlMsIHYyNC4yUworICAgICAgICBmbXVsICAgICAgICB2MC40UywgdjIuNFMsIHYxNi40UworICAgICAgICBmbXVsICAgICAgICB2MS40UywgdjIuNFMsIHYxNy40UworICAgICAgICBmbWxzICAgICAgICB2MC40UywgdjMuNFMsIHYxOC40UworICAgICAgICBmbWxhICAgICAgICB2MS40UywgdjMuNFMsIHYxOS40UworICAgICAgICBmbWxhICAgICAgICB2MC40UywgdjQuNFMsIHYyMC40UworICAgICAgICBmbWxhICAgICAgICB2MS40UywgdjQuNFMsIHYyMS40UworICAgICAgICBmYWRkcCAgICAgICB2MC40UywgdjAuNFMsIHYxLjRTCisgICAgICAgIGZhZGRwICAgICAgIHYwLjRTLCB2MC40UywgdjAuNFMKKyAgICAgICAgZmFkZCAgICAgICAgdjAuMlMsIHYwLjJTLCB2Ni4yUworICAgICAgICBzdDEgICAgICAgICB7djAuMlN9LCBbeDBdLCB4MworICAgICAgICBzdWJzICAgICAgICB3NCwgdzQsICMxCisgICAgICAgIGIuZ3QgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L2ZmdF9pbml0X2FhcmNoNjQuYyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9mZnRfaW5pdF9hYXJjaDY0LmMKaW5kZXggODUxNGQzYi4uZGIyODUyMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYXJjaDY0L2ZmdF9pbml0X2FhcmNoNjQuYworKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvZmZ0X2luaXRfYWFyY2g2NC5jCkBAIC0yMCw3ICsyMCwxMCBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9jcHUuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvZmZ0LmgiCiAKIHZvaWQgZmZfZmZ0X3Blcm11dGVfbmVvbihGRlRDb250ZXh0ICpzLCBGRlRDb21wbGV4ICp6KTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0Y2hyb21hX2luaXRfYWFyY2g2NC5jIGIvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRjaHJvbWFfaW5pdF9hYXJjaDY0LmMKaW5kZXggMmFmNjJiZS4uZmE2ZTBlYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRjaHJvbWFfaW5pdF9hYXJjaDY0LmMKKysrIGIvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRjaHJvbWFfaW5pdF9hYXJjaDY0LmMKQEAgLTI4LDE4ICsyOCwxOCBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLXZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKLXZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKLXZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jMl9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWMyX25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKIAotdm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwotdm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwotdm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWMyX25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzJfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwogCiBhdl9jb2xkIHZvaWQgZmZfaDI2NGNocm9tYV9pbml0X2FhcmNoNjQoSDI2NENocm9tYUNvbnRleHQgKmMsIGludCBiaXRfZGVwdGgpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NGNtY19uZW9uLlMgYi9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NGNtY19uZW9uLlMKaW5kZXggNDg2MDc5Zi4uOGJlNzU3OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRjbWNfbmVvbi5TCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0Y21jX25lb24uUwpAQCAtMjEsMTAgKzIxLDkgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIgogCi0vKiBjaHJvbWFfbWM4KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KSAqLworLyogY2hyb21hX21jOCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkgKi8KIC5tYWNybyAgaDI2NF9jaHJvbWFfbWM4IHR5cGUsIGNvZGVjPWgyNjQKIGZ1bmN0aW9uIGZmX1x0eXBlXCgpX1xjb2RlY1woKV9jaHJvbWFfbWM4X25lb24sIGV4cG9ydD0xCi0gICAgICAgIHN4dHcgICAgICAgICAgICB4MiwgIHcyCiAgIC5pZmMgXHR5cGUsYXZnCiAgICAgICAgIG1vdiAgICAgICAgICAgICB4OCwgIHgwCiAgIC5lbmRpZgpAQCAtMTkyLDEwICsxOTEsOSBAQAogZW5kZnVuYwogLmVuZG0KIAotLyogY2hyb21hX21jNCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkgKi8KKy8qIGNocm9tYV9tYzQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpICovCiAubWFjcm8gIGgyNjRfY2hyb21hX21jNCB0eXBlLCBjb2RlYz1oMjY0CiBmdW5jdGlvbiBmZl9cdHlwZVwoKV9cY29kZWNcKClfY2hyb21hX21jNF9uZW9uLCBleHBvcnQ9MQotICAgICAgICBzeHR3ICAgICAgICAgICAgeDIsICB3MgogICAuaWZjIFx0eXBlLGF2ZwogICAgICAgICBtb3YgICAgICAgICAgICAgeDgsICB4MAogICAuZW5kaWYKQEAgLTM1OSw3ICszNTcsNiBAQAogCiAubWFjcm8gIGgyNjRfY2hyb21hX21jMiB0eXBlCiBmdW5jdGlvbiBmZl9cdHlwZVwoKV9oMjY0X2Nocm9tYV9tYzJfbmVvbiwgZXhwb3J0PTEKLSAgICAgICAgc3h0dyAgICAgICAgICAgIHgyLCAgdzIKICAgICAgICAgcHJmbSAgICAgICAgICAgIHBsZGwxc3RybSwgW3gxXQogICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFzdHJtLCBbeDEsIHgyXQogICAgICAgICBvcnIgICAgICAgICAgICAgdzcsICB3NCwgIHc1CkBAIC00NDUsNyArNDQyLDcgQEAKICAgICAgICAgaDI2NF9jaHJvbWFfbWM0IGF2ZywgcnY0MAogI2VuZGlmCiAKLSNpZiBDT05GSUdfVkMxX0RFQ09ERVIKKyNpZiBDT05GSUdfVkMxRFNQCiAgICAgICAgIGgyNjRfY2hyb21hX21jOCBwdXQsIHZjMQogICAgICAgICBoMjY0X2Nocm9tYV9tYzggYXZnLCB2YzEKICAgICAgICAgaDI2NF9jaHJvbWFfbWM0IHB1dCwgdmMxCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NGlkY3RfbmVvbi5TIGIvbGliYXZjb2RlYy9hYXJjaDY0L2gyNjRpZGN0X25lb24uUwppbmRleCA5MWYxZTc3Li44MjVlYzQ5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhcmNoNjQvaDI2NGlkY3RfbmVvbi5TCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9oMjY0aWRjdF9uZW9uLlMKQEAgLTMzLDI1ICszMywyNSBAQAogICAgICAgICBzc2hyICAgICAgICAgICAgdjE3LjRILCB2My40SCwgICMxCiAgICAgICAgIHN0MSAgICAgICAgICAgICB7djMwLjhIfSwgICAgW3gxXSwgIzE2CiAgICAgICAgIHN1YiAgICAgICAgICAgICB2NS40SCwgIHYwLjRILCAgdjIuNEgKLSAgICAgICAgYWRkICAgICAgICAgICAgIHY2LjRILCAgdjEuNEgsICB2MTcuNEgKLSAgICAgICAgc3ViICAgICAgICAgICAgIHY3LjRILCAgdjE2LjRILCB2My40SAotICAgICAgICBhZGQgICAgICAgICAgICAgdjAuNEgsICB2NC40SCwgIHY2LjRICi0gICAgICAgIGFkZCAgICAgICAgICAgICB2MS40SCwgIHY1LjRILCAgdjcuNEgKLSAgICAgICAgc3ViICAgICAgICAgICAgIHYzLjRILCAgdjQuNEgsICB2Ni40SAotICAgICAgICBzdWIgICAgICAgICAgICAgdjIuNEgsICB2NS40SCwgIHY3LjRICisgICAgICAgIHN1YiAgICAgICAgICAgICB2Ni40SCwgIHYxNi40SCwgdjMuNEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY3LjRILCAgdjEuNEgsICB2MTcuNEgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjRILCAgdjQuNEgsICB2Ny40SAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEuNEgsICB2NS40SCwgIHY2LjRICisgICAgICAgIHN1YiAgICAgICAgICAgICB2Mi40SCwgIHY1LjRILCAgdjYuNEgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYzLjRILCAgdjQuNEgsICB2Ny40SAogCiAgICAgICAgIHRyYW5zcG9zZV80eDRIICB2MCwgdjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcKIAotICAgICAgICBhZGQgICAgICAgICAgICAgdjQuNEgsICB2MC40SCwgIHYzLjRICisgICAgICAgIGFkZCAgICAgICAgICAgICB2NC40SCwgIHYwLjRILCAgdjIuNEgKICAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguU31bMF0sIFt4MF0sIHgyCi0gICAgICAgIHNzaHIgICAgICAgICAgICB2MTYuNEgsICB2Mi40SCwgICMxCisgICAgICAgIHNzaHIgICAgICAgICAgICB2MTYuNEgsICB2My40SCwgICMxCiAgICAgICAgIHNzaHIgICAgICAgICAgICB2MTcuNEgsICB2MS40SCwgICMxCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LlN9WzFdLCBbeDBdLCB4MgotICAgICAgICBzdWIgICAgICAgICAgICAgdjUuNEgsICB2MC40SCwgIHYzLjRICiAgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LlN9WzFdLCBbeDBdLCB4MgorICAgICAgICBzdWIgICAgICAgICAgICAgdjUuNEgsICB2MC40SCwgIHYyLjRICisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LlN9WzFdLCBbeDBdLCB4MgogICAgICAgICBhZGQgICAgICAgICAgICAgdjYuNEgsICB2MTYuNEgsIHYxLjRICiAgICAgICAgIGlucyAgICAgICAgICAgICB2NC5EWzFdLCAgdjUuRFswXQotICAgICAgICBzdWIgICAgICAgICAgICAgdjcuNEgsICB2Mi40SCwgIHYxNy40SAorICAgICAgICBzdWIgICAgICAgICAgICAgdjcuNEgsICB2MTcuNEgsIHYzLjRICiAgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LlN9WzBdLCBbeDBdLCB4MgogICAgICAgICBpbnMgICAgICAgICAgICAgdjYuRFsxXSwgIHY3LkRbMF0KICAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MiwgbHNsICMyCkBAIC02OCw4ICs2OCw4IEBACiAgICAgICAgIHNxeHR1biAgICAgICAgICB2MS44QiwgdjEuOEgKIAogICAgICAgICBzdDEgICAgICAgICAgICAge3YwLlN9WzBdLCAgW3gwXSwgeDIKLSAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5TfVsxXSwgIFt4MF0sIHgyCiAgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuU31bMV0sICBbeDBdLCB4MgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLlN9WzFdLCAgW3gwXSwgeDIKICAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5TfVswXSwgIFt4MF0sIHgyCiAKICAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICAjMzIKQEAgLTE2Miw3ICsxNjIsNyBAQAogICAgICAgICBtb3YgICAgICAgICAgICAgdzE5LCB3MyAgICAgICAgICAgICAgICAgLy8gc3RyaWRlCiAgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTMsIFgoZmZfaDI2NF9pZGN0X2RjX2FkZF9uZW9uKQogICAgICAgICBtb3ZyZWwgICAgICAgICAgeDE0LCBYKGZmX2gyNjRfaWRjdF9hZGRfbmVvbikKLSAgICAgICAgbW92cmVsICAgICAgICAgIHg3LCAgc2NhbjgrMTYKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg3LCAgc2NhbjgsIDE2CiAgICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsICMwCiAgICAgICAgIG1vdiAgICAgICAgICAgICB4MTEsICMxNgogMTogICAgICBtb3YgICAgICAgICAgICAgdzIsICB3MTkKQEAgLTI2NCw2ICsyNjQsNyBAQAogCiBmdW5jdGlvbiBmZl9oMjY0X2lkY3Q4X2FkZF9uZW9uLCBleHBvcnQ9MQogICAgICAgICBtb3ZpICAgICAgICAgICAgdjE5LjhILCAgICMwCisgICAgICAgIHN4dHcgICAgICAgICAgICB4MiwgICAgICAgdzIKICAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOEgsIHYyNS44SH0sIFt4MV0KICAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEh9LCAgW3gxXSwgICAjMTYKICAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuOEh9LCAgW3gxXSwgICAjMTYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC9pZGN0LmggYi9saWJhdmNvZGVjL2FhcmNoNjQvaWRjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDkwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvaWRjdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FBUkNINjRfSURDVF9ICisjZGVmaW5lIEFWQ09ERUNfQUFSQ0g2NF9JRENUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIGZmX3NpbXBsZV9pZGN0X25lb24oaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9uZW9uKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfbmVvbih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUFSQ0g2NF9JRENUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC9pZGN0ZHNwX2luaXRfYWFyY2g2NC5jIGIvbGliYXZjb2RlYy9hYXJjaDY0L2lkY3Rkc3BfaW5pdF9hYXJjaDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwNmU2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9pZGN0ZHNwX2luaXRfYWFyY2g2NC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBBUk0tTkVPTi1vcHRpbWl6ZWQgSURDVCBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwOCBNYW5zIFJ1bGxnYXJkIDxtYW5zQG1hbnNyLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNyBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbkBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaWRjdGRzcC5oIgorI2luY2x1ZGUgImlkY3QuaCIKKworYXZfY29sZCB2b2lkIGZmX2lkY3Rkc3BfaW5pdF9hYXJjaDY0KElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCit7CisgICAgaWYgKCFhdmN0eC0+bG93cmVzICYmICFoaWdoX2JpdF9kZXB0aCkgeworICAgICAgICBpZiAoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8gfHwKKyAgICAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9TSU1QTEVBVVRPIHx8CisgICAgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFTkVPTikgeworICAgICAgICAgICAgYy0+aWRjdF9wdXQgID0gZmZfc2ltcGxlX2lkY3RfcHV0X25lb247CisgICAgICAgICAgICBjLT5pZGN0X2FkZCAgPSBmZl9zaW1wbGVfaWRjdF9hZGRfbmVvbjsKKyAgICAgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX3NpbXBsZV9pZGN0X25lb247CisgICAgICAgICAgICBjLT5wZXJtX3R5cGUgPSBGRl9JRENUX1BFUk1fUEFSVFRSQU5TOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L2ltZGN0MTVfaW5pdC5jIGIvbGliYXZjb2RlYy9hYXJjaDY0L2ltZGN0MTVfaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGFmOWYwLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvYWFyY2g2NC9pbWRjdDE1X2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSAibGliYXZjb2RlYy9pbWRjdDE1LmgiCi0KLSNpbmNsdWRlICJhc20tb2Zmc2V0cy5oIgotCi1BVl9DSEVDS19PRkZTRVQoSU1EQ1QxNUNvbnRleHQsIGV4cHRhYiwgICAgICAgICBDRUxUX0VYUFRBQik7Ci1BVl9DSEVDS19PRkZTRVQoSU1EQ1QxNUNvbnRleHQsIGZmdF9uLCAgICAgICAgICBDRUxUX0ZGVF9OKTsKLUFWX0NIRUNLX09GRlNFVChJTURDVDE1Q29udGV4dCwgbGVuMiwgICAgICAgICAgIENFTFRfTEVOMik7Ci1BVl9DSEVDS19PRkZTRVQoSU1EQ1QxNUNvbnRleHQsIGxlbjQsICAgICAgICAgICBDRUxUX0xFTjQpOwotQVZfQ0hFQ0tfT0ZGU0VUKElNRENUMTVDb250ZXh0LCB0bXAsICAgICAgICAgICAgQ0VMVF9UTVApOwotQVZfQ0hFQ0tfT0ZGU0VUKElNRENUMTVDb250ZXh0LCB0d2lkZGxlX2V4cHRhYiwgQ0VMVF9UV0lERExFKTsKLQotdm9pZCBmZl9jZWx0X2ltZGN0X2hhbGZfbmVvbihJTURDVDE1Q29udGV4dCAqcywgZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgZmxvYXQgc2NhbGUpOwotCi12b2lkIGZmX2ltZGN0MTVfaW5pdF9hYXJjaDY0KElNRENUMTVDb250ZXh0ICpzKQotewotICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7Ci0KLSAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKLSAgICAgICAgcy0+aW1kY3RfaGFsZiA9IGZmX2NlbHRfaW1kY3RfaGFsZl9uZW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC9pbWRjdDE1X25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9pbWRjdDE1X25lb24uUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdlMTQ0Mi4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2FhcmNoNjQvaW1kY3QxNV9uZW9uLlMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNCBKYW5uZSBHcnVuYXUgPGphbm5lLWxpYmF2QGphbm5hdS5uZXQ+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKLQotI2luY2x1ZGUgImFzbS1vZmZzZXRzLmgiCi0KLS5tYWNybyBzaHVmZmxlIGEsIGIsIGMsIGQKLWNvbnN0IHNodWZmbGVfXGFcYlxjXGQsIGFsaWduPTQKLSAgICAgICAgLmJ5dGUgKFxhICogNCksIChcYSAqIDQgKyAxKSwgKFxhICogNCArIDIpLCAoXGEgKiA0ICsgMykKLSAgICAgICAgLmJ5dGUgKFxiICogNCksIChcYiAqIDQgKyAxKSwgKFxiICogNCArIDIpLCAoXGIgKiA0ICsgMykKLSAgICAgICAgLmJ5dGUgKFxjICogNCksIChcYyAqIDQgKyAxKSwgKFxjICogNCArIDIpLCAoXGMgKiA0ICsgMykKLSAgICAgICAgLmJ5dGUgKFxkICogNCksIChcZCAqIDQgKyAxKSwgKFxkICogNCArIDIpLCAoXGQgKiA0ICsgMykKLWVuZGNvbnN0Ci0uZW5kbQotCi1zaHVmZmxlIDAsIDIsIDEsIDMKLXNodWZmbGUgMSwgMCwgMywgMgotc2h1ZmZsZSAyLCAzLCAwLCAxCi1zaHVmZmxlIDMsIDEsIDIsIDAKLQotCi1mdW5jdGlvbiBmZnQ1X25lb24KLSAgICAgICAgbHNsICAgICAgICAgICAgIHgyLCAgeDIsICAjMwotICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC4yc30sICAgICAgICAgW3gxXSwgIHgyCi0gICAgICAgIGxkMiAgICAgICAgICAgICB7djI1LnMsdjI2LnN9WzBdLCBbeDFdLCAgeDIKLSAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjUucyx2MjYuc31bMV0sIFt4MV0sICB4MgotICAgICAgICBsZDIgICAgICAgICAgICAge3YyNS5zLHYyNi5zfVsyXSwgW3gxXSwgIHgyCi0gICAgICAgIGxkMiAgICAgICAgICAgICB7djI1LnMsdjI2LnN9WzNdLCBbeDFdCi0gICAgICAgIGR1cCAgICAgICAgICAgICB2Ni40cywgIHYyNC5zWzBdCi0gICAgICAgIGR1cCAgICAgICAgICAgICB2Ny40cywgIHYyNC5zWzFdCi0KLSAgICAgICAgZmFkZHAgICAgICAgICAgIHYwLjRzLCAgdjI1LjRzLCB2MjYuNHMKLSAgICAgICAgLy8geltdWzBdLCB6W11bM10KLSAgICAgICAgZm11bCAgICAgICAgICAgIHYxNi40cywgdjI1LjRzLCB2MTUuc1swXSAvLyBycgotICAgICAgICBmbXVsICAgICAgICAgICAgdjE3LjRzLCB2MjUuNHMsIHYxNS5zWzFdIC8vIHJpCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MTguNHMsIHYyNi40cywgdjE1LnNbMF0gLy8gaXIKLSAgICAgICAgZm11bCAgICAgICAgICAgIHYxOS40cywgdjI2LjRzLCB2MTUuc1sxXSAvLyBpaQotICAgICAgICBmYWRkcCAgICAgICAgICAgdjAuNHMsICB2MC40cywgIHYwLjRzCi0gICAgICAgIC8vIHpbXVsxXSwgeltdWzJdCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MjAuNHMsIHYyNS40cywgdjE1LnNbMl0gLy8gcnIKLSAgICAgICAgZm11bCAgICAgICAgICAgIHYyMS40cywgdjI1LjRzLCB2MTUuc1szXSAvLyByaQotICAgICAgICBmbXVsICAgICAgICAgICAgdjIyLjRzLCB2MjYuNHMsIHYxNS5zWzJdIC8vIGlyCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MjMuNHMsIHYyNi40cywgdjE1LnNbM10gLy8gaWkKLSAgICAgICAgZmFkZCAgICAgICAgICAgIHYwLjJzLCAgdjI0LjJzLCB2MC4ycyAgIC8vIG91dFswXQotCi0gICAgICAgIC8vIHpbMDEyM11bMF0sIHpbMDEyM11bM10KLSAgICAgICAgZnN1YiAgICAgICAgICAgIHYyNC40cywgdjE2LjRzLCB2MTkuNHMgIC8vICAgIChjKS5yZSA9ICByciAtIGlpOwotICAgICAgICBmYWRkICAgICAgICAgICAgdjI3LjRzLCB2MTYuNHMsIHYxOS40cyAgLy8gICAgKGQpLnJlID0gIHJyICsgaWk7Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjE2Yn0sICBbeDExXQotICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS4xNmJ9LCAgW3gxNF0KLSAgICAgICAgZmFkZCAgICAgICAgICAgIHYyOC40cywgdjE3LjRzLCB2MTguNHMgIC8vICAgIChjKS5pbSA9ICByaSArIGlyOwotICAgICAgICBmc3ViICAgICAgICAgICAgdjMxLjRzLCB2MTguNHMsIHYxNy40cyAgLy8gICAgKGQpLmltID0gLXJpICsgaXI7Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djE3LjE2Yn0sICBbeDEyXQotICAgICAgICAvLyB6WzAxMjNdWzFdLCB6WzAxMjNdWzJdCi0gICAgICAgIGZzdWIgICAgICAgICAgICB2MjUuNHMsIHYyMC40cywgdjIzLjRzICAvLyAgICAoYykucmUgPSAgcnIgLSBpaTsKLSAgICAgICAgZmFkZCAgICAgICAgICAgIHYyNi40cywgdjIwLjRzLCB2MjMuNHMgIC8vICAgIChkKS5yZSA9ICByciArIGlpOwotICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC4xNmJ9LCAgW3gxM10KLSAgICAgICAgZmFkZCAgICAgICAgICAgIHYyOS40cywgdjIxLjRzLCB2MjIuNHMgIC8vICAgIChjKS5pbSA9ICByaSArIGlyOwotICAgICAgICBmc3ViICAgICAgICAgICAgdjMwLjRzLCB2MjIuNHMsIHYyMS40cyAgLy8gICAgKGQpLmltID0gLXJpICsgaXI7Ci0KLSAgICAgICAgLy9yZWFsCi0gICAgICAgIHRibCAgICAgICAgICAgICB2MjAuMTZiLCB7djI0LjE2Yn0sIHYxNi4xNmIKLSAgICAgICAgdGJsICAgICAgICAgICAgIHYyMS4xNmIsIHt2MjUuMTZifSwgdjE3LjE2YgotICAgICAgICB0YmwgICAgICAgICAgICAgdjIyLjE2Yiwge3YyNi4xNmJ9LCB2MTguMTZiCi0gICAgICAgIHRibCAgICAgICAgICAgICB2MjMuMTZiLCB7djI3LjE2Yn0sIHYxOS4xNmIKLSAgICAgICAgLy9pbWFnCi0gICAgICAgIHRibCAgICAgICAgICAgICB2MTYuMTZiLCB7djI4LjE2Yn0sIHYxNi4xNmIKLSAgICAgICAgdGJsICAgICAgICAgICAgIHYxNy4xNmIsIHt2MjkuMTZifSwgdjE3LjE2YgotICAgICAgICB0YmwgICAgICAgICAgICAgdjE4LjE2Yiwge3YzMC4xNmJ9LCB2MTguMTZiCi0gICAgICAgIHRibCAgICAgICAgICAgICB2MTkuMTZiLCB7djMxLjE2Yn0sIHYxOS4xNmIKLQotICAgICAgICBmYWRkICAgICAgICAgICAgdjYuNHMsICB2Ni40cywgIHYyMC40cwotICAgICAgICBmYWRkICAgICAgICAgICAgdjIyLjRzLCB2MjIuNHMsIHYyMy40cwotICAgICAgICBmYWRkICAgICAgICAgICAgdjcuNHMsICB2Ny40cywgIHYxNi40cwotICAgICAgICBmYWRkICAgICAgICAgICAgdjE4LjRzLCB2MTguNHMsIHYxOS40cwotCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2MjEuNHMsIHYyMS40cywgdjIyLjRzCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2MTcuNHMsIHYxNy40cywgdjE4LjRzCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2Ni40cywgIHY2LjRzLCAgdjIxLjRzCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2Ny40cywgIHY3LjRzLCAgdjE3LjRzCi0KLSAgICAgICAgcmV0Ci1lbmRmdW5jCi0KLWZ1bmN0aW9uIGZmdDE1X25lb24KLSAgICAgICAgbW92ICAgICAgICAgICAgIHg4LCAgeDEKLSAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDMwCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHgzLCAgeDMsICBsc2wgIzEgICAvLyAzICogc3RyaWRlCi0KLSAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDgsICB4MywgIGxzbCAjMyAgIC8vIGluICsgMSAqIHN0cmlkZQotICAgICAgICBibCAgICAgICAgICAgICAgZmZ0NV9uZW9uCi0gICAgICAgIG1vdiAgICAgICAgICAgICB2MS44YiwgICB2MC44YgotICAgICAgICBtb3YgICAgICAgICAgICAgdjIuMTZiLCAgdjYuMTZiCi0gICAgICAgIG1vdiAgICAgICAgICAgICB2My4xNmIsICB2Ny4xNmIKLQotICAgICAgICBhZGQgICAgICAgICAgICAgeDEsICB4OCwgIHgzLCAgbHNsICM0ICAgLy8gaW4gKyAyICogc3RyaWRlCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHgzLCAgeDMsICBsc2wgIzEgICAvLyAzICogc3RyaWRlCi0gICAgICAgIGJsICAgICAgICAgICAgICBmZnQ1X25lb24KLSAgICAgICAgemlwMSAgICAgICAgICAgIHYxLjRzLCAgIHYxLjRzLCAgdjAuNHMKLSAgICAgICAgbW92ICAgICAgICAgICAgIHY0LjE2YiwgIHY2LjE2YgotICAgICAgICBtb3YgICAgICAgICAgICAgdjUuMTZiLCAgdjcuMTZiCi0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHgxLCAgeDggICAgICAgICAgICAgICAgIC8vIGluICsgMCAqIHN0cmlkZQotICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MywgIHgzLCAgbHNsICMxICAgLy8gMyAqIHN0cmlkZQotICAgICAgICBibCAgICAgICAgICAgICAgZmZ0NV9uZW9uCi0KLSAgICAgICAgZmFkZHAgICAgICAgICAgIHYyMC40cywgdjEuNHMsICB2MS40cwotCi0gICAgICAgIGV4dCAgICAgICAgICAgICB2MTguMTZiLCB2OC4xNmIsICB2OC4xNmIsICAjNAotICAgICAgICBleHQgICAgICAgICAgICAgdjE5LjE2YiwgdjkuMTZiLCAgdjkuMTZiLCAgIzQKLSAgICAgICAgbW92ICAgICAgICAgICAgIHYxNi4xNmIsIHY2LjE2YgotICAgICAgICBtb3YgICAgICAgICAgICAgdjE3LjE2YiwgdjcuMTZiCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2MjAuMnMsIHYyMC4ycywgdjAuMnMKLQotICAgICAgICB1enAxICAgICAgICAgICAgdjE4LjRzLCB2MTguNHMsIHYxMC40cyAgLy8gZXhwWzIsNCw2LDhdLnJlCi0gICAgICAgIHV6cDEgICAgICAgICAgICB2MTkuNHMsIHYxOS40cywgdjExLjRzICAvLyBleHBbMiw0LDYsOF0uaW0KLQotICAgICAgICBzdDEgICAgICAgICAgICAge3YyMC4yc30sICBbeDBdLCAjOCAgICAgLy8gb3V0WzBdCi0KLSAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNi40cywgdjIuNHMsICB2OC40cwotICAgICAgICBmbWxzICAgICAgICAgICAgdjE2LjRzLCB2My40cywgIHY5LjRzCi0KLSAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40cywgdjIuNHMsICB2OS40cwotICAgICAgICBmbWxhICAgICAgICAgICAgdjE3LjRzLCB2My40cywgIHY4LjRzCi0KLSAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNi40cywgdjQuNHMsICB2MTguNHMKLSAgICAgICAgZm1scyAgICAgICAgICAgIHYxNi40cywgdjUuNHMsICB2MTkuNHMKLQotICAgICAgICBmbWxhICAgICAgICAgICAgdjE3LjRzLCB2NC40cywgIHYxOS40cwotICAgICAgICBmbWxhICAgICAgICAgICAgdjE3LjRzLCB2NS40cywgIHYxOC40cwotCi0gICAgICAgIHppcDEgICAgICAgICAgICB2MTguNHMsIHYxNi40cywgdjE3LjRzCi0gICAgICAgIHppcDIgICAgICAgICAgICB2MTkuNHMsIHYxNi40cywgdjE3LjRzCi0KLSAgICAgICAgcmV2NjQgICAgICAgICAgIHYzMS40cywgdjE0LjRzCi0gICAgICAgIHRybjEgICAgICAgICAgICB2MjguMmQsIHYxLjJkLCAgdjEuMmQKLSAgICAgICAgdHJuMiAgICAgICAgICAgIHYyOS4yZCwgdjEuMmQsICB2MS4yZAotICAgICAgICB6aXAxICAgICAgICAgICAgdjMwLjJkLCB2MTQuMmQsIHYzMS4yZAotICAgICAgICB6aXAyICAgICAgICAgICAgdjMxLjJkLCB2MTQuMmQsIHYzMS4yZAotCi0gICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LjRzLHYxOS40c30sICBbeDBdLCAjMzIgLy8gb3V0WzEtNF0KLQotICAgICAgICBmbXVsICAgICAgICAgICAgdjE2LjRzLCB2MjguNHMsIHYzMC40cwotICAgICAgICBmbXVsICAgICAgICAgICAgdjE3LjRzLCB2MjkuNHMsIHYzMC40cwotICAgICAgICBmbWxzICAgICAgICAgICAgdjE2LjRzLCB2MjkuNHMsIHYzMS40cwotICAgICAgICBmbWxhICAgICAgICAgICAgdjE3LjRzLCB2MjguNHMsIHYzMS40cwotICAgICAgICBmYWRkcCAgICAgICAgICAgdjE2LjRzLCB2MTYuNHMsIHYxNi40cwotICAgICAgICBmYWRkcCAgICAgICAgICAgdjE3LjRzLCB2MTcuNHMsIHYxNy40cwotICAgICAgICB6aXAxICAgICAgICAgICAgdjE4LjJzLCB2MTYuMnMsIHYxNy4ycwotICAgICAgICB6aXAyICAgICAgICAgICAgdjE5LjJzLCB2MTYuMnMsIHYxNy4ycwotCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2MTguMnMsIHYxOC4ycywgdjAuMnMKLSAgICAgICAgZmFkZCAgICAgICAgICAgIHYwLjJzLCAgdjE5LjJzLCB2MC4ycwotCi0gICAgICAgIGV4dCAgICAgICAgICAgICB2MzAuMTZiLCB2MTIuMTZiLCB2MTIuMTZiLCAjNAotICAgICAgICBleHQgICAgICAgICAgICAgdjMxLjE2YiwgdjEzLjE2YiwgdjEzLjE2YiwgIzQKLSAgICAgICAgbW92ICAgICAgICAgICAgIHYxNi4xNmIsIHY2LjE2YgotICAgICAgICBtb3YgICAgICAgICAgICAgdjE3LjE2YiwgdjcuMTZiCi0KLSAgICAgICAgdXpwMSAgICAgICAgICAgIHYzMC40cywgdjMwLjRzLCB2OC40cwotICAgICAgICB1enAxICAgICAgICAgICAgdjMxLjRzLCB2MzEuNHMsIHY5LjRzCi0KLSAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguMnN9LCAgW3gwXSwgIzggICAgIC8vIG91dFs1XQotCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2MTYuNHMsIHYyLjRzLCAgdjEwLjRzCi0gICAgICAgIGZtbHMgICAgICAgICAgICB2MTYuNHMsIHYzLjRzLCAgdjExLjRzCi0KLSAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40cywgdjIuNHMsICB2MTEuNHMKLSAgICAgICAgZm1sYSAgICAgICAgICAgIHYxNy40cywgdjMuNHMsICB2MTAuNHMKLQotICAgICAgICBmbWxhICAgICAgICAgICAgdjE2LjRzLCB2NC40cywgIHYzMC40cwotICAgICAgICBmbWxzICAgICAgICAgICAgdjE2LjRzLCB2NS40cywgIHYzMS40cwotCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2MTcuNHMsIHY0LjRzLCAgdjMxLjRzCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2MTcuNHMsIHY1LjRzLCAgdjMwLjRzCi0KLSAgICAgICAgemlwMSAgICAgICAgICAgIHYxOC40cywgdjE2LjRzLCB2MTcuNHMKLSAgICAgICAgemlwMiAgICAgICAgICAgIHYxOS40cywgdjE2LjRzLCB2MTcuNHMKLQotICAgICAgICBleHQgICAgICAgICAgICAgdjMwLjE2YiwgdjEwLjE2YiwgdjEwLjE2YiwgIzQKLSAgICAgICAgZXh0ICAgICAgICAgICAgIHYzMS4xNmIsIHYxMS4xNmIsIHYxMS4xNmIsICM0Ci0KLSAgICAgICAgZm1sYSAgICAgICAgICAgIHY2LjRzLCAgdjIuNHMsICB2MTIuNHMKLSAgICAgICAgZm1scyAgICAgICAgICAgIHY2LjRzLCAgdjMuNHMsICB2MTMuNHMKLQotICAgICAgICBzdDEgICAgICAgICAgICAge3YxOC40cyx2MTkuNHN9LCAgW3gwXSwgIzMyIC8vIG91dFs2LTldCi0KLSAgICAgICAgdXpwMSAgICAgICAgICAgIHYzMC40cywgdjMwLjRzLCB2MTIuNHMKLSAgICAgICAgdXpwMSAgICAgICAgICAgIHYzMS40cywgdjMxLjRzLCB2MTMuNHMKLQotICAgICAgICBmbWxhICAgICAgICAgICAgdjcuNHMsICB2Mi40cywgIHYxMy40cwotICAgICAgICBmbWxhICAgICAgICAgICAgdjcuNHMsICB2My40cywgIHYxMi40cwotCi0gICAgICAgIHN0MSAgICAgICAgICAgICB7djAuMnN9LCAgW3gwXSwgIzggICAgIC8vIG91dFsxMF0KLQotICAgICAgICBmbWxhICAgICAgICAgICAgdjYuNHMsICB2NC40cywgIHYzMC40cwotICAgICAgICBmbWxzICAgICAgICAgICAgdjYuNHMsICB2NS40cywgIHYzMS40cwotCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2Ny40cywgIHY0LjRzLCAgdjMxLjRzCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2Ny40cywgIHY1LjRzLCAgdjMwLjRzCi0KLSAgICAgICAgemlwMSAgICAgICAgICAgIHYxOC40cywgdjYuNHMsICB2Ny40cwotICAgICAgICB6aXAyICAgICAgICAgICAgdjE5LjRzLCB2Ni40cywgIHY3LjRzCi0KLSAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTguNHMsdjE5LjRzfSwgIFt4MF0sICMzMiAvLyBvdXRbMTEtMTRdCi0KLSAgICAgICAgcmV0ICAgICAgICAgICAgIHg5Ci1lbmRmdW5jCi0KLS8vIHgwOiBvdXQsIHgxOiBvdXQrbGVuMiwgeDI6IGV4cHRhYiwgeDM6IGxlbjIKLWZ1bmN0aW9uIGZmdDE1X3Bhc3MKLSAgICAgICAgYW5kcyAgICAgICAgICAgIHg2LCAgeDMsICAjMwotICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICB4MAotICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICB4MQotICAgICAgICBiLmVxICAgICAgICAgICAgOWYKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC4yc30sICBbeDBdLCAjOAotICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjJzfSwgIFt4MV0sICM4Ci0gICAgICAgIHN1YiAgICAgICAgICAgICB4MywgIHgzLCAgeDYKLSAgICAgICAgc3VicyAgICAgICAgICAgIHg2LCAgeDYsICAjMQotICAgICAgICBmYWRkICAgICAgICAgICAgdjIuMnMsICB2MC4ycywgIHYxLjJzCi0gICAgICAgIGZzdWIgICAgICAgICAgICB2My4ycywgIHYwLjJzLCAgdjEuMnMKLSAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDIsICAjOAotICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjJzfSwgIFt4NF0sICM4Ci0gICAgICAgIHN0MSAgICAgICAgICAgICB7djMuMnN9LCAgW3g1XSwgIzgKLSAgICAgICAgYi5lcSAgICAgICAgICAgIDlmCi0xOgotICAgICAgICBzdWJzICAgICAgICAgICAgeDYsICB4NiwgICMxCi0gICAgICAgIGxkcCAgICAgICAgICAgICBzNCwgIHM1LCAgW3gyXSwgIzgKLSAgICAgICAgbGRwICAgICAgICAgICAgIHMyLCAgczMsICBbeDFdLCAjOAotICAgICAgICBsZHAgICAgICAgICAgICAgczAsICBzMSwgIFt4MF0sICM4Ci0KLSAgICAgICAgZm11bCAgICAgICAgICAgIHM2LCAgczIsICBzNAotICAgICAgICBmbXVsICAgICAgICAgICAgczcsICBzMiwgIHM1Ci0gICAgICAgIGZtbHMgICAgICAgICAgICBzNiwgIHMzLCAgdjUuc1swXQotICAgICAgICBmbWxhICAgICAgICAgICAgczcsICBzMywgIHY0LnNbMF0KLQotICAgICAgICBmc3ViICAgICAgICAgICAgczIsICBzMCwgIHM2Ci0gICAgICAgIGZzdWIgICAgICAgICAgICBzMywgIHMxLCAgczcKLSAgICAgICAgZmFkZCAgICAgICAgICAgIHMwLCAgczAsICBzNgotICAgICAgICBmYWRkICAgICAgICAgICAgczEsICBzMSwgIHM3Ci0KLSAgICAgICAgc3RwICAgICAgICAgICAgIHMyLCAgczMsICBbeDVdLCAjOAotICAgICAgICBzdHAgICAgICAgICAgICAgczAsICBzMSwgIFt4NF0sICM4Ci0gICAgICAgIGIuZ3QgICAgICAgICAgICAxYgotOToKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40cyx2NS40c30sIFt4Ml0sICAjMzIKLSAgICAgICAgbGQyICAgICAgICAgICAgIHt2Mi40cyx2My40c30sIFt4MV0sICAjMzIKLSAgICAgICAgdXpwMSAgICAgICAgICAgIHY2LjRzLCAgdjQuNHMsICB2NS40cwotICAgICAgICB1enAyICAgICAgICAgICAgdjcuNHMsICB2NC40cywgIHY1LjRzCi0gICAgICAgIGxkMiAgICAgICAgICAgICB7djAuNHMsdjEuNHN9LCBbeDBdLCAgIzMyCi04OgotICAgICAgICBzdWJzICAgICAgICAgICAgeDMsICB4MywgICM4Ci0KLSAgICAgICAgZm11bCAgICAgICAgICAgIHY0LjRzLCAgdjIuNHMsICB2Ni40cwotICAgICAgICBmbXVsICAgICAgICAgICAgdjUuNHMsICB2Mi40cywgIHY3LjRzCi0gICAgICAgIGIubHQgICAgICAgICAgICA0ZgotCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LjRzLHYxOS40c30sIFt4Ml0sICAjMzIKLQotICAgICAgICBmbWxzICAgICAgICAgICAgdjQuNHMsICB2My40cywgIHY3LjRzCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2NS40cywgIHYzLjRzLCAgdjYuNHMKLQotICAgICAgICBsZDIgICAgICAgICAgICAge3YyMi40cyx2MjMuNHN9LCBbeDFdLCAgIzMyCi0KLSAgICAgICAgZnN1YiAgICAgICAgICAgIHYyLjRzLCAgdjAuNHMsICB2NC40cwotICAgICAgICBmYWRkICAgICAgICAgICAgdjAuNHMsICB2MC40cywgIHY0LjRzCi0gICAgICAgIGZzdWIgICAgICAgICAgICB2My40cywgIHYxLjRzLCAgdjUuNHMKLSAgICAgICAgZmFkZCAgICAgICAgICAgIHYxLjRzLCAgdjEuNHMsICB2NS40cwotCi0gICAgICAgIHV6cDEgICAgICAgICAgICB2MTYuNHMsIHYxOC40cywgdjE5LjRzCi0gICAgICAgIHV6cDIgICAgICAgICAgICB2MTcuNHMsIHYxOC40cywgdjE5LjRzCi0KLSAgICAgICAgc3QyICAgICAgICAgICAgIHt2Mi40cyx2My40c30sIFt4NV0sICAjMzIKLSAgICAgICAgc3QyICAgICAgICAgICAgIHt2MC40cyx2MS40c30sIFt4NF0sICAjMzIKLSAgICAgICAgbGQyICAgICAgICAgICAgIHt2MjAuNHMsdjIxLjRzfSwgW3gwXSwgICMzMgotCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MTguNHMsIHYyMi40cywgdjE2LjRzCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MTkuNHMsIHYyMi40cywgdjE3LjRzCi0gICAgICAgIGIuZXEgICAgICAgICAgICAwZgotCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHMsdjUuNHN9LCBbeDJdLCAgIzMyCi0KLSAgICAgICAgZm1scyAgICAgICAgICAgIHYxOC40cywgdjIzLjRzLCB2MTcuNHMKLSAgICAgICAgZm1sYSAgICAgICAgICAgIHYxOS40cywgdjIzLjRzLCB2MTYuNHMKLQotICAgICAgICBsZDIgICAgICAgICAgICAge3YyLjRzLHYzLjRzfSwgW3gxXSwgICMzMgotCi0gICAgICAgIGZzdWIgICAgICAgICAgICB2MjIuNHMsIHYyMC40cywgdjE4LjRzCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2MjAuNHMsIHYyMC40cywgdjE4LjRzCi0gICAgICAgIGZzdWIgICAgICAgICAgICB2MjMuNHMsIHYyMS40cywgdjE5LjRzCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2MjEuNHMsIHYyMS40cywgdjE5LjRzCi0KLSAgICAgICAgdXpwMSAgICAgICAgICAgIHY2LjRzLCAgdjQuNHMsICB2NS40cwotICAgICAgICB1enAyICAgICAgICAgICAgdjcuNHMsICB2NC40cywgIHY1LjRzCi0KLSAgICAgICAgc3QyICAgICAgICAgICAgIHt2MjIuNHMsdjIzLjRzfSwgW3g1XSwgICMzMgotICAgICAgICBzdDIgICAgICAgICAgICAge3YyMC40cyx2MjEuNHN9LCBbeDRdLCAgIzMyCi0gICAgICAgIGxkMiAgICAgICAgICAgICB7djAuNHMsdjEuNHN9LCBbeDBdLCAgIzMyCi0KLSAgICAgICAgYiAgICAgICAgICAgICAgIDhiCi00OgotICAgICAgICBmbWxzICAgICAgICAgICAgdjQuNHMsICB2My40cywgIHY3LjRzCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2NS40cywgIHYzLjRzLCAgdjYuNHMKLQotICAgICAgICBmc3ViICAgICAgICAgICAgdjIuNHMsICB2MC40cywgIHY0LjRzCi0gICAgICAgIGZhZGQgICAgICAgICAgICB2MC40cywgIHYwLjRzLCAgdjQuNHMKLSAgICAgICAgZnN1YiAgICAgICAgICAgIHYzLjRzLCAgdjEuNHMsICB2NS40cwotICAgICAgICBmYWRkICAgICAgICAgICAgdjEuNHMsICB2MS40cywgIHY1LjRzCi0KLSAgICAgICAgc3QyICAgICAgICAgICAgIHt2Mi40cyx2My40c30sIFt4NV0sICAjMzIKLSAgICAgICAgc3QyICAgICAgICAgICAgIHt2MC40cyx2MS40c30sIFt4NF0sICAjMzIKLQotICAgICAgICByZXQKLTA6Ci0gICAgICAgIGZtbHMgICAgICAgICAgICB2MTguNHMsIHYyMy40cywgdjE3LjRzCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2MTkuNHMsIHYyMy40cywgdjE2LjRzCi0KLSAgICAgICAgZnN1YiAgICAgICAgICAgIHYyMi40cywgdjIwLjRzLCB2MTguNHMKLSAgICAgICAgZmFkZCAgICAgICAgICAgIHYyMC40cywgdjIwLjRzLCB2MTguNHMKLSAgICAgICAgZnN1YiAgICAgICAgICAgIHYyMy40cywgdjIxLjRzLCB2MTkuNHMKLSAgICAgICAgZmFkZCAgICAgICAgICAgIHYyMS40cywgdjIxLjRzLCB2MTkuNHMKLQotICAgICAgICBzdDIgICAgICAgICAgICAge3YyMi40cyx2MjMuNHN9LCBbeDVdLCAgIzMyCi0gICAgICAgIHN0MiAgICAgICAgICAgICB7djIwLjRzLHYyMS40c30sIFt4NF0sICAjMzIKLQotICAgICAgICByZXQKLWVuZGZ1bmMKLQotZnVuY3Rpb24gZmZ0MzBfbmVvbiwgYWxpZ249NgotICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMweDIwCi0gICAgICAgIHN0cCAgICAgICAgICAgICB4MjAsIHgyMSwgW3NwXQotICAgICAgICBzdHAgICAgICAgICAgICAgeDIyLCB4MzAsIFtzcCwgIzB4MTBdCi0gICAgICAgIG1vdiAgICAgICAgICAgICB4MjEsIHgxCi0gICAgICAgIG1vdiAgICAgICAgICAgICB4MjIsIHgyCi0gICAgICAgIG1vdiAgICAgICAgICAgICB4MjAsIHg0Ci0gICAgICAgIG1vdiAgICAgICAgICAgICB4MCwgIHgyMQotICAgICAgICBtb3YgICAgICAgICAgICAgeDEsICB4MjIKLSAgICAgICAgbHNsICAgICAgICAgICAgIHgzLCAgeDIwLCAjMQotICAgICAgICBibCAgICAgICAgICAgICAgZmZ0MTVfbmVvbgotCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgyMSwgIzE1KjgKLSAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDIyLCB4MjAsICBsc2wgIzMKLSAgICAgICAgbHNsICAgICAgICAgICAgIHgzLCAgeDIwLCAjMQotICAgICAgICBibCAgICAgICAgICAgICAgZmZ0MTVfbmVvbgotCi0gICAgICAgIGxkciAgICAgICAgICAgICB4MiwgIFt4MTAsICMoQ0VMVF9FWFBUQUIgKyA4KV0gIC8vIHMtPmV4cHRhYlsxXQotICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MjEsICMwCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgyMSwgIzE1KjgKLSAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgIzE1Ci0gICAgICAgIGxkcCAgICAgICAgICAgICB4MjAsIHgyMSwgW3NwXQotICAgICAgICBsZHAgICAgICAgICAgICAgeDIyLCB4MzAsIFtzcCwgIzB4MTBdCi0gICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzB4MjAKLSAgICAgICAgYiAgICAgICAgICAgICAgIGZmdDE1X3Bhc3MKLWVuZGZ1bmMKLQotLm1hY3JvICBkZWZfZmZ0IG4sIG4yCi1mdW5jdGlvbiBmZnRcblwoKV9uZW9uLCBhbGlnbj02Ci0gICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzB4MzAKLSAgICAgICAgc3RwICAgICAgICAgICAgIHgyMCwgeDIxLCBbc3BdCi0gICAgICAgIHN0cCAgICAgICAgICAgICB4MjIsIHgzMCwgW3NwLCAjMHgxMF0KLSAgICAgICAgc3RwICAgICAgICAgICAgIHgyMywgeDI0LCBbc3AsICMweDIwXQotICAgICAgICBtb3YgICAgICAgICAgICAgeDIxLCB4MQotICAgICAgICBtb3YgICAgICAgICAgICAgeDIyLCB4MgotICAgICAgICBtb3YgICAgICAgICAgICAgeDIzLCB4MwotICAgICAgICBtb3YgICAgICAgICAgICAgeDIwLCB4NAotICAgICAgICBzdWIgICAgICAgICAgICAgeDMsICB4MywgICMxCi0gICAgICAgIGxzbCAgICAgICAgICAgICB4NCwgIHg0LCAgIzEKLSAgICAgICAgYmwgICAgICAgICAgICAgIGZmdFxuMlwoKV9uZW9uCi0KLSAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDIxLCAjKFxuMiAqIDgpCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHgyMiwgeDIwLCBsc2wgIzMKLSAgICAgICAgc3ViICAgICAgICAgICAgIHgzLCAgeDIzLCAjMQotICAgICAgICBsc2wgICAgICAgICAgICAgeDQsICB4MjAsICMxCi0gICAgICAgIGJsICAgICAgICAgICAgICBmZnRcbjJcKClfbmVvbgotCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4NSwgIHgxMCwgI0NFTFRfRVhQVEFCCi0gICAgICAgIG1vdiAgICAgICAgICAgICB4MCwgIHgyMQotICAgICAgICBsZHIgICAgICAgICAgICAgeDIsICBbeDUsICB4MjMsIGxzbCAjM10gLy8gcy0+ZXhwdGFiW05dCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgyMSwgIyhcbjIgKiA4KQotICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICAjXG4yCi0gICAgICAgIGxkcCAgICAgICAgICAgICB4MjAsIHgyMSwgW3NwXQotICAgICAgICBsZHAgICAgICAgICAgICAgeDIyLCB4MzAsIFtzcCwgIzB4MTBdCi0gICAgICAgIGxkcCAgICAgICAgICAgICB4MjMsIHgyNCwgW3NwLCAjMHgyMF0KLSAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjMHgzMAotICAgICAgICBiICAgICAgICAgICAgICAgZmZ0MTVfcGFzcwotZW5kZnVuYwotLmVuZG0KLQotICAgICAgICBkZWZfZmZ0ICAgIDYwLCAgMzAKLSAgICAgICAgZGVmX2ZmdCAgIDEyMCwgIDYwCi0gICAgICAgIGRlZl9mZnQgICAyNDAsIDEyMAotICAgICAgICBkZWZfZmZ0ICAgNDgwLCAyNDAKLSAgICAgICAgZGVmX2ZmdCAgIDk2MCwgNDgwCi0KLWZ1bmN0aW9uIGZmdF9iMTVfY2FsY19uZW9uCi0gICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzB4NTAKLSAgICAgICAgbGRyICAgICAgICAgICAgIHg4LCAgW3gwLCAgI0NFTFRfRVhQVEFCXSAgICAvLyBzLT5leHB0YWJbMF0KLSAgICAgICAgbW92cmVsICAgICAgICAgIHg2LCAgZmFjdDUKLSAgICAgICAgbW92cmVsICAgICAgICAgIHgxMSwgc2h1ZmZsZV8wMjEzCi0gICAgICAgIG1vdnJlbCAgICAgICAgICB4MTIsIHNodWZmbGVfMTAzMgotICAgICAgICBtb3ZyZWwgICAgICAgICAgeDEzLCBzaHVmZmxlXzIzMDEKLSAgICAgICAgbW92cmVsICAgICAgICAgIHgxNCwgc2h1ZmZsZV8zMTIwCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4OCwgIHg4LCAgIzgKLSAgICAgICAgbW92cmVsICAgICAgICAgIHg1LCAgZmZ0X3RhYl9uZW9uCi0gICAgICAgIHN0cCAgICAgICAgICAgICB4MjAsIHgzMCwgW3NwXQotICAgICAgICBzdHAgICAgICAgICAgICAgZDgsICBkOSwgIFtzcCwgIzB4MTBdCi0gICAgICAgIHN0cCAgICAgICAgICAgICBkMTAsIGQxMSwgW3NwLCAjMHgyMF0KLSAgICAgICAgc3RwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3AsICMweDMwXQotICAgICAgICBzdHAgICAgICAgICAgICAgZDE0LCBkMTUsIFtzcCwgIzB4NDBdCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djE1LjRzfSwgW3g2XQotICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRzLHYxLjRzfSwgICBbeDhdLCAgIzMyCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djYuMnN9LCAgW3g4XSwgICM4Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNHMsdjMuNHN9LCAgIFt4OF0sICAjMzIKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny4yc30sICBbeDhdLCAgIzgKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40cyx2NS40c30sICAgW3g4XSwgICMzMgotICAgICAgICB1enAxICAgICAgICAgICAgdjguNHMsICB2MC40cywgIHYxLjRzICAgLy8gZXhwWyAxIC0gIDRdLnJlCi0gICAgICAgIHV6cDIgICAgICAgICAgICB2OS40cywgIHYwLjRzLCAgdjEuNHMgICAvLyBleHBbIDEgLSAgNF0uaW0KLSAgICAgICAgdXpwMSAgICAgICAgICAgIHYxMC40cywgdjIuNHMsICB2My40cyAgIC8vIGV4cFsgNiAtICA5XS5yZQotICAgICAgICB1enAyICAgICAgICAgICAgdjExLjRzLCB2Mi40cywgIHYzLjRzICAgLy8gZXhwWyA2IC0gIDldLmltCi0gICAgICAgIHV6cDEgICAgICAgICAgICB2MTIuNHMsIHY0LjRzLCAgdjUuNHMgICAvLyBleHBbMTEgLSAxNF0ucmUKLSAgICAgICAgdXpwMiAgICAgICAgICAgIHYxMy40cywgdjQuNHMsICB2NS40cyAgIC8vIGV4cFsxMSAtIDE0XS5pbQotICAgICAgICB6aXAxICAgICAgICAgICAgdjE0LjRzLCB2Ni40cywgIHY3LjRzICAgLy8gZXhwWzUsMTBdLnJlL2V4cFs1LDEwXS5pbQotICAgICAgICBhZGQgICAgICAgICAgICAgeDUsICB4NSwgIHgzLCAgbHNsICMzCi0gICAgICAgIGxkciAgICAgICAgICAgICB4NSwgIFt4NV0KLSAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgeDAKLSAgICAgICAgYmxyICAgICAgICAgICAgIHg1Ci0gICAgICAgIGxkcCAgICAgICAgICAgICB4MjAsIHgzMCwgW3NwXQotICAgICAgICBsZHAgICAgICAgICAgICAgZDgsICBkOSwgIFtzcCwgIzB4MTBdCi0gICAgICAgIGxkcCAgICAgICAgICAgICBkMTAsIGQxMSwgW3NwLCAjMHgyMF0KLSAgICAgICAgbGRwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3AsICMweDMwXQotICAgICAgICBsZHAgICAgICAgICAgICAgZDE0LCBkMTUsIFtzcCwgIzB4NDBdCi0gICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzB4NTAKLSAgICAgICAgcmV0Ci1lbmRmdW5jCi0KLWNvbnN0ICAgZmZ0X3RhYl9uZW9uLCByZWxvY2F0ZT0xCi0gICAgICAgIC5xdWFkIGZmdDE1X25lb24KLSAgICAgICAgLnF1YWQgZmZ0MzBfbmVvbgotICAgICAgICAucXVhZCBmZnQ2MF9uZW9uCi0gICAgICAgIC5xdWFkIGZmdDEyMF9uZW9uCi0gICAgICAgIC5xdWFkIGZmdDI0MF9uZW9uCi0gICAgICAgIC5xdWFkIGZmdDQ4MF9uZW9uCi0gICAgICAgIC5xdWFkIGZmdDk2MF9uZW9uCi1lbmRjb25zdAotCi1mdW5jdGlvbiBmZl9jZWx0X2ltZGN0X2hhbGZfbmVvbiwgZXhwb3J0PTEKLSAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMHgyMAotICAgICAgICBzdHAgICAgICAgICAgICAgeDIxLCB4MzAsIFtzcF0KLSAgICAgICAgc3RyICAgICAgICAgICAgIHMwLCBbc3AsICMweDEwXQotCi0gICAgICAgIGxkcCAgICAgICAgICAgICB3NSwgIHc2LCAgW3gwLCAgI0NFTFRfTEVOMl0gLy8gQ0VMVF9MRU40Ci0gICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsIHgwCi0gICAgICAgIG1vdiAgICAgICAgICAgICB4MjEsIHgxCi0gICAgICAgIHN1YiAgICAgICAgICAgICB3NSwgIHc1LCAgIzEKLSAgICAgICAgbHNsICAgICAgICAgICAgIHg3LCAgeDMsICAjMyAgICAgICAgICAgIC8vICAyICogc3RyaWRlICogc2l6ZW9mKGZsb2F0KQotICAgICAgICBzdWIgICAgICAgICAgICAgeDgsICB4enIsIHgzLCAgbHNsICMzICAgLy8gLTIgKiBzdHJpZGUgKiBzaXplb2YoZmxvYXQpCi0gICAgICAgIG11bCAgICAgICAgICAgICB4NSwgIHg1LCAgeDMKLSAgICAgICAgbGRwICAgICAgICAgICAgIHg5LCAgeDEwLCBbeDAsICAjQ0VMVF9UTVBdICAvLyBDRUxUX1RXSURETEUKLSAgICAgICAgbGRyICAgICAgICAgICAgIHczLCAgW3gwLCAjQ0VMVF9GRlRfTl0KLSAgICAgICAgYWRkICAgICAgICAgICAgIHg1LCAgeDIsICB4NSwgIGxzbCAjMgotICAgICAgICBtb3YgICAgICAgICAgICAgeDExLCB4OQotCi0gICAgICAgIHN1YiAgICAgICAgICAgICB3NiwgIHc2LCAgIzQKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5zfVswXSwgIFt4NV0sIHg4Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMF0sICBbeDJdLCB4NwotICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzfSwgW3gxMF0sICMzMgotICAgICAgICBsZDEgICAgICAgICAgICAge3YwLnN9WzFdLCAgW3g1XSwgeDgKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS5zfVsxXSwgIFt4Ml0sIHg3Ci0gICAgICAgIHV6cDEgICAgICAgICAgICB2Mi40cywgIHY0LjRzLCAgdjUuNHMKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5zfVsyXSwgIFt4NV0sIHg4Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMl0sICBbeDJdLCB4NwotICAgICAgICB1enAyICAgICAgICAgICAgdjMuNHMsICB2NC40cywgIHY1LjRzCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djAuc31bM10sICBbeDVdLCB4OAotICAgICAgICBsZDEgICAgICAgICAgICAge3YxLnN9WzNdLCAgW3gyXSwgeDcKLTE6Ci0gICAgICAgIHN1YnMgICAgICAgICAgICB3NiwgIHc2LCAgIzQKLQotICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC5zfVswXSwgW3g1XSwgeDgKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuc31bMF0sIFt4Ml0sIHg3Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHMsdjUuNHN9LCBbeDEwXSwgIzMyCi0KLSAgICAgICAgZm11bCAgICAgICAgICAgIHY2LjRzLCAgdjAuNHMsICB2Mi40cwotICAgICAgICBmbXVsICAgICAgICAgICAgdjcuNHMsICB2MC40cywgIHYzLjRzCi0KLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuc31bMV0sIFt4NV0sIHg4Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLnN9WzFdLCBbeDJdLCB4NwotCi0gICAgICAgIGZtbHMgICAgICAgICAgICB2Ni40cywgIHYxLjRzLCAgdjMuNHMKLSAgICAgICAgZm1sYSAgICAgICAgICAgIHY3LjRzLCAgdjEuNHMsICB2Mi40cwotCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLnN9WzJdLCBbeDVdLCB4OAotICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS5zfVsyXSwgW3gyXSwgeDcKLQotICAgICAgICB1enAxICAgICAgICAgICAgdjIuNHMsICB2NC40cywgIHY1LjRzCi0gICAgICAgIHV6cDIgICAgICAgICAgICB2My40cywgIHY0LjRzLCAgdjUuNHMKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuc31bM10sIFt4NV0sIHg4Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLnN9WzNdLCBbeDJdLCB4NwotCi0gICAgICAgIHppcDEgICAgICAgICAgICB2NC40cywgIHY2LjRzLCAgdjcuNHMKLSAgICAgICAgemlwMiAgICAgICAgICAgIHY1LjRzLCAgdjYuNHMsICB2Ny40cwotCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2Ni40cywgIHYyMC40cywgdjIuNHMKLSAgICAgICAgZm11bCAgICAgICAgICAgIHY3LjRzLCAgdjIwLjRzLCB2My40cwotCi0gICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHMsdjUuNHN9LCBbeDldLCAjMzIKLQotICAgICAgICBmbWxzICAgICAgICAgICAgdjYuNHMsICB2MjEuNHMsIHYzLjRzCi0gICAgICAgIGZtbGEgICAgICAgICAgICB2Ny40cywgIHYyMS40cywgdjIuNHMKLQotICAgICAgICBiLmVxICAgICAgICAgICAgM2YKLQotICAgICAgICBzdWJzICAgICAgICAgICAgdzYsICB3NiwgICM0Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHMsdjUuNHN9LCBbeDEwXSwgIzMyCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djAuc31bMF0sICBbeDVdLCB4OAotICAgICAgICBsZDEgICAgICAgICAgICAge3YxLnN9WzBdLCAgW3gyXSwgeDcKLSAgICAgICAgdXpwMSAgICAgICAgICAgIHYyLjRzLCAgdjQuNHMsICB2NS40cwotICAgICAgICBsZDEgICAgICAgICAgICAge3YwLnN9WzFdLCAgW3g1XSwgeDgKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS5zfVsxXSwgIFt4Ml0sIHg3Ci0gICAgICAgIHV6cDIgICAgICAgICAgICB2My40cywgIHY0LjRzLCAgdjUuNHMKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5zfVsyXSwgIFt4NV0sIHg4Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMl0sICBbeDJdLCB4NwotICAgICAgICB6aXAxICAgICAgICAgICAgdjQuNHMsICB2Ni40cywgIHY3LjRzCi0gICAgICAgIHppcDIgICAgICAgICAgICB2NS40cywgIHY2LjRzLCAgdjcuNHMKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5zfVszXSwgIFt4NV0sIHg4Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bM10sICBbeDJdLCB4NwotCi0gICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHMsdjUuNHN9LCBbeDldLCAjMzIKLQotICAgICAgICBiLmd0ICAgICAgICAgICAgMWIKLQotICAgICAgICBmbXVsICAgICAgICAgICAgdjYuNHMsICB2MC40cywgIHYyLjRzCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2Ny40cywgIHYwLjRzLCAgdjMuNHMKLSAgICAgICAgZm1scyAgICAgICAgICAgIHY2LjRzLCAgdjEuNHMsICB2My40cwotICAgICAgICBmbWxhICAgICAgICAgICAgdjcuNHMsICB2MS40cywgIHYyLjRzCi0zOgotICAgICAgICB6aXAxICAgICAgICAgICAgdjQuNHMsICB2Ni40cywgIHY3LjRzCi0gICAgICAgIHppcDIgICAgICAgICAgICB2NS40cywgIHY2LjRzLCAgdjcuNHMKLSAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC40cyx2NS40c30sIFt4OV0sICMzMgotCi0gICAgICAgIG1vdiAgICAgICAgICAgICB4MiwgIHgxMQotICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICAjMQotCi0gICAgICAgIGJsICAgICAgICAgICAgICBmZnRfYjE1X2NhbGNfbmVvbgotCi0gICAgICAgIGxkciAgICAgICAgICAgICB3NSwgIFt4MTAsICNDRUxUX0xFTjRdCi0gICAgICAgIGxkciAgICAgICAgICAgICB4NiwgIFt4MTAsICNDRUxUX1RXSURETEVdCi0gICAgICAgIGxkciAgICAgICAgICAgICBzMzEsIFtzcCwgIzB4MTBdCi0KLSAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDIxLCB4NSwgIGxzbCAjMgotICAgICAgICBhZGQgICAgICAgICAgICAgeDMsICB4NiwgIHg1LCAgbHNsICMyCi0gICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgxLCAgIzE2Ci0gICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgzLCAgIzE2Ci0gICAgICAgIG1vdiAgICAgICAgICAgICB4OCwgICMtMTYKLSAgICAgICAgbW92ICAgICAgICAgICAgIHg3LCAgIzE2Ci0gICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsIHgwCi0gICAgICAgIG1vdiAgICAgICAgICAgICB4MTEsIHgxCi0KLSAgICAgICAgc3ViICAgICAgICAgICAgIHc1LCAgdzUsICAjNAotCi0gICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHN9LCAgW3gwXSwgeDgKLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40c30sICBbeDFdLCB4NwotICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRzfSwgIFt4Ml0sIHg4Ci0gICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNHN9LCAgW3gzXSwgeDcKLQotICAgICAgICB1enAxICAgICAgICAgICAgdjQuNHMsICB2MC40cywgIHYxLjRzICAgLy8gelstaS0yLCAtaS0xLCAraSwgaSsxXS5yZQotICAgICAgICB1enAyICAgICAgICAgICAgdjYuNHMsICB2MC40cywgIHYxLjRzICAgLy8gelstaS0yLCAtaS0xLCAraSwgaSsxXS5pbQotCi0gICAgICAgIHV6cDEgICAgICAgICAgICB2NS40cywgIHYyLjRzLCAgdjMuNHMgICAvLyB0d2lkbGxlX2V4cHRhYlstaS0yLCAtaS0xLCAraSwgaSsxXS5yZQotICAgICAgICB1enAyICAgICAgICAgICAgdjcuNHMsICB2Mi40cywgIHYzLjRzICAgLy8gdHdpZGxsZV9leHB0YWJbLWktMiwgLWktMSwgK2ksIGkrMV0uaW0KLQotICAgICAgICBmbXVsICAgICAgICAgICAgdjEuNHMsICB2Ni40cywgIHY1LjRzCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MC40cywgIHY2LjRzLCAgdjcuNHMKLTI6Ci0gICAgICAgIHN1YnMgICAgICAgICAgICB3NSwgIHc1LCAgIzQKLQotICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC40c30sIFt4MF0sIHg4Ci0KLSAgICAgICAgZm1sYSAgICAgICAgICAgIHYxLjRzLCAgdjQuNHMsICB2Ny40cwotICAgICAgICBmbWxzICAgICAgICAgICAgdjAuNHMsICB2NC40cywgIHY1LjRzCi0KLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuNHN9LCBbeDFdLCB4NwotCi0gICAgICAgIGV4dCAgICAgICAgICAgICB2MS4xNmIsIHYxLjE2YiwgdjEuMTZiLCAjOAotICAgICAgICBmbXVsICAgICAgICAgICAgdjAuNHMsICB2MC40cywgIHYzMS5zWzBdCi0KLSAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi40c30sICBbeDJdLCB4OAotCi0gICAgICAgIHJldjY0ICAgICAgICAgICB2MS40cywgIHYxLjRzCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MS40cywgIHYxLjRzLCAgdjMxLnNbMF0KLQotICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRzfSwgIFt4M10sIHg3Ci0KLSAgICAgICAgemlwMSAgICAgICAgICAgIHY1LjRzLCAgdjAuNHMsICB2MS40cwotICAgICAgICB6aXAyICAgICAgICAgICAgdjcuNHMsICB2MC40cywgIHYxLjRzCi0KLSAgICAgICAgdXpwMSAgICAgICAgICAgIHY0LjRzLCAgdjIwLjRzLCB2MjEuNHMgIC8vIHpbLWktMiwgLWktMSwgK2ksIGkrMV0ucmUKLSAgICAgICAgdXpwMiAgICAgICAgICAgIHY2LjRzLCAgdjIwLjRzLCB2MjEuNHMgIC8vIHpbLWktMiwgLWktMSwgK2ksIGkrMV0uaW0KLQotICAgICAgICBzdDEgICAgICAgICAgICAge3Y1LjRzfSwgIFt4MTBdLCB4OAotICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjRzfSwgIFt4MTFdLCB4NwotCi0gICAgICAgIHV6cDEgICAgICAgICAgICB2NS40cywgIHYyLjRzLCAgdjMuNHMgICAvLyB0d2lkbGxlX2V4cHRhYlstaS0yLCAtaS0xLCAraSwgaSsxXS5yZQotICAgICAgICB1enAyICAgICAgICAgICAgdjcuNHMsICB2Mi40cywgIHYzLjRzICAgLy8gdHdpZGxsZV9leHB0YWJbLWktMiwgLWktMSwgK2ksIGkrMV0uaW0KLQotICAgICAgICBmbXVsICAgICAgICAgICAgdjEuNHMsICB2Ni40cywgIHY1LjRzCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MC40cywgIHY2LjRzLCAgdjcuNHMKLSAgICAgICAgYi5ndCAgICAgICAgICAgIDJiCi0KLSAgICAgICAgZm1sYSAgICAgICAgICAgIHYxLjRzLCAgdjQuNHMsICB2Ny40cwotICAgICAgICBmbWxzICAgICAgICAgICAgdjAuNHMsICB2NC40cywgIHY1LjRzCi0gICAgICAgIGV4dCAgICAgICAgICAgICB2MS4xNmIsIHYxLjE2YiwgdjEuMTZiLCAjOAotICAgICAgICBmbXVsICAgICAgICAgICAgdjAuNHMsICB2MC40cywgIHYzMS5zWzBdCi0gICAgICAgIHJldjY0ICAgICAgICAgICB2MS40cywgIHYxLjRzCi0gICAgICAgIGZtdWwgICAgICAgICAgICB2MS40cywgIHYxLjRzLCAgdjMxLnNbMF0KLSAgICAgICAgemlwMSAgICAgICAgICAgIHY1LjRzLCAgdjAuNHMsICB2MS40cwotICAgICAgICB6aXAyICAgICAgICAgICAgdjcuNHMsICB2MC40cywgIHYxLjRzCi0gICAgICAgIHN0MSAgICAgICAgICAgICB7djUuNHN9LCAgW3gxMF0sIHg4Ci0gICAgICAgIHN0MSAgICAgICAgICAgICB7djcuNHN9LCAgW3gxMV0sIHg3Ci0KLSAgICAgICAgbGRwICAgICAgICAgICAgIHgyMSwgeDMwLCBbc3BdCi0gICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzB4MjAKLSAgICAgICAgcmV0Ci1lbmRmdW5jCi0KLS8vIFswXSA9IGV4cCgyICogaSAqIHBpIC8gNSksIFsxXSA9IGV4cCgyICogaSAqIHBpICogMiAvIDUpCi1jb25zdCAgIGZhY3Q1LCAgICAgICAgICBhbGlnbj00Ci0gICAgICAgIC5mbG9hdCAgICAgICAgICAgMC4zMDkwMTY5OTQzNzQ5NDc0NSwgMC45NTEwNTY1MTYyOTUxNTM1MwotICAgICAgICAuZmxvYXQgICAgICAgICAgLTAuODA5MDE2OTk0Mzc0OTQ3MzQsIDAuNTg3Nzg1MjUyMjkyNDczMjUKLWVuZGNvbnN0CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvbXBlZ2F1ZGlvZHNwX2luaXQuYyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9tcGVnYXVkaW9kc3BfaW5pdC5jCmluZGV4IGI5NDUxNDYuLjVkOTY2YWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFyY2g2NC9tcGVnYXVkaW9kc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9tcGVnYXVkaW9kc3BfaW5pdC5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKQEAgLTI0LDkgKzI1LDkgQEAKICNpbmNsdWRlICJjb25maWcuaCIKIAogdm9pZCBmZl9tcGFkc3BfYXBwbHlfd2luZG93X2ZpeGVkX25lb24oaW50MzJfdCAqc3ludGhfYnVmLCBpbnQzMl90ICp3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpdGhlciwgaW50MTZfdCAqc2FtcGxlcywgaW50IGluY3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXRoZXIsIGludDE2X3QgKnNhbXBsZXMsIHB0cmRpZmZfdCBpbmNyKTsKIHZvaWQgZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19mbG9hdF9uZW9uKGZsb2F0ICpzeW50aF9idWYsIGZsb2F0ICp3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpdGhlciwgZmxvYXQgKnNhbXBsZXMsIGludCBpbmNyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyLCBmbG9hdCAqc2FtcGxlcywgcHRyZGlmZl90IGluY3IpOwogCiBhdl9jb2xkIHZvaWQgZmZfbXBhZHNwX2luaXRfYWFyY2g2NChNUEFEU1BDb250ZXh0ICpzKQogewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L21wZWdhdWRpb2RzcF9uZW9uLlMgYi9saWJhdmNvZGVjL2FhcmNoNjQvbXBlZ2F1ZGlvZHNwX25lb24uUwppbmRleCA3MzNmYzg0Li5iNmVmMTMxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhcmNoNjQvbXBlZ2F1ZGlvZHNwX25lb24uUworKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvbXBlZ2F1ZGlvZHNwX25lb24uUwpAQCAtMjQsNyArMjQsNyBAQAogI2RlZmluZSBXRlJBQ19CSVRTICAxNiAgIC8vIGZyYWN0aW9uYWwgYml0cyBmb3Igd2luZG93CiAjZGVmaW5lIE9VVF9TSElGVCAoV0ZSQUNfQklUUyArIEZSQUNfQklUUyAtIDE1KQogCi1jb25zdCAgIHRibF9yZXYxMjgucywgYWxpZ249NAorY29uc3QgICB0YmxfcmV2MTI4X3MsIGFsaWduPTQKICAgICAgICAgLmJ5dGUgICAgICAgICAgIDEyLCAxMywgMTQsIDE1CiAgICAgICAgIC5ieXRlICAgICAgICAgICAgOCwgIDksIDEwLCAxMQogICAgICAgICAuYnl0ZSAgICAgICAgICAgIDQsICA1LCAgNiwgIDcKQEAgLTM0LDEzICszNCwxMiBAQAogLm1hY3JvICAgYXBwbHlfd2luZG93ICAgdHlwZSwgc3QKIGZ1bmN0aW9uIGZmX21wYWRzcF9hcHBseV93aW5kb3dfXHR5cGVcKClfbmVvbiwgZXhwb3J0PTEKICAgICAgICAgbW92ICAgICAgICAgICAgIHg3LCAgeDAKLSAgICAgICAgc3h0dyAgICAgICAgICAgIHg0LCAgdzQgIC8vIGluY3IKICAgICAgICAgYWRkICAgICAgICAgICAgIHg4LCAgeDAsICAjNTEyPDwyCiAgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNHMsdjEuNHMsdjIuNHMsdjMuNHN9LCAgW3g3XSwgICM2NAogICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzLHY2LjRzLHY3LjRzfSwgIFt4N10sICAjNjQKICAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC40cyx2MS40cyx2Mi40cyx2My40c30sICBbeDhdLCAgIzY0CiAgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHMsdjUuNHMsdjYuNHMsdjcuNHN9LCAgW3g4XSwgICM2NAotICAgICAgICBtb3ZyZWwgICAgICAgICAgeDE1LCB0YmxfcmV2MTI4LnMKKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxNSwgdGJsX3JldjEyOF9zCiAgICAgICAgIGxkMSAgICAgICAgICAgICB7djI3LjRzfSwgW3gxNV0KIC5pZmMgXHR5cGUsIGZpeGVkCiAgICAgICAgIGxzbCAgICAgICAgICAgICB4NCwgIHg0LCAgIzEKQEAgLTE0Miw3ICsxNDEsNyBAQAogICAgICAgICBzdWIgICAgICAgICAgICAgeDEwLCB4MTAsICM0PDwyCiAgICAgICAgIGIuZ3QgICAgICAgICAgICAxYgogCi0vLyBjb211dGluZyBzYW1wbGVzWzE2XQorLy8gY29tcHV0aW5nIHNhbXBsZXNbMTZdCiAgICAgICAgIGFkZCAgICAgICAgICAgICB4NiwgIHgxLCAgIzMyPDwyCiAgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMnN9LCAgW3g2XSwgIHg5CiAgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuMnN9LCAgW3gwXSwgIHg5CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvbmVvbi5TIGIvbGliYXZjb2RlYy9hYXJjaDY0L25lb24uUwppbmRleCBhMjI3Y2JkLi4wZmRkYmVjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhcmNoNjQvbmVvbi5TCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9uZW9uLlMKQEAgLTEwNywxMiArMTA3LDEyIEBACiAubWFjcm8gIHRyYW5zcG9zZV80eDRIICByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcKICAgICAgICAgdHJuMSAgICAgICAgICAgIFxyNFwoKS40SCwgIFxyMFwoKS40SCwgIFxyMVwoKS40SAogICAgICAgICB0cm4yICAgICAgICAgICAgXHI1XCgpLjRILCAgXHIwXCgpLjRILCAgXHIxXCgpLjRICi0gICAgICAgIHRybjEgICAgICAgICAgICBccjdcKCkuNEgsICBccjJcKCkuNEgsICBccjNcKCkuNEgKLSAgICAgICAgdHJuMiAgICAgICAgICAgIFxyNlwoKS40SCwgIFxyMlwoKS40SCwgIFxyM1woKS40SAotICAgICAgICB0cm4xICAgICAgICAgICAgXHIwXCgpLjJTLCAgXHI0XCgpLjJTLCAgXHI3XCgpLjJTCi0gICAgICAgIHRybjIgICAgICAgICAgICBccjNcKCkuMlMsICBccjRcKCkuMlMsICBccjdcKCkuMlMKLSAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMVwoKS4yUywgIFxyNVwoKS4yUywgIFxyNlwoKS4yUwotICAgICAgICB0cm4yICAgICAgICAgICAgXHIyXCgpLjJTLCAgXHI1XCgpLjJTLCAgXHI2XCgpLjJTCisgICAgICAgIHRybjEgICAgICAgICAgICBccjZcKCkuNEgsICBccjJcKCkuNEgsICBccjNcKCkuNEgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyN1woKS40SCwgIFxyMlwoKS40SCwgIFxyM1woKS40SAorICAgICAgICB0cm4xICAgICAgICAgICAgXHIwXCgpLjJTLCAgXHI0XCgpLjJTLCAgXHI2XCgpLjJTCisgICAgICAgIHRybjIgICAgICAgICAgICBccjJcKCkuMlMsICBccjRcKCkuMlMsICBccjZcKCkuMlMKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMVwoKS4yUywgIFxyNVwoKS4yUywgIFxyN1woKS4yUworICAgICAgICB0cm4yICAgICAgICAgICAgXHIzXCgpLjJTLCAgXHI1XCgpLjJTLCAgXHI3XCgpLjJTCiAuZW5kbQogCiAubWFjcm8gIHRyYW5zcG9zZV84eDhIICByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L25lb250ZXN0LmMgYi9saWJhdmNvZGVjL2FhcmNoNjQvbmVvbnRlc3QuYwppbmRleCA2ZTQxZjM3Li5hMjRjMjJkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhcmNoNjQvbmVvbnRlc3QuYworKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvbmVvbnRlc3QuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L25lb250ZXN0LmgiCiAKIHdyYXAoYXZjb2RlY19vcGVuMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgQVZDb2RlYyAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQVZDb2RlYyAqY29kZWMsCiAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykpCiB7CiAgICAgdGVzdG5lb25jbG9iYmVycyhhdmNvZGVjX29wZW4yLCBhdmN0eCwgY29kZWMsIG9wdGlvbnMpOwpAQCAtNzcsMyArNzcsMjMgQEAKIHsKICAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfZW5jb2RlX3ZpZGVvMiwgYXZjdHgsIGF2cGt0LCBmcmFtZSwgZ290X3BhY2tldF9wdHIpOwogfQorCit3cmFwKGF2Y29kZWNfc2VuZF9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVlBhY2tldCAqYXZwa3QpKQoreworICAgIHRlc3RuZW9uY2xvYmJlcnMoYXZjb2RlY19zZW5kX3BhY2tldCwgYXZjdHgsIGF2cGt0KTsKK30KKword3JhcChhdmNvZGVjX3JlY2VpdmVfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfcmVjZWl2ZV9wYWNrZXQsIGF2Y3R4LCBhdnBrdCk7Cit9CisKK3dyYXAoYXZjb2RlY19zZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZGcmFtZSAqZnJhbWUpKQoreworICAgIHRlc3RuZW9uY2xvYmJlcnMoYXZjb2RlY19zZW5kX2ZyYW1lLCBhdmN0eCwgZnJhbWUpOworfQorCit3cmFwKGF2Y29kZWNfcmVjZWl2ZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfcmVjZWl2ZV9mcmFtZSwgYXZjdHgsIGZyYW1lKTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC9ydjQwZHNwX2luaXRfYWFyY2g2NC5jIGIvbGliYXZjb2RlYy9hYXJjaDY0L3J2NDBkc3BfaW5pdF9hYXJjaDY0LmMKaW5kZXggNzY0YmMxZS4uMTQyNzA1ZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYXJjaDY0L3J2NDBkc3BfaW5pdF9hYXJjaDY0LmMKKysrIGIvbGliYXZjb2RlYy9hYXJjaDY0L3J2NDBkc3BfaW5pdF9hYXJjaDY0LmMKQEAgLTI1LDE1ICsyNSwxNSBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLXZvaWQgZmZfcHV0X3J2NDBfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX3B1dF9ydjQwX2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9wdXRfcnY0MF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfcHV0X3J2NDBfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKLXZvaWQgZmZfYXZnX3J2NDBfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX2F2Z19ydjQwX2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfcnY0MF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX3J2NDBfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKIGF2X2NvbGQgdm9pZCBmZl9ydjQwZHNwX2luaXRfYWFyY2g2NChSVjM0RFNQQ29udGV4dCAqYykKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC9zYnJkc3BfaW5pdF9hYXJjaDY0LmMgYi9saWJhdmNvZGVjL2FhcmNoNjQvc2JyZHNwX2luaXRfYWFyY2g2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOTY3OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvc2JyZHNwX2luaXRfYWFyY2g2NC5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9zYnJkc3AuaCIKKwordm9pZCBmZl9zYnJfc3VtNjR4NV9uZW9uKGZsb2F0ICp6KTsKK2Zsb2F0IGZmX3Nicl9zdW1fc3F1YXJlX25lb24oZmxvYXQgKCp4KVsyXSwgaW50IG4pOwordm9pZCBmZl9zYnJfbmVnX29kZF82NF9uZW9uKGZsb2F0ICp4KTsKK3ZvaWQgZmZfc2JyX3FtZl9wcmVfc2h1ZmZsZV9uZW9uKGZsb2F0ICp6KTsKK3ZvaWQgZmZfc2JyX3FtZl9wb3N0X3NodWZmbGVfbmVvbihmbG9hdCBXWzMyXVsyXSwgY29uc3QgZmxvYXQgKnopOwordm9pZCBmZl9zYnJfcW1mX2RlaW50X25lZ19uZW9uKGZsb2F0ICp2LCBjb25zdCBmbG9hdCAqc3JjKTsKK3ZvaWQgZmZfc2JyX3FtZl9kZWludF9iZmx5X25lb24oZmxvYXQgKnYsIGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSk7Cit2b2lkIGZmX3Nicl9oZl9nX2ZpbHRfbmVvbihmbG9hdCAoKlkpWzJdLCBjb25zdCBmbG9hdCAoKlhfaGlnaClbNDBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmdfZmlsdCwgaW50IG1fbWF4LCBpbnRwdHJfdCBpeGgpOwordm9pZCBmZl9zYnJfaGZfZ2VuX25lb24oZmxvYXQgKCpYX2hpZ2gpWzJdLCBjb25zdCBmbG9hdCAoKlhfbG93KVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGFscGhhMFsyXSwgY29uc3QgZmxvYXQgYWxwaGExWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYncsIGludCBzdGFydCwgaW50IGVuZCk7Cit2b2lkIGZmX3Nicl9hdXRvY29ycmVsYXRlX25lb24oY29uc3QgZmxvYXQgeFs0MF1bMl0sIGZsb2F0IHBoaVszXVsyXVsyXSk7Cit2b2lkIGZmX3Nicl9oZl9hcHBseV9ub2lzZV8wX25lb24oZmxvYXQgWVs2NF1bMl0sIGNvbnN0IGZsb2F0ICpzX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KTsKK3ZvaWQgZmZfc2JyX2hmX2FwcGx5X25vaXNlXzFfbmVvbihmbG9hdCBZWzY0XVsyXSwgY29uc3QgZmxvYXQgKnNfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqcV9maWx0LCBpbnQgbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGt4LCBpbnQgbV9tYXgpOwordm9pZCBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfMl9uZW9uKGZsb2F0IFlbNjRdWzJdLCBjb25zdCBmbG9hdCAqc19tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpxX2ZpbHQsIGludCBub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga3gsIGludCBtX21heCk7Cit2b2lkIGZmX3Nicl9oZl9hcHBseV9ub2lzZV8zX25lb24oZmxvYXQgWVs2NF1bMl0sIGNvbnN0IGZsb2F0ICpzX20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnFfZmlsdCwgaW50IG5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KTsKKworYXZfY29sZCB2b2lkIGZmX3NicmRzcF9pbml0X2FhcmNoNjQoU0JSRFNQQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPnN1bTY0eDUgPSBmZl9zYnJfc3VtNjR4NV9uZW9uOworICAgICAgICBzLT5zdW1fc3F1YXJlID0gZmZfc2JyX3N1bV9zcXVhcmVfbmVvbjsKKyAgICAgICAgcy0+bmVnX29kZF82NCA9IGZmX3Nicl9uZWdfb2RkXzY0X25lb247CisgICAgICAgIHMtPnFtZl9wcmVfc2h1ZmZsZSA9IGZmX3Nicl9xbWZfcHJlX3NodWZmbGVfbmVvbjsKKyAgICAgICAgcy0+cW1mX3Bvc3Rfc2h1ZmZsZSA9IGZmX3Nicl9xbWZfcG9zdF9zaHVmZmxlX25lb247CisgICAgICAgIHMtPnFtZl9kZWludF9uZWcgPSBmZl9zYnJfcW1mX2RlaW50X25lZ19uZW9uOworICAgICAgICBzLT5xbWZfZGVpbnRfYmZseSA9IGZmX3Nicl9xbWZfZGVpbnRfYmZseV9uZW9uOworICAgICAgICBzLT5oZl9nX2ZpbHQgPSBmZl9zYnJfaGZfZ19maWx0X25lb247CisgICAgICAgIHMtPmhmX2dlbiA9IGZmX3Nicl9oZl9nZW5fbmVvbjsKKyAgICAgICAgcy0+YXV0b2NvcnJlbGF0ZSA9IGZmX3Nicl9hdXRvY29ycmVsYXRlX25lb247CisgICAgICAgIHMtPmhmX2FwcGx5X25vaXNlWzBdID0gZmZfc2JyX2hmX2FwcGx5X25vaXNlXzBfbmVvbjsKKyAgICAgICAgcy0+aGZfYXBwbHlfbm9pc2VbMV0gPSBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfMV9uZW9uOworICAgICAgICBzLT5oZl9hcHBseV9ub2lzZVsyXSA9IGZmX3Nicl9oZl9hcHBseV9ub2lzZV8yX25lb247CisgICAgICAgIHMtPmhmX2FwcGx5X25vaXNlWzNdID0gZmZfc2JyX2hmX2FwcGx5X25vaXNlXzNfbmVvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvc2JyZHNwX25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9zYnJkc3BfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzcxN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvc2JyZHNwX25lb24uUwpAQCAtMCwwICsxLDMyNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisKK2NvbnN0IGZhY3RvcnMsIGFsaWduPTQKKyAgICAgICAgLmZsb2F0IDEuMCwgLTEuMCwgMS4wLCAtMS4wCitlbmRjb25zdAorCitjb25zdCBwaGlfbm9pc2VfMCwgYWxpZ249NAorICAgICAgICAuZmxvYXQgMS4wLCAwLjAsIDEuMCwgMC4wCitlbmRjb25zdAorCitjb25zdCBwaGlfbm9pc2VfMSwgYWxpZ249NAorICAgICAgICAuZmxvYXQgMC4wLCAgMS4wLCAgMC4wLCAtMS4wCisgICAgICAgIC5mbG9hdCAwLjAsIC0xLjAsICAwLjAsICAxLjAKK2VuZGNvbnN0CisKK2NvbnN0IHBoaV9ub2lzZV8yLCBhbGlnbj00CisgICAgICAgIC5mbG9hdCAtMS4wLCAwLjAsIC0xLjAsIDAuMAorZW5kY29uc3QKKworY29uc3QgcGhpX25vaXNlXzMsIGFsaWduPTQKKyAgICAgICAgLmZsb2F0IDAuMCwgLTEuMCwgIDAuMCwgIDEuMAorICAgICAgICAuZmxvYXQgMC4wLCAgMS4wLCAgMC4wLCAtMS4wCitlbmRjb25zdAorCitmdW5jdGlvbiBmZl9zYnJfc3VtNjR4NV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsIHgwLCAjNjQqNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsIHgwLCAjMTI4KjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgzLCB4MCwgIzE5Mio0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4NCwgeDAsICMyNTYqNAorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICM2NAorMTogICAgICBsZDEgICAgICAgICAgICAge3YwLjRTfSwgW3gwXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRTfSwgW3gxXSwgIzE2CisgICAgICAgIGZhZGQgICAgICAgICAgICB2MC40UywgdjAuNFMsIHYxLjRTCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNFN9LCBbeDJdLCAjMTYKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYwLjRTLCB2MC40UywgdjIuNFMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My40U30sIFt4M10sICMxNgorICAgICAgICBmYWRkICAgICAgICAgICAgdjAuNFMsIHYwLjRTLCB2My40UworICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRTfSwgW3g0XSwgIzE2CisgICAgICAgIGZhZGQgICAgICAgICAgICB2MC40UywgdjAuNFMsIHY0LjRTCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuNFN9LCBbeDBdLCAjMTYKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg1LCB4NSwgIzQKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfc3VtX3NxdWFyZV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3ZpICAgICAgICAgICAgdjAuNFMsICMwCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djEuNFN9LCBbeDBdLCAjMTYKKyAgICAgICAgZm1sYSAgICAgICAgICAgIHYwLjRTLCB2MS40UywgdjEuNFMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHcxLCB3MSwgIzIKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisgICAgICAgIGZhZGRwICAgICAgICAgICB2MC40UywgdjAuNFMsIHYwLjRTCisgICAgICAgIGZhZGRwICAgICAgICAgICB2MC40UywgdjAuNFMsIHYwLjRTCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfbmVnX29kZF82NF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEsIHgwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2NS40UywgIzE8PDcsIGxzbCAjMjQKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MC40UywgdjEuNFN9LCBbeDBdLCAjMzIKKyAgICAgICAgZW9yICAgICAgICAgICAgIHYxLjE2QiwgdjEuMTZCLCB2NS4xNkIKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2Mi40UywgdjMuNFN9LCBbeDBdLCAjMzIKKy5yZXB0IDMKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2MC40UywgdjEuNFN9LCBbeDFdLCAjMzIKKyAgICAgICAgZW9yICAgICAgICAgICAgIHYzLjE2QiwgdjMuMTZCLCB2NS4xNkIKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2MC40UywgdjEuNFN9LCBbeDBdLCAjMzIKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2Mi40UywgdjMuNFN9LCBbeDFdLCAjMzIKKyAgICAgICAgZW9yICAgICAgICAgICAgIHYxLjE2QiwgdjEuMTZCLCB2NS4xNkIKKyAgICAgICAgbGQyICAgICAgICAgICAgIHt2Mi40UywgdjMuNFN9LCBbeDBdLCAjMzIKKy5lbmRyCisgICAgICAgIGVvciAgICAgICAgICAgICB2My4xNkIsIHYzLjE2QiwgdjUuMTZCCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djAuNFMsIHYxLjRTfSwgW3gxXSwgIzMyCisgICAgICAgIHN0MiAgICAgICAgICAgICB7djIuNFMsIHYzLjRTfSwgW3gxXSwgIzMyCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfcW1mX3ByZV9zaHVmZmxlX25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgeDAsICM2MCo0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgeDAsICM2NCo0CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIy0xNgorICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICMtNAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjYuNFMsICMxPDw3LCBsc2wgIzI0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMlN9LCBbeDBdLCAjOAorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjJTfSwgW3gyXSwgIzgKKy5yZXB0IDcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40U30sIFt4MV0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNFN9LCBbeDBdLCAjMTYKKyAgICAgICAgZW9yICAgICAgICAgICAgIHYxLjE2QiwgdjEuMTZCLCB2Ni4xNkIKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYxLjRTLCB2MS40UworICAgICAgICBleHQgICAgICAgICAgICAgdjEuMTZCLCB2MS4xNkIsIHYxLjE2QiwgIzgKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2MS40UywgdjIuNFN9LCBbeDJdLCAjMzIKKy5lbmRyCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgeDEsICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuMlN9LCBbeDFdLCB4NAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjJTfSwgW3gwXSwgIzgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS5TfVszXSwgW3gxXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLlN9WzJdLCBbeDBdCisgICAgICAgIGVvciAgICAgICAgICAgICB2MS4xNkIsIHYxLjE2QiwgdjYuMTZCCisgICAgICAgIHJldjY0ICAgICAgICAgICB2MS40UywgdjEuNFMKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2MS4yUywgdjIuMlN9LCBbeDJdLCAjMTYKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2MS5TLCB2Mi5TfVsyXSwgW3gyXQorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfc2JyX3FtZl9wb3N0X3NodWZmbGVfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCB4MSwgIzYwKjQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAjLTE2CisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIzMyCisgICAgICAgIG1vdmkgICAgICAgICAgICB2Ni40UywgIzE8PDcsIGxzbCAjMjQKKzE6ICAgICAgbGQxICAgICAgICAgICAgIHt2MC40U30sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNFN9LCBbeDFdLCAjMTYKKyAgICAgICAgZW9yICAgICAgICAgICAgIHYwLjE2QiwgdjAuMTZCLCB2Ni4xNkIKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYwLjRTLCB2MC40UworICAgICAgICBleHQgICAgICAgICAgICAgdjAuMTZCLCB2MC4xNkIsIHYwLjE2QiwgIzgKKyAgICAgICAgc3QyICAgICAgICAgICAgIHt2MC40UywgdjEuNFN9LCBbeDBdLCAjMzIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg0LCB4NCwgIzQKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfcW1mX2RlaW50X25lZ19uZW9uLCBleHBvcnQ9MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsIHgxLCAjNTYqNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsIHgwLCAjNjAqNAorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICMtMzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg0LCAjMzIKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYyLjRTLCAjMTw8NywgbHNsICMyNAorMTogICAgICBsZDIgICAgICAgICAgICAge3YwLjRTLCB2MS40U30sIFt4MV0sIHgzCisgICAgICAgIGVvciAgICAgICAgICAgICB2MC4xNkIsIHYwLjE2QiwgdjIuMTZCCisgICAgICAgIHJldjY0ICAgICAgICAgICB2MS40UywgdjEuNFMKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYxLjE2QiwgdjEuMTZCLCB2MS4xNkIsICM4CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuNFN9LCBbeDJdCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuNFN9LCBbeDBdLCAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCB4MiwgIzE2CisgICAgICAgIHN1YnMgICAgICAgICAgICB4NCwgeDQsICM0CisgICAgICAgIGIuZ3QgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfc2JyX3FtZl9kZWludF9iZmx5X25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgeDIsICM2MCo0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MywgeDAsICMxMjQqNAorICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICM2NAorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICMtMTYKKzE6ICAgICAgbGQxICAgICAgICAgICAgIHt2MC40U30sIFt4MV0sICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRTfSwgW3gyXSwgeDUKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYyLjRTLCB2MC40UworICAgICAgICBleHQgICAgICAgICAgICAgdjIuMTZCLCB2Mi4xNkIsIHYyLjE2QiwgIzgKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYzLjRTLCB2MS40UworICAgICAgICBleHQgICAgICAgICAgICAgdjMuMTZCLCB2My4xNkIsIHYzLjE2QiwgIzgKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYxLjRTLCB2MS40UywgdjIuNFMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYwLjRTLCB2MC40UywgdjMuNFMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC40U30sIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjRTfSwgW3gzXSwgeDUKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg0LCB4NCwgIzQKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfaGZfZ2VuX25lb24sIGV4cG9ydD0xCisgICAgICAgIHN4dHcgICAgICAgICAgICB4NCwgdzQKKyAgICAgICAgc3h0dyAgICAgICAgICAgIHg1LCB3NQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDYsIGZhY3RvcnMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40U30sIFt4Nl0KKyAgICAgICAgZHVwICAgICAgICAgICAgIHYxLjRTLCB2MC5TWzBdCisgICAgICAgIG1vdiAgICAgICAgICAgICB2Mi44QiwgdjEuOEIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyLlNbMl0sIHY3LlNbMF0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyLlNbM10sIHY3LlNbMF0KKyAgICAgICAgZm11bCAgICAgICAgICAgIHYxLjRTLCB2MS40UywgdjIuNFMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5EfVswXSwgW3gzXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLkR9WzFdLCBbeDJdCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MC40UywgdjAuNFMsIHYxLjRTCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MS40UywgdjAuNFMsIHY3LjRTCisgICAgICAgIHJldjY0ICAgICAgICAgICB2MC40UywgdjAuNFMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg3LCB4NSwgeDQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCB4MCwgeDQsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDEsIHgxLCB4NCwgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgeDEsICMxNgorMTogICAgICBsZDEgICAgICAgICAgICAge3YyLjRTfSwgW3gxXSwgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuMlN9LCBbeDFdCisgICAgICAgIGZtdWwgICAgICAgICAgICB2NC40UywgdjIuNFMsIHYxLjRTCisgICAgICAgIGZtdWwgICAgICAgICAgICB2NS40UywgdjIuNFMsIHYwLjRTCisgICAgICAgIGZhZGRwICAgICAgICAgICB2NC40UywgdjQuNFMsIHY0LjRTCisgICAgICAgIGZhZGRwICAgICAgICAgICB2NS40UywgdjUuNFMsIHY1LjRTCisgICAgICAgIGZhZGRwICAgICAgICAgICB2NC40UywgdjQuNFMsIHY0LjRTCisgICAgICAgIGZhZGRwICAgICAgICAgICB2NS40UywgdjUuNFMsIHY1LjRTCisgICAgICAgIG1vdiAgICAgICAgICAgICB2NC5TWzFdLCB2NS5TWzBdCisgICAgICAgIGZhZGQgICAgICAgICAgICB2NC4yUywgdjQuMlMsIHYzLjJTCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuMlN9LCBbeDBdLCAjOAorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsIHgxLCAjOAorICAgICAgICBzdWJzICAgICAgICAgICAgeDcsIHg3LCAjMQorICAgICAgICBiLmd0ICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Nicl9oZl9nX2ZpbHRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgc3h0dyAgICAgICAgICAgIHgzLCB3MworICAgICAgICBzeHR3ICAgICAgICAgICAgeDQsIHc0CisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgIzQwKjIqNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsIHgxLCB4NCwgbHNsICMzCisxOiAgICAgIGxkMSAgICAgICAgICAgICB7djAuMlN9LCBbeDFdLCB4NQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLlN9WzBdLCBbeDJdLCAjNAorICAgICAgICBmbXVsICAgICAgICAgICAgdjIuNFMsIHYwLjRTLCB2MS5TWzBdCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuMlN9LCBbeDBdLCAjOAorICAgICAgICBzdWJzICAgICAgICAgICAgeDMsIHgzLCAjMQorICAgICAgICBiLmd0ICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Nicl9hdXRvY29ycmVsYXRlX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MiwgIzM4CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MywgZmFjdG9ycworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRTfSwgW3gzXQorICAgICAgICBtb3ZpICAgICAgICAgICAgdjEuNFMsICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2Mi40UywgIzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYzLjRTLCAjMAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjJTfSwgW3gwXSwgIzgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS4yU30sIFt4MF0sICM4CisgICAgICAgIGZtdWwgICAgICAgICAgICB2MTYuMlMsIHY0LjJTLCB2NC4yUworICAgICAgICBmbXVsICAgICAgICAgICAgdjE3LjJTLCB2NS4yUywgdjQuU1swXQorICAgICAgICBmbXVsICAgICAgICAgICAgdjE4LjJTLCB2NS4yUywgdjQuU1sxXQorMTogICAgICBsZDEgICAgICAgICAgICAge3Y1LkR9WzFdLCBbeDBdLCAjOAorICAgICAgICBmbWxhICAgICAgICAgICAgdjEuMlMsIHY0LjJTLCB2NC4yUworICAgICAgICBmbWxhICAgICAgICAgICAgdjIuNFMsIHY1LjRTLCB2NC5TWzBdCisgICAgICAgIGZtbGEgICAgICAgICAgICB2My40UywgdjUuNFMsIHY0LlNbMV0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHY0LkRbMF0sIHY1LkRbMF0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHY1LkRbMF0sIHY1LkRbMV0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHgyLCB4MiwgIzEKKyAgICAgICAgYi5ndCAgICAgICAgICAgIDFiCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MTkuMlMsIHY0LjJTLCB2NC4yUworICAgICAgICBmbXVsICAgICAgICAgICAgdjIwLjJTLCB2NS4yUywgdjQuU1swXQorICAgICAgICBmbXVsICAgICAgICAgICAgdjIxLjJTLCB2NS4yUywgdjQuU1sxXQorICAgICAgICBmYWRkICAgICAgICAgICAgdjIyLjRTLCB2Mi40UywgdjIwLjRTCisgICAgICAgIGZzdWIgICAgICAgICAgICB2MjIuNFMsIHYyMi40UywgdjE3LjRTCisgICAgICAgIGZhZGQgICAgICAgICAgICB2MjMuNFMsIHYzLjRTLCB2MjEuNFMKKyAgICAgICAgZnN1YiAgICAgICAgICAgIHYyMy40UywgdjIzLjRTLCB2MTguNFMKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYyMy40UywgdjIzLjRTCisgICAgICAgIGZtdWwgICAgICAgICAgICB2MjMuNFMsIHYyMy40UywgdjAuNFMKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyMi40UywgdjIyLjRTLCB2MjMuNFMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuNFN9LCBbeDFdLCAjMTYKKyAgICAgICAgZmFkZCAgICAgICAgICAgIHYyMy4yUywgdjEuMlMsIHYxOS4yUworICAgICAgICBmc3ViICAgICAgICAgICAgdjIzLjJTLCB2MjMuMlMsIHYxNi4yUworICAgICAgICBmYWRkcCAgICAgICAgICAgdjIzLjJTLCB2MjMuMlMsIHYyMy4yUworICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5TfVswXSwgW3gxXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDEsIHgxLCAjOAorICAgICAgICByZXY2NCAgICAgICAgICAgdjMuMlMsIHYzLjJTCisgICAgICAgIGZtdWwgICAgICAgICAgICB2My4yUywgdjMuMlMsIHYwLjJTCisgICAgICAgIGZhZGQgICAgICAgICAgICB2Mi4yUywgdjIuMlMsIHYzLjJTCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuMlN9LCBbeDFdCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgeDEsICMxNgorICAgICAgICBmYWRkcCAgICAgICAgICAgdjEuMlMsIHYxLjJTLCB2MS4yUworICAgICAgICBzdDEgICAgICAgICAgICAge3YxLlN9WzBdLCBbeDFdCisgICAgICAgIHJldAorZW5kZnVuYworCisubWFjcm8gYXBwbHlfbm9pc2VfY29tbW9uCisgICAgICAgIHN4dHcgICAgICAgICAgICB4MywgdzMKKyAgICAgICAgc3h0dyAgICAgICAgICAgIHg1LCB3NQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDcsIFgoZmZfc2JyX25vaXNlX3RhYmxlKQorICAgICAgICBhZGQgICAgICAgICAgICAgeDMsIHgzLCAjMQorMTogICAgICBhbmQgICAgICAgICAgICAgeDMsIHgzLCAjMHgxZmYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg4LCB4NywgeDMsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDMsIHgzLCAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjRTfSwgW3gwXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjJTfSwgW3gxXSwgIzgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC4yU30sIFt4Ml0sICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuNFN9LCBbeDhdCisgICAgICAgIG1vdiAgICAgICAgICAgICB2Ni4xNkIsIHYyLjE2QgorICAgICAgICB6aXAxICAgICAgICAgICAgdjMuNFMsIHYzLjRTLCB2My40UworICAgICAgICB6aXAxICAgICAgICAgICAgdjQuNFMsIHY0LjRTLCB2NC40UworICAgICAgICBmbWxhICAgICAgICAgICAgdjYuNFMsIHYxLjRTLCB2My40UworICAgICAgICBmbWxhICAgICAgICAgICAgdjIuNFMsIHY1LjRTLCB2NC40UworICAgICAgICBmY21lcSAgICAgICAgICAgdjcuNFMsIHYzLjRTLCAjMAorICAgICAgICBiaWYgICAgICAgICAgICAgdjIuMTZCLCB2Ni4xNkIsIHY3LjE2QgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjRTfSwgW3gwXSwgIzE2CisgICAgICAgIHN1YnMgICAgICAgICAgICB4NSwgeDUsICMyCisgICAgICAgIGIuZ3QgICAgICAgICAgICAxYgorLmVuZG0KKworZnVuY3Rpb24gZmZfc2JyX2hmX2FwcGx5X25vaXNlXzBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg5LCBwaGlfbm9pc2VfMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRTfSwgW3g5XQorICAgICAgICBhcHBseV9ub2lzZV9jb21tb24KKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Nicl9oZl9hcHBseV9ub2lzZV8xX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4OSwgcGhpX25vaXNlXzEKKyAgICAgICAgYW5kICAgICAgICAgICAgIHg0LCB4NCwgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg5LCB4OSwgeDQsIGxzbCAjNAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjRTfSwgW3g5XQorICAgICAgICBhcHBseV9ub2lzZV9jb21tb24KKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Nicl9oZl9hcHBseV9ub2lzZV8yX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4OSwgcGhpX25vaXNlXzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40U30sIFt4OV0KKyAgICAgICAgYXBwbHlfbm9pc2VfY29tbW9uCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl9zYnJfaGZfYXBwbHlfbm9pc2VfM19uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDksIHBoaV9ub2lzZV8zCisgICAgICAgIGFuZCAgICAgICAgICAgICB4NCwgeDQsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICB4OSwgeDksIHg0LCBsc2wgIzQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40U30sIFt4OV0KKyAgICAgICAgYXBwbHlfbm9pc2VfY29tbW9uCisgICAgICAgIHJldAorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L3NpbXBsZV9pZGN0X25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9zaW1wbGVfaWRjdF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0ZDAyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9zaW1wbGVfaWRjdF9uZW9uLlMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBBUk0gTkVPTiBJRENUCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IE1hbnMgUnVsbGdhcmQgPG1hbnNAbWFuc3IuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDE3IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uQGdtYWlsLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBTaW1wbGUgSURDVAorICogQ29weXJpZ2h0IChjKSAyMDAxIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKworI2RlZmluZSBaMSAgMjI3MjUgIC8vY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41CisjZGVmaW5lIFoyICAyMTQwNyAgLy9jb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUKKyNkZWZpbmUgWjMgIDE5MjY2ICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBaNCAgMTYzODMgIC8vY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41CisjZGVmaW5lIFo1ICAxMjg3MyAgLy9jb3MoaSpNX1BJLzE2KSpzcXJ0KDIpKigxPDwxNCkgKyAwLjUKKyNkZWZpbmUgWjYgIDg4NjcgICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorI2RlZmluZSBaNyAgNDUyMCAgIC8vY29zKGkqTV9QSS8xNikqc3FydCgyKSooMTw8MTQpICsgMC41CisjZGVmaW5lIFo0YyAoKDE8PChDT0xfU0hJRlQtMSkpL1o0KQorI2RlZmluZSBST1dfU0hJRlQgMTEKKyNkZWZpbmUgQ09MX1NISUZUIDIwCisKKyNkZWZpbmUgejEgdjAuSFswXQorI2RlZmluZSB6MiB2MC5IWzFdCisjZGVmaW5lIHozIHYwLkhbMl0KKyNkZWZpbmUgejQgdjAuSFszXQorI2RlZmluZSB6NSB2MC5IWzRdCisjZGVmaW5lIHo2IHYwLkhbNV0KKyNkZWZpbmUgejcgdjAuSFs2XQorI2RlZmluZSB6NGMgdjAuSFs3XQorCitjb25zdCAgIGlkY3RfY29lZmZfbmVvbiwgYWxpZ249NAorICAgICAgICAuc2hvcnQgWjEsIFoyLCBaMywgWjQsIFo1LCBaNiwgWjcsIFo0YworZW5kY29uc3QKKworLm1hY3JvIGlkY3Rfc3RhcnQgZGF0YQorICAgICAgICBwcmZtICAgICAgICAgICAgcGxkbDFrZWVwLCBbXGRhdGFdCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsIHgzMAorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDMsIGlkY3RfY29lZmZfbmVvbgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjJEfSwgW3gzXQorLmVuZG0KKworLm1hY3JvIGlkY3RfZW5kCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKKy5lbmRtCisKKy5tYWNybyBzbXVsbDEgYSwgYiwgYworICAgICAgICBzbXVsbCAgICAgICAgICAgXGEsIFxiLCBcYworLmVuZG0KKworLm1hY3JvIHNtbGFsMSBhLCBiLCBjCisgICAgICAgIHNtbGFsICAgICAgICAgICBcYSwgXGIsIFxjCisuZW5kbQorCisubWFjcm8gc21sc2wxIGEsIGIsIGMKKyAgICAgICAgc21sc2wgICAgICAgICAgIFxhLCBcYiwgXGMKKy5lbmRtCisKKy5tYWNybyBpZGN0X2NvbDRfdG9wIHkxLCB5MiwgeTMsIHk0LCBpLCBsCisgICAgICAgIHNtdWxsXGkgICAgICAgICB2Ny40UywgIFx5M1xsLCB6MgorICAgICAgICBzbXVsbFxpICAgICAgICAgdjE2LjRTLCBceTNcbCwgejYKKyAgICAgICAgc211bGxcaSAgICAgICAgIHYxNy40UywgXHkyXGwsIHoxCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTkuNFMsIHYyMy40UywgdjcuNFMKKyAgICAgICAgc211bGxcaSAgICAgICAgIHYxOC40UywgXHkyXGwsIHozCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjAuNFMsIHYyMy40UywgdjE2LjRTCisgICAgICAgIHNtdWxsXGkgICAgICAgICB2NS40UywgIFx5MlxsLCB6NQorICAgICAgICBzdWIgICAgICAgICAgICAgdjIxLjRTLCB2MjMuNFMsIHYxNi40UworICAgICAgICBzbXVsbFxpICAgICAgICAgdjYuNFMsICBceTJcbCwgejcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYyMi40UywgdjIzLjRTLCB2Ny40UworCisgICAgICAgIHNtbGFsXGkgICAgICAgICB2MTcuNFMsIFx5NFxsLCB6MworICAgICAgICBzbWxzbFxpICAgICAgICAgdjE4LjRTLCBceTRcbCwgejcKKyAgICAgICAgc21sc2xcaSAgICAgICAgIHY1LjRTLCAgXHk0XGwsIHoxCisgICAgICAgIHNtbHNsXGkgICAgICAgICB2Ni40UywgIFx5NFxsLCB6NQorLmVuZG0KKworLm1hY3JvIGlkY3Rfcm93NF9uZW9uIHkxLCB5MiwgeTMsIHk0LCBwYXNzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7XHkxXCgpLjJELFx5MlwoKS4yRH0sIFt4Ml0sICMzMgorICAgICAgICBtb3ZpICAgICAgICAgICAgdjIzLjRTLCAjMTw8MiwgbHNsICM4CisgICAgICAgIG9yciAgICAgICAgICAgICB2NS4xNkIsIFx5MVwoKS4xNkIsIFx5MlwoKS4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtceTNcKCkuMkQsXHk0XCgpLjJEfSwgW3gyXSwgIzMyCisgICAgICAgIG9yciAgICAgICAgICAgICB2Ni4xNkIsIFx5M1woKS4xNkIsIFx5NFwoKS4xNkIKKyAgICAgICAgb3JyICAgICAgICAgICAgIHY1LjE2QiwgdjUuMTZCLCB2Ni4xNkIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCB2NS5EWzFdCisgICAgICAgIHNtbGFsICAgICAgICAgICB2MjMuNFMsIFx5MVwoKS40SCwgejQKKworICAgICAgICBpZGN0X2NvbDRfdG9wICAgXHkxLCBceTIsIFx5MywgXHk0LCAxLCAuNEgKKworICAgICAgICBjbXAgICAgICAgICAgICAgeDMsICMwCisgICAgICAgIGIuZXEgICAgICAgICAgICBccGFzc1woKWYKKworICAgICAgICBzbXVsbDIgICAgICAgICAgdjcuNFMsIFx5MVwoKS44SCwgejQKKyAgICAgICAgc21sYWwyICAgICAgICAgIHYxNy40UywgXHkyXCgpLjhILCB6NQorICAgICAgICBzbWxzbDIgICAgICAgICAgdjE4LjRTLCBceTJcKCkuOEgsIHoxCisgICAgICAgIHNtdWxsMiAgICAgICAgICB2MTYuNFMsIFx5M1woKS44SCwgejIKKyAgICAgICAgc21sYWwyICAgICAgICAgIHY1LjRTLCBceTJcKCkuOEgsIHo3CisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTkuNFMsIHYxOS40UywgdjcuNFMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYyMC40UywgdjIwLjRTLCB2Ny40UworICAgICAgICBzdWIgICAgICAgICAgICAgdjIxLjRTLCB2MjEuNFMsIHY3LjRTCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjIuNFMsIHYyMi40UywgdjcuNFMKKyAgICAgICAgc21sYWwyICAgICAgICAgIHY2LjRTLCBceTJcKCkuOEgsIHozCisgICAgICAgIHNtdWxsMiAgICAgICAgICB2Ny40UywgXHkzXCgpLjhILCB6NgorICAgICAgICBzbWxhbDIgICAgICAgICAgdjE3LjRTLCBceTRcKCkuOEgsIHo3CisgICAgICAgIHNtbHNsMiAgICAgICAgICB2MTguNFMsIFx5NFwoKS44SCwgejUKKyAgICAgICAgc21sYWwyICAgICAgICAgIHY1LjRTLCBceTRcKCkuOEgsIHozCisgICAgICAgIHNtbHNsMiAgICAgICAgICB2Ni40UywgXHk0XCgpLjhILCB6MQorICAgICAgICBhZGQgICAgICAgICAgICAgdjE5LjRTLCB2MTkuNFMsIHY3LjRTCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjAuNFMsIHYyMC40UywgdjE2LjRTCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjEuNFMsIHYyMS40UywgdjE2LjRTCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjIuNFMsIHYyMi40UywgdjcuNFMKKworXHBhc3M6ICBhZGQgICAgICAgICAgICAgXHkzXCgpLjRTLCB2MTkuNFMsIHYxNy40UworICAgICAgICBhZGQgICAgICAgICAgICAgXHk0XCgpLjRTLCB2MjAuNFMsIHYxOC40UworICAgICAgICBzaHJuICAgICAgICAgICAgXHkxXCgpLjRILCBceTNcKCkuNFMsICNST1dfU0hJRlQKKyAgICAgICAgc2hybiAgICAgICAgICAgIFx5MlwoKS40SCwgXHk0XCgpLjRTLCAjUk9XX1NISUZUCisgICAgICAgIGFkZCAgICAgICAgICAgICB2Ny40UywgdjIxLjRTLCB2NS40UworICAgICAgICBhZGQgICAgICAgICAgICAgdjE2LjRTLCB2MjIuNFMsIHY2LjRTCisgICAgICAgIHNocm4gICAgICAgICAgICBceTNcKCkuNEgsIHY3LjRTLCAjUk9XX1NISUZUCisgICAgICAgIHNocm4gICAgICAgICAgICBceTRcKCkuNEgsIHYxNi40UywgI1JPV19TSElGVAorICAgICAgICBzdWIgICAgICAgICAgICAgdjIyLjRTLCB2MjIuNFMsIHY2LjRTCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTkuNFMsIHYxOS40UywgdjE3LjRTCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjEuNFMsIHYyMS40UywgdjUuNFMKKyAgICAgICAgc2hybjIgICAgICAgICAgIFx5MVwoKS44SCwgdjIyLjRTLCAjUk9XX1NISUZUCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjAuNFMsIHYyMC40UywgdjE4LjRTCisgICAgICAgIHNocm4yICAgICAgICAgICBceTJcKCkuOEgsIHYyMS40UywgI1JPV19TSElGVAorICAgICAgICBzaHJuMiAgICAgICAgICAgXHkzXCgpLjhILCB2MjAuNFMsICNST1dfU0hJRlQKKyAgICAgICAgc2hybjIgICAgICAgICAgIFx5NFwoKS44SCwgdjE5LjRTLCAjUk9XX1NISUZUCisKKyAgICAgICAgdHJuMSAgICAgICAgICAgIHYxNi44SCwgXHkxXCgpLjhILCBceTJcKCkuOEgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIHYxNy44SCwgXHkxXCgpLjhILCBceTJcKCkuOEgKKyAgICAgICAgdHJuMSAgICAgICAgICAgIHYxOC44SCwgXHkzXCgpLjhILCBceTRcKCkuOEgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIHYxOS44SCwgXHkzXCgpLjhILCBceTRcKCkuOEgKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFx5MVwoKS40UywgdjE2LjRTLCB2MTguNFMKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFx5MlwoKS40UywgdjE3LjRTLCB2MTkuNFMKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFx5M1woKS40UywgdjE2LjRTLCB2MTguNFMKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFx5NFwoKS40UywgdjE3LjRTLCB2MTkuNFMKKy5lbmRtCisKKy5tYWNybyBkZWNsYXJlX2lkY3RfY29sNF9uZW9uIGksIGwKK2Z1bmN0aW9uIGlkY3RfY29sNF9uZW9uXGkKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYyMy40SCwgejRjCisuaWYgXGkgPT0gMQorICAgICAgICBhZGQgICAgICAgICAgICAgdjIzLjRILCB2MjMuNEgsIHYyNC40SAorLmVsc2UKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY1LkRbMF0sIHYyNC5EWzFdCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjMuNEgsIHYyMy40SCwgdjUuNEgKKy5lbmRpZgorICAgICAgICBzbXVsbCAgICAgICAgICAgdjIzLjRTLCB2MjMuNEgsIHo0CisKKyAgICAgICAgaWRjdF9jb2w0X3RvcCAgIHYyNCwgdjI1LCB2MjYsIHYyNywgXGksIFxsCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg0LCB2MjguRFtcaSAtIDFdCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgdjI5LkRbXGkgLSAxXQorICAgICAgICBjbXAgICAgICAgICAgICAgeDQsICMwCisgICAgICAgIGIuZXEgICAgICAgICAgICAxZgorCisgICAgICAgIHNtdWxsXGkgICAgICAgICB2Ny40UywgIHYyOFxsLCAgejQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOS40UywgdjE5LjRTLCB2Ny40UworICAgICAgICBzdWIgICAgICAgICAgICAgdjIwLjRTLCB2MjAuNFMsIHY3LjRTCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjEuNFMsIHYyMS40UywgdjcuNFMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYyMi40UywgdjIyLjRTLCB2Ny40UworCisxOiAgICAgIG1vdiAgICAgICAgICAgICB4NCwgdjMwLkRbXGkgLSAxXQorICAgICAgICBjbXAgICAgICAgICAgICAgeDUsICMwCisgICAgICAgIGIuZXEgICAgICAgICAgICAyZgorCisgICAgICAgIHNtbGFsXGkgICAgICAgICB2MTcuNFMsIHYyOVxsLCB6NQorICAgICAgICBzbWxzbFxpICAgICAgICAgdjE4LjRTLCB2MjlcbCwgejEKKyAgICAgICAgc21sYWxcaSAgICAgICAgIHY1LjRTLCAgdjI5XGwsIHo3CisgICAgICAgIHNtbGFsXGkgICAgICAgICB2Ni40UywgIHYyOVxsLCB6MworCisyOiAgICAgIG1vdiAgICAgICAgICAgICB4NSwgdjMxLkRbXGkgLSAxXQorICAgICAgICBjbXAgICAgICAgICAgICAgeDQsICMwCisgICAgICAgIGIuZXEgICAgICAgICAgICAzZgorCisgICAgICAgIHNtdWxsXGkgICAgICAgICB2Ny40UywgIHYzMFxsLCB6NgorICAgICAgICBzbXVsbFxpICAgICAgICAgdjE2LjRTLCB2MzBcbCwgejIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOS40UywgdjE5LjRTLCB2Ny40UworICAgICAgICBzdWIgICAgICAgICAgICAgdjIyLjRTLCB2MjIuNFMsIHY3LjRTCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjAuNFMsIHYyMC40UywgdjE2LjRTCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjEuNFMsIHYyMS40UywgdjE2LjRTCisKKzM6ICAgICAgY21wICAgICAgICAgICAgIHg1LCAjMAorICAgICAgICBiLmVxICAgICAgICAgICAgNGYKKworICAgICAgICBzbWxhbFxpICAgICAgICAgdjE3LjRTLCB2MzFcbCwgejcKKyAgICAgICAgc21sc2xcaSAgICAgICAgIHYxOC40UywgdjMxXGwsIHo1CisgICAgICAgIHNtbGFsXGkgICAgICAgICB2NS40UywgIHYzMVxsLCB6MworICAgICAgICBzbWxzbFxpICAgICAgICAgdjYuNFMsICB2MzFcbCwgejEKKworNDogICAgICBhZGRobiAgICAgICAgICAgdjcuNEgsIHYxOS40UywgdjE3LjRTCisgICAgICAgIGFkZGhuMiAgICAgICAgICB2Ny44SCwgdjIwLjRTLCB2MTguNFMKKyAgICAgICAgc3ViaG4gICAgICAgICAgIHYxOC40SCwgdjIwLjRTLCB2MTguNFMKKyAgICAgICAgc3ViaG4yICAgICAgICAgIHYxOC44SCwgdjE5LjRTLCB2MTcuNFMKKworICAgICAgICBhZGRobiAgICAgICAgICAgdjE2LjRILCB2MjEuNFMsIHY1LjRTCisgICAgICAgIGFkZGhuMiAgICAgICAgICB2MTYuOEgsIHYyMi40UywgdjYuNFMKKyAgICAgICAgc3ViaG4gICAgICAgICAgIHYxNy40SCwgdjIyLjRTLCB2Ni40UworICAgICAgICBzdWJobjIgICAgICAgICAgdjE3LjhILCB2MjEuNFMsIHY1LjRTCisKKyAgICAgICAgcmV0CitlbmRmdW5jCisuZW5kbQorCitkZWNsYXJlX2lkY3RfY29sNF9uZW9uIDEsIC40SAorZGVjbGFyZV9pZGN0X2NvbDRfbmVvbiAyLCAuOEgKKworZnVuY3Rpb24gZmZfc2ltcGxlX2lkY3RfcHV0X25lb24sIGV4cG9ydD0xCisgICAgICAgIGlkY3Rfc3RhcnQgICAgICB4MgorCisgICAgICAgIGlkY3Rfcm93NF9uZW9uICB2MjQsIHYyNSwgdjI2LCB2MjcsIDEKKyAgICAgICAgaWRjdF9yb3c0X25lb24gIHYyOCwgdjI5LCB2MzAsIHYzMSwgMgorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X25lb24xCisKKyAgICAgICAgc3FzaHJ1biAgICAgICAgIHYxLjhCLCAgdjcuOEgsICNDT0xfU0hJRlQtMTYKKyAgICAgICAgc3FzaHJ1bjIgICAgICAgIHYxLjE2QiwgdjE2LjhILCAjQ09MX1NISUZULTE2CisgICAgICAgIHNxc2hydW4gICAgICAgICB2My44QiwgIHYxNy44SCwgI0NPTF9TSElGVC0xNgorICAgICAgICBzcXNocnVuMiAgICAgICAgdjMuMTZCLCB2MTguOEgsICNDT0xfU0hJRlQtMTYKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X25lb24yCisKKyAgICAgICAgc3FzaHJ1biAgICAgICAgIHYyLjhCLCAgdjcuOEgsICNDT0xfU0hJRlQtMTYKKyAgICAgICAgc3FzaHJ1bjIgICAgICAgIHYyLjE2QiwgdjE2LjhILCAjQ09MX1NISUZULTE2CisgICAgICAgIHNxc2hydW4gICAgICAgICB2NC44QiwgIHYxNy44SCwgI0NPTF9TSElGVC0xNgorICAgICAgICBzcXNocnVuMiAgICAgICAgdjQuMTZCLCB2MTguOEgsICNDT0xfU0hJRlQtMTYKKworICAgICAgICB6aXAxICAgICAgICAgICAgdjE2LjRTLCB2MS40UywgdjIuNFMKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYxNy40UywgdjEuNFMsIHYyLjRTCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuRH1bMF0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LkR9WzFdLCBbeDBdLCB4MQorCisgICAgICAgIHppcDEgICAgICAgICAgICB2MTguNFMsIHYzLjRTLCB2NC40UworICAgICAgICB6aXAyICAgICAgICAgICAgdjE5LjRTLCB2My40UywgdjQuNFMKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy5EfVswXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTcuRH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE4LkR9WzBdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxOC5EfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTkuRH1bMF0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE5LkR9WzFdLCBbeDBdLCB4MQorCisgICAgICAgIGlkY3RfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBpZGN0X3N0YXJ0ICAgICAgeDIKKworICAgICAgICBpZGN0X3JvdzRfbmVvbiAgdjI0LCB2MjUsIHYyNiwgdjI3LCAxCisgICAgICAgIGlkY3Rfcm93NF9uZW9uICB2MjgsIHYyOSwgdjMwLCB2MzEsIDIKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3RfY29sNF9uZW9uMQorCisgICAgICAgIHNzaHIgICAgICAgICAgICB2MS44SCwgdjcuOEgsICNDT0xfU0hJRlQtMTYKKyAgICAgICAgc3NociAgICAgICAgICAgIHYyLjhILCB2MTYuOEgsICNDT0xfU0hJRlQtMTYKKyAgICAgICAgc3NociAgICAgICAgICAgIHYzLjhILCB2MTcuOEgsICNDT0xfU0hJRlQtMTYKKyAgICAgICAgc3NociAgICAgICAgICAgIHY0LjhILCB2MTguOEgsICNDT0xfU0hJRlQtMTYKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdF9jb2w0X25lb24yCisKKyAgICAgICAgc3NociAgICAgICAgICAgIHY3LjhILCB2Ny44SCwgI0NPTF9TSElGVC0xNgorICAgICAgICBzc2hyICAgICAgICAgICAgdjE2LjhILCB2MTYuOEgsICNDT0xfU0hJRlQtMTYKKyAgICAgICAgc3NociAgICAgICAgICAgIHYxNy44SCwgdjE3LjhILCAjQ09MX1NISUZULTE2CisgICAgICAgIHNzaHIgICAgICAgICAgICB2MTguOEgsIHYxOC44SCwgI0NPTF9TSElGVC0xNgorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OSwgIHgwCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LkR9WzBdLCBbeDBdLCB4MQorICAgICAgICB6aXAxICAgICAgICAgICAgdjIzLjJELCB2MS4yRCwgdjcuMkQKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYyNC4yRCwgdjEuMkQsIHY3LjJECisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LkR9WzFdLCBbeDBdLCB4MQorICAgICAgICB6aXAxICAgICAgICAgICAgdjI1LjJELCB2Mi4yRCwgdjE2LjJECisgICAgICAgIHppcDIgICAgICAgICAgICB2MjYuMkQsIHYyLjJELCB2MTYuMkQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuRH1bMF0sIFt4MF0sIHgxCisgICAgICAgIHppcDEgICAgICAgICAgICB2MjcuMkQsIHYzLjJELCB2MTcuMkQKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYyOC4yRCwgdjMuMkQsIHYxNy4yRAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC5EfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgemlwMSAgICAgICAgICAgIHYyOS4yRCwgdjQuMkQsIHYxOC4yRAorICAgICAgICB6aXAyICAgICAgICAgICAgdjMwLjJELCB2NC4yRCwgdjE4LjJECisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLkR9WzBdLCBbeDBdLCB4MQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjIzLjhILCB2MjMuOEgsIHYxOS44QgorICAgICAgICB1YWRkdzIgICAgICAgICAgdjI0LjhILCB2MjQuOEgsIHYxOS4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuRH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MjMuOEIsIHYyMy44SAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjIzLjE2QiwgdjI0LjhICisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLkR9WzBdLCBbeDBdLCB4MQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjI0LjhILCB2MjUuOEgsIHYyMC44QgorICAgICAgICB1YWRkdzIgICAgICAgICAgdjI1LjhILCB2MjYuOEgsIHYyMC4xNkIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuRH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MjQuOEIsIHYyNC44SAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjI0LjE2QiwgdjI1LjhICisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLkR9WzBdLCBbeDldLCB4MQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjI1LjhILCB2MjcuOEgsIHYyMS44QgorICAgICAgICB1YWRkdzIgICAgICAgICAgdjI2LjhILCB2MjguOEgsIHYyMS4xNkIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuRH1bMV0sIFt4OV0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MjUuOEIsIHYyNS44SAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjI1LjE2QiwgdjI2LjhICisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LkR9WzBdLCBbeDldLCB4MQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjI2LjhILCB2MjkuOEgsIHYyMi44QgorICAgICAgICB1YWRkdzIgICAgICAgICAgdjI3LjhILCB2MzAuOEgsIHYyMi4xNkIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuRH1bMV0sIFt4OV0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MjYuOEIsIHYyNi44SAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjI2LjE2QiwgdjI3LjhICisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LkR9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5EfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjYuRH1bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI2LkR9WzFdLCBbeDldLCB4MQorCisgICAgICAgIGlkY3RfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X25lb24sIGV4cG9ydD0xCisgICAgICAgIGlkY3Rfc3RhcnQgICAgICB4MAorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MiwgIHgwCisgICAgICAgIGlkY3Rfcm93NF9uZW9uICB2MjQsIHYyNSwgdjI2LCB2MjcsIDEKKyAgICAgICAgaWRjdF9yb3c0X25lb24gIHYyOCwgdjI5LCB2MzAsIHYzMSwgMgorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsIHgyLCAjMTI4CisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0X2NvbDRfbmVvbjEKKworICAgICAgICBzc2hyICAgICAgICAgICAgdjEuOEgsIHY3LjhILCAjQ09MX1NISUZULTE2CisgICAgICAgIHNzaHIgICAgICAgICAgICB2Mi44SCwgdjE2LjhILCAjQ09MX1NISUZULTE2CisgICAgICAgIHNzaHIgICAgICAgICAgICB2My44SCwgdjE3LjhILCAjQ09MX1NISUZULTE2CisgICAgICAgIHNzaHIgICAgICAgICAgICB2NC44SCwgdjE4LjhILCAjQ09MX1NISUZULTE2CisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3RfY29sNF9uZW9uMgorCisgICAgICAgIHNzaHIgICAgICAgICAgICB2Ny44SCwgdjcuOEgsICNDT0xfU0hJRlQtMTYKKyAgICAgICAgc3NociAgICAgICAgICAgIHYxNi44SCwgdjE2LjhILCAjQ09MX1NISUZULTE2CisgICAgICAgIHNzaHIgICAgICAgICAgICB2MTcuOEgsIHYxNy44SCwgI0NPTF9TSElGVC0xNgorICAgICAgICBzc2hyICAgICAgICAgICAgdjE4LjhILCB2MTguOEgsICNDT0xfU0hJRlQtMTYKKworICAgICAgICB6aXAxICAgICAgICAgICAgdjIzLjJELCB2MS4yRCwgdjcuMkQKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYyNC4yRCwgdjEuMkQsIHY3LjJECisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjJELHYyNC4yRH0sIFt4Ml0sICMzMgorICAgICAgICB6aXAxICAgICAgICAgICAgdjI1LjJELCB2Mi4yRCwgdjE2LjJECisgICAgICAgIHppcDIgICAgICAgICAgICB2MjYuMkQsIHYyLjJELCB2MTYuMkQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuMkQsdjI2LjJEfSwgW3gyXSwgIzMyCisgICAgICAgIHppcDEgICAgICAgICAgICB2MjcuMkQsIHYzLjJELCB2MTcuMkQKKyAgICAgICAgemlwMiAgICAgICAgICAgIHYyOC4yRCwgdjMuMkQsIHYxNy4yRAorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNy4yRCx2MjguMkR9LCBbeDJdLCAjMzIKKyAgICAgICAgemlwMSAgICAgICAgICAgIHYyOS4yRCwgdjQuMkQsIHYxOC4yRAorICAgICAgICB6aXAyICAgICAgICAgICAgdjMwLjJELCB2NC4yRCwgdjE4LjJECisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI5LjJELHYzMC4yRH0sIFt4Ml0sICMzMgorCisgICAgICAgIGlkY3RfZW5kCitlbmRmdW5jCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvc3ludGhfZmlsdGVyX25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9zeW50aF9maWx0ZXJfbmVvbi5TCmluZGV4IDY1NTUxY2IuLjhmY2Q3MWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWFyY2g2NC9zeW50aF9maWx0ZXJfbmVvbi5TCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC9zeW50aF9maWx0ZXJfbmVvbi5TCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgxLCAgeDcsICBsc2wgIzIgICAvLyBzeW50aF9idWYKICAgICAgICAgc3ViICAgICAgICAgICAgIHc4LCAgdzcsICAjMzIKICAgICAgICAgc3RwICAgICAgICAgICAgIHg1LCAgeDEsICBbc3AsICMxNl0KLSAgICAgICAgYmljICAgICAgICAgICAgIHg3LCAgeDcsICAjNjMKKyAgICAgICAgYW5kICAgICAgICAgICAgIHg3LCAgeDcsICAjfjYzCiAgICAgICAgIGFuZCAgICAgICAgICAgICB3OCwgIHc4LCAgIzUxMQogICAgICAgICBzdHAgICAgICAgICAgICAgeDcsICB4MzAsIFtzcCwgIzMyXQogICAgICAgICBzdHIgICAgICAgICAgICAgdzgsICBbeDJdCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvdmMxZHNwX2luaXRfYWFyY2g2NC5jIGIvbGliYXZjb2RlYy9hYXJjaDY0L3ZjMWRzcF9pbml0X2FhcmNoNjQuYwppbmRleCBlNTllNTVlLi4xM2RmZDc0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FhcmNoNjQvdmMxZHNwX2luaXRfYWFyY2g2NC5jCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92YzFkc3BfaW5pdF9hYXJjaDY0LmMKQEAgLTI1LDE0ICsyNSwxNCBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLXZvaWQgZmZfcHV0X3ZjMV9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwotdm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX3B1dF92YzFfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KTsKLXZvaWQgZmZfYXZnX3ZjMV9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9wdXRfdmMxX2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX2F2Z192YzFfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfcHV0X3ZjMV9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKIGF2X2NvbGQgdm9pZCBmZl92YzFkc3BfaW5pdF9hYXJjaDY0KFZDMURTUENvbnRleHQgKmRzcCkKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlkc3BfaW5pdC5oIGIvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOWRzcF9pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmMTc1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlkc3BfaW5pdC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgR29vZ2xlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0FBUkNINjRfVlA5RFNQX0lOSVRfSAorI2RlZmluZSBBVkNPREVDX0FBUkNINjRfVlA5RFNQX0lOSVRfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDlkc3AuaCIKKwordm9pZCBmZl92cDlkc3BfaW5pdF8xMGJwcF9hYXJjaDY0KFZQOURTUENvbnRleHQgKmRzcCk7Cit2b2lkIGZmX3ZwOWRzcF9pbml0XzEyYnBwX2FhcmNoNjQoVlA5RFNQQ29udGV4dCAqZHNwKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUFSQ0g2NF9WUDlEU1BfSU5JVF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvdnA5ZHNwX2luaXRfMTBicHBfYWFyY2g2NC5jIGIvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOWRzcF9pbml0XzEwYnBwX2FhcmNoNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmEwZDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOWRzcF9pbml0XzEwYnBwX2FhcmNoNjQuYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IEdvb2dsZSBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgQlBQIDEwCisjZGVmaW5lIElOSVRfRlVOQyBmZl92cDlkc3BfaW5pdF8xMGJwcF9hYXJjaDY0CisjaW5jbHVkZSAidnA5ZHNwX2luaXRfMTZicHBfYWFyY2g2NF90ZW1wbGF0ZS5jIgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOWRzcF9pbml0XzEyYnBwX2FhcmNoNjQuYyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlkc3BfaW5pdF8xMmJwcF9hYXJjaDY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFlMjIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlkc3BfaW5pdF8xMmJwcF9hYXJjaDY0LmMKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIEJQUCAxMgorI2RlZmluZSBJTklUX0ZVTkMgZmZfdnA5ZHNwX2luaXRfMTJicHBfYWFyY2g2NAorI2luY2x1ZGUgInZwOWRzcF9pbml0XzE2YnBwX2FhcmNoNjRfdGVtcGxhdGUuYyIKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlkc3BfaW5pdF8xNmJwcF9hYXJjaDY0X3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2FhcmNoNjQvdnA5ZHNwX2luaXRfMTZicHBfYWFyY2g2NF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkY2ZkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvdnA5ZHNwX2luaXRfMTZicHBfYWFyY2g2NF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IEdvb2dsZSBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgiCisjaW5jbHVkZSAidnA5ZHNwX2luaXQuaCIKKworI2RlZmluZSBkZWNsYXJlX2ZwZWwodHlwZSwgc3osIHN1ZmZpeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOV8jI3R5cGUjI3N6IyNzdWZmaXgjI19uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpCisKKyNkZWZpbmUgZGVjbF9tY19mdW5jKG9wLCBmaWx0ZXIsIGRpciwgc3osIGJwcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOV8jI29wIyNfIyNmaWx0ZXIjI3N6IyNfIyNkaXIjI18jI2JwcCMjX25lb24odWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpCisKKyNkZWZpbmUgZGVmaW5lXzh0YXBfMmRfZm4ob3AsIGZpbHRlciwgc3osIGJwcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIG9wIyNfIyNmaWx0ZXIjI3N6IyNfaHZfIyNicHAjI19uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIHRlbXAsIFsoKDEgKyAoc3ogPCA2NCkpICogc3ogKyA4KSAqIHN6ICogMl0pOyAgICAgICAgIFwKKyAgICAvKiBXZSBvbmx5IG5lZWQgaCArIDcgbGluZXMsIGJ1dCB0aGUgaG9yaXpvbnRhbCBmaWx0ZXIgYXNzdW1lcyBhbiAgICAgICAgICAgICAgIFwKKyAgICAgKiBldmVuIG51bWJlciBvZiByb3dzLCBzbyBmaWx0ZXIgaCArIDggbGluZXMgaGVyZS4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl92cDlfcHV0XyMjZmlsdGVyIyNzeiMjX2hfIyNicHAjI19uZW9uKHRlbXAsIDIgKiBzeiwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIDMgKiBzcmNfc3RyaWRlLCBzcmNfc3RyaWRlLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKyA4LCBteCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl92cDlfIyNvcCMjXyMjZmlsdGVyIyNzeiMjX3ZfIyNicHAjI19uZW9uKGRzdCwgZHN0X3N0cmlkZSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKyAzICogMiAqIHN6LCAyICogc3osICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgsIDAsIG15KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBkZWNsX2ZpbHRlcl9mdW5jcyhvcCwgZGlyLCBzeiwgYnBwKSAgXAorICAgIGRlY2xfbWNfZnVuYyhvcCwgcmVndWxhciwgZGlyLCBzeiwgYnBwKTsgXAorICAgIGRlY2xfbWNfZnVuYyhvcCwgc2hhcnAsICAgZGlyLCBzeiwgYnBwKTsgXAorICAgIGRlY2xfbWNfZnVuYyhvcCwgc21vb3RoLCAgZGlyLCBzeiwgYnBwKQorCisjZGVmaW5lIGRlY2xfbWNfZnVuY3Moc3osIGJwcCkgICAgICAgICAgIFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhwdXQsIGgsICBzeiwgYnBwKTsgXAorICAgIGRlY2xfZmlsdGVyX2Z1bmNzKGF2ZywgaCwgIHN6LCBicHApOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MocHV0LCB2LCAgc3osIGJwcCk7IFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhhdmcsIHYsICBzeiwgYnBwKTsgXAorICAgIGRlY2xfZmlsdGVyX2Z1bmNzKHB1dCwgaHYsIHN6LCBicHApOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MoYXZnLCBodiwgc3osIGJwcCkKKworI2RlZmluZSBmZl92cDlfY29weTMyX25lb24gIGZmX3ZwOV9jb3B5MzJfYWFyY2g2NAorI2RlZmluZSBmZl92cDlfY29weTY0X25lb24gIGZmX3ZwOV9jb3B5NjRfYWFyY2g2NAorI2RlZmluZSBmZl92cDlfY29weTEyOF9uZW9uIGZmX3ZwOV9jb3B5MTI4X2FhcmNoNjQKKworZGVjbGFyZV9mcGVsKGNvcHksIDEyOCwgKTsKK2RlY2xhcmVfZnBlbChjb3B5LCA2NCwgICk7CitkZWNsYXJlX2ZwZWwoY29weSwgMzIsICApOworZGVjbGFyZV9mcGVsKGNvcHksIDE2LCAgKTsKK2RlY2xhcmVfZnBlbChjb3B5LCA4LCAgICk7CitkZWNsYXJlX2ZwZWwoYXZnLCA2NCwgXzE2KTsKK2RlY2xhcmVfZnBlbChhdmcsIDMyLCBfMTYpOworZGVjbGFyZV9mcGVsKGF2ZywgMTYsIF8xNik7CitkZWNsYXJlX2ZwZWwoYXZnLCA4LCAgXzE2KTsKK2RlY2xhcmVfZnBlbChhdmcsIDQsICBfMTYpOworCitkZWNsX21jX2Z1bmNzKDY0LCBCUFApOworZGVjbF9tY19mdW5jcygzMiwgQlBQKTsKK2RlY2xfbWNfZnVuY3MoMTYsIEJQUCk7CitkZWNsX21jX2Z1bmNzKDgsIEJQUCk7CitkZWNsX21jX2Z1bmNzKDQsIEJQUCk7CisKKyNkZWZpbmUgZGVmaW5lXzh0YXBfMmRfZnVuY3Moc3osIGJwcCkgICAgICAgIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihwdXQsIHJlZ3VsYXIsIHN6LCBicHApIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihwdXQsIHNoYXJwLCAgIHN6LCBicHApIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihwdXQsIHNtb290aCwgIHN6LCBicHApIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihhdmcsIHJlZ3VsYXIsIHN6LCBicHApIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihhdmcsIHNoYXJwLCAgIHN6LCBicHApIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihhdmcsIHNtb290aCwgIHN6LCBicHApCisKK2RlZmluZV84dGFwXzJkX2Z1bmNzKDY0LCBCUFApCitkZWZpbmVfOHRhcF8yZF9mdW5jcygzMiwgQlBQKQorZGVmaW5lXzh0YXBfMmRfZnVuY3MoMTYsIEJQUCkKK2RlZmluZV84dGFwXzJkX2Z1bmNzKDgsICBCUFApCitkZWZpbmVfOHRhcF8yZF9mdW5jcyg0LCAgQlBQKQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHZwOWRzcF9tY19pbml0X2FhcmNoNjQoVlA5RFNQQ29udGV4dCAqZHNwKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNkZWZpbmUgaW5pdF9mcGVsKGlkeDEsIGlkeDIsIHN6LCB0eXBlLCBzdWZmaXgpICAgICAgXAorICAgIGRzcC0+bWNbaWR4MV1bRklMVEVSXzhUQVBfU01PT1RIIF1baWR4Ml1bMF1bMF0gPSBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfOFRBUF9SRUdVTEFSXVtpZHgyXVswXVswXSA9IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1NIQVJQICBdW2lkeDJdWzBdWzBdID0gXAorICAgIGRzcC0+bWNbaWR4MV1bRklMVEVSX0JJTElORUFSICAgIF1baWR4Ml1bMF1bMF0gPSBmZl92cDlfIyN0eXBlIyNzeiMjc3VmZml4CisKKyNkZWZpbmUgaW5pdF9jb3B5KGlkeCwgc3osIHN1ZmZpeCkgXAorICAgIGluaXRfZnBlbChpZHgsIDAsIHN6LCBjb3B5LCBzdWZmaXgpCisKKyNkZWZpbmUgaW5pdF9hdmcoaWR4LCBzeiwgc3VmZml4KSBcCisgICAgaW5pdF9mcGVsKGlkeCwgMSwgc3osIGF2ZywgIHN1ZmZpeCkKKworI2RlZmluZSBpbml0X2NvcHlfYXZnKGlkeCwgc3oxLCBzejIpIFwKKyAgICBpbml0X2NvcHkoaWR4LCBzejIsIF9uZW9uKTsgICAgICBcCisgICAgaW5pdF9hdmcgKGlkeCwgc3oxLCBfMTZfbmVvbikKKworICAgIGlmIChoYXZlX2FybXY4KGNwdV9mbGFncykpIHsKKyAgICAgICAgaW5pdF9jb3B5KDAsIDEyOCwgX2FhcmNoNjQpOworICAgICAgICBpbml0X2NvcHkoMSwgNjQsICBfYWFyY2g2NCk7CisgICAgICAgIGluaXRfY29weSgyLCAzMiwgIF9hYXJjaDY0KTsKKyAgICB9CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyNkZWZpbmUgaW5pdF9tY19mdW5jKGlkeDEsIGlkeDIsIG9wLCBmaWx0ZXIsIGZuYW1lLCBkaXIsIG14LCBteSwgc3osIHBmeCwgYnBwKSBcCisgICAgZHNwLT5tY1tpZHgxXVtmaWx0ZXJdW2lkeDJdW214XVtteV0gPSBwZngjI29wIyNfIyNmbmFtZSMjc3ojI18jI2RpciMjXyMjYnBwIyNfbmVvbgorCisjZGVmaW5lIGluaXRfbWNfZnVuY3MoaWR4LCBkaXIsIG14LCBteSwgc3osIHBmeCwgYnBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfbWNfZnVuYyhpZHgsIDAsIHB1dCwgRklMVEVSXzhUQVBfUkVHVUxBUiwgcmVndWxhciwgZGlyLCBteCwgbXksIHN6LCBwZngsIGJwcCk7IFwKKyAgICBpbml0X21jX2Z1bmMoaWR4LCAwLCBwdXQsIEZJTFRFUl84VEFQX1NIQVJQLCAgIHNoYXJwLCAgIGRpciwgbXgsIG15LCBzeiwgcGZ4LCBicHApOyBcCisgICAgaW5pdF9tY19mdW5jKGlkeCwgMCwgcHV0LCBGSUxURVJfOFRBUF9TTU9PVEgsICBzbW9vdGgsICBkaXIsIG14LCBteSwgc3osIHBmeCwgYnBwKTsgXAorICAgIGluaXRfbWNfZnVuYyhpZHgsIDEsIGF2ZywgRklMVEVSXzhUQVBfUkVHVUxBUiwgcmVndWxhciwgZGlyLCBteCwgbXksIHN6LCBwZngsIGJwcCk7IFwKKyAgICBpbml0X21jX2Z1bmMoaWR4LCAxLCBhdmcsIEZJTFRFUl84VEFQX1NIQVJQLCAgIHNoYXJwLCAgIGRpciwgbXgsIG15LCBzeiwgcGZ4LCBicHApOyBcCisgICAgaW5pdF9tY19mdW5jKGlkeCwgMSwgYXZnLCBGSUxURVJfOFRBUF9TTU9PVEgsICBzbW9vdGgsICBkaXIsIG14LCBteSwgc3osIHBmeCwgYnBwKQorCisjZGVmaW5lIGluaXRfbWNfZnVuY3NfZGlycyhpZHgsIHN6LCBicHApICAgICAgICAgICAgXAorICAgIGluaXRfbWNfZnVuY3MoaWR4LCB2LCAgMCwgMSwgc3osIGZmX3ZwOV8sIGJwcCk7IFwKKyAgICBpbml0X21jX2Z1bmNzKGlkeCwgaCwgIDEsIDAsIHN6LCBmZl92cDlfLCBicHApOyBcCisgICAgaW5pdF9tY19mdW5jcyhpZHgsIGh2LCAxLCAxLCBzeiwgICAgICAgICwgYnBwKQorCisKKyAgICAgICAgaW5pdF9hdmcoMCwgNjQsIF8xNl9uZW9uKTsKKyAgICAgICAgaW5pdF9hdmcoMSwgMzIsIF8xNl9uZW9uKTsKKyAgICAgICAgaW5pdF9hdmcoMiwgMTYsIF8xNl9uZW9uKTsKKyAgICAgICAgaW5pdF9jb3B5X2F2ZygzLCA4LCAxNik7CisgICAgICAgIGluaXRfY29weV9hdmcoNCwgNCwgOCk7CisKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDAsIDY0LCBCUFApOworICAgICAgICBpbml0X21jX2Z1bmNzX2RpcnMoMSwgMzIsIEJQUCk7CisgICAgICAgIGluaXRfbWNfZnVuY3NfZGlycygyLCAxNiwgQlBQKTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDMsIDgsICBCUFApOworICAgICAgICBpbml0X21jX2Z1bmNzX2RpcnMoNCwgNCwgIEJQUCk7CisgICAgfQorfQorCisjZGVmaW5lIGRlZmluZV9pdHhmbTIodHlwZV9hLCB0eXBlX2IsIHN6LCBicHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfdnA5XyMjdHlwZV9hIyNfIyN0eXBlX2IjI18jI3N6IyN4IyNzeiMjX2FkZF8jI2JwcCMjX25lb24odWludDhfdCAqX2RzdCwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKl9ibG9jaywgaW50IGVvYikKKyNkZWZpbmUgZGVmaW5lX2l0eGZtKHR5cGVfYSwgdHlwZV9iLCBzeiwgYnBwKSBkZWZpbmVfaXR4Zm0yKHR5cGVfYSwgdHlwZV9iLCBzeiwgYnBwKQorCisjZGVmaW5lIGRlZmluZV9pdHhmbV9mdW5jcyhzeiwgYnBwKSAgICAgIFwKKyAgICBkZWZpbmVfaXR4Zm0oaWRjdCwgIGlkY3QsICBzeiwgYnBwKTsgXAorICAgIGRlZmluZV9pdHhmbShpYWRzdCwgaWRjdCwgIHN6LCBicHApOyBcCisgICAgZGVmaW5lX2l0eGZtKGlkY3QsICBpYWRzdCwgc3osIGJwcCk7IFwKKyAgICBkZWZpbmVfaXR4Zm0oaWFkc3QsIGlhZHN0LCBzeiwgYnBwKQorCitkZWZpbmVfaXR4Zm1fZnVuY3MoNCwgIEJQUCk7CitkZWZpbmVfaXR4Zm1fZnVuY3MoOCwgIEJQUCk7CitkZWZpbmVfaXR4Zm1fZnVuY3MoMTYsIEJQUCk7CitkZWZpbmVfaXR4Zm0oaWRjdCwgaWRjdCwgMzIsIEJQUCk7CitkZWZpbmVfaXR4Zm0oaXdodCwgaXdodCwgNCwgIEJQUCk7CisKKworc3RhdGljIGF2X2NvbGQgdm9pZCB2cDlkc3BfaXR4Zm1faW5pdF9hYXJjaDY0KFZQOURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisjZGVmaW5lIGluaXRfaXR4Zm0yKHR4LCBzeiwgYnBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtEQ1RfRENUXSAgID0gZmZfdnA5X2lkY3RfaWRjdF8jI3N6IyNfYWRkXyMjYnBwIyNfbmVvbjsgIFwKKyAgICBkc3AtPml0eGZtX2FkZFt0eF1bRENUX0FEU1RdICA9IGZmX3ZwOV9pYWRzdF9pZGN0XyMjc3ojI19hZGRfIyNicHAjI19uZW9uOyBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfRENUXSAgPSBmZl92cDlfaWRjdF9pYWRzdF8jI3N6IyNfYWRkXyMjYnBwIyNfbmVvbjsgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtBRFNUX0FEU1RdID0gZmZfdnA5X2lhZHN0X2lhZHN0XyMjc3ojI19hZGRfIyNicHAjI19uZW9uCisjZGVmaW5lIGluaXRfaXR4Zm0odHgsIHN6LCBicHApIGluaXRfaXR4Zm0yKHR4LCBzeiwgYnBwKQorCisjZGVmaW5lIGluaXRfaWRjdDIodHgsIG5tLCBicHApICAgICBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0RDVF9EQ1RdICAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfRENUXSAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0RDVF9BRFNUXSAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfQURTVF0gPSBmZl92cDlfIyNubSMjX2FkZF8jI2JwcCMjX25lb24KKyNkZWZpbmUgaW5pdF9pZGN0KHR4LCBubSwgYnBwKSBpbml0X2lkY3QyKHR4LCBubSwgYnBwKQorCisgICAgICAgIGluaXRfaXR4Zm0oVFhfNFg0LCAgIDR4NCwgICBCUFApOworICAgICAgICBpbml0X2l0eGZtKFRYXzhYOCwgICA4eDgsICAgQlBQKTsKKyAgICAgICAgaW5pdF9pdHhmbShUWF8xNlgxNiwgMTZ4MTYsIEJQUCk7CisgICAgICAgIGluaXRfaWRjdChUWF8zMlgzMiwgaWRjdF9pZGN0XzMyeDMyLCBCUFApOworICAgICAgICBpbml0X2lkY3QoNCwgICAgICAgIGl3aHRfaXdodF80eDQsICAgQlBQKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgZGVmaW5lX2xvb3BfZmlsdGVyKGRpciwgd2QsIHNpemUsIGJwcCkgXAordm9pZCBmZl92cDlfbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkIyNfIyNzaXplIyNfIyNicHAjI19uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IEUsIGludCBJLCBpbnQgSCkKKworI2RlZmluZSBkZWZpbmVfbG9vcF9maWx0ZXJzKHdkLCBzaXplLCBicHApIFwKKyAgICBkZWZpbmVfbG9vcF9maWx0ZXIoaCwgd2QsIHNpemUsIGJwcCk7ICBcCisgICAgZGVmaW5lX2xvb3BfZmlsdGVyKHYsIHdkLCBzaXplLCBicHApCisKK2RlZmluZV9sb29wX2ZpbHRlcnMoNCwgIDgsICBCUFApOworZGVmaW5lX2xvb3BfZmlsdGVycyg4LCAgOCwgIEJQUCk7CitkZWZpbmVfbG9vcF9maWx0ZXJzKDE2LCA4LCAgQlBQKTsKKworZGVmaW5lX2xvb3BfZmlsdGVycygxNiwgMTYsIEJQUCk7CisKK2RlZmluZV9sb29wX2ZpbHRlcnMoNDQsIDE2LCBCUFApOworZGVmaW5lX2xvb3BfZmlsdGVycyg0OCwgMTYsIEJQUCk7CitkZWZpbmVfbG9vcF9maWx0ZXJzKDg0LCAxNiwgQlBQKTsKK2RlZmluZV9sb29wX2ZpbHRlcnMoODgsIDE2LCBCUFApOworCitzdGF0aWMgYXZfY29sZCB2b2lkIHZwOWRzcF9sb29wZmlsdGVyX2luaXRfYWFyY2g2NChWUDlEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworI2RlZmluZSBpbml0X2xwZl9mdW5jXzgoaWR4MSwgaWR4MiwgZGlyLCB3ZCwgYnBwKSBcCisgICAgZHNwLT5sb29wX2ZpbHRlcl84W2lkeDFdW2lkeDJdID0gZmZfdnA5X2xvb3BfZmlsdGVyXyMjZGlyIyNfIyN3ZCMjXzhfIyNicHAjI19uZW9uCisKKyNkZWZpbmUgaW5pdF9scGZfZnVuY18xNihpZHgsIGRpciwgYnBwKSBcCisgICAgZHNwLT5sb29wX2ZpbHRlcl8xNltpZHhdID0gZmZfdnA5X2xvb3BfZmlsdGVyXyMjZGlyIyNfMTZfMTZfIyNicHAjI19uZW9uCisKKyNkZWZpbmUgaW5pdF9scGZfZnVuY19taXgyKGlkeDEsIGlkeDIsIGlkeDMsIGRpciwgd2QsIGJwcCkgXAorICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MltpZHgxXVtpZHgyXVtpZHgzXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl8jI2RpciMjXyMjd2QjI18xNl8jI2JwcCMjX25lb24KKworI2RlZmluZSBpbml0X2xwZl9mdW5jc184X3dkKGlkeCwgd2QsIGJwcCkgXAorICAgIGluaXRfbHBmX2Z1bmNfOChpZHgsIDAsIGgsIHdkLCBicHApOyAgXAorICAgIGluaXRfbHBmX2Z1bmNfOChpZHgsIDEsIHYsIHdkLCBicHApCisKKyNkZWZpbmUgaW5pdF9scGZfZnVuY3NfMTYoYnBwKSAgIFwKKyAgICBpbml0X2xwZl9mdW5jXzE2KDAsIGgsIGJwcCk7IFwKKyAgICBpbml0X2xwZl9mdW5jXzE2KDEsIHYsIGJwcCkKKworI2RlZmluZSBpbml0X2xwZl9mdW5jc19taXgyX3dkKGlkeDEsIGlkeDIsIHdkLCBicHApIFwKKyAgICBpbml0X2xwZl9mdW5jX21peDIoaWR4MSwgaWR4MiwgMCwgaCwgd2QsIGJwcCk7ICBcCisgICAgaW5pdF9scGZfZnVuY19taXgyKGlkeDEsIGlkeDIsIDEsIHYsIHdkLCBicHApCisKKyNkZWZpbmUgaW5pdF9scGZfZnVuY3NfOChicHApICAgICAgICBcCisgICAgaW5pdF9scGZfZnVuY3NfOF93ZCgwLCA0LCAgYnBwKTsgXAorICAgIGluaXRfbHBmX2Z1bmNzXzhfd2QoMSwgOCwgIGJwcCk7IFwKKyAgICBpbml0X2xwZl9mdW5jc184X3dkKDIsIDE2LCBicHApCisKKyNkZWZpbmUgaW5pdF9scGZfZnVuY3NfbWl4MihicHApICAgICAgICAgICBcCisgICAgaW5pdF9scGZfZnVuY3NfbWl4Ml93ZCgwLCAwLCA0NCwgYnBwKTsgXAorICAgIGluaXRfbHBmX2Z1bmNzX21peDJfd2QoMCwgMSwgNDgsIGJwcCk7IFwKKyAgICBpbml0X2xwZl9mdW5jc19taXgyX3dkKDEsIDAsIDg0LCBicHApOyBcCisgICAgaW5pdF9scGZfZnVuY3NfbWl4Ml93ZCgxLCAxLCA4OCwgYnBwKQorCisgICAgICAgIGluaXRfbHBmX2Z1bmNzXzgoQlBQKTsKKyAgICAgICAgaW5pdF9scGZfZnVuY3NfMTYoQlBQKTsKKyAgICAgICAgaW5pdF9scGZfZnVuY3NfbWl4MihCUFApOworICAgIH0KK30KKworYXZfY29sZCB2b2lkIElOSVRfRlVOQyhWUDlEU1BDb250ZXh0ICpkc3ApCit7CisgICAgdnA5ZHNwX21jX2luaXRfYWFyY2g2NChkc3ApOworICAgIHZwOWRzcF9sb29wZmlsdGVyX2luaXRfYWFyY2g2NChkc3ApOworICAgIHZwOWRzcF9pdHhmbV9pbml0X2FhcmNoNjQoZHNwKTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlkc3BfaW5pdF9hYXJjaDY0LmMgYi9saWJhdmNvZGVjL2FhcmNoNjQvdnA5ZHNwX2luaXRfYWFyY2g2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjk5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvdnA5ZHNwX2luaXRfYWFyY2g2NC5jCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEdvb2dsZSBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDlkc3AuaCIKKyNpbmNsdWRlICJ2cDlkc3BfaW5pdC5oIgorCisjZGVmaW5lIGRlY2xhcmVfZnBlbCh0eXBlLCBzeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOV8jI3R5cGUjI3N6IyNfbmVvbih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpCisKKyNkZWZpbmUgZGVjbGFyZV9jb3B5X2F2ZyhzeikgXAorICAgIGRlY2xhcmVfZnBlbChjb3B5LCBzeik7ICBcCisgICAgZGVjbGFyZV9mcGVsKGF2ZyAsIHN6KQorCisjZGVmaW5lIGRlY2xfbWNfZnVuYyhvcCwgZmlsdGVyLCBkaXIsIHN6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfdnA5XyMjb3AjI18jI2ZpbHRlciMjc3ojI18jI2RpciMjX25lb24odWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSkKKworI2RlZmluZSBkZWZpbmVfOHRhcF8yZF9mbihvcCwgZmlsdGVyLCBzeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIG9wIyNfIyNmaWx0ZXIjI3N6IyNfaHZfbmVvbih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSkgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCB0ZW1wLCBbKCgxICsgKHN6IDwgNjQpKSAqIHN6ICsgOCkgKiBzel0pOyAgICAgICAgICAgXAorICAgIC8qIFdlIG9ubHkgbmVlZCBoICsgNyBsaW5lcywgYnV0IHRoZSBob3Jpem9udGFsIGZpbHRlciBhc3N1bWVzIGFuICAgICAgICAgICAgIFwKKyAgICAgKiBldmVuIG51bWJlciBvZiByb3dzLCBzbyBmaWx0ZXIgaCArIDggbGluZXMgaGVyZS4gKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfdnA5X3B1dF8jI2ZpbHRlciMjc3ojI19oX25lb24odGVtcCwgc3osICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIDMgKiBzcmNfc3RyaWRlLCBzcmNfc3RyaWRlLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICsgOCwgbXgsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfdnA5XyMjb3AjI18jI2ZpbHRlciMjc3ojI192X25lb24oZHN0LCBkc3Rfc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKyAzICogc3osIHN6LCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLCAwLCBteSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgZGVjbF9maWx0ZXJfZnVuY3Mob3AsIGRpciwgc3opICBcCisgICAgZGVjbF9tY19mdW5jKG9wLCByZWd1bGFyLCBkaXIsIHN6KTsgXAorICAgIGRlY2xfbWNfZnVuYyhvcCwgc2hhcnAsICAgZGlyLCBzeik7IFwKKyAgICBkZWNsX21jX2Z1bmMob3AsIHNtb290aCwgIGRpciwgc3opCisKKyNkZWZpbmUgZGVjbF9tY19mdW5jcyhzeikgICAgICAgICAgIFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhwdXQsIGgsICBzeik7IFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhhdmcsIGgsICBzeik7IFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhwdXQsIHYsICBzeik7IFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhhdmcsIHYsICBzeik7IFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhwdXQsIGh2LCBzeik7IFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhhdmcsIGh2LCBzeikKKworI2RlZmluZSBmZl92cDlfY29weTMyX25lb24gZmZfdnA5X2NvcHkzMl9hYXJjaDY0CisjZGVmaW5lIGZmX3ZwOV9jb3B5NjRfbmVvbiBmZl92cDlfY29weTY0X2FhcmNoNjQKKworZGVjbGFyZV9jb3B5X2F2Zyg2NCk7CitkZWNsYXJlX2NvcHlfYXZnKDMyKTsKK2RlY2xhcmVfY29weV9hdmcoMTYpOworZGVjbGFyZV9jb3B5X2F2Zyg4KTsKK2RlY2xhcmVfY29weV9hdmcoNCk7CisKK2RlY2xfbWNfZnVuY3MoNjQpOworZGVjbF9tY19mdW5jcygzMik7CitkZWNsX21jX2Z1bmNzKDE2KTsKK2RlY2xfbWNfZnVuY3MoOCk7CitkZWNsX21jX2Z1bmNzKDQpOworCisjZGVmaW5lIGRlZmluZV84dGFwXzJkX2Z1bmNzKHN6KSAgICAgICAgXAorICAgIGRlZmluZV84dGFwXzJkX2ZuKHB1dCwgcmVndWxhciwgc3opIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihwdXQsIHNoYXJwLCAgIHN6KSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4ocHV0LCBzbW9vdGgsICBzeikgXAorICAgIGRlZmluZV84dGFwXzJkX2ZuKGF2ZywgcmVndWxhciwgc3opIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihhdmcsIHNoYXJwLCAgIHN6KSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4oYXZnLCBzbW9vdGgsICBzeikKKworZGVmaW5lXzh0YXBfMmRfZnVuY3MoNjQpCitkZWZpbmVfOHRhcF8yZF9mdW5jcygzMikKK2RlZmluZV84dGFwXzJkX2Z1bmNzKDE2KQorZGVmaW5lXzh0YXBfMmRfZnVuY3MoOCkKK2RlZmluZV84dGFwXzJkX2Z1bmNzKDQpCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA5ZHNwX21jX2luaXRfYWFyY2g2NChWUDlEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworI2RlZmluZSBpbml0X2ZwZWwoaWR4MSwgaWR4Miwgc3osIHR5cGUsIHN1ZmZpeCkgICAgICBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfOFRBUF9TTU9PVEggXVtpZHgyXVswXVswXSA9IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1JFR1VMQVJdW2lkeDJdWzBdWzBdID0gXAorICAgIGRzcC0+bWNbaWR4MV1bRklMVEVSXzhUQVBfU0hBUlAgIF1baWR4Ml1bMF1bMF0gPSBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfQklMSU5FQVIgICAgXVtpZHgyXVswXVswXSA9IGZmX3ZwOV8jI3R5cGUjI3N6IyNzdWZmaXgKKworI2RlZmluZSBpbml0X2NvcHkoaWR4LCBzeiwgc3VmZml4KSBcCisgICAgaW5pdF9mcGVsKGlkeCwgMCwgc3osIGNvcHksIHN1ZmZpeCkKKworI2RlZmluZSBpbml0X2F2ZyhpZHgsIHN6LCBzdWZmaXgpIFwKKyAgICBpbml0X2ZwZWwoaWR4LCAxLCBzeiwgYXZnLCAgc3VmZml4KQorCisjZGVmaW5lIGluaXRfY29weV9hdmcoaWR4LCBzeikgXAorICAgIGluaXRfY29weShpZHgsIHN6LCBfbmVvbik7IFwKKyAgICBpbml0X2F2ZyAoaWR4LCBzeiwgX25lb24pCisKKyAgICBpZiAoaGF2ZV9hcm12OChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGluaXRfY29weSgwLCA2NCwgX2FhcmNoNjQpOworICAgICAgICBpbml0X2NvcHkoMSwgMzIsIF9hYXJjaDY0KTsKKyAgICB9CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyNkZWZpbmUgaW5pdF9tY19mdW5jKGlkeDEsIGlkeDIsIG9wLCBmaWx0ZXIsIGZuYW1lLCBkaXIsIG14LCBteSwgc3osIHBmeCkgXAorICAgIGRzcC0+bWNbaWR4MV1bZmlsdGVyXVtpZHgyXVtteF1bbXldID0gcGZ4IyNvcCMjXyMjZm5hbWUjI3N6IyNfIyNkaXIjI19uZW9uCisKKyNkZWZpbmUgaW5pdF9tY19mdW5jcyhpZHgsIGRpciwgbXgsIG15LCBzeiwgcGZ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfbWNfZnVuYyhpZHgsIDAsIHB1dCwgRklMVEVSXzhUQVBfUkVHVUxBUiwgcmVndWxhciwgZGlyLCBteCwgbXksIHN6LCBwZngpOyBcCisgICAgaW5pdF9tY19mdW5jKGlkeCwgMCwgcHV0LCBGSUxURVJfOFRBUF9TSEFSUCwgICBzaGFycCwgICBkaXIsIG14LCBteSwgc3osIHBmeCk7IFwKKyAgICBpbml0X21jX2Z1bmMoaWR4LCAwLCBwdXQsIEZJTFRFUl84VEFQX1NNT09USCwgIHNtb290aCwgIGRpciwgbXgsIG15LCBzeiwgcGZ4KTsgXAorICAgIGluaXRfbWNfZnVuYyhpZHgsIDEsIGF2ZywgRklMVEVSXzhUQVBfUkVHVUxBUiwgcmVndWxhciwgZGlyLCBteCwgbXksIHN6LCBwZngpOyBcCisgICAgaW5pdF9tY19mdW5jKGlkeCwgMSwgYXZnLCBGSUxURVJfOFRBUF9TSEFSUCwgICBzaGFycCwgICBkaXIsIG14LCBteSwgc3osIHBmeCk7IFwKKyAgICBpbml0X21jX2Z1bmMoaWR4LCAxLCBhdmcsIEZJTFRFUl84VEFQX1NNT09USCwgIHNtb290aCwgIGRpciwgbXgsIG15LCBzeiwgcGZ4KQorCisjZGVmaW5lIGluaXRfbWNfZnVuY3NfZGlycyhpZHgsIHN6KSAgICAgICAgICAgIFwKKyAgICBpbml0X21jX2Z1bmNzKGlkeCwgaCwgIDEsIDAsIHN6LCBmZl92cDlfKTsgXAorICAgIGluaXRfbWNfZnVuY3MoaWR4LCB2LCAgMCwgMSwgc3osIGZmX3ZwOV8pOyBcCisgICAgaW5pdF9tY19mdW5jcyhpZHgsIGh2LCAxLCAxLCBzeiwpCisKKyAgICAgICAgaW5pdF9hdmcoMCwgNjQsIF9uZW9uKTsKKyAgICAgICAgaW5pdF9hdmcoMSwgMzIsIF9uZW9uKTsKKyAgICAgICAgaW5pdF9jb3B5X2F2ZygyLCAxNik7CisgICAgICAgIGluaXRfY29weV9hdmcoMywgOCk7CisgICAgICAgIGluaXRfY29weV9hdmcoNCwgNCk7CisKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDAsIDY0KTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDEsIDMyKTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDIsIDE2KTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDMsIDgpOworICAgICAgICBpbml0X21jX2Z1bmNzX2RpcnMoNCwgNCk7CisgICAgfQorfQorCisjZGVmaW5lIGRlZmluZV9pdHhmbSh0eXBlX2EsIHR5cGVfYiwgc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOV8jI3R5cGVfYSMjXyMjdHlwZV9iIyNfIyNzeiMjeCMjc3ojI19hZGRfbmVvbih1aW50OF90ICpfZHN0LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpfYmxvY2ssIGludCBlb2IpCisKKyNkZWZpbmUgZGVmaW5lX2l0eGZtX2Z1bmNzKHN6KSAgICAgIFwKKyAgICBkZWZpbmVfaXR4Zm0oaWRjdCwgIGlkY3QsICBzeik7IFwKKyAgICBkZWZpbmVfaXR4Zm0oaWFkc3QsIGlkY3QsICBzeik7IFwKKyAgICBkZWZpbmVfaXR4Zm0oaWRjdCwgIGlhZHN0LCBzeik7IFwKKyAgICBkZWZpbmVfaXR4Zm0oaWFkc3QsIGlhZHN0LCBzeikKKworZGVmaW5lX2l0eGZtX2Z1bmNzKDQpOworZGVmaW5lX2l0eGZtX2Z1bmNzKDgpOworZGVmaW5lX2l0eGZtX2Z1bmNzKDE2KTsKK2RlZmluZV9pdHhmbShpZGN0LCBpZGN0LCAzMik7CitkZWZpbmVfaXR4Zm0oaXdodCwgaXdodCwgNCk7CisKKworc3RhdGljIGF2X2NvbGQgdm9pZCB2cDlkc3BfaXR4Zm1faW5pdF9hYXJjaDY0KFZQOURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisjZGVmaW5lIGluaXRfaXR4Zm0odHgsIHN6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3AtPml0eGZtX2FkZFt0eF1bRENUX0RDVF0gICA9IGZmX3ZwOV9pZGN0X2lkY3RfIyNzeiMjX2FkZF9uZW9uOyAgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtEQ1RfQURTVF0gID0gZmZfdnA5X2lhZHN0X2lkY3RfIyNzeiMjX2FkZF9uZW9uOyBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfRENUXSAgPSBmZl92cDlfaWRjdF9pYWRzdF8jI3N6IyNfYWRkX25lb247IFwKKyAgICBkc3AtPml0eGZtX2FkZFt0eF1bQURTVF9BRFNUXSA9IGZmX3ZwOV9pYWRzdF9pYWRzdF8jI3N6IyNfYWRkX25lb24KKworI2RlZmluZSBpbml0X2lkY3QodHgsIG5tKSAgICAgICAgICAgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtEQ1RfRENUXSAgID0gXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtBRFNUX0RDVF0gID0gXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtEQ1RfQURTVF0gID0gXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtBRFNUX0FEU1RdID0gZmZfdnA5XyMjbm0jI19hZGRfbmVvbgorCisgICAgICAgIGluaXRfaXR4Zm0oVFhfNFg0LCA0eDQpOworICAgICAgICBpbml0X2l0eGZtKFRYXzhYOCwgOHg4KTsKKyAgICAgICAgaW5pdF9pdHhmbShUWF8xNlgxNiwgMTZ4MTYpOworICAgICAgICBpbml0X2lkY3QoVFhfMzJYMzIsIGlkY3RfaWRjdF8zMngzMik7CisgICAgICAgIGluaXRfaWRjdCg0LCBpd2h0X2l3aHRfNHg0KTsKKyAgICB9Cit9CisKKyNkZWZpbmUgZGVmaW5lX2xvb3BfZmlsdGVyKGRpciwgd2QsIGxlbikgXAordm9pZCBmZl92cDlfbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkIyNfIyNsZW4jI19uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IEUsIGludCBJLCBpbnQgSCkKKworI2RlZmluZSBkZWZpbmVfbG9vcF9maWx0ZXJzKHdkLCBsZW4pIFwKKyAgICBkZWZpbmVfbG9vcF9maWx0ZXIoaCwgd2QsIGxlbik7ICBcCisgICAgZGVmaW5lX2xvb3BfZmlsdGVyKHYsIHdkLCBsZW4pCisKK2RlZmluZV9sb29wX2ZpbHRlcnMoNCwgOCk7CitkZWZpbmVfbG9vcF9maWx0ZXJzKDgsIDgpOworZGVmaW5lX2xvb3BfZmlsdGVycygxNiwgOCk7CisKK2RlZmluZV9sb29wX2ZpbHRlcnMoMTYsIDE2KTsKKworZGVmaW5lX2xvb3BfZmlsdGVycyg0NCwgMTYpOworZGVmaW5lX2xvb3BfZmlsdGVycyg0OCwgMTYpOworZGVmaW5lX2xvb3BfZmlsdGVycyg4NCwgMTYpOworZGVmaW5lX2xvb3BfZmlsdGVycyg4OCwgMTYpOworCitzdGF0aWMgYXZfY29sZCB2b2lkIHZwOWRzcF9sb29wZmlsdGVyX2luaXRfYWFyY2g2NChWUDlEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyXzhbMF1bMV0gPSBmZl92cDlfbG9vcF9maWx0ZXJfdl80XzhfbmVvbjsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzBdWzBdID0gZmZfdnA5X2xvb3BfZmlsdGVyX2hfNF84X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfOFsxXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92XzhfOF9uZW9uOworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyXzhbMV1bMF0gPSBmZl92cDlfbG9vcF9maWx0ZXJfaF84XzhfbmVvbjsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzJdWzFdID0gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfMTZfOF9uZW9uOworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyXzhbMl1bMF0gPSBmZl92cDlfbG9vcF9maWx0ZXJfaF8xNl84X25lb247CisKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl8xNlswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzE2XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfMTZbMV0gPSBmZl92cDlfbG9vcF9maWx0ZXJfdl8xNl8xNl9uZW9uOworCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVswXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzQ0XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVswXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92XzQ0XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVsxXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzQ4XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVsxXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92XzQ4XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVswXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzg0XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVswXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92Xzg0XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVsxXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzg4XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVsxXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92Xzg4XzE2X25lb247CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfdnA5ZHNwX2luaXRfYWFyY2g2NChWUDlEU1BDb250ZXh0ICpkc3AsIGludCBicHApCit7CisgICAgaWYgKGJwcCA9PSAxMCkgeworICAgICAgICBmZl92cDlkc3BfaW5pdF8xMGJwcF9hYXJjaDY0KGRzcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGJwcCA9PSAxMikgeworICAgICAgICBmZl92cDlkc3BfaW5pdF8xMmJwcF9hYXJjaDY0KGRzcCk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGJwcCAhPSA4KQorICAgICAgICByZXR1cm47CisKKyAgICB2cDlkc3BfbWNfaW5pdF9hYXJjaDY0KGRzcCk7CisgICAgdnA5ZHNwX2xvb3BmaWx0ZXJfaW5pdF9hYXJjaDY0KGRzcCk7CisgICAgdnA5ZHNwX2l0eGZtX2luaXRfYWFyY2g2NChkc3ApOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOWl0eGZtXzE2YnBwX25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlpdHhmbV8xNmJwcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyOTZkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlpdHhmbV8xNmJwcF9uZW9uLlMKQEAgLTAsMCArMSwyMDE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IEdvb2dsZSBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKyNpbmNsdWRlICJuZW9uLlMiCisKK2NvbnN0IGl0eGZtNF9jb2VmZnMsIGFsaWduPTQKKyAgICAgICAgLnNob3J0ICAxMTU4NSwgMCwgNjI3MCwgMTUxMzcKK2lhZHN0NF9jb2VmZnM6CisgICAgICAgIC5zaG9ydCAgNTI4MywgMTUyMTIsIDk5MjksIDEzMzc3CitlbmRjb25zdAorCitjb25zdCBpYWRzdDhfY29lZmZzLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgMTYzMDUsIDE2MDYsIDE0NDQ5LCA3NzIzLCAxMDM5NCwgMTI2NjUsIDQ3NTYsIDE1Njc5CitpZGN0X2NvZWZmczoKKyAgICAgICAgLnNob3J0ICAxMTU4NSwgMCwgNjI3MCwgMTUxMzcsIDMxOTYsIDE2MDY5LCAxMzYyMywgOTEwMgorICAgICAgICAuc2hvcnQgIDE2MDYsIDE2MzA1LCAxMjY2NSwgMTAzOTQsIDc3MjMsIDE0NDQ5LCAxNTY3OSwgNDc1NgorICAgICAgICAuc2hvcnQgIDgwNCwgMTYzNjQsIDEyMTQwLCAxMTAwMywgNzAwNSwgMTQ4MTEsIDE1NDI2LCA1NTIwCisgICAgICAgIC5zaG9ydCAgMzk4MSwgMTU4OTMsIDE0MDUzLCA4NDIzLCA5NzYwLCAxMzE2MCwgMTYyMDcsIDI0MDQKK2VuZGNvbnN0CisKK2NvbnN0IGlhZHN0MTZfY29lZmZzLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgMTYzNjQsIDgwNCwgMTU4OTMsIDM5ODEsIDExMDAzLCAxMjE0MCwgODQyMywgMTQwNTMKKyAgICAgICAgLnNob3J0ICAxNDgxMSwgNzAwNSwgMTMxNjAsIDk3NjAsIDU1MjAsIDE1NDI2LCAyNDA0LCAxNjIwNworZW5kY29uc3QKKworLm1hY3JvIHRyYW5zcG9zZV80eDRzIHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNworICAgICAgICB0cm4xICAgICAgICAgICAgXHI0XCgpLjRzLCAgXHIwXCgpLjRzLCAgXHIxXCgpLjRzCisgICAgICAgIHRybjIgICAgICAgICAgICBccjVcKCkuNHMsICBccjBcKCkuNHMsICBccjFcKCkuNHMKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyNlwoKS40cywgIFxyMlwoKS40cywgIFxyM1woKS40cworICAgICAgICB0cm4yICAgICAgICAgICAgXHI3XCgpLjRzLCAgXHIyXCgpLjRzLCAgXHIzXCgpLjRzCisgICAgICAgIHRybjEgICAgICAgICAgICBccjBcKCkuMmQsICBccjRcKCkuMmQsICBccjZcKCkuMmQKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyMlwoKS4yZCwgIFxyNFwoKS4yZCwgIFxyNlwoKS4yZAorICAgICAgICB0cm4xICAgICAgICAgICAgXHIxXCgpLjJkLCAgXHI1XCgpLjJkLCAgXHI3XCgpLjJkCisgICAgICAgIHRybjIgICAgICAgICAgICBccjNcKCkuMmQsICBccjVcKCkuMmQsICBccjdcKCkuMmQKKy5lbmRtCisKKy8vIFRyYW5zcG9zZSBhIDh4OCBtYXRyaXggb2YgMzIgYml0IGVsZW1lbnRzLCB3aGVyZSBlYWNoIHJvdyBpcyBzcHJlYWQgb3V0CisvLyBvdmVyIHR3byByZWdpc3RlcnMuCisubWFjcm8gdHJhbnNwb3NlXzh4OHMgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIHIxMywgcjE0LCByMTUsIHQwLCB0MSwgdDIsIHQzCisgICAgICAgIHRyYW5zcG9zZV80eDRzICBccjAsICBccjIsICBccjQsICBccjYsICBcdDAsIFx0MSwgXHQyLCBcdDMKKyAgICAgICAgdHJhbnNwb3NlXzR4NHMgIFxyOSwgIFxyMTEsIFxyMTMsIFxyMTUsIFx0MCwgXHQxLCBcdDIsIFx0MworCisgICAgICAgIC8vIERvIDR4NCB0cmFuc3Bvc2VzIG9mIHIxLHIzLHI1LHI3IGFuZCByOCxyMTAscjEyLHIxNAorICAgICAgICAvLyB3aGlsZSBzd2FwcGluZyB0aGUgdHdvIDR4NCBtYXRyaWNlcyBiZXR3ZWVuIGVhY2ggb3RoZXIKKworICAgICAgICAvLyBGaXJzdCBzdGVwIG9mIHRoZSA0eDQgdHJhbnNwb3NlIG9mIHIxLXI3LCBpbnRvIHQwLXQzCisgICAgICAgIHRybjEgICAgICAgICAgICBcdDBcKCkuNHMsICBccjFcKCkuNHMsICBccjNcKCkuNHMKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFx0MVwoKS40cywgIFxyMVwoKS40cywgIFxyM1woKS40cworICAgICAgICB0cm4xICAgICAgICAgICAgXHQyXCgpLjRzLCAgXHI1XCgpLjRzLCAgXHI3XCgpLjRzCisgICAgICAgIHRybjIgICAgICAgICAgICBcdDNcKCkuNHMsICBccjVcKCkuNHMsICBccjdcKCkuNHMKKworICAgICAgICAvLyBGaXJzdCBzdGVwIG9mIHRoZSA0eDQgdHJhbnNwb3NlIG9mIHI4LXIxMiwgaW50byByMS1yNworICAgICAgICB0cm4xICAgICAgICAgICAgXHIxXCgpLjRzLCAgXHI4XCgpLjRzLCAgXHIxMFwoKS40cworICAgICAgICB0cm4yICAgICAgICAgICAgXHIzXCgpLjRzLCAgXHI4XCgpLjRzLCAgXHIxMFwoKS40cworICAgICAgICB0cm4xICAgICAgICAgICAgXHI1XCgpLjRzLCAgXHIxMlwoKS40cywgXHIxNFwoKS40cworICAgICAgICB0cm4yICAgICAgICAgICAgXHI3XCgpLjRzLCAgXHIxMlwoKS40cywgXHIxNFwoKS40cworCisgICAgICAgIC8vIFNlY29uZCBzdGVwIG9mIHRoZSA0eDQgdHJhbnNwb3NlIG9mIHIxLXI3IChub3cgaW4gdDAtcjMpLCBpbnRvIHI4LXIxMgorICAgICAgICB0cm4xICAgICAgICAgICAgXHI4XCgpLjJkLCAgXHQwXCgpLjJkLCAgXHQyXCgpLjJkCisgICAgICAgIHRybjIgICAgICAgICAgICBccjEyXCgpLjJkLCBcdDBcKCkuMmQsICBcdDJcKCkuMmQKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFxyMTBcKCkuMmQsIFx0MVwoKS4yZCwgIFx0M1woKS4yZAorICAgICAgICB0cm4yICAgICAgICAgICAgXHIxNFwoKS4yZCwgXHQxXCgpLjJkLCAgXHQzXCgpLjJkCisKKyAgICAgICAgLy8gU2Vjb25kIHN0ZXAgb2YgdGhlIDR4NCB0cmFuc3Bvc2Ugb2YgcjgtcjEyIChub3cgaW4gcjEtcjcpLCBpbiBwbGFjZSBhcyBmYXIgYXMgcG9zc2libGUKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFx0MFwoKS4yZCwgIFxyMVwoKS4yZCwgIFxyNVwoKS4yZAorICAgICAgICB0cm4yICAgICAgICAgICAgXHI1XCgpLjJkLCAgXHIxXCgpLjJkLCAgXHI1XCgpLjJkCisgICAgICAgIHRybjEgICAgICAgICAgICBcdDFcKCkuMmQsICBccjNcKCkuMmQsICBccjdcKCkuMmQKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyN1woKS4yZCwgIFxyM1woKS4yZCwgIFxyN1woKS4yZAorCisgICAgICAgIC8vIE1vdmUgdGhlIG91dHB1dHMgb2YgdHJuMSBiYWNrIGluIHBsYWNlCisgICAgICAgIG1vdiAgICAgICAgICAgICBccjFcKCkuMTZiLCAgXHQwXCgpLjE2YgorICAgICAgICBtb3YgICAgICAgICAgICAgXHIzXCgpLjE2YiwgIFx0MVwoKS4xNmIKKy5lbmRtCisKKy8vIG91dDEgPSAoKGluMSArIGluMikgKiBkMFswXSArICgxIDw8IDEzKSkgPj4gMTQKKy8vIG91dDIgPSAoKGluMSAtIGluMikgKiBkMFswXSArICgxIDw8IDEzKSkgPj4gMTQKKy8vIGluL291dCBhcmUgLjRzIHJlZ2lzdGVyczsgdGhpcyBjYW4gZG8gd2l0aCA0IHRlbXAgcmVnaXN0ZXJzLCBidXQgaXMKKy8vIG1vcmUgZWZmaWNpZW50IGlmIDYgdGVtcCByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZS4KKy5tYWNybyBkbWJ1dHRlcmZseTAgb3V0MSwgb3V0MiwgaW4xLCBpbjIsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIG5lZz0wCisuaWYgXG5lZyA+IDAKKyAgICAgICAgbmVnICAgICAgICAgICAgIFx0bXA0XCgpLjRzLCB2MC40cworLmVuZGlmCisgICAgICAgIGFkZCAgICAgICAgICAgICBcdG1wMVwoKS40cywgXGluMVwoKS40cywgIFxpbjJcKCkuNHMKKyAgICAgICAgc3ViICAgICAgICAgICAgIFx0bXAyXCgpLjRzLCBcaW4xXCgpLjRzLCAgXGluMlwoKS40cworLmlmIFxuZWcgPiAwCisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wM1woKS4yZCwgXHRtcDFcKCkuMnMsIFx0bXA0XCgpLnNbMF0KKyAgICAgICAgc211bGwyICAgICAgICAgIFx0bXA0XCgpLjJkLCBcdG1wMVwoKS40cywgXHRtcDRcKCkuc1swXQorLmVsc2UKKyAgICAgICAgc211bGwgICAgICAgICAgIFx0bXAzXCgpLjJkLCBcdG1wMVwoKS4ycywgdjAuc1swXQorICAgICAgICBzbXVsbDIgICAgICAgICAgXHRtcDRcKCkuMmQsIFx0bXAxXCgpLjRzLCB2MC5zWzBdCisuZW5kaWYKKy5pZmIgXHRtcDUKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXQxXCgpLjJzLCBcdG1wM1woKS4yZCwgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcb3V0MVwoKS40cywgXHRtcDRcKCkuMmQsICMxNAorICAgICAgICBzbXVsbCAgICAgICAgICAgXHRtcDNcKCkuMmQsIFx0bXAyXCgpLjJzLCB2MC5zWzBdCisgICAgICAgIHNtdWxsMiAgICAgICAgICBcdG1wNFwoKS4yZCwgXHRtcDJcKCkuNHMsIHYwLnNbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXQyXCgpLjJzLCBcdG1wM1woKS4yZCwgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcb3V0MlwoKS40cywgXHRtcDRcKCkuMmQsICMxNAorLmVsc2UKKyAgICAgICAgc211bGwgICAgICAgICAgIFx0bXA1XCgpLjJkLCBcdG1wMlwoKS4ycywgdjAuc1swXQorICAgICAgICBzbXVsbDIgICAgICAgICAgXHRtcDZcKCkuMmQsIFx0bXAyXCgpLjRzLCB2MC5zWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICBcb3V0MVwoKS4ycywgXHRtcDNcKCkuMmQsICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXG91dDFcKCkuNHMsIFx0bXA0XCgpLjJkLCAjMTQKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXQyXCgpLjJzLCBcdG1wNVwoKS4yZCwgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcb3V0MlwoKS40cywgXHRtcDZcKCkuMmQsICMxNAorLmVuZGlmCisuZW5kbQorCisvLyBTYW1lIGFzIGRtYnV0dGVyZmx5MCBhYm92ZSwgYnV0IHRyZWF0aW5nIHRoZSBpbnB1dCBpbiBpbjIgYXMgemVybywKKy8vIHdyaXRpbmcgdGhlIHNhbWUgb3V0cHV0IGludG8gYm90aCBvdXQxIGFuZCBvdXQyLgorLm1hY3JvIGRtYnV0dGVyZmx5MF9oIG91dDEsIG91dDIsIGluMSwgaW4yLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2CisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wMVwoKS4yZCwgXGluMVwoKS4ycywgIHYwLnNbMF0KKyAgICAgICAgc211bGwyICAgICAgICAgIFx0bXAyXCgpLjJkLCBcaW4xXCgpLjRzLCAgdjAuc1swXQorICAgICAgICByc2hybiAgICAgICAgICAgXG91dDFcKCkuMnMsIFx0bXAxXCgpLjJkLCAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxvdXQxXCgpLjRzLCBcdG1wMlwoKS4yZCwgIzE0CisgICAgICAgIHJzaHJuICAgICAgICAgICBcb3V0MlwoKS4ycywgXHRtcDFcKCkuMmQsICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXG91dDJcKCkuNHMsIFx0bXAyXCgpLjJkLCAjMTQKKy5lbmRtCisKKy8vIG91dDEsb3V0MiA9IGluMSAqIGNvZWYxIC0gaW4yICogY29lZjIKKy8vIG91dDMsb3V0NCA9IGluMSAqIGNvZWYyICsgaW4yICogY29lZjEKKy8vIG91dCBhcmUgNCB4IC4yZCByZWdpc3RlcnMsIGluIGFyZSAyIHggLjRzIHJlZ2lzdGVycworLm1hY3JvIGRtYnV0dGVyZmx5X2wgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgaW4xLCBpbjIsIGNvZWYxLCBjb2VmMgorICAgICAgICBzbXVsbCAgICAgICAgICAgXG91dDFcKCkuMmQsIFxpbjFcKCkuMnMsIFxjb2VmMQorICAgICAgICBzbXVsbDIgICAgICAgICAgXG91dDJcKCkuMmQsIFxpbjFcKCkuNHMsIFxjb2VmMQorICAgICAgICBzbXVsbCAgICAgICAgICAgXG91dDNcKCkuMmQsIFxpbjFcKCkuMnMsIFxjb2VmMgorICAgICAgICBzbXVsbDIgICAgICAgICAgXG91dDRcKCkuMmQsIFxpbjFcKCkuNHMsIFxjb2VmMgorICAgICAgICBzbWxzbCAgICAgICAgICAgXG91dDFcKCkuMmQsIFxpbjJcKCkuMnMsIFxjb2VmMgorICAgICAgICBzbWxzbDIgICAgICAgICAgXG91dDJcKCkuMmQsIFxpbjJcKCkuNHMsIFxjb2VmMgorICAgICAgICBzbWxhbCAgICAgICAgICAgXG91dDNcKCkuMmQsIFxpbjJcKCkuMnMsIFxjb2VmMQorICAgICAgICBzbWxhbDIgICAgICAgICAgXG91dDRcKCkuMmQsIFxpbjJcKCkuNHMsIFxjb2VmMQorLmVuZG0KKworLy8gaW5vdXQxID0gKGlub3V0MSAqIGNvZWYxIC0gaW5vdXQyICogY29lZjIgKyAoMSA8PCAxMykpID4+IDE0CisvLyBpbm91dDIgPSAoaW5vdXQxICogY29lZjIgKyBpbm91dDIgKiBjb2VmMSArICgxIDw8IDEzKSkgPj4gMTQKKy8vIGlub3V0IGFyZSAyIHggLjRzIHJlZ2lzdGVycworLm1hY3JvIGRtYnV0dGVyZmx5IGlub3V0MSwgaW5vdXQyLCBjb2VmMSwgY29lZjIsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIG5lZz0wCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBcdG1wMSwgXHRtcDIsIFx0bXAzLCBcdG1wNCwgXGlub3V0MSwgXGlub3V0MiwgXGNvZWYxLCBcY29lZjIKKy5pZiBcbmVnID4gMAorICAgICAgICBuZWcgICAgICAgICAgICAgXHRtcDNcKCkuMmQsIFx0bXAzXCgpLjJkCisgICAgICAgIG5lZyAgICAgICAgICAgICBcdG1wNFwoKS4yZCwgXHRtcDRcKCkuMmQKKy5lbmRpZgorICAgICAgICByc2hybiAgICAgICAgICAgXGlub3V0MVwoKS4ycywgXHRtcDFcKCkuMmQsICAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxpbm91dDFcKCkuNHMsIFx0bXAyXCgpLjJkLCAgIzE0CisgICAgICAgIHJzaHJuICAgICAgICAgICBcaW5vdXQyXCgpLjJzLCBcdG1wM1woKS4yZCwgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXGlub3V0MlwoKS40cywgXHRtcDRcKCkuMmQsICAjMTQKKy5lbmRtCisKKy8vIFNhbWUgYXMgZG1idXR0ZXJmbHkgYWJvdmUsIGJ1dCB0cmVhdGluZyB0aGUgaW5wdXQgaW4gaW5vdXQyIGFzIHplcm8KKy5tYWNybyBkbWJ1dHRlcmZseV9oMSBpbm91dDEsIGlub3V0MiwgY29lZjEsIGNvZWYyLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wMVwoKS4yZCwgXGlub3V0MVwoKS4ycywgXGNvZWYxCisgICAgICAgIHNtdWxsMiAgICAgICAgICBcdG1wMlwoKS4yZCwgXGlub3V0MVwoKS40cywgXGNvZWYxCisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wM1woKS4yZCwgXGlub3V0MVwoKS4ycywgXGNvZWYyCisgICAgICAgIHNtdWxsMiAgICAgICAgICBcdG1wNFwoKS4yZCwgXGlub3V0MVwoKS40cywgXGNvZWYyCisgICAgICAgIHJzaHJuICAgICAgICAgICBcaW5vdXQxXCgpLjJzLCBcdG1wMVwoKS4yZCwgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcaW5vdXQxXCgpLjRzLCBcdG1wMlwoKS4yZCwgIzE0CisgICAgICAgIHJzaHJuICAgICAgICAgICBcaW5vdXQyXCgpLjJzLCBcdG1wM1woKS4yZCwgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcaW5vdXQyXCgpLjRzLCBcdG1wNFwoKS4yZCwgIzE0CisuZW5kbQorCisvLyBTYW1lIGFzIGRtYnV0dGVyZmx5IGFib3ZlLCBidXQgdHJlYXRpbmcgdGhlIGlucHV0IGluIGlub3V0MSBhcyB6ZXJvCisubWFjcm8gZG1idXR0ZXJmbHlfaDIgaW5vdXQxLCBpbm91dDIsIGNvZWYxLCBjb2VmMiwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgICAgICBzbXVsbCAgICAgICAgICAgXHRtcDFcKCkuMmQsIFxpbm91dDJcKCkuMnMsIFxjb2VmMgorICAgICAgICBzbXVsbDIgICAgICAgICAgXHRtcDJcKCkuMmQsIFxpbm91dDJcKCkuNHMsIFxjb2VmMgorICAgICAgICBzbXVsbCAgICAgICAgICAgXHRtcDNcKCkuMmQsIFxpbm91dDJcKCkuMnMsIFxjb2VmMQorICAgICAgICBzbXVsbDIgICAgICAgICAgXHRtcDRcKCkuMmQsIFxpbm91dDJcKCkuNHMsIFxjb2VmMQorICAgICAgICBuZWcgICAgICAgICAgICAgXHRtcDFcKCkuMmQsIFx0bXAxXCgpLjJkCisgICAgICAgIG5lZyAgICAgICAgICAgICBcdG1wMlwoKS4yZCwgXHRtcDJcKCkuMmQKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxpbm91dDJcKCkuMnMsIFx0bXAzXCgpLjJkLCAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxpbm91dDJcKCkuNHMsIFx0bXA0XCgpLjJkLCAjMTQKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxpbm91dDFcKCkuMnMsIFx0bXAxXCgpLjJkLCAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxpbm91dDFcKCkuNHMsIFx0bXAyXCgpLjJkLCAjMTQKKy5lbmRtCisKKy5tYWNybyBkc211bGxfaCBvdXQxLCBvdXQyLCBpbiwgY29lZgorICAgICAgICBzbXVsbCAgICAgICAgICAgXG91dDFcKCkuMmQsIFxpblwoKS4ycywgXGNvZWYKKyAgICAgICAgc211bGwyICAgICAgICAgIFxvdXQyXCgpLjJkLCBcaW5cKCkuNHMsIFxjb2VmCisuZW5kbQorCisubWFjcm8gZHJzaHJuX2ggb3V0LCBpbjEsIGluMiwgc2hpZnQKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXRcKCkuMnMsIFxpbjFcKCkuMmQsIFxzaGlmdAorICAgICAgICByc2hybjIgICAgICAgICAgXG91dFwoKS40cywgXGluMlwoKS4yZCwgXHNoaWZ0CisuZW5kbQorCisKKy8vIG91dDEgPSBpbjEgKyBpbjIKKy8vIG91dDIgPSBpbjEgLSBpbjIKKy5tYWNybyBidXR0ZXJmbHlfNHMgb3V0MSwgb3V0MiwgaW4xLCBpbjIKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxvdXQxXCgpLjRzLCBcaW4xXCgpLjRzLCBcaW4yXCgpLjRzCisgICAgICAgIHN1YiAgICAgICAgICAgICBcb3V0MlwoKS40cywgXGluMVwoKS40cywgXGluMlwoKS40cworLmVuZG0KKworLy8gb3V0MSA9IGluMSAtIGluMgorLy8gb3V0MiA9IGluMSArIGluMgorLm1hY3JvIGJ1dHRlcmZseV80c19yIG91dDEsIG91dDIsIGluMSwgaW4yCisgICAgICAgIHN1YiAgICAgICAgICAgICBcb3V0MVwoKS40cywgXGluMVwoKS40cywgXGluMlwoKS40cworICAgICAgICBhZGQgICAgICAgICAgICAgXG91dDJcKCkuNHMsIFxpbjFcKCkuNHMsIFxpbjJcKCkuNHMKKy5lbmRtCisKKy8vIG91dDEgPSAoaW4xLGluMiArIGluMyxpbjQgKyAoMSA8PCAxMykpID4+IDE0CisvLyBvdXQyID0gKGluMSxpbjIgLSBpbjMsaW40ICsgKDEgPDwgMTMpKSA+PiAxNAorLy8gb3V0IGFyZSAyIHggLjRzIHJlZ2lzdGVycywgaW4gYXJlIDQgeCAuMmQgcmVnaXN0ZXJzCisubWFjcm8gZGJ1dHRlcmZseV9uIG91dDEsIG91dDIsIGluMSwgaW4yLCBpbjMsIGluNCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgICAgICBhZGQgICAgICAgICAgICAgXHRtcDFcKCkuMmQsIFxpbjFcKCkuMmQsIFxpbjNcKCkuMmQKKyAgICAgICAgYWRkICAgICAgICAgICAgIFx0bXAyXCgpLjJkLCBcaW4yXCgpLjJkLCBcaW40XCgpLjJkCisgICAgICAgIHN1YiAgICAgICAgICAgICBcdG1wM1woKS4yZCwgXGluMVwoKS4yZCwgXGluM1woKS4yZAorICAgICAgICBzdWIgICAgICAgICAgICAgXHRtcDRcKCkuMmQsIFxpbjJcKCkuMmQsIFxpbjRcKCkuMmQKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXQxXCgpLjJzLCBcdG1wMVwoKS4yZCwgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXG91dDFcKCkuNHMsIFx0bXAyXCgpLjJkLCAgIzE0CisgICAgICAgIHJzaHJuICAgICAgICAgICBcb3V0MlwoKS4ycywgXHRtcDNcKCkuMmQsICAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxvdXQyXCgpLjRzLCBcdG1wNFwoKS4yZCwgICMxNAorLmVuZG0KKworLm1hY3JvIGl3aHQ0XzEwIGMwLCBjMSwgYzIsIGMzCisgICAgICAgIGFkZCAgICAgICAgICAgICBcYzBcKCkuNHMsIFxjMFwoKS40cywgXGMxXCgpLjRzCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTcuNHMsICAgIFxjMlwoKS40cywgXGMzXCgpLjRzCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTYuNHMsICAgIFxjMFwoKS40cywgdjE3LjRzCisgICAgICAgIHNzaHIgICAgICAgICAgICB2MTYuNHMsICAgIHYxNi40cywgICAgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxjMlwoKS40cywgdjE2LjRzLCAgICBcYzFcKCkuNHMKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxjMVwoKS40cywgdjE2LjRzLCAgICBcYzNcKCkuNHMKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxjM1woKS40cywgdjE3LjRzLCAgICBcYzJcKCkuNHMKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxjMFwoKS40cywgXGMwXCgpLjRzLCBcYzFcKCkuNHMKKy5lbmRtCisKKy5tYWNybyBpd2h0NF8xMiBjMCwgYzEsIGMyLCBjMworICAgICAgICBpd2h0NF8xMCAgICAgICAgXGMwLCBcYzEsIFxjMiwgXGMzCisuZW5kbQorCisubWFjcm8gaWRjdDRfMTAgYzAsIGMxLCBjMiwgYzMKKyAgICAgICAgbXVsICAgICAgICAgICAgIHYyMi40cywgICAgXGMxXCgpLjRzLCB2MC5zWzNdCisgICAgICAgIG11bCAgICAgICAgICAgICB2MjAuNHMsICAgIFxjMVwoKS40cywgdjAuc1syXQorICAgICAgICBhZGQgICAgICAgICAgICAgdjE2LjRzLCAgICBcYzBcKCkuNHMsIFxjMlwoKS40cworICAgICAgICBzdWIgICAgICAgICAgICAgdjE3LjRzLCAgICBcYzBcKCkuNHMsIFxjMlwoKS40cworICAgICAgICBtbGEgICAgICAgICAgICAgdjIyLjRzLCAgICBcYzNcKCkuNHMsIHYwLnNbMl0KKyAgICAgICAgbXVsICAgICAgICAgICAgIHYxOC40cywgICAgdjE2LjRzLCAgICB2MC5zWzBdCisgICAgICAgIG11bCAgICAgICAgICAgICB2MjQuNHMsICAgIHYxNy40cywgICAgdjAuc1swXQorICAgICAgICBtbHMgICAgICAgICAgICAgdjIwLjRzLCAgICBcYzNcKCkuNHMsIHYwLnNbM10KKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyMi40cywgICAgdjIyLjRzLCAgICAjMTQKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYxOC40cywgICAgdjE4LjRzLCAgICAjMTQKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyNC40cywgICAgdjI0LjRzLCAgICAjMTQKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyMC40cywgICAgdjIwLjRzLCAgICAjMTQKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxjMFwoKS40cywgdjE4LjRzLCAgICB2MjIuNHMKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxjM1woKS40cywgdjE4LjRzLCAgICB2MjIuNHMKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxjMVwoKS40cywgdjI0LjRzLCAgICB2MjAuNHMKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxjMlwoKS40cywgdjI0LjRzLCAgICB2MjAuNHMKKy5lbmRtCisKKy5tYWNybyBpZGN0NF8xMiBjMCwgYzEsIGMyLCBjMworICAgICAgICBzbXVsbCAgICAgICAgICAgdjIyLjJkLCAgICBcYzFcKCkuMnMsIHYwLnNbM10KKyAgICAgICAgc211bGwyICAgICAgICAgIHYyMy4yZCwgICAgXGMxXCgpLjRzLCB2MC5zWzNdCisgICAgICAgIHNtdWxsICAgICAgICAgICB2MjAuMmQsICAgIFxjMVwoKS4ycywgdjAuc1syXQorICAgICAgICBzbXVsbDIgICAgICAgICAgdjIxLjJkLCAgICBcYzFcKCkuNHMsIHYwLnNbMl0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNi40cywgICAgXGMwXCgpLjRzLCBcYzJcKCkuNHMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxNy40cywgICAgXGMwXCgpLjRzLCBcYzJcKCkuNHMKKyAgICAgICAgc21sYWwgICAgICAgICAgIHYyMi4yZCwgICAgXGMzXCgpLjJzLCB2MC5zWzJdCisgICAgICAgIHNtbGFsMiAgICAgICAgICB2MjMuMmQsICAgIFxjM1woKS40cywgdjAuc1syXQorICAgICAgICBzbXVsbCAgICAgICAgICAgdjE4LjJkLCAgICB2MTYuMnMsICAgIHYwLnNbMF0KKyAgICAgICAgc211bGwyICAgICAgICAgIHYxOS4yZCwgICAgdjE2LjRzLCAgICB2MC5zWzBdCisgICAgICAgIHNtdWxsICAgICAgICAgICB2MjQuMmQsICAgIHYxNy4ycywgICAgdjAuc1swXQorICAgICAgICBzbXVsbDIgICAgICAgICAgdjI1LjJkLCAgICB2MTcuNHMsICAgIHYwLnNbMF0KKyAgICAgICAgc21sc2wgICAgICAgICAgIHYyMC4yZCwgICAgXGMzXCgpLjJzLCB2MC5zWzNdCisgICAgICAgIHNtbHNsMiAgICAgICAgICB2MjEuMmQsICAgIFxjM1woKS40cywgdjAuc1szXQorICAgICAgICByc2hybiAgICAgICAgICAgdjIyLjJzLCAgICB2MjIuMmQsICAgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgdjIyLjRzLCAgICB2MjMuMmQsICAgICMxNAorICAgICAgICByc2hybiAgICAgICAgICAgdjE4LjJzLCAgICB2MTguMmQsICAgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgdjE4LjRzLCAgICB2MTkuMmQsICAgICMxNAorICAgICAgICByc2hybiAgICAgICAgICAgdjI0LjJzLCAgICB2MjQuMmQsICAgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgdjI0LjRzLCAgICB2MjUuMmQsICAgICMxNAorICAgICAgICByc2hybiAgICAgICAgICAgdjIwLjJzLCAgICB2MjAuMmQsICAgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgdjIwLjRzLCAgICB2MjEuMmQsICAgICMxNAorICAgICAgICBhZGQgICAgICAgICAgICAgXGMwXCgpLjRzLCB2MTguNHMsICAgIHYyMi40cworICAgICAgICBzdWIgICAgICAgICAgICAgXGMzXCgpLjRzLCB2MTguNHMsICAgIHYyMi40cworICAgICAgICBhZGQgICAgICAgICAgICAgXGMxXCgpLjRzLCB2MjQuNHMsICAgIHYyMC40cworICAgICAgICBzdWIgICAgICAgICAgICAgXGMyXCgpLjRzLCB2MjQuNHMsICAgIHYyMC40cworLmVuZG0KKworLm1hY3JvIGlhZHN0NF8xMCBjMCwgYzEsIGMyLCBjMworICAgICAgICBtdWwgICAgICAgICAgICAgdjE2LjRzLCAgICBcYzBcKCkuNHMsIHYxLnNbMF0KKyAgICAgICAgbWxhICAgICAgICAgICAgIHYxNi40cywgICAgXGMyXCgpLjRzLCB2MS5zWzFdCisgICAgICAgIG1sYSAgICAgICAgICAgICB2MTYuNHMsICAgIFxjM1woKS40cywgdjEuc1syXQorICAgICAgICBtdWwgICAgICAgICAgICAgdjE4LjRzLCAgICBcYzBcKCkuNHMsIHYxLnNbMl0KKyAgICAgICAgbWxzICAgICAgICAgICAgIHYxOC40cywgICAgXGMyXCgpLjRzLCB2MS5zWzBdCisgICAgICAgIHN1YiAgICAgICAgICAgICBcYzBcKCkuNHMsIFxjMFwoKS40cywgXGMyXCgpLjRzCisgICAgICAgIG1scyAgICAgICAgICAgICB2MTguNHMsICAgIFxjM1woKS40cywgdjEuc1sxXQorICAgICAgICBhZGQgICAgICAgICAgICAgXGMwXCgpLjRzLCBcYzBcKCkuNHMsIFxjM1woKS40cworICAgICAgICBtdWwgICAgICAgICAgICAgdjIyLjRzLCAgICBcYzFcKCkuNHMsIHYxLnNbM10KKyAgICAgICAgbXVsICAgICAgICAgICAgIHYyMC40cywgICAgXGMwXCgpLjRzLCB2MS5zWzNdCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjQuNHMsICAgIHYxNi40cywgICAgdjIyLjRzCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjYuNHMsICAgIHYxOC40cywgICAgdjIyLjRzCisgICAgICAgIHNyc2hyICAgICAgICAgICBcYzBcKCkuNHMsIHYyNC40cywgICAgIzE0CisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTYuNHMsICAgIHYxNi40cywgICAgdjE4LjRzCisgICAgICAgIHNyc2hyICAgICAgICAgICBcYzFcKCkuNHMsIHYyNi40cywgICAgIzE0CisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTYuNHMsICAgIHYxNi40cywgICAgdjIyLjRzCisgICAgICAgIHNyc2hyICAgICAgICAgICBcYzJcKCkuNHMsIHYyMC40cywgICAgIzE0CisgICAgICAgIHNyc2hyICAgICAgICAgICBcYzNcKCkuNHMsIHYxNi40cywgICAgIzE0CisuZW5kbQorCisubWFjcm8gaWFkc3Q0XzEyIGMwLCBjMSwgYzIsIGMzCisgICAgICAgIHNtdWxsICAgICAgICAgICB2MTYuMmQsICAgIFxjMFwoKS4ycywgdjEuc1swXQorICAgICAgICBzbXVsbDIgICAgICAgICAgdjE3LjJkLCAgICBcYzBcKCkuNHMsIHYxLnNbMF0KKyAgICAgICAgc21sYWwgICAgICAgICAgIHYxNi4yZCwgICAgXGMyXCgpLjJzLCB2MS5zWzFdCisgICAgICAgIHNtbGFsMiAgICAgICAgICB2MTcuMmQsICAgIFxjMlwoKS40cywgdjEuc1sxXQorICAgICAgICBzbWxhbCAgICAgICAgICAgdjE2LjJkLCAgICBcYzNcKCkuMnMsIHYxLnNbMl0KKyAgICAgICAgc21sYWwyICAgICAgICAgIHYxNy4yZCwgICAgXGMzXCgpLjRzLCB2MS5zWzJdCisgICAgICAgIHNtdWxsICAgICAgICAgICB2MTguMmQsICAgIFxjMFwoKS4ycywgdjEuc1syXQorICAgICAgICBzbXVsbDIgICAgICAgICAgdjE5LjJkLCAgICBcYzBcKCkuNHMsIHYxLnNbMl0KKyAgICAgICAgc21sc2wgICAgICAgICAgIHYxOC4yZCwgICAgXGMyXCgpLjJzLCB2MS5zWzBdCisgICAgICAgIHNtbHNsMiAgICAgICAgICB2MTkuMmQsICAgIFxjMlwoKS40cywgdjEuc1swXQorICAgICAgICBzdWIgICAgICAgICAgICAgXGMwXCgpLjRzLCBcYzBcKCkuNHMsIFxjMlwoKS40cworICAgICAgICBzbWxzbCAgICAgICAgICAgdjE4LjJkLCAgICBcYzNcKCkuMnMsIHYxLnNbMV0KKyAgICAgICAgc21sc2wyICAgICAgICAgIHYxOS4yZCwgICAgXGMzXCgpLjRzLCB2MS5zWzFdCisgICAgICAgIGFkZCAgICAgICAgICAgICBcYzBcKCkuNHMsIFxjMFwoKS40cywgXGMzXCgpLjRzCisgICAgICAgIHNtdWxsICAgICAgICAgICB2MjIuMmQsICAgIFxjMVwoKS4ycywgdjEuc1szXQorICAgICAgICBzbXVsbDIgICAgICAgICAgdjIzLjJkLCAgICBcYzFcKCkuNHMsIHYxLnNbM10KKyAgICAgICAgc211bGwgICAgICAgICAgIHYyMC4yZCwgICAgXGMwXCgpLjJzLCB2MS5zWzNdCisgICAgICAgIHNtdWxsMiAgICAgICAgICB2MjEuMmQsICAgIFxjMFwoKS40cywgdjEuc1szXQorICAgICAgICBhZGQgICAgICAgICAgICAgdjI0LjJkLCAgICB2MTYuMmQsICAgIHYyMi4yZAorICAgICAgICBhZGQgICAgICAgICAgICAgdjI1LjJkLCAgICB2MTcuMmQsICAgIHYyMy4yZAorICAgICAgICBhZGQgICAgICAgICAgICAgdjI2LjJkLCAgICB2MTguMmQsICAgIHYyMi4yZAorICAgICAgICBhZGQgICAgICAgICAgICAgdjI3LjJkLCAgICB2MTkuMmQsICAgIHYyMy4yZAorICAgICAgICByc2hybiAgICAgICAgICAgXGMwXCgpLjJzLCB2MjQuMmQsICAgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXGMwXCgpLjRzLCB2MjUuMmQsICAgICMxNAorICAgICAgICBhZGQgICAgICAgICAgICAgdjE2LjJkLCAgICB2MTYuMmQsICAgIHYxOC4yZAorICAgICAgICBhZGQgICAgICAgICAgICAgdjE3LjJkLCAgICB2MTcuMmQsICAgIHYxOS4yZAorICAgICAgICByc2hybiAgICAgICAgICAgXGMxXCgpLjJzLCB2MjYuMmQsICAgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXGMxXCgpLjRzLCB2MjcuMmQsICAgICMxNAorICAgICAgICBzdWIgICAgICAgICAgICAgdjE2LjJkLCAgICB2MTYuMmQsICAgIHYyMi4yZAorICAgICAgICBzdWIgICAgICAgICAgICAgdjE3LjJkLCAgICB2MTcuMmQsICAgIHYyMy4yZAorICAgICAgICByc2hybiAgICAgICAgICAgXGMyXCgpLjJzLCB2MjAuMmQsICAgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXGMyXCgpLjRzLCB2MjEuMmQsICAgICMxNAorICAgICAgICByc2hybiAgICAgICAgICAgXGMzXCgpLjJzLCB2MTYuMmQsICAgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXGMzXCgpLjRzLCB2MTcuMmQsICAgICMxNAorLmVuZG0KKworLy8gVGhlIHB1YmxpYyBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGhhdmUgZ290IHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgorLy8gdm9pZCBpdHhmbV9hZGQodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jaywgaW50IGVvYik7CisKKy5tYWNybyBpdHhmbV9mdW5jNHg0IHR4Zm0xLCB0eGZtMiwgYnBwCitmdW5jdGlvbiBmZl92cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV80eDRfYWRkX1xicHBcKClfbmVvbiwgZXhwb3J0PTEKKy5pZmMgXHR4Zm0xLFx0eGZtMgorLmlmYyBcdHhmbTEsaWRjdAorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDQsICBpdHhmbTRfY29lZmZzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNGh9LCBbeDRdCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MC40cywgIHYwLjRoCisuZW5kaWYKKy5pZmMgXHR4Zm0xLGlhZHN0CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NCwgIGlhZHN0NF9jb2VmZnMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5kfVsxXSwgW3g0XQorICAgICAgICBzeHRsMiAgICAgICAgICAgdjEuNHMsICB2MC44aAorLmVuZGlmCisuZWxzZQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDQsICBpdHhmbTRfY29lZmZzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuOGh9LCBbeDRdCisgICAgICAgIHN4dGwyICAgICAgICAgICB2MS40cywgIHYwLjhoCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MC40cywgIHYwLjRoCisuZW5kaWYKKworICAgICAgICBtb3ZpICAgICAgICAgICAgdjMwLjRzLCAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjMxLjRzLCAjMAorLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMQorICAgICAgICBiLm5lICAgICAgICAgICAgMWYKKyAgICAgICAgLy8gREMtb25seSBmb3IgaWRjdC9pZGN0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuc31bMF0sICBbeDJdCisgICAgICAgIHNtdWxsICAgICAgICAgICB2Mi4yZCwgIHYyLjJzLCB2MC5zWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICB2Mi4ycywgIHYyLjJkLCAjMTQKKyAgICAgICAgc211bGwgICAgICAgICAgIHYyLjJkLCAgdjIuMnMsIHYwLnNbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIHYyLjJzLCAgdjIuMmQsICMxNAorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMS5zfVswXSwgW3gyXQorICAgICAgICBkdXAgICAgICAgICAgICAgdjQuNHMsICB2Mi5zWzBdCisgICAgICAgIG1vdiAgICAgICAgICAgICB2NS4xNmIsIHY0LjE2YgorICAgICAgICBtb3YgICAgICAgICAgICAgdjYuMTZiLCB2NC4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY3LjE2YiwgdjQuMTZiCisgICAgICAgIGIgICAgICAgICAgICAgICAyZgorLmVuZGlmCisKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHMsdjUuNHMsdjYuNHMsdjcuNHN9LCAgW3gyXQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMC40cyx2MzEuNHN9LCBbeDJdLCAjMzIKKworLmlmYyBcdHhmbTEsaXdodAorICAgICAgICBzc2hyICAgICAgICAgICAgdjQuNHMsICB2NC40cywgICMyCisgICAgICAgIHNzaHIgICAgICAgICAgICB2NS40cywgIHY1LjRzLCAgIzIKKyAgICAgICAgc3NociAgICAgICAgICAgIHY2LjRzLCAgdjYuNHMsICAjMgorICAgICAgICBzc2hyICAgICAgICAgICAgdjcuNHMsICB2Ny40cywgICMyCisuZW5kaWYKKworICAgICAgICBcdHhmbTFcKCk0X1xicHAgdjQsICB2NSwgIHY2LCAgdjcKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YzMC40cyx2MzEuNHN9LCBbeDJdLCAjMzIKKyAgICAgICAgLy8gVHJhbnNwb3NlIDR4NCB3aXRoIDMyIGJpdCBlbGVtZW50cworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjQsICB2NSwgIHY2LCAgdjcsICB2MTYsIHYxNywgdjE4LCB2MTkKKworICAgICAgICBcdHhmbTJcKCk0X1xicHAgdjQsICB2NSwgIHY2LCAgdjcKKzI6CisgICAgICAgIG12bmkgICAgICAgICAgICB2MzEuOGgsICMoKDB4ZmYgPDwgKFxicHAgLSA4KSkgJiAweGZmKSwgbHNsICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuNGh9LCAgIFt4MF0sIHgxCisuaWZuYyBcdHhmbTEsaXdodAorICAgICAgICBzcnNociAgICAgICAgICAgdjQuNHMsICB2NC40cywgICM0CisgICAgICAgIHNyc2hyICAgICAgICAgICB2NS40cywgIHY1LjRzLCAgIzQKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHY2LjRzLCAgdjYuNHMsICAjNAorICAgICAgICBzcnNociAgICAgICAgICAgdjcuNHMsICB2Ny40cywgICM0CisuZW5kaWYKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHY0LjRzLCAgdjQuNHMsICB2MC40aAorICAgICAgICB1YWRkdyAgICAgICAgICAgdjUuNHMsICB2NS40cywgIHYxLjRoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MC40aCwgIHY0LjRzCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2MC44aCwgIHY1LjRzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2Ni40cywgIHY2LjRzLCAgdjIuNGgKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHYwLjhoLCAgdjAuOGgsICB2MzEuOGgKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHY3LjRzLCAgdjcuNHMsICB2My40aAorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjRofSwgICBbeDBdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjIuNGgsICB2Ni40cworICAgICAgICBzcXh0dW4yICAgICAgICAgdjIuOGgsICB2Ny40cworICAgICAgICB1bWluICAgICAgICAgICAgdjIuOGgsICB2Mi44aCwgIHYzMS44aAorCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuZH1bMV0sIFt4MF0sIHgxCisKKyAgICAgICAgcmV0CitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gaXR4Zm1fZnVuY3M0eDQgYnBwCitpdHhmbV9mdW5jNHg0IGlkY3QsICBpZGN0LCAgXGJwcAoraXR4Zm1fZnVuYzR4NCBpYWRzdCwgaWRjdCwgIFxicHAKK2l0eGZtX2Z1bmM0eDQgaWRjdCwgIGlhZHN0LCBcYnBwCitpdHhmbV9mdW5jNHg0IGlhZHN0LCBpYWRzdCwgXGJwcAoraXR4Zm1fZnVuYzR4NCBpd2h0LCAgaXdodCwgIFxicHAKKy5lbmRtCisKK2l0eGZtX2Z1bmNzNHg0IDEwCitpdHhmbV9mdW5jczR4NCAxMgorCitmdW5jdGlvbiBpZGN0OHg4X2RjX2FkZF9uZW9uCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NCwgIGlkY3RfY29lZmZzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNGh9LCBbeDRdCisKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYxLjRoLCAgIzAKKyAgICAgICAgc3h0bCAgICAgICAgICAgIHYwLjRzLCAgdjAuNGgKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YyLnN9WzBdLCAgW3gyXQorICAgICAgICBzbXVsbCAgICAgICAgICAgdjIuMmQsICB2Mi4ycywgIHYwLnNbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIHYyLjJzLCAgdjIuMmQsICAjMTQKKyAgICAgICAgc211bGwgICAgICAgICAgIHYyLjJkLCAgdjIuMnMsICB2MC5zWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICB2Mi4ycywgIHYyLjJkLCAgIzE0CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMF0sICBbeDJdCisgICAgICAgIGR1cCAgICAgICAgICAgICB2Mi40cywgIHYyLnNbMF0KKworICAgICAgICBzcnNociAgICAgICAgICAgdjIuNHMsICB2Mi40cywgICM1CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg0LCAgIzgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCAgeDAKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYzMS44aCwgdzUKKzE6CisgICAgICAgIC8vIExvb3AgdG8gYWRkIHRoZSBjb25zdGFudCBmcm9tIHYyIGludG8gYWxsIDh4OCBvdXRwdXRzCisgICAgICAgIHN1YnMgICAgICAgICAgICB4NCwgIHg0LCAgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44aH0sICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhofSwgIFt4MF0sIHgxCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MTYuNHMsIHYyLjRzLCAgdjMuNGgKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYxNy40cywgdjIuNHMsICB2My44aAorICAgICAgICB1YWRkdyAgICAgICAgICAgdjE4LjRzLCB2Mi40cywgIHY0LjRoCisgICAgICAgIHVhZGR3MiAgICAgICAgICB2MTkuNHMsIHYyLjRzLCAgdjQuOGgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYzLjRoLCAgdjE2LjRzCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2My44aCwgIHYxNy40cworICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuNGgsICB2MTguNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHY0LjhoLCAgdjE5LjRzCisgICAgICAgIHVtaW4gICAgICAgICAgICB2My44aCwgIHYzLjhoLCAgdjMxLjhoCisgICAgICAgIHVtaW4gICAgICAgICAgICB2NC44aCwgIHY0LjhoLCAgdjMxLjhoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOGh9LCAgW3gzXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44aH0sICBbeDNdLCB4MQorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKworICAgICAgICByZXQKK2VuZGZ1bmMKKworLm1hY3JvIGlkY3Q4IHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NQorICAgICAgICBkbWJ1dHRlcmZseTAgICAgXHIwLCBccjQsIFxyMCwgXHI0LCBcdDAsIFx0MSwgXHQyLCBcdDMsIFx0NCwgXHQ1IC8vIHIwID0gdDBhLCByNCA9IHQxYQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgXHIyLCBccjYsIHYwLnNbMl0sIHYwLnNbM10sIFx0MCwgXHQxLCBcdDIsIFx0MyAgIC8vIHIyID0gdDJhLCByNiA9IHQzYQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgXHIxLCBccjcsIHYxLnNbMF0sIHYxLnNbMV0sIFx0MCwgXHQxLCBcdDIsIFx0MyAgIC8vIHIxID0gdDRhLCByNyA9IHQ3YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgXHI1LCBccjMsIHYxLnNbMl0sIHYxLnNbM10sIFx0MCwgXHQxLCBcdDIsIFx0MyAgIC8vIHI1ID0gdDVhLCByMyA9IHQ2YQorCisgICAgICAgIGJ1dHRlcmZseV80cyAgICBcdDAsIFx0MSwgXHIwLCBccjYgLy8gdDAgPSB0MCwgdDEgPSB0MworICAgICAgICBidXR0ZXJmbHlfNHMgICAgXHQyLCBccjUsIFxyMSwgXHI1IC8vIHQyID0gdDQsIHI1ID0gdDVhCisgICAgICAgIGJ1dHRlcmZseV80cyAgICBcdDMsIFxyNiwgXHI3LCBccjMgLy8gdDMgPSB0NywgcjYgPSB0NmEKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIFxyNywgXHI0LCBccjQsIFxyMiAvLyByNyA9IHQxLCByNCA9IHQyCisKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIFxyNiwgXHI1LCBccjYsIFxyNSwgXHIwLCBccjEsIFxyMiwgXHIzLCBcdDQsIFx0NSAvLyByNiA9IHQ2LCByNSA9IHQ1CisKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIFxyMSwgXHI2LCBccjcsIFxyNiAvLyByMSA9IG91dFsxXSwgcjYgPSBvdXRbNl0KKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIFxyMCwgXHI3LCBcdDAsIFx0MyAvLyByMCA9IG91dFswXSwgcjcgPSBvdXRbN10KKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIFxyMiwgXHI1LCBccjQsIFxyNSAvLyByMiA9IG91dFsyXSwgcjUgPSBvdXRbNV0KKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIFxyMywgXHI0LCBcdDEsIFx0MiAvLyByMyA9IG91dFszXSwgcjQgPSBvdXRbNF0KKy5lbmRtCisKKy5tYWNybyBpYWRzdDggcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1CisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBcdDIsIFx0MywgXHQwLCBcdDEsIFxyNywgXHIwLCB2Mi5zWzFdLCB2Mi5zWzBdICAgLy8gdDIsdDMgPSB0MWEsIHQwLHQxID0gdDBhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBccjAsIFxyNywgXHQ0LCBcdDUsIFxyMywgXHI0LCB2My5zWzFdLCB2My5zWzBdICAgLy8gcjAscjcgPSB0NWEsIHQ0LHQ1ID0gdDRhCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIFxyMywgXHQwLCBcdDAsIFx0MSwgXHQ0LCBcdDUsIFxyMywgXHI0LCBcdDAsIFx0MSAvLyByMyA9IHQwLCB0MCA9IHQ0CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICBccjQsIFx0MSwgXHQyLCBcdDMsIFxyMCwgXHI3LCBccjQsIFx0MSwgXHQ0LCBcdDUgLy8gcjQgPSB0MSwgdDEgPSB0NQorCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBcdDQsIFx0NSwgXHQyLCBcdDMsIFxyNSwgXHIyLCB2Mi5zWzNdLCB2Mi5zWzJdICAgLy8gdDQsdDUgPSB0M2EsIHQyLHQzID0gdDJhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBccjIsIFxyNSwgXHIwLCBccjcsIFxyMSwgXHI2LCB2My5zWzNdLCB2My5zWzJdICAgLy8gcjIscjUgPSB0N2EsIHIwLHI3ID0gdDZhCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIFxyMSwgXHQyLCBcdDIsIFx0MywgXHIwLCBccjcsIFxyMSwgXHI2LCBcdDIsIFx0MyAvLyByMSA9IHQyLCB0MiA9IHQ2CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICBccjAsIFx0NCwgXHQ0LCBcdDUsIFxyMiwgXHI1LCBccjAsIFxyNywgXHQ0LCBcdDUgLy8gcjAgPSB0MywgdDQgPSB0NworCisgICAgICAgIGJ1dHRlcmZseV80cyAgICBccjcsIFxyNCwgXHI0LCBccjAgICAvLyByNyA9IC1vdXRbN10sIHI0ID0gdDMKKyAgICAgICAgbmVnICAgICAgICAgICAgIFxyN1woKS40cywgXHI3XCgpLjRzIC8vIHI3ID0gb3V0WzddCisgICAgICAgIGJ1dHRlcmZseV80cyAgICBccjAsIFxyMSwgXHIzLCBccjEgICAvLyByMCA9IG91dFswXSwgIHIxID0gdDIKKworICAgICAgICBkbWJ1dHRlcmZseV9sICAgXHIyLCBccjMsIFx0MywgXHQ1LCBcdDAsIFx0MSwgdjAuc1syXSwgdjAuc1szXSAgIC8vIHIyLHIzID0gdDVhLCB0Myx0NSA9IHQ0YQorICAgICAgICBkbWJ1dHRlcmZseV9sICAgXHQwLCBcdDEsIFxyNSwgXHI2LCBcdDQsIFx0MiwgdjAuc1szXSwgdjAuc1syXSAgIC8vIHQwLHQxID0gdDZhLCByNSxyNiA9IHQ3YQorCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICBccjYsIFx0MiwgXHIyLCBccjMsIFxyNSwgXHI2LCBcdDIsIFx0NCwgXHIyLCBccjMgLy8gcjYgPSBvdXRbNl0sICB0MiA9IHQ3CisKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIFxyMywgXHI0LCBccjEsIFxyNCwgXHQ0LCBccjUsIFxyMSwgXHIyICAgICAgICAgICAvLyByMyA9IC1vdXRbM10sIHI0ID0gb3V0WzRdCisgICAgICAgIG5lZyAgICAgICAgICAgICBccjNcKCkuNHMsIFxyM1woKS40cyAgLy8gcjMgPSBvdXRbM10KKworICAgICAgICBkYnV0dGVyZmx5X24gICAgXHIxLCBcdDAsIFx0MywgXHQ1LCBcdDAsIFx0MSwgXHIxLCBccjIsIFx0MCwgXHQxIC8vIHIxID0gLW91dFsxXSwgdDAgPSB0NgorICAgICAgICBuZWcgICAgICAgICAgICAgXHIxXCgpLjRzLCBccjFcKCkuNHMgIC8vIHIxID0gb3V0WzFdCisKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIFxyMiwgXHI1LCBcdDAsIFx0MiwgXHQxLCBcdDMsIFx0NCwgXHQ1ICAgICAgICAgICAvLyByMiA9IG91dFsyXSwgIHI1ID0gLW91dFs1XQorICAgICAgICBuZWcgICAgICAgICAgICAgXHI1XCgpLjRzLCBccjVcKCkuNHMgIC8vIHI1ID0gb3V0WzVdCisuZW5kbQorCisKKy5tYWNybyBpdHhmbV9mdW5jOHg4IHR4Zm0xLCB0eGZtMgorZnVuY3Rpb24gdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfOHg4X2FkZF8xNl9uZW9uCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgICMxCisgICAgICAgIGIuZXEgICAgICAgICAgICBpZGN0OHg4X2RjX2FkZF9uZW9uCisuZW5kaWYKKyAgICAgICAgLy8gVGhlIGlhZHN0IGFsc28gdXNlcyBhIGZldyBjb2VmZmljaWVudHMgZnJvbQorICAgICAgICAvLyBpZGN0LCBzbyB0aG9zZSBhbHdheXMgbmVlZCB0byBiZSBsb2FkZWQuCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NCwgIGlkY3RfY29lZmZzCisuZWxzZQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDQsICBpYWRzdDhfY29lZmZzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuOGh9LCBbeDRdLCAjMTYKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3AsICMtMHgxMF0hCisgICAgICAgIHN4dGwyICAgICAgICAgICB2My40cywgIHYxLjhoCisgICAgICAgIHN4dGwgICAgICAgICAgICB2Mi40cywgIHYxLjRoCisuZW5kaWYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44aH0sIFt4NF0KKyAgICAgICAgc3h0bDIgICAgICAgICAgIHYxLjRzLCAgdjAuOGgKKyAgICAgICAgc3h0bCAgICAgICAgICAgIHYwLjRzLCAgdjAuNGgKKworICAgICAgICBtb3ZpICAgICAgICAgICAgdjQuNHMsICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2NS40cywgIzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHY2LjRzLCAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjcuNHMsICMwCisKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjRzLHYxNy40cyx2MTguNHMsdjE5LjRzfSwgIFt4Ml0sICM2NAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC40cyx2MjEuNHMsdjIyLjRzLHYyMy40c30sICBbeDJdLCAjNjQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuNHMsdjI1LjRzLHYyNi40cyx2MjcuNHN9LCAgW3gyXSwgIzY0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjRzLHYyOS40cyx2MzAuNHMsdjMxLjRzfSwgIFt4Ml0sICM2NAorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgICMyNTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC40cyx2NS40cyx2Ni40cyx2Ny40c30sICAgICAgW3gyXSwgIzY0CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHMsdjUuNHMsdjYuNHMsdjcuNHN9LCAgICAgIFt4Ml0sICM2NAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjRzLHY1LjRzLHY2LjRzLHY3LjRzfSwgICAgICBbeDJdLCAjNjQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC40cyx2NS40cyx2Ni40cyx2Ny40c30sICAgICAgW3gyXSwgIzY0CisKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgaWRjdDggICAgICAgICAgIHYxNiwgdjE4LCB2MjAsIHYyMiwgdjI0LCB2MjYsIHYyOCwgdjMwLCB2MiwgIHYzLCAgdjQsICB2NSwgIHY2LCAgdjcKKyAgICAgICAgaWRjdDggICAgICAgICAgIHYxNywgdjE5LCB2MjEsIHYyMywgdjI1LCB2MjcsIHYyOSwgdjMxLCB2MiwgIHYzLCAgdjQsICB2NSwgIHY2LCAgdjcKKy5lbHNlCisgICAgICAgIFx0eGZtMVwoKTggICAgICB2MTYsIHYxOCwgdjIwLCB2MjIsIHYyNCwgdjI2LCB2MjgsIHYzMCwgdjQsICB2NSwgIHY2LCAgdjcsICB2OCwgIHY5CisgICAgICAgIFx0eGZtMVwoKTggICAgICB2MTcsIHYxOSwgdjIxLCB2MjMsIHYyNSwgdjI3LCB2MjksIHYzMSwgdjQsICB2NSwgIHY2LCAgdjcsICB2OCwgIHY5CisuZW5kaWYKKworICAgICAgICAvLyBUcmFuc3Bvc2UgOHg4IHdpdGggMTYgYml0IGVsZW1lbnRzCisgICAgICAgIHRyYW5zcG9zZV84eDhzICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHY0LCB2NSwgdjYsIHY3CisKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgaWRjdDggICAgICAgICAgIHYxNiwgdjE4LCB2MjAsIHYyMiwgdjI0LCB2MjYsIHYyOCwgdjMwLCB2MiwgIHYzLCAgdjQsICB2NSwgIHY2LCAgdjcKKyAgICAgICAgaWRjdDggICAgICAgICAgIHYxNywgdjE5LCB2MjEsIHYyMywgdjI1LCB2MjcsIHYyOSwgdjMxLCB2MiwgIHYzLCAgdjQsICB2NSwgIHY2LCAgdjcKKy5lbHNlCisgICAgICAgIFx0eGZtMlwoKTggICAgICB2MTYsIHYxOCwgdjIwLCB2MjIsIHYyNCwgdjI2LCB2MjgsIHYzMCwgdjQsICB2NSwgIHY2LCAgdjcsICB2OCwgIHY5CisgICAgICAgIFx0eGZtMlwoKTggICAgICB2MTcsIHYxOSwgdjIxLCB2MjMsIHYyNSwgdjI3LCB2MjksIHYzMSwgdjQsICB2NSwgIHY2LCAgdjcsICB2OCwgIHY5CisuZW5kaWYKKzI6CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgwCisgICAgICAgIC8vIEFkZCBpbnRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhofSwgIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MTYuNHMsIHYxNi40cywgIzUKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYxNy40cywgdjE3LjRzLCAjNQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjhofSwgIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MTguNHMsIHYxOC40cywgIzUKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYxOS40cywgdjE5LjRzLCAjNQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjhofSwgIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MjAuNHMsIHYyMC40cywgIzUKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyMS40cywgdjIxLjRzLCAjNQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjE2LjRzLCB2MTYuNHMsIHYwLjRoCisgICAgICAgIHVhZGR3MiAgICAgICAgICB2MTcuNHMsIHYxNy40cywgdjAuOGgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44aH0sICBbeDBdLCB4MQorICAgICAgICBzcnNociAgICAgICAgICAgdjIyLjRzLCB2MjIuNHMsICM1CisgICAgICAgIHNyc2hyICAgICAgICAgICB2MjMuNHMsIHYyMy40cywgIzUKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYxOC40cywgdjE4LjRzLCB2MS40aAorICAgICAgICB1YWRkdzIgICAgICAgICAgdjE5LjRzLCB2MTkuNHMsIHYxLjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOGh9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyNC40cywgdjI0LjRzLCAjNQorICAgICAgICBzcnNociAgICAgICAgICAgdjI1LjRzLCB2MjUuNHMsICM1CisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjAuNHMsIHYyMC40cywgdjIuNGgKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYyMS40cywgdjIxLjRzLCB2Mi44aAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjAuNGgsICB2MTYuNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHYwLjhoLCAgdjE3LjRzCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MTYuOGgsIHc1CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuOGh9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyNi40cywgdjI2LjRzLCAjNQorICAgICAgICBzcnNociAgICAgICAgICAgdjI3LjRzLCB2MjcuNHMsICM1CisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjIuNHMsIHYyMi40cywgdjMuNGgKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYyMy40cywgdjIzLjRzLCB2My44aAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjEuNGgsICB2MTguNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHYxLjhoLCAgdjE5LjRzCisgICAgICAgIHVtaW4gICAgICAgICAgICB2MC44aCwgIHYwLjhoLCAgdjE2LjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuOGh9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyOC40cywgdjI4LjRzLCAjNQorICAgICAgICBzcnNociAgICAgICAgICAgdjI5LjRzLCB2MjkuNHMsICM1CisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjQuNHMsIHYyNC40cywgdjQuNGgKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYyNS40cywgdjI1LjRzLCB2NC44aAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjIuNGgsICB2MjAuNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHYyLjhoLCAgdjIxLjRzCisgICAgICAgIHVtaW4gICAgICAgICAgICB2MS44aCwgIHYxLjhoLCAgdjE2LjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOGh9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYzMC40cywgdjMwLjRzLCAjNQorICAgICAgICBzcnNociAgICAgICAgICAgdjMxLjRzLCB2MzEuNHMsICM1CisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjYuNHMsIHYyNi40cywgdjUuNGgKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYyNy40cywgdjI3LjRzLCB2NS44aAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjMuNGgsICB2MjIuNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHYzLjhoLCAgdjIzLjRzCisgICAgICAgIHVtaW4gICAgICAgICAgICB2Mi44aCwgIHYyLjhoLCAgdjE2LjhoCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC44aH0sICBbeDNdLCB4MQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjI4LjRzLCB2MjguNHMsIHY2LjRoCisgICAgICAgIHVhZGR3MiAgICAgICAgICB2MjkuNHMsIHYyOS40cywgdjYuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS44aH0sICBbeDNdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuNGgsICB2MjQuNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHY0LjhoLCAgdjI1LjRzCisgICAgICAgIHVtaW4gICAgICAgICAgICB2My44aCwgIHYzLjhoLCAgdjE2LjhoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuOGh9LCAgW3gzXSwgeDEKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYzMC40cywgdjMwLjRzLCB2Ny40aAorICAgICAgICB1YWRkdzIgICAgICAgICAgdjMxLjRzLCB2MzEuNHMsIHY3LjhoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOGh9LCAgW3gzXSwgeDEKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHY1LjRoLCAgdjI2LjRzCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2NS44aCwgIHYyNy40cworICAgICAgICB1bWluICAgICAgICAgICAgdjQuOGgsICB2NC44aCwgIHYxNi44aAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjhofSwgIFt4M10sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2Ni40aCwgIHYyOC40cworICAgICAgICBzcXh0dW4yICAgICAgICAgdjYuOGgsICB2MjkuNHMKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHY1LjhoLCAgdjUuOGgsICB2MTYuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44aH0sICBbeDNdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjcuNGgsICB2MzAuNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHY3LjhoLCAgdjMxLjRzCisgICAgICAgIHVtaW4gICAgICAgICAgICB2Ni44aCwgIHY2LjhoLCAgdjE2LjhoCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni44aH0sICBbeDNdLCB4MQorICAgICAgICB1bWluICAgICAgICAgICAgdjcuOGgsICB2Ny44aCwgIHYxNi44aAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjhofSwgIFt4M10sIHgxCisKKy5pZm5jIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorLmVuZGlmCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV84eDhfYWRkXzEwX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgICMweDAzZmYKKyAgICAgICAgYiAgICAgICAgICAgICAgIHZwOV9cdHhmbTFcKClfXHR4Zm0yXCgpXzh4OF9hZGRfMTZfbmVvbgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV84eDhfYWRkXzEyX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgICMweDBmZmYKKyAgICAgICAgYiAgICAgICAgICAgICAgIHZwOV9cdHhmbTFcKClfXHR4Zm0yXCgpXzh4OF9hZGRfMTZfbmVvbgorZW5kZnVuYworLmVuZG0KKworaXR4Zm1fZnVuYzh4OCBpZGN0LCAgaWRjdAoraXR4Zm1fZnVuYzh4OCBpYWRzdCwgaWRjdAoraXR4Zm1fZnVuYzh4OCBpZGN0LCAgaWFkc3QKK2l0eGZtX2Z1bmM4eDggaWFkc3QsIGlhZHN0CisKKworZnVuY3Rpb24gaWRjdDE2eDE2X2RjX2FkZF9uZW9uCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NCwgIGlkY3RfY29lZmZzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNGh9LCBbeDRdCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MC40cywgIHYwLjRoCisKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYxLjRoLCAgIzAKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YyLnN9WzBdLCAgW3gyXQorICAgICAgICBzbXVsbCAgICAgICAgICAgdjIuMmQsICB2Mi4ycywgIHYwLnNbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIHYyLjJzLCAgdjIuMmQsICAjMTQKKyAgICAgICAgc211bGwgICAgICAgICAgIHYyLjJkLCAgdjIuMnMsICB2MC5zWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICB2Mi4ycywgIHYyLjJkLCAgIzE0CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMF0sICBbeDJdCisgICAgICAgIGR1cCAgICAgICAgICAgICB2Mi40cywgIHYyLnNbMF0KKworICAgICAgICBzcnNociAgICAgICAgICAgdjAuNHMsICB2Mi40cywgICM2CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgzLCB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICMxNgorICAgICAgICBkdXAgICAgICAgICAgICAgdjMxLjhoLCB3MTMKKzE6CisgICAgICAgIC8vIExvb3AgdG8gYWRkIHRoZSBjb25zdGFudCBmcm9tIHYyIGludG8gYWxsIDE2eDE2IG91dHB1dHMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg0LCAgeDQsICAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjhoLHYyLjhofSwgIFt4MF0sIHgxCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MTYuNHMsIHYwLjRzLCAgdjEuNGgKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYxNy40cywgdjAuNHMsICB2MS44aAorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjhoLHY0LjhofSwgIFt4MF0sIHgxCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MTguNHMsIHYwLjRzLCAgdjIuNGgKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYxOS40cywgdjAuNHMsICB2Mi44aAorICAgICAgICB1YWRkdyAgICAgICAgICAgdjIwLjRzLCB2MC40cywgIHYzLjRoCisgICAgICAgIHVhZGR3MiAgICAgICAgICB2MjEuNHMsIHYwLjRzLCAgdjMuOGgKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYyMi40cywgdjAuNHMsICB2NC40aAorICAgICAgICB1YWRkdzIgICAgICAgICAgdjIzLjRzLCB2MC40cywgIHY0LjhoCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MS40aCwgIHYxNi40cworICAgICAgICBzcXh0dW4yICAgICAgICAgdjEuOGgsICB2MTcuNHMKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYyLjRoLCAgdjE4LjRzCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2Mi44aCwgIHYxOS40cworICAgICAgICBzcXh0dW4gICAgICAgICAgdjMuNGgsICB2MjAuNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHYzLjhoLCAgdjIxLjRzCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NC40aCwgIHYyMi40cworICAgICAgICBzcXh0dW4yICAgICAgICAgdjQuOGgsICB2MjMuNHMKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHYxLjhoLCAgdjEuOGgsICB2MzEuOGgKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHYyLjhoLCAgdjIuOGgsICB2MzEuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS44aCx2Mi44aH0sICBbeDNdLCB4MQorICAgICAgICB1bWluICAgICAgICAgICAgdjMuOGgsICB2My44aCwgIHYzMS44aAorICAgICAgICB1bWluICAgICAgICAgICAgdjQuOGgsICB2NC44aCwgIHYzMS44aAorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLjhoLHY0LjhofSwgIFt4M10sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorCisgICAgICAgIHJldAorZW5kZnVuYworCisubWFjcm8gaWRjdDE2X2VuZAorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjE4LCB2NywgIHY0LCAgdjcgICAgICAgICAgICAgICAgLy8gdjE4ID0gdDBhLCAgdjcgID0gdDdhCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MTksIHYyMiwgdjUsICB2MjIgICAgICAgICAgICAgICAvLyB2MTkgPSB0MWEsICB2MjIgPSB0NgorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjQsICB2MjYsIHYyMCwgdjI2ICAgICAgICAgICAgICAgLy8gdjQgID0gdDJhLCAgdjI2ID0gdDUKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHY1LCAgdjYsICB2MjgsIHY2ICAgICAgICAgICAgICAgIC8vIHY1ICA9IHQzYSwgIHY2ICA9IHQ0CisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MjAsIHYyOCwgdjE2LCB2MjQgICAgICAgICAgICAgICAvLyB2MjAgPSB0OGEsICB2MjggPSB0MTFhCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MjQsIHYyMSwgdjIzLCB2MjEgICAgICAgICAgICAgICAvLyB2MjQgPSB0OSwgICB2MjEgPSB0MTAKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYyMywgdjI3LCB2MjUsIHYyNyAgICAgICAgICAgICAgIC8vIHYyMyA9IHQxNCwgIHYyNyA9IHQxMworICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjI1LCB2MjksIHYyOSwgdjE3ICAgICAgICAgICAgICAgLy8gdjI1ID0gdDE1YSwgdjI5ID0gdDEyYQorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2OCwgIHY5LCAgdjI3LCB2MjEsIHY4LCAgdjksICB2MTYsIHYxNywgdjMwLCB2MzEgLy8gdjggID0gdDEzYSwgdjkgID0gdDEwYQorICAgICAgICBkbWJ1dHRlcmZseTAgICAgdjI4LCB2MjcsIHYyOSwgdjI4LCB2MjEsIHYyOSwgdjE2LCB2MTcsIHYzMCwgdjMxIC8vIHYyOCA9IHQxMiwgIHYyNyA9IHQxMQorCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MTYsIHYzMSwgdjE4LCB2MjUgICAgICAgICAgICAgICAvLyB2MTYgPSBvdXRbMF0sIHYzMSA9IG91dFsxNV0KKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYxNywgdjMwLCB2MTksIHYyMyAgICAgICAgICAgICAgIC8vIHYxNyA9IG91dFsxXSwgdjMwID0gb3V0WzE0XQorICAgICAgICBidXR0ZXJmbHlfNHNfciAgdjI1LCB2MjIsIHYyMiwgdjI0ICAgICAgICAgICAgICAgLy8gdjI1ID0gb3V0WzldLCB2MjIgPSBvdXRbNl0KKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYyMywgdjI0LCB2NywgIHYyMCAgICAgICAgICAgICAgIC8vIHYyMyA9IG91dFs3XSwgdjI0ID0gb3V0WzhdCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MTgsIHYyOSwgdjQsICB2OCAgICAgICAgICAgICAgICAvLyB2MTggPSBvdXRbMl0sIHYyOSA9IG91dFsxM10KKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYxOSwgdjI4LCB2NSwgIHYyOCAgICAgICAgICAgICAgIC8vIHYxOSA9IG91dFszXSwgdjI4ID0gb3V0WzEyXQorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjIwLCB2MjcsIHY2LCAgdjI3ICAgICAgICAgICAgICAgLy8gdjIwID0gb3V0WzRdLCB2MjcgPSBvdXRbMTFdCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MjEsIHYyNiwgdjI2LCB2OSAgICAgICAgICAgICAgICAvLyB2MjEgPSBvdXRbNV0sIHYyNiA9IG91dFsxMF0KKyAgICAgICAgcmV0CisuZW5kbQorCitmdW5jdGlvbiBpZGN0MTYKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYxNiwgdjI0LCB2MTYsIHYyNCwgdjQsIHY1LCB2NiwgdjcsIHY4LCB2OSAvLyB2MTYgPSB0MGEsICB2MjQgPSB0MWEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMCwgdjI4LCB2MC5zWzJdLCB2MC5zWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjAgPSB0MmEsICB2MjggPSB0M2EKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYxOCwgdjMwLCB2MS5zWzBdLCB2MS5zWzFdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MTggPSB0NGEsICB2MzAgPSB0N2EKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNiwgdjIyLCB2MS5zWzJdLCB2MS5zWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjYgPSB0NWEsICB2MjIgPSB0NmEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYxNywgdjMxLCB2Mi5zWzBdLCB2Mi5zWzFdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MTcgPSB0OGEsICB2MzEgPSB0MTVhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjUsIHYyMywgdjIuc1syXSwgdjIuc1szXSwgdjQsIHY1LCB2NiwgdjcgLy8gdjI1ID0gdDlhLCAgdjIzID0gdDE0YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjIxLCB2MjcsIHYzLnNbMF0sIHYzLnNbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYyMSA9IHQxMGEsIHYyNyA9IHQxM2EKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyOSwgdjE5LCB2My5zWzJdLCB2My5zWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjkgPSB0MTFhLCB2MTkgPSB0MTJhCisKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHY0LCAgdjI4LCB2MTYsIHYyOCAgICAgICAgICAgICAgIC8vIHY0ICA9IHQwLCAgIHYyOCA9IHQzCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2NSwgIHYyMCwgdjI0LCB2MjAgICAgICAgICAgICAgICAvLyB2NSAgPSB0MSwgICB2MjAgPSB0MgorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjYsICB2MjYsIHYxOCwgdjI2ICAgICAgICAgICAgICAgLy8gdjYgID0gdDQsICAgdjI2ID0gdDUKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHY3LCAgdjIyLCB2MzAsIHYyMiAgICAgICAgICAgICAgIC8vIHY3ICA9IHQ3LCAgIHYyMiA9IHQ2CisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MTYsIHYyNSwgdjE3LCB2MjUgICAgICAgICAgICAgICAvLyB2MTYgPSB0OCwgICB2MjUgPSB0OQorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjI0LCB2MjEsIHYyOSwgdjIxICAgICAgICAgICAgICAgLy8gdjI0ID0gdDExLCAgdjIxID0gdDEwCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MTcsIHYyNywgdjE5LCB2MjcgICAgICAgICAgICAgICAvLyB2MTcgPSB0MTIsICB2MjcgPSB0MTMKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYyOSwgdjIzLCB2MzEsIHYyMyAgICAgICAgICAgICAgIC8vIHYyOSA9IHQxNSwgIHYyMyA9IHQxNAorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MjIsIHYyNiwgdjIyLCB2MjYsIHY4LCB2OSwgdjE4LCB2MTksIHYzMCwgdjMxICAgICAgICAvLyB2MjIgPSB0NmEsICB2MjYgPSB0NWEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMywgdjI1LCB2MC5zWzJdLCB2MC5zWzNdLCB2MTgsIHYxOSwgdjMwLCB2MzEgICAgICAgIC8vIHYyMyA9IHQ5YSwgIHYyNSA9IHQxNGEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNywgdjIxLCB2MC5zWzJdLCB2MC5zWzNdLCB2MTgsIHYxOSwgdjMwLCB2MzEsIG5lZz0xIC8vIHYyNyA9IHQxM2EsIHYyMSA9IHQxMGEKKyAgICAgICAgaWRjdDE2X2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MTZfaGFsZgorICAgICAgICBkbWJ1dHRlcmZseTBfaCAgdjE2LCB2MjQsIHYxNiwgdjI0LCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5IC8vIHYxNiA9IHQwYSwgIHYyNCA9IHQxYQorICAgICAgICBkbWJ1dHRlcmZseV9oMSAgdjIwLCB2MjgsIHYwLnNbMl0sIHYwLnNbM10sIHY0LCB2NSwgdjYsIHY3IC8vIHYyMCA9IHQyYSwgIHYyOCA9IHQzYQorICAgICAgICBkbWJ1dHRlcmZseV9oMSAgdjE4LCB2MzAsIHYxLnNbMF0sIHYxLnNbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYxOCA9IHQ0YSwgIHYzMCA9IHQ3YQorICAgICAgICBkbWJ1dHRlcmZseV9oMiAgdjI2LCB2MjIsIHYxLnNbMl0sIHYxLnNbM10sIHY0LCB2NSwgdjYsIHY3IC8vIHYyNiA9IHQ1YSwgIHYyMiA9IHQ2YQorICAgICAgICBkbWJ1dHRlcmZseV9oMSAgdjE3LCB2MzEsIHYyLnNbMF0sIHYyLnNbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYxNyA9IHQ4YSwgIHYzMSA9IHQxNWEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDIgIHYyNSwgdjIzLCB2Mi5zWzJdLCB2Mi5zWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjUgPSB0OWEsICB2MjMgPSB0MTRhCisgICAgICAgIGRtYnV0dGVyZmx5X2gxICB2MjEsIHYyNywgdjMuc1swXSwgdjMuc1sxXSwgdjQsIHY1LCB2NiwgdjcgLy8gdjIxID0gdDEwYSwgdjI3ID0gdDEzYQorICAgICAgICBkbWJ1dHRlcmZseV9oMiAgdjI5LCB2MTksIHYzLnNbMl0sIHYzLnNbM10sIHY0LCB2NSwgdjYsIHY3IC8vIHYyOSA9IHQxMWEsIHYxOSA9IHQxMmEKKworICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjQsICB2MjgsIHYxNiwgdjI4ICAgICAgICAgICAgICAgLy8gdjQgID0gdDAsICAgdjI4ID0gdDMKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHY1LCAgdjIwLCB2MjQsIHYyMCAgICAgICAgICAgICAgIC8vIHY1ICA9IHQxLCAgIHYyMCA9IHQyCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2NiwgIHYyNiwgdjE4LCB2MjYgICAgICAgICAgICAgICAvLyB2NiAgPSB0NCwgICB2MjYgPSB0NQorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjcsICB2MjIsIHYzMCwgdjIyICAgICAgICAgICAgICAgLy8gdjcgID0gdDcsICAgdjIyID0gdDYKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYxNiwgdjI1LCB2MTcsIHYyNSAgICAgICAgICAgICAgIC8vIHYxNiA9IHQ4LCAgIHYyNSA9IHQ5CisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MjQsIHYyMSwgdjI5LCB2MjEgICAgICAgICAgICAgICAvLyB2MjQgPSB0MTEsICB2MjEgPSB0MTAKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYxNywgdjI3LCB2MTksIHYyNyAgICAgICAgICAgICAgIC8vIHYxNyA9IHQxMiwgIHYyNyA9IHQxMworICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjI5LCB2MjMsIHYzMSwgdjIzICAgICAgICAgICAgICAgLy8gdjI5ID0gdDE1LCAgdjIzID0gdDE0CisKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMiwgdjI2LCB2MjIsIHYyNiwgdjgsIHY5LCB2MTgsIHYxOSwgdjMwLCB2MzEgICAgICAgIC8vIHYyMiA9IHQ2YSwgIHYyNiA9IHQ1YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjIzLCB2MjUsIHYwLnNbMl0sIHYwLnNbM10sIHYxOCwgdjE5LCB2MzAsIHYzMSAgICAgICAgLy8gdjIzID0gdDlhLCAgdjI1ID0gdDE0YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI3LCB2MjEsIHYwLnNbMl0sIHYwLnNbM10sIHYxOCwgdjE5LCB2MzAsIHYzMSwgbmVnPTEgLy8gdjI3ID0gdDEzYSwgdjIxID0gdDEwYQorICAgICAgICBpZGN0MTZfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QxNl9xdWFydGVyCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2MjQsIHYyNSwgdjE5LCB2My5zWzNdCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2NCwgIHY1LCAgdjE3LCB2Mi5zWzBdCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2NywgIHY2LCAgdjE4LCB2MS5zWzFdCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2MzAsIHYzMSwgdjE4LCB2MS5zWzBdCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MjQuMmQsICB2MjQuMmQKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyNS4yZCwgIHYyNS4yZAorICAgICAgICBkc211bGxfaCAgICAgICAgdjI5LCB2MjgsIHYxNywgdjIuc1sxXQorICAgICAgICBkc211bGxfaCAgICAgICAgdjI2LCB2MjcsIHYxOSwgdjMuc1syXQorICAgICAgICBkc211bGxfaCAgICAgICAgdjIyLCB2MjMsIHYxNiwgdjAuc1swXQorICAgICAgICBkcnNocm5faCAgICAgICAgdjI0LCB2MjQsIHYyNSwgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MTYsIHY0LCAgdjUsICAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHY3LCAgdjcsICB2NiwgICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjYsICB2MzAsIHYzMSwgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjksIHYyOSwgdjI4LCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYxNywgdjI2LCB2MjcsICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjI4LCB2MjIsIHYyMywgIzE0CisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjE3LCB2MjQsIHYwLnNbMl0sIHYwLnNbM10KKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxOCwgdjE5LCB2MzAsIHYzMSwgdjI5LCB2MTYsIHYwLnNbMl0sIHYwLnNbM10KKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyMi4yZCwgIHYyMi4yZAorICAgICAgICBuZWcgICAgICAgICAgICAgdjIzLjJkLCAgdjIzLjJkCisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjcsIHYyMCwgdjIxLCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyMSwgdjIyLCB2MjMsICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjIzLCB2MTgsIHYxOSwgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjUsIHYzMCwgdjMxLCAjMTQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY0LjE2YiwgIHYyOC4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY1LjE2YiwgIHYyOC4xNmIKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMiwgdjI2LCB2NywgIHY2LCAgdjE4LCB2MTksIHYzMCwgdjMxCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjAuMTZiLCB2MjguMTZiCisgICAgICAgIGlkY3QxNl9lbmQKK2VuZGZ1bmMKKworZnVuY3Rpb24gaWFkc3QxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhoLHYxLjhofSwgW3gxMV0KKyAgICAgICAgc3h0bCAgICAgICAgICAgIHYyLjRzLCAgdjEuNGgKKyAgICAgICAgc3h0bDIgICAgICAgICAgIHYzLjRzLCAgdjEuOGgKKyAgICAgICAgc3h0bDIgICAgICAgICAgIHYxLjRzLCAgdjAuOGgKKyAgICAgICAgc3h0bCAgICAgICAgICAgIHYwLjRzLCAgdjAuNGgKKworICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjYsICB2NywgIHY0LCAgdjUsICB2MzEsIHYxNiwgdjAuc1sxXSwgdjAuc1swXSAgIC8vIHY2LHY3ICAgPSB0MSwgICB2NCx2NSAgID0gdDAKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxMCwgdjExLCB2OCwgIHY5LCAgdjIzLCB2MjQsIHYxLnNbMV0sIHYxLnNbMF0gICAvLyB2MTAsdjExID0gdDksICAgdjgsdjkgICA9IHQ4CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MzEsIHYyNCwgdjYsICB2NywgIHYxMCwgdjExLCB2MTIsIHYxMywgdjEwLCB2MTEgLy8gdjMxICAgICA9IHQxYSwgIHYyNCAgICAgPSB0OWEKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxNCwgdjE1LCB2MTIsIHYxMywgdjI5LCB2MTgsIHYwLnNbM10sIHYwLnNbMl0gICAvLyB2MTQsdjE1ID0gdDMsICAgdjEyLHYxMyA9IHQyCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MTYsIHYyMywgdjQsICB2NSwgIHY4LCAgdjksICB2NiwgIHY3LCAgdjgsICB2OSAgLy8gdjE2ICAgICA9IHQwYSwgIHYyMyAgICAgPSB0OGEKKworICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjYsICB2NywgIHY0LCAgdjUsICB2MjEsIHYyNiwgdjEuc1szXSwgdjEuc1syXSAgIC8vIHY2LHY3ICAgPSB0MTEsICB2NCx2NSAgID0gdDEwCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjksIHYyNiwgdjE0LCB2MTUsIHY2LCAgdjcsICB2OCwgIHY5LCAgdjYsICB2NyAgLy8gdjI5ICAgICA9IHQzYSwgIHYyNiAgICAgPSB0MTFhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTAsIHYxMSwgdjgsICB2OSwgIHYyNywgdjIwLCB2Mi5zWzFdLCB2Mi5zWzBdICAgLy8gdjEwLHYxMSA9IHQ1LCAgIHY4LHY5ICAgPSB0NAorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjE4LCB2MjEsIHYxMiwgdjEzLCB2NCwgIHY1LCAgdjYsICB2NywgIHY0LCAgdjUgIC8vIHYxOCAgICAgPSB0MmEsICB2MjEgICAgID0gdDEwYQorCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTQsIHYxNSwgdjEyLCB2MTMsIHYxOSwgdjI4LCB2My5zWzFdLCB2My5zWzBdICAgLy8gdjE0LHYxNSA9IHQxMywgIHYxMix2MTMgPSB0MTIKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIHYyMCwgdjI4LCB2MTAsIHYxMSwgdjE0LCB2MTUsIHY0LCAgdjUsICB2MTQsIHYxNSAvLyB2MjAgICAgID0gdDVhLCAgdjI4ICAgICA9IHQxM2EKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHY2LCAgdjcsICB2NCwgIHY1LCAgdjI1LCB2MjIsIHYyLnNbM10sIHYyLnNbMl0gICAvLyB2Nix2NyAgID0gdDcsICAgdjQsdjUgICA9IHQ2CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjcsIHYxOSwgdjgsICB2OSwgIHYxMiwgdjEzLCB2MTAsIHYxMSwgdjEyLCB2MTMgLy8gdjI3ICAgICA9IHQ0YSwgIHYxOSAgICAgPSB0MTJhCisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxMCwgdjExLCB2OCwgIHY5LCAgdjE3LCB2MzAsIHYzLnNbM10sIHYzLnNbMl0gICAvLyB2MTAsdjExID0gdDE1LCAgdjgsdjkgICA9IHQxNAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhofSwgW3gxMF0KKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIHYyMiwgdjMwLCB2NiwgIHY3LCAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTAsIHYxMSAvLyB2MjIgICAgID0gdDdhLCAgdjMwICAgICA9IHQxNWEKKyAgICAgICAgc3h0bDIgICAgICAgICAgIHYxLjRzLCAgdjAuOGgKKyAgICAgICAgc3h0bCAgICAgICAgICAgIHYwLjRzLCAgdjAuNGgKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxNCwgdjE1LCB2MTIsIHYxMywgdjIzLCB2MjQsIHYxLnNbMF0sIHYxLnNbMV0gICAvLyB2MTQsdjE1ID0gdDksICAgdjEyLHYxMyA9IHQ4CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjUsIHYxNywgdjQsICB2NSwgIHY4LCAgdjksICB2NiwgIHY3LCAgdjgsICB2OSAgLy8gdjI1ICAgICA9IHQ2YSwgIHYxNyAgICAgPSB0MTRhCisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHY0LCAgdjUsICB2NiwgIHY3LCAgdjI4LCB2MTksIHYxLnNbMV0sIHYxLnNbMF0gICAvLyB2NCx2NSAgID0gdDEyLCAgdjYsdjcgICA9IHQxMworICAgICAgICBkYnV0dGVyZmx5X24gICAgdjIzLCB2MTksIHYxMiwgdjEzLCB2NCwgIHY1LCAgdjgsICB2OSwgIHY0LCAgdjUgIC8vIHYyMyAgICAgPSB0OGEsICB2MTkgICAgID0gdDEyYQorICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjEwLCB2MTEsIHY4LCAgdjksICB2MjEsIHYyNiwgdjEuc1syXSwgdjEuc1szXSAgIC8vIHYxMCx2MTEgPSB0MTEsICB2OCx2OSAgID0gdDEwCisgICAgICAgIGJ1dHRlcmZseV80c19yICB2NCwgIHYyNywgdjE2LCB2MjcgICAgICAgICAgICAgICAvLyB2NCAgPSB0NCwgICB2MjcgPSB0MAorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjI0LCB2MjgsIHYxNCwgdjE1LCB2NiwgIHY3LCAgdjEyLCB2MTMsIHY2LCAgdjcgIC8vIHYyNCAgICAgPSB0OWEsICB2MjggICAgID0gdDEzYQorCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYzMCwgdjE3LCB2MS5zWzNdLCB2MS5zWzJdICAgLy8gdjEyLHYxMyA9IHQxNCwgIHYxNCx2MTUgPSB0MTUKKyAgICAgICAgYnV0dGVyZmx5XzRzX3IgIHY1LCAgdjIwLCB2MzEsIHYyMCAgICAgICAgICAgICAgIC8vIHY1ICA9IHQ1LCB2MjAgPSB0MQorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjIxLCB2MTcsIHY4LCAgdjksICB2MTIsIHYxMywgdjYsICB2NywgIHYxMiwgdjEzIC8vIHYyMSAgICAgPSB0MTBhLCB2MTcgICAgID0gdDE0YQorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjI2LCB2MzAsIHYxMCwgdjExLCB2MTQsIHYxNSwgdjgsICB2OSwgIHYxNCwgdjE1IC8vIHYyNiAgICAgPSB0MTFhLCB2MzAgICAgID0gdDE1YQorCisgICAgICAgIGJ1dHRlcmZseV80c19yICB2NiwgIHYyNSwgdjE4LCB2MjUgICAgICAgICAgICAgICAvLyB2NiAgPSB0NiwgdjI1ID0gdDIKKyAgICAgICAgYnV0dGVyZmx5XzRzX3IgIHY3LCAgdjIyLCB2MjksIHYyMiAgICAgICAgICAgICAgIC8vIHY3ICA9IHQ3LCB2MjIgPSB0MworCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTAsIHYxMSwgdjgsICB2OSwgIHYxOSwgdjI4LCB2MC5zWzJdLCB2MC5zWzNdICAgLy8gdjEwLHYxMSA9IHQxMywgIHY4LHY5ICAgPSB0MTIKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjMwLCB2MTcsIHYwLnNbM10sIHYwLnNbMl0gICAvLyB2MTIsdjEzID0gdDE0LCAgdjE0LHYxNSA9IHQxNQorCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MTgsIHYzMCwgdjgsICB2OSwgIHYxMiwgdjEzLCB2MTYsIHYxNywgdjEyLCB2MTMgLy8gdjE4ICAgPSBvdXRbMl0sIHYzMCAgICAgPSB0MTRhCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjksIHYxNywgdjEwLCB2MTEsIHYxNCwgdjE1LCB2MTIsIHYxMywgdjE0LCB2MTUgLy8gdjI5ID0gLW91dFsxM10sIHYxNyAgICAgPSB0MTVhCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MjkuNHMsIHYyOS40cyAgICAgICAgICAgICAgICAgICAvLyB2MjkgPSBvdXRbMTNdCisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxMCwgdjExLCB2OCwgIHY5LCAgdjQsICB2NSwgIHYwLnNbMl0sIHYwLnNbM10gICAvLyB2MTAsdjExID0gdDVhLCAgdjgsdjkgICA9IHQ0YQorICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2NywgIHY2LCAgdjAuc1szXSwgdjAuc1syXSAgIC8vIHYxMix2MTMgPSB0NmEsICB2MTQsdjE1ID0gdDdhCisKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYyLCAgdjYsICB2MjcsIHYyNSAgICAgICAgICAgICAgIC8vIHYyID0gb3V0WzBdLCB2NiA9IHQyYQorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjMsICB2NywgIHYyMywgdjIxICAgICAgICAgICAgICAgLy8gdjMgPS1vdXRbMV0sIHY3ID0gdDEwCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIHYxOSwgdjMxLCB2OCwgIHY5LCAgdjEyLCB2MTMsIHY0LCAgdjUsICB2OCwgIHY5ICAvLyB2MTkgPSAtb3V0WzNdLCAgdjMxID0gdDYKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYxOS40cywgdjE5LjRzICAgICAgICAgICAgICAgICAgIC8vIHYxOSA9IG91dFszXQorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjI4LCB2MTYsIHYxMCwgdjExLCB2MTQsIHYxNSwgdjQsICB2NSwgIHYxMCwgdjExIC8vIHYyOCA9IG91dFsxMl0sICB2MTYgPSB0NworCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2NSwgIHY4LCAgdjIwLCB2MjIgICAgICAgICAgICAgICAvLyB2NSA9LW91dFsxNV0sdjggPSB0M2EKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHY0LCAgdjksICB2MjQsIHYyNiAgICAgICAgICAgICAgIC8vIHY0ID0gb3V0WzE0XSx2OSA9IHQxMQorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MjMsIHYyNCwgdjYsICB2OCwgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIDEgLy8gdjIzID0gb3V0WzddLCB2MjQgPSBvdXRbOF0KKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMSwgdjI2LCB2MzAsIHYxNywgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgMSAvLyB2MjEgPSBvdXRbNV0sIHYyNiA9IG91dFsxMF0KKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMCwgdjI3LCB2MTYsIHYzMSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSAgICAvLyB2MjAgPSBvdXRbNF0sIHYyNyA9IG91dFsxMV0KKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMiwgdjI1LCB2OSwgIHY3LCAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSAgICAvLyB2MjIgPSBvdXRbNl0sIHYyNSA9IG91dFs5XQorCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MzEuNHMsICB2NS40cyAgICAgICAgICAgICAgICAgICAgLy8gdjMxID0gb3V0WzE1XQorICAgICAgICBuZWcgICAgICAgICAgICAgdjE3LjRzLCAgdjMuNHMgICAgICAgICAgICAgICAgICAgIC8vIHYxNyA9IG91dFsxXQorCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MTYuMTZiLCB2Mi4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYzMC4xNmIsIHY0LjE2YgorICAgICAgICByZXQKK2VuZGZ1bmMKKworLy8gSGVscGVyIG1hY3Jvczsgd2UgY2FuJ3QgdXNlIHRoZXNlIGV4cHJlc3Npb25zIGRpcmVjdGx5IHdpdGhpbgorLy8gZS5nLiAuaXJwIGR1ZSB0byB0aGUgZXh0cmEgY29uY2F0ZW5hdGlvbiBcKCkuIFRoZXJlZm9yZSB3cmFwCisvLyB0aGVtIGluIG1hY3JvcyB0byBhbGxvdyB1c2luZyAuaXJwIGJlbG93LgorLm1hY3JvIGxvYWQgaSwgc3JjLCBpbmMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2XGlcKCkuNHN9LCAgW1xzcmNdLCBcaW5jCisuZW5kbQorLm1hY3JvIHN0b3JlIGksIGRzdCwgaW5jCisgICAgICAgIHN0MSAgICAgICAgICAgICB7dlxpXCgpLjRzfSwgIFtcZHN0XSwgXGluYworLmVuZG0KKy5tYWNybyBtb3ZpX3YgaSwgc2l6ZSwgaW1tCisgICAgICAgIG1vdmkgICAgICAgICAgICB2XGlcKClcc2l6ZSwgIFxpbW0KKy5lbmRtCisubWFjcm8gbG9hZF9jbGVhciBpLCBzcmMsIGluYworICAgICAgICBsZDEgICAgICAgICAgICAge3ZcaVwoKS40c30sIFtcc3JjXQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjRzfSwgIFtcc3JjXSwgXGluYworLmVuZG0KKworLm1hY3JvIGxvYWRfYWRkX3N0b3JlIGNvZWYwLCBjb2VmMSwgY29lZjIsIGNvZWYzLCBjb2VmNCwgY29lZjUsIGNvZWY2LCBjb2VmNworICAgICAgICBzcnNociAgICAgICAgICAgXGNvZWYwLCBcY29lZjAsICM2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICBcY29lZjEsIFxjb2VmMSwgIzYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC5kfVsxXSwgW3gzXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIFxjb2VmMiwgXGNvZWYyLCAjNgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjRofSwgICBbeDBdLCB4MQorICAgICAgICBzcnNociAgICAgICAgICAgXGNvZWYzLCBcY29lZjMsICM2CisgICAgICAgIHVhZGR3ICAgICAgICAgICBcY29lZjAsIFxjb2VmMCwgdjQuNGgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS5kfVsxXSwgW3gzXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIFxjb2VmNCwgXGNvZWY0LCAjNgorICAgICAgICB1YWRkdzIgICAgICAgICAgXGNvZWYxLCBcY29lZjEsIHY0LjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICBcY29lZjUsIFxjb2VmNSwgIzYKKyAgICAgICAgdWFkZHcgICAgICAgICAgIFxjb2VmMiwgXGNvZWYyLCB2NS40aAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LmR9WzFdLCBbeDNdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuNGgsICBcY29lZjAKKyAgICAgICAgc3JzaHIgICAgICAgICAgIFxjb2VmNiwgXGNvZWY2LCAjNgorICAgICAgICB1YWRkdzIgICAgICAgICAgXGNvZWYzLCBcY29lZjMsIHY1LjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2NC44aCwgIFxjb2VmMQorICAgICAgICBzcnNociAgICAgICAgICAgXGNvZWY3LCBcY29lZjcsICM2CisgICAgICAgIHVhZGR3ICAgICAgICAgICBcY29lZjQsIFxjb2VmNCwgdjYuNGgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny5kfVsxXSwgW3gzXSwgeDEKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHY0LjhoLCAgdjQuOGgsICB2OC44aAorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgzLCAgeDMsICB4MSwgbHNsICMyCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NS40aCwgIFxjb2VmMgorICAgICAgICB1YWRkdzIgICAgICAgICAgXGNvZWY1LCBcY29lZjUsIHY2LjhoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2NS44aCwgIFxjb2VmMworICAgICAgICB1YWRkdyAgICAgICAgICAgXGNvZWY2LCBcY29lZjYsIHY3LjRoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuZH1bMV0sIFt4M10sIHgxCisgICAgICAgIHVtaW4gICAgICAgICAgICB2NS44aCwgIHY1LjhoLCAgdjguOGgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHY2LjRoLCAgXGNvZWY0CisgICAgICAgIHVhZGR3MiAgICAgICAgICBcY29lZjcsIFxjb2VmNywgdjcuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS40aH0sICAgW3gwXSwgeDEKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHY2LjhoLCAgXGNvZWY1CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djUuZH1bMV0sIFt4M10sIHgxCisgICAgICAgIHVtaW4gICAgICAgICAgICB2Ni44aCwgIHY2LjhoLCAgdjguOGgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHY3LjRoLCAgXGNvZWY2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2Ny44aCwgIFxjb2VmNworICAgICAgICBzdDEgICAgICAgICAgICAge3Y2LmR9WzFdLCBbeDNdLCB4MQorICAgICAgICB1bWluICAgICAgICAgICAgdjcuOGgsICB2Ny44aCwgIHY4LjhoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuZH1bMV0sIFt4M10sIHgxCisuZW5kbQorCisvLyBSZWFkIGEgdmVydGljYWwgNHgxNiBzbGljZSBvdXQgb2YgYSAxNngxNiBtYXRyaXgsIGRvIGEgdHJhbnNmb3JtIG9uIGl0LAorLy8gdHJhbnNwb3NlIGludG8gYSBob3Jpem9udGFsIDE2eDQgc2xpY2UgYW5kIHN0b3JlLgorLy8geDAgPSBkc3QgKHRlbXAgYnVmZmVyKQorLy8geDEgPSBzbGljZSBvZmZzZXQKKy8vIHgyID0gc3JjCisvLyB4OSA9IGlucHV0IHN0cmlkZQorLm1hY3JvIGl0eGZtMTZfMWRfZnVuY3MgdHhmbQorZnVuY3Rpb24gXHR4Zm1cKCkxNl8xZF80eDE2X3Bhc3MxX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisKKyAgICAgICAgbW92aSAgICAgICAgICAgIHY0LjRzLCAjMAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBsb2FkX2NsZWFyICAgICAgXGksICB4MiwgIHg5CisuZW5kcgorCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHhmbVwoKTE2CisKKyAgICAgICAgLy8gRG8gZm91ciA0eDQgdHJhbnNwb3Nlcy4gT3JpZ2luYWxseSwgdjE2LXYzMSBjb250YWluIHRoZQorICAgICAgICAvLyAxNiByb3dzLiBBZnRlcndhcmRzLCB2MTYtdjE5LCB2MjAtdjIzLCB2MjQtdjI3IGFuZCB2MjgtdjMxCisgICAgICAgIC8vIGNvbnRhaW4gdGhlIGZvdXIgdHJhbnNwb3NlZCA0eDQgYmxvY2tzLgorICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjI4LCB2MjksIHYzMCwgdjMxLCB2NCwgdjUsIHY2LCB2NworCisgICAgICAgIC8vIFN0b3JlIHRoZSB0cmFuc3Bvc2VkIDR4NCBibG9ja3MgaG9yaXpvbnRhbGx5LgorICAgICAgICBjbXAgICAgICAgICAgICAgeDEsICAjMTIKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDFmCisuaXJwIGksIDE2LCAyMCwgMjQsIDI4LCAxNywgMjEsIDI1LCAyOSwgMTgsIDIyLCAyNiwgMzAsIDE5LCAyMywgMjcsIDMxCisgICAgICAgIHN0b3JlICAgICAgICAgICBcaSwgIHgwLCAgIzE2CisuZW5kcgorICAgICAgICBiciAgICAgICAgICAgICAgeDE0CisxOgorICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IEZvciB0aGUgbGFzdCBpbnB1dCBjb2x1bW4gKHgxID09IDEyKSwKKyAgICAgICAgLy8gd2hpY2ggd291bGQgYmUgc3RvcmVkIGFzIHRoZSBsYXN0IHJvdyBpbiB0aGUgdGVtcCBidWZmZXIsCisgICAgICAgIC8vIGRvbid0IHN0b3JlIHRoZSBmaXJzdCA0eDQgYmxvY2ssIGJ1dCBrZWVwIGl0IGluIHJlZ2lzdGVycworICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IHNsaWNlIG9mIHRoZSBzZWNvbmQgcGFzcyAod2hlcmUgaXQgaXMgdGhlCisgICAgICAgIC8vIGxhc3QgNHg0IGJsb2NrKS4KKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyOC40c30sICBbeDBdLCAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyOS40c30sICBbeDBdLCAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI2LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMC40c30sICBbeDBdLCAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI3LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMS40c30sICBbeDBdLCAjMTYKKworICAgICAgICBtb3YgICAgICAgICAgICAgdjI4LjE2YiwgdjE2LjE2YgorICAgICAgICBtb3YgICAgICAgICAgICAgdjI5LjE2YiwgdjE3LjE2YgorICAgICAgICBtb3YgICAgICAgICAgICAgdjMwLjE2YiwgdjE4LjE2YgorICAgICAgICBtb3YgICAgICAgICAgICAgdjMxLjE2YiwgdjE5LjE2YgorICAgICAgICBiciAgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKKy8vIFJlYWQgYSB2ZXJ0aWNhbCA0eDE2IHNsaWNlIG91dCBvZiBhIDE2eDE2IG1hdHJpeCwgZG8gYSB0cmFuc2Zvcm0gb24gaXQsCisvLyBsb2FkIHRoZSBkZXN0aW5hdGlvbiBwaXhlbHMgKGZyb20gYSBzaW1pbGFyIDR4MTYgc2xpY2UpLCBhZGQgYW5kIHN0b3JlIGJhY2suCisvLyB4MCA9IGRzdAorLy8geDEgPSBkc3Qgc3RyaWRlCisvLyB4MiA9IHNyYyAodGVtcCBidWZmZXIpCisvLyB4MyA9IHNsaWNlIG9mZnNldAorLy8geDkgPSB0ZW1wIGJ1ZmZlciBzdHJpZGUKK2Z1bmN0aW9uIFx0eGZtXCgpMTZfMWRfNHgxNl9wYXNzMl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorCisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCAgeDIsICB4OQorLmVuZHIKKyAgICAgICAgY2J6ICAgICAgICAgICAgIHgzLCAgMWYKKy5pcnAgaSwgMjgsIDI5LCAzMCwgMzEKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCAgeDIsICB4OQorLmVuZHIKKzE6CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgzLCAgeDAsICB4MQorICAgICAgICBsc2wgICAgICAgICAgICAgeDEsICB4MSwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHhmbVwoKTE2CisKKyAgICAgICAgZHVwICAgICAgICAgICAgIHY4LjhoLCB3MTMKKyAgICAgICAgbG9hZF9hZGRfc3RvcmUgIHYxNi40cywgdjE3LjRzLCB2MTguNHMsIHYxOS40cywgdjIwLjRzLCB2MjEuNHMsIHYyMi40cywgdjIzLjRzCisgICAgICAgIGxvYWRfYWRkX3N0b3JlICB2MjQuNHMsIHYyNS40cywgdjI2LjRzLCB2MjcuNHMsIHYyOC40cywgdjI5LjRzLCB2MzAuNHMsIHYzMS40cworCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKy5lbmRtCisKK2l0eGZtMTZfMWRfZnVuY3MgaWRjdAoraXR4Zm0xNl8xZF9mdW5jcyBpYWRzdAorCisvLyBUaGlzIGlzIHRoZSBtaW5pbXVtIGVvYiB2YWx1ZSBmb3IgZWFjaCBzdWJwYXJ0aXRpb24sIGluIGluY3JlbWVudHMgb2YgNAorY29uc3QgbWluX2VvYl9pZGN0X2lkY3RfMTYsIGFsaWduPTQKKyAgICAgICAgLnNob3J0ICAwLCAxMCwgMzgsIDg5CitlbmRjb25zdAorCisubWFjcm8gaXR4Zm1fZnVuYzE2eDE2IHR4Zm0xLCB0eGZtMgorZnVuY3Rpb24gdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfMTZ4MTZfYWRkXzE2X25lb24KKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIGlkY3QxNngxNl9kY19hZGRfbmVvbgorLmVuZGlmCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTUsIHgzMAorICAgICAgICAvLyBpYWRzdDE2IHJlcXVpcmVzIGNsb2JiZXJpbmcgdjgtdjE1LCBpZGN0MTYgb25seSBjbG9iYmVycyB2OC12OS4KKy5pZm5jIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3AsICMtMHgxMF0hCisuZW5kaWYKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3AsICMtMHgxMF0hCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjMTAyNAorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgIHgxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgIHgyCisKKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxMCwgaWRjdF9jb2VmZnMKKy5pZm5jIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTEsIGlhZHN0MTZfY29lZmZzCisuZW5kaWYKKy5pZmMgXHR4Zm0xLGlkY3QKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44aCx2MS44aH0sIFt4MTBdCisgICAgICAgIHN4dGwgICAgICAgICAgICB2Mi40cywgIHYxLjRoCisgICAgICAgIHN4dGwyICAgICAgICAgICB2My40cywgIHYxLjhoCisgICAgICAgIHN4dGwyICAgICAgICAgICB2MS40cywgIHYwLjhoCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MC40cywgIHYwLjRoCisuZW5kaWYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgIzY0CisKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzEwCisgICAgICAgIGIubGUgICAgICAgICAgICBpZGN0MTZ4MTZfcXVhcnRlcl9hZGRfMTZfbmVvbgorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMzgKKyAgICAgICAgYi5sZSAgICAgICAgICAgIGlkY3QxNngxNl9oYWxmX2FkZF8xNl9uZW9uCisKKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxMiwgbWluX2VvYl9pZGN0X2lkY3RfMTYsIDIKKy5lbmRpZgorCisuaXJwIGksIDAsIDQsIDgsIDEyCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHNwLCAgIyhcaSo2NCkKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKy5pZiBcaSA+IDAKKyAgICAgICAgbGRyaCAgICAgICAgICAgIHcxLCAgW3gxMl0sICMyCisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgIHcxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgICMoMTYgLSBcaSkvNAorICAgICAgICBiLmxlICAgICAgICAgICAgMWYKKy5lbmRpZgorLmVuZGlmCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgICNcaQorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4NiwgICMoXGkqNCkKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eGZtMVwoKTE2XzFkXzR4MTZfcGFzczFfbmVvbgorLmVuZHIKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpYWRzdF9pZGN0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuOGgsdjEuOGh9LCBbeDEwXQorICAgICAgICBzeHRsICAgICAgICAgICAgdjIuNHMsICB2MS40aAorICAgICAgICBzeHRsMiAgICAgICAgICAgdjMuNHMsICB2MS44aAorICAgICAgICBzeHRsMiAgICAgICAgICAgdjEuNHMsICB2MC44aAorICAgICAgICBzeHRsICAgICAgICAgICAgdjAuNHMsICB2MC40aAorLmVuZGlmCisKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgYiAgICAgICAgICAgICAgIDNmCisxOgorICAgICAgICAvLyBTZXQgdjI4LXYzMSB0byB6ZXJvLCBmb3IgdGhlIGluLXJlZ2lzdGVyIHBhc3N0aHJvdWdoIG9mCisgICAgICAgIC8vIGNvZWZmaWNpZW50cyB0byBwYXNzIDIuCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MjguNHMsICAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjI5LjRzLCAgIzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYzMC40cywgICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MzEuNHMsICAjMAorMjoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHgxLCAgeDEsICAjMQorLnJlcHQgNAorICAgICAgICBzdDEgICAgICAgICAgICAge3YyOC40cyx2MjkuNHMsdjMwLjRzLHYzMS40c30sIFt4MF0sIHg5CisuZW5kcgorICAgICAgICBiLm5lICAgICAgICAgICAgMmIKKzM6CisuZW5kaWYKKworLmlycCBpLCAwLCA0LCA4LCAxMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4NCwgICMoXGkqMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxLCAgeDUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgc3AsICAjKFxpKjQpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgICNcaQorICAgICAgICBibCAgICAgICAgICAgICAgXHR4Zm0yXCgpMTZfMWRfNHgxNl9wYXNzMl9uZW9uCisuZW5kcgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzEwMjQKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3BdLCAweDEwCisuaWZuYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwXSwgMHgxMAorLmVuZGlmCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTUKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfMTZ4MTZfYWRkXzEwX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTMsICMweDAzZmYKKyAgICAgICAgYiAgICAgICAgICAgICAgIHZwOV9cdHhmbTFcKClfXHR4Zm0yXCgpXzE2eDE2X2FkZF8xNl9uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9cdHhmbTFcKClfXHR4Zm0yXCgpXzE2eDE2X2FkZF8xMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEzLCAjMHgwZmZmCisgICAgICAgIGIgICAgICAgICAgICAgICB2cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV8xNngxNl9hZGRfMTZfbmVvbgorZW5kZnVuYworLmVuZG0KKworaXR4Zm1fZnVuYzE2eDE2IGlkY3QsICBpZGN0CitpdHhmbV9mdW5jMTZ4MTYgaWFkc3QsIGlkY3QKK2l0eGZtX2Z1bmMxNngxNiBpZGN0LCAgaWFkc3QKK2l0eGZtX2Z1bmMxNngxNiBpYWRzdCwgaWFkc3QKKworZnVuY3Rpb24gaWRjdDE2XzFkXzR4MTZfcGFzczFfcXVhcnRlcl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorCisgICAgICAgIG1vdmkgICAgICAgICAgICB2NC40cywgIzAKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTkKKyAgICAgICAgbG9hZF9jbGVhciAgICAgIFxpLCAgeDIsICB4OQorLmVuZHIKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDE2X3F1YXJ0ZXIKKworICAgICAgICAvLyBEbyBmb3VyIDR4NCB0cmFuc3Bvc2VzLiBPcmlnaW5hbGx5LCB2MTYtdjMxIGNvbnRhaW4gdGhlCisgICAgICAgIC8vIDE2IHJvd3MuIEFmdGVyd2FyZHMsIHYxNi12MTksIHYyMC12MjMsIHYyNC12MjcgYW5kIHYyOC12MzEKKyAgICAgICAgLy8gY29udGFpbiB0aGUgZm91ciB0cmFuc3Bvc2VkIDR4NCBibG9ja3MuCisgICAgICAgIHRyYW5zcG9zZV80eDRzICB2MTYsIHYxNywgdjE4LCB2MTksIHY0LCB2NSwgdjYsIHY3CisgICAgICAgIHRyYW5zcG9zZV80eDRzICB2MjAsIHYyMSwgdjIyLCB2MjMsIHY0LCB2NSwgdjYsIHY3CisgICAgICAgIHRyYW5zcG9zZV80eDRzICB2MjQsIHYyNSwgdjI2LCB2MjcsIHY0LCB2NSwgdjYsIHY3CisgICAgICAgIHRyYW5zcG9zZV80eDRzICB2MjgsIHYyOSwgdjMwLCB2MzEsIHY0LCB2NSwgdjYsIHY3CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIHRyYW5zcG9zZWQgNHg0IGJsb2NrcyBob3Jpem9udGFsbHkuCisgICAgICAgIC8vIFRoZSBmaXJzdCA0eDQgYmxvY2sgaXMga2VwdCBpbiByZWdpc3RlcnMgZm9yIHRoZSBzZWNvbmQgcGFzcywKKyAgICAgICAgLy8gc3RvcmUgdGhlIHJlc3QgaW4gdGhlIHRlbXAgYnVmZmVyLgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMC40c30sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI4LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMS40c30sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI5LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi40c30sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjYuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMwLjRzfSwgIFt4MF0sICMxNgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy40c30sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjcuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMxLjRzfSwgIFt4MF0sICMxNgorICAgICAgICBiciAgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QxNl8xZF80eDE2X3Bhc3MyX3F1YXJ0ZXJfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKworICAgICAgICAvLyBPbmx5IGxvYWQgdGhlIHRvcCA0IGxpbmVzLCBhbmQgb25seSBkbyBpdCBmb3IgdGhlIGxhdGVyIHNsaWNlcy4KKyAgICAgICAgLy8gRm9yIHRoZSBmaXJzdCBzbGljZSwgZDE2LWQxOSBpcyBrZXB0IGluIHJlZ2lzdGVycyBmcm9tIHRoZSBmaXJzdCBwYXNzLgorICAgICAgICBjYnogICAgICAgICAgICAgeDMsICAxZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOQorICAgICAgICBsb2FkICAgICAgICAgICAgXGksICB4MiwgIHg5CisuZW5kcgorMToKKworICAgICAgICBhZGQgICAgICAgICAgICAgeDMsICB4MCwgIHgxCisgICAgICAgIGxzbCAgICAgICAgICAgICB4MSwgIHgxLCAgIzEKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNl9xdWFydGVyCisKKyAgICAgICAgZHVwICAgICAgICAgICAgIHY4LjhoLCB3MTMKKyAgICAgICAgbG9hZF9hZGRfc3RvcmUgIHYxNi40cywgdjE3LjRzLCB2MTguNHMsIHYxOS40cywgdjIwLjRzLCB2MjEuNHMsIHYyMi40cywgdjIzLjRzCisgICAgICAgIGxvYWRfYWRkX3N0b3JlICB2MjQuNHMsIHYyNS40cywgdjI2LjRzLCB2MjcuNHMsIHYyOC40cywgdjI5LjRzLCB2MzAuNHMsIHYzMS40cworCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKworZnVuY3Rpb24gaWRjdDE2XzFkXzR4MTZfcGFzczFfaGFsZl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorCisgICAgICAgIG1vdmkgICAgICAgICAgICB2NC40cywgIzAKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIGxvYWRfY2xlYXIgICAgICBcaSwgIHgyLCAgeDkKKy5lbmRyCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNl9oYWxmCisKKyAgICAgICAgLy8gRG8gZm91ciA0eDQgdHJhbnNwb3Nlcy4gT3JpZ2luYWxseSwgdjE2LXYzMSBjb250YWluIHRoZQorICAgICAgICAvLyAxNiByb3dzLiBBZnRlcndhcmRzLCB2MTYtdjE5LCB2MjAtdjIzLCB2MjQtdjI3IGFuZCB2MjgtdjMxCisgICAgICAgIC8vIGNvbnRhaW4gdGhlIGZvdXIgdHJhbnNwb3NlZCA0eDQgYmxvY2tzLgorICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjI4LCB2MjksIHYzMCwgdjMxLCB2NCwgdjUsIHY2LCB2NworCisgICAgICAgIC8vIFN0b3JlIHRoZSB0cmFuc3Bvc2VkIDR4NCBibG9ja3MgaG9yaXpvbnRhbGx5LgorICAgICAgICBjbXAgICAgICAgICAgICAgeDEsICAjNAorICAgICAgICBiLmVxICAgICAgICAgICAgMWYKKy5pcnAgaSwgMTYsIDIwLCAyNCwgMjgsIDE3LCAyMSwgMjUsIDI5LCAxOCwgMjIsIDI2LCAzMCwgMTksIDIzLCAyNywgMzEKKyAgICAgICAgc3RvcmUgICAgICAgICAgIFxpLCAgeDAsICAjMTYKKy5lbmRyCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTQKKzE6CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZTogRm9yIHRoZSBzZWNvbmQgaW5wdXQgY29sdW1uIChyMSA9PSA0KSwKKyAgICAgICAgLy8gd2hpY2ggd291bGQgYmUgc3RvcmVkIGFzIHRoZSBzZWNvbmQgcm93IGluIHRoZSB0ZW1wIGJ1ZmZlciwKKyAgICAgICAgLy8gZG9uJ3Qgc3RvcmUgdGhlIGZpcnN0IDR4NCBibG9jaywgYnV0IGtlZXAgaXQgaW4gcmVnaXN0ZXJzCisgICAgICAgIC8vIGZvciB0aGUgZmlyc3Qgc2xpY2Ugb2YgdGhlIHNlY29uZCBwYXNzICh3aGVyZSBpdCBpcyB0aGUKKyAgICAgICAgLy8gc2Vjb25kIDR4NCBibG9jaykuCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIwLjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC40c30sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjguNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIxLjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS40c30sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjkuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNi40c30sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MzAuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjRzfSwgIFt4MF0sICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNy40c30sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MzEuNHN9LCAgW3gwXSwgIzE2CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyMC4xNmIsIHYxNi4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyMS4xNmIsIHYxNy4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyMi4xNmIsIHYxOC4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYyMy4xNmIsIHYxOS4xNmIKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MTZfMWRfNHgxNl9wYXNzMl9oYWxmX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTkKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCAgeDIsICB4OQorLmVuZHIKKyAgICAgICAgY2J6ICAgICAgICAgICAgIHgzLCAgMWYKKy5pcnAgaSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCAgeDIsICB4OQorLmVuZHIKKzE6CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgzLCAgeDAsICB4MQorICAgICAgICBsc2wgICAgICAgICAgICAgeDEsICB4MSwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfaGFsZgorCisgICAgICAgIGR1cCAgICAgICAgICAgICB2OC44aCwgdzEzCisgICAgICAgIGxvYWRfYWRkX3N0b3JlICB2MTYuNHMsIHYxNy40cywgdjE4LjRzLCB2MTkuNHMsIHYyMC40cywgdjIxLjRzLCB2MjIuNHMsIHYyMy40cworICAgICAgICBsb2FkX2FkZF9zdG9yZSAgdjI0LjRzLCB2MjUuNHMsIHYyNi40cywgdjI3LjRzLCB2MjguNHMsIHYyOS40cywgdjMwLjRzLCB2MzEuNHMKKworICAgICAgICBiciAgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKKy5tYWNybyBpZGN0MTZfcGFydGlhbCBzaXplCitmdW5jdGlvbiBpZGN0MTZ4MTZfXHNpemVcKClfYWRkXzE2X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgc3AsICAjKDAqNjQpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgICMwCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHg2LCAgIygwKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfMWRfNHgxNl9wYXNzMV9cc2l6ZVwoKV9uZW9uCisuaWZjIFxzaXplLGhhbGYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgc3AsICAjKDQqNjQpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHg2LCAgIyg0KjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfMWRfNHgxNl9wYXNzMV9cc2l6ZVwoKV9uZW9uCisuZW5kaWYKKworLmlycCBpLCAwLCA0LCA4LCAxMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4NCwgICMoXGkqMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxLCAgeDUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgc3AsICAjKFxpKjQpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgICNcaQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDE2XzFkXzR4MTZfcGFzczJfXHNpemVcKClfbmVvbgorLmVuZHIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMxMDI0CisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorICAgICAgICBiciAgICAgICAgICAgICAgeDE1CitlbmRmdW5jCisuZW5kbQorCitpZGN0MTZfcGFydGlhbCBxdWFydGVyCitpZGN0MTZfcGFydGlhbCBoYWxmCisKK2Z1bmN0aW9uIGlkY3QzMngzMl9kY19hZGRfbmVvbgorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDQsICBpZGN0X2NvZWZmcworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRofSwgW3g0XQorICAgICAgICBzeHRsICAgICAgICAgICAgdjAuNHMsICB2MC40aAorCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MS40aCwgICMwCisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5zfVswXSwgIFt4Ml0KKyAgICAgICAgc211bGwgICAgICAgICAgIHYyLjJkLCAgdjIuMnMsICB2MC5zWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICB2Mi4ycywgIHYyLjJkLCAgIzE0CisgICAgICAgIHNtdWxsICAgICAgICAgICB2Mi4yZCwgIHYyLjJzLCAgdjAuc1swXQorICAgICAgICByc2hybiAgICAgICAgICAgdjIuMnMsICB2Mi4yZCwgICMxNAorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzBdLCAgW3gyXQorICAgICAgICBkdXAgICAgICAgICAgICAgdjIuNHMsICB2Mi5zWzBdCisKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYwLjRzLCAgdjIuNHMsICAjNgorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgICMzMgorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgICMzMgorICAgICAgICBkdXAgICAgICAgICAgICAgdjMxLjhoLCB3MTMKKzE6CisgICAgICAgIC8vIExvb3AgdG8gYWRkIHRoZSBjb25zdGFudCB2MCBpbnRvIGFsbCAzMngzMiBvdXRwdXRzCisgICAgICAgIHN1YnMgICAgICAgICAgICB4NCwgIHg0LCAgIzEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS44aCx2Mi44aH0sICBbeDBdLCAjMzIKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYxNi40cywgdjAuNHMsICB2MS40aAorICAgICAgICB1YWRkdzIgICAgICAgICAgdjE3LjRzLCB2MC40cywgIHYxLjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuOGgsdjQuOGh9LCAgW3gwXSwgeDEKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYxOC40cywgdjAuNHMsICB2Mi40aAorICAgICAgICB1YWRkdzIgICAgICAgICAgdjE5LjRzLCB2MC40cywgIHYyLjhoCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjAuNHMsIHYwLjRzLCAgdjMuNGgKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYyMS40cywgdjAuNHMsICB2My44aAorICAgICAgICB1YWRkdyAgICAgICAgICAgdjIyLjRzLCB2MC40cywgIHY0LjRoCisgICAgICAgIHVhZGR3MiAgICAgICAgICB2MjMuNHMsIHYwLjRzLCAgdjQuOGgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYxLjRoLCAgdjE2LjRzCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2MS44aCwgIHYxNy40cworICAgICAgICBzcXh0dW4gICAgICAgICAgdjIuNGgsICB2MTguNHMKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHYyLjhoLCAgdjE5LjRzCisgICAgICAgIHNxeHR1biAgICAgICAgICB2My40aCwgIHYyMC40cworICAgICAgICBzcXh0dW4yICAgICAgICAgdjMuOGgsICB2MjEuNHMKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHY0LjRoLCAgdjIyLjRzCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2NC44aCwgIHYyMy40cworICAgICAgICB1bWluICAgICAgICAgICAgdjEuOGgsICB2MS44aCwgIHYzMS44aAorICAgICAgICB1bWluICAgICAgICAgICAgdjIuOGgsICB2Mi44aCwgIHYzMS44aAorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjhoLHYyLjhofSwgIFt4M10sICMzMgorICAgICAgICB1bWluICAgICAgICAgICAgdjMuOGgsICB2My44aCwgIHYzMS44aAorICAgICAgICB1bWluICAgICAgICAgICAgdjQuOGgsICB2NC44aCwgIHYzMS44aAorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLjhoLHY0LjhofSwgIFt4M10sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorCisgICAgICAgIHJldAorZW5kZnVuYworCisubWFjcm8gaWRjdDMyX2VuZAorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjE2LCB2NSwgIHY0LCAgdjUgIC8vIHYxNiA9IHQxNmEsIHY1ICA9IHQxOWEKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYxNywgdjIwLCB2MjMsIHYyMCAvLyB2MTcgPSB0MTcsICB2MjAgPSB0MTgKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYxOCwgdjYsICB2NywgIHY2ICAvLyB2MTggPSB0MjNhLCB2NiAgPSB0MjBhCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MTksIHYyMSwgdjIyLCB2MjEgLy8gdjE5ID0gdDIyLCAgdjIxID0gdDIxCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2NCwgIHYyOCwgdjI4LCB2MzAgLy8gdjQgID0gdDI0YSwgdjI4ID0gdDI3YQorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjIzLCB2MjYsIHYyNSwgdjI2IC8vIHYyMyA9IHQyNSwgIHYyNiA9IHQyNgorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjcsICB2OCwgIHYyOSwgdjMxIC8vIHY3ICA9IHQzMWEsIHYzICA9IHQyOGEKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYyMiwgdjI3LCB2MjQsIHYyNyAvLyB2MjIgPSB0MzAsICB2MjcgPSB0MjkKKworICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI3LCB2MjAsIHYwLnNbMl0sIHYwLnNbM10sIHYyNCwgdjI1LCB2MzAsIHYzMSAgICAgICAgLy8gdjI3ID0gdDE4YSwgdjIwID0gdDI5YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjgsICB2NSwgIHYwLnNbMl0sIHYwLnNbM10sIHYyNCwgdjI1LCB2MzAsIHYzMSAgICAgICAgLy8gdjMgID0gdDE5LCAgdjUgID0gdDI4CisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjgsIHY2LCAgdjAuc1syXSwgdjAuc1szXSwgdjI0LCB2MjUsIHYzMCwgdjMxLCBuZWc9MSAvLyB2MjggPSB0MjcsICB2NiAgPSB0MjAKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNiwgdjIxLCB2MC5zWzJdLCB2MC5zWzNdLCB2MjQsIHYyNSwgdjMwLCB2MzEsIG5lZz0xIC8vIHYyNiA9IHQyNmEsIHYyMSA9IHQyMWEKKworICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjMxLCB2MjQsIHY3LCAgdjQgIC8vIHYzMSA9IHQzMSwgIHYyNCA9IHQyNAorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjMwLCB2MjUsIHYyMiwgdjIzIC8vIHYzMCA9IHQzMGEsIHYyNSA9IHQyNWEKKyAgICAgICAgYnV0dGVyZmx5XzRzX3IgIHYyMywgdjE2LCB2MTYsIHYxOCAvLyB2MjMgPSB0MjMsICB2MTYgPSB0MTYKKyAgICAgICAgYnV0dGVyZmx5XzRzX3IgIHYyMiwgdjE3LCB2MTcsIHYxOSAvLyB2MjIgPSB0MjJhLCB2MTcgPSB0MTdhCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MTgsIHYyMSwgdjI3LCB2MjEgLy8gdjE4ID0gdDE4LCAgdjIxID0gdDIxCisgICAgICAgIGJ1dHRlcmZseV80c19yICB2MjcsIHYyOCwgdjUsICB2MjggLy8gdjI3ID0gdDI3YSwgdjI4ID0gdDI4YQorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjI5LCB2MjYsIHYyMCwgdjI2IC8vIHYyOSA9IHQyOSwgIHYyNiA9IHQyNgorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjE5LCB2MjAsIHY4LCAgdjYgIC8vIHYxOSA9IHQxOWEsIHYyMCA9IHQyMAorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MjcsIHYyMCwgdjI3LCB2MjAsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkgLy8gdjI3ID0gdDI3LCAgdjIwID0gdDIwCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MjYsIHYyMSwgdjI2LCB2MjEsIHY0LCB2NSwgdjYsIHY3LCB2OCwgdjkgLy8gdjI2ID0gdDI2YSwgdjIxID0gdDIxYQorICAgICAgICBkbWJ1dHRlcmZseTAgICAgdjI1LCB2MjIsIHYyNSwgdjIyLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5IC8vIHYyNSA9IHQyNSwgIHYyMiA9IHQyMgorICAgICAgICBkbWJ1dHRlcmZseTAgICAgdjI0LCB2MjMsIHYyNCwgdjIzLCB2NCwgdjUsIHY2LCB2NywgdjgsIHY5IC8vIHYyNCA9IHQyNGEsIHYyMyA9IHQyM2EKKyAgICAgICAgcmV0CisuZW5kbQorCitmdW5jdGlvbiBpZGN0MzJfb2RkCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MTYsIHYzMSwgdjEwLnNbMF0sIHYxMC5zWzFdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MTYgPSB0MTZhLCB2MzEgPSB0MzFhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjQsIHYyMywgdjEwLnNbMl0sIHYxMC5zWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjQgPSB0MTdhLCB2MjMgPSB0MzBhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjAsIHYyNywgdjExLnNbMF0sIHYxMS5zWzFdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjAgPSB0MThhLCB2MjcgPSB0MjlhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjgsIHYxOSwgdjExLnNbMl0sIHYxMS5zWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjggPSB0MTlhLCB2MTkgPSB0MjhhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MTgsIHYyOSwgdjEyLnNbMF0sIHYxMi5zWzFdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MTggPSB0MjBhLCB2MjkgPSB0MjdhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjYsIHYyMSwgdjEyLnNbMl0sIHYxMi5zWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjYgPSB0MjFhLCB2MjEgPSB0MjZhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjIsIHYyNSwgdjEzLnNbMF0sIHYxMy5zWzFdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjIgPSB0MjJhLCB2MjUgPSB0MjVhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MzAsIHYxNywgdjEzLnNbMl0sIHYxMy5zWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MzAgPSB0MjNhLCB2MTcgPSB0MjRhCisKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHY0LCAgdjI0LCB2MTYsIHYyNCAvLyB2NCAgPSB0MTYsIHYyNCA9IHQxNworICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjUsICB2MjAsIHYyOCwgdjIwIC8vIHY1ICA9IHQxOSwgdjIwID0gdDE4CisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2NiwgIHYyNiwgdjE4LCB2MjYgLy8gdjYgID0gdDIwLCB2MjYgPSB0MjEKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHY3LCAgdjIyLCB2MzAsIHYyMiAvLyB2NyAgPSB0MjMsIHYyMiA9IHQyMgorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjI4LCB2MjUsIHYxNywgdjI1IC8vIHYyOCA9IHQyNCwgdjI1ID0gdDI1CisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MzAsIHYyMSwgdjI5LCB2MjEgLy8gdjMwID0gdDI3LCB2MjEgPSB0MjYKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYyOSwgdjIzLCB2MzEsIHYyMyAvLyB2MjkgPSB0MzEsIHYyMyA9IHQzMAorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjMxLCB2MjcsIHYxOSwgdjI3IC8vIHYzMSA9IHQyOCwgdjI3ID0gdDI5CisKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMywgdjI0LCB2MS5zWzBdLCB2MS5zWzFdLCB2MTYsIHYxNywgdjE4LCB2MTkgICAgICAgIC8vIHYyMyA9IHQxN2EsIHYyNCA9IHQzMGEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNywgdjIwLCB2MS5zWzBdLCB2MS5zWzFdLCB2MTYsIHYxNywgdjE4LCB2MTksIG5lZz0xIC8vIHYyNyA9IHQyOWEsIHYyMCA9IHQxOGEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMSwgdjI2LCB2MS5zWzJdLCB2MS5zWzNdLCB2MTYsIHYxNywgdjE4LCB2MTkgICAgICAgIC8vIHYyMSA9IHQyMWEsIHYyNiA9IHQyNmEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNSwgdjIyLCB2MS5zWzJdLCB2MS5zWzNdLCB2MTYsIHYxNywgdjE4LCB2MTksIG5lZz0xIC8vIHYyNSA9IHQyNWEsIHYyMiA9IHQyMmEKKyAgICAgICAgaWRjdDMyX2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MzJfb2RkX2hhbGYKKyAgICAgICAgZG1idXR0ZXJmbHlfaDEgIHYxNiwgdjMxLCB2MTAuc1swXSwgdjEwLnNbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYxNiA9IHQxNmEsIHYzMSA9IHQzMWEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDIgIHYyNCwgdjIzLCB2MTAuc1syXSwgdjEwLnNbM10sIHY0LCB2NSwgdjYsIHY3IC8vIHYyNCA9IHQxN2EsIHYyMyA9IHQzMGEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDEgIHYyMCwgdjI3LCB2MTEuc1swXSwgdjExLnNbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYyMCA9IHQxOGEsIHYyNyA9IHQyOWEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDIgIHYyOCwgdjE5LCB2MTEuc1syXSwgdjExLnNbM10sIHY0LCB2NSwgdjYsIHY3IC8vIHYyOCA9IHQxOWEsIHYxOSA9IHQyOGEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDEgIHYxOCwgdjI5LCB2MTIuc1swXSwgdjEyLnNbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYxOCA9IHQyMGEsIHYyOSA9IHQyN2EKKyAgICAgICAgZG1idXR0ZXJmbHlfaDIgIHYyNiwgdjIxLCB2MTIuc1syXSwgdjEyLnNbM10sIHY0LCB2NSwgdjYsIHY3IC8vIHYyNiA9IHQyMWEsIHYyMSA9IHQyNmEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDEgIHYyMiwgdjI1LCB2MTMuc1swXSwgdjEzLnNbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYyMiA9IHQyMmEsIHYyNSA9IHQyNWEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDIgIHYzMCwgdjE3LCB2MTMuc1syXSwgdjEzLnNbM10sIHY0LCB2NSwgdjYsIHY3IC8vIHYzMCA9IHQyM2EsIHYxNyA9IHQyNGEKKworICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjQsICB2MjQsIHYxNiwgdjI0IC8vIHY0ICA9IHQxNiwgdjI0ID0gdDE3CisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2NSwgIHYyMCwgdjI4LCB2MjAgLy8gdjUgID0gdDE5LCB2MjAgPSB0MTgKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHY2LCAgdjI2LCB2MTgsIHYyNiAvLyB2NiAgPSB0MjAsIHYyNiA9IHQyMQorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjcsICB2MjIsIHYzMCwgdjIyIC8vIHY3ICA9IHQyMywgdjIyID0gdDIyCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MjgsIHYyNSwgdjE3LCB2MjUgLy8gdjI4ID0gdDI0LCB2MjUgPSB0MjUKKyAgICAgICAgYnV0dGVyZmx5XzRzICAgIHYzMCwgdjIxLCB2MjksIHYyMSAvLyB2MzAgPSB0MjcsIHYyMSA9IHQyNgorICAgICAgICBidXR0ZXJmbHlfNHMgICAgdjI5LCB2MjMsIHYzMSwgdjIzIC8vIHYyOSA9IHQzMSwgdjIzID0gdDMwCisgICAgICAgIGJ1dHRlcmZseV80cyAgICB2MzEsIHYyNywgdjE5LCB2MjcgLy8gdjMxID0gdDI4LCB2MjcgPSB0MjkKKworICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjIzLCB2MjQsIHYxLnNbMF0sIHYxLnNbMV0sIHYxNiwgdjE3LCB2MTgsIHYxOSAgICAgICAgLy8gdjIzID0gdDE3YSwgdjI0ID0gdDMwYQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI3LCB2MjAsIHYxLnNbMF0sIHYxLnNbMV0sIHYxNiwgdjE3LCB2MTgsIHYxOSwgbmVnPTEgLy8gdjI3ID0gdDI5YSwgdjIwID0gdDE4YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjIxLCB2MjYsIHYxLnNbMl0sIHYxLnNbM10sIHYxNiwgdjE3LCB2MTgsIHYxOSAgICAgICAgLy8gdjIxID0gdDIxYSwgdjI2ID0gdDI2YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI1LCB2MjIsIHYxLnNbMl0sIHYxLnNbM10sIHYxNiwgdjE3LCB2MTgsIHYxOSwgbmVnPTEgLy8gdjI1ID0gdDI1YSwgdjIyID0gdDIyYQorICAgICAgICBpZGN0MzJfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QzMl9vZGRfcXVhcnRlcgorICAgICAgICBkc211bGxfaCAgICAgICAgdjQsICB2NSwgIHYxNiwgdjEwLnNbMF0KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHYyOCwgdjI5LCB2MTksIHYxMS5zWzNdCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2MzAsIHYzMSwgdjE2LCB2MTAuc1sxXQorICAgICAgICBkc211bGxfaCAgICAgICAgdjIyLCB2MjMsIHYxNywgdjEzLnNbMl0KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHY3LCAgdjYsICB2MTcsIHYxMy5zWzNdCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2MjYsIHYyNywgdjE5LCB2MTEuc1syXQorICAgICAgICBkc211bGxfaCAgICAgICAgdjIwLCB2MjEsIHYxOCwgdjEyLnNbMF0KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHYyNCwgdjI1LCB2MTgsIHYxMi5zWzFdCisKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyOC4yZCwgdjI4LjJkCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MjkuMmQsIHYyOS4yZAorICAgICAgICBuZWcgICAgICAgICAgICAgdjcuMmQsICB2Ny4yZAorICAgICAgICBuZWcgICAgICAgICAgICAgdjYuMmQsICB2Ni4yZAorCisgICAgICAgIGRyc2hybl9oICAgICAgICB2NCwgIHY0LCAgdjUsICAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHY1LCAgdjI4LCB2MjksICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjI5LCB2MzAsIHYzMSwgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjgsIHYyMiwgdjIzLCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHY3LCAgdjcsICB2NiwgICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjMxLCB2MjYsIHYyNywgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2NiwgIHYyMCwgdjIxLCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYzMCwgdjI0LCB2MjUsICMxNAorCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyOSwgdjQsICB2MS5zWzBdLCB2MS5zWzFdCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MjcsIHYyNiwgdjIwLCB2MjEsIHYzMSwgdjUsICB2MS5zWzBdLCB2MS5zWzFdCisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjMsIHYxNiwgdjE3LCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyNCwgdjE4LCB2MTksICMxNAorICAgICAgICBuZWcgICAgICAgICAgICAgdjIwLjJkLCB2MjAuMmQKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyMS4yZCwgdjIxLjJkCisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjcsIHYyNywgdjI2LCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyMCwgdjIwLCB2MjEsICMxNAorICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MzAsIHY2LCAgdjEuc1syXSwgdjEuc1szXQorICAgICAgICBkcnNocm5faCAgICAgICAgdjIxLCB2MTYsIHYxNywgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjYsIHYxOCwgdjE5LCAjMTQKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjI4LCB2NywgIHYxLnNbMl0sIHYxLnNbM10KKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyNSwgdjE2LCB2MTcsICMxNAorICAgICAgICBuZWcgICAgICAgICAgICAgdjE4LjJkLCB2MTguMmQKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYxOS4yZCwgdjE5LjJkCisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjIsIHYxOCwgdjE5LCAjMTQKKworICAgICAgICBpZGN0MzJfZW5kCitlbmRmdW5jCisKKy5tYWNybyBpZGN0MzJfZnVuY3Mgc3VmZml4CisvLyBEbyBhbiAzMi1wb2ludCBJRENUIG9mIGEgNHgzMiBzbGljZSBvdXQgb2YgYSAzMngzMiBtYXRyaXguCisvLyBUaGUgMzItcG9pbnQgSURDVCBjYW4gYmUgZGVjb21wb3NlZCBpbnRvIHR3byAxNi1wb2ludCBJRENUczsKKy8vIGEgbm9ybWFsIElEQ1QxNiB3aXRoIGV2ZXJ5IG90aGVyIGlucHV0IGNvbXBvbmVudCAodGhlIGV2ZW4gb25lcywgd2l0aAorLy8gZWFjaCBvdXRwdXQgd3JpdHRlbiB0d2ljZSksIGZvbGxvd2VkIGJ5IGEgc2VwYXJhdGUgMTYtcG9pbnQgSURDVAorLy8gb2YgdGhlIG9kZCBpbnB1dHMsIGFkZGVkL3N1YnRyYWN0ZWQgb250byB0aGUgb3V0cHV0cyBvZiB0aGUgZmlyc3QgaWRjdDE2LgorLy8geDAgPSBkc3QgKHRlbXAgYnVmZmVyKQorLy8geDEgPSB1bnVzZWQKKy8vIHgyID0gc3JjCisvLyB4OSA9IGRvdWJsZSBpbnB1dCBzdHJpZGUKK2Z1bmN0aW9uIGlkY3QzMl8xZF80eDMyX3Bhc3MxXHN1ZmZpeFwoKV9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorCisgICAgICAgIG1vdmkgICAgICAgICAgICB2NC40cywgICMwCisKKyAgICAgICAgLy8gdjE2ID0gSU4oMCksIHYxNyA9IElOKDIpIC4uLiB2MzEgPSBJTigzMCkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBsb2FkX2NsZWFyICAgICAgXGksIHgyLCB4OQorLmVuZHIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIGxvYWRfY2xlYXIgICAgICBcaSwgeDIsIHg5CisuZW5kcgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIGxvYWRfY2xlYXIgICAgICBcaSwgeDIsIHg5CisuZW5kcgorLmVuZGlmCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNlxzdWZmaXgKKworICAgICAgICAvLyBEbyBmb3VyIDR4NCB0cmFuc3Bvc2VzLiBPcmlnaW5hbGx5LCB2MTYtdjMxIGNvbnRhaW4gdGhlCisgICAgICAgIC8vIDE2IHJvd3MuIEFmdGVyd2FyZHMsIHYxNi12MTksIHYyMC12MjMsIHYyNC12MjcgYW5kIHYyOC12MzEKKyAgICAgICAgLy8gY29udGFpbiB0aGUgZm91ciB0cmFuc3Bvc2VkIDR4NCBibG9ja3MuCisgICAgICAgIHRyYW5zcG9zZV80eDRzICB2MTYsIHYxNywgdjE4LCB2MTksIHY0LCB2NSwgdjYsIHY3CisgICAgICAgIHRyYW5zcG9zZV80eDRzICB2MjAsIHYyMSwgdjIyLCB2MjMsIHY0LCB2NSwgdjYsIHY3CisgICAgICAgIHRyYW5zcG9zZV80eDRzICB2MjQsIHYyNSwgdjI2LCB2MjcsIHY0LCB2NSwgdjYsIHY3CisgICAgICAgIHRyYW5zcG9zZV80eDRzICB2MjgsIHYyOSwgdjMwLCB2MzEsIHY0LCB2NSwgdjYsIHY3CisKKyAgICAgICAgLy8gU3RvcmUgdGhlIHJlZ2lzdGVycyBhLCBiLCBjLCBkIGhvcml6b250YWxseSwgZm9sbG93ZWQgYnkgdGhlCisgICAgICAgIC8vIHNhbWUgcmVnaXN0ZXJzIGQsIGMsIGIsIGEgbWlycm9yZWQuCisubWFjcm8gc3RvcmVfcmV2IGEsIGIsIGMsIGQKKyAgICAgICAgLy8gVGhlcmUncyBubyByZXYxMjggaW5zdHJ1Y3Rpb24sIGJ1dCB3ZSByZXZlcnNlIGVhY2ggNjQgYml0CisgICAgICAgIC8vIGhhbGYsIGFuZCB0aGVuIGZsaXAgdGhlbSB1c2luZyBhbiBleHQgd2l0aCA4IGJ5dGVzIG9mZnNldC4KKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY3LjRzLCBcZAorICAgICAgICBzdDEgICAgICAgICAgICAge1xhfSwgIFt4MF0sICMxNgorICAgICAgICBleHQgICAgICAgICAgICAgdjcuMTZiLCB2Ny4xNmIsIHY3LjE2YiwgIzgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtcYn0sICBbeDBdLCAjMTYKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY2LjRzLCBcYworICAgICAgICBzdDEgICAgICAgICAgICAge1xjfSwgIFt4MF0sICMxNgorICAgICAgICBleHQgICAgICAgICAgICAgdjYuMTZiLCB2Ni4xNmIsIHY2LjE2YiwgIzgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtcZH0sICBbeDBdLCAjMTYKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY1LjRzLCBcYgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBleHQgICAgICAgICAgICAgdjUuMTZiLCB2NS4xNmIsIHY1LjE2YiwgIzgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni40c30sICBbeDBdLCAjMTYKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHY0LjRzLCBcYQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y1LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBleHQgICAgICAgICAgICAgdjQuMTZiLCB2NC4xNmIsIHY0LjE2YiwgIzgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC40c30sICBbeDBdLCAjMTYKKy5lbmRtCisgICAgICAgIHN0b3JlX3JldiAgICAgICB2MTYuNHMsIHYyMC40cywgdjI0LjRzLCB2MjguNHMKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYxNy40cywgdjIxLjRzLCB2MjUuNHMsIHYyOS40cworICAgICAgICBzdG9yZV9yZXYgICAgICAgdjE4LjRzLCB2MjIuNHMsIHYyNi40cywgdjMwLjRzCisgICAgICAgIHN0b3JlX3JldiAgICAgICB2MTkuNHMsIHYyMy40cywgdjI3LjRzLCB2MzEuNHMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICAjNTEyCisucHVyZ2VtIHN0b3JlX3JldgorCisgICAgICAgIC8vIE1vdmUgeDIgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGlucHV0LCBhbmQgbW92ZQorICAgICAgICAvLyB0byB0aGUgZmlyc3Qgb2RkIHJvdworLmlmYiBcc3VmZml4CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgeDksIGxzbCAjNAorLmVuZGlmCisuaWZjIFxzdWZmaXgsX3F1YXJ0ZXIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICMyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfaGFsZgorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHg5LCBsc2wgIzMKKy5lbmRpZgorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MiwgICMxMjgKKworICAgICAgICBtb3ZpICAgICAgICAgICAgdjQuNHMsICAjMAorICAgICAgICAvLyB2MTYgPSBJTigxKSwgdjE3ID0gSU4oMykgLi4uIHYzMSA9IElOKDMxKQorLmlmYiBcc3VmZml4CisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCisgICAgICAgIGxvYWRfY2xlYXIgICAgICBcaSwgeDIsIHg5CisuZW5kcgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX3F1YXJ0ZXIKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTkKKyAgICAgICAgbG9hZF9jbGVhciAgICAgIFxpLCB4MiwgeDkKKy5lbmRyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfaGFsZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgbG9hZF9jbGVhciAgICAgIFxpLCB4MiwgeDkKKy5lbmRyCisuZW5kaWYKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyX29kZFxzdWZmaXgKKworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjMxLCB2MzAsIHYyOSwgdjI4LCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjI3LCB2MjYsIHYyNSwgdjI0LCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjIzLCB2MjIsIHYyMSwgdjIwLCB2NCwgdjUsIHY2LCB2NworICAgICAgICB0cmFuc3Bvc2VfNHg0cyAgdjE5LCB2MTgsIHYxNywgdjE2LCB2NCwgdjUsIHY2LCB2NworCisgICAgICAgIC8vIFN0b3JlIHRoZSByZWdpc3RlcnMgYSwgYiwgYywgZCBob3Jpem9udGFsbHksCisgICAgICAgIC8vIGFkZGluZyBpbnRvIHRoZSBvdXRwdXQgZmlyc3QsIGFuZCB0aGUgbWlycm9yZWQsCisgICAgICAgIC8vIHN1YnRyYWN0ZWQgZnJvbSB0aGUgb3V0cHV0LgorLm1hY3JvIHN0b3JlX3JldiBhLCBiLCBjLCBkLCBhMTZiLCBiMTZiCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHN9LCAgW3gwXQorICAgICAgICByZXY2NCAgICAgICAgICAgdjkuNHMsIFxkCisgICAgICAgIGFkZCAgICAgICAgICAgICB2NC40cywgdjQuNHMsIFxhCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIHJldjY0ICAgICAgICAgICB2OC40cywgXGMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40c30sICBbeDBdCisgICAgICAgIGV4dCAgICAgICAgICAgICB2OS4xNmIsIHY5LjE2YiwgdjkuMTZiLCAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgdjQuNHMsIHY0LjRzLCBcYgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBleHQgICAgICAgICAgICAgdjguMTZiLCB2OC4xNmIsIHY4LjE2YiwgIzgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40c30sICBbeDBdCisgICAgICAgIHJldjY0ICAgICAgICAgICBcYiwgXGIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY0LjRzLCB2NC40cywgXGMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC40c30sICBbeDBdLCAjMTYKKyAgICAgICAgcmV2NjQgICAgICAgICAgIFxhLCBcYQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzfSwgIFt4MF0KKyAgICAgICAgZXh0ICAgICAgICAgICAgIFxiMTZiLCBcYjE2YiwgXGIxNmIsICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB2NC40cywgdjQuNHMsIFxkCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIGV4dCAgICAgICAgICAgICBcYTE2YiwgXGExNmIsIFxhMTZiLCAjOAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzfSwgIFt4MF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHY0LjRzLCB2NC40cywgdjkuNHMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC40c30sICBbeDBdLCAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40c30sICBbeDBdCisgICAgICAgIHN1YiAgICAgICAgICAgICB2NC40cywgdjQuNHMsIHY4LjRzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNHN9LCAgW3gwXSwgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNHN9LCAgW3gwXQorICAgICAgICBzdWIgICAgICAgICAgICAgdjQuNHMsIHY0LjRzLCBcYgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjRzfSwgIFt4MF0sICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjRzfSwgIFt4MF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHY0LjRzLCB2NC40cywgXGEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC40c30sICBbeDBdLCAjMTYKKy5lbmRtCisKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYzMS40cywgdjI3LjRzLCB2MjMuNHMsIHYxOS40cywgdjMxLjE2YiwgdjI3LjE2YgorICAgICAgICBzdG9yZV9yZXYgICAgICAgdjMwLjRzLCB2MjYuNHMsIHYyMi40cywgdjE4LjRzLCB2MzAuMTZiLCB2MjYuMTZiCisgICAgICAgIHN0b3JlX3JldiAgICAgICB2MjkuNHMsIHYyNS40cywgdjIxLjRzLCB2MTcuNHMsIHYyOS4xNmIsIHYyNS4xNmIKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYyOC40cywgdjI0LjRzLCB2MjAuNHMsIHYxNi40cywgdjI4LjE2YiwgdjI0LjE2YgorLnB1cmdlbSBzdG9yZV9yZXYKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNAorZW5kZnVuYworCisvLyBUaGlzIGlzIG1vc3RseSB0aGUgc2FtZSBhcyA0eDMyX3Bhc3MxLCBidXQgd2l0aG91dCB0aGUgdHJhbnNwb3NlLAorLy8gYW5kIHVzZSB0aGUgc291cmNlIGFzIHRlbXAgYnVmZmVyIGJldHdlZW4gdGhlIHR3byBpZGN0IHBhc3NlcywgYW5kCisvLyBhZGQgaW50byB0aGUgZGVzdGluYXRpb24uCisvLyB4MCA9IGRzdAorLy8geDEgPSBkc3Qgc3RyaWRlCisvLyB4MiA9IHNyYyAodGVtcCBidWZmZXIpCisvLyB4NyA9IG5lZ2F0aXZlIGRvdWJsZSB0ZW1wIGJ1ZmZlciBzdHJpZGUKKy8vIHg5ID0gZG91YmxlIHRlbXAgYnVmZmVyIHN0cmlkZQorZnVuY3Rpb24gaWRjdDMyXzFkXzR4MzJfcGFzczJcc3VmZml4XCgpX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisKKyAgICAgICAgLy8gdjE2ID0gSU4oMCksIHYxNyA9IElOKDIpIC4uLiB2MzEgPSBJTigzMCkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBsb2FkICAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICM0CisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfcXVhcnRlcgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOQorICAgICAgICBsb2FkICAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICMyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfaGFsZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCB4MiwgeDkKKy5lbmRyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgeDksIGxzbCAjMworLmVuZGlmCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNlxzdWZmaXgKKworLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBzdG9yZSAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKworICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHg5LCBsc2wgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDIsICAjMTI4CisKKyAgICAgICAgLy8gdjE2ID0gSU4oMSksIHYxNyA9IElOKDMpIC4uLiB2MzEgPSBJTigzMSkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBsb2FkICAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICM0CisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfcXVhcnRlcgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOQorICAgICAgICBsb2FkICAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICMyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfaGFsZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCB4MiwgeDkKKy5lbmRyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgeDksIGxzbCAjMworLmVuZGlmCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgIzEyOAorCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfb2RkXHN1ZmZpeAorCisubWFjcm8gbG9hZF9hY2Nfc3RvcmUgYSwgYiwgYywgZCwgbmVnPTAKKy5pZiBcbmVnID09IDAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40c30sICBbeDJdLCB4OQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjRzfSwgIFt4Ml0sIHg5CisgICAgICAgIGFkZCAgICAgICAgICAgICB2NC40cywgdjQuNHMsIFxhCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuNHN9LCAgW3gyXSwgeDkKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY1LjRzLCB2NS40cywgXGIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICBbeDJdLCB4OQorICAgICAgICBhZGQgICAgICAgICAgICAgdjYuNHMsIHY2LjRzLCBcYworICAgICAgICBhZGQgICAgICAgICAgICAgdjcuNHMsIHY3LjRzLCBcZAorLmVsc2UKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40c30sICBbeDJdLCB4NworICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjRzfSwgIFt4Ml0sIHg3CisgICAgICAgIHN1YiAgICAgICAgICAgICB2NC40cywgdjQuNHMsIFxhCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuNHN9LCAgW3gyXSwgeDcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHY1LjRzLCB2NS40cywgXGIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ny40c30sICBbeDJdLCB4NworICAgICAgICBzdWIgICAgICAgICAgICAgdjYuNHMsIHY2LjRzLCBcYworICAgICAgICBzdWIgICAgICAgICAgICAgdjcuNHMsIHY3LjRzLCBcZAorLmVuZGlmCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djguNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djguZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2NC40cywgdjQuNHMsICM2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djkuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2NS40cywgdjUuNHMsICM2CisgICAgICAgIHVhZGR3ICAgICAgICAgICB2NC40cywgdjQuNHMsIHY4LjRoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djkuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2Ni40cywgdjYuNHMsICM2CisgICAgICAgIHVhZGR3MiAgICAgICAgICB2NS40cywgdjUuNHMsIHY4LjhoCisgICAgICAgIHNyc2hyICAgICAgICAgICB2Ny40cywgdjcuNHMsICM2CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjYuNHMsIHY2LjRzLCB2OS40aAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuNGgsIHY0LjRzCisgICAgICAgIHVhZGR3MiAgICAgICAgICB2Ny40cywgdjcuNHMsIHY5LjhoCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2NC44aCwgdjUuNHMKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHY0LjhoLCB2NC44aCwgdjE1LjhoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuNGh9LCAgIFt4MF0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NS40aCwgdjYuNHMKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHY1LjhoLCB2Ny40cworICAgICAgICB1bWluICAgICAgICAgICAgdjUuOGgsIHY1LjhoLCB2MTUuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS40aH0sICAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5kfVsxXSwgW3gwXSwgeDEKKy5lbmRtCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICB2MzEuNHMsIHYzMC40cywgdjI5LjRzLCB2MjguNHMKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIHYyNy40cywgdjI2LjRzLCB2MjUuNHMsIHYyNC40cworICAgICAgICBsb2FkX2FjY19zdG9yZSAgdjIzLjRzLCB2MjIuNHMsIHYyMS40cywgdjIwLjRzCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICB2MTkuNHMsIHYxOC40cywgdjE3LjRzLCB2MTYuNHMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OQorICAgICAgICBsb2FkX2FjY19zdG9yZSAgdjE2LjRzLCB2MTcuNHMsIHYxOC40cywgdjE5LjRzLCAxCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICB2MjAuNHMsIHYyMS40cywgdjIyLjRzLCB2MjMuNHMsIDEKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIHYyNC40cywgdjI1LjRzLCB2MjYuNHMsIHYyNy40cywgMQorICAgICAgICBsb2FkX2FjY19zdG9yZSAgdjI4LjRzLCB2MjkuNHMsIHYzMC40cywgdjMxLjRzLCAxCisucHVyZ2VtIGxvYWRfYWNjX3N0b3JlCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKy5lbmRtCisKK2lkY3QzMl9mdW5jcworaWRjdDMyX2Z1bmNzIF9xdWFydGVyCitpZGN0MzJfZnVuY3MgX2hhbGYKKworY29uc3QgbWluX2VvYl9pZGN0X2lkY3RfMzIsIGFsaWduPTQKKyAgICAgICAgLnNob3J0ICAwLCA5LCAzNCwgNzAsIDEzNSwgMjQwLCAzMzYsIDQ0OAorZW5kY29uc3QKKworZnVuY3Rpb24gdnA5X2lkY3RfaWRjdF8zMngzMl9hZGRfMTZfbmVvbgorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMQorICAgICAgICBiLmVxICAgICAgICAgICAgaWRjdDMyeDMyX2RjX2FkZF9uZW9uCisKKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxMCwgaWRjdF9jb2VmZnMKKworICAgICAgICBtb3YgICAgICAgICAgICAgeDE1LCB4MzAKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTAsIGQxMSwgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxNCwgZDE1LCBbc3AsICMtMHgxMF0hCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNDA5NgorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgIHgxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgIHgyCisKKyAgICAgICAgLy8gRG91YmxlIHN0cmlkZSBvZiB0aGUgaW5wdXQsIHNpbmNlIHdlIG9ubHkgcmVhZCBldmVyeSBvdGhlciBsaW5lCisgICAgICAgIG1vdiAgICAgICAgICAgICB4OSwgICMyNTYKKyAgICAgICAgbmVnICAgICAgICAgICAgIHg3LCAgeDkKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhoLHYxLjhofSwgICBbeDEwXSwgIzMyCisgICAgICAgIHN4dGwgICAgICAgICAgICB2Mi40cywgIHYxLjRoCisgICAgICAgIHN4dGwyICAgICAgICAgICB2My40cywgIHYxLjhoCisgICAgICAgIHN4dGwyICAgICAgICAgICB2MS40cywgIHYwLjhoCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MC40cywgIHYwLjRoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEwLjhoLHYxMS44aH0sIFt4MTBdCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MTIuNHMsIHYxMS40aAorICAgICAgICBzeHRsMiAgICAgICAgICAgdjEzLjRzLCB2MTEuOGgKKyAgICAgICAgc3h0bDIgICAgICAgICAgIHYxMS40cywgdjEwLjhoCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MTAuNHMsIHYxMC40aAorCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MTUuOGgsIHcxMworCisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgICMzNAorICAgICAgICBiLmxlICAgICAgICAgICAgaWRjdDMyeDMyX3F1YXJ0ZXJfYWRkXzE2X25lb24KKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzEzNQorICAgICAgICBiLmxlICAgICAgICAgICAgaWRjdDMyeDMyX2hhbGZfYWRkXzE2X25lb24KKworICAgICAgICBtb3ZyZWwgICAgICAgICAgeDEyLCBtaW5fZW9iX2lkY3RfaWRjdF8zMiwgMgorCisuaXJwIGksIDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICBzcCwgICMoXGkqMTI4KQorLmlmIFxpID4gMAorICAgICAgICBsZHJoICAgICAgICAgICAgdzEsICBbeDEyXSwgIzIKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgdzEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxLCAgIygzMiAtIFxpKS80CisgICAgICAgIGIubGUgICAgICAgICAgICAxZgorLmVuZGlmCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHg2LCAgIyhcaSo0KQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyXzFkXzR4MzJfcGFzczFfbmVvbgorLmVuZHIKKyAgICAgICAgYiAgICAgICAgICAgICAgIDNmCisKKzE6CisgICAgICAgIC8vIFdyaXRlIHplcm9zIHRvIHRoZSB0ZW1wIGJ1ZmZlciBmb3IgcGFzcyAyCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MTYuNHMsICAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjE3LjRzLCAgIzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYxOC40cywgICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MTkuNHMsICAjMAorMjoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHgxLCAgeDEsICAjMQorLnJlcHQgNAorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi40cyx2MTcuNHMsdjE4LjRzLHYxOS40c30sICBbeDBdLCAjNjQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuNHMsdjE3LjRzLHYxOC40cyx2MTkuNHN9LCAgW3gwXSwgIzY0CisuZW5kcgorICAgICAgICBiLm5lICAgICAgICAgICAgMmIKKzM6CisuaXJwIGksIDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4NCwgICMoXGkqMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxLCAgeDUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgc3AsICAjKFxpKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfNHgzMl9wYXNzMl9uZW9uCisuZW5kcgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzQwOTYKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxNCwgZDE1LCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTIsIGQxMywgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3BdLCAweDEwCisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNQorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfaWRjdF9pZGN0XzMyeDMyX2FkZF8xMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEzLCAjMHgwM2ZmCisgICAgICAgIGIgICAgICAgICAgICAgICB2cDlfaWRjdF9pZGN0XzMyeDMyX2FkZF8xNl9uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9pZGN0X2lkY3RfMzJ4MzJfYWRkXzEyX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTMsICMweDBmZmYKKyAgICAgICAgYiAgICAgICAgICAgICAgIHZwOV9pZGN0X2lkY3RfMzJ4MzJfYWRkXzE2X25lb24KK2VuZGZ1bmMKKworLm1hY3JvIGlkY3QzMl9wYXJ0aWFsIHNpemUKK2Z1bmN0aW9uIGlkY3QzMngzMl9cc2l6ZVwoKV9hZGRfMTZfbmVvbgorLmlycCBpLCAwLCA0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHNwLCAgIyhcaSoxMjgpCisuaWZjIFxzaXplLHF1YXJ0ZXIKKy5pZiBcaSA9PSA0CisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgICM5CisgICAgICAgIGIubGUgICAgICAgICAgICAxZgorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDYsICAjKFxpKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfNHgzMl9wYXNzMV9cc2l6ZVwoKV9uZW9uCisuZW5kcgorCisuaWZjIFxzaXplLGhhbGYKKy5pcnAgaSwgOCwgMTIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgc3AsICAjKFxpKjEyOCkKKy5pZiBcaSA9PSAxMgorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjNzAKKyAgICAgICAgYi5sZSAgICAgICAgICAgIDFmCisuZW5kaWYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDYsICAjKFxpKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfNHgzMl9wYXNzMV9cc2l6ZVwoKV9uZW9uCisuZW5kcgorLmVuZGlmCisgICAgICAgIGIgICAgICAgICAgICAgICAzZgorCisxOgorICAgICAgICAvLyBXcml0ZSB6ZXJvcyB0byB0aGUgdGVtcCBidWZmZXIgZm9yIHBhc3MgMgorICAgICAgICBtb3ZpICAgICAgICAgICAgdjE2LjRzLCAgIzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYxNy40cywgICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MTguNHMsICAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjE5LjRzLCAgIzAKKworLnJlcHQgNAorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi40cyx2MTcuNHMsdjE4LjRzLHYxOS40c30sICBbeDBdLCAjNjQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuNHMsdjE3LjRzLHYxOC40cyx2MTkuNHN9LCAgW3gwXSwgIzY0CisuZW5kcgorCiszOgorLmlycCBpLCAwLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDQsICAjKFxpKjIpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHg1CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHNwLCAgIyhcaSo0KQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyXzFkXzR4MzJfcGFzczJfXHNpemVcKClfbmVvbgorLmVuZHIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICM0MDk2CisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTUKK2VuZGZ1bmMKKy5lbmRtCisKK2lkY3QzMl9wYXJ0aWFsIHF1YXJ0ZXIKK2lkY3QzMl9wYXJ0aWFsIGhhbGYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlpdHhmbV9uZW9uLlMgYi9saWJhdmNvZGVjL2FhcmNoNjQvdnA5aXR4Zm1fbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDEzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvdnA5aXR4Zm1fbmVvbi5TCkBAIC0wLDAgKzEsMTU4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisjaW5jbHVkZSAibmVvbi5TIgorCitjb25zdCBpdHhmbTRfY29lZmZzLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgMTE1ODUsIDAsIDYyNzAsIDE1MTM3CitpYWRzdDRfY29lZmZzOgorICAgICAgICAuc2hvcnQgIDUyODMsIDE1MjEyLCA5OTI5LCAxMzM3NworZW5kY29uc3QKKworY29uc3QgaWFkc3Q4X2NvZWZmcywgYWxpZ249NAorICAgICAgICAuc2hvcnQgIDE2MzA1LCAxNjA2LCAxNDQ0OSwgNzcyMywgMTAzOTQsIDEyNjY1LCA0NzU2LCAxNTY3OQoraWRjdF9jb2VmZnM6CisgICAgICAgIC5zaG9ydCAgMTE1ODUsIDAsIDYyNzAsIDE1MTM3LCAzMTk2LCAxNjA2OSwgMTM2MjMsIDkxMDIKKyAgICAgICAgLnNob3J0ICAxNjA2LCAxNjMwNSwgMTI2NjUsIDEwMzk0LCA3NzIzLCAxNDQ0OSwgMTU2NzksIDQ3NTYKKyAgICAgICAgLnNob3J0ICA4MDQsIDE2MzY0LCAxMjE0MCwgMTEwMDMsIDcwMDUsIDE0ODExLCAxNTQyNiwgNTUyMAorICAgICAgICAuc2hvcnQgIDM5ODEsIDE1ODkzLCAxNDA1MywgODQyMywgOTc2MCwgMTMxNjAsIDE2MjA3LCAyNDA0CitlbmRjb25zdAorCitjb25zdCBpYWRzdDE2X2NvZWZmcywgYWxpZ249NAorICAgICAgICAuc2hvcnQgIDE2MzY0LCA4MDQsIDE1ODkzLCAzOTgxLCAxMTAwMywgMTIxNDAsIDg0MjMsIDE0MDUzCisgICAgICAgIC5zaG9ydCAgMTQ4MTEsIDcwMDUsIDEzMTYwLCA5NzYwLCA1NTIwLCAxNTQyNiwgMjQwNCwgMTYyMDcKK2VuZGNvbnN0CisKKy8vIG91dDEgPSAoKGluMSArIGluMikgKiB2MFswXSArICgxIDw8IDEzKSkgPj4gMTQKKy8vIG91dDIgPSAoKGluMSAtIGluMikgKiB2MFswXSArICgxIDw8IDEzKSkgPj4gMTQKKy8vIGluL291dCBhcmUgLjhoIHJlZ2lzdGVyczsgdGhpcyBjYW4gZG8gd2l0aCA0IHRlbXAgcmVnaXN0ZXJzLCBidXQgaXMKKy8vIG1vcmUgZWZmaWNpZW50IGlmIDYgdGVtcCByZWdpc3RlcnMgYXJlIGF2YWlsYWJsZS4KKy5tYWNybyBkbWJ1dHRlcmZseTAgb3V0MSwgb3V0MiwgaW4xLCBpbjIsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIG5lZz0wCisuaWYgXG5lZyA+IDAKKyAgICAgICAgbmVnICAgICAgICAgICAgIFx0bXA0XCgpLjRoLCB2MC40aAorLmVuZGlmCisgICAgICAgIGFkZCAgICAgICAgICAgICBcdG1wMVwoKS44aCwgXGluMVwoKS44aCwgIFxpbjJcKCkuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIFx0bXAyXCgpLjhoLCBcaW4xXCgpLjhoLCAgXGluMlwoKS44aAorLmlmIFxuZWcgPiAwCisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wM1woKS40cywgXHRtcDFcKCkuNGgsIFx0bXA0XCgpLmhbMF0KKyAgICAgICAgc211bGwyICAgICAgICAgIFx0bXA0XCgpLjRzLCBcdG1wMVwoKS44aCwgXHRtcDRcKCkuaFswXQorLmVsc2UKKyAgICAgICAgc211bGwgICAgICAgICAgIFx0bXAzXCgpLjRzLCBcdG1wMVwoKS40aCwgdjAuaFswXQorICAgICAgICBzbXVsbDIgICAgICAgICAgXHRtcDRcKCkuNHMsIFx0bXAxXCgpLjhoLCB2MC5oWzBdCisuZW5kaWYKKy5pZmIgXHRtcDUKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXQxXCgpLjRoLCBcdG1wM1woKS40cywgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcb3V0MVwoKS44aCwgXHRtcDRcKCkuNHMsICMxNAorICAgICAgICBzbXVsbCAgICAgICAgICAgXHRtcDNcKCkuNHMsIFx0bXAyXCgpLjRoLCB2MC5oWzBdCisgICAgICAgIHNtdWxsMiAgICAgICAgICBcdG1wNFwoKS40cywgXHRtcDJcKCkuOGgsIHYwLmhbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXQyXCgpLjRoLCBcdG1wM1woKS40cywgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcb3V0MlwoKS44aCwgXHRtcDRcKCkuNHMsICMxNAorLmVsc2UKKyAgICAgICAgc211bGwgICAgICAgICAgIFx0bXA1XCgpLjRzLCBcdG1wMlwoKS40aCwgdjAuaFswXQorICAgICAgICBzbXVsbDIgICAgICAgICAgXHRtcDZcKCkuNHMsIFx0bXAyXCgpLjhoLCB2MC5oWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICBcb3V0MVwoKS40aCwgXHRtcDNcKCkuNHMsICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXG91dDFcKCkuOGgsIFx0bXA0XCgpLjRzLCAjMTQKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXQyXCgpLjRoLCBcdG1wNVwoKS40cywgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcb3V0MlwoKS44aCwgXHRtcDZcKCkuNHMsICMxNAorLmVuZGlmCisuZW5kbQorCisvLyBTYW1lIGFzIGRtYnV0dGVyZmx5MCBhYm92ZSwgYnV0IHRyZWF0aW5nIHRoZSBpbnB1dCBpbiBpbjIgYXMgemVybywKKy8vIHdyaXRpbmcgdGhlIHNhbWUgb3V0cHV0IGludG8gYm90aCBvdXQxIGFuZCBvdXQyLgorLm1hY3JvIGRtYnV0dGVyZmx5MF9oIG91dDEsIG91dDIsIGluMSwgaW4yLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2CisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wMVwoKS40cywgIFxpbjFcKCkuNGgsICB2MC5oWzBdCisgICAgICAgIHNtdWxsMiAgICAgICAgICBcdG1wMlwoKS40cywgIFxpbjFcKCkuOGgsICB2MC5oWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICBcb3V0MVwoKS40aCwgIFx0bXAxXCgpLjRzLCAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxvdXQxXCgpLjhoLCAgXHRtcDJcKCkuNHMsICMxNAorICAgICAgICByc2hybiAgICAgICAgICAgXG91dDJcKCkuNGgsICBcdG1wMVwoKS40cywgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcb3V0MlwoKS44aCwgIFx0bXAyXCgpLjRzLCAjMTQKKy5lbmRtCisKKy8vIG91dDEsb3V0MiA9IGluMSAqIGNvZWYxIC0gaW4yICogY29lZjIKKy8vIG91dDMsb3V0NCA9IGluMSAqIGNvZWYyICsgaW4yICogY29lZjEKKy8vIG91dCBhcmUgNCB4IC40cyByZWdpc3RlcnMsIGluIGFyZSAyIHggLjhoIHJlZ2lzdGVycworLm1hY3JvIGRtYnV0dGVyZmx5X2wgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgaW4xLCBpbjIsIGNvZWYxLCBjb2VmMgorICAgICAgICBzbXVsbCAgICAgICAgICAgXG91dDFcKCkuNHMsIFxpbjFcKCkuNGgsIFxjb2VmMQorICAgICAgICBzbXVsbDIgICAgICAgICAgXG91dDJcKCkuNHMsIFxpbjFcKCkuOGgsIFxjb2VmMQorICAgICAgICBzbXVsbCAgICAgICAgICAgXG91dDNcKCkuNHMsIFxpbjFcKCkuNGgsIFxjb2VmMgorICAgICAgICBzbXVsbDIgICAgICAgICAgXG91dDRcKCkuNHMsIFxpbjFcKCkuOGgsIFxjb2VmMgorICAgICAgICBzbWxzbCAgICAgICAgICAgXG91dDFcKCkuNHMsIFxpbjJcKCkuNGgsIFxjb2VmMgorICAgICAgICBzbWxzbDIgICAgICAgICAgXG91dDJcKCkuNHMsIFxpbjJcKCkuOGgsIFxjb2VmMgorICAgICAgICBzbWxhbCAgICAgICAgICAgXG91dDNcKCkuNHMsIFxpbjJcKCkuNGgsIFxjb2VmMQorICAgICAgICBzbWxhbDIgICAgICAgICAgXG91dDRcKCkuNHMsIFxpbjJcKCkuOGgsIFxjb2VmMQorLmVuZG0KKworLy8gaW5vdXQxID0gKGlub3V0MSAqIGNvZWYxIC0gaW5vdXQyICogY29lZjIgKyAoMSA8PCAxMykpID4+IDE0CisvLyBpbm91dDIgPSAoaW5vdXQxICogY29lZjIgKyBpbm91dDIgKiBjb2VmMSArICgxIDw8IDEzKSkgPj4gMTQKKy8vIGlub3V0IGFyZSAyIHggLjhoIHJlZ2lzdGVycworLm1hY3JvIGRtYnV0dGVyZmx5IGlub3V0MSwgaW5vdXQyLCBjb2VmMSwgY29lZjIsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIG5lZz0wCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBcdG1wMSwgXHRtcDIsIFx0bXAzLCBcdG1wNCwgXGlub3V0MSwgXGlub3V0MiwgXGNvZWYxLCBcY29lZjIKKy5pZiBcbmVnID4gMAorICAgICAgICBuZWcgICAgICAgICAgICAgXHRtcDNcKCkuNHMsIFx0bXAzXCgpLjRzCisgICAgICAgIG5lZyAgICAgICAgICAgICBcdG1wNFwoKS40cywgXHRtcDRcKCkuNHMKKy5lbmRpZgorICAgICAgICByc2hybiAgICAgICAgICAgXGlub3V0MVwoKS40aCwgXHRtcDFcKCkuNHMsICAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxpbm91dDFcKCkuOGgsIFx0bXAyXCgpLjRzLCAgIzE0CisgICAgICAgIHJzaHJuICAgICAgICAgICBcaW5vdXQyXCgpLjRoLCBcdG1wM1woKS40cywgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXGlub3V0MlwoKS44aCwgXHRtcDRcKCkuNHMsICAjMTQKKy5lbmRtCisKKy8vIFNhbWUgYXMgZG1idXR0ZXJmbHkgYWJvdmUsIGJ1dCB0cmVhdGluZyB0aGUgaW5wdXQgaW4gaW5vdXQyIGFzIHplcm8KKy5tYWNybyBkbWJ1dHRlcmZseV9oMSBpbm91dDEsIGlub3V0MiwgY29lZjEsIGNvZWYyLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wMVwoKS40cywgXGlub3V0MVwoKS40aCwgXGNvZWYxCisgICAgICAgIHNtdWxsMiAgICAgICAgICBcdG1wMlwoKS40cywgXGlub3V0MVwoKS44aCwgXGNvZWYxCisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wM1woKS40cywgXGlub3V0MVwoKS40aCwgXGNvZWYyCisgICAgICAgIHNtdWxsMiAgICAgICAgICBcdG1wNFwoKS40cywgXGlub3V0MVwoKS44aCwgXGNvZWYyCisgICAgICAgIHJzaHJuICAgICAgICAgICBcaW5vdXQxXCgpLjRoLCBcdG1wMVwoKS40cywgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcaW5vdXQxXCgpLjhoLCBcdG1wMlwoKS40cywgIzE0CisgICAgICAgIHJzaHJuICAgICAgICAgICBcaW5vdXQyXCgpLjRoLCBcdG1wM1woKS40cywgIzE0CisgICAgICAgIHJzaHJuMiAgICAgICAgICBcaW5vdXQyXCgpLjhoLCBcdG1wNFwoKS40cywgIzE0CisuZW5kbQorCisvLyBTYW1lIGFzIGRtYnV0dGVyZmx5IGFib3ZlLCBidXQgdHJlYXRpbmcgdGhlIGlucHV0IGluIGlub3V0MSBhcyB6ZXJvCisubWFjcm8gZG1idXR0ZXJmbHlfaDIgaW5vdXQxLCBpbm91dDIsIGNvZWYxLCBjb2VmMiwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgICAgICBzbXVsbCAgICAgICAgICAgXHRtcDFcKCkuNHMsIFxpbm91dDJcKCkuNGgsIFxjb2VmMgorICAgICAgICBzbXVsbDIgICAgICAgICAgXHRtcDJcKCkuNHMsIFxpbm91dDJcKCkuOGgsIFxjb2VmMgorICAgICAgICBzbXVsbCAgICAgICAgICAgXHRtcDNcKCkuNHMsIFxpbm91dDJcKCkuNGgsIFxjb2VmMQorICAgICAgICBzbXVsbDIgICAgICAgICAgXHRtcDRcKCkuNHMsIFxpbm91dDJcKCkuOGgsIFxjb2VmMQorICAgICAgICBuZWcgICAgICAgICAgICAgXHRtcDFcKCkuNHMsIFx0bXAxXCgpLjRzCisgICAgICAgIG5lZyAgICAgICAgICAgICBcdG1wMlwoKS40cywgXHRtcDJcKCkuNHMKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxpbm91dDJcKCkuNGgsIFx0bXAzXCgpLjRzLCAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxpbm91dDJcKCkuOGgsIFx0bXA0XCgpLjRzLCAjMTQKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxpbm91dDFcKCkuNGgsIFx0bXAxXCgpLjRzLCAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxpbm91dDFcKCkuOGgsIFx0bXAyXCgpLjRzLCAjMTQKKy5lbmRtCisKKy5tYWNybyBkc211bGxfaCBvdXQxLCBvdXQyLCBpbiwgY29lZgorICAgICAgICBzbXVsbCAgICAgICAgICAgXG91dDFcKCkuNHMsIFxpblwoKS40aCwgXGNvZWYKKyAgICAgICAgc211bGwyICAgICAgICAgIFxvdXQyXCgpLjRzLCBcaW5cKCkuOGgsIFxjb2VmCisuZW5kbQorCisubWFjcm8gZHJzaHJuX2ggb3V0LCBpbjEsIGluMiwgc2hpZnQKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXRcKCkuNGgsIFxpbjFcKCkuNHMsIFxzaGlmdAorICAgICAgICByc2hybjIgICAgICAgICAgXG91dFwoKS44aCwgXGluMlwoKS40cywgXHNoaWZ0CisuZW5kbQorCisKKy8vIG91dDEgPSBpbjEgKyBpbjIKKy8vIG91dDIgPSBpbjEgLSBpbjIKKy5tYWNybyBidXR0ZXJmbHlfOGggb3V0MSwgb3V0MiwgaW4xLCBpbjIKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxvdXQxXCgpLjhoLCBcaW4xXCgpLjhoLCBcaW4yXCgpLjhoCisgICAgICAgIHN1YiAgICAgICAgICAgICBcb3V0MlwoKS44aCwgXGluMVwoKS44aCwgXGluMlwoKS44aAorLmVuZG0KKworLy8gb3V0MSA9IGluMSAtIGluMgorLy8gb3V0MiA9IGluMSArIGluMgorLm1hY3JvIGJ1dHRlcmZseV84aF9yIG91dDEsIG91dDIsIGluMSwgaW4yCisgICAgICAgIHN1YiAgICAgICAgICAgICBcb3V0MVwoKS44aCwgXGluMVwoKS44aCwgXGluMlwoKS44aAorICAgICAgICBhZGQgICAgICAgICAgICAgXG91dDJcKCkuOGgsIFxpbjFcKCkuOGgsIFxpbjJcKCkuOGgKKy5lbmRtCisKKy8vIG91dDEgPSAoaW4xLGluMiArIGluMyxpbjQgKyAoMSA8PCAxMykpID4+IDE0CisvLyBvdXQyID0gKGluMSxpbjIgLSBpbjMsaW40ICsgKDEgPDwgMTMpKSA+PiAxNAorLy8gb3V0IGFyZSAyIHggLjhoIHJlZ2lzdGVycywgaW4gYXJlIDQgeCAuNHMgcmVnaXN0ZXJzCisubWFjcm8gZGJ1dHRlcmZseV9uIG91dDEsIG91dDIsIGluMSwgaW4yLCBpbjMsIGluNCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgICAgICBhZGQgICAgICAgICAgICAgXHRtcDFcKCkuNHMsIFxpbjFcKCkuNHMsIFxpbjNcKCkuNHMKKyAgICAgICAgYWRkICAgICAgICAgICAgIFx0bXAyXCgpLjRzLCBcaW4yXCgpLjRzLCBcaW40XCgpLjRzCisgICAgICAgIHN1YiAgICAgICAgICAgICBcdG1wM1woKS40cywgXGluMVwoKS40cywgXGluM1woKS40cworICAgICAgICBzdWIgICAgICAgICAgICAgXHRtcDRcKCkuNHMsIFxpbjJcKCkuNHMsIFxpbjRcKCkuNHMKKyAgICAgICAgcnNocm4gICAgICAgICAgIFxvdXQxXCgpLjRoLCBcdG1wMVwoKS40cywgICMxNAorICAgICAgICByc2hybjIgICAgICAgICAgXG91dDFcKCkuOGgsIFx0bXAyXCgpLjRzLCAgIzE0CisgICAgICAgIHJzaHJuICAgICAgICAgICBcb3V0MlwoKS40aCwgXHRtcDNcKCkuNHMsICAjMTQKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxvdXQyXCgpLjhoLCBcdG1wNFwoKS40cywgICMxNAorLmVuZG0KKworLm1hY3JvIGl3aHQ0IGMwLCBjMSwgYzIsIGMzCisgICAgICAgIGFkZCAgICAgICAgICAgICBcYzBcKCkuNGgsIFxjMFwoKS40aCwgXGMxXCgpLjRoCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTcuNGgsICAgIFxjMlwoKS40aCwgXGMzXCgpLjRoCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTYuNGgsICAgIFxjMFwoKS40aCwgdjE3LjRoCisgICAgICAgIHNzaHIgICAgICAgICAgICB2MTYuNGgsICAgIHYxNi40aCwgICAgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxjMlwoKS40aCwgdjE2LjRoLCAgICBcYzFcKCkuNGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxjMVwoKS40aCwgdjE2LjRoLCAgICBcYzNcKCkuNGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxjM1woKS40aCwgdjE3LjRoLCAgICBcYzJcKCkuNGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIFxjMFwoKS40aCwgXGMwXCgpLjRoLCBcYzFcKCkuNGgKKy5lbmRtCisKKy5tYWNybyBpZGN0NCBjMCwgYzEsIGMyLCBjMworICAgICAgICBzbXVsbCAgICAgICAgICAgdjIyLjRzLCAgICBcYzFcKCkuNGgsIHYwLmhbM10KKyAgICAgICAgc211bGwgICAgICAgICAgIHYyMC40cywgICAgXGMxXCgpLjRoLCB2MC5oWzJdCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTYuNGgsICAgIFxjMFwoKS40aCwgXGMyXCgpLjRoCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTcuNGgsICAgIFxjMFwoKS40aCwgXGMyXCgpLjRoCisgICAgICAgIHNtbGFsICAgICAgICAgICB2MjIuNHMsICAgIFxjM1woKS40aCwgdjAuaFsyXQorICAgICAgICBzbXVsbCAgICAgICAgICAgdjE4LjRzLCAgICB2MTYuNGgsICAgIHYwLmhbMF0KKyAgICAgICAgc211bGwgICAgICAgICAgIHYxOS40cywgICAgdjE3LjRoLCAgICB2MC5oWzBdCisgICAgICAgIHNtbHNsICAgICAgICAgICB2MjAuNHMsICAgIFxjM1woKS40aCwgdjAuaFszXQorICAgICAgICByc2hybiAgICAgICAgICAgdjIyLjRoLCAgICB2MjIuNHMsICAgICMxNAorICAgICAgICByc2hybiAgICAgICAgICAgdjE4LjRoLCAgICB2MTguNHMsICAgICMxNAorICAgICAgICByc2hybiAgICAgICAgICAgdjE5LjRoLCAgICB2MTkuNHMsICAgICMxNAorICAgICAgICByc2hybiAgICAgICAgICAgdjIwLjRoLCAgICB2MjAuNHMsICAgICMxNAorICAgICAgICBhZGQgICAgICAgICAgICAgXGMwXCgpLjRoLCB2MTguNGgsICAgIHYyMi40aAorICAgICAgICBzdWIgICAgICAgICAgICAgXGMzXCgpLjRoLCB2MTguNGgsICAgIHYyMi40aAorICAgICAgICBhZGQgICAgICAgICAgICAgXGMxXCgpLjRoLCB2MTkuNGgsICAgIHYyMC40aAorICAgICAgICBzdWIgICAgICAgICAgICAgXGMyXCgpLjRoLCB2MTkuNGgsICAgIHYyMC40aAorLmVuZG0KKworLm1hY3JvIGlhZHN0NCBjMCwgYzEsIGMyLCBjMworICAgICAgICBzbXVsbCAgICAgICAgICAgdjE2LjRzLCAgICBcYzBcKCkuNGgsIHYwLmhbNF0KKyAgICAgICAgc21sYWwgICAgICAgICAgIHYxNi40cywgICAgXGMyXCgpLjRoLCB2MC5oWzVdCisgICAgICAgIHNtbGFsICAgICAgICAgICB2MTYuNHMsICAgIFxjM1woKS40aCwgdjAuaFs2XQorICAgICAgICBzbXVsbCAgICAgICAgICAgdjE3LjRzLCAgICBcYzBcKCkuNGgsIHYwLmhbNl0KKyAgICAgICAgc21sc2wgICAgICAgICAgIHYxNy40cywgICAgXGMyXCgpLjRoLCB2MC5oWzRdCisgICAgICAgIHN1YiAgICAgICAgICAgICBcYzBcKCkuNGgsIFxjMFwoKS40aCwgXGMyXCgpLjRoCisgICAgICAgIHNtbHNsICAgICAgICAgICB2MTcuNHMsICAgIFxjM1woKS40aCwgdjAuaFs1XQorICAgICAgICBhZGQgICAgICAgICAgICAgXGMwXCgpLjRoLCBcYzBcKCkuNGgsIFxjM1woKS40aAorICAgICAgICBzbXVsbCAgICAgICAgICAgdjE5LjRzLCAgICBcYzFcKCkuNGgsIHYwLmhbN10KKyAgICAgICAgc211bGwgICAgICAgICAgIHYxOC40cywgICAgXGMwXCgpLjRoLCB2MC5oWzddCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjAuNHMsICAgIHYxNi40cywgICAgdjE5LjRzCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjEuNHMsICAgIHYxNy40cywgICAgdjE5LjRzCisgICAgICAgIHJzaHJuICAgICAgICAgICBcYzBcKCkuNGgsIHYyMC40cywgICAgIzE0CisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTYuNHMsICAgIHYxNi40cywgICAgdjE3LjRzCisgICAgICAgIHJzaHJuICAgICAgICAgICBcYzFcKCkuNGgsIHYyMS40cywgICAgIzE0CisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTYuNHMsICAgIHYxNi40cywgICAgdjE5LjRzCisgICAgICAgIHJzaHJuICAgICAgICAgICBcYzJcKCkuNGgsIHYxOC40cywgICAgIzE0CisgICAgICAgIHJzaHJuICAgICAgICAgICBcYzNcKCkuNGgsIHYxNi40cywgICAgIzE0CisuZW5kbQorCisvLyBUaGUgcHVibGljIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgaGF2ZSBnb3QgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CisvLyB2b2lkIGl0eGZtX2FkZCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrLCBpbnQgZW9iKTsKKworLm1hY3JvIGl0eGZtX2Z1bmM0eDQgdHhmbTEsIHR4Zm0yCitmdW5jdGlvbiBmZl92cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV80eDRfYWRkX25lb24sIGV4cG9ydD0xCisuaWZjIFx0eGZtMSxcdHhmbTIKKy5pZmMgXHR4Zm0xLGlkY3QKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg0LCAgaXR4Zm00X2NvZWZmcworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRofSwgW3g0XQorLmVuZGlmCisuaWZjIFx0eGZtMSxpYWRzdAorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDQsICBpYWRzdDRfY29lZmZzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuZH1bMV0sIFt4NF0KKy5lbmRpZgorLmVsc2UKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg0LCAgaXR4Zm00X2NvZWZmcworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhofSwgW3g0XQorLmVuZGlmCisKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYzMS44aCwgIzAKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFmCisgICAgICAgIC8vIERDLW9ubHkgZm9yIGlkY3QvaWRjdAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLmh9WzBdLCBbeDJdCisgICAgICAgIHNtdWxsICAgICAgICAgICB2Mi40cywgIHYyLjRoLCB2MC5oWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICB2Mi40aCwgIHYyLjRzLCAjMTQKKyAgICAgICAgc211bGwgICAgICAgICAgIHYyLjRzLCAgdjIuNGgsIHYwLmhbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIHYyLjRoLCAgdjIuNHMsICMxNAorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMS5ofVswXSwgW3gyXQorICAgICAgICBkdXAgICAgICAgICAgICAgdjQuNGgsICB2Mi5oWzBdCisgICAgICAgIG1vdiAgICAgICAgICAgICB2NS4xNmIsIHY0LjE2YgorICAgICAgICBtb3YgICAgICAgICAgICAgdjYuMTZiLCB2NC4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY3LjE2YiwgdjQuMTZiCisgICAgICAgIGIgICAgICAgICAgICAgICAyZgorLmVuZGlmCisKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuNGgsdjUuNGgsdjYuNGgsdjcuNGh9LCAgW3gyXQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMS44aH0sIFt4Ml0sICMxNgorCisuaWZjIFx0eGZtMSxpd2h0CisgICAgICAgIHNzaHIgICAgICAgICAgICB2NC40aCwgIHY0LjRoLCAgIzIKKyAgICAgICAgc3NociAgICAgICAgICAgIHY1LjRoLCAgdjUuNGgsICAjMgorICAgICAgICBzc2hyICAgICAgICAgICAgdjYuNGgsICB2Ni40aCwgICMyCisgICAgICAgIHNzaHIgICAgICAgICAgICB2Ny40aCwgIHY3LjRoLCAgIzIKKy5lbmRpZgorCisgICAgICAgIFx0eGZtMVwoKTQgICAgICB2NCwgIHY1LCAgdjYsICB2NworCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMxLjhofSwgW3gyXSwgIzE2CisgICAgICAgIC8vIFRyYW5zcG9zZSA0eDQgd2l0aCAxNiBiaXQgZWxlbWVudHMKKyAgICAgICAgdHJhbnNwb3NlXzR4NEggIHY0LCAgdjUsICB2NiwgIHY3LCAgdjE2LCB2MTcsIHYxOCwgdjE5CisKKyAgICAgICAgXHR4Zm0yXCgpNCAgICAgIHY0LCAgdjUsICB2NiwgIHY3CisyOgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLnN9WzBdLCAgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMF0sICAgW3gwXSwgeDEKKy5pZm5jIFx0eGZtMSxpd2h0CisgICAgICAgIHNyc2hyICAgICAgICAgICB2NC40aCwgIHY0LjRoLCAgIzQKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHY1LjRoLCAgdjUuNGgsICAjNAorICAgICAgICBzcnNociAgICAgICAgICAgdjYuNGgsICB2Ni40aCwgICM0CisgICAgICAgIHNyc2hyICAgICAgICAgICB2Ny40aCwgIHY3LjRoLCAgIzQKKy5lbmRpZgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjQuOGgsICB2NC44aCwgIHYwLjhiCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2NS44aCwgIHY1LjhoLCAgdjEuOGIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5zfVswXSwgICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLnN9WzBdLCAgIFt4MF0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MC44YiwgIHY0LjhoCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MS44YiwgIHY1LjhoCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2Ni44aCwgIHY2LjhoLCAgdjIuOGIKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHY3LjhoLCAgdjcuOGgsICB2My44YgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLnN9WzBdLCAgW3gwXSwgeDEKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYyLjhiLCAgdjYuOGgKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYzLjhiLCAgdjcuOGgKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YxLnN9WzBdLCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi5zfVswXSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuc31bMF0sICBbeDBdLCB4MQorCisgICAgICAgIHJldAorZW5kZnVuYworLmVuZG0KKworaXR4Zm1fZnVuYzR4NCBpZGN0LCAgaWRjdAoraXR4Zm1fZnVuYzR4NCBpYWRzdCwgaWRjdAoraXR4Zm1fZnVuYzR4NCBpZGN0LCAgaWFkc3QKK2l0eGZtX2Z1bmM0eDQgaWFkc3QsIGlhZHN0CitpdHhmbV9mdW5jNHg0IGl3aHQsICBpd2h0CisKKworLm1hY3JvIGlkY3Q4CisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MTYsIHYyMCwgdjE2LCB2MjAsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcgLy8gdjE2ID0gdDBhLCB2MjAgPSB0MWEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYxOCwgdjIyLCB2MC5oWzJdLCB2MC5oWzNdLCB2MiwgdjMsIHY0LCB2NSAvLyB2MTggPSB0MmEsIHYyMiA9IHQzYQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjE3LCB2MjMsIHYwLmhbNF0sIHYwLmhbNV0sIHYyLCB2MywgdjQsIHY1IC8vIHYxNyA9IHQ0YSwgdjIzID0gdDdhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjEsIHYxOSwgdjAuaFs2XSwgdjAuaFs3XSwgdjIsIHYzLCB2NCwgdjUgLy8gdjIxID0gdDVhLCB2MTkgPSB0NmEKKworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjI0LCB2MjUsIHYxNiwgdjIyIC8vIHYyNCA9IHQwLCB2MjUgPSB0MworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjI4LCB2MjksIHYxNywgdjIxIC8vIHYyOCA9IHQ0LCB2MjkgPSB0NWEKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYzMCwgdjMxLCB2MjMsIHYxOSAvLyB2MzAgPSB0NywgdjMxID0gdDZhCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MjYsIHYyNywgdjIwLCB2MTggLy8gdjI2ID0gdDEsIHYyNyA9IHQyCisKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYzMSwgdjI5LCB2MzEsIHYyOSwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NyAvLyB2MzEgPSB0NiwgdjI5ID0gdDUKKworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjE2LCB2MjMsIHYyNCwgdjMwIC8vIHYxNiA9IG91dFswXSwgdjIzID0gb3V0WzddCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MTcsIHYyMiwgdjI2LCB2MzEgLy8gdjE3ID0gb3V0WzFdLCB2MjIgPSBvdXRbNl0KKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYxOCwgdjIxLCB2MjcsIHYyOSAvLyBxMTMgPSBvdXRbMl0sIHExMCA9IG91dFs1XQorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjE5LCB2MjAsIHYyNSwgdjI4IC8vIHYxNyA9IG91dFszXSwgcTEyID0gb3V0WzRdCisuZW5kbQorCisubWFjcm8gaWFkc3Q4CisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyMywgdjE2LCB2MS5oWzFdLCB2MS5oWzBdICAgLy8gdjI0LHYyNSA9IHQxYSwgdjI2LHYyNyA9IHQwYQorICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjI4LCB2MjksIHYzMCwgdjMxLCB2MjEsIHYxOCwgdjEuaFszXSwgdjEuaFsyXSAgIC8vIHYyOCx2MjkgPSB0M2EsIHYzMCx2MzEgPSB0MmEKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYyLCAgdjMsICB2NCwgIHY1LCAgdjE5LCB2MjAsIHYxLmhbNV0sIHYxLmhbNF0gICAvLyB2Mix2MyAgID0gdDVhLCB2NCx2NSAgID0gdDRhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTYsIHYxOCwgdjIxLCB2MjMsIHYxNywgdjIyLCB2MS5oWzddLCB2MS5oWzZdICAgLy8gdjE2LHYxOCA9IHQ3YSwgdjIxLHYyMyA9IHQ2YQorCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2NCwgIHY1LCAgdjI2LCB2MjcsIHY0LCAgdjUsICB2NiwgIHY3LCB2MjYsIHYyNyAgLy8gdjQgID0gdDAsIHY1ICA9IHQ0CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MiwgIHYzLCAgdjI0LCB2MjUsIHYyLCAgdjMsICB2NiwgIHY3LCB2MjYsIHYyNyAgLy8gdjIgID0gdDEsIHYzICA9IHQ1CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjQsIHYyNSwgdjMwLCB2MzEsIHYyMSwgdjIzLCB2NiwgIHY3LCB2MjYsIHYyNyAgLy8gdjI0ID0gdDIsIHYyNSA9IHQ2CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MzAsIHYzMSwgdjI4LCB2MjksIHYxNiwgdjE4LCB2NiwgIHY3LCB2MjYsIHYyNyAgLy8gdjMwID0gdDMsIHYzMSA9IHQ3CisKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYxNiwgdjYsICB2NCwgdjI0IC8vIHYxNiA9IG91dFswXSwgIHY2ID0gdDIKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYyMywgdjcsICB2MiwgdjMwIC8vIHYyMyA9IC1vdXRbN10sIHY3ID0gdDMKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyMy44aCwgICB2MjMuOGggIC8vIHYyMyA9IG91dFs3XQorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MTksIHYyMCwgdjYsIHY3LCB2MjQsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwICAgLy8gdjE5ID0gLW91dFszXSwgdjIwID0gb3V0WzRdCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MTkuOGgsICAgdjE5LjhoICAvLyB2MTkgPSBvdXRbM10KKworICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjI2LCB2MjcsIHYyOCwgdjI5LCB2NSwgIHYzLCAgdjAuaFsyXSwgdjAuaFszXSAgIC8vIHYyNix2MjcgPSB0NWEsIHYyOCx2MjkgPSB0NGEKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYyLCAgdjMsICB2NCwgIHY1LCAgdjMxLCB2MjUsIHYwLmhbM10sIHYwLmhbMl0gICAvLyB2Mix2MyAgID0gdDZhLCB2NCx2NSAgID0gdDdhCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIHYxNywgdjMwLCB2MjgsIHYyOSwgdjIsICB2MywgIHY2LCAgdjcsICB2MjQsIHYyNSAvLyB2MTcgPSAtb3V0WzFdLCB2MzAgPSB0NgorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjIyLCB2MzEsIHYyNiwgdjI3LCB2NCwgIHY1LCAgdjYsICB2NywgIHYyNCwgdjI1IC8vIHYyMiA9IG91dFs2XSwgIHYzMSA9IHQ3CisgICAgICAgIG5lZyAgICAgICAgICAgICB2MTcuOGgsICAgdjE3LjhoICAvLyB2MTcgPSBvdXRbMV0KKworICAgICAgICBkbWJ1dHRlcmZseTAgICAgdjE4LCB2MjEsIHYzMCwgdjMxLCB2MiwgIHYzLCAgdjQsICB2NSwgIHY2LCAgdjcgIC8vIHYxOCA9IG91dFsyXSwgdjIxID0gLW91dFs1XQorICAgICAgICBuZWcgICAgICAgICAgICAgdjIxLjhoLCAgIHYyMS44aCAgLy8gdjIxID0gb3V0WzVdCisuZW5kbQorCisKKy5tYWNybyBpdHhmbV9mdW5jOHg4IHR4Zm0xLCB0eGZtMgorZnVuY3Rpb24gZmZfdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfOHg4X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICAvLyBUaGUgaWFkc3QgYWxzbyB1c2VzIGEgZmV3IGNvZWZmaWNpZW50cyBmcm9tCisgICAgICAgIC8vIGlkY3QsIHNvIHRob3NlIGFsd2F5cyBuZWVkIHRvIGJlIGxvYWRlZC4KKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgbW92cmVsICAgICAgICAgIHg0LCAgaWRjdF9jb2VmZnMKKy5lbHNlCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NCwgIGlhZHN0OF9jb2VmZnMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS44aH0sIFt4NF0sICMxNgorLmVuZGlmCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuOGh9LCBbeDRdCisKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYyLjhoLCAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjMuOGgsICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2NC44aCwgIzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHY1LjhoLCAjMAorCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgICMxCisgICAgICAgIGIubmUgICAgICAgICAgICAxZgorICAgICAgICAvLyBEQy1vbmx5IGZvciBpZGN0L2lkY3QKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5ofVswXSwgIFt4Ml0KKyAgICAgICAgc211bGwgICAgICAgICAgIHYyLjRzLCAgdjIuNGgsIHYwLmhbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIHYyLjRoLCAgdjIuNHMsICMxNAorICAgICAgICBzbXVsbCAgICAgICAgICAgdjIuNHMsICB2Mi40aCwgdjAuaFswXQorICAgICAgICByc2hybiAgICAgICAgICAgdjIuNGgsICB2Mi40cywgIzE0CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuaH1bMF0sICBbeDJdCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MTYuOGgsICB2Mi5oWzBdCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MTcuMTZiLCB2MTYuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MTguMTZiLCB2MTYuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MTkuMTZiLCB2MTYuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjAuMTZiLCB2MTYuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjEuMTZiLCB2MTYuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjIuMTZiLCB2MTYuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjMuMTZiLCB2MTYuMTZiCisgICAgICAgIGIgICAgICAgICAgICAgICAyZgorLmVuZGlmCisxOgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44aCx2MTcuOGgsdjE4LjhoLHYxOS44aH0sICBbeDJdLCAjNjQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGgsdjIxLjhoLHYyMi44aCx2MjMuOGh9LCAgW3gyXSwgIzY0CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgIzEyOAorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjhoLHYzLjhoLHY0LjhoLHY1LjhofSwgICAgICBbeDJdLCAjNjQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi44aCx2My44aCx2NC44aCx2NS44aH0sICAgICAgW3gyXSwgIzY0CisKKyAgICAgICAgXHR4Zm0xXCgpOAorCisgICAgICAgIC8vIFRyYW5zcG9zZSA4eDggd2l0aCAxNiBiaXQgZWxlbWVudHMKKyAgICAgICAgdHJhbnNwb3NlXzh4OEggIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNQorCisgICAgICAgIFx0eGZtMlwoKTgKKzI6CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgwCisgICAgICAgIC8vIEFkZCBpbnRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhifSwgIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MTYuOGgsIHYxNi44aCwgIzUKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS44Yn0sICBbeDBdLCB4MQorICAgICAgICBzcnNociAgICAgICAgICAgdjE3LjhoLCB2MTcuOGgsICM1CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuOGJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYxOC44aCwgdjE4LjhoLCAjNQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjE2LjhoLCB2MTYuOGgsIHYwLjhiCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuOGJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYxOS44aCwgdjE5LjhoLCAjNQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjE3LjhoLCB2MTcuOGgsIHYxLjhiCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOGJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyMC44aCwgdjIwLjhoLCAjNQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjE4LjhoLCB2MTguOGgsIHYyLjhiCisgICAgICAgIHNxeHR1biAgICAgICAgICB2MC44YiwgIHYxNi44aAorICAgICAgICBsZDEgICAgICAgICAgICAge3Y1LjhifSwgIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2MjEuOGgsIHYyMS44aCwgIzUKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYxOS44aCwgdjE5LjhoLCB2My44YgorICAgICAgICBzcXh0dW4gICAgICAgICAgdjEuOGIsICB2MTcuOGgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni44Yn0sICBbeDBdLCB4MQorICAgICAgICBzcnNociAgICAgICAgICAgdjIyLjhoLCB2MjIuOGgsICM1CisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjAuOGgsIHYyMC44aCwgdjQuOGIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYyLjhiLCAgdjE4LjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOGJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYyMy44aCwgdjIzLjhoLCAjNQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjIxLjhoLCB2MjEuOGgsIHY1LjhiCisgICAgICAgIHNxeHR1biAgICAgICAgICB2My44YiwgIHYxOS44aAorCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuOGJ9LCAgW3gzXSwgeDEKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYyMi44aCwgdjIyLjhoLCB2Ni44YgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjhifSwgIFt4M10sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NC44YiwgIHYyMC44aAorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjhifSwgIFt4M10sIHgxCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjMuOGgsIHYyMy44aCwgdjcuOGIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My44Yn0sICBbeDNdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjUuOGIsICB2MjEuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44Yn0sICBbeDNdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjYuOGIsICB2MjIuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44Yn0sICBbeDNdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjcuOGIsICB2MjMuOGgKKworICAgICAgICBzdDEgICAgICAgICAgICAge3Y2LjhifSwgIFt4M10sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuOGJ9LCAgW3gzXSwgeDEKKworICAgICAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKK2l0eGZtX2Z1bmM4eDggaWRjdCwgIGlkY3QKK2l0eGZtX2Z1bmM4eDggaWFkc3QsIGlkY3QKK2l0eGZtX2Z1bmM4eDggaWRjdCwgIGlhZHN0CitpdHhmbV9mdW5jOHg4IGlhZHN0LCBpYWRzdAorCisKK2Z1bmN0aW9uIGlkY3QxNngxNl9kY19hZGRfbmVvbgorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDQsICBpZGN0X2NvZWZmcworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjRofSwgW3g0XQorCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MS40aCwgICMwCisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5ofVswXSwgW3gyXQorICAgICAgICBzbXVsbCAgICAgICAgICAgdjIuNHMsICB2Mi40aCwgIHYwLmhbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIHYyLjRoLCAgdjIuNHMsICAjMTQKKyAgICAgICAgc211bGwgICAgICAgICAgIHYyLjRzLCAgdjIuNGgsICB2MC5oWzBdCisgICAgICAgIHJzaHJuICAgICAgICAgICB2Mi40aCwgIHYyLjRzLCAgIzE0CisgICAgICAgIGR1cCAgICAgICAgICAgICB2Mi44aCwgIHYyLmhbMF0KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5ofVswXSwgW3gyXQorCisgICAgICAgIHNyc2hyICAgICAgICAgICB2Mi44aCwgIHYyLjhoLCAgIzYKKworICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICAjMTYKKzE6CisgICAgICAgIC8vIExvb3AgdG8gYWRkIHRoZSBjb25zdGFudCBmcm9tIHYyIGludG8gYWxsIDE2eDE2IG91dHB1dHMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg0LCAgeDQsICAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjE2Yn0sICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjE2Yn0sICBbeDBdLCB4MQorICAgICAgICB1YWRkdyAgICAgICAgICAgdjE2LjhoLCB2Mi44aCwgIHYzLjhiCisgICAgICAgIHVhZGR3MiAgICAgICAgICB2MTcuOGgsIHYyLjhoLCAgdjMuMTZiCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MTguOGgsIHYyLjhoLCAgdjQuOGIKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYxOS44aCwgdjIuOGgsICB2NC4xNmIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYzLjhiLCAgdjE2LjhoCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2My4xNmIsIHYxNy44aAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuOGIsICB2MTguOGgKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHY0LjE2YiwgdjE5LjhoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuMTZifSwgIFt4M10sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuMTZifSwgIFt4M10sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorCisgICAgICAgIHJldAorZW5kZnVuYworCisubWFjcm8gaWRjdDE2X2VuZAorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjE4LCB2NywgIHY0LCAgdjcgICAgICAgICAgICAgICAgLy8gdjE4ID0gdDBhLCAgdjcgID0gdDdhCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MTksIHYyMiwgdjUsICB2MjIgICAgICAgICAgICAgICAvLyB2MTkgPSB0MWEsICB2MjIgPSB0NgorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjQsICB2MjYsIHYyMCwgdjI2ICAgICAgICAgICAgICAgLy8gdjQgID0gdDJhLCAgdjI2ID0gdDUKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHY1LCAgdjYsICB2MjgsIHY2ICAgICAgICAgICAgICAgIC8vIHY1ICA9IHQzYSwgIHY2ICA9IHQ0CisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MjAsIHYyOCwgdjE2LCB2MjQgICAgICAgICAgICAgICAvLyB2MjAgPSB0OGEsICB2MjggPSB0MTFhCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MjQsIHYyMSwgdjIzLCB2MjEgICAgICAgICAgICAgICAvLyB2MjQgPSB0OSwgICB2MjEgPSB0MTAKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYyMywgdjI3LCB2MjUsIHYyNyAgICAgICAgICAgICAgIC8vIHYyMyA9IHQxNCwgIHYyNyA9IHQxMworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjI1LCB2MjksIHYyOSwgdjE3ICAgICAgICAgICAgICAgLy8gdjI1ID0gdDE1YSwgdjI5ID0gdDEyYQorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MiwgIHYzLCAgdjI3LCB2MjEsIHYyLCAgdjMsICB2MTYsIHYxNywgdjMwLCB2MzEgLy8gdjIgID0gdDEzYSwgdjMgID0gdDEwYQorICAgICAgICBkbWJ1dHRlcmZseTAgICAgdjI4LCB2MjcsIHYyOSwgdjI4LCB2MjEsIHYyOSwgdjE2LCB2MTcsIHYzMCwgdjMxIC8vIHYyOCA9IHQxMiwgIHYyNyA9IHQxMQorCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MTYsIHYzMSwgdjE4LCB2MjUgICAgICAgICAgICAgICAvLyB2MTYgPSBvdXRbMF0sIHYzMSA9IG91dFsxNV0KKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYxNywgdjMwLCB2MTksIHYyMyAgICAgICAgICAgICAgIC8vIHYxNyA9IG91dFsxXSwgdjMwID0gb3V0WzE0XQorICAgICAgICBidXR0ZXJmbHlfOGhfciAgdjI1LCB2MjIsIHYyMiwgdjI0ICAgICAgICAgICAgICAgLy8gdjI1ID0gb3V0WzldLCB2MjIgPSBvdXRbNl0KKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYyMywgdjI0LCB2NywgIHYyMCAgICAgICAgICAgICAgIC8vIHYyMyA9IG91dFs3XSwgdjI0ID0gb3V0WzhdCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MTgsIHYyOSwgdjQsICB2MiAgICAgICAgICAgICAgICAvLyB2MTggPSBvdXRbMl0sIHYyOSA9IG91dFsxM10KKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYxOSwgdjI4LCB2NSwgIHYyOCAgICAgICAgICAgICAgIC8vIHYxOSA9IG91dFszXSwgdjI4ID0gb3V0WzEyXQorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjIwLCB2MjcsIHY2LCAgdjI3ICAgICAgICAgICAgICAgLy8gdjIwID0gb3V0WzRdLCB2MjcgPSBvdXRbMTFdCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MjEsIHYyNiwgdjI2LCB2MyAgICAgICAgICAgICAgICAvLyB2MjEgPSBvdXRbNV0sIHYyNiA9IG91dFsxMF0KKyAgICAgICAgcmV0CisuZW5kbQorCitmdW5jdGlvbiBpZGN0MTYKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYxNiwgdjI0LCB2MTYsIHYyNCwgdjIsIHYzLCB2NCwgdjUsIHY2LCB2NyAvLyB2MTYgPSB0MGEsICB2MjQgPSB0MWEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMCwgdjI4LCB2MC5oWzJdLCB2MC5oWzNdLCB2MiwgdjMsIHY0LCB2NSAvLyB2MjAgPSB0MmEsICB2MjggPSB0M2EKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYxOCwgdjMwLCB2MC5oWzRdLCB2MC5oWzVdLCB2MiwgdjMsIHY0LCB2NSAvLyB2MTggPSB0NGEsICB2MzAgPSB0N2EKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNiwgdjIyLCB2MC5oWzZdLCB2MC5oWzddLCB2MiwgdjMsIHY0LCB2NSAvLyB2MjYgPSB0NWEsICB2MjIgPSB0NmEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYxNywgdjMxLCB2MS5oWzBdLCB2MS5oWzFdLCB2MiwgdjMsIHY0LCB2NSAvLyB2MTcgPSB0OGEsICB2MzEgPSB0MTVhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjUsIHYyMywgdjEuaFsyXSwgdjEuaFszXSwgdjIsIHYzLCB2NCwgdjUgLy8gdjI1ID0gdDlhLCAgdjIzID0gdDE0YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjIxLCB2MjcsIHYxLmhbNF0sIHYxLmhbNV0sIHYyLCB2MywgdjQsIHY1IC8vIHYyMSA9IHQxMGEsIHYyNyA9IHQxM2EKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyOSwgdjE5LCB2MS5oWzZdLCB2MS5oWzddLCB2MiwgdjMsIHY0LCB2NSAvLyB2MjkgPSB0MTFhLCB2MTkgPSB0MTJhCisKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHY0LCAgdjI4LCB2MTYsIHYyOCAgICAgICAgICAgICAgIC8vIHY0ICA9IHQwLCAgIHYyOCA9IHQzCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2NSwgIHYyMCwgdjI0LCB2MjAgICAgICAgICAgICAgICAvLyB2NSAgPSB0MSwgICB2MjAgPSB0MgorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjYsICB2MjYsIHYxOCwgdjI2ICAgICAgICAgICAgICAgLy8gdjYgID0gdDQsICAgdjI2ID0gdDUKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHY3LCAgdjIyLCB2MzAsIHYyMiAgICAgICAgICAgICAgIC8vIHY3ICA9IHQ3LCAgIHYyMiA9IHQ2CisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MTYsIHYyNSwgdjE3LCB2MjUgICAgICAgICAgICAgICAvLyB2MTYgPSB0OCwgICB2MjUgPSB0OQorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjI0LCB2MjEsIHYyOSwgdjIxICAgICAgICAgICAgICAgLy8gdjI0ID0gdDExLCAgdjIxID0gdDEwCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MTcsIHYyNywgdjE5LCB2MjcgICAgICAgICAgICAgICAvLyB2MTcgPSB0MTIsICB2MjcgPSB0MTMKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYyOSwgdjIzLCB2MzEsIHYyMyAgICAgICAgICAgICAgIC8vIHYyOSA9IHQxNSwgIHYyMyA9IHQxNAorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MjIsIHYyNiwgdjIyLCB2MjYsIHYyLCB2MywgdjE4LCB2MTksIHYzMCwgdjMxICAgICAgICAvLyB2MjIgPSB0NmEsICB2MjYgPSB0NWEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMywgdjI1LCB2MC5oWzJdLCB2MC5oWzNdLCB2MTgsIHYxOSwgdjMwLCB2MzEgICAgICAgIC8vIHYyMyA9IHQ5YSwgIHYyNSA9IHQxNGEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNywgdjIxLCB2MC5oWzJdLCB2MC5oWzNdLCB2MTgsIHYxOSwgdjMwLCB2MzEsIG5lZz0xIC8vIHYyNyA9IHQxM2EsIHYyMSA9IHQxMGEKKyAgICAgICAgaWRjdDE2X2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MTZfaGFsZgorICAgICAgICBkbWJ1dHRlcmZseTBfaCAgdjE2LCB2MjQsIHYxNiwgdjI0LCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3IC8vIHYxNiA9IHQwYSwgIHYyNCA9IHQxYQorICAgICAgICBkbWJ1dHRlcmZseV9oMSAgdjIwLCB2MjgsIHYwLmhbMl0sIHYwLmhbM10sIHYyLCB2MywgdjQsIHY1IC8vIHYyMCA9IHQyYSwgIHYyOCA9IHQzYQorICAgICAgICBkbWJ1dHRlcmZseV9oMSAgdjE4LCB2MzAsIHYwLmhbNF0sIHYwLmhbNV0sIHYyLCB2MywgdjQsIHY1IC8vIHYxOCA9IHQ0YSwgIHYzMCA9IHQ3YQorICAgICAgICBkbWJ1dHRlcmZseV9oMiAgdjI2LCB2MjIsIHYwLmhbNl0sIHYwLmhbN10sIHYyLCB2MywgdjQsIHY1IC8vIHYyNiA9IHQ1YSwgIHYyMiA9IHQ2YQorICAgICAgICBkbWJ1dHRlcmZseV9oMSAgdjE3LCB2MzEsIHYxLmhbMF0sIHYxLmhbMV0sIHYyLCB2MywgdjQsIHY1IC8vIHYxNyA9IHQ4YSwgIHYzMSA9IHQxNWEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDIgIHYyNSwgdjIzLCB2MS5oWzJdLCB2MS5oWzNdLCB2MiwgdjMsIHY0LCB2NSAvLyB2MjUgPSB0OWEsICB2MjMgPSB0MTRhCisgICAgICAgIGRtYnV0dGVyZmx5X2gxICB2MjEsIHYyNywgdjEuaFs0XSwgdjEuaFs1XSwgdjIsIHYzLCB2NCwgdjUgLy8gdjIxID0gdDEwYSwgdjI3ID0gdDEzYQorICAgICAgICBkbWJ1dHRlcmZseV9oMiAgdjI5LCB2MTksIHYxLmhbNl0sIHYxLmhbN10sIHYyLCB2MywgdjQsIHY1IC8vIHYyOSA9IHQxMWEsIHYxOSA9IHQxMmEKKworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjQsICB2MjgsIHYxNiwgdjI4ICAgICAgICAgICAgICAgLy8gdjQgID0gdDAsICAgdjI4ID0gdDMKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHY1LCAgdjIwLCB2MjQsIHYyMCAgICAgICAgICAgICAgIC8vIHY1ICA9IHQxLCAgIHYyMCA9IHQyCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2NiwgIHYyNiwgdjE4LCB2MjYgICAgICAgICAgICAgICAvLyB2NiAgPSB0NCwgICB2MjYgPSB0NQorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjcsICB2MjIsIHYzMCwgdjIyICAgICAgICAgICAgICAgLy8gdjcgID0gdDcsICAgdjIyID0gdDYKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYxNiwgdjI1LCB2MTcsIHYyNSAgICAgICAgICAgICAgIC8vIHYxNiA9IHQ4LCAgIHYyNSA9IHQ5CisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MjQsIHYyMSwgdjI5LCB2MjEgICAgICAgICAgICAgICAvLyB2MjQgPSB0MTEsICB2MjEgPSB0MTAKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYxNywgdjI3LCB2MTksIHYyNyAgICAgICAgICAgICAgIC8vIHYxNyA9IHQxMiwgIHYyNyA9IHQxMworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjI5LCB2MjMsIHYzMSwgdjIzICAgICAgICAgICAgICAgLy8gdjI5ID0gdDE1LCAgdjIzID0gdDE0CisKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMiwgdjI2LCB2MjIsIHYyNiwgdjIsIHYzLCB2MTgsIHYxOSwgdjMwLCB2MzEgICAgICAgIC8vIHYyMiA9IHQ2YSwgIHYyNiA9IHQ1YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjIzLCB2MjUsIHYwLmhbMl0sIHYwLmhbM10sIHYxOCwgdjE5LCB2MzAsIHYzMSAgICAgICAgLy8gdjIzID0gdDlhLCAgdjI1ID0gdDE0YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI3LCB2MjEsIHYwLmhbMl0sIHYwLmhbM10sIHYxOCwgdjE5LCB2MzAsIHYzMSwgbmVnPTEgLy8gdjI3ID0gdDEzYSwgdjIxID0gdDEwYQorICAgICAgICBpZGN0MTZfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QxNl9xdWFydGVyCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2MjQsIHYyNSwgdjE5LCB2MS5oWzddCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2NCwgIHY1LCAgdjE3LCB2MS5oWzBdCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2NywgIHY2LCAgdjE4LCB2MC5oWzVdCisgICAgICAgIGRzbXVsbF9oICAgICAgICB2MzAsIHYzMSwgdjE4LCB2MC5oWzRdCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MjQuNHMsICB2MjQuNHMKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyNS40cywgIHYyNS40cworICAgICAgICBkc211bGxfaCAgICAgICAgdjI5LCB2MjgsIHYxNywgdjEuaFsxXQorICAgICAgICBkc211bGxfaCAgICAgICAgdjI2LCB2MjcsIHYxOSwgdjEuaFs2XQorICAgICAgICBkc211bGxfaCAgICAgICAgdjIyLCB2MjMsIHYxNiwgdjAuaFswXQorICAgICAgICBkcnNocm5faCAgICAgICAgdjI0LCB2MjQsIHYyNSwgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MTYsIHY0LCAgdjUsICAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHY3LCAgdjcsICB2NiwgICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjYsICB2MzAsIHYzMSwgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjksIHYyOSwgdjI4LCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYxNywgdjI2LCB2MjcsICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjI4LCB2MjIsIHYyMywgIzE0CisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjE3LCB2MjQsIHYwLmhbMl0sIHYwLmhbM10KKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxOCwgdjE5LCB2MzAsIHYzMSwgdjI5LCB2MTYsIHYwLmhbMl0sIHYwLmhbM10KKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyMi40cywgIHYyMi40cworICAgICAgICBuZWcgICAgICAgICAgICAgdjIzLjRzLCAgdjIzLjRzCisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjcsIHYyMCwgdjIxLCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyMSwgdjIyLCB2MjMsICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjIzLCB2MTgsIHYxOSwgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjUsIHYzMCwgdjMxLCAjMTQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY0LjE2YiwgIHYyOC4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHY1LjE2YiwgIHYyOC4xNmIKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMiwgdjI2LCB2NywgIHY2LCAgdjE4LCB2MTksIHYzMCwgdjMxCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjAuMTZiLCB2MjguMTZiCisgICAgICAgIGlkY3QxNl9lbmQKK2VuZGZ1bmMKKworZnVuY3Rpb24gaWFkc3QxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhoLHYxLjhofSwgW3gxMV0KKworICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjYsICB2NywgIHY0LCAgdjUsICB2MzEsIHYxNiwgdjAuaFsxXSwgdjAuaFswXSAgIC8vIHY2LHY3ICAgPSB0MSwgICB2NCx2NSAgID0gdDAKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxMCwgdjExLCB2OCwgIHY5LCAgdjIzLCB2MjQsIHYwLmhbNV0sIHYwLmhbNF0gICAvLyB2MTAsdjExID0gdDksICAgdjgsdjkgICA9IHQ4CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MzEsIHYyNCwgdjYsICB2NywgIHYxMCwgdjExLCB2MTIsIHYxMywgdjEwLCB2MTEgLy8gdjMxICAgICA9IHQxYSwgIHYyNCAgICAgPSB0OWEKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxNCwgdjE1LCB2MTIsIHYxMywgdjI5LCB2MTgsIHYwLmhbM10sIHYwLmhbMl0gICAvLyB2MTQsdjE1ID0gdDMsICAgdjEyLHYxMyA9IHQyCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MTYsIHYyMywgdjQsICB2NSwgIHY4LCAgdjksICB2NiwgIHY3LCAgdjgsICB2OSAgLy8gdjE2ICAgICA9IHQwYSwgIHYyMyAgICAgPSB0OGEKKworICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjYsICB2NywgIHY0LCAgdjUsICB2MjEsIHYyNiwgdjAuaFs3XSwgdjAuaFs2XSAgIC8vIHY2LHY3ICAgPSB0MTEsICB2NCx2NSAgID0gdDEwCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjksIHYyNiwgdjE0LCB2MTUsIHY2LCAgdjcsICB2OCwgIHY5LCAgdjYsICB2NyAgLy8gdjI5ICAgICA9IHQzYSwgIHYyNiAgICAgPSB0MTFhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTAsIHYxMSwgdjgsICB2OSwgIHYyNywgdjIwLCB2MS5oWzFdLCB2MS5oWzBdICAgLy8gdjEwLHYxMSA9IHQ1LCAgIHY4LHY5ICAgPSB0NAorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjE4LCB2MjEsIHYxMiwgdjEzLCB2NCwgIHY1LCAgdjYsICB2NywgIHY0LCAgdjUgIC8vIHYxOCAgICAgPSB0MmEsICB2MjEgICAgID0gdDEwYQorCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTQsIHYxNSwgdjEyLCB2MTMsIHYxOSwgdjI4LCB2MS5oWzVdLCB2MS5oWzRdICAgLy8gdjE0LHYxNSA9IHQxMywgIHYxMix2MTMgPSB0MTIKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIHYyMCwgdjI4LCB2MTAsIHYxMSwgdjE0LCB2MTUsIHY0LCAgdjUsICB2MTQsIHYxNSAvLyB2MjAgICAgID0gdDVhLCAgdjI4ICAgICA9IHQxM2EKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHY2LCAgdjcsICB2NCwgIHY1LCAgdjI1LCB2MjIsIHYxLmhbM10sIHYxLmhbMl0gICAvLyB2Nix2NyAgID0gdDcsICAgdjQsdjUgICA9IHQ2CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjcsIHYxOSwgdjgsICB2OSwgIHYxMiwgdjEzLCB2MTAsIHYxMSwgdjEyLCB2MTMgLy8gdjI3ICAgICA9IHQ0YSwgIHYxOSAgICAgPSB0MTJhCisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxMCwgdjExLCB2OCwgIHY5LCAgdjE3LCB2MzAsIHYxLmhbN10sIHYxLmhbNl0gICAvLyB2MTAsdjExID0gdDE1LCAgdjgsdjkgICA9IHQxNAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhofSwgW3gxMF0KKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIHYyMiwgdjMwLCB2NiwgIHY3LCAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTAsIHYxMSAvLyB2MjIgICAgID0gdDdhLCAgdjMwICAgICA9IHQxNWEKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxNCwgdjE1LCB2MTIsIHYxMywgdjIzLCB2MjQsIHYwLmhbNF0sIHYwLmhbNV0gICAvLyB2MTQsdjE1ID0gdDksICAgdjEyLHYxMyA9IHQ4CisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjUsIHYxNywgdjQsICB2NSwgIHY4LCAgdjksICB2NiwgIHY3LCAgdjgsICB2OSAgLy8gdjI1ICAgICA9IHQ2YSwgIHYxNyAgICAgPSB0MTRhCisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHY0LCAgdjUsICB2NiwgIHY3LCAgdjI4LCB2MTksIHYwLmhbNV0sIHYwLmhbNF0gICAvLyB2NCx2NSAgID0gdDEyLCAgdjYsdjcgICA9IHQxMworICAgICAgICBkYnV0dGVyZmx5X24gICAgdjIzLCB2MTksIHYxMiwgdjEzLCB2NCwgIHY1LCAgdjgsICB2OSwgIHY0LCAgdjUgIC8vIHYyMyAgICAgPSB0OGEsICB2MTkgICAgID0gdDEyYQorICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjEwLCB2MTEsIHY4LCAgdjksICB2MjEsIHYyNiwgdjAuaFs2XSwgdjAuaFs3XSAgIC8vIHYxMCx2MTEgPSB0MTEsICB2OCx2OSAgID0gdDEwCisgICAgICAgIGJ1dHRlcmZseV84aF9yICB2NCwgIHYyNywgdjE2LCB2MjcgICAgICAgICAgICAgICAvLyB2NCAgPSB0NCwgICB2MjcgPSB0MAorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjI0LCB2MjgsIHYxNCwgdjE1LCB2NiwgIHY3LCAgdjEyLCB2MTMsIHY2LCAgdjcgIC8vIHYyNCAgICAgPSB0OWEsICB2MjggICAgID0gdDEzYQorCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTIsIHYxMywgdjE0LCB2MTUsIHYzMCwgdjE3LCB2MC5oWzddLCB2MC5oWzZdICAgLy8gdjEyLHYxMyA9IHQxNCwgIHYxNCx2MTUgPSB0MTUKKyAgICAgICAgYnV0dGVyZmx5XzhoX3IgIHY1LCAgdjIwLCB2MzEsIHYyMCAgICAgICAgICAgICAgIC8vIHY1ICA9IHQ1LCB2MjAgPSB0MQorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjIxLCB2MTcsIHY4LCAgdjksICB2MTIsIHYxMywgdjYsICB2NywgIHYxMiwgdjEzIC8vIHYyMSAgICAgPSB0MTBhLCB2MTcgICAgID0gdDE0YQorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjI2LCB2MzAsIHYxMCwgdjExLCB2MTQsIHYxNSwgdjgsICB2OSwgIHYxNCwgdjE1IC8vIHYyNiAgICAgPSB0MTFhLCB2MzAgICAgID0gdDE1YQorCisgICAgICAgIGJ1dHRlcmZseV84aF9yICB2NiwgIHYyNSwgdjE4LCB2MjUgICAgICAgICAgICAgICAvLyB2NiAgPSB0NiwgdjI1ID0gdDIKKyAgICAgICAgYnV0dGVyZmx5XzhoX3IgIHY3LCAgdjIyLCB2MjksIHYyMiAgICAgICAgICAgICAgIC8vIHY3ICA9IHQ3LCB2MjIgPSB0MworCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTAsIHYxMSwgdjgsICB2OSwgIHYxOSwgdjI4LCB2MC5oWzJdLCB2MC5oWzNdICAgLy8gdjEwLHYxMSA9IHQxMywgIHY4LHY5ICAgPSB0MTIKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxMiwgdjEzLCB2MTQsIHYxNSwgdjMwLCB2MTcsIHYwLmhbM10sIHYwLmhbMl0gICAvLyB2MTIsdjEzID0gdDE0LCAgdjE0LHYxNSA9IHQxNQorCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MTgsIHYzMCwgdjgsICB2OSwgIHYxMiwgdjEzLCB2MTYsIHYxNywgdjEyLCB2MTMgLy8gdjE4ICAgPSBvdXRbMl0sIHYzMCAgICAgPSB0MTRhCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICB2MjksIHYxNywgdjEwLCB2MTEsIHYxNCwgdjE1LCB2MTIsIHYxMywgdjE0LCB2MTUgLy8gdjI5ID0gLW91dFsxM10sIHYxNyAgICAgPSB0MTVhCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MjkuOGgsIHYyOS44aCAgICAgICAgICAgICAgICAgICAvLyB2MjkgPSBvdXRbMTNdCisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxMCwgdjExLCB2OCwgIHY5LCAgdjQsICB2NSwgIHYwLmhbMl0sIHYwLmhbM10gICAvLyB2MTAsdjExID0gdDVhLCAgdjgsdjkgICA9IHQ0YQorICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjEyLCB2MTMsIHYxNCwgdjE1LCB2NywgIHY2LCAgdjAuaFszXSwgdjAuaFsyXSAgIC8vIHYxMix2MTMgPSB0NmEsICB2MTQsdjE1ID0gdDdhCisKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYyLCAgdjYsICB2MjcsIHYyNSAgICAgICAgICAgICAgIC8vIHYyID0gb3V0WzBdLCB2NiA9IHQyYQorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjMsICB2NywgIHYyMywgdjIxICAgICAgICAgICAgICAgLy8gdjMgPS1vdXRbMV0sIHY3ID0gdDEwCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIHYxOSwgdjMxLCB2OCwgIHY5LCAgdjEyLCB2MTMsIHY0LCAgdjUsICB2OCwgIHY5ICAvLyB2MTkgPSAtb3V0WzNdLCAgdjMxID0gdDYKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYxOS44aCwgdjE5LjhoICAgICAgICAgICAgICAgICAgIC8vIHYxOSA9IG91dFszXQorICAgICAgICBkYnV0dGVyZmx5X24gICAgdjI4LCB2MTYsIHYxMCwgdjExLCB2MTQsIHYxNSwgdjQsICB2NSwgIHYxMCwgdjExIC8vIHYyOCA9IG91dFsxMl0sICB2MTYgPSB0NworCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2NSwgIHY4LCAgdjIwLCB2MjIgICAgICAgICAgICAgICAvLyB2NSA9LW91dFsxNV0sdjggPSB0M2EKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHY0LCAgdjksICB2MjQsIHYyNiAgICAgICAgICAgICAgIC8vIHY0ID0gb3V0WzE0XSx2OSA9IHQxMQorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MjMsIHYyNCwgdjYsICB2OCwgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIDEgLy8gdjIzID0gb3V0WzddLCB2MjQgPSBvdXRbOF0KKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMSwgdjI2LCB2MzAsIHYxNywgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSwgMSAvLyB2MjEgPSBvdXRbNV0sIHYyNiA9IG91dFsxMF0KKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMCwgdjI3LCB2MTYsIHYzMSwgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSAgICAvLyB2MjAgPSBvdXRbNF0sIHYyNyA9IG91dFsxMV0KKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIHYyMiwgdjI1LCB2OSwgIHY3LCAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNSAgICAvLyB2MjIgPSBvdXRbNl0sIHYyNSA9IG91dFs5XQorCisgICAgICAgIG5lZyAgICAgICAgICAgICB2MzEuOGgsICB2NS44aCAgICAgICAgICAgICAgICAgICAgLy8gdjMxID0gb3V0WzE1XQorICAgICAgICBuZWcgICAgICAgICAgICAgdjE3LjhoLCAgdjMuOGggICAgICAgICAgICAgICAgICAgIC8vIHYxNyA9IG91dFsxXQorCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MTYuMTZiLCB2Mi4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYzMC4xNmIsIHY0LjE2YgorICAgICAgICByZXQKK2VuZGZ1bmMKKworLy8gSGVscGVyIG1hY3Jvczsgd2UgY2FuJ3QgdXNlIHRoZXNlIGV4cHJlc3Npb25zIGRpcmVjdGx5IHdpdGhpbgorLy8gZS5nLiAuaXJwIGR1ZSB0byB0aGUgZXh0cmEgY29uY2F0ZW5hdGlvbiBcKCkuIFRoZXJlZm9yZSB3cmFwCisvLyB0aGVtIGluIG1hY3JvcyB0byBhbGxvdyB1c2luZyAuaXJwIGJlbG93LgorLm1hY3JvIGxvYWQgaSwgc3JjLCBpbmMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2XGlcKCkuOGh9LCAgW1xzcmNdLCBcaW5jCisuZW5kbQorLm1hY3JvIHN0b3JlIGksIGRzdCwgaW5jCisgICAgICAgIHN0MSAgICAgICAgICAgICB7dlxpXCgpLjhofSwgIFtcZHN0XSwgXGluYworLmVuZG0KKy5tYWNybyBtb3ZpX3YgaSwgc2l6ZSwgaW1tCisgICAgICAgIG1vdmkgICAgICAgICAgICB2XGlcKClcc2l6ZSwgIFxpbW0KKy5lbmRtCisubWFjcm8gbG9hZF9jbGVhciBpLCBzcmMsIGluYworICAgICAgICBsZDEgICAgICAgICAgICAge3ZcaVwoKS44aH0sIFtcc3JjXQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjhofSwgIFtcc3JjXSwgXGluYworLmVuZG0KKworLm1hY3JvIGxvYWRfYWRkX3N0b3JlIGNvZWYwLCBjb2VmMSwgY29lZjIsIGNvZWYzLCBjb2VmNCwgY29lZjUsIGNvZWY2LCBjb2VmNywgdG1wMSwgdG1wMgorICAgICAgICBzcnNociAgICAgICAgICAgXGNvZWYwLCBcY29lZjAsICM2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuOGJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIFxjb2VmMSwgXGNvZWYxLCAjNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjhifSwgIFt4M10sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICBcY29lZjIsIFxjb2VmMiwgIzYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC44Yn0sICBbeDBdLCB4MQorICAgICAgICBzcnNociAgICAgICAgICAgXGNvZWYzLCBcY29lZjMsICM2CisgICAgICAgIHVhZGR3ICAgICAgICAgICBcY29lZjAsIFxjb2VmMCwgdjIuOGIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS44Yn0sICBbeDNdLCB4MQorICAgICAgICB1YWRkdyAgICAgICAgICAgXGNvZWYxLCBcY29lZjEsIHYzLjhiCisgICAgICAgIHNyc2hyICAgICAgICAgICBcY29lZjQsIFxjb2VmNCwgIzYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni44Yn0sICBbeDBdLCB4MQorICAgICAgICBzcnNociAgICAgICAgICAgXGNvZWY1LCBcY29lZjUsICM2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOGJ9LCAgW3gzXSwgeDEKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYyLjhiLCAgXGNvZWYwCisgICAgICAgIHNyc2hyICAgICAgICAgICBcY29lZjYsIFxjb2VmNiwgIzYKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYzLjhiLCAgXGNvZWYxCisgICAgICAgIHNyc2hyICAgICAgICAgICBcY29lZjcsIFxjb2VmNywgIzYKKyAgICAgICAgdWFkZHcgICAgICAgICAgIFxjb2VmMiwgXGNvZWYyLCB2NC44YgorICAgICAgICBsZDEgICAgICAgICAgICAge1x0bXAxfSwgIFt4MF0sIHgxCisgICAgICAgIHVhZGR3ICAgICAgICAgICBcY29lZjMsIFxjb2VmMywgdjUuOGIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcdG1wMn0sICBbeDNdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuOGIsICBcY29lZjIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MywgIHgzLCAgeDEsIGxzbCAjMgorICAgICAgICBzcXh0dW4gICAgICAgICAgdjUuOGIsICBcY29lZjMKKyAgICAgICAgdWFkZHcgICAgICAgICAgIFxjb2VmNCwgXGNvZWY0LCB2Ni44YgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjhifSwgIFt4MF0sIHgxCisgICAgICAgIHVhZGR3ICAgICAgICAgICBcY29lZjUsIFxjb2VmNSwgdjcuOGIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My44Yn0sICBbeDNdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjYuOGIsICBcY29lZjQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44Yn0sICBbeDBdLCB4MQorICAgICAgICBzcXh0dW4gICAgICAgICAgdjcuOGIsICBcY29lZjUKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44Yn0sICBbeDNdLCB4MQorICAgICAgICB1YWRkdyAgICAgICAgICAgXGNvZWY2LCBcY29lZjYsIFx0bXAxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuOGJ9LCAgW3gwXSwgeDEKKyAgICAgICAgdWFkZHcgICAgICAgICAgIFxjb2VmNywgXGNvZWY3LCBcdG1wMgorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjhifSwgIFt4M10sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICBcdG1wMSwgIFxjb2VmNgorICAgICAgICBzcXh0dW4gICAgICAgICAgXHRtcDIsICBcY29lZjcKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtcdG1wMX0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge1x0bXAyfSwgIFt4M10sIHgxCisuZW5kbQorCisvLyBSZWFkIGEgdmVydGljYWwgOHgxNiBzbGljZSBvdXQgb2YgYSAxNngxNiBtYXRyaXgsIGRvIGEgdHJhbnNmb3JtIG9uIGl0LAorLy8gdHJhbnNwb3NlIGludG8gYSBob3Jpem9udGFsIDE2eDggc2xpY2UgYW5kIHN0b3JlLgorLy8geDAgPSBkc3QgKHRlbXAgYnVmZmVyKQorLy8geDEgPSBzbGljZSBvZmZzZXQKKy8vIHgyID0gc3JjCisvLyB4OSA9IGlucHV0IHN0cmlkZQorLm1hY3JvIGl0eGZtMTZfMWRfZnVuY3MgdHhmbQorZnVuY3Rpb24gXHR4Zm1cKCkxNl8xZF84eDE2X3Bhc3MxX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYyLjhoLCAjMAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBsb2FkX2NsZWFyICAgICAgXGksICB4MiwgIHg5CisuZW5kcgorCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHhmbVwoKTE2CisKKyAgICAgICAgLy8gRG8gdHdvIDh4OCB0cmFuc3Bvc2VzLiBPcmlnaW5hbGx5LCB2MTYtdjMxIGNvbnRhaW4gdGhlCisgICAgICAgIC8vIDE2IHJvd3MuIEFmdGVyd2FyZHMsIHYxNi12MjMgYW5kIHYyNC12MzEgY29udGFpbiB0aGUgdHdvCisgICAgICAgIC8vIHRyYW5zcG9zZWQgOHg4IGJsb2Nrcy4KKyAgICAgICAgdHJhbnNwb3NlXzh4OEggIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MiwgdjMKKyAgICAgICAgdHJhbnNwb3NlXzh4OEggIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjksIHYzMCwgdjMxLCB2MiwgdjMKKworICAgICAgICAvLyBTdG9yZSB0aGUgdHJhbnNwb3NlZCA4eDggYmxvY2tzIGhvcml6b250YWxseS4KKyAgICAgICAgY21wICAgICAgICAgICAgIHgxLCAgIzgKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDFmCisuaXJwIGksIDE2LCAyNCwgMTcsIDI1LCAxOCwgMjYsIDE5LCAyNywgMjAsIDI4LCAyMSwgMjksIDIyLCAzMCwgMjMsIDMxCisgICAgICAgIHN0b3JlICAgICAgICAgICBcaSwgIHgwLCAgIzE2CisuZW5kcgorICAgICAgICBiciAgICAgICAgICAgICAgeDE0CisxOgorICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IEZvciB0aGUgbGFzdCBpbnB1dCBjb2x1bW4gKHgxID09IDgpLAorICAgICAgICAvLyB3aGljaCB3b3VsZCBiZSBzdG9yZWQgYXMgdGhlIGxhc3Qgcm93IGluIHRoZSB0ZW1wIGJ1ZmZlciwKKyAgICAgICAgLy8gZG9uJ3Qgc3RvcmUgdGhlIGZpcnN0IDh4OCBibG9jaywgYnV0IGtlZXAgaXQgaW4gcmVnaXN0ZXJzCisgICAgICAgIC8vIGZvciB0aGUgZmlyc3Qgc2xpY2Ugb2YgdGhlIHNlY29uZCBwYXNzICh3aGVyZSBpdCBpcyB0aGUKKyAgICAgICAgLy8gbGFzdCA4eDggYmxvY2spLgorLmlycCBpLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMTYKKyAgICAgICAgc3RvcmUgICAgICAgICAgIFxpLCAgeDAsICAjMTYKKy5lbmRyCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjQuMTZiLCB2MTYuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjUuMTZiLCB2MTcuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjYuMTZiLCB2MTguMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjcuMTZiLCB2MTkuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjguMTZiLCB2MjAuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MjkuMTZiLCB2MjEuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MzAuMTZiLCB2MjIuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MzEuMTZiLCB2MjMuMTZiCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKworLy8gUmVhZCBhIHZlcnRpY2FsIDh4MTYgc2xpY2Ugb3V0IG9mIGEgMTZ4MTYgbWF0cml4LCBkbyBhIHRyYW5zZm9ybSBvbiBpdCwKKy8vIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHBpeGVscyAoZnJvbSBhIHNpbWlsYXIgOHgxNiBzbGljZSksIGFkZCBhbmQgc3RvcmUgYmFjay4KKy8vIHgwID0gZHN0CisvLyB4MSA9IGRzdCBzdHJpZGUKKy8vIHgyID0gc3JjICh0ZW1wIGJ1ZmZlcikKKy8vIHgzID0gc2xpY2Ugb2Zmc2V0CisvLyB4OSA9IHRlbXAgYnVmZmVyIHN0cmlkZQorZnVuY3Rpb24gXHR4Zm1cKCkxNl8xZF84eDE2X3Bhc3MyX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMworICAgICAgICBsb2FkICAgICAgICAgICAgXGksICB4MiwgIHg5CisuZW5kcgorICAgICAgICBjYnogICAgICAgICAgICAgeDMsICAxZgorLmlycCBpLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCAgeDIsICB4OQorLmVuZHIKKzE6CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgzLCAgeDAsICB4MQorICAgICAgICBsc2wgICAgICAgICAgICAgeDEsICB4MSwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHhmbVwoKTE2CisKKyAgICAgICAgbG9hZF9hZGRfc3RvcmUgIHYxNi44aCwgdjE3LjhoLCB2MTguOGgsIHYxOS44aCwgdjIwLjhoLCB2MjEuOGgsIHYyMi44aCwgdjIzLjhoLCB2MTYuOGIsIHYxNy44YgorICAgICAgICBsb2FkX2FkZF9zdG9yZSAgdjI0LjhoLCB2MjUuOGgsIHYyNi44aCwgdjI3LjhoLCB2MjguOGgsIHYyOS44aCwgdjMwLjhoLCB2MzEuOGgsIHYxNi44YiwgdjE3LjhiCisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNAorZW5kZnVuYworLmVuZG0KKworaXR4Zm0xNl8xZF9mdW5jcyBpZGN0CitpdHhmbTE2XzFkX2Z1bmNzIGlhZHN0CisKKy5tYWNybyBpdHhmbV9mdW5jMTZ4MTYgdHhmbTEsIHR4Zm0yCitmdW5jdGlvbiBmZl92cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV8xNngxNl9hZGRfbmVvbiwgZXhwb3J0PTEKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIGlkY3QxNngxNl9kY19hZGRfbmVvbgorLmVuZGlmCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTUsIHgzMAorICAgICAgICAvLyBpYWRzdDE2IHJlcXVpcmVzIGNsb2JiZXJpbmcgdjgtdjE1LCBidXQgaWRjdDE2IGRvZXNuJ3QgbmVlZCB0by4KKy5pZm5jIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwLCAjLTB4MTBdIQorLmVuZGlmCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICAjNTEyCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg0LCAgeDAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg2LCAgeDIKKworICAgICAgICBtb3ZyZWwgICAgICAgICAgeDEwLCBpZGN0X2NvZWZmcworLmlmbmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgbW92cmVsICAgICAgICAgIHgxMSwgaWFkc3QxNl9jb2VmZnMKKy5lbmRpZgorLmlmYyBcdHhmbTEsaWRjdAorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhoLHYxLjhofSwgW3gxMF0KKy5lbmRpZgorICAgICAgICBtb3YgICAgICAgICAgICAgeDksICAjMzIKKworLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMTAKKyAgICAgICAgYi5sZSAgICAgICAgICAgIGlkY3QxNngxNl9xdWFydGVyX2FkZF9uZW9uCisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgICMzOAorICAgICAgICBiLmxlICAgICAgICAgICAgaWRjdDE2eDE2X2hhbGZfYWRkX25lb24KKy5lbmRpZgorCisuaXJwIGksIDAsIDgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgc3AsICAjKFxpKjMyKQorLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorLmlmIFxpID09IDgKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzM4CisgICAgICAgIGIubGUgICAgICAgICAgICAxZgorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxLCAgI1xpCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHg2LCAgIyhcaSoyKQorICAgICAgICBibCAgICAgICAgICAgICAgXHR4Zm0xXCgpMTZfMWRfOHgxNl9wYXNzMV9uZW9uCisuZW5kcgorLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlhZHN0X2lkY3QKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44aCx2MS44aH0sIFt4MTBdCisuZW5kaWYKKworLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICBiICAgICAgICAgICAgICAgM2YKKzE6CisgICAgICAgIC8vIFNldCB2MjQtdjMxIHRvIHplcm8sIGZvciB0aGUgaW4tcmVnaXN0ZXIgcGFzc3Rocm91Z2ggb2YKKyAgICAgICAgLy8gY29lZmZpY2llbnRzIHRvIHBhc3MgMi4gU2luY2Ugd2Ugb25seSBkbyB0d28gc2xpY2VzLCB0aGlzIGNhbgorICAgICAgICAvLyBvbmx5IGV2ZXIgaGFwcGVuIGZvciB0aGUgc2Vjb25kIHNsaWNlLiBTbyB3ZSBvbmx5IG5lZWQgdG8gc3RvcmUKKyAgICAgICAgLy8gemVyb3MgdG8gdGhlIHRlbXAgYnVmZmVyIGZvciB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgLy8gTW92ZSB4MCB0byB0aGUgc2Vjb25kIGhhbGYsIGFuZCB1c2UgeDkgPT0gMzIgYXMgaW5jcmVtZW50LgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMxNgorLmlycCBpLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKKyAgICAgICAgbW92aV92ICAgICAgICAgIFxpLCAgLjE2YiwgIzAKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuOGh9LCAgW3gwXSwgeDkKKy5lbmRyCiszOgorLmVuZGlmCisKKy5pcnAgaSwgMCwgOAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4NCwgICMoXGkpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHg1CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHNwLCAgIyhcaSoyKQorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICAjXGkKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eGZtMlwoKTE2XzFkXzh4MTZfcGFzczJfbmVvbgorLmVuZHIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICM1MTIKKy5pZm5jIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwXSwgMHgxMAorLmVuZGlmCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTUKK2VuZGZ1bmMKKy5lbmRtCisKK2l0eGZtX2Z1bmMxNngxNiBpZGN0LCAgaWRjdAoraXR4Zm1fZnVuYzE2eDE2IGlhZHN0LCBpZGN0CitpdHhmbV9mdW5jMTZ4MTYgaWRjdCwgIGlhZHN0CitpdHhmbV9mdW5jMTZ4MTYgaWFkc3QsIGlhZHN0CisKK2Z1bmN0aW9uIGlkY3QxNl8xZF84eDE2X3Bhc3MxX3F1YXJ0ZXJfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYyLjhoLCAjMAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOQorICAgICAgICBsb2FkX2NsZWFyICAgICAgXGksICB4MiwgIHg5CisuZW5kcgorCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfcXVhcnRlcgorCisgICAgICAgIC8vIERvIHR3byA4eDggdHJhbnNwb3Nlcy4gT3JpZ2luYWxseSwgdjE2LXYzMSBjb250YWluIHRoZQorICAgICAgICAvLyAxNiByb3dzLiBBZnRlcndhcmRzLCB2MTYtdjIzIGFuZCB2MjQtdjMxIGNvbnRhaW4gdGhlIHR3bworICAgICAgICAvLyB0cmFuc3Bvc2VkIDh4OCBibG9ja3MuCisgICAgICAgIHRyYW5zcG9zZV84eDhIICB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjIsIHYzCisgICAgICAgIHRyYW5zcG9zZV84eDhIICB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYzMSwgdjIsIHYzCisKKyAgICAgICAgLy8gU3RvcmUgdGhlIHRyYW5zcG9zZWQgOHg4IGJsb2NrcyBob3Jpem9udGFsbHkuCisgICAgICAgIC8vIFRoZSBmaXJzdCA4eDggYmxvY2sgaXMga2VwdCBpbiByZWdpc3RlcnMgZm9yIHRoZSBzZWNvbmQgcGFzcywKKyAgICAgICAgLy8gc3RvcmUgdGhlIHJlc3QgaW4gdGhlIHRlbXAgYnVmZmVyLgorICAgICAgICAvLyBTaW5jZSBvbmx5IGEgNHg0IHBhcnQgb2YgdGhlIGlucHV0IHdhcyBub256ZXJvLCB0aGlzIG1lYW5zIHRoYXQKKyAgICAgICAgLy8gb25seSA0IHJvd3MgYXJlIG5vbnplcm8gYWZ0ZXIgdHJhbnNwb3NpbmcsIGFuZCB0aGUgc2Vjb25kIHBhc3MKKyAgICAgICAgLy8gb25seSByZWFkcyB0aGUgdG9wbW9zdCA0IHJvd3MuIFRoZXJlZm9yZSBvbmx5IHN0b3JlIHRoZSB0b3Btb3N0CisgICAgICAgIC8vIDQgcm93cy4KKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMTYKKy5pcnAgaSwgMjQsIDI1LCAyNiwgMjcKKyAgICAgICAgc3RvcmUgICAgICAgICAgIFxpLCAgeDAsICB4OQorLmVuZHIKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MTZfMWRfOHgxNl9wYXNzMl9xdWFydGVyX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisgICAgICAgIGNieiAgICAgICAgICAgICB4MywgIDFmCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIGxvYWQgICAgICAgICAgICBcaSwgIHgyLCAgeDkKKy5lbmRyCisxOgorCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MywgIHgwLCAgeDEKKyAgICAgICAgbHNsICAgICAgICAgICAgIHgxLCAgeDEsICAjMQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDE2X3F1YXJ0ZXIKKworICAgICAgICBsb2FkX2FkZF9zdG9yZSAgdjE2LjhoLCB2MTcuOGgsIHYxOC44aCwgdjE5LjhoLCB2MjAuOGgsIHYyMS44aCwgdjIyLjhoLCB2MjMuOGgsIHYxNi44YiwgdjE3LjhiCisgICAgICAgIGxvYWRfYWRkX3N0b3JlICB2MjQuOGgsIHYyNS44aCwgdjI2LjhoLCB2MjcuOGgsIHYyOC44aCwgdjI5LjhoLCB2MzAuOGgsIHYzMS44aCwgdjE2LjhiLCB2MTcuOGIKKworICAgICAgICBiciAgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QxNl8xZF84eDE2X3Bhc3MxX2hhbGZfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYyLjhoLCAjMAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgbG9hZF9jbGVhciAgICAgIFxpLCAgeDIsICB4OQorLmVuZHIKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDE2X2hhbGYKKworICAgICAgICAvLyBEbyB0d28gOHg4IHRyYW5zcG9zZXMuIE9yaWdpbmFsbHksIHYxNi12MzEgY29udGFpbiB0aGUKKyAgICAgICAgLy8gMTYgcm93cy4gQWZ0ZXJ3YXJkcywgdjE2LXYyMyBhbmQgdjI0LXYzMSBjb250YWluIHRoZSB0d28KKyAgICAgICAgLy8gdHJhbnNwb3NlZCA4eDggYmxvY2tzLgorICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyLCB2MworICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYyLCB2MworCisgICAgICAgIC8vIFN0b3JlIHRoZSB0cmFuc3Bvc2VkIDh4OCBibG9ja3MgaG9yaXpvbnRhbGx5LgorICAgICAgICAvLyBUaGUgZmlyc3QgOHg4IGJsb2NrIGlzIGtlcHQgaW4gcmVnaXN0ZXJzIGZvciB0aGUgc2Vjb25kIHBhc3MsCisgICAgICAgIC8vIHN0b3JlIHRoZSByZXN0IGluIHRoZSB0ZW1wIGJ1ZmZlci4KKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMTYKKy5pcnAgaSwgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCisgICAgICAgIHN0b3JlICAgICAgICAgICBcaSwgIHgwLCAgeDkKKy5lbmRyCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKworZnVuY3Rpb24gaWRjdDE2XzFkXzh4MTZfcGFzczJfaGFsZl9uZW9uCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTQsIHgzMAorICAgICAgICBjYnogICAgICAgICAgICAgeDMsICAxZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCAgeDIsICB4OQorLmVuZHIKKzE6CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgzLCAgeDAsICB4MQorICAgICAgICBsc2wgICAgICAgICAgICAgeDEsICB4MSwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfaGFsZgorCisgICAgICAgIGxvYWRfYWRkX3N0b3JlICB2MTYuOGgsIHYxNy44aCwgdjE4LjhoLCB2MTkuOGgsIHYyMC44aCwgdjIxLjhoLCB2MjIuOGgsIHYyMy44aCwgdjE2LjhiLCB2MTcuOGIKKyAgICAgICAgbG9hZF9hZGRfc3RvcmUgIHYyNC44aCwgdjI1LjhoLCB2MjYuOGgsIHYyNy44aCwgdjI4LjhoLCB2MjkuOGgsIHYzMC44aCwgdjMxLjhoLCB2MTYuOGIsIHYxNy44YgorCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTQKK2VuZGZ1bmMKKworLm1hY3JvIGlkY3QxNl9wYXJ0aWFsIHNpemUKK2Z1bmN0aW9uIGlkY3QxNngxNl9cc2l6ZVwoKV9hZGRfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICBzcCwgICMoMCozMikKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDYsICAjKDAqMikKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNl8xZF84eDE2X3Bhc3MxX1xzaXplXCgpX25lb24KKy5pcnAgaSwgMCwgOAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4NCwgICMoXGkpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHg1CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHNwLCAgIyhcaSoyKQorICAgICAgICBtb3YgICAgICAgICAgICAgeDMsICAjXGkKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNl8xZF84eDE2X3Bhc3MyX1xzaXplXCgpX25lb24KKy5lbmRyCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjNTEyCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTUKK2VuZGZ1bmMKKy5lbmRtCisKK2lkY3QxNl9wYXJ0aWFsIHF1YXJ0ZXIKK2lkY3QxNl9wYXJ0aWFsIGhhbGYKKworZnVuY3Rpb24gaWRjdDMyeDMyX2RjX2FkZF9uZW9uCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NCwgIGlkY3RfY29lZmZzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuNGh9LCBbeDRdCisKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYxLjRoLCAgIzAKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YyLmh9WzBdLCBbeDJdCisgICAgICAgIHNtdWxsICAgICAgICAgICB2Mi40cywgIHYyLjRoLCAgdjAuaFswXQorICAgICAgICByc2hybiAgICAgICAgICAgdjIuNGgsICB2Mi40cywgICMxNAorICAgICAgICBzbXVsbCAgICAgICAgICAgdjIuNHMsICB2Mi40aCwgIHYwLmhbMF0KKyAgICAgICAgcnNocm4gICAgICAgICAgIHYyLjRoLCAgdjIuNHMsICAjMTQKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYyLjhoLCAgdjIuaFswXQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLmh9WzBdLCBbeDJdCisKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHYwLjhoLCAgdjIuOGgsICAjNgorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MywgIHgwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NCwgICMzMgorMToKKyAgICAgICAgLy8gTG9vcCB0byBhZGQgdGhlIGNvbnN0YW50IHYwIGludG8gYWxsIDMyeDMyIG91dHB1dHMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg0LCAgeDQsICAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjE2Yix2Mi4xNmJ9LCAgW3gwXSwgeDEKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYxNi44aCwgdjAuOGgsICB2MS44YgorICAgICAgICB1YWRkdzIgICAgICAgICAgdjE3LjhoLCB2MC44aCwgIHYxLjE2YgorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjE2Yix2NC4xNmJ9LCAgW3gwXSwgeDEKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHYxOC44aCwgdjAuOGgsICB2Mi44YgorICAgICAgICB1YWRkdzIgICAgICAgICAgdjE5LjhoLCB2MC44aCwgIHYyLjE2YgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjIwLjhoLCB2MC44aCwgIHYzLjhiCisgICAgICAgIHVhZGR3MiAgICAgICAgICB2MjEuOGgsIHYwLjhoLCAgdjMuMTZiCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2MjIuOGgsIHYwLjhoLCAgdjQuOGIKKyAgICAgICAgdWFkZHcyICAgICAgICAgIHYyMy44aCwgdjAuOGgsICB2NC4xNmIKKyAgICAgICAgc3F4dHVuICAgICAgICAgIHYxLjhiLCAgdjE2LjhoCisgICAgICAgIHNxeHR1bjIgICAgICAgICB2MS4xNmIsIHYxNy44aAorICAgICAgICBzcXh0dW4gICAgICAgICAgdjIuOGIsICB2MTguOGgKKyAgICAgICAgc3F4dHVuMiAgICAgICAgIHYyLjE2YiwgdjE5LjhoCisgICAgICAgIHNxeHR1biAgICAgICAgICB2My44YiwgIHYyMC44aAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjMuMTZiLCB2MjEuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS4xNmIsdjIuMTZifSwgIFt4M10sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NC44YiwgIHYyMi44aAorICAgICAgICBzcXh0dW4yICAgICAgICAgdjQuMTZiLCB2MjMuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My4xNmIsdjQuMTZifSwgIFt4M10sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorCisgICAgICAgIHJldAorZW5kZnVuYworCisubWFjcm8gaWRjdDMyX2VuZAorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjE2LCB2NSwgIHY0LCAgdjUgIC8vIHYxNiA9IHQxNmEsIHY1ICA9IHQxOWEKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYxNywgdjIwLCB2MjMsIHYyMCAvLyB2MTcgPSB0MTcsICB2MjAgPSB0MTgKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYxOCwgdjYsICB2NywgIHY2ICAvLyB2MTggPSB0MjNhLCB2NiAgPSB0MjBhCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MTksIHYyMSwgdjIyLCB2MjEgLy8gdjE5ID0gdDIyLCAgdjIxID0gdDIxCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2NCwgIHYyOCwgdjI4LCB2MzAgLy8gdjQgID0gdDI0YSwgdjI4ID0gdDI3YQorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjIzLCB2MjYsIHYyNSwgdjI2IC8vIHYyMyA9IHQyNSwgIHYyNiA9IHQyNgorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjcsICB2MywgIHYyOSwgdjMxIC8vIHY3ICA9IHQzMWEsIHYzICA9IHQyOGEKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYyMiwgdjI3LCB2MjQsIHYyNyAvLyB2MjIgPSB0MzAsICB2MjcgPSB0MjkKKworICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI3LCB2MjAsIHYwLmhbMl0sIHYwLmhbM10sIHYyNCwgdjI1LCB2MzAsIHYzMSAgICAgICAgLy8gdjI3ID0gdDE4YSwgdjIwID0gdDI5YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjMsICB2NSwgIHYwLmhbMl0sIHYwLmhbM10sIHYyNCwgdjI1LCB2MzAsIHYzMSAgICAgICAgLy8gdjMgID0gdDE5LCAgdjUgID0gdDI4CisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjgsIHY2LCAgdjAuaFsyXSwgdjAuaFszXSwgdjI0LCB2MjUsIHYzMCwgdjMxLCBuZWc9MSAvLyB2MjggPSB0MjcsICB2NiAgPSB0MjAKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNiwgdjIxLCB2MC5oWzJdLCB2MC5oWzNdLCB2MjQsIHYyNSwgdjMwLCB2MzEsIG5lZz0xIC8vIHYyNiA9IHQyNmEsIHYyMSA9IHQyMWEKKworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjMxLCB2MjQsIHY3LCAgdjQgIC8vIHYzMSA9IHQzMSwgIHYyNCA9IHQyNAorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjMwLCB2MjUsIHYyMiwgdjIzIC8vIHYzMCA9IHQzMGEsIHYyNSA9IHQyNWEKKyAgICAgICAgYnV0dGVyZmx5XzhoX3IgIHYyMywgdjE2LCB2MTYsIHYxOCAvLyB2MjMgPSB0MjMsICB2MTYgPSB0MTYKKyAgICAgICAgYnV0dGVyZmx5XzhoX3IgIHYyMiwgdjE3LCB2MTcsIHYxOSAvLyB2MjIgPSB0MjJhLCB2MTcgPSB0MTdhCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MTgsIHYyMSwgdjI3LCB2MjEgLy8gdjE4ID0gdDE4LCAgdjIxID0gdDIxCisgICAgICAgIGJ1dHRlcmZseV84aF9yICB2MjcsIHYyOCwgdjUsICB2MjggLy8gdjI3ID0gdDI3YSwgdjI4ID0gdDI4YQorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjI5LCB2MjYsIHYyMCwgdjI2IC8vIHYyOSA9IHQyOSwgIHYyNiA9IHQyNgorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjE5LCB2MjAsIHYzLCAgdjYgIC8vIHYxOSA9IHQxOWEsIHYyMCA9IHQyMAorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MjcsIHYyMCwgdjI3LCB2MjAsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcgLy8gdjI3ID0gdDI3LCAgdjIwID0gdDIwCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICB2MjYsIHYyMSwgdjI2LCB2MjEsIHYyLCB2MywgdjQsIHY1LCB2NiwgdjcgLy8gdjI2ID0gdDI2YSwgdjIxID0gdDIxYQorICAgICAgICBkbWJ1dHRlcmZseTAgICAgdjI1LCB2MjIsIHYyNSwgdjIyLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3IC8vIHYyNSA9IHQyNSwgIHYyMiA9IHQyMgorICAgICAgICBkbWJ1dHRlcmZseTAgICAgdjI0LCB2MjMsIHYyNCwgdjIzLCB2MiwgdjMsIHY0LCB2NSwgdjYsIHY3IC8vIHYyNCA9IHQyNGEsIHYyMyA9IHQyM2EKKyAgICAgICAgcmV0CisuZW5kbQorCitmdW5jdGlvbiBpZGN0MzJfb2RkCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MTYsIHYzMSwgdjguaFswXSwgdjguaFsxXSwgdjQsIHY1LCB2NiwgdjcgLy8gdjE2ID0gdDE2YSwgdjMxID0gdDMxYQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI0LCB2MjMsIHY4LmhbMl0sIHY4LmhbM10sIHY0LCB2NSwgdjYsIHY3IC8vIHYyNCA9IHQxN2EsIHYyMyA9IHQzMGEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMCwgdjI3LCB2OC5oWzRdLCB2OC5oWzVdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjAgPSB0MThhLCB2MjcgPSB0MjlhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjgsIHYxOSwgdjguaFs2XSwgdjguaFs3XSwgdjQsIHY1LCB2NiwgdjcgLy8gdjI4ID0gdDE5YSwgdjE5ID0gdDI4YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjE4LCB2MjksIHY5LmhbMF0sIHY5LmhbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYxOCA9IHQyMGEsIHYyOSA9IHQyN2EKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNiwgdjIxLCB2OS5oWzJdLCB2OS5oWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjYgPSB0MjFhLCB2MjEgPSB0MjZhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICB2MjIsIHYyNSwgdjkuaFs0XSwgdjkuaFs1XSwgdjQsIHY1LCB2NiwgdjcgLy8gdjIyID0gdDIyYSwgdjI1ID0gdDI1YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjMwLCB2MTcsIHY5LmhbNl0sIHY5LmhbN10sIHY0LCB2NSwgdjYsIHY3IC8vIHYzMCA9IHQyM2EsIHYxNyA9IHQyNGEKKworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjQsICB2MjQsIHYxNiwgdjI0IC8vIHY0ICA9IHQxNiwgdjI0ID0gdDE3CisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2NSwgIHYyMCwgdjI4LCB2MjAgLy8gdjUgID0gdDE5LCB2MjAgPSB0MTgKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHY2LCAgdjI2LCB2MTgsIHYyNiAvLyB2NiAgPSB0MjAsIHYyNiA9IHQyMQorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjcsICB2MjIsIHYzMCwgdjIyIC8vIHY3ICA9IHQyMywgdjIyID0gdDIyCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MjgsIHYyNSwgdjE3LCB2MjUgLy8gdjI4ID0gdDI0LCB2MjUgPSB0MjUKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYzMCwgdjIxLCB2MjksIHYyMSAvLyB2MzAgPSB0MjcsIHYyMSA9IHQyNgorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjI5LCB2MjMsIHYzMSwgdjIzIC8vIHYyOSA9IHQzMSwgdjIzID0gdDMwCisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MzEsIHYyNywgdjE5LCB2MjcgLy8gdjMxID0gdDI4LCB2MjcgPSB0MjkKKworICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjIzLCB2MjQsIHYwLmhbNF0sIHYwLmhbNV0sIHYxNiwgdjE3LCB2MTgsIHYxOSAgICAgICAgLy8gdjIzID0gdDE3YSwgdjI0ID0gdDMwYQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI3LCB2MjAsIHYwLmhbNF0sIHYwLmhbNV0sIHYxNiwgdjE3LCB2MTgsIHYxOSwgbmVnPTEgLy8gdjI3ID0gdDI5YSwgdjIwID0gdDE4YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjIxLCB2MjYsIHYwLmhbNl0sIHYwLmhbN10sIHYxNiwgdjE3LCB2MTgsIHYxOSAgICAgICAgLy8gdjIxID0gdDIxYSwgdjI2ID0gdDI2YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgdjI1LCB2MjIsIHYwLmhbNl0sIHYwLmhbN10sIHYxNiwgdjE3LCB2MTgsIHYxOSwgbmVnPTEgLy8gdjI1ID0gdDI1YSwgdjIyID0gdDIyYQorICAgICAgICBpZGN0MzJfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QzMl9vZGRfaGFsZgorICAgICAgICBkbWJ1dHRlcmZseV9oMSAgdjE2LCB2MzEsIHY4LmhbMF0sIHY4LmhbMV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYxNiA9IHQxNmEsIHYzMSA9IHQzMWEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDIgIHYyNCwgdjIzLCB2OC5oWzJdLCB2OC5oWzNdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MjQgPSB0MTdhLCB2MjMgPSB0MzBhCisgICAgICAgIGRtYnV0dGVyZmx5X2gxICB2MjAsIHYyNywgdjguaFs0XSwgdjguaFs1XSwgdjQsIHY1LCB2NiwgdjcgLy8gdjIwID0gdDE4YSwgdjI3ID0gdDI5YQorICAgICAgICBkbWJ1dHRlcmZseV9oMiAgdjI4LCB2MTksIHY4LmhbNl0sIHY4LmhbN10sIHY0LCB2NSwgdjYsIHY3IC8vIHYyOCA9IHQxOWEsIHYxOSA9IHQyOGEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDEgIHYxOCwgdjI5LCB2OS5oWzBdLCB2OS5oWzFdLCB2NCwgdjUsIHY2LCB2NyAvLyB2MTggPSB0MjBhLCB2MjkgPSB0MjdhCisgICAgICAgIGRtYnV0dGVyZmx5X2gyICB2MjYsIHYyMSwgdjkuaFsyXSwgdjkuaFszXSwgdjQsIHY1LCB2NiwgdjcgLy8gdjI2ID0gdDIxYSwgdjIxID0gdDI2YQorICAgICAgICBkbWJ1dHRlcmZseV9oMSAgdjIyLCB2MjUsIHY5LmhbNF0sIHY5LmhbNV0sIHY0LCB2NSwgdjYsIHY3IC8vIHYyMiA9IHQyMmEsIHYyNSA9IHQyNWEKKyAgICAgICAgZG1idXR0ZXJmbHlfaDIgIHYzMCwgdjE3LCB2OS5oWzZdLCB2OS5oWzddLCB2NCwgdjUsIHY2LCB2NyAvLyB2MzAgPSB0MjNhLCB2MTcgPSB0MjRhCisKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHY0LCAgdjI0LCB2MTYsIHYyNCAvLyB2NCAgPSB0MTYsIHYyNCA9IHQxNworICAgICAgICBidXR0ZXJmbHlfOGggICAgdjUsICB2MjAsIHYyOCwgdjIwIC8vIHY1ICA9IHQxOSwgdjIwID0gdDE4CisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2NiwgIHYyNiwgdjE4LCB2MjYgLy8gdjYgID0gdDIwLCB2MjYgPSB0MjEKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHY3LCAgdjIyLCB2MzAsIHYyMiAvLyB2NyAgPSB0MjMsIHYyMiA9IHQyMgorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjI4LCB2MjUsIHYxNywgdjI1IC8vIHYyOCA9IHQyNCwgdjI1ID0gdDI1CisgICAgICAgIGJ1dHRlcmZseV84aCAgICB2MzAsIHYyMSwgdjI5LCB2MjEgLy8gdjMwID0gdDI3LCB2MjEgPSB0MjYKKyAgICAgICAgYnV0dGVyZmx5XzhoICAgIHYyOSwgdjIzLCB2MzEsIHYyMyAvLyB2MjkgPSB0MzEsIHYyMyA9IHQzMAorICAgICAgICBidXR0ZXJmbHlfOGggICAgdjMxLCB2MjcsIHYxOSwgdjI3IC8vIHYzMSA9IHQyOCwgdjI3ID0gdDI5CisKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMywgdjI0LCB2MC5oWzRdLCB2MC5oWzVdLCB2MTYsIHYxNywgdjE4LCB2MTkgICAgICAgIC8vIHYyMyA9IHQxN2EsIHYyNCA9IHQzMGEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNywgdjIwLCB2MC5oWzRdLCB2MC5oWzVdLCB2MTYsIHYxNywgdjE4LCB2MTksIG5lZz0xIC8vIHYyNyA9IHQyOWEsIHYyMCA9IHQxOGEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyMSwgdjI2LCB2MC5oWzZdLCB2MC5oWzddLCB2MTYsIHYxNywgdjE4LCB2MTkgICAgICAgIC8vIHYyMSA9IHQyMWEsIHYyNiA9IHQyNmEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIHYyNSwgdjIyLCB2MC5oWzZdLCB2MC5oWzddLCB2MTYsIHYxNywgdjE4LCB2MTksIG5lZz0xIC8vIHYyNSA9IHQyNWEsIHYyMiA9IHQyMmEKKyAgICAgICAgaWRjdDMyX2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MzJfb2RkX3F1YXJ0ZXIKKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHY0LCAgdjUsICB2MTYsIHY4LmhbMF0KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHYyOCwgdjI5LCB2MTksIHY4LmhbN10KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHYzMCwgdjMxLCB2MTYsIHY4LmhbMV0KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHYyMiwgdjIzLCB2MTcsIHY5LmhbNl0KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHY3LCAgdjYsICB2MTcsIHY5LmhbN10KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHYyNiwgdjI3LCB2MTksIHY4LmhbNl0KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHYyMCwgdjIxLCB2MTgsIHY5LmhbMF0KKyAgICAgICAgZHNtdWxsX2ggICAgICAgIHYyNCwgdjI1LCB2MTgsIHY5LmhbMV0KKworICAgICAgICBuZWcgICAgICAgICAgICAgdjI4LjRzLCB2MjguNHMKKyAgICAgICAgbmVnICAgICAgICAgICAgIHYyOS40cywgdjI5LjRzCisgICAgICAgIG5lZyAgICAgICAgICAgICB2Ny40cywgIHY3LjRzCisgICAgICAgIG5lZyAgICAgICAgICAgICB2Ni40cywgIHY2LjRzCisKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHY0LCAgdjQsICB2NSwgICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjUsICB2MjgsIHYyOSwgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjksIHYzMCwgdjMxLCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyOCwgdjIyLCB2MjMsICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjcsICB2NywgIHY2LCAgIzE0CisgICAgICAgIGRyc2hybl9oICAgICAgICB2MzEsIHYyNiwgdjI3LCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHY2LCAgdjIwLCB2MjEsICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjMwLCB2MjQsIHYyNSwgIzE0CisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjI5LCB2NCwgIHYwLmhbNF0sIHYwLmhbNV0KKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHYyNywgdjI2LCB2MjAsIHYyMSwgdjMxLCB2NSwgIHYwLmhbNF0sIHYwLmhbNV0KKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyMywgdjE2LCB2MTcsICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjI0LCB2MTgsIHYxOSwgIzE0CisgICAgICAgIG5lZyAgICAgICAgICAgICB2MjAuNHMsIHYyMC40cworICAgICAgICBuZWcgICAgICAgICAgICAgdjIxLjRzLCB2MjEuNHMKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyNywgdjI3LCB2MjYsICMxNAorICAgICAgICBkcnNocm5faCAgICAgICAgdjIwLCB2MjAsIHYyMSwgIzE0CisgICAgICAgIGRtYnV0dGVyZmx5X2wgICB2MTYsIHYxNywgdjE4LCB2MTksIHYzMCwgdjYsICB2MC5oWzZdLCB2MC5oWzddCisgICAgICAgIGRyc2hybl9oICAgICAgICB2MjEsIHYxNiwgdjE3LCAjMTQKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyNiwgdjE4LCB2MTksICMxNAorICAgICAgICBkbWJ1dHRlcmZseV9sICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjgsIHY3LCAgdjAuaFs2XSwgdjAuaFs3XQorICAgICAgICBkcnNocm5faCAgICAgICAgdjI1LCB2MTYsIHYxNywgIzE0CisgICAgICAgIG5lZyAgICAgICAgICAgICB2MTguNHMsIHYxOC40cworICAgICAgICBuZWcgICAgICAgICAgICAgdjE5LjRzLCB2MTkuNHMKKyAgICAgICAgZHJzaHJuX2ggICAgICAgIHYyMiwgdjE4LCB2MTksICMxNAorCisgICAgICAgIGlkY3QzMl9lbmQKK2VuZGZ1bmMKKworLm1hY3JvIGlkY3QzMl9mdW5jcyBzdWZmaXgKKy8vIERvIGFuIDMyLXBvaW50IElEQ1Qgb2YgYSA4eDMyIHNsaWNlIG91dCBvZiBhIDMyeDMyIG1hdHJpeC4KKy8vIFRoZSAzMi1wb2ludCBJRENUIGNhbiBiZSBkZWNvbXBvc2VkIGludG8gdHdvIDE2LXBvaW50IElEQ1RzOworLy8gYSBub3JtYWwgSURDVDE2IHdpdGggZXZlcnkgb3RoZXIgaW5wdXQgY29tcG9uZW50ICh0aGUgZXZlbiBvbmVzLCB3aXRoCisvLyBlYWNoIG91dHB1dCB3cml0dGVuIHR3aWNlKSwgZm9sbG93ZWQgYnkgYSBzZXBhcmF0ZSAxNi1wb2ludCBJRENUCisvLyBvZiB0aGUgb2RkIGlucHV0cywgYWRkZWQvc3VidHJhY3RlZCBvbnRvIHRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBpZGN0MTYuCisvLyB4MCA9IGRzdCAodGVtcCBidWZmZXIpCisvLyB4MSA9IHVudXNlZAorLy8geDIgPSBzcmMKKy8vIHg5ID0gZG91YmxlIGlucHV0IHN0cmlkZQorZnVuY3Rpb24gaWRjdDMyXzFkXzh4MzJfcGFzczFcc3VmZml4XCgpX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNCwgeDMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2Mi44aCwgICMwCisKKyAgICAgICAgLy8gdjE2ID0gSU4oMCksIHYxNyA9IElOKDIpIC4uLiB2MzEgPSBJTigzMCkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBsb2FkX2NsZWFyICAgICAgXGksIHgyLCB4OQorLmVuZHIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIGxvYWRfY2xlYXIgICAgICBcaSwgeDIsIHg5CisuZW5kcgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIGxvYWRfY2xlYXIgICAgICBcaSwgeDIsIHg5CisuZW5kcgorLmVuZGlmCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNlxzdWZmaXgKKworICAgICAgICAvLyBEbyB0d28gOHg4IHRyYW5zcG9zZXMuIE9yaWdpbmFsbHksIHYxNi12MzEgY29udGFpbiB0aGUKKyAgICAgICAgLy8gMTYgcm93cy4gQWZ0ZXJ3YXJkcywgdjE2LXYyMyBhbmQgdjI0LXYzMSBjb250YWluIHRoZQorICAgICAgICAvLyB0d28gdHJhbnNwb3NlZCA4eDggYmxvY2tzLgorICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyLCB2MworICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYyLCB2MworCisgICAgICAgIC8vIFN0b3JlIHRoZSByZWdpc3RlcnMgYSwgYiBob3Jpem9udGFsbHksIGZvbGxvd2VkIGJ5IHRoZQorICAgICAgICAvLyBzYW1lIHJlZ2lzdGVycyBiLCBhIG1pcnJvcmVkLgorLm1hY3JvIHN0b3JlX3JldiBhLCBiCisgICAgICAgIC8vIFRoZXJlJ3Mgbm8gcmV2MTI4IGluc3RydWN0aW9uLCBidXQgd2UgcmV2ZXJzZSBlYWNoIDY0IGJpdAorICAgICAgICAvLyBoYWxmLCBhbmQgdGhlbiBmbGlwIHRoZW0gdXNpbmcgYW4gZXh0IHdpdGggOCBieXRlcyBvZmZzZXQuCisgICAgICAgIHJldjY0ICAgICAgICAgICB2My44aCwgXGIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtcYX0sICBbeDBdLCAjMTYKKyAgICAgICAgcmV2NjQgICAgICAgICAgIHYyLjhoLCBcYQorICAgICAgICBleHQgICAgICAgICAgICAgdjMuMTZiLCB2My4xNmIsIHYzLjE2YiwgIzgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtcYn0sICBbeDBdLCAjMTYKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyLjE2YiwgdjIuMTZiLCB2Mi4xNmIsICM4CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOGh9LCAgW3gwXSwgIzE2CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIuOGh9LCAgW3gwXSwgIzE2CisuZW5kbQorICAgICAgICBzdG9yZV9yZXYgICAgICAgdjE2LjhoLCB2MjQuOGgKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYxNy44aCwgdjI1LjhoCisgICAgICAgIHN0b3JlX3JldiAgICAgICB2MTguOGgsIHYyNi44aAorICAgICAgICBzdG9yZV9yZXYgICAgICAgdjE5LjhoLCB2MjcuOGgKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYyMC44aCwgdjI4LjhoCisgICAgICAgIHN0b3JlX3JldiAgICAgICB2MjEuOGgsIHYyOS44aAorICAgICAgICBzdG9yZV9yZXYgICAgICAgdjIyLjhoLCB2MzAuOGgKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYyMy44aCwgdjMxLjhoCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgIzUxMgorLnB1cmdlbSBzdG9yZV9yZXYKKworICAgICAgICAvLyBNb3ZlIHgyIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCwgYW5kIG1vdmUKKyAgICAgICAgLy8gdG8gdGhlIGZpcnN0IG9kZCByb3cKKy5pZmIgXHN1ZmZpeAorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHg5LCBsc2wgIzQKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgeDksIGxzbCAjMgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICMzCisuZW5kaWYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDIsICAjNjQKKworICAgICAgICBtb3ZpICAgICAgICAgICAgdjIuOGgsICAjMAorICAgICAgICAvLyB2MTYgPSBJTigxKSwgdjE3ID0gSU4oMykgLi4uIHYzMSA9IElOKDMxKQorLmlmYiBcc3VmZml4CisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCisgICAgICAgIGxvYWRfY2xlYXIgICAgICBcaSwgeDIsIHg5CisuZW5kcgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX3F1YXJ0ZXIKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTkKKyAgICAgICAgbG9hZF9jbGVhciAgICAgIFxpLCB4MiwgeDkKKy5lbmRyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfaGFsZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgbG9hZF9jbGVhciAgICAgIFxpLCB4MiwgeDkKKy5lbmRyCisuZW5kaWYKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyX29kZFxzdWZmaXgKKworICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjMxLCB2MzAsIHYyOSwgdjI4LCB2MjcsIHYyNiwgdjI1LCB2MjQsIHYyLCB2MworICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjIzLCB2MjIsIHYyMSwgdjIwLCB2MTksIHYxOCwgdjE3LCB2MTYsIHYyLCB2MworCisgICAgICAgIC8vIFN0b3JlIHRoZSByZWdpc3RlcnMgYSwgYiBob3Jpem9udGFsbHksCisgICAgICAgIC8vIGFkZGluZyBpbnRvIHRoZSBvdXRwdXQgZmlyc3QsIGFuZCB0aGUgbWlycm9yZWQsCisgICAgICAgIC8vIHN1YnRyYWN0ZWQgZnJvbSB0aGUgb3V0cHV0LgorLm1hY3JvIHN0b3JlX3JldiBhLCBiCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOGh9LCAgW3gwXQorICAgICAgICByZXY2NCAgICAgICAgICAgdjMuOGgsIFxiCisgICAgICAgIGFkZCAgICAgICAgICAgICB2NC44aCwgdjQuOGgsIFxhCisgICAgICAgIHJldjY0ICAgICAgICAgICB2Mi44aCwgXGEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44aH0sICBbeDBdLCAjMTYKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYzLjE2YiwgdjMuMTZiLCB2My4xNmIsICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuOGh9LCAgW3gwXQorICAgICAgICBleHQgICAgICAgICAgICAgdjIuMTZiLCB2Mi4xNmIsIHYyLjE2YiwgIzgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY1LjhoLCB2NS44aCwgXGIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44aH0sICBbeDBdLCAjMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni44aH0sICBbeDBdCisgICAgICAgIHN1YiAgICAgICAgICAgICB2Ni44aCwgdjYuOGgsIHYzLjhoCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuOGh9LCAgW3gwXSwgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOGh9LCAgW3gwXQorICAgICAgICBzdWIgICAgICAgICAgICAgdjcuOGgsIHY3LjhoLCB2Mi44aAorICAgICAgICBzdDEgICAgICAgICAgICAge3Y3LjhofSwgIFt4MF0sICMxNgorLmVuZG0KKworICAgICAgICBzdG9yZV9yZXYgICAgICAgdjMxLjhoLCB2MjMuOGgKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYzMC44aCwgdjIyLjhoCisgICAgICAgIHN0b3JlX3JldiAgICAgICB2MjkuOGgsIHYyMS44aAorICAgICAgICBzdG9yZV9yZXYgICAgICAgdjI4LjhoLCB2MjAuOGgKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYyNy44aCwgdjE5LjhoCisgICAgICAgIHN0b3JlX3JldiAgICAgICB2MjYuOGgsIHYxOC44aAorICAgICAgICBzdG9yZV9yZXYgICAgICAgdjI1LjhoLCB2MTcuOGgKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIHYyNC44aCwgdjE2LjhoCisucHVyZ2VtIHN0b3JlX3JldgorICAgICAgICBiciAgICAgICAgICAgICAgeDE0CitlbmRmdW5jCisKKy8vIFRoaXMgaXMgbW9zdGx5IHRoZSBzYW1lIGFzIDh4MzJfcGFzczEsIGJ1dCB3aXRob3V0IHRoZSB0cmFuc3Bvc2UsCisvLyBhbmQgdXNlIHRoZSBzb3VyY2UgYXMgdGVtcCBidWZmZXIgYmV0d2VlbiB0aGUgdHdvIGlkY3QgcGFzc2VzLCBhbmQKKy8vIGFkZCBpbnRvIHRoZSBkZXN0aW5hdGlvbi4KKy8vIHgwID0gZHN0CisvLyB4MSA9IGRzdCBzdHJpZGUKKy8vIHgyID0gc3JjICh0ZW1wIGJ1ZmZlcikKKy8vIHg3ID0gbmVnYXRpdmUgZG91YmxlIHRlbXAgYnVmZmVyIHN0cmlkZQorLy8geDkgPSBkb3VibGUgdGVtcCBidWZmZXIgc3RyaWRlCitmdW5jdGlvbiBpZGN0MzJfMWRfOHgzMl9wYXNzMlxzdWZmaXhcKClfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDE0LCB4MzAKKyAgICAgICAgLy8gdjE2ID0gSU4oMCksIHYxNyA9IElOKDIpIC4uLiB2MzEgPSBJTigzMCkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBsb2FkICAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICM0CisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfcXVhcnRlcgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOQorICAgICAgICBsb2FkICAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICMyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfaGFsZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgbG9hZCAgICAgICAgICAgIFxpLCB4MiwgeDkKKy5lbmRyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgeDksIGxzbCAjMworLmVuZGlmCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNlxzdWZmaXgKKworLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICBzdG9yZSAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKworICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHg5LCBsc2wgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDIsICAjNjQKKworICAgICAgICAvLyB2MTYgPSBJTigxKSwgdjE3ID0gSU4oMykgLi4uIHYzMSA9IElOKDMxKQorLmlmYiBcc3VmZml4CisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCisgICAgICAgIGxvYWQgICAgICAgICAgICBcaSwgeDIsIHg5CisuZW5kcgorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHg5LCBsc2wgIzQKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIGxvYWQgICAgICAgICAgICBcaSwgeDIsIHg5CisuZW5kcgorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHg5LCBsc2wgIzIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9oYWxmCisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMworICAgICAgICBsb2FkICAgICAgICAgICAgXGksIHgyLCB4OQorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4OSwgbHNsICMzCisuZW5kaWYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICAjNjQKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyX29kZFxzdWZmaXgKKworLm1hY3JvIGxvYWRfYWNjX3N0b3JlIGEsIGIsIGMsIGQsIG5lZz0wCisuaWYgXG5lZyA9PSAwCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOGh9LCAgW3gyXSwgeDkKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS44aH0sICBbeDJdLCB4OQorICAgICAgICBhZGQgICAgICAgICAgICAgdjQuOGgsIHY0LjhoLCBcYQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjhofSwgIFt4Ml0sIHg5CisgICAgICAgIGFkZCAgICAgICAgICAgICB2NS44aCwgdjUuOGgsIFxiCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOGh9LCAgW3gyXSwgeDkKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY2LjhoLCB2Ni44aCwgXGMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY3LjhoLCB2Ny44aCwgXGQKKy5lbHNlCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOGh9LCAgW3gyXSwgeDcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS44aH0sICBbeDJdLCB4NworICAgICAgICBzdWIgICAgICAgICAgICAgdjQuOGgsIHY0LjhoLCBcYQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y2LjhofSwgIFt4Ml0sIHg3CisgICAgICAgIHN1YiAgICAgICAgICAgICB2NS44aCwgdjUuOGgsIFxiCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuOGh9LCAgW3gyXSwgeDcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHY2LjhoLCB2Ni44aCwgXGMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHY3LjhoLCB2Ny44aCwgXGQKKy5lbmRpZgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxMC44Yn0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djExLjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHY0LjhoLCB2NC44aCwgIzYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi44Yn0sIFt4MF0sIHgxCisgICAgICAgIHNyc2hyICAgICAgICAgICB2NS44aCwgdjUuOGgsICM2CisgICAgICAgIHVhZGR3ICAgICAgICAgICB2NC44aCwgdjQuOGgsIHYxMC44YgorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3JzaHIgICAgICAgICAgIHY2LjhoLCB2Ni44aCwgIzYKKyAgICAgICAgdWFkZHcgICAgICAgICAgIHY1LjhoLCB2NS44aCwgdjExLjhiCisgICAgICAgIHNyc2hyICAgICAgICAgICB2Ny44aCwgdjcuOGgsICM2CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorICAgICAgICB1YWRkdyAgICAgICAgICAgdjYuOGgsIHY2LjhoLCB2Mi44YgorICAgICAgICBzcXh0dW4gICAgICAgICAgdjQuOGIsIHY0LjhoCisgICAgICAgIHVhZGR3ICAgICAgICAgICB2Ny44aCwgdjcuOGgsIHYzLjhiCisgICAgICAgIHNxeHR1biAgICAgICAgICB2NS44YiwgdjUuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44Yn0sIFt4MF0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2Ni44YiwgdjYuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44Yn0sIFt4MF0sIHgxCisgICAgICAgIHNxeHR1biAgICAgICAgICB2Ny44YiwgdjcuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djcuOGJ9LCBbeDBdLCB4MQorLmVuZG0KKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIHYzMS44aCwgdjMwLjhoLCB2MjkuOGgsIHYyOC44aAorICAgICAgICBsb2FkX2FjY19zdG9yZSAgdjI3LjhoLCB2MjYuOGgsIHYyNS44aCwgdjI0LjhoCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICB2MjMuOGgsIHYyMi44aCwgdjIxLjhoLCB2MjAuOGgKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIHYxOS44aCwgdjE4LjhoLCB2MTcuOGgsIHYxNi44aAorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHg5CisgICAgICAgIGxvYWRfYWNjX3N0b3JlICB2MTYuOGgsIHYxNy44aCwgdjE4LjhoLCB2MTkuOGgsIDEKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIHYyMC44aCwgdjIxLjhoLCB2MjIuOGgsIHYyMy44aCwgMQorICAgICAgICBsb2FkX2FjY19zdG9yZSAgdjI0LjhoLCB2MjUuOGgsIHYyNi44aCwgdjI3LjhoLCAxCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICB2MjguOGgsIHYyOS44aCwgdjMwLjhoLCB2MzEuOGgsIDEKKy5wdXJnZW0gbG9hZF9hY2Nfc3RvcmUKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNAorZW5kZnVuYworLmVuZG0KKworaWRjdDMyX2Z1bmNzCitpZGN0MzJfZnVuY3MgX3F1YXJ0ZXIKK2lkY3QzMl9mdW5jcyBfaGFsZgorCitjb25zdCBtaW5fZW9iX2lkY3RfaWRjdF8zMiwgYWxpZ249NAorICAgICAgICAuc2hvcnQgIDAsIDM0LCAxMzUsIDMzNgorZW5kY29uc3QKKworZnVuY3Rpb24gZmZfdnA5X2lkY3RfaWRjdF8zMngzMl9hZGRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzEKKyAgICAgICAgYi5lcSAgICAgICAgICAgIGlkY3QzMngzMl9kY19hZGRfbmVvbgorCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTAsIGlkY3RfY29lZmZzCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNSwgeDMwCisKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwLCAjLTB4MTBdIQorCisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgIzIwNDgKKworICAgICAgICBtb3YgICAgICAgICAgICAgeDQsICB4MAorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICB4MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDYsICB4MgorCisgICAgICAgIC8vIERvdWJsZSBzdHJpZGUgb2YgdGhlIGlucHV0LCBzaW5jZSB3ZSBvbmx5IHJlYWQgZXZlcnkgb3RoZXIgbGluZQorICAgICAgICBtb3YgICAgICAgICAgICAgeDksICAjMTI4CisgICAgICAgIG5lZyAgICAgICAgICAgICB4NywgIHg5CisKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44aCx2MS44aH0sIFt4MTBdLCAjMzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2OC44aCx2OS44aH0sIFt4MTBdCisKKyAgICAgICAgY21wICAgICAgICAgICAgIHczLCAgIzM0CisgICAgICAgIGIubGUgICAgICAgICAgICBpZGN0MzJ4MzJfcXVhcnRlcl9hZGRfbmVvbgorICAgICAgICBjbXAgICAgICAgICAgICAgdzMsICAjMTM1CisgICAgICAgIGIubGUgICAgICAgICAgICBpZGN0MzJ4MzJfaGFsZl9hZGRfbmVvbgorCisgICAgICAgIG1vdnJlbCAgICAgICAgICB4MTIsIG1pbl9lb2JfaWRjdF9pZGN0XzMyLCAyCisKKy5pcnAgaSwgMCwgOCwgMTYsIDI0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHNwLCAgIyhcaSo2NCkKKy5pZiBcaSA+IDAKKyAgICAgICAgbGRyaCAgICAgICAgICAgIHcxLCAgW3gxMl0sICMyCisgICAgICAgIGNtcCAgICAgICAgICAgICB3MywgIHcxCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgICMoMzIgLSBcaSkvNAorICAgICAgICBiLmxlICAgICAgICAgICAgMWYKKy5lbmRpZgorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4NiwgICMoXGkqMikKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QzMl8xZF84eDMyX3Bhc3MxX25lb24KKy5lbmRyCisgICAgICAgIGIgICAgICAgICAgICAgICAzZgorCisxOgorICAgICAgICAvLyBXcml0ZSB6ZXJvcyB0byB0aGUgdGVtcCBidWZmZXIgZm9yIHBhc3MgMgorICAgICAgICBtb3ZpICAgICAgICAgICAgdjE2LjhoLCAgIzAKKyAgICAgICAgbW92aSAgICAgICAgICAgIHYxNy44aCwgICMwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MTguOGgsICAjMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjE5LjhoLCAgIzAKKzI6CisgICAgICAgIHN1YnMgICAgICAgICAgICB4MSwgIHgxLCAgIzEKKy5yZXB0IDQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuOGgsdjE3LjhoLHYxOC44aCx2MTkuOGh9LCAgW3gwXSwgIzY0CisuZW5kcgorICAgICAgICBiLm5lICAgICAgICAgICAgMmIKKzM6CisuaXJwIGksIDAsIDgsIDE2LCAyNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4NCwgICMoXGkpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MSwgIHg1CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHNwLCAgIyhcaSoyKQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyXzFkXzh4MzJfcGFzczJfbmVvbgorLmVuZHIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICMyMDQ4CisKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTAsIGQxMSwgW3NwXSwgMHgxMAorCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTUKK2VuZGZ1bmMKKworLm1hY3JvIGlkY3QzMl9wYXJ0aWFsIHNpemUKK2Z1bmN0aW9uIGlkY3QzMngzMl9cc2l6ZVwoKV9hZGRfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICBzcCwgICMoMCo2NCkKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDYsICAjKDAqMikKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QzMl8xZF84eDMyX3Bhc3MxX1xzaXplXCgpX25lb24KKy5pZmMgXHNpemUsaGFsZgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICBzcCwgICMoOCo2NCkKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDYsICAjKDgqMikKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QzMl8xZF84eDMyX3Bhc3MxX1xzaXplXCgpX25lb24KKy5lbmRpZgorLmlycCBpLCAwLCA4LCAxNiwgMjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDQsICAjKFxpKQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEsICB4NQorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICBzcCwgICMoXGkqMikKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QzMl8xZF84eDMyX3Bhc3MyX1xzaXplXCgpX25lb24KKy5lbmRyCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjMjA0OAorCisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcF0sIDB4MTAKKworICAgICAgICBiciAgICAgICAgICAgICAgeDE1CitlbmRmdW5jCisuZW5kbQorCitpZGN0MzJfcGFydGlhbCBxdWFydGVyCitpZGN0MzJfcGFydGlhbCBoYWxmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FhcmNoNjQvdnA5bHBmXzE2YnBwX25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDlscGZfMTZicHBfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzVmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FhcmNoNjQvdnA5bHBmXzE2YnBwX25lb24uUwpAQCAtMCwwICsxLDg3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMiCisjaW5jbHVkZSAibmVvbi5TIgorCisKKy5tYWNybyB0cmFuc3Bvc2VfNHg4SCByMCwgcjEsIHIyLCByMywgdDQsIHQ1LCB0NiwgdDcKKyAgICAgICAgdHJuMSAgICAgICAgICAgIFx0NFwoKS44aCwgIFxyMFwoKS44aCwgIFxyMVwoKS44aAorICAgICAgICB0cm4yICAgICAgICAgICAgXHQ1XCgpLjhoLCAgXHIwXCgpLjhoLCAgXHIxXCgpLjhoCisgICAgICAgIHRybjEgICAgICAgICAgICBcdDZcKCkuOGgsICBccjJcKCkuOGgsICBccjNcKCkuOGgKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFx0N1woKS44aCwgIFxyMlwoKS44aCwgIFxyM1woKS44aAorCisgICAgICAgIHRybjEgICAgICAgICAgICBccjBcKCkuNHMsICBcdDRcKCkuNHMsICBcdDZcKCkuNHMKKyAgICAgICAgdHJuMiAgICAgICAgICAgIFxyMlwoKS40cywgIFx0NFwoKS40cywgIFx0NlwoKS40cworICAgICAgICB0cm4xICAgICAgICAgICAgXHIxXCgpLjRzLCAgXHQ1XCgpLjRzLCAgXHQ3XCgpLjRzCisgICAgICAgIHRybjIgICAgICAgICAgICBccjNcKCkuNHMsICBcdDVcKCkuNHMsICBcdDdcKCkuNHMKKy5lbmRtCisKKy8vIFRoZSBpbnB1dCB0byBhbmQgb3V0cHV0IGZyb20gdGhpcyBtYWNybyBpcyBpbiB0aGUgcmVnaXN0ZXJzIHYxNi12MzEsCisvLyBhbmQgdjAtdjcgYXJlIHVzZWQgYXMgc2NyYXRjaCByZWdpc3RlcnMuCisvLyBwNyA9IHYxNiAuLiBwMyA9IHYyMCwgcDAgPSB2MjMsIHEwID0gdjI0LCBxMyA9IHYyNywgcTcgPSB2MzEKKy8vIERlcGVuZGluZyBvbiB0aGUgd2lkdGggb2YgdGhlIGxvb3AgZmlsdGVyLCB3ZSBlaXRoZXIgdXNlIHYxNi12MTkKKy8vIGFuZCB2MjgtdjMxIGFzIHRlbXAgcmVnaXN0ZXJzLCBvciB2OC12MTUuCisubWFjcm8gbG9vcF9maWx0ZXIgd2QsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIHRtcDgKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYwLjhoLCAgdzIgICAgICAgICAgICAgICAgICAgLy8gRQorICAgICAgICBkdXAgICAgICAgICAgICAgdjIuOGgsICB3MyAgICAgICAgICAgICAgICAgICAvLyBJCisgICAgICAgIGR1cCAgICAgICAgICAgICB2My44aCwgIHc0ICAgICAgICAgICAgICAgICAgIC8vIEgKKworICAgICAgICB1YWJkICAgICAgICAgICAgdjQuOGgsICB2MjAuOGgsIHYyMS44aCAgICAgICAvLyBhYnMocDMgLSBwMikKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY1LjhoLCAgdjIxLjhoLCB2MjIuOGggICAgICAgLy8gYWJzKHAyIC0gcDEpCisgICAgICAgIHVhYmQgICAgICAgICAgICB2Ni44aCwgIHYyMi44aCwgdjIzLjhoICAgICAgIC8vIGFicyhwMSAtIHAwKQorICAgICAgICB1YWJkICAgICAgICAgICAgdjcuOGgsICB2MjQuOGgsIHYyNS44aCAgICAgICAvLyBhYnMocTAgLSBxMSkKKyAgICAgICAgdWFiZCAgICAgICAgICAgIFx0bXAxXCgpLjhoLCAgdjI1LjhoLCB2MjYuOGggLy8gYWJzKHExIC0gcTIpCisgICAgICAgIHVhYmQgICAgICAgICAgICBcdG1wMlwoKS44aCwgIHYyNi44aCwgdjI3LjhoIC8vIGFicyhxMiAtIHEzKQorICAgICAgICB1bWF4ICAgICAgICAgICAgdjQuOGgsICB2NC44aCwgIHY1LjhoCisgICAgICAgIHVtYXggICAgICAgICAgICB2NS44aCwgIHY2LjhoLCAgdjcuOGgKKyAgICAgICAgdW1heCAgICAgICAgICAgIFx0bXAxXCgpLjhoLCAgXHRtcDFcKCkuOGgsIFx0bXAyXCgpLjhoCisgICAgICAgIHVhYmQgICAgICAgICAgICB2Ni44aCwgIHYyMy44aCwgdjI0LjhoICAgICAgIC8vIGFicyhwMCAtIHEwKQorICAgICAgICB1bWF4ICAgICAgICAgICAgdjQuOGgsICB2NC44aCwgIHY1LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2Ni44aCwgIHY2LjhoLCAgdjYuOGggICAgICAgIC8vIGFicyhwMCAtIHEwKSAqIDIKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY1LjhoLCAgdjIyLjhoLCB2MjUuOGggICAgICAgLy8gYWJzKHAxIC0gcTEpCisgICAgICAgIHVtYXggICAgICAgICAgICB2NC44aCwgIHY0LjhoLCAgXHRtcDFcKCkuOGggIC8vIG1heChhYnMocDMgLSBwMiksIC4uLiwgYWJzKHEyIC0gcTMpKQorICAgICAgICB1c2hyICAgICAgICAgICAgdjUuOGgsICB2NS44aCwgICMxCisgICAgICAgIGNtaHMgICAgICAgICAgICB2NC44aCwgIHYyLjhoLCAgdjQuOGggICAgICAgIC8vIG1heChhYnMoKSkgPD0gSQorICAgICAgICBhZGQgICAgICAgICAgICAgdjYuOGgsICB2Ni44aCwgIHY1LjhoICAgICAgICAvLyBhYnMocDAgLSBxMCkgKiAyICsgYWJzKHAxIC0gcTEpID4+IDEKKyAgICAgICAgY21ocyAgICAgICAgICAgIHY2LjhoLCAgdjAuOGgsICB2Ni44aAorICAgICAgICBhbmQgICAgICAgICAgICAgdjQuMTZiLCB2NC4xNmIsIHY2LjE2YiAgICAgICAvLyBmbQorCisgICAgICAgIC8vIElmIG5vIHBpeGVscyBuZWVkIGZpbHRlcmluZywganVzdCBleGl0IGFzIHNvb24gYXMgcG9zc2libGUKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgdjQuZFswXQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCB2NC5kWzFdCisgICAgICAgIGFkZHMgICAgICAgICAgICB4MTEsIHgxMSwgeDEyCisgICAgICAgIGIubmUgICAgICAgICAgICAxZgorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCisxOgorCisuaWYgXHdkID49IDgKKyAgICAgICAgZHVwICAgICAgICAgICAgIHYwLjhoLCAgdzUKKworICAgICAgICB1YWJkICAgICAgICAgICAgdjYuOGgsICB2MjAuOGgsIHYyMy44aCAgICAgICAvLyBhYnMocDMgLSBwMCkKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYyLjhoLCAgdjIxLjhoLCB2MjMuOGggICAgICAgLy8gYWJzKHAyIC0gcDApCisgICAgICAgIHVhYmQgICAgICAgICAgICB2MS44aCwgIHYyMi44aCwgdjIzLjhoICAgICAgIC8vIGFicyhwMSAtIHAwKQorICAgICAgICB1YWJkICAgICAgICAgICAgXHRtcDFcKCkuOGgsICB2MjUuOGgsIHYyNC44aCAvLyBhYnMocTEgLSBxMCkKKyAgICAgICAgdWFiZCAgICAgICAgICAgIFx0bXAyXCgpLjhoLCAgdjI2LjhoLCB2MjQuOGggLy8gYWJzKHEyIC0gcTApCisgICAgICAgIHVhYmQgICAgICAgICAgICBcdG1wM1woKS44aCwgIHYyNy44aCwgdjI0LjhoIC8vIGFicyhxMyAtIHEwKQorICAgICAgICB1bWF4ICAgICAgICAgICAgdjYuOGgsICB2Ni44aCwgIHYyLjhoCisgICAgICAgIHVtYXggICAgICAgICAgICB2MS44aCwgIHYxLjhoLCAgXHRtcDFcKCkuOGgKKyAgICAgICAgdW1heCAgICAgICAgICAgIFx0bXAyXCgpLjhoLCAgXHRtcDJcKCkuOGgsICBcdG1wM1woKS44aAorLmlmIFx3ZCA9PSAxNgorICAgICAgICB1YWJkICAgICAgICAgICAgdjcuOGgsICB2MTYuOGgsIHYyMy44aCAgICAgICAvLyBhYnMocDcgLSBwMCkKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY2LjhoLCAgdjYuOGgsICB2MS44aAorICAgICAgICB1YWJkICAgICAgICAgICAgdjIuOGgsICB2MTcuOGgsIHYyMy44aCAgICAgICAvLyBhYnMocDYgLSBwMCkKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY2LjhoLCAgdjYuOGgsICBcdG1wMlwoKS44aAorICAgICAgICB1YWJkICAgICAgICAgICAgdjEuOGgsICB2MTguOGgsIHYyMy44aCAgICAgICAvLyBhYnMocDUgLSBwMCkKKyAgICAgICAgY21ocyAgICAgICAgICAgIHY2LjhoLCAgdjAuOGgsICB2Ni44aCAgICAgICAgLy8gZmxhdDhpbgorICAgICAgICB1YWJkICAgICAgICAgICAgdjguOGgsICB2MTkuOGgsIHYyMy44aCAgICAgICAvLyBhYnMocDQgLSBwMCkKKyAgICAgICAgYW5kICAgICAgICAgICAgIHY2LjE2YiwgdjYuMTZiLCB2NC4xNmIgICAgICAgLy8gZmxhdDhpbiAmJiBmbQorICAgICAgICB1YWJkICAgICAgICAgICAgdjkuOGgsICB2MjguOGgsIHYyNC44aCAgICAgICAvLyBhYnMocTQgLSBxMCkKKyAgICAgICAgYmljICAgICAgICAgICAgIHY0LjE2YiwgdjQuMTZiLCB2Ni4xNmIgICAgICAgLy8gZm0gJiYgIWZsYXQ4aW4KKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYxMC44aCwgdjI5LjhoLCB2MjQuOGggICAgICAgLy8gYWJzKHE1IC0gcTApCisgICAgICAgIHVhYmQgICAgICAgICAgICB2MTEuOGgsIHYzMC44aCwgdjI0LjhoICAgICAgIC8vIGFicyhxNiAtIHEwKQorICAgICAgICB1YWJkICAgICAgICAgICAgdjEyLjhoLCB2MzEuOGgsIHYyNC44aCAgICAgICAvLyBhYnMocTcgLSBxMCkKKworICAgICAgICB1bWF4ICAgICAgICAgICAgdjcuOGgsICB2Ny44aCwgIHYyLjhoCisgICAgICAgIHVtYXggICAgICAgICAgICB2MS44aCwgIHYxLjhoLCAgdjguOGgKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY5LjhoLCAgdjkuOGgsICB2MTAuOGgKKyAgICAgICAgdW1heCAgICAgICAgICAgIHYxMS44aCwgdjExLjhoLCB2MTIuOGgKKyAgICAgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGNhbGN1bGF0aW9uIG9mIGZsYXQ4b3V0IGlzIGludGVybGVhdmVkIGJlbG93CisuZWxzZQorICAgICAgICAvLyBUaGUgcmVzdCBvZiB0aGUgY2FsY3VsYXRpb24gb2YgZmxhdDhpbiBpcyBpbnRlcmxlYXZlZCBiZWxvdworLmVuZGlmCisuZW5kaWYKKworICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG5vcm1hbCBpbm5lciBsb29wIGZpbHRlciBmb3IgMiBvciA0IHBpeGVscworICAgICAgICB1YWJkICAgICAgICAgICAgdjUuOGgsICB2MjIuOGgsIHYyMy44aCAgICAgICAgICAgICAgICAgIC8vIGFicyhwMSAtIHAwKQorLmlmIFx3ZCA9PSAxNgorICAgICAgICB1bWF4ICAgICAgICAgICAgdjcuOGgsICB2Ny44aCwgIHYxLjhoCisgICAgICAgIHVtYXggICAgICAgICAgICB2OS44aCwgIHY5LjhoLCAgdjExLjhoCisuZWxzZWlmIFx3ZCA9PSA4CisgICAgICAgIHVtYXggICAgICAgICAgICB2Ni44aCwgIHY2LjhoLCAgdjEuOGgKKy5lbmRpZgorICAgICAgICB1YWJkICAgICAgICAgICAgdjEuOGgsICB2MjUuOGgsIHYyNC44aCAgICAgICAgICAgICAgICAgIC8vIGFicyhxMSAtIHEwKQorLmlmIFx3ZCA9PSAxNgorICAgICAgICB1bWF4ICAgICAgICAgICAgdjcuOGgsICB2Ny44aCwgIHY5LjhoCisuZWxzZWlmIFx3ZCA9PSA4CisgICAgICAgIHVtYXggICAgICAgICAgICB2Ni44aCwgIHY2LjhoLCAgXHRtcDJcKCkuOGgKKy5lbmRpZgorICAgICAgICBkdXAgICAgICAgICAgICAgXHRtcDJcKCkuOGgsICB3NiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlZnQgc2hpZnQgZm9yIHNhdHVyYXRpb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIFx0bXAxXCgpLjhoLCAgdjIyLjhoLCAgdjI1LjhoICAgICAgICAgICAvLyBwMSAtIHExCisgICAgICAgIG5lZyAgICAgICAgICAgICBcdG1wNlwoKS44aCwgIFx0bXAyXCgpLjhoICAgICAgICAgICAgICAgLy8gbmVnYXRpdmUgbGVmdCBzaGlmdCBhZnRlciBzYXR1cmF0aW9uCisgICAgICAgIHVtYXggICAgICAgICAgICB2NS44aCwgIHY1LjhoLCAgdjEuOGggICAgICAgICAgICAgICAgICAgLy8gbWF4KGFicyhwMSAtIHAwKSwgYWJzKHExIC0gcTApKQorICAgICAgICBzdWIgICAgICAgICAgICAgXHRtcDNcKCkuOGgsICB2MjQuOGgsICB2MjMuOGggICAgICAgICAgIC8vIHEwIC0gcDAKKyAgICAgICAgbW92aSAgICAgICAgICAgIFx0bXA1XCgpLjhoLCAgIzMKKy5pZiBcd2QgPT0gOAorICAgICAgICBjbWhzICAgICAgICAgICAgdjYuOGgsICB2MC44aCwgIHY2LjhoICAgICAgICAgICAgICAgICAgIC8vIGZsYXQ4aW4KKy5lbmRpZgorICAgICAgICBjbWhzICAgICAgICAgICAgdjUuOGgsICB2My44aCwgIHY1LjhoICAgICAgICAgICAgICAgICAgIC8vICFoZXYKKy5pZiBcd2QgPT0gOAorICAgICAgICBhbmQgICAgICAgICAgICAgdjYuMTZiLCB2Ni4xNmIsIHY0LjE2YiAgICAgICAgICAgICAgICAgIC8vIGZsYXQ4aW4gJiYgZm0KKy5lbmRpZgorICAgICAgICBzcXNobCAgICAgICAgICAgXHRtcDFcKCkuOGgsICBcdG1wMVwoKS44aCwgIFx0bXAyXCgpLjhoCisuaWYgXHdkID09IDE2CisgICAgICAgIGNtaHMgICAgICAgICAgICB2Ny44aCwgIHYwLjhoLCAgdjcuOGggICAgICAgICAgICAgICAgICAgLy8gZmxhdDhvdXQKKy5lbHNlaWYgXHdkID09IDgKKyAgICAgICAgYmljICAgICAgICAgICAgIHY0LjE2YiwgdjQuMTZiLCB2Ni4xNmIgICAgICAgICAgICAgICAgICAvLyBmbSAmJiAhZmxhdDhpbgorLmVuZGlmCisgICAgICAgIGFuZCAgICAgICAgICAgICB2NS4xNmIsICB2NS4xNmIsICB2NC4xNmIgICAgICAgICAgICAgICAgLy8gIWhldiAmJiBmbSAmJiAhZmxhdDhpbgorLmlmIFx3ZCA9PSAxNgorICAgICAgICBhbmQgICAgICAgICAgICAgdjcuMTZiLCB2Ny4xNmIsIHY2LjE2YiAgICAgICAgICAgICAgICAgIC8vIGZsYXQ4b3V0ICYmIGZsYXQ4aW4gJiYgZm0KKy5lbmRpZgorICAgICAgICBzc2hsICAgICAgICAgICAgXHRtcDFcKCkuOGgsICBcdG1wMVwoKS44aCwgIFx0bXA2XCgpLjhoIC8vIGF2X2NsaXBfaW50MnAocDEgLSBxMSwgQklUX0RFUFRIIC0gMSkKKworICAgICAgICBtdWwgICAgICAgICAgICAgXHRtcDNcKCkuOGgsICBcdG1wM1woKS44aCwgIFx0bXA1XCgpLjhoIC8vIDMgKiAocTAgLSBwMCkKKyAgICAgICAgYmljICAgICAgICAgICAgIFx0bXAxXCgpLjE2YiwgXHRtcDFcKCkuMTZiLCB2NS4xNmIgICAgICAvLyBpZiAoIWhldikgYXZfY2xpcF9pbnQ4ID0gMAorICAgICAgICBtb3ZpICAgICAgICAgICAgdjIuOGgsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgXHRtcDNcKCkuOGgsICBcdG1wM1woKS44aCwgIFx0bXAxXCgpLjhoIC8vIDMgKiAocTAgLSBwMCkgWysgYXZfY2xpcF9pbnQ4KHAxIC0gcTEpXQorICAgICAgICBtb3ZpICAgICAgICAgICAgdjMuOGgsICAjMworICAgICAgICBzcXNobCAgICAgICAgICAgXHRtcDFcKCkuOGgsICBcdG1wM1woKS44aCwgIFx0bXAyXCgpLjhoCisgICAgICAgIG1vdmkgICAgICAgICAgICBcdG1wNVwoKS44aCwgICMwCisgICAgICAgIHNzaGwgICAgICAgICAgICBcdG1wMVwoKS44aCwgIFx0bXAxXCgpLjhoLCAgXHRtcDZcKCkuOGggLy8gYXZfY2xpcF9pbnQycCgzICogKHEwIC0gcDApIFsrIGF2X2NsaXBfaW50MnAocDEgLSBxMSldLCBCSVRfREVQVEggLSAxKSA9IGYKKyAgICAgICAgZHVwICAgICAgICAgICAgIFx0bXA2XCgpLjhoLCAgdzcgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXggcGl4ZWwgdmFsdWUKKy5pZiBcd2QgPT0gMTYKKyAgICAgICAgYmljICAgICAgICAgICAgIHY2LjE2YiwgdjYuMTZiLCB2Ny4xNmIgICAgICAgICAgICAgICAgICAvLyBmbSAmJiBmbGF0OGluICYmICFmbGF0OG91dAorLmVuZGlmCisKKyAgICAgICAgdXNociAgICAgICAgICAgIFx0bXAyXCgpLjhoLCAgXHRtcDZcKCkuOGgsICAjMSAgICAgICAgICAvLyAoMSA8PCAoQklUX0RFUFRIIC0gMSkpIC0gMQorCisgICAgICAgIGFkZCAgICAgICAgICAgICBcdG1wM1woKS44aCwgIFx0bXAxXCgpLjhoLCAgdjIuOGggICAgICAgLy8gZiArIDQKKyAgICAgICAgYWRkICAgICAgICAgICAgIFx0bXA0XCgpLjhoLCAgXHRtcDFcKCkuOGgsICB2My44aCAgICAgICAvLyBmICsgMworICAgICAgICBzbWluICAgICAgICAgICAgXHRtcDNcKCkuOGgsICBcdG1wM1woKS44aCwgIFx0bXAyXCgpLjhoIC8vIEZGTUlOKGYgKyA0LCAoMSA8PCAoQklUX0RFUFRIIC0gMSkpIC0gMSkKKyAgICAgICAgc21pbiAgICAgICAgICAgIFx0bXA0XCgpLjhoLCAgXHRtcDRcKCkuOGgsICBcdG1wMlwoKS44aCAvLyBGRk1JTihmICsgMywgKDEgPDwgKEJJVF9ERVBUSCAtIDEpKSAtIDEpCisgICAgICAgIHNzaHIgICAgICAgICAgICBcdG1wM1woKS44aCwgIFx0bXAzXCgpLjhoLCAgIzMgICAgICAgICAgLy8gZjEKKyAgICAgICAgc3NociAgICAgICAgICAgIFx0bXA0XCgpLjhoLCAgXHRtcDRcKCkuOGgsICAjMyAgICAgICAgICAvLyBmMgorCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgICB2MjMuOGgsICBcdG1wNFwoKS44aCAgICAgICAgICAgLy8gcDAgKyBmMgorICAgICAgICBzdWIgICAgICAgICAgICAgdjIuOGgsICAgdjI0LjhoLCAgXHRtcDNcKCkuOGggICAgICAgICAgIC8vIHEwIC0gZjEKKyAgICAgICAgc21pbiAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIFx0bXA2XCgpLjhoCisgICAgICAgIHNtaW4gICAgICAgICAgICB2Mi44aCwgICB2Mi44aCwgICBcdG1wNlwoKS44aAorICAgICAgICBzcnNociAgICAgICAgICAgXHRtcDNcKCkuOGgsIFx0bXAzXCgpLjhoLCAjMSAgICAgICAgICAgIC8vIGYgPSAoZjEgKyAxKSA+PiAxCisgICAgICAgIHNtYXggICAgICAgICAgICB2MC44aCwgICB2MC44aCwgICBcdG1wNVwoKS44aCAgICAgICAgICAgLy8gb3V0IHAwCisgICAgICAgIHNtYXggICAgICAgICAgICB2Mi44aCwgICB2Mi44aCwgICBcdG1wNVwoKS44aCAgICAgICAgICAgLy8gb3V0IHEwCisgICAgICAgIGJpdCAgICAgICAgICAgICB2MjMuMTZiLCB2MC4xNmIsICB2NC4xNmIgICAgICAgICAgICAgICAgLy8gaWYgKGZtICYmICFmbGF0OGluKQorICAgICAgICBiaXQgICAgICAgICAgICAgdjI0LjE2YiwgdjIuMTZiLCAgdjQuMTZiCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgdjIyLjhoLCAgXHRtcDNcKCkuOGggICAgICAgICAgICAvLyBwMSArIGYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYyLjhoLCAgdjI1LjhoLCAgXHRtcDNcKCkuOGggICAgICAgICAgICAvLyBxMSAtIGYKKy5pZiBcd2QgPj0gOAorICAgICAgICBtb3YgICAgICAgICAgICAgeDExLCB2Ni5kWzBdCisuZW5kaWYKKyAgICAgICAgc21pbiAgICAgICAgICAgIHYwLjhoLCAgdjAuOGgsICBcdG1wNlwoKS44aAorICAgICAgICBzbWluICAgICAgICAgICAgdjIuOGgsICB2Mi44aCwgIFx0bXA2XCgpLjhoCisuaWYgXHdkID49IDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMiwgdjYuZFsxXQorLmVuZGlmCisgICAgICAgIHNtYXggICAgICAgICAgICB2MC44aCwgIHYwLjhoLCAgXHRtcDVcKCkuOGggICAgICAgICAgICAgLy8gb3V0IHAxCisgICAgICAgIHNtYXggICAgICAgICAgICB2Mi44aCwgIHYyLjhoLCAgXHRtcDVcKCkuOGggICAgICAgICAgICAgLy8gb3V0IHExCisuaWYgXHdkID49IDgKKyAgICAgICAgYWRkcyAgICAgICAgICAgIHgxMSwgeDExLCB4MTIKKy5lbmRpZgorICAgICAgICBiaXQgICAgICAgICAgICAgdjIyLjE2YiwgdjAuMTZiLCAgdjUuMTZiICAgICAgICAgICAgICAgIC8vIGlmICghaGV2ICYmIGZtICYmICFmbGF0OGluKQorICAgICAgICBiaXQgICAgICAgICAgICAgdjI1LjE2YiwgdjIuMTZiLCAgdjUuMTZiCisKKyAgICAgICAgLy8gSWYgbm8gcGl4ZWxzIG5lZWQgZmxhdDhpbiwganVtcCB0byBmbGF0OG91dAorICAgICAgICAvLyAob3IgdG8gYSB3cml0ZW91dCBvZiB0aGUgaW5uZXIgNCBwaXhlbHMsIGZvciB3ZD04KQorLmlmIFx3ZCA+PSA4CisuaWYgXHdkID09IDE2CisgICAgICAgIGIuZXEgICAgICAgICAgICA2ZgorLmVsc2UKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFmCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTMKKzE6CisuZW5kaWYKKworICAgICAgICAvLyBmbGF0OGluCisgICAgICAgIGFkZCAgICAgICAgICAgICBcdG1wMVwoKS44aCwgdjIwLjhoLCB2MjEuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIFx0bXAzXCgpLjhoLCB2MjIuOGgsIHYyNS44aAorICAgICAgICBhZGQgICAgICAgICAgICAgXHRtcDVcKCkuOGgsIHYyMC44aCwgdjIyLjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICBcdG1wN1woKS44aCwgdjIzLjhoLCB2MjYuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgXHRtcDFcKCkuOGgsIFx0bXAxXCgpLjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgIHYwLjhoLCAgdjIzLjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgIHYwLjhoLCAgdjI0LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgIHYwLjhoLCAgXHRtcDVcKCkuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIFx0bXAzXCgpLjhoLCBcdG1wM1woKS44aCwgXHRtcDFcKCkuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIFx0bXA3XCgpLjhoLCBcdG1wN1woKS44aCwgXHRtcDVcKCkuOGgKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHYyLjhoLCAgdjAuOGgsICAjMyAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgcDIKKworICAgICAgICBhZGQgICAgICAgICAgICAgdjAuOGgsICB2MC44aCwgIFx0bXAzXCgpLjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICBcdG1wMVwoKS44aCwgdjIwLjhoLCAgdjIzLjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICBcdG1wM1woKS44aCwgdjI0LjhoLCAgdjI3LjhoCisgICAgICAgIHVyc2hyICAgICAgICAgICB2My44aCwgIHYwLjhoLCAgIzMgICAgICAgICAgICAgICAgICAgICAgLy8gb3V0IHAxCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgdjAuOGgsICBcdG1wN1woKS44aAorICAgICAgICBzdWIgICAgICAgICAgICAgXHRtcDNcKCkuOGgsIFx0bXAzXCgpLjhoLCBcdG1wMVwoKS44aAorICAgICAgICBhZGQgICAgICAgICAgICAgXHRtcDVcKCkuOGgsIHYyMS44aCwgIHYyNC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgXHRtcDdcKCkuOGgsIHYyNS44aCwgIHYyNy44aAorICAgICAgICB1cnNociAgICAgICAgICAgdjQuOGgsICB2MC44aCwgICMzICAgICAgICAgICAgICAgICAgICAgIC8vIG91dCBwMAorCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgIHYwLjhoLCAgXHRtcDNcKCkuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIFx0bXA3XCgpLjhoLCBcdG1wN1woKS44aCwgXHRtcDVcKCkuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIFx0bXAxXCgpLjhoLCB2MjIuOGgsICB2MjUuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIFx0bXAzXCgpLjhoLCB2MjYuOGgsICB2MjcuOGgKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHY1LjhoLCAgdjAuOGgsICAjMyAgICAgICAgICAgICAgICAgICAgICAvLyBvdXQgcTAKKworICAgICAgICBhZGQgICAgICAgICAgICAgdjAuOGgsICB2MC44aCwgIFx0bXA3XCgpLjhoCisgICAgICAgIHN1YiAgICAgICAgICAgICBcdG1wM1woKS44aCwgXHRtcDNcKCkuOGgsIFx0bXAxXCgpLjhoCisgICAgICAgIHVyc2hyICAgICAgICAgICBcdG1wNVwoKS44aCwgdjAuOGgsICAjMyAgICAgICAgICAgICAgICAgLy8gb3V0IHExCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgdjAuOGgsICBcdG1wM1woKS44aAorICAgICAgICAvLyBUaGUgb3V0cHV0IGhlcmUgaXMgd3JpdHRlbiBiYWNrIGludG8gdGhlIGlucHV0IHJlZ2lzdGVycy4gVGhpcyBkb2Vzbid0CisgICAgICAgIC8vIG1hdHRlciBmb3IgdGhlIGZsYXQ4cGFydCBiZWxvdywgc2luY2Ugd2Ugb25seSB1cGRhdGUgdGhvc2UgcGl4ZWxzCisgICAgICAgIC8vIHdoaWNoIHdvbid0IGJlIHRvdWNoZWQgYmVsb3cuCisgICAgICAgIGJpdCAgICAgICAgICAgICB2MjEuMTZiLCB2Mi4xNmIsICB2Ni4xNmIKKyAgICAgICAgYml0ICAgICAgICAgICAgIHYyMi4xNmIsIHYzLjE2YiwgIHY2LjE2YgorICAgICAgICBiaXQgICAgICAgICAgICAgdjIzLjE2YiwgdjQuMTZiLCAgdjYuMTZiCisgICAgICAgIHVyc2hyICAgICAgICAgICBcdG1wNlwoKS44aCwgIHYwLjhoLCAgIzMgICAgICAgICAgICAgICAgLy8gb3V0IHEyCisgICAgICAgIGJpdCAgICAgICAgICAgICB2MjQuMTZiLCB2NS4xNmIsICB2Ni4xNmIKKyAgICAgICAgYml0ICAgICAgICAgICAgIHYyNS4xNmIsIFx0bXA1XCgpLjE2YiwgIHY2LjE2YgorICAgICAgICBiaXQgICAgICAgICAgICAgdjI2LjE2YiwgXHRtcDZcKCkuMTZiLCAgdjYuMTZiCisuZW5kaWYKKy5pZiBcd2QgPT0gMTYKKzY6CisgICAgICAgIG9yciAgICAgICAgICAgICB2Mi4xNmIsICB2Ni4xNmIsICB2Ny4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgdjIuZFswXQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCB2Mi5kWzFdCisgICAgICAgIGFkZHMgICAgICAgICAgICB4MTEsIHgxMSwgeDEyCisgICAgICAgIGIubmUgICAgICAgICAgICAxZgorICAgICAgICAvLyBJZiBubyBwaXhlbHMgbmVlZGVkIGZsYXQ4aW4gbm9yIGZsYXQ4b3V0LCBqdW1wIHRvIGEKKyAgICAgICAgLy8gd3JpdGVvdXQgb2YgdGhlIGlubmVyIDQgcGl4ZWxzCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTQKKzE6CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgdjcuZFswXQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEyLCB2Ny5kWzFdCisgICAgICAgIGFkZHMgICAgICAgICAgICB4MTEsIHgxMSwgeDEyCisgICAgICAgIGIubmUgICAgICAgICAgICAxZgorICAgICAgICAvLyBJZiBubyBwaXhlbHMgbmVlZCBmbGF0OG91dCwganVtcCB0byBhIHdyaXRlb3V0IG9mIHRoZSBpbm5lciA2IHBpeGVscworICAgICAgICBiciAgICAgICAgICAgICAgeDE1CisKKzE6CisgICAgICAgIC8vIGZsYXQ4b3V0CisgICAgICAgIC8vIFRoaXMgd3JpdGVzIGFsbCBvdXRwdXRzIGludG8gdjItdjE3IChza2lwcGluZyB2NiBhbmQgdjE2KS4KKyAgICAgICAgLy8gSWYgdGhpcyBwYXJ0IGlzIHNraXBwZWQsIHRoZSBvdXRwdXQgaXMgcmVhZCBmcm9tIHYyMS12MjYgKHdoaWNoIGlzIHRoZSBpbnB1dAorICAgICAgICAvLyB0byB0aGlzIHNlY3Rpb24pLgorICAgICAgICBzaGwgICAgICAgICAgICAgdjAuOGgsICAgdjE2LjhoLCAgIzMgICAgIC8vIDggKiB2MTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYxNi44aCAvLyA3ICogdjE2CisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgICB2MC44aCwgICB2MTcuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY4LjhoLCAgIHYxNy44aCwgIHYxOC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEwLjhoLCAgdjE5LjhoLCAgdjIwLjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgICB2MC44aCwgICB2OC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjguOGgsICAgdjE2LjhoLCAgdjE3LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTIuOGgsICB2MjEuOGgsICB2MjIuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYxMC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEwLjhoLCAgdjE4LjhoLCAgdjI1LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTQuOGgsICB2MjMuOGgsICB2MjQuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxMC44aCwgIHYxMC44aCwgIHY4LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgICB2MC44aCwgICB2MTIuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYxNC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEyLjhoLCAgdjE2LjhoLCAgdjE4LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTQuOGgsICB2MTkuOGgsICB2MjYuOGgKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHYyLjhoLCAgIHYwLjhoLCAgICM0CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYxMC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjguOGgsICAgdjE2LjhoLCAgdjE5LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTAuOGgsICB2MjAuOGgsICB2MjcuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxNC44aCwgIHYxNC44aCwgIHYxMi44aAorICAgICAgICBiaWYgICAgICAgICAgICAgdjIuMTZiLCAgdjE3LjE2YiwgdjcuMTZiCisgICAgICAgIHVyc2hyICAgICAgICAgICB2My44aCAsICB2MC44aCwgICAjNAorCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgICB2MC44aCwgICB2MTQuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxMi44aCwgIHYxNi44aCwgIHYyMC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjE0LjhoLCAgdjIxLjhoLCAgdjI4LjhoCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTAuOGgsICB2MTAuOGgsICB2OC44aAorICAgICAgICBiaWYgICAgICAgICAgICAgdjMuMTZiLCAgdjE4LjE2YiwgdjcuMTZiCisgICAgICAgIHVyc2hyICAgICAgICAgICB2NC44aCwgICB2MC44aCwgICAjNAorCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgICB2MC44aCwgICB2MTAuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHY4LjhoLCAgIHYxNi44aCwgIHYyMS44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEwLjhoLCAgdjIyLjhoLCAgdjI5LjhoCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTQuOGgsICB2MTQuOGgsICB2MTIuOGgKKyAgICAgICAgYmlmICAgICAgICAgICAgIHY0LjE2YiwgIHYxOS4xNmIsIHY3LjE2YgorICAgICAgICB1cnNociAgICAgICAgICAgdjUuOGgsICAgdjAuOGgsICAgIzQKKworICAgICAgICBhZGQgICAgICAgICAgICAgdjAuOGgsICAgdjAuOGgsICAgdjE0LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTIuOGgsICB2MTYuOGgsICB2MjIuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNC44aCwgIHYyMy44aCwgIHYzMC44aAorICAgICAgICBzdWIgICAgICAgICAgICAgdjEwLjhoLCAgdjEwLjhoLCAgdjguOGgKKyAgICAgICAgYmlmICAgICAgICAgICAgIHY1LjE2YiwgIHYyMC4xNmIsIHY3LjE2YgorICAgICAgICB1cnNociAgICAgICAgICAgdjYuOGgsICAgdjAuOGgsICAgIzQKKworICAgICAgICBhZGQgICAgICAgICAgICAgdjAuOGgsICAgdjAuOGgsICAgdjEwLjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTAuOGgsICB2MTYuOGgsICB2MjMuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxNC44aCwgIHYxNC44aCwgIHYxMi44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEyLjhoLCAgdjI0LjhoLCAgdjMxLjhoCisgICAgICAgIGJpZiAgICAgICAgICAgICB2Ni4xNmIsICB2MjEuMTZiLCB2Ny4xNmIKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHY4LjhoLCAgIHYwLjhoLCAgICM0CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYxNC44aAorICAgICAgICBzdWIgICAgICAgICAgICAgdjEwLjhoLCAgdjEyLjhoLCAgdjEwLjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTIuOGgsICB2MTcuOGgsICB2MjQuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxNC44aCwgIHYyNS44aCwgIHYzMS44aAorICAgICAgICBiaWYgICAgICAgICAgICAgdjguMTZiLCAgdjIyLjE2YiwgdjcuMTZiCisgICAgICAgIHVyc2hyICAgICAgICAgICB2OS44aCwgICB2MC44aCwgICAjNAorCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MC44aCwgICB2MC44aCwgICB2MTAuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxNC44aCwgIHYxNC44aCwgIHYxMi44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEyLjhoLCAgdjI2LjhoLCAgdjMxLjhoCisgICAgICAgIGJpZiAgICAgICAgICAgICB2OS4xNmIsICB2MjMuMTZiLCB2Ny4xNmIKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHYxMC44aCwgIHYwLjhoLCAgICM0CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYxNC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjE0LjhoLCAgdjE4LjhoLCAgdjI1LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MTguOGgsICB2MTkuOGgsICB2MjYuOGgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHYxMi44aCwgIHYxMi44aCwgIHYxNC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjE0LjhoLCAgdjI3LjhoLCAgdjMxLjhoCisgICAgICAgIGJpZiAgICAgICAgICAgICB2MTAuMTZiLCB2MjQuMTZiLCB2Ny4xNmIKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHYxMS44aCwgIHYwLjhoLCAgICM0CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYxMi44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjEyLjhoLCAgdjIwLjhoLCAgdjI3LjhoCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTQuOGgsICB2MTQuOGgsICB2MTguOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOC44aCwgIHYyOC44aCwgIHYzMS44aAorICAgICAgICBiaWYgICAgICAgICAgICAgdjExLjE2YiwgdjI1LjE2YiwgdjcuMTZiCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MTguOGgsICB2MTguOGgsICB2MTIuOGgKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHYxMi44aCwgIHYwLjhoLCAgICM0CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYxNC44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjE0LjhoLCAgdjIxLjhoLCAgdjI4LjhoCisgICAgICAgIGFkZCAgICAgICAgICAgICB2MjAuOGgsICB2MjkuOGgsICB2MzEuOGgKKyAgICAgICAgYmlmICAgICAgICAgICAgIHYxMi4xNmIsIHYyNi4xNmIsIHY3LjE2YgorICAgICAgICB1cnNociAgICAgICAgICAgdjEzLjhoLCAgdjAuOGgsICAgIzQKKworICAgICAgICBhZGQgICAgICAgICAgICAgdjAuOGgsICAgdjAuOGgsICAgdjE4LjhoCisgICAgICAgIHN1YiAgICAgICAgICAgICB2MjAuOGgsICB2MjAuOGgsICB2MTQuOGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYxOC44aCwgIHYyMi44aCwgIHYyOS44aAorICAgICAgICBhZGQgICAgICAgICAgICAgdjIyLjhoLCAgdjMwLjhoLCAgdjMxLjhoCisgICAgICAgIGJpZiAgICAgICAgICAgICB2MTMuMTZiLCB2MjcuMTZiLCB2Ny4xNmIKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHYxNC44aCwgIHYwLjhoLCAgICM0CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYyMC44aAorICAgICAgICBzdWIgICAgICAgICAgICAgdjIyLjhoLCAgdjIyLjhoLCAgdjE4LjhoCisgICAgICAgIGJpZiAgICAgICAgICAgICB2MTQuMTZiLCB2MjguMTZiLCB2Ny4xNmIKKyAgICAgICAgdXJzaHIgICAgICAgICAgIHYxNS44aCwgIHYwLjhoLCAgICM0CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHYwLjhoLCAgIHYwLjhoLCAgIHYyMi44aAorICAgICAgICBiaWYgICAgICAgICAgICAgdjE1LjE2YiwgdjI5LjE2YiwgdjcuMTZiCisgICAgICAgIHVyc2hyICAgICAgICAgICB2MTcuOGgsICB2MC44aCwgICAjNAorICAgICAgICBiaWYgICAgICAgICAgICAgdjE3LjE2YiwgdjMwLjE2YiwgdjcuMTZiCisuZW5kaWYKKy5lbmRtCisKKy8vIEZvciB3ZCA8PSA4LCB3ZSB1c2UgdjE2LXYxOSBhbmQgdjI4LXYzMSBmb3IgdGVtcCByZWdpc3RlcnMsCisvLyB3aGlsZSB3ZSBuZWVkIHRob3NlIGZvciBpbnB1dHMvb3V0cHV0cyBpbiB3ZD0xNiBhbmQgdXNlIHY4LXYxNQorLy8gZm9yIHRlbXAgcmVnaXN0ZXJzIHRoZXJlIGluc3RlYWQuCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfNAorICAgICAgICBsb29wX2ZpbHRlciAgICAgNCwgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjI4LCB2MjksIHYzMCwgdjMxCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfOAorICAgICAgICBsb29wX2ZpbHRlciAgICAgOCwgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjI4LCB2MjksIHYzMCwgdjMxCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfMTYKKyAgICAgICAgbG9vcF9maWx0ZXIgICAgIDE2LCB2OCwgIHY5LCAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNQorICAgICAgICByZXQKK2VuZGZ1bmMKKworLm1hY3JvIGxvb3BfZmlsdGVyXzQKKyAgICAgICAgYmwgICAgICAgICAgICAgIHZwOV9sb29wX2ZpbHRlcl80CisuZW5kbQorCisubWFjcm8gbG9vcF9maWx0ZXJfOAorICAgICAgICAvLyBjYWxjdWxhdGUgYWx0ZXJuYXRpdmUgJ3JldHVybicgdGFyZ2V0cworICAgICAgICBhZHIgICAgICAgICAgICAgeDEzLCA2ZgorICAgICAgICBibCAgICAgICAgICAgICAgdnA5X2xvb3BfZmlsdGVyXzgKKy5lbmRtCisKKy5tYWNybyBsb29wX2ZpbHRlcl8xNgorICAgICAgICAvLyBjYWxjdWxhdGUgYWx0ZXJuYXRpdmUgJ3JldHVybicgdGFyZ2V0cworICAgICAgICBhZHIgICAgICAgICAgICAgeDE0LCA3ZgorICAgICAgICBhZHIgICAgICAgICAgICAgeDE1LCA4ZgorICAgICAgICBibCAgICAgICAgICAgICAgdnA5X2xvb3BfZmlsdGVyXzE2CisuZW5kbQorCisKKy8vIFRoZSBwdWJsaWMgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBoYXZlIGdvdCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKKy8vIHZvaWQgbG9vcF9maWx0ZXIodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgbWJfbGltLCBpbnQgbGltLCBpbnQgaGV2X3Rocik7CisKKy5tYWNybyBicHBfZnJvbnRlbmQgZnVuYywgYnBwLCBwdXNoCitmdW5jdGlvbiBmZl9cZnVuY1woKV9cYnBwXCgpX25lb24sIGV4cG9ydD0xCisuaWYgXHB1c2gKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNiwgeDMwCisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwLCAjLTB4MTBdIQorLmVuZGlmCisgICAgICAgIGxzbCAgICAgICAgICAgICB3MiwgIHcyLCAgI1xicHAgLSA4CisgICAgICAgIGxzbCAgICAgICAgICAgICB3MywgIHczLCAgI1xicHAgLSA4CisgICAgICAgIGxzbCAgICAgICAgICAgICB3NCwgIHc0LCAgI1xicHAgLSA4CisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgICMxIDw8IChcYnBwIC0gOCkKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg2LCAgIzE2IC0gXGJwcAorICAgICAgICBtb3YgICAgICAgICAgICAgeDcsICAjKCgxIDw8IFxicHApIC0gMSkKKy5pZiBccHVzaAorICAgICAgICBibCAgICAgICAgICAgICAgXGZ1bmNcKClfMTZfbmVvbgorICAgICAgICBsZHAgICAgICAgICAgICAgZDgsICBkOSwgIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTIsIGQxMywgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDE0LCBkMTUsIFtzcF0sIDB4MTAKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNgorLmVsc2UKKyAgICAgICAgYiAgICAgICAgICAgICAgIFxmdW5jXCgpXzE2X25lb24KKy5lbmRpZgorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGJwcF9mcm9udGVuZHMgZnVuYywgcHVzaD0wCisgICAgICAgIGJwcF9mcm9udGVuZCAgICBcZnVuYywgMTAsIFxwdXNoCisgICAgICAgIGJwcF9mcm9udGVuZCAgICBcZnVuYywgMTIsIFxwdXNoCisuZW5kbQorCisubWFjcm8gYnBwX2Zyb250ZW5kX3JlcCBmdW5jLCBzdWZmaXgsIGludF9zdWZmaXgsIGRpciwgYnBwLCBwdXNoCitmdW5jdGlvbiBmZl9cZnVuY1woKV9cc3VmZml4XCgpX1xicHBcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxNiwgeDMwCisuaWYgXHB1c2gKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxNCwgZDE1LCBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTIsIGQxMywgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3AsICMtMHgxMF0hCisuZW5kaWYKKyAgICAgICAgbHNsICAgICAgICAgICAgIHcyLCAgdzIsICAjXGJwcCAtIDgKKyAgICAgICAgbHNsICAgICAgICAgICAgIHczLCAgdzMsICAjXGJwcCAtIDgKKyAgICAgICAgbHNsICAgICAgICAgICAgIHc0LCAgdzQsICAjXGJwcCAtIDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgIzEgPDwgKFxicHAgLSA4KQorICAgICAgICBtb3YgICAgICAgICAgICAgeDYsICAjMTYgLSBcYnBwCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NywgICMoKDEgPDwgXGJwcCkgLSAxKQorICAgICAgICBibCAgICAgICAgICAgICAgXGZ1bmNcKClfXGludF9zdWZmaXhcKClfMTZfbmVvbgorLmlmYyBcZGlyLGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMzCisuZWxzZQorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMxNgorLmVuZGlmCisgICAgICAgIGJsICAgICAgICAgICAgICBcZnVuY1woKV9caW50X3N1ZmZpeFwoKV8xNl9uZW9uCisuaWYgXHB1c2gKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTAsIGQxMSwgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxNCwgZDE1LCBbc3BdLCAweDEwCisuZW5kaWYKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNgorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGJwcF9mcm9udGVuZHNfcmVwIGZ1bmMsIHN1ZmZpeCwgaW50X3N1ZmZpeCwgZGlyLCBwdXNoPTAKKyAgICAgICAgYnBwX2Zyb250ZW5kX3JlcCBcZnVuYywgXHN1ZmZpeCwgXGludF9zdWZmaXgsIFxkaXIsIDEwLCBccHVzaAorICAgICAgICBicHBfZnJvbnRlbmRfcmVwIFxmdW5jLCBcc3VmZml4LCBcaW50X3N1ZmZpeCwgXGRpciwgMTIsIFxwdXNoCisuZW5kbQorCisubWFjcm8gYnBwX2Zyb250ZW5kX21peDIgd2QxLCB3ZDIsIGRpciwgYnBwCitmdW5jdGlvbiBmZl92cDlfbG9vcF9maWx0ZXJfXGRpclwoKV9cd2QxXCgpXHdkMlwoKV8xNl9cYnBwXCgpX25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTYsIHgzMAorICAgICAgICBsc3IgICAgICAgICAgICAgdzgsICB3MiwgICM4CisgICAgICAgIGxzciAgICAgICAgICAgICB3MTQsIHczLCAgIzgKKyAgICAgICAgbHNyICAgICAgICAgICAgIHcxNSwgdzQsICAjOAorICAgICAgICBhbmQgICAgICAgICAgICAgdzIsICB3MiwgICMweGZmCisgICAgICAgIGFuZCAgICAgICAgICAgICB3MywgIHczLCAgIzB4ZmYKKyAgICAgICAgYW5kICAgICAgICAgICAgIHc0LCAgdzQsICAjMHhmZgorICAgICAgICBsc2wgICAgICAgICAgICAgdzIsICB3MiwgICNcYnBwIC0gOAorICAgICAgICBsc2wgICAgICAgICAgICAgdzMsICB3MywgICNcYnBwIC0gOAorICAgICAgICBsc2wgICAgICAgICAgICAgdzQsICB3NCwgICNcYnBwIC0gOAorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICAjMSA8PCAoXGJwcCAtIDgpCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgICMxNiAtIFxicHAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg3LCAgIygoMSA8PCBcYnBwKSAtIDEpCisgICAgICAgIGJsICAgICAgICAgICAgICB2cDlfbG9vcF9maWx0ZXJfXGRpclwoKV9cd2QxXCgpXzhfMTZfbmVvbgorLmlmYyBcZGlyLGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMzCisuZWxzZQorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMxNgorLmVuZGlmCisgICAgICAgIGxzbCAgICAgICAgICAgICB3MiwgIHc4LCAgI1xicHAgLSA4CisgICAgICAgIGxzbCAgICAgICAgICAgICB3MywgIHcxNCwgI1xicHAgLSA4CisgICAgICAgIGxzbCAgICAgICAgICAgICB3NCwgIHcxNSwgI1xicHAgLSA4CisgICAgICAgIGJsICAgICAgICAgICAgICB2cDlfbG9vcF9maWx0ZXJfXGRpclwoKV9cd2QyXCgpXzhfMTZfbmVvbgorICAgICAgICBiciAgICAgICAgICAgICAgeDE2CitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gYnBwX2Zyb250ZW5kc19taXgyIHdkMSwgd2QyCisgICAgICAgIGJwcF9mcm9udGVuZF9taXgyIFx3ZDEsIFx3ZDIsIHYsIDEwCisgICAgICAgIGJwcF9mcm9udGVuZF9taXgyIFx3ZDEsIFx3ZDIsIHYsIDEyCisgICAgICAgIGJwcF9mcm9udGVuZF9taXgyIFx3ZDEsIFx3ZDIsIGgsIDEwCisgICAgICAgIGJwcF9mcm9udGVuZF9taXgyIFx3ZDEsIFx3ZDIsIGgsIDEyCisuZW5kbQorCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfdl80XzhfMTZfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICB4MSwgbHNsICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhofSwgW3g5XSwgeDEgLy8gcDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOGh9LCBbeDBdLCB4MSAvLyBxMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS44aH0sIFt4OV0sIHgxIC8vIHAyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhofSwgW3gwXSwgeDEgLy8gcTEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuOGh9LCBbeDldLCB4MSAvLyBwMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi44aH0sIFt4MF0sIHgxIC8vIHEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIzLjhofSwgW3g5XSwgeDEgLy8gcDAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuOGh9LCBbeDBdLCB4MSAvLyBxMworICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfNAorCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjhofSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy44aH0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMxCisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworCiticHBfZnJvbnRlbmRzIHZwOV9sb29wX2ZpbHRlcl92XzRfOAorCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfaF80XzhfMTZfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGh9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC44aH0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhofSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuOGh9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44aH0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjhofSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOGh9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44aH0sIFt4MF0sIHgxCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisKKyAgICAgICAgdHJhbnNwb3NlXzh4OEggIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorCisgICAgICAgIGxvb3BfZmlsdGVyXzQKKworICAgICAgICAvLyBNb3ZlIHg5IGZvcndhcmQgYnkgMiBwaXhlbHM7IHdlIGRvbid0IG5lZWQgdG8gcmV3cml0ZSB0aGUKKyAgICAgICAgLy8gb3V0ZXJtb3N0IDIgcGl4ZWxzIHNpbmNlIHRoZXkgYXJlbid0IGNoYW5nZWQuCisgICAgICAgIGFkZCAgICAgICAgICAgICB4OSwgIHg5LCAgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDksICB4MSwgbHNsICMyCisKKyAgICAgICAgLy8gV2Ugb25seSB3aWxsIHdyaXRlIHRoZSBtaWQgNCBwaXhlbHMgYmFjazsgYWZ0ZXIgdGhlIGxvb3AgZmlsdGVyLAorICAgICAgICAvLyB0aGVzZSBhcmUgaW4gdjIyLCB2MjMsIHYyNCwgdjI1LCBvcmRlcmVkIGFzIHJvd3MgKDh4NCBwaXhlbHMpLgorICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYW5zcG9zZSB0aGVtIHRvIGNvbHVtbnMsIGRvbmUgd2l0aCBhIDR4OCB0cmFuc3Bvc2UKKyAgICAgICAgLy8gKHdoaWNoIGluIHByYWN0aWNlIGlzIHR3byA0eDQgdHJhbnNwb3NlcyBvZiB0aGUgdHdvIDR4NCBoYWx2ZXMKKyAgICAgICAgLy8gb2YgdGhlIDh4NCBwaXhlbHM7IGludG8gNHg4IHBpeGVscykuCisgICAgICAgIHRyYW5zcG9zZV80eDhIICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5kfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLmR9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuZH1bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5kfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM0CisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworCiticHBfZnJvbnRlbmRzIHZwOV9sb29wX2ZpbHRlcl9oXzRfOAorCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfdl84XzhfMTZfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICB4MSwgbHNsICMyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhofSwgW3g5XSwgeDEgLy8gcDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOGh9LCBbeDBdLCB4MSAvLyBxMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS44aH0sIFt4OV0sIHgxIC8vIHAyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhofSwgW3gwXSwgeDEgLy8gcTEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuOGh9LCBbeDldLCB4MSAvLyBwMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi44aH0sIFt4MF0sIHgxIC8vIHEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIzLjhofSwgW3g5XSwgeDEgLy8gcDAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuOGh9LCBbeDBdLCB4MSAvLyBxMworICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICB4OSwgIHg5LCAgeDEKKworICAgICAgICBsb29wX2ZpbHRlcl84CisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuOGh9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44aH0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjhofSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy44aH0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI2LjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEKKworICAgICAgICBiciAgICAgICAgICAgICAgeDEwCis2OgorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgIHgxLCBsc2wgIzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuOGh9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44aH0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjhofSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgxLCBsc2wgIzEKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworCiticHBfZnJvbnRlbmRzIHZwOV9sb29wX2ZpbHRlcl92XzhfOAorCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfaF84XzhfMTZfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGh9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC44aH0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhofSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuOGh9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44aH0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjhofSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOGh9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44aH0sIFt4MF0sIHgxCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisKKyAgICAgICAgdHJhbnNwb3NlXzh4OEggIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorCisgICAgICAgIGxvb3BfZmlsdGVyXzgKKworICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4OSwgIHgxLCBsc2wgIzIKKworICAgICAgICAvLyBFdmVuIHRob3VnaCBvbmx5IDYgcGl4ZWxzIHBlciByb3cgaGF2ZSBiZWVuIGNoYW5nZWQsIHdlIHdyaXRlIHRoZQorICAgICAgICAvLyBmdWxsIDggcGl4ZWwgcmVnaXN0ZXJzLgorICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5CisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuOGh9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44aH0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIxLjhofSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi44aH0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI2LjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuOGh9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNy44aH0sIFt4MF0sIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorNjoKKyAgICAgICAgLy8gSWYgd2UgZGlkbid0IG5lZWQgdG8gZG8gdGhlIGZsYXQ4aW4gcGFydCwgd2UgdXNlIHRoZSBzYW1lIHdyaXRlYmFjaworICAgICAgICAvLyBhcyBpbiBsb29wX2ZpbHRlcl9oXzRfOC4KKyAgICAgICAgYWRkICAgICAgICAgICAgIHg5LCAgeDksICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgdHJhbnNwb3NlXzR4OEggIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLmR9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuZH1bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC5kfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LmR9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMzCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzQKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworCiticHBfZnJvbnRlbmRzIHZwOV9sb29wX2ZpbHRlcl9oXzhfOAorCiticHBfZnJvbnRlbmRzX21peDIgNCwgNAorYnBwX2Zyb250ZW5kc19taXgyIDQsIDgKK2JwcF9mcm9udGVuZHNfbWl4MiA4LCA0CiticHBfZnJvbnRlbmRzX21peDIgOCwgOAorCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfdl8xNl84XzE2X25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgeDMwCisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44aH0sIFt4OV0sIHgxIC8vIHA3CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI0LjhofSwgW3gwXSwgeDEgLy8gcTAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTcuOGh9LCBbeDldLCB4MSAvLyBwNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNS44aH0sIFt4MF0sIHgxIC8vIHExCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LjhofSwgW3g5XSwgeDEgLy8gcDUKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOGh9LCBbeDBdLCB4MSAvLyBxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS44aH0sIFt4OV0sIHgxIC8vIHA0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI3LjhofSwgW3gwXSwgeDEgLy8gcTMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGh9LCBbeDldLCB4MSAvLyBwMworICAgICAgICBsZDEgICAgICAgICAgICAge3YyOC44aH0sIFt4MF0sIHgxIC8vIHE0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhofSwgW3g5XSwgeDEgLy8gcDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjkuOGh9LCBbeDBdLCB4MSAvLyBxNQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44aH0sIFt4OV0sIHgxIC8vIHAxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMwLjhofSwgW3gwXSwgeDEgLy8gcTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOGh9LCBbeDldLCB4MSAvLyBwMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YzMS44aH0sIFt4MF0sIHgxIC8vIHE3CisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHg5LCAgeDEsIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgxLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg5LCAgeDksICB4MQorCisgICAgICAgIGxvb3BfZmlsdGVyXzE2CisKKyAgICAgICAgLy8gSWYgd2UgZGlkIHRoZSBmbGF0OG91dCBwYXJ0LCB3ZSBnZXQgdGhlIG91dHB1dCBpbgorICAgICAgICAvLyB2Mi12MTcgKHNraXBwaW5nIHY3IGFuZCB2MTYpLiB4OSBwb2ludHMgdG8geDAgLSA3ICogc3RyaWRlLAorICAgICAgICAvLyBzdG9yZSB2Mi12OSB0aGVyZSwgYW5kIHYxMC12MTcgaW50byB4MC4KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi44aH0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxMC44aH0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOGh9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTEuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjhofSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEyLjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44aH0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxMy44aH0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuOGh9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTQuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y4LjhofSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE1LjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2OS44aH0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy44aH0sIFt4MF0sIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgIHgxCisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorODoKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMyCisgICAgICAgIC8vIElmIHdlIGRpZG4ndCBkbyB0aGUgZmxhdDhvdXQgcGFydCwgdGhlIG91dHB1dCBpcyBsZWZ0IGluIHRoZQorICAgICAgICAvLyBpbnB1dCByZWdpc3RlcnMuCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIxLjhofSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi44aH0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuOGh9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNi44aH0sIFt4MF0sIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgxCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKKzc6CisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgeDEsIGxzbCAjMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi44aH0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuOGh9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS44aH0sIFt4MF0sIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMQorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisKK2JwcF9mcm9udGVuZHMgdnA5X2xvb3BfZmlsdGVyX3ZfMTZfOCwgcHVzaD0xCiticHBfZnJvbnRlbmRzX3JlcCB2cDlfbG9vcF9maWx0ZXJfdl8xNiwgMTYsIDgsIHYsIHB1c2g9MQorCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfaF8xNl84XzE2X25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgeDMwCisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgIzE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhofSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOGh9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy44aH0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhofSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOGh9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi44aH0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LjhofSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuOGh9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC44aH0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhofSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGh9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOS44aH0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLjhofSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuOGh9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMy44aH0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMxLjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHg5LCAgeDEsIGxzbCAjMworCisgICAgICAgIC8vIFRoZSAxNng4IHBpeGVscyByZWFkIGFib3ZlIGlzIGluIHR3byA4eDggYmxvY2tzOyB0aGUgbGVmdAorICAgICAgICAvLyBoYWxmIGluIHYxNi12MjMsIGFuZCB0aGUgcmlnaHQgaGFsZiBpbiB2MjQtdjMxLiBEbyB0d28gOHg4IHRyYW5zcG9zZXMKKyAgICAgICAgLy8gb2YgdGhpcywgdG8gZ2V0IG9uZSBjb2x1bW4gcGVyIHJlZ2lzdGVyLgorICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYwLCB2MQorICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYwLCB2MQorCisgICAgICAgIGxvb3BfZmlsdGVyXzE2CisKKyAgICAgICAgdHJhbnNwb3NlXzh4OEggIHYxNiwgdjIsICB2MywgIHY0LCAgdjUsICB2NiwgIHY4LCAgdjksICB2MCwgdjEKKyAgICAgICAgdHJhbnNwb3NlXzh4OEggIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNywgdjMxLCB2MCwgdjEKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi44aH0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEwLjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi44aH0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxMS44aH0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOGh9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTIuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjhofSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEzLjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44aH0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNC44aH0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuOGh9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTUuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y4LjhofSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2OS44aH0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMS44aH0sIFt4MF0sIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKKzg6CisgICAgICAgIC8vIFRoZSBzYW1lIHdyaXRlYmFjayBhcyBpbiBsb29wX2ZpbHRlcl9oXzhfOAorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHg5LCAgeDEsIGxzbCAjMgorICAgICAgICB0cmFuc3Bvc2VfOHg4SCAgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5CisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuOGh9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44aH0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIxLjhofSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuOGh9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi44aH0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI2LjhofSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuOGh9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNy44aH0sIFt4MF0sIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICM4CisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKKzc6CisgICAgICAgIC8vIFRoZSBzYW1lIHdyaXRlYmFjayBhcyBpbiBsb29wX2ZpbHRlcl9oXzRfOAorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHg5LCAgeDEsIGxzbCAjMgorICAgICAgICB0cmFuc3Bvc2VfNHg4SCAgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuZH1bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5kfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LmR9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuZH1bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgxLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjNAorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisKK2JwcF9mcm9udGVuZHMgdnA5X2xvb3BfZmlsdGVyX2hfMTZfOCwgcHVzaD0xCiticHBfZnJvbnRlbmRzX3JlcCB2cDlfbG9vcF9maWx0ZXJfaF8xNiwgMTYsIDgsIGgsIHB1c2g9MQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOWxwZl9uZW9uLlMgYi9saWJhdmNvZGVjL2FhcmNoNjQvdnA5bHBmX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODc4NzYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOWxwZl9uZW9uLlMKQEAgLTAsMCArMSwxMzM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEdvb2dsZSBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKyNpbmNsdWRlICJuZW9uLlMiCisKKworLy8gVGhlIG1haW4gbG9vcCBmaWx0ZXIgbWFjcm8gaXMgdGVtcGxhdGVkIGFuZCBjYW4gcHJvZHVjZSBmaWx0ZXJzIGZvcgorLy8gdmVjdG9ycyBvZiA4IG9yIDE2IGJ5dGVzLiBUaGUgcmVnaXN0ZXIgbWFwcGluZyB0aHJvdWdob3V0IHRoZSBmaWx0ZXIKKy8vIGlzIGNsb3NlIHRvIGlkZW50aWNhbCB0byB0aGUgYXJtIHZlcnNpb24gKHBsZWFzZSB0cnkgdG8gbWFpbnRhaW4gdGhpcywKKy8vIGlmIGVpdGhlciBpcyBjaGFuZ2VkISkuIFdoZW4gdGhlIGFybSB2ZXJzaW9uIHVzZXMgZS5nLiBkMjAgZm9yIHRoZQorLy8gaW5wdXQgdmFyaWFibGUgcDMsIHRoZSBhYXJjaDY0IHZlcnNpb24gdXNlcyB2MjAuOGIgb3IgdjIwLjE2YiwgZGVwZW5kaW5nCisvLyBvbiB2ZWN0b3IgbGVuZ3RoLgorLy8KKy8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHZlY3RvciBpcyBwYXNzZWQgaW4gdmlhIHRoZSBtYWNybyBwYXJhbWV0ZXIKKy8vIFxzeiwgd2hpY2ggaXMgZWl0aGVyIC44YiBvciAuMTZiLiBGb3Igc2ltcGxlIGluc3RydWN0aW9ucyB0aGF0IGRvZXNuJ3QKKy8vIGxlbmd0aGVuIG9yIG5hcnJvdyB0aGluZ3MsIHRoaXMgY2FuIGVhc2lseSBiZSB0ZW1wbGF0ZWQgbGlrZSB0aGlzOgorLy8gICAgICB1YWJkICAgICAgICAgICAgdjRcc3osICB2MjBcc3osIHYyMVxzegorLy8KKy8vIEZvciBpbnN0cnVjdGlvbnMgdGhhdCBsZW5ndGhlbiBvciBuYXJyb3cgY29udGVudCwgdGhlIGFybSB2ZXJzaW9uIHdvdWxkCisvLyBoYXZlIHVzZWQgcSByZWdpc3RlcnMuIEZvciB0aGVzZSBpbnN0cnVjdGlvbnMsIHdlIGhhdmUgbWFjcm9zIHRoYXQgZXhwYW5kCisvLyBpbnRvIGVpdGhlciBhIHNpbmdsZSBlLmcuIHVhZGRsIGluc3RydWN0aW9uLCBvciBpbnRvIGEgdWFkZGwgKyB1YWRkbDIKKy8vIHBhaXIsIGRlcGVuZGluZyBvbiB0aGUgXHN6IHBhcmFtZXRlci4gV2hlcmV2ZXIgdGhlIGFybSB2ZXJzaW9uIHdvdWxkIGhhdmUKKy8vIHVzZWQgYSBxIHJlZ2lzdGVyLCB0aGVzZSBtYWNyb3MgaW5zdGVhZCB0YWtlIHR3byB2IHJlZ2lzdGVycywgaS5lLiBxMworLy8gaXMgbWFwcGVkIHRvIHY2K3Y3LiBGb3IgdGhlIGNhc2Ugd2l0aCA4IGJ5dGUgaW5wdXQgdmVjdG9ycywgc3VjaCBhCisvLyBsZW5ndGhlbmluZyBvcGVyYXRpb24gaXMgb25seSBzdG9yZWQgaW4gdjYuOGggKHdoYXQgd2FzIGluIHEzIGluIHRoZSBhcm0KKy8vIGNhc2UpLCB3aGlsZSB0aGUgMTYgYnl0ZSBpbnB1dCB2ZWN0b3JzIHdpbGwgdXNlIHY2LjhoICsgdjcuOGguCisvLyBTdWNoIGEgbWFjcm8gaW52b2NhdGlvbiB3b3VsZCBsb29rIGxpa2UgdGhpczoKKy8vICAgICAgdWFkZGxfc3ogICAgICAgIHY4LjhoLCAgdjkuOGgsICB2MTcsIHYxOCwgXHN6CisvLworLy8gVGhhdCBpcywgaW4gdGhlIDggYnl0ZSBpbnB1dCB2ZWN0b3IgY2FzZSwgdGhlIHNlY29uZCByZWdpc3RlciBpbiB0aGVzZQorLy8gcmVnaXN0ZXIgcGFpcnMgd2lsbCBiZSB1bnVzZWQuCisvLyBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1ha2VzIHRoZSBjb2RlIHF1aXRlIGhhcmQgdG8gcmVhZC4gRm9yIHJlYWRhYmlsaXR5LAorLy8gc2VlIHRoZSBhcm0gdmVyc2lvbiBpbnN0ZWFkLgorCisKKy5tYWNybyBhZGRfc3ogZHN0MSwgZHN0MiwgaW4xLCBpbjIsIGluMywgaW40LCBzegorICAgICAgICBhZGQgICAgICAgICAgICAgXGRzdDEsICBcaW4xLCAgXGluMworLmlmYyBcc3osIC4xNmIKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxkc3QyLCAgXGluMiwgIFxpbjQKKy5lbmRpZgorLmVuZG0KKworLm1hY3JvIHN1Yl9zeiBkc3QxLCBkc3QyLCBpbjEsIGluMiwgaW4zLCBpbjQsIHN6CisgICAgICAgIHN1YiAgICAgICAgICAgICBcZHN0MSwgIFxpbjEsICBcaW4zCisuaWZjIFxzeiwgLjE2YgorICAgICAgICBzdWIgICAgICAgICAgICAgXGRzdDIsICBcaW4yLCAgXGluNAorLmVuZGlmCisuZW5kbQorCisubWFjcm8gdWFkZHdfc3ogZHN0MSwgZHN0MiwgaW4xLCBpbjIsIGluMywgc3oKKyAgICAgICAgdWFkZHcgICAgICAgICAgIFxkc3QxLCAgXGluMSwgXGluM1woKS44YgorLmlmYyBcc3osIC4xNmIKKyAgICAgICAgdWFkZHcyICAgICAgICAgIFxkc3QyLCAgXGluMiwgXGluM1woKS4xNmIKKy5lbmRpZgorLmVuZG0KKworLm1hY3JvIHVzdWJ3X3N6IGRzdDEsIGRzdDIsIGluMSwgaW4yLCBpbjMsIHN6CisgICAgICAgIHVzdWJ3ICAgICAgICAgICBcZHN0MSwgIFxpbjEsIFxpbjNcKCkuOGIKKy5pZmMgXHN6LCAuMTZiCisgICAgICAgIHVzdWJ3MiAgICAgICAgICBcZHN0MiwgIFxpbjIsIFxpbjNcKCkuMTZiCisuZW5kaWYKKy5lbmRtCisKKy5tYWNybyB1c3VibF9zeiBkc3QxLCBkc3QyLCBpbjEsIGluMiwgc3oKKyAgICAgICAgdXN1YmwgICAgICAgICAgIFxkc3QxLCAgXGluMVwoKS44YiwgIFxpbjJcKCkuOGIKKy5pZmMgXHN6LCAuMTZiCisgICAgICAgIHVzdWJsMiAgICAgICAgICBcZHN0MiwgIFxpbjFcKCkuMTZiLCBcaW4yXCgpLjE2YgorLmVuZGlmCisuZW5kbQorCisubWFjcm8gc3F4dG5fc3ogZHN0LCBpbjEsIGluMiwgc3oKKyAgICAgICAgc3F4dG4gICAgICAgICAgIFxkc3RcKCkuOGIsICBcaW4xCisuaWZjIFxzeiwgLjE2YgorICAgICAgICBzcXh0bjIgICAgICAgICAgXGRzdFwoKS4xNmIsIFxpbjIKKy5lbmRpZgorLmVuZG0KKworLm1hY3JvIHNxeHR1bl9zeiBkc3QsIGluMSwgaW4yLCBzegorICAgICAgICBzcXh0dW4gICAgICAgICAgXGRzdFwoKS44YiwgIFxpbjEKKy5pZmMgXHN6LCAuMTZiCisgICAgICAgIHNxeHR1bjIgICAgICAgICBcZHN0XCgpLjE2YiwgXGluMgorLmVuZGlmCisuZW5kbQorCisubWFjcm8gbXVsX3N6IGRzdDEsIGRzdDIsIGluMSwgaW4yLCBpbjMsIGluNCwgc3oKKyAgICAgICAgbXVsICAgICAgICAgICAgIFxkc3QxLCAgXGluMSwgIFxpbjMKKy5pZmMgXHN6LCAuMTZiCisgICAgICAgIG11bCAgICAgICAgICAgICBcZHN0MiwgIFxpbjIsICBcaW40CisuZW5kaWYKKy5lbmRtCisKKy5tYWNybyBzYWRkd19zeiBkc3QxLCBkc3QyLCBpbjEsIGluMiwgaW4zLCBzegorICAgICAgICBzYWRkdyAgICAgICAgICAgXGRzdDEsICBcaW4xLCBcaW4zXCgpLjhiCisuaWZjIFxzeiwgLjE2YgorICAgICAgICBzYWRkdzIgICAgICAgICAgXGRzdDIsICBcaW4yLCBcaW4zXCgpLjE2YgorLmVuZGlmCisuZW5kbQorCisubWFjcm8gc3N1Yndfc3ogZHN0MSwgZHN0MiwgaW4xLCBpbjIsIGluMywgc3oKKyAgICAgICAgc3N1YncgICAgICAgICAgIFxkc3QxLCAgXGluMSwgXGluM1woKS44YgorLmlmYyBcc3osIC4xNmIKKyAgICAgICAgc3N1YncyICAgICAgICAgIFxkc3QyLCAgXGluMiwgXGluM1woKS4xNmIKKy5lbmRpZgorLmVuZG0KKworLm1hY3JvIHV4dGxfc3ogZHN0MSwgZHN0MiwgaW4sIHN6CisgICAgICAgIHV4dGwgICAgICAgICAgICBcZHN0MSwgIFxpblwoKS44YgorLmlmYyBcc3osIC4xNmIKKyAgICAgICAgdXh0bDIgICAgICAgICAgIFxkc3QyLCAgXGluXCgpLjE2YgorLmVuZGlmCisuZW5kbQorCisubWFjcm8gdWFkZGxfc3ogZHN0MSwgZHN0MiwgaW4xLCBpbjIsIHN6CisgICAgICAgIHVhZGRsICAgICAgICAgICBcZHN0MSwgIFxpbjFcKCkuOGIsICBcaW4yXCgpLjhiCisuaWZjIFxzeiwgLjE2YgorICAgICAgICB1YWRkbDIgICAgICAgICAgXGRzdDIsICBcaW4xXCgpLjE2YiwgXGluMlwoKS4xNmIKKy5lbmRpZgorLmVuZG0KKworLm1hY3JvIHJzaHJuX3N6IGRzdCwgaW4xLCBpbjIsIHNoaWZ0LCBzegorICAgICAgICByc2hybiAgICAgICAgICAgXGRzdFwoKS44YiwgIFxpbjEsIFxzaGlmdAorLmlmYyBcc3osIC4xNmIKKyAgICAgICAgcnNocm4yICAgICAgICAgIFxkc3RcKCkuMTZiLCBcaW4yLCBcc2hpZnQKKy5lbmRpZgorLmVuZG0KKworLm1hY3JvIHVzaGxsX3N6IGRzdDEsIGRzdDIsIGluLCBzaGlmdCwgc3oKKyAgICAgICAgdXNobGwgICAgICAgICAgIFxkc3QxLCAgXGluXCgpLjhiLCAgXHNoaWZ0CisuaWZjIFxzeiwgLjE2YgorICAgICAgICB1c2hsbDIgICAgICAgICAgXGRzdDIsICBcaW5cKCkuMTZiLCBcc2hpZnQKKy5lbmRpZgorLmVuZG0KKworLy8gVGhlIGlucHV0IHRvIGFuZCBvdXRwdXQgZnJvbSB0aGlzIG1hY3JvIGlzIGluIHRoZSByZWdpc3RlcnMgdjE2LXYzMSwKKy8vIGFuZCB2MC12NyBhcmUgdXNlZCBhcyBzY3JhdGNoIHJlZ2lzdGVycy4KKy8vIHA3ID0gdjE2IC4uIHAzID0gdjIwLCBwMCA9IHYyMywgcTAgPSB2MjQsIHEzID0gdjI3LCBxNyA9IHYzMQorLy8gRGVwZW5kaW5nIG9uIHRoZSB3aWR0aCBvZiB0aGUgbG9vcCBmaWx0ZXIsIHdlIGVpdGhlciB1c2UgdjE2LXYxOQorLy8gYW5kIHYyOC12MzEgYXMgdGVtcCByZWdpc3RlcnMsIG9yIHY4LXYxNS4KKy8vIFdoZW4gY29tcGFyaW5nIHRvIHRoZSBhcm0gdmVyc2lvbiwgdG1wcTEgPT0gdG1wMSArIHRtcDIsCisvLyB0bXBxMiA9PSB0bXAzICsgdG1wNCwgZXRjLgorLm1hY3JvIGxvb3BfZmlsdGVyIHdkLCBzeiwgbWl4LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCB0bXA4CisuaWYgXG1peCA9PSAwCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MFxzeiwgIHcyICAgICAgICAvLyBFCisgICAgICAgIGR1cCAgICAgICAgICAgICB2MlxzeiwgIHczICAgICAgICAvLyBJCisgICAgICAgIGR1cCAgICAgICAgICAgICB2M1xzeiwgIHc0ICAgICAgICAvLyBICisuZWxzZQorICAgICAgICBkdXAgICAgICAgICAgICAgdjAuOGgsICB3MiAgICAgICAgLy8gRQorICAgICAgICBkdXAgICAgICAgICAgICAgdjIuOGgsICB3MyAgICAgICAgLy8gSQorICAgICAgICBkdXAgICAgICAgICAgICAgdjMuOGgsICB3NCAgICAgICAgLy8gSAorICAgICAgICByZXYxNiAgICAgICAgICAgdjEuMTZiLCB2MC4xNmIgICAgLy8gRQorICAgICAgICByZXYxNiAgICAgICAgICAgdjQuMTZiLCB2Mi4xNmIgICAgLy8gSQorICAgICAgICByZXYxNiAgICAgICAgICAgdjUuMTZiLCB2My4xNmIgICAgLy8gSAorICAgICAgICB1enAxICAgICAgICAgICAgdjAuMTZiLCB2MC4xNmIsIHYxLjE2YgorICAgICAgICB1enAxICAgICAgICAgICAgdjIuMTZiLCB2Mi4xNmIsIHY0LjE2YgorICAgICAgICB1enAxICAgICAgICAgICAgdjMuMTZiLCB2My4xNmIsIHY1LjE2YgorLmVuZGlmCisKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY0XHN6LCAgdjIwXHN6LCB2MjFcc3ogICAgICAgIC8vIGFicyhwMyAtIHAyKQorICAgICAgICB1YWJkICAgICAgICAgICAgdjVcc3osICB2MjFcc3osIHYyMlxzeiAgICAgICAgLy8gYWJzKHAyIC0gcDEpCisgICAgICAgIHVhYmQgICAgICAgICAgICB2NlxzeiwgIHYyMlxzeiwgdjIzXHN6ICAgICAgICAvLyBhYnMocDEgLSBwMCkKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY3XHN6LCAgdjI0XHN6LCB2MjVcc3ogICAgICAgIC8vIGFicyhxMCAtIHExKQorICAgICAgICB1YWJkICAgICAgICAgICAgXHRtcDFcc3osICB2MjVcc3osIHYyNlxzeiAgICAgLy8gYWJzKHExIC0gcTIpCisgICAgICAgIHVhYmQgICAgICAgICAgICBcdG1wMlxzeiwgIHYyNlxzeiwgdjI3XHN6ICAgICAvLyBhYnMocTIgLSBxMykKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY0XHN6LCAgdjRcc3osICB2NVxzegorICAgICAgICB1bWF4ICAgICAgICAgICAgdjVcc3osICB2NlxzeiwgIHY3XHN6CisgICAgICAgIHVtYXggICAgICAgICAgICBcdG1wMVxzeiwgXHRtcDFcc3osIFx0bXAyXHN6CisgICAgICAgIHVhYmQgICAgICAgICAgICB2NlxzeiwgIHYyM1xzeiwgdjI0XHN6ICAgICAgICAvLyBhYnMocDAgLSBxMCkKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY0XHN6LCAgdjRcc3osICB2NVxzegorICAgICAgICB1cWFkZCAgICAgICAgICAgdjZcc3osICB2NlxzeiwgIHY2XHN6ICAgICAgICAgLy8gYWJzKHAwIC0gcTApICogMgorICAgICAgICB1YWJkICAgICAgICAgICAgdjVcc3osICB2MjJcc3osIHYyNVxzeiAgICAgICAgLy8gYWJzKHAxIC0gcTEpCisgICAgICAgIHVtYXggICAgICAgICAgICB2NFxzeiwgIHY0XHN6LCAgXHRtcDFcc3ogICAgICAvLyBtYXgoYWJzKHAzIC0gcDIpLCAuLi4sIGFicyhxMiAtIHEzKSkKKyAgICAgICAgdXNociAgICAgICAgICAgIHY1XHN6LCAgdjVcc3osICAjMQorICAgICAgICBjbWhzICAgICAgICAgICAgdjRcc3osICB2MlxzeiwgIHY0XHN6ICAgICAgICAgLy8gbWF4KGFicygpKSA8PSBJCisgICAgICAgIHVxYWRkICAgICAgICAgICB2NlxzeiwgIHY2XHN6LCAgdjVcc3ogICAgICAgICAvLyBhYnMocDAgLSBxMCkgKiAyICsgYWJzKHAxIC0gcTEpID4+IDEKKyAgICAgICAgY21ocyAgICAgICAgICAgIHY1XHN6LCAgdjBcc3osICB2NlxzegorICAgICAgICBhbmQgICAgICAgICAgICAgdjRcc3osICB2NFxzeiwgIHY1XHN6ICAgICAgICAgLy8gZm0KKworICAgICAgICAvLyBJZiBubyBwaXhlbHMgbmVlZCBmaWx0ZXJpbmcsIGp1c3QgZXhpdCBhcyBzb29uIGFzIHBvc3NpYmxlCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgIHY0LmRbMF0KKy5pZmMgXHN6LCAuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgIHY0LmRbMV0KKyAgICAgICAgYWRkcyAgICAgICAgICAgIHg1LCAgeDUsICB4NgorICAgICAgICBiLmVxICAgICAgICAgICAgOWYKKy5lbHNlCisgICAgICAgIGNieiAgICAgICAgICAgICB4NSwgIDlmCisuZW5kaWYKKworLmlmIFx3ZCA+PSA4CisgICAgICAgIG1vdmkgICAgICAgICAgICB2MFxzeiwgICMxCisKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY2XHN6LCAgdjIwXHN6LCB2MjNcc3ogICAgLy8gYWJzKHAzIC0gcDApCisgICAgICAgIHVhYmQgICAgICAgICAgICB2MlxzeiwgIHYyMVxzeiwgdjIzXHN6ICAgIC8vIGFicyhwMiAtIHAwKQorICAgICAgICB1YWJkICAgICAgICAgICAgdjFcc3osICB2MjJcc3osIHYyM1xzeiAgICAvLyBhYnMocDEgLSBwMCkKKyAgICAgICAgdWFiZCAgICAgICAgICAgIFx0bXAxXHN6LCAgdjI1XHN6LCB2MjRcc3ogLy8gYWJzKHExIC0gcTApCisgICAgICAgIHVhYmQgICAgICAgICAgICBcdG1wMlxzeiwgIHYyNlxzeiwgdjI0XHN6IC8vIGFicyhxMiAtIHEwKQorICAgICAgICB1YWJkICAgICAgICAgICAgXHRtcDNcc3osICB2Mjdcc3osIHYyNFxzeiAvLyBhYnMocTMgLSBxMCkKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY2XHN6LCAgdjZcc3osICB2MlxzegorICAgICAgICB1bWF4ICAgICAgICAgICAgdjFcc3osICB2MVxzeiwgIFx0bXAxXHN6CisgICAgICAgIHVtYXggICAgICAgICAgICBcdG1wMlxzeiwgIFx0bXAyXHN6LCAgXHRtcDNcc3oKKy5pZiBcd2QgPT0gMTYKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY3XHN6LCAgdjE2XHN6LCB2MjNcc3ogICAgLy8gYWJzKHA3IC0gcDApCisgICAgICAgIHVtYXggICAgICAgICAgICB2NlxzeiwgIHY2XHN6LCAgdjFcc3oKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYyXHN6LCAgdjE3XHN6LCB2MjNcc3ogICAgLy8gYWJzKHA2IC0gcDApCisgICAgICAgIHVtYXggICAgICAgICAgICB2NlxzeiwgIHY2XHN6LCAgXHRtcDJcc3oKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYxXHN6LCAgdjE4XHN6LCB2MjNcc3ogICAgLy8gYWJzKHA1IC0gcDApCisgICAgICAgIGNtaHMgICAgICAgICAgICB2NlxzeiwgIHYwXHN6LCAgdjZcc3ogICAgIC8vIGZsYXQ4aW4KKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY4XHN6LCAgdjE5XHN6LCB2MjNcc3ogICAgLy8gYWJzKHA0IC0gcDApCisgICAgICAgIGFuZCAgICAgICAgICAgICB2NlxzeiwgIHY2XHN6LCAgdjRcc3ogICAgIC8vIGZsYXQ4aW4gJiYgZm0KKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY5XHN6LCAgdjI4XHN6LCB2MjRcc3ogICAgLy8gYWJzKHE0IC0gcTApCisgICAgICAgIGJpYyAgICAgICAgICAgICB2NFxzeiwgIHY0XHN6LCAgdjZcc3ogICAgIC8vIGZtICYmICFmbGF0OGluCisgICAgICAgIHVhYmQgICAgICAgICAgICB2MTBcc3osIHYyOVxzeiwgdjI0XHN6ICAgIC8vIGFicyhxNSAtIHEwKQorICAgICAgICB1YWJkICAgICAgICAgICAgdjExXHN6LCB2MzBcc3osIHYyNFxzeiAgICAvLyBhYnMocTYgLSBxMCkKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHYxMlxzeiwgdjMxXHN6LCB2MjRcc3ogICAgLy8gYWJzKHE3IC0gcTApCisKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY3XHN6LCAgdjdcc3osICB2MlxzegorICAgICAgICB1bWF4ICAgICAgICAgICAgdjFcc3osICB2MVxzeiwgIHY4XHN6CisgICAgICAgIHVtYXggICAgICAgICAgICB2OVxzeiwgIHY5XHN6LCAgdjEwXHN6CisgICAgICAgIHVtYXggICAgICAgICAgICB2MTFcc3osIHYxMVxzeiwgdjEyXHN6CisgICAgICAgIC8vIFRoZSByZXN0IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiBmbGF0OG91dCBpcyBpbnRlcmxlYXZlZCBiZWxvdworLmVsc2UKKyAgICAgICAgLy8gVGhlIHJlc3Qgb2YgdGhlIGNhbGN1bGF0aW9uIG9mIGZsYXQ4aW4gaXMgaW50ZXJsZWF2ZWQgYmVsb3cKKy5lbmRpZgorLmVuZGlmCisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBub3JtYWwgaW5uZXIgbG9vcCBmaWx0ZXIgZm9yIDIgb3IgNCBwaXhlbHMKKyAgICAgICAgdWFiZCAgICAgICAgICAgIHY1XHN6LCAgdjIyXHN6LCB2MjNcc3ogLy8gYWJzKHAxIC0gcDApCisuaWYgXHdkID09IDE2CisgICAgICAgIHVtYXggICAgICAgICAgICB2N1xzeiwgIHY3XHN6LCAgdjFcc3oKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY5XHN6LCAgdjlcc3osICB2MTFcc3oKKy5lbHNlaWYgXHdkID09IDgKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY2XHN6LCAgdjZcc3osICB2MVxzegorLmVuZGlmCisgICAgICAgIHVhYmQgICAgICAgICAgICB2MVxzeiwgIHYyNVxzeiwgdjI0XHN6IC8vIGFicyhxMSAtIHEwKQorLmlmIFx3ZCA9PSAxNgorICAgICAgICB1bWF4ICAgICAgICAgICAgdjdcc3osICB2N1xzeiwgIHY5XHN6CisuZWxzZWlmIFx3ZCA9PSA4CisgICAgICAgIHVtYXggICAgICAgICAgICB2NlxzeiwgIHY2XHN6LCAgXHRtcDJcc3oKKy5lbmRpZgorICAgICAgICB1c3VibF9zeiAgICAgICAgXHRtcDFcKCkuOGgsICBcdG1wMlwoKS44aCwgIHYyMiwgIHYyNSwgXHN6IC8vIHAxIC0gcTEKKyAgICAgICAgdW1heCAgICAgICAgICAgIHY1XHN6LCAgdjVcc3osICB2MVxzeiAgLy8gbWF4KGFicyhwMSAtIHAwKSwgYWJzKHExIC0gcTApKQorLmlmIFxtaXggIT0gMAorICAgICAgICBtb3YgICAgICAgICAgICAgdjEuZFswXSwgeDExCisuZW5kaWYKKyAgICAgICAgdXN1Ymxfc3ogICAgICAgIFx0bXAzXCgpLjhoLCAgXHRtcDRcKCkuOGgsICB2MjQsICB2MjMsIFxzeiAvLyBxMCAtIHAwCisgICAgICAgIG1vdmkgICAgICAgICAgICBcdG1wNVwoKS44aCwgICMzCisuaWYgXHdkID09IDgKKyAgICAgICAgY21ocyAgICAgICAgICAgIHY2XHN6LCAgdjBcc3osICB2NlxzeiAgLy8gZmxhdDhpbgorLmVuZGlmCisuaWYgXG1peCAhPSAwCisgICAgICAgIHN4dGwgICAgICAgICAgICB2MS44aCwgIHYxLjhiCisuZW5kaWYKKyAgICAgICAgY21ocyAgICAgICAgICAgIHY1XHN6LCAgdjNcc3osICB2NVxzeiAgLy8gIWhldgorLmlmIFx3ZCA9PSA4CisgICAgICAgIC8vIElmIGEgNC84IG9yIDgvNCBtaXggaXMgdXNlZCwgY2xlYXIgdGhlIHJlbGV2YW50IGhhbGYgb2YgdjYKKy5pZiBcbWl4ICE9IDAKKyAgICAgICAgYW5kICAgICAgICAgICAgIHY2XHN6LCAgdjZcc3osICB2MS4xNmIKKy5lbmRpZgorICAgICAgICBhbmQgICAgICAgICAgICAgdjZcc3osICB2NlxzeiwgIHY0XHN6ICAvLyBmbGF0OGluICYmIGZtCisuZW5kaWYKKyAgICAgICAgc3F4dG5fc3ogICAgICAgIFx0bXAxLCAgICAgICAgXHRtcDFcKCkuOGgsICBcdG1wMlwoKS44aCwgXHN6IC8vIGF2X2NsaXBfaW50OChwMSAtIHExKQorLmlmIFx3ZCA9PSAxNgorICAgICAgICBjbWhzICAgICAgICAgICAgdjdcc3osICB2MFxzeiwgIHY3XHN6ICAvLyBmbGF0OG91dAorLmVsc2VpZiBcd2QgPT0gOAorICAgICAgICBiaWMgICAgICAgICAgICAgdjRcc3osICB2NFxzeiwgIHY2XHN6ICAvLyBmbSAmJiAhZmxhdDhpbgorLmVuZGlmCisgICAgICAgIGFuZCAgICAgICAgICAgICB2NVxzeiwgIHY1XHN6LCAgdjRcc3ogIC8vICFoZXYgJiYgZm0gJiYgIWZsYXQ4aW4KKy5pZiBcd2QgPT0gMTYKKyAgICAgICAgYW5kICAgICAgICAgICAgIHY3XHN6LCAgdjdcc3osICB2NlxzeiAgLy8gZmxhdDhvdXQgJiYgZmxhdDhpbiAmJiBmbQorLmVuZGlmCisKKyAgICAgICAgbXVsX3N6ICAgICAgICAgIFx0bXAzXCgpLjhoLCAgXHRtcDRcKCkuOGgsICBcdG1wM1woKS44aCwgXHRtcDRcKCkuOGgsICBcdG1wNVwoKS44aCwgIFx0bXA1XCgpLjhoLCBcc3ogLy8gMyAqIChxMCAtIHAwKQorICAgICAgICBiaWMgICAgICAgICAgICAgXHRtcDFcc3osICBcdG1wMVxzeiwgIHY1XHN6ICAgIC8vIGlmICghaGV2KSBhdl9jbGlwX2ludDggPSAwCisgICAgICAgIG1vdmkgICAgICAgICAgICB2MlxzeiwgICM0CisgICAgICAgIHNhZGR3X3N6ICAgICAgICBcdG1wM1woKS44aCwgIFx0bXA0XCgpLjhoLCAgXHRtcDNcKCkuOGgsIFx0bXA0XCgpLjhoLCAgXHRtcDEsIFxzeiAvLyAzICogKHEwIC0gcDApIFsrIGF2X2NsaXBfaW50OChwMSAtIHExKV0KKyAgICAgICAgbW92aSAgICAgICAgICAgIHYzXHN6LCAgIzMKKyAgICAgICAgc3F4dG5fc3ogICAgICAgIFx0bXAxLCAgICAgICAgXHRtcDNcKCkuOGgsICBcdG1wNFwoKS44aCwgXHN6ICAgICAgIC8vIGYKKy5pZiBcd2QgPT0gMTYKKyAgICAgICAgYmljICAgICAgICAgICAgIHY2XHN6LCAgdjZcc3osICB2N1xzeiAgLy8gZm0gJiYgZmxhdDhpbiAmJiAhZmxhdDhvdXQKKy5lbmRpZgorCisgICAgICAgIHNxYWRkICAgICAgICAgICBcdG1wM1xzeiwgIFx0bXAxXHN6LCAgdjJcc3ogLy8gRkZNSU4oZiArIDQsIDEyNykKKyAgICAgICAgc3FhZGQgICAgICAgICAgIFx0bXA0XHN6LCAgXHRtcDFcc3osICB2M1xzeiAvLyBGRk1JTihmICsgMywgMTI3KQorICAgICAgICB1eHRsX3N6ICAgICAgICAgdjAuOGgsICB2MS44aCwgIHYyMywgXHN6ICAgIC8vIHAwCisgICAgICAgIHNzaHIgICAgICAgICAgICBcdG1wM1xzeiwgIFx0bXAzXHN6LCAgIzMgICAgLy8gZjEKKyAgICAgICAgc3NociAgICAgICAgICAgIFx0bXA0XHN6LCAgXHRtcDRcc3osICAjMyAgICAvLyBmMgorCisgICAgICAgIHV4dGxfc3ogICAgICAgICB2Mi44aCwgIHYzLjhoLCAgdjI0LCBcc3ogICAgLy8gcTAKKyAgICAgICAgc2FkZHdfc3ogICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgXHRtcDQsIFxzeiAvLyBwMCArIGYyCisgICAgICAgIHNzdWJ3X3N6ICAgICAgICB2Mi44aCwgIHYzLjhoLCAgdjIuOGgsICB2My44aCwgIFx0bXAzLCBcc3ogLy8gcTAgLSBmMQorICAgICAgICBzcXh0dW5fc3ogICAgICAgdjAsICB2MC44aCwgIHYxLjhoLCAgXHN6ICAgIC8vIG91dCBwMAorICAgICAgICBzcXh0dW5fc3ogICAgICAgdjEsICB2Mi44aCwgIHYzLjhoLCAgXHN6ICAgIC8vIG91dCBxMAorICAgICAgICBzcnNociAgICAgICAgICAgXHRtcDNcc3osIFx0bXAzXHN6LCAjMSAgICAgIC8vIGYgPSAoZjEgKyAxKSA+PiAxCisgICAgICAgIGJpdCAgICAgICAgICAgICB2MjNcc3osIHYwXHN6LCAgdjRcc3ogICAgICAgLy8gaWYgKGZtICYmICFmbGF0OGluKQorICAgICAgICBiaXQgICAgICAgICAgICAgdjI0XHN6LCB2MVxzeiwgIHY0XHN6CisKKyAgICAgICAgdXh0bF9zeiAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MjIsIFxzeiAgICAvLyBwMQorICAgICAgICB1eHRsX3N6ICAgICAgICAgdjIuOGgsICB2My44aCwgIHYyNSwgXHN6ICAgIC8vIHExCisuaWYgXHdkID49IDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgdjYuZFswXQorLmlmYyBcc3osIC4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg2LCAgdjYuZFsxXQorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgc2FkZHdfc3ogICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgXHRtcDMsIFxzeiAvLyBwMSArIGYKKyAgICAgICAgc3N1Yndfc3ogICAgICAgIHYyLjhoLCAgdjMuOGgsICB2Mi44aCwgIHYzLjhoLCAgXHRtcDMsIFxzeiAvLyBxMSAtIGYKKyAgICAgICAgc3F4dHVuX3N6ICAgICAgIHYwLCAgdjAuOGgsICB2MS44aCwgXHN6ICAgICAvLyBvdXQgcDEKKyAgICAgICAgc3F4dHVuX3N6ICAgICAgIHYyLCAgdjIuOGgsICB2My44aCwgXHN6ICAgICAvLyBvdXQgcTEKKy5pZiBcd2QgPj0gOAorLmlmYyBcc3osIC4xNmIKKyAgICAgICAgYWRkcyAgICAgICAgICAgIHg1LCAgeDUsICB4NgorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgYml0ICAgICAgICAgICAgIHYyMlxzeiwgdjBcc3osICB2NVxzeiAgICAgICAvLyBpZiAoIWhldiAmJiBmbSAmJiAhZmxhdDhpbikKKyAgICAgICAgYml0ICAgICAgICAgICAgIHYyNVxzeiwgdjJcc3osICB2NVxzegorCisgICAgICAgIC8vIElmIG5vIHBpeGVscyBuZWVkIGZsYXQ4aW4sIGp1bXAgdG8gZmxhdDhvdXQKKyAgICAgICAgLy8gKG9yIHRvIGEgd3JpdGVvdXQgb2YgdGhlIGlubmVyIDQgcGl4ZWxzLCBmb3Igd2Q9OCkKKy5pZiBcd2QgPj0gOAorLmlmYyBcc3osIC4xNmIKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDZmCisuZWxzZQorICAgICAgICBjYnogICAgICAgICAgICAgeDUsICA2ZgorLmVuZGlmCisKKyAgICAgICAgLy8gZmxhdDhpbgorICAgICAgICB1YWRkbF9zeiAgICAgICAgXHRtcDFcKCkuOGgsIFx0bXAyXCgpLjhoLCAgdjIwLCB2MjEsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgXHRtcDNcKCkuOGgsIFx0bXA0XCgpLjhoLCAgdjIyLCB2MjUsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgXHRtcDVcKCkuOGgsIFx0bXA2XCgpLjhoLCAgdjIwLCB2MjIsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgXHRtcDdcKCkuOGgsIFx0bXA4XCgpLjhoLCAgdjIzLCB2MjYsIFxzegorICAgICAgICBhZGRfc3ogICAgICAgICAgdjAuOGgsICB2MS44aCwgIFx0bXAxXCgpLjhoLCBcdG1wMlwoKS44aCwgXHRtcDFcKCkuOGgsIFx0bXAyXCgpLjhoLCBcc3oKKyAgICAgICAgdWFkZHdfc3ogICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgdjIzLCBcc3oKKyAgICAgICAgdWFkZHdfc3ogICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgdjI0LCBcc3oKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgXHRtcDVcKCkuOGgsIFx0bXA2XCgpLjhoLCBcc3oKKyAgICAgICAgc3ViX3N6ICAgICAgICAgIFx0bXAzXCgpLjhoLCBcdG1wNFwoKS44aCwgIFx0bXAzXCgpLjhoLCBcdG1wNFwoKS44aCwgIFx0bXAxXCgpLjhoLCBcdG1wMlwoKS44aCwgXHN6CisgICAgICAgIHN1Yl9zeiAgICAgICAgICBcdG1wN1woKS44aCwgXHRtcDhcKCkuOGgsICBcdG1wN1woKS44aCwgXHRtcDhcKCkuOGgsICBcdG1wNVwoKS44aCwgXHRtcDZcKCkuOGgsIFxzegorICAgICAgICByc2hybl9zeiAgICAgICAgdjIsICB2MC44aCwgIHYxLjhoLCAgIzMsICBcc3ogLy8gb3V0IHAyCisKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgXHRtcDNcKCkuOGgsIFx0bXA0XCgpLjhoLCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIFx0bXAxXCgpLjhoLCBcdG1wMlwoKS44aCwgIHYyMCwgIHYyMywgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICBcdG1wM1woKS44aCwgXHRtcDRcKCkuOGgsICB2MjQsICB2MjcsIFxzegorICAgICAgICByc2hybl9zeiAgICAgICAgdjMsICB2MC44aCwgIHYxLjhoLCAgIzMsICBcc3ogLy8gb3V0IHAxCisKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgXHRtcDdcKCkuOGgsIFx0bXA4XCgpLjhoLCBcc3oKKyAgICAgICAgc3ViX3N6ICAgICAgICAgIFx0bXAzXCgpLjhoLCBcdG1wNFwoKS44aCwgIFx0bXAzXCgpLjhoLCBcdG1wNFwoKS44aCwgIFx0bXAxXCgpLjhoLCBcdG1wMlwoKS44aCwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICBcdG1wNVwoKS44aCwgXHRtcDZcKCkuOGgsICB2MjEsICB2MjQsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgXHRtcDdcKCkuOGgsIFx0bXA4XCgpLjhoLCAgdjI1LCAgdjI3LCBcc3oKKyAgICAgICAgcnNocm5fc3ogICAgICAgIHY0LCAgdjAuOGgsICB2MS44aCwgICMzLCAgXHN6IC8vIG91dCBwMAorCisgICAgICAgIGFkZF9zeiAgICAgICAgICB2MC44aCwgIHYxLjhoLCAgdjAuOGgsICB2MS44aCwgIFx0bXAzXCgpLjhoLCBcdG1wNFwoKS44aCwgXHN6CisgICAgICAgIHN1Yl9zeiAgICAgICAgICBcdG1wN1woKS44aCwgXHRtcDhcKCkuOGgsICBcdG1wN1woKS44aCwgXHRtcDhcKCkuOGgsICBcdG1wNVwoKS44aCwgXHRtcDZcKCkuOGgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgXHRtcDFcKCkuOGgsIFx0bXAyXCgpLjhoLCAgdjIyLCAgdjI1LCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIFx0bXAzXCgpLjhoLCBcdG1wNFwoKS44aCwgIHYyNiwgIHYyNywgXHN6CisgICAgICAgIHJzaHJuX3N6ICAgICAgICB2NSwgIHYwLjhoLCAgdjEuOGgsICAjMywgIFxzeiAvLyBvdXQgcTAKKworICAgICAgICBhZGRfc3ogICAgICAgICAgdjAuOGgsICB2MS44aCwgIHYwLjhoLCAgdjEuOGgsICBcdG1wN1woKS44aCwgXHRtcDhcKCkuOGgsIFxzegorICAgICAgICBzdWJfc3ogICAgICAgICAgXHRtcDNcKCkuOGgsIFx0bXA0XCgpLjhoLCAgXHRtcDNcKCkuOGgsIFx0bXA0XCgpLjhoLCAgXHRtcDFcKCkuOGgsIFx0bXAyXCgpLjhoLCBcc3oKKyAgICAgICAgcnNocm5fc3ogICAgICAgIFx0bXA1LCAgdjAuOGgsICB2MS44aCwgICMzLCAgXHN6IC8vIG91dCBxMQorCisgICAgICAgIGFkZF9zeiAgICAgICAgICB2MC44aCwgIHYxLjhoLCAgdjAuOGgsICB2MS44aCwgIFx0bXAzXCgpLjhoLCBcdG1wNFwoKS44aCwgXHN6CisgICAgICAgIC8vIFRoZSBvdXRwdXQgaGVyZSBpcyB3cml0dGVuIGJhY2sgaW50byB0aGUgaW5wdXQgcmVnaXN0ZXJzLiBUaGlzIGRvZXNuJ3QKKyAgICAgICAgLy8gbWF0dGVyIGZvciB0aGUgZmxhdDhwYXJ0IGJlbG93LCBzaW5jZSB3ZSBvbmx5IHVwZGF0ZSB0aG9zZSBwaXhlbHMKKyAgICAgICAgLy8gd2hpY2ggd29uJ3QgYmUgdG91Y2hlZCBiZWxvdy4KKyAgICAgICAgYml0ICAgICAgICAgICAgIHYyMVxzeiwgdjJcc3osICB2NlxzegorICAgICAgICBiaXQgICAgICAgICAgICAgdjIyXHN6LCB2M1xzeiwgIHY2XHN6CisgICAgICAgIGJpdCAgICAgICAgICAgICB2MjNcc3osIHY0XHN6LCAgdjZcc3oKKyAgICAgICAgcnNocm5fc3ogICAgICAgIFx0bXA2LCAgdjAuOGgsICB2MS44aCwgICMzLCAgXHN6IC8vIG91dCBxMgorICAgICAgICBiaXQgICAgICAgICAgICAgdjI0XHN6LCB2NVxzeiwgIHY2XHN6CisgICAgICAgIGJpdCAgICAgICAgICAgICB2MjVcc3osIFx0bXA1XHN6LCAgdjZcc3oKKyAgICAgICAgYml0ICAgICAgICAgICAgIHYyNlxzeiwgXHRtcDZcc3osICB2NlxzegorLmVuZGlmCisuaWYgXHdkID09IDE2Cis2OgorICAgICAgICBvcnIgICAgICAgICAgICAgdjJcc3osICB2NlxzeiwgIHY3XHN6CisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgIHYyLmRbMF0KKy5pZmMgXHN6LCAuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgIHYyLmRbMV0KKyAgICAgICAgYWRkcyAgICAgICAgICAgIHg1LCAgeDUsICB4NgorICAgICAgICBiLm5lICAgICAgICAgICAgMWYKKy5lbHNlCisgICAgICAgIGNibnogICAgICAgICAgICB4NSwgIDFmCisuZW5kaWYKKyAgICAgICAgLy8gSWYgbm8gcGl4ZWxzIG5lZWRlZCBmbGF0OGluIG5vciBmbGF0OG91dCwganVtcCB0byBhCisgICAgICAgIC8vIHdyaXRlb3V0IG9mIHRoZSBpbm5lciA0IHBpeGVscworICAgICAgICBiciAgICAgICAgICAgICAgeDE0CisxOgorCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NSwgIHY3LmRbMF0KKy5pZmMgXHN6LCAuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NiwgIHY3LmRbMV0KKyAgICAgICAgYWRkcyAgICAgICAgICAgIHg1LCAgeDUsICB4NgorICAgICAgICBiLm5lICAgICAgICAgICAgMWYKKy5lbHNlCisgICAgICAgIGNibnogICAgICAgICAgICB4NSwgIDFmCisuZW5kaWYKKyAgICAgICAgLy8gSWYgbm8gcGl4ZWxzIG5lZWQgZmxhdDhvdXQsIGp1bXAgdG8gYSB3cml0ZW91dCBvZiB0aGUgaW5uZXIgNiBwaXhlbHMKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxNQorCisxOgorICAgICAgICAvLyBmbGF0OG91dAorICAgICAgICAvLyBUaGlzIHdyaXRlcyBhbGwgb3V0cHV0cyBpbnRvIHYyLXYxNyAoc2tpcHBpbmcgdjYgYW5kIHYxNikuCisgICAgICAgIC8vIElmIHRoaXMgcGFydCBpcyBza2lwcGVkLCB0aGUgb3V0cHV0IGlzIHJlYWQgZnJvbSB2MjEtdjI2ICh3aGljaCBpcyB0aGUgaW5wdXQKKyAgICAgICAgLy8gdG8gdGhpcyBzZWN0aW9uKS4KKyAgICAgICAgdXNobGxfc3ogICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MTYsICAjMywgIFxzeiAgICAgICAgICAgLy8gOCAqIHYxNgorICAgICAgICB1c3Vid19zeiAgICAgICAgdjAuOGgsICB2MS44aCwgIHYwLjhoLCAgdjEuOGgsICB2MTYsIFxzeiAvLyA3ICogdjE2CisgICAgICAgIHVhZGR3X3N6ICAgICAgICB2MC44aCwgIHYxLjhoLCAgdjAuOGgsICB2MS44aCwgIHYxNywgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2OC44aCwgIHY5LjhoLCAgdjE3LCB2MTgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjEwLjhoLCB2MTEuOGgsIHYxOSwgdjIwLCBcc3oKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgdjguOGgsICB2OS44aCwgIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjguOGgsICB2OS44aCwgIHYxNiwgdjE3LCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIHYxMi44aCwgdjEzLjhoLCB2MjEsIHYyMiwgXHN6CisgICAgICAgIGFkZF9zeiAgICAgICAgICB2MC44aCwgIHYxLjhoLCAgdjAuOGgsICB2MS44aCwgIHYxMC44aCwgdjExLjhoLCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIHYxMC44aCwgdjExLjhoLCB2MTgsIHYyNSwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2MTQuOGgsIHYxNS44aCwgdjIzLCB2MjQsIFxzegorICAgICAgICBzdWJfc3ogICAgICAgICAgdjEwLjhoLCB2MTEuOGgsIHYxMC44aCwgdjExLjhoLCB2OC44aCwgIHY5LjhoLCAgXHN6CisgICAgICAgIGFkZF9zeiAgICAgICAgICB2MC44aCwgIHYxLjhoLCAgdjAuOGgsICB2MS44aCwgIHYxMi44aCwgdjEzLjhoLCBcc3oKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgdjE0LjhoLCB2MTUuOGgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjEyLjhoLCB2MTMuOGgsIHYxNiwgdjE4LCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIHYxNC44aCwgdjE1LjhoLCB2MTksIHYyNiwgXHN6CisgICAgICAgIHJzaHJuX3N6ICAgICAgICB2MiwgIHYwLjhoLCAgdjEuOGgsICAjNCwgIFxzegorCisgICAgICAgIGFkZF9zeiAgICAgICAgICB2MC44aCwgIHYxLjhoLCAgdjAuOGgsICB2MS44aCwgIHYxMC44aCwgdjExLjhoLCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIHY4LjhoLCAgdjkuOGgsICB2MTYsIHYxOSwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2MTAuOGgsIHYxMS44aCwgdjIwLCB2MjcsIFxzegorICAgICAgICBzdWJfc3ogICAgICAgICAgdjE0LjhoLCB2MTUuOGgsIHYxNC44aCwgdjE1LjhoLCB2MTIuOGgsIHYxMy44aCwgXHN6CisgICAgICAgIGJpZiAgICAgICAgICAgICB2MlxzeiwgIHYxN1xzeiwgdjdcc3oKKyAgICAgICAgcnNocm5fc3ogICAgICAgIHYzLCAgdjAuOGgsICB2MS44aCwgICM0LCAgXHN6CisKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgdjE0LjhoLCB2MTUuOGgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjEyLjhoLCB2MTMuOGgsIHYxNiwgdjIwLCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIHYxNC44aCwgdjE1LjhoLCB2MjEsIHYyOCwgXHN6CisgICAgICAgIHN1Yl9zeiAgICAgICAgICB2MTAuOGgsIHYxMS44aCwgdjEwLjhoLCB2MTEuOGgsIHY4LjhoLCAgdjkuOGgsICBcc3oKKyAgICAgICAgYmlmICAgICAgICAgICAgIHYzXHN6LCAgdjE4XHN6LCB2N1xzegorICAgICAgICByc2hybl9zeiAgICAgICAgdjQsICB2MC44aCwgIHYxLjhoLCAgIzQsICBcc3oKKworICAgICAgICBhZGRfc3ogICAgICAgICAgdjAuOGgsICB2MS44aCwgIHYwLjhoLCAgdjEuOGgsICB2MTAuOGgsIHYxMS44aCwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2OC44aCwgIHY5LjhoLCAgdjE2LCB2MjEsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjEwLjhoLCB2MTEuOGgsIHYyMiwgdjI5LCBcc3oKKyAgICAgICAgc3ViX3N6ICAgICAgICAgIHYxNC44aCwgdjE1LjhoLCB2MTQuOGgsIHYxNS44aCwgdjEyLjhoLCB2MTMuOGgsIFxzegorICAgICAgICBiaWYgICAgICAgICAgICAgdjRcc3osICB2MTlcc3osIHY3XHN6CisgICAgICAgIHJzaHJuX3N6ICAgICAgICB2NSwgIHYwLjhoLCAgdjEuOGgsICAjNCwgIFxzegorCisgICAgICAgIGFkZF9zeiAgICAgICAgICB2MC44aCwgIHYxLjhoLCAgdjAuOGgsICB2MS44aCwgIHYxNC44aCwgdjE1LjhoLCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIHYxMi44aCwgdjEzLjhoLCB2MTYsIHYyMiwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2MTQuOGgsIHYxNS44aCwgdjIzLCB2MzAsIFxzegorICAgICAgICBzdWJfc3ogICAgICAgICAgdjEwLjhoLCB2MTEuOGgsIHYxMC44aCwgdjExLjhoLCB2OC44aCwgIHY5LjhoLCAgXHN6CisgICAgICAgIGJpZiAgICAgICAgICAgICB2NVxzeiwgIHYyMFxzeiwgdjdcc3oKKyAgICAgICAgcnNocm5fc3ogICAgICAgIHY2LCAgdjAuOGgsICB2MS44aCwgICM0LCAgXHN6CisKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgdjEwLjhoLCB2MTEuOGgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjEwLjhoLCB2MTEuOGgsIHYxNiwgdjIzLCBcc3oKKyAgICAgICAgc3ViX3N6ICAgICAgICAgIHYxNC44aCwgdjE1LjhoLCB2MTQuOGgsIHYxNS44aCwgdjEyLjhoLCB2MTMuOGgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjEyLjhoLCB2MTMuOGgsIHYyNCwgdjMxLCBcc3oKKyAgICAgICAgYmlmICAgICAgICAgICAgIHY2XHN6LCAgdjIxXHN6LCB2N1xzegorICAgICAgICByc2hybl9zeiAgICAgICAgdjgsICB2MC44aCwgIHYxLjhoLCAgIzQsICBcc3oKKworICAgICAgICBhZGRfc3ogICAgICAgICAgdjAuOGgsICB2MS44aCwgIHYwLjhoLCAgdjEuOGgsICB2MTQuOGgsIHYxNS44aCwgXHN6CisgICAgICAgIHN1Yl9zeiAgICAgICAgICB2MTAuOGgsIHYxMS44aCwgdjEyLjhoLCB2MTMuOGgsIHYxMC44aCwgdjExLjhoLCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIHYxMi44aCwgdjEzLjhoLCB2MTcsIHYyNCwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2MTQuOGgsIHYxNS44aCwgdjI1LCB2MzEsIFxzegorICAgICAgICBiaWYgICAgICAgICAgICAgdjhcc3osICB2MjJcc3osIHY3XHN6CisgICAgICAgIHJzaHJuX3N6ICAgICAgICB2OSwgIHYwLjhoLCAgdjEuOGgsICAjNCwgIFxzegorCisgICAgICAgIGFkZF9zeiAgICAgICAgICB2MC44aCwgIHYxLjhoLCAgdjAuOGgsICB2MS44aCwgIHYxMC44aCwgdjExLjhoLCBcc3oKKyAgICAgICAgc3ViX3N6ICAgICAgICAgIHYxNC44aCwgdjE1LjhoLCB2MTQuOGgsIHYxNS44aCwgdjEyLjhoLCB2MTMuOGgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjEyLjhoLCB2MTMuOGgsIHYyNiwgdjMxLCBcc3oKKyAgICAgICAgYmlmICAgICAgICAgICAgIHY5XHN6LCAgdjIzXHN6LCB2N1xzegorICAgICAgICByc2hybl9zeiAgICAgICAgdjEwLCB2MC44aCwgIHYxLjhoLCAgIzQsICBcc3oKKworICAgICAgICBhZGRfc3ogICAgICAgICAgdjAuOGgsICB2MS44aCwgIHYwLjhoLCAgdjEuOGgsICB2MTQuOGgsIHYxNS44aCwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2MTQuOGgsIHYxNS44aCwgdjE4LCB2MjUsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjE4LjhoLCB2MTkuOGgsIHYxOSwgdjI2LCBcc3oKKyAgICAgICAgc3ViX3N6ICAgICAgICAgIHYxMi44aCwgdjEzLjhoLCB2MTIuOGgsIHYxMy44aCwgdjE0LjhoLCB2MTUuOGgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjE0LjhoLCB2MTUuOGgsIHYyNywgdjMxLCBcc3oKKyAgICAgICAgYmlmICAgICAgICAgICAgIHYxMFxzeiwgdjI0XHN6LCB2N1xzegorICAgICAgICByc2hybl9zeiAgICAgICAgdjExLCB2MC44aCwgIHYxLjhoLCAgIzQsICBcc3oKKworICAgICAgICBhZGRfc3ogICAgICAgICAgdjAuOGgsICB2MS44aCwgIHYwLjhoLCAgdjEuOGgsICB2MTIuOGgsIHYxMy44aCwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2MTIuOGgsIHYxMy44aCwgdjIwLCB2MjcsIFxzegorICAgICAgICBzdWJfc3ogICAgICAgICAgdjE0LjhoLCB2MTUuOGgsIHYxNC44aCwgdjE1LjhoLCB2MTguOGgsIHYxOS44aCwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2MTguOGgsIHYxOS44aCwgdjI4LCB2MzEsIFxzegorICAgICAgICBiaWYgICAgICAgICAgICAgdjExXHN6LCB2MjVcc3osIHY3XHN6CisgICAgICAgIHN1Yl9zeiAgICAgICAgICB2MTguOGgsIHYxOS44aCwgdjE4LjhoLCB2MTkuOGgsIHYxMi44aCwgdjEzLjhoLCBcc3oKKyAgICAgICAgcnNocm5fc3ogICAgICAgIHYxMiwgdjAuOGgsICB2MS44aCwgICM0LCAgXHN6CisKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgdjE0LjhoLCB2MTUuOGgsIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjE0LjhoLCB2MTUuOGgsIHYyMSwgdjI4LCBcc3oKKyAgICAgICAgdWFkZGxfc3ogICAgICAgIHYyMC44aCwgdjIxLjhoLCB2MjksIHYzMSwgXHN6CisgICAgICAgIGJpZiAgICAgICAgICAgICB2MTJcc3osIHYyNlxzeiwgdjdcc3oKKyAgICAgICAgcnNocm5fc3ogICAgICAgIHYxMywgdjAuOGgsICB2MS44aCwgICM0LCAgXHN6CisKKyAgICAgICAgYWRkX3N6ICAgICAgICAgIHYwLjhoLCAgdjEuOGgsICB2MC44aCwgIHYxLjhoLCAgdjE4LjhoLCB2MTkuOGgsIFxzegorICAgICAgICBzdWJfc3ogICAgICAgICAgdjIwLjhoLCB2MjEuOGgsIHYyMC44aCwgdjIxLjhoLCB2MTQuOGgsIHYxNS44aCwgXHN6CisgICAgICAgIHVhZGRsX3N6ICAgICAgICB2MTguOGgsIHYxOS44aCwgdjIyLCB2MjksIFxzegorICAgICAgICB1YWRkbF9zeiAgICAgICAgdjIyLjhoLCB2MjMuOGgsIHYzMCwgdjMxLCBcc3oKKyAgICAgICAgYmlmICAgICAgICAgICAgIHYxM1xzeiwgdjI3XHN6LCB2N1xzegorICAgICAgICByc2hybl9zeiAgICAgICAgdjE0LCB2MC44aCwgIHYxLjhoLCAgIzQsICBcc3oKKworICAgICAgICBhZGRfc3ogICAgICAgICAgdjAuOGgsICB2MS44aCwgIHYwLjhoLCAgdjEuOGgsICB2MjAuOGgsIHYyMS44aCwgXHN6CisgICAgICAgIHN1Yl9zeiAgICAgICAgICB2MjIuOGgsIHYyMy44aCwgdjIyLjhoLCB2MjMuOGgsIHYxOC44aCwgdjE5LjhoLCBcc3oKKyAgICAgICAgYmlmICAgICAgICAgICAgIHYxNFxzeiwgdjI4XHN6LCB2N1xzegorICAgICAgICByc2hybl9zeiAgICAgICAgdjE1LCB2MC44aCwgIHYxLjhoLCAgIzQsICBcc3oKKworICAgICAgICBhZGRfc3ogICAgICAgICAgdjAuOGgsICB2MS44aCwgIHYwLjhoLCAgdjEuOGgsICB2MjIuOGgsIHYyMy44aCwgXHN6CisgICAgICAgIGJpZiAgICAgICAgICAgICB2MTVcc3osIHYyOVxzeiwgdjdcc3oKKyAgICAgICAgcnNocm5fc3ogICAgICAgIHYxNywgdjAuOGgsICB2MS44aCwgICM0LCAgXHN6CisgICAgICAgIGJpZiAgICAgICAgICAgICB2MTdcc3osIHYzMFxzeiwgdjdcc3oKKy5lbmRpZgorLmVuZG0KKworLy8gRm9yIHdkIDw9IDgsIHdlIHVzZSB2MTYtdjE5IGFuZCB2MjgtdjMxIGZvciB0ZW1wIHJlZ2lzdGVycywKKy8vIHdoaWxlIHdlIG5lZWQgdGhvc2UgZm9yIGlucHV0cy9vdXRwdXRzIGluIHdkPTE2IGFuZCB1c2UgdjgtdjE1CisvLyBmb3IgdGVtcCByZWdpc3RlcnMgdGhlcmUgaW5zdGVhZC4KK2Z1bmN0aW9uIHZwOV9sb29wX2ZpbHRlcl80CisgICAgICAgIGxvb3BfZmlsdGVyICAgICA0LCAgLjhiLCAgMCwgICAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjgsIHYyOSwgdjMwLCB2MzEKKyAgICAgICAgcmV0Cis5OgorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisKK2Z1bmN0aW9uIHZwOV9sb29wX2ZpbHRlcl80XzE2Yl9taXhfNDQKKyAgICAgICAgbG9vcF9maWx0ZXIgICAgIDQsICAuMTZiLCA0NCwgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyOCwgdjI5LCB2MzAsIHYzMQorICAgICAgICByZXQKKzk6CisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKK2VuZGZ1bmMKKworZnVuY3Rpb24gdnA5X2xvb3BfZmlsdGVyXzgKKyAgICAgICAgbG9vcF9maWx0ZXIgICAgIDgsICAuOGIsICAwLCAgICB2MTYsIHYxNywgdjE4LCB2MTksIHYyOCwgdjI5LCB2MzAsIHYzMQorICAgICAgICByZXQKKzY6CisgICAgICAgIGJyICAgICAgICAgICAgICB4MTMKKzk6CisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKK2VuZGZ1bmMKKworZnVuY3Rpb24gdnA5X2xvb3BfZmlsdGVyXzhfMTZiX21peAorICAgICAgICBsb29wX2ZpbHRlciAgICAgOCwgIC4xNmIsIDg4LCAgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjI4LCB2MjksIHYzMCwgdjMxCisgICAgICAgIHJldAorNjoKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMworOToKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfMTYKKyAgICAgICAgbG9vcF9maWx0ZXIgICAgIDE2LCAuOGIsICAwLCAgICB2OCwgIHY5LCAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNQorICAgICAgICByZXQKKzk6CisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwXSwgMHgxMAorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisKK2Z1bmN0aW9uIHZwOV9sb29wX2ZpbHRlcl8xNl8xNmIKKyAgICAgICAgbG9vcF9maWx0ZXIgICAgIDE2LCAuMTZiLCAwLCAgICB2OCwgIHY5LCAgdjEwLCB2MTEsIHYxMiwgdjEzLCB2MTQsIHYxNQorICAgICAgICByZXQKKzk6CisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwXSwgMHgxMAorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisKKy5tYWNybyBsb29wX2ZpbHRlcl80CisgICAgICAgIGJsICAgICAgICAgICAgICB2cDlfbG9vcF9maWx0ZXJfNAorLmVuZG0KKworLm1hY3JvIGxvb3BfZmlsdGVyXzRfMTZiX21peCBtaXgKKyAgICAgICAgYmwgICAgICAgICAgICAgIHZwOV9sb29wX2ZpbHRlcl80XzE2Yl9taXhfXG1peAorLmVuZG0KKworLm1hY3JvIGxvb3BfZmlsdGVyXzgKKyAgICAgICAgLy8gY2FsY3VsYXRlIGFsdGVybmF0aXZlICdyZXR1cm4nIHRhcmdldHMKKyAgICAgICAgYWRyICAgICAgICAgICAgIHgxMywgNmYKKyAgICAgICAgYmwgICAgICAgICAgICAgIHZwOV9sb29wX2ZpbHRlcl84CisuZW5kbQorCisubWFjcm8gbG9vcF9maWx0ZXJfOF8xNmJfbWl4IG1peAorICAgICAgICAvLyBjYWxjdWxhdGUgYWx0ZXJuYXRpdmUgJ3JldHVybicgdGFyZ2V0cworICAgICAgICBhZHIgICAgICAgICAgICAgeDEzLCA2ZgorLmlmIFxtaXggPT0gNDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMSwgIzB4ZmZmZmZmZmYwMDAwMDAwMAorLmVsc2VpZiBcbWl4ID09IDg0CisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTEsICMweDAwMDAwMDAwZmZmZmZmZmYKKy5lbHNlCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTEsICMweGZmZmZmZmZmZmZmZmZmZmYKKy5lbmRpZgorICAgICAgICBibCAgICAgICAgICAgICAgdnA5X2xvb3BfZmlsdGVyXzhfMTZiX21peAorLmVuZG0KKworLm1hY3JvIGxvb3BfZmlsdGVyXzE2CisgICAgICAgIC8vIGNhbGN1bGF0ZSBhbHRlcm5hdGl2ZSAncmV0dXJuJyB0YXJnZXRzCisgICAgICAgIGFkciAgICAgICAgICAgICB4MTQsIDdmCisgICAgICAgIGFkciAgICAgICAgICAgICB4MTUsIDhmCisgICAgICAgIGJsICAgICAgICAgICAgICB2cDlfbG9vcF9maWx0ZXJfMTYKKy5lbmRtCisKKy5tYWNybyBsb29wX2ZpbHRlcl8xNl8xNmIKKyAgICAgICAgLy8gY2FsY3VsYXRlIGFsdGVybmF0aXZlICdyZXR1cm4nIHRhcmdldHMKKyAgICAgICAgYWRyICAgICAgICAgICAgIHgxNCwgN2YKKyAgICAgICAgYWRyICAgICAgICAgICAgIHgxNSwgOGYKKyAgICAgICAgYmwgICAgICAgICAgICAgIHZwOV9sb29wX2ZpbHRlcl8xNl8xNmIKKy5lbmRtCisKKworLy8gVGhlIHB1YmxpYyBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGhhdmUgZ290IHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgorLy8gdm9pZCBsb29wX2ZpbHRlcih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBtYl9saW0sIGludCBsaW0sIGludCBoZXZfdGhyKTsKKworZnVuY3Rpb24gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfNF84X25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsIHgzMAorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgIHgxLCBsc2wgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGJ9LCBbeDldLCB4MSAvLyBwMworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC44Yn0sIFt4MF0sIHgxIC8vIHEwCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhifSwgW3g5XSwgeDEgLy8gcDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuOGJ9LCBbeDBdLCB4MSAvLyBxMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44Yn0sIFt4OV0sIHgxIC8vIHAxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjhifSwgW3gwXSwgeDEgLy8gcTIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOGJ9LCBbeDldLCB4MSAvLyBwMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44Yn0sIFt4MF0sIHgxIC8vIHEzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4OSwgIHgxLCBsc2wgIzEKKworICAgICAgICBsb29wX2ZpbHRlcl80CisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuOGJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjhifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuOGJ9LCBbeDBdLCB4MQorCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfNDRfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgeDMwCisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgeDEsIGxzbCAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC4xNmJ9LCBbeDldLCB4MSAvLyBwMworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC4xNmJ9LCBbeDBdLCB4MSAvLyBxMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS4xNmJ9LCBbeDldLCB4MSAvLyBwMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNS4xNmJ9LCBbeDBdLCB4MSAvLyBxMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi4xNmJ9LCBbeDldLCB4MSAvLyBwMQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi4xNmJ9LCBbeDBdLCB4MSAvLyBxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMy4xNmJ9LCBbeDldLCB4MSAvLyBwMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy4xNmJ9LCBbeDBdLCB4MSAvLyBxMworICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfNF8xNmJfbWl4IDQ0CisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuMTZifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuMTZifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuMTZifSwgW3gwXSwgeDEKKworICAgICAgICBiciAgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzRfOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGJ9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC44Yn0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhifSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuOGJ9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44Yn0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjhifSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOGJ9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44Yn0sIFt4MF0sIHgxCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorICAgICAgICAvLyBNb3ZlIHgwL3g5IGZvcndhcmQgYnkgMiBwaXhlbHM7IHdlIGRvbid0IG5lZWQgdG8gcmV3cml0ZSB0aGUKKyAgICAgICAgLy8gb3V0ZXJtb3N0IDIgcGl4ZWxzIHNpbmNlIHRoZXkgYXJlbid0IGNoYW5nZWQuCisgICAgICAgIGFkZCAgICAgICAgICAgICB4OSwgIHg5LCAgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMgorCisgICAgICAgIHRyYW5zcG9zZV84eDhCICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkKKworICAgICAgICBsb29wX2ZpbHRlcl80CisKKyAgICAgICAgLy8gV2Ugb25seSB3aWxsIHdyaXRlIHRoZSBtaWQgNCBwaXhlbHMgYmFjazsgYWZ0ZXIgdGhlIGxvb3AgZmlsdGVyLAorICAgICAgICAvLyB0aGVzZSBhcmUgaW4gdjIyLCB2MjMsIHYyNCwgdjI1LCBvcmRlcmVkIGFzIHJvd3MgKDh4NCBwaXhlbHMpLgorICAgICAgICAvLyBXZSBuZWVkIHRvIHRyYW5zcG9zZSB0aGVtIHRvIGNvbHVtbnMsIGRvbmUgd2l0aCBhIDR4OCB0cmFuc3Bvc2UKKyAgICAgICAgLy8gKHdoaWNoIGluIHByYWN0aWNlIGlzIHR3byA0eDQgdHJhbnNwb3NlcyBvZiB0aGUgdHdvIDR4NCBoYWx2ZXMKKyAgICAgICAgLy8gb2YgdGhlIDh4NCBwaXhlbHM7IGludG8gNHg4IHBpeGVscykuCisgICAgICAgIHRyYW5zcG9zZV80eDhCICB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5zfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuc31bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLnN9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5zfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LnN9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5zfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuc31bMV0sIFt4MF0sIHgxCisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfbG9vcF9maWx0ZXJfaF80NF8xNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4OSwgIHgxLCBsc2wgIzMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMS44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLjhifSwgICBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIzLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhifSwgICBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNS5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuZH1bMV0sIFt4MF0sIHgxCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDksICB4OSwgICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzIKKworICAgICAgICB0cmFuc3Bvc2VfOHgxNkIgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5CisKKyAgICAgICAgbG9vcF9maWx0ZXJfNF8xNmJfbWl4IDQ0CisKKyAgICAgICAgdHJhbnNwb3NlXzR4MTZCIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5CisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLnN9WzJdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5zfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuc31bMl0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LnN9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC5zfVsyXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LnN9WzJdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5zfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuc31bM10sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLnN9WzFdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5zfVszXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuc31bMV0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LnN9WzNdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5zfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuc31bM10sIFt4MF0sIHgxCisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfbG9vcF9maWx0ZXJfdl84XzhfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgeDMwCisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgeDEsIGxzbCAjMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC44Yn0sIFt4OV0sIHgxIC8vIHAzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI0LjhifSwgW3gwXSwgeDEgLy8gcTAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGJ9LCBbeDldLCB4MSAvLyBwMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNS44Yn0sIFt4MF0sIHgxIC8vIHExCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLjhifSwgW3g5XSwgeDEgLy8gcDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuOGJ9LCBbeDBdLCB4MSAvLyBxMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMy44Yn0sIFt4OV0sIHgxIC8vIHAwCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI3LjhifSwgW3gwXSwgeDEgLy8gcTMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDksICB4OSwgIHgxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfOAorCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIxLjhifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi44Yn0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuOGJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNi44Yn0sIFt4MF0sIHgxCisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorNjoKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICB4MSwgbHNsICMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjhifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy44Yn0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LjhifSwgW3gwXSwgeDEKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworCisubWFjcm8gbWl4X3ZfMTYgbWl4CitmdW5jdGlvbiBmZl92cDlfbG9vcF9maWx0ZXJfdl9cbWl4XCgpXzE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsIHgzMAorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgIHgxLCBsc2wgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuMTZifSwgW3g5XSwgeDEgLy8gcDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuMTZifSwgW3gwXSwgeDEgLy8gcTAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuMTZifSwgW3g5XSwgeDEgLy8gcDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuMTZifSwgW3gwXSwgeDEgLy8gcTEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuMTZifSwgW3g5XSwgeDEgLy8gcDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuMTZifSwgW3gwXSwgeDEgLy8gcTIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuMTZifSwgW3g5XSwgeDEgLy8gcDAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuMTZifSwgW3gwXSwgeDEgLy8gcTMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDksICB4OSwgIHgxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfOF8xNmJfbWl4IFxtaXgKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YyMS4xNmJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC4xNmJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi4xNmJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS4xNmJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy4xNmJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNi4xNmJ9LCBbeDBdLCB4MQorCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKKzY6CisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgeDEsIGxzbCAjMQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi4xNmJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC4xNmJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy4xNmJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS4xNmJ9LCBbeDBdLCB4MQorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisuZW5kbQorCittaXhfdl8xNiA0OAorbWl4X3ZfMTYgODQKK21peF92XzE2IDg4CisKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzhfOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDEwLCB4MzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuOGJ9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNC44Yn0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLjhifSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuOGJ9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44Yn0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjhifSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuOGJ9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy44Yn0sIFt4MF0sIHgxCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMgorCisgICAgICAgIHRyYW5zcG9zZV84eDhCICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkKKworICAgICAgICBsb29wX2ZpbHRlcl84CisKKyAgICAgICAgLy8gRXZlbiB0aG91Z2ggb25seSA2IHBpeGVscyBwZXIgcm93IGhhdmUgYmVlbiBjaGFuZ2VkLCB3ZSB3cml0ZSB0aGUKKyAgICAgICAgLy8gZnVsbCA4IHBpeGVsIHJlZ2lzdGVycy4KKyAgICAgICAgdHJhbnNwb3NlXzh4OEIgIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIwLjhifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMS44Yn0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuOGJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNi44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjhifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjcuOGJ9LCBbeDBdLCB4MQorCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKKzY6CisgICAgICAgIC8vIElmIHdlIGRpZG4ndCBuZWVkIHRvIGRvIHRoZSBmbGF0OGluIHBhcnQsIHdlIHVzZSB0aGUgc2FtZSB3cml0ZWJhY2sKKyAgICAgICAgLy8gYXMgaW4gbG9vcF9maWx0ZXJfaF80XzguCisgICAgICAgIGFkZCAgICAgICAgICAgICB4OSwgIHg5LCAgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICAjMgorICAgICAgICB0cmFuc3Bvc2VfNHg4QiAgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLnN9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5zfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuc31bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LnN9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC5zfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LnN9WzFdLCBbeDBdLCB4MQorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCitlbmRmdW5jCisKKy5tYWNybyBtaXhfaF8xNiBtaXgKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl9oX1xtaXhcKClfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgeDMwCisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDksICB4MSwgbHNsICMzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhifSwgICBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIzLjhifSwgICBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMy5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI0LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNS44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjhifSwgICBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI3LmR9WzFdLCBbeDBdLCB4MQorCisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHg5LCAgeDEsIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgeDAsICB4MCwgIHgxLCBsc2wgIzMKKworICAgICAgICB0cmFuc3Bvc2VfOHgxNkIgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5CisKKyAgICAgICAgbG9vcF9maWx0ZXJfOF8xNmJfbWl4IFxtaXgKKworICAgICAgICB0cmFuc3Bvc2VfOHgxNkIgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5CisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIwLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMS44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjhifSwgICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LjhifSwgICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjYuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI2LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNy44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjcuZH1bMV0sIFt4MF0sIHgxCisKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorNjoKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg5LCAgeDksICAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgICMyCisgICAgICAgIHRyYW5zcG9zZV80eDE2QiB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5zfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuc31bMl0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLnN9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5zfVsyXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LnN9WzJdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5zfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuc31bMl0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLnN9WzFdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5zfVszXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuc31bMV0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLnN9WzNdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC5zfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuc31bM10sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LnN9WzFdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5zfVszXSwgW3gwXSwgeDEKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorZW5kZnVuYworLmVuZG0KKworbWl4X2hfMTYgNDgKK21peF9oXzE2IDg0CittaXhfaF8xNiA4OAorCitmdW5jdGlvbiBmZl92cDlfbG9vcF9maWx0ZXJfdl8xNl84X25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsIHgzMAorICAgICAgICBzdHAgICAgICAgICAgICAgZDE0LCBkMTUsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTAsIGQxMSwgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDgsICBkOSwgIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICB4MSwgbHNsICMzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhifSwgW3g5XSwgeDEgLy8gcDcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOGJ9LCBbeDBdLCB4MSAvLyBxMAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy44Yn0sIFt4OV0sIHgxIC8vIHA2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhifSwgW3gwXSwgeDEgLy8gcTEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOGJ9LCBbeDldLCB4MSAvLyBwNQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi44Yn0sIFt4MF0sIHgxIC8vIHEyCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LjhifSwgW3g5XSwgeDEgLy8gcDQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuOGJ9LCBbeDBdLCB4MSAvLyBxMworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC44Yn0sIFt4OV0sIHgxIC8vIHAzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhifSwgW3gwXSwgeDEgLy8gcTQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGJ9LCBbeDldLCB4MSAvLyBwMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOS44Yn0sIFt4MF0sIHgxIC8vIHE1CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLjhifSwgW3g5XSwgeDEgLy8gcDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuOGJ9LCBbeDBdLCB4MSAvLyBxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMy44Yn0sIFt4OV0sIHgxIC8vIHAwCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMxLjhifSwgW3gwXSwgeDEgLy8gcTcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDksICB4OSwgIHgxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfMTYKKworICAgICAgICAvLyBJZiB3ZSBkaWQgdGhlIGZsYXQ4b3V0IHBhcnQsIHdlIGdldCB0aGUgb3V0cHV0IGluCisgICAgICAgIC8vIHYyLXYxNyAoc2tpcHBpbmcgdjcgYW5kIHYxNikuIHg5IHBvaW50cyB0byB4MCAtIDcgKiBzdHJpZGUsCisgICAgICAgIC8vIHN0b3JlIHYyLXY5IHRoZXJlLCBhbmQgdjEwLXYxNyBpbnRvIHgwLgorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjhifSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEwLjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My44Yn0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxMS44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuOGJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTIuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y1LjhifSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEzLjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni44Yn0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNC44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djguOGJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTUuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y5LjhifSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LjhifSwgW3gwXSwgeDEKKzk6CisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwXSwgMHgxMAorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCis4OgorICAgICAgICBhZGQgICAgICAgICAgICAgeDksICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgLy8gSWYgd2UgZGlkbid0IGRvIHRoZSBmbGF0OG91dCBwYXJ0LCB0aGUgb3V0cHV0IGlzIGxlZnQgaW4gdGhlCisgICAgICAgIC8vIGlucHV0IHJlZ2lzdGVycy4KKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuOGJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjhifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy44Yn0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI2LjhifSwgW3gwXSwgeDEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDliCis3OgorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgIHgxLCBsc2wgIzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuOGJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLjhifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuOGJ9LCBbeDBdLCB4MQorICAgICAgICBiICAgICAgICAgICAgICAgOWIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfMTZfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgeDMwCisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgIHgxLCBsc2wgIzMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTYuMTZifSwgW3g5XSwgeDEgLy8gcDcKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuMTZifSwgW3gwXSwgeDEgLy8gcTAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTcuMTZifSwgW3g5XSwgeDEgLy8gcDYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuMTZifSwgW3gwXSwgeDEgLy8gcTEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguMTZifSwgW3g5XSwgeDEgLy8gcDUKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjYuMTZifSwgW3gwXSwgeDEgLy8gcTIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTkuMTZifSwgW3g5XSwgeDEgLy8gcDQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuMTZifSwgW3gwXSwgeDEgLy8gcTMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjAuMTZifSwgW3g5XSwgeDEgLy8gcDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjguMTZifSwgW3gwXSwgeDEgLy8gcTQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuMTZifSwgW3g5XSwgeDEgLy8gcDIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjkuMTZifSwgW3gwXSwgeDEgLy8gcTUKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuMTZifSwgW3g5XSwgeDEgLy8gcDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuMTZifSwgW3gwXSwgeDEgLy8gcTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjMuMTZifSwgW3g5XSwgeDEgLy8gcDAKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzEuMTZifSwgW3gwXSwgeDEgLy8gcTcKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDksICB4MSwgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDksICB4OSwgIHgxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfMTZfMTZiCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi4xNmJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTAuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My4xNmJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTEuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC4xNmJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTIuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS4xNmJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTMuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Ni4xNmJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTQuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2OC4xNmJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTUuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2OS4xNmJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTcuMTZifSwgW3gwXSwgeDEKKzk6CisgICAgICAgIGxkcCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEwLCBkMTEsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwXSwgMHgxMAorICAgICAgICBiciAgICAgICAgICAgICAgeDEwCis4OgorICAgICAgICBhZGQgICAgICAgICAgICAgeDksICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuMTZifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuMTZifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuMTZifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjYuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDliCis3OgorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgIHgxLCBsc2wgIzEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuMTZifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuMTZifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuMTZifSwgW3gwXSwgeDEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDliCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzE2XzhfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHgxMCwgeDMwCisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTQsIGQxNSwgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkOCwgIGQ5LCAgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgICM4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhifSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOGJ9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy44Yn0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI1LjhifSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOGJ9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi44Yn0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE5LjhifSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuOGJ9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC44Yn0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjhifSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGJ9LCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOS44Yn0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIyLjhifSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuOGJ9LCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMy44Yn0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMxLjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgwLCAgeDAsICB4MSwgbHNsICMzCisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHg5LCAgeDEsIGxzbCAjMworCisgICAgICAgIC8vIFRoZSAxNng4IHBpeGVscyByZWFkIGFib3ZlIGlzIGluIHR3byA4eDggYmxvY2tzOyB0aGUgbGVmdAorICAgICAgICAvLyBoYWxmIGluIHYxNi12MjMsIGFuZCB0aGUgcmlnaHQgaGFsZiBpbiB2MjQtdjMxLiBEbyB0d28gOHg4IHRyYW5zcG9zZXMKKyAgICAgICAgLy8gb2YgdGhpcywgdG8gZ2V0IG9uZSBjb2x1bW4gcGVyIHJlZ2lzdGVyLgorICAgICAgICB0cmFuc3Bvc2VfOHg4QiAgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYwLCB2MQorICAgICAgICB0cmFuc3Bvc2VfOHg4QiAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYwLCB2MQorCisgICAgICAgIGxvb3BfZmlsdGVyXzE2CisKKyAgICAgICAgdHJhbnNwb3NlXzh4OEIgIHYxNiwgdjIsICB2MywgIHY0LCAgdjUsICB2NiwgIHY4LCAgdjksICB2MCwgdjEKKyAgICAgICAgdHJhbnNwb3NlXzh4OEIgIHYxMCwgdjExLCB2MTIsIHYxMywgdjE0LCB2MTUsIHYxNywgdjMxLCB2MCwgdjEKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi44Yn0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEwLjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi44Yn0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxMS44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOGJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTIuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y0LjhifSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEzLjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS44Yn0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNC44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuOGJ9LCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTUuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y4LjhifSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2OS44Yn0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzMS44Yn0sIFt4MF0sIHgxCis5OgorICAgICAgICBsZHAgICAgICAgICAgICAgZDgsICBkOSwgIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxMCwgZDExLCBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTIsIGQxMywgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDE0LCBkMTUsIFtzcF0sIDB4MTAKKyAgICAgICAgYnIgICAgICAgICAgICAgIHgxMAorODoKKyAgICAgICAgLy8gVGhlIHNhbWUgd3JpdGViYWNrIGFzIGluIGxvb3BfZmlsdGVyX2hfOF84CisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDksICB4MSwgbHNsICMyCisgICAgICAgIHRyYW5zcG9zZV84eDhCICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YyMC44Yn0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjhifSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjEuOGJ9LCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS44Yn0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLjhifSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjYuOGJ9LCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy44Yn0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI3LjhifSwgW3gwXSwgeDEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDliCis3OgorICAgICAgICAvLyBUaGUgc2FtZSB3cml0ZWJhY2sgYXMgaW4gbG9vcF9maWx0ZXJfaF80XzgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4OSwgIHgxLCBsc2wgIzIKKyAgICAgICAgdHJhbnNwb3NlXzR4OEIgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLnN9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5zfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLnN9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC5zfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuc31bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LnN9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5zfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDliCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzE2XzE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIG1vdiAgICAgICAgICAgICB4MTAsIHgzMAorICAgICAgICBzdHAgICAgICAgICAgICAgZDE0LCBkMTUsIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3RwICAgICAgICAgICAgIGQxMiwgZDEzLCBbc3AsICMtMHgxMF0hCisgICAgICAgIHN0cCAgICAgICAgICAgICBkMTAsIGQxMSwgW3NwLCAjLTB4MTBdIQorICAgICAgICBzdHAgICAgICAgICAgICAgZDgsICBkOSwgIFtzcCwgIy0weDEwXSEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHg5LCAgeDAsICAjOAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuOGJ9LCAgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE3LjhifSwgICBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNS44Yn0sICAgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjhifSwgICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjcuOGJ9LCAgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhifSwgICBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOC44Yn0sICAgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI5LjhifSwgICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzAuOGJ9LCAgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIzLjhifSwgICBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzMS44Yn0sICAgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTYuZH1bMV0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI0LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy5kfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE4LmR9WzFdLCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTkuZH1bMV0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI3LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMC5kfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjguZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIxLmR9WzFdLCBbeDldLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyOS5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjIuZH1bMV0sIFt4OV0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMwLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YyMy5kfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MzEuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MCwgIHgwLCAgeDEsIGxzbCAjNAorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4OSwgIHgxLCBsc2wgIzQKKworICAgICAgICB0cmFuc3Bvc2VfOHgxNkIgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYwLCB2MQorICAgICAgICB0cmFuc3Bvc2VfOHgxNkIgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgdjMwLCB2MzEsIHYwLCB2MQorCisgICAgICAgIGxvb3BfZmlsdGVyXzE2XzE2YgorCisgICAgICAgIHRyYW5zcG9zZV84eDE2QiB2MTYsIHYyLCAgdjMsICB2NCwgIHY1LCAgdjYsICB2OCwgIHY5LCAgdjAsIHYxCisgICAgICAgIHRyYW5zcG9zZV84eDE2QiB2MTAsIHYxMSwgdjEyLCB2MTMsIHYxNCwgdjE1LCB2MTcsIHYzMSwgdjAsIHYxCisKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEwLjhifSwgICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyLjhifSwgICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTEuOGJ9LCAgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMuOGJ9LCAgICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxMi44Yn0sICAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NC44Yn0sICAgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEzLjhifSwgICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y1LjhifSwgICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTQuOGJ9LCAgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djYuOGJ9LCAgICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNS44Yn0sICAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2OC44Yn0sICAgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE3LjhifSwgICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y5LjhifSwgICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MzEuOGJ9LCAgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE2LmR9WzFdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxMC5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi5kfVsxXSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djExLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YzLmR9WzFdLCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTIuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djQuZH1bMV0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxMy5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2NS5kfVsxXSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djE0LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3Y2LmR9WzFdLCAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTUuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djguZH1bMV0sICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNy5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2OS5kfVsxXSwgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djMxLmR9WzFdLCBbeDBdLCB4MQorOToKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQ4LCAgZDksICBbc3BdLCAweDEwCisgICAgICAgIGxkcCAgICAgICAgICAgICBkMTAsIGQxMSwgW3NwXSwgMHgxMAorICAgICAgICBsZHAgICAgICAgICAgICAgZDEyLCBkMTMsIFtzcF0sIDB4MTAKKyAgICAgICAgbGRwICAgICAgICAgICAgIGQxNCwgZDE1LCBbc3BdLCAweDEwCisgICAgICAgIGJyICAgICAgICAgICAgICB4MTAKKzg6CisgICAgICAgIHN1YiAgICAgICAgICAgICB4OSwgIHgwLCAgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDksICB4MSwgbHNsICMzCisgICAgICAgIHRyYW5zcG9zZV84eDE2QiB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkKKworICAgICAgICBzdDEgICAgICAgICAgICAge3YyMC44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjAuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIxLjhifSwgICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMS5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjhifSwgICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuOGJ9LCAgIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LmR9WzFdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNi44Yn0sICAgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjYuZH1bMV0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI3LjhifSwgICBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNy5kfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgYiAgICAgICAgICAgICAgIDliCis3OgorICAgICAgICBzdWIgICAgICAgICAgICAgeDksICB4MCwgICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHg5LCAgeDEsIGxzbCAjMworICAgICAgICB0cmFuc3Bvc2VfNHgxNkIgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIyLnN9WzJdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5zfVswXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjMuc31bMl0sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LnN9WzBdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC5zfVsyXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuc31bMF0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI1LnN9WzJdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMi5zfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjIuc31bM10sIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djIzLnN9WzFdLCBbeDldLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyMy5zfVszXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuc31bMV0sIFt4OV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LnN9WzNdLCBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNS5zfVsxXSwgW3g5XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjUuc31bM10sIFt4MF0sIHgxCisgICAgICAgIGIgICAgICAgICAgICAgICA5YgorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOW1jXzE2YnBwX25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDltY18xNmJwcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjNjQyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDltY18xNmJwcF9uZW9uLlMKQEAgLTAsMCArMSw2MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgR29vZ2xlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIgorCisvLyBBbGwgcHVibGljIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKKy8vIHR5cGVkZWYgdm9pZCAoKnZwOV9tY19mdW5jKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBwdHJkaWZmX3QgcmVmX3N0cmlkZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSk7CisKK2Z1bmN0aW9uIGZmX3ZwOV9jb3B5MTI4X2FhcmNoNjQsIGV4cG9ydD0xCisxOgorICAgICAgICBsZHAgICAgICAgICAgICAgeDUsICB4NiwgIFt4Ml0KKyAgICAgICAgbGRwICAgICAgICAgICAgIHg3LCAgeDgsICBbeDIsICMxNl0KKyAgICAgICAgc3RwICAgICAgICAgICAgIHg1LCAgeDYsICBbeDBdCisgICAgICAgIGxkcCAgICAgICAgICAgICB4OSwgIHgxMCwgW3gyLCAjMzJdCisgICAgICAgIHN0cCAgICAgICAgICAgICB4NywgIHg4LCAgW3gwLCAjMTZdCisgICAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzEKKyAgICAgICAgbGRwICAgICAgICAgICAgIHgxMSwgeDEyLCBbeDIsICM0OF0KKyAgICAgICAgc3RwICAgICAgICAgICAgIHg5LCAgeDEwLCBbeDAsICMzMl0KKyAgICAgICAgc3RwICAgICAgICAgICAgIHgxMSwgeDEyLCBbeDAsICM0OF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIHg1LCAgeDYsICBbeDIsICM2NF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIHg3LCAgeDgsICBbeDIsICM4MF0KKyAgICAgICAgc3RwICAgICAgICAgICAgIHg1LCAgeDYsICBbeDAsICM2NF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIHg5LCAgeDEwLCBbeDIsICM5Nl0KKyAgICAgICAgc3RwICAgICAgICAgICAgIHg3LCAgeDgsICBbeDAsICM4MF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIHgxMSwgeDEyLCBbeDIsICMxMTJdCisgICAgICAgIHN0cCAgICAgICAgICAgICB4OSwgIHgxMCwgW3gwLCAjOTZdCisgICAgICAgIHN0cCAgICAgICAgICAgICB4MTEsIHgxMiwgW3gwLCAjMTEyXQorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MiwgIHgzCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnNjRfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgxLCAgeDEsICAjNjQKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgzLCAgeDMsICAjNjQKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuOGgsICB2NS44aCwgIHY2LjhoLCAgdjcuOGh9LCAgW3gyXSwgIzY0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuOGgsICB2MS44aCwgIHYyLjhoLCAgdjMuOGh9LCAgW3gwXSwgIzY0CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhoLCB2MjEuOGgsIHYyMi44aCwgdjIzLjhofSwgW3gyXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYwLjhoLCAgdjAuOGgsICB2NC44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjEuOGgsICB2MS44aCwgIHY1LjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhoLCB2MTcuOGgsIHYxOC44aCwgdjE5LjhofSwgW3gwXSwgeDEKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyLjhoLCAgdjIuOGgsICB2Ni44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjMuOGgsICB2My44aCwgIHY3LjhoCisgICAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzEKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44aCwgdjE2LjhoLCB2MjAuOGgKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNy44aCwgdjE3LjhoLCB2MjEuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC44aCwgIHYxLjhoLCAgdjIuOGgsICB2My44aH0sICBbeDVdLCAjNjQKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxOC44aCwgdjE4LjhoLCB2MjIuOGgKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxOS44aCwgdjE5LjhoLCB2MjMuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MTYuOGgsIHYxNy44aCwgdjE4LjhoLCB2MTkuOGh9LCBbeDVdLCB4MQorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9hdmczMl8xNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICB4MAorMToKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC44aCwgIHY1LjhoLCAgdjYuOGgsICB2Ny44aH0sICBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhoLCAgdjEuOGgsICB2Mi44aCwgIHYzLjhofSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhoLCB2MjEuOGgsIHYyMi44aCwgdjIzLjhofSwgW3gyXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYwLjhoLCAgdjAuOGgsICB2NC44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjEuOGgsICB2MS44aCwgIHY1LjhoCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhoLCB2MTcuOGgsIHYxOC44aCwgdjE5LjhofSwgW3gwXSwgeDEKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyLjhoLCAgdjIuOGgsICB2Ni44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjMuOGgsICB2My44aCwgIHY3LjhoCisgICAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNi44aCwgdjE2LjhoLCB2MjAuOGgKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxNy44aCwgdjE3LjhoLCB2MjEuOGgKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC44aCwgIHYxLjhoLCAgdjIuOGgsICB2My44aH0sICBbeDVdLCB4MQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE4LjhoLCB2MTguOGgsIHYyMi44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE5LjhoLCB2MTkuOGgsIHYyMy44aAorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi44aCwgdjE3LjhoLCB2MTguOGgsIHYxOS44aH0sIFt4NV0sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2F2ZzE2XzE2X25lb24sIGV4cG9ydD0xCisxOgorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjhoLCB2My44aH0sICBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhoLCB2MS44aH0sICBbeDBdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC44aCwgIHYwLjhoLCAgdjIuOGgKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxLjhoLCAgdjEuOGgsICB2My44aAorICAgICAgICBzdWJzICAgICAgICAgICAgdzQsICB3NCwgICMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuOGgsIHYxLjhofSwgIFt4MF0sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2F2ZzhfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDAKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuOGh9LCAgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44aH0sICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjhofSwgIFt4Ml0sIHgzCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC44aCwgIHYwLjhoLCAgdjIuOGgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS44aH0sICBbeDBdLCB4MQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjEuOGgsICB2MS44aCwgIHYzLjhoCisgICAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC44aH0sICBbeDVdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjhofSwgIFt4NV0sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2F2ZzRfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDAKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuNGh9LCAgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC40aH0sICBbeDBdLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRofSwgIFt4Ml0sIHgzCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC40aCwgIHYwLjRoLCAgdjIuNGgKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS40aH0sICBbeDBdLCB4MQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjEuNGgsICB2MS40aCwgIHYzLjRoCisgICAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC40aH0sICBbeDVdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjhifSwgIFt4NV0sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKworCisvLyBFeHRyYWN0IGEgdmVjdG9yIGZyb20gc3JjMS1zcmMyIGFuZCBzcmM0LXNyYzUgKHNyYzEtc3JjMyBhbmQgc3JjNC1zcmM2CisvLyBmb3Igc2l6ZSA+PSAxNiksIGFuZCBtdWx0aXBseS1hY2N1bXVsYXRlIGludG8gZHN0MSBhbmQgZHN0NSAob3IKKy8vIGRzdDEtZHN0MiBhbmQgZHN0NS1kc3Q2IGZvciBzaXplID49IDggYW5kIGRzdDEtZHN0NCBhbmQgZHN0NS1kc3Q4CisvLyBmb3Igc2l6ZSA+PSAxNikKKy5tYWNybyBleHRtbGFsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdDgsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIG9mZnNldCwgc2l6ZQorICAgICAgICBleHQgICAgICAgICAgICAgdjIwLjE2YiwgXHNyYzFcKCkuMTZiLCBcc3JjMlwoKS4xNmIsICMoMipcb2Zmc2V0KQorICAgICAgICBleHQgICAgICAgICAgICAgdjIyLjE2YiwgXHNyYzRcKCkuMTZiLCBcc3JjNVwoKS4xNmIsICMoMipcb2Zmc2V0KQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDFcKCkuNHMsIHYyMC40aCwgdjAuaFtcb2Zmc2V0XQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDVcKCkuNHMsIHYyMi40aCwgdjAuaFtcb2Zmc2V0XQorLmlmIFxzaXplID49IDE2CisgICAgICAgIGV4dCAgICAgICAgICAgICB2MjEuMTZiLCBcc3JjMlwoKS4xNmIsIFxzcmMzXCgpLjE2YiwgIygyKlxvZmZzZXQpCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MjMuMTZiLCBcc3JjNVwoKS4xNmIsIFxzcmM2XCgpLjE2YiwgIygyKlxvZmZzZXQpCisuZW5kaWYKKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIHNtbGFsMiAgICAgICAgICBcZHN0MlwoKS40cywgdjIwLjhoLCB2MC5oW1xvZmZzZXRdCisgICAgICAgIHNtbGFsMiAgICAgICAgICBcZHN0NlwoKS40cywgdjIyLjhoLCB2MC5oW1xvZmZzZXRdCisuZW5kaWYKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDNcKCkuNHMsIHYyMS40aCwgdjAuaFtcb2Zmc2V0XQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDdcKCkuNHMsIHYyMy40aCwgdjAuaFtcb2Zmc2V0XQorICAgICAgICBzbWxhbDIgICAgICAgICAgXGRzdDRcKCkuNHMsIHYyMS44aCwgdjAuaFtcb2Zmc2V0XQorICAgICAgICBzbWxhbDIgICAgICAgICAgXGRzdDhcKCkuNHMsIHYyMy44aCwgdjAuaFtcb2Zmc2V0XQorLmVuZGlmCisuZW5kbQorCisKKy8vIEluc3RhbnRpYXRlIGEgaG9yaXpvbnRhbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBzaXplLgorLy8gVGhpcyBjYW4gd29yayBvbiA0LCA4IG9yIDE2IHBpeGVscyBpbiBwYXJhbGxlbDsgZm9yIGxhcmdlcgorLy8gd2lkdGhzIGl0IHdpbGwgZG8gMTYgcGl4ZWxzIGF0IGEgdGltZSBhbmQgbG9vcCBob3Jpem9udGFsbHkuCisvLyBUaGUgYWN0dWFsIHdpZHRoIChpbiBieXRlcykgaXMgcGFzc2VkIGluIHg1LCB0aGUgaGVpZ2h0IGluIHc0IGFuZAorLy8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgaW4geDkuCisubWFjcm8gZG9fOHRhcF9oIHR5cGUsIHNpemUKK2Z1bmN0aW9uIFx0eXBlXCgpXzh0YXBfXHNpemVcKCloCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgIzYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg2LCAgeDAsICB4MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDcsICB4MiwgIHgzCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MSwgIHgxLCAgeDEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgzLCAgeDMsICB4MworICAgICAgICAvLyBPbmx5IHNpemUgPj0gMTYgbG9vcHMgaG9yaXpvbnRhbGx5IGFuZCBuZWVkcworICAgICAgICAvLyByZWR1Y2VkIGRzdCBzdHJpZGUKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBzdWIgICAgICAgICAgICAgeDEsICB4MSwgIHg1CisuZW5kaWYKKyAgICAgICAgLy8gc2l6ZSA+PSAxNiBsb2FkcyB0d28gcXdvcmRzIGFuZCBpbmNyZW1lbnRzIHIyLAorICAgICAgICAvLyBmb3Igc2l6ZSA0LzggaXQncyBlbm91Z2ggd2l0aCBvbmUgcXdvcmQgYW5kIG5vCisgICAgICAgIC8vIHBvc3RpbmNyZW1lbnQKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBzdWIgICAgICAgICAgICAgeDMsICB4MywgIHg1CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MywgIHgzLCAgIzE2CisuZW5kaWYKKyAgICAgICAgLy8gTG9hZCB0aGUgZmlsdGVyIHZlY3RvcgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhofSwgIFt4OV0KKzE6CisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg5LCAgeDUKKy5lbmRpZgorICAgICAgICAvLyBMb2FkIHNyYworLmlmIFxzaXplID49IDE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuOGgsICB2Ni44aCwgIHY3LjhofSwgIFt4Ml0sICM0OAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44aCwgdjE3LjhoLCB2MTguOGh9LCBbeDddLCAjNDgKKy5lbHNlCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djUuOGgsICB2Ni44aH0sICBbeDJdCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE2LjhoLCB2MTcuOGh9LCBbeDddCisuZW5kaWYKKzI6CisKKyAgICAgICAgc211bGwgICAgICAgICAgIHYxLjRzLCAgdjUuNGgsICB2MC5oWzBdCisgICAgICAgIHNtdWxsICAgICAgICAgICB2MjQuNHMsIHYxNi40aCwgdjAuaFswXQorLmlmIFxzaXplID49IDgKKyAgICAgICAgc211bGwyICAgICAgICAgIHYyLjRzLCAgdjUuOGgsICB2MC5oWzBdCisgICAgICAgIHNtdWxsMiAgICAgICAgICB2MjUuNHMsIHYxNi44aCwgdjAuaFswXQorLmVuZGlmCisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgc211bGwgICAgICAgICAgIHYzLjRzLCAgdjYuNGgsICB2MC5oWzBdCisgICAgICAgIHNtdWxsICAgICAgICAgICB2MjYuNHMsIHYxNy40aCwgdjAuaFswXQorICAgICAgICBzbXVsbDIgICAgICAgICAgdjQuNHMsICB2Ni44aCwgIHYwLmhbMF0KKyAgICAgICAgc211bGwyICAgICAgICAgIHYyNy40cywgdjE3LjhoLCB2MC5oWzBdCisuZW5kaWYKKyAgICAgICAgZXh0bWxhbCAgICAgICAgIHYxLCAgdjIsICB2MywgIHY0LCAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2NSwgIHY2LCAgdjcsICB2MTYsIHYxNywgdjE4LCAxLCBcc2l6ZQorICAgICAgICBleHRtbGFsICAgICAgICAgdjEsICB2MiwgIHYzLCAgdjQsICB2MjQsIHYyNSwgdjI2LCB2MjcsIHY1LCAgdjYsICB2NywgIHYxNiwgdjE3LCB2MTgsIDIsIFxzaXplCisgICAgICAgIGV4dG1sYWwgICAgICAgICB2MSwgIHYyLCAgdjMsICB2NCwgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjUsICB2NiwgIHY3LCAgdjE2LCB2MTcsIHYxOCwgMywgXHNpemUKKyAgICAgICAgZXh0bWxhbCAgICAgICAgIHYxLCAgdjIsICB2MywgIHY0LCAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2NSwgIHY2LCAgdjcsICB2MTYsIHYxNywgdjE4LCA0LCBcc2l6ZQorICAgICAgICBleHRtbGFsICAgICAgICAgdjEsICB2MiwgIHYzLCAgdjQsICB2MjQsIHYyNSwgdjI2LCB2MjcsIHY1LCAgdjYsICB2NywgIHYxNiwgdjE3LCB2MTgsIDUsIFxzaXplCisgICAgICAgIGV4dG1sYWwgICAgICAgICB2MSwgIHYyLCAgdjMsICB2NCwgIHYyNCwgdjI1LCB2MjYsIHYyNywgdjUsICB2NiwgIHY3LCAgdjE2LCB2MTcsIHYxOCwgNiwgXHNpemUKKyAgICAgICAgZXh0bWxhbCAgICAgICAgIHYxLCAgdjIsICB2MywgIHY0LCAgdjI0LCB2MjUsIHYyNiwgdjI3LCB2NSwgIHY2LCAgdjcsICB2MTYsIHYxNywgdjE4LCA3LCBcc2l6ZQorCisgICAgICAgIC8vIFJvdW5kLCBzaGlmdCBhbmQgc2F0dXJhdGUKKyAgICAgICAgLy8gVGhlIHNxcnNocnVuIHRha2VzIGNhcmUgb2YgY2xhbXBpbmcgbmVnYXRpdmUgdmFsdWVzIHRvIHplcm8sIGJ1dAorICAgICAgICAvLyB3ZSBtYW51YWxseSBuZWVkIHRvIGRvIHVtaW4gd2l0aCB0aGUgbWF4IHBpeGVsIHZhbHVlLgorICAgICAgICBzcXJzaHJ1biAgICAgICAgdjEuNGgsICB2MS40cywgICM3CisgICAgICAgIHNxcnNocnVuICAgICAgICB2MjQuNGgsIHYyNC40cywgIzcKKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIHNxcnNocnVuMiAgICAgICB2MS44aCwgIHYyLjRzLCAgIzcKKyAgICAgICAgc3Fyc2hydW4yICAgICAgIHYyNC44aCwgdjI1LjRzLCAjNworICAgICAgICB1bWluICAgICAgICAgICAgdjEuOGgsICB2MS44aCwgIHYzMS44aAorICAgICAgICB1bWluICAgICAgICAgICAgdjI0LjhoLCB2MjQuOGgsIHYzMS44aAorLmlmIFxzaXplID49IDE2CisgICAgICAgIHNxcnNocnVuICAgICAgICB2Mi40aCwgIHYzLjRzLCAgIzcKKyAgICAgICAgc3Fyc2hydW4gICAgICAgIHYyNS40aCwgdjI2LjRzLCAjNworICAgICAgICBzcXJzaHJ1bjIgICAgICAgdjIuOGgsICB2NC40cywgICM3CisgICAgICAgIHNxcnNocnVuMiAgICAgICB2MjUuOGgsIHYyNy40cywgIzcKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHYyLjhoLCAgdjIuOGgsICB2MzEuOGgKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHYyNS44aCwgdjI1LjhoLCB2MzEuOGgKKy5lbmRpZgorLmVsc2UKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHYxLjRoLCAgdjEuNGgsICB2MzEuNGgKKyAgICAgICAgdW1pbiAgICAgICAgICAgIHYyNC40aCwgdjI0LjRoLCB2MzEuNGgKKy5lbmRpZgorICAgICAgICAvLyBBdmVyYWdlCisuaWZjIFx0eXBlLGF2ZworLmlmIFxzaXplID49IDE2CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuOGgsICB2NC44aH0sICBbeDBdCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI5LjhoLCB2MzAuOGh9LCBbeDZdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MS44aCwgIHYxLjhoLCAgdjMuOGgKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyLjhoLCAgdjIuOGgsICB2NC44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjI0LjhoLCB2MjQuOGgsIHYyOS44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjI1LjhoLCB2MjUuOGgsIHYzMC44aAorLmVsc2VpZiBcc2l6ZSA+PSA4CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuOGh9LCAgW3gwXQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhofSwgIFt4Nl0KKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxLjhoLCAgdjEuOGgsICB2My44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjI0LjhoLCB2MjQuOGgsIHY0LjhoCisuZWxzZQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLjRofSwgIFt4MF0KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC40aH0sICBbeDZdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MS40aCwgIHYxLjRoLCAgdjMuNGgKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyNC40aCwgdjI0LjRoLCB2NC40aAorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgLy8gU3RvcmUgYW5kIGxvb3AgaG9yaXpvbnRhbGx5IChmb3Igc2l6ZSA+PSAxNikKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBzdWJzICAgICAgICAgICAgeDksICB4OSwgICMzMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjhoLCAgdjIuOGh9LCAgW3gwXSwgIzMyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjhoLCB2MjUuOGh9LCBbeDZdLCAjMzIKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDNmCisgICAgICAgIG1vdiAgICAgICAgICAgICB2NS4xNmIsICB2Ny4xNmIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHYxNi4xNmIsIHYxOC4xNmIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Ni44aCwgIHY3LjhofSwgIFt4Ml0sICMzMgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNy44aCwgdjE4LjhofSwgW3g3XSwgIzMyCisgICAgICAgIGIgICAgICAgICAgICAgICAyYgorLmVsc2VpZiBcc2l6ZSA9PSA4CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuOGh9LCAgW3gwXQorICAgICAgICBzdDEgICAgICAgICAgICAge3YyNC44aH0sIFt4Nl0KKy5lbHNlIC8vIFxzaXplID09IDQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS40aH0sICBbeDBdCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjRofSwgW3g2XQorLmVuZGlmCiszOgorICAgICAgICAvLyBMb29wIHZlcnRpY2FsbHkKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgwLCAgeDAsICB4MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDYsICB4NiwgIHgxCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHgyLCAgeDMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg3LCAgeDcsICB4MworICAgICAgICBzdWJzICAgICAgICAgICAgdzQsICB3NCwgICMyCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKKy5tYWNybyBkb184dGFwX2hfc2l6ZSBzaXplCitkb184dGFwX2ggcHV0LCBcc2l6ZQorZG9fOHRhcF9oIGF2ZywgXHNpemUKKy5lbmRtCisKK2RvXzh0YXBfaF9zaXplIDQKK2RvXzh0YXBfaF9zaXplIDgKK2RvXzh0YXBfaF9zaXplIDE2CisKKy5tYWNybyBkb184dGFwX2hfZnVuYyB0eXBlLCBmaWx0ZXIsIG9mZnNldCwgc2l6ZSwgYnBwCitmdW5jdGlvbiBmZl92cDlfXHR5cGVcKClfXGZpbHRlclwoKVxzaXplXCgpX2hfXGJwcFwoKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtdm5pICAgICAgICAgICAgdjMxLjhoLCAjKCgweGZmIDw8IChcYnBwIC0gOCkpICYgMHhmZiksIGxzbCAjOAorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDYsICBYKGZmX3ZwOV9zdWJwZWxfZmlsdGVycyksIDI1Nipcb2Zmc2V0CisgICAgICAgIGNtcCAgICAgICAgICAgICB3NSwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4OSwgIHg2LCAgdzUsIHV4dHcgIzQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgIzIqXHNpemUKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfOHRhcF8xNmgKKy5lbHNlCisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwX1xzaXplXCgpaAorLmVuZGlmCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF9oX2ZpbHRlcnMgc2l6ZSwgYnBwCitkb184dGFwX2hfZnVuYyBwdXQsIHJlZ3VsYXIsIDEsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBhdmcsIHJlZ3VsYXIsIDEsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBwdXQsIHNoYXJwLCAgIDIsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBhdmcsIHNoYXJwLCAgIDIsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBwdXQsIHNtb290aCwgIDAsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBhdmcsIHNtb290aCwgIDAsIFxzaXplLCBcYnBwCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF9oX2ZpbHRlcnNfYnBwIGJwcAorZG9fOHRhcF9oX2ZpbHRlcnMgNjQsIFxicHAKK2RvXzh0YXBfaF9maWx0ZXJzIDMyLCBcYnBwCitkb184dGFwX2hfZmlsdGVycyAxNiwgXGJwcAorZG9fOHRhcF9oX2ZpbHRlcnMgOCwgIFxicHAKK2RvXzh0YXBfaF9maWx0ZXJzIDQsICBcYnBwCisuZW5kbQorCitkb184dGFwX2hfZmlsdGVyc19icHAgMTAKK2RvXzh0YXBfaF9maWx0ZXJzX2JwcCAxMgorCisKKy8vIFZlcnRpY2FsIGZpbHRlcnMKKworLy8gUm91bmQsIHNoaWZ0IGFuZCBzYXR1cmF0ZSBhbmQgc3RvcmUgcmVnMS1yZWc0CisubWFjcm8gZG9fc3RvcmU0IHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIG1pbnJlZywgdHlwZQorICAgICAgICBzcXJzaHJ1biAgICAgICAgXHJlZzFcKCkuNGgsICBccmVnMVwoKS40cywgIzcKKyAgICAgICAgc3Fyc2hydW4gICAgICAgIFxyZWcyXCgpLjRoLCAgXHJlZzJcKCkuNHMsICM3CisgICAgICAgIHNxcnNocnVuICAgICAgICBccmVnM1woKS40aCwgIFxyZWczXCgpLjRzLCAjNworICAgICAgICBzcXJzaHJ1biAgICAgICAgXHJlZzRcKCkuNGgsICBccmVnNFwoKS40cywgIzcKKy5pZmMgXHR5cGUsYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7XHRtcDFcKCkuNGh9LCAgW3g3XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcdG1wMlwoKS40aH0sICBbeDddLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge1x0bXAzXCgpLjRofSwgIFt4N10sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7XHRtcDRcKCkuNGh9LCAgW3g3XSwgeDEKKy5lbmRpZgorICAgICAgICB1bWluICAgICAgICAgICAgXHJlZzFcKCkuNGgsICBccmVnMVwoKS40aCwgIFxtaW5yZWdcKCkuNGgKKyAgICAgICAgdW1pbiAgICAgICAgICAgIFxyZWcyXCgpLjRoLCAgXHJlZzJcKCkuNGgsICBcbWlucmVnXCgpLjRoCisgICAgICAgIHVtaW4gICAgICAgICAgICBccmVnM1woKS40aCwgIFxyZWczXCgpLjRoLCAgXG1pbnJlZ1woKS40aAorICAgICAgICB1bWluICAgICAgICAgICAgXHJlZzRcKCkuNGgsICBccmVnNFwoKS40aCwgIFxtaW5yZWdcKCkuNGgKKy5pZmMgXHR5cGUsYXZnCisgICAgICAgIHVyaGFkZCAgICAgICAgICBccmVnMVwoKS40aCwgIFxyZWcxXCgpLjRoLCAgXHRtcDFcKCkuNGgKKyAgICAgICAgdXJoYWRkICAgICAgICAgIFxyZWcyXCgpLjRoLCAgXHJlZzJcKCkuNGgsICBcdG1wMlwoKS40aAorICAgICAgICB1cmhhZGQgICAgICAgICAgXHJlZzNcKCkuNGgsICBccmVnM1woKS40aCwgIFx0bXAzXCgpLjRoCisgICAgICAgIHVyaGFkZCAgICAgICAgICBccmVnNFwoKS40aCwgIFxyZWc0XCgpLjRoLCAgXHRtcDRcKCkuNGgKKy5lbmRpZgorICAgICAgICBzdDEgICAgICAgICAgICAge1xyZWcxXCgpLjRofSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7XHJlZzJcKCkuNGh9LCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtccmVnM1woKS40aH0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge1xyZWc0XCgpLjRofSwgIFt4MF0sIHgxCisuZW5kbQorCisvLyBSb3VuZCwgc2hpZnQgYW5kIHNhdHVyYXRlIGFuZCBzdG9yZSByZWcxLTgsIHdoZXJlCisvLyByZWcxLTIsIHJlZzMtNCBldGMgcGFpcndpc2UgY29ycmVzcG9uZCB0byA0IHJvd3MuCisubWFjcm8gZG9fc3RvcmU4IHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQsIHJlZzUsIHJlZzYsIHJlZzcsIHJlZzgsIG1pbnJlZywgdHlwZQorICAgICAgICBzcXJzaHJ1biAgICAgICAgXHJlZzFcKCkuNGgsICBccmVnMVwoKS40cywgIzcKKyAgICAgICAgc3Fyc2hydW4yICAgICAgIFxyZWcxXCgpLjhoLCAgXHJlZzJcKCkuNHMsICM3CisgICAgICAgIHNxcnNocnVuICAgICAgICBccmVnMlwoKS40aCwgIFxyZWczXCgpLjRzLCAjNworICAgICAgICBzcXJzaHJ1bjIgICAgICAgXHJlZzJcKCkuOGgsICBccmVnNFwoKS40cywgIzcKKyAgICAgICAgc3Fyc2hydW4gICAgICAgIFxyZWczXCgpLjRoLCAgXHJlZzVcKCkuNHMsICM3CisgICAgICAgIHNxcnNocnVuMiAgICAgICBccmVnM1woKS44aCwgIFxyZWc2XCgpLjRzLCAjNworICAgICAgICBzcXJzaHJ1biAgICAgICAgXHJlZzRcKCkuNGgsICBccmVnN1woKS40cywgIzcKKyAgICAgICAgc3Fyc2hydW4yICAgICAgIFxyZWc0XCgpLjhoLCAgXHJlZzhcKCkuNHMsICM3CisuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge1xyZWc1XCgpLjhofSwgIFt4N10sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7XHJlZzZcKCkuOGh9LCAgW3g3XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtccmVnN1woKS44aH0sICBbeDddLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge1xyZWc4XCgpLjhofSwgIFt4N10sIHgxCisuZW5kaWYKKyAgICAgICAgdW1pbiAgICAgICAgICAgIFxyZWcxXCgpLjhoLCAgXHJlZzFcKCkuOGgsICBcbWlucmVnXCgpLjhoCisgICAgICAgIHVtaW4gICAgICAgICAgICBccmVnMlwoKS44aCwgIFxyZWcyXCgpLjhoLCAgXG1pbnJlZ1woKS44aAorICAgICAgICB1bWluICAgICAgICAgICAgXHJlZzNcKCkuOGgsICBccmVnM1woKS44aCwgIFxtaW5yZWdcKCkuOGgKKyAgICAgICAgdW1pbiAgICAgICAgICAgIFxyZWc0XCgpLjhoLCAgXHJlZzRcKCkuOGgsICBcbWlucmVnXCgpLjhoCisuaWZjIFx0eXBlLGF2ZworICAgICAgICB1cmhhZGQgICAgICAgICAgXHJlZzFcKCkuOGgsICBccmVnMVwoKS44aCwgIFxyZWc1XCgpLjhoCisgICAgICAgIHVyaGFkZCAgICAgICAgICBccmVnMlwoKS44aCwgIFxyZWcyXCgpLjhoLCAgXHJlZzZcKCkuOGgKKyAgICAgICAgdXJoYWRkICAgICAgICAgIFxyZWczXCgpLjhoLCAgXHJlZzNcKCkuOGgsICBccmVnN1woKS44aAorICAgICAgICB1cmhhZGQgICAgICAgICAgXHJlZzRcKCkuOGgsICBccmVnNFwoKS44aCwgIFxyZWc4XCgpLjhoCisuZW5kaWYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtccmVnMVwoKS44aH0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge1xyZWcyXCgpLjhofSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7XHJlZzNcKCkuOGh9LCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtccmVnNFwoKS44aH0sICBbeDBdLCB4MQorLmVuZG0KKworLy8gRXZhbHVhdGUgdGhlIGZpbHRlciB0d2ljZSBpbiBwYXJhbGxlbCwgZnJvbSB0aGUgaW5wdXRzIHNyYzEtc3JjOSBpbnRvIGRzdDEtZHN0MgorLy8gKHNyYzEtc3JjOCBpbnRvIGRzdDEsIHNyYzItc3JjOSBpbnRvIGRzdDIpLgorLm1hY3JvIGNvbnZvbHZlNCBkc3QxLCBkc3QyLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCB0bXAxLCB0bXAyCisgICAgICAgIHNtdWxsICAgICAgICAgICBcZHN0MVwoKS40cywgXHNyYzFcKCkuNGgsIHYwLmhbMF0KKyAgICAgICAgc211bGwgICAgICAgICAgIFxkc3QyXCgpLjRzLCBcc3JjMlwoKS40aCwgdjAuaFswXQorICAgICAgICBzbXVsbCAgICAgICAgICAgXHRtcDFcKCkuNHMsIFxzcmMyXCgpLjRoLCB2MC5oWzFdCisgICAgICAgIHNtdWxsICAgICAgICAgICBcdG1wMlwoKS40cywgXHNyYzNcKCkuNGgsIHYwLmhbMV0KKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkc3QxXCgpLjRzLCBcc3JjM1woKS40aCwgdjAuaFsyXQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDJcKCkuNHMsIFxzcmM0XCgpLjRoLCB2MC5oWzJdCisgICAgICAgIHNtbGFsICAgICAgICAgICBcdG1wMVwoKS40cywgXHNyYzRcKCkuNGgsIHYwLmhbM10KKyAgICAgICAgc21sYWwgICAgICAgICAgIFx0bXAyXCgpLjRzLCBcc3JjNVwoKS40aCwgdjAuaFszXQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDFcKCkuNHMsIFxzcmM1XCgpLjRoLCB2MC5oWzRdCisgICAgICAgIHNtbGFsICAgICAgICAgICBcZHN0MlwoKS40cywgXHNyYzZcKCkuNGgsIHYwLmhbNF0KKyAgICAgICAgc21sYWwgICAgICAgICAgIFx0bXAxXCgpLjRzLCBcc3JjNlwoKS40aCwgdjAuaFs1XQorICAgICAgICBzbWxhbCAgICAgICAgICAgXHRtcDJcKCkuNHMsIFxzcmM3XCgpLjRoLCB2MC5oWzVdCisgICAgICAgIHNtbGFsICAgICAgICAgICBcZHN0MVwoKS40cywgXHNyYzdcKCkuNGgsIHYwLmhbNl0KKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkc3QyXCgpLjRzLCBcc3JjOFwoKS40aCwgdjAuaFs2XQorICAgICAgICBzbWxhbCAgICAgICAgICAgXHRtcDFcKCkuNHMsIFxzcmM4XCgpLjRoLCB2MC5oWzddCisgICAgICAgIHNtbGFsICAgICAgICAgICBcdG1wMlwoKS40cywgXHNyYzlcKCkuNGgsIHYwLmhbN10KKyAgICAgICAgYWRkICAgICAgICAgICAgIFxkc3QxXCgpLjRzLCBcZHN0MVwoKS40cywgXHRtcDFcKCkuNHMKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxkc3QyXCgpLjRzLCBcZHN0MlwoKS40cywgXHRtcDJcKCkuNHMKKy5lbmRtCisKKy8vIEV2YWx1YXRlIHRoZSBmaWx0ZXIgdHdpY2UgaW4gcGFyYWxsZWwsIGZyb20gdGhlIGlucHV0cyBzcmMxLXNyYzkgaW50byBkc3QxLWRzdDQKKy8vIChzcmMxLXNyYzggaW50byBkc3QxLWRzdDIsIHNyYzItc3JjOSBpbnRvIGRzdDMtZHN0NCkuCisubWFjcm8gY29udm9sdmU4IGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzkKKyAgICAgICAgc211bGwgICAgICAgICAgIFxkc3QxXCgpLjRzLCBcc3JjMVwoKS40aCwgdjAuaFswXQorICAgICAgICBzbXVsbDIgICAgICAgICAgXGRzdDJcKCkuNHMsIFxzcmMxXCgpLjhoLCB2MC5oWzBdCisgICAgICAgIHNtdWxsICAgICAgICAgICBcZHN0M1woKS40cywgXHNyYzJcKCkuNGgsIHYwLmhbMF0KKyAgICAgICAgc211bGwyICAgICAgICAgIFxkc3Q0XCgpLjRzLCBcc3JjMlwoKS44aCwgdjAuaFswXQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDFcKCkuNHMsIFxzcmMyXCgpLjRoLCB2MC5oWzFdCisgICAgICAgIHNtbGFsMiAgICAgICAgICBcZHN0MlwoKS40cywgXHNyYzJcKCkuOGgsIHYwLmhbMV0KKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkc3QzXCgpLjRzLCBcc3JjM1woKS40aCwgdjAuaFsxXQorICAgICAgICBzbWxhbDIgICAgICAgICAgXGRzdDRcKCkuNHMsIFxzcmMzXCgpLjhoLCB2MC5oWzFdCisgICAgICAgIHNtbGFsICAgICAgICAgICBcZHN0MVwoKS40cywgXHNyYzNcKCkuNGgsIHYwLmhbMl0KKyAgICAgICAgc21sYWwyICAgICAgICAgIFxkc3QyXCgpLjRzLCBcc3JjM1woKS44aCwgdjAuaFsyXQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDNcKCkuNHMsIFxzcmM0XCgpLjRoLCB2MC5oWzJdCisgICAgICAgIHNtbGFsMiAgICAgICAgICBcZHN0NFwoKS40cywgXHNyYzRcKCkuOGgsIHYwLmhbMl0KKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkc3QxXCgpLjRzLCBcc3JjNFwoKS40aCwgdjAuaFszXQorICAgICAgICBzbWxhbDIgICAgICAgICAgXGRzdDJcKCkuNHMsIFxzcmM0XCgpLjhoLCB2MC5oWzNdCisgICAgICAgIHNtbGFsICAgICAgICAgICBcZHN0M1woKS40cywgXHNyYzVcKCkuNGgsIHYwLmhbM10KKyAgICAgICAgc21sYWwyICAgICAgICAgIFxkc3Q0XCgpLjRzLCBcc3JjNVwoKS44aCwgdjAuaFszXQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDFcKCkuNHMsIFxzcmM1XCgpLjRoLCB2MC5oWzRdCisgICAgICAgIHNtbGFsMiAgICAgICAgICBcZHN0MlwoKS40cywgXHNyYzVcKCkuOGgsIHYwLmhbNF0KKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkc3QzXCgpLjRzLCBcc3JjNlwoKS40aCwgdjAuaFs0XQorICAgICAgICBzbWxhbDIgICAgICAgICAgXGRzdDRcKCkuNHMsIFxzcmM2XCgpLjhoLCB2MC5oWzRdCisgICAgICAgIHNtbGFsICAgICAgICAgICBcZHN0MVwoKS40cywgXHNyYzZcKCkuNGgsIHYwLmhbNV0KKyAgICAgICAgc21sYWwyICAgICAgICAgIFxkc3QyXCgpLjRzLCBcc3JjNlwoKS44aCwgdjAuaFs1XQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDNcKCkuNHMsIFxzcmM3XCgpLjRoLCB2MC5oWzVdCisgICAgICAgIHNtbGFsMiAgICAgICAgICBcZHN0NFwoKS40cywgXHNyYzdcKCkuOGgsIHYwLmhbNV0KKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkc3QxXCgpLjRzLCBcc3JjN1woKS40aCwgdjAuaFs2XQorICAgICAgICBzbWxhbDIgICAgICAgICAgXGRzdDJcKCkuNHMsIFxzcmM3XCgpLjhoLCB2MC5oWzZdCisgICAgICAgIHNtbGFsICAgICAgICAgICBcZHN0M1woKS40cywgXHNyYzhcKCkuNGgsIHYwLmhbNl0KKyAgICAgICAgc21sYWwyICAgICAgICAgIFxkc3Q0XCgpLjRzLCBcc3JjOFwoKS44aCwgdjAuaFs2XQorICAgICAgICBzbWxhbCAgICAgICAgICAgXGRzdDFcKCkuNHMsIFxzcmM4XCgpLjRoLCB2MC5oWzddCisgICAgICAgIHNtbGFsMiAgICAgICAgICBcZHN0MlwoKS40cywgXHNyYzhcKCkuOGgsIHYwLmhbN10KKyAgICAgICAgc21sYWwgICAgICAgICAgIFxkc3QzXCgpLjRzLCBcc3JjOVwoKS40aCwgdjAuaFs3XQorICAgICAgICBzbWxhbDIgICAgICAgICAgXGRzdDRcKCkuNHMsIFxzcmM5XCgpLjhoLCB2MC5oWzddCisuZW5kbQorCisvLyBJbnN0YW50aWF0ZSBhIHZlcnRpY2FsIGZpbHRlciBmdW5jdGlvbiBmb3IgZmlsdGVyaW5nIDggcGl4ZWxzIGF0IGEgdGltZS4KKy8vIFRoZSBoZWlnaHQgaXMgcGFzc2VkIGluIHg0LCB0aGUgd2lkdGggaW4geDUgYW5kIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzCisvLyBpbiB4Ni4KKy5tYWNybyBkb184dGFwXzh2IHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpXzh0YXBfOHYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4MywgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44aH0sICBbeDZdCisxOgorLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg3LCAgeDAKKy5lbmRpZgorICAgICAgICBtb3YgICAgICAgICAgICAgeDYsICB4NAorCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE3LjhofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS44aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIzLjhofSwgW3gyXSwgeDMKKzI6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI0LjhofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjUuOGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNi44aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI3LjhofSwgW3gyXSwgeDMKKworICAgICAgICBjb252b2x2ZTggICAgICAgdjIsICB2MywgIHY0LCAgdjUsICB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1CisgICAgICAgIGNvbnZvbHZlOCAgICAgICB2NiwgIHY3LCAgdjMwLCB2MzEsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcKKyAgICAgICAgZG9fc3RvcmU4ICAgICAgIHYyLCAgdjMsICB2NCwgIHY1LCAgdjYsICB2NywgIHYzMCwgdjMxLCB2MSwgIFx0eXBlCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg2LCAgeDYsICAjNAorICAgICAgICBiLmVxICAgICAgICAgICAgOGYKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE3LjhofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguOGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS44aH0sIFt4Ml0sIHgzCisgICAgICAgIGNvbnZvbHZlOCAgICAgICB2MiwgIHYzLCAgdjQsICB2NSwgIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjE2LCB2MTcKKyAgICAgICAgY29udm9sdmU4ICAgICAgIHY2LCAgdjcsICB2MjAsIHYyMSwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYxNiwgdjE3LCB2MTgsIHYxOQorICAgICAgICBkb19zdG9yZTggICAgICAgdjIsICB2MywgIHY0LCAgdjUsICB2NiwgIHY3LCAgdjIwLCB2MjEsIHYxLCAgXHR5cGUKKworICAgICAgICBzdWJzICAgICAgICAgICAgeDYsICB4NiwgICM0CisgICAgICAgIGIuZXEgICAgICAgICAgICA4ZgorCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjhofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuOGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi44aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIzLjhofSwgW3gyXSwgeDMKKyAgICAgICAgY29udm9sdmU4ICAgICAgIHYyLCAgdjMsICB2NCwgIHY1LCAgdjI1LCB2MjYsIHYyNywgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMQorICAgICAgICBjb252b2x2ZTggICAgICAgdjYsICB2NywgIHYyNCwgdjI1LCB2MjcsIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzCisgICAgICAgIGRvX3N0b3JlOCAgICAgICB2MiwgIHYzLCAgdjQsICB2NSwgIHY2LCAgdjcsICB2MjQsIHYyNSwgdjEsICBcdHlwZQorCisgICAgICAgIHN1YnMgICAgICAgICAgICB4NiwgIHg2LCAgIzQKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDJiCisKKzg6CisgICAgICAgIHN1YnMgICAgICAgICAgICB4NSwgIHg1LCAgIzgKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDlmCisgICAgICAgIC8vIHgwIC09IGggKiBkc3Rfc3RyaWRlCisgICAgICAgIG1zdWIgICAgICAgICAgICB4MCwgIHgxLCAgeDQsIHgwCisgICAgICAgIC8vIHgyIC09IGggKiBzcmNfc3RyaWRlCisgICAgICAgIG1zdWIgICAgICAgICAgICB4MiwgIHgzLCAgeDQsIHgyCisgICAgICAgIC8vIHgyIC09IDggKiBzcmNfc3RyaWRlCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgeDMsIGxzbCAjMworICAgICAgICAvLyB4MiArPSAxICogc3JjX3N0cmlkZQorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MiwgIHgzCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MiwgIHgyLCAgIzE2CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzE2CisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorOToKKyAgICAgICAgcmV0CitlbmRmdW5jCisuZW5kbQorCitkb184dGFwXzh2IHB1dAorZG9fOHRhcF84diBhdmcKKworCisvLyBJbnN0YW50aWF0ZSBhIHZlcnRpY2FsIGZpbHRlciBmdW5jdGlvbiBmb3IgZmlsdGVyaW5nIGEgNCBwaXhlbHMgd2lkZQorLy8gc2xpY2UuIFRoaXMgb25seSBpcyBkZXNpZ25lZCB0byB3b3JrIGZvciA0IG9yIDggb3V0cHV0IGxpbmVzLgorLm1hY3JvIGRvXzh0YXBfNHYgdHlwZQorZnVuY3Rpb24gXHR5cGVcKClfOHRhcF80dgorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHgzLCBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhofSwgIFt4Nl0KKy5pZmMgXHR5cGUsYXZnCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NywgIHgwCisuZW5kaWYKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi40aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djE3LjRofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTguNGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YxOS40aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjRofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjEuNGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyMi40aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIzLjRofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjQuNGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNS40aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LjRofSwgW3gyXSwgeDMKKworICAgICAgICBjb252b2x2ZTQgICAgICAgdjIsICB2MywgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjIwLCB2MjEsIHYyMiwgdjIzLCB2MjQsIHYzMCwgdjMxCisgICAgICAgIGNvbnZvbHZlNCAgICAgICB2NCwgIHY1LCAgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjMwLCB2MzEKKyAgICAgICAgZG9fc3RvcmU0ICAgICAgIHYyLCAgdjMsICB2NCwgIHY1LCAgdjI4LCB2MjksIHYzMCwgdjMxLCB2MSwgIFx0eXBlCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg0LCAgeDQsICAjNAorICAgICAgICBiLmVxICAgICAgICAgICAgOWYKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YyNy40aH0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LjRofSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MjkuNGh9LCBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YzMC40aH0sIFt4Ml0sIHgzCisKKyAgICAgICAgY29udm9sdmU0ICAgICAgIHYyLCAgdjMsICB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MTYsIHYxNworICAgICAgICBjb252b2x2ZTQgICAgICAgdjQsICB2NSwgIHYyMiwgdjIzLCB2MjQsIHYyNSwgdjI2LCB2MjcsIHYyOCwgdjI5LCB2MzAsIHYxNiwgdjE3CisgICAgICAgIGRvX3N0b3JlNCAgICAgICB2MiwgIHYzLCAgdjQsICB2NSwgIHYxNiwgdjE3LCB2MTgsIHYxOSwgdjEsICBcdHlwZQorCis5OgorICAgICAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKK2RvXzh0YXBfNHYgcHV0Citkb184dGFwXzR2IGF2ZworCisKKy5tYWNybyBkb184dGFwX3ZfZnVuYyB0eXBlLCBmaWx0ZXIsIG9mZnNldCwgc2l6ZSwgYnBwCitmdW5jdGlvbiBmZl92cDlfXHR5cGVcKClfXGZpbHRlclwoKVxzaXplXCgpX3ZfXGJwcFwoKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICB1eHR3ICAgICAgICAgICAgeDQsICB3NAorICAgICAgICBtdm5pICAgICAgICAgICAgdjEuOGgsICMoKDB4ZmYgPDwgKFxicHAgLSA4KSkgJiAweGZmKSwgbHNsICM4CisgICAgICAgIG1vdnJlbCAgICAgICAgICB4NSwgIFgoZmZfdnA5X3N1YnBlbF9maWx0ZXJzKSwgMjU2KlxvZmZzZXQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHg2LCAgeDUsICB3NiwgdXh0dyAjNAorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICAjXHNpemUKKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwXzh2CisuZWxzZQorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfOHRhcF80dgorLmVuZGlmCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF92X2ZpbHRlcnMgc2l6ZSwgYnBwCitkb184dGFwX3ZfZnVuYyBwdXQsIHJlZ3VsYXIsIDEsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBhdmcsIHJlZ3VsYXIsIDEsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBwdXQsIHNoYXJwLCAgIDIsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBhdmcsIHNoYXJwLCAgIDIsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBwdXQsIHNtb290aCwgIDAsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBhdmcsIHNtb290aCwgIDAsIFxzaXplLCBcYnBwCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF92X2ZpbHRlcnNfYnBwIGJwcAorZG9fOHRhcF92X2ZpbHRlcnMgNjQsIFxicHAKK2RvXzh0YXBfdl9maWx0ZXJzIDMyLCBcYnBwCitkb184dGFwX3ZfZmlsdGVycyAxNiwgXGJwcAorZG9fOHRhcF92X2ZpbHRlcnMgOCwgIFxicHAKK2RvXzh0YXBfdl9maWx0ZXJzIDQsICBcYnBwCisuZW5kbQorCitkb184dGFwX3ZfZmlsdGVyc19icHAgMTAKK2RvXzh0YXBfdl9maWx0ZXJzX2JwcCAxMgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYXJjaDY0L3ZwOW1jX25lb24uUyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDltY19uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3NjI0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWFyY2g2NC92cDltY19uZW9uLlMKQEAgLTAsMCArMSw2ODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIgorCisvLyBBbGwgcHVibGljIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKKy8vIHR5cGVkZWYgdm9pZCAoKnZwOV9tY19mdW5jKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBwdHJkaWZmX3QgcmVmX3N0cmlkZSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSk7CisKK2Z1bmN0aW9uIGZmX3ZwOV9jb3B5NjRfYWFyY2g2NCwgZXhwb3J0PTEKKzE6CisgICAgICAgIGxkcCAgICAgICAgICAgICB4NSwgIHg2LCAgW3gyXQorICAgICAgICBsZHAgICAgICAgICAgICAgeDcsICB4OCwgIFt4MiwgIzE2XQorICAgICAgICBzdHAgICAgICAgICAgICAgeDUsICB4NiwgIFt4MF0KKyAgICAgICAgbGRwICAgICAgICAgICAgIHg5LCAgeDEwLCBbeDIsICMzMl0KKyAgICAgICAgc3RwICAgICAgICAgICAgIHg3LCAgeDgsICBbeDAsICMxNl0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHc0LCAgdzQsICAjMQorICAgICAgICBsZHAgICAgICAgICAgICAgeDExLCB4MTIsIFt4MiwgIzQ4XQorICAgICAgICBzdHAgICAgICAgICAgICAgeDksICB4MTAsIFt4MCwgIzMyXQorICAgICAgICBzdHAgICAgICAgICAgICAgeDExLCB4MTIsIFt4MCwgIzQ4XQorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MiwgIHgzCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnNjRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDAKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djQuMTZiLCAgdjUuMTZiLCAgdjYuMTZiLCAgdjcuMTZifSwgIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZiLCAgdjEuMTZiLCAgdjIuMTZiLCAgdjMuMTZifSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIwLjE2YiwgdjIxLjE2YiwgdjIyLjE2YiwgdjIzLjE2Yn0sIFt4Ml0sIHgzCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC4xNmIsICB2MC4xNmIsICB2NC4xNmIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxLjE2YiwgIHYxLjE2YiwgIHY1LjE2YgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi4xNmIsIHYxNy4xNmIsIHYxOC4xNmIsIHYxOS4xNmJ9LCBbeDBdLCB4MQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjIuMTZiLCAgdjIuMTZiLCAgdjYuMTZiCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2My4xNmIsICB2My4xNmIsICB2Ny4xNmIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc0LCAgdzQsICAjMgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE2LjE2YiwgdjE2LjE2YiwgdjIwLjE2YgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE3LjE2YiwgdjE3LjE2YiwgdjIxLjE2YgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjE2YiwgIHYxLjE2YiwgIHYyLjE2YiwgIHYzLjE2Yn0sICBbeDVdLCB4MQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE4LjE2YiwgdjE4LjE2YiwgdjIyLjE2YgorICAgICAgICB1cmhhZGQgICAgICAgICAgdjE5LjE2YiwgdjE5LjE2YiwgdjIzLjE2YgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxNi4xNmIsIHYxNy4xNmIsIHYxOC4xNmIsIHYxOS4xNmJ9LCBbeDVdLCB4MQorICAgICAgICBiLm5lICAgICAgICAgICAgMWIKKyAgICAgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9jb3B5MzJfYWFyY2g2NCwgZXhwb3J0PTEKKzE6CisgICAgICAgIGxkcCAgICAgICAgICAgICB4NSwgIHg2LCAgW3gyXQorICAgICAgICBsZHAgICAgICAgICAgICAgeDcsICB4OCwgIFt4MiwgIzE2XQorICAgICAgICBzdHAgICAgICAgICAgICAgeDUsICB4NiwgIFt4MF0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHc0LCAgdzQsICAjMQorICAgICAgICBzdHAgICAgICAgICAgICAgeDcsICB4OCwgIFt4MCwgIzE2XQorICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MiwgIHgzCisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnMzJfbmVvbiwgZXhwb3J0PTEKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuMTZiLCB2My4xNmJ9LCAgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC4xNmIsIHYxLjE2Yn0sICBbeDBdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC4xNmIsICB2MC4xNmIsICB2Mi4xNmIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxLjE2YiwgIHYxLjE2YiwgIHYzLjE2YgorICAgICAgICBzdWJzICAgICAgICAgICAgdzQsICB3NCwgICMxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuMTZiLCB2MS4xNmJ9LCAgW3gwXSwgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfY29weTE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NSwgIHgwLCAgeDEKKyAgICAgICAgbHNsICAgICAgICAgICAgIHgxLCAgeDEsICAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgeDYsICB4MiwgIHgzCisgICAgICAgIGxzbCAgICAgICAgICAgICB4MywgIHgzLCAgIzEKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZifSwgIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuMTZifSwgIFt4Nl0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuMTZifSwgIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuMTZifSwgIFt4Nl0sIHgzCisgICAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC4xNmJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS4xNmJ9LCAgW3g1XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi4xNmJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My4xNmJ9LCAgW3g1XSwgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgeDAKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuMTZifSwgIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuMTZifSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuMTZifSwgIFt4Ml0sIHgzCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MC4xNmIsICB2MC4xNmIsICB2Mi4xNmIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS4xNmJ9LCAgW3gwXSwgeDEKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYxLjE2YiwgIHYxLjE2YiwgIHYzLjE2YgorICAgICAgICBzdWJzICAgICAgICAgICAgdzQsICB3NCwgICMyCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuMTZifSwgIFt4NV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuMTZifSwgIFt4NV0sIHgxCisgICAgICAgIGIubmUgICAgICAgICAgICAxYgorICAgICAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2NvcHk4X25lb24sIGV4cG9ydD0xCisxOgorICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhifSwgIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuOGJ9LCAgW3gyXSwgeDMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc0LCAgdzQsICAjMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjhifSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuOGJ9LCAgW3gwXSwgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICB4MAorMToKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi44Yn0sICBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhifSwgIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuOGJ9LCAgW3gyXSwgeDMKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYwLjhiLCAgdjAuOGIsICB2Mi44YgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjhifSwgIFt4MF0sIHgxCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MS44YiwgIHYxLjhiLCAgdjMuOGIKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc0LCAgdzQsICAjMgorICAgICAgICBzdDEgICAgICAgICAgICAge3YwLjhifSwgIFt4NV0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuOGJ9LCAgW3g1XSwgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfY29weTRfbmVvbiwgZXhwb3J0PTEKKzE6CisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuc31bMF0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMF0sIFt4Ml0sIHgzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djAuc31bMF0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djIuc31bMF0sIFt4Ml0sIHgzCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMF0sIFt4MF0sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuc31bMF0sIFt4Ml0sIHgzCisgICAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzQKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2Mi5zfVswXSwgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2My5zfVswXSwgW3gwXSwgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnNF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgeDUsICB4MAorMToKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5zfVswXSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5zfVswXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5zfVsxXSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC5zfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My5zfVswXSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS5zfVswXSwgW3gwXSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My5zfVsxXSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MS5zfVsxXSwgW3gwXSwgeDEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHc0LCAgdzQsICAjNAorICAgICAgICB1cmhhZGQgICAgICAgICAgdjAuOGIsICB2MC44YiwgIHYyLjhiCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MS44YiwgIHYxLjhiLCAgdjMuOGIKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5zfVswXSwgW3g1XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MC5zfVsxXSwgW3g1XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5zfVswXSwgW3g1XSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MS5zfVsxXSwgW3g1XSwgeDEKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworCisKKy8vIEV4dHJhY3QgYSB2ZWN0b3IgZnJvbSBzcmMxLXNyYzIgYW5kIHNyYzQtc3JjNSAoc3JjMS1zcmMzIGFuZCBzcmM0LXNyYzYKKy8vIGZvciBzaXplID49IDE2KSwgYW5kIG11bHRpcGx5LWFjY3VtdWxhdGUgaW50byBkc3QxIGFuZCBkc3QzIChvcgorLy8gZHN0MS1kc3QyIGFuZCBkc3QzLWRzdDQgZm9yIHNpemUgPj0gMTYpCisubWFjcm8gZXh0bWxhIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIG9mZnNldCwgc2l6ZQorICAgICAgICBleHQgICAgICAgICAgICAgdjIwLjE2YiwgXHNyYzFcKCkuMTZiLCBcc3JjMlwoKS4xNmIsICMoMipcb2Zmc2V0KQorICAgICAgICBleHQgICAgICAgICAgICAgdjIyLjE2YiwgXHNyYzRcKCkuMTZiLCBcc3JjNVwoKS4xNmIsICMoMipcb2Zmc2V0KQorLmlmIFxzaXplID49IDE2CisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0MVwoKS44aCwgdjIwLjhoLCB2MC5oW1xvZmZzZXRdCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MjEuMTZiLCBcc3JjMlwoKS4xNmIsIFxzcmMzXCgpLjE2YiwgIygyKlxvZmZzZXQpCisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0M1woKS44aCwgdjIyLjhoLCB2MC5oW1xvZmZzZXRdCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MjMuMTZiLCBcc3JjNVwoKS4xNmIsIFxzcmM2XCgpLjE2YiwgIygyKlxvZmZzZXQpCisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0MlwoKS44aCwgdjIxLjhoLCB2MC5oW1xvZmZzZXRdCisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0NFwoKS44aCwgdjIzLjhoLCB2MC5oW1xvZmZzZXRdCisuZWxzZWlmIFxzaXplID09IDgKKyAgICAgICAgbWxhICAgICAgICAgICAgIFxkc3QxXCgpLjhoLCB2MjAuOGgsIHYwLmhbXG9mZnNldF0KKyAgICAgICAgbWxhICAgICAgICAgICAgIFxkc3QzXCgpLjhoLCB2MjIuOGgsIHYwLmhbXG9mZnNldF0KKy5lbHNlCisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0MVwoKS40aCwgdjIwLjRoLCB2MC5oW1xvZmZzZXRdCisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0M1woKS40aCwgdjIyLjRoLCB2MC5oW1xvZmZzZXRdCisuZW5kaWYKKy5lbmRtCisvLyBUaGUgc2FtZSBhcyBhYm92ZSwgYnV0IGRvbid0IGFjY3VtdWxhdGUgc3RyYWlnaHQgaW50byB0aGUKKy8vIGRlc3RpbmF0aW9uLCBidXQgdXNlIGEgdGVtcCByZWdpc3RlciBhbmQgYWNjdW11bGF0ZSB3aXRoIHNhdHVyYXRpb24uCisubWFjcm8gZXh0bXVscWFkZCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBvZmZzZXQsIHNpemUKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyMC4xNmIsIFxzcmMxXCgpLjE2YiwgXHNyYzJcKCkuMTZiLCAjKDIqXG9mZnNldCkKKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyMi4xNmIsIFxzcmM0XCgpLjE2YiwgXHNyYzVcKCkuMTZiLCAjKDIqXG9mZnNldCkKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBtdWwgICAgICAgICAgICAgdjIwLjhoLCB2MjAuOGgsIHYwLmhbXG9mZnNldF0KKyAgICAgICAgZXh0ICAgICAgICAgICAgIHYyMS4xNmIsIFxzcmMyXCgpLjE2YiwgXHNyYzNcKCkuMTZiLCAjKDIqXG9mZnNldCkKKyAgICAgICAgbXVsICAgICAgICAgICAgIHYyMi44aCwgdjIyLjhoLCB2MC5oW1xvZmZzZXRdCisgICAgICAgIGV4dCAgICAgICAgICAgICB2MjMuMTZiLCBcc3JjNVwoKS4xNmIsIFxzcmM2XCgpLjE2YiwgIygyKlxvZmZzZXQpCisgICAgICAgIG11bCAgICAgICAgICAgICB2MjEuOGgsIHYyMS44aCwgdjAuaFtcb2Zmc2V0XQorICAgICAgICBtdWwgICAgICAgICAgICAgdjIzLjhoLCB2MjMuOGgsIHYwLmhbXG9mZnNldF0KKy5lbHNlaWYgXHNpemUgPT0gOAorICAgICAgICBtdWwgICAgICAgICAgICAgdjIwLjhoLCB2MjAuOGgsIHYwLmhbXG9mZnNldF0KKyAgICAgICAgbXVsICAgICAgICAgICAgIHYyMi44aCwgdjIyLjhoLCB2MC5oW1xvZmZzZXRdCisuZWxzZQorICAgICAgICBtdWwgICAgICAgICAgICAgdjIwLjRoLCB2MjAuNGgsIHYwLmhbXG9mZnNldF0KKyAgICAgICAgbXVsICAgICAgICAgICAgIHYyMi40aCwgdjIyLjRoLCB2MC5oW1xvZmZzZXRdCisuZW5kaWYKKy5pZiBcc2l6ZSA9PSA0CisgICAgICAgIHNxYWRkICAgICAgICAgICBcZHN0MVwoKS40aCwgXGRzdDFcKCkuNGgsIHYyMC40aAorICAgICAgICBzcWFkZCAgICAgICAgICAgXGRzdDNcKCkuNGgsIFxkc3QzXCgpLjRoLCB2MjIuNGgKKy5lbHNlCisgICAgICAgIHNxYWRkICAgICAgICAgICBcZHN0MVwoKS44aCwgXGRzdDFcKCkuOGgsIHYyMC44aAorICAgICAgICBzcWFkZCAgICAgICAgICAgXGRzdDNcKCkuOGgsIFxkc3QzXCgpLjhoLCB2MjIuOGgKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBzcWFkZCAgICAgICAgICAgXGRzdDJcKCkuOGgsIFxkc3QyXCgpLjhoLCB2MjEuOGgKKyAgICAgICAgc3FhZGQgICAgICAgICAgIFxkc3Q0XCgpLjhoLCBcZHN0NFwoKS44aCwgdjIzLjhoCisuZW5kaWYKKy5lbmRpZgorLmVuZG0KKworCisvLyBJbnN0YW50aWF0ZSBhIGhvcml6b250YWwgZmlsdGVyIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gc2l6ZS4KKy8vIFRoaXMgY2FuIHdvcmsgb24gNCwgOCBvciAxNiBwaXhlbHMgaW4gcGFyYWxsZWw7IGZvciBsYXJnZXIKKy8vIHdpZHRocyBpdCB3aWxsIGRvIDE2IHBpeGVscyBhdCBhIHRpbWUgYW5kIGxvb3AgaG9yaXpvbnRhbGx5LgorLy8gVGhlIGFjdHVhbCB3aWR0aCBpcyBwYXNzZWQgaW4geDUsIHRoZSBoZWlnaHQgaW4gdzQgYW5kIHRoZQorLy8gZmlsdGVyIGNvZWZmaWNpZW50cyBpbiB4OS4gaWR4MiBpcyB0aGUgaW5kZXggb2YgdGhlIGxhcmdlc3QKKy8vIGZpbHRlciBjb2VmZmljaWVudCAoMyBvciA0KSBhbmQgaWR4MSBpcyB0aGUgb3RoZXIgb25lIG9mIHRoZW0uCisubWFjcm8gZG9fOHRhcF9oIHR5cGUsIHNpemUsIGlkeDEsIGlkeDIKK2Z1bmN0aW9uIFx0eXBlXCgpXzh0YXBfXHNpemVcKCloX1xpZHgxXGlkeDIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICAjMworICAgICAgICBhZGQgICAgICAgICAgICAgeDYsICB4MCwgIHgxCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NywgIHgyLCAgeDMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgxLCAgeDEsICB4MQorICAgICAgICBhZGQgICAgICAgICAgICAgeDMsICB4MywgIHgzCisgICAgICAgIC8vIE9ubHkgc2l6ZSA+PSAxNiBsb29wcyBob3Jpem9udGFsbHkgYW5kIG5lZWRzCisgICAgICAgIC8vIHJlZHVjZWQgZHN0IHN0cmlkZQorLmlmIFxzaXplID49IDE2CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MSwgIHgxLCAgeDUKKy5lbmRpZgorICAgICAgICAvLyBzaXplID49IDE2IGxvYWRzIHR3byBxd29yZHMgYW5kIGluY3JlbWVudHMgeDIsCisgICAgICAgIC8vIGZvciBzaXplIDQvOCBpdCdzIGVub3VnaCB3aXRoIG9uZSBxd29yZCBhbmQgbm8KKyAgICAgICAgLy8gcG9zdGluY3JlbWVudAorLmlmIFxzaXplID49IDE2CisgICAgICAgIHN1YiAgICAgICAgICAgICB4MywgIHgzLCAgeDUKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgzLCAgeDMsICAjOAorLmVuZGlmCisgICAgICAgIC8vIExvYWQgdGhlIGZpbHRlciB2ZWN0b3IKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MC44aH0sICBbeDldCisxOgorLmlmIFxzaXplID49IDE2CisgICAgICAgIG1vdiAgICAgICAgICAgICB4OSwgIHg1CisuZW5kaWYKKyAgICAgICAgLy8gTG9hZCBzcmMKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhiLCAgdjUuOGIsICB2Ni44Yn0sICBbeDJdLCAjMjQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2MTYuOGIsIHYxNy44YiwgdjE4LjhifSwgW3g3XSwgIzI0CisuZWxzZQorICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LjhiLCAgdjUuOGJ9LCAgW3gyXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YxNi44YiwgdjE3LjhifSwgW3g3XQorLmVuZGlmCisgICAgICAgIHV4dGwgICAgICAgICAgICB2NC44aCwgIHY0LjhiCisgICAgICAgIHV4dGwgICAgICAgICAgICB2NS44aCwgIHY1LjhiCisgICAgICAgIHV4dGwgICAgICAgICAgICB2MTYuOGgsIHYxNi44YgorICAgICAgICB1eHRsICAgICAgICAgICAgdjE3LjhoLCB2MTcuOGIKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICB1eHRsICAgICAgICAgICAgdjYuOGgsICB2Ni44YgorICAgICAgICB1eHRsICAgICAgICAgICAgdjE4LjhoLCB2MTguOGIKKy5lbmRpZgorMjoKKworICAgICAgICAvLyBBY2N1bXVsYXRlLCBhZGRpbmcgaWR4MiBsYXN0IHdpdGggYSBzZXBhcmF0ZQorICAgICAgICAvLyBzYXR1cmF0aW5nIGFkZC4gVGhlIHBvc2l0aXZlIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICAgICAgLy8gZm9yIGFsbCBpbmRpY2VzIGV4Y2VwdCBpZHgyIG11c3QgYWRkIHVwIHRvIGxlc3MKKyAgICAgICAgLy8gdGhhbiAxMjcgZm9yIHRoaXMgbm90IHRvIG92ZXJmbG93LgorICAgICAgICBtdWwgICAgICAgICAgICAgdjEuOGgsICB2NC44aCwgIHYwLmhbMF0KKyAgICAgICAgbXVsICAgICAgICAgICAgIHYyNC44aCwgdjE2LjhoLCB2MC5oWzBdCisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgbXVsICAgICAgICAgICAgIHYyLjhoLCAgdjUuOGgsICB2MC5oWzBdCisgICAgICAgIG11bCAgICAgICAgICAgICB2MjUuOGgsIHYxNy44aCwgdjAuaFswXQorLmVuZGlmCisgICAgICAgIGV4dG1sYSAgICAgICAgICB2MSwgIHYyLCAgdjI0LCB2MjUsIHY0LCAgdjUsICB2NiwgIHYxNiwgdjE3LCB2MTgsIDEsICAgICBcc2l6ZQorICAgICAgICBleHRtbGEgICAgICAgICAgdjEsICB2MiwgIHYyNCwgdjI1LCB2NCwgIHY1LCAgdjYsICB2MTYsIHYxNywgdjE4LCAyLCAgICAgXHNpemUKKyAgICAgICAgZXh0bWxhICAgICAgICAgIHYxLCAgdjIsICB2MjQsIHYyNSwgdjQsICB2NSwgIHY2LCAgdjE2LCB2MTcsIHYxOCwgXGlkeDEsIFxzaXplCisgICAgICAgIGV4dG1sYSAgICAgICAgICB2MSwgIHYyLCAgdjI0LCB2MjUsIHY0LCAgdjUsICB2NiwgIHYxNiwgdjE3LCB2MTgsIDUsICAgICBcc2l6ZQorICAgICAgICBleHRtbGEgICAgICAgICAgdjEsICB2MiwgIHYyNCwgdjI1LCB2NCwgIHY1LCAgdjYsICB2MTYsIHYxNywgdjE4LCA2LCAgICAgXHNpemUKKyAgICAgICAgZXh0bWxhICAgICAgICAgIHYxLCAgdjIsICB2MjQsIHYyNSwgdjQsICB2NSwgIHY2LCAgdjE2LCB2MTcsIHYxOCwgNywgICAgIFxzaXplCisgICAgICAgIGV4dG11bHFhZGQgICAgICB2MSwgIHYyLCAgdjI0LCB2MjUsIHY0LCAgdjUsICB2NiwgIHYxNiwgdjE3LCB2MTgsIFxpZHgyLCBcc2l6ZQorCisgICAgICAgIC8vIFJvdW5kLCBzaGlmdCBhbmQgc2F0dXJhdGUKKyAgICAgICAgc3Fyc2hydW4gICAgICAgIHYxLjhiLCAgIHYxLjhoLCAgIzcKKyAgICAgICAgc3Fyc2hydW4gICAgICAgIHYyNC44YiwgIHYyNC44aCwgIzcKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBzcXJzaHJ1bjIgICAgICAgdjEuMTZiLCAgdjIuOGgsICAjNworICAgICAgICBzcXJzaHJ1bjIgICAgICAgdjI0LjE2YiwgdjI1LjhoLCAjNworLmVuZGlmCisgICAgICAgIC8vIEF2ZXJhZ2UKKy5pZmMgXHR5cGUsYXZnCisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi4xNmJ9LCBbeDBdCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuMTZifSwgW3g2XQorICAgICAgICB1cmhhZGQgICAgICAgICAgdjEuMTZiLCAgdjEuMTZiLCAgdjIuMTZiCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MjQuMTZiLCB2MjQuMTZiLCB2My4xNmIKKy5lbHNlaWYgXHNpemUgPT0gOAorICAgICAgICBsZDEgICAgICAgICAgICAge3YyLjhifSwgIFt4MF0KKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2My44Yn0sICBbeDZdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MS44YiwgIHYxLjhiLCAgdjIuOGIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyNC44YiwgdjI0LjhiLCB2My44YgorLmVsc2UKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5zfVswXSwgW3gwXQorICAgICAgICBsZDEgICAgICAgICAgICAge3YzLnN9WzBdLCBbeDZdCisgICAgICAgIHVyaGFkZCAgICAgICAgICB2MS44YiwgIHYxLjhiLCAgdjIuOGIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIHYyNC44YiwgdjI0LjhiLCB2My44YgorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgLy8gU3RvcmUgYW5kIGxvb3AgaG9yaXpvbnRhbGx5IChmb3Igc2l6ZSA+PSAxNikKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICBzdWJzICAgICAgICAgICAgeDksICB4OSwgICMxNgorICAgICAgICBzdDEgICAgICAgICAgICAge3YxLjE2Yn0sICBbeDBdLCAjMTYKKyAgICAgICAgc3QxICAgICAgICAgICAgIHt2MjQuMTZifSwgW3g2XSwgIzE2CisgICAgICAgIGIuZXEgICAgICAgICAgICAzZgorICAgICAgICBtb3YgICAgICAgICAgICAgdjQuMTZiLCAgdjYuMTZiCisgICAgICAgIG1vdiAgICAgICAgICAgICB2MTYuMTZiLCB2MTguMTZiCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuMTZifSwgIFt4Ml0sICMxNgorICAgICAgICBsZDEgICAgICAgICAgICAge3YxOC4xNmJ9LCBbeDddLCAjMTYKKyAgICAgICAgdXh0bCAgICAgICAgICAgIHY1LjhoLCAgdjYuOGIKKyAgICAgICAgdXh0bDIgICAgICAgICAgIHY2LjhoLCAgdjYuMTZiCisgICAgICAgIHV4dGwgICAgICAgICAgICB2MTcuOGgsIHYxOC44YgorICAgICAgICB1eHRsMiAgICAgICAgICAgdjE4LjhoLCB2MTguMTZiCisgICAgICAgIGIgICAgICAgICAgICAgICAyYgorLmVsc2VpZiBcc2l6ZSA9PSA4CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuOGJ9LCAgICBbeDBdCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LjhifSwgICBbeDZdCisuZWxzZSAvLyBcc2l6ZSA9PSA0CisgICAgICAgIHN0MSAgICAgICAgICAgICB7djEuc31bMF0sICBbeDBdCisgICAgICAgIHN0MSAgICAgICAgICAgICB7djI0LnN9WzBdLCBbeDZdCisuZW5kaWYKKzM6CisgICAgICAgIC8vIExvb3AgdmVydGljYWxseQorICAgICAgICBhZGQgICAgICAgICAgICAgeDAsICB4MCwgIHgxCisgICAgICAgIGFkZCAgICAgICAgICAgICB4NiwgIHg2LCAgeDEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDIsICB4MworICAgICAgICBhZGQgICAgICAgICAgICAgeDcsICB4NywgIHgzCisgICAgICAgIHN1YnMgICAgICAgICAgICB3NCwgIHc0LCAgIzIKKyAgICAgICAgYi5uZSAgICAgICAgICAgIDFiCisgICAgICAgIHJldAorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGRvXzh0YXBfaF9zaXplIHNpemUKK2RvXzh0YXBfaCBwdXQsIFxzaXplLCAzLCA0Citkb184dGFwX2ggYXZnLCBcc2l6ZSwgMywgNAorZG9fOHRhcF9oIHB1dCwgXHNpemUsIDQsIDMKK2RvXzh0YXBfaCBhdmcsIFxzaXplLCA0LCAzCisuZW5kbQorCitkb184dGFwX2hfc2l6ZSA0Citkb184dGFwX2hfc2l6ZSA4Citkb184dGFwX2hfc2l6ZSAxNgorCisubWFjcm8gZG9fOHRhcF9oX2Z1bmMgdHlwZSwgZmlsdGVyLCBvZmZzZXQsIHNpemUKK2Z1bmN0aW9uIGZmX3ZwOV9cdHlwZVwoKV9cZmlsdGVyXCgpXHNpemVcKClfaF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDYsICBYKGZmX3ZwOV9zdWJwZWxfZmlsdGVycyksIDI1Nipcb2Zmc2V0CisgICAgICAgIGNtcCAgICAgICAgICAgICB3NSwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4OSwgIHg2LCAgdzUsIHV4dHcgIzQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgI1xzaXplCisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgYi5nZSAgICAgICAgICAgIFx0eXBlXCgpXzh0YXBfMTZoXzM0CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwXzE2aF80MworLmVsc2UKKyAgICAgICAgYi5nZSAgICAgICAgICAgIFx0eXBlXCgpXzh0YXBfXHNpemVcKCloXzM0CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwX1xzaXplXCgpaF80MworLmVuZGlmCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF9oX2ZpbHRlcnMgc2l6ZQorZG9fOHRhcF9oX2Z1bmMgcHV0LCByZWd1bGFyLCAxLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgYXZnLCByZWd1bGFyLCAxLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgcHV0LCBzaGFycCwgICAyLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgYXZnLCBzaGFycCwgICAyLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgcHV0LCBzbW9vdGgsICAwLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgYXZnLCBzbW9vdGgsICAwLCBcc2l6ZQorLmVuZG0KKworZG9fOHRhcF9oX2ZpbHRlcnMgNjQKK2RvXzh0YXBfaF9maWx0ZXJzIDMyCitkb184dGFwX2hfZmlsdGVycyAxNgorZG9fOHRhcF9oX2ZpbHRlcnMgOAorZG9fOHRhcF9oX2ZpbHRlcnMgNAorCisKKy8vIFZlcnRpY2FsIGZpbHRlcnMKKworLy8gUm91bmQsIHNoaWZ0IGFuZCBzYXR1cmF0ZSBhbmQgc3RvcmUgcmVnMS1yZWcyIG92ZXIgNCBsaW5lcworLm1hY3JvIGRvX3N0b3JlNCByZWcxLCByZWcyLCB0bXAxLCB0bXAyLCB0eXBlCisgICAgICAgIHNxcnNocnVuICAgICAgICBccmVnMVwoKS44YiwgIFxyZWcxXCgpLjhoLCAjNworICAgICAgICBzcXJzaHJ1biAgICAgICAgXHJlZzJcKCkuOGIsICBccmVnMlwoKS44aCwgIzcKKy5pZmMgXHR5cGUsYXZnCisgICAgICAgIGxkMSAgICAgICAgICAgICB7XHRtcDFcKCkuc31bMF0sICBbeDddLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge1x0bXAyXCgpLnN9WzBdLCAgW3g3XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcdG1wMVwoKS5zfVsxXSwgIFt4N10sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7XHRtcDJcKCkuc31bMV0sICBbeDddLCB4MQorICAgICAgICB1cmhhZGQgICAgICAgICAgXHJlZzFcKCkuOGIsICBccmVnMVwoKS44YiwgIFx0bXAxXCgpLjhiCisgICAgICAgIHVyaGFkZCAgICAgICAgICBccmVnMlwoKS44YiwgIFxyZWcyXCgpLjhiLCAgXHRtcDJcKCkuOGIKKy5lbmRpZgorICAgICAgICBzdDEgICAgICAgICAgICAge1xyZWcxXCgpLnN9WzBdLCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtccmVnMlwoKS5zfVswXSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7XHJlZzFcKCkuc31bMV0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge1xyZWcyXCgpLnN9WzFdLCAgW3gwXSwgeDEKKy5lbmRtCisKKy8vIFJvdW5kLCBzaGlmdCBhbmQgc2F0dXJhdGUgYW5kIHN0b3JlIHJlZzEtNAorLm1hY3JvIGRvX3N0b3JlIHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHR5cGUKKyAgICAgICAgc3Fyc2hydW4gICAgICAgIFxyZWcxXCgpLjhiLCAgXHJlZzFcKCkuOGgsICM3CisgICAgICAgIHNxcnNocnVuICAgICAgICBccmVnMlwoKS44YiwgIFxyZWcyXCgpLjhoLCAjNworICAgICAgICBzcXJzaHJ1biAgICAgICAgXHJlZzNcKCkuOGIsICBccmVnM1woKS44aCwgIzcKKyAgICAgICAgc3Fyc2hydW4gICAgICAgIFxyZWc0XCgpLjhiLCAgXHJlZzRcKCkuOGgsICM3CisuaWZjIFx0eXBlLGF2ZworICAgICAgICBsZDEgICAgICAgICAgICAge1x0bXAxXCgpLjhifSwgIFt4N10sIHgxCisgICAgICAgIGxkMSAgICAgICAgICAgICB7XHRtcDJcKCkuOGJ9LCAgW3g3XSwgeDEKKyAgICAgICAgbGQxICAgICAgICAgICAgIHtcdG1wM1woKS44Yn0sICBbeDddLCB4MQorICAgICAgICBsZDEgICAgICAgICAgICAge1x0bXA0XCgpLjhifSwgIFt4N10sIHgxCisgICAgICAgIHVyaGFkZCAgICAgICAgICBccmVnMVwoKS44YiwgIFxyZWcxXCgpLjhiLCAgXHRtcDFcKCkuOGIKKyAgICAgICAgdXJoYWRkICAgICAgICAgIFxyZWcyXCgpLjhiLCAgXHJlZzJcKCkuOGIsICBcdG1wMlwoKS44YgorICAgICAgICB1cmhhZGQgICAgICAgICAgXHJlZzNcKCkuOGIsICBccmVnM1woKS44YiwgIFx0bXAzXCgpLjhiCisgICAgICAgIHVyaGFkZCAgICAgICAgICBccmVnNFwoKS44YiwgIFxyZWc0XCgpLjhiLCAgXHRtcDRcKCkuOGIKKy5lbmRpZgorICAgICAgICBzdDEgICAgICAgICAgICAge1xyZWcxXCgpLjhifSwgIFt4MF0sIHgxCisgICAgICAgIHN0MSAgICAgICAgICAgICB7XHJlZzJcKCkuOGJ9LCAgW3gwXSwgeDEKKyAgICAgICAgc3QxICAgICAgICAgICAgIHtccmVnM1woKS44Yn0sICBbeDBdLCB4MQorICAgICAgICBzdDEgICAgICAgICAgICAge1xyZWc0XCgpLjhifSwgIFt4MF0sIHgxCisuZW5kbQorCisvLyBFdmFsdWF0ZSB0aGUgZmlsdGVyIHR3aWNlIGluIHBhcmFsbGVsLCBmcm9tIHRoZSBpbnB1dHMgc3JjMS1zcmM5IGludG8gZHN0MS1kc3QyCisvLyAoc3JjMS1zcmM4IGludG8gZHN0MSwgc3JjMi1zcmM5IGludG8gZHN0MiksIGFkZGluZyBpZHgyIHNlcGFyYXRlbHkKKy8vIGF0IHRoZSBlbmQgd2l0aCBzYXR1cmF0aW9uLiBJbmRpY2VzIDAgYW5kIDcgYWx3YXlzIGhhdmUgbmVnYXRpdmUgb3IgemVybworLy8gY29lZmZpY2llbnRzLCBzbyB0aGV5IGNhbiBiZSBhY2N1bXVsYXRlZCBpbnRvIHRtcDEtdG1wMiB0b2dldGhlciB3aXRoIHRoZQorLy8gbGFyZ2VzdCBjb2VmZmljaWVudC4KKy5tYWNybyBjb252b2x2ZSBkc3QxLCBkc3QyLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBpZHgxLCBpZHgyLCB0bXAxLCB0bXAyCisgICAgICAgIG11bCAgICAgICAgICAgICBcZHN0MVwoKS44aCwgXHNyYzJcKCkuOGgsIHYwLmhbMV0KKyAgICAgICAgbXVsICAgICAgICAgICAgIFxkc3QyXCgpLjhoLCBcc3JjM1woKS44aCwgdjAuaFsxXQorICAgICAgICBtdWwgICAgICAgICAgICAgXHRtcDFcKCkuOGgsIFxzcmMxXCgpLjhoLCB2MC5oWzBdCisgICAgICAgIG11bCAgICAgICAgICAgICBcdG1wMlwoKS44aCwgXHNyYzJcKCkuOGgsIHYwLmhbMF0KKyAgICAgICAgbWxhICAgICAgICAgICAgIFxkc3QxXCgpLjhoLCBcc3JjM1woKS44aCwgdjAuaFsyXQorICAgICAgICBtbGEgICAgICAgICAgICAgXGRzdDJcKCkuOGgsIFxzcmM0XCgpLjhoLCB2MC5oWzJdCisuaWYgXGlkeDEgPT0gMworICAgICAgICBtbGEgICAgICAgICAgICAgXGRzdDFcKCkuOGgsIFxzcmM0XCgpLjhoLCB2MC5oWzNdCisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0MlwoKS44aCwgXHNyYzVcKCkuOGgsIHYwLmhbM10KKy5lbHNlCisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0MVwoKS44aCwgXHNyYzVcKCkuOGgsIHYwLmhbNF0KKyAgICAgICAgbWxhICAgICAgICAgICAgIFxkc3QyXCgpLjhoLCBcc3JjNlwoKS44aCwgdjAuaFs0XQorLmVuZGlmCisgICAgICAgIG1sYSAgICAgICAgICAgICBcZHN0MVwoKS44aCwgXHNyYzZcKCkuOGgsIHYwLmhbNV0KKyAgICAgICAgbWxhICAgICAgICAgICAgIFxkc3QyXCgpLjhoLCBcc3JjN1woKS44aCwgdjAuaFs1XQorICAgICAgICBtbGEgICAgICAgICAgICAgXHRtcDFcKCkuOGgsIFxzcmM4XCgpLjhoLCB2MC5oWzddCisgICAgICAgIG1sYSAgICAgICAgICAgICBcdG1wMlwoKS44aCwgXHNyYzlcKCkuOGgsIHYwLmhbN10KKyAgICAgICAgbWxhICAgICAgICAgICAgIFxkc3QxXCgpLjhoLCBcc3JjN1woKS44aCwgdjAuaFs2XQorICAgICAgICBtbGEgICAgICAgICAgICAgXGRzdDJcKCkuOGgsIFxzcmM4XCgpLjhoLCB2MC5oWzZdCisuaWYgXGlkeDIgPT0gMworICAgICAgICBtbGEgICAgICAgICAgICAgXHRtcDFcKCkuOGgsIFxzcmM0XCgpLjhoLCB2MC5oWzNdCisgICAgICAgIG1sYSAgICAgICAgICAgICBcdG1wMlwoKS44aCwgXHNyYzVcKCkuOGgsIHYwLmhbM10KKy5lbHNlCisgICAgICAgIG1sYSAgICAgICAgICAgICBcdG1wMVwoKS44aCwgXHNyYzVcKCkuOGgsIHYwLmhbNF0KKyAgICAgICAgbWxhICAgICAgICAgICAgIFx0bXAyXCgpLjhoLCBcc3JjNlwoKS44aCwgdjAuaFs0XQorLmVuZGlmCisgICAgICAgIHNxYWRkICAgICAgICAgICBcZHN0MVwoKS44aCwgXGRzdDFcKCkuOGgsIFx0bXAxXCgpLjhoCisgICAgICAgIHNxYWRkICAgICAgICAgICBcZHN0MlwoKS44aCwgXGRzdDJcKCkuOGgsIFx0bXAyXCgpLjhoCisuZW5kbQorCisvLyBMb2FkIHBpeGVscyBhbmQgZXh0ZW5kIHRoZW0gdG8gMTYgYml0CisubWFjcm8gbG9hZGwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NAorICAgICAgICBsZDEgICAgICAgICAgICAge3YxLjhifSwgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi44Yn0sIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuOGJ9LCBbeDJdLCB4MworLmlmbmIgXGRzdDQKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NC44Yn0sIFt4Ml0sIHgzCisuZW5kaWYKKyAgICAgICAgdXh0bCAgICAgICAgICAgIFxkc3QxXCgpLjhoLCB2MS44YgorICAgICAgICB1eHRsICAgICAgICAgICAgXGRzdDJcKCkuOGgsIHYyLjhiCisgICAgICAgIHV4dGwgICAgICAgICAgICBcZHN0M1woKS44aCwgdjMuOGIKKy5pZm5iIFxkc3Q0CisgICAgICAgIHV4dGwgICAgICAgICAgICBcZHN0NFwoKS44aCwgdjQuOGIKKy5lbmRpZgorLmVuZG0KKworLy8gSW5zdGFudGlhdGUgYSB2ZXJ0aWNhbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIGZpbHRlcmluZyA4IHBpeGVscyBhdCBhIHRpbWUuCisvLyBUaGUgaGVpZ2h0IGlzIHBhc3NlZCBpbiB4NCwgdGhlIHdpZHRoIGluIHg1IGFuZCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cworLy8gaW4geDYuIGlkeDIgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXJnZXN0IGZpbHRlciBjb2VmZmljaWVudCAoMyBvciA0KQorLy8gYW5kIGlkeDEgaXMgdGhlIG90aGVyIG9uZSBvZiB0aGVtLgorLm1hY3JvIGRvXzh0YXBfOHYgdHlwZSwgaWR4MSwgaWR4MgorZnVuY3Rpb24gXHR5cGVcKClfOHRhcF84dl9caWR4MVxpZHgyCisgICAgICAgIHN1YiAgICAgICAgICAgICB4MiwgIHgyLCAgeDMsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djAuOGh9LCAgW3g2XQorMToKKy5pZmMgXHR5cGUsYXZnCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NywgIHgwCisuZW5kaWYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg2LCAgeDQKKworICAgICAgICBsb2FkbCAgICAgICAgICAgdjE3LCB2MTgsIHYxOQorCisgICAgICAgIGxvYWRsICAgICAgICAgICB2MjAsIHYyMSwgdjIyLCB2MjMKKzI6CisgICAgICAgIGxvYWRsICAgICAgICAgICB2MjQsIHYyNSwgdjI2LCB2MjcKKyAgICAgICAgY29udm9sdmUgICAgICAgIHYxLCAgdjIsICB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCBcaWR4MSwgXGlkeDIsIHY1LCAgdjYKKyAgICAgICAgY29udm9sdmUgICAgICAgIHYzLCAgdjQsICB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCBcaWR4MSwgXGlkeDIsIHY1LCAgdjYKKyAgICAgICAgZG9fc3RvcmUgICAgICAgIHYxLCAgdjIsICB2MywgIHY0LCAgdjUsICB2NiwgIHY3LCAgdjI4LCBcdHlwZQorCisgICAgICAgIHN1YnMgICAgICAgICAgICB4NiwgIHg2LCAgIzQKKyAgICAgICAgYi5lcSAgICAgICAgICAgIDhmCisKKyAgICAgICAgbG9hZGwgICAgICAgICAgIHYxNiwgdjE3LCB2MTgsIHYxOQorICAgICAgICBjb252b2x2ZSAgICAgICAgdjEsICB2MiwgIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjE2LCB2MTcsIFxpZHgxLCBcaWR4MiwgdjUsICB2NgorICAgICAgICBjb252b2x2ZSAgICAgICAgdjMsICB2NCwgIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MTYsIHYxNywgdjE4LCB2MTksIFxpZHgxLCBcaWR4MiwgdjUsICB2NgorICAgICAgICBkb19zdG9yZSAgICAgICAgdjEsICB2MiwgIHYzLCAgdjQsICB2NSwgIHY2LCAgdjcsICB2MjgsIFx0eXBlCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHg2LCAgeDYsICAjNAorICAgICAgICBiLmVxICAgICAgICAgICAgOGYKKworICAgICAgICBsb2FkbCAgICAgICAgICAgdjIwLCB2MjEsIHYyMiwgdjIzCisgICAgICAgIGNvbnZvbHZlICAgICAgICB2MSwgIHYyLCAgdjI1LCB2MjYsIHYyNywgdjE2LCB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgXGlkeDEsIFxpZHgyLCB2NSwgIHY2CisgICAgICAgIGNvbnZvbHZlICAgICAgICB2MywgIHY0LCAgdjI3LCB2MTYsIHYxNywgdjE4LCB2MTksIHYyMCwgdjIxLCB2MjIsIHYyMywgXGlkeDEsIFxpZHgyLCB2NSwgIHY2CisgICAgICAgIGRvX3N0b3JlICAgICAgICB2MSwgIHYyLCAgdjMsICB2NCwgIHY1LCAgdjYsICB2NywgIHYyOCwgXHR5cGUKKworICAgICAgICBzdWJzICAgICAgICAgICAgeDYsICB4NiwgICM0CisgICAgICAgIGIubmUgICAgICAgICAgICAyYgorCis4OgorICAgICAgICBzdWJzICAgICAgICAgICAgeDUsICB4NSwgICM4CisgICAgICAgIGIuZXEgICAgICAgICAgICA5ZgorICAgICAgICAvLyB4MCAtPSBoICogZHN0X3N0cmlkZQorICAgICAgICBtc3ViICAgICAgICAgICAgeDAsICB4MSwgIHg0LCB4MAorICAgICAgICAvLyB4MiAtPSBoICogc3JjX3N0cmlkZQorICAgICAgICBtc3ViICAgICAgICAgICAgeDIsICB4MywgIHg0LCB4MgorICAgICAgICAvLyB4MiAtPSA4ICogc3JjX3N0cmlkZQorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHgzLCBsc2wgIzMKKyAgICAgICAgLy8geDIgKz0gMSAqIHNyY19zdHJpZGUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHgyLCAgeDIsICB4MworICAgICAgICBhZGQgICAgICAgICAgICAgeDIsICB4MiwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4MCwgIHgwLCAgIzgKKyAgICAgICAgYiAgICAgICAgICAgICAgIDFiCis5OgorICAgICAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKK2RvXzh0YXBfOHYgcHV0LCAzLCA0Citkb184dGFwXzh2IHB1dCwgNCwgMworZG9fOHRhcF84diBhdmcsIDMsIDQKK2RvXzh0YXBfOHYgYXZnLCA0LCAzCisKKworLy8gSW5zdGFudGlhdGUgYSB2ZXJ0aWNhbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIGZpbHRlcmluZyBhIDQgcGl4ZWxzIHdpZGUKKy8vIHNsaWNlLiBUaGUgZmlyc3QgaGFsZiBvZiB0aGUgcmVnaXN0ZXJzIGNvbnRhaW4gb25lIHJvdywgd2hpbGUgdGhlIHNlY29uZAorLy8gaGFsZiBvZiBhIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSBzZWNvbmQtbmV4dCByb3cgKGFsc28gc3RvcmVkIGluIHRoZSBmaXJzdAorLy8gaGFsZiBvZiB0aGUgcmVnaXN0ZXIgdHdvIHN0ZXBzIGFoZWFkKS4gVGhlIGNvbnZvbHV0aW9uIGRvZXMgdHdvIG91dHB1dHMKKy8vIGF0IGEgdGltZTsgdGhlIG91dHB1dCBvZiB2MTctdjI0IGludG8gb25lLCBhbmQgdjE4LXYyNSBpbnRvIGFub3RoZXIgb25lLgorLy8gVGhlIGZpcnN0IGhhbGYgb2YgZmlyc3Qgb3V0cHV0IGlzIHRoZSBmaXJzdCBvdXRwdXQgcm93LCB0aGUgZmlyc3QgaGFsZgorLy8gb2YgdGhlIG90aGVyIG91dHB1dCBpcyB0aGUgc2Vjb25kIG91dHB1dCByb3cuIFRoZSBzZWNvbmQgaGFsdmVzIG9mIHRoZQorLy8gcmVnaXN0ZXJzIGFyZSByb3dzIDMgYW5kIDQuCisvLyBUaGlzIG9ubHkgaXMgZGVzaWduZWQgdG8gd29yayBmb3IgNCBvciA4IG91dHB1dCBsaW5lcy4KKy5tYWNybyBkb184dGFwXzR2IHR5cGUsIGlkeDEsIGlkeDIKK2Z1bmN0aW9uIFx0eXBlXCgpXzh0YXBfNHZfXGlkeDFcaWR4MgorICAgICAgICBzdWIgICAgICAgICAgICAgeDIsICB4MiwgIHgzLCBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHgyLCAgeDIsICB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YwLjhofSwgIFt4Nl0KKy5pZmMgXHR5cGUsYXZnCisgICAgICAgIG1vdiAgICAgICAgICAgICB4NywgIHgwCisuZW5kaWYKKworICAgICAgICBsZDEgICAgICAgICAgICAge3YxLnN9WzBdLCAgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5zfVswXSwgIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djMuc31bMF0sICBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3Y0LnN9WzBdLCAgW3gyXSwgeDMKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2NS5zfVswXSwgIFt4Ml0sIHgzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djYuc31bMF0sICBbeDJdLCB4MworICAgICAgICB0cm4xICAgICAgICAgICAgdjEuMnMsICB2MS4ycywgIHYzLjJzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djcuc31bMF0sICBbeDJdLCB4MworICAgICAgICB0cm4xICAgICAgICAgICAgdjIuMnMsICB2Mi4ycywgIHY0LjJzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI2LnN9WzBdLCBbeDJdLCB4MworICAgICAgICB1eHRsICAgICAgICAgICAgdjE3LjhoLCB2MS44YgorICAgICAgICB0cm4xICAgICAgICAgICAgdjMuMnMsICB2My4ycywgIHY1LjJzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI3LnN9WzBdLCBbeDJdLCB4MworICAgICAgICB1eHRsICAgICAgICAgICAgdjE4LjhoLCB2Mi44YgorICAgICAgICB0cm4xICAgICAgICAgICAgdjQuMnMsICB2NC4ycywgIHY2LjJzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI4LnN9WzBdLCBbeDJdLCB4MworICAgICAgICB1eHRsICAgICAgICAgICAgdjE5LjhoLCB2My44YgorICAgICAgICB0cm4xICAgICAgICAgICAgdjUuMnMsICB2NS4ycywgIHY3LjJzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djI5LnN9WzBdLCBbeDJdLCB4MworICAgICAgICB1eHRsICAgICAgICAgICAgdjIwLjhoLCB2NC44YgorICAgICAgICB0cm4xICAgICAgICAgICAgdjYuMnMsICB2Ni4ycywgIHYyNi4ycworICAgICAgICB1eHRsICAgICAgICAgICAgdjIxLjhoLCB2NS44YgorICAgICAgICB0cm4xICAgICAgICAgICAgdjcuMnMsICB2Ny4ycywgIHYyNy4ycworICAgICAgICB1eHRsICAgICAgICAgICAgdjIyLjhoLCB2Ni44YgorICAgICAgICB0cm4xICAgICAgICAgICAgdjI2LjJzLCB2MjYuMnMsIHYyOC4ycworICAgICAgICB1eHRsICAgICAgICAgICAgdjIzLjhoLCB2Ny44YgorICAgICAgICB0cm4xICAgICAgICAgICAgdjI3LjJzLCB2MjcuMnMsIHYyOS4ycworICAgICAgICB1eHRsICAgICAgICAgICAgdjI0LjhoLCB2MjYuOGIKKyAgICAgICAgdXh0bCAgICAgICAgICAgIHYyNS44aCwgdjI3LjhiCisKKyAgICAgICAgY29udm9sdmUgICAgICAgIHYxLCAgdjIsICB2MTcsIHYxOCwgdjE5LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCBcaWR4MSwgXGlkeDIsIHYzLCAgdjQKKyAgICAgICAgZG9fc3RvcmU0ICAgICAgIHYxLCAgdjIsICB2NSwgIHY2LCAgXHR5cGUKKworICAgICAgICBzdWJzICAgICAgICAgICAgeDQsICB4NCwgICM0CisgICAgICAgIGIuZXEgICAgICAgICAgICA5ZgorCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMF0sICBbeDJdLCB4MworICAgICAgICBsZDEgICAgICAgICAgICAge3YyLnN9WzBdLCAgW3gyXSwgeDMKKyAgICAgICAgdHJuMSAgICAgICAgICAgIHYyOC4ycywgdjI4LjJzLCB2MS4ycworICAgICAgICB0cm4xICAgICAgICAgICAgdjI5LjJzLCB2MjkuMnMsIHYyLjJzCisgICAgICAgIGxkMSAgICAgICAgICAgICB7djEuc31bMV0sICBbeDJdLCB4MworICAgICAgICB1eHRsICAgICAgICAgICAgdjI2LjhoLCB2MjguOGIKKyAgICAgICAgbGQxICAgICAgICAgICAgIHt2Mi5zfVsxXSwgIFt4Ml0sIHgzCisgICAgICAgIHV4dGwgICAgICAgICAgICB2MjcuOGgsIHYyOS44YgorICAgICAgICB1eHRsICAgICAgICAgICAgdjI4LjhoLCB2MS44YgorICAgICAgICB1eHRsICAgICAgICAgICAgdjI5LjhoLCB2Mi44YgorCisgICAgICAgIGNvbnZvbHZlICAgICAgICB2MSwgIHYyLCAgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOSwgXGlkeDEsIFxpZHgyLCB2MywgIHY0CisgICAgICAgIGRvX3N0b3JlNCAgICAgICB2MSwgIHYyLCAgdjUsICB2NiwgIFx0eXBlCisKKzk6CisgICAgICAgIHJldAorZW5kZnVuYworLmVuZG0KKworZG9fOHRhcF80diBwdXQsIDMsIDQKK2RvXzh0YXBfNHYgcHV0LCA0LCAzCitkb184dGFwXzR2IGF2ZywgMywgNAorZG9fOHRhcF80diBhdmcsIDQsIDMKKworCisubWFjcm8gZG9fOHRhcF92X2Z1bmMgdHlwZSwgZmlsdGVyLCBvZmZzZXQsIHNpemUKK2Z1bmN0aW9uIGZmX3ZwOV9cdHlwZVwoKV9cZmlsdGVyXCgpXHNpemVcKClfdl9uZW9uLCBleHBvcnQ9MQorICAgICAgICB1eHR3ICAgICAgICAgICAgeDQsICB3NAorICAgICAgICBtb3ZyZWwgICAgICAgICAgeDUsICBYKGZmX3ZwOV9zdWJwZWxfZmlsdGVycyksIDI1Nipcb2Zmc2V0CisgICAgICAgIGNtcCAgICAgICAgICAgICB3NiwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICB4NiwgIHg1LCAgdzYsIHV4dHcgIzQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHg1LCAgI1xzaXplCisuaWYgXHNpemUgPj0gOAorICAgICAgICBiLmdlICAgICAgICAgICAgXHR5cGVcKClfOHRhcF84dl8zNAorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfOHRhcF84dl80MworLmVsc2UKKyAgICAgICAgYi5nZSAgICAgICAgICAgIFx0eXBlXCgpXzh0YXBfNHZfMzQKKyAgICAgICAgYiAgICAgICAgICAgICAgIFx0eXBlXCgpXzh0YXBfNHZfNDMKKy5lbmRpZgorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGRvXzh0YXBfdl9maWx0ZXJzIHNpemUKK2RvXzh0YXBfdl9mdW5jIHB1dCwgcmVndWxhciwgMSwgXHNpemUKK2RvXzh0YXBfdl9mdW5jIGF2ZywgcmVndWxhciwgMSwgXHNpemUKK2RvXzh0YXBfdl9mdW5jIHB1dCwgc2hhcnAsICAgMiwgXHNpemUKK2RvXzh0YXBfdl9mdW5jIGF2Zywgc2hhcnAsICAgMiwgXHNpemUKK2RvXzh0YXBfdl9mdW5jIHB1dCwgc21vb3RoLCAgMCwgXHNpemUKK2RvXzh0YXBfdl9mdW5jIGF2Zywgc21vb3RoLCAgMCwgXHNpemUKKy5lbmRtCisKK2RvXzh0YXBfdl9maWx0ZXJzIDY0Citkb184dGFwX3ZfZmlsdGVycyAzMgorZG9fOHRhcF92X2ZpbHRlcnMgMTYKK2RvXzh0YXBfdl9maWx0ZXJzIDgKK2RvXzh0YXBfdl9maWx0ZXJzIDQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWFzYy5jIGIvbGliYXZjb2RlYy9hYXNjLmMKaW5kZXggNmFiZjNiNy4uNThjYzNjOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYXNjLmMKKysrIGIvbGliYXZjb2RlYy9hYXNjLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQXV0b2Rlc2sgUkxFIERlY29kZXIKLSAqIENvcHlyaWdodCAoYykgMjAwNSBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMTU5LDQgKzE1OSw1IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gYWFzY19kZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICA9IGFhc2NfZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjMy5jIGIvbGliYXZjb2RlYy9hYzMuYwppbmRleCAxZDRlYWE1Li42ZDA5Mjg4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FjMy5jCisrKyBiL2xpYmF2Y29kZWMvYWMzLmMKQEAgLTI0LDkgKzI0LDEwIEBACiAgKiBDb21tb24gY29kZSBiZXR3ZWVuIHRoZSBBQy0zIGVuY29kZXIgYW5kIGRlY29kZXIuCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKwogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJhYzMuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogCiAvKioKICAqIFN0YXJ0aW5nIGZyZXF1ZW5jeSBjb2VmZmljaWVudCBiaW4gZm9yIGVhY2ggY3JpdGljYWwgYmFuZC4KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWMzLmggYi9saWJhdmNvZGVjL2FjMy5oCmluZGV4IDc0N2YyZjUuLmY4ZjZhODEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWMzLmgKKysrIGIvbGliYXZjb2RlYy9hYzMuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBBVkNPREVDX0FDM19ICiAKICNkZWZpbmUgQUMzX01BWF9DT0RFRF9GUkFNRV9TSVpFIDM4NDAgLyogaW4gYnl0ZXMgKi8KKyNkZWZpbmUgRUFDM19NQVhfQ0hBTk5FTFMgMTYgICAgICAgICAgLyoqPCBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBpbiBFQUMzICovCiAjZGVmaW5lIEFDM19NQVhfQ0hBTk5FTFMgNyAgICAgICAgICAgIC8qKjwgbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMsIGluY2x1ZGluZyBjb3VwbGluZyBjaGFubmVsICovCiAjZGVmaW5lIENQTF9DSCAwICAgICAgICAgICAgICAgICAgICAgIC8qKjwgY291cGxpbmcgY2hhbm5lbCBpbmRleCAqLwogCkBAIC04Nyw3ICs4OCw3IEBACiAjZGVmaW5lIEFDM19OT1JNKG5vcm0pICAgICAgICAgICgxLjBmLyhub3JtKSkKICNkZWZpbmUgQUMzX01VTChhLGIpICAgICAgICAgICAgKChhKSAqIChiKSkKICNkZWZpbmUgQUMzX1JBTkdFKHgpICAgICAgICAgICAgKGR5bmFtaWNfcmFuZ2VfdGFiWyh4KV0pCi0jZGVmaW5lIEFDM19IRUFWWV9SQU5HRSh4KSAgICAgIChoZWF2eV9keW5hbWljX3JhbmdlX3RhYlsoeCldKQorI2RlZmluZSBBQzNfSEVBVllfUkFOR0UoeCkgICAgICAoZmZfYWMzX2hlYXZ5X2R5bmFtaWNfcmFuZ2VfdGFiWyh4KV0pCiAjZGVmaW5lIEFDM19EWU5BTUlDX1JBTkdFKHgpICAgIChwb3dmKHgsICBzLT5kcmNfc2NhbGUpKQogI2RlZmluZSBBQzNfU1BYX0JMRU5EKHgpICAgICAgICAoeCkqICgxLjBmLzMyKQogI2RlZmluZSBBQzNfRFlOQU1JQ19SQU5HRTEgICAgICAxLjBmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjM19wYXJzZXIuYyBiL2xpYmF2Y29kZWMvYWMzX3BhcnNlci5jCmluZGV4IDgzZGQ5MGYuLjFlMjAzYWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWMzX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvYWMzX3BhcnNlci5jCkBAIC0yMCwxNSArMjAsMTkgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAiY29uZmlnLmgiCisKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKICNpbmNsdWRlICJwYXJzZXIuaCIKICNpbmNsdWRlICJhYzNfcGFyc2VyLmgiCisjaW5jbHVkZSAiYWMzX3BhcnNlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImFhY19hYzNfcGFyc2VyLmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKIAogCiAjZGVmaW5lIEFDM19IRUFERVJfU0laRSA3CiAKKyNpZiBDT05GSUdfQUMzX1BBUlNFUgogCiBzdGF0aWMgY29uc3QgdWludDhfdCBlYWMzX2Jsb2Nrc1s0XSA9IHsKICAgICAxLCAyLCAzLCA2CkBAIC00NywxNiArNTEsOSBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3Vycm91bmRfbGV2ZWxzWzRdID0geyA0LCA2LCA3LCA2IH07CiAKIAotaW50IGF2cHJpdl9hYzNfcGFyc2VfaGVhZGVyKEdldEJpdENvbnRleHQgKmdiYywgQUMzSGVhZGVySW5mbyAqKnBoZHIpCitpbnQgZmZfYWMzX3BhcnNlX2hlYWRlcihHZXRCaXRDb250ZXh0ICpnYmMsIEFDM0hlYWRlckluZm8gKmhkcikKIHsKICAgICBpbnQgZnJhbWVfc2l6ZV9jb2RlOwotICAgIEFDM0hlYWRlckluZm8gKmhkcjsKLQotICAgIGlmICghKnBoZHIpCi0gICAgICAgICpwaGRyID0gYXZfbWFsbG9jeihzaXplb2YoQUMzSGVhZGVySW5mbykpOwotICAgIGlmICghKnBoZHIpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgaGRyID0gKnBoZHI7CiAKICAgICBtZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOwogCkBAIC0xNTEsNiArMTQ4LDQ4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8vIFRPRE86IEJldHRlciB3YXkgdG8gcGFzcyBBQzNIZWFkZXJJbmZvIGZpZWxkcyB0byBtb3YgbXV4ZXIuCitpbnQgYXZwcml2X2FjM19wYXJzZV9oZWFkZXIoQUMzSGVhZGVySW5mbyAqKnBoZHIsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEFDM0hlYWRlckluZm8gKmhkcjsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKCEqcGhkcikKKyAgICAgICAgKnBoZHIgPSBhdl9tYWxsb2N6KHNpemVvZihBQzNIZWFkZXJJbmZvKSk7CisgICAgaWYgKCEqcGhkcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBoZHIgPSAqcGhkcjsKKworICAgIGVyciA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgYnVmLCBzaXplKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZXJyID0gZmZfYWMzX3BhcnNlX2hlYWRlcigmZ2IsIGhkcik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0dXJuIGdldF9iaXRzX2NvdW50KCZnYik7Cit9CisKK2ludCBhdl9hYzNfcGFyc2VfaGVhZGVyKGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiaXRzdHJlYW1faWQsIHVpbnQxNl90ICpmcmFtZV9zaXplKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgQUMzSGVhZGVySW5mbyBoZHI7CisgICAgaW50IGVycjsKKworICAgIGluaXRfZ2V0X2JpdHM4KCZnYiwgYnVmLCBzaXplKTsKKyAgICBlcnIgPSBmZl9hYzNfcGFyc2VfaGVhZGVyKCZnYiwgJmhkcik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgKmJpdHN0cmVhbV9pZCA9IGhkci5iaXRzdHJlYW1faWQ7CisgICAgKmZyYW1lX3NpemUgICA9IGhkci5mcmFtZV9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYWMzX3N5bmModWludDY0X3Qgc3RhdGUsIEFBQ0FDM1BhcnNlQ29udGV4dCAqaGRyX2luZm8sCiAgICAgICAgIGludCAqbmVlZF9uZXh0X2hlYWRlciwgaW50ICpuZXdfZnJhbWVfc3RhcnQpCiB7CkBAIC0xNTksMTEgKzE5OCwxMSBAQAogICAgICAgICB1aW50NjRfdCB1NjQ7CiAgICAgICAgIHVpbnQ4X3QgIHU4WzggKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXTsKICAgICB9IHRtcCA9IHsgYXZfYmUybmU2NChzdGF0ZSkgfTsKLSAgICBBQzNIZWFkZXJJbmZvIGhkciwgKnBoZHIgPSAmaGRyOworICAgIEFDM0hlYWRlckluZm8gaGRyOwogICAgIEdldEJpdENvbnRleHQgZ2JjOwogCiAgICAgaW5pdF9nZXRfYml0cygmZ2JjLCB0bXAudTgrOC1BQzNfSEVBREVSX1NJWkUsIDU0KTsKLSAgICBlcnIgPSBhdnByaXZfYWMzX3BhcnNlX2hlYWRlcigmZ2JjLCAmcGhkcik7CisgICAgZXJyID0gZmZfYWMzX3BhcnNlX2hlYWRlcigmZ2JjLCAmaGRyKTsKIAogICAgIGlmKGVyciA8IDApCiAgICAgICAgIHJldHVybiAwOwpAQCAtMTgxLDggKzIyMCw4IEBACiAgICAgZWxzZSBpZiAoaGRyX2luZm8tPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCiAgICAgICAgIGhkcl9pbmZvLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FDMzsKIAotICAgICpuZWVkX25leHRfaGVhZGVyID0gKGhkci5mcmFtZV90eXBlICE9IEVBQzNfRlJBTUVfVFlQRV9BQzNfQ09OVkVSVCk7CiAgICAgKm5ld19mcmFtZV9zdGFydCAgPSAoaGRyLmZyYW1lX3R5cGUgIT0gRUFDM19GUkFNRV9UWVBFX0RFUEVOREVOVCk7CisgICAgKm5lZWRfbmV4dF9oZWFkZXIgPSAqbmV3X2ZyYW1lX3N0YXJ0IHx8IChoZHIuZnJhbWVfdHlwZSAhPSBFQUMzX0ZSQU1FX1RZUEVfQUMzX0NPTlZFUlQpOwogICAgIHJldHVybiBoZHIuZnJhbWVfc2l6ZTsKIH0KIApAQCAtMjAyLDMgKzI0MSwxOCBAQAogICAgIC5wYXJzZXJfcGFyc2UgICA9IGZmX2FhY19hYzNfcGFyc2UsCiAgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UsCiB9OworCisjZWxzZQorCitpbnQgYXZwcml2X2FjM19wYXJzZV9oZWFkZXIoQUMzSGVhZGVySW5mbyAqKnBoZHIsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorCitpbnQgYXZfYWMzX3BhcnNlX2hlYWRlcihjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0c3RyZWFtX2lkLCB1aW50MTZfdCAqZnJhbWVfc2l6ZSkKK3sKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjM19wYXJzZXIuaCBiL2xpYmF2Y29kZWMvYWMzX3BhcnNlci5oCmluZGV4IGRjNWQwMzUuLmZmOGNjNGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWMzX3BhcnNlci5oCisrKyBiL2xpYmF2Y29kZWMvYWMzX3BhcnNlci5oCkBAIC0yMywyMCArMjMsMTQgQEAKICNpZm5kZWYgQVZDT0RFQ19BQzNfUEFSU0VSX0gKICNkZWZpbmUgQVZDT0RFQ19BQzNfUEFSU0VSX0gKIAotI2luY2x1ZGUgImFjMy5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIC8qKgotICogUGFyc2UgQUMtMyBmcmFtZSBoZWFkZXIuCi0gKiBQYXJzZSB0aGUgaGVhZGVyIHVwIHRvIHRoZSBsZmVvbiBlbGVtZW50LCB3aGljaCBpcyB0aGUgZmlyc3QgNTIgb3IgNTQgYml0cwotICogZGVwZW5kaW5nIG9uIHRoZSBhdWRpbyBjb2RpbmcgbW9kZS4KLSAqIEBwYXJhbVtpbl0gIGdiYyBCaXRDb250ZXh0IGNvbnRhaW5pbmcgdGhlIGZpcnN0IDU0IGJpdHMgb2YgdGhlIGZyYW1lLgotICogQHBhcmFtW291dF0gaGRyIFBvaW50ZXIgdG8gUG9pbnRlciB0byBzdHJ1Y3Qgd2hlcmUgaGVhZGVyIGluZm8gaXMgd3JpdHRlbi4KLSAqICAgICAgICAgICAgICAgICB3aWxsIGJlIGFsbG9jYXRlZCBpZiBOVUxMCi0gKiBAcmV0dXJuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBpZiB0aGVyZSBpcyBhIHN5bmMgd29yZCBtaXNtYXRjaCwKLSAqIC0yIGlmIHRoZSBic2lkICh2ZXJzaW9uKSBlbGVtZW50IGlzIGludmFsaWQsIC0zIGlmIHRoZSBmc2NvZCAoc2FtcGxlIHJhdGUpCi0gKiBlbGVtZW50IGlzIGludmFsaWQsIG9yIC00IGlmIHRoZSBmcm1zaXplY29kIChiaXQgcmF0ZSkgZWxlbWVudCBpcyBpbnZhbGlkLgorICogRXh0cmFjdCB0aGUgYml0c3RyZWFtIElEIGFuZCB0aGUgZnJhbWUgc2l6ZSBmcm9tIEFDLTMgZGF0YS4KICAqLwotaW50IGF2cHJpdl9hYzNfcGFyc2VfaGVhZGVyKEdldEJpdENvbnRleHQgKmdiYywgQUMzSGVhZGVySW5mbyAqKmhkcik7CitpbnQgYXZfYWMzX3BhcnNlX2hlYWRlcihjb25zdCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYml0c3RyZWFtX2lkLCB1aW50MTZfdCAqZnJhbWVfc2l6ZSk7CisKIAogI2VuZGlmIC8qIEFWQ09ERUNfQUMzX1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjM19wYXJzZXJfaW50ZXJuYWwuaCBiL2xpYmF2Y29kZWMvYWMzX3BhcnNlcl9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDg4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FjM19wYXJzZXJfaW50ZXJuYWwuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQUMtMyBwYXJzZXIgaW50ZXJuYWwgY29kZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQUMzX1BBUlNFUl9JTlRFUk5BTF9ICisjZGVmaW5lIEFWQ09ERUNfQUMzX1BBUlNFUl9JTlRFUk5BTF9ICisKKyNpbmNsdWRlICJhYzMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorCisvKioKKyAqIFBhcnNlIEFDLTMgZnJhbWUgaGVhZGVyLgorICogUGFyc2UgdGhlIGhlYWRlciB1cCB0byB0aGUgbGZlb24gZWxlbWVudCwgd2hpY2ggaXMgdGhlIGZpcnN0IDUyIG9yIDU0IGJpdHMKKyAqIGRlcGVuZGluZyBvbiB0aGUgYXVkaW8gY29kaW5nIG1vZGUuCisgKiBAcGFyYW1baW5dICBnYmMgQml0Q29udGV4dCBjb250YWluaW5nIHRoZSBmaXJzdCA1NCBiaXRzIG9mIHRoZSBmcmFtZS4KKyAqIEBwYXJhbVtvdXRdIGhkciBQb2ludGVyIHRvIHN0cnVjdCB3aGVyZSBoZWFkZXIgaW5mbyBpcyB3cml0dGVuLgorICogQHJldHVybiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgaWYgdGhlcmUgaXMgYSBzeW5jIHdvcmQgbWlzbWF0Y2gsCisgKiAtMiBpZiB0aGUgYnNpZCAodmVyc2lvbikgZWxlbWVudCBpcyBpbnZhbGlkLCAtMyBpZiB0aGUgZnNjb2QgKHNhbXBsZSByYXRlKQorICogZWxlbWVudCBpcyBpbnZhbGlkLCBvciAtNCBpZiB0aGUgZnJtc2l6ZWNvZCAoYml0IHJhdGUpIGVsZW1lbnQgaXMgaW52YWxpZC4KKyAqLworaW50IGZmX2FjM19wYXJzZV9oZWFkZXIoR2V0Qml0Q29udGV4dCAqZ2JjLCBBQzNIZWFkZXJJbmZvICpoZHIpOworCitpbnQgYXZwcml2X2FjM19wYXJzZV9oZWFkZXIoQUMzSGVhZGVySW5mbyAqKmhkciwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQUMzX1BBUlNFUl9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjM2RlYy5jIGIvbGliYXZjb2RlYy9hYzNkZWMuYwppbmRleCA1ZDUzMzBjLi40M2IyMmI3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FjM2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvYWMzZGVjLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlICJic3dhcGRzcC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYWFjX2FjM19wYXJzZXIuaCIKLSNpbmNsdWRlICJhYzNfcGFyc2VyLmgiCisjaW5jbHVkZSAiYWMzX3BhcnNlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImFjM2RlYy5oIgogI2luY2x1ZGUgImFjM2RlY19kYXRhLmgiCiAjaW5jbHVkZSAia2Jkd2luLmgiCkBAIC02Myw5ICs2MywxMSBAQAogICAgIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDE0LCAxNgogfTsKIAorI2lmICghVVNFX0ZJWEVEKQogLyoqIGR5bmFtaWMgcmFuZ2UgdGFibGUuIGNvbnZlcnRzIGNvZGVzIHRvIHNjYWxlIGZhY3RvcnMuICovCiBzdGF0aWMgZmxvYXQgZHluYW1pY19yYW5nZV90YWJbMjU2XTsKLXN0YXRpYyBmbG9hdCBoZWF2eV9keW5hbWljX3JhbmdlX3RhYlsyNTZdOworZmxvYXQgZmZfYWMzX2hlYXZ5X2R5bmFtaWNfcmFuZ2VfdGFiWzI1Nl07CisjZW5kaWYKIAogLyoqIEFkanVzdG1lbnRzIGluIGRCIGdhaW4gKi8KIHN0YXRpYyBjb25zdCBmbG9hdCBnYWluX2xldmVsc1s5XSA9IHsKQEAgLTE1OSw2ICsxNjEsNyBAQAogICAgICAgICBiNV9tYW50aXNzYXNbaV0gPSBzeW1tZXRyaWNfZGVxdWFudChpLCAxNSk7CiAgICAgfQogCisjaWYgKCFVU0VfRklYRUQpCiAgICAgLyogZ2VuZXJhdGUgZHluYW1pYyByYW5nZSB0YWJsZQogICAgICAgIHJlZmVyZW5jZTogU2VjdGlvbiA3LjcuMSBEeW5hbWljIFJhbmdlIENvbnRyb2wgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKQEAgLTE3MCw5ICsxNzMsOSBAQAogICAgICAgIHJlZmVyZW5jZTogU2VjdGlvbiA3LjcuMiBIZWF2eSBDb21wcmVzc2lvbiAqLwogICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICBpbnQgdiA9IChpID4+IDQpIC0gKChpID4+IDcpIDw8IDQpIC0gNDsKLSAgICAgICAgaGVhdnlfZHluYW1pY19yYW5nZV90YWJbaV0gPSBwb3dmKDIuMGYsIHYpICogKChpICYgMHhGKSB8IDB4MTApOworICAgICAgICBmZl9hYzNfaGVhdnlfZHluYW1pY19yYW5nZV90YWJbaV0gPSBwb3dmKDIuMGYsIHYpICogKChpICYgMHhGKSB8IDB4MTApOwogICAgIH0KLQorI2VuZGlmCiB9CiAKIC8qKgpAQCAtMjk0LDEwICsyOTcsMTAgQEAKICAqLwogc3RhdGljIGludCBwYXJzZV9mcmFtZV9oZWFkZXIoQUMzRGVjb2RlQ29udGV4dCAqcykKIHsKLSAgICBBQzNIZWFkZXJJbmZvIGhkciwgKnBoZHI9JmhkcjsKKyAgICBBQzNIZWFkZXJJbmZvIGhkcjsKICAgICBpbnQgZXJyOwogCi0gICAgZXJyID0gYXZwcml2X2FjM19wYXJzZV9oZWFkZXIoJnMtPmdiYywgJnBoZHIpOworICAgIGVyciA9IGZmX2FjM19wYXJzZV9oZWFkZXIoJnMtPmdiYywgJmhkcik7CiAgICAgaWYgKGVycikKICAgICAgICAgcmV0dXJuIGVycjsKIApAQCAtMzE0LDYgKzMxNyw3IEBACiAgICAgcy0+ZmJ3X2NoYW5uZWxzICAgICAgICAgICAgICAgICA9IHMtPmNoYW5uZWxzIC0gcy0+bGZlX29uOwogICAgIHMtPmxmZV9jaCAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5mYndfY2hhbm5lbHMgKyAxOwogICAgIHMtPmZyYW1lX3NpemUgICAgICAgICAgICAgICAgICAgPSBoZHIuZnJhbWVfc2l6ZTsKKyAgICBzLT5zdXBlcmZyYW1lX3NpemUgICAgICAgICAgICAgKz0gaGRyLmZyYW1lX3NpemU7CiAgICAgcy0+cHJlZmVycmVkX2Rvd25taXggICAgICAgICAgICA9IEFDM19ETUlYTU9EX05PVElORElDQVRFRDsKICAgICBzLT5jZW50ZXJfbWl4X2xldmVsICAgICAgICAgICAgID0gaGRyLmNlbnRlcl9taXhfbGV2ZWw7CiAgICAgcy0+Y2VudGVyX21peF9sZXZlbF9sdHJ0ICAgICAgICA9IDQ7IC8vIC0zLjBkQgpAQCAtMzU5LDUyICszNjMsNjIgQEAKICAqIFNldCBzdGVyZW8gZG93bm1peGluZyBjb2VmZmljaWVudHMgYmFzZWQgb24gZnJhbWUgaGVhZGVyIGluZm8uCiAgKiByZWZlcmVuY2U6IFNlY3Rpb24gNy44LjIgRG93bm1peGluZyBJbnRvIFR3byBDaGFubmVscwogICovCi1zdGF0aWMgdm9pZCBzZXRfZG93bm1peF9jb2VmZnMoQUMzRGVjb2RlQ29udGV4dCAqcykKK3N0YXRpYyBpbnQgc2V0X2Rvd25taXhfY29lZmZzKEFDM0RlY29kZUNvbnRleHQgKnMpCiB7CiAgICAgaW50IGk7CiAgICAgZmxvYXQgY21peCA9IGdhaW5fbGV2ZWxzW3MtPiAgY2VudGVyX21peF9sZXZlbF07CiAgICAgZmxvYXQgc21peCA9IGdhaW5fbGV2ZWxzW3MtPnN1cnJvdW5kX21peF9sZXZlbF07CiAgICAgZmxvYXQgbm9ybTAsIG5vcm0xOwotICAgIGZsb2F0IGRvd25taXhfY29lZmZzW0FDM19NQVhfQ0hBTk5FTFNdWzJdOworICAgIGZsb2F0IGRvd25taXhfY29lZmZzWzJdW0FDM19NQVhfQ0hBTk5FTFNdOworCisgICAgaWYgKCFzLT5kb3dubWl4X2NvZWZmc1swXSkgeworICAgICAgICBzLT5kb3dubWl4X2NvZWZmc1swXSA9IGF2X21hbGxvY19hcnJheSgyICogQUMzX01BWF9DSEFOTkVMUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCoqcy0+ZG93bm1peF9jb2VmZnMpKTsKKyAgICAgICAgaWYgKCFzLT5kb3dubWl4X2NvZWZmc1swXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPmRvd25taXhfY29lZmZzWzFdID0gcy0+ZG93bm1peF9jb2VmZnNbMF0gKyBBQzNfTUFYX0NIQU5ORUxTOworICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mYndfY2hhbm5lbHM7IGkrKykgewotICAgICAgICBkb3dubWl4X2NvZWZmc1tpXVswXSA9IGdhaW5fbGV2ZWxzW2FjM19kZWZhdWx0X2NvZWZmc1tzLT5jaGFubmVsX21vZGVdW2ldWzBdXTsKLSAgICAgICAgZG93bm1peF9jb2VmZnNbaV1bMV0gPSBnYWluX2xldmVsc1thYzNfZGVmYXVsdF9jb2VmZnNbcy0+Y2hhbm5lbF9tb2RlXVtpXVsxXV07CisgICAgICAgIGRvd25taXhfY29lZmZzWzBdW2ldID0gZ2Fpbl9sZXZlbHNbYWMzX2RlZmF1bHRfY29lZmZzW3MtPmNoYW5uZWxfbW9kZV1baV1bMF1dOworICAgICAgICBkb3dubWl4X2NvZWZmc1sxXVtpXSA9IGdhaW5fbGV2ZWxzW2FjM19kZWZhdWx0X2NvZWZmc1tzLT5jaGFubmVsX21vZGVdW2ldWzFdXTsKICAgICB9CiAgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA+IDEgJiYgcy0+Y2hhbm5lbF9tb2RlICYgMSkgewotICAgICAgICBkb3dubWl4X2NvZWZmc1sxXVswXSA9IGRvd25taXhfY29lZmZzWzFdWzFdID0gY21peDsKKyAgICAgICAgZG93bm1peF9jb2VmZnNbMF1bMV0gPSBkb3dubWl4X2NvZWZmc1sxXVsxXSA9IGNtaXg7CiAgICAgfQogICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV8yRjFSIHx8IHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFXzNGMVIpIHsKICAgICAgICAgaW50IG5mID0gcy0+Y2hhbm5lbF9tb2RlIC0gMjsKLSAgICAgICAgZG93bm1peF9jb2VmZnNbbmZdWzBdID0gZG93bm1peF9jb2VmZnNbbmZdWzFdID0gc21peCAqIExFVkVMX01JTlVTXzNEQjsKKyAgICAgICAgZG93bm1peF9jb2VmZnNbMF1bbmZdID0gZG93bm1peF9jb2VmZnNbMV1bbmZdID0gc21peCAqIExFVkVMX01JTlVTXzNEQjsKICAgICB9CiAgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFXzJGMlIgfHwgcy0+Y2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfM0YyUikgewogICAgICAgICBpbnQgbmYgPSBzLT5jaGFubmVsX21vZGUgLSA0OwotICAgICAgICBkb3dubWl4X2NvZWZmc1tuZl1bMF0gPSBkb3dubWl4X2NvZWZmc1tuZisxXVsxXSA9IHNtaXg7CisgICAgICAgIGRvd25taXhfY29lZmZzWzBdW25mXSA9IGRvd25taXhfY29lZmZzWzFdW25mKzFdID0gc21peDsKICAgICB9CiAKICAgICAvKiByZW5vcm1hbGl6ZSAqLwogICAgIG5vcm0wID0gbm9ybTEgPSAwLjA7CiAgICAgZm9yIChpID0gMDsgaSA8IHMtPmZid19jaGFubmVsczsgaSsrKSB7Ci0gICAgICAgIG5vcm0wICs9IGRvd25taXhfY29lZmZzW2ldWzBdOwotICAgICAgICBub3JtMSArPSBkb3dubWl4X2NvZWZmc1tpXVsxXTsKKyAgICAgICAgbm9ybTAgKz0gZG93bm1peF9jb2VmZnNbMF1baV07CisgICAgICAgIG5vcm0xICs9IGRvd25taXhfY29lZmZzWzFdW2ldOwogICAgIH0KICAgICBub3JtMCA9IDEuMGYgLyBub3JtMDsKICAgICBub3JtMSA9IDEuMGYgLyBub3JtMTsKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZmJ3X2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgZG93bm1peF9jb2VmZnNbaV1bMF0gKj0gbm9ybTA7Ci0gICAgICAgIGRvd25taXhfY29lZmZzW2ldWzFdICo9IG5vcm0xOworICAgICAgICBkb3dubWl4X2NvZWZmc1swXVtpXSAqPSBub3JtMDsKKyAgICAgICAgZG93bm1peF9jb2VmZnNbMV1baV0gKj0gbm9ybTE7CiAgICAgfQogCiAgICAgaWYgKHMtPm91dHB1dF9tb2RlID09IEFDM19DSE1PREVfTU9OTykgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZmJ3X2NoYW5uZWxzOyBpKyspCi0gICAgICAgICAgICBkb3dubWl4X2NvZWZmc1tpXVswXSA9IChkb3dubWl4X2NvZWZmc1tpXVswXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X2NvZWZmc1tpXVsxXSkgKiBMRVZFTF9NSU5VU18zREI7CisgICAgICAgICAgICBkb3dubWl4X2NvZWZmc1swXVtpXSA9IChkb3dubWl4X2NvZWZmc1swXVtpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3dubWl4X2NvZWZmc1sxXVtpXSkgKiBMRVZFTF9NSU5VU18zREI7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mYndfY2hhbm5lbHM7IGkrKykgewotICAgICAgICBzLT5kb3dubWl4X2NvZWZmc1tpXVswXSA9IEZJWFIxMihkb3dubWl4X2NvZWZmc1tpXVswXSk7Ci0gICAgICAgIHMtPmRvd25taXhfY29lZmZzW2ldWzFdID0gRklYUjEyKGRvd25taXhfY29lZmZzW2ldWzFdKTsKKyAgICAgICAgcy0+ZG93bm1peF9jb2VmZnNbMF1baV0gPSBGSVhSMTIoZG93bm1peF9jb2VmZnNbMF1baV0pOworICAgICAgICBzLT5kb3dubWl4X2NvZWZmc1sxXVtpXSA9IEZJWFIxMihkb3dubWl4X2NvZWZmc1sxXVtpXSk7CiAgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtNDIzLDYgKzQzNywxMCBAQAogICAgIGdyb3VwX3NpemUgPSBleHBfc3RyYXRlZ3kgKyAoZXhwX3N0cmF0ZWd5ID09IEVYUF9ENDUpOwogICAgIGZvciAoZ3JwID0gMCwgaSA9IDA7IGdycCA8IG5ncnBzOyBncnArKykgewogICAgICAgICBleHBhY2MgPSBnZXRfYml0cyhnYmMsIDcpOworICAgICAgICBpZiAoZXhwYWNjID49IDEyNSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJleHBhY2MgJWQgaXMgb3V0LW9mLXJhbmdlXG4iLCBleHBhY2MpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KICAgICAgICAgZGV4cFtpKytdID0gdW5ncm91cF8zX2luXzdfYml0c190YWJbZXhwYWNjXVswXTsKICAgICAgICAgZGV4cFtpKytdID0gdW5ncm91cF8zX2luXzdfYml0c190YWJbZXhwYWNjXVsxXTsKICAgICAgICAgZGV4cFtpKytdID0gdW5ncm91cF8zX2luXzdfYml0c190YWJbZXhwYWNjXVsyXTsKQEAgLTU4Niw4ICs2MDQsOCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZGVjb2RlX3RyYW5zZm9ybV9jb2VmZnNfY2goQUMzRGVjb2RlQ29udGV4dCAqcywgaW50IGJsaywgaW50IGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudF9ncm91cHMgKm0pCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlX3RyYW5zZm9ybV9jb2VmZnNfY2goQUMzRGVjb2RlQ29udGV4dCAqcywgaW50IGJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2gsIG1hbnRfZ3JvdXBzICptKQogewogICAgIGlmICghcy0+Y2hhbm5lbF91c2VzX2FodFtjaF0pIHsKICAgICAgICAgYWMzX2RlY29kZV90cmFuc2Zvcm1fY29lZmZzX2NoKHMsIGNoLCBtKTsKQEAgLTYwNiw3ICs2MjQsNyBAQAogLyoqCiAgKiBEZWNvZGUgdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudHMuCiAgKi8KLXN0YXRpYyB2b2lkIGRlY29kZV90cmFuc2Zvcm1fY29lZmZzKEFDM0RlY29kZUNvbnRleHQgKnMsIGludCBibGspCitzdGF0aWMgaW5saW5lIHZvaWQgZGVjb2RlX3RyYW5zZm9ybV9jb2VmZnMoQUMzRGVjb2RlQ29udGV4dCAqcywgaW50IGJsaykKIHsKICAgICBpbnQgY2gsIGVuZDsKICAgICBpbnQgZ290X2NwbGNoYW4gPSAwOwpAQCAtNjY2LDcgKzY4NCw3IEBACiAgKiBDb252ZXJ0IGZyZXF1ZW5jeSBkb21haW4gY29lZmZpY2llbnRzIHRvIHRpbWUtZG9tYWluIGF1ZGlvIHNhbXBsZXMuCiAgKiByZWZlcmVuY2U6IFNlY3Rpb24gNy45LjQgVHJhbnNmb3JtYXRpb24gRXF1YXRpb25zCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBkb19pbWRjdChBQzNEZWNvZGVDb250ZXh0ICpzLCBpbnQgY2hhbm5lbHMpCitzdGF0aWMgaW5saW5lIHZvaWQgZG9faW1kY3QoQUMzRGVjb2RlQ29udGV4dCAqcywgaW50IGNoYW5uZWxzLCBpbnQgb2Zmc2V0KQogewogICAgIGludCBjaDsKIApAQCAtNjc4LDI1ICs2OTYsMjUgQEAKICAgICAgICAgICAgICAgICB4W2ldID0gcy0+dHJhbnNmb3JtX2NvZWZmc1tjaF1bMiAqIGldOwogICAgICAgICAgICAgcy0+aW1kY3RfMjU2LmltZGN0X2hhbGYoJnMtPmltZGN0XzI1Niwgcy0+dG1wX291dHB1dCwgeCk7CiAjaWYgVVNFX0ZJWEVECi0gICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3dfc2NhbGVkKHMtPm91dHB0cltjaCAtIDFdLCBzLT5kZWxheVtjaCAtIDFdLAorICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93X3NjYWxlZChzLT5vdXRwdHJbY2ggLSAxXSwgcy0+ZGVsYXlbY2ggLSAxICsgb2Zmc2V0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF9vdXRwdXQsIHMtPndpbmRvdywgMTI4LCA4KTsKICNlbHNlCi0gICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3cocy0+b3V0cHRyW2NoIC0gMV0sIHMtPmRlbGF5W2NoIC0gMV0sCisgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3cocy0+b3V0cHRyW2NoIC0gMV0sIHMtPmRlbGF5W2NoIC0gMSArIG9mZnNldF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50bXBfb3V0cHV0LCBzLT53aW5kb3csIDEyOCk7CiAjZW5kaWYKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykKICAgICAgICAgICAgICAgICB4W2ldID0gcy0+dHJhbnNmb3JtX2NvZWZmc1tjaF1bMiAqIGkgKyAxXTsKLSAgICAgICAgICAgIHMtPmltZGN0XzI1Ni5pbWRjdF9oYWxmKCZzLT5pbWRjdF8yNTYsIHMtPmRlbGF5W2NoIC0gMV0sIHgpOworICAgICAgICAgICAgcy0+aW1kY3RfMjU2LmltZGN0X2hhbGYoJnMtPmltZGN0XzI1Niwgcy0+ZGVsYXlbY2ggLSAxICsgb2Zmc2V0XSwgeCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBzLT5pbWRjdF81MTIuaW1kY3RfaGFsZigmcy0+aW1kY3RfNTEyLCBzLT50bXBfb3V0cHV0LCBzLT50cmFuc2Zvcm1fY29lZmZzW2NoXSk7CiAjaWYgVVNFX0ZJWEVECi0gICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3dfc2NhbGVkKHMtPm91dHB0cltjaCAtIDFdLCBzLT5kZWxheVtjaCAtIDFdLAorICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93X3NjYWxlZChzLT5vdXRwdHJbY2ggLSAxXSwgcy0+ZGVsYXlbY2ggLSAxICsgb2Zmc2V0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF9vdXRwdXQsIHMtPndpbmRvdywgMTI4LCA4KTsKICNlbHNlCi0gICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3cocy0+b3V0cHRyW2NoIC0gMV0sIHMtPmRlbGF5W2NoIC0gMV0sCisgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF93aW5kb3cocy0+b3V0cHRyW2NoIC0gMV0sIHMtPmRlbGF5W2NoIC0gMSArIG9mZnNldF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50bXBfb3V0cHV0LCBzLT53aW5kb3csIDEyOCk7CiAjZW5kaWYKLSAgICAgICAgICAgIG1lbWNweShzLT5kZWxheVtjaCAtIDFdLCBzLT50bXBfb3V0cHV0ICsgMTI4LCAxMjggKiBzaXplb2YoRkZUU2FtcGxlKSk7CisgICAgICAgICAgICBtZW1jcHkocy0+ZGVsYXlbY2ggLSAxICsgb2Zmc2V0XSwgcy0+dG1wX291dHB1dCArIDEyOCwgMTI4ICogc2l6ZW9mKEZGVFNhbXBsZSkpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtNzQ0LDMwICs3NjIsMzEgQEAKICAqIEBwYXJhbVtpbl0gZGVmYXVsdF9iYW5kX3N0cnVjdCBkZWZhdWx0IGJhbmQgc3RydWN0dXJlIHRhYmxlCiAgKiBAcGFyYW1bb3V0XSBudW1fYmFuZHMgbnVtYmVyIG9mIGJhbmRzIChvcHRpb25hbGx5IE5VTEwpCiAgKiBAcGFyYW1bb3V0XSBiYW5kX3NpemVzIGFycmF5IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBiaW5zIGluIGVhY2ggYmFuZCAob3B0aW9uYWxseSBOVUxMKQorICogQHBhcmFtW2luLG91dF0gYmFuZF9zdHJ1Y3QgY3VycmVudCBiYW5kIHN0cnVjdHVyZQogICovCiBzdGF0aWMgdm9pZCBkZWNvZGVfYmFuZF9zdHJ1Y3R1cmUoR2V0Qml0Q29udGV4dCAqZ2JjLCBpbnQgYmxrLCBpbnQgZWFjMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWNwbCwgaW50IHN0YXJ0X3N1YmJhbmQsIGludCBlbmRfc3ViYmFuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkZWZhdWx0X2JhbmRfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbnVtX2JhbmRzLCB1aW50OF90ICpiYW5kX3NpemVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbnVtX2JhbmRzLCB1aW50OF90ICpiYW5kX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJhbmRfc3RydWN0LCBpbnQgYmFuZF9zdHJ1Y3Rfc2l6ZSkKIHsKICAgICBpbnQgc3ViYm5kLCBibmQsIG5fc3ViYmFuZHMsIG5fYmFuZHM9MDsKICAgICB1aW50OF90IGJuZF9zelsyMl07Ci0gICAgdWludDhfdCBjb2RlZF9iYW5kX3N0cnVjdFsyMl07Ci0gICAgY29uc3QgdWludDhfdCAqYmFuZF9zdHJ1Y3Q7CiAKICAgICBuX3N1YmJhbmRzID0gZW5kX3N1YmJhbmQgLSBzdGFydF9zdWJiYW5kOwogCisgICAgaWYgKCFibGspCisgICAgICAgIG1lbWNweShiYW5kX3N0cnVjdCwgZGVmYXVsdF9iYW5kX3N0cnVjdCwgYmFuZF9zdHJ1Y3Rfc2l6ZSk7CisKKyAgICBhdl9hc3NlcnQwKGJhbmRfc3RydWN0X3NpemUgPj0gc3RhcnRfc3ViYmFuZCArIG5fc3ViYmFuZHMpOworCisgICAgYmFuZF9zdHJ1Y3QgKz0gc3RhcnRfc3ViYmFuZCArIDE7CisKICAgICAvKiBkZWNvZGUgYmFuZCBzdHJ1Y3R1cmUgZnJvbSBiaXRzdHJlYW0gb3IgdXNlIGRlZmF1bHQgKi8KICAgICBpZiAoIWVhYzMgfHwgZ2V0X2JpdHMxKGdiYykpIHsKICAgICAgICAgZm9yIChzdWJibmQgPSAwOyBzdWJibmQgPCBuX3N1YmJhbmRzIC0gMTsgc3ViYm5kKyspIHsKLSAgICAgICAgICAgIGNvZGVkX2JhbmRfc3RydWN0W3N1YmJuZF0gPSBnZXRfYml0czEoZ2JjKTsKKyAgICAgICAgICAgIGJhbmRfc3RydWN0W3N1YmJuZF0gPSBnZXRfYml0czEoZ2JjKTsKICAgICAgICAgfQotICAgICAgICBiYW5kX3N0cnVjdCA9IGNvZGVkX2JhbmRfc3RydWN0OwotICAgIH0gZWxzZSBpZiAoIWJsaykgewotICAgICAgICBiYW5kX3N0cnVjdCA9ICZkZWZhdWx0X2JhbmRfc3RydWN0W3N0YXJ0X3N1YmJhbmQrMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogbm8gY2hhbmdlIGluIGJhbmQgc3RydWN0dXJlICovCi0gICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICAvKiBjYWxjdWxhdGUgbnVtYmVyIG9mIGJhbmRzIGFuZCBiYW5kIHNpemVzIGJhc2VkIG9uIGJhbmQgc3RydWN0dXJlLgpAQCAtNzk0LDE0ICs4MTMsMjYyIEBACiAgICAgICAgIG1lbWNweShiYW5kX3NpemVzLCBibmRfc3osIG5fYmFuZHMpOwogfQogCitzdGF0aWMgaW5saW5lIGludCBzcHhfc3RyYXRlZ3koQUMzRGVjb2RlQ29udGV4dCAqcywgaW50IGJsaykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpiYyA9ICZzLT5nYmM7CisgICAgaW50IGZid19jaGFubmVscyA9IHMtPmZid19jaGFubmVsczsKKyAgICBpbnQgZHN0X3N0YXJ0X2ZyZXEsIGRzdF9lbmRfZnJlcSwgc3JjX3N0YXJ0X2ZyZXEsCisgICAgICAgIHN0YXJ0X3N1YmJhbmQsIGVuZF9zdWJiYW5kLCBjaDsKKworICAgIC8qIGRldGVybWluZSB3aGljaCBjaGFubmVscyB1c2Ugc3B4ICovCisgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX01PTk8pIHsKKyAgICAgICAgcy0+Y2hhbm5lbF91c2VzX3NweFsxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IGZid19jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIHMtPmNoYW5uZWxfdXNlc19zcHhbY2hdID0gZ2V0X2JpdHMxKGJjKTsKKyAgICB9CisKKyAgICAvKiBnZXQgdGhlIGZyZXF1ZW5jeSBiaW5zIG9mIHRoZSBzcHggY29weSByZWdpb24gYW5kIHRoZSBzcHggc3RhcnQKKyAgICAgICBhbmQgZW5kIHN1YmJhbmRzICovCisgICAgZHN0X3N0YXJ0X2ZyZXEgPSBnZXRfYml0cyhiYywgMik7CisgICAgc3RhcnRfc3ViYmFuZCAgPSBnZXRfYml0cyhiYywgMykgKyAyOworICAgIGlmIChzdGFydF9zdWJiYW5kID4gNykKKyAgICAgICAgc3RhcnRfc3ViYmFuZCArPSBzdGFydF9zdWJiYW5kIC0gNzsKKyAgICBlbmRfc3ViYmFuZCAgICA9IGdldF9iaXRzKGJjLCAzKSArIDU7CisjaWYgVVNFX0ZJWEVECisgICAgcy0+c3B4X2RzdF9lbmRfZnJlcSA9IGVuZF9mcmVxX2ludl90YWJbZW5kX3N1YmJhbmQtNV07CisjZW5kaWYKKyAgICBpZiAoZW5kX3N1YmJhbmQgICA+IDcpCisgICAgICAgIGVuZF9zdWJiYW5kICAgKz0gZW5kX3N1YmJhbmQgICAtIDc7CisgICAgZHN0X3N0YXJ0X2ZyZXEgPSBkc3Rfc3RhcnRfZnJlcSAqIDEyICsgMjU7CisgICAgc3JjX3N0YXJ0X2ZyZXEgPSBzdGFydF9zdWJiYW5kICAqIDEyICsgMjU7CisgICAgZHN0X2VuZF9mcmVxICAgPSBlbmRfc3ViYmFuZCAgICAqIDEyICsgMjU7CisKKyAgICAvKiBjaGVjayB2YWxpZGl0eSBvZiBzcHggcmFuZ2VzICovCisgICAgaWYgKHN0YXJ0X3N1YmJhbmQgPj0gZW5kX3N1YmJhbmQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHNwZWN0cmFsIGV4dGVuc2lvbiAiCisgICAgICAgICAgICAgICAicmFuZ2UgKCVkID49ICVkKVxuIiwgc3RhcnRfc3ViYmFuZCwgZW5kX3N1YmJhbmQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKGRzdF9zdGFydF9mcmVxID49IHNyY19zdGFydF9mcmVxKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzcGVjdHJhbCBleHRlbnNpb24gIgorICAgICAgICAgICAgICAgImNvcHkgc3RhcnQgYmluICglZCA+PSAlZClcbiIsIGRzdF9zdGFydF9mcmVxLCBzcmNfc3RhcnRfZnJlcSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPnNweF9kc3Rfc3RhcnRfZnJlcSA9IGRzdF9zdGFydF9mcmVxOworICAgIHMtPnNweF9zcmNfc3RhcnRfZnJlcSA9IHNyY19zdGFydF9mcmVxOworICAgIGlmICghVVNFX0ZJWEVEKQorICAgICAgICBzLT5zcHhfZHN0X2VuZF9mcmVxICAgPSBkc3RfZW5kX2ZyZXE7CisKKyAgICBkZWNvZGVfYmFuZF9zdHJ1Y3R1cmUoYmMsIGJsaywgcy0+ZWFjMywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfc3ViYmFuZCwgZW5kX3N1YmJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2VhYzNfZGVmYXVsdF9zcHhfYmFuZF9zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5udW1fc3B4X2JhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zcHhfYmFuZF9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3B4X2JhbmRfc3RydWN0LCBzaXplb2Yocy0+c3B4X2JhbmRfc3RydWN0KSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcHhfY29vcmRpbmF0ZXMoQUMzRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpiYyA9ICZzLT5nYmM7CisgICAgaW50IGZid19jaGFubmVscyA9IHMtPmZid19jaGFubmVsczsKKyAgICBpbnQgY2gsIGJuZDsKKworICAgIGZvciAoY2ggPSAxOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxfdXNlc19zcHhbY2hdKSB7CisgICAgICAgICAgICBpZiAocy0+Zmlyc3Rfc3B4X2Nvb3Jkc1tjaF0gfHwgZ2V0X2JpdHMxKGJjKSkgeworICAgICAgICAgICAgICAgIElOVEZMT0FUIHNweF9ibGVuZDsKKyAgICAgICAgICAgICAgICBpbnQgYmluLCBtYXN0ZXJfc3B4X2Nvb3JkOworCisgICAgICAgICAgICAgICAgcy0+Zmlyc3Rfc3B4X2Nvb3Jkc1tjaF0gPSAwOworICAgICAgICAgICAgICAgIHNweF9ibGVuZCA9IEFDM19TUFhfQkxFTkQoZ2V0X2JpdHMoYmMsIDUpKTsKKyAgICAgICAgICAgICAgICBtYXN0ZXJfc3B4X2Nvb3JkID0gZ2V0X2JpdHMoYmMsIDIpICogMzsKKworICAgICAgICAgICAgICAgIGJpbiA9IHMtPnNweF9zcmNfc3RhcnRfZnJlcTsKKyAgICAgICAgICAgICAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IHMtPm51bV9zcHhfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBiYW5kc2l6ZSA9IHMtPnNweF9iYW5kX3NpemVzW2JuZF07CisgICAgICAgICAgICAgICAgICAgIGludCBzcHhfY29vcmRfZXhwLCBzcHhfY29vcmRfbWFudDsKKyAgICAgICAgICAgICAgICAgICAgSU5URkxPQVQgbnJhdGlvLCBzYmxlbmQsIG5ibGVuZDsKKyNpZiBVU0VfRklYRUQKKyAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIGJsZW5kaW5nIGZhY3RvcnMgKi8KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBhY2N1ID0gKChiaW4gPDwgMjMpICsgKGJhbmRzaXplIDw8IDIyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGludDY0X3Qpcy0+c3B4X2RzdF9lbmRfZnJlcTsKKyAgICAgICAgICAgICAgICAgICAgbnJhdGlvID0gKGludCkoYWNjdSA+PiAzMik7CisgICAgICAgICAgICAgICAgICAgIG5yYXRpbyAtPSBzcHhfYmxlbmQgPDwgMTg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5yYXRpbyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ibGVuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBzYmxlbmQgPSAweDgwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChucmF0aW8gPiAweDdmZmZmZikgeworICAgICAgICAgICAgICAgICAgICAgICAgbmJsZW5kID0gMTQ1Mjk0OTU7IC8vIHNxcnQoMykgaW4gRlAuMjMKKyAgICAgICAgICAgICAgICAgICAgICAgIHNibGVuZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYmxlbmQgPSBmaXhlZF9zcXJ0KG5yYXRpbywgMjMpOworICAgICAgICAgICAgICAgICAgICAgICAgYWNjdSA9IChpbnQ2NF90KW5ibGVuZCAqIDE4NTk3NzUzOTM7CisgICAgICAgICAgICAgICAgICAgICAgICBuYmxlbmQgPSAoaW50KSgoYWNjdSArICgxPDwyOSkpID4+IDMwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNibGVuZCA9IGZpeGVkX3NxcnQoMHg4MDAwMDAgLSBucmF0aW8sIDIzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3B4X2Nvb3JkOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBibGVuZGluZyBmYWN0b3JzICovCisgICAgICAgICAgICAgICAgICAgIG5yYXRpbyA9ICgoZmxvYXQpKChiaW4gKyAoYmFuZHNpemUgPj4gMSkpKSAvIHMtPnNweF9kc3RfZW5kX2ZyZXEpIC0gc3B4X2JsZW5kOworICAgICAgICAgICAgICAgICAgICBucmF0aW8gPSBhdl9jbGlwZihucmF0aW8sIDAuMGYsIDEuMGYpOworICAgICAgICAgICAgICAgICAgICBuYmxlbmQgPSBzcXJ0ZigzLjBmICogbnJhdGlvKTsgLy8gbm9pc2UgaXMgc2NhbGVkIGJ5IHNxcnQoMykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGdpdmUgdW5pdHkgdmFyaWFuY2UKKyAgICAgICAgICAgICAgICAgICAgc2JsZW5kID0gc3FydGYoMS4wZiAtIG5yYXRpbyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgYmluICs9IGJhbmRzaXplOworCisgICAgICAgICAgICAgICAgICAgIC8qIGRlY29kZSBzcHggY29vcmRpbmF0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgc3B4X2Nvb3JkX2V4cCAgPSBnZXRfYml0cyhiYywgNCk7CisgICAgICAgICAgICAgICAgICAgIHNweF9jb29yZF9tYW50ID0gZ2V0X2JpdHMoYmMsIDIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3B4X2Nvb3JkX2V4cCA9PSAxNSkgc3B4X2Nvb3JkX21hbnQgPDw9IDE7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICBzcHhfY29vcmRfbWFudCArPSA0OworICAgICAgICAgICAgICAgICAgICBzcHhfY29vcmRfbWFudCA8PD0gKDI1IC0gc3B4X2Nvb3JkX2V4cCAtIG1hc3Rlcl9zcHhfY29vcmQpOworCisgICAgICAgICAgICAgICAgICAgIC8qIG11bHRpcGx5IG5vaXNlIGFuZCBzaWduYWwgYmxlbmRpbmcgZmFjdG9ycyBieSBzcHggY29vcmRpbmF0ZSAqLworI2lmIFVTRV9GSVhFRAorICAgICAgICAgICAgICAgICAgICBhY2N1ID0gKGludDY0X3QpbmJsZW5kICogc3B4X2Nvb3JkX21hbnQ7CisgICAgICAgICAgICAgICAgICAgIHMtPnNweF9ub2lzZV9ibGVuZFtjaF1bYm5kXSAgPSAoaW50KSgoYWNjdSArICgxPDwyMikpID4+IDIzKTsKKyAgICAgICAgICAgICAgICAgICAgYWNjdSA9IChpbnQ2NF90KXNibGVuZCAqIHNweF9jb29yZF9tYW50OworICAgICAgICAgICAgICAgICAgICBzLT5zcHhfc2lnbmFsX2JsZW5kW2NoXVtibmRdID0gKGludCkoKGFjY3UgKyAoMTw8MjIpKSA+PiAyMyk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICBzcHhfY29vcmQgPSBzcHhfY29vcmRfbWFudCAqICgxLjBmIC8gKDEgPDwgMjMpKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3B4X25vaXNlX2JsZW5kIFtjaF1bYm5kXSA9IG5ibGVuZCAqIHNweF9jb29yZDsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3B4X3NpZ25hbF9ibGVuZFtjaF1bYm5kXSA9IHNibGVuZCAqIHNweF9jb29yZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPmZpcnN0X3NweF9jb29yZHNbY2hdID0gMTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgY291cGxpbmdfc3RyYXRlZ3koQUMzRGVjb2RlQ29udGV4dCAqcywgaW50IGJsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJpdF9hbGxvY19zdGFnZXMpCit7CisgICAgR2V0Qml0Q29udGV4dCAqYmMgPSAmcy0+Z2JjOworICAgIGludCBmYndfY2hhbm5lbHMgPSBzLT5mYndfY2hhbm5lbHM7CisgICAgaW50IGNoYW5uZWxfbW9kZSA9IHMtPmNoYW5uZWxfbW9kZTsKKyAgICBpbnQgY2g7CisKKyAgICBtZW1zZXQoYml0X2FsbG9jX3N0YWdlcywgMywgQUMzX01BWF9DSEFOTkVMUyk7CisgICAgaWYgKCFzLT5lYWMzKQorICAgICAgICBzLT5jcGxfaW5fdXNlW2Jsa10gPSBnZXRfYml0czEoYmMpOworICAgIGlmIChzLT5jcGxfaW5fdXNlW2Jsa10pIHsKKyAgICAgICAgLyogY291cGxpbmcgaW4gdXNlICovCisgICAgICAgIGludCBjcGxfc3RhcnRfc3ViYmFuZCwgY3BsX2VuZF9zdWJiYW5kOworCisgICAgICAgIGlmIChjaGFubmVsX21vZGUgPCBBQzNfQ0hNT0RFX1NURVJFTykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjb3VwbGluZyBub3QgYWxsb3dlZCBpbiBtb25vIG9yIGR1YWwtbW9ub1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIGZvciBlbmhhbmNlZCBjb3VwbGluZyAqLworICAgICAgICBpZiAocy0+ZWFjMyAmJiBnZXRfYml0czEoYmMpKSB7CisgICAgICAgICAgICAvKiBUT0RPOiBwYXJzZSBlbmhhbmNlZCBjb3VwbGluZyBzdHJhdGVneSBpbmZvICovCisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJFbmhhbmNlZCBjb3VwbGluZyIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGNoYW5uZWxzIGFyZSBjb3VwbGVkICovCisgICAgICAgIGlmIChzLT5lYWMzICYmIHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX1NURVJFTykgeworICAgICAgICAgICAgcy0+Y2hhbm5lbF9pbl9jcGxbMV0gPSAxOworICAgICAgICAgICAgcy0+Y2hhbm5lbF9pbl9jcGxbMl0gPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IGZid19jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2luX2NwbFtjaF0gPSBnZXRfYml0czEoYmMpOworICAgICAgICB9CisKKyAgICAgICAgLyogcGhhc2UgZmxhZ3MgaW4gdXNlICovCisgICAgICAgIGlmIChjaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pCisgICAgICAgICAgICBzLT5waGFzZV9mbGFnc19pbl91c2UgPSBnZXRfYml0czEoYmMpOworCisgICAgICAgIC8qIGNvdXBsaW5nIGZyZXF1ZW5jeSByYW5nZSAqLworICAgICAgICBjcGxfc3RhcnRfc3ViYmFuZCA9IGdldF9iaXRzKGJjLCA0KTsKKyAgICAgICAgY3BsX2VuZF9zdWJiYW5kID0gcy0+c3B4X2luX3VzZSA/IChzLT5zcHhfc3JjX3N0YXJ0X2ZyZXEgLSAzNykgLyAxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0cyhiYywgNCkgKyAzOworICAgICAgICBpZiAoY3BsX3N0YXJ0X3N1YmJhbmQgPj0gY3BsX2VuZF9zdWJiYW5kKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgY291cGxpbmcgcmFuZ2UgKCVkID49ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBjcGxfc3RhcnRfc3ViYmFuZCwgY3BsX2VuZF9zdWJiYW5kKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHMtPnN0YXJ0X2ZyZXFbQ1BMX0NIXSA9IGNwbF9zdGFydF9zdWJiYW5kICogMTIgKyAzNzsKKyAgICAgICAgcy0+ZW5kX2ZyZXFbQ1BMX0NIXSAgID0gY3BsX2VuZF9zdWJiYW5kICAgKiAxMiArIDM3OworCisgICAgICAgIGRlY29kZV9iYW5kX3N0cnVjdHVyZShiYywgYmxrLCBzLT5lYWMzLCAwLCBjcGxfc3RhcnRfc3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwbF9lbmRfc3ViYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2VhYzNfZGVmYXVsdF9jcGxfYmFuZF9zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bnVtX2NwbF9iYW5kcywgcy0+Y3BsX2JhbmRfc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jcGxfYmFuZF9zdHJ1Y3QsIHNpemVvZihzLT5jcGxfYmFuZF9zdHJ1Y3QpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBjb3VwbGluZyBub3QgaW4gdXNlICovCisgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIHMtPmNoYW5uZWxfaW5fY3BsW2NoXSA9IDA7CisgICAgICAgICAgICBzLT5maXJzdF9jcGxfY29vcmRzW2NoXSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcy0+Zmlyc3RfY3BsX2xlYWsgPSBzLT5lYWMzOworICAgICAgICBzLT5waGFzZV9mbGFnc19pbl91c2UgPSAwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBjb3VwbGluZ19jb29yZGluYXRlcyhBQzNEZWNvZGVDb250ZXh0ICpzLCBpbnQgYmxrKQoreworICAgIEdldEJpdENvbnRleHQgKmJjID0gJnMtPmdiYzsKKyAgICBpbnQgZmJ3X2NoYW5uZWxzID0gcy0+ZmJ3X2NoYW5uZWxzOworICAgIGludCBjaCwgYm5kOworICAgIGludCBjcGxfY29vcmRzX2V4aXN0ID0gMDsKKworICAgIGZvciAoY2ggPSAxOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxfaW5fY3BsW2NoXSkgeworICAgICAgICAgICAgaWYgKChzLT5lYWMzICYmIHMtPmZpcnN0X2NwbF9jb29yZHNbY2hdKSB8fCBnZXRfYml0czEoYmMpKSB7CisgICAgICAgICAgICAgICAgaW50IG1hc3Rlcl9jcGxfY29vcmQsIGNwbF9jb29yZF9leHAsIGNwbF9jb29yZF9tYW50OworICAgICAgICAgICAgICAgIHMtPmZpcnN0X2NwbF9jb29yZHNbY2hdID0gMDsKKyAgICAgICAgICAgICAgICBjcGxfY29vcmRzX2V4aXN0ID0gMTsKKyAgICAgICAgICAgICAgICBtYXN0ZXJfY3BsX2Nvb3JkID0gMyAqIGdldF9iaXRzKGJjLCAyKTsKKyAgICAgICAgICAgICAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IHMtPm51bV9jcGxfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNwbF9jb29yZF9leHAgID0gZ2V0X2JpdHMoYmMsIDQpOworICAgICAgICAgICAgICAgICAgICBjcGxfY29vcmRfbWFudCA9IGdldF9iaXRzKGJjLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNwbF9jb29yZF9leHAgPT0gMTUpCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jcGxfY29vcmRzW2NoXVtibmRdID0gY3BsX2Nvb3JkX21hbnQgPDwgMjI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNwbF9jb29yZHNbY2hdW2JuZF0gPSAoY3BsX2Nvb3JkX21hbnQgKyAxNikgPDwgMjE7CisgICAgICAgICAgICAgICAgICAgIHMtPmNwbF9jb29yZHNbY2hdW2JuZF0gPj49IChjcGxfY29vcmRfZXhwICsgbWFzdGVyX2NwbF9jb29yZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICghYmxrKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJuZXcgY291cGxpbmcgY29vcmRpbmF0ZXMgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICJiZSBwcmVzZW50IGluIGJsb2NrIDBcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogY2hhbm5lbCBub3QgaW4gY291cGxpbmcgKi8KKyAgICAgICAgICAgIHMtPmZpcnN0X2NwbF9jb29yZHNbY2hdID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBwaGFzZSBmbGFncyAqLworICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8gJiYgY3BsX2Nvb3Jkc19leGlzdCkgeworICAgICAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IHMtPm51bV9jcGxfYmFuZHM7IGJuZCsrKSB7CisgICAgICAgICAgICBzLT5waGFzZV9mbGFnc1tibmRdID0gcy0+cGhhc2VfZmxhZ3NfaW5fdXNlID8gZ2V0X2JpdHMxKGJjKSA6IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogLyoqCiAgKiBEZWNvZGUgYSBzaW5nbGUgYXVkaW8gYmxvY2sgZnJvbSB0aGUgQUMtMyBiaXRzdHJlYW0uCiAgKi8KLXN0YXRpYyBpbnQgZGVjb2RlX2F1ZGlvX2Jsb2NrKEFDM0RlY29kZUNvbnRleHQgKnMsIGludCBibGspCitzdGF0aWMgaW50IGRlY29kZV9hdWRpb19ibG9jayhBQzNEZWNvZGVDb250ZXh0ICpzLCBpbnQgYmxrLCBpbnQgb2Zmc2V0KQogewogICAgIGludCBmYndfY2hhbm5lbHMgPSBzLT5mYndfY2hhbm5lbHM7CiAgICAgaW50IGNoYW5uZWxfbW9kZSA9IHMtPmNoYW5uZWxfbW9kZTsKLSAgICBpbnQgaSwgYm5kLCBzZWcsIGNoOworICAgIGludCBpLCBibmQsIHNlZywgY2gsIHJldDsKICAgICBpbnQgZGlmZmVyZW50X3RyYW5zZm9ybXM7CiAgICAgaW50IGRvd25taXhfb3V0cHV0OwogICAgIGludCBjcGxfaW5fdXNlOwpAQCAtODQ2LDE5NiArMTExMywyNiBAQAogICAgIGlmIChzLT5lYWMzICYmICghYmxrIHx8IGdldF9iaXRzMShnYmMpKSkgewogICAgICAgICBzLT5zcHhfaW5fdXNlID0gZ2V0X2JpdHMxKGdiYyk7CiAgICAgICAgIGlmIChzLT5zcHhfaW5fdXNlKSB7Ci0gICAgICAgICAgICBpbnQgZHN0X3N0YXJ0X2ZyZXEsIGRzdF9lbmRfZnJlcSwgc3JjX3N0YXJ0X2ZyZXEsCi0gICAgICAgICAgICAgICAgc3RhcnRfc3ViYmFuZCwgZW5kX3N1YmJhbmQ7Ci0KLSAgICAgICAgICAgIC8qIGRldGVybWluZSB3aGljaCBjaGFubmVscyB1c2Ugc3B4ICovCi0gICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfTU9OTykgewotICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfdXNlc19zcHhbMV0gPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gZmJ3X2NoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsX3VzZXNfc3B4W2NoXSA9IGdldF9iaXRzMShnYmMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBnZXQgdGhlIGZyZXF1ZW5jeSBiaW5zIG9mIHRoZSBzcHggY29weSByZWdpb24gYW5kIHRoZSBzcHggc3RhcnQKLSAgICAgICAgICAgICAgIGFuZCBlbmQgc3ViYmFuZHMgKi8KLSAgICAgICAgICAgIGRzdF9zdGFydF9mcmVxID0gZ2V0X2JpdHMoZ2JjLCAyKTsKLSAgICAgICAgICAgIHN0YXJ0X3N1YmJhbmQgID0gZ2V0X2JpdHMoZ2JjLCAzKSArIDI7Ci0gICAgICAgICAgICBpZiAoc3RhcnRfc3ViYmFuZCA+IDcpCi0gICAgICAgICAgICAgICAgc3RhcnRfc3ViYmFuZCArPSBzdGFydF9zdWJiYW5kIC0gNzsKLSAgICAgICAgICAgIGVuZF9zdWJiYW5kICAgID0gZ2V0X2JpdHMoZ2JjLCAzKSArIDU7Ci0jaWYgVVNFX0ZJWEVECi0gICAgICAgICAgICBzLT5zcHhfZHN0X2VuZF9mcmVxID0gZW5kX2ZyZXFfaW52X3RhYltlbmRfc3ViYmFuZC01XTsKLSNlbmRpZgotICAgICAgICAgICAgaWYgKGVuZF9zdWJiYW5kICAgPiA3KQotICAgICAgICAgICAgICAgIGVuZF9zdWJiYW5kICAgKz0gZW5kX3N1YmJhbmQgICAtIDc7Ci0gICAgICAgICAgICBkc3Rfc3RhcnRfZnJlcSA9IGRzdF9zdGFydF9mcmVxICogMTIgKyAyNTsKLSAgICAgICAgICAgIHNyY19zdGFydF9mcmVxID0gc3RhcnRfc3ViYmFuZCAgKiAxMiArIDI1OwotICAgICAgICAgICAgZHN0X2VuZF9mcmVxICAgPSBlbmRfc3ViYmFuZCAgICAqIDEyICsgMjU7Ci0KLSAgICAgICAgICAgIC8qIGNoZWNrIHZhbGlkaXR5IG9mIHNweCByYW5nZXMgKi8KLSAgICAgICAgICAgIGlmIChzdGFydF9zdWJiYW5kID49IGVuZF9zdWJiYW5kKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHNwZWN0cmFsIGV4dGVuc2lvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICJyYW5nZSAoJWQgPj0gJWQpXG4iLCBzdGFydF9zdWJiYW5kLCBlbmRfc3ViYmFuZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHN0X3N0YXJ0X2ZyZXEgPj0gc3JjX3N0YXJ0X2ZyZXEpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgc3BlY3RyYWwgZXh0ZW5zaW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAgImNvcHkgc3RhcnQgYmluICglZCA+PSAlZClcbiIsIGRzdF9zdGFydF9mcmVxLCBzcmNfc3RhcnRfZnJlcSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHMtPnNweF9kc3Rfc3RhcnRfZnJlcSA9IGRzdF9zdGFydF9mcmVxOwotICAgICAgICAgICAgcy0+c3B4X3NyY19zdGFydF9mcmVxID0gc3JjX3N0YXJ0X2ZyZXE7Ci0gICAgICAgICAgICBpZiAoIVVTRV9GSVhFRCkKLSAgICAgICAgICAgICAgICBzLT5zcHhfZHN0X2VuZF9mcmVxICAgPSBkc3RfZW5kX2ZyZXE7Ci0KLSAgICAgICAgICAgIGRlY29kZV9iYW5kX3N0cnVjdHVyZShnYmMsIGJsaywgcy0+ZWFjMywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9zdWJiYW5kLCBlbmRfc3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9lYWMzX2RlZmF1bHRfc3B4X2JhbmRfc3RydWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5udW1fc3B4X2JhbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNweF9iYW5kX3NpemVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgICAgICBzLT5jaGFubmVsX3VzZXNfc3B4W2NoXSA9IDA7Ci0gICAgICAgICAgICAgICAgcy0+Zmlyc3Rfc3B4X2Nvb3Jkc1tjaF0gPSAxOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChyZXQgPSBzcHhfc3RyYXRlZ3kocywgYmxrKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzLT5lYWMzIHx8ICFzLT5zcHhfaW5fdXNlKSB7CisgICAgICAgIHMtPnNweF9pbl91c2UgPSAwOworICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gZmJ3X2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBzLT5jaGFubmVsX3VzZXNfc3B4W2NoXSA9IDA7CisgICAgICAgICAgICBzLT5maXJzdF9zcHhfY29vcmRzW2NoXSA9IDE7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBzcGVjdHJhbCBleHRlbnNpb24gY29vcmRpbmF0ZXMgKi8KLSAgICBpZiAocy0+c3B4X2luX3VzZSkgewotICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gZmJ3X2NoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF91c2VzX3NweFtjaF0pIHsKLSAgICAgICAgICAgICAgICBpZiAocy0+Zmlyc3Rfc3B4X2Nvb3Jkc1tjaF0gfHwgZ2V0X2JpdHMxKGdiYykpIHsKLSAgICAgICAgICAgICAgICAgICAgSU5URkxPQVQgc3B4X2JsZW5kOwotICAgICAgICAgICAgICAgICAgICBpbnQgYmluLCBtYXN0ZXJfc3B4X2Nvb3JkOwotCi0gICAgICAgICAgICAgICAgICAgIHMtPmZpcnN0X3NweF9jb29yZHNbY2hdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgc3B4X2JsZW5kID0gQUMzX1NQWF9CTEVORChnZXRfYml0cyhnYmMsIDUpKTsKLSAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3NweF9jb29yZCA9IGdldF9iaXRzKGdiYywgMikgKiAzOwotCi0gICAgICAgICAgICAgICAgICAgIGJpbiA9IHMtPnNweF9zcmNfc3RhcnRfZnJlcTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChibmQgPSAwOyBibmQgPCBzLT5udW1fc3B4X2JhbmRzOyBibmQrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmRzaXplID0gcy0+c3B4X2JhbmRfc2l6ZXNbYm5kXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcHhfY29vcmRfZXhwLCBzcHhfY29vcmRfbWFudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIElOVEZMT0FUIG5yYXRpbywgc2JsZW5kLCBuYmxlbmQ7Ci0jaWYgVVNFX0ZJWEVECi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgYmxlbmRpbmcgZmFjdG9ycyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBhY2N1ID0gKChiaW4gPDwgMjMpICsgKGJhbmRzaXplIDw8IDIyKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChpbnQ2NF90KXMtPnNweF9kc3RfZW5kX2ZyZXE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBucmF0aW8gPSAoaW50KShhY2N1ID4+IDMyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5yYXRpbyAtPSBzcHhfYmxlbmQgPDwgMTg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChucmF0aW8gPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJsZW5kID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYmxlbmQgPSAweDgwMDAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnJhdGlvID4gMHg3ZmZmZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYmxlbmQgPSAxNDUyOTQ5NTsgLy8gc3FydCgzKSBpbiBGUC4yMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNibGVuZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ibGVuZCA9IGZpeGVkX3NxcnQobnJhdGlvLCAyMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdSA9IChpbnQ2NF90KW5ibGVuZCAqIDE4NTk3NzUzOTM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJsZW5kID0gKGludCkoKGFjY3UgKyAoMTw8MjkpKSA+PiAzMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JsZW5kID0gZml4ZWRfc3FydCgweDgwMDAwMCAtIG5yYXRpbywgMjMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNweF9jb29yZDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FsY3VsYXRlIGJsZW5kaW5nIGZhY3RvcnMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG5yYXRpbyA9ICgoZmxvYXQpKChiaW4gKyAoYmFuZHNpemUgPj4gMSkpKSAvIHMtPnNweF9kc3RfZW5kX2ZyZXEpIC0gc3B4X2JsZW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgbnJhdGlvID0gYXZfY2xpcGYobnJhdGlvLCAwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ibGVuZCA9IHNxcnRmKDMuMGYgKiBucmF0aW8pOyAvLyBub2lzZSBpcyBzY2FsZWQgYnkgc3FydCgzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGdpdmUgdW5pdHkgdmFyaWFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHNibGVuZCA9IHNxcnRmKDEuMGYgLSBucmF0aW8pOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICBiaW4gKz0gYmFuZHNpemU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlY29kZSBzcHggY29vcmRpbmF0ZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHNweF9jb29yZF9leHAgID0gZ2V0X2JpdHMoZ2JjLCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNweF9jb29yZF9tYW50ID0gZ2V0X2JpdHMoZ2JjLCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHhfY29vcmRfZXhwID09IDE1KSBzcHhfY29vcmRfbWFudCA8PD0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICBzcHhfY29vcmRfbWFudCArPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgc3B4X2Nvb3JkX21hbnQgPDw9ICgyNSAtIHNweF9jb29yZF9leHAgLSBtYXN0ZXJfc3B4X2Nvb3JkKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogbXVsdGlwbHkgbm9pc2UgYW5kIHNpZ25hbCBibGVuZGluZyBmYWN0b3JzIGJ5IHNweCBjb29yZGluYXRlICovCi0jaWYgVVNFX0ZJWEVECi0gICAgICAgICAgICAgICAgICAgICAgICBhY2N1ID0gKGludDY0X3QpbmJsZW5kICogc3B4X2Nvb3JkX21hbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5zcHhfbm9pc2VfYmxlbmRbY2hdW2JuZF0gID0gKGludCkoKGFjY3UgKyAoMTw8MjIpKSA+PiAyMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY2N1ID0gKGludDY0X3Qpc2JsZW5kICogc3B4X2Nvb3JkX21hbnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5zcHhfc2lnbmFsX2JsZW5kW2NoXVtibmRdID0gKGludCkoKGFjY3UgKyAoMTw8MjIpKSA+PiAyMyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgc3B4X2Nvb3JkID0gc3B4X2Nvb3JkX21hbnQgKiAoMS4wZiAvICgxIDw8IDIzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5zcHhfbm9pc2VfYmxlbmQgW2NoXVtibmRdID0gbmJsZW5kICogc3B4X2Nvb3JkOwotICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3B4X3NpZ25hbF9ibGVuZFtjaF1bYm5kXSA9IHNibGVuZCAqIHNweF9jb29yZDsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzLT5maXJzdF9zcHhfY29vcmRzW2NoXSA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKHMtPnNweF9pbl91c2UpCisgICAgICAgIHNweF9jb29yZGluYXRlcyhzKTsKIAogICAgIC8qIGNvdXBsaW5nIHN0cmF0ZWd5ICovCiAgICAgaWYgKHMtPmVhYzMgPyBzLT5jcGxfc3RyYXRlZ3lfZXhpc3RzW2Jsa10gOiBnZXRfYml0czEoZ2JjKSkgewotICAgICAgICBtZW1zZXQoYml0X2FsbG9jX3N0YWdlcywgMywgQUMzX01BWF9DSEFOTkVMUyk7Ci0gICAgICAgIGlmICghcy0+ZWFjMykKLSAgICAgICAgICAgIHMtPmNwbF9pbl91c2VbYmxrXSA9IGdldF9iaXRzMShnYmMpOwotICAgICAgICBpZiAocy0+Y3BsX2luX3VzZVtibGtdKSB7Ci0gICAgICAgICAgICAvKiBjb3VwbGluZyBpbiB1c2UgKi8KLSAgICAgICAgICAgIGludCBjcGxfc3RhcnRfc3ViYmFuZCwgY3BsX2VuZF9zdWJiYW5kOwotCi0gICAgICAgICAgICBpZiAoY2hhbm5lbF9tb2RlIDwgQUMzX0NITU9ERV9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNvdXBsaW5nIG5vdCBhbGxvd2VkIGluIG1vbm8gb3IgZHVhbC1tb25vXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVuaGFuY2VkIGNvdXBsaW5nICovCi0gICAgICAgICAgICBpZiAocy0+ZWFjMyAmJiBnZXRfYml0czEoZ2JjKSkgewotICAgICAgICAgICAgICAgIC8qIFRPRE86IHBhcnNlIGVuaGFuY2VkIGNvdXBsaW5nIHN0cmF0ZWd5IGluZm8gKi8KLSAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJFbmhhbmNlZCBjb3VwbGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGNoYW5uZWxzIGFyZSBjb3VwbGVkICovCi0gICAgICAgICAgICBpZiAocy0+ZWFjMyAmJiBzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2luX2NwbFsxXSA9IDE7Ci0gICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9pbl9jcGxbMl0gPSAxOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNoID0gMTsgY2ggPD0gZmJ3X2NoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2luX2NwbFtjaF0gPSBnZXRfYml0czEoZ2JjKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogcGhhc2UgZmxhZ3MgaW4gdXNlICovCi0gICAgICAgICAgICBpZiAoY2hhbm5lbF9tb2RlID09IEFDM19DSE1PREVfU1RFUkVPKQotICAgICAgICAgICAgICAgIHMtPnBoYXNlX2ZsYWdzX2luX3VzZSA9IGdldF9iaXRzMShnYmMpOwotCi0gICAgICAgICAgICAvKiBjb3VwbGluZyBmcmVxdWVuY3kgcmFuZ2UgKi8KLSAgICAgICAgICAgIGNwbF9zdGFydF9zdWJiYW5kID0gZ2V0X2JpdHMoZ2JjLCA0KTsKLSAgICAgICAgICAgIGNwbF9lbmRfc3ViYmFuZCA9IHMtPnNweF9pbl91c2UgPyAocy0+c3B4X3NyY19zdGFydF9mcmVxIC0gMzcpIC8gMTIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzKGdiYywgNCkgKyAzOwotICAgICAgICAgICAgaWYgKGNwbF9zdGFydF9zdWJiYW5kID49IGNwbF9lbmRfc3ViYmFuZCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjb3VwbGluZyByYW5nZSAoJWQgPj0gJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBjcGxfc3RhcnRfc3ViYmFuZCwgY3BsX2VuZF9zdWJiYW5kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPnN0YXJ0X2ZyZXFbQ1BMX0NIXSA9IGNwbF9zdGFydF9zdWJiYW5kICogMTIgKyAzNzsKLSAgICAgICAgICAgIHMtPmVuZF9mcmVxW0NQTF9DSF0gICA9IGNwbF9lbmRfc3ViYmFuZCAgICogMTIgKyAzNzsKLQotICAgICAgICAgICAgZGVjb2RlX2JhbmRfc3RydWN0dXJlKGdiYywgYmxrLCBzLT5lYWMzLCAwLCBjcGxfc3RhcnRfc3ViYmFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcGxfZW5kX3N1YmJhbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfZWFjM19kZWZhdWx0X2NwbF9iYW5kX3N0cnVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bnVtX2NwbF9iYW5kcywgcy0+Y3BsX2JhbmRfc2l6ZXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogY291cGxpbmcgbm90IGluIHVzZSAqLwotICAgICAgICAgICAgZm9yIChjaCA9IDE7IGNoIDw9IGZid19jaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfaW5fY3BsW2NoXSA9IDA7Ci0gICAgICAgICAgICAgICAgcy0+Zmlyc3RfY3BsX2Nvb3Jkc1tjaF0gPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+Zmlyc3RfY3BsX2xlYWsgPSBzLT5lYWMzOwotICAgICAgICAgICAgcy0+cGhhc2VfZmxhZ3NfaW5fdXNlID0gMDsKLSAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGNvdXBsaW5nX3N0cmF0ZWd5KHMsIGJsaywgYml0X2FsbG9jX3N0YWdlcykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfSBlbHNlIGlmICghcy0+ZWFjMykgewogICAgICAgICBpZiAoIWJsaykgewogICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJuZXcgY291cGxpbmcgc3RyYXRlZ3kgbXVzdCAiCkBAIC0xMDQ5LDQwICsxMTQ2LDggQEAKIAogICAgIC8qIGNvdXBsaW5nIGNvb3JkaW5hdGVzICovCiAgICAgaWYgKGNwbF9pbl91c2UpIHsKLSAgICAgICAgaW50IGNwbF9jb29yZHNfZXhpc3QgPSAwOwotCi0gICAgICAgIGZvciAoY2ggPSAxOyBjaCA8PSBmYndfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX2luX2NwbFtjaF0pIHsKLSAgICAgICAgICAgICAgICBpZiAoKHMtPmVhYzMgJiYgcy0+Zmlyc3RfY3BsX2Nvb3Jkc1tjaF0pIHx8IGdldF9iaXRzMShnYmMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtYXN0ZXJfY3BsX2Nvb3JkLCBjcGxfY29vcmRfZXhwLCBjcGxfY29vcmRfbWFudDsKLSAgICAgICAgICAgICAgICAgICAgcy0+Zmlyc3RfY3BsX2Nvb3Jkc1tjaF0gPSAwOwotICAgICAgICAgICAgICAgICAgICBjcGxfY29vcmRzX2V4aXN0ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgbWFzdGVyX2NwbF9jb29yZCA9IDMgKiBnZXRfYml0cyhnYmMsIDIpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGJuZCA9IDA7IGJuZCA8IHMtPm51bV9jcGxfYmFuZHM7IGJuZCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcGxfY29vcmRfZXhwID0gZ2V0X2JpdHMoZ2JjLCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwbF9jb29yZF9tYW50ID0gZ2V0X2JpdHMoZ2JjLCA0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcGxfY29vcmRfZXhwID09IDE1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNwbF9jb29yZHNbY2hdW2JuZF0gPSBjcGxfY29vcmRfbWFudCA8PCAyMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jcGxfY29vcmRzW2NoXVtibmRdID0gKGNwbF9jb29yZF9tYW50ICsgMTYpIDw8IDIxOwotICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3BsX2Nvb3Jkc1tjaF1bYm5kXSA+Pj0gKGNwbF9jb29yZF9leHAgKyBtYXN0ZXJfY3BsX2Nvb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJsaykgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm5ldyBjb3VwbGluZyBjb29yZGluYXRlcyBtdXN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBwcmVzZW50IGluIGJsb2NrIDBcbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGNoYW5uZWwgbm90IGluIGNvdXBsaW5nICovCi0gICAgICAgICAgICAgICAgcy0+Zmlyc3RfY3BsX2Nvb3Jkc1tjaF0gPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIHBoYXNlIGZsYWdzICovCi0gICAgICAgIGlmIChjaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9TVEVSRU8gJiYgY3BsX2Nvb3Jkc19leGlzdCkgewotICAgICAgICAgICAgZm9yIChibmQgPSAwOyBibmQgPCBzLT5udW1fY3BsX2JhbmRzOyBibmQrKykgewotICAgICAgICAgICAgICAgIHMtPnBoYXNlX2ZsYWdzW2JuZF0gPSBzLT5waGFzZV9mbGFnc19pbl91c2U/IGdldF9iaXRzMShnYmMpIDogMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGNvdXBsaW5nX2Nvb3JkaW5hdGVzKHMsIGJsaykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgLyogc3RlcmVvIHJlbWF0cml4aW5nIHN0cmF0ZWd5IGFuZCBiYW5kIHN0cnVjdHVyZSAqLwpAQCAtMTMwOCw4ICsxMzczLDcgQEAKICAgICAvKiB1bnVzZWQgZHVtbXkgZGF0YSAqLwogICAgIGlmIChzLT5za2lwX3N5bnRheCAmJiBnZXRfYml0czEoZ2JjKSkgewogICAgICAgICBpbnQgc2tpcGwgPSBnZXRfYml0cyhnYmMsIDkpOwotICAgICAgICB3aGlsZSAoc2tpcGwtLSkKLSAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDgpOworICAgICAgICBza2lwX2JpdHNfbG9uZyhnYmMsIDggKiBza2lwbCk7CiAgICAgfQogCiAgICAgLyogdW5wYWNrIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnRzCkBAIC0xMzI2LDcgKzEzOTAsNyBAQAogICAgIGZvciAoY2ggPSAxOyBjaCA8PSBzLT5jaGFubmVsczsgY2grKykgewogICAgICAgICBpbnQgYXVkaW9fY2hhbm5lbCA9IDA7CiAgICAgICAgIElOVEZMT0FUIGdhaW47Ci0gICAgICAgIGlmIChzLT5jaGFubmVsX21vZGUgPT0gQUMzX0NITU9ERV9EVUFMTU9OTykKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxfbW9kZSA9PSBBQzNfQ0hNT0RFX0RVQUxNT05PICYmIGNoIDw9IDIpCiAgICAgICAgICAgICBhdWRpb19jaGFubmVsID0gMi1jaDsKICAgICAgICAgaWYgKHMtPmhlYXZ5X2NvbXByZXNzaW9uICYmIHMtPmNvbXByZXNzaW9uX2V4aXN0c1thdWRpb19jaGFubmVsXSkKICAgICAgICAgICAgIGdhaW4gPSBzLT5oZWF2eV9keW5hbWljX3JhbmdlW2F1ZGlvX2NoYW5uZWxdOwpAQCAtMTM2MywzMCArMTQyNywzMCBAQAogICAgICAgICAgICAgYWMzX3VwbWl4X2RlbGF5KHMpOwogICAgICAgICB9CiAKLSAgICAgICAgZG9faW1kY3Qocywgcy0+Y2hhbm5lbHMpOworICAgICAgICBkb19pbWRjdChzLCBzLT5jaGFubmVscywgb2Zmc2V0KTsKIAogICAgICAgICBpZiAoZG93bm1peF9vdXRwdXQpIHsKICNpZiBVU0VfRklYRUQKICAgICAgICAgICAgIGFjM19kb3dubWl4X2NfZml4ZWQxNihzLT5vdXRwdHIsIHMtPmRvd25taXhfY29lZmZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0X2NoYW5uZWxzLCBzLT5mYndfY2hhbm5lbHMsIDI1Nik7CiAjZWxzZQotICAgICAgICAgICAgcy0+YWMzZHNwLmRvd25taXgocy0+b3V0cHRyLCBzLT5kb3dubWl4X2NvZWZmcywKKyAgICAgICAgICAgIGZmX2FjM2RzcF9kb3dubWl4KCZzLT5hYzNkc3AsIHMtPm91dHB0ciwgcy0+ZG93bm1peF9jb2VmZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXRfY2hhbm5lbHMsIHMtPmZid19jaGFubmVscywgMjU2KTsKICNlbmRpZgogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGRvd25taXhfb3V0cHV0KSB7Ci0gICAgICAgICAgICBzLT5hYzNkc3AuQUMzX1JFTkFNRShkb3dubWl4KShzLT54Y2ZwdHIgKyAxLCBzLT5kb3dubWl4X2NvZWZmcywKKyAgICAgICAgICAgIEFDM19SRU5BTUUoZmZfYWMzZHNwX2Rvd25taXgpKCZzLT5hYzNkc3AsIHMtPnhjZnB0ciArIDEsIHMtPmRvd25taXhfY29lZmZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0X2NoYW5uZWxzLCBzLT5mYndfY2hhbm5lbHMsIDI1Nik7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZG93bm1peF9vdXRwdXQgJiYgIXMtPmRvd25taXhlZCkgewogICAgICAgICAgICAgcy0+ZG93bm1peGVkID0gMTsKLSAgICAgICAgICAgIHMtPmFjM2RzcC5BQzNfUkVOQU1FKGRvd25taXgpKHMtPmRseXB0ciwgcy0+ZG93bm1peF9jb2VmZnMsCisgICAgICAgICAgICBBQzNfUkVOQU1FKGZmX2FjM2RzcF9kb3dubWl4KSgmcy0+YWMzZHNwLCBzLT5kbHlwdHIsIHMtPmRvd25taXhfY29lZmZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0X2NoYW5uZWxzLCBzLT5mYndfY2hhbm5lbHMsIDEyOCk7CiAgICAgICAgIH0KIAotICAgICAgICBkb19pbWRjdChzLCBzLT5vdXRfY2hhbm5lbHMpOworICAgICAgICBkb19pbWRjdChzLCBzLT5vdXRfY2hhbm5lbHMsIG9mZnNldCk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0xNDAwLDE0ICsxNDY0LDE5IEBACiB7CiAgICAgQVZGcmFtZSAqZnJhbWUgICAgID0gZGF0YTsKICAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKLSAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBpbnQgYnVmX3NpemUsIGZ1bGxfYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKICAgICBBQzNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBpbnQgYmxrLCBjaCwgZXJyLCByZXQ7CisgICAgaW50IGJsaywgY2gsIGVyciwgb2Zmc2V0LCByZXQ7CisgICAgaW50IGdvdF9pbmRlcGVuZGVudF9mcmFtZSA9IDA7CiAgICAgY29uc3QgdWludDhfdCAqY2hhbm5lbF9tYXA7CisgICAgdWludDhfdCBleHRlbmRlZF9jaGFubmVsX21hcFtFQUMzX01BWF9DSEFOTkVMU107CiAgICAgY29uc3QgU0hPUlRGTE9BVCAqb3V0cHV0W0FDM19NQVhfQ0hBTk5FTFNdOwogICAgIGVudW0gQVZNYXRyaXhFbmNvZGluZyBtYXRyaXhfZW5jb2Rpbmc7CiAgICAgQVZEb3dubWl4SW5mbyAqZG93bm1peF9pbmZvOwogCisgICAgcy0+c3VwZXJmcmFtZV9zaXplID0gMDsKKworICAgIGJ1Zl9zaXplID0gZnVsbF9idWZfc2l6ZTsKICAgICAvKiBjb3B5IGlucHV0IGJ1ZmZlciB0byBkZWNvZGVyIGNvbnRleHQgdG8gYXZvaWQgcmVhZGluZyBwYXN0IHRoZSBlbmQKICAgICAgICBvZiB0aGUgYnVmZmVyLCB3aGljaCBjYW4gYmUgY2F1c2VkIGJ5IGEgZGFtYWdlZCBpbnB1dCBzdHJlYW0uICovCiAgICAgaWYgKGJ1Zl9zaXplID49IDIgJiYgQVZfUkIxNihidWYpID09IDB4NzcwQikgewpAQCAtMTQxNyw3ICsxNDg2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQxNl90ICopIGJ1ZiwgY250KTsKICAgICB9IGVsc2UKICAgICAgICAgbWVtY3B5KHMtPmlucHV0X2J1ZmZlciwgYnVmLCBGRk1JTihidWZfc2l6ZSwgQUMzX0ZSQU1FX0JVRkZFUl9TSVpFKSk7CisKKyAgICAvKiBpZiBjb25zaXN0ZW50IG5vaXNlIGdlbmVyYXRpb24gaXMgZW5hYmxlZCwgc2VlZCB0aGUgbGluZWFyIGZlZWRiYWNrIGdlbmVyYXRvcgorICAgICAqIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBBQy0zIGZyYW1lIHNvIHRoYXQgdGhlIG5vaXNlIGlzIGlkZW50aWNhbCBhY3Jvc3MKKyAgICAgKiBkZWNvZGVzIGdpdmVuIHRoZSBzYW1lIEFDLTMgZnJhbWUgZGF0YSwgZm9yIHVzZSB3aXRoIG5vbi1saW5lYXIgZWRpdGl0aW5nIHNvZnR3YXJlLiAqLworICAgIGlmIChzLT5jb25zaXN0ZW50X25vaXNlX2dlbmVyYXRpb24pCisgICAgICAgIGF2X2xmZ19pbml0X2Zyb21fZGF0YSgmcy0+ZGl0aF9zdGF0ZSwgcy0+aW5wdXRfYnVmZmVyLCBGRk1JTihidWZfc2l6ZSwgQUMzX0ZSQU1FX0JVRkZFUl9TSVpFKSk7CisKICAgICBidWYgPSBzLT5pbnB1dF9idWZmZXI7CitkZXBlbmRlbnRfZnJhbWU6CiAgICAgLyogaW5pdGlhbGl6ZSB0aGUgR2V0Qml0Q29udGV4dCB3aXRoIHRoZSBzdGFydCBvZiB2YWxpZCBBQy0zIEZyYW1lICovCiAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmcy0+Z2JjLCBidWYsIGJ1Zl9zaXplKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMTQ0MSwxMCArMTUxOCwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQUFDX0FDM19QQVJTRV9FUlJPUl9GUkFNRV9UWVBFOgogICAgICAgICAgICAgLyogc2tpcCBmcmFtZSBpZiBDUkMgaXMgb2suIG90aGVyd2lzZSB1c2UgZXJyb3IgY29uY2VhbG1lbnQuICovCi0gICAgICAgICAgICAvKiBUT0RPOiBhZGQgc3VwcG9ydCBmb3Igc3Vic3RyZWFtcyBhbmQgZGVwZW5kZW50IGZyYW1lcyAqLwotICAgICAgICAgICAgaWYgKHMtPmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX0RFUEVOREVOVCB8fCBzLT5zdWJzdHJlYW1pZCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ1bnN1cHBvcnRlZCBmcmFtZSB0eXBlIDogIgotICAgICAgICAgICAgICAgICAgICAgICAic2tpcHBpbmcgZnJhbWVcbiIpOworICAgICAgICAgICAgLyogVE9ETzogYWRkIHN1cHBvcnQgZm9yIHN1YnN0cmVhbXMgKi8KKyAgICAgICAgICAgIGlmIChzLT5zdWJzdHJlYW1pZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgc3Vic3RyZWFtICVkOiBza2lwcGluZyBmcmFtZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+c3Vic3RyZWFtaWQpOwogICAgICAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTQ3NSwxMCArMTU1MywxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyogaWYgZnJhbWUgaXMgb2ssIHNldCBhdWRpbyBwYXJhbWV0ZXJzICovCi0gICAgaWYgKCFlcnIpIHsKLSAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gcy0+c2FtcGxlX3JhdGU7Ci0gICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSAgICA9IHMtPmJpdF9yYXRlOworICAgIGlmIChzLT5mcmFtZV90eXBlID09IEVBQzNfRlJBTUVfVFlQRV9ERVBFTkRFTlQgJiYgIWdvdF9pbmRlcGVuZGVudF9mcmFtZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSWdub3JpbmcgZGVwZW5kZW50IGZyYW1lIHdpdGhvdXQgaW5kZXBlbmRlbnQgZnJhbWUuXG4iKTsKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICByZXR1cm4gRkZNSU4oZnVsbF9idWZfc2l6ZSwgcy0+ZnJhbWVfc2l6ZSk7CiAgICAgfQogCiAgICAgLyogY2hhbm5lbCBjb25maWcgKi8KQEAgLTE1MDQsNyArMTU4MiwxMCBAQAogICAgICAgICAvKiBzZXQgZG93bm1peGluZyBjb2VmZmljaWVudHMgaWYgbmVlZGVkICovCiAgICAgICAgIGlmIChzLT5jaGFubmVscyAhPSBzLT5vdXRfY2hhbm5lbHMgJiYgISgocy0+b3V0cHV0X21vZGUgJiBBQzNfT1VUUFVUX0xGRU9OKSAmJgogICAgICAgICAgICAgICAgIHMtPmZid19jaGFubmVscyA9PSBzLT5vdXRfY2hhbm5lbHMpKSB7Ci0gICAgICAgICAgICBzZXRfZG93bm1peF9jb2VmZnMocyk7CisgICAgICAgICAgICBpZiAoKHJldCA9IHNldF9kb3dubWl4X2NvZWZmcyhzKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBzZXR0aW5nIGRvd25taXggY29lZmZzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghcy0+Y2hhbm5lbHMpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bmFibGUgdG8gZGV0ZXJtaW5lIGNoYW5uZWwgbW9kZVxuIik7CkBAIC0xNTIwLDI5ICsxNjAxLDI1IEBACiAgICAgaWYgKHMtPmJpdHN0cmVhbV9tb2RlID09IDB4NyAmJiBzLT5jaGFubmVscyA+IDEpCiAgICAgICAgIGF2Y3R4LT5hdWRpb19zZXJ2aWNlX3R5cGUgPSBBVl9BVURJT19TRVJWSUNFX1RZUEVfS0FSQU9LRTsKIAotICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCi0gICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzLT5udW1fYmxvY2tzICogQUMzX0JMT0NLX1NJWkU7Ci0gICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQogICAgIC8qIGRlY29kZSB0aGUgYXVkaW8gYmxvY2tzICovCiAgICAgY2hhbm5lbF9tYXAgPSBmZl9hYzNfZGVjX2NoYW5uZWxfbWFwW3MtPm91dHB1dF9tb2RlICYgfkFDM19PVVRQVVRfTEZFT05dW3MtPmxmZV9vbl07CisgICAgb2Zmc2V0ID0gcy0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfREVQRU5ERU5UID8gQUMzX01BWF9DSEFOTkVMUyA6IDA7CiAgICAgZm9yIChjaCA9IDA7IGNoIDwgQUMzX01BWF9DSEFOTkVMUzsgY2grKykgewotICAgICAgICBvdXRwdXRbY2hdID0gcy0+b3V0cHV0W2NoXTsKLSAgICAgICAgcy0+b3V0cHRyW2NoXSA9IHMtPm91dHB1dFtjaF07CisgICAgICAgIG91dHB1dFtjaF0gPSBzLT5vdXRwdXRbY2ggKyBvZmZzZXRdOworICAgICAgICBzLT5vdXRwdHJbY2hdID0gcy0+b3V0cHV0W2NoICsgb2Zmc2V0XTsKICAgICB9CiAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgaWYgKGNoIDwgcy0+b3V0X2NoYW5uZWxzKQotICAgICAgICAgICAgcy0+b3V0cHRyW2NoYW5uZWxfbWFwW2NoXV0gPSAoU0hPUlRGTE9BVCAqKWZyYW1lLT5kYXRhW2NoXTsKKyAgICAgICAgICAgIHMtPm91dHB0cltjaGFubmVsX21hcFtjaF1dID0gcy0+b3V0cHV0X2J1ZmZlcltjaCArIG9mZnNldF07CiAgICAgfQogICAgIGZvciAoYmxrID0gMDsgYmxrIDwgcy0+bnVtX2Jsb2NrczsgYmxrKyspIHsKLSAgICAgICAgaWYgKCFlcnIgJiYgZGVjb2RlX2F1ZGlvX2Jsb2NrKHMsIGJsaykpIHsKKyAgICAgICAgaWYgKCFlcnIgJiYgZGVjb2RlX2F1ZGlvX2Jsb2NrKHMsIGJsaywgb2Zmc2V0KSkgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBkZWNvZGluZyB0aGUgYXVkaW8gYmxvY2tcbiIpOwogICAgICAgICAgICAgZXJyID0gMTsKICAgICAgICAgfQogICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+b3V0X2NoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgICAgIG1lbWNweSgoKFNIT1JURkxPQVQqKWZyYW1lLT5kYXRhW2NoXSkgKyBBQzNfQkxPQ0tfU0laRSpibGssIG91dHB1dFtjaF0sIEFDM19CTE9DS19TSVpFKnNpemVvZihTSE9SVEZMT0FUKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPm91dHB1dF9idWZmZXJbY2ggKyBvZmZzZXRdICsgQUMzX0JMT0NLX1NJWkUqYmxrLCBvdXRwdXRbY2hdLCBBQzNfQkxPQ0tfU0laRSpzaXplb2YoU0hPUlRGTE9BVCkpOwogICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5vdXRfY2hhbm5lbHM7IGNoKyspCiAgICAgICAgICAgICBvdXRwdXRbY2hdID0gcy0+b3V0cHRyW2NoYW5uZWxfbWFwW2NoXV07CiAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm91dF9jaGFubmVsczsgY2grKykgewpAQCAtMTU1MSwxMSArMTYyOCwxMTQgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGF2X2ZyYW1lX3NldF9kZWNvZGVfZXJyb3JfZmxhZ3MoZnJhbWUsIGVyciA/IEZGX0RFQ09ERV9FUlJPUl9JTlZBTElEX0JJVFNUUkVBTSA6IDApOwotCiAgICAgLyoga2VlcCBsYXN0IGJsb2NrIGZvciBlcnJvciBjb25jZWFsbWVudCBpbiBuZXh0IGZyYW1lICovCiAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+b3V0X2NoYW5uZWxzOyBjaCsrKQotICAgICAgICBtZW1jcHkocy0+b3V0cHV0W2NoXSwgb3V0cHV0W2NoXSwgQUMzX0JMT0NLX1NJWkUqc2l6ZW9mKFNIT1JURkxPQVQpKTsKKyAgICAgICAgbWVtY3B5KHMtPm91dHB1dFtjaCArIG9mZnNldF0sIG91dHB1dFtjaF0sIEFDM19CTE9DS19TSVpFKnNpemVvZihTSE9SVEZMT0FUKSk7CisKKyAgICAvKiBjaGVjayBpZiB0aGVyZSBpcyBkZXBlbmRlbnQgZnJhbWUgKi8KKyAgICBpZiAoYnVmX3NpemUgPiBzLT5mcmFtZV9zaXplKSB7CisgICAgICAgIEFDM0hlYWRlckluZm8gaGRyOworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJnMtPmdiYywgYnVmICsgcy0+ZnJhbWVfc2l6ZSwgYnVmX3NpemUgLSBzLT5mcmFtZV9zaXplKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBlcnIgPSBmZl9hYzNfcGFyc2VfaGVhZGVyKCZzLT5nYmMsICZoZHIpOworICAgICAgICBpZiAoZXJyKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICBpZiAoaGRyLmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX0RFUEVOREVOVCkgeworICAgICAgICAgICAgaWYgKGhkci5udW1fYmxvY2tzICE9IHMtPm51bV9ibG9ja3MgfHwgcy0+c2FtcGxlX3JhdGUgIT0gaGRyLnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIklnbm9yaW5nIG5vbi1jb21wYXRpYmxlIGRlcGVuZGVudCBmcmFtZS5cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWYgKz0gcy0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgICAgICBidWZfc2l6ZSAtPSBzLT5mcmFtZV9zaXplOworICAgICAgICAgICAgICAgIHMtPnByZXZfb3V0cHV0X21vZGUgPSBzLT5vdXRwdXRfbW9kZTsKKyAgICAgICAgICAgICAgICBzLT5wcmV2X2JpdF9yYXRlID0gcy0+Yml0X3JhdGU7CisgICAgICAgICAgICAgICAgZ290X2luZGVwZW5kZW50X2ZyYW1lID0gMTsKKyAgICAgICAgICAgICAgICBnb3RvIGRlcGVuZGVudF9mcmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZyYW1lLT5kZWNvZGVfZXJyb3JfZmxhZ3MgPSBlcnIgPyBGRl9ERUNPREVfRVJST1JfSU5WQUxJRF9CSVRTVFJFQU0gOiAwOworCisgICAgLyogaWYgZnJhbWUgaXMgb2ssIHNldCBhdWRpbyBwYXJhbWV0ZXJzICovCisgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gcy0+c2FtcGxlX3JhdGU7CisgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSAgICA9IHMtPmJpdF9yYXRlICsgcy0+cHJldl9iaXRfcmF0ZTsKKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBFQUMzX01BWF9DSEFOTkVMUzsgY2grKykKKyAgICAgICAgZXh0ZW5kZWRfY2hhbm5lbF9tYXBbY2hdID0gY2g7CisKKyAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfREVQRU5ERU5UKSB7CisgICAgICAgIHVpbnQ2NF90IGljaF9sYXlvdXQgPSBhdnByaXZfYWMzX2NoYW5uZWxfbGF5b3V0X3RhYltzLT5wcmV2X291dHB1dF9tb2RlICYgfkFDM19PVVRQVVRfTEZFT05dOworICAgICAgICBpbnQgY2hhbm5lbF9tYXBfc2l6ZSA9IGZmX2FjM19jaGFubmVsc190YWJbcy0+b3V0cHV0X21vZGUgJiB+QUMzX09VVFBVVF9MRkVPTl0gKyBzLT5sZmVfb247CisgICAgICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworICAgICAgICBpbnQgZXh0ZW5kID0gMDsKKworICAgICAgICBpZiAocy0+cHJldl9vdXRwdXRfbW9kZSAmIEFDM19PVVRQVVRfTEZFT04pCisgICAgICAgICAgICBpY2hfbGF5b3V0IHw9IEFWX0NIX0xPV19GUkVRVUVOQ1k7CisKKyAgICAgICAgY2hhbm5lbF9sYXlvdXQgPSBpY2hfbGF5b3V0OworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCAxNjsgY2grKykgeworICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfbWFwICYgKDEgPDwgKEVBQzNfTUFYX0NIQU5ORUxTIC0gY2ggLSAxKSkpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsX2xheW91dCB8PSBmZl9lYWMzX2N1c3RvbV9jaGFubmVsX21hcF9sb2NhdGlvbnNbY2hdWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoY2hhbm5lbF9sYXlvdXQpID4gRUFDM19NQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgY2hhbm5lbHMgKCVkKSBjb2RlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoY2hhbm5lbF9sYXlvdXQpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbF9sYXlvdXQ7CisgICAgICAgIGF2Y3R4LT5jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhjaGFubmVsX2xheW91dCk7CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgRUFDM19NQVhfQ0hBTk5FTFM7IGNoKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX21hcCAmICgxIDw8IChFQUMzX01BWF9DSEFOTkVMUyAtIGNoIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZmX2VhYzNfY3VzdG9tX2NoYW5uZWxfbWFwX2xvY2F0aW9uc1tjaF1bMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X2NoYW5uZWxfaW5kZXgoY2hhbm5lbF9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2VhYzNfY3VzdG9tX2NoYW5uZWxfbWFwX2xvY2F0aW9uc1tjaF1bMV0pOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbmQgPj0gY2hhbm5lbF9tYXBfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2NoYW5uZWxfbWFwW2luZGV4XSA9IG9mZnNldCArIGNoYW5uZWxfbWFwW2V4dGVuZCsrXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgxVUxMIDw8IGkpICYgZmZfZWFjM19jdXN0b21fY2hhbm5lbF9tYXBfbG9jYXRpb25zW2NoXVsxXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9jaGFubmVsX2luZGV4KGNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFVTEwgPDwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuZCA+PSBjaGFubmVsX21hcF9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkX2NoYW5uZWxfbWFwW2luZGV4XSA9IG9mZnNldCArIGNoYW5uZWxfbWFwW2V4dGVuZCsrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGdldCBvdXRwdXQgYnVmZmVyICovCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzLT5udW1fYmxvY2tzICogQUMzX0JMT0NLX1NJWkU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Y3R4LT5jaGFubmVsczsgY2grKykgeworICAgICAgICBpbnQgbWFwID0gZXh0ZW5kZWRfY2hhbm5lbF9tYXBbY2hdOworICAgICAgICBhdl9hc3NlcnQwKGNoPj1BVl9OVU1fREFUQV9QT0lOVEVSUyB8fCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaF0gPT0gZnJhbWUtPmRhdGFbY2hdKTsKKyAgICAgICAgbWVtY3B5KChTSE9SVEZMT0FUICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbY2hdLAorICAgICAgICAgICAgICAgcy0+b3V0cHV0X2J1ZmZlclttYXBdLAorICAgICAgICAgICAgICAgcy0+bnVtX2Jsb2NrcyAqIEFDM19CTE9DS19TSVpFICogc2l6ZW9mKFNIT1JURkxPQVQpKTsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEFWTWF0cml4RW5jb2RpbmcKQEAgLTE2MTUsNyArMTc5NSwxMCBAQAogCiAgICAgKmdvdF9mcmFtZV9wdHIgPSAxOwogCi0gICAgcmV0dXJuIEZGTUlOKGJ1Zl9zaXplLCBzLT5mcmFtZV9zaXplKTsKKyAgICBpZiAoIXMtPnN1cGVyZnJhbWVfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEZGTUlOKGZ1bGxfYnVmX3NpemUsIHMtPmZyYW1lX3NpemUpOworCisgICAgcmV0dXJuIEZGTUlOKGZ1bGxfYnVmX3NpemUsIHMtPnN1cGVyZnJhbWVfc2l6ZSk7CiB9CiAKIC8qKgpAQCAtMTYyNyw2ICsxODEwLDcgQEAKICAgICBmZl9tZGN0X2VuZCgmcy0+aW1kY3RfNTEyKTsKICAgICBmZl9tZGN0X2VuZCgmcy0+aW1kY3RfMjU2KTsKICAgICBhdl9mcmVlcCgmcy0+ZmRzcCk7CisgICAgYXZfZnJlZXAoJnMtPmRvd25taXhfY29lZmZzWzBdKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYzNkZWMuaCBiL2xpYmF2Y29kZWMvYWMzZGVjLmgKaW5kZXggYjM0OThmZS4uY2UxNDM0YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYzNkZWMuaAorKysgYi9saWJhdmNvZGVjL2FjM2RlYy5oCkBAIC03Niw2ICs3Niw3IEBACiAvLy9AewogICAgIGludCBmcmFtZV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZyYW1lIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJtdHlwKQogICAgIGludCBzdWJzdHJlYW1pZDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHN1YnN0cmVhbSBpZGVudGlmaWNhdGlvbgorICAgIGludCBzdXBlcmZyYW1lX3NpemU7ICAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgc3VwZXJmcmFtZSBzaXplLCBpbiBieXRlcwogICAgIGludCBmcmFtZV9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgZnJhbWUgc2l6ZSwgaW4gYnl0ZXMKICAgICBpbnQgYml0X3JhdGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzdHJlYW0gYml0IHJhdGUsIGluIGJpdHMtcGVyLXNlY29uZAogICAgIGludCBzYW1wbGVfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHNhbXBsZSBmcmVxdWVuY3ksIGluIEh6CkBAIC04Nyw3ICs4OCw3IEBACiAgICAgaW50IGRpYWxvZ19ub3JtYWxpemF0aW9uWzJdOyAgICAgICAgICAgIC8vLzwgZGlhbG9nIGxldmVsIGluIGRCRlMgICAgICAgICAgICAgICAgICAgKGRpYWxub3JtKQogICAgIGludCBjb21wcmVzc2lvbl9leGlzdHNbMl07ICAgICAgICAgICAgICAvLy88IGNvbXByZXNzaW9uIGZpZWxkIGlzIHZhbGlkIGZvciBmcmFtZSAgIChjb21wcmUpCiAgICAgaW50IGNvbXByZXNzaW9uX2dhaW5bMl07ICAgICAgICAgICAgICAgIC8vLzwgZ2FpbiB0byBhcHBseSBmb3IgaGVhdnkgY29tcHJlc3Npb24gICAgKGNvbXByKQotICAgIGludCBjaGFubmVsX21hcDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGN1c3RvbSBjaGFubmVsIG1hcAorICAgIGludCBjaGFubmVsX21hcDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGN1c3RvbSBjaGFubmVsIG1hcCAgICAgICAgICAgICAgICAgICAgIChjaGFubWFwKQogICAgIGludCBwcmVmZXJyZWRfZG93bm1peDsgICAgICAgICAgICAgICAgICAvLy88IFByZWZlcnJlZCAyLWNoYW5uZWwgZG93bm1peCBtb2RlICAgICAgIChkbWl4bW9kKQogICAgIGludCBjZW50ZXJfbWl4X2xldmVsOyAgICAgICAgICAgICAgICAgICAvLy88IENlbnRlciBtaXggbGV2ZWwgaW5kZXgKICAgICBpbnQgY2VudGVyX21peF9sZXZlbF9sdHJ0OyAgICAgICAgICAgICAgLy8vPCBDZW50ZXIgbWl4IGxldmVsIGluZGV4IGZvciBMdC9SdCAgICAgICAobHRydGNtaXhsZXYpCkBAIC05Niw2ICs5Nyw4IEBACiAgICAgaW50IGxmZV9taXhfbGV2ZWxfZXhpc3RzOyAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIGlmIGxmZW1peGxldmNvZCBpcyBzcGVjaWZpZWQgKGxmZW1peGxldmNvZGUpCiAgICAgaW50IGxmZV9taXhfbGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTEZFIG1peCBsZXZlbCBpbmRleCAgICAgICAgICAgICAgICAgICAgKGxmZW1peGxldmNvZCkKICAgICBpbnQgZWFjMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbmRpY2F0ZXMgaWYgY3VycmVudCBmcmFtZSBpcyBFLUFDLTMKKyAgICBpbnQgZWFjM19mcmFtZV9kZXBlbmRlbnRfZm91bmQ7ICAgICAgICAgLy8vPCBiaXRzdHJlYW0gaGFzIEUtQUMtMyBkZXBlbmRlbnQgZnJhbWUocykKKyAgICBpbnQgZWFjM19zdWJzYnRyZWFtaWRfZm91bmQ7ICAgICAgICAgICAgLy8vPCBiaXRzdHJlYW0gaGFzIEUtQUMtMyBhZGRpdGlvbmFsIHN1YnN0cmVhbShzKQogICAgIGludCBkb2xieV9zdXJyb3VuZF9tb2RlOyAgICAgICAgICAgICAgICAvLy88IGRvbGJ5IHN1cnJvdW5kIG1vZGUgICAgICAgICAgICAgICAgICAgIChkc3VybW9kKQogICAgIGludCBkb2xieV9zdXJyb3VuZF9leF9tb2RlOyAgICAgICAgICAgICAvLy88IGRvbGJ5IHN1cnJvdW5kIGV4IG1vZGUgICAgICAgICAgICAgICAgIChkc3VyZXhtb2QpCiAgICAgaW50IGRvbGJ5X2hlYWRwaG9uZV9tb2RlOyAgICAgICAgICAgICAgIC8vLzwgZG9sYnkgaGVhZHBob25lIG1vZGUgICAgICAgICAgICAgICAgICAgKGRoZWFkcGhvbm1vZCkKQEAgLTEyNiw2ICsxMjksNyBAQAogICAgIGludCBwaGFzZV9mbGFnc19pbl91c2U7ICAgICAgICAgICAgICAgICAvLy88IHBoYXNlIGZsYWdzIGluIHVzZSAgICAgICAgICAgICAgICAgICAgIChwaHNmbGdpbnUpCiAgICAgaW50IHBoYXNlX2ZsYWdzW0FDM19NQVhfQ1BMX0JBTkRTXTsgICAgIC8vLzwgcGhhc2UgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBoc2ZsZykKICAgICBpbnQgbnVtX2NwbF9iYW5kczsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgY291cGxpbmcgYmFuZHMgICAgICAgICAgICAgICAobmNwbGJuZCkKKyAgICB1aW50OF90IGNwbF9iYW5kX3N0cnVjdFtBQzNfTUFYX0NQTF9CQU5EU107CiAgICAgdWludDhfdCBjcGxfYmFuZF9zaXplc1tBQzNfTUFYX0NQTF9CQU5EU107IC8vLzwgbnVtYmVyIG9mIGNvZWZmcyBpbiBlYWNoIGNvdXBsaW5nIGJhbmQKICAgICBpbnQgZmlyc3RjaGluY3BsOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBmaXJzdCBjaGFubmVsIGluIGNvdXBsaW5nCiAgICAgaW50IGZpcnN0X2NwbF9jb29yZHNbQUMzX01BWF9DSEFOTkVMU107IC8vLzwgZmlyc3QgY291cGxpbmcgY29vcmRpbmF0ZXMgc3RhdGVzICAgICAgKGZpcnN0Y3BsY29zKQpAQCAtMTQyLDYgKzE0Niw3IEBACiAgICAgaW50IHNweF9kc3Rfc3RhcnRfZnJlcTsgICAgICAgICAgICAgICAgICAgICAvLy88IHNweCBzdGFydGluZyBmcmVxdWVuY3kgYmluIGZvciBjb3B5aW5nIChjb3B5c3RhcnRtYW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0aGUgY29weSByZWdpb24gZW5kcyBhdCB0aGUgc3RhcnQgb2YgdGhlIHNweCByZWdpb24uCiAgICAgaW50IG51bV9zcHhfYmFuZHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzcHggYmFuZHMgICAgICAgICAgICAgICAgICAgIChuc3B4Ym5kcykKKyAgICB1aW50OF90IHNweF9iYW5kX3N0cnVjdFtTUFhfTUFYX0JBTkRTXTsKICAgICB1aW50OF90IHNweF9iYW5kX3NpemVzW1NQWF9NQVhfQkFORFNdOyAgICAgIC8vLzwgbnVtYmVyIG9mIGJpbnMgaW4gZWFjaCBzcHggYmFuZAogICAgIHVpbnQ4X3QgZmlyc3Rfc3B4X2Nvb3Jkc1tBQzNfTUFYX0NIQU5ORUxTXTsgLy8vPCBmaXJzdCBzcHggY29vcmRpbmF0ZXMgc3RhdGVzICAgICAgICAgICAoZmlyc3RzcHhjb3MpCiAgICAgSU5URkxPQVQgc3B4X25vaXNlX2JsZW5kW0FDM19NQVhfQ0hBTk5FTFNdW1NQWF9NQVhfQkFORFNdOyAvLy88IHNweCBub2lzZSBibGVuZGluZyBmYWN0b3IgIChuYmxlbmRmYWN0KQpAQCAtMTU3LDEwICsxNjIsMTIgQEAKICAgICBpbnQgZmJ3X2NoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZ1bGwtYmFuZHdpZHRoIGNoYW5uZWxzCiAgICAgaW50IGNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiB0b3RhbCBjaGFubmVscwogICAgIGludCBsZmVfY2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBpbmRleCBvZiBMRkUgY2hhbm5lbAotICAgIFNIT1JURkxPQVQgZG93bm1peF9jb2VmZnNbQUMzX01BWF9DSEFOTkVMU11bMl07ICAvLy88IHN0ZXJlbyBkb3dubWl4IGNvZWZmaWNpZW50cworICAgIFNIT1JURkxPQVQgKmRvd25taXhfY29lZmZzWzJdOyAgICAgICAgICAgICAgLy8vPCBzdGVyZW8gZG93bm1peCBjb2VmZmljaWVudHMKICAgICBpbnQgZG93bm1peGVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIGlmIGNvZWZmcyBhcmUgY3VycmVudGx5IGRvd25taXhlZAogICAgIGludCBvdXRwdXRfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBvdXRwdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uCisgICAgaW50IHByZXZfb3V0cHV0X21vZGU7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IG91dHB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gZm9yIHByZXZpb3VzIGZyYW1lCiAgICAgaW50IG91dF9jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMKKyAgICBpbnQgcHJldl9iaXRfcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgc3RyZWFtIGJpdCByYXRlLCBpbiBiaXRzLXBlci1zZWNvbmQgZm9yIHByZXZpb3VzIGZyYW1lCiAvLy9AfQogCiAvLy9AbmFtZSBEeW5hbWljIHJhbmdlCkBAIC0xNzUsNiArMTgyLDEwIEBACiAgICAgaW50IGVuZF9mcmVxW0FDM19NQVhfQ0hBTk5FTFNdOyAgICAgICAgIC8vLzwgZW5kIGZyZXF1ZW5jeSBiaW4gICAgICAgICAgICAgICAgICAgICAgKGVuZG1hbnQpCiAvLy9AfQogCisvLy9AbmFtZSBDb25zaXN0ZW50IG5vaXNlIGdlbmVyYXRpb24KKyAgICBpbnQgY29uc2lzdGVudF9ub2lzZV9nZW5lcmF0aW9uOyAgICAgICAgLy8vPCBzZWVkIG5vaXNlIGdlbmVyYXRpb24gd2l0aCBBQy0zIGZyYW1lIG9uIGRlY29kZQorLy8vQH0KKwogLy8vQG5hbWUgUmVtYXRyaXhpbmcKICAgICBpbnQgbnVtX3JlbWF0cml4aW5nX2JhbmRzOyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgcmVtYXRyaXhpbmcgYmFuZHMgICAgICAgICAgICAobnJlbWF0Ym5kKQogICAgIGludCByZW1hdHJpeGluZ19mbGFnc1s0XTsgICAgICAgICAgICAgICAvLy88IHJlbWF0cml4aW5nIGZsYWdzICAgICAgICAgICAgICAgICAgICAgIChyZW1hdGZsZykKQEAgLTIzMSwxMSArMjQyLDEyIEBACiAvLy9AbmFtZSBBbGlnbmVkIGFycmF5cwogICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50LCAgIGZpeGVkX2NvZWZmcylbQUMzX01BWF9DSEFOTkVMU11bQUMzX01BWF9DT0VGU107ICAgICAgIC8vLzwgZml4ZWQtcG9pbnQgdHJhbnNmb3JtIGNvZWZmaWNpZW50cwogICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIHRyYW5zZm9ybV9jb2VmZnMpW0FDM19NQVhfQ0hBTk5FTFNdW0FDM19NQVhfQ09FRlNdOyAgIC8vLzwgdHJhbnNmb3JtIGNvZWZmaWNpZW50cwotICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIGRlbGF5KVtBQzNfTUFYX0NIQU5ORUxTXVtBQzNfQkxPQ0tfU0laRV07ICAgICAgICAgICAgIC8vLzwgZGVsYXkgLSBhZGRlZCB0byB0aGUgbmV4dCBibG9jaworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIGRlbGF5KVtFQUMzX01BWF9DSEFOTkVMU11bQUMzX0JMT0NLX1NJWkVdOyAgICAgICAgIC8vLzwgZGVsYXkgLSBhZGRlZCB0byB0aGUgbmV4dCBibG9jawogICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIHdpbmRvdylbQUMzX0JMT0NLX1NJWkVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgd2luZG93IGNvZWZmaWNpZW50cwogICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgSU5URkxPQVQsIHRtcF9vdXRwdXQpW0FDM19CTE9DS19TSVpFXTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIG91dHB1dCBiZWZvcmUgd2luZG93aW5nCi0gICAgREVDTEFSRV9BTElHTkVEKDMyLCBTSE9SVEZMT0FULCBvdXRwdXQpW0FDM19NQVhfQ0hBTk5FTFNdW0FDM19CTE9DS19TSVpFXTsgICAgICAgICAgICAvLy88IG91dHB1dCBhZnRlciBpbWRjdCB0cmFuc2Zvcm0gYW5kIHdpbmRvd2luZworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgU0hPUlRGTE9BVCwgb3V0cHV0KVtFQUMzX01BWF9DSEFOTkVMU11bQUMzX0JMT0NLX1NJWkVdOyAgICAgICAgICAgIC8vLzwgb3V0cHV0IGFmdGVyIGltZGN0IHRyYW5zZm9ybSBhbmQgd2luZG93aW5nCiAgICAgREVDTEFSRV9BTElHTkVEKDMyLCB1aW50OF90LCBpbnB1dF9idWZmZXIpW0FDM19GUkFNRV9CVUZGRVJfU0laRSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkVdOyAvLy88IHRlbXAgYnVmZmVyIHRvIHByZXZlbnQgb3ZlcnJlYWQKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIFNIT1JURkxPQVQsIG91dHB1dF9idWZmZXIpW0VBQzNfTUFYX0NIQU5ORUxTXVtBQzNfQkxPQ0tfU0laRSAqIDZdOyAgLy8vPCBmaW5hbCBvdXRwdXQgYnVmZmVyCiAvLy9AfQogfSBBQzNEZWNvZGVDb250ZXh0OwogCkBAIC0yNTgsNCArMjcwLDggQEAKICAqLwogc3RhdGljIHZvaWQgZmZfZWFjM19hcHBseV9zcGVjdHJhbF9leHRlbnNpb24oQUMzRGVjb2RlQ29udGV4dCAqcyk7CiAKKyNpZiAoIVVTRV9GSVhFRCkKK2V4dGVybiBmbG9hdCBmZl9hYzNfaGVhdnlfZHluYW1pY19yYW5nZV90YWJbMjU2XTsKKyNlbmRpZgorCiAjZW5kaWYgLyogQVZDT0RFQ19BQzNERUNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYzNkZWNfZml4ZWQuYyBiL2xpYmF2Y29kZWMvYWMzZGVjX2ZpeGVkLmMKaW5kZXggNjQxNmRhNC4uYmQ2NjE3NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYzNkZWNfZml4ZWQuYworKysgYi9saWJhdmNvZGVjL2FjM2RlY19maXhlZC5jCkBAIC02NCwxMiArNjQsMTIgQEAKICAgICBpbnQgZHlucm5nLAogICAgIGludCBsZW4pCiB7Ci0gICAgaW50IGksIHNoaWZ0LCByb3VuZDsKLSAgICBpbnQxNl90IG11bDsKKyAgICBpbnQgaSwgc2hpZnQ7CisgICAgdW5zaWduZWQgbXVsLCByb3VuZDsKICAgICBpbnQgdGVtcCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CiAKICAgICBtdWwgPSAoZHlucm5nICYgMHgxZikgKyAweDIwOwotICAgIHNoaWZ0ID0gNCAtICgoZHlucm5nIDw8IDIzKSA+PiAyOCk7CisgICAgc2hpZnQgPSA0IC0gKHNpZ25fZXh0ZW5kKGR5bnJuZywgOSkgPj4gNSk7CiAgICAgaWYgKHNoaWZ0ID4gMCApIHsKICAgICAgIHJvdW5kID0gMSA8PCAoc2hpZnQtMSk7CiAgICAgICBmb3IgKGk9MDsgaTxsZW47IGkrPTgpIHsKQEAgLTEzOSw3ICsxMzksNyBAQAogICogRG93bm1peCBzYW1wbGVzIGZyb20gb3JpZ2luYWwgc2lnbmFsIHRvIHN0ZXJlbyBvciBtb25vICh0aGlzIGlzIGZvciAxNi1iaXQgc2FtcGxlcwogICogYW5kIGZpeGVkIHBvaW50IGRlY29kZXIgLSBvcmlnaW5hbCAoZm9yIDMyLWJpdCBzYW1wbGVzKSBpcyBpbiBhYzNkc3AuYykuCiAgKi8KLXN0YXRpYyB2b2lkIGFjM19kb3dubWl4X2NfZml4ZWQxNihpbnQxNl90ICoqc2FtcGxlcywgaW50MTZfdCAoKm1hdHJpeClbMl0sCitzdGF0aWMgdm9pZCBhYzNfZG93bm1peF9jX2ZpeGVkMTYoaW50MTZfdCAqKnNhbXBsZXMsIGludDE2X3QgKiptYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoLCBpbnQgbGVuKQogewogICAgIGludCBpLCBqOwpAQCAtMTQ4LDggKzE0OCw4IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgdjAgPSB2MSA9IDA7CiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5fY2g7IGorKykgewotICAgICAgICAgICAgICAgIHYwICs9IHNhbXBsZXNbal1baV0gKiBtYXRyaXhbal1bMF07Ci0gICAgICAgICAgICAgICAgdjEgKz0gc2FtcGxlc1tqXVtpXSAqIG1hdHJpeFtqXVsxXTsKKyAgICAgICAgICAgICAgICB2MCArPSBzYW1wbGVzW2pdW2ldICogbWF0cml4WzBdW2pdOworICAgICAgICAgICAgICAgIHYxICs9IHNhbXBsZXNbal1baV0gKiBtYXRyaXhbMV1bal07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzYW1wbGVzWzBdW2ldID0gKHYwKzIwNDgpPj4xMjsKICAgICAgICAgICAgIHNhbXBsZXNbMV1baV0gPSAodjErMjA0OCk+PjEyOwpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgdjAgPSAwOwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGluX2NoOyBqKyspCi0gICAgICAgICAgICAgICAgdjAgKz0gc2FtcGxlc1tqXVtpXSAqIG1hdHJpeFtqXVswXTsKKyAgICAgICAgICAgICAgICB2MCArPSBzYW1wbGVzW2pdW2ldICogbWF0cml4WzBdW2pdOwogICAgICAgICAgICAgc2FtcGxlc1swXVtpXSA9ICh2MCsyMDQ4KT4+MTI7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjgsNiArMTY4LDcgQEAKICNpbmNsdWRlICJhYzNkZWMuYyIKIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJjb25zX25vaXNlZ2VuIiwgImVuYWJsZSBjb25zaXN0ZW50IG5vaXNlIGdlbmVyYXRpb24iLCBPRkZTRVQoY29uc2lzdGVudF9ub2lzZV9nZW5lcmF0aW9uKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwIH0sIDAsIDEsIFBBUiB9LAogICAgIHsgImRyY19zY2FsZSIsICJwZXJjZW50YWdlIG9mIGR5bmFtaWMgcmFuZ2UgY29tcHJlc3Npb24gdG8gYXBwbHkiLCBPRkZTRVQoZHJjX3NjYWxlKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMS4wfSwgMC4wLCA2LjAsIFBBUiB9LAogICAgIHsgImhlYXZ5X2NvbXByIiwgImVuYWJsZSBoZWF2eSBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uIiwgT0ZGU0VUKGhlYXZ5X2NvbXByZXNzaW9uKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwIH0sIDAsIDEsIFBBUiB9LAogICAgIHsgTlVMTH0sCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjM2RlY19mbG9hdC5jIGIvbGliYXZjb2RlYy9hYzNkZWNfZmxvYXQuYwppbmRleCAwYTUzMTlhLi5iODVhNGNlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FjM2RlY19mbG9hdC5jCisrKyBiL2xpYmF2Y29kZWMvYWMzZGVjX2Zsb2F0LmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJhYzNkZWMuYyIKIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJjb25zX25vaXNlZ2VuIiwgImVuYWJsZSBjb25zaXN0ZW50IG5vaXNlIGdlbmVyYXRpb24iLCBPRkZTRVQoY29uc2lzdGVudF9ub2lzZV9nZW5lcmF0aW9uKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwIH0sIDAsIDEsIFBBUiB9LAogICAgIHsgImRyY19zY2FsZSIsICJwZXJjZW50YWdlIG9mIGR5bmFtaWMgcmFuZ2UgY29tcHJlc3Npb24gdG8gYXBwbHkiLCBPRkZTRVQoZHJjX3NjYWxlKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMS4wfSwgMC4wLCA2LjAsIFBBUiB9LAogICAgIHsgImhlYXZ5X2NvbXByIiwgImVuYWJsZSBoZWF2eSBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uIiwgT0ZGU0VUKGhlYXZ5X2NvbXByZXNzaW9uKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwIH0sIDAsIDEsIFBBUiB9LAogICAgIHsgInRhcmdldF9sZXZlbCIsICJ0YXJnZXQgbGV2ZWwgaW4gLWRCRlMgKDAgbm90IGFwcGxpZWQpIiwgT0ZGU0VUKHRhcmdldF9sZXZlbCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwIH0sIC0zMSwgMCwgUEFSIH0sCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjM2RzcC5jIGIvbGliYXZjb2RlYy9hYzNkc3AuYwppbmRleCBmZTg3YjViLi40MzQzOGRhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FjM2RzcC5jCisrKyBiL2xpYmF2Y29kZWMvYWMzZHNwLmMKQEAgLTE5LDcgKzE5LDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImFjMy5oIgogI2luY2x1ZGUgImFjM2RzcC5oIgpAQCAtMjE0LDE3ICsyMTMsNTggQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGFjM19kb3dubWl4X2MoZmxvYXQgKipzYW1wbGVzLCBmbG9hdCAoKm1hdHJpeClbMl0sCitzdGF0aWMgdm9pZCBhYzNfZG93bm1peF81X3RvXzJfc3ltbWV0cmljX2MoZmxvYXQgKipzYW1wbGVzLCBmbG9hdCAqKm1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQoreworICAgIGludCBpOworICAgIGZsb2F0IHYwLCB2MTsKKyAgICBmbG9hdCBmcm9udF9taXggICAgPSBtYXRyaXhbMF1bMF07CisgICAgZmxvYXQgY2VudGVyX21peCAgID0gbWF0cml4WzBdWzFdOworICAgIGZsb2F0IHN1cnJvdW5kX21peCA9IG1hdHJpeFswXVszXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICB2MCA9IHNhbXBsZXNbMF1baV0gKiBmcm9udF9taXggICsKKyAgICAgICAgICAgICBzYW1wbGVzWzFdW2ldICogY2VudGVyX21peCArCisgICAgICAgICAgICAgc2FtcGxlc1szXVtpXSAqIHN1cnJvdW5kX21peDsKKworICAgICAgICB2MSA9IHNhbXBsZXNbMV1baV0gKiBjZW50ZXJfbWl4ICsKKyAgICAgICAgICAgICBzYW1wbGVzWzJdW2ldICogZnJvbnRfbWl4ICArCisgICAgICAgICAgICAgc2FtcGxlc1s0XVtpXSAqIHN1cnJvdW5kX21peDsKKworICAgICAgICBzYW1wbGVzWzBdW2ldID0gdjA7CisgICAgICAgIHNhbXBsZXNbMV1baV0gPSB2MTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFjM19kb3dubWl4XzVfdG9fMV9zeW1tZXRyaWNfYyhmbG9hdCAqKnNhbXBsZXMsIGZsb2F0ICoqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgZnJvbnRfbWl4ICAgID0gbWF0cml4WzBdWzBdOworICAgIGZsb2F0IGNlbnRlcl9taXggICA9IG1hdHJpeFswXVsxXTsKKyAgICBmbG9hdCBzdXJyb3VuZF9taXggPSBtYXRyaXhbMF1bM107CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgc2FtcGxlc1swXVtpXSA9IHNhbXBsZXNbMF1baV0gKiBmcm9udF9taXggICAgKworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1sxXVtpXSAqIGNlbnRlcl9taXggICArCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzWzJdW2ldICogZnJvbnRfbWl4ICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbM11baV0gKiBzdXJyb3VuZF9taXggKworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1s0XVtpXSAqIHN1cnJvdW5kX21peDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFjM19kb3dubWl4X2MoZmxvYXQgKipzYW1wbGVzLCBmbG9hdCAqKm1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9jaCwgaW50IGluX2NoLCBpbnQgbGVuKQogewogICAgIGludCBpLCBqOwogICAgIGZsb2F0IHYwLCB2MTsKKwogICAgIGlmIChvdXRfY2ggPT0gMikgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgIHYwID0gdjEgPSAwLjBmOwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGluX2NoOyBqKyspIHsKLSAgICAgICAgICAgICAgICB2MCArPSBzYW1wbGVzW2pdW2ldICogbWF0cml4W2pdWzBdOwotICAgICAgICAgICAgICAgIHYxICs9IHNhbXBsZXNbal1baV0gKiBtYXRyaXhbal1bMV07CisgICAgICAgICAgICAgICAgdjAgKz0gc2FtcGxlc1tqXVtpXSAqIG1hdHJpeFswXVtqXTsKKyAgICAgICAgICAgICAgICB2MSArPSBzYW1wbGVzW2pdW2ldICogbWF0cml4WzFdW2pdOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2FtcGxlc1swXVtpXSA9IHYwOwogICAgICAgICAgICAgc2FtcGxlc1sxXVtpXSA9IHYxOwpAQCAtMjMzLDEzICsyNzMsNTYgQEAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICB2MCA9IDAuMGY7CiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5fY2g7IGorKykKLSAgICAgICAgICAgICAgICB2MCArPSBzYW1wbGVzW2pdW2ldICogbWF0cml4W2pdWzBdOworICAgICAgICAgICAgICAgIHYwICs9IHNhbXBsZXNbal1baV0gKiBtYXRyaXhbMF1bal07CiAgICAgICAgICAgICBzYW1wbGVzWzBdW2ldID0gdjA7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGFjM19kb3dubWl4X2NfZml4ZWQoaW50MzJfdCAqKnNhbXBsZXMsIGludDE2X3QgKCptYXRyaXgpWzJdLAorc3RhdGljIHZvaWQgYWMzX2Rvd25taXhfNV90b18yX3N5bW1ldHJpY19jX2ZpeGVkKGludDMyX3QgKipzYW1wbGVzLCBpbnQxNl90ICoqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgaW50NjRfdCB2MCwgdjE7CisgICAgaW50MTZfdCBmcm9udF9taXggICAgPSBtYXRyaXhbMF1bMF07CisgICAgaW50MTZfdCBjZW50ZXJfbWl4ICAgPSBtYXRyaXhbMF1bMV07CisgICAgaW50MTZfdCBzdXJyb3VuZF9taXggPSBtYXRyaXhbMF1bM107CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgdjAgPSAoaW50NjRfdClzYW1wbGVzWzBdW2ldICogZnJvbnRfbWl4ICArCisgICAgICAgICAgICAgKGludDY0X3Qpc2FtcGxlc1sxXVtpXSAqIGNlbnRlcl9taXggKworICAgICAgICAgICAgIChpbnQ2NF90KXNhbXBsZXNbM11baV0gKiBzdXJyb3VuZF9taXg7CisKKyAgICAgICAgdjEgPSAoaW50NjRfdClzYW1wbGVzWzFdW2ldICogY2VudGVyX21peCArCisgICAgICAgICAgICAgKGludDY0X3Qpc2FtcGxlc1syXVtpXSAqIGZyb250X21peCAgKworICAgICAgICAgICAgIChpbnQ2NF90KXNhbXBsZXNbNF1baV0gKiBzdXJyb3VuZF9taXg7CisKKyAgICAgICAgc2FtcGxlc1swXVtpXSA9ICh2MCsyMDQ4KT4+MTI7CisgICAgICAgIHNhbXBsZXNbMV1baV0gPSAodjErMjA0OCk+PjEyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWMzX2Rvd25taXhfNV90b18xX3N5bW1ldHJpY19jX2ZpeGVkKGludDMyX3QgKipzYW1wbGVzLCBpbnQxNl90ICoqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgaW50NjRfdCB2MDsKKyAgICBpbnQxNl90IGZyb250X21peCAgICA9IG1hdHJpeFswXVswXTsKKyAgICBpbnQxNl90IGNlbnRlcl9taXggICA9IG1hdHJpeFswXVsxXTsKKyAgICBpbnQxNl90IHN1cnJvdW5kX21peCA9IG1hdHJpeFswXVszXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICB2MCA9IChpbnQ2NF90KXNhbXBsZXNbMF1baV0gKiBmcm9udF9taXggICAgKworICAgICAgICAgICAgIChpbnQ2NF90KXNhbXBsZXNbMV1baV0gKiBjZW50ZXJfbWl4ICAgKworICAgICAgICAgICAgIChpbnQ2NF90KXNhbXBsZXNbMl1baV0gKiBmcm9udF9taXggICAgKworICAgICAgICAgICAgIChpbnQ2NF90KXNhbXBsZXNbM11baV0gKiBzdXJyb3VuZF9taXggKworICAgICAgICAgICAgIChpbnQ2NF90KXNhbXBsZXNbNF1baV0gKiBzdXJyb3VuZF9taXg7CisKKyAgICAgICAgc2FtcGxlc1swXVtpXSA9ICh2MCsyMDQ4KT4+MTI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhYzNfZG93bm1peF9jX2ZpeGVkKGludDMyX3QgKipzYW1wbGVzLCBpbnQxNl90ICoqbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gsIGludCBsZW4pCiB7CiAgICAgaW50IGksIGo7CkBAIC0yNDgsOCArMzMxLDggQEAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICB2MCA9IHYxID0gMDsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbl9jaDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgdjAgKz0gKGludDY0X3Qpc2FtcGxlc1tqXVtpXSAqIG1hdHJpeFtqXVswXTsKLSAgICAgICAgICAgICAgICB2MSArPSAoaW50NjRfdClzYW1wbGVzW2pdW2ldICogbWF0cml4W2pdWzFdOworICAgICAgICAgICAgICAgIHYwICs9IChpbnQ2NF90KXNhbXBsZXNbal1baV0gKiBtYXRyaXhbMF1bal07CisgICAgICAgICAgICAgICAgdjEgKz0gKGludDY0X3Qpc2FtcGxlc1tqXVtpXSAqIG1hdHJpeFsxXVtqXTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNhbXBsZXNbMF1baV0gPSAodjArMjA0OCk+PjEyOwogICAgICAgICAgICAgc2FtcGxlc1sxXVtpXSA9ICh2MSsyMDQ4KT4+MTI7CkBAIC0yNTgsMTIgKzM0MSwzOSBAQAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgIHYwID0gMDsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbl9jaDsgaisrKQotICAgICAgICAgICAgICAgIHYwICs9IChpbnQ2NF90KXNhbXBsZXNbal1baV0gKiBtYXRyaXhbal1bMF07CisgICAgICAgICAgICAgICAgdjAgKz0gKGludDY0X3Qpc2FtcGxlc1tqXVtpXSAqIG1hdHJpeFswXVtqXTsKICAgICAgICAgICAgIHNhbXBsZXNbMF1baV0gPSAodjArMjA0OCk+PjEyOwogICAgICAgICB9CiAgICAgfQogfQogCit2b2lkIGZmX2FjM2RzcF9kb3dubWl4X2ZpeGVkKEFDM0RTUENvbnRleHQgKmMsIGludDMyX3QgKipzYW1wbGVzLCBpbnQxNl90ICoqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gsIGludCBsZW4pCit7CisgICAgaWYgKGMtPmluX2NoYW5uZWxzICE9IGluX2NoIHx8IGMtPm91dF9jaGFubmVscyAhPSBvdXRfY2gpIHsKKyAgICAgICAgYy0+aW5fY2hhbm5lbHMgID0gaW5fY2g7CisgICAgICAgIGMtPm91dF9jaGFubmVscyA9IG91dF9jaDsKKyAgICAgICAgYy0+ZG93bm1peF9maXhlZCA9IE5VTEw7CisKKyAgICAgICAgaWYgKGluX2NoID09IDUgJiYgb3V0X2NoID09IDIgJiYKKyAgICAgICAgICAgICEobWF0cml4WzFdWzBdIHwgbWF0cml4WzBdWzJdICB8CisgICAgICAgICAgICAgIG1hdHJpeFsxXVszXSB8IG1hdHJpeFswXVs0XSAgfAorICAgICAgICAgICAgIChtYXRyaXhbMF1bMV0gXiBtYXRyaXhbMV1bMV0pIHwKKyAgICAgICAgICAgICAobWF0cml4WzBdWzBdIF4gbWF0cml4WzFdWzJdKSkpIHsKKyAgICAgICAgICAgIGMtPmRvd25taXhfZml4ZWQgPSBhYzNfZG93bm1peF81X3RvXzJfc3ltbWV0cmljX2NfZml4ZWQ7CisgICAgICAgIH0gZWxzZSBpZiAoaW5fY2ggPT0gNSAmJiBvdXRfY2ggPT0gMSAmJgorICAgICAgICAgICAgICAgICAgIG1hdHJpeFswXVswXSA9PSBtYXRyaXhbMF1bMl0gJiYKKyAgICAgICAgICAgICAgICAgICBtYXRyaXhbMF1bM10gPT0gbWF0cml4WzBdWzRdKSB7CisgICAgICAgICAgICBjLT5kb3dubWl4X2ZpeGVkID0gYWMzX2Rvd25taXhfNV90b18xX3N5bW1ldHJpY19jX2ZpeGVkOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGMtPmRvd25taXhfZml4ZWQpCisgICAgICAgIGMtPmRvd25taXhfZml4ZWQoc2FtcGxlcywgbWF0cml4LCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgYWMzX2Rvd25taXhfY19maXhlZChzYW1wbGVzLCBtYXRyaXgsIG91dF9jaCwgaW5fY2gsIGxlbik7Cit9CisKIHN0YXRpYyB2b2lkIGFwcGx5X3dpbmRvd19pbnQxNl9jKGludDE2X3QgKm91dHB1dCwgY29uc3QgaW50MTZfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp3aW5kb3csIHVuc2lnbmVkIGludCBsZW4pCiB7CkBAIC0yNzcsNiArMzg3LDM4IEBACiAgICAgfQogfQogCit2b2lkIGZmX2FjM2RzcF9kb3dubWl4KEFDM0RTUENvbnRleHQgKmMsIGZsb2F0ICoqc2FtcGxlcywgZmxvYXQgKiptYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCwgaW50IGxlbikKK3sKKyAgICBpZiAoYy0+aW5fY2hhbm5lbHMgIT0gaW5fY2ggfHwgYy0+b3V0X2NoYW5uZWxzICE9IG91dF9jaCkgeworICAgICAgICBpbnQgKiptYXRyaXhfY21wID0gKGludCAqKiltYXRyaXg7CisKKyAgICAgICAgYy0+aW5fY2hhbm5lbHMgID0gaW5fY2g7CisgICAgICAgIGMtPm91dF9jaGFubmVscyA9IG91dF9jaDsKKyAgICAgICAgYy0+ZG93bm1peCAgICAgID0gTlVMTDsKKworICAgICAgICBpZiAoaW5fY2ggPT0gNSAmJiBvdXRfY2ggPT0gMiAmJgorICAgICAgICAgICAgIShtYXRyaXhfY21wWzFdWzBdIHwgbWF0cml4X2NtcFswXVsyXSAgIHwKKyAgICAgICAgICAgICAgbWF0cml4X2NtcFsxXVszXSB8IG1hdHJpeF9jbXBbMF1bNF0gICB8CisgICAgICAgICAgICAgKG1hdHJpeF9jbXBbMF1bMV0gXiBtYXRyaXhfY21wWzFdWzFdKSB8CisgICAgICAgICAgICAgKG1hdHJpeF9jbXBbMF1bMF0gXiBtYXRyaXhfY21wWzFdWzJdKSkpIHsKKyAgICAgICAgICAgIGMtPmRvd25taXggPSBhYzNfZG93bm1peF81X3RvXzJfc3ltbWV0cmljX2M7CisgICAgICAgIH0gZWxzZSBpZiAoaW5fY2ggPT0gNSAmJiBvdXRfY2ggPT0gMSAmJgorICAgICAgICAgICAgICAgICAgIG1hdHJpeF9jbXBbMF1bMF0gPT0gbWF0cml4X2NtcFswXVsyXSAmJgorICAgICAgICAgICAgICAgICAgIG1hdHJpeF9jbXBbMF1bM10gPT0gbWF0cml4X2NtcFswXVs0XSkgeworICAgICAgICAgICAgYy0+ZG93bm1peCA9IGFjM19kb3dubWl4XzVfdG9fMV9zeW1tZXRyaWNfYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgICAgIGZmX2FjM2RzcF9zZXRfZG93bm1peF94ODYoYyk7CisgICAgfQorCisgICAgaWYgKGMtPmRvd25taXgpCisgICAgICAgIGMtPmRvd25taXgoc2FtcGxlcywgbWF0cml4LCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgYWMzX2Rvd25taXhfYyhzYW1wbGVzLCBtYXRyaXgsIG91dF9jaCwgaW5fY2gsIGxlbik7Cit9CisKIGF2X2NvbGQgdm9pZCBmZl9hYzNkc3BfaW5pdChBQzNEU1BDb250ZXh0ICpjLCBpbnQgYml0X2V4YWN0KQogewogICAgIGMtPmFjM19leHBvbmVudF9taW4gPSBhYzNfZXhwb25lbnRfbWluX2M7CkBAIC0yOTAsOCArNDMyLDEwIEBACiAgICAgYy0+ZXh0cmFjdF9leHBvbmVudHMgPSBhYzNfZXh0cmFjdF9leHBvbmVudHNfYzsKICAgICBjLT5zdW1fc3F1YXJlX2J1dHRlcmZseV9pbnQzMiA9IGFjM19zdW1fc3F1YXJlX2J1dHRlcmZseV9pbnQzMl9jOwogICAgIGMtPnN1bV9zcXVhcmVfYnV0dGVyZmx5X2Zsb2F0ID0gYWMzX3N1bV9zcXVhcmVfYnV0dGVyZmx5X2Zsb2F0X2M7Ci0gICAgYy0+ZG93bm1peCA9IGFjM19kb3dubWl4X2M7Ci0gICAgYy0+ZG93bm1peF9maXhlZCA9IGFjM19kb3dubWl4X2NfZml4ZWQ7CisgICAgYy0+aW5fY2hhbm5lbHMgICAgICAgICAgID0gMDsKKyAgICBjLT5vdXRfY2hhbm5lbHMgICAgICAgICAgPSAwOworICAgIGMtPmRvd25taXggICAgICAgICAgICAgICA9IE5VTEw7CisgICAgYy0+ZG93bm1peF9maXhlZCAgICAgICAgID0gTlVMTDsKICAgICBjLT5hcHBseV93aW5kb3dfaW50MTYgPSBhcHBseV93aW5kb3dfaW50MTZfYzsKIAogICAgIGlmIChBUkNIX0FSTSkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWMzZHNwLmggYi9saWJhdmNvZGVjL2FjM2RzcC5oCmluZGV4IGVkOThjOGMuLjE2MWRlNGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWMzZHNwLmgKKysrIGIvbGliYXZjb2RlYy9hYzNkc3AuaApAQCAtMTMyLDExICsxMzIsMTAgQEAKICAgICB2b2lkICgqc3VtX3NxdWFyZV9idXR0ZXJmbHlfZmxvYXQpKGZsb2F0IHN1bVs0XSwgY29uc3QgZmxvYXQgKmNvZWYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWYxLCBpbnQgbGVuKTsKIAotICAgIHZvaWQgKCpkb3dubWl4KShmbG9hdCAqKnNhbXBsZXMsIGZsb2F0ICgqbWF0cml4KVsyXSwgaW50IG91dF9jaCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGluX2NoLCBpbnQgbGVuKTsKLQotICAgIHZvaWQgKCpkb3dubWl4X2ZpeGVkKShpbnQzMl90ICoqc2FtcGxlcywgaW50MTZfdCAoKm1hdHJpeClbMl0sIGludCBvdXRfY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9jaCwgaW50IGxlbik7CisgICAgaW50IG91dF9jaGFubmVsczsKKyAgICBpbnQgaW5fY2hhbm5lbHM7CisgICAgdm9pZCAoKmRvd25taXgpKGZsb2F0ICoqc2FtcGxlcywgZmxvYXQgKiptYXRyaXgsIGludCBsZW4pOworICAgIHZvaWQgKCpkb3dubWl4X2ZpeGVkKShpbnQzMl90ICoqc2FtcGxlcywgaW50MTZfdCAqKm1hdHJpeCwgaW50IGxlbik7CiAKICAgICAvKioKICAgICAgKiBBcHBseSBzeW1tZXRyaWMgd2luZG93IGluIDE2LWJpdCBmaXhlZC1wb2ludC4KQEAgLTE1OCw0ICsxNTcsMTEgQEAKIHZvaWQgZmZfYWMzZHNwX2luaXRfeDg2KEFDM0RTUENvbnRleHQgKmMsIGludCBiaXRfZXhhY3QpOwogdm9pZCBmZl9hYzNkc3BfaW5pdF9taXBzKEFDM0RTUENvbnRleHQgKmMsIGludCBiaXRfZXhhY3QpOwogCit2b2lkIGZmX2FjM2RzcF9kb3dubWl4KEFDM0RTUENvbnRleHQgKmMsIGZsb2F0ICoqc2FtcGxlcywgZmxvYXQgKiptYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfY2gsIGludCBpbl9jaCwgaW50IGxlbik7Cit2b2lkIGZmX2FjM2RzcF9kb3dubWl4X2ZpeGVkKEFDM0RTUENvbnRleHQgKmMsIGludDMyX3QgKipzYW1wbGVzLCBpbnQxNl90ICoqbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gsIGludCBsZW4pOworCit2b2lkIGZmX2FjM2RzcF9zZXRfZG93bm1peF94ODYoQUMzRFNQQ29udGV4dCAqYyk7CisKICNlbmRpZiAvKiBBVkNPREVDX0FDM0RTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjM2VuY19maXhlZC5jIGIvbGliYXZjb2RlYy9hYzNlbmNfZml4ZWQuYwppbmRleCA5ZDM5MDI2Li5iMjNmYzY0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FjM2VuY19maXhlZC5jCisrKyBiL2xpYmF2Y29kZWMvYWMzZW5jX2ZpeGVkLmMKQEAgLTQzLDM0ICs0Myw2IEBACiAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi0jaW5jbHVkZSAiYWMzZW5jX3RlbXBsYXRlLmMiCi0KLQotLyoqCi0gKiBGaW5hbGl6ZSBNRENUIGFuZCBmcmVlIGFsbG9jYXRlZCBtZW1vcnkuCi0gKgotICogQHBhcmFtIHMgIEFDLTMgZW5jb2RlciBwcml2YXRlIGNvbnRleHQKLSAqLwotYXZfY29sZCB2b2lkIEFDM19OQU1FKG1kY3RfZW5kKShBQzNFbmNvZGVDb250ZXh0ICpzKQotewotICAgIGZmX21kY3RfZW5kKCZzLT5tZGN0KTsKLX0KLQotCi0vKioKLSAqIEluaXRpYWxpemUgTURDVCB0YWJsZXMuCi0gKgotICogQHBhcmFtIHMgIEFDLTMgZW5jb2RlciBwcml2YXRlIGNvbnRleHQKLSAqIEByZXR1cm4gICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQotICovCi1hdl9jb2xkIGludCBBQzNfTkFNRShtZGN0X2luaXQpKEFDM0VuY29kZUNvbnRleHQgKnMpCi17Ci0gICAgaW50IHJldCA9IGZmX21kY3RfaW5pdCgmcy0+bWRjdCwgOSwgMCwgLTEuMCk7Ci0gICAgcy0+bWRjdF93aW5kb3cgPSBmZl9hYzNfd2luZG93OwotICAgIHJldHVybiByZXQ7Ci19Ci0KLQogLyoKICAqIE5vcm1hbGl6ZSB0aGUgaW5wdXQgc2FtcGxlcyB0byB1c2UgdGhlIG1heGltdW0gYXZhaWxhYmxlIHByZWNpc2lvbi4KICAqIFRoaXMgYXNzdW1lcyBzaWduZWQgMTYtYml0IGlucHV0IHNhbXBsZXMuCkBAIC0xMzUsNiArMTA3LDM0IEBACiB9CiAKIAorI2luY2x1ZGUgImFjM2VuY190ZW1wbGF0ZS5jIgorCisKKy8qKgorICogRmluYWxpemUgTURDVCBhbmQgZnJlZSBhbGxvY2F0ZWQgbWVtb3J5LgorICoKKyAqIEBwYXJhbSBzICBBQy0zIGVuY29kZXIgcHJpdmF0ZSBjb250ZXh0CisgKi8KK2F2X2NvbGQgdm9pZCBmZl9hYzNfZml4ZWRfbWRjdF9lbmQoQUMzRW5jb2RlQ29udGV4dCAqcykKK3sKKyAgICBmZl9tZGN0X2VuZCgmcy0+bWRjdCk7Cit9CisKKworLyoqCisgKiBJbml0aWFsaXplIE1EQ1QgdGFibGVzLgorICoKKyAqIEBwYXJhbSBzICBBQy0zIGVuY29kZXIgcHJpdmF0ZSBjb250ZXh0CisgKiBAcmV0dXJuICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLworYXZfY29sZCBpbnQgZmZfYWMzX2ZpeGVkX21kY3RfaW5pdChBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCByZXQgPSBmZl9tZGN0X2luaXQoJnMtPm1kY3QsIDksIDAsIC0xLjApOworICAgIHMtPm1kY3Rfd2luZG93ID0gZmZfYWMzX3dpbmRvdzsKKyAgICByZXR1cm4gcmV0OworfQorCisKIHN0YXRpYyBhdl9jb2xkIGludCBhYzNfZml4ZWRfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIEFDM0VuY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hYzNlbmNfZmxvYXQuYyBiL2xpYmF2Y29kZWMvYWMzZW5jX2Zsb2F0LmMKaW5kZXggNmM5MWY0NS4uZDZlNjU4YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hYzNlbmNfZmxvYXQuYworKysgYi9saWJhdmNvZGVjL2FjM2VuY19mbG9hdC5jCkBAIC00Myw2ICs0Myw0OSBAQAogICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAorCisvKgorICogU2NhbGUgTURDVCBjb2VmZmljaWVudHMgZnJvbSBmbG9hdCB0byAyNC1iaXQgZml4ZWQtcG9pbnQuCisgKi8KK3N0YXRpYyB2b2lkIHNjYWxlX2NvZWZmaWNpZW50cyhBQzNFbmNvZGVDb250ZXh0ICpzKQoreworICAgIGludCBjaGFuX3NpemUgPSBBQzNfTUFYX0NPRUZTICogcy0+bnVtX2Jsb2NrczsKKyAgICBpbnQgY3BsICAgICAgID0gcy0+Y3BsX29uOworICAgIHMtPmFjM2RzcC5mbG9hdF90b19maXhlZDI0KHMtPmZpeGVkX2NvZWZfYnVmZmVyICsgKGNoYW5fc2l6ZSAqICFjcGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1kY3RfY29lZl9idWZmZXIgICsgKGNoYW5fc2l6ZSAqICFjcGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5fc2l6ZSAqIChzLT5jaGFubmVscyArIGNwbCkpOworfQorCisKKy8qCisgKiBDbGlwIE1EQ1QgY29lZmZpY2llbnRzIHRvIGFsbG93YWJsZSByYW5nZS4KKyAqLworc3RhdGljIHZvaWQgY2xpcF9jb2VmZmljaWVudHMoQXVkaW9EU1BDb250ZXh0ICphZHNwLCBmbG9hdCAqY29lZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisgICAgYWRzcC0+dmVjdG9yX2NsaXBmKGNvZWYsIGNvZWYsIGxlbiwgQ09FRl9NSU4sIENPRUZfTUFYKTsKK30KKworCisvKgorICogQ2FsY3VsYXRlIGEgc2luZ2xlIGNvdXBsaW5nIGNvb3JkaW5hdGUuCisgKi8KK3N0YXRpYyBDb2VmVHlwZSBjYWxjX2NwbF9jb29yZChDb2VmU3VtVHlwZSBlbmVyZ3lfY2gsIENvZWZTdW1UeXBlIGVuZXJneV9jcGwpCit7CisgICAgZmxvYXQgY29vcmQgPSAwLjEyNTsKKyAgICBpZiAoZW5lcmd5X2NwbCA+IDApCisgICAgICAgIGNvb3JkICo9IHNxcnRmKGVuZXJneV9jaCAvIGVuZXJneV9jcGwpOworICAgIHJldHVybiBGRk1JTihjb29yZCwgQ09FRl9NQVgpOworfQorCitzdGF0aWMgdm9pZCBzdW1fc3F1YXJlX2J1dHRlcmZseShBQzNFbmNvZGVDb250ZXh0ICpzLCBmbG9hdCBzdW1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZjAsIGNvbnN0IGZsb2F0ICpjb2VmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgcy0+YWMzZHNwLnN1bV9zcXVhcmVfYnV0dGVyZmx5X2Zsb2F0KHN1bSwgY29lZjAsIGNvZWYxLCBsZW4pOworfQorCisKICNpbmNsdWRlICJhYzNlbmNfdGVtcGxhdGUuYyIKIAogCkBAIC04Niw1NiArMTI5LDYgQEAKIH0KIAogCi0vKgotICogTm9ybWFsaXplIHRoZSBpbnB1dCBzYW1wbGVzLgotICogTm90IG5lZWRlZCBmb3IgdGhlIGZsb2F0aW5nLXBvaW50IGVuY29kZXIuCi0gKi8KLXN0YXRpYyBpbnQgbm9ybWFsaXplX3NhbXBsZXMoQUMzRW5jb2RlQ29udGV4dCAqcykKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKgotICogU2NhbGUgTURDVCBjb2VmZmljaWVudHMgZnJvbSBmbG9hdCB0byAyNC1iaXQgZml4ZWQtcG9pbnQuCi0gKi8KLXN0YXRpYyB2b2lkIHNjYWxlX2NvZWZmaWNpZW50cyhBQzNFbmNvZGVDb250ZXh0ICpzKQotewotICAgIGludCBjaGFuX3NpemUgPSBBQzNfTUFYX0NPRUZTICogcy0+bnVtX2Jsb2NrczsKLSAgICBpbnQgY3BsICAgICAgID0gcy0+Y3BsX29uOwotICAgIHMtPmFjM2RzcC5mbG9hdF90b19maXhlZDI0KHMtPmZpeGVkX2NvZWZfYnVmZmVyICsgKGNoYW5fc2l6ZSAqICFjcGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1kY3RfY29lZl9idWZmZXIgICsgKGNoYW5fc2l6ZSAqICFjcGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5fc2l6ZSAqIChzLT5jaGFubmVscyArIGNwbCkpOwotfQotCi1zdGF0aWMgdm9pZCBzdW1fc3F1YXJlX2J1dHRlcmZseShBQzNFbmNvZGVDb250ZXh0ICpzLCBmbG9hdCBzdW1bNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZjAsIGNvbnN0IGZsb2F0ICpjb2VmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCi17Ci0gICAgcy0+YWMzZHNwLnN1bV9zcXVhcmVfYnV0dGVyZmx5X2Zsb2F0KHN1bSwgY29lZjAsIGNvZWYxLCBsZW4pOwotfQotCi0vKgotICogQ2xpcCBNRENUIGNvZWZmaWNpZW50cyB0byBhbGxvd2FibGUgcmFuZ2UuCi0gKi8KLXN0YXRpYyB2b2lkIGNsaXBfY29lZmZpY2llbnRzKEF1ZGlvRFNQQ29udGV4dCAqYWRzcCwgZmxvYXQgKmNvZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQotewotICAgIGFkc3AtPnZlY3Rvcl9jbGlwZihjb2VmLCBjb2VmLCBDT0VGX01JTiwgQ09FRl9NQVgsIGxlbik7Ci19Ci0KLQotLyoKLSAqIENhbGN1bGF0ZSBhIHNpbmdsZSBjb3VwbGluZyBjb29yZGluYXRlLgotICovCi1zdGF0aWMgQ29lZlR5cGUgY2FsY19jcGxfY29vcmQoQ29lZlN1bVR5cGUgZW5lcmd5X2NoLCBDb2VmU3VtVHlwZSBlbmVyZ3lfY3BsKQotewotICAgIGZsb2F0IGNvb3JkID0gMC4xMjU7Ci0gICAgaWYgKGVuZXJneV9jcGwgPiAwKQotICAgICAgICBjb29yZCAqPSBzcXJ0ZihlbmVyZ3lfY2ggLyBlbmVyZ3lfY3BsKTsKLSAgICByZXR1cm4gRkZNSU4oY29vcmQsIENPRUZfTUFYKTsKLX0KLQogYXZfY29sZCBpbnQgZmZfYWMzX2Zsb2F0X2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBBQzNFbmNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWMzZW5jX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2FjM2VuY190ZW1wbGF0ZS5jCmluZGV4IDlkZWM5YWUuLmJlNjU5ODcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWMzZW5jX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9hYzNlbmNfdGVtcGxhdGUuYwpAQCAtMzYsMjAgKzM2LDYgQEAKICNpbmNsdWRlICJhYzNlbmMuaCIKICNpbmNsdWRlICJlYWMzZW5jLmgiCiAKLS8qIHByb3RvdHlwZXMgZm9yIHN0YXRpYyBmdW5jdGlvbnMgaW4gYWMzZW5jX2ZpeGVkLmMgYW5kIGFjM2VuY19mbG9hdC5jICovCi0KLXN0YXRpYyB2b2lkIHNjYWxlX2NvZWZmaWNpZW50cyhBQzNFbmNvZGVDb250ZXh0ICpzKTsKLQotc3RhdGljIGludCBub3JtYWxpemVfc2FtcGxlcyhBQzNFbmNvZGVDb250ZXh0ICpzKTsKLQotc3RhdGljIHZvaWQgY2xpcF9jb2VmZmljaWVudHMoQXVkaW9EU1BDb250ZXh0ICphZHNwLCBDb2VmVHlwZSAqY29lZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsZW4pOwotCi1zdGF0aWMgQ29lZlR5cGUgY2FsY19jcGxfY29vcmQoQ29lZlN1bVR5cGUgZW5lcmd5X2NoLCBDb2VmU3VtVHlwZSBlbmVyZ3lfY3BsKTsKLQotc3RhdGljIHZvaWQgc3VtX3NxdWFyZV9idXR0ZXJmbHkoQUMzRW5jb2RlQ29udGV4dCAqcywgQ29lZlN1bVR5cGUgc3VtWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29lZlR5cGUgKmNvZWYwLCBjb25zdCBDb2VmVHlwZSAqY29lZjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKIAogaW50IEFDM19OQU1FKGFsbG9jYXRlX3NhbXBsZV9idWZmZXJzKShBQzNFbmNvZGVDb250ZXh0ICpzKQogewpAQCAtMTEzLDEwICs5OSwxMCBAQAogI2Vsc2UKICAgICAgICAgICAgIHMtPmFjM2RzcC5hcHBseV93aW5kb3dfaW50MTYocy0+d2luZG93ZWRfc2FtcGxlcywgaW5wdXRfc2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWRjdF93aW5kb3csIEFDM19XSU5ET1dfU0laRSk7Ci0jZW5kaWYKIAogICAgICAgICAgICAgaWYgKHMtPmZpeGVkX3BvaW50KQogICAgICAgICAgICAgICAgIGJsb2NrLT5jb2VmZl9zaGlmdFtjaCsxXSA9IG5vcm1hbGl6ZV9zYW1wbGVzKHMpOworI2VuZGlmCiAKICAgICAgICAgICAgIHMtPm1kY3QubWRjdF9jYWxjdygmcy0+bWRjdCwgYmxvY2stPm1kY3RfY29lZltjaCsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aW5kb3dlZF9zYW1wbGVzKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWMzdGFiLmMgYi9saWJhdmNvZGVjL2FjM3RhYi5jCmluZGV4IGQ2MmQ4YmYuLmJkODhmMzIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWMzdGFiLmMKKysrIGIvbGliYXZjb2RlYy9hYzN0YWIuYwpAQCAtMzE0LDMgKzMxNCwyMSBAQAogICAgIEFDM19DSE1BUF9MIHwgICAgICAgICAgICAgICBBQzNfQ0hNQVBfUiB8IEFDM19DSE1BUF9MX1NVUiB8ICAgICAgICAgICAgICAgICAgQUMzX0NITUFQX1JfU1VSLAogICAgIEFDM19DSE1BUF9MIHwgQUMzX0NITUFQX0MgfCBBQzNfQ0hNQVBfUiB8IEFDM19DSE1BUF9MX1NVUiB8ICAgICAgICAgICAgICAgICAgQUMzX0NITUFQX1JfU1VSCiB9OworY29uc3QgdWludDY0X3QgZmZfZWFjM19jdXN0b21fY2hhbm5lbF9tYXBfbG9jYXRpb25zWzE2XVsyXSA9IHsKKyAgICB7IDEsIEFWX0NIX0ZST05UX0xFRlQgfSwKKyAgICB7IDEsIEFWX0NIX0ZST05UX0NFTlRFUiB9LAorICAgIHsgMSwgQVZfQ0hfRlJPTlRfUklHSFQgfSwKKyAgICB7IDEsIEFWX0NIX1NJREVfTEVGVCB9LAorICAgIHsgMSwgQVZfQ0hfU0lERV9SSUdIVCB9LAorICAgIHsgMCwgQVZfQ0hfRlJPTlRfTEVGVF9PRl9DRU5URVIgfCBBVl9DSF9GUk9OVF9SSUdIVF9PRl9DRU5URVIgfSwKKyAgICB7IDAsIEFWX0NIX0JBQ0tfTEVGVCB8IEFWX0NIX0JBQ0tfUklHSFQgfSwKKyAgICB7IDAsIEFWX0NIX0JBQ0tfQ0VOVEVSIH0sCisgICAgeyAwLCBBVl9DSF9UT1BfQ0VOVEVSIH0sCisgICAgeyAwLCBBVl9DSF9TVVJST1VORF9ESVJFQ1RfTEVGVCB8IEFWX0NIX1NVUlJPVU5EX0RJUkVDVF9SSUdIVCB9LAorICAgIHsgMCwgQVZfQ0hfV0lERV9MRUZUIHwgQVZfQ0hfV0lERV9SSUdIVCB9LAorICAgIHsgMCwgQVZfQ0hfVE9QX0ZST05UX0xFRlQgfCBBVl9DSF9UT1BfRlJPTlRfUklHSFR9LAorICAgIHsgMCwgQVZfQ0hfVE9QX0ZST05UX0NFTlRFUiB9LAorICAgIHsgMCwgQVZfQ0hfVE9QX0JBQ0tfTEVGVCB8IEFWX0NIX1RPUF9CQUNLX1JJR0hUIH0sCisgICAgeyAwLCBBVl9DSF9MT1dfRlJFUVVFTkNZXzIgfSwKKyAgICB7IDEsIEFWX0NIX0xPV19GUkVRVUVOQ1kgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FjM3RhYi5oIGIvbGliYXZjb2RlYy9hYzN0YWIuaAppbmRleCBmNTI5ZmM4Li5hYTcxYWNiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FjM3RhYi5oCisrKyBiL2xpYmF2Y29kZWMvYWMzdGFiLmgKQEAgLTI2LDEwICsyNiwxMSBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAiYWMzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2FjM19mcmFtZV9zaXplX3RhYlszOF1bM107CiBleHRlcm4gY29uc3QgdWludDhfdCAgZmZfYWMzX2NoYW5uZWxzX3RhYls4XTsKLWV4dGVybiBhdl9leHBvcnQgY29uc3QgdWludDE2X3QgYXZwcml2X2FjM19jaGFubmVsX2xheW91dF90YWJbOF07CitleHRlcm4gYXZfZXhwb3J0X2F2Y29kZWMgY29uc3QgdWludDE2X3QgYXZwcml2X2FjM19jaGFubmVsX2xheW91dF90YWJbOF07CiBleHRlcm4gY29uc3QgdWludDhfdCAgZmZfYWMzX2VuY19jaGFubmVsX21hcFs4XVsyXVs2XTsKIGV4dGVybiBjb25zdCB1aW50OF90ICBmZl9hYzNfZGVjX2NoYW5uZWxfbWFwWzhdWzJdWzZdOwogZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2FjM19zYW1wbGVfcmF0ZV90YWJbM107CkBAIC00OSw2ICs1MCw4IEBACiBleHRlcm4gY29uc3QgdWludDE2X3QgZmZfZWFjM19kZWZhdWx0X2NobWFwWzhdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2FjM19iYW5kX3N0YXJ0X3RhYltBQzNfQ1JJVElDQUxfQkFORFMrMV07CiBleHRlcm4gY29uc3QgdWludDhfdCAgZmZfYWMzX2Jpbl90b19iYW5kX3RhYlsyNTNdOworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX2VhYzNfY3VzdG9tX2NoYW5uZWxfbWFwX2xvY2F0aW9uc1sxNl1bMl07CisKIAogLyoqIEN1c3RvbSBjaGFubmVsIG1hcCBsb2NhdGlvbnMgYml0bWFzawogICogIE90aGVyIGNoYW5uZWxzIGRlc2NyaWJlZCBpbiBkb2N1bWVudGF0aW9uOgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hY2VscF9maWx0ZXJzLmggYi9saWJhdmNvZGVjL2FjZWxwX2ZpbHRlcnMuaAppbmRleCA3YTMwNjFiLi5mZTg2Y2IyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FjZWxwX2ZpbHRlcnMuaAorKysgYi9saWJhdmNvZGVjL2FjZWxwX2ZpbHRlcnMuaApAQCAtODIsNyArODIsNiBAQAogICogZmlsdGVyX2NvZWZmcyBjb250YWlucyBjb2VmZmljaWVudHMgb2YgdGhlIHJpZ2h0IGhhbGYgb2YgdGhlIHN5bW1ldHJpYwogICogaW50ZXJwb2xhdGlvbiBmaWx0ZXIuIGZpbHRlcl9jb2VmZnNbMF0gc2hvdWxkIHRoZSBjZW50cmFsICh1bnBhaXJlZCkgY29lZmZpY2llbnQuCiAgKiBTZWUgZmZfYWNlbHBfaW50ZXJwX2ZpbHRlciBmb3IgYW4gZXhhbXBsZS4KLSAqCiAgKi8KIHZvaWQgZmZfYWNlbHBfaW50ZXJwb2xhdGUoaW50MTZfdCogb3V0LCBjb25zdCBpbnQxNl90KiBpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogZmlsdGVyX2NvZWZmcywgaW50IHByZWNpc2lvbiwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWNlbHBfcGl0Y2hfZGVsYXkuYyBiL2xpYmF2Y29kZWMvYWNlbHBfcGl0Y2hfZGVsYXkuYwppbmRleCBjMjUzM2IxLi5jMzQ1YTk5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FjZWxwX3BpdGNoX2RlbGF5LmMKKysrIGIvbGliYXZjb2RlYy9hY2VscF9waXRjaF9kZWxheS5jCkBAIC0yMSw5ICsyMSw4IEBACiAgKi8KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmZtYXRoLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImFjZWxwX3BpdGNoX2RlbGF5LmgiCkBAIC0xMzYsNyArMTM1LDcgQEAKICAgICAgICAgZmZfZXhwMTAoMC4wNSAqCiAgICAgICAgICAgICAgIChhdnByaXZfc2NhbGFycHJvZHVjdF9mbG9hdF9jKHByZWRfdGFibGUsIHByZWRpY3Rpb25fZXJyb3IsIDQpICsKICAgICAgICAgICAgICAgIGVuZXJneV9tZWFuKSkgLwotICAgICAgICBzcXJ0ZihmaXhlZF9tZWFuX2VuZXJneSk7CisgICAgICAgIHNxcnRmKGZpeGVkX21lYW5fZW5lcmd5ID8gZml4ZWRfbWVhbl9lbmVyZ3kgOiAxLjApOwogCiAgICAgLy8gdXBkYXRlIHF1YW50aWZpZWQgcHJlZGljdGlvbiBlcnJvciBlbmVyZ3kgaGlzdG9yeQogICAgIG1lbW1vdmUoJnByZWRpY3Rpb25fZXJyb3JbMF0sICZwcmVkaWN0aW9uX2Vycm9yWzFdLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hZHBjbS5jIGIvbGliYXZjb2RlYy9hZHBjbS5jCmluZGV4IGM0YTBhMTguLmNkM2JiZDMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWRwY20uYworKysgYi9saWJhdmNvZGVjL2FkcGNtLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBmaXJzdCB2ZXJzaW9uIGJ5IEZyYW5jb2lzIFJldm9sIChyZXZvbEBmcmVlLmZyKQogICogZnJpbmdlIEFEUENNIGNvZGVjcyAoZS5nLiwgREszLCBESzQsIFdlc3R3b29kKQpAQCAtMTA3LDkgKzEwNywxNCBAQAogICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRUFfWEFTOgogICAgICAgICBtYXhfY2hhbm5lbHMgPSA2OwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX01UQUY6CisgICAgICAgIG1pbl9jaGFubmVscyA9IDI7CisgICAgICAgIG1heF9jaGFubmVscyA9IDg7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fUFNYOgogICAgICAgICBtYXhfY2hhbm5lbHMgPSA4OwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9EQVQ0OgogICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fVEhQOgogICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fVEhQX0xFOgogICAgICAgICBtYXhfY2hhbm5lbHMgPSAxNDsKQEAgLTE0NCw2ICsxNDksNyBAQAogCiAgICAgc3dpdGNoKGF2Y3R4LT5jb2RlYy0+aWQpIHsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9BSUNBOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9EQVQ0OgogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVDoKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWOgogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNXzRYTToKQEAgLTE1Nyw2ICsxNjMsNyBAQAogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0FGQzoKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9EVEs6CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fUFNYOgorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX01UQUY6CiAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2UDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUzoKQEAgLTE3MCw3ICsxNzcsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHNob3J0IGFkcGNtX2ltYV9leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgY2hhciBuaWJibGUsIGludCBzaGlmdCkKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBhZHBjbV9pbWFfZXhwYW5kX25pYmJsZShBRFBDTUNoYW5uZWxTdGF0dXMgKmMsIGludDhfdCBuaWJibGUsIGludCBzaGlmdCkKIHsKICAgICBpbnQgc3RlcF9pbmRleDsKICAgICBpbnQgcHJlZGljdG9yOwpAQCAtMTkzLDcgKzIwMCw3IEBACiAgICAgYy0+cHJlZGljdG9yID0gYXZfY2xpcF9pbnQxNihwcmVkaWN0b3IpOwogICAgIGMtPnN0ZXBfaW5kZXggPSBzdGVwX2luZGV4OwogCi0gICAgcmV0dXJuIChzaG9ydCljLT5wcmVkaWN0b3I7CisgICAgcmV0dXJuIChpbnQxNl90KWMtPnByZWRpY3RvcjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQxNl90IGFkcGNtX2ltYV93YXZfZXhwYW5kX25pYmJsZShBRFBDTUNoYW5uZWxTdGF0dXMgKmMsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgYnBzKQpAQCAtMjQ1LDcgKzI1Miw3IEBACiAgICAgcmV0dXJuIGMtPnByZWRpY3RvcjsKIH0KIAotc3RhdGljIGlubGluZSBzaG9ydCBhZHBjbV9tc19leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgaW50IG5pYmJsZSkKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBhZHBjbV9tc19leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgaW50IG5pYmJsZSkKIHsKICAgICBpbnQgcHJlZGljdG9yOwogCkBAIC0yNjQsNyArMjcxLDcgQEAKICAgICByZXR1cm4gYy0+c2FtcGxlMTsKIH0KIAotc3RhdGljIGlubGluZSBzaG9ydCBhZHBjbV9pbWFfb2tpX2V4cGFuZF9uaWJibGUoQURQQ01DaGFubmVsU3RhdHVzICpjLCBpbnQgbmliYmxlKQorc3RhdGljIGlubGluZSBpbnQxNl90IGFkcGNtX2ltYV9va2lfZXhwYW5kX25pYmJsZShBRFBDTUNoYW5uZWxTdGF0dXMgKmMsIGludCBuaWJibGUpCiB7CiAgICAgaW50IHN0ZXBfaW5kZXgsIHByZWRpY3Rvciwgc2lnbiwgZGVsdGEsIGRpZmYsIHN0ZXA7CiAKQEAgLTI4NSw3ICsyOTIsNyBAQAogICAgIHJldHVybiBjLT5wcmVkaWN0b3IgPDwgNDsKIH0KIAotc3RhdGljIGlubGluZSBzaG9ydCBhZHBjbV9jdF9leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgY2hhciBuaWJibGUpCitzdGF0aWMgaW5saW5lIGludDE2X3QgYWRwY21fY3RfZXhwYW5kX25pYmJsZShBRFBDTUNoYW5uZWxTdGF0dXMgKmMsIGludDhfdCBuaWJibGUpCiB7CiAgICAgaW50IHNpZ24sIGRlbHRhLCBkaWZmOwogICAgIGludCBuZXdfc3RlcDsKQEAgLTMwMywxMCArMzEwLDEwIEBACiAgICAgbmV3X3N0ZXAgPSAoZmZfYWRwY21fQWRhcHRhdGlvblRhYmxlW25pYmJsZSAmIDddICogYy0+c3RlcCkgPj4gODsKICAgICBjLT5zdGVwID0gYXZfY2xpcChuZXdfc3RlcCwgNTExLCAzMjc2Nyk7CiAKLSAgICByZXR1cm4gKHNob3J0KWMtPnByZWRpY3RvcjsKKyAgICByZXR1cm4gKGludDE2X3QpYy0+cHJlZGljdG9yOwogfQogCi1zdGF0aWMgaW5saW5lIHNob3J0IGFkcGNtX3NicHJvX2V4cGFuZF9uaWJibGUoQURQQ01DaGFubmVsU3RhdHVzICpjLCBjaGFyIG5pYmJsZSwgaW50IHNpemUsIGludCBzaGlmdCkKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBhZHBjbV9zYnByb19leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgaW50OF90IG5pYmJsZSwgaW50IHNpemUsIGludCBzaGlmdCkKIHsKICAgICBpbnQgc2lnbiwgZGVsdGEsIGRpZmY7CiAKQEAgLTMyMywxMCArMzMwLDEwIEBACiAgICAgZWxzZSBpZiAoZGVsdGEgPT0gMCAmJiBjLT5zdGVwID4gMCkKICAgICAgICAgYy0+c3RlcC0tOwogCi0gICAgcmV0dXJuIChzaG9ydCkgYy0+cHJlZGljdG9yOworICAgIHJldHVybiAoaW50MTZfdCkgYy0+cHJlZGljdG9yOwogfQogCi1zdGF0aWMgaW5saW5lIHNob3J0IGFkcGNtX3lhbWFoYV9leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgdW5zaWduZWQgY2hhciBuaWJibGUpCitzdGF0aWMgaW5saW5lIGludDE2X3QgYWRwY21feWFtYWhhX2V4cGFuZF9uaWJibGUoQURQQ01DaGFubmVsU3RhdHVzICpjLCB1aW50OF90IG5pYmJsZSkKIHsKICAgICBpZighYy0+c3RlcCkgewogICAgICAgICBjLT5wcmVkaWN0b3IgPSAwOwpAQCAtMzM2LDcgKzM0MywxNiBAQAogICAgIGMtPnByZWRpY3RvciArPSAoYy0+c3RlcCAqIGZmX2FkcGNtX3lhbWFoYV9kaWZmbG9va3VwW25pYmJsZV0pIC8gODsKICAgICBjLT5wcmVkaWN0b3IgPSBhdl9jbGlwX2ludDE2KGMtPnByZWRpY3Rvcik7CiAgICAgYy0+c3RlcCA9IChjLT5zdGVwICogZmZfYWRwY21feWFtYWhhX2luZGV4c2NhbGVbbmliYmxlXSkgPj4gODsKLSAgICBjLT5zdGVwID0gYXZfY2xpcChjLT5zdGVwLCAxMjcsIDI0NTY3KTsKKyAgICBjLT5zdGVwID0gYXZfY2xpcChjLT5zdGVwLCAxMjcsIDI0NTc2KTsKKyAgICByZXR1cm4gYy0+cHJlZGljdG9yOworfQorCitzdGF0aWMgaW5saW5lIGludDE2X3QgYWRwY21fbXRhZl9leHBhbmRfbmliYmxlKEFEUENNQ2hhbm5lbFN0YXR1cyAqYywgdWludDhfdCBuaWJibGUpCit7CisgICAgYy0+cHJlZGljdG9yICs9IGZmX2FkcGNtX210YWZfc3RlcHNpemVbYy0+c3RlcF1bbmliYmxlXTsKKyAgICBjLT5wcmVkaWN0b3IgPSBhdl9jbGlwX2ludDE2KGMtPnByZWRpY3Rvcik7CisgICAgYy0+c3RlcCArPSBmZl9hZHBjbV9pbmRleF90YWJsZVtuaWJibGVdOworICAgIGMtPnN0ZXAgPSBhdl9jbGlwX3VpbnRwMihjLT5zdGVwLCA1KTsKICAgICByZXR1cm4gYy0+cHJlZGljdG9yOwogfQogCkBAIC00NTAsNyArNDY2LDcgQEAKICAgICAgICAgICAgICAgICAvLyBzaW1pbGFyIHRvIElNQSBhZHBjbQogICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IGdldF9iaXRzKCZnYiwgbmJfYml0cyk7CiAgICAgICAgICAgICAgICAgaW50IHN0ZXAgPSBmZl9hZHBjbV9zdGVwX3RhYmxlW2MtPnN0YXR1c1tpXS5zdGVwX2luZGV4XTsKLSAgICAgICAgICAgICAgICBsb25nIHZwZGlmZiA9IDA7IC8vIHZwZGlmZiA9IChkZWx0YSswLjUpKnN0ZXAvNAorICAgICAgICAgICAgICAgIGludCB2cGRpZmYgPSAwOyAvLyB2cGRpZmYgPSAoZGVsdGErMC41KSpzdGVwLzQKICAgICAgICAgICAgICAgICBpbnQgayA9IGswOwogCiAgICAgICAgICAgICAgICAgZG8gewpAQCAtNTMzLDYgKzU0OSw3IEBACiAgICAgaGVhZGVyX3NpemUgPSAwOwogICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgewogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNXzRYTToKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREFUNDoKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfSVNTOiAgICAgaGVhZGVyX3NpemUgPSA0ICogY2g7ICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0FNVjogICAgIGhlYWRlcl9zaXplID0gODsgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9TTUpQRUc6ICBoZWFkZXJfc2l6ZSA9IDQgKiBjaDsgICAgICBicmVhazsKQEAgLTYxNCw2ICs2MzEsMTEgQEAKICAgICAgICAgICAgIGJ1Zl9zaXplID0gRkZNSU4oYnVmX3NpemUsIGF2Y3R4LT5ibG9ja19hbGlnbik7CiAgICAgICAgIG5iX3NhbXBsZXMgPSAoYnVmX3NpemUgLSA2ICogY2gpICogMiAvIGNoOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX01UQUY6CisgICAgICAgIGlmIChhdmN0eC0+YmxvY2tfYWxpZ24gPiAwKQorICAgICAgICAgICAgYnVmX3NpemUgPSBGRk1JTihidWZfc2l6ZSwgYXZjdHgtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgbmJfc2FtcGxlcyA9IChidWZfc2l6ZSAtIDE2ICogKGNoIC8gMikpICogMiAvIGNoOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1NCUFJPXzI6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9TQlBST18zOgogICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fU0JQUk9fNDoKQEAgLTY5Miw3ICs3MTQsNyBAQAogICAgIEFEUENNRGVjb2RlQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgQURQQ01DaGFubmVsU3RhdHVzICpjczsKICAgICBpbnQgbiwgbSwgY2hhbm5lbCwgaTsKLSAgICBzaG9ydCAqc2FtcGxlczsKKyAgICBpbnQxNl90ICpzYW1wbGVzOwogICAgIGludDE2X3QgKipzYW1wbGVzX3A7CiAgICAgaW50IHN0OyAvKiBzdGVyZW8gKi8KICAgICBpbnQgY291bnQxLCBjb3VudDI7CkBAIC03MTAsNyArNzMyLDcgQEAKICAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IG5iX3NhbXBsZXM7CiAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICBzYW1wbGVzID0gKHNob3J0ICopZnJhbWUtPmRhdGFbMF07CisgICAgc2FtcGxlcyA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CiAgICAgc2FtcGxlc19wID0gKGludDE2X3QgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGE7CiAKICAgICAvKiB1c2UgY29kZWRfc2FtcGxlcyB3aGVuIGFwcGxpY2FibGUgKi8KQEAgLTc4MCwxNSArODAyLDIzIEBACiAKICAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgIT0gNCkgewogICAgICAgICAgICAgaW50IHNhbXBsZXNfcGVyX2Jsb2NrID0gZmZfYWRwY21faW1hX2Jsb2NrX3NhbXBsZXNbYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAtIDJdOworICAgICAgICAgICAgaW50IGJsb2NrX3NpemUgPSBmZl9hZHBjbV9pbWFfYmxvY2tfc2l6ZXNbYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAtIDJdOworICAgICAgICAgICAgdWludDhfdCB0ZW1wWzIwICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0gPSB7IDAgfTsKICAgICAgICAgICAgIEdldEJpdENvbnRleHQgZzsKIAotICAgICAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoJmcsIGdiLmJ1ZmZlciwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IChuYl9zYW1wbGVzIC0gMSkgLyBzYW1wbGVzX3Blcl9ibG9jazsgbisrKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBqOworCiAgICAgICAgICAgICAgICAgICAgIGNzID0gJmMtPnN0YXR1c1tpXTsKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcyA9ICZzYW1wbGVzX3BbaV1bMSArIG4gKiBzYW1wbGVzX3Blcl9ibG9ja107CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBibG9ja19zaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbal0gPSBidWZbNCAqIGF2Y3R4LT5jaGFubmVscyArIGJsb2NrX3NpemUgKiBuICogYXZjdHgtPmNoYW5uZWxzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaiAlIDQpICsgKGogLyA0KSAqIChhdmN0eC0+Y2hhbm5lbHMgKiA0KSArIGkgKiA0XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXQgPSBpbml0X2dldF9iaXRzOCgmZywgKGNvbnN0IHVpbnQ4X3QgKikmdGVtcCwgYmxvY2tfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IHNhbXBsZXNfcGVyX2Jsb2NrOyBtKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbbV0gPSBhZHBjbV9pbWFfd2F2X2V4cGFuZF9uaWJibGUoY3MsICZnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CkBAIC04NzYsNiArOTA2LDI3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fTVRBRjoKKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbm5lbCs9MikgeworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCA0KTsKKyAgICAgICAgICAgIGMtPnN0YXR1c1tjaGFubmVsICAgIF0uc3RlcCAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYikgJiAweDFmOworICAgICAgICAgICAgYy0+c3RhdHVzW2NoYW5uZWwgKyAxXS5zdGVwICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKSAmIDB4MWY7CisgICAgICAgICAgICBjLT5zdGF0dXNbY2hhbm5lbCAgICBdLnByZWRpY3RvciA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9sZTE2dSgmZ2IpLCAxNik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDIpOworICAgICAgICAgICAgYy0+c3RhdHVzW2NoYW5uZWwgKyAxXS5wcmVkaWN0b3IgPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKSwgMTYpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCAyKTsKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBuYl9zYW1wbGVzOyBuKz0yKSB7CisgICAgICAgICAgICAgICAgaW50IHYgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVzX3BbY2hhbm5lbF1bbiAgICBdID0gYWRwY21fbXRhZl9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbY2hhbm5lbF0sIHYgJiAweDBGKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVzX3BbY2hhbm5lbF1bbiArIDFdID0gYWRwY21fbXRhZl9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbY2hhbm5lbF0sIHYgPj4gNCAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBuYl9zYW1wbGVzOyBuKz0yKSB7CisgICAgICAgICAgICAgICAgaW50IHYgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVzX3BbY2hhbm5lbCArIDFdW24gICAgXSA9IGFkcGNtX210YWZfZXhwYW5kX25pYmJsZSgmYy0+c3RhdHVzW2NoYW5uZWwgKyAxXSwgdiAmIDB4MEYpOworICAgICAgICAgICAgICAgIHNhbXBsZXNfcFtjaGFubmVsICsgMV1bbiArIDFdID0gYWRwY21fbXRhZl9leHBhbmRfbmliYmxlKCZjLT5zdGF0dXNbY2hhbm5lbCArIDFdLCB2ID4+IDQgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREs0OgogICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgYXZjdHgtPmNoYW5uZWxzOyBjaGFubmVsKyspIHsKICAgICAgICAgICAgIGNzID0gJmMtPnN0YXR1c1tjaGFubmVsXTsKQEAgLTk4NCw2ICsxMDM1LDE4IEBACiAgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21faW1hX2V4cGFuZF9uaWJibGUoJmMtPnN0YXR1c1tzdF0sIHYyLCAzKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9EQVQ0OgorICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgYXZjdHgtPmNoYW5uZWxzOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgIGNzID0gJmMtPnN0YXR1c1tjaGFubmVsXTsKKyAgICAgICAgICAgIHNhbXBsZXMgPSBzYW1wbGVzX3BbY2hhbm5lbF07CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbmJfc2FtcGxlczsgbiArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IHYgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21faW1hX2V4cGFuZF9uaWJibGUoY3MsIHYgPj4gNCAgLCAzKTsKKyAgICAgICAgICAgICAgICAqc2FtcGxlcysrID0gYWRwY21faW1hX2V4cGFuZF9uaWJibGUoY3MsIHYgJiAweDBGLCAzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9BUEM6CiAgICAgICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpID4gMCkgewogICAgICAgICAgICAgaW50IHYgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKQEAgLTEwNTIsNiArMTExNSw3IEBACiAgICAgICAgIGludDE2X3QgKm91dDEgPSBzYW1wbGVzX3BbMV07CiAgICAgICAgIGludCBzYW1wbGVzX3Blcl9ibG9jayA9IDI4ICogKDMgLSBhdmN0eC0+Y2hhbm5lbHMpICogNDsKICAgICAgICAgaW50IHNhbXBsZV9vZmZzZXQgPSAwOworICAgICAgICBpbnQgYnl0ZXNfcmVtYWluaW5nOwogICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+PSAxMjgpIHsKICAgICAgICAgICAgIGlmICgocmV0ID0geGFfZGVjb2RlKGF2Y3R4LCBvdXQwLCBvdXQxLCBidWYgKyBieXRlc3RyZWFtMl90ZWxsKCZnYiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYy0+c3RhdHVzWzBdLCAmYy0+c3RhdHVzWzFdLApAQCAtMTA2MCw2ICsxMTI0LDEyIEBACiAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDEyOCk7CiAgICAgICAgICAgICBzYW1wbGVfb2Zmc2V0ICs9IHNhbXBsZXNfcGVyX2Jsb2NrOwogICAgICAgICB9CisgICAgICAgIC8qIExlc3MgdGhhbiBhIGZ1bGwgYmxvY2sgb2YgZGF0YSBsZWZ0LCBlLmcuIHdoZW4gcmVhZGluZyBmcm9tCisgICAgICAgICAqIDIzMjQgYnl0ZSBwZXIgc2VjdG9yIFhBOyB0aGUgcmVtYWluZGVyIGlzIHBhZGRpbmcgKi8KKyAgICAgICAgYnl0ZXNfcmVtYWluaW5nID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKTsKKyAgICAgICAgaWYgKGJ5dGVzX3JlbWFpbmluZyA+IDApIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBieXRlc19yZW1haW5pbmcpOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9FQUNTOgpAQCAtMTI4Nyw4ICsxMzU3LDggQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQU1WOgogICAgICAgICBjLT5zdGF0dXNbMF0ucHJlZGljdG9yID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KCZnYiksIDE2KTsKLSAgICAgICAgYy0+c3RhdHVzWzBdLnN0ZXBfaW5kZXggPSBieXRlc3RyZWFtMl9nZXRfbGUxNnUoJmdiKTsKLSAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCA0KTsKKyAgICAgICAgYy0+c3RhdHVzWzBdLnN0ZXBfaW5kZXggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCA1KTsKICAgICAgICAgaWYgKGMtPnN0YXR1c1swXS5zdGVwX2luZGV4ID4gODh1KSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVSUk9SOiBzdGVwX2luZGV4ID0gJWlcbiIsCiAgICAgICAgICAgICAgICAgICAgYy0+c3RhdHVzWzBdLnN0ZXBfaW5kZXgpOwpAQCAtMTY3MCw2ICsxNzQwLDcgQEAKIEFEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fRUFfWEFTLCAgICAgIHNhbXBsZV9mbXRzX3MxNnAsIGFkcGNtX2VhX3hhcywgICAgICAiQURQQ00gRWxlY3Ryb25pYyBBcnRzIFhBUyIpOwogQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQU1WLCAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21faW1hX2FtdiwgICAgICJBRFBDTSBJTUEgQU1WIik7CiBBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0lNQV9BUEMsICAgICBzYW1wbGVfZm10c19zMTYsICBhZHBjbV9pbWFfYXBjLCAgICAgIkFEUENNIElNQSBDUllPIEFQQyIpOworQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREFUNCwgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21faW1hX2RhdDQsICAgICJBRFBDTSBJTUEgRXVyb2NvbSBEQVQ0Iik7CiBBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0lNQV9ESzMsICAgICBzYW1wbGVfZm10c19zMTYsICBhZHBjbV9pbWFfZGszLCAgICAgIkFEUENNIElNQSBEdWNrIERLMyIpOwogQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREs0LCAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21faW1hX2RrNCwgICAgICJBRFBDTSBJTUEgRHVjayBESzQiKTsKIEFEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fSU1BX0VBX0VBQ1MsIHNhbXBsZV9mbXRzX3MxNiwgIGFkcGNtX2ltYV9lYV9lYWNzLCAiQURQQ00gSU1BIEVsZWN0cm9uaWMgQXJ0cyBFQUNTIik7CkBAIC0xNjgyLDYgKzE3NTMsNyBAQAogQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWLCAgICAgc2FtcGxlX2ZtdHNfczE2cCwgYWRwY21faW1hX3dhdiwgICAgICJBRFBDTSBJTUEgV0FWIik7CiBBRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUywgICAgICBzYW1wbGVfZm10c19ib3RoLCBhZHBjbV9pbWFfd3MsICAgICAgIkFEUENNIElNQSBXZXN0d29vZCIpOwogQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9NUywgICAgICAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21fbXMsICAgICAgICAgICJBRFBDTSBNaWNyb3NvZnQiKTsKK0FEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfQURQQ01fTVRBRiwgICAgICAgIHNhbXBsZV9mbXRzX3MxNnAsIGFkcGNtX210YWYsICAgICAgICAiQURQQ00gTVRBRiIpOwogQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9QU1gsICAgICAgICAgc2FtcGxlX2ZtdHNfczE2cCwgYWRwY21fcHN4LCAgICAgICAgICJBRFBDTSBQbGF5c3RhdGlvbiIpOwogQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9TQlBST18yLCAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21fc2Jwcm9fMiwgICAgICJBRFBDTSBTb3VuZCBCbGFzdGVyIFBybyAyLWJpdCIpOwogQURQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9BRFBDTV9TQlBST18zLCAgICAgc2FtcGxlX2ZtdHNfczE2LCAgYWRwY21fc2Jwcm9fMywgICAgICJBRFBDTSBTb3VuZCBCbGFzdGVyIFBybyAyLjYtYml0Iik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FkcGNtLmggYi9saWJhdmNvZGVjL2FkcGNtLmgKaW5kZXggZmNiYjcwYi4uNTgwZGI3ZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hZHBjbS5oCisrKyBiL2xpYmF2Y29kZWMvYWRwY20uaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBGRm1wZWcgcHJvamVjdAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FkcGNtX2RhdGEuYyBiL2xpYmF2Y29kZWMvYWRwY21fZGF0YS5jCmluZGV4IDljMzgzNjAuLjRjY2UwYTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWRwY21fZGF0YS5jCisrKyBiL2xpYmF2Y29kZWMvYWRwY21fZGF0YS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTEwNiw3ICsxMDYsNzQgQEAKICAgICAtMSwgLTMsIC01LCAtNywgLTksIC0xMSwgLTEzLCAtMTUKIH07CiAKLWNvbnN0IGludDE2X3QgZmZfYWRwY21fYWZjX2NvZWZmc1syXVsxNl0gPSB7Citjb25zdCB1aW50MTZfdCBmZl9hZHBjbV9hZmNfY29lZmZzWzJdWzE2XSA9IHsKICAgICB7IDAsIDIwNDgsIDAsIDEwMjQsIDQwOTYsIDM1ODQsIDMwNzIsIDQ2MDgsIDQyMDAsIDQ4MDAsIDUxMjAsIDIwNDgsIDEwMjQsIDY0NTEyLCA2NDUxMiwgNjM0ODggfSwKICAgICB7IDAsIDAsIDIwNDgsIDEwMjQsIDYzNDg4LCA2NDAwMCwgNjQ1MTIsIDYyOTc2LCA2MzI4OCwgNjMyMzYsIDYyNDY0LCA2MzQ4OCwgNjQ1MTIsIDEwMjQsIDAsIDAgfQogfTsKKworY29uc3QgaW50MTZfdCBmZl9hZHBjbV9tdGFmX3N0ZXBzaXplWzMyXVsxNl0gPSB7CisgICAgeyAgICAgMSwgICAgIDUsICAgICA5LCAgICAxMywgICAgMTYsICAgIDIwLCAgICAyNCwgICAgMjgsCisgICAgICAgICAtMSwgICAgLTUsICAgIC05LCAgIC0xMywgICAtMTYsICAgLTIwLCAgIC0yNCwgICAtMjgsIH0sCisgICAgeyAgICAgMiwgICAgIDYsICAgIDExLCAgICAxNSwgICAgMjAsICAgIDI0LCAgICAyOSwgICAgMzMsCisgICAgICAgICAtMiwgICAgLTYsICAgLTExLCAgIC0xNSwgICAtMjAsICAgLTI0LCAgIC0yOSwgICAtMzMsIH0sCisgICAgeyAgICAgMiwgICAgIDcsICAgIDEzLCAgICAxOCwgICAgMjMsICAgIDI4LCAgICAzNCwgICAgMzksCisgICAgICAgICAtMiwgICAgLTcsICAgLTEzLCAgIC0xOCwgICAtMjMsICAgLTI4LCAgIC0zNCwgICAtMzksIH0sCisgICAgeyAgICAgMywgICAgIDksICAgIDE1LCAgICAyMSwgICAgMjgsICAgIDM0LCAgICA0MCwgICAgNDYsCisgICAgICAgICAtMywgICAgLTksICAgLTE1LCAgIC0yMSwgICAtMjgsICAgLTM0LCAgIC00MCwgICAtNDYsIH0sCisgICAgeyAgICAgMywgICAgMTEsICAgIDE4LCAgICAyNiwgICAgMzMsICAgIDQxLCAgICA0OCwgICAgNTYsCisgICAgICAgICAtMywgICAtMTEsICAgLTE4LCAgIC0yNiwgICAtMzMsICAgLTQxLCAgIC00OCwgICAtNTYsIH0sCisgICAgeyAgICAgNCwgICAgMTMsICAgIDIyLCAgICAzMSwgICAgNDAsICAgIDQ5LCAgICA1OCwgICAgNjcsCisgICAgICAgICAtNCwgICAtMTMsICAgLTIyLCAgIC0zMSwgICAtNDAsICAgLTQ5LCAgIC01OCwgICAtNjcsIH0sCisgICAgeyAgICAgNSwgICAgMTYsICAgIDI2LCAgICAzNywgICAgNDgsICAgIDU5LCAgICA2OSwgICAgODAsCisgICAgICAgICAtNSwgICAtMTYsICAgLTI2LCAgIC0zNywgICAtNDgsICAgLTU5LCAgIC02OSwgICAtODAsIH0sCisgICAgeyAgICAgNiwgICAgMTksICAgIDMxLCAgICA0NCwgICAgNTcsICAgIDcwLCAgICA4MiwgICAgOTUsCisgICAgICAgICAtNiwgICAtMTksICAgLTMxLCAgIC00NCwgICAtNTcsICAgLTcwLCAgIC04MiwgICAtOTUsIH0sCisgICAgeyAgICAgNywgICAgMjIsICAgIDM4LCAgICA1MywgICAgNjgsICAgIDgzLCAgICA5OSwgICAxMTQsCisgICAgICAgICAtNywgICAtMjIsICAgLTM4LCAgIC01MywgICAtNjgsICAgLTgzLCAgIC05OSwgIC0xMTQsIH0sCisgICAgeyAgICAgOSwgICAgMjcsICAgIDQ1LCAgICA2MywgICAgODEsICAgIDk5LCAgIDExNywgICAxMzUsCisgICAgICAgICAtOSwgICAtMjcsICAgLTQ1LCAgIC02MywgICAtODEsICAgLTk5LCAgLTExNywgIC0xMzUsIH0sCisgICAgeyAgICAxMCwgICAgMzIsICAgIDUzLCAgICA3NSwgICAgOTYsICAgMTE4LCAgIDEzOSwgICAxNjEsCisgICAgICAgIC0xMCwgICAtMzIsICAgLTUzLCAgIC03NSwgICAtOTYsICAtMTE4LCAgLTEzOSwgIC0xNjEsIH0sCisgICAgeyAgICAxMiwgICAgMzgsICAgIDY0LCAgICA5MCwgICAxMTUsICAgMTQxLCAgIDE2NywgICAxOTMsCisgICAgICAgIC0xMiwgICAtMzgsICAgLTY0LCAgIC05MCwgIC0xMTUsICAtMTQxLCAgLTE2NywgIC0xOTMsIH0sCisgICAgeyAgICAxNSwgICAgNDUsICAgIDc2LCAgIDEwNiwgICAxMzcsICAgMTY3LCAgIDE5OCwgICAyMjgsCisgICAgICAgIC0xNSwgICAtNDUsICAgLTc2LCAgLTEwNiwgIC0xMzcsICAtMTY3LCAgLTE5OCwgIC0yMjgsIH0sCisgICAgeyAgICAxOCwgICAgNTQsICAgIDkxLCAgIDEyNywgICAxNjQsICAgMjAwLCAgIDIzNywgICAyNzMsCisgICAgICAgIC0xOCwgICAtNTQsICAgLTkxLCAgLTEyNywgIC0xNjQsICAtMjAwLCAgLTIzNywgIC0yNzMsIH0sCisgICAgeyAgICAyMSwgICAgNjUsICAgMTA4LCAgIDE1MiwgICAxOTUsICAgMjM5LCAgIDI4MiwgICAzMjYsCisgICAgICAgIC0yMSwgICAtNjUsICAtMTA4LCAgLTE1MiwgIC0xOTUsICAtMjM5LCAgLTI4MiwgIC0zMjYsIH0sCisgICAgeyAgICAyNSwgICAgNzcsICAgMTI5LCAgIDE4MSwgICAyMzIsICAgMjg0LCAgIDMzNiwgICAzODgsCisgICAgICAgIC0yNSwgICAtNzcsICAtMTI5LCAgLTE4MSwgIC0yMzIsICAtMjg0LCAgLTMzNiwgIC0zODgsIH0sCisgICAgeyAgICAzMCwgICAgOTIsICAgMTUzLCAgIDIxNSwgICAyNzYsICAgMzM4LCAgIDM5OSwgICA0NjEsCisgICAgICAgIC0zMCwgICAtOTIsICAtMTUzLCAgLTIxNSwgIC0yNzYsICAtMzM4LCAgLTM5OSwgIC00NjEsIH0sCisgICAgeyAgICAzNiwgICAxMDksICAgMTgzLCAgIDI1NiwgICAzMjksICAgNDAyLCAgIDQ3NiwgICA1NDksCisgICAgICAgIC0zNiwgIC0xMDksICAtMTgzLCAgLTI1NiwgIC0zMjksICAtNDAyLCAgLTQ3NiwgIC01NDksIH0sCisgICAgeyAgICA0MywgICAxMzAsICAgMjE4LCAgIDMwNSwgICAzOTIsICAgNDc5LCAgIDU2NywgICA2NTQsCisgICAgICAgIC00MywgIC0xMzAsICAtMjE4LCAgLTMwNSwgIC0zOTIsICAtNDc5LCAgLTU2NywgIC02NTQsIH0sCisgICAgeyAgICA1MiwgICAxNTYsICAgMjYwLCAgIDM2NCwgICA0NjgsICAgNTcyLCAgIDY3NiwgICA3ODAsCisgICAgICAgIC01MiwgIC0xNTYsICAtMjYwLCAgLTM2NCwgIC00NjgsICAtNTcyLCAgLTY3NiwgIC03ODAsIH0sCisgICAgeyAgICA2MiwgICAxODYsICAgMzEwLCAgIDQzNCwgICA1NTgsICAgNjgyLCAgIDgwNiwgICA5MzAsCisgICAgICAgIC02MiwgIC0xODYsICAtMzEwLCAgLTQzNCwgIC01NTgsICAtNjgyLCAgLTgwNiwgIC05MzAsIH0sCisgICAgeyAgICA3MywgICAyMjEsICAgMzY4LCAgIDUxNiwgICA2NjMsICAgODExLCAgIDk1OCwgIDExMDYsCisgICAgICAgIC03MywgIC0yMjEsICAtMzY4LCAgLTUxNiwgIC02NjMsICAtODExLCAgLTk1OCwgLTExMDYsIH0sCisgICAgeyAgICA4NywgICAyNjMsICAgNDM5LCAgIDYxNSwgICA3OTAsICAgOTY2LCAgMTE0MiwgIDEzMTgsCisgICAgICAgIC04NywgIC0yNjMsICAtNDM5LCAgLTYxNSwgIC03OTAsICAtOTY2LCAtMTE0MiwgLTEzMTgsIH0sCisgICAgeyAgIDEwNCwgICAzMTQsICAgNTIzLCAgIDczMywgICA5NDIsICAxMTUyLCAgMTM2MSwgIDE1NzEsCisgICAgICAgLTEwNCwgIC0zMTQsICAtNTIzLCAgLTczMywgIC05NDIsIC0xMTUyLCAtMTM2MSwgLTE1NzEsIH0sCisgICAgeyAgIDEyNCwgICAzNzQsICAgNjIzLCAgIDg3MywgIDExMjIsICAxMzcyLCAgMTYyMSwgIDE4NzEsCisgICAgICAgLTEyNCwgIC0zNzQsICAtNjIzLCAgLTg3MywgLTExMjIsIC0xMzcyLCAtMTYyMSwgLTE4NzEsIH0sCisgICAgeyAgIDE0OCwgICA0NDUsICAgNzQzLCAgMTA0MCwgIDEzMzcsICAxNjM0LCAgMTkzMiwgIDIyMjksCisgICAgICAgLTE0OCwgIC00NDUsICAtNzQzLCAtMTA0MCwgLTEzMzcsIC0xNjM0LCAtMTkzMiwgLTIyMjksIH0sCisgICAgeyAgIDE3NywgICA1MzEsICAgODg1LCAgMTIzOSwgIDE1OTMsICAxOTQ3LCAgMjMwMSwgIDI2NTUsCisgICAgICAgLTE3NywgIC01MzEsICAtODg1LCAtMTIzOSwgLTE1OTMsIC0xOTQ3LCAtMjMwMSwgLTI2NTUsIH0sCisgICAgeyAgIDIxMCwgICA2MzIsICAxMDUzLCAgMTQ3NSwgIDE4OTYsICAyMzE4LCAgMjczOSwgIDMxNjEsCisgICAgICAgLTIxMCwgIC02MzIsIC0xMDUzLCAtMTQ3NSwgLTE4OTYsIC0yMzE4LCAtMjczOSwgLTMxNjEsIH0sCisgICAgeyAgIDI1MSwgICA3NTMsICAxMjU1LCAgMTc1NywgIDIyNjAsICAyNzYyLCAgMzI2NCwgIDM3NjYsCisgICAgICAgLTI1MSwgIC03NTMsIC0xMjU1LCAtMTc1NywgLTIyNjAsIC0yNzYyLCAtMzI2NCwgLTM3NjYsIH0sCisgICAgeyAgIDI5OSwgICA4OTcsICAxNDk1LCAgMjA5MywgIDI2OTIsICAzMjkwLCAgMzg4OCwgIDQ0ODYsCisgICAgICAgLTI5OSwgIC04OTcsIC0xNDk1LCAtMjA5MywgLTI2OTIsIC0zMjkwLCAtMzg4OCwgLTQ0ODYsIH0sCisgICAgeyAgIDM1NiwgIDEwNjgsICAxNzgxLCAgMjQ5MywgIDMyMDYsICAzOTE4LCAgNDYzMSwgIDUzNDMsCisgICAgICAgLTM1NiwgLTEwNjgsIC0xNzgxLCAtMjQ5MywgLTMyMDYsIC0zOTE4LCAtNDYzMSwgLTUzNDMsIH0sCisgICAgeyAgIDQyNCwgIDEyNzMsICAyMTIxLCAgMjk3MCwgIDM4MTksICA0NjY4LCAgNTUxNiwgIDYzNjUsCisgICAgICAgLTQyNCwgLTEyNzMsIC0yMTIxLCAtMjk3MCwgLTM4MTksIC00NjY4LCAtNTUxNiwgLTYzNjUsIH0sCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hZHBjbV9kYXRhLmggYi9saWJhdmNvZGVjL2FkcGNtX2RhdGEuaAppbmRleCBiMTc5ZDY1Li41YTY4NzEzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FkcGNtX2RhdGEuaAorKysgYi9saWJhdmNvZGVjL2FkcGNtX2RhdGEuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBGRm1wZWcgcHJvamVjdAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC00MSw1ICs0MSw2IEBACiBleHRlcm4gY29uc3QgaW50MTZfdCBmZl9hZHBjbV95YW1haGFfaW5kZXhzY2FsZVtdOwogZXh0ZXJuIGNvbnN0IGludDhfdCAgZmZfYWRwY21feWFtYWhhX2RpZmZsb29rdXBbXTsKIGV4dGVybiBjb25zdCBpbnQxNl90IGZmX2FkcGNtX2FmY19jb2VmZnNbMl1bMTZdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfYWRwY21fbXRhZl9zdGVwc2l6ZVszMl1bMTZdOwogCiAjZW5kaWYgLyogQVZDT0RFQ19BRFBDTV9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWRwY21lbmMuYyBiL2xpYmF2Y29kZWMvYWRwY21lbmMuYwppbmRleCA5Y2VlYTA5Li42Njg5MzljIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FkcGNtZW5jLmMKKysrIGIvbGliYXZjb2RlYy9hZHBjbWVuYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogZmlyc3QgdmVyc2lvbiBieSBGcmFuY29pcyBSZXZvbCAocmV2b2xAZnJlZS5mcikKICAqIGZyaW5nZSBBRFBDTSBjb2RlY3MgKGUuZy4sIERLMywgREs0LCBXZXN0d29vZCkKQEAgLTI1OCw3ICsyNTgsNyBAQAogICAgIGMtPnByZWRpY3RvciArPSAoKGMtPnN0ZXAgKiBmZl9hZHBjbV95YW1haGFfZGlmZmxvb2t1cFtuaWJibGVdKSAvIDgpOwogICAgIGMtPnByZWRpY3RvciA9IGF2X2NsaXBfaW50MTYoYy0+cHJlZGljdG9yKTsKICAgICBjLT5zdGVwID0gKGMtPnN0ZXAgKiBmZl9hZHBjbV95YW1haGFfaW5kZXhzY2FsZVtuaWJibGVdKSA+PiA4OwotICAgIGMtPnN0ZXAgPSBhdl9jbGlwKGMtPnN0ZXAsIDEyNywgMjQ1NjcpOworICAgIGMtPnN0ZXAgPSBhdl9jbGlwKGMtPnN0ZXAsIDEyNywgMjQ1NzYpOwogCiAgICAgcmV0dXJuIG5pYmJsZTsKIH0KQEAgLTQxNSw3ICs0MTUsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsgLy9BVl9DT0RFQ19JRF9BRFBDTV9ZQU1BSEEKICAgICAgICAgICAgICAgICBMT09QX05PREVTKHlhbWFoYSwgc3RlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NsaXAoKHN0ZXAgKiBmZl9hZHBjbV95YW1haGFfaW5kZXhzY2FsZVtuaWJibGVdKSA+PiA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjcsIDI0NTY3KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNywgMjQ1NzYpKTsKICN1bmRlZiBMT09QX05PREVTCiAjdW5kZWYgU1RPUkVfTk9ERQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hZHRzX2hlYWRlci5jIGIvbGliYXZjb2RlYy9hZHRzX2hlYWRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ODk4MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FkdHNfaGVhZGVyLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIEF1ZGlvIGFuZCBWaWRlbyBmcmFtZSBleHRyYWN0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgorICogQ29weXJpZ2h0IChjKSAyMDA5IEFsZXggQ29udmVyc2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImFhY19hYzNfcGFyc2VyLmgiCisjaW5jbHVkZSAiYWR0c19oZWFkZXIuaCIKKyNpbmNsdWRlICJhZHRzX3BhcnNlci5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAibXBlZzRhdWRpby5oIgorCitpbnQgZmZfYWR0c19oZWFkZXJfcGFyc2UoR2V0Qml0Q29udGV4dCAqZ2JjLCBBQUNBRFRTSGVhZGVySW5mbyAqaGRyKQoreworICAgIGludCBzaXplLCByZGIsIGNoLCBzcjsKKyAgICBpbnQgYW90LCBjcmNfYWJzOworCisgICAgaWYgKGdldF9iaXRzKGdiYywgMTIpICE9IDB4ZmZmKQorICAgICAgICByZXR1cm4gQUFDX0FDM19QQVJTRV9FUlJPUl9TWU5DOworCisgICAgc2tpcF9iaXRzMShnYmMpOyAgICAgICAgICAgICAvKiBpZCAqLworICAgIHNraXBfYml0cyhnYmMsIDIpOyAgICAgICAgICAgLyogbGF5ZXIgKi8KKyAgICBjcmNfYWJzID0gZ2V0X2JpdHMxKGdiYyk7ICAgIC8qIHByb3RlY3Rpb25fYWJzZW50ICovCisgICAgYW90ICAgICA9IGdldF9iaXRzKGdiYywgMik7ICAvKiBwcm9maWxlX29iamVjdHR5cGUgKi8KKyAgICBzciAgICAgID0gZ2V0X2JpdHMoZ2JjLCA0KTsgIC8qIHNhbXBsZV9mcmVxdWVuY3lfaW5kZXggKi8KKyAgICBpZiAoIWF2cHJpdl9tcGVnNGF1ZGlvX3NhbXBsZV9yYXRlc1tzcl0pCisgICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX1NBTVBMRV9SQVRFOworICAgIHNraXBfYml0czEoZ2JjKTsgICAgICAgICAgICAgLyogcHJpdmF0ZV9iaXQgKi8KKyAgICBjaCA9IGdldF9iaXRzKGdiYywgMyk7ICAgICAgIC8qIGNoYW5uZWxfY29uZmlndXJhdGlvbiAqLworCisgICAgc2tpcF9iaXRzMShnYmMpOyAgICAgICAgICAgICAvKiBvcmlnaW5hbC9jb3B5ICovCisgICAgc2tpcF9iaXRzMShnYmMpOyAgICAgICAgICAgICAvKiBob21lICovCisKKyAgICAvKiBhZHRzX3ZhcmlhYmxlX2hlYWRlciAqLworICAgIHNraXBfYml0czEoZ2JjKTsgICAgICAgICAgICAgLyogY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX2JpdCAqLworICAgIHNraXBfYml0czEoZ2JjKTsgICAgICAgICAgICAgLyogY29weXJpZ2h0X2lkZW50aWZpY2F0aW9uX3N0YXJ0ICovCisgICAgc2l6ZSA9IGdldF9iaXRzKGdiYywgMTMpOyAgICAvKiBhYWNfZnJhbWVfbGVuZ3RoICovCisgICAgaWYgKHNpemUgPCBBVl9BQUNfQURUU19IRUFERVJfU0laRSkKKyAgICAgICAgcmV0dXJuIEFBQ19BQzNfUEFSU0VfRVJST1JfRlJBTUVfU0laRTsKKworICAgIHNraXBfYml0cyhnYmMsIDExKTsgICAgICAgICAgLyogYWR0c19idWZmZXJfZnVsbG5lc3MgKi8KKyAgICByZGIgPSBnZXRfYml0cyhnYmMsIDIpOyAgICAgIC8qIG51bWJlcl9vZl9yYXdfZGF0YV9ibG9ja3NfaW5fZnJhbWUgKi8KKworICAgIGhkci0+b2JqZWN0X3R5cGUgICAgPSBhb3QgKyAxOworICAgIGhkci0+Y2hhbl9jb25maWcgICAgPSBjaDsKKyAgICBoZHItPmNyY19hYnNlbnQgICAgID0gY3JjX2FiczsKKyAgICBoZHItPm51bV9hYWNfZnJhbWVzID0gcmRiICsgMTsKKyAgICBoZHItPnNhbXBsaW5nX2luZGV4ID0gc3I7CisgICAgaGRyLT5zYW1wbGVfcmF0ZSAgICA9IGF2cHJpdl9tcGVnNGF1ZGlvX3NhbXBsZV9yYXRlc1tzcl07CisgICAgaGRyLT5zYW1wbGVzICAgICAgICA9IChyZGIgKyAxKSAqIDEwMjQ7CisgICAgaGRyLT5iaXRfcmF0ZSAgICAgICA9IHNpemUgKiA4ICogaGRyLT5zYW1wbGVfcmF0ZSAvIGhkci0+c2FtcGxlczsKKworICAgIHJldHVybiBzaXplOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hZHRzX2hlYWRlci5oIGIvbGliYXZjb2RlYy9hZHRzX2hlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTVmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FkdHNfaGVhZGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIEFBQyBBRFRTIGhlYWRlciBkZWNvZGluZyBwcm90b3R5cGVzIGFuZCBzdHJ1Y3R1cmVzCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQURUU19IRUFERVJfSAorI2RlZmluZSBBVkNPREVDX0FEVFNfSEVBREVSX0gKKworI2luY2x1ZGUgImdldF9iaXRzLmgiCisKK3R5cGVkZWYgc3RydWN0IEFBQ0FEVFNIZWFkZXJJbmZvIHsKKyAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZTsKKyAgICB1aW50MzJfdCBzYW1wbGVzOworICAgIHVpbnQzMl90IGJpdF9yYXRlOworICAgIHVpbnQ4X3QgIGNyY19hYnNlbnQ7CisgICAgdWludDhfdCAgb2JqZWN0X3R5cGU7CisgICAgdWludDhfdCAgc2FtcGxpbmdfaW5kZXg7CisgICAgdWludDhfdCAgY2hhbl9jb25maWc7CisgICAgdWludDhfdCAgbnVtX2FhY19mcmFtZXM7Cit9IEFBQ0FEVFNIZWFkZXJJbmZvOworCisvKioKKyAqIFBhcnNlIHRoZSBBRFRTIGZyYW1lIGhlYWRlciB0byB0aGUgZW5kIG9mIHRoZSB2YXJpYWJsZSBoZWFkZXIsIHdoaWNoIGlzCisgKiB0aGUgZmlyc3QgNTQgYml0cy4KKyAqIEBwYXJhbVtpbl0gIGdiYyBCaXRDb250ZXh0IGNvbnRhaW5pbmcgdGhlIGZpcnN0IDU0IGJpdHMgb2YgdGhlIGZyYW1lLgorICogQHBhcmFtW291dF0gaGRyIFBvaW50ZXIgdG8gc3RydWN0IHdoZXJlIGhlYWRlciBpbmZvIGlzIHdyaXR0ZW4uCisgKiBAcmV0dXJuIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBpZiB0aGVyZSBpcyBhIHN5bmMgd29yZCBtaXNtYXRjaCwKKyAqIC0yIGlmIHRoZSB2ZXJzaW9uIGVsZW1lbnQgaXMgaW52YWxpZCwgLTMgaWYgdGhlIHNhbXBsZSByYXRlCisgKiBlbGVtZW50IGlzIGludmFsaWQsIG9yIC00IGlmIHRoZSBiaXQgcmF0ZSBlbGVtZW50IGlzIGludmFsaWQuCisgKi8KK2ludCBmZl9hZHRzX2hlYWRlcl9wYXJzZShHZXRCaXRDb250ZXh0ICpnYmMsIEFBQ0FEVFNIZWFkZXJJbmZvICpoZHIpOworCisjZW5kaWYgLyogQVZDT0RFQ19BRFRTX0hFQURFUl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FkdHNfcGFyc2VyLmMgYi9saWJhdmNvZGVjL2FkdHNfcGFyc2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5ZjhmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYWR0c19wYXJzZXIuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiYWR0c19oZWFkZXIuaCIKKyNpbmNsdWRlICJhZHRzX3BhcnNlci5oIgorCitpbnQgYXZfYWR0c19oZWFkZXJfcGFyc2UoY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCAqc2FtcGxlcywgdWludDhfdCAqZnJhbWVzKQoreworI2lmIENPTkZJR19BRFRTX0hFQURFUgorICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgQUFDQURUU0hlYWRlckluZm8gaGRyOworICAgIGludCBlcnIgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZiwgQVZfQUFDX0FEVFNfSEVBREVSX1NJWkUpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGVyciA9IGZmX2FkdHNfaGVhZGVyX3BhcnNlKCZnYiwgJmhkcik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisgICAgKnNhbXBsZXMgPSBoZHIuc2FtcGxlczsKKyAgICAqZnJhbWVzICA9IGhkci5udW1fYWFjX2ZyYW1lczsKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hZHRzX3BhcnNlci5oIGIvbGliYXZjb2RlYy9hZHRzX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWJlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FkdHNfcGFyc2VyLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQURUU19QQVJTRVJfSAorI2RlZmluZSBBVkNPREVDX0FEVFNfUEFSU0VSX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjZGVmaW5lIEFWX0FBQ19BRFRTX0hFQURFUl9TSVpFIDcKKworLyoqCisgKiBFeHRyYWN0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgZnJhbWVzIGZyb20gQUFDIGRhdGEuCisgKiBAcGFyYW1baW5dICBidWYgICAgIHBvaW50ZXIgdG8gQUFDIGRhdGEgYnVmZmVyCisgKiBAcGFyYW1bb3V0XSBzYW1wbGVzIFBvaW50ZXIgdG8gd2hlcmUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgd3JpdHRlbgorICogQHBhcmFtW291dF0gZnJhbWVzICBQb2ludGVyIHRvIHdoZXJlIG51bWJlciBvZiBmcmFtZXMgaXMgd3JpdHRlbgorICogQHJldHVybiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgYXZfYWR0c19oZWFkZXJfcGFyc2UoY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCAqc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpmcmFtZXMpOworCisjZW5kaWYgLyogQVZDT0RFQ19BRFRTX1BBUlNFUl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FkeGRlYy5jIGIvbGliYXZjb2RlYy9hZHhkZWMuYwppbmRleCAzMmNjMGYwLi4xNzhlYTk5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FkeGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvYWR4ZGVjLmMKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBzMiA9IHByZXYtPnMyOwogICAgIGZvciAoaSA9IDA7IGkgPCBCTE9DS19TQU1QTEVTOyBpKyspIHsKICAgICAgICAgZCAgPSBnZXRfc2JpdHMoJmdiLCA0KTsKLSAgICAgICAgczAgPSAoKGQgPDwgQ09FRkZfQklUUykgKiBzY2FsZSArIGMtPmNvZWZmWzBdICogczEgKyBjLT5jb2VmZlsxXSAqIHMyKSA+PiBDT0VGRl9CSVRTOworICAgICAgICBzMCA9ICgoZCAqICgxIDw8IENPRUZGX0JJVFMpKSAqIHNjYWxlICsgYy0+Y29lZmZbMF0gKiBzMSArIGMtPmNvZWZmWzFdICogczIpID4+IENPRUZGX0JJVFM7CiAgICAgICAgIHMyID0gczE7CiAgICAgICAgIHMxID0gYXZfY2xpcF9pbnQxNihzMCk7CiAgICAgICAgICpvdXQrKyA9IHMxOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9haWMuYyBiL2xpYmF2Y29kZWMvYWljLmMKaW5kZXggNWRlY2M3OC4uZGMyOGM4MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9haWMuYworKysgYi9saWJhdmNvZGVjL2FpYy5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJnb2xvbWIuaCIKICNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAidW5hcnkuaCIKIAogI2RlZmluZSBBSUNfSERSX1NJWkUgICAgMjQKQEAgLTIwNyw2ICsyMDgsOSBAQAogICAgIGludCBtYiwgaWR4OwogICAgIHVuc2lnbmVkIHZhbDsKIAorICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgaGFzX3NraXBzICA9IGdldF9iaXRzMShnYik7CiAgICAgY29lZmZfdHlwZSA9IGdldF9iaXRzMShnYik7CiAgICAgY29lZmZfYml0cyA9IGdldF9iaXRzKGdiLCAzKTsKQEAgLTMwNyw2ICszMTEsOCBAQAogICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgaW50IHJldCwgaSwgbWIsIGJsazsKICAgICBpbnQgc2xpY2Vfd2lkdGggPSBGRk1JTihjdHgtPnNsaWNlX3dpZHRoLCBjdHgtPm1iX3dpZHRoIC0gbWJfeCk7CisgICAgaW50IGxhc3Rfcm93ID0gbWJfeSAmJiBtYl95ID09IGN0eC0+bWJfaGVpZ2h0IC0gMTsKKyAgICBpbnQgeV9wb3MsIGNfcG9zOwogICAgIHVpbnQ4X3QgKlksICpDWzJdOwogICAgIHVpbnQ4X3QgKmRzdDsKICAgICBpbnQxNl90ICpiYXNlX3kgPSBjdHgtPmRhdGFfcHRyW0NPRUZGX0xVTUFdOwpAQCAtMzE1LDEwICszMjEsMTggQEAKICAgICBpbnQxNl90ICpleHRfYyAgPSBjdHgtPmRhdGFfcHRyW0NPRUZGX0NIUk9NQV9FWFRdOwogICAgIGNvbnN0IGludCB5c3RyaWRlID0gY3R4LT5mcmFtZS0+bGluZXNpemVbMF07CiAKLSAgICBZID0gY3R4LT5mcmFtZS0+ZGF0YVswXSArIG1iX3ggKiAxNiArIG1iX3kgKiAxNiAqIHlzdHJpZGU7CisgICAgaWYgKGxhc3Rfcm93KSB7CisgICAgICAgIHlfcG9zID0gKGN0eC0+YXZjdHgtPmhlaWdodCAtIDE2KTsKKyAgICAgICAgY19wb3MgPSAoKGN0eC0+YXZjdHgtPmhlaWdodCsxKS8yIC0gOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeV9wb3MgPSBtYl95ICogMTY7CisgICAgICAgIGNfcG9zID0gbWJfeSAqIDg7CisgICAgfQorCisgICAgWSA9IGN0eC0+ZnJhbWUtPmRhdGFbMF0gKyBtYl94ICogMTYgKyB5X3BvcyAqIHlzdHJpZGU7CiAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKICAgICAgICAgQ1tpXSA9IGN0eC0+ZnJhbWUtPmRhdGFbaSArIDFdICsgbWJfeCAqIDgKLSAgICAgICAgICAgICAgICsgbWJfeSAqIDggKiBjdHgtPmZyYW1lLT5saW5lc2l6ZVtpICsgMV07CisgICAgICAgICAgICAgICArIGNfcG9zICogY3R4LT5mcmFtZS0+bGluZXNpemVbaSArIDFdOwogICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzcmMsIHNyY19zaXplICogOCk7CiAKICAgICBtZW1zZXQoY3R4LT5zbGljZV9kYXRhLCAwLApAQCAtMzc1LDYgKzM4OSw3IEBACiAgICAgdWludDMyX3Qgb2ZmOwogICAgIGludCB4LCB5LCByZXQ7CiAgICAgaW50IHNsaWNlX3NpemU7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OwogCiAgICAgY3R4LT5mcmFtZSAgICAgICAgICAgID0gZGF0YTsKICAgICBjdHgtPmZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKQEAgLTM5Myw3ICs0MDgsNyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgY3R4LT5mcmFtZSwgMCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZnJhbWUsIDApKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmICsgQUlDX0hEUl9TSVpFLApAQCAtNDQ3LDcgKzQ2Miw3IEBACiAKICAgICBjdHgtPm51bV94X3NsaWNlcyA9IChjdHgtPm1iX3dpZHRoICsgMTUpID4+IDQ7CiAgICAgY3R4LT5zbGljZV93aWR0aCAgPSAxNjsKLSAgICBmb3IgKGkgPSAxOyBpIDwgMzI7IGkrKykgeworICAgIGZvciAoaSA9IDE7IGkgPCBjdHgtPm1iX3dpZHRoOyBpKyspIHsKICAgICAgICAgaWYgKCEoY3R4LT5tYl93aWR0aCAlIGkpICYmIChjdHgtPm1iX3dpZHRoIC8gaSA8PSAzMikpIHsKICAgICAgICAgICAgIGN0eC0+c2xpY2Vfd2lkdGggID0gY3R4LT5tYl93aWR0aCAvIGk7CiAgICAgICAgICAgICBjdHgtPm51bV94X3NsaWNlcyA9IGk7CkBAIC00ODgsNSArNTAzLDcgQEAKICAgICAuaW5pdCAgICAgICAgICAgPSBhaWNfZGVjb2RlX2luaXQsCiAgICAgLmNsb3NlICAgICAgICAgID0gYWljX2RlY29kZV9jbG9zZSwKICAgICAuZGVjb2RlICAgICAgICAgPSBhaWNfZGVjb2RlX2ZyYW1lLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoYWljX2RlY29kZV9pbml0KSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWxhYy5jIGIvbGliYXZjb2RlYy9hbGFjLmMKaW5kZXggZmM4YmM5Ni4uOTNjZjE5OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hbGFjLmMKKysrIGIvbGliYXZjb2RlYy9hbGFjLmMKQEAgLTI5LDIwICsyOSwyMCBAQAogICogcGFzc2VkIHRocm91Z2ggdGhlIGV4dHJhZGF0YVtfc2l6ZV0gZmllbGRzLiBUaGlzIGF0b20gaXMgdGFja2VkIG9udG8KICAqIHRoZSBlbmQgb2YgYW4gJ2FsYWMnIHN0c2QgYXRvbSBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgogICoKLSAqIDMyYml0ICBhdG9tIHNpemUKLSAqIDMyYml0ICB0YWcgICAgICAgICAgICAgICAgICAoImFsYWMiKQotICogMzJiaXQgIHRhZyB2ZXJzaW9uICAgICAgICAgICgwKQotICogMzJiaXQgIHNhbXBsZXMgcGVyIGZyYW1lICAgICh1c2VkIHdoZW4gbm90IHNldCBleHBsaWNpdGx5IGluIHRoZSBmcmFtZXMpCi0gKiAgOGJpdCAgY29tcGF0aWJsZSB2ZXJzaW9uICAgKDApCi0gKiAgOGJpdCAgc2FtcGxlIHNpemUKLSAqICA4Yml0ICBoaXN0b3J5IG11bHQgICAgICAgICAoNDApCi0gKiAgOGJpdCAgaW5pdGlhbCBoaXN0b3J5ICAgICAgKDEwKQotICogIDhiaXQgIHJpY2UgcGFyYW0gbGltaXQgICAgICgxNCkKLSAqICA4Yml0ICBjaGFubmVscwotICogMTZiaXQgIG1heFJ1biAgICAgICAgICAgICAgICgyNTUpCi0gKiAzMmJpdCAgbWF4IGNvZGVkIGZyYW1lIHNpemUgKDAgbWVhbnMgdW5rbm93bikKLSAqIDMyYml0ICBhdmVyYWdlIGJpdHJhdGUgICAgICAoMCBtZWFucyB1bmtub3duKQotICogMzJiaXQgIHNhbXBsZXJhdGUKKyAqIDMyIGJpdHMgIGF0b20gc2l6ZQorICogMzIgYml0cyAgdGFnICAgICAgICAgICAgICAgICAgKCJhbGFjIikKKyAqIDMyIGJpdHMgIHRhZyB2ZXJzaW9uICAgICAgICAgICgwKQorICogMzIgYml0cyAgc2FtcGxlcyBwZXIgZnJhbWUgICAgKHVzZWQgd2hlbiBub3Qgc2V0IGV4cGxpY2l0bHkgaW4gdGhlIGZyYW1lcykKKyAqICA4IGJpdHMgIGNvbXBhdGlibGUgdmVyc2lvbiAgICgwKQorICogIDggYml0cyAgc2FtcGxlIHNpemUKKyAqICA4IGJpdHMgIGhpc3RvcnkgbXVsdCAgICAgICAgICg0MCkKKyAqICA4IGJpdHMgIGluaXRpYWwgaGlzdG9yeSAgICAgICgxMCkKKyAqICA4IGJpdHMgIHJpY2UgcGFyYW0gbGltaXQgICAgICgxNCkKKyAqICA4IGJpdHMgIGNoYW5uZWxzCisgKiAxNiBiaXRzICBtYXhSdW4gICAgICAgICAgICAgICAoMjU1KQorICogMzIgYml0cyAgbWF4IGNvZGVkIGZyYW1lIHNpemUgKDAgbWVhbnMgdW5rbm93bikKKyAqIDMyIGJpdHMgIGF2ZXJhZ2UgYml0cmF0ZSAgICAgICgwIG1lYW5zIHVua25vd24pCisgKiAzMiBiaXRzICBzYW1wbGVyYXRlCiAgKi8KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC03Niw2ICs3Niw3IEBACiAgICAgdWludDhfdCAgcmljZV9oaXN0b3J5X211bHQ7CiAgICAgdWludDhfdCAgcmljZV9pbml0aWFsX2hpc3Rvcnk7CiAgICAgdWludDhfdCAgcmljZV9saW1pdDsKKyAgICBpbnQgICAgICBzYW1wbGVfcmF0ZTsKIAogICAgIGludCBleHRyYV9iaXRzOyAgICAgLyoqPCBudW1iZXIgb2YgZXh0cmEgYml0cyBiZXlvbmQgMTYtYml0ICovCiAgICAgaW50IG5iX3NhbXBsZXM7ICAgICAvKio8IG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBjdXJyZW50IGZyYW1lICovCkBAIC0yNTAsNyArMjUxLDcgQEAKICAgICBhbGFjLT5leHRyYV9iaXRzID0gZ2V0X2JpdHMoJmFsYWMtPmdiLCAyKSA8PCAzOwogICAgIGJwcyA9IGFsYWMtPnNhbXBsZV9zaXplIC0gYWxhYy0+ZXh0cmFfYml0cyArIGNoYW5uZWxzIC0gMTsKICAgICBpZiAoYnBzID4gMzJVKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYnBzIGlzIHVuc3VwcG9ydGVkOiAlZFxuIiwgYnBzKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJicHMgJWQiLCBicHMpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCkBAIC0zOTEsNiArMzkyLDEyIEBACiAgICAgICAgICAgICAgICAgKm91dGJ1ZmZlcisrID0gYWxhYy0+b3V0cHV0X3NhbXBsZXNfYnVmZmVyW2NoXVtpXTsKICAgICAgICAgfX0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyMDogeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsYWMtPm5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgICAgICAgICBhbGFjLT5vdXRwdXRfc2FtcGxlc19idWZmZXJbY2hdW2ldIDw8PSAxMjsKKyAgICAgICAgfX0KKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyNDogewogICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFsYWMtPm5iX3NhbXBsZXM7IGkrKykKQEAgLTQyNCw3ICs0MzEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGVsZW1lbnQgPiBUWVBFX0NQRSAmJiBlbGVtZW50ICE9IFRZUEVfTEZFKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInN5bnRheCBlbGVtZW50IHVuc3VwcG9ydGVkOiAlZFxuIiwgZWxlbWVudCk7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIlN5bnRheCBlbGVtZW50ICVkIiwgZWxlbWVudCk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgIH0KIApAQCAtNDUzLDcgKzQ2MCw3IEBACiAgICAgICAgICAgICAgICBhdnBrdC0+c2l6ZSAqIDggLSBnZXRfYml0c19jb3VudCgmYWxhYy0+Z2IpKTsKICAgICB9CiAKLSAgICBpZiAoYWxhYy0+Y2hhbm5lbHMgPT0gY2gpCisgICAgaWYgKGFsYWMtPmNoYW5uZWxzID09IGNoICYmIGFsYWMtPm5iX3NhbXBsZXMpCiAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMTsKICAgICBlbHNlCiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gZGVjb2RlIGFsbCBjaGFubmVsc1xuIik7CkBAIC01MTcsNyArNTI0LDcgQEAKIAogICAgIGFsYWMtPm1heF9zYW1wbGVzX3Blcl9mcmFtZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOwogICAgIGlmICghYWxhYy0+bWF4X3NhbXBsZXNfcGVyX2ZyYW1lIHx8Ci0gICAgICAgIGFsYWMtPm1heF9zYW1wbGVzX3Blcl9mcmFtZSA+IElOVF9NQVggLyBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgYWxhYy0+bWF4X3NhbXBsZXNfcGVyX2ZyYW1lID4gNDA5NiAqIDQwOTYpIHsKICAgICAgICAgYXZfbG9nKGFsYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAibWF4IHNhbXBsZXMgcGVyIGZyYW1lIGludmFsaWQ6ICUiUFJJdTMyIlxuIiwKICAgICAgICAgICAgICAgIGFsYWMtPm1heF9zYW1wbGVzX3Blcl9mcmFtZSk7CkBAIC01MzIsNyArNTM5LDcgQEAKICAgICBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJmdiKTsgLy8gbWF4UnVuCiAgICAgYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7IC8vIG1heCBjb2RlZCBmcmFtZSBzaXplCiAgICAgYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7IC8vIGF2ZXJhZ2UgYml0cmF0ZQotICAgIGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOyAvLyBzYW1wbGVyYXRlCisgICAgYWxhYy0+c2FtcGxlX3JhdGUgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNTU2LDYgKzU2Myw3IEBACiAgICAgc3dpdGNoIChhbGFjLT5zYW1wbGVfc2l6ZSkgewogICAgIGNhc2UgMTY6IGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOwogICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6CiAgICAgY2FzZSAyNDoKICAgICBjYXNlIDMyOiBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyUDsKICAgICAgICAgICAgICBicmVhazsKQEAgLTU2Myw2ICs1NzEsNyBAQAogICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBhbGFjLT5zYW1wbGVfc2l6ZTsKKyAgICBhdmN0eC0+c2FtcGxlX3JhdGUgICAgICAgICA9IGFsYWMtPnNhbXBsZV9yYXRlOwogCiAgICAgaWYgKGFsYWMtPmNoYW5uZWxzIDwgMSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBjaGFubmVsIGNvdW50XG4iKTsKQEAgLTU3NCw4ICs1ODMsOCBAQAogICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzID0gYWxhYy0+Y2hhbm5lbHM7CiAgICAgfQogICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiBBTEFDX01BWF9DSEFOTkVMUyB8fCBhdmN0eC0+Y2hhbm5lbHMgPD0gMCApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjaGFubmVsIGNvdW50OiAlZFxuIiwKLSAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiQ2hhbm5lbCBjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gZmZfYWxhY19jaGFubmVsX2xheW91dHNbYWxhYy0+Y2hhbm5lbHMgLSAxXTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWxhY2VuYy5jIGIvbGliYXZjb2RlYy9hbGFjZW5jLmMKaW5kZXggYzgwYzg4Ny4uODA0Y2M3YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hbGFjZW5jLmMKKysrIGIvbGliYXZjb2RlYy9hbGFjZW5jLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNkZWZpbmUgREVGQVVMVF9NQVhfUFJFRF9PUkRFUiAgICA2CiAjZGVmaW5lIERFRkFVTFRfTUlOX1BSRURfT1JERVIgICAgNAogI2RlZmluZSBBTEFDX01BWF9MUENfUFJFQ0lTSU9OICAgIDkKKyNkZWZpbmUgQUxBQ19NSU5fTFBDX1NISUZUICAgICAgICAwCiAjZGVmaW5lIEFMQUNfTUFYX0xQQ19TSElGVCAgICAgICAgOQogCiAjZGVmaW5lIEFMQUNfQ0hNT0RFX0xFRlRfUklHSFQgICAgMApAQCAtODEsNyArODIsNyBAQAogCiAKIHN0YXRpYyB2b2lkIGluaXRfc2FtcGxlX2J1ZmZlcnMoQWxhY0VuY29kZUNvbnRleHQgKnMsIGludCBjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb25zdCAqc2FtcGxlc1syXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc2FtcGxlc1syXSkKIHsKICAgICBpbnQgY2gsIGk7CiAgICAgaW50IHNoaWZ0ID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUocy0+YXZjdHgtPnNhbXBsZV9mbXQpICogOCAtCkBAIC0xNzEsNyArMTcyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4X3ByZWRpY3Rpb25fb3JkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMQUNfTUFYX0xQQ19QUkVDSVNJT04sIGNvZWZzLCBzaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfTFBDX1RZUEVfTEVWSU5TT04sIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SREVSX01FVEhPRF9FU1QsIEFMQUNfTUFYX0xQQ19TSElGVCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9SREVSX01FVEhPRF9FU1QsIEFMQUNfTUlOX0xQQ19TSElGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxBQ19NQVhfTFBDX1NISUZULCAxKTsKIAogICAgICAgICBzLT5scGNbY2hdLmxwY19vcmRlciA9IG9wdF9vcmRlcjsKICAgICAgICAgcy0+bHBjW2NoXS5scGNfcXVhbnQgPSBzaGlmdFtvcHRfb3JkZXItMV07CkBAIC0zNjQsNyArMzY2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBbGFjUmF3RGF0YUJsb2NrVHlwZSBlbGVtZW50LCBpbnQgaW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNhbXBsZXMwLCBjb25zdCB1aW50OF90ICpzYW1wbGVzMSkKIHsKLSAgICB1aW50OF90IGNvbnN0ICpzYW1wbGVzWzJdID0geyBzYW1wbGVzMCwgc2FtcGxlczEgfTsKKyAgICBjb25zdCB1aW50OF90ICpzYW1wbGVzWzJdID0geyBzYW1wbGVzMCwgc2FtcGxlczEgfTsKICAgICBpbnQgaSwgaiwgY2hhbm5lbHM7CiAgICAgaW50IHByZWRpY3Rpb25fdHlwZSA9IDA7CiAgICAgUHV0Qml0Q29udGV4dCAqcGIgPSAmcy0+cGJjdHg7CkBAIC0zNzYsMTQgKzM3OCwxNCBAQAogICAgICAgICAvKiBzYW1wbGVzIGFyZSBjaGFubmVsLWludGVybGVhdmVkIGluIHZlcmJhdGltIG1vZGUgKi8KICAgICAgICAgaWYgKHMtPmF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCkgewogICAgICAgICAgICAgaW50IHNoaWZ0ID0gMzIgLSBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZTsKLSAgICAgICAgICAgIGludDMyX3QgY29uc3QgKnNhbXBsZXNfczMyWzJdID0geyAoY29uc3QgaW50MzJfdCAqKXNhbXBsZXMwLAorICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqc2FtcGxlc19zMzJbMl0gPSB7IChjb25zdCBpbnQzMl90ICopc2FtcGxlczAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDMyX3QgKilzYW1wbGVzMSB9OwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmZyYW1lX3NpemU7IGkrKykKICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykKICAgICAgICAgICAgICAgICAgICAgcHV0X3NiaXRzKHBiLCBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfczMyW2pdW2ldID4+IHNoaWZ0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDE2X3QgY29uc3QgKnNhbXBsZXNfczE2WzJdID0geyAoY29uc3QgaW50MTZfdCAqKXNhbXBsZXMwLAorICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqc2FtcGxlc19zMTZbMl0gPSB7IChjb25zdCBpbnQxNl90ICopc2FtcGxlczAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKilzYW1wbGVzMSB9OwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmZyYW1lX3NpemU7IGkrKykKICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykKQEAgLTYyMyw3ICs2MjUsNyBAQAogICAgIGVsc2UKICAgICAgICAgbWF4X2ZyYW1lX3NpemUgPSBzLT5tYXhfY29kZWRfZnJhbWVfc2l6ZTsKIAotICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIDIgKiBtYXhfZnJhbWVfc2l6ZSwgMCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCA0ICogbWF4X2ZyYW1lX3NpemUsIDApKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAvKiB1c2UgdmVyYmF0aW0gbW9kZSBmb3IgY29tcHJlc3Npb25fbGV2ZWwgMCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hbGxjb2RlY3MuYyBiL2xpYmF2Y29kZWMvYWxsY29kZWNzLmMKaW5kZXggMjA5N2RiMC4uNGQ0ZWY1MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hbGxjb2RlY3MuYworKysgYi9saWJhdmNvZGVjL2FsbGNvZGVjcy5jCkBAIC0yNSw2NDUgKzI1LDg2OSBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgInZlcnNpb24uaCIKIAotI2RlZmluZSBSRUdJU1RFUl9IV0FDQ0VMKFgsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBleHRlcm4gQVZIV0FjY2VsIGZmXyMjeCMjX2h3YWNjZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoQ09ORklHXyMjWCMjX0hXQUNDRUwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXZfcmVnaXN0ZXJfaHdhY2NlbCgmZmZfIyN4IyNfaHdhY2NlbCk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KK2V4dGVybiBBVkNvZGVjIGZmX2E2NG11bHRpX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hNjRtdWx0aTVfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2Fhc2NfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FpY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWxpYXNfcGl4X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hbGlhc19waXhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2Ftdl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYW12X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hbm1fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2Fuc2lfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FwbmdfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FwbmdfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FzdjFfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FzdjFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FzdjJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FzdjJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2F1cmFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2F1cmEyX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hdnJwX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hdnJwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hdnJuX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hdnNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2F2dWlfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2F2dWlfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2F5dXZfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2F5dXZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2JldGhzb2Z0dmlkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9iZmlfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2JpbmtfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2JtcF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYm1wX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ibXZfdmlkZW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2JyZW5kZXJfcGl4X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9jOTNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NhdnNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NkZ3JhcGhpY3NfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NkeGxfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NmaGRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NpbmVwYWtfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NpbmVwYWtfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NsZWFydmlkZW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NsanJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NsanJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NsbGNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NvbWZvcnRub2lzZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfY29tZm9ydG5vaXNlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9jcGlhX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9jc2NkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9jeXV2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kZHNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2RmYV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZGlyYWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2RueGhkX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kbnhoZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZHB4X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kcHhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2RzaWNpbnZpZGVvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kdmF1ZGlvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kdnZpZGVvX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kdnZpZGVvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9keGFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2R4dG9yeV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZHh2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9lYWNtdl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZWFtYWRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2VhdGdxX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9lYXRndl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZWF0cWlfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2VpZ2h0YnBzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9laWdodHN2eF9leHBfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2VpZ2h0c3Z4X2ZpYl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZXNjYXBlMTI0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9lc2NhcGUxMzBfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2V4cl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmZ2MV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmZ2MV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmZ2aHVmZl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmZ2aHVmZl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmljX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9maXRzX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9maXRzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9mbGFzaHN2X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9mbGFzaHN2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9mbGFzaHN2Ml9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmxhc2hzdjJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2ZsaWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2Zsdl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmx2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9mbXZjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9mb3VyeG1fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2ZyYXBzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9mcnd1X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9nMm1fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2dkdl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZ2lmX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9naWZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjFfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjNpX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oMjYzcF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaDI2M3BfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjNfdjRsMm0ybV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaDI2NF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaDI2NF9jcnlzdGFsaGRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjRfdjRsMm0ybV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaDI2NF9tZWRpYWNvZGVjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oMjY0X21tYWxfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjRfcXN2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oMjY0X3JrbXBwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oYXBfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2hhcF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaGV2Y19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaGV2Y19xc3ZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2hldmNfcmttcHBfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2hldmNfdjRsMm0ybV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaG5tNF92aWRlb19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaHFfaHFhX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ocXhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2h1ZmZ5dXZfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2h1ZmZ5dXZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2lkY2luX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9pZmZfaWxibV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaW5kZW8yX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9pbmRlbzNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2luZGVvNF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaW5kZW81X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9pbnRlcnBsYXlfdmlkZW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2pwZWcyMDAwX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9qcGVnMjAwMF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfanBlZ2xzX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9qcGVnbHNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2p2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9rZ3YxX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9rbXZjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9sYWdhcml0aF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGpwZWdfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xvY29fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX20xMDFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21hZ2ljeXV2X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tYWdpY3l1dl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbWRlY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbWltaWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21qcGVnX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tanBlZ19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbWpwZWdiX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tbXZpZGVvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tb3Rpb25waXhlbHNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWcxdmlkZW9fZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWcxdmlkZW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWcydmlkZW9fZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWcydmlkZW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWc0X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGVnNF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXBlZzRfY3J5c3RhbGhkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGVnNF92NGwybTJtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGVnNF9tbWFsX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGVndmlkZW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWcxX3Y0bDJtMm1fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWcyX21tYWxfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWcyX2NyeXN0YWxoZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXBlZzJfdjRsMm0ybV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXBlZzJfcXN2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGVnMl9tZWRpYWNvZGVjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tc2ExX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tc2NjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tc21wZWc0djFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21zbXBlZzR2Ml9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXNtcGVnNHYyX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tc21wZWc0djNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21zbXBlZzR2M19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXNtcGVnNF9jcnlzdGFsaGRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21zcmxlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tc3MxX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tc3MyX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tc3ZpZGVvMV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXN2aWRlbzFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21zemhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX210czJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX212YzFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX212YzJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX214cGVnX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9udXZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BhZl92aWRlb19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGFtX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wYW1fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BibV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGJtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY3hfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjeF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGdtX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wZ21fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BnbXl1dl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGdteXV2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9waWN0b3JfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BpeGxldF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcG5nX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wbmdfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BwbV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcHBtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wcm9yZXNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3Byb3Jlc19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcHJvcmVzX2F3X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wcm9yZXNfa3NfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3Byb3Jlc19sZ3BsX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wc2RfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3B0eF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcWRyYXdfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3FwZWdfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3F0cmxlX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9xdHJsZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcjEwa19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcjEwa19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcjIxMF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcjIxMF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcmF3dmlkZW9fZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3Jhd3ZpZGVvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ybDJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3JvcV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcm9xX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ycHphX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9yc2NjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ydjEwX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ydjEwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ydjIwX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ydjIwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ydjMwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ydjQwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zMzAybV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfczMwMm1fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3Nhbm1fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NjcHJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NjcmVlbnByZXNzb19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfc2R4Ml9kcGNtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zZ2lfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NnaV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfc2dpcmxlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zaGVlcnZpZGVvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zbWFja2VyX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zbWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NtdmpwZWdfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3Nub3dfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3Nub3dfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NwNXhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NwZWVkaHFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NyZ2NfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3N1bnJhc3RfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3N1bnJhc3RfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3N2cTFfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3N2cTFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3N2cTNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3RhcmdhX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl90YXJnYV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdGFyZ2FfeTIxNl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdGRzY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdGhlb3JhX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl90aHBfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3RpZXJ0ZXhzZXF2aWRlb19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdGlmZl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdGlmZl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdG12X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl90cnVlbW90aW9uMV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdHJ1ZW1vdGlvbjJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3RydWVtb3Rpb24ycnRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3RzY2NfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3RzY2MyX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl90eGRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3VsdGlfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3V0dmlkZW9fZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3V0dmlkZW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3YyMTBfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3YyMTBfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3YyMTB4X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92MzA4X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92MzA4X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92NDA4X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92NDA4X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92NDEwX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92NDEwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92Yl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdmJsZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdmMxX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92YzFfY3J5c3RhbGhkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92YzFpbWFnZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdmMxX21tYWxfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZjMV9xc3ZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZjMV92NGwybTJtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92YzJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZjcjFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZtZHZpZGVvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92bW5jX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cDNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZwNV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdnA2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cDZhX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cDZmX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cDdfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZwOF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdnA4X3JrbXBwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cDhfdjRsMm0ybV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdnA5X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cDlfcmttcHBfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZwOV92NGwybTJtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cWFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2JpdHBhY2tlZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfd2VicF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfd3JhcHBlZF9hdmZyYW1lX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl93cmFwcGVkX2F2ZnJhbWVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dtdjFfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dtdjFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dtdjJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dtdjJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dtdjNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dtdjNfY3J5c3RhbGhkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl93bXYzaW1hZ2VfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dudjFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3hhbl93YzNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3hhbl93YzRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3hibV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfeGJtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl94ZmFjZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfeGZhY2VfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3hsX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl94cG1fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3h3ZF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfeHdkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl95NDFwX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl95NDFwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl95bGNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3lvcF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfeXV2NF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfeXV2NF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfemVybzEydl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfemVyb2NvZGVjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl96bGliX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl96bGliX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl96bWJ2X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl96bWJ2X2RlY29kZXI7CiAKLSNkZWZpbmUgUkVHSVNURVJfRU5DT0RFUihYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZXh0ZXJuIEFWQ29kZWMgZmZfIyN4IyNfZW5jb2RlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKENPTkZJR18jI1gjI19FTkNPREVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGF2Y29kZWNfcmVnaXN0ZXIoJmZmXyMjeCMjX2VuY29kZXIpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9CisvKiBhdWRpbyBjb2RlY3MgKi8KK2V4dGVybiBBVkNvZGVjIGZmX2FhY19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWFjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hYWNfZml4ZWRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FhY19sYXRtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hYzNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FjM19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWMzX2ZpeGVkX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hYzNfZml4ZWRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FsYWNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FsYWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2Fsc19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYW1ybmJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FtcndiX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hcGVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FwdHhfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FwdHhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FwdHhfaGRfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FwdHhfaGRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2F0cmFjMV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYXRyYWMzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hdHJhYzNhbF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYXRyYWMzcF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYXRyYWMzcGFsX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9iaW5rYXVkaW9fZGN0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9iaW5rYXVkaW9fcmRmdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYm12X2F1ZGlvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9jb29rX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kY2FfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2RjYV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZG9sYnlfZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZHNkX2xzYmZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2RzZF9tc2JmX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kc2RfbHNiZl9wbGFuYXJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2RzZF9tc2JmX3BsYW5hcl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZHNpY2luYXVkaW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2Rzc19zcF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZHN0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9lYWMzX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9lYWMzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9ldnJjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9mZndhdmVzeW50aF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmxhY19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZmxhY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZzcyM18xX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9nNzIzXzFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2c3MjlfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2dzbV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZ3NtX21zX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9pYWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2ltY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaW50ZXJwbGF5X2FjbV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbWFjZTNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21hY2U2X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tZXRhc291bmRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21scF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbWxwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcDFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wMWZsb2F0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcDJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wMl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXAyZmxvYXRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wMmZpeGVkX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcDNmbG9hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXAzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcDNhZHVmbG9hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXAzYWR1X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcDNvbjRmbG9hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXAzb240X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGM3X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGM4X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9uZWxseW1vc2VyX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9uZWxseW1vc2VyX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9vbjJhdmNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX29wdXNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX29wdXNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BhZl9hdWRpb19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcWNlbHBfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3FkbTJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3FkbWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3JhXzE0NF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcmFfMTQ0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9yYV8yODhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3JhbGZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NiY19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfc2JjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zaG9ydGVuX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zaXByX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zbWFja2F1ZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfc29uaWNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NvbmljX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zb25pY19sc19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdGFrX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl90cnVlaGRfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3RydWVoZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdHJ1ZXNwZWVjaF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdHRhX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl90dGFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3R3aW52cV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdm1kYXVkaW9fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZvcmJpc19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdm9yYmlzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl93YXZwYWNrX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl93YXZwYWNrX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl93bWFsb3NzbGVzc19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfd21hcHJvX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl93bWF2MV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfd21hdjFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dtYXYyX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl93bWF2Ml9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfd21hdm9pY2VfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dzX3NuZDFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3htYTFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3htYTJfZGVjb2RlcjsKIAotI2RlZmluZSBSRUdJU1RFUl9ERUNPREVSKFgsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBleHRlcm4gQVZDb2RlYyBmZl8jI3gjI19kZWNvZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoQ09ORklHXyMjWCMjX0RFQ09ERVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXZjb2RlY19yZWdpc3RlcigmZmZfIyN4IyNfZGVjb2Rlcik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KKy8qIFBDTSBjb2RlY3MgKi8KK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9hbGF3X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fYWxhd19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX2JsdXJheV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX2R2ZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX2YxNmxlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fZjI0bGVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9mMzJiZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX2YzMmJlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fZjMybGVfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9mMzJsZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX2Y2NGJlX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fZjY0YmVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9mNjRsZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX2Y2NGxlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fbHhmX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fbXVsYXdfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9tdWxhd19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3M4X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zOF9wbGFuYXJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zOF9wbGFuYXJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zMTZiZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3MxNmJlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczE2YmVfcGxhbmFyX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczE2YmVfcGxhbmFyX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczE2bGVfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zMTZsZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3MxNmxlX3BsYW5hcl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3MxNmxlX3BsYW5hcl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3MyNGJlX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczI0YmVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zMjRkYXVkX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczI0ZGF1ZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3MyNGxlX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczI0bGVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zMjRsZV9wbGFuYXJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zMjRsZV9wbGFuYXJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zMzJiZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3MzMmJlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczMybGVfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zMzJsZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3MzMmxlX3BsYW5hcl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3MzMmxlX3BsYW5hcl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3M2NGJlX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fczY0YmVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9zNjRsZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3M2NGxlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fdThfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV91OF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3UxNmJlX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fdTE2YmVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV91MTZsZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3UxNmxlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fdTI0YmVfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV91MjRiZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3UyNGxlX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fdTI0bGVfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV91MzJiZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3UzMmJlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fdTMybGVfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV91MzJsZV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX3pvcmtfZGVjb2RlcjsKIAotI2RlZmluZSBSRUdJU1RFUl9FTkNERUMoWCwgeCkgUkVHSVNURVJfRU5DT0RFUihYLCB4KTsgUkVHSVNURVJfREVDT0RFUihYLCB4KQorLyogRFBDTSBjb2RlY3MgKi8KK2V4dGVybiBBVkNvZGVjIGZmX2dyZW1saW5fZHBjbV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaW50ZXJwbGF5X2RwY21fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3JvcV9kcGNtX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9yb3FfZHBjbV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfc29sX2RwY21fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3hhbl9kcGNtX2RlY29kZXI7CiAKLSNkZWZpbmUgUkVHSVNURVJfUEFSU0VSKFgsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfIyN4IyNfcGFyc2VyOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKENPTkZJR18jI1gjI19QQVJTRVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGF2X3JlZ2lzdGVyX2NvZGVjX3BhcnNlcigmZmZfIyN4IyNfcGFyc2VyKTsgICAgICAgICAgICAgICAgIFwKLSAgICB9CisvKiBBRFBDTSBjb2RlY3MgKi8KK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtXzR4bV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fYWR4X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9hZHhfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2FmY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fYWljYV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fY3RfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2R0a19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fZWFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2VhX21heGlzX3hhX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9lYV9yMV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fZWFfcjJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2VhX3IzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9lYV94YXNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2c3MjJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2c3MjJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2c3MjZfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2c3MjZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2c3MjZsZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fZzcyNmxlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9pbWFfYW12X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9pbWFfYXBjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9pbWFfZGF0NF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX2RrM19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX2RrNF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX2VhX2VhY3NfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2ltYV9lYV9zZWFkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9pbWFfaXNzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9pbWFfb2tpX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9pbWFfcXRfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX2ltYV9xdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX3JhZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX3NtanBlZ19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX3dhdl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX3dhdl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX3dzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9tc19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fbXNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX210YWZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX3BzeF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fc2Jwcm9fMl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fc2Jwcm9fM19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fc2Jwcm9fNF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fc3dmX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV9zd2ZfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FkcGNtX3RocF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21fdGhwX2xlX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV92aW1hX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV94YV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21feWFtYWhhX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hZHBjbV95YW1haGFfZGVjb2RlcjsKIAotI2RlZmluZSBSRUdJU1RFUl9CU0YoWCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBleHRlcm4gQVZCaXRTdHJlYW1GaWx0ZXIgZmZfIyN4IyNfYnNmOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoQ09ORklHXyMjWCMjX0JTRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXZfcmVnaXN0ZXJfYml0c3RyZWFtX2ZpbHRlcigmZmZfIyN4IyNfYnNmKTsgICAgICAgICAgICAgICAgXAorLyogc3VidGl0bGVzICovCitleHRlcm4gQVZDb2RlYyBmZl9zc2FfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NzYV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYXNzX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hc3NfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2NjYXB0aW9uX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kdmJzdWJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2R2YnN1Yl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfZHZkc3ViX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9kdmRzdWJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2phY29zdWJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21pY3JvZHZkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tb3Z0ZXh0X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tb3Z0ZXh0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGwyX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wZ3NzdWJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3Bqc19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcmVhbHRleHRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NhbWlfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3NydF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfc3J0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zdGxfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3N1YnJpcF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfc3VicmlwX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9zdWJ2aWV3ZXJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3N1YnZpZXdlcjFfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3RleHRfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3RleHRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZwbGF5ZXJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3dlYnZ0dF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfd2VidnR0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl94c3ViX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl94c3ViX2RlY29kZXI7CisKKy8qIGV4dGVybmFsIGxpYnJhcmllcyAqLworZXh0ZXJuIEFWQ29kZWMgZmZfYWFjX2F0X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hYWNfYXRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2FjM19hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfYWRwY21faW1hX3F0X2F0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hbGFjX2F0X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hbGFjX2F0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9hbXJfbmJfYXRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2VhYzNfYXRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2dzbV9tc19hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaWxiY19hdF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaWxiY19hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXAxX2F0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcDJfYXRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wM19hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcGNtX2FsYXdfYXRfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9hbGF3X2F0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9wY21fbXVsYXdfYXRfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3BjbV9tdWxhd19hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcWRtY19hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfcWRtMl9hdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGliYW9tX2F2MV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGliYW9tX2F2MV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGliY2VsdF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGliY29kZWMyX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJjb2RlYzJfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYmZka19hYWNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYmZka19hYWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYmdzbV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGliZ3NtX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJnc21fbXNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYmdzbV9tc19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGliaWxiY19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGliaWxiY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlibXAzbGFtZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlib3BlbmNvcmVfYW1ybmJfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYm9wZW5jb3JlX2Ftcm5iX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJvcGVuY29yZV9hbXJ3Yl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlib3BlbmpwZWdfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYm9wZW5qcGVnX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJvcHVzX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJvcHVzX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJyc3ZnX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJzaGluZV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlic3BlZXhfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYnNwZWV4X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ0aGVvcmFfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYnR3b2xhbWVfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYnZvX2FtcndiZW5jX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ2b3JiaXNfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYnZvcmJpc19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlidnB4X3ZwOF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlidnB4X3ZwOF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlidnB4X3ZwOV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlidnB4X3ZwOV9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlid2F2cGFja19lbmNvZGVyOworLyogcHJlZmVycmVkIG92ZXIgbGlid2VicCAqLworZXh0ZXJuIEFWQ29kZWMgZmZfbGlid2VicF9hbmltX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ3ZWJwX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ4MjYyX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ4MjY0X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ4MjY0cmdiX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ4MjY1X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ4YXZzX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ4dmlkX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9saWJ6dmJpX3RlbGV0ZXh0X2RlY29kZXI7CisKKy8qIHRleHQgKi8KK2V4dGVybiBBVkNvZGVjIGZmX2JpbnRleHRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3hiaW5fZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2lkZl9kZWNvZGVyOworCisvKiBleHRlcm5hbCBsaWJyYXJpZXMsIHRoYXQgc2hvdWxkbid0IGJlIHVzZWQgYnkgZGVmYXVsdCBpZiBvbmUgb2YgdGhlCisgKiBhYm92ZSBpcyBhdmFpbGFibGUgKi8KK2V4dGVybiBBVkNvZGVjIGZmX2gyNjNfdjRsMm0ybV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlib3BlbmgyNjRfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2xpYm9wZW5oMjY0X2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oMjY0X2FtZl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaDI2NF9jdXZpZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaDI2NF9udmVuY19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaDI2NF9vbXhfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjRfcXN2X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oMjY0X3Y0bDJtMm1fZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjRfdmFhcGlfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX2gyNjRfdmlkZW90b29sYm94X2VuY29kZXI7CisjaWYgRkZfQVBJX05WRU5DX09MRF9OQU1FCitleHRlcm4gQVZDb2RlYyBmZl9udmVuY19lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbnZlbmNfaDI2NF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbnZlbmNfaGV2Y19lbmNvZGVyOworI2VuZGlmCitleHRlcm4gQVZDb2RlYyBmZl9oZXZjX2FtZl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaGV2Y19jdXZpZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaGV2Y19tZWRpYWNvZGVjX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oZXZjX252ZW5jX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oZXZjX3Fzdl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfaGV2Y192NGwybTJtX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oZXZjX3ZhYXBpX2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9oZXZjX3ZpZGVvdG9vbGJveF9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbGlia3ZhemFhcl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbWpwZWdfY3V2aWRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21qcGVnX3Fzdl9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbWpwZWdfdmFhcGlfZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWcxX2N1dmlkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGVnMl9jdXZpZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXBlZzJfcXN2X2VuY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl9tcGVnMl92YWFwaV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfbXBlZzRfY3V2aWRfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWc0X21lZGlhY29kZWNfZGVjb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX21wZWc0X3Y0bDJtMm1fZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZjMV9jdXZpZF9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdnA4X2N1dmlkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cDhfbWVkaWFjb2RlY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdnA4X3Fzdl9kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdnA4X3Y0bDJtMm1fZW5jb2RlcjsKK2V4dGVybiBBVkNvZGVjIGZmX3ZwOF92YWFwaV9lbmNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdnA5X2N1dmlkX2RlY29kZXI7CitleHRlcm4gQVZDb2RlYyBmZl92cDlfbWVkaWFjb2RlY19kZWNvZGVyOworZXh0ZXJuIEFWQ29kZWMgZmZfdnA5X3ZhYXBpX2VuY29kZXI7CisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2NvZGVjX2xpc3QuYyIKKworc3RhdGljIEFWT25jZSBhdl9jb2RlY19zdGF0aWNfaW5pdCA9IEFWX09OQ0VfSU5JVDsKK3N0YXRpYyB2b2lkIGF2X2NvZGVjX2luaXRfc3RhdGljKHZvaWQpCit7CisgICAgZm9yIChpbnQgaSA9IDA7IGNvZGVjX2xpc3RbaV07IGkrKykgeworICAgICAgICBpZiAoY29kZWNfbGlzdFtpXS0+aW5pdF9zdGF0aWNfZGF0YSkKKyAgICAgICAgICAgIGNvZGVjX2xpc3RbaV0tPmluaXRfc3RhdGljX2RhdGEoKEFWQ29kZWMqKWNvZGVjX2xpc3RbaV0pOwogICAgIH0KK30KKworY29uc3QgQVZDb2RlYyAqYXZfY29kZWNfaXRlcmF0ZSh2b2lkICoqb3BhcXVlKQoreworICAgIHVpbnRwdHJfdCBpID0gKHVpbnRwdHJfdCkqb3BhcXVlOworICAgIGNvbnN0IEFWQ29kZWMgKmMgPSBjb2RlY19saXN0W2ldOworCisgICAgZmZfdGhyZWFkX29uY2UoJmF2X2NvZGVjX3N0YXRpY19pbml0LCBhdl9jb2RlY19pbml0X3N0YXRpYyk7CisKKyAgICBpZiAoYykKKyAgICAgICAgKm9wYXF1ZSA9ICh2b2lkKikoaSArIDEpOworCisgICAgcmV0dXJuIGM7Cit9CisKKyNpZiBGRl9BUElfTkVYVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworc3RhdGljIEFWT25jZSBhdl9jb2RlY19uZXh0X2luaXQgPSBBVl9PTkNFX0lOSVQ7CisKK3N0YXRpYyB2b2lkIGF2X2NvZGVjX2luaXRfbmV4dCh2b2lkKQoreworICAgIEFWQ29kZWMgKnByZXYgPSBOVUxMLCAqcDsKKyAgICB2b2lkICppID0gMDsKKyAgICB3aGlsZSAoKHAgPSAoQVZDb2RlYyopYXZfY29kZWNfaXRlcmF0ZSgmaSkpKSB7CisgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgcHJldi0+bmV4dCA9IHA7CisgICAgICAgIHByZXYgPSBwOworICAgIH0KK30KKworCisKK2F2X2NvbGQgdm9pZCBhdmNvZGVjX3JlZ2lzdGVyKEFWQ29kZWMgKmNvZGVjKQoreworICAgIGZmX3RocmVhZF9vbmNlKCZhdl9jb2RlY19uZXh0X2luaXQsIGF2X2NvZGVjX2luaXRfbmV4dCk7Cit9CisKK0FWQ29kZWMgKmF2X2NvZGVjX25leHQoY29uc3QgQVZDb2RlYyAqYykKK3sKKyAgICBmZl90aHJlYWRfb25jZSgmYXZfY29kZWNfbmV4dF9pbml0LCBhdl9jb2RlY19pbml0X25leHQpOworCisgICAgaWYgKGMpCisgICAgICAgIHJldHVybiBjLT5uZXh0OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIChBVkNvZGVjKiljb2RlY19saXN0WzBdOworfQogCiB2b2lkIGF2Y29kZWNfcmVnaXN0ZXJfYWxsKHZvaWQpCiB7Ci0gICAgc3RhdGljIGludCBpbml0aWFsaXplZDsKLQotICAgIGlmIChpbml0aWFsaXplZCkKLSAgICAgICAgcmV0dXJuOwotICAgIGluaXRpYWxpemVkID0gMTsKLQotICAgIC8qIGhhcmR3YXJlIGFjY2VsZXJhdG9ycyAqLwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSDI2M19WQUFQSSwgICAgICAgIGgyNjNfdmFhcGkpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSDI2M19WSURFT1RPT0xCT1gsIGgyNjNfdmlkZW90b29sYm94KTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKEgyNjRfRDNEMTFWQSwgICAgICBoMjY0X2QzZDExdmEpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSDI2NF9EWFZBMiwgICAgICAgIGgyNjRfZHh2YTIpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSDI2NF9NTUFMLCAgICAgICAgIGgyNjRfbW1hbCk7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChIMjY0X1FTViwgICAgICAgICAgaDI2NF9xc3YpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSDI2NF9WQUFQSSwgICAgICAgIGgyNjRfdmFhcGkpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSDI2NF9WREEsICAgICAgICAgIGgyNjRfdmRhKTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKEgyNjRfVkRBX09MRCwgICAgICBoMjY0X3ZkYV9vbGQpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSDI2NF9WRFBBVSwgICAgICAgIGgyNjRfdmRwYXUpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSDI2NF9WSURFT1RPT0xCT1gsIGgyNjRfdmlkZW90b29sYm94KTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKEhFVkNfRDNEMTFWQSwgICAgICBoZXZjX2QzZDExdmEpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSEVWQ19EWFZBMiwgICAgICAgIGhldmNfZHh2YTIpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoSEVWQ19RU1YsICAgICAgICAgIGhldmNfcXN2KTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKEhFVkNfVkFBUEksICAgICAgICBoZXZjX3ZhYXBpKTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKEhFVkNfVkRQQVUsICAgICAgICBoZXZjX3ZkcGF1KTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKE1QRUcxX1hWTUMsICAgICAgICBtcGVnMV94dm1jKTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKE1QRUcxX1ZEUEFVLCAgICAgICBtcGVnMV92ZHBhdSk7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHMV9WSURFT1RPT0xCT1gsIG1wZWcxX3ZpZGVvdG9vbGJveCk7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHMl9YVk1DLCAgICAgICAgbXBlZzJfeHZtYyk7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHMl9EM0QxMVZBLCAgICAgbXBlZzJfZDNkMTF2YSk7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHMl9EWFZBMiwgICAgICAgbXBlZzJfZHh2YTIpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoTVBFRzJfTU1BTCwgICAgICAgIG1wZWcyX21tYWwpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoTVBFRzJfUVNWLCAgICAgICAgIG1wZWcyX3Fzdik7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHMl9WQUFQSSwgICAgICAgbXBlZzJfdmFhcGkpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoTVBFRzJfVkRQQVUsICAgICAgIG1wZWcyX3ZkcGF1KTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKE1QRUcyX1ZJREVPVE9PTEJPWCwgbXBlZzJfdmlkZW90b29sYm94KTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKE1QRUc0X01NQUwsICAgICAgICBtcGVnNF9tbWFsKTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKE1QRUc0X1ZBQVBJLCAgICAgICBtcGVnNF92YWFwaSk7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChNUEVHNF9WRFBBVSwgICAgICAgbXBlZzRfdmRwYXUpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoTVBFRzRfVklERU9UT09MQk9YLCBtcGVnNF92aWRlb3Rvb2xib3gpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoVkMxX0QzRDExVkEsICAgICAgIHZjMV9kM2QxMXZhKTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKFZDMV9EWFZBMiwgICAgICAgICB2YzFfZHh2YTIpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoVkMxX1ZBQVBJLCAgICAgICAgIHZjMV92YWFwaSk7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChWQzFfVkRQQVUsICAgICAgICAgdmMxX3ZkcGF1KTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKFZDMV9NTUFMLCAgICAgICAgICB2YzFfbW1hbCk7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChWQzFfUVNWLCAgICAgICAgICAgdmMxX3Fzdik7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChWUDlfRDNEMTFWQSwgICAgICAgdnA5X2QzZDExdmEpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoVlA5X0RYVkEyLCAgICAgICAgIHZwOV9keHZhMik7Ci0gICAgUkVHSVNURVJfSFdBQ0NFTChWUDlfVkFBUEksICAgICAgICAgdnA5X3ZhYXBpKTsKLSAgICBSRUdJU1RFUl9IV0FDQ0VMKFdNVjNfRDNEMTFWQSwgICAgICB3bXYzX2QzZDExdmEpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoV01WM19EWFZBMiwgICAgICAgIHdtdjNfZHh2YTIpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoV01WM19WQUFQSSwgICAgICAgIHdtdjNfdmFhcGkpOwotICAgIFJFR0lTVEVSX0hXQUNDRUwoV01WM19WRFBBVSwgICAgICAgIHdtdjNfdmRwYXUpOwotCi0gICAgLyogdmlkZW8gY29kZWNzICovCi0gICAgUkVHSVNURVJfRU5DT0RFUihBNjRNVUxUSSwgICAgICAgICAgYTY0bXVsdGkpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoQTY0TVVMVEk1LCAgICAgICAgIGE2NG11bHRpNSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBQVNDLCAgICAgICAgICAgICAgYWFzYyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBSUMsICAgICAgICAgICAgICAgYWljKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFMSUFTX1BJWCwgICAgICAgICBhbGlhc19waXgpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoQU1WLCAgICAgICAgICAgICAgIGFtdik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBTk0sICAgICAgICAgICAgICAgYW5tKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFOU0ksICAgICAgICAgICAgICBhbnNpKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFQTkcsICAgICAgICAgICAgICBhcG5nKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFTVjEsICAgICAgICAgICAgICBhc3YxKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFTVjIsICAgICAgICAgICAgICBhc3YyKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFVUkEsICAgICAgICAgICAgICBhdXJhKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFVUkEyLCAgICAgICAgICAgICBhdXJhMik7Ci0gICAgUkVHSVNURVJfRU5DREVDIChBVlJQLCAgICAgICAgICAgICAgYXZycCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBVlJOLCAgICAgICAgICAgICAgYXZybik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBVlMsICAgICAgICAgICAgICAgYXZzKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFWVUksICAgICAgICAgICAgICBhdnVpKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFZVVYsICAgICAgICAgICAgICBheXV2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEJFVEhTT0ZUVklELCAgICAgICBiZXRoc29mdHZpZCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihCRkksICAgICAgICAgICAgICAgYmZpKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEJJTkssICAgICAgICAgICAgICBiaW5rKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEJNUCwgICAgICAgICAgICAgICBibXApOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQk1WX1ZJREVPLCAgICAgICAgIGJtdl92aWRlbyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihCUkVOREVSX1BJWCwgICAgICAgYnJlbmRlcl9waXgpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQzkzLCAgICAgICAgICAgICAgIGM5Myk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihDQVZTLCAgICAgICAgICAgICAgY2F2cyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihDREdSQVBISUNTLCAgICAgICAgY2RncmFwaGljcyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihDRFhMLCAgICAgICAgICAgICAgY2R4bCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihDRkhELCAgICAgICAgICAgICAgY2ZoZCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChDSU5FUEFLLCAgICAgICAgICAgY2luZXBhayk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChDTEpSLCAgICAgICAgICAgICAgY2xqcik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihDTExDLCAgICAgICAgICAgICAgY2xsYyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChDT01GT1JUTk9JU0UsICAgICAgY29tZm9ydG5vaXNlKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKENQSUEsICAgICAgICAgICAgICBjcGlhKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKENTQ0QsICAgICAgICAgICAgICBjc2NkKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKENZVVYsICAgICAgICAgICAgICBjeXV2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEREUywgICAgICAgICAgICAgICBkZHMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoREZBLCAgICAgICAgICAgICAgIGRmYSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihESVJBQywgICAgICAgICAgICAgZGlyYWMpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoRE5YSEQsICAgICAgICAgICAgIGRueGhkKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKERQWCwgICAgICAgICAgICAgICBkcHgpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoRFNJQ0lOVklERU8sICAgICAgIGRzaWNpbnZpZGVvKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKERWQVVESU8sICAgICAgICAgICBkdmF1ZGlvKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKERWVklERU8sICAgICAgICAgICBkdnZpZGVvKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKERYQSwgICAgICAgICAgICAgICBkeGEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoRFhUT1JZLCAgICAgICAgICAgIGR4dG9yeSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihEWFYsICAgICAgICAgICAgICAgZHh2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEVBQ01WLCAgICAgICAgICAgICBlYWNtdik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihFQU1BRCwgICAgICAgICAgICAgZWFtYWQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoRUFUR1EsICAgICAgICAgICAgIGVhdGdxKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEVBVEdWLCAgICAgICAgICAgICBlYXRndik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihFQVRRSSwgICAgICAgICAgICAgZWF0cWkpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoRUlHSFRCUFMsICAgICAgICAgIGVpZ2h0YnBzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEVJR0hUU1ZYX0VYUCwgICAgICBlaWdodHN2eF9leHApOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoRUlHSFRTVlhfRklCLCAgICAgIGVpZ2h0c3Z4X2ZpYik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihFU0NBUEUxMjQsICAgICAgICAgZXNjYXBlMTI0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEVTQ0FQRTEzMCwgICAgICAgICBlc2NhcGUxMzApOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoRVhSLCAgICAgICAgICAgICAgIGV4cik7Ci0gICAgUkVHSVNURVJfRU5DREVDIChGRlYxLCAgICAgICAgICAgICAgZmZ2MSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChGRlZIVUZGLCAgICAgICAgICAgZmZ2aHVmZik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihGSUMsICAgICAgICAgICAgICAgZmljKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEZMQVNIU1YsICAgICAgICAgICBmbGFzaHN2KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEZMQVNIU1YyLCAgICAgICAgICBmbGFzaHN2Mik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihGTElDLCAgICAgICAgICAgICAgZmxpYyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChGTFYsICAgICAgICAgICAgICAgZmx2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEZPVVJYTSwgICAgICAgICAgICBmb3VyeG0pOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoRlJBUFMsICAgICAgICAgICAgIGZyYXBzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEZSV1UsICAgICAgICAgICAgICBmcnd1KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEcyTSwgICAgICAgICAgICAgICBnMm0pOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoR0lGLCAgICAgICAgICAgICAgIGdpZik7Ci0gICAgUkVHSVNURVJfRU5DREVDIChIMjYxLCAgICAgICAgICAgICAgaDI2MSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChIMjYzLCAgICAgICAgICAgICAgaDI2Myk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihIMjYzSSwgICAgICAgICAgICAgaDI2M2kpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoSDI2M1AsICAgICAgICAgICAgIGgyNjNwKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEgyNjQsICAgICAgICAgICAgICBoMjY0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEgyNjRfQ1JZU1RBTEhELCAgICBoMjY0X2NyeXN0YWxoZCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihIMjY0X01NQUwsICAgICAgICAgaDI2NF9tbWFsKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEgyNjRfUVNWLCAgICAgICAgICBoMjY0X3Fzdik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihIMjY0X1ZEQSwgICAgICAgICAgaDI2NF92ZGEpOwotI2lmIEZGX0FQSV9WRFBBVQotICAgIFJFR0lTVEVSX0RFQ09ERVIoSDI2NF9WRFBBVSwgICAgICAgIGgyNjRfdmRwYXUpOworICAgIGZmX3RocmVhZF9vbmNlKCZhdl9jb2RlY19uZXh0X2luaXQsIGF2X2NvZGVjX2luaXRfbmV4dCk7Cit9CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICNlbmRpZgotICAgIFJFR0lTVEVSX0VOQ0RFQyAoSEFQLCAgICAgICAgICAgICAgIGhhcCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihIRVZDLCAgICAgICAgICAgICAgaGV2Yyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihIRVZDX1FTViwgICAgICAgICAgaGV2Y19xc3YpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoSE5NNF9WSURFTywgICAgICAgIGhubTRfdmlkZW8pOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoSFFfSFFBLCAgICAgICAgICAgIGhxX2hxYSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihIUVgsICAgICAgICAgICAgICAgaHF4KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEhVRkZZVVYsICAgICAgICAgICBodWZmeXV2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKElEQ0lOLCAgICAgICAgICAgICBpZGNpbik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihJRkZfSUxCTSwgICAgICAgICAgaWZmX2lsYm0pOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoSU5ERU8yLCAgICAgICAgICAgIGluZGVvMik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihJTkRFTzMsICAgICAgICAgICAgaW5kZW8zKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKElOREVPNCwgICAgICAgICAgICBpbmRlbzQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoSU5ERU81LCAgICAgICAgICAgIGluZGVvNSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihJTlRFUlBMQVlfVklERU8sICAgaW50ZXJwbGF5X3ZpZGVvKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEpQRUcyMDAwLCAgICAgICAgICBqcGVnMjAwMCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChKUEVHTFMsICAgICAgICAgICAganBlZ2xzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEpWLCAgICAgICAgICAgICAgICBqdik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihLR1YxLCAgICAgICAgICAgICAga2d2MSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihLTVZDLCAgICAgICAgICAgICAga212Yyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihMQUdBUklUSCwgICAgICAgICAgbGFnYXJpdGgpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoTEpQRUcsICAgICAgICAgICAgIGxqcGVnKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKExPQ08sICAgICAgICAgICAgICBsb2NvKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1ERUMsICAgICAgICAgICAgICBtZGVjKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1JTUlDLCAgICAgICAgICAgICBtaW1pYyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChNSlBFRywgICAgICAgICAgICAgbWpwZWcpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTUpQRUdCLCAgICAgICAgICAgIG1qcGVnYik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNTVZJREVPLCAgICAgICAgICAgbW12aWRlbyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNT1RJT05QSVhFTFMsICAgICAgbW90aW9ucGl4ZWxzKTsKLSNpZiBGRl9BUElfWFZNQwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBFR19YVk1DLCAgICAgICAgIG1wZWdfeHZtYyk7Ci0jZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KLSAgICBSRUdJU1RFUl9FTkNERUMgKE1QRUcxVklERU8sICAgICAgICBtcGVnMXZpZGVvKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKE1QRUcyVklERU8sICAgICAgICBtcGVnMnZpZGVvKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKE1QRUc0LCAgICAgICAgICAgICBtcGVnNCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNUEVHNF9DUllTVEFMSEQsICAgbXBlZzRfY3J5c3RhbGhkKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QRUc0X01NQUwsICAgICAgICBtcGVnNF9tbWFsKTsKLSNpZiBGRl9BUElfVkRQQVUKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QRUc0X1ZEUEFVLCAgICAgICBtcGVnNF92ZHBhdSk7Ci0jZW5kaWYKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QRUdWSURFTywgICAgICAgICBtcGVndmlkZW8pOwotI2lmIEZGX0FQSV9WRFBBVQotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBFR19WRFBBVSwgICAgICAgIG1wZWdfdmRwYXUpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBFRzFfVkRQQVUsICAgICAgIG1wZWcxX3ZkcGF1KTsKLSNlbmRpZgotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBFRzJfTU1BTCwgICAgICAgIG1wZWcyX21tYWwpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVBFRzJfQ1JZU1RBTEhELCAgIG1wZWcyX2NyeXN0YWxoZCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNUEVHMl9RU1YsICAgICAgICAgbXBlZzJfcXN2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1TQTEsICAgICAgICAgICAgICBtc2ExKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1TTVBFRzRfQ1JZU1RBTEhELCBtc21wZWc0X2NyeXN0YWxoZCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNU01QRUc0VjEsICAgICAgICAgbXNtcGVnNHYxKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKE1TTVBFRzRWMiwgICAgICAgICBtc21wZWc0djIpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoTVNNUEVHNFYzLCAgICAgICAgIG1zbXBlZzR2Myk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNU1JMRSwgICAgICAgICAgICAgbXNybGUpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVNTMSwgICAgICAgICAgICAgIG1zczEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVNTMiwgICAgICAgICAgICAgIG1zczIpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoTVNWSURFTzEsICAgICAgICAgIG1zdmlkZW8xKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1TWkgsICAgICAgICAgICAgICBtc3poKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1UUzIsICAgICAgICAgICAgICBtdHMyKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1WQzEsICAgICAgICAgICAgICBtdmMxKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1WQzIsICAgICAgICAgICAgICBtdmMyKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1YUEVHLCAgICAgICAgICAgICBteHBlZyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihOVVYsICAgICAgICAgICAgICAgbnV2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFBBRl9WSURFTywgICAgICAgICBwYWZfdmlkZW8pOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUEFNLCAgICAgICAgICAgICAgIHBhbSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQQk0sICAgICAgICAgICAgICAgcGJtKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDWCwgICAgICAgICAgICAgICBwY3gpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUEdNLCAgICAgICAgICAgICAgIHBnbSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQR01ZVVYsICAgICAgICAgICAgcGdteXV2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFBJQ1RPUiwgICAgICAgICAgICBwaWN0b3IpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUE5HLCAgICAgICAgICAgICAgIHBuZyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQUE0sICAgICAgICAgICAgICAgcHBtKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBST1JFUywgICAgICAgICAgICBwcm9yZXMpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoUFJPUkVTX0FXLCAgICAgICAgIHByb3Jlc19hdyk7Ci0gICAgUkVHSVNURVJfRU5DT0RFUihQUk9SRVNfS1MsICAgICAgICAgcHJvcmVzX2tzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFBST1JFU19MR1BMLCAgICAgICBwcm9yZXNfbGdwbCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihQVFgsICAgICAgICAgICAgICAgcHR4KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFFEUkFXLCAgICAgICAgICAgICBxZHJhdyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihRUEVHLCAgICAgICAgICAgICAgcXBlZyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChRVFJMRSwgICAgICAgICAgICAgcXRybGUpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUjEwSywgICAgICAgICAgICAgIHIxMGspOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUjIxMCwgICAgICAgICAgICAgIHIyMTApOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUkFXVklERU8sICAgICAgICAgIHJhd3ZpZGVvKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFJMMiwgICAgICAgICAgICAgICBybDIpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUk9RLCAgICAgICAgICAgICAgIHJvcSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihSUFpBLCAgICAgICAgICAgICAgcnB6YSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihSU0NDLCAgICAgICAgICAgICAgcnNjYyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChSVjEwLCAgICAgICAgICAgICAgcnYxMCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChSVjIwLCAgICAgICAgICAgICAgcnYyMCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihSVjMwLCAgICAgICAgICAgICAgcnYzMCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihSVjQwLCAgICAgICAgICAgICAgcnY0MCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChTMzAyTSwgICAgICAgICAgICAgczMwMm0pOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoU0FOTSwgICAgICAgICAgICAgIHNhbm0pOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoU0NSRUVOUFJFU1NPLCAgICAgIHNjcmVlbnByZXNzbyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihTRFgyX0RQQ00sICAgICAgICAgc2R4Ml9kcGNtKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFNHSSwgICAgICAgICAgICAgICBzZ2kpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoU0dJUkxFLCAgICAgICAgICAgIHNnaXJsZSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihTTUFDS0VSLCAgICAgICAgICAgc21hY2tlcik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihTTUMsICAgICAgICAgICAgICAgc21jKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFNNVkpQRUcsICAgICAgICAgICBzbXZqcGVnKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFNOT1csICAgICAgICAgICAgICBzbm93KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFNQNVgsICAgICAgICAgICAgICBzcDV4KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFNVTlJBU1QsICAgICAgICAgICBzdW5yYXN0KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFNWUTEsICAgICAgICAgICAgICBzdnExKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFNWUTMsICAgICAgICAgICAgICBzdnEzKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFRBUkdBLCAgICAgICAgICAgICB0YXJnYSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihUQVJHQV9ZMjE2LCAgICAgICAgdGFyZ2FfeTIxNik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihURFNDLCAgICAgICAgICAgICAgdGRzYyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihUSEVPUkEsICAgICAgICAgICAgdGhlb3JhKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFRIUCwgICAgICAgICAgICAgICB0aHApOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVElFUlRFWFNFUVZJREVPLCAgIHRpZXJ0ZXhzZXF2aWRlbyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChUSUZGLCAgICAgICAgICAgICAgdGlmZik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihUTVYsICAgICAgICAgICAgICAgdG12KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFRSVUVNT1RJT04xLCAgICAgICB0cnVlbW90aW9uMSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihUUlVFTU9USU9OMiwgICAgICAgdHJ1ZW1vdGlvbjIpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVFNDQywgICAgICAgICAgICAgIHRzY2MpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVFNDQzIsICAgICAgICAgICAgIHRzY2MyKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFRYRCwgICAgICAgICAgICAgICB0eGQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVUxUSSwgICAgICAgICAgICAgIHVsdGkpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoVVRWSURFTywgICAgICAgICAgIHV0dmlkZW8pOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoVjIxMCwgICAgICAgICAgICAgIHYyMTApOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVjIxMFgsICAgICAgICAgICAgIHYyMTB4KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFYzMDgsICAgICAgICAgICAgICB2MzA4KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFY0MDgsICAgICAgICAgICAgICB2NDA4KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFY0MTAsICAgICAgICAgICAgICB2NDEwKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZCLCAgICAgICAgICAgICAgICB2Yik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihWQkxFLCAgICAgICAgICAgICAgdmJsZSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihWQzEsICAgICAgICAgICAgICAgdmMxKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZDMV9DUllTVEFMSEQsICAgICB2YzFfY3J5c3RhbGhkKTsKLSNpZiBGRl9BUElfVkRQQVUKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZDMV9WRFBBVSwgICAgICAgICB2YzFfdmRwYXUpOwotI2VuZGlmCi0gICAgUkVHSVNURVJfREVDT0RFUihWQzFJTUFHRSwgICAgICAgICAgdmMxaW1hZ2UpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVkMxX01NQUwsICAgICAgICAgIHZjMV9tbWFsKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZDMV9RU1YsICAgICAgICAgICB2YzFfcXN2KTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKFZDMiwgICAgICAgICAgICAgICB2YzIpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVkNSMSwgICAgICAgICAgICAgIHZjcjEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVk1EVklERU8sICAgICAgICAgIHZtZHZpZGVvKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZNTkMsICAgICAgICAgICAgICB2bW5jKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZQMywgICAgICAgICAgICAgICB2cDMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVlA1LCAgICAgICAgICAgICAgIHZwNSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihWUDYsICAgICAgICAgICAgICAgdnA2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZQNkEsICAgICAgICAgICAgICB2cDZhKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZQNkYsICAgICAgICAgICAgICB2cDZmKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZQNywgICAgICAgICAgICAgICB2cDcpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVlA4LCAgICAgICAgICAgICAgIHZwOCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihWUDksICAgICAgICAgICAgICAgdnA5KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFZRQSwgICAgICAgICAgICAgICB2cWEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoV0VCUCwgICAgICAgICAgICAgIHdlYnApOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoV1JBUFBFRF9BVkZSQU1FLCAgIHdyYXBwZWRfYXZmcmFtZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChXTVYxLCAgICAgICAgICAgICAgd212MSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChXTVYyLCAgICAgICAgICAgICAgd212Mik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihXTVYzLCAgICAgICAgICAgICAgd212Myk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihXTVYzX0NSWVNUQUxIRCwgICAgd212M19jcnlzdGFsaGQpOwotI2lmIEZGX0FQSV9WRFBBVQotICAgIFJFR0lTVEVSX0RFQ09ERVIoV01WM19WRFBBVSwgICAgICAgIHdtdjNfdmRwYXUpOwotI2VuZGlmCi0gICAgUkVHSVNURVJfREVDT0RFUihXTVYzSU1BR0UsICAgICAgICAgd212M2ltYWdlKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFdOVjEsICAgICAgICAgICAgICB3bnYxKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFhBTl9XQzMsICAgICAgICAgICB4YW5fd2MzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFhBTl9XQzQsICAgICAgICAgICB4YW5fd2M0KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFhCTSwgICAgICAgICAgICAgICB4Ym0pOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoWEZBQ0UsICAgICAgICAgICAgIHhmYWNlKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFhMLCAgICAgICAgICAgICAgICB4bCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChYV0QsICAgICAgICAgICAgICAgeHdkKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFk0MVAsICAgICAgICAgICAgICB5NDFwKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFlPUCwgICAgICAgICAgICAgICB5b3ApOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoWVVWNCwgICAgICAgICAgICAgIHl1djQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoWkVSTzEyViwgICAgICAgICAgIHplcm8xMnYpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoWkVST0NPREVDLCAgICAgICAgIHplcm9jb2RlYyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChaTElCLCAgICAgICAgICAgICAgemxpYik7Ci0gICAgUkVHSVNURVJfRU5DREVDIChaTUJWLCAgICAgICAgICAgICAgem1idik7CiAKLSAgICAvKiBhdWRpbyBjb2RlY3MgKi8KLSAgICBSRUdJU1RFUl9FTkNERUMgKEFBQywgICAgICAgICAgICAgICBhYWMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQUFDX0ZJWEVELCAgICAgICAgIGFhY19maXhlZCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBQUNfTEFUTSwgICAgICAgICAgYWFjX2xhdG0pOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoQUMzLCAgICAgICAgICAgICAgIGFjMyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChBQzNfRklYRUQsICAgICAgICAgYWMzX2ZpeGVkKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFMQUMsICAgICAgICAgICAgICBhbGFjKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFMUywgICAgICAgICAgICAgICBhbHMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQU1STkIsICAgICAgICAgICAgIGFtcm5iKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFNUldCLCAgICAgICAgICAgICBhbXJ3Yik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBUEUsICAgICAgICAgICAgICAgYXBlKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFUUkFDMSwgICAgICAgICAgICBhdHJhYzEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQVRSQUMzLCAgICAgICAgICAgIGF0cmFjMyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBVFJBQzNQLCAgICAgICAgICAgYXRyYWMzcCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihCSU5LQVVESU9fRENULCAgICAgYmlua2F1ZGlvX2RjdCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihCSU5LQVVESU9fUkRGVCwgICAgYmlua2F1ZGlvX3JkZnQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQk1WX0FVRElPLCAgICAgICAgIGJtdl9hdWRpbyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihDT09LLCAgICAgICAgICAgICAgY29vayk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChEQ0EsICAgICAgICAgICAgICAgZGNhKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKERTRF9MU0JGLCAgICAgICAgICBkc2RfbHNiZik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihEU0RfTVNCRiwgICAgICAgICAgZHNkX21zYmYpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoRFNEX0xTQkZfUExBTkFSLCAgIGRzZF9sc2JmX3BsYW5hcik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihEU0RfTVNCRl9QTEFOQVIsICAgZHNkX21zYmZfcGxhbmFyKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKERTSUNJTkFVRElPLCAgICAgICBkc2ljaW5hdWRpbyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihEU1NfU1AsICAgICAgICAgICAgZHNzX3NwKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEVBQzMsICAgICAgICAgICAgICBlYWMzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEVWUkMsICAgICAgICAgICAgICBldnJjKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEZGV0FWRVNZTlRILCAgICAgICBmZndhdmVzeW50aCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChGTEFDLCAgICAgICAgICAgICAgZmxhYyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChHNzIzXzEsICAgICAgICAgICAgZzcyM18xKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEc3MjksICAgICAgICAgICAgICBnNzI5KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEdTTSwgICAgICAgICAgICAgICBnc20pOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoR1NNX01TLCAgICAgICAgICAgIGdzbV9tcyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihJQUMsICAgICAgICAgICAgICAgaWFjKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKElNQywgICAgICAgICAgICAgICBpbWMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoSU5URVJQTEFZX0FDTSwgICAgIGludGVycGxheV9hY20pOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTUFDRTMsICAgICAgICAgICAgIG1hY2UzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1BQ0U2LCAgICAgICAgICAgICBtYWNlNik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNRVRBU09VTkQsICAgICAgICAgbWV0YXNvdW5kKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1MUCwgICAgICAgICAgICAgICBtbHApOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVAxLCAgICAgICAgICAgICAgIG1wMSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNUDFGTE9BVCwgICAgICAgICAgbXAxZmxvYXQpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoTVAyLCAgICAgICAgICAgICAgIG1wMik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihNUDJGTE9BVCwgICAgICAgICAgbXAyZmxvYXQpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoTVAyRklYRUQsICAgICAgICAgIG1wMmZpeGVkKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QMywgICAgICAgICAgICAgICBtcDMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVAzRkxPQVQsICAgICAgICAgIG1wM2Zsb2F0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QM0FEVSwgICAgICAgICAgICBtcDNhZHUpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVAzQURVRkxPQVQsICAgICAgIG1wM2FkdWZsb2F0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QM09ONCwgICAgICAgICAgICBtcDNvbjQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTVAzT040RkxPQVQsICAgICAgIG1wM29uNGZsb2F0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QQzcsICAgICAgICAgICAgICBtcGM3KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QQzgsICAgICAgICAgICAgICBtcGM4KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKE5FTExZTU9TRVIsICAgICAgICBuZWxseW1vc2VyKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE9OMkFWQywgICAgICAgICAgICBvbjJhdmMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoT1BVUywgICAgICAgICAgICAgIG9wdXMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoUEFGX0FVRElPLCAgICAgICAgIHBhZl9hdWRpbyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihRQ0VMUCwgICAgICAgICAgICAgcWNlbHApOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoUURNMiwgICAgICAgICAgICAgIHFkbTIpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUkFfMTQ0LCAgICAgICAgICAgIHJhXzE0NCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihSQV8yODgsICAgICAgICAgICAgcmFfMjg4KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFJBTEYsICAgICAgICAgICAgICByYWxmKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFNIT1JURU4sICAgICAgICAgICBzaG9ydGVuKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFNJUFIsICAgICAgICAgICAgICBzaXByKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFNNQUNLQVVELCAgICAgICAgICBzbWFja2F1ZCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChTT05JQywgICAgICAgICAgICAgc29uaWMpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoU09OSUNfTFMsICAgICAgICAgIHNvbmljX2xzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFRBSywgICAgICAgICAgICAgICB0YWspOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVFJVRUhELCAgICAgICAgICAgIHRydWVoZCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihUUlVFU1BFRUNILCAgICAgICAgdHJ1ZXNwZWVjaCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChUVEEsICAgICAgICAgICAgICAgdHRhKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFRXSU5WUSwgICAgICAgICAgICB0d2ludnEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoVk1EQVVESU8sICAgICAgICAgIHZtZGF1ZGlvKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFZPUkJJUywgICAgICAgICAgICB2b3JiaXMpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoV0FWUEFDSywgICAgICAgICAgIHdhdnBhY2spOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoV01BTE9TU0xFU1MsICAgICAgIHdtYWxvc3NsZXNzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFdNQVBSTywgICAgICAgICAgICB3bWFwcm8pOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoV01BVjEsICAgICAgICAgICAgIHdtYXYxKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFdNQVYyLCAgICAgICAgICAgICB3bWF2Mik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihXTUFWT0lDRSwgICAgICAgICAgd21hdm9pY2UpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoV1NfU05EMSwgICAgICAgICAgIHdzX3NuZDEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoWE1BMSwgICAgICAgICAgICAgIHhtYTEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoWE1BMiwgICAgICAgICAgICAgIHhtYTIpOworc3RhdGljIGVudW0gQVZDb2RlY0lEIHJlbWFwX2RlcHJlY2F0ZWRfY29kZWNfaWQoZW51bSBBVkNvZGVjSUQgaWQpCit7CisgICAgc3dpdGNoKGlkKXsKKyAgICAgICAgLy9UaGlzIGlzIGZvciBmdXR1cmUgZGVwcmVjYXRlYyBjb2RlYyBpZHMsIGl0cyBlbXB0eSBzaW5jZQorICAgICAgICAvL2xhc3QgbWFqb3IgYnVtcCBidXQgd2lsbCBmaWxsIHVwIGFnYWluIG92ZXIgdGltZSwgcGxlYXNlIGRvbid0IHJlbW92ZSBpdAorICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybiBpZDsKKyAgICB9Cit9CiAKLSAgICAvKiBQQ00gY29kZWNzICovCi0gICAgUkVHSVNURVJfRU5DREVDIChQQ01fQUxBVywgICAgICAgICAgcGNtX2FsYXcpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoUENNX0JMVVJBWSwgICAgICAgIHBjbV9ibHVyYXkpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoUENNX0RWRCwgICAgICAgICAgIHBjbV9kdmQpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX0YzMkJFLCAgICAgICAgIHBjbV9mMzJiZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQQ01fRjMyTEUsICAgICAgICAgcGNtX2YzMmxlKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9GNjRCRSwgICAgICAgICBwY21fZjY0YmUpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX0Y2NExFLCAgICAgICAgIHBjbV9mNjRsZSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihQQ01fTFhGLCAgICAgICAgICAgcGNtX2x4Zik7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQQ01fTVVMQVcsICAgICAgICAgcGNtX211bGF3KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TOCwgICAgICAgICAgICBwY21fczgpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1M4X1BMQU5BUiwgICAgIHBjbV9zOF9wbGFuYXIpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1MxNkJFLCAgICAgICAgIHBjbV9zMTZiZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQQ01fUzE2QkVfUExBTkFSLCAgcGNtX3MxNmJlX3BsYW5hcik7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQQ01fUzE2TEUsICAgICAgICAgcGNtX3MxNmxlKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TMTZMRV9QTEFOQVIsICBwY21fczE2bGVfcGxhbmFyKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TMjRCRSwgICAgICAgICBwY21fczI0YmUpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1MyNERBVUQsICAgICAgIHBjbV9zMjRkYXVkKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TMjRMRSwgICAgICAgICBwY21fczI0bGUpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1MyNExFX1BMQU5BUiwgIHBjbV9zMjRsZV9wbGFuYXIpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1MzMkJFLCAgICAgICAgIHBjbV9zMzJiZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQQ01fUzMyTEUsICAgICAgICAgcGNtX3MzMmxlKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9TMzJMRV9QTEFOQVIsICBwY21fczMybGVfcGxhbmFyKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9VOCwgICAgICAgICAgICBwY21fdTgpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1UxNkJFLCAgICAgICAgIHBjbV91MTZiZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQQ01fVTE2TEUsICAgICAgICAgcGNtX3UxNmxlKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9VMjRCRSwgICAgICAgICBwY21fdTI0YmUpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoUENNX1UyNExFLCAgICAgICAgIHBjbV91MjRsZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChQQ01fVTMyQkUsICAgICAgICAgcGNtX3UzMmJlKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFBDTV9VMzJMRSwgICAgICAgICBwY21fdTMybGUpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoUENNX1pPUkssICAgICAgICAgIHBjbV96b3JrKTsKK3N0YXRpYyBBVkNvZGVjICpmaW5kX2NvZGVjKGVudW0gQVZDb2RlY0lEIGlkLCBpbnQgKCp4KShjb25zdCBBVkNvZGVjICopKQoreworICAgIGNvbnN0IEFWQ29kZWMgKnAsICpleHBlcmltZW50YWwgPSBOVUxMOworICAgIHZvaWQgKmkgPSAwOwogCi0gICAgLyogRFBDTSBjb2RlY3MgKi8KLSAgICBSRUdJU1RFUl9ERUNPREVSKElOVEVSUExBWV9EUENNLCAgICBpbnRlcnBsYXlfZHBjbSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChST1FfRFBDTSwgICAgICAgICAgcm9xX2RwY20pOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoU09MX0RQQ00sICAgICAgICAgIHNvbF9kcGNtKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFhBTl9EUENNLCAgICAgICAgICB4YW5fZHBjbSk7CisgICAgaWQgPSByZW1hcF9kZXByZWNhdGVkX2NvZGVjX2lkKGlkKTsKIAotICAgIC8qIEFEUENNIGNvZGVjcyAqLwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fNFhNLCAgICAgICAgIGFkcGNtXzR4bSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChBRFBDTV9BRFgsICAgICAgICAgYWRwY21fYWR4KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0FGQywgICAgICAgICBhZHBjbV9hZmMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fQUlDQSwgICAgICAgIGFkcGNtX2FpY2EpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fQ1QsICAgICAgICAgIGFkcGNtX2N0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0RUSywgICAgICAgICBhZHBjbV9kdGspOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fRUEsICAgICAgICAgIGFkcGNtX2VhKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0VBX01BWElTX1hBLCBhZHBjbV9lYV9tYXhpc194YSk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9FQV9SMSwgICAgICAgYWRwY21fZWFfcjEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fRUFfUjIsICAgICAgIGFkcGNtX2VhX3IyKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0VBX1IzLCAgICAgICBhZHBjbV9lYV9yMyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9FQV9YQVMsICAgICAgYWRwY21fZWFfeGFzKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFEUENNX0c3MjIsICAgICAgICBhZHBjbV9nNzIyKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFEUENNX0c3MjYsICAgICAgICBhZHBjbV9nNzI2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0c3MjZMRSwgICAgICBhZHBjbV9nNzI2bGUpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX0FNViwgICAgIGFkcGNtX2ltYV9hbXYpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX0FQQywgICAgIGFkcGNtX2ltYV9hcGMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX0RLMywgICAgIGFkcGNtX2ltYV9kazMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX0RLNCwgICAgIGFkcGNtX2ltYV9kazQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fSU1BX0VBX0VBQ1MsIGFkcGNtX2ltYV9lYV9lYWNzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0lNQV9FQV9TRUFELCBhZHBjbV9pbWFfZWFfc2VhZCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9JTUFfSVNTLCAgICAgYWRwY21faW1hX2lzcyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9JTUFfT0tJLCAgICAgYWRwY21faW1hX29raSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChBRFBDTV9JTUFfUVQsICAgICAgYWRwY21faW1hX3F0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0lNQV9SQUQsICAgICBhZHBjbV9pbWFfcmFkKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0lNQV9TTUpQRUcsICBhZHBjbV9pbWFfc21qcGVnKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFEUENNX0lNQV9XQVYsICAgICBhZHBjbV9pbWFfd2F2KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX0lNQV9XUywgICAgICBhZHBjbV9pbWFfd3MpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoQURQQ01fTVMsICAgICAgICAgIGFkcGNtX21zKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX1BTWCwgICAgICAgICBhZHBjbV9wc3gpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fU0JQUk9fMiwgICAgIGFkcGNtX3NicHJvXzIpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fU0JQUk9fMywgICAgIGFkcGNtX3NicHJvXzMpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fU0JQUk9fNCwgICAgIGFkcGNtX3NicHJvXzQpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoQURQQ01fU1dGLCAgICAgICAgIGFkcGNtX3N3Zik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihBRFBDTV9USFAsICAgICAgICAgYWRwY21fdGhwKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKEFEUENNX1RIUF9MRSwgICAgICBhZHBjbV90aHBfbGUpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fVklNQSwgICAgICAgIGFkcGNtX3ZpbWEpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoQURQQ01fWEEsICAgICAgICAgIGFkcGNtX3hhKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKEFEUENNX1lBTUFIQSwgICAgICBhZHBjbV95YW1haGEpOworICAgIHdoaWxlICgocCA9IGF2X2NvZGVjX2l0ZXJhdGUoJmkpKSkgeworICAgICAgICBpZiAoIXgocCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHAtPmlkID09IGlkKSB7CisgICAgICAgICAgICBpZiAocC0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCAmJiAhZXhwZXJpbWVudGFsKSB7CisgICAgICAgICAgICAgICAgZXhwZXJpbWVudGFsID0gcDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAoQVZDb2RlYyopcDsKKyAgICAgICAgfQorICAgIH0KIAotICAgIC8qIHN1YnRpdGxlcyAqLwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoU1NBLCAgICAgICAgICAgICAgIHNzYSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChBU1MsICAgICAgICAgICAgICAgYXNzKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKENDQVBUSU9OLCAgICAgICAgICBjY2FwdGlvbik7Ci0gICAgUkVHSVNURVJfRU5DREVDIChEVkJTVUIsICAgICAgICAgICAgZHZic3ViKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKERWRFNVQiwgICAgICAgICAgICBkdmRzdWIpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoSkFDT1NVQiwgICAgICAgICAgIGphY29zdWIpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTUlDUk9EVkQsICAgICAgICAgIG1pY3JvZHZkKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKE1PVlRFWFQsICAgICAgICAgICBtb3Z0ZXh0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKE1QTDIsICAgICAgICAgICAgICBtcGwyKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFBHU1NVQiwgICAgICAgICAgICBwZ3NzdWIpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoUEpTLCAgICAgICAgICAgICAgIHBqcyk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihSRUFMVEVYVCwgICAgICAgICAgcmVhbHRleHQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoU0FNSSwgICAgICAgICAgICAgIHNhbWkpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoU1JULCAgICAgICAgICAgICAgIHNydCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihTVEwsICAgICAgICAgICAgICAgc3RsKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFNVQlJJUCwgICAgICAgICAgICBzdWJyaXApOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoU1VCVklFV0VSLCAgICAgICAgIHN1YnZpZXdlcik7Ci0gICAgUkVHSVNURVJfREVDT0RFUihTVUJWSUVXRVIxLCAgICAgICAgc3Vidmlld2VyMSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChURVhULCAgICAgICAgICAgICAgdGV4dCk7Ci0gICAgUkVHSVNURVJfREVDT0RFUihWUExBWUVSLCAgICAgICAgICAgdnBsYXllcik7Ci0gICAgUkVHSVNURVJfRU5DREVDIChXRUJWVFQsICAgICAgICAgICAgd2VidnR0KTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKFhTVUIsICAgICAgICAgICAgICB4c3ViKTsKKyAgICByZXR1cm4gKEFWQ29kZWMqKWV4cGVyaW1lbnRhbDsKK30KIAotICAgIC8qIGV4dGVybmFsIGxpYnJhcmllcyAqLwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTElCQ0VMVCwgICAgICAgICAgIGxpYmNlbHQpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTElCRENBREVDLCAgICAgICAgIGxpYmRjYWRlYykKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQkZBQUMsICAgICAgICAgICBsaWJmYWFjKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKExJQkZES19BQUMsICAgICAgICBsaWJmZGtfYWFjKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKExJQkdTTSwgICAgICAgICAgICBsaWJnc20pOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoTElCR1NNX01TLCAgICAgICAgIGxpYmdzbV9tcyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChMSUJJTEJDLCAgICAgICAgICAgbGliaWxiYyk7Ci0gICAgUkVHSVNURVJfRU5DT0RFUihMSUJNUDNMQU1FLCAgICAgICAgbGlibXAzbGFtZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChMSUJPUEVOQ09SRV9BTVJOQiwgbGlib3BlbmNvcmVfYW1ybmIpOwotICAgIFJFR0lTVEVSX0RFQ09ERVIoTElCT1BFTkNPUkVfQU1SV0IsIGxpYm9wZW5jb3JlX2FtcndiKTsKLSAgICBSRUdJU1RFUl9FTkNERUMgKExJQk9QRU5KUEVHLCAgICAgICBsaWJvcGVuanBlZyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChMSUJPUFVTLCAgICAgICAgICAgbGlib3B1cyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChMSUJTQ0hST0VESU5HRVIsICAgbGlic2Nocm9lZGluZ2VyKTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQlNISU5FLCAgICAgICAgICBsaWJzaGluZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChMSUJTUEVFWCwgICAgICAgICAgbGlic3BlZXgpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoTElCVEhFT1JBLCAgICAgICAgIGxpYnRoZW9yYSk7Ci0gICAgUkVHSVNURVJfRU5DT0RFUihMSUJUV09MQU1FLCAgICAgICAgbGlidHdvbGFtZSk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChMSUJVVFZJREVPLCAgICAgICAgbGlidXR2aWRlbyk7Ci0gICAgUkVHSVNURVJfRU5DT0RFUihMSUJWT19BTVJXQkVOQywgICAgbGlidm9fYW1yd2JlbmMpOwotICAgIFJFR0lTVEVSX0VOQ0RFQyAoTElCVk9SQklTLCAgICAgICAgIGxpYnZvcmJpcyk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChMSUJWUFhfVlA4LCAgICAgICAgbGlidnB4X3ZwOCk7Ci0gICAgUkVHSVNURVJfRU5DREVDIChMSUJWUFhfVlA5LCAgICAgICAgbGlidnB4X3ZwOSk7Ci0gICAgUkVHSVNURVJfRU5DT0RFUihMSUJXQVZQQUNLLCAgICAgICAgbGlid2F2cGFjayk7Ci0gICAgUkVHSVNURVJfRU5DT0RFUihMSUJXRUJQX0FOSU0sICAgICAgbGlid2VicF9hbmltKTsgIC8qIHByZWZlcnJlZCBvdmVyIGxpYndlYnAgKi8KLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQldFQlAsICAgICAgICAgICBsaWJ3ZWJwKTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQlgyNjIsICAgICAgICAgICBsaWJ4MjYyKTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQlgyNjQsICAgICAgICAgICBsaWJ4MjY0KTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQlgyNjRSR0IsICAgICAgICBsaWJ4MjY0cmdiKTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQlgyNjUsICAgICAgICAgICBsaWJ4MjY1KTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQlhBVlMsICAgICAgICAgICBsaWJ4YXZzKTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQlhWSUQsICAgICAgICAgICBsaWJ4dmlkKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKExJQlpWQklfVEVMRVRFWFQsICBsaWJ6dmJpX3RlbGV0ZXh0KTsKK0FWQ29kZWMgKmF2Y29kZWNfZmluZF9lbmNvZGVyKGVudW0gQVZDb2RlY0lEIGlkKQoreworICAgIHJldHVybiBmaW5kX2NvZGVjKGlkLCBhdl9jb2RlY19pc19lbmNvZGVyKTsKK30KIAotICAgIC8qIHRleHQgKi8KLSAgICBSRUdJU1RFUl9ERUNPREVSKEJJTlRFWFQsICAgICAgICAgICBiaW50ZXh0KTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKFhCSU4sICAgICAgICAgICAgICB4YmluKTsKLSAgICBSRUdJU1RFUl9ERUNPREVSKElERiwgICAgICAgICAgICAgICBpZGYpOworQVZDb2RlYyAqYXZjb2RlY19maW5kX2RlY29kZXIoZW51bSBBVkNvZGVjSUQgaWQpCit7CisgICAgcmV0dXJuIGZpbmRfY29kZWMoaWQsIGF2X2NvZGVjX2lzX2RlY29kZXIpOworfQogCi0gICAgLyogZXh0ZXJuYWwgbGlicmFyaWVzLCB0aGF0IHNob3VsZG4ndCBiZSB1c2VkIGJ5IGRlZmF1bHQgaWYgb25lIG9mIHRoZQotICAgICAqIGFib3ZlIGlzIGF2YWlsYWJsZSAqLwotICAgIFJFR0lTVEVSX0VOQ09ERVIoTElCT1BFTkgyNjQsICAgICAgIGxpYm9wZW5oMjY0KTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKEgyNjRfUVNWLCAgICAgICAgICBoMjY0X3Fzdik7Ci0gICAgUkVHSVNURVJfRU5DT0RFUihOVkVOQywgICAgICAgICAgICAgbnZlbmMpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoTlZFTkNfSDI2NCwgICAgICAgIG52ZW5jX2gyNjQpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoTlZFTkNfSEVWQywgICAgICAgIG52ZW5jX2hldmMpOwotICAgIFJFR0lTVEVSX0VOQ09ERVIoSEVWQ19RU1YsICAgICAgICAgIGhldmNfcXN2KTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKExJQktWQVpBQVIsICAgICAgICBsaWJrdmF6YWFyKTsKLSAgICBSRUdJU1RFUl9FTkNPREVSKE1QRUcyX1FTViwgICAgICAgICBtcGVnMl9xc3YpOworc3RhdGljIEFWQ29kZWMgKmZpbmRfY29kZWNfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lLCBpbnQgKCp4KShjb25zdCBBVkNvZGVjICopKQoreworICAgIHZvaWQgKmkgPSAwOworICAgIGNvbnN0IEFWQ29kZWMgKnA7CiAKLSAgICAvKiBwYXJzZXJzICovCi0gICAgUkVHSVNURVJfUEFSU0VSKEFBQywgICAgICAgICAgICAgICAgYWFjKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoQUFDX0xBVE0sICAgICAgICAgICBhYWNfbGF0bSk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKEFDMywgICAgICAgICAgICAgICAgYWMzKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoQURYLCAgICAgICAgICAgICAgICBhZHgpOwotICAgIFJFR0lTVEVSX1BBUlNFUihCTVAsICAgICAgICAgICAgICAgIGJtcCk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKENBVlNWSURFTywgICAgICAgICAgY2F2c3ZpZGVvKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoQ09PSywgICAgICAgICAgICAgICBjb29rKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoRENBLCAgICAgICAgICAgICAgICBkY2EpOwotICAgIFJFR0lTVEVSX1BBUlNFUihESVJBQywgICAgICAgICAgICAgIGRpcmFjKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoRE5YSEQsICAgICAgICAgICAgICBkbnhoZCk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKERQWCwgICAgICAgICAgICAgICAgZHB4KTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoRFZBVURJTywgICAgICAgICAgICBkdmF1ZGlvKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoRFZCU1VCLCAgICAgICAgICAgICBkdmJzdWIpOwotICAgIFJFR0lTVEVSX1BBUlNFUihEVkRTVUIsICAgICAgICAgICAgIGR2ZHN1Yik7Ci0gICAgUkVHSVNURVJfUEFSU0VSKERWRF9OQVYsICAgICAgICAgICAgZHZkX25hdik7Ci0gICAgUkVHSVNURVJfUEFSU0VSKEZMQUMsICAgICAgICAgICAgICAgZmxhYyk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKEc3MjksICAgICAgICAgICAgICAgZzcyOSk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKEdTTSwgICAgICAgICAgICAgICAgZ3NtKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoSDI2MSwgICAgICAgICAgICAgICBoMjYxKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoSDI2MywgICAgICAgICAgICAgICBoMjYzKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoSDI2NCwgICAgICAgICAgICAgICBoMjY0KTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoSEVWQywgICAgICAgICAgICAgICBoZXZjKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoTUpQRUcsICAgICAgICAgICAgICBtanBlZyk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKE1MUCwgICAgICAgICAgICAgICAgbWxwKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoTVBFRzRWSURFTywgICAgICAgICBtcGVnNHZpZGVvKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoTVBFR0FVRElPLCAgICAgICAgICBtcGVnYXVkaW8pOwotICAgIFJFR0lTVEVSX1BBUlNFUihNUEVHVklERU8sICAgICAgICAgIG1wZWd2aWRlbyk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKE9QVVMsICAgICAgICAgICAgICAgb3B1cyk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKFBORywgICAgICAgICAgICAgICAgcG5nKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoUE5NLCAgICAgICAgICAgICAgICBwbm0pOwotICAgIFJFR0lTVEVSX1BBUlNFUihSVjMwLCAgICAgICAgICAgICAgIHJ2MzApOwotICAgIFJFR0lTVEVSX1BBUlNFUihSVjQwLCAgICAgICAgICAgICAgIHJ2NDApOwotICAgIFJFR0lTVEVSX1BBUlNFUihUQUssICAgICAgICAgICAgICAgIHRhayk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKFZDMSwgICAgICAgICAgICAgICAgdmMxKTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoVk9SQklTLCAgICAgICAgICAgICB2b3JiaXMpOwotICAgIFJFR0lTVEVSX1BBUlNFUihWUDMsICAgICAgICAgICAgICAgIHZwMyk7Ci0gICAgUkVHSVNURVJfUEFSU0VSKFZQOCwgICAgICAgICAgICAgICAgdnA4KTsKLSAgICBSRUdJU1RFUl9QQVJTRVIoVlA5LCAgICAgICAgICAgICAgICB2cDkpOworICAgIGlmICghbmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICAvKiBiaXRzdHJlYW0gZmlsdGVycyAqLwotICAgIFJFR0lTVEVSX0JTRihBQUNfQURUU1RPQVNDLCAgICAgICAgIGFhY19hZHRzdG9hc2MpOwotICAgIFJFR0lTVEVSX0JTRihDSE9NUCwgICAgICAgICAgICAgICAgIGNob21wKTsKLSAgICBSRUdJU1RFUl9CU0YoRFVNUF9FWFRSQURBVEEsICAgICAgICBkdW1wX2V4dHJhZGF0YSk7Ci0gICAgUkVHSVNURVJfQlNGKEgyNjRfTVA0VE9BTk5FWEIsICAgICAgaDI2NF9tcDR0b2FubmV4Yik7Ci0gICAgUkVHSVNURVJfQlNGKEhFVkNfTVA0VE9BTk5FWEIsICAgICAgaGV2Y19tcDR0b2FubmV4Yik7Ci0gICAgUkVHSVNURVJfQlNGKElNWF9EVU1QX0hFQURFUiwgICAgICAgaW14X2R1bXBfaGVhZGVyKTsKLSAgICBSRUdJU1RFUl9CU0YoTUpQRUcySlBFRywgICAgICAgICAgICBtanBlZzJqcGVnKTsKLSAgICBSRUdJU1RFUl9CU0YoTUpQRUdBX0RVTVBfSEVBREVSLCAgICBtanBlZ2FfZHVtcF9oZWFkZXIpOwotICAgIFJFR0lTVEVSX0JTRihNUDNfSEVBREVSX0RFQ09NUFJFU1MsIG1wM19oZWFkZXJfZGVjb21wcmVzcyk7Ci0gICAgUkVHSVNURVJfQlNGKE1QRUc0X1VOUEFDS19CRlJBTUVTLCAgbXBlZzRfdW5wYWNrX2JmcmFtZXMpOwotICAgIFJFR0lTVEVSX0JTRihNT1YyVEVYVFNVQiwgICAgICAgICAgIG1vdjJ0ZXh0c3ViKTsKLSAgICBSRUdJU1RFUl9CU0YoTk9JU0UsICAgICAgICAgICAgICAgICBub2lzZSk7Ci0gICAgUkVHSVNURVJfQlNGKFJFTU9WRV9FWFRSQURBVEEsICAgICAgcmVtb3ZlX2V4dHJhZGF0YSk7Ci0gICAgUkVHSVNURVJfQlNGKFRFWFQyTU9WU1VCLCAgICAgICAgICAgdGV4dDJtb3ZzdWIpOworICAgIHdoaWxlICgocCA9IGF2X2NvZGVjX2l0ZXJhdGUoJmkpKSkgeworICAgICAgICBpZiAoIXgocCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHN0cmNtcChuYW1lLCBwLT5uYW1lKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIChBVkNvZGVjKilwOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitBVkNvZGVjICphdmNvZGVjX2ZpbmRfZW5jb2Rlcl9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgcmV0dXJuIGZpbmRfY29kZWNfYnlfbmFtZShuYW1lLCBhdl9jb2RlY19pc19lbmNvZGVyKTsKK30KKworQVZDb2RlYyAqYXZjb2RlY19maW5kX2RlY29kZXJfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIHJldHVybiBmaW5kX2NvZGVjX2J5X25hbWUobmFtZSwgYXZfY29kZWNfaXNfZGVjb2Rlcik7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FscGhhL2FzbS5oIGIvbGliYXZjb2RlYy9hbHBoYS9hc20uaAppbmRleCA4Mjc3MjFlLi42ZDg1MGNlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FscGhhL2FzbS5oCisrKyBiL2xpYmF2Y29kZWMvYWxwaGEvYXNtLmgKQEAgLTE0NiwzOSArMTQ2LDYgQEAKICNkZWZpbmUgdW5wa2J3KGEpICAgICh7IHVpbnQ2NF90IF9fcjsgX19hc21fXyAoIi5hcmNoIGV2NjsgdW5wa2J3ICAlcjEsJTAiICAgICA6ICI9ciIgKF9fcikgOiAickoiICAoYSkpOyAgICAgICAgICAgX19yOyB9KQogI2VuZGlmCiAKLSNlbGlmIGRlZmluZWQoX19ERUNDKSAgICAgICAgICAgLyogRGlnaXRhbC9Db21wYXEvaHAgImNjYyIgY29tcGlsZXIgKi8KLQotI2luY2x1ZGUgPGNfYXNtLmg+Ci0jZGVmaW5lIGxkcShwKSAoKihjb25zdCB1aW50NjRfdCAqKSAocCkpCi0jZGVmaW5lIGxkbChwKSAoKihjb25zdCBpbnQzMl90ICopICAocCkpCi0jZGVmaW5lIHN0cShsLCBwKSBkbyB7ICoodWludDY0X3QgKikgKHApID0gKGwpOyB9IHdoaWxlICgwKQotI2RlZmluZSBzdGwobCwgcCkgZG8geyAqKGludDMyX3QgKikgIChwKSA9IChsKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgbGRxX3UoYSkgICAgIGFzbSAoImxkcV91ICAgJXYwLDAoJWEwKSIsIGEpCi0jZGVmaW5lIHVsZHEoYSkgICAgICAoKihjb25zdCBfX3VuYWxpZ25lZCB1aW50NjRfdCAqKSAoYSkpCi0jZGVmaW5lIGNtcGJnZShhLCBiKSBhc20gKCJjbXBiZ2UgICVhMCwlYTEsJXYwIiwgYSwgYikKLSNkZWZpbmUgZXh0cWwoYSwgYikgIGFzbSAoImV4dHFsICAgJWEwLCVhMSwldjAiLCBhLCBiKQotI2RlZmluZSBleHR3bChhLCBiKSAgYXNtICgiZXh0d2wgICAlYTAsJWExLCV2MCIsIGEsIGIpCi0jZGVmaW5lIGV4dHFoKGEsIGIpICBhc20gKCJleHRxaCAgICVhMCwlYTEsJXYwIiwgYSwgYikKLSNkZWZpbmUgemFwKGEsIGIpICAgIGFzbSAoInphcCAgICAgJWEwLCVhMSwldjAiLCBhLCBiKQotI2RlZmluZSB6YXBub3QoYSwgYikgYXNtICgiemFwbm90ICAlYTAsJWExLCV2MCIsIGEsIGIpCi0jZGVmaW5lIGFtYXNrKGEpICAgICBhc20gKCJhbWFzayAgICVhMCwldjAiLCBhKQotI2RlZmluZSBpbXBsdmVyKCkgICAgYXNtICgiaW1wbHZlciAldjAiKQotI2RlZmluZSBycGNjKCkgICAgICAgYXNtICgicnBjYyAgICAgICAgICAgJXYwIikKLSNkZWZpbmUgbWludWI4KGEsIGIpIGFzbSAoIm1pbnViOCAgJWEwLCVhMSwldjAiLCBhLCBiKQotI2RlZmluZSBtaW5zYjgoYSwgYikgYXNtICgibWluc2I4ICAlYTAsJWExLCV2MCIsIGEsIGIpCi0jZGVmaW5lIG1pbnV3NChhLCBiKSBhc20gKCJtaW51dzQgICVhMCwlYTEsJXYwIiwgYSwgYikKLSNkZWZpbmUgbWluc3c0KGEsIGIpIGFzbSAoIm1pbnN3NCAgJWEwLCVhMSwldjAiLCBhLCBiKQotI2RlZmluZSBtYXh1YjgoYSwgYikgYXNtICgibWF4dWI4ICAlYTAsJWExLCV2MCIsIGEsIGIpCi0jZGVmaW5lIG1heHNiOChhLCBiKSBhc20gKCJtYXhzYjggICVhMCwlYTEsJXYwIiwgYSwgYikKLSNkZWZpbmUgbWF4dXc0KGEsIGIpIGFzbSAoIm1heHV3NCAgJWEwLCVhMSwldjAiLCBhLCBiKQotI2RlZmluZSBtYXhzdzQoYSwgYikgYXNtICgibWF4c3c0ICAlYTAsJWExLCV2MCIsIGEsIGIpCi0jZGVmaW5lIHBlcnIoYSwgYikgICBhc20gKCJwZXJyICAgICVhMCwlYTEsJXYwIiwgYSwgYikKLSNkZWZpbmUgcGtsYihhKSAgICAgIGFzbSAoInBrbGIgICAgJWEwLCV2MCIsIGEpCi0jZGVmaW5lIHBrd2IoYSkgICAgICBhc20gKCJwa3diICAgICVhMCwldjAiLCBhKQotI2RlZmluZSB1bnBrYmwoYSkgICAgYXNtICgidW5wa2JsICAlYTAsJXYwIiwgYSkKLSNkZWZpbmUgdW5wa2J3KGEpICAgIGFzbSAoInVucGtidyAgJWEwLCV2MCIsIGEpCi0jZGVmaW5lIHdoNjQoYSkgICAgICBhc20gKCJ3aDY0ICAgICVhMCIsIGEpCi0KICNlbHNlCiAjZXJyb3IgIlVua25vd24gY29tcGlsZXIhIgogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FscGhhL2lkY3Rkc3BfYWxwaGEuYyBiL2xpYmF2Y29kZWMvYWxwaGEvaWRjdGRzcF9hbHBoYS5jCmluZGV4IDE5MjNlYmIuLmJkNDM4NDIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWxwaGEvaWRjdGRzcF9hbHBoYS5jCisrKyBiL2xpYmF2Y29kZWMvYWxwaGEvaWRjdGRzcF9hbHBoYS5jCkBAIC0xMTgsOCArMTE4LDcgQEAKICAgICBhZGRfcGl4ZWxzX2NsYW1wZWRfYXhwX3AgPSBjLT5hZGRfcGl4ZWxzX2NsYW1wZWQ7CiAKICAgICBpZiAoIWhpZ2hfYml0X2RlcHRoICYmICFhdmN0eC0+bG93cmVzICYmCi0gICAgICAgIChhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfQVVUTyB8fAotICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRUFMUEhBKSkgeworICAgICAgICAoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8pKSB7CiAgICAgICAgIGMtPmlkY3RfcHV0ID0gZmZfc2ltcGxlX2lkY3RfcHV0X2F4cDsKICAgICAgICAgYy0+aWRjdF9hZGQgPSBmZl9zaW1wbGVfaWRjdF9hZGRfYXhwOwogICAgICAgICBjLT5pZGN0ID0gICAgIGZmX3NpbXBsZV9pZGN0X2F4cDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWxwaGEvaWRjdGRzcF9hbHBoYS5oIGIvbGliYXZjb2RlYy9hbHBoYS9pZGN0ZHNwX2FscGhhLmgKaW5kZXggYmY5ODQ5NS4uOGNjOTY5ZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hbHBoYS9pZGN0ZHNwX2FscGhhLmgKKysrIGIvbGliYXZjb2RlYy9hbHBoYS9pZGN0ZHNwX2FscGhhLmgKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKIAogdm9pZCBmZl9zaW1wbGVfaWRjdF9heHAoaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfYXhwKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKLXZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2F4cCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9heHAodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfYXhwKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfQUxQSEFfSURDVERTUF9BTFBIQV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FscGhhL3BpeGJsb2NrZHNwX2FscGhhLmMgYi9saWJhdmNvZGVjL2FscGhhL3BpeGJsb2NrZHNwX2FscGhhLmMKaW5kZXggODY2Yjc2Mi4uYzJmMWExZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hbHBoYS9waXhibG9ja2RzcF9hbHBoYS5jCisrKyBiL2xpYmF2Y29kZWMvYWxwaGEvcGl4YmxvY2tkc3BfYWxwaGEuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgImFzbS5oIgogCiBzdGF0aWMgdm9pZCBnZXRfcGl4ZWxzX212aShpbnQxNl90ICpyZXN0cmljdCBibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3RyaWN0IHBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3RyaWN0IHBpeGVscywgcHRyZGlmZl90IHN0cmlkZSkKIHsKICAgICBpbnQgaCA9IDg7CiAKQEAgLTM0LDEzICszNCwxNCBAQAogICAgICAgICBzdHEodW5wa2J3KHApLCAgICAgICBibG9jayk7CiAgICAgICAgIHN0cSh1bnBrYncocCA+PiAzMiksIGJsb2NrICsgNCk7CiAKLSAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgcGl4ZWxzICs9IHN0cmlkZTsKICAgICAgICAgYmxvY2sgKz0gODsKICAgICB9IHdoaWxlICgtLWgpOwogfQogCiBzdGF0aWMgdm9pZCBkaWZmX3BpeGVsc19tdmkoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLCBjb25zdCB1aW50OF90ICpzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKICAgICBpbnQgaCA9IDg7CiAgICAgdWludDY0X3QgbWFzayA9IDB4NDA0MDsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hbHBoYS9zaW1wbGVfaWRjdF9hbHBoYS5jIGIvbGliYXZjb2RlYy9hbHBoYS9zaW1wbGVfaWRjdF9hbHBoYS5jCmluZGV4IDA0YmUwY2UuLjZlMzc3ZWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWxwaGEvc2ltcGxlX2lkY3RfYWxwaGEuYworKysgYi9saWJhdmNvZGVjL2FscGhhL3NpbXBsZV9pZGN0X2FscGhhLmMKQEAgLTI5MCwxMyArMjkwLDEzIEBACiAgICAgfQogfQogCi12b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9heHAodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9heHAodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgZmZfc2ltcGxlX2lkY3RfYXhwKGJsb2NrKTsKICAgICBwdXRfcGl4ZWxzX2NsYW1wZWRfYXhwX3AoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7CiB9CiAKLXZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2F4cCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2F4cCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKIHsKICAgICBmZl9zaW1wbGVfaWRjdF9heHAoYmxvY2spOwogICAgIGFkZF9waXhlbHNfY2xhbXBlZF9heHBfcChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYWxzZGVjLmMgYi9saWJhdmNvZGVjL2Fsc2RlYy5jCmluZGV4IGViZDM2NGUuLmNhODcwMWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYWxzZGVjLmMKKysrIGIvbGliYXZjb2RlYy9hbHNkZWMuYwpAQCAtMzEsMTIgKzMxLDE1IEBACiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJ1bmFyeS5oIgogI2luY2x1ZGUgIm1wZWc0YXVkaW8uaCIKLSNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAiYmdtYy5oIgogI2luY2x1ZGUgImJzd2FwZHNwLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtbHouaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zb2Z0ZmxvYXRfaWVlZTc1NC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCkBAIC0yMjUsNiArMjI4LDE0IEBACiAgICAgaW50MzJfdCAqKnJhd19zYW1wbGVzOyAgICAgICAgICAvLy88IGRlY29kZWQgcmF3IHNhbXBsZXMgZm9yIGVhY2ggY2hhbm5lbAogICAgIGludDMyX3QgKnJhd19idWZmZXI7ICAgICAgICAgICAgLy8vPCBjb250YWlucyBhbGwgZGVjb2RlZCByYXcgc2FtcGxlcyBpbmNsdWRpbmcgY2FycnlvdmVyIHNhbXBsZXMKICAgICB1aW50OF90ICpjcmNfYnVmZmVyOyAgICAgICAgICAgIC8vLzwgYnVmZmVyIG9mIGJ5dGUgb3JkZXIgY29ycmVjdGVkIHNhbXBsZXMgdXNlZCBmb3IgQ1JDIGNoZWNrCisgICAgTUxaKiBtbHo7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IG1hc2tlZCBseiBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZQorICAgIFNvZnRGbG9hdF9JRUVFNzU0ICphY2Y7ICAgICAgICAgLy8vPCBjb250YWlucyBjb21tb24gbXVsdGlwbGllciBmb3IgYWxsIGNoYW5uZWxzCisgICAgaW50ICpsYXN0X2FjZl9tYW50aXNzYTsgICAgICAgICAvLy88IGNvbnRhaW5zIHRoZSBsYXN0IGFjZiBtYW50aXNzYSBkYXRhIG9mIGNvbW1vbiBtdWx0aXBsaWVyIGZvciBhbGwgY2hhbm5lbHMKKyAgICBpbnQgKnNoaWZ0X3ZhbHVlOyAgICAgICAgICAgICAgIC8vLzwgdmFsdWUgYnkgd2hpY2ggdGhlIGJpbmFyeSBwb2ludCBpcyB0byBiZSBzaGlmdGVkIGZvciBhbGwgY2hhbm5lbHMKKyAgICBpbnQgKmxhc3Rfc2hpZnRfdmFsdWU7ICAgICAgICAgIC8vLzwgY29udGFpbnMgbGFzdCBzaGlmdCB2YWx1ZSBmb3IgYWxsIGNoYW5uZWxzCisgICAgaW50ICoqcmF3X21hbnRpc3NhOyAgICAgICAgICAgICAvLy88IGRlY29kZWQgbWFudGlzc2EgYml0cyBvZiB0aGUgZGlmZmVyZW5jZSBzaWduYWwKKyAgICB1bnNpZ25lZCBjaGFyICpsYXJyYXk7ICAgICAgICAgIC8vLzwgYnVmZmVyIHRvIHN0b3JlIHRoZSBvdXRwdXQgb2YgbWFza2VkIGx6IGRlY29tcHJlc3Npb24KKyAgICBpbnQgKm5iaXRzOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29udGFpbnMgdGhlIG51bWJlciBvZiBiaXRzIHRvIHJlYWQgZm9yIG1hc2tlZCBseiBkZWNvbXByZXNzaW9uIGZvciBhbGwgc2FtcGxlcwogfSBBTFNEZWNDb250ZXh0OwogCiAKQEAgLTQ0MSw3ICs0NTIsNiBAQAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogCi0gICAgTUlTU0lOR19FUlIoc2NvbmYtPmZsb2F0aW5nLCAgIkZsb2F0aW5nIHBvaW50IGRlY29kaW5nIiwgICAgIEFWRVJST1JfUEFUQ0hXRUxDT01FKTsKICAgICBNSVNTSU5HX0VSUihzY29uZi0+cmxzbG1zLCAgICAiQWRhcHRpdmUgUkxTLUxNUyBwcmVkaWN0aW9uIiwgQVZFUlJPUl9QQVRDSFdFTENPTUUpOwogCiAgICAgcmV0dXJuIGVycm9yOwpAQCAtNjk0LDExICs3MDQsNiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKmJkLT5vcHRfb3JkZXIgPSBzY29uZi0+bWF4X29yZGVyOwogICAgICAgICB9Ci0gICAgICAgIGlmICgqYmQtPm9wdF9vcmRlciA+IGJkLT5ibG9ja19sZW5ndGgpIHsKLSAgICAgICAgICAgICpiZC0+b3B0X29yZGVyID0gYmQtPmJsb2NrX2xlbmd0aDsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUHJlZGljdG9yIG9yZGVyIHRvbyBsYXJnZS5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KICAgICAgICAgb3B0X29yZGVyID0gKmJkLT5vcHRfb3JkZXI7CiAKICAgICAgICAgaWYgKG9wdF9vcmRlcikgewpAQCAtNzI5LDcgKzczNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIHF1YW50X2NvZltrXSA9IGRlY29kZV9yaWNlKGdiLCByaWNlX3BhcmFtKSArIG9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgaWYgKHF1YW50X2NvZltrXSA8IC02NCB8fCBxdWFudF9jb2Zba10gPiA2MykgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInF1YW50X2NvZiAlIlBSSXUzMiIgaXMgb3V0IG9mIHJhbmdlLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicXVhbnRfY29mICUiUFJJZDMyIiBpcyBvdXQgb2YgcmFuZ2UuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50X2NvZltrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzUxLDcgKzc1Niw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZvciAoayA9IDI7IGsgPCBvcHRfb3JkZXI7IGsrKykKLSAgICAgICAgICAgICAgICBxdWFudF9jb2Zba10gPSAocXVhbnRfY29mW2tdIDw8IDE0KSArIChhZGRfYmFzZSA8PCAxMyk7CisgICAgICAgICAgICAgICAgcXVhbnRfY29mW2tdID0gKHF1YW50X2NvZltrXSAqICgxIDw8IDE0KSkgKyAoYWRkX2Jhc2UgPDwgMTMpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03NjUsOCArNzcwLDEzIEBACiAgICAgICAgICAgICBiZC0+bHRwX2dhaW5bMF0gICA9IGRlY29kZV9yaWNlKGdiLCAxKSA8PCAzOwogICAgICAgICAgICAgYmQtPmx0cF9nYWluWzFdICAgPSBkZWNvZGVfcmljZShnYiwgMikgPDwgMzsKIAotICAgICAgICAgICAgciAgICAgICAgICAgICAgICAgPSBnZXRfdW5hcnkoZ2IsIDAsIDMpOworICAgICAgICAgICAgciAgICAgICAgICAgICAgICAgPSBnZXRfdW5hcnkoZ2IsIDAsIDQpOwogICAgICAgICAgICAgYyAgICAgICAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICBpZiAociA+PSA0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJyIG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYmQtPmx0cF9nYWluWzJdICAgPSBsdHBfZ2Fpbl92YWx1ZXNbcl1bY107CiAKICAgICAgICAgICAgIGJkLT5sdHBfZ2FpblszXSAgID0gZGVjb2RlX3JpY2UoZ2IsIDIpIDw8IDM7CkBAIC04NTEsNyArODYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmVzID4+PSAxOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJfaykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzIDw8PSBjdXJfazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyAgKj0gMSA8PCBjdXJfazsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyAgfD0gZ2V0X2JpdHNfbG9uZyhnYiwgY3VyX2spOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtODY3LDkgKzg3Nyw2IEBACiAgICAgICAgICAgICAgICAgKmN1cnJlbnRfcmVzKysgPSBkZWNvZGVfcmljZShnYiwgc1tzYl0pOwogICAgICB9CiAKLSAgICBpZiAoIXNjb25mLT5tY19jb2RpbmcgfHwgY3R4LT5qc19zd2l0Y2gpCi0gICAgICAgIGFsaWduX2dldF9iaXRzKGdiKTsKLQogICAgIHJldHVybiAwOwogfQogCkBAIC05MTMsNyArOTIwLDcgQEAKIAogICAgIC8vIHJlY29uc3RydWN0IGFsbCBzYW1wbGVzIGZyb20gcmVzaWR1YWxzCiAgICAgaWYgKGJkLT5yYV9ibG9jaykgewotICAgICAgICBmb3IgKHNtcCA9IDA7IHNtcCA8IG9wdF9vcmRlcjsgc21wKyspIHsKKyAgICAgICAgZm9yIChzbXAgPSAwOyBzbXAgPCBGRk1JTihvcHRfb3JkZXIsIGJsb2NrX2xlbmd0aCk7IHNtcCsrKSB7CiAgICAgICAgICAgICB5ID0gMSA8PCAxOTsKIAogICAgICAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgc21wOyBzYisrKQpAQCAtOTg5LDYgKzk5Niw3IEBACiB7CiAgICAgaW50IHJldDsKICAgICBHZXRCaXRDb250ZXh0ICpnYiAgICAgICAgPSAmY3R4LT5nYjsKKyAgICBBTFNTcGVjaWZpY0NvbmZpZyAqc2NvbmYgPSAmY3R4LT5zY29uZjsKIAogICAgICpiZC0+c2hpZnRfbHNicyA9IDA7CiAgICAgLy8gcmVhZCBibG9jayB0eXBlIGZsYWcgYW5kIHJlYWQgdGhlIHNhbXBsZXMgYWNjb3JkaW5nbHkKQEAgLTk5OCw2ICsxMDA2LDkgQEAKICAgICAgICAgcmV0ID0gcmVhZF9jb25zdF9ibG9ja19kYXRhKGN0eCwgYmQpOwogICAgIH0KIAorICAgIGlmICghc2NvbmYtPm1jX2NvZGluZyB8fCBjdHgtPmpzX3N3aXRjaCkKKyAgICAgICAgYWxpZ25fZ2V0X2JpdHMoZ2IpOworCiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTI5MiwxMyArMTMwMywxMyBAQAogICAgICAgICAgICAgaWYgKGNoW2RlcF0udGltZV9kaWZmX3NpZ24pIHsKICAgICAgICAgICAgICAgICB0ICAgICAgPSAtdDsKICAgICAgICAgICAgICAgICBpZiAoYmVnaW4gPCB0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJiZWdpbiAldGQgc21hbGxlciB0aGFuIHRpbWUgZGlmZiBpbmRleCAlZC5cbiIsIGJlZ2luLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImJlZ2luICUiUFRSRElGRl9TUEVDSUZJRVIiIHNtYWxsZXIgdGhhbiB0aW1lIGRpZmYgaW5kZXggJWQuXG4iLCBiZWdpbiwgdCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBiZWdpbiAtPSB0OwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoZW5kIDwgdCkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5kICV0ZCBzbWFsbGVyIHRoYW4gdGltZSBkaWZmIGluZGV4ICVkLlxuIiwgZW5kLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVuZCAlIlBUUkRJRkZfU1BFQ0lGSUVSIiBzbWFsbGVyIHRoYW4gdGltZSBkaWZmIGluZGV4ICVkLlxuIiwgZW5kLCB0KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVuZCAgIC09IHQ7CkBAIC0xMzUwLDYgKzEzNjEsMjM4IEBACiB9CiAKIAorLyoqIG11bHRpcGx5IHR3byBzb2Z0ZmxvYXRzIGFuZCBoYW5kbGUgdGhlIHJvdW5kaW5nIG9mZgorICovCitzdGF0aWMgU29mdEZsb2F0X0lFRUU3NTQgbXVsdGlwbHkoU29mdEZsb2F0X0lFRUU3NTQgYSwgU29mdEZsb2F0X0lFRUU3NTQgYikgeworICAgIHVpbnQ2NF90IG1hbnRpc3NhX3RlbXA7CisgICAgdWludDY0X3QgbWFza182NDsKKyAgICBpbnQgY3V0b2ZmX2JpdF9jb3VudDsKKyAgICB1bnNpZ25lZCBjaGFyIGxhc3RfMl9iaXRzOworICAgIHVuc2lnbmVkIGludCBtYW50aXNzYTsKKyAgICBpbnQzMl90IHNpZ247CisgICAgdWludDMyX3QgcmV0dXJuX3ZhbCA9IDA7CisgICAgaW50IGJpdF9jb3VudCAgICAgICA9IDQ4OworCisgICAgc2lnbiA9IGEuc2lnbiBeIGIuc2lnbjsKKworICAgIC8vIE11bHRpcGx5IG1hbnRpc3NhIGJpdHMgaW4gYSA2NC1iaXQgcmVnaXN0ZXIKKyAgICBtYW50aXNzYV90ZW1wID0gKHVpbnQ2NF90KWEubWFudCAqICh1aW50NjRfdCliLm1hbnQ7CisgICAgbWFza182NCAgICAgICA9ICh1aW50NjRfdCkweDEgPDwgNDc7CisKKyAgICAvLyBDb3VudCB0aGUgdmFsaWQgYml0IGNvdW50CisgICAgd2hpbGUgKCEobWFudGlzc2FfdGVtcCAmIG1hc2tfNjQpICYmIG1hc2tfNjQpIHsKKyAgICAgICAgYml0X2NvdW50LS07CisgICAgICAgIG1hc2tfNjQgPj49IDE7CisgICAgfQorCisgICAgLy8gUm91bmQgb2ZmCisgICAgY3V0b2ZmX2JpdF9jb3VudCA9IGJpdF9jb3VudCAtIDI0OworICAgIGlmIChjdXRvZmZfYml0X2NvdW50ID4gMCkgeworICAgICAgICBsYXN0XzJfYml0cyA9ICh1bnNpZ25lZCBjaGFyKSgoKHVuc2lnbmVkIGludCltYW50aXNzYV90ZW1wID4+IChjdXRvZmZfYml0X2NvdW50IC0gMSkpICYgMHgzICk7CisgICAgICAgIGlmICgobGFzdF8yX2JpdHMgPT0gMHgzKSB8fCAoKGxhc3RfMl9iaXRzID09IDB4MSkgJiYgKCh1bnNpZ25lZCBpbnQpbWFudGlzc2FfdGVtcCAmICgoMHgxVUwgPDwgKGN1dG9mZl9iaXRfY291bnQgLSAxKSkgLSAxKSkpKSB7CisgICAgICAgICAgICAvLyBOZWVkIHRvIHJvdW5kIHVwCisgICAgICAgICAgICBtYW50aXNzYV90ZW1wICs9ICh1aW50NjRfdCkweDEgPDwgY3V0b2ZmX2JpdF9jb3VudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1hbnRpc3NhID0gKHVuc2lnbmVkIGludCkobWFudGlzc2FfdGVtcCA+PiBjdXRvZmZfYml0X2NvdW50KTsKKworICAgIC8vIE5lZWQgb25lIG1vcmUgc2hpZnQ/CisgICAgaWYgKG1hbnRpc3NhICYgMHgwMTAwMDAwMHVsKSB7CisgICAgICAgIGJpdF9jb3VudCsrOworICAgICAgICBtYW50aXNzYSA+Pj0gMTsKKyAgICB9CisKKyAgICBpZiAoIXNpZ24pIHsKKyAgICAgICAgcmV0dXJuX3ZhbCA9IDB4ODAwMDAwMDBVOworICAgIH0KKworICAgIHJldHVybl92YWwgfD0gKGEuZXhwICsgYi5leHAgKyBiaXRfY291bnQgLSA0NykgPDwgMjM7CisgICAgcmV0dXJuX3ZhbCB8PSBtYW50aXNzYTsKKyAgICByZXR1cm4gYXZfYml0czJzZl9pZWVlNzU0KHJldHVybl92YWwpOworfQorCisKKy8qKiBSZWFkIGFuZCBkZWNvZGUgdGhlIGZsb2F0aW5nIHBvaW50IHNhbXBsZSBkYXRhCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9kaWZmX2Zsb2F0X2RhdGEoQUxTRGVjQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgcmFfZnJhbWUpIHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggICA9IGN0eC0+YXZjdHg7CisgICAgR2V0Qml0Q29udGV4dCAqZ2IgICAgICAgPSAmY3R4LT5nYjsKKyAgICBTb2Z0RmxvYXRfSUVFRTc1NCAqYWNmICA9IGN0eC0+YWNmOworICAgIGludCAqc2hpZnRfdmFsdWUgICAgICAgID0gY3R4LT5zaGlmdF92YWx1ZTsKKyAgICBpbnQgKmxhc3Rfc2hpZnRfdmFsdWUgICA9IGN0eC0+bGFzdF9zaGlmdF92YWx1ZTsKKyAgICBpbnQgKmxhc3RfYWNmX21hbnRpc3NhICA9IGN0eC0+bGFzdF9hY2ZfbWFudGlzc2E7CisgICAgaW50ICoqcmF3X21hbnRpc3NhICAgICAgPSBjdHgtPnJhd19tYW50aXNzYTsKKyAgICBpbnQgKm5iaXRzICAgICAgICAgICAgICA9IGN0eC0+bmJpdHM7CisgICAgdW5zaWduZWQgY2hhciAqbGFycmF5ICAgPSBjdHgtPmxhcnJheTsKKyAgICBpbnQgZnJhbWVfbGVuZ3RoICAgICAgICA9IGN0eC0+Y3VyX2ZyYW1lX2xlbmd0aDsKKyAgICBTb2Z0RmxvYXRfSUVFRTc1NCBzY2FsZSA9IGF2X2ludDJzZl9pZWVlNzU0KDB4MXUsIDIzKTsKKyAgICB1bnNpZ25lZCBpbnQgcGFydEFfZmxhZzsKKyAgICB1bnNpZ25lZCBpbnQgaGlnaGVzdF9ieXRlOworICAgIHVuc2lnbmVkIGludCBzaGlmdF9hbXA7CisgICAgdWludDMyX3QgdG1wXzMyOworICAgIGludCB1c2VfYWNmOworICAgIGludCBuY2hhcnM7CisgICAgaW50IGk7CisgICAgaW50IGM7CisgICAgbG9uZyBrOworICAgIGxvbmcgbmJpdHNfYWxpZ25lZDsKKyAgICB1bnNpZ25lZCBsb25nIGFjYzsKKyAgICB1bnNpZ25lZCBsb25nIGo7CisgICAgdWludDMyX3Qgc2lnbjsKKyAgICB1aW50MzJfdCBlOworICAgIHVpbnQzMl90IG1hbnRpc3NhOworCisgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDMyKTsgLy9udW1fYnl0ZXNfZGlmZl9mbG9hdAorICAgIHVzZV9hY2YgPSBnZXRfYml0czEoZ2IpOworCisgICAgaWYgKHJhX2ZyYW1lKSB7CisgICAgICAgIG1lbXNldChsYXN0X2FjZl9tYW50aXNzYSwgMCwgYXZjdHgtPmNoYW5uZWxzICogc2l6ZW9mKCpsYXN0X2FjZl9tYW50aXNzYSkpOworICAgICAgICBtZW1zZXQobGFzdF9zaGlmdF92YWx1ZSwgIDAsIGF2Y3R4LT5jaGFubmVscyAqIHNpemVvZigqbGFzdF9zaGlmdF92YWx1ZSkgKTsKKyAgICAgICAgZmZfbWx6X2ZsdXNoX2RpY3QoY3R4LT5tbHopOworICAgIH0KKworICAgIGZvciAoYyA9IDA7IGMgPCBhdmN0eC0+Y2hhbm5lbHM7ICsrYykgeworICAgICAgICBpZiAodXNlX2FjZikgeworICAgICAgICAgICAgLy9hY2ZfZmxhZworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgICAgICB0bXBfMzIgPSBnZXRfYml0cyhnYiwgMjMpOworICAgICAgICAgICAgICAgIGxhc3RfYWNmX21hbnRpc3NhW2NdID0gdG1wXzMyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXBfMzIgPSBsYXN0X2FjZl9tYW50aXNzYVtjXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjZltjXSA9IGF2X2JpdHMyc2ZfaWVlZTc1NCh0bXBfMzIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWNmW2NdID0gRkxPQVRfMTsKKyAgICAgICAgfQorCisgICAgICAgIGhpZ2hlc3RfYnl0ZSA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgcGFydEFfZmxhZyAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgc2hpZnRfYW1wICAgID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAoc2hpZnRfYW1wKSB7CisgICAgICAgICAgICBzaGlmdF92YWx1ZVtjXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGxhc3Rfc2hpZnRfdmFsdWVbY10gPSBzaGlmdF92YWx1ZVtjXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNoaWZ0X3ZhbHVlW2NdID0gbGFzdF9zaGlmdF92YWx1ZVtjXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJ0QV9mbGFnKSB7CisgICAgICAgICAgICBpZiAoIWdldF9iaXRzMShnYikpIHsgLy91bmNvbXByZXNzZWQKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+cmF3X3NhbXBsZXNbY11baV0gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5yYXdfbWFudGlzc2FbY11baV0gPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvL2NvbXByZXNzZWQKKyAgICAgICAgICAgICAgICBuY2hhcnMgPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5yYXdfc2FtcGxlc1tjXVtpXSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuY2hhcnMgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRtcF8zMiA9IGZmX21sel9kZWNvbXByZXNzaW9uKGN0eC0+bWx6LCBnYiwgbmNoYXJzLCBsYXJyYXkpOworICAgICAgICAgICAgICAgIGlmKHRtcF8zMiAhPSBuY2hhcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluIE1MWiBkZWNvbXByZXNzaW9uICglIlBSSWQzMiIsICVkKS5cbiIsIHRtcF8zMiwgbmNoYXJzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lX2xlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+cmF3X21hbnRpc3NhW2NdW2ldID0gQVZfUkIzMihsYXJyYXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vZGVjb2RlIHBhcnQgQgorICAgICAgICBpZiAoaGlnaGVzdF9ieXRlKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5yYXdfc2FtcGxlc1tjXVtpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vVGhlIGZvbGxvd2luZyBsb2dpYyBpcyB0YWtlbiBmcm9tIFRhYmVsIDE0LjQ1IGFuZCAxNC40NiBmcm9tIHRoZSBJU08gc3BlYworICAgICAgICAgICAgICAgICAgICBpZiAoYXZfY21wX3NmX2llZWU3NTQoYWNmW2NdLCBGTE9BVF8xKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmJpdHNbaV0gPSAyMyAtIGF2X2xvZzIoYWJzKGN0eC0+cmF3X3NhbXBsZXNbY11baV0pKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5iaXRzW2ldID0gMjM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmJpdHNbaV0gPSBGRk1JTihuYml0c1tpXSwgaGlnaGVzdF9ieXRlKjgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7IC8vdW5jb21wcmVzc2VkCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lX2xlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdHgtPnJhd19zYW1wbGVzW2NdW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhd19tYW50aXNzYVtjXVtpXSA9IGdldF9iaXRzeihnYiwgbmJpdHNbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy9jb21wcmVzc2VkCisgICAgICAgICAgICAgICAgbmNoYXJzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+cmF3X3NhbXBsZXNbY11baV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5jaGFycyArPSAoaW50KSBuYml0c1tpXSAvIDg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmJpdHNbaV0gJiA3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytuY2hhcnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0bXBfMzIgPSBmZl9tbHpfZGVjb21wcmVzc2lvbihjdHgtPm1seiwgZ2IsIG5jaGFycywgbGFycmF5KTsKKyAgICAgICAgICAgICAgICBpZih0bXBfMzIgIT0gbmNoYXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbiBNTFogZGVjb21wcmVzc2lvbiAoJSJQUklkMzIiLCAlZCkuXG4iLCB0bXBfMzIsIG5jaGFycyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5yYXdfc2FtcGxlc1tjXVtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5iaXRzW2ldICYgNykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iaXRzX2FsaWduZWQgPSA4ICogKCh1bnNpZ25lZCBpbnQpKG5iaXRzW2ldIC8gOCkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJpdHNfYWxpZ25lZCA9IG5iaXRzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYWNjID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBuYml0c19hbGlnbmVkLzg7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjYyA9IChhY2MgPDwgOCkgKyBsYXJyYXlbaisrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFjYyA+Pj0gKG5iaXRzX2FsaWduZWQgLSBuYml0c1tpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICByYXdfbWFudGlzc2FbY11baV0gPSBhY2M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVfbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIFNvZnRGbG9hdF9JRUVFNzU0IHBjbV9zZiA9IGF2X2ludDJzZl9pZWVlNzU0KGN0eC0+cmF3X3NhbXBsZXNbY11baV0sIDApOworICAgICAgICAgICAgcGNtX3NmID0gYXZfZGl2X3NmX2llZWU3NTQocGNtX3NmLCBzY2FsZSk7CisKKyAgICAgICAgICAgIGlmIChjdHgtPnJhd19zYW1wbGVzW2NdW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWF2X2NtcF9zZl9pZWVlNzU0KGFjZltjXSwgRkxPQVRfMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGNtX3NmID0gbXVsdGlwbHkoYWNmW2NdLCBwY21fc2YpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNpZ24gPSBwY21fc2Yuc2lnbjsKKyAgICAgICAgICAgICAgICBlID0gcGNtX3NmLmV4cDsKKyAgICAgICAgICAgICAgICBtYW50aXNzYSA9IChwY21fc2YubWFudCB8IDB4ODAwMDAwKSArIHJhd19tYW50aXNzYVtjXVtpXTsKKworICAgICAgICAgICAgICAgIHdoaWxlKG1hbnRpc3NhID49IDB4MTAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICBlKys7CisgICAgICAgICAgICAgICAgICAgIG1hbnRpc3NhID4+PSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtYW50aXNzYSkgZSArPSAoc2hpZnRfdmFsdWVbY10gLSAxMjcpOworICAgICAgICAgICAgICAgIG1hbnRpc3NhICY9IDB4MDA3ZmZmZmZVTDsKKworICAgICAgICAgICAgICAgIHRtcF8zMiA9IChzaWduIDw8IDMxKSB8ICgoZSArIEVYUF9CSUFTKSA8PCAyMykgfCAobWFudGlzc2EpOworICAgICAgICAgICAgICAgIGN0eC0+cmF3X3NhbXBsZXNbY11baV0gPSB0bXBfMzI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN0eC0+cmF3X3NhbXBsZXNbY11baV0gPSByYXdfbWFudGlzc2FbY11baV0gJiAweDAwN2ZmZmZmVUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYWxpZ25fZ2V0X2JpdHMoZ2IpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCiAvKiogUmVhZCB0aGUgZnJhbWUgZGF0YS4KICAqLwogc3RhdGljIGludCByZWFkX2ZyYW1lX2RhdGEoQUxTRGVjQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgcmFfZnJhbWUpCkBAIC0xMzg4LDcgKzE2MzEsNyBAQAogICAgICAgICAgICAgICAgICAgICBpbmRlcGVuZGVudF9icyA9IDI7CiAKICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3QgY2hhbm5lbCwgaXQgaGFzIHRvIGJlIGRlY29kZWQgaW5kZXBlbmRlbnRseQotICAgICAgICAgICAgaWYgKGMgPT0gYXZjdHgtPmNoYW5uZWxzIC0gMSkKKyAgICAgICAgICAgIGlmIChjID09IGF2Y3R4LT5jaGFubmVscyAtIDEgfHwgKGMgJiAxKSkKICAgICAgICAgICAgICAgICBpbmRlcGVuZGVudF9icyA9IDE7CiAKICAgICAgICAgICAgIGlmIChpbmRlcGVuZGVudF9icykgewpAQCAtMTQ5MSw3ICsxNzM0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpjdHgtPnJhd19zYW1wbGVzW2NdKSAqIHNjb25mLT5tYXhfb3JkZXIpOwogICAgIH0KIAotICAgIC8vIFRPRE86IHJlYWRfZGlmZl9mbG9hdF9kYXRhCisgICAgaWYgKHNjb25mLT5mbG9hdGluZykgeworICAgICAgICByZWFkX2RpZmZfZmxvYXRfZGF0YShjdHgsIHJhX2ZyYW1lKTsKKyAgICB9CiAKICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJPdmVycmVhZCAlZFxuIiwgLWdldF9iaXRzX2xlZnQoZ2IpKTsKQEAgLTE2MzYsNiArMTg4MSw3IEBACiBzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgQUxTRGVjQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKIAogICAgIGF2X2ZyZWVwKCZjdHgtPnNjb25mLmNoYW5fcG9zKTsKIApAQCAtMTY2MSw2ICsxOTA3LDIyIEBACiAgICAgYXZfZnJlZXAoJmN0eC0+Y2hhbl9kYXRhX2J1ZmZlcik7CiAgICAgYXZfZnJlZXAoJmN0eC0+cmV2ZXJ0ZWRfY2hhbm5lbHMpOwogICAgIGF2X2ZyZWVwKCZjdHgtPmNyY19idWZmZXIpOworICAgIGlmIChjdHgtPm1seikgeworICAgICAgICBhdl9mcmVlcCgmY3R4LT5tbHotPmRpY3QpOworICAgICAgICBhdl9mcmVlcCgmY3R4LT5tbHopOworICAgIH0KKyAgICBhdl9mcmVlcCgmY3R4LT5hY2YpOworICAgIGF2X2ZyZWVwKCZjdHgtPmxhc3RfYWNmX21hbnRpc3NhKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5zaGlmdF92YWx1ZSk7CisgICAgYXZfZnJlZXAoJmN0eC0+bGFzdF9zaGlmdF92YWx1ZSk7CisgICAgaWYgKGN0eC0+cmF3X21hbnRpc3NhKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgYXZfZnJlZXAoJmN0eC0+cmF3X21hbnRpc3NhW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmY3R4LT5yYXdfbWFudGlzc2EpOworICAgIH0KKyAgICBhdl9mcmVlcCgmY3R4LT5sYXJyYXkpOworICAgIGF2X2ZyZWVwKCZjdHgtPm5iaXRzKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMTc5Nyw2ICsyMDU5LDMyIEBACiAgICAgY3R4LT5yYXdfYnVmZmVyICAgICAgID0gYXZfbWFsbG9jel9hcnJheShhdmN0eC0+Y2hhbm5lbHMgKiBjaGFubmVsX3NpemUsIHNpemVvZigqY3R4LT5yYXdfYnVmZmVyKSk7CiAgICAgY3R4LT5yYXdfc2FtcGxlcyAgICAgID0gYXZfbWFsbG9jX2FycmF5KGF2Y3R4LT5jaGFubmVscywgc2l6ZW9mKCpjdHgtPnJhd19zYW1wbGVzKSk7CiAKKyAgICBpZiAoc2NvbmYtPmZsb2F0aW5nKSB7CisgICAgICAgIGN0eC0+YWNmICAgICAgICAgICAgICAgPSBhdl9tYWxsb2NfYXJyYXkoYXZjdHgtPmNoYW5uZWxzLCBzaXplb2YoKmN0eC0+YWNmKSk7CisgICAgICAgIGN0eC0+c2hpZnRfdmFsdWUgICAgICAgPSBhdl9tYWxsb2NfYXJyYXkoYXZjdHgtPmNoYW5uZWxzLCBzaXplb2YoKmN0eC0+c2hpZnRfdmFsdWUpKTsKKyAgICAgICAgY3R4LT5sYXN0X3NoaWZ0X3ZhbHVlICA9IGF2X21hbGxvY19hcnJheShhdmN0eC0+Y2hhbm5lbHMsIHNpemVvZigqY3R4LT5sYXN0X3NoaWZ0X3ZhbHVlKSk7CisgICAgICAgIGN0eC0+bGFzdF9hY2ZfbWFudGlzc2EgPSBhdl9tYWxsb2NfYXJyYXkoYXZjdHgtPmNoYW5uZWxzLCBzaXplb2YoKmN0eC0+bGFzdF9hY2ZfbWFudGlzc2EpKTsKKyAgICAgICAgY3R4LT5yYXdfbWFudGlzc2EgICAgICA9IGF2X21hbGxvY3pfYXJyYXkoYXZjdHgtPmNoYW5uZWxzLCBzaXplb2YoKmN0eC0+cmF3X21hbnRpc3NhKSk7CisKKyAgICAgICAgY3R4LT5sYXJyYXkgPSBhdl9tYWxsb2NfYXJyYXkoY3R4LT5jdXJfZnJhbWVfbGVuZ3RoICogNCwgc2l6ZW9mKCpjdHgtPmxhcnJheSkpOworICAgICAgICBjdHgtPm5iaXRzICA9IGF2X21hbGxvY19hcnJheShjdHgtPmN1cl9mcmFtZV9sZW5ndGgsIHNpemVvZigqY3R4LT5uYml0cykpOworICAgICAgICBjdHgtPm1seiAgICA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjdHgtPm1seikpOworCisgICAgICAgIGlmICghY3R4LT5tbHogfHwgIWN0eC0+YWNmIHx8ICFjdHgtPnNoaWZ0X3ZhbHVlIHx8ICFjdHgtPmxhc3Rfc2hpZnRfdmFsdWUKKyAgICAgICAgICAgIHx8ICFjdHgtPmxhc3RfYWNmX21hbnRpc3NhIHx8ICFjdHgtPnJhd19tYW50aXNzYSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBbGxvY2F0aW5nIGJ1ZmZlciBtZW1vcnkgZmFpbGVkLlxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBmZl9tbHpfaW5pdF9kaWN0KGF2Y3R4LCBjdHgtPm1seik7CisgICAgICAgIGZmX21sel9mbHVzaF9kaWN0KGN0eC0+bWx6KTsKKworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYXZjdHgtPmNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgIGN0eC0+cmF3X21hbnRpc3NhW2NdID0gYXZfbWFsbG9jel9hcnJheShjdHgtPmN1cl9mcmFtZV9sZW5ndGgsIHNpemVvZigqKmN0eC0+cmF3X21hbnRpc3NhKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBhbGxvY2F0ZSBwcmV2aW91cyByYXcgc2FtcGxlIGJ1ZmZlcgogICAgIGlmICghY3R4LT5wcmV2X3Jhd19zYW1wbGVzIHx8ICFjdHgtPnJhd19idWZmZXJ8fCAhY3R4LT5yYXdfc2FtcGxlcykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkFsbG9jYXRpbmcgYnVmZmVyIG1lbW9yeSBmYWlsZWQuXG4iKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYW1mZW5jLmMgYi9saWJhdmNvZGVjL2FtZmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NGQ4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FtZmVuYy5jCkBAIC0wLDAgKzEsNzgwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpZiBDT05GSUdfRDNEMTFWQQorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfZDNkMTF2YS5oIgorI2VuZGlmCisjaWYgQ09ORklHX0RYVkEyCisjZGVmaW5lIENPQkpNQUNST1MKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X2R4dmEyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorCisjaW5jbHVkZSAiYW1mZW5jLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2lmIENPTkZJR19EM0QxMVZBCisjaW5jbHVkZSA8ZDNkMTEuaD4KKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisjaW5jbHVkZSAiY29tcGF0L3czMmRsZmNuLmgiCisjZWxzZQorI2luY2x1ZGUgPGRsZmNuLmg+CisjZW5kaWYKKworI2RlZmluZSBGRk1QRUdfQU1GX1dSSVRFUl9JRCBMImZmbXBlZ19hbWYiCisKKyNkZWZpbmUgUFRTX1BST1AgTCJQdHNQcm9wIgorCitjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfYW1mX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9OVjEyLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyNpZiBDT05GSUdfRDNEMTFWQQorICAgIEFWX1BJWF9GTVRfRDNEMTEsCisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICBBVl9QSVhfRk1UX0RYVkEyX1ZMRCwKKyNlbmRpZgorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgRm9ybWF0TWFwIHsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgICAgICAgYXZfZm9ybWF0OworICAgIGVudW0gQU1GX1NVUkZBQ0VfRk9STUFUICBhbWZfZm9ybWF0OworfSBGb3JtYXRNYXA7CisKK3N0YXRpYyBjb25zdCBGb3JtYXRNYXAgZm9ybWF0X21hcFtdID0KK3sKKyAgICB7IEFWX1BJWF9GTVRfTk9ORSwgICAgICAgQU1GX1NVUkZBQ0VfVU5LTk9XTiB9LAorICAgIHsgQVZfUElYX0ZNVF9OVjEyLCAgICAgICBBTUZfU1VSRkFDRV9OVjEyIH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjAsICAgICAgIEFNRl9TVVJGQUNFX0JHUkEgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCMCwgICAgICAgQU1GX1NVUkZBQ0VfUkdCQSB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZOCwgICAgICBBTUZfU1VSRkFDRV9HUkFZOCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgICBBTUZfU1VSRkFDRV9ZVVY0MjBQIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVWVY0MjIsICAgIEFNRl9TVVJGQUNFX1lVWTIgfSwKK307CisKK3N0YXRpYyBlbnVtIEFNRl9TVVJGQUNFX0ZPUk1BVCBhbWZfYXZfdG9fYW1mX2Zvcm1hdChlbnVtIEFWUGl4ZWxGb3JtYXQgZm10KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBhbWZfY291bnRvZihmb3JtYXRfbWFwKTsgaSsrKSB7CisgICAgICAgIGlmIChmb3JtYXRfbWFwW2ldLmF2X2Zvcm1hdCA9PSBmbXQpIHsKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXRfbWFwW2ldLmFtZl9mb3JtYXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFNRl9TVVJGQUNFX1VOS05PV047Cit9CisKK3N0YXRpYyB2b2lkIEFNRl9DREVDTF9DQUxMIEFNRlRyYWNlV3JpdGVyX1dyaXRlKEFNRlRyYWNlV3JpdGVyICpwVGhpcywKKyAgICBjb25zdCB3Y2hhcl90ICpzY29wZSwgY29uc3Qgd2NoYXJfdCAqbWVzc2FnZSkKK3sKKyAgICBBbWZUcmFjZVdyaXRlciAqdHJhY2VyID0gKEFtZlRyYWNlV3JpdGVyKilwVGhpczsKKyAgICBhdl9sb2codHJhY2VyLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiJWxzOiAlbHMiLCBzY29wZSwgbWVzc2FnZSk7IC8vIFxuIGlzIHByb3ZpZGVkIGZyb20gQU1GCit9CisKK3N0YXRpYyB2b2lkIEFNRl9DREVDTF9DQUxMIEFNRlRyYWNlV3JpdGVyX0ZsdXNoKEFNRlRyYWNlV3JpdGVyICpwVGhpcykKK3sKK30KKworc3RhdGljIEFNRlRyYWNlV3JpdGVyVnRibCB0cmFjZXJfdnRibCA9Cit7CisgICAgLldyaXRlID0gQU1GVHJhY2VXcml0ZXJfV3JpdGUsCisgICAgLkZsdXNoID0gQU1GVHJhY2VXcml0ZXJfRmx1c2gsCit9OworCitzdGF0aWMgaW50IGFtZl9sb2FkX2xpYnJhcnkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFtZkNvbnRleHQgICAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFNRkluaXRfRm4gICAgICAgICBpbml0X2Z1bjsKKyAgICBBTUZRdWVyeVZlcnNpb25fRm4gdmVyc2lvbl9mdW47CisgICAgQU1GX1JFU1VMVCAgICAgICAgIHJlczsKKworICAgIGN0eC0+ZGVsYXllZF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFjdHgtPmRlbGF5ZWRfZnJhbWUpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgLy8gaGFyZGNvZGVkIHRvIGN1cnJlbnQgSFcgcXVldWUgc2l6ZSAtIHdpbGwgcmVhbGxvYyBpbiB0aW1lc3RhbXBfcXVldWVfZW5xdWV1ZSgpIGlmIHRvbyBzbWFsbAorICAgIGN0eC0+dGltZXN0YW1wX2xpc3QgPSBhdl9maWZvX2FsbG9jKChhdmN0eC0+bWF4X2JfZnJhbWVzICsgMTYpICogc2l6ZW9mKGludDY0X3QpKTsKKyAgICBpZiAoIWN0eC0+dGltZXN0YW1wX2xpc3QpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgY3R4LT5kdHNfZGVsYXkgPSAwOworCisKKyAgICBjdHgtPmxpYnJhcnkgPSBkbG9wZW4oQU1GX0RMTF9OQU1FQSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgY3R4LT5saWJyYXJ5ICE9IE5VTEwsCisgICAgICAgIEFWRVJST1JfVU5LTk9XTiwgIkRMTCAlcyBmYWlsZWQgdG8gb3BlblxuIiwgQU1GX0RMTF9OQU1FQSk7CisKKyAgICBpbml0X2Z1biA9IChBTUZJbml0X0ZuKWRsc3ltKGN0eC0+bGlicmFyeSwgQU1GX0lOSVRfRlVOQ1RJT05fTkFNRSk7CisgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIGluaXRfZnVuICE9IE5VTEwsIEFWRVJST1JfVU5LTk9XTiwgIkRMTCAlcyBmYWlsZWQgdG8gZmluZCBmdW5jdGlvbiAlc1xuIiwgQU1GX0RMTF9OQU1FQSwgQU1GX0lOSVRfRlVOQ1RJT05fTkFNRSk7CisKKyAgICB2ZXJzaW9uX2Z1biA9IChBTUZRdWVyeVZlcnNpb25fRm4pZGxzeW0oY3R4LT5saWJyYXJ5LCBBTUZfUVVFUllfVkVSU0lPTl9GVU5DVElPTl9OQU1FKTsKKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgdmVyc2lvbl9mdW4gIT0gTlVMTCwgQVZFUlJPUl9VTktOT1dOLCAiRExMICVzIGZhaWxlZCB0byBmaW5kIGZ1bmN0aW9uICVzXG4iLCBBTUZfRExMX05BTUVBLCBBTUZfUVVFUllfVkVSU0lPTl9GVU5DVElPTl9OQU1FKTsKKworICAgIHJlcyA9IHZlcnNpb25fZnVuKCZjdHgtPnZlcnNpb24pOworICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCByZXMgPT0gQU1GX09LLCBBVkVSUk9SX1VOS05PV04sICIlcyBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgQU1GX1FVRVJZX1ZFUlNJT05fRlVOQ1RJT05fTkFNRSwgcmVzKTsKKyAgICByZXMgPSBpbml0X2Z1bihBTUZfRlVMTF9WRVJTSU9OLCAmY3R4LT5mYWN0b3J5KTsKKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9VTktOT1dOLCAiJXMgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIEFNRl9JTklUX0ZVTkNUSU9OX05BTUUsIHJlcyk7CisgICAgcmVzID0gY3R4LT5mYWN0b3J5LT5wVnRibC0+R2V0VHJhY2UoY3R4LT5mYWN0b3J5LCAmY3R4LT50cmFjZSk7CisgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHJlcyA9PSBBTUZfT0ssIEFWRVJST1JfVU5LTk9XTiwgIkdldFRyYWNlKCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJlcyk7CisgICAgcmVzID0gY3R4LT5mYWN0b3J5LT5wVnRibC0+R2V0RGVidWcoY3R4LT5mYWN0b3J5LCAmY3R4LT5kZWJ1Zyk7CisgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHJlcyA9PSBBTUZfT0ssIEFWRVJST1JfVU5LTk9XTiwgIkdldERlYnVnKCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJlcyk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNpZiBDT05GSUdfRDNEMTFWQQorc3RhdGljIGludCBhbWZfaW5pdF9mcm9tX2QzZDExX2RldmljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRDNEMTFWQURldmljZUNvbnRleHQgKmh3Y3R4KQoreworICAgIEFtZkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQU1GX1JFU1VMVCByZXM7CisKKyAgICByZXMgPSBjdHgtPmNvbnRleHQtPnBWdGJsLT5Jbml0RFgxMShjdHgtPmNvbnRleHQsIGh3Y3R4LT5kZXZpY2UsIEFNRl9EWDExXzEpOworICAgIGlmIChyZXMgIT0gQU1GX09LKSB7CisgICAgICAgIGlmIChyZXMgPT0gQU1GX05PVF9TVVBQT1JURUQpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkFNRiB2aWEgRDNEMTEgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgZ2l2ZW4gZGV2aWNlLlxuIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQU1GIGZhaWxlZCB0byBpbml0aWFsaXNlIG9uIHRoZSBnaXZlbiBEM0QxMSBkZXZpY2U6ICVkLlxuIiwgcmVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PREVWKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWYgQ09ORklHX0RYVkEyCitzdGF0aWMgaW50IGFtZl9pbml0X2Zyb21fZHh2YTJfZGV2aWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZEWFZBMkRldmljZUNvbnRleHQgKmh3Y3R4KQoreworICAgIEFtZkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgSEFORExFIGRldmljZV9oYW5kbGU7CisgICAgSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlOworICAgIEhSRVNVTFQgaHI7CisgICAgQU1GX1JFU1VMVCByZXM7CisgICAgaW50IHJldDsKKworICAgIGhyID0gSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfT3BlbkRldmljZUhhbmRsZShod2N0eC0+ZGV2bWdyLCAmZGV2aWNlX2hhbmRsZSk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBkZXZpY2UgaGFuZGxlIGZvciBEaXJlY3QzRDkgZGV2aWNlOiAlbHguXG4iLCAodW5zaWduZWQgbG9uZylocik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGhyID0gSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfTG9ja0RldmljZShod2N0eC0+ZGV2bWdyLCBkZXZpY2VfaGFuZGxlLCAmZGV2aWNlLCBGQUxTRSk7CisgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICAgICAgSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfVW5sb2NrRGV2aWNlKGh3Y3R4LT5kZXZtZ3IsIGRldmljZV9oYW5kbGUsIEZBTFNFKTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBsb2NrIGRldmljZSBoYW5kbGUgZm9yIERpcmVjdDNEOSBkZXZpY2U6ICVseC5cbiIsICh1bnNpZ25lZCBsb25nKWhyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOV9DbG9zZURldmljZUhhbmRsZShod2N0eC0+ZGV2bWdyLCBkZXZpY2VfaGFuZGxlKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmVzID0gY3R4LT5jb250ZXh0LT5wVnRibC0+SW5pdERYOShjdHgtPmNvbnRleHQsIGRldmljZSk7CisKKyAgICBJRGlyZWN0M0REZXZpY2U5X1JlbGVhc2UoZGV2aWNlKTsKKworICAgIGlmIChyZXMgIT0gQU1GX09LKSB7CisgICAgICAgIGlmIChyZXMgPT0gQU1GX05PVF9TVVBQT1JURUQpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkFNRiB2aWEgRDNEOSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBnaXZlbiBkZXZpY2UuXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBTUYgZmFpbGVkIHRvIGluaXRpYWxpc2Ugb24gZ2l2ZW4gRDNEOSBkZXZpY2U6ICVkLlxuIiwgcmVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PREVWKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGFtZl9pbml0X2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFtZkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQU1GX1JFU1VMVCAgcmVzOworICAgIGF2X3VudXNlZCBpbnQgcmV0OworCisgICAgY3R4LT5od3N1cmZhY2VzX2luX3F1ZXVlID0gMDsKKyAgICBjdHgtPmh3c3VyZmFjZXNfaW5fcXVldWVfbWF4ID0gMTY7CisKKyAgICAvLyBjb25maWd1cmUgQU1GIGxvZ2dlcgorICAgIC8vIHRoZSByZXR1cm4gb2YgdGhlc2UgZnVuY3Rpb25zIGluZGljYXRlcyBvbGQgc3RhdGUgYW5kIGRvIG5vdCBhZmZlY3QgYmVoYXZpb3VyCisgICAgY3R4LT50cmFjZS0+cFZ0YmwtPkVuYWJsZVdyaXRlcihjdHgtPnRyYWNlLCBBTUZfVFJBQ0VfV1JJVEVSX0RFQlVHX09VVFBVVCwgY3R4LT5sb2dfdG9fZGJnICE9IDAgKTsKKyAgICBpZiAoY3R4LT5sb2dfdG9fZGJnKQorICAgICAgICBjdHgtPnRyYWNlLT5wVnRibC0+U2V0V3JpdGVyTGV2ZWwoY3R4LT50cmFjZSwgQU1GX1RSQUNFX1dSSVRFUl9ERUJVR19PVVRQVVQsIEFNRl9UUkFDRV9UUkFDRSk7CisgICAgY3R4LT50cmFjZS0+cFZ0YmwtPkVuYWJsZVdyaXRlcihjdHgtPnRyYWNlLCBBTUZfVFJBQ0VfV1JJVEVSX0NPTlNPTEUsIDApOworICAgIGN0eC0+dHJhY2UtPnBWdGJsLT5TZXRHbG9iYWxMZXZlbChjdHgtPnRyYWNlLCBBTUZfVFJBQ0VfVFJBQ0UpOworCisgICAgLy8gY29ubmVjdCBBTUYgbG9nZ2VyIHRvIGF2X2xvZworICAgIGN0eC0+dHJhY2VyLnZ0YmwgPSAmdHJhY2VyX3Z0Ymw7CisgICAgY3R4LT50cmFjZXIuYXZjdHggPSBhdmN0eDsKKyAgICBjdHgtPnRyYWNlLT5wVnRibC0+UmVnaXN0ZXJXcml0ZXIoY3R4LT50cmFjZSwgRkZNUEVHX0FNRl9XUklURVJfSUQsKEFNRlRyYWNlV3JpdGVyKikmY3R4LT50cmFjZXIsIDEpOworICAgIGN0eC0+dHJhY2UtPnBWdGJsLT5TZXRXcml0ZXJMZXZlbChjdHgtPnRyYWNlLCBGRk1QRUdfQU1GX1dSSVRFUl9JRCwgQU1GX1RSQUNFX1RSQUNFKTsKKworICAgIHJlcyA9IGN0eC0+ZmFjdG9yeS0+cFZ0YmwtPkNyZWF0ZUNvbnRleHQoY3R4LT5mYWN0b3J5LCAmY3R4LT5jb250ZXh0KTsKKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9VTktOT1dOLCAiQ3JlYXRlQ29udGV4dCgpIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCByZXMpOworCisgICAgLy8gSWYgYSBkZXZpY2Ugd2FzIHBhc3NlZCB0byB0aGUgZW5jb2RlciwgdHJ5IHRvIGluaXRpYWxpc2UgZnJvbSB0aGF0LgorICAgIGlmIChhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAqZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICAgICAgaWYgKGFtZl9hdl90b19hbWZfZm9ybWF0KGZyYW1lc19jdHgtPnN3X2Zvcm1hdCkgPT0gQU1GX1NVUkZBQ0VfVU5LTk9XTikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGb3JtYXQgb2YgaW5wdXQgZnJhbWVzIGNvbnRleHQgKCVzKSBpcyBub3Qgc3VwcG9ydGVkIGJ5IEFNRi5cbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShmcmFtZXNfY3R4LT5zd19mb3JtYXQpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGZyYW1lc19jdHgtPmRldmljZV9jdHgtPnR5cGUpIHsKKyNpZiBDT05GSUdfRDNEMTFWQQorICAgICAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfRDNEMTFWQToKKyAgICAgICAgICAgIHJldCA9IGFtZl9pbml0X2Zyb21fZDNkMTFfZGV2aWNlKGF2Y3R4LCBmcmFtZXNfY3R4LT5kZXZpY2VfY3R4LT5od2N0eCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICAgICAgY2FzZSBBVl9IV0RFVklDRV9UWVBFX0RYVkEyOgorICAgICAgICAgICAgcmV0ID0gYW1mX2luaXRfZnJvbV9keHZhMl9kZXZpY2UoYXZjdHgsIGZyYW1lc19jdHgtPmRldmljZV9jdHgtPmh3Y3R4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBTUYgaW5pdGlhbGlzYXRpb24gZnJvbSBhICVzIGZyYW1lcyBjb250ZXh0IGlzIG5vdCBzdXBwb3J0ZWQuXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X2h3ZGV2aWNlX2dldF90eXBlX25hbWUoZnJhbWVzX2N0eC0+ZGV2aWNlX2N0eC0+dHlwZSkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoYXZjdHgtPmh3X2ZyYW1lc19jdHgpOworICAgICAgICBpZiAoIWN0eC0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaWYgKGZyYW1lc19jdHgtPmluaXRpYWxfcG9vbF9zaXplID4gMCkKKyAgICAgICAgICAgIGN0eC0+aHdzdXJmYWNlc19pbl9xdWV1ZV9tYXggPSBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSAtIDE7CisKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgIEFWSFdEZXZpY2VDb250ZXh0ICpkZXZpY2VfY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0KilhdmN0eC0+aHdfZGV2aWNlX2N0eC0+ZGF0YTsKKworICAgICAgICBzd2l0Y2ggKGRldmljZV9jdHgtPnR5cGUpIHsKKyNpZiBDT05GSUdfRDNEMTFWQQorICAgICAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfRDNEMTFWQToKKyAgICAgICAgICAgIHJldCA9IGFtZl9pbml0X2Zyb21fZDNkMTFfZGV2aWNlKGF2Y3R4LCBkZXZpY2VfY3R4LT5od2N0eCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICAgICAgY2FzZSBBVl9IV0RFVklDRV9UWVBFX0RYVkEyOgorICAgICAgICAgICAgcmV0ID0gYW1mX2luaXRfZnJvbV9keHZhMl9kZXZpY2UoYXZjdHgsIGRldmljZV9jdHgtPmh3Y3R4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBicmVhazsKKyNlbmRpZgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBTUYgaW5pdGlhbGlzYXRpb24gZnJvbSBhICVzIGRldmljZSBpcyBub3Qgc3VwcG9ydGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9od2RldmljZV9nZXRfdHlwZV9uYW1lKGRldmljZV9jdHgtPnR5cGUpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPmh3X2RldmljZV9jdHggPSBhdl9idWZmZXJfcmVmKGF2Y3R4LT5od19kZXZpY2VfY3R4KTsKKyAgICAgICAgaWYgKCFjdHgtPmh3X2RldmljZV9jdHgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzID0gY3R4LT5jb250ZXh0LT5wVnRibC0+SW5pdERYMTEoY3R4LT5jb250ZXh0LCBOVUxMLCBBTUZfRFgxMV8xKTsKKyAgICAgICAgaWYgKHJlcyA9PSBBTUZfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJBTUYgaW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkIHZpYSBEM0QxMS5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gY3R4LT5jb250ZXh0LT5wVnRibC0+SW5pdERYOShjdHgtPmNvbnRleHQsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBBTUZfT0spIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQU1GIGluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCB2aWEgRDNEOS5cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkFNRiBpbml0aWFsaXNhdGlvbiBmYWlsZWQgdmlhIEQzRDk6IGVycm9yICVkLlxuIiwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZl9pbml0X2VuY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFtZkNvbnRleHQgICAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHdjaGFyX3QgICAgICpjb2RlY19pZCA9IE5VTEw7CisgICAgQU1GX1JFU1VMVCAgICAgICAgIHJlczsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgeworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6CisgICAgICAgICAgICBjb2RlY19pZCA9IEFNRlZpZGVvRW5jb2RlclZDRV9BVkM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IRVZDOgorICAgICAgICAgICAgY29kZWNfaWQgPSBBTUZWaWRlb0VuY29kZXJfSEVWQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCBjb2RlY19pZCAhPSBOVUxMLCBBVkVSUk9SKEVJTlZBTCksICJDb2RlYyAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBhdmN0eC0+Y29kZWMtPmlkKTsKKworICAgIGlmIChjdHgtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgIHBpeF9mbXQgPSAoKEFWSFdGcmFtZXNDb250ZXh0KiljdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGEpLT5zd19mb3JtYXQ7CisgICAgZWxzZQorICAgICAgICBwaXhfZm10ID0gYXZjdHgtPnBpeF9mbXQ7CisKKyAgICBjdHgtPmZvcm1hdCA9IGFtZl9hdl90b19hbWZfZm9ybWF0KHBpeF9mbXQpOworICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCBjdHgtPmZvcm1hdCAhPSBBTUZfU1VSRkFDRV9VTktOT1dOLCBBVkVSUk9SKEVJTlZBTCksCisgICAgICAgICAgICAgICAgICAgICAgICAiRm9ybWF0ICVzIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGF2X2dldF9waXhfZm10X25hbWUocGl4X2ZtdCkpOworCisgICAgcmVzID0gY3R4LT5mYWN0b3J5LT5wVnRibC0+Q3JlYXRlQ29tcG9uZW50KGN0eC0+ZmFjdG9yeSwgY3R4LT5jb250ZXh0LCBjb2RlY19pZCwgJmN0eC0+ZW5jb2Rlcik7CisgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHJlcyA9PSBBTUZfT0ssIEFWRVJST1JfRU5DT0RFUl9OT1RfRk9VTkQsICJDcmVhdGVDb21wb25lbnQoJWxzKSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgY29kZWNfaWQsIHJlcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X2NvbGQgZmZfYW1mX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQW1mQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChjdHgtPmRlbGF5ZWRfc3VyZmFjZSkgeworICAgICAgICBjdHgtPmRlbGF5ZWRfc3VyZmFjZS0+cFZ0YmwtPlJlbGVhc2UoY3R4LT5kZWxheWVkX3N1cmZhY2UpOworICAgICAgICBjdHgtPmRlbGF5ZWRfc3VyZmFjZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZW5jb2RlcikgeworICAgICAgICBjdHgtPmVuY29kZXItPnBWdGJsLT5UZXJtaW5hdGUoY3R4LT5lbmNvZGVyKTsKKyAgICAgICAgY3R4LT5lbmNvZGVyLT5wVnRibC0+UmVsZWFzZShjdHgtPmVuY29kZXIpOworICAgICAgICBjdHgtPmVuY29kZXIgPSBOVUxMOworICAgIH0KKworICAgIGlmIChjdHgtPmNvbnRleHQpIHsKKyAgICAgICAgY3R4LT5jb250ZXh0LT5wVnRibC0+VGVybWluYXRlKGN0eC0+Y29udGV4dCk7CisgICAgICAgIGN0eC0+Y29udGV4dC0+cFZ0YmwtPlJlbGVhc2UoY3R4LT5jb250ZXh0KTsKKyAgICAgICAgY3R4LT5jb250ZXh0ID0gTlVMTDsKKyAgICB9CisgICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPmh3X2RldmljZV9jdHgpOworICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5od19mcmFtZXNfY3R4KTsKKworICAgIGlmIChjdHgtPnRyYWNlKSB7CisgICAgICAgIGN0eC0+dHJhY2UtPnBWdGJsLT5VbnJlZ2lzdGVyV3JpdGVyKGN0eC0+dHJhY2UsIEZGTVBFR19BTUZfV1JJVEVSX0lEKTsKKyAgICB9CisgICAgaWYgKGN0eC0+bGlicmFyeSkgeworICAgICAgICBkbGNsb3NlKGN0eC0+bGlicmFyeSk7CisgICAgICAgIGN0eC0+bGlicmFyeSA9IE5VTEw7CisgICAgfQorICAgIGN0eC0+dHJhY2UgPSBOVUxMOworICAgIGN0eC0+ZGVidWcgPSBOVUxMOworICAgIGN0eC0+ZmFjdG9yeSA9IE5VTEw7CisgICAgY3R4LT52ZXJzaW9uID0gMDsKKyAgICBjdHgtPmRlbGF5ZWRfZHJhaW4gPSAwOworICAgIGF2X2ZyYW1lX2ZyZWUoJmN0eC0+ZGVsYXllZF9mcmFtZSk7CisgICAgYXZfZmlmb19mcmVlcCgmY3R4LT50aW1lc3RhbXBfbGlzdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWZfY29weV9zdXJmYWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgQU1GU3VyZmFjZSogc3VyZmFjZSkKK3sKKyAgICBBTUZQbGFuZSAqcGxhbmU7CisgICAgdWludDhfdCAgKmRzdF9kYXRhWzRdOworICAgIGludCAgICAgICBkc3RfbGluZXNpemVbNF07CisgICAgaW50ICAgICAgIHBsYW5lczsKKyAgICBpbnQgICAgICAgaTsKKworICAgIHBsYW5lcyA9IHN1cmZhY2UtPnBWdGJsLT5HZXRQbGFuZXNDb3VudChzdXJmYWNlKTsKKyAgICBhdl9hc3NlcnQwKHBsYW5lcyA8IEZGX0FSUkFZX0VMRU1TKGRzdF9kYXRhKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspIHsKKyAgICAgICAgcGxhbmUgPSBzdXJmYWNlLT5wVnRibC0+R2V0UGxhbmVBdChzdXJmYWNlLCBpKTsKKyAgICAgICAgZHN0X2RhdGFbaV0gPSBwbGFuZS0+cFZ0YmwtPkdldE5hdGl2ZShwbGFuZSk7CisgICAgICAgIGRzdF9saW5lc2l6ZVtpXSA9IHBsYW5lLT5wVnRibC0+R2V0SFBpdGNoKHBsYW5lKTsKKyAgICB9CisgICAgYXZfaW1hZ2VfY29weShkc3RfZGF0YSwgZHN0X2xpbmVzaXplLAorICAgICAgICAoY29uc3QgdWludDhfdCoqKWZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsIGZyYW1lLT5mb3JtYXQsCisgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGltZXN0YW1wX3F1ZXVlX2VucXVldWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKyAgICBBbWZDb250ZXh0ICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaWYgKGF2X2ZpZm9fc3BhY2UoY3R4LT50aW1lc3RhbXBfbGlzdCkgPCBzaXplb2YodGltZXN0YW1wKSkgeworICAgICAgICBpZiAoYXZfZmlmb19ncm93KGN0eC0+dGltZXN0YW1wX2xpc3QsIHNpemVvZih0aW1lc3RhbXApKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGN0eC0+dGltZXN0YW1wX2xpc3QsICZ0aW1lc3RhbXAsIHNpemVvZih0aW1lc3RhbXApLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbWZfY29weV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LCBBTUZCdWZmZXIgKmJ1ZmZlcikKK3sKKyAgICBBbWZDb250ZXh0ICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50ICAgICAgICAgICAgICByZXQ7CisgICAgQU1GVmFyaWFudFN0cnVjdCB2YXIgPSB7MH07CisgICAgaW50NjRfdCAgICAgICAgICB0aW1lc3RhbXAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBpbnQ2NF90ICAgICAgICAgIHNpemUgPSBidWZmZXItPnBWdGJsLT5HZXRTaXplKGJ1ZmZlcik7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgc2l6ZSwgMCkpIDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtZW1jcHkocGt0LT5kYXRhLCBidWZmZXItPnBWdGJsLT5HZXROYXRpdmUoYnVmZmVyKSwgc2l6ZSk7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlYy0+aWQpIHsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OgorICAgICAgICAgICAgYnVmZmVyLT5wVnRibC0+R2V0UHJvcGVydHkoYnVmZmVyLCBBTUZfVklERU9fRU5DT0RFUl9PVVRQVVRfREFUQV9UWVBFLCAmdmFyKTsKKyAgICAgICAgICAgIGlmKHZhci5pbnQ2NFZhbHVlID09IEFNRl9WSURFT19FTkNPREVSX09VVFBVVF9EQVRBX1RZUEVfSURSKSB7CisgICAgICAgICAgICAgICAgcGt0LT5mbGFncyA9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgICAgICBidWZmZXItPnBWdGJsLT5HZXRQcm9wZXJ0eShidWZmZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfT1VUUFVUX0RBVEFfVFlQRSwgJnZhcik7CisgICAgICAgICAgICBpZiAodmFyLmludDY0VmFsdWUgPT0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19PVVRQVVRfREFUQV9UWVBFX0lEUikgeworICAgICAgICAgICAgICAgIHBrdC0+ZmxhZ3MgPSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGJ1ZmZlci0+cFZ0YmwtPkdldFByb3BlcnR5KGJ1ZmZlciwgUFRTX1BST1AsICZ2YXIpOworCisgICAgcGt0LT5wdHMgPSB2YXIuaW50NjRWYWx1ZTsgLy8gb3JpZ2luYWwgcHRzCisKKworICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCBhdl9maWZvX3NpemUoY3R4LT50aW1lc3RhbXBfbGlzdCkgPiAwLCBBVkVSUk9SX1VOS05PV04sICJ0aW1lc3RhbXBfbGlzdCBpcyBlbXB0eVxuIik7CisKKyAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChjdHgtPnRpbWVzdGFtcF9saXN0LCAmdGltZXN0YW1wLCBzaXplb2YodGltZXN0YW1wKSwgTlVMTCk7CisKKyAgICAvLyBjYWxjIGR0cyBzaGlmdCBpZiBtYXhfYl9mcmFtZXMgPiAwCisgICAgaWYgKGF2Y3R4LT5tYXhfYl9mcmFtZXMgPiAwICYmIGN0eC0+ZHRzX2RlbGF5ID09IDApIHsKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBfbGFzdCA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgYXZfZmlmb19zaXplKGN0eC0+dGltZXN0YW1wX2xpc3QpID4gMCwgQVZFUlJPUl9VTktOT1dOLAorICAgICAgICAgICAgInRpbWVzdGFtcF9saXN0IGlzIGVtcHR5IHdoaWxlIG1heF9iX2ZyYW1lcyA9ICVkXG4iLCBhdmN0eC0+bWF4X2JfZnJhbWVzKTsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3BlZWtfYXQoCisgICAgICAgICAgICBjdHgtPnRpbWVzdGFtcF9saXN0LAorICAgICAgICAgICAgJnRpbWVzdGFtcF9sYXN0LAorICAgICAgICAgICAgKGF2X2ZpZm9fc2l6ZShjdHgtPnRpbWVzdGFtcF9saXN0KSAvIHNpemVvZih0aW1lc3RhbXApIC0gMSkgKiBzaXplb2YodGltZXN0YW1wX2xhc3QpLAorICAgICAgICAgICAgc2l6ZW9mKHRpbWVzdGFtcF9sYXN0KSwKKyAgICAgICAgICAgIE5VTEwpOworICAgICAgICBpZiAodGltZXN0YW1wIDwgMCB8fCB0aW1lc3RhbXBfbGFzdCA8IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworICAgICAgICB9CisgICAgICAgIGN0eC0+ZHRzX2RlbGF5ID0gdGltZXN0YW1wX2xhc3QgLSB0aW1lc3RhbXA7CisgICAgfQorICAgIHBrdC0+ZHRzID0gdGltZXN0YW1wIC0gY3R4LT5kdHNfZGVsYXk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIGFtZmVuYyBBUEkgaW1wbGVtZW50YXRpb24KK2ludCBmZl9hbWZfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGFtZl9sb2FkX2xpYnJhcnkoYXZjdHgpKSA9PSAwKSB7CisgICAgICAgIGlmICgocmV0ID0gYW1mX2luaXRfY29udGV4dChhdmN0eCkpID09IDApIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYW1mX2luaXRfZW5jb2RlcihhdmN0eCkpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmZl9hbWZfZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQU1GX1JFU1VMVCBhbWZfc2V0X3Byb3BlcnR5X2J1ZmZlcihBTUZTdXJmYWNlICpvYmplY3QsIGNvbnN0IHdjaGFyX3QgKm5hbWUsIEFNRkJ1ZmZlciAqdmFsKQoreworICAgIEFNRl9SRVNVTFQgcmVzOworICAgIEFNRlZhcmlhbnRTdHJ1Y3QgdmFyOworICAgIHJlcyA9IEFNRlZhcmlhbnRJbml0KCZ2YXIpOworICAgIGlmIChyZXMgPT0gQU1GX09LKSB7CisgICAgICAgIEFNRkd1aWQgZ3VpZF9BTUZJbnRlcmZhY2UgPSBJSURfQU1GSW50ZXJmYWNlKCk7CisgICAgICAgIEFNRkludGVyZmFjZSAqYW1mX2ludGVyZmFjZTsKKyAgICAgICAgcmVzID0gdmFsLT5wVnRibC0+UXVlcnlJbnRlcmZhY2UodmFsLCAmZ3VpZF9BTUZJbnRlcmZhY2UsICh2b2lkKiopJmFtZl9pbnRlcmZhY2UpOworCisgICAgICAgIGlmIChyZXMgPT0gQU1GX09LKSB7CisgICAgICAgICAgICByZXMgPSBBTUZWYXJpYW50QXNzaWduSW50ZXJmYWNlKCZ2YXIsIGFtZl9pbnRlcmZhY2UpOworICAgICAgICAgICAgYW1mX2ludGVyZmFjZS0+cFZ0YmwtPlJlbGVhc2UoYW1mX2ludGVyZmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyA9PSBBTUZfT0spIHsKKyAgICAgICAgICAgIHJlcyA9IG9iamVjdC0+cFZ0YmwtPlNldFByb3BlcnR5KG9iamVjdCwgbmFtZSwgdmFyKTsKKyAgICAgICAgfQorICAgICAgICBBTUZWYXJpYW50Q2xlYXIoJnZhcik7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBBTUZfUkVTVUxUIGFtZl9nZXRfcHJvcGVydHlfYnVmZmVyKEFNRkRhdGEgKm9iamVjdCwgY29uc3Qgd2NoYXJfdCAqbmFtZSwgQU1GQnVmZmVyICoqdmFsKQoreworICAgIEFNRl9SRVNVTFQgcmVzOworICAgIEFNRlZhcmlhbnRTdHJ1Y3QgdmFyOworICAgIHJlcyA9IEFNRlZhcmlhbnRJbml0KCZ2YXIpOworICAgIGlmIChyZXMgPT0gQU1GX09LKSB7CisgICAgICAgIHJlcyA9IG9iamVjdC0+cFZ0YmwtPkdldFByb3BlcnR5KG9iamVjdCwgbmFtZSwgJnZhcik7CisgICAgICAgIGlmIChyZXMgPT0gQU1GX09LKSB7CisgICAgICAgICAgICBpZiAodmFyLnR5cGUgPT0gQU1GX1ZBUklBTlRfSU5URVJGQUNFKSB7CisgICAgICAgICAgICAgICAgQU1GR3VpZCBndWlkX0FNRkJ1ZmZlciA9IElJRF9BTUZCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICBBTUZJbnRlcmZhY2UgKmFtZl9pbnRlcmZhY2UgPSBBTUZWYXJpYW50SW50ZXJmYWNlKCZ2YXIpOworICAgICAgICAgICAgICAgIHJlcyA9IGFtZl9pbnRlcmZhY2UtPnBWdGJsLT5RdWVyeUludGVyZmFjZShhbWZfaW50ZXJmYWNlLCAmZ3VpZF9BTUZCdWZmZXIsICh2b2lkKiopdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gQU1GX0lOVkFMSURfREFUQV9UWVBFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFNRlZhcmlhbnRDbGVhcigmdmFyKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIEFNRkJ1ZmZlciAqYW1mX2NyZWF0ZV9idWZmZXJfd2l0aF9mcmFtZV9yZWYoY29uc3QgQVZGcmFtZSAqZnJhbWUsIEFNRkNvbnRleHQgKmNvbnRleHQpCit7CisgICAgQVZGcmFtZSAqZnJhbWVfcmVmOworICAgIEFNRkJ1ZmZlciAqZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyID0gTlVMTDsKKyAgICBBTUZfUkVTVUxUIHJlczsKKworICAgIHJlcyA9IGNvbnRleHQtPnBWdGJsLT5BbGxvY0J1ZmZlcihjb250ZXh0LCBBTUZfTUVNT1JZX0hPU1QsIHNpemVvZihmcmFtZV9yZWYpLCAmZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyKTsKKyAgICBpZiAocmVzID09IEFNRl9PSykgeworICAgICAgICBmcmFtZV9yZWYgPSBhdl9mcmFtZV9jbG9uZShmcmFtZSk7CisgICAgICAgIGlmIChmcmFtZV9yZWYpIHsKKyAgICAgICAgICAgIG1lbWNweShmcmFtZV9yZWZfc3RvcmFnZV9idWZmZXItPnBWdGJsLT5HZXROYXRpdmUoZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyKSwgJmZyYW1lX3JlZiwgc2l6ZW9mKGZyYW1lX3JlZikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyLT5wVnRibC0+UmVsZWFzZShmcmFtZV9yZWZfc3RvcmFnZV9idWZmZXIpOworICAgICAgICAgICAgZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyOworfQorCitzdGF0aWMgdm9pZCBhbWZfcmVsZWFzZV9idWZmZXJfd2l0aF9mcmFtZV9yZWYoQU1GQnVmZmVyICpmcmFtZV9yZWZfc3RvcmFnZV9idWZmZXIpCit7CisgICAgQVZGcmFtZSAqZnJhbWVfcmVmOworICAgIG1lbWNweSgmZnJhbWVfcmVmLCBmcmFtZV9yZWZfc3RvcmFnZV9idWZmZXItPnBWdGJsLT5HZXROYXRpdmUoZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyKSwgc2l6ZW9mKGZyYW1lX3JlZikpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lX3JlZik7CisgICAgZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyLT5wVnRibC0+UmVsZWFzZShmcmFtZV9yZWZfc3RvcmFnZV9idWZmZXIpOworfQorCitpbnQgZmZfYW1mX3NlbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBbWZDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFNRlN1cmZhY2UgKnN1cmZhY2U7CisgICAgQU1GX1JFU1VMVCAgcmVzOworICAgIGludCAgICAgICAgIHJldDsKKworICAgIGlmICghY3R4LT5lbmNvZGVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKCFmcmFtZSkgeyAvLyBzdWJtaXQgZHJhaW4KKyAgICAgICAgaWYgKCFjdHgtPmVvZikgeyAvLyBzdWJtaXQgZHJhaW4gb25lIHRpbWUgb25seQorICAgICAgICAgICAgaWYgKGN0eC0+ZGVsYXllZF9zdXJmYWNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjdHgtPmRlbGF5ZWRfZHJhaW4gPSAxOyAvLyBpbnB1dCBxdWV1ZSBpcyBmdWxsOiByZXN1Ym1pdCBEcmFpbigpIGluIGZmX2FtZl9yZWNlaXZlX3BhY2tldAorICAgICAgICAgICAgfSBlbHNlIGlmKCFjdHgtPmRlbGF5ZWRfZHJhaW4pIHsKKyAgICAgICAgICAgICAgICByZXMgPSBjdHgtPmVuY29kZXItPnBWdGJsLT5EcmFpbihjdHgtPmVuY29kZXIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQU1GX0lOUFVUX0ZVTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5kZWxheWVkX2RyYWluID0gMTsgLy8gaW5wdXQgcXVldWUgaXMgZnVsbDogcmVzdWJtaXQgRHJhaW4oKSBpbiBmZl9hbWZfcmVjZWl2ZV9wYWNrZXQKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IEFNRl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5lb2YgPSAxOyAvLyBkcmFpbiBzdGFydGVkCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHJlcyA9PSBBTUZfT0ssIEFWRVJST1JfVU5LTk9XTiwgIkRyYWluKCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzdWJtaXQgZnJhbWUKKyAgICAgICAgaW50IGh3X3N1cmZhY2UgPSAwOworCisgICAgICAgIGlmIChjdHgtPmRlbGF5ZWRfc3VyZmFjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOyAvLyBzaG91bGQgbm90IGhhcHBlbiB3aGVuIGNhbGxlZCBmcm9tIGZmbXBlZywgb3RoZXIgY2xpZW50cyBtYXkgcmVzdWJtaXQKKyAgICAgICAgfQorICAgICAgICAvLyBwcmVwYXJlIHN1cmZhY2UgZnJvbSBmcmFtZQorICAgICAgICBzd2l0Y2ggKGZyYW1lLT5mb3JtYXQpIHsKKyNpZiBDT05GSUdfRDNEMTFWQQorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfRDNEMTE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEdVSUQgQU1GVGV4dHVyZUFycmF5SW5kZXhHVUlEID0geyAweDI4MTE1NTI3LCAweGU3YzMsIDB4NGI2NiwgeyAweDk5LCAweGQzLCAweDRmLCAweDJhLCAweGU2LCAweGI0LCAweDdmLCAweGFmIH0gfTsKKyAgICAgICAgICAgICAgICBJRDNEMTFUZXh0dXJlMkQgKnRleHR1cmUgPSAoSUQzRDExVGV4dHVyZTJEKilmcmFtZS0+ZGF0YVswXTsgLy8gYWN0dWFsIHRleHR1cmUKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAoaW50cHRyX3QpZnJhbWUtPmRhdGFbMV07IC8vIGluZGV4IGlzIGEgc2xpY2UgaW4gdGV4dHVyZSBhcnJheSBpcyAtIHNldCB0byB0ZWxsIEFNRiB3aGljaCBzbGljZSB0byB1c2UKKworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoZnJhbWUtPmh3X2ZyYW1lc19jdHggICAgICAgJiYgY3R4LT5od19mcmFtZXNfY3R4ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+aHdfZnJhbWVzX2N0eC0+ZGF0YSA9PSBjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGEpOworCisgICAgICAgICAgICAgICAgdGV4dHVyZS0+bHBWdGJsLT5TZXRQcml2YXRlRGF0YSh0ZXh0dXJlLCAmQU1GVGV4dHVyZUFycmF5SW5kZXhHVUlELCBzaXplb2YoaW5kZXgpLCAmaW5kZXgpOworCisgICAgICAgICAgICAgICAgcmVzID0gY3R4LT5jb250ZXh0LT5wVnRibC0+Q3JlYXRlU3VyZmFjZUZyb21EWDExTmF0aXZlKGN0eC0+Y29udGV4dCwgdGV4dHVyZSwgJnN1cmZhY2UsIE5VTEwpOyAvLyB3cmFwIHRvIEFNRiBzdXJmYWNlCisgICAgICAgICAgICAgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHJlcyA9PSBBTUZfT0ssIEFWRVJST1IoRU5PTUVNKSwgIkNyZWF0ZVN1cmZhY2VGcm9tRFgxMU5hdGl2ZSgpIGZhaWxlZCAgd2l0aCBlcnJvciAlZFxuIiwgcmVzKTsKKworICAgICAgICAgICAgICAgIGh3X3N1cmZhY2UgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0RYVkEyX1ZMRDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJRGlyZWN0M0RTdXJmYWNlOSAqdGV4dHVyZSA9IChJRGlyZWN0M0RTdXJmYWNlOSAqKWZyYW1lLT5kYXRhWzNdOyAvLyBhY3R1YWwgdGV4dHVyZQorCisgICAgICAgICAgICAgICAgcmVzID0gY3R4LT5jb250ZXh0LT5wVnRibC0+Q3JlYXRlU3VyZmFjZUZyb21EWDlOYXRpdmUoY3R4LT5jb250ZXh0LCB0ZXh0dXJlLCAmc3VyZmFjZSwgTlVMTCk7IC8vIHdyYXAgdG8gQU1GIHN1cmZhY2UKKyAgICAgICAgICAgICAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUihFTk9NRU0pLCAiQ3JlYXRlU3VyZmFjZUZyb21EWDlOYXRpdmUoKSBmYWlsZWQgIHdpdGggZXJyb3IgJWRcbiIsIHJlcyk7CisKKyAgICAgICAgICAgICAgICBod19zdXJmYWNlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmVzID0gY3R4LT5jb250ZXh0LT5wVnRibC0+QWxsb2NTdXJmYWNlKGN0eC0+Y29udGV4dCwgQU1GX01FTU9SWV9IT1NULCBjdHgtPmZvcm1hdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAmc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHJlcyA9PSBBTUZfT0ssIEFWRVJST1IoRU5PTUVNKSwgIkFsbG9jU3VyZmFjZSgpIGZhaWxlZCAgd2l0aCBlcnJvciAlZFxuIiwgcmVzKTsKKyAgICAgICAgICAgICAgICBhbWZfY29weV9zdXJmYWNlKGF2Y3R4LCBmcmFtZSwgc3VyZmFjZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChod19zdXJmYWNlKSB7CisgICAgICAgICAgICBBTUZCdWZmZXIgKmZyYW1lX3JlZl9zdG9yYWdlX2J1ZmZlcjsKKworICAgICAgICAgICAgLy8gaW5wdXQgSFcgc3VyZmFjZXMgY2FuIGJlIHZlcnRpY2FsbHkgYWxpZ25lZCBieSAxNjsgdGVsbCBBTUYgdGhlIHJlYWwgc2l6ZQorICAgICAgICAgICAgc3VyZmFjZS0+cFZ0YmwtPlNldENyb3Aoc3VyZmFjZSwgMCwgMCwgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0KTsKKworICAgICAgICAgICAgZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyID0gYW1mX2NyZWF0ZV9idWZmZXJfd2l0aF9mcmFtZV9yZWYoZnJhbWUsIGN0eC0+Y29udGV4dCk7CisgICAgICAgICAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyICE9IE5VTEwsIEFWRVJST1IoRU5PTUVNKSwgImNyZWF0ZV9idWZmZXJfd2l0aF9mcmFtZV9yZWYoKSByZXR1cm5lZCBOVUxMXG4iKTsKKworICAgICAgICAgICAgcmVzID0gYW1mX3NldF9wcm9wZXJ0eV9idWZmZXIoc3VyZmFjZSwgTCJhdl9mcmFtZV9yZWYiLCBmcmFtZV9yZWZfc3RvcmFnZV9idWZmZXIpOworICAgICAgICAgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHJlcyA9PSBBTUZfT0ssIEFWRVJST1JfVU5LTk9XTiwgIlNldFByb3BlcnR5IGZhaWxlZCBmb3IgXCJhdl9mcmFtZV9yZWZcIiB3aXRoIGVycm9yICVkXG4iLCByZXMpOworICAgICAgICAgICAgY3R4LT5od3N1cmZhY2VzX2luX3F1ZXVlKys7CisgICAgICAgICAgICBmcmFtZV9yZWZfc3RvcmFnZV9idWZmZXItPnBWdGJsLT5SZWxlYXNlKGZyYW1lX3JlZl9zdG9yYWdlX2J1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBzdXJmYWNlLT5wVnRibC0+U2V0UHRzKHN1cmZhY2UsIGZyYW1lLT5wdHMpOworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgc3VyZmFjZSwgUFRTX1BST1AsIGZyYW1lLT5wdHMpOworCisgICAgICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgeworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6CisgICAgICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgc3VyZmFjZSwgQU1GX1ZJREVPX0VOQ09ERVJfSU5TRVJUX0FVRCwgISFjdHgtPmF1ZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IRVZDOgorICAgICAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIHN1cmZhY2UsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfSU5TRVJUX0FVRCwgISFjdHgtPmF1ZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKworICAgICAgICAvLyBzdWJtaXQgc3VyZmFjZQorICAgICAgICByZXMgPSBjdHgtPmVuY29kZXItPnBWdGJsLT5TdWJtaXRJbnB1dChjdHgtPmVuY29kZXIsIChBTUZEYXRhKilzdXJmYWNlKTsKKyAgICAgICAgaWYgKHJlcyA9PSBBTUZfSU5QVVRfRlVMTCkgeyAvLyBoYW5kbGUgZnVsbCBxdWV1ZQorICAgICAgICAgICAgLy9zdG9yZSBzdXJmYWNlIGZvciBsYXRlciBzdWJtaXNzaW9uCisgICAgICAgICAgICBjdHgtPmRlbGF5ZWRfc3VyZmFjZSA9IHN1cmZhY2U7CisgICAgICAgICAgICBpZiAoc3VyZmFjZS0+cFZ0YmwtPkdldE1lbW9yeVR5cGUoc3VyZmFjZSkgPT0gQU1GX01FTU9SWV9EWDExKSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfcmVmKGN0eC0+ZGVsYXllZF9mcmFtZSwgZnJhbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3VyZmFjZS0+cFZ0YmwtPlJlbGVhc2Uoc3VyZmFjZSk7CisgICAgICAgICAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9VTktOT1dOLCAiU3VibWl0SW5wdXQoKSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmVzKTsKKworICAgICAgICAgICAgaWYgKChyZXQgPSB0aW1lc3RhbXBfcXVldWVfZW5xdWV1ZShhdmN0eCwgZnJhbWUtPnB0cykpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KK2ludCBmZl9hbWZfcmVjZWl2ZV9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50ICAgICAgICAgICAgIHJldDsKKyAgICBBTUZfUkVTVUxUICAgICAgcmVzOworICAgIEFNRl9SRVNVTFQgICAgICByZXNfcXVlcnk7CisgICAgQW1mQ29udGV4dCAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQU1GRGF0YSAgICAgICAgKmRhdGEgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICBibG9ja19hbmRfd2FpdDsKKworICAgIGlmICghY3R4LT5lbmNvZGVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgZG8geworICAgICAgICBibG9ja19hbmRfd2FpdCA9IDA7CisgICAgICAgIC8vIHBvbGwgZGF0YQorICAgICAgICByZXNfcXVlcnkgPSBjdHgtPmVuY29kZXItPnBWdGJsLT5RdWVyeU91dHB1dChjdHgtPmVuY29kZXIsICZkYXRhKTsKKyAgICAgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgICAgIC8vIGNvcHkgZGF0YSB0byBwYWNrZXQKKyAgICAgICAgICAgIEFNRkJ1ZmZlciogYnVmZmVyOworICAgICAgICAgICAgQU1GR3VpZCBndWlkID0gSUlEX0FNRkJ1ZmZlcigpOworICAgICAgICAgICAgZGF0YS0+cFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKGRhdGEsICZndWlkLCAodm9pZCoqKSZidWZmZXIpOyAvLyBxdWVyeSBmb3IgYnVmZmVyIGludGVyZmFjZQorICAgICAgICAgICAgcmV0ID0gYW1mX2NvcHlfYnVmZmVyKGF2Y3R4LCBhdnBrdCwgYnVmZmVyKTsKKworICAgICAgICAgICAgYnVmZmVyLT5wVnRibC0+UmVsZWFzZShidWZmZXIpOworCisgICAgICAgICAgICBpZiAoZGF0YS0+cFZ0YmwtPkhhc1Byb3BlcnR5KGRhdGEsIEwiYXZfZnJhbWVfcmVmIikpIHsKKyAgICAgICAgICAgICAgICBBTUZCdWZmZXIgKmZyYW1lX3JlZl9zdG9yYWdlX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICByZXMgPSBhbWZfZ2V0X3Byb3BlcnR5X2J1ZmZlcihkYXRhLCBMImF2X2ZyYW1lX3JlZiIsICZmcmFtZV9yZWZfc3RvcmFnZV9idWZmZXIpOworICAgICAgICAgICAgICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCByZXMgPT0gQU1GX09LLCBBVkVSUk9SX1VOS05PV04sICJHZXRQcm9wZXJ0eSBmYWlsZWQgZm9yIFwiYXZfZnJhbWVfcmVmXCIgd2l0aCBlcnJvciAlZFxuIiwgcmVzKTsKKyAgICAgICAgICAgICAgICBhbWZfcmVsZWFzZV9idWZmZXJfd2l0aF9mcmFtZV9yZWYoZnJhbWVfcmVmX3N0b3JhZ2VfYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBjdHgtPmh3c3VyZmFjZXNfaW5fcXVldWUtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGF0YS0+cFZ0YmwtPlJlbGVhc2UoZGF0YSk7CisKKyAgICAgICAgICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCByZXQgPj0gMCwgcmV0LCAiYW1mX2NvcHlfYnVmZmVyKCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJldCk7CisKKyAgICAgICAgICAgIGlmIChjdHgtPmRlbGF5ZWRfc3VyZmFjZSAhPSBOVUxMKSB7IC8vIHRyeSB0byByZXN1Ym1pdCBmcmFtZQorICAgICAgICAgICAgICAgIHJlcyA9IGN0eC0+ZW5jb2Rlci0+cFZ0YmwtPlN1Ym1pdElucHV0KGN0eC0+ZW5jb2RlciwgKEFNRkRhdGEqKWN0eC0+ZGVsYXllZF9zdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IEFNRl9JTlBVVF9GVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzID0gY3R4LT5kZWxheWVkX3N1cmZhY2UtPnBWdGJsLT5HZXRQdHMoY3R4LT5kZWxheWVkX3N1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICBjdHgtPmRlbGF5ZWRfc3VyZmFjZS0+cFZ0YmwtPlJlbGVhc2UoY3R4LT5kZWxheWVkX3N1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICBjdHgtPmRlbGF5ZWRfc3VyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGN0eC0+ZGVsYXllZF9mcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCByZXMgPT0gQU1GX09LLCBBVkVSUk9SX1VOS05PV04sICJSZXBlYXRlZCBTdWJtaXRJbnB1dCgpIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCByZXMpOworCisgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gdGltZXN0YW1wX3F1ZXVlX2VucXVldWUoYXZjdHgsIHB0cykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEYXRhIGFjcXVpcmVkIGJ1dCBkZWxheWVkIGZyYW1lIHN1Ym1pc3Npb24gZ290IEFNRl9JTlBVVF9GVUxMLSBzaG91bGQgbm90IGhhcHBlblxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjdHgtPmRlbGF5ZWRfZHJhaW4pIHsgLy8gdHJ5IHRvIHJlc3VibWl0IGRyYWluCisgICAgICAgICAgICAgICAgcmVzID0gY3R4LT5lbmNvZGVyLT5wVnRibC0+RHJhaW4oY3R4LT5lbmNvZGVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IEFNRl9JTlBVVF9GVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+ZGVsYXllZF9kcmFpbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+ZW9mID0gMTsgLy8gZHJhaW4gc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9VTktOT1dOLCAiUmVwZWF0ZWQgRHJhaW4oKSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGF0YSBhY3F1aXJlZCBidXQgZGVsYXllZCBkcmFpbiBzdWJtaXNzaW9uIGdvdCBBTUZfSU5QVVRfRlVMTC0gc2hvdWxkIG5vdCBoYXBwZW5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjdHgtPmRlbGF5ZWRfc3VyZmFjZSAhPSBOVUxMIHx8IGN0eC0+ZGVsYXllZF9kcmFpbiB8fCAoY3R4LT5lb2YgJiYgcmVzX3F1ZXJ5ICE9IEFNRl9FT0YpIHx8IChjdHgtPmh3c3VyZmFjZXNfaW5fcXVldWUgPj0gY3R4LT5od3N1cmZhY2VzX2luX3F1ZXVlX21heCkpIHsKKyAgICAgICAgICAgIGJsb2NrX2FuZF93YWl0ID0gMTsKKyAgICAgICAgICAgIGF2X3VzbGVlcCgxMDAwKTsgLy8gd2FpdCBhbmQgcG9sbCBhZ2FpbgorICAgICAgICB9CisgICAgfSB3aGlsZSAoYmxvY2tfYW5kX3dhaXQpOworCisgICAgaWYgKHJlc19xdWVyeSA9PSBBTUZfRU9GKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgIH0gZWxzZSBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUFHQUlOKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hbWZlbmMuaCBiL2xpYmF2Y29kZWMvYW1mZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjEzNjE4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYW1mZW5jLmgKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyoKKyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisqLworCisjaWZuZGVmIEFWQ09ERUNfQU1GRU5DX0gKKyNkZWZpbmUgQVZDT0RFQ19BTUZFTkNfSAorCisjaW5jbHVkZSA8QU1GL2NvcmUvRmFjdG9yeS5oPgorCisjaW5jbHVkZSA8QU1GL2NvbXBvbmVudHMvVmlkZW9FbmNvZGVyVkNFLmg+CisjaW5jbHVkZSA8QU1GL2NvbXBvbmVudHMvVmlkZW9FbmNvZGVySEVWQy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKworCisvKioKKyogQU1GIHRyYWNlIHdyaXRlciBjYWxsYmFjayBjbGFzcworKiBVc2VkIHRvIGNhcHR1cmUgYWxsIEFNRiBsb2dnaW5nCisqLworCit0eXBlZGVmIHN0cnVjdCBBbWZUcmFjZVdyaXRlciB7CisgICAgQU1GVHJhY2VXcml0ZXJWdGJsICp2dGJsOworICAgIEFWQ29kZWNDb250ZXh0ICAgICAqYXZjdHg7Cit9IEFtZlRyYWNlV3JpdGVyOworCisvKioKKyogQU1GIGVuY29kZXIgY29udGV4dAorKi8KKwordHlwZWRlZiBzdHJ1Y3QgQW1mQ29udGV4dCB7CisgICAgQVZDbGFzcyAgICAgICAgICAgICphdmNsYXNzOworICAgIC8vIGFjY2VzcyB0byBBTUYgcnVudGltZQorICAgIGFtZl9oYW5kbGUgICAgICAgICAgbGlicmFyeTsgLy8vPCBoYW5kbGUgdG8gRExMIGxpYnJhcnkKKyAgICBBTUZGYWN0b3J5ICAgICAgICAgKmZhY3Rvcnk7IC8vLzwgcG9pbnRlciB0byBBTUYgZmFjdG9yeQorICAgIEFNRkRlYnVnICAgICAgICAgICAqZGVidWc7ICAgLy8vPCBwb2ludGVyIHRvIEFNRiBkZWJ1ZyBpbnRlcmZhY2UKKyAgICBBTUZUcmFjZSAgICAgICAgICAgKnRyYWNlOyAgIC8vLzwgcG9pbnRlciB0byBBTUYgdHJhY2UgaW50ZXJmYWNlCisKKyAgICBhbWZfdWludDY0ICAgICAgICAgIHZlcnNpb247IC8vLzwgdmVyc2lvbiBvZiBBTUYgcnVudGltZQorICAgIEFtZlRyYWNlV3JpdGVyICAgICAgdHJhY2VyOyAgLy8vPCBBTUYgd3JpdGVyIHJlZ2lzdGVyZWQgd2l0aCBBTUYKKyAgICBBTUZDb250ZXh0ICAgICAgICAgKmNvbnRleHQ7IC8vLzwgQU1GIGNvbnRleHQKKyAgICAvL2VuY29kZXIKKyAgICBBTUZDb21wb25lbnQgICAgICAgKmVuY29kZXI7IC8vLzwgQU1GIGVuY29kZXIgb2JqZWN0CisgICAgYW1mX2Jvb2wgICAgICAgICAgICBlb2Y7ICAgICAvLy88IGZsYWcgaW5kaWNhdGluZyBFT0YgaGFwcGVuZWQKKyAgICBBTUZfU1VSRkFDRV9GT1JNQVQgIGZvcm1hdDsgIC8vLzwgQU1GIHN1cmZhY2UgZm9ybWF0CisKKyAgICBBVkJ1ZmZlclJlZiAgICAgICAgKmh3X2RldmljZV9jdHg7IC8vLzwgcG9pbnRlciB0byBIVyBhY2NlbGVyYXRvciAoZGVjb2RlcikKKyAgICBBVkJ1ZmZlclJlZiAgICAgICAgKmh3X2ZyYW1lc19jdHg7IC8vLzwgcG9pbnRlciB0byBIVyBhY2NlbGVyYXRvciAoZnJhbWUgYWxsb2NhdG9yKQorCisgICAgaW50ICAgICAgICAgICAgICAgICBod3N1cmZhY2VzX2luX3F1ZXVlOworICAgIGludCAgICAgICAgICAgICAgICAgaHdzdXJmYWNlc19pbl9xdWV1ZV9tYXg7CisKKyAgICAvLyBoZWxwZXJzIHRvIGhhbmRsZSBhc3luYyBjYWxscworICAgIGludCAgICAgICAgICAgICAgICAgZGVsYXllZF9kcmFpbjsKKyAgICBBTUZTdXJmYWNlICAgICAgICAgKmRlbGF5ZWRfc3VyZmFjZTsKKyAgICBBVkZyYW1lICAgICAgICAgICAgKmRlbGF5ZWRfZnJhbWU7CisKKyAgICAvLyBzaGlmdCBkdHMgYmFjayBieSBtYXhfYl9mcmFtZXMgaW4gdGltaW5nCisgICAgQVZGaWZvQnVmZmVyICAgICAgICp0aW1lc3RhbXBfbGlzdDsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgIGR0c19kZWxheTsKKworICAgIC8vIGNvbW1vbiBlbmNvZGVyIG9wdGlvbiBvcHRpb25zCisKKyAgICBpbnQgICAgICAgICAgICAgICAgIGxvZ190b19kYmc7CisKKyAgICAvLyBTdGF0aWMgb3B0aW9ucywgaGF2ZSB0byBiZSBzZXQgYmVmb3JlIEluaXQoKSBjYWxsCisgICAgaW50ICAgICAgICAgICAgICAgICB1c2FnZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHByb2ZpbGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBsZXZlbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHByZWFuYWx5c2lzOworICAgIGludCAgICAgICAgICAgICAgICAgcXVhbGl0eTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGJfZnJhbWVfZGVsdGFfcXA7CisgICAgaW50ICAgICAgICAgICAgICAgICByZWZfYl9mcmFtZV9kZWx0YV9xcDsKKworICAgIC8vIER5bmFtaWMgb3B0aW9ucywgY2FuIGJlIHNldCBhZnRlciBJbml0KCkgY2FsbAorCisgICAgaW50ICAgICAgICAgICAgICAgICByYXRlX2NvbnRyb2xfbW9kZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGVuZm9yY2VfaHJkOworICAgIGludCAgICAgICAgICAgICAgICAgZmlsbGVyX2RhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICBlbmFibGVfdmJhcTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHNraXBfZnJhbWU7CisgICAgaW50ICAgICAgICAgICAgICAgICBxcF9pOworICAgIGludCAgICAgICAgICAgICAgICAgcXBfcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHFwX2I7CisgICAgaW50ICAgICAgICAgICAgICAgICBtYXhfYXVfc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIGhlYWRlcl9zcGFjaW5nOworICAgIGludCAgICAgICAgICAgICAgICAgYl9mcmFtZV9yZWY7CisgICAgaW50ICAgICAgICAgICAgICAgICBpbnRyYV9yZWZyZXNoX21iOworICAgIGludCAgICAgICAgICAgICAgICAgY29kaW5nX21vZGU7CisgICAgaW50ICAgICAgICAgICAgICAgICBtZV9oYWxmX3BlbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1lX3F1YXJ0ZXJfcGVsOworICAgIGludCAgICAgICAgICAgICAgICAgYXVkOworCisgICAgLy8gSEVWQyAtIHNwZWNpZmljIG9wdGlvbnMKKworICAgIGludCAgICAgICAgICAgICAgICAgZ29wc19wZXJfaWRyOworICAgIGludCAgICAgICAgICAgICAgICAgaGVhZGVyX2luc2VydGlvbl9tb2RlOworICAgIGludCAgICAgICAgICAgICAgICAgbWluX3FwX2k7CisgICAgaW50ICAgICAgICAgICAgICAgICBtYXhfcXBfaTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG1pbl9xcF9wOworICAgIGludCAgICAgICAgICAgICAgICAgbWF4X3FwX3A7CisgICAgaW50ICAgICAgICAgICAgICAgICB0aWVyOworfSBBbWZDb250ZXh0OworCisvKioKKyogQ29tbW9uIGVuY29kZXIgaW5pdGl6YXRpb24gZnVuY3Rpb24KKyovCitpbnQgZmZfYW1mX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisvKioKKyogQ29tbW9uIGVuY29kZXIgdGVybWluYXRpb24gZnVuY3Rpb24KKyovCitpbnQgZmZfYW1mX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKioKKyogRWNvZGluZyBvbmUgZnJhbWUgLSBjb21tb24gZnVuY3Rpb24gZm9yIGFsbCBBTUYgZW5jb2RlcnMKKyovCisKK2ludCBmZl9hbWZfc2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKK2ludCBmZl9hbWZfcmVjZWl2ZV9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QpOworCisvKioKKyogU3VwcG9ydGVkIGZvcm1hdHMKKyovCitleHRlcm4gY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGZmX2FtZl9waXhfZm10c1tdOworCisvKioKKyogRXJyb3IgaGFuZGxpbmcgaGVscGVyCisqLworI2RlZmluZSBBTUZfUkVUVVJOX0lGX0ZBTFNFKGF2Y3R4LCBleHAsIHJldF92YWx1ZSwgLyptZXNzYWdlLCovIC4uLikgXAorICAgIGlmICghKGV4cCkpIHsgXAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgX19WQV9BUkdTX18pOyBcCisgICAgICAgIHJldHVybiByZXRfdmFsdWU7IFwKKyAgICB9CisKKyNlbmRpZiAvL0FWQ09ERUNfQU1GRU5DX0gKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYW1mZW5jX2gyNjQuYyBiL2xpYmF2Y29kZWMvYW1mZW5jX2gyNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzA4MmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hbWZlbmNfaDI2NC5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhbWZlbmMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBbWZDb250ZXh0LCB4KQorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgLy8gU3RhdGljCisgICAgLy8vIFVzYWdlCisgICAgeyAidXNhZ2UiLCAgICAgICAgICAiRW5jb2RlciBVc2FnZSIsICAgICAgICBPRkZTRVQodXNhZ2UpLCAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX1VTQUdFX1RSQU5TQ09ORElORyAgICAgIH0sIEFNRl9WSURFT19FTkNPREVSX1VTQUdFX1RSQU5TQ09ORElORywgQU1GX1ZJREVPX0VOQ09ERVJfVVNBR0VfV0VCQ0FNLCBWRSwgInVzYWdlIiB9LAorICAgIHsgInRyYW5zY29kaW5nIiwgICAgIkdlbmVyaWMgVHJhbnNjb2RpbmciLCAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9VU0FHRV9UUkFOU0NPTkRJTkcgICAgICB9LCAwLCAwLCBWRSwgInVzYWdlIiB9LAorICAgIHsgInVsdHJhbG93bGF0ZW5jeSIsIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9VU0FHRV9VTFRSQV9MT1dfTEFURU5DWSB9LCAwLCAwLCBWRSwgInVzYWdlIiB9LAorICAgIHsgImxvd2xhdGVuY3kiLCAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9VU0FHRV9MT1dfTEFURU5DWSAgICAgICB9LCAwLCAwLCBWRSwgInVzYWdlIiB9LAorICAgIHsgIndlYmNhbSIsICAgICAgICAgIldlYmNhbSIsICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9VU0FHRV9XRUJDQU0gICAgICAgICAgICB9LCAwLCAwLCBWRSwgInVzYWdlIiB9LAorCisgICAgLy8vIFByb2ZpbGUsCisgICAgeyAicHJvZmlsZSIsICAgICAgICAiUHJvZmlsZSIsICAgICAgICAgICAgICBPRkZTRVQocHJvZmlsZSksQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX1BST0ZJTEVfTUFJTiAgICAgICAgICAgICAgICAgfSwgQU1GX1ZJREVPX0VOQ09ERVJfUFJPRklMRV9CQVNFTElORSwgQU1GX1ZJREVPX0VOQ09ERVJfUFJPRklMRV9DT05TVFJBSU5FRF9ISUdILCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAibWFpbiIsICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX1BST0ZJTEVfTUFJTiAgICAgICAgICAgICAgICAgfSwgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImhpZ2giLCAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9QUk9GSUxFX0hJR0ggICAgICAgICAgICAgICAgIH0sIDAsIDAsIFZFLCAicHJvZmlsZSIgfSwKKyAgICB7ICJjb25zdHJhaW5lZF9iYXNlbGluZSIsICIiLCAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfUFJPRklMRV9DT05TVFJBSU5FRF9CQVNFTElORSB9LCAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAiY29uc3RyYWluZWRfaGlnaCIsICAgICAiIiwgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX1BST0ZJTEVfQ09OU1RSQUlORURfSElHSCAgICAgfSwgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorCisgICAgLy8vIFByb2ZpbGUgTGV2ZWwKKyAgICB7ICJsZXZlbCIsICAgICAgICAgICJQcm9maWxlIExldmVsIiwgICAgICAgIE9GRlNFVChsZXZlbCksICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMCAgfSwgMCwgNjIsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiYXV0byIsICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDAgIH0sIDAsIDAsICBWRSwgImxldmVsIiB9LAorICAgIHsgIjEuMCIsICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAxMCB9LCAwLCAwLCAgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIxLjEiLCAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMTEgfSwgMCwgMCwgIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiMS4yIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDEyIH0sIDAsIDAsICBWRSwgImxldmVsIiB9LAorICAgIHsgIjEuMyIsICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAxMyB9LCAwLCAwLCAgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIyLjAiLCAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMjAgfSwgMCwgMCwgIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiMi4xIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDIxIH0sIDAsIDAsICBWRSwgImxldmVsIiB9LAorICAgIHsgIjIuMiIsICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAyMiB9LCAwLCAwLCAgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIzLjAiLCAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMzAgfSwgMCwgMCwgIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiMy4xIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDMxIH0sIDAsIDAsICBWRSwgImxldmVsIiB9LAorICAgIHsgIjMuMiIsICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAzMiB9LCAwLCAwLCAgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI0LjAiLCAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gNDAgfSwgMCwgMCwgIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiNC4xIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDQxIH0sIDAsIDAsICBWRSwgImxldmVsIiB9LAorICAgIHsgIjQuMiIsICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSA0MiB9LCAwLCAwLCAgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI1LjAiLCAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gNTAgfSwgMCwgMCwgIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiNS4xIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDUxIH0sIDAsIDAsICBWRSwgImxldmVsIiB9LAorICAgIHsgIjUuMiIsICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSA1MiB9LCAwLCAwLCAgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI2LjAiLCAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gNjAgfSwgMCwgMCwgIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiNi4xIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDYxIH0sIDAsIDAsICBWRSwgImxldmVsIiB9LAorICAgIHsgIjYuMiIsICAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSA2MiB9LCAwLCAwLCAgVkUsICJsZXZlbCIgfSwKKworCisgICAgLy8vIFF1YWxpdHkgUHJlc2V0CisgICAgeyAicXVhbGl0eSIsICAgICAgICAiUXVhbGl0eSBQcmVmZXJlbmNlIiwgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHF1YWxpdHkpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfUVVBTElUWV9QUkVTRVRfU1BFRUQgICAgfSwgQU1GX1ZJREVPX0VOQ09ERVJfUVVBTElUWV9QUkVTRVRfQkFMQU5DRUQsIEFNRl9WSURFT19FTkNPREVSX1FVQUxJVFlfUFJFU0VUX1FVQUxJVFksIFZFLCAicXVhbGl0eSIgfSwKKyAgICB7ICJzcGVlZCIsICAgICAgICAgICJQcmVmZXIgU3BlZWQiLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9RVUFMSVRZX1BSRVNFVF9TUEVFRCAgICB9LCAgICAgICAwLCAwLCBWRSwgInF1YWxpdHkiIH0sCisgICAgeyAiYmFsYW5jZWQiLCAgICAgICAiQmFsYW5jZWQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfUVVBTElUWV9QUkVTRVRfQkFMQU5DRUQgfSwgICAgMCwgMCwgVkUsICJxdWFsaXR5IiB9LAorICAgIHsgInF1YWxpdHkiLCAgICAgICAgIlByZWZlciBRdWFsaXR5IiwgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX1FVQUxJVFlfUFJFU0VUX1FVQUxJVFkgIH0sICAgICAwLCAwLCBWRSwgInF1YWxpdHkiIH0sCisKKyAgICAvLyBEeW5hbWljCisgICAgLy8vIFJhdGUgQ29udHJvbCBNZXRob2QKKyAgICB7ICJyYyIsICAgICAgICAgICAgICJSYXRlIENvbnRyb2wgTWV0aG9kIiwgICAgICAgICAgICAgICAgICBPRkZTRVQocmF0ZV9jb250cm9sX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfUkFURV9DT05UUk9MX01FVEhPRF9VTktOT1dOIH0sIEFNRl9WSURFT19FTkNPREVSX1JBVEVfQ09OVFJPTF9NRVRIT0RfVU5LTk9XTiwgQU1GX1ZJREVPX0VOQ09ERVJfUkFURV9DT05UUk9MX01FVEhPRF9MQVRFTkNZX0NPTlNUUkFJTkVEX1ZCUiwgVkUsICJyYyIgfSwKKyAgICB7ICJjcXAiLCAgICAgICAgICAgICJDb25zdGFudCBRdWFudGl6YXRpb24gUGFyYW1ldGVyIiwgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfUkFURV9DT05UUk9MX01FVEhPRF9DT05TVEFOVF9RUCAgICAgICAgICAgICB9LCAwLCAwLCBWRSwgInJjIiB9LAorICAgIHsgImNiciIsICAgICAgICAgICAgIkNvbnN0YW50IEJpdHJhdGUiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9SQVRFX0NPTlRST0xfTUVUSE9EX0NCUiAgICAgICAgICAgICAgICAgICAgIH0sIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAidmJyX3BlYWsiLCAgICAgICAiUGVhayBDb250cmFpbmVkIFZhcmlhYmxlIEJpdHJhdGUiLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX1JBVEVfQ09OVFJPTF9NRVRIT0RfUEVBS19DT05TVFJBSU5FRF9WQlIgICAgfSwgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJ2YnJfbGF0ZW5jeSIsICAgICJMYXRlbmN5IENvbnN0cmFpbmVkIFZhcmlhYmxlIEJpdHJhdGUiLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfUkFURV9DT05UUk9MX01FVEhPRF9MQVRFTkNZX0NPTlNUUkFJTkVEX1ZCUiB9LCAwLCAwLCBWRSwgInJjIiB9LAorCisgICAgLy8vIEVuZm9yY2UgSFJELCBGaWxsZXIgRGF0YSwgVkJBUSwgRnJhbWUgU2tpcHBpbmcKKyAgICB7ICJlbmZvcmNlX2hyZCIsICAgICJFbmZvcmNlIEhSRCIsICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZW5mb3JjZV9ocmQpLCAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgImZpbGxlcl9kYXRhIiwgICAgIkZpbGxlciBEYXRhIEVuYWJsZSIsICAgICAgICAgICAgICAgICAgIE9GRlNFVChmaWxsZXJfZGF0YSksICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyAidmJhcSIsICAgICAgICAgICAiRW5hYmxlIFZCQVEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGVuYWJsZV92YmFxKSwgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKKyAgICB7ICJmcmFtZV9za2lwcGluZyIsICJSYXRlIENvbnRyb2wgQmFzZWQgRnJhbWUgU2tpcCIsICAgICAgICBPRkZTRVQoc2tpcF9mcmFtZSksICAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorCisgICAgLy8vIFFQIFZhbHVlcworICAgIHsgInFwX2kiLCAgICAgICAgICAgIlF1YW50aXphdGlvbiBQYXJhbWV0ZXIgZm9yIEktRnJhbWUiLCAgIE9GRlNFVChxcF9pKSwgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCA1MSwgVkUgfSwKKyAgICB7ICJxcF9wIiwgICAgICAgICAgICJRdWFudGl6YXRpb24gUGFyYW1ldGVyIGZvciBQLUZyYW1lIiwgICBPRkZTRVQocXBfcCksICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAtMSwgNTEsIFZFIH0sCisgICAgeyAicXBfYiIsICAgICAgICAgICAiUXVhbnRpemF0aW9uIFBhcmFtZXRlciBmb3IgQi1GcmFtZSIsICAgT0ZGU0VUKHFwX2IpLCAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIDUxLCBWRSB9LAorCisgICAgLy8vIFByZS1QYXNzLCBQcmUtQW5hbHlzaXMsIFR3by1QYXNzCisgICAgeyAicHJlYW5hbHlzaXMiLCAgICAiUHJlLUFuYWx5c2lzIE1vZGUiLCAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHByZWFuYWx5c2lzKSwgICAgICAgIEFWX09QVF9UWVBFX0JPT0wseyAuaTY0ID0gMCB9LCAwLCAxLCBWRSwgTlVMTCB9LAorCisgICAgLy8vIE1heGltdW0gQWNjZXNzIFVuaXQgU2l6ZQorICAgIHsgIm1heF9hdV9zaXplIiwgICAgIk1heGltdW0gQWNjZXNzIFVuaXQgU2l6ZSBmb3IgcmF0ZSBjb250cm9sIChpbiBiaXRzKSIsICAgT0ZGU0VUKG1heF9hdV9zaXplKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWRSB9LAorCisgICAgLy8vIEhlYWRlciBJbnNlcnRpb24gU3BhY2luZworICAgIHsgImhlYWRlcl9zcGFjaW5nIiwgIkhlYWRlciBJbnNlcnRpb24gU3BhY2luZyIsICAgICAgICAgICAgIE9GRlNFVChoZWFkZXJfc3BhY2luZyksICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCAxMDAwLCBWRSB9LAorCisgICAgLy8vIEItRnJhbWVzCisgICAgLy8gQlBpY3R1cmVzUGF0dGVybj1iZgorICAgIHsgImJmX2RlbHRhX3FwIiwgICAgIkItUGljdHVyZSBEZWx0YSBRUCIsICAgICAgICAgICAgICAgICAgIE9GRlNFVChiX2ZyYW1lX2RlbHRhX3FwKSwgICBBVl9PUFRfVFlQRV9JTlQsICB7IC5pNjQgPSA0IH0sIC0xMCwgMTAsIFZFIH0sCisgICAgeyAiYmZfcmVmIiwgICAgICAgICAiRW5hYmxlIFJlZmVyZW5jZSB0byBCLUZyYW1lcyIsICAgICAgICAgT0ZGU0VUKGJfZnJhbWVfcmVmKSwgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDEgfSwgMCwgMSwgVkUgfSwKKyAgICB7ICJiZl9yZWZfZGVsdGFfcXAiLCJSZWZlcmVuY2UgQi1QaWN0dXJlIERlbHRhIFFQIiwgICAgICAgICBPRkZTRVQocmVmX2JfZnJhbWVfZGVsdGFfcXApLCBBVl9PUFRfVFlQRV9JTlQsICB7IC5pNjQgPSA0IH0sIC0xMCwgMTAsIFZFIH0sCisKKyAgICAvLy8gSW50cmEtUmVmcmVzaAorICAgIHsgImludHJhX3JlZnJlc2hfbWIiLCJJbnRyYSBSZWZyZXNoIE1CcyBOdW1iZXIgUGVyIFNsb3QgaW4gTWFjcm9ibG9ja3MiLCAgICAgICBPRkZTRVQoaW50cmFfcmVmcmVzaF9tYiksICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWRSB9LAorCisgICAgLy8vIGNvZGVyCisgICAgeyAiY29kZXIiLCAgICAgICAgICAiQ29kaW5nIFR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGNvZGluZ19tb2RlKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfVU5ERUZJTkVEIH0sIEFNRl9WSURFT19FTkNPREVSX1VOREVGSU5FRCwgQU1GX1ZJREVPX0VOQ09ERVJfQ0FMViwgVkUsICJjb2RlciIgfSwKKyAgICB7ICJhdXRvIiwgICAgICAgICAgICJBdXRvbWF0aWMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9VTkRFRklORUQgfSwgMCwgMCwgVkUsICJjb2RlciIgfSwKKyAgICB7ICJjYXZsYyIsICAgICAgICAgICJDb250ZXh0IEFkYXB0aXZlIFZhcmlhYmxlLUxlbmd0aCBDb2RpbmciLCAwLCAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9DQUxWIH0sICAgICAgMCwgMCwgVkUsICJjb2RlciIgfSwKKyAgICB7ICJjYWJhYyIsICAgICAgICAgICJDb250ZXh0IEFkYXB0aXZlIEJpbmFyeSBBcml0aG1ldGljIENvZGluZyIsIDAsICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9DQUJBQyB9LCAgICAgMCwgMCwgVkUsICJjb2RlciIgfSwKKworICAgIHsgIm1lX2hhbGZfcGVsIiwgICAgIkVuYWJsZSBNRSBIYWxmIFBpeGVsIiwgICAgICAgICAgICAgICAgIE9GRlNFVChtZV9oYWxmX3BlbCksICAgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDEgfSwgMCwgMSwgVkUgfSwKKyAgICB7ICJtZV9xdWFydGVyX3BlbCIsICJFbmFibGUgTUUgUXVhcnRlciBQaXhlbCIsICAgICAgICAgICAgICBPRkZTRVQobWVfcXVhcnRlcl9wZWwpLEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAxIH0sIDAsIDEsIFZFIH0sCisKKyAgICB7ICJhdWQiLCAgICAgICAgICAgICJJbnNlcnRzIEFVIERlbGltaXRlciBOQUwgdW5pdCIsICAgICAgICBPRkZTRVQoYXVkKSAgICAgICAgICAsQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKKworICAgIHsgImxvZ190b19kYmciLCAgICAgIkVuYWJsZSBBTUYgbG9nZ2luZyB0byBkZWJ1ZyBvdXRwdXQiLCAgIE9GRlNFVChsb2dfdG9fZGJnKSAgICAsIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKKworICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgYW1mX2VuY29kZV9pbml0X2gyNjQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgQU1GX1JFU1VMVCAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQU1GX09LOworICAgIEFtZkNvbnRleHQgICAgICAgICAgICAgICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQU1GVmFyaWFudFN0cnVjdCAgICAgICAgICAgICAgICAgdmFyID0geyAwIH07CisgICAgYW1mX2ludDY0ICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IDA7CisgICAgYW1mX2ludDY0ICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9sZXZlbCA9IDA7CisgICAgQU1GQnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyOworICAgIEFNRkd1aWQgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWQ7CisgICAgQU1GUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVyYXRlOworICAgIEFNRlNpemUgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc2l6ZSA9IEFNRkNvbnN0cnVjdFNpemUoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJsb2NraW5nX2ZpbHRlciA9IChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0xPT1BfRklMVEVSKSA/IDEgOiAwOworCisgICAgaWYgKGF2Y3R4LT5mcmFtZXJhdGUubnVtID4gMCAmJiBhdmN0eC0+ZnJhbWVyYXRlLmRlbiA+IDApIHsKKyAgICAgICAgZnJhbWVyYXRlID0gQU1GQ29uc3RydWN0UmF0ZShhdmN0eC0+ZnJhbWVyYXRlLm51bSwgYXZjdHgtPmZyYW1lcmF0ZS5kZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lcmF0ZSA9IEFNRkNvbnN0cnVjdFJhdGUoYXZjdHgtPnRpbWVfYmFzZS5kZW4sIGF2Y3R4LT50aW1lX2Jhc2UubnVtICogYXZjdHgtPnRpY2tzX3Blcl9mcmFtZSk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9hbWZfZW5jb2RlX2luaXQoYXZjdHgpKSAhPSAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gU3RhdGljIHBhcmFtZXRlcnMKKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9VU0FHRSwgY3R4LT51c2FnZSk7CisKKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX1NJWkUocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0ZSQU1FU0laRSwgZnJhbWVzaXplKTsKKworICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfUkFURShyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfRlJBTUVSQVRFLCBmcmFtZXJhdGUpOworCisgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSkgeworICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FOgorICAgICAgICBwcm9maWxlID0gQU1GX1ZJREVPX0VOQ09ERVJfUFJPRklMRV9CQVNFTElORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfTUFJTjoKKyAgICAgICAgcHJvZmlsZSA9IEFNRl9WSURFT19FTkNPREVSX1BST0ZJTEVfTUFJTjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSDoKKyAgICAgICAgcHJvZmlsZSA9IEFNRl9WSURFT19FTkNPREVSX1BST0ZJTEVfSElHSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORURfQkFTRUxJTkU6CisgICAgICAgIHByb2ZpbGUgPSBBTUZfVklERU9fRU5DT0RFUl9QUk9GSUxFX0NPTlNUUkFJTkVEX0JBU0VMSU5FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIChGRl9QUk9GSUxFX0gyNjRfSElHSCB8IEZGX1BST0ZJTEVfSDI2NF9DT05TVFJBSU5FRCk6CisgICAgICAgIHByb2ZpbGUgPSBBTUZfVklERU9fRU5DT0RFUl9QUk9GSUxFX0NPTlNUUkFJTkVEX0hJR0g7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAocHJvZmlsZSA9PSAwKSB7CisgICAgICAgIHByb2ZpbGUgPSBjdHgtPnByb2ZpbGU7CisgICAgfQorCisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfUFJPRklMRSwgcHJvZmlsZSk7CisKKyAgICBwcm9maWxlX2xldmVsID0gYXZjdHgtPmxldmVsOworICAgIGlmIChwcm9maWxlX2xldmVsID09IEZGX0xFVkVMX1VOS05PV04pIHsKKyAgICAgICAgcHJvZmlsZV9sZXZlbCA9IGN0eC0+bGV2ZWw7CisgICAgfQorICAgIGlmIChwcm9maWxlX2xldmVsICE9IDApIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfUFJPRklMRV9MRVZFTCwgcHJvZmlsZV9sZXZlbCk7CisgICAgfQorCisgICAgLy8gTWF4aW11bSBSZWZlcmVuY2UgRnJhbWVzCisgICAgaWYgKGF2Y3R4LT5yZWZzICE9IC0xKSB7CisgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX01BWF9OVU1fUkVGUkFNRVMsIGF2Y3R4LT5yZWZzKTsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAmJiBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pIHsKKyAgICAgICAgQU1GUmF0aW8gcmF0aW8gPSBBTUZDb25zdHJ1Y3RSYXRpbyhhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfUkFUSU8ocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0FTUEVDVF9SQVRJTywgcmF0aW8pOworICAgIH0KKworICAgIC8vLyBDb2xvciBSYW5nZSAoUGFydGlhbC9UVi9NUEVHIG9yIEZ1bGwvUEMvSlBFRykKKyAgICBpZiAoYXZjdHgtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUcpIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9CT09MKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9GVUxMX1JBTkdFX0NPTE9SLCAxKTsKKyAgICB9CisKKyAgICAvLyBhdXRvZGV0ZWN0IHJhdGUgY29udHJvbCBtZXRob2QKKyAgICBpZiAoY3R4LT5yYXRlX2NvbnRyb2xfbW9kZSA9PSBBTUZfVklERU9fRU5DT0RFUl9SQVRFX0NPTlRST0xfTUVUSE9EX1VOS05PV04pIHsKKyAgICAgICAgaWYgKGN0eC0+cXBfaSAhPSAtMSB8fCBjdHgtPnFwX3AgIT0gLTEgfHwgY3R4LT5xcF9iICE9IC0xKSB7CisgICAgICAgICAgICBjdHgtPnJhdGVfY29udHJvbF9tb2RlID0gQU1GX1ZJREVPX0VOQ09ERVJfUkFURV9DT05UUk9MX01FVEhPRF9DT05TVEFOVF9RUDsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlJhdGUgY29udHJvbCB0dXJuZWQgdG8gQ1FQXG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+cmNfbWF4X3JhdGUgPiAwICkgeworICAgICAgICAgICAgY3R4LT5yYXRlX2NvbnRyb2xfbW9kZSA9IEFNRl9WSURFT19FTkNPREVSX1JBVEVfQ09OVFJPTF9NRVRIT0RfUEVBS19DT05TVFJBSU5FRF9WQlI7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJSYXRlIGNvbnRyb2wgdHVybmVkIHRvIFBlYWsgVkJSXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN0eC0+cmF0ZV9jb250cm9sX21vZGUgPSBBTUZfVklERU9fRU5DT0RFUl9SQVRFX0NPTlRST0xfTUVUSE9EX0NCUjsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlJhdGUgY29udHJvbCB0dXJuZWQgdG8gQ0JSXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdHgtPnJhdGVfY29udHJvbF9tb2RlID09IEFNRl9WSURFT19FTkNPREVSX1JBVEVfQ09OVFJPTF9NRVRIT0RfQ09OU1RBTlRfUVApIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfUkFURV9DT05UUk9MX1BSRUFOQUxZU0lTX0VOQUJMRSwgQU1GX1ZJREVPX0VOQ09ERVJfUFJFRU5DT0RFX0RJU0FCTEVEKTsKKyAgICAgICAgaWYgKGN0eC0+cHJlYW5hbHlzaXMpCisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlByZS1BbmFseXNpcyBpcyBub3Qgc3VwcG9ydGVkIGJ5IGNxcCBSYXRlIENvbnRyb2wgTWV0aG9kLCBhdXRvbWF0aWNhbGx5IGRpc2FibGVkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9SQVRFX0NPTlRST0xfUFJFQU5BTFlTSVNfRU5BQkxFLCBjdHgtPnByZWFuYWx5c2lzKTsKKyAgICB9CisKKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9RVUFMSVRZX1BSRVNFVCwgY3R4LT5xdWFsaXR5KTsKKworICAgIC8vIER5bmFtaWMgcGFybWF0ZXJzCisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfUkFURV9DT05UUk9MX01FVEhPRCwgY3R4LT5yYXRlX2NvbnRyb2xfbW9kZSk7CisKKyAgICAvLy8gVkJWIEJ1ZmZlcgorICAgIGlmIChhdmN0eC0+cmNfYnVmZmVyX3NpemUgIT0gMCkgeworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9WQlZfQlVGRkVSX1NJWkUsIGF2Y3R4LT5yY19idWZmZXJfc2l6ZSk7CisgICAgICAgIGlmIChhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5ICE9IDApIHsKKyAgICAgICAgICAgIGludCBhbWZfYnVmZmVyX2Z1bGxuZXNzID0gYXZjdHgtPnJjX2luaXRpYWxfYnVmZmVyX29jY3VwYW5jeSAqIDY0IC8gYXZjdHgtPnJjX2J1ZmZlcl9zaXplOworICAgICAgICAgICAgaWYgKGFtZl9idWZmZXJfZnVsbG5lc3MgPiA2NCkKKyAgICAgICAgICAgICAgICBhbWZfYnVmZmVyX2Z1bGxuZXNzID0gNjQ7CisgICAgICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9JTklUSUFMX1ZCVl9CVUZGRVJfRlVMTE5FU1MsIGFtZl9idWZmZXJfZnVsbG5lc3MpOworICAgICAgICB9CisgICAgfQorICAgIC8vLyBNYXhpbXVtIEFjY2VzcyBVbml0IFNpemUKKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9NQVhfQVVfU0laRSwgY3R4LT5tYXhfYXVfc2l6ZSk7CisKKyAgICBpZiAoY3R4LT5tYXhfYXVfc2l6ZSkKKyAgICAgICAgY3R4LT5lbmZvcmNlX2hyZCA9IDE7CisKKyAgICAvLyBRUCBNaW5pbXVtIC8gTWF4aW11bQorICAgIGlmIChjdHgtPnJhdGVfY29udHJvbF9tb2RlID09IEFNRl9WSURFT19FTkNPREVSX1JBVEVfQ09OVFJPTF9NRVRIT0RfQ09OU1RBTlRfUVApIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfTUlOX1FQLCAwKTsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfTUFYX1FQLCA1MSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5xbWluICE9IC0xKSB7CisgICAgICAgICAgICBpbnQgcXZhbCA9IGF2Y3R4LT5xbWluID4gNTEgPyA1MSA6IGF2Y3R4LT5xbWluOworICAgICAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfTUlOX1FQLCBxdmFsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZjdHgtPnFtYXggIT0gLTEpIHsKKyAgICAgICAgICAgIGludCBxdmFsID0gYXZjdHgtPnFtYXggPiA1MSA/IDUxIDogYXZjdHgtPnFtYXg7CisgICAgICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9NQVhfUVAsIHF2YWwpOworICAgICAgICB9CisgICAgfQorICAgIC8vIFFQIFZhbHVlcworICAgIGlmIChjdHgtPnFwX2kgIT0gLTEpCisgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX1FQX0ksIGN0eC0+cXBfaSk7CisgICAgaWYgKGN0eC0+cXBfcCAhPSAtMSkKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfUVBfUCwgY3R4LT5xcF9wKTsKKyAgICBpZiAoY3R4LT5xcF9iICE9IC0xKQorICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9RUF9CLCBjdHgtPnFwX2IpOworCisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfVEFSR0VUX0JJVFJBVEUsIGF2Y3R4LT5iaXRfcmF0ZSk7CisKKyAgICBpZiAoY3R4LT5yYXRlX2NvbnRyb2xfbW9kZSA9PSBBTUZfVklERU9fRU5DT0RFUl9SQVRFX0NPTlRST0xfTUVUSE9EX0NCUikgeworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9QRUFLX0JJVFJBVEUsIGF2Y3R4LT5iaXRfcmF0ZSk7CisgICAgfQorICAgIGlmIChhdmN0eC0+cmNfbWF4X3JhdGUpIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfUEVBS19CSVRSQVRFLCBhdmN0eC0+cmNfbWF4X3JhdGUpOworICAgIH0gZWxzZSBpZiAoY3R4LT5yYXRlX2NvbnRyb2xfbW9kZSA9PSBBTUZfVklERU9fRU5DT0RFUl9SQVRFX0NPTlRST0xfTUVUSE9EX1BFQUtfQ09OU1RSQUlORURfVkJSKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAicmF0ZSBjb250cm9sIG1vZGUgaXMgUEVBS19DT05TVFJBSU5FRF9WQlIgYnV0IHJjX21heF9yYXRlIGlzIG5vdCBzZXRcbiIpOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgRW5jb2RlcgorICAgIHJlcyA9IGN0eC0+ZW5jb2Rlci0+cFZ0YmwtPkluaXQoY3R4LT5lbmNvZGVyLCBjdHgtPmZvcm1hdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9CVUcsICJlbmNvZGVyLT5Jbml0KCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJlcyk7CisKKyAgICAvLyBFbmZvcmNlIEhSRCwgRmlsbGVyIERhdGEsIFZCQVEsIEZyYW1lIFNraXBwaW5nLCBEZWJsb2NraW5nIEZpbHRlcgorICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfQk9PTChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfRU5GT1JDRV9IUkQsICEhY3R4LT5lbmZvcmNlX2hyZCk7CisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9CT09MKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9GSUxMRVJfREFUQV9FTkFCTEUsICEhY3R4LT5maWxsZXJfZGF0YSk7CisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9CT09MKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9SQVRFX0NPTlRST0xfU0tJUF9GUkFNRV9FTkFCTEUsICEhY3R4LT5za2lwX2ZyYW1lKTsKKyAgICBpZiAoY3R4LT5yYXRlX2NvbnRyb2xfbW9kZSA9PSBBTUZfVklERU9fRU5DT0RFUl9SQVRFX0NPTlRST0xfTUVUSE9EX0NPTlNUQU5UX1FQKSB7CisgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfQk9PTChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfRU5BQkxFX1ZCQVEsIDApOworICAgICAgICBpZiAoY3R4LT5lbmFibGVfdmJhcSkKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiVkJBUSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGNxcCBSYXRlIENvbnRyb2wgTWV0aG9kLCBhdXRvbWF0aWNhbGx5IGRpc2FibGVkXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0JPT0wocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0VOQUJMRV9WQkFRLCAhIWN0eC0+ZW5hYmxlX3ZiYXEpOworICAgIH0KKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0JPT0wocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0RFX0JMT0NLSU5HX0ZJTFRFUiwgISFkZWJsb2NraW5nX2ZpbHRlcik7CisKKyAgICAvLyBCLUZyYW1lcworICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0JfUElDX1BBVFRFUk4sIGF2Y3R4LT5tYXhfYl9mcmFtZXMpOworICAgIGlmIChyZXMgIT0gQU1GX09LKSB7CisgICAgICAgIHJlcyA9IGN0eC0+ZW5jb2Rlci0+cFZ0YmwtPkdldFByb3BlcnR5KGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfQl9QSUNfUEFUVEVSTiwgJnZhcik7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiQi1mcmFtZXM9JWQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIEdQVSwgc3dpdGNoZWQgdG8gJWRcbiIsCisgICAgICAgICAgICBhdmN0eC0+bWF4X2JfZnJhbWVzLCAoaW50KXZhci5pbnQ2NFZhbHVlKTsKKyAgICAgICAgYXZjdHgtPm1heF9iX2ZyYW1lcyA9IChpbnQpdmFyLmludDY0VmFsdWU7CisgICAgfQorICAgIGlmIChhdmN0eC0+bWF4X2JfZnJhbWVzKSB7CisgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0JfUElDX0RFTFRBX1FQLCBjdHgtPmJfZnJhbWVfZGVsdGFfcXApOworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0JPT0wocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0JfUkVGRVJFTkNFX0VOQUJMRSwgISFjdHgtPmJfZnJhbWVfcmVmKTsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfUkVGX0JfUElDX0RFTFRBX1FQLCBjdHgtPnJlZl9iX2ZyYW1lX2RlbHRhX3FwKTsKKyAgICB9CisKKyAgICAvLyBLZXlmcmFtZSBJbnRlcnZhbAorICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0lEUl9QRVJJT0QsIGF2Y3R4LT5nb3Bfc2l6ZSk7CisKKyAgICAvLyBIZWFkZXIgSW5zZXJ0aW9uIFNwYWNpbmcKKyAgICBpZiAoY3R4LT5oZWFkZXJfc3BhY2luZyA+PSAwKQorICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRUFERVJfSU5TRVJUSU9OX1NQQUNJTkcsIGN0eC0+aGVhZGVyX3NwYWNpbmcpOworCisgICAgLy8gSW50cmEtUmVmcmVzaCwgU2xpY2luZworICAgIGlmIChjdHgtPmludHJhX3JlZnJlc2hfbWIgPiAwKQorICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9JTlRSQV9SRUZSRVNIX05VTV9NQlNfUEVSX1NMT1QsIGN0eC0+aW50cmFfcmVmcmVzaF9tYik7CisgICAgaWYgKGF2Y3R4LT5zbGljZXMgPiAxKQorICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9TTElDRVNfUEVSX0ZSQU1FLCBhdmN0eC0+c2xpY2VzKTsKKworICAgIC8vIENvZGluZworICAgIGlmIChjdHgtPmNvZGluZ19tb2RlICE9IDApCisgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0NBQkFDX0VOQUJMRSwgY3R4LT5jb2RpbmdfbW9kZSk7CisKKyAgICAvLyBNb3Rpb24gRXN0aW1hdGlvbgorICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfQk9PTChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfTU9USU9OX0hBTEZfUElYRUwsICEhY3R4LT5tZV9oYWxmX3BlbCk7CisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9CT09MKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9NT1RJT05fUVVBUlRFUlBJWEVMLCAhIWN0eC0+bWVfcXVhcnRlcl9wZWwpOworCisgICAgLy8gZmlsbCBleHRyYWRhdGEKKyAgICByZXMgPSBBTUZWYXJpYW50SW5pdCgmdmFyKTsKKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9CVUcsICJBTUZWYXJpYW50SW5pdCgpIGZhaWxlZCB3aXRoIGVycm9yICVkXG4iLCByZXMpOworCisgICAgcmVzID0gY3R4LT5lbmNvZGVyLT5wVnRibC0+R2V0UHJvcGVydHkoY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9FWFRSQURBVEEsICZ2YXIpOworICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCByZXMgPT0gQU1GX09LLCBBVkVSUk9SX0JVRywgIkdldFByb3BlcnR5KEFNRl9WSURFT19FTkNPREVSX0VYVFJBREFUQSkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJlcyk7CisgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHZhci5wSW50ZXJmYWNlICE9IE5VTEwsIEFWRVJST1JfQlVHLCAiR2V0UHJvcGVydHkoQU1GX1ZJREVPX0VOQ09ERVJfRVhUUkFEQVRBKSByZXR1cm5lZCBOVUxMXG4iKTsKKworICAgIGd1aWQgPSBJSURfQU1GQnVmZmVyKCk7CisKKyAgICByZXMgPSB2YXIucEludGVyZmFjZS0+cFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHZhci5wSW50ZXJmYWNlLCAmZ3VpZCwgKHZvaWQqKikmYnVmZmVyKTsgLy8gcXVlcnkgZm9yIGJ1ZmZlciBpbnRlcmZhY2UKKyAgICBpZiAocmVzICE9IEFNRl9PSykgeworICAgICAgICB2YXIucEludGVyZmFjZS0+cFZ0YmwtPlJlbGVhc2UodmFyLnBJbnRlcmZhY2UpOworICAgIH0KKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9CVUcsICJRdWVyeUludGVyZmFjZShJSURfQU1GQnVmZmVyKSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmVzKTsKKworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IChpbnQpYnVmZmVyLT5wVnRibC0+R2V0U2l6ZShidWZmZXIpOworICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICBidWZmZXItPnBWdGJsLT5SZWxlYXNlKGJ1ZmZlcik7CisgICAgICAgIHZhci5wSW50ZXJmYWNlLT5wVnRibC0+UmVsZWFzZSh2YXIucEludGVyZmFjZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhLCBidWZmZXItPnBWdGJsLT5HZXROYXRpdmUoYnVmZmVyKSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKworICAgIGJ1ZmZlci0+cFZ0YmwtPlJlbGVhc2UoYnVmZmVyKTsKKyAgICB2YXIucEludGVyZmFjZS0+cFZ0YmwtPlJlbGVhc2UodmFyLnBJbnRlcmZhY2UpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCBkZWZhdWx0c1tdID0geworICAgIHsgInJlZnMiLCAgICAgICAiLTEiICB9LAorICAgIHsgImFzcGVjdCIsICAgICAiMCIgICB9LAorICAgIHsgInFtaW4iLCAgICAgICAiLTEiICB9LAorICAgIHsgInFtYXgiLCAgICAgICAiLTEiICB9LAorICAgIHsgImIiLCAgICAgICAgICAiMk0iICB9LAorICAgIHsgImciLCAgICAgICAgICAiMjUwIiB9LAorICAgIHsgInNsaWNlcyIsICAgICAiMSIgICB9LAorICAgIHsgTlVMTCAgICAgICAgICAgICAgICB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaDI2NF9hbWZfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiaDI2NF9hbWYiLAorICAgIC5pdGVtX25hbWUgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfaDI2NF9hbWZfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF9hbWYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBTUQgQU1GIEguMjY0IEVuY29kZXIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhbWZfZW5jb2RlX2luaXRfaDI2NCwKKyAgICAuc2VuZF9mcmFtZSAgICAgPSBmZl9hbWZfc2VuZF9mcmFtZSwKKyAgICAucmVjZWl2ZV9wYWNrZXQgPSBmZl9hbWZfcmVjZWl2ZV9wYWNrZXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfYW1mX2VuY29kZV9jbG9zZSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQW1mQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgID0gJmgyNjRfYW1mX2NsYXNzLAorICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9IQVJEV0FSRSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC5waXhfZm10cyAgICAgICA9IGZmX2FtZl9waXhfZm10cywKKyAgICAud3JhcHBlcl9uYW1lICAgPSAiYW1mIiwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FtZmVuY19oZXZjLmMgYi9saWJhdmNvZGVjL2FtZmVuY19oZXZjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5YTMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYW1mZW5jX2hldmMuYwpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImFtZmVuYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFtZkNvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAidXNhZ2UiLCAgICAgICAgICAiU2V0IHRoZSBlbmNvZGluZyB1c2FnZSIsICAgICAgICAgICAgIE9GRlNFVCh1c2FnZSksICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1VTQUdFX1RSQU5TQ09ORElORyB9LCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1VTQUdFX1RSQU5TQ09ORElORywgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19VU0FHRV9XRUJDQU0sIFZFLCAidXNhZ2UiIH0sCisgICAgeyAidHJhbnNjb2RpbmciLCAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfVVNBR0VfVFJBTlNDT05ESU5HIH0sICAgICAgICAgMCwgMCwgVkUsICJ1c2FnZSIgfSwKKyAgICB7ICJ1bHRyYWxvd2xhdGVuY3kiLCIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19VU0FHRV9VTFRSQV9MT1dfTEFURU5DWSB9LCAgICAwLCAwLCBWRSwgInVzYWdlIiB9LAorICAgIHsgImxvd2xhdGVuY3kiLCAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1VTQUdFX0xPV19MQVRFTkNZIH0sICAgICAgICAgIDAsIDAsIFZFLCAidXNhZ2UiIH0sCisgICAgeyAid2ViY2FtIiwgICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfVVNBR0VfV0VCQ0FNIH0sICAgICAgICAgICAgICAgMCwgMCwgVkUsICJ1c2FnZSIgfSwKKworICAgIHsgInByb2ZpbGUiLCAgICAgICAgIlNldCB0aGUgcHJvZmlsZSAoZGVmYXVsdCBtYWluKSIsICAgICAgICAgICBPRkZTRVQocHJvZmlsZSksICAgQVZfT1BUX1RZUEVfSU5ULHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfUFJPRklMRV9NQUlOIH0sIEFNRl9WSURFT19FTkNPREVSX0hFVkNfUFJPRklMRV9NQUlOLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1BST0ZJTEVfTUFJTiwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgIm1haW4iLCAgICAgICAgICAgIiIsIDAsICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfUFJPRklMRV9NQUlOIH0sIDAsIDAsIFZFLCAicHJvZmlsZSIgfSwKKworICAgIHsgInByb2ZpbGVfdGllciIsICAgIlNldCB0aGUgcHJvZmlsZSB0aWVyIChkZWZhdWx0IG1haW4pIiwgICAgICBPRkZTRVQodGllciksIEFWX09QVF9UWVBFX0lOVCx7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1RJRVJfTUFJTiB9LCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1RJRVJfTUFJTiwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19USUVSX0hJR0gsIFZFLCAidGllciIgfSwKKyAgICB7ICJtYWluIiwgICAgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19USUVSX01BSU4gfSwgMCwgMCwgVkUsICJ0aWVyIiB9LAorICAgIHsgImhpZ2giLCAgICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1RJRVJfSElHSCB9LCAwLCAwLCBWRSwgInRpZXIiIH0sCisKKyAgICB7ICJsZXZlbCIsICAgICAgICAgICJTZXQgdGhlIGVuY29kaW5nIGxldmVsIChkZWZhdWx0IGF1dG8pIiwgICAgT0ZGU0VUKGxldmVsKSwgQVZfT1BUX1RZUEVfSU5ULHsgLmk2NCA9IDAgfSwgMCwgQU1GX0xFVkVMXzZfMiwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICJhdXRvIiwgICAgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMCAgICAgICAgICAgICB9LCAwLCAwLCBWRSwgImxldmVsIiB9LAorICAgIHsgIjEuMCIsICAgICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfTEVWRUxfMSAgIH0sIDAsIDAsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiMi4wIiwgICAgICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9MRVZFTF8yICAgfSwgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIyLjEiLCAgICAgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX0xFVkVMXzJfMSB9LCAwLCAwLCBWRSwgImxldmVsIiB9LAorICAgIHsgIjMuMCIsICAgICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfTEVWRUxfMyAgIH0sIDAsIDAsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiMy4xIiwgICAgICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9MRVZFTF8zXzEgfSwgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI0LjAiLCAgICAgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX0xFVkVMXzQgICB9LCAwLCAwLCBWRSwgImxldmVsIiB9LAorICAgIHsgIjQuMSIsICAgICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfTEVWRUxfNF8xIH0sIDAsIDAsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiNS4wIiwgICAgICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9MRVZFTF81ICAgfSwgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI1LjEiLCAgICAgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX0xFVkVMXzVfMSB9LCAwLCAwLCBWRSwgImxldmVsIiB9LAorICAgIHsgIjUuMiIsICAgICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfTEVWRUxfNV8yIH0sIDAsIDAsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiNi4wIiwgICAgICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9MRVZFTF82ICAgfSwgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI2LjEiLCAgICAgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX0xFVkVMXzZfMSB9LCAwLCAwLCBWRSwgImxldmVsIiB9LAorICAgIHsgIjYuMiIsICAgICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfTEVWRUxfNl8yIH0sIDAsIDAsIFZFLCAibGV2ZWwiIH0sCisKKyAgICB7ICJxdWFsaXR5IiwgICAgICAgICJTZXQgdGhlIGVuY29kaW5nIHF1YWxpdHkiLCAgICAgICAgICAgICAgICAgT0ZGU0VUKHF1YWxpdHkpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1FVQUxJVFlfUFJFU0VUX1NQRUVEIH0sIEFNRl9WSURFT19FTkNPREVSX0hFVkNfUVVBTElUWV9QUkVTRVRfUVVBTElUWSwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19RVUFMSVRZX1BSRVNFVF9TUEVFRCwgVkUsICJxdWFsaXR5IiB9LAorICAgIHsgImJhbGFuY2VkIiwgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1FVQUxJVFlfUFJFU0VUX0JBTEFOQ0VEIH0sIDAsIDAsIFZFLCAicXVhbGl0eSIgfSwKKyAgICB7ICJzcGVlZCIsICAgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19RVUFMSVRZX1BSRVNFVF9TUEVFRCAgICB9LCAwLCAwLCBWRSwgInF1YWxpdHkiIH0sCisgICAgeyAicXVhbGl0eSIsICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfUVVBTElUWV9QUkVTRVRfUVVBTElUWSAgfSwgMCwgMCwgVkUsICJxdWFsaXR5IiB9LAorCisgICAgeyAicmMiLCAgICAgICAgICAgICAiU2V0IHRoZSByYXRlIGNvbnRyb2wgbW9kZSIsICAgICAgICAgICAgT0ZGU0VUKHJhdGVfY29udHJvbF9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1JBVEVfQ09OVFJPTF9NRVRIT0RfVU5LTk9XTiB9LCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1JBVEVfQ09OVFJPTF9NRVRIT0RfVU5LTk9XTiwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19SQVRFX0NPTlRST0xfTUVUSE9EX0NCUiwgVkUsICJyYyIgfSwKKyAgICB7ICJjcXAiLCAgICAgICAgICAgICJDb25zdGFudCBRdWFudGl6YXRpb24gUGFyYW1ldGVyIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19SQVRFX0NPTlRST0xfTUVUSE9EX0NPTlNUQU5UX1FQICAgICAgICAgICAgIH0sIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAiY2JyIiwgICAgICAgICAgICAiQ29uc3RhbnQgQml0cmF0ZSIsICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfUkFURV9DT05UUk9MX01FVEhPRF9DQlIgICAgICAgICAgICAgICAgICAgICB9LCAwLCAwLCBWRSwgInJjIiB9LAorICAgIHsgInZicl9wZWFrIiwgICAgICAgIlBlYWsgQ29udHJhaW5lZCBWYXJpYWJsZSBCaXRyYXRlIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1JBVEVfQ09OVFJPTF9NRVRIT0RfUEVBS19DT05TVFJBSU5FRF9WQlIgICAgfSwgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJ2YnJfbGF0ZW5jeSIsICAgICJMYXRlbmN5IENvbnN0cmFpbmVkIFZhcmlhYmxlIEJpdHJhdGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19SQVRFX0NPTlRST0xfTUVUSE9EX0xBVEVOQ1lfQ09OU1RSQUlORURfVkJSIH0sIDAsIDAsIFZFLCAicmMiIH0sCisKKyAgICB7ICJoZWFkZXJfaW5zZXJ0aW9uX21vZGUiLCAgICAgICAgIlNldCBoZWFkZXIgaW5zZXJ0aW9uIG1vZGUiLCAgT0ZGU0VUKGhlYWRlcl9pbnNlcnRpb25fbW9kZSksICAgICAgQVZfT1BUX1RZUEVfSU5ULHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfSEVBREVSX0lOU0VSVElPTl9NT0RFX05PTkUgfSwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19IRUFERVJfSU5TRVJUSU9OX01PREVfTk9ORSwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19IRUFERVJfSU5TRVJUSU9OX01PREVfSURSX0FMSUdORUQsIFZFLCAiaGRybW9kZSIgfSwKKyAgICB7ICJub25lIiwgICAgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19IRUFERVJfSU5TRVJUSU9OX01PREVfTk9ORSAgICAgICAgfSwgMCwgMCwgVkUsICJoZHJtb2RlIiB9LAorICAgIHsgImdvcCIsICAgICAgICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX0hFQURFUl9JTlNFUlRJT05fTU9ERV9HT1BfQUxJR05FRCB9LCAwLCAwLCBWRSwgImhkcm1vZGUiIH0sCisgICAgeyAiaWRyIiwgICAgICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfSEVBREVSX0lOU0VSVElPTl9NT0RFX0lEUl9BTElHTkVEIH0sIDAsIDAsIFZFLCAiaGRybW9kZSIgfSwKKworICAgIHsgImdvcHNfcGVyX2lkciIsICAgICJHT1BzIHBlciBJRFIgMC1ubyBJRFIgd2lsbCBiZSBpbnNlcnRlZCIsICBPRkZTRVQoZ29wc19wZXJfaWRyKSwgIEFWX09QVF9UWVBFX0lOVCwgIHsgLmk2NCA9IDYwIH0sICAwLCBJTlRfTUFYLCBWRSB9LAorICAgIHsgInByZWFuYWx5c2lzIiwgICAgIkVuYWJsZSBwcmVhbmFseXNpcyIsICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocHJlYW5hbHlzaXMpLCAgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgIH0sICAwLCAxLCBWRX0sCisgICAgeyAidmJhcSIsICAgICAgICAgICAiRW5hYmxlIFZCQVEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChlbmFibGVfdmJhcSksICAgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCAgfSwgIDAsIDEsIFZFfSwKKyAgICB7ICJlbmZvcmNlX2hyZCIsICAgICJFbmZvcmNlIEhSRCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGVuZm9yY2VfaHJkKSwgICBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwICB9LCAgMCwgMSwgVkV9LAorICAgIHsgImZpbGxlcl9kYXRhIiwgICAgIkZpbGxlciBEYXRhIEVuYWJsZSIsICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZmlsbGVyX2RhdGEpLCAgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgIH0sICAwLCAxLCBWRX0sCisgICAgeyAibWF4X2F1X3NpemUiLCAgICAiTWF4aW11bSBBY2Nlc3MgVW5pdCBTaXplIGZvciByYXRlIGNvbnRyb2wgKGluIGJpdHMpIiwgT0ZGU0VUKG1heF9hdV9zaXplKSwgICBBVl9PUFRfVFlQRV9JTlQseyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWRX0sCisgICAgeyAibWluX3FwX2kiLCAgICAgICAibWluIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIEktZnJhbWUiLCAgIE9GRlNFVChtaW5fcXBfaSksICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSAgfSwgLTEsIDUxLCBWRSB9LAorICAgIHsgIm1heF9xcF9pIiwgICAgICAgIm1heCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBJLWZyYW1lIiwgICBPRkZTRVQobWF4X3FwX2kpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgIH0sIC0xLCA1MSwgVkUgfSwKKyAgICB7ICJtaW5fcXBfcCIsICAgICAgICJtaW4gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgUC1mcmFtZSIsICAgT0ZGU0VUKG1pbl9xcF9wKSwgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xICB9LCAtMSwgNTEsIFZFIH0sCisgICAgeyAibWF4X3FwX3AiLCAgICAgICAibWF4IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIFAtZnJhbWUiLCAgIE9GRlNFVChtYXhfcXBfcCksICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSAgfSwgLTEsIDUxLCBWRSB9LAorICAgIHsgInFwX3AiLCAgICAgICAgICAgInF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIFAtZnJhbWUiLCAgICAgICBPRkZTRVQocXBfcCksICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgIH0sIC0xLCA1MSwgVkUgfSwKKyAgICB7ICJxcF9pIiwgICAgICAgICAgICJxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBJLWZyYW1lIiwgICAgICAgT0ZGU0VUKHFwX2kpLCAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xICB9LCAtMSwgNTEsIFZFIH0sCisgICAgeyAic2tpcF9mcmFtZSIsICAgICAiUmF0ZSBDb250cm9sIEJhc2VkIEZyYW1lIFNraXAiLCAgICAgICAgICAgIE9GRlNFVChza2lwX2ZyYW1lKSwgICAgQVZfT1BUX1RZUEVfQk9PTCx7IC5pNjQgPSAwICAgfSwgIDAsIDEsIFZFIH0sCisgICAgeyAibWVfaGFsZl9wZWwiLCAgICAiRW5hYmxlIE1FIEhhbGYgUGl4ZWwiLCAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChtZV9oYWxmX3BlbCksICAgQVZfT1BUX1RZUEVfQk9PTCx7IC5pNjQgPSAxICAgfSwgIDAsIDEsIFZFIH0sCisgICAgeyAibWVfcXVhcnRlcl9wZWwiLCAiRW5hYmxlIE1FIFF1YXJ0ZXIgUGl4ZWwgIiwgICAgICAgICAgICAgICAgIE9GRlNFVChtZV9xdWFydGVyX3BlbCksQVZfT1BUX1RZUEVfQk9PTCx7IC5pNjQgPSAxICAgfSwgIDAsIDEsIFZFIH0sCisKKyAgICB7ICJhdWQiLCAgICAgICAgICAgICJJbnNlcnRzIEFVIERlbGltaXRlciBOQUwgdW5pdCIsICAgICAgICAgICAgT0ZGU0VUKGF1ZCkgICAgICAgICAgICxBVl9PUFRfVFlQRV9CT09MLHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKKworICAgIHsgImxvZ190b19kYmciLCAgICAgIkVuYWJsZSBBTUYgbG9nZ2luZyB0byBkZWJ1ZyBvdXRwdXQiLCAgIE9GRlNFVChsb2dfdG9fZGJnKSwgQVZfT1BUX1RZUEVfQk9PTCx7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBhdl9jb2xkIGludCBhbWZfZW5jb2RlX2luaXRfaGV2YyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50ICAgICAgICAgICAgICAgICByZXQgPSAwOworICAgIEFNRl9SRVNVTFQgICAgICAgICAgcmVzID0gQU1GX09LOworICAgIEFtZkNvbnRleHQgICAgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBTUZWYXJpYW50U3RydWN0ICAgIHZhciA9IHswfTsKKyAgICBhbWZfaW50NjQgICAgICAgICAgIHByb2ZpbGUgPSAwOworICAgIGFtZl9pbnQ2NCAgICAgICAgICAgcHJvZmlsZV9sZXZlbCA9IDA7CisgICAgQU1GQnVmZmVyICAgICAgICAgICpidWZmZXI7CisgICAgQU1GR3VpZCAgICAgICAgICAgICBndWlkOworICAgIEFNRlJhdGUgICAgICAgICAgICAgZnJhbWVyYXRlOworICAgIEFNRlNpemUgICAgICAgICAgICAgZnJhbWVzaXplID0gQU1GQ29uc3RydWN0U2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgIGludCAgICAgICAgICAgICAgICAgZGVibG9ja2luZ19maWx0ZXIgPSAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19MT09QX0ZJTFRFUikgPyAxIDogMDsKKworICAgIGlmIChhdmN0eC0+ZnJhbWVyYXRlLm51bSA+IDAgJiYgYXZjdHgtPmZyYW1lcmF0ZS5kZW4gPiAwKSB7CisgICAgICAgIGZyYW1lcmF0ZSA9IEFNRkNvbnN0cnVjdFJhdGUoYXZjdHgtPmZyYW1lcmF0ZS5udW0sIGF2Y3R4LT5mcmFtZXJhdGUuZGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZXJhdGUgPSBBTUZDb25zdHJ1Y3RSYXRlKGF2Y3R4LT50aW1lX2Jhc2UuZGVuLCBhdmN0eC0+dGltZV9iYXNlLm51bSAqIGF2Y3R4LT50aWNrc19wZXJfZnJhbWUpOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfYW1mX2VuY29kZV9pbml0KGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLy8gaW5pdCBzdGF0aWMgcGFyYW1ldGVycworICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfVVNBR0UsIGN0eC0+dXNhZ2UpOworCisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9TSVpFKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX0ZSQU1FU0laRSwgZnJhbWVzaXplKTsKKworICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfUkFURShyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19GUkFNRVJBVEUsIGZyYW1lcmF0ZSk7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5wcm9maWxlKSB7CisgICAgY2FzZSBGRl9QUk9GSUxFX0hFVkNfTUFJTjoKKyAgICAgICAgcHJvZmlsZSA9IEFNRl9WSURFT19FTkNPREVSX0hFVkNfUFJPRklMRV9NQUlOOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHByb2ZpbGUgPT0gMCkgeworICAgICAgICBwcm9maWxlID0gY3R4LT5wcm9maWxlOworICAgIH0KKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1BST0ZJTEUsIHByb2ZpbGUpOworCisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19USUVSLCBjdHgtPnRpZXIpOworCisgICAgcHJvZmlsZV9sZXZlbCA9IGF2Y3R4LT5sZXZlbDsKKyAgICBpZiAocHJvZmlsZV9sZXZlbCA9PSAwKSB7CisgICAgICAgIHByb2ZpbGVfbGV2ZWwgPSBjdHgtPmxldmVsOworICAgIH0KKyAgICBpZiAocHJvZmlsZV9sZXZlbCAhPSAwKSB7CisgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfUFJPRklMRV9MRVZFTCwgcHJvZmlsZV9sZXZlbCk7CisgICAgfQorICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfUVVBTElUWV9QUkVTRVQsIGN0eC0+cXVhbGl0eSk7CisgICAgLy8gTWF4aW11bSBSZWZlcmVuY2UgRnJhbWVzCisgICAgaWYgKGF2Y3R4LT5yZWZzICE9IDApIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19NQVhfTlVNX1JFRlJBTUVTLCBhdmN0eC0+cmVmcyk7CisgICAgfQorICAgIC8vIEFzcGVjdCBSYXRpbworICAgIGlmIChhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gJiYgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKSB7CisgICAgICAgIEFNRlJhdGlvIHJhdGlvID0gQU1GQ29uc3RydWN0UmF0aW8oYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX1JBVElPKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX0FTUEVDVF9SQVRJTywgcmF0aW8pOworICAgIH0KKworICAgIC8vIFBpY3R1cmUgY29udHJvbCBwcm9wZXJ0aWVzCisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19OVU1fR09QU19QRVJfSURSLCBjdHgtPmdvcHNfcGVyX2lkcik7CisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19HT1BfU0laRSwgYXZjdHgtPmdvcF9zaXplKTsKKyAgICBpZiAoYXZjdHgtPnNsaWNlcyA+IDEpIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19TTElDRVNfUEVSX0ZSQU1FLCBhdmN0eC0+c2xpY2VzKTsKKyAgICB9CisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9CT09MKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX0RFX0JMT0NLSU5HX0ZJTFRFUl9ESVNBQkxFLCBkZWJsb2NraW5nX2ZpbHRlcik7CisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19IRUFERVJfSU5TRVJUSU9OX01PREUsIGN0eC0+aGVhZGVyX2luc2VydGlvbl9tb2RlKTsKKworICAgIC8vIFJhdGUgY29udHJvbAorICAgIC8vIGF1dG9kZXRlY3QgcmF0ZSBjb250cm9sIG1ldGhvZAorICAgIGlmIChjdHgtPnJhdGVfY29udHJvbF9tb2RlID09IEFNRl9WSURFT19FTkNPREVSX0hFVkNfUkFURV9DT05UUk9MX01FVEhPRF9VTktOT1dOKSB7CisgICAgICAgIGlmIChjdHgtPm1pbl9xcF9pICE9IC0xIHx8IGN0eC0+bWF4X3FwX2kgIT0gLTEgfHwKKyAgICAgICAgICAgIGN0eC0+bWluX3FwX3AgIT0gLTEgfHwgY3R4LT5tYXhfcXBfcCAhPSAtMSB8fAorICAgICAgICAgICAgY3R4LT5xcF9pICE9LTEgfHwgY3R4LT5xcF9wICE9IC0xKSB7CisgICAgICAgICAgICBjdHgtPnJhdGVfY29udHJvbF9tb2RlID0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19SQVRFX0NPTlRST0xfTUVUSE9EX0NPTlNUQU5UX1FQOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiUmF0ZSBjb250cm9sIHR1cm5lZCB0byBDUVBcbiIpOworICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5yY19tYXhfcmF0ZSA+IDApIHsKKyAgICAgICAgICAgIGN0eC0+cmF0ZV9jb250cm9sX21vZGUgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1JBVEVfQ09OVFJPTF9NRVRIT0RfUEVBS19DT05TVFJBSU5FRF9WQlI7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJSYXRlIGNvbnRyb2wgdHVybmVkIHRvIFBlYWsgVkJSXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN0eC0+cmF0ZV9jb250cm9sX21vZGUgPSBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1JBVEVfQ09OVFJPTF9NRVRIT0RfQ0JSOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiUmF0ZSBjb250cm9sIHR1cm5lZCB0byBDQlJcbiIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1JBVEVfQ09OVFJPTF9NRVRIT0QsIGN0eC0+cmF0ZV9jb250cm9sX21vZGUpOworICAgIGlmIChhdmN0eC0+cmNfYnVmZmVyX3NpemUpIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19WQlZfQlVGRkVSX1NJWkUsIGF2Y3R4LT5yY19idWZmZXJfc2l6ZSk7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kgIT0gMCkgeworICAgICAgICAgICAgaW50IGFtZl9idWZmZXJfZnVsbG5lc3MgPSBhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5ICogNjQgLyBhdmN0eC0+cmNfYnVmZmVyX3NpemU7CisgICAgICAgICAgICBpZiAoYW1mX2J1ZmZlcl9mdWxsbmVzcyA+IDY0KQorICAgICAgICAgICAgICAgIGFtZl9idWZmZXJfZnVsbG5lc3MgPSA2NDsKKyAgICAgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfSU5JVElBTF9WQlZfQlVGRkVSX0ZVTExORVNTLCBhbWZfYnVmZmVyX2Z1bGxuZXNzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBQcmUtUGFzcywgUHJlLUFuYWx5c2lzLCBUd28tUGFzcworICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfQk9PTChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19SQVRFX0NPTlRST0xfUFJFQU5BTFlTSVNfRU5BQkxFLCBjdHgtPnByZWFuYWx5c2lzKTsKKworICAgIGlmIChjdHgtPnJhdGVfY29udHJvbF9tb2RlID09IEFNRl9WSURFT19FTkNPREVSX0hFVkNfUkFURV9DT05UUk9MX01FVEhPRF9DT05TVEFOVF9RUCkgeworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0JPT0wocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfRU5BQkxFX1ZCQVEsIGZhbHNlKTsKKyAgICAgICAgaWYgKGN0eC0+ZW5hYmxlX3ZiYXEpCisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlZCQVEgaXMgbm90IHN1cHBvcnRlZCBieSBjcXAgUmF0ZSBDb250cm9sIE1ldGhvZCwgYXV0b21hdGljYWxseSBkaXNhYmxlZFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9CT09MKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX0VOQUJMRV9WQkFRLCAhIWN0eC0+ZW5hYmxlX3ZiYXEpOworICAgIH0KKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0JPT0wocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfTU9USU9OX0hBTEZfUElYRUwsIGN0eC0+bWVfaGFsZl9wZWwpOworICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfQk9PTChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19NT1RJT05fUVVBUlRFUlBJWEVMLCBjdHgtPm1lX3F1YXJ0ZXJfcGVsKTsKKworICAgIC8vIGluaXQgZHluYW1pYyByYXRlIGNvbnRyb2wgcGFyYW1zCisgICAgaWYgKGN0eC0+bWF4X2F1X3NpemUpCisgICAgICAgIGN0eC0+ZW5mb3JjZV9ocmQgPSAxOworICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfQk9PTChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19FTkZPUkNFX0hSRCwgY3R4LT5lbmZvcmNlX2hyZCk7CisgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9CT09MKHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX0ZJTExFUl9EQVRBX0VOQUJMRSwgY3R4LT5maWxsZXJfZGF0YSk7CisKKyAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1RBUkdFVF9CSVRSQVRFLCBhdmN0eC0+Yml0X3JhdGUpOworCisgICAgaWYgKGN0eC0+cmF0ZV9jb250cm9sX21vZGUgPT0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19SQVRFX0NPTlRST0xfTUVUSE9EX0NCUikgeworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1BFQUtfQklUUkFURSwgYXZjdHgtPmJpdF9yYXRlKTsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5yY19tYXhfcmF0ZSkgeworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1BFQUtfQklUUkFURSwgYXZjdHgtPnJjX21heF9yYXRlKTsKKyAgICB9IGVsc2UgaWYgKGN0eC0+cmF0ZV9jb250cm9sX21vZGUgPT0gQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19SQVRFX0NPTlRST0xfTUVUSE9EX1BFQUtfQ09OU1RSQUlORURfVkJSKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAicmF0ZSBjb250cm9sIG1vZGUgaXMgUEVBS19DT05TVFJBSU5FRF9WQlIgYnV0IHJjX21heF9yYXRlIGlzIG5vdCBzZXRcbiIpOworICAgIH0KKworICAgIC8vIGluaXQgZW5jb2RlcgorICAgIHJlcyA9IGN0eC0+ZW5jb2Rlci0+cFZ0YmwtPkluaXQoY3R4LT5lbmNvZGVyLCBjdHgtPmZvcm1hdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9CVUcsICJlbmNvZGVyLT5Jbml0KCkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJlcyk7CisKKyAgICAvLyBpbml0IGR5bmFtaWMgcGljdHVyZSBjb250cm9sIHBhcmFtcworICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfTUFYX0FVX1NJWkUsIGN0eC0+bWF4X2F1X3NpemUpOworCisgICAgaWYgKGN0eC0+bWluX3FwX2kgIT0gLTEpIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19NSU5fUVBfSSwgY3R4LT5taW5fcXBfaSk7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+cW1pbiAhPSAtMSkgeworICAgICAgICBpbnQgcXZhbCA9IGF2Y3R4LT5xbWluID4gNTEgPyA1MSA6IGF2Y3R4LT5xbWluOworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX01JTl9RUF9JLCBxdmFsKTsKKyAgICB9CisgICAgaWYgKGN0eC0+bWF4X3FwX2kgIT0gLTEpIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19NQVhfUVBfSSwgY3R4LT5tYXhfcXBfaSk7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+cW1heCAhPSAtMSkgeworICAgICAgICBpbnQgcXZhbCA9IGF2Y3R4LT5xbWF4ID4gNTEgPyA1MSA6IGF2Y3R4LT5xbWF4OworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX01BWF9RUF9JLCBxdmFsKTsKKyAgICB9CisgICAgaWYgKGN0eC0+bWluX3FwX3AgIT0gLTEpIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19NSU5fUVBfUCwgY3R4LT5taW5fcXBfcCk7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+cW1pbiAhPSAtMSkgeworICAgICAgICBpbnQgcXZhbCA9IGF2Y3R4LT5xbWluID4gNTEgPyA1MSA6IGF2Y3R4LT5xbWluOworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX01JTl9RUF9QLCBxdmFsKTsKKyAgICB9CisgICAgaWYgKGN0eC0+bWF4X3FwX3AgIT0gLTEpIHsKKyAgICAgICAgQU1GX0FTU0lHTl9QUk9QRVJUWV9JTlQ2NChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19NQVhfUVBfUCwgY3R4LT5tYXhfcXBfcCk7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+cW1heCAhPSAtMSkgeworICAgICAgICBpbnQgcXZhbCA9IGF2Y3R4LT5xbWF4ID4gNTEgPyA1MSA6IGF2Y3R4LT5xbWF4OworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX01BWF9RUF9QLCBxdmFsKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5xcF9wICE9IC0xKSB7CisgICAgICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfSU5UNjQocmVzLCBjdHgtPmVuY29kZXIsIEFNRl9WSURFT19FTkNPREVSX0hFVkNfUVBfSSwgY3R4LT5xcF9wKTsKKyAgICB9CisgICAgaWYgKGN0eC0+cXBfaSAhPSAtMSkgeworICAgICAgICBBTUZfQVNTSUdOX1BST1BFUlRZX0lOVDY0KHJlcywgY3R4LT5lbmNvZGVyLCBBTUZfVklERU9fRU5DT0RFUl9IRVZDX1FQX1AsIGN0eC0+cXBfaSk7CisgICAgfQorICAgIEFNRl9BU1NJR05fUFJPUEVSVFlfQk9PTChyZXMsIGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19SQVRFX0NPTlRST0xfU0tJUF9GUkFNRV9FTkFCTEUsIGN0eC0+c2tpcF9mcmFtZSk7CisKKworICAgIC8vIGZpbGwgZXh0cmFkYXRhCisgICAgcmVzID0gQU1GVmFyaWFudEluaXQoJnZhcik7CisgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHJlcyA9PSBBTUZfT0ssIEFWRVJST1JfQlVHLCAiQU1GVmFyaWFudEluaXQoKSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmVzKTsKKworICAgIHJlcyA9IGN0eC0+ZW5jb2Rlci0+cFZ0YmwtPkdldFByb3BlcnR5KGN0eC0+ZW5jb2RlciwgQU1GX1ZJREVPX0VOQ09ERVJfSEVWQ19FWFRSQURBVEEsICZ2YXIpOworICAgIEFNRl9SRVRVUk5fSUZfRkFMU0UoY3R4LCByZXMgPT0gQU1GX09LLCBBVkVSUk9SX0JVRywgIkdldFByb3BlcnR5KEFNRl9WSURFT19FTkNPREVSX0VYVFJBREFUQSkgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIHJlcyk7CisgICAgQU1GX1JFVFVSTl9JRl9GQUxTRShjdHgsIHZhci5wSW50ZXJmYWNlICE9IE5VTEwsIEFWRVJST1JfQlVHLCAiR2V0UHJvcGVydHkoQU1GX1ZJREVPX0VOQ09ERVJfRVhUUkFEQVRBKSByZXR1cm5lZCBOVUxMXG4iKTsKKworICAgIGd1aWQgPSBJSURfQU1GQnVmZmVyKCk7CisKKyAgICByZXMgPSB2YXIucEludGVyZmFjZS0+cFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHZhci5wSW50ZXJmYWNlLCAmZ3VpZCwgKHZvaWQqKikmYnVmZmVyKTsgLy8gcXVlcnkgZm9yIGJ1ZmZlciBpbnRlcmZhY2UKKyAgICBpZiAocmVzICE9IEFNRl9PSykgeworICAgICAgICB2YXIucEludGVyZmFjZS0+cFZ0YmwtPlJlbGVhc2UodmFyLnBJbnRlcmZhY2UpOworICAgIH0KKyAgICBBTUZfUkVUVVJOX0lGX0ZBTFNFKGN0eCwgcmVzID09IEFNRl9PSywgQVZFUlJPUl9CVUcsICJRdWVyeUludGVyZmFjZShJSURfQU1GQnVmZmVyKSBmYWlsZWQgd2l0aCBlcnJvciAlZFxuIiwgcmVzKTsKKworICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IChpbnQpYnVmZmVyLT5wVnRibC0+R2V0U2l6ZShidWZmZXIpOworICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICBidWZmZXItPnBWdGJsLT5SZWxlYXNlKGJ1ZmZlcik7CisgICAgICAgIHZhci5wSW50ZXJmYWNlLT5wVnRibC0+UmVsZWFzZSh2YXIucEludGVyZmFjZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhLCBidWZmZXItPnBWdGJsLT5HZXROYXRpdmUoYnVmZmVyKSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKworICAgIGJ1ZmZlci0+cFZ0YmwtPlJlbGVhc2UoYnVmZmVyKTsKKyAgICB2YXIucEludGVyZmFjZS0+cFZ0YmwtPlJlbGVhc2UodmFyLnBJbnRlcmZhY2UpOworCisgICAgcmV0dXJuIDA7Cit9CitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgZGVmYXVsdHNbXSA9IHsKKyAgICB7ICJyZWZzIiwgICAgICAgIi0xIiAgfSwKKyAgICB7ICJhc3BlY3QiLCAgICAgIjAiICAgfSwKKyAgICB7ICJiIiwgICAgICAgICAgIjJNIiAgfSwKKyAgICB7ICJnIiwgICAgICAgICAgIjI1MCIgfSwKKyAgICB7ICJzbGljZXMiLCAgICAgIjEiICAgfSwKKyAgICB7IE5VTEwgICAgICAgICAgICAgICAgfSwKK307CitzdGF0aWMgY29uc3QgQVZDbGFzcyBoZXZjX2FtZl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJoZXZjX2FtZiIsCisgICAgLml0ZW1fbmFtZSA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gPSBvcHRpb25zLAorICAgIC52ZXJzaW9uID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9oZXZjX2FtZl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoZXZjX2FtZiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFNRCBBTUYgSEVWQyBlbmNvZGVyIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCisgICAgLmluaXQgICAgICAgICAgID0gYW1mX2VuY29kZV9pbml0X2hldmMsCisgICAgLnNlbmRfZnJhbWUgICAgID0gZmZfYW1mX3NlbmRfZnJhbWUsCisgICAgLnJlY2VpdmVfcGFja2V0ID0gZmZfYW1mX3JlY2VpdmVfcGFja2V0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX2FtZl9lbmNvZGVfY2xvc2UsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFtZkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZoZXZjX2FtZl9jbGFzcywKKyAgICAuZGVmYXVsdHMgICAgICAgPSBkZWZhdWx0cywKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSEFSRFdBUkUsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSBmZl9hbWZfcGl4X2ZtdHMsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImFtZiIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hbXJuYmRlYy5jIGIvbGliYXZjb2RlYy9hbXJuYmRlYy5jCmluZGV4IDIyOTlhMjUuLmVhMjk5YWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYW1ybmJkZWMuYworKysgYi9saWJhdmNvZGVjL2Ftcm5iZGVjLmMKQEAgLTU0NywxMyArNTQ3LDEzIEBACiAgKiBAcGFyYW0gcCB0aGUgY29udGV4dAogICogQHBhcmFtIHN1YmZyYW1lIHVucGFja2VkIGFtciBzdWJmcmFtZQogICogQHBhcmFtIG1vZGUgbW9kZSBvZiB0aGUgY3VycmVudCBmcmFtZQotICogQHBhcmFtIGZpeGVkX3NwYXJzZSBzcGFyc2UgcmVzcHJlc2VudGF0aW9uIG9mIHRoZSBmaXhlZCB2ZWN0b3IKKyAqIEBwYXJhbSBmaXhlZF9zcGFyc2Ugc3BhcnNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaXhlZCB2ZWN0b3IKICAqLwogc3RhdGljIHZvaWQgcGl0Y2hfc2hhcnBlbmluZyhBTVJDb250ZXh0ICpwLCBpbnQgc3ViZnJhbWUsIGVudW0gTW9kZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJGaXhlZCAqZml4ZWRfc3BhcnNlKQogewogICAgIC8vIFRoZSBzcGVjIHN1Z2dlc3RzIHRoZSBjdXJyZW50IHBpdGNoIGdhaW4gaXMgYWx3YXlzIHVzZWQsIGJ1dCBpbiBvdGhlcgotICAgIC8vIG1vZGVzIHRoZSBwaXRjaCBhbmQgY29kZWJvb2sgZ2FpbnMgYXJlIGpvaW5seSBxdWFudGl6ZWQgKHNlYyA1LjguMikKKyAgICAvLyBtb2RlcyB0aGUgcGl0Y2ggYW5kIGNvZGVib29rIGdhaW5zIGFyZSBqb2ludGx5IHF1YW50aXplZCAoc2VjIDUuOC4yKQogICAgIC8vIHNvIHRoZSBjb2RlYm9vayBnYWluIGNhbm5vdCBkZXBlbmQgb24gdGhlIHF1YW50aXplZCBwaXRjaCBnYWluLgogICAgIGlmIChtb2RlID09IE1PREVfMTJrMikKICAgICAgICAgcC0+YmV0YSA9IEZGTUlOKHAtPnBpdGNoX2dhaW5bNF0sIDEuMCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FtcndiZGF0YS5oIGIvbGliYXZjb2RlYy9hbXJ3YmRhdGEuaAppbmRleCA4MzkwNTgyLi44YThjYmZkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FtcndiZGF0YS5oCisrKyBiL2xpYmF2Y29kZWMvYW1yd2JkYXRhLmgKQEAgLTM4LDcgKzM4LDcgQEAKIAogI2RlZmluZSBNSU5fSVNGX1NQQUNJTkcgICAgICgxMjguMCAvIDMyNzY4LjApIC8vLzwgbWluaW11bSBpc2YgZ2FwCiAjZGVmaW5lIFBSRURfRkFDVE9SICAgICAgICAgKDEuMCAvIDMuMCkKLSNkZWZpbmUgTUlOX0VORVJHWSAgICAgICAgIC0xNC4wICAgICAgICAgICAgICAvLy88IGluaXRpYWwgaW5ubm92YXRpb24gZW5lcmd5IChkQikKKyNkZWZpbmUgTUlOX0VORVJHWSAgICAgICAgIC0xNC4wICAgICAgICAgICAgICAvLy88IGluaXRpYWwgaW5ub3ZhdGlvbiBlbmVyZ3kgKGRCKQogI2RlZmluZSBFTkVSR1lfTUVBTiAgICAgICAgIDMwLjAgICAgICAgICAgICAgIC8vLzwgbWVhbiBpbm5vdmF0aW9uIGVuZXJneSAoZEIpIGluIGFsbCBtb2RlcwogI2RlZmluZSBQUkVFTVBIX0ZBQyAgICAgICAgIDAuNjggICAgICAgICAgICAgIC8vLzwgZmFjdG9yIHVzZWQgdG8gZGUtZW1waGFzaXplIHN5bnRoZXNpcwogCkBAIC02NzMsNyArNjczLDcgQEAKIH07CiAKIC8qKiBSZW9yZGVyaW5nIGFycmF5IGFkZHJlc3NlcyBmb3IgZWFjaCBtb2RlICovCi1zdGF0aWMgY29uc3QgdWludDE2X3QqIGFtcl9iaXRfb3JkZXJpbmdzX2J5X21vZGVbXSA9IHsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCAqIGNvbnN0IGFtcl9iaXRfb3JkZXJpbmdzX2J5X21vZGVbXSA9IHsKICAgICBvcmRlcl9NT0RFXzZrNjAsCiAgICAgb3JkZXJfTU9ERV84azg1LAogICAgIG9yZGVyX01PREVfMTJrNjUsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FtcndiZGVjLmMgYi9saWJhdmNvZGVjL2FtcndiZGVjLmMKaW5kZXggYTk5ZGJkMS4uNDdmZTdlYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hbXJ3YmRlYy5jCisrKyBiL2xpYmF2Y29kZWMvYW1yd2JkZWMuYwpAQCAtMTUxLDcgKzE1MSw2IEBACiAgKgogICogQHBhcmFtW2luXSAgaW5kICAgICAgICAgICAgICAgICBBcnJheSBvZiA1IGluZGV4ZXMKICAqIEBwYXJhbVtvdXRdIGlzZl9xICAgICAgICAgICAgICAgQnVmZmVyIGZvciBpc2ZfcVtMUF9PUkRFUl0KLSAqCiAgKi8KIHN0YXRpYyB2b2lkIGRlY29kZV9pc2ZfaW5kaWNlc18zNmIodWludDE2X3QgKmluZCwgZmxvYXQgKmlzZl9xKQogewpAQCAtMTc4LDcgKzE3Nyw2IEBACiAgKgogICogQHBhcmFtW2luXSAgaW5kICAgICAgICAgICAgICAgICBBcnJheSBvZiA3IGluZGV4ZXMKICAqIEBwYXJhbVtvdXRdIGlzZl9xICAgICAgICAgICAgICAgQnVmZmVyIGZvciBpc2ZfcVtMUF9PUkRFUl0KLSAqCiAgKi8KIHN0YXRpYyB2b2lkIGRlY29kZV9pc2ZfaW5kaWNlc180NmIodWludDE2X3QgKmluZCwgZmxvYXQgKmlzZl9xKQogewpAQCAtMjEyLDcgKzIxMCw2IEBACiAgKgogICogQHBhcmFtW2luLG91dF0gaXNmX3EgICAgICAgICAgICBDdXJyZW50IHF1YW50aXplZCBJU0YKICAqIEBwYXJhbVtpbixvdXRdIGlzZl9wYXN0ICAgICAgICAgUGFzdCBxdWFudGl6ZWQgSVNGCi0gKgogICovCiBzdGF0aWMgdm9pZCBpc2ZfYWRkX21lYW5fYW5kX3Bhc3QoZmxvYXQgKmlzZl9xLCBmbG9hdCAqaXNmX3Bhc3QpCiB7CkBAIC0yNjUsNyArMjYyLDcgQEAKICAgICAgICAgICAgICpsYWdfZnJhYyA9IHBpdGNoX2luZGV4IC0gKCpsYWdfaW50IDw8IDIpICsgMTM2OwogICAgICAgICB9IGVsc2UgaWYgKHBpdGNoX2luZGV4IDwgNDQwKSB7CiAgICAgICAgICAgICAqbGFnX2ludCAgPSAocGl0Y2hfaW5kZXggKyAyNTcgLSAzNzYpID4+IDE7Ci0gICAgICAgICAgICAqbGFnX2ZyYWMgPSAocGl0Y2hfaW5kZXggLSAoKmxhZ19pbnQgPDwgMSkgKyAyNTYgLSAzNzYpIDw8IDE7CisgICAgICAgICAgICAqbGFnX2ZyYWMgPSAocGl0Y2hfaW5kZXggLSAoKmxhZ19pbnQgPDwgMSkgKyAyNTYgLSAzNzYpICogMjsKICAgICAgICAgICAgIC8qIHRoZSBhY3R1YWwgcmVzb2x1dGlvbiBpcyAxLzIgYnV0IGV4cHJlc3NlZCBhcyAxLzQgKi8KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICpsYWdfaW50ICA9IHBpdGNoX2luZGV4IC0gMjgwOwpAQCAtMjk1LDcgKzI5Miw3IEBACiAgICAgaWYgKHN1YmZyYW1lID09IDAgfHwgKHN1YmZyYW1lID09IDIgJiYgbW9kZSAhPSBNT0RFXzZrNjApKSB7CiAgICAgICAgIGlmIChwaXRjaF9pbmRleCA8IDExNikgewogICAgICAgICAgICAgKmxhZ19pbnQgID0gKHBpdGNoX2luZGV4ICsgNjkpID4+IDE7Ci0gICAgICAgICAgICAqbGFnX2ZyYWMgPSAocGl0Y2hfaW5kZXggLSAoKmxhZ19pbnQgPDwgMSkgKyA2OCkgPDwgMTsKKyAgICAgICAgICAgICpsYWdfZnJhYyA9IChwaXRjaF9pbmRleCAtICgqbGFnX2ludCA8PCAxKSArIDY4KSAqIDI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAqbGFnX2ludCAgPSBwaXRjaF9pbmRleCAtIDI0OwogICAgICAgICAgICAgKmxhZ19mcmFjID0gMDsKQEAgLTMwNSw3ICszMDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJXQl9QX0RFTEFZX01JTiwgQU1SV0JfUF9ERUxBWV9NQVggLSAxNSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKmxhZ19pbnQgID0gKHBpdGNoX2luZGV4ICsgMSkgPj4gMTsKLSAgICAgICAgKmxhZ19mcmFjID0gKHBpdGNoX2luZGV4IC0gKCpsYWdfaW50IDw8IDEpKSA8PCAxOworICAgICAgICAqbGFnX2ZyYWMgPSAocGl0Y2hfaW5kZXggLSAoKmxhZ19pbnQgPDwgMSkpICogMjsKICAgICAgICAgKmxhZ19pbnQgKz0gKmJhc2VfbGFnX2ludDsKICAgICB9CiB9CkBAIC02MTQsNyArNjExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJXQl9TRlJfU0laRSkgKgogICAgICAgICAgICAgICAgICAgICBmX2dhaW4gKiBmX2dhaW47CiAKLSAgICByZXR1cm4gKHBfZW5lciAtIGZfZW5lcikgLyAocF9lbmVyICsgZl9lbmVyKTsKKyAgICByZXR1cm4gKHBfZW5lciAtIGZfZW5lcikgLyAocF9lbmVyICsgZl9lbmVyICsgMC4wMSk7CiB9CiAKIC8qKgpAQCAtODY1LDE1ICs4NjIsMjAgQEAKIHsKICAgICBpbnQgd3NwID0gKHZhZCA+IDApOwogICAgIGZsb2F0IHRpbHQ7CisgICAgZmxvYXQgdG1wOwogCiAgICAgaWYgKGN0eC0+ZnJfY3VyX21vZGUgPT0gTU9ERV8yM2s4NSkKICAgICAgICAgcmV0dXJuIHF1YV9oYl9nYWluW2hiX2lkeF0gKiAoMS4wZiAvICgxIDw8IDE0KSk7CiAKLSAgICB0aWx0ID0gY3R4LT5jZWxwbV9jdHguZG90X3Byb2R1Y3RmKHN5bnRoLCBzeW50aCArIDEsIEFNUldCX1NGUl9TSVpFIC0gMSkgLwotICAgICAgICAgICBjdHgtPmNlbHBtX2N0eC5kb3RfcHJvZHVjdGYoc3ludGgsIHN5bnRoLCBBTVJXQl9TRlJfU0laRSk7CisgICAgdG1wID0gY3R4LT5jZWxwbV9jdHguZG90X3Byb2R1Y3RmKHN5bnRoLCBzeW50aCArIDEsIEFNUldCX1NGUl9TSVpFIC0gMSk7CisKKyAgICBpZiAodG1wID4gMCkgeworICAgICAgICB0aWx0ID0gdG1wIC8gY3R4LT5jZWxwbV9jdHguZG90X3Byb2R1Y3RmKHN5bnRoLCBzeW50aCwgQU1SV0JfU0ZSX1NJWkUpOworICAgIH0gZWxzZQorICAgICAgICB0aWx0ID0gMDsKIAogICAgIC8qIHJldHVybiBnYWluIGJvdW5kZWQgYnkgWzAuMSwgMS4wXSAqLwotICAgIHJldHVybiBhdl9jbGlwZigoMS4wIC0gRkZNQVgoMC4wLCB0aWx0KSkgKiAoMS4yNSAtIDAuMjUgKiB3c3ApLCAwLjEsIDEuMCk7CisgICAgcmV0dXJuIGF2X2NsaXBmKCgxLjAgLSB0aWx0KSAqICgxLjI1IC0gMC4yNSAqIHdzcCksIDAuMSwgMS4wKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FubS5jIGIvbGliYXZjb2RlYy9hbm0uYwppbmRleCAyOWQ1OWZiLi5hYjZhMzk5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FubS5jCisrKyBiL2xpYmF2Y29kZWMvYW5tLmMKQEAgLTU0LDcgKzU0LDcgQEAKIAogICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZzLT5nYiwgMTYgKiA4KTsKICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgICAgIHMtPnBhbGV0dGVbaV0gPSBieXRlc3RyZWFtMl9nZXRfbGUzMnUoJnMtPmdiKTsKKyAgICAgICAgcy0+cGFsZXR0ZVtpXSA9ICgweEZGVSA8PCAyNCkgfCBieXRlc3RyZWFtMl9nZXRfbGUzMnUoJnMtPmdiKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMTk5LDQgKzE5OSw1IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKICAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYW5zaS5jIGIvbGliYXZjb2RlYy9hbnNpLmMKaW5kZXggMjFkNWFlMS4uZjFmYWZhYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hbnNpLmMKKysrIGIvbGliYXZjb2RlYy9hbnNpLmMKQEAgLTgwLDEwICs4MCw2IEBACiAgICAgQW5zaUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OwogCi0gICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGlmICghcy0+ZnJhbWUpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KICAgICAvKiBkZWZhdWx0cyAqLwogICAgIHMtPmZvbnQgICAgICAgID0gYXZwcml2X3ZnYTE2X2ZvbnQ7CiAgICAgcy0+Zm9udF9oZWlnaHQgPSAxNjsKQEAgLTk0LDcgKzkwLDE1IEBACiAgICAgICAgIGludCByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgODAgPDwgMywgMjUgPDwgNCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT53aWR0aCAlIEZPTlRfV0lEVEggfHwgYXZjdHgtPmhlaWdodCAlIHMtPmZvbnRfaGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBkaW1lbnNpb25zICVkICVkXG4iLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KKworICAgIHMtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTIwNiw3ICsyMTAsNyBAQAogICAgICAgICBzLT55ID0gcy0+bmJfYXJncyA+IDAgPyBhdl9jbGlwKChzLT5hcmdzWzBdIC0gMSkqcy0+Zm9udF9oZWlnaHQsIDAsIGF2Y3R4LT5oZWlnaHQgLSBzLT5mb250X2hlaWdodCkgOiAwOwogICAgICAgICBzLT54ID0gcy0+bmJfYXJncyA+IDEgPyBhdl9jbGlwKChzLT5hcmdzWzFdIC0gMSkqRk9OVF9XSURUSCwgICAgIDAsIGF2Y3R4LT53aWR0aCAgLSBGT05UX1dJRFRIKSA6IDA7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgJ2gnOiAvL3NldCBjcmVlbiBtb2RlCisgICAgY2FzZSAnaCc6IC8vc2V0IHNjcmVlbiBtb2RlCiAgICAgY2FzZSAnbCc6IC8vcmVzZXQgc2NyZWVuIG1vZGUKICAgICAgICAgaWYgKHMtPm5iX2FyZ3MgPCAyKQogICAgICAgICAgICAgcy0+YXJnc1swXSA9IERFRkFVTFRfU0NSRUVOX01PREU7CkBAIC00NzksNCArNDgzLDUgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfY2xvc2UsCiAgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FwZWRlYy5jIGIvbGliYXZjb2RlYy9hcGVkZWMuYwppbmRleCBiZWQ5YTk2Li4xNWViNDE2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FwZWRlYy5jCisrKyBiL2xpYmF2Y29kZWMvYXBlZGVjLmMKQEAgLTMzOSwxMCArMzM5LDEwIEBACiB9CiAKIC8qKgotICogQ2FsY3VsYXRlIGN1bG11bGF0aXZlIGZyZXF1ZW5jeSBmb3IgbmV4dCBzeW1ib2wuIERvZXMgTk8gdXBkYXRlIQorICogQ2FsY3VsYXRlIGN1bXVsYXRpdmUgZnJlcXVlbmN5IGZvciBuZXh0IHN5bWJvbC4gRG9lcyBOTyB1cGRhdGUhCiAgKiBAcGFyYW0gY3R4IGRlY29kZXIgY29udGV4dAogICogQHBhcmFtIHRvdF9mIGlzIHRoZSB0b3RhbCBmcmVxdWVuY3kgb3IgKGNvZGVfdmFsdWUpMTw8c2hpZnQKLSAqIEByZXR1cm4gdGhlIGN1bG11bGF0aXZlIGZyZXF1ZW5jeQorICogQHJldHVybiB0aGUgY3VtdWxhdGl2ZSBmcmVxdWVuY3kKICAqLwogc3RhdGljIGlubGluZSBpbnQgcmFuZ2VfZGVjb2RlX2N1bGZyZXEoQVBFQ29udGV4dCAqY3R4LCBpbnQgdG90X2YpCiB7CkBAIC00OTUsNyArNDk1LDcgQEAKICAgICBlbHNlIGlmKHJpY2UtPmsgPD0gTUlOX0NBQ0hFX0JJVFMpIHsKICAgICAgICAgeCA9IChvdmVyZmxvdyA8PCByaWNlLT5rKSArIGdldF9iaXRzKGdiLCByaWNlLT5rKTsKICAgICB9IGVsc2UgewotICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgYml0czogJWRcbiIsIHJpY2UtPmspOworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgYml0czogJSJQUkl1MzIiXG4iLCByaWNlLT5rKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogICAgIHJpY2UtPmtzdW0gKz0geCAtIChyaWNlLT5rc3VtICsgOCA+PiA0KTsKQEAgLTEyODQsOCArMTI4NCwxNiBAQAogICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBhZGFwdGlvbiBjb2VmZmljaWVudHMgKi8KICAgICAgICAgICAgIGFic3JlcyA9IEZGQUJTKHJlcyk7CiAgICAgICAgICAgICBpZiAoYWJzcmVzKQotICAgICAgICAgICAgICAgICpmLT5hZGFwdGNvZWZmcyA9ICgocmVzICYgSU5UMzJfTUlOKSBeICgtKDE8PDMwKSkpID4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDI1ICsgKGFic3JlcyA8PSBmLT5hdmcqMykgKyAoYWJzcmVzIDw9IGYtPmF2Zyo0LzMpKTsKKyAgICAgICAgICAgICAgICAqZi0+YWRhcHRjb2VmZnMgPSBBUEVTSUdOKHJlcykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4IDw8ICgoYWJzcmVzID4gZi0+YXZnICogMykgKyAoYWJzcmVzID4gZi0+YXZnICogNCAvIDMpKSk7CisgICAgICAgICAgICAgICAgLyogZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFic3JlcyA8PSBmLT5hdmcgKiA0IC8gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICpmLT5hZGFwdGNvZWZmcyA9IEFQRVNJR04ocmVzKSAqIDg7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFic3JlcyA8PSBmLT5hdmcgKiAzKQorICAgICAgICAgICAgICAgICAgICAgICAgKmYtPmFkYXB0Y29lZmZzID0gQVBFU0lHTihyZXMpICogMTY7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICpmLT5hZGFwdGNvZWZmcyA9IEFQRVNJR04ocmVzKSAqIDMyOworICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgKmYtPmFkYXB0Y29lZmZzID0gMDsKIApAQCAtMTM3Miw3ICsxMzgwLDcgQEAKICAgICBpbnQzMl90ICpkZWNvZGVkMCA9IGN0eC0+ZGVjb2RlZFswXTsKICAgICBpbnQzMl90ICpkZWNvZGVkMSA9IGN0eC0+ZGVjb2RlZFsxXTsKIAotICAgIGlmIChjdHgtPmZyYW1lZmxhZ3MgJiBBUEVfRlJBTUVDT0RFX1NURVJFT19TSUxFTkNFKSB7CisgICAgaWYgKChjdHgtPmZyYW1lZmxhZ3MgJiBBUEVfRlJBTUVDT0RFX1NURVJFT19TSUxFTkNFKSA9PSBBUEVfRlJBTUVDT0RFX1NURVJFT19TSUxFTkNFKSB7CiAgICAgICAgIC8qIFdlIGFyZSBwdXJlIHNpbGVuY2UsIHNvIHdlJ3JlIGRvbmUuICovCiAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJwdXJlIHNpbGVuY2Ugc3RlcmVvXG4iKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTQwNCw2ICsxNDEyLDcgQEAKICAgICBpbnQzMl90ICpzYW1wbGUyNDsKICAgICBpbnQgaSwgY2gsIHJldDsKICAgICBpbnQgYmxvY2tzdG9kZWNvZGU7CisgICAgdWludDY0X3QgZGVjb2RlZF9idWZmZXJfc2l6ZTsKIAogICAgIC8qIHRoaXMgc2hvdWxkIG5ldmVyIGJlIG5lZ2F0aXZlLCBidXQgYmFkIHRoaW5ncyB3aWxsIGhhcHBlbiBpZiBpdCBpcywgc28KICAgICAgICBjaGVjayBpdCBqdXN0IHRvIG1ha2Ugc3VyZS4gKi8KQEAgLTE0NTksNyArMTQ2OCw3IEBACiAgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBvZmZzZXQpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFuYmxvY2tzIHx8IG5ibG9ja3MgPiBJTlRfTUFYKSB7CisgICAgICAgIGlmICghbmJsb2NrcyB8fCBuYmxvY2tzID4gSU5UX01BWCAvIDIgLyBzaXplb2YoKnMtPmRlY29kZWRfYnVmZmVyKSAtIDgpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgY291bnQ6ICUiUFJJdTMyIi5cbiIsCiAgICAgICAgICAgICAgICAgICAgbmJsb2Nrcyk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTE0ODUsOCArMTQ5NCw5IEBACiAgICAgICAgIGJsb2Nrc3RvZGVjb2RlID0gcy0+c2FtcGxlczsKIAogICAgIC8qIHJlYWxsb2NhdGUgZGVjb2RlZCBzYW1wbGUgYnVmZmVyIGlmIG5lZWRlZCAqLwotICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5kZWNvZGVkX2J1ZmZlciwgJnMtPmRlY29kZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAyICogRkZBTElHTihibG9ja3N0b2RlY29kZSwgOCkgKiBzaXplb2YoKnMtPmRlY29kZWRfYnVmZmVyKSk7CisgICAgZGVjb2RlZF9idWZmZXJfc2l6ZSA9IDJMTCAqIEZGQUxJR04oYmxvY2tzdG9kZWNvZGUsIDgpICogc2l6ZW9mKCpzLT5kZWNvZGVkX2J1ZmZlcik7CisgICAgYXZfYXNzZXJ0MChkZWNvZGVkX2J1ZmZlcl9zaXplIDw9IElOVF9NQVgpOworICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5kZWNvZGVkX2J1ZmZlciwgJnMtPmRlY29kZWRfc2l6ZSwgZGVjb2RlZF9idWZmZXJfc2l6ZSk7CiAgICAgaWYgKCFzLT5kZWNvZGVkX2J1ZmZlcikKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBtZW1zZXQocy0+ZGVjb2RlZF9idWZmZXIsIDAsIHMtPmRlY29kZWRfc2l6ZSk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FwdHguYyBiL2xpYmF2Y29kZWMvYXB0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NTBkODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FwdHguYwpAQCAtMCwwICsxLDExNjIgQEAKKy8qCisgKiBBdWRpbyBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgY29kZWMgZm9yIEJsdWV0b290aCAoYXB0WCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAiYXVkaW9fZnJhbWVfcXVldWUuaCIKKworCitlbnVtIGNoYW5uZWxzIHsKKyAgICBMRUZULAorICAgIFJJR0hULAorICAgIE5CX0NIQU5ORUxTCit9OworCitlbnVtIHN1YmJhbmRzIHsKKyAgICBMRiwgIC8vIExvdyBGcmVxdWVuY3kgKDAtNS41IGtIeikKKyAgICBNTEYsIC8vIE1lZGl1bS1Mb3cgRnJlcXVlbmN5ICg1LjUtMTFrSHopCisgICAgTUhGLCAvLyBNZWRpdW0tSGlnaCBGcmVxdWVuY3kgKDExLTE2LjVrSHopCisgICAgSEYsICAvLyBIaWdoIEZyZXF1ZW5jeSAoMTYuNS0yMmtIeikKKyAgICBOQl9TVUJCQU5EUworfTsKKworI2RlZmluZSBOQl9GSUxURVJTIDIKKyNkZWZpbmUgRklMVEVSX1RBUFMgMTYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBwb3M7CisgICAgaW50MzJfdCBidWZmZXJbMipGSUxURVJfVEFQU107Cit9IEZpbHRlclNpZ25hbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEZpbHRlclNpZ25hbCBvdXRlcl9maWx0ZXJfc2lnbmFsW05CX0ZJTFRFUlNdOworICAgIEZpbHRlclNpZ25hbCBpbm5lcl9maWx0ZXJfc2lnbmFsW05CX0ZJTFRFUlNdW05CX0ZJTFRFUlNdOworfSBRTUZBbmFseXNpczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgcXVhbnRpemVkX3NhbXBsZTsKKyAgICBpbnQzMl90IHF1YW50aXplZF9zYW1wbGVfcGFyaXR5X2NoYW5nZTsKKyAgICBpbnQzMl90IGVycm9yOworfSBRdWFudGl6ZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgcXVhbnRpemF0aW9uX2ZhY3RvcjsKKyAgICBpbnQzMl90IGZhY3Rvcl9zZWxlY3Q7CisgICAgaW50MzJfdCByZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2U7Cit9IEludmVydFF1YW50aXplOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50MzJfdCBwcmV2X3NpZ25bMl07CisgICAgaW50MzJfdCBzX3dlaWdodFsyXTsKKyAgICBpbnQzMl90IGRfd2VpZ2h0WzI0XTsKKyAgICBpbnQzMl90IHBvczsKKyAgICBpbnQzMl90IHJlY29uc3RydWN0ZWRfZGlmZmVyZW5jZXNbNDhdOworICAgIGludDMyX3QgcHJldmlvdXNfcmVjb25zdHJ1Y3RlZF9zYW1wbGU7CisgICAgaW50MzJfdCBwcmVkaWN0ZWRfZGlmZmVyZW5jZTsKKyAgICBpbnQzMl90IHByZWRpY3RlZF9zYW1wbGU7Cit9IFByZWRpY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQzMl90IGNvZGV3b3JkX2hpc3Rvcnk7CisgICAgaW50MzJfdCBkaXRoZXJfcGFyaXR5OworICAgIGludDMyX3QgZGl0aGVyW05CX1NVQkJBTkRTXTsKKworICAgIFFNRkFuYWx5c2lzIHFtZjsKKyAgICBRdWFudGl6ZSBxdWFudGl6ZVtOQl9TVUJCQU5EU107CisgICAgSW52ZXJ0UXVhbnRpemUgaW52ZXJ0X3F1YW50aXplW05CX1NVQkJBTkRTXTsKKyAgICBQcmVkaWN0aW9uIHByZWRpY3Rpb25bTkJfU1VCQkFORFNdOworfSBDaGFubmVsOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGhkOworICAgIGludCBibG9ja19zaXplOworICAgIGludDMyX3Qgc3luY19pZHg7CisgICAgQ2hhbm5lbCBjaGFubmVsc1tOQl9DSEFOTkVMU107CisgICAgQXVkaW9GcmFtZVF1ZXVlIGFmcTsKK30gQXB0WENvbnRleHQ7CisKKworc3RhdGljIGNvbnN0IGludDMyX3QgcXVhbnRpemVfaW50ZXJ2YWxzX0xGWzY1XSA9IHsKKyAgICAgIC05OTQ4LCAgICA5OTQ4LCAgIDI5ODYwLCAgIDQ5ODA4LCAgIDY5ODIyLCAgIDg5OTI2LCAgMTEwMTQ0LCAgMTMwNTAyLAorICAgICAxNTEwMjYsICAxNzE3MzgsICAxOTI2NjYsICAyMTM4MzIsICAyMzUyNjQsICAyNTY5ODIsICAyNzkwMTQsICAzMDEzODQsCisgICAgIDMyNDExOCwgIDM0NzI0NCwgIDM3MDc5MCwgIDM5NDc4MiwgIDQxOTI1MCwgIDQ0NDIyNiwgIDQ2OTc0MiwgIDQ5NTgzMiwKKyAgICAgNTIyNTM2LCAgNTQ5ODkwLCAgNTc3OTM2LCAgNjA2NzIwLCAgNjM2MjkwLCAgNjY2NzAwLCAgNjk4MDA2LCAgNzMwMjcwLAorICAgICA3NjM1NjIsICA3OTc5NTgsICA4MzM1MzgsICA4NzAzOTgsICA5MDg2NDAsICA5NDgzNzYsICA5ODk3NDAsIDEwMzI4NzQsCisgICAgMTA3Nzk0OCwgMTEyNTE1MCwgMTE3NDcwMCwgMTIyNjg1MCwgMTI4MTkwMCwgMTM0MDE5NiwgMTQwMjE1NiwgMTQ2ODI4MiwKKyAgICAxNTM5MTgyLCAxNjE1NjEwLCAxNjk4NTE0LCAxNzg5MDk4LCAxODg4OTQ0LCAyMDAwMTY4LCAyMTI1NzAwLCAyMjY5NzUwLAorICAgIDI0Mzg2NzAsIDI2NDI2NjAsIDI4OTk0NjIsIDMyNDMyNDAsIDM3NDYwNzgsIDQ1MzUxMzgsIDU2NjQwOTgsIDcxMDI0MjQsCisgICAgODg5NzQ2MiwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBpbnZlcnRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTEZbNjVdID0geworICAgICAgIDk5NDgsICAgOTk0OCwgICA5OTYyLCAgIDk5ODgsICAxMDAyNiwgIDEwMDc4LCAgMTAxNDIsICAxMDIxOCwKKyAgICAgIDEwMzA2LCAgMTA0MDgsICAxMDUyMCwgIDEwNjQ2LCAgMTA3ODQsICAxMDkzNCwgIDExMDk4LCAgMTEyNzQsCisgICAgICAxMTQ2MiwgIDExNjY0LCAgMTE4ODAsICAxMjExMiwgIDEyMzU4LCAgMTI2MTgsICAxMjg5OCwgIDEzMTk0LAorICAgICAgMTM1MTAsICAxMzg0NCwgIDE0MjAyLCAgMTQ1ODIsICAxNDk4OCwgIDE1NDIyLCAgMTU4ODQsICAxNjM4MCwKKyAgICAgIDE2OTEyLCAgMTc0ODQsICAxODA5OCwgIDE4NzYyLCAgMTk0ODAsICAyMDI1OCwgIDIxMTA2LCAgMjIwMzAsCisgICAgICAyMzA0NCwgIDI0MTU4LCAgMjUzOTAsICAyNjc2MCwgIDI4MjkwLCAgMzAwMDgsICAzMTk1NCwgIDM0MTcyLAorICAgICAgMzY3MjgsICAzOTcwMCwgIDQzMjAyLCAgNDczODIsICA1MjQ2MiwgIDU4NzYyLCAgNjY3NzAsICA3NzI4MCwKKyAgICAgIDkxNjQyLCAxMTIzNDgsIDE0NDQ1MiwgMTk5MzI2LCAzMDM1MTIsIDQ4NTU0NiwgNjQzNDE0LCA3OTQ5MTQsCisgICAgMTAwMDEyNCwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBxdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19MRls2NV0gPSB7CisgICAgICAgIDAsICAgICA0LCAgICAgNywgICAgMTAsICAgIDEzLCAgICAxNiwgICAgMTksICAgIDIyLAorICAgICAgIDI2LCAgICAyOCwgICAgMzIsICAgIDM1LCAgICAzOCwgICAgNDEsICAgIDQ0LCAgICA0NywKKyAgICAgICA1MSwgICAgNTQsICAgIDU4LCAgICA2MiwgICAgNjUsICAgIDcwLCAgICA3NCwgICAgNzksCisgICAgICAgODQsICAgIDkwLCAgICA5NSwgICAxMDIsICAgMTA5LCAgIDExNiwgICAxMjQsICAgMTMzLAorICAgICAgMTQzLCAgIDE1NCwgICAxNjYsICAgMTgwLCAgIDE5NSwgICAyMTIsICAgMjMxLCAgIDI1NCwKKyAgICAgIDI3OSwgICAzMDgsICAgMzQzLCAgIDM4MywgICA0MzAsICAgNDg3LCAgIDU1NSwgICA2MzksCisgICAgICA3NDMsICAgODc2LCAgMTA0NSwgIDEyNzAsICAxNTc1LCAgMjAwMiwgIDI2MjgsICAzNTkxLAorICAgICA1MTc3LCAgODAyNiwgMTM3MTksIDI2MDQ3LCA0NTUwOSwgMzk0NjcsIDM3ODc1LCA1MTMwMywKKyAgICAgICAgMCwKK307CitzdGF0aWMgY29uc3QgaW50MTZfdCBxdWFudGl6ZV9mYWN0b3Jfc2VsZWN0X29mZnNldF9MRls2NV0gPSB7CisgICAgICAwLCAtMjEsIC0xOSwgLTE3LCAtMTUsIC0xMiwgLTEwLCAgLTgsCisgICAgIC02LCAgLTQsICAtMSwgICAxLCAgIDMsICAgNiwgICA4LCAgMTAsCisgICAgIDEzLCAgMTUsICAxOCwgIDIwLCAgMjMsICAyNiwgIDI5LCAgMzEsCisgICAgIDM0LCAgMzcsICA0MCwgIDQzLCAgNDcsICA1MCwgIDUzLCAgNTcsCisgICAgIDYwLCAgNjQsICA2OCwgIDcyLCAgNzYsICA4MCwgIDg1LCAgODksCisgICAgIDk0LCAgOTksIDEwNSwgMTEwLCAxMTYsIDEyMywgMTI5LCAxMzYsCisgICAgMTQ0LCAxNTIsIDE2MSwgMTcxLCAxODIsIDE5NCwgMjA3LCAyMjMsCisgICAgMjQxLCAyNjMsIDI5MSwgMzI4LCAzODIsIDQ2NywgNTIyLCA1MjIsCisgICAgNTIyLAorfTsKKworCitzdGF0aWMgY29uc3QgaW50MzJfdCBxdWFudGl6ZV9pbnRlcnZhbHNfTUxGWzldID0geworICAgIC04OTgwNiwgODk4MDYsIDI3ODUwMiwgNDk0MzM4LCA3NTk0NDIsIDExMTMxMTIsIDE2NTIzMjIsIDI3MjAyNTYsIDUxOTAxODYsCit9Oworc3RhdGljIGNvbnN0IGludDMyX3QgaW52ZXJ0X3F1YW50aXplX2RpdGhlcl9mYWN0b3JzX01MRls5XSA9IHsKKyAgICA4OTgwNiwgODk4MDYsIDk4ODkwLCAxMTY5NDYsIDE0ODE1OCwgMjA1NTEyLCAzMzM2OTgsIDczNDIzNiwgMTczNTY5NiwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBxdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19NTEZbOV0gPSB7CisgICAgMCwgMjI3MSwgNDUxNCwgNzgwMywgMTQzMzksIDMyMDQ3LCAxMDAxMzUsIDI1MDM2NSwgMCwKK307CitzdGF0aWMgY29uc3QgaW50MTZfdCBxdWFudGl6ZV9mYWN0b3Jfc2VsZWN0X29mZnNldF9NTEZbOV0gPSB7CisgICAgMCwgLTE0LCA2LCAyOSwgNTgsIDk2LCAxNTQsIDI3MCwgNTIxLAorfTsKKworCitzdGF0aWMgY29uc3QgaW50MzJfdCBxdWFudGl6ZV9pbnRlcnZhbHNfTUhGWzNdID0geworICAgIC0xOTQwODAsIDE5NDA4MCwgODkwNTYyLAorfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGludmVydF9xdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19NSEZbM10gPSB7CisgICAgMTk0MDgwLCAxOTQwODAsIDUwMjQwMiwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBxdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19NSEZbM10gPSB7CisgICAgMCwgNzcwODEsIDAsCit9Oworc3RhdGljIGNvbnN0IGludDE2X3QgcXVhbnRpemVfZmFjdG9yX3NlbGVjdF9vZmZzZXRfTUhGWzNdID0geworICAgIDAsIC0zMywgMTM2LAorfTsKKworCitzdGF0aWMgY29uc3QgaW50MzJfdCBxdWFudGl6ZV9pbnRlcnZhbHNfSEZbNV0gPSB7CisgICAgLTE2MzAwNiwgMTYzMDA2LCA1NDI3MDgsIDExMjA1NTQsIDI2NjkyMzgsCit9Oworc3RhdGljIGNvbnN0IGludDMyX3QgaW52ZXJ0X3F1YW50aXplX2RpdGhlcl9mYWN0b3JzX0hGWzVdID0geworICAgIDE2MzAwNiwgMTYzMDA2LCAyMTY2OTgsIDM2MTE0OCwgMTE4NzUzOCwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBxdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19IRls1XSA9IHsKKyAgICAwLCAxMzQyMywgMzYxMTMsIDIwNjU5OCwgMCwKK307CitzdGF0aWMgY29uc3QgaW50MTZfdCBxdWFudGl6ZV9mYWN0b3Jfc2VsZWN0X29mZnNldF9IRls1XSA9IHsKKyAgICAwLCAtOCwgMzMsIDk1LCAyNjIsCit9OworCisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGhkX3F1YW50aXplX2ludGVydmFsc19MRlsyNTddID0geworICAgICAgLTI0MzYsICAgIDI0MzYsICAgIDczMDgsICAgMTIxODAsICAgMTcwNTQsICAgMjE5MzAsICAgMjY4MDYsICAgMzE2ODYsCisgICAgICAzNjU2NiwgICA0MTQ1MCwgICA0NjMzOCwgICA1MTIzMCwgICA1NjEyNCwgICA2MTAyNCwgICA2NTkyOCwgICA3MDgzNiwKKyAgICAgIDc1NzUwLCAgIDgwNjcwLCAgIDg1NTk4LCAgIDkwNTMwLCAgIDk1NDcwLCAgMTAwNDE4LCAgMTA1MzcyLCAgMTEwMzM2LAorICAgICAxMTUzMDgsICAxMjAyODgsICAxMjUyNzgsICAxMzAyNzYsICAxMzUyODYsICAxNDAzMDQsICAxNDUzMzQsICAxNTAzNzQsCisgICAgIDE1NTQyNiwgIDE2MDQ5MCwgIDE2NTU2NiwgIDE3MDY1NCwgIDE3NTc1NiwgIDE4MDg3MCwgIDE4NTk5OCwgIDE5MTEzOCwKKyAgICAgMTk2Mjk0LCAgMjAxNDY2LCAgMjA2NjUwLCAgMjExODUwLCAgMjE3MDY4LCAgMjIyMzAwLCAgMjI3NTQ4LCAgMjMyODE0LAorICAgICAyMzgwOTYsICAyNDMzOTYsICAyNDg3MTQsICAyNTQwNTAsICAyNTk0MDYsICAyNjQ3NzgsICAyNzAxNzIsICAyNzU1ODQsCisgICAgIDI4MTAxOCwgIDI4NjQ3MCwgIDI5MTk0NCwgIDI5NzQ0MCwgIDMwMjk1NiwgIDMwODQ5NiwgIDMxNDA1NiwgIDMxOTY0MCwKKyAgICAgMzI1MjQ4LCAgMzMwODc4LCAgMzM2NTMyLCAgMzQyMjEyLCAgMzQ3OTE2LCAgMzUzNjQ0LCAgMzU5Mzk4LCAgMzY1MTc4LAorICAgICAzNzA5ODYsICAzNzY4MjAsICAzODI2ODAsICAzODg1NjgsICAzOTQ0ODYsICA0MDA0MzAsICA0MDY0MDQsICA0MTI0MDgsCisgICAgIDQxODQ0MiwgIDQyNDUwNiwgIDQzMDYwMCwgIDQzNjcyNiwgIDQ0Mjg4NCwgIDQ0OTA3NCwgIDQ1NTI5OCwgIDQ2MTU1NCwKKyAgICAgNDY3ODQ0LCAgNDc0MTY4LCAgNDgwNTI4LCAgNDg2OTIyLCAgNDkzMzU0LCAgNDk5ODIwLCAgNTA2MzI0LCAgNTEyODY2LAorICAgICA1MTk0NDYsICA1MjYwNjQsICA1MzI3MjIsICA1Mzk0MjAsICA1NDYxNjAsICA1NTI5NDAsICA1NTk3NjAsICA1NjY2MjQsCisgICAgIDU3MzUzMiwgIDU4MDQ4MiwgIDU4NzQ3OCwgIDU5NDUyMCwgIDYwMTYwNiwgIDYwODc0MCwgIDYxNTkyMCwgIDYyMzE0OCwKKyAgICAgNjMwNDI2LCAgNjM3NzU0LCAgNjQ1MTMyLCAgNjUyNTYwLCAgNjYwMDQyLCAgNjY3NTc2LCAgNjc1MTY0LCAgNjgyODA4LAorICAgICA2OTA1MDYsICA2OTgyNjIsICA3MDYwNzQsICA3MTM5NDYsICA3MjE4NzYsICA3Mjk4NjgsICA3Mzc5MjAsICA3NDYwMzYsCisgICAgIDc1NDIxNiwgIDc2MjQ2MCwgIDc3MDc3MCwgIDc3OTE0OCwgIDc4NzU5NCwgIDc5NjEwOCwgIDgwNDY5NCwgIDgxMzM1NCwKKyAgICAgODIyMDg2LCAgODMwODkyLCAgODM5Nzc0LCAgODQ4NzM2LCAgODU3Nzc2LCAgODY2ODk2LCAgODc2MTAwLCAgODg1Mzg2LAorICAgICA4OTQ3NTgsICA5MDQyMTgsICA5MTM3NjYsICA5MjM0MDYsICA5MzMxMzgsICA5NDI5NjQsICA5NTI4ODYsICA5NjI5MDgsCisgICAgIDk3MzAzMCwgIDk4MzI1NCwgIDk5MzU4MiwgMTAwNDAyMCwgMTAxNDU2NiwgMTAyNTIyNCwgMTAzNTk5NiwgMTA0Njg4NiwKKyAgICAxMDU3ODk0LCAxMDY5MDI2LCAxMDgwMjg0LCAxMDkxNjcwLCAxMTAzMTg2LCAxMTE0ODM4LCAxMTI2NjI4LCAxMTM4NTU4LAorICAgIDExNTA2MzQsIDExNjI4NTgsIDExNzUyMzYsIDExODc3NjgsIDEyMDA0NjIsIDEyMTMzMjAsIDEyMjYzNDYsIDEyMzk1NDgsCisgICAgMTI1MjkyOCwgMTI2NjQ5MCwgMTI4MDI0MiwgMTI5NDE4OCwgMTMwODMzNCwgMTMyMjY4OCwgMTMzNzI1MiwgMTM1MjAzNCwKKyAgICAxMzY3MDQ0LCAxMzgyMjg0LCAxMzk3NzY2LCAxNDEzNDk0LCAxNDI5NDc4LCAxNDQ1NzI4LCAxNDYyMjUyLCAxNDc5MDU4LAorICAgIDE0OTYxNTgsIDE1MTM1NjIsIDE1MzEyODAsIDE1NDkzMjYsIDE1Njc3MTAsIDE1ODY0NDYsIDE2MDU1NTAsIDE2MjUwMzQsCisgICAgMTY0NDkxNCwgMTY2NTIwOCwgMTY4NTkzMiwgMTcwNzEwOCwgMTcyODc1NCwgMTc1MDg5MCwgMTc3MzU0MiwgMTc5NjczMiwKKyAgICAxODIwNDg4LCAxODQ0ODQwLCAxODY5ODE2LCAxODk1NDUyLCAxOTIxNzgwLCAxOTQ4ODQyLCAxOTc2NjgwLCAyMDA1MzM4LAorICAgIDIwMzQ4NjgsIDIwNjUzMjIsIDIwOTY3NjYsIDIxMjkyNjAsIDIxNjI4ODAsIDIxOTc3MDgsIDIyMzM4MzIsIDIyNzEzNTIsCisgICAgMjMxMDM4NCwgMjM1MTA1MCwgMjM5MzQ5OCwgMjQzNzg4NiwgMjQ4NDQwNCwgMjUzMzI2MiwgMjU4NDcxMCwgMjYzOTAzNiwKKyAgICAyNjk2NTc4LCAyNzU3NzM4LCAyODIyOTk4LCAyODkyOTQwLCAyOTY4Mjc4LCAzMDQ5ODk2LCAzMTM4OTEyLCAzMjM2NzYwLAorICAgIDMzNDUzMTIsIDM0NjcwNjgsIDM2MDU0MzQsIDM3NjUxNTQsIDM5NTI5MDQsIDQxNzc5NjIsIDQ0NTIxNzgsIDQ3ODcxMzQsCisgICAgNTE4NzI5MCwgNTY0NzEyOCwgNjE1OTEyMCwgNjcyMDUxOCwgNzMzMjkwNCwgODAwMDAzMiwgODcyNjY2NCwgOTUxODE1MiwKKyAgICAxMDM4MDM3MiwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBoZF9pbnZlcnRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTEZbMjU3XSA9IHsKKyAgICAgIDI0MzYsICAgMjQzNiwgICAyNDM2LCAgIDI0MzYsICAgMjQzOCwgICAyNDM4LCAgIDI0MzgsICAgMjQ0MCwKKyAgICAgIDI0NDIsICAgMjQ0MiwgICAyNDQ0LCAgIDI0NDYsICAgMjQ0OCwgICAyNDUwLCAgIDI0NTQsICAgMjQ1NiwKKyAgICAgIDI0NTgsICAgMjQ2MiwgICAyNDY0LCAgIDI0NjgsICAgMjQ3MiwgICAyNDc2LCAgIDI0ODAsICAgMjQ4NCwKKyAgICAgIDI0ODgsICAgMjQ5MiwgICAyNDk4LCAgIDI1MDIsICAgMjUwNiwgICAyNTEyLCAgIDI1MTgsICAgMjUyNCwKKyAgICAgIDI1MjgsICAgMjUzNCwgICAyNTQwLCAgIDI1NDgsICAgMjU1NCwgICAyNTYwLCAgIDI1NjgsICAgMjU3NCwKKyAgICAgIDI1ODIsICAgMjU4OCwgICAyNTk2LCAgIDI2MDQsICAgMjYxMiwgICAyNjIwLCAgIDI2MjgsICAgMjYzNiwKKyAgICAgIDI2NDYsICAgMjY1NCwgICAyNjY0LCAgIDI2NzIsICAgMjY4MiwgICAyNjkyLCAgIDI3MDIsICAgMjcxMiwKKyAgICAgIDI3MjIsICAgMjczMiwgICAyNzQyLCAgIDI3NTIsICAgMjc2NCwgICAyNzc0LCAgIDI3ODYsICAgMjc5OCwKKyAgICAgIDI4MTAsICAgMjgyMiwgICAyODM0LCAgIDI4NDYsICAgMjg1OCwgICAyODcwLCAgIDI4ODQsICAgMjg5NiwKKyAgICAgIDI5MTAsICAgMjkyNCwgICAyOTM4LCAgIDI5NTIsICAgMjk2NiwgICAyOTgwLCAgIDI5OTQsICAgMzAxMCwKKyAgICAgIDMwMjQsICAgMzA0MCwgICAzMDU2LCAgIDMwNzAsICAgMzA4NiwgICAzMTA0LCAgIDMxMjAsICAgMzEzNiwKKyAgICAgIDMxNTQsICAgMzE3MCwgICAzMTg4LCAgIDMyMDYsICAgMzIyNCwgICAzMjQyLCAgIDMyNjIsICAgMzI4MCwKKyAgICAgIDMzMDAsICAgMzMyMCwgICAzMzM4LCAgIDMzNjAsICAgMzM4MCwgICAzNDAwLCAgIDM0MjIsICAgMzQ0MiwKKyAgICAgIDM0NjQsICAgMzQ4NiwgICAzNTA4LCAgIDM1MzIsICAgMzU1NCwgICAzNTc4LCAgIDM2MDIsICAgMzYyNiwKKyAgICAgIDM2NTIsICAgMzY3NiwgICAzNzAyLCAgIDM3MjgsICAgMzc1NCwgICAzNzgwLCAgIDM4MDgsICAgMzgzNiwKKyAgICAgIDM4NjQsICAgMzg5MiwgICAzOTIwLCAgIDM5NTAsICAgMzk4MCwgICA0MDEwLCAgIDQwNDIsICAgNDA3NCwKKyAgICAgIDQxMDYsICAgNDEzOCwgICA0MTcyLCAgIDQyMDYsICAgNDI0MCwgICA0Mjc2LCAgIDQzMTIsICAgNDM0OCwKKyAgICAgIDQzODQsICAgNDQyMiwgICA0NDYwLCAgIDQ1MDAsICAgNDU0MCwgICA0NTgwLCAgIDQ2MjIsICAgNDY2NCwKKyAgICAgIDQ3MDgsICAgNDc1MiwgICA0Nzk2LCAgIDQ4NDIsICAgNDg5MCwgICA0OTM4LCAgIDQ5ODYsICAgNTAzNiwKKyAgICAgIDUwODYsICAgNTEzOCwgICA1MTkyLCAgIDUyNDYsICAgNTMwMCwgICA1MzU4LCAgIDU0MTYsICAgNTQ3NCwKKyAgICAgIDU1MzQsICAgNTU5NiwgICA1NjYwLCAgIDU3MjYsICAgNTc5MiwgICA1ODYwLCAgIDU5MzAsICAgNjAwMiwKKyAgICAgIDYwNzQsICAgNjE1MCwgICA2MjI2LCAgIDYzMDYsICAgNjM4OCwgICA2NDcwLCAgIDY1NTYsICAgNjY0NCwKKyAgICAgIDY3MzYsICAgNjgyOCwgICA2OTI0LCAgIDcwMjIsICAgNzEyNCwgICA3MjI4LCAgIDczMzYsICAgNzQ0OCwKKyAgICAgIDc1NjIsICAgNzY4MCwgICA3ODAyLCAgIDc5MjgsICAgODA1OCwgICA4MTkyLCAgIDgzMzIsICAgODQ3NiwKKyAgICAgIDg2MjQsICAgODc4MCwgICA4OTQwLCAgIDkxMDYsICAgOTI3OCwgICA5NDU4LCAgIDk2NDQsICAgOTg0MCwKKyAgICAgMTAwNDIsICAxMDI1MiwgIDEwNDcyLCAgMTA3MDIsICAxMDk0MiwgIDExMTk0LCAgMTE0NTgsICAxMTczNCwKKyAgICAgMTIwMjQsICAxMjMyOCwgIDEyNjQ4LCAgMTI5ODYsICAxMzM0MiwgIDEzNzIwLCAgMTQxMTgsICAxNDU0MCwKKyAgICAgMTQ5OTAsICAxNTQ2NiwgIDE1OTc2LCAgMTY1MjAsICAxNzEwMiwgIDE3NzI2LCAgMTgzOTgsICAxOTEyNCwKKyAgICAgMTk5MDgsICAyMDc2MCwgIDIxNjg4LCAgMjI3MDIsICAyMzgxNiwgIDI1MDQ0LCAgMjY0MDQsICAyNzkyMiwKKyAgICAgMjk2MjIsICAzMTU0MCwgIDMzNzIwLCAgMzYyMjIsICAzOTExNiwgIDQyNTAyLCAgNDY1MTQsICA1MTMzNCwKKyAgICAgNTcyMTgsICA2NDUzNiwgIDczODMwLCAgODU4OTAsIDEwMTg2MCwgMTIzMTk4LCAxNTEwMjAsIDE4MzkzNiwKKyAgICAyMTYyMjAsIDI0MzYxOCwgMjY4Mzc0LCAyOTMwMjIsIDMxOTM2MiwgMzQ3NzY4LCAzNzg4NjQsIDQxMjYyNiwgNDQ5NTk2LAorfTsKK3N0YXRpYyBjb25zdCBpbnQzMl90IGhkX3F1YW50aXplX2RpdGhlcl9mYWN0b3JzX0xGWzI1Nl0gPSB7CisgICAgICAgMCwgICAgMCwgICAgMCwgICAgMSwgICAgMCwgICAgMCwgICAgMSwgICAgMSwKKyAgICAgICAwLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgMSwgICAgMiwgICAgMSwgICAgMSwgICAgMiwgICAgMiwgICAgMiwgICAgMSwKKyAgICAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLCAgICAyLAorICAgICAgIDIsICAgIDIsICAgIDIsICAgIDIsICAgIDIsICAgIDIsICAgIDIsICAgIDMsCisgICAgICAgMiwgICAgMywgICAgMiwgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywKKyAgICAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICAzLCAgICAzLAorICAgICAgIDMsICAgIDMsICAgIDMsICAgIDMsICAgIDMsICAgIDQsICAgIDMsICAgIDQsCisgICAgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwgICAgNCwKKyAgICAgICA0LCAgICA0LCAgICA0LCAgICA0LCAgICA1LCAgICA0LCAgICA0LCAgICA1LAorICAgICAgIDQsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsCisgICAgICAgNSwgICAgNSwgICAgNiwgICAgNSwgICAgNSwgICAgNiwgICAgNSwgICAgNiwKKyAgICAgICA2LCAgICA2LCAgICA2LCAgICA2LCAgICA2LCAgICA2LCAgICA2LCAgICA3LAorICAgICAgIDYsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsCisgICAgICAgNywgICAgNywgICAgOCwgICAgOCwgICAgOCwgICAgOCwgICAgOCwgICAgOCwKKyAgICAgICA4LCAgICA5LCAgICA5LCAgICA5LCAgICA5LCAgICA5LCAgICA5LCAgICA5LAorICAgICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTEsICAgMTEsICAgMTEsCisgICAgICAxMSwgICAxMSwgICAxMiwgICAxMiwgICAxMiwgICAxMiwgICAxMywgICAxMywKKyAgICAgIDEzLCAgIDE0LCAgIDE0LCAgIDE0LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LAorICAgICAgMTYsICAgMTYsICAgMTcsICAgMTcsICAgMTcsICAgMTgsICAgMTgsICAgMTgsCisgICAgICAxOSwgICAxOSwgICAyMCwgICAyMSwgICAyMSwgICAyMiwgICAyMiwgICAyMywKKyAgICAgIDIzLCAgIDI0LCAgIDI1LCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LAorICAgICAgMzAsICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsICAgMzcsCisgICAgICAzOSwgICA0MCwgICA0MiwgICA0MywgICA0NSwgICA0NywgICA0OSwgICA1MSwKKyAgICAgIDUzLCAgIDU1LCAgIDU4LCAgIDYwLCAgIDYzLCAgIDY2LCAgIDY5LCAgIDczLAorICAgICAgNzYsICAgODAsICAgODUsICAgODksICAgOTUsICAxMDAsICAxMDYsICAxMTMsCisgICAgIDExOSwgIDEyOCwgIDEzNiwgIDE0NiwgIDE1NiwgIDE2OCwgIDE4MiwgIDE5NiwKKyAgICAgMjEzLCAgMjMyLCAgMjU0LCAgMjc5LCAgMzA3LCAgMzQwLCAgMzgwLCAgNDI1LAorICAgICA0ODAsICA1NDUsICA2MjYsICA3MjQsICA4NDcsIDEwMDMsIDEyMDUsIDE0NzEsCisgICAgMTgzMCwgMjMyNCwgMzAxNSwgMzk5MywgNTMzNSwgNjk1NiwgODIyOSwgODA3MSwKKyAgICA2ODUwLCA2MTg5LCA2MTYyLCA2NTg1LCA3MTAyLCA3Nzc0LCA4NDQxLCA5MjQzLAorfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGhkX3F1YW50aXplX2ZhY3Rvcl9zZWxlY3Rfb2Zmc2V0X0xGWzI1N10gPSB7CisgICAgICAwLCAtMjIsIC0yMSwgLTIxLCAtMjAsIC0yMCwgLTE5LCAtMTksCisgICAgLTE4LCAtMTgsIC0xNywgLTE3LCAtMTYsIC0xNiwgLTE1LCAtMTQsCisgICAgLTE0LCAtMTMsIC0xMywgLTEyLCAtMTIsIC0xMSwgLTExLCAtMTAsCisgICAgLTEwLCAgLTksICAtOSwgIC04LCAgLTcsICAtNywgIC02LCAgLTYsCisgICAgIC01LCAgLTUsICAtNCwgIC00LCAgLTMsICAtMywgIC0yLCAgLTEsCisgICAgIC0xLCAgIDAsICAgMCwgICAxLCAgIDEsICAgMiwgICAyLCAgIDMsCisgICAgICA0LCAgIDQsICAgNSwgICA1LCAgIDYsICAgNiwgICA3LCAgIDgsCisgICAgICA4LCAgIDksICAgOSwgIDEwLCAgMTEsICAxMSwgIDEyLCAgMTIsCisgICAgIDEzLCAgMTQsICAxNCwgIDE1LCAgMTUsICAxNiwgIDE3LCAgMTcsCisgICAgIDE4LCAgMTksICAxOSwgIDIwLCAgMjAsICAyMSwgIDIyLCAgMjIsCisgICAgIDIzLCAgMjQsICAyNCwgIDI1LCAgMjYsICAyNiwgIDI3LCAgMjgsCisgICAgIDI4LCAgMjksICAzMCwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzMsCisgICAgIDM0LCAgMzUsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM4LCAgMzksCisgICAgIDQwLCAgNDEsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ0LCAgNDUsCisgICAgIDQ2LCAgNDcsICA0OCwgIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsCisgICAgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTgsCisgICAgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsCisgICAgIDY3LCAgNjgsICA2OSwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsCisgICAgIDc0LCAgNzUsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLCAgODIsCisgICAgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OSwgIDkwLCAgOTEsCisgICAgIDkyLCAgOTMsICA5NCwgIDk2LCAgOTcsICA5OCwgIDk5LCAxMDEsCisgICAgMTAyLCAxMDMsIDEwNSwgMTA2LCAxMDcsIDEwOSwgMTEwLCAxMTIsCisgICAgMTEzLCAxMTUsIDExNiwgMTE4LCAxMTksIDEyMSwgMTIyLCAxMjQsCisgICAgMTI1LCAxMjcsIDEyOSwgMTMwLCAxMzIsIDEzNCwgMTM2LCAxMzcsCisgICAgMTM5LCAxNDEsIDE0MywgMTQ1LCAxNDcsIDE0OSwgMTUxLCAxNTMsCisgICAgMTU1LCAxNTgsIDE2MCwgMTYyLCAxNjQsIDE2NywgMTY5LCAxNzIsCisgICAgMTc0LCAxNzcsIDE4MCwgMTgyLCAxODUsIDE4OCwgMTkxLCAxOTQsCisgICAgMTk3LCAyMDEsIDIwNCwgMjA4LCAyMTEsIDIxNSwgMjE5LCAyMjMsCisgICAgMjI3LCAyMzIsIDIzNiwgMjQxLCAyNDYsIDI1MSwgMjU3LCAyNjMsCisgICAgMjY5LCAyNzUsIDI4MywgMjkwLCAyOTgsIDMwNywgMzE3LCAzMjcsCisgICAgMzM5LCAzNTIsIDM2NywgMzg0LCA0MDQsIDQyOSwgNDU4LCA0OTQsCisgICAgNTIyLCA1MjIsIDUyMiwgNTIyLCA1MjIsIDUyMiwgNTIyLCA1MjIsIDUyMiwKK307CisKKworc3RhdGljIGNvbnN0IGludDMyX3QgaGRfcXVhbnRpemVfaW50ZXJ2YWxzX01MRlszM10gPSB7CisgICAgICAtMjEyMzYsICAgMjEyMzYsICAgNjM4MzAsICAxMDY3OTgsICAxNTAzODYsICAxOTQ4MzIsICAyNDAzNzYsICAyODcyNTgsCisgICAgICAzMzU3MjYsICAzODYwMzQsICA0Mzg0NjAsICA0OTMzMDgsICA1NTA5MjQsICA2MTE2OTYsICA2NzYwODIsICA3NDQ2MjYsCisgICAgICA4MTc5ODYsICA4OTY5NjgsICA5ODI1ODAsIDEwNzYxMTgsIDExNzkyNzgsIDEyOTQzNDQsIDE0MjQ1MDQsIDE1NzQzODYsCisgICAgIDE3NTEwOTAsIDE5NjYyNjAsIDIyNDA4NjgsIDI2MTc2NjIsIDMxOTY0MzIsIDQxNzY0NTAsIDU2NTgyNjAsIDc2NzEwNjgsCisgICAgMTAzODAzNzIsCit9Oworc3RhdGljIGNvbnN0IGludDMyX3QgaGRfaW52ZXJ0X3F1YW50aXplX2RpdGhlcl9mYWN0b3JzX01MRlszM10gPSB7CisgICAgMjEyMzYsICAyMTIzNiwgIDIxMzYwLCAgMjE2MDgsICAyMTk3OCwgIDIyNDY4LCAgMjMwNzYsICAgMjM4MDYsCisgICAgMjQ2NjAsICAyNTY0OCwgIDI2Nzc4LCAgMjgwNzAsICAyOTU0NCwgIDMxMjI4LCAgMzMxNTgsICAgMzUzODYsCisgICAgMzc5NzQsICA0MTAwOCwgIDQ0NjA2LCAgNDg5MzQsICA1NDIyNiwgIDYwODQwLCAgNjkzMjAsICAgODA1NjQsCisgICAgOTYxNDAsIDExOTAzMiwgMTU1NTc2LCAyMjEyMTgsIDM1NzU1MiwgNjIyNDY4LCA4NTkzNDQsIDExNTM0NjQsIDE1NTU4NDAsCit9Oworc3RhdGljIGNvbnN0IGludDMyX3QgaGRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTUxGWzMyXSA9IHsKKyAgICAgICAwLCAgIDMxLCAgICA2MiwgICAgOTMsICAgMTIzLCAgIDE1MiwgICAxODMsICAgIDIxNCwKKyAgICAgMjQ3LCAgMjgzLCAgIDMyMywgICAzNjksICAgNDIxLCAgIDQ4MywgICA1NTcsICAgIDY0NywKKyAgICAgNzU5LCAgOTAwLCAgMTA4MiwgIDEzMjMsICAxNjU0LCAgMjEyMCwgIDI4MTEsICAgMzg5NCwKKyAgICA1NzIzLCA5MTM2LCAxNjQxMSwgMzQwODQsIDY2MjI5LCA1OTIxOSwgNzM1MzAsIDEwMDU5NCwKK307CitzdGF0aWMgY29uc3QgaW50MTZfdCBoZF9xdWFudGl6ZV9mYWN0b3Jfc2VsZWN0X29mZnNldF9NTEZbMzNdID0geworICAgICAgMCwgLTIxLCAtMTYsIC0xMiwgIC03LCAgLTIsICAgMywgICA4LAorICAgICAxMywgIDE5LCAgMjQsICAzMCwgIDM2LCAgNDMsICA1MCwgIDU3LAorICAgICA2NSwgIDc0LCAgODMsICA5MywgMTA0LCAxMTcsIDEzMSwgMTQ3LAorICAgIDE2NiwgMTg5LCAyMTksIDI1OSwgMzIyLCA0MjcsIDUyMSwgNTIxLCA1MjEsCit9OworCisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGhkX3F1YW50aXplX2ludGVydmFsc19NSEZbOV0gPSB7CisgICAgLTk1MDQ0LCA5NTA0NCwgMjk1ODQ0LCA1Mjg3ODAsIDgyMTMzMiwgMTIyNjQzOCwgMTg5MDU0MCwgMzM0NDg1MCwgNjQ1MDY2NCwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBoZF9pbnZlcnRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTUhGWzldID0geworICAgIDk1MDQ0LCA5NTA0NCwgMTA1NzU0LCAxMjcxODAsIDE2NTM3MiwgMzk3MzYsIDQyNDM2NiwgMTAyOTk0NiwgMjA3NTg2NiwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBoZF9xdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19NSEZbOF0gPSB7CisgICAgMCwgMjY3OCwgNTM1NywgOTU0OCwgLTMxNDA5LCA5NjE1OCwgMTUxMzk1LCAyNjE0ODAsCit9Oworc3RhdGljIGNvbnN0IGludDE2X3QgaGRfcXVhbnRpemVfZmFjdG9yX3NlbGVjdF9vZmZzZXRfTUhGWzldID0geworICAgIDAsIC0xNywgNSwgMzAsIDYyLCAxMDUsIDE3NywgMzM0LCA1MTgsCit9OworCisKK3N0YXRpYyBjb25zdCBpbnQzMl90IGhkX3F1YW50aXplX2ludGVydmFsc19IRlsxN10gPSB7CisgICAgIC00NTc1NCwgICA0NTc1NCwgIDEzODQ5NiwgIDIzNDg5NiwgIDMzNzMzNiwgIDQ0ODMxMCwgIDU3MDczOCwgIDcwODM4MCwKKyAgICAgODY2NTM0LCAxMDUzMjYyLCAxMjgxOTU4LCAxNTc3NDM4LCAxOTkzMDUwLCAyNjY1OTg0LCAzOTAwOTgyLCA1OTAyODQ0LAorICAgIDg4OTc0NjIsCit9Oworc3RhdGljIGNvbnN0IGludDMyX3QgaGRfaW52ZXJ0X3F1YW50aXplX2RpdGhlcl9mYWN0b3JzX0hGWzE3XSA9IHsKKyAgICA0NTc1NCwgIDQ1NzU0LCAgNDY5ODgsICA0OTQxMiwgIDUzMDI2LCAgNTc5NTAsICA2NDQ3OCwgICA3MzE2NCwKKyAgICA4NDk4OCwgMTAxNzQwLCAxMjY5NTgsIDE2ODUyMiwgMjQ3MDkyLCA0MjU4NDIsIDgwOTE1NCwgMTE5MjcwOCwgMTgwMTkxMCwKK307CitzdGF0aWMgY29uc3QgaW50MzJfdCBoZF9xdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19IRlsxNl0gPSB7CisgICAgICAgMCwgIDMwOSwgICA2MDYsICAgOTA0LCAgMTIzMSwgIDE2MzIsICAyMTcyLCAgIDI5NTYsCisgICAgNDE4OCwgNjMwNSwgMTAzOTEsIDE5NjQzLCA0NDY4OCwgOTU4MjgsIDk1ODg5LCAxNTIzMDEsCit9Oworc3RhdGljIGNvbnN0IGludDE2X3QgaGRfcXVhbnRpemVfZmFjdG9yX3NlbGVjdF9vZmZzZXRfSEZbMTddID0geworICAgICAwLCAtMTgsICAtOCwgICAyLCAgMTMsICAyNSwgIDM4LCAgNTMsCisgICAgNzAsICA5MCwgMTE1LCAxNDcsIDE5MiwgMjY0LCAzOTgsIDUyMSwgNTIxLAorfTsKKwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGludDMyX3QgKnF1YW50aXplX2ludGVydmFsczsKKyAgICBjb25zdCBpbnQzMl90ICppbnZlcnRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnM7CisgICAgY29uc3QgaW50MzJfdCAqcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnM7CisgICAgY29uc3QgaW50MTZfdCAqcXVhbnRpemVfZmFjdG9yX3NlbGVjdF9vZmZzZXQ7CisgICAgaW50IHRhYmxlc19zaXplOworICAgIGludDMyX3QgZmFjdG9yX21heDsKKyAgICBpbnQzMl90IHByZWRpY3Rpb25fb3JkZXI7Cit9IENvbnN0VGFibGVzOworCitzdGF0aWMgQ29uc3RUYWJsZXMgdGFibGVzWzJdW05CX1NVQkJBTkRTXSA9IHsKKyAgICB7CisgICAgICAgIFtMRl0gID0geyBxdWFudGl6ZV9pbnRlcnZhbHNfTEYsCisgICAgICAgICAgICAgICAgICBpbnZlcnRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTEYsCisgICAgICAgICAgICAgICAgICBxdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19MRiwKKyAgICAgICAgICAgICAgICAgIHF1YW50aXplX2ZhY3Rvcl9zZWxlY3Rfb2Zmc2V0X0xGLAorICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMocXVhbnRpemVfaW50ZXJ2YWxzX0xGKSwKKyAgICAgICAgICAgICAgICAgIDB4MTFGRiwgMjQgfSwKKyAgICAgICAgW01MRl0gPSB7IHF1YW50aXplX2ludGVydmFsc19NTEYsCisgICAgICAgICAgICAgICAgICBpbnZlcnRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTUxGLAorICAgICAgICAgICAgICAgICAgcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTUxGLAorICAgICAgICAgICAgICAgICAgcXVhbnRpemVfZmFjdG9yX3NlbGVjdF9vZmZzZXRfTUxGLAorICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMocXVhbnRpemVfaW50ZXJ2YWxzX01MRiksCisgICAgICAgICAgICAgICAgICAweDE0RkYsIDEyIH0sCisgICAgICAgIFtNSEZdID0geyBxdWFudGl6ZV9pbnRlcnZhbHNfTUhGLAorICAgICAgICAgICAgICAgICAgaW52ZXJ0X3F1YW50aXplX2RpdGhlcl9mYWN0b3JzX01IRiwKKyAgICAgICAgICAgICAgICAgIHF1YW50aXplX2RpdGhlcl9mYWN0b3JzX01IRiwKKyAgICAgICAgICAgICAgICAgIHF1YW50aXplX2ZhY3Rvcl9zZWxlY3Rfb2Zmc2V0X01IRiwKKyAgICAgICAgICAgICAgICAgIEZGX0FSUkFZX0VMRU1TKHF1YW50aXplX2ludGVydmFsc19NSEYpLAorICAgICAgICAgICAgICAgICAgMHgxNkZGLCA2IH0sCisgICAgICAgIFtIRl0gID0geyBxdWFudGl6ZV9pbnRlcnZhbHNfSEYsCisgICAgICAgICAgICAgICAgICBpbnZlcnRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfSEYsCisgICAgICAgICAgICAgICAgICBxdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19IRiwKKyAgICAgICAgICAgICAgICAgIHF1YW50aXplX2ZhY3Rvcl9zZWxlY3Rfb2Zmc2V0X0hGLAorICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMocXVhbnRpemVfaW50ZXJ2YWxzX0hGKSwKKyAgICAgICAgICAgICAgICAgIDB4MTVGRiwgMTIgfSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgW0xGXSAgPSB7IGhkX3F1YW50aXplX2ludGVydmFsc19MRiwKKyAgICAgICAgICAgICAgICAgIGhkX2ludmVydF9xdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19MRiwKKyAgICAgICAgICAgICAgICAgIGhkX3F1YW50aXplX2RpdGhlcl9mYWN0b3JzX0xGLAorICAgICAgICAgICAgICAgICAgaGRfcXVhbnRpemVfZmFjdG9yX3NlbGVjdF9vZmZzZXRfTEYsCisgICAgICAgICAgICAgICAgICBGRl9BUlJBWV9FTEVNUyhoZF9xdWFudGl6ZV9pbnRlcnZhbHNfTEYpLAorICAgICAgICAgICAgICAgICAgMHgxMUZGLCAyNCB9LAorICAgICAgICBbTUxGXSA9IHsgaGRfcXVhbnRpemVfaW50ZXJ2YWxzX01MRiwKKyAgICAgICAgICAgICAgICAgIGhkX2ludmVydF9xdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19NTEYsCisgICAgICAgICAgICAgICAgICBoZF9xdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19NTEYsCisgICAgICAgICAgICAgICAgICBoZF9xdWFudGl6ZV9mYWN0b3Jfc2VsZWN0X29mZnNldF9NTEYsCisgICAgICAgICAgICAgICAgICBGRl9BUlJBWV9FTEVNUyhoZF9xdWFudGl6ZV9pbnRlcnZhbHNfTUxGKSwKKyAgICAgICAgICAgICAgICAgIDB4MTRGRiwgMTIgfSwKKyAgICAgICAgW01IRl0gPSB7IGhkX3F1YW50aXplX2ludGVydmFsc19NSEYsCisgICAgICAgICAgICAgICAgICBoZF9pbnZlcnRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTUhGLAorICAgICAgICAgICAgICAgICAgaGRfcXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNfTUhGLAorICAgICAgICAgICAgICAgICAgaGRfcXVhbnRpemVfZmFjdG9yX3NlbGVjdF9vZmZzZXRfTUhGLAorICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoaGRfcXVhbnRpemVfaW50ZXJ2YWxzX01IRiksCisgICAgICAgICAgICAgICAgICAweDE2RkYsIDYgfSwKKyAgICAgICAgW0hGXSAgPSB7IGhkX3F1YW50aXplX2ludGVydmFsc19IRiwKKyAgICAgICAgICAgICAgICAgIGhkX2ludmVydF9xdWFudGl6ZV9kaXRoZXJfZmFjdG9yc19IRiwKKyAgICAgICAgICAgICAgICAgIGhkX3F1YW50aXplX2RpdGhlcl9mYWN0b3JzX0hGLAorICAgICAgICAgICAgICAgICAgaGRfcXVhbnRpemVfZmFjdG9yX3NlbGVjdF9vZmZzZXRfSEYsCisgICAgICAgICAgICAgICAgICBGRl9BUlJBWV9FTEVNUyhoZF9xdWFudGl6ZV9pbnRlcnZhbHNfSEYpLAorICAgICAgICAgICAgICAgICAgMHgxNUZGLCAxMiB9LAorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90IHF1YW50aXphdGlvbl9mYWN0b3JzWzMyXSA9IHsKKyAgICAyMDQ4LCAyMDkzLCAyMTM5LCAyMTg2LCAyMjMzLCAyMjgyLCAyMzMyLCAyMzgzLAorICAgIDI0MzUsIDI0ODksIDI1NDMsIDI1OTksIDI2NTYsIDI3MTQsIDI3NzQsIDI4MzQsCisgICAgMjg5NiwgMjk2MCwgMzAyNSwgMzA5MSwgMzE1OCwgMzIyOCwgMzI5OCwgMzM3MSwKKyAgICAzNDQ0LCAzNTIwLCAzNTk3LCAzNjc2LCAzNzU2LCAzODM4LCAzOTIyLCA0MDA4LAorfTsKKworCisvKiBSb3VuZGVkIHJpZ2h0IHNoaWZ0IHdpdGggb3B0aW9ubmFsIGNsaXBwaW5nICovCisjZGVmaW5lIFJTSElGVF9TSVpFKHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCithdl9hbHdheXNfaW5saW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IyNzaXplIyNfdCByc2hpZnQjI3NpemUoaW50IyNzaXplIyNfdCB2YWx1ZSwgaW50IHNoaWZ0KSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IyNzaXplIyNfdCByb3VuZGluZyA9IChpbnQjI3NpemUjI190KTEgPDwgKHNoaWZ0IC0gMSk7ICAgICAgICAgICAgICAgICBcCisgICAgaW50IyNzaXplIyNfdCBtYXNrID0gKChpbnQjI3NpemUjI190KTEgPDwgKHNoaWZ0ICsgMSkpIC0gMTsgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICgodmFsdWUgKyByb3VuZGluZykgPj4gc2hpZnQpIC0gKCh2YWx1ZSAmIG1hc2spID09IHJvdW5kaW5nKTsgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCithdl9hbHdheXNfaW5saW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IyNzaXplIyNfdCByc2hpZnQjI3NpemUjI19jbGlwMjQoaW50IyNzaXplIyNfdCB2YWx1ZSwgaW50IHNoaWZ0KSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGF2X2NsaXBfaW50cDIocnNoaWZ0IyNzaXplKHZhbHVlLCBzaGlmdCksIDIzKTsgICAgICAgICAgICAgICAgICAgICBcCit9CitSU0hJRlRfU0laRSgzMikKK1JTSElGVF9TSVpFKDY0KQorCisKK2F2X2Fsd2F5c19pbmxpbmUKK3N0YXRpYyB2b2lkIGFwdHhfdXBkYXRlX2NvZGV3b3JkX2hpc3RvcnkoQ2hhbm5lbCAqY2hhbm5lbCkKK3sKKyAgICBpbnQzMl90IGN3ID0gKChjaGFubmVsLT5xdWFudGl6ZVswXS5xdWFudGl6ZWRfc2FtcGxlICYgMykgPDwgMCkgKworICAgICAgICAgICAgICAgICAoKGNoYW5uZWwtPnF1YW50aXplWzFdLnF1YW50aXplZF9zYW1wbGUgJiAyKSA8PCAxKSArCisgICAgICAgICAgICAgICAgICgoY2hhbm5lbC0+cXVhbnRpemVbMl0ucXVhbnRpemVkX3NhbXBsZSAmIDEpIDw8IDMpOworICAgIGNoYW5uZWwtPmNvZGV3b3JkX2hpc3RvcnkgPSAoY3cgPDwgOCkgKyAoY2hhbm5lbC0+Y29kZXdvcmRfaGlzdG9yeSA8PCA0KTsKK30KKworc3RhdGljIHZvaWQgYXB0eF9nZW5lcmF0ZV9kaXRoZXIoQ2hhbm5lbCAqY2hhbm5lbCkKK3sKKyAgICBpbnQgc3ViYmFuZDsKKyAgICBpbnQ2NF90IG07CisgICAgaW50MzJfdCBkOworCisgICAgYXB0eF91cGRhdGVfY29kZXdvcmRfaGlzdG9yeShjaGFubmVsKTsKKworICAgIG0gPSAoaW50NjRfdCk1MTg0NDQzICogKGNoYW5uZWwtPmNvZGV3b3JkX2hpc3RvcnkgPj4gNyk7CisgICAgZCA9IChtIDw8IDIpICsgKG0gPj4gMjIpOworICAgIGZvciAoc3ViYmFuZCA9IDA7IHN1YmJhbmQgPCBOQl9TVUJCQU5EUzsgc3ViYmFuZCsrKQorICAgICAgICBjaGFubmVsLT5kaXRoZXJbc3ViYmFuZF0gPSBkIDw8ICgyMyAtIDUqc3ViYmFuZCk7CisgICAgY2hhbm5lbC0+ZGl0aGVyX3Bhcml0eSA9IChkID4+IDI1KSAmIDE7Cit9CisKKy8qCisgKiBDb252b2x1dGlvbiBmaWx0ZXIgY29lZmZpY2llbnRzIGZvciB0aGUgb3V0ZXIgUU1GIG9mIHRoZSBRTUYgdHJlZS4KKyAqIFRoZSAyIHNldHMgYXJlIGEgbWlycm9yIG9mIGVhY2ggb3RoZXIuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQzMl90IGFwdHhfcW1mX291dGVyX2NvZWZmc1tOQl9GSUxURVJTXVtGSUxURVJfVEFQU10gPSB7CisgICAgeworICAgICAgICA3MzAsIC00MTMsIC05NjExLCA0MzYyNiwgLTEyMTAyNiwgMjY5OTczLCAtNTg1NTQ3LCAyODAxOTY2LAorICAgICAgICA2OTcxMjgsIC0xNjA0ODEsIDI3NjExLCA4NDc4LCAtMTAwNDMsIDM1MTEsIDY4OCwgLTg5NywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLTg5NywgNjg4LCAzNTExLCAtMTAwNDMsIDg0NzgsIDI3NjExLCAtMTYwNDgxLCA2OTcxMjgsCisgICAgICAgIDI4MDE5NjYsIC01ODU1NDcsIDI2OTk3MywgLTEyMTAyNiwgNDM2MjYsIC05NjExLCAtNDEzLCA3MzAsCisgICAgfSwKK307CisKKy8qCisgKiBDb252b2x1dGlvbiBmaWx0ZXIgY29lZmZpY2llbnRzIGZvciB0aGUgaW5uZXIgUU1GIG9mIHRoZSBRTUYgdHJlZS4KKyAqIFRoZSAyIHNldHMgYXJlIGEgbWlycm9yIG9mIGVhY2ggb3RoZXIuCisgKi8KK3N0YXRpYyBjb25zdCBpbnQzMl90IGFwdHhfcW1mX2lubmVyX2NvZWZmc1tOQl9GSUxURVJTXVtGSUxURVJfVEFQU10gPSB7CisgICAgeworICAgICAgIDEwMzMsIC01ODQsIC0xMzU5MiwgNjE2OTcsIC0xNzExNTYsIDM4MTc5OSwgLTgyODA4OCwgMzk2MjU3OSwKKyAgICAgICA5ODU4ODgsIC0yMjY5NTQsIDM5MDQ4LCAxMTk5MCwgLTE0MjAzLCA0OTY2LCA5NzMsIC0xMjY4LAorICAgIH0sCisgICAgeworICAgICAgLTEyNjgsIDk3MywgNDk2NiwgLTE0MjAzLCAxMTk5MCwgMzkwNDgsIC0yMjY5NTQsIDk4NTg4OCwKKyAgICAgIDM5NjI1NzksIC04MjgwODgsIDM4MTc5OSwgLTE3MTE1NiwgNjE2OTcsIC0xMzU5MiwgLTU4NCwgMTAzMywKKyAgICB9LAorfTsKKworLyoKKyAqIFB1c2ggb25lIHNhbXBsZSBpbnRvIGEgY2lyY3VsYXIgc2lnbmFsIGJ1ZmZlci4KKyAqLworYXZfYWx3YXlzX2lubGluZQorc3RhdGljIHZvaWQgYXB0eF9xbWZfZmlsdGVyX3NpZ25hbF9wdXNoKEZpbHRlclNpZ25hbCAqc2lnbmFsLCBpbnQzMl90IHNhbXBsZSkKK3sKKyAgICBzaWduYWwtPmJ1ZmZlcltzaWduYWwtPnBvcyAgICAgICAgICAgIF0gPSBzYW1wbGU7CisgICAgc2lnbmFsLT5idWZmZXJbc2lnbmFsLT5wb3MrRklMVEVSX1RBUFNdID0gc2FtcGxlOworICAgIHNpZ25hbC0+cG9zID0gKHNpZ25hbC0+cG9zICsgMSkgJiAoRklMVEVSX1RBUFMgLSAxKTsKK30KKworLyoKKyAqIENvbXB1dGUgdGhlIGNvbnZvbHV0aW9uIG9mIHRoZSBzaWduYWwgd2l0aCB0aGUgY29lZmZpY2llbnRzLCBhbmQgcmVkdWNlCisgKiB0byAyNCBiaXRzIGJ5IGFwcGx5aW5nIHRoZSBzcGVjaWZpZWQgcmlnaHQgc2hpZnRpbmcuCisgKi8KK2F2X2Fsd2F5c19pbmxpbmUKK3N0YXRpYyBpbnQzMl90IGFwdHhfcW1mX2NvbnZvbHV0aW9uKEZpbHRlclNpZ25hbCAqc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjb2VmZnNbRklMVEVSX1RBUFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0KQoreworICAgIGludDMyX3QgKnNpZyA9ICZzaWduYWwtPmJ1ZmZlcltzaWduYWwtPnBvc107CisgICAgaW50NjRfdCBlID0gMDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGSUxURVJfVEFQUzsgaSsrKQorICAgICAgICBlICs9IE1VTDY0KHNpZ1tpXSwgY29lZmZzW2ldKTsKKworICAgIHJldHVybiByc2hpZnQ2NF9jbGlwMjQoZSwgc2hpZnQpOworfQorCisvKgorICogSGFsZi1iYW5kIFFNRiBhbmFseXNpcyBmaWx0ZXIgcmVhbGl6ZWQgd2l0aCBhIHBvbHlwaGFzZSBGSVIgZmlsdGVyLgorICogU3BsaXQgaW50byAyIHN1YmJhbmRzIGFuZCBkb3duc2FtcGxlIGJ5IDIuCisgKiBTbyBmb3IgZWFjaCBwYWlyIG9mIHNhbXBsZXMgdGhhdCBnb2VzIGluLCBvbmUgc2FtcGxlIGdvZXMgb3V0LAorICogc3BsaXQgaW50byAyIHNlcGFyYXRlIHN1YmJhbmRzLgorICovCithdl9hbHdheXNfaW5saW5lCitzdGF0aWMgdm9pZCBhcHR4X3FtZl9wb2x5cGhhc2VfYW5hbHlzaXMoRmlsdGVyU2lnbmFsIHNpZ25hbFtOQl9GSUxURVJTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNvZWZmc1tOQl9GSUxURVJTXVtGSUxURVJfVEFQU10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1tOQl9GSUxURVJTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpsb3dfc3ViYmFuZF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqaGlnaF9zdWJiYW5kX291dHB1dCkKK3sKKyAgICBpbnQzMl90IHN1YmJhbmRzW05CX0ZJTFRFUlNdOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5CX0ZJTFRFUlM7IGkrKykgeworICAgICAgICBhcHR4X3FtZl9maWx0ZXJfc2lnbmFsX3B1c2goJnNpZ25hbFtpXSwgc2FtcGxlc1tOQl9GSUxURVJTLTEtaV0pOworICAgICAgICBzdWJiYW5kc1tpXSA9IGFwdHhfcW1mX2NvbnZvbHV0aW9uKCZzaWduYWxbaV0sIGNvZWZmc1tpXSwgc2hpZnQpOworICAgIH0KKworICAgICpsb3dfc3ViYmFuZF9vdXRwdXQgID0gYXZfY2xpcF9pbnRwMihzdWJiYW5kc1swXSArIHN1YmJhbmRzWzFdLCAyMyk7CisgICAgKmhpZ2hfc3ViYmFuZF9vdXRwdXQgPSBhdl9jbGlwX2ludHAyKHN1YmJhbmRzWzBdIC0gc3ViYmFuZHNbMV0sIDIzKTsKK30KKworLyoKKyAqIFR3byBzdGFnZSBRTUYgYW5hbHlzaXMgdHJlZS4KKyAqIFNwbGl0IDQgaW5wdXQgc2FtcGxlcyBpbnRvIDQgc3ViYmFuZHMgYW5kIGRvd25zYW1wbGUgYnkgNC4KKyAqIFNvIGZvciBlYWNoIGdyb3VwIG9mIDQgc2FtcGxlcyB0aGF0IGdvZXMgaW4sIG9uZSBzYW1wbGUgZ29lcyBvdXQsCisgKiBzcGxpdCBpbnRvIDQgc2VwYXJhdGUgc3ViYmFuZHMuCisgKi8KK3N0YXRpYyB2b2lkIGFwdHhfcW1mX3RyZWVfYW5hbHlzaXMoUU1GQW5hbHlzaXMgKnFtZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN1YmJhbmRfc2FtcGxlc1s0XSkKK3sKKyAgICBpbnQzMl90IGludGVybWVkaWF0ZV9zYW1wbGVzWzRdOworICAgIGludCBpOworCisgICAgLyogU3BsaXQgNCBpbnB1dCBzYW1wbGVzIGludG8gMiBpbnRlcm1lZGlhdGUgc3ViYmFuZHMgZG93bnNhbXBsZWQgdG8gMiBzYW1wbGVzICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgYXB0eF9xbWZfcG9seXBoYXNlX2FuYWx5c2lzKHFtZi0+b3V0ZXJfZmlsdGVyX3NpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwdHhfcW1mX291dGVyX2NvZWZmcywgMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlc1syKmldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybWVkaWF0ZV9zYW1wbGVzWzAraV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJtZWRpYXRlX3NhbXBsZXNbMitpXSk7CisKKyAgICAvKiBTcGxpdCAyIGludGVybWVkaWF0ZSBzdWJiYW5kIHNhbXBsZXMgaW50byA0IGZpbmFsIHN1YmJhbmRzIGRvd25zYW1wbGVkIHRvIDEgc2FtcGxlICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgYXB0eF9xbWZfcG9seXBoYXNlX2FuYWx5c2lzKHFtZi0+aW5uZXJfZmlsdGVyX3NpZ25hbFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwdHhfcW1mX2lubmVyX2NvZWZmcywgMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJtZWRpYXRlX3NhbXBsZXNbMippXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJiYW5kX3NhbXBsZXNbMippKzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1YmJhbmRfc2FtcGxlc1syKmkrMV0pOworfQorCisvKgorICogSGFsZi1iYW5kIFFNRiBzeW50aGVzaXMgZmlsdGVyIHJlYWxpemVkIHdpdGggYSBwb2x5cGhhc2UgRklSIGZpbHRlci4KKyAqIEpvaW4gMiBzdWJiYW5kcyBhbmQgdXBzYW1wbGUgYnkgMi4KKyAqIFNvIGZvciBlYWNoIDIgc3ViYmFuZHMgc2FtcGxlIHRoYXQgZ29lcyBpbiwgYSBwYWlyIG9mIHNhbXBsZXMgZ29lcyBvdXQuCisgKi8KK2F2X2Fsd2F5c19pbmxpbmUKK3N0YXRpYyB2b2lkIGFwdHhfcW1mX3BvbHlwaGFzZV9zeW50aGVzaXMoRmlsdGVyU2lnbmFsIHNpZ25hbFtOQl9GSUxURVJTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBjb2VmZnNbTkJfRklMVEVSU11bRklMVEVSX1RBUFNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG93X3N1YmJhbmRfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGlnaF9zdWJiYW5kX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNbTkJfRklMVEVSU10pCit7CisgICAgaW50MzJfdCBzdWJiYW5kc1tOQl9GSUxURVJTXTsKKyAgICBpbnQgaTsKKworICAgIHN1YmJhbmRzWzBdID0gbG93X3N1YmJhbmRfaW5wdXQgKyBoaWdoX3N1YmJhbmRfaW5wdXQ7CisgICAgc3ViYmFuZHNbMV0gPSBsb3dfc3ViYmFuZF9pbnB1dCAtIGhpZ2hfc3ViYmFuZF9pbnB1dDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQl9GSUxURVJTOyBpKyspIHsKKyAgICAgICAgYXB0eF9xbWZfZmlsdGVyX3NpZ25hbF9wdXNoKCZzaWduYWxbaV0sIHN1YmJhbmRzWzEtaV0pOworICAgICAgICBzYW1wbGVzW2ldID0gYXB0eF9xbWZfY29udm9sdXRpb24oJnNpZ25hbFtpXSwgY29lZmZzW2ldLCBzaGlmdCk7CisgICAgfQorfQorCisvKgorICogVHdvIHN0YWdlIFFNRiBzeW50aGVzaXMgdHJlZS4KKyAqIEpvaW4gNCBzdWJiYW5kcyBhbmQgdXBzYW1wbGUgYnkgNC4KKyAqIFNvIGZvciBlYWNoIDQgc3ViYmFuZHMgc2FtcGxlIHRoYXQgZ29lcyBpbiwgYSBncm91cCBvZiA0IHNhbXBsZXMgZ29lcyBvdXQuCisgKi8KK3N0YXRpYyB2b2lkIGFwdHhfcW1mX3RyZWVfc3ludGhlc2lzKFFNRkFuYWx5c2lzICpxbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN1YmJhbmRfc2FtcGxlc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1s0XSkKK3sKKyAgICBpbnQzMl90IGludGVybWVkaWF0ZV9zYW1wbGVzWzRdOworICAgIGludCBpOworCisgICAgLyogSm9pbiA0IHN1YmJhbmRzIGludG8gMiBpbnRlcm1lZGlhdGUgc3ViYmFuZHMgdXBzYW1wbGVkIHRvIDIgc2FtcGxlcy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICBhcHR4X3FtZl9wb2x5cGhhc2Vfc3ludGhlc2lzKHFtZi0+aW5uZXJfZmlsdGVyX3NpZ25hbFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHR4X3FtZl9pbm5lcl9jb2VmZnMsIDIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmJhbmRfc2FtcGxlc1syKmkrMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViYmFuZF9zYW1wbGVzWzIqaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJtZWRpYXRlX3NhbXBsZXNbMippXSk7CisKKyAgICAvKiBKb2luIDIgc2FtcGxlcyBmcm9tIGludGVybWVkaWF0ZSBzdWJiYW5kcyB1cHNhbXBsZWQgdG8gNCBzYW1wbGVzLiAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIGFwdHhfcW1mX3BvbHlwaGFzZV9zeW50aGVzaXMocW1mLT5vdXRlcl9maWx0ZXJfc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwdHhfcW1mX291dGVyX2NvZWZmcywgMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX3NhbXBsZXNbMCtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfc2FtcGxlc1syK2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVzWzIqaV0pOworfQorCisKK2F2X2Fsd2F5c19pbmxpbmUKK3N0YXRpYyBpbnQzMl90IGFwdHhfYmluX3NlYXJjaChpbnQzMl90IHZhbHVlLCBpbnQzMl90IGZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICppbnRlcnZhbHMsIGludDMyX3QgbmJfaW50ZXJ2YWxzKQoreworICAgIGludDMyX3QgaWR4ID0gMDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IG5iX2ludGVydmFscyA+PiAxOyBpID4gMDsgaSA+Pj0gMSkKKyAgICAgICAgaWYgKE1VTDY0KGZhY3RvciwgaW50ZXJ2YWxzW2lkeCArIGldKSA8PSAoKGludDY0X3QpdmFsdWUgPDwgMjQpKQorICAgICAgICAgICAgaWR4ICs9IGk7CisKKyAgICByZXR1cm4gaWR4OworfQorCitzdGF0aWMgdm9pZCBhcHR4X3F1YW50aXplX2RpZmZlcmVuY2UoUXVhbnRpemUgKnF1YW50aXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlX2RpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXRoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBxdWFudGl6YXRpb25fZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VGFibGVzICp0YWJsZXMpCit7CisgICAgY29uc3QgaW50MzJfdCAqaW50ZXJ2YWxzID0gdGFibGVzLT5xdWFudGl6ZV9pbnRlcnZhbHM7CisgICAgaW50MzJfdCBxdWFudGl6ZWRfc2FtcGxlLCBkaXRoZXJlZF9zYW1wbGUsIHBhcml0eV9jaGFuZ2U7CisgICAgaW50MzJfdCBkLCBtZWFuLCBpbnRlcnZhbCwgaW52LCBzYW1wbGVfZGlmZmVyZW5jZV9hYnM7CisgICAgaW50NjRfdCBlcnJvcjsKKworICAgIHNhbXBsZV9kaWZmZXJlbmNlX2FicyA9IEZGQUJTKHNhbXBsZV9kaWZmZXJlbmNlKTsKKyAgICBzYW1wbGVfZGlmZmVyZW5jZV9hYnMgPSBGRk1JTihzYW1wbGVfZGlmZmVyZW5jZV9hYnMsICgxIDw8IDIzKSAtIDEpOworCisgICAgcXVhbnRpemVkX3NhbXBsZSA9IGFwdHhfYmluX3NlYXJjaChzYW1wbGVfZGlmZmVyZW5jZV9hYnMgPj4gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbl9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbHMsIHRhYmxlcy0+dGFibGVzX3NpemUpOworCisgICAgZCA9IHJzaGlmdDMyX2NsaXAyNChNVUxIKGRpdGhlciwgZGl0aGVyKSwgNykgLSAoMSA8PCAyMyk7CisgICAgZCA9IHJzaGlmdDY0KE1VTDY0KGQsIHRhYmxlcy0+cXVhbnRpemVfZGl0aGVyX2ZhY3RvcnNbcXVhbnRpemVkX3NhbXBsZV0pLCAyMyk7CisKKyAgICBpbnRlcnZhbHMgKz0gcXVhbnRpemVkX3NhbXBsZTsKKyAgICBtZWFuID0gKGludGVydmFsc1sxXSArIGludGVydmFsc1swXSkgLyAyOworICAgIGludGVydmFsID0gKGludGVydmFsc1sxXSAtIGludGVydmFsc1swXSkgKiAoLShzYW1wbGVfZGlmZmVyZW5jZSA8IDApIHwgMSk7CisKKyAgICBkaXRoZXJlZF9zYW1wbGUgPSByc2hpZnQ2NF9jbGlwMjQoTVVMNjQoZGl0aGVyLCBpbnRlcnZhbCkgKyAoKGludDY0X3QpYXZfY2xpcF9pbnRwMihtZWFuICsgZCwgMjMpIDw8IDMyKSwgMzIpOworICAgIGVycm9yID0gKChpbnQ2NF90KXNhbXBsZV9kaWZmZXJlbmNlX2FicyA8PCAyMCkgLSBNVUw2NChkaXRoZXJlZF9zYW1wbGUsIHF1YW50aXphdGlvbl9mYWN0b3IpOworICAgIHF1YW50aXplLT5lcnJvciA9IEZGQUJTKHJzaGlmdDY0KGVycm9yLCAyMykpOworCisgICAgcGFyaXR5X2NoYW5nZSA9IHF1YW50aXplZF9zYW1wbGU7CisgICAgaWYgKGVycm9yIDwgMCkKKyAgICAgICAgcXVhbnRpemVkX3NhbXBsZS0tOworICAgIGVsc2UKKyAgICAgICAgcGFyaXR5X2NoYW5nZS0tOworCisgICAgaW52ID0gLShzYW1wbGVfZGlmZmVyZW5jZSA8IDApOworICAgIHF1YW50aXplLT5xdWFudGl6ZWRfc2FtcGxlICAgICAgICAgICAgICAgPSBxdWFudGl6ZWRfc2FtcGxlIF4gaW52OworICAgIHF1YW50aXplLT5xdWFudGl6ZWRfc2FtcGxlX3Bhcml0eV9jaGFuZ2UgPSBwYXJpdHlfY2hhbmdlICAgIF4gaW52OworfQorCitzdGF0aWMgdm9pZCBhcHR4X2VuY29kZV9jaGFubmVsKENoYW5uZWwgKmNoYW5uZWwsIGludDMyX3Qgc2FtcGxlc1s0XSwgaW50IGhkKQoreworICAgIGludDMyX3Qgc3ViYmFuZF9zYW1wbGVzWzRdOworICAgIGludCBzdWJiYW5kOworICAgIGFwdHhfcW1mX3RyZWVfYW5hbHlzaXMoJmNoYW5uZWwtPnFtZiwgc2FtcGxlcywgc3ViYmFuZF9zYW1wbGVzKTsKKyAgICBhcHR4X2dlbmVyYXRlX2RpdGhlcihjaGFubmVsKTsKKyAgICBmb3IgKHN1YmJhbmQgPSAwOyBzdWJiYW5kIDwgTkJfU1VCQkFORFM7IHN1YmJhbmQrKykgeworICAgICAgICBpbnQzMl90IGRpZmYgPSBhdl9jbGlwX2ludHAyKHN1YmJhbmRfc2FtcGxlc1tzdWJiYW5kXSAtIGNoYW5uZWwtPnByZWRpY3Rpb25bc3ViYmFuZF0ucHJlZGljdGVkX3NhbXBsZSwgMjMpOworICAgICAgICBhcHR4X3F1YW50aXplX2RpZmZlcmVuY2UoJmNoYW5uZWwtPnF1YW50aXplW3N1YmJhbmRdLCBkaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC0+ZGl0aGVyW3N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC0+aW52ZXJ0X3F1YW50aXplW3N1YmJhbmRdLnF1YW50aXphdGlvbl9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFibGVzW2hkXVtzdWJiYW5kXSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhcHR4X2RlY29kZV9jaGFubmVsKENoYW5uZWwgKmNoYW5uZWwsIGludDMyX3Qgc2FtcGxlc1s0XSkKK3sKKyAgICBpbnQzMl90IHN1YmJhbmRfc2FtcGxlc1s0XTsKKyAgICBpbnQgc3ViYmFuZDsKKyAgICBmb3IgKHN1YmJhbmQgPSAwOyBzdWJiYW5kIDwgTkJfU1VCQkFORFM7IHN1YmJhbmQrKykKKyAgICAgICAgc3ViYmFuZF9zYW1wbGVzW3N1YmJhbmRdID0gY2hhbm5lbC0+cHJlZGljdGlvbltzdWJiYW5kXS5wcmV2aW91c19yZWNvbnN0cnVjdGVkX3NhbXBsZTsKKyAgICBhcHR4X3FtZl90cmVlX3N5bnRoZXNpcygmY2hhbm5lbC0+cW1mLCBzdWJiYW5kX3NhbXBsZXMsIHNhbXBsZXMpOworfQorCisKK3N0YXRpYyB2b2lkIGFwdHhfaW52ZXJ0X3F1YW50aXphdGlvbihJbnZlcnRRdWFudGl6ZSAqaW52ZXJ0X3F1YW50aXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcXVhbnRpemVkX3NhbXBsZSwgaW50MzJfdCBkaXRoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUYWJsZXMgKnRhYmxlcykKK3sKKyAgICBpbnQzMl90IHFyLCBpZHgsIHNoaWZ0LCBmYWN0b3Jfc2VsZWN0OworCisgICAgaWR4ID0gKHF1YW50aXplZF9zYW1wbGUgXiAtKHF1YW50aXplZF9zYW1wbGUgPCAwKSkgKyAxOworICAgIHFyID0gdGFibGVzLT5xdWFudGl6ZV9pbnRlcnZhbHNbaWR4XSAvIDI7CisgICAgaWYgKHF1YW50aXplZF9zYW1wbGUgPCAwKQorICAgICAgICBxciA9IC1xcjsKKworICAgIHFyID0gcnNoaWZ0NjRfY2xpcDI0KCgoaW50NjRfdClxcjw8MzIpICsgTVVMNjQoZGl0aGVyLCB0YWJsZXMtPmludmVydF9xdWFudGl6ZV9kaXRoZXJfZmFjdG9yc1tpZHhdKSwgMzIpOworICAgIGludmVydF9xdWFudGl6ZS0+cmVjb25zdHJ1Y3RlZF9kaWZmZXJlbmNlID0gTVVMNjQoaW52ZXJ0X3F1YW50aXplLT5xdWFudGl6YXRpb25fZmFjdG9yLCBxcikgPj4gMTk7CisKKyAgICAvKiB1cGRhdGUgZmFjdG9yX3NlbGVjdCAqLworICAgIGZhY3Rvcl9zZWxlY3QgPSAzMjYyMCAqIGludmVydF9xdWFudGl6ZS0+ZmFjdG9yX3NlbGVjdDsKKyAgICBmYWN0b3Jfc2VsZWN0ID0gcnNoaWZ0MzIoZmFjdG9yX3NlbGVjdCArICh0YWJsZXMtPnF1YW50aXplX2ZhY3Rvcl9zZWxlY3Rfb2Zmc2V0W2lkeF0gPDwgMTUpLCAxNSk7CisgICAgaW52ZXJ0X3F1YW50aXplLT5mYWN0b3Jfc2VsZWN0ID0gYXZfY2xpcChmYWN0b3Jfc2VsZWN0LCAwLCB0YWJsZXMtPmZhY3Rvcl9tYXgpOworCisgICAgLyogdXBkYXRlIHF1YW50aXphdGlvbiBmYWN0b3IgKi8KKyAgICBpZHggPSAoaW52ZXJ0X3F1YW50aXplLT5mYWN0b3Jfc2VsZWN0ICYgMHhGRikgPj4gMzsKKyAgICBzaGlmdCA9ICh0YWJsZXMtPmZhY3Rvcl9tYXggLSBpbnZlcnRfcXVhbnRpemUtPmZhY3Rvcl9zZWxlY3QpID4+IDg7CisgICAgaW52ZXJ0X3F1YW50aXplLT5xdWFudGl6YXRpb25fZmFjdG9yID0gKHF1YW50aXphdGlvbl9mYWN0b3JzW2lkeF0gPDwgMTEpID4+IHNoaWZ0OworfQorCitzdGF0aWMgaW50MzJfdCAqYXB0eF9yZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2VzX3VwZGF0ZShQcmVkaWN0aW9uICpwcmVkaWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIpCit7CisgICAgaW50MzJfdCAqcmQxID0gcHJlZGljdGlvbi0+cmVjb25zdHJ1Y3RlZF9kaWZmZXJlbmNlcywgKnJkMiA9IHJkMSArIG9yZGVyOworICAgIGludCBwID0gcHJlZGljdGlvbi0+cG9zOworCisgICAgcmQxW3BdID0gcmQyW3BdOworICAgIHByZWRpY3Rpb24tPnBvcyA9IHAgPSAocCArIDEpICUgb3JkZXI7CisgICAgcmQyW3BdID0gcmVjb25zdHJ1Y3RlZF9kaWZmZXJlbmNlOworICAgIHJldHVybiAmcmQyW3BdOworfQorCitzdGF0aWMgdm9pZCBhcHR4X3ByZWRpY3Rpb25fZmlsdGVyaW5nKFByZWRpY3Rpb24gKnByZWRpY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVjb25zdHJ1Y3RlZF9kaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIpCit7CisgICAgaW50MzJfdCByZWNvbnN0cnVjdGVkX3NhbXBsZSwgcHJlZGljdG9yLCBzcmQwOworICAgIGludDMyX3QgKnJlY29uc3RydWN0ZWRfZGlmZmVyZW5jZXM7CisgICAgaW50NjRfdCBwcmVkaWN0ZWRfZGlmZmVyZW5jZSA9IDA7CisgICAgaW50IGk7CisKKyAgICByZWNvbnN0cnVjdGVkX3NhbXBsZSA9IGF2X2NsaXBfaW50cDIocmVjb25zdHJ1Y3RlZF9kaWZmZXJlbmNlICsgcHJlZGljdGlvbi0+cHJlZGljdGVkX3NhbXBsZSwgMjMpOworICAgIHByZWRpY3RvciA9IGF2X2NsaXBfaW50cDIoKE1VTDY0KHByZWRpY3Rpb24tPnNfd2VpZ2h0WzBdLCBwcmVkaWN0aW9uLT5wcmV2aW91c19yZWNvbnN0cnVjdGVkX3NhbXBsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBNVUw2NChwcmVkaWN0aW9uLT5zX3dlaWdodFsxXSwgcmVjb25zdHJ1Y3RlZF9zYW1wbGUpKSA+PiAyMiwgMjMpOworICAgIHByZWRpY3Rpb24tPnByZXZpb3VzX3JlY29uc3RydWN0ZWRfc2FtcGxlID0gcmVjb25zdHJ1Y3RlZF9zYW1wbGU7CisKKyAgICByZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2VzID0gYXB0eF9yZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2VzX3VwZGF0ZShwcmVkaWN0aW9uLCByZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2UsIG9yZGVyKTsKKyAgICBzcmQwID0gRkZESUZGU0lHTihyZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2UsIDApIDw8IDIzOworICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKSB7CisgICAgICAgIGludDMyX3Qgc3JkID0gRkZfU0lHTkJJVChyZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2VzWy1pLTFdKSB8IDE7CisgICAgICAgIHByZWRpY3Rpb24tPmRfd2VpZ2h0W2ldIC09IHJzaGlmdDMyKHByZWRpY3Rpb24tPmRfd2VpZ2h0W2ldIC0gc3JkKnNyZDAsIDgpOworICAgICAgICBwcmVkaWN0ZWRfZGlmZmVyZW5jZSArPSBNVUw2NChyZWNvbnN0cnVjdGVkX2RpZmZlcmVuY2VzWy1pXSwgcHJlZGljdGlvbi0+ZF93ZWlnaHRbaV0pOworICAgIH0KKworICAgIHByZWRpY3Rpb24tPnByZWRpY3RlZF9kaWZmZXJlbmNlID0gYXZfY2xpcF9pbnRwMihwcmVkaWN0ZWRfZGlmZmVyZW5jZSA+PiAyMiwgMjMpOworICAgIHByZWRpY3Rpb24tPnByZWRpY3RlZF9zYW1wbGUgPSBhdl9jbGlwX2ludHAyKHByZWRpY3RvciArIHByZWRpY3Rpb24tPnByZWRpY3RlZF9kaWZmZXJlbmNlLCAyMyk7Cit9CisKK3N0YXRpYyB2b2lkIGFwdHhfcHJvY2Vzc19zdWJiYW5kKEludmVydFF1YW50aXplICppbnZlcnRfcXVhbnRpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkaWN0aW9uICpwcmVkaWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBxdWFudGl6ZWRfc2FtcGxlLCBpbnQzMl90IGRpdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VGFibGVzICp0YWJsZXMpCit7CisgICAgaW50MzJfdCBzaWduLCBzYW1lX3NpZ25bMl0sIHdlaWdodFsyXSwgc3cxLCByYW5nZTsKKworICAgIGFwdHhfaW52ZXJ0X3F1YW50aXphdGlvbihpbnZlcnRfcXVhbnRpemUsIHF1YW50aXplZF9zYW1wbGUsIGRpdGhlciwgdGFibGVzKTsKKworICAgIHNpZ24gPSBGRkRJRkZTSUdOKGludmVydF9xdWFudGl6ZS0+cmVjb25zdHJ1Y3RlZF9kaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgIC1wcmVkaWN0aW9uLT5wcmVkaWN0ZWRfZGlmZmVyZW5jZSk7CisgICAgc2FtZV9zaWduWzBdID0gc2lnbiAqIHByZWRpY3Rpb24tPnByZXZfc2lnblswXTsKKyAgICBzYW1lX3NpZ25bMV0gPSBzaWduICogcHJlZGljdGlvbi0+cHJldl9zaWduWzFdOworICAgIHByZWRpY3Rpb24tPnByZXZfc2lnblswXSA9IHByZWRpY3Rpb24tPnByZXZfc2lnblsxXTsKKyAgICBwcmVkaWN0aW9uLT5wcmV2X3NpZ25bMV0gPSBzaWduIHwgMTsKKworICAgIHJhbmdlID0gMHgxMDAwMDA7CisgICAgc3cxID0gcnNoaWZ0MzIoLXNhbWVfc2lnblsxXSAqIHByZWRpY3Rpb24tPnNfd2VpZ2h0WzFdLCAxKTsKKyAgICBzdzEgPSAoYXZfY2xpcChzdzEsIC1yYW5nZSwgcmFuZ2UpICYgfjB4RikgPDwgNDsKKworICAgIHJhbmdlID0gMHgzMDAwMDA7CisgICAgd2VpZ2h0WzBdID0gMjU0ICogcHJlZGljdGlvbi0+c193ZWlnaHRbMF0gKyAweDgwMDAwMCpzYW1lX3NpZ25bMF0gKyBzdzE7CisgICAgcHJlZGljdGlvbi0+c193ZWlnaHRbMF0gPSBhdl9jbGlwKHJzaGlmdDMyKHdlaWdodFswXSwgOCksIC1yYW5nZSwgcmFuZ2UpOworCisgICAgcmFuZ2UgPSAweDNDMDAwMCAtIHByZWRpY3Rpb24tPnNfd2VpZ2h0WzBdOworICAgIHdlaWdodFsxXSA9IDI1NSAqIHByZWRpY3Rpb24tPnNfd2VpZ2h0WzFdICsgMHhDMDAwMDAqc2FtZV9zaWduWzFdOworICAgIHByZWRpY3Rpb24tPnNfd2VpZ2h0WzFdID0gYXZfY2xpcChyc2hpZnQzMih3ZWlnaHRbMV0sIDgpLCAtcmFuZ2UsIHJhbmdlKTsKKworICAgIGFwdHhfcHJlZGljdGlvbl9maWx0ZXJpbmcocHJlZGljdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmVydF9xdWFudGl6ZS0+cmVjb25zdHJ1Y3RlZF9kaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVzLT5wcmVkaWN0aW9uX29yZGVyKTsKK30KKworc3RhdGljIHZvaWQgYXB0eF9pbnZlcnRfcXVhbnRpemVfYW5kX3ByZWRpY3Rpb24oQ2hhbm5lbCAqY2hhbm5lbCwgaW50IGhkKQoreworICAgIGludCBzdWJiYW5kOworICAgIGZvciAoc3ViYmFuZCA9IDA7IHN1YmJhbmQgPCBOQl9TVUJCQU5EUzsgc3ViYmFuZCsrKQorICAgICAgICBhcHR4X3Byb2Nlc3Nfc3ViYmFuZCgmY2hhbm5lbC0+aW52ZXJ0X3F1YW50aXplW3N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbC0+cHJlZGljdGlvbltzdWJiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC0+cXVhbnRpemVbc3ViYmFuZF0ucXVhbnRpemVkX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC0+ZGl0aGVyW3N1YmJhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFibGVzW2hkXVtzdWJiYW5kXSk7Cit9CisKK3N0YXRpYyBpbnQzMl90IGFwdHhfcXVhbnRpemVkX3Bhcml0eShDaGFubmVsICpjaGFubmVsKQoreworICAgIGludDMyX3QgcGFyaXR5ID0gY2hhbm5lbC0+ZGl0aGVyX3Bhcml0eTsKKyAgICBpbnQgc3ViYmFuZDsKKworICAgIGZvciAoc3ViYmFuZCA9IDA7IHN1YmJhbmQgPCBOQl9TVUJCQU5EUzsgc3ViYmFuZCsrKQorICAgICAgICBwYXJpdHkgXj0gY2hhbm5lbC0+cXVhbnRpemVbc3ViYmFuZF0ucXVhbnRpemVkX3NhbXBsZTsKKworICAgIHJldHVybiBwYXJpdHkgJiAxOworfQorCisvKiBGb3IgZWFjaCBzYW1wbGUsIGVuc3VyZSB0aGF0IHRoZSBwYXJpdHkgb2YgYWxsIHN1YmJhbmRzIG9mIGFsbCBjaGFubmVscworICogaXMgMCBleGNlcHQgb25jZSBldmVyeSA4IHNhbXBsZXMgd2hlcmUgdGhlIHBhcml0eSBpcyBmb3JjZWQgdG8gMS4gKi8KK3N0YXRpYyBpbnQgYXB0eF9jaGVja19wYXJpdHkoQ2hhbm5lbCBjaGFubmVsc1tOQl9DSEFOTkVMU10sIGludDMyX3QgKmlkeCkKK3sKKyAgICBpbnQzMl90IHBhcml0eSA9IGFwdHhfcXVhbnRpemVkX3Bhcml0eSgmY2hhbm5lbHNbTEVGVF0pCisgICAgICAgICAgICAgICAgICAgXiBhcHR4X3F1YW50aXplZF9wYXJpdHkoJmNoYW5uZWxzW1JJR0hUXSk7CisKKyAgICBpbnQgZWlnaHRoID0gKmlkeCA9PSA3OworICAgICppZHggPSAoKmlkeCArIDEpICYgNzsKKworICAgIHJldHVybiBwYXJpdHkgXiBlaWdodGg7Cit9CisKK3N0YXRpYyB2b2lkIGFwdHhfaW5zZXJ0X3N5bmMoQ2hhbm5lbCBjaGFubmVsc1tOQl9DSEFOTkVMU10sIGludDMyX3QgKmlkeCkKK3sKKyAgICBpZiAoYXB0eF9jaGVja19wYXJpdHkoY2hhbm5lbHMsIGlkeCkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIENoYW5uZWwgKmM7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWFwW10gPSB7IDEsIDIsIDAsIDMgfTsKKyAgICAgICAgUXVhbnRpemUgKm1pbiA9ICZjaGFubmVsc1tOQl9DSEFOTkVMUy0xXS5xdWFudGl6ZVttYXBbMF1dOworICAgICAgICBmb3IgKGMgPSAmY2hhbm5lbHNbTkJfQ0hBTk5FTFMtMV07IGMgPj0gY2hhbm5lbHM7IGMtLSkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQl9TVUJCQU5EUzsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChjLT5xdWFudGl6ZVttYXBbaV1dLmVycm9yIDwgbWluLT5lcnJvcikKKyAgICAgICAgICAgICAgICAgICAgbWluID0gJmMtPnF1YW50aXplW21hcFtpXV07CisKKyAgICAgICAgLyogRm9yY2luZyB0aGUgZGVzaXJlZCBwYXJpdHkgaXMgZG9uZSBieSBvZmZzZXR0aW5nIGJ5IDEgdGhlIHF1YW50aXplZAorICAgICAgICAgKiBzYW1wbGUgZnJvbSB0aGUgc3ViYmFuZCBmZWF0dXJpbmcgdGhlIHNtYWxsZXN0IHF1YW50aXphdGlvbiBlcnJvci4gKi8KKyAgICAgICAgbWluLT5xdWFudGl6ZWRfc2FtcGxlID0gbWluLT5xdWFudGl6ZWRfc2FtcGxlX3Bhcml0eV9jaGFuZ2U7CisgICAgfQorfQorCitzdGF0aWMgdWludDE2X3QgYXB0eF9wYWNrX2NvZGV3b3JkKENoYW5uZWwgKmNoYW5uZWwpCit7CisgICAgaW50MzJfdCBwYXJpdHkgPSBhcHR4X3F1YW50aXplZF9wYXJpdHkoY2hhbm5lbCk7CisgICAgcmV0dXJuICgoKGNoYW5uZWwtPnF1YW50aXplWzNdLnF1YW50aXplZF9zYW1wbGUgJiAweDA2KSB8IHBhcml0eSkgPDwgMTMpCisgICAgICAgICB8ICgoKGNoYW5uZWwtPnF1YW50aXplWzJdLnF1YW50aXplZF9zYW1wbGUgJiAweDAzKSAgICAgICAgICkgPDwgMTEpCisgICAgICAgICB8ICgoKGNoYW5uZWwtPnF1YW50aXplWzFdLnF1YW50aXplZF9zYW1wbGUgJiAweDBGKSAgICAgICAgICkgPDwgIDcpCisgICAgICAgICB8ICgoKGNoYW5uZWwtPnF1YW50aXplWzBdLnF1YW50aXplZF9zYW1wbGUgJiAweDdGKSAgICAgICAgICkgPDwgIDApOworfQorCitzdGF0aWMgdWludDMyX3QgYXB0eGhkX3BhY2tfY29kZXdvcmQoQ2hhbm5lbCAqY2hhbm5lbCkKK3sKKyAgICBpbnQzMl90IHBhcml0eSA9IGFwdHhfcXVhbnRpemVkX3Bhcml0eShjaGFubmVsKTsKKyAgICByZXR1cm4gKCgoY2hhbm5lbC0+cXVhbnRpemVbM10ucXVhbnRpemVkX3NhbXBsZSAmIDB4MDFFKSB8IHBhcml0eSkgPDwgMTkpCisgICAgICAgICB8ICgoKGNoYW5uZWwtPnF1YW50aXplWzJdLnF1YW50aXplZF9zYW1wbGUgJiAweDAwRikgICAgICAgICApIDw8IDE1KQorICAgICAgICAgfCAoKChjaGFubmVsLT5xdWFudGl6ZVsxXS5xdWFudGl6ZWRfc2FtcGxlICYgMHgwM0YpICAgICAgICAgKSA8PCAgOSkKKyAgICAgICAgIHwgKCgoY2hhbm5lbC0+cXVhbnRpemVbMF0ucXVhbnRpemVkX3NhbXBsZSAmIDB4MUZGKSAgICAgICAgICkgPDwgIDApOworfQorCitzdGF0aWMgdm9pZCBhcHR4X3VucGFja19jb2Rld29yZChDaGFubmVsICpjaGFubmVsLCB1aW50MTZfdCBjb2Rld29yZCkKK3sKKyAgICBjaGFubmVsLT5xdWFudGl6ZVswXS5xdWFudGl6ZWRfc2FtcGxlID0gc2lnbl9leHRlbmQoY29kZXdvcmQgPj4gIDAsIDcpOworICAgIGNoYW5uZWwtPnF1YW50aXplWzFdLnF1YW50aXplZF9zYW1wbGUgPSBzaWduX2V4dGVuZChjb2Rld29yZCA+PiAgNywgNCk7CisgICAgY2hhbm5lbC0+cXVhbnRpemVbMl0ucXVhbnRpemVkX3NhbXBsZSA9IHNpZ25fZXh0ZW5kKGNvZGV3b3JkID4+IDExLCAyKTsKKyAgICBjaGFubmVsLT5xdWFudGl6ZVszXS5xdWFudGl6ZWRfc2FtcGxlID0gc2lnbl9leHRlbmQoY29kZXdvcmQgPj4gMTMsIDMpOworICAgIGNoYW5uZWwtPnF1YW50aXplWzNdLnF1YW50aXplZF9zYW1wbGUgPSAoY2hhbm5lbC0+cXVhbnRpemVbM10ucXVhbnRpemVkX3NhbXBsZSAmIH4xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcHR4X3F1YW50aXplZF9wYXJpdHkoY2hhbm5lbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFwdHhoZF91bnBhY2tfY29kZXdvcmQoQ2hhbm5lbCAqY2hhbm5lbCwgdWludDMyX3QgY29kZXdvcmQpCit7CisgICAgY2hhbm5lbC0+cXVhbnRpemVbMF0ucXVhbnRpemVkX3NhbXBsZSA9IHNpZ25fZXh0ZW5kKGNvZGV3b3JkID4+ICAwLCA5KTsKKyAgICBjaGFubmVsLT5xdWFudGl6ZVsxXS5xdWFudGl6ZWRfc2FtcGxlID0gc2lnbl9leHRlbmQoY29kZXdvcmQgPj4gIDksIDYpOworICAgIGNoYW5uZWwtPnF1YW50aXplWzJdLnF1YW50aXplZF9zYW1wbGUgPSBzaWduX2V4dGVuZChjb2Rld29yZCA+PiAxNSwgNCk7CisgICAgY2hhbm5lbC0+cXVhbnRpemVbM10ucXVhbnRpemVkX3NhbXBsZSA9IHNpZ25fZXh0ZW5kKGNvZGV3b3JkID4+IDE5LCA1KTsKKyAgICBjaGFubmVsLT5xdWFudGl6ZVszXS5xdWFudGl6ZWRfc2FtcGxlID0gKGNoYW5uZWwtPnF1YW50aXplWzNdLnF1YW50aXplZF9zYW1wbGUgJiB+MSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXB0eF9xdWFudGl6ZWRfcGFyaXR5KGNoYW5uZWwpOworfQorCitzdGF0aWMgdm9pZCBhcHR4X2VuY29kZV9zYW1wbGVzKEFwdFhDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1tOQl9DSEFOTkVMU11bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dHB1dCkKK3sKKyAgICBpbnQgY2hhbm5lbDsKKyAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgTkJfQ0hBTk5FTFM7IGNoYW5uZWwrKykKKyAgICAgICAgYXB0eF9lbmNvZGVfY2hhbm5lbCgmY3R4LT5jaGFubmVsc1tjaGFubmVsXSwgc2FtcGxlc1tjaGFubmVsXSwgY3R4LT5oZCk7CisKKyAgICBhcHR4X2luc2VydF9zeW5jKGN0eC0+Y2hhbm5lbHMsICZjdHgtPnN5bmNfaWR4KTsKKworICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBOQl9DSEFOTkVMUzsgY2hhbm5lbCsrKSB7CisgICAgICAgIGFwdHhfaW52ZXJ0X3F1YW50aXplX2FuZF9wcmVkaWN0aW9uKCZjdHgtPmNoYW5uZWxzW2NoYW5uZWxdLCBjdHgtPmhkKTsKKyAgICAgICAgaWYgKGN0eC0+aGQpCisgICAgICAgICAgICBBVl9XQjI0KG91dHB1dCArIDMqY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgYXB0eGhkX3BhY2tfY29kZXdvcmQoJmN0eC0+Y2hhbm5lbHNbY2hhbm5lbF0pKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQVZfV0IxNihvdXRwdXQgKyAyKmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGFwdHhfcGFja19jb2Rld29yZCgmY3R4LT5jaGFubmVsc1tjaGFubmVsXSkpOworICAgIH0KK30KKworc3RhdGljIGludCBhcHR4X2RlY29kZV9zYW1wbGVzKEFwdFhDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNbTkJfQ0hBTk5FTFNdWzRdKQoreworICAgIGludCBjaGFubmVsLCByZXQ7CisKKyAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgTkJfQ0hBTk5FTFM7IGNoYW5uZWwrKykgeworICAgICAgICBhcHR4X2dlbmVyYXRlX2RpdGhlcigmY3R4LT5jaGFubmVsc1tjaGFubmVsXSk7CisKKyAgICAgICAgaWYgKGN0eC0+aGQpCisgICAgICAgICAgICBhcHR4aGRfdW5wYWNrX2NvZGV3b3JkKCZjdHgtPmNoYW5uZWxzW2NoYW5uZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9SQjI0KGlucHV0ICsgMypjaGFubmVsKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFwdHhfdW5wYWNrX2NvZGV3b3JkKCZjdHgtPmNoYW5uZWxzW2NoYW5uZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUkIxNihpbnB1dCArIDIqY2hhbm5lbCkpOworICAgICAgICBhcHR4X2ludmVydF9xdWFudGl6ZV9hbmRfcHJlZGljdGlvbigmY3R4LT5jaGFubmVsc1tjaGFubmVsXSwgY3R4LT5oZCk7CisgICAgfQorCisgICAgcmV0ID0gYXB0eF9jaGVja19wYXJpdHkoY3R4LT5jaGFubmVscywgJmN0eC0+c3luY19pZHgpOworCisgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IE5CX0NIQU5ORUxTOyBjaGFubmVsKyspCisgICAgICAgIGFwdHhfZGVjb2RlX2NoYW5uZWwoJmN0eC0+Y2hhbm5lbHNbY2hhbm5lbF0sIHNhbXBsZXNbY2hhbm5lbF0pOworCisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgYXZfY29sZCBpbnQgYXB0eF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBcHRYQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGNoYW4sIHN1YmJhbmQ7CisKKyAgICBzLT5oZCA9IGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfQVBUWF9IRDsKKyAgICBzLT5ibG9ja19zaXplID0gcy0+aGQgPyA2IDogNDsKKworICAgIGlmIChhdmN0eC0+ZnJhbWVfc2l6ZSA9PSAwKQorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IDI1NiAqIHMtPmJsb2NrX3NpemU7CisKKyAgICBpZiAoYXZjdHgtPmZyYW1lX3NpemUgJSBzLT5ibG9ja19zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZyYW1lIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mICVkIHNhbXBsZXNcbiIsIHMtPmJsb2NrX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZvciAoY2hhbiA9IDA7IGNoYW4gPCBOQl9DSEFOTkVMUzsgY2hhbisrKSB7CisgICAgICAgIENoYW5uZWwgKmNoYW5uZWwgPSAmcy0+Y2hhbm5lbHNbY2hhbl07CisgICAgICAgIGZvciAoc3ViYmFuZCA9IDA7IHN1YmJhbmQgPCBOQl9TVUJCQU5EUzsgc3ViYmFuZCsrKSB7CisgICAgICAgICAgICBQcmVkaWN0aW9uICpwcmVkaWN0aW9uID0gJmNoYW5uZWwtPnByZWRpY3Rpb25bc3ViYmFuZF07CisgICAgICAgICAgICBwcmVkaWN0aW9uLT5wcmV2X3NpZ25bMF0gPSAxOworICAgICAgICAgICAgcHJlZGljdGlvbi0+cHJldl9zaWduWzFdID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX2FmX3F1ZXVlX2luaXQoYXZjdHgsICZzLT5hZnEpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwdHhfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQXB0WENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcG9zLCBvcG9zLCBjaGFubmVsLCBzYW1wbGUsIHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IHMtPmJsb2NrX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWNrZXQgaXMgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+Y2hhbm5lbHMgPSBOQl9DSEFOTkVMUzsKKyAgICBmcmFtZS0+Zm9ybWF0ID0gQVZfU0FNUExFX0ZNVF9TMzJQOworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gNCAqIGF2cGt0LT5zaXplIC8gcy0+YmxvY2tfc2l6ZTsKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChwb3MgPSAwLCBvcG9zID0gMDsgb3BvcyA8IGZyYW1lLT5uYl9zYW1wbGVzOyBwb3MgKz0gcy0+YmxvY2tfc2l6ZSwgb3BvcyArPSA0KSB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlc1tOQl9DSEFOTkVMU11bNF07CisKKyAgICAgICAgaWYgKGFwdHhfZGVjb2RlX3NhbXBsZXMocywgJmF2cGt0LT5kYXRhW3Bvc10sIHNhbXBsZXMpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN5bmNocm9uaXphdGlvbiBlcnJvclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBOQl9DSEFOTkVMUzsgY2hhbm5lbCsrKQorICAgICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCA0OyBzYW1wbGUrKykKKyAgICAgICAgICAgICAgICBBVl9XTjMyQSgmZnJhbWUtPmRhdGFbY2hhbm5lbF1bNCoob3BvcytzYW1wbGUpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzW2NoYW5uZWxdW3NhbXBsZV0gPDwgOCk7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSAxOworICAgIHJldHVybiBzLT5ibG9ja19zaXplICogZnJhbWUtPm5iX3NhbXBsZXMgLyA0OworfQorCitzdGF0aWMgaW50IGFwdHhfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBBcHRYQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHBvcywgaXBvcywgY2hhbm5lbCwgc2FtcGxlLCBvdXRwdXRfc2l6ZSwgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9hZl9xdWV1ZV9hZGQoJnMtPmFmcSwgZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBvdXRwdXRfc2l6ZSA9IHMtPmJsb2NrX3NpemUgKiBmcmFtZS0+bmJfc2FtcGxlcy80OworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIG91dHB1dF9zaXplLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChwb3MgPSAwLCBpcG9zID0gMDsgcG9zIDwgb3V0cHV0X3NpemU7IHBvcyArPSBzLT5ibG9ja19zaXplLCBpcG9zICs9IDQpIHsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVzW05CX0NIQU5ORUxTXVs0XTsKKworICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgTkJfQ0hBTk5FTFM7IGNoYW5uZWwrKykKKyAgICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgNDsgc2FtcGxlKyspCisgICAgICAgICAgICAgICAgc2FtcGxlc1tjaGFubmVsXVtzYW1wbGVdID0gKGludDMyX3QpQVZfUk4zMkEoJmZyYW1lLT5kYXRhW2NoYW5uZWxdWzQqKGlwb3Mrc2FtcGxlKV0pID4+IDg7CisKKyAgICAgICAgYXB0eF9lbmNvZGVfc2FtcGxlcyhzLCBzYW1wbGVzLCBhdnBrdC0+ZGF0YSArIHBvcyk7CisgICAgfQorCisgICAgZmZfYWZfcXVldWVfcmVtb3ZlKCZzLT5hZnEsIGZyYW1lLT5uYl9zYW1wbGVzLCAmYXZwa3QtPnB0cywgJmF2cGt0LT5kdXJhdGlvbik7CisgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFwdHhfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFwdFhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBmZl9hZl9xdWV1ZV9jbG9zZSgmcy0+YWZxKTsKKyAgICByZXR1cm4gMDsKK30KKworCisjaWYgQ09ORklHX0FQVFhfREVDT0RFUgorQVZDb2RlYyBmZl9hcHR4X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJhcHR4IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImFwdFggKEF1ZGlvIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBmb3IgQmx1ZXRvb3RoKSIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FQVFgsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihBcHRYQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IGFwdHhfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgICAgICAgID0gYXB0eF9kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IGFwdHhfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCisgICAgLmNoYW5uZWxfbGF5b3V0cyAgICAgICA9IChjb25zdCB1aW50NjRfdFtdKSB7IEFWX0NIX0xBWU9VVF9TVEVSRU8sIDB9LAorICAgIC5zYW1wbGVfZm10cyAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfUzMyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19BUFRYX0hEX0RFQ09ERVIKK0FWQ29kZWMgZmZfYXB0eF9oZF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAiYXB0eF9oZCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJhcHRYIEhEIChBdWRpbyBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgZm9yIEJsdWV0b290aCkiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BUFRYX0hELAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoQXB0WENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBhcHR4X2luaXQsCisgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IGFwdHhfZGVjb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBhcHR4X2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICAgICAgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAorICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgPSAoY29uc3QgdWludDY0X3RbXSkgeyBBVl9DSF9MQVlPVVRfU1RFUkVPLCAwfSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgICAgICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MzMlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQVBUWF9FTkNPREVSCitBVkNvZGVjIGZmX2FwdHhfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gImFwdHgiLAorICAgIC5sb25nX25hbWUgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiYXB0WCAoQXVkaW8gUHJvY2Vzc2luZyBUZWNobm9sb2d5IGZvciBCbHVldG9vdGgpIiksCisgICAgLnR5cGUgICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVBUWCwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKEFwdFhDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gYXB0eF9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICAgICAgICAgPSBhcHR4X2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgICAgICAgID0gYXB0eF9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQVZfQ09ERUNfQ0FQX1NNQUxMX0xBU1RfRlJBTUUsCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCisgICAgLmNoYW5uZWxfbGF5b3V0cyAgICAgICA9IChjb25zdCB1aW50NjRfdFtdKSB7IEFWX0NIX0xBWU9VVF9TVEVSRU8sIDB9LAorICAgIC5zYW1wbGVfZm10cyAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfUzMyUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzID0gKGNvbnN0IGludFtdKSB7ODAwMCwgMTYwMDAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwLCAwfSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19BUFRYX0hEX0VOQ09ERVIKK0FWQ29kZWMgZmZfYXB0eF9oZF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAiYXB0eF9oZCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJhcHRYIEhEIChBdWRpbyBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgZm9yIEJsdWV0b290aCkiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BUFRYX0hELAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoQXB0WENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBhcHR4X2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICA9IGFwdHhfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBhcHR4X2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSBBVl9DT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgICAgICAgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKKyAgICAuY2hhbm5lbF9sYXlvdXRzICAgICAgID0gKGNvbnN0IHVpbnQ2NF90W10pIHsgQVZfQ0hfTEFZT1VUX1NURVJFTywgMH0sCisgICAgLnNhbXBsZV9mbXRzICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMgPSAoY29uc3QgaW50W10pIHs4MDAwLCAxNjAwMCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDB9LAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vTWFrZWZpbGUgYi9saWJhdmNvZGVjL2FybS9NYWtlZmlsZQppbmRleCAxNzljNDAzLi5lNjU2MDExIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9NYWtlZmlsZQorKysgYi9saWJhdmNvZGVjL2FybS9NYWtlZmlsZQpAQCAtNyw3ICs3LDEwIEBACiBPQkpTLSQoQ09ORklHX0JMT0NLRFNQKSAgICAgICAgICAgICAgICArPSBhcm0vYmxvY2tkc3BfaW5pdF9hcm0ubwogT0JKUy0kKENPTkZJR19GRlQpICAgICAgICAgICAgICAgICAgICAgKz0gYXJtL2ZmdF9pbml0X2FybS5vICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL2ZmdF9maXhlZF9pbml0X2FybS5vCitPQkpTLSQoQ09ORklHX0ZMQUNEU1ApICAgICAgICAgICAgICAgICArPSBhcm0vZmxhY2RzcF9pbml0X2FybS5vICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vZmxhY2RzcF9hcm0ubwogT0JKUy0kKENPTkZJR19GTVRDT05WRVJUKSAgICAgICAgICAgICAgKz0gYXJtL2ZtdGNvbnZlcnRfaW5pdF9hcm0ubworT0JKUy0kKENPTkZJR19HNzIyRFNQKSAgICAgICAgICAgICAgICAgKz0gYXJtL2c3MjJkc3BfaW5pdF9hcm0ubwogT0JKUy0kKENPTkZJR19IMjY0Q0hST01BKSAgICAgICAgICAgICAgKz0gYXJtL2gyNjRjaHJvbWFfaW5pdF9hcm0ubwogT0JKUy0kKENPTkZJR19IMjY0RFNQKSAgICAgICAgICAgICAgICAgKz0gYXJtL2gyNjRkc3BfaW5pdF9hcm0ubwogT0JKUy0kKENPTkZJR19IMjY0UFJFRCkgICAgICAgICAgICAgICAgKz0gYXJtL2gyNjRwcmVkX2luaXRfYXJtLm8KQEAgLTE4LDkgKzIxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9pZGN0ZHNwX2FybS5vICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9qcmV2ZGN0X2FybS5vICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9zaW1wbGVfaWRjdF9hcm0ubwotT0JKUy0kKENPTkZJR19GTEFDRFNQKSAgICAgICAgICAgICAgICAgKz0gYXJtL2ZsYWNkc3BfaW5pdF9hcm0ubyAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL2ZsYWNkc3BfYXJtLm8KLU9CSlMtJChDT05GSUdfRzcyMkRTUCkgICAgICAgICAgICAgICAgICs9IGFybS9nNzIyZHNwX2luaXRfYXJtLm8KIE9CSlMtJChDT05GSUdfTExBVUREU1ApICAgICAgICAgICAgICAgICs9IGFybS9sb3NzbGVzc19hdWRpb2RzcF9pbml0X2FybS5vCiBPQkpTLSQoQ09ORklHX01FX0NNUCkgICAgICAgICAgICAgICAgICArPSBhcm0vbWVfY21wX2luaXRfYXJtLm8KIE9CSlMtJChDT05GSUdfTVBFR0FVRElPRFNQKSAgICAgICAgICAgICs9IGFybS9tcGVnYXVkaW9kc3BfaW5pdF9hcm0ubwpAQCAtMjgsNyArMjgsOSBAQAogT0JKUy0kKENPTkZJR19NUEVHVklERU9FTkMpICAgICAgICAgICAgKz0gYXJtL21wZWd2aWRlb2VuY2RzcF9pbml0X2FybS5vCiBPQkpTLSQoQ09ORklHX05FT05fQ0xPQkJFUl9URVNUKSAgICAgICArPSBhcm0vbmVvbnRlc3QubwogT0JKUy0kKENPTkZJR19QSVhCTE9DS0RTUCkgICAgICAgICAgICAgKz0gYXJtL3BpeGJsb2NrZHNwX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfUkRGVCkgICAgICAgICAgICAgICAgICAgICs9IGFybS9yZGZ0X2luaXRfYXJtLm8KIE9CSlMtJChDT05GSUdfUlYzNERTUCkgICAgICAgICAgICAgICAgICs9IGFybS9ydjM0ZHNwX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfVkMxRFNQKSAgICAgICAgICAgICAgICAgICs9IGFybS92YzFkc3BfaW5pdF9hcm0ubwogT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICAgICAgKz0gYXJtL3ZpZGVvZHNwX2luaXRfYXJtLm8KIE9CSlMtJChDT05GSUdfVlAzRFNQKSAgICAgICAgICAgICAgICAgICs9IGFybS92cDNkc3BfaW5pdF9hcm0ubwogT0JKUy0kKENPTkZJR19WUDhEU1ApICAgICAgICAgICAgICAgICAgKz0gYXJtL3ZwOGRzcF9pbml0X2FybS5vCkBAIC00MCw5ICs0MiwxMiBAQAogT0JKUy0kKENPTkZJR19IRVZDX0RFQ09ERVIpICAgICAgICAgICAgKz0gYXJtL2hldmNkc3BfaW5pdF9hcm0ubwogT0JKUy0kKENPTkZJR19NTFBfREVDT0RFUikgICAgICAgICAgICAgKz0gYXJtL21scGRzcF9pbml0X2FybS5vCiBPQkpTLSQoQ09ORklHX1JWNDBfREVDT0RFUikgICAgICAgICAgICArPSBhcm0vcnY0MGRzcF9pbml0X2FybS5vCi1PQkpTLSQoQ09ORklHX1ZDMV9ERUNPREVSKSAgICAgICAgICAgICArPSBhcm0vdmMxZHNwX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfU0JDX0VOQ09ERVIpICAgICAgICAgICAgICs9IGFybS9zYmNkc3BfaW5pdF9hcm0ubwogT0JKUy0kKENPTkZJR19WT1JCSVNfREVDT0RFUikgICAgICAgICAgKz0gYXJtL3ZvcmJpc2RzcF9pbml0X2FybS5vCiBPQkpTLSQoQ09ORklHX1ZQNl9ERUNPREVSKSAgICAgICAgICAgICArPSBhcm0vdnA2ZHNwX2luaXRfYXJtLm8KK09CSlMtJChDT05GSUdfVlA5X0RFQ09ERVIpICAgICAgICAgICAgICs9IGFybS92cDlkc3BfaW5pdF8xMGJwcF9hcm0ubyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDlkc3BfaW5pdF8xMmJwcF9hcm0ubyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDlkc3BfaW5pdF9hcm0ubwogCiAKICMgQVJNdjUgb3B0aW1pemF0aW9ucwpAQCAtNzAsMTMgKzc1LDE0IEBACiBBUk1WNi1PQkpTLSQoQ09ORklHX01QRUdBVURJT0RTUCkgICAgICArPSBhcm0vbXBlZ2F1ZGlvZHNwX2ZpeGVkX2FybXY2Lm8KIEFSTVY2LU9CSlMtJChDT05GSUdfTVBFR1ZJREVPRU5DKSAgICAgICs9IGFybS9tcGVndmlkZW9lbmNkc3BfYXJtdjYubwogQVJNVjYtT0JKUy0kKENPTkZJR19QSVhCTE9DS0RTUCkgICAgICAgKz0gYXJtL3BpeGJsb2NrZHNwX2FybXY2Lm8KK0FSTVY2LU9CSlMtJChDT05GSUdfU1RBUlRDT0RFKSAgICAgICAgICs9IGFybS9zdGFydGNvZGVfYXJtdjYubwogQVJNVjYtT0JKUy0kKENPTkZJR19WUDhEU1ApICAgICAgICAgICAgKz0gYXJtL3ZwOF9hcm12Ni5vICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3ZwOGRzcF9pbml0X2FybXY2Lm8gICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3ZwOGRzcF9hcm12Ni5vCiAKICMgZGVjb2RlcnMvZW5jb2RlcnMKIEFSTVY2LU9CSlMtJChDT05GSUdfTUxQX0RFQ09ERVIpICAgICAgICs9IGFybS9tbHBkc3BfYXJtdjYubwotQVJNVjYtT0JKUy0kKENPTkZJR19TVEFSVENPREUpICAgICAgICAgKz0gYXJtL3N0YXJ0Y29kZV9hcm12Ni5vCitBUk1WNi1PQkpTLSQoQ09ORklHX1NCQ19FTkNPREVSKSAgICAgICArPSBhcm0vc2JjZHNwX2FybXY2Lm8KIAogCiAjIFZGUCBvcHRpbWl6YXRpb25zCkBAIC0xMTgsNiArMTI0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9tZGN0X2ZpeGVkX25lb24ubwogTkVPTi1PQkpTLSQoQ09ORklHX01QRUdWSURFTykgICAgICAgICAgKz0gYXJtL21wZWd2aWRlb19uZW9uLm8KIE5FT04tT0JKUy0kKENPTkZJR19SREZUKSAgICAgICAgICAgICAgICs9IGFybS9yZGZ0X25lb24ubworTkVPTi1PQkpTLSQoQ09ORklHX1ZDMURTUCkgICAgICAgICAgICAgKz0gYXJtL3ZjMWRzcF9pbml0X25lb24ubyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3ZjMWRzcF9uZW9uLm8KIE5FT04tT0JKUy0kKENPTkZJR19WUDNEU1ApICAgICAgICAgICAgICs9IGFybS92cDNkc3BfbmVvbi5vCiBORU9OLU9CSlMtJChDT05GSUdfVlA4RFNQKSAgICAgICAgICAgICArPSBhcm0vdnA4ZHNwX2luaXRfbmVvbi5vICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vdnA4ZHNwX25lb24ubwpAQCAtMTMwLDExICsxMzgsMTcgQEAKIE5FT04tT0JKUy0kKENPTkZJR19IRVZDX0RFQ09ERVIpICAgICAgICs9IGFybS9oZXZjZHNwX2luaXRfbmVvbi5vICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9oZXZjZHNwX2RlYmxvY2tfbmVvbi5vICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9oZXZjZHNwX2lkY3RfbmVvbi5vICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9oZXZjZHNwX3FwZWxfbmVvbi5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vaGV2Y2RzcF9xcGVsX25lb24ubyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcm0vaGV2Y2RzcF9zYW9fbmVvbi5vCiBORU9OLU9CSlMtJChDT05GSUdfUlYzMF9ERUNPREVSKSAgICAgICArPSBhcm0vcnYzNGRzcF9uZW9uLm8KIE5FT04tT0JKUy0kKENPTkZJR19SVjQwX0RFQ09ERVIpICAgICAgICs9IGFybS9ydjM0ZHNwX25lb24ubyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9ydjQwZHNwX25lb24ubwotTkVPTi1PQkpTLSQoQ09ORklHX1ZDMV9ERUNPREVSKSAgICAgICAgKz0gYXJtL3ZjMWRzcF9pbml0X25lb24ubyAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3ZjMWRzcF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19TQkNfRU5DT0RFUikgICAgICAgICs9IGFybS9zYmNkc3BfbmVvbi5vCiBORU9OLU9CSlMtJChDT05GSUdfVk9SQklTX0RFQ09ERVIpICAgICArPSBhcm0vdm9yYmlzZHNwX25lb24ubwogTkVPTi1PQkpTLSQoQ09ORklHX1ZQNl9ERUNPREVSKSAgICAgICAgKz0gYXJtL3ZwNmRzcF9uZW9uLm8KK05FT04tT0JKUy0kKENPTkZJR19WUDlfREVDT0RFUikgICAgICAgICs9IGFybS92cDlpdHhmbV8xNmJwcF9uZW9uLm8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDlpdHhmbV9uZW9uLm8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDlscGZfMTZicHBfbmVvbi5vICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDlscGZfbmVvbi5vICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDltY18xNmJwcF9uZW9uLm8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS92cDltY19uZW9uLm8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2FhY3BzZHNwX2luaXRfYXJtLmMgYi9saWJhdmNvZGVjL2FybS9hYWNwc2RzcF9pbml0X2FybS5jCmluZGV4IGUwNDc4N2MuLjZlYjk3OWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL2FhY3BzZHNwX2luaXRfYXJtLmMKKysrIGIvbGliYXZjb2RlYy9hcm0vYWFjcHNkc3BfaW5pdF9hcm0uYwpAQCAtMjksNyArMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc3JjMSwgaW50IG4pOwogdm9pZCBmZl9wc19oeWJyaWRfYW5hbHlzaXNfbmVvbihmbG9hdCAoKm91dClbMl0sIGZsb2F0ICgqaW4pWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAoKmZpbHRlcilbOF1bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IG4pOwogdm9pZCBmZl9wc19oeWJyaWRfYW5hbHlzaXNfaWxlYXZlX25lb24oZmxvYXQgKCpvdXQpWzMyXVsyXSwgZmxvYXQgTFsyXVszOF1bNjRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBsZW4pOwogdm9pZCBmZl9wc19oeWJyaWRfc3ludGhlc2lzX2RlaW50X25lb24oZmxvYXQgb3V0WzJdWzM4XVs2NF0sIGZsb2F0ICgqaW4pWzMyXVsyXSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2FhY3BzZHNwX25lb24uUyBiL2xpYmF2Y29kZWMvYXJtL2FhY3BzZHNwX25lb24uUwppbmRleCBhOTNiYmZlLi4zYjFiZWQyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9hYWNwc2RzcF9uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vYWFjcHNkc3BfbmVvbi5TCkBAIC0yMzIsMTIgKzIzMiwxMSBAQAogZnVuY3Rpb24gZmZfcHNfc3RlcmVvX2ludGVycG9sYXRlX25lb24sIGV4cG9ydD0xCiAgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IyXQogICAgICAgICB2bGQxLjMyICAgICAgICAge3ExNH0sICAgIFtyM10KLSAgICAgICAgdmFkZC5mMzIgICAgICAgIHExNSwgcTE0LCBxMTQKICAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAgcjAKICAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgcjEKICAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQogICAgICAgICB2YWRkLmYzMiAgICAgICAgcTEsICBxMCwgIHExNAotICAgICAgICB2YWRkLmYzMiAgICAgICAgcTAsICBxMCwgIHExNQorICAgICAgICB2YWRkLmYzMiAgICAgICAgcTAsICBxMSwgIHExNAogICAgICAgICB2bGQxLjMyICAgICAgICAge3EyfSwgICAgIFtyMCw6NjRdIQogICAgICAgICB2bGQxLjMyICAgICAgICAge3EzfSwgICAgIFtyMSw6NjRdIQogICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCkBAIC0yNTEsOCArMjUwLDEwIEBACiAgICAgICAgIHZtbGEuZjMyICAgICAgICBkMTcsIGQ3LCAgZDFbMF0KICAgICAgICAgdm1sYS5mMzIgICAgICAgIGQxOCwgZDYsICBkM1sxXQogICAgICAgICB2bWxhLmYzMiAgICAgICAgZDE5LCBkNywgIGQxWzFdCi0gICAgICAgIHZhZGQuZjMyICAgICAgICBxMSwgIHExLCAgcTE1Ci0gICAgICAgIHZhZGQuZjMyICAgICAgICBxMCwgIHEwLCAgcTE1CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMSwgIHExLCAgcTE0CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMCwgIHEwLCAgcTE0CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMSwgIHExLCAgcTE0CisgICAgICAgIHZhZGQuZjMyICAgICAgICBxMCwgIHEwLCAgcTE0CiAgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTJ9LCAgICAgW3IwLDo2NF0hCiAgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTN9LCAgICAgW3IxLDo2NF0hCiAgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTh9LCAgICAgW3IyLDo2NF0hCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9hdWRpb2RzcF9pbml0X25lb24uYyBiL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX2luaXRfbmVvbi5jCmluZGV4IGY3YmQxNjIuLjY5MDJkYjggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX2luaXRfbmVvbi5jCisrKyBiL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX2luaXRfbmVvbi5jCkBAIC0yNSw4ICsyNSw3IEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy9hdWRpb2RzcC5oIgogI2luY2x1ZGUgImF1ZGlvZHNwX2FybS5oIgogCi12b2lkIGZmX3ZlY3Rvcl9jbGlwZl9uZW9uKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGZsb2F0IG1pbiwgZmxvYXQgbWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKK3ZvaWQgZmZfdmVjdG9yX2NsaXBmX25lb24oZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgaW50IGxlbiwgZmxvYXQgbWluLCBmbG9hdCBtYXgpOwogdm9pZCBmZl92ZWN0b3JfY2xpcF9pbnQzMl9uZW9uKGludDMyX3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLCBpbnQzMl90IG1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heCwgdW5zaWduZWQgaW50IGxlbik7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX25lb24uUyBiL2xpYmF2Y29kZWMvYXJtL2F1ZGlvZHNwX25lb24uUwppbmRleCBhYjMyY2VmLi5jZWE3MDBjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9hdWRpb2RzcF9uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vYXVkaW9kc3BfbmVvbi5TCkBAIC0yNCw5ICsyNCw4IEBACiBmdW5jdGlvbiBmZl92ZWN0b3JfY2xpcGZfbmVvbiwgZXhwb3J0PTEKIFZGUCAgICAgdmR1cC4zMiAgICAgICAgIHExLCAgZDBbMV0KIFZGUCAgICAgdmR1cC4zMiAgICAgICAgIHEwLCAgZDBbMF0KLU5PVkZQICAgdmR1cC4zMiAgICAgICAgIHEwLCAgcjIKLU5PVkZQICAgdmR1cC4zMiAgICAgICAgIHExLCAgcjMKLU5PVkZQICAgbGRyICAgICAgICAgICAgIHIyLCAgW3NwXQorTk9WRlAgICB2ZHVwLjMyICAgICAgICAgcTAsICByMworTk9WRlAgICB2bGQxLjMyICAgICAgICAge2QyW10sZDNbXX0sIFtzcF0KICAgICAgICAgdmxkMS5mMzIgICAgICAgIHtxMn0sW3IxLDoxMjhdIQogICAgICAgICB2bWluLmYzMiAgICAgICAgcTEwLCBxMiwgIHExCiAgICAgICAgIHZsZDEuZjMyICAgICAgICB7cTN9LFtyMSw6MTI4XSEKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2Jsb2NrZHNwX2luaXRfbmVvbi5jIGIvbGliYXZjb2RlYy9hcm0vYmxvY2tkc3BfaW5pdF9uZW9uLmMKaW5kZXggODdjMGQ2ZC4uMDYwMGJjNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vYmxvY2tkc3BfaW5pdF9uZW9uLmMKKysrIGIvbGliYXZjb2RlYy9hcm0vYmxvY2tkc3BfaW5pdF9uZW9uLmMKQEAgLTMwLDYgKzMwLDYgQEAKIAogYXZfY29sZCB2b2lkIGZmX2Jsb2NrZHNwX2luaXRfbmVvbihCbG9ja0RTUENvbnRleHQgKmMpCiB7Ci0gICAgICBjLT5jbGVhcl9ibG9jayAgPSBmZl9jbGVhcl9ibG9ja19uZW9uOwotICAgICAgYy0+Y2xlYXJfYmxvY2tzID0gZmZfY2xlYXJfYmxvY2tzX25lb247CisgICAgYy0+Y2xlYXJfYmxvY2sgID0gZmZfY2xlYXJfYmxvY2tfbmVvbjsKKyAgICBjLT5jbGVhcl9ibG9ja3MgPSBmZl9jbGVhcl9ibG9ja3NfbmVvbjsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2RjdC10ZXN0LmMgYi9saWJhdmNvZGVjL2FybS9kY3QtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTA3NmIzLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvYXJtL2RjdC10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgImlkY3QuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGZkY3RfdGFiX2FyY2hbXSA9IHsKLSAgICB7IDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGlkY3RfdGFiX2FyY2hbXSA9IHsKLSAgICB7ICJTSU1QTEUtQVJNIiwgICAgIGZmX3NpbXBsZV9pZGN0X2FybSwgICAgIEZGX0lEQ1RfUEVSTV9OT05FIH0sCi0gICAgeyAiSU5ULUFSTSIsICAgICAgICBmZl9qX3Jldl9kY3RfYXJtLCAgICAgICBGRl9JRENUX1BFUk1fTElCTVBFRzIgfSwKLSNpZiBIQVZFX0FSTVY1VEUKLSAgICB7ICJTSU1QTEUtQVJNVjVURSIsIGZmX3NpbXBsZV9pZGN0X2FybXY1dGUsIEZGX0lEQ1RfUEVSTV9OT05FLCAgICAgIEFWX0NQVV9GTEFHX0FSTVY1VEUgfSwKLSNlbmRpZgotI2lmIEhBVkVfQVJNVjYKLSAgICB7ICJTSU1QTEUtQVJNVjYiLCAgIGZmX3NpbXBsZV9pZGN0X2FybXY2LCAgIEZGX0lEQ1RfUEVSTV9MSUJNUEVHMiwgIEFWX0NQVV9GTEFHX0FSTVY2IH0sCi0jZW5kaWYKLSNpZiBIQVZFX05FT04KLSAgICB7ICJTSU1QTEUtTkVPTiIsICAgIGZmX3NpbXBsZV9pZGN0X25lb24sICAgIEZGX0lEQ1RfUEVSTV9QQVJUVFJBTlMsIEFWX0NQVV9GTEFHX05FT04gfSwKLSNlbmRpZgotICAgIHsgMCB9Ci19OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vZmZ0X2ZpeGVkX2luaXRfYXJtLmMgYi9saWJhdmNvZGVjL2FybS9mZnRfZml4ZWRfaW5pdF9hcm0uYwppbmRleCBiNjBiYjlmLi4xMTIyNmQ2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9mZnRfZml4ZWRfaW5pdF9hcm0uYworKysgYi9saWJhdmNvZGVjL2FybS9mZnRfZml4ZWRfaW5pdF9hcm0uYwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgogCiAjZGVmaW5lIEZGVF9GTE9BVCAwCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9mZnRfaW5pdF9hcm0uYyBiL2xpYmF2Y29kZWMvYXJtL2ZmdF9pbml0X2FybS5jCmluZGV4IDA1NWMyYzEuLjMzMWJkNjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL2ZmdF9pbml0X2FybS5jCisrKyBiL2xpYmF2Y29kZWMvYXJtL2ZmdF9pbml0X2FybS5jCkBAIC0xOCwxMCArMTgsMTEgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvZmZ0LmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9yZGZ0LmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9zeW50aF9maWx0ZXIuaCIKIAogdm9pZCBmZl9mZnRfY2FsY192ZnAoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeik7CiAKQEAgLTM0LDggKzM1LDYgQEAKIHZvaWQgZmZfaW1kY3RfaGFsZl9uZW9uKEZGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKIHZvaWQgZmZfbWRjdF9jYWxjX25lb24oRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpOwogCi12b2lkIGZmX3JkZnRfY2FsY19uZW9uKHN0cnVjdCBSREZUQ29udGV4dCAqcywgRkZUU2FtcGxlICp6KTsKLQogYXZfY29sZCB2b2lkIGZmX2ZmdF9pbml0X2FybShGRlRDb250ZXh0ICpzKQogewogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CkBAIC02MCwxMyArNTksMyBAQAogI2VuZGlmCiAgICAgfQogfQotCi0jaWYgQ09ORklHX1JERlQKLWF2X2NvbGQgdm9pZCBmZl9yZGZ0X2luaXRfYXJtKFJERlRDb250ZXh0ICpzKQotewotICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7Ci0KLSAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCi0gICAgICAgIHMtPnJkZnRfY2FsYyAgICA9IGZmX3JkZnRfY2FsY19uZW9uOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9mbXRjb252ZXJ0X2luaXRfYXJtLmMgYi9saWJhdmNvZGVjL2FybS9mbXRjb252ZXJ0X2luaXRfYXJtLmMKaW5kZXggYTczNGRlYy4uZTg4MjU1ZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vZm10Y29udmVydF9pbml0X2FybS5jCisrKyBiL2xpYmF2Y29kZWMvYXJtL2ZtdGNvbnZlcnRfaW5pdF9hcm0uYwpAQCAtNDIsMTAgKzQyLDggQEAKICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKGhhdmVfdmZwX3ZtKGNwdV9mbGFncykpIHsKLSAgICAgICAgaWYgKCFoYXZlX3ZmcHYzKGNwdV9mbGFncykpIHsKLSAgICAgICAgICAgIGMtPmludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyID0gZmZfaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfdmZwOwotICAgICAgICAgICAgYy0+aW50MzJfdG9fZmxvYXRfZm11bF9hcnJheTggPSBmZl9pbnQzMl90b19mbG9hdF9mbXVsX2FycmF5OF92ZnA7Ci0gICAgICAgIH0KKyAgICAgICAgYy0+aW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXIgPSBmZl9pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl92ZnA7CisgICAgICAgIGMtPmludDMyX3RvX2Zsb2F0X2ZtdWxfYXJyYXk4ID0gZmZfaW50MzJfdG9fZmxvYXRfZm11bF9hcnJheThfdmZwOwogICAgIH0KIAogICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vaDI2NGNocm9tYV9pbml0X2FybS5jIGIvbGliYXZjb2RlYy9hcm0vaDI2NGNocm9tYV9pbml0X2FybS5jCmluZGV4IDEzZjdlMGQuLmFhZTgwNGIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL2gyNjRjaHJvbWFfaW5pdF9hcm0uYworKysgYi9saWJhdmNvZGVjL2FybS9oMjY0Y2hyb21hX2luaXRfYXJtLmMKQEAgLTI2LDEzICsyNiwxOSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0Y2hyb21hLmgiCiAKLXZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOwotdm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM0X25lb24odWludDhfdCAqLCB1aW50OF90ICosIGludCwgaW50LCBpbnQsIGludCk7Ci12b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzJfbmVvbih1aW50OF90ICosIHVpbnQ4X3QgKiwgaW50LCBpbnQsIGludCwgaW50KTsKK3ZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWMyX25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKIAotdm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqLCB1aW50OF90ICosIGludCwgaW50LCBpbnQsIGludCk7Ci12b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICosIHVpbnQ4X3QgKiwgaW50LCBpbnQsIGludCwgaW50KTsKLXZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jMl9uZW9uKHVpbnQ4X3QgKiwgdWludDhfdCAqLCBpbnQsIGludCwgaW50LCBpbnQpOwordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzJfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwogCiBhdl9jb2xkIHZvaWQgZmZfaDI2NGNocm9tYV9pbml0X2FybShIMjY0Q2hyb21hQ29udGV4dCAqYywgaW50IGJpdF9kZXB0aCkKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2gyNjRjbWNfbmVvbi5TIGIvbGliYXZjb2RlYy9hcm0vaDI2NGNtY19uZW9uLlMKaW5kZXggNzdlZDNjMC4uNWE0MTU5ZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vaDI2NGNtY19uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vaDI2NGNtY19uZW9uLlMKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCiAKLS8qIGNocm9tYV9tYzgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpICovCisvKiBjaHJvbWFfbWM4KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KSAqLwogLm1hY3JvICBoMjY0X2Nocm9tYV9tYzggdHlwZSwgY29kZWM9aDI2NAogZnVuY3Rpb24gZmZfXHR5cGVcKClfXGNvZGVjXCgpX2Nocm9tYV9tYzhfbmVvbiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNywgbHJ9CkBAIC0xOTUsNyArMTk1LDcgQEAKIGVuZGZ1bmMKIC5lbmRtCiAKLS8qIGNocm9tYV9tYzQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpICovCisvKiBjaHJvbWFfbWM0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KSAqLwogLm1hY3JvICBoMjY0X2Nocm9tYV9tYzQgdHlwZSwgY29kZWM9aDI2NAogZnVuY3Rpb24gZmZfXHR5cGVcKClfXGNvZGVjXCgpX2Nocm9tYV9tYzRfbmVvbiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yNywgbHJ9CkBAIC00NTUsNyArNDU1LDcgQEAKICAgICAgICAgaDI2NF9jaHJvbWFfbWM0IGF2ZywgcnY0MAogI2VuZGlmCiAKLSNpZiBDT05GSUdfVkMxX0RFQ09ERVIKKyNpZiBDT05GSUdfVkMxRFNQCiAgICAgICAgIGgyNjRfY2hyb21hX21jOCBwdXQsIHZjMQogICAgICAgICBoMjY0X2Nocm9tYV9tYzggYXZnLCB2YzEKICAgICAgICAgaDI2NF9jaHJvbWFfbWM0IHB1dCwgdmMxCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9oMjY0aWRjdF9uZW9uLlMgYi9saWJhdmNvZGVjL2FybS9oMjY0aWRjdF9uZW9uLlMKaW5kZXggNGY2OGJkYi4uOTM4NTlkYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vaDI2NGlkY3RfbmVvbi5TCisrKyBiL2xpYmF2Y29kZWMvYXJtL2gyNjRpZGN0X25lb24uUwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCiAKIGZ1bmN0aW9uIGZmX2gyNjRfaWRjdF9hZGRfbmVvbiwgZXhwb3J0PTEKK2gyNjRfaWRjdF9hZGRfbmVvbl9ub3RodW1iOgogICAgICAgICB2bGQxLjY0ICAgICAgICAge2QwLWQzfSwgIFtyMSw6MTI4XQogICAgICAgICB2bW92LmkxNiAgICAgICAgcTE1LCAjMAogCkBAIC03Myw2ICs3NCw3IEBACiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2gyNjRfaWRjdF9kY19hZGRfbmVvbiwgZXhwb3J0PTEKK2gyNjRfaWRjdF9kY19hZGRfbmVvbl9ub3RodW1iOgogICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAgICAgICMwCiAgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDJbXSxkM1tdfSwgW3IxLDoxNl0KICAgICAgICAgc3RyaCAgICAgICAgICAgIHIzLCAgICAgICBbcjFdCkBAIC0xMTMsOCArMTE1LDggQEAKICAgICAgICAgbW92bmUgICAgICAgICAgIGxyLCAgIzAKICAgICAgICAgY21wICAgICAgICAgICAgIGxyLCAgIzAKICAgICAgICAgaXRlICAgICAgICAgICAgIG5lCi0gICAgICAgIGFkcm5lICAgICAgICAgICBsciwgIFgoZmZfaDI2NF9pZGN0X2RjX2FkZF9uZW9uKSArIENPTkZJR19USFVNQgotICAgICAgICBhZHJlcSAgICAgICAgICAgbHIsICBYKGZmX2gyNjRfaWRjdF9hZGRfbmVvbikgICAgKyBDT05GSUdfVEhVTUIKKyAgICAgICAgYWRybmUgICAgICAgICAgIGxyLCAgaDI2NF9pZGN0X2RjX2FkZF9uZW9uX25vdGh1bWIgKyBDT05GSUdfVEhVTUIKKyAgICAgICAgYWRyZXEgICAgICAgICAgIGxyLCAgaDI2NF9pZGN0X2FkZF9uZW9uX25vdGh1bWIgICAgKyBDT05GSUdfVEhVTUIKICAgICAgICAgYmx4ICAgICAgICAgICAgIGxyCiAyOiAgICAgIHN1YnMgICAgICAgICAgICBpcCwgIGlwLCAgIzEKICAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjEsICAjMzIKQEAgLTEzOCw4ICsxNDAsOCBAQAogICAgICAgICBjbXAgICAgICAgICAgICAgcjgsICAjMAogICAgICAgICBsZHJzaCAgICAgICAgICAgcjgsICBbcjFdCiAgICAgICAgIGl0ZWV0ICAgICAgICAgICBuZQotICAgICAgICBhZHJuZSAgICAgICAgICAgbHIsICBYKGZmX2gyNjRfaWRjdF9hZGRfbmVvbikgICAgKyBDT05GSUdfVEhVTUIKLSAgICAgICAgYWRyZXEgICAgICAgICAgIGxyLCAgWChmZl9oMjY0X2lkY3RfZGNfYWRkX25lb24pICsgQ09ORklHX1RIVU1CCisgICAgICAgIGFkcm5lICAgICAgICAgICBsciwgIGgyNjRfaWRjdF9hZGRfbmVvbl9ub3RodW1iICAgICsgQ09ORklHX1RIVU1CCisgICAgICAgIGFkcmVxICAgICAgICAgICBsciwgIGgyNjRfaWRjdF9kY19hZGRfbmVvbl9ub3RodW1iICsgQ09ORklHX1RIVU1CCiAgICAgICAgIGNtcGVxICAgICAgICAgICByOCwgICMwCiAgICAgICAgIGJseG5lICAgICAgICAgICBscgogICAgICAgICBzdWJzICAgICAgICAgICAgaXAsICBpcCwgICMxCkBAIC0xNjYsOCArMTY4LDggQEAKICAgICAgICAgY21wICAgICAgICAgICAgIHI4LCAgIzAKICAgICAgICAgbGRyc2ggICAgICAgICAgIHI4LCAgW3IxXQogICAgICAgICBpdGVldCAgICAgICAgICAgbmUKLSAgICAgICAgYWRybmUgICAgICAgICAgIGxyLCAgWChmZl9oMjY0X2lkY3RfYWRkX25lb24pICAgICsgQ09ORklHX1RIVU1CCi0gICAgICAgIGFkcmVxICAgICAgICAgICBsciwgIFgoZmZfaDI2NF9pZGN0X2RjX2FkZF9uZW9uKSArIENPTkZJR19USFVNQgorICAgICAgICBhZHJuZSAgICAgICAgICAgbHIsICBoMjY0X2lkY3RfYWRkX25lb25fbm90aHVtYiAgICArIENPTkZJR19USFVNQgorICAgICAgICBhZHJlcSAgICAgICAgICAgbHIsICBoMjY0X2lkY3RfZGNfYWRkX25lb25fbm90aHVtYiArIENPTkZJR19USFVNQgogICAgICAgICBjbXBlcSAgICAgICAgICAgcjgsICAjMAogICAgICAgICBibHhuZSAgICAgICAgICAgbHIKICAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCAjMQpAQCAtMjY3LDYgKzI2OSw3IEBACiAuZW5kbQogCiBmdW5jdGlvbiBmZl9oMjY0X2lkY3Q4X2FkZF9uZW9uLCBleHBvcnQ9MQoraDI2NF9pZGN0OF9hZGRfbmVvbl9ub3RodW1iOgogICAgICAgICB2bW92LmkxNiAgICAgICAgcTMsICAgICAgICMwCiAgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTgtcTl9LCAgW3IxLDoxMjhdCiAgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTN9LCAgICAgW3IxLDoxMjhdIQpAQCAtMzI4LDYgKzMzMSw3IEBACiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2gyNjRfaWRjdDhfZGNfYWRkX25lb24sIGV4cG9ydD0xCitoMjY0X2lkY3Q4X2RjX2FkZF9uZW9uX25vdGh1bWI6CiAgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICAgICAgIzAKICAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMzBbXSxkMzFbXX0sW3IxLDoxNl0KICAgICAgICAgc3RyaCAgICAgICAgICAgIHIzLCAgICAgICBbcjFdCkBAIC0zODgsOCArMzkyLDggQEAKICAgICAgICAgbW92bmUgICAgICAgICAgIGxyLCAgIzAKICAgICAgICAgY21wICAgICAgICAgICAgIGxyLCAgIzAKICAgICAgICAgaXRlICAgICAgICAgICAgIG5lCi0gICAgICAgIGFkcm5lICAgICAgICAgICBsciwgIFgoZmZfaDI2NF9pZGN0OF9kY19hZGRfbmVvbikgKyBDT05GSUdfVEhVTUIKLSAgICAgICAgYWRyZXEgICAgICAgICAgIGxyLCAgWChmZl9oMjY0X2lkY3Q4X2FkZF9uZW9uKSAgICArIENPTkZJR19USFVNQgorICAgICAgICBhZHJuZSAgICAgICAgICAgbHIsICBoMjY0X2lkY3Q4X2RjX2FkZF9uZW9uX25vdGh1bWIgKyBDT05GSUdfVEhVTUIKKyAgICAgICAgYWRyZXEgICAgICAgICAgIGxyLCAgaDI2NF9pZGN0OF9hZGRfbmVvbl9ub3RodW1iICAgICsgQ09ORklHX1RIVU1CCiAgICAgICAgIGJseCAgICAgICAgICAgICBscgogMjogICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICM0CiAgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgIzEyOApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9hcm0uaCBiL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfYXJtLmgKaW5kZXggNzczNWRmOS4uNDdjZGZhNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9hcm0uaAorKysgYi9saWJhdmNvZGVjL2FybS9oZXZjZHNwX2FybS5oCkBAIC0yMSw2ICsyMSw2IEBACiAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2hldmNkc3AuaCIKIAotdm9pZCBmZl9oZXZjZHNwX2luaXRfbmVvbihIRVZDRFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCk7Cit2b2lkIGZmX2hldmNfZHNwX2luaXRfbmVvbihIRVZDRFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCk7CiAKICNlbmRpZiAvKiBBVkNPREVDX0FSTV9IRVZDRFNQX0FSTV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9oZXZjZHNwX2RlYmxvY2tfbmVvbi5TIGIvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9kZWJsb2NrX25lb24uUwppbmRleCAxNjZiZGRiLi43Y2I3NDg3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9oZXZjZHNwX2RlYmxvY2tfbmVvbi5TCisrKyBiL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfZGVibG9ja19uZW9uLlMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAgICAgICAgIGFuZCAgICAgICAgcjksIHI4LCByNwogICAgICAgICBjbXAgICAgICAgIHI5LCAjMAotICAgICAgICBiZXEgICAgICAgIHdlYWtmaWx0ZXJfXEAKKyAgICAgICAgYmVxICAgICAgICAxZgogCiAgICAgICAgIHZhZGQuaTE2ICBxMiwgcTExLCBxMTIKICAgICAgICAgdmFkZC5pMTYgIHE0LCBxOSwgcTgKQEAgLTIxMCwxMSArMjEwLDExIEBACiAgICAgICAgIHZiaXQgICAgICBxMTMsIHEzLCBxNQogICAgICAgICB2Yml0ICAgICAgcTE0LCBxMiwgcTUKIAotd2Vha2ZpbHRlcl9cQDoKKzE6CiAgICAgICAgIG12biAgICAgICByOCwgcjgKICAgICAgICAgYW5kICAgICAgIHI5LCByOCwgcjcKICAgICAgICAgY21wICAgICAgIHI5LCAjMAotICAgICAgICBiZXEgICAgICAgcmVhZHlfXEAKKyAgICAgICAgYmVxICAgICAgIDJmCiAKICAgICAgICAgdmR1cC4xNiAgICBxNCwgcjIKIApAQCAtMjc1LDcgKzI3NSw3IEBACiAgICAgICAgIHZiaXQgICAgICBxMTEsIHEwLCBxNQogICAgICAgICB2Yml0ICAgICAgcTEyLCBxNCwgcTUKIAotcmVhZHlfXEA6CisyOgogICAgICAgICB2cW1vdnVuLnMxNiBkMTYsIHE4CiAgICAgICAgIHZxbW92dW4uczE2IGQxOCwgcTkKICAgICAgICAgdnFtb3Z1bi5zMTYgZDIwLCBxMTAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfaWRjdF9uZW9uLlMgYi9saWJhdmNvZGVjL2FybS9oZXZjZHNwX2lkY3RfbmVvbi5TCmluZGV4IDEzZDU0MGUuLjc1Nzk1ZTYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfaWRjdF9uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9pZGN0X25lb24uUwpAQCAtMSw1ICsxLDcgQEAKIC8qCisgKiBBUk0gTkVPTiBvcHRpbWlzZWQgSURDVCBmdW5jdGlvbnMgZm9yIEhFVkMgZGVjb2RpbmcKICAqIENvcHlyaWdodCAoYykgMjAxNCBTZXBwbyBUb21wZXJpIDxzZXBwby50b21wZXJpQHZ0dC5maT4KKyAqIENvcHlyaWdodCAoYykgMjAxNyBBbGV4YW5kcmEgSMOhamtvdsOhCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTE5LDE3OSArMjEsOTY3IEBACiAgKi8KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCi0jaW5jbHVkZSAibmVvbi5TIgogCi1mdW5jdGlvbiBmZl9oZXZjX2lkY3RfNHg0X2RjX25lb25fOCwgZXhwb3J0PTEKLSAgICAgICAgbGRyc2ggICAgICAgcjEsIFtyMF0KLSAgICAgICAgbGRyICAgICAgICAgcjIsID0weDIwCi0gICAgICAgIGFkZCAgICAgICAgIHIxLCAjMQotICAgICAgICBhc3IgICAgICAgICByMSwgIzEKLSAgICAgICAgYWRkICAgICAgICAgcjEsIHIyCi0gICAgICAgIGFzciAgICAgICAgIHIxLCAjNgotICAgICAgICB2ZHVwLjE2ICAgICBxMCwgcjEKLSAgICAgICAgdmR1cC4xNiAgICAgcTEsIHIxCi0gICAgICAgIHZzdDEuMTYgICAgIHtxMCwgcTF9LCBbcjBdCi0gICAgICAgIGJ4IGxyCi1lbmRmdW5jCitjb25zdCB0cmFucywgYWxpZ249NAorICAgICAgICAuc2hvcnQgNjQsIDgzLCA2NCwgMzYKKyAgICAgICAgLnNob3J0IDg5LCA3NSwgNTAsIDE4CisgICAgICAgIC5zaG9ydCA5MCwgODcsIDgwLCA3MAorICAgICAgICAuc2hvcnQgNTcsIDQzLCAyNSwgOQorICAgICAgICAuc2hvcnQgOTAsIDkwLCA4OCwgODUKKyAgICAgICAgLnNob3J0IDgyLCA3OCwgNzMsIDY3CisgICAgICAgIC5zaG9ydCA2MSwgNTQsIDQ2LCAzOAorICAgICAgICAuc2hvcnQgMzEsIDIyLCAxMywgNAorZW5kY29uc3QKIAotZnVuY3Rpb24gZmZfaGV2Y19pZGN0Xzh4OF9kY19uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGxkcnNoICAgICAgIHIxLCBbcjBdCi0gICAgICAgIGxkciAgICAgICAgIHIyLCA9MHgyMAotICAgICAgICBhZGQgICAgICAgICByMSwgIzEKLSAgICAgICAgYXNyICAgICAgICAgcjEsICMxCi0gICAgICAgIGFkZCAgICAgICAgIHIxLCByMgotICAgICAgICBhc3IgICAgICAgICByMSwgIzYKLSAgICAgICAgdmR1cC4xNiAgICAgcTgsIHIxCi0gICAgICAgIHZkdXAuMTYgICAgIHE5LCByMQotICAgICAgICB2bW92LjE2ICAgICBxMTAsIHE4Ci0gICAgICAgIHZtb3YuMTYgICAgIHExMSwgcTgKLSAgICAgICAgdm1vdi4xNiAgICAgcTEyLCBxOAotICAgICAgICB2bW92LjE2ICAgICBxMTMsIHE4Ci0gICAgICAgIHZtb3YuMTYgICAgIHExNCwgcTgKLSAgICAgICAgdm1vdi4xNiAgICAgcTE1LCBxOAotICAgICAgICB2c3RtICAgICAgICByMCwge3E4LXExNX0KLSAgICAgICAgYnggbHIKLWVuZGZ1bmMKLQotZnVuY3Rpb24gZmZfaGV2Y19pZGN0XzE2eDE2X2RjX25lb25fOCwgZXhwb3J0PTEKLSAgICAgICAgbGRyc2ggICAgICAgcjEsIFtyMF0KLSAgICAgICAgbGRyICAgICAgICAgcjIsID0weDIwCi0gICAgICAgIGFkZCAgICAgICAgIHIxLCAjMQotICAgICAgICBhc3IgICAgICAgICByMSwgIzEKLSAgICAgICAgYWRkICAgICAgICAgcjEsIHIyCi0gICAgICAgIGFzciAgICAgICAgIHIxLCAjNgotICAgICAgICB2ZHVwLjE2ICAgICBxOCwgcjEKLSAgICAgICAgdmR1cC4xNiAgICAgcTksIHIxCi0gICAgICAgIHZtb3YuMTYgICAgIHExMCwgcTgKLSAgICAgICAgdm1vdi4xNiAgICAgcTExLCBxOAotICAgICAgICB2bW92LjE2ICAgICBxMTIsIHE4Ci0gICAgICAgIHZtb3YuMTYgICAgIHExMywgcTgKLSAgICAgICAgdm1vdi4xNiAgICAgcTE0LCBxOAotICAgICAgICB2bW92LjE2ICAgICBxMTUsIHE4Ci0gICAgICAgIHZzdG0gICAgICAgIHIwISwge3E4LXExNX0KLSAgICAgICAgdnN0bSAgICAgICAgcjAhLCB7cTgtcTE1fQotICAgICAgICB2c3RtICAgICAgICByMCEsIHtxOC1xMTV9Ci0gICAgICAgIHZzdG0gICAgICAgIHIwLCB7cTgtcTE1fQotICAgICAgICBieCBscgotZW5kZnVuYwotCi1mdW5jdGlvbiBmZl9oZXZjX2lkY3RfMzJ4MzJfZGNfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBsZHJzaCAgICAgICByMSwgW3IwXQotICAgICAgICBsZHIgICAgICAgICByMiwgPTB4MjAKLSAgICAgICAgYWRkICAgICAgICAgcjEsICMxCi0gICAgICAgIGFzciAgICAgICAgIHIxLCAjMQotICAgICAgICBhZGQgICAgICAgICByMSwgcjIKLSAgICAgICAgYXNyICAgICAgICAgcjEsICM2Ci0gICAgICAgIG1vdiAgICAgICAgIHIzLCAjMTYKLSAgICAgICAgdmR1cC4xNiAgICAgcTgsIHIxCi0gICAgICAgIHZkdXAuMTYgICAgIHE5LCByMQotICAgICAgICB2bW92LjE2ICAgICBxMTAsIHE4Ci0gICAgICAgIHZtb3YuMTYgICAgIHExMSwgcTgKLSAgICAgICAgdm1vdi4xNiAgICAgcTEyLCBxOAotICAgICAgICB2bW92LjE2ICAgICBxMTMsIHE4Ci0gICAgICAgIHZtb3YuMTYgICAgIHExNCwgcTgKLSAgICAgICAgdm1vdi4xNiAgICAgcTE1LCBxOAotMTogICAgICBzdWJzICAgICAgICByMywgIzEKLSAgICAgICAgdnN0bSAgICAgICAgcjAhLCB7cTgtcTE1fQotICAgICAgICBibmUgICAgICAgICAxYgotICAgICAgICBieCBscgotZW5kZnVuYwotCi1mdW5jdGlvbiBmZl9oZXZjX3RyYW5zZm9ybV9hZGRfNHg0X25lb25fOCwgZXhwb3J0PTEKLSAgICAgICAgdmxkbSAgICAgICAgcjEsIHtxMC1xMX0KLSAgICAgICAgdmxkMS4zMiAgICAgZDRbMF0sIFtyMF0sIHIyCi0gICAgICAgIHZsZDEuMzIgICAgIGQ0WzFdLCBbcjBdLCByMgotICAgICAgICB2bGQxLjMyICAgICBkNVswXSwgW3IwXSwgcjIKLSAgICAgICAgdmxkMS4zMiAgICAgZDVbMV0sIFtyMF0sIHIyCi0gICAgICAgIHN1YiAgICAgICAgIHIwLCByMCwgcjIsIGxzbCAjMgotICAgICAgICB2bW92bC51OCAgICBxOCwgZDQKLSAgICAgICAgdm1vdmwudTggICAgcTksIGQ1Ci0gICAgICAgIHZxYWRkLnMxNiAgIHEwLCBxMCwgcTgKLSAgICAgICAgdnFhZGQuczE2ICAgcTEsIHExLCBxOQotICAgICAgICB2cW1vdnVuLnMxNiBkMCwgcTAKLSAgICAgICAgdnFtb3Z1bi5zMTYgZDEsIHExCi0gICAgICAgIHZzdDEuMzIgICAgIGQwWzBdLCBbcjBdLCByMgotICAgICAgICB2c3QxLjMyICAgICBkMFsxXSwgW3IwXSwgcjIKLSAgICAgICAgdnN0MS4zMiAgICAgZDFbMF0sIFtyMF0sIHIyCi0gICAgICAgIHZzdDEuMzIgICAgIGQxWzFdLCBbcjBdLCByMgotICAgICAgICBieCAgICAgICAgICBscgotZW5kZnVuYwotCi1mdW5jdGlvbiBmZl9oZXZjX3RyYW5zZm9ybV9hZGRfOHg4X25lb25fOCwgZXhwb3J0PTEKLSAgICAgICAgbW92ICAgICAgICAgcjMsICAgIzgKLTE6ICAgICAgc3VicyAgICAgICAgcjMsICAgIzEKLSAgICAgICAgdmxkMS4xNiAgICAge3EwfSwgW3IxXSEKLSAgICAgICAgdmxkMS44ICAgICAgZDE2LCAgW3IwXQotICAgICAgICB2bW92bC51OCAgICBxOCwgICBkMTYKLSAgICAgICAgdnFhZGQuczE2ICAgcTAsICAgcTgKLSAgICAgICAgdnFtb3Z1bi5zMTYgZDAsICAgcTAKLSAgICAgICAgdnN0MS4zMiAgICAgZDAsICAgW3IwXSwgcjIKLSAgICAgICAgYm5lICAgICAgICAgMWIKLSAgICAgICAgYnggICAgICAgICAgbHIKLWVuZGZ1bmMKLQotZnVuY3Rpb24gZmZfaGV2Y190cmFuc2Zvcm1fYWRkXzE2eDE2X25lb25fOCwgZXhwb3J0PTEKLSAgICAgICAgbW92ICAgICAgICAgcjMsICAgIzE2Ci0xOiAgICAgIHN1YnMgICAgICAgIHIzLCAgICMxCi0gICAgICAgIHZsZDEuMTYgICAgIHtxMCwgcTF9LCBbcjFdIQotICAgICAgICB2bGQxLjggICAgICB7cTh9LCAgW3IwXQotICAgICAgICB2bW92bC51OCAgICBxOSwgIGQxNgotICAgICAgICB2bW92bC51OCAgICBxMTAsIGQxNwotICAgICAgICB2cWFkZC5zMTYgICBxMCwgIHE5Ci0gICAgICAgIHZxYWRkLnMxNiAgIHExLCAgcTEwCi0gICAgICAgIHZxbW92dW4uczE2IGQwLCAgcTAKLSAgICAgICAgdnFtb3Z1bi5zMTYgZDEsICBxMQotICAgICAgICB2c3QxLjggICAgICB7cTB9LCAgIFtyMF0sIHIyCi0gICAgICAgIGJuZSAgICAgICAgIDFiCi0gICAgICAgIGJ4ICAgICAgICAgIGxyCi1lbmRmdW5jCi0KLWZ1bmN0aW9uIGZmX2hldmNfdHJhbnNmb3JtX2FkZF8zMngzMl9uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIG1vdiAgICAgICAgIHIzLCAgICMzMgotMTogICAgICBzdWJzICAgICAgICByMywgICAjMQotICAgICAgICB2bGRtICAgICAgICByMSEsIHtxMC1xM30KLSAgICAgICAgdmxkMS44ICAgICAge3E4LCBxOX0sICBbcjBdCi0gICAgICAgIHZtb3ZsLnU4ICAgIHExMCwgZDE2Ci0gICAgICAgIHZtb3ZsLnU4ICAgIHExMSwgZDE3Ci0gICAgICAgIHZtb3ZsLnU4ICAgIHExMiwgZDE4Ci0gICAgICAgIHZtb3ZsLnU4ICAgIHExMywgZDE5Ci0gICAgICAgIHZxYWRkLnMxNiAgIHEwLCAgcTEwCi0gICAgICAgIHZxYWRkLnMxNiAgIHExLCAgcTExCi0gICAgICAgIHZxYWRkLnMxNiAgIHEyLCAgcTEyCi0gICAgICAgIHZxYWRkLnMxNiAgIHEzLCAgcTEzCi0gICAgICAgIHZxbW92dW4uczE2IGQwLCAgcTAKLSAgICAgICAgdnFtb3Z1bi5zMTYgZDEsICBxMQotICAgICAgICB2cW1vdnVuLnMxNiBkMiwgIHEyCi0gICAgICAgIHZxbW92dW4uczE2IGQzLCAgcTMKLSAgICAgICAgdnN0MS44ICAgICB7cTAsIHExfSwgICBbcjBdLCByMgotICAgICAgICBibmUgICAgICAgICAxYgotICAgICAgICBieCAgICAgICAgICBscgotZW5kZnVuYwotCi0ubWFjcm8gIHRyYW5zcG9zZV8xNmJfOHg4ICAgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3Ci0gICAgICAgIHZ0cm4uNjQgICAgICAgICBccjAsIFxyNAotICAgICAgICB2dHJuLjY0ICAgICAgICAgXHIxLCBccjUKLSAgICAgICAgdnRybi42NCAgICAgICAgIFxyMiwgXHI2Ci0gICAgICAgIHZ0cm4uNjQgICAgICAgICBccjMsIFxyNwotICAgICAgICB2dHJuLjMyICAgICAgICAgXHIwLCBccjIKLSAgICAgICAgdnRybi4zMiAgICAgICAgIFxyMSwgXHIzCi0gICAgICAgIHZ0cm4uMzIgICAgICAgICBccjQsIFxyNgotICAgICAgICB2dHJuLjMyICAgICAgICAgXHI1LCBccjcKLSAgICAgICAgdnRybi4xNiAgICAgICAgIFxyMCwgXHIxCi0gICAgICAgIHZ0cm4uMTYgICAgICAgICBccjIsIFxyMwotICAgICAgICB2dHJuLjE2ICAgICAgICAgXHI0LCBccjUKLSAgICAgICAgdnRybi4xNiAgICAgICAgIFxyNiwgXHI3CisubWFjcm8gY2xpcDEwIGluMSwgaW4yLCBjMSwgYzIKKyAgICAgICAgdm1heC5zMTYgICAgICAgIFxpbjEsIFxpbjEsIFxjMQorICAgICAgICB2bWF4LnMxNiAgICAgICAgXGluMiwgXGluMiwgXGMxCisgICAgICAgIHZtaW4uczE2ICAgICAgICBcaW4xLCBcaW4xLCBcYzIKKyAgICAgICAgdm1pbi5zMTYgICAgICAgIFxpbjIsIFxpbjIsIFxjMgogLmVuZG0KIAotLy8gaW4gNCBxIHJlZ3MKLS8vIG91dHB1dCA4IGQgcmVncwotLm1hY3JvIHRyYW5zcG9zZV8xNmJfNHg0ICAgIHIwLCByMSwgcjIsIHIzCi0gICAgICAgIHZ0cm4uMzIgICAgICAgICBccjAsIFxyMgotICAgICAgICB2dHJuLjMyICAgICAgICAgXHIxLCBccjMKLSAgICAgICAgdnRybi4xNiAgICAgICAgIFxyMCwgXHIxCi0gICAgICAgIHZ0cm4uMTYgICAgICAgICBccjIsIFxyMworZnVuY3Rpb24gZmZfaGV2Y19hZGRfcmVzaWR1YWxfNHg0XzhfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMC1xMX0sIFtyMSwgOjEyOF0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIGQ0WzBdLCBbcjAsIDozMl0sIHIyCisgICAgICAgIHZsZDEuMzIgICAgICAgICBkNFsxXSwgW3IwLCA6MzJdLCByMgorICAgICAgICB2bGQxLjMyICAgICAgICAgZDVbMF0sIFtyMCwgOjMyXSwgcjIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIGQ1WzFdLCBbcjAsIDozMl0sIHIyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgcjAsIHIyLCBsc2wgIzIKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE4LCBkNAorICAgICAgICB2bW92bC51OCAgICAgICAgcTksIGQ1CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMCwgcTAsIHE4CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMSwgcTEsIHE5CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMCwgcTAKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxLCBxMQorICAgICAgICB2c3QxLjMyICAgICAgICAgZDBbMF0sIFtyMCwgOjMyXSwgcjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIGQwWzFdLCBbcjAsIDozMl0sIHIyCisgICAgICAgIHZzdDEuMzIgICAgICAgICBkMVswXSwgW3IwLCA6MzJdLCByMgorICAgICAgICB2c3QxLjMyICAgICAgICAgZDFbMV0sIFtyMCwgOjMyXSwgcjIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzR4NF8xMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCByMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwLXExfSwgW3IxLCA6MTI4XQorICAgICAgICB2bGQxLjE2ICAgICAgICAgZDQsIFtyMTIsIDo2NF0sIHIyCisgICAgICAgIHZsZDEuMTYgICAgICAgICBkNSwgW3IxMiwgOjY0XSwgcjIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIGQ2LCBbcjEyLCA6NjRdLCByMgorICAgICAgICB2cWFkZC5zMTYgICAgICAgcTAsIHEyCisgICAgICAgIHZsZDEuMTYgICAgICAgICBkNywgW3IxMiwgOjY0XSwgcjIKKyAgICAgICAgdm1vdi5zMTYgICAgICAgIHExMiwgIzAKKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHExLCBxMworICAgICAgICB2bXZuLnMxNiAgICAgICAgcTEzLCAjMHhGQzAwIEAgdm1vdi5zMTYgIzB4M0ZGCisgICAgICAgIGNsaXAxMCAgICAgICAgICBxMCwgcTEsIHExMiwgcTEzCisgICAgICAgIHZzdDEuMTYgICAgICAgICBkMCwgW3IwLCA6NjRdLCByMgorICAgICAgICB2c3QxLjE2ICAgICAgICAgZDEsIFtyMCwgOjY0XSwgcjIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIGQyLCBbcjAsIDo2NF0sIHIyCisgICAgICAgIHZzdDEuMTYgICAgICAgICBkMywgW3IwLCA6NjRdLCByMgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfaGV2Y19hZGRfcmVzaWR1YWxfOHg4XzhfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjAsIHIyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCByMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAgIzgKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgICBbcjAsICA6NjRdCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE3fSwgICBbcjEyLCA6NjRdCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxOSwgICBkMTYKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMC1xMX0sIFtyMSwgIDoxMjhdIQorICAgICAgICB2bW92bC51OCAgICAgICAgcTgsICAgZDE3CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMCwgICBxOQorICAgICAgICB2cWFkZC5zMTYgICAgICAgcTEsICAgcTgKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQwLCAgIHEwCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMSwgICBxMQorICAgICAgICB2c3QxLjggICAgICAgICAgZDAsICAgW3IwLCAgOjY0XSwgcjIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIGQxLCAgIFtyMTIsIDo2NF0sIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfaGV2Y19hZGRfcmVzaWR1YWxfOHg4XzEwX25lb24sIGV4cG9ydD0xCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIwLCByMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgcjIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzgKKyAgICAgICAgdm1vdi5zMTYgICAgICAgIHExMiwgIzAKKyAgICAgICAgdm12bi5zMTYgICAgICAgIHExMywgIzB4RkMwMCBAIHZtb3YuczE2ICMweDNGRgorMTogICAgICBzdWJzICAgICAgICAgICAgcjMsICAjMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwLXExfSwgW3IxLCA6MTI4XSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxOH0sICAgIFtyMCwgOjEyOF0KKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHEwLCBxOAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3E5fSwgICAgW3IxMiwgOjEyOF0KKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHExLCBxOQorICAgICAgICBjbGlwMTAgICAgICAgICAgcTAsIHExLCBxMTIsIHExMworICAgICAgICB2c3QxLjE2ICAgICAgICAge3EwfSwgW3IwLCA6MTI4XSwgcjIKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMX0sIFtyMTIsIDoxMjhdLCByMgorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzE2eDE2XzhfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzE2CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIwLCByMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgcjIKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgIzIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxOH0sICAgICBbcjAsIDoxMjhdCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAsIHExfSwgW3IxLCA6MTI4XSEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMTF9LCAgICBbcjEyLCA6MTI4XQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EyLCBxM30sIFtyMSwgOjEyOF0hCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxOSwgIGQxNgorICAgICAgICB2bW92bC51OCAgICAgICAgcTEwLCBkMTcKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMiwgZDIyCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTMsIGQyMworICAgICAgICB2cWFkZC5zMTYgICAgICAgcTAsICBxOQorICAgICAgICB2cWFkZC5zMTYgICAgICAgcTEsICBxMTAKKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHEyLCAgcTEyCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMywgIHExMworICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxMAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIsICBxMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDMsICBxMworICAgICAgICB2c3QxLjggICAgICAgICAge3EwfSwgICAgIFtyMCwgOjEyOF0sIHIyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTF9LCAgICAgW3IxMiwgOjEyOF0sIHIyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfaGV2Y19hZGRfcmVzaWR1YWxfMTZ4MTZfMTBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzE2CisgICAgICAgIHZtb3YuczE2ICAgICAgICBxMTIsICMwCisgICAgICAgIHZtdm4uczE2ICAgICAgICBxMTMsICMweEZDMDAgQCB2bW92LnMxNiAjMHgzRkYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjAsIHIyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCByMgorMTogICAgICBzdWJzICAgICAgICAgICAgcjMsICAjMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3E4LXE5fSwgICBbcjAsIDoxMjhdCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAsIHExfSwgIFtyMSwgOjEyOF0hCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMCwgcTgKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTAtcTExfSwgW3IxMiwgOjEyOF0KKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHExLCBxOQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EyLCBxM30sICBbcjEsIDoxMjhdIQorICAgICAgICB2cWFkZC5zMTYgICAgICAgcTIsIHExMAorICAgICAgICB2cWFkZC5zMTYgICAgICAgcTMsIHExMQorICAgICAgICBjbGlwMTAgICAgICAgICAgcTAsIHExLCBxMTIsIHExMworICAgICAgICBjbGlwMTAgICAgICAgICAgcTIsIHEzLCBxMTIsIHExMworICAgICAgICB2c3QxLjE2ICAgICAgICAge3EwLXExfSwgICBbcjAsIDoxMjhdLCByMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyLXEzfSwgICBbcjEyLCA6MTI4XSwgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oZXZjX2FkZF9yZXNpZHVhbF8zMngzMl84X25lb24sIGV4cG9ydD0xCisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIwLCByMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgcjIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgIzMyCisxOiAgICAgIHN1YnMgICAgICAgICAgICByMywgICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTEyLCBxMTN9LCBbcjAsICA6MTI4XQorICAgICAgICB2bW92bC51OCAgICAgICAgcTgsICBkMjQKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE5LCAgZDI1CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTE0LCBxMTV9LCBbcjEyLCA6MTI4XQorICAgICAgICB2bW92bC51OCAgICAgICAgcTEwLCBkMjYKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMSwgZDI3CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTIsIGQyOAorICAgICAgICB2bGRtICAgICAgICAgICAgcjEhLCB7cTAtcTd9CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTMsIGQyOQorICAgICAgICB2bW92bC51OCAgICAgICAgcTE0LCBkMzAKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExNSwgZDMxCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMCwgIHE4CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMSwgIHE5CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMiwgIHExMAorICAgICAgICB2cWFkZC5zMTYgICAgICAgcTMsICBxMTEKKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHE0LCAgcTEyCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxNSwgIHExMworICAgICAgICB2cWFkZC5zMTYgICAgICAgcTYsICBxMTQKKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHE3LCAgcTE1CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMCwgIHEwCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMSwgIHExCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMiwgIHEyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMywgIHEzCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNCwgIHE0CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNSwgIHE1CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTAsIHExfSwgW3IwLCA6MTI4XSwgcjIKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ2LCAgcTYKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ3LCAgcTcKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMiwgcTN9LCBbcjEyLCA6MTI4XSwgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9oZXZjX2FkZF9yZXNpZHVhbF8zMngzMl8xMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjMzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjAsICMzMgorICAgICAgICB2bW92LnMxNiAgICAgICAgcTEyLCAjMAorICAgICAgICB2bXZuLnMxNiAgICAgICAgcTEzLCAjMHhGQzAwIEAgdm1vdi5zMTYgIzB4M0ZGCisxOiAgICAgIHN1YnMgICAgICAgICAgICByMywgICMxCisgICAgICAgIHZsZG0gICAgICAgICAgICByMSEsIHtxMC1xM30KKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxOCwgcTl9LCAgIFtyMCwgOjEyOF0KKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTAsIHExMX0sIFtyMTIsIDoxMjhdCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBxMCwgcTgKKyAgICAgICAgdnFhZGQuczE2ICAgICAgIHExLCBxOQorICAgICAgICB2cWFkZC5zMTYgICAgICAgcTIsIHExMAorICAgICAgICB2cWFkZC5zMTYgICAgICAgcTMsIHExMQorICAgICAgICBjbGlwMTAgICAgICAgICAgcTAsIHExLCBxMTIsIHExMworICAgICAgICBjbGlwMTAgICAgICAgICAgcTIsIHEzLCBxMTIsIHExMworICAgICAgICB2c3QxLjE2ICAgICAgICAge3EwLXExfSwgICBbcjAsIDoxMjhdLCByMgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyLXEzfSwgICBbcjEyLCA6MTI4XSwgcjIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCisubWFjcm8gaWRjdF80eDRfZGMgYml0ZGVwdGgKK2Z1bmN0aW9uIGZmX2hldmNfaWRjdF80eDRfZGNfXGJpdGRlcHRoXCgpX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkcnNoICAgICAgICAgICByMSwgW3IwXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjIsID0oMSA8PCAoMTMgLSBcYml0ZGVwdGgpKQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICMxCisgICAgICAgIGFzciAgICAgICAgICAgICByMSwgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCByMgorICAgICAgICBhc3IgICAgICAgICAgICAgcjEsICMoMTQgLSBcYml0ZGVwdGgpCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxMCwgcjEKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHExLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EwLCBxMX0sIFtyMCwgOjEyOF0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCiAuZW5kbQogCisubWFjcm8gaWRjdF84eDhfZGMgYml0ZGVwdGgKK2Z1bmN0aW9uIGZmX2hldmNfaWRjdF84eDhfZGNfXGJpdGRlcHRoXCgpX25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkcnNoICAgICAgICAgICByMSwgW3IwXQorICAgICAgICBsZHIgICAgICAgICAgICAgcjIsID0oMSA8PCAoMTMgLSBcYml0ZGVwdGgpKQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICMxCisgICAgICAgIGFzciAgICAgICAgICAgICByMSwgIzEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCByMgorICAgICAgICBhc3IgICAgICAgICAgICAgcjEsICMoMTQgLSBcYml0ZGVwdGgpCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxOCwgcjEKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHE5LCByMQorICAgICAgICB2bW92LjE2ICAgICAgICAgcTEwLCBxOAorICAgICAgICB2bW92LjE2ICAgICAgICAgcTExLCBxOAorICAgICAgICB2bW92LjE2ICAgICAgICAgcTEyLCBxOAorICAgICAgICB2bW92LjE2ICAgICAgICAgcTEzLCBxOAorICAgICAgICB2bW92LjE2ICAgICAgICAgcTE0LCBxOAorICAgICAgICB2bW92LjE2ICAgICAgICAgcTE1LCBxOAorICAgICAgICB2c3RtICAgICAgICAgICAgcjAsIHtxOC1xMTV9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGlkY3RfMTZ4MTZfZGMgYml0ZGVwdGgKK2Z1bmN0aW9uIGZmX2hldmNfaWRjdF8xNngxNl9kY19cYml0ZGVwdGhcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyc2ggICAgICAgICAgIHIxLCBbcjBdCisgICAgICAgIGxkciAgICAgICAgICAgICByMiwgPSgxIDw8ICgxMyAtIFxiaXRkZXB0aCkpCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIzEKKyAgICAgICAgYXNyICAgICAgICAgICAgIHIxLCAjMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsIHIyCisgICAgICAgIGFzciAgICAgICAgICAgICByMSwgIygxNCAtIFxiaXRkZXB0aCkKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHE4LCByMQorICAgICAgICB2ZHVwLjE2ICAgICAgICAgcTksIHIxCisgICAgICAgIHZtb3YuMTYgICAgICAgICBxMTAsIHE4CisgICAgICAgIHZtb3YuMTYgICAgICAgICBxMTEsIHE4CisgICAgICAgIHZtb3YuMTYgICAgICAgICBxMTIsIHE4CisgICAgICAgIHZtb3YuMTYgICAgICAgICBxMTMsIHE4CisgICAgICAgIHZtb3YuMTYgICAgICAgICBxMTQsIHE4CisgICAgICAgIHZtb3YuMTYgICAgICAgICBxMTUsIHE4CisgICAgICAgIHZzdG0gICAgICAgICAgICByMCEsIHtxOC1xMTV9CisgICAgICAgIHZzdG0gICAgICAgICAgICByMCEsIHtxOC1xMTV9CisgICAgICAgIHZzdG0gICAgICAgICAgICByMCEsIHtxOC1xMTV9CisgICAgICAgIHZzdG0gICAgICAgICAgICByMCwge3E4LXExNX0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gaWRjdF8zMngzMl9kYyBiaXRkZXB0aAorZnVuY3Rpb24gZmZfaGV2Y19pZGN0XzMyeDMyX2RjX1xiaXRkZXB0aFwoKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHJzaCAgICAgICAgICAgcjEsIFtyMF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIyLCA9KDEgPDwgKDEzIC0gXGJpdGRlcHRoKSkKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAjMQorICAgICAgICBhc3IgICAgICAgICAgICAgcjEsICMxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgcjIKKyAgICAgICAgYXNyICAgICAgICAgICAgIHIxLCAjKDE0IC0gXGJpdGRlcHRoKQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICMxNgorICAgICAgICB2ZHVwLjE2ICAgICAgICAgcTgsIHIxCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxOSwgcjEKKyAgICAgICAgdm1vdi4xNiAgICAgICAgIHExMCwgcTgKKyAgICAgICAgdm1vdi4xNiAgICAgICAgIHExMSwgcTgKKyAgICAgICAgdm1vdi4xNiAgICAgICAgIHExMiwgcTgKKyAgICAgICAgdm1vdi4xNiAgICAgICAgIHExMywgcTgKKyAgICAgICAgdm1vdi4xNiAgICAgICAgIHExNCwgcTgKKyAgICAgICAgdm1vdi4xNiAgICAgICAgIHExNSwgcTgKKzE6ICAgICAgc3VicyAgICAgICAgICAgIHIzLCAjMQorICAgICAgICB2c3RtICAgICAgICAgICAgcjAhLCB7cTgtcTE1fQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gc3VtX3N1YiBvdXQsIGluLCBjLCBvcAorICAuaWZjIFxvcCwgKworICAgICAgICB2bWxhbC5zMTYgICAgICAgXG91dCwgXGluLCBcYworICAuZWxzZQorICAgICAgICB2bWxzbC5zMTYgICAgICAgXG91dCwgXGluLCBcYworICAuZW5kaWYKKy5lbmRtCisKKy5tYWNybyB0cl80eDQgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBzaGlmdCwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgICAgICAgdnNobGwuczE2ICAgICAgXHRtcDAsIFxpbjAsICM2CisgICAgICAgICB2bXVsbC5zMTYgICAgICBcdG1wMiwgXGluMSwgZDRbMV0KKyAgICAgICAgIHZtb3YgICAgICAgICAgIFx0bXAxLCBcdG1wMAorICAgICAgICAgdm11bGwuczE2ICAgICAgXHRtcDMsIFxpbjEsIGQ0WzNdCisgICAgICAgICB2bWxhbC5zMTYgICAgICBcdG1wMCwgXGluMiwgZDRbMF0gQGUwCisgICAgICAgICB2bWxzbC5zMTYgICAgICBcdG1wMSwgXGluMiwgZDRbMF0gQGUxCisgICAgICAgICB2bWxhbC5zMTYgICAgICBcdG1wMiwgXGluMywgZDRbM10gQG8wCisgICAgICAgICB2bWxzbC5zMTYgICAgICBcdG1wMywgXGluMywgZDRbMV0gQG8xCisKKyAgICAgICAgIHZhZGQuczMyICAgICAgIFx0bXA0LCBcdG1wMCwgXHRtcDIKKyAgICAgICAgIHZzdWIuczMyICAgICAgIFx0bXAwLCBcdG1wMCwgXHRtcDIKKyAgICAgICAgIHZhZGQuczMyICAgICAgIFx0bXAyLCBcdG1wMSwgXHRtcDMKKyAgICAgICAgIHZzdWIuczMyICAgICAgIFx0bXAxLCBcdG1wMSwgXHRtcDMKKyAgICAgICAgIHZxcnNocm4uczMyICAgIFxvdXQwLCBcdG1wNCwgI1xzaGlmdAorICAgICAgICAgdnFyc2hybi5zMzIgICAgXG91dDMsIFx0bXAwLCAjXHNoaWZ0CisgICAgICAgICB2cXJzaHJuLnMzMiAgICBcb3V0MSwgXHRtcDIsICNcc2hpZnQKKyAgICAgICAgIHZxcnNocm4uczMyICAgIFxvdXQyLCBcdG1wMSwgI1xzaGlmdAorLmVuZG0KKworLm1hY3JvIHRyXzR4NF84IGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMworICAgICAgICAgdnNobGwuczE2ICAgICAgXHRtcDAsIFxpbjAsICM2CisgICAgICAgICB2bGQxLnMxNiAgICAgICB7XGluMH0sIFtyMSwgOjY0XSEKKyAgICAgICAgIHZtb3YgICAgICAgICAgIFx0bXAxLCBcdG1wMAorICAgICAgICAgdm11bGwuczE2ICAgICAgXHRtcDIsIFxpbjEsIFxpbjBbMV0KKyAgICAgICAgIHZtdWxsLnMxNiAgICAgIFx0bXAzLCBcaW4xLCBcaW4wWzNdCisgICAgICAgICB2bWxhbC5zMTYgICAgICBcdG1wMCwgXGluMiwgXGluMFswXSBAZTAKKyAgICAgICAgIHZtbHNsLnMxNiAgICAgIFx0bXAxLCBcaW4yLCBcaW4wWzBdIEBlMQorICAgICAgICAgdm1sYWwuczE2ICAgICAgXHRtcDIsIFxpbjMsIFxpbjBbM10gQG8wCisgICAgICAgICB2bWxzbC5zMTYgICAgICBcdG1wMywgXGluMywgXGluMFsxXSBAbzEKKworICAgICAgICAgdmxkMS5zMTYgICAgICAge1xpbjB9LCBbcjEsIDo2NF0KKworICAgICAgICAgdmFkZC5zMzIgICAgICAgXG91dDAsIFx0bXAwLCBcdG1wMgorICAgICAgICAgdmFkZC5zMzIgICAgICAgXG91dDEsIFx0bXAxLCBcdG1wMworICAgICAgICAgdnN1Yi5zMzIgICAgICAgXG91dDIsIFx0bXAxLCBcdG1wMworICAgICAgICAgdnN1Yi5zMzIgICAgICAgXG91dDMsIFx0bXAwLCBcdG1wMgorCisgICAgICAgICBzdWIgICAgICAgICAgICByMSwgIHIxLCAgIzgKKy5lbmRtCisKK0AgRG8gYSA0eDQgdHJhbnNwb3NlLCB1c2luZyBxIHJlZ2lzdGVycyBmb3IgdGhlIHN1YnRyYW5zcG9zZXMgdGhhdCBkb24ndAorQCBuZWVkIHRvIGFkZHJlc3MgdGhlIGluZGl2aXVkYWwgZCByZWdpc3RlcnMuCitAIHIwLHIxID09IHJxMCwgcjIscjMgPT0gcnExCisubWFjcm8gdHJhbnNwb3NlXzR4NCBycTAsIHJxMSwgcjAsIHIxLCByMiwgcjMKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxycTAsIFxycTEKKyAgICAgICAgdnRybi4xNiAgICAgICAgIFxyMCwgIFxyMQorICAgICAgICB2dHJuLjE2ICAgICAgICAgXHIyLCAgXHIzCisuZW5kbQorCisubWFjcm8gaWRjdF80eDQgYml0ZGVwdGgKK2Z1bmN0aW9uIGZmX2hldmNfaWRjdF80eDRfXGJpdGRlcHRoXCgpX25lb24sIGV4cG9ydD0xCitAcjAgLSBjb2VmZnMKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtxMC1xMX0sIFtyMCwgOjEyOF0KKworICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEsIHRyYW5zCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7ZDR9LCBbcjEsIDo2NF0KKworICAgICAgICB0cl80eDQgICAgICAgICAgZDAsIGQxLCBkMiwgZDMsIGQxNiwgZDE3LCBkMTgsIGQxOSwgNywgcTEwLCBxMTEsIHExMiwgcTEzLCBxMAorICAgICAgICB0cmFuc3Bvc2VfNHg0ICAgcTgsIHE5LCBkMTYsIGQxNywgZDE4LCBkMTkKKworICAgICAgICB0cl80eDQgICAgICAgICAgZDE2LCBkMTcsIGQxOCwgZDE5LCBkMCwgZDEsIGQyLCBkMywgMjAgLSBcYml0ZGVwdGgsIHExMCwgcTExLCBxMTIsIHExMywgcTAKKyAgICAgICAgdHJhbnNwb3NlXzR4NCAgIHEwLCBxMSwgZDAsIGQxLCBkMiwgZDMKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIHtkMC1kM30sIFtyMCwgOjEyOF0KKyAgICAgICAgYnggbHIKK2VuZGZ1bmMKKy5lbmRtCisKKy5tYWNybyB0cmFuc3Bvc2U4XzR4NCByMCwgcjEsIHIyLCByMworICAgICAgICB2dHJuLjE2ICAgICAgICAgXHIwLCAgXHIxCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccjIsICBccjMKKyAgICAgICAgdnRybi4zMiAgICAgICAgIFxyMCwgIFxyMgorICAgICAgICB2dHJuLjMyICAgICAgICAgXHIxLCAgXHIzCisuZW5kbQorCisubWFjcm8gdHJhbnNwb3NlXzh4OCByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIGwwLCBsMSwgbDIsIGwzLCBsNCwgbDUsIGw2LCBsNworICAgICAgICB0cmFuc3Bvc2U4XzR4NCAgXHIwLCBccjEsIFxyMiwgXHIzCisgICAgICAgIHRyYW5zcG9zZThfNHg0ICBccjQsIFxyNSwgXHI2LCBccjcKKworICAgICAgICB0cmFuc3Bvc2U4XzR4NCAgXGwwLCBcbDEsIFxsMiwgXGwzCisgICAgICAgIHRyYW5zcG9zZThfNHg0ICBcbDQsIFxsNSwgXGw2LCBcbDcKKy5lbmRtCisKKy5tYWNybyB0cl84eDQgc2hpZnQsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43CisgICAgICAgIHRyXzR4NF84ICAgICAgICBcaW4wLCBcaW4yLCBcaW40LCBcaW42LCBxOCwgcTksIHExMCwgcTExLCBxMTIsIHExMywgcTE0LCBxMTUKKworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTE0LCBcaW4xLCBcaW4wWzJdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTIsIFxpbjEsIFxpbjBbMF0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMywgXGluMSwgXGluMFsxXQorICAgICAgICBzdW1fc3ViICAgICAgICAgcTE0LCBcaW4zLCBcaW4wWzBdLCAtCisgICAgICAgIHN1bV9zdWIgICAgICAgICBxMTIsIFxpbjMsIFxpbjBbMV0sICsKKyAgICAgICAgc3VtX3N1YiAgICAgICAgIHExMywgXGluMywgXGluMFszXSwgLQorCisgICAgICAgIHN1bV9zdWIgICAgICAgICBxMTQsIFxpbjUsIFxpbjBbM10sICsKKyAgICAgICAgc3VtX3N1YiAgICAgICAgIHExMiwgXGluNSwgXGluMFsyXSwgKworICAgICAgICBzdW1fc3ViICAgICAgICAgcTEzLCBcaW41LCBcaW4wWzBdLCAtCisKKyAgICAgICAgc3VtX3N1YiAgICAgICAgIHExNCwgXGluNywgXGluMFsxXSwgKworICAgICAgICBzdW1fc3ViICAgICAgICAgcTEyLCBcaW43LCBcaW4wWzNdLCArCisgICAgICAgIHN1bV9zdWIgICAgICAgICBxMTMsIFxpbjcsIFxpbjBbMl0sIC0KKworICAgICAgICB2YWRkLnMzMiAgICAgICAgcTE1LCBxMTAsIHExNAorICAgICAgICB2c3ViLnMzMiAgICAgICAgcTEwLCBxMTAsIHExNAorICAgICAgICB2cXJzaHJuLnMzMiAgICAgXGluMiwgcTE1LCBcc2hpZnQKKworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTE1LCBcaW4xLCBcaW4wWzNdCisgICAgICAgIHN1bV9zdWIgICAgICAgICBxMTUsIFxpbjMsIFxpbjBbMl0sIC0KKyAgICAgICAgc3VtX3N1YiAgICAgICAgIHExNSwgXGluNSwgXGluMFsxXSwgKworICAgICAgICBzdW1fc3ViICAgICAgICAgcTE1LCBcaW43LCBcaW4wWzBdLCAtCisKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIFxpbjUsIHExMCwgIFxzaGlmdAorCisgICAgICAgIHZhZGQuczMyICAgICAgICBxMTAsIHE4LCBxMTIKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIHE4LCAgcTgsIHExMgorICAgICAgICB2YWRkLnMzMiAgICAgICAgcTEyLCBxOSwgcTEzCisgICAgICAgIHZzdWIuczMyICAgICAgICBxOSwgIHE5LCBxMTMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHExNCwgcTExLCBxMTUKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIHExMSwgcTExLCBxMTUKKworICAgICAgICB2cXJzaHJuLnMzMiAgICAgXGluMCwgcTEwLCBcc2hpZnQKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIFxpbjcsIHE4LCAgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcaW4xLCBxMTIsIFxzaGlmdAorICAgICAgICB2cXJzaHJuLnMzMiAgICAgXGluNiwgcTksICBcc2hpZnQKKyAgICAgICAgdnFyc2hybi5zMzIgICAgIFxpbjMsIHExNCwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcaW40LCBxMTEsIFxzaGlmdAorLmVuZG0KKworLm1hY3JvIGlkY3RfOHg4IGJpdGRlcHRoCitmdW5jdGlvbiBmZl9oZXZjX2lkY3RfOHg4X1xiaXRkZXB0aFwoKV9uZW9uLCBleHBvcnQ9MQorQHIwIC0gY29lZmZzCisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjAKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAgIzY0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIwLCAgIzMyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTAtcTF9LCBbcjEsOjEyOF0sIHIyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTItcTN9LCBbcjMsOjEyOF0sIHIyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTQtcTV9LCBbcjEsOjEyOF0sIHIyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTYtcTd9LCBbcjMsOjEyOF0sIHIyCisKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxLCB0cmFucworCisgICAgICAgIHRyXzh4NCAgICAgICAgICA3LCBkMCwgZDIsIGQ0LCBkNiwgZDgsIGQxMCwgZDEyLCBkMTQKKyAgICAgICAgdHJfOHg0ICAgICAgICAgIDcsIGQxLCBkMywgZDUsIGQ3LCBkOSwgZDExLCBkMTMsIGQxNQorCisgICAgICAgIEAgVHJhbnNwb3NlIGVhY2ggNHg0IGJsb2NrLCBhbmQgc3dhcCBob3cgZDQtZDcgYW5kIGQ4LWQxMSBhcmUgdXNlZC4KKyAgICAgICAgQCBMYXlvdXQgYmVmb3JlOgorICAgICAgICBAIGQwICBkMQorICAgICAgICBAIGQyICBkMworICAgICAgICBAIGQ0ICBkNQorICAgICAgICBAIGQ2ICBkNworICAgICAgICBAIGQ4ICBkOQorICAgICAgICBAIGQxMCBkMTEKKyAgICAgICAgQCBkMTIgZDEzCisgICAgICAgIEAgZDE0IGQxNQorICAgICAgICB0cmFuc3Bvc2VfOHg4ICAgZDAsIGQyLCBkNCwgZDYsIGQ4LCBkMTAsIGQxMiwgZDE0LCBkMSwgZDMsIGQ1LCBkNywgZDksIGQxMSwgZDEzLCBkMTUKKyAgICAgICAgQCBOb3cgdGhlIGxheW91dCBpczoKKyAgICAgICAgQCBkMCAgZDgKKyAgICAgICAgQCBkMiAgZDEwCisgICAgICAgIEAgZDQgIGQxMgorICAgICAgICBAIGQ2ICBkMTQKKyAgICAgICAgQCBkMSAgZDkKKyAgICAgICAgQCBkMyAgZDExCisgICAgICAgIEAgZDUgIGQxMworICAgICAgICBAIGQ3ICBkMTUKKworICAgICAgICB0cl84eDQgICAgICAgICAgMjAgLSBcYml0ZGVwdGgsIGQwLCBkMiwgZDQsIGQ2LCBkMSwgZDMsIGQ1LCBkNworICAgICAgICB2c3dwICAgICAgICAgICAgZDAsIGQ4CisgICAgICAgIHRyXzh4NCAgICAgICAgICAyMCAtIFxiaXRkZXB0aCwgZDAsIGQxMCwgZDEyLCBkMTQsIGQ5LCBkMTEsIGQxMywgZDE1CisgICAgICAgIHZzd3AgICAgICAgICAgICBkMCwgZDgKKworICAgICAgICB0cmFuc3Bvc2VfOHg4ICAgZDAsIGQyLCBkNCwgZDYsIGQ4LCBkMTAsIGQxMiwgZDE0LCBkMSwgZDMsIGQ1LCBkNywgZDksIGQxMSwgZDEzLCBkMTUKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICAjNjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjAsICAjMzIKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIHtxMC1xMX0sIFtyMSw6MTI4XSwgcjIKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIHtxMi1xM30sIFtyMyw6MTI4XSwgcjIKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIHtxNC1xNX0sIFtyMSw6MTI4XSwgcjIKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIHtxNi1xN30sIFtyMyw6MTI4XSwgcjIKKworICAgICAgICB2cG9wICAgICAgICAgICAge3E0LXE3fQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5lbmRtCisKKy5tYWNybyBidXR0ZXJmbHkgZSwgbywgdG1wX3AsIHRtcF9tCisgICAgICAgIHZhZGQuczMyICAgICAgICBcdG1wX3AsIFxlLCBcbworICAgICAgICB2c3ViLnMzMiAgICAgICAgXHRtcF9tLCBcZSwgXG8KKy5lbmRtCisKKy5tYWNybyB0cjE2Xzh4NCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgb2Zmc2V0CisgICAgICAgIHRyXzR4NF84ICAgICAgICBcaW4wLCBcaW4yLCBcaW40LCBcaW42LCBxOCwgcTksIHExMCwgcTExLCBxMTIsIHExMywgcTE0LCBxMTUKKworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEyLCBcaW4xLCBcaW4wWzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTMsIFxpbjEsIFxpbjBbMV0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExNCwgXGluMSwgXGluMFsyXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTE1LCBcaW4xLCBcaW4wWzNdCisgICAgICAgIHN1bV9zdWIgICAgICAgICBxMTIsIFxpbjMsIFxpbjBbMV0sICsKKyAgICAgICAgc3VtX3N1YiAgICAgICAgIHExMywgXGluMywgXGluMFszXSwgLQorICAgICAgICBzdW1fc3ViICAgICAgICAgcTE0LCBcaW4zLCBcaW4wWzBdLCAtCisgICAgICAgIHN1bV9zdWIgICAgICAgICBxMTUsIFxpbjMsIFxpbjBbMl0sIC0KKworICAgICAgICBzdW1fc3ViICAgICAgICAgcTEyLCBcaW41LCBcaW4wWzJdLCArCisgICAgICAgIHN1bV9zdWIgICAgICAgICBxMTMsIFxpbjUsIFxpbjBbMF0sIC0KKyAgICAgICAgc3VtX3N1YiAgICAgICAgIHExNCwgXGluNSwgXGluMFszXSwgKworICAgICAgICBzdW1fc3ViICAgICAgICAgcTE1LCBcaW41LCBcaW4wWzFdLCArCisKKyAgICAgICAgc3VtX3N1YiAgICAgICAgIHExMiwgXGluNywgXGluMFszXSwgKworICAgICAgICBzdW1fc3ViICAgICAgICAgcTEzLCBcaW43LCBcaW4wWzJdLCAtCisgICAgICAgIHN1bV9zdWIgICAgICAgICBxMTQsIFxpbjcsIFxpbjBbMV0sICsKKyAgICAgICAgc3VtX3N1YiAgICAgICAgIHExNSwgXGluNywgXGluMFswXSwgLQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxOCwgIHExMiwgcTAsIHE3CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxOSwgIHExMywgcTEsIHE2CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxMTAsIHExNCwgcTIsIHE1CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxMTEsIHExNSwgcTMsIHE0CisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgIHNwLCAgI1xvZmZzZXQKKyAgICAgICAgdnN0MS5zMzIgICAgICAgIHtxMC1xMX0sIFtyNCwgOjEyOF0hCisgICAgICAgIHZzdDEuczMyICAgICAgICB7cTItcTN9LCBbcjQsIDoxMjhdIQorICAgICAgICB2c3QxLnMzMiAgICAgICAge3E0LXE1fSwgW3I0LCA6MTI4XSEKKyAgICAgICAgdnN0MS5zMzIgICAgICAgIHtxNi1xN30sIFtyNCwgOjEyOF0KKy5lbmRtCisKKy5tYWNybyBsb2FkMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtcaW4wfSwgW3IxLCA6NjRdLCByMgorICAgICAgICB2bGQxLnMxNiAgICAgICAge1xpbjF9LCBbcjMsIDo2NF0sIHIyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7XGluMn0sIFtyMSwgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtcaW4zfSwgW3IzLCA6NjRdLCByMgorICAgICAgICB2bGQxLnMxNiAgICAgICAge1xpbjR9LCBbcjEsIDo2NF0sIHIyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7XGluNX0sIFtyMywgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtcaW42fSwgW3IxLCA6NjRdLCByMgorICAgICAgICB2bGQxLnMxNiAgICAgICAge1xpbjd9LCBbcjMsIDo2NF0sIHIyCisuZW5kbQorCisubWFjcm8gYWRkX21lbWJlciBpbiwgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCBvcDAsIG9wMSwgb3AyLCBvcDMsIG9wNCwgb3A1LCBvcDYsIG9wNworICAgICAgICBzdW1fc3ViIHE1LCAgICAgXGluLCBcdDAsIFxvcDAKKyAgICAgICAgc3VtX3N1YiBxNiwgICAgIFxpbiwgXHQxLCBcb3AxCisgICAgICAgIHN1bV9zdWIgcTcsICAgICBcaW4sIFx0MiwgXG9wMgorICAgICAgICBzdW1fc3ViIHE4LCAgICAgXGluLCBcdDMsIFxvcDMKKyAgICAgICAgc3VtX3N1YiBxOSwgICAgIFxpbiwgXHQ0LCBcb3A0CisgICAgICAgIHN1bV9zdWIgcTEwLCAgICBcaW4sIFx0NSwgXG9wNQorICAgICAgICBzdW1fc3ViIHExMSwgICAgXGluLCBcdDYsIFxvcDYKKyAgICAgICAgc3VtX3N1YiBxMTIsICAgIFxpbiwgXHQ3LCBcb3A3CisuZW5kbQorCisubWFjcm8gYnV0dGVyZmx5MTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHE0LCBcaW4wLCBcaW4xCisgICAgICAgIHZzdWIuczMyICAgICAgICBcaW4wLCBcaW4wLCBcaW4xCisgICAgICAgIHZhZGQuczMyICAgICAgICBcaW4xLCBcaW4yLCBcaW4zCisgICAgICAgIHZzdWIuczMyICAgICAgICBcaW4yLCBcaW4yLCBcaW4zCisgICAgICAgIHZhZGQuczMyICAgICAgICBcaW4zLCBcaW40LCBcaW41CisgICAgICAgIHZzdWIuczMyICAgICAgICBcaW40LCBcaW40LCBcaW41CisgICAgICAgIHZhZGQuczMyICAgICAgICBcaW41LCBcaW42LCBcaW43CisgICAgICAgIHZzdWIuczMyICAgICAgICBcaW42LCBcaW42LCBcaW43CisuZW5kbQorCisubWFjcm8gc3RvcmUxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgcngKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIFxpbjAsIFtyMSwgOjY0XSwgcjIKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIFxpbjEsIFtyMywgOjY0XSwgXHJ4CisgICAgICAgIHZzdDEuczE2ICAgICAgICBcaW4yLCBbcjEsIDo2NF0sIHIyCisgICAgICAgIHZzdDEuczE2ICAgICAgICBcaW4zLCBbcjMsIDo2NF0sIFxyeAorICAgICAgICB2c3QxLnMxNiAgICAgICAgXGluNCwgW3IxLCA6NjRdLCByMgorICAgICAgICB2c3QxLnMxNiAgICAgICAgXGluNSwgW3IzLCA6NjRdLCBccngKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIFxpbjYsIFtyMSwgOjY0XSwgcjIKKyAgICAgICAgdnN0MS5zMTYgICAgICAgIFxpbjcsIFtyMywgOjY0XSwgXHJ4CisuZW5kbQorCisubWFjcm8gc2NhbGUgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgb3V0Niwgb3V0NywgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0MCwgXGluMCwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0MSwgXGluMSwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0MiwgXGluMiwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0MywgXGluMywgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0NCwgXGluNCwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0NSwgXGluNSwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0NiwgXGluNiwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0NywgXGluNywgXHNoaWZ0CisuZW5kbQorCitAc3RvcmVzIGluMSwgaW4yLCBpbjQsIGluNiBhc2NlbmRpbmcgZnJvbSBvZmYxIGFuZAorQHN0b3JlcyBpbjEsIGluMywgaW41LCBpbjcgZGVzY2VuZGluZyBmcm9tIG9mZjIKKy5tYWNybyBzdG9yZV90b19zdGFjayBvZmYxLCBvZmYyLCBpbjAsIGluMiwgaW40LCBpbjYsIGluNywgaW41LCBpbjMsIGluMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsIHNwLCAjXG9mZjEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCBzcCwgI1xvZmYyCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgIy0xNgorICAgICAgICB2c3QxLnMzMiAgICAgICAge1xpbjB9LCBbcjEsIDoxMjhdIQorICAgICAgICB2c3QxLnMzMiAgICAgICAge1xpbjF9LCBbcjMsIDoxMjhdLCByMgorICAgICAgICB2c3QxLnMzMiAgICAgICAge1xpbjJ9LCBbcjEsIDoxMjhdIQorICAgICAgICB2c3QxLnMzMiAgICAgICAge1xpbjN9LCBbcjMsIDoxMjhdLCByMgorICAgICAgICB2c3QxLnMzMiAgICAgICAge1xpbjR9LCBbcjEsIDoxMjhdIQorICAgICAgICB2c3QxLnMzMiAgICAgICAge1xpbjV9LCBbcjMsIDoxMjhdLCByMgorICAgICAgICB2c3QxLnMzMiAgICAgICAge1xpbjZ9LCBbcjEsIDoxMjhdCisgICAgICAgIHZzdDEuczMyICAgICAgICB7XGluN30sIFtyMywgOjEyOF0KKy5lbmRtCisKKy5tYWNybyB0cl8xNng0IG5hbWUsIHNoaWZ0LCBvZmZzZXQsIHN0ZXAKK2Z1bmN0aW9uIGZ1bmNfdHJfMTZ4NF9cbmFtZQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsIHI1LCAjKFxzdGVwICogNjQpCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgIyhcc3RlcCAqIDEyOCkKKyAgICAgICAgbG9hZDE2ICAgICAgICAgIGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNworICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEsIHRyYW5zCisKKyAgICAgICAgdHIxNl84eDQgICAgICAgIGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgXG9mZnNldAorCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHI1LCAjKFxzdGVwICogMzIpCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHI1LCAjKFxzdGVwICogMyAqMzIpCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgICMoXHN0ZXAgKiAxMjgpCisgICAgICAgIGxvYWQxNiAgICAgICAgICBkOCwgZDksIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxLCB0cmFucyArIDE2CisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTB9LCBbcjEsIDoxMjhdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxNSwgZDgsIGQwWzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxNiwgZDgsIGQwWzFdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxNywgZDgsIGQwWzJdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxOCwgZDgsIGQwWzNdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxOSwgZDgsIGQxWzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTAsIGQ4LCBkMVsxXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTExLCBkOCwgZDFbMl0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMiwgZDgsIGQxWzNdCisKKyAgICAgICAgYWRkX21lbWJlciAgICAgIGQ5LCBkMFsxXSwgZDFbMF0sIGQxWzNdLCBkMVsxXSwgZDBbMl0sIGQwWzBdLCBkMFszXSwgZDFbMl0sICssICssICssIC0sIC0sIC0sIC0sIC0KKyAgICAgICAgYWRkX21lbWJlciAgICAgIGQyLCBkMFsyXSwgZDFbM10sIGQwWzNdLCBkMFsxXSwgZDFbMl0sIGQxWzBdLCBkMFswXSwgZDFbMV0sICssICssIC0sIC0sIC0sICssICssICsKKyAgICAgICAgYWRkX21lbWJlciAgICAgIGQzLCBkMFszXSwgZDFbMV0sIGQwWzFdLCBkMVszXSwgZDBbMF0sIGQxWzJdLCBkMFsyXSwgZDFbMF0sICssIC0sIC0sICssICssICssIC0sIC0KKyAgICAgICAgYWRkX21lbWJlciAgICAgIGQ0LCBkMVswXSwgZDBbMl0sIGQxWzJdLCBkMFswXSwgZDFbM10sIGQwWzFdLCBkMVsxXSwgZDBbM10sICssIC0sIC0sICssIC0sIC0sICssICsKKyAgICAgICAgYWRkX21lbWJlciAgICAgIGQ1LCBkMVsxXSwgZDBbMF0sIGQxWzBdLCBkMVsyXSwgZDBbMV0sIGQwWzNdLCBkMVszXSwgZDBbMl0sICssIC0sICssICssIC0sICssICssIC0KKyAgICAgICAgYWRkX21lbWJlciAgICAgIGQ2LCBkMVsyXSwgZDBbM10sIGQwWzBdLCBkMFsyXSwgZDFbMV0sIGQxWzNdLCBkMVswXSwgZDBbMV0sICssIC0sICssIC0sICssICssIC0sICsKKyAgICAgICAgYWRkX21lbWJlciAgICAgIGQ3LCBkMVszXSwgZDFbMl0sIGQxWzFdLCBkMVswXSwgZDBbM10sIGQwWzJdLCBkMFsxXSwgZDBbMF0sICssIC0sICssIC0sICssIC0sICssIC0KKworICAgICAgICBhZGQgICAgICAgICAgICAgcjQsIHNwLCAjXG9mZnNldAorICAgICAgICB2bGQxLnMzMiAgICAgICAge3EwLXExfSwgW3I0LCA6MTI4XSEKKyAgICAgICAgdmxkMS5zMzIgICAgICAgIHtxMi1xM30sIFtyNCwgOjEyOF0hCisKKyAgICAgICAgYnV0dGVyZmx5MTYgICAgIHEwLCBxNSwgcTEsIHE2LCBxMiwgcTcsIHEzLCBxOAorICAgIC5pZiBcc2hpZnQgPiAwCisgICAgICAgIHNjYWxlICAgICAgICAgICBkMjYsIGQyNywgZDI4LCBkMjksIGQzMCwgZDMxLCBkMTYsIGQxNywgcTQsIHEwLCBxNSwgcTEsIHE2LCBxMiwgcTcsIHEzLCBcc2hpZnQKKyAgICAgICAgdHJhbnNwb3NlOF80eDQgIGQyNiwgZDI4LCBkMzAsIGQxNgorICAgICAgICB0cmFuc3Bvc2U4XzR4NCAgZDE3LCBkMzEsIGQyOSwgZDI3CisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgcjYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCByNiwgIygyNCArMyozMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAjMzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAjLTMyCisgICAgICAgIHN0b3JlMTYgICAgICAgICBkMjYsIGQyNywgZDI4LCBkMjksIGQzMCwgZDMxLCBkMTYsIGQxNywgcjQKKyAgICAuZWxzZQorICAgICAgICBzdG9yZV90b19zdGFjayAgXG9mZnNldCwgKFxvZmZzZXQgKyAyNDApLCBxNCwgcTUsIHE2LCBxNywgcTMsIHEyLCBxMSwgcTAKKyAgICAuZW5kaWYKKworICAgICAgICBhZGQgICAgICAgICAgICAgcjQsIHNwLCAjKFxvZmZzZXQgKyA2NCkKKyAgICAgICAgdmxkMS5zMzIgICAgICAgIHtxMC1xMX0sIFtyNCwgOjEyOF0hCisgICAgICAgIHZsZDEuczMyICAgICAgICB7cTItcTN9LCBbcjQsIDoxMjhdCisgICAgICAgIGJ1dHRlcmZseTE2ICAgICBxMCwgcTksIHExLCBxMTAsIHEyLCBxMTEsIHEzLCBxMTIKKyAgICAuaWYgXHNoaWZ0ID4gMAorICAgICAgICBzY2FsZSAgICAgICAgICAgZDI2LCBkMjcsIGQyOCwgZDI5LCBkMzAsIGQzMSwgZDgsIGQ5LCBxNCwgcTAsIHE5LCBxMSwgcTEwLCBxMiwgcTExLCBxMywgXHNoaWZ0CisgICAgICAgIHRyYW5zcG9zZThfNHg0ICBkMjYsIGQyOCwgZDMwLCBkOAorICAgICAgICB0cmFuc3Bvc2U4XzR4NCAgZDksIGQzMSwgZDI5LCBkMjcKKworICAgICAgICBhZGQgICAgICAgICAgICAgcjEsIHI2LCAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsIHI2LCAjKDE2ICsgMyAqIDMyKQorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICMzMgorICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICMtMzIKKyAgICAgICAgc3RvcmUxNiAgICAgICAgIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEsIGQ4LCBkOSwgcjQKKyAgICAuZWxzZQorICAgICAgICBzdG9yZV90b19zdGFjayAoXG9mZnNldCArIDY0KSwgKFxvZmZzZXQgKyAxNzYpLCBxNCwgcTksIHExMCwgcTExLCBxMywgcTIsIHExLCBxMAorICAgIC5lbmRpZgorCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGlkY3RfMTZ4MTYgYml0ZGVwdGgKK2Z1bmN0aW9uIGZmX2hldmNfaWRjdF8xNngxNl9cYml0ZGVwdGhcKClfbmVvbiwgZXhwb3J0PTEKK0ByMCAtIGNvZWZmcworICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI3LCBscn0KKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtxNC1xN30KKworICAgICAgICBAIEFsaWduIHRoZSBzdGFjaywgYWxsb2NhdGUgYSB0ZW1wIGJ1ZmZlcgorVCAgICAgICBtb3YgICAgICAgICAgICAgcjcsICBzcAorVCAgICAgICBhbmQgICAgICAgICAgICAgcjcsICByNywgICMxNQorQSAgICAgICBhbmQgICAgICAgICAgICAgcjcsICBzcCwgICMxNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjcsICByNywgICM2NDAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICByNworCisuaXJwIGksIDAsIDEsIDIsIDMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCByMCwgIyg4ICogXGkpCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgc3AsICMoOCAqIFxpICogMTYpCisgICAgICAgIGJsICAgICAgICAgICAgICBmdW5jX3RyXzE2eDRfZmlyc3RwYXNzCisuZW5kcgorCisuaXJwIGksIDAsIDEsIDIsIDMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCBzcCwgIyg4ICogXGkpCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgcjAsICMoOCAqIFxpICogMTYpCisgICAgICAgIGJsICAgICAgICAgICAgICBmdW5jX3RyXzE2eDRfc2Vjb25kcGFzc19cYml0ZGVwdGgKKy5lbmRyCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICByNworCisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjcsIHBjfQorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGxvYWQzMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByNSwgIzY0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIxLCAjMTI4CisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgICMyNTYKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkNH0sIFtyMSwgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkNX0sIFtyMywgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkNn0sIFtyMSwgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkN30sIFtyMywgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkOH0sIFtyMSwgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkOX0sIFtyMywgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkMTB9LCBbcjEsIDo2NF0sIHIyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7ZDExfSwgW3IzLCA6NjRdLCByMgorICAgICAgICB2bGQxLnMxNiAgICAgICAge2QxMn0sIFtyMSwgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkMTN9LCBbcjMsIDo2NF0sIHIyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7ZDE0fSwgW3IxLCA6NjRdLCByMgorICAgICAgICB2bGQxLnMxNiAgICAgICAge2QxNX0sIFtyMywgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkMTZ9LCBbcjEsIDo2NF0sIHIyCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7ZDE3fSwgW3IzLCA6NjRdLCByMgorICAgICAgICB2bGQxLnMxNiAgICAgICAge2QxOH0sIFtyMSwgOjY0XSwgcjIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtkMTl9LCBbcjMsIDo2NF0sIHIyCisuZW5kbQorCisubWFjcm8gYWRkX21lbWJlcjMyIGluLCB0MCwgdDEsIHQyLCB0Mywgb3AwLCBvcDEsIG9wMiwgb3AzCisgICAgICAgIHN1bV9zdWIgcTEwLCAgICAgXGluLCBcdDAsIFxvcDAKKyAgICAgICAgc3VtX3N1YiBxMTEsICAgICBcaW4sIFx0MSwgXG9wMQorICAgICAgICBzdW1fc3ViIHExMiwgICAgIFxpbiwgXHQyLCBcb3AyCisgICAgICAgIHN1bV9zdWIgcTEzLCAgICAgXGluLCBcdDMsIFxvcDMKKy5lbmRtCisKKy5tYWNybyBidXR0ZXJmbHkzMiBpbjAsIGluMSwgaW4yLCBpbjMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHExLCBcaW4wLCBcaW4xCisgICAgICAgIHZzdWIuczMyICAgICAgICBcaW4wLCBcaW4wLCBcaW4xCisgICAgICAgIHZhZGQuczMyICAgICAgICBcaW4xLCBcaW4yLCBcaW4zCisgICAgICAgIHZzdWIuczMyICAgICAgICBcaW4yLCBcaW4yLCBcaW4zCisuZW5kbQorCisubWFjcm8gc2NhbGUzMiBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBpbjAsIGluMSwgaW4yLCBpbjMsIHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0MCwgXGluMCwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0MSwgXGluMSwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0MiwgXGluMiwgXHNoaWZ0CisgICAgICAgIHZxcnNocm4uczMyICAgICBcb3V0MywgXGluMywgXHNoaWZ0CisuZW5kbQorCisubWFjcm8gbXVsdGlwbHkgaW4KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMCwgZDQsIFxpblswXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTExLCBkNCwgXGluWzFdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTIsIGQ0LCBcaW5bMl0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMywgZDQsIFxpblszXQorLmVuZG0KKworLm1hY3JvIHNjYWxlX3N0b3JlIHNoaWZ0CisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTE0LXExNX0sIFtyNCwgOjEyOF0hCisgICAgICAgIGJ1dHRlcmZseTMyICAgICBxMTQsIHExMCwgcTE1LCBxMTEKKyAgICAgICAgc2NhbGUzMiAgICAgICAgIGQyMiwgZDIzLCBkMjAsIGQyMSwgcTEsIHExNCwgcTEwLCBxMTUsIFxzaGlmdAorCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTE0LXExNX0sIFtyNCwgOjEyOF0hCisgICAgICAgIGJ1dHRlcmZseTMyICAgICBxMTQsIHExMiwgcTE1LCBxMTMKKyAgICAgICAgc2NhbGUzMiAgICAgICAgIGQyLCBkMywgZDI4LCBkMjksIHExLCBxMTQsIHExMiwgcTE1LCBcc2hpZnQKKyAgICAgICAgdHJhbnNwb3NlOF80eDQgIGQyMiwgZDIwLCBkMiwgZDI4CisgICAgICAgIHRyYW5zcG9zZThfNHg0ICBkMjksIGQzLCBkMjEsIGQyMworICAgICAgICBzdG9yZTE2ICAgICAgICAgZDIyLCBkMjMsIGQyMCwgZDIxLCBkMiwgZDMsIGQyOCwgZDI5LCByOAorCisgICAgICAgIEAgcmVsb2FkIG11bHRpcGxpY2F0aW9uIGNvZWZmaWNpZW5zIHRvIHExCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTF9LCBbcjksIDoxMjhdCisuZW5kbQorCitmdW5jdGlvbiB0cl9ibG9jazEKKyAgICAgICAgbXVsdGlwbHkgICAgICAgIGQwCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNSwgIGQwWzFdLCBkMVswXSwgZDFbM10sIGQyWzJdLCArLCArLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNiwgIGQwWzJdLCBkMVszXSwgZDNbMF0sIGQzWzJdLCArLCArLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNywgIGQwWzNdLCBkMlsyXSwgZDNbMl0sIGQxWzNdLCArLCArLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkOCwgIGQxWzBdLCBkM1sxXSwgZDJbMV0sIGQwWzBdLCArLCArLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkOSwgIGQxWzFdLCBkM1szXSwgZDFbMF0sIGQxWzJdLCArLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTAsIGQxWzJdLCBkM1swXSwgZDBbMF0sIGQzWzFdLCArLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTEsIGQxWzNdLCBkMlsxXSwgZDFbMV0sIGQyWzNdLCArLCAtLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTIsIGQyWzBdLCBkMVsyXSwgZDJbMl0sIGQxWzBdLCArLCAtLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTMsIGQyWzFdLCBkMFszXSwgZDNbM10sIGQwWzJdLCArLCAtLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTQsIGQyWzJdLCBkMFsxXSwgZDJbM10sIGQyWzFdLCArLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTUsIGQyWzNdLCBkMFsyXSwgZDFbMl0sIGQzWzNdLCArLCAtLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTYsIGQzWzBdLCBkMVsxXSwgZDBbMV0sIGQyWzBdLCArLCAtLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTcsIGQzWzFdLCBkMlswXSwgZDBbM10sIGQwWzFdLCArLCAtLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTgsIGQzWzJdLCBkMlszXSwgZDJbMF0sIGQxWzFdLCArLCAtLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTksIGQzWzNdLCBkM1syXSwgZDNbMV0sIGQzWzBdLCArLCAtLCArLCAtCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiB0cl9ibG9jazIKKyAgICAgICAgbXVsdGlwbHkgICAgICAgIGQxCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNSwgIGQzWzFdLCBkM1szXSwgZDNbMF0sIGQyWzFdLCArLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNiwgIGQyWzFdLCBkMVswXSwgZDBbMF0sIGQxWzFdLCAtLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNywgIGQwWzBdLCBkMVsyXSwgZDNbMV0sIGQyWzNdLCAtLCAtLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkOCwgIGQyWzBdLCBkM1syXSwgZDFbMV0sIGQwWzNdLCAtLCArLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkOSwgIGQzWzJdLCBkMFszXSwgZDFbM10sIGQzWzFdLCArLCArLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTAsIGQxWzFdLCBkMVszXSwgZDJbM10sIGQwWzBdLCArLCArLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTEsIGQwWzNdLCBkM1sxXSwgZDBbMV0sIGQzWzNdLCArLCAtLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTIsIGQzWzBdLCBkMFsyXSwgZDNbMl0sIGQwWzFdLCArLCAtLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTMsIGQyWzJdLCBkMlswXSwgZDFbMF0sIGQzWzJdLCAtLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTQsIGQwWzFdLCBkM1swXSwgZDJbMF0sIGQwWzJdLCAtLCArLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTUsIGQxWzNdLCBkMFsxXSwgZDJbMl0sIGQzWzBdLCAtLCArLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTYsIGQzWzNdLCBkMlsxXSwgZDBbMl0sIGQxWzBdLCArLCArLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTcsIGQxWzJdLCBkMlszXSwgZDNbM10sIGQyWzJdLCArLCAtLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTgsIGQwWzJdLCBkMFsxXSwgZDBbM10sIGQxWzJdLCArLCAtLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTksIGQyWzNdLCBkMlsyXSwgZDJbMV0sIGQyWzBdLCArLCAtLCArLCAtCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiB0cl9ibG9jazMKKyAgICAgICAgbXVsdGlwbHkgICAgICAgIGQyCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNSwgIGQxWzJdLCBkMFszXSwgZDBbMF0sIGQwWzJdLCAtLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNiwgIGQyWzJdLCBkM1szXSwgZDJbM10sIGQxWzJdLCAtLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNywgIGQxWzBdLCBkMFsyXSwgZDJbMV0sIGQzWzNdLCArLCArLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkOCwgIGQzWzBdLCBkMlsyXSwgZDBbMV0sIGQxWzNdLCArLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkOSwgIGQwWzJdLCBkMlswXSwgZDNbMF0sIGQwWzBdLCAtLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTAsIGQzWzJdLCBkMVswXSwgZDJbMF0sIGQyWzJdLCAtLCArLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTEsIGQwWzBdLCBkM1syXSwgZDBbMl0sIGQzWzBdLCArLCArLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTIsIGQzWzNdLCBkMFsxXSwgZDNbMV0sIGQwWzNdLCAtLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTMsIGQwWzFdLCBkMlszXSwgZDFbM10sIGQxWzFdLCAtLCArLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTQsIGQzWzFdLCBkMVszXSwgZDBbM10sIGQzWzJdLCArLCArLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTUsIGQwWzNdLCBkMVsxXSwgZDNbMl0sIGQyWzBdLCArLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTYsIGQyWzNdLCBkM1sxXSwgZDFbMl0sIGQwWzFdLCAtLCAtLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTcsIGQxWzFdLCBkMFswXSwgZDFbMF0sIGQyWzFdLCAtLCArLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTgsIGQyWzFdLCBkM1swXSwgZDNbM10sIGQzWzFdLCArLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTksIGQxWzNdLCBkMVsyXSwgZDFbMV0sIGQxWzBdLCArLCAtLCArLCAtCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiB0cl9ibG9jazQKKyAgICAgICAgbXVsdGlwbHkgICAgICAgIGQzCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNSwgIGQxWzFdLCBkMlswXSwgZDJbM10sIGQzWzJdLCAtLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNiwgIGQwWzBdLCBkMFszXSwgZDJbMF0sIGQzWzFdLCArLCArLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkNywgIGQyWzBdLCBkMFswXSwgZDFbMV0sIGQzWzBdLCAtLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkOCwgIGQzWzNdLCBkMVsyXSwgZDBbMl0sIGQyWzNdLCArLCArLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkOSwgIGQyWzFdLCBkMlszXSwgZDBbMF0sIGQyWzJdLCArLCAtLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTAsIGQwWzJdLCBkM1szXSwgZDBbM10sIGQyWzFdLCAtLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTEsIGQxWzBdLCBkMlsyXSwgZDFbMl0sIGQyWzBdLCArLCArLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTIsIGQyWzNdLCBkMVsxXSwgZDJbMV0sIGQxWzNdLCAtLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTMsIGQzWzFdLCBkMFsxXSwgZDNbMF0sIGQxWzJdLCAtLCArLCAtLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTQsIGQxWzJdLCBkMVswXSwgZDNbM10sIGQxWzFdLCArLCAtLCArLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTUsIGQwWzFdLCBkMlsxXSwgZDNbMV0sIGQxWzBdLCAtLCArLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTYsIGQxWzNdLCBkM1syXSwgZDJbMl0sIGQwWzNdLCArLCAtLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTcsIGQzWzJdLCBkM1swXSwgZDFbM10sIGQwWzJdLCAtLCAtLCArLCAtCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTgsIGQyWzJdLCBkMVszXSwgZDFbMF0sIGQwWzFdLCAtLCArLCAtLCArCisgICAgICAgIGFkZF9tZW1iZXIzMiAgICBkMTksIGQwWzNdLCBkMFsyXSwgZDBbMV0sIGQwWzBdLCArLCAtLCArLCAtCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCisubWFjcm8gdHJfMzJ4NCBuYW1lLCBzaGlmdAorZnVuY3Rpb24gZnVuY190cl8zMng0X1xuYW1lCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTAsIGxyCisgICAgICAgIGJsICAgICAgICAgICAgICBmdW5jX3RyXzE2eDRfbm9zY2FsZQorCisgICAgICAgIGxvYWQzMgorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjksIHRyYW5zICsgMzIKKyAgICAgICAgdmxkMS5zMTYgICAgICAgIHtxMH0sIFtyOSwgOjEyOF0hCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTF9LCBbcjksIDoxMjhdCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIHRyX2Jsb2NrMQorCisgICAgICAgIGFkZCAgICAgICAgICAgICByNCwgc3AsICMyMDQ4CisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTE0LXExNX0sIFtyNCwgOjEyOF0hCisgICAgICAgIGJ1dHRlcmZseTMyICAgICBxMTQsIHExMCwgcTE1LCBxMTEKKyAgICAgICAgc2NhbGUzMiAgICAgICAgIGQyMiwgZDIzLCBkMjAsIGQyMSwgcTEsIHExNCwgcTEwLCBxMTUsIFxzaGlmdAorCisgICAgICAgIHZsZDEuczE2ICAgICAgICB7cTE0LXExNX0sIFtyNCwgOjEyOF0hCisgICAgICAgIGJ1dHRlcmZseTMyICAgICBxMTQsIHExMiwgcTE1LCBxMTMKKyAgICAgICAgc2NhbGUzMiAgICAgICAgIGQyLCBkMywgZDI4LCBkMjksIHExLCBxMTQsIHExMiwgcTE1LCBcc2hpZnQKKworICAgICAgICB0cmFuc3Bvc2U4XzR4NCAgZDIyLCBkMjAsIGQyLCBkMjgKKyAgICAgICAgdHJhbnNwb3NlOF80eDQgIGQyOSwgZDMsIGQyMSwgZDIzCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgcjExCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgIzY0CisgICAgICAgIG1vdiAgICAgICAgICAgICByOCwgIy02NAorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMSwgIyg1NiArIDMgKiA2NCkKKyAgICAgICAgc3RvcmUxNiAgICAgICAgIGQyMiwgZDIzLCBkMjAsIGQyMSwgZDIsIGQzLCBkMjgsIGQyOSwgcjgKKworICAgICAgICBAIHJlbG9hZCBtdWx0aXBsaWNhdGlvbiBjb2VmZmljaWVucyB0byBxMQorICAgICAgICB2bGQxLnMxNiAgICAgICAge3ExfSwgW3I5LCA6MTI4XQorCisgICAgICAgIGJsICAgICAgICAgICAgICB0cl9ibG9jazIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCByMTEsICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgcjExLCAjKDQ4ICsgMyAqIDY0KQorICAgICAgICBtb3YgICAgICAgICAgICAgcjIsICM2NAorICAgICAgICBtb3YgICAgICAgICAgICAgcjgsICMtNjQKKyAgICAgICAgc2NhbGVfc3RvcmUgICAgIFxzaGlmdAorCisgICAgICAgIGJsICAgICAgICAgICAgICB0cl9ibG9jazMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCByMTEsICMxNgorICAgICAgICBhZGQgICAgICAgICAgICAgcjMsIHIxMSwgIyg0MCArIDMgKiA2NCkKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAjNjQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI4LCAjLTY0CisgICAgICAgIHNjYWxlX3N0b3JlICAgICBcc2hpZnQKKworICAgICAgICBibCAgICAgICAgICAgICAgdHJfYmxvY2s0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgcjExLCAjMjQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCByMTEsICMoMzIgKyAzICogNjQpCisgICAgICAgIG1vdiAgICAgICAgICAgICByMiwgIzY0CisgICAgICAgIG1vdiAgICAgICAgICAgICByOCwgIy02NAorICAgICAgICBzY2FsZV9zdG9yZSAgICAgXHNoaWZ0CisKKyAgICAgICAgYnggICAgICAgICAgICAgICByMTAKK2VuZGZ1bmMKKy5lbmRtCisKKy5tYWNybyBpZGN0XzMyeDMyIGJpdGRlcHRoCitmdW5jdGlvbiBmZl9oZXZjX2lkY3RfMzJ4MzJfXGJpdGRlcHRoXCgpX25lb24sIGV4cG9ydD0xCitAcjAgLSBjb2VmZnMKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorCisgICAgICAgIEAgQWxpZ24gdGhlIHN0YWNrLCBhbGxvY2F0ZSBhIHRlbXAgYnVmZmVyCitUICAgICAgIG1vdiAgICAgICAgICAgICByNywgIHNwCitUICAgICAgIGFuZCAgICAgICAgICAgICByNywgIHI3LCAgIzE1CitBICAgICAgIGFuZCAgICAgICAgICAgICByNywgIHNwLCAgIzE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHI3LCAgIzI0MzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICByNworCisuaXJwIGksIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCByMCwgIyg4ICogXGkpCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTEsIHNwLCAjKDggKiBcaSAqIDMyKQorICAgICAgICBibCAgICAgICAgICAgICAgZnVuY190cl8zMng0X2ZpcnN0cGFzcworLmVuZHIKKworLmlycCBpLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3CisgICAgICAgIGFkZCAgICAgICAgICAgICByNSwgc3AsICMoOCAqIFxpKQorICAgICAgICBhZGQgICAgICAgICAgICAgcjExLCByMCwgIyg4ICogXGkgKiAzMikKKyAgICAgICAgYmwgICAgICAgICAgICAgIGZ1bmNfdHJfMzJ4NF9zZWNvbmRwYXNzX1xiaXRkZXB0aAorLmVuZHIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgIHI3CisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjExLCBwY30KK2VuZGZ1bmMKKy5lbmRtCisKK3RyXzE2eDQgZmlyc3RwYXNzLCA3LCA1MTIsIDEKK3RyXzE2eDQgc2Vjb25kcGFzc184LCAyMCAtIDgsIDUxMiwgMQordHJfMTZ4NCBzZWNvbmRwYXNzXzEwLCAyMCAtIDEwLCA1MTIsIDEKK3RyXzE2eDQgbm9zY2FsZSwgMCwgMjA0OCwgNAorLmx0b3JnCit0cl8zMng0IGZpcnN0cGFzcywgNwordHJfMzJ4NCBzZWNvbmRwYXNzXzgsIDIwIC0gOAordHJfMzJ4NCBzZWNvbmRwYXNzXzEwLCAyMCAtIDEwCisubHRvcmcKKworaWRjdF80eDQgOAoraWRjdF80eDRfZGMgOAoraWRjdF80eDQgMTAKK2lkY3RfNHg0X2RjIDEwCitpZGN0Xzh4OCA4CitpZGN0Xzh4OF9kYyA4CitpZGN0Xzh4OCAxMAoraWRjdF84eDhfZGMgMTAKK2lkY3RfMTZ4MTYgOAoraWRjdF8xNngxNl9kYyA4CitpZGN0XzE2eDE2IDEwCitpZGN0XzE2eDE2X2RjIDEwCitpZGN0XzMyeDMyIDgKK2lkY3RfMzJ4MzJfZGMgOAoraWRjdF8zMngzMiAxMAoraWRjdF8zMngzMl9kYyAxMAorCiAvKiB1c2VzIHJlZ2lzdGVycyBxMiAtIHE5IGZvciB0ZW1wIHZhbHVlcyAqLwogLyogVE9ETzogcmVvcmRlciAqLwogLm1hY3JvIHRyNF9sdW1hX3NoaWZ0IHIwLCByMSwgcjIsIHIzLCBzaGlmdApAQCAtMjI1LDY3ICsxMDE1LDcgQEAKICAgICAgICAgdnFyc2hybi5zMzIgICBccjMsIHE1LCBcc2hpZnQKIC5lbmRtCiAKLS8qIHVzZXMgcmVnaXN0ZXJzIHEyIC0gcTYgZm9yIHRlbXAgdmFsdWVzICovCi0ubWFjcm8gdHI0IHIwLCByMSwgcjIsIHIzCi0gICAgICAgIHZtdWxsLnMxNiAgcTQsIFxyMSwgZDBbMF0gICAvLyA4MyAqIHNyYzEKLSAgICAgICAgdm11bGwuczE2ICBxNiwgXHIxLCBkMFsxXSAgIC8vIDM2ICogc3JjMQotICAgICAgICB2c2hsbC5zMTYgIHEyLCBccjAsICM2ICAgLy8gNjQgKiBzcmMwCi0gICAgICAgIHZzaGxsLnMxNiAgcTMsIFxyMiwgIzYgICAvLyA2NCAqIHNyYzIKLSAgICAgICAgdmFkZC5zMzIgICBxNSwgcTIsIHEzICAgIC8vIDY0ICogKHNyYzAgKyBzcmMyKSAgICAgZTAKLSAgICAgICAgdnN1Yi5zMzIgICBxMiwgcTIsIHEzICAgIC8vIDY0ICogKHNyYzAgLSBzcmMyKSAgICAgZTEKLSAgICAgICAgdm1sYWwuczE2ICBxNCwgXHIzLCBkMFsxXSAgIC8vIDgzICogc3JjMSArIDM2ICogc3JjMyAgbzAKLSAgICAgICAgdm1sc2wuczE2ICBxNiwgXHIzLCBkMFswXSAgIC8vIDM2ICogc3JjMSAtIDgzICogc3JjMyAgbzEKLQotICAgICAgICB2c3ViLnMzMiAgIHEzLCBxNSwgcTQgICAgLy8gZTAgLSBvMAotICAgICAgICB2YWRkLnMzMiAgIHE0LCBxNSwgcTQgICAgLy8gZTAgKyBvMAotICAgICAgICB2YWRkLnMzMiAgIHE1LCBxMiwgcTYgICAgLy8gZTEgKyBvMQotICAgICAgICB2c3ViLnMzMiAgIHE2LCBxMiwgcTYgICAgLy8gZTEgLSBvMQotLmVuZG0KLQotLm1hY3JvIHRyNF9zaGlmdCByMCwgcjEsIHIyLCByMywgc2hpZnQKLSAgICAgICAgdm11bGwuczE2ICBxNCwgXHIxLCBkMFswXSAgIC8vIDgzICogc3JjMQotICAgICAgICB2bXVsbC5zMTYgIHE2LCBccjEsIGQwWzFdICAgLy8gMzYgKiBzcmMxCi0gICAgICAgIHZzaGxsLnMxNiAgcTIsIFxyMCwgIzYgICAvLyA2NCAqIHNyYzAKLSAgICAgICAgdnNobGwuczE2ICBxMywgXHIyLCAjNiAgIC8vIDY0ICogc3JjMgotICAgICAgICB2YWRkLnMzMiAgIHE1LCBxMiwgcTMgICAgLy8gNjQgKiAoc3JjMCArIHNyYzIpICAgICBlMAotICAgICAgICB2c3ViLnMzMiAgIHEyLCBxMiwgcTMgICAgLy8gNjQgKiAoc3JjMCAtIHNyYzIpICAgICBlMQotICAgICAgICB2bWxhbC5zMTYgIHE0LCBccjMsIGQwWzFdICAgLy8gODMgKiBzcmMxICsgMzYgKiBzcmMzICBvMAotICAgICAgICB2bWxzbC5zMTYgIHE2LCBccjMsIGQwWzBdICAgLy8gMzYgKiBzcmMxIC0gODMgKiBzcmMzICBvMQotCi0gICAgICAgIHZzdWIuczMyICAgcTMsIHE1LCBxNCAgICAvLyBlMCAtIG8wCi0gICAgICAgIHZhZGQuczMyICAgcTQsIHE1LCBxNCAgICAvLyBlMCArIG8wCi0gICAgICAgIHZhZGQuczMyICAgcTUsIHEyLCBxNiAgICAvLyBlMSArIG8xCi0gICAgICAgIHZzdWIuczMyICAgcTYsIHEyLCBxNiAgICAvLyBlMSAtIG8xCi0KLSAgICAgICAgdnFyc2hybi5zMzIgICBccjAsIHE0LCBcc2hpZnQKLSAgICAgICAgdnFyc2hybi5zMzIgICBccjEsIHE1LCBcc2hpZnQKLSAgICAgICAgdnFyc2hybi5zMzIgICBccjIsIHE2LCBcc2hpZnQKLSAgICAgICAgdnFyc2hybi5zMzIgICBccjMsIHEzLCBcc2hpZnQKLS5lbmRtCi0KLWZ1bmN0aW9uIGZmX2hldmNfdHJhbnNmb3JtXzR4NF9uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIHZwdXNoICAgICAgIHtkOC1kMTV9Ci0gICAgICAgIHZsZDEuMTYgICAgIHtxMTQsIHExNX0sIFtyMF0gIC8vIGNvZWZmcwotICAgICAgICBsZHIgICAgICAgICByMywgPTB4MDAyNDAwNTMgLy8gMzYgYW5kIDgzCi0gICAgICAgIHZtb3YuMzIgICAgIGQwWzBdLCByMwotCi0gICAgICAgIHRyNF9zaGlmdCBkMjgsIGQyOSwgZDMwLCBkMzEsICM3Ci0KLSAgICAgICAgdnRybi4xNiAgICAgZDI4LCBkMjkKLSAgICAgICAgdnRybi4xNiAgICAgZDMwLCBkMzEKLSAgICAgICAgdnRybi4zMiAgICAgcTE0LCBxMTUKLQotICAgICAgICB0cjRfc2hpZnQgZDI4LCBkMjksIGQzMCwgZDMxLCAjMTIKLQotICAgICAgICB2dHJuLjE2ICAgICBkMjgsIGQyOQotICAgICAgICB2dHJuLjE2ICAgICBkMzAsIGQzMQotICAgICAgICB2dHJuLjMyICAgICBxMTQsIHExNQotCi0gICAgICAgIHZzdDEuMTYgICAgIHtxMTQsIHExNX0sIFtyMF0KLSAgICAgICAgdnBvcCAgICAgICAge2Q4LWQxNX0KLSAgICAgICAgYnggbHIKLWVuZGZ1bmMKLQorLmx0b3JnCiBmdW5jdGlvbiBmZl9oZXZjX3RyYW5zZm9ybV9sdW1hXzR4NF9uZW9uXzgsIGV4cG9ydD0xCiAgICAgICAgIHZwdXNoICAgICAgIHtkOC1kMTV9CiAgICAgICAgIHZsZDEuMTYgICAgIHtxMTQsIHExNX0sIFtyMF0gIC8vIGNvZWZmcwpAQCAtMzExLDE1NSArMTA0MSwzIEBACiAgICAgICAgIHZwb3AgICAgICAgIHtkOC1kMTV9CiAgICAgICAgIGJ4IGxyCiBlbmRmdW5jCi0KLS5tYWNybyB0cjhfYmVnaW4gaW4wLCBpbjEsIGluMiwgaW4zCi0gICAgICAgIHZtdWxsLnMxNiAgcTcsIFxpbjAsIGQxWzFdICAgLy8gODkgKiBzcmMxCi0gICAgICAgIHZtdWxsLnMxNiAgcTgsIFxpbjAsIGQxWzBdICAgLy8gNzUgKiBzcmMxCi0gICAgICAgIHZtdWxsLnMxNiAgcTksIFxpbjAsIGQxWzNdICAgLy8gNTAgKiBzcmMxCi0gICAgICAgIHZtdWxsLnMxNiAgcTEwLCBcaW4wLCBkMVsyXSAgLy8gMTggKiBzcmMxCi0KLSAgICAgICAgdm1sYWwuczE2ICBxNywgXGluMSwgZDFbMF0gICAvLyA3NSAqIHNyYzMKLSAgICAgICAgdm1sc2wuczE2ICBxOCwgXGluMSwgZDFbMl0gICAvLy0xOCAqIHNyYzMKLSAgICAgICAgdm1sc2wuczE2ICBxOSwgXGluMSwgZDFbMV0gICAvLy04OSAqIHNyYzMKLSAgICAgICAgdm1sc2wuczE2ICBxMTAsIFxpbjEsIGQxWzNdICAvLy01MCAqIHNyYzMKLQotICAgICAgICB2bWxhbC5zMTYgIHE3LCBcaW4yLCBkMVszXSAgIC8vIDUwICogc3JjNQotICAgICAgICB2bWxzbC5zMTYgIHE4LCBcaW4yLCBkMVsxXSAgIC8vLTg5ICogc3JjNQotICAgICAgICB2bWxhbC5zMTYgIHE5LCBcaW4yLCBkMVsyXSAgIC8vIDE4ICogc3JjNQotICAgICAgICB2bWxhbC5zMTYgIHExMCwgXGluMiwgZDFbMF0gIC8vIDc1ICogc3JjNQotCi0gICAgICAgIHZtbGFsLnMxNiAgcTcsIFxpbjMsIGQxWzJdICAgLy8gMTggKiBzcmM3Ci0gICAgICAgIHZtbHNsLnMxNiAgcTgsIFxpbjMsIGQxWzNdICAgLy8tNTAgKiBzcmM3Ci0gICAgICAgIHZtbGFsLnMxNiAgcTksIFxpbjMsIGQxWzBdICAgLy8gNzUgKiBzcmM3Ci0gICAgICAgIHZtbHNsLnMxNiAgcTEwLCBcaW4zLCBkMVsxXSAgLy8tODkgKiBzcmM3Ci0uZW5kbQotCi0ubWFjcm8gdHI4X2VuZCBzaGlmdAotICAgICAgICB2YWRkLnMzMiAgIHExLCBxNCwgcTcgICAvLyAgZV84WzBdICsgb184WzBdLCBkc3RbMF0KLSAgICAgICAgdnN1Yi5zMzIgICBxNCwgcTQsIHE3ICAgLy8gIGVfOFswXSAtIG9fOFswXSwgZHN0WzddCi0KLSAgICAgICAgdmFkZC5zMzIgICBxMiwgcTUsIHE4ICAgLy8gZV84WzFdICsgb184WzFdLCBkc3RbMV0KLSAgICAgICAgdnN1Yi5zMzIgICBxNSwgcTUsIHE4ICAgLy8gZV84WzFdIC0gb184WzFdLCBkc3RbNl0KLQotICAgICAgICB2YWRkLnMzMiAgIHExMSwgcTYsIHE5ICAvLyBlXzhbMl0gKyBvXzhbMl0sIGRzdFsyXQotICAgICAgICB2c3ViLnMzMiAgICBxNiwgcTYsIHE5ICAvLyBlXzhbMl0gLSBvXzhbMl0sIGRzdFs1XQotCi0gICAgICAgIHZhZGQuczMyICAgcTEyLCBxMywgcTEwIC8vIGVfOFszXSArIG9fOFszXSwgZHN0WzNdCi0gICAgICAgIHZzdWIuczMyICAgcTMsIHEzLCBxMTAgIC8vIGVfOFszXSAtIG9fOFszXSwgZHN0WzRdCi0gICAgICAgIHZxcnNocm4uczMyICAgZDIsIHExLCBcc2hpZnQKLSAgICAgICAgdnFyc2hybi5zMzIgICBkMywgcTIsIFxzaGlmdAotICAgICAgICB2cXJzaHJuLnMzMiAgIGQ0LCBxMTEsIFxzaGlmdAotICAgICAgICB2cXJzaHJuLnMzMiAgIGQ1LCBxMTIsIFxzaGlmdAotICAgICAgICB2cXJzaHJuLnMzMiAgIGQ2LCBxMywgXHNoaWZ0Ci0gICAgICAgIHZxcnNocm4uczMyICAgZDcsIHE2LCBcc2hpZnQKLSAgICAgICAgdnFyc2hybi5zMzIgICBkOSwgcTQsIFxzaGlmdAotICAgICAgICB2cXJzaHJuLnMzMiAgIGQ4LCBxNSwgXHNoaWZ0Ci0uZW5kbQotCi1mdW5jdGlvbiBmZl9oZXZjX3RyYW5zZm9ybV84eDhfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBwdXNoICAge3I0LXI4fQotICAgICAgICB2cHVzaCB7ZDgtZDE1fQotICAgICAgICBtb3YgICAgcjUsICMxNgotCi0gICAgICAgIGFkciAgICAgICByMywgdHI0ZgotICAgICAgICB2bGQxLjE2ICAge2QwLCBkMX0sIFtyM10KLQotICAgICAgICAvLyBsZWZ0IGhhbGYKLSAgICAgICAgdmxkMS4xNiB7ZDI0fSwgW3IwXSwgcjUKLSAgICAgICAgdmxkMS4xNiB7ZDI1fSwgW3IwXSwgcjUKLSAgICAgICAgdmxkMS4xNiB7ZDI2fSwgW3IwXSwgcjUKLSAgICAgICAgdmxkMS4xNiB7ZDI3fSwgW3IwXSwgcjUKLSAgICAgICAgdmxkMS4xNiB7ZDI4fSwgW3IwXSwgcjUKLSAgICAgICAgdmxkMS4xNiB7ZDI5fSwgW3IwXSwgcjUKLSAgICAgICAgdmxkMS4xNiB7ZDMwfSwgW3IwXSwgcjUKLSAgICAgICAgdmxkMS4xNiB7ZDMxfSwgW3IwXSwgcjUKLSAgICAgICAgc3ViICAgICAgcjAsICMxMjgKLSAgICAgICAgdHI4X2JlZ2luIGQyNSwgZDI3LCBkMjksIGQzMQotICAgICAgICB0cjQgICAgICAgZDI0LCBkMjYsIGQyOCwgZDMwCi0gICAgICAgIHRyOF9lbmQgICAjNwotICAgICAgICB2c3QxLjE2IHtkMn0sIFtyMF0sIHI1Ci0gICAgICAgIHZzdDEuMTYge2QzfSwgW3IwXSwgcjUKLSAgICAgICAgdnN0MS4xNiB7ZDR9LCBbcjBdLCByNQotICAgICAgICB2c3QxLjE2IHtkNX0sIFtyMF0sIHI1Ci0gICAgICAgIHZzdDEuMTYge2Q2fSwgW3IwXSwgcjUKLSAgICAgICAgdnN0MS4xNiB7ZDd9LCBbcjBdLCByNQotICAgICAgICB2c3QxLjE2IHtkOH0sIFtyMF0sIHI1Ci0gICAgICAgIHZzdDEuMTYge2Q5fSwgW3IwXSwgcjUKLSAgICAgICAgc3ViICAgICAgcjAsICMxMjgKLSAgICAgICAgLy9za2lwIHJpZ2h0IGhhbGYgaWYgY29sX2xpbWl0IGluIHIxIGlzIGxlc3MgdGhhbiA0Ci0gICAgICAgIGNtcCAgICAgIHIxLCAjNAotICAgICAgICBibHQgICAgICAxZgotICAgICAgICAvL3JpZ2h0IGhhbGYKLSAgICAgICAgYWRkICAgICAgcjAsICM4Ci0gICAgICAgIHZsZDEuMTYge2QyNH0sIFtyMF0sIHI1Ci0gICAgICAgIHZsZDEuMTYge2QyNX0sIFtyMF0sIHI1Ci0gICAgICAgIHZsZDEuMTYge2QyNn0sIFtyMF0sIHI1Ci0gICAgICAgIHZsZDEuMTYge2QyN30sIFtyMF0sIHI1Ci0gICAgICAgIHZsZDEuMTYge2QyOH0sIFtyMF0sIHI1Ci0gICAgICAgIHZsZDEuMTYge2QyOX0sIFtyMF0sIHI1Ci0gICAgICAgIHZsZDEuMTYge2QzMH0sIFtyMF0sIHI1Ci0gICAgICAgIHZsZDEuMTYge2QzMX0sIFtyMF0sIHI1Ci0gICAgICAgIHN1YiAgICAgIHIwLCAjMTI4Ci0gICAgICAgIHRyOF9iZWdpbiBkMjUsIGQyNywgZDI5LCBkMzEKLSAgICAgICAgdHI0ICAgICAgIGQyNCwgZDI2LCBkMjgsIGQzMAotICAgICAgICB0cjhfZW5kICAgIzcKLSAgICAgICAgdnN0MS4xNiB7ZDJ9LCBbcjBdLCByNQotICAgICAgICB2c3QxLjE2IHtkM30sIFtyMF0sIHI1Ci0gICAgICAgIHZzdDEuMTYge2Q0fSwgW3IwXSwgcjUKLSAgICAgICAgdnN0MS4xNiB7ZDV9LCBbcjBdLCByNQotICAgICAgICB2c3QxLjE2IHtkNn0sIFtyMF0sIHI1Ci0gICAgICAgIHZzdDEuMTYge2Q3fSwgW3IwXSwgcjUKLSAgICAgICAgdnN0MS4xNiB7ZDh9LCBbcjBdLCByNQotICAgICAgICB2c3QxLjE2IHtkOX0sIFtyMF0sIHI1Ci0gICAgICAgIHN1YiAgICAgIHIwLCAjMTM2Ci0xOgotICAgICAgICAvLyB0b3AgaGFsZgotICAgICAgICB2bGRtIHIwLCB7cTEyLXExNX0gLy8gY29lZmZzCi0gICAgICAgIHRyYW5zcG9zZV8xNmJfNHg0IGQyNCwgZDI2LCBkMjgsIGQzMAotICAgICAgICB0cmFuc3Bvc2VfMTZiXzR4NCBkMjUsIGQyNywgZDI5LCBkMzEKLSAgICAgICAgdHI4X2JlZ2luIGQyNiwgZDMwLCBkMjcsIGQzMQotICAgICAgICB0cjQgZDI0LCBkMjgsIGQyNSwgZDI5Ci0gICAgICAgIHRyOF9lbmQgIzEyCi0gICAgICAgIHRyYW5zcG9zZV8xNmJfNHg0IGQyLCBkMywgZDQsIGQ1Ci0gICAgICAgIHRyYW5zcG9zZV8xNmJfNHg0IGQ2LCBkNywgZDgsIGQ5Ci0gICAgICAgIHZzd3AgICAgIGQ3LCBkNQotICAgICAgICB2c3dwICAgICBkNywgZDgKLSAgICAgICAgdnN3cCAgICAgZDMsIGQ2Ci0gICAgICAgIHZzd3AgICAgIGQ2LCBkNAotICAgICAgICB2c3RtIHIwISwge3ExLXE0fQotCi0gICAgICAgIC8vIGJvdHRvbSBoYWxmCi0gICAgICAgIHZsZG0gcjAsIHtxMTItcTE1fSAvLyBjb2VmZnMKLSAgICAgICAgdHJhbnNwb3NlXzE2Yl80eDQgZDI0LCBkMjYsIGQyOCwgZDMwCi0gICAgICAgIHRyYW5zcG9zZV8xNmJfNHg0IGQyNSwgZDI3LCBkMjksIGQzMQotICAgICAgICB0cjhfYmVnaW4gZDI2LCBkMzAsIGQyNywgZDMxCi0gICAgICAgIHRyNCBkMjQsIGQyOCwgZDI1LCBkMjkKLSAgICAgICAgdHI4X2VuZCAjMTIKLSAgICAgICAgdHJhbnNwb3NlXzE2Yl80eDQgZDIsIGQzLCBkNCwgZDUKLSAgICAgICAgdHJhbnNwb3NlXzE2Yl80eDQgZDYsIGQ3LCBkOCwgZDkKLSAgICAgICAgdnN3cCAgICAgZDcsIGQ1Ci0gICAgICAgIHZzd3AgICAgIGQ3LCBkOAotICAgICAgICB2c3dwICAgICBkMywgZDYKLSAgICAgICAgdnN3cCAgICAgZDYsIGQ0Ci0gICAgICAgIC8vdnN0bSAgICAgcjAsIHtxMS1xNH0KLSAgICAgICAgdnN0MS4xNiB7cTEtcTJ9LCBbcjBdCi0gICAgICAgIGFkZCAgICAgcjAsICMzMgotICAgICAgICB2c3QxLjE2IHtxMy1xNH0sIFtyMF0KLSAgICAgICAgc3ViICAgICByMCwgIzMyCi0gICAgICAgIHZwb3Age2Q4LWQxNX0KLSAgICAgICAgcG9wIHtyNC1yOH0KLSAgICAgICAgYnggbHIKLWVuZGZ1bmMKLQotLmFsaWduIDQKLXRyNGY6Ci0ud29yZCAweDAwMjQwMDUzICAvLyAzNiBhbmQgZDFbMF0gPSA4MwotLndvcmQgMHgwMDAwMDAwMAotdHI4ZjoKLS53b3JkIDB4MDA1OTAwNGIgIC8vIDg5LCBkMFswXSA9IDc1Ci0ud29yZCAweDAwMzIwMDEyICAvLyA1MCwgZDBbMl0gPSAxOAotdHIxNjoKLS53b3JkIDB4MDA1YTAwNTcgIC8vIDkwLCBkMlswXSA9IDg3Ci0ud29yZCAweDAwNTAwMDQ2ICAvLyA4MCwgZDJbMl0gPSA3MAotLndvcmQgMHgwMDM5MDAyYiAgLy8gNTcsIGQyWzBdID0gNDMKLS53b3JkIDB4MDAxOTAwMDkgIC8vIDI1LCBkMlsyXSA9IDkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfaW5pdF9hcm0uYyBiL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfaW5pdF9hcm0uYwppbmRleCBhZGNjNDU0Li5lOGZhMWY3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9oZXZjZHNwX2luaXRfYXJtLmMKKysrIGIvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9pbml0X2FybS5jCkBAIC0xOSwxNCArMTksMTYgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9jcHUuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvaGV2Y2RzcC5oIgogI2luY2x1ZGUgImhldmNkc3BfYXJtLmgiCiAKLWF2X2NvbGQgdm9pZCBmZl9oZXZjZHNwX2luaXRfYXJtKEhFVkNEU1BDb250ZXh0ICpjLCBjb25zdCBpbnQgYml0X2RlcHRoKQorYXZfY29sZCB2b2lkIGZmX2hldmNfZHNwX2luaXRfYXJtKEhFVkNEU1BDb250ZXh0ICpjLCBjb25zdCBpbnQgYml0X2RlcHRoKQogewogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKICAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpCi0gICAgICAgIGZmX2hldmNkc3BfaW5pdF9uZW9uKGMsIGJpdF9kZXB0aCk7CisgICAgICAgIGZmX2hldmNfZHNwX2luaXRfbmVvbihjLCBiaXRfZGVwdGgpOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9pbml0X25lb24uYyBiL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfaW5pdF9uZW9uLmMKaW5kZXggNTU5MTgwNy4uMjAxYTA4OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9pbml0X25lb24uYworKysgYi9saWJhdmNvZGVjL2FybS9oZXZjZHNwX2luaXRfbmVvbi5jCkBAIC0yMSwyNyArMjEsNTMgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9oZXZjZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCiAjaW5jbHVkZSAiaGV2Y2RzcF9hcm0uaCIKIAordm9pZCBmZl9oZXZjX3Nhb19iYW5kX2ZpbHRlcl9uZW9uXzhfd3JhcHBlcih1aW50OF90ICpfZHN0LCB1aW50OF90ICpfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBwdHJkaWZmX3Qgc3RyaWRlX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzYW9fb2Zmc2V0X3ZhbCwgaW50IHNhb19sZWZ0X2NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cit2b2lkIGZmX2hldmNfc2FvX2VkZ2VfZmlsdGVyX25lb25fOF93cmFwcGVyKHVpbnQ4X3QgKl9kc3QsIHVpbnQ4X3QgKl9zcmMsIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBpbnQxNl90ICpzYW9fb2Zmc2V0X3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW8sIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKIHZvaWQgZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfbmVvbih1aW50OF90ICpfcGl4LCBwdHJkaWZmX3QgX3N0cmlkZSwgaW50IF9iZXRhLCBpbnQgKl90YywgdWludDhfdCAqX25vX3AsIHVpbnQ4X3QgKl9ub19xKTsKIHZvaWQgZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfbmVvbih1aW50OF90ICpfcGl4LCBwdHJkaWZmX3QgX3N0cmlkZSwgaW50IF9iZXRhLCBpbnQgKl90YywgdWludDhfdCAqX25vX3AsIHVpbnQ4X3QgKl9ub19xKTsKIHZvaWQgZmZfaGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYV9uZW9uKHVpbnQ4X3QgKl9waXgsIHB0cmRpZmZfdCBfc3RyaWRlLCBpbnQgKl90YywgdWludDhfdCAqX25vX3AsIHVpbnQ4X3QgKl9ub19xKTsKIHZvaWQgZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2Nocm9tYV9uZW9uKHVpbnQ4X3QgKl9waXgsIHB0cmRpZmZfdCBfc3RyaWRlLCBpbnQgKl90YywgdWludDhfdCAqX25vX3AsIHVpbnQ4X3QgKl9ub19xKTsKLXZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fNHg0X25lb25fOChpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpOwotdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV84eDhfbmVvbl84KGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7Ci12b2lkIGZmX2hldmNfaWRjdF80eDRfZGNfbmVvbl84KGludDE2X3QgKmNvZWZmcyk7Ci12b2lkIGZmX2hldmNfaWRjdF84eDhfZGNfbmVvbl84KGludDE2X3QgKmNvZWZmcyk7Ci12b2lkIGZmX2hldmNfaWRjdF8xNngxNl9kY19uZW9uXzgoaW50MTZfdCAqY29lZmZzKTsKLXZvaWQgZmZfaGV2Y19pZGN0XzMyeDMyX2RjX25lb25fOChpbnQxNl90ICpjb2VmZnMpOwordm9pZCBmZl9oZXZjX2FkZF9yZXNpZHVhbF80eDRfOF9uZW9uKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfNHg0XzEwX25lb24odWludDhfdCAqX2RzdCwgaW50MTZfdCAqY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfOHg4XzhfbmVvbih1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzh4OF8xMF9uZW9uKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzE2eDE2XzhfbmVvbih1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfMTZ4MTZfMTBfbmVvbih1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzMyeDMyXzhfbmVvbih1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfMzJ4MzJfMTBfbmVvbih1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfaWRjdF80eDRfZGNfOF9uZW9uKGludDE2X3QgKmNvZWZmcyk7Cit2b2lkIGZmX2hldmNfaWRjdF84eDhfZGNfOF9uZW9uKGludDE2X3QgKmNvZWZmcyk7Cit2b2lkIGZmX2hldmNfaWRjdF8xNngxNl9kY184X25lb24oaW50MTZfdCAqY29lZmZzKTsKK3ZvaWQgZmZfaGV2Y19pZGN0XzMyeDMyX2RjXzhfbmVvbihpbnQxNl90ICpjb2VmZnMpOwordm9pZCBmZl9oZXZjX2lkY3RfNHg0X2RjXzEwX25lb24oaW50MTZfdCAqY29lZmZzKTsKK3ZvaWQgZmZfaGV2Y19pZGN0Xzh4OF9kY18xMF9uZW9uKGludDE2X3QgKmNvZWZmcyk7Cit2b2lkIGZmX2hldmNfaWRjdF8xNngxNl9kY18xMF9uZW9uKGludDE2X3QgKmNvZWZmcyk7Cit2b2lkIGZmX2hldmNfaWRjdF8zMngzMl9kY18xMF9uZW9uKGludDE2X3QgKmNvZWZmcyk7Cit2b2lkIGZmX2hldmNfaWRjdF80eDRfOF9uZW9uKGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7Cit2b2lkIGZmX2hldmNfaWRjdF84eDhfOF9uZW9uKGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7Cit2b2lkIGZmX2hldmNfaWRjdF8xNngxNl84X25lb24oaW50MTZfdCAqY29lZmZzLCBpbnQgY29sX2xpbWl0KTsKK3ZvaWQgZmZfaGV2Y19pZGN0XzMyeDMyXzhfbmVvbihpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpOwordm9pZCBmZl9oZXZjX2lkY3RfNHg0XzEwX25lb24oaW50MTZfdCAqY29lZmZzLCBpbnQgY29sX2xpbWl0KTsKK3ZvaWQgZmZfaGV2Y19pZGN0Xzh4OF8xMF9uZW9uKGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7Cit2b2lkIGZmX2hldmNfaWRjdF8xNngxNl8xMF9uZW9uKGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7Cit2b2lkIGZmX2hldmNfaWRjdF8zMngzMl8xMF9uZW9uKGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7CiB2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2x1bWFfNHg0X25lb25fOChpbnQxNl90ICpjb2VmZnMpOwotdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGRfNHg0X25lb25fOCh1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOwotdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGRfOHg4X25lb25fOCh1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOwotdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGRfMTZ4MTZfbmVvbl84KHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7Ci12b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZF8zMngzMl9uZW9uXzgodWludDhfdCAqX2RzdCwgaW50MTZfdCAqY29lZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKIAogI2RlZmluZSBQVVRfUElYRUxTKG5hbWUpIFwKICAgICB2b2lkIG5hbWUoaW50MTZfdCAqZHN0LCB1aW50OF90ICpzcmMsIFwKQEAgLTEyNCw2ICsxNTAsNDcgQEAKIFFQRUxfRlVOQ19VVyhmZl9oZXZjX3B1dF9xcGVsX3V3X2gzdjNfbmVvbl84KTsKICN1bmRlZiBRUEVMX0ZVTkNfVVcKIAordm9pZCBmZl9oZXZjX3Nhb19iYW5kX2ZpbHRlcl9uZW9uXzgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBwdHJkaWZmX3Qgc3RyaWRlX3NyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQxNl90ICpvZmZzZXRfdGFibGUpOworCit2b2lkIGZmX2hldmNfc2FvX2JhbmRfZmlsdGVyX25lb25fOF93cmFwcGVyKHVpbnQ4X3QgKl9kc3QsIHVpbnQ4X3QgKl9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZV9kc3QsIHB0cmRpZmZfdCBzdHJpZGVfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNhb19vZmZzZXRfdmFsLCBpbnQgc2FvX2xlZnRfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgdWludDhfdCAqZHN0ID0gX2RzdDsKKyAgICB1aW50OF90ICpzcmMgPSBfc3JjOworICAgIGludDE2X3Qgb2Zmc2V0X3RhYmxlWzMyXSA9IHswfTsKKyAgICBpbnQgazsKKworICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKKyAgICAgICAgb2Zmc2V0X3RhYmxlWyhrICsgc2FvX2xlZnRfY2xhc3MpICYgMzFdID0gc2FvX29mZnNldF92YWxbayArIDFdOworICAgIH0KKworICAgIGZmX2hldmNfc2FvX2JhbmRfZmlsdGVyX25lb25fOChkc3QsIHNyYywgc3RyaWRlX2RzdCwgc3RyaWRlX3NyYywgd2lkdGgsIGhlaWdodCwgb2Zmc2V0X3RhYmxlKTsKK30KKwordm9pZCBmZl9oZXZjX3Nhb19lZGdlX2ZpbHRlcl9uZW9uXzgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBwdHJkaWZmX3Qgc3RyaWRlX3NyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFfc3RyaWRlLCBpbnQgYl9zdHJpZGUsIGludDE2X3QgKnNhb19vZmZzZXRfdmFsLCB1aW50OF90ICplZGdlX2lkeCk7CisKK3ZvaWQgZmZfaGV2Y19zYW9fZWRnZV9maWx0ZXJfbmVvbl84X3dyYXBwZXIodWludDhfdCAqX2RzdCwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZV9kc3QsIGludDE2X3QgKnNhb19vZmZzZXRfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICAgc3RhdGljIHVpbnQ4X3QgZWRnZV9pZHhbXSA9IHsgMSwgMiwgMCwgMywgNCB9OworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgcG9zWzRdWzJdWzJdID0geworICAgICAgICB7IHsgLTEsICAwIH0sIHsgIDEsIDAgfSB9LCAvLyBob3Jpem9udGFsCisgICAgICAgIHsgeyAgMCwgLTEgfSwgeyAgMCwgMSB9IH0sIC8vIHZlcnRpY2FsCisgICAgICAgIHsgeyAtMSwgLTEgfSwgeyAgMSwgMSB9IH0sIC8vIDQ1IGRlZ3JlZQorICAgICAgICB7IHsgIDEsIC0xIH0sIHsgLTEsIDEgfSB9LCAvLyAxMzUgZGVncmVlCisgICAgfTsKKyAgICB1aW50OF90ICpkc3QgPSBfZHN0OworICAgIHVpbnQ4X3QgKnNyYyA9IF9zcmM7CisgICAgaW50IGFfc3RyaWRlLCBiX3N0cmlkZTsKKyAgICBwdHJkaWZmX3Qgc3RyaWRlX3NyYyA9ICgyKk1BWF9QQl9TSVpFICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICBhX3N0cmlkZSA9IHBvc1tlb11bMF1bMF0gKyBwb3NbZW9dWzBdWzFdICogc3RyaWRlX3NyYzsKKyAgICBiX3N0cmlkZSA9IHBvc1tlb11bMV1bMF0gKyBwb3NbZW9dWzFdWzFdICogc3RyaWRlX3NyYzsKKworICAgIGZmX2hldmNfc2FvX2VkZ2VfZmlsdGVyX25lb25fOChkc3QsIHNyYywgc3RyaWRlX2RzdCwgc3RyaWRlX3NyYywgd2lkdGgsIGhlaWdodCwgYV9zdHJpZGUsIGJfc3RyaWRlLCBzYW9fb2Zmc2V0X3ZhbCwgZWRnZV9pZHgpOworfQorCiB2b2lkIGZmX2hldmNfcHV0X3FwZWxfbmVvbl93cmFwcGVyKGludDE2X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnRwdHJfdCBteCwgaW50cHRyX3QgbXksIGludCB3aWR0aCkgewogCkBAIC0xNDIsNyArMjA5LDcgQEAKICAgICBwdXRfaGV2Y19xcGVsX3V3X25lb25bbXldW214XShkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIHdpZHRoLCBoZWlnaHQsIHNyYzIsIE1BWF9QQl9TSVpFKTsKIH0KIAotYXZfY29sZCB2b2lkIGZmX2hldmNkc3BfaW5pdF9uZW9uKEhFVkNEU1BDb250ZXh0ICpjLCBjb25zdCBpbnQgYml0X2RlcHRoKQorYXZfY29sZCB2b2lkIGZmX2hldmNfZHNwX2luaXRfbmVvbihIRVZDRFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCkKIHsKICAgICBpZiAoYml0X2RlcHRoID09IDgpIHsKICAgICAgICAgaW50IHg7CkBAIC0xNTAsMTcgKzIxNywyOSBAQAogICAgICAgICBjLT5oZXZjX2hfbG9vcF9maWx0ZXJfbHVtYSAgICAgPSBmZl9oZXZjX2hfbG9vcF9maWx0ZXJfbHVtYV9uZW9uOwogICAgICAgICBjLT5oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hICAgPSBmZl9oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hX25lb247CiAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9jaHJvbWEgICA9IGZmX2hldmNfaF9sb29wX2ZpbHRlcl9jaHJvbWFfbmVvbjsKLSAgICAgICAgYy0+aWRjdFswXSAgICAgICAgICAgICAgICAgICAgID0gZmZfaGV2Y190cmFuc2Zvcm1fNHg0X25lb25fODsKLSAgICAgICAgYy0+aWRjdFsxXSAgICAgICAgICAgICAgICAgICAgID0gZmZfaGV2Y190cmFuc2Zvcm1fOHg4X25lb25fODsKLSAgICAgICAgYy0+aWRjdF9kY1swXSAgICAgICAgICAgICAgICAgID0gZmZfaGV2Y19pZGN0XzR4NF9kY19uZW9uXzg7Ci0gICAgICAgIGMtPmlkY3RfZGNbMV0gICAgICAgICAgICAgICAgICA9IGZmX2hldmNfaWRjdF84eDhfZGNfbmVvbl84OwotICAgICAgICBjLT5pZGN0X2RjWzJdICAgICAgICAgICAgICAgICAgPSBmZl9oZXZjX2lkY3RfMTZ4MTZfZGNfbmVvbl84OwotICAgICAgICBjLT5pZGN0X2RjWzNdICAgICAgICAgICAgICAgICAgPSBmZl9oZXZjX2lkY3RfMzJ4MzJfZGNfbmVvbl84OwotICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzBdICAgICAgICAgICAgPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGRfNHg0X25lb25fODsKLSAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsxXSAgICAgICAgICAgID0gZmZfaGV2Y190cmFuc2Zvcm1fYWRkXzh4OF9uZW9uXzg7Ci0gICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbMl0gICAgICAgICAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZF8xNngxNl9uZW9uXzg7Ci0gICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbM10gICAgICAgICAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZF8zMngzMl9uZW9uXzg7Ci0gICAgICAgIGMtPmlkY3RfNHg0X2x1bWEgICAgICAgICAgICAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2x1bWFfNHg0X25lb25fODsKKyAgICAgICAgYy0+c2FvX2JhbmRfZmlsdGVyWzBdICAgICAgICAgID0gZmZfaGV2Y19zYW9fYmFuZF9maWx0ZXJfbmVvbl84X3dyYXBwZXI7CisgICAgICAgIGMtPnNhb19iYW5kX2ZpbHRlclsxXSAgICAgICAgICA9IGZmX2hldmNfc2FvX2JhbmRfZmlsdGVyX25lb25fOF93cmFwcGVyOworICAgICAgICBjLT5zYW9fYmFuZF9maWx0ZXJbMl0gICAgICAgICAgPSBmZl9oZXZjX3Nhb19iYW5kX2ZpbHRlcl9uZW9uXzhfd3JhcHBlcjsKKyAgICAgICAgYy0+c2FvX2JhbmRfZmlsdGVyWzNdICAgICAgICAgID0gZmZfaGV2Y19zYW9fYmFuZF9maWx0ZXJfbmVvbl84X3dyYXBwZXI7CisgICAgICAgIGMtPnNhb19iYW5kX2ZpbHRlcls0XSAgICAgICAgICA9IGZmX2hldmNfc2FvX2JhbmRfZmlsdGVyX25lb25fOF93cmFwcGVyOworICAgICAgICBjLT5zYW9fZWRnZV9maWx0ZXJbMF0gICAgICAgICAgPSBmZl9oZXZjX3Nhb19lZGdlX2ZpbHRlcl9uZW9uXzhfd3JhcHBlcjsKKyAgICAgICAgYy0+c2FvX2VkZ2VfZmlsdGVyWzFdICAgICAgICAgID0gZmZfaGV2Y19zYW9fZWRnZV9maWx0ZXJfbmVvbl84X3dyYXBwZXI7CisgICAgICAgIGMtPnNhb19lZGdlX2ZpbHRlclsyXSAgICAgICAgICA9IGZmX2hldmNfc2FvX2VkZ2VfZmlsdGVyX25lb25fOF93cmFwcGVyOworICAgICAgICBjLT5zYW9fZWRnZV9maWx0ZXJbM10gICAgICAgICAgPSBmZl9oZXZjX3Nhb19lZGdlX2ZpbHRlcl9uZW9uXzhfd3JhcHBlcjsKKyAgICAgICAgYy0+c2FvX2VkZ2VfZmlsdGVyWzRdICAgICAgICAgID0gZmZfaGV2Y19zYW9fZWRnZV9maWx0ZXJfbmVvbl84X3dyYXBwZXI7CisgICAgICAgIGMtPmFkZF9yZXNpZHVhbFswXSAgICAgICAgICAgICA9IGZmX2hldmNfYWRkX3Jlc2lkdWFsXzR4NF84X25lb247CisgICAgICAgIGMtPmFkZF9yZXNpZHVhbFsxXSAgICAgICAgICAgICA9IGZmX2hldmNfYWRkX3Jlc2lkdWFsXzh4OF84X25lb247CisgICAgICAgIGMtPmFkZF9yZXNpZHVhbFsyXSAgICAgICAgICAgICA9IGZmX2hldmNfYWRkX3Jlc2lkdWFsXzE2eDE2XzhfbmVvbjsKKyAgICAgICAgYy0+YWRkX3Jlc2lkdWFsWzNdICAgICAgICAgICAgID0gZmZfaGV2Y19hZGRfcmVzaWR1YWxfMzJ4MzJfOF9uZW9uOworICAgICAgICBjLT5pZGN0X2RjWzBdICAgICAgICAgICAgICAgICAgPSBmZl9oZXZjX2lkY3RfNHg0X2RjXzhfbmVvbjsKKyAgICAgICAgYy0+aWRjdF9kY1sxXSAgICAgICAgICAgICAgICAgID0gZmZfaGV2Y19pZGN0Xzh4OF9kY184X25lb247CisgICAgICAgIGMtPmlkY3RfZGNbMl0gICAgICAgICAgICAgICAgICA9IGZmX2hldmNfaWRjdF8xNngxNl9kY184X25lb247CisgICAgICAgIGMtPmlkY3RfZGNbM10gICAgICAgICAgICAgICAgICA9IGZmX2hldmNfaWRjdF8zMngzMl9kY184X25lb247CisgICAgICAgIGMtPmlkY3RbMF0gICAgICAgICAgICAgICAgICAgICA9IGZmX2hldmNfaWRjdF80eDRfOF9uZW9uOworICAgICAgICBjLT5pZGN0WzFdICAgICAgICAgICAgICAgICAgICAgPSBmZl9oZXZjX2lkY3RfOHg4XzhfbmVvbjsKKyAgICAgICAgYy0+aWRjdFsyXSAgICAgICAgICAgICAgICAgICAgID0gZmZfaGV2Y19pZGN0XzE2eDE2XzhfbmVvbjsKKyAgICAgICAgYy0+aWRjdFszXSAgICAgICAgICAgICAgICAgICAgID0gZmZfaGV2Y19pZGN0XzMyeDMyXzhfbmVvbjsKKyAgICAgICAgYy0+dHJhbnNmb3JtXzR4NF9sdW1hICAgICAgICAgID0gZmZfaGV2Y190cmFuc2Zvcm1fbHVtYV80eDRfbmVvbl84OwogICAgICAgICBwdXRfaGV2Y19xcGVsX25lb25bMV1bMF0gICAgICAgPSBmZl9oZXZjX3B1dF9xcGVsX3YxX25lb25fODsKICAgICAgICAgcHV0X2hldmNfcXBlbF9uZW9uWzJdWzBdICAgICAgID0gZmZfaGV2Y19wdXRfcXBlbF92Ml9uZW9uXzg7CiAgICAgICAgIHB1dF9oZXZjX3FwZWxfbmVvblszXVswXSAgICAgICA9IGZmX2hldmNfcHV0X3FwZWxfdjNfbmVvbl84OwpAQCAtMjIxLDQgKzMwMCwyMSBAQAogICAgICAgICBjLT5wdXRfaGV2Y19xcGVsX3VuaVs4XVswXVswXSAgPSBmZl9oZXZjX3B1dF9xcGVsX3V3X3BpeGVsc193NDhfbmVvbl84OwogICAgICAgICBjLT5wdXRfaGV2Y19xcGVsX3VuaVs5XVswXVswXSAgPSBmZl9oZXZjX3B1dF9xcGVsX3V3X3BpeGVsc193NjRfbmVvbl84OwogICAgIH0KKworICAgIGlmIChiaXRfZGVwdGggPT0gMTApIHsKKyAgICAgICAgYy0+YWRkX3Jlc2lkdWFsWzBdID0gZmZfaGV2Y19hZGRfcmVzaWR1YWxfNHg0XzEwX25lb247CisgICAgICAgIGMtPmFkZF9yZXNpZHVhbFsxXSA9IGZmX2hldmNfYWRkX3Jlc2lkdWFsXzh4OF8xMF9uZW9uOworICAgICAgICBjLT5hZGRfcmVzaWR1YWxbMl0gPSBmZl9oZXZjX2FkZF9yZXNpZHVhbF8xNngxNl8xMF9uZW9uOworICAgICAgICBjLT5hZGRfcmVzaWR1YWxbM10gPSBmZl9oZXZjX2FkZF9yZXNpZHVhbF8zMngzMl8xMF9uZW9uOworCisgICAgICAgIGMtPmlkY3RfZGNbMF0gPSBmZl9oZXZjX2lkY3RfNHg0X2RjXzEwX25lb247CisgICAgICAgIGMtPmlkY3RfZGNbMV0gPSBmZl9oZXZjX2lkY3RfOHg4X2RjXzEwX25lb247CisgICAgICAgIGMtPmlkY3RfZGNbMl0gPSBmZl9oZXZjX2lkY3RfMTZ4MTZfZGNfMTBfbmVvbjsKKyAgICAgICAgYy0+aWRjdF9kY1szXSA9IGZmX2hldmNfaWRjdF8zMngzMl9kY18xMF9uZW9uOworCisgICAgICAgIGMtPmlkY3RbMF0gPSBmZl9oZXZjX2lkY3RfNHg0XzEwX25lb247CisgICAgICAgIGMtPmlkY3RbMV0gPSBmZl9oZXZjX2lkY3RfOHg4XzEwX25lb247CisgICAgICAgIGMtPmlkY3RbMl0gPSBmZl9oZXZjX2lkY3RfMTZ4MTZfMTBfbmVvbjsKKyAgICAgICAgYy0+aWRjdFszXSA9IGZmX2hldmNfaWRjdF8zMngzMl8xMF9uZW9uOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfcXBlbF9uZW9uLlMgYi9saWJhdmNvZGVjL2FybS9oZXZjZHNwX3FwZWxfbmVvbi5TCmluZGV4IDg2ZjkyY2YuLmNhYTZlZmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL2hldmNkc3BfcXBlbF9uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9xcGVsX25lb24uUwpAQCAtNjY3LDc2ICs2NjcsNzYgQEAKIAogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gxdjFfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzEgcXBlbF9maWx0ZXJfMV8zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8xLCBxcGVsX2ZpbHRlcl8xXzMyYgogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gydjFfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzIgcXBlbF9maWx0ZXJfMV8zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8yLCBxcGVsX2ZpbHRlcl8xXzMyYgogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gzdjFfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzMgcXBlbF9maWx0ZXJfMV8zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8zLCBxcGVsX2ZpbHRlcl8xXzMyYgogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gxdjJfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzEgcXBlbF9maWx0ZXJfMl8zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8xLCBxcGVsX2ZpbHRlcl8yXzMyYgogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gydjJfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzIgcXBlbF9maWx0ZXJfMl8zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8yLCBxcGVsX2ZpbHRlcl8yXzMyYgogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gzdjJfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzMgcXBlbF9maWx0ZXJfMl8zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8zLCBxcGVsX2ZpbHRlcl8yXzMyYgogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gxdjNfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzEgcXBlbF9maWx0ZXJfM18zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8xLCBxcGVsX2ZpbHRlcl8zXzMyYgogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gydjNfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzIgcXBlbF9maWx0ZXJfM18zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8yLCBxcGVsX2ZpbHRlcl8zXzMyYgogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9oZXZjX3B1dF9xcGVsX2gzdjNfbmVvbl84LCBleHBvcnQ9MQotICAgICAgICBoZXZjX3B1dF9xcGVsX2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzMgcXBlbF9maWx0ZXJfM18zMmIKKyAgICAgICAgaGV2Y19wdXRfcXBlbF9oWHZZX25lb25fOCBxcGVsX2ZpbHRlcl8zLCBxcGVsX2ZpbHRlcl8zXzMyYgogZW5kZnVuYwogCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDF2MV9uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMSBxcGVsX2ZpbHRlcl8xXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzEsIHFwZWxfZmlsdGVyXzFfMzJiCiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDJ2MV9uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMiBxcGVsX2ZpbHRlcl8xXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzIsIHFwZWxfZmlsdGVyXzFfMzJiCiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDN2MV9uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMyBxcGVsX2ZpbHRlcl8xXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzMsIHFwZWxfZmlsdGVyXzFfMzJiCiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDF2Ml9uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMSBxcGVsX2ZpbHRlcl8yXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzEsIHFwZWxfZmlsdGVyXzJfMzJiCiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDJ2Ml9uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMiBxcGVsX2ZpbHRlcl8yXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzIsIHFwZWxfZmlsdGVyXzJfMzJiCiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDN2Ml9uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMyBxcGVsX2ZpbHRlcl8yXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzMsIHFwZWxfZmlsdGVyXzJfMzJiCiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDF2M19uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMSBxcGVsX2ZpbHRlcl8zXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzEsIHFwZWxfZmlsdGVyXzNfMzJiCiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDJ2M19uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMiBxcGVsX2ZpbHRlcl8zXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzIsIHFwZWxfZmlsdGVyXzNfMzJiCiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX2hldmNfcHV0X3FwZWxfdXdfaDN2M19uZW9uXzgsIGV4cG9ydD0xCi0gICAgICAgIGhldmNfcHV0X3FwZWxfdXdfaFh2WV9uZW9uXzggcXBlbF9maWx0ZXJfMyBxcGVsX2ZpbHRlcl8zXzMyYgorICAgICAgICBoZXZjX3B1dF9xcGVsX3V3X2hYdllfbmVvbl84IHFwZWxfZmlsdGVyXzMsIHFwZWxfZmlsdGVyXzNfMzJiCiBlbmRmdW5jCiAKIC5tYWNybyBpbml0X3B1dF9waXhlbHMKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL2hldmNkc3Bfc2FvX25lb24uUyBiL2xpYmF2Y29kZWMvYXJtL2hldmNkc3Bfc2FvX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDcxNjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hcm0vaGV2Y2RzcF9zYW9fbmVvbi5TCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IE1lbmcgV2FuZyA8d2FuZ21lbmcua2lkc0BieXRlZGFuY2UuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorI2luY2x1ZGUgIm5lb24uUyIKKworZnVuY3Rpb24gZmZfaGV2Y19zYW9fYmFuZF9maWx0ZXJfbmVvbl84LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgIHtyNC1yMTB9CisgICAgICAgIGxkciAgICAgcjUsICBbc3AsICMyOF0gICAvLyB3aWR0aAorICAgICAgICBsZHIgICAgIHI0LCAgW3NwLCAjMzJdICAgLy8gaGVpZ2h0CisgICAgICAgIGxkciAgICAgcjgsICBbc3AsICMzNl0gICAvLyBvZmZzZXRfdGFibGUKKyAgICAgICAgdnB1c2ggICB7ZDgtZDE1fQorICAgICAgICBtb3YgICAgIHIxMiwgIHI0ICAgICAgICAgLy8gcjEyID0gaGVpZ2h0CisgICAgICAgIG1vdiAgICAgcjYsICAgcjAgICAgICAgICAvLyByNiA9IHIwID0gZHN0CisgICAgICAgIG1vdiAgICAgcjcsICAgcjEgICAgICAgICAvLyByNyA9IHIxID0gc3JjCisgICAgICAgIHZsZG0gICAgcjgsICAge3EwLXEzfQorICAgICAgICB2bW92LnUxNiAgICBxMTUsICAjMQorICAgICAgICB2bW92LnU4ICAgICBxMTQsICAjMzIKKzA6ICAgICAgcGxkICAgICAgW3IxXQorICAgICAgICB2bGQxLjggICB7ZDE2fSwgIFtyMV0sIHIzCisgICAgICAgIGNtcCAgICAgIHI1LCAgICAjNAorICAgICAgICBiZXEgICAgICA0ZgorODogICAgICBzdWJzICAgICByNCwgICAgIzEKKyAgICAgICAgdnNoci51OCAgZDE3LCAgIGQxNiwgICMzICAgLy8gaW5kZXggPSBbc3JjPj4zXQorICAgICAgICB2c2hsbC51OCBxOSwgICAgZDE3LCAgIzEgICAvLyBsb3dJbmRleCA9IDIqaW5kZXgKKyAgICAgICAgdmFkZC51MTYgcTExLCAgIHE5LCAgIHExNSAgLy8gaGlnaEluZGV4ID0gKDIqaW5kZXgrMSkgPDwgOAorICAgICAgICB2c2hsLnUxNiBxMTAsICAgcTExLCAgIzggICAvLyBxMTA6IGhpZ2hJbmRleDsgIHE5OiBsb3dJbmRleDsKKyAgICAgICAgdmFkZC51MTYgcTEwLCAgIHE5ICAgICAgICAgLy8gY29tYmluZSBoaWdoIGFuZCBsb3cgaW5kZXg7CisgICAgICAgIC8vIExvb2stdXAgVGFibGUgUm91bmQgMTsgaW5kZXggcmFuZ2U6IDAtMTUKKyAgICAgICAgdnRieC44ICAgZDI0LCAgIHtxMC1xMX0sICAgZDIwCisgICAgICAgIHZ0YnguOCAgIGQyNSwgICB7cTAtcTF9LCAgIGQyMQorICAgICAgICAvLyBMb29rLXVwIFRhYmxlIFJvdW5kIDI7IGluZGV4IHJhbmdlOiAxNi0zMQorICAgICAgICB2c3ViLnU4ICBxMTAsICAgcTE0ICAgICAgICAvLyBMb29rLXVwIHdpdGggOGJpdAorICAgICAgICB2dGJ4LjggICBkMjQsICAge3EyLXEzfSwgICBkMjAKKyAgICAgICAgdnRieC44ICAgZDI1LCAgIHtxMi1xM30sICAgZDIxCisgICAgICAgIHZhZGR3LnU4IHExMywgICBxMTIsICAgICAgIGQxNgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgIGQ4LCAgICAgICAgIHExMworICAgICAgICB2c3QxLjggICAgZDgsICAgW3IwXSwgICAgICByMgorICAgICAgICB2bGQxLjggICB7ZDE2fSwgW3IxXSwgICAgICByMworICAgICAgICBibmUgICAgICA4YgorICAgICAgICBzdWJzICAgICByNSwgICAgIzgKKyAgICAgICAgYmVxICAgICAgOTlmCisgICAgICAgIG1vdiAgICAgIHI0LCAgICByMTIKKyAgICAgICAgYWRkIHI2LCAjOAorICAgICAgICBtb3YgcjAsIHI2CisgICAgICAgIGFkZCByNywgIzgKKyAgICAgICAgbW92IHIxLCByNworICAgICAgICBiICAgICAgICAwYgorNDogICAgICBzdWJzICAgICByNCwgICAgIzEKKyAgICAgICAgdnNoci51OCAgZDE3LCAgIGQxNiwgICMzICAvLyBzcmM+PjMKKyAgICAgICAgdnNobGwudTggcTksICAgIGQxNywgICMxICAgLy8gbG93SW5kZXggPSAyKmluZGV4CisgICAgICAgIHZhZGQudTE2IHExMSwgICBxOSwgICBxMTUgIC8vIGhpZ2hJbmRleCA9ICgyKmluZGV4KzEpIDw8IDgKKyAgICAgICAgdnNobC51MTYgcTEwLCAgIHExMSwgICM4ICAgLy8gcTEwOiBoaWdoSW5kZXg7ICBxOTogbG93SW5kZXg7CisgICAgICAgIHZhZGQudTE2IHExMCwgICBxOSAgICAgICAgIC8vIGNvbWJpbmUgaGlnaCBhbmQgbG93IGluZGV4OworICAgICAgICAvLyBMb29rLXVwIFRhYmxlIFJvdW5kIDE7IGluZGV4IHJhbmdlOiAwLTE1CisgICAgICAgIHZ0YnguOCAgIGQyNCwgICB7cTAtcTF9LCAgIGQyMAorICAgICAgICB2dGJ4LjggICBkMjUsICAge3EwLXExfSwgICBkMjEKKyAgICAgICAgLy8gTG9vay11cCBUYWJsZSBSb3VuZCAyOyBpbmRleCByYW5nZTogMTYtMzIKKyAgICAgICAgdnN1Yi51OCAgcTEwLCAgIHExNCAgICAgICAgLy8gTG9vay11cCB3aXRoIDhiaXQKKyAgICAgICAgdnRieC44ICAgZDI0LCAgIHtxMi1xM30sICAgZDIwCisgICAgICAgIHZ0YnguOCAgIGQyNSwgICB7cTItcTN9LCAgIGQyMQorICAgICAgICB2YWRkdy51OCBxMTMsICAgcTEyLCAgICAgICBkMTYKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxNCwgICAgICAgcTEzCisgICAgICAgIHZzdDEuMzIgICBkMTRbMF0sICAgIFtyMF0sICAgICByMgorICAgICAgICB2bGQxLjMyICAge2QxNlswXX0sICBbcjFdLCAgICAgcjMKKyAgICAgICAgYm5lICAgICAgNGIKKyAgICAgICAgYiAgICAgICAgOTlmCis5OToKKyAgICAgICAgdnBvcCB7ZDgtZDE1fQorICAgICAgICBwb3AgIHtyNC1yMTB9CisgICAgICAgIGJ4ICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfaGV2Y19zYW9fZWRnZV9maWx0ZXJfbmVvbl84LCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgIHtyNC1yMTF9CisgICAgICAgIGxkciAgICAgcjUsICBbc3AsICMzMl0gICAvLyB3aWR0aAorICAgICAgICBsZHIgICAgIHI0LCAgW3NwLCAjMzZdICAgLy8gaGVpZ2h0CisgICAgICAgIGxkciAgICAgcjgsICBbc3AsICM0MF0gICAvLyBhX3N0cmlkZQorICAgICAgICBsZHIgICAgIHI5LCAgW3NwLCAjNDRdICAgLy8gYl9zdHJpZGUKKyAgICAgICAgbGRyICAgICByMTAsIFtzcCwgIzQ4XSAgIC8vIHNhb19vZmZzZXRfdmFsCisgICAgICAgIGxkciAgICAgcjExLCBbc3AsICM1Ml0gICAvLyBlZGdlX2lkeAorICAgICAgICB2cHVzaCAgIHtkOC1kMTV9CisgICAgICAgIG1vdiAgICAgcjEyLCAgcjQgICAgICAgICAvLyByMTIgPSBoZWlnaHQKKyAgICAgICAgbW92ICAgICByNiwgICByMCAgICAgICAgIC8vIHI2ID0gcjAgPSBkc3QKKyAgICAgICAgbW92ICAgICByNywgICByMSAgICAgICAgIC8vIHI3ID0gcjEgPSBzcmMKKyAgICAgICAgdmxkMS44ICB7ZDB9LCBbcjExXSAgICAgIC8vIGVkZ2VfaWR4IHRhYmVsIGxvYWQgaW4gZDAgNXg4Yml0CisgICAgICAgIHZsZDEuMTYge3ExfSwgW3IxMF0gICAgICAvLyBzYW9fb2Zmc2V0X3ZhbCB0YWJsZSBsb2FkIGluIHExLCA1eDE2Yml0CisgICAgICAgIHZtb3YudTggIGQxLCAgIzIKKyAgICAgICAgdm1vdi51MTYgcTIsICAjMQorMDogICAgICBtb3YgICAgICByMTAsICAgIHIxCisgICAgICAgIGFkZCAgICAgIHIxMCwgICAgcjggICAgICAgICAgIC8vIHNyY1t4ICsgYV9zdHJpZGVdCisgICAgICAgIG1vdiAgICAgIHIxMSwgICAgcjEKKyAgICAgICAgYWRkICAgICAgcjExLCAgICByOSAgICAgICAgICAgLy8gc3JjW3ggKyBiX3N0cmlkZV0KKyAgICAgICAgcGxkICAgICAgW3IxXQorICAgICAgICB2bGQxLjggICB7ZDE2fSwgIFtyMV0sICByMyAgICAvLyBzcmNbeF0gIDh4OGJpdAorICAgICAgICB2bGQxLjggICB7ZDE3fSwgIFtyMTBdLCByMyAgICAvLyBzcmNbeCArIGFfc3RyaWRlXQorICAgICAgICB2bGQxLjggICB7ZDE4fSwgIFtyMTFdLCByMyAgICAvLyBzcmNbeCArIGJfc3RyaWRlXQorICAgICAgICBjbXAgICAgICByNSwgICAgICM0CisgICAgICAgIGJlcSAgICAgIDRmCis4OiAgICAgIHN1YnMgICAgIHI0LCAgICAgIzEKKyAgICAgICAgdmNndC51OCAgZDgsICAgICBkMTYsICAgZDE3CisgICAgICAgIHZzaHIudTggIGQ5LCAgICAgZDgsICAgICM3CisgICAgICAgIHZjbHQudTggIGQ4LCAgICAgZDE2LCAgIGQxNworICAgICAgICB2YWRkLnU4ICBkOCwgICAgIGQ5ICAgICAgICAgICAvLyBkaWZmMAorICAgICAgICB2Y2d0LnU4ICBkMTAsICAgIGQxNiwgICBkMTgKKyAgICAgICAgdnNoci51OCAgZDExLCAgICBkMTAsICAgIzcKKyAgICAgICAgdmNsdC51OCAgZDEwLCAgICBkMTYsICAgZDE4CisgICAgICAgIHZhZGQudTggIGQxMCwgICAgZDExICAgICAgICAgIC8vIGRpZmYxCisgICAgICAgIHZhZGQuczggIGQ4LCAgICAgZDEwCisgICAgICAgIHZhZGQuczggIGQ4LCAgICAgZDEKKyAgICAgICAgdnRieC44ICAgZDksICAgICB7ZDB9LCAgZDggICAgLy8gb2Zmc2V0X3ZhbAorICAgICAgICB2c2hsbC51OCBxNiwgICAgIGQ5LCAgICAjMSAgICAvLyBsb3dJbmRleAorICAgICAgICB2YWRkLnUxNiBxNywgICAgIHE2LCAgICBxMgorICAgICAgICB2c2hsLnUxNiBxMTAsICAgIHE3LCAgICAjOCAgICAvLyBoaWdoSW5kZXgKKyAgICAgICAgdmFkZC51MTYgcTEwLCAgICBxNiAgICAgICAgICAgLy8gY29tYmluZSBsb3dJbmRleCBhbmQgaGlnaEluZGV4LCBvZmZzZXRfdmFsCisgICAgICAgIHZ0YnguOCAgIGQyMiwgICAge3ExfSwgIGQyMAorICAgICAgICB2dGJ4LjggICBkMjMsICAgIHtxMX0sICBkMjEKKyAgICAgICAgdmFkZHcudTggcTEyLCAgICBxMTEsICAgZDE2CisgICAgICAgIHZxbW92dW4uczE2ICAgICAgZDI2LCAgIHExMgorICAgICAgICB2c3QxLjggICBkMjYsICAgIFtyMF0sICByMgorICAgICAgICB2bGQxLjggICB7ZDE2fSwgIFtyMV0sICByMyAgICAvLyBzcmNbeF0gIDh4OGJpdAorICAgICAgICB2bGQxLjggICB7ZDE3fSwgIFtyMTBdLCByMyAgICAvLyBzcmNbeCArIGFfc3RyaWRlXQorICAgICAgICB2bGQxLjggICB7ZDE4fSwgIFtyMTFdLCByMyAgICAvLyBzcmNbeCArIGJfc3RyaWRlXQorICAgICAgICBibmUgICAgICA4YgorICAgICAgICBzdWJzICAgICByNSwgICAgICM4CisgICAgICAgIGJlcSAgICAgIDk5ZgorICAgICAgICBtb3YgICAgICByNCwgICAgIHIxMgorICAgICAgICBhZGQgICAgICByNiwgICAgICM4CisgICAgICAgIG1vdiAgICAgIHIwLCAgICAgcjYKKyAgICAgICAgYWRkICAgICAgcjcsICAgICAjOAorICAgICAgICBtb3YgICAgICByMSwgICAgIHI3CisgICAgICAgIGIgICAgICAgIDBiCis0OiAgICAgIHN1YnMgICAgIHI0LCAgICAjMQorICAgICAgICB2Y2d0LnU4ICBkOCwgICAgIGQxNiwgICBkMTcKKyAgICAgICAgdnNoci51OCAgZDksICAgICBkOCwgICAgIzcKKyAgICAgICAgdmNsdC51OCAgZDgsICAgICBkMTYsICAgZDE3CisgICAgICAgIHZhZGQudTggIGQ4LCAgICAgZDkgICAgICAgICAgIC8vIGRpZmYwCisgICAgICAgIHZjZ3QudTggIGQxMCwgICAgZDE2LCAgIGQxOAorICAgICAgICB2c2hyLnU4ICBkMTEsICAgIGQxMCwgICAjNworICAgICAgICB2Y2x0LnU4ICBkMTAsICAgIGQxNiwgICBkMTgKKyAgICAgICAgdmFkZC51OCAgZDEwLCAgICBkMTEgICAgICAgICAgLy8gZGlmZjEKKyAgICAgICAgdmFkZC5zOCAgZDgsICAgICBkMTAKKyAgICAgICAgdmFkZC5zOCAgZDgsICAgICBkMQorICAgICAgICB2dGJ4LjggICBkOSwgICAgIHtkMH0sICBkOCAgICAvLyBvZmZzZXRfdmFsCisgICAgICAgIHZzaGxsLnU4IHE2LCAgICAgZDksICAgICMxICAgIC8vIGxvd0luZGV4CisgICAgICAgIHZhZGQudTE2IHE3LCAgICAgcTYsICAgIHEyCisgICAgICAgIHZzaGwudTE2IHExMCwgICAgcTcsICAgICM4ICAgIC8vIGhpZ2hJbmRleAorICAgICAgICB2YWRkLnUxNiBxMTAsICAgIHE2ICAgICAgICAgICAvLyBjb21iaW5lIGxvd0luZGV4IGFuZCBoaWdoSW5kZXgsIG9mZnNldF92YWwKKyAgICAgICAgdnRieC44ICAgZDIyLCAgICB7cTF9LCAgZDIwCisgICAgICAgIHZ0YnguOCAgIGQyMywgICAge3ExfSwgIGQyMQorICAgICAgICB2YWRkdy51OCBxMTIsICAgIHExMSwgICBkMTYKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgICBkMjYsICAgcTEyCisgICAgICAgIHZzdDEuMzIgIGQyNlswXSwgW3IwXSwgIHIyCisgICAgICAgIHZsZDEuMzIgICB7ZDE2WzBdfSwgIFtyMV0sICByMworICAgICAgICB2bGQxLjMyICAge2QxN1swXX0sICBbcjEwXSwgcjMgICAgLy8gc3JjW3ggKyBhX3N0cmlkZV0KKyAgICAgICAgdmxkMS4zMiAgIHtkMThbMF19LCAgW3IxMV0sIHIzICAgIC8vIHNyY1t4ICsgYl9zdHJpZGVdCisgICAgICAgIGJuZSAgICAgIDRiCisgICAgICAgIGIgICAgICAgIDk5ZgorOTk6CisgICAgICAgIHZwb3Age2Q4LWQxNX0KKyAgICAgICAgcG9wICB7cjQtcjExfQorICAgICAgICBieCAgIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2FybS5TIGIvbGliYXZjb2RlYy9hcm0vaHBlbGRzcF9hcm0uUwppbmRleCAyMTlmNzkzLi42ZjNlM2ZiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9ocGVsZHNwX2FybS5TCisrKyBiL2xpYmF2Y29kZWMvYXJtL2hwZWxkc3BfYXJtLlMKQEAgLTkwLDcgKzkwLDcgQEAKIAogQCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzMTZfYXJtLCBleHBvcnQ9MSwgYWxpZ249NQotICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKKyAgICAgICAgQCB2b2lkIGZ1bmModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCiAgICAgICAgIEAgYmxvY2sgPSB3b3JkIGFsaWduZWQsIHBpeGxlcyA9IHVuYWxpZ25lZAogICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQogICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSwgbHJ9CkBAIC0xNDEsNyArMTQxLDcgQEAKIAogQCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOF9hcm0sIGV4cG9ydD0xLCBhbGlnbj01Ci0gICAgICAgIEAgdm9pZCBmdW5jKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIGludCBsaW5lX3NpemUsIGludCBoKQorICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKICAgICAgICAgQCBibG9jayA9IHdvcmQgYWxpZ25lZCwgcGl4bGVzID0gdW5hbGlnbmVkCiAgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCiAgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjUsbHJ9CkBAIC0xOTIsNyArMTkyLDcgQEAKIAogQCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOF94Ml9hcm0sIGV4cG9ydD0xLCBhbGlnbj01Ci0gICAgICAgIEAgdm9pZCBmdW5jKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIGludCBsaW5lX3NpemUsIGludCBoKQorICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKICAgICAgICAgQCBibG9jayA9IHdvcmQgYWxpZ25lZCwgcGl4bGVzID0gdW5hbGlnbmVkCiAgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCiAgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjEwLGxyfQpAQCAtMjUwLDcgKzI1MCw3IEBACiBlbmRmdW5jCiAKIGZ1bmN0aW9uIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml9hcm0sIGV4cG9ydD0xLCBhbGlnbj01Ci0gICAgICAgIEAgdm9pZCBmdW5jKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIGludCBsaW5lX3NpemUsIGludCBoKQorICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKICAgICAgICAgQCBibG9jayA9IHdvcmQgYWxpZ25lZCwgcGl4bGVzID0gdW5hbGlnbmVkCiAgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCiAgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjEwLGxyfQpAQCAtMzEwLDcgKzMxMCw3IEBACiAKIEAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogZnVuY3Rpb24gZmZfcHV0X3BpeGVsczhfeTJfYXJtLCBleHBvcnQ9MSwgYWxpZ249NQotICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKKyAgICAgICAgQCB2b2lkIGZ1bmModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCiAgICAgICAgIEAgYmxvY2sgPSB3b3JkIGFsaWduZWQsIHBpeGxlcyA9IHVuYWxpZ25lZAogICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQogICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSxscn0KQEAgLTQwNyw3ICs0MDcsNyBAQAogZW5kZnVuYwogCiBmdW5jdGlvbiBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfYXJtLCBleHBvcnQ9MSwgYWxpZ249NQotICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKKyAgICAgICAgQCB2b2lkIGZ1bmModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCiAgICAgICAgIEAgYmxvY2sgPSB3b3JkIGFsaWduZWQsIHBpeGxlcyA9IHVuYWxpZ25lZAogICAgICAgICBwbGQgICAgICAgICAgICAgW3IxXQogICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXIxMSxscn0KQEAgLTU3Myw3ICs1NzMsNyBAQAogLmVuZG0KIAogZnVuY3Rpb24gZmZfcHV0X3BpeGVsczhfeHkyX2FybSwgZXhwb3J0PTEsIGFsaWduPTUKLSAgICAgICAgQCB2b2lkIGZ1bmModWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgaW50IGxpbmVfc2l6ZSwgaW50IGgpCisgICAgICAgIEAgdm9pZCBmdW5jKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQogICAgICAgICBAIGJsb2NrID0gd29yZCBhbGlnbmVkLCBwaXhsZXMgPSB1bmFsaWduZWQKICAgICAgICAgcGxkICAgICAgICAgICAgIFtyMV0KICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsbHJ9IEAgUjE0IGlzIGFsc28gY2FsbGVkIExSCkBAIC01ODgsNyArNTg4LDcgQEAKIGVuZGZ1bmMKIAogZnVuY3Rpb24gZmZfcHV0X25vX3JuZF9waXhlbHM4X3h5Ml9hcm0sIGV4cG9ydD0xLCBhbGlnbj01Ci0gICAgICAgIEAgdm9pZCBmdW5jKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIGludCBsaW5lX3NpemUsIGludCBoKQorICAgICAgICBAIHZvaWQgZnVuYyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKICAgICAgICAgQCBibG9jayA9IHdvcmQgYWxpZ25lZCwgcGl4bGVzID0gdW5hbGlnbmVkCiAgICAgICAgIHBsZCAgICAgICAgICAgICBbcjFdCiAgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjExLGxyfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vaWRjdC5oIGIvbGliYXZjb2RlYy9hcm0vaWRjdC5oCmluZGV4IDM5Y2VmM2EuLjZjNzlhNjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL2lkY3QuaAorKysgYi9saWJhdmNvZGVjL2FybS9pZGN0LmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpZm5kZWYgQVZDT0RFQ19BUk1fSURDVF9ICiAjZGVmaW5lIEFWQ09ERUNfQVJNX0lEQ1RfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIHZvaWQgZmZfal9yZXZfZGN0X2FybShpbnQxNl90ICpkYXRhKTsKQEAgLTI2LDE1ICsyNywxNSBAQAogdm9pZCBmZl9zaW1wbGVfaWRjdF9hcm0oaW50MTZfdCAqZGF0YSk7CiAKIHZvaWQgZmZfc2ltcGxlX2lkY3RfYXJtdjV0ZShpbnQxNl90ICpkYXRhKTsKLXZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X2FybXY1dGUodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9hcm12NXRlKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfYXJtdjV0ZSh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2FybXY1dGUodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7CiAKIHZvaWQgZmZfc2ltcGxlX2lkY3RfYXJtdjYoaW50MTZfdCAqZGF0YSk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9hcm12Nih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKLXZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2FybXY2KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfYXJtdjYodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9hcm12Nih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKIAogdm9pZCBmZl9zaW1wbGVfaWRjdF9uZW9uKGludDE2X3QgKmRhdGEpOwotdm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfbmVvbih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKLXZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9uZW9uKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfbmVvbih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfQVJNX0lEQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vaWRjdGRzcF9pbml0X2FybS5jIGIvbGliYXZjb2RlYy9hcm0vaWRjdGRzcF9pbml0X2FybS5jCmluZGV4IDAwNjhlM2YuLmViYzkwZTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL2lkY3Rkc3BfaW5pdF9hcm0uYworKysgYi9saWJhdmNvZGVjL2FybS9pZGN0ZHNwX2luaXRfYXJtLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgpAQCAtMzQsMjggKzM1LDMyIEBACiAKIC8qIFhYWDogdGhvc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBzdXBwcmVzc2VkIEFTQVAgd2hlbiBhbGwgSURDVHMgYXJlCiAgKiBjb252ZXJ0ZWQgKi8KLXN0YXRpYyB2b2lkIGpfcmV2X2RjdF9hcm1fcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQorc3RhdGljIHZvaWQgal9yZXZfZGN0X2FybV9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrKQogewogICAgIGZmX2pfcmV2X2RjdF9hcm0oYmxvY2spOwotICAgIGZmX3B1dF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKKyAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWRfYyhibG9jaywgZGVzdCwgbGluZV9zaXplKTsKIH0KIAotc3RhdGljIHZvaWQgal9yZXZfZGN0X2FybV9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCBqX3Jldl9kY3RfYXJtX2FkZCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgZmZfal9yZXZfZGN0X2FybShibG9jayk7Ci0gICAgZmZfYWRkX3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9hcm0oYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHNpbXBsZV9pZGN0X2FybV9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCBzaW1wbGVfaWRjdF9hcm1fcHV0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrKQogewogICAgIGZmX3NpbXBsZV9pZGN0X2FybShibG9jayk7Ci0gICAgZmZfcHV0X3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworICAgIGZmX3B1dF9waXhlbHNfY2xhbXBlZF9jKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOwogfQogCi1zdGF0aWMgdm9pZCBzaW1wbGVfaWRjdF9hcm1fYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQorc3RhdGljIHZvaWQgc2ltcGxlX2lkY3RfYXJtX2FkZCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaykKIHsKICAgICBmZl9zaW1wbGVfaWRjdF9hcm0oYmxvY2spOwotICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKKyAgICBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfYXJtKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOwogfQogCiBhdl9jb2xkIHZvaWQgZmZfaWRjdGRzcF9pbml0X2FybShJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vbWxwZHNwX2FybXY2LlMgYi9saWJhdmNvZGVjL2FybS9tbHBkc3BfYXJtdjYuUwppbmRleCBkOThmODA3Li5iN2VjZjZjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9tbHBkc3BfYXJtdjYuUworKysgYi9saWJhdmNvZGVjL2FybS9tbHBkc3BfYXJtdjYuUwpAQCAtMjQwLDcgKzI0MCw3IEBACiBEQVQ0ICAgIC5yZXEgICAgdjUKIERBVDUgICAgLnJlcSAgICB2NgogREFUNiAgICAucmVxICAgIHNsIC8vIHVzZSB0aGVzZSByYXRoZXIgdGhhbiB0aGUgb3RoZXJ3aXNlIHVudXNlZAotREFUNyAgICAucmVxICAgIGZwIC8vIGlwIGFuZCBsciBzbyB0aGF0IHdlIGNhbiBsb2FkIHRoZW0gdXNpbmYgTERSRAorREFUNyAgICAucmVxICAgIGZwIC8vIGlwIGFuZCBsciBzbyB0aGF0IHdlIGNhbiBsb2FkIHRoZW0gdXNpbmcgTERSRAogCiAgLm1hY3JvIG91dHB1dDR3b3JkcyAgdGFpbCwgaGVhZCwgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCBwb2ludGVyX2RlYWQ9MAogICAuaWYgXGhlYWQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL21wZWdhdWRpb2RzcF9pbml0X2FybS5jIGIvbGliYXZjb2RlYy9hcm0vbXBlZ2F1ZGlvZHNwX2luaXRfYXJtLmMKaW5kZXggOThlMGM4YS4uZDg3YmQyNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vbXBlZ2F1ZGlvZHNwX2luaXRfYXJtLmMKKysrIGIvbGliYXZjb2RlYy9hcm0vbXBlZ2F1ZGlvZHNwX2luaXRfYXJtLmMKQEAgLTI2LDcgKzI2LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKIAogdm9pZCBmZl9tcGFkc3BfYXBwbHlfd2luZG93X2ZpeGVkX2FybXY2KGludDMyX3QgKnN5bnRoX2J1ZiwgaW50MzJfdCAqd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyLCBpbnQxNl90ICpvdXQsIGludCBpbmNyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpdGhlciwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgaW5jcik7CiAKIGF2X2NvbGQgdm9pZCBmZl9tcGFkc3BfaW5pdF9hcm0oTVBBRFNQQ29udGV4dCAqcykKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm12NXRlLmMgYi9saWJhdmNvZGVjL2FybS9tcGVndmlkZW9fYXJtdjV0ZS5jCmluZGV4IDg4YzVmNGYuLmUyMGJiNGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL21wZWd2aWRlb19hcm12NXRlLmMKKysrIGIvbGliYXZjb2RlYy9hcm0vbXBlZ3ZpZGVvX2FybXY1dGUuYwpAQCAtMjksNyArMjksNyBAQAogCiAjaWZkZWYgRU5BQkxFX0FSTV9URVNUUwogLyoqCi0gKiBoMjYzIGRlcXVhbnRpemVyIHN1cHBsZW1lbnRhcnkgZnVuY3Rpb24sIGl0IGlzIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGFuZCBuZWVkcyB0bworICogSC4yNjMgZGVxdWFudGl6ZXIgc3VwcGxlbWVudGFyeSBmdW5jdGlvbiwgaXQgaXMgcGVyZm9ybWFuY2UgY3JpdGljYWwgYW5kIG5lZWRzIHRvCiAgKiBoYXZlIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMgZm9yIGVhY2ggYXJjaGl0ZWN0dXJlLiBJcyBhbHNvIHVzZWQgYXMgYSByZWZlcmVuY2UKICAqIGltcGxlbWVudGF0aW9uIGluIHJlZ3Jlc3Npb24gdGVzdHMKICAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vbmVvbnRlc3QuYyBiL2xpYmF2Y29kZWMvYXJtL25lb250ZXN0LmMKaW5kZXggYTNiNWI4ZS4uZjljMGRiZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vbmVvbnRlc3QuYworKysgYi9saWJhdmNvZGVjL2FybS9uZW9udGVzdC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9uZW9udGVzdC5oIgogCiB3cmFwKGF2Y29kZWNfb3BlbjIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgIEFWQ29kZWMgKmNvZGVjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjLAogICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpKQogewogICAgIHRlc3RuZW9uY2xvYmJlcnMoYXZjb2RlY19vcGVuMiwgYXZjdHgsIGNvZGVjLCBvcHRpb25zKTsKQEAgLTc3LDMgKzc3LDIzIEBACiB7CiAgICAgdGVzdG5lb25jbG9iYmVycyhhdmNvZGVjX2VuY29kZV92aWRlbzIsIGF2Y3R4LCBhdnBrdCwgZnJhbWUsIGdvdF9wYWNrZXRfcHRyKTsKIH0KKword3JhcChhdmNvZGVjX3NlbmRfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfc2VuZF9wYWNrZXQsIGF2Y3R4LCBhdnBrdCk7Cit9CisKK3dyYXAoYXZjb2RlY19yZWNlaXZlX3BhY2tldChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCkpCit7CisgICAgdGVzdG5lb25jbG9iYmVycyhhdmNvZGVjX3JlY2VpdmVfcGFja2V0LCBhdmN0eCwgYXZwa3QpOworfQorCit3cmFwKGF2Y29kZWNfc2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKSkKK3sKKyAgICB0ZXN0bmVvbmNsb2JiZXJzKGF2Y29kZWNfc2VuZF9mcmFtZSwgYXZjdHgsIGZyYW1lKTsKK30KKword3JhcChhdmNvZGVjX3JlY2VpdmVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkpCit7CisgICAgdGVzdG5lb25jbG9iYmVycyhhdmNvZGVjX3JlY2VpdmVfZnJhbWUsIGF2Y3R4LCBmcmFtZSk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9waXhibG9ja2RzcF9pbml0X2FybS5jIGIvbGliYXZjb2RlYy9hcm0vcGl4YmxvY2tkc3BfaW5pdF9hcm0uYwppbmRleCA3NmQ3NTA5Li41OWQyYjQ5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9waXhibG9ja2RzcF9pbml0X2FybS5jCisrKyBiL2xpYmF2Y29kZWMvYXJtL3BpeGJsb2NrZHNwX2luaXRfYXJtLmMKQEAgLTI0LDkgKzI0LDEwIEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9waXhibG9ja2RzcC5oIgogCi12b2lkIGZmX2dldF9waXhlbHNfYXJtdjYoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2dldF9waXhlbHNfYXJtdjYoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKIHZvaWQgZmZfZGlmZl9waXhlbHNfYXJtdjYoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzMiwgaW50IHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyLCBwdHJkaWZmX3Qgc3RyaWRlKTsKIAogYXZfY29sZCB2b2lkIGZmX3BpeGJsb2NrZHNwX2luaXRfYXJtKFBpeGJsb2NrRFNQQ29udGV4dCAqYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9yZGZ0X2luaXRfYXJtLmMgYi9saWJhdmNvZGVjL2FybS9yZGZ0X2luaXRfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1ZDhiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYXJtL3JkZnRfaW5pdF9hcm0uYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9yZGZ0LmgiCisKK3ZvaWQgZmZfcmRmdF9jYWxjX25lb24oc3RydWN0IFJERlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKnopOworCithdl9jb2xkIHZvaWQgZmZfcmRmdF9pbml0X2FybShSREZUQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKQorICAgICAgICBzLT5yZGZ0X2NhbGMgICAgPSBmZl9yZGZ0X2NhbGNfbmVvbjsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL3JkZnRfbmVvbi5TIGIvbGliYXZjb2RlYy9hcm0vcmRmdF9uZW9uLlMKaW5kZXggNzgxZDk3Ni4uZWFiYjkyYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vcmRmdF9uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vcmRmdF9uZW9uLlMKQEAgLTMwLDE4ICszMCwyMSBAQAogCiAgICAgICAgIGxzbHMgICAgICAgICAgICByNiwgIHI2LCAgIzMxCiAgICAgICAgIGJuZSAgICAgICAgICAgICAxZgotICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMyMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMyNAogICAgICAgICBibCAgICAgICAgICAgICAgWChmZl9mZnRfcGVybXV0ZV9uZW9uKQotICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMyMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMyNAogICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByNQogICAgICAgICBibCAgICAgICAgICAgICAgWChmZl9mZnRfY2FsY19uZW9uKQogMToKICAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3I0LCAjMF0gICAgICAgICAgIEAgbmJpdHMKICAgICAgICAgbW92ICAgICAgICAgICAgIHIyLCAgIzEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI4LCAgW3I0LCAjMjBdICAgICAgICAgIEAgbmVnYXRpdmVfc2luCiAgICAgICAgIGxzbCAgICAgICAgICAgICByMTIsIHIyLCAgcjEyCiAgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHI1LCAgIzgKKyAgICAgICAgbHNsICAgICAgICAgICAgIHI4LCAgcjgsICAjMzEKICAgICAgICAgYWRkICAgICAgICAgICAgIHIxLCAgcjUsICByMTIsIGxzbCAjMgogICAgICAgICBsc3IgICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIHZkdXAuMzIgICAgICAgICBkMjYsIHI4CiAgICAgICAgIGxkciAgICAgICAgICAgICByMiwgIFtyNCwgIzEyXSAgICAgICAgICBAIHRjb3MKICAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCAjMgogICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbcjQsICMxNl0gICAgICAgICAgQCB0c2luCkBAIC01NSw2ICs1OCw3IEBACiAgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDV9LCAgICAgW3IzLDo2NF0hICAgICBAIHRzaW5baV0KICAgICAgICAgdm1vdi5mMzIgICAgICAgIGQxOCwgIzAuNSAgICAgICAgICAgICAgIEAgazEKICAgICAgICAgdmR1cC4zMiAgICAgICAgIGQxOSwgcjYKKyAgICAgICAgdmVvciAgICAgICAgICAgIGQ1LCAgZDI2LCBkNQogICAgICAgICBwbGQgICAgICAgICAgICAgW3IwLCAjMzJdCiAgICAgICAgIHZlb3IgICAgICAgICAgICBkMTksIGQxOCwgZDE5ICAgICAgICAgICBAIGsyCiAgICAgICAgIHZtb3YuaTMyICAgICAgICBkMTYsICMwCkBAIC05MCw2ICs5NCw3IEBACiAgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDV9LCAgICAgW3IzLDo2NF0hICAgICBAICB0c2luW2ldCiAgICAgICAgIHZlb3IgICAgICAgICAgICBkMjQsIGQyMiwgZDE3ICAgICAgICAgICBAICBldi5yZSwtZXYuaW0KICAgICAgICAgdnJldjY0LjMyICAgICAgIGQzLCAgZDIzICAgICAgICAgICAgICAgIEAgIG9kLnJlLCBvZC5pbQorICAgICAgICB2ZW9yICAgICAgICAgICAgZDUsIGQyNiwgZDUKICAgICAgICAgcGxkICAgICAgICAgICAgIFtyMiwgIzMyXQogICAgICAgICB2ZW9yICAgICAgICAgICAgZDIsICBkMywgIGQxNiAgICAgICAgICAgQCAtb2QucmUsIG9kLmltCiAgICAgICAgIHBsZCAgICAgICAgICAgICBbcjMsICMzMl0KQEAgLTE0MCwxMCArMTQ1LDEwIEBACiAKICAgICAgICAgdm11bC5mMzIgICAgICAgIGQyMiwgZDIyLCBkMTgKICAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJ9LCAgICBbcjUsOjY0XQotICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMyMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMyNAogICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByNQogICAgICAgICBibCAgICAgICAgICAgICAgWChmZl9mZnRfcGVybXV0ZV9uZW9uKQotICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMyMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMyNAogICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByNQogICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI4LGxyfQogICAgICAgICBiICAgICAgICAgICAgICAgWChmZl9mZnRfY2FsY19uZW9uKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vc2JjZHNwX2FybXY2LlMgYi9saWJhdmNvZGVjL2FybS9zYmNkc3BfYXJtdjYuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWZmODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hcm0vc2JjZHNwX2FybXY2LlMKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBCbHVldG9vdGggbG93LWNvbXBsZXhpdHksIHN1YmJhbmQgY29kZWMgKFNCQykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwICBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBIZW5yeWsgUGxvZXR6IDxoZW5yeWtAcGxvZXR6bGkuY2g+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiAgQnJhZCBNaWRnbGV5IDxibWlkZ2xleUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNCQyBBUk12NiBvcHRpbWl6YXRpb25zLiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzY2hlZHVsZWQgZm9yIEFSTTExIHBpcGVsaW5lLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9zYmNfYW5hbHl6ZV80X2FybXY2LCBleHBvcnQ9MQorICAgICAgICBAIHIwID0gaW4sIHIxID0gb3V0LCByMiA9IGNvbnN0cworICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCByMy1yNywgbHJ9CisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjgtcjEyLCByMTR9CisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IwLCAjMF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICMwXQorICAgICAgICBsZHJkICAgICAgICAgICAgcjgsICByOSwgIFtyMCwgIzE2XQorICAgICAgICBsZHJkICAgICAgICAgICAgcjEwLCByMTEsIFtyMiwgIzE2XQorICAgICAgICBtb3YgICAgICAgICAgICAgcjE0LCAjMHg4MDAwCisgICAgICAgIHNtbGFkICAgICAgICAgICByMywgIHI0LCAgcjYsICByMTQKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjUsICByNywgIHIxNAorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMCwgIzMyXQorICAgICAgICBsZHJkICAgICAgICAgICAgcjYsICByNywgIFtyMiwgIzMyXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjMsICByOCwgIHIxMCwgcjMKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjksICByMTEsIHIxMgorICAgICAgICBsZHJkICAgICAgICAgICAgcjgsICByOSwgIFtyMCwgIzQ4XQorICAgICAgICBsZHJkICAgICAgICAgICAgcjEwLCByMTEsIFtyMiwgIzQ4XQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjMsICByNCwgIHI2LCAgcjMKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjUsICByNywgIHIxMgorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMCwgIzY0XQorICAgICAgICBsZHJkICAgICAgICAgICAgcjYsICByNywgIFtyMiwgIzY0XQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjMsICByOCwgIHIxMCwgcjMKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjksICByMTEsIHIxMgorICAgICAgICBsZHJkICAgICAgICAgICAgcjgsICByOSwgIFtyMCwgIzhdCisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjOF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIzLCAgcjQsICByNiwgIHIzICAgICAgICBAIHQxWzBdIGlzIGRvbmUKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjUsICByNywgIHIxMiAgICAgICBAIHQxWzFdIGlzIGRvbmUKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCAgcjUsICBbcjAsICMyNF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICMyNF0KKyAgICAgICAgcGtodGIgICAgICAgICAgIHIzLCAgcjEyLCByMywgYXNyICMxNiAgICBAIGNvbWJpbmUgdDFbMF0gYW5kIHQxWzFdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI4LCAgcjEwLCByMTQKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxNCwgcjksICByMTEsIHIxNAorICAgICAgICBsZHJkICAgICAgICAgICAgcjgsICByOSwgIFtyMCwgIzQwXQorICAgICAgICBsZHJkICAgICAgICAgICAgcjEwLCByMTEsIFtyMiwgIzQwXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByNCwgIHI2LCAgcjEyCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTQsIHI1LCAgcjcsICByMTQKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCAgcjUsICBbcjAsICM1Nl0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICM1Nl0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjgsICByMTAsIHIxMgorICAgICAgICBzbWxhZCAgICAgICAgICAgcjE0LCByOSwgIHIxMSwgcjE0CisgICAgICAgIGxkcmQgICAgICAgICAgICByOCwgIHI5LCAgW3IwLCAjNzJdCisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjNzJdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI0LCAgcjYsICByMTIKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxNCwgcjUsICByNywgIHIxNAorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMiwgIzgwXSAgICAgIEAgc3RhcnQgbG9hZGluZyBjb3MgdGFibGUKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjgsICByMTAsIHIxMiAgICAgICBAIHQxWzJdIGlzIGRvbmUKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxNCwgcjksICByMTEsIHIxNCAgICAgICBAIHQxWzNdIGlzIGRvbmUKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICM4OF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjIsICM5Nl0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIxMCwgcjExLCBbcjIsICMxMDRdICAgICBAIGNvcyB0YWJsZSBmdWxseSBsb2FkZWQKKyAgICAgICAgcGtodGIgICAgICAgICAgIHIxMiwgcjE0LCByMTIsIGFzciAjMTYgICBAIGNvbWJpbmUgdDFbMl0gYW5kIHQxWzNdCisgICAgICAgIHNtdWFkICAgICAgICAgICByNCwgIHIzLCAgcjQKKyAgICAgICAgc211YWQgICAgICAgICAgIHI1LCAgcjMsICByNQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjQsICByMTIsIHI4LCAgcjQKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI1LCAgcjEyLCByOSwgIHI1CisgICAgICAgIHNtdWFkICAgICAgICAgICByNiwgIHIzLCAgcjYKKyAgICAgICAgc211YWQgICAgICAgICAgIHI3LCAgcjMsICByNworICAgICAgICBzbWxhZCAgICAgICAgICAgcjYsICByMTIsIHIxMCwgcjYKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI3LCAgcjEyLCByMTEsIHI3CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjgtcjEyLCByMTR9CisgICAgICAgIHN0bWlhICAgICAgICAgICByMSwge3I0LCByNSwgcjYsIHI3fQorICAgICAgICBwb3AgICAgICAgICAgICAge3IxLCByMy1yNywgcGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3NiY19hbmFseXplXzhfYXJtdjYsIGV4cG9ydD0xCisgICAgICAgIEAgcjAgPSBpbiwgcjEgPSBvdXQsIHIyID0gY29uc3RzCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIHIzLXI3LCBscn0KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyOC1yMTIsIHIxNH0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCAgcjUsICBbcjAsICMyNF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICMyNF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjAsICM1Nl0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIxMCwgcjExLCBbcjIsICM1Nl0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxNCwgIzB4ODAwMAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjMsICByNCwgIHI2LCAgcjE0CisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI1LCAgcjcsICByMTQKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCAgcjUsICBbcjAsICM4OF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICM4OF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIzLCAgcjgsICByMTAsIHIzCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI5LCAgcjExLCByMTIKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjAsICMxMjBdCisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjMTIwXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjMsICByNCwgIHI2LCAgcjMKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjUsICByNywgIHIxMgorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMCwgIzE1Ml0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICMxNTJdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMywgIHI4LCAgcjEwLCByMworICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByOSwgIHIxMSwgcjEyCisgICAgICAgIGxkcmQgICAgICAgICAgICByOCwgIHI5LCAgW3IwLCAjMTZdCisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjMTZdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMywgIHI0LCAgcjYsICByMyAgICAgICAgQCB0MVs2XSBpcyBkb25lCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI1LCAgcjcsICByMTIgICAgICAgQCB0MVs3XSBpcyBkb25lCisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IwLCAjNDhdCisgICAgICAgIGxkcmQgICAgICAgICAgICByNiwgIHI3LCAgW3IyLCAjNDhdCisgICAgICAgIHBraHRiICAgICAgICAgICByMywgIHIxMiwgcjMsIGFzciAjMTYgICAgQCBjb21iaW5lIHQxWzZdIGFuZCB0MVs3XQorICAgICAgICBzdHIgICAgICAgICAgICAgcjMsICBbc3AsICMtNF0hICAgICAgICAgIEAgc2F2ZSB0byBzdGFjaworICAgICAgICBzbWxhZCAgICAgICAgICAgcjMsICByOCwgIHIxMCwgcjE0CisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI5LCAgcjExLCByMTQKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjAsICM4MF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIxMCwgcjExLCBbcjIsICM4MF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIzLCAgcjQsICByNiwgIHIzCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI1LCAgcjcsICByMTIKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI0LCAgcjUsICBbcjAsICMxMTJdCisgICAgICAgIGxkcmQgICAgICAgICAgICByNiwgIHI3LCAgW3IyLCAjMTEyXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjMsICByOCwgIHIxMCwgcjMKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjksICByMTEsIHIxMgorICAgICAgICBsZHJkICAgICAgICAgICAgcjgsICByOSwgIFtyMCwgIzE0NF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIxMCwgcjExLCBbcjIsICMxNDRdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMywgIHI0LCAgcjYsICByMworICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByNSwgIHI3LCAgcjEyCisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IwLCAjMF0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICMwXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjMsICByOCwgIHIxMCwgcjMgICAgICAgIEAgdDFbNF0gaXMgZG9uZQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByOSwgIHIxMSwgcjEyICAgICAgIEAgdDFbNV0gaXMgZG9uZQorICAgICAgICBsZHJkICAgICAgICAgICAgcjgsICByOSwgIFtyMCwgIzMyXQorICAgICAgICBsZHJkICAgICAgICAgICAgcjEwLCByMTEsIFtyMiwgIzMyXQorICAgICAgICBwa2h0YiAgICAgICAgICAgcjMsICByMTIsIHIzLCBhc3IgIzE2ICAgIEAgY29tYmluZSB0MVs0XSBhbmQgdDFbNV0KKyAgICAgICAgc3RyICAgICAgICAgICAgIHIzLCAgW3NwLCAjLTRdISAgICAgICAgICBAIHNhdmUgdG8gc3RhY2sKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIzLCAgcjQsICByNiwgIHIxNAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByNSwgIHI3LCAgcjE0CisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IwLCAjNjRdCisgICAgICAgIGxkcmQgICAgICAgICAgICByNiwgIHI3LCAgW3IyLCAjNjRdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMywgIHI4LCAgcjEwLCByMworICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByOSwgIHIxMSwgcjEyCisgICAgICAgIGxkcmQgICAgICAgICAgICByOCwgIHI5LCAgW3IwLCAjOTZdCisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjOTZdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMywgIHI0LCAgcjYsICByMworICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByNSwgIHI3LCAgcjEyCisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IwLCAjMTI4XQorICAgICAgICBsZHJkICAgICAgICAgICAgcjYsICByNywgIFtyMiwgIzEyOF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIzLCAgcjgsICByMTAsIHIzCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI5LCAgcjExLCByMTIKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjAsICM4XQorICAgICAgICBsZHJkICAgICAgICAgICAgcjEwLCByMTEsIFtyMiwgIzhdCisgICAgICAgIHNtbGFkICAgICAgICAgICByMywgIHI0LCAgcjYsICByMyAgICAgICAgQCB0MVswXSBpcyBkb25lCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI1LCAgcjcsICByMTIgICAgICAgQCB0MVsxXSBpcyBkb25lCisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IwLCAjNDBdCisgICAgICAgIGxkcmQgICAgICAgICAgICByNiwgIHI3LCAgW3IyLCAjNDBdCisgICAgICAgIHBraHRiICAgICAgICAgICByMywgIHIxMiwgcjMsIGFzciAjMTYgICAgQCBjb21iaW5lIHQxWzBdIGFuZCB0MVsxXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjEyLCByOCwgIHIxMCwgcjE0CisgICAgICAgIHNtbGFkICAgICAgICAgICByMTQsIHI5LCAgcjExLCByMTQKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjAsICM3Ml0KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIxMCwgcjExLCBbcjIsICM3Ml0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjQsICByNiwgIHIxMgorICAgICAgICBzbWxhZCAgICAgICAgICAgcjE0LCByNSwgIHI3LCAgcjE0CisgICAgICAgIGxkcmQgICAgICAgICAgICByNCwgIHI1LCAgW3IwLCAjMTA0XQorICAgICAgICBsZHJkICAgICAgICAgICAgcjYsICByNywgIFtyMiwgIzEwNF0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjgsICByMTAsIHIxMgorICAgICAgICBzbWxhZCAgICAgICAgICAgcjE0LCByOSwgIHIxMSwgcjE0CisgICAgICAgIGxkcmQgICAgICAgICAgICByOCwgIHI5LCAgW3IwLCAjMTM2XQorICAgICAgICBsZHJkICAgICAgICAgICAgcjEwLCByMTEsIFtyMiwgIzEzNl0hCisgICAgICAgIHNtbGFkICAgICAgICAgICByMTIsIHI0LCAgcjYsICByMTIKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxNCwgcjUsICByNywgIHIxNAorICAgICAgICBsZHJkICAgICAgICAgICAgcjQsICByNSwgIFtyMiwgIygxNjAgLSAxMzYgKyAwKV0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxMiwgcjgsICByMTAsIHIxMiAgICAgICBAIHQxWzJdIGlzIGRvbmUKKyAgICAgICAgc21sYWQgICAgICAgICAgIHIxNCwgcjksICByMTEsIHIxNCAgICAgICBAIHQxWzNdIGlzIGRvbmUKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI2LCAgcjcsICBbcjIsICMoMTYwIC0gMTM2ICsgOCldCisgICAgICAgIHNtdWFkICAgICAgICAgICByNCwgIHIzLCAgcjQKKyAgICAgICAgc211YWQgICAgICAgICAgIHI1LCAgcjMsICByNQorICAgICAgICBwa2h0YiAgICAgICAgICAgcjEyLCByMTQsIHIxMiwgYXNyICMxNiAgIEAgY29tYmluZSB0MVsyXSBhbmQgdDFbM10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIzICA9IHQyWzA6MV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIxMiA9IHQyWzI6M10KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMCwgcjE0fSAgICAgICAgICAgICAgICBAIHQyWzQ6NV0sIHQyWzY6N10KKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjIsICMoMTYwIC0gMTM2ICsgMzIpXQorICAgICAgICBzbXVhZCAgICAgICAgICAgcjYsICByMywgIHI2CisgICAgICAgIHNtdWFkICAgICAgICAgICByNywgIHIzLCAgcjcKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHIxMCwgcjExLCBbcjIsICMoMTYwIC0gMTM2ICsgNDApXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjQsICByMTIsIHI4LCAgcjQKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI1LCAgcjEyLCByOSwgIHI1CisgICAgICAgIGxkcmQgICAgICAgICAgICByOCwgIHI5LCAgW3IyLCAjKDE2MCAtIDEzNiArIDY0KV0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI2LCAgcjEyLCByMTAsIHI2CisgICAgICAgIHNtbGFkICAgICAgICAgICByNywgIHIxMiwgcjExLCByNworICAgICAgICBsZHJkICAgICAgICAgICAgcjEwLCByMTEsIFtyMiwgIygxNjAgLSAxMzYgKyA3MildCisgICAgICAgIHNtbGFkICAgICAgICAgICByNCwgIHIwLCAgcjgsICByNAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjUsICByMCwgIHI5LCAgcjUKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjIsICMoMTYwIC0gMTM2ICsgOTYpXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjYsICByMCwgIHIxMCwgcjYKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI3LCAgcjAsICByMTEsIHI3CisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjKDE2MCAtIDEzNiArIDEwNCldCisgICAgICAgIHNtbGFkICAgICAgICAgICByNCwgIHIxNCwgcjgsICByNAorICAgICAgICBzbWxhZCAgICAgICAgICAgcjUsICByMTQsIHI5LCAgcjUKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjIsICMoMTYwIC0gMTM2ICsgMTYgKyAwKV0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI2LCAgcjE0LCByMTAsIHI2CisgICAgICAgIHNtbGFkICAgICAgICAgICByNywgIHIxNCwgcjExLCByNworICAgICAgICBsZHJkICAgICAgICAgICAgcjEwLCByMTEsIFtyMiwgIygxNjAgLSAxMzYgKyAxNiArIDgpXQorICAgICAgICBzdG1pYSAgICAgICAgICAgcjEhLCB7cjQsIHI1fQorICAgICAgICBzbXVhZCAgICAgICAgICAgcjQsICByMywgIHI4CisgICAgICAgIHNtdWFkICAgICAgICAgICByNSwgIHIzLCAgcjkKKyAgICAgICAgbGRyZCAgICAgICAgICAgIHI4LCAgcjksICBbcjIsICMoMTYwIC0gMTM2ICsgMTYgKyAzMildCisgICAgICAgIHN0bWlhICAgICAgICAgICByMSEsIHtyNiwgcjd9CisgICAgICAgIHNtdWFkICAgICAgICAgICByNiwgIHIzLCAgcjEwCisgICAgICAgIHNtdWFkICAgICAgICAgICByNywgIHIzLCAgcjExCisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjKDE2MCAtIDEzNiArIDE2ICsgNDApXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjQsICByMTIsIHI4LCAgcjQKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI1LCAgcjEyLCByOSwgIHI1CisgICAgICAgIGxkcmQgICAgICAgICAgICByOCwgIHI5LCAgW3IyLCAjKDE2MCAtIDEzNiArIDE2ICsgNjQpXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjYsICByMTIsIHIxMCwgcjYKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI3LCAgcjEyLCByMTEsIHI3CisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjKDE2MCAtIDEzNiArIDE2ICsgNzIpXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjQsICByMCwgIHI4LCAgcjQKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI1LCAgcjAsICByOSwgIHI1CisgICAgICAgIGxkcmQgICAgICAgICAgICByOCwgIHI5LCAgW3IyLCAjKDE2MCAtIDEzNiArIDE2ICsgOTYpXQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjYsICByMCwgIHIxMCwgcjYKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI3LCAgcjAsICByMTEsIHI3CisgICAgICAgIGxkcmQgICAgICAgICAgICByMTAsIHIxMSwgW3IyLCAjKDE2MCAtIDEzNiArIDE2ICsgMTA0KV0KKyAgICAgICAgc21sYWQgICAgICAgICAgIHI0LCAgcjE0LCByOCwgIHI0CisgICAgICAgIHNtbGFkICAgICAgICAgICByNSwgIHIxNCwgcjksICByNQorICAgICAgICBzbWxhZCAgICAgICAgICAgcjYsICByMTQsIHIxMCwgcjYKKyAgICAgICAgc21sYWQgICAgICAgICAgIHI3LCAgcjE0LCByMTEsIHI3CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjgtcjEyLCByMTR9CisgICAgICAgIHN0bWlhICAgICAgICAgICByMSEsIHtyNCwgcjUsIHI2LCByN30KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMSwgcjMtcjcsIHBjfQorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vc2JjZHNwX2luaXRfYXJtLmMgYi9saWJhdmNvZGVjL2FybS9zYmNkc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmY3ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hcm0vc2JjZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBCbHVldG9vdGggbG93LWNvbXBsZXhpdHksIHN1YmJhbmQgY29kZWMgKFNCQykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwICBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBIZW5yeWsgUGxvZXR6IDxoZW5yeWtAcGxvZXR6bGkuY2g+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiAgQnJhZCBNaWRnbGV5IDxibWlkZ2xleUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNCQyBBUk12NiBvcHRpbWl6YXRpb24gZm9yIHNvbWUgYmFzaWMgImJ1aWxkaW5nIGJyaWNrcyIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9zYmNkc3AuaCIKKwordm9pZCBmZl9zYmNfYW5hbHl6ZV80X2FybXY2KGNvbnN0IGludDE2X3QgKmluLCBpbnQzMl90ICpvdXQsIGNvbnN0IGludDE2X3QgKmNvbnN0cyk7Cit2b2lkIGZmX3NiY19hbmFseXplXzhfYXJtdjYoY29uc3QgaW50MTZfdCAqaW4sIGludDMyX3QgKm91dCwgY29uc3QgaW50MTZfdCAqY29uc3RzKTsKKwordm9pZCBmZl9zYmNfYW5hbHl6ZV80X25lb24oY29uc3QgaW50MTZfdCAqaW4sIGludDMyX3QgKm91dCwgY29uc3QgaW50MTZfdCAqY29uc3RzKTsKK3ZvaWQgZmZfc2JjX2FuYWx5emVfOF9uZW9uKGNvbnN0IGludDE2X3QgKmluLCBpbnQzMl90ICpvdXQsIGNvbnN0IGludDE2X3QgKmNvbnN0cyk7Cit2b2lkIGZmX3NiY19jYWxjX3NjYWxlZmFjdG9yc19uZW9uKGludDMyX3Qgc2Jfc2FtcGxlX2ZbMTZdWzJdWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2FsZV9mYWN0b3JbMl1bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja3MsIGludCBjaGFubmVscywgaW50IHN1YmJhbmRzKTsKK2ludCBmZl9zYmNfY2FsY19zY2FsZWZhY3RvcnNfal9uZW9uKGludDMyX3Qgc2Jfc2FtcGxlX2ZbMTZdWzJdWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2NhbGVfZmFjdG9yWzJdWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrcywgaW50IHN1YmJhbmRzKTsKK2ludCBmZl9zYmNfZW5jX3Byb2Nlc3NfaW5wdXRfNHNfbmVvbihpbnQgcG9zaXRpb24sIGNvbnN0IHVpbnQ4X3QgKnBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IFhbMl1bU0JDX1hfQlVGRkVSX1NJWkVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuc2FtcGxlcywgaW50IG5jaGFubmVscyk7CitpbnQgZmZfc2JjX2VuY19wcm9jZXNzX2lucHV0XzhzX25lb24oaW50IHBvc2l0aW9uLCBjb25zdCB1aW50OF90ICpwY20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBYWzJdW1NCQ19YX0JVRkZFUl9TSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnNhbXBsZXMsIGludCBuY2hhbm5lbHMpOworCitERUNMQVJFX0FMSUdORUQoU0JDX0FMSUdOLCBpbnQzMl90LCBmZl9zYmNkc3Bfam9pbnRfYml0c19tYXNrKVs4XSA9IHsKKyAgICA4LCAgIDQsICAyLCAgMSwgMTI4LCA2NCwgMzIsIDE2Cit9OworCisjaWYgSEFWRV9CSUdFTkRJQU4KKyNkZWZpbmUgUEVSTShhLCBiLCBjLCBkKSB7ICAgICAgICBcCisgICAgICAgIChhICogMikgKyAxLCAoYSAqIDIpICsgMCwgXAorICAgICAgICAoYiAqIDIpICsgMSwgKGIgKiAyKSArIDAsIFwKKyAgICAgICAgKGMgKiAyKSArIDEsIChjICogMikgKyAwLCBcCisgICAgICAgIChkICogMikgKyAxLCAoZCAqIDIpICsgMCAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIFBFUk0oYSwgYiwgYywgZCkgeyAgICAgICAgXAorICAgICAgICAoYSAqIDIpICsgMCwgKGEgKiAyKSArIDEsIFwKKyAgICAgICAgKGIgKiAyKSArIDAsIChiICogMikgKyAxLCBcCisgICAgICAgIChjICogMikgKyAwLCAoYyAqIDIpICsgMSwgXAorICAgICAgICAoZCAqIDIpICsgMCwgKGQgKiAyKSArIDEgIFwKKyAgICB9CisjZW5kaWYKKworREVDTEFSRV9BTElHTkVEKFNCQ19BTElHTiwgdWludDhfdCwgZmZfc2JjX2lucHV0X3Blcm1fNClbMl1bOF0gPSB7CisgICAgUEVSTSg3LCAzLCA2LCA0KSwKKyAgICBQRVJNKDAsIDIsIDEsIDUpCit9OworCitERUNMQVJFX0FMSUdORUQoU0JDX0FMSUdOLCB1aW50OF90LCBmZl9zYmNfaW5wdXRfcGVybV84KVs0XVs4XSA9IHsKKyAgICBQRVJNKDE1LCA3LCAxNCwgIDgpLAorICAgIFBFUk0oMTMsIDksIDEyLCAxMCksCisgICAgUEVSTSgxMSwgMywgIDYsICAwKSwKKyAgICBQRVJNKCA1LCAxLCAgNCwgIDIpCit9OworCithdl9jb2xkIHZvaWQgZmZfc2JjZHNwX2luaXRfYXJtKFNCQ0RTUENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX2FybXY2KGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+c2JjX2FuYWx5emVfNCA9IGZmX3NiY19hbmFseXplXzRfYXJtdjY7CisgICAgICAgIHMtPnNiY19hbmFseXplXzggPSBmZl9zYmNfYW5hbHl6ZV84X2FybXY2OworICAgIH0KKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBzLT5zYmNfYW5hbHl6ZV80ID0gZmZfc2JjX2FuYWx5emVfNF9uZW9uOworICAgICAgICBzLT5zYmNfYW5hbHl6ZV84ID0gZmZfc2JjX2FuYWx5emVfOF9uZW9uOworICAgICAgICBzLT5zYmNfY2FsY19zY2FsZWZhY3RvcnMgPSBmZl9zYmNfY2FsY19zY2FsZWZhY3RvcnNfbmVvbjsKKyAgICAgICAgcy0+c2JjX2NhbGNfc2NhbGVmYWN0b3JzX2ogPSBmZl9zYmNfY2FsY19zY2FsZWZhY3RvcnNfal9uZW9uOworICAgICAgICBpZiAocy0+aW5jcmVtZW50ICE9IDEpIHsKKyAgICAgICAgICAgIHMtPnNiY19lbmNfcHJvY2Vzc19pbnB1dF80cyA9IGZmX3NiY19lbmNfcHJvY2Vzc19pbnB1dF80c19uZW9uOworICAgICAgICAgICAgcy0+c2JjX2VuY19wcm9jZXNzX2lucHV0XzhzID0gZmZfc2JjX2VuY19wcm9jZXNzX2lucHV0XzhzX25lb247CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9zYmNkc3BfbmVvbi5TIGIvbGliYXZjb2RlYy9hcm0vc2JjZHNwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODNkMjFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hcm0vc2JjZHNwX25lb24uUwpAQCAtMCwwICsxLDcxNCBAQAorLyoKKyAqIEJsdWV0b290aCBsb3ctY29tcGxleGl0eSwgc3ViYmFuZCBjb2RlYyAoU0JDKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIEhlbnJ5ayBQbG9ldHogPGhlbnJ5a0BwbG9ldHpsaS5jaD4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2ICBCcmFkIE1pZGdsZXkgPGJtaWRnbGV5QHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0JDIEFSTSBORU9OIG9wdGltaXphdGlvbnMKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKyNpbmNsdWRlICJuZW9uLlMiCisKKyNkZWZpbmUgU0JDX1BST1RPX0ZJWEVEX1NDQUxFIDE2CisKK2Z1bmN0aW9uIGZmX3NiY19hbmFseXplXzRfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgLyogVE9ETzogbWVyZ2UgZXZlbiBhbmQgb2RkIGNhc2VzIChvciBldmVuIG1lcmdlIGFsbCBmb3VyIGNhbGxzIHRvIHRoaXMKKyAgICAgICAgICogZnVuY3Rpb24pIGluIG9yZGVyIHRvIGhhdmUgb25seSBhbGlnbmVkIHJlYWRzIGZyb20gJ2luJyBhcnJheQorICAgICAgICAgKiBhbmQgcmVkdWNlIG51bWJlciBvZiBsb2FkIGluc3RydWN0aW9ucyAqLworICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q0LCBkNX0sIFtyMCwgOjY0XSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkOCwgZDl9LCBbcjIsIDoxMjhdIQorCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMCwgZDQsIGQ4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDYsICBkN30sIFtyMCwgOjY0XSEKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExLCBkNSwgZDkKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTAsIGQxMX0sIFtyMiwgOjEyOF0hCisKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHEwLCBkNiwgZDEwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDQsIGQ1fSwgW3IwLCA6NjRdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTEsIGQ3LCBkMTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkOCwgZDl9LCBbcjIsIDoxMjhdIQorCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMCwgZDQsIGQ4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDYsICBkN30sIFtyMCwgOjY0XSEKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHExLCBkNSwgZDkKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTAsIGQxMX0sIFtyMiwgOjEyOF0hCisKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHEwLCBkNiwgZDEwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDQsIGQ1fSwgW3IwLCA6NjRdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTEsIGQ3LCBkMTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkOCwgZDl9LCBbcjIsIDoxMjhdIQorCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMCwgZDQsIGQ4CisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMSwgZDUsIGQ5CisKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQwLCBkMCwgZDEKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQxLCBkMiwgZDMKKworICAgICAgICB2cnNocm4uczMyICAgICAgZDAsIHEwLCBTQkNfUFJPVE9fRklYRURfU0NBTEUKKworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyLCBkMywgZDQsIGQ1fSwgW3IyLCA6MTI4XSEKKworICAgICAgICB2ZHVwLmkzMiAgICAgICAgZDEsIGQwWzFdICAvKiBUT0RPOiBjYW4gYmUgZWxpbWluYXRlZCAqLworICAgICAgICB2ZHVwLmkzMiAgICAgICAgZDAsIGQwWzBdICAvKiBUT0RPOiBjYW4gYmUgZWxpbWluYXRlZCAqLworCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMywgZDIsIGQwCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxNCwgZDMsIGQwCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxMywgZDQsIGQxCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNCwgZDUsIGQxCisKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQwLCBkNiwgZDcgLyogVE9ETzogY2FuIGJlIGVsaW1pbmF0ZWQgKi8KKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQxLCBkOCwgZDkgLyogVE9ETzogY2FuIGJlIGVsaW1pbmF0ZWQgKi8KKworICAgICAgICB2c3QxLjMyICAgICAgICAge2QwLCBkMX0sIFtyMSwgOjEyOF0KKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfc2JjX2FuYWx5emVfOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICAvKiBUT0RPOiBtZXJnZSBldmVuIGFuZCBvZGQgY2FzZXMgKG9yIGV2ZW4gbWVyZ2UgYWxsIGZvdXIgY2FsbHMgdG8gdGhpcworICAgICAgICAgKiBmdW5jdGlvbikgaW4gb3JkZXIgdG8gaGF2ZSBvbmx5IGFsaWduZWQgcmVhZHMgZnJvbSAnaW4nIGFycmF5CisgICAgICAgICAqIGFuZCByZWR1Y2UgbnVtYmVyIG9mIGxvYWQgaW5zdHJ1Y3Rpb25zICovCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDQsIGQ1fSwgW3IwLCA6NjRdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q4LCBkOX0sIFtyMiwgOjEyOF0hCisKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE2LCBkNCwgZDgKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNiwgIGQ3fSwgW3IwLCA6NjRdIQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTcsIGQ1LCBkOQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxMCwgZDExfSwgW3IyLCA6MTI4XSEKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE4LCBkNiwgZDEwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDQsIGQ1fSwgW3IwLCA6NjRdIQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTksIGQ3LCBkMTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkOCwgZDl9LCBbcjIsIDoxMjhdIQorCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNiwgZDQsIGQ4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDYsICBkN30sIFtyMCwgOjY0XSEKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE3LCBkNSwgZDkKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTAsIGQxMX0sIFtyMiwgOjEyOF0hCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOCwgZDYsIGQxMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q0LCBkNX0sIFtyMCwgOjY0XSEKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE5LCBkNywgZDExCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDgsIGQ5fSwgW3IyLCA6MTI4XSEKKworICAgICAgICB2bWxhbC5zMTYgICAgICAgcTYsIGQ0LCBkOAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q2LCAgZDd9LCBbcjAsIDo2NF0hCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNywgZDUsIGQ5CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDEwLCBkMTF9LCBbcjIsIDoxMjhdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTgsIGQ2LCBkMTAKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNCwgZDV9LCBbcjAsIDo2NF0hCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDcsIGQxMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q4LCBkOX0sIFtyMiwgOjEyOF0hCisKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE2LCBkNCwgZDgKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNiwgIGQ3fSwgW3IwLCA6NjRdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTcsIGQ1LCBkOQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxMCwgZDExfSwgW3IyLCA6MTI4XSEKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE4LCBkNiwgZDEwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDQsIGQ1fSwgW3IwLCA6NjRdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTksIGQ3LCBkMTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkOCwgZDl9LCBbcjIsIDoxMjhdIQorCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNiwgZDQsIGQ4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDYsICBkN30sIFtyMCwgOjY0XSEKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE3LCBkNSwgZDkKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTAsIGQxMX0sIFtyMiwgOjEyOF0hCisKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHE4LCBkNiwgZDEwCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDcsIGQxMQorCisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMCwgZDEyLCBkMTMKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQxLCBkMTQsIGQxNQorICAgICAgICB2cGFkZC5zMzIgICAgICAgZDIsIGQxNiwgZDE3CisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMywgZDE4LCBkMTkKKworICAgICAgICB2cnNoci5zMzIgICAgICAgcTAsIHEwLCBTQkNfUFJPVE9fRklYRURfU0NBTEUKKyAgICAgICAgdnJzaHIuczMyICAgICAgIHExLCBxMSwgU0JDX1BST1RPX0ZJWEVEX1NDQUxFCisgICAgICAgIHZtb3ZuLnMzMiAgICAgICBkMCwgcTAKKyAgICAgICAgdm1vdm4uczMyICAgICAgIGQxLCBxMQorCisgICAgICAgIHZkdXAuaTMyICAgICAgICBkMywgZDFbMV0gIC8qIFRPRE86IGNhbiBiZSBlbGltaW5hdGVkICovCisgICAgICAgIHZkdXAuaTMyICAgICAgICBkMiwgZDFbMF0gIC8qIFRPRE86IGNhbiBiZSBlbGltaW5hdGVkICovCisgICAgICAgIHZkdXAuaTMyICAgICAgICBkMSwgZDBbMV0gIC8qIFRPRE86IGNhbiBiZSBlbGltaW5hdGVkICovCisgICAgICAgIHZkdXAuaTMyICAgICAgICBkMCwgZDBbMF0gIC8qIFRPRE86IGNhbiBiZSBlbGltaW5hdGVkICovCisKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNCwgZDV9LCBbcjIsIDoxMjhdIQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTYsIGQ0LCBkMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q2LCBkN30sIFtyMiwgOjEyOF0hCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxNywgZDUsIGQwCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxOCwgZDYsIGQwCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxOSwgZDcsIGQwCisKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNCwgZDV9LCBbcjIsIDoxMjhdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTYsIGQ0LCBkMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q2LCBkN30sIFtyMiwgOjEyOF0hCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNywgZDUsIGQxCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOCwgZDYsIGQxCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDcsIGQxCisKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNCwgZDV9LCBbcjIsIDoxMjhdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTYsIGQ0LCBkMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q2LCBkN30sIFtyMiwgOjEyOF0hCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNywgZDUsIGQyCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOCwgZDYsIGQyCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDcsIGQyCisKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNCwgZDV9LCBbcjIsIDoxMjhdIQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTYsIGQ0LCBkMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q2LCBkN30sIFtyMiwgOjEyOF0hCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxNywgZDUsIGQzCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOCwgZDYsIGQzCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBxOSwgZDcsIGQzCisKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQwLCBkMTIsIGQxMyAvKiBUT0RPOiBjYW4gYmUgZWxpbWluYXRlZCAqLworICAgICAgICB2cGFkZC5zMzIgICAgICAgZDEsIGQxNCwgZDE1IC8qIFRPRE86IGNhbiBiZSBlbGltaW5hdGVkICovCisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMiwgZDE2LCBkMTcgLyogVE9ETzogY2FuIGJlIGVsaW1pbmF0ZWQgKi8KKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQzLCBkMTgsIGQxOSAvKiBUT0RPOiBjYW4gYmUgZWxpbWluYXRlZCAqLworCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjEsIDoxMjhdCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3NiY19jYWxjX3NjYWxlZmFjdG9yc19uZW9uLCBleHBvcnQ9MQorICAgICAgICBAIHBhcmFtZXRlcnMKKyAgICAgICAgQCByMCA9IHNiX3NhbXBsZV9mCisgICAgICAgIEAgcjEgPSBzY2FsZV9mYWN0b3IKKyAgICAgICAgQCByMiA9IGJsb2NrcworICAgICAgICBAIHIzID0gY2hhbm5lbHMKKyAgICAgICAgQCByNCA9IHN1YmJhbmRzCisgICAgICAgIEAgbG9jYWwgdmFyaWFibGVzCisgICAgICAgIEAgcjUgPSBpbl9sb29wXzEKKyAgICAgICAgQCByNiA9IGluCisgICAgICAgIEAgcjcgPSBvdXRfbG9vcF8xCisgICAgICAgIEAgcjggPSBvdXQKKyAgICAgICAgQCByOSA9IGNoCisgICAgICAgIEAgcjEwID0gc2IKKyAgICAgICAgQCByMTEgPSBpbmMKKyAgICAgICAgQCByMTIgPSBibGsKKworICAgICAgICBwdXNoICAgICAgICAgICAge3IxLXIyLCByNC1yMTJ9CisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzQ0XQorICAgICAgICBtb3YgICAgICAgICAgICAgcjExLCAjNjQKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjksICAjMAorMToKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgcjAsICByOSwgbHNsIzUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjEsICByOSwgbHNsIzUKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjEwLCAgIzAKKzI6CisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHI1LCAgcjEwLCBsc2wjMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjgsICByNywgIHIxMCwgbHNsIzIKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjIKKworICAgICAgICB2bW92LnMzMiAgICAgICAgcTAsICAjMAorICAgICAgICB2bW92LnMzMiAgICAgICAgcTEsICAjMHg4MDAwICAgICAgICAgICAgQCAxIDw8IFNDQUxFX09VVF9CSVRTCisgICAgICAgIHZtb3YuczMyICAgICAgICBxMTQsICMxCisgICAgICAgIHZtb3YuczMyICAgICAgICBxMTUsICMxNiAgICAgICAgICAgICAgICBAIDMxIC0gU0NBTEVfT1VUX0JJVFMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHExLCAgcTEsICBxMTQKKzM6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE2LCBkMTd9LCBbcjYsIDoxMjhdLCByMTEKKyAgICAgICAgdmFicy5zMzIgICAgICAgIHE4LCAgcTgKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTgsIGQxOX0sIFtyNiwgOjEyOF0sIHIxMQorICAgICAgICB2YWJzLnMzMiAgICAgICAgcTksICBxOQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMCwgZDIxfSwgW3I2LCA6MTI4XSwgcjExCisgICAgICAgIHZhYnMuczMyICAgICAgICBxMTAsIHExMAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QyMiwgZDIzfSwgW3I2LCA6MTI4XSwgcjExCisgICAgICAgIHZhYnMuczMyICAgICAgICBxMTEsIHExMQorICAgICAgICB2bWF4LnMzMiAgICAgICAgcTAsICBxMCwgIHE4CisgICAgICAgIHZtYXguczMyICAgICAgICBxMSwgIHExLCAgcTkKKyAgICAgICAgdm1heC5zMzIgICAgICAgIHEwLCAgcTAsICBxMTAKKyAgICAgICAgdm1heC5zMzIgICAgICAgIHExLCAgcTEsICBxMTEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBiZ3QgICAgICAgICAgICAgM2IKKyAgICAgICAgdm1heC5zMzIgICAgICAgIHEwLCAgcTAsICBxMQorICAgICAgICB2c3ViLnMzMiAgICAgICAgcTAsICBxMCwgIHExNAorICAgICAgICB2Y2x6LnMzMiAgICAgICAgcTAsICBxMAorICAgICAgICB2c3ViLnMzMiAgICAgICAgcTAsICBxMTUsIHEwCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDAsIGQxfSwgW3I4LCA6MTI4XQorCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTAsIHIxMCwgIzQKKyAgICAgICAgY21wICAgICAgICAgICAgIHIxMCwgcjQKKyAgICAgICAgYmx0ICAgICAgICAgICAgIDJiCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI5LCAgcjksICAjMQorICAgICAgICBjbXAgICAgICAgICAgICAgcjksICByMworICAgICAgICBibHQgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3IxLXIyLCByNC1yMTJ9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCisvKgorICogY29uc3RhbnRzOiBxMTMgPSAoMzEgLSBTQ0FMRV9PVVRfQklUUykKKyAqICAgICAgICAgICAgcTE0ID0gMQorICogaW5wdXQ6ICAgICBxMCAgLSAoKDEgPDwgU0NBTEVfT1VUX0JJVFMpICsgMSkKKyAqICAgICAgICAgICAgcjUgIC0gc2FtcGxlcyBmb3IgY2hhbm5lbCAwCisgKiAgICAgICAgICAgIHI2ICAtIHNhbXBsZXMgZm9yIHNoYW5uZWwgMQorICogb3V0cHV0OiAgICBxMCwgcTEgLSBzY2FsZSBmYWN0b3JzIHdpdGhvdXQgam9pbnQgc3RlcmVvCisgKiAgICAgICAgICAgIHEyLCBxMyAtIHNjYWxlIGZhY3RvcnMgd2l0aCBqb2ludCBzdGVyZW8KKyAqICAgICAgICAgICAgcTE1ICAgIC0gam9pbnQgc3RlcmVvIHNlbGVjdGlvbiBtYXNrCisgKi8KKy5tYWNybyBjYWxjX3NjYWxlZmFjdG9ycworICAgICAgICB2bW92LnMzMiAgICAgICAgcTEsICBxMAorICAgICAgICB2bW92LnMzMiAgICAgICAgcTIsICBxMAorICAgICAgICB2bW92LnMzMiAgICAgICAgcTMsICBxMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMgorMToKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTgsIGQxOX0sIFtyNiwgOjEyOF0sIHIxMQorICAgICAgICB2YmljLnMzMiAgICAgICAgcTExLCBxOSwgIHExNAorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxNiwgZDE3fSwgW3I1LCA6MTI4XSwgcjExCisgICAgICAgIHZoYWRkLnMzMiAgICAgICBxMTAsIHE4LCAgcTExCisgICAgICAgIHZoc3ViLnMzMiAgICAgICBxMTEsIHE4LCAgcTExCisgICAgICAgIHZhYnMuczMyICAgICAgICBxOCwgIHE4CisgICAgICAgIHZhYnMuczMyICAgICAgICBxOSwgIHE5CisgICAgICAgIHZhYnMuczMyICAgICAgICBxMTAsIHExMAorICAgICAgICB2YWJzLnMzMiAgICAgICAgcTExLCBxMTEKKyAgICAgICAgdm1heC5zMzIgICAgICAgIHEwLCAgcTAsICBxOAorICAgICAgICB2bWF4LnMzMiAgICAgICAgcTEsICBxMSwgIHE5CisgICAgICAgIHZtYXguczMyICAgICAgICBxMiwgIHEyLCAgcTEwCisgICAgICAgIHZtYXguczMyICAgICAgICBxMywgIHEzLCAgcTExCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzEKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIHZzdWIuczMyICAgICAgICBxMCwgIHEwLCAgcTE0CisgICAgICAgIHZzdWIuczMyICAgICAgICBxMSwgIHExLCAgcTE0CisgICAgICAgIHZzdWIuczMyICAgICAgICBxMiwgIHEyLCAgcTE0CisgICAgICAgIHZzdWIuczMyICAgICAgICBxMywgIHEzLCAgcTE0CisgICAgICAgIHZjbHouczMyICAgICAgICBxMCwgIHEwCisgICAgICAgIHZjbHouczMyICAgICAgICBxMSwgIHExCisgICAgICAgIHZjbHouczMyICAgICAgICBxMiwgIHEyCisgICAgICAgIHZjbHouczMyICAgICAgICBxMywgIHEzCisgICAgICAgIHZzdWIuczMyICAgICAgICBxMCwgIHExMywgcTAKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIHExLCAgcTEzLCBxMQorICAgICAgICB2c3ViLnMzMiAgICAgICAgcTIsICBxMTMsIHEyCisgICAgICAgIHZzdWIuczMyICAgICAgICBxMywgIHExMywgcTMKKy5lbmRtCisKKy8qCisgKiBjb25zdGFudHM6IHExNCA9IDEKKyAqIGlucHV0OiBxMTUgLSBqb2ludCBzdGVyZW8gc2VsZWN0aW9uIG1hc2sKKyAqICAgICAgICByNSAgLSB2YWx1ZSBzZXQgYnkgY2FsY19zY2FsZWZhY3RvcnMgbWFjcm8KKyAqICAgICAgICByNiAgLSB2YWx1ZSBzZXQgYnkgY2FsY19zY2FsZWZhY3RvcnMgbWFjcm8KKyAqLworLm1hY3JvIHVwZGF0ZV9qb2ludF9zdGVyZW9fc2FtcGxlcworICAgICAgICBzdWIgICAgICAgICAgICAgcjgsICByNiwgIHIxMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjcsICByNSwgIHIxMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjYsICByNiwgIHIxMSwgYXNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByNSwgIHI1LCAgcjExLCBhc2wgIzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTgsIGQxOX0sIFtyNiwgOjEyOF0KKyAgICAgICAgdmJpYy5zMzIgICAgICAgIHExMSwgcTksICBxMTQKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTYsIGQxN30sIFtyNSwgOjEyOF0KKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMiwgZDN9LCBbcjgsIDoxMjhdCisgICAgICAgIHZiaWMuczMyICAgICAgICBxMywgIHExLCAgcTE0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDAsIGQxfSwgW3I3LCA6MTI4XQorICAgICAgICB2aHN1Yi5zMzIgICAgICAgcTEwLCBxOCwgIHExMQorICAgICAgICB2aGFkZC5zMzIgICAgICAgcTExLCBxOCwgIHExMQorICAgICAgICB2aHN1Yi5zMzIgICAgICAgcTIsICBxMCwgIHEzCisgICAgICAgIHZoYWRkLnMzMiAgICAgICBxMywgIHEwLCAgcTMKKyAgICAgICAgdmJpZi5zMzIgICAgICAgIHExMCwgcTksICBxMTUKKyAgICAgICAgdmJpZi5zMzIgICAgICAgIGQyMiwgZDE2LCBkMzAKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMSwgcjEwLCByMTEsIGFzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMiwgICMyCisyOgorICAgICAgICB2YmlmLnMzMiAgICAgICAgZDIzLCBkMTcsIGQzMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMCwgZDIxfSwgW3I2LCA6MTI4XSwgcjExCisgICAgICAgIHZiaWYuczMyICAgICAgICBkNCwgIGQyLCAgZDMwCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE4LCBkMTl9LCBbcjYsIDoxMjhdCisgICAgICAgIHZiaWYuczMyICAgICAgICBkNSwgIGQzLCAgZDMxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyLCBkMjN9LCBbcjUsIDoxMjhdLCByMTEKKyAgICAgICAgdmJpZi5zMzIgICAgICAgIGQ2LCAgZDAsICBkMzAKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTYsIGQxN30sIFtyNSwgOjEyOF0KKyAgICAgICAgdmJpZi5zMzIgICAgICAgIGQ3LCAgZDEsICBkMzEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNCwgZDV9LCBbcjgsIDoxMjhdLCByMTEKKyAgICAgICAgdmJpYy5zMzIgICAgICAgIHExMSwgcTksICBxMTQKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMiwgZDN9LCBbcjgsIDoxMjhdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDYsIGQ3fSwgW3I3LCA6MTI4XSwgcjExCisgICAgICAgIHZiaWMuczMyICAgICAgICBxMywgIHExLCAgcTE0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDAsIGQxfSwgW3I3LCA6MTI4XQorICAgICAgICB2aHN1Yi5zMzIgICAgICAgcTEwLCBxOCwgIHExMQorICAgICAgICB2aGFkZC5zMzIgICAgICAgcTExLCBxOCwgIHExMQorICAgICAgICB2aHN1Yi5zMzIgICAgICAgcTIsICBxMCwgIHEzCisgICAgICAgIHZoYWRkLnMzMiAgICAgICBxMywgIHEwLCAgcTMKKyAgICAgICAgdmJpZi5zMzIgICAgICAgIHExMCwgcTksICBxMTUKKyAgICAgICAgdmJpZi5zMzIgICAgICAgIGQyMiwgZDE2LCBkMzAKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMgorICAgICAgICBiZ3QgICAgICAgICAgICAgMmIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMSwgcjEwLCByMTEsIGFzciAjMQorICAgICAgICB2YmlmLnMzMiAgICAgICAgZDIzLCBkMTcsIGQzMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMCwgZDIxfSwgW3I2LCA6MTI4XQorICAgICAgICB2YmlmLnMzMiAgICAgICAgcTIsICBxMSwgIHExNQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyMiwgZDIzfSwgW3I1LCA6MTI4XQorICAgICAgICB2YmlmLnMzMiAgICAgICAgcTMsICBxMCwgIHExNQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q0LCBkNX0sIFtyOCwgOjEyOF0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNiwgZDd9LCBbcjcsIDoxMjhdCisuZW5kbQorCitmdW5jdGlvbiBmZl9zYmNfY2FsY19zY2FsZWZhY3RvcnNfal9uZW9uLCBleHBvcnQ9MQorICAgICAgICBAIHBhcmFtZXRlcnMKKyAgICAgICAgQCByMCA9IGluID0gc2Jfc2FtcGxlX2YKKyAgICAgICAgQCByMSA9IG91dCA9IHNjYWxlX2ZhY3RvcgorICAgICAgICBAIHIyID0gYmxvY2tzCisgICAgICAgIEAgcjMgPSBzdWJiYW5kcworICAgICAgICBAIGxvY2FsIHZhcmlhYmxlcworICAgICAgICBAIHI0ID0gY29uc3RzID0gZmZfc2JjZHNwX2pvaW50X2JpdHNfbWFzaworICAgICAgICBAIHI1ID0gaW4wCisgICAgICAgIEAgcjYgPSBpbjEKKyAgICAgICAgQCByNyA9IG91dDAKKyAgICAgICAgQCByOCA9IG91dDEKKyAgICAgICAgQCByMTAgPSB6ZXJvCisgICAgICAgIEAgcjExID0gaW5jCisgICAgICAgIEAgcmV0dXJuIHIwID0gam9pbnQKKworICAgICAgICBwdXNoICAgICAgICAgICAge3IzLXIxMX0KKyAgICAgICAgbW92cmVseCAgICAgICAgIHI0LCAgWChmZl9zYmNkc3Bfam9pbnRfYml0c19tYXNrKQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEwLCAjMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjExLCAjNjQKKworICAgICAgICB2bW92LnMzMiAgICAgICAgcTE0LCAjMQorICAgICAgICB2bW92LnMzMiAgICAgICAgcTEzLCAjMTYgICAgQCAzMSAtIFNDQUxFX09VVF9CSVRTCisKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAjNAorICAgICAgICBibmUgICAgICAgICAgICAgOGYKKworNDogICAgICBAIDQgc3ViYmFuZHMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgcjAsICAjMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByMCwgICMzMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjcsICByMSwgICMwCisgICAgICAgIGFkZCAgICAgICAgICAgICByOCwgIHIxLCAgIzMyCisgICAgICAgIHZtb3YuczMyICAgICAgICBxMCwgICMweDgwMDAgICAgQCAxIDw8IFNDQUxFX09VVF9CSVRTCisgICAgICAgIHZhZGQuczMyICAgICAgICBxMCwgIHEwLCAgcTE0CisKKyAgICAgICAgY2FsY19zY2FsZWZhY3RvcnMKKworICAgICAgICBAIGNoZWNrIHdoZXRoZXIgdG8gdXNlIGpvaW50IHN0ZXJlbyBmb3Igc3ViYmFuZHMgMCwgMSwgMgorICAgICAgICB2YWRkLnMzMiAgICAgICAgcTE1LCBxMCwgIHExCisgICAgICAgIHZhZGQuczMyICAgICAgICBxOSwgIHEyLCAgcTMKKyAgICAgICAgdm1vdi5zMzIgICAgICAgIGQzMVsxXSwgcjEwICAgIEAgbGFzdCBzdWJiYW5kIC0+IG5vIGpvaW50CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE2LCBkMTd9LCBbcjQsIDoxMjhdIQorICAgICAgICB2Y2d0LnMzMiAgICAgICAgcTE1LCBxMTUsIHE5CisKKyAgICAgICAgQCBjYWxjdWxhdGUgYW5kIHNhdmUgdG8gbWVtb3J5ICdqb2ludCcgdmFyaWFibGUKKyAgICAgICAgQCB1cGRhdGUgYW5kIHNhdmUgc2NhbGUgZmFjdG9ycyB0byBtZW1vcnkKKyAgICAgICAgdmFuZC5zMzIgICAgICAgIHE4LCAgcTgsICBxMTUKKyAgICAgICAgdmJpdC5zMzIgICAgICAgIHEwLCAgcTIsICBxMTUKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQxNiwgZDE2LCBkMTcKKyAgICAgICAgdmJpdC5zMzIgICAgICAgIHExLCAgcTMsICBxMTUKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQxNiwgZDE2LCBkMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMCwgZDF9LCBbcjcsIDoxMjhdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIsIGQzfSwgW3I4LCA6MTI4XQorICAgICAgICB2bW92LjMyICAgICAgICAgcjAsIGQxNlswXQorCisgICAgICAgIHVwZGF0ZV9qb2ludF9zdGVyZW9fc2FtcGxlcworICAgICAgICBiICAgICAgICAgICAgICAgOWYKKworODogICAgICBAIDggc3ViYmFuZHMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI1LCAgcjAsICAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjAsICAjNDgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjEsICAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI4LCAgcjEsICAjNDgKKyAgICAgICAgdm1vdi5zMzIgICAgICAgIHEwLCAgIzB4ODAwMCAgICBAIDEgPDwgU0NBTEVfT1VUX0JJVFMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHEwLCAgcTAsICBxMTQKKworICAgICAgICBjYWxjX3NjYWxlZmFjdG9ycworCisgICAgICAgIEAgY2hlY2sgd2hldGhlciB0byB1c2Ugam9pbnQgc3RlcmVvIGZvciBzdWJiYW5kcyA0LCA1LCA2CisgICAgICAgIHZhZGQuczMyICAgICAgICBxMTUsIHEwLCAgcTEKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHE5LCAgcTIsICBxMworICAgICAgICB2bW92LnMzMiAgICAgICAgZDMxWzFdLCByMTAgICAgQCBsYXN0IHN1YmJhbmQgLT4gbm8gam9pbnQKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTYsIGQxN30sIFtyNCwgOjEyOF0hCisgICAgICAgIHZjZ3QuczMyICAgICAgICBxMTUsIHExNSwgcTkKKworICAgICAgICBAIGNhbGN1bGF0ZSBwYXJ0IG9mICdqb2ludCcgdmFyaWFibGUgYW5kIHNhdmUgaXQgdG8gZDI0CisgICAgICAgIEAgdXBkYXRlIGFuZCBzYXZlIHNjYWxlIGZhY3RvcnMgdG8gbWVtb3J5CisgICAgICAgIHZhbmQuczMyICAgICAgICBxOCwgIHE4LCAgcTE1CisgICAgICAgIHZiaXQuczMyICAgICAgICBxMCwgIHEyLCAgcTE1CisgICAgICAgIHZwYWRkLnMzMiAgICAgICBkMTYsIGQxNiwgZDE3CisgICAgICAgIHZiaXQuczMyICAgICAgICBxMSwgIHEzLCAgcTE1CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDAsIGQxfSwgW3I3LCA6MTI4XQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QyLCBkM30sIFtyOCwgOjEyOF0KKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQyNCwgZDE2LCBkMTYKKworICAgICAgICB1cGRhdGVfam9pbnRfc3RlcmVvX3NhbXBsZXMKKworICAgICAgICBhZGQgICAgICAgICAgICAgcjUsICByMCwgICMwCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIwLCAgIzMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHIxLCAgIzAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI4LCAgcjEsICAjMzIKKyAgICAgICAgdm1vdi5zMzIgICAgICAgIHEwLCAgIzB4ODAwMCAgICBAIDEgPDwgU0NBTEVfT1VUX0JJVFMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHEwLCAgcTAsICBxMTQKKworICAgICAgICBjYWxjX3NjYWxlZmFjdG9ycworCisgICAgICAgIEAgY2hlY2sgd2hldGhlciB0byB1c2Ugam9pbnQgc3RlcmVvIGZvciBzdWJiYW5kcyAwLCAxLCAyLCAzCisgICAgICAgIHZhZGQuczMyICAgICAgICBxMTUsIHEwLCAgcTEKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHE5LCAgcTIsICBxMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QxNiwgZDE3fSwgW3I0LCA6MTI4XSEKKyAgICAgICAgdmNndC5zMzIgICAgICAgIHExNSwgcTE1LCBxOQorCisgICAgICAgIEAgY29tYmluZSBsYXN0IHBhcnQgb2YgJ2pvaW50JyB3aXRoIGQyNCBhbmQgc2F2ZSB0byBtZW1vcnkKKyAgICAgICAgQCB1cGRhdGUgYW5kIHNhdmUgc2NhbGUgZmFjdG9ycyB0byBtZW1vcnkKKyAgICAgICAgdmFuZC5zMzIgICAgICAgIHE4LCAgcTgsICBxMTUKKyAgICAgICAgdmJpdC5zMzIgICAgICAgIHEwLCAgcTIsICBxMTUKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQxNiwgZDE2LCBkMTcKKyAgICAgICAgdmJpdC5zMzIgICAgICAgIHExLCAgcTMsICBxMTUKKyAgICAgICAgdnBhZGQuczMyICAgICAgIGQxNiwgZDE2LCBkMTYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMCwgZDF9LCBbcjcsIDoxMjhdCisgICAgICAgIHZhZGQuczMyICAgICAgICBkMTYsIGQxNiwgZDI0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIsIGQzfSwgW3I4LCA6MTI4XQorICAgICAgICB2bW92LjMyICAgICAgICAgcjAsICBkMTZbMF0KKworICAgICAgICB1cGRhdGVfam9pbnRfc3RlcmVvX3NhbXBsZXMKKzk6CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjMtcjExfQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfc2JjX2VuY19wcm9jZXNzX2lucHV0XzRzX25lb24sIGV4cG9ydD0xCisgICAgICAgIEAgcGFyYW1ldGVycworICAgICAgICBAIHIwID0gcG9zaXRpb2luCisgICAgICAgIEAgcjEgPSBwY20KKyAgICAgICAgQCByMiA9IFgKKyAgICAgICAgQCByMyA9IG5zYW1wbGVzCisgICAgICAgIEAgcjQgPSBuY2hhbm5lbHMKKyAgICAgICAgQCBsb2NhbCB2YXJpYWJsZXMKKyAgICAgICAgQCByNSA9IGZmX3NiY19pbnB1dF9wZXJtXzQKKyAgICAgICAgQCByNiA9IHNyYyAvIHgKKyAgICAgICAgQCByNyA9IGRzdCAvIHkKKworICAgICAgICBwdXNoICAgICAgICAgICAge3IxLCByMy1yN30KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMjRdCisgICAgICAgIG1vdnJlbHggICAgICAgICByNSwgIFgoZmZfc2JjX2lucHV0X3Blcm1fNCkKKworICAgICAgICBAIGhhbmRsZSBYIGJ1ZmZlciB3cmFwYXJvdW5kCisgICAgICAgIGNtcCAgICAgICAgICAgICByMCwgIHIzCisgICAgICAgIGJnZSAgICAgICAgICAgICAxZiAgICAgICAgICAgICAgICAgICAgIEAgaWYgKHBvc2l0aW9uIDwgbnNhbXBsZXMpCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHIyLCAgIzU3NiAgICAgICAgIEAgJlhbMF1bU0JDX1hfQlVGRkVSX1NJWkUgLSA0MF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjIsICByMCwgbHNsIzEgICAgQCAmWFswXVtwb3NpdGlvbl0KKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNiwgOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjcsIDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I2LCA6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNywgOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjYsIDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDB9LCBbcjcsIDo2NF0hCisgICAgICAgIGNtcCAgICAgICAgICAgICByNCwgICMxCisgICAgICAgIGJsZSAgICAgICAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgIEAgaWYgKG5jaGFubmVscyA+IDEpCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHIyLCAgIzEyMzIgICAgICAgIEAgJlhbMV1bU0JDX1hfQlVGRkVSX1NJWkUgLSA0MF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjIsICAjNjU2CisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHI2LCAgcjAsIGxzbCMxICAgIEAgJlhbMV1bcG9zaXRpb25dCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjYsIDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I3LCA6MTI4XSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNiwgOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjcsIDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwfSwgW3I2LCA6NjRdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwfSwgW3I3LCA6NjRdIQorMjoKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgIzI4OCAgICAgICAgICAgICAgQCBTQkNfWF9CVUZGRVJfU0laRSAtIDQwCisxOgorCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIyLCAgcjAsIGxzbCMxICAgIEAgJlhbMF1bcG9zaXRpb25dCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHI2LCAgIzY1NiAgICAgICAgIEAgJlhbMV1bcG9zaXRpb25dCisKKyAgICAgICAgY21wICAgICAgICAgICAgIHI0LCAgIzEKKyAgICAgICAgYmxlICAgICAgICAgICAgIDhmICAgICAgICAgICAgICAgICAgICAgQCBpZiAobmNoYW5uZWxzID4gMSkKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHIxLCAgIzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIDdmICAgICAgICAgICAgICAgICAgICAgQCBpZiAocGNtICYgMSkKKyAgICAgICAgQCBwb29yICdwY20nIGFsaWdubWVudAorICAgICAgICB2bGQxLjggICAgICAgICAge2QwLCBkMX0sIFtyNSwgOjEyOF0KKzE6CisgICAgICAgIHN1YiAgICAgICAgICAgICByNiwgIHI2LCAgIzE2CisgICAgICAgIHN1YiAgICAgICAgICAgICByNywgIHI3LCAgIzE2CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNCwgZDV9LCBbcjFdIQorICAgICAgICB2dXpwLjE2ICAgICAgICAgZDQsICBkNQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMCwgZDIxfSwgW3IxXSEKKyAgICAgICAgdnV6cC4xNiAgICAgICAgIGQyMCwgZDIxCisgICAgICAgIHZzd3AgICAgICAgICAgICBkNSwgIGQyMAorICAgICAgICB2dGJsLjggICAgICAgICAgZDE2LCB7ZDQsIGQ1fSwgZDAKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxNywge2Q0LCBkNX0sIGQxCisgICAgICAgIHZ0YmwuOCAgICAgICAgICBkMTgsIHtkMjAsIGQyMX0sIGQwCisgICAgICAgIHZ0YmwuOCAgICAgICAgICBkMTksIHtkMjAsIGQyMX0sIGQxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE2LCBkMTd9LCBbcjYsIDoxMjhdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE4LCBkMTl9LCBbcjcsIDoxMjhdCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzgKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIGIgICAgICAgICAgICAgICA5ZgorNzoKKyAgICAgICAgQCBwcm9wZXIgJ3BjbScgYWxpZ25tZW50CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAsIGQxfSwgW3I1LCA6MTI4XQorMToKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI2LCAgcjYsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI3LCAgcjcsICAjMTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICB2bGQyLjE2ICAgICAgICAge2Q0LCBkNX0sIFtyMV0hCisgICAgICAgIHZsZDIuMTYgICAgICAgICB7ZDIwLCBkMjF9LCBbcjFdIQorICAgICAgICB2c3dwICAgICAgICAgICAgZDUsICBkMjAKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxNiwge2Q0LCBkNX0sIGQwCisgICAgICAgIHZ0YmwuOCAgICAgICAgICBkMTcsIHtkNCwgZDV9LCBkMQorICAgICAgICB2dGJsLjggICAgICAgICAgZDE4LCB7ZDIwLCBkMjF9LCBkMAorICAgICAgICB2dGJsLjggICAgICAgICAgZDE5LCB7ZDIwLCBkMjF9LCBkMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxNiwgZDE3fSwgW3I2LCA6MTI4XQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxOCwgZDE5fSwgW3I3LCA6MTI4XQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICM4CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorICAgICAgICBiICAgICAgICAgICAgICAgOWYKKzg6CisgICAgICAgIEAgbW9ubworICAgICAgICB2bGQxLjggICAgICAgICAge2QwLCBkMX0sIFtyNSwgOjEyOF0KKzE6CisgICAgICAgIHN1YiAgICAgICAgICAgICByNiwgIHI2LCAgIzE2CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNCwgZDV9LCBbcjFdIQorICAgICAgICB2dGJsLjggICAgICAgICAgZDE2LCB7ZDQsIGQ1fSwgZDAKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxNywge2Q0LCBkNX0sIGQxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE2LCBkMTd9LCBbcjYsIDoxMjhdCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzgKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCis5OgorICAgICAgICBwb3AgICAgICAgICAgICAge3IxLCByMy1yN30KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3NiY19lbmNfcHJvY2Vzc19pbnB1dF84c19uZW9uLCBleHBvcnQ9MQorICAgICAgICBAIHBhcmFtZXRlcnMKKyAgICAgICAgQCByMCA9IHBvc2l0aW9pbgorICAgICAgICBAIHIxID0gcGNtCisgICAgICAgIEAgcjIgPSBYCisgICAgICAgIEAgcjMgPSBuc2FtcGxlcworICAgICAgICBAIHI0ID0gbmNoYW5uZWxzCisgICAgICAgIEAgbG9jYWwgdmFyaWFibGVzCisgICAgICAgIEAgcjUgPSBmZl9zYmNfaW5wdXRfcGVybV84CisgICAgICAgIEAgcjYgPSBzcmMKKyAgICAgICAgQCByNyA9IGRzdAorCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEsIHIzLXI3fQorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMyNF0KKyAgICAgICAgbW92cmVseCAgICAgICAgIHI1LCAgWChmZl9zYmNfaW5wdXRfcGVybV84KQorCisgICAgICAgIEAgaGFuZGxlIFggYnVmZmVyIHdyYXBhcm91bmQKKyAgICAgICAgY21wICAgICAgICAgICAgIHIwLCAgcjMKKyAgICAgICAgYmdlICAgICAgICAgICAgIDFmICAgICAgICAgICAgICAgICAgICAgQCBpZiAocG9zaXRpb24gPCBuc2FtcGxlcykKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjIsICAjNTEyICAgICAgICAgQCAmWFswXVtTQkNfWF9CVUZGRVJfU0laRSAtIDcyXQorICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByMiwgIHIwLCBsc2wjMSAgICBAICZYWzBdW3Bvc2l0aW9uXQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I2LCA6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNywgOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjYsIDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I3LCA6MTI4XSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNiwgOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjcsIDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I2LCA6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNywgOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDAsIGQxfSwgW3I2LCA6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMCwgZDF9LCBbcjcsIDoxMjhdIQorICAgICAgICBjbXAgICAgICAgICAgICAgcjQsICAjMQorICAgICAgICBibGUgICAgICAgICAgICAgMmYgICAgICAgICAgICAgICAgICAgICBAIGlmIChuY2hhbm5lbHMgPiAxKQorICAgICAgICBhZGQgICAgICAgICAgICAgcjcsICByMiwgICMxMTY4ICAgICAgICBAICZYWzFdW1NCQ19YX0JVRkZFUl9TSVpFIC0gNzJdCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIyLCAgIzY1NgorICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByNiwgIHIwLCBsc2wjMSAgICBAICZYWzFdW3Bvc2l0aW9uXQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I2LCA6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNywgOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjYsIDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I3LCA6MTI4XSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNiwgOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjcsIDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I2LCA6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMCwgZDEsIGQyLCBkM30sIFtyNywgOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDAsIGQxfSwgW3I2LCA6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMCwgZDF9LCBbcjcsIDoxMjhdIQorMjoKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIwLCAgIzI1NiAgICAgICAgICAgICAgQCBTQkNfWF9CVUZGRVJfU0laRSAtIDcyCisxOgorCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIyLCAgcjAsIGxzbCMxICAgIEAgJlhbMF1bcG9zaXRpb25dCisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHI2LCAgIzY1NiAgICAgICAgIEAgJlhbMV1bcG9zaXRpb25dCisKKyAgICAgICAgY21wICAgICAgICAgICAgIHI0LCAgIzEKKyAgICAgICAgYmxlICAgICAgICAgICAgIDhmICAgICAgICAgICAgICAgICAgICAgQCBpZiAobmNoYW5uZWxzID4gMSkKKyAgICAgICAgdHN0ICAgICAgICAgICAgIHIxLCAgIzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIDdmICAgICAgICAgICAgICAgICAgICAgQCBpZiAocGNtICYgMSkKKyAgICAgICAgQCBwb29yICdwY20nIGFsaWdubWVudAorICAgICAgICB2bGQxLjggICAgICAgICAge2QwLCBkMSwgZDIsIGQzfSwgW3I1LCA6MTI4XQorMToKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI2LCAgcjYsICAjMzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHI3LCAgcjcsICAjMzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICAjMTYKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNCwgZDUsIGQ2LCBkN30sIFtyMV0hCisgICAgICAgIHZ1enAuMTYgICAgICAgICBxMiwgIHEzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIwLCBkMjEsIGQyMiwgZDIzfSwgW3IxXSEKKyAgICAgICAgdnV6cC4xNiAgICAgICAgIHExMCwgcTExCisgICAgICAgIHZzd3AgICAgICAgICAgICBxMywgIHExMAorICAgICAgICB2dGJsLjggICAgICAgICAgZDE2LCB7ZDQsIGQ1LCBkNiwgZDd9LCBkMAorICAgICAgICB2dGJsLjggICAgICAgICAgZDE3LCB7ZDQsIGQ1LCBkNiwgZDd9LCBkMQorICAgICAgICB2dGJsLjggICAgICAgICAgZDE4LCB7ZDQsIGQ1LCBkNiwgZDd9LCBkMgorICAgICAgICB2dGJsLjggICAgICAgICAgZDE5LCB7ZDQsIGQ1LCBkNiwgZDd9LCBkMworICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxNiwgZDE3LCBkMTgsIGQxOX0sIFtyNiwgOjEyOF0KKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxNiwge2QyMCwgZDIxLCBkMjIsIGQyM30sIGQwCisgICAgICAgIHZ0YmwuOCAgICAgICAgICBkMTcsIHtkMjAsIGQyMSwgZDIyLCBkMjN9LCBkMQorICAgICAgICB2dGJsLjggICAgICAgICAgZDE4LCB7ZDIwLCBkMjEsIGQyMiwgZDIzfSwgZDIKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxOSwge2QyMCwgZDIxLCBkMjIsIGQyM30sIGQzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE2LCBkMTcsIGQxOCwgZDE5fSwgW3I3LCA6MTI4XQorICAgICAgICBzdWJzICAgICAgICAgICAgcjMsICByMywgICMxNgorICAgICAgICBiZ3QgICAgICAgICAgICAgMWIKKyAgICAgICAgYiA5ZgorNzoKKyAgICAgICAgQCBwcm9wZXIgJ3BjbScgYWxpZ25tZW50CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjUsIDoxMjhdCisxOgorICAgICAgICBzdWIgICAgICAgICAgICAgcjYsICByNiwgICMzMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjcsICByNywgICMzMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICMxNgorICAgICAgICB2bGQyLjE2ICAgICAgICAge2Q0LCBkNSwgZDYsIGQ3fSwgW3IxXSEKKyAgICAgICAgdmxkMi4xNiAgICAgICAgIHtkMjAsIGQyMSwgZDIyLCBkMjN9LCBbcjFdIQorICAgICAgICB2c3dwICAgICAgICAgICAgcTMsICBxMTAKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxNiwge2Q0LCBkNSwgZDYsIGQ3fSwgZDAKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxNywge2Q0LCBkNSwgZDYsIGQ3fSwgZDEKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxOCwge2Q0LCBkNSwgZDYsIGQ3fSwgZDIKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxOSwge2Q0LCBkNSwgZDYsIGQ3fSwgZDMKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTYsIGQxNywgZDE4LCBkMTl9LCBbcjYsIDoxMjhdCisgICAgICAgIHZ0YmwuOCAgICAgICAgICBkMTYsIHtkMjAsIGQyMSwgZDIyLCBkMjN9LCBkMAorICAgICAgICB2dGJsLjggICAgICAgICAgZDE3LCB7ZDIwLCBkMjEsIGQyMiwgZDIzfSwgZDEKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxOCwge2QyMCwgZDIxLCBkMjIsIGQyM30sIGQyCisgICAgICAgIHZ0YmwuOCAgICAgICAgICBkMTksIHtkMjAsIGQyMSwgZDIyLCBkMjN9LCBkMworICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxNiwgZDE3LCBkMTgsIGQxOX0sIFtyNywgOjEyOF0KKyAgICAgICAgc3VicyAgICAgICAgICAgIHIzLCAgcjMsICAjMTYKKyAgICAgICAgYmd0ICAgICAgICAgICAgIDFiCisgICAgICAgIGIgICAgICAgICAgICAgICA5ZgorODoKKyAgICAgICAgQCBtb25vCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDAsIGQxLCBkMiwgZDN9LCBbcjUsIDoxMjhdCisxOgorICAgICAgICBzdWIgICAgICAgICAgICAgcjYsICByNiwgICMzMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICMxNgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0LCBkNSwgZDYsIGQ3fSwgW3IxXSEKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxNiwge2Q0LCBkNSwgZDYsIGQ3fSwgZDAKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxNywge2Q0LCBkNSwgZDYsIGQ3fSwgZDEKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxOCwge2Q0LCBkNSwgZDYsIGQ3fSwgZDIKKyAgICAgICAgdnRibC44ICAgICAgICAgIGQxOSwge2Q0LCBkNSwgZDYsIGQ3fSwgZDMKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTYsIGQxNywgZDE4LCBkMTl9LCBbcjYsIDoxMjhdCisgICAgICAgIHN1YnMgICAgICAgICAgICByMywgIHIzLCAgIzE2CisgICAgICAgIGJndCAgICAgICAgICAgICAxYgorOToKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMSwgcjMtcjd9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vc2JyZHNwX25lb24uUyBiL2xpYmF2Y29kZWMvYXJtL3NicmRzcF9uZW9uLlMKaW5kZXggZTY2YWJkNi4uMDAzYjA0ZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vc2JyZHNwX25lb24uUworKysgYi9saWJhdmNvZGVjL2FybS9zYnJkc3BfbmVvbi5TCkBAIC0zMzYsMTEgKzMzNiwxMSBAQAogICAgICAgICB2bGQxLjMyICAgICAgICAge2QwfSwgICAgIFtyMCw6NjRdCiAgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDZ9LCAgICAgW2xyLDo2NF0KICAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMltdfSwgICBbcjEsOjMyXSEKLSAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkM1tdfSwgICBbcjIsOjMyXSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMThbXX0sICBbcjIsOjMyXSEKICAgICAgICAgdmNlcS5mMzIgICAgICAgIGQ0LCAgZDIsICAjMAogICAgICAgICB2ZW9yICAgICAgICAgICAgZDIsICBkMiwgIGQzCiAgICAgICAgIHZtb3YgICAgICAgICAgICBkMSwgIGQwCi0gICAgICAgIHZtbGEuZjMyICAgICAgICBkMCwgIGQ2LCAgZDMKKyAgICAgICAgdm1sYS5mMzIgICAgICAgIGQwLCAgZDYsICBkMTgKICAgICAgICAgdmFkZC5mMzIgICAgICAgIHMyLCAgczIsICBzNAogICAgICAgICB2YmlmICAgICAgICAgICAgZDAsICBkMSwgIGQ0CiAgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDB9LCAgICAgW3IwLDo2NF0hCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9hcm0uUyBiL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X2FybS5TCmluZGV4IGM2MzAwNzMuLjQyZDc5YWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X2FybS5TCisrKyBiL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X2FybS5TCkBAIC02NCw3ICs2NCw3IEBACiAKIAogX19yb3dfbG9vcDoKLSAgICAgICAgQEAgcmVhZCB0aGUgcm93IGFuZCBjaGVjayBpZiBpdCBpcyBudWxsLCBhbG1vc3QgbnVsbCwgb3Igbm90LCBhY2NvcmRpbmcgdG8gc3Ryb25nYXJtIHNwZWNzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIG9wdGltaXplIGxkciBhY2Nlc3NlcyAoaS5lLiBzcGxpdCAzMmJpdHMgaW4gMiAxNmJpdHMgd29yZHMpLCBhdCBsZWFzdCBpdCBnaXZlcyBtb3JlIHVzYWJsZSByZWdpc3RlcnMgOikKKyAgICAgICAgQEAgcmVhZCB0aGUgcm93IGFuZCBjaGVjayBpZiBpdCBpcyBudWxsLCBhbG1vc3QgbnVsbCwgb3Igbm90LCBhY2NvcmRpbmcgdG8gc3Ryb25nYXJtIHNwZWNzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIG9wdGltaXplIGxkciBhY2Nlc3NlcyAoaS5lLiBzcGxpdCAzMiBiaXRzIGluIHR3byAxNi1iaXQgd29yZHMpLCBhdCBsZWFzdCBpdCBnaXZlcyBtb3JlIHVzYWJsZSByZWdpc3RlcnMgOikKICAgICAgICAgbGRyIHIxLCBbcjE0LCAjMF0gICAgICAgIEAgUjE9KGludDMyKShSMTIpWzBdPVJPV3IzMlswXSAocmVsYXRpdmUgcm93IGNhc3QgdG8gYSAzMmIgcG9pbnRlcikKICAgICAgICAgbGRyIHIyLCBbcjE0LCAjNF0gICAgICAgIEAgUjI9KGludDMyKShSMTIpWzFdPVJPV3IzMlsxXQogICAgICAgICBsZHIgcjMsIFtyMTQsICM4XSAgICAgICAgQCBSMz1ST1dyMzJbMl0KQEAgLTIzNCw4ICsyMzQsOCBAQAogICAgICAgICBAQCByb3dbN10gPSAoYTAgLSBiMCkgPj4gUk9XX1NISUZUOwogICAgICAgICBhZGQgcjgsIHI2LCByMCAgICAgICAgICAgQCBSOD1hMCtiMAogICAgICAgICBhZGQgcjksIHIyLCByMSAgICAgICAgICAgQCBSOT1hMStiMQotICAgICAgICBAQCBwdXQgMiAxNiBiaXRzIGhhbGYtd29yZHMgaW4gYSAzMmJpdHMgd29yZAotICAgICAgICBAQCBST1dyMzJbMF09Uk9XcjE2WzBdIHwgKFJPV3IxNlsxXTw8MTYpIChvbmx5IExpdHRsZSBFbmRpYW4gY29tcGxpYW50IHRoZW4hISEpCisgICAgICAgIEBAIHB1dCB0d28gMTYtYml0IGhhbGYtd29yZHMgaW4gYSAzMi1iaXQgd29yZAorICAgICAgICBAQCBST1dyMzJbMF09Uk9XcjE2WzBdIHwgKFJPV3IxNlsxXTw8MTYpIChvbmx5IGxpdHRsZS1lbmRpYW4gY29tcGxpYW50IHRoZW4hISEpCiAgICAgICAgIGxkciByMTAsID1NQVNLX01TSFcgICAgICBAIFIxMD0weEZGRkYwMDAwCiAgICAgICAgIGFuZCByOSwgcjEwLCByOSwgbHNsICNST1dfU0hJRlQyTVNIVyBAIFI5PTB4RkZGRjAwMDAgJiAoKGExK2IxKTw8NSkKICAgICAgICAgbXZuIHIxMSwgcjEwICAgICAgICAgICAgIEAgUjExPSBOT1QgUjEwPSAweDAwMDBGRkZGCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9hcm12NXRlLlMgYi9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9hcm12NXRlLlMKaW5kZXggZDFmMTBiNy4uYThkMDM0NiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hcm0vc2ltcGxlX2lkY3RfYXJtdjV0ZS5TCisrKyBiL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X2FybXY1dGUuUwpAQCAtMTQ4LDEyICsxNDgsNiBAQAogICAgICAgICBsZHIgICAgYTQsIFthMV0gICAgICAgICAgICAgIC8qIGE0ID0gY29sWzE6MF0gKi8KICAgICAgICAgbW92ICAgIGlwLCAjMTYzODQKICAgICAgICAgc3ViICAgIGlwLCBpcCwgIzEgICAgICAgICAgICAvKiBpcCA9IFc0ICovCi0jaWYgMAotICAgICAgICBtb3YgICAgdjEsICMoMTw8KENPTF9TSElGVC0xKSkKLSAgICAgICAgc21sYWJ0IHYyLCBpcCwgYTQsIHYxICAgICAgICAvKiB2MiA9IFc0KmNvbFsxXSArICgxPDwoQ09MX1NISUZULTEpKSAqLwotICAgICAgICBzbWxhYmIgdjEsIGlwLCBhNCwgdjEgICAgICAgIC8qIHYxID0gVzQqY29sWzBdICsgKDE8PChDT0xfU0hJRlQtMSkpICovCi0gICAgICAgIGxkciAgICBhNCwgW2ExLCAjKDE2KjQpXQotI2Vsc2UKICAgICAgICAgbW92ICAgIHYxLCAjKCgxPDwoQ09MX1NISUZULTEpKS9XNCkgLyogdGhpcyBtYXRjaGVzIHRoZSBDIHZlcnNpb24gKi8KICAgICAgICAgYWRkICAgIHYyLCB2MSwgYTQsIGFzciAjMTYKICAgICAgICAgcnNiICAgIHYyLCB2MiwgdjIsIGxzbCAjMTQKQEAgLTE2MSw3ICsxNTUsNiBAQAogICAgICAgICBhZGQgICAgdjEsIHYxLCBhNCwgYXNyICMxNgogICAgICAgICBsZHIgICAgYTQsIFthMSwgIygxNio0KV0KICAgICAgICAgcnNiICAgIHYxLCB2MSwgdjEsIGxzbCAjMTQKLSNlbmRpZgogCiAgICAgICAgIHNtdWxiYiBsciwgaXAsIGE0CiAgICAgICAgIHNtdWxidCBhMywgaXAsIGE0CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9hcm12Ni5TIGIvbGliYXZjb2RlYy9hcm0vc2ltcGxlX2lkY3RfYXJtdjYuUwppbmRleCA3OWNmNWQ0Li5mOTVjMjBkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9hcm12Ni5TCisrKyBiL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X2FybXY2LlMKQEAgLTM5MCw3ICszOTAsNyBAQAogICAgICAgICBwb3AgICAge3I0LXIxMSwgcGN9CiBlbmRmdW5jCiAKLS8qIGZmX3NpbXBsZV9pZGN0X2FkZF9hcm12Nih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsgKi8KKy8qIGZmX3NpbXBsZV9pZGN0X2FkZF9hcm12Nih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsgKi8KIGZ1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X2FkZF9hcm12NiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgIHtyMCwgcjEsIHI0LXIxMSwgbHJ9CiAgICAgICAgIHN1YiAgICBzcCwgc3AsICMxMjgKQEAgLTQwNyw3ICs0MDcsNyBAQAogICAgICAgICBwb3AgICAge3I0LXIxMSwgcGN9CiBlbmRmdW5jCiAKLS8qIGZmX3NpbXBsZV9pZGN0X3B1dF9hcm12Nih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsgKi8KKy8qIGZmX3NpbXBsZV9pZGN0X3B1dF9hcm12Nih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsgKi8KIGZ1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X3B1dF9hcm12NiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgIHtyMCwgcjEsIHI0LXIxMSwgbHJ9CiAgICAgICAgIHN1YiAgICBzcCwgc3AsICMxMjgKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X25lb24uUyBiL2xpYmF2Y29kZWMvYXJtL3NpbXBsZV9pZGN0X25lb24uUwppbmRleCBjM2U1NzNjLi43MjZkNGNiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS9zaW1wbGVfaWRjdF9uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vc2ltcGxlX2lkY3RfbmVvbi5TCkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNywgcGN9CiAgICAgICAgIC5lbmRtCiAKLS8qIHZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X25lb24odWludDhfdCAqZHN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsgKi8KKy8qIHZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X25lb24odWludDhfdCAqZHN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsgKi8KIGZ1bmN0aW9uIGZmX3NpbXBsZV9pZGN0X3B1dF9uZW9uLCBleHBvcnQ9MQogICAgICAgICBpZGN0X3N0YXJ0ICAgICAgcjIKIApAQCAtMzE2LDcgKzMxNiw3IEBACiAgICAgICAgIGJ4ICAgICAgICAgICAgICBscgogZW5kZnVuYwogCi0vKiB2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7ICovCisvKiB2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7ICovCiBmdW5jdGlvbiBmZl9zaW1wbGVfaWRjdF9hZGRfbmVvbiwgZXhwb3J0PTEKICAgICAgICAgaWRjdF9zdGFydCAgICAgIHIyCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcF9pbml0X25lb24uYyBiL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcF9pbml0X25lb24uYwppbmRleCBiYjg3M2U2Li4yY2NhNzg0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS92YzFkc3BfaW5pdF9uZW9uLmMKKysrIGIvbGliYXZjb2RlYy9hcm0vdmMxZHNwX2luaXRfbmVvbi5jCkBAIC0yMiwxNyArMjIsMTUgQEAKICNpbmNsdWRlICJsaWJhdmNvZGVjL3ZjMWRzcC5oIgogI2luY2x1ZGUgInZjMWRzcC5oIgogCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KIHZvaWQgZmZfdmMxX2ludl90cmFuc184eDhfbmVvbihpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3ZjMV9pbnZfdHJhbnNfNHg4X25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3ZjMV9pbnZfdHJhbnNfOHg0X25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3ZjMV9pbnZfdHJhbnNfNHg0X25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfNHg4X25lb24odWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92YzFfaW52X3RyYW5zXzh4NF9uZW9uKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfdmMxX2ludl90cmFuc180eDRfbmVvbih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7CiAKLXZvaWQgZmZfdmMxX2ludl90cmFuc184eDhfZGNfbmVvbih1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKLXZvaWQgZmZfdmMxX2ludl90cmFuc180eDhfZGNfbmVvbih1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKLXZvaWQgZmZfdmMxX2ludl90cmFuc184eDRfZGNfbmVvbih1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKLXZvaWQgZmZfdmMxX2ludl90cmFuc180eDRfZGNfbmVvbih1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfdmMxX2ludl90cmFuc184eDhfZGNfbmVvbih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfNHg4X2RjX25lb24odWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92YzFfaW52X3RyYW5zXzh4NF9kY19uZW9uKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfdmMxX2ludl90cmFuc180eDRfZGNfbmVvbih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7CiAKIHZvaWQgZmZfcHV0X3BpeGVsczh4OF9uZW9uKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgcm5kKTsKQEAgLTcwLDE0ICs2OCwxNCBAQAogREVDTF9QVVQoMywgMikKIERFQ0xfUFVUKDMsIDMpCiAKLXZvaWQgZmZfcHV0X3ZjMV9jaHJvbWFfbWM4X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwotdm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX3B1dF92YzFfY2hyb21hX21jNF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KTsKLXZvaWQgZmZfYXZnX3ZjMV9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9wdXRfdmMxX2Nocm9tYV9tYzhfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX2F2Z192YzFfY2hyb21hX21jOF9uZW9uKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfcHV0X3ZjMV9jaHJvbWFfbWM0X25lb24odWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzRfbmVvbih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKICNkZWZpbmUgRk5fQVNTSUdOKFgsIFkpIFwKICAgICBkc3AtPnB1dF92YzFfbXNwZWxfcGl4ZWxzX3RhYlswXVtYKzQqWV0gPSBmZl9wdXRfdmMxX21zcGVsX21jIyNYIyNZIyNfMTZfbmVvbjsgXApAQCAtOTUsNyArOTMsNiBAQAogICAgIGRzcC0+dmMxX2ludl90cmFuc180eDRfZGMgPSBmZl92YzFfaW52X3RyYW5zXzR4NF9kY19uZW9uOwogCiAgICAgZHNwLT5wdXRfdmMxX21zcGVsX3BpeGVsc190YWJbMV1bIDBdID0gZmZfcHV0X3BpeGVsczh4OF9uZW9uOwotICAgIGlmIChIQVZFX0FTX0ROX0RJUkVDVElWRSkgewogICAgIEZOX0FTU0lHTigxLCAwKTsKICAgICBGTl9BU1NJR04oMiwgMCk7CiAgICAgRk5fQVNTSUdOKDMsIDApOwpAQCAtMTE0LDcgKzExMSw2IEBACiAgICAgRk5fQVNTSUdOKDEsIDMpOwogICAgIEZOX0FTU0lHTigyLCAzKTsKICAgICBGTl9BU1NJR04oMywgMyk7Ci0gICAgfQogCiAgICAgZHNwLT5wdXRfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX3B1dF92YzFfY2hyb21hX21jOF9uZW9uOwogICAgIGRzcC0+YXZnX25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbmVvbjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcF9uZW9uLlMgYi9saWJhdmNvZGVjL2FybS92YzFkc3BfbmVvbi5TCmluZGV4IGM0ZjRkYjkuLjkzZjA0M2IgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL3ZjMWRzcF9uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vdmMxZHNwX25lb24uUwpAQCAtNDEwLDEzICs0MTAsMTMgQEAKICAgICAgICAgQCAgIHNyY1s0OF0gcTE0CiAgICAgICAgIEAgICBzcmNbNTZdIHExNQogCi0gICAgICAgIHZjMV9pbnZfdHJhbnNfOHg4X2hlbHBlciBhZGQ9NCBhZGQxYmVmb3Jlc2hpZnQ9MCByc2hpZnQ9MworICAgICAgICB2YzFfaW52X3RyYW5zXzh4OF9oZWxwZXIgYWRkPTQsIGFkZDFiZWZvcmVzaGlmdD0wLCByc2hpZnQ9MwogCiAgICAgICAgIEAgVHJhbnNwb3NlIHJlc3VsdCBtYXRyaXggb2YgOHg4CiAgICAgICAgIHN3YXA0ICAgICAgICAgICBkMTcsIGQxOSwgZDIxLCBkMjMsIGQyNCwgZDI2LCBkMjgsIGQzMAogICAgICAgICB0cmFuc3Bvc2UxNl80eDQgcTgsICBxOSwgIHExMCwgcTExLCBxMTIsIHExMywgcTE0LCBxMTUKIAotICAgICAgICB2YzFfaW52X3RyYW5zXzh4OF9oZWxwZXIgYWRkPTY0IGFkZDFiZWZvcmVzaGlmdD0xIHJzaGlmdD03CisgICAgICAgIHZjMV9pbnZfdHJhbnNfOHg4X2hlbHBlciBhZGQ9NjQsIGFkZDFiZWZvcmVzaGlmdD0xLCByc2hpZnQ9NwogCiAgICAgICAgIHZzdDEuNjQgICAgICAgICB7cTgtcTl9LCAgIFtyMCw6MTI4XSEKICAgICAgICAgdnN0MS42NCAgICAgICAgIHtxMTAtcTExfSwgW3IwLDoxMjhdIQpAQCAtNDI2LDEyICs0MjYsMTIgQEAKICAgICAgICAgYnggICAgICAgICAgICAgIGxyCiBlbmRmdW5jCiAKLUAgKHVpbnQ4X3QgKmRlc3QgW3IwXSwgaW50IGxpbmVzaXplIFtyMV0sIGludDE2X3QgKmJsb2NrIFtyMl0pCitAICh1aW50OF90ICpkZXN0IFtyMF0sIHB0cmRpZmZfdCBzdHJpZGUgW3IxXSwgaW50MTZfdCAqYmxvY2sgW3IyXSkKIGZ1bmN0aW9uIGZmX3ZjMV9pbnZfdHJhbnNfOHg0X25lb24sIGV4cG9ydD0xCiAgICAgICAgIHZsZDEuNjQgICAgICAgICB7cTAtcTF9LCBbcjIsOjEyOF0hICAgICBAIGxvYWQgOCAqIDQgKiAyID0gNjQgYnl0ZXMgLyAxNiBieXRlcyBwZXIgcXVhZCA9IDQgcXVhZCByZWdpc3RlcnMKICAgICAgICAgdmxkMS42NCAgICAgICAgIHtxMi1xM30sIFtyMiw6MTI4XQogCi0gICAgICAgIHRyYW5zcG9zZTE2ICAgICBxMCBxMSBxMiBxMyAgICAgICAgICAgICBAIHRyYW5zcG9zZSByb3dzIHRvIGNvbHVtbnMKKyAgICAgICAgdHJhbnNwb3NlMTYgICAgIHEwLCBxMSwgcTIsIHEzICAgICAgICAgIEAgdHJhbnNwb3NlIHJvd3MgdG8gY29sdW1ucwogCiAgICAgICAgIEAgQXQgdGhpcyBwb2ludDoKICAgICAgICAgQCAgIHNyY1swXSAgIGQwCkBAIC00NDMsNyArNDQzLDcgQEAKICAgICAgICAgQCAgIHNyY1s2XSAgIGQ1CiAgICAgICAgIEAgICBzcmNbN10gICBkNwogCi0gICAgICAgIHZjMV9pbnZfdHJhbnNfOHg0X2hlbHBlciAgICBhZGQ9NCBhZGQxYmVmb3Jlc2hpZnQ9MCByc2hpZnQ9MworICAgICAgICB2YzFfaW52X3RyYW5zXzh4NF9oZWxwZXIgICAgYWRkPTQsIGFkZDFiZWZvcmVzaGlmdD0wLCByc2hpZnQ9MwogCiAgICAgICAgIEAgTW92ZSBvdXRwdXQgdG8gbW9yZSBzdGFuZGFyZGl6ZWQgcmVnaXN0ZXJzCiAgICAgICAgIHZtb3YgICAgICAgIGQwLCBkMTYKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgICAgICBAICAgZHN0WzZdICAgZDUKICAgICAgICAgQCAgIGRzdFs3XSAgIGQ3CiAKLSAgICAgICAgdHJhbnNwb3NlMTYgICAgIHEwIHExIHEyIHEzICAgQCB0dXJuIGNvbHVtbnMgaW50byByb3dzCisgICAgICAgIHRyYW5zcG9zZTE2ICAgICBxMCwgcTEsIHEyLCBxMyAgIEAgdHVybiBjb2x1bW5zIGludG8gcm93cwogCiAgICAgICAgIEAgQXQgdGhpcyBwb2ludDoKICAgICAgICAgQCAgIHJvd1swXSBxMApAQCAtNDczLDcgKzQ3Myw3IEBACiAgICAgICAgIEAgICByb3dbMl0gcTIKICAgICAgICAgQCAgIHJvd1szXSBxMwogCi0gICAgICAgIHZjMV9pbnZfdHJhbnNfNHg4X2hlbHBlciAgICBhZGQ9NjQgcnNoaWZ0PTcKKyAgICAgICAgdmMxX2ludl90cmFuc180eDhfaGVscGVyICAgIGFkZD02NCwgcnNoaWZ0PTcKIAogICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CiAgICAgICAgIEAgICBsaW5lWzBdLmwgICBkMApAQCAtNTExLDcgKzUxMSw3IEBACiAgICAgICAgIGJ4ICAgICAgICAgICAgICBscgogZW5kZnVuYwogCi1AICh1aW50OF90ICpkZXN0IFtyMF0sIGludCBsaW5lc2l6ZSBbcjFdLCBpbnQxNl90ICpibG9jayBbcjJdKQorQCAodWludDhfdCAqZGVzdCBbcjBdLCBwdHJkaWZmX3Qgc3RyaWRlIFtyMV0sIGludDE2X3QgKmJsb2NrIFtyMl0pCiBmdW5jdGlvbiBmZl92YzFfaW52X3RyYW5zXzR4OF9uZW9uLCBleHBvcnQ9MQogICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjKDggKiAyKSAgQCA4IGVsZW1lbnRzIHBlciBsaW5lLCBlYWNoIGVsZW1lbnQgMiBieXRlcwogICAgICAgICB2bGQ0LjE2ICAgICAgICAge2QwW10sICBkMltdLCAgZDRbXSwgIGQ2W119LCAgW3IyLDo2NF0sIHIxMiAgICAgQCByZWFkIGVhY2ggY29sdW1uIGludG8gYSBxIHJlZ2lzdGVyCkBAIC01MjMsNyArNTIzLDcgQEAKICAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMVsyXSwgZDNbMl0sIGQ1WzJdLCBkN1syXX0sIFtyMiw6NjRdLCByMTIKICAgICAgICAgdmxkNC4xNiAgICAgICAgIHtkMVszXSwgZDNbM10sIGQ1WzNdLCBkN1szXX0sIFtyMiw6NjRdCiAKLSAgICAgICAgdmMxX2ludl90cmFuc180eDhfaGVscGVyICAgIGFkZD00IHJzaGlmdD0zCisgICAgICAgIHZjMV9pbnZfdHJhbnNfNHg4X2hlbHBlciAgICBhZGQ9NCwgcnNoaWZ0PTMKIAogICAgICAgICBAIEF0IHRoaXMgcG9pbnQ6CiAgICAgICAgIEAgICBkc3RbMF0gPSBxMApAQCAtNTMxLDkgKzUzMSw5IEBACiAgICAgICAgIEAgICBkc3RbMl0gPSBxMgogICAgICAgICBAICAgZHN0WzNdID0gcTMKIAotICAgICAgICB0cmFuc3Bvc2UxNiAgICAgcTAgcTEgcTIgcTMgICAgIEAgVHJhbnNwb3NlIHJvd3MgKHJlZ2lzdGVycykgaW50byBjb2x1bW5zCisgICAgICAgIHRyYW5zcG9zZTE2ICAgICBxMCwgcTEsIHEyLCBxMyAgQCBUcmFuc3Bvc2Ugcm93cyAocmVnaXN0ZXJzKSBpbnRvIGNvbHVtbnMKIAotICAgICAgICB2YzFfaW52X3RyYW5zXzh4NF9oZWxwZXIgICAgYWRkPTY0IGFkZDFiZWZvcmVzaGlmdD0xIHJzaGlmdD03CisgICAgICAgIHZjMV9pbnZfdHJhbnNfOHg0X2hlbHBlciAgICBhZGQ9NjQsIGFkZDFiZWZvcmVzaGlmdD0xLCByc2hpZnQ9NwogCiAgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI4W119LCAgW3IwLDozMl0sIHIxICBAIHJlYWQgZGVzdAogICAgICAgICB2bGQxLjMyICAgICAgICAge2QyOFsxXX0sIFtyMCw6MzJdLCByMQpAQCAtNTkzLDcgKzU5Myw3IEBACiAgICAgICAgIHZzaHIuczE2ICAgICAgICBxMSwgIHExLCAgI1xyc2hpZnQgICAgICBAIGRzdFszLDFdID4+PSByc2hpZnQKIC5lbmRtCiAKLUAgKHVpbnQ4X3QgKmRlc3QgW3IwXSwgaW50IGxpbmVzaXplIFtyMV0sIGludDE2X3QgKmJsb2NrIFtyMl0pCitAICh1aW50OF90ICpkZXN0IFtyMF0sIHB0cmRpZmZfdCBzdHJpZGUgW3IxXSwgaW50MTZfdCAqYmxvY2sgW3IyXSkKIGZ1bmN0aW9uIGZmX3ZjMV9pbnZfdHJhbnNfNHg0X25lb24sIGV4cG9ydD0xCiAgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMoOCAqIDIpICBAIDggZWxlbWVudHMgcGVyIGxpbmUsIGVhY2ggZWxlbWVudCAyIGJ5dGVzCiAgICAgICAgIHZsZDQuMTYgICAgICAgICB7ZDBbXSwgIGQxW10sICBkMltdLCAgZDNbXX0sICBbcjIsOjY0XSwgcjEyICAgICBAIHJlYWQgZWFjaCBjb2x1bW4gaW50byBhIHJlZ2lzdGVyCkBAIC02MTEsNyArNjExLDcgQEAKICAgICAgICAgQCAgIHNyY1syXSA9IGQxCiAgICAgICAgIEAgICBzcmNbM10gPSBkMwogCi0gICAgICAgIHZjMV9pbnZfdHJhbnNfNHg0X2hlbHBlciBhZGQ9NCByc2hpZnQ9MyAgICAgIEAgY29tcHV0ZSB0MSwgdDIsIHQzLCB0NCBhbmQgY29tYmluZSB0aGVtIGludG8gZHN0WzAtM10KKyAgICAgICAgdmMxX2ludl90cmFuc180eDRfaGVscGVyIGFkZD00LCByc2hpZnQ9MyAgICAgQCBjb21wdXRlIHQxLCB0MiwgdDMsIHQ0IGFuZCBjb21iaW5lIHRoZW0gaW50byBkc3RbMC0zXQogCiAgICAgICAgIEAgQXQgdGhpcyBwb2ludDoKICAgICAgICAgQCAgIGRzdFswXSA9IGQwCkBAIC02MTksNyArNjE5LDcgQEAKICAgICAgICAgQCAgIGRzdFsyXSA9IGQxCiAgICAgICAgIEAgICBkc3RbM10gPSBkMgogCi0gICAgICAgIHRyYW5zcG9zZTE2ICAgICBkMCBkMyBkMSBkMiAgICAgQCBUcmFuc3Bvc2Ugcm93cyAocmVnaXN0ZXJzKSBpbnRvIGNvbHVtbnMKKyAgICAgICAgdHJhbnNwb3NlMTYgICAgIGQwLCBkMywgZDEsIGQyICBAIFRyYW5zcG9zZSByb3dzIChyZWdpc3RlcnMpIGludG8gY29sdW1ucwogCiAgICAgICAgIEAgQXQgdGhpcyBwb2ludDoKICAgICAgICAgQCAgIHNyY1swXSAgPSBkMApAQCAtNjM1LDcgKzYzNSw3IEBACiAgICAgICAgIEAgICBzcmNbMTZdID0gZDEKICAgICAgICAgQCAgIHNyY1syNF0gPSBkMwogCi0gICAgICAgIHZjMV9pbnZfdHJhbnNfNHg0X2hlbHBlciBhZGQ9NjQgcnNoaWZ0PTcgICAgICAgICAgICAgIEAgY29tcHV0ZSB0MSwgdDIsIHQzLCB0NCBhbmQgY29tYmluZSB0aGVtIGludG8gZHN0WzAtM10KKyAgICAgICAgdmMxX2ludl90cmFuc180eDRfaGVscGVyIGFkZD02NCwgcnNoaWZ0PTcgICAgICAgICAgICAgQCBjb21wdXRlIHQxLCB0MiwgdDMsIHQ0IGFuZCBjb21iaW5lIHRoZW0gaW50byBkc3RbMC0zXQogCiAgICAgICAgIEAgQXQgdGhpcyBwb2ludDoKICAgICAgICAgQCAgIGxpbmVbMF0gPSBkMApAQCAtNjYzLDQ4ICs2NjMsNDMgQEAKICAgICAgICAgYnggICAgICAgICAgICAgIGxyCiBlbmRmdW5jCiAKLSNpZiBIQVZFX0FTX0ROX0RJUkVDVElWRQogQCBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgbXVsdGlwbGljYXRpb24gY29uc3RhbnRzIGZyb20gdmMxX21zcGVsX2ZpbHRlciBhbmQgdmMxX21zcGVsX3t2ZXIsaG9yfV9maWx0ZXJfMTZiaXRzLgogQCBUaGUgc2lnbiBpcyBlbWJlZGRlZCBpbiB0aGUgY29kZSBiZWxvdyB0aGF0IGNhcnJpZXMgb3V0IHRoZSBtdWx0aXBsaWNhdGlvbiAobXNwZWxfZmlsdGVyeywuMTZ9KS4KLSNkZWZpbmUgTVNQRUxfTU9ERV8xX01VTF9DT05TVEFOVFMgIDQgNTMgMTggMwotI2RlZmluZSBNU1BFTF9NT0RFXzJfTVVMX0NPTlNUQU5UUyAgMSA5ICA5ICAxCi0jZGVmaW5lIE1TUEVMX01PREVfM19NVUxfQ09OU1RBTlRTICAzIDE4IDUzIDQKKyNkZWZpbmUgTVNQRUxfTU9ERV8xX01VTF9DT05TVEFOVFMgIDQsIDUzLCAxOCwgMworI2RlZmluZSBNU1BFTF9NT0RFXzJfTVVMX0NPTlNUQU5UUyAgMSwgOSwgIDksICAxCisjZGVmaW5lIE1TUEVMX01PREVfM19NVUxfQ09OU1RBTlRTICAzLCAxOCwgNTMsIDQKIAogQCBUaGVzZSBjb25zdGFudHMgYXJlIGZyb20gcmVhZGluZyB0aGUgc291cmNlIGNvZGUgb2YgdmMxX21zcGVsX21jIGFuZCBkZXRlcm1pbmluZyB0aGUgdmFsdWUgdGhhdAogQCBpcyBhZGRlZCB0byBgcm5kYCB0byByZXN1bHQgaW4gdGhlIHZhcmlhYmxlIGByYCwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgYHNoaWZ0YC4KLSNkZWZpbmUgTVNQRUxfTU9ERVNfMTFfQUREU0hJRlRfQ09OU1RBTlRTICAgMTUgNQotI2RlZmluZSBNU1BFTF9NT0RFU18xMl9BRERTSElGVF9DT05TVEFOVFMgICAzICAzCi0jZGVmaW5lIE1TUEVMX01PREVTXzEzX0FERFNISUZUX0NPTlNUQU5UUyAgIDE1IDUKKyNkZWZpbmUgTVNQRUxfTU9ERVNfMTFfQUREU0hJRlRfQ09OU1RBTlRTICAgMTUsIDUKKyNkZWZpbmUgTVNQRUxfTU9ERVNfMTJfQUREU0hJRlRfQ09OU1RBTlRTICAgMywgIDMKKyNkZWZpbmUgTVNQRUxfTU9ERVNfMTNfQUREU0hJRlRfQ09OU1RBTlRTICAgMTUsIDUKICNkZWZpbmUgTVNQRUxfTU9ERVNfMjFfQUREU0hJRlRfQ09OU1RBTlRTICAgTVNQRUxfTU9ERVNfMTJfQUREU0hJRlRfQ09OU1RBTlRTCi0jZGVmaW5lIE1TUEVMX01PREVTXzIyX0FERFNISUZUX0NPTlNUQU5UUyAgIDAgIDEKLSNkZWZpbmUgTVNQRUxfTU9ERVNfMjNfQUREU0hJRlRfQ09OU1RBTlRTICAgMyAgMworI2RlZmluZSBNU1BFTF9NT0RFU18yMl9BRERTSElGVF9DT05TVEFOVFMgICAwLCAgMQorI2RlZmluZSBNU1BFTF9NT0RFU18yM19BRERTSElGVF9DT05TVEFOVFMgICAzLCAgMwogI2RlZmluZSBNU1BFTF9NT0RFU18zMV9BRERTSElGVF9DT05TVEFOVFMgICBNU1BFTF9NT0RFU18xM19BRERTSElGVF9DT05TVEFOVFMKICNkZWZpbmUgTVNQRUxfTU9ERVNfMzJfQUREU0hJRlRfQ09OU1RBTlRTICAgTVNQRUxfTU9ERVNfMjNfQUREU0hJRlRfQ09OU1RBTlRTCi0jZGVmaW5lIE1TUEVMX01PREVTXzMzX0FERFNISUZUX0NPTlNUQU5UUyAgIDE1IDUKKyNkZWZpbmUgTVNQRUxfTU9ERVNfMzNfQUREU0hJRlRfQ09OU1RBTlRTICAgMTUsIDUKIAogQCBUaGUgYWRkaXRpb24gYW5kIHNoaWZ0IGNvbnN0YW50cyBmcm9tIHZjMV9tc3BlbF9maWx0ZXIuCi0jZGVmaW5lIE1TUEVMX01PREVfMV9BRERTSElGVF9DT05TVEFOVFMgICAgIDMyIDYKLSNkZWZpbmUgTVNQRUxfTU9ERV8yX0FERFNISUZUX0NPTlNUQU5UUyAgICAgOCAgNAotI2RlZmluZSBNU1BFTF9NT0RFXzNfQUREU0hJRlRfQ09OU1RBTlRTICAgICAzMiA2CisjZGVmaW5lIE1TUEVMX01PREVfMV9BRERTSElGVF9DT05TVEFOVFMgICAgIDMyLCA2CisjZGVmaW5lIE1TUEVMX01PREVfMl9BRERTSElGVF9DT05TVEFOVFMgICAgIDgsICA0CisjZGVmaW5lIE1TUEVMX01PREVfM19BRERTSElGVF9DT05TVEFOVFMgICAgIDMyLCA2CiAKIEAgU2V0dXAgY29uc3RhbnRzIGluIHJlZ2lzdGVycyBmb3IgYSBzdWJzZXF1ZW50IHVzZSBvZiBtc3BlbF9maWx0ZXJ7LC4xNn0uCiAubWFjcm8gbXNwZWxfY29uc3RhbnRzIHR5cGVzaXplIHJlZ19hIHJlZ19iIHJlZ19jIHJlZ19kIGZpbHRlcl9hIGZpbHRlcl9iIGZpbHRlcl9jIGZpbHRlcl9kIHJlZ19hZGQgZmlsdGVyX2FkZF9yZWdpc3RlcgotICBAIERlZmluZSBkb3VibGUtd29yZCByZWdpc3RlciBhbGlhc2VzLiBUeXBlc2l6ZSBzaG91bGQgYmUgaTggb3IgaTE2LgotICByYSAuZG4gXHJlZ19hXCgpLlx0eXBlc2l6ZQotICByYiAuZG4gXHJlZ19iXCgpLlx0eXBlc2l6ZQotICByYyAuZG4gXHJlZ19jXCgpLlx0eXBlc2l6ZQotICByZCAuZG4gXHJlZ19kXCgpLlx0eXBlc2l6ZQorICBAIFR5cGVzaXplIHNob3VsZCBiZSBpOCBvciBpMTYuCiAKICAgQCBPbmx5IHNldCB0aGUgcmVnaXN0ZXIgaWYgdGhlIHZhbHVlIGlzIG5vdCAxIGFuZCB1bmlxdWUKICAgLmlmIFxmaWx0ZXJfYSAhPSAxCi0gICAgICAgIHZtb3YgICAgICAgICAgICByYSwgICNcZmlsdGVyX2EgICAgICAgICAgICAgIEAgcmEgPSBmaWx0ZXJfYQorICAgICAgICB2bW92Llx0eXBlc2l6ZSAgXHJlZ19hLCAgI1xmaWx0ZXJfYSAgICAgICAgICBAIHJlZ19hID0gZmlsdGVyX2EKICAgLmVuZGlmCi0gICAgICAgIHZtb3YgICAgICAgICAgICByYiwgICNcZmlsdGVyX2IgICAgICAgICAgICAgIEAgcmIgPSBmaWx0ZXJfYgorICAgICAgICB2bW92Llx0eXBlc2l6ZSAgXHJlZ19iLCAgI1xmaWx0ZXJfYiAgICAgICAgICBAIHJlZ19iID0gZmlsdGVyX2IKICAgLmlmIFxmaWx0ZXJfYiAhPSBcZmlsdGVyX2MKLSAgICAgICAgdm1vdiAgICAgICAgICAgIHJjLCAgI1xmaWx0ZXJfYyAgICAgICAgICAgICAgQCByYyA9IGZpbHRlcl9jCisgICAgICAgIHZtb3YuXHR5cGVzaXplICBccmVnX2MsICAjXGZpbHRlcl9jICAgICAgICAgIEAgcmVnX2MgPSBmaWx0ZXJfYwogICAuZW5kaWYKICAgLmlmIFxmaWx0ZXJfZCAhPSAxCi0gICAgICAgIHZtb3YgICAgICAgICAgICByZCwgICNcZmlsdGVyX2QgICAgICAgICAgICAgIEAgcmQgPSBmaWx0ZXJfZAorICAgICAgICB2bW92Llx0eXBlc2l6ZSAgXHJlZ19kLCAgI1xmaWx0ZXJfZCAgICAgICAgICBAIHJlZ19kID0gZmlsdGVyX2QKICAgLmVuZGlmCiAgIEAgdmR1cCB0byBkb3VibGUgdGhlIHNpemUgb2YgdHlwZXNpemUKICAgLmlmYyBcdHlwZXNpemUsaTgKQEAgLTcxMiwxMSArNzA3LDYgQEAKICAgLmVsc2UKICAgICAgICAgdmR1cC4zMiAgICAgICAgIFxyZWdfYWRkLCAgXGZpbHRlcl9hZGRfcmVnaXN0ZXIgICAgIEAgcmVnX2FkZCA9IGZpbHRlcl9hZGRfcmVnaXN0ZXIKICAgLmVuZGlmCi0KLSAgLnVucmVxIHJhCi0gIC51bnJlcSByYgotICAudW5yZXEgcmMKLSAgLnVucmVxIHJkCiAuZW5kbQogCiBAIEFmdGVyIG1zcGVsX2NvbnN0YW50cyBoYXMgYmVlbiB1c2VkLCBkbyB0aGUgZmlsdGVyaW5nLgpAQCAtODI4LDcgKzgxOCw3IEBACiAgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjIgICAgICAgICAgICBAIHIxID0gJnNyY1stc3RyaWRlXSAgICAgIEAgc2xpZGUgYmFjawogCiAgICAgICAgIEAgRG8gdmVydGljYWwgZmlsdGVyaW5nIGZyb20gc3JjIGludG8gdG1wCi0gICAgICAgIG1zcGVsX2NvbnN0YW50cyBpOCBkMjggZDI5IGQzMCBkMzEgXGZpbHRlcl92X2EgXGZpbHRlcl92X2IgXGZpbHRlcl92X2MgXGZpbHRlcl92X2QgcTEzIHIzCisgICAgICAgIG1zcGVsX2NvbnN0YW50cyBpOCwgZDI4LCBkMjksIGQzMCwgZDMxLCBcZmlsdGVyX3ZfYSwgXGZpbHRlcl92X2IsIFxmaWx0ZXJfdl9jLCBcZmlsdGVyX3ZfZCwgcTEzLCByMwogCiAgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDAsZDF9LCBbcjFdLCByMgogICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyLGQzfSwgW3IxXSwgcjIKQEAgLTgzOCwyMyArODI4LDIzIEBACiAgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsICByMTIsICAjNAogCiAgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDYsZDd9LCBbcjFdLCByMgotICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTExIHExMSBkMCBkMiBkNCBkNiBcZmlsdGVyX3ZfYSBcZmlsdGVyX3ZfYiBcZmlsdGVyX3ZfYyBcZmlsdGVyX3ZfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQgbmFycm93PTAKLSAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMiBxMTIgZDEgZDMgZDUgZDcgXGZpbHRlcl92X2EgXGZpbHRlcl92X2IgXGZpbHRlcl92X2MgXGZpbHRlcl92X2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0IG5hcnJvdz0wCisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEsIHExMSwgZDAsIGQyLCBkNCwgZDYsIFxmaWx0ZXJfdl9hLCBcZmlsdGVyX3ZfYiwgXGZpbHRlcl92X2MsIFxmaWx0ZXJfdl9kLCBkMjgsIGQyOSwgZDMwLCBkMzEsIHExMywgXGZpbHRlcl9zaGlmdCwgbmFycm93PTAKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMiwgcTEyLCBkMSwgZDMsIGQ1LCBkNywgXGZpbHRlcl92X2EsIFxmaWx0ZXJfdl9iLCBcZmlsdGVyX3ZfYywgXGZpbHRlcl92X2QsIGQyOCwgZDI5LCBkMzAsIGQzMSwgcTEzLCBcZmlsdGVyX3NoaWZ0LCBuYXJyb3c9MAogICAgICAgICB2c3QxLjY0ICAgICAgICAge3ExMSxxMTJ9LCBbcjQsOjEyOF0hICAgQCBzdG9yZSBhbmQgaW5jcmVtZW50CiAKICAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMCxkMX0sIFtyMV0sIHIyCi0gICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEgcTExIGQyIGQ0IGQ2IGQwIFxmaWx0ZXJfdl9hIFxmaWx0ZXJfdl9iIFxmaWx0ZXJfdl9jIFxmaWx0ZXJfdl9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgXGZpbHRlcl9zaGlmdCBuYXJyb3c9MAotICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTEyIHExMiBkMyBkNSBkNyBkMSBcZmlsdGVyX3ZfYSBcZmlsdGVyX3ZfYiBcZmlsdGVyX3ZfYyBcZmlsdGVyX3ZfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQgbmFycm93PTAKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSwgcTExLCBkMiwgZDQsIGQ2LCBkMCwgXGZpbHRlcl92X2EsIFxmaWx0ZXJfdl9iLCBcZmlsdGVyX3ZfYywgXGZpbHRlcl92X2QsIGQyOCwgZDI5LCBkMzAsIGQzMSwgcTEzLCBcZmlsdGVyX3NoaWZ0LCBuYXJyb3c9MAorICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTEyLCBxMTIsIGQzLCBkNSwgZDcsIGQxLCBcZmlsdGVyX3ZfYSwgXGZpbHRlcl92X2IsIFxmaWx0ZXJfdl9jLCBcZmlsdGVyX3ZfZCwgZDI4LCBkMjksIGQzMCwgZDMxLCBxMTMsIFxmaWx0ZXJfc2hpZnQsIG5hcnJvdz0wCiAgICAgICAgIHZzdDEuNjQgICAgICAgICB7cTExLHExMn0sIFtyNCw6MTI4XSEgICBAIHN0b3JlIGFuZCBpbmNyZW1lbnQKIAogICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyLGQzfSwgW3IxXSwgcjIKLSAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSBxMTEgZDQgZDYgZDAgZDIgXGZpbHRlcl92X2EgXGZpbHRlcl92X2IgXGZpbHRlcl92X2MgXGZpbHRlcl92X2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0IG5hcnJvdz0wCi0gICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTIgcTEyIGQ1IGQ3IGQxIGQzIFxmaWx0ZXJfdl9hIFxmaWx0ZXJfdl9iIFxmaWx0ZXJfdl9jIFxmaWx0ZXJfdl9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgXGZpbHRlcl9zaGlmdCBuYXJyb3c9MAorICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTExLCBxMTEsIGQ0LCBkNiwgZDAsIGQyLCBcZmlsdGVyX3ZfYSwgXGZpbHRlcl92X2IsIFxmaWx0ZXJfdl9jLCBcZmlsdGVyX3ZfZCwgZDI4LCBkMjksIGQzMCwgZDMxLCBxMTMsIFxmaWx0ZXJfc2hpZnQsIG5hcnJvdz0wCisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTIsIHExMiwgZDUsIGQ3LCBkMSwgZDMsIFxmaWx0ZXJfdl9hLCBcZmlsdGVyX3ZfYiwgXGZpbHRlcl92X2MsIFxmaWx0ZXJfdl9kLCBkMjgsIGQyOSwgZDMwLCBkMzEsIHExMywgXGZpbHRlcl9zaGlmdCwgbmFycm93PTAKICAgICAgICAgdnN0MS42NCAgICAgICAgIHtxMTEscTEyfSwgW3I0LDoxMjhdISAgIEAgc3RvcmUgYW5kIGluY3JlbWVudAogCiAgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDQsZDV9LCBbcjFdLCByMgotICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTExIHExMSBkNiBkMCBkMiBkNCBcZmlsdGVyX3ZfYSBcZmlsdGVyX3ZfYiBcZmlsdGVyX3ZfYyBcZmlsdGVyX3ZfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQgbmFycm93PTAKLSAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMiBxMTIgZDcgZDEgZDMgZDUgXGZpbHRlcl92X2EgXGZpbHRlcl92X2IgXGZpbHRlcl92X2MgXGZpbHRlcl92X2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0IG5hcnJvdz0wCisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEsIHExMSwgZDYsIGQwLCBkMiwgZDQsIFxmaWx0ZXJfdl9hLCBcZmlsdGVyX3ZfYiwgXGZpbHRlcl92X2MsIFxmaWx0ZXJfdl9kLCBkMjgsIGQyOSwgZDMwLCBkMzEsIHExMywgXGZpbHRlcl9zaGlmdCwgbmFycm93PTAKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMiwgcTEyLCBkNywgZDEsIGQzLCBkNSwgXGZpbHRlcl92X2EsIFxmaWx0ZXJfdl9iLCBcZmlsdGVyX3ZfYywgXGZpbHRlcl92X2QsIGQyOCwgZDI5LCBkMzAsIGQzMSwgcTEzLCBcZmlsdGVyX3NoaWZ0LCBuYXJyb3c9MAogICAgICAgICB2c3QxLjY0ICAgICAgICAge3ExMSxxMTJ9LCBbcjQsOjEyOF0hICAgQCBzdG9yZSBhbmQgaW5jcmVtZW50CiAKICAgICAgICAgYm5lICAgICAgICAgICAgIDFiCkBAIC04NjQsNyArODU0LDcgQEAKICAgICAgICAgbW92ICAgICAgICAgICAgIHI0LCAgIHNwICAgICAgICAgICAgICAgIEAgcjQgPSB0bXAKIAogICAgICAgICBAIERvIGhvcml6b250YWwgZmlsdGVyaW5nIGZyb20gdGVtcCB0byBkc3QKLSAgICAgICAgbXNwZWxfY29uc3RhbnRzIGkxNiBkMjggZDI5IGQzMCBkMzEgXGZpbHRlcl9oX2EgXGZpbHRlcl9oX2IgXGZpbHRlcl9oX2MgXGZpbHRlcl9oX2QgcTEzIHIzCisgICAgICAgIG1zcGVsX2NvbnN0YW50cyBpMTYsIGQyOCwgZDI5LCBkMzAsIGQzMSwgXGZpbHRlcl9oX2EsIFxmaWx0ZXJfaF9iLCBcZmlsdGVyX2hfYywgXGZpbHRlcl9oX2QsIHExMywgcjMKIAogMjoKICAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgIHIxMiwgICMxCkBAIC04NzQsNyArODY0LDcgQEAKICAgICAgICAgdmV4dC4xNiAgICAgICAgIHEzLCAgIHEwLCAgIHExLCAgIzMKICAgICAgICAgdmV4dC4xNiAgICAgICAgIHExLCAgIHEwLCAgIHExLCAgIzEgICAgIEAgZG8gbGFzdCBiZWNhdXNlIGl0IHdyaXRlcyB0byBxMSB3aGljaCBpcyByZWFkIGJ5IHRoZSBvdGhlciB2ZXh0IGluc3RydWN0aW9ucwogCi0gICAgICAgIG1zcGVsX2ZpbHRlci4xNiBxMTEgcTEyIGQyMiBkMjMgZDIxIGQwIGQxIGQyIGQzIGQ0IGQ1IGQ2IGQ3IFxmaWx0ZXJfaF9hIFxmaWx0ZXJfaF9iIFxmaWx0ZXJfaF9jIFxmaWx0ZXJfaF9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgNworICAgICAgICBtc3BlbF9maWx0ZXIuMTYgcTExLCBxMTIsIGQyMiwgZDIzLCBkMjEsIGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgXGZpbHRlcl9oX2EsIFxmaWx0ZXJfaF9iLCBcZmlsdGVyX2hfYywgXGZpbHRlcl9oX2QsIGQyOCwgZDI5LCBkMzAsIGQzMSwgcTEzLCA3CiAKICAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMjF9LCBbcjAsOjY0XSwgcjIgICAgIEAgc3RvcmUgYW5kIGluY3JlbWVudCBkc3QKIApAQCAtODg3LDkgKzg3Nyw5IEBACiAKIEAgVXNlIEMgcHJlcHJvY2Vzc29yIGFuZCBhc3NlbWJsZXIgbWFjcm9zIHRvIGV4cGFuZCB0byBmdW5jdGlvbnMgZm9yIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGZpbHRlcmluZy4KICNkZWZpbmUgUFVUX1ZDMV9NU1BFTF9NQ19IVihobW9kZSwgdm1vZGUpICAgXAotICAgIHB1dF92YzFfbXNwZWxfbWNfaHYgaG1vZGUgdm1vZGUgXAotICAgICAgICBNU1BFTF9NT0RFXyAjIyBobW9kZSAjIyBfTVVMX0NPTlNUQU5UUyBcCi0gICAgICAgIE1TUEVMX01PREVfICMjIHZtb2RlICMjIF9NVUxfQ09OU1RBTlRTIFwKKyAgICBwdXRfdmMxX21zcGVsX21jX2h2IGhtb2RlLCB2bW9kZSwgXAorICAgICAgICBNU1BFTF9NT0RFXyAjIyBobW9kZSAjIyBfTVVMX0NPTlNUQU5UUywgXAorICAgICAgICBNU1BFTF9NT0RFXyAjIyB2bW9kZSAjIyBfTVVMX0NPTlNUQU5UUywgXAogICAgICAgICBNU1BFTF9NT0RFU18gIyMgaG1vZGUgIyMgdm1vZGUgIyMgX0FERFNISUZUX0NPTlNUQU5UUwogCiBQVVRfVkMxX01TUEVMX01DX0hWKDEsIDEpCkBAIC05MTAsNyArOTAwLDcgQEAKICAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgICM4ICAgICAgICAgICAgICAgICAgICAgICAgQCBsb29wIGNvdW50ZXIKICAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgIHIxLCAgICMxICAgICAgICAgICAgICAgICAgQCBzbGlkZSBiYWNrLCB1c2luZyBpbW1lZGlhdGUKIAotICAgICAgICBtc3BlbF9jb25zdGFudHMgaTggZDI4IGQyOSBkMzAgZDMxIFxmaWx0ZXJfYSBcZmlsdGVyX2IgXGZpbHRlcl9jIFxmaWx0ZXJfZCBxMTMgcjMKKyAgICAgICAgbXNwZWxfY29uc3RhbnRzIGk4LCBkMjgsIGQyOSwgZDMwLCBkMzEsIFxmaWx0ZXJfYSwgXGZpbHRlcl9iLCBcZmlsdGVyX2MsIFxmaWx0ZXJfZCwgcTEzLCByMwogCiAxOgogICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCAgcjEyLCAgIzEKQEAgLTkyMCw3ICs5MTAsNyBAQAogICAgICAgICB2ZXh0LjggICAgICAgICAgZDMsICAgZDAsICAgZDEsICAjMwogICAgICAgICB2ZXh0LjggICAgICAgICAgZDEsICAgZDAsICAgZDEsICAjMSAgICAgICAgICAgICBAIGRvIGxhc3QgYmVjYXVzZSBpdCB3cml0ZXMgdG8gZDEgd2hpY2ggaXMgcmVhZCBieSB0aGUgb3RoZXIgdmV4dCBpbnN0cnVjdGlvbnMKIAotICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTExIGQyMSBkMCBkMSBkMiBkMyBcZmlsdGVyX2EgXGZpbHRlcl9iIFxmaWx0ZXJfYyBcZmlsdGVyX2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0CisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEsIGQyMSwgZDAsIGQxLCBkMiwgZDMsIFxmaWx0ZXJfYSwgXGZpbHRlcl9iLCBcZmlsdGVyX2MsIFxmaWx0ZXJfZCwgZDI4LCBkMjksIGQzMCwgZDMxLCBxMTMsIFxmaWx0ZXJfc2hpZnQKIAogICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyMX0sIFtyMCw6NjRdLCByMiAgICAgICAgICAgICBAIHN0b3JlIGFuZCBpbmNyZW1lbnQgZHN0CiAKQEAgLTkzMiw3ICs5MjIsNyBAQAogCiBAIFVzZSBDIHByZXByb2Nlc3NvciBhbmQgYXNzZW1ibGVyIG1hY3JvcyB0byBleHBhbmQgdG8gZnVuY3Rpb25zIGZvciBob3Jpem9udGFsIG9ubHkgZmlsdGVyaW5nLgogI2RlZmluZSBQVVRfVkMxX01TUEVMX01DX0hfT05MWShobW9kZSkgXAotICAgICAgICBwdXRfdmMxX21zcGVsX21jX2hfb25seSBobW9kZSBNU1BFTF9NT0RFXyAjIyBobW9kZSAjIyBfTVVMX0NPTlNUQU5UUyBNU1BFTF9NT0RFXyAjIyBobW9kZSAjIyBfQUREU0hJRlRfQ09OU1RBTlRTCisgICAgICAgIHB1dF92YzFfbXNwZWxfbWNfaF9vbmx5IGhtb2RlLCBNU1BFTF9NT0RFXyAjIyBobW9kZSAjIyBfTVVMX0NPTlNUQU5UUywgTVNQRUxfTU9ERV8gIyMgaG1vZGUgIyMgX0FERFNISUZUX0NPTlNUQU5UUwogCiBQVVRfVkMxX01TUEVMX01DX0hfT05MWSgxKQogUFVUX1ZDMV9NU1BFTF9NQ19IX09OTFkoMikKQEAgLTk0Nyw3ICs5MzcsNyBAQAogICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAgIzggICAgICAgICAgICAgICAgICAgICAgICBAIGxvb3AgY291bnRlcgogICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICAgcjEsICAgcjIgICAgICAgICAgICAgICAgICBAIHIxID0gJnNyY1stc3RyaWRlXSAgICAgIEAgc2xpZGUgYmFjawogCi0gICAgICAgIG1zcGVsX2NvbnN0YW50cyBpOCBkMjggZDI5IGQzMCBkMzEgXGZpbHRlcl9hIFxmaWx0ZXJfYiBcZmlsdGVyX2MgXGZpbHRlcl9kIHExMyByMworICAgICAgICBtc3BlbF9jb25zdGFudHMgaTgsIGQyOCwgZDI5LCBkMzAsIGQzMSwgXGZpbHRlcl9hLCBcZmlsdGVyX2IsIFxmaWx0ZXJfYywgXGZpbHRlcl9kLCBxMTMsIHIzCiAKICAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMH0sICBbcjFdLCByMiAgICAgICAgICAgICAgICAgQCBkMCA9IHNyY1stc3RyaWRlXQogICAgICAgICB2bGQxLjY0ICAgICAgICAge2QxfSwgIFtyMV0sIHIyICAgICAgICAgICAgICAgICBAIGQxID0gc3JjWzBdCkBAIC05NTcsMTkgKzk0NywxOSBAQAogICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCAgcjEyLCAgIzQKIAogICAgICAgICB2bGQxLjY0ICAgICAgICAge2QzfSwgIFtyMV0sIHIyICAgICAgICAgICAgICAgICBAIGQzID0gc3JjW3N0cmlkZSAqIDJdCi0gICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEgZDIxIGQwIGQxIGQyIGQzIFxmaWx0ZXJfYSBcZmlsdGVyX2IgXGZpbHRlcl9jIFxmaWx0ZXJfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSwgZDIxLCBkMCwgZDEsIGQyLCBkMywgXGZpbHRlcl9hLCBcZmlsdGVyX2IsIFxmaWx0ZXJfYywgXGZpbHRlcl9kLCBkMjgsIGQyOSwgZDMwLCBkMzEsIHExMywgXGZpbHRlcl9zaGlmdAogICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyMX0sIFtyMCw6NjRdLCByMiAgICAgICAgICAgICBAIHN0b3JlIGFuZCBpbmNyZW1lbnQgZHN0CiAKICAgICAgICAgdmxkMS42NCAgICAgICAgIHtkMH0sICBbcjFdLCByMiAgICAgICAgICAgICAgICAgQCBkMCA9IG5leHQgbGluZQotICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTExIGQyMSBkMSBkMiBkMyBkMCBcZmlsdGVyX2EgXGZpbHRlcl9iIFxmaWx0ZXJfYyBcZmlsdGVyX2QgZDI4IGQyOSBkMzAgZDMxIHExMyBcZmlsdGVyX3NoaWZ0CisgICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEsIGQyMSwgZDEsIGQyLCBkMywgZDAsIFxmaWx0ZXJfYSwgXGZpbHRlcl9iLCBcZmlsdGVyX2MsIFxmaWx0ZXJfZCwgZDI4LCBkMjksIGQzMCwgZDMxLCBxMTMsIFxmaWx0ZXJfc2hpZnQKICAgICAgICAgdnN0MS42NCAgICAgICAgIHtkMjF9LCBbcjAsOjY0XSwgcjIgICAgICAgICAgICAgQCBzdG9yZSBhbmQgaW5jcmVtZW50IGRzdAogCiAgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDF9LCAgW3IxXSwgcjIgICAgICAgICAgICAgICAgIEAgZDEgPSBuZXh0IGxpbmUKLSAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSBkMjEgZDIgZDMgZDAgZDEgXGZpbHRlcl9hIFxmaWx0ZXJfYiBcZmlsdGVyX2MgXGZpbHRlcl9kIGQyOCBkMjkgZDMwIGQzMSBxMTMgXGZpbHRlcl9zaGlmdAorICAgICAgICBtc3BlbF9maWx0ZXIgICAgcTExLCBkMjEsIGQyLCBkMywgZDAsIGQxLCBcZmlsdGVyX2EsIFxmaWx0ZXJfYiwgXGZpbHRlcl9jLCBcZmlsdGVyX2QsIGQyOCwgZDI5LCBkMzAsIGQzMSwgcTEzLCBcZmlsdGVyX3NoaWZ0CiAgICAgICAgIHZzdDEuNjQgICAgICAgICB7ZDIxfSwgW3IwLDo2NF0sIHIyICAgICAgICAgICAgIEAgc3RvcmUgYW5kIGluY3JlbWVudCBkc3QKIAogICAgICAgICB2bGQxLjY0ICAgICAgICAge2QyfSwgIFtyMV0sIHIyICAgICAgICAgICAgICAgICBAIGQyID0gbmV4dCBsaW5lCi0gICAgICAgIG1zcGVsX2ZpbHRlciAgICBxMTEgZDIxIGQzIGQwIGQxIGQyIFxmaWx0ZXJfYSBcZmlsdGVyX2IgXGZpbHRlcl9jIFxmaWx0ZXJfZCBkMjggZDI5IGQzMCBkMzEgcTEzIFxmaWx0ZXJfc2hpZnQKKyAgICAgICAgbXNwZWxfZmlsdGVyICAgIHExMSwgZDIxLCBkMywgZDAsIGQxLCBkMiwgXGZpbHRlcl9hLCBcZmlsdGVyX2IsIFxmaWx0ZXJfYywgXGZpbHRlcl9kLCBkMjgsIGQyOSwgZDMwLCBkMzEsIHExMywgXGZpbHRlcl9zaGlmdAogICAgICAgICB2c3QxLjY0ICAgICAgICAge2QyMX0sIFtyMCw6NjRdLCByMiAgICAgICAgICAgICBAIHN0b3JlIGFuZCBpbmNyZW1lbnQgZHN0CiAKICAgICAgICAgYm5lICAgICAgICAgICAgIDFiCkBAIC05ODAsMTQgKzk3MCwxMyBAQAogCiBAIFVzZSBDIHByZXByb2Nlc3NvciBhbmQgYXNzZW1ibGVyIG1hY3JvcyB0byBleHBhbmQgdG8gZnVuY3Rpb25zIGZvciB2ZXJ0aWNhbCBvbmx5IGZpbHRlcmluZy4KICNkZWZpbmUgUFVUX1ZDMV9NU1BFTF9NQ19WX09OTFkodm1vZGUpIFwKLSAgICAgICAgcHV0X3ZjMV9tc3BlbF9tY192X29ubHkgdm1vZGUgTVNQRUxfTU9ERV8gIyMgdm1vZGUgIyMgX01VTF9DT05TVEFOVFMgTVNQRUxfTU9ERV8gIyMgdm1vZGUgIyMgX0FERFNISUZUX0NPTlNUQU5UUworICAgICAgICBwdXRfdmMxX21zcGVsX21jX3Zfb25seSB2bW9kZSwgTVNQRUxfTU9ERV8gIyMgdm1vZGUgIyMgX01VTF9DT05TVEFOVFMsIE1TUEVMX01PREVfICMjIHZtb2RlICMjIF9BRERTSElGVF9DT05TVEFOVFMKIAogUFVUX1ZDMV9NU1BFTF9NQ19WX09OTFkoMSkKIFBVVF9WQzFfTVNQRUxfTUNfVl9PTkxZKDIpCiBQVVRfVkMxX01TUEVMX01DX1ZfT05MWSgzKQogCiAjdW5kZWYgUFVUX1ZDMV9NU1BFTF9NQ19WX09OTFkKLSNlbmRpZgogCiBmdW5jdGlvbiBmZl9wdXRfcGl4ZWxzOHg4X25lb24sIGV4cG9ydD0xCiAgICAgICAgIHZsZDEuNjQgICAgICAgICB7ZDB9LCBbcjFdLCByMgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vdnAzZHNwX2luaXRfYXJtLmMgYi9saWJhdmNvZGVjL2FybS92cDNkc3BfaW5pdF9hcm0uYwppbmRleCBkOTI0NjM2Li42NWVhNTNmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS92cDNkc3BfaW5pdF9hcm0uYworKysgYi9saWJhdmNvZGVjL2FybS92cDNkc3BfaW5pdF9hcm0uYwpAQCAtMjMsOSArMjMsOSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy92cDNkc3AuaCIKIAotdm9pZCBmZl92cDNfaWRjdF9wdXRfbmVvbih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpkYXRhKTsKLXZvaWQgZmZfdnAzX2lkY3RfYWRkX25lb24odWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqZGF0YSk7Ci12b2lkIGZmX3ZwM19pZGN0X2RjX2FkZF9uZW9uKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmRhdGEpOwordm9pZCBmZl92cDNfaWRjdF9wdXRfbmVvbih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpkYXRhKTsKK3ZvaWQgZmZfdnAzX2lkY3RfYWRkX25lb24odWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqZGF0YSk7Cit2b2lkIGZmX3ZwM19pZGN0X2RjX2FkZF9uZW9uKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmRhdGEpOwogCiB2b2lkIGZmX3ZwM192X2xvb3BfZmlsdGVyX25lb24odWludDhfdCAqLCBpbnQsIGludCAqKTsKIHZvaWQgZmZfdnAzX2hfbG9vcF9maWx0ZXJfbmVvbih1aW50OF90ICosIGludCwgaW50ICopOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vdnA2ZHNwX2luaXRfYXJtLmMgYi9saWJhdmNvZGVjL2FybS92cDZkc3BfaW5pdF9hcm0uYwppbmRleCBlZDY4MzIxLi5hNTlkNjEyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2FybS92cDZkc3BfaW5pdF9hcm0uYworKysgYi9saWJhdmNvZGVjL2FybS92cDZkc3BfaW5pdF9hcm0uYwpAQCAtMjIsMTMgKzIyLDEzIEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisKICNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwNTZkc3AuaCIKIAotdm9pZCBmZl92cDZfZWRnZV9maWx0ZXJfaG9yX25lb24odWludDhfdCAqeXV2LCBpbnQgc3RyaWRlLCBpbnQgdCk7Ci12b2lkIGZmX3ZwNl9lZGdlX2ZpbHRlcl92ZXJfbmVvbih1aW50OF90ICp5dXYsIGludCBzdHJpZGUsIGludCB0KTsKK3ZvaWQgZmZfdnA2X2VkZ2VfZmlsdGVyX2hvcl9uZW9uKHVpbnQ4X3QgKnl1diwgcHRyZGlmZl90IHN0cmlkZSwgaW50IHQpOwordm9pZCBmZl92cDZfZWRnZV9maWx0ZXJfdmVyX25lb24odWludDhfdCAqeXV2LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgdCk7CiAKLWF2X2NvbGQgdm9pZCBmZl92cDZkc3BfaW5pdF9hcm0oVlA1NkRTUENvbnRleHQgKnMsIGVudW0gQVZDb2RlY0lEIGNvZGVjKQorYXZfY29sZCB2b2lkIGZmX3ZwNmRzcF9pbml0X2FybShWUDU2RFNQQ29udGV4dCAqcykKIHsKICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS92cDhkc3BfYXJtdjYuUyBiL2xpYmF2Y29kZWMvYXJtL3ZwOGRzcF9hcm12Ni5TCmluZGV4IDFhZGNiYmQuLjIzMjBiZjQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL3ZwOGRzcF9hcm12Ni5TCisrKyBiL2xpYmF2Y29kZWMvYXJtL3ZwOGRzcF9hcm12Ni5TCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgYnggICAgICAgICAgICAgIGxyCiBlbmRmdW5jCiAKLUAgdm9pZCB2cDhfaWRjdF9hZGQodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwgaW50IHN0cmlkZSkKK0Agdm9pZCB2cDhfaWRjdF9hZGQodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwgcHRyZGlmZl90IHN0cmlkZSkKIGZ1bmN0aW9uIGZmX3ZwOF9pZGN0X2FkZF9hcm12NiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTIsIGxyfQogICAgICAgICBzdWIgICAgICAgICAgICAgc3AsICBzcCwgICMzMgpAQCAtMzE0LDcgKzMxNCw3IEBACiAgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjEyLCBwY30KIGVuZGZ1bmMKIAotQCB2b2lkIHZwOF9pZGN0X2RjX2FkZCh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBpbnQgc3RyaWRlKQorQCB2b2lkIHZwOF9pZGN0X2RjX2FkZCh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBwdHJkaWZmX3Qgc3RyaWRlKQogZnVuY3Rpb24gZmZfdnA4X2lkY3RfZGNfYWRkX2FybXY2LCBleHBvcnQ9MQogICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI2LCBscn0KICAgICAgICAgYWRkICAgICAgICAgICAgIHI2LCAgcjAsICByMiwgIGxzbCAjMQpAQCAtMzU1LDcgKzM1NSw3IEBACiAgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjYsIHBjfQogZW5kZnVuYwogCi1AIHZvaWQgdnA4X2lkY3RfZGNfYWRkNHV2KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIGludCBzdHJpZGUpCitAIHZvaWQgdnA4X2lkY3RfZGNfYWRkNHV2KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIHB0cmRpZmZfdCBzdHJpZGUpCiBmdW5jdGlvbiBmZl92cDhfaWRjdF9kY19hZGQ0dXZfYXJtdjYsIGV4cG9ydD0xCiAgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQsIGxyfQogCkBAIC0zNzEsNyArMzcxLDcgQEAKICAgICAgICAgcG9wICAgICAgICAgICAgIHtyNCwgcGN9CiBlbmRmdW5jCiAKLUAgdm9pZCB2cDhfaWRjdF9kY19hZGQ0eSh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbNF1bMTZdLCBpbnQgc3RyaWRlKQorQCB2b2lkIHZwOF9pZGN0X2RjX2FkZDR5KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIHB0cmRpZmZfdCBzdHJpZGUpCiBmdW5jdGlvbiBmZl92cDhfaWRjdF9kY19hZGQ0eV9hcm12NiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCwgbHJ9CiAKQEAgLTQ1NSw3ICs0NTUsNyBAQAogICAgICAgICBlb3IgICAgICAgICAgICAgcjUsICByNSwgIHIyICAgICAgICAgICAgQCAqb3EwID0gdSBeIDB4ODAKIC5lbmRtCiAKLUAgdm9pZCB2cDhfdl9sb29wX2ZpbHRlcjE2X3NpbXBsZSh1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCBmbGltKQorQCB2b2lkIHZwOF92X2xvb3BfZmlsdGVyMTZfc2ltcGxlKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW0pCiBmdW5jdGlvbiBmZl92cDhfdl9sb29wX2ZpbHRlcjE2X3NpbXBsZV9hcm12NiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsIGxyfQogCkBAIC04NjYsNyArODY2LDcgQEAKICAgICAgICAgYiAgICAgICAgICAgICAgIHZwOF92X2xvb3BfZmlsdGVyX2FybXY2CiBlbmRmdW5jCiAKLUAgdm9pZCB2cDhfaF9sb29wX2ZpbHRlcjE2X3NpbXBsZSh1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCBmbGltKQorQCB2b2lkIHZwOF9oX2xvb3BfZmlsdGVyMTZfc2ltcGxlKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW0pCiBmdW5jdGlvbiBmZl92cDhfaF9sb29wX2ZpbHRlcjE2X3NpbXBsZV9hcm12NiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTEsIGxyfQogICAgICAgICBvcnIgICAgICAgICAgICAgcjEyLCByMiwgIHIyLCAgbHNsICMxNgpAQCAtMTExMyw4ICsxMTEzLDggQEAKIAogQCBNQwogCi1AIHZvaWQgcHV0X3ZwOF9waXhlbHMxNih1aW50OF90ICpkc3QsIGludCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKLUAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK0Agdm9pZCBwdXRfdnA4X3BpeGVsczE2KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorQCAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQogZnVuY3Rpb24gZmZfcHV0X3ZwOF9waXhlbHMxNl9hcm12NiwgZXhwb3J0PTEKICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yMTF9CiAgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzMyXSAgICAgICAgICBAIGgKQEAgLTExMzcsOCArMTEzNyw4IEBACiAgICAgICAgIGJ4ICAgICAgICAgICAgICBscgogZW5kZnVuYwogCi1AIHZvaWQgcHV0X3ZwOF9waXhlbHM4KHVpbnQ4X3QgKmRzdCwgaW50IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAotQCAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCitAIHZvaWQgcHV0X3ZwOF9waXhlbHM4KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorQCAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCiBmdW5jdGlvbiBmZl9wdXRfdnA4X3BpeGVsczhfYXJtdjYsIGV4cG9ydD0xCiAgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjExfQogICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICMzMl0gICAgICAgICAgQCBoCkBAIC0xMTYxLDggKzExNjEsOCBAQAogICAgICAgICBieCAgICAgICAgICAgICAgbHIKIGVuZGZ1bmMKIAotQCB2b2lkIHB1dF92cDhfcGl4ZWxzNCh1aW50OF90ICpkc3QsIGludCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKLUAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQorQCB2b2lkIHB1dF92cDhfcGl4ZWxzNCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKK0AgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQogZnVuY3Rpb24gZmZfcHV0X3ZwOF9waXhlbHM0X2FybXY2LCBleHBvcnQ9MQogICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICMwXSAgICAgICAgICAgQCBoCiAgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjYsbHJ9CkBAIC0xMTgxLDcgKzExODEsNyBAQAogZW5kZnVuYwogCiBAIG5vdGU6IHdvcnN0IGNhc2Ugc3VtIG9mIGFsbCA2LXRhcCBmaWx0ZXIgdmFsdWVzICogMjU1IGlzIDB4N2Y4MCBzbyAxNiBiaXQKLUAgYXJpdGhtYXRpYyBjYW4gYmUgdXNlZCB0byBhcHBseSBmaWx0ZXJzCitAIGFyaXRobWV0aWMgY2FuIGJlIHVzZWQgdG8gYXBwbHkgZmlsdGVycwogY29uc3QgICBzaXh0YXBfZmlsdGVyc18xMzI0NTYwMCwgYWxpZ249NAogICAgICAgICAuc2hvcnQgICAgIDIsIDEwOCwgLTExLCAgMzYsICAtOCwgMSwgMCwgMAogICAgICAgICAuc2hvcnQgICAgIDMsICA3NywgLTE2LCAgNzcsIC0xNiwgMywgMCwgMApAQCAtMTIyNiwxMyArMTIyNiw4IEBACiB2cDhfbWNfMSAgICAgICAgICAgICAgICBiaWxpbiwgIDQsIGgKIHZwOF9tY18xICAgICAgICAgICAgICAgIGJpbGluLCAgNCwgdgogCi0vKiBUcnVlIHJlbGF0aW9uYWwgZXhwcmVzc2lvbnMgaGF2ZSB0aGUgdmFsdWUgLTEgaW4gdGhlIEdOVSBhc3NlbWJsZXIsCi0gICArMSBpbiBBcHBsZSdzLiAqLwotI2lmZGVmIF9fQVBQTEVfXwotIyAgIGRlZmluZSBUTVBTSVpFIFxzaXplICogKDggKyA4Kihcc2l6ZSA+IDQpICsgXHl0YXBzIC0gMSkKLSNlbHNlCi0jICAgZGVmaW5lIFRNUFNJWkUgXHNpemUgKiAoOCAtIDgqKFxzaXplID4gNCkgKyBceXRhcHMgLSAxKQotI2VuZGlmCitAIDQgYW5kIDggcGl4ZWwgd2lkZSBtYyBibG9ja3MgbWlnaHQgaGF2ZSBoZWlnaHQgb2YgOCBvciAxNiBsaW5lcworI2RlZmluZSBUTVBTSVpFIFxzaXplICogKDE2IC8gKCgxNiAvIFxzaXplICsgMSkgLyAyKSArIFx5dGFwcyAtIDEpCiAKIC5tYWNybyAgdnA4X21jX2h2ICAgICAgIG5hbWUsIHNpemUsIGgsIHYsIHl0YXBzCiBmdW5jdGlvbiBmZl9wdXRfdnA4X1xuYW1lXHNpemVcKClfXGhcdlwoKV9hcm12NiwgZXhwb3J0PTEKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL3ZwOGRzcF9uZW9uLlMgYi9saWJhdmNvZGVjL2FybS92cDhkc3BfbmVvbi5TCmluZGV4IDUzMTkzNDYuLmZjYjQyNDggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXJtL3ZwOGRzcF9uZW9uLlMKKysrIGIvbGliYXZjb2RlYy9hcm0vdnA4ZHNwX25lb24uUwpAQCAtMzIyLDcgKzMyMiw3IEBACiAKICAgICAgICAgdm1vdi5pMTYgICAgICAgIHExMiwgIzMKICAgICAgICAgdnN1YmwuczggICAgICAgIHExMCwgZDgsICBkNiAgICAgICAgICAgIEAgUVMwIC0gUFMwCi0gICAgICAgIHZzdWJsLnM4ICAgICAgICBxMTEsIGQ5LCAgZDcgICAgICAgICAgICBAICAgKHdpZGVuZWQgdG8gMTZiaXQpCisgICAgICAgIHZzdWJsLnM4ICAgICAgICBxMTEsIGQ5LCAgZDcgICAgICAgICAgICBAICAgKHdpZGVuZWQgdG8gMTYgYml0cykKICAgICAgICAgdmVvciAgICAgICAgICAgIHEyLCAgcTIsICBxMTMgICAgICAgICAgIEAgUFMxID0gUDEgXiAweDgwCiAgICAgICAgIHZlb3IgICAgICAgICAgICBxNSwgIHE1LCAgcTEzICAgICAgICAgICBAIFFTMSA9IFExIF4gMHg4MAogICAgICAgICB2bXVsLmkxNiAgICAgICAgcTEwLCBxMTAsIHExMiAgICAgICAgICAgQCB3ID0gMyAqIChRUzAgLSBQUzApCkBAIC0xNTYyLDcgKzE1NjIsNyBAQAogZW5kZnVuYwogCiBAIG5vdGU6IHdvcnN0IGNhc2Ugc3VtIG9mIGFsbCA2LXRhcCBmaWx0ZXIgdmFsdWVzICogMjU1IGlzIDB4N2Y4MCBzbyAxNiBiaXQKLUAgYXJpdGhtYXRpYyBjYW4gYmUgdXNlZCB0byBhcHBseSBmaWx0ZXJzCitAIGFyaXRobWV0aWMgY2FuIGJlIHVzZWQgdG8gYXBwbHkgZmlsdGVycwogY29uc3QgICBzdWJwZWxfZmlsdGVycywgYWxpZ249NAogICAgICAgICAuc2hvcnQgICAgIDAsICAgNiwgMTIzLCAgMTIsICAgMSwgICAwLCAgIDAsICAgMAogICAgICAgICAuc2hvcnQgICAgIDIsICAxMSwgMTA4LCAgMzYsICAgOCwgICAxLCAgIDAsICAgMApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vdnA5ZHNwX2luaXQuaCBiL2xpYmF2Y29kZWMvYXJtL3ZwOWRzcF9pbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRjMWMyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYXJtL3ZwOWRzcF9pbml0LmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQVJNX1ZQOURTUF9JTklUX0gKKyNkZWZpbmUgQVZDT0RFQ19BUk1fVlA5RFNQX0lOSVRfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDlkc3AuaCIKKwordm9pZCBmZl92cDlkc3BfaW5pdF8xMGJwcF9hcm0oVlA5RFNQQ29udGV4dCAqZHNwKTsKK3ZvaWQgZmZfdnA5ZHNwX2luaXRfMTJicHBfYXJtKFZQOURTUENvbnRleHQgKmRzcCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0FSTV9WUDlEU1BfSU5JVF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS92cDlkc3BfaW5pdF8xMGJwcF9hcm0uYyBiL2xpYmF2Y29kZWMvYXJtL3ZwOWRzcF9pbml0XzEwYnBwX2FybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4Y2IyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FybS92cDlkc3BfaW5pdF8xMGJwcF9hcm0uYwpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IEdvb2dsZSBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgQlBQIDEwCisjZGVmaW5lIElOSVRfRlVOQyBmZl92cDlkc3BfaW5pdF8xMGJwcF9hcm0KKyNpbmNsdWRlICJ2cDlkc3BfaW5pdF8xNmJwcF9hcm1fdGVtcGxhdGUuYyIKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL3ZwOWRzcF9pbml0XzEyYnBwX2FybS5jIGIvbGliYXZjb2RlYy9hcm0vdnA5ZHNwX2luaXRfMTJicHBfYXJtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2NWViMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYXJtL3ZwOWRzcF9pbml0XzEyYnBwX2FybS5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgR29vZ2xlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBCUFAgMTIKKyNkZWZpbmUgSU5JVF9GVU5DIGZmX3ZwOWRzcF9pbml0XzEyYnBwX2FybQorI2luY2x1ZGUgInZwOWRzcF9pbml0XzE2YnBwX2FybV90ZW1wbGF0ZS5jIgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vdnA5ZHNwX2luaXRfMTZicHBfYXJtX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2FybS92cDlkc3BfaW5pdF8xNmJwcF9hcm1fdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjAwMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hcm0vdnA5ZHNwX2luaXRfMTZicHBfYXJtX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgR29vZ2xlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgInZwOWRzcF9pbml0LmgiCisKKyNkZWZpbmUgZGVjbGFyZV9mcGVsKHR5cGUsIHN6LCBzdWZmaXgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl92cDlfIyN0eXBlIyNzeiMjc3VmZml4IyNfbmVvbih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KQorCisjZGVmaW5lIGRlY2xfbWNfZnVuYyhvcCwgZmlsdGVyLCBkaXIsIHN6LCBicHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl92cDlfIyNvcCMjXyMjZmlsdGVyIyNzeiMjXyMjZGlyIyNfIyNicHAjI19uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KQorCisjZGVmaW5lIGRlZmluZV84dGFwXzJkX2ZuKG9wLCBmaWx0ZXIsIHN6LCBicHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBvcCMjXyMjZmlsdGVyIyNzeiMjX2h2XyMjYnBwIyNfbmVvbih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCB0ZW1wLCBbKCgxICsgKHN6IDwgNjQpKSAqIHN6ICsgOCkgKiBzeiAqIDJdKTsgICAgICAgICBcCisgICAgLyogV2Ugb25seSBuZWVkIGggKyA3IGxpbmVzLCBidXQgdGhlIGhvcml6b250YWwgZmlsdGVyIGFzc3VtZXMgYW4gICAgICAgICAgICAgICBcCisgICAgICogZXZlbiBudW1iZXIgb2Ygcm93cywgc28gZmlsdGVyIGggKyA4IGxpbmVzIGhlcmUuICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfdnA5X3B1dF8jI2ZpbHRlciMjc3ojI19oXyMjYnBwIyNfbmVvbih0ZW1wLCAyICogc3osICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAzICogc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoICsgOCwgbXgsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfdnA5XyMjb3AjI18jI2ZpbHRlciMjc3ojI192XyMjYnBwIyNfbmVvbihkc3QsIGRzdF9zdHJpZGUsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wICsgMyAqIDIgKiBzeiwgMiAqIHN6LCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLCAwLCBteSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgZGVjbF9maWx0ZXJfZnVuY3Mob3AsIGRpciwgc3osIGJwcCkgIFwKKyAgICBkZWNsX21jX2Z1bmMob3AsIHJlZ3VsYXIsIGRpciwgc3osIGJwcCk7IFwKKyAgICBkZWNsX21jX2Z1bmMob3AsIHNoYXJwLCAgIGRpciwgc3osIGJwcCk7IFwKKyAgICBkZWNsX21jX2Z1bmMob3AsIHNtb290aCwgIGRpciwgc3osIGJwcCkKKworI2RlZmluZSBkZWNsX21jX2Z1bmNzKHN6LCBicHApICAgICAgXAorICAgIGRlY2xfZmlsdGVyX2Z1bmNzKHB1dCwgaCwgIHN6LCBicHApOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MoYXZnLCBoLCAgc3osIGJwcCk7IFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhwdXQsIHYsICBzeiwgYnBwKTsgXAorICAgIGRlY2xfZmlsdGVyX2Z1bmNzKGF2ZywgdiwgIHN6LCBicHApOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MocHV0LCBodiwgc3osIGJwcCk7IFwKKyAgICBkZWNsX2ZpbHRlcl9mdW5jcyhhdmcsIGh2LCBzeiwgYnBwKQorCitkZWNsYXJlX2ZwZWwoY29weSwgMTI4LCApOworZGVjbGFyZV9mcGVsKGNvcHksIDY0LCAgKTsKK2RlY2xhcmVfZnBlbChjb3B5LCAzMiwgICk7CitkZWNsYXJlX2ZwZWwoY29weSwgMTYsICApOworZGVjbGFyZV9mcGVsKGNvcHksIDgsICAgKTsKK2RlY2xhcmVfZnBlbChhdmcsIDY0LCBfMTYpOworZGVjbGFyZV9mcGVsKGF2ZywgMzIsIF8xNik7CitkZWNsYXJlX2ZwZWwoYXZnLCAxNiwgXzE2KTsKK2RlY2xhcmVfZnBlbChhdmcsIDgsICBfMTYpOworZGVjbGFyZV9mcGVsKGF2ZywgNCwgIF8xNik7CisKK2RlY2xfbWNfZnVuY3MoNjQsIEJQUCk7CitkZWNsX21jX2Z1bmNzKDMyLCBCUFApOworZGVjbF9tY19mdW5jcygxNiwgQlBQKTsKK2RlY2xfbWNfZnVuY3MoOCwgIEJQUCk7CitkZWNsX21jX2Z1bmNzKDQsICBCUFApOworCisjZGVmaW5lIGRlZmluZV84dGFwXzJkX2Z1bmNzKHN6LCBicHApICAgICAgICBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4ocHV0LCByZWd1bGFyLCBzeiwgYnBwKSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4ocHV0LCBzaGFycCwgICBzeiwgYnBwKSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4ocHV0LCBzbW9vdGgsICBzeiwgYnBwKSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4oYXZnLCByZWd1bGFyLCBzeiwgYnBwKSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4oYXZnLCBzaGFycCwgICBzeiwgYnBwKSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4oYXZnLCBzbW9vdGgsICBzeiwgYnBwKQorCitkZWZpbmVfOHRhcF8yZF9mdW5jcyg2NCwgQlBQKQorZGVmaW5lXzh0YXBfMmRfZnVuY3MoMzIsIEJQUCkKK2RlZmluZV84dGFwXzJkX2Z1bmNzKDE2LCBCUFApCitkZWZpbmVfOHRhcF8yZF9mdW5jcyg4LCAgQlBQKQorZGVmaW5lXzh0YXBfMmRfZnVuY3MoNCwgIEJQUCkKKworCitzdGF0aWMgYXZfY29sZCB2b2lkIHZwOWRzcF9tY19pbml0X2FybShWUDlEU1BDb250ZXh0ICpkc3ApCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworI2RlZmluZSBpbml0X2ZwZWwoaWR4MSwgaWR4Miwgc3osIHR5cGUsIHN1ZmZpeCkgICAgICBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfOFRBUF9TTU9PVEggXVtpZHgyXVswXVswXSA9IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1JFR1VMQVJdW2lkeDJdWzBdWzBdID0gXAorICAgIGRzcC0+bWNbaWR4MV1bRklMVEVSXzhUQVBfU0hBUlAgIF1baWR4Ml1bMF1bMF0gPSBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfQklMSU5FQVIgICAgXVtpZHgyXVswXVswXSA9IGZmX3ZwOV8jI3R5cGUjI3N6IyNzdWZmaXgjI19uZW9uCisKKyNkZWZpbmUgaW5pdF9jb3B5X2F2ZyhpZHgsIHN6MSwgc3oyKSBcCisgICAgaW5pdF9mcGVsKGlkeCwgMCwgc3oyLCBjb3B5LCApOyAgXAorICAgIGluaXRfZnBlbChpZHgsIDEsIHN6MSwgYXZnLCBfMTYpCisKKyNkZWZpbmUgaW5pdF9tY19mdW5jKGlkeDEsIGlkeDIsIG9wLCBmaWx0ZXIsIGZuYW1lLCBkaXIsIG14LCBteSwgc3osIHBmeCwgYnBwKSBcCisgICAgZHNwLT5tY1tpZHgxXVtmaWx0ZXJdW2lkeDJdW214XVtteV0gPSBwZngjI29wIyNfIyNmbmFtZSMjc3ojI18jI2RpciMjXyMjYnBwIyNfbmVvbgorCisjZGVmaW5lIGluaXRfbWNfZnVuY3MoaWR4LCBkaXIsIG14LCBteSwgc3osIHBmeCwgYnBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluaXRfbWNfZnVuYyhpZHgsIDAsIHB1dCwgRklMVEVSXzhUQVBfUkVHVUxBUiwgcmVndWxhciwgZGlyLCBteCwgbXksIHN6LCBwZngsIGJwcCk7IFwKKyAgICBpbml0X21jX2Z1bmMoaWR4LCAwLCBwdXQsIEZJTFRFUl84VEFQX1NIQVJQLCAgIHNoYXJwLCAgIGRpciwgbXgsIG15LCBzeiwgcGZ4LCBicHApOyBcCisgICAgaW5pdF9tY19mdW5jKGlkeCwgMCwgcHV0LCBGSUxURVJfOFRBUF9TTU9PVEgsICBzbW9vdGgsICBkaXIsIG14LCBteSwgc3osIHBmeCwgYnBwKTsgXAorICAgIGluaXRfbWNfZnVuYyhpZHgsIDEsIGF2ZywgRklMVEVSXzhUQVBfUkVHVUxBUiwgcmVndWxhciwgZGlyLCBteCwgbXksIHN6LCBwZngsIGJwcCk7IFwKKyAgICBpbml0X21jX2Z1bmMoaWR4LCAxLCBhdmcsIEZJTFRFUl84VEFQX1NIQVJQLCAgIHNoYXJwLCAgIGRpciwgbXgsIG15LCBzeiwgcGZ4LCBicHApOyBcCisgICAgaW5pdF9tY19mdW5jKGlkeCwgMSwgYXZnLCBGSUxURVJfOFRBUF9TTU9PVEgsICBzbW9vdGgsICBkaXIsIG14LCBteSwgc3osIHBmeCwgYnBwKQorCisjZGVmaW5lIGluaXRfbWNfZnVuY3NfZGlycyhpZHgsIHN6LCBicHApICAgICAgICAgICAgXAorICAgIGluaXRfbWNfZnVuY3MoaWR4LCBoLCAgMSwgMCwgc3osIGZmX3ZwOV8sIGJwcCk7IFwKKyAgICBpbml0X21jX2Z1bmNzKGlkeCwgdiwgIDAsIDEsIHN6LCBmZl92cDlfLCBicHApOyBcCisgICAgaW5pdF9tY19mdW5jcyhpZHgsIGh2LCAxLCAxLCBzeiwgICAgICAgICwgYnBwKQorCisgICAgICAgIGluaXRfY29weV9hdmcoMCwgNjQsIDEyOCk7CisgICAgICAgIGluaXRfY29weV9hdmcoMSwgMzIsIDY0KTsKKyAgICAgICAgaW5pdF9jb3B5X2F2ZygyLCAxNiwgMzIpOworICAgICAgICBpbml0X2NvcHlfYXZnKDMsIDgsICAxNik7CisgICAgICAgIGluaXRfY29weV9hdmcoNCwgNCwgIDgpOworCisgICAgICAgIGluaXRfbWNfZnVuY3NfZGlycygwLCA2NCwgQlBQKTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDEsIDMyLCBCUFApOworICAgICAgICBpbml0X21jX2Z1bmNzX2RpcnMoMiwgMTYsIEJQUCk7CisgICAgICAgIGluaXRfbWNfZnVuY3NfZGlycygzLCA4LCAgQlBQKTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDQsIDQsICBCUFApOworICAgIH0KK30KKworI2RlZmluZSBkZWZpbmVfaXR4Zm0yKHR5cGVfYSwgdHlwZV9iLCBzeiwgYnBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOV8jI3R5cGVfYSMjXyMjdHlwZV9iIyNfIyNzeiMjeCMjc3ojI19hZGRfIyNicHAjI19uZW9uKHVpbnQ4X3QgKl9kc3QsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpfYmxvY2ssIGludCBlb2IpCisjZGVmaW5lIGRlZmluZV9pdHhmbSh0eXBlX2EsIHR5cGVfYiwgc3osIGJwcCkgZGVmaW5lX2l0eGZtMih0eXBlX2EsIHR5cGVfYiwgc3osIGJwcCkKKworI2RlZmluZSBkZWZpbmVfaXR4Zm1fZnVuY3Moc3osIGJwcCkgICAgICBcCisgICAgZGVmaW5lX2l0eGZtKGlkY3QsICBpZGN0LCAgc3osIGJwcCk7IFwKKyAgICBkZWZpbmVfaXR4Zm0oaWFkc3QsIGlkY3QsICBzeiwgYnBwKTsgXAorICAgIGRlZmluZV9pdHhmbShpZGN0LCAgaWFkc3QsIHN6LCBicHApOyBcCisgICAgZGVmaW5lX2l0eGZtKGlhZHN0LCBpYWRzdCwgc3osIGJwcCkKKworZGVmaW5lX2l0eGZtX2Z1bmNzKDQsICBCUFApOworZGVmaW5lX2l0eGZtX2Z1bmNzKDgsICBCUFApOworZGVmaW5lX2l0eGZtX2Z1bmNzKDE2LCBCUFApOworZGVmaW5lX2l0eGZtKGlkY3QsIGlkY3QsIDMyLCBCUFApOworZGVmaW5lX2l0eGZtKGl3aHQsIGl3aHQsIDQsICBCUFApOworCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA5ZHNwX2l0eGZtX2luaXRfYXJtKFZQOURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisjZGVmaW5lIGluaXRfaXR4Zm0yKHR4LCBzeiwgYnBwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtEQ1RfRENUXSAgID0gZmZfdnA5X2lkY3RfaWRjdF8jI3N6IyNfYWRkXyMjYnBwIyNfbmVvbjsgIFwKKyAgICBkc3AtPml0eGZtX2FkZFt0eF1bRENUX0FEU1RdICA9IGZmX3ZwOV9pYWRzdF9pZGN0XyMjc3ojI19hZGRfIyNicHAjI19uZW9uOyBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfRENUXSAgPSBmZl92cDlfaWRjdF9pYWRzdF8jI3N6IyNfYWRkXyMjYnBwIyNfbmVvbjsgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtBRFNUX0FEU1RdID0gZmZfdnA5X2lhZHN0X2lhZHN0XyMjc3ojI19hZGRfIyNicHAjI19uZW9uCisjZGVmaW5lIGluaXRfaXR4Zm0odHgsIHN6LCBicHApIGluaXRfaXR4Zm0yKHR4LCBzeiwgYnBwKQorCisjZGVmaW5lIGluaXRfaWRjdDIodHgsIG5tLCBicHApICAgICBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0RDVF9EQ1RdICAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfRENUXSAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0RDVF9BRFNUXSAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfQURTVF0gPSBmZl92cDlfIyNubSMjX2FkZF8jI2JwcCMjX25lb24KKyNkZWZpbmUgaW5pdF9pZGN0KHR4LCBubSwgYnBwKSBpbml0X2lkY3QyKHR4LCBubSwgYnBwKQorCisgICAgICAgIGluaXRfaXR4Zm0oVFhfNFg0LCAgIDR4NCwgICBCUFApOworICAgICAgICBpbml0X2l0eGZtKFRYXzhYOCwgICA4eDgsICAgQlBQKTsKKyAgICAgICAgaW5pdF9pdHhmbShUWF8xNlgxNiwgMTZ4MTYsIEJQUCk7CisgICAgICAgIGluaXRfaWRjdChUWF8zMlgzMiwgaWRjdF9pZGN0XzMyeDMyLCBCUFApOworICAgICAgICBpbml0X2lkY3QoNCwgICAgICAgIGl3aHRfaXdodF80eDQsICAgQlBQKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgZGVmaW5lX2xvb3BfZmlsdGVyKGRpciwgd2QsIHNpemUsIGJwcCkgXAordm9pZCBmZl92cDlfbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkIyNfIyNzaXplIyNfIyNicHAjI19uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IEUsIGludCBJLCBpbnQgSCkKKworI2RlZmluZSBkZWZpbmVfbG9vcF9maWx0ZXJzKHdkLCBzaXplLCBicHApIFwKKyAgICBkZWZpbmVfbG9vcF9maWx0ZXIoaCwgd2QsIHNpemUsIGJwcCk7ICBcCisgICAgZGVmaW5lX2xvb3BfZmlsdGVyKHYsIHdkLCBzaXplLCBicHApCisKK2RlZmluZV9sb29wX2ZpbHRlcnMoNCwgIDgsICBCUFApOworZGVmaW5lX2xvb3BfZmlsdGVycyg4LCAgOCwgIEJQUCk7CitkZWZpbmVfbG9vcF9maWx0ZXJzKDE2LCA4LCAgQlBQKTsKKworZGVmaW5lX2xvb3BfZmlsdGVycygxNiwgMTYsIEJQUCk7CisKK2RlZmluZV9sb29wX2ZpbHRlcnMoNDQsIDE2LCBCUFApOworZGVmaW5lX2xvb3BfZmlsdGVycyg0OCwgMTYsIEJQUCk7CitkZWZpbmVfbG9vcF9maWx0ZXJzKDg0LCAxNiwgQlBQKTsKK2RlZmluZV9sb29wX2ZpbHRlcnMoODgsIDE2LCBCUFApOworCitzdGF0aWMgYXZfY29sZCB2b2lkIHZwOWRzcF9sb29wZmlsdGVyX2luaXRfYXJtKFZQOURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisjZGVmaW5lIGluaXRfbHBmX2Z1bmNfOChpZHgxLCBpZHgyLCBkaXIsIHdkLCBicHApIFwKKyAgICBkc3AtPmxvb3BfZmlsdGVyXzhbaWR4MV1baWR4Ml0gPSBmZl92cDlfbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkIyNfOF8jI2JwcCMjX25lb24KKworI2RlZmluZSBpbml0X2xwZl9mdW5jXzE2KGlkeCwgZGlyLCBicHApIFwKKyAgICBkc3AtPmxvb3BfZmlsdGVyXzE2W2lkeF0gPSBmZl92cDlfbG9vcF9maWx0ZXJfIyNkaXIjI18xNl8xNl8jI2JwcCMjX25lb24KKworI2RlZmluZSBpbml0X2xwZl9mdW5jX21peDIoaWR4MSwgaWR4MiwgaWR4MywgZGlyLCB3ZCwgYnBwKSBcCisgICAgZHNwLT5sb29wX2ZpbHRlcl9taXgyW2lkeDFdW2lkeDJdW2lkeDNdID0gZmZfdnA5X2xvb3BfZmlsdGVyXyMjZGlyIyNfIyN3ZCMjXzE2XyMjYnBwIyNfbmVvbgorCisjZGVmaW5lIGluaXRfbHBmX2Z1bmNzXzhfd2QoaWR4LCB3ZCwgYnBwKSBcCisgICAgaW5pdF9scGZfZnVuY184KGlkeCwgMCwgaCwgd2QsIGJwcCk7ICBcCisgICAgaW5pdF9scGZfZnVuY184KGlkeCwgMSwgdiwgd2QsIGJwcCkKKworI2RlZmluZSBpbml0X2xwZl9mdW5jc18xNihicHApICAgXAorICAgIGluaXRfbHBmX2Z1bmNfMTYoMCwgaCwgYnBwKTsgXAorICAgIGluaXRfbHBmX2Z1bmNfMTYoMSwgdiwgYnBwKQorCisjZGVmaW5lIGluaXRfbHBmX2Z1bmNzX21peDJfd2QoaWR4MSwgaWR4Miwgd2QsIGJwcCkgXAorICAgIGluaXRfbHBmX2Z1bmNfbWl4MihpZHgxLCBpZHgyLCAwLCBoLCB3ZCwgYnBwKTsgIFwKKyAgICBpbml0X2xwZl9mdW5jX21peDIoaWR4MSwgaWR4MiwgMSwgdiwgd2QsIGJwcCkKKworI2RlZmluZSBpbml0X2xwZl9mdW5jc184KGJwcCkgICAgICAgIFwKKyAgICBpbml0X2xwZl9mdW5jc184X3dkKDAsIDQsICBicHApOyBcCisgICAgaW5pdF9scGZfZnVuY3NfOF93ZCgxLCA4LCAgYnBwKTsgXAorICAgIGluaXRfbHBmX2Z1bmNzXzhfd2QoMiwgMTYsIGJwcCkKKworI2RlZmluZSBpbml0X2xwZl9mdW5jc19taXgyKGJwcCkgICAgICAgICAgIFwKKyAgICBpbml0X2xwZl9mdW5jc19taXgyX3dkKDAsIDAsIDQ0LCBicHApOyBcCisgICAgaW5pdF9scGZfZnVuY3NfbWl4Ml93ZCgwLCAxLCA0OCwgYnBwKTsgXAorICAgIGluaXRfbHBmX2Z1bmNzX21peDJfd2QoMSwgMCwgODQsIGJwcCk7IFwKKyAgICBpbml0X2xwZl9mdW5jc19taXgyX3dkKDEsIDEsIDg4LCBicHApCisKKyAgICAgICAgaW5pdF9scGZfZnVuY3NfOChCUFApOworICAgICAgICBpbml0X2xwZl9mdW5jc18xNihCUFApOworICAgICAgICBpbml0X2xwZl9mdW5jc19taXgyKEJQUCk7CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgSU5JVF9GVU5DKFZQOURTUENvbnRleHQgKmRzcCkKK3sKKyAgICB2cDlkc3BfbWNfaW5pdF9hcm0oZHNwKTsKKyAgICB2cDlkc3BfbG9vcGZpbHRlcl9pbml0X2FybShkc3ApOworICAgIHZwOWRzcF9pdHhmbV9pbml0X2FybShkc3ApOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vdnA5ZHNwX2luaXRfYXJtLmMgYi9saWJhdmNvZGVjL2FybS92cDlkc3BfaW5pdF9hcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdmNDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hcm0vdnA5ZHNwX2luaXRfYXJtLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdnA5ZHNwLmgiCisjaW5jbHVkZSAidnA5ZHNwX2luaXQuaCIKKworI2RlZmluZSBkZWNsYXJlX2ZwZWwodHlwZSwgc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl92cDlfIyN0eXBlIyNzeiMjX25lb24odWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KQorCisjZGVmaW5lIGRlY2xhcmVfY29weV9hdmcoc3opIFwKKyAgICBkZWNsYXJlX2ZwZWwoY29weSwgc3opOyAgXAorICAgIGRlY2xhcmVfZnBlbChhdmcgLCBzeikKKworI2RlZmluZSBkZWNsX21jX2Z1bmMob3AsIGZpbHRlciwgZGlyLCBzeikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOV8jI29wIyNfIyNmaWx0ZXIjI3N6IyNfIyNkaXIjI19uZW9uKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpCisKKyNkZWZpbmUgZGVmaW5lXzh0YXBfMmRfZm4ob3AsIGZpbHRlciwgc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBvcCMjXyMjZmlsdGVyIyNzeiMjX2h2X25lb24odWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgdGVtcCwgWygoMSArIChzeiA8IDY0KSkgKiBzeiArIDgpICogc3pdKTsgICAgICAgICAgIFwKKyAgICAvKiBXZSBvbmx5IG5lZWQgaCArIDcgbGluZXMsIGJ1dCB0aGUgaG9yaXpvbnRhbCBmaWx0ZXIgYXNzdW1lcyBhbiAgICAgICAgICAgICBcCisgICAgICogZXZlbiBudW1iZXIgb2Ygcm93cywgc28gZmlsdGVyIGggKyA4IGxpbmVzIGhlcmUuICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZmX3ZwOV9wdXRfIyNmaWx0ZXIjI3N6IyNfaF9uZW9uKHRlbXAsIHN6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAzICogc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArIDgsIG14LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZmX3ZwOV8jI29wIyNfIyNmaWx0ZXIjI3N6IyNfdl9uZW9uKGRzdCwgZHN0X3N0cmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wICsgMyAqIHN6LCBzeiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCwgMCwgbXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIGRlY2xfZmlsdGVyX2Z1bmNzKG9wLCBkaXIsIHN6KSAgXAorICAgIGRlY2xfbWNfZnVuYyhvcCwgcmVndWxhciwgZGlyLCBzeik7IFwKKyAgICBkZWNsX21jX2Z1bmMob3AsIHNoYXJwLCAgIGRpciwgc3opOyBcCisgICAgZGVjbF9tY19mdW5jKG9wLCBzbW9vdGgsICBkaXIsIHN6KQorCisjZGVmaW5lIGRlY2xfbWNfZnVuY3Moc3opICAgICAgICAgICBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MocHV0LCBoLCAgc3opOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MoYXZnLCBoLCAgc3opOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MocHV0LCB2LCAgc3opOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MoYXZnLCB2LCAgc3opOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MocHV0LCBodiwgc3opOyBcCisgICAgZGVjbF9maWx0ZXJfZnVuY3MoYXZnLCBodiwgc3opCisKK2RlY2xhcmVfY29weV9hdmcoNjQpOworZGVjbGFyZV9jb3B5X2F2ZygzMik7CitkZWNsYXJlX2NvcHlfYXZnKDE2KTsKK2RlY2xhcmVfY29weV9hdmcoOCk7CitkZWNsYXJlX2NvcHlfYXZnKDQpOworCitkZWNsX21jX2Z1bmNzKDY0KTsKK2RlY2xfbWNfZnVuY3MoMzIpOworZGVjbF9tY19mdW5jcygxNik7CitkZWNsX21jX2Z1bmNzKDgpOworZGVjbF9tY19mdW5jcyg0KTsKKworI2RlZmluZSBkZWZpbmVfOHRhcF8yZF9mdW5jcyhzeikgICAgICAgIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihwdXQsIHJlZ3VsYXIsIHN6KSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4ocHV0LCBzaGFycCwgICBzeikgXAorICAgIGRlZmluZV84dGFwXzJkX2ZuKHB1dCwgc21vb3RoLCAgc3opIFwKKyAgICBkZWZpbmVfOHRhcF8yZF9mbihhdmcsIHJlZ3VsYXIsIHN6KSBcCisgICAgZGVmaW5lXzh0YXBfMmRfZm4oYXZnLCBzaGFycCwgICBzeikgXAorICAgIGRlZmluZV84dGFwXzJkX2ZuKGF2Zywgc21vb3RoLCAgc3opCisKK2RlZmluZV84dGFwXzJkX2Z1bmNzKDY0KQorZGVmaW5lXzh0YXBfMmRfZnVuY3MoMzIpCitkZWZpbmVfOHRhcF8yZF9mdW5jcygxNikKK2RlZmluZV84dGFwXzJkX2Z1bmNzKDgpCitkZWZpbmVfOHRhcF8yZF9mdW5jcyg0KQorCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA5ZHNwX21jX2luaXRfYXJtKFZQOURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKGhhdmVfbmVvbihjcHVfZmxhZ3MpKSB7CisjZGVmaW5lIGluaXRfZnBlbChpZHgxLCBpZHgyLCBzeiwgdHlwZSkgICAgICAgICAgICAgIFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl84VEFQX1NNT09USCBdW2lkeDJdWzBdWzBdID0gXAorICAgIGRzcC0+bWNbaWR4MV1bRklMVEVSXzhUQVBfUkVHVUxBUl1baWR4Ml1bMF1bMF0gPSBcCisgICAgZHNwLT5tY1tpZHgxXVtGSUxURVJfOFRBUF9TSEFSUCAgXVtpZHgyXVswXVswXSA9IFwKKyAgICBkc3AtPm1jW2lkeDFdW0ZJTFRFUl9CSUxJTkVBUiAgICBdW2lkeDJdWzBdWzBdID0gZmZfdnA5XyMjdHlwZSMjc3ojI19uZW9uCisKKyNkZWZpbmUgaW5pdF9jb3B5X2F2ZyhpZHgsIHN6KSAgIFwKKyAgICBpbml0X2ZwZWwoaWR4LCAwLCBzeiwgY29weSk7IFwKKyAgICBpbml0X2ZwZWwoaWR4LCAxLCBzeiwgYXZnKQorCisjZGVmaW5lIGluaXRfbWNfZnVuYyhpZHgxLCBpZHgyLCBvcCwgZmlsdGVyLCBmbmFtZSwgZGlyLCBteCwgbXksIHN6LCBwZngpIFwKKyAgICBkc3AtPm1jW2lkeDFdW2ZpbHRlcl1baWR4Ml1bbXhdW215XSA9IHBmeCMjb3AjI18jI2ZuYW1lIyNzeiMjXyMjZGlyIyNfbmVvbgorCisjZGVmaW5lIGluaXRfbWNfZnVuY3MoaWR4LCBkaXIsIG14LCBteSwgc3osIHBmeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbml0X21jX2Z1bmMoaWR4LCAwLCBwdXQsIEZJTFRFUl84VEFQX1JFR1VMQVIsIHJlZ3VsYXIsIGRpciwgbXgsIG15LCBzeiwgcGZ4KTsgXAorICAgIGluaXRfbWNfZnVuYyhpZHgsIDAsIHB1dCwgRklMVEVSXzhUQVBfU0hBUlAsICAgc2hhcnAsICAgZGlyLCBteCwgbXksIHN6LCBwZngpOyBcCisgICAgaW5pdF9tY19mdW5jKGlkeCwgMCwgcHV0LCBGSUxURVJfOFRBUF9TTU9PVEgsICBzbW9vdGgsICBkaXIsIG14LCBteSwgc3osIHBmeCk7IFwKKyAgICBpbml0X21jX2Z1bmMoaWR4LCAxLCBhdmcsIEZJTFRFUl84VEFQX1JFR1VMQVIsIHJlZ3VsYXIsIGRpciwgbXgsIG15LCBzeiwgcGZ4KTsgXAorICAgIGluaXRfbWNfZnVuYyhpZHgsIDEsIGF2ZywgRklMVEVSXzhUQVBfU0hBUlAsICAgc2hhcnAsICAgZGlyLCBteCwgbXksIHN6LCBwZngpOyBcCisgICAgaW5pdF9tY19mdW5jKGlkeCwgMSwgYXZnLCBGSUxURVJfOFRBUF9TTU9PVEgsICBzbW9vdGgsICBkaXIsIG14LCBteSwgc3osIHBmeCkKKworI2RlZmluZSBpbml0X21jX2Z1bmNzX2RpcnMoaWR4LCBzeikgICAgICAgICAgICBcCisgICAgaW5pdF9tY19mdW5jcyhpZHgsIGgsICAxLCAwLCBzeiwgZmZfdnA5Xyk7IFwKKyAgICBpbml0X21jX2Z1bmNzKGlkeCwgdiwgIDAsIDEsIHN6LCBmZl92cDlfKTsgXAorICAgIGluaXRfbWNfZnVuY3MoaWR4LCBodiwgMSwgMSwgc3osKQorCisgICAgICAgIGluaXRfY29weV9hdmcoMCwgNjQpOworICAgICAgICBpbml0X2NvcHlfYXZnKDEsIDMyKTsKKyAgICAgICAgaW5pdF9jb3B5X2F2ZygyLCAxNik7CisgICAgICAgIGluaXRfY29weV9hdmcoMywgOCk7CisgICAgICAgIGluaXRfY29weV9hdmcoNCwgNCk7CisKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDAsIDY0KTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDEsIDMyKTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDIsIDE2KTsKKyAgICAgICAgaW5pdF9tY19mdW5jc19kaXJzKDMsIDgpOworICAgICAgICBpbml0X21jX2Z1bmNzX2RpcnMoNCwgNCk7CisgICAgfQorfQorCisjZGVmaW5lIGRlZmluZV9pdHhmbSh0eXBlX2EsIHR5cGVfYiwgc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3ZwOV8jI3R5cGVfYSMjXyMjdHlwZV9iIyNfIyNzeiMjeCMjc3ojI19hZGRfbmVvbih1aW50OF90ICpfZHN0LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpfYmxvY2ssIGludCBlb2IpCisKKyNkZWZpbmUgZGVmaW5lX2l0eGZtX2Z1bmNzKHN6KSAgICAgIFwKKyAgICBkZWZpbmVfaXR4Zm0oaWRjdCwgIGlkY3QsICBzeik7IFwKKyAgICBkZWZpbmVfaXR4Zm0oaWFkc3QsIGlkY3QsICBzeik7IFwKKyAgICBkZWZpbmVfaXR4Zm0oaWRjdCwgIGlhZHN0LCBzeik7IFwKKyAgICBkZWZpbmVfaXR4Zm0oaWFkc3QsIGlhZHN0LCBzeikKKworZGVmaW5lX2l0eGZtX2Z1bmNzKDQpOworZGVmaW5lX2l0eGZtX2Z1bmNzKDgpOworZGVmaW5lX2l0eGZtX2Z1bmNzKDE2KTsKK2RlZmluZV9pdHhmbShpZGN0LCBpZGN0LCAzMik7CitkZWZpbmVfaXR4Zm0oaXdodCwgaXdodCwgNCk7CisKKworc3RhdGljIGF2X2NvbGQgdm9pZCB2cDlkc3BfaXR4Zm1faW5pdF9hcm0oVlA5RFNQQ29udGV4dCAqZHNwKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyNkZWZpbmUgaW5pdF9pdHhmbSh0eCwgc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtEQ1RfRENUXSAgID0gZmZfdnA5X2lkY3RfaWRjdF8jI3N6IyNfYWRkX25lb247ICBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0RDVF9BRFNUXSAgPSBmZl92cDlfaWFkc3RfaWRjdF8jI3N6IyNfYWRkX25lb247IFwKKyAgICBkc3AtPml0eGZtX2FkZFt0eF1bQURTVF9EQ1RdICA9IGZmX3ZwOV9pZGN0X2lhZHN0XyMjc3ojI19hZGRfbmVvbjsgXAorICAgIGRzcC0+aXR4Zm1fYWRkW3R4XVtBRFNUX0FEU1RdID0gZmZfdnA5X2lhZHN0X2lhZHN0XyMjc3ojI19hZGRfbmVvbgorCisjZGVmaW5lIGluaXRfaWRjdCh0eCwgbm0pICAgICAgICAgICBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0RDVF9EQ1RdICAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfRENUXSAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0RDVF9BRFNUXSAgPSBcCisgICAgZHNwLT5pdHhmbV9hZGRbdHhdW0FEU1RfQURTVF0gPSBmZl92cDlfIyNubSMjX2FkZF9uZW9uCisKKyAgICAgICAgaW5pdF9pdHhmbShUWF80WDQsIDR4NCk7CisgICAgICAgIGluaXRfaXR4Zm0oVFhfOFg4LCA4eDgpOworICAgICAgICBpbml0X2l0eGZtKFRYXzE2WDE2LCAxNngxNik7CisgICAgICAgIGluaXRfaWRjdChUWF8zMlgzMiwgaWRjdF9pZGN0XzMyeDMyKTsKKyAgICAgICAgaW5pdF9pZGN0KDQsIGl3aHRfaXdodF80eDQpOworICAgIH0KK30KKworI2RlZmluZSBkZWZpbmVfbG9vcF9maWx0ZXIoZGlyLCB3ZCwgc2l6ZSkgXAordm9pZCBmZl92cDlfbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkIyNfIyNzaXplIyNfbmVvbih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBFLCBpbnQgSSwgaW50IEgpCisKKyNkZWZpbmUgZGVmaW5lX2xvb3BfZmlsdGVycyh3ZCwgc2l6ZSkgXAorICAgIGRlZmluZV9sb29wX2ZpbHRlcihoLCB3ZCwgc2l6ZSk7ICBcCisgICAgZGVmaW5lX2xvb3BfZmlsdGVyKHYsIHdkLCBzaXplKQorCitkZWZpbmVfbG9vcF9maWx0ZXJzKDQsIDgpOworZGVmaW5lX2xvb3BfZmlsdGVycyg4LCA4KTsKK2RlZmluZV9sb29wX2ZpbHRlcnMoMTYsIDgpOworZGVmaW5lX2xvb3BfZmlsdGVycygxNiwgMTYpOworCitkZWZpbmVfbG9vcF9maWx0ZXJzKDQ0LCAxNik7CisKKyNkZWZpbmUgbGZfbWl4X2ZuKGRpciwgd2QxLCB3ZDIsIHN0cmlkZWEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkMSMjd2QyIyNfMTZfbmVvbih1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEUsIGludCBJLCBpbnQgSCkgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfdnA5X2xvb3BfZmlsdGVyXyMjZGlyIyNfIyN3ZDEjI184X25lb24oZHN0LCBzdHJpZGUsIEUgJiAweGZmLCBJICYgMHhmZiwgSCAmIDB4ZmYpOyAgICAgICAgIFwKKyAgICBmZl92cDlfbG9vcF9maWx0ZXJfIyNkaXIjI18jI3dkMiMjXzhfbmVvbihkc3QgKyA4ICogc3RyaWRlYSwgc3RyaWRlLCBFID4+IDgsIEkgPj4gOCwgSCA+PiA4KTsgXAorfQorCisjZGVmaW5lIGxmX21peF9mbnMod2QxLCB3ZDIpICAgICAgIFwKKyAgICBsZl9taXhfZm4oaCwgd2QxLCB3ZDIsIHN0cmlkZSkgXAorICAgIGxmX21peF9mbih2LCB3ZDEsIHdkMiwgc2l6ZW9mKHVpbnQ4X3QpKQorCitsZl9taXhfZm5zKDQsIDgpCitsZl9taXhfZm5zKDgsIDQpCitsZl9taXhfZm5zKDgsIDgpCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA5ZHNwX2xvb3BmaWx0ZXJfaW5pdF9hcm0oVlA5RFNQQ29udGV4dCAqZHNwKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzBdWzFdID0gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfNF84X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfOFswXVswXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzRfOF9uZW9uOworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyXzhbMV1bMV0gPSBmZl92cDlfbG9vcF9maWx0ZXJfdl84XzhfbmVvbjsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzFdWzBdID0gZmZfdnA5X2xvb3BfZmlsdGVyX2hfOF84X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfOFsyXVsxXSA9IGZmX3ZwOV9sb29wX2ZpbHRlcl92XzE2XzhfbmVvbjsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzJdWzBdID0gZmZfdnA5X2xvb3BfZmlsdGVyX2hfMTZfOF9uZW9uOworCisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfMTZbMF0gPSBmZl92cDlfbG9vcF9maWx0ZXJfaF8xNl8xNl9uZW9uOworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyXzE2WzFdID0gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfMTZfMTZfbmVvbjsKKworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyX21peDJbMF1bMF1bMF0gPSBmZl92cDlfbG9vcF9maWx0ZXJfaF80NF8xNl9uZW9uOworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyX21peDJbMF1bMF1bMV0gPSBmZl92cDlfbG9vcF9maWx0ZXJfdl80NF8xNl9uZW9uOworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyX21peDJbMF1bMV1bMF0gPSBsb29wX2ZpbHRlcl9oXzQ4XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlswXVsxXVsxXSA9IGxvb3BfZmlsdGVyX3ZfNDhfMTZfbmVvbjsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl9taXgyWzFdWzBdWzBdID0gbG9vcF9maWx0ZXJfaF84NF8xNl9uZW9uOworICAgICAgICBkc3AtPmxvb3BfZmlsdGVyX21peDJbMV1bMF1bMV0gPSBsb29wX2ZpbHRlcl92Xzg0XzE2X25lb247CisgICAgICAgIGRzcC0+bG9vcF9maWx0ZXJfbWl4MlsxXVsxXVswXSA9IGxvb3BfZmlsdGVyX2hfODhfMTZfbmVvbjsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl9taXgyWzFdWzFdWzFdID0gbG9vcF9maWx0ZXJfdl84OF8xNl9uZW9uOworICAgIH0KK30KKworYXZfY29sZCB2b2lkIGZmX3ZwOWRzcF9pbml0X2FybShWUDlEU1BDb250ZXh0ICpkc3AsIGludCBicHApCit7CisgICAgaWYgKGJwcCA9PSAxMCkgeworICAgICAgICBmZl92cDlkc3BfaW5pdF8xMGJwcF9hcm0oZHNwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoYnBwID09IDEyKSB7CisgICAgICAgIGZmX3ZwOWRzcF9pbml0XzEyYnBwX2FybShkc3ApOworICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChicHAgIT0gOCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdnA5ZHNwX21jX2luaXRfYXJtKGRzcCk7CisgICAgdnA5ZHNwX2xvb3BmaWx0ZXJfaW5pdF9hcm0oZHNwKTsKKyAgICB2cDlkc3BfaXR4Zm1faW5pdF9hcm0oZHNwKTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL3ZwOWl0eGZtXzE2YnBwX25lb24uUyBiL2xpYmF2Y29kZWMvYXJtL3ZwOWl0eGZtXzE2YnBwX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGY2MTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hcm0vdnA5aXR4Zm1fMTZicHBfbmVvbi5TCkBAIC0wLDAgKzEsMTk0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKyNpbmNsdWRlICJuZW9uLlMiCisKK2NvbnN0IGl0eGZtNF9jb2VmZnMsIGFsaWduPTQKKyAgICAgICAgLnNob3J0ICAxMTU4NSwgMCwgNjI3MCwgMTUxMzcKK2lhZHN0NF9jb2VmZnM6CisgICAgICAgIC5zaG9ydCAgNTI4MywgMTUyMTIsIDk5MjksIDEzMzc3CitlbmRjb25zdAorCitjb25zdCBpYWRzdDhfY29lZmZzLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgMTYzMDUsIDE2MDYsIDE0NDQ5LCA3NzIzLCAxMDM5NCwgMTI2NjUsIDQ3NTYsIDE1Njc5CitpZGN0X2NvZWZmczoKKyAgICAgICAgLnNob3J0ICAxMTU4NSwgMCwgNjI3MCwgMTUxMzcsIDMxOTYsIDE2MDY5LCAxMzYyMywgOTEwMgorICAgICAgICAuc2hvcnQgIDE2MDYsIDE2MzA1LCAxMjY2NSwgMTAzOTQsIDc3MjMsIDE0NDQ5LCAxNTY3OSwgNDc1NgorICAgICAgICAuc2hvcnQgIDgwNCwgMTYzNjQsIDEyMTQwLCAxMTAwMywgNzAwNSwgMTQ4MTEsIDE1NDI2LCA1NTIwCisgICAgICAgIC5zaG9ydCAgMzk4MSwgMTU4OTMsIDE0MDUzLCA4NDIzLCA5NzYwLCAxMzE2MCwgMTYyMDcsIDI0MDQKK2VuZGNvbnN0CisKK2NvbnN0IGlhZHN0MTZfY29lZmZzLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgMTYzNjQsIDgwNCwgMTU4OTMsIDM5ODEsIDExMDAzLCAxMjE0MCwgODQyMywgMTQwNTMKKyAgICAgICAgLnNob3J0ICAxNDgxMSwgNzAwNSwgMTMxNjAsIDk3NjAsIDU1MjAsIDE1NDI2LCAyNDA0LCAxNjIwNworZW5kY29uc3QKKworQCBEbyB0d28gNHg0IHRyYW5zcG9zZXMsIHVzaW5nIHEgcmVnaXN0ZXJzIGZvciB0aGUgc3VidHJhbnNwb3NlcyB0aGF0IGRvbid0CitAIG5lZWQgdG8gYWRkcmVzcyB0aGUgaW5kaXZpZHVhbCBkIHJlZ2lzdGVycy4KK0AgcjAscjEgPT0gcnExLCByMixyMyA9PSBycTEsIGV0YworLm1hY3JvIHRyYW5zcG9zZTMyX3FfMnhfNHg0IHJxMCwgcnExLCBycTIsIHJxMywgcnE0LCBycTUsIHJxNiwgcnE3LCByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgcjEzLCByMTQsIHIxNQorICAgICAgICB2c3dwICAgICAgICAgICAgIFxyMSwgIFxyNCAgQCB2dHJuLjY0IFxycTAsIFxycTIKKyAgICAgICAgdnN3cCAgICAgICAgICAgICBccjMsICBccjYgIEAgdnRybi42NCBccnExLCBccnEzCisgICAgICAgIHZzd3AgICAgICAgICAgICAgXHI5LCAgXHIxMiBAIHZ0cm4uNjQgXHJxNCwgXHJxNgorICAgICAgICB2c3dwICAgICAgICAgICAgIFxyMTEsIFxyMTQgQCB2dHJuLjY0IFxycTUsIFxycTcKKyAgICAgICAgdnRybi4zMiAgICAgICAgICBccnEwLCBccnExCisgICAgICAgIHZ0cm4uMzIgICAgICAgICAgXHJxMiwgXHJxMworICAgICAgICB2dHJuLjMyICAgICAgICAgIFxycTQsIFxycTUKKyAgICAgICAgdnRybi4zMiAgICAgICAgICBccnE2LCBccnE3CisuZW5kbQorCitAIERvIGVpZ2h0IDJ4MiB0cmFuc3Bvc2VzLgorLm1hY3JvIHRyYW5zcG9zZTMyXzh4XzJ4MiByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgcjEzLCByMTQsIHIxNQorICAgICAgICB2dHJuLjMyICAgICAgICAgIFxyMCwgIFxyMQorICAgICAgICB2dHJuLjMyICAgICAgICAgIFxyMiwgIFxyMworICAgICAgICB2dHJuLjMyICAgICAgICAgIFxyNCwgIFxyNQorICAgICAgICB2dHJuLjMyICAgICAgICAgIFxyNiwgIFxyNworICAgICAgICB2dHJuLjMyICAgICAgICAgIFxyOCwgIFxyOQorICAgICAgICB2dHJuLjMyICAgICAgICAgIFxyMTAsIFxyMTEKKyAgICAgICAgdnRybi4zMiAgICAgICAgICBccjEyLCBccjEzCisgICAgICAgIHZ0cm4uMzIgICAgICAgICAgXHIxNCwgXHIxNQorLmVuZG0KKworQCBvdXQxID0gKChpbjEgKyBpbjIpICogZDBbMF0gKyAoMSA8PCAxMykpID4+IDE0CitAIG91dDIgPSAoKGluMSAtIGluMikgKiBkMFswXSArICgxIDw8IDEzKSkgPj4gMTQKK0AgaW4vb3V0IGFyZSBkIHJlZ2lzdGVycworLm1hY3JvIG1idXR0ZXJmbHkwIG91dDEsIG91dDIsIGluMSwgaW4yLCB0bXBkMSwgdG1wZDIsIHRtcHEzLCB0bXBxNCwgbmVnPTAKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIFx0bXBkMSwgXGluMSwgIFxpbjIKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIFx0bXBkMiwgXGluMSwgIFxpbjIKKy5pZiBcbmVnID4gMAorICAgICAgICB2bmVnLnMzMiAgICAgICAgXHRtcGQxLCBcdG1wZDEKKy5lbmRpZgorICAgICAgICB2bXVsbC5zMzIgICAgICAgXHRtcHEzLCBcdG1wZDEsIGQwWzBdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcdG1wcTQsIFx0bXBkMiwgZDBbMF0KKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxvdXQxLCBcdG1wcTMsICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXG91dDIsIFx0bXBxNCwgIzE0CisuZW5kbQorCitAIFNhbWUgYXMgbWJ1dHRlcmZseTAgYWJvdmUsIGJ1dCB0cmVhdGluZyB0aGUgaW5wdXQgaW4gaW4yIGFzIHplcm8sCitAIHdyaXRpbmcgdGhlIHNhbWUgb3V0cHV0IGludG8gYm90aCBvdXQxIGFuZCBvdXQyLgorLm1hY3JvIG1idXR0ZXJmbHkwX2ggb3V0MSwgb3V0MiwgaW4xLCBpbjIsIHRtcGQxLCB0bXBkMiwgdG1wcTMsIHRtcHE0CisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcdG1wcTMsIFxpbjEsIGQwWzBdCisgICAgICAgIHZyc2hybi5zNjQgICAgICBcb3V0MSwgXHRtcHEzLCAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxvdXQyLCBcdG1wcTMsICMxNAorLmVuZG0KKworQCBvdXQxLG91dDIgPSAoKGluMSArIGluMikgKiBkMFswXSArICgxIDw8IDEzKSkgPj4gMTQKK0Agb3V0MyxvdXQ0ID0gKChpbjEgLSBpbjIpICogZDBbMF0gKyAoMSA8PCAxMykpID4+IDE0CitAIFNhbWUgYXMgbWJ1dHRlcmZseTAsIGJ1dCB3aXRoIGlucHV0IGJlaW5nIDIgcSByZWdpc3RlcnMsIG91dHB1dAorQCBiZWluZyA0IGQgcmVnaXN0ZXJzLgorQCBUaGlzIGNhbiBkbyB3aXRoIGVpdGhlciA0IG9yIDYgdGVtcG9yYXJ5IHEgcmVnaXN0ZXJzLgorLm1hY3JvIGRtYnV0dGVyZmx5MCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBpbjEsIGluMiwgdG1wcTEsIHRtcHEyLCB0bXBkMTEsIHRtcGQxMiwgdG1wZDIxLCB0bXBkMjIsIHRtcHEzLCB0bXBxNCwgdG1wcTUsIHRtcHE2CisgICAgICAgIHZhZGQuczMyICAgICAgICBcdG1wcTEsIFxpbjEsICBcaW4yCisgICAgICAgIHZzdWIuczMyICAgICAgICBcdG1wcTIsIFxpbjEsICBcaW4yCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcdG1wcTMsIFx0bXBkMTEsIGQwWzBdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcdG1wcTQsIFx0bXBkMTIsIGQwWzBdCisuaWZiIFx0bXBxNQorICAgICAgICB2cnNocm4uczY0ICAgICAgXG91dDEsIFx0bXBxMywgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBcb3V0MiwgXHRtcHE0LCAjMTQKKyAgICAgICAgdm11bGwuczMyICAgICAgIFx0bXBxMywgXHRtcGQyMSwgZDBbMF0KKyAgICAgICAgdm11bGwuczMyICAgICAgIFx0bXBxNCwgXHRtcGQyMiwgZDBbMF0KKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxvdXQzLCBcdG1wcTMsICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXG91dDQsIFx0bXBxNCwgIzE0CisuZWxzZQorICAgICAgICB2bXVsbC5zMzIgICAgICAgXHRtcHE1LCBcdG1wZDIxLCBkMFswXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgXHRtcHE2LCBcdG1wZDIyLCBkMFswXQorICAgICAgICB2cnNocm4uczY0ICAgICAgXG91dDEsIFx0bXBxMywgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBcb3V0MiwgXHRtcHE0LCAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxvdXQzLCBcdG1wcTUsICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXG91dDQsIFx0bXBxNiwgIzE0CisuZW5kaWYKKy5lbmRtCisKK0Agb3V0MSA9IGluMSAqIGNvZWYxIC0gaW4yICogY29lZjIKK0Agb3V0MiA9IGluMSAqIGNvZWYyICsgaW4yICogY29lZjEKK0Agb3V0IGFyZSAyIHEgcmVnaXN0ZXJzLCBpbiBhcmUgMiBkIHJlZ2lzdGVycworLm1hY3JvIG1idXR0ZXJmbHlfbCBvdXQxLCBvdXQyLCBpbjEsIGluMiwgY29lZjEsIGNvZWYyLCBuZWc9MAorICAgICAgICB2bXVsbC5zMzIgICAgICAgXG91dDEsIFxpbjEsIFxjb2VmMQorICAgICAgICB2bWxzbC5zMzIgICAgICAgXG91dDEsIFxpbjIsIFxjb2VmMgorLmlmIFxuZWcKKyAgICAgICAgdm1vdi5zNjQgICAgICAgIFxvdXQyLCAjMAorICAgICAgICB2bWxzbC5zMzIgICAgICAgXG91dDIsIFxpbjEsIFxjb2VmMgorICAgICAgICB2bWxzbC5zMzIgICAgICAgXG91dDIsIFxpbjIsIFxjb2VmMQorLmVsc2UKKyAgICAgICAgdm11bGwuczMyICAgICAgIFxvdXQyLCBcaW4xLCBcY29lZjIKKyAgICAgICAgdm1sYWwuczMyICAgICAgIFxvdXQyLCBcaW4yLCBcY29lZjEKKy5lbmRpZgorLmVuZG0KKworQCBvdXQxLG91dDIgPSBpbjEsaW4yICogY29lZjEgLSBpbjMsaW40ICogY29lZjIKK0Agb3V0MyxvdXQ0ID0gaW4xLGluMiAqIGNvZWYyICsgaW4zLGluNCAqIGNvZWYxCitAIG91dCBhcmUgNCBxIHJlZ2lzdGVycywgaW4gYXJlIDQgZCByZWdpc3RlcnMKKy5tYWNybyBkbWJ1dHRlcmZseV9sIG91dDEsIG91dDIsIG91dDMsIG91dDQsIGluMSwgaW4yLCBpbjMsIGluNCwgY29lZjEsIGNvZWYyCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcb3V0MSwgXGluMSwgXGNvZWYxCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcb3V0MiwgXGluMiwgXGNvZWYxCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcb3V0MywgXGluMSwgXGNvZWYyCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcb3V0NCwgXGluMiwgXGNvZWYyCisgICAgICAgIHZtbHNsLnMzMiAgICAgICBcb3V0MSwgXGluMywgXGNvZWYyCisgICAgICAgIHZtbHNsLnMzMiAgICAgICBcb3V0MiwgXGluNCwgXGNvZWYyCisgICAgICAgIHZtbGFsLnMzMiAgICAgICBcb3V0MywgXGluMywgXGNvZWYxCisgICAgICAgIHZtbGFsLnMzMiAgICAgICBcb3V0NCwgXGluNCwgXGNvZWYxCisuZW5kbQorCitAIGlub3V0MSA9IChpbm91dDEgKiBjb2VmMSAtIGlub3V0MiAqIGNvZWYyICsgKDEgPDwgMTMpKSA+PiAxNAorQCBpbm91dDIgPSAoaW5vdXQxICogY29lZjIgKyBpbm91dDIgKiBjb2VmMSArICgxIDw8IDEzKSkgPj4gMTQKK0AgaW5vdXQgYXJlIDIgZCByZWdpc3RlcnMsIHRtcCBhcmUgMiBxIHJlZ2lzdGVycworLm1hY3JvIG1idXR0ZXJmbHkgaW5vdXQxLCBpbm91dDIsIGNvZWYxLCBjb2VmMiwgdG1wMSwgdG1wMiwgbmVnPTAKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIFx0bXAxLCBcdG1wMiwgXGlub3V0MSwgXGlub3V0MiwgXGNvZWYxLCBcY29lZjIsIFxuZWcKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxpbm91dDEsIFx0bXAxLCAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBcaW5vdXQyLCBcdG1wMiwgICMxNAorLmVuZG0KKworQCBTYW1lIGFzIG1idXR0ZXJmbHkgYWJvdmUsIGJ1dCB0cmVhdGluZyB0aGUgaW5wdXQgaW4gaW5vdXQyIGFzIHplcm8KKy5tYWNybyBtYnV0dGVyZmx5X2gxIGlub3V0MSwgaW5vdXQyLCBjb2VmMSwgY29lZjIsIHRtcDEsIHRtcDIKKyAgICAgICAgdm11bGwuczMyICAgICAgIFx0bXAxLCAgIFxpbm91dDEsIFxjb2VmMQorICAgICAgICB2bXVsbC5zMzIgICAgICAgXHRtcDIsICAgXGlub3V0MSwgXGNvZWYyCisgICAgICAgIHZyc2hybi5zNjQgICAgICBcaW5vdXQxLCBcdG1wMSwgICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxpbm91dDIsIFx0bXAyLCAgICMxNAorLmVuZG0KKworQCBTYW1lIGFzIG1idXR0ZXJmbHkgYWJvdmUsIGJ1dCB0cmVhdGluZyB0aGUgaW5wdXQgaW4gaW5vdXQxIGFzIHplcm8KKy5tYWNybyBtYnV0dGVyZmx5X2gyIGlub3V0MSwgaW5vdXQyLCBjb2VmMSwgY29lZjIsIHRtcDEsIHRtcDIKKyAgICAgICAgdm1vdi5zNjQgICAgICAgIFx0bXAxLCAgICMwCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBcdG1wMiwgICBcaW5vdXQyLCBcY29lZjEKKyAgICAgICAgdm1sc2wuczMyICAgICAgIFx0bXAxLCAgIFxpbm91dDIsIFxjb2VmMgorICAgICAgICB2cnNocm4uczY0ICAgICAgXGlub3V0MiwgXHRtcDIsICAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBcaW5vdXQxLCBcdG1wMSwgICAjMTQKKy5lbmRtCisKK0AgaW5vdXQxLGlub3V0MiA9IChpbm91dDEsaW5vdXQyICogY29lZjEgLSBpbm91dDMsaW5vdXQ0ICogY29lZjIgKyAoMSA8PCAxMykpID4+IDE0CitAIGlub3V0Myxpbm91dDQgPSAoaW5vdXQxLGlub3V0MiAqIGNvZWYyICsgaW5vdXQzLGlub3V0NCAqIGNvZWYxICsgKDEgPDwgMTMpKSA+PiAxNAorQCBpbm91dCBhcmUgNCBkIHJlZ2lzdGVycywgdG1wIGFyZSA0IHEgcmVnaXN0ZXJzCisubWFjcm8gZG1idXR0ZXJmbHkgaW5vdXQxLCBpbm91dDIsIGlub3V0MywgaW5vdXQ0LCBjb2VmMSwgY29lZjIsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIFx0bXAxLCBcdG1wMiwgXHRtcDMsIFx0bXA0LCBcaW5vdXQxLCBcaW5vdXQyLCBcaW5vdXQzLCBcaW5vdXQ0LCBcY29lZjEsIFxjb2VmMgorICAgICAgICB2cnNocm4uczY0ICAgICAgXGlub3V0MSwgXHRtcDEsICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxpbm91dDIsIFx0bXAyLCAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBcaW5vdXQzLCBcdG1wMywgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXGlub3V0NCwgXHRtcDQsICAjMTQKKy5lbmRtCisKK0Agb3V0MSA9IGluMSArIGluMgorQCBvdXQyID0gaW4xIC0gaW4yCisubWFjcm8gYnV0dGVyZmx5IG91dDEsIG91dDIsIGluMSwgaW4yCisgICAgICAgIHZhZGQuczMyICAgICAgICBcb3V0MSwgXGluMSwgXGluMgorICAgICAgICB2c3ViLnMzMiAgICAgICAgXG91dDIsIFxpbjEsIFxpbjIKKy5lbmRtCisKK0Agb3V0MSA9IGluMSAtIGluMgorQCBvdXQyID0gaW4xICsgaW4yCisubWFjcm8gYnV0dGVyZmx5X3Igb3V0MSwgb3V0MiwgaW4xLCBpbjIKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIFxvdXQxLCBcaW4xLCBcaW4yCisgICAgICAgIHZhZGQuczMyICAgICAgICBcb3V0MiwgXGluMSwgXGluMgorLmVuZG0KKworQCBvdXQxID0gKGluMSArIGluMiArICgxIDw8IDEzKSkgPj4gMTQKK0Agb3V0MiA9IChpbjEgLSBpbjIgKyAoMSA8PCAxMykpID4+IDE0CitAIG91dCBhcmUgMiBkIHJlZ2lzdGVycywgaW4gYXJlIDIgcSByZWdpc3RlcnMsIHRtcCBhcmUgMiBxIHJlZ2lzdGVycworLm1hY3JvIGJ1dHRlcmZseV9uIG91dDEsIG91dDIsIGluMSwgaW4yLCB0bXAxLCB0bXAyCisgICAgICAgIHZhZGQuczY0ICAgICAgICBcdG1wMSwgXGluMSwgXGluMgorICAgICAgICB2c3ViLnM2NCAgICAgICAgXHRtcDIsIFxpbjEsIFxpbjIKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxvdXQxLCBcdG1wMSwgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXG91dDIsIFx0bXAyLCAgIzE0CisuZW5kbQorCitAIG91dDEsb3V0MiA9IChpbjEsaW4yICsgaW4zLGluNCArICgxIDw8IDEzKSkgPj4gMTQKK0Agb3V0MyxvdXQ0ID0gKGluMSxpbjIgLSBpbjMsaW40ICsgKDEgPDwgMTMpKSA+PiAxNAorQCBvdXQgYXJlIDQgZCByZWdpc3RlcnMsIGluIGFyZSA0IHEgcmVnaXN0ZXJzLCB0bXAgYXJlIDQgcSByZWdpc3RlcnMKKy5tYWNybyBkYnV0dGVyZmx5X24gb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgaW4xLCBpbjIsIGluMywgaW40LCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CisgICAgICAgIHZhZGQuczY0ICAgICAgICBcdG1wMSwgXGluMSwgXGluMworICAgICAgICB2YWRkLnM2NCAgICAgICAgXHRtcDIsIFxpbjIsIFxpbjQKKyAgICAgICAgdnN1Yi5zNjQgICAgICAgIFx0bXAzLCBcaW4xLCBcaW4zCisgICAgICAgIHZzdWIuczY0ICAgICAgICBcdG1wNCwgXGluMiwgXGluNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXG91dDEsIFx0bXAxLCAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBcb3V0MiwgXHRtcDIsICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxvdXQzLCBcdG1wMywgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXG91dDQsIFx0bXA0LCAgIzE0CisuZW5kbQorCisKKy5tYWNybyBpd2h0NF8xMCBjMCwgYzEsIGMyLCBjMywgY2QwLCBjZDEsIGNkMiwgY2QzLCBjZDQsIGNkNSwgY2Q2LCBjZDcKKyAgICAgICAgdmFkZC5pMzIgICAgICAgIFxjMCwgIFxjMCwgIFxjMQorICAgICAgICB2c3ViLmkzMiAgICAgICAgcTExLCAgXGMyLCAgXGMzCisgICAgICAgIHZzdWIuaTMyICAgICAgICBxMTAsICBcYzAsICBxMTEKKyAgICAgICAgdnNoci5zMzIgICAgICAgIHExMCwgIHExMCwgICMxCisgICAgICAgIHZzdWIuaTMyICAgICAgICBcYzIsICBxMTAsICBcYzEKKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIFxjMSwgIHExMCwgIFxjMworICAgICAgICB2YWRkLmkzMiAgICAgICAgXGMzLCAgcTExLCAgXGMyCisgICAgICAgIHZzdWIuaTMyICAgICAgICBcYzAsICBcYzAsICBcYzEKKy5lbmRtCisKKy5tYWNybyBpd2h0NF8xMiBjMCwgYzEsIGMyLCBjMywgY2QwLCBjZDEsIGNkMiwgY2QzLCBjZDQsIGNkNSwgY2Q2LCBjZDcKKyAgICAgICAgaXdodDRfMTAgICAgICAgIFxjMCwgXGMxLCBcYzIsIFxjMywgXGNkMCwgXGNkMSwgXGNkMiwgXGNkMywgXGNkNCwgXGNkNSwgXGNkNiwgXGNkNworLmVuZG0KKworQCBjMCA9PSBjZDAsY2QxLCBjMSA9PSBjZDIsY2QzCisubWFjcm8gaWRjdDRfMTAgYzAsIGMxLCBjMiwgYzMsIGNkMCwgY2QxLCBjZDIsIGNkMywgY2Q0LCBjZDUsIGNkNiwgY2Q3CisgICAgICAgIHZtdWwuczMyICAgICAgICBxMTMsICBcYzEsICBkMVsxXQorICAgICAgICB2bXVsLnMzMiAgICAgICAgcTExLCAgXGMxLCAgZDFbMF0KKyAgICAgICAgdmFkZC5pMzIgICAgICAgIHExNCwgIFxjMCwgIFxjMgorICAgICAgICB2c3ViLmkzMiAgICAgICAgcTE1LCAgXGMwLCAgXGMyCisgICAgICAgIHZtbGEuczMyICAgICAgICBxMTMsICBcYzMsICBkMVswXQorICAgICAgICB2bXVsLnMzMiAgICAgICAgcTEyLCAgcTE0LCAgZDBbMF0KKyAgICAgICAgdm11bC5zMzIgICAgICAgIHExMCwgIHExNSwgIGQwWzBdCisgICAgICAgIHZtbHMuczMyICAgICAgICBxMTEsICBcYzMsICBkMVsxXQorICAgICAgICB2cnNoci5zMzIgICAgICAgcTEzLCAgcTEzLCAgIzE0CisgICAgICAgIHZyc2hyLnMzMiAgICAgICBxMTIsICBxMTIsICAjMTQKKyAgICAgICAgdnJzaHIuczMyICAgICAgIHExMCwgIHExMCwgICMxNAorICAgICAgICB2cnNoci5zMzIgICAgICAgcTExLCAgcTExLCAgIzE0CisgICAgICAgIHZhZGQuaTMyICAgICAgICBcYzAsICBxMTIsICBxMTMKKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIFxjMywgIHExMiwgIHExMworICAgICAgICB2YWRkLmkzMiAgICAgICAgXGMxLCAgcTEwLCAgcTExCisgICAgICAgIHZzdWIuaTMyICAgICAgICBcYzIsICBxMTAsICBxMTEKKy5lbmRtCisKKy5tYWNybyBpZGN0NF8xMiBjMCwgYzEsIGMyLCBjMywgY2QwLCBjZDEsIGNkMiwgY2QzLCBjZDQsIGNkNSwgY2Q2LCBjZDcKKyAgICAgICAgdm11bGwuczMyICAgICAgIHExMywgIFxjZDIsIGQxWzFdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxMTUsICBcY2QzLCBkMVsxXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTExLCAgXGNkMiwgZDFbMF0KKyAgICAgICAgdm11bGwuczMyICAgICAgIHEzLCAgIFxjZDMsIGQxWzBdCisgICAgICAgIHZhZGQuaTMyICAgICAgICBxMTQsICBcYzAsICBcYzIKKyAgICAgICAgdnN1Yi5pMzIgICAgICAgIHEyLCAgIFxjMCwgIFxjMgorICAgICAgICB2bWxhbC5zMzIgICAgICAgcTEzLCAgXGNkNiwgZDFbMF0KKyAgICAgICAgdm1sYWwuczMyICAgICAgIHExNSwgIFxjZDcsIGQxWzBdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxMTIsICBkMjgsICBkMFswXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTE0LCAgZDI5LCAgZDBbMF0KKyAgICAgICAgdm11bGwuczMyICAgICAgIHExMCwgIGQ0LCAgIGQwWzBdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxOCwgICBkNSwgICBkMFswXQorICAgICAgICB2bWxzbC5zMzIgICAgICAgcTExLCAgXGNkNiwgZDFbMV0KKyAgICAgICAgdm1sc2wuczMyICAgICAgIHEzLCAgIFxjZDcsIGQxWzFdCisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMjYsICBxMTMsICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyNywgIHExNSwgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDI0LCAgcTEyLCAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMjUsICBxMTQsICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyMCwgIHExMCwgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDIxLCAgcTgsICAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMjIsICBxMTEsICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyMywgIHEzLCAgICMxNAorICAgICAgICB2YWRkLmkzMiAgICAgICAgXGMwLCAgcTEyLCAgcTEzCisgICAgICAgIHZzdWIuaTMyICAgICAgICBcYzMsICBxMTIsICBxMTMKKyAgICAgICAgdmFkZC5pMzIgICAgICAgIFxjMSwgIHExMCwgIHExMQorICAgICAgICB2c3ViLmkzMiAgICAgICAgXGMyLCAgcTEwLCAgcTExCisuZW5kbQorCisubWFjcm8gaWFkc3Q0XzEwIGMwLCBjMSwgYzIsIGMzLCBjZDAsIGNkMSwgY2QyLCBjZDMsIGNkNCwgY2Q1LCBjZDYsIGNkNworICAgICAgICB2bXVsLnMzMiAgICAgICAgcTEwLCAgXGMwLCAgZDJbMF0KKyAgICAgICAgdm1sYS5zMzIgICAgICAgIHExMCwgIFxjMiwgIGQyWzFdCisgICAgICAgIHZtbGEuczMyICAgICAgICBxMTAsICBcYzMsICBkM1swXQorICAgICAgICB2bXVsLnMzMiAgICAgICAgcTExLCAgXGMwLCAgZDNbMF0KKyAgICAgICAgdm1scy5zMzIgICAgICAgIHExMSwgIFxjMiwgIGQyWzBdCisgICAgICAgIHZzdWIuczMyICAgICAgICBcYzAsICBcYzAsICBcYzIKKyAgICAgICAgdm1scy5zMzIgICAgICAgIHExMSwgIFxjMywgIGQyWzFdCisgICAgICAgIHZhZGQuczMyICAgICAgICBcYzAsICBcYzAsICBcYzMKKyAgICAgICAgdm11bC5zMzIgICAgICAgIHExMywgIFxjMSwgIGQzWzFdCisgICAgICAgIHZtdWwuczMyICAgICAgICBxMTIsICBcYzAsICBkM1sxXQorICAgICAgICB2YWRkLnMzMiAgICAgICAgcTE0LCAgcTEwLCAgcTEzCisgICAgICAgIHZhZGQuczMyICAgICAgICBxMTUsICBxMTEsICBxMTMKKyAgICAgICAgdnJzaHIuczMyICAgICAgIFxjMCwgIHExNCwgICMxNAorICAgICAgICB2YWRkLnMzMiAgICAgICAgcTEwLCAgcTEwLCAgcTExCisgICAgICAgIHZyc2hyLnMzMiAgICAgICBcYzEsICBxMTUsICAjMTQKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIHExMCwgIHExMCwgIHExMworICAgICAgICB2cnNoci5zMzIgICAgICAgXGMyLCAgcTEyLCAgIzE0CisgICAgICAgIHZyc2hyLnMzMiAgICAgICBcYzMsICBxMTAsICAjMTQKKy5lbmRtCisKKy5tYWNybyBpYWRzdDRfMTIgYzAsIGMxLCBjMiwgYzMsIGNkMCwgY2QxLCBjZDIsIGNkMywgY2Q0LCBjZDUsIGNkNiwgY2Q3CisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxMTAsICBcY2QwLCBkMlswXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTQsICAgXGNkMSwgZDJbMF0KKyAgICAgICAgdm1sYWwuczMyICAgICAgIHExMCwgIFxjZDQsIGQyWzFdCisgICAgICAgIHZtbGFsLnMzMiAgICAgICBxNCwgICBcY2Q1LCBkMlsxXQorICAgICAgICB2bWxhbC5zMzIgICAgICAgcTEwLCAgXGNkNiwgZDNbMF0KKyAgICAgICAgdm1sYWwuczMyICAgICAgIHE0LCAgIFxjZDcsIGQzWzBdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxMTEsICBcY2QwLCBkM1swXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTUsICAgXGNkMSwgZDNbMF0KKyAgICAgICAgdm1sc2wuczMyICAgICAgIHExMSwgIFxjZDQsIGQyWzBdCisgICAgICAgIHZtbHNsLnMzMiAgICAgICBxNSwgICBcY2Q1LCBkMlswXQorICAgICAgICB2c3ViLnMzMiAgICAgICAgXGMwLCAgXGMwLCAgXGMyCisgICAgICAgIHZtbHNsLnMzMiAgICAgICBxMTEsICBcY2Q2LCBkMlsxXQorICAgICAgICB2bWxzbC5zMzIgICAgICAgcTUsICAgXGNkNywgZDJbMV0KKyAgICAgICAgdmFkZC5zMzIgICAgICAgIFxjMCwgIFxjMCwgIFxjMworICAgICAgICB2bXVsbC5zMzIgICAgICAgcTEzLCAgXGNkMiwgZDNbMV0KKyAgICAgICAgdm11bGwuczMyICAgICAgIHE2LCAgIFxjZDMsIGQzWzFdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxMTIsICBcY2QwLCBkM1sxXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTcsICAgXGNkMSwgZDNbMV0KKyAgICAgICAgdmFkZC5zNjQgICAgICAgIHExNCwgIHExMCwgIHExMworICAgICAgICB2YWRkLnM2NCAgICAgICAgcTIsICAgcTQsICAgcTYKKyAgICAgICAgdmFkZC5zNjQgICAgICAgIHExNSwgIHExMSwgIHExMworICAgICAgICB2YWRkLnM2NCAgICAgICAgcTMsICAgcTUsICAgcTYKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxjZDEsIHEyLCAgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXGNkMCwgcTE0LCAgIzE0CisgICAgICAgIHZhZGQuczY0ICAgICAgICBxMTAsICBxMTAsICBxMTEKKyAgICAgICAgdmFkZC5zNjQgICAgICAgIHE0LCAgIHE0LCAgIHE1CisgICAgICAgIHZyc2hybi5zNjQgICAgICBcY2QzLCBxMywgICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxjZDIsIHExNSwgICMxNAorICAgICAgICB2c3ViLnM2NCAgICAgICAgcTEwLCAgcTEwLCAgcTEzCisgICAgICAgIHZzdWIuczY0ICAgICAgICBxNCwgICBxNCwgICBxNgorICAgICAgICB2cnNocm4uczY0ICAgICAgXGNkNCwgcTEyLCAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBcY2Q1LCBxNywgICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIFxjZDYsIHExMCwgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgXGNkNywgcTQsICAgIzE0CisuZW5kbQorCitAIFRoZSBwdWJsaWMgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBoYXZlIGdvdCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKK0Agdm9pZCBpdHhmbV9hZGQodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jaywgaW50IGVvYik7CisKKy5tYWNybyBpdHhmbV9mdW5jNHg0IHR4Zm0xLCB0eGZtMiwgYnBwCitmdW5jdGlvbiBmZl92cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV80eDRfYWRkX1xicHBcKClfbmVvbiwgZXhwb3J0PTEKKy5pZmMgXHR4Zm0xLFx0eGZtMgorLmlmYyBcdHhmbTEsaWRjdAorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEyLCBpdHhmbTRfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjEyLDo2NF0KKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHEwLCAgZDAKKy5lbmRpZgorLmlmYyBcdHhmbTEsaWFkc3QKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWFkc3Q0X2NvZWZmcworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxfSwgW3IxMiw6NjRdCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisuZW5kaWYKKy5lbHNlCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGl0eGZtNF9jb2VmZnMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sIFtyMTIsOjEyOF0KKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHExLCAgZDEKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHEwLCAgZDAKKy5lbmRpZgorLmlmIFxicHAgPiAxMAorLmlmbmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgQCBpYWRzdDRfMTIgbmVlZHMgcTQtcTcKKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtxNC1xN30KKy5lbmRpZgorLmVuZGlmCisKKyAgICAgICAgdm1vdi5pMzIgICAgICAgIHExNCwgIzAKKyAgICAgICAgdm1vdi5pMzIgICAgICAgIHExNSwgIzAKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFmCisgICAgICAgIEAgREMtb25seSBmb3IgaWRjdC9pZGN0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbXX0sICAgW3IyLDozMl0KKyAgICAgICAgdm11bGwuczMyICAgICAgIHEyLCAgZDQsICBkMFswXQorICAgICAgICB2cnNocm4uczY0ICAgICAgZDQsICBxMiwgICMxNAorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTIsICBkNCwgIGQwWzBdCisgICAgICAgIHZyc2hybi5zNjQgICAgICBkNCwgIHEyLCAgIzE0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDMwWzBdfSwgW3IyLDozMl0KKyAgICAgICAgdmR1cC4zMiAgICAgICAgIHEyLCAgZDRbMF0KKyAgICAgICAgdm1vdiAgICAgICAgICAgIHEzLCAgcTIKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHE4LCAgcTIKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHE5LCAgcTIKKyAgICAgICAgYiAgICAgICAgICAgICAgIDJmCisuZW5kaWYKKworMToKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxMi1xM30sICAgW3IyLDoxMjhdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTE0LXExNX0sIFtyMiw6MTI4XSEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxOC1xOX0sICAgW3IyLDoxMjhdCisKKy5pZmMgXHR4Zm0xLGl3aHQKKyAgICAgICAgdnNoci5zMzIgICAgICAgIHEyLCAgcTIsICAjMgorICAgICAgICB2c2hyLnMzMiAgICAgICAgcTMsICBxMywgICMyCisgICAgICAgIHZzaHIuczMyICAgICAgICBxOCwgIHE4LCAgIzIKKyAgICAgICAgdnNoci5zMzIgICAgICAgIHE5LCAgcTksICAjMgorLmVuZGlmCisKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTQtcTE1fSwgW3IyLDoxMjhdIQorICAgICAgICBcdHhmbTFcKCk0X1xicHAgcTIsICBxMywgIHE4LCAgcTksICBkNCwgIGQ1LCAgZDYsICBkNywgIGQxNiwgZDE3LCBkMTgsIGQxOQorCisgICAgICAgIEAgVHJhbnNwb3NlIDR4NCB3aXRoIDMyIGJpdCBlbGVtZW50cworICAgICAgICB2dHJuLjMyICAgICAgICAgcTIsICBxMworICAgICAgICB2dHJuLjMyICAgICAgICAgcTgsICBxOQorICAgICAgICB2c3dwICAgICAgICAgICAgZDUsICBkMTYKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQ3LCAgZDE4CisKKyAgICAgICAgXHR4Zm0yXCgpNF9cYnBwIHEyLCAgcTMsICBxOCwgIHE5LCAgZDQsICBkNSwgIGQ2LCAgZDcsICBkMTYsIGQxNywgZDE4LCBkMTkKKzI6CisgICAgICAgIHZtdm4udTE2ICAgICAgICBxMTUsICMoKDB4ZmZmZiA8PCBcYnBwKSAmIDB4ZmZmZikKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMH0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMX0sICBbcjAsOjY0XSwgcjEKKy5pZm5jIFx0eGZtMSxpd2h0CisgICAgICAgIHZyc2hyLnMzMiAgICAgICBxMiwgIHEyLCAgIzQKKyAgICAgICAgdnJzaHIuczMyICAgICAgIHEzLCAgcTMsICAjNAorICAgICAgICB2cnNoci5zMzIgICAgICAgcTgsICBxOCwgICM0CisgICAgICAgIHZyc2hyLnMzMiAgICAgICBxOSwgIHE5LCAgIzQKKy5lbmRpZgorICAgICAgICB2YWRkdy51MTYgICAgICAgcTIsICBxMiwgIGQwCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMywgIHEzLCAgZDEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMn0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkM30sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQwLCAgcTIKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQxLCAgcTMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIHE4LCAgcTgsICBkMgorICAgICAgICB2bWluLnUxNiAgICAgICAgcTAsICBxMCwgIHExNQorICAgICAgICB2YWRkdy51MTYgICAgICAgcTksICBxOSwgIGQzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDB9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZxbW92dW4uczMyICAgICBkMiwgIHE4CisgICAgICAgIHZxbW92dW4uczMyICAgICBkMywgIHE5CisgICAgICAgIHZtaW4udTE2ICAgICAgICBxMSwgIHExLCAgcTE1CisKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMX0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMn0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkM30sICBbcjAsOjY0XSwgcjEKKworLmlmIFxicHAgPiAxMAorLmlmbmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKy5lbmRpZgorLmVuZGlmCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGl0eGZtX2Z1bmNzNHg0IGJwcAoraXR4Zm1fZnVuYzR4NCBpZGN0LCAgaWRjdCwgIFxicHAKK2l0eGZtX2Z1bmM0eDQgaWFkc3QsIGlkY3QsICBcYnBwCitpdHhmbV9mdW5jNHg0IGlkY3QsICBpYWRzdCwgXGJwcAoraXR4Zm1fZnVuYzR4NCBpYWRzdCwgaWFkc3QsIFxicHAKK2l0eGZtX2Z1bmM0eDQgaXdodCwgIGl3aHQsICBcYnBwCisuZW5kbQorCitpdHhmbV9mdW5jczR4NCAxMAoraXR4Zm1fZnVuY3M0eDQgMTIKKworLm1hY3JvIGlkY3Q4CisgICAgICAgIGRtYnV0dGVyZmx5MCAgICBkMTYsIGQxNywgZDI0LCBkMjUsIHE4LCAgcTEyLCBxMiwgcTQsIGQ0LCBkNSwgZDgsIGQ5LCBxMywgcTIsIHE1LCBxNCBAIHE4ID0gdDBhLCBxMTIgPSB0MWEKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIGQyMCwgZDIxLCBkMjgsIGQyOSwgZDFbMF0sIGQxWzFdLCBxMiwgIHEzLCAgcTQsICBxNSBAIHExMCA9IHQyYSwgcTE0ID0gdDNhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICBkMTgsIGQxOSwgZDMwLCBkMzEsIGQyWzBdLCBkMlsxXSwgcTIsICBxMywgIHE0LCAgcTUgQCBxOSAgPSB0NGEsIHExNSA9IHQ3YQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgZDI2LCBkMjcsIGQyMiwgZDIzLCBkM1swXSwgZDNbMV0sIHEyLCAgcTMsICBxNCwgIHE1IEAgcTEzID0gdDVhLCBxMTEgPSB0NmEKKworICAgICAgICBidXR0ZXJmbHkgICAgICAgcTIsICBxMTQsIHE4LCAgcTE0IEAgcTIgPSB0MCwgcTE0ID0gdDMKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIHEzLCAgcTEwLCBxMTIsIHExMCBAIHEzID0gdDEsIHExMCA9IHQyCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxNCwgIHExMywgcTksICBxMTMgQCBxNCA9IHQ0LCBxMTMgPSB0NWEKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIHE1LCAgcTExLCBxMTUsIHExMSBAIHE1ID0gdDcsIHExMSA9IHQ2YQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxOCwgIHExNSwgcTIsICBxNSAgQCBxOCA9IG91dFswXSwgcTE1ID0gb3V0WzddCisKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIGQ0LCAgZDUsICBkMTAsIGQxMSwgcTExLCBxMTMsIHE5LCAgcTEzLCBkMTgsIGQxOSwgZDI2LCBkMjcsIHEyLCAgcTUsIHExMSwgcTEyIEAgcTIgPSB0NiwgcTUgPSB0NQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxMTEsIHExMiwgcTE0LCBxNCAgQCBxMTEgPSBvdXRbM10sIHExMiA9IG91dFs0XQorICAgICAgICBidXR0ZXJmbHkgICAgICAgcTksICBxMTQsIHEzLCAgcTIgIEAgcTkgPSBvdXRbMV0sICBxMTQgPSBvdXRbNl0KKyAgICAgICAgYnV0dGVyZmx5X3IgICAgIHExMywgcTEwLCBxMTAsIHE1ICBAIHExMyA9IG91dFs1XSwgcTEwID0gb3V0WzJdCisuZW5kbQorCisubWFjcm8gaWFkc3Q4CisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlhZHN0OF9jb2VmZnMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMX0sIFtyMTIsOjEyOF0hCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQyCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQzCisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHE0LCAgcTUsICBxMiwgIHEzLCAgZDMwLCBkMzEsIGQxNiwgZDE3LCBkMFsxXSwgZDBbMF0gQCBxNCxxNSAgPSB0MWEsIHEyLHEzID0gdDBhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBxOCwgIHExNSwgcTYsICBxNywgIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDJbMV0sIGQyWzBdIEAgcTgscTE1ID0gdDVhLCBxNixxNyA9IHQ0YQorCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICBkMjIsIGQyMywgZDQsICBkNSwgIHEyLCAgcTMsICBxNiwgIHE3LCAgcTExLCBxMTIsIHEyLCAgcTMgQCBxMTEgPSB0MCwgcTIgPSB0NAorCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICBkMjQsIGQyNSwgZDYsICBkNywgIHE0LCAgcTUsICBxOCwgIHExNSwgcTEyLCBxMywgIHE2LCAgcTcgQCBxMTIgPSB0MSwgcTMgPSB0NQorCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBxNiwgIHE3LCAgcTQsICBxNSwgIGQyNiwgZDI3LCBkMjAsIGQyMSwgZDFbMV0sIGQxWzBdIEAgcTYscTcgPSB0M2EsIHE0LHE1ID0gdDJhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBxMTAsIHExMywgcTgsICBxMTUsIGQxOCwgZDE5LCBkMjgsIGQyOSwgZDNbMV0sIGQzWzBdIEAgcTEwLHExMyA9IHQ3YSwgcTgscTE1ID0gdDZhCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIGQxOCwgZDE5LCBkOCwgIGQ5LCAgcTQsICBxNSwgIHE4LCAgcTE1LCBxOSwgIHExNCwgcTQsIHE1IEAgcTkgPSB0MiwgcTQgPSB0NgorICAgICAgICBkYnV0dGVyZmx5X24gICAgZDE2LCBkMTcsIGQxMiwgZDEzLCBxNiwgIHE3LCAgcTEwLCBxMTMsIHE4LCAgcTE1LCBxNiwgcTcgQCBxOCA9IHQzLCBxNiA9IHQ3CisKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWRjdF9jb2VmZnMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sIFtyMTIsOjEyOF0KKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHExLCAgZDEKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHEwLCAgZDAKKworICAgICAgICBidXR0ZXJmbHkgICAgICAgcTE1LCBxMTIsIHExMiwgcTggQCBxMTUgPSAtb3V0WzddLCBxMTIgPSB0MworICAgICAgICB2bmVnLnMzMiAgICAgICAgcTE1LCBxMTUgICAgICAgICAgQCBxMTUgPSBvdXRbN10KKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIHE4LCAgcTksICBxMTEsIHE5IEAgcTggPSBvdXRbMF0sIHE5ID0gdDIKKworICAgICAgICBkbWJ1dHRlcmZseV9sICAgcTEwLCBxMTEsIHE1LCAgcTcsICBkNCwgIGQ1LCAgZDYsICBkNywgIGQxWzBdLCBkMVsxXSBAIHExMCxxMTEgPSB0NWEsIHE1LHE3ID0gdDRhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBxMiwgIHEzLCAgcTEzLCBxMTQsIGQxMiwgZDEzLCBkOCwgIGQ5LCAgZDFbMV0sIGQxWzBdIEAgcTIscTMgPSB0NmEsIHExMyxxMTQgPSB0N2EKKworICAgICAgICBkYnV0dGVyZmx5X24gICAgZDI4LCBkMjksIGQ4LCAgZDksICBxMTAsIHExMSwgcTEzLCBxMTQsIHE0LCAgcTYsICBxMTAsIHExMSBAIHExNCA9IG91dFs2XSwgcTQgPSB0NworCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICBkMjIsIGQyMywgZDI0LCBkMjUsIHE5LCAgcTEyLCBxNiwgcTEzLCBkMTIsIGQxMywgZDI2LCBkMjcsIHE5LCBxMTAgQCBxMTEgPSAtb3V0WzNdLCBxMTIgPSBvdXRbNF0KKyAgICAgICAgdm5lZy5zMzIgICAgICAgIHExMSwgcTExICAgICAgQCBxMTEgPSBvdXRbM10KKworICAgICAgICBkYnV0dGVyZmx5X24gICAgZDE4LCBkMTksIGQ0LCAgZDUsICBxNSwgIHE3LCAgcTIsICBxMywgIHE5LCBxMTAsIHEyLCAgcTMgQCBxOSA9IC1vdXRbMV0sIHEyID0gdDYKKyAgICAgICAgdm5lZy5zMzIgICAgICAgIHE5LCAgcTkgICAgICAgQCBxOSA9IG91dFsxXQorCisgICAgICAgIGRtYnV0dGVyZmx5MCAgICBkMjAsIGQyMSwgZDI2LCBkMjcsIHEyLCAgcTQsICBxMywgcTUsICBkNiwgIGQ3LCAgZDEwLCBkMTEsIHE2LCAgcTcgQCBxMTAgPSBvdXRbMl0sIHExMyA9IC1vdXRbNV0KKyAgICAgICAgdm5lZy5zMzIgICAgICAgIHExMywgcTEzICAgICAgQCBxMTMgPSBvdXRbNV0KKy5lbmRtCisKK2Z1bmN0aW9uIGlkY3Q4eDhfZGNfYWRkX25lb24KKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWRjdF9jb2VmZnMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMH0sIFtyMTIsOjY0XQorCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMiwgICMwCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTZbXX0sIFtyMiw6MzJdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxOCwgIGQxNiwgZDBbMF0KKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQxNiwgcTgsICAjMTQKKyAgICAgICAgdm11bGwuczMyICAgICAgIHE4LCAgZDE2LCBkMFswXQorICAgICAgICB2cnNocm4uczY0ICAgICAgZDE2LCBxOCwgICMxNAorICAgICAgICB2ZHVwLjMyICAgICAgICAgcTgsICBkMTZbMF0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sIFtyMiw6MzJdCisKKyAgICAgICAgdnJzaHIuczMyICAgICAgIHE4LCAgcTgsICAjNQorICAgICAgICB2ZHVwLnMxNiAgICAgICAgcTE1LCByOAorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICM4CisxOgorICAgICAgICBAIExvb3AgdG8gYWRkIHRoZSBjb25zdGFudCBmcm9tIHE4IGludG8gYWxsIDh4OCBvdXRwdXRzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMn0sICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMTAsIHE4LCAgZDQKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxM30sICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMTEsIHE4LCAgZDUKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIHExMiwgcTgsICBkNgorICAgICAgICB2YWRkdy51MTYgICAgICAgcTEzLCBxOCwgIGQ3CisgICAgICAgIHZxbW92dW4uczMyICAgICBkNCwgIHExMAorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDUsICBxMTEKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQ2LCAgcTEyCisgICAgICAgIHZxbW92dW4uczMyICAgICBkNywgIHExMworICAgICAgICB2bWluLnUxNiAgICAgICAgcTIsICBxMiwgIHExNQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyfSwgIFtyMyw6MTI4XSwgcjEKKyAgICAgICAgdm1pbi51MTYgICAgICAgIHEzLCAgcTMsICBxMTUKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxM30sICBbcjMsOjEyOF0sIHIxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjgscGN9CitlbmRmdW5jCisubHRvcmcKKworLm1hY3JvIGl0eGZtOF8xZF9mdW5jcyB0eGZtCitAIFJlYWQgYSB2ZXJ0aWNhbCA0eDggc2xpY2Ugb3V0IG9mIGEgOHg4IG1hdHJpeCwgZG8gYSB0cmFuc2Zvcm0gb24gaXQsCitAIHRyYW5zcG9zZSBpbnRvIGEgaG9yaXpvbnRhbCA4eDQgc2xpY2UgYW5kIHN0b3JlLgorQCByMCA9IGRzdCAodGVtcCBidWZmZXIpCitAIHIxID0gc2xpY2Ugb2Zmc2V0CitAIHIyID0gc3JjCitmdW5jdGlvbiBcdHhmbVwoKThfMWRfNHg4X3Bhc3MxX25lb24KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzMyCisgICAgICAgIHZtb3YuczMyICAgICAgICBxMiwgICMwCisuaXJwIGksIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtxXGl9LCBbcjIsOjEyOF0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMn0sICBbcjIsOjEyOF0sIHIxMgorLmVuZHIKKworICAgICAgICBcdHhmbVwoKTgKKworICAgICAgICBAIERvIHR3byA0eDQgdHJhbnNwb3Nlcy4gT3JpZ2luYWxseSwgcTgtcTE1IGNvbnRhaW4gdGhlCisgICAgICAgIEAgOCByb3dzLiBBZnRlcndhcmRzLCBxOC1xMTEsIHExMi1xMTUgY29udGFpbiB0aGUgdHJhbnNwb3NlZAorICAgICAgICBAIDR4NCBibG9ja3MuCisgICAgICAgIHRyYW5zcG9zZTMyX3FfMnhfNHg0IHE4LCAgcTksICBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1LCBkMTYsIGQxNywgZDE4LCBkMTksIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEKKworICAgICAgICBAIFN0b3JlIHRoZSB0cmFuc3Bvc2VkIDR4NCBibG9ja3MgaG9yaXpvbnRhbGx5LgorICAgICAgICBjbXAgICAgICAgICAgICAgcjEsICAjNAorICAgICAgICBiZXEgICAgICAgICAgICAgMWYKKy5pcnAgaSwgOCwgMTIsIDksIDEzLCAxMCwgMTQsIDExLCAxNQorICAgICAgICB2c3QxLjMyICAgICAgICAge3FcaX0sIFtyMCw6MTI4XSEKKy5lbmRyCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorMToKKyAgICAgICAgQCBTcGVjaWFsIGNhc2U6IEZvciB0aGUgbGFzdCBpbnB1dCBjb2x1bW4gKHIxID09IDQpLAorICAgICAgICBAIHdoaWNoIHdvdWxkIGJlIHN0b3JlZCBhcyB0aGUgbGFzdCByb3cgaW4gdGhlIHRlbXAgYnVmZmVyLAorICAgICAgICBAIGRvbid0IHN0b3JlIHRoZSBmaXJzdCA0eDQgYmxvY2ssIGJ1dCBrZWVwIGl0IGluIHJlZ2lzdGVycworICAgICAgICBAIGZvciB0aGUgZmlyc3Qgc2xpY2Ugb2YgdGhlIHNlY29uZCBwYXNzICh3aGVyZSBpdCBpcyB0aGUKKyAgICAgICAgQCBsYXN0IDR4NCBibG9jaykuCisuaXJwIGksIDEyLCAxMywgMTQsIDE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzE2CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cVxpfSwgW3IwLDoxMjhdIQorLmVuZHIKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExMiwgcTgKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExMywgcTkKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExNCwgcTEwCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMTUsIHExMQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworQCBSZWFkIGEgdmVydGljYWwgNHg4IHNsaWNlIG91dCBvZiBhIDh4OCBtYXRyaXgsIGRvIGEgdHJhbnNmb3JtIG9uIGl0LAorQCBsb2FkIHRoZSBkZXN0aW5hdGlvbiBwaXhlbHMgKGZyb20gYSBzaW1pbGFyIDR4OCBzbGljZSksIGFkZCBhbmQgc3RvcmUgYmFjay4KK0AgcjAgPSBkc3QKK0AgcjEgPSBkc3Qgc3RyaWRlCitAIHIyID0gc3JjICh0ZW1wIGJ1ZmZlcikKK0AgcjMgPSBzbGljZSBvZmZzZXQKK2Z1bmN0aW9uIFx0eGZtXCgpOF8xZF80eDhfcGFzczJfbmVvbgorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMzIKKy5pcnAgaSwgOCwgOSwgMTAsIDExCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7cVxpfSwgW3IyLDoxMjhdLCByMTIKKy5lbmRyCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMwCisgICAgICAgIGJlcSAgICAgICAgICAgICAxZgorLmlycCBpLCAxMiwgMTMsIDE0LCAxNQorICAgICAgICB2bGQxLjMyICAgICAgICAge3FcaX0sIFtyMiw6MTI4XSwgcjEyCisuZW5kcgorMToKKworICAgICAgICBhZGQgICAgICAgICAgICAgcjMsICByMCwgIHIxCisgICAgICAgIGxzbCAgICAgICAgICAgICByMSwgIHIxLCAgIzEKKyAgICAgICAgXHR4Zm1cKCk4CisKKyAgICAgICAgdmR1cC5zMTYgICAgICAgIHE0LCAgcjgKKy5tYWNybyBsb2FkX2FkZF9zdG9yZSBjb2VmMCwgY29lZjEsIGNvZWYyLCBjb2VmMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q0fSwgICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkNX0sICAgW3IzLDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDZ9LCAgIFtyMCw6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q3fSwgICBbcjMsOjY0XSwgcjEKKworICAgICAgICB2cnNoci5zMzIgICAgICAgXGNvZWYwLCBcY29lZjAsICM1CisgICAgICAgIHZyc2hyLnMzMiAgICAgICBcY29lZjEsIFxjb2VmMSwgIzUKKyAgICAgICAgdnJzaHIuczMyICAgICAgIFxjb2VmMiwgXGNvZWYyLCAjNQorICAgICAgICB2cnNoci5zMzIgICAgICAgXGNvZWYzLCBcY29lZjMsICM1CisKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIFxjb2VmMCwgXGNvZWYwLCBkNAorICAgICAgICB2YWRkdy51MTYgICAgICAgXGNvZWYxLCBcY29lZjEsIGQ1CisgICAgICAgIHZhZGR3LnUxNiAgICAgICBcY29lZjIsIFxjb2VmMiwgZDYKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIFxjb2VmMywgXGNvZWYzLCBkNworCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgIHIxLCBsc2wgIzEKKworICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDQsICBcY29lZjAKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQ1LCAgXGNvZWYxCisgICAgICAgIHZxbW92dW4uczMyICAgICBkNiwgIFxjb2VmMgorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDcsICBcY29lZjMKKworICAgICAgICB2bWluLnUxNiAgICAgICAgcTIsICBxMiwgIHE0CisgICAgICAgIHZtaW4udTE2ICAgICAgICBxMywgIHEzLCAgcTQKKworICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q0fSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q1fSwgIFtyMyw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q2fSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q3fSwgIFtyMyw6NjRdLCByMQorLmVuZG0KKyAgICAgICAgbG9hZF9hZGRfc3RvcmUgIHE4LCAgcTksICBxMTAsIHExMQorICAgICAgICBsb2FkX2FkZF9zdG9yZSAgcTEyLCBxMTMsIHExNCwgcTE1CisucHVyZ2VtIGxvYWRfYWRkX3N0b3JlCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCitpdHhmbThfMWRfZnVuY3MgaWRjdAoraXR4Zm04XzFkX2Z1bmNzIGlhZHN0CisKKy5tYWNybyBpdHhmbV9mdW5jOHg4IHR4Zm0xLCB0eGZtMgorZnVuY3Rpb24gdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfOHg4X2FkZF8xNl9uZW9uCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMxCisgICAgICAgIGJlcSAgICAgICAgICAgICBpZGN0OHg4X2RjX2FkZF9uZW9uCisuZW5kaWYKKy5pZm5jIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisuZWxzZQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE1fQorLmVuZGlmCisKKyAgICAgICAgQCBBbGlnbiB0aGUgc3RhY2ssIGFsbG9jYXRlIGEgdGVtcCBidWZmZXIKK1QgICAgICAgbW92ICAgICAgICAgICAgIHI3LCAgc3AKK1QgICAgICAgYW5kICAgICAgICAgICAgIHI3LCAgcjcsICAjMTUKK0EgICAgICAgYW5kICAgICAgICAgICAgIHI3LCAgc3AsICAjMTUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjcsICAjMjU2CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICByMgorCisuaWZjIFx0eGZtMSxpZGN0CisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCBbcjEyLDoxMjhdCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisuZW5kaWYKKworLmlycCBpLCAwLCA0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHNwLCAgIyhcaSozMikKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKy5pZiBcaSA9PSA0CisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMxMgorICAgICAgICBibGUgICAgICAgICAgICAgMWYKKy5lbmRpZgorLmVuZGlmCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgICNcaQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByNiwgICMoXGkqNCkKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eGZtMVwoKThfMWRfNHg4X3Bhc3MxX25lb24KKy5lbmRyCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGIgICAgICAgICAgICAgICAzZgorMToKKyAgICAgICAgQCBGb3IgYWxsLXplcm8gc2xpY2VzIGluIHBhc3MgMSwgc2V0IHExMi1xMTUgdG8gemVybywgZm9yIHRoZSBpbi1yZWdpc3RlcgorICAgICAgICBAIHBhc3N0aHJvdWdoIG9mIGNvZWZmaWNpZW50cyB0byBwYXNzIDIgYW5kIGNsZWFyIHRoZSBlbmQgb2YgdGhlIHRlbXAgYnVmZmVyCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTIsICMwCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTMsICMwCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTQsICMwCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTUsICMwCisucmVwdCA0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTEyLXExM30sIFtyMCw6MTI4XSEKKy5lbmRyCiszOgorLmVuZGlmCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWFkc3RfaWRjdAorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEyLCBpZGN0X2NvZWZmcworICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgW3IxMiw6MTI4XQorICAgICAgICB2bW92bC5zMTYgICAgICAgcTEsICBkMQorICAgICAgICB2bW92bC5zMTYgICAgICAgcTAsICBkMAorLmVuZGlmCisuaXJwIGksIDAsIDQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjQsICAjKFxpKjIpCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgIHI1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHNwLCAgIyhcaSo0KQorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICAjXGkKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eGZtMlwoKThfMWRfNHg4X3Bhc3MyX25lb24KKy5lbmRyCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICByNworLmlmbmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKy5lbHNlCisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTV9CisuZW5kaWYKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfOHg4X2FkZF8xMF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI4LGxyfQorICAgICAgICBtb3Z3ICAgICAgICAgICAgcjgsICAjMHgwM2ZmCisgICAgICAgIGIgICAgICAgICAgICAgICB2cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV84eDhfYWRkXzE2X25lb24KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfOHg4X2FkZF8xMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI4LGxyfQorICAgICAgICBtb3Z3ICAgICAgICAgICAgcjgsICAjMHgwZmZmCisgICAgICAgIGIgICAgICAgICAgICAgICB2cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV84eDhfYWRkXzE2X25lb24KK2VuZGZ1bmMKKy5lbmRtCisKK2l0eGZtX2Z1bmM4eDggaWRjdCwgIGlkY3QKK2l0eGZtX2Z1bmM4eDggaWFkc3QsIGlkY3QKK2l0eGZtX2Z1bmM4eDggaWRjdCwgIGlhZHN0CitpdHhmbV9mdW5jOHg4IGlhZHN0LCBpYWRzdAorCitmdW5jdGlvbiBpZGN0MTZ4MTZfZGNfYWRkX25lb24KKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWRjdF9jb2VmZnMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMH0sIFtyMTIsOjY0XQorCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMiwgICMwCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTZbXX0sIFtyMiw6MzJdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxOCwgIGQxNiwgZDBbMF0KKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQxNiwgcTgsICAjMTQKKyAgICAgICAgdm11bGwuczMyICAgICAgIHE4LCAgZDE2LCBkMFswXQorICAgICAgICB2cnNocm4uczY0ICAgICAgZDE2LCBxOCwgICMxNAorICAgICAgICB2ZHVwLjMyICAgICAgICAgcTgsICBkMTZbMF0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sIFtyMiw6MzJdCisKKyAgICAgICAgdnJzaHIuczMyICAgICAgIHE4LCAgcTgsICAjNgorICAgICAgICB2ZHVwLnMxNiAgICAgICAgcTE1LCByOQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgIHIwCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxNgorMToKKyAgICAgICAgQCBMb29wIHRvIGFkZCB0aGUgY29uc3RhbnQgZnJvbSBxOCBpbnRvIGFsbCAxNngxNiBvdXRwdXRzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMC1xMX0sICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxOSwgIHE4LCAgZDAKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIHExMCwgcTgsICBkMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EyLXEzfSwgIFtyMCw6MTI4XSwgcjEKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIHExMSwgcTgsICBkMgorICAgICAgICB2YWRkdy51MTYgICAgICAgcTEyLCBxOCwgIGQzCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMTMsIHE4LCAgZDQKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIHExNCwgcTgsICBkNQorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDAsICBxOQorICAgICAgICB2YWRkdy51MTYgICAgICAgcTksICBxOCwgIGQ2CisgICAgICAgIHZxbW92dW4uczMyICAgICBkMSwgIHExMAorICAgICAgICB2YWRkdy51MTYgICAgICAgcTEwLCBxOCwgIGQ3CisgICAgICAgIHZxbW92dW4uczMyICAgICBkMiwgIHExMQorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDMsICBxMTIKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQ0LCAgcTEzCisgICAgICAgIHZxbW92dW4uczMyICAgICBkNSwgIHExNAorICAgICAgICB2bWluLnUxNiAgICAgICAgcTAsICBxMCwgIHExNQorICAgICAgICB2bWluLnUxNiAgICAgICAgcTEsICBxMSwgIHExNQorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDYsICBxOQorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDcsICBxMTAKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMC1xMX0sICBbcjMsOjEyOF0sIHIxCisgICAgICAgIHZtaW4udTE2ICAgICAgICBxMiwgIHEyLCAgcTE1CisgICAgICAgIHZtaW4udTE2ICAgICAgICBxMywgIHEzLCAgcTE1CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTItcTN9LCAgW3IzLDoxMjhdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI5LHBjfQorZW5kZnVuYworLmx0b3JnCisKKy5tYWNybyBpZGN0MTZfZW5kCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTgsIGQxMSwgZDgsICBkMTEgICAgICAgICAgICAgICBAIGQxOCA9IHQwYSwgIGQxMSA9IHQ3YQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE5LCBkMjIsIGQ5LCAgZDIyICAgICAgICAgICAgICAgQCBkMTkgPSB0MWEsICBkMjIgPSB0NgorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDgsICBkMjYsIGQyMCwgZDI2ICAgICAgICAgICAgICAgQCBkOCAgPSB0MmEsICBkMjYgPSB0NQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDksICBkMTAsIGQyOCwgZDEwICAgICAgICAgICAgICAgQCBkOSAgPSB0M2EsICBkMTAgPSB0NAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDIwLCBkMjgsIGQxNiwgZDI0ICAgICAgICAgICAgICAgQCBkMjAgPSB0OGEsICBkMjggPSB0MTFhCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjQsIGQyMSwgZDIzLCBkMjEgICAgICAgICAgICAgICBAIGQyNCA9IHQ5LCAgIGQyMSA9IHQxMAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDIzLCBkMjcsIGQyNSwgZDI3ICAgICAgICAgICAgICAgQCBkMjMgPSB0MTQsICBkMjcgPSB0MTMKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyNSwgZDI5LCBkMjksIGQxNyAgICAgICAgICAgICAgIEAgZDI1ID0gdDE1YSwgZDI5ID0gdDEyYQorCisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjcsIGQyMSwgZDI3LCBkMjEsIGQxNiwgZDMwLCBxOCwgcTE1IEAgZDI3ID0gdDEzYSwgZDIxID0gdDEwYQorICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDI5LCBkMjgsIGQyOSwgZDI4LCBkMTYsIGQzMCwgcTgsIHExNSBAIGQyOSA9IHQxMiwgIGQyOCA9IHQxMQorCisgICAgICAgIHZzd3AgICAgICAgICAgICBkMjcsIGQyOSAgICAgICAgICAgICAgICAgICAgICAgICBAIGQyNyA9IHQxMiwgZDI5ID0gdDEzYQorICAgICAgICB2c3dwICAgICAgICAgICAgZDI4LCBkMjcgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMjggPSB0MTIsIGQyNyA9IHQxMQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE2LCBkMzEsIGQxOCwgZDI1ICAgICAgICAgICAgICAgQCBkMTYgPSBvdXRbMF0sIGQzMSA9IG91dFsxNV0KKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxNywgZDMwLCBkMTksIGQyMyAgICAgICAgICAgICAgIEAgZDE3ID0gb3V0WzFdLCBkMzAgPSBvdXRbMTRdCisgICAgICAgIGJ1dHRlcmZseV9yICAgICBkMjUsIGQyMiwgZDIyLCBkMjQgICAgICAgICAgICAgICBAIGQyNSA9IG91dFs5XSwgZDIyID0gb3V0WzZdCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjMsIGQyNCwgZDExLCBkMjAgICAgICAgICAgICAgICBAIGQyMyA9IG91dFs3XSwgZDI0ID0gb3V0WzhdCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTgsIGQyOSwgZDgsICBkMjkgICAgICAgICAgICAgICBAIGQxOCA9IG91dFsyXSwgZDI5ID0gb3V0WzEzXQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE5LCBkMjgsIGQ5LCAgZDI4ICAgICAgICAgICAgICAgQCBkMTkgPSBvdXRbM10sIGQyOCA9IG91dFsxMl0KKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQ4LCAgZDIxICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDggID0gdDEwYQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDIwLCBkMjcsIGQxMCwgZDI3ICAgICAgICAgICAgICAgQCBkMjAgPSBvdXRbNF0sIGQyNyA9IG91dFsxMV0KKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyMSwgZDI2LCBkMjYsIGQ4ICAgICAgICAgICAgICAgIEAgZDIxID0gb3V0WzVdLCBkMjYgPSBvdXRbMTBdCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorLmVuZG0KKworZnVuY3Rpb24gaWRjdDE2CisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMTYsIGQyNCwgZDE2LCBkMjQsIGQ4LCBkMTAsIHE0LCAgcTUgQCBkMTYgPSB0MGEsICBkMjQgPSB0MWEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyMCwgZDI4LCBkMVswXSwgZDFbMV0sIHE0LCAgcTUgIEAgZDIwID0gdDJhLCAgZDI4ID0gdDNhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMTgsIGQzMCwgZDJbMF0sIGQyWzFdLCBxNCwgIHE1ICBAIGQxOCA9IHQ0YSwgIGQzMCA9IHQ3YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI2LCBkMjIsIGQzWzBdLCBkM1sxXSwgcTQsICBxNSAgQCBkMjYgPSB0NWEsICBkMjIgPSB0NmEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQxNywgZDMxLCBkNFswXSwgZDRbMV0sIHE0LCAgcTUgIEAgZDE3ID0gdDhhLCAgZDMxID0gdDE1YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI1LCBkMjMsIGQ1WzBdLCBkNVsxXSwgcTQsICBxNSAgQCBkMjUgPSB0OWEsICBkMjMgPSB0MTRhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjEsIGQyNywgZDZbMF0sIGQ2WzFdLCBxNCwgIHE1ICBAIGQyMSA9IHQxMGEsIGQyNyA9IHQxM2EKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyOSwgZDE5LCBkN1swXSwgZDdbMV0sIHE0LCAgcTUgIEAgZDI5ID0gdDExYSwgZDE5ID0gdDEyYQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkOCwgIGQyOCwgZDE2LCBkMjggICAgICAgICAgICAgICBAIGQ4ICA9IHQwLCAgIGQyOCA9IHQzCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkOSwgIGQyMCwgZDI0LCBkMjAgICAgICAgICAgICAgICBAIGQ5ICA9IHQxLCAgIGQyMCA9IHQyCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTAsIGQyNiwgZDE4LCBkMjYgICAgICAgICAgICAgICBAIGQxMCA9IHQ0LCAgIGQyNiA9IHQ1CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTEsIGQyMiwgZDMwLCBkMjIgICAgICAgICAgICAgICBAIGQxMSA9IHQ3LCAgIGQyMiA9IHQ2CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTYsIGQyNSwgZDE3LCBkMjUgICAgICAgICAgICAgICBAIGQxNiA9IHQ4LCAgIGQyNSA9IHQ5CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjQsIGQyMSwgZDI5LCBkMjEgICAgICAgICAgICAgICBAIGQyNCA9IHQxMSwgIGQyMSA9IHQxMAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE3LCBkMjcsIGQxOSwgZDI3ICAgICAgICAgICAgICAgQCBkMTcgPSB0MTIsICBkMjcgPSB0MTMKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyOSwgZDIzLCBkMzEsIGQyMyAgICAgICAgICAgICAgIEAgZDI5ID0gdDE1LCAgZDIzID0gdDE0CisKKyAgICAgICAgbWJ1dHRlcmZseTAgICAgIGQyMiwgZDI2LCBkMjIsIGQyNiwgZDE4LCBkMzAsIHE5LCAgcTE1ICBAIGQyMiA9IHQ2YSwgZDI2ID0gdDVhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjMsIGQyNSwgZDFbMF0sIGQxWzFdLCBxOSwgIHExNSAgICAgICAgQCBkMjMgPSB0OWEsICBkMjUgPSB0MTRhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjcsIGQyMSwgZDFbMF0sIGQxWzFdLCBxOSwgIHExNSwgbmVnPTEgQCBkMjcgPSB0MTNhLCBkMjEgPSB0MTBhCisgICAgICAgIGlkY3QxNl9lbmQKK2VuZGZ1bmMKKworZnVuY3Rpb24gaWRjdDE2X2hhbGYKKyAgICAgICAgbWJ1dHRlcmZseTBfaCAgIGQxNiwgZDI0LCBkMTYsIGQyNCwgZDgsIGQxMCwgcTQsICBxNSBAIGQxNiA9IHQwYSwgIGQyNCA9IHQxYQorICAgICAgICBtYnV0dGVyZmx5X2gxICAgZDIwLCBkMjgsIGQxWzBdLCBkMVsxXSwgcTQsICBxNSAgQCBkMjAgPSB0MmEsICBkMjggPSB0M2EKKyAgICAgICAgbWJ1dHRlcmZseV9oMSAgIGQxOCwgZDMwLCBkMlswXSwgZDJbMV0sIHE0LCAgcTUgIEAgZDE4ID0gdDRhLCAgZDMwID0gdDdhCisgICAgICAgIG1idXR0ZXJmbHlfaDIgICBkMjYsIGQyMiwgZDNbMF0sIGQzWzFdLCBxNCwgIHE1ICBAIGQyNiA9IHQ1YSwgIGQyMiA9IHQ2YQorICAgICAgICBtYnV0dGVyZmx5X2gxICAgZDE3LCBkMzEsIGQ0WzBdLCBkNFsxXSwgcTQsICBxNSAgQCBkMTcgPSB0OGEsICBkMzEgPSB0MTVhCisgICAgICAgIG1idXR0ZXJmbHlfaDIgICBkMjUsIGQyMywgZDVbMF0sIGQ1WzFdLCBxNCwgIHE1ICBAIGQyNSA9IHQ5YSwgIGQyMyA9IHQxNGEKKyAgICAgICAgbWJ1dHRlcmZseV9oMSAgIGQyMSwgZDI3LCBkNlswXSwgZDZbMV0sIHE0LCAgcTUgIEAgZDIxID0gdDEwYSwgZDI3ID0gdDEzYQorICAgICAgICBtYnV0dGVyZmx5X2gyICAgZDI5LCBkMTksIGQ3WzBdLCBkN1sxXSwgcTQsICBxNSAgQCBkMjkgPSB0MTFhLCBkMTkgPSB0MTJhCisKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQ4LCAgZDI4LCBkMTYsIGQyOCAgICAgICAgICAgICAgIEAgZDggID0gdDAsICAgZDI4ID0gdDMKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQ5LCAgZDIwLCBkMjQsIGQyMCAgICAgICAgICAgICAgIEAgZDkgID0gdDEsICAgZDIwID0gdDIKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxMCwgZDI2LCBkMTgsIGQyNiAgICAgICAgICAgICAgIEAgZDEwID0gdDQsICAgZDI2ID0gdDUKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxMSwgZDIyLCBkMzAsIGQyMiAgICAgICAgICAgICAgIEAgZDExID0gdDcsICAgZDIyID0gdDYKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxNiwgZDI1LCBkMTcsIGQyNSAgICAgICAgICAgICAgIEAgZDE2ID0gdDgsICAgZDI1ID0gdDkKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyNCwgZDIxLCBkMjksIGQyMSAgICAgICAgICAgICAgIEAgZDI0ID0gdDExLCAgZDIxID0gdDEwCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTcsIGQyNywgZDE5LCBkMjcgICAgICAgICAgICAgICBAIGQxNyA9IHQxMiwgIGQyNyA9IHQxMworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDI5LCBkMjMsIGQzMSwgZDIzICAgICAgICAgICAgICAgQCBkMjkgPSB0MTUsICBkMjMgPSB0MTQKKworICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDIyLCBkMjYsIGQyMiwgZDI2LCBkMTgsIGQzMCwgcTksICBxMTUgIEAgZDIyID0gdDZhLCBkMjYgPSB0NWEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyMywgZDI1LCBkMVswXSwgZDFbMV0sIHE5LCAgcTE1ICAgICAgICBAIGQyMyA9IHQ5YSwgIGQyNSA9IHQxNGEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyNywgZDIxLCBkMVswXSwgZDFbMV0sIHE5LCAgcTE1LCBuZWc9MSBAIGQyNyA9IHQxM2EsIGQyMSA9IHQxMGEKKyAgICAgICAgaWRjdDE2X2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MTZfcXVhcnRlcgorICAgICAgICB2bW92LnM2NCAgICAgICAgcTEyLCAjMAorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTQsICBkMTcsIGQ0WzBdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxNSwgIGQxOCwgZDJbMV0KKyAgICAgICAgdm11bGwuczMyICAgICAgIHExNSwgZDE4LCBkMlswXQorICAgICAgICB2bWxzbC5zMzIgICAgICAgcTEyLCBkMTksIGQ3WzFdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxMTQsIGQxNywgZDRbMV0KKyAgICAgICAgdm11bGwuczMyICAgICAgIHExMywgZDE5LCBkN1swXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTExLCBkMTYsIGQwWzBdCisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMTYsIHE0LCAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMTEsIHE1LCAgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMTAsIHExNSwgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMjQsIHExMiwgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMjksIHExNCwgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMTcsIHExMywgIzE0CisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMjgsIHExMSwgIzE0CisKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHExMCwgcTExLCBkMTcsIGQyNCwgZDFbMF0sIGQxWzFdLCBuZWc9MQorICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTksICBxMTUsIGQyOSwgZDE2LCBkMVswXSwgZDFbMV0KKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyNywgcTEwLCAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyMSwgcTExLCAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyMywgcTksICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyNSwgcTE1LCAjMTQKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQ4LCAgZDI4CisgICAgICAgIHZtb3YgICAgICAgICAgICBkOSwgIGQyOAorICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDIyLCBkMjYsIGQxMSwgZDEwLCBkMTgsIGQzMCwgcTksICBxMTUKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQyMCwgZDI4CisgICAgICAgIGlkY3QxNl9lbmQKK2VuZGZ1bmMKKworZnVuY3Rpb24gaWFkc3QxNgorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEyLCBpYWRzdDE2X2NvZWZmcworICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgIFtyMTIsOjEyOF0hCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHEzLCAgcTIsICBkMzEsIGQxNiwgZDBbMV0sIGQwWzBdIEAgcTMgID0gdDEsICAgcTIgID0gdDAKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE1LCAgcTQsICBkMjMsIGQyNCwgZDJbMV0sIGQyWzBdIEAgcTUgID0gdDksICAgcTQgID0gdDgKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQzMSwgZDI0LCBxMywgIHE1LCAgcTYsICBxNSAgICAgIEAgZDMxID0gdDFhLCAgZDI0ID0gdDlhCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxNywgIHE2LCAgZDI5LCBkMTgsIGQxWzFdLCBkMVswXSBAIHE3ICA9IHQzLCAgIHE2ICA9IHQyCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMTYsIGQyMywgcTIsICBxNCwgIHEzLCAgcTQgICAgICBAIGQxNiA9IHQwYSwgIGQyMyA9IHQ4YQorICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTMsICBxMiwgIGQyMSwgZDI2LCBkM1sxXSwgZDNbMF0gQCBxMyAgPSB0MTEsICBxMiAgPSB0MTAKKworICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgIFtyMTIsOjEyOF0hCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMjksIGQyNiwgcTcsICBxMywgIHE0LCAgcTMgICAgICBAIGQyOSA9IHQzYSwgIGQyNiA9IHQxMWEKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHExLCAgZDEKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHEwLCAgZDAKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE1LCAgcTQsICBkMjcsIGQyMCwgZDBbMV0sIGQwWzBdIEAgcTUgID0gdDUsICAgcTQgID0gdDQKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQxOCwgZDIxLCBxNiwgIHEyLCAgcTMsICBxMiAgICAgIEAgZDE4ID0gdDJhLCAgZDIxID0gdDEwYQorCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxNywgIHE2LCAgZDE5LCBkMjgsIGQyWzFdLCBkMlswXSBAIHE3ICA9IHQxMywgIHE2ICA9IHQxMgorICAgICAgICBidXR0ZXJmbHlfbiAgICAgZDIwLCBkMjgsIHE1LCAgcTcsICBxMiwgIHE3ICAgICAgQCBkMjAgPSB0NWEsICBkMjggPSB0MTNhCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxMywgIHEyLCAgZDI1LCBkMjIsIGQxWzFdLCBkMVswXSBAIHEzICA9IHQ3LCAgIHEyICA9IHQ2CisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMjcsIGQxOSwgcTQsICBxNiwgIHE1LCAgcTYgICAgICBAIGQyNyA9IHQ0YSwgIGQxOSA9IHQxMmEKKworICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTUsICBxNCwgIGQxNywgZDMwLCBkM1sxXSwgZDNbMF0gQCBxNSAgPSB0MTUsICBxNCAgPSB0MTQKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWRjdF9jb2VmZnMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sIFtyMTIsOjEyOF0KKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHExLCAgZDEKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHEwLCAgZDAKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQyMiwgZDMwLCBxMywgIHE1LCAgcTYsICBxNSAgICAgIEAgZDIyID0gdDdhLCAgZDMwID0gdDE1YQorICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTcsICBxNiwgIGQyMywgZDI0LCBkMlswXSwgZDJbMV0gQCBxNyAgPSB0OSwgICBxNiAgPSB0OAorICAgICAgICBidXR0ZXJmbHlfbiAgICAgZDI1LCBkMTcsIHEyLCAgcTQsICBxMywgIHE0ICAgICAgQCBkMjUgPSB0NmEsICBkMTcgPSB0MTRhCisKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHEyLCAgcTMsICBkMjgsIGQxOSwgZDJbMV0sIGQyWzBdIEAgcTIgID0gdDEyLCAgcTMgID0gdDEzCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMjMsIGQxOSwgcTYsICBxMiwgIHE0LCAgcTIgICAgICBAIGQyMyA9IHQ4YSwgIGQxOSA9IHQxMmEKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE1LCAgcTQsICBkMjEsIGQyNiwgZDNbMF0sIGQzWzFdIEAgcTUgID0gdDExLCAgcTQgID0gdDEwCisgICAgICAgIGJ1dHRlcmZseV9yICAgICBkNCwgIGQyNywgZDE2LCBkMjcgICAgICAgICAgICAgICBAIGQ0ICA9IHQ0LCAgIGQyNyA9IHQwCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMjQsIGQyOCwgcTcsICBxMywgIHE2LCAgcTMgICAgICBAIGQyNCA9IHQ5YSwgIGQyOCA9IHQxM2EKKworICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTYsICBxNywgIGQzMCwgZDE3LCBkM1sxXSwgZDNbMF0gQCBxNiAgPSB0MTQsICBxNyAgPSB0MTUKKyAgICAgICAgYnV0dGVyZmx5X3IgICAgIGQ1LCAgZDIwLCBkMzEsIGQyMCAgICAgICAgICAgICAgIEAgZDUgID0gdDUsICAgZDIwID0gdDEKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQyMSwgZDE3LCBxNCwgIHE2LCAgcTMsICBxNiAgICAgIEAgZDIxID0gdDEwYSwgZDE3ID0gdDE0YQorICAgICAgICBidXR0ZXJmbHlfbiAgICAgZDI2LCBkMzAsIHE1LCAgcTcsICBxNCwgIHE3ICAgICAgQCBkMjYgPSB0MTFhLCBkMzAgPSB0MTVhCisKKyAgICAgICAgYnV0dGVyZmx5X3IgICAgIGQ2LCAgZDI1LCBkMTgsIGQyNSAgICAgICAgICAgICAgIEAgZDYgID0gdDYsICAgZDI1ID0gdDIKKyAgICAgICAgYnV0dGVyZmx5X3IgICAgIGQ3LCAgZDIyLCBkMjksIGQyMiAgICAgICAgICAgICAgIEAgZDcgID0gdDcsICAgZDIyID0gdDMKKworICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTUsICBxNCwgIGQxOSwgZDI4LCBkMVswXSwgZDFbMV0gQCBxNSAgPSB0MTMsICBxNCAgPSB0MTIKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE2LCAgcTcsICBkMzAsIGQxNywgZDFbMV0sIGQxWzBdIEAgcTYgID0gdDE0LCAgcTcgID0gdDE1CisKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQxOCwgZDMwLCBxNCwgIHE2LCAgcTgsICBxNiAgICAgIEAgZDE4ID0gb3V0WzJdLCAgIGQzMCA9IHQxNGEKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQyOSwgZDE3LCBxNSwgIHE3LCAgcTYsICBxNyAgICAgIEAgZDI5ID0gLW91dFsxM10sIGQxNyA9IHQxNWEKKyAgICAgICAgdm5lZy5zMzIgICAgICAgIGQyOSwgZDI5ICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDI5ID0gb3V0WzEzXQorCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxNSwgIHE0LCAgZDQsICBkNSwgIGQxWzBdLCBkMVsxXSBAIHE1ICA9IHQ1YSwgIHE0ICA9IHQ0YQorICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTYsICBxNywgIGQ3LCAgZDYsICBkMVsxXSwgZDFbMF0gQCBxNiAgPSB0NmEsICBxNyAgPSB0N2EKKworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDIsICBkNiwgIGQyNywgZDI1ICAgICAgICAgICAgICAgQCBkMiA9IG91dFswXSwgZDYgPSB0MmEKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQzLCAgZDcsICBkMjMsIGQyMSAgICAgICAgICAgICAgIEAgZDMgPS1vdXRbMV0sIGQ3ID0gdDEwCisKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQxOSwgZDMxLCBxNCwgIHE2LCAgcTIsICBxNCAgICAgIEAgZDE5ID0gLW91dFszXSwgIGQzMSA9IHQ2CisgICAgICAgIHZuZWcuczMyICAgICAgICBkMTksIGQxOSAgICAgICAgICAgICAgICAgICAgICAgICBAIGQxOSA9IG91dFszXQorICAgICAgICBidXR0ZXJmbHlfbiAgICAgZDI4LCBkMTYsIHE1LCAgcTcsICBxMiwgIHE1ICAgICAgQCBkMjggPSBvdXRbMTJdLCAgZDE2ID0gdDcKKworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDUsICBkOCwgIGQyMCwgZDIyICAgICAgICAgICAgICAgQCBkNSA9LW91dFsxNV0sZDggPSB0M2EKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQ0LCAgZDksICBkMjQsIGQyNiAgICAgICAgICAgICAgIEAgZDQgPSBvdXRbMTRdLGQ5ID0gdDExCisKKyAgICAgICAgbWJ1dHRlcmZseTAgICAgIGQyMywgZDI0LCBkNiwgIGQ4LCAgZDEwLCBkMTEsIHE2LCAgcTcsIDEgQCBkMjMgPSBvdXRbN10sIGQyNCA9IG91dFs4XQorICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDIwLCBkMjcsIGQxNiwgZDMxLCBkMTAsIGQxMSwgcTYsICBxNyAgICBAIGQyMCA9IG91dFs0XSwgZDI3ID0gb3V0WzExXQorICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDIyLCBkMjUsIGQ5LCAgZDcsICBkMTAsIGQxMSwgcTYsICBxNyAgICBAIGQyMiA9IG91dFs2XSwgZDI1ID0gb3V0WzldCisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjEsIGQyNiwgZDMwLCBkMTcsIGQxMCwgZDExLCBxNiwgIHE3LCAxIEAgZDIxID0gb3V0WzVdLCBkMjYgPSBvdXRbMTBdCisKKyAgICAgICAgdm5lZy5zMzIgICAgICAgIGQzMSwgZDUgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDMxID0gb3V0WzE1XQorICAgICAgICB2bmVnLnMzMiAgICAgICAgZDE3LCBkMyAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMTcgPSBvdXRbMV0KKworICAgICAgICB2bW92ICAgICAgICAgICAgZDE2LCBkMgorICAgICAgICB2bW92ICAgICAgICAgICAgZDMwLCBkNAorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworLm1hY3JvIGl0eGZtMTZfMWRfZnVuY3MgdHhmbSwgc3VmZml4CitAIFJlYWQgYSB2ZXJ0aWNhbCAyeDE2IHNsaWNlIG91dCBvZiBhIDE2eDE2IG1hdHJpeCwgZG8gYSB0cmFuc2Zvcm0gb24gaXQsCitAIHRyYW5zcG9zZSBpbnRvIGEgaG9yaXpvbnRhbCAxNngyIHNsaWNlIGFuZCBzdG9yZS4KK0AgcjAgPSBkc3QgKHRlbXAgYnVmZmVyKQorQCByMiA9IHNyYworZnVuY3Rpb24gXHR4Zm1cKCkxNl8xZF8yeDE2X3Bhc3MxXHN1ZmZpeFwoKV9uZW9uCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzY0CisgICAgICAgIHZtb3YuczMyICAgICAgICBxNCwgICMwCisuaWZiIFxzdWZmaXgKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkXGl9LCBbcjIsOjY0XQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q4fSwgIFtyMiw6NjRdLCByMTIKKy5lbmRyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfcXVhcnRlcgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOQorICAgICAgICB2bGQxLjMyICAgICAgICAge2RcaX0sIFtyMiw6NjRdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDh9LCAgW3IyLDo2NF0sIHIxMgorLmVuZHIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9oYWxmCisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMworICAgICAgICB2bGQxLjMyICAgICAgICAge2RcaX0sIFtyMiw6NjRdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDh9LCAgW3IyLDo2NF0sIHIxMgorLmVuZHIKKy5lbmRpZgorCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHhmbVwoKTE2XHN1ZmZpeAorCisgICAgICAgIEAgRG8gZWlnaHQgMngyIHRyYW5zcG9zZXMuIE9yaWdpbmFsbHksIGQxNi1kMzEgY29udGFpbiB0aGUKKyAgICAgICAgQCAxNiByb3dzLiBBZnRlcndhcmRzLCBkMTYtZDE3LCBkMTgtZDE5IGV0YyBjb250YWluIHRoZSBlaWdodAorICAgICAgICBAIHRyYW5zcG9zZWQgMngyIGJsb2Nrcy4KKyAgICAgICAgdHJhbnNwb3NlMzJfOHhfMngyIGQxNiwgZDE3LCBkMTgsIGQxOSwgZDIwLCBkMjEsIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBkMjcsIGQyOCwgZDI5LCBkMzAsIGQzMQorCisgICAgICAgIEAgU3RvcmUgdGhlIHRyYW5zcG9zZWQgMngyIGJsb2NrcyBob3Jpem9udGFsbHkuCisuaXJwIGksIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzMCwgMTcsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjksIDMxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZFxpfSwgW3IwLDo2NF0hCisuZW5kcgorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworCitAIFJlYWQgYSB2ZXJ0aWNhbCAyeDE2IHNsaWNlIG91dCBvZiBhIDE2eDE2IG1hdHJpeCwgZG8gYSB0cmFuc2Zvcm0gb24gaXQsCitAIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHBpeGVscyAoZnJvbSBhIHNpbWlsYXIgMngxNiBzbGljZSksIGFkZCBhbmQgc3RvcmUgYmFjay4KK0AgcjAgPSBkc3QKK0AgcjEgPSBkc3Qgc3RyaWRlCitAIHIyID0gc3JjICh0ZW1wIGJ1ZmZlcikKK2Z1bmN0aW9uIFx0eGZtXCgpMTZfMWRfMngxNl9wYXNzMlxzdWZmaXhcKClfbmVvbgorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICM2NAorLmlmYiBcc3VmZml4CisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdLCByMTIKKy5lbmRyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfaGFsZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkXGl9LCBbcjIsOjY0XSwgcjEyCisuZW5kcgorLmVuZGlmCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjAsICByMQorICAgICAgICBsc2wgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHhmbVwoKTE2XHN1ZmZpeAorCisubWFjcm8gbG9hZF9hZGRfc3RvcmUgY29lZjAsIGNvZWYxLCBjb2VmMiwgY29lZjMKKyAgICAgICAgdnJzaHIuczMyICAgICAgIFxjb2VmMCwgXGNvZWYwLCAjNgorICAgICAgICB2cnNoci5zMzIgICAgICAgXGNvZWYxLCBcY29lZjEsICM2CisKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkOFtdfSwgICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkOFsxXX0sICBbcjMsOjMyXSwgcjEKKyAgICAgICAgdnJzaHIuczMyICAgICAgIFxjb2VmMiwgXGNvZWYyLCAjNgorICAgICAgICB2cnNoci5zMzIgICAgICAgXGNvZWYzLCBcY29lZjMsICM2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDlbXX0sICAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDlbMV19LCAgW3IzLDozMl0sIHIxCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBcY29lZjAsIFxjb2VmMCwgZDgKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTBbXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTBbMV19LCBbcjMsOjMyXSwgcjEKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIFxjb2VmMSwgXGNvZWYxLCBkOQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxMVtdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxMVsxXX0sIFtyMyw6MzJdLCByMQorCisgICAgICAgIHZxbW92dW4uczMyICAgICBkOCwgIFxjb2VmMAorICAgICAgICB2ZHVwLnMxNiAgICAgICAgcTgsICByOQorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDksICBcY29lZjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHIzLCAgcjEsIGxzbCAjMgorICAgICAgICB2YWRkdy51MTYgICAgICAgXGNvZWYyLCBcY29lZjIsIGQxMAorICAgICAgICB2YWRkdy51MTYgICAgICAgXGNvZWYzLCBcY29lZjMsIGQxMQorICAgICAgICB2bWluLnUxNiAgICAgICAgcTQsICBxNCwgIHE4CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDhbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDhbMV19LCAgW3IzLDozMl0sIHIxCisgICAgICAgIHZxbW92dW4uczMyICAgICBkMTAsIFxjb2VmMgorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q5WzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q5WzFdfSwgIFtyMyw6MzJdLCByMQorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDExLCBcY29lZjMKKyAgICAgICAgdm1pbi51MTYgICAgICAgIHE1LCAgcTUsICBxOAorCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDEwWzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDEwWzFdfSwgW3IzLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDExWzBdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDExWzFdfSwgW3IzLDozMl0sIHIxCisuZW5kbQorICAgICAgICBsb2FkX2FkZF9zdG9yZSAgcTgsICBxOSwgIHExMCwgcTExCisgICAgICAgIGxvYWRfYWRkX3N0b3JlICBxMTIsIHExMywgcTE0LCBxMTUKKy5wdXJnZW0gbG9hZF9hZGRfc3RvcmUKKworICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworLmVuZG0KKworaXR4Zm0xNl8xZF9mdW5jcyBpZGN0CitpdHhmbTE2XzFkX2Z1bmNzIGlhZHN0CitpdHhmbTE2XzFkX2Z1bmNzIGlkY3QsIF9xdWFydGVyCitpdHhmbTE2XzFkX2Z1bmNzIGlkY3QsIF9oYWxmCisubHRvcmcKKworQCBUaGlzIGlzIHRoZSBtaW5pbXVtIGVvYiB2YWx1ZSBmb3IgZWFjaCBzdWJwYXJ0aXRpb24sIGluIGluY3JlbWVudHMgb2YgMgorY29uc3QgbWluX2VvYl9pZGN0X2lkY3RfMTYsIGFsaWduPTQKKyAgICAgICAgLnNob3J0ICAwLCAzLCAxMCwgMjIsIDM4LCA2MiwgODksIDEyMQorZW5kY29uc3QKKworLm1hY3JvIGl0eGZtX2Z1bmMxNngxNiB0eGZtMSwgdHhmbTIKK2Z1bmN0aW9uIHZwOV9cdHhmbTFcKClfXHR4Zm0yXCgpXzE2eDE2X2FkZF8xNl9uZW9uCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMxCisgICAgICAgIGJlcSAgICAgICAgICAgICBpZGN0MTZ4MTZfZGNfYWRkX25lb24KKy5lbmRpZgorLmlmbmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtxNC1xN30KKy5lbHNlCisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTV9CisuZW5kaWYKKworICAgICAgICBAIEFsaWduIHRoZSBzdGFjaywgYWxsb2NhdGUgYSB0ZW1wIGJ1ZmZlcgorVCAgICAgICBtb3YgICAgICAgICAgICAgcjcsICBzcAorVCAgICAgICBhbmQgICAgICAgICAgICAgcjcsICByNywgICMxNQorQSAgICAgICBhbmQgICAgICAgICAgICAgcjcsICBzcCwgICMxNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjcsICByNywgICMxMDI0CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICByMgorCisuaWZjIFx0eGZtMSxpZGN0CisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAtcTF9LCBbcjEyLDoxMjhdCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMiwgIGQyCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMywgIGQzCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisuZW5kaWYKKworLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMTAKKyAgICAgICAgYmxlICAgICAgICAgICAgIGlkY3QxNngxNl9xdWFydGVyX2FkZF8xNl9uZW9uCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMzOAorICAgICAgICBibGUgICAgICAgICAgICAgaWRjdDE2eDE2X2hhbGZfYWRkXzE2X25lb24KKworICAgICAgICBtb3ZyZWwgICAgICAgICAgcjgsICBtaW5fZW9iX2lkY3RfaWRjdF8xNiArIDIKKy5lbmRpZgorCisuaXJwIGksIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjKFxpKjY0KQorLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorLmlmIFxpID4gMAorICAgICAgICBsZHJoX3Bvc3QgICAgICAgcjEsICByOCwgICMyCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgIHIxCisgICAgICAgIGl0ICAgICAgICAgICAgICBsZQorICAgICAgICBtb3ZsZSAgICAgICAgICAgcjEsICAjKDE2IC0gXGkpLzIKKyAgICAgICAgYmxlICAgICAgICAgICAgIDFmCisuZW5kaWYKKy5lbmRpZgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByNiwgICMoXGkqNCkKKyAgICAgICAgYmwgICAgICAgICAgICAgIFx0eGZtMVwoKTE2XzFkXzJ4MTZfcGFzczFfbmVvbgorLmVuZHIKKworLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICBiICAgICAgICAgICAgICAgM2YKKzE6CisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTQsICMwCisgICAgICAgIHZtb3YuaTMyICAgICAgICBxMTUsICMwCisyOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIEAgVW5yb2xsIGZvciAyIGxpbmVzCisucmVwdCAyCisgICAgICAgIEAgRmlsbCBvbmUgbGluZSB3aXRoIHplcm9zCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTE0LXExNX0sIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtxMTQtcTE1fSwgW3IwLDoxMjhdIQorLmVuZHIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDJiCiszOgorLmVuZGlmCisKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpYWRzdF9pZGN0CisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAtcTF9LCBbcjEyLDoxMjhdCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMiwgIGQyCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMywgIGQzCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisuZW5kaWYKKy5pcnAgaSwgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMoXGkqMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgc3AsICAjKFxpKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHhmbTJcKCkxNl8xZF8yeDE2X3Bhc3MyX25lb24KKy5lbmRyCisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICByNworLmlmbmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKy5lbHNlCisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTV9CisuZW5kaWYKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfMTZ4MTZfYWRkXzEwX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjksbHJ9CisgICAgICAgIG1vdncgICAgICAgICAgICByOSwgICMweDAzZmYKKyAgICAgICAgYiAgICAgICAgICAgICAgIHZwOV9cdHhmbTFcKClfXHR4Zm0yXCgpXzE2eDE2X2FkZF8xNl9uZW9uCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9cdHhmbTFcKClfXHR4Zm0yXCgpXzE2eDE2X2FkZF8xMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI5LGxyfQorICAgICAgICBtb3Z3ICAgICAgICAgICAgcjksICAjMHgwZmZmCisgICAgICAgIGIgICAgICAgICAgICAgICB2cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV8xNngxNl9hZGRfMTZfbmVvbgorZW5kZnVuYworLmVuZG0KKworaXR4Zm1fZnVuYzE2eDE2IGlkY3QsICBpZGN0CitpdHhmbV9mdW5jMTZ4MTYgaWFkc3QsIGlkY3QKK2l0eGZtX2Z1bmMxNngxNiBpZGN0LCAgaWFkc3QKK2l0eGZtX2Z1bmMxNngxNiBpYWRzdCwgaWFkc3QKKy5sdG9yZworCisubWFjcm8gaWRjdDE2X3BhcnRpYWwgc2l6ZQorZnVuY3Rpb24gaWRjdDE2eDE2X1xzaXplXCgpX2FkZF8xNl9uZW9uCisuaXJwIGksIDAsIDIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjKFxpKjY0KQorLmlmYyBcc2l6ZSxxdWFydGVyCisuaWYgXGkgPT0gMgorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMworICAgICAgICBibGUgICAgICAgICAgICAgMWYKKy5lbmRpZgorLmVuZGlmCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHI2LCAgIyhcaSo0KQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDE2XzFkXzJ4MTZfcGFzczFfXHNpemVcKClfbmVvbgorLmVuZHIKKworLmlmYyBcc2l6ZSxoYWxmCisuaXJwIGksIDQsIDYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjKFxpKjY0KQorLmlmIFxpID09IDYKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzIyCisgICAgICAgIGJsZSAgICAgICAgICAgICAxZgorLmVuZGlmCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHI2LCAgIyhcaSo0KQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDE2XzFkXzJ4MTZfcGFzczFfXHNpemVcKClfbmVvbgorLmVuZHIKKy5lbmRpZgorCisgICAgICAgIGIgICAgICAgICAgICAgICAzZgorMToKKyAgICAgICAgdm1vdi5pMzIgICAgICAgIHExNCwgIzAKKyAgICAgICAgdm1vdi5pMzIgICAgICAgIHExNSwgIzAKKworICAgICAgICBAIFVucm9sbCBmb3IgMiBsaW5lcworLnJlcHQgMgorICAgICAgICBAIEZpbGwgb25lIGxpbmUgd2l0aCB6ZXJvcworICAgICAgICB2c3QxLjMyICAgICAgICAge3ExNC1xMTV9LCBbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7cTE0LXExNX0sIFtyMCw6MTI4XSEKKy5lbmRyCisKKzM6CisKKy5pcnAgaSwgMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMoXGkqMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgc3AsICAjKFxpKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfMWRfMngxNl9wYXNzMl9cc2l6ZVwoKV9uZW9uCisuZW5kcgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xNX0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSxwY30KK2VuZGZ1bmMKKy5lbmRtCisKK2lkY3QxNl9wYXJ0aWFsIHF1YXJ0ZXIKK2lkY3QxNl9wYXJ0aWFsIGhhbGYKKworZnVuY3Rpb24gaWRjdDMyeDMyX2RjX2FkZF9uZW9uCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjEyLDo2NF0KKworICAgICAgICB2bW92LmkzMiAgICAgICAgcTIsICAjMAorICAgICAgICB2bW92bC5zMTYgICAgICAgcTAsICBkMAorCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDE2W119LCBbcjIsOjMyXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTgsICBkMTYsIGQwWzBdCisgICAgICAgIHZyc2hybi5zNjQgICAgICBkMTYsIHE4LCAgIzE0CisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxOCwgIGQxNiwgZDBbMF0KKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQxNiwgcTgsICAjMTQKKyAgICAgICAgdmR1cC4zMiAgICAgICAgIHE4LCAgZDE2WzBdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDRbMF19LCBbcjIsOjMyXQorCisgICAgICAgIHZyc2hyLnMzMiAgICAgICBxOCwgIHE4LCAgIzYKKyAgICAgICAgdmR1cC5zMTYgICAgICAgIHExNSwgcjkKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMzIKKzE6CisgICAgICAgIEAgTG9vcCB0byBhZGQgdGhlIGNvbnN0YW50IGZyb20gcTggaW50byBhbGwgMzJ4MzIgb3V0cHV0cworICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAtcTF9LCAgW3IwLDoxMjhdIQorICAgICAgICB2YWRkdy51MTYgICAgICAgcTksICBxOCwgIGQwCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMTAsIHE4LCAgZDEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMi1xM30sICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMTEsIHE4LCAgZDIKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIHExMiwgcTgsICBkMworICAgICAgICB2YWRkdy51MTYgICAgICAgcTEzLCBxOCwgIGQ0CisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMTQsIHE4LCAgZDUKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQwLCAgcTkKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIHE5LCAgcTgsICBkNgorICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDEsICBxMTAKKyAgICAgICAgdmFkZHcudTE2ICAgICAgIHExMCwgcTgsICBkNworICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDIsICBxMTEKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQzLCAgcTEyCisgICAgICAgIHZxbW92dW4uczMyICAgICBkNCwgIHExMworICAgICAgICB2cW1vdnVuLnMzMiAgICAgZDUsICBxMTQKKyAgICAgICAgdm1pbi51MTYgICAgICAgIHEwLCAgcTAsICBxMTUKKyAgICAgICAgdm1pbi51MTYgICAgICAgIHExLCAgcTEsICBxMTUKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQ2LCAgcTkKKyAgICAgICAgdnFtb3Z1bi5zMzIgICAgIGQ3LCAgcTEwCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTAtcTF9LCAgW3IzLDoxMjhdIQorICAgICAgICB2bWluLnUxNiAgICAgICAgcTIsICBxMiwgIHExNQorICAgICAgICB2bWluLnUxNiAgICAgICAgcTMsICBxMywgIHExNQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyLXEzfSwgIFtyMyw6MTI4XSwgcjEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSxwY30KK2VuZGZ1bmMKKworLm1hY3JvIGlkY3QzMl9lbmQKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxNiwgZDksICBkOCwgIGQ5ICBAIGQxNiA9IHQxNmEsIGQ5ICA9IHQxOWEKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxNywgZDIwLCBkMjMsIGQyMCBAIGQxNyA9IHQxNywgIGQyMCA9IHQxOAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE4LCBkMTAsIGQxMSwgZDEwIEAgZDE4ID0gdDIzYSwgZDEwID0gdDIwYQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE5LCBkMjEsIGQyMiwgZDIxIEAgZDE5ID0gdDIyLCAgZDIxID0gdDIxCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkOCwgIGQyOCwgZDI4LCBkMzAgQCBkOCAgPSB0MjRhLCBkMjggPSB0MjdhCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjMsIGQyNiwgZDI1LCBkMjYgQCBkMjMgPSB0MjUsICBkMjYgPSB0MjYKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxMSwgZDI5LCBkMjksIGQzMSBAIGQxMSA9IHQzMWEsIGQyOSA9IHQyOGEKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyMiwgZDI3LCBkMjQsIGQyNyBAIGQyMiA9IHQzMCwgIGQyNyA9IHQyOQorCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjcsIGQyMCwgZDFbMF0sIGQxWzFdLCBxMTIsIHExNSAgICAgICAgQCBkMjcgPSB0MThhLCBkMjAgPSB0MjlhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjksIGQ5LCAgZDFbMF0sIGQxWzFdLCBxMTIsIHExNSAgICAgICAgQCBkMjkgPSB0MTksICBkOSAgPSB0MjgKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyOCwgZDEwLCBkMVswXSwgZDFbMV0sIHExMiwgcTE1LCBuZWc9MSBAIGQyOCA9IHQyNywgIGQxMCA9IHQyMAorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI2LCBkMjEsIGQxWzBdLCBkMVsxXSwgcTEyLCBxMTUsIG5lZz0xIEAgZDI2ID0gdDI2YSwgZDIxID0gdDIxYQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMzEsIGQyNCwgZDExLCBkOCAgQCBkMzEgPSB0MzEsICBkMjQgPSB0MjQKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQzMCwgZDI1LCBkMjIsIGQyMyBAIGQzMCA9IHQzMGEsIGQyNSA9IHQyNWEKKyAgICAgICAgYnV0dGVyZmx5X3IgICAgIGQyMywgZDE2LCBkMTYsIGQxOCBAIGQyMyA9IHQyMywgIGQxNiA9IHQxNgorICAgICAgICBidXR0ZXJmbHlfciAgICAgZDIyLCBkMTcsIGQxNywgZDE5IEAgZDIyID0gdDIyYSwgZDE3ID0gdDE3YQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE4LCBkMjEsIGQyNywgZDIxIEAgZDE4ID0gdDE4LCAgZDIxID0gdDIxCisgICAgICAgIGJ1dHRlcmZseV9yICAgICBkMjcsIGQyOCwgZDksICBkMjggQCBkMjcgPSB0MjdhLCBkMjggPSB0MjhhCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkOCwgIGQyNiwgZDIwLCBkMjYgQCBkOCAgPSB0MjksICBkMjYgPSB0MjYKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxOSwgZDIwLCBkMjksIGQxMCBAIGQxOSA9IHQxOWEsIGQyMCA9IHQyMAorICAgICAgICB2bW92ICAgICAgICAgICAgZDI5LCBkOCAgICAgICAgICAgIEAgZDI5ID0gdDI5CisKKyAgICAgICAgbWJ1dHRlcmZseTAgICAgIGQyNywgZDIwLCBkMjcsIGQyMCwgZDgsIGQxMCwgcTQsIHE1IEAgZDI3ID0gdDI3LCAgZDIwID0gdDIwCisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjYsIGQyMSwgZDI2LCBkMjEsIGQ4LCBkMTAsIHE0LCBxNSBAIGQyNiA9IHQyNmEsIGQyMSA9IHQyMWEKKyAgICAgICAgbWJ1dHRlcmZseTAgICAgIGQyNSwgZDIyLCBkMjUsIGQyMiwgZDgsIGQxMCwgcTQsIHE1IEAgZDI1ID0gdDI1LCAgZDIyID0gdDIyCisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjQsIGQyMywgZDI0LCBkMjMsIGQ4LCBkMTAsIHE0LCBxNSBAIGQyNCA9IHQyNGEsIGQyMyA9IHQyM2EKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCisuZW5kbQorCitmdW5jdGlvbiBpZGN0MzJfb2RkCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisKKyAgICAgICAgQCBPdmVyd3JpdGUgdGhlIGlkY3QxNiBjb2VmZnMgd2l0aCB0aGUgc3RvcmVkIG9uZXMgZm9yIGlkY3QzMgorICAgICAgICB2bW92bC5zMTYgICAgICAgcTAsICBkMTIKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHExLCAgZDEzCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMiwgIGQxNAorICAgICAgICB2bW92bC5zMTYgICAgICAgcTMsICBkMTUKKworICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDE2LCBkMzEsIGQwWzBdLCBkMFsxXSwgcTQsIHE1IEAgZDE2ID0gdDE2YSwgZDMxID0gdDMxYQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI0LCBkMjMsIGQxWzBdLCBkMVsxXSwgcTQsIHE1IEAgZDI0ID0gdDE3YSwgZDIzID0gdDMwYQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIwLCBkMjcsIGQyWzBdLCBkMlsxXSwgcTQsIHE1IEAgZDIwID0gdDE4YSwgZDI3ID0gdDI5YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI4LCBkMTksIGQzWzBdLCBkM1sxXSwgcTQsIHE1IEAgZDI4ID0gdDE5YSwgZDE5ID0gdDI4YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDE4LCBkMjksIGQ0WzBdLCBkNFsxXSwgcTQsIHE1IEAgZDE4ID0gdDIwYSwgZDI5ID0gdDI3YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI2LCBkMjEsIGQ1WzBdLCBkNVsxXSwgcTQsIHE1IEAgZDI2ID0gdDIxYSwgZDIxID0gdDI2YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIyLCBkMjUsIGQ2WzBdLCBkNlsxXSwgcTQsIHE1IEAgZDIyID0gdDIyYSwgZDI1ID0gdDI1YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDMwLCBkMTcsIGQ3WzBdLCBkN1sxXSwgcTQsIHE1IEAgZDMwID0gdDIzYSwgZDE3ID0gdDI0YQorCisgICAgICAgIEAgUmVsb2FkIHRoZSBpZGN0MTYgY29lZmZpY2llbnRzLiBXZSBjb3VsZCBzd2FwIHRoZSBjb2VmZmljaWVudHMgYmV0d2VlbgorICAgICAgICBAIHEwLXEzIGFuZCBxNi1xNyBieSBuYXJyb3dpbmcvbGVuZ3RoZW5pbmcsIGJ1dCB0aGF0J3Mgc2xvd2VyIHRoYW4ganVzdAorICAgICAgICBAIGxvYWRpbmcgYW5kIGxlbmd0aGVuaW5nLgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwLXExfSwgW3IxMiw6MTI4XQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkOCwgIGQyNCwgZDE2LCBkMjQgQCBkOCAgPSB0MTYsIGQyNCA9IHQxNworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDksICBkMjAsIGQyOCwgZDIwIEAgZDkgID0gdDE5LCBkMjAgPSB0MTgKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxMCwgZDI2LCBkMTgsIGQyNiBAIGQxMCA9IHQyMCwgZDI2ID0gdDIxCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTEsIGQyMiwgZDMwLCBkMjIgQCBkMTEgPSB0MjMsIGQyMiA9IHQyMgorICAgICAgICB2bW92bC5zMTYgICAgICAgcTIsICBkMgorICAgICAgICB2bW92bC5zMTYgICAgICAgcTMsICBkMworICAgICAgICB2bW92bC5zMTYgICAgICAgcTEsICBkMQorICAgICAgICB2bW92bC5zMTYgICAgICAgcTAsICBkMAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDI4LCBkMjUsIGQxNywgZDI1IEAgZDI4ID0gdDI0LCBkMjUgPSB0MjUKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQzMCwgZDIxLCBkMjksIGQyMSBAIGQzMCA9IHQyNywgZDIxID0gdDI2CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjksIGQyMywgZDMxLCBkMjMgQCBkMjkgPSB0MzEsIGQyMyA9IHQzMAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDMxLCBkMjcsIGQxOSwgZDI3IEAgZDMxID0gdDI4LCBkMjcgPSB0MjkKKworICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIzLCBkMjQsIGQyWzBdLCBkMlsxXSwgcTgsIHE5ICAgICAgICBAIGQyMyA9IHQxN2EsIGQyNCA9IHQzMGEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyNywgZDIwLCBkMlswXSwgZDJbMV0sIHE4LCBxOSwgbmVnPTEgQCBkMjcgPSB0MjlhLCBkMjAgPSB0MThhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjEsIGQyNiwgZDNbMF0sIGQzWzFdLCBxOCwgcTkgICAgICAgIEAgZDIxID0gdDIxYSwgZDI2ID0gdDI2YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI1LCBkMjIsIGQzWzBdLCBkM1sxXSwgcTgsIHE5LCBuZWc9MSBAIGQyNSA9IHQyNWEsIGQyMiA9IHQyMmEKKyAgICAgICAgaWRjdDMyX2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MzJfb2RkX2hhbGYKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWRjdF9jb2VmZnMKKworICAgICAgICB2bW92bC5zMTYgICAgICAgcTAsICBkMTIKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHExLCAgZDEzCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMiwgIGQxNAorICAgICAgICB2bW92bC5zMTYgICAgICAgcTMsICBkMTUKKworICAgICAgICBtYnV0dGVyZmx5X2gxICAgZDE2LCBkMzEsIGQwWzBdLCBkMFsxXSwgcTQsIHE1IEAgZDE2ID0gdDE2YSwgZDMxID0gdDMxYQorICAgICAgICBtYnV0dGVyZmx5X2gyICAgZDI0LCBkMjMsIGQxWzBdLCBkMVsxXSwgcTQsIHE1IEAgZDI0ID0gdDE3YSwgZDIzID0gdDMwYQorICAgICAgICBtYnV0dGVyZmx5X2gxICAgZDIwLCBkMjcsIGQyWzBdLCBkMlsxXSwgcTQsIHE1IEAgZDIwID0gdDE4YSwgZDI3ID0gdDI5YQorICAgICAgICBtYnV0dGVyZmx5X2gyICAgZDI4LCBkMTksIGQzWzBdLCBkM1sxXSwgcTQsIHE1IEAgZDI4ID0gdDE5YSwgZDE5ID0gdDI4YQorICAgICAgICBtYnV0dGVyZmx5X2gxICAgZDE4LCBkMjksIGQ0WzBdLCBkNFsxXSwgcTQsIHE1IEAgZDE4ID0gdDIwYSwgZDI5ID0gdDI3YQorICAgICAgICBtYnV0dGVyZmx5X2gyICAgZDI2LCBkMjEsIGQ1WzBdLCBkNVsxXSwgcTQsIHE1IEAgZDI2ID0gdDIxYSwgZDIxID0gdDI2YQorICAgICAgICBtYnV0dGVyZmx5X2gxICAgZDIyLCBkMjUsIGQ2WzBdLCBkNlsxXSwgcTQsIHE1IEAgZDIyID0gdDIyYSwgZDI1ID0gdDI1YQorICAgICAgICBtYnV0dGVyZmx5X2gyICAgZDMwLCBkMTcsIGQ3WzBdLCBkN1sxXSwgcTQsIHE1IEAgZDMwID0gdDIzYSwgZDE3ID0gdDI0YQorCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAtcTF9LCBbcjEyLDoxMjhdCisKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQ4LCAgZDI0LCBkMTYsIGQyNCBAIGQ4ICA9IHQxNiwgZDI0ID0gdDE3CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkOSwgIGQyMCwgZDI4LCBkMjAgQCBkOSAgPSB0MTksIGQyMCA9IHQxOAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDEwLCBkMjYsIGQxOCwgZDI2IEAgZDEwID0gdDIwLCBkMjYgPSB0MjEKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxMSwgZDIyLCBkMzAsIGQyMiBAIGQxMSA9IHQyMywgZDIyID0gdDIyCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMiwgIGQyCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMywgIGQzCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjgsIGQyNSwgZDE3LCBkMjUgQCBkMjggPSB0MjQsIGQyNSA9IHQyNQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDMwLCBkMjEsIGQyOSwgZDIxIEAgZDMwID0gdDI3LCBkMjEgPSB0MjYKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyOSwgZDIzLCBkMzEsIGQyMyBAIGQyOSA9IHQzMSwgZDIzID0gdDMwCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMzEsIGQyNywgZDE5LCBkMjcgQCBkMzEgPSB0MjgsIGQyNyA9IHQyOQorCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjMsIGQyNCwgZDJbMF0sIGQyWzFdLCBxOCwgcTkgICAgICAgIEAgZDIzID0gdDE3YSwgZDI0ID0gdDMwYQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI3LCBkMjAsIGQyWzBdLCBkMlsxXSwgcTgsIHE5LCBuZWc9MSBAIGQyNyA9IHQyOWEsIGQyMCA9IHQxOGEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyMSwgZDI2LCBkM1swXSwgZDNbMV0sIHE4LCBxOSAgICAgICAgQCBkMjEgPSB0MjFhLCBkMjYgPSB0MjZhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjUsIGQyMiwgZDNbMF0sIGQzWzFdLCBxOCwgcTksIG5lZz0xIEAgZDI1ID0gdDI1YSwgZDIyID0gdDIyYQorICAgICAgICBpZGN0MzJfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QzMl9vZGRfcXVhcnRlcgorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEyLCBpZGN0X2NvZWZmcworCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQxMgorICAgICAgICB2bW92bC5zMTYgICAgICAgcTEsICBkMTMKKyAgICAgICAgdm1vdmwuczE2ICAgICAgIHEyLCAgZDE0CisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMywgIGQxNQorCisgICAgICAgIHZtb3YuczY0ICAgICAgICBxMTQsICMwCisgICAgICAgIHZtb3YuczY0ICAgICAgICBxNSwgICMwCisKKyAgICAgICAgdm11bGwuczMyICAgICAgIHE0LCAgZDE2LCBkMFswXQorICAgICAgICB2bWxzbC5zMzIgICAgICAgcTE0LCBkMTksIGQzWzFdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxMTUsIGQxNiwgZDBbMV0KKyAgICAgICAgdm11bGwuczMyICAgICAgIHExMSwgZDE3LCBkN1swXQorICAgICAgICB2bWxzbC5zMzIgICAgICAgcTUsICBkMTcsIGQ3WzFdCisgICAgICAgIHZtdWxsLnMzMiAgICAgICBxMTMsIGQxOSwgZDNbMF0KKyAgICAgICAgdm11bGwuczMyICAgICAgIHExMCwgZDE4LCBkNFswXQorICAgICAgICB2bXVsbC5zMzIgICAgICAgcTEyLCBkMTgsIGQ0WzFdCisKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMC1xMX0sIFtyMTIsOjEyOF0KKworICAgICAgICB2cnNocm4uczY0ICAgICAgZDgsICBxNCwgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDksICBxMTQsICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDI5LCBxMTUsICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDI4LCBxMTEsICMxNAorCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMiwgIGQyCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMywgIGQzCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQxMSwgcTUsICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQzMSwgcTEzLCAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQxMCwgcTEwLCAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQzMCwgcTEyLCAjMTQKKworICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTgsICBxOSwgIGQyOSwgZDgsICBkMlswXSwgZDJbMV0KKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHExMywgcTEwLCBkMzEsIGQ5LCAgZDJbMF0sIGQyWzFdLCBuZWc9MQorICAgICAgICB2cnNocm4uczY0ICAgICAgZDIzLCBxOCwgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDI0LCBxOSwgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDI3LCBxMTMsICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDIwLCBxMTAsICMxNAorICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTgsICBxOSwgIGQzMCwgZDEwLCBkM1swXSwgZDNbMV0KKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyMSwgcTgsICAjMTQKKyAgICAgICAgdnJzaHJuLnM2NCAgICAgIGQyNiwgcTksICAjMTQKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE4LCAgcTksICBkMjgsIGQxMSwgZDNbMF0sIGQzWzFdLCBuZWc9MQorICAgICAgICB2cnNocm4uczY0ICAgICAgZDI1LCBxOCwgICMxNAorICAgICAgICB2cnNocm4uczY0ICAgICAgZDIyLCBxOSwgICMxNAorCisgICAgICAgIGlkY3QzMl9lbmQKK2VuZGZ1bmMKKworLm1hY3JvIGlkY3QzMl9mdW5jcyBzdWZmaXgKK0AgRG8gYW4gMzItcG9pbnQgSURDVCBvZiBhIDJ4MzIgc2xpY2Ugb3V0IG9mIGEgMzJ4MzIgbWF0cml4LgorQCBXZSBkb24ndCBoYXZlIHJlZ2lzdGVyIHNwYWNlIHRvIGRvIGEgc2luZ2xlIHBhc3MgSURDVCBvZiAyeDMyIHRob3VnaCwKK0AgYnV0IHRoZSAzMi1wb2ludCBJRENUIGNhbiBiZSBkZWNvbXBvc2VkIGludG8gdHdvIDE2LXBvaW50IElEQ1RzOworQCBhIG5vcm1hbCBJRENUMTYgd2l0aCBldmVyeSBvdGhlciBpbnB1dCBjb21wb25lbnQgKHRoZSBldmVuIG9uZXMsIHdpdGgKK0AgZWFjaCBvdXRwdXQgd3JpdHRlbiB0d2ljZSksIGZvbGxvd2VkIGJ5IGEgc2VwYXJhdGUgMTYtcG9pbnQgSURDVAorQCBvZiB0aGUgb2RkIGlucHV0cywgYWRkZWQvc3VidHJhY3RlZCBvbnRvIHRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBpZGN0MTYuCitAIHIwID0gZHN0ICh0ZW1wIGJ1ZmZlcikKK0AgcjEgPSB1bnVzZWQKK0AgcjIgPSBzcmMKK2Z1bmN0aW9uIGlkY3QzMl8xZF8yeDMyX3Bhc3MxXHN1ZmZpeFwoKV9uZW9uCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisKKyAgICAgICAgQCBEb3VibGUgc3RyaWRlIG9mIHRoZSBpbnB1dCwgc2luY2Ugd2Ugb25seSByZWFkIGV2ZXJ5IG90aGVyIGxpbmUKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzI1NgorICAgICAgICB2bW92LnMzMiAgICAgICAgZDgsICAjMAorCisgICAgICAgIEAgZDE2ID0gSU4oMCksIGQxNyA9IElOKDIpIC4uLiBkMzEgPSBJTigzMCkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2RcaX0sIFtyMiw6NjRdCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDh9LCAgW3IyLDo2NF0sIHIxMgorLmVuZHIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOH0sICBbcjIsOjY0XSwgcjEyCisuZW5kcgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0KKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOH0sICBbcjIsOjY0XSwgcjEyCisuZW5kcgorLmVuZGlmCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNlxzdWZmaXgKKworICAgICAgICBAIERvIGVpZ2h0IDJ4MiB0cmFuc3Bvc2VzLiBPcmlnaW5hbGx5LCBkMTYtZDMxIGNvbnRhaW4gdGhlCisgICAgICAgIEAgMTYgcm93cy4gQWZ0ZXJ3YXJkcywgZDE2LWQxNywgZDE4LWQxOSBldGMgY29udGFpbiB0aGUgZWlnaHQKKyAgICAgICAgQCB0cmFuc3Bvc2VkIDJ4MiBibG9ja3MuCisgICAgICAgIHRyYW5zcG9zZTMyXzh4XzJ4MiBkMTYsIGQxNywgZDE4LCBkMTksIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEKKworICAgICAgICBAIFN0b3JlIHRoZSByZWdpc3RlcnMgYSwgYiwgYywgZCwgZSwgZiwgZywgaCBob3Jpem9udGFsbHksIGZvbGxvd2VkCisgICAgICAgIEAgYnkgdGhlIHNhbWUgcmVnaXN0ZXJzIGgsIGcsIGYsIGUsIGQsIGMsIGIsIGEgbWlycm9yZWQuCisubWFjcm8gc3RvcmVfcmV2IGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgKKy5pcnAgaSwgXGEsIFxiLCBcYywgXGQsIFxlLCBcZiwgXGcsIFxoCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZFxpfSwgW3IwLDo2NF0hCisgICAgICAgIHZyZXY2NC4zMiAgICAgICBkXGksIGRcaQorLmVuZHIKKy5pcnAgaSwgXGgsIFxnLCBcZiwgXGUsIFxkLCBcYywgXGIsIFxhCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZFxpfSwgW3IwLDo2NF0hCisuZW5kcgorLmVuZG0KKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzMAorICAgICAgICBzdG9yZV9yZXYgICAgICAgMTcsIDE5LCAyMSwgMjMsIDI1LCAyNywgMjksIDMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzI1NgorLnB1cmdlbSBzdG9yZV9yZXYKKworICAgICAgICBAIE1vdmUgcjIgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGlucHV0LCBhbmQgbW92ZQorICAgICAgICBAIHRvIHRoZSBmaXJzdCBvZGQgcm93CisuaWZiIFxzdWZmaXgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjNAorLmVuZGlmCisuaWZjIFxzdWZmaXgsX3F1YXJ0ZXIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjMgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjMworLmVuZGlmCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCAgIzEyOAorCisgICAgICAgIHZtb3YuczMyICAgICAgICBkOCwgICMwCisgICAgICAgIEAgZDE2ID0gSU4oMSksIGQxNyA9IElOKDMpIC4uLiBkMzEgPSBJTigzMSkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDh9LCAgW3IyLDo2NF0sIHIxMgorLmVuZHIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkOH0sICBbcjIsOjY0XSwgcjEyCisuZW5kcgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkOH0sICBbcjIsOjY0XSwgcjEyCisuZW5kcgorLmVuZGlmCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QzMl9vZGRcc3VmZml4CisKKyAgICAgICAgdHJhbnNwb3NlMzJfOHhfMngyIGQzMSwgZDMwLCBkMjksIGQyOCwgZDI3LCBkMjYsIGQyNSwgZDI0LCBkMjMsIGQyMiwgZDIxLCBkMjAsIGQxOSwgZDE4LCBkMTcsIGQxNgorCisgICAgICAgIEAgU3RvcmUgdGhlIHJlZ2lzdGVycyBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoIGhvcml6b250YWxseSwKKyAgICAgICAgQCBhZGRpbmcgaW50byB0aGUgb3V0cHV0IGZpcnN0LCBhbmQgdGhlbiBtaXJyb3JlZCwgc3VidHJhY3RlZAorICAgICAgICBAIGZyb20gdGhlIG91dHB1dC4KKy5tYWNybyBzdG9yZV9yZXYgYSwgYiwgYywgZCwgZSwgZiwgZywgaAorLmlycCBpLCBcYSwgXGIsIFxjLCBcZCwgXGUsIFxmLCBcZywgXGgKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkOH0sICBbcjAsOjY0XQorICAgICAgICB2YWRkLnMzMiAgICAgICAgZDgsIGQ4LCBkXGkKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOH0sICBbcjAsOjY0XSEKKyAgICAgICAgdnJldjY0LjMyICAgICAgIGRcaSwgZFxpCisuZW5kcgorLmlycCBpLCBcaCwgXGcsIFxmLCBcZSwgXGQsIFxjLCBcYiwgXGEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkOH0sICBbcjAsOjY0XQorICAgICAgICB2c3ViLnMzMiAgICAgICAgZDgsIGQ4LCBkXGkKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOH0sICBbcjAsOjY0XSEKKy5lbmRyCisuZW5kbQorCisgICAgICAgIHN0b3JlX3JldiAgICAgICAzMSwgMjksIDI3LCAyNSwgMjMsIDIxLCAxOSwgMTcKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIDMwLCAyOCwgMjYsIDI0LCAyMiwgMjAsIDE4LCAxNgorLnB1cmdlbSBzdG9yZV9yZXYKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKy5sdG9yZworCitAIFRoaXMgaXMgbW9zdGx5IHRoZSBzYW1lIGFzIDJ4MzJfcGFzczEsIGJ1dCB3aXRob3V0IHRoZSB0cmFuc3Bvc2UsCitAIGFuZCB1c2UgdGhlIHNvdXJjZSBhcyB0ZW1wIGJ1ZmZlciBiZXR3ZWVuIHRoZSB0d28gaWRjdCBwYXNzZXMsIGFuZAorQCBhZGQgaW50byB0aGUgZGVzdGluYXRpb24uCitAIHIwID0gZHN0CitAIHIxID0gZHN0IHN0cmlkZQorQCByMiA9IHNyYyAodGVtcCBidWZmZXIpCitmdW5jdGlvbiBpZGN0MzJfMWRfMngzMl9wYXNzMlxzdWZmaXhcKClfbmVvbgorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMyNTYKKyAgICAgICAgQCBkMTYgPSBJTigwKSwgZDE3ID0gSU4oMikgLi4uIGQzMSA9IElOKDMwKQorLmlmYiBcc3VmZml4CisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjNAorLmVuZGlmCisuaWZjIFxzdWZmaXgsX3F1YXJ0ZXIKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTkKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkXGl9LCBbcjIsOjY0XSwgcjEyCisuZW5kcgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIxMiwgbHNsICMyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfaGFsZgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkXGl9LCBbcjIsOjY0XSwgcjEyCisuZW5kcgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIxMiwgbHNsICMzCisuZW5kaWYKKworICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDE2XHN1ZmZpeAorCisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIxMiwgbHNsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCAgIzEyOAorCisgICAgICAgIEAgZDE2ID0gSU4oMSksIGQxNyA9IElOKDMpIC4uLiBkMzEgPSBJTigzMSkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2RcaX0sIFtyMiw6NjRdLCByMTIKKy5lbmRyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjEyLCBsc2wgIzQKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjMgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjMworLmVuZGlmCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzEyOAorCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfb2RkXHN1ZmZpeAorCisgICAgICAgIEAgTmFycm93IHRoZSBpY3QxNiBjb2VmZmljaWVudHMgaW4gcTAtcTMgaW50byBxMC1xMSwgdG8KKyAgICAgICAgQCBhbGxvdyBjbG9iYmVyaW5nIHEyLXEzIGJlbG93LgorICAgICAgICB2bW92bi5zMzIgICAgICAgZDAsICBxMAorICAgICAgICB2bW92bi5zMzIgICAgICAgZDEsICBxMQorICAgICAgICB2bW92bi5zMzIgICAgICAgZDIsICBxMgorICAgICAgICB2bW92bi5zMzIgICAgICAgZDMsICBxMworCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMyNTYKKyAgICAgICAgdmR1cC5zMTYgICAgICAgIHE0LCAgcjkKKy5tYWNybyBsb2FkX2FjY19zdG9yZSBhLCBiLCBjLCBkLCBuZWc9MAorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0fSwgIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNX0sICBbcjIsOjY0XSwgcjEyCisuaWYgXG5lZyA9PSAwCisgICAgICAgIHZhZGQuczMyICAgICAgICBkNCwgIGQ0LCAgZFxhCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDZ9LCAgW3IyLDo2NF0sIHIxMgorICAgICAgICB2YWRkLnMzMiAgICAgICAgZDUsICBkNSwgIGRcYgorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q3fSwgIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIGQ2LCAgZDYsICBkXGMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIGQ3LCAgZDcsICBkXGQKKy5lbHNlCisgICAgICAgIHZzdWIuczMyICAgICAgICBkNCwgIGQ0LCAgZFxhCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDZ9LCAgW3IyLDo2NF0sIHIxMgorICAgICAgICB2c3ViLnMzMiAgICAgICAgZDUsICBkNSwgIGRcYgorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q3fSwgIFtyMiw6NjRdLCByMTIKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIGQ2LCAgZDYsICBkXGMKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIGQ3LCAgZDcsICBkXGQKKy5lbmRpZgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxMFtdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxMFsxXX0sIFtyMCw6MzJdLCByMQorICAgICAgICB2cnNoci5zMzIgICAgICAgcTIsICBxMiwgICM2CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDExW119LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZyc2hyLnMzMiAgICAgICBxMywgIHEzLCAgIzYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTFbMV19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMiwgIHEyLCAgZDEwCisgICAgICAgIHZhZGR3LnUxNiAgICAgICBxMywgIHEzLCAgZDExCisgICAgICAgIHZxbW92dW4uczMyICAgICBkNCwgIHEyCisgICAgICAgIHZxbW92dW4uczMyICAgICBkNSwgIHEzCisgICAgICAgIHZtaW4udTE2ICAgICAgICBxMiwgIHEyLCAgcTQKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNFsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNVswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNVsxXX0sICBbcjAsOjMyXSwgcjEKKy5lbmRtCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICAzMSwgMzAsIDI5LCAyOAorICAgICAgICBsb2FkX2FjY19zdG9yZSAgMjcsIDI2LCAyNSwgMjQKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIDIzLCAyMiwgMjEsIDIwCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICAxOSwgMTgsIDE3LCAxNgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIxMgorICAgICAgICBuZWcgICAgICAgICAgICAgcjEyLCByMTIKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIDE2LCAxNywgMTgsIDE5LCAxCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICAyMCwgMjEsIDIyLCAyMywgMQorICAgICAgICBsb2FkX2FjY19zdG9yZSAgMjQsIDI1LCAyNiwgMjcsIDEKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIDI4LCAyOSwgMzAsIDMxLCAxCisucHVyZ2VtIGxvYWRfYWNjX3N0b3JlCisgICAgICAgIEAgTGVuZ3RoZW4gdGhlIGlkY3QxNiBjb2VmZnMgYmFjayBpbnRvIDMyIGJpdCBmb3JtCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMiwgIGQyCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMywgIGQzCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cGN9CitlbmRmdW5jCisuZW5kbQorCitpZGN0MzJfZnVuY3MKK2lkY3QzMl9mdW5jcyBfcXVhcnRlcgoraWRjdDMyX2Z1bmNzIF9oYWxmCisKK2NvbnN0IG1pbl9lb2JfaWRjdF9pZGN0XzMyLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgMCwgMywgOSwgMjEsIDM0LCA1MSwgNzAsIDk4LCAxMzUsIDE3NiwgMjQwLCAyNTgsIDMzNiwgMzU3LCA0NDgsIDQ3MgorZW5kY29uc3QKKworZnVuY3Rpb24gdnA5X2lkY3RfaWRjdF8zMngzMl9hZGRfMTZfbmVvbgorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMQorICAgICAgICBiZXEgICAgICAgICAgICAgaWRjdDMyeDMyX2RjX2FkZF9uZW9uCisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIG1vdnJlbCAgICAgICAgICByOCwgIG1pbl9lb2JfaWRjdF9pZGN0XzMyICsgMgorCisgICAgICAgIEAgQWxpZ24gdGhlIHN0YWNrLCBhbGxvY2F0ZSBhIHRlbXAgYnVmZmVyCitUICAgICAgIG1vdiAgICAgICAgICAgICByNywgIHNwCitUICAgICAgIGFuZCAgICAgICAgICAgICByNywgIHI3LCAgIzE1CitBICAgICAgIGFuZCAgICAgICAgICAgICByNywgIHNwLCAgIzE1CisgICAgICAgIGFkZCAgICAgICAgICAgICByNywgIHI3LCAgIzQwOTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHNwLCAgc3AsICByNworCisgICAgICAgIG1vdiAgICAgICAgICAgICByNCwgIHIwCisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgIHIxCisgICAgICAgIG1vdiAgICAgICAgICAgICByNiwgIHIyCisKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWRjdF9jb2VmZnMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMC1xMX0sIFtyMTIsOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTYtcTd9LCBbcjEyLDoxMjhdCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMiwgIGQyCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMywgIGQzCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMSwgIGQxCisgICAgICAgIHZtb3ZsLnMxNiAgICAgICBxMCwgIGQwCisKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzM0CisgICAgICAgIGJsZSAgICAgICAgICAgICBpZGN0MzJ4MzJfcXVhcnRlcl9hZGRfMTZfbmVvbgorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMTM1CisgICAgICAgIGJsZSAgICAgICAgICAgICBpZGN0MzJ4MzJfaGFsZl9hZGRfMTZfbmVvbgorCisuaXJwIGksIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICBzcCwgICMoXGkqMTI4KQorLmlmIFxpID4gMAorICAgICAgICBsZHJoX3Bvc3QgICAgICAgcjEsICByOCwgICMyCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgIHIxCisgICAgICAgIGl0ICAgICAgICAgICAgICBsZQorICAgICAgICBtb3ZsZSAgICAgICAgICAgcjEsICAjKDMyIC0gXGkpLzIKKyAgICAgICAgYmxlICAgICAgICAgICAgIDFmCisuZW5kaWYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjYsICAjKFxpKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfMngzMl9wYXNzMV9uZW9uCisuZW5kcgorICAgICAgICBiICAgICAgICAgICAgICAgM2YKKworMToKKyAgICAgICAgQCBXcml0ZSB6ZXJvcyB0byB0aGUgdGVtcCBidWZmZXIgZm9yIHBhc3MgMgorICAgICAgICB2bW92LmkxNiAgICAgICAgcTE0LCAjMAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTE1LCAjMAorMjoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxLCAgcjEsICAjMQorLnJlcHQgMgorICAgICAgICBAIEZpbGwgb25lIGxpbmUgd2l0aCB6ZXJvcworICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExNC1xMTV9LCBbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTE0LXExNX0sIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTQtcTE1fSwgW3IwLDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExNC1xMTV9LCBbcjAsOjEyOF0hCisuZW5kcgorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKzM6CisuaXJwIGksIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMoXGkqMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgc3AsICAjKFxpKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfMngzMl9wYXNzMl9uZW9uCisuZW5kcgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSxwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2lkY3RfaWRjdF8zMngzMl9hZGRfMTBfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOSxscn0KKyAgICAgICAgbW92dyAgICAgICAgICAgIHI5LCAgIzB4MDNmZgorICAgICAgICBiICAgICAgICAgICAgICAgdnA5X2lkY3RfaWRjdF8zMngzMl9hZGRfMTZfbmVvbgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfaWRjdF9pZGN0XzMyeDMyX2FkZF8xMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI5LGxyfQorICAgICAgICBtb3Z3ICAgICAgICAgICAgcjksICAjMHgwZmZmCisgICAgICAgIGIgICAgICAgICAgICAgICB2cDlfaWRjdF9pZGN0XzMyeDMyX2FkZF8xNl9uZW9uCitlbmRmdW5jCisKKy5tYWNybyBpZGN0MzJfcGFydGlhbCBzaXplLCByb3dzCitmdW5jdGlvbiBpZGN0MzJ4MzJfXHNpemVcKClfYWRkXzE2X25lb24KKy5pcnAgaSwgMCwgMiwgNCwgNgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICBzcCwgICMoXGkqMTI4KQorLmlmYyBcc2l6ZSxxdWFydGVyCisuaWYgXGkgPiAwCisgICAgICAgIGxkcmhfcG9zdCAgICAgICByMSwgIHI4LCAgIzIKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgcjEKKyAgICAgICAgaXQgICAgICAgICAgICAgIGxlCisgICAgICAgIG1vdmxlICAgICAgICAgICByMSwgICMoXHJvd3MgLSBcaSkvMgorICAgICAgICBibGUgICAgICAgICAgICAgMWYKKy5lbmRpZgorLmVuZGlmCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHI2LCAgIyhcaSo0KQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyXzFkXzJ4MzJfcGFzczFfXHNpemVcKClfbmVvbgorLmVuZHIKKy5pZmMgXHNpemUsaGFsZgorICAgICAgICBhZGQgICAgICAgICAgICAgcjgsICByOCwgICM4CisuaXJwIGksIDgsIDEwLCAxMiwgMTQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjKFxpKjEyOCkKKy5pZiBcaSA+IDgKKyAgICAgICAgbGRyaF9wb3N0ICAgICAgIHIxLCAgcjgsICAjMgorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICByMQorICAgICAgICBpdCAgICAgICAgICAgICAgbGUKKyAgICAgICAgbW92bGUgICAgICAgICAgIHIxLCAgIyhccm93cyAtIFxpKS8yCisgICAgICAgIGJsZSAgICAgICAgICAgICAxZgorLmVuZGlmCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHI2LCAgIyhcaSo0KQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyXzFkXzJ4MzJfcGFzczFfXHNpemVcKClfbmVvbgorLmVuZHIKKy5lbmRpZgorICAgICAgICBiICAgICAgICAgICAgICAgM2YKKworMToKKyAgICAgICAgQCBXcml0ZSB6ZXJvcyB0byB0aGUgdGVtcCBidWZmZXIgZm9yIHBhc3MgMgorICAgICAgICB2bW92LmkxNiAgICAgICAgcTE0LCAjMAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTE1LCAjMAorMjoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxLCAgcjEsICAjMQorLnJlcHQgMgorICAgICAgICBAIEZpbGwgb25lIGxpbmUgd2l0aCB6ZXJvcworICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExNC1xMTV9LCBbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTE0LXExNX0sIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTQtcTE1fSwgW3IwLDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExNC1xMTV9LCBbcjAsOjEyOF0hCisuZW5kcgorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKzM6CisuaXJwIGksIDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTQsIDE2LCAxOCwgMjAsIDIyLCAyNCwgMjYsIDI4LCAzMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMoXGkqMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgc3AsICAjKFxpKjQpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfMngzMl9wYXNzMl9cc2l6ZVwoKV9uZW9uCisuZW5kcgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSxwY30KK2VuZGZ1bmMKKy5lbmRtCisKK2lkY3QzMl9wYXJ0aWFsIHF1YXJ0ZXIsIDgKK2lkY3QzMl9wYXJ0aWFsIGhhbGYsIDE2CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS92cDlpdHhmbV9uZW9uLlMgYi9saWJhdmNvZGVjL2FybS92cDlpdHhmbV9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwOTkyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYXJtL3ZwOWl0eGZtX25lb24uUwpAQCAtMCwwICsxLDE2ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisjaW5jbHVkZSAibmVvbi5TIgorCitjb25zdCBpdHhmbTRfY29lZmZzLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgMTE1ODUsIDAsIDYyNzAsIDE1MTM3CitpYWRzdDRfY29lZmZzOgorICAgICAgICAuc2hvcnQgIDUyODMsIDE1MjEyLCA5OTI5LCAxMzM3NworZW5kY29uc3QKKworY29uc3QgaWFkc3Q4X2NvZWZmcywgYWxpZ249NAorICAgICAgICAuc2hvcnQgIDE2MzA1LCAxNjA2LCAxNDQ0OSwgNzcyMywgMTAzOTQsIDEyNjY1LCA0NzU2LCAxNTY3OQoraWRjdF9jb2VmZnM6CisgICAgICAgIC5zaG9ydCAgMTE1ODUsIDAsIDYyNzAsIDE1MTM3LCAzMTk2LCAxNjA2OSwgMTM2MjMsIDkxMDIKKyAgICAgICAgLnNob3J0ICAxNjA2LCAxNjMwNSwgMTI2NjUsIDEwMzk0LCA3NzIzLCAxNDQ0OSwgMTU2NzksIDQ3NTYKKyAgICAgICAgLnNob3J0ICA4MDQsIDE2MzY0LCAxMjE0MCwgMTEwMDMsIDcwMDUsIDE0ODExLCAxNTQyNiwgNTUyMAorICAgICAgICAuc2hvcnQgIDM5ODEsIDE1ODkzLCAxNDA1MywgODQyMywgOTc2MCwgMTMxNjAsIDE2MjA3LCAyNDA0CitlbmRjb25zdAorCitjb25zdCBpYWRzdDE2X2NvZWZmcywgYWxpZ249NAorICAgICAgICAuc2hvcnQgIDE2MzY0LCA4MDQsIDE1ODkzLCAzOTgxLCAxMTAwMywgMTIxNDAsIDg0MjMsIDE0MDUzCisgICAgICAgIC5zaG9ydCAgMTQ4MTEsIDcwMDUsIDEzMTYwLCA5NzYwLCA1NTIwLCAxNTQyNiwgMjQwNCwgMTYyMDcKK2VuZGNvbnN0CisKK0AgRG8gZm91ciA0eDQgdHJhbnNwb3NlcywgdXNpbmcgcSByZWdpc3RlcnMgZm9yIHRoZSBzdWJ0cmFuc3Bvc2VzIHRoYXQgZG9uJ3QKK0AgbmVlZCB0byBhZGRyZXNzIHRoZSBpbmRpdmlkdWFsIGQgcmVnaXN0ZXJzLgorQCByMCxyMSA9PSBycTEsIHIyLHIzID09IHJxMSwgZXRjCisubWFjcm8gdHJhbnNwb3NlMTZfcV80eF80eDQgcnEwLCBycTEsIHJxMiwgcnEzLCBycTQsIHJxNSwgcnE2LCBycTcsIHIwLCByMSwgcjIsIHIzLCByNCwgcjUsIHI2LCByNywgcjgsIHI5LCByMTAsIHIxMSwgcjEyLCByMTMsIHIxNCwgcjE1CisgICAgICAgIHZ0cm4uMzIgICAgICAgICAgXHJxMCwgXHJxMQorICAgICAgICB2dHJuLjMyICAgICAgICAgIFxycTIsIFxycTMKKyAgICAgICAgdnRybi4zMiAgICAgICAgICBccnE0LCBccnE1CisgICAgICAgIHZ0cm4uMzIgICAgICAgICAgXHJxNiwgXHJxNworICAgICAgICB2dHJuLjE2ICAgICAgICAgIFxyMCwgIFxyMQorICAgICAgICB2dHJuLjE2ICAgICAgICAgIFxyMiwgIFxyMworICAgICAgICB2dHJuLjE2ICAgICAgICAgIFxyNCwgIFxyNQorICAgICAgICB2dHJuLjE2ICAgICAgICAgIFxyNiwgIFxyNworICAgICAgICB2dHJuLjE2ICAgICAgICAgIFxyOCwgIFxyOQorICAgICAgICB2dHJuLjE2ICAgICAgICAgIFxyMTAsIFxyMTEKKyAgICAgICAgdnRybi4xNiAgICAgICAgICBccjEyLCBccjEzCisgICAgICAgIHZ0cm4uMTYgICAgICAgICAgXHIxNCwgXHIxNQorLmVuZG0KKworQCBvdXQxID0gKChpbjEgKyBpbjIpICogZDBbMF0gKyAoMSA8PCAxMykpID4+IDE0CitAIG91dDIgPSAoKGluMSAtIGluMikgKiBkMFswXSArICgxIDw8IDEzKSkgPj4gMTQKK0AgaW4vb3V0IGFyZSBkIHJlZ2lzdGVycworLm1hY3JvIG1idXR0ZXJmbHkwIG91dDEsIG91dDIsIGluMSwgaW4yLCB0bXBkMSwgdG1wZDIsIHRtcHEzLCB0bXBxNCwgbmVnPTAKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIFx0bXBkMSwgXGluMSwgIFxpbjIKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIFx0bXBkMiwgXGluMSwgIFxpbjIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIFx0bXBxMywgXHRtcGQxLCBkMFswXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXHRtcHE0LCBcdG1wZDIsIGQwWzBdCisuaWYgXG5lZyA+IDAKKyAgICAgICAgdm5lZy5zMzIgICAgICAgIFx0bXBxMywgXHRtcHEzCisuZW5kaWYKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxvdXQxLCBcdG1wcTMsICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgXG91dDIsIFx0bXBxNCwgIzE0CisuZW5kbQorCitAIFNhbWUgYXMgbWJ1dHRlcmZseTAgYWJvdmUsIGJ1dCB0cmVhdGluZyB0aGUgaW5wdXQgaW4gaW4yIGFzIHplcm8sCitAIHdyaXRpbmcgdGhlIHNhbWUgb3V0cHV0IGludG8gYm90aCBvdXQxIGFuZCBvdXQyLgorLm1hY3JvIG1idXR0ZXJmbHkwX2ggb3V0MSwgb3V0MiwgaW4xLCBpbjIsIHRtcGQxLCB0bXBkMiwgdG1wcTMsIHRtcHE0CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBcdG1wcTMsIFxpbjEsIGQwWzBdCisgICAgICAgIHZyc2hybi5zMzIgICAgICBcb3V0MSwgIFx0bXBxMywgIzE0CisgICAgICAgIHZyc2hybi5zMzIgICAgICBcb3V0MiwgIFx0bXBxMywgIzE0CisuZW5kbQorCitAIG91dDEsb3V0MiA9ICgoaW4xICsgaW4yKSAqIGQwWzBdICsgKDEgPDwgMTMpKSA+PiAxNAorQCBvdXQzLG91dDQgPSAoKGluMSAtIGluMikgKiBkMFswXSArICgxIDw8IDEzKSkgPj4gMTQKK0AgU2FtZSBhcyBtYnV0dGVyZmx5MCwgYnV0IHdpdGggaW5wdXQgYmVpbmcgMiBxIHJlZ2lzdGVycywgb3V0cHV0CitAIGJlaW5nIDQgZCByZWdpc3RlcnMuCitAIFRoaXMgY2FuIGRvIHdpdGggZWl0aGVyIDQgb3IgNiB0ZW1wb3JhcnkgcSByZWdpc3RlcnMuCisubWFjcm8gZG1idXR0ZXJmbHkwIG91dDEsIG91dDIsIG91dDMsIG91dDQsIGluMSwgaW4yLCB0bXBxMSwgdG1wcTIsIHRtcGQxMSwgdG1wZDEyLCB0bXBkMjEsIHRtcGQyMiwgdG1wcTMsIHRtcHE0LCB0bXBxNSwgdG1wcTYKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIFx0bXBxMSwgXGluMSwgIFxpbjIKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIFx0bXBxMiwgXGluMSwgIFxpbjIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIFx0bXBxMywgXHRtcGQxMSwgZDBbMF0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIFx0bXBxNCwgXHRtcGQxMiwgZDBbMF0KKy5pZmIgXHRtcHE1CisgICAgICAgIHZyc2hybi5zMzIgICAgICBcb3V0MSwgXHRtcHEzLCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxvdXQyLCBcdG1wcTQsICMxNAorICAgICAgICB2bXVsbC5zMTYgICAgICAgXHRtcHEzLCBcdG1wZDIxLCBkMFswXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXHRtcHE0LCBcdG1wZDIyLCBkMFswXQorICAgICAgICB2cnNocm4uczMyICAgICAgXG91dDMsIFx0bXBxMywgIzE0CisgICAgICAgIHZyc2hybi5zMzIgICAgICBcb3V0NCwgXHRtcHE0LCAjMTQKKy5lbHNlCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBcdG1wcTUsIFx0bXBkMjEsIGQwWzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBcdG1wcTYsIFx0bXBkMjIsIGQwWzBdCisgICAgICAgIHZyc2hybi5zMzIgICAgICBcb3V0MSwgXHRtcHEzLCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxvdXQyLCBcdG1wcTQsICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgXG91dDMsIFx0bXBxNSwgIzE0CisgICAgICAgIHZyc2hybi5zMzIgICAgICBcb3V0NCwgXHRtcHE2LCAjMTQKKy5lbmRpZgorLmVuZG0KKworQCBvdXQxID0gaW4xICogY29lZjEgLSBpbjIgKiBjb2VmMgorQCBvdXQyID0gaW4xICogY29lZjIgKyBpbjIgKiBjb2VmMQorQCBvdXQgYXJlIDIgcSByZWdpc3RlcnMsIGluIGFyZSAyIGQgcmVnaXN0ZXJzCisubWFjcm8gbWJ1dHRlcmZseV9sIG91dDEsIG91dDIsIGluMSwgaW4yLCBjb2VmMSwgY29lZjIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIFxvdXQxLCBcaW4xLCBcY29lZjEKKyAgICAgICAgdm1sc2wuczE2ICAgICAgIFxvdXQxLCBcaW4yLCBcY29lZjIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIFxvdXQyLCBcaW4xLCBcY29lZjIKKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxvdXQyLCBcaW4yLCBcY29lZjEKKy5lbmRtCisKK0Agb3V0MSxvdXQyID0gaW4xLGluMiAqIGNvZWYxIC0gaW4zLGluNCAqIGNvZWYyCitAIG91dDMsb3V0NCA9IGluMSxpbjIgKiBjb2VmMiArIGluMyxpbjQgKiBjb2VmMQorQCBvdXQgYXJlIDQgcSByZWdpc3RlcnMsIGluIGFyZSA0IGQgcmVnaXN0ZXJzCisubWFjcm8gZG1idXR0ZXJmbHlfbCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBpbjEsIGluMiwgaW4zLCBpbjQsIGNvZWYxLCBjb2VmMgorICAgICAgICB2bXVsbC5zMTYgICAgICAgXG91dDEsIFxpbjEsIFxjb2VmMQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXG91dDIsIFxpbjIsIFxjb2VmMQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXG91dDMsIFxpbjEsIFxjb2VmMgorICAgICAgICB2bXVsbC5zMTYgICAgICAgXG91dDQsIFxpbjIsIFxjb2VmMgorICAgICAgICB2bWxzbC5zMTYgICAgICAgXG91dDEsIFxpbjMsIFxjb2VmMgorICAgICAgICB2bWxzbC5zMTYgICAgICAgXG91dDIsIFxpbjQsIFxjb2VmMgorICAgICAgICB2bWxhbC5zMTYgICAgICAgXG91dDMsIFxpbjMsIFxjb2VmMQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXG91dDQsIFxpbjQsIFxjb2VmMQorLmVuZG0KKworQCBpbm91dDEgPSAoaW5vdXQxICogY29lZjEgLSBpbm91dDIgKiBjb2VmMiArICgxIDw8IDEzKSkgPj4gMTQKK0AgaW5vdXQyID0gKGlub3V0MSAqIGNvZWYyICsgaW5vdXQyICogY29lZjEgKyAoMSA8PCAxMykpID4+IDE0CitAIGlub3V0IGFyZSAyIGQgcmVnaXN0ZXJzLCB0bXAgYXJlIDIgcSByZWdpc3RlcnMKKy5tYWNybyBtYnV0dGVyZmx5IGlub3V0MSwgaW5vdXQyLCBjb2VmMSwgY29lZjIsIHRtcDEsIHRtcDIsIG5lZz0wCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBcdG1wMSwgXHRtcDIsIFxpbm91dDEsIFxpbm91dDIsIFxjb2VmMSwgXGNvZWYyCisuaWYgXG5lZyA+IDAKKyAgICAgICAgdm5lZy5zMzIgICAgICAgIFx0bXAyLCBcdG1wMgorLmVuZGlmCisgICAgICAgIHZyc2hybi5zMzIgICAgICBcaW5vdXQxLCBcdG1wMSwgICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgXGlub3V0MiwgXHRtcDIsICAjMTQKKy5lbmRtCisKK0AgU2FtZSBhcyBtYnV0dGVyZmx5IGFib3ZlLCBidXQgdHJlYXRpbmcgdGhlIGlucHV0IGluIGlub3V0MiBhcyB6ZXJvCisubWFjcm8gbWJ1dHRlcmZseV9oMSBpbm91dDEsIGlub3V0MiwgY29lZjEsIGNvZWYyLCB0bXAxLCB0bXAyCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBcdG1wMSwgICBcaW5vdXQxLCBcY29lZjEKKyAgICAgICAgdm11bGwuczE2ICAgICAgIFx0bXAyLCAgIFxpbm91dDEsIFxjb2VmMgorICAgICAgICB2cnNocm4uczMyICAgICAgXGlub3V0MSwgXHRtcDEsICAgIzE0CisgICAgICAgIHZyc2hybi5zMzIgICAgICBcaW5vdXQyLCBcdG1wMiwgICAjMTQKKy5lbmRtCisKK0AgU2FtZSBhcyBtYnV0dGVyZmx5IGFib3ZlLCBidXQgdHJlYXRpbmcgdGhlIGlucHV0IGluIGlub3V0MSBhcyB6ZXJvCisubWFjcm8gbWJ1dHRlcmZseV9oMiBpbm91dDEsIGlub3V0MiwgY29lZjEsIGNvZWYyLCB0bXAxLCB0bXAyCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBcdG1wMSwgICBcaW5vdXQyLCBcY29lZjIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIFx0bXAyLCAgIFxpbm91dDIsIFxjb2VmMQorICAgICAgICB2bmVnLnMzMiAgICAgICAgXHRtcDEsICAgXHRtcDEKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxpbm91dDIsIFx0bXAyLCAgICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgXGlub3V0MSwgXHRtcDEsICAgIzE0CisuZW5kbQorCitAIGlub3V0MSxpbm91dDIgPSAoaW5vdXQxLGlub3V0MiAqIGNvZWYxIC0gaW5vdXQzLGlub3V0NCAqIGNvZWYyICsgKDEgPDwgMTMpKSA+PiAxNAorQCBpbm91dDMsaW5vdXQ0ID0gKGlub3V0MSxpbm91dDIgKiBjb2VmMiArIGlub3V0Myxpbm91dDQgKiBjb2VmMSArICgxIDw8IDEzKSkgPj4gMTQKK0AgaW5vdXQgYXJlIDQgZCByZWdpc3RlcnMsIHRtcCBhcmUgNCBxIHJlZ2lzdGVycworLm1hY3JvIGRtYnV0dGVyZmx5IGlub3V0MSwgaW5vdXQyLCBpbm91dDMsIGlub3V0NCwgY29lZjEsIGNvZWYyLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0CisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBcdG1wMSwgXHRtcDIsIFx0bXAzLCBcdG1wNCwgXGlub3V0MSwgXGlub3V0MiwgXGlub3V0MywgXGlub3V0NCwgXGNvZWYxLCBcY29lZjIKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxpbm91dDEsIFx0bXAxLCAgIzE0CisgICAgICAgIHZyc2hybi5zMzIgICAgICBcaW5vdXQyLCBcdG1wMiwgICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgXGlub3V0MywgXHRtcDMsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxpbm91dDQsIFx0bXA0LCAgIzE0CisuZW5kbQorCitAIG91dDEgPSBpbjEgKyBpbjIKK0Agb3V0MiA9IGluMSAtIGluMgorLm1hY3JvIGJ1dHRlcmZseSBvdXQxLCBvdXQyLCBpbjEsIGluMgorICAgICAgICB2YWRkLnMxNiAgICAgICAgXG91dDEsIFxpbjEsIFxpbjIKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIFxvdXQyLCBcaW4xLCBcaW4yCisuZW5kbQorCitAIG91dDEgPSBpbjEgLSBpbjIKK0Agb3V0MiA9IGluMSArIGluMgorLm1hY3JvIGJ1dHRlcmZseV9yIG91dDEsIG91dDIsIGluMSwgaW4yCisgICAgICAgIHZzdWIuczE2ICAgICAgICBcb3V0MSwgXGluMSwgXGluMgorICAgICAgICB2YWRkLnMxNiAgICAgICAgXG91dDIsIFxpbjEsIFxpbjIKKy5lbmRtCisKK0Agb3V0MSA9IChpbjEgKyBpbjIgKyAoMSA8PCAxMykpID4+IDE0CitAIG91dDIgPSAoaW4xIC0gaW4yICsgKDEgPDwgMTMpKSA+PiAxNAorQCBvdXQgYXJlIDIgZCByZWdpc3RlcnMsIGluIGFyZSAyIHEgcmVnaXN0ZXJzLCB0bXAgYXJlIDIgcSByZWdpc3RlcnMKKy5tYWNybyBidXR0ZXJmbHlfbiBvdXQxLCBvdXQyLCBpbjEsIGluMiwgdG1wMSwgdG1wMgorICAgICAgICB2YWRkLnMzMiAgICAgICAgXHRtcDEsIFxpbjEsIFxpbjIKKyAgICAgICAgdnN1Yi5zMzIgICAgICAgIFx0bXAyLCBcaW4xLCBcaW4yCisgICAgICAgIHZyc2hybi5zMzIgICAgICBcb3V0MSwgXHRtcDEsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxvdXQyLCBcdG1wMiwgICMxNAorLmVuZG0KKworQCBvdXQxLG91dDIgPSAoaW4xLGluMiArIGluMyxpbjQgKyAoMSA8PCAxMykpID4+IDE0CitAIG91dDMsb3V0NCA9IChpbjEsaW4yIC0gaW4zLGluNCArICgxIDw8IDEzKSkgPj4gMTQKK0Agb3V0IGFyZSA0IGQgcmVnaXN0ZXJzLCBpbiBhcmUgNCBxIHJlZ2lzdGVycywgdG1wIGFyZSA0IHEgcmVnaXN0ZXJzCisubWFjcm8gZGJ1dHRlcmZseV9uIG91dDEsIG91dDIsIG91dDMsIG91dDQsIGluMSwgaW4yLCBpbjMsIGluNCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNAorICAgICAgICB2YWRkLnMzMiAgICAgICAgXHRtcDEsIFxpbjEsIFxpbjMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIFx0bXAyLCBcaW4yLCBcaW40CisgICAgICAgIHZzdWIuczMyICAgICAgICBcdG1wMywgXGluMSwgXGluMworICAgICAgICB2c3ViLnMzMiAgICAgICAgXHRtcDQsIFxpbjIsIFxpbjQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxvdXQxLCBcdG1wMSwgICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgXG91dDIsIFx0bXAyLCAgIzE0CisgICAgICAgIHZyc2hybi5zMzIgICAgICBcb3V0MywgXHRtcDMsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxvdXQ0LCBcdG1wNCwgICMxNAorLmVuZG0KKworCisubWFjcm8gaXdodDQgYzAsIGMxLCBjMiwgYzMKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIFxjMCwgIFxjMCwgIFxjMQorICAgICAgICB2c3ViLmkxNiAgICAgICAgZDE3LCAgXGMyLCAgXGMzCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBkMTYsICBcYzAsICBkMTcKKyAgICAgICAgdnNoci5zMTYgICAgICAgIGQxNiwgIGQxNiwgICMxCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBcYzIsICBkMTYsICBcYzEKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIFxjMSwgIGQxNiwgIFxjMworICAgICAgICB2YWRkLmkxNiAgICAgICAgXGMzLCAgZDE3LCAgXGMyCisgICAgICAgIHZzdWIuaTE2ICAgICAgICBcYzAsICBcYzAsICBcYzEKKy5lbmRtCisKKy5tYWNybyBpZGN0NCBjMCwgYzEsIGMyLCBjMworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEzLCAgXGMxLCAgZDBbM10KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMSwgIFxjMSwgIGQwWzJdCisgICAgICAgIHZhZGQuaTE2ICAgICAgICBkMTYsICBcYzAsICBcYzIKKyAgICAgICAgdnN1Yi5pMTYgICAgICAgIGQxNywgIFxjMCwgIFxjMgorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTEzLCAgXGMzLCAgZDBbMl0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE5LCAgIGQxNiwgIGQwWzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTAsICBkMTcsICBkMFswXQorICAgICAgICB2bWxzbC5zMTYgICAgICAgcTExLCAgXGMzLCAgZDBbM10KKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyNiwgIHExMywgICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgZDE4LCAgcTksICAgIzE0CisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMjAsICBxMTAsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyMiwgIHExMSwgICMxNAorICAgICAgICB2YWRkLmkxNiAgICAgICAgXGMwLCAgZDE4LCAgZDI2CisgICAgICAgIHZzdWIuaTE2ICAgICAgICBcYzMsICBkMTgsICBkMjYKKyAgICAgICAgdmFkZC5pMTYgICAgICAgIFxjMSwgIGQyMCwgIGQyMgorICAgICAgICB2c3ViLmkxNiAgICAgICAgXGMyLCAgZDIwLCAgZDIyCisuZW5kbQorCisubWFjcm8gaWFkc3Q0IGMwLCBjMSwgYzIsIGMzCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTAsICBcYzAsICBkMVswXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgcTEwLCAgXGMyLCAgZDFbMV0KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIHExMCwgIFxjMywgIGQxWzJdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTEsICBcYzAsICBkMVsyXQorICAgICAgICB2bWxzbC5zMTYgICAgICAgcTExLCAgXGMyLCAgZDFbMF0KKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIFxjMCwgIFxjMCwgIFxjMgorICAgICAgICB2bWxzbC5zMTYgICAgICAgcTExLCAgXGMzLCAgZDFbMV0KKyAgICAgICAgdmFkZC5zMTYgICAgICAgIFxjMCwgIFxjMCwgIFxjMworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEzLCAgXGMxLCAgZDFbM10KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMiwgIFxjMCwgIGQxWzNdCisgICAgICAgIHZhZGQuczMyICAgICAgICBxMTQsICBxMTAsICBxMTMKKyAgICAgICAgdmFkZC5zMzIgICAgICAgIHExLCAgIHExMSwgIHExMworICAgICAgICB2cnNocm4uczMyICAgICAgXGMwLCAgcTE0LCAgIzE0CisgICAgICAgIHZhZGQuczMyICAgICAgICBxMTAsICBxMTAsICBxMTEKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxjMSwgIHExLCAgICMxNAorICAgICAgICB2c3ViLnMzMiAgICAgICAgcTEwLCAgcTEwLCAgcTEzCisgICAgICAgIHZyc2hybi5zMzIgICAgICBcYzIsICBxMTIsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIFxjMywgIHExMCwgICMxNAorLmVuZG0KKworQCBUaGUgcHVibGljIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgaGF2ZSBnb3QgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CitAIHZvaWQgaXR4Zm1fYWRkKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpOworCisubWFjcm8gaXR4Zm1fZnVuYzR4NCB0eGZtMSwgdHhmbTIKK2Z1bmN0aW9uIGZmX3ZwOV9cdHhmbTFcKClfXHR4Zm0yXCgpXzR4NF9hZGRfbmVvbiwgZXhwb3J0PTEKKy5pZmMgXHR4Zm0xLFx0eGZtMgorLmlmYyBcdHhmbTEsaWRjdAorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEyLCBpdHhmbTRfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjEyLDo2NF0KKy5lbmRpZgorLmlmYyBcdHhmbTEsaWFkc3QKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWFkc3Q0X2NvZWZmcworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxfSwgW3IxMiw6NjRdCisuZW5kaWYKKy5lbHNlCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGl0eGZtNF9jb2VmZnMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sIFtyMTIsOjEyOF0KKy5lbmRpZgorCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMTUsICMwCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxZgorICAgICAgICBAIERDLW9ubHkgZm9yIGlkY3QvaWRjdAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q0W119LCAgIFtyMiw6MTZdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMiwgIGQ0LCAgZDBbMF0KKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQ0LCAgcTIsICAjMTQKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHEyLCAgZDQsICBkMFswXQorICAgICAgICB2cnNocm4uczMyICAgICAgZDQsICBxMiwgICMxNAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzMFswXX0sIFtyMiw6MTZdCisgICAgICAgIHZkdXAuMTYgICAgICAgICBxMiwgIGQ0WzBdCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMywgIHEyCisgICAgICAgIGIgICAgICAgICAgICAgICAyZgorLmVuZGlmCisKKzE6CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDQtZDd9LCAgW3IyLDoxMjhdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTE1fSwgW3IyLDoxMjhdIQorCisuaWZjIFx0eGZtMSxpd2h0CisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMiwgIHEyLCAgIzIKKyAgICAgICAgdnNoci5zMTYgICAgICAgIHEzLCAgcTMsICAjMgorLmVuZGlmCisKKyAgICAgICAgXHR4Zm0xXCgpNCAgICAgIGQ0LCAgZDUsICBkNiwgIGQ3CisKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCBbcjIsOjEyOF0hCisgICAgICAgIEAgVHJhbnNwb3NlIDR4NCB3aXRoIDE2IGJpdCBlbGVtZW50cworICAgICAgICB2dHJuLjE2ICAgICAgICAgZDQsICBkNQorICAgICAgICB2dHJuLjE2ICAgICAgICAgZDYsICBkNworICAgICAgICB2dHJuLjMyICAgICAgICAgcTIsICBxMworCisgICAgICAgIFx0eGZtMlwoKTQgICAgICBkNCwgIGQ1LCAgZDYsICBkNworMjoKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMFtdfSwgICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMFsxXX0sICBbcjAsOjMyXSwgcjEKKy5pZm5jIFx0eGZtMSxpd2h0CisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxMiwgIHEyLCAgIzQKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHEzLCAgcTMsICAjNAorLmVuZGlmCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMiwgIHEyLCAgZDAKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMVtdfSwgICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMVsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQwLCAgcTIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisKKyAgICAgICAgdmFkZHcudTggICAgICAgIHEzLCAgcTMsICBkMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxMworCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDBbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMF19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDFbMV19LCAgW3IwLDozMl0sIHIxCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCitpdHhmbV9mdW5jNHg0IGlkY3QsICBpZGN0CitpdHhmbV9mdW5jNHg0IGlhZHN0LCBpZGN0CitpdHhmbV9mdW5jNHg0IGlkY3QsICBpYWRzdAoraXR4Zm1fZnVuYzR4NCBpYWRzdCwgaWFkc3QKK2l0eGZtX2Z1bmM0eDQgaXdodCwgIGl3aHQKKworCisubWFjcm8gaWRjdDgKKyAgICAgICAgZG1idXR0ZXJmbHkwICAgIGQxNiwgZDE3LCBkMjQsIGQyNSwgcTgsICBxMTIsIHEyLCBxNCwgZDQsIGQ1LCBkOCwgZDksIHEzLCBxMiwgcTUsIHE0IEAgcTggPSB0MGEsIHExMiA9IHQxYQorICAgICAgICBkbWJ1dHRlcmZseSAgICAgZDIwLCBkMjEsIGQyOCwgZDI5LCBkMFsyXSwgZDBbM10sIHEyLCAgcTMsICBxNCwgIHE1IEAgcTEwID0gdDJhLCBxMTQgPSB0M2EKKyAgICAgICAgZG1idXR0ZXJmbHkgICAgIGQxOCwgZDE5LCBkMzAsIGQzMSwgZDFbMF0sIGQxWzFdLCBxMiwgIHEzLCAgcTQsICBxNSBAIHE5ICA9IHQ0YSwgcTE1ID0gdDdhCisgICAgICAgIGRtYnV0dGVyZmx5ICAgICBkMjYsIGQyNywgZDIyLCBkMjMsIGQxWzJdLCBkMVszXSwgcTIsICBxMywgIHE0LCAgcTUgQCBxMTMgPSB0NWEsIHExMSA9IHQ2YQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxMiwgIHExNCwgcTgsICBxMTQgQCBxMiA9IHQwLCBxMTQgPSB0MworICAgICAgICBidXR0ZXJmbHkgICAgICAgcTMsICBxMTAsIHExMiwgcTEwIEAgcTMgPSB0MSwgcTEwID0gdDIKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIHE0LCAgcTEzLCBxOSwgIHExMyBAIHE0ID0gdDQsIHExMyA9IHQ1YQorICAgICAgICBidXR0ZXJmbHkgICAgICAgcTUsICBxMTEsIHExNSwgcTExIEAgcTUgPSB0NywgcTExID0gdDZhCisKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIHE4LCAgcTE1LCBxMiwgIHE1ICBAIHE4ID0gb3V0WzBdLCBxMTUgPSBvdXRbN10KKworICAgICAgICBkbWJ1dHRlcmZseTAgICAgZDQsICBkNSwgIGQxMCwgZDExLCBxMTEsIHExMywgcTksICBxMTMsIGQxOCwgZDE5LCBkMjYsIGQyNywgcTIsICBxNSwgcTExLCBxMTIgQCBxMiA9IHQ2LCBxNSA9IHQ1CisKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIHExMSwgcTEyLCBxMTQsIHE0ICBAIHExMSA9IG91dFszXSwgcTEyID0gb3V0WzRdCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxOSwgIHExNCwgcTMsICBxMiAgQCBxOSA9IG91dFsxXSwgIHExNCA9IG91dFs2XQorICAgICAgICBidXR0ZXJmbHlfciAgICAgcTEzLCBxMTAsIHExMCwgcTUgIEAgcTEzID0gb3V0WzVdLCBxMTAgPSBvdXRbMl0KKy5lbmRtCisKKy5tYWNybyBpYWRzdDgKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHE0LCAgcTUsICBxMiwgIHEzLCAgZDMwLCBkMzEsIGQxNiwgZDE3LCBkMlsxXSwgZDJbMF0gQCBxNCxxNSAgPSB0MWEsIHEyLHEzID0gdDBhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBxOCwgIHExNSwgcTYsICBxNywgIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDNbMV0sIGQzWzBdIEAgcTgscTE1ID0gdDVhLCBxNixxNyA9IHQ0YQorCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICBkMjIsIGQyMywgZDQsICBkNSwgIHEyLCAgcTMsICBxNiwgIHE3LCAgcTExLCBxMTIsIHEyLCAgcTMgQCBxMTEgPSB0MCwgcTIgPSB0NAorCisgICAgICAgIGRidXR0ZXJmbHlfbiAgICBkMjQsIGQyNSwgZDYsICBkNywgIHE0LCAgcTUsICBxOCwgIHExNSwgcTEyLCBxMywgIHE2LCAgcTcgQCBxMTIgPSB0MSwgcTMgPSB0NQorCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBxNiwgIHE3LCAgcTQsICBxNSwgIGQyNiwgZDI3LCBkMjAsIGQyMSwgZDJbM10sIGQyWzJdIEAgcTYscTcgPSB0M2EsIHE0LHE1ID0gdDJhCisgICAgICAgIGRtYnV0dGVyZmx5X2wgICBxMTAsIHExMywgcTgsICBxMTUsIGQxOCwgZDE5LCBkMjgsIGQyOSwgZDNbM10sIGQzWzJdIEAgcTEwLHExMyA9IHQ3YSwgcTgscTE1ID0gdDZhCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIGQxOCwgZDE5LCBkOCwgIGQ5LCAgcTQsICBxNSwgIHE4LCAgcTE1LCBxOSwgIHExNCwgcTQsIHE1IEAgcTkgPSB0MiwgcTQgPSB0NgorICAgICAgICBkYnV0dGVyZmx5X24gICAgZDE2LCBkMTcsIGQxMiwgZDEzLCBxNiwgIHE3LCAgcTEwLCBxMTMsIHE4LCAgcTE1LCBxNiwgcTcgQCBxOCA9IHQzLCBxNiA9IHQ3CisKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIHExNSwgcTEyLCBxMTIsIHE4IEAgcTE1ID0gLW91dFs3XSwgcTEyID0gdDMKKyAgICAgICAgdm5lZy5zMTYgICAgICAgIHExNSwgcTE1ICAgICAgICAgIEAgcTE1ID0gb3V0WzddCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBxOCwgIHE5LCAgcTExLCBxOSBAIHE4ID0gb3V0WzBdLCBxOSA9IHQyCisKKyAgICAgICAgZG1idXR0ZXJmbHlfbCAgIHExMCwgcTExLCBxNSwgIHE3LCAgZDQsICBkNSwgIGQ2LCAgZDcsICBkMFsyXSwgZDBbM10gQCBxMTAscTExID0gdDVhLCBxNSxxNyA9IHQ0YQorICAgICAgICBkbWJ1dHRlcmZseV9sICAgcTIsICBxMywgIHExMywgcTE0LCBkMTIsIGQxMywgZDgsICBkOSwgIGQwWzNdLCBkMFsyXSBAIHEyLHEzID0gdDZhLCBxMTMscTE0ID0gdDdhCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIGQyOCwgZDI5LCBkOCwgIGQ5LCAgcTEwLCBxMTEsIHExMywgcTE0LCBxNCwgIHE2LCAgcTEwLCBxMTEgQCBxMTQgPSBvdXRbNl0sIHE0ID0gdDcKKworICAgICAgICBkbWJ1dHRlcmZseTAgICAgZDIyLCBkMjMsIGQyNCwgZDI1LCBxOSwgIHExMiwgcTYsIHExMywgZDEyLCBkMTMsIGQyNiwgZDI3LCBxOSwgcTEwIEAgcTExID0gLW91dFszXSwgcTEyID0gb3V0WzRdCisgICAgICAgIHZuZWcuczE2ICAgICAgICBxMTEsIHExMSAgICAgIEAgcTExID0gb3V0WzNdCisKKyAgICAgICAgZGJ1dHRlcmZseV9uICAgIGQxOCwgZDE5LCBkNCwgIGQ1LCAgcTUsICBxNywgIHEyLCAgcTMsICBxOSwgcTEwLCBxMiwgIHEzIEAgcTkgPSAtb3V0WzFdLCBxMiA9IHQ2CisgICAgICAgIHZuZWcuczE2ICAgICAgICBxOSwgIHE5ICAgICAgIEAgcTkgPSBvdXRbMV0KKworICAgICAgICBkbWJ1dHRlcmZseTAgICAgZDIwLCBkMjEsIGQyNiwgZDI3LCBxMiwgIHE0LCAgcTMsIHE1LCAgZDYsICBkNywgIGQxMCwgZDExLCBxNiwgIHE3IEAgcTEwID0gb3V0WzJdLCBxMTMgPSAtb3V0WzVdCisgICAgICAgIHZuZWcuczE2ICAgICAgICBxMTMsIHExMyAgICAgIEAgcTEzID0gb3V0WzVdCisuZW5kbQorCisKKy5tYWNybyBpdHhmbV9mdW5jOHg4IHR4Zm0xLCB0eGZtMgorZnVuY3Rpb24gZmZfdnA5X1x0eGZtMVwoKV9cdHhmbTJcKClfOHg4X2FkZF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBAIFB1c2ggcTQtcTcgaWYgaWFkc3QgaXMgdXNlZCwgaWRjdCByZXF1aXJlcworICAgICAgICBAIGEgZmV3IHNjcmF0Y2ggcmVnaXN0ZXJzIGxlc3MsIHNvIG9ubHkgcHVzaCBxNC1xNQorICAgICAgICBAIGlmIG9ubHkgaWRjdCBpcyBpbnZvbHZlZC4KKyAgICAgICAgQCBUaGUgaWFkc3QgYWxzbyB1c2VzIGEgZmV3IGNvZWZmaWNpZW50cyBmcm9tCisgICAgICAgIEAgaWRjdCwgc28gdGhvc2UgYWx3YXlzIG5lZWQgdG8gYmUgbG9hZGVkLgorLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEyLCBpZGN0X2NvZWZmcworICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE1fQorLmVsc2UKKyAgICAgICAgbW92cmVsICAgICAgICAgIHIxMiwgaWFkc3Q4X2NvZWZmcworICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExfSwgW3IxMiw6MTI4XSEKKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtxNC1xN30KKy5lbmRpZgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgW3IxMiw6MTI4XQorCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMiwgIzAKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHEzLCAjMAorCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxZgorICAgICAgICBAIERDLW9ubHkgZm9yIGlkY3QvaWRjdAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxNltdfSwgW3IyLDoxNl0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE4LCAgZDE2LCBkMFswXQorICAgICAgICB2cnNocm4uczMyICAgICAgZDE2LCBxOCwgICMxNAorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTgsICBkMTYsIGQwWzBdCisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMTYsIHE4LCAgIzE0CisgICAgICAgIHZkdXAuMTYgICAgICAgICBxOCwgIGQxNlswXQorICAgICAgICB2bW92ICAgICAgICAgICAgcTksICBxOAorICAgICAgICB2bW92ICAgICAgICAgICAgcTEwLCBxOAorICAgICAgICB2bW92ICAgICAgICAgICAgcTExLCBxOAorICAgICAgICB2bW92ICAgICAgICAgICAgcTEyLCBxOAorICAgICAgICB2bW92ICAgICAgICAgICAgcTEzLCBxOAorICAgICAgICB2bW92ICAgICAgICAgICAgcTE0LCBxOAorICAgICAgICB2bW92ICAgICAgICAgICAgcTE1LCBxOAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q0WzBdfSwgW3IyLDoxNl0KKyAgICAgICAgYiAgICAgICAgICAgICAgIDJmCisuZW5kaWYKKzE6CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTgtcTl9LCAgICBbcjIsOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEwLXExMX0sICBbcjIsOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEyLXExM30sICBbcjIsOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTE0LXExNX0sICBbcjIsOjEyOF0hCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzEyOAorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyLXEzfSwgW3IyLDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyLXEzfSwgW3IyLDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyLXEzfSwgW3IyLDoxMjhdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EyLXEzfSwgW3IyLDoxMjhdIQorCisgICAgICAgIFx0eGZtMVwoKTgKKworICAgICAgICBAIFRyYW5zcG9zZSA4eDggd2l0aCAxNiBiaXQgZWxlbWVudHMKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQxNywgZDI0CisgICAgICAgIHZzd3AgICAgICAgICAgICBkMTksIGQyNgorICAgICAgICB2c3dwICAgICAgICAgICAgZDIxLCBkMjgKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQyMywgZDMwCisgICAgICAgIHRyYW5zcG9zZTE2XzR4NCBxOCwgcTksIHExMCwgcTExLCBxMTIsIHExMywgcTE0LCBxMTUKKworICAgICAgICBcdHhmbTJcKCk4CisyOgorICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMAorICAgICAgICBAIEFkZCBpbnRvIHRoZSBkZXN0aW5hdGlvbgorICAgICAgICB2bGQxLjggICAgICAgICAge2Q0fSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2cnNoci5zMTYgICAgICAgcTgsICBxOCwgICM1CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDV9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxOSwgIHE5LCAgIzUKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNn0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHExMCwgcTEwLCAjNQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTgsICBxOCwgIGQ0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDd9LCAgW3IwLDo2NF0sIHIxCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxMTEsIHExMSwgIzUKKyAgICAgICAgdmFkZHcudTggICAgICAgIHE5LCAgcTksICBkNQorICAgICAgICB2bGQxLjggICAgICAgICAge2Q4fSwgIFtyMCw6NjRdLCByMQorICAgICAgICB2cnNoci5zMTYgICAgICAgcTEyLCBxMTIsICM1CisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTAsIHExMCwgZDYKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCAgcTgKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkOX0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHExMywgcTEzLCAjNQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTExLCBxMTEsIGQ3CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNSwgIHE5CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDEwfSwgW3IwLDo2NF0sIHIxCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxMTQsIHExNCwgIzUKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMiwgcTEyLCBkOAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDYsICBxMTAKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTF9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHExNSwgcTE1LCAjNQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEzLCBxMTMsIGQ5CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNywgIHExMQorCisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNH0sICBbcjMsOjY0XSwgcjEKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExNCwgcTE0LCBkMTAKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNX0sICBbcjMsOjY0XSwgcjEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ4LCAgcTEyCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDZ9LCAgW3IzLDo2NF0sIHIxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTUsIHExNSwgZDExCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDd9LCAgW3IzLDo2NF0sIHIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkOSwgIHExMworICAgICAgICB2c3QxLjggICAgICAgICAge2Q4fSwgIFtyMyw6NjRdLCByMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEwLCBxMTQKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkOX0sICBbcjMsOjY0XSwgcjEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxMSwgcTE1CisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTB9LCBbcjMsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTF9LCBbcjMsOjY0XSwgcjEKKworLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICB2cG9wICAgICAgICAgICAge3E0LXE1fQorLmVsc2UKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKy5lbmRpZgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5lbmRtCisKK2l0eGZtX2Z1bmM4eDggaWRjdCwgIGlkY3QKK2l0eGZtX2Z1bmM4eDggaWFkc3QsIGlkY3QKKy5sdG9yZworaXR4Zm1fZnVuYzh4OCBpZGN0LCAgaWFkc3QKK2l0eGZtX2Z1bmM4eDggaWFkc3QsIGlhZHN0CisKKworZnVuY3Rpb24gaWRjdDE2eDE2X2RjX2FkZF9uZW9uCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjEyLDo2NF0KKworICAgICAgICB2bW92LmkxNiAgICAgICAgcTIsICAjMAorCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE2W119LCBbcjIsOjE2XQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTgsICBkMTYsIGQwWzBdCisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMTYsIHE4LCAgIzE0CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxOCwgIGQxNiwgZDBbMF0KKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQxNiwgcTgsICAjMTQKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHE4LCAgZDE2WzBdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDRbMF19LCBbcjIsOjE2XQorCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxOCwgIHE4LCAgIzYKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMTYKKzE6CisgICAgICAgIEAgTG9vcCB0byBhZGQgdGhlIGNvbnN0YW50IGZyb20gcTggaW50byBhbGwgMTZ4MTYgb3V0cHV0cworICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCAgW3IwLDoxMjhdLCByMQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTEwLCBxOCwgIGQ0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTN9LCAgW3IwLDoxMjhdLCByMQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTExLCBxOCwgIGQ1CisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTIsIHE4LCAgZDYKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMywgcTgsICBkNworICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDQsICBxMTAKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ1LCAgcTExCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNiwgIHExMgorICAgICAgICB2c3QxLjggICAgICAgICAge3EyfSwgIFtyMyw6MTI4XSwgcjEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ3LCAgcTEzCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTN9LCAgW3IzLDoxMjhdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKworICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5sdG9yZworCisubWFjcm8gaWRjdDE2X2VuZAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE4LCBkNywgIGQ0LCAgZDcgICAgICAgICAgICAgICAgQCBkMTggPSB0MGEsICBkNyAgPSB0N2EKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxOSwgZDIyLCBkNSwgIGQyMiAgICAgICAgICAgICAgIEAgZDE5ID0gdDFhLCAgZDIyID0gdDYKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQ0LCAgZDI2LCBkMjAsIGQyNiAgICAgICAgICAgICAgIEAgZDQgID0gdDJhLCAgZDI2ID0gdDUKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQ1LCAgZDYsICBkMjgsIGQ2ICAgICAgICAgICAgICAgIEAgZDUgID0gdDNhLCAgZDYgID0gdDQKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyMCwgZDI4LCBkMTYsIGQyNCAgICAgICAgICAgICAgIEAgZDIwID0gdDhhLCAgZDI4ID0gdDExYQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDI0LCBkMjEsIGQyMywgZDIxICAgICAgICAgICAgICAgQCBkMjQgPSB0OSwgICBkMjEgPSB0MTAKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyMywgZDI3LCBkMjUsIGQyNyAgICAgICAgICAgICAgIEAgZDIzID0gdDE0LCAgZDI3ID0gdDEzCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjUsIGQyOSwgZDI5LCBkMTcgICAgICAgICAgICAgICBAIGQyNSA9IHQxNWEsIGQyOSA9IHQxMmEKKworICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDI3LCBkMjEsIGQyNywgZDIxLCBkMTYsIGQzMCwgcTgsIHExNSBAIGQyNyA9IHQxM2EsIGQyMSA9IHQxMGEKKyAgICAgICAgbWJ1dHRlcmZseTAgICAgIGQyOSwgZDI4LCBkMjksIGQyOCwgZDE2LCBkMzAsIHE4LCBxMTUgQCBkMjkgPSB0MTIsICBkMjggPSB0MTEKKworICAgICAgICB2c3dwICAgICAgICAgICAgZDI3LCBkMjkgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMjcgPSB0MTIsIGQyOSA9IHQxM2EKKyAgICAgICAgdnN3cCAgICAgICAgICAgIGQyOCwgZDI3ICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDI4ID0gdDEyLCBkMjcgPSB0MTEKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxNiwgZDMxLCBkMTgsIGQyNSAgICAgICAgICAgICAgIEAgZDE2ID0gb3V0WzBdLCBkMzEgPSBvdXRbMTVdCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTcsIGQzMCwgZDE5LCBkMjMgICAgICAgICAgICAgICBAIGQxNyA9IG91dFsxXSwgZDMwID0gb3V0WzE0XQorICAgICAgICBidXR0ZXJmbHlfciAgICAgZDI1LCBkMjIsIGQyMiwgZDI0ICAgICAgICAgICAgICAgQCBkMjUgPSBvdXRbOV0sIGQyMiA9IG91dFs2XQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDIzLCBkMjQsIGQ3LCAgZDIwICAgICAgICAgICAgICAgQCBkMjMgPSBvdXRbN10sIGQyNCA9IG91dFs4XQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE4LCBkMjksIGQ0LCAgZDI5ICAgICAgICAgICAgICAgQCBkMTggPSBvdXRbMl0sIGQyOSA9IG91dFsxM10KKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxOSwgZDI4LCBkNSwgIGQyOCAgICAgICAgICAgICAgIEAgZDE5ID0gb3V0WzNdLCBkMjggPSBvdXRbMTJdCisgICAgICAgIHZtb3YgICAgICAgICAgICBkNCwgIGQyMSAgICAgICAgICAgICAgICAgICAgICAgICBAIGQ0ICA9IHQxMGEKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyMCwgZDI3LCBkNiwgIGQyNyAgICAgICAgICAgICAgIEAgZDIwID0gb3V0WzRdLCBkMjcgPSBvdXRbMTFdCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjEsIGQyNiwgZDI2LCBkNCAgICAgICAgICAgICAgICBAIGQyMSA9IG91dFs1XSwgZDI2ID0gb3V0WzEwXQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKy5lbmRtCisKK2Z1bmN0aW9uIGlkY3QxNgorICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDE2LCBkMjQsIGQxNiwgZDI0LCBkNCwgZDYsICBxMiwgIHEzIEAgZDE2ID0gdDBhLCAgZDI0ID0gdDFhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjAsIGQyOCwgZDBbMl0sIGQwWzNdLCBxMiwgIHEzICBAIGQyMCA9IHQyYSwgIGQyOCA9IHQzYQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDE4LCBkMzAsIGQxWzBdLCBkMVsxXSwgcTIsICBxMyAgQCBkMTggPSB0NGEsICBkMzAgPSB0N2EKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyNiwgZDIyLCBkMVsyXSwgZDFbM10sIHEyLCAgcTMgIEAgZDI2ID0gdDVhLCAgZDIyID0gdDZhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMTcsIGQzMSwgZDJbMF0sIGQyWzFdLCBxMiwgIHEzICBAIGQxNyA9IHQ4YSwgIGQzMSA9IHQxNWEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyNSwgZDIzLCBkMlsyXSwgZDJbM10sIHEyLCAgcTMgIEAgZDI1ID0gdDlhLCAgZDIzID0gdDE0YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIxLCBkMjcsIGQzWzBdLCBkM1sxXSwgcTIsICBxMyAgQCBkMjEgPSB0MTBhLCBkMjcgPSB0MTNhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjksIGQxOSwgZDNbMl0sIGQzWzNdLCBxMiwgIHEzICBAIGQyOSA9IHQxMWEsIGQxOSA9IHQxMmEKKworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDQsICBkMjgsIGQxNiwgZDI4ICAgICAgICAgICAgICAgQCBkNCAgPSB0MCwgICBkMjggPSB0MworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDUsICBkMjAsIGQyNCwgZDIwICAgICAgICAgICAgICAgQCBkNSAgPSB0MSwgICBkMjAgPSB0MgorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDYsICBkMjYsIGQxOCwgZDI2ICAgICAgICAgICAgICAgQCBkNiAgPSB0NCwgICBkMjYgPSB0NQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDcsICBkMjIsIGQzMCwgZDIyICAgICAgICAgICAgICAgQCBkNyAgPSB0NywgICBkMjIgPSB0NgorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE2LCBkMjUsIGQxNywgZDI1ICAgICAgICAgICAgICAgQCBkMTYgPSB0OCwgICBkMjUgPSB0OQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDI0LCBkMjEsIGQyOSwgZDIxICAgICAgICAgICAgICAgQCBkMjQgPSB0MTEsICBkMjEgPSB0MTAKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxNywgZDI3LCBkMTksIGQyNyAgICAgICAgICAgICAgIEAgZDE3ID0gdDEyLCAgZDI3ID0gdDEzCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjksIGQyMywgZDMxLCBkMjMgICAgICAgICAgICAgICBAIGQyOSA9IHQxNSwgIGQyMyA9IHQxNAorCisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjIsIGQyNiwgZDIyLCBkMjYsIGQxOCwgZDMwLCBxOSwgIHExNSAgQCBkMjIgPSB0NmEsIGQyNiA9IHQ1YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIzLCBkMjUsIGQwWzJdLCBkMFszXSwgcTksICBxMTUgICAgICAgIEAgZDIzID0gdDlhLCAgZDI1ID0gdDE0YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI3LCBkMjEsIGQwWzJdLCBkMFszXSwgcTksICBxMTUsIG5lZz0xIEAgZDI3ID0gdDEzYSwgZDIxID0gdDEwYQorICAgICAgICBpZGN0MTZfZW5kCitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QxNl9oYWxmCisgICAgICAgIG1idXR0ZXJmbHkwX2ggICBkMTYsIGQyNCwgZDE2LCBkMjQsIGQ0LCBkNiwgIHEyLCAgcTMgQCBkMTYgPSB0MGEsICBkMjQgPSB0MWEKKyAgICAgICAgbWJ1dHRlcmZseV9oMSAgIGQyMCwgZDI4LCBkMFsyXSwgZDBbM10sIHEyLCAgcTMgIEAgZDIwID0gdDJhLCAgZDI4ID0gdDNhCisgICAgICAgIG1idXR0ZXJmbHlfaDEgICBkMTgsIGQzMCwgZDFbMF0sIGQxWzFdLCBxMiwgIHEzICBAIGQxOCA9IHQ0YSwgIGQzMCA9IHQ3YQorICAgICAgICBtYnV0dGVyZmx5X2gyICAgZDI2LCBkMjIsIGQxWzJdLCBkMVszXSwgcTIsICBxMyAgQCBkMjYgPSB0NWEsICBkMjIgPSB0NmEKKyAgICAgICAgbWJ1dHRlcmZseV9oMSAgIGQxNywgZDMxLCBkMlswXSwgZDJbMV0sIHEyLCAgcTMgIEAgZDE3ID0gdDhhLCAgZDMxID0gdDE1YQorICAgICAgICBtYnV0dGVyZmx5X2gyICAgZDI1LCBkMjMsIGQyWzJdLCBkMlszXSwgcTIsICBxMyAgQCBkMjUgPSB0OWEsICBkMjMgPSB0MTRhCisgICAgICAgIG1idXR0ZXJmbHlfaDEgICBkMjEsIGQyNywgZDNbMF0sIGQzWzFdLCBxMiwgIHEzICBAIGQyMSA9IHQxMGEsIGQyNyA9IHQxM2EKKyAgICAgICAgbWJ1dHRlcmZseV9oMiAgIGQyOSwgZDE5LCBkM1syXSwgZDNbM10sIHEyLCAgcTMgIEAgZDI5ID0gdDExYSwgZDE5ID0gdDEyYQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkNCwgIGQyOCwgZDE2LCBkMjggICAgICAgICAgICAgICBAIGQ0ICA9IHQwLCAgIGQyOCA9IHQzCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkNSwgIGQyMCwgZDI0LCBkMjAgICAgICAgICAgICAgICBAIGQ1ICA9IHQxLCAgIGQyMCA9IHQyCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkNiwgIGQyNiwgZDE4LCBkMjYgICAgICAgICAgICAgICBAIGQ2ICA9IHQ0LCAgIGQyNiA9IHQ1CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkNywgIGQyMiwgZDMwLCBkMjIgICAgICAgICAgICAgICBAIGQ3ICA9IHQ3LCAgIGQyMiA9IHQ2CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTYsIGQyNSwgZDE3LCBkMjUgICAgICAgICAgICAgICBAIGQxNiA9IHQ4LCAgIGQyNSA9IHQ5CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjQsIGQyMSwgZDI5LCBkMjEgICAgICAgICAgICAgICBAIGQyNCA9IHQxMSwgIGQyMSA9IHQxMAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDE3LCBkMjcsIGQxOSwgZDI3ICAgICAgICAgICAgICAgQCBkMTcgPSB0MTIsICBkMjcgPSB0MTMKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyOSwgZDIzLCBkMzEsIGQyMyAgICAgICAgICAgICAgIEAgZDI5ID0gdDE1LCAgZDIzID0gdDE0CisKKyAgICAgICAgbWJ1dHRlcmZseTAgICAgIGQyMiwgZDI2LCBkMjIsIGQyNiwgZDE4LCBkMzAsIHE5LCAgcTE1ICBAIGQyMiA9IHQ2YSwgZDI2ID0gdDVhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjMsIGQyNSwgZDBbMl0sIGQwWzNdLCBxOSwgIHExNSAgICAgICAgQCBkMjMgPSB0OWEsICBkMjUgPSB0MTRhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjcsIGQyMSwgZDBbMl0sIGQwWzNdLCBxOSwgIHExNSwgbmVnPTEgQCBkMjcgPSB0MTNhLCBkMjEgPSB0MTBhCisgICAgICAgIGlkY3QxNl9lbmQKK2VuZGZ1bmMKKworZnVuY3Rpb24gaWRjdDE2X3F1YXJ0ZXIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMiwgZDE5LCBkM1szXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTIsICBkMTcsIGQyWzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMywgIGQxOCwgZDFbMV0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExNSwgZDE4LCBkMVswXQorICAgICAgICB2bmVnLnMzMiAgICAgICAgcTEyLCBxMTIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExNCwgZDE3LCBkMlsxXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEzLCBkMTksIGQzWzJdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTEsIGQxNiwgZDBbMF0KKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyNCwgcTEyLCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQxNiwgcTIsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQ3LCAgcTMsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQ2LCAgcTE1LCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyOSwgcTE0LCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQxNywgcTEzLCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyOCwgcTExLCAjMTQKKworICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTEwLCBxMTEsIGQxNywgZDI0LCBkMFsyXSwgZDBbM10KKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE5LCAgcTE1LCBkMjksIGQxNiwgZDBbMl0sIGQwWzNdCisgICAgICAgIHZuZWcuczMyICAgICAgICBxMTEsIHExMQorICAgICAgICB2cnNocm4uczMyICAgICAgZDI3LCBxMTAsICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgZDIxLCBxMTEsICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgZDIzLCBxOSwgICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgZDI1LCBxMTUsICMxNAorICAgICAgICB2bW92ICAgICAgICAgICAgZDQsICBkMjgKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQ1LCAgZDI4CisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjIsIGQyNiwgZDcsICBkNiwgIGQxOCwgZDMwLCBxOSwgIHExNQorICAgICAgICB2bW92ICAgICAgICAgICAgZDIwLCBkMjgKKyAgICAgICAgaWRjdDE2X2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpYWRzdDE2CisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlhZHN0MTZfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAtcTF9LCBbcjEyLDoxMjhdCisKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHEzLCAgcTIsICBkMzEsIGQxNiwgZDBbMV0sIGQwWzBdIEAgcTMgID0gdDEsICAgcTIgID0gdDAKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE1LCAgcTQsICBkMjMsIGQyNCwgZDFbMV0sIGQxWzBdIEAgcTUgID0gdDksICAgcTQgID0gdDgKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQzMSwgZDI0LCBxMywgIHE1LCAgcTYsICBxNSAgICAgIEAgZDMxID0gdDFhLCAgZDI0ID0gdDlhCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxNywgIHE2LCAgZDI5LCBkMTgsIGQwWzNdLCBkMFsyXSBAIHE3ICA9IHQzLCAgIHE2ICA9IHQyCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMTYsIGQyMywgcTIsICBxNCwgIHEzLCAgcTQgICAgICBAIGQxNiA9IHQwYSwgIGQyMyA9IHQ4YQorCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxMywgIHEyLCAgZDIxLCBkMjYsIGQxWzNdLCBkMVsyXSBAIHEzICA9IHQxMSwgIHEyICA9IHQxMAorICAgICAgICBidXR0ZXJmbHlfbiAgICAgZDI5LCBkMjYsIHE3LCAgcTMsICBxNCwgIHEzICAgICAgQCBkMjkgPSB0M2EsICBkMjYgPSB0MTFhCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxNSwgIHE0LCAgZDI3LCBkMjAsIGQyWzFdLCBkMlswXSBAIHE1ICA9IHQ1LCAgIHE0ICA9IHQ0CisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMTgsIGQyMSwgcTYsICBxMiwgIHEzLCAgcTIgICAgICBAIGQxOCA9IHQyYSwgIGQyMSA9IHQxMGEKKworICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTcsICBxNiwgIGQxOSwgZDI4LCBkM1sxXSwgZDNbMF0gQCBxNyAgPSB0MTMsICBxNiAgPSB0MTIKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQyMCwgZDI4LCBxNSwgIHE3LCAgcTIsICBxNyAgICAgIEAgZDIwID0gdDVhLCAgZDI4ID0gdDEzYQorICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTMsICBxMiwgIGQyNSwgZDIyLCBkMlszXSwgZDJbMl0gQCBxMyAgPSB0NywgICBxMiAgPSB0NgorICAgICAgICBidXR0ZXJmbHlfbiAgICAgZDI3LCBkMTksIHE0LCAgcTYsICBxNSwgIHE2ICAgICAgQCBkMjcgPSB0NGEsICBkMTkgPSB0MTJhCisKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE1LCAgcTQsICBkMTcsIGQzMCwgZDNbM10sIGQzWzJdIEAgcTUgID0gdDE1LCAgcTQgID0gdDE0CisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTB9LCBbcjEyLDoxMjhdCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMjIsIGQzMCwgcTMsICBxNSwgIHE2LCAgcTUgICAgICBAIGQyMiA9IHQ3YSwgIGQzMCA9IHQxNWEKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE3LCAgcTYsICBkMjMsIGQyNCwgZDFbMF0sIGQxWzFdIEAgcTcgID0gdDksICAgcTYgID0gdDgKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQyNSwgZDE3LCBxMiwgIHE0LCAgcTMsICBxNCAgICAgIEAgZDI1ID0gdDZhLCAgZDE3ID0gdDE0YQorCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxMiwgIHEzLCAgZDI4LCBkMTksIGQxWzFdLCBkMVswXSBAIHEyICA9IHQxMiwgIHEzICA9IHQxMworICAgICAgICBidXR0ZXJmbHlfbiAgICAgZDIzLCBkMTksIHE2LCAgcTIsICBxNCwgIHEyICAgICAgQCBkMjMgPSB0OGEsICBkMTkgPSB0MTJhCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxNSwgIHE0LCAgZDIxLCBkMjYsIGQxWzJdLCBkMVszXSBAIHE1ICA9IHQxMSwgIHE0ICA9IHQxMAorICAgICAgICBidXR0ZXJmbHlfciAgICAgZDQsICBkMjcsIGQxNiwgZDI3ICAgICAgICAgICAgICAgQCBkNCAgPSB0NCwgICBkMjcgPSB0MAorICAgICAgICBidXR0ZXJmbHlfbiAgICAgZDI0LCBkMjgsIHE3LCAgcTMsICBxNiwgIHEzICAgICAgQCBkMjQgPSB0OWEsICBkMjggPSB0MTNhCisKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE2LCAgcTcsICBkMzAsIGQxNywgZDFbM10sIGQxWzJdIEAgcTYgID0gdDE0LCAgcTcgID0gdDE1CisgICAgICAgIGJ1dHRlcmZseV9yICAgICBkNSwgIGQyMCwgZDMxLCBkMjAgICAgICAgICAgICAgICBAIGQ1ICA9IHQ1LCAgIGQyMCA9IHQxCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMjEsIGQxNywgcTQsICBxNiwgIHEzLCAgcTYgICAgICBAIGQyMSA9IHQxMGEsIGQxNyA9IHQxNGEKKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQyNiwgZDMwLCBxNSwgIHE3LCAgcTQsICBxNyAgICAgIEAgZDI2ID0gdDExYSwgZDMwID0gdDE1YQorCisgICAgICAgIGJ1dHRlcmZseV9yICAgICBkNiwgIGQyNSwgZDE4LCBkMjUgICAgICAgICAgICAgICBAIGQ2ICA9IHQ2LCAgIGQyNSA9IHQyCisgICAgICAgIGJ1dHRlcmZseV9yICAgICBkNywgIGQyMiwgZDI5LCBkMjIgICAgICAgICAgICAgICBAIGQ3ICA9IHQ3LCAgIGQyMiA9IHQzCisKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE1LCAgcTQsICBkMTksIGQyOCwgZDBbMl0sIGQwWzNdIEAgcTUgID0gdDEzLCAgcTQgID0gdDEyCisgICAgICAgIG1idXR0ZXJmbHlfbCAgICBxNiwgIHE3LCAgZDMwLCBkMTcsIGQwWzNdLCBkMFsyXSBAIHE2ICA9IHQxNCwgIHE3ICA9IHQxNQorCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMTgsIGQzMCwgcTQsICBxNiwgIHE4LCAgcTYgICAgICBAIGQxOCA9IG91dFsyXSwgICBkMzAgPSB0MTRhCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMjksIGQxNywgcTUsICBxNywgIHE2LCAgcTcgICAgICBAIGQyOSA9IC1vdXRbMTNdLCBkMTcgPSB0MTVhCisgICAgICAgIHZuZWcuczE2ICAgICAgICBkMjksIGQyOSAgICAgICAgICAgICAgICAgICAgICAgICBAIGQyOSA9IG91dFsxM10KKworICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTUsICBxNCwgIGQ0LCAgZDUsICBkMFsyXSwgZDBbM10gQCBxNSAgPSB0NWEsICBxNCAgPSB0NGEKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE2LCAgcTcsICBkNywgIGQ2LCAgZDBbM10sIGQwWzJdIEAgcTYgID0gdDZhLCAgcTcgID0gdDdhCisKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyLCAgZDYsICBkMjcsIGQyNSAgICAgICAgICAgICAgIEAgZDIgPSBvdXRbMF0sIGQ2ID0gdDJhCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMywgIGQ3LCAgZDIzLCBkMjEgICAgICAgICAgICAgICBAIGQzID0tb3V0WzFdLCBkNyA9IHQxMAorCisgICAgICAgIGJ1dHRlcmZseV9uICAgICBkMTksIGQzMSwgcTQsICBxNiwgIHEyLCAgcTQgICAgICBAIGQxOSA9IC1vdXRbM10sICBkMzEgPSB0NgorICAgICAgICB2bmVnLnMxNiAgICAgICAgZDE5LCBkMTkgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMTkgPSBvdXRbM10KKyAgICAgICAgYnV0dGVyZmx5X24gICAgIGQyOCwgZDE2LCBxNSwgIHE3LCAgcTIsICBxNSAgICAgIEAgZDI4ID0gb3V0WzEyXSwgIGQxNiA9IHQ3CisKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQ1LCAgZDgsICBkMjAsIGQyMiAgICAgICAgICAgICAgIEAgZDUgPS1vdXRbMTVdLGQ4ID0gdDNhCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkNCwgIGQ5LCAgZDI0LCBkMjYgICAgICAgICAgICAgICBAIGQ0ID0gb3V0WzE0XSxkOSA9IHQxMQorCisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjMsIGQyNCwgZDYsICBkOCwgIGQxMCwgZDExLCBxNiwgIHE3LCAxIEAgZDIzID0gb3V0WzddLCBkMjQgPSBvdXRbOF0KKyAgICAgICAgbWJ1dHRlcmZseTAgICAgIGQyMCwgZDI3LCBkMTYsIGQzMSwgZDEwLCBkMTEsIHE2LCAgcTcgICAgQCBkMjAgPSBvdXRbNF0sIGQyNyA9IG91dFsxMV0KKyAgICAgICAgbWJ1dHRlcmZseTAgICAgIGQyMiwgZDI1LCBkOSwgIGQ3LCAgZDEwLCBkMTEsIHE2LCAgcTcgICAgQCBkMjIgPSBvdXRbNl0sIGQyNSA9IG91dFs5XQorICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDIxLCBkMjYsIGQzMCwgZDE3LCBkMTAsIGQxMSwgcTYsICBxNywgMSBAIGQyMSA9IG91dFs1XSwgZDI2ID0gb3V0WzEwXQorCisgICAgICAgIHZuZWcuczE2ICAgICAgICBkMzEsIGQ1ICAgICAgICAgICAgICAgICAgICAgICAgICBAIGQzMSA9IG91dFsxNV0KKyAgICAgICAgdm5lZy5zMTYgICAgICAgIGQxNywgZDMgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDE3ID0gb3V0WzFdCisKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQxNiwgZDIKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQzMCwgZDQKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy5tYWNybyBsb2FkX2FkZF9zdG9yZSBjb2VmMCwgY29lZjEsIGNvZWYyLCBjb2VmMworICAgICAgICB2cnNoci5zMTYgICAgICAgXGNvZWYwLCBcY29lZjAsICM2CisgICAgICAgIHZyc2hyLnMxNiAgICAgICBcY29lZjEsIFxjb2VmMSwgIzYKKworICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0W119LCAgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q0WzFdfSwgIFtyMyw6MzJdLCByMQorICAgICAgICB2cnNoci5zMTYgICAgICAgXGNvZWYyLCBcY29lZjIsICM2CisgICAgICAgIHZyc2hyLnMxNiAgICAgICBcY29lZjMsIFxjb2VmMywgIzYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVtdfSwgICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVsxXX0sICBbcjMsOjMyXSwgcjEKKyAgICAgICAgdmFkZHcudTggICAgICAgIFxjb2VmMCwgXGNvZWYwLCBkNAorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2W119LCAgIFtyMCw6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2WzFdfSwgIFtyMyw6MzJdLCByMQorICAgICAgICB2YWRkdy51OCAgICAgICAgXGNvZWYxLCBcY29lZjEsIGQ1CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDdbXX0sICAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDdbMV19LCAgW3IzLDozMl0sIHIxCisKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ0LCAgXGNvZWYwCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNSwgIFxjb2VmMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjMsICByMSwgbHNsICMyCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBcY29lZjIsIFxjb2VmMiwgZDYKKyAgICAgICAgdmFkZHcudTggICAgICAgIFxjb2VmMywgXGNvZWYzLCBkNworICAgICAgICB2c3QxLjMyICAgICAgICAge2Q0WzBdfSwgIFtyMCw6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q0WzFdfSwgIFtyMyw6MzJdLCByMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDYsICBcY29lZjIKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNVswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNVsxXX0sICBbcjMsOjMyXSwgcjEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ3LCAgXGNvZWYzCisKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNlswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkNlsxXX0sICBbcjMsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN1swXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkN1sxXX0sICBbcjMsOjMyXSwgcjEKKy5lbmRtCisKKy5tYWNybyBpdHhmbTE2XzFkX2Z1bmNzIHR4Zm0KK0AgUmVhZCBhIHZlcnRpY2FsIDR4MTYgc2xpY2Ugb3V0IG9mIGEgMTZ4MTYgbWF0cml4LCBkbyBhIHRyYW5zZm9ybSBvbiBpdCwKK0AgdHJhbnNwb3NlIGludG8gYSBob3Jpem9udGFsIDE2eDQgc2xpY2UgYW5kIHN0b3JlLgorQCByMCA9IGRzdCAodGVtcCBidWZmZXIpCitAIHIxID0gc2xpY2Ugb2Zmc2V0CitAIHIyID0gc3JjCitmdW5jdGlvbiBcdHhmbVwoKTE2XzFkXzR4MTZfcGFzczFfbmVvbgorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMzMgorICAgICAgICB2bW92LnMxNiAgICAgICAgcTIsICAjMAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDR9LCAgW3IyLDo2NF0sIHIxMgorLmVuZHIKKworICAgICAgICBibCAgICAgICAgICAgICAgXHR4Zm1cKCkxNgorCisgICAgICAgIEAgRG8gZm91ciA0eDQgdHJhbnNwb3Nlcy4gT3JpZ2luYWxseSwgZDE2LWQzMSBjb250YWluIHRoZQorICAgICAgICBAIDE2IHJvd3MuIEFmdGVyd2FyZHMsIGQxNi1kMTksIGQyMC1kMjMsIGQyNC1kMjcsIGQyOC1kMzEKKyAgICAgICAgQCBjb250YWluIHRoZSB0cmFuc3Bvc2VkIDR4NCBibG9ja3MuCisgICAgICAgIHRyYW5zcG9zZTE2X3FfNHhfNHg0IHE4LCAgcTksICBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1LCBkMTYsIGQxNywgZDE4LCBkMTksIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEKKworICAgICAgICBAIFN0b3JlIHRoZSB0cmFuc3Bvc2VkIDR4NCBibG9ja3MgaG9yaXpvbnRhbGx5LgorICAgICAgICBjbXAgICAgICAgICAgICAgcjEsICAjMTIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDFmCisuaXJwIGksIDE2LCAyMCwgMjQsIDI4LCAxNywgMjEsIDI1LCAyOSwgMTgsIDIyLCAyNiwgMzAsIDE5LCAyMywgMjcsIDMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZFxpfSwgW3IwLDo2NF0hCisuZW5kcgorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorMToKKyAgICAgICAgQCBTcGVjaWFsIGNhc2U6IEZvciB0aGUgbGFzdCBpbnB1dCBjb2x1bW4gKHIxID09IDEyKSwKKyAgICAgICAgQCB3aGljaCB3b3VsZCBiZSBzdG9yZWQgYXMgdGhlIGxhc3Qgcm93IGluIHRoZSB0ZW1wIGJ1ZmZlciwKKyAgICAgICAgQCBkb24ndCBzdG9yZSB0aGUgZmlyc3QgNHg0IGJsb2NrLCBidXQga2VlcCBpdCBpbiByZWdpc3RlcnMKKyAgICAgICAgQCBmb3IgdGhlIGZpcnN0IHNsaWNlIG9mIHRoZSBzZWNvbmQgcGFzcyAod2hlcmUgaXQgaXMgdGhlCisgICAgICAgIEAgbGFzdCA0eDQgYmxvY2spLgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIwfSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI0fSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI4fSwgW3IwLDo2NF0hCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjF9LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjV9LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjl9LCBbcjAsOjY0XSEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMn0sIFtyMCw6NjRdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyNn0sIFtyMCw6NjRdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzMH0sIFtyMCw6NjRdIQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIzfSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI3fSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDMxfSwgW3IwLDo2NF0hCisgICAgICAgIHZtb3YgICAgICAgICAgICBkMjgsIGQxNgorICAgICAgICB2bW92ICAgICAgICAgICAgZDI5LCBkMTcKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQzMCwgZDE4CisgICAgICAgIHZtb3YgICAgICAgICAgICBkMzEsIGQxOQorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworCitAIFJlYWQgYSB2ZXJ0aWNhbCA0eDE2IHNsaWNlIG91dCBvZiBhIDE2eDE2IG1hdHJpeCwgZG8gYSB0cmFuc2Zvcm0gb24gaXQsCitAIGxvYWQgdGhlIGRlc3RpbmF0aW9uIHBpeGVscyAoZnJvbSBhIHNpbWlsYXIgNHgxNiBzbGljZSksIGFkZCBhbmQgc3RvcmUgYmFjay4KK0AgcjAgPSBkc3QKK0AgcjEgPSBkc3Qgc3RyaWRlCitAIHIyID0gc3JjICh0ZW1wIGJ1ZmZlcikKK0AgcjMgPSBzbGljZSBvZmZzZXQKK2Z1bmN0aW9uIFx0eGZtXCgpMTZfMWRfNHgxNl9wYXNzMl9uZW9uCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMzMgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzAKKyAgICAgICAgYmVxICAgICAgICAgICAgIDFmCisuaXJwIGksIDI4LCAyOSwgMzAsIDMxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKzE6CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjAsICByMQorICAgICAgICBsc2wgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBcdHhmbVwoKTE2CisKKyAgICAgICAgbG9hZF9hZGRfc3RvcmUgIHE4LCAgcTksICBxMTAsIHExMQorICAgICAgICBsb2FkX2FkZF9zdG9yZSAgcTEyLCBxMTMsIHExNCwgcTE1CisKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKy5lbmRtCisKK2l0eGZtMTZfMWRfZnVuY3MgaWRjdAoraXR4Zm0xNl8xZF9mdW5jcyBpYWRzdAorCitAIFRoaXMgaXMgdGhlIG1pbmltdW0gZW9iIHZhbHVlIGZvciBlYWNoIHN1YnBhcnRpdGlvbiwgaW4gaW5jcmVtZW50cyBvZiA0Citjb25zdCBtaW5fZW9iX2lkY3RfaWRjdF8xNiwgYWxpZ249NAorICAgICAgICAuc2hvcnQgIDAsIDEwLCAzOCwgODkKK2VuZGNvbnN0CisKKy5tYWNybyBpdHhmbV9mdW5jMTZ4MTYgdHhmbTEsIHR4Zm0yCitmdW5jdGlvbiBmZl92cDlfXHR4Zm0xXCgpX1x0eGZtMlwoKV8xNngxNl9hZGRfbmVvbiwgZXhwb3J0PTEKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzEKKyAgICAgICAgYmVxICAgICAgICAgICAgIGlkY3QxNngxNl9kY19hZGRfbmVvbgorLmVuZGlmCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjgsbHJ9CisuaWZuYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorLmVuZGlmCisKKyAgICAgICAgQCBBbGlnbiB0aGUgc3RhY2ssIGFsbG9jYXRlIGEgdGVtcCBidWZmZXIKK1QgICAgICAgbW92ICAgICAgICAgICAgIHI3LCAgc3AKK1QgICAgICAgYW5kICAgICAgICAgICAgIHI3LCAgcjcsICAjMTUKK0EgICAgICAgYW5kICAgICAgICAgICAgIHI3LCAgc3AsICAjMTUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjcsICAjNTEyCisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICByMgorCisuaWZjIFx0eGZtMSxpZGN0CisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAtcTF9LCBbcjEyLDoxMjhdCisuZW5kaWYKKworLmlmYyBcdHhmbTFcKClfXHR4Zm0yLGlkY3RfaWRjdAorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMTAKKyAgICAgICAgYmxlICAgICAgICAgICAgIGlkY3QxNngxNl9xdWFydGVyX2FkZF9uZW9uCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMzOAorICAgICAgICBibGUgICAgICAgICAgICAgaWRjdDE2eDE2X2hhbGZfYWRkX25lb24KKworICAgICAgICBtb3ZyZWwgICAgICAgICAgcjgsICBtaW5fZW9iX2lkY3RfaWRjdF8xNiArIDIKKy5lbmRpZgorCisuaXJwIGksIDAsIDQsIDgsIDEyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHNwLCAgIyhcaSozMikKKy5pZmMgXHR4Zm0xXCgpX1x0eGZtMixpZGN0X2lkY3QKKy5pZiBcaSA+IDAKKyAgICAgICAgbGRyaF9wb3N0ICAgICAgIHIxLCAgcjgsICAjMgorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICByMQorICAgICAgICBpdCAgICAgICAgICAgICAgbGUKKyAgICAgICAgbW92bGUgICAgICAgICAgIHIxLCAgIygxNiAtIFxpKS80CisgICAgICAgIGJsZSAgICAgICAgICAgICAxZgorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgI1xpCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHI2LCAgIyhcaSoyKQorICAgICAgICBibCAgICAgICAgICAgICAgXHR4Zm0xXCgpMTZfMWRfNHgxNl9wYXNzMV9uZW9uCisuZW5kcgorCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIGIgICAgICAgICAgICAgICAzZgorMToKKyAgICAgICAgQCBGb3IgYWxsLXplcm8gc2xpY2VzIGluIHBhc3MgMSwgc2V0IGQyOC1kMzEgdG8gemVybywgZm9yIHRoZSBpbi1yZWdpc3RlcgorICAgICAgICBAIHBhc3N0aHJvdWdoIG9mIGNvZWZmaWNpZW50cyB0byBwYXNzIDIgYW5kIGNsZWFyIHRoZSBlbmQgb2YgdGhlIHRlbXAgYnVmZmVyCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMTQsICMwCisgICAgICAgIHZtb3YuaTE2ICAgICAgICBxMTUsICMwCisyOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEsICByMSwgICMxCisucmVwdCA0CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTE0LXExNX0sIFtyMCw6MTI4XSEKKy5lbmRyCisgICAgICAgIGJuZSAgICAgICAgICAgICAyYgorMzoKKy5lbmRpZgorCisuaWZjIFx0eGZtMVwoKV9cdHhmbTIsaWFkc3RfaWRjdAorICAgICAgICBtb3ZyZWwgICAgICAgICAgcjEyLCBpZGN0X2NvZWZmcworICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwLXExfSwgW3IxMiw6MTI4XQorLmVuZGlmCisuaXJwIGksIDAsIDQsIDgsIDEyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHI0LCAgIyhcaSkKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgc3AsICAjKFxpKjIpCisgICAgICAgIG1vdiAgICAgICAgICAgICByMywgICNcaQorICAgICAgICBibCAgICAgICAgICAgICAgXHR4Zm0yXCgpMTZfMWRfNHgxNl9wYXNzMl9uZW9uCisuZW5kcgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKy5pZm5jIFx0eGZtMVwoKV9cdHhmbTIsaWRjdF9pZGN0CisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisuZW5kaWYKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCxwY30KK2VuZGZ1bmMKKy5lbmRtCisKK2l0eGZtX2Z1bmMxNngxNiBpZGN0LCAgaWRjdAoraXR4Zm1fZnVuYzE2eDE2IGlhZHN0LCBpZGN0CitpdHhmbV9mdW5jMTZ4MTYgaWRjdCwgIGlhZHN0CitpdHhmbV9mdW5jMTZ4MTYgaWFkc3QsIGlhZHN0CisubHRvcmcKKworZnVuY3Rpb24gaWRjdDE2XzFkXzR4MTZfcGFzczFfcXVhcnRlcl9uZW9uCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMzMgorICAgICAgICB2bW92LnMxNiAgICAgICAgcTIsICMwCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkNH0sICBbcjIsOjY0XSwgcjEyCisuZW5kcgorCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfcXVhcnRlcgorCisgICAgICAgIEAgRG8gZm91ciA0eDQgdHJhbnNwb3Nlcy4gT3JpZ2luYWxseSwgZDE2LWQzMSBjb250YWluIHRoZQorICAgICAgICBAIDE2IHJvd3MuIEFmdGVyd2FyZHMsIGQxNi1kMTksIGQyMC1kMjMsIGQyNC1kMjcsIGQyOC1kMzEKKyAgICAgICAgQCBjb250YWluIHRoZSB0cmFuc3Bvc2VkIDR4NCBibG9ja3MuCisgICAgICAgIHRyYW5zcG9zZTE2X3FfNHhfNHg0IHE4LCAgcTksICBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1LCBkMTYsIGQxNywgZDE4LCBkMTksIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEKKworICAgICAgICBAIFN0b3JlIHRoZSB0cmFuc3Bvc2VkIDR4NCBibG9ja3MgaG9yaXpvbnRhbGx5LgorICAgICAgICBAIFRoZSBmaXJzdCA0eDQgYmxvY2sgaXMga2VwdCBpbiByZWdpc3RlcnMgZm9yIHRoZSBzZWNvbmQgcGFzcywKKyAgICAgICAgQCBzdG9yZSB0aGUgcmVzdCBpbiB0aGUgdGVtcCBidWZmZXIuCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjB9LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjR9LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjh9LCBbcjAsOjY0XSEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMX0sIFtyMCw6NjRdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyNX0sIFtyMCw6NjRdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyOX0sIFtyMCw6NjRdIQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIyfSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI2fSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDMwfSwgW3IwLDo2NF0hCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjN9LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjd9LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMzF9LCBbcjAsOjY0XSEKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gaWRjdDE2XzFkXzR4MTZfcGFzczJfcXVhcnRlcl9uZW9uCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisgICAgICAgIEAgT25seSBsb2FkIHRoZSB0b3AgNCBsaW5lcywgYW5kIG9ubHkgZG8gaXQgZm9yIHRoZSBsYXRlciBzbGljZXMuCisgICAgICAgIEAgRm9yIHRoZSBmaXJzdCBzbGljZSwgZDE2LWQxOSBpcyBrZXB0IGluIHJlZ2lzdGVycyBmcm9tIHRoZSBmaXJzdCBwYXNzLgorICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMAorICAgICAgICBiZXEgICAgICAgICAgICAgMWYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzMyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKzE6CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjAsICByMQorICAgICAgICBsc2wgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfcXVhcnRlcgorCisgICAgICAgIGxvYWRfYWRkX3N0b3JlICBxOCwgIHE5LCAgcTEwLCBxMTEKKyAgICAgICAgbG9hZF9hZGRfc3RvcmUgIHExMiwgcTEzLCBxMTQsIHExNQorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGlkY3QxNl8xZF80eDE2X3Bhc3MxX2hhbGZfbmVvbgorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMzIKKyAgICAgICAgdm1vdi5zMTYgICAgICAgIHEyLCAjMAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkXGl9LCBbcjIsOjY0XQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q0fSwgIFtyMiw6NjRdLCByMTIKKy5lbmRyCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QxNl9oYWxmCisKKyAgICAgICAgQCBEbyBmb3VyIDR4NCB0cmFuc3Bvc2VzLiBPcmlnaW5hbGx5LCBkMTYtZDMxIGNvbnRhaW4gdGhlCisgICAgICAgIEAgMTYgcm93cy4gQWZ0ZXJ3YXJkcywgZDE2LWQxOSwgZDIwLWQyMywgZDI0LWQyNywgZDI4LWQzMQorICAgICAgICBAIGNvbnRhaW4gdGhlIHRyYW5zcG9zZWQgNHg0IGJsb2Nrcy4KKyAgICAgICAgdHJhbnNwb3NlMTZfcV80eF80eDQgcTgsICBxOSwgIHExMCwgcTExLCBxMTIsIHExMywgcTE0LCBxMTUsIGQxNiwgZDE3LCBkMTgsIGQxOSwgZDIwLCBkMjEsIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBkMjcsIGQyOCwgZDI5LCBkMzAsIGQzMQorCisgICAgICAgIEAgU3RvcmUgdGhlIHRyYW5zcG9zZWQgNHg0IGJsb2NrcyBob3Jpem9udGFsbHkuCisgICAgICAgIGNtcCAgICAgICAgICAgICByMSwgICM0CisgICAgICAgIGJlcSAgICAgICAgICAgICAxZgorLmlycCBpLCAxNiwgMjAsIDI0LCAyOCwgMTcsIDIxLCAyNSwgMjksIDE4LCAyMiwgMjYsIDMwLCAxOSwgMjMsIDI3LCAzMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2RcaX0sIFtyMCw6NjRdIQorLmVuZHIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KKzE6CisgICAgICAgIEAgU3BlY2lhbCBjYXNlOiBGb3IgdGhlIHNlY29uZCBpbnB1dCBjb2x1bW4gKHIxID09IDQpLAorICAgICAgICBAIHdoaWNoIHdvdWxkIGJlIHN0b3JlZCBhcyB0aGUgc2Vjb25kIHJvdyBpbiB0aGUgdGVtcCBidWZmZXIsCisgICAgICAgIEAgZG9uJ3Qgc3RvcmUgdGhlIGZpcnN0IDR4NCBibG9jaywgYnV0IGtlZXAgaXQgaW4gcmVnaXN0ZXJzCisgICAgICAgIEAgZm9yIHRoZSBmaXJzdCBzbGljZSBvZiB0aGUgc2Vjb25kIHBhc3MgKHdoZXJlIGl0IGlzIHRoZQorICAgICAgICBAIHNlY29uZCA0eDQgYmxvY2spLgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIwfSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI0fSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI4fSwgW3IwLDo2NF0hCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjF9LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjV9LCBbcjAsOjY0XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjl9LCBbcjAsOjY0XSEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMn0sIFtyMCw6NjRdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyNn0sIFtyMCw6NjRdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzMH0sIFtyMCw6NjRdIQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIzfSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI3fSwgW3IwLDo2NF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDMxfSwgW3IwLDo2NF0hCisgICAgICAgIHZtb3YgICAgICAgICAgICBkMjAsIGQxNgorICAgICAgICB2bW92ICAgICAgICAgICAgZDIxLCBkMTcKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQyMiwgZDE4CisgICAgICAgIHZtb3YgICAgICAgICAgICBkMjMsIGQxOQorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MTZfMWRfNHgxNl9wYXNzMl9oYWxmX25lb24KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzMyCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMwCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKyAgICAgICAgYmVxICAgICAgICAgICAgIDFmCisuaXJwIGksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKzE6CisKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjAsICByMQorICAgICAgICBsc2wgICAgICAgICAgICAgcjEsICByMSwgICMxCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfaGFsZgorCisgICAgICAgIGxvYWRfYWRkX3N0b3JlICBxOCwgIHE5LCAgcTEwLCBxMTEKKyAgICAgICAgbG9hZF9hZGRfc3RvcmUgIHExMiwgcTEzLCBxMTQsIHExNQorCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cGN9CitlbmRmdW5jCisucHVyZ2VtIGxvYWRfYWRkX3N0b3JlCisKKy5tYWNybyBpZGN0MTZfcGFydGlhbCBzaXplCitmdW5jdGlvbiBpZGN0MTZ4MTZfXHNpemVcKClfYWRkX25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjKDAqMzIpCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgICMwCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHI2LCAgIygwKjIpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfMWRfNHgxNl9wYXNzMV9cc2l6ZVwoKV9uZW9uCisuaWZjIFxzaXplLGhhbGYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjKDQqMzIpCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHI2LCAgIyg0KjIpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfMWRfNHgxNl9wYXNzMV9cc2l6ZVwoKV9uZW9uCisuZW5kaWYKKy5pcnAgaSwgMCwgNCwgOCwgMTIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjQsICAjKFxpKQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEsICByNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICBzcCwgICMoXGkqMikKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIzLCAgI1xpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZfMWRfNHgxNl9wYXNzMl9cc2l6ZVwoKV9uZW9uCisuZW5kcgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCxwY30KK2VuZGZ1bmMKKy5lbmRtCisKK2lkY3QxNl9wYXJ0aWFsIHF1YXJ0ZXIKK2lkY3QxNl9wYXJ0aWFsIGhhbGYKKworZnVuY3Rpb24gaWRjdDMyeDMyX2RjX2FkZF9uZW9uCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCBbcjEyLDo2NF0KKworICAgICAgICB2bW92LmkxNiAgICAgICAgcTIsICAjMAorCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE2W119LCBbcjIsOjE2XQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTgsICBkMTYsIGQwWzBdCisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMTYsIHE4LCAgIzE0CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxOCwgIGQxNiwgZDBbMF0KKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQxNiwgcTgsICAjMTQKKyAgICAgICAgdmR1cC4xNiAgICAgICAgIHE4LCAgZDE2WzBdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDRbMF19LCBbcjIsOjE2XQorCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxOCwgIHE4LCAgIzYKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjMsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCAjMzIKKzE6CisgICAgICAgIEAgTG9vcCB0byBhZGQgdGhlIGNvbnN0YW50IGZyb20gcTggaW50byBhbGwgMzJ4MzIgb3V0cHV0cworICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTAtcTF9LCAgW3IwLDoxMjhdLCByMQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTksICBxOCwgIGQwCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTAsIHE4LCAgZDEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMi1xM30sICBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTEsIHE4LCAgZDIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExMiwgcTgsICBkMworICAgICAgICB2YWRkdy51OCAgICAgICAgcTEzLCBxOCwgIGQ0CisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMTQsIHE4LCAgZDUKKyAgICAgICAgdmFkZHcudTggICAgICAgIHExNSwgcTgsICBkNgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxOQorICAgICAgICB2YWRkdy51OCAgICAgICAgcTksICBxOCwgIGQ3CisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMSwgIHExMAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDIsICBxMTEKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQzLCAgcTEyCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNCwgIHExMworICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDUsICBxMTQKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMC1xMX0sICBbcjMsOjEyOF0sIHIxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkNiwgIHExNQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDcsICBxOQorICAgICAgICB2c3QxLjggICAgICAgICAge3EyLXEzfSwgIFtyMyw6MTI4XSwgcjEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKKy5tYWNybyBpZGN0MzJfZW5kCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTYsIGQ5LCAgZDgsICBkOSAgQCBkMTYgPSB0MTZhLCBkOSAgPSB0MTlhCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTcsIGQyMCwgZDIzLCBkMjAgQCBkMTcgPSB0MTcsICBkMjAgPSB0MTgKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxOCwgZDEwLCBkMTEsIGQxMCBAIGQxOCA9IHQyM2EsIGQxMCA9IHQyMGEKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxOSwgZDIxLCBkMjIsIGQyMSBAIGQxOSA9IHQyMiwgIGQyMSA9IHQyMQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDgsICBkMjgsIGQyOCwgZDMwIEAgZDggID0gdDI0YSwgZDI4ID0gdDI3YQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDIzLCBkMjYsIGQyNSwgZDI2IEAgZDIzID0gdDI1LCAgZDI2ID0gdDI2CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTEsIGQyOSwgZDI5LCBkMzEgQCBkMTEgPSB0MzFhLCBkMjkgPSB0MjhhCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjIsIGQyNywgZDI0LCBkMjcgQCBkMjIgPSB0MzAsICBkMjcgPSB0MjkKKworICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI3LCBkMjAsIGQwWzJdLCBkMFszXSwgcTEyLCBxMTUgICAgICAgIEAgZDI3ID0gdDE4YSwgZDIwID0gdDI5YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI5LCBkOSwgIGQwWzJdLCBkMFszXSwgcTEyLCBxMTUgICAgICAgIEAgZDI5ID0gdDE5LCAgZDUgID0gdDI4CisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjgsIGQxMCwgZDBbMl0sIGQwWzNdLCBxMTIsIHExNSwgbmVnPTEgQCBkMjggPSB0MjcsICBkNiAgPSB0MjAKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyNiwgZDIxLCBkMFsyXSwgZDBbM10sIHExMiwgcTE1LCBuZWc9MSBAIGQyNiA9IHQyNmEsIGQyMSA9IHQyMWEKKworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDMxLCBkMjQsIGQxMSwgZDggIEAgZDMxID0gdDMxLCAgZDI0ID0gdDI0CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMzAsIGQyNSwgZDIyLCBkMjMgQCBkMzAgPSB0MzBhLCBkMjUgPSB0MjVhCisgICAgICAgIGJ1dHRlcmZseV9yICAgICBkMjMsIGQxNiwgZDE2LCBkMTggQCBkMjMgPSB0MjMsICBkMTYgPSB0MTYKKyAgICAgICAgYnV0dGVyZmx5X3IgICAgIGQyMiwgZDE3LCBkMTcsIGQxOSBAIGQyMiA9IHQyMmEsIGQxNyA9IHQxN2EKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxOCwgZDIxLCBkMjcsIGQyMSBAIGQxOCA9IHQxOCwgIGQyMSA9IHQyMQorICAgICAgICBidXR0ZXJmbHlfciAgICAgZDI3LCBkMjgsIGQ5LCAgZDI4IEAgZDI3ID0gdDI3YSwgZDI4ID0gdDI4YQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDgsICBkMjYsIGQyMCwgZDI2IEAgZDggID0gdDI5LCAgZDI2ID0gdDI2CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTksIGQyMCwgZDI5LCBkMTAgQCBkMTkgPSB0MTlhLCBkMjAgPSB0MjAKKyAgICAgICAgdm1vdiAgICAgICAgICAgIGQyOSwgZDggICAgICAgICAgICBAIGQyOSA9IHQyOQorCisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjcsIGQyMCwgZDI3LCBkMjAsIGQ4LCBkMTAsIHE0LCBxNSBAIGQyNyA9IHQyNywgIGQyMCA9IHQyMAorICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDI2LCBkMjEsIGQyNiwgZDIxLCBkOCwgZDEwLCBxNCwgcTUgQCBkMjYgPSB0MjZhLCBkMjEgPSB0MjFhCisgICAgICAgIG1idXR0ZXJmbHkwICAgICBkMjUsIGQyMiwgZDI1LCBkMjIsIGQ4LCBkMTAsIHE0LCBxNSBAIGQyNSA9IHQyNSwgIGQyMiA9IHQyMgorICAgICAgICBtYnV0dGVyZmx5MCAgICAgZDI0LCBkMjMsIGQyNCwgZDIzLCBkOCwgZDEwLCBxNCwgcTUgQCBkMjQgPSB0MjRhLCBkMjMgPSB0MjNhCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorLmVuZG0KKworZnVuY3Rpb24gaWRjdDMyX29kZAorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDE2LCBkMzEsIGQ0WzBdLCBkNFsxXSwgcTQsIHE1IEAgZDE2ID0gdDE2YSwgZDMxID0gdDMxYQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI0LCBkMjMsIGQ0WzJdLCBkNFszXSwgcTQsIHE1IEAgZDI0ID0gdDE3YSwgZDIzID0gdDMwYQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIwLCBkMjcsIGQ1WzBdLCBkNVsxXSwgcTQsIHE1IEAgZDIwID0gdDE4YSwgZDI3ID0gdDI5YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI4LCBkMTksIGQ1WzJdLCBkNVszXSwgcTQsIHE1IEAgZDI4ID0gdDE5YSwgZDE5ID0gdDI4YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDE4LCBkMjksIGQ2WzBdLCBkNlsxXSwgcTQsIHE1IEAgZDE4ID0gdDIwYSwgZDI5ID0gdDI3YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI2LCBkMjEsIGQ2WzJdLCBkNlszXSwgcTQsIHE1IEAgZDI2ID0gdDIxYSwgZDIxID0gdDI2YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIyLCBkMjUsIGQ3WzBdLCBkN1sxXSwgcTQsIHE1IEAgZDIyID0gdDIyYSwgZDI1ID0gdDI1YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDMwLCBkMTcsIGQ3WzJdLCBkN1szXSwgcTQsIHE1IEAgZDMwID0gdDIzYSwgZDE3ID0gdDI0YQorCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkOCwgIGQyNCwgZDE2LCBkMjQgQCBkOCAgPSB0MTYsIGQyNCA9IHQxNworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDksICBkMjAsIGQyOCwgZDIwIEAgZDkgID0gdDE5LCBkMjAgPSB0MTgKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQxMCwgZDI2LCBkMTgsIGQyNiBAIGQxMCA9IHQyMCwgZDI2ID0gdDIxCisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTEsIGQyMiwgZDMwLCBkMjIgQCBkMTEgPSB0MjMsIGQyMiA9IHQyMgorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDI4LCBkMjUsIGQxNywgZDI1IEAgZDI4ID0gdDI0LCBkMjUgPSB0MjUKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQzMCwgZDIxLCBkMjksIGQyMSBAIGQzMCA9IHQyNywgZDIxID0gdDI2CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMjksIGQyMywgZDMxLCBkMjMgQCBkMjkgPSB0MzEsIGQyMyA9IHQzMAorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDMxLCBkMjcsIGQxOSwgZDI3IEAgZDMxID0gdDI4LCBkMjcgPSB0MjkKKworICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIzLCBkMjQsIGQxWzBdLCBkMVsxXSwgcTgsIHE5ICAgICAgICBAIGQyMyA9IHQxN2EsIGQyNCA9IHQzMGEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyNywgZDIwLCBkMVswXSwgZDFbMV0sIHE4LCBxOSwgbmVnPTEgQCBkMjcgPSB0MjlhLCBkMjAgPSB0MThhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjEsIGQyNiwgZDFbMl0sIGQxWzNdLCBxOCwgcTkgICAgICAgIEAgZDIxID0gdDIxYSwgZDI2ID0gdDI2YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDI1LCBkMjIsIGQxWzJdLCBkMVszXSwgcTgsIHE5LCBuZWc9MSBAIGQyNSA9IHQyNWEsIGQyMiA9IHQyMmEKKyAgICAgICAgaWRjdDMyX2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MzJfb2RkX2hhbGYKKyAgICAgICAgbWJ1dHRlcmZseV9oMSAgIGQxNiwgZDMxLCBkNFswXSwgZDRbMV0sIHE0LCBxNSBAIGQxNiA9IHQxNmEsIGQzMSA9IHQzMWEKKyAgICAgICAgbWJ1dHRlcmZseV9oMiAgIGQyNCwgZDIzLCBkNFsyXSwgZDRbM10sIHE0LCBxNSBAIGQyNCA9IHQxN2EsIGQyMyA9IHQzMGEKKyAgICAgICAgbWJ1dHRlcmZseV9oMSAgIGQyMCwgZDI3LCBkNVswXSwgZDVbMV0sIHE0LCBxNSBAIGQyMCA9IHQxOGEsIGQyNyA9IHQyOWEKKyAgICAgICAgbWJ1dHRlcmZseV9oMiAgIGQyOCwgZDE5LCBkNVsyXSwgZDVbM10sIHE0LCBxNSBAIGQyOCA9IHQxOWEsIGQxOSA9IHQyOGEKKyAgICAgICAgbWJ1dHRlcmZseV9oMSAgIGQxOCwgZDI5LCBkNlswXSwgZDZbMV0sIHE0LCBxNSBAIGQxOCA9IHQyMGEsIGQyOSA9IHQyN2EKKyAgICAgICAgbWJ1dHRlcmZseV9oMiAgIGQyNiwgZDIxLCBkNlsyXSwgZDZbM10sIHE0LCBxNSBAIGQyNiA9IHQyMWEsIGQyMSA9IHQyNmEKKyAgICAgICAgbWJ1dHRlcmZseV9oMSAgIGQyMiwgZDI1LCBkN1swXSwgZDdbMV0sIHE0LCBxNSBAIGQyMiA9IHQyMmEsIGQyNSA9IHQyNWEKKyAgICAgICAgbWJ1dHRlcmZseV9oMiAgIGQzMCwgZDE3LCBkN1syXSwgZDdbM10sIHE0LCBxNSBAIGQzMCA9IHQyM2EsIGQxNyA9IHQyNGEKKworICAgICAgICBidXR0ZXJmbHkgICAgICAgZDgsICBkMjQsIGQxNiwgZDI0IEAgZDggID0gdDE2LCBkMjQgPSB0MTcKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQ5LCAgZDIwLCBkMjgsIGQyMCBAIGQ5ICA9IHQxOSwgZDIwID0gdDE4CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMTAsIGQyNiwgZDE4LCBkMjYgQCBkMTAgPSB0MjAsIGQyNiA9IHQyMQorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDExLCBkMjIsIGQzMCwgZDIyIEAgZDExID0gdDIzLCBkMjIgPSB0MjIKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQyOCwgZDI1LCBkMTcsIGQyNSBAIGQyOCA9IHQyNCwgZDI1ID0gdDI1CisgICAgICAgIGJ1dHRlcmZseSAgICAgICBkMzAsIGQyMSwgZDI5LCBkMjEgQCBkMzAgPSB0MjcsIGQyMSA9IHQyNgorICAgICAgICBidXR0ZXJmbHkgICAgICAgZDI5LCBkMjMsIGQzMSwgZDIzIEAgZDI5ID0gdDMxLCBkMjMgPSB0MzAKKyAgICAgICAgYnV0dGVyZmx5ICAgICAgIGQzMSwgZDI3LCBkMTksIGQyNyBAIGQzMSA9IHQyOCwgZDI3ID0gdDI5CisKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyMywgZDI0LCBkMVswXSwgZDFbMV0sIHE4LCBxOSAgICAgICAgQCBkMjMgPSB0MTdhLCBkMjQgPSB0MzBhCisgICAgICAgIG1idXR0ZXJmbHkgICAgICBkMjcsIGQyMCwgZDFbMF0sIGQxWzFdLCBxOCwgcTksIG5lZz0xIEAgZDI3ID0gdDI5YSwgZDIwID0gdDE4YQorICAgICAgICBtYnV0dGVyZmx5ICAgICAgZDIxLCBkMjYsIGQxWzJdLCBkMVszXSwgcTgsIHE5ICAgICAgICBAIGQyMSA9IHQyMWEsIGQyNiA9IHQyNmEKKyAgICAgICAgbWJ1dHRlcmZseSAgICAgIGQyNSwgZDIyLCBkMVsyXSwgZDFbM10sIHE4LCBxOSwgbmVnPTEgQCBkMjUgPSB0MjVhLCBkMjIgPSB0MjJhCisKKyAgICAgICAgaWRjdDMyX2VuZAorZW5kZnVuYworCitmdW5jdGlvbiBpZGN0MzJfb2RkX3F1YXJ0ZXIKKyAgICAgICAgdm11bGwuczE2ICAgICAgIHE0LCAgZDE2LCBkNFswXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTE0LCBkMTksIGQ1WzNdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTUsIGQxNiwgZDRbMV0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMSwgZDE3LCBkN1syXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTUsICBkMTcsIGQ3WzNdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTMsIGQxOSwgZDVbMl0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMCwgZDE4LCBkNlswXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEyLCBkMTgsIGQ2WzFdCisKKyAgICAgICAgdm5lZy5zMzIgICAgICAgIHExNCwgcTE0CisgICAgICAgIHZuZWcuczMyICAgICAgICBxNSwgIHE1CisKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQ4LCAgcTQsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQ5LCAgcTE0LCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyOSwgcTE1LCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyOCwgcTExLCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQxMSwgcTUsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQzMSwgcTEzLCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQxMCwgcTEwLCAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQzMCwgcTEyLCAjMTQKKworICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTgsICBxOSwgIGQyOSwgZDgsICBkMVswXSwgZDFbMV0KKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHExMywgcTEwLCBkMzEsIGQ5LCAgZDFbMF0sIGQxWzFdCisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMjMsIHE4LCAgIzE0CisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMjQsIHE5LCAgIzE0CisgICAgICAgIHZuZWcuczMyICAgICAgICBxMTAsIHExMAorICAgICAgICB2cnNocm4uczMyICAgICAgZDI3LCBxMTMsICMxNAorICAgICAgICB2cnNocm4uczMyICAgICAgZDIwLCBxMTAsICMxNAorICAgICAgICBtYnV0dGVyZmx5X2wgICAgcTgsICBxOSwgIGQzMCwgZDEwLCBkMVsyXSwgZDFbM10KKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyMSwgcTgsICAjMTQKKyAgICAgICAgdnJzaHJuLnMzMiAgICAgIGQyNiwgcTksICAjMTQKKyAgICAgICAgbWJ1dHRlcmZseV9sICAgIHE4LCAgcTksICBkMjgsIGQxMSwgZDFbMl0sIGQxWzNdCisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMjUsIHE4LCAgIzE0CisgICAgICAgIHZuZWcuczMyICAgICAgICBxOSwgIHE5CisgICAgICAgIHZyc2hybi5zMzIgICAgICBkMjIsIHE5LCAgIzE0CisKKyAgICAgICAgaWRjdDMyX2VuZAorZW5kZnVuYworCisubWFjcm8gaWRjdDMyX2Z1bmNzIHN1ZmZpeAorQCBEbyBhbiAzMi1wb2ludCBJRENUIG9mIGEgNHgzMiBzbGljZSBvdXQgb2YgYSAzMngzMiBtYXRyaXguCitAIFdlIGRvbid0IGhhdmUgcmVnaXN0ZXIgc3BhY2UgdG8gZG8gYSBzaW5nbGUgcGFzcyBJRENUIG9mIDR4MzIgdGhvdWdoLAorQCBidXQgdGhlIDMyLXBvaW50IElEQ1QgY2FuIGJlIGRlY29tcG9zZWQgaW50byB0d28gMTYtcG9pbnQgSURDVHM7CitAIGEgbm9ybWFsIElEQ1QxNiB3aXRoIGV2ZXJ5IG90aGVyIGlucHV0IGNvbXBvbmVudCAodGhlIGV2ZW4gb25lcywgd2l0aAorQCBlYWNoIG91dHB1dCB3cml0dGVuIHR3aWNlKSwgZm9sbG93ZWQgYnkgYSBzZXBhcmF0ZSAxNi1wb2ludCBJRENUCitAIG9mIHRoZSBvZGQgaW5wdXRzLCBhZGRlZC9zdWJ0cmFjdGVkIG9udG8gdGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IGlkY3QxNi4KK0AgcjAgPSBkc3QgKHRlbXAgYnVmZmVyKQorQCByMSA9IHVudXNlZAorQCByMiA9IHNyYworZnVuY3Rpb24gaWRjdDMyXzFkXzR4MzJfcGFzczFcc3VmZml4XCgpX25lb24KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKworICAgICAgICBAIGlkY3QxNiBjbG9iYmVycyBxMi1xMyAoc2luY2UgaXQgZG9lc24ndCBjbG9iYmVyIHE0LXE3IGF0IGFsbAorICAgICAgICBAIHdoZW4gZG9pbmcgdGhlIG5vcm1hbCAxNngxNiBpZGN0KSwgc28gbW92ZSB0aGUgaWRjdDMyX29kZCBjb2VmZnMKKyAgICAgICAgQCB0byBxNC1xNQorICAgICAgICB2bW92ICAgICAgICAgICAgcTQsICBxMgorICAgICAgICB2bW92ICAgICAgICAgICAgcTUsICBxMworCisgICAgICAgIEAgRG91YmxlIHN0cmlkZSBvZiB0aGUgaW5wdXQsIHNpbmNlIHdlIG9ubHkgcmVhZCBldmVyeSBvdGhlciBsaW5lCisgICAgICAgIG1vdiAgICAgICAgICAgICByMTIsICMxMjgKKyAgICAgICAgdm1vdi5zMTYgICAgICAgIGQ0LCAgIzAKKworICAgICAgICBAIGQxNiA9IElOKDApLCBkMTcgPSBJTigyKSAuLi4gZDMxID0gSU4oMzApCisuaWZiIFxzdWZmaXgKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkXGl9LCBbcjIsOjY0XQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q0fSwgIFtyMiw6NjRdLCByMTIKKy5lbmRyCisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfcXVhcnRlcgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDR9LCAgW3IyLDo2NF0sIHIxMgorLmVuZHIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9oYWxmCisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDR9LCAgW3IyLDo2NF0sIHIxMgorLmVuZHIKKy5lbmRpZgorCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZcc3VmZml4CisKKyAgICAgICAgQCBNb3ZlIHRoZSBpZGN0MzJfb2RkIGNvZWZmcyBiYWNrIGludG8gcTItcTMgZm9yIGlkY3QzMl9vZGQ7CisgICAgICAgIEAgdGhlIGNvbnN0YW50cyBmb3IgYSB2bXVsIHdpdGggYSBsYW5lIG11c3QgYmUgaW4gcTAtcTMuCisgICAgICAgIHZtb3YgICAgICAgICAgICBxMiwgIHE0CisgICAgICAgIHZtb3YgICAgICAgICAgICBxMywgIHE1CisKKyAgICAgICAgQCBEbyBmb3VyIDR4NCB0cmFuc3Bvc2VzLiBPcmlnaW5hbGx5LCBkMTYtZDMxIGNvbnRhaW4gdGhlCisgICAgICAgIEAgMTYgcm93cy4gQWZ0ZXJ3YXJkcywgZDE2LWQxOSwgZDIwLWQyMywgZDI0LWQyNywgZDI4LWQzMQorICAgICAgICBAIGNvbnRhaW4gdGhlIHRyYW5zcG9zZWQgNHg0IGJsb2Nrcy4KKyAgICAgICAgdHJhbnNwb3NlMTZfcV80eF80eDQgcTgsICBxOSwgIHExMCwgcTExLCBxMTIsIHExMywgcTE0LCBxMTUsIGQxNiwgZDE3LCBkMTgsIGQxOSwgZDIwLCBkMjEsIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBkMjcsIGQyOCwgZDI5LCBkMzAsIGQzMQorICAgICAgICBAIFN0b3JlIHRoZSByZWdpc3RlcnMgYSwgYiwgYywgZCBob3Jpem9udGFsbHksIGZvbGxvd2VkCisgICAgICAgIEAgYnkgdGhlIHNhbWUgcmVnaXN0ZXJzIGQsIGMsIGIsIGEgbWlycm9yZWQuCisubWFjcm8gc3RvcmVfcmV2IGEsIGIsIGMsIGQKKy5pcnAgaSwgXGEsIFxiLCBcYywgXGQKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkXGl9LCBbcjAsOjY0XSEKKyAgICAgICAgdnJldjY0LjE2ICAgICAgIGRcaSwgZFxpCisuZW5kcgorLmlycCBpLCBcZCwgXGMsIFxiLCBcYQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2RcaX0sIFtyMCw6NjRdIQorLmVuZHIKKy5lbmRtCisgICAgICAgIHN0b3JlX3JldiAgICAgICAxNiwgMjAsIDI0LCAyOAorICAgICAgICBzdG9yZV9yZXYgICAgICAgMTcsIDIxLCAyNSwgMjkKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIDE4LCAyMiwgMjYsIDMwCisgICAgICAgIHN0b3JlX3JldiAgICAgICAxOSwgMjMsIDI3LCAzMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICMyNTYKKy5wdXJnZW0gc3RvcmVfcmV2CisKKyAgICAgICAgQCBNb3ZlIHIyIGJhY2sgdG8gdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCwgYW5kIG1vdmUKKyAgICAgICAgQCB0byB0aGUgZmlyc3Qgb2RkIHJvdworLmlmYiBcc3VmZml4CisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjEyLCBsc2wgIzQKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjEyLCBsc2wgIzIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9oYWxmCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjEyLCBsc2wgIzMKKy5lbmRpZgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICM2NAorCisgICAgICAgIHZtb3YuczE2ICAgICAgICBkOCwgICMwCisgICAgICAgIEAgZDE2ID0gSU4oMSksIGQxNyA9IElOKDMpIC4uLiBkMzEgPSBJTigzMSkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDh9LCAgW3IyLDo2NF0sIHIxMgorLmVuZHIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkOH0sICBbcjIsOjY0XSwgcjEyCisuZW5kcgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkOH0sICBbcjIsOjY0XSwgcjEyCisuZW5kcgorLmVuZGlmCisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QzMl9vZGRcc3VmZml4CisKKyAgICAgICAgdHJhbnNwb3NlMTZfcV80eF80eDQgcTE1LCBxMTQsIHExMywgcTEyLCBxMTEsIHExMCwgcTksICBxOCwgIGQzMSwgZDMwLCBkMjksIGQyOCwgZDI3LCBkMjYsIGQyNSwgZDI0LCBkMjMsIGQyMiwgZDIxLCBkMjAsIGQxOSwgZDE4LCBkMTcsIGQxNgorCisgICAgICAgIEAgU3RvcmUgdGhlIHJlZ2lzdGVycyBhLCBiLCBjLCBkIGhvcml6b250YWxseSwKKyAgICAgICAgQCBhZGRpbmcgaW50byB0aGUgb3V0cHV0IGZpcnN0LCBhbmQgdGhlbiBtaXJyb3JlZCwgc3VidHJhY3RlZAorICAgICAgICBAIGZyb20gdGhlIG91dHB1dC4KKy5tYWNybyBzdG9yZV9yZXYgYSwgYiwgYywgZAorLmlycCBpLCBcYSwgXGIsIFxjLCBcZAorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q4fSwgIFtyMCw6NjRdCisgICAgICAgIHZhZGQuczE2ICAgICAgICBkOCwgIGQ4LCAgZFxpCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDh9LCAgW3IwLDo2NF0hCisgICAgICAgIHZyZXY2NC4xNiAgICAgICBkXGksIGRcaQorLmVuZHIKKy5pcnAgaSwgXGQsIFxjLCBcYiwgXGEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkOH0sICBbcjAsOjY0XQorICAgICAgICB2c3ViLnMxNiAgICAgICAgZDgsICBkOCwgIGRcaQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q4fSwgIFtyMCw6NjRdIQorLmVuZHIKKy5lbmRtCisKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIDMxLCAyNywgMjMsIDE5CisgICAgICAgIHN0b3JlX3JldiAgICAgICAzMCwgMjYsIDIyLCAxOAorICAgICAgICBzdG9yZV9yZXYgICAgICAgMjksIDI1LCAyMSwgMTcKKyAgICAgICAgc3RvcmVfcmV2ICAgICAgIDI4LCAyNCwgMjAsIDE2CisucHVyZ2VtIHN0b3JlX3JldgorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworLmx0b3JnCisKK0AgVGhpcyBpcyBtb3N0bHkgdGhlIHNhbWUgYXMgNHgzMl9wYXNzMSwgYnV0IHdpdGhvdXQgdGhlIHRyYW5zcG9zZSwKK0AgYW5kIHVzZSB0aGUgc291cmNlIGFzIHRlbXAgYnVmZmVyIGJldHdlZW4gdGhlIHR3byBpZGN0IHBhc3NlcywgYW5kCitAIGFkZCBpbnRvIHRoZSBkZXN0aW5hdGlvbi4KK0AgcjAgPSBkc3QKK0AgcjEgPSBkc3Qgc3RyaWRlCitAIHIyID0gc3JjICh0ZW1wIGJ1ZmZlcikKK2Z1bmN0aW9uIGlkY3QzMl8xZF80eDMyX3Bhc3MyXHN1ZmZpeFwoKV9uZW9uCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisgICAgICAgIHZtb3YgICAgICAgICAgICBxNCwgIHEyCisgICAgICAgIHZtb3YgICAgICAgICAgICBxNSwgIHEzCisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzEyOAorICAgICAgICBAIGQxNiA9IElOKDApLCBkMTcgPSBJTigyKSAuLi4gZDMxID0gSU4oMzApCisuaWZiIFxzdWZmaXgKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkXGl9LCBbcjIsOjY0XSwgcjEyCisuZW5kcgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIxMiwgbHNsICM0CisuZW5kaWYKKy5pZmMgXHN1ZmZpeCxfcXVhcnRlcgorLmlycCBpLCAxNiwgMTcsIDE4LCAxOQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdLCByMTIKKy5lbmRyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjEyLCBsc2wgIzIKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9oYWxmCisuaXJwIGksIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdLCByMTIKKy5lbmRyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjEyLCBsc2wgIzMKKy5lbmRpZgorCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MTZcc3VmZml4CisKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHEyLCAgcTQKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHEzLCAgcTUKKworLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdLCByMTIKKy5lbmRyCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICM2NAorCisgICAgICAgIEAgZDE2ID0gSU4oMSksIGQxNyA9IElOKDMpIC4uLiBkMzEgPSBJTigzMSkKKy5pZmIgXHN1ZmZpeAorLmlycCBpLCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2RcaX0sIFtyMiw6NjRdLCByMTIKKy5lbmRyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjEyLCBsc2wgIzQKKy5lbmRpZgorLmlmYyBcc3VmZml4LF9xdWFydGVyCisuaXJwIGksIDE2LCAxNywgMTgsIDE5CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjMgorLmVuZGlmCisuaWZjIFxzdWZmaXgsX2hhbGYKKy5pcnAgaSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZFxpfSwgW3IyLDo2NF0sIHIxMgorLmVuZHIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMTIsIGxzbCAjMworLmVuZGlmCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgIzY0CisKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QzMl9vZGRcc3VmZml4CisKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgIzEyOAorLm1hY3JvIGxvYWRfYWNjX3N0b3JlIGEsIGIsIGMsIGQsIG5lZz0wCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDh9LCAgW3IyLDo2NF0sIHIxMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2Q5fSwgIFtyMiw6NjRdLCByMTIKKy5pZiBcbmVnID09IDAKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIGQ4LCAgZDgsICBkXGEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTB9LCBbcjIsOjY0XSwgcjEyCisgICAgICAgIHZhZGQuczE2ICAgICAgICBkOSwgIGQ5LCAgZFxiCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDExfSwgW3IyLDo2NF0sIHIxMgorICAgICAgICB2YWRkLnMxNiAgICAgICAgZDEwLCBkMTAsIGRcYworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDExLCBkMTEsIGRcZAorLmVsc2UKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIGQ4LCAgZDgsICBkXGEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTB9LCBbcjIsOjY0XSwgcjEyCisgICAgICAgIHZzdWIuczE2ICAgICAgICBkOSwgIGQ5LCAgZFxiCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDExfSwgW3IyLDo2NF0sIHIxMgorICAgICAgICB2c3ViLnMxNiAgICAgICAgZDEwLCBkMTAsIGRcYworICAgICAgICB2c3ViLnMxNiAgICAgICAgZDExLCBkMTEsIGRcZAorLmVuZGlmCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDEyW119LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDEyWzFdfSwgW3IwLDozMl0sIHIxCisgICAgICAgIHZyc2hyLnMxNiAgICAgICBxNCwgIHE0LCAgIzYKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMTNbXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnJzaHIuczE2ICAgICAgIHE1LCAgcTUsICAjNgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QxM1sxXX0sIFtyMCw6MzJdLCByMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHE0LCAgcTQsICBkMTIKKyAgICAgICAgdmFkZHcudTggICAgICAgIHE1LCAgcTUsICBkMTMKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ4LCAgcTQKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQ5LCAgcTUKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOFswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOFsxXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOVswXX0sICBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkOVsxXX0sICBbcjAsOjMyXSwgcjEKKy5lbmRtCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICAzMSwgMzAsIDI5LCAyOAorICAgICAgICBsb2FkX2FjY19zdG9yZSAgMjcsIDI2LCAyNSwgMjQKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIDIzLCAyMiwgMjEsIDIwCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICAxOSwgMTgsIDE3LCAxNgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIxMgorICAgICAgICBuZWcgICAgICAgICAgICAgcjEyLCByMTIKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIDE2LCAxNywgMTgsIDE5LCAxCisgICAgICAgIGxvYWRfYWNjX3N0b3JlICAyMCwgMjEsIDIyLCAyMywgMQorICAgICAgICBsb2FkX2FjY19zdG9yZSAgMjQsIDI1LCAyNiwgMjcsIDEKKyAgICAgICAgbG9hZF9hY2Nfc3RvcmUgIDI4LCAyOSwgMzAsIDMxLCAxCisucHVyZ2VtIGxvYWRfYWNjX3N0b3JlCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cGN9CitlbmRmdW5jCisuZW5kbQorCitpZGN0MzJfZnVuY3MKK2lkY3QzMl9mdW5jcyBfcXVhcnRlcgoraWRjdDMyX2Z1bmNzIF9oYWxmCisKK2NvbnN0IG1pbl9lb2JfaWRjdF9pZGN0XzMyLCBhbGlnbj00CisgICAgICAgIC5zaG9ydCAgMCwgOSwgMzQsIDcwLCAxMzUsIDI0MCwgMzM2LCA0NDgKK2VuZGNvbnN0CisKK2Z1bmN0aW9uIGZmX3ZwOV9pZGN0X2lkY3RfMzJ4MzJfYWRkX25lb24sIGV4cG9ydD0xCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMxCisgICAgICAgIGJlcSAgICAgICAgICAgICBpZGN0MzJ4MzJfZGNfYWRkX25lb24KKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOCxscn0KKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtxNC1xNn0KKworICAgICAgICBAIEFsaWduIHRoZSBzdGFjaywgYWxsb2NhdGUgYSB0ZW1wIGJ1ZmZlcgorVCAgICAgICBtb3YgICAgICAgICAgICAgcjcsICBzcAorVCAgICAgICBhbmQgICAgICAgICAgICAgcjcsICByNywgICMxNQorQSAgICAgICBhbmQgICAgICAgICAgICAgcjcsICBzcCwgICMxNQorICAgICAgICBhZGQgICAgICAgICAgICAgcjcsICByNywgICMyMDQ4CisgICAgICAgIHN1YiAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKworICAgICAgICBtb3YgICAgICAgICAgICAgcjQsICByMAorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICByMgorCisgICAgICAgIG1vdnJlbCAgICAgICAgICByMTIsIGlkY3RfY29lZmZzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTAtcTF9LCBbcjEyLDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EyLXEzfSwgW3IxMiw6MTI4XQorCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICMzNAorICAgICAgICBibGUgICAgICAgICAgICAgaWRjdDMyeDMyX3F1YXJ0ZXJfYWRkX25lb24KKyAgICAgICAgY21wICAgICAgICAgICAgIHIzLCAgIzEzNQorICAgICAgICBibGUgICAgICAgICAgICAgaWRjdDMyeDMyX2hhbGZfYWRkX25lb24KKworICAgICAgICBtb3ZyZWwgICAgICAgICAgcjgsICBtaW5fZW9iX2lkY3RfaWRjdF8zMiArIDIKKworLmlycCBpLCAwLCA0LCA4LCAxMiwgMTYsIDIwLCAyNCwgMjgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjKFxpKjY0KQorLmlmIFxpID4gMAorICAgICAgICBsZHJoX3Bvc3QgICAgICAgcjEsICByOCwgICMyCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgIHIxCisgICAgICAgIGl0ICAgICAgICAgICAgICBsZQorICAgICAgICBtb3ZsZSAgICAgICAgICAgcjEsICAjKDMyIC0gXGkpLzIKKyAgICAgICAgYmxlICAgICAgICAgICAgIDFmCisuZW5kaWYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjYsICAjKFxpKjIpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfNHgzMl9wYXNzMV9uZW9uCisuZW5kcgorICAgICAgICBiICAgICAgICAgICAgICAgM2YKKworMToKKyAgICAgICAgQCBXcml0ZSB6ZXJvcyB0byB0aGUgdGVtcCBidWZmZXIgZm9yIHBhc3MgMgorICAgICAgICB2bW92LmkxNiAgICAgICAgcTE0LCAjMAorICAgICAgICB2bW92LmkxNiAgICAgICAgcTE1LCAjMAorMjoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxLCAgcjEsICAjMQorLnJlcHQgNAorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExNC1xMTV9LCBbcjAsOjEyOF0hCisuZW5kcgorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKzM6CisuaXJwIGksIDAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0LCAyOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByNCwgICMoXGkpCisgICAgICAgIG1vdiAgICAgICAgICAgICByMSwgIHI1CisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHNwLCAgIyhcaSoyKQorICAgICAgICBibCAgICAgICAgICAgICAgaWRjdDMyXzFkXzR4MzJfcGFzczJfbmVvbgorLmVuZHIKKworICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgIHI3CisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTZ9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjgscGN9CitlbmRmdW5jCisKKy5tYWNybyBpZGN0MzJfcGFydGlhbCBzaXplCitmdW5jdGlvbiBpZGN0MzJ4MzJfXHNpemVcKClfYWRkX25lb24KKy5pcnAgaSwgMCwgNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICBzcCwgICMoXGkqNjQpCisuaWZjIFxzaXplLHF1YXJ0ZXIKKy5pZiBcaSA9PSA0CisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICM5CisgICAgICAgIGJsZSAgICAgICAgICAgICAxZgorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjYsICAjKFxpKjIpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfNHgzMl9wYXNzMV9cc2l6ZVwoKV9uZW9uCisuZW5kcgorCisuaWZjIFxzaXplLGhhbGYKKy5pcnAgaSwgOCwgMTIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgc3AsICAjKFxpKjY0KQorLmlmIFxpID09IDEyCisgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICM3MAorICAgICAgICBibGUgICAgICAgICAgICAgMWYKKy5lbmRpZgorICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByNiwgICMoXGkqMikKKyAgICAgICAgYmwgICAgICAgICAgICAgIGlkY3QzMl8xZF80eDMyX3Bhc3MxX1xzaXplXCgpX25lb24KKy5lbmRyCisuZW5kaWYKKyAgICAgICAgYiAgICAgICAgICAgICAgIDNmCisKKzE6CisgICAgICAgIEAgV3JpdGUgemVyb3MgdG8gdGhlIHRlbXAgYnVmZmVyIGZvciBwYXNzIDIKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHExNCwgIzAKKyAgICAgICAgdm1vdi5pMTYgICAgICAgIHExNSwgIzAKKy5yZXB0IDgKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTQtcTE1fSwgW3IwLDoxMjhdIQorLmVuZHIKKworMzoKKy5pcnAgaSwgMCwgNCwgOCwgMTIsIDE2LCAyMCwgMjQsIDI4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHI0LCAgIyhcaSkKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxLCAgcjUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgc3AsICAjKFxpKjIpCisgICAgICAgIGJsICAgICAgICAgICAgICBpZGN0MzJfMWRfNHgzMl9wYXNzMl9cc2l6ZVwoKV9uZW9uCisuZW5kcgorCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgcjcKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xNn0KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOCxwY30KK2VuZGZ1bmMKKy5lbmRtCisKK2lkY3QzMl9wYXJ0aWFsIHF1YXJ0ZXIKK2lkY3QzMl9wYXJ0aWFsIGhhbGYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXJtL3ZwOWxwZl8xNmJwcF9uZW9uLlMgYi9saWJhdmNvZGVjL2FybS92cDlscGZfMTZicHBfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMjU3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FybS92cDlscGZfMTZicHBfbmVvbi5TCkBAIC0wLDAgKzEsMTA0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworLm1hY3JvIHRyYW5zcG9zZTE2X3FfOHg4IHJxMCwgcnExLCBycTIsIHJxMywgcnE0LCBycTUsIHJxNiwgcnE3LCByMCwgcjEsIHIyLCByMywgcjQsIHI1LCByNiwgcjcsIHI4LCByOSwgcjEwLCByMTEsIHIxMiwgcjEzLCByMTQsIHIxNQorICAgICAgICB2c3dwICAgICAgICAgICAgIFxyMSwgIFxyOCAgQCB2dHJuLjY0IFxycTAsIFxycTQKKyAgICAgICAgdnN3cCAgICAgICAgICAgICBccjMsICBccjEwIEAgdnRybi42NCBccnExLCBccnE1CisgICAgICAgIHZzd3AgICAgICAgICAgICAgXHI1LCAgXHIxMiBAIHZ0cm4uNjQgXHJxMiwgXHJxNgorICAgICAgICB2c3dwICAgICAgICAgICAgIFxyNywgIFxyMTQgQCB2dHJuLjY0IFxycTMsIFxycTcKKyAgICAgICAgdnRybi4zMiAgICAgICAgICBccnEwLCBccnEyCisgICAgICAgIHZ0cm4uMzIgICAgICAgICAgXHJxMSwgXHJxMworICAgICAgICB2dHJuLjMyICAgICAgICAgIFxycTQsIFxycTYKKyAgICAgICAgdnRybi4zMiAgICAgICAgICBccnE1LCBccnE3CisgICAgICAgIHZ0cm4uMTYgICAgICAgICAgXHJxMCwgXHJxMQorICAgICAgICB2dHJuLjE2ICAgICAgICAgIFxycTIsIFxycTMKKyAgICAgICAgdnRybi4xNiAgICAgICAgICBccnE0LCBccnE1CisgICAgICAgIHZ0cm4uMTYgICAgICAgICAgXHJxNiwgXHJxNworLmVuZG0KKworLm1hY3JvIHRyYW5zcG9zZTE2XzR4NCByMCwgcjEsIHIyLCByMworICAgICAgICB2dHJuLjMyICAgICAgICAgIFxyMCwgXHIyCisgICAgICAgIHZ0cm4uMzIgICAgICAgICAgXHIxLCBccjMKKyAgICAgICAgdnRybi4xNiAgICAgICAgICBccjAsIFxyMQorICAgICAgICB2dHJuLjE2ICAgICAgICAgIFxyMiwgXHIzCisuZW5kbQorCitAIERvIGEgNHg0IHRyYW5zcG9zZSwgdXNpbmcgcSByZWdpc3RlcnMgZm9yIHRoZSBzdWJ0cmFuc3Bvc2VzIHRoYXQgZG9uJ3QKK0AgbmVlZCB0byBhZGRyZXNzIHRoZSBpbmRpdml1ZGFsIGQgcmVnaXN0ZXJzLgorQCByMCxyMSA9PSBycTAsIHIyLHIzID09IHJxMQorLm1hY3JvIHRyYW5zcG9zZTE2X3FfNHg0IHJxMCwgcnExLCByMCwgcjEsIHIyLCByMworICAgICAgICB2dHJuLjMyICAgICAgICAgXHJxMCwgXHJxMQorICAgICAgICB2dHJuLjE2ICAgICAgICAgXHIwLCAgXHIxCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccjIsICBccjMKKy5lbmRtCisKK0AgVGhlIGlucHV0IHRvIGFuZCBvdXRwdXQgZnJvbSB0aGlzIG1hY3JvIGlzIGluIHRoZSByZWdpc3RlcnMgcTgtcTE1LAorQCBhbmQgcTAtcTcgYXJlIHVzZWQgYXMgc2NyYXRjaCByZWdpc3RlcnMuCitAIHAzID0gcTgsIHAwID0gcTExLCBxMCA9IHExMiwgcTMgPSBxMTUKKy5tYWNybyBsb29wX2ZpbHRlcl9xIHdkCisgICAgICAgIHZkdXAudTE2ICAgICAgICBxMCwgIHIyICAgICAgICAgIEAgRQorICAgICAgICB2ZHVwLnUxNiAgICAgICAgcTEsICByMyAgICAgICAgICBAIEkKKworICAgICAgICB2YWJkLnUxNiAgICAgICAgcTIsICBxOCwgIHE5ICAgICBAIGFicyhwMyAtIHAyKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTMsICBxOSwgIHExMCAgICBAIGFicyhwMiAtIHAxKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTQsICBxMTAsIHExMSAgICBAIGFicyhwMSAtIHAwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTUsICBxMTIsIHExMyAgICBAIGFicyhxMCAtIHExKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTYsICBxMTMsIHExNCAgICBAIGFicyhxMSAtIHEyKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTcsICBxMTQsIHExNSAgICBAIGFicyhxMiAtIHEzKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgcTIsICBxMiwgIHEzCisgICAgICAgIHZtYXgudTE2ICAgICAgICBxMywgIHE0LCAgcTUKKyAgICAgICAgdm1heC51MTYgICAgICAgIHE0LCAgcTYsICBxNworICAgICAgICB2YWJkLnUxNiAgICAgICAgcTUsICBxMTEsIHExMiAgICBAIGFicyhwMCAtIHEwKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgcTIsICBxMiwgIHEzCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxNSwgIHE1LCAgcTUgICAgIEAgYWJzKHAwIC0gcTApICogMgorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTYsICBxMTAsIHExMyAgICBAIGFicyhwMSAtIHExKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgcTIsICBxMiwgIHE0ICAgICBAIG1heChhYnMocDMgLSBwMiksIC4uLiwgYWJzKHEyIC0gcTMpKQorICAgICAgICB2c2hyLnUxNiAgICAgICAgcTYsICBxNiwgICMxCisgICAgICAgIHZjbGUudTE2ICAgICAgICBxMiwgIHEyLCAgcTEgICAgIEAgbWF4KGFicygpKSA8PSBJCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxNSwgIHE1LCAgcTYgICAgIEAgYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSA+PiAxCisgICAgICAgIHZjbGUudTE2ICAgICAgICBxNSwgIHE1LCAgcTAKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHEyLCAgcTIsICBxNSAgICAgQCBmbQorCisgICAgICAgIHZtb3ZuLnUxNiAgICAgICBkMTAsIHEyCisgICAgICAgIHZtb3YgICAgICAgICAgICByOCwgIHI5LCAgZDEwCisgICAgICAgIG9ycnMgICAgICAgICAgICByOCwgIHI4LCAgcjkKKyAgICAgICAgQCBJZiBubyBwaXhlbHMgbmVlZCBmaWx0ZXJpbmcsIGp1c3QgZXhpdCBhcyBzb29uIGFzIHBvc3NpYmxlCisgICAgICAgIGJlcSAgICAgICAgICAgICA5ZgorCisuaWYgXHdkID49IDgKKyAgICAgICAgdmR1cC51MTYgICAgICAgIHEwLCAgcjUKKworICAgICAgICB2YWJkLnUxNiAgICAgICAgcTEsICBxOCwgIHExMSAgICBAIGFicyhwMyAtIHAwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTMsICBxOSwgIHExMSAgICBAIGFicyhwMiAtIHAwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTQsICBxMTAsIHExMSAgICBAIGFicyhwMSAtIHAwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTUsICBxMTMsIHExMiAgICBAIGFicyhxMSAtIHEwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTYsICBxMTQsIHExMiAgICBAIGFicyhxMiAtIHEwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgcTcsICBxMTUsIHExMiAgICBAIGFicyhxMyAtIHEwKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgcTEsICBxMSwgIHEzCisgICAgICAgIHZtYXgudTE2ICAgICAgICBxNCwgIHE0LCAgcTUKKyAgICAgICAgdm1heC51MTYgICAgICAgIHE2LCAgcTYsICBxNworICAgICAgICBAIFRoZSByZXN0IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiBmbGF0OGluIGlzIGludGVybGVhdmVkIGJlbG93CisuZW5kaWYKKworICAgICAgICBAIENhbGN1bGF0ZSB0aGUgbm9ybWFsIGlubmVyIGxvb3AgZmlsdGVyIGZvciAyIG9yIDQgcGl4ZWxzCisgICAgICAgIHZhYmQudTE2ICAgICAgICBxMywgIHExMCwgcTExICAgIEAgYWJzKHAxIC0gcDApCisuaWYgXHdkID09IDgKKyAgICAgICAgdm1heC51MTYgICAgICAgIHExLCAgcTEsICBxNAorLmVuZGlmCisgICAgICAgIHZhYmQudTE2ICAgICAgICBxNCwgIHExMywgcTEyICAgIEAgYWJzKHExIC0gcTApCisuaWYgXHdkID09IDgKKyAgICAgICAgdm1heC51MTYgICAgICAgIHExLCAgcTEsICBxNgorLmVuZGlmCisKKyAgICAgICAgdnN1Yi51MTYgICAgICAgIHE1LCAgcTEwLCBxMTMgICAgQCBwMSAtIHExCisgICAgICAgIHZtYXgudTE2ICAgICAgICBxMywgIHEzLCAgcTQgICAgIEAgbWF4KGFicyhwMSAtIHAwKSwgYWJzKHExIC0gcTApKQorICAgICAgICB2ZHVwLnUxNiAgICAgICAgcTQsICByNCAgICAgICAgICBAIEgKKyAgICAgICAgdnN1Yi51MTYgICAgICAgIHE2LCAgcTEyLCBxMTEgICAgQCBxMCAtIHAwCisuaWYgXHdkID09IDgKKyAgICAgICAgdmNsZS51MTYgICAgICAgIHExLCAgcTEsICBxMCAgICAgQCBmbGF0OGluCisuZW5kaWYKKyAgICAgICAgdmR1cC51MTYgICAgICAgIHEwLCAgcjYgICAgICAgICAgQCBsZWZ0IHNoaWZ0IGZvciBzYXR1cmF0aW9uCisgICAgICAgIHZjbGUudTE2ICAgICAgICBxMywgIHEzLCAgcTQgICAgIEAgIWhldgorLmlmIFx3ZCA9PSA4CisgICAgICAgIHZhbmQgICAgICAgICAgICBxMSwgIHExLCAgcTIgICAgIEAgZmxhdDhpbiAmJiBmbQorLmVuZGlmCisgICAgICAgIHZuZWcuczE2ICAgICAgICBxNCwgIHEwICAgICAgICAgIEAgbmVnYXRpdmUgbGVmdCBzaGlmdCBhZnRlciBzYXR1cmF0aW9uCisgICAgICAgIHZxc2hsLnMxNiAgICAgICBxNSwgIHE1LCAgcTAKKy5pZiBcd2QgPT0gOAorICAgICAgICB2YmljICAgICAgICAgICAgcTIsICBxMiwgIHExICAgICBAIGZtICYmICFmbGF0OGluCisuZW5kaWYKKyAgICAgICAgdm1vdi5zMTYgICAgICAgIHE3LCAgIzMKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHEzLCAgcTMsICBxMiAgICAgQCAhaGV2ICYmIGZtICYmICFmbGF0OGluCisgICAgICAgIHZzaGwuczE2ICAgICAgICBxNSwgIHE1LCAgcTQgICAgIEAgYXZfY2xpcF9pbnQycChwMSAtIHExLCBCSVRfREVQVEggLSAxKQorCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxNiwgIHE2LCAgcTcgICAgIEAgMyAqIChxMCAtIHAwKQorICAgICAgICB2YmljICAgICAgICAgICAgcTUsICBxNSwgIHEzICAgICBAIGlmICghaGV2KSBhdl9jbGlwX2ludDJwID0gMAorICAgICAgICB2YWRkLnMxNiAgICAgICAgcTYsICBxNiwgIHE1ICAgICBAIDMgKiAocTAgLSBwMCkgWysgYXZfY2xpcF9pbnQycChwMSAtIHExKV0KKyAgICAgICAgdm1vdi5zMTYgICAgICAgIHE1LCAgIzQKKyAgICAgICAgdnFzaGwuczE2ICAgICAgIHE2LCAgcTYsICBxMAorICAgICAgICB2bW92LnMxNiAgICAgICAgcTAsICAjMworICAgICAgICB2c2hsLnMxNiAgICAgICAgcTYsICBxNiwgIHE0ICAgICBAIGF2X2NsaXBfaW50MnAoMyAqIChxMCAtIHAwKSBbKyBhdl9jbGlwX2ludDJwKHAxIC0gcTEpXSwgQklUX0RFUFRIIC0gMSkgPSBmCisgICAgICAgIHZkdXAudTE2ICAgICAgICBxNCwgIHI3ICAgICAgICAgIEAgbWF4IHBpeGVsIHZhbHVlCisKKyAgICAgICAgdnNoci51MTYgICAgICAgIHE0LCAgcTQsICAjMSAgICAgQCAoMSA8PCAoQklUX0RFUFRIIC0gMSkpIC0gMSkKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgcTUsICBxNiwgIHE1ICAgICBAIGYgKyA0CisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMCwgIHE2LCAgcTAgICAgIEAgZiArIDMKKyAgICAgICAgdm1vdi5zMTYgICAgICAgIHE2LCAgIzAKKyAgICAgICAgdm1pbi5zMTYgICAgICAgIHE1LCAgcTUsICBxNCAgICAgQCBGRk1JTihmICsgNCwgKDEgPDwgKEJJVF9ERVBUSCAtIDEpKSAtIDEpCisgICAgICAgIHZtaW4uczE2ICAgICAgICBxMCwgIHEwLCAgcTQgICAgIEAgRkZNSU4oZiArIDMsICgxIDw8IChCSVRfREVQVEggLSAxKSkgLSAxKQorICAgICAgICB2ZHVwLnUxNiAgICAgICAgcTQsICByNyAgICAgICAgICBAIG1heCBwaXhlbCB2YWx1ZQorICAgICAgICB2c2hyLnMxNiAgICAgICAgcTUsICBxNSwgICMzICAgICBAIGYxCisgICAgICAgIHZzaHIuczE2ICAgICAgICBxMCwgIHEwLCAgIzMgICAgIEAgZjIKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxMTEsIHEwICAgICBAIHAwICsgZjIKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHE3LCAgcTEyLCBxNSAgICAgQCBxMCAtIGYxCisgICAgICAgIHZtaW4uczE2ICAgICAgICBxMCwgIHEwLCAgcTQKKyAgICAgICAgdm1pbi5zMTYgICAgICAgIHE3LCAgcTcsICBxNAorICAgICAgICB2cnNoci5zMTYgICAgICAgcTUsICBxNSwgICMxICAgICBAIGYgPSAoZjEgKyAxKSA+PiAxCisgICAgICAgIHZtYXguczE2ICAgICAgICBxMCwgIHEwLCAgcTYgICAgIEAgb3V0IHAwCisgICAgICAgIHZtYXguczE2ICAgICAgICBxNywgIHE3LCAgcTYgICAgIEAgb3V0IHEwCisgICAgICAgIHZiaXQgICAgICAgICAgICBxMTEsIHEwLCAgcTIgICAgIEAgaWYgKGZtICYmICFmbGF0OGluKQorICAgICAgICB2Yml0ICAgICAgICAgICAgcTEyLCBxNywgIHEyCisuaWYgXHdkID49IDgKKyAgICAgICAgdm1vdm4udTE2ICAgICAgIGQ0LCAgcTEKKy5lbmRpZgorCisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMCwgIHExMCwgcTUgICAgIEAgcDEgKyBmCisgICAgICAgIHZzdWIuczE2ICAgICAgICBxNywgIHExMywgcTUgICAgIEAgcTEgLSBmCisuaWYgXHdkID49IDgKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHI4LCAgcjksICBkNAorLmVuZGlmCisgICAgICAgIHZtaW4uczE2ICAgICAgICBxMCwgIHEwLCAgcTQKKyAgICAgICAgdm1pbi5zMTYgICAgICAgIHE3LCAgcTcsICBxNAorLmlmIFx3ZCA+PSA4CisgICAgICAgIG9ycnMgICAgICAgICAgICByOCwgIHI4LCAgcjkKKy5lbmRpZgorICAgICAgICB2bWF4LnMxNiAgICAgICAgcTAsICBxMCwgIHE2ICAgICBAIG91dCBwMQorICAgICAgICB2bWF4LnMxNiAgICAgICAgcTcsICBxNywgIHE2ICAgICBAIG91dCBxMQorICAgICAgICB2Yml0ICAgICAgICAgICAgcTEwLCBxMCwgIHEzICAgICBAIGlmICghaGV2ICYmIGZtICYmICFmbGF0OGluKQorICAgICAgICB2Yml0ICAgICAgICAgICAgcTEzLCBxNywgIHEzCisKKy5pZiBcd2QgPj0gOAorICAgICAgICBAIElmIG5vIHBpeGVscyBuZWVkIGZsYXQ4aW4sIGp1bXAgdG8gYSB3cml0ZW91dCBvZiB0aGUgaW5uZXIgNCBwaXhlbHMKKyAgICAgICAgYmVxICAgICAgICAgICAgIDZmCisKKyAgICAgICAgQCBmbGF0OGluCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMiwgIHE4LCAgcTkKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHEzLCAgcTEwLCBxMTMKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE0LCAgcTgsICBxMTAKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE1LCAgcTExLCBxMTQKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHEwLCAgcTIsICBxMgorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTAsICBxMCwgIHExMQorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTAsICBxMCwgIHExMgorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTAsICBxMCwgIHE0CisgICAgICAgIHZzdWIuczE2ICAgICAgICBxMywgIHEzLCAgcTIKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHE1LCAgcTUsICBxNAorICAgICAgICB2cnNoci51MTYgICAgICAgcTYsICBxMCwgICMzICAgICBAIG91dCBwMgorCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgcTMKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHEyLCAgcTgsICBxMTEKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHEzLCAgcTEyLCBxMTUKKyAgICAgICAgdnJzaHIudTE2ICAgICAgIHE3LCAgcTAsICAjMyAgICAgQCBvdXQgcDEKKworICAgICAgICB2YWRkLnUxNiAgICAgICAgcTAsICBxMCwgIHE1CisgICAgICAgIHZzdWIuczE2ICAgICAgICBxMywgIHEzLCAgcTIKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHE0LCAgcTksICBxMTIKKyAgICAgICAgdmJpdCAgICAgICAgICAgIHE5LCAgcTYsICBxMQorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTUsICBxMTMsIHExNQorICAgICAgICB2cnNoci51MTYgICAgICAgcTYsICBxMCwgICMzICAgICBAIG91dCBwMAorCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgcTMKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHE1LCAgcTUsICBxNAorICAgICAgICB2YWRkLnUxNiAgICAgICAgcTIsICBxMTAsIHExMworICAgICAgICB2Yml0ICAgICAgICAgICAgcTEwLCBxNywgIHExCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMywgIHExNCwgcTE1CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBxNywgIHEwLCAgIzMgICAgIEAgb3V0IHEwCisKKyAgICAgICAgdmFkZC51MTYgICAgICAgIHEwLCAgcTAsICBxNQorICAgICAgICB2c3ViLnMxNiAgICAgICAgcTMsICBxMywgIHEyCisgICAgICAgIHZiaXQgICAgICAgICAgICBxMTEsIHE2LCAgcTEKKyAgICAgICAgdnJzaHIudTE2ICAgICAgIHE2LCAgcTAsICAjMyAgICAgQCBvdXQgcTEKKworICAgICAgICB2YWRkLnUxNiAgICAgICAgcTAsICBxMCwgIHEzCisgICAgICAgIHZiaXQgICAgICAgICAgICBxMTIsIHE3LCAgcTEKKyAgICAgICAgdnJzaHIudTE2ICAgICAgIHE3LCAgcTAsICAjMyAgICAgQCBvdXQgcTIKKyAgICAgICAgdmJpdCAgICAgICAgICAgIHExMywgcTYsICBxMQorICAgICAgICB2Yml0ICAgICAgICAgICAgcTE0LCBxNywgIHExCisuZW5kaWYKKy5lbmRtCisKK0AgVGhlIGlucHV0IHRvIGFuZCBvdXRwdXQgZnJvbSB0aGlzIG1hY3JvIGlzIGluIHRoZSByZWdpc3RlcnMgZDE2LWQzMSwKK0AgYW5kIGQwLWQ3IGFyZSB1c2VkIGFzIHNjcmF0Y2ggcmVnaXN0ZXJzLgorQCBwNyA9IGQxNiAuLiBwMyA9IGQyMCwgcDAgPSBkMjMsIHEwID0gZDI0LCBxMyA9IGQyNywgcTcgPSBkMzEKK0AgRGVwZW5kaW5nIG9uIHRoZSB3aWR0aCBvZiB0aGUgbG9vcCBmaWx0ZXIsIHdlIGVpdGhlciB1c2UgZDE2LWQxOQorQCBhbmQgZDI4LWQzMSBhcyB0ZW1wIHJlZ2lzdGVycywgb3IgZDgtZDE1LgorQCBJbiBwcmFjdGljZSwgdGhpcyBpcyBvbmx5IGV2ZXIgaW5zdGFudGlhdGVkIG9uY2UsIHNvIHRoZSBtYWNybyBwYXJhbWV0ZXJzCitAIGNvdWxkIGJlIGhhcmRjb2RlZCwgYnV0IGtlZXBpbmcgdGhlbSBhcyBpcywgdG8ga2VlcCBzaW1pbGFyaXRpZXMgdG8gdGhlCitAIDggYnBwIGFuZCBhYXJjaDY0IHZlcnNpb25zLgorLm1hY3JvIGxvb3BfZmlsdGVyIHdkLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCB0bXA4CisgICAgICAgIHZkdXAudTE2ICAgICAgICBkMCwgIHIyICAgICAgICAgIEAgRQorICAgICAgICB2ZHVwLnUxNiAgICAgICAgZDIsICByMyAgICAgICAgICBAIEkKKworICAgICAgICB2YWJkLnUxNiAgICAgICAgZDQsICBkMjAsIGQyMSAgICBAIGFicyhwMyAtIHAyKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDUsICBkMjEsIGQyMiAgICBAIGFicyhwMiAtIHAxKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDYsICBkMjIsIGQyMyAgICBAIGFicyhwMSAtIHAwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDcsICBkMjQsIGQyNSAgICBAIGFicyhxMCAtIHExKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgXHRtcDEsICBkMjUsIGQyNiBAIGFicyhxMSAtIHEyKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgXHRtcDIsICBkMjYsIGQyNyBAIGFicyhxMiAtIHEzKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgZDQsICBkNCwgIGQ1CisgICAgICAgIHZtYXgudTE2ICAgICAgICBkNSwgIGQ2LCAgZDcKKyAgICAgICAgdm1heC51MTYgICAgICAgIFx0bXAxLCAgXHRtcDEsICBcdG1wMgorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDYsICBkMjMsIGQyNCAgICBAIGFicyhwMCAtIHEwKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgZDQsICBkNCwgIGQ1CisgICAgICAgIHZhZGQudTE2ICAgICAgICBkNiwgIGQ2LCAgZDYgICAgIEAgYWJzKHAwIC0gcTApICogMgorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDUsICBkMjIsIGQyNSAgICBAIGFicyhwMSAtIHExKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgZDQsICBkNCwgIFx0bXAxICBAIG1heChhYnMocDMgLSBwMiksIC4uLiwgYWJzKHEyIC0gcTMpKQorICAgICAgICB2c2hyLnUxNiAgICAgICAgZDUsICBkNSwgICMxCisgICAgICAgIHZjbGUudTE2ICAgICAgICBkNCwgIGQ0LCAgZDIgICAgIEAgbWF4KGFicygpKSA8PSBJCisgICAgICAgIHZhZGQudTE2ICAgICAgICBkNiwgIGQ2LCAgZDUgICAgIEAgYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSA+PiAxCisgICAgICAgIHZjbGUudTE2ICAgICAgICBkNiwgIGQ2LCAgZDAKKyAgICAgICAgdmFuZCAgICAgICAgICAgIGQ0LCAgZDQsICBkNiAgICAgQCBmbQorCisgICAgICAgIHZkdXAudTE2ICAgICAgICBkMywgIHI0ICAgICAgICAgIEAgSAorICAgICAgICB2bW92ICAgICAgICAgICAgcjgsICByOSwgIGQ0CisgICAgICAgIG9ycnMgICAgICAgICAgICByOCwgIHI4LCAgcjkKKyAgICAgICAgQCBJZiBubyBwaXhlbHMgbmVlZCBmaWx0ZXJpbmcsIGp1c3QgZXhpdCBhcyBzb29uIGFzIHBvc3NpYmxlCisgICAgICAgIGJlcSAgICAgICAgICAgICA5ZgorCisuaWYgXHdkID49IDgKKyAgICAgICAgdmR1cC51MTYgICAgICAgIGQwLCAgcjUKKworICAgICAgICB2YWJkLnUxNiAgICAgICAgZDYsICBkMjAsIGQyMyAgICBAIGFicyhwMyAtIHAwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDIsICBkMjEsIGQyMyAgICBAIGFicyhwMiAtIHAwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDEsICBkMjIsIGQyMyAgICBAIGFicyhwMSAtIHAwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgXHRtcDEsICBkMjUsIGQyNCBAIGFicyhxMSAtIHEwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgXHRtcDIsICBkMjYsIGQyNCBAIGFicyhxMiAtIHEwKQorICAgICAgICB2YWJkLnUxNiAgICAgICAgXHRtcDMsICBkMjcsIGQyNCBAIGFicyhxMyAtIHEwKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgZDYsICBkNiwgIGQyCisgICAgICAgIHZtYXgudTE2ICAgICAgICBkMSwgIGQxLCAgXHRtcDEKKyAgICAgICAgdm1heC51MTYgICAgICAgIFx0bXAyLCAgXHRtcDIsICBcdG1wMworLmlmIFx3ZCA9PSAxNgorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDcsICBkMTYsIGQyMyAgICBAIGFicyhwNyAtIHAwKQorICAgICAgICB2bWF4LnUxNiAgICAgICAgZDYsICBkNiwgIGQxCisgICAgICAgIHZhYmQudTE2ICAgICAgICBkMiwgIGQxNywgZDIzICAgIEAgYWJzKHA2IC0gcDApCisgICAgICAgIHZtYXgudTE2ICAgICAgICBkNiwgIGQ2LCAgXHRtcDIKKyAgICAgICAgdmFiZC51MTYgICAgICAgIGQxLCAgZDE4LCBkMjMgICAgQCBhYnMocDUgLSBwMCkKKyAgICAgICAgdmNsZS51MTYgICAgICAgIGQ2LCAgZDYsICBkMCAgICAgQCBmbGF0OGluCisgICAgICAgIHZhYmQudTE2ICAgICAgICBkOCwgIGQxOSwgZDIzICAgIEAgYWJzKHA0IC0gcDApCisgICAgICAgIHZhbmQgICAgICAgICAgICBkNiwgIGQ2LCAgZDQgICAgIEAgZmxhdDhpbiAmJiBmbQorICAgICAgICB2YWJkLnUxNiAgICAgICAgZDksICBkMjgsIGQyNCAgICBAIGFicyhxNCAtIHEwKQorICAgICAgICB2YmljICAgICAgICAgICAgZDQsICBkNCwgIGQ2ICAgICBAIGZtICYmICFmbGF0OGluCisgICAgICAgIHZhYmQudTE2ICAgICAgICBkMTAsIGQyOSwgZDI0ICAgIEAgYWJzKHE1IC0gcTApCisgICAgICAgIHZhYmQudTE2ICAgICAgICBkMTEsIGQzMCwgZDI0ICAgIEAgYWJzKHE2IC0gcTApCisgICAgICAgIHZhYmQudTE2ICAgICAgICBkMTIsIGQzMSwgZDI0ICAgIEAgYWJzKHE3IC0gcTApCisKKyAgICAgICAgdm1heC51MTYgICAgICAgIGQ3LCAgZDcsICBkMgorICAgICAgICB2bWF4LnUxNiAgICAgICAgZDEsICBkMSwgIGQ4CisgICAgICAgIHZtYXgudTE2ICAgICAgICBkOSwgIGQ5LCAgZDEwCisgICAgICAgIHZtYXgudTE2ICAgICAgICBkMTEsIGQxMSwgZDEyCisgICAgICAgIEAgVGhlIHJlc3Qgb2YgdGhlIGNhbGN1bGF0aW9uIG9mIGZsYXQ4b3V0IGlzIGludGVybGVhdmVkIGJlbG93CisuZWxzZQorICAgICAgICBAIFRoZSByZXN0IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiBmbGF0OGluIGlzIGludGVybGVhdmVkIGJlbG93CisuZW5kaWYKKy5lbmRpZgorCisgICAgICAgIEAgQ2FsY3VsYXRlIHRoZSBub3JtYWwgaW5uZXIgbG9vcCBmaWx0ZXIgZm9yIDIgb3IgNCBwaXhlbHMKKyAgICAgICAgdmFiZC51MTYgICAgICAgIGQ1LCAgZDIyLCBkMjMgICAgICAgICAgIEAgYWJzKHAxIC0gcDApCisuaWYgXHdkID09IDE2CisgICAgICAgIHZtYXgudTE2ICAgICAgICBkNywgIGQ3LCAgZDEKKyAgICAgICAgdm1heC51MTYgICAgICAgIGQ5LCAgZDksICBkMTEKKy5lbHNlaWYgXHdkID09IDgKKyAgICAgICAgdm1heC51MTYgICAgICAgIGQ2LCAgZDYsICBkMQorLmVuZGlmCisgICAgICAgIHZhYmQudTE2ICAgICAgICBkMSwgIGQyNSwgZDI0ICAgICAgICAgICBAIGFicyhxMSAtIHEwKQorLmlmIFx3ZCA9PSAxNgorICAgICAgICB2bWF4LnUxNiAgICAgICAgZDcsICBkNywgIGQ5CisuZWxzZWlmIFx3ZCA9PSA4CisgICAgICAgIHZtYXgudTE2ICAgICAgICBkNiwgIGQ2LCAgXHRtcDIKKy5lbmRpZgorICAgICAgICB2ZHVwLnUxNiAgICAgICAgXHRtcDIsICByNiAgICAgICAgICAgICAgQCBsZWZ0IHNoaWZ0IGZvciBzYXR1cmF0aW9uCisgICAgICAgIHZzdWIudTE2ICAgICAgICBcdG1wMSwgIGQyMiwgZDI1ICAgICAgICBAIHAxIC0gcTEKKyAgICAgICAgdm5lZy5zMTYgICAgICAgIFx0bXA2LCAgXHRtcDIgICAgICAgICAgIEAgbmVnYXRpdmUgbGVmdCBzaGlmdCBhZnRlciBzYXR1cmF0aW9uCisgICAgICAgIHZtYXgudTE2ICAgICAgICBkNSwgIGQ1LCAgZDEgICAgICAgICAgICBAIG1heChhYnMocDEgLSBwMCksIGFicyhxMSAtIHEwKSkKKyAgICAgICAgdnN1Yi51MTYgICAgICAgIFx0bXAzLCAgIGQyNCwgZDIzICAgICAgIEAgcTAgLSBwMAorICAgICAgICB2bW92LnMxNiAgICAgICAgXHRtcDUsICAjMworLmlmIFx3ZCA9PSA4CisgICAgICAgIHZjbGUudTE2ICAgICAgICBkNiwgIGQ2LCAgZDAgICAgICAgICAgICBAIGZsYXQ4aW4KKy5lbmRpZgorICAgICAgICB2Y2xlLnUxNiAgICAgICAgZDUsICBkNSwgIGQzICAgICAgICAgICAgQCAhaGV2CisuaWYgXHdkID09IDgKKyAgICAgICAgdmFuZCAgICAgICAgICAgIGQ2LCAgZDYsICBkNCAgICAgICAgICAgIEAgZmxhdDhpbiAmJiBmbQorLmVuZGlmCisgICAgICAgIHZxc2hsLnMxNiAgICAgICBcdG1wMSwgIFx0bXAxLCAgXHRtcDIKKy5pZiBcd2QgPT0gMTYKKyAgICAgICAgdmNsZS51MTYgICAgICAgIGQ3LCAgZDcsICBkMCAgICAgICAgICAgIEAgZmxhdDhvdXQKKy5lbHNlaWYgXHdkID09IDgKKyAgICAgICAgdmJpYyAgICAgICAgICAgIGQ0LCAgZDQsICBkNiAgICAgICAgICAgIEAgZm0gJiYgIWZsYXQ4aW4KKy5lbmRpZgorICAgICAgICB2YW5kICAgICAgICAgICAgZDUsICBkNSwgIGQ0ICAgICAgICAgICAgQCAhaGV2ICYmIGZtICYmICFmbGF0OGluCisuaWYgXHdkID09IDE2CisgICAgICAgIHZhbmQgICAgICAgICAgICBkNywgIGQ3LCAgZDYgICAgICAgICAgICBAIGZsYXQ4b3V0ICYmIGZsYXQ4aW4gJiYgZm0KKy5lbmRpZgorICAgICAgICB2c2hsLnMxNiAgICAgICAgXHRtcDEsICBcdG1wMSwgIFx0bXA2ICAgQCBhdl9jbGlwX2ludDJwKHAxIC0gcTEsIEJJVF9ERVBUSCAtIDEpCisKKyAgICAgICAgdm11bC5zMTYgICAgICAgIFx0bXAzLCAgXHRtcDMsICBcdG1wNSAgIEAgMyAqIChxMCAtIHAwKQorICAgICAgICB2YmljICAgICAgICAgICAgXHRtcDEsICBcdG1wMSwgICBkNSAgICAgQCBpZiAoIWhldikgYXZfY2xpcF9pbnQycCA9IDAKKyAgICAgICAgdm1vdi5zMTYgICAgICAgIGQyLCAgIzQKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIFx0bXAzLCAgXHRtcDMsICBcdG1wMSAgIEAgMyAqIChxMCAtIHAwKSBbKyBhdl9jbGlwX2ludDJwKHAxIC0gcTEpXQorICAgICAgICB2bW92LnMxNiAgICAgICAgZDMsICAjMworICAgICAgICB2cXNobC5zMTYgICAgICAgXHRtcDEsICBcdG1wMywgIFx0bXAyCisgICAgICAgIHZtb3YuczE2ICAgICAgICBcdG1wNSwgICMwCisgICAgICAgIHZzaGwuczE2ICAgICAgICBcdG1wMSwgIFx0bXAxLCAgXHRtcDYgICBAIGF2X2NsaXBfaW50MnAoMyAqIChxMCAtIHAwKSBbKyBhdl9jbGlwX2ludDJwKHAxIC0gcTEpXSwgQklUX0RFUFRIIC0gMSkgPSBmCisgICAgICAgIHZkdXAudTE2ICAgICAgICBcdG1wNiwgIHI3ICAgICAgICAgICAgICBAIG1heCBwaXhlbCB2YWx1ZQorLmlmIFx3ZCA9PSAxNgorICAgICAgICB2YmljICAgICAgICAgICAgZDYsICBkNiwgIGQ3ICAgICAgICAgICAgQCBmbSAmJiBmbGF0OGluICYmICFmbGF0OG91dAorLmVuZGlmCisKKyAgICAgICAgdnNoci51MTYgICAgICAgIFx0bXAyLCAgXHRtcDYsICAjMSAgICAgIEAgKDEgPDwgKEJJVF9ERVBUSCAtIDEpKSAtIDEKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgXHRtcDMsICBcdG1wMSwgIGQyICAgICAgQCBmICsgNAorICAgICAgICB2YWRkLnMxNiAgICAgICAgXHRtcDQsICBcdG1wMSwgIGQzICAgICAgQCBmICsgMworICAgICAgICB2bWluLnMxNiAgICAgICAgXHRtcDMsICBcdG1wMywgIFx0bXAyICAgQCBGRk1JTihmICsgNCwgKDEgPDwgKEJJVF9ERVBUSCAtIDEpKSAtIDEpCisgICAgICAgIHZtaW4uczE2ICAgICAgICBcdG1wNCwgIFx0bXA0LCAgXHRtcDIgICBAIEZGTUlOKGYgKyAzLCAoMSA8PCAoQklUX0RFUFRIIC0gMSkpIC0gMSkKKyAgICAgICAgdnNoci5zMTYgICAgICAgIFx0bXAzLCAgXHRtcDMsICAjMyAgICAgIEAgZjEKKyAgICAgICAgdnNoci5zMTYgICAgICAgIFx0bXA0LCAgXHRtcDQsICAjMyAgICAgIEAgZjIKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMjMsIFx0bXA0ICAgICAgICAgQCBwMCArIGYyCisgICAgICAgIHZzdWIuczE2ICAgICAgICBkMiwgIGQyNCwgXHRtcDMgICAgICAgICBAIHEwIC0gZjEKKyAgICAgICAgdm1pbi5zMTYgICAgICAgIGQwLCAgZDAsICBcdG1wNgorICAgICAgICB2bWluLnMxNiAgICAgICAgZDIsICBkMiwgIFx0bXA2CisgICAgICAgIHZyc2hyLnMxNiAgICAgICBcdG1wMywgIFx0bXAzLCAgIzEgICAgICBAIGYgPSAoZjEgKyAxKSA+PiAxCisgICAgICAgIHZtYXguczE2ICAgICAgICBkMCwgIGQwLCAgXHRtcDUgICAgICAgICBAIG91dCBwMAorICAgICAgICB2bWF4LnMxNiAgICAgICAgZDIsICBkMiwgIFx0bXA1ICAgICAgICAgQCBvdXQgcTAKKyAgICAgICAgdmJpdCAgICAgICAgICAgIGQyMywgZDAsICBkNCAgICAgICAgICAgIEAgaWYgKGZtICYmICFmbGF0OGluKQorICAgICAgICB2Yml0ICAgICAgICAgICAgZDI0LCBkMiwgIGQ0CisKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIGQwLCAgZDIyLCBcdG1wMyAgICAgICAgIEAgcDEgKyBmCisgICAgICAgIHZzdWIuczE2ICAgICAgICBkMiwgIGQyNSwgXHRtcDMgICAgICAgICBAIHExIC0gZgorLmlmIFx3ZCA+PSA4CisgICAgICAgIHZtb3YgICAgICAgICAgICByOCwgIHI5LCAgZDYKKy5lbmRpZgorICAgICAgICB2bWluLnMxNiAgICAgICAgZDAsICBkMCwgIFx0bXA2CisgICAgICAgIHZtaW4uczE2ICAgICAgICBkMiwgIGQyLCAgXHRtcDYKKy5pZiBcd2QgPj0gOAorICAgICAgICBvcnJzICAgICAgICAgICAgcjgsICByOCwgIHI5CisuZW5kaWYKKyAgICAgICAgdm1heC5zMTYgICAgICAgIGQwLCAgZDAsICBcdG1wNSAgICAgICAgIEAgb3V0IHAxCisgICAgICAgIHZtYXguczE2ICAgICAgICBkMiwgIGQyLCAgXHRtcDUgICAgICAgICBAIG91dCBxMQorICAgICAgICB2Yml0ICAgICAgICAgICAgZDIyLCBkMCwgIGQ1ICAgICAgICAgICAgQCBpZiAoIWhldiAmJiBmbSAmJiAhZmxhdDhpbikKKyAgICAgICAgdmJpdCAgICAgICAgICAgIGQyNSwgZDIsICBkNQorCisuaWYgXHdkID49IDgKKyAgICAgICAgQCBJZiBubyBwaXhlbHMgbmVlZCBmbGF0OGluLCBqdW1wIHRvIGZsYXQ4b3V0CisgICAgICAgIEAgKG9yIHRvIGEgd3JpdGVvdXQgb2YgdGhlIGlubmVyIDQgcGl4ZWxzLCBmb3Igd2Q9OCkKKyAgICAgICAgYmVxICAgICAgICAgICAgIDZmCisKKyAgICAgICAgQCBmbGF0OGluCisgICAgICAgIHZhZGQudTE2ICAgICAgICBcdG1wMSwgIGQyMCwgZDIxCisgICAgICAgIHZhZGQudTE2ICAgICAgICBcdG1wMywgIGQyMiwgZDI1CisgICAgICAgIHZhZGQudTE2ICAgICAgICBcdG1wNSwgIGQyMCwgZDIyCisgICAgICAgIHZhZGQudTE2ICAgICAgICBcdG1wNywgIGQyMywgZDI2CisgICAgICAgIHZhZGQudTE2ICAgICAgICBkMCwgIFx0bXAxLCAgXHRtcDEKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQwLCAgZDAsICBkMjMKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQwLCAgZDAsICBkMjQKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQwLCAgZDAsICBcdG1wNQorICAgICAgICB2c3ViLnMxNiAgICAgICAgXHRtcDMsICBcdG1wMywgIFx0bXAxCisgICAgICAgIHZzdWIuczE2ICAgICAgICBcdG1wNywgIFx0bXA3LCAgXHRtcDUKKyAgICAgICAgdnJzaHIudTE2ICAgICAgIGQyLCAgZDAsICAjMyAgICAgICAgICAgIEAgb3V0IHAyCisKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQwLCAgZDAsICBcdG1wMworICAgICAgICB2YWRkLnUxNiAgICAgICAgXHRtcDEsICBkMjAsIGQyMworICAgICAgICB2YWRkLnUxNiAgICAgICAgXHRtcDMsICBkMjQsIGQyNworICAgICAgICB2cnNoci51MTYgICAgICAgZDMsICBkMCwgICMzICAgICAgICAgICAgQCBvdXQgcDEKKworICAgICAgICB2YWRkLnUxNiAgICAgICAgZDAsICBkMCwgIFx0bXA3CisgICAgICAgIHZzdWIuczE2ICAgICAgICBcdG1wMywgIFx0bXAzLCAgXHRtcDEKKyAgICAgICAgdmFkZC51MTYgICAgICAgIFx0bXA1LCAgZDIxLCBkMjQKKyAgICAgICAgdmFkZC51MTYgICAgICAgIFx0bXA3LCAgZDI1LCBkMjcKKyAgICAgICAgdnJzaHIudTE2ICAgICAgIGQ0LCAgZDAsICAjMyAgICAgICAgICAgIEAgb3V0IHAwCisKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQwLCAgZDAsICBcdG1wMworICAgICAgICB2c3ViLnMxNiAgICAgICAgXHRtcDcsICBcdG1wNywgIFx0bXA1CisgICAgICAgIHZhZGQudTE2ICAgICAgICBcdG1wMSwgIGQyMiwgZDI1CisgICAgICAgIHZhZGQudTE2ICAgICAgICBcdG1wMywgIGQyNiwgZDI3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkNSwgIGQwLCAgIzMgICAgICAgICAgICBAIG91dCBkMAorCisgICAgICAgIHZhZGQudTE2ICAgICAgICBkMCwgIGQwLCAgXHRtcDcKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIFx0bXAzLCAgXHRtcDMsICBcdG1wMQorICAgICAgICB2cnNoci51MTYgICAgICAgXHRtcDUsICBkMCwgICMzICAgICAgICAgQCBvdXQgcTEKKworICAgICAgICB2YWRkLnUxNiAgICAgICAgZDAsICBkMCwgIFx0bXAzCisgICAgICAgIEAgVGhlIG91dHB1dCBoZXJlIGlzIHdyaXR0ZW4gYmFjayBpbnRvIHRoZSBpbnB1dCByZWdpc3RlcnMuIFRoaXMgZG9lc24ndAorICAgICAgICBAIG1hdHRlciBmb3IgdGhlIGZsYXQ4b3V0IHBhcnQgYmVsb3csIHNpbmNlIHdlIG9ubHkgdXBkYXRlIHRob3NlIHBpeGVscworICAgICAgICBAIHdoaWNoIHdvbid0IGJlIHRvdWNoZWQgYmVsb3cuCisgICAgICAgIHZiaXQgICAgICAgICAgICBkMjEsIGQyLCAgZDYKKyAgICAgICAgdmJpdCAgICAgICAgICAgIGQyMiwgZDMsICBkNgorICAgICAgICB2Yml0ICAgICAgICAgICAgZDIzLCBkNCwgIGQ2CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBcdG1wNiwgIGQwLCAgIzMgICAgICAgICBAIG91dCBxMgorICAgICAgICB2Yml0ICAgICAgICAgICAgZDI0LCBkNSwgIGQ2CisgICAgICAgIHZiaXQgICAgICAgICAgICBkMjUsIFx0bXA1LCAgZDYKKyAgICAgICAgdmJpdCAgICAgICAgICAgIGQyNiwgXHRtcDYsICBkNgorLmVuZGlmCisuaWYgXHdkID09IDE2Cis2OgorICAgICAgICB2b3JyICAgICAgICAgICAgZDIsICBkNiwgIGQ3CisgICAgICAgIHZtb3YgICAgICAgICAgICByOCwgIHI5LCAgZDIKKyAgICAgICAgb3JycyAgICAgICAgICAgIHI4LCAgcjgsICByOQorICAgICAgICBAIElmIG5vIHBpeGVscyBuZWVkZWQgZmxhdDhpbiBub3IgZmxhdDhvdXQsIGp1bXAgdG8gYQorICAgICAgICBAIHdyaXRlb3V0IG9mIHRoZSBpbm5lciA0IHBpeGVscworICAgICAgICBiZXEgICAgICAgICAgICAgN2YKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHI4LCAgcjksICBkNworICAgICAgICBvcnJzICAgICAgICAgICAgcjgsICByOCwgIHI5CisgICAgICAgIEAgSWYgbm8gcGl4ZWxzIG5lZWQgZmxhdDhvdXQsIGp1bXAgdG8gYSB3cml0ZW91dCBvZiB0aGUgaW5uZXIgNiBwaXhlbHMKKyAgICAgICAgYmVxICAgICAgICAgICAgIDhmCisKKyAgICAgICAgQCBmbGF0OG91dAorICAgICAgICBAIFRoaXMgd3JpdGVzIGFsbCBvdXRwdXRzIGludG8gZDItZDE3IChza2lwcGluZyBkNiBhbmQgZDE2KS4KKyAgICAgICAgQCBJZiB0aGlzIHBhcnQgaXMgc2tpcHBlZCwgdGhlIG91dHB1dCBpcyByZWFkIGZyb20gZDIxLWQyNiAod2hpY2ggaXMgdGhlIGlucHV0CisgICAgICAgIEAgdG8gdGhpcyBzZWN0aW9uKS4KKyAgICAgICAgdnNobC51MTYgICAgICAgIGQwLCAgZDE2LCAjMyAgQCA4ICogZDE2CisgICAgICAgIHZzdWIudTE2ICAgICAgICBkMCwgIGQwLCAgZDE2IEAgNyAqIGQxNgorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDAsICBkMCwgIGQxNworICAgICAgICB2YWRkLnUxNiAgICAgICAgZDgsICBkMTcsIGQxOAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDEwLCBkMTksIGQyMAorICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQ4CisgICAgICAgIHZhZGQudTE2ICAgICAgICBkOCwgIGQxNiwgZDE3CisgICAgICAgIHZhZGQudTE2ICAgICAgICBkMTIsIGQyMSwgZDIyCisgICAgICAgIHZhZGQuczE2ICAgICAgICBkMCwgIGQwLCAgZDEwCisgICAgICAgIHZhZGQudTE2ICAgICAgICBkMTAsIGQxOCwgZDI1CisgICAgICAgIHZhZGQudTE2ICAgICAgICBkMTQsIGQyMywgZDI0CisgICAgICAgIHZzdWIuczE2ICAgICAgICBkMTAsIGQxMCwgZDgKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIGQwLCAgZDAsICBkMTIKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIGQwLCAgZDAsICBkMTQKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQxMiwgZDE2LCBkMTgKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQxNCwgZDE5LCBkMjYKKyAgICAgICAgdnJzaHIudTE2ICAgICAgIGQyLCAgZDAsICAjNAorCisgICAgICAgIHZhZGQuczE2ICAgICAgICBkMCwgIGQwLCAgZDEwCisgICAgICAgIHZhZGQudTE2ICAgICAgICBkOCwgIGQxNiwgZDE5CisgICAgICAgIHZhZGQudTE2ICAgICAgICBkMTAsIGQyMCwgZDI3CisgICAgICAgIHZzdWIuczE2ICAgICAgICBkMTQsIGQxNCwgZDEyCisgICAgICAgIHZiaWYgICAgICAgICAgICBkMiwgIGQxNywgZDcKKyAgICAgICAgdnJzaHIudTE2ICAgICAgIGQzLCAgZDAsICAjNAorCisgICAgICAgIHZhZGQuczE2ICAgICAgICBkMCwgIGQwLCAgZDE0CisgICAgICAgIHZhZGQudTE2ICAgICAgICBkMTIsIGQxNiwgZDIwCisgICAgICAgIHZhZGQudTE2ICAgICAgICBkMTQsIGQyMSwgZDI4CisgICAgICAgIHZzdWIuczE2ICAgICAgICBkMTAsIGQxMCwgZDgKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQzLCAgZDE4LCBkNworICAgICAgICB2cnNoci51MTYgICAgICAgZDQsICBkMCwgICM0CisKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIGQwLCAgZDAsICBkMTAKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQ4LCAgZDE2LCBkMjEKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQxMCwgZDIyLCBkMjkKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIGQxNCwgZDE0LCBkMTIKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQ0LCAgZDE5LCBkNworICAgICAgICB2cnNoci51MTYgICAgICAgZDUsICBkMCwgICM0CisKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIGQwLCAgZDAsICBkMTQKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQxMiwgZDE2LCBkMjIKKyAgICAgICAgdmFkZC51MTYgICAgICAgIGQxNCwgZDIzLCBkMzAKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIGQxMCwgZDEwLCBkOAorICAgICAgICB2YmlmICAgICAgICAgICAgZDUsICBkMjAsIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkNiwgIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQxMAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDEwLCBkMTYsIGQyMworICAgICAgICB2c3ViLnMxNiAgICAgICAgZDE0LCBkMTQsIGQxMgorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDEyLCBkMjQsIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDYsICBkMjEsIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkOCwgIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQxNAorICAgICAgICB2c3ViLnMxNiAgICAgICAgZDEwLCBkMTIsIGQxMAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDEyLCBkMTcsIGQyNAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDE0LCBkMjUsIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDgsICBkMjIsIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkOSwgIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQxMAorICAgICAgICB2c3ViLnMxNiAgICAgICAgZDE0LCBkMTQsIGQxMgorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDEyLCBkMjYsIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDksICBkMjMsIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkMTAsIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQxNAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDE0LCBkMTgsIGQyNQorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDE4LCBkMTksIGQyNgorICAgICAgICB2c3ViLnMxNiAgICAgICAgZDEyLCBkMTIsIGQxNAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDE0LCBkMjcsIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDEwLCBkMjQsIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkMTEsIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQxMgorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDEyLCBkMjAsIGQyNworICAgICAgICB2c3ViLnMxNiAgICAgICAgZDE0LCBkMTQsIGQxOAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDE4LCBkMjgsIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDExLCBkMjUsIGQ3CisgICAgICAgIHZzdWIuczE2ICAgICAgICBkMTgsIGQxOCwgZDEyCisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkMTIsIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQxNAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDE0LCBkMjEsIGQyOAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDIwLCBkMjksIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDEyLCBkMjYsIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkMTMsIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQxOAorICAgICAgICB2c3ViLnMxNiAgICAgICAgZDIwLCBkMjAsIGQxNAorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDE4LCBkMjIsIGQyOQorICAgICAgICB2YWRkLnUxNiAgICAgICAgZDIyLCBkMzAsIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDEzLCBkMjcsIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkMTQsIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQyMAorICAgICAgICB2c3ViLnMxNiAgICAgICAgZDIyLCBkMjIsIGQxOAorICAgICAgICB2YmlmICAgICAgICAgICAgZDE0LCBkMjgsIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkMTUsIGQwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgZDAsICBkMCwgIGQyMgorICAgICAgICB2YmlmICAgICAgICAgICAgZDE1LCBkMjksIGQ3CisgICAgICAgIHZyc2hyLnUxNiAgICAgICBkMTcsIGQwLCAgIzQKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQxNywgZDMwLCBkNworLmVuZGlmCisuZW5kbQorCisubWFjcm8gbG9vcF9maWx0ZXJfcV80CisgICAgICAgIGxvb3BfZmlsdGVyX3EgICA0CisuZW5kbQorCisubWFjcm8gbG9vcF9maWx0ZXJfcV84CisgICAgICAgIGxvb3BfZmlsdGVyX3EgICA4CisuZW5kbQorCisubWFjcm8gbG9vcF9maWx0ZXJfMTYKKyAgICAgICAgbG9vcF9maWx0ZXIgICAgIDE2LCBkOCwgIGQ5LCAgZDEwLCBkMTEsIGQxMiwgZDEzLCBkMTQsIGQxNQorLmVuZG0KKworCitAIFRoZSBwdWJsaWMgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBoYXZlIGdvdCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKK0Agdm9pZCBsb29wX2ZpbHRlcih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBtYl9saW0sIGludCBsaW0sIGludCBoZXZfdGhyKTsKKworLm1hY3JvIGJwcF9mcm9udGVuZCBmdW5jLCBicHAKK2Z1bmN0aW9uIGZmX1xmdW5jXCgpX1xicHBcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOSxscn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMjhdCisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIGxzbCAgICAgICAgICAgICByMiwgIHIyLCAgI1xicHAgLSA4CisgICAgICAgIGxzbCAgICAgICAgICAgICByMywgIHIzLCAgI1xicHAgLSA4CisgICAgICAgIGxzbCAgICAgICAgICAgICByNCwgIHI0LCAgI1xicHAgLSA4CisgICAgICAgIG1vdiAgICAgICAgICAgICByNSwgICMxIDw8IChcYnBwIC0gOCkKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI2LCAgIzE2IC0gXGJwcAorICAgICAgICBtb3Z3ICAgICAgICAgICAgcjcsICAjKCgxIDw8IFxicHApIC0gMSkKKyAgICAgICAgYmwgICAgICAgICAgICAgIFxmdW5jXCgpXzE2X25lb24KKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSxwY30KK2VuZGZ1bmMKKy5lbmRtCisKKy5tYWNybyBicHBfZnJvbnRlbmRzIGZ1bmMKKyAgICAgICAgYnBwX2Zyb250ZW5kICAgIFxmdW5jLCAxMAorICAgICAgICBicHBfZnJvbnRlbmQgICAgXGZ1bmMsIDEyCisuZW5kbQorCisubWFjcm8gYnBwX2Zyb250ZW5kX3JlcCBmdW5jLCBzdWZmaXgsIGludF9zdWZmaXgsIHJlcCwgZGlyLCBicHAKK2Z1bmN0aW9uIGZmX1xmdW5jXCgpX1xzdWZmaXhcKClfXGJwcFwoKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI5LGxyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMyOF0KKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtxNC1xN30KKyAgICAgICAgbHNsICAgICAgICAgICAgIHIyLCAgcjIsICAjXGJwcCAtIDgKKyAgICAgICAgbHNsICAgICAgICAgICAgIHIzLCAgcjMsICAjXGJwcCAtIDgKKyAgICAgICAgbHNsICAgICAgICAgICAgIHI0LCAgcjQsICAjXGJwcCAtIDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI1LCAgIzEgPDwgKFxicHAgLSA4KQorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICAjMTYgLSBcYnBwCisgICAgICAgIG1vdncgICAgICAgICAgICByNywgICMoKDEgPDwgXGJwcCkgLSAxKQorICAgICAgICBibCAgICAgICAgICAgICAgXGZ1bmNcKClfXGludF9zdWZmaXhcKClfMTZfbmVvbgorLmlmYyBcZGlyLGgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisuZWxzZQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisuZW5kaWYKKyAgICAgICAgYmwgICAgICAgICAgICAgIFxmdW5jXCgpX1xpbnRfc3VmZml4XCgpXzE2X25lb24KKy5pZiBccmVwID49IDQKKy5pZmMgXGRpcixoCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMgorICAgICAgICBibCAgICAgICAgICAgICAgXGZ1bmNcKClfXGludF9zdWZmaXhcKClfMTZfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgYmwgICAgICAgICAgICAgIFxmdW5jXCgpX1xpbnRfc3VmZml4XCgpXzE2X25lb24KKy5lbHNlCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgYmwgICAgICAgICAgICAgIFxmdW5jXCgpX1xpbnRfc3VmZml4XCgpXzE2X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICBibCAgICAgICAgICAgICAgXGZ1bmNcKClfXGludF9zdWZmaXhcKClfMTZfbmVvbgorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yOSxwY30KK2VuZGZ1bmMKKy5lbmRtCisKKy5tYWNybyBicHBfZnJvbnRlbmRzX3JlcCBmdW5jLCBzdWZmaXgsIGludF9zdWZmaXgsIHJlcCwgZGlyCisgICAgICAgIGJwcF9mcm9udGVuZF9yZXAgXGZ1bmMsIFxzdWZmaXgsIFxpbnRfc3VmZml4LCBccmVwLCBcZGlyLCAxMAorICAgICAgICBicHBfZnJvbnRlbmRfcmVwIFxmdW5jLCBcc3VmZml4LCBcaW50X3N1ZmZpeCwgXHJlcCwgXGRpciwgMTIKKy5lbmRtCisKKy5tYWNybyBicHBfZnJvbnRlbmRfbWl4MiB3ZDEsIHdkMiwgZGlyLCBicHAKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl9cZGlyXCgpX1x3ZDFcKClcd2QyXCgpXzE2X1xicHBcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOSxscn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMjhdCisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjIsIHIzLCByNH0KKyAgICAgICAgYW5kICAgICAgICAgICAgIHIyLCAgcjIsICAjMHhmZgorICAgICAgICBhbmQgICAgICAgICAgICAgcjMsICByMywgICMweGZmCisgICAgICAgIGFuZCAgICAgICAgICAgICByNCwgIHI0LCAgIzB4ZmYKKyAgICAgICAgbHNsICAgICAgICAgICAgIHIyLCAgcjIsICAjXGJwcCAtIDgKKyAgICAgICAgbHNsICAgICAgICAgICAgIHIzLCAgcjMsICAjXGJwcCAtIDgKKyAgICAgICAgbHNsICAgICAgICAgICAgIHI0LCAgcjQsICAjXGJwcCAtIDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI1LCAgIzEgPDwgKFxicHAgLSA4KQorICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICAjMTYgLSBcYnBwCisgICAgICAgIG1vdncgICAgICAgICAgICByNywgICMoKDEgPDwgXGJwcCkgLSAxKQorICAgICAgICBibCAgICAgICAgICAgICAgdnA5X2xvb3BfZmlsdGVyX1xkaXJcKClfXHdkMVwoKV84XzE2X25lb24KKy5pZmMgXGRpcixoCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMworLmVsc2UKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjMTYKKy5lbmRpZgorICAgICAgICBwb3AgICAgICAgICAgICAge3IyLCByMywgcjR9CisgICAgICAgIGxzciAgICAgICAgICAgICByMiwgIHIyLCAgIzgKKyAgICAgICAgbHNyICAgICAgICAgICAgIHIzLCAgcjMsICAjOAorICAgICAgICBsc3IgICAgICAgICAgICAgcjQsICByNCwgICM4CisgICAgICAgIGxzbCAgICAgICAgICAgICByMiwgIHIyLCAgI1xicHAgLSA4CisgICAgICAgIGxzbCAgICAgICAgICAgICByMywgIHIzLCAgI1xicHAgLSA4CisgICAgICAgIGxzbCAgICAgICAgICAgICByNCwgIHI0LCAgI1xicHAgLSA4CisgICAgICAgIGJsICAgICAgICAgICAgICB2cDlfbG9vcF9maWx0ZXJfXGRpclwoKV9cd2QyXCgpXzhfMTZfbmVvbgorICAgICAgICB2cG9wICAgICAgICAgICAge3E0LXE3fQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI5LHBjfQorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGJwcF9mcm9udGVuZHNfbWl4MiB3ZDEsIHdkMgorICAgICAgICBicHBfZnJvbnRlbmRfbWl4MiBcd2QxLCBcd2QyLCB2LCAxMAorICAgICAgICBicHBfZnJvbnRlbmRfbWl4MiBcd2QxLCBcd2QyLCB2LCAxMgorICAgICAgICBicHBfZnJvbnRlbmRfbWl4MiBcd2QxLCBcd2QyLCBoLCAxMAorICAgICAgICBicHBfZnJvbnRlbmRfbWl4MiBcd2QxLCBcd2QyLCBoLCAxMgorLmVuZG0KKworZnVuY3Rpb24gdnA5X2xvb3BfZmlsdGVyX3ZfNF84XzE2X25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjAsICByMSwgbHNsICMyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTh9LCAgW3IxMiw6MTI4XSwgcjEgQCBwMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMn0sIFtyMCwgOjEyOF0sIHIxIEAgcTAKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxOX0sICBbcjEyLDoxMjhdLCByMSBAIHAyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEzfSwgW3IwLCA6MTI4XSwgcjEgQCBxMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMH0sIFtyMTIsOjEyOF0sIHIxIEAgcDEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTR9LCBbcjAsIDoxMjhdLCByMSBAIHEyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTExfSwgW3IxMiw6MTI4XSwgcjEgQCBwMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExNX0sIFtyMCwgOjEyOF0sIHIxIEAgcTMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMQorCisgICAgICAgIGxvb3BfZmlsdGVyX3FfNAorCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgW3IxMiw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCBbcjAsIDoxMjhdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyMTIsOjEyOF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgW3IwLCA6MTI4XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMxCis5OgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworYnBwX2Zyb250ZW5kcyB2cDlfbG9vcF9maWx0ZXJfdl80XzgKKworCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfaF80XzhfMTZfbmVvbgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMCwgICM4CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3E4fSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTJ9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTl9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExM30sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTB9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTE0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMX0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTV9LCBbcjAsIDo2NF0sIHIxCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCByMSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMgorICAgICAgICBAIE1vdmUgcjAvcjEyIGZvcndhcmQgYnkgMiBwaXhlbHM7IHdlIGRvbid0IG5lZWQgdG8gcmV3cml0ZSB0aGUKKyAgICAgICAgQCBvdXRlcm1vc3QgMiBwaXhlbHMgc2luY2UgdGhleSBhcmVuJ3QgY2hhbmdlZC4KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM0CisKKyAgICAgICAgdHJhbnNwb3NlMTZfcV84eDggcTgsIHE5LCBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1LCBkMTYsIGQxNywgZDE4LCBkMTksIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEKKworICAgICAgICBsb29wX2ZpbHRlcl9xXzQKKworICAgICAgICBAIFdlIG9ubHkgd2lsbCB3cml0ZSB0aGUgbWlkIDQgcGl4ZWxzIGJhY2s7IGFmdGVyIHRoZSBsb29wIGZpbHRlciwKKyAgICAgICAgQCB0aGVzZSBhcmUgaW4gcTEwLCBxMTEsIHExMiwgcTEzLCBvcmRlcmVkIGFzIHJvd3MgKDh4NCBwaXhlbHMpLgorICAgICAgICBAIFdlIG5lZWQgdG8gdHJhbnNwb3NlIHRoZW0gdG8gY29sdW1ucywgZG9uZSB3aXRoIGEKKyAgICAgICAgQCA0eDQgdHJhbnNwb3NlICh3aGljaCBpbiBwcmFjdGljZSBpcyB0d28gNHg0IHRyYW5zcG9zZXMgb2YgdGhlIHR3bworICAgICAgICBAIDR4NCBoYWx2ZXMgb2YgdGhlIDh4NCBwaXhlbHM7IGludG8gNHg4IHBpeGVscykuCisgICAgICAgIHRyYW5zcG9zZTE2XzR4NCBxMTAsIHExMSwgcTEyLCBxMTMKKworICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMH0sIFtyMTJdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMX0sIFtyMF0sICByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMn0sIFtyMTJdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyM30sIFtyMF0sICByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyNH0sIFtyMTJdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyNX0sIFtyMF0sICByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyNn0sIFtyMTJdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyN30sIFtyMF0sICByMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMTIsIHIxLCBsc2wgIzIKKzk6CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIxMiwgIzQKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2JwcF9mcm9udGVuZHMgdnA5X2xvb3BfZmlsdGVyX2hfNF84CisKKworZnVuY3Rpb24gdnA5X2xvb3BfZmlsdGVyX3ZfOF84XzE2X25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjAsICByMSwgbHNsICMyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTh9LCAgW3IxMiw6MTI4XSwgcjEgQCBwMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMn0sIFtyMCwgOjEyOF0sIHIxIEAgcTAKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxOX0sICBbcjEyLDoxMjhdLCByMSBAIHAyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEzfSwgW3IwLCA6MTI4XSwgcjEgQCBxMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMH0sIFtyMTIsOjEyOF0sIHIxIEAgcDEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTR9LCBbcjAsIDoxMjhdLCByMSBAIHEyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTExfSwgW3IxMiw6MTI4XSwgcjEgQCBwMAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExNX0sIFtyMCwgOjEyOF0sIHIxIEAgcTMKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCByMSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsIHIxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfcV84CisKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxOX0sICBbcjEyLDoxMjhdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMn0sIFtyMCwgOjEyOF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgW3IxMiw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTN9LCBbcjAsIDoxMjhdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyMTIsOjEyOF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTE0fSwgW3IwLCA6MTI4XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEKKzk6CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorNjoKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjAsICByMSwgbHNsICMxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEwfSwgW3IxMiw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCBbcjAsIDoxMjhdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyMTIsOjEyOF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEzfSwgW3IwLCA6MTI4XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMxCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCiticHBfZnJvbnRlbmRzIHZwOV9sb29wX2ZpbHRlcl92XzhfOAorCisKK2Z1bmN0aW9uIHZwOV9sb29wX2ZpbHRlcl9oXzhfOF8xNl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIwLCAgIzgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjEyLCByMSwgbHNsICMyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTh9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMn0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxOX0sICBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEzfSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMH0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTR9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTExfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExNX0sIFtyMCwgOjY0XSwgcjEKKworICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMTIsIHIxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisKKyAgICAgICAgdHJhbnNwb3NlMTZfcV84eDggcTgsIHE5LCBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1LCBkMTYsIGQxNywgZDE4LCBkMTksIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEKKworICAgICAgICBsb29wX2ZpbHRlcl9xXzgKKworICAgICAgICBAIEV2ZW4gdGhvdWdoIG9ubHkgNiBwaXhlbHMgcGVyIHJvdyBoYXZlIGJlZW4gY2hhbmdlZCwgd2Ugd3JpdGUgdGhlCisgICAgICAgIEAgZnVsbCA4IHBpeGVsIHJlZ2lzdGVycy4KKyAgICAgICAgdHJhbnNwb3NlMTZfcV84eDggcTgsIHE5LCBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1LCBkMTYsIGQxNywgZDE4LCBkMTksIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEKKworICAgICAgICB2c3QxLjE2ICAgICAgICAge3E4fSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTl9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExM30sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTB9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTE0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMX0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMgorOToKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjEyLCAjOAorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKzY6CisgICAgICAgIEAgSWYgd2UgZGlkbid0IG5lZWQgdG8gZG8gdGhlIGZsYXQ4aW4gcGFydCwgd2UgdXNlIHRoZSBzYW1lIHdyaXRlYmFjaworICAgICAgICBAIGFzIGluIGxvb3BfZmlsdGVyX2hfNF84LgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzQKKyAgICAgICAgdHJhbnNwb3NlMTZfNHg0IHExMCwgcTExLCBxMTIsIHExMworCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIwfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIxfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIyfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIzfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI0fSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI1fSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI2fSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI3fSwgW3IwXSwgIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMTIsICM0CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCiticHBfZnJvbnRlbmRzIHZwOV9sb29wX2ZpbHRlcl9oXzhfOAorCiticHBfZnJvbnRlbmRzX21peDIgNCwgNAorYnBwX2Zyb250ZW5kc19taXgyIDQsIDgKK2JwcF9mcm9udGVuZHNfbWl4MiA4LCA0CiticHBfZnJvbnRlbmRzX21peDIgOCwgOAorCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfdl8xNl80XzE2X25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjAsICByMSwgbHNsICMzCisgICAgICAgIEAgUmVhZCBwNy1wMCB1c2luZyByMTIgYW5kIHEwLXE3IHVzaW5nIHIwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE2fSwgW3IxMiw6NjRdLCByMSBAIHA3CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI0fSwgW3IwLCA6NjRdLCByMSBAIHEwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE3fSwgW3IxMiw6NjRdLCByMSBAIHA2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI1fSwgW3IwLCA6NjRdLCByMSBAIHExCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE4fSwgW3IxMiw6NjRdLCByMSBAIHA1CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI2fSwgW3IwLCA6NjRdLCByMSBAIHEyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE5fSwgW3IxMiw6NjRdLCByMSBAIHA0CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI3fSwgW3IwLCA6NjRdLCByMSBAIHEzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIwfSwgW3IxMiw6NjRdLCByMSBAIHAzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI4fSwgW3IwLCA6NjRdLCByMSBAIHE0CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIxfSwgW3IxMiw6NjRdLCByMSBAIHAyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI5fSwgW3IwLCA6NjRdLCByMSBAIHE1CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIyfSwgW3IxMiw6NjRdLCByMSBAIHAxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDMwfSwgW3IwLCA6NjRdLCByMSBAIHE2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIzfSwgW3IxMiw6NjRdLCByMSBAIHAwCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDMxfSwgW3IwLCA6NjRdLCByMSBAIHE3CisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCByMQorCisgICAgICAgIGxvb3BfZmlsdGVyXzE2CisKKyAgICAgICAgQCBJZiB3ZSBkaWQgdGhlIGZsYXQ4b3V0IHBhcnQsIHdlIGdldCB0aGUgb3V0cHV0IGluCisgICAgICAgIEAgZDItZDE3IChza2lwcGluZyBkNyBhbmQgZDE2KS4gcjEyIHBvaW50cyB0byByMCAtIDcgKiBzdHJpZGUsCisgICAgICAgIEAgc3RvcmUgZDItZDkgdGhlcmUsIGFuZCBkMTAtZDE3IGludG8gcjAuCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJ9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxMH0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkM30sICBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDExfSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q0fSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTJ9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDV9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxM30sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkNn0sICBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q4fSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDl9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxN30sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMzCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjEKKworOToKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCisKKzg6CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICBAIElmIHdlIGRpZG4ndCBkbyB0aGUgZmxhdDhvdXQgcGFydCwgdGhlIG91dHB1dCBpcyBsZWZ0IGluIHRoZQorICAgICAgICBAIGlucHV0IHJlZ2lzdGVycy4KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjF9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMn0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIzfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyNn0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCis3OgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMCwgIHIxLCBsc2wgIzEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjJ9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyM30sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworYnBwX2Zyb250ZW5kc19yZXAgdnA5X2xvb3BfZmlsdGVyX3ZfMTYsIDgsICA0LCAyLCB2CiticHBfZnJvbnRlbmRzX3JlcCB2cDlfbG9vcF9maWx0ZXJfdl8xNiwgMTYsIDQsIDQsIHYKKworZnVuY3Rpb24gdnA5X2xvb3BfZmlsdGVyX2hfMTZfNF8xNl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIwLCAgIzE2CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgIzgKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTZ9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIwfSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxN30sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjF9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE4fSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyMn0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTl9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIzfSwgW3IwLCA6NjRdLCByMQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMTIsIHIxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzE2CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzE2CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI0fSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyOH0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjV9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI5fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyNn0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMzB9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI3fSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QzMX0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMTIsICMxNgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICMxNgorCisgICAgICAgIEAgVGhlIDE2eDQgcGl4ZWxzIHJlYWQgYWJvdmUgaXMgaW4gZm91ciA0eDQgYmxvY2tzCisgICAgICAgIHRyYW5zcG9zZTE2X3FfNHg0IHE4LCAgcTksICBkMTYsIGQxNywgZDE4LCBkMTkKKyAgICAgICAgdHJhbnNwb3NlMTZfcV80eDQgcTEwLCBxMTEsIGQyMCwgZDIxLCBkMjIsIGQyMworICAgICAgICB0cmFuc3Bvc2UxNl9xXzR4NCBxMTIsIHExMywgZDI0LCBkMjUsIGQyNiwgZDI3CisgICAgICAgIHRyYW5zcG9zZTE2X3FfNHg0IHExNCwgcTE1LCBkMjgsIGQyOSwgZDMwLCBkMzEKKworICAgICAgICBsb29wX2ZpbHRlcl8xNgorCisgICAgICAgIEAgVHJhbnNwb3NlIGJhY2s7IHRoaXMgaXMgdGhlIHNhbWUgdHJhbnNwb3NlIGFzIGFib3ZlLCBidXQKKyAgICAgICAgQCB3ZSBjYW4ndCB0YWtlIGFkdmFudGFnZSBvZiBxIHJlZ2lzdGVycyBmb3IgdGhlIHRyYW5zcG9zZSwgc2luY2UKKyAgICAgICAgQCBhbGwgZCByZWdpc3RlcnMgaW4gdGhlIHRyYW5zcG9zZSBhcmVuJ3QgY29uc2VjdXRpdmUuCisgICAgICAgIHRyYW5zcG9zZTE2XzR4NCBkMTYsIGQyLCAgZDMsICBkNAorICAgICAgICB0cmFuc3Bvc2UxNl80eDQgZDUsICBkNiwgIGQ4LCAgZDkKKyAgICAgICAgdHJhbnNwb3NlMTZfNHg0IGQxMCwgZDExLCBkMTIsIGQxMworICAgICAgICB0cmFuc3Bvc2UxNl80eDQgZDE0LCBkMTUsIGQxNywgZDMxCisKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTZ9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDV9LCAgW3IwLCA6NjRdLCByMQorCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJ9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2Q2fSwgIFtyMCwgOjY0XSwgcjEKKworICAgICAgICB2c3QxLjE2ICAgICAgICAge2QzfSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkOH0sICBbcjAsIDo2NF0sIHIxCisKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkNH0sICBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDl9LCAgW3IwLCA6NjRdLCByMQorCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCAjMTYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjMTYKKworICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxMH0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTR9LCBbcjAsIDo2NF0sIHIxCisKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMTF9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDE1fSwgW3IwLCA6NjRdLCByMQorCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDEyfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxN30sIFtyMCwgOjY0XSwgcjEKKworICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxM30sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMzF9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorOToKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKzg6CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzgKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjOAorICAgICAgICB0cmFuc3Bvc2UxNl9xXzR4NCBxMTAsIHExMSwgZDIwLCBkMjEsIGQyMiwgZDIzCisgICAgICAgIHRyYW5zcG9zZTE2X3FfNHg0IHExMiwgcTEzLCBkMjQsIGQyNSwgZDI2LCBkMjcKKworICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyMH0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjR9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDIxfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyNX0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjJ9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDI2fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QyM30sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjd9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKzc6CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzEyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIxMiwgcjEsIGxzbCAjMQorICAgICAgICB0cmFuc3Bvc2UxNl9xXzR4NCBxMTEsIHExMiwgZDIyLCBkMjMsIGQyNCwgZDI1CisKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjJ9LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjR9LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjN9LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjV9LCBbcjBdLCAgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzQKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2JwcF9mcm9udGVuZHNfcmVwIHZwOV9sb29wX2ZpbHRlcl9oXzE2LCA4LCAgNCwgMiwgaAorYnBwX2Zyb250ZW5kc19yZXAgdnA5X2xvb3BfZmlsdGVyX2hfMTYsIDE2LCA0LCA0LCBoCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS92cDlscGZfbmVvbi5TIGIvbGliYXZjb2RlYy9hcm0vdnA5bHBmX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjM2MDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hcm0vdnA5bHBmX25lb24uUwpAQCAtMCwwICsxLDk1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKyNpbmNsdWRlICJuZW9uLlMiCisKK0AgRG8gYW4gOHg4IHRyYW5zcG9zZSwgdXNpbmcgcSByZWdpc3RlcnMgZm9yIHRoZSBzdWJ0cmFuc3Bvc2VzIHRoYXQgZG9uJ3QKK0AgbmVlZCB0byBhZGRyZXNzIHRoZSBpbmRpdml1ZGFsIGQgcmVnaXN0ZXJzLgorQCByMCxyMSA9PSBycTAsIHIyLHIzID09IHJxMSwgZXRjCisubWFjcm8gdHJhbnNwb3NlX3FfOHg4IHJxMCwgcnExLCBycTIsIHJxMywgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3CisgICAgICAgIHZ0cm4uMzIgICAgICAgICBccnEwLCBccnEyCisgICAgICAgIHZ0cm4uMzIgICAgICAgICBccnExLCBccnEzCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccnEwLCBccnExCisgICAgICAgIHZ0cm4uMTYgICAgICAgICBccnEyLCBccnEzCisgICAgICAgIHZ0cm4uOCAgICAgICAgICBccjAsICBccjEKKyAgICAgICAgdnRybi44ICAgICAgICAgIFxyMiwgIFxyMworICAgICAgICB2dHJuLjggICAgICAgICAgXHI0LCAgXHI1CisgICAgICAgIHZ0cm4uOCAgICAgICAgICBccjYsICBccjcKKy5lbmRtCisKK0AgRG8gYSA0eDQgdHJhbnNwb3NlLCB1c2luZyBxIHJlZ2lzdGVycyBmb3IgdGhlIHN1YnRyYW5zcG9zZXMgdGhhdCBkb24ndAorQCBuZWVkIHRvIGFkZHJlc3MgdGhlIGluZGl2aXVkYWwgZCByZWdpc3RlcnMuCitAIHIwLHIxID09IHJxMCwgcjIscjMgPT0gcnExCisubWFjcm8gdHJhbnNwb3NlX3FfNHg0IHJxMCwgcnExLCByMCwgcjEsIHIyLCByMworICAgICAgICB2dHJuLjE2ICAgICAgICAgXHJxMCwgXHJxMQorICAgICAgICB2dHJuLjggICAgICAgICAgXHIwLCAgXHIxCisgICAgICAgIHZ0cm4uOCAgICAgICAgICBccjIsICBccjMKKy5lbmRtCisKK0AgVGhlIGlucHV0IHRvIGFuZCBvdXRwdXQgZnJvbSB0aGlzIG1hY3JvIGlzIGluIHRoZSByZWdpc3RlcnMgcTgtcTE1LAorQCBhbmQgcTAtcTcgYXJlIHVzZWQgYXMgc2NyYXRjaCByZWdpc3RlcnMuCitAIHAzID0gcTgsIHAwID0gcTExLCBxMCA9IHExMiwgcTMgPSBxMTUKKy5tYWNybyBsb29wX2ZpbHRlcl9xCisgICAgICAgIHZkdXAudTggICAgICAgICBkMCwgIHIyICAgICAgICAgIEAgRQorICAgICAgICBsc3IgICAgICAgICAgICAgcjIsICByMiwgICM4CisgICAgICAgIHZkdXAudTggICAgICAgICBkMiwgIHIzICAgICAgICAgIEAgSQorICAgICAgICBsc3IgICAgICAgICAgICAgcjMsICByMywgICM4CisgICAgICAgIHZkdXAudTggICAgICAgICBkMSwgIHIyICAgICAgICAgIEAgRQorICAgICAgICB2ZHVwLnU4ICAgICAgICAgZDMsICByMyAgICAgICAgICBAIEkKKworICAgICAgICB2YWJkLnU4ICAgICAgICAgcTIsICBxOCwgIHE5ICAgICBAIGFicyhwMyAtIHAyKQorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTMsICBxOSwgIHExMCAgICBAIGFicyhwMiAtIHAxKQorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTQsICBxMTAsIHExMSAgICBAIGFicyhwMSAtIHAwKQorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTUsICBxMTIsIHExMyAgICBAIGFicyhxMCAtIHExKQorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTYsICBxMTMsIHExNCAgICBAIGFicyhxMSAtIHEyKQorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTcsICBxMTQsIHExNSAgICBAIGFicyhxMiAtIHEzKQorICAgICAgICB2bWF4LnU4ICAgICAgICAgcTIsICBxMiwgIHEzCisgICAgICAgIHZtYXgudTggICAgICAgICBxMywgIHE0LCAgcTUKKyAgICAgICAgdm1heC51OCAgICAgICAgIHE0LCAgcTYsICBxNworICAgICAgICB2YWJkLnU4ICAgICAgICAgcTUsICBxMTEsIHExMiAgICBAIGFicyhwMCAtIHEwKQorICAgICAgICB2bWF4LnU4ICAgICAgICAgcTIsICBxMiwgIHEzCisgICAgICAgIHZxYWRkLnU4ICAgICAgICBxNSwgIHE1LCAgcTUgICAgIEAgYWJzKHAwIC0gcTApICogMgorICAgICAgICB2YWJkLnU4ICAgICAgICAgcTcsICBxMTAsIHExMyAgICBAIGFicyhwMSAtIHExKQorICAgICAgICB2bWF4LnU4ICAgICAgICAgcTIsICBxMiwgIHE0ICAgICBAIG1heChhYnMocDMgLSBwMiksIC4uLiwgYWJzKHEyIC0gcTMpKQorICAgICAgICB2c2hyLnU4ICAgICAgICAgcTcsICBxNywgICMxCisgICAgICAgIHZjbGUudTggICAgICAgICBxMiwgIHEyLCAgcTEgICAgIEAgbWF4KGFicygpKSA8PSBJCisgICAgICAgIHZxYWRkLnU4ICAgICAgICBxNSwgIHE1LCAgcTcgICAgIEAgYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSA+PiAxCisgICAgICAgIHZjbGUudTggICAgICAgICBxNSwgIHE1LCAgcTAKKyAgICAgICAgdmFuZCAgICAgICAgICAgIHEyLCAgcTIsICBxNSAgICAgQCBmbQorCisgICAgICAgIHZzaHJuLnUxNiAgICAgICBkMTAsIHEyLCAgIzQKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHIyLCAgcjMsICBkMTAKKyAgICAgICAgb3JycyAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICBAIElmIG5vIHBpeGVscyBuZWVkIGZpbHRlcmluZywganVzdCBleGl0IGFzIHNvb24gYXMgcG9zc2libGUKKyAgICAgICAgYmVxICAgICAgICAgICAgIDlmCisKKyAgICAgICAgQCBDYWxjdWxhdGUgdGhlIG5vcm1hbCBpbm5lciBsb29wIGZpbHRlciBmb3IgMiBvciA0IHBpeGVscworICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbc3AsICM2NF0KKyAgICAgICAgdmFiZC51OCAgICAgICAgIHEzLCAgcTEwLCBxMTEgICAgQCBhYnMocDEgLSBwMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIHE0LCAgcTEzLCBxMTIgICAgQCBhYnMocTEgLSBxMCkKKworICAgICAgICB2c3VibC51OCAgICAgICAgcTUsICBkMjAsIGQyNiAgICBAIHAxIC0gcTEKKyAgICAgICAgdnN1YmwudTggICAgICAgIHE2LCAgZDIxLCBkMjcgICAgQCBwMSAtIHExCisgICAgICAgIHZtYXgudTggICAgICAgICBxMywgIHEzLCAgcTQgICAgIEAgbWF4KGFicyhwMSAtIHAwKSwgYWJzKHExIC0gcTApKQorICAgICAgICB2cW1vdm4uczE2ICAgICAgZDEwLCBxNSAgICAgICAgICBAIGF2X2NsaXBfaW50OHAocDEgLSBxMSkKKyAgICAgICAgdnFtb3ZuLnMxNiAgICAgIGQxMSwgcTYgICAgICAgICAgQCBhdl9jbGlwX2ludDhwKHAxIC0gcTEpCisgICAgICAgIHZkdXAudTggICAgICAgICBkOCwgIHIzICAgICAgICAgIEAgSAorICAgICAgICBsc3IgICAgICAgICAgICAgcjMsICByMywgICM4CisgICAgICAgIHZkdXAudTggICAgICAgICBkOSwgIHIzICAgICAgICAgIEAgSAorICAgICAgICB2c3VibC51OCAgICAgICAgcTYsICBkMjQsIGQyMiAgICBAIHEwIC0gcDAKKyAgICAgICAgdnN1YmwudTggICAgICAgIHE3LCAgZDI1LCBkMjMgICAgQCBxMCAtIHAwCisgICAgICAgIHZjbGUudTggICAgICAgICBxMywgIHEzLCAgcTQgICAgIEAgaGV2CisgICAgICAgIHZtb3YuczE2ICAgICAgICBxMCwgICMzCisgICAgICAgIHZhbmQgICAgICAgICAgICBxMywgIHEzLCAgcTIgICAgIEAgIWhldiAmJiBmbSAmJiAhZmxhdDhpbgorCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxNiwgIHE2LCAgcTAgICAgIEAgMyAqIChxMCAtIHAwKQorICAgICAgICB2bXVsLnMxNiAgICAgICAgcTcsICBxNywgIHEwICAgICBAIDMgKiAocTAgLSBwMCkKKyAgICAgICAgdmJpYyAgICAgICAgICAgIHE1LCAgcTUsICBxMyAgICAgQCBpZiAoIWhldikgYXZfY2xpcF9pbnQ4ID0gMAorICAgICAgICB2YWRkdy5zOCAgICAgICAgcTYsICBxNiwgIGQxMCAgICBAIDMgKiAocTAgLSBwMCkgWysgYXZfY2xpcF9pbnQ4KHAxIC0gcTEpXQorICAgICAgICB2YWRkdy5zOCAgICAgICAgcTcsICBxNywgIGQxMSAgICBAIDMgKiAocTAgLSBwMCkgWysgYXZfY2xpcF9pbnQ4KHAxIC0gcTEpXQorICAgICAgICB2bW92LnM4ICAgICAgICAgcTUsICAjNAorICAgICAgICB2cW1vdm4uczE2ICAgICAgZDEyLCBxNgorICAgICAgICB2cW1vdm4uczE2ICAgICAgZDEzLCBxNyAgICAgICAgICBAIGF2X2NsaXBfaW50OCgzICogKHEwIC0gcDApIFsrIGF2X2NsaXBfaW50OChwMSAtIHExKV0sIEJJVF9ERVBUSCAtIDEpID0gZgorICAgICAgICB2bW92LnM4ICAgICAgICAgcTAsICAjMworCisgICAgICAgIHZxYWRkLnM4ICAgICAgICBxNSwgIHE2LCAgcTUgICAgIEAgRkZNSU4oZiArIDQsIDEyNykKKyAgICAgICAgdnFhZGQuczggICAgICAgIHEwLCAgcTYsICBxMCAgICAgQCBGRk1JTihmICsgMywgMTI3KQorICAgICAgICB2bW92bC51OCAgICAgICAgcTYsICBkMjIgICAgICAgICBAIHAwCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxNywgIGQyMyAgICAgICAgIEAgcDAKKyAgICAgICAgdnNoci5zOCAgICAgICAgIHE1LCAgcTUsICAjMyAgICAgQCBmMQorICAgICAgICB2c2hyLnM4ICAgICAgICAgcTAsICBxMCwgICMzICAgICBAIGYyCisKKyAgICAgICAgdmFkZHcuczggICAgICAgIHE2LCAgcTYsICBkMCAgICAgQCBwMCArIGYyCisgICAgICAgIHZhZGR3LnM4ICAgICAgICBxNywgIHE3LCAgZDEgICAgIEAgcDAgKyBmMgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxNiAgICAgICAgICBAIG91dCBwMAorICAgICAgICB2bW92bC51OCAgICAgICAgcTYsICBkMjQgICAgICAgICBAIHEwCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMSwgIHE3ICAgICAgICAgIEAgb3V0IHAwCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxNywgIGQyNSAgICAgICAgIEAgcTAKKyAgICAgICAgdnN1YncuczggICAgICAgIHE2LCAgcTYsICBkMTAgICAgQCBxMCAtIGYxCisgICAgICAgIHZzdWJ3LnM4ICAgICAgICBxNywgIHE3LCAgZDExICAgIEAgcTAgLSBmMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEyLCBxNiAgICAgICAgICBAIG91dCBxMAorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEzLCBxNyAgICAgICAgICBAIG91dCBxMAorICAgICAgICB2cnNoci5zOCAgICAgICAgcTUsICBxNSwgICMxICAgICBAIGYgPSAoZjEgKyAxKSA+PiAxCisgICAgICAgIHZiaXQgICAgICAgICAgICBxMTEsIHEwLCAgcTIgICAgIEAgaWYgKGZtICYmICFmbGF0OGluKQorICAgICAgICB2Yml0ICAgICAgICAgICAgcTEyLCBxNiwgIHEyCisKKyAgICAgICAgdm1vdmwudTggICAgICAgIHEwLCAgZDIwICAgICAgICAgQCBwMQorICAgICAgICB2bW92bC51OCAgICAgICAgcTIsICBkMjEgICAgICAgICBAIHAxCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxNiwgIGQyNiAgICAgICAgIEAgcTEKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE3LCAgZDI3ICAgICAgICAgQCBxMQorICAgICAgICB2YWRkdy5zOCAgICAgICAgcTAsICBxMCwgIGQxMCAgICBAIHAxICsgZgorICAgICAgICB2YWRkdy5zOCAgICAgICAgcTIsICBxMiwgIGQxMSAgICBAIHAxICsgZgorICAgICAgICB2c3Vidy5zOCAgICAgICAgcTYsICBxNiwgIGQxMCAgICBAIHExIC0gZgorICAgICAgICB2c3Vidy5zOCAgICAgICAgcTcsICBxNywgIGQxMSAgICBAIHExIC0gZgorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxMCAgICAgICAgICBAIG91dCBwMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEsICBxMiAgICAgICAgICBAIG91dCBwMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEyLCBxNiAgICAgICAgICBAIG91dCBxMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDEzLCBxNyAgICAgICAgICBAIG91dCBxMQorICAgICAgICB2Yml0ICAgICAgICAgICAgcTEwLCBxMCwgIHEzICAgICBAIGlmICghaGV2ICYmIGZtICYmICFmbGF0OGluKQorICAgICAgICB2Yml0ICAgICAgICAgICAgcTEzLCBxNiwgIHEzCisuZW5kbQorCitAIFRoZSBpbnB1dCB0byBhbmQgb3V0cHV0IGZyb20gdGhpcyBtYWNybyBpcyBpbiB0aGUgcmVnaXN0ZXJzIGQxNi1kMzEsCitAIGFuZCBkMC1kNyBhcmUgdXNlZCBhcyBzY3JhdGNoIHJlZ2lzdGVycy4KK0AgcDcgPSBkMTYgLi4gcDMgPSBkMjAsIHAwID0gZDIzLCBxMCA9IGQyNCwgcTMgPSBkMjcsIHE3ID0gZDMxCitAIERlcGVuZGluZyBvbiB0aGUgd2lkdGggb2YgdGhlIGxvb3AgZmlsdGVyLCB3ZSBlaXRoZXIgdXNlIGQxNi1kMTkKK0AgYW5kIGQyOC1kMzEgYXMgdGVtcCByZWdpc3RlcnMsIG9yIGQ4LWQxNS4KK0AgdG1wMSx0bXAyID0gdG1wcTEsIHRtcDMsdG1wNCA9IHRtcHEyLCB0bXA1LHRtcDYgPSB0bXBxMywgdG1wNyx0bXA4ID0gdG1wcTQKKy5tYWNybyBsb29wX2ZpbHRlciB3ZCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgdG1wOCwgdG1wcTEsIHRtcHEyLCB0bXBxMywgdG1wcTQKKyAgICAgICAgdmR1cC51OCAgICAgICAgIGQwLCAgcjIgQCBFCisgICAgICAgIHZkdXAudTggICAgICAgICBkMiwgIHIzIEAgSQorICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbc3BdCisKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ0LCAgZDIwLCBkMjEgICAgQCBhYnMocDMgLSBwMikKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ1LCAgZDIxLCBkMjIgICAgQCBhYnMocDIgLSBwMSkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ2LCAgZDIyLCBkMjMgICAgQCBhYnMocDEgLSBwMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ3LCAgZDI0LCBkMjUgICAgQCBhYnMocTAgLSBxMSkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIFx0bXAxLCAgZDI1LCBkMjYgQCBhYnMocTEgLSBxMikKKyAgICAgICAgdmFiZC51OCAgICAgICAgIFx0bXAyLCAgZDI2LCBkMjcgQCBhYnMocTIgLSBxMykKKyAgICAgICAgdm1heC51OCAgICAgICAgIGQ0LCAgZDQsICBkNQorICAgICAgICB2bWF4LnU4ICAgICAgICAgZDUsICBkNiwgIGQ3CisgICAgICAgIHZtYXgudTggICAgICAgICBcdG1wMSwgIFx0bXAxLCAgXHRtcDIKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ2LCAgZDIzLCBkMjQgICAgQCBhYnMocDAgLSBxMCkKKyAgICAgICAgdm1heC51OCAgICAgICAgIGQ0LCAgZDQsICBkNQorICAgICAgICB2cWFkZC51OCAgICAgICAgZDYsICBkNiwgIGQ2ICAgICBAIGFicyhwMCAtIHEwKSAqIDIKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ1LCAgZDIyLCBkMjUgICAgQCBhYnMocDEgLSBxMSkKKyAgICAgICAgdm1heC51OCAgICAgICAgIGQ0LCAgZDQsICBcdG1wMSAgQCBtYXgoYWJzKHAzIC0gcDIpLCAuLi4sIGFicyhxMiAtIHEzKSkKKyAgICAgICAgdnNoci51OCAgICAgICAgIGQ1LCAgZDUsICAjMQorICAgICAgICB2Y2xlLnU4ICAgICAgICAgZDQsICBkNCwgIGQyICAgICBAIG1heChhYnMoKSkgPD0gSQorICAgICAgICB2cWFkZC51OCAgICAgICAgZDYsICBkNiwgIGQ1ICAgICBAIGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgPj4gMQorICAgICAgICB2Y2xlLnU4ICAgICAgICAgZDUsICBkNiwgIGQwCisgICAgICAgIHZhbmQgICAgICAgICAgICBkNCwgIGQ0LCAgZDUgICAgIEAgZm0KKworICAgICAgICB2ZHVwLnU4ICAgICAgICAgZDMsICByMyAgICAgICAgICBAIEgKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHIyLCAgcjMsICBkNAorICAgICAgICBvcnJzICAgICAgICAgICAgcjIsICByMiwgIHIzCisgICAgICAgIEAgSWYgbm8gcGl4ZWxzIG5lZWQgZmlsdGVyaW5nLCBqdXN0IGV4aXQgYXMgc29vbiBhcyBwb3NzaWJsZQorICAgICAgICBiZXEgICAgICAgICAgICAgOWYKKworLmlmIFx3ZCA+PSA4CisgICAgICAgIHZtb3YudTggICAgICAgICBkMCwgICMxCisKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ2LCAgZDIwLCBkMjMgICAgQCBhYnMocDMgLSBwMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQyLCAgZDIxLCBkMjMgICAgQCBhYnMocDIgLSBwMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQxLCAgZDIyLCBkMjMgICAgQCBhYnMocDEgLSBwMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIFx0bXAxLCAgZDI1LCBkMjQgQCBhYnMocTEgLSBxMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIFx0bXAyLCAgZDI2LCBkMjQgQCBhYnMocTIgLSBxMCkKKyAgICAgICAgdmFiZC51OCAgICAgICAgIFx0bXAzLCAgZDI3LCBkMjQgQCBhYnMocTMgLSBxMCkKKyAgICAgICAgdm1heC51OCAgICAgICAgIGQ2LCAgZDYsICBkMgorICAgICAgICB2bWF4LnU4ICAgICAgICAgZDEsICBkMSwgIFx0bXAxCisgICAgICAgIHZtYXgudTggICAgICAgICBcdG1wMiwgIFx0bXAyLCAgXHRtcDMKKy5pZiBcd2QgPT0gMTYKKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ3LCAgZDE2LCBkMjMgICAgQCBhYnMocDcgLSBwMCkKKyAgICAgICAgdm1heC51OCAgICAgICAgIGQ2LCAgZDYsICBkMQorICAgICAgICB2YWJkLnU4ICAgICAgICAgZDIsICBkMTcsIGQyMyAgICBAIGFicyhwNiAtIHAwKQorICAgICAgICB2bWF4LnU4ICAgICAgICAgZDYsICBkNiwgIFx0bXAyCisgICAgICAgIHZhYmQudTggICAgICAgICBkMSwgIGQxOCwgZDIzICAgIEAgYWJzKHA1IC0gcDApCisgICAgICAgIHZjbGUudTggICAgICAgICBkNiwgIGQ2LCAgZDAgICAgIEAgZmxhdDhpbgorICAgICAgICB2YWJkLnU4ICAgICAgICAgZDgsICBkMTksIGQyMyAgICBAIGFicyhwNCAtIHAwKQorICAgICAgICB2YW5kICAgICAgICAgICAgZDYsICBkNiwgIGQ0ICAgICBAIGZsYXQ4aW4gJiYgZm0KKyAgICAgICAgdmFiZC51OCAgICAgICAgIGQ5LCAgZDI4LCBkMjQgICAgQCBhYnMocTQgLSBxMCkKKyAgICAgICAgdmJpYyAgICAgICAgICAgIGQ0LCAgZDQsICBkNiAgICAgQCBmbSAmJiAhZmxhdDhpbgorICAgICAgICB2YWJkLnU4ICAgICAgICAgZDEwLCBkMjksIGQyNCAgICBAIGFicyhxNSAtIHEwKQorICAgICAgICB2YWJkLnU4ICAgICAgICAgZDExLCBkMzAsIGQyNCAgICBAIGFicyhxNiAtIHEwKQorICAgICAgICB2YWJkLnU4ICAgICAgICAgZDEyLCBkMzEsIGQyNCAgICBAIGFicyhxNyAtIHEwKQorCisgICAgICAgIHZtYXgudTggICAgICAgICBkNywgIGQ3LCAgZDIKKyAgICAgICAgdm1heC51OCAgICAgICAgIGQxLCAgZDEsICBkOAorICAgICAgICB2bWF4LnU4ICAgICAgICAgZDksICBkOSwgIGQxMAorICAgICAgICB2bWF4LnU4ICAgICAgICAgZDExLCBkMTEsIGQxMgorICAgICAgICBAIFRoZSByZXN0IG9mIHRoZSBjYWxjdWxhdGlvbiBvZiBmbGF0OG91dCBpcyBpbnRlcmxlYXZlZCBiZWxvdworLmVsc2UKKyAgICAgICAgQCBUaGUgcmVzdCBvZiB0aGUgY2FsY3VsYXRpb24gb2YgZmxhdDhpbiBpcyBpbnRlcmxlYXZlZCBiZWxvdworLmVuZGlmCisuZW5kaWYKKworICAgICAgICBAIENhbGN1bGF0ZSB0aGUgbm9ybWFsIGlubmVyIGxvb3AgZmlsdGVyIGZvciAyIG9yIDQgcGl4ZWxzCisgICAgICAgIHZhYmQudTggICAgICAgICBkNSwgIGQyMiwgZDIzICAgICAgICAgICBAIGFicyhwMSAtIHAwKQorLmlmIFx3ZCA9PSAxNgorICAgICAgICB2bWF4LnU4ICAgICAgICAgZDcsICBkNywgIGQxCisgICAgICAgIHZtYXgudTggICAgICAgICBkOSwgIGQ5LCAgZDExCisuZWxzZWlmIFx3ZCA9PSA4CisgICAgICAgIHZtYXgudTggICAgICAgICBkNiwgIGQ2LCAgZDEKKy5lbmRpZgorICAgICAgICB2YWJkLnU4ICAgICAgICAgZDEsICBkMjUsIGQyNCAgICAgICAgICAgQCBhYnMocTEgLSBxMCkKKy5pZiBcd2QgPT0gMTYKKyAgICAgICAgdm1heC51OCAgICAgICAgIGQ3LCAgZDcsICBkOQorLmVsc2VpZiBcd2QgPT0gOAorICAgICAgICB2bWF4LnU4ICAgICAgICAgZDYsICBkNiwgIFx0bXAyCisuZW5kaWYKKyAgICAgICAgdnN1YmwudTggICAgICAgIFx0bXBxMSwgIGQyMiwgZDI1ICAgICAgIEAgcDEgLSBxMQorICAgICAgICB2bWF4LnU4ICAgICAgICAgZDUsICBkNSwgIGQxICAgICAgICAgICAgQCBtYXgoYWJzKHAxIC0gcDApLCBhYnMocTEgLSBxMCkpCisgICAgICAgIHZzdWJsLnU4ICAgICAgICBcdG1wcTIsICBkMjQsIGQyMyAgICAgICBAIHEwIC0gcDAKKyAgICAgICAgdm1vdi5zMTYgICAgICAgIFx0bXBxMywgICMzCisuaWYgXHdkID09IDgKKyAgICAgICAgdmNsZS51OCAgICAgICAgIGQ2LCAgZDYsICBkMCAgICAgICAgICAgIEAgZmxhdDhpbgorLmVuZGlmCisgICAgICAgIHZjbGUudTggICAgICAgICBkNSwgIGQ1LCAgZDMgICAgICAgICAgICBAICFoZXYKKy5pZiBcd2QgPT0gOAorICAgICAgICB2YW5kICAgICAgICAgICAgZDYsICBkNiwgIGQ0ICAgICAgICAgICAgQCBmbGF0OGluICYmIGZtCisuZW5kaWYKKyAgICAgICAgdnFtb3ZuLnMxNiAgICAgIFx0bXAxLCAgIFx0bXBxMSAgICAgICAgIEAgYXZfY2xpcF9pbnQ4KHAxIC0gcTEpCisuaWYgXHdkID09IDE2CisgICAgICAgIHZjbGUudTggICAgICAgICBkNywgIGQ3LCAgZDAgICAgICAgICAgICBAIGZsYXQ4b3V0CisuZWxzZWlmIFx3ZCA9PSA4CisgICAgICAgIHZiaWMgICAgICAgICAgICBkNCwgIGQ0LCAgZDYgICAgICAgICAgICBAIGZtICYmICFmbGF0OGluCisuZW5kaWYKKyAgICAgICAgdmFuZCAgICAgICAgICAgIGQ1LCAgZDUsICBkNCAgICAgICAgICAgIEAgIWhldiAmJiBmbSAmJiAhZmxhdDhpbgorLmlmIFx3ZCA9PSAxNgorICAgICAgICB2YW5kICAgICAgICAgICAgZDcsICBkNywgIGQ2ICAgICAgICAgICAgQCBmbGF0OG91dCAmJiBmbGF0OGluICYmIGZtCisuZW5kaWYKKworICAgICAgICB2bXVsLnMxNiAgICAgICAgXHRtcHEyLCAgXHRtcHEyLCBcdG1wcTMgQCAzICogKHEwIC0gcDApCisgICAgICAgIHZiaWMgICAgICAgICAgICBcdG1wMSwgICBcdG1wMSwgICBkNSAgICBAIGlmICghaGV2KSBhdl9jbGlwX2ludDggPSAwCisgICAgICAgIHZtb3YuczggICAgICAgICBkMiwgICM0CisgICAgICAgIHZhZGR3LnM4ICAgICAgICBcdG1wcTIsICBcdG1wcTIsICBcdG1wMSBAIDMgKiAocTAgLSBwMCkgWysgYXZfY2xpcF9pbnQ4KHAxIC0gcTEpXQorICAgICAgICB2bW92LnM4ICAgICAgICAgZDMsICAjMworICAgICAgICB2cW1vdm4uczE2ICAgICAgXHRtcDEsICAgXHRtcHEyICAgICAgICAgQCBmCisuaWYgXHdkID09IDE2CisgICAgICAgIHZiaWMgICAgICAgICAgICBkNiwgIGQ2LCAgZDcgICAgICAgICAgICBAIGZtICYmIGZsYXQ4aW4gJiYgIWZsYXQ4b3V0CisuZW5kaWYKKworICAgICAgICB2cWFkZC5zOCAgICAgICAgXHRtcDMsIFx0bXAxLCAgZDIgICAgICAgQCBGRk1JTihmICsgNCwgMTI3KQorICAgICAgICB2cWFkZC5zOCAgICAgICAgXHRtcDQsIFx0bXAxLCAgZDMgICAgICAgQCBGRk1JTihmICsgMywgMTI3KQorICAgICAgICB2bW92bC51OCAgICAgICAgcTAsICBkMjMgICAgICAgICAgICAgICAgQCBwMAorICAgICAgICB2c2hyLnM4ICAgICAgICAgXHRtcDMsIFx0bXAzLCAgIzMgICAgICAgQCBmMQorICAgICAgICB2c2hyLnM4ICAgICAgICAgXHRtcDQsIFx0bXA0LCAgIzMgICAgICAgQCBmMgorCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMSwgIGQyNCAgICAgICAgICAgICAgICBAIHEwCisgICAgICAgIHZhZGR3LnM4ICAgICAgICBxMCwgIHEwLCAgXHRtcDQgICAgICAgICBAIHAwICsgZjIKKyAgICAgICAgdnN1YncuczggICAgICAgIHExLCAgcTEsICBcdG1wMyAgICAgICAgIEAgcTAgLSBmMQorICAgICAgICB2cW1vdnVuLnMxNiAgICAgZDAsICBxMCAgICAgICAgICAgICAgICAgQCBvdXQgcDAKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQxLCAgcTEgICAgICAgICAgICAgICAgIEAgb3V0IHEwCisgICAgICAgIHZyc2hyLnM4ICAgICAgICBcdG1wMywgXHRtcDMsICMxICAgICAgICBAIGYgPSAoZjEgKyAxKSA+PiAxCisgICAgICAgIHZiaXQgICAgICAgICAgICBkMjMsIGQwLCAgZDQgICAgICAgICAgICBAIGlmIChmbSAmJiAhZmxhdDhpbikKKyAgICAgICAgdmJpdCAgICAgICAgICAgIGQyNCwgZDEsICBkNAorCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMCwgIGQyMiAgICAgICAgICAgICAgICBAIHAxCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMSwgIGQyNSAgICAgICAgICAgICAgICBAIHExCisuaWYgXHdkID49IDgKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHIyLCAgcjMsICBkNgorLmVuZGlmCisgICAgICAgIHZhZGR3LnM4ICAgICAgICBxMCwgIHEwLCAgXHRtcDMgICAgICAgICBAIHAxICsgZgorICAgICAgICB2c3Vidy5zOCAgICAgICAgcTEsICBxMSwgIFx0bXAzICAgICAgICAgQCBxMSAtIGYKKy5pZiBcd2QgPj0gOAorICAgICAgICBvcnJzICAgICAgICAgICAgcjIsICByMiwgIHIzCisuZW5kaWYKKyAgICAgICAgdnFtb3Z1bi5zMTYgICAgIGQwLCAgcTAgICAgICAgICAgICAgICAgIEAgb3V0IHAxCisgICAgICAgIHZxbW92dW4uczE2ICAgICBkMiwgIHExICAgICAgICAgICAgICAgICBAIG91dCBxMQorICAgICAgICB2Yml0ICAgICAgICAgICAgZDIyLCBkMCwgIGQ1ICAgICAgICAgICAgQCBpZiAoIWhldiAmJiBmbSAmJiAhZmxhdDhpbikKKyAgICAgICAgdmJpdCAgICAgICAgICAgIGQyNSwgZDIsICBkNQorCisuaWYgXHdkID49IDgKKyAgICAgICAgQCBJZiBubyBwaXhlbHMgbmVlZCBmbGF0OGluLCBqdW1wIHRvIGZsYXQ4b3V0CisgICAgICAgIEAgKG9yIHRvIGEgd3JpdGVvdXQgb2YgdGhlIGlubmVyIDQgcGl4ZWxzLCBmb3Igd2Q9OCkKKyAgICAgICAgYmVxICAgICAgICAgICAgIDZmCisKKyAgICAgICAgQCBmbGF0OGluCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTEsIGQyMCwgZDIxCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTIsIGQyMiwgZDI1CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTMsIGQyMCwgZDIyCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTQsIGQyMywgZDI2CisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIFx0bXBxMSwgXHRtcHExCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMCwgIHEwLCAgZDIzCisgICAgICAgIHZhZGR3LnU4ICAgICAgICBxMCwgIHEwLCAgZDI0CisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgXHRtcHEzCisgICAgICAgIHZzdWIuczE2ICAgICAgICBcdG1wcTIsIFx0bXBxMiwgXHRtcHExCisgICAgICAgIHZzdWIuczE2ICAgICAgICBcdG1wcTQsIFx0bXBxNCwgXHRtcHEzCisgICAgICAgIHZyc2hybi51MTYgICAgICBkMiwgIHEwLCAgIzMgICAgICAgICAgICBAIG91dCBwMgorCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgXHRtcHEyCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTEsIGQyMCwgZDIzCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTIsIGQyNCwgZDI3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMywgIHEwLCAgIzMgICAgICAgICAgICBAIG91dCBwMQorCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgXHRtcHE0CisgICAgICAgIHZzdWIuczE2ICAgICAgICBcdG1wcTIsIFx0bXBxMiwgXHRtcHExCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTMsIGQyMSwgZDI0CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTQsIGQyNSwgZDI3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkNCwgIHEwLCAgIzMgICAgICAgICAgICBAIG91dCBwMAorCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgXHRtcHEyCisgICAgICAgIHZzdWIuczE2ICAgICAgICBcdG1wcTQsIFx0bXBxNCwgXHRtcHEzCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTEsIGQyMiwgZDI1CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBcdG1wcTIsIGQyNiwgZDI3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkNSwgIHEwLCAgIzMgICAgICAgICAgICBAIG91dCBxMAorCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgXHRtcHE0CisgICAgICAgIHZzdWIuczE2ICAgICAgICBcdG1wcTIsIFx0bXBxMiwgXHRtcHExCisgICAgICAgIHZyc2hybi51MTYgICAgICBcdG1wNSwgIHEwLCAgIzMgICAgICAgICBAIG91dCBxMQorCisgICAgICAgIHZhZGQudTE2ICAgICAgICBxMCwgIHEwLCAgXHRtcHEyCisgICAgICAgIEAgVGhlIG91dHB1dCBoZXJlIGlzIHdyaXR0ZW4gYmFjayBpbnRvIHRoZSBpbnB1dCByZWdpc3RlcnMuIFRoaXMgZG9lc24ndAorICAgICAgICBAIG1hdHRlciBmb3IgdGhlIGZsYXQ4b3V0IHBhcnQgYmVsb3csIHNpbmNlIHdlIG9ubHkgdXBkYXRlIHRob3NlIHBpeGVscworICAgICAgICBAIHdoaWNoIHdvbid0IGJlIHRvdWNoZWQgYmVsb3cuCisgICAgICAgIHZiaXQgICAgICAgICAgICBkMjEsIGQyLCAgZDYKKyAgICAgICAgdmJpdCAgICAgICAgICAgIGQyMiwgZDMsICBkNgorICAgICAgICB2Yml0ICAgICAgICAgICAgZDIzLCBkNCwgIGQ2CisgICAgICAgIHZyc2hybi51MTYgICAgICBcdG1wNiwgIHEwLCAgIzMgICAgICAgICBAIG91dCBxMgorICAgICAgICB2Yml0ICAgICAgICAgICAgZDI0LCBkNSwgIGQ2CisgICAgICAgIHZiaXQgICAgICAgICAgICBkMjUsIFx0bXA1LCAgZDYKKyAgICAgICAgdmJpdCAgICAgICAgICAgIGQyNiwgXHRtcDYsICBkNgorLmVuZGlmCisuaWYgXHdkID09IDE2Cis2OgorICAgICAgICB2b3JyICAgICAgICAgICAgZDIsICBkNiwgIGQ3CisgICAgICAgIHZtb3YgICAgICAgICAgICByMiwgIHIzLCAgZDIKKyAgICAgICAgb3JycyAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICBAIElmIG5vIHBpeGVscyBuZWVkZWQgZmxhdDhpbiBub3IgZmxhdDhvdXQsIGp1bXAgdG8gYQorICAgICAgICBAIHdyaXRlb3V0IG9mIHRoZSBpbm5lciA0IHBpeGVscworICAgICAgICBiZXEgICAgICAgICAgICAgN2YKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHIyLCAgcjMsICBkNworICAgICAgICBvcnJzICAgICAgICAgICAgcjIsICByMiwgIHIzCisgICAgICAgIEAgSWYgbm8gcGl4ZWxzIG5lZWQgZmxhdDhvdXQsIGp1bXAgdG8gYSB3cml0ZW91dCBvZiB0aGUgaW5uZXIgNiBwaXhlbHMKKyAgICAgICAgYmVxICAgICAgICAgICAgIDhmCisKKyAgICAgICAgQCBmbGF0OG91dAorICAgICAgICBAIFRoaXMgd3JpdGVzIGFsbCBvdXRwdXRzIGludG8gZDItZDE3IChza2lwcGluZyBkNiBhbmQgZDE2KS4KKyAgICAgICAgQCBJZiB0aGlzIHBhcnQgaXMgc2tpcHBlZCwgdGhlIG91dHB1dCBpcyByZWFkIGZyb20gZDIxLWQyNiAod2hpY2ggaXMgdGhlIGlucHV0CisgICAgICAgIEAgdG8gdGhpcyBzZWN0aW9uKS4KKyAgICAgICAgdnNobGwudTggICAgICAgIHEwLCAgZDE2LCAjMyAgQCA4ICogZDE2CisgICAgICAgIHZzdWJ3LnU4ICAgICAgICBxMCwgIHEwLCAgZDE2IEAgNyAqIGQxNgorICAgICAgICB2YWRkdy51OCAgICAgICAgcTAsICBxMCwgIGQxNworICAgICAgICB2YWRkbC51OCAgICAgICAgcTQsICBkMTcsIGQxOAorICAgICAgICB2YWRkbC51OCAgICAgICAgcTUsICBkMTksIGQyMAorICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxMCwgIHE0CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxNCwgIGQxNiwgZDE3CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxNiwgIGQyMSwgZDIyCisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMCwgIHEwLCAgcTUKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE1LCAgZDE4LCBkMjUKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE3LCAgZDIzLCBkMjQKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHE1LCAgcTUsICBxNAorICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxMCwgIHE2CisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMCwgIHEwLCAgcTcKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE2LCAgZDE2LCBkMTgKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE3LCAgZDE5LCBkMjYKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQyLCAgcTAsICAjNAorCisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMCwgIHEwLCAgcTUKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE0LCAgZDE2LCBkMTkKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE1LCAgZDIwLCBkMjcKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHE3LCAgcTcsICBxNgorICAgICAgICB2YmlmICAgICAgICAgICAgZDIsICBkMTcsIGQ3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMywgIHEwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxMCwgIHE3CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxNiwgIGQxNiwgZDIwCisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxNywgIGQyMSwgZDI4CisgICAgICAgIHZzdWIuczE2ICAgICAgICBxNSwgIHE1LCAgcTQKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQzLCAgZDE4LCBkNworICAgICAgICB2cnNocm4udTE2ICAgICAgZDQsICBxMCwgICM0CisKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHEwLCAgcTAsICBxNQorICAgICAgICB2YWRkbC51OCAgICAgICAgcTQsICBkMTYsIGQyMQorICAgICAgICB2YWRkbC51OCAgICAgICAgcTUsICBkMjIsIGQyOQorICAgICAgICB2c3ViLnMxNiAgICAgICAgcTcsICBxNywgIHE2CisgICAgICAgIHZiaWYgICAgICAgICAgICBkNCwgIGQxOSwgZDcKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ1LCAgcTAsICAjNAorCisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMCwgIHEwLCAgcTcKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE2LCAgZDE2LCBkMjIKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE3LCAgZDIzLCBkMzAKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHE1LCAgcTUsICBxNAorICAgICAgICB2YmlmICAgICAgICAgICAgZDUsICBkMjAsIGQ3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkNiwgIHEwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxMCwgIHE1CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxNSwgIGQxNiwgZDIzCisgICAgICAgIHZzdWIuczE2ICAgICAgICBxNywgIHE3LCAgcTYKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE2LCAgZDI0LCBkMzEKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQ2LCAgZDIxLCBkNworICAgICAgICB2cnNocm4udTE2ICAgICAgZDgsICBxMCwgICM0CisKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHEwLCAgcTAsICBxNworICAgICAgICB2c3ViLnMxNiAgICAgICAgcTUsICBxNiwgIHE1CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxNiwgIGQxNywgZDI0CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxNywgIGQyNSwgZDMxCisgICAgICAgIHZiaWYgICAgICAgICAgICBkOCwgIGQyMiwgZDcKKyAgICAgICAgdnJzaHJuLnUxNiAgICAgIGQ5LCAgcTAsICAjNAorCisgICAgICAgIHZhZGQuczE2ICAgICAgICBxMCwgIHEwLCAgcTUKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHE3LCAgcTcsICBxNgorICAgICAgICB2YWRkbC51OCAgICAgICAgcTYsICBkMjYsIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDksICBkMjMsIGQ3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMTAsIHEwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxMCwgIHE3CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxNywgIGQxOCwgZDI1CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxOSwgIGQxOSwgZDI2CisgICAgICAgIHZzdWIuczE2ICAgICAgICBxNiwgIHE2LCAgcTcKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE3LCAgZDI3LCBkMzEKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQxMCwgZDI0LCBkNworICAgICAgICB2cnNocm4udTE2ICAgICAgZDExLCBxMCwgICM0CisKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHEwLCAgcTAsICBxNgorICAgICAgICB2YWRkbC51OCAgICAgICAgcTYsICBkMjAsIGQyNworICAgICAgICB2c3ViLnMxNiAgICAgICAgcTcsICBxNywgIHE5CisgICAgICAgIHZhZGRsLnU4ICAgICAgICBxOSwgIGQyOCwgZDMxCisgICAgICAgIHZiaWYgICAgICAgICAgICBkMTEsIGQyNSwgZDcKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHE5LCAgcTksICBxNgorICAgICAgICB2cnNocm4udTE2ICAgICAgZDEyLCBxMCwgICM0CisKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHEwLCAgcTAsICBxNworICAgICAgICB2YWRkbC51OCAgICAgICAgcTcsICBkMjEsIGQyOAorICAgICAgICB2YWRkbC51OCAgICAgICAgcTEwLCBkMjksIGQzMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDEyLCBkMjYsIGQ3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMTMsIHEwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxMCwgIHE5CisgICAgICAgIHZzdWIuczE2ICAgICAgICBxMTAsIHExMCwgcTcKKyAgICAgICAgdmFkZGwudTggICAgICAgIHE5LCAgZDIyLCBkMjkKKyAgICAgICAgdmFkZGwudTggICAgICAgIHExMSwgZDMwLCBkMzEKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQxMywgZDI3LCBkNworICAgICAgICB2cnNocm4udTE2ICAgICAgZDE0LCBxMCwgICM0CisKKyAgICAgICAgdmFkZC5zMTYgICAgICAgIHEwLCAgcTAsICBxMTAKKyAgICAgICAgdnN1Yi5zMTYgICAgICAgIHExMSwgcTExLCBxOQorICAgICAgICB2YmlmICAgICAgICAgICAgZDE0LCBkMjgsIGQ3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMTUsIHEwLCAgIzQKKworICAgICAgICB2YWRkLnMxNiAgICAgICAgcTAsICBxMCwgIHExMQorICAgICAgICB2YmlmICAgICAgICAgICAgZDE1LCBkMjksIGQ3CisgICAgICAgIHZyc2hybi51MTYgICAgICBkMTcsIHEwLCAgIzQKKyAgICAgICAgdmJpZiAgICAgICAgICAgIGQxNywgZDMwLCBkNworLmVuZGlmCisuZW5kbQorCitAIEZvciB3ZCA8PSA4LCB3ZSB1c2UgZDE2LWQxOSBhbmQgZDI4LWQzMSBmb3IgdGVtcCByZWdpc3RlcnMsCitAIHdoaWxlIHdlIG5lZWQgdGhvc2UgZm9yIGlucHV0cy9vdXRwdXRzIGluIHdkPTE2IGFuZCB1c2UgZDgtZDE1CitAIGZvciB0ZW1wIHJlZ2lzdGVycyB0aGVyZSBpbnN0ZWFkLgorLm1hY3JvIGxvb3BfZmlsdGVyXzQKKyAgICAgICAgbG9vcF9maWx0ZXIgICAgIDQsICBkMTYsIGQxNywgZDE4LCBkMTksIGQyOCwgZDI5LCBkMzAsIGQzMSwgcTgsICBxOSwgIHExNCwgcTE1CisuZW5kbQorCisubWFjcm8gbG9vcF9maWx0ZXJfOAorICAgICAgICBsb29wX2ZpbHRlciAgICAgOCwgIGQxNiwgZDE3LCBkMTgsIGQxOSwgZDI4LCBkMjksIGQzMCwgZDMxLCBxOCwgIHE5LCAgcTE0LCBxMTUKKy5lbmRtCisKKy5tYWNybyBsb29wX2ZpbHRlcl8xNgorICAgICAgICBsb29wX2ZpbHRlciAgICAgMTYsIGQ4LCAgZDksICBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBxNCwgIHE1LCAgcTYsICBxNworLmVuZG0KKworCitAIFRoZSBwdWJsaWMgZnVuY3Rpb25zIGluIHRoaXMgZmlsZSBoYXZlIGdvdCB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKK0Agdm9pZCBsb29wX2ZpbHRlcih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBtYl9saW0sIGludCBsaW0sIGludCBoZXZfdGhyKTsKKworZnVuY3Rpb24gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfNF84X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIwLCAgcjEsIGxzbCAjMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sIFtyMTIsOjY0XSwgcjEgQCBwMworICAgICAgICB2bGQxLjggICAgICAgICAge2QyNH0sIFtyMCwgOjY0XSwgcjEgQCBxMAorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMX0sIFtyMTIsOjY0XSwgcjEgQCBwMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNX0sIFtyMCwgOjY0XSwgcjEgQCBxMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMn0sIFtyMTIsOjY0XSwgcjEgQCBwMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNn0sIFtyMCwgOjY0XSwgcjEgQCBxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyM30sIFtyMTIsOjY0XSwgcjEgQCBwMAorICAgICAgICB2bGQxLjggICAgICAgICAge2QyN30sIFtyMCwgOjY0XSwgcjEgQCBxMworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCByMSwgbHNsICMxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfNAorCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIyfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyNH0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjN9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI1fSwgW3IwLCA6NjRdLCByMQorOToKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzRfOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMCwgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sIFtyMTJdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNH0sIFtyMF0sICByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMX0sIFtyMTJdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNX0sIFtyMF0sICByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMn0sIFtyMTJdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNn0sIFtyMF0sICByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyM30sIFtyMTJdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyN30sIFtyMF0sICByMQorCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgQCBNb3ZlIHIwL3IxMiBmb3J3YXJkIGJ5IDIgcGl4ZWxzOyB3ZSBkb24ndCBuZWVkIHRvIHJld3JpdGUgdGhlCisgICAgICAgIEAgb3V0ZXJtb3N0IDIgcGl4ZWxzIHNpbmNlIHRoZXkgYXJlbid0IGNoYW5nZWQuCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorCisgICAgICAgIEAgVHJhbnNwb3NlIHRoZSA4eDggcGl4ZWxzLCB0YWtpbmcgYWR2YW50YWdlIG9mIHEgcmVnaXN0ZXJzLCB0byBnZXQKKyAgICAgICAgQCBvbmUgcmVnaXN0ZXIgcGVyIGNvbHVtbi4KKyAgICAgICAgdHJhbnNwb3NlX3FfOHg4IHExMCwgcTExLCBxMTIsIHExMywgZDIwLCBkMjEsIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBkMjcKKworICAgICAgICBsb29wX2ZpbHRlcl80CisKKyAgICAgICAgQCBXZSBvbmx5IHdpbGwgd3JpdGUgdGhlIG1pZCA0IHBpeGVscyBiYWNrOyBhZnRlciB0aGUgbG9vcCBmaWx0ZXIsCisgICAgICAgIEAgdGhlc2UgYXJlIGluIGQyMiwgZDIzLCBkMjQsIGQyNSAocTExLCBxMTIpLCBvcmRlcmVkIGFzIHJvd3MKKyAgICAgICAgQCAoOHg0IHBpeGVscykuIFdlIG5lZWQgdG8gdHJhbnNwb3NlIHRoZW0gdG8gY29sdW1ucywgZG9uZSB3aXRoIGEKKyAgICAgICAgQCA0eDQgdHJhbnNwb3NlICh3aGljaCBpbiBwcmFjdGljZSBpcyB0d28gNHg0IHRyYW5zcG9zZXMgb2YgdGhlIHR3bworICAgICAgICBAIDR4NCBoYWx2ZXMgb2YgdGhlIDh4NCBwaXhlbHM7IGludG8gNHg4IHBpeGVscykuCisgICAgICAgIHRyYW5zcG9zZV9xXzR4NCBxMTEsIHExMiwgZDIyLCBkMjMsIGQyNCwgZDI1CisKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjRbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjRbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjVbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjVbMV19LCBbcjBdLCAgcjEKKzk6CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfbG9vcF9maWx0ZXJfdl80NF8xNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxOH0sICBbcjEyLDoxMjhdLCByMSBAIHAzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTEyfSwgW3IwLCA6MTI4XSwgcjEgQCBxMAorICAgICAgICB2bGQxLjggICAgICAgICAge3E5fSwgIFtyMTIsOjEyOF0sIHIxIEAgcDIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMTN9LCBbcjAsIDoxMjhdLCByMSBAIHExCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTEwfSwgW3IxMiw6MTI4XSwgcjEgQCBwMQorICAgICAgICB2bGQxLjggICAgICAgICAge3ExNH0sIFtyMCwgOjEyOF0sIHIxIEAgcTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMTF9LCBbcjEyLDoxMjhdLCByMSBAIHAwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTE1fSwgW3IwLCA6MTI4XSwgcjEgQCBxMworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCByMSwgbHNsICMxCisKKyAgICAgICAgbG9vcF9maWx0ZXJfcQorCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTEwfSwgW3IxMiw6MTI4XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMTJ9LCBbcjAsIDoxMjhdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge3ExMX0sIFtyMTIsOjEyOF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTEzfSwgW3IwLCA6MTI4XSwgcjEKKzk6CisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfbG9vcF9maWx0ZXJfaF80NF8xNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMCwgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxNn0sIFtyMTJdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNH0sIFtyMF0sICByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxOH0sIFtyMTJdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNn0sIFtyMF0sICByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sIFtyMTJdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyOH0sIFtyMF0sICByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMn0sIFtyMTJdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QzMH0sIFtyMF0sICByMQorICAgICAgICBtb3YgICAgICAgICAgICAgcjEyLCByMAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTd9LCBbcjEyXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjV9LCBbcjBdLCAgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTl9LCBbcjEyXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjd9LCBbcjBdLCAgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjF9LCBbcjEyXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjl9LCBbcjBdLCAgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjN9LCBbcjEyXSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMzF9LCBbcjBdLCAgcjEKKworICAgICAgICBAIFRyYW5zcG9zZSB0aGUgMTZ4OCBwaXhlbHMsIGFzIHR3byA4eDggcGFydHMKKyAgICAgICAgdHJhbnNwb3NlXzh4OCAgIHE4LCAgcTksICBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1CisKKyAgICAgICAgbG9vcF9maWx0ZXJfcQorCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIwLCAgcjEsIGxzbCAjNAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMTIsIHIxLCBsc2wgIzMKKyAgICAgICAgQCBNb3ZlIHIwL3IxMiBmb3J3YXJkIGJ5IDIgcGl4ZWxzOyB3ZSBkb24ndCBuZWVkIHRvIHJld3JpdGUgdGhlCisgICAgICAgIEAgb3V0ZXJtb3N0IDIgcGl4ZWxzIHNpbmNlIHRoZXkgYXJlbid0IGNoYW5nZWQuCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICAjMgorCisgICAgICAgIEAgV2Ugb25seSB3aWxsIHdyaXRlIHRoZSBtaWQgNCBwaXhlbHMgYmFjazsgYWZ0ZXIgdGhlIGxvb3AgZmlsdGVyLAorICAgICAgICBAIHRoZXNlIGFyZSBpbiBxMTAsIHExMSwgcTEyLCBxMTMsIG9yZGVyZWQgYXMgcm93cyAoMTZ4NCBwaXhlbHMpLgorICAgICAgICBAIFdlIG5lZWQgdG8gdHJhbnNwb3NlIHRoZW0gdG8gY29sdW1ucywgZG9uZSB3aXRoIGEgNHg0IHRyYW5zcG9zZQorICAgICAgICBAICh3aGljaCBpbiBwcmFjdGljZSBpcyBmb3VyIDR4NCB0cmFuc3Bvc2VzIG9mIHRoZSA0eDQgYmxvY2tzIG9mCisgICAgICAgIEAgdGhlIDE2eDQgcGl4ZWxzOyBpbnRvIDR4MTYgcGl4ZWxzKS4KKyAgICAgICAgdHJhbnNwb3NlXzR4NCAgIHExMCwgcTExLCBxMTIsIHExMworCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIwWzBdfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIxWzBdfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzBdfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzBdfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI0WzBdfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI1WzBdfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI2WzBdfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI3WzBdfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIwWzFdfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIxWzFdfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIyWzFdfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDIzWzFdfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI0WzFdfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI1WzFdfSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI2WzFdfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDI3WzFdfSwgW3IwXSwgIHIxCis5OgorICAgICAgICB2cG9wICAgICAgICAgICAge3E0LXE3fQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfOF84X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIwLCAgcjEsIGxzbCAjMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sIFtyMTIsOjY0XSwgcjEgQCBwMworICAgICAgICB2bGQxLjggICAgICAgICAge2QyNH0sIFtyMCwgOjY0XSwgcjEgQCBxMAorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMX0sIFtyMTIsOjY0XSwgcjEgQCBwMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNX0sIFtyMCwgOjY0XSwgcjEgQCBxMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMn0sIFtyMTIsOjY0XSwgcjEgQCBwMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNn0sIFtyMCwgOjY0XSwgcjEgQCBxMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QyM30sIFtyMTIsOjY0XSwgcjEgQCBwMAorICAgICAgICB2bGQxLjggICAgICAgICAge2QyN30sIFtyMCwgOjY0XSwgcjEgQCBxMworICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMTIsIHIxLCBsc2wgIzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgcjEKKworICAgICAgICBsb29wX2ZpbHRlcl84CisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjF9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyMn0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIzfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyNn0sIFtyMCwgOjY0XSwgcjEKKzk6CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorNjoKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjAsICByMSwgbHNsICMxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIyfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyNH0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjN9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI1fSwgW3IwLCA6NjRdLCByMQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2xvb3BfZmlsdGVyX2hfOF84X25lb24sIGV4cG9ydD0xCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIwLCAgIzQKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjEyLCByMSwgbHNsICMyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIwfSwgW3IxMl0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI0fSwgW3IwXSwgIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIxfSwgW3IxMl0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI1fSwgW3IwXSwgIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIyfSwgW3IxMl0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI2fSwgW3IwXSwgIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIzfSwgW3IxMl0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI3fSwgW3IwXSwgIHIxCisKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjEyLCByMSwgbHNsICMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMgorCisgICAgICAgIHRyYW5zcG9zZV9xXzh4OCBxMTAsIHExMSwgcTEyLCBxMTMsIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3CisKKyAgICAgICAgbG9vcF9maWx0ZXJfOAorCisgICAgICAgIEAgRXZlbiB0aG91Z2ggb25seSA2IHBpeGVscyBwZXIgcm93IGhhdmUgYmVlbiBjaGFuZ2VkLCB3ZSB3cml0ZSB0aGUKKyAgICAgICAgQCBmdWxsIDggcGl4ZWwgcmVnaXN0ZXJzLgorICAgICAgICB0cmFuc3Bvc2VfcV84eDggcTEwLCBxMTEsIHExMiwgcTEzLCBkMjAsIGQyMSwgZDIyLCBkMjMsIGQyNCwgZDI1LCBkMjYsIGQyNworCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIwfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI0fSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIxfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI1fSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIyfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI2fSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIzfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI3fSwgW3IwXSwgIHIxCis5OgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKKzY6CisgICAgICAgIEAgSWYgd2UgZGlkbid0IG5lZWQgdG8gZG8gdGhlIGZsYXQ4aW4gcGFydCwgd2UgdXNlIHRoZSBzYW1lIHdyaXRlYmFjaworICAgICAgICBAIGFzIGluIGxvb3BfZmlsdGVyX2hfNF84LgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzIKKyAgICAgICAgdHJhbnNwb3NlX3FfNHg0IHExMSwgcTEyLCBkMjIsIGQyMywgZDI0LCBkMjUKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjRbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjRbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjVbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjVbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIHZwOV9sb29wX2ZpbHRlcl92XzE2X25lb24KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjAsICByMSwgbHNsICMzCisgICAgICAgIEAgUmVhZCBwNy1wMCB1c2luZyByMTIgYW5kIHEwLXE3IHVzaW5nIHIwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE2fSwgW3IxMiw6NjRdLCByMSBAIHA3CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI0fSwgW3IwLCA6NjRdLCByMSBAIHEwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE3fSwgW3IxMiw6NjRdLCByMSBAIHA2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI1fSwgW3IwLCA6NjRdLCByMSBAIHExCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE4fSwgW3IxMiw6NjRdLCByMSBAIHA1CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI2fSwgW3IwLCA6NjRdLCByMSBAIHEyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE5fSwgW3IxMiw6NjRdLCByMSBAIHA0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI3fSwgW3IwLCA6NjRdLCByMSBAIHEzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIwfSwgW3IxMiw6NjRdLCByMSBAIHAzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI4fSwgW3IwLCA6NjRdLCByMSBAIHE0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIxfSwgW3IxMiw6NjRdLCByMSBAIHAyCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI5fSwgW3IwLCA6NjRdLCByMSBAIHE1CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIyfSwgW3IxMiw6NjRdLCByMSBAIHAxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDMwfSwgW3IwLCA6NjRdLCByMSBAIHE2CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIzfSwgW3IxMiw6NjRdLCByMSBAIHAwCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDMxfSwgW3IwLCA6NjRdLCByMSBAIHE3CisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxLCBsc2wgIzMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCByMQorCisgICAgICAgIGxvb3BfZmlsdGVyXzE2CisKKyAgICAgICAgQCBJZiB3ZSBkaWQgdGhlIGZsYXQ4b3V0IHBhcnQsIHdlIGdldCB0aGUgb3V0cHV0IGluCisgICAgICAgIEAgZDItZDE3IChza2lwcGluZyBkNyBhbmQgZDE2KS4gcjEyIHBvaW50cyB0byByMCAtIDcgKiBzdHJpZGUsCisgICAgICAgIEAgc3RvcmUgZDItZDkgdGhlcmUsIGFuZCBkMTAtZDE3IGludG8gcjAuCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDJ9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxMH0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkM30sICBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDExfSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2Q0fSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTJ9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDV9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxM30sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNn0sICBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2Q4fSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDl9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxN30sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMzCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgcjEKKworOToKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCisKKzg6CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICBAIElmIHdlIGRpZG4ndCBkbyB0aGUgZmxhdDhvdXQgcGFydCwgdGhlIG91dHB1dCBpcyBsZWZ0IGluIHRoZQorICAgICAgICBAIGlucHV0IHJlZ2lzdGVycy4KKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjF9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyMn0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIzfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyNn0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCis3OgorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMCwgIHIxLCBsc2wgIzEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjJ9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QyM30sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMjV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfMTZfOF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEyfQorICAgICAgICBibCAgICAgICAgICAgICAgdnA5X2xvb3BfZmlsdGVyX3ZfMTZfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgc3AsICBzcCwgICM0CisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl92XzE2XzE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKyAgICAgICAgLy8gVGhlIGZpbHRlciBjbG9iYmVycyByMiBhbmQgcjMsIGJ1dCB3ZSBuZWVkIHRvIGtlZXAgdGhlbSBmb3IgdGhlIHNlY29uZCByb3VuZAorICAgICAgICBwdXNoICAgICAgICAgICAge3IyLCByMywgbHJ9CisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjEyfQorICAgICAgICBibCAgICAgICAgICAgICAgdnA5X2xvb3BfZmlsdGVyX3ZfMTZfbmVvbgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICAjOAorICAgICAgICBsZHIgICAgICAgICAgICAgcjIsICBbc3AsICM2OF0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIzLCAgW3NwLCAjNzJdCisgICAgICAgIGJsICAgICAgICAgICAgICB2cDlfbG9vcF9maWx0ZXJfdl8xNl9uZW9uCisgICAgICAgIGFkZCAgICAgICAgICAgICBzcCwgIHNwLCAgIzQKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyMiwgcjMsIHBjfQorZW5kZnVuYworCitmdW5jdGlvbiB2cDlfbG9vcF9maWx0ZXJfaF8xNl9uZW9uCisgICAgICAgIHN1YiAgICAgICAgICAgICByMTIsIHIwLCAgIzgKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTZ9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI0fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QxN30sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjV9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDE4fSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyNn0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTl9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI3fSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyMH0sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjh9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDIxfSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyOX0sIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjJ9LCBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDMwfSwgW3IwLCA6NjRdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge2QyM30sIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMzF9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMworICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMTIsIHIxLCBsc2wgIzMKKworICAgICAgICBAIFRoZSAxNng4IHBpeGVscyByZWFkIGFib3ZlIGlzIGluIHR3byA4eDggYmxvY2tzOyB0aGUgbGVmdAorICAgICAgICBAIGhhbGYgaW4gZDE2LWQyMywgYW5kIHRoZSByaWdodCBoYWxmIGluIGQyNC1kMzEuIERvIHR3byA4eDggdHJhbnNwb3NlcworICAgICAgICBAIG9mIHRoaXMsIHRvIGdldCBvbmUgY29sdW1uIHBlciByZWdpc3Rlci4gVGhpcyBjb3VsZCBiZSBkb25lIHdpdGggdHdvCisgICAgICAgIEAgdHJhbnNwb3NlXzh4OCBhcyBiZWxvdywgYnV0IHRoaXMgdGFrZXMgYWR2YW50YWdlIG9mIHRoZSBxIHJlZ2lzdGVycy4KKyAgICAgICAgdHJhbnNwb3NlMTZfNHg0IHE4LCAgcTksICBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1CisgICAgICAgIHZ0cm4uOCAgICAgICAgICBkMTYsIGQxNworICAgICAgICB2dHJuLjggICAgICAgICAgZDE4LCBkMTkKKyAgICAgICAgdnRybi44ICAgICAgICAgIGQyMCwgZDIxCisgICAgICAgIHZ0cm4uOCAgICAgICAgICBkMjIsIGQyMworICAgICAgICB2dHJuLjggICAgICAgICAgZDI0LCBkMjUKKyAgICAgICAgdnRybi44ICAgICAgICAgIGQyNiwgZDI3CisgICAgICAgIHZ0cm4uOCAgICAgICAgICBkMjgsIGQyOQorICAgICAgICB2dHJuLjggICAgICAgICAgZDMwLCBkMzEKKworICAgICAgICBsb29wX2ZpbHRlcl8xNgorCisgICAgICAgIEAgVHJhbnNwb3NlIGJhY2s7IHRoaXMgaXMgdGhlIHNhbWUgdHJhbnNwb3NlIGFzIGFib3ZlLCBidXQKKyAgICAgICAgQCB3ZSBjYW4ndCB0YWtlIGFkdmFudGFnZSBvZiBxIHJlZ2lzdGVycyBmb3IgdGhlIHRyYW5zcG9zZSwgc2luY2UKKyAgICAgICAgQCBhbGwgZCByZWdpc3RlcnMgaW4gdGhlIHRyYW5zcG9zZSBhcmVuJ3QgY29uc2VjdXRpdmUuCisgICAgICAgIHRyYW5zcG9zZV84eDggICBkMTYsIGQyLCAgZDMsICBkNCwgIGQ1LCAgZDYsICBkOCwgIGQ5CisgICAgICAgIHRyYW5zcG9zZV84eDggICBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTcsIGQzMQorCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE2fSwgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxMH0sIFtyMCwgOjY0XSwgcjEKKworICAgICAgICB2c3QxLjggICAgICAgICAge2QyfSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTF9LCBbcjAsIDo2NF0sIHIxCisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkM30sICBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDEyfSwgW3IwLCA6NjRdLCByMQorCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDR9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxM30sIFtyMCwgOjY0XSwgcjEKKworICAgICAgICB2c3QxLjggICAgICAgICAge2Q1fSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMTR9LCBbcjAsIDo2NF0sIHIxCisKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkNn0sICBbcjEyLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDE1fSwgW3IwLCA6NjRdLCByMQorCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDh9LCAgW3IxMiw6NjRdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge2QxN30sIFtyMCwgOjY0XSwgcjEKKworICAgICAgICB2c3QxLjggICAgICAgICAge2Q5fSwgIFtyMTIsOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMzF9LCBbcjAsIDo2NF0sIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMworOToKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCis4OgorICAgICAgICBAIFRoZSBzYW1lIHdyaXRlYmFjayBhcyBpbiBsb29wX2ZpbHRlcl9oXzhfOAorICAgICAgICBzdWIgICAgICAgICAgICAgcjEyLCByMCwgICM0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIxMiwgcjEsIGxzbCAjMgorICAgICAgICB0cmFuc3Bvc2VfcV84eDggcTEwLCBxMTEsIHExMiwgcTEzLCBkMjAsIGQyMSwgZDIyLCBkMjMsIGQyNCwgZDI1LCBkMjYsIGQyNworCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIwfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI0fSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIxfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI1fSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIyfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI2fSwgW3IwXSwgIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDIzfSwgW3IxMl0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDI3fSwgW3IwXSwgIHIxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMworICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM0CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorNzoKKyAgICAgICAgQCBUaGUgc2FtZSB3cml0ZWJhY2sgYXMgaW4gbG9vcF9maWx0ZXJfaF80XzgKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxMiwgcjAsICAjMgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMTIsIHIxLCBsc2wgIzIKKyAgICAgICAgdHJhbnNwb3NlX3FfNHg0IHExMSwgcTEyLCBkMjIsIGQyMywgZDI0LCBkMjUKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjJbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjNbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjRbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjRbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjVbMF19LCBbcjEyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMjVbMV19LCBbcjBdLCAgcjEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMzCisgICAgICAgIGFkZCAgICAgICAgICAgICByMCwgIHIwLCAgIzIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9sb29wX2ZpbHRlcl9oXzE2XzhfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorICAgICAgICBwdXNoICAgICAgICAgICAge3IxMn0KKyAgICAgICAgYmwgICAgICAgICAgICAgIHZwOV9sb29wX2ZpbHRlcl9oXzE2X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjNAorICAgICAgICB2cG9wICAgICAgICAgICAge3E0LXE3fQorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfbG9vcF9maWx0ZXJfaF8xNl8xNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCisgICAgICAgIC8vIFRoZSBmaWx0ZXIgY2xvYmJlcnMgcjIgYW5kIHIzLCBidXQgd2UgbmVlZCB0byBrZWVwIHRoZW0gZm9yIHRoZSBzZWNvbmQgcm91bmQKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyMiwgcjMsIGxyfQorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorICAgICAgICBwdXNoICAgICAgICAgICAge3IxMn0KKyAgICAgICAgYmwgICAgICAgICAgICAgIHZwOV9sb29wX2ZpbHRlcl9oXzE2X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMzCisgICAgICAgIGxkciAgICAgICAgICAgICByMiwgIFtzcCwgIzY4XQorICAgICAgICBsZHIgICAgICAgICAgICAgcjMsICBbc3AsICM3Ml0KKyAgICAgICAgYmwgICAgICAgICAgICAgIHZwOV9sb29wX2ZpbHRlcl9oXzE2X25lb24KKyAgICAgICAgYWRkICAgICAgICAgICAgIHNwLCAgc3AsICAjNAorICAgICAgICB2cG9wICAgICAgICAgICAge3E0LXE3fQorICAgICAgICBwb3AgICAgICAgICAgICAge3IyLCByMywgcGN9CitlbmRmdW5jCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2FybS92cDltY18xNmJwcF9uZW9uLlMgYi9saWJhdmNvZGVjL2FybS92cDltY18xNmJwcF9uZW9uLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZlYzAzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYXJtL3ZwOW1jXzE2YnBwX25lb24uUwpAQCAtMCwwICsxLDYxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBHb29nbGUgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworQCBBbGwgcHVibGljIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZ25hdHVyZToKK0AgdHlwZWRlZiB2b2lkICgqdnA5X21jX2Z1bmMpKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCitAICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlZiwgcHRyZGlmZl90IHJlZl9zdHJpZGUsCitAICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSk7CisKK2Z1bmN0aW9uIGZmX3ZwOV9jb3B5MTI4X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjOTYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjMsICAjOTYKKzE6CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMCwgIHExfSwgIFtyMl0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTAsICBxMX0sICBbcjAsIDoxMjhdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EyLCAgcTN9LCAgW3IyXSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMiwgIHEzfSwgIFtyMCwgOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTgsICBxOX0sICBbcjJdIQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3E4LCAgcTl9LCAgW3IwLCA6MTI4XSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTAsIHExMX0sIFtyMl0sIHIzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTEwLCBxMTF9LCBbcjAsIDoxMjhdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9hdmc2NF8xNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM0XQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICM5NgorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICM5NgorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMAorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3E4LCAgcTl9LCAgW3IyXSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMCwgIHExfSwgIFtyMCwgOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEwLCBxMTF9LCBbcjJdIQorICAgICAgICB2cmhhZGQudTE2ICAgICAgcTAsICBxMCwgIHE4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTIsICBxM30sICBbcjAsIDoxMjhdIQorICAgICAgICB2cmhhZGQudTE2ICAgICAgcTEsICBxMSwgIHE5CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEyLCBxMTN9LCBbcjJdIQorICAgICAgICB2cmhhZGQudTE2ICAgICAgcTIsICBxMiwgIHExMAorICAgICAgICB2c3QxLjE2ICAgICAgICAge3EwLCAgcTF9LCAgW2xyLCA6MTI4XSEKKyAgICAgICAgdnJoYWRkLnUxNiAgICAgIHEzLCAgcTMsICBxMTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxOCwgIHE5fSwgIFtyMCwgOjEyOF0hCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTIsICBxM30sICBbbHIsIDoxMjhdIQorICAgICAgICB2cmhhZGQudTE2ICAgICAgcTgsICBxOCwgIHExMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExNCwgcTE1fSwgW3IyXSwgcjMKKyAgICAgICAgdnJoYWRkLnUxNiAgICAgIHE5LCAgcTksICBxMTMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTAsIHExMX0sIFtyMCwgOjEyOF0sIHIxCisgICAgICAgIHZyaGFkZC51MTYgICAgICBxMTAsIHExMCwgcTE0CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTgsICBxOX0sICBbbHIsIDoxMjhdIQorICAgICAgICB2cmhhZGQudTE2ICAgICAgcTExLCBxMTEsIHExNQorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExMCwgcTExfSwgW2xyLCA6MTI4XSwgcjEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cGN9CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9hdmczMl8xNl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM0XQorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgICMzMgorICAgICAgICBzdWIgICAgICAgICAgICAgcjMsICByMywgICMzMgorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMAorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3E4LCAgcTl9LCAgW3IyXSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMCwgIHExfSwgIFtyMCwgOjEyOF0hCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEwLCBxMTF9LCBbcjJdLCByMworICAgICAgICB2cmhhZGQudTE2ICAgICAgcTAsICBxMCwgIHE4CisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTIsICBxM30sICBbcjAsIDoxMjhdLCByMQorICAgICAgICB2cmhhZGQudTE2ICAgICAgcTEsICBxMSwgIHE5CisgICAgICAgIHZyaGFkZC51MTYgICAgICBxMiwgIHEyLCAgcTEwCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTAsIHExfSwgIFtsciwgOjEyOF0hCisgICAgICAgIHZyaGFkZC51MTYgICAgICBxMywgIHEzLCAgcTExCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTIsIHEzfSwgIFtsciwgOjEyOF0sIHIxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnMTZfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EyLCAgcTN9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMCwgIHExfSwgIFtyMCwgOjEyOF0KKyAgICAgICAgdnJoYWRkLnUxNiAgICAgIHEwLCAgcTAsICBxMgorICAgICAgICB2cmhhZGQudTE2ICAgICAgcTEsICBxMSwgIHEzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTAsICBxMX0sICBbcjAsIDoxMjhdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9hdmc4XzE2X25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzRdCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIwCisxOgorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMyCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTJ9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICBbcjAsIDoxMjhdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EzfSwgIFtyMl0sIHIzCisgICAgICAgIHZyaGFkZC51MTYgICAgICBxMCwgIHEwLCAgcTIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMX0sICBbcjAsIDoxMjhdLCByMQorICAgICAgICB2cmhhZGQudTE2ICAgICAgcTEsICBxMSwgIHEzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7cTB9LCAgW2xyLCA6MTI4XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMX0sICBbbHIsIDoxMjhdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2F2ZzRfMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorMToKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyfSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDB9LCAgW3IwLCA6NjRdLCByMQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QzfSwgIFtyMl0sIHIzCisgICAgICAgIHZyaGFkZC51MTYgICAgICBkMCwgIGQwLCAgZDIKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMX0sICBbcjAsIDo2NF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMQorICAgICAgICB2cmhhZGQudTE2ICAgICAgZDEsICBkMSwgIGQzCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDB9LCAgW3IwLCA6NjRdLCByMQorICAgICAgICB2c3QxLjE2ICAgICAgICAge2QxfSwgIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitAIEhlbHBlciBtYWNyb3MgZm9yIHZtdWxsL3ZtbGFsIHdpdGggYSBjb25zdGFudCBmcm9tIGVpdGhlciBkMCBvciBkMSBkZXBlbmRpbmcgb24gaW5kZXgKKy5tYWNybyB2bXVsbF9sYW5lIGRzdCwgc3JjLCBpZHgKKy5pZiBcaWR4IDwgNAorICAgICAgIHZtdWxsLnMxNiAgICAgICAgXGRzdCwgXHNyYywgZDBbXGlkeF0KKy5lbHNlCisgICAgICAgdm11bGwuczE2ICAgICAgICBcZHN0LCBcc3JjLCBkMVtcaWR4IC0gNF0KKy5lbmRpZgorLmVuZG0KKy5tYWNybyB2bWxhbF9sYW5lIGRzdCwgc3JjLCBpZHgKKy5pZiBcaWR4IDwgNAorICAgICAgIHZtbGFsLnMxNiAgICAgICAgXGRzdCwgXHNyYywgZDBbXGlkeF0KKy5lbHNlCisgICAgICAgdm1sYWwuczE2ICAgICAgICBcZHN0LCBcc3JjLCBkMVtcaWR4IC0gNF0KKy5lbmRpZgorLmVuZG0KKworQCBFeHRyYWN0IGEgdmVjdG9yIGZyb20gc3JjMS1zcmMyIGFuZCBzcmMzLXNyYzQsIGFuZG11bHRpcGx5LWFjY3VtdWxhdGUKK0AgaW50byBkc3QxIGFuZCBkc3QzIChvciBkc3QxLWRzdDIgYW5kIGRzdDMtZHN0NCBmb3Igc2l6ZSA+PSA4KQorLm1hY3JvIGV4dG1sYWwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgb2Zmc2V0LCBzaXplCisgICAgICAgIHZleHQuOCAgICAgICAgICBxMTQsIFxzcmMxLCBcc3JjMiwgIygyKlxvZmZzZXQpCisgICAgICAgIHZleHQuOCAgICAgICAgICBxMTUsIFxzcmMzLCBcc3JjNCwgIygyKlxvZmZzZXQpCisgICAgICAgIHZtbGFsX2xhbmUgICAgICBcZHN0MSwgIGQyOCwgXG9mZnNldAorICAgICAgICB2bWxhbF9sYW5lICAgICAgXGRzdDMsICBkMzAsIFxvZmZzZXQKKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIHZtbGFsX2xhbmUgICAgICBcZHN0MiwgIGQyOSwgXG9mZnNldAorICAgICAgICB2bWxhbF9sYW5lICAgICAgXGRzdDQsICBkMzEsIFxvZmZzZXQKKy5lbmRpZgorLmVuZG0KKworCitAIEluc3RhbnRpYXRlIGEgaG9yaXpvbnRhbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBzaXplLgorQCBUaGlzIGNhbiB3b3JrIG9uIDQgb3IgOCBwaXhlbHMgaW4gcGFyYWxsZWw7IGZvciBsYXJnZXIKK0Agd2lkdGhzIGl0IHdpbGwgZG8gOCBwaXhlbHMgYXQgYSB0aW1lIGFuZCBsb29wIGhvcml6b250YWxseS4KK0AgVGhlIGFjdHVhbCB3aWR0aCAoaW4gYnl0ZXMpIGlzIHBhc3NlZCBpbiByNSwgdGhlIGhlaWdodCBpbiByNCBhbmQKK0AgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgaW4gcjEyLgorLm1hY3JvIGRvXzh0YXBfaCB0eXBlLCBzaXplCitmdW5jdGlvbiBcdHlwZVwoKV84dGFwX1xzaXplXCgpaAorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICM2CisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIwLCAgcjEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjIsICByMworICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIzLCAgcjMKKyAgICAgICAgQCBPbmx5IHNpemUgPj0gOCBsb29wcyBob3Jpem9udGFsbHkgYW5kIG5lZWRzCisgICAgICAgIEAgcmVkdWNlZCBkc3Qgc3RyaWRlCisuaWYgXHNpemUgPj0gOAorICAgICAgICBzdWIgICAgICAgICAgICAgcjEsICByMSwgIHI1CisuZW5kaWYKKyAgICAgICAgQCBzaXplID49IDggbG9hZHMgdHdvIHF3b3JkcyBhbmQgaW5jcmVtZW50cyByMiwKKyAgICAgICAgQCBmb3Igc2l6ZSA0IGl0J3MgZW5vdWdoIHdpdGggdGhyZWUgZHdvcmRzIGFuZCBubworICAgICAgICBAIHBvc3RpbmNyZW1lbnQKKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHIzLCAgcjUKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjMsICAjMTYKKy5lbmRpZgorICAgICAgICBAIExvYWQgdGhlIGZpbHRlciB2ZWN0b3IKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICBbcjEyLDoxMjhdCisxOgorLmlmIFxzaXplID49IDgKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjUKKy5lbmRpZgorICAgICAgICBAIExvYWQgc3JjCisuaWYgXHNpemUgPj0gOAorICAgICAgICB2bGQxLjE2ICAgICAgICAge3E4LCAgcTl9LCAgW3IyXSEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTAsIHExMX0sIFtyN10hCisuZWxzZQorICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxNiwgZDE3LCBkMTh9LCBbcjJdCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIwLCBkMjEsIGQyMn0sIFtyN10KKy5lbmRpZgorMjoKKworICAgICAgICB2bXVsbC5zMTYgICAgICAgcTEsICBkMTYsIGQwWzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMTIsIGQyMCwgZDBbMF0KKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBxMiwgIGQxNywgZDBbMF0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIHExMywgZDIxLCBkMFswXQorLmVuZGlmCisgICAgICAgIGV4dG1sYWwgICAgICAgICBxMSwgIHEyLCAgcTEyLCBxMTMsIHE4LCAgcTksICBxMTAsIHExMSwgMSwgXHNpemUKKyAgICAgICAgZXh0bWxhbCAgICAgICAgIHExLCAgcTIsICBxMTIsIHExMywgcTgsICBxOSwgIHExMCwgcTExLCAyLCBcc2l6ZQorICAgICAgICBleHRtbGFsICAgICAgICAgcTEsICBxMiwgIHExMiwgcTEzLCBxOCwgIHE5LCAgcTEwLCBxMTEsIDMsIFxzaXplCisgICAgICAgIGV4dG1sYWwgICAgICAgICBxMSwgIHEyLCAgcTEyLCBxMTMsIHE4LCAgcTksICBxMTAsIHExMSwgNCwgXHNpemUKKyAgICAgICAgZXh0bWxhbCAgICAgICAgIHExLCAgcTIsICBxMTIsIHExMywgcTgsICBxOSwgIHExMCwgcTExLCA1LCBcc2l6ZQorICAgICAgICBleHRtbGFsICAgICAgICAgcTEsICBxMiwgIHExMiwgcTEzLCBxOCwgIHE5LCAgcTEwLCBxMTEsIDYsIFxzaXplCisgICAgICAgIGV4dG1sYWwgICAgICAgICBxMSwgIHEyLCAgcTEyLCBxMTMsIHE4LCAgcTksICBxMTAsIHExMSwgNywgXHNpemUKKworICAgICAgICBAIFJvdW5kLCBzaGlmdCBhbmQgc2F0dXJhdGUuCisgICAgICAgIEAgVGhlIHZxcnNocnVuIHRha2VzIGNhcmUgb2YgY2xhbXBpbmcgbmVnYXRpdmUgdmFsdWVzIHRvIHplcm8sIGJ1dAorICAgICAgICBAIHdlIG1hbnVhbGx5IG5lZWQgdG8gZG8gdm1pbiB3aXRoIHRoZSBtYXggcGl4ZWwgdmFsdWUuCisgICAgICAgIHZxcnNocnVuLnMzMiAgICBkMiwgIHExLCAgIzcKKyAgICAgICAgdnFyc2hydW4uczMyICAgIGQyNCwgcTEyLCAjNworLmlmIFxzaXplID49IDgKKyAgICAgICAgdnFyc2hydW4uczMyICAgIGQzLCAgcTIsICAjNworICAgICAgICB2cXJzaHJ1bi5zMzIgICAgZDI1LCBxMTMsICM3CisgICAgICAgIHZtaW4udTE2ICAgICAgICBxMSwgIHExLCAgcTMKKyAgICAgICAgdm1pbi51MTYgICAgICAgIHExMiwgcTEyLCBxMworLmVsc2UKKyAgICAgICAgdm1pbi51MTYgICAgICAgIGQyLCAgZDIsICBkNgorICAgICAgICB2bWluLnUxNiAgICAgICAgZDI0LCBkMjQsIGQ2CisuZW5kaWYKKyAgICAgICAgQCBBdmVyYWdlCisuaWZjIFx0eXBlLGF2ZworLmlmIFxzaXplID49IDgKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTR9LCBbcjAsOjEyOF0KKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTV9LCBbcjYsOjEyOF0KKyAgICAgICAgdnJoYWRkLnUxNiAgICAgIHExLCAgcTEsICBxMTQKKyAgICAgICAgdnJoYWRkLnUxNiAgICAgIHExMiwgcTEyLCBxMTUKKy5lbHNlCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI4fSwgW3IwLDo2NF0KKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMzB9LCBbcjYsOjY0XQorICAgICAgICB2cmhhZGQudTE2ICAgICAgZDIsICBkMiwgIGQyOAorICAgICAgICB2cmhhZGQudTE2ICAgICAgZDI0LCBkMjQsIGQzMAorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgQCBTdG9yZSBhbmQgbG9vcCBob3Jpem9udGFsbHkgKGZvciBzaXplID49IDgpCisuaWYgXHNpemUgPj0gOAorICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxNgorICAgICAgICB2c3QxLjE2ICAgICAgICAge3ExfSwgIFtyMCw6MTI4XSEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtxMTJ9LCBbcjYsOjEyOF0hCisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorICAgICAgICB2bW92ICAgICAgICAgICAgcTgsICBxOQorICAgICAgICB2bW92ICAgICAgICAgICAgcTEwLCBxMTEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxOX0sICBbcjJdIQorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMX0sIFtyN10hCisgICAgICAgIGIgICAgICAgICAgICAgICAyYgorLmVsc2UgQCBcc2l6ZSA9PSA0CisgICAgICAgIHZzdDEuMTYgICAgICAgICB7ZDJ9LCAgW3IwLDo2NF0KKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtkMjR9LCBbcjYsOjY0XQorLmVuZGlmCiszOgorICAgICAgICBAIExvb3AgdmVydGljYWxseQorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgIHIxCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHI2LCAgcjEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICBhZGQgICAgICAgICAgICAgcjcsICByNywgIHIzCisgICAgICAgIHN1YnMgICAgICAgICAgICByNCwgIHI0LCAgIzIKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjd9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworLm1hY3JvIGRvXzh0YXBfaF9zaXplIHNpemUKK2RvXzh0YXBfaCBwdXQsIFxzaXplCitkb184dGFwX2ggYXZnLCBcc2l6ZQorLmVuZG0KKworZG9fOHRhcF9oX3NpemUgNAorZG9fOHRhcF9oX3NpemUgOAorCisubWFjcm8gZG9fOHRhcF9oX2Z1bmMgdHlwZSwgZmlsdGVyLCBvZmZzZXQsIHNpemUsIGJwcAorZnVuY3Rpb24gZmZfdnA5X1x0eXBlXCgpX1xmaWx0ZXJcKClcc2l6ZVwoKV9oX1xicHBcKClfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yN30KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTZdCisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtzcCwgIzIwXQorICAgICAgICB2bXZuLnUxNiAgICAgICAgcTMsICAjKCgweGZmZmYgPDwgXGJwcCkgJiAweGZmZmYpCisgICAgICAgIG1vdnJlbHggICAgICAgICByMTIsIFgoZmZfdnA5X3N1YnBlbF9maWx0ZXJzKSwgcjYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCAyNTYqXG9mZnNldAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsIHI1LCBsc2wgIzQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI1LCAgIzIqXHNpemUKKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwXzhoCisuZWxzZQorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfOHRhcF80aAorLmVuZGlmCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF9oX2ZpbHRlcnMgc2l6ZSwgYnBwCitkb184dGFwX2hfZnVuYyBwdXQsIHJlZ3VsYXIsIDEsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBhdmcsIHJlZ3VsYXIsIDEsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBwdXQsIHNoYXJwLCAgIDIsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBhdmcsIHNoYXJwLCAgIDIsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBwdXQsIHNtb290aCwgIDAsIFxzaXplLCBcYnBwCitkb184dGFwX2hfZnVuYyBhdmcsIHNtb290aCwgIDAsIFxzaXplLCBcYnBwCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF9oX2ZpbHRlcnNfYnBwIGJwcAorZG9fOHRhcF9oX2ZpbHRlcnMgNjQsIFxicHAKK2RvXzh0YXBfaF9maWx0ZXJzIDMyLCBcYnBwCitkb184dGFwX2hfZmlsdGVycyAxNiwgXGJwcAorZG9fOHRhcF9oX2ZpbHRlcnMgOCwgIFxicHAKK2RvXzh0YXBfaF9maWx0ZXJzIDQsICBcYnBwCisuZW5kbQorCitkb184dGFwX2hfZmlsdGVyc19icHAgMTAKK2RvXzh0YXBfaF9maWx0ZXJzX2JwcCAxMgorCisubHRvcmcKKworQCBWZXJ0aWNhbCBmaWx0ZXJzCisKK0AgUm91bmQsIHNoaWZ0IGFuZCBzYXR1cmF0ZSBhbmQgc3RvcmUgcXJlZzEtNAorLm1hY3JvIGRvX3N0b3JlNCBxcmVnMSwgZHJlZzEsIHFyZWcyLCBkcmVnMiwgcXJlZzMsIGRyZWczLCBxcmVnNCwgZHJlZzQsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIG1pbnJlZywgdHlwZQorICAgICAgICB2cXJzaHJ1bi5zMzIgICAgXGRyZWcxLCAgXHFyZWcxLCAjNworICAgICAgICB2cXJzaHJ1bi5zMzIgICAgXGRyZWcyLCAgXHFyZWcyLCAjNworICAgICAgICB2cXJzaHJ1bi5zMzIgICAgXGRyZWczLCAgXHFyZWczLCAjNworICAgICAgICB2cXJzaHJ1bi5zMzIgICAgXGRyZWc0LCAgXHFyZWc0LCAjNworLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtcdG1wMX0sICBbcjYsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtcdG1wMn0sICBbcjYsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtcdG1wM30sICBbcjYsOjY0XSwgcjEKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtcdG1wNH0sICBbcjYsOjY0XSwgcjEKKy5lbmRpZgorICAgICAgICB2bWluLnUxNiAgICAgICAgXGRyZWcxLCAgXGRyZWcxLCAgXG1pbnJlZworICAgICAgICB2bWluLnUxNiAgICAgICAgXGRyZWcyLCAgXGRyZWcyLCAgXG1pbnJlZworICAgICAgICB2bWluLnUxNiAgICAgICAgXGRyZWczLCAgXGRyZWczLCAgXG1pbnJlZworICAgICAgICB2bWluLnUxNiAgICAgICAgXGRyZWc0LCAgXGRyZWc0LCAgXG1pbnJlZworLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdnJoYWRkLnUxNiAgICAgIFxkcmVnMSwgIFxkcmVnMSwgIFx0bXAxCisgICAgICAgIHZyaGFkZC51MTYgICAgICBcZHJlZzIsICBcZHJlZzIsICBcdG1wMgorICAgICAgICB2cmhhZGQudTE2ICAgICAgXGRyZWczLCAgXGRyZWczLCAgXHRtcDMKKyAgICAgICAgdnJoYWRkLnUxNiAgICAgIFxkcmVnNCwgIFxkcmVnNCwgIFx0bXA0CisuZW5kaWYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtcZHJlZzF9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtcZHJlZzJ9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtcZHJlZzN9LCBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtcZHJlZzR9LCBbcjAsOjY0XSwgcjEKKy5lbmRtCisKK0AgUm91bmQsIHNoaWZ0IGFuZCBzYXR1cmF0ZSBhbmQgc3RvcmUgcXJlZzEtNAorQCBxcmVnMS0yIGJlbG9uZyB0byBvbmUgbGluZSBhbmQgcXJlZzMtNCB0byB0aGUgc2Vjb25kIGxpbmUuCitAIGRyZWcxLTIgPT0gcXJlZzEsIGRyZWczLTQgPT0gcXJlZzIuCisubWFjcm8gZG9fc3RvcmU4IHFyZWcxLCBxcmVnMiwgcXJlZzMsIHFyZWc0LCBkcmVnMSwgZHJlZzIsIGRyZWczLCBkcmVnNCwgbWlucmVnLCB0eXBlCisgICAgICAgIHZxcnNocnVuLnMzMiAgICBcZHJlZzEsICBccXJlZzEsICM3CisgICAgICAgIHZxcnNocnVuLnMzMiAgICBcZHJlZzIsICBccXJlZzIsICM3CisgICAgICAgIHZxcnNocnVuLnMzMiAgICBcZHJlZzMsICBccXJlZzMsICM3CisgICAgICAgIHZxcnNocnVuLnMzMiAgICBcZHJlZzQsICBccXJlZzQsICM3CisuaWZjIFx0eXBlLGF2ZworICAgICAgICB2bGQxLjE2ICAgICAgICAge1xxcmVnM30sICBbcjYsOjEyOF0sIHIxCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7XHFyZWc0fSwgIFtyNiw6MTI4XSwgcjEKKy5lbmRpZgorICAgICAgICB2bWluLnUxNiAgICAgICAgXHFyZWcxLCAgXHFyZWcxLCAgXG1pbnJlZworICAgICAgICB2bWluLnUxNiAgICAgICAgXHFyZWcyLCAgXHFyZWcyLCAgXG1pbnJlZworLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdnJoYWRkLnUxNiAgICAgIFxxcmVnMSwgIFxxcmVnMSwgIFxxcmVnMworICAgICAgICB2cmhhZGQudTE2ICAgICAgXHFyZWcyLCAgXHFyZWcyLCAgXHFyZWc0CisuZW5kaWYKKyAgICAgICAgdnN0MS4xNiAgICAgICAgIHtccXJlZzF9LCBbcjAsOjEyOF0sIHIxCisgICAgICAgIHZzdDEuMTYgICAgICAgICB7XHFyZWcyfSwgW3IwLDoxMjhdLCByMQorLmVuZG0KKworQCBFdmFsdWF0ZSB0aGUgZmlsdGVyIHR3aWNlIGluIHBhcmFsbGVsLCBmcm9tIHRoZSBpbnB1dHMgc3JjMS1zcmM5IGludG8gZHN0MS1kc3QyCitAIChzcmMxLXNyYzggaW50byBkc3QxLCBzcmMyLXNyYzkgaW50byBkc3QyKS4KKy5tYWNybyBjb252b2x2ZTQgZHN0MSwgZHN0Miwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgdG1wMSwgdG1wMgorICAgICAgICB2bXVsbC5zMTYgICAgICAgXGRzdDEsIFxzcmMxLCBkMFswXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXGRzdDIsIFxzcmMyLCBkMFswXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXHRtcDEsIFxzcmMyLCBkMFsxXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXHRtcDIsIFxzcmMzLCBkMFsxXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDEsIFxzcmMzLCBkMFsyXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDIsIFxzcmM0LCBkMFsyXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHRtcDEsIFxzcmM0LCBkMFszXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHRtcDIsIFxzcmM1LCBkMFszXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDEsIFxzcmM1LCBkMVswXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDIsIFxzcmM2LCBkMVswXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHRtcDEsIFxzcmM2LCBkMVsxXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHRtcDIsIFxzcmM3LCBkMVsxXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDEsIFxzcmM3LCBkMVsyXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDIsIFxzcmM4LCBkMVsyXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHRtcDEsIFxzcmM4LCBkMVszXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXHRtcDIsIFxzcmM5LCBkMVszXQorICAgICAgICB2YWRkLnMzMiAgICAgICAgXGRzdDEsIFxkc3QxLCBcdG1wMQorICAgICAgICB2YWRkLnMzMiAgICAgICAgXGRzdDIsIFxkc3QyLCBcdG1wMgorLmVuZG0KKworQCBFdmFsdWF0ZSB0aGUgZmlsdGVyIHR3aWNlIGluIHBhcmFsbGVsLiBUaGlzIGRvZXMgdGhlIHNhbWUgYXMgY29udm9sdmU0IGFib3ZlLAorQCBidXQgd2l0aCBkb3VibGUgd2lkdGggKHR3byBpbnB1dC9vdXRwdXQgcmVnaXN0ZXJzIHBlciByb3cpLgorLm1hY3JvIGNvbnZvbHZlOCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQsIHNyYzE1LCBzcmMxNiwgc3JjMTcsIHNyYzE4CisgICAgICAgIHZtdWxsLnMxNiAgICAgICBcZHN0MSwgXHNyYzEsICBkMFswXQorICAgICAgICB2bXVsbC5zMTYgICAgICAgXGRzdDIsIFxzcmMyLCAgZDBbMF0KKyAgICAgICAgdm11bGwuczE2ICAgICAgIFxkc3QzLCBcc3JjMywgIGQwWzBdCisgICAgICAgIHZtdWxsLnMxNiAgICAgICBcZHN0NCwgXHNyYzQsICBkMFswXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDEsIFxzcmMzLCAgZDBbMV0KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3QyLCBcc3JjNCwgIGQwWzFdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0MywgXHNyYzUsICBkMFsxXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDQsIFxzcmM2LCAgZDBbMV0KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3QxLCBcc3JjNSwgIGQwWzJdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0MiwgXHNyYzYsICBkMFsyXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDMsIFxzcmM3LCAgZDBbMl0KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3Q0LCBcc3JjOCwgIGQwWzJdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0MSwgXHNyYzcsICBkMFszXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDIsIFxzcmM4LCAgZDBbM10KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3QzLCBcc3JjOSwgIGQwWzNdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0NCwgXHNyYzEwLCBkMFszXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDEsIFxzcmM5LCAgZDFbMF0KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3QyLCBcc3JjMTAsIGQxWzBdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0MywgXHNyYzExLCBkMVswXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDQsIFxzcmMxMiwgZDFbMF0KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3QxLCBcc3JjMTEsIGQxWzFdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0MiwgXHNyYzEyLCBkMVsxXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDMsIFxzcmMxMywgZDFbMV0KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3Q0LCBcc3JjMTQsIGQxWzFdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0MSwgXHNyYzEzLCBkMVsyXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDIsIFxzcmMxNCwgZDFbMl0KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3QzLCBcc3JjMTUsIGQxWzJdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0NCwgXHNyYzE2LCBkMVsyXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDEsIFxzcmMxNSwgZDFbM10KKyAgICAgICAgdm1sYWwuczE2ICAgICAgIFxkc3QyLCBcc3JjMTYsIGQxWzNdCisgICAgICAgIHZtbGFsLnMxNiAgICAgICBcZHN0MywgXHNyYzE3LCBkMVszXQorICAgICAgICB2bWxhbC5zMTYgICAgICAgXGRzdDQsIFxzcmMxOCwgZDFbM10KKy5lbmRtCisKK0AgSW5zdGFudGlhdGUgYSB2ZXJ0aWNhbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIGZpbHRlcmluZyA4IHBpeGVscyBhdCBhIHRpbWUuCitAIFRoZSBoZWlnaHQgaXMgcGFzc2VkIGluIHI0LCB0aGUgd2lkdGggaW4gcjUgYW5kIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzCitAIGluIHIxMi4KKy5tYWNybyBkb184dGFwXzh2IHR5cGUKK2Z1bmN0aW9uIFx0eXBlXCgpXzh0YXBfOHYKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICBbcjEyLCA6MTI4XQorMToKKy5pZmMgXHR5cGUsYXZnCisgICAgICAgIG1vdiAgICAgICAgICAgICByNiwgIHIwCisuZW5kaWYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjQKKworICAgICAgICB2bGQxLjE2ICAgICAgICAge3E1fSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTZ9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxN30sICBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3E4fSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTl9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTB9LCBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMX0sIFtyMl0sIHIzCisyOgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMn0sIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTEzfSwgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTR9LCBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExNX0sIFtyMl0sIHIzCisgICAgICAgIGNvbnZvbHZlOCAgICAgICBxMiwgIHEzLCAgcTQsICBxNSwgIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUsIGQxNiwgZDE3LCBkMTgsIGQxOSwgZDIwLCBkMjEsIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBkMjcKKyAgICAgICAgZG9fc3RvcmU4ICAgICAgIHEyLCAgcTMsICBxNCwgIHE1LCAgZDQsICBkNSwgIGQ2LCAgZDcsICBxMSwgIFx0eXBlCisgICAgICAgIGNvbnZvbHZlOCAgICAgICBxMiwgIHEzLCAgcTQsICBxNSwgIGQxNCwgZDE1LCBkMTYsIGQxNywgZDE4LCBkMTksIGQyMCwgZDIxLCBkMjIsIGQyMywgZDI0LCBkMjUsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEKKyAgICAgICAgZG9fc3RvcmU4ICAgICAgIHEyLCAgcTMsICBxNCwgIHE1LCAgZDQsICBkNSwgIGQ2LCAgZDcsICBxMSwgIFx0eXBlCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBiZXEgICAgICAgICAgICAgOGYKKworICAgICAgICB2bGQxLjE2ICAgICAgICAge3E0fSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTV9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxNn0sICBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3E3fSwgIFtyMl0sIHIzCisgICAgICAgIGNvbnZvbHZlOCAgICAgICBxMiwgIHEzLCAgcTgsICBxOSwgIGQxOCwgZDE5LCBkMjAsIGQyMSwgZDIyLCBkMjMsIGQyNCwgZDI1LCBkMjYsIGQyNywgZDI4LCBkMjksIGQzMCwgZDMxLCBkOCwgIGQ5LCAgZDEwLCBkMTEKKyAgICAgICAgZG9fc3RvcmU4ICAgICAgIHEyLCAgcTMsICBxOCwgIHE5LCAgZDQsICBkNSwgIGQ2LCAgZDcsICBxMSwgIFx0eXBlCisgICAgICAgIGNvbnZvbHZlOCAgICAgICBxMiwgIHEzLCAgcTgsICBxOSwgIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBkMjcsIGQyOCwgZDI5LCBkMzAsIGQzMSwgZDgsICBkOSwgIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUKKyAgICAgICAgZG9fc3RvcmU4ICAgICAgIHEyLCAgcTMsICBxOCwgIHE5LCAgZDQsICBkNSwgIGQ2LCAgZDcsICBxMSwgIFx0eXBlCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBiZXEgICAgICAgICAgICAgOGYKKworICAgICAgICB2bGQxLjE2ICAgICAgICAge3E4fSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7cTl9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMTB9LCBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3ExMX0sIFtyMl0sIHIzCisgICAgICAgIGNvbnZvbHZlOCAgICAgICBxMiwgIHEzLCAgcTEyLCBxMTMsIGQyNiwgZDI3LCBkMjgsIGQyOSwgZDMwLCBkMzEsIGQ4LCAgZDksICBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTYsIGQxNywgZDE4LCBkMTkKKyAgICAgICAgZG9fc3RvcmU4ICAgICAgIHEyLCAgcTMsICBxMTIsIHExMywgZDQsICBkNSwgIGQ2LCAgZDcsICBxMSwgIFx0eXBlCisgICAgICAgIGNvbnZvbHZlOCAgICAgICBxMiwgIHEzLCAgcTEyLCBxMTMsIGQzMCwgZDMxLCBkOCwgIGQ5LCAgZDEwLCBkMTEsIGQxMiwgZDEzLCBkMTQsIGQxNSwgZDE2LCBkMTcsIGQxOCwgZDE5LCBkMjAsIGQyMSwgZDIyLCBkMjMKKyAgICAgICAgZG9fc3RvcmU4ICAgICAgIHEyLCAgcTMsICBxMTIsIHExMywgZDQsICBkNSwgIGQ2LCAgZDcsICBxMSwgIFx0eXBlCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBibmUgICAgICAgICAgICAgMmIKKworODoKKyAgICAgICAgc3VicyAgICAgICAgICAgIHI1LCAgcjUsICAjOAorICAgICAgICBiZXEgICAgICAgICAgICAgOWYKKyAgICAgICAgQCByMCAtPSBoICogZHN0X3N0cmlkZQorICAgICAgICBtbHMgICAgICAgICAgICAgcjAsICByMSwgIHI0LCByMAorICAgICAgICBAIHIyIC09IGggKiBzcmNfc3RyaWRlCisgICAgICAgIG1scyAgICAgICAgICAgICByMiwgIHIzLCAgcjQsIHIyCisgICAgICAgIEAgcjIgLT0gOCAqIHNyY19zdHJpZGUKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgbHNsICMzCisgICAgICAgIEAgcjIgKz0gMSAqIHNyY19zdHJpZGUKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICBhZGQgICAgICAgICAgICAgcjIsICByMiwgICMxNgorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICMxNgorICAgICAgICBiICAgICAgICAgICAgICAgMWIKKzk6CisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjZ9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworZG9fOHRhcF84diBwdXQKK2RvXzh0YXBfOHYgYXZnCisKK0AgSW5zdGFudGlhdGUgYSB2ZXJ0aWNhbCBmaWx0ZXIgZnVuY3Rpb24gZm9yIGZpbHRlcmluZyBhIDQgcGl4ZWxzIHdpZGUKK0Agc2xpY2UuIFRoaXMgb25seSBpcyBkZXNpZ25lZCB0byB3b3JrIGZvciA0IG9yIDggb3V0cHV0IGxpbmVzLgorLm1hY3JvIGRvXzh0YXBfNHYgdHlwZQorZnVuY3Rpb24gXHR5cGVcKClfOHRhcF80dgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIzLCBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgIFtyMTIsIDoxMjhdCisuaWZjIFx0eXBlLGF2ZworICAgICAgICBtb3YgICAgICAgICAgICAgcjYsICByMAorLmVuZGlmCisKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTZ9LCBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QxN30sIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDE4fSwgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMTl9LCBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyMH0sIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDIxfSwgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjJ9LCBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyM30sIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI0fSwgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjV9LCBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyNn0sIFtyMl0sIHIzCisgICAgICAgIGNvbnZvbHZlNCAgICAgICBxMiwgIHEzLCAgZDE2LCBkMTcsIGQxOCwgZDE5LCBkMjAsIGQyMSwgZDIyLCBkMjMsIGQyNCwgcTE0LCBxMTUKKyAgICAgICAgY29udm9sdmU0ICAgICAgIHExNCwgcTE1LCBkMTgsIGQxOSwgZDIwLCBkMjEsIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBxOCwgIHE5CisgICAgICAgIGRvX3N0b3JlNCAgICAgICBxMiwgIGQ0LCAgcTMsICBkNiwgIHExNCwgZDI4LCBxMTUsIGQzMCwgZDUsICBkNywgIGQyOSwgZDMxLCBkMiwgIFx0eXBlCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHI0LCAgcjQsICAjNAorICAgICAgICBiZXEgICAgICAgICAgICAgOWYKKworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QyN30sIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMTYgICAgICAgICB7ZDI4fSwgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtkMjl9LCBbcjJdLCByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge2QzMH0sIFtyMl0sIHIzCisgICAgICAgIGNvbnZvbHZlNCAgICAgICBxMiwgIHEzLCAgZDIwLCBkMjEsIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBkMjcsIGQyOCwgcTgsICBxOQorICAgICAgICBjb252b2x2ZTQgICAgICAgcTgsICBxOSwgIGQyMiwgZDIzLCBkMjQsIGQyNSwgZDI2LCBkMjcsIGQyOCwgZDI5LCBkMzAsIHExMCwgcTExCisgICAgICAgIGRvX3N0b3JlNCAgICAgICBxMiwgIGQ0LCAgcTMsICBkNiwgIHE4LCAgZDE2LCBxOSwgIGQxOCwgZDUsICBkNywgIGQxNywgZDE5LCBkMiwgIFx0eXBlCisKKzk6CisgICAgICAgIHBvcCAgICAgICAgICAgICB7cjQtcjZ9CisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworLmVuZG0KKworZG9fOHRhcF80diBwdXQKK2RvXzh0YXBfNHYgYXZnCisKKy5tYWNybyBkb184dGFwX3ZfZnVuYyB0eXBlLCBmaWx0ZXIsIG9mZnNldCwgc2l6ZSwgYnBwCitmdW5jdGlvbiBmZl92cDlfXHR5cGVcKClfXGZpbHRlclwoKVxzaXplXCgpX3ZfXGJwcFwoKV9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge3I0LXI2fQorICAgICAgICBsZHIgICAgICAgICAgICAgcjQsICBbc3AsICMxMl0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI1LCAgW3NwLCAjMjBdCisuaWYgXHNpemUgPj0gOAorICAgICAgICB2cHVzaCAgICAgICAgICAge3E0LXE3fQorLmVuZGlmCisgICAgICAgIHZtdm4udTE2ICAgICAgICBxMSwgICMoKDB4ZmZmZiA8PCBcYnBwKSAmIDB4ZmZmZikKKyAgICAgICAgbW92cmVseCAgICAgICAgIHIxMiwgWChmZl92cDlfc3VicGVsX2ZpbHRlcnMpLCByNgorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsIDI1Nipcb2Zmc2V0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgcjUsIGxzbCAjNAorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICAjXHNpemUKKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwXzh2CisuZWxzZQorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfOHRhcF80dgorLmVuZGlmCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF92X2ZpbHRlcnMgc2l6ZSwgYnBwCitkb184dGFwX3ZfZnVuYyBwdXQsIHJlZ3VsYXIsIDEsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBhdmcsIHJlZ3VsYXIsIDEsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBwdXQsIHNoYXJwLCAgIDIsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBhdmcsIHNoYXJwLCAgIDIsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBwdXQsIHNtb290aCwgIDAsIFxzaXplLCBcYnBwCitkb184dGFwX3ZfZnVuYyBhdmcsIHNtb290aCwgIDAsIFxzaXplLCBcYnBwCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF92X2ZpbHRlcnNfYnBwIGJwcAorZG9fOHRhcF92X2ZpbHRlcnMgNjQsIFxicHAKK2RvXzh0YXBfdl9maWx0ZXJzIDMyLCBcYnBwCitkb184dGFwX3ZfZmlsdGVycyAxNiwgXGJwcAorZG9fOHRhcF92X2ZpbHRlcnMgOCwgIFxicHAKK2RvXzh0YXBfdl9maWx0ZXJzIDQsICBcYnBwCisuZW5kbQorCitkb184dGFwX3ZfZmlsdGVyc19icHAgMTAKK2RvXzh0YXBfdl9maWx0ZXJzX2JwcCAxMgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hcm0vdnA5bWNfbmVvbi5TIGIvbGliYXZjb2RlYy9hcm0vdnA5bWNfbmVvbi5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOGNkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2FybS92cDltY19uZW9uLlMKQEAgLTAsMCArMSw3MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgR29vZ2xlIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK0AgQWxsIHB1YmxpYyBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIGhhdmUgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CitAIHR5cGVkZWYgdm9pZCAoKnZwOV9tY19mdW5jKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorQCAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIHB0cmRpZmZfdCByZWZfc3RyaWRlLAorQCAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpOworCitmdW5jdGlvbiBmZl92cDlfY29weTY0X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKyAgICAgICAgc3ViICAgICAgICAgICAgIHIxLCAgcjEsICAjMzIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjMsICAjMzIKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTAsICBxMX0sICBbcjJdIQorICAgICAgICB2c3QxLjggICAgICAgICAge3EwLCAgcTF9LCAgW3IwLCA6MTI4XSEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMiwgIHEzfSwgIFtyMl0sIHIzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMiwgIHEzfSwgIFtyMCwgOjEyOF0sIHIxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2F2ZzY0X25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7bHJ9CisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcCwgIzRdCisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgIzMyCisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHIzLCAgIzMyCisgICAgICAgIG1vdiAgICAgICAgICAgICBsciwgIHIwCisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge3E4LCAgcTl9LCAgW3IyXSEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMCwgIHExfSwgIFtyMCwgOjEyOF0hCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTEwLCBxMTF9LCBbcjJdLCByMworICAgICAgICB2cmhhZGQudTggICAgICAgcTAsICBxMCwgIHE4CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTIsICBxM30sICBbcjAsIDoxMjhdLCByMQorICAgICAgICB2cmhhZGQudTggICAgICAgcTEsICBxMSwgIHE5CisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMiwgIHEyLCAgcTEwCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTAsICBxMX0sICBbbHIsIDoxMjhdIQorICAgICAgICB2cmhhZGQudTggICAgICAgcTMsICBxMywgIHExMQorICAgICAgICB2c3QxLjggICAgICAgICAge3EyLCAgcTN9LCAgW2xyLCA6MTI4XSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2NvcHkzMl9uZW9uLCBleHBvcnQ9MQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3BdCisxOgorICAgICAgICB2bGQxLjggICAgICAgICAge3EwLCAgcTF9LCAgW3IyXSwgcjMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMQorICAgICAgICB2c3QxLjggICAgICAgICAge3EwLCAgcTF9LCAgW3IwLCA6MTI4XSwgcjEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnMzJfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMiwgIHEzfSwgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTAsICBxMX0sICBbcjAsIDoxMjhdCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMCwgIHEwLCAgcTIKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIHExLCAgcTEsICBxMworICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICMxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTAsICBxMX0sICBbcjAsIDoxMjhdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9jb3B5MTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNCxscn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjOF0KKyAgICAgICAgYWRkICAgICAgICAgICAgIHI0LCAgcjAsICByMQorICAgICAgICBhZGQgICAgICAgICAgICAgbHIsICByMiwgIHIzCisgICAgICAgIGFkZCAgICAgICAgICAgICByMSwgIHIxLCAgcjEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIzLCAgcjMsICByMworMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMH0sICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge3ExfSwgIFtscl0sIHIzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMH0sICBbcjAsIDoxMjhdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge3ExfSwgIFtyNCwgOjEyOF0sIHIxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LHBjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnMTZfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgcHVzaCAgICAgICAgICAgIHtscn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwLCAjNF0KKyAgICAgICAgbW92ICAgICAgICAgICAgIGxyLCAgcjAKKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTJ9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMH0sICBbcjAsIDoxMjhdLCByMQorICAgICAgICB2bGQxLjggICAgICAgICAge3EzfSwgIFtyMl0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBxMCwgIHEwLCAgcTIKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMX0sICBbcjAsIDoxMjhdLCByMQorICAgICAgICB2cmhhZGQudTggICAgICAgcTEsICBxMSwgIHEzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtxMH0sICBbbHIsIDoxMjhdLCByMQorICAgICAgICB2c3QxLjggICAgICAgICAge3ExfSwgIFtsciwgOjEyOF0sIHIxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBwb3AgICAgICAgICAgICAge3BjfQorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfY29weThfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgbGRyICAgICAgICAgICAgIHIxMiwgW3NwXQorMToKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QxfSwgIFtyMl0sIHIzCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzIKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMH0sICBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDF9LCAgW3IwLCA6NjRdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3ZwOV9hdmc4X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKzE6CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMH0sICBbcjAsIDo2NF0sIHIxCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDN9LCAgW3IyXSwgcjMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQwLCAgZDAsICBkMgorICAgICAgICB2bGQxLjggICAgICAgICAge2QxfSwgIFtyMCwgOjY0XQorICAgICAgICBzdWIgICAgICAgICAgICAgcjAsICByMCwgIHIxCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMSwgIGQxLCAgZDMKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjMgorICAgICAgICB2c3QxLjggICAgICAgICAge2QwfSwgIFtyMCwgOjY0XSwgcjEKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMX0sICBbcjAsIDo2NF0sIHIxCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfdnA5X2NvcHk0X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkciAgICAgICAgICAgICByMTIsIFtzcF0KKzE6CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDBbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMVtdfSwgICBbcjJdLCByMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgIFtyMCwgOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMltdfSwgICBbcjJdLCByMworICAgICAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgIFtyMCwgOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkM1tdfSwgICBbcjJdLCByMworICAgICAgICBzdWJzICAgICAgICAgICAgcjEyLCByMTIsICM0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCAgW3IwLCA6MzJdLCByMQorICAgICAgICB2c3QxLjMyICAgICAgICAge2QzWzBdfSwgIFtyMCwgOjMyXSwgcjEKKyAgICAgICAgYm5lICAgICAgICAgICAgIDFiCisgICAgICAgIGJ4ICAgICAgICAgICAgICBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl92cDlfYXZnNF9uZW9uLCBleHBvcnQ9MQorICAgICAgICBwdXNoICAgICAgICAgICAge2xyfQorICAgICAgICBsZHIgICAgICAgICAgICAgcjEyLCBbc3AsICM0XQorICAgICAgICBtb3YgICAgICAgICAgICAgbHIsICByMAorMToKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNFtdfSwgICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QwW119LCAgIFtyMCwgOjMyXSwgcjEKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVtdfSwgICBbcjJdLCByMworICAgICAgICB2cmhhZGQudTggICAgICAgZDAsICBkMCwgIGQ0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDFbXX0sICAgW3IwLCA6MzJdLCByMQorICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2W119LCAgIFtyMl0sIHIzCisgICAgICAgIHZyaGFkZC51OCAgICAgICBkMSwgIGQxLCAgZDUKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMltdfSwgICBbcjAsIDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDdbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQyLCAgZDIsICBkNgorICAgICAgICB2bGQxLjMyICAgICAgICAge2QzW119LCAgIFtyMCwgOjMyXSwgcjEKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICB2c3QxLjMyICAgICAgICAge2QwWzBdfSwgIFtsciwgOjMyXSwgcjEKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIGQzLCAgZDMsICBkNworICAgICAgICB2c3QxLjMyICAgICAgICAge2QxWzBdfSwgIFtsciwgOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtkMlswXX0sICBbbHIsIDozMl0sIHIxCisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDNbMF19LCAgW2xyLCA6MzJdLCByMQorICAgICAgICBibmUgICAgICAgICAgICAgMWIKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtwY30KK2VuZGZ1bmMKKworQCBIZWxwZXIgbWFjcm9zIGZvciB2bXVsL3ZtbGEgd2l0aCBhIGNvbnN0YW50IGZyb20gZWl0aGVyIGQwIG9yIGQxIGRlcGVuZGluZyBvbiBpbmRleAorLm1hY3JvIHZtdWxfbGFuZSBkc3QsIHNyYywgaWR4CisuaWYgXGlkeCA8IDQKKyAgICAgICB2bXVsLnMxNiAgICAgICAgIFxkc3QsIFxzcmMsIGQwW1xpZHhdCisuZWxzZQorICAgICAgIHZtdWwuczE2ICAgICAgICAgXGRzdCwgXHNyYywgZDFbXGlkeCAtIDRdCisuZW5kaWYKKy5lbmRtCisubWFjcm8gdm1sYV9sYW5lIGRzdCwgc3JjLCBpZHgKKy5pZiBcaWR4IDwgNAorICAgICAgIHZtbGEuczE2ICAgICAgICAgXGRzdCwgXHNyYywgZDBbXGlkeF0KKy5lbHNlCisgICAgICAgdm1sYS5zMTYgICAgICAgICBcZHN0LCBcc3JjLCBkMVtcaWR4IC0gNF0KKy5lbmRpZgorLmVuZG0KKworQCBFeHRyYWN0IGEgdmVjdG9yIGZyb20gc3JjMS1zcmMyIGFuZCBzcmM0LXNyYzUgKHNyYzEtc3JjMyBhbmQgc3JjNC1zcmM2CitAIGZvciBzaXplID49IDE2KSwgYW5kIG11bHRpcGx5LWFjY3VtdWxhdGUgaW50byBkc3QxIGFuZCBkc3QzIChvcgorQCBkc3QxLWRzdDIgYW5kIGRzdDMtZHN0NCBmb3Igc2l6ZSA+PSAxNikKKy5tYWNybyBleHRtbGEgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0MWQsIGRzdDNkLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBvZmZzZXQsIHNpemUKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHExNCwgXHNyYzEsIFxzcmMyLCAjKDIqXG9mZnNldCkKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHExNSwgXHNyYzQsIFxzcmM1LCAjKDIqXG9mZnNldCkKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICB2bWxhX2xhbmUgICAgICAgXGRzdDEsICBxMTQsIFxvZmZzZXQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHE1LCAgXHNyYzIsIFxzcmMzLCAjKDIqXG9mZnNldCkKKyAgICAgICAgdm1sYV9sYW5lICAgICAgIFxkc3QzLCAgcTE1LCBcb2Zmc2V0CisgICAgICAgIHZleHQuOCAgICAgICAgICBxNiwgIFxzcmM1LCBcc3JjNiwgIygyKlxvZmZzZXQpCisgICAgICAgIHZtbGFfbGFuZSAgICAgICBcZHN0MiwgIHE1LCAgXG9mZnNldAorICAgICAgICB2bWxhX2xhbmUgICAgICAgXGRzdDQsICBxNiwgIFxvZmZzZXQKKy5lbHNlaWYgXHNpemUgPT0gOAorICAgICAgICB2bWxhX2xhbmUgICAgICAgXGRzdDEsICBxMTQsIFxvZmZzZXQKKyAgICAgICAgdm1sYV9sYW5lICAgICAgIFxkc3QzLCAgcTE1LCBcb2Zmc2V0CisuZWxzZQorICAgICAgICB2bWxhX2xhbmUgICAgICAgXGRzdDFkLCBkMjgsIFxvZmZzZXQKKyAgICAgICAgdm1sYV9sYW5lICAgICAgIFxkc3QzZCwgZDMwLCBcb2Zmc2V0CisuZW5kaWYKKy5lbmRtCitAIFRoZSBzYW1lIGFzIGFib3ZlLCBidXQgZG9uJ3QgYWNjdW11bGF0ZSBzdHJhaWdodCBpbnRvIHRoZQorQCBkZXN0aW5hdGlvbiwgYnV0IHVzZSBhIHRlbXAgcmVnaXN0ZXIgYW5kIGFjY3VtdWxhdGUgd2l0aCBzYXR1cmF0aW9uLgorLm1hY3JvIGV4dG11bHFhZGQgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0MWQsIGRzdDNkLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBvZmZzZXQsIHNpemUKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHExNCwgXHNyYzEsIFxzcmMyLCAjKDIqXG9mZnNldCkKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHExNSwgXHNyYzQsIFxzcmM1LCAjKDIqXG9mZnNldCkKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICB2bXVsX2xhbmUgICAgICAgcTE0LCBxMTQsIFxvZmZzZXQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIHE1LCAgXHNyYzIsIFxzcmMzLCAjKDIqXG9mZnNldCkKKyAgICAgICAgdm11bF9sYW5lICAgICAgIHExNSwgcTE1LCBcb2Zmc2V0CisgICAgICAgIHZleHQuOCAgICAgICAgICBxNiwgIFxzcmM1LCBcc3JjNiwgIygyKlxvZmZzZXQpCisgICAgICAgIHZtdWxfbGFuZSAgICAgICBxNSwgIHE1LCAgXG9mZnNldAorICAgICAgICB2bXVsX2xhbmUgICAgICAgcTYsICBxNiwgIFxvZmZzZXQKKy5lbHNlaWYgXHNpemUgPT0gOAorICAgICAgICB2bXVsX2xhbmUgICAgICAgcTE0LCBxMTQsIFxvZmZzZXQKKyAgICAgICAgdm11bF9sYW5lICAgICAgIHExNSwgcTE1LCBcb2Zmc2V0CisuZWxzZQorICAgICAgICB2bXVsX2xhbmUgICAgICAgZDI4LCBkMjgsIFxvZmZzZXQKKyAgICAgICAgdm11bF9sYW5lICAgICAgIGQzMCwgZDMwLCBcb2Zmc2V0CisuZW5kaWYKKy5pZiBcc2l6ZSA9PSA0CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBcZHN0MWQsIFxkc3QxZCwgZDI4CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBcZHN0M2QsIFxkc3QzZCwgZDMwCisuZWxzZQorICAgICAgICB2cWFkZC5zMTYgICAgICAgXGRzdDEsICBcZHN0MSwgIHExNAorICAgICAgICB2cWFkZC5zMTYgICAgICAgXGRzdDMsICBcZHN0MywgIHExNQorLmlmIFxzaXplID49IDE2CisgICAgICAgIHZxYWRkLnMxNiAgICAgICBcZHN0MiwgIFxkc3QyLCAgcTUKKyAgICAgICAgdnFhZGQuczE2ICAgICAgIFxkc3Q0LCAgXGRzdDQsICBxNgorLmVuZGlmCisuZW5kaWYKKy5lbmRtCisKKworQCBJbnN0YW50aWF0ZSBhIGhvcml6b250YWwgZmlsdGVyIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gc2l6ZS4KK0AgVGhpcyBjYW4gd29yayBvbiA0LCA4IG9yIDE2IHBpeGVscyBpbiBwYXJhbGxlbDsgZm9yIGxhcmdlcgorQCB3aWR0aHMgaXQgd2lsbCBkbyAxNiBwaXhlbHMgYXQgYSB0aW1lIGFuZCBsb29wIGhvcml6b250YWxseS4KK0AgVGhlIGFjdHVhbCB3aWR0aCBpcyBwYXNzZWQgaW4gcjUsIHRoZSBoZWlnaHQgaW4gcjQgYW5kCitAIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGluIHIxMi4gaWR4MiBpcyB0aGUgaW5kZXggb2YgdGhlIGxhcmdlc3QKK0AgZmlsdGVyIGNvZWZmaWNpZW50ICgzIG9yIDQpIGFuZCBpZHgxIGlzIHRoZSBvdGhlciBvbmUgb2YgdGhlbS4KKy5tYWNybyBkb184dGFwX2ggdHlwZSwgc2l6ZSwgaWR4MSwgaWR4MgorZnVuY3Rpb24gXHR5cGVcKClfOHRhcF9cc2l6ZVwoKWhfXGlkeDFcaWR4MgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgICMzCisgICAgICAgIGFkZCAgICAgICAgICAgICByNiwgIHIwLCAgcjEKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjIsICByMworICAgICAgICBhZGQgICAgICAgICAgICAgcjEsICByMSwgIHIxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMywgIHIzLCAgcjMKKyAgICAgICAgQCBPbmx5IHNpemUgPj0gMTYgbG9vcHMgaG9yaXpvbnRhbGx5IGFuZCBuZWVkcworICAgICAgICBAIHJlZHVjZWQgZHN0IHN0cmlkZQorLmlmIFxzaXplID49IDE2CisgICAgICAgIHN1YiAgICAgICAgICAgICByMSwgIHIxLCAgcjUKKy5lbmRpZgorICAgICAgICBAIHNpemUgPj0gMTYgbG9hZHMgdHdvIHF3b3JkcyBhbmQgaW5jcmVtZW50cyByMiwKKyAgICAgICAgQCBmb3Igc2l6ZSA0LzggaXQncyBlbm91Z2ggd2l0aCBvbmUgcXdvcmQgYW5kIG5vCisgICAgICAgIEAgcG9zdGluY3JlbWVudAorLmlmIFxzaXplID49IDE2CisgICAgICAgIHN1YiAgICAgICAgICAgICByMywgIHIzLCAgcjUKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIzLCAgcjMsICAjOAorLmVuZGlmCisgICAgICAgIEAgTG9hZCB0aGUgZmlsdGVyIHZlY3RvcgorICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgIFtyMTIsOjEyOF0KKzE6CisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjUKKy5lbmRpZgorICAgICAgICBAIExvYWQgc3JjCisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMTgsIGQxOSwgZDIwfSwgW3IyXSEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMjQsIGQyNSwgZDI2fSwgW3I3XSEKKy5lbHNlCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTl9LCAgW3IyXQorICAgICAgICB2bGQxLjggICAgICAgICAge3ExMn0sIFtyN10KKy5lbmRpZgorICAgICAgICB2bW92bC51OCAgICAgICAgcTgsICBkMTgKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE5LCAgZDE5CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTEsIGQyNAorICAgICAgICB2bW92bC51OCAgICAgICAgcTEyLCBkMjUKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICB2bW92bC51OCAgICAgICAgcTEwLCBkMjAKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMywgZDI2CisuZW5kaWYKKzI6CisKKyAgICAgICAgQCBBY2N1bXVsYXRlLCBhZGRpbmcgaWR4MiBsYXN0IHdpdGggYSBzZXBhcmF0ZQorICAgICAgICBAIHNhdHVyYXRpbmcgYWRkLiBUaGUgcG9zaXRpdmUgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAgICBAIGZvciBhbGwgaW5kaWNlcyBleGNlcHQgaWR4MiBtdXN0IGFkZCB1cCB0byBsZXNzCisgICAgICAgIEAgdGhhbiAxMjcgZm9yIHRoaXMgbm90IHRvIG92ZXJmbG93LgorICAgICAgICB2bXVsLnMxNiAgICAgICAgcTEsICBxOCwgIGQwWzBdCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxMywgIHExMSwgZDBbMF0KKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICB2bXVsLnMxNiAgICAgICAgcTIsICBxOSwgIGQwWzBdCisgICAgICAgIHZtdWwuczE2ICAgICAgICBxNCwgIHExMiwgZDBbMF0KKy5lbmRpZgorICAgICAgICBleHRtbGEgICAgICAgICAgcTEsICBxMiwgIHEzLCAgcTQsICBkMiwgIGQ2LCAgcTgsICBxOSwgIHExMCwgcTExLCBxMTIsIHExMywgMSwgICAgIFxzaXplCisgICAgICAgIGV4dG1sYSAgICAgICAgICBxMSwgIHEyLCAgcTMsICBxNCwgIGQyLCAgZDYsICBxOCwgIHE5LCAgcTEwLCBxMTEsIHExMiwgcTEzLCAyLCAgICAgXHNpemUKKyAgICAgICAgZXh0bWxhICAgICAgICAgIHExLCAgcTIsICBxMywgIHE0LCAgZDIsICBkNiwgIHE4LCAgcTksICBxMTAsIHExMSwgcTEyLCBxMTMsIFxpZHgxLCBcc2l6ZQorICAgICAgICBleHRtbGEgICAgICAgICAgcTEsICBxMiwgIHEzLCAgcTQsICBkMiwgIGQ2LCAgcTgsICBxOSwgIHExMCwgcTExLCBxMTIsIHExMywgNSwgICAgIFxzaXplCisgICAgICAgIGV4dG1sYSAgICAgICAgICBxMSwgIHEyLCAgcTMsICBxNCwgIGQyLCAgZDYsICBxOCwgIHE5LCAgcTEwLCBxMTEsIHExMiwgcTEzLCA2LCAgICAgXHNpemUKKyAgICAgICAgZXh0bWxhICAgICAgICAgIHExLCAgcTIsICBxMywgIHE0LCAgZDIsICBkNiwgIHE4LCAgcTksICBxMTAsIHExMSwgcTEyLCBxMTMsIDcsICAgICBcc2l6ZQorICAgICAgICBleHRtdWxxYWRkICAgICAgcTEsICBxMiwgIHEzLCAgcTQsICBkMiwgIGQ2LCAgcTgsICBxOSwgIHExMCwgcTExLCBxMTIsIHExMywgXGlkeDIsIFxzaXplCisKKyAgICAgICAgQCBSb3VuZCwgc2hpZnQgYW5kIHNhdHVyYXRlCisgICAgICAgIHZxcnNocnVuLnMxNiAgICBkMiwgIHExLCAgIzcKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIGQ2LCAgcTMsICAjNworLmlmIFxzaXplID49IDE2CisgICAgICAgIHZxcnNocnVuLnMxNiAgICBkMywgIHEyLCAgIzcKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIGQ3LCAgcTQsICAjNworLmVuZGlmCisgICAgICAgIEAgQXZlcmFnZQorLmlmYyBcdHlwZSxhdmcKKy5pZiBcc2l6ZSA+PSAxNgorICAgICAgICB2bGQxLjggICAgICAgICAge3ExNH0sIFtyMCw6MTI4XQorICAgICAgICB2bGQxLjggICAgICAgICAge3ExNX0sIFtyNiw6MTI4XQorICAgICAgICB2cmhhZGQudTggICAgICAgcTEsICBxMSwgIHExNAorICAgICAgICB2cmhhZGQudTggICAgICAgcTMsICBxMywgIHExNQorLmVsc2VpZiBcc2l6ZSA9PSA4CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDI4fSwgW3IwLDo2NF0KKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkMzB9LCBbcjYsOjY0XQorICAgICAgICB2cmhhZGQudTggICAgICAgZDIsICBkMiwgIGQyOAorICAgICAgICB2cmhhZGQudTggICAgICAgZDYsICBkNiwgIGQzMAorLmVsc2UKKyAgICAgICAgQCBXZSBvbmx5IG5lZWQgZDI4WzBdLCBidXQgW10gaXMgZmFzdGVyIG9uIHNvbWUgY29yZXMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMjhbXX0sIFtyMCw6MzJdCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDMwW119LCBbcjYsOjMyXQorICAgICAgICB2cmhhZGQudTggICAgICAgZDIsICBkMiwgIGQyOAorICAgICAgICB2cmhhZGQudTggICAgICAgZDYsICBkNiwgIGQzMAorLmVuZGlmCisuZW5kaWYKKyAgICAgICAgQCBTdG9yZSBhbmQgbG9vcCBob3Jpem9udGFsbHkgKGZvciBzaXplID49IDE2KQorLmlmIFxzaXplID49IDE2CisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzE2CisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTF9LCBbcjAsOjEyOF0hCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7cTN9LCBbcjYsOjEyOF0hCisgICAgICAgIGJlcSAgICAgICAgICAgICAzZgorICAgICAgICB2bW92ICAgICAgICAgICAgcTgsICBxMTAKKyAgICAgICAgdm1vdiAgICAgICAgICAgIHExMSwgcTEzCisgICAgICAgIHZsZDEuOCAgICAgICAgICB7cTEwfSwgW3IyXSEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtxMTN9LCBbcjddIQorICAgICAgICB2bW92bC51OCAgICAgICAgcTksICBkMjAKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMCwgZDIxCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTIsIGQyNgorICAgICAgICB2bW92bC51OCAgICAgICAgcTEzLCBkMjcKKyAgICAgICAgYiAgICAgICAgICAgICAgIDJiCisuZWxzZWlmIFxzaXplID09IDgKKyAgICAgICAgdnN0MS44ICAgICAgICAgIHtkMn0sIFtyMCw6NjRdCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7ZDZ9LCBbcjYsOjY0XQorLmVsc2UgQCBcc2l6ZSA9PSA0CisgICAgICAgIHZzdDEuMzIgICAgICAgICB7ZDJbMF19LCBbcjAsOjMyXQorICAgICAgICB2c3QxLjMyICAgICAgICAge2Q2WzBdfSwgW3I2LDozMl0KKy5lbmRpZgorMzoKKyAgICAgICAgQCBMb29wIHZlcnRpY2FsbHkKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIwLCAgcjAsICByMQorICAgICAgICBhZGQgICAgICAgICAgICAgcjYsICByNiwgIHIxCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCAgcjMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHI3LCAgcjcsICByMworICAgICAgICBzdWJzICAgICAgICAgICAgcjQsICByNCwgICMyCisgICAgICAgIGJuZSAgICAgICAgICAgICAxYgorLmlmIFxzaXplID49IDE2CisgICAgICAgIHZwb3AgICAgICAgICAgICB7cTQtcTZ9CisuZW5kaWYKKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yN30KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF9oX3NpemUgc2l6ZQorZG9fOHRhcF9oIHB1dCwgXHNpemUsIDMsIDQKK2RvXzh0YXBfaCBhdmcsIFxzaXplLCAzLCA0Citkb184dGFwX2ggcHV0LCBcc2l6ZSwgNCwgMworZG9fOHRhcF9oIGF2ZywgXHNpemUsIDQsIDMKKy5lbmRtCisKK2RvXzh0YXBfaF9zaXplIDQKK2RvXzh0YXBfaF9zaXplIDgKK2RvXzh0YXBfaF9zaXplIDE2CisKKy5tYWNybyBkb184dGFwX2hfZnVuYyB0eXBlLCBmaWx0ZXIsIG9mZnNldCwgc2l6ZQorZnVuY3Rpb24gZmZfdnA5X1x0eXBlXCgpX1xmaWx0ZXJcKClcc2l6ZVwoKV9oX25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjd9CisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgdnB1c2ggICAgICAgICAgIHtxNC1xNn0KKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjNjRdCisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtzcCwgIzY4XQorLmVsc2UKKyAgICAgICAgbGRyICAgICAgICAgICAgIHI0LCAgW3NwLCAjMTZdCisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtzcCwgIzIwXQorLmVuZGlmCisgICAgICAgIG1vdnJlbHggICAgICAgICByMTIsIFgoZmZfdnA5X3N1YnBlbF9maWx0ZXJzKSwgcjYKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIxMiwgcjEyLCAyNTYqXG9mZnNldAorICAgICAgICBjbXAgICAgICAgICAgICAgcjUsICAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsIHI1LCBsc2wgIzQKKyAgICAgICAgbW92ICAgICAgICAgICAgIHI1LCAgI1xzaXplCisuaWYgXHNpemUgPj0gMTYKKyAgICAgICAgYmdlICAgICAgICAgICAgIFx0eXBlXCgpXzh0YXBfMTZoXzM0CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwXzE2aF80MworLmVsc2UKKyAgICAgICAgYmdlICAgICAgICAgICAgIFx0eXBlXCgpXzh0YXBfXHNpemVcKCloXzM0CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwX1xzaXplXCgpaF80MworLmVuZGlmCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF9oX2ZpbHRlcnMgc2l6ZQorZG9fOHRhcF9oX2Z1bmMgcHV0LCByZWd1bGFyLCAxLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgYXZnLCByZWd1bGFyLCAxLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgcHV0LCBzaGFycCwgICAyLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgYXZnLCBzaGFycCwgICAyLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgcHV0LCBzbW9vdGgsICAwLCBcc2l6ZQorZG9fOHRhcF9oX2Z1bmMgYXZnLCBzbW9vdGgsICAwLCBcc2l6ZQorLmVuZG0KKworZG9fOHRhcF9oX2ZpbHRlcnMgNjQKK2RvXzh0YXBfaF9maWx0ZXJzIDMyCitkb184dGFwX2hfZmlsdGVycyAxNgorZG9fOHRhcF9oX2ZpbHRlcnMgOAorZG9fOHRhcF9oX2ZpbHRlcnMgNAorCisubHRvcmcKKworQCBWZXJ0aWNhbCBmaWx0ZXJzCisKK0AgUm91bmQsIHNoaWZ0IGFuZCBzYXR1cmF0ZSBhbmQgc3RvcmUgcXJlZzEtMiBvdmVyIDQgbGluZXMKKy5tYWNybyBkb19zdG9yZTQgcXJlZzEsIGRyZWcxLCBxcmVnMiwgZHJlZzIsIHRtcDEsIHRtcDIsIHR5cGUKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkcmVnMSwgIFxxcmVnMSwgIzcKKyAgICAgICAgdnFyc2hydW4uczE2ICAgIFxkcmVnMiwgIFxxcmVnMiwgIzcKKy5pZmMgXHR5cGUsYXZnCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7XHRtcDFbXX0sICAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7XHRtcDJbXX0sICAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7XHRtcDFbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7XHRtcDJbMV19LCAgW3IwLDozMl0sIHIxCisgICAgICAgIHZyaGFkZC51OCAgICAgICBcZHJlZzEsICBcZHJlZzEsICBcdG1wMQorICAgICAgICB2cmhhZGQudTggICAgICAgXGRyZWcyLCAgXGRyZWcyLCAgXHRtcDIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIwLCAgcjAsICByMSwgbHNsICMyCisuZW5kaWYKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtcZHJlZzFbMF19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtcZHJlZzJbMF19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtcZHJlZzFbMV19LCBbcjAsOjMyXSwgcjEKKyAgICAgICAgdnN0MS4zMiAgICAgICAgIHtcZHJlZzJbMV19LCBbcjAsOjMyXSwgcjEKKy5lbmRtCisKK0AgUm91bmQsIHNoaWZ0IGFuZCBzYXR1cmF0ZSBhbmQgc3RvcmUgcXJlZzEtNAorLm1hY3JvIGRvX3N0b3JlIHFyZWcxLCBkcmVnMSwgcXJlZzIsIGRyZWcyLCBxcmVnMywgZHJlZzMsIHFyZWc0LCBkcmVnNCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdHlwZQorICAgICAgICB2cXJzaHJ1bi5zMTYgICAgXGRyZWcxLCAgXHFyZWcxLCAjNworICAgICAgICB2cXJzaHJ1bi5zMTYgICAgXGRyZWcyLCAgXHFyZWcyLCAjNworICAgICAgICB2cXJzaHJ1bi5zMTYgICAgXGRyZWczLCAgXHFyZWczLCAjNworICAgICAgICB2cXJzaHJ1bi5zMTYgICAgXGRyZWc0LCAgXHFyZWc0LCAjNworLmlmYyBcdHlwZSxhdmcKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtcdG1wMX0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtcdG1wMn0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtcdG1wM30sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtcdG1wNH0sICBbcjAsOjY0XSwgcjEKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIFxkcmVnMSwgIFxkcmVnMSwgIFx0bXAxCisgICAgICAgIHZyaGFkZC51OCAgICAgICBcZHJlZzIsICBcZHJlZzIsICBcdG1wMgorICAgICAgICB2cmhhZGQudTggICAgICAgXGRyZWczLCAgXGRyZWczLCAgXHRtcDMKKyAgICAgICAgdnJoYWRkLnU4ICAgICAgIFxkcmVnNCwgIFxkcmVnNCwgIFx0bXA0CisgICAgICAgIHN1YiAgICAgICAgICAgICByMCwgIHIwLCAgcjEsIGxzbCAjMgorLmVuZGlmCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7XGRyZWcxfSwgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7XGRyZWcyfSwgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7XGRyZWczfSwgW3IwLDo2NF0sIHIxCisgICAgICAgIHZzdDEuOCAgICAgICAgICB7XGRyZWc0fSwgW3IwLDo2NF0sIHIxCisuZW5kbQorCitAIEV2YWx1YXRlIHRoZSBmaWx0ZXIgdHdpY2UgaW4gcGFyYWxsZWwsIGZyb20gdGhlIGlucHV0cyBzcmMxLXNyYzkgaW50byBkc3QxLWRzdDIKK0AgKHNyYzEtc3JjOCBpbnRvIGRzdDEsIHNyYzItc3JjOSBpbnRvIGRzdDIpLCBhZGRpbmcgaWR4MiBzZXBhcmF0ZWx5CitAIGF0IHRoZSBlbmQgd2l0aCBzYXR1cmF0aW9uLiBJbmRpY2VzIDAgYW5kIDcgYWx3YXlzIGhhdmUgbmVnYXRpdmUgb3IgemVybworQCBjb2VmZmljaWVudHMsIHNvIHRoZXkgY2FuIGJlIGFjY3VtdWxhdGVkIGludG8gdG1wMS10bXAyIHRvZ2V0aGVyIHdpdGggdGhlCitAIGxhcmdlc3QgY29lZmZpY2llbnQuCisubWFjcm8gY29udm9sdmUgZHN0MSwgZHN0Miwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgaWR4MSwgaWR4MiwgdG1wMSwgdG1wMgorICAgICAgICB2bXVsLnMxNiAgICAgICAgXGRzdDEsIFxzcmMyLCBkMFsxXQorICAgICAgICB2bXVsLnMxNiAgICAgICAgXGRzdDIsIFxzcmMzLCBkMFsxXQorICAgICAgICB2bXVsLnMxNiAgICAgICAgXHRtcDEsIFxzcmMxLCBkMFswXQorICAgICAgICB2bXVsLnMxNiAgICAgICAgXHRtcDIsIFxzcmMyLCBkMFswXQorICAgICAgICB2bWxhLnMxNiAgICAgICAgXGRzdDEsIFxzcmMzLCBkMFsyXQorICAgICAgICB2bWxhLnMxNiAgICAgICAgXGRzdDIsIFxzcmM0LCBkMFsyXQorLmlmIFxpZHgxID09IDMKKyAgICAgICAgdm1sYS5zMTYgICAgICAgIFxkc3QxLCBcc3JjNCwgZDBbM10KKyAgICAgICAgdm1sYS5zMTYgICAgICAgIFxkc3QyLCBcc3JjNSwgZDBbM10KKy5lbHNlCisgICAgICAgIHZtbGEuczE2ICAgICAgICBcZHN0MSwgXHNyYzUsIGQxWzBdCisgICAgICAgIHZtbGEuczE2ICAgICAgICBcZHN0MiwgXHNyYzYsIGQxWzBdCisuZW5kaWYKKyAgICAgICAgdm1sYS5zMTYgICAgICAgIFxkc3QxLCBcc3JjNiwgZDFbMV0KKyAgICAgICAgdm1sYS5zMTYgICAgICAgIFxkc3QyLCBcc3JjNywgZDFbMV0KKyAgICAgICAgdm1sYS5zMTYgICAgICAgIFx0bXAxLCBcc3JjOCwgZDFbM10KKyAgICAgICAgdm1sYS5zMTYgICAgICAgIFx0bXAyLCBcc3JjOSwgZDFbM10KKyAgICAgICAgdm1sYS5zMTYgICAgICAgIFxkc3QxLCBcc3JjNywgZDFbMl0KKyAgICAgICAgdm1sYS5zMTYgICAgICAgIFxkc3QyLCBcc3JjOCwgZDFbMl0KKy5pZiBcaWR4MiA9PSAzCisgICAgICAgIHZtbGEuczE2ICAgICAgICBcdG1wMSwgXHNyYzQsIGQwWzNdCisgICAgICAgIHZtbGEuczE2ICAgICAgICBcdG1wMiwgXHNyYzUsIGQwWzNdCisuZWxzZQorICAgICAgICB2bWxhLnMxNiAgICAgICAgXHRtcDEsIFxzcmM1LCBkMVswXQorICAgICAgICB2bWxhLnMxNiAgICAgICAgXHRtcDIsIFxzcmM2LCBkMVswXQorLmVuZGlmCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBcZHN0MSwgXGRzdDEsIFx0bXAxCisgICAgICAgIHZxYWRkLnMxNiAgICAgICBcZHN0MiwgXGRzdDIsIFx0bXAyCisuZW5kbQorCitAIExvYWQgcGl4ZWxzIGFuZCBleHRlbmQgdGhlbSB0byAxNiBiaXQKKy5tYWNybyBsb2FkbCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0CisgICAgICAgIHZsZDEuOCAgICAgICAgICB7ZDJ9LCBbcjJdLCByMworICAgICAgICB2bGQxLjggICAgICAgICAge2QzfSwgW3IyXSwgcjMKKyAgICAgICAgdmxkMS44ICAgICAgICAgIHtkNH0sIFtyMl0sIHIzCisuaWZuYiBcZHN0NAorICAgICAgICB2bGQxLjggICAgICAgICAge2Q1fSwgW3IyXSwgcjMKKy5lbmRpZgorICAgICAgICB2bW92bC51OCAgICAgICAgXGRzdDEsIGQyCisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBcZHN0MiwgZDMKKyAgICAgICAgdm1vdmwudTggICAgICAgIFxkc3QzLCBkNAorLmlmbmIgXGRzdDQKKyAgICAgICAgdm1vdmwudTggICAgICAgIFxkc3Q0LCBkNQorLmVuZGlmCisuZW5kbQorCitAIEluc3RhbnRpYXRlIGEgdmVydGljYWwgZmlsdGVyIGZ1bmN0aW9uIGZvciBmaWx0ZXJpbmcgOCBwaXhlbHMgYXQgYSB0aW1lLgorQCBUaGUgaGVpZ2h0IGlzIHBhc3NlZCBpbiByNCwgdGhlIHdpZHRoIGluIHI1IGFuZCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cworQCBpbiByMTIuIGlkeDIgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXJnZXN0IGZpbHRlciBjb2VmZmljaWVudCAoMyBvciA0KQorQCBhbmQgaWR4MSBpcyB0aGUgb3RoZXIgb25lIG9mIHRoZW0uCisubWFjcm8gZG9fOHRhcF84diB0eXBlLCBpZHgxLCBpZHgyCitmdW5jdGlvbiBcdHlwZVwoKV84dGFwXzh2X1xpZHgxXGlkeDIKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMywgbHNsICMxCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMKKyAgICAgICAgdmxkMS4xNiAgICAgICAgIHtxMH0sICBbcjEyLCA6MTI4XQorMToKKyAgICAgICAgbW92ICAgICAgICAgICAgIHIxMiwgcjQKKworICAgICAgICBsb2FkbCAgICAgICAgICAgcTUsICBxNiwgIHE3CisgICAgICAgIGxvYWRsICAgICAgICAgICBxOCwgIHE5LCAgcTEwLCBxMTEKKzI6CisgICAgICAgIGxvYWRsICAgICAgICAgICBxMTIsIHExMywgcTE0LCBxMTUKKyAgICAgICAgY29udm9sdmUgICAgICAgIHExLCAgcTIsICBxNSwgIHE2LCAgcTcsICBxOCwgIHE5LCAgcTEwLCBxMTEsIHExMiwgcTEzLCBcaWR4MSwgXGlkeDIsIHE0LCAgcTUKKyAgICAgICAgY29udm9sdmUgICAgICAgIHEzLCAgcTQsICBxNywgIHE4LCAgcTksICBxMTAsIHExMSwgcTEyLCBxMTMsIHExNCwgcTE1LCBcaWR4MSwgXGlkeDIsIHE1LCAgcTYKKyAgICAgICAgZG9fc3RvcmUgICAgICAgIHExLCAgZDIsICBxMiwgIGQ0LCAgcTMsICBkNiwgIHE0LCAgZDgsICBkMywgIGQ1LCAgZDcsICBkOSwgIFx0eXBlCisKKyAgICAgICAgc3VicyAgICAgICAgICAgIHIxMiwgcjEyLCAjNAorICAgICAgICBiZXEgICAgICAgICAgICAgOGYKKworICAgICAgICBsb2FkbCAgICAgICAgICAgcTQsICBxNSwgIHE2LCAgcTcKKyAgICAgICAgY29udm9sdmUgICAgICAgIHExLCAgcTIsICBxOSwgIHExMCwgcTExLCBxMTIsIHExMywgcTE0LCBxMTUsIHE0LCAgcTUsICBcaWR4MSwgXGlkeDIsIHE4LCAgcTkKKyAgICAgICAgY29udm9sdmUgICAgICAgIHEzLCAgcTgsICBxMTEsIHExMiwgcTEzLCBxMTQsIHExNSwgcTQsICBxNSwgIHE2LCAgcTcsICBcaWR4MSwgXGlkeDIsIHE5LCAgcTEwCisgICAgICAgIGRvX3N0b3JlICAgICAgICBxMSwgIGQyLCAgcTIsICBkNCwgIHEzLCAgZDYsICBxOCwgIGQxNiwgZDMsICBkNSwgIGQ3LCAgZDE3LCBcdHlwZQorCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzQKKyAgICAgICAgYmVxICAgICAgICAgICAgIDhmCisKKyAgICAgICAgbG9hZGwgICAgICAgICAgIHE4LCAgcTksICBxMTAsIHExMQorICAgICAgICBjb252b2x2ZSAgICAgICAgcTEsICBxMiwgIHExMywgcTE0LCBxMTUsIHE0LCAgcTUsICBxNiwgIHE3LCAgcTgsICBxOSwgIFxpZHgxLCBcaWR4MiwgcTEyLCBxMTMKKyAgICAgICAgY29udm9sdmUgICAgICAgIHEzLCAgcTEyLCBxMTUsIHE0LCAgcTUsICBxNiwgIHE3LCAgcTgsICBxOSwgIHExMCwgcTExLCBcaWR4MSwgXGlkeDIsIHExMywgcTE0CisgICAgICAgIGRvX3N0b3JlICAgICAgICBxMSwgIGQyLCAgcTIsICBkNCwgIHEzLCAgZDYsICBxMTIsIGQyNCwgZDMsICBkNSwgIGQ3LCAgZDI1LCBcdHlwZQorCisgICAgICAgIHN1YnMgICAgICAgICAgICByMTIsIHIxMiwgIzQKKyAgICAgICAgYm5lICAgICAgICAgICAgIDJiCisKKzg6CisgICAgICAgIHN1YnMgICAgICAgICAgICByNSwgIHI1LCAgIzgKKyAgICAgICAgYmVxICAgICAgICAgICAgIDlmCisgICAgICAgIEAgcjAgLT0gaCAqIGRzdF9zdHJpZGUKKyAgICAgICAgbWxzICAgICAgICAgICAgIHIwLCAgcjEsICByNCwgcjAKKyAgICAgICAgQCByMiAtPSBoICogc3JjX3N0cmlkZQorICAgICAgICBtbHMgICAgICAgICAgICAgcjIsICByMywgIHI0LCByMgorICAgICAgICBAIHIyIC09IDggKiBzcmNfc3RyaWRlCisgICAgICAgIHN1YiAgICAgICAgICAgICByMiwgIHIyLCAgcjMsIGxzbCAjMworICAgICAgICBAIHIyICs9IDEgKiBzcmNfc3RyaWRlCisgICAgICAgIGFkZCAgICAgICAgICAgICByMiwgIHIyLCAgcjMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHIyLCAgcjIsICAjOAorICAgICAgICBhZGQgICAgICAgICAgICAgcjAsICByMCwgICM4CisgICAgICAgIGIgICAgICAgICAgICAgICAxYgorOToKKyAgICAgICAgdnBvcCAgICAgICAgICAgIHtxNC1xN30KKyAgICAgICAgcG9wICAgICAgICAgICAgIHtyNC1yNX0KKyAgICAgICAgYnggICAgICAgICAgICAgIGxyCitlbmRmdW5jCisuZW5kbQorCitkb184dGFwXzh2IHB1dCwgMywgNAorZG9fOHRhcF84diBwdXQsIDQsIDMKK2RvXzh0YXBfOHYgYXZnLCAzLCA0Citkb184dGFwXzh2IGF2ZywgNCwgMworCitAIEluc3RhbnRpYXRlIGEgdmVydGljYWwgZmlsdGVyIGZ1bmN0aW9uIGZvciBmaWx0ZXJpbmcgYSA0IHBpeGVscyB3aWRlCitAIHNsaWNlLiBUaGUgZmlyc3QgaGFsZiBvZiB0aGUgcmVnaXN0ZXJzIGNvbnRhaW4gb25lIHJvdywgd2hpbGUgdGhlIHNlY29uZAorQCBoYWxmIG9mIGEgcmVnaXN0ZXIgY29udGFpbnMgdGhlIHNlY29uZC1uZXh0IHJvdyAoYWxzbyBzdG9yZWQgaW4gdGhlIGZpcnN0CitAIGhhbGYgb2YgdGhlIHJlZ2lzdGVyIHR3byBzdGVwcyBhaGVhZCkuIFRoZSBjb252b2x1dGlvbiBkb2VzIHR3byBvdXRwdXRzCitAIGF0IGEgdGltZTsgdGhlIG91dHB1dCBvZiBxNS1xMTIgaW50byBvbmUsIGFuZCBxNC1xMTMgaW50byBhbm90aGVyIG9uZS4KK0AgVGhlIGZpcnN0IGhhbGYgb2YgZmlyc3Qgb3V0cHV0IGlzIHRoZSBmaXJzdCBvdXRwdXQgcm93LCB0aGUgZmlyc3QgaGFsZgorQCBvZiB0aGUgb3RoZXIgb3V0cHV0IGlzIHRoZSBzZWNvbmQgb3V0cHV0IHJvdy4gVGhlIHNlY29uZCBoYWx2ZXMgb2YgdGhlCitAIHJlZ2lzdGVycyBhcmUgcm93cyAzIGFuZCA0LgorQCBUaGlzIG9ubHkgaXMgZGVzaWduZWQgdG8gd29yayBmb3IgNCBvciA4IG91dHB1dCBsaW5lcy4KKy5tYWNybyBkb184dGFwXzR2IHR5cGUsIGlkeDEsIGlkeDIKK2Z1bmN0aW9uIFx0eXBlXCgpXzh0YXBfNHZfXGlkeDFcaWR4MgorICAgICAgICBzdWIgICAgICAgICAgICAgcjIsICByMiwgIHIzLCBsc2wgIzEKKyAgICAgICAgc3ViICAgICAgICAgICAgIHIyLCAgcjIsICByMworICAgICAgICB2bGQxLjE2ICAgICAgICAge3EwfSwgIFtyMTIsIDoxMjhdCisKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMltdfSwgICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QzW119LCAgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDRbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkNVtdfSwgICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2Q2W119LCAgIFtyMl0sIHIzCisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDdbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyLCAgZDIsICBkNCwgICM0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDhbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQzLCAgZDMsICBkNSwgICM0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDlbXX0sICAgW3IyXSwgcjMKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE1LCAgZDIKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ0LCAgZDQsICBkNiwgICM0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI4W119LCAgW3IyXSwgcjMKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE2LCAgZDMKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ1LCAgZDUsICBkNywgICM0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDI5W119LCAgW3IyXSwgcjMKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE3LCAgZDQKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ2LCAgZDYsICBkOCwgICM0CisgICAgICAgIHZsZDEuMzIgICAgICAgICB7ZDMwW119LCAgW3IyXSwgcjMKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE4LCAgZDUKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQ3LCAgZDcsICBkOSwgICM0CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxOSwgIGQ2CisgICAgICAgIHZleHQuOCAgICAgICAgICBkOCwgIGQ4LCAgZDI4LCAjNAorICAgICAgICB2bW92bC51OCAgICAgICAgcTEwLCBkNworICAgICAgICB2ZXh0LjggICAgICAgICAgZDksICBkOSwgIGQyOSwgIzQKKyAgICAgICAgdm1vdmwudTggICAgICAgIHExMSwgZDgKKyAgICAgICAgdmV4dC44ICAgICAgICAgIGQyOCwgZDI4LCBkMzAsICM0CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTIsIGQ5CisgICAgICAgIHZtb3ZsLnU4ICAgICAgICBxMTMsIGQyOAorCisgICAgICAgIGNvbnZvbHZlICAgICAgICBxMSwgIHEyLCAgcTUsICBxNiwgIHE3LCAgcTgsICBxOSwgIHExMCwgcTExLCBxMTIsIHExMywgXGlkeDEsIFxpZHgyLCBxNCwgcTMKKyAgICAgICAgZG9fc3RvcmU0ICAgICAgIHExLCAgZDIsICBxMiwgIGQ0LCAgZDMsICBkNSwgIFx0eXBlCisgICAgICAgIHN1YnMgICAgICAgICAgICByNCwgIHI0LCAgIzQKKyAgICAgICAgYmVxICAgICAgICAgICAgIDlmCisKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMltdfSwgICBbcjJdLCByMworICAgICAgICB2bGQxLjMyICAgICAgICAge2QzW119LCAgIFtyMl0sIHIzCisgICAgICAgIHZleHQuOCAgICAgICAgICBkMjksIGQyOSwgZDIsICAjNAorICAgICAgICB2ZXh0LjggICAgICAgICAgZDMwLCBkMzAsIGQzLCAgIzQKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkMlsxXX0sICBbcjJdLCByMworICAgICAgICB2bW92bC51OCAgICAgICAgcTE0LCBkMjkKKyAgICAgICAgdmxkMS4zMiAgICAgICAgIHtkM1sxXX0sICBbcjJdLCByMworICAgICAgICB2bW92bC51OCAgICAgICAgcTE1LCBkMzAKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE1LCAgZDIKKyAgICAgICAgdm1vdmwudTggICAgICAgIHE2LCAgZDMKKworICAgICAgICBjb252b2x2ZSAgICAgICAgcTEsICBxMiwgIHE5LCAgcTEwLCBxMTEsIHExMiwgcTEzLCBxMTQsIHExNSwgcTUsICBxNiwgIFxpZHgxLCBcaWR4MiwgcTQsIHEzCisgICAgICAgIGRvX3N0b3JlNCAgICAgICBxMSwgIGQyLCAgcTIsICBkNCwgIGQzLCAgZDUsICBcdHlwZQorCis5OgorICAgICAgICB2cG9wICAgICAgICAgICAge3E0LXE3fQorICAgICAgICBwb3AgICAgICAgICAgICAge3I0LXI1fQorICAgICAgICBieCAgICAgICAgICAgICAgbHIKK2VuZGZ1bmMKKy5lbmRtCisKK2RvXzh0YXBfNHYgcHV0LCAzLCA0Citkb184dGFwXzR2IHB1dCwgNCwgMworZG9fOHRhcF80diBhdmcsIDMsIDQKK2RvXzh0YXBfNHYgYXZnLCA0LCAzCisKKy5tYWNybyBkb184dGFwX3ZfZnVuYyB0eXBlLCBmaWx0ZXIsIG9mZnNldCwgc2l6ZQorZnVuY3Rpb24gZmZfdnA5X1x0eXBlXCgpX1xmaWx0ZXJcKClcc2l6ZVwoKV92X25lb24sIGV4cG9ydD0xCisgICAgICAgIHB1c2ggICAgICAgICAgICB7cjQtcjV9CisgICAgICAgIHZwdXNoICAgICAgICAgICB7cTQtcTd9CisgICAgICAgIGxkciAgICAgICAgICAgICByNCwgIFtzcCwgIzcyXQorICAgICAgICBtb3ZyZWx4ICAgICAgICAgcjEyLCBYKGZmX3ZwOV9zdWJwZWxfZmlsdGVycyksIHI1CisgICAgICAgIGxkciAgICAgICAgICAgICByNSwgIFtzcCwgIzgwXQorICAgICAgICBhZGQgICAgICAgICAgICAgcjEyLCByMTIsIDI1Nipcb2Zmc2V0CisgICAgICAgIGFkZCAgICAgICAgICAgICByMTIsIHIxMiwgcjUsIGxzbCAjNAorICAgICAgICBjbXAgICAgICAgICAgICAgcjUsICAjOAorICAgICAgICBtb3YgICAgICAgICAgICAgcjUsICAjXHNpemUKKy5pZiBcc2l6ZSA+PSA4CisgICAgICAgIGJnZSAgICAgICAgICAgICBcdHlwZVwoKV84dGFwXzh2XzM0CisgICAgICAgIGIgICAgICAgICAgICAgICBcdHlwZVwoKV84dGFwXzh2XzQzCisuZWxzZQorICAgICAgICBiZ2UgICAgICAgICAgICAgXHR5cGVcKClfOHRhcF80dl8zNAorICAgICAgICBiICAgICAgICAgICAgICAgXHR5cGVcKClfOHRhcF80dl80MworLmVuZGlmCitlbmRmdW5jCisuZW5kbQorCisubWFjcm8gZG9fOHRhcF92X2ZpbHRlcnMgc2l6ZQorZG9fOHRhcF92X2Z1bmMgcHV0LCByZWd1bGFyLCAxLCBcc2l6ZQorZG9fOHRhcF92X2Z1bmMgYXZnLCByZWd1bGFyLCAxLCBcc2l6ZQorZG9fOHRhcF92X2Z1bmMgcHV0LCBzaGFycCwgICAyLCBcc2l6ZQorZG9fOHRhcF92X2Z1bmMgYXZnLCBzaGFycCwgICAyLCBcc2l6ZQorZG9fOHRhcF92X2Z1bmMgcHV0LCBzbW9vdGgsICAwLCBcc2l6ZQorZG9fOHRhcF92X2Z1bmMgYXZnLCBzbW9vdGgsICAwLCBcc2l6ZQorLmVuZG0KKworZG9fOHRhcF92X2ZpbHRlcnMgNjQKK2RvXzh0YXBfdl9maWx0ZXJzIDMyCitkb184dGFwX3ZfZmlsdGVycyAxNgorZG9fOHRhcF92X2ZpbHRlcnMgOAorZG9fOHRhcF92X2ZpbHRlcnMgNApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hc3MuYyBiL2xpYmF2Y29kZWMvYXNzLmMKaW5kZXggNTZkNDUyZi4uYjRmMDgxYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hc3MuYworKysgYi9saWJhdmNvZGVjL2Fzcy5jCkBAIC05MCwxMDEgKzkwLDQyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTX0RFRkFVTFRfQUxJR05NRU5UKTsKIH0KIAotc3RhdGljIHZvaWQgaW5zZXJ0X3RzKEFWQlByaW50ICpidWYsIGludCB0cykKK2NoYXIgKmZmX2Fzc19nZXRfZGlhbG9nKGludCByZWFkb3JkZXIsIGludCBsYXllciwgY29uc3QgY2hhciAqc3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzcGVha2VyLCBjb25zdCBjaGFyICp0ZXh0KQogewotICAgIGlmICh0cyA9PSAtMSkgewotICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIjk6NTk6NTkuOTksIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGgsIG0sIHM7Ci0KLSAgICAgICAgaCA9IHRzLzM2MDAwMDsgIHRzIC09IDM2MDAwMCpoOwotICAgICAgICBtID0gdHMvICA2MDAwOyAgdHMgLT0gICA2MDAwKm07Ci0gICAgICAgIHMgPSB0cy8gICAxMDA7ICB0cyAtPSAgICAxMDAqczsKLSAgICAgICAgYXZfYnByaW50ZihidWYsICIlZDolMDJkOiUwMmQuJTAyZCwiLCBoLCBtLCBzLCB0cyk7Ci0gICAgfQotfQotCi1pbnQgZmZfYXNzX2JwcmludF9kaWFsb2coQVZCUHJpbnQgKmJ1ZiwgY29uc3QgY2hhciAqZGlhbG9nLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0c19zdGFydCwgaW50IGR1cmF0aW9uLCBpbnQgcmF3KQotewotICAgIGludCBkbGVuOwotCi0gICAgaWYgKCFyYXcgfHwgcmF3ID09IDIpIHsKLSAgICAgICAgbG9uZyBpbnQgbGF5ZXIgPSAwOwotCi0gICAgICAgIGlmIChyYXcgPT0gMikgewotICAgICAgICAgICAgLyogc2tpcCBSZWFkT3JkZXIgKi8KLSAgICAgICAgICAgIGRpYWxvZyA9IHN0cmNocihkaWFsb2csICcsJyk7Ci0gICAgICAgICAgICBpZiAoIWRpYWxvZykKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIGRpYWxvZysrOwotCi0gICAgICAgICAgICAvKiBleHRyYWN0IExheWVyIG9yIE1hcmtlZCAqLwotICAgICAgICAgICAgbGF5ZXIgPSBzdHJ0b2woZGlhbG9nLCAoY2hhcioqKSZkaWFsb2csIDEwKTsKLSAgICAgICAgICAgIGlmICgqZGlhbG9nICE9ICcsJykKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIGRpYWxvZysrOwotICAgICAgICB9Ci0gICAgICAgIGF2X2JwcmludGYoYnVmLCAiRGlhbG9ndWU6ICVsZCwiLCBsYXllcik7Ci0gICAgICAgIGluc2VydF90cyhidWYsIHRzX3N0YXJ0KTsKLSAgICAgICAgaW5zZXJ0X3RzKGJ1ZiwgZHVyYXRpb24gPT0gLTEgPyAtMSA6IHRzX3N0YXJ0ICsgZHVyYXRpb24pOwotICAgICAgICBpZiAocmF3ICE9IDIpCi0gICAgICAgICAgICBhdl9icHJpbnRmKGJ1ZiwgIkRlZmF1bHQsLDAsMCwwLCwiKTsKLSAgICB9Ci0KLSAgICBkbGVuID0gc3RyY3NwbihkaWFsb2csICJcbiIpOwotICAgIGRsZW4gKz0gZGlhbG9nW2RsZW5dID09ICdcbic7Ci0KLSAgICBhdl9icHJpbnRmKGJ1ZiwgIiUuKnMiLCBkbGVuLCBkaWFsb2cpOwotICAgIGlmIChyYXcgPT0gMikKLSAgICAgICAgYXZfYnByaW50ZihidWYsICJcclxuIik7Ci0KLSAgICByZXR1cm4gZGxlbjsKKyAgICByZXR1cm4gYXZfYXNwcmludGYoIiVkLCVkLCVzLCVzLDAsMCwwLCwlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvcmRlciwgbGF5ZXIsIHN0eWxlID8gc3R5bGUgOiAiRGVmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgICAgIHNwZWFrZXIgPyBzcGVha2VyIDogIiIsIHRleHQpOwogfQogCiBpbnQgZmZfYXNzX2FkZF9yZWN0KEFWU3VidGl0bGUgKnN1YiwgY29uc3QgY2hhciAqZGlhbG9nLAotICAgICAgICAgICAgICAgICAgICBpbnQgdHNfc3RhcnQsIGludCBkdXJhdGlvbiwgaW50IHJhdykKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlYWRvcmRlciwgaW50IGxheWVyLCBjb25zdCBjaGFyICpzdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3BlYWtlcikKIHsKLSAgICBBVkJQcmludCBidWY7Ci0gICAgaW50IHJldCwgZGxlbjsKKyAgICBjaGFyICphc3Nfc3RyOwogICAgIEFWU3VidGl0bGVSZWN0ICoqcmVjdHM7CiAKLSAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwotICAgIGlmICgocmV0ID0gZmZfYXNzX2JwcmludF9kaWFsb2coJmJ1ZiwgZGlhbG9nLCB0c19zdGFydCwgZHVyYXRpb24sIHJhdykpIDwgMCkKLSAgICAgICAgZ290byBlcnI7Ci0gICAgZGxlbiA9IHJldDsKLSAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmYnVmKSkKLSAgICAgICAgZ290byBlcnJub21lbTsKLQogICAgIHJlY3RzID0gYXZfcmVhbGxvY19hcnJheShzdWItPnJlY3RzLCAoc3ViLT5udW1fcmVjdHMrMSksIHNpemVvZigqc3ViLT5yZWN0cykpOwogICAgIGlmICghcmVjdHMpCi0gICAgICAgIGdvdG8gZXJybm9tZW07CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgc3ViLT5yZWN0cyA9IHJlY3RzOwotICAgIHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSA9IEZGTUFYKHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSwgMTAgKiBkdXJhdGlvbik7CiAgICAgcmVjdHNbc3ViLT5udW1fcmVjdHNdICAgICAgID0gYXZfbWFsbG9jeihzaXplb2YoKnJlY3RzWzBdKSk7CiAgICAgaWYgKCFyZWN0c1tzdWItPm51bV9yZWN0c10pCi0gICAgICAgIGdvdG8gZXJybm9tZW07CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgcmVjdHNbc3ViLT5udW1fcmVjdHNdLT50eXBlID0gU1VCVElUTEVfQVNTOwotICAgIHJldCA9IGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCAmcmVjdHNbc3ViLT5udW1fcmVjdHNdLT5hc3MpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIGVycjsKKyAgICBhc3Nfc3RyID0gZmZfYXNzX2dldF9kaWFsb2cocmVhZG9yZGVyLCBsYXllciwgc3R5bGUsIHNwZWFrZXIsIGRpYWxvZyk7CisgICAgaWYgKCFhc3Nfc3RyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJlY3RzW3N1Yi0+bnVtX3JlY3RzXS0+YXNzID0gYXNzX3N0cjsKICAgICBzdWItPm51bV9yZWN0cysrOwotICAgIHJldHVybiBkbGVuOwotCi1lcnJub21lbToKLSAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci1lcnI6Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIDA7CiB9CiAKLWludCBmZl9hc3NfYWRkX3JlY3RfYnByaW50KEFWU3VidGl0bGUgKnN1YiwgQVZCUHJpbnQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0c19zdGFydCwgaW50IGR1cmF0aW9uKQordm9pZCBmZl9hc3NfZGVjb2Rlcl9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgYXZfYnByaW50ZihidWYsICJcclxuIik7Ci0gICAgaWYgKCFhdl9icHJpbnRfaXNfY29tcGxldGUoYnVmKSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICByZXR1cm4gZmZfYXNzX2FkZF9yZWN0KHN1YiwgYnVmLT5zdHIsIHRzX3N0YXJ0LCBkdXJhdGlvbiwgMCk7CisgICAgRkZBU1NEZWNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaWYgKCEoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX1JPX0ZMVVNIX05PT1ApKQorICAgICAgICBzLT5yZWFkb3JkZXIgPSAwOwogfQogCiB2b2lkIGZmX2Fzc19icHJpbnRfdGV4dF9ldmVudChBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICpwLCBpbnQgc2l6ZSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXNzLmggYi9saWJhdmNvZGVjL2Fzcy5oCmluZGV4IDYyMWE3YmEuLjMxNGI0M2IgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXNzLmgKKysrIGIvbGliYXZjb2RlYy9hc3MuaApAQCAtNDMsNiArNDMsMTAgQEAKICNkZWZpbmUgQVNTX0RFRkFVTFRfQk9SREVSU1RZTEUgMQogLyoqIEB9ICovCiAKK3R5cGVkZWYgc3RydWN0IEZGQVNTRGVjb2RlckNvbnRleHQgeworICAgIGludCByZWFkb3JkZXI7Cit9IEZGQVNTRGVjb2RlckNvbnRleHQ7CisKIC8qKgogICogR2VuZXJhdGUgYSBzdWl0YWJsZSBBVkNvZGVjQ29udGV4dC5zdWJ0aXRsZV9oZWFkZXIgZm9yIFNVQlRJVExFX0FTUy4KICAqCkBAIC03NCw1NSArNzgsMjMgQEAKIGludCBmZl9hc3Nfc3VidGl0bGVfaGVhZGVyX2RlZmF1bHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKIAogLyoqCi0gKiBBZGQgYW4gQVNTIGRpYWxvZyBsaW5lIHRvIGFuIEFWU3VidGl0bGUgYXMgYSBuZXcgQVZTdWJ0aXRsZVJlY3QuCi0gKgotICogQHBhcmFtIHN1YiBwb2ludGVyIHRvIHRoZSBBVlN1YnRpdGxlCi0gKiBAcGFyYW0gZGlhbG9nIEFTUyBkaWFsb2cgdG8gYWRkIHRvIHN1YgotICogQHBhcmFtIHRzX3N0YXJ0IHN0YXJ0IHRpbWVzdGFtcCBmb3IgdGhpcyBkaWFsb2cgKGluIDEvMTAwIHNlY29uZCB1bml0KQotICogQHBhcmFtIGR1cmF0aW9uIGR1cmF0aW9uIGZvciB0aGlzIGRpYWxvZyAoaW4gMS8xMDAgc2Vjb25kIHVuaXQpLCBjYW4gYmUgLTEKLSAqICAgICAgICAgICAgICAgICB0byBsYXN0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHByZXNlbnRhdGlvbgotICogQHBhcmFtIHJhdyB3aGVuIHNldCB0byAyLCBpdCBpbmRpY2F0ZXMgdGhhdCBkaWFsb2cgY29udGFpbnMgYW4gQVNTCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZyBsaW5lIGFzIG11eGVkIGluIE1hdHJvc2thCi0gKiAgICAgICAgICAgIHdoZW4gc2V0IHRvIDEsIGl0IGluZGljYXRlcyB0aGF0IGRpYWxvZyBjb250YWlucyBhIHdob2xlIFNTQQotICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cgbGluZSB3aGljaCBzaG91bGQgYmUgY29waWVkIGFzIGlzLgotICogICAgICAgICAgICB3aGVuIHNldCB0byAwLCBpdCBpbmRpY2F0ZXMgdGhhdCBkaWFsb2cgY29udGFpbnMgb25seSB0aGUgVGV4dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0IG9mIHRoZSBBU1MgZGlhbG9nIGxpbmUsIHRoZSByZXN0IG9mIHRoZSBsaW5lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkLgotICogQHJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGZyb20gZGlhbG9nLiBJdCBjYW4gYmUgbGVzcyB0aGFuIHRoZSB3aG9sZQotICogICAgICAgICBsZW5ndGggb2YgZGlhbG9nLCBpZiBkaWFsb2cgY29udGFpbnMgc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0LgotICogICAgICAgICBBIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBhbiBlcnJvci4KKyAqIENyYWZ0IGFuIEFTUyBkaWFsb2cgc3RyaW5nLgorICovCitjaGFyICpmZl9hc3NfZ2V0X2RpYWxvZyhpbnQgcmVhZG9yZGVyLCBpbnQgbGF5ZXIsIGNvbnN0IGNoYXIgKnN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3BlYWtlciwgY29uc3QgY2hhciAqdGV4dCk7CisKKy8qKgorICogQWRkIGFuIEFTUyBkaWFsb2cgdG8gYSBzdWJ0aXRsZS4KICAqLwogaW50IGZmX2Fzc19hZGRfcmVjdChBVlN1YnRpdGxlICpzdWIsIGNvbnN0IGNoYXIgKmRpYWxvZywKLSAgICAgICAgICAgICAgICAgICAgaW50IHRzX3N0YXJ0LCBpbnQgZHVyYXRpb24sIGludCByYXcpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVhZG9yZGVyLCBpbnQgbGF5ZXIsIGNvbnN0IGNoYXIgKnN0eWxlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzcGVha2VyKTsKIAogLyoqCi0gKiBTYW1lIGFzIGZmX2Fzc19hZGRfcmVjdCwgYnV0IHRha2luZyBhbiBBVkJQcmludCBidWZmZXIgaW5zdGVhZCBvZiBhCi0gKiBzdHJpbmcsIGFuZCBhc3N1bWluZyByYXc9MC4KKyAqIEhlbHBlciB0byBmbHVzaCBhIHRleHQgc3VidGl0bGVzIGRlY29kZXIgbWFraW5nIHVzZSBvZiB0aGUKKyAqIEZGQVNTRGVjb2RlckNvbnRleHQuCiAgKi8KLWludCBmZl9hc3NfYWRkX3JlY3RfYnByaW50KEFWU3VidGl0bGUgKnN1YiwgQVZCUHJpbnQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0c19zdGFydCwgaW50IGR1cmF0aW9uKTsKLQotLyoqCi0gKiBBZGQgYW4gQVNTIGRpYWxvZyBsaW5lIHRvIGFuIEFWQlByaW50IGJ1ZmZlci4KLSAqCi0gKiBAcGFyYW0gYnVmIHBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgQVZCUHJpbnQgYnVmZmVyCi0gKiBAcGFyYW0gZGlhbG9nIEFTUyBkaWFsb2cgdG8gYWRkIHRvIHN1YgotICogQHBhcmFtIHRzX3N0YXJ0IHN0YXJ0IHRpbWVzdGFtcCBmb3IgdGhpcyBkaWFsb2cgKGluIDEvMTAwIHNlY29uZCB1bml0KQotICogQHBhcmFtIGR1cmF0aW9uIGR1cmF0aW9uIGZvciB0aGlzIGRpYWxvZyAoaW4gMS8xMDAgc2Vjb25kIHVuaXQpLCBjYW4gYmUgLTEKLSAqICAgICAgICAgICAgICAgICB0byBsYXN0IHVudGlsIHRoZSBlbmQgb2YgdGhlIHByZXNlbnRhdGlvbgotICogQHBhcmFtIHJhdyB3aGVuIHNldCB0byAyLCBpdCBpbmRpY2F0ZXMgdGhhdCBkaWFsb2cgY29udGFpbnMgYW4gQVNTCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpYWxvZyBsaW5lIGFzIG11eGVkIGluIE1hdHJvc2thCi0gKiAgICAgICAgICAgIHdoZW4gc2V0IHRvIDEsIGl0IGluZGljYXRlcyB0aGF0IGRpYWxvZyBjb250YWlucyBhIHdob2xlIFNTQQotICogICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFsb2cgbGluZSB3aGljaCBzaG91bGQgYmUgY29waWVkIGFzIGlzLgotICogICAgICAgICAgICB3aGVuIHNldCB0byAwLCBpdCBpbmRpY2F0ZXMgdGhhdCBkaWFsb2cgY29udGFpbnMgb25seSB0aGUgVGV4dAotICogICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0IG9mIHRoZSBBU1MgZGlhbG9nIGxpbmUsIHRoZSByZXN0IG9mIHRoZSBsaW5lCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkLgotICogQHJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGZyb20gZGlhbG9nLiBJdCBjYW4gYmUgbGVzcyB0aGFuIHRoZSB3aG9sZQotICogICAgICAgICBsZW5ndGggb2YgZGlhbG9nLCBpZiBkaWFsb2cgY29udGFpbnMgc2V2ZXJhbCBsaW5lcyBvZiB0ZXh0LgotICogICAgICAgICBBIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyBhbiBlcnJvci4KLSAqLwotaW50IGZmX2Fzc19icHJpbnRfZGlhbG9nKEFWQlByaW50ICpidWYsIGNvbnN0IGNoYXIgKmRpYWxvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHNfc3RhcnQsIGludCBkdXJhdGlvbiwgaW50IHJhdyk7Cit2b2lkIGZmX2Fzc19kZWNvZGVyX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CiAKIC8qKgogICogRXNjYXBlIGEgdGV4dCBzdWJ0aXRsZSB1c2luZyBBU1Mgc3ludGF4IGludG8gYW4gQVZCUHJpbnQgYnVmZmVyLgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hc3Nfc3BsaXQuYyBiL2xpYmF2Y29kZWMvYXNzX3NwbGl0LmMKaW5kZXggZjg0YTY4Ni4uODcyNTI4YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hc3Nfc3BsaXQuYworKysgYi9saWJhdmNvZGVjL2Fzc19zcGxpdC5jCkBAIC0yMjksNyArMjI5LDcgQEAKICAgICByZXR1cm4gYnVmOwogfQogCi1zdGF0aWMgaW50ICpnZXRfZGVmYXVsdF9maWVsZF9vcmRlcnMoY29uc3QgQVNTU2VjdGlvbiAqc2VjdGlvbikKK3N0YXRpYyBpbnQgKmdldF9kZWZhdWx0X2ZpZWxkX29yZGVycyhjb25zdCBBU1NTZWN0aW9uICpzZWN0aW9uLCBpbnQgKm51bWJlcikKIHsKICAgICBpbnQgaTsKICAgICBpbnQgKm9yZGVyID0gYXZfbWFsbG9jX2FycmF5KEZGX0FSUkFZX0VMRU1TKHNlY3Rpb24tPmZpZWxkcyksIHNpemVvZigqb3JkZXIpKTsKQEAgLTIzOCw4ICsyMzgsOSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBmb3IgKGkgPSAwOyBzZWN0aW9uLT5maWVsZHNbaV0ubmFtZTsgaSsrKQogICAgICAgICBvcmRlcltpXSA9IGk7CisgICAgKm51bWJlciA9IGk7CiAgICAgd2hpbGUgKGkgPCBGRl9BUlJBWV9FTEVNUyhzZWN0aW9uLT5maWVsZHMpKQotICAgICAgICBvcmRlcltpXSA9IC0xOworICAgICAgICBvcmRlcltpKytdID0gLTE7CiAgICAgcmV0dXJuIG9yZGVyOwogfQogCkBAIC0yNTUsMzAgKzI1Niw0NyBAQAogICAgICAgICAgICAgY3R4LT5jdXJyZW50X3NlY3Rpb24gPSAtMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChidWZbMF0gPT0gJzsnIHx8IChidWZbMF0gPT0gJyEnICYmIGJ1ZlsxXSA9PSAnOicpKSB7Ci0gICAgICAgICAgICAvKiBza2lwIGNvbW1lbnRzICovCi0gICAgICAgIH0gZWxzZSBpZiAoc2VjdGlvbi0+Zm9ybWF0X2hlYWRlciAmJiAhb3JkZXIpIHsKLSAgICAgICAgICAgIGxlbiA9IHN0cmxlbihzZWN0aW9uLT5mb3JtYXRfaGVhZGVyKTsKLSAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1Ziwgc2VjdGlvbi0+Zm9ybWF0X2hlYWRlciwgbGVuKSB8fCBidWZbbGVuXSAhPSAnOicpCi0gICAgICAgICAgICAgICAgZ290byBuZXh0X2xpbmU7Ci0gICAgICAgICAgICBidWYgKz0gbGVuICsgMTsKLSAgICAgICAgICAgIHdoaWxlICghaXNfZW9sKCpidWYpKSB7Ci0gICAgICAgICAgICAgICAgYnVmID0gc2tpcF9zcGFjZShidWYpOwotICAgICAgICAgICAgICAgIGxlbiA9IHN0cmNzcG4oYnVmLCAiLCBcclxuIik7Ci0gICAgICAgICAgICAgICAgaWYgKCEodG1wID0gYXZfcmVhbGxvY19hcnJheShvcmRlciwgKCpudW1iZXIgKyAxKSwgc2l6ZW9mKCpvcmRlcikpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgb3JkZXIgPSB0bXA7Ci0gICAgICAgICAgICAgICAgb3JkZXJbKm51bWJlcl0gPSAtMTsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgc2VjdGlvbi0+ZmllbGRzW2ldLm5hbWU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGJ1Ziwgc2VjdGlvbi0+ZmllbGRzW2ldLm5hbWUsIGxlbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyWypudW1iZXJdID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKCpudW1iZXIpKys7Ci0gICAgICAgICAgICAgICAgYnVmID0gc2tpcF9zcGFjZShidWYgKyBsZW4gKyAoYnVmW2xlbl0gPT0gJywnKSk7CisgICAgICAgIGlmIChidWZbMF0gPT0gJzsnIHx8IChidWZbMF0gPT0gJyEnICYmIGJ1ZlsxXSA9PSAnOicpKQorICAgICAgICAgICAgZ290byBuZXh0X2xpbmU7IC8vIHNraXAgY29tbWVudHMKKworICAgICAgICBsZW4gPSBzdHJjc3BuKGJ1ZiwgIjpcclxuIik7CisgICAgICAgIGlmIChidWZbbGVuXSA9PSAnOicgJiYKKyAgICAgICAgICAgICghc2VjdGlvbi0+ZmllbGRzX2hlYWRlciB8fCBzdHJuY21wKGJ1Ziwgc2VjdGlvbi0+ZmllbGRzX2hlYWRlciwgbGVuKSkpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhhc3Nfc2VjdGlvbnMpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXNzX3NlY3Rpb25zW2ldLmZpZWxkc19oZWFkZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgIXN0cm5jbXAoYnVmLCBhc3Nfc2VjdGlvbnNbaV0uZmllbGRzX2hlYWRlciwgbGVuKSkgeworICAgICAgICAgICAgICAgICAgICBjdHgtPmN1cnJlbnRfc2VjdGlvbiA9IGk7CisgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gPSAmYXNzX3NlY3Rpb25zW2N0eC0+Y3VycmVudF9zZWN0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgbnVtYmVyID0gJmN0eC0+ZmllbGRfbnVtYmVyW2N0eC0+Y3VycmVudF9zZWN0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgb3JkZXIgPSBjdHgtPmZpZWxkX29yZGVyW2N0eC0+Y3VycmVudF9zZWN0aW9uXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgY3R4LT5maWVsZF9vcmRlcltjdHgtPmN1cnJlbnRfc2VjdGlvbl0gPSBvcmRlcjsKLSAgICAgICAgfSBlbHNlIGlmIChzZWN0aW9uLT5maWVsZHNfaGVhZGVyKSB7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNlY3Rpb24tPmZvcm1hdF9oZWFkZXIgJiYgIW9yZGVyKSB7CisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc2VjdGlvbi0+Zm9ybWF0X2hlYWRlcik7CisgICAgICAgICAgICBpZiAoIXN0cm5jbXAoYnVmLCBzZWN0aW9uLT5mb3JtYXRfaGVhZGVyLCBsZW4pICYmIGJ1ZltsZW5dID09ICc6JykgeworICAgICAgICAgICAgICAgIGJ1ZiArPSBsZW4gKyAxOworICAgICAgICAgICAgICAgIHdoaWxlICghaXNfZW9sKCpidWYpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHNraXBfc3BhY2UoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RyY3NwbihidWYsICIsIFxyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEodG1wID0gYXZfcmVhbGxvY19hcnJheShvcmRlciwgKCpudW1iZXIgKyAxKSwgc2l6ZW9mKCpvcmRlcikpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICBvcmRlciA9IHRtcDsKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJbKm51bWJlcl0gPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpPTA7IHNlY3Rpb24tPmZpZWxkc1tpXS5uYW1lOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoYnVmLCBzZWN0aW9uLT5maWVsZHNbaV0ubmFtZSwgbGVuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyWypudW1iZXJdID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpudW1iZXIpKys7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHNraXBfc3BhY2UoYnVmICsgbGVuICsgKGJ1ZltsZW5dID09ICcsJykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdHgtPmZpZWxkX29yZGVyW2N0eC0+Y3VycmVudF9zZWN0aW9uXSA9IG9yZGVyOworICAgICAgICAgICAgICAgIGdvdG8gbmV4dF9saW5lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzZWN0aW9uLT5maWVsZHNfaGVhZGVyKSB7CiAgICAgICAgICAgICBsZW4gPSBzdHJsZW4oc2VjdGlvbi0+ZmllbGRzX2hlYWRlcik7CiAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoYnVmLCBzZWN0aW9uLT5maWVsZHNfaGVhZGVyLCBsZW4pICYmIGJ1ZltsZW5dID09ICc6JykgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciwgKnN0cnVjdF9wdHIgPSByZWFsbG9jX3NlY3Rpb25fYXJyYXkoY3R4KTsKQEAgLTI4Niw3ICszMDQsNyBAQAogCiAgICAgICAgICAgICAgICAgLyogTm8gZm9ybWF0IGhlYWRlciBsaW5lIGZvdW5kIHNvIGZhciwgYXNzdW1lIGRlZmF1bHQgKi8KICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZGVyID0gZ2V0X2RlZmF1bHRfZmllbGRfb3JkZXJzKHNlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBvcmRlciA9IGdldF9kZWZhdWx0X2ZpZWxkX29yZGVycyhzZWN0aW9uLCBudW1iZXIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW9yZGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZmllbGRfb3JkZXJbY3R4LT5jdXJyZW50X3NlY3Rpb25dID0gb3JkZXI7CkBAIC00MDksNiArNDI3LDU1IEBACiAgICAgcmV0dXJuIGRpYWxvZzsKIH0KIAordm9pZCBmZl9hc3NfZnJlZV9kaWFsb2coQVNTRGlhbG9nICoqZGlhbG9ncCkKK3sKKyAgICBBU1NEaWFsb2cgKmRpYWxvZyA9ICpkaWFsb2dwOworICAgIGlmICghZGlhbG9nKQorICAgICAgICByZXR1cm47CisgICAgYXZfZnJlZXAoJmRpYWxvZy0+c3R5bGUpOworICAgIGF2X2ZyZWVwKCZkaWFsb2ctPm5hbWUpOworICAgIGF2X2ZyZWVwKCZkaWFsb2ctPmVmZmVjdCk7CisgICAgYXZfZnJlZXAoJmRpYWxvZy0+dGV4dCk7CisgICAgYXZfZnJlZXAoZGlhbG9ncCk7Cit9CisKK0FTU0RpYWxvZyAqZmZfYXNzX3NwbGl0X2RpYWxvZzIoQVNTU3BsaXRDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY29uc3QgQVNTRmllbGRzIGZpZWxkc1tdID0geworICAgICAgICB7IlJlYWRPcmRlciIsIEFTU19JTlQsIG9mZnNldG9mKEFTU0RpYWxvZywgcmVhZG9yZGVyKX0sCisgICAgICAgIHsiTGF5ZXIiLCAgICAgQVNTX0lOVCwgb2Zmc2V0b2YoQVNTRGlhbG9nLCBsYXllcikgICAgfSwKKyAgICAgICAgeyJTdHlsZSIsICAgICBBU1NfU1RSLCBvZmZzZXRvZihBU1NEaWFsb2csIHN0eWxlKSAgICB9LAorICAgICAgICB7Ik5hbWUiLCAgICAgIEFTU19TVFIsIG9mZnNldG9mKEFTU0RpYWxvZywgbmFtZSkgICAgIH0sCisgICAgICAgIHsiTWFyZ2luTCIsICAgQVNTX0lOVCwgb2Zmc2V0b2YoQVNTRGlhbG9nLCBtYXJnaW5fbCkgfSwKKyAgICAgICAgeyJNYXJnaW5SIiwgICBBU1NfSU5ULCBvZmZzZXRvZihBU1NEaWFsb2csIG1hcmdpbl9yKSB9LAorICAgICAgICB7Ik1hcmdpblYiLCAgIEFTU19JTlQsIG9mZnNldG9mKEFTU0RpYWxvZywgbWFyZ2luX3YpIH0sCisgICAgICAgIHsiRWZmZWN0IiwgICAgQVNTX1NUUiwgb2Zmc2V0b2YoQVNTRGlhbG9nLCBlZmZlY3QpICAgfSwKKyAgICAgICAgeyJUZXh0IiwgICAgICBBU1NfU1RSLCBvZmZzZXRvZihBU1NEaWFsb2csIHRleHQpICAgICB9LAorICAgIH07CisKKyAgICBBU1NEaWFsb2cgKmRpYWxvZyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpkaWFsb2cpKTsKKyAgICBpZiAoIWRpYWxvZykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZmllbGRzKTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBsZW47CisgICAgICAgIGNvbnN0IGludCBsYXN0ID0gaSA9PSBGRl9BUlJBWV9FTEVNUyhmaWVsZHMpIC0gMTsKKyAgICAgICAgY29uc3QgQVNTRmllbGRUeXBlIHR5cGUgPSBmaWVsZHNbaV0udHlwZTsKKyAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkaWFsb2cgKyBmaWVsZHNbaV0ub2Zmc2V0OworICAgICAgICBidWYgPSBza2lwX3NwYWNlKGJ1Zik7CisgICAgICAgIGxlbiA9IGxhc3QgPyBzdHJsZW4oYnVmKSA6IHN0cmNzcG4oYnVmLCAiLCIpOworICAgICAgICBpZiAobGVuID49IElOVF9NQVgpIHsKKyAgICAgICAgICAgIGZmX2Fzc19mcmVlX2RpYWxvZygmZGlhbG9nKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIGNvbnZlcnRfZnVuY1t0eXBlXShwdHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgYnVmICs9IGxlbjsKKyAgICAgICAgaWYgKCpidWYpIGJ1ZisrOworICAgIH0KKyAgICByZXR1cm4gZGlhbG9nOworfQorCiB2b2lkIGZmX2Fzc19zcGxpdF9mcmVlKEFTU1NwbGl0Q29udGV4dCAqY3R4KQogewogICAgIGlmIChjdHgpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXNzX3NwbGl0LmggYi9saWJhdmNvZGVjL2Fzc19zcGxpdC5oCmluZGV4IGRlZmI1Y2MuLjMwY2U3NzIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXNzX3NwbGl0LmgKKysrIGIvbGliYXZjb2RlYy9hc3Nfc3BsaXQuaApAQCAtNjksNiArNjksNyBAQAogICogZmllbGRzIGV4dHJhY3RlZCBmcm9tIHRoZSBbRXZlbnRzXSBzZWN0aW9uCiAgKi8KIHR5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgICByZWFkb3JkZXI7CiAgICAgaW50ICAgbGF5ZXI7ICAgIC8qKjwgaGlnaGVyIG51bWJlcmVkIGxheWVycyBhcmUgZHJhd24gb3ZlciBsb3dlciBudW1iZXJlZCAqLwogICAgIGludCAgIHN0YXJ0OyAgICAvKio8IHN0YXJ0IHRpbWUgb2YgdGhlIGRpYWxvZyBpbiBjZW50aXNlY29uZHMgKi8KICAgICBpbnQgICBlbmQ7ICAgICAgLyoqPCBlbmQgdGltZSBvZiB0aGUgZGlhbG9nIGluIGNlbnRpc2Vjb25kcyAqLwpAQCAtMTEwLDcgKzExMSw3IEBACiAKIC8qKgogICogU3BsaXQgb25lIG9yIHNldmVyYWwgQVNTICJEaWFsb2d1ZSIgbGluZXMgZnJvbSBhIHN0cmluZyBidWZmZXIgYW5kIHN0b3JlCi0gKiB0aGVtIGluIGEgYWxyZWFkeSBpbml0aWFsaXplZCBjb250ZXh0LgorICogdGhlbSBpbiBhbiBhbHJlYWR5IGluaXRpYWxpemVkIGNvbnRleHQuCiAgKgogICogQHBhcmFtIGN0eCBDb250ZXh0IHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgZmZfYXNzX3NwbGl0KCkuCiAgKiBAcGFyYW0gYnVmIFN0cmluZyBjb250YWluaW5nIHRoZSBBU1MgIkRpYWxvZ3VlIiBsaW5lcy4KQEAgLTEyNSw2ICsxMjYsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGUsIGludCAqbnVtYmVyKTsKIAogLyoqCisgKiBGcmVlIGEgZGlhbG9ndWUgb2J0YWluZWQgZnJvbSBmZl9hc3Nfc3BsaXRfZGlhbG9nMigpLgorICovCit2b2lkIGZmX2Fzc19mcmVlX2RpYWxvZyhBU1NEaWFsb2cgKipkaWFsb2dwKTsKKworLyoqCisgKiBTcGxpdCBvbmUgQVNTIERpYWxvZ3VlIGxpbmUgZnJvbSBhIHN0cmluZyBidWZmZXIuCisgKgorICogQHBhcmFtIGN0eCBDb250ZXh0IHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgZmZfYXNzX3NwbGl0KCkuCisgKiBAcGFyYW0gYnVmIFN0cmluZyBjb250YWluaW5nIHRoZSBBU1MgIkRpYWxvZ3VlIiBsaW5lLgorICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBzcGxpdCBBU1NEaWFsb2cuIE11c3QgYmUgZnJlZWQgd2l0aCBmZl9hc3NfZnJlZV9kaWFsb2coKQorICovCitBU1NEaWFsb2cgKmZmX2Fzc19zcGxpdF9kaWFsb2cyKEFTU1NwbGl0Q29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpidWYpOworCisvKioKICAqIEZyZWUgYWxsIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBhbiBBU1NTcGxpdENvbnRleHQuCiAgKgogICogQHBhcmFtIGN0eCBDb250ZXh0IHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgZmZfYXNzX3NwbGl0KCkuCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Fzc2RlYy5jIGIvbGliYXZjb2RlYy9hc3NkZWMuYwppbmRleCAxMWRiZGUwLi4zMTc4ZjI5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2Fzc2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvYXNzZGVjLmMKQEAgLTIzLDcgKzIzLDYgQEAKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJhc3MuaCIKLSNpbmNsdWRlICJhc3Nfc3BsaXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCiAKQEAgLTM1LDc5ICszNCw0NCBAQAogICAgIG1lbWNweShhdmN0eC0+c3VidGl0bGVfaGVhZGVyLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOwogICAgIGF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXJbYXZjdHgtPmV4dHJhZGF0YV9zaXplXSA9IDA7CiAgICAgYXZjdHgtPnN1YnRpdGxlX2hlYWRlcl9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplOwotICAgIGF2Y3R4LT5wcml2X2RhdGEgPSBmZl9hc3Nfc3BsaXQoYXZjdHgtPmV4dHJhZGF0YSk7Ci0gICAgaWYoIWF2Y3R4LT5wcml2X2RhdGEpCi0gICAgICAgIHJldHVybiAtMTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhc3NfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBmZl9hc3Nfc3BsaXRfZnJlZShhdmN0eC0+cHJpdl9kYXRhKTsKLSAgICBhdmN0eC0+cHJpdl9kYXRhID0gTlVMTDsKLSAgICByZXR1cm4gMDsKLX0KLQotI2lmIENPTkZJR19TU0FfREVDT0RFUgotc3RhdGljIGludCBzc2FfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3Rfc3ViX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgY29uc3QgY2hhciAqcHRyID0gYXZwa3QtPmRhdGE7Ci0gICAgaW50IGxlbiwgc2l6ZSA9IGF2cGt0LT5zaXplOwotCi0gICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgIGludCBkdXJhdGlvbjsKLSAgICAgICAgQVNTRGlhbG9nICpkaWFsb2cgPSBmZl9hc3Nfc3BsaXRfZGlhbG9nKGF2Y3R4LT5wcml2X2RhdGEsIHB0ciwgMCwgTlVMTCk7Ci0gICAgICAgIGlmICghZGlhbG9nKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIGR1cmF0aW9uID0gZGlhbG9nLT5lbmQgLSBkaWFsb2ctPnN0YXJ0OwotICAgICAgICBsZW4gPSBmZl9hc3NfYWRkX3JlY3QoZGF0YSwgcHRyLCAwLCBkdXJhdGlvbiwgMSk7Ci0gICAgICAgIGlmIChsZW4gPCAwKQotICAgICAgICAgICAgcmV0dXJuIGxlbjsKLSAgICAgICAgcHRyICArPSBsZW47Ci0gICAgICAgIHNpemUgLT0gbGVuOwotICAgIH0KLQotICAgICpnb3Rfc3ViX3B0ciA9IGF2cGt0LT5zaXplID4gMDsKLSAgICByZXR1cm4gYXZwa3QtPnNpemU7Ci19Ci0KLUFWQ29kZWMgZmZfc3NhX2RlY29kZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICA9ICJzc2EiLAotICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU1NBIChTdWJTdGF0aW9uIEFscGhhKSBzdWJ0aXRsZSIpLAotICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCi0gICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NTQSwKLSAgICAuaW5pdCAgICAgICAgID0gYXNzX2RlY29kZV9pbml0LAotICAgIC5kZWNvZGUgICAgICAgPSBzc2FfZGVjb2RlX2ZyYW1lLAotICAgIC5jbG9zZSAgICAgICAgPSBhc3NfZGVjb2RlX2Nsb3NlLAotfTsKLSNlbmRpZgotCi0jaWYgQ09ORklHX0FTU19ERUNPREVSCiBzdGF0aWMgaW50IGFzc19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9zdWJfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKIHsKLSAgICBpbnQgcmV0OwogICAgIEFWU3VidGl0bGUgKnN1YiA9IGRhdGE7Ci0gICAgY29uc3QgY2hhciAqcHRyID0gYXZwa3QtPmRhdGE7Ci0gICAgc3RhdGljIGNvbnN0IEFWUmF0aW9uYWwgYXNzX3RiID0gezEsIDEwMH07Ci0gICAgY29uc3QgaW50IHRzX3N0YXJ0ICAgID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMsICAgICAgYXZjdHgtPnRpbWVfYmFzZSwgYXNzX3RiKTsKLSAgICBjb25zdCBpbnQgdHNfZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EoYXZwa3QtPmR1cmF0aW9uLCBhdmN0eC0+dGltZV9iYXNlLCBhc3NfdGIpOwogCiAgICAgaWYgKGF2cGt0LT5zaXplIDw9IDApCiAgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKIAotICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdChzdWIsIHB0ciwgdHNfc3RhcnQsIHRzX2R1cmF0aW9uLCAyKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfSU5WQUxJRERBVEEpCi0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgQVNTIHBhY2tldFxuIik7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgKmdvdF9zdWJfcHRyID0gYXZwa3QtPnNpemUgPiAwOworICAgIHN1Yi0+cmVjdHMgPSBhdl9tYWxsb2Moc2l6ZW9mKCpzdWItPnJlY3RzKSk7CisgICAgaWYgKCFzdWItPnJlY3RzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN1Yi0+cmVjdHNbMF0gPSBhdl9tYWxsb2N6KHNpemVvZigqc3ViLT5yZWN0c1swXSkpOworICAgIGlmICghc3ViLT5yZWN0c1swXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdWItPm51bV9yZWN0cyA9IDE7CisgICAgc3ViLT5yZWN0c1swXS0+dHlwZSA9IFNVQlRJVExFX0FTUzsKKyAgICBzdWItPnJlY3RzWzBdLT5hc3MgID0gYXZfc3RyZHVwKGF2cGt0LT5kYXRhKTsKKyAgICBpZiAoIXN1Yi0+cmVjdHNbMF0tPmFzcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAqZ290X3N1Yl9wdHIgPSAxOwogICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKIH0KIAorI2lmIENPTkZJR19TU0FfREVDT0RFUgorQVZDb2RlYyBmZl9zc2FfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gInNzYSIsCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBU1MgKEFkdmFuY2VkIFN1YlN0YXRpb24gQWxwaGEpIHN1YnRpdGxlIiksCisgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVNTLAorICAgIC5pbml0ICAgICAgICAgPSBhc3NfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICA9IGFzc19kZWNvZGVfZnJhbWUsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQVNTX0RFQ09ERVIKIEFWQ29kZWMgZmZfYXNzX2RlY29kZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICA9ICJhc3MiLAogICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVNTIChBZHZhbmNlZCBTdWJTdGF0aW9uIEFscGhhKSBzdWJ0aXRsZSIpLApAQCAtMTE1LDYgKzc5LDUgQEAKICAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVNTLAogICAgIC5pbml0ICAgICAgICAgPSBhc3NfZGVjb2RlX2luaXQsCiAgICAgLmRlY29kZSAgICAgICA9IGFzc19kZWNvZGVfZnJhbWUsCi0gICAgLmNsb3NlICAgICAgICA9IGFzc19kZWNvZGVfY2xvc2UsCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Fzc2VuYy5jIGIvbGliYXZjb2RlYy9hc3NlbmMuYwppbmRleCA1ZGMzYjA5Li5kYzRmMGZmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2Fzc2VuYy5jCisrKyBiL2xpYmF2Y29kZWMvYXNzZW5jLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJhc3Nfc3BsaXQuaCIKICNpbmNsdWRlICJhc3MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKQEAgLTUzLDIyICs1MiwxNiBAQAogICAgIGZvciAoaT0wOyBpPHN1Yi0+bnVtX3JlY3RzOyBpKyspIHsKICAgICAgICAgY2hhciBhc3NfbGluZVsyMDQ4XTsKICAgICAgICAgY29uc3QgY2hhciAqYXNzID0gc3ViLT5yZWN0c1tpXS0+YXNzOworICAgICAgICBsb25nIGludCBsYXllcjsKKyAgICAgICAgY2hhciAqcDsKIAogICAgICAgICBpZiAoc3ViLT5yZWN0c1tpXS0+dHlwZSAhPSBTVUJUSVRMRV9BU1MpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBTVUJUSVRMRV9BU1MgdHlwZSBzdXBwb3J0ZWQuXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdHJuY21wKGFzcywgIkRpYWxvZ3VlOiAiLCAxMCkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQVZTdWJ0aXRsZSByZWN0YW5nbGUgYXNzIFwiJXNcIiIKLSAgICAgICAgICAgICAgICAgICAiIGRvZXMgbm90IGxvb2sgbGlrZSBhIFNTQSBtYXJrdXBcbiIsIGFzcyk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0FTUykgewotICAgICAgICAgICAgbG9uZyBpbnQgbGF5ZXI7Ci0gICAgICAgICAgICBjaGFyICpwOwotCisjaWYgRkZfQVBJX0FTU19USU1JTkcKKyAgICAgICAgaWYgKCFzdHJuY21wKGFzcywgIkRpYWxvZ3VlOiAiLCAxMCkpIHsKICAgICAgICAgICAgIGlmIChpID4gMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQVNTIGVuY29kZXIgc3VwcG9ydHMgb25seSBvbmUgIgogICAgICAgICAgICAgICAgICAgICAgICAiQVNTIHJlY3RhbmdsZSBmaWVsZC5cbiIpOwpAQCAtOTQsNiArODcsOCBAQAogICAgICAgICAgICAgYXNzX2xpbmVbc3RyY3Nwbihhc3NfbGluZSwgIlxyXG4iKV0gPSAwOwogICAgICAgICAgICAgYXNzID0gYXNzX2xpbmU7CiAgICAgICAgIH0KKyNlbmRpZgorCiAgICAgICAgIGxlbiA9IGF2X3N0cmxjcHkoYnVmK3RvdGFsX2xlbiwgYXNzLCBidWZzaXplLXRvdGFsX2xlbik7CiAKICAgICAgICAgaWYgKGxlbiA+IGJ1ZnNpemUtdG90YWxfbGVuLTEpIHsKQEAgLTExMCw5ICsxMDUsOSBAQAogI2lmIENPTkZJR19TU0FfRU5DT0RFUgogQVZDb2RlYyBmZl9zc2FfZW5jb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgID0gInNzYSIsCi0gICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTU0EgKFN1YlN0YXRpb24gQWxwaGEpIHN1YnRpdGxlIiksCisgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBU1MgKEFkdmFuY2VkIFN1YlN0YXRpb24gQWxwaGEpIHN1YnRpdGxlIiksCiAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKLSAgICAuaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1NBLAorICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BU1MsCiAgICAgLmluaXQgICAgICAgICA9IGFzc19lbmNvZGVfaW5pdCwKICAgICAuZW5jb2RlX3N1YiAgID0gYXNzX2VuY29kZV9mcmFtZSwKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVNTRW5jb2RlQ29udGV4dCksCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Fzdi5oIGIvbGliYXZjb2RlYy9hc3YuaAppbmRleCBlMmNkYzgxLi5hMTM2NmI2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2Fzdi5oCisrKyBiL2xpYmF2Y29kZWMvYXN2LmgKQEAgLTU0LDcgKzU0LDcgQEAKICAgICBpbnQgbWJfaGVpZ2h0OwogICAgIGludCBtYl93aWR0aDI7CiAgICAgaW50IG1iX2hlaWdodDI7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBibG9jaylbNl1bNjRdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50MTZfdCwgYmxvY2spWzZdWzY0XTsKICAgICB1aW50MTZfdCBpbnRyYV9tYXRyaXhbNjRdOwogICAgIGludCBxX2ludHJhX21hdHJpeFs2NF07CiAgICAgdWludDhfdCAqYml0c3RyZWFtX2J1ZmZlcjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXN2ZGVjLmMgYi9saWJhdmNvZGVjL2FzdmRlYy5jCmluZGV4IDAzNmQ1NmUuLjlhMTE0NDYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXN2ZGVjLmMKKysrIGIvbGliYXZjb2RlYy9hc3ZkZWMuYwpAQCAtMTYzLDE5ICsxNjMsMTkgQEAKIAogc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX21iKEFTVjFDb250ZXh0ICphLCBpbnQxNl90IGJsb2NrWzZdWzY0XSkKIHsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgcmV0OwogCiAgICAgYS0+YmRzcC5jbGVhcl9ibG9ja3MoYmxvY2tbMF0pOwogCiAgICAgaWYgKGEtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BU1YxKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhc3YxX2RlY29kZV9ibG9jayhhLCBibG9ja1tpXSkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXN2MV9kZWNvZGVfYmxvY2soYSwgYmxvY2tbaV0pKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhc3YyX2RlY29kZV9ibG9jayhhLCBibG9ja1tpXSkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXN2Ml9kZWNvZGVfYmxvY2soYSwgYmxvY2tbaV0pKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTIxMCw2ICsyMTAsOSBAQAogICAgIEFWRnJhbWUgKmNvbnN0IHAgPSBkYXRhOwogICAgIGludCBtYl94LCBtYl95LCByZXQ7CiAKKyAgICBpZiAoYnVmX3NpemUgKiA4TEwgPCBhLT5tYl9oZWlnaHQgKiBhLT5tYl93aWR0aCAqIDEzTEwpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hc3ZlbmMuYyBiL2xpYmF2Y29kZWMvYXN2ZW5jLmMKaW5kZXggZWM5OGEwYy4uYzRlY2EyYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hc3ZlbmMuYworKysgYi9saWJhdmNvZGVjL2FzdmVuYy5jCkBAIC02MSw3ICs2MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgcHV0X2JpdHMocGIsIGZmX2FzdjJfbGV2ZWxfdGFiWzMxXVsxXSwgZmZfYXN2Ml9sZXZlbF90YWJbMzFdWzBdKTsKICAgICAgICAgaWYgKGxldmVsIDwgLTEyOCB8fCBsZXZlbCA+IDEyNykgewotICAgICAgICAgICAgYXZfbG9nKGEtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNsaXBpbmcgbGV2ZWwgJWQsIGluY3JlYXNlIHFzY2FsZVxuIiwgbGV2ZWwpOworICAgICAgICAgICAgYXZfbG9nKGEtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNsaXBwaW5nIGxldmVsICVkLCBpbmNyZWFzZSBxc2NhbGVcbiIsIGxldmVsKTsKICAgICAgICAgICAgIGxldmVsID0gYXZfY2xpcF9pbnQ4KGxldmVsKTsKICAgICAgICAgfQogICAgICAgICBhc3YyX3B1dF9iaXRzKHBiLCA4LCBsZXZlbCAmIDB4RkYpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdHJhYzMuYyBiL2xpYmF2Y29kZWMvYXRyYWMzLmMKaW5kZXggNGJkYjYzZi4uNmNkY2RmMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hdHJhYzMuYworKysgYi9saWJhdmNvZGVjL2F0cmFjMy5jCkBAIC00OCw4ICs0OCwxMiBAQAogI2luY2x1ZGUgImF0cmFjLmgiCiAjaW5jbHVkZSAiYXRyYWMzZGF0YS5oIgogCisjZGVmaW5lIE1JTl9DSEFOTkVMUyAgICAxCisjZGVmaW5lIE1BWF9DSEFOTkVMUyAgICA4CisjZGVmaW5lIE1BWF9KU19QQUlSUyAgICA4IC8gMgorCiAjZGVmaW5lIEpPSU5UX1NURVJFTyAgICAweDEyCi0jZGVmaW5lIFNURVJFTyAgICAgICAgICAweDIKKyNkZWZpbmUgU0lOR0xFICAgICAgICAgIDB4MgogCiAjZGVmaW5lIFNBTVBMRVNfUEVSX0ZSQU1FIDEwMjQKICNkZWZpbmUgTURDVF9TSVpFICAgICAgICAgIDUxMgpAQCAtOTAsMTAgKzk0LDEwIEBACiAgICAgLy9AfQogICAgIC8vQHsKICAgICAvKiogam9pbnQtc3RlcmVvIHJlbGF0ZWQgdmFyaWFibGVzICovCi0gICAgaW50IG1hdHJpeF9jb2VmZl9pbmRleF9wcmV2WzRdOwotICAgIGludCBtYXRyaXhfY29lZmZfaW5kZXhfbm93WzRdOwotICAgIGludCBtYXRyaXhfY29lZmZfaW5kZXhfbmV4dFs0XTsKLSAgICBpbnQgd2VpZ2h0aW5nX2RlbGF5WzZdOworICAgIGludCBtYXRyaXhfY29lZmZfaW5kZXhfcHJldltNQVhfSlNfUEFJUlNdWzRdOworICAgIGludCBtYXRyaXhfY29lZmZfaW5kZXhfbm93W01BWF9KU19QQUlSU11bNF07CisgICAgaW50IG1hdHJpeF9jb2VmZl9pbmRleF9uZXh0W01BWF9KU19QQUlSU11bNF07CisgICAgaW50IHdlaWdodGluZ19kZWxheVtNQVhfSlNfUEFJUlNdWzZdOwogICAgIC8vQH0KICAgICAvL0B7CiAgICAgLyoqIGRhdGEgYnVmZmVycyAqLwpAQCAtNTY3LDcgKzU3MSw3IEBACiAgKiBAcGFyYW0gc25kICAgICAgICAgICB0aGUgY2hhbm5lbCB1bml0IHRvIGJlIHVzZWQKICAqIEBwYXJhbSBvdXRwdXQgICAgICAgIHRoZSBkZWNvZGVkIHNhbXBsZXMgYmVmb3JlIElRTUYgaW4gZmxvYXQgcmVwcmVzZW50YXRpb24KICAqIEBwYXJhbSBjaGFubmVsX251bSAgIGNoYW5uZWwgbnVtYmVyCi0gKiBAcGFyYW0gY29kaW5nX21vZGUgICB0aGUgY29kaW5nIG1vZGUgKEpPSU5UX1NURVJFTyBvciByZWd1bGFyIHN0ZXJlby9tb25vKQorICogQHBhcmFtIGNvZGluZ19tb2RlICAgdGhlIGNvZGluZyBtb2RlIChKT0lOVF9TVEVSRU8gb3Igc2luZ2xlIGNoYW5uZWxzKQogICovCiBzdGF0aWMgaW50IGRlY29kZV9jaGFubmVsX3NvdW5kX3VuaXQoQVRSQUMzQ29udGV4dCAqcSwgR2V0Qml0Q29udGV4dCAqZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFVuaXQgKnNuZCwgZmxvYXQgKm91dHB1dCwKQEAgLTU3Nyw3ICs1ODEsNyBAQAogICAgIEdhaW5CbG9jayAqZ2FpbjEgPSAmc25kLT5nYWluX2Jsb2NrWyAgICBzbmQtPmdjX2Jsa19zd2l0Y2hdOwogICAgIEdhaW5CbG9jayAqZ2FpbjIgPSAmc25kLT5nYWluX2Jsb2NrWzEgLSBzbmQtPmdjX2Jsa19zd2l0Y2hdOwogCi0gICAgaWYgKGNvZGluZ19tb2RlID09IEpPSU5UX1NURVJFTyAmJiBjaGFubmVsX251bSA9PSAxKSB7CisgICAgaWYgKGNvZGluZ19tb2RlID09IEpPSU5UX1NURVJFTyAmJiAoY2hhbm5lbF9udW0gJSAyKSA9PSAxKSB7CiAgICAgICAgIGlmIChnZXRfYml0cyhnYiwgMikgIT0gMykgewogICAgICAgICAgICAgYXZfbG9nKE5VTEwsQVZfTE9HX0VSUk9SLCJKUyBtb25vIFNvdW5kIFVuaXQgaWQgIT0gMy5cbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC02NDAsNjkgKzY0NCw4NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKipvdXRfc2FtcGxlcykKIHsKICAgICBBVFJBQzNDb250ZXh0ICpxID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBpbnQgcmV0LCBpOworICAgIGludCByZXQsIGksIGNoOwogICAgIHVpbnQ4X3QgKnB0cjE7CiAKICAgICBpZiAocS0+Y29kaW5nX21vZGUgPT0gSk9JTlRfU1RFUkVPKSB7CiAgICAgICAgIC8qIGNoYW5uZWwgY291cGxpbmcgbW9kZSAqLwotICAgICAgICAvKiBkZWNvZGUgU291bmQgVW5pdCAxICovCi0gICAgICAgIGluaXRfZ2V0X2JpdHMoJnEtPmdiLCBkYXRhYnVmLCBhdmN0eC0+YmxvY2tfYWxpZ24gKiA4KTsKIAotICAgICAgICByZXQgPSBkZWNvZGVfY2hhbm5lbF9zb3VuZF91bml0KHEsICZxLT5nYiwgcS0+dW5pdHMsIG91dF9zYW1wbGVzWzBdLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpPSU5UX1NURVJFTyk7Ci0gICAgICAgIGlmIChyZXQgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIC8qIERlY29kZSBzb3VuZCB1bml0IHBhaXJzIChjaGFubmVscyBhcmUgZXhwZWN0ZWQgdG8gYmUgZXZlbikuCisgICAgICAgICAqIE11bHRpY2hhbm5lbCBqb2ludCBzdGVyZW8gaW50ZXJsZWF2ZXMgcGFpcnMgKDZjaDogMmNoICsgMmNoICsgMmNoKSAqLworICAgICAgICBjb25zdCB1aW50OF90ICpqc19kYXRhYnVmOworICAgICAgICBpbnQganNfcGFpciwganNfYmxvY2tfYWxpZ247CiAKLSAgICAgICAgLyogRnJhbWVkYXRhIG9mIHRoZSBzdTIgaW4gdGhlIGpvaW50LXN0ZXJlbyBtb2RlIGlzIGVuY29kZWQgaW4KLSAgICAgICAgICogcmV2ZXJzZSBieXRlIG9yZGVyIHNvIHdlIG5lZWQgdG8gc3dhcCBpdCBmaXJzdC4gKi8KLSAgICAgICAgaWYgKGRhdGFidWYgPT0gcS0+ZGVjb2RlZF9ieXRlc19idWZmZXIpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnB0cjIgPSBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlciArIGF2Y3R4LT5ibG9ja19hbGlnbiAtIDE7Ci0gICAgICAgICAgICBwdHIxICAgICAgICAgID0gcS0+ZGVjb2RlZF9ieXRlc19idWZmZXI7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmJsb2NrX2FsaWduIC8gMjsgaSsrLCBwdHIxKyssIHB0cjItLSkKLSAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgKnB0cjEsICpwdHIyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0cjIgPSBkYXRhYnVmICsgYXZjdHgtPmJsb2NrX2FsaWduIC0gMTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+YmxvY2tfYWxpZ247IGkrKykKLSAgICAgICAgICAgICAgICBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlcltpXSA9ICpwdHIyLS07CisgICAgICAgIGpzX2Jsb2NrX2FsaWduID0gKGF2Y3R4LT5ibG9ja19hbGlnbiAvIGF2Y3R4LT5jaGFubmVscykgKiAyOyAvKiBibG9jayBwYWlyICovCisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYXZjdHgtPmNoYW5uZWxzOyBjaCA9IGNoICsgMikgeworICAgICAgICAgICAganNfcGFpciA9IGNoLzI7CisgICAgICAgICAgICBqc19kYXRhYnVmID0gZGF0YWJ1ZiArIGpzX3BhaXIgKiBqc19ibG9ja19hbGlnbjsgLyogYWxpZ24gdG8gY3VycmVudCBwYWlyICovCisKKyAgICAgICAgICAgIC8qIFNldCB0aGUgYml0c3RyZWFtIHJlYWRlciBhdCB0aGUgc3RhcnQgb2YgZmlyc3QgY2hhbm5lbCBzb3VuZCB1bml0LiAqLworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmcS0+Z2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGpzX2RhdGFidWYsIGpzX2Jsb2NrX2FsaWduICogOCk7CisKKyAgICAgICAgICAgIC8qIGRlY29kZSBTb3VuZCBVbml0IDEgKi8KKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9jaGFubmVsX3NvdW5kX3VuaXQocSwgJnEtPmdiLCAmcS0+dW5pdHNbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfc2FtcGxlc1tjaF0sIGNoLCBKT0lOVF9TVEVSRU8pOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIC8qIEZyYW1lZGF0YSBvZiB0aGUgc3UyIGluIHRoZSBqb2ludC1zdGVyZW8gbW9kZSBpcyBlbmNvZGVkIGluCisgICAgICAgICAgICAgKiByZXZlcnNlIGJ5dGUgb3JkZXIgc28gd2UgbmVlZCB0byBzd2FwIGl0IGZpcnN0LiAqLworICAgICAgICAgICAgaWYgKGpzX2RhdGFidWYgPT0gcS0+ZGVjb2RlZF9ieXRlc19idWZmZXIpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIyID0gcS0+ZGVjb2RlZF9ieXRlc19idWZmZXIgKyBqc19ibG9ja19hbGlnbiAtIDE7CisgICAgICAgICAgICAgICAgcHRyMSAgICAgICAgICA9IHEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqc19ibG9ja19hbGlnbiAvIDI7IGkrKywgcHRyMSsrLCBwdHIyLS0pCisgICAgICAgICAgICAgICAgICAgIEZGU1dBUCh1aW50OF90LCAqcHRyMSwgKnB0cjIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdHIyID0ganNfZGF0YWJ1ZiArIGpzX2Jsb2NrX2FsaWduIC0gMTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwganNfYmxvY2tfYWxpZ247IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcS0+ZGVjb2RlZF9ieXRlc19idWZmZXJbaV0gPSAqcHRyMi0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTa2lwIHRoZSBzeW5jIGNvZGVzICgweEY4KS4gKi8KKyAgICAgICAgICAgIHB0cjEgPSBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlcjsKKyAgICAgICAgICAgIGZvciAoaSA9IDQ7ICpwdHIxID09IDB4Rjg7IGkrKywgcHRyMSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPj0ganNfYmxvY2tfYWxpZ24pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIC8qIHNldCB0aGUgYml0c3RyZWFtIHJlYWRlciBhdCB0aGUgc3RhcnQgb2YgdGhlIHNlY29uZCBTb3VuZCBVbml0ICovCisgICAgICAgICAgICByZXQgPSBpbml0X2dldF9iaXRzOCgmcS0+Z2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIxLCBxLT5kZWNvZGVkX2J5dGVzX2J1ZmZlciArIGpzX2Jsb2NrX2FsaWduIC0gcHRyMSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAvKiBGaWxsIHRoZSBXZWlnaHRpbmcgY29lZmZzIGRlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgbWVtbW92ZShxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl0sICZxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl1bMl0sCisgICAgICAgICAgICAgICAgICAgIDQgKiBzaXplb2YoKnEtPndlaWdodGluZ19kZWxheVtqc19wYWlyXSkpOworICAgICAgICAgICAgcS0+d2VpZ2h0aW5nX2RlbGF5W2pzX3BhaXJdWzRdID0gZ2V0X2JpdHMxKCZxLT5nYik7CisgICAgICAgICAgICBxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl1bNV0gPSBnZXRfYml0cygmcS0+Z2IsIDMpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcS0+bWF0cml4X2NvZWZmX2luZGV4X3ByZXZbanNfcGFpcl1baV0gPSBxLT5tYXRyaXhfY29lZmZfaW5kZXhfbm93W2pzX3BhaXJdW2ldOworICAgICAgICAgICAgICAgIHEtPm1hdHJpeF9jb2VmZl9pbmRleF9ub3dbanNfcGFpcl1baV0gID0gcS0+bWF0cml4X2NvZWZmX2luZGV4X25leHRbanNfcGFpcl1baV07CisgICAgICAgICAgICAgICAgcS0+bWF0cml4X2NvZWZmX2luZGV4X25leHRbanNfcGFpcl1baV0gPSBnZXRfYml0cygmcS0+Z2IsIDIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEZWNvZGUgU291bmQgVW5pdCAyLiAqLworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2NoYW5uZWxfc291bmRfdW5pdChxLCAmcS0+Z2IsICZxLT51bml0c1tjaCsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3NhbXBsZXNbY2grMV0sIGNoKzEsIEpPSU5UX1NURVJFTyk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgLyogUmVjb25zdHJ1Y3QgdGhlIGNoYW5uZWwgY29lZmZpY2llbnRzLiAqLworICAgICAgICAgICAgcmV2ZXJzZV9tYXRyaXhpbmcob3V0X3NhbXBsZXNbY2hdLCBvdXRfc2FtcGxlc1tjaCsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEtPm1hdHJpeF9jb2VmZl9pbmRleF9wcmV2W2pzX3BhaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+bWF0cml4X2NvZWZmX2luZGV4X25vd1tqc19wYWlyXSk7CisKKyAgICAgICAgICAgIGNoYW5uZWxfd2VpZ2h0aW5nKG91dF9zYW1wbGVzW2NoXSwgb3V0X3NhbXBsZXNbY2grMV0sIHEtPndlaWdodGluZ19kZWxheVtqc19wYWlyXSk7CiAgICAgICAgIH0KLQotICAgICAgICAvKiBTa2lwIHRoZSBzeW5jIGNvZGVzICgweEY4KS4gKi8KLSAgICAgICAgcHRyMSA9IHEtPmRlY29kZWRfYnl0ZXNfYnVmZmVyOwotICAgICAgICBmb3IgKGkgPSA0OyAqcHRyMSA9PSAweEY4OyBpKyssIHB0cjErKykgewotICAgICAgICAgICAgaWYgKGkgPj0gYXZjdHgtPmJsb2NrX2FsaWduKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKiBzZXQgdGhlIGJpdHN0cmVhbSByZWFkZXIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBzZWNvbmQgU291bmQgVW5pdCovCi0gICAgICAgIGluaXRfZ2V0X2JpdHM4KCZxLT5nYiwgcHRyMSwgcS0+ZGVjb2RlZF9ieXRlc19idWZmZXIgKyBhdmN0eC0+YmxvY2tfYWxpZ24gLSBwdHIxKTsKLQotICAgICAgICAvKiBGaWxsIHRoZSBXZWlnaHRpbmcgY29lZmZzIGRlbGF5IGJ1ZmZlciAqLwotICAgICAgICBtZW1tb3ZlKHEtPndlaWdodGluZ19kZWxheSwgJnEtPndlaWdodGluZ19kZWxheVsyXSwKLSAgICAgICAgICAgICAgICA0ICogc2l6ZW9mKCpxLT53ZWlnaHRpbmdfZGVsYXkpKTsKLSAgICAgICAgcS0+d2VpZ2h0aW5nX2RlbGF5WzRdID0gZ2V0X2JpdHMxKCZxLT5nYik7Ci0gICAgICAgIHEtPndlaWdodGluZ19kZWxheVs1XSA9IGdldF9iaXRzKCZxLT5nYiwgMyk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgcS0+bWF0cml4X2NvZWZmX2luZGV4X3ByZXZbaV0gPSBxLT5tYXRyaXhfY29lZmZfaW5kZXhfbm93W2ldOwotICAgICAgICAgICAgcS0+bWF0cml4X2NvZWZmX2luZGV4X25vd1tpXSAgPSBxLT5tYXRyaXhfY29lZmZfaW5kZXhfbmV4dFtpXTsKLSAgICAgICAgICAgIHEtPm1hdHJpeF9jb2VmZl9pbmRleF9uZXh0W2ldID0gZ2V0X2JpdHMoJnEtPmdiLCAyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlY29kZSBTb3VuZCBVbml0IDIuICovCi0gICAgICAgIHJldCA9IGRlY29kZV9jaGFubmVsX3NvdW5kX3VuaXQocSwgJnEtPmdiLCAmcS0+dW5pdHNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3NhbXBsZXNbMV0sIDEsIEpPSU5UX1NURVJFTyk7Ci0gICAgICAgIGlmIChyZXQgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgLyogUmVjb25zdHJ1Y3QgdGhlIGNoYW5uZWwgY29lZmZpY2llbnRzLiAqLwotICAgICAgICByZXZlcnNlX21hdHJpeGluZyhvdXRfc2FtcGxlc1swXSwgb3V0X3NhbXBsZXNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHEtPm1hdHJpeF9jb2VmZl9pbmRleF9wcmV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5tYXRyaXhfY29lZmZfaW5kZXhfbm93KTsKLQotICAgICAgICBjaGFubmVsX3dlaWdodGluZyhvdXRfc2FtcGxlc1swXSwgb3V0X3NhbXBsZXNbMV0sIHEtPndlaWdodGluZ19kZWxheSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgLyogbm9ybWFsIHN0ZXJlbyBtb2RlIG9yIG1vbm8gKi8KKyAgICAgICAgLyogc2luZ2xlIGNoYW5uZWxzICovCiAgICAgICAgIC8qIERlY29kZSB0aGUgY2hhbm5lbCBzb3VuZCB1bml0cy4gKi8KICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICAvKiBTZXQgdGhlIGJpdHN0cmVhbSByZWFkZXIgYXQgdGhlIHN0YXJ0IG9mIGEgY2hhbm5lbCBzb3VuZCB1bml0LiAqLwpAQCAtNzMxLDYgKzc1Myw0MCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGFsX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGFidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgZmxvYXQgKipvdXRfc2FtcGxlcykKK3sKKyAgICBBVFJBQzNDb250ZXh0ICpxID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpOworCisgICAgLyogU2V0IHRoZSBiaXRzdHJlYW0gcmVhZGVyIGF0IHRoZSBzdGFydCBvZiBhIGNoYW5uZWwgc291bmQgdW5pdC4gKi8KKyAgICBpbml0X2dldF9iaXRzKCZxLT5nYiwgZGF0YWJ1Ziwgc2l6ZSAqIDgpOworICAgIC8qIHNpbmdsZSBjaGFubmVscyAqLworICAgIC8qIERlY29kZSB0aGUgY2hhbm5lbCBzb3VuZCB1bml0cy4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gZGVjb2RlX2NoYW5uZWxfc291bmRfdW5pdChxLCAmcS0+Z2IsICZxLT51bml0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfc2FtcGxlc1tpXSwgaSwgcS0+Y29kaW5nX21vZGUpOworICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB3aGlsZSAoaSA8IGF2Y3R4LT5jaGFubmVscyAmJiBnZXRfYml0c19sZWZ0KCZxLT5nYikgPiA2ICYmIHNob3dfYml0cygmcS0+Z2IsIDYpICE9IDB4MjgpIHsKKyAgICAgICAgICAgIHNraXBfYml0cygmcS0+Z2IsIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQXBwbHkgdGhlIGlRTUYgc3ludGhlc2lzIGZpbHRlci4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgZmxvYXQgKnAxID0gb3V0X3NhbXBsZXNbaV07CisgICAgICAgIGZsb2F0ICpwMiA9IHAxICsgMjU2OworICAgICAgICBmbG9hdCAqcDMgPSBwMiArIDI1NjsKKyAgICAgICAgZmxvYXQgKnA0ID0gcDMgKyAyNTY7CisgICAgICAgIGZmX2F0cmFjX2lxbWYocDEsIHAyLCAyNTYsIHAxLCBxLT51bml0c1tpXS5kZWxheV9idWYxLCBxLT50ZW1wX2J1Zik7CisgICAgICAgIGZmX2F0cmFjX2lxbWYocDQsIHAzLCAyNTYsIHAzLCBxLT51bml0c1tpXS5kZWxheV9idWYyLCBxLT50ZW1wX2J1Zik7CisgICAgICAgIGZmX2F0cmFjX2lxbWYocDEsIHAzLCA1MTIsIHAxLCBxLT51bml0c1tpXS5kZWxheV9idWYzLCBxLT50ZW1wX2J1Zik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgYXRyYWMzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCiB7CkBAIC03NjIsNyArODE4LDcgQEAKIAogICAgIHJldCA9IGRlY29kZV9mcmFtZShhdmN0eCwgZGF0YWJ1ZiwgKGZsb2F0ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhKTsKICAgICBpZiAocmV0KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGcmFtZSBkZWNvZGluZyBlcnJvciFcbiIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZyYW1lIGRlY29kaW5nIGVycm9yIVxuIik7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCkBAIC03NzEsNiArODI3LDI4IEBACiAgICAgcmV0dXJuIGF2Y3R4LT5ibG9ja19hbGlnbjsKIH0KIAorc3RhdGljIGludCBhdHJhYzNhbF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGludCByZXQ7CisKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IFNBTVBMRVNfUEVSX0ZSQU1FOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBhbF9kZWNvZGVfZnJhbWUoYXZjdHgsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgZGVjb2RpbmcgZXJyb3IhXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKIHN0YXRpYyBhdl9jb2xkIHZvaWQgYXRyYWMzX2luaXRfc3RhdGljX2RhdGEodm9pZCkKIHsKICAgICBpbnQgaTsKQEAgLTc5MiwxMiArODcwLDEyIEBACiBzdGF0aWMgYXZfY29sZCBpbnQgYXRyYWMzX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBzdGF0aWMgaW50IHN0YXRpY19pbml0X2RvbmU7Ci0gICAgaW50IGksIHJldDsKKyAgICBpbnQgaSwganNfcGFpciwgcmV0OwogICAgIGludCB2ZXJzaW9uLCBkZWxheSwgc2FtcGxlc19wZXJfZnJhbWUsIGZyYW1lX2ZhY3RvcjsKICAgICBjb25zdCB1aW50OF90ICplZGF0YV9wdHIgPSBhdmN0eC0+ZXh0cmFkYXRhOwogICAgIEFUUkFDM0NvbnRleHQgKnEgPSBhdmN0eC0+cHJpdl9kYXRhOwogCi0gICAgaWYgKGF2Y3R4LT5jaGFubmVscyA8PSAwIHx8IGF2Y3R4LT5jaGFubmVscyA+IDIpIHsKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgTUlOX0NIQU5ORUxTIHx8IGF2Y3R4LT5jaGFubmVscyA+IE1BWF9DSEFOTkVMUykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNoYW5uZWwgY29uZmlndXJhdGlvbiBlcnJvciFcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KQEAgLTgwNyw3ICs4ODUsMTIgQEAKICAgICBzdGF0aWNfaW5pdF9kb25lID0gMTsKIAogICAgIC8qIFRha2UgY2FyZSBvZiB0aGUgY29kZWMtc3BlY2lmaWMgZXh0cmFkYXRhLiAqLwotICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPT0gMTQpIHsKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FUUkFDM0FMKSB7CisgICAgICAgIHZlcnNpb24gICAgICAgICAgID0gNDsKKyAgICAgICAgc2FtcGxlc19wZXJfZnJhbWUgPSBTQU1QTEVTX1BFUl9GUkFNRSAqIGF2Y3R4LT5jaGFubmVsczsKKyAgICAgICAgZGVsYXkgICAgICAgICAgICAgPSAweDg4RTsKKyAgICAgICAgcS0+Y29kaW5nX21vZGUgICAgPSBTSU5HTEU7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPT0gMTQpIHsKICAgICAgICAgLyogUGFyc2UgdGhlIGV4dHJhZGF0YSwgV0FWIGZvcm1hdCAqLwogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlswLTFdICVkXG4iLAogICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9nZXRfbGUxNigmZWRhdGFfcHRyKSk7ICAvLyBVbmtub3duIHZhbHVlIGFsd2F5cyAxCkBAIC04MjMsNyArOTA2LDcgQEAKICAgICAgICAgc2FtcGxlc19wZXJfZnJhbWUgICAgPSBTQU1QTEVTX1BFUl9GUkFNRSAqIGF2Y3R4LT5jaGFubmVsczsKICAgICAgICAgdmVyc2lvbiAgICAgICAgICAgICAgPSA0OwogICAgICAgICBkZWxheSAgICAgICAgICAgICAgICA9IDB4ODhFOwotICAgICAgICBxLT5jb2RpbmdfbW9kZSAgICAgICA9IHEtPmNvZGluZ19tb2RlID8gSk9JTlRfU1RFUkVPIDogU1RFUkVPOworICAgICAgICBxLT5jb2RpbmdfbW9kZSAgICAgICA9IHEtPmNvZGluZ19tb2RlID8gSk9JTlRfU1RFUkVPIDogU0lOR0xFOwogICAgICAgICBxLT5zY3JhbWJsZWRfc3RyZWFtICA9IDA7CiAKICAgICAgICAgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiAhPSAgOTYgKiBhdmN0eC0+Y2hhbm5lbHMgKiBmcmFtZV9mYWN0b3IgJiYKQEAgLTg0Myw3ICs5MjYsNyBAQAogICAgICAgICBxLT5zY3JhbWJsZWRfc3RyZWFtICAgID0gMTsKIAogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGV4dHJhZGF0YSBzaXplICVkLlxuIiwKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGV4dHJhZGF0YSBzaXplICVkLlxuIiwKICAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQpAQCAtODU1LDggKzkzOCw3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGlmIChzYW1wbGVzX3Blcl9mcmFtZSAhPSBTQU1QTEVTX1BFUl9GUkFNRSAmJgotICAgICAgICBzYW1wbGVzX3Blcl9mcmFtZSAhPSBTQU1QTEVTX1BFUl9GUkFNRSAqIDIpIHsKKyAgICBpZiAoc2FtcGxlc19wZXJfZnJhbWUgIT0gU0FNUExFU19QRVJfRlJBTUUgKiBhdmN0eC0+Y2hhbm5lbHMpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGFtb3VudCBvZiBzYW1wbGVzIHBlciBmcmFtZSAlZC5cbiIsCiAgICAgICAgICAgICAgICBzYW1wbGVzX3Blcl9mcmFtZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtODY4LDExICs5NTAsMTEgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKHEtPmNvZGluZ19tb2RlID09IFNURVJFTykKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJOb3JtYWwgc3RlcmVvIGRldGVjdGVkLlxuIik7CisgICAgaWYgKHEtPmNvZGluZ19tb2RlID09IFNJTkdMRSkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJTaW5nbGUgY2hhbm5lbHMgZGV0ZWN0ZWQuXG4iKTsKICAgICBlbHNlIGlmIChxLT5jb2RpbmdfbW9kZSA9PSBKT0lOVF9TVEVSRU8pIHsKLSAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyAhPSAyKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29kaW5nIG1vZGVcbiIpOworICAgICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzICUgMiA9PSAxKSB7IC8qIEpvaW50IHN0ZXJlbyBjaGFubmVscyBtdXN0IGJlIGV2ZW4gKi8KKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBqb2ludCBzdGVyZW8gY2hhbm5lbCBjb25maWd1cmF0aW9uLlxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkpvaW50IHN0ZXJlbyBkZXRlY3RlZC5cbiIpOwpAQCAtOTAwLDE3ICs5ODIsMTkgQEAKICAgICB9CiAKICAgICAvKiBpbml0IHRoZSBqb2ludC1zdGVyZW8gZGVjb2RpbmcgZGF0YSAqLwotICAgIHEtPndlaWdodGluZ19kZWxheVswXSA9IDA7Ci0gICAgcS0+d2VpZ2h0aW5nX2RlbGF5WzFdID0gNzsKLSAgICBxLT53ZWlnaHRpbmdfZGVsYXlbMl0gPSAwOwotICAgIHEtPndlaWdodGluZ19kZWxheVszXSA9IDc7Ci0gICAgcS0+d2VpZ2h0aW5nX2RlbGF5WzRdID0gMDsKLSAgICBxLT53ZWlnaHRpbmdfZGVsYXlbNV0gPSA3OworICAgIGZvciAoanNfcGFpciA9IDA7IGpzX3BhaXIgPCBNQVhfSlNfUEFJUlM7IGpzX3BhaXIrKykgeworICAgICAgICBxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl1bMF0gPSAwOworICAgICAgICBxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl1bMV0gPSA3OworICAgICAgICBxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl1bMl0gPSAwOworICAgICAgICBxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl1bM10gPSA3OworICAgICAgICBxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl1bNF0gPSAwOworICAgICAgICBxLT53ZWlnaHRpbmdfZGVsYXlbanNfcGFpcl1bNV0gPSA3OwogCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICBxLT5tYXRyaXhfY29lZmZfaW5kZXhfcHJldltpXSA9IDM7Ci0gICAgICAgIHEtPm1hdHJpeF9jb2VmZl9pbmRleF9ub3dbaV0gID0gMzsKLSAgICAgICAgcS0+bWF0cml4X2NvZWZmX2luZGV4X25leHRbaV0gPSAzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBxLT5tYXRyaXhfY29lZmZfaW5kZXhfcHJldltqc19wYWlyXVtpXSA9IDM7CisgICAgICAgICAgICBxLT5tYXRyaXhfY29lZmZfaW5kZXhfbm93W2pzX3BhaXJdW2ldICA9IDM7CisgICAgICAgICAgICBxLT5tYXRyaXhfY29lZmZfaW5kZXhfbmV4dFtqc19wYWlyXVtpXSA9IDM7CisgICAgICAgIH0KICAgICB9CiAKICAgICBmZl9hdHJhY19pbml0X2dhaW5fY29tcGVuc2F0aW9uKCZxLT5nYWluY19jdHgsIDQsIDMpOwpAQCAtOTM4LDMgKzEwMjIsMTcgQEAKICAgICAuc2FtcGxlX2ZtdHMgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKIH07CisKK0FWQ29kZWMgZmZfYXRyYWMzYWxfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJhdHJhYzNhbCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVRSQUMzIEFMIChBZGFwdGl2ZSBUUmFuc2Zvcm0gQWNvdXN0aWMgQ29kaW5nIDMgQWR2YW5jZWQgTG9zc2xlc3MpIiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BVFJBQzNBTCwKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihBVFJBQzNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IGF0cmFjM19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGF0cmFjM19kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBhdHJhYzNhbF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBBVl9DT0RFQ19DQVBfU1VCRlJBTUVTIHwgQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2F0cmFjM3BsdXMuYyBiL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5jCmluZGV4IDQ2ZTBiZWEuLjNlM2JiYTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5jCisrKyBiL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5jCkBAIC0xMDksOCArMTA5LDggQEAKICAgICAgICAgTlVMTCwgTlVMTCwgYXRyYWMzcF9jdF9odWZmX3hsYXQxLCBOVUxMCiAgICAgfTsKIAotICAgIHN0YXRpYyBjb25zdCAgaW50IHNmX25iX2JpdHNbOF0gID0geyAgOSwgIDksICA5LCAgOSwgIDYsICA2LCAgNywgIDcgfTsKLSAgICBzdGF0aWMgY29uc3QgIGludCBzZl9uYl9jb2Rlc1s4XSA9IHsgNjQsIDY0LCA2NCwgNjQsIDE2LCAxNiwgMTYsIDE2IH07CisgICAgc3RhdGljIGNvbnN0IGludCBzZl9uYl9iaXRzWzhdICA9IHsgIDksICA5LCAgOSwgIDksICA2LCAgNiwgIDcsICA3IH07CisgICAgc3RhdGljIGNvbnN0IGludCBzZl9uYl9jb2Rlc1s4XSA9IHsgNjQsIDY0LCA2NCwgNjQsIDE2LCAxNiwgMTYsIDE2IH07CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgICogY29uc3Qgc2ZfYml0c1s4XSAgPSB7CiAgICAgICAgIGF0cmFjM3Bfc2ZfaHVmZl9iaXRzMSwgYXRyYWMzcF9zZl9odWZmX2JpdHMxLCBhdHJhYzNwX3NmX2h1ZmZfYml0czIsCiAgICAgICAgIGF0cmFjM3Bfc2ZfaHVmZl9iaXRzMywgYXRyYWMzcF9zZl9odWZmX2JpdHM0LCBhdHJhYzNwX3NmX2h1ZmZfYml0czQsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2F0cmFjM3BsdXMuaCBiL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5oCmluZGV4IGEzM2MzOGEuLjNjMzllMjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5oCisrKyBiL2xpYmF2Y29kZWMvYXRyYWMzcGx1cy5oCkBAIC0xOTksMTMgKzE5OSwxNCBAQAogICogUGVyZm9ybSBwb3dlciBjb21wZW5zYXRpb24gYWthIG5vaXNlIGRpdGhlcmluZy4KICAqCiAgKiBAcGFyYW1baW5dICAgICAgY3R4ICAgICAgICAgcHRyIHRvIHRoZSBjaGFubmVsIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gICAgICBmZHNwICAgICAgICBwb2ludGVyIHRvIGZsb2F0IERTUCBjb250ZXh0CiAgKiBAcGFyYW1baW5dICAgICAgY2hfaW5kZXggICAgd2hpY2ggY2hhbm5lbCB0byBwcm9jZXNzCiAgKiBAcGFyYW1baW4sb3V0XSAgc3AgICAgICAgICAgcHRyIHRvIGNoYW5uZWwgc3BlY3RydW0gdG8gcHJvY2VzcwogICogQHBhcmFtW2luXSAgICAgIHJuZ19pbmRleCAgIGluZGljYXRlcyB3aGljaCBSTkcgdGFibGUgdG8gdXNlCiAgKiBAcGFyYW1baW5dICAgICAgc2JfbnVtICAgICAgd2hpY2ggc3ViYmFuZCB0byBwcm9jZXNzCiAgKi8KLXZvaWQgZmZfYXRyYWMzcF9wb3dlcl9jb21wZW5zYXRpb24oQXRyYWMzcENoYW5Vbml0Q3R4ICpjdHgsIGludCBjaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnNwLCBpbnQgcm5nX2luZGV4LCBpbnQgc2JfbnVtKTsKK3ZvaWQgZmZfYXRyYWMzcF9wb3dlcl9jb21wZW5zYXRpb24oQXRyYWMzcENoYW5Vbml0Q3R4ICpjdHgsIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hfaW5kZXgsIGZsb2F0ICpzcCwgaW50IHJuZ19pbmRleCwgaW50IHNiX251bSk7CiAKIC8qKgogICogUmVndWxhciBJTURDVCBhbmQgd2luZG93aW5nIHdpdGhvdXQgb3ZlcmxhcHBpbmcsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2F0cmFjM3BsdXNkZWMuYyBiL2xpYmF2Y29kZWMvYXRyYWMzcGx1c2RlYy5jCmluZGV4IGVjMmIxYWQuLjY2NmQxYTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXRyYWMzcGx1c2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvYXRyYWMzcGx1c2RlYy5jCkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZGVjb2RlX3Jlc2lkdWFsX3NwZWN0cnVtKEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LAorc3RhdGljIHZvaWQgZGVjb2RlX3Jlc2lkdWFsX3NwZWN0cnVtKEFUUkFDM1BDb250ZXh0ICpjdHgsIEF0cmFjM3BDaGFuVW5pdEN0eCAqY2hfdW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvdXRbMl1bQVRSQUMzUF9GUkFNRV9TQU1QTEVTXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKQEAgLTIwOSwxNyArMjA5LDE3IEBACiAgICAgLyogY2FsY3VsYXRlIFJORyB0YWJsZSBpbmRleCBmb3IgZWFjaCBzdWJiYW5kICovCiAgICAgaW50IHNiX1JOR19pbmRleFtBVFJBQzNQX1NVQkJBTkRTXSA9IHsgMCB9OwogCi0gICAgaWYgKGN0eC0+bXV0ZV9mbGFnKSB7CisgICAgaWYgKGNoX3VuaXQtPm11dGVfZmxhZykgewogICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBudW1fY2hhbm5lbHM7IGNoKyspCiAgICAgICAgICAgICBtZW1zZXQob3V0W2NoXSwgMCwgQVRSQUMzUF9GUkFNRV9TQU1QTEVTICogc2l6ZW9mKCpvdXRbY2hdKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBmb3IgKHF1ID0gMCwgUk5HX2luZGV4ID0gMDsgcXUgPCBjdHgtPnVzZWRfcXVhbnRfdW5pdHM7IHF1KyspCi0gICAgICAgIFJOR19pbmRleCArPSBjdHgtPmNoYW5uZWxzWzBdLnF1X3NmX2lkeFtxdV0gKwotICAgICAgICAgICAgICAgICAgICAgY3R4LT5jaGFubmVsc1sxXS5xdV9zZl9pZHhbcXVdOworICAgIGZvciAocXUgPSAwLCBSTkdfaW5kZXggPSAwOyBxdSA8IGNoX3VuaXQtPnVzZWRfcXVhbnRfdW5pdHM7IHF1KyspCisgICAgICAgIFJOR19pbmRleCArPSBjaF91bml0LT5jaGFubmVsc1swXS5xdV9zZl9pZHhbcXVdICsKKyAgICAgICAgICAgICAgICAgICAgIGNoX3VuaXQtPmNoYW5uZWxzWzFdLnF1X3NmX2lkeFtxdV07CiAKLSAgICBmb3IgKHNiID0gMDsgc2IgPCBjdHgtPm51bV9jb2RlZF9zdWJiYW5kczsgc2IrKywgUk5HX2luZGV4ICs9IDEyOCkKKyAgICBmb3IgKHNiID0gMDsgc2IgPCBjaF91bml0LT5udW1fY29kZWRfc3ViYmFuZHM7IHNiKyssIFJOR19pbmRleCArPSAxMjgpCiAgICAgICAgIHNiX1JOR19pbmRleFtzYl0gPSBSTkdfaW5kZXggJiAweDNGQzsKIAogICAgIC8qIGludmVyc2UgcXVhbnQgYW5kIHBvd2VyIGNvbXBlbnNhdGlvbiAqLwpAQCAtMjI3LDM1ICsyMjcsMzUgQEAKICAgICAgICAgLyogY2xlYXIgY2hhbm5lbCdzIHJlc2lkdWFsIHNwZWN0cnVtICovCiAgICAgICAgIG1lbXNldChvdXRbY2hdLCAwLCBBVFJBQzNQX0ZSQU1FX1NBTVBMRVMgKiBzaXplb2YoKm91dFtjaF0pKTsKIAotICAgICAgICBmb3IgKHF1ID0gMDsgcXUgPCBjdHgtPnVzZWRfcXVhbnRfdW5pdHM7IHF1KyspIHsKLSAgICAgICAgICAgIHNyYyAgICAgICAgPSAmY3R4LT5jaGFubmVsc1tjaF0uc3BlY3RydW1bZmZfYXRyYWMzcF9xdV90b19zcGVjX3Bvc1txdV1dOworICAgICAgICBmb3IgKHF1ID0gMDsgcXUgPCBjaF91bml0LT51c2VkX3F1YW50X3VuaXRzOyBxdSsrKSB7CisgICAgICAgICAgICBzcmMgICAgICAgID0gJmNoX3VuaXQtPmNoYW5uZWxzW2NoXS5zcGVjdHJ1bVtmZl9hdHJhYzNwX3F1X3RvX3NwZWNfcG9zW3F1XV07CiAgICAgICAgICAgICBkc3QgICAgICAgID0gJm91dFtjaF1bZmZfYXRyYWMzcF9xdV90b19zcGVjX3Bvc1txdV1dOwogICAgICAgICAgICAgbnNwZWNsaW5lcyA9IGZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXUgKyAxXSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfYXRyYWMzcF9xdV90b19zcGVjX3Bvc1txdV07CiAKLSAgICAgICAgICAgIGlmIChjdHgtPmNoYW5uZWxzW2NoXS5xdV93b3JkbGVuW3F1XSA+IDApIHsKLSAgICAgICAgICAgICAgICBxID0gZmZfYXRyYWMzcF9zZl90YWJbY3R4LT5jaGFubmVsc1tjaF0ucXVfc2ZfaWR4W3F1XV0gKgotICAgICAgICAgICAgICAgICAgICBmZl9hdHJhYzNwX21hbnRfdGFiW2N0eC0+Y2hhbm5lbHNbY2hdLnF1X3dvcmRsZW5bcXVdXTsKKyAgICAgICAgICAgIGlmIChjaF91bml0LT5jaGFubmVsc1tjaF0ucXVfd29yZGxlbltxdV0gPiAwKSB7CisgICAgICAgICAgICAgICAgcSA9IGZmX2F0cmFjM3Bfc2ZfdGFiW2NoX3VuaXQtPmNoYW5uZWxzW2NoXS5xdV9zZl9pZHhbcXVdXSAqCisgICAgICAgICAgICAgICAgICAgIGZmX2F0cmFjM3BfbWFudF90YWJbY2hfdW5pdC0+Y2hhbm5lbHNbY2hdLnF1X3dvcmRsZW5bcXVdXTsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnNwZWNsaW5lczsgaSsrKQogICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSBzcmNbaV0gKiBxOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY3R4LT5udW1fY29kZWRfc3ViYmFuZHM7IHNiKyspCi0gICAgICAgICAgICBmZl9hdHJhYzNwX3Bvd2VyX2NvbXBlbnNhdGlvbihjdHgsIGNoLCAmb3V0W2NoXVswXSwKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY2hfdW5pdC0+bnVtX2NvZGVkX3N1YmJhbmRzOyBzYisrKQorICAgICAgICAgICAgZmZfYXRyYWMzcF9wb3dlcl9jb21wZW5zYXRpb24oY2hfdW5pdCwgY3R4LT5mZHNwLCBjaCwgJm91dFtjaF1bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYl9STkdfaW5kZXhbc2JdLCBzYik7CiAgICAgfQogCi0gICAgaWYgKGN0eC0+dW5pdF90eXBlID09IENIX1VOSVRfU1RFUkVPKSB7Ci0gICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGN0eC0+bnVtX2NvZGVkX3N1YmJhbmRzOyBzYisrKSB7Ci0gICAgICAgICAgICBpZiAoY3R4LT5zd2FwX2NoYW5uZWxzW3NiXSkgeworICAgIGlmIChjaF91bml0LT51bml0X3R5cGUgPT0gQ0hfVU5JVF9TVEVSRU8pIHsKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgY2hfdW5pdC0+bnVtX2NvZGVkX3N1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICBpZiAoY2hfdW5pdC0+c3dhcF9jaGFubmVsc1tzYl0pIHsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQVRSQUMzUF9TVUJCQU5EX1NBTVBMRVM7IGkrKykKICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKGZsb2F0LCBvdXRbMF1bc2IgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUyArIGldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFsxXVtzYiAqIEFUUkFDM1BfU1VCQkFORF9TQU1QTEVTICsgaV0pOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBmbGlwIGNvZWZmaWNpZW50cycgc2lnbiBpZiByZXF1ZXN0ZWQgKi8KLSAgICAgICAgICAgIGlmIChjdHgtPm5lZ2F0ZV9jb2VmZnNbc2JdKQorICAgICAgICAgICAgaWYgKGNoX3VuaXQtPm5lZ2F0ZV9jb2VmZnNbc2JdKQogICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUzsgaSsrKQogICAgICAgICAgICAgICAgICAgICBvdXRbMV1bc2IgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUyArIGldID0gLShvdXRbMV1bc2IgKiBBVFJBQzNQX1NVQkJBTkRfU0FNUExFUyArIGldKTsKICAgICAgICAgfQpAQCAtMzY5LDcgKzM2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4KSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICBkZWNvZGVfcmVzaWR1YWxfc3BlY3RydW0oJmN0eC0+Y2hfdW5pdHNbY2hfYmxvY2tdLCBjdHgtPnNhbXBsZXMsCisgICAgICAgIGRlY29kZV9yZXNpZHVhbF9zcGVjdHJ1bShjdHgsICZjdHgtPmNoX3VuaXRzW2NoX2Jsb2NrXSwgY3R4LT5zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNfdG9fcHJvY2VzcywgYXZjdHgpOwogICAgICAgICByZWNvbnN0cnVjdF9mcmFtZShjdHgsICZjdHgtPmNoX3VuaXRzW2NoX2Jsb2NrXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNfdG9fcHJvY2VzcywgYXZjdHgpOwpAQCAtMzg0LDcgKzM4NCw3IEBACiAKICAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CiAKLSAgICByZXR1cm4gRkZNSU4oYXZjdHgtPmJsb2NrX2FsaWduLCBhdnBrdC0+c2l6ZSk7CisgICAgcmV0dXJuIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BVFJBQzNQID8gRkZNSU4oYXZjdHgtPmJsb2NrX2FsaWduLCBhdnBrdC0+c2l6ZSkgOiBhdnBrdC0+c2l6ZTsKIH0KIAogQVZDb2RlYyBmZl9hdHJhYzNwX2RlY29kZXIgPSB7CkBAIC0zOTgsMyArMzk4LDE1IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gYXRyYWMzcF9kZWNvZGVfY2xvc2UsCiAgICAgLmRlY29kZSAgICAgICAgID0gYXRyYWMzcF9kZWNvZGVfZnJhbWUsCiB9OworCitBVkNvZGVjIGZmX2F0cmFjM3BhbF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhdHJhYzNwbHVzYWwiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVFJBQzMrIEFMIChBZGFwdGl2ZSBUUmFuc2Zvcm0gQWNvdXN0aWMgQ29kaW5nIDMrIEFkdmFuY2VkIExvc3NsZXNzKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BVFJBQzNQQUwsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVRSQUMzUENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGF0cmFjM3BfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gYXRyYWMzcF9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0gYXRyYWMzcF9kZWNvZGVfZnJhbWUsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdHJhYzNwbHVzZHNwLmMgYi9saWJhdmNvZGVjL2F0cmFjM3BsdXNkc3AuYwppbmRleCBkMDg5NTg4Li45NmFhNDAyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2F0cmFjM3BsdXNkc3AuYworKysgYi9saWJhdmNvZGVjL2F0cmFjM3BsdXNkc3AuYwpAQCAtNDE1LDExICs0MTUsMTIgQEAKICAgICAwLCA4LCAxMiwgMTYsIDE4LCAyMCwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyCiB9OwogCi12b2lkIGZmX2F0cmFjM3BfcG93ZXJfY29tcGVuc2F0aW9uKEF0cmFjM3BDaGFuVW5pdEN0eCAqY3R4LCBpbnQgY2hfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzcCwgaW50IHJuZ19pbmRleCwgaW50IHNiKQordm9pZCBmZl9hdHJhYzNwX3Bvd2VyX2NvbXBlbnNhdGlvbihBdHJhYzNwQ2hhblVuaXRDdHggKmN0eCwgQVZGbG9hdERTUENvbnRleHQgKmZkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaF9pbmRleCwgZmxvYXQgKnNwLCBpbnQgcm5nX2luZGV4LCBpbnQgc2IpCiB7CiAgICAgQXRyYWNHYWluSW5mbyAqZzEsICpnMjsKLSAgICBmbG9hdCBwd2NzcFtBVFJBQzNQX1NVQkJBTkRfU0FNUExFU10sICpkc3QsIGdycF9sZXYsIHF1X2xldjsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGZsb2F0LCBwd2NzcCwgW0FUUkFDM1BfU1VCQkFORF9TQU1QTEVTXSk7CisgICAgZmxvYXQgKmRzdCwgZ3JwX2xldiwgcXVfbGV2OwogICAgIGludCBpLCBnYWluX2xldiwgZ2N2ID0gMCwgcXUsIG5zcDsKICAgICBpbnQgc3dhcF9jaCA9IChjdHgtPnVuaXRfdHlwZSA9PSBDSF9VTklUX1NURVJFTyAmJiBjdHgtPnN3YXBfY2hhbm5lbHNbc2JdKSA/IDEgOiAwOwogCkBAIC00NTYsOCArNDU3LDcgQEAKICAgICAgICAgZHN0ID0gJnNwW2ZmX2F0cmFjM3BfcXVfdG9fc3BlY19wb3NbcXVdXTsKICAgICAgICAgbnNwID0gZmZfYXRyYWMzcF9xdV90b19zcGVjX3Bvc1txdSArIDFdIC0gZmZfYXRyYWMzcF9xdV90b19zcGVjX3Bvc1txdV07CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG5zcDsgaSsrKQotICAgICAgICAgICAgZHN0W2ldICs9IHB3Y3NwW2ldICogcXVfbGV2OworICAgICAgICBmZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIoZHN0LCBwd2NzcCwgcXVfbGV2LCBuc3ApOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdWRpb2NvbnZlcnQuYyBiL2xpYmF2Y29kZWMvYXVkaW9jb252ZXJ0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNDZmYWUuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9hdWRpb2NvbnZlcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogYXVkaW8gY29udmVyc2lvbgotICogQ29weXJpZ2h0IChjKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLS8qKgotICogQGZpbGUKLSAqIGF1ZGlvIGNvbnZlcnNpb24KLSAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KLSAqLwotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJhdWRpb2NvbnZlcnQuaCIKLQotI2lmIEZGX0FQSV9BVURJT19DT05WRVJUCi0KLXN0cnVjdCBBVkF1ZGlvQ29udmVydCB7Ci0gICAgaW50IGluX2NoYW5uZWxzLCBvdXRfY2hhbm5lbHM7Ci0gICAgaW50IGZtdF9wYWlyOwotfTsKLQotQVZBdWRpb0NvbnZlcnQgKmF2X2F1ZGlvX2NvbnZlcnRfYWxsb2MoZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10LCBpbnQgb3V0X2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9mbXQsIGludCBpbl9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICptYXRyaXgsIGludCBmbGFncykKLXsKLSAgICBBVkF1ZGlvQ29udmVydCAqY3R4OwotICAgIGlmIChpbl9jaGFubmVscyE9b3V0X2NoYW5uZWxzKQotICAgICAgICByZXR1cm4gTlVMTDsgIC8qIEZJWE1FOiBub3Qgc3VwcG9ydGVkICovCi0gICAgY3R4ID0gYXZfbWFsbG9jKHNpemVvZihBVkF1ZGlvQ29udmVydCkpOwotICAgIGlmICghY3R4KQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBjdHgtPmluX2NoYW5uZWxzID0gaW5fY2hhbm5lbHM7Ci0gICAgY3R4LT5vdXRfY2hhbm5lbHMgPSBvdXRfY2hhbm5lbHM7Ci0gICAgY3R4LT5mbXRfcGFpciA9IG91dF9mbXQgKyBBVl9TQU1QTEVfRk1UX05CKmluX2ZtdDsKLSAgICByZXR1cm4gY3R4OwotfQotCi12b2lkIGF2X2F1ZGlvX2NvbnZlcnRfZnJlZShBVkF1ZGlvQ29udmVydCAqY3R4KQotewotICAgIGF2X2ZyZWUoY3R4KTsKLX0KLQotaW50IGF2X2F1ZGlvX2NvbnZlcnQoQVZBdWRpb0NvbnZlcnQgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBjb25zdCBvdXRbNl0sIGNvbnN0IGludCBvdXRfc3RyaWRlWzZdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIGNvbnN0ICBpbls2XSwgY29uc3QgaW50ICBpbl9zdHJpZGVbNl0sIGludCBsZW4pCi17Ci0gICAgaW50IGNoOwotCi0gICAgLy9GSVhNRSBvcHRpbWl6ZSBjb21tb24gY2FzZXMKLQotICAgIGZvcihjaD0wOyBjaDxjdHgtPm91dF9jaGFubmVsczsgY2grKyl7Ci0gICAgICAgIGNvbnN0IGludCBpcz0gIGluX3N0cmlkZVtjaF07Ci0gICAgICAgIGNvbnN0IGludCBvcz0gb3V0X3N0cmlkZVtjaF07Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpPSAgaW5bY2hdOwotICAgICAgICB1aW50OF90ICpwbz0gb3V0W2NoXTsKLSAgICAgICAgdWludDhfdCAqZW5kPSBwbyArIG9zKmxlbjsKLSAgICAgICAgaWYoIW91dFtjaF0pCi0gICAgICAgICAgICBjb250aW51ZTsKLQotI2RlZmluZSBDT05WKG9mbXQsIG90eXBlLCBpZm10LCBleHByKVwKLWlmKGN0eC0+Zm10X3BhaXIgPT0gb2ZtdCArIEFWX1NBTVBMRV9GTVRfTkIqaWZtdCl7XAotICAgIGRve1wKLSAgICAgICAgKihvdHlwZSopcG8gPSBleHByOyBwaSArPSBpczsgcG8gKz0gb3M7XAotICAgIH13aGlsZShwbyA8IGVuZCk7XAotfQotCi0vL0ZJWE1FIHB1dCB0aGluZ3MgYmVsb3cgdW5kZXIgaWZkZWZzIHNvIHdlIGRvIG5vdCB3YXN0ZSBzcGFjZSBmb3IgY2FzZXMgbm8gY29kZWMgd2lsbCBuZWVkCi0vL0ZJWE1FIHJvdW5kaW5nID8KLQotICAgICAgICAgICAgIENPTlYoQVZfU0FNUExFX0ZNVF9VOCAsIHVpbnQ4X3QsIEFWX1NBTVBMRV9GTVRfVTggLCAgKihjb25zdCB1aW50OF90KilwaSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX1U4ICwgKCooY29uc3QgdWludDhfdCopcGkgLSAweDgwKTw8OCkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX1U4ICwgKCooY29uc3QgdWludDhfdCopcGkgLSAweDgwKTw8MjQpCi0gICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQgICwgQVZfU0FNUExFX0ZNVF9VOCAsICgqKGNvbnN0IHVpbnQ4X3QqKXBpIC0gMHg4MCkqKDEuMCAvICgxPDw3KSkpCi0gICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlICwgQVZfU0FNUExFX0ZNVF9VOCAsICgqKGNvbnN0IHVpbnQ4X3QqKXBpIC0gMHg4MCkqKDEuMCAvICgxPDw3KSkpCi0gICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9TMTYsICgqKGNvbnN0IGludDE2X3QqKXBpPj44KSArIDB4ODApCi0gICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX1MxNiwgaW50MTZfdCwgQVZfU0FNUExFX0ZNVF9TMTYsICAqKGNvbnN0IGludDE2X3QqKXBpKQotICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfUzE2LCAgKihjb25zdCBpbnQxNl90KilwaTw8MTYpCi0gICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQgICwgQVZfU0FNUExFX0ZNVF9TMTYsICAqKGNvbnN0IGludDE2X3QqKXBpKigxLjAgLyAoMTw8MTUpKSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUgLCBBVl9TQU1QTEVfRk1UX1MxNiwgICooY29uc3QgaW50MTZfdCopcGkqKDEuMCAvICgxPDwxNSkpKQotICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9VOCAsIHVpbnQ4X3QsIEFWX1NBTVBMRV9GTVRfUzMyLCAoKihjb25zdCBpbnQzMl90KilwaT4+MjQpICsgMHg4MCkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX1MzMiwgICooY29uc3QgaW50MzJfdCopcGk+PjE2KQotICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIEFWX1NBTVBMRV9GTVRfUzMyLCAgKihjb25zdCBpbnQzMl90KilwaSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCAgLCBBVl9TQU1QTEVfRk1UX1MzMiwgICooY29uc3QgaW50MzJfdCopcGkqKDEuMCAvICgxVTw8MzEpKSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUgLCBBVl9TQU1QTEVfRk1UX1MzMiwgICooY29uc3QgaW50MzJfdCopcGkqKDEuMCAvICgxVTw8MzEpKSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfVTggLCB1aW50OF90LCBBVl9TQU1QTEVfRk1UX0ZMVCwgYXZfY2xpcF91aW50OCggIGxyaW50ZigqKGNvbnN0IGZsb2F0KilwaSAqICgxPDw3KSkgKyAweDgwKSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX0ZMVCwgYXZfY2xpcF9pbnQxNiggIGxyaW50ZigqKGNvbnN0IGZsb2F0KilwaSAqICgxPDwxNSkpKSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX0ZMVCwgYXZfY2xpcGxfaW50MzIobGxyaW50ZigqKGNvbnN0IGZsb2F0KilwaSAqICgxVTw8MzEpKSkpCi0gICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQgICwgQVZfU0FNUExFX0ZNVF9GTFQsICooY29uc3QgZmxvYXQqKXBpKQotICAgICAgICBlbHNlIENPTlYoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfRkxULCAqKGNvbnN0IGZsb2F0KilwaSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfVTggLCB1aW50OF90LCBBVl9TQU1QTEVfRk1UX0RCTCwgYXZfY2xpcF91aW50OCggIGxyaW50KCooY29uc3QgZG91YmxlKilwaSAqICgxPDw3KSkgKyAweDgwKSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX0RCTCwgYXZfY2xpcF9pbnQxNiggIGxyaW50KCooY29uc3QgZG91YmxlKilwaSAqICgxPDwxNSkpKSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX0RCTCwgYXZfY2xpcGxfaW50MzIobGxyaW50KCooY29uc3QgZG91YmxlKilwaSAqICgxVTw8MzEpKSkpCi0gICAgICAgIGVsc2UgQ09OVihBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQgICwgQVZfU0FNUExFX0ZNVF9EQkwsICooY29uc3QgZG91YmxlKilwaSkKLSAgICAgICAgZWxzZSBDT05WKEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUgLCBBVl9TQU1QTEVfRk1UX0RCTCwgKihjb25zdCBkb3VibGUqKXBpKQotICAgICAgICBlbHNlIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBGRl9BUElfQVVESU9fQ09OVkVSVCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdWRpb2NvbnZlcnQuaCBiL2xpYmF2Y29kZWMvYXVkaW9jb252ZXJ0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NmMzZjMuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9hdWRpb2NvbnZlcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBhdWRpbyBjb252ZXJzaW9uCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KLSAqIENvcHlyaWdodCAoYykgMjAwOCBQZXRlciBSb3NzCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZDT0RFQ19BVURJT0NPTlZFUlRfSAotI2RlZmluZSBBVkNPREVDX0FVRElPQ09OVkVSVF9ICi0KLSNpbmNsdWRlICJ2ZXJzaW9uLmgiCi0KLS8qKgotICogQGZpbGUKLSAqIEF1ZGlvIGZvcm1hdCBjb252ZXJzaW9uIHJvdXRpbmVzCi0gKiBUaGlzIGludGVyZmFjZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIGRyb3BwZWQgaW4gYSBmdXR1cmUKLSAqIHZlcnNpb24uIFlvdSBzaG91bGQgdXNlIHRoZSBsaWJzd3Jlc2FtcGxlIGxpYnJhcnkgaW5zdGVhZC4KLSAqLwotCi0jaWYgRkZfQVBJX0FVRElPX0NPTlZFUlQKLQotI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKLSNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCi0KLXN0cnVjdCBBVkF1ZGlvQ29udmVydDsKLXR5cGVkZWYgc3RydWN0IEFWQXVkaW9Db252ZXJ0IEFWQXVkaW9Db252ZXJ0OwotCi0vKioKLSAqIENyZWF0ZSBhbiBhdWRpbyBzYW1wbGUgZm9ybWF0IGNvbnZlcnRlciBjb250ZXh0Ci0gKiBAcGFyYW0gb3V0X2ZtdCBPdXRwdXQgc2FtcGxlIGZvcm1hdAotICogQHBhcmFtIG91dF9jaGFubmVscyBOdW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzCi0gKiBAcGFyYW0gaW5fZm10IElucHV0IHNhbXBsZSBmb3JtYXQKLSAqIEBwYXJhbSBpbl9jaGFubmVscyBOdW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMKLSAqIEBwYXJhbVtpbl0gbWF0cml4IENoYW5uZWwgbWl4aW5nIG1hdHJpeCAob2YgZGltZW5zaW9uIGluX2NoYW5uZWwqb3V0X2NoYW5uZWxzKS4gU2V0IHRvIE5VTEwgdG8gaWdub3JlLgotICogQHBhcmFtIGZsYWdzIFNlZSBBVl9DUFVfRkxBR194eAotICogQHJldHVybiBOVUxMIG9uIGVycm9yCi0gKiBAZGVwcmVjYXRlZCBTZWUgbGlic3dyZXNhbXBsZQotICovCi0KLWF0dHJpYnV0ZV9kZXByZWNhdGVkCi1BVkF1ZGlvQ29udmVydCAqYXZfYXVkaW9fY29udmVydF9hbGxvYyhlbnVtIEFWU2FtcGxlRm9ybWF0IG91dF9mbXQsIGludCBvdXRfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGluX2ZtdCwgaW50IGluX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm1hdHJpeCwgaW50IGZsYWdzKTsKLQotLyoqCi0gKiBGcmVlIGF1ZGlvIHNhbXBsZSBmb3JtYXQgY29udmVydGVyIGNvbnRleHQKLSAqIEBkZXByZWNhdGVkIFNlZSBsaWJzd3Jlc2FtcGxlCi0gKi8KLQotYXR0cmlidXRlX2RlcHJlY2F0ZWQKLXZvaWQgYXZfYXVkaW9fY29udmVydF9mcmVlKEFWQXVkaW9Db252ZXJ0ICpjdHgpOwotCi0vKioKLSAqIENvbnZlcnQgYmV0d2VlbiBhdWRpbyBzYW1wbGUgZm9ybWF0cwotICogQHBhcmFtW2luXSBvdXQgYXJyYXkgb2Ygb3V0cHV0IGJ1ZmZlcnMgZm9yIGVhY2ggY2hhbm5lbC4gc2V0IHRvIE5VTEwgdG8gaWdub3JlIHByb2Nlc3Npbmcgb2YgdGhlIGdpdmVuIGNoYW5uZWwuCi0gKiBAcGFyYW1baW5dIG91dF9zdHJpZGUgZGlzdGFuY2UgYmV0d2VlbiBjb25zZWN1dGl2ZSBvdXRwdXQgc2FtcGxlcyAobWVhc3VyZWQgaW4gYnl0ZXMpCi0gKiBAcGFyYW1baW5dIGluIGFycmF5IG9mIGlucHV0IGJ1ZmZlcnMgZm9yIGVhY2ggY2hhbm5lbAotICogQHBhcmFtW2luXSBpbl9zdHJpZGUgZGlzdGFuY2UgYmV0d2VlbiBjb25zZWN1dGl2ZSBpbnB1dCBzYW1wbGVzIChtZWFzdXJlZCBpbiBieXRlcykKLSAqIEBwYXJhbSBsZW4gbGVuZ3RoIG9mIGF1ZGlvIGZyYW1lIHNpemUgKG1lYXN1cmVkIGluIHNhbXBsZXMpCi0gKiBAZGVwcmVjYXRlZCBTZWUgbGlic3dyZXNhbXBsZQotICovCi0KLWF0dHJpYnV0ZV9kZXByZWNhdGVkCi1pbnQgYXZfYXVkaW9fY29udmVydChBVkF1ZGlvQ29udmVydCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIGNvbnN0IG91dFs2XSwgY29uc3QgaW50IG91dF9zdHJpZGVbNl0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogY29uc3QgIGluWzZdLCBjb25zdCBpbnQgIGluX3N0cmlkZVs2XSwgaW50IGxlbik7Ci0KLSNlbmRpZiAvKiBGRl9BUElfQVVESU9fQ09OVkVSVCAqLwotCi0jZW5kaWYgLyogQVZDT0RFQ19BVURJT0NPTlZFUlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdWRpb2RzcC5jIGIvbGliYXZjb2RlYy9hdWRpb2RzcC5jCmluZGV4IDg1YjVhNzQuLjNjN2EzYTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXVkaW9kc3AuYworKysgYi9saWJhdmNvZGVjL2F1ZGlvZHNwLmMKQEAgLTU1LDggKzU1LDggQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHZlY3Rvcl9jbGlwZl9jKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW4sIGZsb2F0IG1heCwgaW50IGxlbikKK3N0YXRpYyB2b2lkIHZlY3Rvcl9jbGlwZl9jKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW4sIGZsb2F0IG1heCkKIHsKICAgICBpbnQgaTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdWRpb2RzcC5oIGIvbGliYXZjb2RlYy9hdWRpb2RzcC5oCmluZGV4IGI1NWJmODUuLmFhNmZhNzggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXVkaW9kc3AuaAorKysgYi9saWJhdmNvZGVjL2F1ZGlvZHNwLmgKQEAgLTQ1LDEwICs0NSwxMSBAQAogICAgICAqLwogICAgIHZvaWQgKCp2ZWN0b3JfY2xpcF9pbnQzMikoaW50MzJfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGludDMyX3QgbWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXgsIHVuc2lnbmVkIGludCBsZW4pOwotICAgIC8qIGFzc3VtZSBsZW4gaXMgYSBtdWx0aXBsZSBvZiA4LCBhbmQgYXJyYXlzIGFyZSAxNi1ieXRlIGFsaWduZWQgKi8KKyAgICAvKiBhc3N1bWUgbGVuIGlzIGEgbXVsdGlwbGUgb2YgMTYsIGFuZCBhcnJheXMgYXJlIDE2LWJ5dGUgYWxpZ25lZCAqLwogICAgIHZvaWQgKCp2ZWN0b3JfY2xpcGYpKGZsb2F0ICpkc3QgLyogYWxpZ24gMTYgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYyAvKiBhbGlnbiAxNiAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW4sIGZsb2F0IG1heCwgaW50IGxlbiAvKiBhbGlnbiAxNiAqLyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiAvKiBhbGlnbiAxNiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW4sIGZsb2F0IG1heCk7CiB9IEF1ZGlvRFNQQ29udGV4dDsKIAogdm9pZCBmZl9hdWRpb2RzcF9pbml0KEF1ZGlvRFNQQ29udGV4dCAqYyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2F1ZGlvdG9vbGJveGRlYy5jIGIvbGliYXZjb2RlYy9hdWRpb3Rvb2xib3hkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzBhOWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9hdWRpb3Rvb2xib3hkZWMuYwpAQCAtMCwwICsxLDYxNyBAQAorLyoKKyAqIEF1ZGlvIFRvb2xib3ggc3lzdGVtIGNvZGVjcworICoKKyAqIGNvcHlyaWdodCAoYykgMjAxNiBSb2RnZXIgQ29tYnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8QXVkaW9Ub29sYm94L0F1ZGlvVG9vbGJveC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImFjM19wYXJzZXJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVnYXVkaW9kZWNoZWFkZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCisjaWYgX19NQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8IDEwMTEwMAorI2RlZmluZSBrQXVkaW9Gb3JtYXRFbmhhbmNlZEFDMyAnZWMtMycKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBBVERlY29kZUNvbnRleHQgeworICAgIEFWQ2xhc3MgKmF2X2NsYXNzOworCisgICAgQXVkaW9Db252ZXJ0ZXJSZWYgY29udmVydGVyOworICAgIEF1ZGlvU3RyZWFtUGFja2V0RGVzY3JpcHRpb24gcGt0X2Rlc2M7CisgICAgQVZQYWNrZXQgaW5fcGt0OworICAgIEFWUGFja2V0IG5ld19pbl9wa3Q7CisgICAgY2hhciAqZGVjb2RlZF9kYXRhOworICAgIGludCBjaGFubmVsX21hcFs2NF07CisKKyAgICB1aW50OF90ICpleHRyYWRhdGE7CisgICAgaW50IGV4dHJhZGF0YV9zaXplOworCisgICAgaW50NjRfdCBsYXN0X3B0czsKKyAgICBpbnQgZW9mOworfSBBVERlY29kZUNvbnRleHQ7CisKK3N0YXRpYyBVSW50MzIgZmZhdF9nZXRfZm9ybWF0X2lkKGVudW0gQVZDb2RlY0lEIGNvZGVjLCBpbnQgcHJvZmlsZSkKK3sKKyAgICBzd2l0Y2ggKGNvZGVjKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BQUM6CisgICAgICAgIHJldHVybiBrQXVkaW9Gb3JtYXRNUEVHNEFBQzsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FDMzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdEFDMzsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVDoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdEFwcGxlSU1BNDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FMQUM6CisgICAgICAgIHJldHVybiBrQXVkaW9Gb3JtYXRBcHBsZUxvc3NsZXNzOworICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX05COgorICAgICAgICByZXR1cm4ga0F1ZGlvRm9ybWF0QU1SOworICAgIGNhc2UgQVZfQ09ERUNfSURfRUFDMzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdEVuaGFuY2VkQUMzOworICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNX01TOgorICAgICAgICByZXR1cm4ga0F1ZGlvRm9ybWF0TWljcm9zb2Z0R1NNOworICAgIGNhc2UgQVZfQ09ERUNfSURfSUxCQzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdGlMQkM7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDE6CisgICAgICAgIHJldHVybiBrQXVkaW9Gb3JtYXRNUEVHTGF5ZXIxOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVAyOgorICAgICAgICByZXR1cm4ga0F1ZGlvRm9ybWF0TVBFR0xheWVyMjsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QMzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdE1QRUdMYXllcjM7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fQUxBVzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdEFMYXc7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc6CisgICAgICAgIHJldHVybiBrQXVkaW9Gb3JtYXRVTGF3OworICAgIGNhc2UgQVZfQ09ERUNfSURfUURNQzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdFFEZXNpZ247CisgICAgY2FzZSBBVl9DT0RFQ19JRF9RRE0yOgorICAgICAgICByZXR1cm4ga0F1ZGlvRm9ybWF0UURlc2lnbjI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MCghIkludmFsaWQgY29kZWMgSUQhIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBmZmF0X2dldF9jaGFubmVsX2lkKEF1ZGlvQ2hhbm5lbExhYmVsIGxhYmVsKQoreworICAgIGlmIChsYWJlbCA9PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZSBpZiAobGFiZWwgPD0ga0F1ZGlvQ2hhbm5lbExhYmVsX0xGRVNjcmVlbikKKyAgICAgICAgcmV0dXJuIGxhYmVsIC0gMTsKKyAgICBlbHNlIGlmIChsYWJlbCA8PSBrQXVkaW9DaGFubmVsTGFiZWxfUmlnaHRTdXJyb3VuZCkKKyAgICAgICAgcmV0dXJuIGxhYmVsICsgNDsKKyAgICBlbHNlIGlmIChsYWJlbCA8PSBrQXVkaW9DaGFubmVsTGFiZWxfQ2VudGVyU3Vycm91bmQpCisgICAgICAgIHJldHVybiBsYWJlbCArIDE7CisgICAgZWxzZSBpZiAobGFiZWwgPD0ga0F1ZGlvQ2hhbm5lbExhYmVsX1JpZ2h0U3Vycm91bmREaXJlY3QpCisgICAgICAgIHJldHVybiBsYWJlbCArIDIzOworICAgIGVsc2UgaWYgKGxhYmVsIDw9IGtBdWRpb0NoYW5uZWxMYWJlbF9Ub3BCYWNrUmlnaHQpCisgICAgICAgIHJldHVybiBsYWJlbCAtIDE7CisgICAgZWxzZSBpZiAobGFiZWwgPCBrQXVkaW9DaGFubmVsTGFiZWxfUmVhclN1cnJvdW5kTGVmdCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UgaWYgKGxhYmVsIDw9IGtBdWRpb0NoYW5uZWxMYWJlbF9SZWFyU3Vycm91bmRSaWdodCkKKyAgICAgICAgcmV0dXJuIGxhYmVsIC0gMjk7CisgICAgZWxzZSBpZiAobGFiZWwgPD0ga0F1ZGlvQ2hhbm5lbExhYmVsX1JpZ2h0V2lkZSkKKyAgICAgICAgcmV0dXJuIGxhYmVsIC0gNDsKKyAgICBlbHNlIGlmIChsYWJlbCA9PSBrQXVkaW9DaGFubmVsTGFiZWxfTEZFMikKKyAgICAgICAgcmV0dXJuIGZmX2N0emxsKEFWX0NIX0xPV19GUkVRVUVOQ1lfMik7CisgICAgZWxzZSBpZiAobGFiZWwgPT0ga0F1ZGlvQ2hhbm5lbExhYmVsX01vbm8pCisgICAgICAgIHJldHVybiBmZl9jdHpsbChBVl9DSF9GUk9OVF9DRU5URVIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGZmYXRfY29tcGFyZV9jaGFubmVsX2Rlc2NyaXB0aW9ucyhjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiKQoreworICAgIGNvbnN0IEF1ZGlvQ2hhbm5lbERlc2NyaXB0aW9uKiBkYSA9IGE7CisgICAgY29uc3QgQXVkaW9DaGFubmVsRGVzY3JpcHRpb24qIGRiID0gYjsKKyAgICByZXR1cm4gZmZhdF9nZXRfY2hhbm5lbF9pZChkYS0+bUNoYW5uZWxMYWJlbCkgLSBmZmF0X2dldF9jaGFubmVsX2lkKGRiLT5tQ2hhbm5lbExhYmVsKTsKK30KKworc3RhdGljIEF1ZGlvQ2hhbm5lbExheW91dCAqZmZhdF9jb252ZXJ0X2xheW91dChBdWRpb0NoYW5uZWxMYXlvdXQgKmxheW91dCwgVUludDMyKiBzaXplKQoreworICAgIEF1ZGlvQ2hhbm5lbExheW91dFRhZyB0YWcgPSBsYXlvdXQtPm1DaGFubmVsTGF5b3V0VGFnOworICAgIEF1ZGlvQ2hhbm5lbExheW91dCAqbmV3X2xheW91dDsKKyAgICBpZiAodGFnID09IGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbERlc2NyaXB0aW9ucykKKyAgICAgICAgcmV0dXJuIGxheW91dDsKKyAgICBlbHNlIGlmICh0YWcgPT0ga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsQml0bWFwKQorICAgICAgICBBdWRpb0Zvcm1hdEdldFByb3BlcnR5SW5mbyhrQXVkaW9Gb3JtYXRQcm9wZXJ0eV9DaGFubmVsTGF5b3V0Rm9yQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVUludDMyKSwgJmxheW91dC0+bUNoYW5uZWxCaXRtYXAsIHNpemUpOworICAgIGVsc2UKKyAgICAgICAgQXVkaW9Gb3JtYXRHZXRQcm9wZXJ0eUluZm8oa0F1ZGlvRm9ybWF0UHJvcGVydHlfQ2hhbm5lbExheW91dEZvclRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF1ZGlvQ2hhbm5lbExheW91dFRhZyksICZ0YWcsIHNpemUpOworICAgIG5ld19sYXlvdXQgPSBhdl9tYWxsb2MoKnNpemUpOworICAgIGlmICghbmV3X2xheW91dCkgeworICAgICAgICBhdl9mcmVlKGxheW91dCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAodGFnID09IGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbEJpdG1hcCkKKyAgICAgICAgQXVkaW9Gb3JtYXRHZXRQcm9wZXJ0eShrQXVkaW9Gb3JtYXRQcm9wZXJ0eV9DaGFubmVsTGF5b3V0Rm9yQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihVSW50MzIpLCAmbGF5b3V0LT5tQ2hhbm5lbEJpdG1hcCwgc2l6ZSwgbmV3X2xheW91dCk7CisgICAgZWxzZQorICAgICAgICBBdWRpb0Zvcm1hdEdldFByb3BlcnR5KGtBdWRpb0Zvcm1hdFByb3BlcnR5X0NoYW5uZWxMYXlvdXRGb3JUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF1ZGlvQ2hhbm5lbExheW91dFRhZyksICZ0YWcsIHNpemUsIG5ld19sYXlvdXQpOworICAgIG5ld19sYXlvdXQtPm1DaGFubmVsTGF5b3V0VGFnID0ga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19Vc2VDaGFubmVsRGVzY3JpcHRpb25zOworICAgIGF2X2ZyZWUobGF5b3V0KTsKKyAgICByZXR1cm4gbmV3X2xheW91dDsKK30KKworc3RhdGljIGludCBmZmF0X3VwZGF0ZV9jdHgoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFURGVjb2RlQ29udGV4dCAqYXQgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBmb3JtYXQ7CisgICAgVUludDMyIHNpemUgPSBzaXplb2YoZm9ybWF0KTsKKyAgICBpZiAoIUF1ZGlvQ29udmVydGVyR2V0UHJvcGVydHkoYXQtPmNvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQ29udmVydGVyQ3VycmVudElucHV0U3RyZWFtRGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCAmZm9ybWF0KSkgeworICAgICAgICBpZiAoZm9ybWF0Lm1TYW1wbGVSYXRlKQorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gZm9ybWF0Lm1TYW1wbGVSYXRlOworICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPSBmb3JtYXQubUNoYW5uZWxzUGVyRnJhbWU7CisgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGF2X2dldF9kZWZhdWx0X2NoYW5uZWxfbGF5b3V0KGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gZm9ybWF0Lm1GcmFtZXNQZXJQYWNrZXQ7CisgICAgfQorCisgICAgaWYgKCFBdWRpb0NvbnZlcnRlckdldFByb3BlcnR5KGF0LT5jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0NvbnZlcnRlckN1cnJlbnRPdXRwdXRTdHJlYW1EZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsICZmb3JtYXQpKSB7CisgICAgICAgIGZvcm1hdC5tU2FtcGxlUmF0ZSA9IGF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgZm9ybWF0Lm1DaGFubmVsc1BlckZyYW1lID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICBBdWRpb0NvbnZlcnRlclNldFByb3BlcnR5KGF0LT5jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQ29udmVydGVyQ3VycmVudE91dHB1dFN0cmVhbURlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsICZmb3JtYXQpOworICAgIH0KKworICAgIGlmICghQXVkaW9Db252ZXJ0ZXJHZXRQcm9wZXJ0eUluZm8oYXQtPmNvbnZlcnRlciwga0F1ZGlvQ29udmVydGVyT3V0cHV0Q2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKSAmJiBzaXplKSB7CisgICAgICAgIEF1ZGlvQ2hhbm5lbExheW91dCAqbGF5b3V0ID0gYXZfbWFsbG9jKHNpemUpOworICAgICAgICB1aW50NjRfdCBsYXlvdXRfbWFzayA9IDA7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAoIWxheW91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIEF1ZGlvQ29udmVydGVyR2V0UHJvcGVydHkoYXQtPmNvbnZlcnRlciwga0F1ZGlvQ29udmVydGVyT3V0cHV0Q2hhbm5lbExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwgbGF5b3V0KTsKKyAgICAgICAgaWYgKCEobGF5b3V0ID0gZmZhdF9jb252ZXJ0X2xheW91dChsYXlvdXQsICZzaXplKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGF5b3V0LT5tTnVtYmVyQ2hhbm5lbERlc2NyaXB0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaWQgPSBmZmF0X2dldF9jaGFubmVsX2lkKGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNoYW5uZWxMYWJlbCk7CisgICAgICAgICAgICBpZiAoaWQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIGlmIChsYXlvdXRfbWFzayAmICgxIDw8IGlkKSkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICBsYXlvdXRfbWFzayB8PSAxIDw8IGlkOworICAgICAgICAgICAgbGF5b3V0LT5tQ2hhbm5lbERlc2NyaXB0aW9uc1tpXS5tQ2hhbm5lbEZsYWdzID0gaTsgLy8gQWJ1c2luZyBmbGFncyBhcyBpbmRleAorICAgICAgICB9CisgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGxheW91dF9tYXNrOworICAgICAgICBxc29ydChsYXlvdXQtPm1DaGFubmVsRGVzY3JpcHRpb25zLCBsYXlvdXQtPm1OdW1iZXJDaGFubmVsRGVzY3JpcHRpb25zLAorICAgICAgICAgICAgICBzaXplb2YoQXVkaW9DaGFubmVsRGVzY3JpcHRpb24pLCAmZmZhdF9jb21wYXJlX2NoYW5uZWxfZGVzY3JpcHRpb25zKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxheW91dC0+bU51bWJlckNoYW5uZWxEZXNjcmlwdGlvbnM7IGkrKykKKyAgICAgICAgICAgIGF0LT5jaGFubmVsX21hcFtpXSA9IGxheW91dC0+bUNoYW5uZWxEZXNjcmlwdGlvbnNbaV0ubUNoYW5uZWxGbGFnczsKK2RvbmU6CisgICAgICAgIGF2X2ZyZWUobGF5b3V0KTsKKyAgICB9CisKKyAgICBpZiAoIWF2Y3R4LT5mcmFtZV9zaXplKQorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IDIwNDg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHV0X2Rlc2NyKFB1dEJ5dGVDb250ZXh0ICpwYiwgaW50IHRhZywgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgaW50IGkgPSAzOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCB0YWcpOworICAgIGZvciAoOyBpID4gMDsgaS0tKQorICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgKHNpemUgPj4gKDcgKiBpKSkgfCAweDgwKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgc2l6ZSAmIDB4N0YpOworfQorCitzdGF0aWMgdWludDhfdCogZmZhdF9nZXRfbWFnaWNfY29va2llKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVUludDMyICpjb29raWVfc2l6ZSkKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICBjaGFyICpleHRyYWRhdGE7CisgICAgICAgIFB1dEJ5dGVDb250ZXh0IHBiOworICAgICAgICAqY29va2llX3NpemUgPSA1ICsgMyArIDUrMTMgKyA1K2F0LT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgaWYgKCEoZXh0cmFkYXRhID0gYXZfbWFsbG9jKCpjb29raWVfc2l6ZSkpKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiLCBleHRyYWRhdGEsICpjb29raWVfc2l6ZSk7CisKKyAgICAgICAgLy8gRVMgZGVzY3JpcHRvcgorICAgICAgICBwdXRfZGVzY3IoJnBiLCAweDAzLCAzICsgNSsxMyArIDUrYXQtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiLCAwKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCAweDAwKTsgLy8gZmxhZ3MgKD0gbm8gZmxhZ3MpCisKKyAgICAgICAgLy8gRGVjb2RlckNvbmZpZyBkZXNjcmlwdG9yCisgICAgICAgIHB1dF9kZXNjcigmcGIsIDB4MDQsIDEzICsgNSthdC0+ZXh0cmFkYXRhX3NpemUpOworCisgICAgICAgIC8vIE9iamVjdCB0eXBlIGluZGljYXRpb24KKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCAweDQwKTsKKworICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIDB4MTUpOyAvLyBmbGFncyAoPSBBdWRpb3N0cmVhbSkKKworICAgICAgICBieXRlc3RyZWFtMl9wdXRfYmUyNCgmcGIsIDApOyAvLyBCdWZmZXJzaXplIERCCisKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMzIoJnBiLCAwKTsgLy8gbWF4Yml0cmF0ZQorICAgICAgICBieXRlc3RyZWFtMl9wdXRfYmUzMigmcGIsIDApOyAvLyBhdmdiaXRyYXRlCisKKyAgICAgICAgLy8gRGVjb2RlclNwZWNpZmljIGluZm8gZGVzY3JpcHRvcgorICAgICAgICBwdXRfZGVzY3IoJnBiLCAweDA1LCBhdC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnVmZmVyKCZwYiwgYXQtPmV4dHJhZGF0YSwgYXQtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIGV4dHJhZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICAqY29va2llX3NpemUgPSBhdC0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIHJldHVybiBhdC0+ZXh0cmFkYXRhOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGZmYXRfdXNhYmxlX2V4dHJhZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQVREZWNvZGVDb250ZXh0ICphdCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGF0LT5leHRyYWRhdGFfc2l6ZSAmJgorICAgICAgICAgICAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FMQUMgfHwKKyAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yIHx8CisgICAgICAgICAgICBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUURNQyB8fAorICAgICAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyk7Cit9CisKK3N0YXRpYyBpbnQgZmZhdF9zZXRfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpZiAoZmZhdF91c2FibGVfZXh0cmFkYXRhKGF2Y3R4KSkgeworICAgICAgICBPU1N0YXR1cyBzdGF0dXM7CisgICAgICAgIFVJbnQzMiBjb29raWVfc2l6ZTsKKyAgICAgICAgdWludDhfdCAqY29va2llID0gZmZhdF9nZXRfbWFnaWNfY29va2llKGF2Y3R4LCAmY29va2llX3NpemUpOworICAgICAgICBpZiAoIWNvb2tpZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgc3RhdHVzID0gQXVkaW9Db252ZXJ0ZXJTZXRQcm9wZXJ0eShhdC0+Y29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0NvbnZlcnRlckRlY29tcHJlc3Npb25NYWdpY0Nvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVfc2l6ZSwgY29va2llKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkF1ZGlvVG9vbGJveCBjb29raWUgZXJyb3I6ICVpXG4iLCAoaW50KXN0YXR1cyk7CisKKyAgICAgICAgaWYgKGNvb2tpZSAhPSBhdC0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgYXZfZnJlZShjb29raWUpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGZmYXRfY3JlYXRlX2RlY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIEFURGVjb2RlQ29udGV4dCAqYXQgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE9TU3RhdHVzIHN0YXR1czsKKyAgICBpbnQgaTsKKworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCA9IChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAzMikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyIDogQVZfU0FNUExFX0ZNVF9TMTY7CisKKyAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gaW5fZm9ybWF0ID0geworICAgICAgICAubUZvcm1hdElEID0gZmZhdF9nZXRfZm9ybWF0X2lkKGF2Y3R4LT5jb2RlY19pZCwgYXZjdHgtPnByb2ZpbGUpLAorICAgICAgICAubUJ5dGVzUGVyUGFja2V0ID0gKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9JTEJDKSA/IGF2Y3R4LT5ibG9ja19hbGlnbiA6IDAsCisgICAgfTsKKyAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gb3V0X2Zvcm1hdCA9IHsKKyAgICAgICAgLm1Gb3JtYXRJRCA9IGtBdWRpb0Zvcm1hdExpbmVhclBDTSwKKyAgICAgICAgLm1Gb3JtYXRGbGFncyA9IGtBdWRpb0Zvcm1hdEZsYWdJc1NpZ25lZEludGVnZXIgfCBrQXVkaW9Gb3JtYXRGbGFnSXNQYWNrZWQsCisgICAgICAgIC5tRnJhbWVzUGVyUGFja2V0ID0gMSwKKyAgICAgICAgLm1CaXRzUGVyQ2hhbm5lbCA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHNhbXBsZV9mbXQpICogOCwKKyAgICB9OworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBzYW1wbGVfZm10OworCisgICAgaWYgKGZmYXRfdXNhYmxlX2V4dHJhZGF0YShhdmN0eCkpIHsKKyAgICAgICAgVUludDMyIGZvcm1hdF9zaXplID0gc2l6ZW9mKGluX2Zvcm1hdCk7CisgICAgICAgIFVJbnQzMiBjb29raWVfc2l6ZTsKKyAgICAgICAgdWludDhfdCAqY29va2llID0gZmZhdF9nZXRfbWFnaWNfY29va2llKGF2Y3R4LCAmY29va2llX3NpemUpOworICAgICAgICBpZiAoIWNvb2tpZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHN0YXR1cyA9IEF1ZGlvRm9ybWF0R2V0UHJvcGVydHkoa0F1ZGlvRm9ybWF0UHJvcGVydHlfRm9ybWF0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29raWVfc2l6ZSwgY29va2llLCAmZm9ybWF0X3NpemUsICZpbl9mb3JtYXQpOworICAgICAgICBpZiAoY29va2llICE9IGF0LT5leHRyYWRhdGEpCisgICAgICAgICAgICBhdl9mcmVlKGNvb2tpZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBdWRpb1Rvb2xib3ggaGVhZGVyLXBhcnNlIGVycm9yOiAlaVxuIiwgKGludClzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorI2lmIENPTkZJR19NUDFfQVRfREVDT0RFUiB8fCBDT05GSUdfTVAyX0FUX0RFQ09ERVIgfHwgQ09ORklHX01QM19BVF9ERUNPREVSCisgICAgfSBlbHNlIGlmIChwa3QgJiYgcGt0LT5zaXplID49IDQgJiYKKyAgICAgICAgICAgICAgIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAxIHx8CisgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMiB8fAorICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpKSB7CisgICAgICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworICAgICAgICBpbnQgYml0X3JhdGU7CisgICAgICAgIGlmIChmZl9tcGFfZGVjb2RlX2hlYWRlcihBVl9SQjMyKHBrdC0+ZGF0YSksICZhdmN0eC0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5fZm9ybWF0Lm1DaGFubmVsc1BlckZyYW1lLCAmYXZjdHgtPmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYml0X3JhdGUsICZjb2RlY19pZCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGJpdF9yYXRlOworICAgICAgICBpbl9mb3JtYXQubVNhbXBsZVJhdGUgPSBhdmN0eC0+c2FtcGxlX3JhdGU7CisjZW5kaWYKKyNpZiBDT05GSUdfQUMzX0FUX0RFQ09ERVIgfHwgQ09ORklHX0VBQzNfQVRfREVDT0RFUgorICAgIH0gZWxzZSBpZiAocGt0ICYmIHBrdC0+c2l6ZSA+PSA3ICYmCisgICAgICAgICAgICAgICAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMyB8fAorICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzKSkgeworICAgICAgICBBQzNIZWFkZXJJbmZvIGhkcjsKKyAgICAgICAgR2V0Qml0Q29udGV4dCBnYmM7CisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiYywgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICBpZiAoZmZfYWMzX3BhcnNlX2hlYWRlcigmZ2JjLCAmaGRyKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaW5fZm9ybWF0Lm1TYW1wbGVSYXRlID0gaGRyLnNhbXBsZV9yYXRlOworICAgICAgICBpbl9mb3JtYXQubUNoYW5uZWxzUGVyRnJhbWUgPSBoZHIuY2hhbm5lbHM7CisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gaGRyLm51bV9ibG9ja3MgKiAyNTY7CisgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGhkci5iaXRfcmF0ZTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGluX2Zvcm1hdC5tU2FtcGxlUmF0ZSA9IGF2Y3R4LT5zYW1wbGVfcmF0ZSA/IGF2Y3R4LT5zYW1wbGVfcmF0ZSA6IDQ0MTAwOworICAgICAgICBpbl9mb3JtYXQubUNoYW5uZWxzUGVyRnJhbWUgPSBhdmN0eC0+Y2hhbm5lbHMgPyBhdmN0eC0+Y2hhbm5lbHMgOiAxOworICAgIH0KKworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IG91dF9mb3JtYXQubVNhbXBsZVJhdGUgPSBpbl9mb3JtYXQubVNhbXBsZVJhdGU7CisgICAgYXZjdHgtPmNoYW5uZWxzID0gb3V0X2Zvcm1hdC5tQ2hhbm5lbHNQZXJGcmFtZSA9IGluX2Zvcm1hdC5tQ2hhbm5lbHNQZXJGcmFtZTsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUKQorICAgICAgICBpbl9mb3JtYXQubUZyYW1lc1BlclBhY2tldCA9IDY0OworCisgICAgc3RhdHVzID0gQXVkaW9Db252ZXJ0ZXJOZXcoJmluX2Zvcm1hdCwgJm91dF9mb3JtYXQsICZhdC0+Y29udmVydGVyKTsKKworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkF1ZGlvVG9vbGJveCBpbml0IGVycm9yOiAlaVxuIiwgKGludClzdGF0dXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmICgoc3RhdHVzID0gZmZhdF9zZXRfZXh0cmFkYXRhKGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gc3RhdHVzOworCisgICAgZm9yIChpID0gMDsgaSA8IChzaXplb2YoYXQtPmNoYW5uZWxfbWFwKSAvIHNpemVvZihhdC0+Y2hhbm5lbF9tYXBbMF0pKTsgaSsrKQorICAgICAgICBhdC0+Y2hhbm5lbF9tYXBbaV0gPSBpOworCisgICAgZmZhdF91cGRhdGVfY3R4KGF2Y3R4KTsKKworICAgIGlmKCEoYXQtPmRlY29kZWRfZGF0YSA9IGF2X21hbGxvYyhhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShhdmN0eC0+c2FtcGxlX2ZtdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhdmN0eC0+ZnJhbWVfc2l6ZSAqIGF2Y3R4LT5jaGFubmVscykpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXQtPmxhc3RfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGZmYXRfaW5pdF9kZWNvZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIGF0LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWF0LT5leHRyYWRhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdC0+ZXh0cmFkYXRhX3NpemUgPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIG1lbWNweShhdC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgIH0KKworICAgIGlmICgoYXZjdHgtPmNoYW5uZWxzICYmIGF2Y3R4LT5zYW1wbGVfcmF0ZSkgfHwgZmZhdF91c2FibGVfZXh0cmFkYXRhKGF2Y3R4KSkKKyAgICAgICAgcmV0dXJuIGZmYXRfY3JlYXRlX2RlY29kZXIoYXZjdHgsIE5VTEwpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBPU1N0YXR1cyBmZmF0X2RlY29kZV9jYWxsYmFjayhBdWRpb0NvbnZlcnRlclJlZiBjb252ZXJ0ZXIsIFVJbnQzMiAqbmJfcGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlckxpc3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1QYWNrZXREZXNjcmlwdGlvbiAqKnBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaW5jdHgpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gaW5jdHg7CisgICAgQVREZWNvZGVDb250ZXh0ICphdCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXQtPmVvZikgeworICAgICAgICAqbmJfcGFja2V0cyA9IDA7CisgICAgICAgIGlmIChwYWNrZXRzKSB7CisgICAgICAgICAgICAqcGFja2V0cyA9ICZhdC0+cGt0X2Rlc2M7CisgICAgICAgICAgICBhdC0+cGt0X2Rlc2MubURhdGFCeXRlU2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXZfcGFja2V0X3VucmVmKCZhdC0+aW5fcGt0KTsKKyAgICBhdl9wYWNrZXRfbW92ZV9yZWYoJmF0LT5pbl9wa3QsICZhdC0+bmV3X2luX3BrdCk7CisKKyAgICBpZiAoIWF0LT5pbl9wa3QuZGF0YSkgeworICAgICAgICAqbmJfcGFja2V0cyA9IDA7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGRhdGEtPm1OdW1iZXJCdWZmZXJzICAgICAgICAgICAgICA9IDE7CisgICAgZGF0YS0+bUJ1ZmZlcnNbMF0ubU51bWJlckNoYW5uZWxzID0gMDsKKyAgICBkYXRhLT5tQnVmZmVyc1swXS5tRGF0YUJ5dGVTaXplICAgPSBhdC0+aW5fcGt0LnNpemU7CisgICAgZGF0YS0+bUJ1ZmZlcnNbMF0ubURhdGEgICAgICAgICAgID0gYXQtPmluX3BrdC5kYXRhOworICAgICpuYl9wYWNrZXRzID0gMTsKKworICAgIGlmIChwYWNrZXRzKSB7CisgICAgICAgICpwYWNrZXRzID0gJmF0LT5wa3RfZGVzYzsKKyAgICAgICAgYXQtPnBrdF9kZXNjLm1EYXRhQnl0ZVNpemUgPSBhdC0+aW5fcGt0LnNpemU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ09QWV9TQU1QTEVTKHR5cGUpIFwKKyAgICB0eXBlICppbl9wdHIgPSAodHlwZSopYXQtPmRlY29kZWRfZGF0YTsgXAorICAgIHR5cGUgKmVuZF9wdHIgPSBpbl9wdHIgKyBmcmFtZS0+bmJfc2FtcGxlcyAqIGF2Y3R4LT5jaGFubmVsczsgXAorICAgIHR5cGUgKm91dF9wdHIgPSAodHlwZSopZnJhbWUtPmRhdGFbMF07IFwKKyAgICBmb3IgKDsgaW5fcHRyIDwgZW5kX3B0cjsgaW5fcHRyICs9IGF2Y3R4LT5jaGFubmVscywgb3V0X3B0ciArPSBhdmN0eC0+Y2hhbm5lbHMpIHsgXAorICAgICAgICBpbnQgYzsgXAorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgYXZjdHgtPmNoYW5uZWxzOyBjKyspIFwKKyAgICAgICAgICAgIG91dF9wdHJbY10gPSBpbl9wdHJbYXQtPmNoYW5uZWxfbWFwW2NdXTsgXAorICAgIH0KKworc3RhdGljIHZvaWQgZmZhdF9jb3B5X3NhbXBsZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9TMzIpIHsKKyAgICAgICAgQ09QWV9TQU1QTEVTKGludDMyX3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIENPUFlfU0FNUExFUyhpbnQxNl90KTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmZhdF9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisgICAgaW50IHBrdF9zaXplID0gYXZwa3QtPnNpemU7CisgICAgT1NTdGF0dXMgcmV0OworICAgIEF1ZGlvQnVmZmVyTGlzdCBvdXRfYnVmZmVyczsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgIGlmICghYXQtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgICAgICB1aW50OF90ICpzaWRlX2RhdGE7CisgICAgICAgICAgICBpbnQgc2lkZV9kYXRhX3NpemUgPSAwOworCisgICAgICAgICAgICBzaWRlX2RhdGEgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWRlX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAoc2lkZV9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihzaWRlX2RhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgIGlmICghYXQtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBhdC0+ZXh0cmFkYXRhX3NpemUgPSBzaWRlX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoYXQtPmV4dHJhZGF0YSwgc2lkZV9kYXRhLCBzaWRlX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWF0LT5jb252ZXJ0ZXIpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZmF0X2NyZWF0ZV9kZWNvZGVyKGF2Y3R4LCBhdnBrdCkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dF9idWZmZXJzID0gKEF1ZGlvQnVmZmVyTGlzdCl7CisgICAgICAgIC5tTnVtYmVyQnVmZmVycyA9IDEsCisgICAgICAgIC5tQnVmZmVycyA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU51bWJlckNoYW5uZWxzID0gYXZjdHgtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgIC5tRGF0YUJ5dGVTaXplID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoYXZjdHgtPnNhbXBsZV9mbXQpICogYXZjdHgtPmZyYW1lX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXZjdHgtPmNoYW5uZWxzLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIGF2X3BhY2tldF91bnJlZigmYXQtPm5ld19pbl9wa3QpOworCisgICAgaWYgKGF2cGt0LT5zaXplKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZfcGFja2V0X3JlZigmYXQtPm5ld19pbl9wa3QsIGF2cGt0KSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXQtPmVvZiA9IDE7CisgICAgfQorCisgICAgZnJhbWUtPnNhbXBsZV9yYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlOworCisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBhdmN0eC0+ZnJhbWVfc2l6ZTsKKworICAgIG91dF9idWZmZXJzLm1CdWZmZXJzWzBdLm1EYXRhID0gYXQtPmRlY29kZWRfZGF0YTsKKworICAgIHJldCA9IEF1ZGlvQ29udmVydGVyRmlsbENvbXBsZXhCdWZmZXIoYXQtPmNvbnZlcnRlciwgZmZhdF9kZWNvZGVfY2FsbGJhY2ssIGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyYW1lLT5uYl9zYW1wbGVzLCAmb3V0X2J1ZmZlcnMsIE5VTEwpOworICAgIGlmICgoIXJldCB8fCByZXQgPT0gMSkgJiYgZnJhbWUtPm5iX3NhbXBsZXMpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZmYXRfY29weV9zYW1wbGVzKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKyAgICAgICAgaWYgKGF0LT5sYXN0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgZnJhbWUtPnB0cyA9IGF0LT5sYXN0X3B0czsKKyNpZiBGRl9BUElfUEtUX1BUUworRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICAgICAgZnJhbWUtPnBrdF9wdHMgPSBhdC0+bGFzdF9wdHM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgICAgICAgICAgYXQtPmxhc3RfcHRzID0gYXZwa3QtPnB0czsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocmV0ICYmIHJldCAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEZWNvZGUgZXJyb3I6ICVpXG4iLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF0LT5sYXN0X3B0cyA9IGF2cGt0LT5wdHM7CisgICAgfQorCisgICAgcmV0dXJuIHBrdF9zaXplOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGZmYXRfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBdWRpb0NvbnZlcnRlclJlc2V0KGF0LT5jb252ZXJ0ZXIpOworICAgIGF2X3BhY2tldF91bnJlZigmYXQtPm5ld19pbl9wa3QpOworICAgIGF2X3BhY2tldF91bnJlZigmYXQtPmluX3BrdCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmZmF0X2Nsb3NlX2RlY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFURGVjb2RlQ29udGV4dCAqYXQgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGlmIChhdC0+Y29udmVydGVyKQorICAgICAgICBBdWRpb0NvbnZlcnRlckRpc3Bvc2UoYXQtPmNvbnZlcnRlcik7CisgICAgYXZfcGFja2V0X3VucmVmKCZhdC0+bmV3X2luX3BrdCk7CisgICAgYXZfcGFja2V0X3VucmVmKCZhdC0+aW5fcGt0KTsKKyAgICBhdl9mcmVlcCgmYXQtPmRlY29kZWRfZGF0YSk7CisgICAgYXZfZnJlZXAoJmF0LT5leHRyYWRhdGEpOworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEZGQVRfREVDX0NMQVNTKE5BTUUpIFwKKyAgICBzdGF0aWMgY29uc3QgQVZDbGFzcyBmZmF0XyMjTkFNRSMjX2RlY19jbGFzcyA9IHsgXAorICAgICAgICAuY2xhc3NfbmFtZSA9ICJhdF8iICNOQU1FICJfZGVjIiwgXAorICAgICAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwgXAorICAgIH07CisKKyNkZWZpbmUgRkZBVF9ERUMoTkFNRSwgSUQsIGJzZl9uYW1lKSBcCisgICAgRkZBVF9ERUNfQ0xBU1MoTkFNRSkgXAorICAgIEFWQ29kZWMgZmZfIyNOQU1FIyNfYXRfZGVjb2RlciA9IHsgXAorICAgICAgICAubmFtZSAgICAgICAgICAgPSAjTkFNRSAiX2F0IiwgXAorICAgICAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgjTkFNRSAiIChBdWRpb1Rvb2xib3gpIiksIFwKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLCBcCisgICAgICAgIC5pZCAgICAgICAgICAgICA9IElELCBcCisgICAgICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBVERlY29kZUNvbnRleHQpLCBcCisgICAgICAgIC5pbml0ICAgICAgICAgICA9IGZmYXRfaW5pdF9kZWNvZGVyLCBcCisgICAgICAgIC5jbG9zZSAgICAgICAgICA9IGZmYXRfY2xvc2VfZGVjb2RlciwgXAorICAgICAgICAuZGVjb2RlICAgICAgICAgPSBmZmF0X2RlY29kZSwgXAorICAgICAgICAuZmx1c2ggICAgICAgICAgPSBmZmF0X2RlY29kZV9mbHVzaCwgXAorICAgICAgICAucHJpdl9jbGFzcyAgICAgPSAmZmZhdF8jI05BTUUjI19kZWNfY2xhc3MsIFwKKyAgICAgICAgLmJzZnMgICAgICAgICAgID0gYnNmX25hbWUsIFwKKyAgICAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9ERUxBWSwgXAorICAgICAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFIHwgRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwgXAorICAgICAgICAud3JhcHBlcl9uYW1lICAgPSAiYXQiLCBcCisgICAgfTsKKworRkZBVF9ERUMoYWFjLCAgICAgICAgICBBVl9DT0RFQ19JRF9BQUMsICJhYWNfYWR0c3RvYXNjIikKK0ZGQVRfREVDKGFjMywgICAgICAgICAgQVZfQ09ERUNfSURfQUMzLCBOVUxMKQorRkZBVF9ERUMoYWRwY21faW1hX3F0LCBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQsIE5VTEwpCitGRkFUX0RFQyhhbGFjLCAgICAgICAgIEFWX0NPREVDX0lEX0FMQUMsIE5VTEwpCitGRkFUX0RFQyhhbXJfbmIsICAgICAgIEFWX0NPREVDX0lEX0FNUl9OQiwgTlVMTCkKK0ZGQVRfREVDKGVhYzMsICAgICAgICAgQVZfQ09ERUNfSURfRUFDMywgTlVMTCkKK0ZGQVRfREVDKGdzbV9tcywgICAgICAgQVZfQ09ERUNfSURfR1NNX01TLCBOVUxMKQorRkZBVF9ERUMoaWxiYywgICAgICAgICBBVl9DT0RFQ19JRF9JTEJDLCBOVUxMKQorRkZBVF9ERUMobXAxLCAgICAgICAgICBBVl9DT0RFQ19JRF9NUDEsIE5VTEwpCitGRkFUX0RFQyhtcDIsICAgICAgICAgIEFWX0NPREVDX0lEX01QMiwgTlVMTCkKK0ZGQVRfREVDKG1wMywgICAgICAgICAgQVZfQ09ERUNfSURfTVAzLCBOVUxMKQorRkZBVF9ERUMocGNtX2FsYXcsICAgICBBVl9DT0RFQ19JRF9QQ01fQUxBVywgTlVMTCkKK0ZGQVRfREVDKHBjbV9tdWxhdywgICAgQVZfQ09ERUNfSURfUENNX01VTEFXLCBOVUxMKQorRkZBVF9ERUMocWRtYywgICAgICAgICBBVl9DT0RFQ19JRF9RRE1DLCBOVUxMKQorRkZBVF9ERUMocWRtMiwgICAgICAgICBBVl9DT0RFQ19JRF9RRE0yLCBOVUxMKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdWRpb3Rvb2xib3hlbmMuYyBiL2xpYmF2Y29kZWMvYXVkaW90b29sYm94ZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMxODkxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYXVkaW90b29sYm94ZW5jLmMKQEAgLTAsMCArMSw2NjEgQEAKKy8qCisgKiBBdWRpbyBUb29sYm94IHN5c3RlbSBjb2RlY3MKKyAqCisgKiBjb3B5cmlnaHQgKGMpIDIwMTYgUm9kZ2VyIENvbWJzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPEF1ZGlvVG9vbGJveC9BdWRpb1Rvb2xib3guaD4KKworI2RlZmluZSBGRl9CVUZRVUVVRV9TSVpFIDI1NgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2J1ZmZlcnF1ZXVlLmgiCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJhdWRpb19mcmFtZV9xdWV1ZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pc29tLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQVREZWNvZGVDb250ZXh0IHsKKyAgICBBVkNsYXNzICphdl9jbGFzczsKKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgcXVhbGl0eTsKKworICAgIEF1ZGlvQ29udmVydGVyUmVmIGNvbnZlcnRlcjsKKyAgICBzdHJ1Y3QgRkZCdWZRdWV1ZSBmcmFtZV9xdWV1ZTsKKyAgICBzdHJ1Y3QgRkZCdWZRdWV1ZSB1c2VkX2ZyYW1lX3F1ZXVlOworCisgICAgdW5zaWduZWQgcGt0X3NpemU7CisgICAgQXVkaW9GcmFtZVF1ZXVlIGFmcTsKKyAgICBpbnQgZW9mOworICAgIGludCBmcmFtZV9zaXplOworCisgICAgQVZGcmFtZSogZW5jb2RpbmdfZnJhbWU7Cit9IEFURGVjb2RlQ29udGV4dDsKKworc3RhdGljIFVJbnQzMiBmZmF0X2dldF9mb3JtYXRfaWQoZW51bSBBVkNvZGVjSUQgY29kZWMsIGludCBwcm9maWxlKQoreworICAgIHN3aXRjaCAoY29kZWMpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FBQzoKKyAgICAgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9BQUNfTE9XOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdE1QRUc0QUFDOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfQUFDX0hFOgorICAgICAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdE1QRUc0QUFDX0hFOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfQUFDX0hFX1YyOgorICAgICAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdE1QRUc0QUFDX0hFX1YyOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfQUFDX0xEOgorICAgICAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdE1QRUc0QUFDX0xEOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfQUFDX0VMRDoKKyAgICAgICAgICAgIHJldHVybiBrQXVkaW9Gb3JtYXRNUEVHNEFBQ19FTEQ7CisgICAgICAgIH0KKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVDoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdEFwcGxlSU1BNDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FMQUM6CisgICAgICAgIHJldHVybiBrQXVkaW9Gb3JtYXRBcHBsZUxvc3NsZXNzOworICAgIGNhc2UgQVZfQ09ERUNfSURfSUxCQzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdGlMQkM7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fQUxBVzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0Zvcm1hdEFMYXc7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc6CisgICAgICAgIHJldHVybiBrQXVkaW9Gb3JtYXRVTGF3OworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoISJJbnZhbGlkIGNvZGVjIElEISIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZmYXRfdXBkYXRlX2N0eChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQVREZWNvZGVDb250ZXh0ICphdCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVUludDMyIHNpemUgPSBzaXplb2YodW5zaWduZWQpOworICAgIEF1ZGlvQ29udmVydGVyUHJpbWVJbmZvIHByaW1lX2luZm87CisgICAgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIG91dF9mb3JtYXQ7CisKKyAgICBBdWRpb0NvbnZlcnRlckdldFByb3BlcnR5KGF0LT5jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Db252ZXJ0ZXJQcm9wZXJ0eU1heGltdW1PdXRwdXRQYWNrZXRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsICZhdC0+cGt0X3NpemUpOworCisgICAgaWYgKGF0LT5wa3Rfc2l6ZSA8PSAwKQorICAgICAgICBhdC0+cGt0X3NpemUgPSAxMDI0ICogNTA7CisKKyAgICBzaXplID0gc2l6ZW9mKHByaW1lX2luZm8pOworCisgICAgaWYgKCFBdWRpb0NvbnZlcnRlckdldFByb3BlcnR5KGF0LT5jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0NvbnZlcnRlclByaW1lSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsICZwcmltZV9pbmZvKSkgeworICAgICAgICBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nID0gcHJpbWVfaW5mby5sZWFkaW5nRnJhbWVzOworICAgIH0KKworICAgIHNpemUgPSBzaXplb2Yob3V0X2Zvcm1hdCk7CisgICAgaWYgKCFBdWRpb0NvbnZlcnRlckdldFByb3BlcnR5KGF0LT5jb252ZXJ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0NvbnZlcnRlckN1cnJlbnRPdXRwdXRTdHJlYW1EZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUsICZvdXRfZm9ybWF0KSkgeworICAgICAgICBpZiAob3V0X2Zvcm1hdC5tRnJhbWVzUGVyUGFja2V0KQorICAgICAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUgPSBvdXRfZm9ybWF0Lm1GcmFtZXNQZXJQYWNrZXQ7CisgICAgICAgIGlmIChvdXRfZm9ybWF0Lm1CeXRlc1BlclBhY2tldCAmJiBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSUxCQykKKyAgICAgICAgICAgIGF2Y3R4LT5ibG9ja19hbGlnbiA9IG91dF9mb3JtYXQubUJ5dGVzUGVyUGFja2V0OworICAgIH0KKworICAgIGF0LT5mcmFtZV9zaXplID0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fTVVMQVcgfHwKKyAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9BTEFXKSB7CisgICAgICAgIGF0LT5wa3Rfc2l6ZSAqPSAxMDI0OworICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSAqPSAxMDI0OworICAgIH0KK30KKworc3RhdGljIGludCByZWFkX2Rlc2NyKEdldEJ5dGVDb250ZXh0ICpnYiwgaW50ICp0YWcpCit7CisgICAgaW50IGxlbiA9IDA7CisgICAgaW50IGNvdW50ID0gNDsKKyAgICAqdGFnID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgIHdoaWxlIChjb3VudC0tKSB7CisgICAgICAgIGludCBjID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICBsZW4gPSAobGVuIDw8IDcpIHwgKGMgJiAweDdmKTsKKyAgICAgICAgaWYgKCEoYyAmIDB4ODApKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2lsYmNfbW9kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiA9PSAzOCkKKyAgICAgICAgcmV0dXJuIDIwOworICAgIGVsc2UgaWYgKGF2Y3R4LT5ibG9ja19hbGlnbiA9PSA1MCkKKyAgICAgICAgcmV0dXJuIDMwOworICAgIGVsc2UgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA+IDApCisgICAgICAgIHJldHVybiBhdmN0eC0+Yml0X3JhdGUgPD0gMTQwMDAgPyAzMCA6IDIwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDMwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZ2V0X2NoYW5uZWxfbGFiZWwoaW50IGNoYW5uZWwpCit7CisgICAgdWludDY0X3QgbWFwID0gMSA8PCBjaGFubmVsOworICAgIGlmIChtYXAgPD0gQVZfQ0hfTE9XX0ZSRVFVRU5DWSkKKyAgICAgICAgcmV0dXJuIGNoYW5uZWwgKyAxOworICAgIGVsc2UgaWYgKG1hcCA8PSBBVl9DSF9CQUNLX1JJR0hUKQorICAgICAgICByZXR1cm4gY2hhbm5lbCArIDI5OworICAgIGVsc2UgaWYgKG1hcCA8PSBBVl9DSF9CQUNLX0NFTlRFUikKKyAgICAgICAgcmV0dXJuIGNoYW5uZWwgLSAxOworICAgIGVsc2UgaWYgKG1hcCA8PSBBVl9DSF9TSURFX1JJR0hUKQorICAgICAgICByZXR1cm4gY2hhbm5lbCAtIDQ7CisgICAgZWxzZSBpZiAobWFwIDw9IEFWX0NIX1RPUF9CQUNLX1JJR0hUKQorICAgICAgICByZXR1cm4gY2hhbm5lbCArIDE7CisgICAgZWxzZSBpZiAobWFwIDw9IEFWX0NIX1NURVJFT19SSUdIVCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UgaWYgKG1hcCA8PSBBVl9DSF9XSURFX1JJR0hUKQorICAgICAgICByZXR1cm4gY2hhbm5lbCArIDQ7CisgICAgZWxzZSBpZiAobWFwIDw9IEFWX0NIX1NVUlJPVU5EX0RJUkVDVF9SSUdIVCkKKyAgICAgICAgcmV0dXJuIGNoYW5uZWwgLSAyMzsKKyAgICBlbHNlIGlmIChtYXAgPT0gQVZfQ0hfTE9XX0ZSRVFVRU5DWV8yKQorICAgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExhYmVsX0xGRTI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcmVtYXBfbGF5b3V0KEF1ZGlvQ2hhbm5lbExheW91dCAqbGF5b3V0LCB1aW50NjRfdCBpbl9sYXlvdXQsIGludCBjb3VudCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgYyA9IDA7CisgICAgbGF5b3V0LT5tQ2hhbm5lbExheW91dFRhZyA9IGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfVXNlQ2hhbm5lbERlc2NyaXB0aW9uczsKKyAgICBsYXlvdXQtPm1OdW1iZXJDaGFubmVsRGVzY3JpcHRpb25zID0gY291bnQ7CisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaW50IGxhYmVsOworICAgICAgICB3aGlsZSAoIShpbl9sYXlvdXQgJiAoMSA8PCBjKSkgJiYgYyA8IDY0KQorICAgICAgICAgICAgYysrOworICAgICAgICBpZiAoYyA9PSA2NCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7IC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICBsYWJlbCA9IGdldF9jaGFubmVsX2xhYmVsKGMpOworICAgICAgICBsYXlvdXQtPm1DaGFubmVsRGVzY3JpcHRpb25zW2ldLm1DaGFubmVsTGFiZWwgPSBsYWJlbDsKKyAgICAgICAgaWYgKGxhYmVsIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGMrKzsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2FhY190YWcodWludDY0X3QgaW5fbGF5b3V0KQoreworICAgIHN3aXRjaCAoaW5fbGF5b3V0KSB7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfTU9OTzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfTW9ubzsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF9TVEVSRU86CisgICAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGF5b3V0VGFnX1N0ZXJlbzsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF9RVUFEOgorICAgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19BQUNfUXVhZHJhcGhvbmljOworICAgIGNhc2UgQVZfQ0hfTEFZT1VUX09DVEFHT05BTDoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfQUFDX09jdGFnb25hbDsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF9TVVJST1VORDoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfQUFDXzNfMDsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF80UE9JTlQwOgorICAgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19BQUNfNF8wOworICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzVQT0lOVDA6CisgICAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGF5b3V0VGFnX0FBQ181XzA7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMToKKyAgICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfQUFDXzVfMTsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF82UE9JTlQwOgorICAgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19BQUNfNl8wOworICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzZQT0lOVDE6CisgICAgICAgIHJldHVybiBrQXVkaW9DaGFubmVsTGF5b3V0VGFnX0FBQ182XzE7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfN1BPSU5UMDoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfQUFDXzdfMDsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREVfQkFDSzoKKyAgICAgICAgcmV0dXJuIGtBdWRpb0NoYW5uZWxMYXlvdXRUYWdfQUFDXzdfMTsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF83UE9JTlQxOgorICAgICAgICByZXR1cm4ga0F1ZGlvQ2hhbm5lbExheW91dFRhZ19NUEVHXzdfMV9DOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IGZmYXRfaW5pdF9lbmNvZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBPU1N0YXR1cyBzdGF0dXM7CisKKyAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gaW5fZm9ybWF0ID0geworICAgICAgICAubVNhbXBsZVJhdGUgPSBhdmN0eC0+c2FtcGxlX3JhdGUsCisgICAgICAgIC5tRm9ybWF0SUQgPSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ00sCisgICAgICAgIC5tRm9ybWF0RmxhZ3MgPSAoKGF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfREJMKSA/IGtBdWRpb0Zvcm1hdEZsYWdJc0Zsb2F0CisgICAgICAgICAgICAgICAgICAgICAgICA6IGF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfVTggPyAwCisgICAgICAgICAgICAgICAgICAgICAgICA6IGtBdWRpb0Zvcm1hdEZsYWdJc1NpZ25lZEludGVnZXIpCisgICAgICAgICAgICAgICAgICAgICAgICB8IGtBdWRpb0Zvcm1hdEZsYWdJc1BhY2tlZCwKKyAgICAgICAgLm1CeXRlc1BlclBhY2tldCA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGF2Y3R4LT5zYW1wbGVfZm10KSAqIGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgLm1GcmFtZXNQZXJQYWNrZXQgPSAxLAorICAgICAgICAubUJ5dGVzUGVyRnJhbWUgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShhdmN0eC0+c2FtcGxlX2ZtdCkgKiBhdmN0eC0+Y2hhbm5lbHMsCisgICAgICAgIC5tQ2hhbm5lbHNQZXJGcmFtZSA9IGF2Y3R4LT5jaGFubmVscywKKyAgICAgICAgLm1CaXRzUGVyQ2hhbm5lbCA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGF2Y3R4LT5zYW1wbGVfZm10KSAqIDgsCisgICAgfTsKKyAgICBBdWRpb1N0cmVhbUJhc2ljRGVzY3JpcHRpb24gb3V0X2Zvcm1hdCA9IHsKKyAgICAgICAgLm1TYW1wbGVSYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlLAorICAgICAgICAubUZvcm1hdElEID0gZmZhdF9nZXRfZm9ybWF0X2lkKGF2Y3R4LT5jb2RlY19pZCwgYXZjdHgtPnByb2ZpbGUpLAorICAgICAgICAubUNoYW5uZWxzUGVyRnJhbWUgPSBpbl9mb3JtYXQubUNoYW5uZWxzUGVyRnJhbWUsCisgICAgfTsKKyAgICBVSW50MzIgbGF5b3V0X3NpemUgPSBzaXplb2YoQXVkaW9DaGFubmVsTGF5b3V0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEF1ZGlvQ2hhbm5lbERlc2NyaXB0aW9uKSAqIGF2Y3R4LT5jaGFubmVsczsKKyAgICBBdWRpb0NoYW5uZWxMYXlvdXQgKmNoYW5uZWxfbGF5b3V0ID0gYXZfbWFsbG9jKGxheW91dF9zaXplKTsKKworICAgIGlmICghY2hhbm5lbF9sYXlvdXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0lMQkMpIHsKKyAgICAgICAgaW50IG1vZGUgPSBnZXRfaWxiY19tb2RlKGF2Y3R4KTsKKyAgICAgICAgb3V0X2Zvcm1hdC5tRnJhbWVzUGVyUGFja2V0ICA9IDgwMDAgKiBtb2RlIC8gMTAwMDsKKyAgICAgICAgb3V0X2Zvcm1hdC5tQnl0ZXNQZXJQYWNrZXQgICA9IChtb2RlID09IDIwID8gMzggOiA1MCk7CisgICAgfQorCisgICAgc3RhdHVzID0gQXVkaW9Db252ZXJ0ZXJOZXcoJmluX2Zvcm1hdCwgJm91dF9mb3JtYXQsICZhdC0+Y29udmVydGVyKTsKKworICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkF1ZGlvVG9vbGJveCBpbml0IGVycm9yOiAlaVxuIiwgKGludClzdGF0dXMpOworICAgICAgICBhdl9mcmVlKGNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoIWF2Y3R4LT5jaGFubmVsX2xheW91dCkKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2RlZmF1bHRfY2hhbm5lbF9sYXlvdXQoYXZjdHgtPmNoYW5uZWxzKTsKKworICAgIGlmICgoc3RhdHVzID0gcmVtYXBfbGF5b3V0KGNoYW5uZWxfbGF5b3V0LCBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQsIGF2Y3R4LT5jaGFubmVscykpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2hhbm5lbCBsYXlvdXRcbiIpOworICAgICAgICBhdl9mcmVlKGNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoQXVkaW9Db252ZXJ0ZXJTZXRQcm9wZXJ0eShhdC0+Y29udmVydGVyLCBrQXVkaW9Db252ZXJ0ZXJJbnB1dENoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X3NpemUsIGNoYW5uZWxfbGF5b3V0KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGlucHV0IGNoYW5uZWwgbGF5b3V0XG4iKTsKKyAgICAgICAgYXZfZnJlZShjaGFubmVsX2xheW91dCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgIGludCB0YWcgPSBnZXRfYWFjX3RhZyhhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICBpZiAodGFnKSB7CisgICAgICAgICAgICBjaGFubmVsX2xheW91dC0+bUNoYW5uZWxMYXlvdXRUYWcgPSB0YWc7CisgICAgICAgICAgICBjaGFubmVsX2xheW91dC0+bU51bWJlckNoYW5uZWxEZXNjcmlwdGlvbnMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChBdWRpb0NvbnZlcnRlclNldFByb3BlcnR5KGF0LT5jb252ZXJ0ZXIsIGtBdWRpb0NvbnZlcnRlck91dHB1dENoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5b3V0X3NpemUsIGNoYW5uZWxfbGF5b3V0KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIG91dHB1dCBjaGFubmVsIGxheW91dFxuIik7CisgICAgICAgIGF2X2ZyZWUoY2hhbm5lbF9sYXlvdXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBhdl9mcmVlKGNoYW5uZWxfbGF5b3V0KTsKKworICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSkKKyAgICAgICAgQXVkaW9Db252ZXJ0ZXJTZXRQcm9wZXJ0eShhdC0+Y29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0NvbnZlcnRlclByb3BlcnR5Qml0RGVwdGhIaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKTsKKworI2lmICFUQVJHRVRfT1NfSVBIT05FCisgICAgaWYgKGF0LT5tb2RlID09IC0xKQorICAgICAgICBhdC0+bW9kZSA9IChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FTQ0FMRSkgPworICAgICAgICAgICAgICAgICAgIGtBdWRpb0NvZGVjQml0UmF0ZUNvbnRyb2xNb2RlX1ZhcmlhYmxlIDoKKyAgICAgICAgICAgICAgICAgICBrQXVkaW9Db2RlY0JpdFJhdGVDb250cm9sTW9kZV9Db25zdGFudDsKKworICAgIEF1ZGlvQ29udmVydGVyU2V0UHJvcGVydHkoYXQtPmNvbnZlcnRlciwga0F1ZGlvQ29kZWNQcm9wZXJ0eUJpdFJhdGVDb250cm9sTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhdC0+bW9kZSksICZhdC0+bW9kZSk7CisKKyAgICBpZiAoYXQtPm1vZGUgPT0ga0F1ZGlvQ29kZWNCaXRSYXRlQ29udHJvbE1vZGVfVmFyaWFibGUpIHsKKyAgICAgICAgaW50IHEgPSBhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgLyBGRl9RUDJMQU1CREE7CisgICAgICAgIGlmIChxIDwgMCB8fCBxID4gMTQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlZCUiBxdWFsaXR5ICVkIG91dCBvZiByYW5nZSwgc2hvdWxkIGJlIDAtMTRcbiIsIHEpOworICAgICAgICAgICAgcSA9IGF2X2NsaXAocSwgMCwgMTQpOworICAgICAgICB9CisgICAgICAgIHEgPSAxMjcgLSBxICogOTsKKyAgICAgICAgQXVkaW9Db252ZXJ0ZXJTZXRQcm9wZXJ0eShhdC0+Y29udmVydGVyLCBrQXVkaW9Db2RlY1Byb3BlcnR5U291bmRRdWFsaXR5Rm9yVkJSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihxKSwgJnEpOworICAgIH0gZWxzZQorI2VuZGlmCisgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA+IDApIHsKKyAgICAgICAgVUludDMyIHJhdGUgPSBhdmN0eC0+Yml0X3JhdGU7CisgICAgICAgIFVJbnQzMiBzaXplOworICAgICAgICBzdGF0dXMgPSBBdWRpb0NvbnZlcnRlckdldFByb3BlcnR5SW5mbyhhdC0+Y29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Db252ZXJ0ZXJBcHBsaWNhYmxlRW5jb2RlQml0UmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdGF0dXMgJiYgc2l6ZSkgeworICAgICAgICAgICAgVUludDMyIG5ld19yYXRlID0gcmF0ZTsKKyAgICAgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgQXVkaW9WYWx1ZVJhbmdlICpyYW5nZXMgPSBhdl9tYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXJhbmdlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgQXVkaW9Db252ZXJ0ZXJHZXRQcm9wZXJ0eShhdC0+Y29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9Db252ZXJ0ZXJBcHBsaWNhYmxlRW5jb2RlQml0UmF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLCByYW5nZXMpOworICAgICAgICAgICAgY291bnQgPSBzaXplIC8gc2l6ZW9mKEF1ZGlvVmFsdWVSYW5nZSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIEF1ZGlvVmFsdWVSYW5nZSAqcmFuZ2UgPSAmcmFuZ2VzW2ldOworICAgICAgICAgICAgICAgIGlmIChyYXRlID49IHJhbmdlLT5tTWluaW11bSAmJiByYXRlIDw9IHJhbmdlLT5tTWF4aW11bSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfcmF0ZSA9IHJhdGU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmF0ZSA+IHJhbmdlLT5tTWF4aW11bSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfcmF0ZSA9IHJhbmdlLT5tTWF4aW11bTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdfcmF0ZSA9IHJhbmdlLT5tTWluaW11bTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld19yYXRlICE9IHJhdGUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiQml0cmF0ZSAldSBub3QgYWxsb3dlZDsgY2hhbmdpbmcgdG8gJXVcbiIsIHJhdGUsIG5ld19yYXRlKTsKKyAgICAgICAgICAgICAgICByYXRlID0gbmV3X3JhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mcmVlKHJhbmdlcyk7CisgICAgICAgIH0KKyAgICAgICAgQXVkaW9Db252ZXJ0ZXJTZXRQcm9wZXJ0eShhdC0+Y29udmVydGVyLCBrQXVkaW9Db252ZXJ0ZXJFbmNvZGVCaXRSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyYXRlKSwgJnJhdGUpOworICAgIH0KKworICAgIGF0LT5xdWFsaXR5ID0gOTYgLSBhdC0+cXVhbGl0eSAqIDMyOworICAgIEF1ZGlvQ29udmVydGVyU2V0UHJvcGVydHkoYXQtPmNvbnZlcnRlciwga0F1ZGlvQ29udmVydGVyQ29kZWNRdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGF0LT5xdWFsaXR5KSwgJmF0LT5xdWFsaXR5KTsKKworICAgIGlmICghQXVkaW9Db252ZXJ0ZXJHZXRQcm9wZXJ0eUluZm8oYXQtPmNvbnZlcnRlciwga0F1ZGlvQ29udmVydGVyQ29tcHJlc3Npb25NYWdpY0Nvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdmN0eC0+ZXh0cmFkYXRhX3NpemUsIE5VTEwpICYmCisgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICBpbnQgZXh0cmFkYXRhX3NpemUgPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIHVpbnQ4X3QgKmV4dHJhZGF0YTsKKyAgICAgICAgaWYgKCEoYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooYXZjdHgtPmV4dHJhZGF0YV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTEFDKSB7CisgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAweDI0OworICAgICAgICAgICAgQVZfV0IzMihhdmN0eC0+ZXh0cmFkYXRhLCAgICAgMHgyNCk7CisgICAgICAgICAgICBBVl9XQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyA0LCBNS0JFVEFHKCdhJywnbCcsJ2EnLCdjJykpOworICAgICAgICAgICAgZXh0cmFkYXRhID0gYXZjdHgtPmV4dHJhZGF0YSArIDEyOworICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMHgyNDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4dHJhZGF0YSA9IGF2Y3R4LT5leHRyYWRhdGE7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gQXVkaW9Db252ZXJ0ZXJHZXRQcm9wZXJ0eShhdC0+Y29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBdWRpb0NvbnZlcnRlckNvbXByZXNzaW9uTWFnaWNDb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhZGF0YV9zaXplLCBleHRyYWRhdGEpOworICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQXVkaW9Ub29sYm94IGNvb2tpZSBlcnJvcjogJWlcbiIsIChpbnQpc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgICAgICAgICBpbnQgdGFnLCBsZW47CisgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgZXh0cmFkYXRhLCBleHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbGVuID0gcmVhZF9kZXNjcigmZ2IsICZ0YWcpOworICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gTVA0RGVjQ29uZmlnRGVzY3JUYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDEzKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVhZF9kZXNjcigmZ2IsICZ0YWcpOworICAgICAgICAgICAgICAgICAgICBpZiAodGFnID09IE1QNERlY1NwZWNpZmljRGVzY3JUYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IEZGTUlOKGdiLmJ1ZmZlcl9lbmQgLSBnYi5idWZmZXIsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1tb3ZlKGV4dHJhZGF0YSwgZ2IuYnVmZmVyLCBsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBNUDRFU0Rlc2NyVGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBmbGFnczsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDIpOworICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIDB4ODApIC8vc3RyZWFtRGVwZW5kZW5jZUZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgMHg0MCkgLy9VUkxfRmxhZworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDIwKSAvL09DUnN0cmVhbUZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUxBQykgeworICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gZXh0cmFkYXRhX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZmF0X3VwZGF0ZV9jdHgoYXZjdHgpOworCisjaWYgIVRBUkdFVF9PU19JUEhPTkUgJiYgZGVmaW5lZChfX01BQ18xMF85KQorICAgIGlmIChhdC0+bW9kZSA9PSBrQXVkaW9Db2RlY0JpdFJhdGVDb250cm9sTW9kZV9WYXJpYWJsZSAmJiBhdmN0eC0+cmNfbWF4X3JhdGUpIHsKKyAgICAgICAgVUludDMyIG1heF9zaXplID0gYXZjdHgtPnJjX21heF9yYXRlICogYXZjdHgtPmZyYW1lX3NpemUgLyBhdmN0eC0+c2FtcGxlX3JhdGU7CisgICAgICAgIGlmIChtYXhfc2l6ZSkKKyAgICAgICAgICAgIEF1ZGlvQ29udmVydGVyU2V0UHJvcGVydHkoYXQtPmNvbnZlcnRlciwga0F1ZGlvQ29kZWNQcm9wZXJ0eVBhY2tldFNpemVMaW1pdEZvclZCUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1heF9zaXplKSwgJm1heF9zaXplKTsKKyAgICB9CisjZW5kaWYKKworICAgIGZmX2FmX3F1ZXVlX2luaXQoYXZjdHgsICZhdC0+YWZxKTsKKworICAgIGF0LT5lbmNvZGluZ19mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFhdC0+ZW5jb2RpbmdfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIE9TU3RhdHVzIGZmYXRfZW5jb2RlX2NhbGxiYWNrKEF1ZGlvQ29udmVydGVyUmVmIGNvbnZlcnRlciwgVUludDMyICpuYl9wYWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyTGlzdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbVBhY2tldERlc2NyaXB0aW9uICoqcGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICppbmN0eCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBpbmN0eDsKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFhdC0+ZnJhbWVfcXVldWUuYXZhaWxhYmxlKSB7CisgICAgICAgIGlmIChhdC0+ZW9mKSB7CisgICAgICAgICAgICAqbmJfcGFja2V0cyA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpuYl9wYWNrZXRzID0gMDsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgZnJhbWUgPSBmZl9idWZxdWV1ZV9nZXQoJmF0LT5mcmFtZV9xdWV1ZSk7CisKKyAgICBkYXRhLT5tTnVtYmVyQnVmZmVycyAgICAgICAgICAgICAgPSAxOworICAgIGRhdGEtPm1CdWZmZXJzWzBdLm1OdW1iZXJDaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICBkYXRhLT5tQnVmZmVyc1swXS5tRGF0YUJ5dGVTaXplICAgPSBmcmFtZS0+bmJfc2FtcGxlcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoYXZjdHgtPnNhbXBsZV9mbXQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHM7CisgICAgZGF0YS0+bUJ1ZmZlcnNbMF0ubURhdGEgICAgICAgICAgID0gZnJhbWUtPmRhdGFbMF07CisgICAgaWYgKCpuYl9wYWNrZXRzID4gZnJhbWUtPm5iX3NhbXBsZXMpCisgICAgICAgICpuYl9wYWNrZXRzID0gZnJhbWUtPm5iX3NhbXBsZXM7CisKKyAgICBhdl9mcmFtZV91bnJlZihhdC0+ZW5jb2RpbmdfZnJhbWUpOworICAgIHJldCA9IGF2X2ZyYW1lX3JlZihhdC0+ZW5jb2RpbmdfZnJhbWUsIGZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAqbmJfcGFja2V0cyA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZmZfYnVmcXVldWVfYWRkKGF2Y3R4LCAmYXQtPnVzZWRfZnJhbWVfcXVldWUsIGZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZmYXRfZW5jb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBPU1N0YXR1cyByZXQ7CisKKyAgICBBdWRpb0J1ZmZlckxpc3Qgb3V0X2J1ZmZlcnMgPSB7CisgICAgICAgIC5tTnVtYmVyQnVmZmVycyA9IDEsCisgICAgICAgIC5tQnVmZmVycyA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU51bWJlckNoYW5uZWxzID0gYXZjdHgtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgIC5tRGF0YUJ5dGVTaXplID0gYXQtPnBrdF9zaXplLAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBBdWRpb1N0cmVhbVBhY2tldERlc2NyaXB0aW9uIG91dF9wa3RfZGVzYyA9IHswfTsKKworICAgIGlmIChmcmFtZSkgeworICAgICAgICBBVkZyYW1lICppbl9mcmFtZTsKKworICAgICAgICBpZiAoZmZfYnVmcXVldWVfaXNfZnVsbCgmYXQtPmZyYW1lX3F1ZXVlKSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRoZSBmcmFtZSBxdWV1ZSBpcyBzaWduaWZpY2FudGx5IGxhcmdlciB0aGFuIG5lZWRlZCBpbiBwcmFjdGljZSwKKyAgICAgICAgICAgICAqIGJ1dCBubyBjbGVhciB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG51bWJlciBvZiBzYW1wbGVzIHRvCisgICAgICAgICAgICAgKiBnZXQgb3V0cHV0IGZyb20gQXVkaW9Db252ZXJ0ZXJGaWxsQ29tcGxleEJ1ZmZlcigpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJ1ZzogZnJhbWUgcXVldWUgaXMgdG9vIHNtYWxsLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGZmX2FmX3F1ZXVlX2FkZCgmYXQtPmFmcSwgZnJhbWUpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGluX2ZyYW1lID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworICAgICAgICBpZiAoIWluX2ZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBmZl9idWZxdWV1ZV9hZGQoYXZjdHgsICZhdC0+ZnJhbWVfcXVldWUsIGluX2ZyYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdC0+ZW9mID0gMTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBhdC0+cGt0X3NpemUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKworICAgIG91dF9idWZmZXJzLm1CdWZmZXJzWzBdLm1EYXRhID0gYXZwa3QtPmRhdGE7CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSBhdmN0eC0+ZnJhbWVfc2l6ZSAvIGF0LT5mcmFtZV9zaXplOworCisgICAgcmV0ID0gQXVkaW9Db252ZXJ0ZXJGaWxsQ29tcGxleEJ1ZmZlcihhdC0+Y29udmVydGVyLCBmZmF0X2VuY29kZV9jYWxsYmFjaywgYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RfcGFja2V0X3B0ciwgJm91dF9idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5mcmFtZV9zaXplID4gYXQtPmZyYW1lX3NpemUpID8gTlVMTCA6ICZvdXRfcGt0X2Rlc2MpOworCisgICAgZmZfYnVmcXVldWVfZGlzY2FyZF9hbGwoJmF0LT51c2VkX2ZyYW1lX3F1ZXVlKTsKKworICAgIGlmICgoIXJldCB8fCByZXQgPT0gMSkgJiYgKmdvdF9wYWNrZXRfcHRyKSB7CisgICAgICAgIGF2cGt0LT5zaXplID0gb3V0X2J1ZmZlcnMubUJ1ZmZlcnNbMF0ubURhdGFCeXRlU2l6ZTsKKyAgICAgICAgZmZfYWZfcXVldWVfcmVtb3ZlKCZhdC0+YWZxLCBvdXRfcGt0X2Rlc2MubVZhcmlhYmxlRnJhbWVzSW5QYWNrZXQgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wa3RfZGVzYy5tVmFyaWFibGVGcmFtZXNJblBhY2tldCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZwa3QtPnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdnBrdC0+ZHVyYXRpb24pOworICAgIH0gZWxzZSBpZiAocmV0ICYmIHJldCAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJFbmNvZGUgZXJyb3I6ICVpXG4iLCByZXQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGZmYXRfZW5jb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVERlY29kZUNvbnRleHQgKmF0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBdWRpb0NvbnZlcnRlclJlc2V0KGF0LT5jb252ZXJ0ZXIpOworICAgIGZmX2J1ZnF1ZXVlX2Rpc2NhcmRfYWxsKCZhdC0+ZnJhbWVfcXVldWUpOworICAgIGZmX2J1ZnF1ZXVlX2Rpc2NhcmRfYWxsKCZhdC0+dXNlZF9mcmFtZV9xdWV1ZSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBmZmF0X2Nsb3NlX2VuY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFURGVjb2RlQ29udGV4dCAqYXQgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEF1ZGlvQ29udmVydGVyRGlzcG9zZShhdC0+Y29udmVydGVyKTsKKyAgICBmZl9idWZxdWV1ZV9kaXNjYXJkX2FsbCgmYXQtPmZyYW1lX3F1ZXVlKTsKKyAgICBmZl9idWZxdWV1ZV9kaXNjYXJkX2FsbCgmYXQtPnVzZWRfZnJhbWVfcXVldWUpOworICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZhdC0+YWZxKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZhdC0+ZW5jb2RpbmdfZnJhbWUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZQcm9maWxlIGFhY19wcm9maWxlc1tdID0geworICAgIHsgRkZfUFJPRklMRV9BQUNfTE9XLCAgICJMQyIgICAgICAgfSwKKyAgICB7IEZGX1BST0ZJTEVfQUFDX0hFLCAgICAiSEUtQUFDIiAgIH0sCisgICAgeyBGRl9QUk9GSUxFX0FBQ19IRV9WMiwgIkhFLUFBQ3YyIiB9LAorICAgIHsgRkZfUFJPRklMRV9BQUNfTEQsICAgICJMRCIgICAgICAgfSwKKyAgICB7IEZGX1BST0ZJTEVfQUFDX0VMRCwgICAiRUxEIiAgICAgIH0sCisgICAgeyBGRl9QUk9GSUxFX1VOS05PV04gfSwKK307CisKKyNkZWZpbmUgQUUgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyNpZiAhVEFSR0VUX09TX0lQSE9ORQorICAgIHsiYWFjX2F0X21vZGUiLCAicmF0ZWNvbnRyb2wgbW9kZSIsIG9mZnNldG9mKEFURGVjb2RlQ29udGV4dCwgbW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBrQXVkaW9Db2RlY0JpdFJhdGVDb250cm9sTW9kZV9WYXJpYWJsZSwgQUUsICJtb2RlIn0sCisgICAgICAgIHsiYXV0byIsICJWQlIgaWYgZ2xvYmFsIHF1YWxpdHkgaXMgZ2l2ZW47IENCUiBvdGhlcndpc2UiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAtMX0sIElOVF9NSU4sIElOVF9NQVgsIEFFLCAibW9kZSJ9LAorICAgICAgICB7ImNiciIsICAiY29uc3RhbnQgYml0cmF0ZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IGtBdWRpb0NvZGVjQml0UmF0ZUNvbnRyb2xNb2RlX0NvbnN0YW50fSwgSU5UX01JTiwgSU5UX01BWCwgQUUsICJtb2RlIn0sCisgICAgICAgIHsiYWJyIiwgICJsb25nLXRlcm0gYXZlcmFnZSBiaXRyYXRlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0ga0F1ZGlvQ29kZWNCaXRSYXRlQ29udHJvbE1vZGVfTG9uZ1Rlcm1BdmVyYWdlfSwgSU5UX01JTiwgSU5UX01BWCwgQUUsICJtb2RlIn0sCisgICAgICAgIHsiY3ZiciIsICJjb25zdHJhaW5lZCB2YXJpYWJsZSBiaXRyYXRlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0ga0F1ZGlvQ29kZWNCaXRSYXRlQ29udHJvbE1vZGVfVmFyaWFibGVDb25zdHJhaW5lZH0sIElOVF9NSU4sIElOVF9NQVgsIEFFLCAibW9kZSJ9LAorICAgICAgICB7InZiciIgLCAidmFyaWFibGUgYml0cmF0ZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IGtBdWRpb0NvZGVjQml0UmF0ZUNvbnRyb2xNb2RlX1ZhcmlhYmxlfSwgSU5UX01JTiwgSU5UX01BWCwgQUUsICJtb2RlIn0sCisjZW5kaWYKKyAgICB7ImFhY19hdF9xdWFsaXR5IiwgInF1YWxpdHkgdnMgc3BlZWQgY29udHJvbCIsIG9mZnNldG9mKEFURGVjb2RlQ29udGV4dCwgcXVhbGl0eSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMiwgQUV9LAorICAgIHsgTlVMTCB9LAorfTsKKworI2RlZmluZSBGRkFUX0VOQ19DTEFTUyhOQU1FKSBcCisgICAgc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmZhdF8jI05BTUUjI19lbmNfY2xhc3MgPSB7IFwKKyAgICAgICAgLmNsYXNzX25hbWUgPSAiYXRfIiAjTkFNRSAiX2VuYyIsIFwKKyAgICAgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgXAorICAgICAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsIFwKKyAgICAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsIFwKKyAgICB9OworCisjZGVmaW5lIEZGQVRfRU5DKE5BTUUsIElELCBQUk9GSUxFUywgLi4uKSBcCisgICAgRkZBVF9FTkNfQ0xBU1MoTkFNRSkgXAorICAgIEFWQ29kZWMgZmZfIyNOQU1FIyNfYXRfZW5jb2RlciA9IHsgXAorICAgICAgICAubmFtZSAgICAgICAgICAgPSAjTkFNRSAiX2F0IiwgXAorICAgICAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgjTkFNRSAiIChBdWRpb1Rvb2xib3gpIiksIFwKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLCBcCisgICAgICAgIC5pZCAgICAgICAgICAgICA9IElELCBcCisgICAgICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBVERlY29kZUNvbnRleHQpLCBcCisgICAgICAgIC5pbml0ICAgICAgICAgICA9IGZmYXRfaW5pdF9lbmNvZGVyLCBcCisgICAgICAgIC5jbG9zZSAgICAgICAgICA9IGZmYXRfY2xvc2VfZW5jb2RlciwgXAorICAgICAgICAuZW5jb2RlMiAgICAgICAgPSBmZmF0X2VuY29kZSwgXAorICAgICAgICAuZmx1c2ggICAgICAgICAgPSBmZmF0X2VuY29kZV9mbHVzaCwgXAorICAgICAgICAucHJpdl9jbGFzcyAgICAgPSAmZmZhdF8jI05BTUUjI19lbmNfY2xhc3MsIFwKKyAgICAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9ERUxBWSBfX1ZBX0FSR1NfXywgXAorICAgICAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IFwKKyAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LCBcCisgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX1U4LCAgQVZfU0FNUExFX0ZNVF9OT05FIFwKKyAgICAgICAgfSwgXAorICAgICAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLCBcCisgICAgICAgIC5wcm9maWxlcyAgICAgICA9IFBST0ZJTEVTLCBcCisgICAgICAgIC53cmFwcGVyX25hbWUgICA9ICJhdCIsIFwKKyAgICB9OworCitzdGF0aWMgY29uc3QgdWludDY0X3QgYWFjX2F0X2NoYW5uZWxfbGF5b3V0c1tdID0geworICAgIEFWX0NIX0xBWU9VVF9NT05PLAorICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5ELAorICAgIEFWX0NIX0xBWU9VVF80UE9JTlQwLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxLAorICAgIEFWX0NIX0xBWU9VVF82UE9JTlQwLAorICAgIEFWX0NIX0xBWU9VVF82UE9JTlQxLAorICAgIEFWX0NIX0xBWU9VVF83UE9JTlQwLAorICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREVfQkFDSywKKyAgICBBVl9DSF9MQVlPVVRfUVVBRCwKKyAgICBBVl9DSF9MQVlPVVRfT0NUQUdPTkFMLAorICAgIDAsCit9OworCitGRkFUX0VOQyhhYWMsICAgICAgICAgIEFWX0NPREVDX0lEX0FBQywgICAgICAgICAgYWFjX3Byb2ZpbGVzLCAsIC5jaGFubmVsX2xheW91dHMgPSBhYWNfYXRfY2hhbm5lbF9sYXlvdXRzKQorLy9GRkFUX0VOQyhhZHBjbV9pbWFfcXQsIEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVCwgTlVMTCkKK0ZGQVRfRU5DKGFsYWMsICAgICAgICAgQVZfQ09ERUNfSURfQUxBQywgICAgICAgICBOVUxMLCB8IEFWX0NPREVDX0NBUF9WQVJJQUJMRV9GUkFNRV9TSVpFIHwgQVZfQ09ERUNfQ0FQX0xPU1NMRVNTKQorRkZBVF9FTkMoaWxiYywgICAgICAgICBBVl9DT0RFQ19JRF9JTEJDLCAgICAgICAgIE5VTEwpCitGRkFUX0VOQyhwY21fYWxhdywgICAgIEFWX0NPREVDX0lEX1BDTV9BTEFXLCAgICAgTlVMTCkKK0ZGQVRfRU5DKHBjbV9tdWxhdywgICAgQVZfQ09ERUNfSURfUENNX01VTEFXLCAgICBOVUxMKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdXJhLmMgYi9saWJhdmNvZGVjL2F1cmEuYwppbmRleCA1Zjg0ZDk1Li41ZWY5MzE2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2F1cmEuYworKysgYi9saWJhdmNvZGVjL2F1cmEuYwpAQCAtMTA1LDQgKzEwNSw1IEBACiAgICAgLmluaXQgICAgICAgICAgID0gYXVyYV9kZWNvZGVfaW5pdCwKICAgICAuZGVjb2RlICAgICAgICAgPSBhdXJhX2RlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdmNvZGVjLmggYi9saWJhdmNvZGVjL2F2Y29kZWMuaAppbmRleCBkODQ5NzY1Li4wMTM5ZDcyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2F2Y29kZWMuaAorKysgYi9saWJhdmNvZGVjL2F2Y29kZWMuaApAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCkBAIC00Myw3ICs0NCw5IEBACiAjaW5jbHVkZSAidmVyc2lvbi5oIgogCiAvKioKLSAqIEBkZWZncm91cCBsaWJhdmMgRW5jb2RpbmcvRGVjb2RpbmcgTGlicmFyeQorICogQGRlZmdyb3VwIGxpYmF2YyBsaWJhdmNvZGVjCisgKiBFbmNvZGluZy9EZWNvZGluZyBMaWJyYXJ5CisgKgogICogQHsKICAqCiAgKiBAZGVmZ3JvdXAgbGF2Y19kZWNvZGluZyBEZWNvZGluZwpAQCAtNzAsNyArNzMsMTE4IEBACiAgKiBAewogICogQH0KICAqIEB9CisgKi8KKworLyoqCisgKiBAaW5ncm91cCBsaWJhdmMKKyAqIEBkZWZncm91cCBsYXZjX2VuY2RlYyBzZW5kL3JlY2VpdmUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIEFQSSBvdmVydmlldworICogQHsKICAqCisgKiBUaGUgYXZjb2RlY19zZW5kX3BhY2tldCgpL2F2Y29kZWNfcmVjZWl2ZV9mcmFtZSgpL2F2Y29kZWNfc2VuZF9mcmFtZSgpLworICogYXZjb2RlY19yZWNlaXZlX3BhY2tldCgpIGZ1bmN0aW9ucyBwcm92aWRlIGFuIGVuY29kZS9kZWNvZGUgQVBJLCB3aGljaAorICogZGVjb3VwbGVzIGlucHV0IGFuZCBvdXRwdXQuCisgKgorICogVGhlIEFQSSBpcyB2ZXJ5IHNpbWlsYXIgZm9yIGVuY29kaW5nL2RlY29kaW5nIGFuZCBhdWRpby92aWRlbywgYW5kIHdvcmtzIGFzCisgKiBmb2xsb3dzOgorICogLSBTZXQgdXAgYW5kIG9wZW4gdGhlIEFWQ29kZWNDb250ZXh0IGFzIHVzdWFsLgorICogLSBTZW5kIHZhbGlkIGlucHV0OgorICogICAtIEZvciBkZWNvZGluZywgY2FsbCBhdmNvZGVjX3NlbmRfcGFja2V0KCkgdG8gZ2l2ZSB0aGUgZGVjb2RlciByYXcKKyAqICAgICBjb21wcmVzc2VkIGRhdGEgaW4gYW4gQVZQYWNrZXQuCisgKiAgIC0gRm9yIGVuY29kaW5nLCBjYWxsIGF2Y29kZWNfc2VuZF9mcmFtZSgpIHRvIGdpdmUgdGhlIGVuY29kZXIgYW4gQVZGcmFtZQorICogICAgIGNvbnRhaW5pbmcgdW5jb21wcmVzc2VkIGF1ZGlvIG9yIHZpZGVvLgorICogICBJbiBib3RoIGNhc2VzLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0IEFWUGFja2V0cyBhbmQgQVZGcmFtZXMgYXJlCisgKiAgIHJlZmNvdW50ZWQsIG9yIGxpYmF2Y29kZWMgbWlnaHQgaGF2ZSB0byBjb3B5IHRoZSBpbnB1dCBkYXRhLiAobGliYXZmb3JtYXQKKyAqICAgYWx3YXlzIHJldHVybnMgcmVmY291bnRlZCBBVlBhY2tldHMsIGFuZCBhdl9mcmFtZV9nZXRfYnVmZmVyKCkgYWxsb2NhdGVzCisgKiAgIHJlZmNvdW50ZWQgQVZGcmFtZXMuKQorICogLSBSZWNlaXZlIG91dHB1dCBpbiBhIGxvb3AuIFBlcmlvZGljYWxseSBjYWxsIG9uZSBvZiB0aGUgYXZjb2RlY19yZWNlaXZlXyooKQorICogICBmdW5jdGlvbnMgYW5kIHByb2Nlc3MgdGhlaXIgb3V0cHV0OgorICogICAtIEZvciBkZWNvZGluZywgY2FsbCBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoKS4gT24gc3VjY2VzcywgaXQgd2lsbCByZXR1cm4KKyAqICAgICBhbiBBVkZyYW1lIGNvbnRhaW5pbmcgdW5jb21wcmVzc2VkIGF1ZGlvIG9yIHZpZGVvIGRhdGEuCisgKiAgIC0gRm9yIGVuY29kaW5nLCBjYWxsIGF2Y29kZWNfcmVjZWl2ZV9wYWNrZXQoKS4gT24gc3VjY2VzcywgaXQgd2lsbCByZXR1cm4KKyAqICAgICBhbiBBVlBhY2tldCB3aXRoIGEgY29tcHJlc3NlZCBmcmFtZS4KKyAqICAgUmVwZWF0IHRoaXMgY2FsbCB1bnRpbCBpdCByZXR1cm5zIEFWRVJST1IoRUFHQUlOKSBvciBhbiBlcnJvci4gVGhlCisgKiAgIEFWRVJST1IoRUFHQUlOKSByZXR1cm4gdmFsdWUgbWVhbnMgdGhhdCBuZXcgaW5wdXQgZGF0YSBpcyByZXF1aXJlZCB0bworICogICByZXR1cm4gbmV3IG91dHB1dC4gSW4gdGhpcyBjYXNlLCBjb250aW51ZSB3aXRoIHNlbmRpbmcgaW5wdXQuIEZvciBlYWNoCisgKiAgIGlucHV0IGZyYW1lL3BhY2tldCwgdGhlIGNvZGVjIHdpbGwgdHlwaWNhbGx5IHJldHVybiAxIG91dHB1dCBmcmFtZS9wYWNrZXQsCisgKiAgIGJ1dCBpdCBjYW4gYWxzbyBiZSAwIG9yIG1vcmUgdGhhbiAxLgorICoKKyAqIEF0IHRoZSBiZWdpbm5pbmcgb2YgZGVjb2Rpbmcgb3IgZW5jb2RpbmcsIHRoZSBjb2RlYyBtaWdodCBhY2NlcHQgbXVsdGlwbGUKKyAqIGlucHV0IGZyYW1lcy9wYWNrZXRzIHdpdGhvdXQgcmV0dXJuaW5nIGEgZnJhbWUsIHVudGlsIGl0cyBpbnRlcm5hbCBidWZmZXJzCisgKiBhcmUgZmlsbGVkLiBUaGlzIHNpdHVhdGlvbiBpcyBoYW5kbGVkIHRyYW5zcGFyZW50bHkgaWYgeW91IGZvbGxvdyB0aGUgc3RlcHMKKyAqIG91dGxpbmVkIGFib3ZlLgorICoKKyAqIEluIHRoZW9yeSwgc2VuZGluZyBpbnB1dCBjYW4gcmVzdWx0IGluIEVBR0FJTiAtIHRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IGlmCisgKiBub3QgYWxsIG91dHB1dCB3YXMgcmVjZWl2ZWQuIFlvdSBjYW4gdXNlIHRoaXMgdG8gc3RydWN0dXJlIGFsdGVybmF0aXZlIGRlY29kZQorICogb3IgZW5jb2RlIGxvb3BzIG90aGVyIHRoYW4gdGhlIG9uZSBzdWdnZXN0ZWQgYWJvdmUuIEZvciBleGFtcGxlLCB5b3UgY291bGQKKyAqIHRyeSBzZW5kaW5nIG5ldyBpbnB1dCBvbiBlYWNoIGl0ZXJhdGlvbiwgYW5kIHRyeSB0byByZWNlaXZlIG91dHB1dCBpZiB0aGF0CisgKiByZXR1cm5zIEVBR0FJTi4KKyAqCisgKiBFbmQgb2Ygc3RyZWFtIHNpdHVhdGlvbnMuIFRoZXNlIHJlcXVpcmUgImZsdXNoaW5nIiAoYWthIGRyYWluaW5nKSB0aGUgY29kZWMsCisgKiBhcyB0aGUgY29kZWMgbWlnaHQgYnVmZmVyIG11bHRpcGxlIGZyYW1lcyBvciBwYWNrZXRzIGludGVybmFsbHkgZm9yCisgKiBwZXJmb3JtYW5jZSBvciBvdXQgb2YgbmVjZXNzaXR5IChjb25zaWRlciBCLWZyYW1lcykuCisgKiBUaGlzIGlzIGhhbmRsZWQgYXMgZm9sbG93czoKKyAqIC0gSW5zdGVhZCBvZiB2YWxpZCBpbnB1dCwgc2VuZCBOVUxMIHRvIHRoZSBhdmNvZGVjX3NlbmRfcGFja2V0KCkgKGRlY29kaW5nKQorICogICBvciBhdmNvZGVjX3NlbmRfZnJhbWUoKSAoZW5jb2RpbmcpIGZ1bmN0aW9ucy4gVGhpcyB3aWxsIGVudGVyIGRyYWluaW5nCisgKiAgIG1vZGUuCisgKiAtIENhbGwgYXZjb2RlY19yZWNlaXZlX2ZyYW1lKCkgKGRlY29kaW5nKSBvciBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KCkKKyAqICAgKGVuY29kaW5nKSBpbiBhIGxvb3AgdW50aWwgQVZFUlJPUl9FT0YgaXMgcmV0dXJuZWQuIFRoZSBmdW5jdGlvbnMgd2lsbAorICogICBub3QgcmV0dXJuIEFWRVJST1IoRUFHQUlOKSwgdW5sZXNzIHlvdSBmb3Jnb3QgdG8gZW50ZXIgZHJhaW5pbmcgbW9kZS4KKyAqIC0gQmVmb3JlIGRlY29kaW5nIGNhbiBiZSByZXN1bWVkIGFnYWluLCB0aGUgY29kZWMgaGFzIHRvIGJlIHJlc2V0IHdpdGgKKyAqICAgYXZjb2RlY19mbHVzaF9idWZmZXJzKCkuCisgKgorICogVXNpbmcgdGhlIEFQSSBhcyBvdXRsaW5lZCBhYm92ZSBpcyBoaWdobHkgcmVjb21tZW5kZWQuIEJ1dCBpdCBpcyBhbHNvCisgKiBwb3NzaWJsZSB0byBjYWxsIGZ1bmN0aW9ucyBvdXRzaWRlIG9mIHRoaXMgcmlnaWQgc2NoZW1hLiBGb3IgZXhhbXBsZSwgeW91IGNhbgorICogY2FsbCBhdmNvZGVjX3NlbmRfcGFja2V0KCkgcmVwZWF0ZWRseSB3aXRob3V0IGNhbGxpbmcKKyAqIGF2Y29kZWNfcmVjZWl2ZV9mcmFtZSgpLiBJbiB0aGlzIGNhc2UsIGF2Y29kZWNfc2VuZF9wYWNrZXQoKSB3aWxsIHN1Y2NlZWQKKyAqIHVudGlsIHRoZSBjb2RlYydzIGludGVybmFsIGJ1ZmZlciBoYXMgYmVlbiBmaWxsZWQgdXAgKHdoaWNoIGlzIHR5cGljYWxseSBvZgorICogc2l6ZSAxIHBlciBvdXRwdXQgZnJhbWUsIGFmdGVyIGluaXRpYWwgaW5wdXQpLCBhbmQgdGhlbiByZWplY3QgaW5wdXQgd2l0aAorICogQVZFUlJPUihFQUdBSU4pLiBPbmNlIGl0IHN0YXJ0cyByZWplY3RpbmcgaW5wdXQsIHlvdSBoYXZlIG5vIGNob2ljZSBidXQgdG8KKyAqIHJlYWQgYXQgbGVhc3Qgc29tZSBvdXRwdXQuCisgKgorICogTm90IGFsbCBjb2RlY3Mgd2lsbCBmb2xsb3cgYSByaWdpZCBhbmQgcHJlZGljdGFibGUgZGF0YWZsb3c7IHRoZSBvbmx5CisgKiBndWFyYW50ZWUgaXMgdGhhdCBhbiBBVkVSUk9SKEVBR0FJTikgcmV0dXJuIHZhbHVlIG9uIGEgc2VuZC9yZWNlaXZlIGNhbGwgb24KKyAqIG9uZSBlbmQgaW1wbGllcyB0aGF0IGEgcmVjZWl2ZS9zZW5kIGNhbGwgb24gdGhlIG90aGVyIGVuZCB3aWxsIHN1Y2NlZWQsIG9yCisgKiBhdCBsZWFzdCB3aWxsIG5vdCBmYWlsIHdpdGggQVZFUlJPUihFQUdBSU4pLiBJbiBnZW5lcmFsLCBubyBjb2RlYyB3aWxsCisgKiBwZXJtaXQgdW5saW1pdGVkIGJ1ZmZlcmluZyBvZiBpbnB1dCBvciBvdXRwdXQuCisgKgorICogVGhpcyBBUEkgcmVwbGFjZXMgdGhlIGZvbGxvd2luZyBsZWdhY3kgZnVuY3Rpb25zOgorICogLSBhdmNvZGVjX2RlY29kZV92aWRlbzIoKSBhbmQgYXZjb2RlY19kZWNvZGVfYXVkaW80KCk6CisgKiAgIFVzZSBhdmNvZGVjX3NlbmRfcGFja2V0KCkgdG8gZmVlZCBpbnB1dCB0byB0aGUgZGVjb2RlciwgdGhlbiB1c2UKKyAqICAgYXZjb2RlY19yZWNlaXZlX2ZyYW1lKCkgdG8gcmVjZWl2ZSBkZWNvZGVkIGZyYW1lcyBhZnRlciBlYWNoIHBhY2tldC4KKyAqICAgVW5saWtlIHdpdGggdGhlIG9sZCB2aWRlbyBkZWNvZGluZyBBUEksIG11bHRpcGxlIGZyYW1lcyBtaWdodCByZXN1bHQgZnJvbQorICogICBhIHBhY2tldC4gRm9yIGF1ZGlvLCBzcGxpdHRpbmcgdGhlIGlucHV0IHBhY2tldCBpbnRvIGZyYW1lcyBieSBwYXJ0aWFsbHkKKyAqICAgZGVjb2RpbmcgcGFja2V0cyBiZWNvbWVzIHRyYW5zcGFyZW50IHRvIHRoZSBBUEkgdXNlci4gWW91IG5ldmVyIG5lZWQgdG8KKyAqICAgZmVlZCBhbiBBVlBhY2tldCB0byB0aGUgQVBJIHR3aWNlICh1bmxlc3MgaXQgaXMgcmVqZWN0ZWQgd2l0aCBBVkVSUk9SKEVBR0FJTikgLSB0aGVuCisgKiAgIG5vIGRhdGEgd2FzIHJlYWQgZnJvbSB0aGUgcGFja2V0KS4KKyAqICAgQWRkaXRpb25hbGx5LCBzZW5kaW5nIGEgZmx1c2gvZHJhaW5pbmcgcGFja2V0IGlzIHJlcXVpcmVkIG9ubHkgb25jZS4KKyAqIC0gYXZjb2RlY19lbmNvZGVfdmlkZW8yKCkvYXZjb2RlY19lbmNvZGVfYXVkaW8yKCk6CisgKiAgIFVzZSBhdmNvZGVjX3NlbmRfZnJhbWUoKSB0byBmZWVkIGlucHV0IHRvIHRoZSBlbmNvZGVyLCB0aGVuIHVzZQorICogICBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KCkgdG8gcmVjZWl2ZSBlbmNvZGVkIHBhY2tldHMuCisgKiAgIFByb3ZpZGluZyB1c2VyLWFsbG9jYXRlZCBidWZmZXJzIGZvciBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KCkgaXMgbm90CisgKiAgIHBvc3NpYmxlLgorICogLSBUaGUgbmV3IEFQSSBkb2VzIG5vdCBoYW5kbGUgc3VidGl0bGVzIHlldC4KKyAqCisgKiBNaXhpbmcgbmV3IGFuZCBvbGQgZnVuY3Rpb24gY2FsbHMgb24gdGhlIHNhbWUgQVZDb2RlY0NvbnRleHQgaXMgbm90IGFsbG93ZWQsCisgKiBhbmQgd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICoKKyAqIFNvbWUgY29kZWNzIG1pZ2h0IHJlcXVpcmUgdXNpbmcgdGhlIG5ldyBBUEk7IHVzaW5nIHRoZSBvbGQgQVBJIHdpbGwgcmV0dXJuCisgKiBhbiBlcnJvciB3aGVuIGNhbGxpbmcgaXQuIEFsbCBjb2RlY3Mgc3VwcG9ydCB0aGUgbmV3IEFQSS4KKyAqCisgKiBBIGNvZGVjIGlzIG5vdCBhbGxvd2VkIHRvIHJldHVybiBBVkVSUk9SKEVBR0FJTikgZm9yIGJvdGggc2VuZGluZyBhbmQgcmVjZWl2aW5nLiBUaGlzCisgKiB3b3VsZCBiZSBhbiBpbnZhbGlkIHN0YXRlLCB3aGljaCBjb3VsZCBwdXQgdGhlIGNvZGVjIHVzZXIgaW50byBhbiBlbmRsZXNzCisgKiBsb29wLiBUaGUgQVBJIGhhcyBubyBjb25jZXB0IG9mIHRpbWUgZWl0aGVyOiBpdCBjYW5ub3QgaGFwcGVuIHRoYXQgdHJ5aW5nIHRvCisgKiBkbyBhdmNvZGVjX3NlbmRfcGFja2V0KCkgcmVzdWx0cyBpbiBBVkVSUk9SKEVBR0FJTiksIGJ1dCBhIHJlcGVhdGVkIGNhbGwgMSBzZWNvbmQKKyAqIGxhdGVyIGFjY2VwdHMgdGhlIHBhY2tldCAod2l0aCBubyBvdGhlciByZWNlaXZlL2ZsdXNoIEFQSSBjYWxscyBpbnZvbHZlZCkuCisgKiBUaGUgQVBJIGlzIGEgc3RyaWN0IHN0YXRlIG1hY2hpbmUsIGFuZCB0aGUgcGFzc2FnZSBvZiB0aW1lIGlzIG5vdCBzdXBwb3NlZAorICogdG8gaW5mbHVlbmNlIGl0LiBTb21lIHRpbWluZy1kZXBlbmRlbnQgYmVoYXZpb3IgbWlnaHQgc3RpbGwgYmUgZGVlbWVkCisgKiBhY2NlcHRhYmxlIGluIGNlcnRhaW4gY2FzZXMuIEJ1dCBpdCBtdXN0IG5ldmVyIHJlc3VsdCBpbiBib3RoIHNlbmQvcmVjZWl2ZQorICogcmV0dXJuaW5nIEVBR0FJTiBhdCB0aGUgc2FtZSB0aW1lIGF0IGFueSBwb2ludC4gSXQgbXVzdCBhbHNvIGFic29sdXRlbHkgYmUKKyAqIGF2b2lkZWQgdGhhdCB0aGUgY3VycmVudCBzdGF0ZSBpcyAidW5zdGFibGUiIGFuZCBjYW4gImZsaXAtZmxvcCIgYmV0d2VlbgorICogdGhlIHNlbmQvcmVjZWl2ZSBBUElzIGFsbG93aW5nIHByb2dyZXNzLiBGb3IgZXhhbXBsZSwgaXQncyBub3QgYWxsb3dlZCB0aGF0CisgKiB0aGUgY29kZWMgcmFuZG9tbHkgZGVjaWRlcyB0aGF0IGl0IGFjdHVhbGx5IHdhbnRzIHRvIGNvbnN1bWUgYSBwYWNrZXQgbm93CisgKiBpbnN0ZWFkIG9mIHJldHVybmluZyBhIGZyYW1lLCBhZnRlciBpdCBqdXN0IHJldHVybmVkIEFWRVJST1IoRUFHQUlOKSBvbiBhbgorICogYXZjb2RlY19zZW5kX3BhY2tldCgpIGNhbGwuCisgKiBAfQogICovCiAKIC8qKgpAQCAtOTIsNyArMjA2LDcgQEAKICAqIGRldGFpbHMuCiAgKgogICogSWYgeW91IGFkZCBhIGNvZGVjIElEIHRvIHRoaXMgbGlzdCwgYWRkIGl0IHNvIHRoYXQKLSAqIDEuIG5vIHZhbHVlIG9mIGEgZXhpc3RpbmcgY29kZWMgSUQgY2hhbmdlcyAodGhhdCB3b3VsZCBicmVhayBBQkkpLAorICogMS4gbm8gdmFsdWUgb2YgYW4gZXhpc3RpbmcgY29kZWMgSUQgY2hhbmdlcyAodGhhdCB3b3VsZCBicmVhayBBQkkpLAogICogMi4gaXQgaXMgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gc2ltaWxhciBjb2RlY3MKICAqCiAgKiBBZnRlciBhZGRpbmcgbmV3IGNvZGVjIElEcywgZG8gbm90IGZvcmdldCB0byBhZGQgYW4gZW50cnkgdG8gdGhlIGNvZGVjCkBAIC0xMDQsOSArMjE4LDYgQEAKICAgICAvKiB2aWRlbyBjb2RlY3MgKi8KICAgICBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLAogICAgIEFWX0NPREVDX0lEX01QRUcyVklERU8sIC8vLzwgcHJlZmVycmVkIElEIGZvciBNUEVHLTEvMiB2aWRlbyBkZWNvZGluZwotI2lmIEZGX0FQSV9YVk1DCi0gICAgQVZfQ09ERUNfSURfTVBFRzJWSURFT19YVk1DLAotI2VuZGlmIC8qIEZGX0FQSV9YVk1DICovCiAgICAgQVZfQ09ERUNfSURfSDI2MSwKICAgICBBVl9DT0RFQ19JRF9IMjYzLAogICAgIEFWX0NPREVDX0lEX1JWMTAsCkBAIC0zMTYsNiArNDI3LDI1IEBACiAgICAgQVZfQ09ERUNfSURfQVBORywKICAgICBBVl9DT0RFQ19JRF9EQUFMQSwKICAgICBBVl9DT0RFQ19JRF9DRkhELAorICAgIEFWX0NPREVDX0lEX1RSVUVNT1RJT04yUlQsCisgICAgQVZfQ09ERUNfSURfTTEwMSwKKyAgICBBVl9DT0RFQ19JRF9NQUdJQ1lVViwKKyAgICBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLAorICAgIEFWX0NPREVDX0lEX1lMQywKKyAgICBBVl9DT0RFQ19JRF9QU0QsCisgICAgQVZfQ09ERUNfSURfUElYTEVULAorICAgIEFWX0NPREVDX0lEX1NQRUVESFEsCisgICAgQVZfQ09ERUNfSURfRk1WQywKKyAgICBBVl9DT0RFQ19JRF9TQ1BSLAorICAgIEFWX0NPREVDX0lEX0NMRUFSVklERU8sCisgICAgQVZfQ09ERUNfSURfWFBNLAorICAgIEFWX0NPREVDX0lEX0FWMSwKKyAgICBBVl9DT0RFQ19JRF9CSVRQQUNLRUQsCisgICAgQVZfQ09ERUNfSURfTVNDQywKKyAgICBBVl9DT0RFQ19JRF9TUkdDLAorICAgIEFWX0NPREVDX0lEX1NWRywKKyAgICBBVl9DT0RFQ19JRF9HRFYsCisgICAgQVZfQ09ERUNfSURfRklUUywKIAogICAgIC8qIHZhcmlvdXMgUENNICJjb2RlY3MiICovCiAgICAgQVZfQ09ERUNfSURfRklSU1RfQVVESU8gPSAweDEwMDAwLCAgICAgLy8vPCBBIGR1bW15IGlkIHBvaW50aW5nIGF0IHRoZSBzdGFydCBvZiBhdWRpbyBjb2RlY3MKQEAgLTM1MCw5ICs0ODAsMTEgQEAKICAgICBBVl9DT0RFQ19JRF9QQ01fUzI0TEVfUExBTkFSLAogICAgIEFWX0NPREVDX0lEX1BDTV9TMzJMRV9QTEFOQVIsCiAgICAgQVZfQ09ERUNfSURfUENNX1MxNkJFX1BMQU5BUiwKLSAgICAvKiBuZXcgUENNICJjb2RlY3MiIHNob3VsZCBiZSBhZGRlZCByaWdodCBiZWxvdyB0aGlzIGxpbmUgc3RhcnRpbmcgd2l0aAotICAgICAqIGFuIGV4cGxpY2l0IHZhbHVlIG9mIGZvciBleGFtcGxlIDB4MTA4MDAKLSAgICAgKi8KKworICAgIEFWX0NPREVDX0lEX1BDTV9TNjRMRSA9IDB4MTA4MDAsCisgICAgQVZfQ09ERUNfSURfUENNX1M2NEJFLAorICAgIEFWX0NPREVDX0lEX1BDTV9GMTZMRSwKKyAgICBBVl9DT0RFQ19JRF9QQ01fRjI0TEUsCiAKICAgICAvKiB2YXJpb3VzIEFEUENNIGNvZGVjcyAqLwogICAgIEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVCA9IDB4MTEwMDAsCkBAIC0zODYsOSArNTE4LDYgQEAKICAgICBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyLAogICAgIEFWX0NPREVDX0lEX0FEUENNX0lNQV9BUEMsCiAgICAgQVZfQ09ERUNfSURfQURQQ01fVklNQSwKLSNpZiBGRl9BUElfVklNQV9ERUNPREVSCi0gICAgQVZfQ09ERUNfSURfVklNQSA9IEFWX0NPREVDX0lEX0FEUENNX1ZJTUEsCi0jZW5kaWYKIAogICAgIEFWX0NPREVDX0lEX0FEUENNX0FGQyA9IDB4MTE4MDAsCiAgICAgQVZfQ09ERUNfSURfQURQQ01fSU1BX09LSSwKQEAgLTM5OCw2ICs1MjcsOCBAQAogICAgIEFWX0NPREVDX0lEX0FEUENNX1RIUF9MRSwKICAgICBBVl9DT0RFQ19JRF9BRFBDTV9QU1gsCiAgICAgQVZfQ09ERUNfSURfQURQQ01fQUlDQSwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREFUNCwKKyAgICBBVl9DT0RFQ19JRF9BRFBDTV9NVEFGLAogCiAgICAgLyogQU1SICovCiAgICAgQVZfQ09ERUNfSURfQU1SX05CID0gMHgxMjAwMCwKQEAgLTQxNCw2ICs1NDUsNyBAQAogICAgIEFWX0NPREVDX0lEX1NPTF9EUENNLAogCiAgICAgQVZfQ09ERUNfSURfU0RYMl9EUENNID0gMHgxNDgwMCwKKyAgICBBVl9DT0RFQ19JRF9HUkVNTElOX0RQQ00sCiAKICAgICAvKiBhdWRpbyBjb2RlY3MgKi8KICAgICBBVl9DT0RFQ19JRF9NUDIgPSAweDE1MDAwLApAQCAtNDQ4LDkgKzU4MCw2IEBACiAgICAgQVZfQ09ERUNfSURfTUxQLAogICAgIEFWX0NPREVDX0lEX0dTTV9NUywgLyogYXMgZm91bmQgaW4gV0FWICovCiAgICAgQVZfQ09ERUNfSURfQVRSQUMzLAotI2lmIEZGX0FQSV9WT1hXQVJFCi0gICAgQVZfQ09ERUNfSURfVk9YV0FSRSwKLSNlbmRpZgogICAgIEFWX0NPREVDX0lEX0FQRSwKICAgICBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSLAogICAgIEFWX0NPREVDX0lEX01VU0VQQUNLOCwKQEAgLTQ4Niw2ICs2MTUsNyBAQAogICAgIEFWX0NPREVDX0lEX1BBRl9BVURJTywKICAgICBBVl9DT0RFQ19JRF9PTjJBVkMsCiAgICAgQVZfQ09ERUNfSURfRFNTX1NQLAorICAgIEFWX0NPREVDX0lEX0NPREVDMiwKIAogICAgIEFWX0NPREVDX0lEX0ZGV0FWRVNZTlRIID0gMHgxNTgwMCwKICAgICBBVl9DT0RFQ19JRF9TT05JQywKQEAgLTUwMCw2ICs2MzAsMTMgQEAKICAgICBBVl9DT0RFQ19JRF9JTlRFUlBMQVlfQUNNLAogICAgIEFWX0NPREVDX0lEX1hNQTEsCiAgICAgQVZfQ09ERUNfSURfWE1BMiwKKyAgICBBVl9DT0RFQ19JRF9EU1QsCisgICAgQVZfQ09ERUNfSURfQVRSQUMzQUwsCisgICAgQVZfQ09ERUNfSURfQVRSQUMzUEFMLAorICAgIEFWX0NPREVDX0lEX0RPTEJZX0UsCisgICAgQVZfQ09ERUNfSURfQVBUWCwKKyAgICBBVl9DT0RFQ19JRF9BUFRYX0hELAorICAgIEFWX0NPREVDX0lEX1NCQywKIAogICAgIC8qIHN1YnRpdGxlIGNvZGVjcyAqLwogICAgIEFWX0NPREVDX0lEX0ZJUlNUX1NVQlRJVExFID0gMHgxNzAwMCwgICAgICAgICAgLy8vPCBBIGR1bW15IElEIHBvaW50aW5nIGF0IHRoZSBzdGFydCBvZiBzdWJ0aXRsZSBjb2RlY3MuCkBAIC01MzMsNiArNjcwLDcgQEAKICAgICBBVl9DT0RFQ19JRF9GSVJTVF9VTktOT1dOID0gMHgxODAwMCwgICAgICAgICAgIC8vLzwgQSBkdW1teSBJRCBwb2ludGluZyBhdCB0aGUgc3RhcnQgb2YgdmFyaW91cyBmYWtlIGNvZGVjcy4KICAgICBBVl9DT0RFQ19JRF9UVEYgPSAweDE4MDAwLAogCisgICAgQVZfQ09ERUNfSURfU0NURV8zNSwgLy8vPCBDb250YWluIHRpbWVzdGFtcCBlc3RpbWF0ZWQgdGhyb3VnaCBQQ1Igb2YgcHJvZ3JhbSBzdHJlYW0uCiAgICAgQVZfQ09ERUNfSURfQklOVEVYVCAgICA9IDB4MTg4MDAsCiAgICAgQVZfQ09ERUNfSURfWEJJTiwKICAgICBBVl9DT0RFQ19JRF9JREYsCkBAIC01OTAsNyArNzI4LDcgQEAKIAogLyoqCiAgKiBDb2RlYyB1c2VzIG9ubHkgaW50cmEgY29tcHJlc3Npb24uCi0gKiBWaWRlbyBjb2RlY3Mgb25seS4KKyAqIFZpZGVvIGFuZCBhdWRpbyBjb2RlY3Mgb25seS4KICAqLwogI2RlZmluZSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgICAgKDEgPDwgMCkKIC8qKgpAQCAtNjMyLDcgKzc3MCw3IEBACiAgKiBOb3RlOiBJZiB0aGUgZmlyc3QgMjMgYml0cyBvZiB0aGUgYWRkaXRpb25hbCBieXRlcyBhcmUgbm90IDAsIHRoZW4gZGFtYWdlZAogICogTVBFRyBiaXRzdHJlYW1zIGNvdWxkIGNhdXNlIG92ZXJyZWFkIGFuZCBzZWdmYXVsdC4KICAqLwotI2RlZmluZSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIDMyCisjZGVmaW5lIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgNjQKIAogLyoqCiAgKiBAaW5ncm91cCBsYXZjX2VuY29kaW5nCkBAIC02NDEsMzggKzc3OSw2IEBACiAgKi8KICNkZWZpbmUgQVZfSU5QVVRfQlVGRkVSX01JTl9TSVpFIDE2Mzg0CiAKLSNpZiBGRl9BUElfV0lUSE9VVF9QUkVGSVgKLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgaW5zdGVhZAotICovCi0jZGVmaW5lIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgMzIKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgQVZfSU5QVVRfQlVGRkVSX01JTl9TSVpFIGluc3RlYWQKLSAqLwotI2RlZmluZSBGRl9NSU5fQlVGRkVSX1NJWkUgMTYzODQKLSNlbmRpZiAvKiBGRl9BUElfV0lUSE9VVF9QUkVGSVggKi8KLQotLyoqCi0gKiBAaW5ncm91cCBsYXZjX2VuY29kaW5nCi0gKiBtb3Rpb24gZXN0aW1hdGlvbiB0eXBlLgotICogQGRlcHJlY2F0ZWQgdXNlIGNvZGVjIHByaXZhdGUgb3B0aW9uIGluc3RlYWQKLSAqLwotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi1lbnVtIE1vdGlvbl9Fc3RfSUQgewotICAgIE1FX1pFUk8gPSAxLCAgICAvLy88IG5vIHNlYXJjaCwgdGhhdCBpcyB1c2UgMCwwIHZlY3RvciB3aGVuZXZlciBvbmUgaXMgbmVlZGVkCi0gICAgTUVfRlVMTCwKLSAgICBNRV9MT0csCi0gICAgTUVfUEhPRFMsCi0gICAgTUVfRVBaUywgICAgICAgIC8vLzwgZW5oYW5jZWQgcHJlZGljdGl2ZSB6b25hbCBzZWFyY2gKLSAgICBNRV9YMSwgICAgICAgICAgLy8vPCByZXNlcnZlZCBmb3IgZXhwZXJpbWVudHMKLSAgICBNRV9IRVgsICAgICAgICAgLy8vPCBoZXhhZ29uIGJhc2VkIHNlYXJjaAotICAgIE1FX1VNSCwgICAgICAgICAvLy88IHVuZXZlbiBtdWx0aS1oZXhhZ29uIHNlYXJjaAotICAgIE1FX1RFU0EsICAgICAgICAvLy88IHRyYW5zZm9ybWVkIGV4aGF1c3RpdmUgc2VhcmNoIGFsZ29yaXRobQotICAgIE1FX0lURVI9NTAsICAgICAvLy88IGl0ZXJhdGl2ZSBzZWFyY2gKLX07Ci0jZW5kaWYKLQogLyoqCiAgKiBAaW5ncm91cCBsYXZjX2RlY29kaW5nCiAgKi8KQEAgLTcxMSwxMyArODE3LDYgQEAKICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvcjsKIH0gUmNPdmVycmlkZTsKIAotI2lmIEZGX0FQSV9NQVhfQkZSQU1FUwotLyoqCi0gKiBAZGVwcmVjYXRlZCB0aGVyZSBpcyBubyBsaWJhdmNvZGVjLXdpZGUgbGltaXQgb24gdGhlIG51bWJlciBvZiBCLWZyYW1lcwotICovCi0jZGVmaW5lIEZGX01BWF9CX0ZSQU1FUyAxNgotI2VuZGlmCi0KIC8qIGVuY29kaW5nIHN1cHBvcnQKICAgIFRoZXNlIGZsYWdzIGNhbiBiZSBwYXNzZWQgaW4gQVZDb2RlY0NvbnRleHQuZmxhZ3MgYmVmb3JlIGluaXRpYWxpemF0aW9uLgogICAgTm90ZTogTm90IGV2ZXJ5dGhpbmcgaXMgc3VwcG9ydGVkIHlldC4KQEAgLTc4NSw3ICs4ODQsNyBAQAogICogVXNlIG9ubHkgYml0ZXhhY3Qgc3R1ZmYgKGV4Y2VwdCAoSSlEQ1QpLgogICovCiAjZGVmaW5lIEFWX0NPREVDX0ZMQUdfQklURVhBQ1QgICAgICAgICgxIDw8IDIzKQotLyogRnggOiBGbGFnIGZvciBoMjYzKyBleHRyYSBvcHRpb25zICovCisvKiBGeCA6IEZsYWcgZm9yIEguMjYzKyBleHRyYSBvcHRpb25zICovCiAvKioKICAqIEguMjYzIGFkdmFuY2VkIGludHJhIGNvZGluZyAvIE1QRUctNCBBQyBwcmVkaWN0aW9uCiAgKi8KQEAgLTgzNiw2ICs5MzUsMTAgQEAKICAqIERvIG5vdCBza2lwIHNhbXBsZXMgYW5kIGV4cG9ydCBza2lwIGluZm9ybWF0aW9uIGFzIGZyYW1lIHNpZGUgZGF0YQogICovCiAjZGVmaW5lIEFWX0NPREVDX0ZMQUcyX1NLSVBfTUFOVUFMICAgICgxIDw8IDI5KQorLyoqCisgKiBEbyBub3QgcmVzZXQgQVNTIFJlYWRPcmRlciBmaWVsZCBvbiBmbHVzaCAoc3VidGl0bGVzIGRlY29kaW5nKQorICovCisjZGVmaW5lIEFWX0NPREVDX0ZMQUcyX1JPX0ZMVVNIX05PT1AgICgxIDw8IDMwKQogCiAvKiBVbnN1cHBvcnRlZCBvcHRpb25zIDoKICAqICAgICAgICAgICAgICBTeW50YXggQXJpdGhtZXRpYyBjb2RpbmcgKFNBQykKQEAgLTg4NSwyMCArOTg4LDEzIEBACiAgKi8KICNkZWZpbmUgQVZfQ09ERUNfQ0FQX1NNQUxMX0xBU1RfRlJBTUUgICAgKDEgPDwgIDYpCiAKLSNpZiBGRl9BUElfQ0FQX1ZEUEFVCi0vKioKLSAqIENvZGVjIGNhbiBleHBvcnQgZGF0YSBmb3IgSFcgZGVjb2RpbmcgKFZEUEFVKS4KLSAqLwotI2RlZmluZSBBVl9DT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSAgICAgICAoMSA8PCAgNykKLSNlbmRpZgotCiAvKioKICAqIENvZGVjIGNhbiBvdXRwdXQgbXVsdGlwbGUgZnJhbWVzIHBlciBBVlBhY2tldAogICogTm9ybWFsbHkgZGVtdXhlcnMgcmV0dXJuIG9uZSBmcmFtZSBhdCBhIHRpbWUsIGRlbXV4ZXJzIHdoaWNoIGRvIG5vdCBkbwogICogYXJlIGNvbm5lY3RlZCB0byBhIHBhcnNlciB0byBzcGxpdCB3aGF0IHRoZXkgcmV0dXJuIGludG8gcHJvcGVyIGZyYW1lcy4KICAqIFRoaXMgZmxhZyBpcyByZXNlcnZlZCB0byB0aGUgdmVyeSByYXJlIGNhdGVnb3J5IG9mIGNvZGVjcyB3aGljaCBoYXZlIGEKICAqIGJpdHN0cmVhbSB0aGF0IGNhbm5vdCBiZSBzcGxpdCBpbnRvIGZyYW1lcyB3aXRob3V0IHRpbWVjb25zdW1pbmcKLSAqIG9wZXJhdGlvbnMgbGlrZSBmdWxsIGRlY29kaW5nLiBEZW11eGVycyBjYXJyaW5nIHN1Y2ggYml0c3RyZWFtcyB0aHVzCisgKiBvcGVyYXRpb25zIGxpa2UgZnVsbCBkZWNvZGluZy4gRGVtdXhlcnMgY2Fycnlpbmcgc3VjaCBiaXRzdHJlYW1zIHRodXMKICAqIG1heSByZXR1cm4gbXVsdGlwbGUgZnJhbWVzIGluIGEgcGFja2V0LiBUaGlzIGhhcyBtYW55IGRpc2FkdmFudGFnZXMgbGlrZQogICogcHJvaGliaXRpbmcgc3RyZWFtIGNvcHkgaW4gbWFueSBjYXNlcyB0aHVzIGl0IHNob3VsZCBvbmx5IGJlIGNvbnNpZGVyZWQKICAqIGFzIGEgbGFzdCByZXNvcnQuCkBAIC05MzQsNiArMTAzMCwxNiBAQAogICovCiAjZGVmaW5lIEFWX0NPREVDX0NBUF9WQVJJQUJMRV9GUkFNRV9TSVpFICgxIDw8IDE2KQogLyoqCisgKiBEZWNvZGVyIGlzIG5vdCBhIHByZWZlcnJlZCBjaG9pY2UgZm9yIHByb2JpbmcuCisgKiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBkZWNvZGVyIGlzIG5vdCBhIGdvb2QgY2hvaWNlIGZvciBwcm9iaW5nLgorICogSXQgY291bGQgZm9yIGV4YW1wbGUgYmUgYW4gZXhwZW5zaXZlIHRvIHNwaW4gdXAgaGFyZHdhcmUgZGVjb2RlciwKKyAqIG9yIGl0IGNvdWxkIHNpbXBseSBub3QgcHJvdmlkZSBhIGxvdCBvZiB1c2VmdWwgaW5mb3JtYXRpb24gYWJvdXQKKyAqIHRoZSBzdHJlYW0uCisgKiBBIGRlY29kZXIgbWFya2VkIHdpdGggdGhpcyBmbGFnIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgbGFzdCByZXNvcnQKKyAqIGNob2ljZSBmb3IgcHJvYmluZy4KKyAqLworI2RlZmluZSBBVl9DT0RFQ19DQVBfQVZPSURfUFJPQklORyAgICAgICAoMSA8PCAxNykKKy8qKgogICogQ29kZWMgaXMgaW50cmEgb25seS4KICAqLwogI2RlZmluZSBBVl9DT0RFQ19DQVBfSU5UUkFfT05MWSAgICAgICAweDQwMDAwMDAwCkBAIC05NDIsMjMxICsxMDQ4LDI2IEBACiAgKi8KICNkZWZpbmUgQVZfQ09ERUNfQ0FQX0xPU1NMRVNTICAgICAgICAgMHg4MDAwMDAwMAogCi0KLSNpZiBGRl9BUElfV0lUSE9VVF9QUkVGSVgKIC8qKgotICogQWxsb3cgZGVjb2RlcnMgdG8gcHJvZHVjZSBmcmFtZXMgd2l0aCBkYXRhIHBsYW5lcyB0aGF0IGFyZSBub3QgYWxpZ25lZAotICogdG8gQ1BVIHJlcXVpcmVtZW50cyAoZS5nLiBkdWUgdG8gY3JvcHBpbmcpLgorICogQ29kZWMgaXMgYmFja2VkIGJ5IGEgaGFyZHdhcmUgaW1wbGVtZW50YXRpb24uIFR5cGljYWxseSB1c2VkIHRvCisgKiBpZGVudGlmeSBhIG5vbi1od2FjY2VsIGhhcmR3YXJlIGRlY29kZXIuIEZvciBpbmZvcm1hdGlvbiBhYm91dCBod2FjY2VscywgdXNlCisgKiBhdmNvZGVjX2dldF9od19jb25maWcoKSBpbnN0ZWFkLgogICovCi0jZGVmaW5lIENPREVDX0ZMQUdfVU5BTElHTkVEIEFWX0NPREVDX0ZMQUdfVU5BTElHTkVECi0jZGVmaW5lIENPREVDX0ZMQUdfUVNDQUxFIEFWX0NPREVDX0ZMQUdfUVNDQUxFCi0jZGVmaW5lIENPREVDX0ZMQUdfNE1WICAgIEFWX0NPREVDX0ZMQUdfNE1WCi0jZGVmaW5lIENPREVDX0ZMQUdfT1VUUFVUX0NPUlJVUFQgQVZfQ09ERUNfRkxBR19PVVRQVVRfQ09SUlVQVAotI2RlZmluZSBDT0RFQ19GTEFHX1FQRUwgICBBVl9DT0RFQ19GTEFHX1FQRUwKLSNpZiBGRl9BUElfR01DCi0vKioKLSAqIEBkZXByZWNhdGVkIHVzZSB0aGUgImdtYyIgcHJpdmF0ZSBvcHRpb24gb2YgdGhlIGxpYnh2aWQgZW5jb2RlcgotICovCi0jZGVmaW5lIENPREVDX0ZMQUdfR01DICAgIDB4MDAyMCAgLy8vPCBVc2UgR01DLgotI2VuZGlmCi0jaWYgRkZfQVBJX01WMAotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgdGhlIGZsYWcgIm12MCIgaW4gdGhlICJtcHZfZmxhZ3MiIHByaXZhdGUgb3B0aW9uIG9mIHRoZQotICogbXBlZ3ZpZGVvIGVuY29kZXJzCi0gKi8KLSNkZWZpbmUgQ09ERUNfRkxBR19NVjAgICAgMHgwMDQwCi0jZW5kaWYKLSNpZiBGRl9BUElfSU5QVVRfUFJFU0VSVkVECi0vKioKLSAqIEBkZXByZWNhdGVkIHBhc3NpbmcgcmVmZXJlbmNlLWNvdW50ZWQgZnJhbWVzIHRvIHRoZSBlbmNvZGVycyByZXBsYWNlcyB0aGlzCi0gKiBmbGFnCi0gKi8KLSNkZWZpbmUgQ09ERUNfRkxBR19JTlBVVF9QUkVTRVJWRUQgMHgwMTAwCi0jZW5kaWYKLSNkZWZpbmUgQ09ERUNfRkxBR19QQVNTMSAgICAgICAgICAgQVZfQ09ERUNfRkxBR19QQVNTMQotI2RlZmluZSBDT0RFQ19GTEFHX1BBU1MyICAgICAgICAgICBBVl9DT0RFQ19GTEFHX1BBU1MyCi0jZGVmaW5lIENPREVDX0ZMQUdfR1JBWSAgICAgICAgICAgIEFWX0NPREVDX0ZMQUdfR1JBWQotI2lmIEZGX0FQSV9FTVVfRURHRQotLyoqCi0gKiBAZGVwcmVjYXRlZCBlZGdlcyBhcmUgbm90IHVzZWQvcmVxdWlyZWQgYW55bW9yZS4gSS5lLiB0aGlzIGZsYWcgaXMgbm93IGFsd2F5cwotICogc2V0LgotICovCi0jZGVmaW5lIENPREVDX0ZMQUdfRU1VX0VER0UgICAgICAgIDB4NDAwMAotI2VuZGlmCi0jZGVmaW5lIENPREVDX0ZMQUdfUFNOUiAgICAgICAgICAgIEFWX0NPREVDX0ZMQUdfUFNOUgotI2RlZmluZSBDT0RFQ19GTEFHX1RSVU5DQVRFRCAgICAgICBBVl9DT0RFQ19GTEFHX1RSVU5DQVRFRAotCi0jaWYgRkZfQVBJX05PUk1BTElaRV9BUVAKLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBmbGFnICJuYXEiIGluIHRoZSAibXB2X2ZsYWdzIiBwcml2YXRlIG9wdGlvbiBvZiB0aGUKLSAqIG1wZWd2aWRlbyBlbmNvZGVycwotICovCi0jZGVmaW5lIENPREVDX0ZMQUdfTk9STUFMSVpFX0FRUCAgMHgwMDAyMDAwMAotI2VuZGlmCi0jZGVmaW5lIENPREVDX0ZMQUdfSU5URVJMQUNFRF9EQ1QgQVZfQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVAotI2RlZmluZSBDT0RFQ19GTEFHX0xPV19ERUxBWSAgICAgIEFWX0NPREVDX0ZMQUdfTE9XX0RFTEFZCi0jZGVmaW5lIENPREVDX0ZMQUdfR0xPQkFMX0hFQURFUiAgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSCi0jZGVmaW5lIENPREVDX0ZMQUdfQklURVhBQ1QgICAgICAgQVZfQ09ERUNfRkxBR19CSVRFWEFDVAotI2RlZmluZSBDT0RFQ19GTEFHX0FDX1BSRUQgICAgICAgIEFWX0NPREVDX0ZMQUdfQUNfUFJFRAotI2RlZmluZSBDT0RFQ19GTEFHX0xPT1BfRklMVEVSICAgIEFWX0NPREVDX0ZMQUdfTE9PUF9GSUxURVIKLSNkZWZpbmUgQ09ERUNfRkxBR19JTlRFUkxBQ0VEX01FICBBVl9DT0RFQ19GTEFHX0lOVEVSTEFDRURfTUUKLSNkZWZpbmUgQ09ERUNfRkxBR19DTE9TRURfR09QICAgICBBVl9DT0RFQ19GTEFHX0NMT1NFRF9HT1AKLSNkZWZpbmUgQ09ERUNfRkxBRzJfRkFTVCAgICAgICAgICBBVl9DT0RFQ19GTEFHMl9GQVNUCi0jZGVmaW5lIENPREVDX0ZMQUcyX05PX09VVFBVVCAgICAgQVZfQ09ERUNfRkxBRzJfTk9fT1VUUFVUCi0jZGVmaW5lIENPREVDX0ZMQUcyX0xPQ0FMX0hFQURFUiAgQVZfQ09ERUNfRkxBRzJfTE9DQUxfSEVBREVSCi0jZGVmaW5lIENPREVDX0ZMQUcyX0RST1BfRlJBTUVfVElNRUNPREUgQVZfQ09ERUNfRkxBRzJfRFJPUF9GUkFNRV9USU1FQ09ERQotI2RlZmluZSBDT0RFQ19GTEFHMl9JR05PUkVfQ1JPUCAgIEFWX0NPREVDX0ZMQUcyX0lHTk9SRV9DUk9QCi0KLSNkZWZpbmUgQ09ERUNfRkxBRzJfQ0hVTktTICAgICAgICBBVl9DT0RFQ19GTEFHMl9DSFVOS1MKLSNkZWZpbmUgQ09ERUNfRkxBRzJfU0hPV19BTEwgICAgICBBVl9DT0RFQ19GTEFHMl9TSE9XX0FMTAotI2RlZmluZSBDT0RFQ19GTEFHMl9FWFBPUlRfTVZTICAgIEFWX0NPREVDX0ZMQUcyX0VYUE9SVF9NVlMKLSNkZWZpbmUgQ09ERUNfRkxBRzJfU0tJUF9NQU5VQUwgICBBVl9DT0RFQ19GTEFHMl9TS0lQX01BTlVBTAotCi0vKiBVbnN1cHBvcnRlZCBvcHRpb25zIDoKLSAqICAgICAgICAgICAgICBTeW50YXggQXJpdGhtZXRpYyBjb2RpbmcgKFNBQykKLSAqICAgICAgICAgICAgICBSZWZlcmVuY2UgUGljdHVyZSBTZWxlY3Rpb24KLSAqICAgICAgICAgICAgICBJbmRlcGVuZGVudCBTZWdtZW50IERlY29kaW5nICovCi0vKiAvRnggKi8KLS8qIGNvZGVjIGNhcGFiaWxpdGllcyAqLwotCi0jZGVmaW5lIENPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCAvLy88IERlY29kZXIgY2FuIHVzZSBkcmF3X2hvcml6X2JhbmQgY2FsbGJhY2suCi0vKioKLSAqIENvZGVjIHVzZXMgZ2V0X2J1ZmZlcigpIGZvciBhbGxvY2F0aW5nIGJ1ZmZlcnMgYW5kIHN1cHBvcnRzIGN1c3RvbSBhbGxvY2F0b3JzLgotICogSWYgbm90IHNldCwgaXQgbWlnaHQgbm90IHVzZSBnZXRfYnVmZmVyKCkgYXQgYWxsIG9yIHVzZSBvcGVyYXRpb25zIHRoYXQKLSAqIGFzc3VtZSB0aGUgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgYnkgYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIuCi0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX0RSMSAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfRFIxCi0jZGVmaW5lIENPREVDX0NBUF9UUlVOQ0FURUQgICAgICAgQVZfQ09ERUNfQ0FQX1RSVU5DQVRFRAotI2lmIEZGX0FQSV9YVk1DCi0vKiBDb2RlYyBjYW4gZXhwb3J0IGRhdGEgZm9yIEhXIGRlY29kaW5nLiBUaGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQKLSAqIHRoZSBjb2RlYyB3b3VsZCBjYWxsIGdldF9mb3JtYXQoKSB3aXRoIGxpc3QgdGhhdCBtaWdodCBjb250YWluIEhXIGFjY2VsZXJhdGVkCi0gKiBwaXhlbCBmb3JtYXRzIChYdk1DLCBWRFBBVSwgVkFBUEksIGV0YykuIFRoZSBhcHBsaWNhdGlvbiBjYW4gcGljayBhbnkgb2YgdGhlbQotICogaW5jbHVkaW5nIHJhdyBpbWFnZSBmb3JtYXQuCi0gKiBUaGUgYXBwbGljYXRpb24gY2FuIHVzZSB0aGUgcGFzc2VkIGNvbnRleHQgdG8gZGV0ZXJtaW5lIGJpdHN0cmVhbSB2ZXJzaW9uLAotICogY2hyb21hIGZvcm1hdCwgcmVzb2x1dGlvbiBldGMuCi0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX0hXQUNDRUwgICAgICAgICAweDAwMTAKLSNlbmRpZiAvKiBGRl9BUElfWFZNQyAqLwotLyoqCi0gKiBFbmNvZGVyIG9yIGRlY29kZXIgcmVxdWlyZXMgZmx1c2hpbmcgd2l0aCBOVUxMIGlucHV0IGF0IHRoZSBlbmQgaW4gb3JkZXIgdG8KLSAqIGdpdmUgdGhlIGNvbXBsZXRlIGFuZCBjb3JyZWN0IG91dHB1dC4KLSAqCi0gKiBOT1RFOiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgdGhlIGNvZGVjIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgZmVkIHdpdGgKLSAqICAgICAgIHdpdGggTlVMTCBkYXRhLiBUaGUgdXNlciBjYW4gc3RpbGwgc2VuZCBOVUxMIGRhdGEgdG8gdGhlIHB1YmxpYyBlbmNvZGUKLSAqICAgICAgIG9yIGRlY29kZSBmdW5jdGlvbiwgYnV0IGxpYmF2Y29kZWMgd2lsbCBub3QgcGFzcyBpdCBhbG9uZyB0byB0aGUgY29kZWMKLSAqICAgICAgIHVubGVzcyB0aGlzIGZsYWcgaXMgc2V0LgotICoKLSAqIERlY29kZXJzOgotICogVGhlIGRlY29kZXIgaGFzIGEgbm9uLXplcm8gZGVsYXkgYW5kIG5lZWRzIHRvIGJlIGZlZCB3aXRoIGF2cGt0LT5kYXRhPU5VTEwsCi0gKiBhdnBrdC0+c2l6ZT0wIGF0IHRoZSBlbmQgdG8gZ2V0IHRoZSBkZWxheWVkIGRhdGEgdW50aWwgdGhlIGRlY29kZXIgbm8gbG9uZ2VyCi0gKiByZXR1cm5zIGZyYW1lcy4KLSAqCi0gKiBFbmNvZGVyczoKLSAqIFRoZSBlbmNvZGVyIG5lZWRzIHRvIGJlIGZlZCB3aXRoIE5VTEwgZGF0YSBhdCB0aGUgZW5kIG9mIGVuY29kaW5nIHVudGlsIHRoZQotICogZW5jb2RlciBubyBsb25nZXIgcmV0dXJucyBkYXRhLgotICoKLSAqIE5PVEU6IEZvciBlbmNvZGVycyBpbXBsZW1lbnRpbmcgdGhlIEFWQ29kZWMuZW5jb2RlMigpIGZ1bmN0aW9uLCBzZXR0aW5nIHRoaXMKLSAqICAgICAgIGZsYWcgYWxzbyBtZWFucyB0aGF0IHRoZSBlbmNvZGVyIG11c3Qgc2V0IHRoZSBwdHMgYW5kIGR1cmF0aW9uIGZvcgotICogICAgICAgZWFjaCBvdXRwdXQgcGFja2V0LiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgdGhlIHB0cyBhbmQgZHVyYXRpb24gd2lsbAotICogICAgICAgYmUgZGV0ZXJtaW5lZCBieSBsaWJhdmNvZGVjIGZyb20gdGhlIGlucHV0IGZyYW1lLgotICovCi0jZGVmaW5lIENPREVDX0NBUF9ERUxBWSAgICAgICAgICAgQVZfQ09ERUNfQ0FQX0RFTEFZCi0vKioKLSAqIENvZGVjIGNhbiBiZSBmZWQgYSBmaW5hbCBmcmFtZSB3aXRoIGEgc21hbGxlciBzaXplLgotICogVGhpcyBjYW4gYmUgdXNlZCB0byBwcmV2ZW50IHRydW5jYXRpb24gb2YgdGhlIGxhc3QgYXVkaW8gc2FtcGxlcy4KLSAqLwotI2RlZmluZSBDT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSBBVl9DT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRQotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLS8qKgotICogQ29kZWMgY2FuIGV4cG9ydCBkYXRhIGZvciBIVyBkZWNvZGluZyAoVkRQQVUpLgotICovCi0jZGVmaW5lIENPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVICAgIEFWX0NPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVCi0jZW5kaWYKLS8qKgotICogQ29kZWMgY2FuIG91dHB1dCBtdWx0aXBsZSBmcmFtZXMgcGVyIEFWUGFja2V0Ci0gKiBOb3JtYWxseSBkZW11eGVycyByZXR1cm4gb25lIGZyYW1lIGF0IGEgdGltZSwgZGVtdXhlcnMgd2hpY2ggZG8gbm90IGRvCi0gKiBhcmUgY29ubmVjdGVkIHRvIGEgcGFyc2VyIHRvIHNwbGl0IHdoYXQgdGhleSByZXR1cm4gaW50byBwcm9wZXIgZnJhbWVzLgotICogVGhpcyBmbGFnIGlzIHJlc2VydmVkIHRvIHRoZSB2ZXJ5IHJhcmUgY2F0ZWdvcnkgb2YgY29kZWNzIHdoaWNoIGhhdmUgYQotICogYml0c3RyZWFtIHRoYXQgY2Fubm90IGJlIHNwbGl0IGludG8gZnJhbWVzIHdpdGhvdXQgdGltZWNvbnN1bWluZwotICogb3BlcmF0aW9ucyBsaWtlIGZ1bGwgZGVjb2RpbmcuIERlbXV4ZXJzIGNhcnJpbmcgc3VjaCBiaXRzdHJlYW1zIHRodXMKLSAqIG1heSByZXR1cm4gbXVsdGlwbGUgZnJhbWVzIGluIGEgcGFja2V0LiBUaGlzIGhhcyBtYW55IGRpc2FkdmFudGFnZXMgbGlrZQotICogcHJvaGliaXRpbmcgc3RyZWFtIGNvcHkgaW4gbWFueSBjYXNlcyB0aHVzIGl0IHNob3VsZCBvbmx5IGJlIGNvbnNpZGVyZWQKLSAqIGFzIGEgbGFzdCByZXNvcnQuCi0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX1NVQkZSQU1FUyAgICAgICAgQVZfQ09ERUNfQ0FQX1NVQkZSQU1FUwotLyoqCi0gKiBDb2RlYyBpcyBleHBlcmltZW50YWwgYW5kIGlzIHRodXMgYXZvaWRlZCBpbiBmYXZvciBvZiBub24gZXhwZXJpbWVudGFsCi0gKiBlbmNvZGVycwotICovCi0jZGVmaW5lIENPREVDX0NBUF9FWFBFUklNRU5UQUwgICAgIEFWX0NPREVDX0NBUF9FWFBFUklNRU5UQUwKLS8qKgotICogQ29kZWMgc2hvdWxkIGZpbGwgaW4gY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBzYW1wbGVyYXRlIGluc3RlYWQgb2YgY29udGFpbmVyCi0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX0NIQU5ORUxfQ09ORiAgICAgQVZfQ09ERUNfQ0FQX0NIQU5ORUxfQ09ORgotI2lmIEZGX0FQSV9ORUdfTElORVNJWkVTCi0vKioKLSAqIEBkZXByZWNhdGVkIG5vIGNvZGVjcyB1c2UgdGhpcyBjYXBhYmlsaXR5Ci0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX05FR19MSU5FU0laRVMgICAgMHgwODAwCi0jZW5kaWYKLS8qKgotICogQ29kZWMgc3VwcG9ydHMgZnJhbWUtbGV2ZWwgbXVsdGl0aHJlYWRpbmcuCi0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgICAgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMKLS8qKgotICogQ29kZWMgc3VwcG9ydHMgc2xpY2UtYmFzZWQgKG9yIHBhcnRpdGlvbi1iYXNlZCkgbXVsdGl0aHJlYWRpbmcuCi0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMgICAgQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMKLS8qKgotICogQ29kZWMgc3VwcG9ydHMgY2hhbmdlZCBwYXJhbWV0ZXJzIGF0IGFueSBwb2ludC4KLSAqLwotI2RlZmluZSBDT0RFQ19DQVBfUEFSQU1fQ0hBTkdFICAgICBBVl9DT0RFQ19DQVBfUEFSQU1fQ0hBTkdFCi0vKioKLSAqIENvZGVjIHN1cHBvcnRzIGF2Y3R4LT50aHJlYWRfY291bnQgPT0gMCAoYXV0bykuCi0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX0FVVE9fVEhSRUFEUyAgICAgQVZfQ09ERUNfQ0FQX0FVVE9fVEhSRUFEUwotLyoqCi0gKiBBdWRpbyBlbmNvZGVyIHN1cHBvcnRzIHJlY2VpdmluZyBhIGRpZmZlcmVudCBudW1iZXIgb2Ygc2FtcGxlcyBpbiBlYWNoIGNhbGwuCi0gKi8KLSNkZWZpbmUgQ09ERUNfQ0FQX1ZBUklBQkxFX0ZSQU1FX1NJWkUgQVZfQ09ERUNfQ0FQX1ZBUklBQkxFX0ZSQU1FX1NJWkUKLS8qKgotICogQ29kZWMgaXMgaW50cmEgb25seS4KLSAqLwotI2RlZmluZSBDT0RFQ19DQVBfSU5UUkFfT05MWSAgICAgICBBVl9DT0RFQ19DQVBfSU5UUkFfT05MWQotLyoqCi0gKiBDb2RlYyBpcyBsb3NzbGVzcy4KLSAqLwotI2RlZmluZSBDT0RFQ19DQVBfTE9TU0xFU1MgICAgICAgICBBVl9DT0RFQ19DQVBfTE9TU0xFU1MKKyNkZWZpbmUgQVZfQ09ERUNfQ0FQX0hBUkRXQVJFICAgICAgICAgICAgKDEgPDwgMTgpCiAKIC8qKgotICogSFdBY2NlbCBpcyBleHBlcmltZW50YWwgYW5kIGlzIHRodXMgYXZvaWRlZCBpbiBmYXZvciBvZiBub24gZXhwZXJpbWVudGFsCi0gKiBjb2RlY3MKKyAqIENvZGVjIGlzIHBvdGVudGlhbGx5IGJhY2tlZCBieSBhIGhhcmR3YXJlIGltcGxlbWVudGF0aW9uLCBidXQgbm90CisgKiBuZWNlc3NhcmlseS4gVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YgQVZfQ09ERUNfQ0FQX0hBUkRXQVJFLCBpZiB0aGUKKyAqIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIHNvbWUgc29ydCBvZiBpbnRlcm5hbCBmYWxsYmFjay4KICAqLwotI2RlZmluZSBIV0FDQ0VMX0NPREVDX0NBUF9FWFBFUklNRU5UQUwgICAgIDB4MDIwMAotI2VuZGlmIC8qIEZGX0FQSV9XSVRIT1VUX1BSRUZJWCAqLwotCi0jaWYgRkZfQVBJX01CX1RZUEUKLS8vVGhlIGZvbGxvd2luZyBkZWZpbmVzIG1heSBjaGFuZ2UsIGRvbid0IGV4cGVjdCBjb21wYXRpYmlsaXR5IGlmIHlvdSB1c2UgdGhlbS4KLSNkZWZpbmUgTUJfVFlQRV9JTlRSQTR4NCAgIDB4MDAwMQotI2RlZmluZSBNQl9UWVBFX0lOVFJBMTZ4MTYgMHgwMDAyIC8vRklYTUUgSC4yNjQtc3BlY2lmaWMKLSNkZWZpbmUgTUJfVFlQRV9JTlRSQV9QQ00gIDB4MDAwNCAvL0ZJWE1FIEguMjY0LXNwZWNpZmljCi0jZGVmaW5lIE1CX1RZUEVfMTZ4MTYgICAgICAweDAwMDgKLSNkZWZpbmUgTUJfVFlQRV8xNng4ICAgICAgIDB4MDAxMAotI2RlZmluZSBNQl9UWVBFXzh4MTYgICAgICAgMHgwMDIwCi0jZGVmaW5lIE1CX1RZUEVfOHg4ICAgICAgICAweDAwNDAKLSNkZWZpbmUgTUJfVFlQRV9JTlRFUkxBQ0VEIDB4MDA4MAotI2RlZmluZSBNQl9UWVBFX0RJUkVDVDIgICAgMHgwMTAwIC8vRklYTUUKLSNkZWZpbmUgTUJfVFlQRV9BQ1BSRUQgICAgIDB4MDIwMAotI2RlZmluZSBNQl9UWVBFX0dNQyAgICAgICAgMHgwNDAwCi0jZGVmaW5lIE1CX1RZUEVfU0tJUCAgICAgICAweDA4MDAKLSNkZWZpbmUgTUJfVFlQRV9QMEwwICAgICAgIDB4MTAwMAotI2RlZmluZSBNQl9UWVBFX1AxTDAgICAgICAgMHgyMDAwCi0jZGVmaW5lIE1CX1RZUEVfUDBMMSAgICAgICAweDQwMDAKLSNkZWZpbmUgTUJfVFlQRV9QMUwxICAgICAgIDB4ODAwMAotI2RlZmluZSBNQl9UWVBFX0wwICAgICAgICAgKE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCkKLSNkZWZpbmUgTUJfVFlQRV9MMSAgICAgICAgIChNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDEpCi0jZGVmaW5lIE1CX1RZUEVfTDBMMSAgICAgICAoTUJfVFlQRV9MMCAgIHwgTUJfVFlQRV9MMSkKLSNkZWZpbmUgTUJfVFlQRV9RVUFOVCAgICAgIDB4MDAwMTAwMDAKLSNkZWZpbmUgTUJfVFlQRV9DQlAgICAgICAgIDB4MDAwMjAwMDAKLS8vTm90ZSBiaXRzIDI0LTMxIGFyZSByZXNlcnZlZCBmb3IgY29kZWMgc3BlY2lmaWMgdXNlIChoMjY0IHJlZjAsIG1wZWcxIDBtdiwgLi4uKQotI2VuZGlmCisjZGVmaW5lIEFWX0NPREVDX0NBUF9IWUJSSUQgICAgICAgICAgICAgICgxIDw8IDE5KQogCiAvKioKICAqIFBhbiBTY2FuIGFyZWEuCiAgKiBUaGlzIHNwZWNpZmllcyB0aGUgYXJlYSB3aGljaCBzaG91bGQgYmUgZGlzcGxheWVkLgogICogTm90ZSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgc3VjaCBhcmVhcyBmb3Igb25lIGZyYW1lLgogICovCi10eXBlZGVmIHN0cnVjdCBBVlBhblNjYW57Cit0eXBlZGVmIHN0cnVjdCBBVlBhblNjYW4gewogICAgIC8qKgogICAgICAqIGlkCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCkBAIC0xMTg4LDcgKzEwODksNyBAQAogICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjLgogICAgICAqLwogICAgIGludDE2X3QgcG9zaXRpb25bM11bMl07Ci19QVZQYW5TY2FuOworfSBBVlBhblNjYW47CiAKIC8qKgogICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBiaXRyYXRlIHByb3BlcnRpZXMgb2YgYW4gZW5jb2RlZCBiaXRzdHJlYW0uIEl0CkBAIC0xMjI4LDEzICsxMTI5LDYgQEAKICAgICB1aW50NjRfdCB2YnZfZGVsYXk7CiB9IEFWQ1BCUHJvcGVydGllczsKIAotI2lmIEZGX0FQSV9RU0NBTEVfVFlQRQotI2RlZmluZSBGRl9RU0NBTEVfVFlQRV9NUEVHMSAwCi0jZGVmaW5lIEZGX1FTQ0FMRV9UWVBFX01QRUcyIDEKLSNkZWZpbmUgRkZfUVNDQUxFX1RZUEVfSDI2NCAgMgotI2RlZmluZSBGRl9RU0NBTEVfVFlQRV9WUDU2ICAzCi0jZW5kaWYKLQogLyoqCiAgKiBUaGUgZGVjb2RlciB3aWxsIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGZyYW1lIGFuZCBtYXkgcmV1c2UgaXQgbGF0ZXIuCiAgKi8KQEAgLTEyNDcsNyArMTE0MSwyMCBAQAogICogQHsKICAqLwogZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB7CisgICAgLyoqCisgICAgICogQW4gQVZfUEtUX0RBVEFfUEFMRVRURSBzaWRlIGRhdGEgcGFja2V0IGNvbnRhaW5zIGV4YWN0bHkgQVZQQUxFVFRFX1NJWkUKKyAgICAgKiBieXRlcyB3b3J0aCBvZiBwYWxldHRlLiBUaGlzIHNpZGUgZGF0YSBzaWduYWxzIHRoYXQgYSBuZXcgcGFsZXR0ZSBpcworICAgICAqIHByZXNlbnQuCisgICAgICovCiAgICAgQVZfUEtUX0RBVEFfUEFMRVRURSwKKworICAgIC8qKgorICAgICAqIFRoZSBBVl9QS1RfREFUQV9ORVdfRVhUUkFEQVRBIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBjb2RlYyBvciB0aGUgZm9ybWF0CisgICAgICogdGhhdCB0aGUgZXh0cmFkYXRhIGJ1ZmZlciB3YXMgY2hhbmdlZCBhbmQgdGhlIHJlY2VpdmluZyBzaWRlIHNob3VsZAorICAgICAqIGFjdCB1cG9uIGl0IGFwcHJvcHJpYXRlbHkuIFRoZSBuZXcgZXh0cmFkYXRhIGlzIGVtYmVkZGVkIGluIHRoZSBzaWRlCisgICAgICogZGF0YSBidWZmZXIgYW5kIHNob3VsZCBiZSBpbW1lZGlhdGVseSB1c2VkIGZvciBwcm9jZXNzaW5nIHRoZSBjdXJyZW50CisgICAgICogZnJhbWUgb3IgcGFja2V0LgorICAgICAqLwogICAgIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCiAKICAgICAvKioKQEAgLTEzNDksNyArMTI1Niw3IEBACiAgICAgICogdTggICAgcmVhc29uIGZvciBlbmQgICBza2lwICgwPXBhZGRpbmcgc2lsZW5jZSwgMT1jb252ZXJnZW5jZSkKICAgICAgKiBAZW5kY29kZQogICAgICAqLwotICAgIEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUz03MCwKKyAgICBBVl9QS1RfREFUQV9TS0lQX1NBTVBMRVMsCiAKICAgICAvKioKICAgICAgKiBBbiBBVl9QS1RfREFUQV9KUF9EVUFMTU9OTyBzaWRlIGRhdGEgcGFja2V0IGluZGljYXRlcyB0aGF0CkBAIC0xNDAzLDYgKzEzMTAsNjIgQEAKICAgICAgKiBzaWRlIGRhdGEgaW5jbHVkZXMgdXBkYXRlZCBtZXRhZGF0YSB3aGljaCBhcHBlYXJlZCBpbiB0aGUgc3RyZWFtLgogICAgICAqLwogICAgIEFWX1BLVF9EQVRBX01FVEFEQVRBX1VQREFURSwKKworICAgIC8qKgorICAgICAqIE1QRUdUUyBzdHJlYW0gSUQgYXMgdWludDhfdCwgdGhpcyBpcyByZXF1aXJlZCB0byBwYXNzIHRoZSBzdHJlYW0gSUQKKyAgICAgKiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkZW11eGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIG11eGVyLgorICAgICAqLworICAgIEFWX1BLVF9EQVRBX01QRUdUU19TVFJFQU1fSUQsCisKKyAgICAvKioKKyAgICAgKiBNYXN0ZXJpbmcgZGlzcGxheSBtZXRhZGF0YSAoYmFzZWQgb24gU01QVEUtMjA4NjoyMDE0KS4gVGhpcyBtZXRhZGF0YQorICAgICAqIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGggYSB2aWRlbyBzdHJlYW0gYW5kIGNvbnRhaW5zIGRhdGEgaW4gdGhlIGZvcm0KKyAgICAgKiBvZiB0aGUgQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEgc3RydWN0LgorICAgICAqLworICAgIEFWX1BLVF9EQVRBX01BU1RFUklOR19ESVNQTEFZX01FVEFEQVRBLAorCisgICAgLyoqCisgICAgICogVGhpcyBzaWRlIGRhdGEgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHZpZGVvIHN0cmVhbSBhbmQgY29ycmVzcG9uZHMKKyAgICAgKiB0byB0aGUgQVZTcGhlcmljYWxNYXBwaW5nIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBBVl9QS1RfREFUQV9TUEhFUklDQUwsCisKKyAgICAvKioKKyAgICAgKiBDb250ZW50IGxpZ2h0IGxldmVsIChiYXNlZCBvbiBDVEEtODYxLjMpLiBUaGlzIG1ldGFkYXRhIHNob3VsZCBiZQorICAgICAqIGFzc29jaWF0ZWQgd2l0aCBhIHZpZGVvIHN0cmVhbSBhbmQgY29udGFpbnMgZGF0YSBpbiB0aGUgZm9ybSBvZiB0aGUKKyAgICAgKiBBVkNvbnRlbnRMaWdodE1ldGFkYXRhIHN0cnVjdC4KKyAgICAgKi8KKyAgICBBVl9QS1RfREFUQV9DT05URU5UX0xJR0hUX0xFVkVMLAorCisgICAgLyoqCisgICAgICogQVRTQyBBNTMgUGFydCA0IENsb3NlZCBDYXB0aW9ucy4gVGhpcyBtZXRhZGF0YSBzaG91bGQgYmUgYXNzb2NpYXRlZCB3aXRoCisgICAgICogYSB2aWRlbyBzdHJlYW0uIEE1MyBDQyBiaXRzdHJlYW0gaXMgc3RvcmVkIGFzIHVpbnQ4X3QgaW4gQVZQYWNrZXRTaWRlRGF0YS5kYXRhLgorICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgQ0MgZGF0YSBpcyBBVlBhY2tldFNpZGVEYXRhLnNpemUuCisgICAgICovCisgICAgQVZfUEtUX0RBVEFfQTUzX0NDLAorCisgICAgLyoqCisgICAgICogVGhpcyBzaWRlIGRhdGEgaXMgZW5jcnlwdGlvbiBpbml0aWFsaXphdGlvbiBkYXRhLgorICAgICAqIFRoZSBmb3JtYXQgaXMgbm90IHBhcnQgb2YgQUJJLCB1c2UgYXZfZW5jcnlwdGlvbl9pbml0X2luZm9fKiBtZXRob2RzIHRvCisgICAgICogYWNjZXNzLgorICAgICAqLworICAgIEFWX1BLVF9EQVRBX0VOQ1JZUFRJT05fSU5JVF9JTkZPLAorCisgICAgLyoqCisgICAgICogVGhpcyBzaWRlIGRhdGEgY29udGFpbnMgZW5jcnlwdGlvbiBpbmZvIGZvciBob3cgdG8gZGVjcnlwdCB0aGUgcGFja2V0LgorICAgICAqIFRoZSBmb3JtYXQgaXMgbm90IHBhcnQgb2YgQUJJLCB1c2UgYXZfZW5jcnlwdGlvbl9pbmZvXyogbWV0aG9kcyB0byBhY2Nlc3MuCisgICAgICovCisgICAgQVZfUEtUX0RBVEFfRU5DUllQVElPTl9JTkZPLAorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzaWRlIGRhdGEgdHlwZXMuCisgICAgICogVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSS9BQkkgaW4gdGhlIHNlbnNlIHRoYXQgaXQgbWF5CisgICAgICogY2hhbmdlIHdoZW4gbmV3IHNpZGUgZGF0YSB0eXBlcyBhcmUgYWRkZWQuCisgICAgICogVGhpcyBtdXN0IHN0YXkgdGhlIGxhc3QgZW51bSB2YWx1ZS4KKyAgICAgKiBJZiBpdHMgdmFsdWUgYmVjb21lcyBodWdlLCBzb21lIGNvZGUgdXNpbmcgaXQKKyAgICAgKiBuZWVkcyB0byBiZSB1cGRhdGVkIGFzIGl0IGFzc3VtZXMgaXQgdG8gYmUgc21hbGxlciB0aGFuIG90aGVyIGxpbWl0cy4KKyAgICAgKi8KKyAgICBBVl9QS1RfREFUQV9OQgogfTsKIAogI2RlZmluZSBBVl9QS1RfREFUQV9RVUFMSVRZX0ZBQ1RPUiBBVl9QS1RfREFUQV9RVUFMSVRZX1NUQVRTIC8vREVQUkVDQVRFRApAQCAtMTQ5OCw2ICsxNDYxLDI1IEBACiB9IEFWUGFja2V0OwogI2RlZmluZSBBVl9QS1RfRkxBR19LRVkgICAgIDB4MDAwMSAvLy88IFRoZSBwYWNrZXQgY29udGFpbnMgYSBrZXlmcmFtZQogI2RlZmluZSBBVl9QS1RfRkxBR19DT1JSVVBUIDB4MDAwMiAvLy88IFRoZSBwYWNrZXQgY29udGVudCBpcyBjb3JydXB0ZWQKKy8qKgorICogRmxhZyBpcyB1c2VkIHRvIGRpc2NhcmQgcGFja2V0cyB3aGljaCBhcmUgcmVxdWlyZWQgdG8gbWFpbnRhaW4gdmFsaWQKKyAqIGRlY29kZXIgc3RhdGUgYnV0IGFyZSBub3QgcmVxdWlyZWQgZm9yIG91dHB1dCBhbmQgc2hvdWxkIGJlIGRyb3BwZWQKKyAqIGFmdGVyIGRlY29kaW5nLgorICoqLworI2RlZmluZSBBVl9QS1RfRkxBR19ESVNDQVJEICAgMHgwMDA0CisvKioKKyAqIFRoZSBwYWNrZXQgY29tZXMgZnJvbSBhIHRydXN0ZWQgc291cmNlLgorICoKKyAqIE90aGVyd2lzZS11bnNhZmUgY29uc3RydWN0cyBzdWNoIGFzIGFyYml0cmFyeSBwb2ludGVycyB0byBkYXRhCisgKiBvdXRzaWRlIHRoZSBwYWNrZXQgbWF5IGJlIGZvbGxvd2VkLgorICovCisjZGVmaW5lIEFWX1BLVF9GTEFHX1RSVVNURUQgICAweDAwMDgKKy8qKgorICogRmxhZyBpcyB1c2VkIHRvIGluZGljYXRlIHBhY2tldHMgdGhhdCBjb250YWluIGZyYW1lcyB0aGF0IGNhbgorICogYmUgZGlzY2FyZGVkIGJ5IHRoZSBkZWNvZGVyLiAgSS5lLiBOb24tcmVmZXJlbmNlIGZyYW1lcy4KKyAqLworI2RlZmluZSBBVl9QS1RfRkxBR19ESVNQT1NBQkxFIDB4MDAxMAorCiAKIGVudW0gQVZTaWRlRGF0YVBhcmFtQ2hhbmdlRmxhZ3MgewogICAgIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfQ0hBTk5FTF9DT1VOVCAgPSAweDAwMDEsCkBAIC0xNTI1LDggKzE1MDcsMTIgQEAKICAqIE5ldyBmaWVsZHMgY2FuIGJlIGFkZGVkIHRvIHRoZSBlbmQgd2l0aCBtaW5vciB2ZXJzaW9uIGJ1bXBzLgogICogUmVtb3ZhbCwgcmVvcmRlcmluZyBhbmQgY2hhbmdlcyB0byBleGlzdGluZyBmaWVsZHMgcmVxdWlyZSBhIG1ham9yCiAgKiB2ZXJzaW9uIGJ1bXAuCi0gKiBQbGVhc2UgdXNlIEFWT3B0aW9ucyAoYXZfb3B0KiAvIGF2X3NldC9nZXQqKCkpIHRvIGFjY2VzcyB0aGVzZSBmaWVsZHMgZnJvbSB1c2VyCisgKiBZb3UgY2FuIHVzZSBBVk9wdGlvbnMgKGF2X29wdCogLyBhdl9zZXQvZ2V0KigpKSB0byBhY2Nlc3MgdGhlc2UgZmllbGRzIGZyb20gdXNlcgogICogYXBwbGljYXRpb25zLgorICogVGhlIG5hbWUgc3RyaW5nIGZvciBBVk9wdGlvbnMgb3B0aW9ucyBtYXRjaGVzIHRoZSBhc3NvY2lhdGVkIGNvbW1hbmQgbGluZQorICogcGFyYW1ldGVyIG5hbWUgYW5kIGNhbiBiZSBmb3VuZCBpbiBsaWJhdmNvZGVjL29wdGlvbnNfdGFibGUuaAorICogVGhlIEFWT3B0aW9uL2NvbW1hbmQgbGluZSBwYXJhbWV0ZXIgbmFtZXMgZGlmZmVyIGluIHNvbWUgY2FzZXMgZnJvbSB0aGUgQworICogc3RydWN0dXJlIGZpZWxkIG5hbWVzIGZvciBoaXN0b3JpYyByZWFzb25zIG9yIGJyZXZpdHkuCiAgKiBzaXplb2YoQVZDb2RlY0NvbnRleHQpIG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBsaWJhdiouCiAgKi8KIHR5cGVkZWYgc3RydWN0IEFWQ29kZWNDb250ZXh0IHsKQEAgLTE1MzksMTMgKzE1MjUsNiBAQAogCiAgICAgZW51bSBBVk1lZGlhVHlwZSBjb2RlY190eXBlOyAvKiBzZWUgQVZNRURJQV9UWVBFX3h4eCAqLwogICAgIGNvbnN0IHN0cnVjdCBBVkNvZGVjICAqY29kZWM7Ci0jaWYgRkZfQVBJX0NPREVDX05BTUUKLSAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB0aGlzIGZpZWxkIGlzIG5vdCB1c2VkIGZvciBhbnl0aGluZyBpbiBsaWJhdmNvZGVjCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICBjaGFyICAgICAgICAgICAgIGNvZGVjX25hbWVbMzJdOwotI2VuZGlmCiAgICAgZW51bSBBVkNvZGVjSUQgICAgIGNvZGVjX2lkOyAvKiBzZWUgQVZfQ09ERUNfSURfeHh4ICovCiAKICAgICAvKioKQEAgLTE1NjMsMTQgKzE1NDIsNiBAQAogICAgICAqLwogICAgIHVuc2lnbmVkIGludCBjb2RlY190YWc7CiAKLSNpZiBGRl9BUElfU1RSRUFNX0NPREVDX1RBRwotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHRoaXMgZmllbGQgaXMgdW51c2VkCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICB1bnNpZ25lZCBpbnQgc3RyZWFtX2NvZGVjX3RhZzsKLSNlbmRpZgotCiAgICAgdm9pZCAqcHJpdl9kYXRhOwogCiAgICAgLyoqCkBAIC0xNjM1LDkgKzE2MDYsOSBAQAogCiAgICAgLyoqCiAgICAgICogc29tZSBjb2RlY3MgbmVlZCAvIGNhbiB1c2UgZXh0cmFkYXRhIGxpa2UgSHVmZm1hbiB0YWJsZXMuCi0gICAgICogbWpwZWc6IEh1ZmZtYW4gdGFibGVzCisgICAgICogTUpQRUc6IEh1ZmZtYW4gdGFibGVzCiAgICAgICogcnYxMDogYWRkaXRpb25hbCBmbGFncwotICAgICAqIG1wZWc0OiBnbG9iYWwgaGVhZGVycyAodGhleSBjYW4gYmUgaW4gdGhlIGJpdHN0cmVhbSBvciBoZXJlKQorICAgICAqIE1QRUctNDogZ2xvYmFsIGhlYWRlcnMgKHRoZXkgY2FuIGJlIGluIHRoZSBiaXRzdHJlYW0gb3IgaGVyZSkKICAgICAgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSBzaG91bGQgYmUgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSBieXRlcyBsYXJnZXIKICAgICAgKiB0aGFuIGV4dHJhZGF0YV9zaXplIHRvIGF2b2lkIHByb2JsZW1zIGlmIGl0IGlzIHJlYWQgd2l0aCB0aGUgYml0c3RyZWFtIHJlYWRlci4KICAgICAgKiBUaGUgYnl0ZXdpc2UgY29udGVudHMgb2YgZXh0cmFkYXRhIG11c3Qgbm90IGRlcGVuZCBvbiB0aGUgYXJjaGl0ZWN0dXJlIG9yIENQVSBlbmRpYW5uZXNzLgpAQCAtMTY1Myw3ICsxNjI0LDE1IEBACiAgICAgICogdGltZWJhc2Ugc2hvdWxkIGJlIDEvZnJhbWVyYXRlIGFuZCB0aW1lc3RhbXAgaW5jcmVtZW50cyBzaG91bGQgYmUKICAgICAgKiBpZGVudGljYWxseSAxLgogICAgICAqIFRoaXMgb2Z0ZW4sIGJ1dCBub3QgYWx3YXlzIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBmcmFtZSByYXRlIG9yIGZpZWxkIHJhdGUKLSAgICAgKiBmb3IgdmlkZW8uCisgICAgICogZm9yIHZpZGVvLiAxL3RpbWVfYmFzZSBpcyBub3QgdGhlIGF2ZXJhZ2UgZnJhbWUgcmF0ZSBpZiB0aGUgZnJhbWUgcmF0ZSBpcyBub3QKKyAgICAgKiBjb25zdGFudC4KKyAgICAgKgorICAgICAqIExpa2UgY29udGFpbmVycywgZWxlbWVudGFyeSBzdHJlYW1zIGFsc28gY2FuIHN0b3JlIHRpbWVzdGFtcHMsIDEvdGltZV9iYXNlCisgICAgICogaXMgdGhlIHVuaXQgaW4gd2hpY2ggdGhlc2UgdGltZXN0YW1wcyBhcmUgc3BlY2lmaWVkLgorICAgICAqIEFzIGV4YW1wbGUgb2Ygc3VjaCBjb2RlYyB0aW1lIGJhc2Ugc2VlIElTTy9JRUMgMTQ0OTYtMjoyMDAxKEUpCisgICAgICogdm9wX3RpbWVfaW5jcmVtZW50X3Jlc29sdXRpb24gYW5kIGZpeGVkX3ZvcF9yYXRlCisgICAgICogKGZpeGVkX3ZvcF9yYXRlID09IDAgaW1wbGllcyB0aGF0IGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBmcmFtZXJhdGUpCisgICAgICoKICAgICAgKiAtIGVuY29kaW5nOiBNVVNUIGJlIHNldCBieSB1c2VyLgogICAgICAqIC0gZGVjb2Rpbmc6IHRoZSB1c2Ugb2YgdGhpcyBmaWVsZCBmb3IgZGVjb2RpbmcgaXMgZGVwcmVjYXRlZC4KICAgICAgKiAgICAgICAgICAgICBVc2UgZnJhbWVyYXRlIGluc3RlYWQuCkBAIC0xNjk5LDcgKzE2NzgsNyBAQAogICAgICAqIHBpY3R1cmUgd2lkdGggLyBoZWlnaHQuCiAgICAgICoKICAgICAgKiBAbm90ZSBUaG9zZSBmaWVsZHMgbWF5IG5vdCBtYXRjaCB0aGUgdmFsdWVzIG9mIHRoZSBsYXN0Ci0gICAgICogQVZGcmFtZSBvdXRwdXR0ZWQgYnkgYXZjb2RlY19kZWNvZGVfdmlkZW8yIGR1ZSBmcmFtZQorICAgICAqIEFWRnJhbWUgb3V0cHV0IGJ5IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMiBkdWUgZnJhbWUKICAgICAgKiByZW9yZGVyaW5nLgogICAgICAqCiAgICAgICogLSBlbmNvZGluZzogTVVTVCBiZSBzZXQgYnkgdXNlci4KQEAgLTE3MTUsNyArMTY5NCw3IEBACiAgICAgICogdGhlIGRlY29kZWQgZnJhbWUgaXMgY3JvcHBlZCBiZWZvcmUgYmVpbmcgb3V0cHV0IG9yIGxvd3JlcyBpcyBlbmFibGVkLgogICAgICAqCiAgICAgICogQG5vdGUgVGhvc2UgZmllbGQgbWF5IG5vdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGxhc3QKLSAgICAgKiBBVkZyYW1lIG91dHB1dHRlZCBieSBhdmNvZGVjX2RlY29kZV92aWRlbzIgZHVlIGZyYW1lCisgICAgICogQVZGcmFtZSBvdXRwdXQgYnkgYXZjb2RlY19yZWNlaXZlX2ZyYW1lKCkgZHVlIGZyYW1lCiAgICAgICogcmVvcmRlcmluZy4KICAgICAgKgogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZApAQCAtMTcyNSwxMCArMTcwNCw2IEBACiAgICAgICovCiAgICAgaW50IGNvZGVkX3dpZHRoLCBjb2RlZF9oZWlnaHQ7CiAKLSNpZiBGRl9BUElfQVNQRUNUX0VYVEVOREVECi0jZGVmaW5lIEZGX0FTUEVDVF9FWFRFTkRFRCAxNQotI2VuZGlmCi0KICAgICAvKioKICAgICAgKiB0aGUgbnVtYmVyIG9mIHBpY3R1cmVzIGluIGEgZ3JvdXAgb2YgcGljdHVyZXMsIG9yIDAgZm9yIGludHJhX29ubHkKICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KQEAgLTE3NDIsNyArMTcxNyw3IEBACiAgICAgICogTWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGRlY29kZXIgaWYgaXQga25vd3MgYmV0dGVyLgogICAgICAqCiAgICAgICogQG5vdGUgVGhpcyBmaWVsZCBtYXkgbm90IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgbGFzdAotICAgICAqIEFWRnJhbWUgb3V0cHV0dGVkIGJ5IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMiBkdWUgZnJhbWUKKyAgICAgKiBBVkZyYW1lIG91dHB1dCBieSBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoKSBkdWUgZnJhbWUKICAgICAgKiByZW9yZGVyaW5nLgogICAgICAqCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCkBAIC0xNzUxLDE0ICsxNzI2LDYgQEAKICAgICAgKi8KICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKIAotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi0gICAgLyoqCi0gICAgICogVGhpcyBvcHRpb24gZG9lcyBub3RoaW5nCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIGNvZGVjIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQgaW50IG1lX21ldGhvZDsKLSNlbmRpZgotCiAgICAgLyoqCiAgICAgICogSWYgbm9uIE5VTEwsICdkcmF3X2hvcml6X2JhbmQnIGlzIGNhbGxlZCBieSB0aGUgbGliYXZjb2RlYwogICAgICAqIGRlY29kZXIgdG8gZHJhdyBhIGhvcml6b250YWwgYmFuZC4gSXQgaW1wcm92ZXMgY2FjaGUgdXNhZ2UuIE5vdApAQCAtMTgxOCwxMiArMTc4NSw2IEBACiAgICAgICovCiAgICAgZmxvYXQgYl9xdWFudF9mYWN0b3I7CiAKLSNpZiBGRl9BUElfUkNfU1RSQVRFR1kKLSAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGNvZGVjIHByaXZhdGUgb3B0aW9uIGluc3RlYWQgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZCBpbnQgcmNfc3RyYXRlZ3k7Ci0jZGVmaW5lIEZGX1JDX1NUUkFURUdZX1hWSUQgMQotI2VuZGlmCi0KICNpZiBGRl9BUElfUFJJVkFURV9PUFQKICAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQgKi8KICAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZApAQCAtMTg1Miw4ICsxODEzLDggQEAKICNlbmRpZgogCiAgICAgLyoqCi0gICAgICogcXNjYWxlIGZhY3RvciBiZXR3ZWVuIFAgYW5kIEktZnJhbWVzCi0gICAgICogSWYgPiAwIHRoZW4gdGhlIGxhc3QgcCBmcmFtZSBxdWFudGl6ZXIgd2lsbCBiZSB1c2VkIChxPSBsYXN0cF9xKmZhY3RvcitvZmZzZXQpLgorICAgICAqIHFzY2FsZSBmYWN0b3IgYmV0d2VlbiBQLSBhbmQgSS1mcmFtZXMKKyAgICAgKiBJZiA+IDAgdGhlbiB0aGUgbGFzdCBQLWZyYW1lIHF1YW50aXplciB3aWxsIGJlIHVzZWQgKHEgPSBsYXN0cF9xICogZmFjdG9yICsgb2Zmc2V0KS4KICAgICAgKiBJZiA8IDAgdGhlbiBub3JtYWwgcmF0ZWNvbnRyb2wgd2lsbCBiZSBkb25lIChxPSAtbm9ybWFsX3EqZmFjdG9yK29mZnNldCkuCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCiAgICAgICogLSBkZWNvZGluZzogdW51c2VkCkBAIC0xOTU4LDIyICsxOTE5LDIzIEBACiAgICAgICogLSBkZWNvZGluZzogdW51c2VkCiAgICAgICovCiAgICAgaW50IGlsZGN0X2NtcDsKLSNkZWZpbmUgRkZfQ01QX1NBRCAgICAwCi0jZGVmaW5lIEZGX0NNUF9TU0UgICAgMQotI2RlZmluZSBGRl9DTVBfU0FURCAgIDIKLSNkZWZpbmUgRkZfQ01QX0RDVCAgICAzCi0jZGVmaW5lIEZGX0NNUF9QU05SICAgNAotI2RlZmluZSBGRl9DTVBfQklUICAgIDUKLSNkZWZpbmUgRkZfQ01QX1JEICAgICA2Ci0jZGVmaW5lIEZGX0NNUF9aRVJPICAgNwotI2RlZmluZSBGRl9DTVBfVlNBRCAgIDgKLSNkZWZpbmUgRkZfQ01QX1ZTU0UgICA5Ci0jZGVmaW5lIEZGX0NNUF9OU1NFICAgMTAKLSNkZWZpbmUgRkZfQ01QX1c1MyAgICAxMQotI2RlZmluZSBGRl9DTVBfVzk3ICAgIDEyCi0jZGVmaW5lIEZGX0NNUF9EQ1RNQVggMTMKLSNkZWZpbmUgRkZfQ01QX0RDVDI2NCAxNAotI2RlZmluZSBGRl9DTVBfQ0hST01BIDI1NgorI2RlZmluZSBGRl9DTVBfU0FEICAgICAgICAgIDAKKyNkZWZpbmUgRkZfQ01QX1NTRSAgICAgICAgICAxCisjZGVmaW5lIEZGX0NNUF9TQVREICAgICAgICAgMgorI2RlZmluZSBGRl9DTVBfRENUICAgICAgICAgIDMKKyNkZWZpbmUgRkZfQ01QX1BTTlIgICAgICAgICA0CisjZGVmaW5lIEZGX0NNUF9CSVQgICAgICAgICAgNQorI2RlZmluZSBGRl9DTVBfUkQgICAgICAgICAgIDYKKyNkZWZpbmUgRkZfQ01QX1pFUk8gICAgICAgICA3CisjZGVmaW5lIEZGX0NNUF9WU0FEICAgICAgICAgOAorI2RlZmluZSBGRl9DTVBfVlNTRSAgICAgICAgIDkKKyNkZWZpbmUgRkZfQ01QX05TU0UgICAgICAgICAxMAorI2RlZmluZSBGRl9DTVBfVzUzICAgICAgICAgIDExCisjZGVmaW5lIEZGX0NNUF9XOTcgICAgICAgICAgMTIKKyNkZWZpbmUgRkZfQ01QX0RDVE1BWCAgICAgICAxMworI2RlZmluZSBGRl9DTVBfRENUMjY0ICAgICAgIDE0CisjZGVmaW5lIEZGX0NNUF9NRURJQU5fU0FEICAgMTUKKyNkZWZpbmUgRkZfQ01QX0NIUk9NQSAgICAgICAyNTYKIAogICAgIC8qKgogICAgICAqIE1FIGRpYW1vbmQgc2l6ZSAmIHNoYXBlCkBAIC0yMDE2LDI2ICsxOTc4LDYgQEAKICAgICAgKi8KICAgICBpbnQgbWVfc3VicGVsX3F1YWxpdHk7CiAKLSNpZiBGRl9BUElfQUZECi0gICAgLyoqCi0gICAgICogRFRHIGFjdGl2ZSBmb3JtYXQgaW5mb3JtYXRpb24gKGFkZGl0aW9uYWwgYXNwZWN0IHJhdGlvCi0gICAgICogaW5mb3JtYXRpb24gb25seSB1c2VkIGluIERWQiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbXMpCi0gICAgICogMCBpZiBub3Qgc2V0LgotICAgICAqCi0gICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGRlY29kZXIuCi0gICAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBpbiBmYXZvciBvZiBBVlNpZGVEYXRhCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQgaW50IGR0Z19hY3RpdmVfZm9ybWF0OwotI2RlZmluZSBGRl9EVEdfQUZEX1NBTUUgICAgICAgICA4Ci0jZGVmaW5lIEZGX0RUR19BRkRfNF8zICAgICAgICAgIDkKLSNkZWZpbmUgRkZfRFRHX0FGRF8xNl85ICAgICAgICAgMTAKLSNkZWZpbmUgRkZfRFRHX0FGRF8xNF85ICAgICAgICAgMTEKLSNkZWZpbmUgRkZfRFRHX0FGRF80XzNfU1BfMTRfOSAgMTMKLSNkZWZpbmUgRkZfRFRHX0FGRF8xNl85X1NQXzE0XzkgMTQKLSNkZWZpbmUgRkZfRFRHX0FGRF9TUF80XzMgICAgICAgMTUKLSNlbmRpZiAvKiBGRl9BUElfQUZEICovCi0KICAgICAvKioKICAgICAgKiBtYXhpbXVtIG1vdGlvbiBlc3RpbWF0aW9uIHNlYXJjaCByYW5nZSBpbiBzdWJwZWwgdW5pdHMKICAgICAgKiBJZiAwIHRoZW4gbm8gbGltaXQuCkBAIC0yMDQ1LDE5ICsxOTg3LDYgQEAKICAgICAgKi8KICAgICBpbnQgbWVfcmFuZ2U7CiAKLSNpZiBGRl9BUElfUVVBTlRfQklBUwotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9uIGluc3RlYWQKLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZCBpbnQgaW50cmFfcXVhbnRfYmlhczsKLSNkZWZpbmUgRkZfREVGQVVMVF9RVUFOVF9CSUFTIDk5OTk5OQotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb24gaW5zdGVhZAotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkIGludCBpbnRlcl9xdWFudF9iaWFzOwotI2VuZGlmCi0KICAgICAvKioKICAgICAgKiBzbGljZSBmbGFncwogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZApAQCAtMjA2NSwxOSArMTk5NCw5IEBACiAgICAgICovCiAgICAgaW50IHNsaWNlX2ZsYWdzOwogI2RlZmluZSBTTElDRV9GTEFHX0NPREVEX09SREVSICAgIDB4MDAwMSAvLy88IGRyYXdfaG9yaXpfYmFuZCgpIGlzIGNhbGxlZCBpbiBjb2RlZCBvcmRlciBpbnN0ZWFkIG9mIGRpc3BsYXkKLSNkZWZpbmUgU0xJQ0VfRkxBR19BTExPV19GSUVMRCAgICAweDAwMDIgLy8vPCBhbGxvdyBkcmF3X2hvcml6X2JhbmQoKSB3aXRoIGZpZWxkIHNsaWNlcyAoTVBFRzIgZmllbGQgcGljcykKKyNkZWZpbmUgU0xJQ0VfRkxBR19BTExPV19GSUVMRCAgICAweDAwMDIgLy8vPCBhbGxvdyBkcmF3X2hvcml6X2JhbmQoKSB3aXRoIGZpZWxkIHNsaWNlcyAoTVBFRy0yIGZpZWxkIHBpY3MpCiAjZGVmaW5lIFNMSUNFX0ZMQUdfQUxMT1dfUExBTkUgICAgMHgwMDA0IC8vLzwgYWxsb3cgZHJhd19ob3Jpel9iYW5kKCkgd2l0aCAxIGNvbXBvbmVudCBhdCBhIHRpbWUgKFNWUTEpCiAKLSNpZiBGRl9BUElfWFZNQwotICAgIC8qKgotICAgICAqIFhWaWRlbyBNb3Rpb24gQWNjZWxlcmF0aW9uCi0gICAgICogLSBlbmNvZGluZzogZm9yYmlkZGVuCi0gICAgICogLSBkZWNvZGluZzogc2V0IGJ5IGRlY29kZXIKLSAgICAgKiBAZGVwcmVjYXRlZCBYdk1DIGRvZXNuJ3QgbmVlZCBpdCBhbnltb3JlLgotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkIGludCB4dm1jX2FjY2VsZXJhdGlvbjsKLSNlbmRpZiAvKiBGRl9BUElfWFZNQyAqLwotCiAgICAgLyoqCiAgICAgICogbWFjcm9ibG9jayBkZWNpc2lvbiBtb2RlCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCkBAIC0yMTEyLDIwICsyMDMxLDYgQEAKICAgICBpbnQgbm9pc2VfcmVkdWN0aW9uOwogI2VuZGlmCiAKLSNpZiBGRl9BUElfTVBWX09QVAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHRoaXMgZmllbGQgaXMgdW51c2VkCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICBpbnQgbWVfdGhyZXNob2xkOwotCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdGhpcyBmaWVsZCBpcyB1bnVzZWQKLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIGludCBtYl90aHJlc2hvbGQ7Ci0jZW5kaWYKLQogICAgIC8qKgogICAgICAqIHByZWNpc2lvbiBvZiB0aGUgaW50cmEgREMgY29lZmZpY2llbnQgLSA4CiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCkBAIC0yMTQ3LDIzICsyMDUyLDE1IEBACiAgICAgICovCiAgICAgaW50IHNraXBfYm90dG9tOwogCi0jaWYgRkZfQVBJX01QVl9PUFQKICAgICAvKioKLSAgICAgKiBAZGVwcmVjYXRlZCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZAotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgZmxvYXQgYm9yZGVyX21hc2tpbmc7Ci0jZW5kaWYKLQotICAgIC8qKgotICAgICAqIG1pbmltdW0gTUIgbGFncmFuZ2UgbXVsdGlwbGVyCisgICAgICogbWluaW11bSBNQiBMYWdyYW5nZSBtdWx0aXBsaWVyCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCiAgICAgICogLSBkZWNvZGluZzogdW51c2VkCiAgICAgICovCiAgICAgaW50IG1iX2xtaW47CiAKICAgICAvKioKLSAgICAgKiBtYXhpbXVtIE1CIGxhZ3JhbmdlIG11bHRpcGxlcgorICAgICAqIG1heGltdW0gTUIgTGFncmFuZ2UgbXVsdGlwbGllcgogICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgogICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAogICAgICAqLwpAQCAtMjE3OCw3ICsyMDc1LDYgQEAKICNlbmRpZgogCiAgICAgLyoqCi0gICAgICoKICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KICAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKICAgICAgKi8KQEAgLTIyMTAsMTcgKzIxMDYsNyBAQAogICAgIGludCBjaHJvbWFvZmZzZXQ7CiAjZW5kaWYKIAotI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUwogICAgIC8qKgotICAgICAqIE11bHRpcGxpZWQgYnkgcXNjYWxlIGZvciBlYWNoIGZyYW1lIGFuZCBhZGRlZCB0byBzY2VuZV9jaGFuZ2Vfc2NvcmUuCi0gICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCi0gICAgICogLSBkZWNvZGluZzogdW51c2VkCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQgaW50IHNjZW5lY2hhbmdlX2ZhY3RvcjsKLSNlbmRpZgotCi0gICAgLyoqCi0gICAgICoKICAgICAgKiBOb3RlOiBWYWx1ZSBkZXBlbmRzIHVwb24gdGhlIGNvbXBhcmUgZnVuY3Rpb24gdXNlZCBmb3IgZnVsbHBlbCBNRS4KICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KICAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKQEAgLTIzODUsNyArMjI3MSw3IEBACiAgICAgICogICAgIHRvIGFsbCBkYXRhIHBsYW5lcy4gZGF0YVtdIG11c3QgaG9sZCBhcyBtYW55IHBvaW50ZXJzIGFzIGl0IGNhbi4KICAgICAgKiAgICAgZXh0ZW5kZWRfZGF0YSBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIGF2X21hbGxvYygpIGFuZCB3aWxsIGJlIGZyZWVkIGluCiAgICAgICogICAgIGF2X2ZyYW1lX3VucmVmKCkuCi0gICAgICogICAqIG90aGVyd2lzZSBleGVuZGVkX2RhdGEgbXVzdCBwb2ludCB0byBkYXRhCisgICAgICogICAqIG90aGVyd2lzZSBleHRlbmRlZF9kYXRhIG11c3QgcG9pbnQgdG8gZGF0YQogICAgICAqIC0gYnVmW10gbXVzdCBjb250YWluIG9uZSBvciBtb3JlIHBvaW50ZXJzIHRvIEFWQnVmZmVyUmVmIHN0cnVjdHVyZXMuIEVhY2ggb2YKICAgICAgKiAgIHRoZSBmcmFtZSdzIGRhdGEgYW5kIGV4dGVuZGVkX2RhdGEgcG9pbnRlcnMgbXVzdCBiZSBjb250YWluZWQgaW4gdGhlc2UuIFRoYXQKICAgICAgKiAgIGlzLCBvbmUgQVZCdWZmZXJSZWYgZm9yIGVhY2ggYWxsb2NhdGVkIGNodW5rIG9mIG1lbW9yeSwgbm90IG5lY2Vzc2FyaWx5IG9uZQpAQCAtMjQ0OSw5ICsyMzM1LDEyIEBACiAgICAgICogT3RoZXJ3aXNlLCB0aGUgZGVjb2RlZCBmcmFtZXMgbXVzdCBub3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlciBhbmQgYXJlCiAgICAgICogb25seSB2YWxpZCB1bnRpbCB0aGUgbmV4dCBkZWNvZGUgY2FsbC4KICAgICAgKgorICAgICAqIFRoaXMgaXMgYWx3YXlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBpZiBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoKSBpcyB1c2VkLgorICAgICAqCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCiAgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGF2Y29kZWNfb3BlbjIoKS4KICAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAogICAgIGludCByZWZjb3VudGVkX2ZyYW1lczsKIAogICAgIC8qIC0gZW5jb2RpbmcgcGFyYW1ldGVycyAqLwpAQCAtMjQ3OSwxOSArMjM2OCw2IEBACiAgICAgICovCiAgICAgaW50IG1heF9xZGlmZjsKIAotI2lmIEZGX0FQSV9NUFZfT1BUCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQKLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIGZsb2F0IHJjX3FzcXVpc2g7Ci0KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIGZsb2F0IHJjX3Ftb2RfYW1wOwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgaW50IHJjX3Ftb2RfZnJlcTsKLSNlbmRpZgotCiAgICAgLyoqCiAgICAgICogZGVjb2RlciBiaXRzdHJlYW0gYnVmZmVyIHNpemUKICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KQEAgLTI1MDcsMTQgKzIzODMsNiBAQAogICAgIGludCByY19vdmVycmlkZV9jb3VudDsKICAgICBSY092ZXJyaWRlICpyY19vdmVycmlkZTsKIAotI2lmIEZGX0FQSV9NUFZfT1BUCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQKLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIGNvbnN0IGNoYXIgKnJjX2VxOwotI2VuZGlmCi0KICAgICAvKioKICAgICAgKiBtYXhpbXVtIGJpdHJhdGUKICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KQEAgLTI1MjksMTcgKzIzOTcsNiBAQAogICAgICAqLwogICAgIGludDY0X3QgcmNfbWluX3JhdGU7CiAKLSNpZiBGRl9BUElfTVBWX09QVAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICBmbG9hdCByY19idWZmZXJfYWdncmVzc2l2aXR5OwotCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICBmbG9hdCByY19pbml0aWFsX2NwbHg7Ci0jZW5kaWYKLQogICAgIC8qKgogICAgICAqIFJhdGVjb250cm9sIGF0dGVtcHQgdG8gdXNlLCBhdCBtYXhpbXVtLCA8dmFsdWU+IG9mIHdoYXQgY2FuIGJlIHVzZWQgd2l0aG91dCBhbiB1bmRlcmZsb3cuCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCkBAIC0yNTY2LDkgKzI0MjMsNiBAQAogI2RlZmluZSBGRl9DT0RFUl9UWVBFX0FDICAgICAgICAxCiAjZGVmaW5lIEZGX0NPREVSX1RZUEVfUkFXICAgICAgIDIKICNkZWZpbmUgRkZfQ09ERVJfVFlQRV9STEUgICAgICAgMwotI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUwotI2RlZmluZSBGRl9DT0RFUl9UWVBFX0RFRkxBVEUgICA0Ci0jZW5kaWYgLyogRkZfQVBJX1VOVVNFRF9NRU1CRVJTICovCiAgICAgLyoqCiAgICAgICogQGRlcHJlY2F0ZWQgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQKICAgICAgKi8KQEAgLTI1ODIsMjAgKzI0MzYsNiBAQAogICAgIGludCBjb250ZXh0X21vZGVsOwogI2VuZGlmCiAKLSNpZiBGRl9BUElfTVBWX09QVAotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICBpbnQgbG1pbjsKLQotICAgIC8qKgotICAgICAqIEBkZXByZWNhdGVkIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICBpbnQgbG1heDsKLSNlbmRpZgotCiAjaWYgRkZfQVBJX1BSSVZBVEVfT1BUCiAgICAgLyoqIEBkZXByZWNhdGVkIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkICovCiAgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKQEAgLTI3MDYsMTYgKzI1NDYsMTAgQEAKICAgICAgKi8KICAgICBpbnQgd29ya2Fyb3VuZF9idWdzOwogI2RlZmluZSBGRl9CVUdfQVVUT0RFVEVDVCAgICAgICAxICAvLy88IGF1dG9kZXRlY3Rpb24KLSNpZiBGRl9BUElfT0xEX01TTVBFRzQKLSNkZWZpbmUgRkZfQlVHX09MRF9NU01QRUc0ICAgICAgMgotI2VuZGlmCiAjZGVmaW5lIEZGX0JVR19YVklEX0lMQUNFICAgICAgIDQKICNkZWZpbmUgRkZfQlVHX1VNUDQgICAgICAgICAgICAgOAogI2RlZmluZSBGRl9CVUdfTk9fUEFERElORyAgICAgICAxNgogI2RlZmluZSBGRl9CVUdfQU1WICAgICAgICAgICAgICAzMgotI2lmIEZGX0FQSV9BQ19WTEMKLSNkZWZpbmUgRkZfQlVHX0FDX1ZMQyAgICAgICAgICAgMCAgLy8vPCBXaWxsIGJlIHJlbW92ZWQsIGxpYmF2Y29kZWMgY2FuIG5vdyBoYW5kbGUgdGhlc2Ugbm9uLWNvbXBsaWFudCBmaWxlcyBieSBkZWZhdWx0LgotI2VuZGlmCiAjZGVmaW5lIEZGX0JVR19RUEVMX0NIUk9NQSAgICAgIDY0CiAjZGVmaW5lIEZGX0JVR19TVERfUVBFTCAgICAgICAgIDEyOAogI2RlZmluZSBGRl9CVUdfUVBFTF9DSFJPTUEyICAgICAyNTYKQEAgLTI3MjUsOSArMjU1OSwxMCBAQAogI2RlZmluZSBGRl9CVUdfRENfQ0xJUCAgICAgICAgICA0MDk2CiAjZGVmaW5lIEZGX0JVR19NUyAgICAgICAgICAgICAgIDgxOTIgLy8vPCBXb3JrIGFyb3VuZCB2YXJpb3VzIGJ1Z3MgaW4gTWljcm9zb2Z0J3MgYnJva2VuIGRlY29kZXJzLgogI2RlZmluZSBGRl9CVUdfVFJVTkNBVEVEICAgICAgIDE2Mzg0CisjZGVmaW5lIEZGX0JVR19JRURHRSAgICAgICAgICAgMzI3NjgKIAogICAgIC8qKgotICAgICAqIHN0cmljdGx5IGZvbGxvdyB0aGUgc3RhbmRhcmQgKE1QRUc0LCAuLi4pLgorICAgICAqIHN0cmljdGx5IGZvbGxvdyB0aGUgc3RhbmRhcmQgKE1QRUctNCwgLi4uKS4KICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KICAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gU1RSSUNUIG9yIGhpZ2hlciBtZWFucyB0aGUgZW5jb2RlciBhbmQgZGVjb2RlciB3aWxsCkBAIC0yNzc1LDE1ICsyNjEwLDEyIEBACiAjZGVmaW5lIEZGX0RFQlVHX0RDVF9DT0VGRiAgIDB4MDAwMDAwNDAKICNkZWZpbmUgRkZfREVCVUdfU0tJUCAgICAgICAgMHgwMDAwMDA4MAogI2RlZmluZSBGRl9ERUJVR19TVEFSVENPREUgICAweDAwMDAwMTAwCi0jaWYgRkZfQVBJX1VOVVNFRF9NRU1CRVJTCi0jZGVmaW5lIEZGX0RFQlVHX1BUUyAgICAgICAgIDB4MDAwMDAyMDAKLSNlbmRpZiAvKiBGRl9BUElfVU5VU0VEX01FTUJFUlMgKi8KICNkZWZpbmUgRkZfREVCVUdfRVIgICAgICAgICAgMHgwMDAwMDQwMAogI2RlZmluZSBGRl9ERUJVR19NTUNPICAgICAgICAweDAwMDAwODAwCiAjZGVmaW5lIEZGX0RFQlVHX0JVR1MgICAgICAgIDB4MDAwMDEwMDAKICNpZiBGRl9BUElfREVCVUdfTVYKLSNkZWZpbmUgRkZfREVCVUdfVklTX1FQICAgICAgMHgwMDAwMjAwMCAvLy88IG9ubHkgYWNjZXNzIHRocm91Z2ggQVZPcHRpb25zIGZyb20gb3V0c2lkZSBsaWJhdmNvZGVjCi0jZGVmaW5lIEZGX0RFQlVHX1ZJU19NQl9UWVBFIDB4MDAwMDQwMDAgLy8vPCBvbmx5IGFjY2VzcyB0aHJvdWdoIEFWT3B0aW9ucyBmcm9tIG91dHNpZGUgbGliYXZjb2RlYworI2RlZmluZSBGRl9ERUJVR19WSVNfUVAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEZGX0RFQlVHX1ZJU19NQl9UWVBFIDB4MDAwMDQwMDAKICNlbmRpZgogI2RlZmluZSBGRl9ERUJVR19CVUZGRVJTICAgICAweDAwMDA4MDAwCiAjZGVmaW5lIEZGX0RFQlVHX1RIUkVBRFMgICAgIDB4MDAwMTAwMDAKQEAgLTI3OTMsMTQgKzI2MjUsMTMgQEAKICNpZiBGRl9BUElfREVCVUdfTVYKICAgICAvKioKICAgICAgKiBkZWJ1ZwotICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdmNvZGVjIHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZyBBVk9wdGlvbnMKICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KICAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KICAgICAgKi8KICAgICBpbnQgZGVidWdfbXY7Ci0jZGVmaW5lIEZGX0RFQlVHX1ZJU19NVl9QX0ZPUiAgMHgwMDAwMDAwMSAvL3Zpc3VhbGl6ZSBmb3J3YXJkIHByZWRpY3RlZCBNVnMgb2YgUCBmcmFtZXMKLSNkZWZpbmUgRkZfREVCVUdfVklTX01WX0JfRk9SICAweDAwMDAwMDAyIC8vdmlzdWFsaXplIGZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBCIGZyYW1lcwotI2RlZmluZSBGRl9ERUJVR19WSVNfTVZfQl9CQUNLIDB4MDAwMDAwMDQgLy92aXN1YWxpemUgYmFja3dhcmQgcHJlZGljdGVkIE1WcyBvZiBCIGZyYW1lcworI2RlZmluZSBGRl9ERUJVR19WSVNfTVZfUF9GT1IgIDB4MDAwMDAwMDEgLy8gdmlzdWFsaXplIGZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBQLWZyYW1lcworI2RlZmluZSBGRl9ERUJVR19WSVNfTVZfQl9GT1IgIDB4MDAwMDAwMDIgLy8gdmlzdWFsaXplIGZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBCLWZyYW1lcworI2RlZmluZSBGRl9ERUJVR19WSVNfTVZfQl9CQUNLIDB4MDAwMDAwMDQgLy8gdmlzdWFsaXplIGJhY2t3YXJkIHByZWRpY3RlZCBNVnMgb2YgQi1mcmFtZXMKICNlbmRpZgogCiAgICAgLyoqCkBAIC0yODI4LDcgKzI2NTksNyBAQAogCiAKICAgICAvKioKLSAgICAgKiBvcGFxdWUgNjRiaXQgbnVtYmVyIChnZW5lcmFsbHkgYSBQVFMpIHRoYXQgd2lsbCBiZSByZW9yZGVyZWQgYW5kCisgICAgICogb3BhcXVlIDY0LWJpdCBudW1iZXIgKGdlbmVyYWxseSBhIFBUUykgdGhhdCB3aWxsIGJlIHJlb3JkZXJlZCBhbmQKICAgICAgKiBvdXRwdXQgaW4gQVZGcmFtZS5yZW9yZGVyZWRfb3BhcXVlCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCiAgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCkBAIC0yODQwLDcgKzI2NzEsNyBAQAogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZC4KICAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYwogICAgICAqLwotICAgIHN0cnVjdCBBVkhXQWNjZWwgKmh3YWNjZWw7CisgICAgY29uc3Qgc3RydWN0IEFWSFdBY2NlbCAqaHdhY2NlbDsKIAogICAgIC8qKgogICAgICAqIEhhcmR3YXJlIGFjY2VsZXJhdG9yIGNvbnRleHQuCkBAIC0yODg2LDI3ICsyNzE3LDEzIEBACiAjZGVmaW5lIEZGX0lEQ1RfU0lNUExFTU1YICAgICAzCiAjZGVmaW5lIEZGX0lEQ1RfQVJNICAgICAgICAgICA3CiAjZGVmaW5lIEZGX0lEQ1RfQUxUSVZFQyAgICAgICA4Ci0jaWYgRkZfQVBJX0FSQ0hfU0g0Ci0jZGVmaW5lIEZGX0lEQ1RfU0g0ICAgICAgICAgICA5Ci0jZW5kaWYKICNkZWZpbmUgRkZfSURDVF9TSU1QTEVBUk0gICAgIDEwCi0jaWYgRkZfQVBJX1VOVVNFRF9NRU1CRVJTCi0jZGVmaW5lIEZGX0lEQ1RfSVBQICAgICAgICAgICAxMwotI2VuZGlmIC8qIEZGX0FQSV9VTlVTRURfTUVNQkVSUyAqLwogI2RlZmluZSBGRl9JRENUX1hWSUQgICAgICAgICAgMTQKLSNpZiBGRl9BUElfSURDVF9YVklETU1YCi0jZGVmaW5lIEZGX0lEQ1RfWFZJRE1NWCAgICAgICAxNAotI2VuZGlmIC8qIEZGX0FQSV9JRENUX1hWSURNTVggKi8KICNkZWZpbmUgRkZfSURDVF9TSU1QTEVBUk1WNVRFIDE2CiAjZGVmaW5lIEZGX0lEQ1RfU0lNUExFQVJNVjYgICAxNwotI2lmIEZGX0FQSV9BUkNIX1NQQVJDCi0jZGVmaW5lIEZGX0lEQ1RfU0lNUExFVklTICAgICAxOAotI2VuZGlmCiAjZGVmaW5lIEZGX0lEQ1RfRkFBTiAgICAgICAgICAyMAogI2RlZmluZSBGRl9JRENUX1NJTVBMRU5FT04gICAgMjIKLSNpZiBGRl9BUElfQVJDSF9BTFBIQQotI2RlZmluZSBGRl9JRENUX1NJTVBMRUFMUEhBICAgMjMKLSNlbmRpZgorI2RlZmluZSBGRl9JRENUX05PTkUgICAgICAgICAgMjQgLyogVXNlZCBieSBYdk1DIHRvIGV4dHJhY3QgSURDVCBjb2VmZmljaWVudHMgd2l0aCBGRl9JRENUX1BFUk1fTk9ORSAqLwogI2RlZmluZSBGRl9JRENUX1NJTVBMRUFVVE8gICAgMTI4CiAKICAgICAvKioKQEAgLTI5MjgsOCArMjc0NSw2IEBACiAgICAgICogbG93IHJlc29sdXRpb24gZGVjb2RpbmcsIDEtPiAxLzIgc2l6ZSwgMi0+MS80IHNpemUKICAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKICAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KLSAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6Ci0gICAgICogYXZfY29kZWNfe2dldCxzZXR9X2xvd3JlcyhhdmN0eCkKICAgICAgKi8KICAgICAgaW50IGxvd3JlczsKICNlbmRpZgpAQCAtMzA0MCw2ICsyODU1LDEzIEBACiAjZGVmaW5lIEZGX1BST0ZJTEVfTVBFRzJfQUFDX0xPVyAxMjgKICNkZWZpbmUgRkZfUFJPRklMRV9NUEVHMl9BQUNfSEUgIDEzMQogCisjZGVmaW5lIEZGX1BST0ZJTEVfRE5YSEQgICAgICAgICAwCisjZGVmaW5lIEZGX1BST0ZJTEVfRE5YSFJfTEIgICAgICAxCisjZGVmaW5lIEZGX1BST0ZJTEVfRE5YSFJfU1EgICAgICAyCisjZGVmaW5lIEZGX1BST0ZJTEVfRE5YSFJfSFEgICAgICAzCisjZGVmaW5lIEZGX1BST0ZJTEVfRE5YSFJfSFFYICAgICA0CisjZGVmaW5lIEZGX1BST0ZJTEVfRE5YSFJfNDQ0ICAgICA1CisKICNkZWZpbmUgRkZfUFJPRklMRV9EVFMgICAgICAgICAyMAogI2RlZmluZSBGRl9QUk9GSUxFX0RUU19FUyAgICAgIDMwCiAjZGVmaW5lIEZGX1BST0ZJTEVfRFRTXzk2XzI0ICAgNDAKQEAgLTMwNjQsOCArMjg4NiwxMCBAQAogI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfSElHSCAgICAgICAgICAgICAgICAgMTAwCiAjZGVmaW5lIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzEwICAgICAgICAgICAgICAxMTAKICNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0hJR0hfMTBfSU5UUkEgICAgICAgICgxMTB8RkZfUFJPRklMRV9IMjY0X0lOVFJBKQorI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfTVVMVElWSUVXX0hJR0ggICAgICAgMTE4CiAjZGVmaW5lIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQyMiAgICAgICAgICAgICAxMjIKICNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyX0lOVFJBICAgICAgICgxMjJ8RkZfUFJPRklMRV9IMjY0X0lOVFJBKQorI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfU1RFUkVPX0hJR0ggICAgICAgICAgMTI4CiAjZGVmaW5lIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NCAgICAgICAgICAgICAxNDQKICNkZWZpbmUgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X1BSRURJQ1RJVkUgIDI0NAogI2RlZmluZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDRfSU5UUkEgICAgICAgKDI0NHxGRl9QUk9GSUxFX0gyNjRfSU5UUkEpCkBAIC0zMDkzLDkgKzI5MTcsOSBAQAogI2RlZmluZSBGRl9QUk9GSUxFX01QRUc0X1NJTVBMRV9TVFVESU8gICAgICAgICAgICAgMTQKICNkZWZpbmUgRkZfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9TSU1QTEUgICAgICAgICAgIDE1CiAKLSNkZWZpbmUgRkZfUFJPRklMRV9KUEVHMjAwMF9DU1RSRUFNX1JFU1RSSUNUSU9OXzAgICAwCi0jZGVmaW5lIEZGX1BST0ZJTEVfSlBFRzIwMDBfQ1NUUkVBTV9SRVNUUklDVElPTl8xICAgMQotI2RlZmluZSBGRl9QUk9GSUxFX0pQRUcyMDAwX0NTVFJFQU1fTk9fUkVTVFJJQ1RJT04gIDIKKyNkZWZpbmUgRkZfUFJPRklMRV9KUEVHMjAwMF9DU1RSRUFNX1JFU1RSSUNUSU9OXzAgICAxCisjZGVmaW5lIEZGX1BST0ZJTEVfSlBFRzIwMDBfQ1NUUkVBTV9SRVNUUklDVElPTl8xICAgMgorI2RlZmluZSBGRl9QUk9GSUxFX0pQRUcyMDAwX0NTVFJFQU1fTk9fUkVTVFJJQ1RJT04gIDMyNzY4CiAjZGVmaW5lIEZGX1BST0ZJTEVfSlBFRzIwMDBfRENJTkVNQV8ySyAgICAgICAgICAgICAgMwogI2RlZmluZSBGRl9QUk9GSUxFX0pQRUcyMDAwX0RDSU5FTUFfNEsgICAgICAgICAgICAgIDQKIApAQCAtMzEwOSw2ICsyOTMzLDE4IEBACiAjZGVmaW5lIEZGX1BST0ZJTEVfSEVWQ19NQUlOX1NUSUxMX1BJQ1RVUkUgICAgICAgICAgMwogI2RlZmluZSBGRl9QUk9GSUxFX0hFVkNfUkVYVCAgICAgICAgICAgICAgICAgICAgICAgIDQKIAorI2RlZmluZSBGRl9QUk9GSUxFX0FWMV9NQUlOICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRkZfUFJPRklMRV9BVjFfSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEZGX1BST0ZJTEVfQVYxX1BST0ZFU1NJT05BTCAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9CQVNFTElORV9EQ1QgICAgICAgICAgICAweGMwCisjZGVmaW5lIEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9FWFRFTkRFRF9TRVFVRU5USUFMX0RDVCAweGMxCisjZGVmaW5lIEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9QUk9HUkVTU0lWRV9EQ1QgICAgICAgICAweGMyCisjZGVmaW5lIEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9MT1NTTEVTUyAgICAgICAgICAgICAgICAweGMzCisjZGVmaW5lIEZGX1BST0ZJTEVfTUpQRUdfSlBFR19MUyAgICAgICAgICAgICAgICAgICAgICAgICAweGY3CisKKyNkZWZpbmUgRkZfUFJPRklMRV9TQkNfTVNCQyAgICAgICAgICAgICAgICAgICAgICAgICAxCisKICAgICAvKioKICAgICAgKiBsZXZlbAogICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyLgpAQCAtMzE0OSwxNSArMjk4NSw2IEBACiAgICAgdWludDhfdCAqc3VidGl0bGVfaGVhZGVyOwogICAgIGludCBzdWJ0aXRsZV9oZWFkZXJfc2l6ZTsKIAotI2lmIEZGX0FQSV9FUlJPUl9SQVRFCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSAnZXJyb3JfcmF0ZScgcHJpdmF0ZSBBVk9wdGlvbiBvZiB0aGUgbXBlZ3ZpZGVvCi0gICAgICogZW5jb2RlcnMKLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIGludCBlcnJvcl9yYXRlOwotI2VuZGlmCi0KICNpZiBGRl9BUElfVkJWX0RFTEFZCiAgICAgLyoqCiAgICAgICogVkJWIGRlbGF5IGNvZGVkIGluIHRoZSBsYXN0IGZyYW1lIChpbiBwZXJpb2RzIG9mIGEgMjcgTUh6IGNsb2NrKS4KQEAgLTMyMDcsNyArMzAzNCw4IEBACiAgICAgICogLSBkZWNvZGluZzogRm9yIGNvZGVjcyB0aGF0IHN0b3JlIGEgZnJhbWVyYXRlIHZhbHVlIGluIHRoZSBjb21wcmVzc2VkCiAgICAgICogICAgICAgICAgICAgYml0c3RyZWFtLCB0aGUgZGVjb2RlciBtYXkgZXhwb3J0IGl0IGhlcmUuIHsgMCwgMX0gd2hlbgogICAgICAqICAgICAgICAgICAgIHVua25vd24uCi0gICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBlbmNvZGluZzogTWF5IGJlIHVzZWQgdG8gc2lnbmFsIHRoZSBmcmFtZXJhdGUgb2YgQ0ZSIGNvbnRlbnQgdG8gYW4KKyAgICAgKiAgICAgICAgICAgICBlbmNvZGVyLgogICAgICAqLwogICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOwogCkBAIC0zMjIwLDggKzMwNDgsNiBAQAogCiAgICAgLyoqCiAgICAgICogVGltZWJhc2UgaW4gd2hpY2ggcGt0X2R0cy9wdHMgYW5kIEFWUGFja2V0LmR0cy9wdHMgYXJlLgotICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdmNvZGVjIHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZzoKLSAgICAgKiBhdl9jb2RlY197Z2V0LHNldH1fcGt0X3RpbWViYXNlKGF2Y3R4KQogICAgICAqIC0gZW5jb2RpbmcgdW51c2VkLgogICAgICAqIC0gZGVjb2Rpbmcgc2V0IGJ5IHVzZXIuCiAgICAgICovCkBAIC0zMjI5LDggKzMwNTUsNiBAQAogCiAgICAgLyoqCiAgICAgICogQVZDb2RlY0Rlc2NyaXB0b3IKLSAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6Ci0gICAgICogYXZfY29kZWNfe2dldCxzZXR9X2NvZGVjX2Rlc2NyaXB0b3IoYXZjdHgpCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkLgogICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSBsaWJhdmNvZGVjLgogICAgICAqLwpAQCAtMzI0MSw4ICszMDY1LDYgQEAKICAgICAgKiBsb3cgcmVzb2x1dGlvbiBkZWNvZGluZywgMS0+IDEvMiBzaXplLCAyLT4xLzQgc2l6ZQogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAogICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyLgotICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdmNvZGVjIHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZzoKLSAgICAgKiBhdl9jb2RlY197Z2V0LHNldH1fbG93cmVzKGF2Y3R4KQogICAgICAqLwogICAgICBpbnQgbG93cmVzOwogI2VuZGlmCkBAIC0zMjc0LDYgKzMwOTYsNyBAQAogI2RlZmluZSBGRl9TVUJfQ0hBUkVOQ19NT0RFX0RPX05PVEhJTkcgIC0xICAvLy88IGRvIG5vdGhpbmcgKGRlbXV4ZXIgb3V0cHV0cyBhIHN0cmVhbSBzdXBwb3NlZCB0byBiZSBhbHJlYWR5IGluIFVURi04LCBvciB0aGUgY29kZWMgaXMgYml0bWFwIGZvciBpbnN0YW5jZSkKICNkZWZpbmUgRkZfU1VCX0NIQVJFTkNfTU9ERV9BVVRPTUFUSUMgICAgMCAgLy8vPCBsaWJhdmNvZGVjIHdpbGwgc2VsZWN0IHRoZSBtb2RlIGl0c2VsZgogI2RlZmluZSBGRl9TVUJfQ0hBUkVOQ19NT0RFX1BSRV9ERUNPREVSICAxICAvLy88IHRoZSBBVlBhY2tldCBkYXRhIG5lZWRzIHRvIGJlIHJlY29kZWQgdG8gVVRGLTggYmVmb3JlIGJlaW5nIGZlZCB0byB0aGUgZGVjb2RlciwgcmVxdWlyZXMgaWNvbnYKKyNkZWZpbmUgRkZfU1VCX0NIQVJFTkNfTU9ERV9JR05PUkUgICAgICAgMiAgLy8vPCBuZWl0aGVyIGNvbnZlcnQgdGhlIHN1YnRpdGxlcywgbm9yIGNoZWNrIHRoZW0gZm9yIHZhbGlkIFVURi04CiAKICAgICAvKioKICAgICAgKiBTa2lwIHByb2Nlc3NpbmcgYWxwaGEgaWYgc3VwcG9ydGVkIGJ5IGNvZGVjLgpAQCAtMzI4Myw3ICszMTA2LDYgQEAKICAgICAgKiBIb3dldmVyIGZvciBmb3JtYXRzIHRoYXQgZG8gbm90IHVzZSBwcmUtbXVsdGlwbGllZCBhbHBoYQogICAgICAqIHRoZXJlIG1pZ2h0IGJlIHNlcmlvdXMgYXJ0ZWZhY3RzICh0aG91Z2ggZS5nLiBsaWJzd3NjYWxlIGN1cnJlbnRseQogICAgICAqIGFzc3VtZXMgcHJlLW11bHRpcGxpZWQgYWxwaGEgYW55d2F5KS4KLSAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmcgQVZPcHRpb25zCiAgICAgICoKICAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgdXNlcgogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZApAQCAtMzMwMCw3ICszMTIyLDYgQEAKICNpZiAhRkZfQVBJX0RFQlVHX01WCiAgICAgLyoqCiAgICAgICogZGVidWcgbW90aW9uIHZlY3RvcnMKLSAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmcgQVZPcHRpb25zCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCiAgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCiAgICAgICovCkBAIC0zMzEyLDcgKzMxMzMsNiBAQAogCiAgICAgLyoqCiAgICAgICogY3VzdG9tIGludHJhIHF1YW50aXphdGlvbiBtYXRyaXgKLSAgICAgKiBDb2RlIG91dHNpZGUgbGliYXZjb2RlYyBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmcgYXZfY29kZWNfZy9zZXRfY2hyb21hX2ludHJhX21hdHJpeCgpCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIsIGNhbiBiZSBOVUxMLgogICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZC4KICAgICAgKi8KQEAgLTMzMjEsOCArMzE0MSw2IEBACiAgICAgLyoqCiAgICAgICogZHVtcCBmb3JtYXQgc2VwYXJhdG9yLgogICAgICAqIGNhbiBiZSAiLCAiIG9yICJcbiAgICAgICIgb3IgYW55dGhpbmcgZWxzZQotICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdmNvZGVjIHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZyBBVk9wdGlvbnMKLSAgICAgKiAoTk8gZGlyZWN0IGFjY2VzcykuCiAgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIuCiAgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCiAgICAgICovCkBAIC0zMzMyLDEzICszMTUwLDEyIEBACiAgICAgICogJywnIHNlcGFyYXRlZCBsaXN0IG9mIGFsbG93ZWQgZGVjb2RlcnMuCiAgICAgICogSWYgTlVMTCB0aGVuIGFsbCBhcmUgYWxsb3dlZAogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAotICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSB1c2VyIHRocm91Z2ggQVZPUHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSB1c2VyCiAgICAgICovCiAgICAgY2hhciAqY29kZWNfd2hpdGVsaXN0OwogCi0gICAgLyoKKyAgICAvKioKICAgICAgKiBQcm9wZXJ0aWVzIG9mIHRoZSBzdHJlYW0gdGhhdCBnZXRzIGRlY29kZWQKLSAgICAgKiBUbyBiZSBhY2Nlc3NlZCB0aHJvdWdoIGF2X2NvZGVjX2dldF9wcm9wZXJ0aWVzKCkgKE5PIGRpcmVjdCBhY2Nlc3MpCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCiAgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IGxpYmF2Y29kZWMKICAgICAgKi8KQEAgLTMzNTUsMjQgKzMxNzIsMTY4IEBACiAgICAgQVZQYWNrZXRTaWRlRGF0YSAqY29kZWRfc2lkZV9kYXRhOwogICAgIGludCAgICAgICAgICAgIG5iX2NvZGVkX3NpZGVfZGF0YTsKIAorICAgIC8qKgorICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBBVkhXRnJhbWVzQ29udGV4dCBkZXNjcmliaW5nIHRoZSBpbnB1dCAoZm9yIGVuY29kaW5nKQorICAgICAqIG9yIG91dHB1dCAoZGVjb2RpbmcpIGZyYW1lcy4gVGhlIHJlZmVyZW5jZSBpcyBzZXQgYnkgdGhlIGNhbGxlciBhbmQKKyAgICAgKiBhZnRlcndhcmRzIG93bmVkIChhbmQgZnJlZWQpIGJ5IGxpYmF2Y29kZWMgLSBpdCBzaG91bGQgbmV2ZXIgYmUgcmVhZCBieQorICAgICAqIHRoZSBjYWxsZXIgYWZ0ZXIgYmVpbmcgc2V0LgorICAgICAqCisgICAgICogLSBkZWNvZGluZzogVGhpcyBmaWVsZCBzaG91bGQgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgZnJvbSB0aGUgZ2V0X2Zvcm1hdCgpCisgICAgICogICAgICAgICAgICAgY2FsbGJhY2suIFRoZSBwcmV2aW91cyByZWZlcmVuY2UgKGlmIGFueSkgd2lsbCBhbHdheXMgYmUKKyAgICAgKiAgICAgICAgICAgICB1bnJlZmZlZCBieSBsaWJhdmNvZGVjIGJlZm9yZSB0aGUgZ2V0X2Zvcm1hdCgpIGNhbGwuCisgICAgICoKKyAgICAgKiAgICAgICAgICAgICBJZiB0aGUgZGVmYXVsdCBnZXRfYnVmZmVyMigpIGlzIHVzZWQgd2l0aCBhIGh3YWNjZWwgcGl4ZWwKKyAgICAgKiAgICAgICAgICAgICBmb3JtYXQsIHRoZW4gdGhpcyBBVkhXRnJhbWVzQ29udGV4dCB3aWxsIGJlIHVzZWQgZm9yCisgICAgICogICAgICAgICAgICAgYWxsb2NhdGluZyB0aGUgZnJhbWUgYnVmZmVycy4KKyAgICAgKgorICAgICAqIC0gZW5jb2Rpbmc6IEZvciBoYXJkd2FyZSBlbmNvZGVycyBjb25maWd1cmVkIHRvIHVzZSBhIGh3YWNjZWwgcGl4ZWwKKyAgICAgKiAgICAgICAgICAgICBmb3JtYXQsIHRoaXMgZmllbGQgc2hvdWxkIGJlIHNldCBieSB0aGUgY2FsbGVyIHRvIGEgcmVmZXJlbmNlCisgICAgICogICAgICAgICAgICAgdG8gdGhlIEFWSFdGcmFtZXNDb250ZXh0IGRlc2NyaWJpbmcgaW5wdXQgZnJhbWVzLgorICAgICAqICAgICAgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0LmZvcm1hdCBtdXN0IGJlIGVxdWFsIHRvCisgICAgICogICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQucGl4X2ZtdC4KKyAgICAgKgorICAgICAqICAgICAgICAgICAgIFRoaXMgZmllbGQgc2hvdWxkIGJlIHNldCBiZWZvcmUgYXZjb2RlY19vcGVuMigpIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eDsKKworICAgIC8qKgorICAgICAqIENvbnRyb2wgdGhlIGZvcm0gb2YgQVZTdWJ0aXRsZS5yZWN0c1tOXS0+YXNzCisgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHVzZXIKKyAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKKyAgICAgKi8KKyAgICBpbnQgc3ViX3RleHRfZm9ybWF0OworI2RlZmluZSBGRl9TVUJfVEVYVF9GTVRfQVNTICAgICAgICAgICAgICAwCisjaWYgRkZfQVBJX0FTU19USU1JTkcKKyNkZWZpbmUgRkZfU1VCX1RFWFRfRk1UX0FTU19XSVRIX1RJTUlOR1MgMQorI2VuZGlmCisKKyAgICAvKioKKyAgICAgKiBBdWRpbyBvbmx5LiBUaGUgYW1vdW50IG9mIHBhZGRpbmcgKGluIHNhbXBsZXMpIGFwcGVuZGVkIGJ5IHRoZSBlbmNvZGVyIHRvCisgICAgICogdGhlIGVuZCBvZiB0aGUgYXVkaW8uIEkuZS4gdGhpcyBudW1iZXIgb2YgZGVjb2RlZCBzYW1wbGVzIG11c3QgYmUKKyAgICAgKiBkaXNjYXJkZWQgYnkgdGhlIGNhbGxlciBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB0byBnZXQgdGhlIG9yaWdpbmFsCisgICAgICogYXVkaW8gd2l0aG91dCBhbnkgdHJhaWxpbmcgcGFkZGluZy4KKyAgICAgKgorICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqLworICAgIGludCB0cmFpbGluZ19wYWRkaW5nOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBwaXhlbHMgcGVyIGltYWdlIHRvIG1heGltYWxseSBhY2NlcHQuCisgICAgICoKKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgdXNlcgorICAgICAqIC0gZW5jb2Rpbmc6IHNldCBieSB1c2VyCisgICAgICovCisgICAgaW50NjRfdCBtYXhfcGl4ZWxzOworCisgICAgLyoqCisgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIEFWSFdEZXZpY2VDb250ZXh0IGRlc2NyaWJpbmcgdGhlIGRldmljZSB3aGljaCB3aWxsCisgICAgICogYmUgdXNlZCBieSBhIGhhcmR3YXJlIGVuY29kZXIvZGVjb2Rlci4gIFRoZSByZWZlcmVuY2UgaXMgc2V0IGJ5IHRoZQorICAgICAqIGNhbGxlciBhbmQgYWZ0ZXJ3YXJkcyBvd25lZCAoYW5kIGZyZWVkKSBieSBsaWJhdmNvZGVjLgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgdXNlZCBpZiBlaXRoZXIgdGhlIGNvZGVjIGRldmljZSBkb2VzIG5vdCByZXF1aXJlCisgICAgICogaGFyZHdhcmUgZnJhbWVzIG9yIGFueSB0aGF0IGFyZSB1c2VkIGFyZSB0byBiZSBhbGxvY2F0ZWQgaW50ZXJuYWxseSBieQorICAgICAqIGxpYmF2Y29kZWMuICBJZiB0aGUgdXNlciB3aXNoZXMgdG8gc3VwcGx5IGFueSBvZiB0aGUgZnJhbWVzIHVzZWQgYXMKKyAgICAgKiBlbmNvZGVyIGlucHV0IG9yIGRlY29kZXIgb3V0cHV0IHRoZW4gaHdfZnJhbWVzX2N0eCBzaG91bGQgYmUgdXNlZAorICAgICAqIGluc3RlYWQuICBXaGVuIGh3X2ZyYW1lc19jdHggaXMgc2V0IGluIGdldF9mb3JtYXQoKSBmb3IgYSBkZWNvZGVyLCB0aGlzCisgICAgICogZmllbGQgd2lsbCBiZSBpZ25vcmVkIHdoaWxlIGRlY29kaW5nIHRoZSBhc3NvY2lhdGVkIHN0cmVhbSBzZWdtZW50LCBidXQKKyAgICAgKiBtYXkgYWdhaW4gYmUgdXNlZCBvbiBhIGZvbGxvd2luZyBvbmUgYWZ0ZXIgYW5vdGhlciBnZXRfZm9ybWF0KCkgY2FsbC4KKyAgICAgKgorICAgICAqIEZvciBib3RoIGVuY29kZXJzIGFuZCBkZWNvZGVycyB0aGlzIGZpZWxkIHNob3VsZCBiZSBzZXQgYmVmb3JlCisgICAgICogYXZjb2RlY19vcGVuMigpIGlzIGNhbGxlZCBhbmQgbXVzdCBub3QgYmUgd3JpdHRlbiB0byB0aGVyZWFmdGVyLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHNvbWUgZGVjb2RlcnMgbWF5IHJlcXVpcmUgdGhpcyBmaWVsZCB0byBiZSBzZXQgaW5pdGlhbGx5IGluCisgICAgICogb3JkZXIgdG8gc3VwcG9ydCBod19mcmFtZXNfY3R4IGF0IGFsbCAtIGluIHRoYXQgY2FzZSwgYWxsIGZyYW1lcworICAgICAqIGNvbnRleHRzIHVzZWQgbXVzdCBiZSBjcmVhdGVkIG9uIHRoZSBzYW1lIGRldmljZS4KKyAgICAgKi8KKyAgICBBVkJ1ZmZlclJlZiAqaHdfZGV2aWNlX2N0eDsKKworICAgIC8qKgorICAgICAqIEJpdCBzZXQgb2YgQVZfSFdBQ0NFTF9GTEFHXyogZmxhZ3MsIHdoaWNoIGFmZmVjdCBoYXJkd2FyZSBhY2NlbGVyYXRlZAorICAgICAqIGRlY29kaW5nIChpZiBhY3RpdmUpLgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyIChlaXRoZXIgYmVmb3JlIGF2Y29kZWNfb3BlbjIoKSwgb3IgaW4gdGhlCisgICAgICogICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQuZ2V0X2Zvcm1hdCBjYWxsYmFjaykKKyAgICAgKi8KKyAgICBpbnQgaHdhY2NlbF9mbGFnczsKKworICAgIC8qKgorICAgICAqIFZpZGVvIGRlY29kaW5nIG9ubHkuIENlcnRhaW4gdmlkZW8gY29kZWNzIHN1cHBvcnQgY3JvcHBpbmcsIG1lYW5pbmcgdGhhdAorICAgICAqIG9ubHkgYSBzdWItcmVjdGFuZ2xlIG9mIHRoZSBkZWNvZGVkIGZyYW1lIGlzIGludGVuZGVkIGZvciBkaXNwbGF5LiAgVGhpcworICAgICAqIG9wdGlvbiBjb250cm9scyBob3cgY3JvcHBpbmcgaXMgaGFuZGxlZCBieSBsaWJhdmNvZGVjLgorICAgICAqCisgICAgICogV2hlbiBzZXQgdG8gMSAodGhlIGRlZmF1bHQpLCBsaWJhdmNvZGVjIHdpbGwgYXBwbHkgY3JvcHBpbmcgaW50ZXJuYWxseS4KKyAgICAgKiBJLmUuIGl0IHdpbGwgbW9kaWZ5IHRoZSBvdXRwdXQgZnJhbWUgd2lkdGgvaGVpZ2h0IGZpZWxkcyBhbmQgb2Zmc2V0IHRoZQorICAgICAqIGRhdGEgcG9pbnRlcnMgKG9ubHkgYnkgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aGlsZSBwcmVzZXJ2aW5nIGFsaWdubWVudCwgb3IKKyAgICAgKiBieSB0aGUgZnVsbCBhbW91bnQgaWYgdGhlIEFWX0NPREVDX0ZMQUdfVU5BTElHTkVEIGZsYWcgaXMgc2V0KSBzbyB0aGF0CisgICAgICogdGhlIGZyYW1lcyBvdXRwdXQgYnkgdGhlIGRlY29kZXIgcmVmZXIgb25seSB0byB0aGUgY3JvcHBlZCBhcmVhLiBUaGUKKyAgICAgKiBjcm9wXyogZmllbGRzIG9mIHRoZSBvdXRwdXQgZnJhbWVzIHdpbGwgYmUgemVyby4KKyAgICAgKgorICAgICAqIFdoZW4gc2V0IHRvIDAsIHRoZSB3aWR0aC9oZWlnaHQgZmllbGRzIG9mIHRoZSBvdXRwdXQgZnJhbWVzIHdpbGwgYmUgc2V0CisgICAgICogdG8gdGhlIGNvZGVkIGRpbWVuc2lvbnMgYW5kIHRoZSBjcm9wXyogZmllbGRzIHdpbGwgZGVzY3JpYmUgdGhlIGNyb3BwaW5nCisgICAgICogcmVjdGFuZ2xlLiBBcHBseWluZyB0aGUgY3JvcHBpbmcgaXMgbGVmdCB0byB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogQHdhcm5pbmcgV2hlbiBoYXJkd2FyZSBhY2NlbGVyYXRpb24gd2l0aCBvcGFxdWUgb3V0cHV0IGZyYW1lcyBpcyB1c2VkLAorICAgICAqIGxpYmF2Y29kZWMgaXMgdW5hYmxlIHRvIGFwcGx5IGNyb3BwaW5nIGZyb20gdGhlIHRvcC9sZWZ0IGJvcmRlci4KKyAgICAgKgorICAgICAqIEBub3RlIHdoZW4gdGhpcyBvcHRpb24gaXMgc2V0IHRvIHplcm8sIHRoZSB3aWR0aC9oZWlnaHQgZmllbGRzIG9mIHRoZQorICAgICAqIEFWQ29kZWNDb250ZXh0IGFuZCBvdXRwdXQgQVZGcmFtZXMgaGF2ZSBkaWZmZXJlbnQgbWVhbmluZ3MuIFRoZSBjb2RlYworICAgICAqIGNvbnRleHQgZmllbGRzIHN0b3JlIGRpc3BsYXkgZGltZW5zaW9ucyAod2l0aCB0aGUgY29kZWQgZGltZW5zaW9ucyBpbgorICAgICAqIGNvZGVkX3dpZHRoL2hlaWdodCksIHdoaWxlIHRoZSBmcmFtZSBmaWVsZHMgc3RvcmUgdGhlIGNvZGVkIGRpbWVuc2lvbnMKKyAgICAgKiAod2l0aCB0aGUgZGlzcGxheSBkaW1lbnNpb25zIGJlaW5nIGRldGVybWluZWQgYnkgdGhlIGNyb3BfKiBmaWVsZHMpLgorICAgICAqLworICAgIGludCBhcHBseV9jcm9wcGluZzsKKworICAgIC8qCisgICAgICogVmlkZW8gZGVjb2Rpbmcgb25seS4gIFNldHMgdGhlIG51bWJlciBvZiBleHRyYSBoYXJkd2FyZSBmcmFtZXMgd2hpY2gKKyAgICAgKiB0aGUgZGVjb2RlciB3aWxsIGFsbG9jYXRlIGZvciB1c2UgYnkgdGhlIGNhbGxlci4gIFRoaXMgbXVzdCBiZSBzZXQKKyAgICAgKiBiZWZvcmUgYXZjb2RlY19vcGVuMigpIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIFNvbWUgaGFyZHdhcmUgZGVjb2RlcnMgcmVxdWlyZSBhbGwgZnJhbWVzIHRoYXQgdGhleSB3aWxsIHVzZSBmb3IKKyAgICAgKiBvdXRwdXQgdG8gYmUgZGVmaW5lZCBpbiBhZHZhbmNlIGJlZm9yZSBkZWNvZGluZyBzdGFydHMuICBGb3Igc3VjaAorICAgICAqIGRlY29kZXJzLCB0aGUgaGFyZHdhcmUgZnJhbWUgcG9vbCBtdXN0IHRoZXJlZm9yZSBiZSBvZiBhIGZpeGVkIHNpemUuCisgICAgICogVGhlIGV4dHJhIGZyYW1lcyBzZXQgaGVyZSBhcmUgb24gdG9wIG9mIGFueSBudW1iZXIgdGhhdCB0aGUgZGVjb2RlcgorICAgICAqIG5lZWRzIGludGVybmFsbHkgaW4gb3JkZXIgdG8gb3BlcmF0ZSBub3JtYWxseSAoZm9yIGV4YW1wbGUsIGZyYW1lcworICAgICAqIHVzZWQgYXMgcmVmZXJlbmNlIHBpY3R1cmVzKS4KKyAgICAgKi8KKyAgICBpbnQgZXh0cmFfaHdfZnJhbWVzOwogfSBBVkNvZGVjQ29udGV4dDsKIAorI2lmIEZGX0FQSV9DT0RFQ19HRVRfU0VUCisvKioKKyAqIEFjY2Vzc29ycyBmb3Igc29tZSBBVkNvZGVjQ29udGV4dCBmaWVsZHMuIFRoZXNlIHVzZWQgdG8gYmUgcHJvdmlkZWQgZm9yIEFCSQorICogY29tcGF0aWJpbGl0eSwgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIHVzZWQgYW55bW9yZS4KKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIEFWUmF0aW9uYWwgYXZfY29kZWNfZ2V0X3BrdF90aW1lYmFzZSAgICAgICAgIChjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgICAgICAgYXZfY29kZWNfc2V0X3BrdF90aW1lYmFzZSAgICAgICAgIChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUmF0aW9uYWwgdmFsKTsKIAorYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICphdl9jb2RlY19nZXRfY29kZWNfZGVzY3JpcHRvcihjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgICAgICAgICAgICAgICAgICAgICBhdl9jb2RlY19zZXRfY29kZWNfZGVzY3JpcHRvcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjKTsKIAorYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHVuc2lnbmVkIGF2X2NvZGVjX2dldF9jb2RlY19wcm9wZXJ0aWVzKGNvbnN0IEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CiAKKyNpZiBGRl9BUElfTE9XUkVTCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50ICBhdl9jb2RlY19nZXRfbG93cmVzKGNvbnN0IEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCBhdl9jb2RlY19zZXRfbG93cmVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHZhbCk7CisjZW5kaWYKIAorYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCAgYXZfY29kZWNfZ2V0X3NlZWtfcHJlcm9sbChjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgYXZfY29kZWNfc2V0X3NlZWtfcHJlcm9sbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCB2YWwpOwogCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdWludDE2X3QgKmF2X2NvZGVjX2dldF9jaHJvbWFfaW50cmFfbWF0cml4KGNvbnN0IEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCBhdl9jb2RlY19zZXRfY2hyb21hX2ludHJhX21hdHJpeChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQxNl90ICp2YWwpOworI2VuZGlmCiAKIC8qKgogICogQVZQcm9maWxlLgpAQCAtMzM4Miw2ICszMzQzLDYxIEBACiAgICAgY29uc3QgY2hhciAqbmFtZTsgLy8vPCBzaG9ydCBuYW1lIGZvciB0aGUgcHJvZmlsZQogfSBBVlByb2ZpbGU7CiAKK2VudW0geworICAgIC8qKgorICAgICAqIFRoZSBjb2RlYyBzdXBwb3J0cyB0aGlzIGZvcm1hdCB2aWEgdGhlIGh3X2RldmljZV9jdHggaW50ZXJmYWNlLgorICAgICAqCisgICAgICogV2hlbiBzZWxlY3RpbmcgdGhpcyBmb3JtYXQsIEFWQ29kZWNDb250ZXh0Lmh3X2RldmljZV9jdHggc2hvdWxkCisgICAgICogaGF2ZSBiZWVuIHNldCB0byBhIGRldmljZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgYmVmb3JlIGNhbGxpbmcKKyAgICAgKiBhdmNvZGVjX29wZW4yKCkuCisgICAgICovCisgICAgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9IV19ERVZJQ0VfQ1RYID0gMHgwMSwKKyAgICAvKioKKyAgICAgKiBUaGUgY29kZWMgc3VwcG9ydHMgdGhpcyBmb3JtYXQgdmlhIHRoZSBod19mcmFtZXNfY3R4IGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIFdoZW4gc2VsZWN0aW5nIHRoaXMgZm9ybWF0IGZvciBhIGRlY29kZXIsCisgICAgICogQVZDb2RlY0NvbnRleHQuaHdfZnJhbWVzX2N0eCBzaG91bGQgYmUgc2V0IHRvIGEgc3VpdGFibGUgZnJhbWVzCisgICAgICogY29udGV4dCBpbnNpZGUgdGhlIGdldF9mb3JtYXQoKSBjYWxsYmFjay4gIFRoZSBmcmFtZXMgY29udGV4dAorICAgICAqIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgb24gYSBkZXZpY2Ugb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAgICAqLworICAgIEFWX0NPREVDX0hXX0NPTkZJR19NRVRIT0RfSFdfRlJBTUVTX0NUWCA9IDB4MDIsCisgICAgLyoqCisgICAgICogVGhlIGNvZGVjIHN1cHBvcnRzIHRoaXMgZm9ybWF0IGJ5IHNvbWUgaW50ZXJuYWwgbWV0aG9kLgorICAgICAqCisgICAgICogVGhpcyBmb3JtYXQgY2FuIGJlIHNlbGVjdGVkIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiAtCisgICAgICogbm8gZGV2aWNlIG9yIGZyYW1lcyBjb250ZXh0IGlzIHJlcXVpcmVkLgorICAgICAqLworICAgIEFWX0NPREVDX0hXX0NPTkZJR19NRVRIT0RfSU5URVJOQUwgICAgICA9IDB4MDQsCisgICAgLyoqCisgICAgICogVGhlIGNvZGVjIHN1cHBvcnRzIHRoaXMgZm9ybWF0IGJ5IHNvbWUgYWQtaG9jIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEFkZGl0aW9uYWwgc2V0dGluZ3MgYW5kL29yIGZ1bmN0aW9uIGNhbGxzIGFyZSByZXF1aXJlZC4gIFNlZSB0aGUKKyAgICAgKiBjb2RlYy1zcGVjaWZpYyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLiAgKE1ldGhvZHMgcmVxdWlyaW5nCisgICAgICogdGhpcyBzb3J0IG9mIGNvbmZpZ3VyYXRpb24gYXJlIGRlcHJlY2F0ZWQgYW5kIG90aGVycyBzaG91bGQgYmUKKyAgICAgKiB1c2VkIGluIHByZWZlcmVuY2UuKQorICAgICAqLworICAgIEFWX0NPREVDX0hXX0NPTkZJR19NRVRIT0RfQURfSE9DICAgICAgICA9IDB4MDgsCit9OworCit0eXBlZGVmIHN0cnVjdCBBVkNvZGVjSFdDb25maWcgeworICAgIC8qKgorICAgICAqIEEgaGFyZHdhcmUgcGl4ZWwgZm9ybWF0IHdoaWNoIHRoZSBjb2RlYyBjYW4gdXNlLgorICAgICAqLworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworICAgIC8qKgorICAgICAqIEJpdCBzZXQgb2YgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF8qIGZsYWdzLCBkZXNjcmliaW5nIHRoZSBwb3NzaWJsZQorICAgICAqIHNldHVwIG1ldGhvZHMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgaW50IG1ldGhvZHM7CisgICAgLyoqCisgICAgICogVGhlIGRldmljZSB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIE11c3QgYmUgc2V0IGZvciBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0hXX0RFVklDRV9DVFggYW5kCisgICAgICogQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9IV19GUkFNRVNfQ1RYLCBvdGhlcndpc2UgdW51c2VkLgorICAgICAqLworICAgIGVudW0gQVZIV0RldmljZVR5cGUgZGV2aWNlX3R5cGU7Cit9IEFWQ29kZWNIV0NvbmZpZzsKKwogdHlwZWRlZiBzdHJ1Y3QgQVZDb2RlY0RlZmF1bHQgQVZDb2RlY0RlZmF1bHQ7CiAKIHN0cnVjdCBBVlN1YnRpdGxlOwpAQCAtMzQxNCwxMCArMzQzMCwyMiBAQAogICAgIGNvbnN0IGludCAqc3VwcG9ydGVkX3NhbXBsZXJhdGVzOyAgICAgICAvLy88IGFycmF5IG9mIHN1cHBvcnRlZCBhdWRpbyBzYW1wbGVyYXRlcywgb3IgTlVMTCBpZiB1bmtub3duLCBhcnJheSBpcyB0ZXJtaW5hdGVkIGJ5IDAKICAgICBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0ICpzYW1wbGVfZm10czsgLy8vPCBhcnJheSBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdHMsIG9yIE5VTEwgaWYgdW5rbm93biwgYXJyYXkgaXMgdGVybWluYXRlZCBieSAtMQogICAgIGNvbnN0IHVpbnQ2NF90ICpjaGFubmVsX2xheW91dHM7ICAgICAgICAgLy8vPCBhcnJheSBvZiBzdXBwb3J0IGNoYW5uZWwgbGF5b3V0cywgb3IgTlVMTCBpZiB1bmtub3duLiBhcnJheSBpcyB0ZXJtaW5hdGVkIGJ5IDAKLSAgICB1aW50OF90IG1heF9sb3dyZXM7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXhpbXVtIHZhbHVlIGZvciBsb3dyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZWNvZGVyLCBubyBkaXJlY3QgYWNjZXNzLCB1c2UgYXZfY29kZWNfZ2V0X21heF9sb3dyZXMoKQorICAgIHVpbnQ4X3QgbWF4X2xvd3JlczsgICAgICAgICAgICAgICAgICAgICAvLy88IG1heGltdW0gdmFsdWUgZm9yIGxvd3JlcyBzdXBwb3J0ZWQgYnkgdGhlIGRlY29kZXIKICAgICBjb25zdCBBVkNsYXNzICpwcml2X2NsYXNzOyAgICAgICAgICAgICAgLy8vPCBBVkNsYXNzIGZvciB0aGUgcHJpdmF0ZSBjb250ZXh0CiAgICAgY29uc3QgQVZQcm9maWxlICpwcm9maWxlczsgICAgICAgICAgICAgIC8vLzwgYXJyYXkgb2YgcmVjb2duaXplZCBwcm9maWxlcywgb3IgTlVMTCBpZiB1bmtub3duLCBhcnJheSBpcyB0ZXJtaW5hdGVkIGJ5IHtGRl9QUk9GSUxFX1VOS05PV059CiAKKyAgICAvKioKKyAgICAgKiBHcm91cCBuYW1lIG9mIHRoZSBjb2RlYyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBUaGlzIGlzIGEgc2hvcnQgc3ltYm9saWMgbmFtZSBvZiB0aGUgd3JhcHBlciBiYWNraW5nIHRoaXMgY29kZWMuIEEKKyAgICAgKiB3cmFwcGVyIHVzZXMgc29tZSBraW5kIG9mIGV4dGVybmFsIGltcGxlbWVudGF0aW9uIGZvciB0aGUgY29kZWMsIHN1Y2gKKyAgICAgKiBhcyBhbiBleHRlcm5hbCBsaWJyYXJ5LCBvciBhIGNvZGVjIGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBPUyBvcgorICAgICAqIHRoZSBoYXJkd2FyZS4KKyAgICAgKiBJZiB0aGlzIGZpZWxkIGlzIE5VTEwsIHRoaXMgaXMgYSBidWlsdGluLCBsaWJhdmNvZGVjIG5hdGl2ZSBjb2RlYy4KKyAgICAgKiBJZiBub24tTlVMTCwgdGhpcyB3aWxsIGJlIHRoZSBzdWZmaXggaW4gQVZDb2RlYy5uYW1lIGluIG1vc3QgY2FzZXMKKyAgICAgKiAodXN1YWxseSBBVkNvZGVjLm5hbWUgd2lsbCBiZSBvZiB0aGUgZm9ybSAiPGNvZGVjX25hbWU+Xzx3cmFwcGVyX25hbWU+IikuCisgICAgICovCisgICAgY29uc3QgY2hhciAqd3JhcHBlcl9uYW1lOworCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICogTm8gZmllbGRzIGJlbG93IHRoaXMgbGluZSBhcmUgcGFydCBvZiB0aGUgcHVibGljIEFQSS4gVGhleQogICAgICAqIG1heSBub3QgYmUgdXNlZCBvdXRzaWRlIG9mIGxpYmF2Y29kZWMgYW5kIGNhbiBiZSBjaGFuZ2VkIGFuZApAQCAtMzQ1NCw2ICszNDgyLDkgQEAKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemUgY29kZWMgc3RhdGljIGRhdGEsIGNhbGxlZCBmcm9tIGF2Y29kZWNfcmVnaXN0ZXIoKS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgbm90IGludGVuZGVkIGZvciB0aW1lIGNvbnN1bWluZyBvcGVyYXRpb25zIGFzIGl0IGlzCisgICAgICogcnVuIGZvciBldmVyeSBjb2RlYyByZWdhcmRsZXNzIG9mIHRoYXQgY29kZWMgYmVpbmcgdXNlZC4KICAgICAgKi8KICAgICB2b2lkICgqaW5pdF9zdGF0aWNfZGF0YSkoc3RydWN0IEFWQ29kZWMgKmNvZGVjKTsKIApAQCAtMzQ3NSw2ICszNTA2LDIzIEBACiAgICAgaW50ICgqZGVjb2RlKShBVkNvZGVjQ29udGV4dCAqLCB2b2lkICpvdXRkYXRhLCBpbnQgKm91dGRhdGFfc2l6ZSwgQVZQYWNrZXQgKmF2cGt0KTsKICAgICBpbnQgKCpjbG9zZSkoQVZDb2RlY0NvbnRleHQgKik7CiAgICAgLyoqCisgICAgICogRW5jb2RlIEFQSSB3aXRoIGRlY291cGxlZCBwYWNrZXQvZnJhbWUgZGF0YWZsb3cuIFRoZSBBUEkgaXMgdGhlCisgICAgICogc2FtZSBhcyB0aGUgYXZjb2RlY18gcHJlZml4ZWQgQVBJcyAoYXZjb2RlY19zZW5kX2ZyYW1lKCkgZXRjLiksIGV4Y2VwdAorICAgICAqIHRoYXQ6CisgICAgICogLSBuZXZlciBjYWxsZWQgaWYgdGhlIGNvZGVjIGlzIGNsb3NlZCBvciB0aGUgd3JvbmcgdHlwZSwKKyAgICAgKiAtIGlmIEFWX0NPREVDX0NBUF9ERUxBWSBpcyBub3Qgc2V0LCBkcmFpbiBmcmFtZXMgYXJlIG5ldmVyIHNlbnQsCisgICAgICogLSBvbmx5IG9uZSBkcmFpbiBmcmFtZSBpcyBldmVyIHBhc3NlZCBkb3duLAorICAgICAqLworICAgIGludCAoKnNlbmRfZnJhbWUpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZGcmFtZSAqZnJhbWUpOworICAgIGludCAoKnJlY2VpdmVfcGFja2V0KShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCk7CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgQVBJIHdpdGggZGVjb3VwbGVkIHBhY2tldC9mcmFtZSBkYXRhZmxvdy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAgICAgKiB0byBnZXQgb25lIG91dHB1dCBmcmFtZS4gSXQgc2hvdWxkIGNhbGwgZmZfZGVjb2RlX2dldF9wYWNrZXQoKSB0byBvYnRhaW4KKyAgICAgKiBpbnB1dCBkYXRhLgorICAgICAqLworICAgIGludCAoKnJlY2VpdmVfZnJhbWUpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpOworICAgIC8qKgogICAgICAqIEZsdXNoIGJ1ZmZlcnMuCiAgICAgICogV2lsbCBiZSBjYWxsZWQgd2hlbiBzZWVraW5nCiAgICAgICovCkBAIC0zNDg0LDE0ICszNTMyLDQ1IEBACiAgICAgICogU2VlIEZGX0NPREVDX0NBUF8qIGluIGludGVybmFsLmgKICAgICAgKi8KICAgICBpbnQgY2Fwc19pbnRlcm5hbDsKKworICAgIC8qKgorICAgICAqIERlY29kaW5nIG9ubHksIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYml0c3RyZWFtIGZpbHRlcnMgdG8gYXBwbHkgdG8KKyAgICAgKiBwYWNrZXRzIGJlZm9yZSBkZWNvZGluZy4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpic2ZzOworCisgICAgLyoqCisgICAgICogQXJyYXkgb2YgcG9pbnRlcnMgdG8gaGFyZHdhcmUgY29uZmlndXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYywKKyAgICAgKiBvciBOVUxMIGlmIG5vIGhhcmR3YXJlIHN1cHBvcnRlZC4gIFRoZSBhcnJheSBpcyB0ZXJtaW5hdGVkIGJ5IGEgTlVMTAorICAgICAqIHBvaW50ZXIuCisgICAgICoKKyAgICAgKiBUaGUgdXNlciBjYW4gb25seSBhY2Nlc3MgdGhpcyBmaWVsZCB2aWEgYXZjb2RlY19nZXRfaHdfY29uZmlnKCkuCisgICAgICovCisgICAgY29uc3Qgc3RydWN0IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsICoqaHdfY29uZmlnczsKIH0gQVZDb2RlYzsKIAorI2lmIEZGX0FQSV9DT0RFQ19HRVRfU0VUCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2X2NvZGVjX2dldF9tYXhfbG93cmVzKGNvbnN0IEFWQ29kZWMgKmNvZGVjKTsKKyNlbmRpZgogCiBzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQ7CiAKIC8qKgorICogUmV0cmlldmUgc3VwcG9ydGVkIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb25zIGZvciBhIGNvZGVjLgorICoKKyAqIFZhbHVlcyBvZiBpbmRleCBmcm9tIHplcm8gdG8gc29tZSBtYXhpbXVtIHJldHVybiB0aGUgaW5kZXhlZCBjb25maWd1cmF0aW9uCisgKiBkZXNjcmlwdG9yOyBhbGwgb3RoZXIgdmFsdWVzIHJldHVybiBOVUxMLiAgSWYgdGhlIGNvZGVjIGRvZXMgbm90IHN1cHBvcnQKKyAqIGFueSBoYXJkd2FyZSBjb25maWd1cmF0aW9ucyB0aGVuIGl0IHdpbGwgYWx3YXlzIHJldHVybiBOVUxMLgorICovCitjb25zdCBBVkNvZGVjSFdDb25maWcgKmF2Y29kZWNfZ2V0X2h3X2NvbmZpZyhjb25zdCBBVkNvZGVjICpjb2RlYywgaW50IGluZGV4KTsKKworLyoqCiAgKiBAZGVmZ3JvdXAgbGF2Y19od2FjY2VsIEFWSFdBY2NlbAorICoKKyAqIEBub3RlICBOb3RoaW5nIGluIHRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBhY2Nlc3NlZCBieSB0aGUgdXNlci4gIEF0IHNvbWUKKyAqICAgICAgICBwb2ludCBpbiBmdXR1cmUgaXQgd2lsbCBub3QgYmUgZXh0ZXJuYWxseSB2aXNpYmxlIGF0IGFsbC4KKyAqCiAgKiBAewogICovCiB0eXBlZGVmIHN0cnVjdCBBVkhXQWNjZWwgewpAQCAtMzUyNSw3ICszNjA0LDcgQEAKIAogICAgIC8qKgogICAgICAqIEhhcmR3YXJlIGFjY2VsZXJhdGVkIGNvZGVjIGNhcGFiaWxpdGllcy4KLSAgICAgKiBzZWUgSFdBQ0NFTF9DT0RFQ19DQVBfKgorICAgICAqIHNlZSBBVl9IV0FDQ0VMX0NPREVDX0NBUF8qCiAgICAgICovCiAgICAgaW50IGNhcGFiaWxpdGllczsKIApAQCAtMzUzNiw3ICszNjE1LDYgQEAKICAgICAgKiBOZXcgcHVibGljIGZpZWxkcyBzaG91bGQgYmUgYWRkZWQgcmlnaHQgYWJvdmUuCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICovCi0gICAgc3RydWN0IEFWSFdBY2NlbCAqbmV4dDsKIAogICAgIC8qKgogICAgICAqIEFsbG9jYXRlIGEgY3VzdG9tIGJ1ZmZlcgpAQCAtMzU2MCw2ICszNjM4LDIwIEBACiAgICAgaW50ICgqc3RhcnRfZnJhbWUpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCB1aW50MzJfdCBidWZfc2l6ZSk7CiAKICAgICAvKioKKyAgICAgKiBDYWxsYmFjayBmb3IgcGFyYW1ldGVyIGRhdGEgKFNQUy9QUFMvVlBTIGV0YykuCisgICAgICoKKyAgICAgKiBVc2VmdWwgZm9yIGhhcmR3YXJlIGRlY29kZXJzIHdoaWNoIGtlZXAgcGVyc2lzdGVudCBzdGF0ZSBhYm91dCB0aGUKKyAgICAgKiB2aWRlbyBwYXJhbWV0ZXJzLCBhbmQgbmVlZCB0byByZWNlaXZlIGFueSBjaGFuZ2VzIHRvIHVwZGF0ZSB0aGF0IHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGF2Y3R4IHRoZSBjb2RlYyBjb250ZXh0CisgICAgICogQHBhcmFtIHR5cGUgdGhlIG5hbCB1bml0IHR5cGUKKyAgICAgKiBAcGFyYW0gYnVmIHRoZSBuYWwgdW5pdCBkYXRhIGJ1ZmZlcgorICAgICAqIEBwYXJhbSBidWZfc2l6ZSB0aGUgc2l6ZSBvZiB0aGUgbmFsIHVuaXQgaW4gYnl0ZXMKKyAgICAgKiBAcmV0dXJuIHplcm8gaWYgc3VjY2Vzc2Z1bCwgYSBuZWdhdGl2ZSB2YWx1ZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBpbnQgKCpkZWNvZGVfcGFyYW1zKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCB0eXBlLCBjb25zdCB1aW50OF90ICpidWYsIHVpbnQzMl90IGJ1Zl9zaXplKTsKKworICAgIC8qKgogICAgICAqIENhbGxiYWNrIGZvciBlYWNoIHNsaWNlLgogICAgICAqCiAgICAgICogTWVhbmluZ2Z1bCBzbGljZSBpbmZvcm1hdGlvbiAoY29kZWMgc3BlY2lmaWMpIGlzIGd1YXJhbnRlZWQgdG8KQEAgLTM1OTYsNyArMzY4OCw3IEBACiAgICAgLyoqCiAgICAgICogQ2FsbGVkIGZvciBldmVyeSBNYWNyb2Jsb2NrIGluIGEgc2xpY2UuCiAgICAgICoKLSAgICAgKiBYdk1DIHVzZXMgaXQgdG8gcmVwbGFjZSB0aGUgZmZfbXB2X2RlY29kZV9tYigpLgorICAgICAqIFh2TUMgdXNlcyBpdCB0byByZXBsYWNlIHRoZSBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIoKS4KICAgICAgKiBJbnN0ZWFkIG9mIGRlY29kaW5nIHRvIHJhdyBwaWN0dXJlLCBNQiBwYXJhbWV0ZXJzIGFyZQogICAgICAqIHN0b3JlZCBpbiBhbiBhcnJheSBwcm92aWRlZCBieSB0aGUgdmlkZW8gZHJpdmVyLgogICAgICAqCkBAIC0zNjI2LDkgKzM3MTgsMzAgQEAKICAgICAgKiBBVkNvZGVjSW50ZXJuYWwuaHdhY2NlbF9wcml2X2RhdGEuCiAgICAgICovCiAgICAgaW50IHByaXZfZGF0YV9zaXplOworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgaHdhY2NlbCBjYXBhYmlsaXRpZXMuCisgICAgICovCisgICAgaW50IGNhcHNfaW50ZXJuYWw7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIHRoZSBnaXZlbiBod19mcmFtZXMgY29udGV4dCB3aXRoIGN1cnJlbnQgY29kZWMgcGFyYW1ldGVycy4gQ2FsbGVkCisgICAgICogZnJvbSBnZXRfZm9ybWF0LiBSZWZlciB0byBhdmNvZGVjX2dldF9od19mcmFtZXNfcGFyYW1ldGVycygpIGZvcgorICAgICAqIGRldGFpbHMuCisgICAgICoKKyAgICAgKiBUaGlzIENBTiBiZSBjYWxsZWQgYmVmb3JlIEFWSFdBY2NlbC5pbml0IGlzIGNhbGxlZCwgYW5kIHlvdSBtdXN0IGFzc3VtZQorICAgICAqIHRoYXQgYXZjdHgtPmh3YWNjZWxfcHJpdl9kYXRhIGlzIGludmFsaWQuCisgICAgICovCisgICAgaW50ICgqZnJhbWVfcGFyYW1zKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4KTsKIH0gQVZIV0FjY2VsOwogCiAvKioKKyAqIEhXQWNjZWwgaXMgZXhwZXJpbWVudGFsIGFuZCBpcyB0aHVzIGF2b2lkZWQgaW4gZmF2b3Igb2Ygbm9uIGV4cGVyaW1lbnRhbAorICogY29kZWNzCisgKi8KKyNkZWZpbmUgQVZfSFdBQ0NFTF9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMIDB4MDIwMAorCisvKioKICAqIEhhcmR3YXJlIGFjY2VsZXJhdGlvbiBzaG91bGQgYmUgdXNlZCBmb3IgZGVjb2RpbmcgZXZlbiBpZiB0aGUgY29kZWMgbGV2ZWwKICAqIHVzZWQgaXMgdW5rbm93biBvciBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgbGV2ZWwgcmVwb3J0ZWQgYnkgdGhlCiAgKiBoYXJkd2FyZSBkcml2ZXIuCkBAIC0zNjQ1LDYgKzM3NTgsMjAgQEAKICNkZWZpbmUgQVZfSFdBQ0NFTF9GTEFHX0FMTE9XX0hJR0hfREVQVEggKDEgPDwgMSkKIAogLyoqCisgKiBIYXJkd2FyZSBhY2NlbGVyYXRpb24gc2hvdWxkIHN0aWxsIGJlIGF0dGVtcHRlZCBmb3IgZGVjb2Rpbmcgd2hlbiB0aGUKKyAqIGNvZGVjIHByb2ZpbGUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlcG9ydGVkIGNhcGFiaWxpdGllcyBvZiB0aGUgaGFyZHdhcmUuCisgKgorICogRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlIHVzZWQgdG8gdHJ5IHRvIGRlY29kZSBiYXNlbGluZSBwcm9maWxlIEguMjY0CisgKiBzdHJlYW1zIGluIGhhcmR3YXJlIC0gaXQgd2lsbCBvZnRlbiBzdWNjZWVkLCBiZWNhdXNlIG1hbnkgc3RyZWFtcyBtYXJrZWQKKyAqIGFzIGJhc2VsaW5lIHByb2ZpbGUgYWN0dWFsbHkgY29uZm9ybSB0byBjb25zdHJhaW5lZCBiYXNlbGluZSBwcm9maWxlLgorICoKKyAqIEB3YXJuaW5nIElmIHRoZSBzdHJlYW0gaXMgYWN0dWFsbHkgbm90IHN1cHBvcnRlZCB0aGVuIHRoZSBiZWhhdmlvdXIgaXMKKyAqICAgICAgICAgIHVuZGVmaW5lZCwgYW5kIG1heSBpbmNsdWRlIHJldHVybmluZyBlbnRpcmVseSBpbmNvcnJlY3Qgb3V0cHV0CisgKiAgICAgICAgICB3aGlsZSBpbmRpY2F0aW5nIHN1Y2Nlc3MuCisgKi8KKyNkZWZpbmUgQVZfSFdBQ0NFTF9GTEFHX0FMTE9XX1BST0ZJTEVfTUlTTUFUQ0ggKDEgPDwgMikKKworLyoqCiAgKiBAfQogICovCiAKQEAgLTM3NDAsMTEgKzM4NjcsMTgzIEBACiB9IEFWU3VidGl0bGU7CiAKIC8qKgorICogVGhpcyBzdHJ1Y3QgZGVzY3JpYmVzIHRoZSBwcm9wZXJ0aWVzIG9mIGFuIGVuY29kZWQgc3RyZWFtLgorICoKKyAqIHNpemVvZihBVkNvZGVjUGFyYW1ldGVycykgaXMgbm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFCSSwgdGhpcyBzdHJ1Y3QgbXVzdAorICogYmUgYWxsb2NhdGVkIHdpdGggYXZjb2RlY19wYXJhbWV0ZXJzX2FsbG9jKCkgYW5kIGZyZWVkIHdpdGgKKyAqIGF2Y29kZWNfcGFyYW1ldGVyc19mcmVlKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWQ29kZWNQYXJhbWV0ZXJzIHsKKyAgICAvKioKKyAgICAgKiBHZW5lcmFsIHR5cGUgb2YgdGhlIGVuY29kZWQgZGF0YS4KKyAgICAgKi8KKyAgICBlbnVtIEFWTWVkaWFUeXBlIGNvZGVjX3R5cGU7CisgICAgLyoqCisgICAgICogU3BlY2lmaWMgdHlwZSBvZiB0aGUgZW5jb2RlZCBkYXRhICh0aGUgY29kZWMgdXNlZCkuCisgICAgICovCisgICAgZW51bSBBVkNvZGVjSUQgICBjb2RlY19pZDsKKyAgICAvKioKKyAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb2RlYyAoY29ycmVzcG9uZHMgdG8gdGhlIEFWSSBGT1VSQ0MpLgorICAgICAqLworICAgIHVpbnQzMl90ICAgICAgICAgY29kZWNfdGFnOworCisgICAgLyoqCisgICAgICogRXh0cmEgYmluYXJ5IGRhdGEgbmVlZGVkIGZvciBpbml0aWFsaXppbmcgdGhlIGRlY29kZXIsIGNvZGVjLWRlcGVuZGVudC4KKyAgICAgKgorICAgICAqIE11c3QgYmUgYWxsb2NhdGVkIHdpdGggYXZfbWFsbG9jKCkgYW5kIHdpbGwgYmUgZnJlZWQgYnkKKyAgICAgKiBhdmNvZGVjX3BhcmFtZXRlcnNfZnJlZSgpLiBUaGUgYWxsb2NhdGVkIHNpemUgb2YgZXh0cmFkYXRhIG11c3QgYmUgYXQKKyAgICAgKiBsZWFzdCBleHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUsIHdpdGggdGhlIHBhZGRpbmcKKyAgICAgKiBieXRlcyB6ZXJvZWQuCisgICAgICovCisgICAgdWludDhfdCAqZXh0cmFkYXRhOworICAgIC8qKgorICAgICAqIFNpemUgb2YgdGhlIGV4dHJhZGF0YSBjb250ZW50IGluIGJ5dGVzLgorICAgICAqLworICAgIGludCAgICAgIGV4dHJhZGF0YV9zaXplOworCisgICAgLyoqCisgICAgICogLSB2aWRlbzogdGhlIHBpeGVsIGZvcm1hdCwgdGhlIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGVudW0gQVZQaXhlbEZvcm1hdC4KKyAgICAgKiAtIGF1ZGlvOiB0aGUgc2FtcGxlIGZvcm1hdCwgdGhlIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGVudW0gQVZTYW1wbGVGb3JtYXQuCisgICAgICovCisgICAgaW50IGZvcm1hdDsKKworICAgIC8qKgorICAgICAqIFRoZSBhdmVyYWdlIGJpdHJhdGUgb2YgdGhlIGVuY29kZWQgZGF0YSAoaW4gYml0cyBwZXIgc2Vjb25kKS4KKyAgICAgKi8KKyAgICBpbnQ2NF90IGJpdF9yYXRlOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBiaXRzIHBlciBzYW1wbGUgaW4gdGhlIGNvZGVkd29yZHMuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgYml0cmF0ZSBwZXIgc2FtcGxlLiBJdCBpcyBtYW5kYXRvcnkgZm9yIGEgYnVuY2ggb2YKKyAgICAgKiBmb3JtYXRzIHRvIGFjdHVhbGx5IGRlY29kZSB0aGVtLiBJdCdzIHRoZSBudW1iZXIgb2YgYml0cyBmb3Igb25lIHNhbXBsZSBpbgorICAgICAqIHRoZSBhY3R1YWwgY29kZWQgYml0c3RyZWFtLgorICAgICAqCisgICAgICogVGhpcyBjb3VsZCBiZSBmb3IgZXhhbXBsZSA0IGZvciBBRFBDTQorICAgICAqIEZvciBQQ00gZm9ybWF0cyB0aGlzIG1hdGNoZXMgYml0c19wZXJfcmF3X3NhbXBsZQorICAgICAqIENhbiBiZSAwCisgICAgICovCisgICAgaW50IGJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIG51bWJlciBvZiB2YWxpZCBiaXRzIGluIGVhY2ggb3V0cHV0IHNhbXBsZS4gSWYgdGhlCisgICAgICogc2FtcGxlIGZvcm1hdCBoYXMgbW9yZSBiaXRzLCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBhcmUgYWRkaXRpb25hbAorICAgICAqIHBhZGRpbmcgYml0cywgd2hpY2ggYXJlIGFsd2F5cyAwLiBVc2UgcmlnaHQgc2hpZnRzIHRvIHJlZHVjZSB0aGUgc2FtcGxlCisgICAgICogdG8gaXRzIGFjdHVhbCBzaXplLiBGb3IgZXhhbXBsZSwgYXVkaW8gZm9ybWF0cyB3aXRoIDI0IGJpdCBzYW1wbGVzIHdpbGwKKyAgICAgKiBoYXZlIGJpdHNfcGVyX3Jhd19zYW1wbGUgc2V0IHRvIDI0LCBhbmQgZm9ybWF0IHNldCB0byBBVl9TQU1QTEVfRk1UX1MzMi4KKyAgICAgKiBUbyBnZXQgdGhlIG9yaWdpbmFsIHNhbXBsZSB1c2UgIihpbnQzMl90KXNhbXBsZSA+PiA4Ii4iCisgICAgICoKKyAgICAgKiBGb3IgQURQQ00gdGhpcyBtaWdodCBiZSAxMiBvciAxNiBvciBzaW1pbGFyCisgICAgICogQ2FuIGJlIDAKKyAgICAgKi8KKyAgICBpbnQgYml0c19wZXJfcmF3X3NhbXBsZTsKKworICAgIC8qKgorICAgICAqIENvZGVjLXNwZWNpZmljIGJpdHN0cmVhbSByZXN0cmljdGlvbnMgdGhhdCB0aGUgc3RyZWFtIGNvbmZvcm1zIHRvLgorICAgICAqLworICAgIGludCBwcm9maWxlOworICAgIGludCBsZXZlbDsKKworICAgIC8qKgorICAgICAqIFZpZGVvIG9ubHkuIFRoZSBkaW1lbnNpb25zIG9mIHRoZSB2aWRlbyBmcmFtZSBpbiBwaXhlbHMuCisgICAgICovCisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisKKyAgICAvKioKKyAgICAgKiBWaWRlbyBvbmx5LiBUaGUgYXNwZWN0IHJhdGlvICh3aWR0aCAvIGhlaWdodCkgd2hpY2ggYSBzaW5nbGUgcGl4ZWwKKyAgICAgKiBzaG91bGQgaGF2ZSB3aGVuIGRpc3BsYXllZC4KKyAgICAgKgorICAgICAqIFdoZW4gdGhlIGFzcGVjdCByYXRpbyBpcyB1bmtub3duIC8gdW5kZWZpbmVkLCB0aGUgbnVtZXJhdG9yIHNob3VsZCBiZQorICAgICAqIHNldCB0byAwICh0aGUgZGVub21pbmF0b3IgbWF5IGhhdmUgYW55IHZhbHVlKS4KKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIHNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICAvKioKKyAgICAgKiBWaWRlbyBvbmx5LiBUaGUgb3JkZXIgb2YgdGhlIGZpZWxkcyBpbiBpbnRlcmxhY2VkIHZpZGVvLgorICAgICAqLworICAgIGVudW0gQVZGaWVsZE9yZGVyICAgICAgICAgICAgICAgICAgZmllbGRfb3JkZXI7CisKKyAgICAvKioKKyAgICAgKiBWaWRlbyBvbmx5LiBBZGRpdGlvbmFsIGNvbG9yc3BhY2UgY2hhcmFjdGVyaXN0aWNzLgorICAgICAqLworICAgIGVudW0gQVZDb2xvclJhbmdlICAgICAgICAgICAgICAgICAgY29sb3JfcmFuZ2U7CisgICAgZW51bSBBVkNvbG9yUHJpbWFyaWVzICAgICAgICAgICAgICBjb2xvcl9wcmltYXJpZXM7CisgICAgZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyBjb2xvcl90cmM7CisgICAgZW51bSBBVkNvbG9yU3BhY2UgICAgICAgICAgICAgICAgICBjb2xvcl9zcGFjZTsKKyAgICBlbnVtIEFWQ2hyb21hTG9jYXRpb24gICAgICAgICAgICAgIGNocm9tYV9sb2NhdGlvbjsKKworICAgIC8qKgorICAgICAqIFZpZGVvIG9ubHkuIE51bWJlciBvZiBkZWxheWVkIGZyYW1lcy4KKyAgICAgKi8KKyAgICBpbnQgdmlkZW9fZGVsYXk7CisKKyAgICAvKioKKyAgICAgKiBBdWRpbyBvbmx5LiBUaGUgY2hhbm5lbCBsYXlvdXQgYml0bWFzay4gTWF5IGJlIDAgaWYgdGhlIGNoYW5uZWwgbGF5b3V0IGlzCisgICAgICogdW5rbm93biBvciB1bnNwZWNpZmllZCwgb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgbXVzdCBiZSBlcXVhbCB0bworICAgICAqIHRoZSBjaGFubmVscyBmaWVsZC4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dDsKKyAgICAvKioKKyAgICAgKiBBdWRpbyBvbmx5LiBUaGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLgorICAgICAqLworICAgIGludCAgICAgIGNoYW5uZWxzOworICAgIC8qKgorICAgICAqIEF1ZGlvIG9ubHkuIFRoZSBudW1iZXIgb2YgYXVkaW8gc2FtcGxlcyBwZXIgc2Vjb25kLgorICAgICAqLworICAgIGludCAgICAgIHNhbXBsZV9yYXRlOworICAgIC8qKgorICAgICAqIEF1ZGlvIG9ubHkuIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGNvZGVkIGF1ZGlvIGZyYW1lLCByZXF1aXJlZCBieSBzb21lCisgICAgICogZm9ybWF0cy4KKyAgICAgKgorICAgICAqIENvcnJlc3BvbmRzIHRvIG5CbG9ja0FsaWduIGluIFdBVkVGT1JNQVRFWC4KKyAgICAgKi8KKyAgICBpbnQgICAgICBibG9ja19hbGlnbjsKKyAgICAvKioKKyAgICAgKiBBdWRpbyBvbmx5LiBBdWRpbyBmcmFtZSBzaXplLCBpZiBrbm93bi4gUmVxdWlyZWQgYnkgc29tZSBmb3JtYXRzIHRvIGJlIHN0YXRpYy4KKyAgICAgKi8KKyAgICBpbnQgICAgICBmcmFtZV9zaXplOworCisgICAgLyoqCisgICAgICogQXVkaW8gb25seS4gVGhlIGFtb3VudCBvZiBwYWRkaW5nIChpbiBzYW1wbGVzKSBpbnNlcnRlZCBieSB0aGUgZW5jb2RlciBhdAorICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvLiBJLmUuIHRoaXMgbnVtYmVyIG9mIGxlYWRpbmcgZGVjb2RlZCBzYW1wbGVzCisgICAgICogbXVzdCBiZSBkaXNjYXJkZWQgYnkgdGhlIGNhbGxlciB0byBnZXQgdGhlIG9yaWdpbmFsIGF1ZGlvIHdpdGhvdXQgbGVhZGluZworICAgICAqIHBhZGRpbmcuCisgICAgICovCisgICAgaW50IGluaXRpYWxfcGFkZGluZzsKKyAgICAvKioKKyAgICAgKiBBdWRpbyBvbmx5LiBUaGUgYW1vdW50IG9mIHBhZGRpbmcgKGluIHNhbXBsZXMpIGFwcGVuZGVkIGJ5IHRoZSBlbmNvZGVyIHRvCisgICAgICogdGhlIGVuZCBvZiB0aGUgYXVkaW8uIEkuZS4gdGhpcyBudW1iZXIgb2YgZGVjb2RlZCBzYW1wbGVzIG11c3QgYmUKKyAgICAgKiBkaXNjYXJkZWQgYnkgdGhlIGNhbGxlciBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB0byBnZXQgdGhlIG9yaWdpbmFsCisgICAgICogYXVkaW8gd2l0aG91dCBhbnkgdHJhaWxpbmcgcGFkZGluZy4KKyAgICAgKi8KKyAgICBpbnQgdHJhaWxpbmdfcGFkZGluZzsKKyAgICAvKioKKyAgICAgKiBBdWRpbyBvbmx5LiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBza2lwIGFmdGVyIGEgZGlzY29udGludWl0eS4KKyAgICAgKi8KKyAgICBpbnQgc2Vla19wcmVyb2xsOworfSBBVkNvZGVjUGFyYW1ldGVyczsKKworLyoqCisgKiBJdGVyYXRlIG92ZXIgYWxsIHJlZ2lzdGVyZWQgY29kZWNzLgorICoKKyAqIEBwYXJhbSBvcGFxdWUgYSBwb2ludGVyIHdoZXJlIGxpYmF2Y29kZWMgd2lsbCBzdG9yZSB0aGUgaXRlcmF0aW9uIHN0YXRlLiBNdXN0CisgKiAgICAgICAgICAgICAgIHBvaW50IHRvIE5VTEwgdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbi4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXh0IHJlZ2lzdGVyZWQgY29kZWMgb3IgTlVMTCB3aGVuIHRoZSBpdGVyYXRpb24gaXMKKyAqICAgICAgICAgZmluaXNoZWQKKyAqLworY29uc3QgQVZDb2RlYyAqYXZfY29kZWNfaXRlcmF0ZSh2b2lkICoqb3BhcXVlKTsKKworI2lmIEZGX0FQSV9ORVhUCisvKioKICAqIElmIGMgaXMgTlVMTCwgcmV0dXJucyB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBjb2RlYywKICAqIGlmIGMgaXMgbm9uLU5VTEwsIHJldHVybnMgdGhlIG5leHQgcmVnaXN0ZXJlZCBjb2RlYyBhZnRlciBjLAogICogb3IgTlVMTCBpZiBjIGlzIHRoZSBsYXN0IG9uZS4KICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIEFWQ29kZWMgKmF2X2NvZGVjX25leHQoY29uc3QgQVZDb2RlYyAqYyk7CisjZW5kaWYKIAogLyoqCiAgKiBSZXR1cm4gdGhlIExJQkFWQ09ERUNfVkVSU0lPTl9JTlQgY29uc3RhbnQuCkBAIC0zNzYxLDYgKzQwNjAsNyBAQAogICovCiBjb25zdCBjaGFyICphdmNvZGVjX2xpY2Vuc2Uodm9pZCk7CiAKKyNpZiBGRl9BUElfTkVYVAogLyoqCiAgKiBSZWdpc3RlciB0aGUgY29kZWMgY29kZWMgYW5kIGluaXRpYWxpemUgbGliYXZjb2RlYy4KICAqCkBAIC0zNzY5LDYgKzQwNjksNyBAQAogICoKICAqIEBzZWUgYXZjb2RlY19yZWdpc3Rlcl9hbGwoKQogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCBhdmNvZGVjX3JlZ2lzdGVyKEFWQ29kZWMgKmNvZGVjKTsKIAogLyoqCkBAIC0zNzgxLDcgKzQwODIsOSBAQAogICogQHNlZSBhdl9yZWdpc3Rlcl9jb2RlY19wYXJzZXIKICAqIEBzZWUgYXZfcmVnaXN0ZXJfYml0c3RyZWFtX2ZpbHRlcgogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCBhdmNvZGVjX3JlZ2lzdGVyX2FsbCh2b2lkKTsKKyNlbmRpZgogCiAvKioKICAqIEFsbG9jYXRlIGFuIEFWQ29kZWNDb250ZXh0IGFuZCBzZXQgaXRzIGZpZWxkcyB0byBkZWZhdWx0IHZhbHVlcy4gVGhlCkBAIC0zNzk1LDcgKzQwOTgsNiBAQAogICogICAgICAgICAgICAgIGltcG9ydGFudCBtYWlubHkgZm9yIGVuY29kZXJzLCBlLmcuIGxpYngyNjQpLgogICoKICAqIEByZXR1cm4gQW4gQVZDb2RlY0NvbnRleHQgZmlsbGVkIHdpdGggZGVmYXVsdCB2YWx1ZXMgb3IgTlVMTCBvbiBmYWlsdXJlLgotICogQHNlZSBhdmNvZGVjX2dldF9jb250ZXh0X2RlZmF1bHRzCiAgKi8KIEFWQ29kZWNDb250ZXh0ICphdmNvZGVjX2FsbG9jX2NvbnRleHQzKGNvbnN0IEFWQ29kZWMgKmNvZGVjKTsKIApAQCAtMzgwNSwxNiArNDEwNywxNCBAQAogICovCiB2b2lkIGF2Y29kZWNfZnJlZV9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICoqYXZjdHgpOwogCisjaWYgRkZfQVBJX0dFVF9DT05URVhUX0RFRkFVTFRTCiAvKioKLSAqIFNldCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBBVkNvZGVjQ29udGV4dCB0byBkZWZhdWx0IHZhbHVlcyBjb3JyZXNwb25kaW5nCi0gKiB0byB0aGUgZ2l2ZW4gY29kZWMgKGRlZmF1bHRzIG1heSBiZSBjb2RlYy1kZXBlbmRlbnQpLgotICoKLSAqIERvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgYSBub24tTlVMTCBjb2RlYyBoYXMgYmVlbiBwYXNzZWQKLSAqIHRvIGF2Y29kZWNfYWxsb2NfY29udGV4dDMoKSB0aGF0IGFsbG9jYXRlZCB0aGlzIEFWQ29kZWNDb250ZXh0LgotICogSWYgY29kZWMgaXMgbm9uLU5VTEwsIGl0IGlzIGlsbGVnYWwgdG8gY2FsbCBhdmNvZGVjX29wZW4yKCkgd2l0aCBhCi0gKiBkaWZmZXJlbnQgY29kZWMgb24gdGhpcyBBVkNvZGVjQ29udGV4dC4KKyAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSB1c2VkLCBhcyBjbG9zaW5nIGFuZCBvcGVuaW5nIGEgY29kZWMKKyAqIGNvbnRleHQgbXVsdGlwbGUgdGltZSBpcyBub3Qgc3VwcG9ydGVkLiBBIG5ldyBjb2RlYyBjb250ZXh0IHNob3VsZCBiZQorICogYWxsb2NhdGVkIGZvciBlYWNoIG5ldyB1c2UuCiAgKi8KIGludCBhdmNvZGVjX2dldF9jb250ZXh0X2RlZmF1bHRzMyhBVkNvZGVjQ29udGV4dCAqcywgY29uc3QgQVZDb2RlYyAqY29kZWMpOworI2VuZGlmCiAKIC8qKgogICogR2V0IHRoZSBBVkNsYXNzIGZvciBBVkNvZGVjQ29udGV4dC4gSXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aApAQCAtMzgyNCw2ICs0MTI0LDcgQEAKICAqLwogY29uc3QgQVZDbGFzcyAqYXZjb2RlY19nZXRfY2xhc3Modm9pZCk7CiAKKyNpZiBGRl9BUElfQ09QWV9DT05URVhUCiAvKioKICAqIEdldCB0aGUgQVZDbGFzcyBmb3IgQVZGcmFtZS4gSXQgY2FuIGJlIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aAogICogQVZfT1BUX1NFQVJDSF9GQUtFX09CSiBmb3IgZXhhbWluaW5nIG9wdGlvbnMuCkBAIC0zODUwLDggKzQxNTEsNTggQEAKICAqICAgICAgICAgICAgIGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCksIGJ1dCBvdGhlcndpc2UgdW5pbml0aWFsaXplZAogICogQHBhcmFtIHNyYyBzb3VyY2UgY29kZWMgY29udGV4dAogICogQHJldHVybiBBVkVSUk9SKCkgb24gZXJyb3IgKGUuZy4gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IpLCAwIG9uIHN1Y2Nlc3MKKyAqCisgKiBAZGVwcmVjYXRlZCBUaGUgc2VtYW50aWNzIG9mIHRoaXMgZnVuY3Rpb24gYXJlIGlsbC1kZWZpbmVkIGFuZCBpdCBzaG91bGQgbm90CisgKiBiZSB1c2VkLiBJZiB5b3UgbmVlZCB0byB0cmFuc2ZlciB0aGUgc3RyZWFtIHBhcmFtZXRlcnMgZnJvbSBvbmUgY29kZWMgY29udGV4dAorICogdG8gYW5vdGhlciwgdXNlIGFuIGludGVybWVkaWF0ZSBBVkNvZGVjUGFyYW1ldGVycyBpbnN0YW5jZSBhbmQgdGhlCisgKiBhdmNvZGVjX3BhcmFtZXRlcnNfZnJvbV9jb250ZXh0KCkgLyBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dCgpCisgKiBmdW5jdGlvbnMuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgYXZjb2RlY19jb3B5X2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRlc3QsIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpOworI2VuZGlmCisKKy8qKgorICogQWxsb2NhdGUgYSBuZXcgQVZDb2RlY1BhcmFtZXRlcnMgYW5kIHNldCBpdHMgZmllbGRzIHRvIGRlZmF1bHQgdmFsdWVzCisgKiAodW5rbm93bi9pbnZhbGlkLzApLiBUaGUgcmV0dXJuZWQgc3RydWN0IG11c3QgYmUgZnJlZWQgd2l0aAorICogYXZjb2RlY19wYXJhbWV0ZXJzX2ZyZWUoKS4KKyAqLworQVZDb2RlY1BhcmFtZXRlcnMgKmF2Y29kZWNfcGFyYW1ldGVyc19hbGxvYyh2b2lkKTsKKworLyoqCisgKiBGcmVlIGFuIEFWQ29kZWNQYXJhbWV0ZXJzIGluc3RhbmNlIGFuZCBldmVyeXRoaW5nIGFzc29jaWF0ZWQgd2l0aCBpdCBhbmQKKyAqIHdyaXRlIE5VTEwgdG8gdGhlIHN1cHBsaWVkIHBvaW50ZXIuCisgKi8KK3ZvaWQgYXZjb2RlY19wYXJhbWV0ZXJzX2ZyZWUoQVZDb2RlY1BhcmFtZXRlcnMgKipwYXIpOworCisvKioKKyAqIENvcHkgdGhlIGNvbnRlbnRzIG9mIHNyYyB0byBkc3QuIEFueSBhbGxvY2F0ZWQgZmllbGRzIGluIGRzdCBhcmUgZnJlZWQgYW5kCisgKiByZXBsYWNlZCB3aXRoIG5ld2x5IGFsbG9jYXRlZCBkdXBsaWNhdGVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiBzcmMuCisgKgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShBVkNvZGVjUGFyYW1ldGVycyAqZHN0LCBjb25zdCBBVkNvZGVjUGFyYW1ldGVycyAqc3JjKTsKKworLyoqCisgKiBGaWxsIHRoZSBwYXJhbWV0ZXJzIHN0cnVjdCBiYXNlZCBvbiB0aGUgdmFsdWVzIGZyb20gdGhlIHN1cHBsaWVkIGNvZGVjCisgKiBjb250ZXh0LiBBbnkgYWxsb2NhdGVkIGZpZWxkcyBpbiBwYXIgYXJlIGZyZWVkIGFuZCByZXBsYWNlZCB3aXRoIGR1cGxpY2F0ZXMKKyAqIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiBjb2RlYy4KKyAqCisgKiBAcmV0dXJuID49IDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZjb2RlY19wYXJhbWV0ZXJzX2Zyb21fY29udGV4dChBVkNvZGVjUGFyYW1ldGVycyAqcGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZDb2RlY0NvbnRleHQgKmNvZGVjKTsKKworLyoqCisgKiBGaWxsIHRoZSBjb2RlYyBjb250ZXh0IGJhc2VkIG9uIHRoZSB2YWx1ZXMgZnJvbSB0aGUgc3VwcGxpZWQgY29kZWMKKyAqIHBhcmFtZXRlcnMuIEFueSBhbGxvY2F0ZWQgZmllbGRzIGluIGNvZGVjIHRoYXQgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZmllbGQgaW4KKyAqIHBhciBhcmUgZnJlZWQgYW5kIHJlcGxhY2VkIHdpdGggZHVwbGljYXRlcyBvZiB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCBpbiBwYXIuCisgKiBGaWVsZHMgaW4gY29kZWMgdGhhdCBkbyBub3QgaGF2ZSBhIGNvdW50ZXJwYXJ0IGluIHBhciBhcmUgbm90IHRvdWNoZWQuCisgKgorICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChBVkNvZGVjQ29udGV4dCAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcik7CiAKIC8qKgogICogSW5pdGlhbGl6ZSB0aGUgQVZDb2RlY0NvbnRleHQgdG8gdXNlIHRoZSBnaXZlbiBBVkNvZGVjLiBQcmlvciB0byB1c2luZyB0aGlzCkBAIC0zODY0LDcgKzQyMTUsNyBAQAogICogQHdhcm5pbmcgVGhpcyBmdW5jdGlvbiBpcyBub3QgdGhyZWFkIHNhZmUhCiAgKgogICogQG5vdGUgQWx3YXlzIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgdXNpbmcgZGVjb2Rpbmcgcm91dGluZXMgKHN1Y2ggYXMKLSAqIEByZWYgYXZjb2RlY19kZWNvZGVfdmlkZW8yKCkpLgorICogQHJlZiBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoKSkuCiAgKgogICogQGNvZGUKICAqIGF2Y29kZWNfcmVnaXN0ZXJfYWxsKCk7CkBAIC0zODgyLDkgKzQyMzMsOCBAQAogICogQHBhcmFtIGF2Y3R4IFRoZSBjb250ZXh0IHRvIGluaXRpYWxpemUuCiAgKiBAcGFyYW0gY29kZWMgVGhlIGNvZGVjIHRvIG9wZW4gdGhpcyBjb250ZXh0IGZvci4gSWYgYSBub24tTlVMTCBjb2RlYyBoYXMgYmVlbgogICogICAgICAgICAgICAgIHByZXZpb3VzbHkgcGFzc2VkIHRvIGF2Y29kZWNfYWxsb2NfY29udGV4dDMoKSBvcgotICogICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X2NvbnRleHRfZGVmYXVsdHMzKCkgZm9yIHRoaXMgY29udGV4dCwgdGhlbiB0aGlzCi0gKiAgICAgICAgICAgICAgcGFyYW1ldGVyIE1VU1QgYmUgZWl0aGVyIE5VTEwgb3IgZXF1YWwgdG8gdGhlIHByZXZpb3VzbHkgcGFzc2VkCi0gKiAgICAgICAgICAgICAgY29kZWMuCisgKiAgICAgICAgICAgICAgZm9yIHRoaXMgY29udGV4dCwgdGhlbiB0aGlzIHBhcmFtZXRlciBNVVNUIGJlIGVpdGhlciBOVUxMIG9yCisgKiAgICAgICAgICAgICAgZXF1YWwgdG8gdGhlIHByZXZpb3VzbHkgcGFzc2VkIGNvZGVjLgogICogQHBhcmFtIG9wdGlvbnMgQSBkaWN0aW9uYXJ5IGZpbGxlZCB3aXRoIEFWQ29kZWNDb250ZXh0IGFuZCBjb2RlYy1wcml2YXRlIG9wdGlvbnMuCiAgKiAgICAgICAgICAgICAgICBPbiByZXR1cm4gdGhpcyBvYmplY3Qgd2lsbCBiZSBmaWxsZWQgd2l0aCBvcHRpb25zIHRoYXQgd2VyZSBub3QgZm91bmQuCiAgKgpAQCAtMzg5OSw5ICs0MjQ5LDEzIEBACiAgKiAoYnV0IG5vdCB0aGUgQVZDb2RlY0NvbnRleHQgaXRzZWxmKS4KICAqCiAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gb24gYW4gQVZDb2RlY0NvbnRleHQgdGhhdCBoYXNuJ3QgYmVlbiBvcGVuZWQgd2lsbCBmcmVlCi0gKiB0aGUgY29kZWMtc3BlY2lmaWMgZGF0YSBhbGxvY2F0ZWQgaW4gYXZjb2RlY19hbGxvY19jb250ZXh0MygpIC8KLSAqIGF2Y29kZWNfZ2V0X2NvbnRleHRfZGVmYXVsdHMzKCkgd2l0aCBhIG5vbi1OVUxMIGNvZGVjLiBTdWJzZXF1ZW50IGNhbGxzIHdpbGwKLSAqIGRvIG5vdGhpbmcuCisgKiB0aGUgY29kZWMtc3BlY2lmaWMgZGF0YSBhbGxvY2F0ZWQgaW4gYXZjb2RlY19hbGxvY19jb250ZXh0MygpIHdpdGggYSBub24tTlVMTAorICogY29kZWMuIFN1YnNlcXVlbnQgY2FsbHMgd2lsbCBkbyBub3RoaW5nLgorICoKKyAqIEBub3RlIERvIG5vdCB1c2UgdGhpcyBmdW5jdGlvbi4gVXNlIGF2Y29kZWNfZnJlZV9jb250ZXh0KCkgdG8gZGVzdHJveSBhCisgKiBjb2RlYyBjb250ZXh0IChlaXRoZXIgb3BlbiBvciBjbG9zZWQpLiBPcGVuaW5nIGFuZCBjbG9zaW5nIGEgY29kZWMgY29udGV4dAorICogbXVsdGlwbGUgdGltZXMgaXMgbm90IHN1cHBvcnRlZCBhbnltb3JlIC0tIHVzZSBtdWx0aXBsZSBjb2RlYyBjb250ZXh0cworICogaW5zdGVhZC4KICAqLwogaW50IGF2Y29kZWNfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKIApAQCAtMzk0NCwxMyArNDI5OCwxMyBAQAogICogQHNlZSBhdl9wYWNrZXRfYWxsb2MKICAqIEBzZWUgYXZfcGFja2V0X3JlZgogICovCi1BVlBhY2tldCAqYXZfcGFja2V0X2Nsb25lKEFWUGFja2V0ICpzcmMpOworQVZQYWNrZXQgKmF2X3BhY2tldF9jbG9uZShjb25zdCBBVlBhY2tldCAqc3JjKTsKIAogLyoqCiAgKiBGcmVlIHRoZSBwYWNrZXQsIGlmIHRoZSBwYWNrZXQgaXMgcmVmZXJlbmNlIGNvdW50ZWQsIGl0IHdpbGwgYmUKICAqIHVucmVmZXJlbmNlZCBmaXJzdC4KICAqCi0gKiBAcGFyYW0gcGFja2V0IHBhY2tldCB0byBiZSBmcmVlZC4gVGhlIHBvaW50ZXIgd2lsbCBiZSBzZXQgdG8gTlVMTC4KKyAqIEBwYXJhbSBwa3QgcGFja2V0IHRvIGJlIGZyZWVkLiBUaGUgcG9pbnRlciB3aWxsIGJlIHNldCB0byBOVUxMLgogICogQG5vdGUgcGFzc2luZyBOVUxMIGlzIGEgbm8tb3AuCiAgKi8KIHZvaWQgYXZfcGFja2V0X2ZyZWUoQVZQYWNrZXQgKipwa3QpOwpAQCAtNDAxMSw3ICs0MzY1LDcgQEAKICAqIEB3YXJuaW5nIFRoaXMgaXMgYSBoYWNrIC0gdGhlIHBhY2tldCBtZW1vcnkgYWxsb2NhdGlvbiBzdHVmZiBpcyBicm9rZW4uIFRoZQogICogcGFja2V0IGlzIGFsbG9jYXRlZCBpZiBpdCB3YXMgbm90IHJlYWxseSBhbGxvY2F0ZWQuCiAgKgotICogQGRlcHJlY2F0ZWQgVXNlIGF2X3BhY2tldF9yZWYKKyAqIEBkZXByZWNhdGVkIFVzZSBhdl9wYWNrZXRfcmVmIG9yIGF2X3BhY2tldF9tYWtlX3JlZmNvdW50ZWQKICAqLwogYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdl9kdXBfcGFja2V0KEFWUGFja2V0ICpwa3QpOwpAQCAtNDAxOSwxNCArNDM3MywyMCBAQAogICogQ29weSBwYWNrZXQsIGluY2x1ZGluZyBjb250ZW50cwogICoKICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWwKKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgYXZfcGFja2V0X3JlZgogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2X2NvcHlfcGFja2V0KEFWUGFja2V0ICpkc3QsIGNvbnN0IEFWUGFja2V0ICpzcmMpOwogCiAvKioKICAqIENvcHkgcGFja2V0IHNpZGUgZGF0YQogICoKICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWwKKyAqCisgKiBAZGVwcmVjYXRlZCBVc2UgYXZfcGFja2V0X2NvcHlfcHJvcHMKICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdl9jb3B5X3BhY2tldF9zaWRlX2RhdGEoQVZQYWNrZXQgKmRzdCwgY29uc3QgQVZQYWNrZXQgKnNyYyk7CiAKIC8qKgpAQCAtNDA4NSwxMiArNDQ0NSwxNiBAQAogICogQHBhcmFtIHNpemUgcG9pbnRlciBmb3Igc2lkZSBpbmZvcm1hdGlvbiBzaXplIHRvIHN0b3JlIChvcHRpb25hbCkKICAqIEByZXR1cm4gcG9pbnRlciB0byBkYXRhIGlmIHByZXNlbnQgb3IgTlVMTCBvdGhlcndpc2UKICAqLwotdWludDhfdCogYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoQVZQYWNrZXQgKnBrdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAordWludDhfdCogYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoY29uc3QgQVZQYWNrZXQgKnBrdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplKTsKIAorI2lmIEZGX0FQSV9NRVJHRV9TRF9BUEkKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgYXZfcGFja2V0X21lcmdlX3NpZGVfZGF0YShBVlBhY2tldCAqcGt0KTsKIAorYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdl9wYWNrZXRfc3BsaXRfc2lkZV9kYXRhKEFWUGFja2V0ICpwa3QpOworI2VuZGlmCiAKIGNvbnN0IGNoYXIgKmF2X3BhY2tldF9zaWRlX2RhdGFfbmFtZShlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGUpOwogCkBAIC00MTY5LDExICs0NTMzLDM3IEBACiAgKiBAcGFyYW0gc3JjIFNvdXJjZSBwYWNrZXQKICAqCiAgKiBAcmV0dXJuIDAgb24gc3VjY2VzcyBBVkVSUk9SIG9uIGZhaWx1cmUuCi0gKgogICovCiBpbnQgYXZfcGFja2V0X2NvcHlfcHJvcHMoQVZQYWNrZXQgKmRzdCwgY29uc3QgQVZQYWNrZXQgKnNyYyk7CiAKIC8qKgorICogRW5zdXJlIHRoZSBkYXRhIGRlc2NyaWJlZCBieSBhIGdpdmVuIHBhY2tldCBpcyByZWZlcmVuY2UgY291bnRlZC4KKyAqCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGVuc3VyZSB0aGF0IHRoZSByZWZlcmVuY2Ugd2lsbCBiZSB3cml0YWJsZS4KKyAqICAgICAgIFVzZSBhdl9wYWNrZXRfbWFrZV93cml0YWJsZSBpbnN0ZWFkIGZvciB0aGF0IHB1cnBvc2UuCisgKgorICogQHNlZSBhdl9wYWNrZXRfcmVmCisgKiBAc2VlIGF2X3BhY2tldF9tYWtlX3dyaXRhYmxlCisgKgorICogQHBhcmFtIHBrdCBwYWNrZXQgd2hvc2UgZGF0YSBzaG91bGQgYmUgbWFkZSByZWZlcmVuY2UgY291bnRlZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGVycm9yLiBPbiBmYWlsdXJlLCB0aGUKKyAqICAgICAgICAgcGFja2V0IGlzIHVuY2hhbmdlZC4KKyAqLworaW50IGF2X3BhY2tldF9tYWtlX3JlZmNvdW50ZWQoQVZQYWNrZXQgKnBrdCk7CisKKy8qKgorICogQ3JlYXRlIGEgd3JpdGFibGUgcmVmZXJlbmNlIGZvciB0aGUgZGF0YSBkZXNjcmliZWQgYnkgYSBnaXZlbiBwYWNrZXQsCisgKiBhdm9pZGluZyBkYXRhIGNvcHkgaWYgcG9zc2libGUuCisgKgorICogQHBhcmFtIHBrdCBQYWNrZXQgd2hvc2UgZGF0YSBzaG91bGQgYmUgbWFkZSB3cml0YWJsZS4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWx1cmUuIE9uIGZhaWx1cmUsIHRoZQorICogICAgICAgICBwYWNrZXQgaXMgdW5jaGFuZ2VkLgorICovCitpbnQgYXZfcGFja2V0X21ha2Vfd3JpdGFibGUoQVZQYWNrZXQgKnBrdCk7CisKKy8qKgogICogQ29udmVydCB2YWxpZCB0aW1pbmcgZmllbGRzICh0aW1lc3RhbXBzIC8gZHVyYXRpb25zKSBpbiBhIHBhY2tldCBmcm9tIG9uZQogICogdGltZWJhc2UgdG8gYW5vdGhlci4gVGltZXN0YW1wcyB3aXRoIHVua25vd24gdmFsdWVzIChBVl9OT1BUU19WQUxVRSkgd2lsbCBiZQogICogaWdub3JlZC4KQEAgLTQyMTgsMjEgKzQ2MDgsNiBAQAogICovCiBpbnQgYXZjb2RlY19kZWZhdWx0X2dldF9idWZmZXIyKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKTsKIAotI2lmIEZGX0FQSV9FTVVfRURHRQotLyoqCi0gKiBSZXR1cm4gdGhlIGFtb3VudCBvZiBwYWRkaW5nIGluIHBpeGVscyB3aGljaCB0aGUgZ2V0X2J1ZmZlciBjYWxsYmFjayBtdXN0Ci0gKiBwcm92aWRlIGFyb3VuZCB0aGUgZWRnZSBvZiB0aGUgaW1hZ2UgZm9yIGNvZGVjcyB3aGljaCBkbyBub3QgaGF2ZSB0aGUKLSAqIENPREVDX0ZMQUdfRU1VX0VER0UgZmxhZy4KLSAqCi0gKiBAcmV0dXJuIFJlcXVpcmVkIHBhZGRpbmcgaW4gcGl4ZWxzLgotICoKLSAqIEBkZXByZWNhdGVkIENPREVDX0ZMQUdfRU1VX0VER0UgaXMgZGVwcmVjYXRlZCwgc28gdGhpcyBmdW5jdGlvbiBpcyBubyBsb25nZXIKLSAqIG5lZWRlZAotICovCi1hdHRyaWJ1dGVfZGVwcmVjYXRlZAotdW5zaWduZWQgYXZjb2RlY19nZXRfZWRnZV93aWR0aCh2b2lkKTsKLSNlbmRpZgotCiAvKioKICAqIE1vZGlmeSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcyBzbyB0aGF0IHRoZXkgd2lsbCByZXN1bHQgaW4gYSBtZW1vcnkKICAqIGJ1ZmZlciB0aGF0IGlzIGFjY2VwdGFibGUgZm9yIHRoZSBjb2RlYyBpZiB5b3UgZG8gbm90IHVzZSBhbnkgaG9yaXpvbnRhbApAQCAtNDMyNCw3ICs0Njk5LDEwIEBACiAgKiBAcmV0dXJuIEEgbmVnYXRpdmUgZXJyb3IgY29kZSBpcyByZXR1cm5lZCBpZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcKICAqICAgICAgICAgZGVjb2RpbmcsIG90aGVyd2lzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGZyb20gdGhlIGlucHV0CiAgKiAgICAgICAgIEFWUGFja2V0IGlzIHJldHVybmVkLgorICoKKyogQGRlcHJlY2F0ZWQgVXNlIGF2Y29kZWNfc2VuZF9wYWNrZXQoKSBhbmQgYXZjb2RlY19yZWNlaXZlX2ZyYW1lKCkuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgYXZjb2RlY19kZWNvZGVfYXVkaW80KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgY29uc3QgQVZQYWNrZXQgKmF2cGt0KTsKIApAQCAtNDM3MCw3ICs0NzQ4LDEwIEBACiAgKiBAcGFyYW1baW4sb3V0XSBnb3RfcGljdHVyZV9wdHIgWmVybyBpZiBubyBmcmFtZSBjb3VsZCBiZSBkZWNvbXByZXNzZWQsIG90aGVyd2lzZSwgaXQgaXMgbm9uemVyby4KICAqIEByZXR1cm4gT24gZXJyb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBudW1iZXIgb2YgYnl0ZXMKICAqIHVzZWQgb3IgemVybyBpZiBubyBmcmFtZSBjb3VsZCBiZSBkZWNvbXByZXNzZWQuCisgKgorICogQGRlcHJlY2F0ZWQgVXNlIGF2Y29kZWNfc2VuZF9wYWNrZXQoKSBhbmQgYXZjb2RlY19yZWNlaXZlX2ZyYW1lKCkuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgYXZjb2RlY19kZWNvZGVfdmlkZW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9waWN0dXJlX3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldCAqYXZwa3QpOwpAQCAtNDM4NSwxMyArNDc2NiwxMyBAQAogICogYW5kIHJldXNpbmcgYSBnZXRfYnVmZmVyIHdyaXR0ZW4gZm9yIHZpZGVvIGNvZGVjcyB3b3VsZCBwcm9iYWJseSBwZXJmb3JtIGJhZGx5CiAgKiBkdWUgdG8gYSBwb3RlbnRpYWxseSB2ZXJ5IGRpZmZlcmVudCBhbGxvY2F0aW9uIHBhdHRlcm4uCiAgKgotICogU29tZSBkZWNvZGVycyAodGhvc2UgbWFya2VkIHdpdGggQ09ERUNfQ0FQX0RFTEFZKSBoYXZlIGEgZGVsYXkgYmV0d2VlbiBpbnB1dAorICogU29tZSBkZWNvZGVycyAodGhvc2UgbWFya2VkIHdpdGggQVZfQ09ERUNfQ0FQX0RFTEFZKSBoYXZlIGEgZGVsYXkgYmV0d2VlbiBpbnB1dAogICogYW5kIG91dHB1dC4gVGhpcyBtZWFucyB0aGF0IGZvciBzb21lIHBhY2tldHMgdGhleSB3aWxsIG5vdCBpbW1lZGlhdGVseQogICogcHJvZHVjZSBkZWNvZGVkIG91dHB1dCBhbmQgbmVlZCB0byBiZSBmbHVzaGVkIGF0IHRoZSBlbmQgb2YgZGVjb2RpbmcgdG8gZ2V0CiAgKiBhbGwgdGhlIGRlY29kZWQgZGF0YS4gRmx1c2hpbmcgaXMgZG9uZSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBwYWNrZXRzCiAgKiB3aXRoIGF2cGt0LT5kYXRhIHNldCB0byBOVUxMIGFuZCBhdnBrdC0+c2l6ZSBzZXQgdG8gMCB1bnRpbCBpdCBzdG9wcwogICogcmV0dXJuaW5nIHN1YnRpdGxlcy4gSXQgaXMgc2FmZSB0byBmbHVzaCBldmVuIHRob3NlIGRlY29kZXJzIHRoYXQgYXJlIG5vdAotICogbWFya2VkIHdpdGggQ09ERUNfQ0FQX0RFTEFZLCB0aGVuIG5vIHN1YnRpdGxlcyB3aWxsIGJlIHJldHVybmVkLgorICogbWFya2VkIHdpdGggQVZfQ09ERUNfQ0FQX0RFTEFZLCB0aGVuIG5vIHN1YnRpdGxlcyB3aWxsIGJlIHJldHVybmVkLgogICoKICAqIEBub3RlIFRoZSBBVkNvZGVjQ29udGV4dCBNVVNUIGhhdmUgYmVlbiBvcGVuZWQgd2l0aCBAcmVmIGF2Y29kZWNfb3BlbjIoKQogICogYmVmb3JlIHBhY2tldHMgbWF5IGJlIGZlZCB0byB0aGUgZGVjb2Rlci4KQEAgLTQ0MDcsNiArNDc4OCwyMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpOwogCiAvKioKKyAqIFN1cHBseSByYXcgcGFja2V0IGRhdGEgYXMgaW5wdXQgdG8gYSBkZWNvZGVyLgorICoKKyAqIEludGVybmFsbHksIHRoaXMgY2FsbCB3aWxsIGNvcHkgcmVsZXZhbnQgQVZDb2RlY0NvbnRleHQgZmllbGRzLCB3aGljaCBjYW4KKyAqIGluZmx1ZW5jZSBkZWNvZGluZyBwZXItcGFja2V0LCBhbmQgYXBwbHkgdGhlbSB3aGVuIHRoZSBwYWNrZXQgaXMgYWN0dWFsbHkKKyAqIGRlY29kZWQuIChGb3IgZXhhbXBsZSBBVkNvZGVjQ29udGV4dC5za2lwX2ZyYW1lLCB3aGljaCBtaWdodCBkaXJlY3QgdGhlCisgKiBkZWNvZGVyIHRvIGRyb3AgdGhlIGZyYW1lIGNvbnRhaW5lZCBieSB0aGUgcGFja2V0IHNlbnQgd2l0aCB0aGlzIGZ1bmN0aW9uLikKKyAqCisgKiBAd2FybmluZyBUaGUgaW5wdXQgYnVmZmVyLCBhdnBrdC0+ZGF0YSBtdXN0IGJlIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUKKyAqICAgICAgICAgIGxhcmdlciB0aGFuIHRoZSBhY3R1YWwgcmVhZCBieXRlcyBiZWNhdXNlIHNvbWUgb3B0aW1pemVkIGJpdHN0cmVhbQorICogICAgICAgICAgcmVhZGVycyByZWFkIDMyIG9yIDY0IGJpdHMgYXQgb25jZSBhbmQgY291bGQgcmVhZCBvdmVyIHRoZSBlbmQuCisgKgorICogQHdhcm5pbmcgRG8gbm90IG1peCB0aGlzIEFQSSB3aXRoIHRoZSBsZWdhY3kgQVBJIChsaWtlIGF2Y29kZWNfZGVjb2RlX3ZpZGVvMigpKQorICogICAgICAgICAgb24gdGhlIHNhbWUgQVZDb2RlY0NvbnRleHQuIEl0IHdpbGwgcmV0dXJuIHVuZXhwZWN0ZWQgcmVzdWx0cyBub3cKKyAqICAgICAgICAgIG9yIGluIGZ1dHVyZSBsaWJhdmNvZGVjIHZlcnNpb25zLgorICoKKyAqIEBub3RlIFRoZSBBVkNvZGVjQ29udGV4dCBNVVNUIGhhdmUgYmVlbiBvcGVuZWQgd2l0aCBAcmVmIGF2Y29kZWNfb3BlbjIoKQorICogICAgICAgYmVmb3JlIHBhY2tldHMgbWF5IGJlIGZlZCB0byB0aGUgZGVjb2Rlci4KKyAqCisgKiBAcGFyYW0gYXZjdHggY29kZWMgY29udGV4dAorICogQHBhcmFtW2luXSBhdnBrdCBUaGUgaW5wdXQgQVZQYWNrZXQuIFVzdWFsbHksIHRoaXMgd2lsbCBiZSBhIHNpbmdsZSB2aWRlbworICogICAgICAgICAgICAgICAgICBmcmFtZSwgb3Igc2V2ZXJhbCBjb21wbGV0ZSBhdWRpbyBmcmFtZXMuCisgKiAgICAgICAgICAgICAgICAgIE93bmVyc2hpcCBvZiB0aGUgcGFja2V0IHJlbWFpbnMgd2l0aCB0aGUgY2FsbGVyLCBhbmQgdGhlCisgKiAgICAgICAgICAgICAgICAgIGRlY29kZXIgd2lsbCBub3Qgd3JpdGUgdG8gdGhlIHBhY2tldC4gVGhlIGRlY29kZXIgbWF5IGNyZWF0ZQorICogICAgICAgICAgICAgICAgICBhIHJlZmVyZW5jZSB0byB0aGUgcGFja2V0IGRhdGEgKG9yIGNvcHkgaXQgaWYgdGhlIHBhY2tldCBpcworICogICAgICAgICAgICAgICAgICBub3QgcmVmZXJlbmNlLWNvdW50ZWQpLgorICogICAgICAgICAgICAgICAgICBVbmxpa2Ugd2l0aCBvbGRlciBBUElzLCB0aGUgcGFja2V0IGlzIGFsd2F5cyBmdWxseSBjb25zdW1lZCwKKyAqICAgICAgICAgICAgICAgICAgYW5kIGlmIGl0IGNvbnRhaW5zIG11bHRpcGxlIGZyYW1lcyAoZS5nLiBzb21lIGF1ZGlvIGNvZGVjcyksCisgKiAgICAgICAgICAgICAgICAgIHdpbGwgcmVxdWlyZSB5b3UgdG8gY2FsbCBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoKSBtdWx0aXBsZQorICogICAgICAgICAgICAgICAgICB0aW1lcyBhZnRlcndhcmRzIGJlZm9yZSB5b3UgY2FuIHNlbmQgYSBuZXcgcGFja2V0LgorICogICAgICAgICAgICAgICAgICBJdCBjYW4gYmUgTlVMTCAob3IgYW4gQVZQYWNrZXQgd2l0aCBkYXRhIHNldCB0byBOVUxMIGFuZAorICogICAgICAgICAgICAgICAgICBzaXplIHNldCB0byAwKTsgaW4gdGhpcyBjYXNlLCBpdCBpcyBjb25zaWRlcmVkIGEgZmx1c2gKKyAqICAgICAgICAgICAgICAgICAgcGFja2V0LCB3aGljaCBzaWduYWxzIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gU2VuZGluZyB0aGUKKyAqICAgICAgICAgICAgICAgICAgZmlyc3QgZmx1c2ggcGFja2V0IHdpbGwgcmV0dXJuIHN1Y2Nlc3MuIFN1YnNlcXVlbnQgb25lcyBhcmUKKyAqICAgICAgICAgICAgICAgICAgdW5uZWNlc3NhcnkgYW5kIHdpbGwgcmV0dXJuIEFWRVJST1JfRU9GLiBJZiB0aGUgZGVjb2RlcgorICogICAgICAgICAgICAgICAgICBzdGlsbCBoYXMgZnJhbWVzIGJ1ZmZlcmVkLCBpdCB3aWxsIHJldHVybiB0aGVtIGFmdGVyIHNlbmRpbmcKKyAqICAgICAgICAgICAgICAgICAgYSBmbHVzaCBwYWNrZXQuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBuZWdhdGl2ZSBlcnJvciBjb2RlOgorICogICAgICBBVkVSUk9SKEVBR0FJTik6ICAgaW5wdXQgaXMgbm90IGFjY2VwdGVkIGluIHRoZSBjdXJyZW50IHN0YXRlIC0gdXNlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCByZWFkIG91dHB1dCB3aXRoIGF2Y29kZWNfcmVjZWl2ZV9mcmFtZSgpIChvbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgb3V0cHV0IGlzIHJlYWQsIHRoZSBwYWNrZXQgc2hvdWxkIGJlIHJlc2VudCwgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbCB3aWxsIG5vdCBmYWlsIHdpdGggRUFHQUlOKS4KKyAqICAgICAgQVZFUlJPUl9FT0Y6ICAgICAgIHRoZSBkZWNvZGVyIGhhcyBiZWVuIGZsdXNoZWQsIGFuZCBubyBuZXcgcGFja2V0cyBjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNlbnQgdG8gaXQgKGFsc28gcmV0dXJuZWQgaWYgbW9yZSB0aGFuIDEgZmx1c2gKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldCBpcyBzZW50KQorICogICAgICBBVkVSUk9SKEVJTlZBTCk6ICAgY29kZWMgbm90IG9wZW5lZCwgaXQgaXMgYW4gZW5jb2Rlciwgb3IgcmVxdWlyZXMgZmx1c2gKKyAqICAgICAgQVZFUlJPUihFTk9NRU0pOiAgIGZhaWxlZCB0byBhZGQgcGFja2V0IHRvIGludGVybmFsIHF1ZXVlLCBvciBzaW1pbGFyCisgKiAgICAgIG90aGVyIGVycm9yczogbGVnaXRpbWF0ZSBkZWNvZGluZyBlcnJvcnMKKyAqLworaW50IGF2Y29kZWNfc2VuZF9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVlBhY2tldCAqYXZwa3QpOworCisvKioKKyAqIFJldHVybiBkZWNvZGVkIG91dHB1dCBkYXRhIGZyb20gYSBkZWNvZGVyLgorICoKKyAqIEBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gZnJhbWUgVGhpcyB3aWxsIGJlIHNldCB0byBhIHJlZmVyZW5jZS1jb3VudGVkIHZpZGVvIG9yIGF1ZGlvCisgKiAgICAgICAgICAgICAgZnJhbWUgKGRlcGVuZGluZyBvbiB0aGUgZGVjb2RlciB0eXBlKSBhbGxvY2F0ZWQgYnkgdGhlCisgKiAgICAgICAgICAgICAgZGVjb2Rlci4gTm90ZSB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBjYWxsCisgKiAgICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLgorICoKKyAqIEByZXR1cm4KKyAqICAgICAgMDogICAgICAgICAgICAgICAgIHN1Y2Nlc3MsIGEgZnJhbWUgd2FzIHJldHVybmVkCisgKiAgICAgIEFWRVJST1IoRUFHQUlOKTogICBvdXRwdXQgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIHN0YXRlIC0gdXNlciBtdXN0IHRyeQorICogICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VuZCBuZXcgaW5wdXQKKyAqICAgICAgQVZFUlJPUl9FT0Y6ICAgICAgIHRoZSBkZWNvZGVyIGhhcyBiZWVuIGZ1bGx5IGZsdXNoZWQsIGFuZCB0aGVyZSB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBubyBtb3JlIG91dHB1dCBmcmFtZXMKKyAqICAgICAgQVZFUlJPUihFSU5WQUwpOiAgIGNvZGVjIG5vdCBvcGVuZWQsIG9yIGl0IGlzIGFuIGVuY29kZXIKKyAqICAgICAgb3RoZXIgbmVnYXRpdmUgdmFsdWVzOiBsZWdpdGltYXRlIGRlY29kaW5nIGVycm9ycworICovCitpbnQgYXZjb2RlY19yZWNlaXZlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpOworCisvKioKKyAqIFN1cHBseSBhIHJhdyB2aWRlbyBvciBhdWRpbyBmcmFtZSB0byB0aGUgZW5jb2Rlci4gVXNlIGF2Y29kZWNfcmVjZWl2ZV9wYWNrZXQoKQorICogdG8gcmV0cmlldmUgYnVmZmVyZWQgb3V0cHV0IHBhY2tldHMuCisgKgorICogQHBhcmFtIGF2Y3R4ICAgICBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW1baW5dIGZyYW1lIEFWRnJhbWUgY29udGFpbmluZyB0aGUgcmF3IGF1ZGlvIG9yIHZpZGVvIGZyYW1lIHRvIGJlIGVuY29kZWQuCisgKiAgICAgICAgICAgICAgICAgIE93bmVyc2hpcCBvZiB0aGUgZnJhbWUgcmVtYWlucyB3aXRoIHRoZSBjYWxsZXIsIGFuZCB0aGUKKyAqICAgICAgICAgICAgICAgICAgZW5jb2RlciB3aWxsIG5vdCB3cml0ZSB0byB0aGUgZnJhbWUuIFRoZSBlbmNvZGVyIG1heSBjcmVhdGUKKyAqICAgICAgICAgICAgICAgICAgYSByZWZlcmVuY2UgdG8gdGhlIGZyYW1lIGRhdGEgKG9yIGNvcHkgaXQgaWYgdGhlIGZyYW1lIGlzCisgKiAgICAgICAgICAgICAgICAgIG5vdCByZWZlcmVuY2UtY291bnRlZCkuCisgKiAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIGl0IGlzIGNvbnNpZGVyZWQgYSBmbHVzaAorICogICAgICAgICAgICAgICAgICBwYWNrZXQuICBUaGlzIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLiBJZiB0aGUgZW5jb2RlcgorICogICAgICAgICAgICAgICAgICBzdGlsbCBoYXMgcGFja2V0cyBidWZmZXJlZCwgaXQgd2lsbCByZXR1cm4gdGhlbSBhZnRlciB0aGlzCisgKiAgICAgICAgICAgICAgICAgIGNhbGwuIE9uY2UgZmx1c2hpbmcgbW9kZSBoYXMgYmVlbiBlbnRlcmVkLCBhZGRpdGlvbmFsIGZsdXNoCisgKiAgICAgICAgICAgICAgICAgIHBhY2tldHMgYXJlIGlnbm9yZWQsIGFuZCBzZW5kaW5nIGZyYW1lcyB3aWxsIHJldHVybgorICogICAgICAgICAgICAgICAgICBBVkVSUk9SX0VPRi4KKyAqCisgKiAgICAgICAgICAgICAgICAgIEZvciBhdWRpbzoKKyAqICAgICAgICAgICAgICAgICAgSWYgQVZfQ09ERUNfQ0FQX1ZBUklBQkxFX0ZSQU1FX1NJWkUgaXMgc2V0LCB0aGVuIGVhY2ggZnJhbWUKKyAqICAgICAgICAgICAgICAgICAgY2FuIGhhdmUgYW55IG51bWJlciBvZiBzYW1wbGVzLgorICogICAgICAgICAgICAgICAgICBJZiBpdCBpcyBub3Qgc2V0LCBmcmFtZS0+bmJfc2FtcGxlcyBtdXN0IGJlIGVxdWFsIHRvCisgKiAgICAgICAgICAgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplIGZvciBhbGwgZnJhbWVzIGV4Y2VwdCB0aGUgbGFzdC4KKyAqICAgICAgICAgICAgICAgICAgVGhlIGZpbmFsIGZyYW1lIG1heSBiZSBzbWFsbGVyIHRoYW4gYXZjdHgtPmZyYW1lX3NpemUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcywgb3RoZXJ3aXNlIG5lZ2F0aXZlIGVycm9yIGNvZGU6CisgKiAgICAgIEFWRVJST1IoRUFHQUlOKTogICBpbnB1dCBpcyBub3QgYWNjZXB0ZWQgaW4gdGhlIGN1cnJlbnQgc3RhdGUgLSB1c2VyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IHJlYWQgb3V0cHV0IHdpdGggYXZjb2RlY19yZWNlaXZlX3BhY2tldCgpIChvbmNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgb3V0cHV0IGlzIHJlYWQsIHRoZSBwYWNrZXQgc2hvdWxkIGJlIHJlc2VudCwgYW5kCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2FsbCB3aWxsIG5vdCBmYWlsIHdpdGggRUFHQUlOKS4KKyAqICAgICAgQVZFUlJPUl9FT0Y6ICAgICAgIHRoZSBlbmNvZGVyIGhhcyBiZWVuIGZsdXNoZWQsIGFuZCBubyBuZXcgZnJhbWVzIGNhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2VudCB0byBpdAorICogICAgICBBVkVSUk9SKEVJTlZBTCk6ICAgY29kZWMgbm90IG9wZW5lZCwgcmVmY291bnRlZF9mcmFtZXMgbm90IHNldCwgaXQgaXMgYQorICogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlciwgb3IgcmVxdWlyZXMgZmx1c2gKKyAqICAgICAgQVZFUlJPUihFTk9NRU0pOiAgIGZhaWxlZCB0byBhZGQgcGFja2V0IHRvIGludGVybmFsIHF1ZXVlLCBvciBzaW1pbGFyCisgKiAgICAgIG90aGVyIGVycm9yczogbGVnaXRpbWF0ZSBkZWNvZGluZyBlcnJvcnMKKyAqLworaW50IGF2Y29kZWNfc2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBSZWFkIGVuY29kZWQgZGF0YSBmcm9tIHRoZSBlbmNvZGVyLgorICoKKyAqIEBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gYXZwa3QgVGhpcyB3aWxsIGJlIHNldCB0byBhIHJlZmVyZW5jZS1jb3VudGVkIHBhY2tldCBhbGxvY2F0ZWQgYnkgdGhlCisgKiAgICAgICAgICAgICAgZW5jb2Rlci4gTm90ZSB0aGF0IHRoZSBmdW5jdGlvbiB3aWxsIGFsd2F5cyBjYWxsCisgKiAgICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpIGJlZm9yZSBkb2luZyBhbnl0aGluZyBlbHNlLgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSBuZWdhdGl2ZSBlcnJvciBjb2RlOgorICogICAgICBBVkVSUk9SKEVBR0FJTik6ICAgb3V0cHV0IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgc3RhdGUgLSB1c2VyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IHRyeSB0byBzZW5kIGlucHV0CisgKiAgICAgIEFWRVJST1JfRU9GOiAgICAgICB0aGUgZW5jb2RlciBoYXMgYmVlbiBmdWxseSBmbHVzaGVkLCBhbmQgdGhlcmUgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgbm8gbW9yZSBvdXRwdXQgcGFja2V0cworICogICAgICBBVkVSUk9SKEVJTlZBTCk6ICAgY29kZWMgbm90IG9wZW5lZCwgb3IgaXQgaXMgYW4gZW5jb2RlcgorICogICAgICBvdGhlciBlcnJvcnM6IGxlZ2l0aW1hdGUgZGVjb2RpbmcgZXJyb3JzCisgKi8KK2ludCBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0KTsKKworLyoqCisgKiBDcmVhdGUgYW5kIHJldHVybiBhIEFWSFdGcmFtZXNDb250ZXh0IHdpdGggdmFsdWVzIGFkZXF1YXRlIGZvciBoYXJkd2FyZQorICogZGVjb2RpbmcuIFRoaXMgaXMgbWVhbnQgdG8gZ2V0IGNhbGxlZCBmcm9tIHRoZSBnZXRfZm9ybWF0IGNhbGxiYWNrLCBhbmQgaXMKKyAqIGEgaGVscGVyIGZvciBwcmVwYXJpbmcgYSBBVkhXRnJhbWVzQ29udGV4dCBmb3IgQVZDb2RlY0NvbnRleHQuaHdfZnJhbWVzX2N0eC4KKyAqIFRoaXMgQVBJIGlzIGZvciBkZWNvZGluZyB3aXRoIGNlcnRhaW4gaGFyZHdhcmUgYWNjZWxlcmF0aW9uIG1vZGVzL0FQSXMgb25seS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgQVZIV0ZyYW1lc0NvbnRleHQgaXMgbm90IGluaXRpYWxpemVkLiBUaGUgY2FsbGVyIG11c3QgZG8gdGhpcworICogd2l0aCBhdl9od2ZyYW1lX2N0eF9pbml0KCkuCisgKgorICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBhIHJlcXVpcmVtZW50LCBidXQgbWFrZXMgaXQgc2ltcGxlciB0byBhdm9pZAorICogY29kZWMgb3IgaGFyZHdhcmUgQVBJIHNwZWNpZmljIGRldGFpbHMgd2hlbiBtYW51YWxseSBhbGxvY2F0aW5nIGZyYW1lcy4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5IHRvIHRoaXMsIGFuIEFQSSB1c2VyIGNhbiBzZXQgQVZDb2RlY0NvbnRleHQuaHdfZGV2aWNlX2N0eCwKKyAqIHdoaWNoIHNldHMgdXAgQVZDb2RlY0NvbnRleHQuaHdfZnJhbWVzX2N0eCBmdWxseSBhdXRvbWF0aWNhbGx5LCBhbmQgbWFrZXMKKyAqIGl0IHVubmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvciBoYXZpbmcgdG8gY2FyZSBhYm91dAorICogQVZIV0ZyYW1lc0NvbnRleHQgaW5pdGlhbGl6YXRpb24gYXQgYWxsLgorICoKKyAqIFRoZXJlIGFyZSBhIG51bWJlciBvZiByZXF1aXJlbWVudHMgZm9yIGNhbGxpbmcgdGhpcyBmdW5jdGlvbjoKKyAqCisgKiAtIEl0IG11c3QgYmUgY2FsbGVkIGZyb20gZ2V0X2Zvcm1hdCB3aXRoIHRoZSBzYW1lIGF2Y3R4IHBhcmFtZXRlciB0aGF0IHdhcworICogICBwYXNzZWQgdG8gZ2V0X2Zvcm1hdC4gQ2FsbGluZyBpdCBvdXRzaWRlIG9mIGdldF9mb3JtYXQgaXMgbm90IGFsbG93ZWQsIGFuZAorICogICBjYW4gdHJpZ2dlciB1bmRlZmluZWQgYmVoYXZpb3IuCisgKiAtIFRoZSBmdW5jdGlvbiBpcyBub3QgYWx3YXlzIHN1cHBvcnRlZCAoc2VlIGRlc2NyaXB0aW9uIG9mIHJldHVybiB2YWx1ZXMpLgorICogICBFdmVuIGlmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBzdWNjZXNzZnVsbHksIGh3YWNjZWwgaW5pdGlhbGl6YXRpb24gY291bGQKKyAqICAgZmFpbCBsYXRlci4gKFRoZSBkZWdyZWUgdG8gd2hpY2ggaW1wbGVtZW50YXRpb25zIGNoZWNrIHdoZXRoZXIgdGhlIHN0cmVhbQorICogICBpcyBhY3R1YWxseSBzdXBwb3J0ZWQgdmFyaWVzLiBTb21lIGRvIHRoaXMgY2hlY2sgb25seSBhZnRlciB0aGUgdXNlcidzCisgKiAgIGdldF9mb3JtYXQgY2FsbGJhY2sgcmV0dXJucy4pCisgKiAtIFRoZSBod19waXhfZm10IG11c3QgYmUgb25lIG9mIHRoZSBjaG9pY2VzIHN1Z2dlc3RlZCBieSBnZXRfZm9ybWF0LiBJZiB0aGUKKyAqICAgdXNlciBkZWNpZGVzIHRvIHVzZSBhIEFWSFdGcmFtZXNDb250ZXh0IHByZXBhcmVkIHdpdGggdGhpcyBBUEkgZnVuY3Rpb24sCisgKiAgIHRoZSB1c2VyIG11c3QgcmV0dXJuIHRoZSBzYW1lIGh3X3BpeF9mbXQgZnJvbSBnZXRfZm9ybWF0LgorICogLSBUaGUgZGV2aWNlX3JlZiBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBtdXN0IHN1cHBvcnQgdGhlIGdpdmVuIGh3X3BpeF9mbXQuCisgKiAtIEFmdGVyIGNhbGxpbmcgdGhpcyBBUEkgZnVuY3Rpb24sIGl0IGlzIHRoZSB1c2VyJ3MgcmVzcG9uc2liaWxpdHkgdG8KKyAqICAgaW5pdGlhbGl6ZSB0aGUgQVZIV0ZyYW1lc0NvbnRleHQgKHJldHVybmVkIGJ5IHRoZSBvdXRfZnJhbWVzX3JlZiBwYXJhbWV0ZXIpLAorICogICBhbmQgdG8gc2V0IEFWQ29kZWNDb250ZXh0Lmh3X2ZyYW1lc19jdHggdG8gaXQuIElmIGRvbmUsIHRoaXMgbXVzdCBiZSBkb25lCisgKiAgIGJlZm9yZSByZXR1cm5pbmcgZnJvbSBnZXRfZm9ybWF0ICh0aGlzIGlzIGltcGxpZWQgYnkgdGhlIG5vcm1hbAorICogICBBVkNvZGVjQ29udGV4dC5od19mcmFtZXNfY3R4IEFQSSBydWxlcykuCisgKiAtIFRoZSBBVkhXRnJhbWVzQ29udGV4dCBwYXJhbWV0ZXJzIG1heSBjaGFuZ2UgZXZlcnkgdGltZSB0aW1lIGdldF9mb3JtYXQgaXMKKyAqICAgY2FsbGVkLiBBbHNvLCBBVkNvZGVjQ29udGV4dC5od19mcmFtZXNfY3R4IGlzIHJlc2V0IGJlZm9yZSBnZXRfZm9ybWF0LiBTbworICogICB5b3UgYXJlIGluaGVyZW50bHkgcmVxdWlyZWQgdG8gZ28gdGhyb3VnaCB0aGlzIHByb2Nlc3MgYWdhaW4gb24gZXZlcnkKKyAqICAgZ2V0X2Zvcm1hdCBjYWxsLgorICogLSBJdCBpcyBwZXJmZWN0bHkgcG9zc2libGUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGhvdXQgYWN0dWFsbHkgdXNpbmcKKyAqICAgdGhlIHJlc3VsdGluZyBBVkhXRnJhbWVzQ29udGV4dC4gT25lIHVzZS1jYXNlIG1pZ2h0IGJlIHRyeWluZyB0byByZXVzZSBhCisgKiAgIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgQVZIV0ZyYW1lc0NvbnRleHQsIGFuZCBjYWxsaW5nIHRoaXMgQVBJIGZ1bmN0aW9uCisgKiAgIG9ubHkgdG8gdGVzdCB3aGV0aGVyIHRoZSByZXF1aXJlZCBmcmFtZSBwYXJhbWV0ZXJzIGhhdmUgY2hhbmdlZC4KKyAqIC0gRmllbGRzIHRoYXQgdXNlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB2YWx1ZXMgb2YgYW55IGtpbmQgbXVzdCBub3QgYmUgc2V0CisgKiAgIGJ5IHRoZSB1c2VyIHVubGVzcyBzZXR0aW5nIHRoZW0gaXMgZXhwbGljaXRseSBhbGxvd2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uLgorICogICBJZiB0aGUgdXNlciBzZXRzIEFWSFdGcmFtZXNDb250ZXh0LmZyZWUgYW5kIEFWSFdGcmFtZXNDb250ZXh0LnVzZXJfb3BhcXVlLAorICogICB0aGUgbmV3IGZyZWUgY2FsbGJhY2sgbXVzdCBjYWxsIHRoZSBwb3RlbnRpYWxseSBzZXQgcHJldmlvdXMgZnJlZSBjYWxsYmFjay4KKyAqICAgVGhpcyBBUEkgY2FsbCBtYXkgc2V0IGFueSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGZyZWUKKyAqICAgY2FsbGJhY2suCisgKgorICogVGhlIGZ1bmN0aW9uIHdpbGwgc2V0IGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgZmllbGRzIG9uIEFWSFdGcmFtZXNDb250ZXh0CisgKiAocG90ZW50aWFsbHkgbW9yZSwgZGVwZW5kaW5nIG9uIGh3YWNjZWwgQVBJKToKKyAqCisgKiAtIEFsbCBmaWVsZHMgc2V0IGJ5IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKCkuCisgKiAtIFNldCB0aGUgZm9ybWF0IGZpZWxkIHRvIGh3X3BpeF9mbXQuCisgKiAtIFNldCB0aGUgc3dfZm9ybWF0IGZpZWxkIHRvIHRoZSBtb3N0IHN1aXRlZCBhbmQgbW9zdCB2ZXJzYXRpbGUgZm9ybWF0LiAoQW4KKyAqICAgaW1wbGljYXRpb24gaXMgdGhhdCB0aGlzIHdpbGwgcHJlZmVyIGdlbmVyaWMgZm9ybWF0cyBvdmVyIG9wYXF1ZSBmb3JtYXRzCisgKiAgIHdpdGggYXJiaXRyYXJ5IHJlc3RyaWN0aW9ucywgaWYgcG9zc2libGUuKQorICogLSBTZXQgdGhlIHdpZHRoL2hlaWdodCBmaWVsZHMgdG8gdGhlIGNvZGVkIGZyYW1lIHNpemUsIHJvdW5kZWQgdXAgdG8gdGhlCisgKiAgIEFQSS1zcGVjaWZpYyBtaW5pbXVtIGFsaWdubWVudC4KKyAqIC0gT25seSBfaWZfIHRoZSBod2FjY2VsIHJlcXVpcmVzIGEgcHJlLWFsbG9jYXRlZCBwb29sOiBzZXQgdGhlIGluaXRpYWxfcG9vbF9zaXplCisgKiAgIGZpZWxkIHRvIHRoZSBudW1iZXIgb2YgbWF4aW11bSByZWZlcmVuY2Ugc3VyZmFjZXMgcG9zc2libGUgd2l0aCB0aGUgY29kZWMsCisgKiAgIHBsdXMgMSBzdXJmYWNlIGZvciB0aGUgdXNlciB0byB3b3JrIChtZWFuaW5nIHRoZSB1c2VyIGNhbiBzYWZlbHkgcmVmZXJlbmNlCisgKiAgIGF0IG1vc3QgMSBkZWNvZGVkIHN1cmZhY2UgYXQgYSB0aW1lKSwgcGx1cyBhZGRpdGlvbmFsIGJ1ZmZlcmluZyBpbnRyb2R1Y2VkCisgKiAgIGJ5IGZyYW1lIHRocmVhZGluZy4gSWYgdGhlIGh3YWNjZWwgZG9lcyBub3QgcmVxdWlyZSBwcmUtYWxsb2NhdGlvbiwgdGhlCisgKiAgIGZpZWxkIGlzIGxlZnQgdG8gMCwgYW5kIHRoZSBkZWNvZGVyIHdpbGwgYWxsb2NhdGUgbmV3IHN1cmZhY2VzIG9uIGRlbWFuZAorICogICBkdXJpbmcgZGVjb2RpbmcuCisgKiAtIFBvc3NpYmx5IEFWSFdGcmFtZXNDb250ZXh0Lmh3Y3R4IGZpZWxkcywgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nCisgKiAgIGhhcmR3YXJlIEFQSS4KKyAqCisgKiBFc3NlbnRpYWxseSwgb3V0X2ZyYW1lc19yZWYgcmV0dXJucyB0aGUgc2FtZSBhcyBhdl9od2ZyYW1lX2N0eF9hbGxvYygpLCBidXQKKyAqIHdpdGggYmFzaWMgZnJhbWUgcGFyYW1ldGVycyBzZXQuCisgKgorICogVGhlIGZ1bmN0aW9uIGlzIHN0YXRlbGVzcywgYW5kIGRvZXMgbm90IGNoYW5nZSB0aGUgQVZDb2RlY0NvbnRleHQgb3IgdGhlCisgKiBkZXZpY2VfcmVmIEFWSFdEZXZpY2VDb250ZXh0LgorICoKKyAqIEBwYXJhbSBhdmN0eCBUaGUgY29udGV4dCB3aGljaCBpcyBjdXJyZW50bHkgY2FsbGluZyBnZXRfZm9ybWF0LCBhbmQgd2hpY2gKKyAqICAgICAgICAgICAgICBpbXBsaWNpdGx5IGNvbnRhaW5zIGFsbCBzdGF0ZSBuZWVkZWQgZm9yIGZpbGxpbmcgdGhlIHJldHVybmVkCisgKiAgICAgICAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgcHJvcGVybHkuCisgKiBAcGFyYW0gZGV2aWNlX3JlZiBBIHJlZmVyZW5jZSB0byB0aGUgQVZIV0RldmljZUNvbnRleHQgZGVzY3JpYmluZyB0aGUgZGV2aWNlCisgKiAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIHVzZWQgYnkgdGhlIGhhcmR3YXJlIGRlY29kZXIuCisgKiBAcGFyYW0gaHdfcGl4X2ZtdCBUaGUgaHdhY2NlbCBmb3JtYXQgeW91IGFyZSBnb2luZyB0byByZXR1cm4gZnJvbSBnZXRfZm9ybWF0LgorICogQHBhcmFtIG91dF9mcmFtZXNfcmVmIE9uIHN1Y2Nlc3MsIHNldCB0byBhIHJlZmVyZW5jZSB0byBhbiBfdW5pbml0aWFsaXplZF8KKyAqICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCwgY3JlYXRlZCBmcm9tIHRoZSBnaXZlbiBkZXZpY2VfcmVmLgorICogICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcyB3aWxsIGJlIHNldCB0byB2YWx1ZXMgcmVxdWlyZWQgZm9yIGRlY29kaW5nLgorICogICAgICAgICAgICAgICAgICAgICAgIE5vdCBjaGFuZ2VkIGlmIGFuIGVycm9yIGlzIHJldHVybmVkLgorICogQHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgb24gZXJyb3IuIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMKKyAqICAgICAgICAgaGF2ZSBzcGVjaWFsIHNlbWFudGljczoKKyAqICAgICAgQVZFUlJPUihFTk9FTlQpOiB0aGUgZGVjb2RlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eS4gU2V0dXAKKyAqICAgICAgICAgICAgICAgICAgICAgICBpcyBhbHdheXMgbWFudWFsLCBvciBpdCBpcyBhIGRlY29kZXIgd2hpY2ggZG9lcyBub3QKKyAqICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IHNldHRpbmcgQVZDb2RlY0NvbnRleHQuaHdfZnJhbWVzX2N0eCBhdCBhbGwsCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3IgaXQgaXMgYSBzb2Z0d2FyZSBmb3JtYXQuCisgKiAgICAgIEFWRVJST1IoRUlOVkFMKTogaXQgaXMga25vd24gdGhhdCBoYXJkd2FyZSBkZWNvZGluZyBpcyBub3Qgc3VwcG9ydGVkIGZvcgorICogICAgICAgICAgICAgICAgICAgICAgIHRoaXMgY29uZmlndXJhdGlvbiwgb3IgdGhlIGRldmljZV9yZWYgaXMgbm90IHN1cHBvcnRlZAorICogICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgaHdhY2NlbCByZWZlcmVuY2VkIGJ5IGh3X3BpeF9mbXQuCisgKi8KK2ludCBhdmNvZGVjX2dldF9od19mcmFtZXNfcGFyYW1ldGVycyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmRldmljZV9yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGh3X3BpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKipvdXRfZnJhbWVzX3JlZik7CisKKworCisvKioKICAqIEBkZWZncm91cCBsYXZjX3BhcnNpbmcgRnJhbWUgcGFyc2luZwogICogQHsKICAqLwpAQCAtNDYwMCw4ICs1MjExLDIxIEBACiAgICAgc3RydWN0IEFWQ29kZWNQYXJzZXIgKm5leHQ7CiB9IEFWQ29kZWNQYXJzZXI7CiAKKy8qKgorICogSXRlcmF0ZSBvdmVyIGFsbCByZWdpc3RlcmVkIGNvZGVjIHBhcnNlcnMuCisgKgorICogQHBhcmFtIG9wYXF1ZSBhIHBvaW50ZXIgd2hlcmUgbGliYXZjb2RlYyB3aWxsIHN0b3JlIHRoZSBpdGVyYXRpb24gc3RhdGUuIE11c3QKKyAqICAgICAgICAgICAgICAgcG9pbnQgdG8gTlVMTCB0byBzdGFydCB0aGUgaXRlcmF0aW9uLgorICoKKyAqIEByZXR1cm4gdGhlIG5leHQgcmVnaXN0ZXJlZCBjb2RlYyBwYXJzZXIgb3IgTlVMTCB3aGVuIHRoZSBpdGVyYXRpb24gaXMKKyAqICAgICAgICAgZmluaXNoZWQKKyAqLworY29uc3QgQVZDb2RlY1BhcnNlciAqYXZfcGFyc2VyX2l0ZXJhdGUodm9pZCAqKm9wYXF1ZSk7CisKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBBVkNvZGVjUGFyc2VyICphdl9wYXJzZXJfbmV4dChjb25zdCBBVkNvZGVjUGFyc2VyICpjKTsKIAorYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgYXZfcmVnaXN0ZXJfY29kZWNfcGFyc2VyKEFWQ29kZWNQYXJzZXIgKnBhcnNlcik7CiBBVkNvZGVjUGFyc2VyQ29udGV4dCAqYXZfcGFyc2VyX2luaXQoaW50IGNvZGVjX2lkKTsKIApAQCAtNDYxMyw3ICs1MjM3LDEwIEBACiAgKiBAcGFyYW0gcG91dGJ1ZiAgICAgICBzZXQgdG8gcG9pbnRlciB0byBwYXJzZWQgYnVmZmVyIG9yIE5VTEwgaWYgbm90IHlldCBmaW5pc2hlZC4KICAqIEBwYXJhbSBwb3V0YnVmX3NpemUgIHNldCB0byBzaXplIG9mIHBhcnNlZCBidWZmZXIgb3IgemVybyBpZiBub3QgeWV0IGZpbmlzaGVkLgogICogQHBhcmFtIGJ1ZiAgICAgICAgICAgaW5wdXQgYnVmZmVyLgotICogQHBhcmFtIGJ1Zl9zaXplICAgICAgaW5wdXQgbGVuZ3RoLCB0byBzaWduYWwgRU9GLCB0aGlzIHNob3VsZCBiZSAwIChzbyB0aGF0IHRoZSBsYXN0IGZyYW1lIGNhbiBiZSBvdXRwdXQpLgorICogQHBhcmFtIGJ1Zl9zaXplICAgICAgYnVmZmVyIHNpemUgaW4gYnl0ZXMgd2l0aG91dCB0aGUgcGFkZGluZy4gSS5lLiB0aGUgZnVsbCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgYXNzdW1lZCB0byBiZSBidWZfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUuCisgICAgICAgICAgICAgICAgICAgICAgICBUbyBzaWduYWwgRU9GLCB0aGlzIHNob3VsZCBiZSAwIChzbyB0aGF0IHRoZSBsYXN0IGZyYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgb3V0cHV0KS4KICAqIEBwYXJhbSBwdHMgICAgICAgICAgIGlucHV0IHByZXNlbnRhdGlvbiB0aW1lc3RhbXAuCiAgKiBAcGFyYW0gZHRzICAgICAgICAgICBpbnB1dCBkZWNvZGluZyB0aW1lc3RhbXAuCiAgKiBAcGFyYW0gcG9zICAgICAgICAgICBpbnB1dCBieXRlIHBvc2l0aW9uIGluIHN0cmVhbS4KQEAgLTQ3MTMsNyArNTM0MCwxMCBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgZ290X3BhY2tldF9wdHIgaXMgdW5kZWZpbmVkIGFuZCBzaG91bGQKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZSB1c2VkLgogICogQHJldHVybiAgICAgICAgICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBhdmNvZGVjX3NlbmRfZnJhbWUoKS9hdmNvZGVjX3JlY2VpdmVfcGFja2V0KCkgaW5zdGVhZAogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2Y29kZWNfZW5jb2RlX2F1ZGlvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpOwogCkBAIC00NzQ5LDcgKzUzNzksMTAgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIG9mIGdvdF9wYWNrZXRfcHRyIGlzIHVuZGVmaW5lZCBhbmQgc2hvdWxkCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgdXNlZC4KICAqIEByZXR1cm4gICAgICAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgYXZjb2RlY19zZW5kX2ZyYW1lKCkvYXZjb2RlY19yZWNlaXZlX3BhY2tldCgpIGluc3RlYWQKICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdmNvZGVjX2VuY29kZV92aWRlbzIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKTsKIApAQCAtNDc2MSwxMDMgKzUzOTQsNiBAQAogICogQH0KICAqLwogCi0jaWYgRkZfQVBJX0FWQ09ERUNfUkVTQU1QTEUKLS8qKgotICogQGRlZmdyb3VwIGxhdmNfcmVzYW1wbGUgQXVkaW8gcmVzYW1wbGluZwotICogQGluZ3JvdXAgbGliYXZjCi0gKiBAZGVwcmVjYXRlZCB1c2UgbGlic3dyZXNhbXBsZSBpbnN0ZWFkCi0gKgotICogQHsKLSAqLwotc3RydWN0IFJlU2FtcGxlQ29udGV4dDsKLXN0cnVjdCBBVlJlc2FtcGxlQ29udGV4dDsKLQotdHlwZWRlZiBzdHJ1Y3QgUmVTYW1wbGVDb250ZXh0IFJlU2FtcGxlQ29udGV4dDsKLQotLyoqCi0gKiAgSW5pdGlhbGl6ZSBhdWRpbyByZXNhbXBsaW5nIGNvbnRleHQuCi0gKgotICogQHBhcmFtIG91dHB1dF9jaGFubmVscyAgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscwotICogQHBhcmFtIGlucHV0X2NoYW5uZWxzICAgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzCi0gKiBAcGFyYW0gb3V0cHV0X3JhdGUgICAgICBvdXRwdXQgc2FtcGxlIHJhdGUKLSAqIEBwYXJhbSBpbnB1dF9yYXRlICAgICAgIGlucHV0IHNhbXBsZSByYXRlCi0gKiBAcGFyYW0gc2FtcGxlX2ZtdF9vdXQgICByZXF1ZXN0ZWQgb3V0cHV0IHNhbXBsZSBmb3JtYXQKLSAqIEBwYXJhbSBzYW1wbGVfZm10X2luICAgIGlucHV0IHNhbXBsZSBmb3JtYXQKLSAqIEBwYXJhbSBmaWx0ZXJfbGVuZ3RoICAgIGxlbmd0aCBvZiBlYWNoIEZJUiBmaWx0ZXIgaW4gdGhlIGZpbHRlcmJhbmsgcmVsYXRpdmUgdG8gdGhlIGN1dG9mZiBmcmVxdWVuY3kKLSAqIEBwYXJhbSBsb2cyX3BoYXNlX2NvdW50IGxvZzIgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwb2x5cGhhc2UgZmlsdGVyYmFuawotICogQHBhcmFtIGxpbmVhciAgICAgICAgICAgaWYgMSB0aGVuIHRoZSB1c2VkIEZJUiBmaWx0ZXIgd2lsbCBiZSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdGhlIDIgY2xvc2VzdCwgaWYgMCB0aGUgY2xvc2VzdCB3aWxsIGJlIHVzZWQKLSAqIEBwYXJhbSBjdXRvZmYgICAgICAgICAgIGN1dG9mZiBmcmVxdWVuY3ksIDEuMCBjb3JyZXNwb25kcyB0byBoYWxmIHRoZSBvdXRwdXQgc2FtcGxpbmcgcmF0ZQotICogQHJldHVybiBhbGxvY2F0ZWQgUmVTYW1wbGVDb250ZXh0LCBOVUxMIGlmIGVycm9yIG9jY3VycmVkCi0gKi8KLWF0dHJpYnV0ZV9kZXByZWNhdGVkCi1SZVNhbXBsZUNvbnRleHQgKmF2X2F1ZGlvX3Jlc2FtcGxlX2luaXQoaW50IG91dHB1dF9jaGFubmVscywgaW50IGlucHV0X2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfcmF0ZSwgaW50IGlucHV0X3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRlcl9sZW5ndGgsIGludCBsb2cyX3BoYXNlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lYXIsIGRvdWJsZSBjdXRvZmYpOwotCi1hdHRyaWJ1dGVfZGVwcmVjYXRlZAotaW50IGF1ZGlvX3Jlc2FtcGxlKFJlU2FtcGxlQ29udGV4dCAqcywgc2hvcnQgKm91dHB1dCwgc2hvcnQgKmlucHV0LCBpbnQgbmJfc2FtcGxlcyk7Ci0KLS8qKgotICogRnJlZSByZXNhbXBsZSBjb250ZXh0LgotICoKLSAqIEBwYXJhbSBzIGEgbm9uLU5VTEwgcG9pbnRlciB0byBhIHJlc2FtcGxlIGNvbnRleHQgcHJldmlvdXNseQotICogICAgICAgICAgY3JlYXRlZCB3aXRoIGF2X2F1ZGlvX3Jlc2FtcGxlX2luaXQoKQotICovCi1hdHRyaWJ1dGVfZGVwcmVjYXRlZAotdm9pZCBhdWRpb19yZXNhbXBsZV9jbG9zZShSZVNhbXBsZUNvbnRleHQgKnMpOwotCi0KLS8qKgotICogSW5pdGlhbGl6ZSBhbiBhdWRpbyByZXNhbXBsZXIuCi0gKiBOb3RlLCBpZiBlaXRoZXIgcmF0ZSBpcyBub3QgYW4gaW50ZWdlciB0aGVuIHNpbXBseSBzY2FsZSBib3RoIHJhdGVzIHVwIHNvIHRoZXkgYXJlLgotICogQHBhcmFtIGZpbHRlcl9sZW5ndGggbGVuZ3RoIG9mIGVhY2ggRklSIGZpbHRlciBpbiB0aGUgZmlsdGVyYmFuayByZWxhdGl2ZSB0byB0aGUgY3V0b2ZmIGZyZXEKLSAqIEBwYXJhbSBsb2cyX3BoYXNlX2NvdW50IGxvZzIgb2YgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBwb2x5cGhhc2UgZmlsdGVyYmFuawotICogQHBhcmFtIGxpbmVhciBJZiAxIHRoZW4gdGhlIHVzZWQgRklSIGZpbHRlciB3aWxsIGJlIGxpbmVhcmx5IGludGVycG9sYXRlZAotICAgICAgICAgICAgICAgICBiZXR3ZWVuIHRoZSAyIGNsb3Nlc3QsIGlmIDAgdGhlIGNsb3Nlc3Qgd2lsbCBiZSB1c2VkCi0gKiBAcGFyYW0gY3V0b2ZmIGN1dG9mZiBmcmVxdWVuY3ksIDEuMCBjb3JyZXNwb25kcyB0byBoYWxmIHRoZSBvdXRwdXQgc2FtcGxpbmcgcmF0ZQotICovCi1hdHRyaWJ1dGVfZGVwcmVjYXRlZAotc3RydWN0IEFWUmVzYW1wbGVDb250ZXh0ICphdl9yZXNhbXBsZV9pbml0KGludCBvdXRfcmF0ZSwgaW50IGluX3JhdGUsIGludCBmaWx0ZXJfbGVuZ3RoLCBpbnQgbG9nMl9waGFzZV9jb3VudCwgaW50IGxpbmVhciwgZG91YmxlIGN1dG9mZik7Ci0KLS8qKgotICogUmVzYW1wbGUgYW4gYXJyYXkgb2Ygc2FtcGxlcyB1c2luZyBhIHByZXZpb3VzbHkgY29uZmlndXJlZCBjb250ZXh0LgotICogQHBhcmFtIHNyYyBhbiBhcnJheSBvZiB1bmNvbnN1bWVkIHNhbXBsZXMKLSAqIEBwYXJhbSBjb25zdW1lZCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2Ygc3JjIHdoaWNoIGhhdmUgYmVlbiBjb25zdW1lZCBhcmUgcmV0dXJuZWQgaGVyZQotICogQHBhcmFtIHNyY19zaXplIHRoZSBudW1iZXIgb2YgdW5jb25zdW1lZCBzYW1wbGVzIGF2YWlsYWJsZQotICogQHBhcmFtIGRzdF9zaXplIHRoZSBhbW91bnQgb2Ygc3BhY2UgaW4gc2FtcGxlcyBhdmFpbGFibGUgaW4gZHN0Ci0gKiBAcGFyYW0gdXBkYXRlX2N0eCBJZiB0aGlzIGlzIDAgdGhlbiB0aGUgY29udGV4dCB3aWxsIG5vdCBiZSBtb2RpZmllZCwgdGhhdCB3YXkgc2V2ZXJhbCBjaGFubmVscyBjYW4gYmUgcmVzYW1wbGVkIHdpdGggdGhlIHNhbWUgY29udGV4dC4KLSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHdyaXR0ZW4gaW4gZHN0IG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkCi0gKi8KLWF0dHJpYnV0ZV9kZXByZWNhdGVkCi1pbnQgYXZfcmVzYW1wbGUoc3RydWN0IEFWUmVzYW1wbGVDb250ZXh0ICpjLCBzaG9ydCAqZHN0LCBzaG9ydCAqc3JjLCBpbnQgKmNvbnN1bWVkLCBpbnQgc3JjX3NpemUsIGludCBkc3Rfc2l6ZSwgaW50IHVwZGF0ZV9jdHgpOwotCi0KLS8qKgotICogQ29tcGVuc2F0ZSBzYW1wbGVyYXRlL3RpbWVzdGFtcCBkcmlmdC4gVGhlIGNvbXBlbnNhdGlvbiBpcyBkb25lIGJ5IGNoYW5naW5nCi0gKiB0aGUgcmVzYW1wbGVyIHBhcmFtZXRlcnMsIHNvIG5vIGF1ZGlibGUgY2xpY2tzIG9yIHNpbWlsYXIgZGlzdG9ydGlvbnMgb2NjdXIKLSAqIEBwYXJhbSBjb21wZW5zYXRpb25fZGlzdGFuY2UgZGlzdGFuY2UgaW4gb3V0cHV0IHNhbXBsZXMgb3ZlciB3aGljaCB0aGUgY29tcGVuc2F0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQKLSAqIEBwYXJhbSBzYW1wbGVfZGVsdGEgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIHdoaWNoIHNob3VsZCBiZSBvdXRwdXQgbGVzcwotICoKLSAqIGV4YW1wbGU6IGF2X3Jlc2FtcGxlX2NvbXBlbnNhdGUoYywgMTAsIDUwMCkKLSAqIGhlcmUgaW5zdGVhZCBvZiA1MTAgc2FtcGxlcyBvbmx5IDUwMCBzYW1wbGVzIHdvdWxkIGJlIG91dHB1dAotICoKLSAqIG5vdGUsIGR1ZSB0byByb3VuZGluZyB0aGUgYWN0dWFsIGNvbXBlbnNhdGlvbiBtaWdodCBiZSBzbGlnaHRseSBkaWZmZXJlbnQsCi0gKiBlc3BlY2lhbGx5IGlmIHRoZSBjb21wZW5zYXRpb25fZGlzdGFuY2UgaXMgbGFyZ2UgYW5kIHRoZSBpbl9yYXRlIHVzZWQgZHVyaW5nIGluaXQgaXMgc21hbGwKLSAqLwotYXR0cmlidXRlX2RlcHJlY2F0ZWQKLXZvaWQgYXZfcmVzYW1wbGVfY29tcGVuc2F0ZShzdHJ1Y3QgQVZSZXNhbXBsZUNvbnRleHQgKmMsIGludCBzYW1wbGVfZGVsdGEsIGludCBjb21wZW5zYXRpb25fZGlzdGFuY2UpOwotYXR0cmlidXRlX2RlcHJlY2F0ZWQKLXZvaWQgYXZfcmVzYW1wbGVfY2xvc2Uoc3RydWN0IEFWUmVzYW1wbGVDb250ZXh0ICpjKTsKLQotLyoqCi0gKiBAfQotICovCi0jZW5kaWYKLQogI2lmIEZGX0FQSV9BVlBJQ1RVUkUKIC8qKgogICogQGFkZHRvZ3JvdXAgbGF2Y19waWN0dXJlCkBAIC00OTM5LDIyICs1NDc1LDE0IEBACiAgKiBAewogICovCiAKKyNpZiBGRl9BUElfR0VUQ0hST01BCiAvKioKLSAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gYWNjZXNzIGxvZzJfY2hyb21hX3cgbG9nMl9jaHJvbWFfaCBmcm9tCi0gKiB0aGUgcGl4ZWwgZm9ybWF0IEFWUGl4Rm10RGVzY3JpcHRvci4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFzc2VydHMgdGhhdCBwaXhfZm10IGlzIHZhbGlkLiBTZWUgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUKLSAqIGZvciBvbmUgdGhhdCByZXR1cm5zIGEgZmFpbHVyZSBjb2RlIGFuZCBjb250aW51ZXMgaW4gY2FzZSBvZiBpbnZhbGlkCi0gKiBwaXhfZm10cy4KLSAqCi0gKiBAcGFyYW1baW5dICBwaXhfZm10IHRoZSBwaXhlbCBmb3JtYXQKLSAqIEBwYXJhbVtvdXRdIGhfc2hpZnQgc3RvcmUgbG9nMl9jaHJvbWFfdwotICogQHBhcmFtW291dF0gdl9zaGlmdCBzdG9yZSBsb2cyX2Nocm9tYV9oCi0gKgotICogQHNlZSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZQorICogQGRlcHJlY2F0ZWQgVXNlIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlCiAgKi8KIAorYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCAqaF9zaGlmdCwgaW50ICp2X3NoaWZ0KTsKKyNlbmRpZgogCiAvKioKICAqIFJldHVybiBhIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZm91ckNDIGNvZGUgYXNzb2NpYXRlZCB0byB0aGUKQEAgLTQ5OTcsMTUgKzU1MjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjX3BpeF9mbXQsIGludCBoYXNfYWxwaGEsIGludCAqbG9zc19wdHIpOwogCiBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotI2lmIEFWX0hBVkVfSU5DT01QQVRJQkxFX0xJQkFWX0FCSQotZW51bSBBVlBpeGVsRm9ybWF0IGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXQyKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdF9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNfcGl4X2ZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX2FscGhhLCBpbnQgKmxvc3NfcHRyKTsKLSNlbHNlCiBlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdDIoZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MSwgZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LCBpbnQgaGFzX2FscGhhLCBpbnQgKmxvc3NfcHRyKTsKLSNlbmRpZgotCiAKIGVudW0gQVZQaXhlbEZvcm1hdCBhdmNvZGVjX2RlZmF1bHRfZ2V0X2Zvcm1hdChzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKnMsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqIGZtdCk7CiAKQEAgLTUwMTMsMTQgKzU1MzQsNyBAQAogICogQH0KICAqLwogCi0jaWYgRkZfQVBJX1NFVF9ESU1FTlNJT05TCi0vKioKLSAqIEBkZXByZWNhdGVkIHRoaXMgZnVuY3Rpb24gaXMgbm90IHN1cHBvc2VkIHRvIGJlIHVzZWQgZnJvbSBvdXRzaWRlIG9mIGxhdmMKLSAqLwotYXR0cmlidXRlX2RlcHJlY2F0ZWQKLXZvaWQgYXZjb2RlY19zZXRfZGltZW5zaW9ucyhBVkNvZGVjQ29udGV4dCAqcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSNlbmRpZgotCisjaWYgRkZfQVBJX1RBR19TVFJJTkcKIC8qKgogICogUHV0IGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY29kZWMgdGFnIGNvZGVjX3RhZyBpbiBidWYuCiAgKgpAQCAtNTAyOSw4ICs1NTQzLDEyIEBACiAgKiBAcGFyYW0gY29kZWNfdGFnIGNvZGVjIHRhZyB0byBhc3NpZ24KICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoYXQgd291bGQgaGF2ZSBiZWVuIGdlbmVyYXRlZCBpZgogICogZW5vdWdoIHNwYWNlIGhhZCBiZWVuIGF2YWlsYWJsZSwgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsCisgKgorICogQGRlcHJlY2F0ZWQgc2VlIGF2X2ZvdXJjY19tYWtlX3N0cmluZygpIGFuZCBhdl9mb3VyY2Myc3RyKCkuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBzaXplX3QgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsIHVuc2lnbmVkIGludCBjb2RlY190YWcpOworI2VuZGlmCiAKIHZvaWQgYXZjb2RlY19zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIEFWQ29kZWNDb250ZXh0ICplbmMsIGludCBlbmNvZGUpOwogCkBAIC01MTM0LDEwICs1NjUyLDE2IEBACiAgKi8KIGludCBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgZnJhbWVfYnl0ZXMpOwogCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKCksIGV4Y2VwdCBpdCB3b3JrcworICogd2l0aCBBVkNvZGVjUGFyYW1ldGVycyBpbnN0ZWFkIG9mIGFuIEFWQ29kZWNDb250ZXh0LgorICovCitpbnQgYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uMihBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBpbnQgZnJhbWVfYnl0ZXMpOwogCisjaWYgRkZfQVBJX09MRF9CU0YKIHR5cGVkZWYgc3RydWN0IEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCB7CiAgICAgdm9pZCAqcHJpdl9kYXRhOwotICAgIHN0cnVjdCBBVkJpdFN0cmVhbUZpbHRlciAqZmlsdGVyOworICAgIGNvbnN0IHN0cnVjdCBBVkJpdFN0cmVhbUZpbHRlciAqZmlsdGVyOwogICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpwYXJzZXI7CiAgICAgc3RydWN0IEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqbmV4dDsKICAgICAvKioKQEAgLTUxNDYsOTIgKzU2NzAsMzI2IEBACiAgICAgICovCiAgICAgY2hhciAqYXJnczsKIH0gQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0OworI2VuZGlmCiAKK3R5cGVkZWYgc3RydWN0IEFWQlNGSW50ZXJuYWwgQVZCU0ZJbnRlcm5hbDsKKworLyoqCisgKiBUaGUgYml0c3RyZWFtIGZpbHRlciBzdGF0ZS4KKyAqCisgKiBUaGlzIHN0cnVjdCBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIGF2X2JzZl9hbGxvYygpIGFuZCBmcmVlZCB3aXRoCisgKiBhdl9ic2ZfZnJlZSgpLgorICoKKyAqIFRoZSBmaWVsZHMgaW4gdGhlIHN0cnVjdCB3aWxsIG9ubHkgYmUgY2hhbmdlZCAoYnkgdGhlIGNhbGxlciBvciBieSB0aGUKKyAqIGZpbHRlcikgYXMgZGVzY3JpYmVkIGluIHRoZWlyIGRvY3VtZW50YXRpb24sIGFuZCBhcmUgdG8gYmUgY29uc2lkZXJlZAorICogaW1tdXRhYmxlIG90aGVyd2lzZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZCU0ZDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIGZvciBsb2dnaW5nIGFuZCBBVk9wdGlvbnMKKyAgICAgKi8KKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKworICAgIC8qKgorICAgICAqIFRoZSBiaXRzdHJlYW0gZmlsdGVyIHRoaXMgY29udGV4dCBpcyBhbiBpbnN0YW5jZSBvZi4KKyAgICAgKi8KKyAgICBjb25zdCBzdHJ1Y3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmZpbHRlcjsKKworICAgIC8qKgorICAgICAqIE9wYXF1ZSBsaWJhdmNvZGVjIGludGVybmFsIGRhdGEuIE11c3Qgbm90IGJlIHRvdWNoZWQgYnkgdGhlIGNhbGxlciBpbiBhbnkKKyAgICAgKiB3YXkuCisgICAgICovCisgICAgQVZCU0ZJbnRlcm5hbCAqaW50ZXJuYWw7CisKKyAgICAvKioKKyAgICAgKiBPcGFxdWUgZmlsdGVyLXNwZWNpZmljIHByaXZhdGUgZGF0YS4gSWYgZmlsdGVyLT5wcml2X2NsYXNzIGlzIG5vbi1OVUxMLAorICAgICAqIHRoaXMgaXMgYW4gQVZPcHRpb25zLWVuYWJsZWQgc3RydWN0LgorICAgICAqLworICAgIHZvaWQgKnByaXZfZGF0YTsKKworICAgIC8qKgorICAgICAqIFBhcmFtZXRlcnMgb2YgdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBmaWVsZCBpcyBhbGxvY2F0ZWQgaW4KKyAgICAgKiBhdl9ic2ZfYWxsb2MoKSwgaXQgbmVlZHMgdG8gYmUgZmlsbGVkIGJ5IHRoZSBjYWxsZXIgYmVmb3JlCisgICAgICogYXZfYnNmX2luaXQoKS4KKyAgICAgKi8KKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyX2luOworCisgICAgLyoqCisgICAgICogUGFyYW1ldGVycyBvZiB0aGUgb3V0cHV0IHN0cmVhbS4gVGhpcyBmaWVsZCBpcyBhbGxvY2F0ZWQgaW4KKyAgICAgKiBhdl9ic2ZfYWxsb2MoKSwgaXQgaXMgc2V0IGJ5IHRoZSBmaWx0ZXIgaW4gYXZfYnNmX2luaXQoKS4KKyAgICAgKi8KKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyX291dDsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lYmFzZSB1c2VkIGZvciB0aGUgdGltZXN0YW1wcyBvZiB0aGUgaW5wdXQgcGFja2V0cy4gU2V0IGJ5IHRoZQorICAgICAqIGNhbGxlciBiZWZvcmUgYXZfYnNmX2luaXQoKS4KKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZV9pbjsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lYmFzZSB1c2VkIGZvciB0aGUgdGltZXN0YW1wcyBvZiB0aGUgb3V0cHV0IHBhY2tldHMuIFNldCBieSB0aGUKKyAgICAgKiBmaWx0ZXIgaW4gYXZfYnNmX2luaXQoKS4KKyAgICAgKi8KKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZV9vdXQ7Cit9IEFWQlNGQ29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgQVZCaXRTdHJlYW1GaWx0ZXIgewogICAgIGNvbnN0IGNoYXIgKm5hbWU7CisKKyAgICAvKioKKyAgICAgKiBBIGxpc3Qgb2YgY29kZWMgaWRzIHN1cHBvcnRlZCBieSB0aGUgZmlsdGVyLCB0ZXJtaW5hdGVkIGJ5CisgICAgICogQVZfQ09ERUNfSURfTk9ORS4KKyAgICAgKiBNYXkgYmUgTlVMTCwgaW4gdGhhdCBjYXNlIHRoZSBiaXRzdHJlYW0gZmlsdGVyIHdvcmtzIHdpdGggYW55IGNvZGVjIGlkLgorICAgICAqLworICAgIGNvbnN0IGVudW0gQVZDb2RlY0lEICpjb2RlY19pZHM7CisKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIGZvciB0aGUgcHJpdmF0ZSBkYXRhLCB1c2VkIHRvIGRlY2xhcmUgYml0c3RyZWFtIGZpbHRlciBwcml2YXRlCisgICAgICogQVZPcHRpb25zLiBUaGlzIGZpZWxkIGlzIE5VTEwgZm9yIGJpdHN0cmVhbSBmaWx0ZXJzIHRoYXQgZG8gbm90IGRlY2xhcmUKKyAgICAgKiBhbnkgb3B0aW9ucy4KKyAgICAgKgorICAgICAqIElmIHRoaXMgZmllbGQgaXMgbm9uLU5VTEwsIHRoZSBmaXJzdCBtZW1iZXIgb2YgdGhlIGZpbHRlciBwcml2YXRlIGRhdGEKKyAgICAgKiBtdXN0IGJlIGEgcG9pbnRlciB0byBBVkNsYXNzLCB3aGljaCB3aWxsIGJlIHNldCBieSBsaWJhdmNvZGVjIGdlbmVyaWMKKyAgICAgKiBjb2RlIHRvIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgY29uc3QgQVZDbGFzcyAqcHJpdl9jbGFzczsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIE5vIGZpZWxkcyBiZWxvdyB0aGlzIGxpbmUgYXJlIHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuIFRoZXkKKyAgICAgKiBtYXkgbm90IGJlIHVzZWQgb3V0c2lkZSBvZiBsaWJhdmNvZGVjIGFuZCBjYW4gYmUgY2hhbmdlZCBhbmQKKyAgICAgKiByZW1vdmVkIGF0IHdpbGwuCisgICAgICogTmV3IHB1YmxpYyBmaWVsZHMgc2hvdWxkIGJlIGFkZGVkIHJpZ2h0IGFib3ZlLgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCiAgICAgaW50IHByaXZfZGF0YV9zaXplOwotICAgIGludCAoKmZpbHRlcikoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLAotICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAotICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSk7Ci0gICAgdm9pZCAoKmNsb3NlKShBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMpOwotICAgIHN0cnVjdCBBVkJpdFN0cmVhbUZpbHRlciAqbmV4dDsKKyAgICBpbnQgKCppbml0KShBVkJTRkNvbnRleHQgKmN0eCk7CisgICAgaW50ICgqZmlsdGVyKShBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCk7CisgICAgdm9pZCAoKmNsb3NlKShBVkJTRkNvbnRleHQgKmN0eCk7CiB9IEFWQml0U3RyZWFtRmlsdGVyOwogCisjaWYgRkZfQVBJX09MRF9CU0YKIC8qKgotICogUmVnaXN0ZXIgYSBiaXRzdHJlYW0gZmlsdGVyLgotICoKLSAqIFRoZSBmaWx0ZXIgd2lsbCBiZSBhY2Nlc3NpYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiBjb2RlIHRocm91Z2gKLSAqIGF2X2JpdHN0cmVhbV9maWx0ZXJfbmV4dCgpIG9yIGNhbiBiZSBkaXJlY3RseSBpbml0aWFsaXplZCB3aXRoCi0gKiBhdl9iaXRzdHJlYW1fZmlsdGVyX2luaXQoKS4KLSAqCi0gKiBAc2VlIGF2Y29kZWNfcmVnaXN0ZXJfYWxsKCkKKyAqIEBkZXByZWNhdGVkIHRoZSBvbGQgYml0c3RyZWFtIGZpbHRlcmluZyBBUEkgKHVzaW5nIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCkKKyAqIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgbmV3IGJpdHN0cmVhbSBmaWx0ZXJpbmcgQVBJICh1c2luZyBBVkJTRkNvbnRleHQpLgogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCBhdl9yZWdpc3Rlcl9iaXRzdHJlYW1fZmlsdGVyKEFWQml0U3RyZWFtRmlsdGVyICpic2YpOwotCiAvKioKLSAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIGJpdHN0cmVhbSBmaWx0ZXIgY29udGV4dCBnaXZlbiBhIGJpdHN0cmVhbQotICogZmlsdGVyIG5hbWUuCi0gKgotICogVGhlIHJldHVybmVkIGNvbnRleHQgbXVzdCBiZSBmcmVlZCB3aXRoIGF2X2JpdHN0cmVhbV9maWx0ZXJfY2xvc2UoKS4KLSAqCi0gKiBAcGFyYW0gbmFtZSAgICB0aGUgbmFtZSBvZiB0aGUgYml0c3RyZWFtIGZpbHRlcgotICogQHJldHVybiBhIGJpdHN0cmVhbSBmaWx0ZXIgY29udGV4dCBpZiBhIG1hdGNoaW5nIGZpbHRlciB3YXMgZm91bmQKLSAqIGFuZCBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQsIE5VTEwgb3RoZXJ3aXNlCisgKiBAZGVwcmVjYXRlZCB0aGUgb2xkIGJpdHN0cmVhbSBmaWx0ZXJpbmcgQVBJICh1c2luZyBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQpCisgKiBpcyBkZXByZWNhdGVkLiBVc2UgYXZfYnNmX2dldF9ieV9uYW1lKCksIGF2X2JzZl9hbGxvYygpLCBhbmQgYXZfYnNmX2luaXQoKQorICogZnJvbSB0aGUgbmV3IGJpdHN0cmVhbSBmaWx0ZXJpbmcgQVBJICh1c2luZyBBVkJTRkNvbnRleHQpLgogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICphdl9iaXRzdHJlYW1fZmlsdGVyX2luaXQoY29uc3QgY2hhciAqbmFtZSk7Ci0KIC8qKgotICogRmlsdGVyIGJpdHN0cmVhbS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGZpbHRlcnMgdGhlIGJ1ZmZlciBidWYgd2l0aCBzaXplIGJ1Zl9zaXplLCBhbmQgcGxhY2VzIHRoZQotICogZmlsdGVyZWQgYnVmZmVyIGluIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSBwb3V0YnVmLgotICoKLSAqIFRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KLSAqCi0gKiBAcGFyYW0gYnNmYyAgICAgICAgICAgIGJpdHN0cmVhbSBmaWx0ZXIgY29udGV4dCBjcmVhdGVkIGJ5IGF2X2JpdHN0cmVhbV9maWx0ZXJfaW5pdCgpCi0gKiBAcGFyYW0gYXZjdHggICAgICAgICAgIEFWQ29kZWNDb250ZXh0IGFjY2Vzc2VkIGJ5IHRoZSBmaWx0ZXIsIG1heSBiZSBOVUxMLgotICogICAgICAgICAgICAgICAgICAgICAgICBJZiBzcGVjaWZpZWQsIHRoaXMgbXVzdCBwb2ludCB0byB0aGUgZW5jb2RlciBjb250ZXh0IG9mIHRoZQotICogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc3RyZWFtIHRoZSBwYWNrZXQgaXMgc2VudCB0by4KLSAqIEBwYXJhbSBhcmdzICAgICAgICAgICAgYXJndW1lbnRzIHdoaWNoIHNwZWNpZnkgdGhlIGZpbHRlciBjb25maWd1cmF0aW9uLCBtYXkgYmUgTlVMTAotICogQHBhcmFtIHBvdXRidWYgICAgICAgICBwb2ludGVyIHdoaWNoIGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGZpbHRlcmVkIGJ1ZmZlcgotICogQHBhcmFtIHBvdXRidWZfc2l6ZSAgICBwb2ludGVyIHdoaWNoIGlzIHVwZGF0ZWQgdG8gdGhlIGZpbHRlcmVkIGJ1ZmZlciBzaXplIGluIGJ5dGVzCi0gKiBAcGFyYW0gYnVmICAgICAgICAgICAgIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIGZpbHRlcgotICogQHBhcmFtIGJ1Zl9zaXplICAgICAgICBzaXplIGluIGJ5dGVzIG9mIGJ1ZgotICogQHBhcmFtIGtleWZyYW1lICAgICAgICBzZXQgdG8gbm9uLXplcm8gaWYgdGhlIGJ1ZmZlciB0byBmaWx0ZXIgY29ycmVzcG9uZHMgdG8gYSBrZXktZnJhbWUgcGFja2V0IGRhdGEKLSAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHBvc2l0aXZlLCBhbiBvdXRwdXQgYnVmZmVyIGlzIGFsbG9jYXRlZCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBpbiAqcG91dGJ1ZiwgYW5kIGlzIGRpc3RpbmN0IGZyb20gdGhlIGlucHV0IGJ1ZmZlci4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIDAsIHRoZSBvdXRwdXQgYnVmZmVyIGlzIG5vdCBhbGxvY2F0ZWQgYW5kCi0gKiBzaG91bGQgYmUgY29uc2lkZXJlZCBpZGVudGljYWwgdG8gdGhlIGlucHV0IGJ1ZmZlciwgb3IgaW4gY2FzZQotICogKnBvdXRidWYgd2FzIHNldCBpdCBwb2ludHMgdG8gdGhlIGlucHV0IGJ1ZmZlciAobm90IG5lY2Vzc2FyaWx5IHRvCi0gKiBpdHMgc3RhcnRpbmcgYWRkcmVzcykuCisgKiBAZGVwcmVjYXRlZCB0aGUgb2xkIGJpdHN0cmVhbSBmaWx0ZXJpbmcgQVBJICh1c2luZyBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQpCisgKiBpcyBkZXByZWNhdGVkLiBVc2UgYXZfYnNmX3NlbmRfcGFja2V0KCkgYW5kIGF2X2JzZl9yZWNlaXZlX3BhY2tldCgpIGZyb20gdGhlCisgKiBuZXcgYml0c3RyZWFtIGZpbHRlcmluZyBBUEkgKHVzaW5nIEFWQlNGQ29udGV4dCkuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgYXZfYml0c3RyZWFtX2ZpbHRlcl9maWx0ZXIoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSk7Ci0KIC8qKgotICogUmVsZWFzZSBiaXRzdHJlYW0gZmlsdGVyIGNvbnRleHQuCi0gKgotICogQHBhcmFtIGJzZiB0aGUgYml0c3RyZWFtIGZpbHRlciBjb250ZXh0IGNyZWF0ZWQgd2l0aAotICogYXZfYml0c3RyZWFtX2ZpbHRlcl9pbml0KCksIGNhbiBiZSBOVUxMCisgKiBAZGVwcmVjYXRlZCB0aGUgb2xkIGJpdHN0cmVhbSBmaWx0ZXJpbmcgQVBJICh1c2luZyBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQpCisgKiBpcyBkZXByZWNhdGVkLiBVc2UgYXZfYnNmX2ZyZWUoKSBmcm9tIHRoZSBuZXcgYml0c3RyZWFtIGZpbHRlcmluZyBBUEkgKHVzaW5nCisgKiBBVkJTRkNvbnRleHQpLgogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCBhdl9iaXRzdHJlYW1fZmlsdGVyX2Nsb3NlKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmKTsKKy8qKgorICogQGRlcHJlY2F0ZWQgdGhlIG9sZCBiaXRzdHJlYW0gZmlsdGVyaW5nIEFQSSAodXNpbmcgQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0KQorICogaXMgZGVwcmVjYXRlZC4gVXNlIGF2X2JzZl9pdGVyYXRlKCkgZnJvbSB0aGUgbmV3IGJpdHN0cmVhbSBmaWx0ZXJpbmcgQVBJICh1c2luZworICogQVZCU0ZDb250ZXh0KS4KKyAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyICphdl9iaXRzdHJlYW1fZmlsdGVyX25leHQoY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmYpOworI2VuZGlmCiAKIC8qKgotICogSWYgZiBpcyBOVUxMLCByZXR1cm4gdGhlIGZpcnN0IHJlZ2lzdGVyZWQgYml0c3RyZWFtIGZpbHRlciwKLSAqIGlmIGYgaXMgbm9uLU5VTEwsIHJldHVybiB0aGUgbmV4dCByZWdpc3RlcmVkIGJpdHN0cmVhbSBmaWx0ZXIKLSAqIGFmdGVyIGYsIG9yIE5VTEwgaWYgZiBpcyB0aGUgbGFzdCBvbmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgYWxsIHJlZ2lzdGVyZWQgYml0c3RyZWFtCi0gKiBmaWx0ZXJzLgorICogQHJldHVybiBhIGJpdHN0cmVhbSBmaWx0ZXIgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgb3IgTlVMTCBpZiBubyBzdWNoCisgKiAgICAgICAgIGJpdHN0cmVhbSBmaWx0ZXIgZXhpc3RzLgogICovCi1BVkJpdFN0cmVhbUZpbHRlciAqYXZfYml0c3RyZWFtX2ZpbHRlcl9uZXh0KGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyICpmKTsKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyICphdl9ic2ZfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogSXRlcmF0ZSBvdmVyIGFsbCByZWdpc3RlcmVkIGJpdHN0cmVhbSBmaWx0ZXJzLgorICoKKyAqIEBwYXJhbSBvcGFxdWUgYSBwb2ludGVyIHdoZXJlIGxpYmF2Y29kZWMgd2lsbCBzdG9yZSB0aGUgaXRlcmF0aW9uIHN0YXRlLiBNdXN0CisgKiAgICAgICAgICAgICAgIHBvaW50IHRvIE5VTEwgdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbi4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXh0IHJlZ2lzdGVyZWQgYml0c3RyZWFtIGZpbHRlciBvciBOVUxMIHdoZW4gdGhlIGl0ZXJhdGlvbiBpcworICogICAgICAgICBmaW5pc2hlZAorICovCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqYXZfYnNmX2l0ZXJhdGUodm9pZCAqKm9wYXF1ZSk7CisjaWYgRkZfQVBJX05FWFQKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqYXZfYnNmX25leHQodm9pZCAqKm9wYXF1ZSk7CisjZW5kaWYKKworLyoqCisgKiBBbGxvY2F0ZSBhIGNvbnRleHQgZm9yIGEgZ2l2ZW4gYml0c3RyZWFtIGZpbHRlci4gVGhlIGNhbGxlciBtdXN0IGZpbGwgaW4gdGhlCisgKiBjb250ZXh0IHBhcmFtZXRlcnMgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZCB0aGVuIGNhbGwKKyAqIGF2X2JzZl9pbml0KCkgYmVmb3JlIHNlbmRpbmcgYW55IGRhdGEgdG8gdGhlIGZpbHRlci4KKyAqCisgKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgZm9yIHdoaWNoIHRvIGFsbG9jYXRlIGFuIGluc3RhbmNlLgorICogQHBhcmFtIGN0eCBhIHBvaW50ZXIgaW50byB3aGljaCB0aGUgcG9pbnRlciB0byB0aGUgbmV3bHktYWxsb2NhdGVkIGNvbnRleHQKKyAqICAgICAgICAgICAgd2lsbCBiZSB3cml0dGVuLiBJdCBtdXN0IGJlIGZyZWVkIHdpdGggYXZfYnNmX2ZyZWUoKSBhZnRlciB0aGUKKyAqICAgICAgICAgICAgZmlsdGVyaW5nIGlzIGRvbmUuCisgKgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGF2X2JzZl9hbGxvYyhjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqZmlsdGVyLCBBVkJTRkNvbnRleHQgKipjdHgpOworCisvKioKKyAqIFByZXBhcmUgdGhlIGZpbHRlciBmb3IgdXNlLCBhZnRlciBhbGwgdGhlIHBhcmFtZXRlcnMgYW5kIG9wdGlvbnMgaGF2ZSBiZWVuCisgKiBzZXQuCisgKi8KK2ludCBhdl9ic2ZfaW5pdChBVkJTRkNvbnRleHQgKmN0eCk7CisKKy8qKgorICogU3VibWl0IGEgcGFja2V0IGZvciBmaWx0ZXJpbmcuCisgKgorICogQWZ0ZXIgc2VuZGluZyBlYWNoIHBhY2tldCwgdGhlIGZpbHRlciBtdXN0IGJlIGNvbXBsZXRlbHkgZHJhaW5lZCBieSBjYWxsaW5nCisgKiBhdl9ic2ZfcmVjZWl2ZV9wYWNrZXQoKSByZXBlYXRlZGx5IHVudGlsIGl0IHJldHVybnMgQVZFUlJPUihFQUdBSU4pIG9yCisgKiBBVkVSUk9SX0VPRi4KKyAqCisgKiBAcGFyYW0gcGt0IHRoZSBwYWNrZXQgdG8gZmlsdGVyLiBUaGUgYml0c3RyZWFtIGZpbHRlciB3aWxsIHRha2Ugb3duZXJzaGlwIG9mCisgKiB0aGUgcGFja2V0IGFuZCByZXNldCB0aGUgY29udGVudHMgb2YgcGt0LiBwa3QgaXMgbm90IHRvdWNoZWQgaWYgYW4gZXJyb3Igb2NjdXJzLgorICogVGhpcyBwYXJhbWV0ZXIgbWF5IGJlIE5VTEwsIHdoaWNoIHNpZ25hbHMgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIChpLmUuIG5vIG1vcmUKKyAqIHBhY2tldHMgd2lsbCBiZSBzZW50KS4gVGhhdCB3aWxsIGNhdXNlIHRoZSBmaWx0ZXIgdG8gb3V0cHV0IGFueSBwYWNrZXRzIGl0CisgKiBtYXkgaGF2ZSBidWZmZXJlZCBpbnRlcm5hbGx5LgorICoKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IuCisgKi8KK2ludCBhdl9ic2Zfc2VuZF9wYWNrZXQoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpOworCisvKioKKyAqIFJldHJpZXZlIGEgZmlsdGVyZWQgcGFja2V0LgorICoKKyAqIEBwYXJhbVtvdXRdIHBrdCB0aGlzIHN0cnVjdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZmlsdGVyZWQKKyAqICAgICAgICAgICAgICAgICBwYWNrZXQuIEl0IGlzIG93bmVkIGJ5IHRoZSBjYWxsZXIgYW5kIG11c3QgYmUgZnJlZWQgdXNpbmcKKyAqICAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoKSB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCisgKiAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlICJjbGVhbiIgKGkuZS4gZnJlc2hseSBhbGxvY2F0ZWQKKyAqICAgICAgICAgICAgICAgICB3aXRoIGF2X3BhY2tldF9hbGxvYygpIG9yIHVucmVmZmVkIHdpdGggYXZfcGFja2V0X3VucmVmKCkpCisgKiAgICAgICAgICAgICAgICAgd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zCisgKiAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LCB0aGUgY29udGVudHMgb2YgcGt0IHdpbGwgYmUgY29tcGxldGVseQorICogICAgICAgICAgICAgICAgIG92ZXJ3cml0dGVuIGJ5IHRoZSByZXR1cm5lZCBkYXRhLiBPbiBmYWlsdXJlLCBwa3QgaXMgbm90CisgKiAgICAgICAgICAgICAgICAgdG91Y2hlZC4KKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2Vzcy4gQVZFUlJPUihFQUdBSU4pIGlmIG1vcmUgcGFja2V0cyBuZWVkIHRvIGJlIHNlbnQgdG8gdGhlCisgKiBmaWx0ZXIgKHVzaW5nIGF2X2JzZl9zZW5kX3BhY2tldCgpKSB0byBnZXQgbW9yZSBvdXRwdXQuIEFWRVJST1JfRU9GIGlmIHRoZXJlCisgKiB3aWxsIGJlIG5vIGZ1cnRoZXIgb3V0cHV0IGZyb20gdGhlIGZpbHRlci4gQW5vdGhlciBuZWdhdGl2ZSBBVkVSUk9SIHZhbHVlIGlmCisgKiBhbiBlcnJvciBvY2N1cnMuCisgKgorICogQG5vdGUgb25lIGlucHV0IHBhY2tldCBtYXkgcmVzdWx0IGluIHNldmVyYWwgb3V0cHV0IHBhY2tldHMsIHNvIGFmdGVyIHNlbmRpbmcKKyAqIGEgcGFja2V0IHdpdGggYXZfYnNmX3NlbmRfcGFja2V0KCksIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkCisgKiByZXBlYXRlZGx5IHVudGlsIGl0IHN0b3BzIHJldHVybmluZyAwLiBJdCBpcyBhbHNvIHBvc3NpYmxlIGZvciBhIGZpbHRlciB0bworICogb3V0cHV0IGZld2VyIHBhY2tldHMgdGhhbiB3ZXJlIHNlbnQgdG8gaXQsIHNvIHRoaXMgZnVuY3Rpb24gbWF5IHJldHVybgorICogQVZFUlJPUihFQUdBSU4pIGltbWVkaWF0ZWx5IGFmdGVyIGEgc3VjY2Vzc2Z1bCBhdl9ic2Zfc2VuZF9wYWNrZXQoKSBjYWxsLgorICovCitpbnQgYXZfYnNmX3JlY2VpdmVfcGFja2V0KEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KTsKKworLyoqCisgKiBGcmVlIGEgYml0c3RyZWFtIGZpbHRlciBjb250ZXh0IGFuZCBldmVyeXRoaW5nIGFzc29jaWF0ZWQgd2l0aCBpdDsgd3JpdGUgTlVMTAorICogaW50byB0aGUgc3VwcGxpZWQgcG9pbnRlci4KKyAqLwordm9pZCBhdl9ic2ZfZnJlZShBVkJTRkNvbnRleHQgKipjdHgpOworCisvKioKKyAqIEdldCB0aGUgQVZDbGFzcyBmb3IgQVZCU0ZDb250ZXh0LiBJdCBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoCisgKiBBVl9PUFRfU0VBUkNIX0ZBS0VfT0JKIGZvciBleGFtaW5pbmcgb3B0aW9ucy4KKyAqCisgKiBAc2VlIGF2X29wdF9maW5kKCkuCisgKi8KK2NvbnN0IEFWQ2xhc3MgKmF2X2JzZl9nZXRfY2xhc3Modm9pZCk7CisKKy8qKgorICogU3RydWN0dXJlIGZvciBjaGFpbi9saXN0IG9mIGJpdHN0cmVhbSBmaWx0ZXJzLgorICogRW1wdHkgbGlzdCBjYW4gYmUgYWxsb2NhdGVkIGJ5IGF2X2JzZl9saXN0X2FsbG9jKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWQlNGTGlzdCBBVkJTRkxpc3Q7CisKKy8qKgorICogQWxsb2NhdGUgZW1wdHkgbGlzdCBvZiBiaXRzdHJlYW0gZmlsdGVycy4KKyAqIFRoZSBsaXN0IG11c3QgYmUgbGF0ZXIgZnJlZWQgYnkgYXZfYnNmX2xpc3RfZnJlZSgpCisgKiBvciBmaW5hbGl6ZWQgYnkgYXZfYnNmX2xpc3RfZmluYWxpemUoKS4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gQHJlZiBBVkJTRkxpc3Qgb24gc3VjY2VzcywgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworQVZCU0ZMaXN0ICphdl9ic2ZfbGlzdF9hbGxvYyh2b2lkKTsKKworLyoqCisgKiBGcmVlIGxpc3Qgb2YgYml0c3RyZWFtIGZpbHRlcnMuCisgKgorICogQHBhcmFtIGxzdCBQb2ludGVyIHRvIHBvaW50ZXIgcmV0dXJuZWQgYnkgYXZfYnNmX2xpc3RfYWxsb2MoKQorICovCit2b2lkIGF2X2JzZl9saXN0X2ZyZWUoQVZCU0ZMaXN0ICoqbHN0KTsKKworLyoqCisgKiBBcHBlbmQgYml0c3RyZWFtIGZpbHRlciB0byB0aGUgbGlzdCBvZiBiaXRzdHJlYW0gZmlsdGVycy4KKyAqCisgKiBAcGFyYW0gbHN0IExpc3QgdG8gYXBwZW5kIHRvCisgKiBAcGFyYW0gYnNmIEZpbHRlciBjb250ZXh0IHRvIGJlIGFwcGVuZGVkCisgKgorICogQHJldHVybiA+PTAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X2JzZl9saXN0X2FwcGVuZChBVkJTRkxpc3QgKmxzdCwgQVZCU0ZDb250ZXh0ICpic2YpOworCisvKioKKyAqIENvbnN0cnVjdCBuZXcgYml0c3RyZWFtIGZpbHRlciBjb250ZXh0IGdpdmVuIGl0J3MgbmFtZSBhbmQgb3B0aW9ucworICogYW5kIGFwcGVuZCBpdCB0byB0aGUgbGlzdCBvZiBiaXRzdHJlYW0gZmlsdGVycy4KKyAqCisgKiBAcGFyYW0gbHN0ICAgICAgTGlzdCB0byBhcHBlbmQgdG8KKyAqIEBwYXJhbSBic2ZfbmFtZSBOYW1lIG9mIHRoZSBiaXRzdHJlYW0gZmlsdGVyCisgKiBAcGFyYW0gb3B0aW9ucyAgT3B0aW9ucyBmb3IgdGhlIGJpdHN0cmVhbSBmaWx0ZXIsIGNhbiBiZSBzZXQgdG8gTlVMTAorICoKKyAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIEFWRVJST1IgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCBhdl9ic2ZfbGlzdF9hcHBlbmQyKEFWQlNGTGlzdCAqbHN0LCBjb25zdCBjaGFyICogYnNmX25hbWUsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpOworLyoqCisgKiBGaW5hbGl6ZSBsaXN0IG9mIGJpdHN0cmVhbSBmaWx0ZXJzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCB0cmFuc2Zvcm0gQHJlZiBBVkJTRkxpc3QgdG8gc2luZ2xlIEByZWYgQVZCU0ZDb250ZXh0LAorICogc28gdGhlIHdob2xlIGNoYWluIG9mIGJpdHN0cmVhbSBmaWx0ZXJzIGNhbiBiZSB0cmVhdGVkIGFzIHNpbmdsZSBmaWx0ZXIKKyAqIGZyZXNobHkgYWxsb2NhdGVkIGJ5IGF2X2JzZl9hbGxvYygpLgorICogSWYgdGhlIGNhbGwgaXMgc3VjY2Vzc2Z1bCwgQHJlZiBBVkJTRkxpc3Qgc3RydWN0dXJlIGlzIGZyZWVkIGFuZCBsc3QKKyAqIHdpbGwgYmUgc2V0IHRvIE5VTEwuIEluIGNhc2Ugb2YgZmFpbHVyZSwgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvcgorICogZnJlZWluZyB0aGUgc3RydWN0dXJlIGJ5IGF2X2JzZl9saXN0X2ZyZWUoKQorICoKKyAqIEBwYXJhbSAgICAgIGxzdCBGaWx0ZXIgbGlzdCBzdHJ1Y3R1cmUgdG8gYmUgdHJhbnNmb3JtZWQKKyAqIEBwYXJhbVtvdXRdIGJzZiBQb2ludGVyIHRvIGJlIHNldCB0byBuZXdseSBjcmVhdGVkIEByZWYgQVZCU0ZDb250ZXh0IHN0cnVjdHVyZQorICogICAgICAgICAgICAgICAgIHJlcHJlc2VudGluZyB0aGUgY2hhaW4gb2YgYml0c3RyZWFtIGZpbHRlcnMKKyAqCisgKiBAcmV0dXJuID49MCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgYXZfYnNmX2xpc3RfZmluYWxpemUoQVZCU0ZMaXN0ICoqbHN0LCBBVkJTRkNvbnRleHQgKipic2YpOworCisvKioKKyAqIFBhcnNlIHN0cmluZyBkZXNjcmliaW5nIGxpc3Qgb2YgYml0c3RyZWFtIGZpbHRlcnMgYW5kIGNyZWF0ZSBzaW5nbGUKKyAqIEByZWYgQVZCU0ZDb250ZXh0IGRlc2NyaWJpbmcgdGhlIHdob2xlIGNoYWluIG9mIGJpdHN0cmVhbSBmaWx0ZXJzLgorICogUmVzdWx0aW5nIEByZWYgQVZCU0ZDb250ZXh0IGNhbiBiZSB0cmVhdGVkIGFzIGFueSBvdGhlciBAcmVmIEFWQlNGQ29udGV4dCBmcmVzaGx5CisgKiBhbGxvY2F0ZWQgYnkgYXZfYnNmX2FsbG9jKCkuCisgKgorICogQHBhcmFtICAgICAgc3RyIFN0cmluZyBkZXNjcmliaW5nIGNoYWluIG9mIGJpdHN0cmVhbSBmaWx0ZXJzIGluIGZvcm1hdAorICogICAgICAgICAgICAgICAgIGBic2YxWz1vcHQxPXZhbDE6b3B0Mj12YWwyXVssYnNmMl1gCisgKiBAcGFyYW1bb3V0XSBic2YgUG9pbnRlciB0byBiZSBzZXQgdG8gbmV3bHkgY3JlYXRlZCBAcmVmIEFWQlNGQ29udGV4dCBzdHJ1Y3R1cmUKKyAqICAgICAgICAgICAgICAgICByZXByZXNlbnRpbmcgdGhlIGNoYWluIG9mIGJpdHN0cmVhbSBmaWx0ZXJzCisgKgorICogQHJldHVybiA+PTAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGF2X2JzZl9saXN0X3BhcnNlX3N0cihjb25zdCBjaGFyICpzdHIsIEFWQlNGQ29udGV4dCAqKmJzZik7CisKKy8qKgorICogR2V0IG51bGwvcGFzcy10aHJvdWdoIGJpdHN0cmVhbSBmaWx0ZXIuCisgKgorICogQHBhcmFtW291dF0gYnNmIFBvaW50ZXIgdG8gYmUgc2V0IHRvIG5ldyBpbnN0YW5jZSBvZiBwYXNzLXRocm91Z2ggYml0c3RyZWFtIGZpbHRlcgorICoKKyAqIEByZXR1cm4KKyAqLworaW50IGF2X2JzZl9nZXRfbnVsbF9maWx0ZXIoQVZCU0ZDb250ZXh0ICoqYnNmKTsKIAogLyogbWVtb3J5ICovCiAKQEAgLTUyNTksNTEgKzYwMTcsMzIgQEAKICAqLwogdW5zaWduZWQgaW50IGF2X3hpcGhsYWNpbmcodW5zaWduZWQgY2hhciAqcywgdW5zaWduZWQgaW50IHYpOwogCi0jaWYgRkZfQVBJX01JU1NJTkdfU0FNUExFCi0vKioKLSAqIExvZyBhIGdlbmVyaWMgd2FybmluZyBtZXNzYWdlIGFib3V0IGEgbWlzc2luZyBmZWF0dXJlLiBUaGlzIGZ1bmN0aW9uIGlzCi0gKiBpbnRlbmRlZCB0byBiZSB1c2VkIGludGVybmFsbHkgYnkgRkZtcGVnIChsaWJhdmNvZGVjLCBsaWJhdmZvcm1hdCwgZXRjLikKLSAqIG9ubHksIGFuZCB3b3VsZCBub3JtYWxseSBub3QgYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuCi0gKiBAcGFyYW1baW5dIGF2YyBhIHBvaW50ZXIgdG8gYW4gYXJiaXRyYXJ5IHN0cnVjdCBvZiB3aGljaCB0aGUgZmlyc3QgZmllbGQgaXMKLSAqIGEgcG9pbnRlciB0byBhbiBBVkNsYXNzIHN0cnVjdAotICogQHBhcmFtW2luXSBmZWF0dXJlIHN0cmluZyBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBtaXNzaW5nIGZlYXR1cmUKLSAqIEBwYXJhbVtpbl0gd2FudF9zYW1wbGUgaW5kaWNhdGVzIGlmIHNhbXBsZXMgYXJlIHdhbnRlZCB3aGljaCBleGhpYml0IHRoaXMgZmVhdHVyZS4KLSAqIElmIHdhbnRfc2FtcGxlIGlzIG5vbi16ZXJvLCBhZGRpdGlvbmFsIHZlcmJhZ2Ugd2lsbCBiZSBhZGRlZCB0byB0aGUgbG9nCi0gKiBtZXNzYWdlIHdoaWNoIHRlbGxzIHRoZSB1c2VyIGhvdyB0byByZXBvcnQgc2FtcGxlcyB0byB0aGUgZGV2ZWxvcG1lbnQKLSAqIG1haWxpbmcgbGlzdC4KLSAqIEBkZXByZWNhdGVkIFVzZSBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZSgpIGluc3RlYWQuCi0gKi8KLWF0dHJpYnV0ZV9kZXByZWNhdGVkCi12b2lkIGF2X2xvZ19taXNzaW5nX2ZlYXR1cmUodm9pZCAqYXZjLCBjb25zdCBjaGFyICpmZWF0dXJlLCBpbnQgd2FudF9zYW1wbGUpOwotCi0vKioKLSAqIExvZyBhIGdlbmVyaWMgd2FybmluZyBtZXNzYWdlIGFza2luZyBmb3IgYSBzYW1wbGUuIFRoaXMgZnVuY3Rpb24gaXMKLSAqIGludGVuZGVkIHRvIGJlIHVzZWQgaW50ZXJuYWxseSBieSBGRm1wZWcgKGxpYmF2Y29kZWMsIGxpYmF2Zm9ybWF0LCBldGMuKQotICogb25seSwgYW5kIHdvdWxkIG5vcm1hbGx5IG5vdCBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4KLSAqIEBwYXJhbVtpbl0gYXZjIGEgcG9pbnRlciB0byBhbiBhcmJpdHJhcnkgc3RydWN0IG9mIHdoaWNoIHRoZSBmaXJzdCBmaWVsZCBpcwotICogYSBwb2ludGVyIHRvIGFuIEFWQ2xhc3Mgc3RydWN0Ci0gKiBAcGFyYW1baW5dIG1zZyBzdHJpbmcgY29udGFpbmluZyBhbiBvcHRpb25hbCBtZXNzYWdlLCBvciBOVUxMIGlmIG5vIG1lc3NhZ2UKLSAqIEBkZXByZWNhdGVkIFVzZSBhdnByaXZfcmVxdWVzdF9zYW1wbGUoKSBpbnN0ZWFkLgotICovCi1hdHRyaWJ1dGVfZGVwcmVjYXRlZAotdm9pZCBhdl9sb2dfYXNrX2Zvcl9zYW1wbGUodm9pZCAqYXZjLCBjb25zdCBjaGFyICptc2csIC4uLikgYXZfcHJpbnRmX2Zvcm1hdCgyLCAzKTsKLSNlbmRpZiAvKiBGRl9BUElfTUlTU0lOR19TQU1QTEUgKi8KLQorI2lmIEZGX0FQSV9VU0VSX1ZJU0lCTEVfQVZIV0FDQ0VMCiAvKioKICAqIFJlZ2lzdGVyIHRoZSBoYXJkd2FyZSBhY2NlbGVyYXRvciBod2FjY2VsLgorICoKKyAqIEBkZXByZWNhdGVkICBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgZG8gYW55dGhpbmcuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiB2b2lkIGF2X3JlZ2lzdGVyX2h3YWNjZWwoQVZIV0FjY2VsICpod2FjY2VsKTsKIAogLyoqCiAgKiBJZiBod2FjY2VsIGlzIE5VTEwsIHJldHVybnMgdGhlIGZpcnN0IHJlZ2lzdGVyZWQgaGFyZHdhcmUgYWNjZWxlcmF0b3IsCiAgKiBpZiBod2FjY2VsIGlzIG5vbi1OVUxMLCByZXR1cm5zIHRoZSBuZXh0IHJlZ2lzdGVyZWQgaGFyZHdhcmUgYWNjZWxlcmF0b3IKICAqIGFmdGVyIGh3YWNjZWwsIG9yIE5VTEwgaWYgaHdhY2NlbCBpcyB0aGUgbGFzdCBvbmUuCisgKgorICogQGRlcHJlY2F0ZWQgIEFWSFdhY2NlbCBzdHJ1Y3R1cmVzIGNvbnRhaW4gbm8gdXNlci1zZXJ2aWNlYWJsZSBwYXJ0cywgc28KKyAqICAgICAgICAgICAgICB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZC4KICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIEFWSFdBY2NlbCAqYXZfaHdhY2NlbF9uZXh0KGNvbnN0IEFWSFdBY2NlbCAqaHdhY2NlbCk7CisjZW5kaWYKIAotCisjaWYgRkZfQVBJX0xPQ0tNR1IKIC8qKgogICogTG9jayBvcGVyYXRpb24gdXNlZCBieSBsb2NrbWdyCisgKgorICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCB0b2dldGhlciB3aXRoIGF2X2xvY2ttZ3JfcmVnaXN0ZXIoKS4KICAqLwogZW51bSBBVkxvY2tPcCB7CiAgIEFWX0xPQ0tfQ1JFQVRFLCAgLy8vPCBDcmVhdGUgYSBtdXRleApAQCAtNTMzNCw4ICs2MDczLDEzIEBACiAgKiAgICAgICAgICAgbWVjaGFuaXNtIChpLmUuIGRvIG5vdCB1c2UgYSBzaW5nbGUgc3RhdGljIG9iamVjdCB0bwogICogICAgICAgICAgIGltcGxlbWVudCB5b3VyIGxvY2sgbWFuYWdlcikuIElmIGNiIGlzIHNldCB0byBOVUxMIHRoZQogICogICAgICAgICAgIGxvY2ttZ3Igd2lsbCBiZSB1bnJlZ2lzdGVyZWQuCisgKgorICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcsIGFuZCBhbHdheXMgcmV0dXJucyAwLiBCZSBzdXJlIHRvCisgKiAgICAgICAgICAgICBidWlsZCB3aXRoIHRocmVhZCBzdXBwb3J0IHRvIGdldCBiYXNpYyB0aHJlYWQgc2FmZXR5LgogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2X2xvY2ttZ3JfcmVnaXN0ZXIoaW50ICgqY2IpKHZvaWQgKiptdXRleCwgZW51bSBBVkxvY2tPcCBvcCkpOworI2VuZGlmCiAKIC8qKgogICogR2V0IHRoZSB0eXBlIG9mIHRoZSBnaXZlbiBjb2RlYy4KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXZkY3QuYyBiL2xpYmF2Y29kZWMvYXZkY3QuYwppbmRleCA4MGFjYTg4Li40N2U1ZjcxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2F2ZGN0LmMKKysrIGIvbGliYXZjb2RlYy9hdmRjdC5jCkBAIC00OCwxOSArNDgsMTAgQEAKIHsic2ltcGxlbW14IiwgImV4cGVyaW1lbnRhbCAvIGZvciBkZWJ1Z2dpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NJTVBMRU1NWCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKIHsiYXJtIiwgImV4cGVyaW1lbnRhbCAvIGZvciBkZWJ1Z2dpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX0FSTSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKIHsiYWx0aXZlYyIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9BTFRJVkVDIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAotI2lmIEZGX0FQSV9BUkNIX1NINAoteyJzaDQiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0g0IH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAotI2VuZGlmCiB7InNpbXBsZWFybSIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVBUk0gfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCiB7InNpbXBsZWFybXY1dGUiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFQVJNVjVURSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKIHsic2ltcGxlYXJtdjYiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFQVJNVjYgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCiB7InNpbXBsZW5lb24iLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFTkVPTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKLSNpZiBGRl9BUElfQVJDSF9BTFBIQQoteyJzaW1wbGVhbHBoYSIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVBTFBIQSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKLSNlbmRpZgotI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUwoteyJpcHAiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfSVBQIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAotI2VuZGlmCiB7Inh2aWQiLCAiZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfWFZJRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKIHsieHZpZG1teCIsICJleHBlcmltZW50YWwgLyBmb3IgZGVidWdnaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9YVklEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAogeyJmYWFuaSIsICJmbG9hdGluZyBwb2ludCBBQU4gSURDVCAoZXhwZXJpbWVudGFsIC8gZm9yIGRlYnVnZ2luZykiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX0ZBQU4gfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfEUsICJpZGN0In0sCkBAIC0xMzIsOCArMTIzLDcgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIGF2Y29kZWNfY2xvc2UoYXZjdHgpOwotICAgIGF2X2ZyZWUoYXZjdHgpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdmN0eCk7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXZmZnQuYyBiL2xpYmF2Y29kZWMvYXZmZnQuYwppbmRleCA2NzVkMmI5Li4yMjAwZjM3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2F2ZmZ0LmMKKysrIGIvbGliYXZjb2RlYy9hdmZmdC5jCkBAIC0xNDIsMzggKzE0Miw0IEBACiAgICAgfQogfQogCi0jaWZkZWYgVEVTVAotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBpOwotI2RlZmluZSBMRU4gMTAyNAotICAgIEZGVFNhbXBsZSAqcmVmICA9IGF2X21hbGxvY19hcnJheShMRU4sIHNpemVvZigqcmVmKSk7Ci0gICAgRkZUU2FtcGxlICpkYXRhID0gYXZfbWFsbG9jX2FycmF5KExFTiwgc2l6ZW9mKCpkYXRhKSk7Ci0gICAgUkRGVENvbnRleHQgKnJkZnRfY29udGV4dCAgPSBhdl9yZGZ0X2luaXQoMTAsIERGVF9SMkMpOwotICAgIFJERlRDb250ZXh0ICppcmRmdF9jb250ZXh0ID0gYXZfcmRmdF9pbml0KDEwLCBJREZUX0MyUik7Ci0KLSAgICBpZiAoIXJlZiB8fCAhZGF0YSB8fCAhcmRmdF9jb250ZXh0IHx8ICFpcmRmdF9jb250ZXh0KQotICAgICAgICByZXR1cm4gMjsKLSAgICBmb3IgKGk9MDsgaTxMRU47IGkrKykgewotICAgICAgICByZWZbaV0gPSBkYXRhW2ldID0gaSo0NTYgKyAxMjMgKyBpKmk7Ci0gICAgfQotICAgIGF2X3JkZnRfY2FsYyhyZGZ0X2NvbnRleHQsIGRhdGEpOwotICAgIGF2X3JkZnRfY2FsYyhpcmRmdF9jb250ZXh0LCBkYXRhKTsKLQotICAgIGZvciAoaT0wOyBpPExFTjsgaSsrKSB7Ci0gICAgICAgIGlmIChmYWJzKHJlZltpXSAtIGRhdGFbaV0vTEVOKjIpID4gMSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgYXQgJWQgKCVmICVmKVxuIiwgaSwgcmVmW2ldLCBkYXRhW2ldL0xFTioyKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXZfcmRmdF9lbmQocmRmdF9jb250ZXh0KTsKLSAgICBhdl9yZGZ0X2VuZChpcmRmdF9jb250ZXh0KTsKLSAgICBhdl9mcmVlKGRhdGEpOwotICAgIGF2X2ZyZWUocmVmKTsKLQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCi0KICNlbmRpZiAvKiBDT05GSUdfRENUICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2F2cGFja2V0LmMgYi9saWJhdmNvZGVjL2F2cGFja2V0LmMKaW5kZXggNDkwMWQzNi4uOTlhMGMxMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hdnBhY2tldC5jCisrKyBiL2xpYmF2Y29kZWMvYXZwYWNrZXQuYwpAQCAtMTEwLDI0ICsxMTAsMzkgQEAKIHsKICAgICBpbnQgbmV3X3NpemU7CiAgICAgYXZfYXNzZXJ0MCgodW5zaWduZWQpcGt0LT5zaXplIDw9IElOVF9NQVggLSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICBpZiAoIXBrdC0+c2l6ZSkKLSAgICAgICAgcmV0dXJuIGF2X25ld19wYWNrZXQocGt0LCBncm93X2J5KTsKICAgICBpZiAoKHVuc2lnbmVkKWdyb3dfYnkgPgogICAgICAgICBJTlRfTUFYIC0gKHBrdC0+c2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBuZXdfc2l6ZSA9IHBrdC0+c2l6ZSArIGdyb3dfYnkgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFOwogICAgIGlmIChwa3QtPmJ1ZikgewotICAgICAgICBpbnQgcmV0ID0gYXZfYnVmZmVyX3JlYWxsb2MoJnBrdC0+YnVmLCBuZXdfc2l6ZSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgc2l6ZV90IGRhdGFfb2Zmc2V0OworICAgICAgICB1aW50OF90ICpvbGRfZGF0YSA9IHBrdC0+ZGF0YTsKKyAgICAgICAgaWYgKHBrdC0+ZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICBkYXRhX29mZnNldCA9IDA7CisgICAgICAgICAgICBwa3QtPmRhdGEgPSBwa3QtPmJ1Zi0+ZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ID0gcGt0LT5kYXRhIC0gcGt0LT5idWYtPmRhdGE7CisgICAgICAgICAgICBpZiAoZGF0YV9vZmZzZXQgPiBJTlRfTUFYIC0gbmV3X3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5ld19zaXplICsgZGF0YV9vZmZzZXQgPiBwa3QtPmJ1Zi0+c2l6ZSkgeworICAgICAgICAgICAgaW50IHJldCA9IGF2X2J1ZmZlcl9yZWFsbG9jKCZwa3QtPmJ1ZiwgbmV3X3NpemUgKyBkYXRhX29mZnNldCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHBrdC0+ZGF0YSA9IG9sZF9kYXRhOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa3QtPmRhdGEgPSBwa3QtPmJ1Zi0+ZGF0YSArIGRhdGFfb2Zmc2V0OworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcGt0LT5idWYgPSBhdl9idWZmZXJfYWxsb2MobmV3X3NpemUpOwogICAgICAgICBpZiAoIXBrdC0+YnVmKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgbWVtY3B5KHBrdC0+YnVmLT5kYXRhLCBwa3QtPmRhdGEsIEZGTUlOKHBrdC0+c2l6ZSwgcGt0LT5zaXplICsgZ3Jvd19ieSkpOworICAgICAgICBpZiAocGt0LT5zaXplID4gMCkKKyAgICAgICAgICAgIG1lbWNweShwa3QtPmJ1Zi0+ZGF0YSwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICBwa3QtPmRhdGEgPSBwa3QtPmJ1Zi0+ZGF0YTsKICAgICB9Ci0gICAgcGt0LT5kYXRhICA9IHBrdC0+YnVmLT5kYXRhOwogICAgIHBrdC0+c2l6ZSArPSBncm93X2J5OwogICAgIG1lbXNldChwa3QtPmRhdGEgKyBwa3QtPnNpemUsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogCkBAIC0xODQsNiArMTk5LDcgQEAKIHsKICAgICBwa3QtPmRhdGEgICAgICA9IE5VTEw7CiAgICAgcGt0LT5zaWRlX2RhdGEgPSBOVUxMOworICAgIHBrdC0+c2lkZV9kYXRhX2VsZW1zID0gMDsKICAgICBpZiAocGt0LT5idWYpIHsKICAgICAgICAgQVZCdWZmZXJSZWYgKnJlZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5idWYpOwogICAgICAgICBpZiAoIXJlZikKQEAgLTE5Myw5ICsyMDksMTEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBEVVBfREFUQShwa3QtPmRhdGEsIHNyYy0+ZGF0YSwgcGt0LT5zaXplLCAxLCBBTExPQ19CVUYpOwogICAgIH0KLSAgICBpZiAocGt0LT5zaWRlX2RhdGFfZWxlbXMgJiYgZHVwKQorICAgIGlmIChzcmMtPnNpZGVfZGF0YV9lbGVtcyAmJiBkdXApIHsKICAgICAgICAgcGt0LT5zaWRlX2RhdGEgPSBzcmMtPnNpZGVfZGF0YTsKLSAgICBpZiAocGt0LT5zaWRlX2RhdGFfZWxlbXMgJiYgIWR1cCkgeworICAgICAgICBwa3QtPnNpZGVfZGF0YV9lbGVtcyA9IHNyYy0+c2lkZV9kYXRhX2VsZW1zOworICAgIH0KKyAgICBpZiAoc3JjLT5zaWRlX2RhdGFfZWxlbXMgJiYgIWR1cCkgewogICAgICAgICByZXR1cm4gYXZfY29weV9wYWNrZXRfc2lkZV9kYXRhKHBrdCwgc3JjKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0yMjksOCArMjQ3LDYgQEAKICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogfQotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKIAogaW50IGF2X2R1cF9wYWNrZXQoQVZQYWNrZXQgKnBrdCkKIHsKQEAgLTI0OCw2ICsyNjQsOCBAQAogICAgICpkc3QgPSAqc3JjOwogICAgIHJldHVybiBjb3B5X3BhY2tldF9kYXRhKGRzdCwgc3JjLCAwKTsKIH0KK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCiAKIHZvaWQgYXZfcGFja2V0X2ZyZWVfc2lkZV9kYXRhKEFWUGFja2V0ICpwa3QpCiB7CkBAIC0yNzcsMTYgKzI5NSwyOCBAQAogaW50IGF2X3BhY2tldF9hZGRfc2lkZV9kYXRhKEFWUGFja2V0ICpwa3QsIGVudW0gQVZQYWNrZXRTaWRlRGF0YVR5cGUgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkKIHsKLSAgICBpbnQgZWxlbXMgPSBwa3QtPnNpZGVfZGF0YV9lbGVtczsKKyAgICBBVlBhY2tldFNpZGVEYXRhICp0bXA7CisgICAgaW50IGksIGVsZW1zID0gcGt0LT5zaWRlX2RhdGFfZWxlbXM7CiAKLSAgICBpZiAoKHVuc2lnbmVkKWVsZW1zICsgMSA+IElOVF9NQVggLyBzaXplb2YoKnBrdC0+c2lkZV9kYXRhKSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbXM7IGkrKykgeworICAgICAgICBBVlBhY2tldFNpZGVEYXRhICpzZCA9ICZwa3QtPnNpZGVfZGF0YVtpXTsKKworICAgICAgICBpZiAoc2QtPnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgYXZfZnJlZShzZC0+ZGF0YSk7CisgICAgICAgICAgICBzZC0+ZGF0YSA9IGRhdGE7CisgICAgICAgICAgICBzZC0+c2l6ZSA9IHNpemU7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgodW5zaWduZWQpZWxlbXMgKyAxID4gQVZfUEtUX0RBVEFfTkIpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVSQU5HRSk7CiAKLSAgICBwa3QtPnNpZGVfZGF0YSA9IGF2X3JlYWxsb2MocGt0LT5zaWRlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbGVtcyArIDEpICogc2l6ZW9mKCpwa3QtPnNpZGVfZGF0YSkpOwotICAgIGlmICghcGt0LT5zaWRlX2RhdGEpCisgICAgdG1wID0gYXZfcmVhbGxvYyhwa3QtPnNpZGVfZGF0YSwgKGVsZW1zICsgMSkgKiBzaXplb2YoKnRtcCkpOworICAgIGlmICghdG1wKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCisgICAgcGt0LT5zaWRlX2RhdGEgPSB0bXA7CiAgICAgcGt0LT5zaWRlX2RhdGFbZWxlbXNdLmRhdGEgPSBkYXRhOwogICAgIHBrdC0+c2lkZV9kYXRhW2VsZW1zXS5zaXplID0gc2l6ZTsKICAgICBwa3QtPnNpZGVfZGF0YVtlbGVtc10udHlwZSA9IHR5cGU7CkBAIC0zMTcsNyArMzQ3LDcgQEAKICAgICByZXR1cm4gZGF0YTsKIH0KIAotdWludDhfdCAqYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoQVZQYWNrZXQgKnBrdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAordWludDhfdCAqYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoY29uc3QgQVZQYWNrZXQgKnBrdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplKQogewogICAgIGludCBpOwpAQCAtMzI5LDMyICszNTksNDEgQEAKICAgICAgICAgICAgIHJldHVybiBwa3QtPnNpZGVfZGF0YVtpXS5kYXRhOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChzaXplKQorICAgICAgICAqc2l6ZSA9IDA7CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKIGNvbnN0IGNoYXIgKmF2X3BhY2tldF9zaWRlX2RhdGFfbmFtZShlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGUpCiB7CiAgICAgc3dpdGNoKHR5cGUpIHsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX1BBTEVUVEU6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiUGFsZXR0ZSI7Ci0gICAgY2FzZSBBVl9QS1RfREFUQV9ORVdfRVhUUkFEQVRBOiAgICAgICAgICAgICByZXR1cm4gIk5ldyBFeHRyYWRhdGEiOwotICAgIGNhc2UgQVZfUEtUX0RBVEFfUEFSQU1fQ0hBTkdFOiAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbSBDaGFuZ2UiOwotICAgIGNhc2UgQVZfUEtUX0RBVEFfSDI2M19NQl9JTkZPOiAgICAgICAgICAgICAgcmV0dXJuICJIMjYzIE1CIEluZm8iOwotICAgIGNhc2UgQVZfUEtUX0RBVEFfUkVQTEFZR0FJTjogICAgICAgICAgICAgICAgcmV0dXJuICJSZXBsYXkgR2FpbiI7Ci0gICAgY2FzZSBBVl9QS1RfREFUQV9ESVNQTEFZTUFUUklYOiAgICAgICAgICAgICByZXR1cm4gIkRpc3BsYXkgTWF0cml4IjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX1NURVJFTzNEOiAgICAgICAgICAgICAgICAgIHJldHVybiAiU3RlcmVvIDNEIjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX0FVRElPX1NFUlZJQ0VfVFlQRTogICAgICAgIHJldHVybiAiQXVkaW8gU2VydmljZSBUeXBlIjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUzogICAgICAgICAgICAgIHJldHVybiAiU2tpcCBTYW1wbGVzIjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX0pQX0RVQUxNT05POiAgICAgICAgICAgICAgIHJldHVybiAiSlAgRHVhbCBNb25vIjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX1NUUklOR1NfTUVUQURBVEE6ICAgICAgICAgIHJldHVybiAiU3RyaW5ncyBNZXRhZGF0YSI7Ci0gICAgY2FzZSBBVl9QS1RfREFUQV9TVUJUSVRMRV9QT1NJVElPTjogICAgICAgICByZXR1cm4gIlN1YnRpdGxlIFBvc2l0aW9uIjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX01BVFJPU0tBX0JMT0NLQURESVRJT05BTDogIHJldHVybiAiTWF0cm9za2EgQmxvY2tBZGRpdGlvbmFsIjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX1dFQlZUVF9JREVOVElGSUVSOiAgICAgICAgIHJldHVybiAiV2ViVlRUIElEIjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX1dFQlZUVF9TRVRUSU5HUzogICAgICAgICAgIHJldHVybiAiV2ViVlRUIFNldHRpbmdzIjsKLSAgICBjYXNlIEFWX1BLVF9EQVRBX01FVEFEQVRBX1VQREFURTogICAgICAgICAgIHJldHVybiAiTWV0YWRhdGEgVXBkYXRlIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX1BBTEVUVEU6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlBhbGV0dGUiOworICAgIGNhc2UgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQTogICAgICAgICAgICAgIHJldHVybiAiTmV3IEV4dHJhZGF0YSI7CisgICAgY2FzZSBBVl9QS1RfREFUQV9QQVJBTV9DSEFOR0U6ICAgICAgICAgICAgICAgcmV0dXJuICJQYXJhbSBDaGFuZ2UiOworICAgIGNhc2UgQVZfUEtUX0RBVEFfSDI2M19NQl9JTkZPOiAgICAgICAgICAgICAgIHJldHVybiAiSDI2MyBNQiBJbmZvIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX1JFUExBWUdBSU46ICAgICAgICAgICAgICAgICByZXR1cm4gIlJlcGxheSBHYWluIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVg6ICAgICAgICAgICAgICByZXR1cm4gIkRpc3BsYXkgTWF0cml4IjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX1NURVJFTzNEOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIlN0ZXJlbyAzRCI7CisgICAgY2FzZSBBVl9QS1RfREFUQV9BVURJT19TRVJWSUNFX1RZUEU6ICAgICAgICAgcmV0dXJuICJBdWRpbyBTZXJ2aWNlIFR5cGUiOworICAgIGNhc2UgQVZfUEtUX0RBVEFfU0tJUF9TQU1QTEVTOiAgICAgICAgICAgICAgIHJldHVybiAiU2tpcCBTYW1wbGVzIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX0pQX0RVQUxNT05POiAgICAgICAgICAgICAgICByZXR1cm4gIkpQIER1YWwgTW9ubyI7CisgICAgY2FzZSBBVl9QS1RfREFUQV9TVFJJTkdTX01FVEFEQVRBOiAgICAgICAgICAgcmV0dXJuICJTdHJpbmdzIE1ldGFkYXRhIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX1NVQlRJVExFX1BPU0lUSU9OOiAgICAgICAgICByZXR1cm4gIlN1YnRpdGxlIFBvc2l0aW9uIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX01BVFJPU0tBX0JMT0NLQURESVRJT05BTDogICByZXR1cm4gIk1hdHJvc2thIEJsb2NrQWRkaXRpb25hbCI7CisgICAgY2FzZSBBVl9QS1RfREFUQV9XRUJWVFRfSURFTlRJRklFUjogICAgICAgICAgcmV0dXJuICJXZWJWVFQgSUQiOworICAgIGNhc2UgQVZfUEtUX0RBVEFfV0VCVlRUX1NFVFRJTkdTOiAgICAgICAgICAgIHJldHVybiAiV2ViVlRUIFNldHRpbmdzIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX01FVEFEQVRBX1VQREFURTogICAgICAgICAgICByZXR1cm4gIk1ldGFkYXRhIFVwZGF0ZSI7CisgICAgY2FzZSBBVl9QS1RfREFUQV9NUEVHVFNfU1RSRUFNX0lEOiAgICAgICAgICAgcmV0dXJuICJNUEVHVFMgU3RyZWFtIElEIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX01BU1RFUklOR19ESVNQTEFZX01FVEFEQVRBOiByZXR1cm4gIk1hc3RlcmluZyBkaXNwbGF5IG1ldGFkYXRhIjsKKyAgICBjYXNlIEFWX1BLVF9EQVRBX0NPTlRFTlRfTElHSFRfTEVWRUw6ICAgICAgICByZXR1cm4gIkNvbnRlbnQgbGlnaHQgbGV2ZWwgbWV0YWRhdGEiOworICAgIGNhc2UgQVZfUEtUX0RBVEFfU1BIRVJJQ0FMOiAgICAgICAgICAgICAgICAgIHJldHVybiAiU3BoZXJpY2FsIE1hcHBpbmciOworICAgIGNhc2UgQVZfUEtUX0RBVEFfQTUzX0NDOiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiQTUzIENsb3NlZCBDYXB0aW9ucyI7CiAgICAgfQogICAgIHJldHVybiBOVUxMOwogfQogCisjaWYgRkZfQVBJX01FUkdFX1NEX0FQSQorCiAjZGVmaW5lIEZGX01FUkdFX01BUktFUiAweDhjNGQ5ZDEwOGUyNWU5ZmVVTEwKIAogaW50IGF2X3BhY2tldF9tZXJnZV9zaWRlX2RhdGEoQVZQYWNrZXQgKnBrdCl7CkBAIC00MDEsMTMgKzQ0MCwxOCBAQAogICAgICAgICBwID0gcGt0LT5kYXRhICsgcGt0LT5zaXplIC0gOCAtIDU7CiAgICAgICAgIGZvciAoaT0xOyA7IGkrKyl7CiAgICAgICAgICAgICBzaXplID0gQVZfUkIzMihwKTsKLSAgICAgICAgICAgIGlmIChzaXplPklOVF9NQVggfHwgcCAtIHBrdC0+ZGF0YSA8IHNpemUpCisgICAgICAgICAgICBpZiAoc2l6ZT5JTlRfTUFYIC0gNSB8fCBwIC0gcGt0LT5kYXRhIDwgc2l6ZSkKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIGlmIChwWzRdJjEyOCkKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChwIC0gcGt0LT5kYXRhIDwgc2l6ZSArIDUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICBwLT0gc2l6ZSs1OwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGkgPiBBVl9QS1RfREFUQV9OQikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVSQU5HRSk7CisKICAgICAgICAgcGt0LT5zaWRlX2RhdGEgPSBhdl9tYWxsb2NfYXJyYXkoaSwgc2l6ZW9mKCpwa3QtPnNpZGVfZGF0YSkpOwogICAgICAgICBpZiAoIXBrdC0+c2lkZV9kYXRhKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTQxNSw3ICs0NTksNyBAQAogICAgICAgICBwPSBwa3QtPmRhdGEgKyBwa3QtPnNpemUgLSA4IC0gNTsKICAgICAgICAgZm9yIChpPTA7IDsgaSsrKXsKICAgICAgICAgICAgIHNpemU9IEFWX1JCMzIocCk7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKHNpemU8PUlOVF9NQVggJiYgcCAtIHBrdC0+ZGF0YSA+PSBzaXplKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoc2l6ZTw9SU5UX01BWCAtIDUgJiYgcCAtIHBrdC0+ZGF0YSA+PSBzaXplKTsKICAgICAgICAgICAgIHBrdC0+c2lkZV9kYXRhW2ldLmRhdGEgPSBhdl9tYWxsb2N6KHNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKICAgICAgICAgICAgIHBrdC0+c2lkZV9kYXRhW2ldLnNpemUgPSBzaXplOwogICAgICAgICAgICAgcGt0LT5zaWRlX2RhdGFbaV0udHlwZSA9IHBbNF0mMTI3OwpAQCAtNDMzLDYgKzQ3Nyw3IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQorI2VuZGlmCiAKIHVpbnQ4X3QgKmF2X3BhY2tldF9wYWNrX2RpY3Rpb25hcnkoQVZEaWN0aW9uYXJ5ICpkaWN0LCBpbnQgKnNpemUpCiB7CkBAIC00ODIsNyArNTI3LDcgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5ID0gZGF0YTsKICAgICAgICAgY29uc3QgdWludDhfdCAqdmFsID0gZGF0YSArIHN0cmxlbihrZXkpICsgMTsKIAotICAgICAgICBpZiAodmFsID49IGVuZCkKKyAgICAgICAgaWYgKHZhbCA+PSBlbmQgfHwgISprZXkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgICAgICByZXQgPSBhdl9kaWN0X3NldChkaWN0LCBrZXksIHZhbCwgMCk7CkBAIC01MjYsNiArNTcxLDggQEAKICAgICBkc3QtPmZsYWdzICAgICAgICAgICAgICAgID0gc3JjLT5mbGFnczsKICAgICBkc3QtPnN0cmVhbV9pbmRleCAgICAgICAgID0gc3JjLT5zdHJlYW1faW5kZXg7CiAKKyAgICBkc3QtPnNpZGVfZGF0YSAgICAgICAgICAgID0gTlVMTDsKKyAgICBkc3QtPnNpZGVfZGF0YV9lbGVtcyAgICAgID0gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjLT5zaWRlX2RhdGFfZWxlbXM7IGkrKykgewogICAgICAgICAgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlID0gc3JjLT5zaWRlX2RhdGFbaV0udHlwZTsKICAgICAgICAgIGludCBzaXplICAgICAgICAgID0gc3JjLT5zaWRlX2RhdGFbaV0uc2l6ZTsKQEAgLTU2MywyNCArNjEwLDI4IEBACiAgICAgICAgIHJldCA9IHBhY2tldF9hbGxvYygmZHN0LT5idWYsIHNyYy0+c2l6ZSk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBtZW1jcHkoZHN0LT5idWYtPmRhdGEsIHNyYy0+ZGF0YSwgc3JjLT5zaXplKTsKKyAgICAgICAgaWYgKHNyYy0+c2l6ZSkKKyAgICAgICAgICAgIG1lbWNweShkc3QtPmJ1Zi0+ZGF0YSwgc3JjLT5kYXRhLCBzcmMtPnNpemUpOworCisgICAgICAgIGRzdC0+ZGF0YSA9IGRzdC0+YnVmLT5kYXRhOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRzdC0+YnVmID0gYXZfYnVmZmVyX3JlZihzcmMtPmJ1Zik7CiAgICAgICAgIGlmICghZHN0LT5idWYpIHsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQorICAgICAgICBkc3QtPmRhdGEgPSBzcmMtPmRhdGE7CiAgICAgfQogCiAgICAgZHN0LT5zaXplID0gc3JjLT5zaXplOwotICAgIGRzdC0+ZGF0YSA9IGRzdC0+YnVmLT5kYXRhOworCiAgICAgcmV0dXJuIDA7CiBmYWlsOgogICAgIGF2X3BhY2tldF9mcmVlX3NpZGVfZGF0YShkc3QpOwogICAgIHJldHVybiByZXQ7CiB9CiAKLUFWUGFja2V0ICphdl9wYWNrZXRfY2xvbmUoQVZQYWNrZXQgKnNyYykKK0FWUGFja2V0ICphdl9wYWNrZXRfY2xvbmUoY29uc3QgQVZQYWNrZXQgKnNyYykKIHsKICAgICBBVlBhY2tldCAqcmV0ID0gYXZfcGFja2V0X2FsbG9jKCk7CiAKQEAgLTU5Nyw2ICs2NDgsNDcgQEAKIHsKICAgICAqZHN0ID0gKnNyYzsKICAgICBhdl9pbml0X3BhY2tldChzcmMpOworICAgIHNyYy0+ZGF0YSA9IE5VTEw7CisgICAgc3JjLT5zaXplID0gMDsKK30KKworaW50IGF2X3BhY2tldF9tYWtlX3JlZmNvdW50ZWQoQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHBrdC0+YnVmKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldCA9IHBhY2tldF9hbGxvYygmcGt0LT5idWYsIHBrdC0+c2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHBrdC0+c2l6ZSkKKyAgICAgICAgbWVtY3B5KHBrdC0+YnVmLT5kYXRhLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisKKyAgICBwa3QtPmRhdGEgPSBwa3QtPmJ1Zi0+ZGF0YTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfcGFja2V0X21ha2Vfd3JpdGFibGUoQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkJ1ZmZlclJlZiAqYnVmID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHBrdC0+YnVmICYmIGF2X2J1ZmZlcl9pc193cml0YWJsZShwa3QtPmJ1ZikpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0ID0gcGFja2V0X2FsbG9jKCZidWYsIHBrdC0+c2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHBrdC0+c2l6ZSkKKyAgICAgICAgbWVtY3B5KGJ1Zi0+ZGF0YSwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZwa3QtPmJ1Zik7CisgICAgcGt0LT5idWYgID0gYnVmOworICAgIHBrdC0+ZGF0YSA9IGJ1Zi0+ZGF0YTsKKworICAgIHJldHVybiAwOwogfQogCiB2b2lkIGF2X3BhY2tldF9yZXNjYWxlX3RzKEFWUGFja2V0ICpwa3QsIEFWUmF0aW9uYWwgc3JjX3RiLCBBVlJhdGlvbmFsIGRzdF90YikKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYXZybmRlYy5jIGIvbGliYXZjb2RlYy9hdnJuZGVjLmMKaW5kZXggNjk1YzQ5MS4uMTA0ZmYyZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hdnJuZGVjLmMKKysrIGIvbGliYXZjb2RlYy9hdnJuZGVjLmMKQEAgLTI4LDcgKzI4LDcgQEAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBBVkNvZGVjQ29udGV4dCAqbWpwZWdfYXZjdHg7CiAgICAgaW50IGlzX21qcGVnOwotICAgIGludCBpbnRlcmxhY2U7IC8vRklYTUUgdXNlIGZyYW1lLmludGVybGFjZWRfZnJhbWUKKyAgICBpbnQgaW50ZXJsYWNlOwogICAgIGludCB0ZmY7CiB9IEFWUm5Db250ZXh0OwogCkBAIC0xNjgsNiArMTY4LDYgQEAKICAgICAuaW5pdCAgICAgICAgICAgPSBpbml0LAogICAgIC5jbG9zZSAgICAgICAgICA9IGVuZCwKICAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKICAgICAubWF4X2xvd3JlcyAgICAgPSAzLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9hdnMuYyBiL2xpYmF2Y29kZWMvYXZzLmMKaW5kZXggMzQ1ZDYyOC4uNjY3MjRkNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9hdnMuYworKysgYi9saWJhdmNvZGVjL2F2cy5jCkBAIC0xODYsNCArMTg2LDUgQEAKICAgICAuZGVjb2RlICAgICAgICAgPSBhdnNfZGVjb2RlX2ZyYW1lLAogICAgIC5jbG9zZSAgICAgICAgICA9IGF2c19kZWNvZGVfZW5kLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2F2dWlkZWMuYyBiL2xpYmF2Y29kZWMvYXZ1aWRlYy5jCmluZGV4IDUxMTc4NDQuLjRjZjYyMGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYXZ1aWRlYy5jCisrKyBiL2xpYmF2Y29kZWMvYXZ1aWRlYy5jCkBAIC0xMjcsNCArMTI3LDUgQEAKICAgICAuaW5pdCAgICAgICAgID0gYXZ1aV9kZWNvZGVfaW5pdCwKICAgICAuZGVjb2RlICAgICAgID0gYXZ1aV9kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2JldGhzb2Z0dmlkZW8uYyBiL2xpYmF2Y29kZWMvYmV0aHNvZnR2aWRlby5jCmluZGV4IDk3Yjc0NWQuLmU1YTczZjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYmV0aHNvZnR2aWRlby5jCisrKyBiL2xpYmF2Y29kZWMvYmV0aHNvZnR2aWRlby5jCkBAIC0xMDksNiArMTA5LDExIEBACiAgICAgICAgICAgICBpZih5b2Zmc2V0ID49IGF2Y3R4LT5oZWlnaHQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBkc3QgKz0gdmlkLT5mcmFtZS0+bGluZXNpemVbMF0gKiB5b2Zmc2V0OworICAgICAgICBjYXNlIFZJREVPX1BfRlJBTUU6CisgICAgICAgIGNhc2UgVklERU9fSV9GUkFNRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgLy8gbWFpbiBjb2RlCkBAIC0xNjMsNCArMTY4LDUgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBiZXRoc29mdHZpZF9kZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICA9IGJldGhzb2Z0dmlkX2RlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9iZmkuYyBiL2xpYmF2Y29kZWMvYmZpLmMKaW5kZXggNjcyNzYyOS4uMjMzYTFkMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9iZmkuYworKysgYi9saWJhdmNvZGVjL2JmaS5jCkBAIC0xODUsNCArMTg1LDUgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBiZmlfZGVjb2RlX2Nsb3NlLAogICAgIC5kZWNvZGUgICAgICAgICA9IGJmaV9kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYmluay5jIGIvbGliYXZjb2RlYy9iaW5rLmMKaW5kZXggMTMxZWFhMS4uYzRjZjYxNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9iaW5rLmMKKysrIGIvbGliYXZjb2RlYy9iaW5rLmMKQEAgLTIzLDE3ICsyMywxNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJiaW5rZGF0YS5oIgogI2luY2x1ZGUgImJpbmtkc3AuaCIKICNpbmNsdWRlICJibG9ja2RzcC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaHBlbGRzcC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibWF0aG9wcy5oIgogCi0jZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKLSNpbmNsdWRlICJnZXRfYml0cy5oIgotCiAjZGVmaW5lIEJJTktfRkxBR19BTFBIQSAweDAwMTAwMDAwCiAjZGVmaW5lIEJJTktfRkxBR19HUkFZICAweDAwMDIwMDAwCiAKQEAgLTYwMSwxNyArNjAxLDE2IEBACiAgKiBAcGFyYW0gcXVhbnRfbWF0cmljZXMgcXVhbnRpemF0aW9uIG1hdHJpY2VzCiAgKiBAcmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG5lZ2F0aXZlIHZhbHVlIGluIG90aGVyIGNhc2VzCiAgKi8KLXN0YXRpYyBpbnQgcmVhZF9kY3RfY29lZmZzKEdldEJpdENvbnRleHQgKmdiLCBpbnQzMl90IGJsb2NrWzY0XSwgY29uc3QgdWludDhfdCAqc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgcXVhbnRfbWF0cmljZXNbMTZdWzY0XSwgaW50IHEpCitzdGF0aWMgaW50IHJlYWRfZGN0X2NvZWZmcyhHZXRCaXRDb250ZXh0ICpnYiwgaW50MzJfdCBibG9ja1s2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzY2FuLCBpbnQgKmNvZWZfY291bnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZWZfaWR4WzY0XSwgaW50IHEpCiB7CiAgICAgaW50IGNvZWZfbGlzdFsxMjhdOwogICAgIGludCBtb2RlX2xpc3RbMTI4XTsKICAgICBpbnQgaSwgdCwgYml0cywgY2NvZWYsIG1vZGUsIHNpZ247CiAgICAgaW50IGxpc3Rfc3RhcnQgPSA2NCwgbGlzdF9lbmQgPSA2NCwgbGlzdF9wb3M7CiAgICAgaW50IGNvZWZfY291bnQgPSAwOwotICAgIGludCBjb2VmX2lkeFs2NF07CiAgICAgaW50IHF1YW50X2lkeDsKLSAgICBjb25zdCBpbnQzMl90ICpxdWFudDsKIAogICAgIGNvZWZfbGlzdFtsaXN0X2VuZF0gPSA0OyAgbW9kZV9saXN0W2xpc3RfZW5kKytdID0gMDsKICAgICBjb2VmX2xpc3RbbGlzdF9lbmRdID0gMjQ7IG1vZGVfbGlzdFtsaXN0X2VuZCsrXSA9IDA7CkBAIC02OTAsMTUgKzY4OSwyMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcXVhbnQgPSBxdWFudF9tYXRyaWNlc1txdWFudF9pZHhdOworICAgICpjb2VmX2NvdW50XyA9IGNvZWZfY291bnQ7CiAKKyAgICByZXR1cm4gcXVhbnRfaWR4OworfQorCitzdGF0aWMgdm9pZCB1bnF1YW50aXplX2RjdF9jb2VmZnMoaW50MzJfdCBibG9ja1s2NF0sIGNvbnN0IGludDMyX3QgcXVhbnRbNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2VmX2NvdW50LCBpbnQgY29lZl9pZHhbNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW4pCit7CisgICAgaW50IGk7CiAgICAgYmxvY2tbMF0gPSAoYmxvY2tbMF0gKiBxdWFudFswXSkgPj4gMTE7CiAgICAgZm9yIChpID0gMDsgaSA8IGNvZWZfY291bnQ7IGkrKykgewogICAgICAgICBpbnQgaWR4ID0gY29lZl9pZHhbaV07CiAgICAgICAgIGJsb2NrW3NjYW5baWR4XV0gPSAoYmxvY2tbc2NhbltpZHhdXSAqIHF1YW50W2lkeF0pID4+IDExOwogICAgIH0KLQotICAgIHJldHVybiAwOwogfQogCiAvKioKQEAgLTgxMywxMSArODE4LDExIEBACiAgICAgaW50IHYsIGNvbFsyXTsKICAgICBjb25zdCB1aW50OF90ICpzY2FuOwogICAgIGludCB4b2ZmLCB5b2ZmOwotICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgYmxvY2ssIFs2NF0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MTZfdCwgYmxvY2ssIFs2NF0pOwogICAgIExPQ0FMX0FMSUdORURfMTYoaW50MzJfdCwgZGN0YmxvY2ssIFs2NF0pOwogICAgIGludCBjb29yZG1hcFs2NF07CiAgICAgaW50IHliaWFzID0gaXNfa2V5ID8gLTE1IDogMDsKLSAgICBpbnQgcXA7CisgICAgaW50IHFwLCBxdWFudF9pZHgsIGNvZWZfY291bnQsIGNvZWZfaWR4WzY0XTsKIAogICAgIGNvbnN0IGludCBzdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbcGxhbmVfaWR4XTsKICAgICBpbnQgYncgPSBpc19jaHJvbWEgPyAoYy0+YXZjdHgtPndpZHRoICArIDE1KSA+PiA0IDogKGMtPmF2Y3R4LT53aWR0aCAgKyA3KSA+PiAzOwpAQCAtODcyLDcgKzg3Nyw5IEBACiAgICAgICAgICAgICAgICAgbWVtc2V0KGRjdGJsb2NrLCAwLCBzaXplb2YoKmRjdGJsb2NrKSAqIDY0KTsKICAgICAgICAgICAgICAgICBkY3RibG9ja1swXSA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfSU5UUkFfREMpOwogICAgICAgICAgICAgICAgIHFwID0gYmlua2JfZ2V0X3ZhbHVlKGMsIEJJTktCX1NSQ19JTlRSQV9RKTsKLSAgICAgICAgICAgICAgICByZWFkX2RjdF9jb2VmZnMoZ2IsIGRjdGJsb2NrLCBiaW5rX3NjYW4sIChjb25zdCBpbnQzMl90ICgqKVs2NF0pYmlua2JfaW50cmFfcXVhbnQsIHFwKTsKKyAgICAgICAgICAgICAgICBpZiAoKHF1YW50X2lkeCA9IHJlYWRfZGN0X2NvZWZmcyhnYiwgZGN0YmxvY2ssIGJpbmtfc2NhbiwgJmNvZWZfY291bnQsIGNvZWZfaWR4LCBxcCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHF1YW50X2lkeDsKKyAgICAgICAgICAgICAgICB1bnF1YW50aXplX2RjdF9jb2VmZnMoZGN0YmxvY2ssIGJpbmtiX2ludHJhX3F1YW50W3F1YW50X2lkeF0sIGNvZWZfY291bnQsIGNvZWZfaWR4LCBiaW5rX3NjYW4pOwogICAgICAgICAgICAgICAgIGMtPmJpbmtkc3AuaWRjdF9wdXQoZHN0LCBzdHJpZGUsIGRjdGJsb2NrKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgMzoKQEAgLTkwNSw3ICs5MTIsOSBAQAogICAgICAgICAgICAgICAgIG1lbXNldChkY3RibG9jaywgMCwgc2l6ZW9mKCpkY3RibG9jaykgKiA2NCk7CiAgICAgICAgICAgICAgICAgZGN0YmxvY2tbMF0gPSBiaW5rYl9nZXRfdmFsdWUoYywgQklOS0JfU1JDX0lOVEVSX0RDKTsKICAgICAgICAgICAgICAgICBxcCA9IGJpbmtiX2dldF92YWx1ZShjLCBCSU5LQl9TUkNfSU5URVJfUSk7Ci0gICAgICAgICAgICAgICAgcmVhZF9kY3RfY29lZmZzKGdiLCBkY3RibG9jaywgYmlua19zY2FuLCAoY29uc3QgaW50MzJfdCAoKilbNjRdKWJpbmtiX2ludGVyX3F1YW50LCBxcCk7CisgICAgICAgICAgICAgICAgaWYgKChxdWFudF9pZHggPSByZWFkX2RjdF9jb2VmZnMoZ2IsIGRjdGJsb2NrLCBiaW5rX3NjYW4sICZjb2VmX2NvdW50LCBjb2VmX2lkeCwgcXApKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWFudF9pZHg7CisgICAgICAgICAgICAgICAgdW5xdWFudGl6ZV9kY3RfY29lZmZzKGRjdGJsb2NrLCBiaW5rYl9pbnRlcl9xdWFudFtxdWFudF9pZHhdLCBjb2VmX2NvdW50LCBjb2VmX2lkeCwgYmlua19zY2FuKTsKICAgICAgICAgICAgICAgICBjLT5iaW5rZHNwLmlkY3RfYWRkKGRzdCwgc3RyaWRlLCBkY3RibG9jayk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDU6CkBAIC05NzYsMTAgKzk4NSwxMCBAQAogICAgIHVpbnQ4X3QgKmRzdCwgKnByZXYsICpyZWZfc3RhcnQsICpyZWZfZW5kOwogICAgIGludCB2LCBjb2xbMl07CiAgICAgY29uc3QgdWludDhfdCAqc2NhbjsKLSAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGJsb2NrLCBbNjRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGJsb2NrLCBbNjRdKTsKICAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIHVibG9jaywgWzY0XSk7CiAgICAgTE9DQUxfQUxJR05FRF8xNihpbnQzMl90LCBkY3RibG9jaywgWzY0XSk7Ci0gICAgaW50IGNvb3JkbWFwWzY0XTsKKyAgICBpbnQgY29vcmRtYXBbNjRdLCBxdWFudF9pZHgsIGNvZWZfY291bnQsIGNvZWZfaWR4WzY0XTsKIAogICAgIGNvbnN0IGludCBzdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbcGxhbmVfaWR4XTsKICAgICBpbnQgYncgPSBpc19jaHJvbWEgPyAoYy0+YXZjdHgtPndpZHRoICArIDE1KSA+PiA0IDogKGMtPmF2Y3R4LT53aWR0aCAgKyA3KSA+PiAzOwpAQCAtMTA2NSw3ICsxMDc0LDkgQEAKICAgICAgICAgICAgICAgICBjYXNlIElOVFJBX0JMT0NLOgogICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZGN0YmxvY2ssIDAsIHNpemVvZigqZGN0YmxvY2spICogNjQpOwogICAgICAgICAgICAgICAgICAgICBkY3RibG9ja1swXSA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19JTlRSQV9EQyk7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRfZGN0X2NvZWZmcyhnYiwgZGN0YmxvY2ssIGJpbmtfc2NhbiwgYmlua19pbnRyYV9xdWFudCwgLTEpOworICAgICAgICAgICAgICAgICAgICBpZiAoKHF1YW50X2lkeCA9IHJlYWRfZGN0X2NvZWZmcyhnYiwgZGN0YmxvY2ssIGJpbmtfc2NhbiwgJmNvZWZfY291bnQsIGNvZWZfaWR4LCAtMSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWFudF9pZHg7CisgICAgICAgICAgICAgICAgICAgIHVucXVhbnRpemVfZGN0X2NvZWZmcyhkY3RibG9jaywgYmlua19pbnRyYV9xdWFudFtxdWFudF9pZHhdLCBjb2VmX2NvdW50LCBjb2VmX2lkeCwgYmlua19zY2FuKTsKICAgICAgICAgICAgICAgICAgICAgYy0+Ymlua2RzcC5pZGN0X3B1dCh1YmxvY2ssIDgsIGRjdGJsb2NrKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBGSUxMX0JMT0NLOgpAQCAtMTEzOCw3ICsxMTQ5LDkgQEAKICAgICAgICAgICAgIGNhc2UgSU5UUkFfQkxPQ0s6CiAgICAgICAgICAgICAgICAgbWVtc2V0KGRjdGJsb2NrLCAwLCBzaXplb2YoKmRjdGJsb2NrKSAqIDY0KTsKICAgICAgICAgICAgICAgICBkY3RibG9ja1swXSA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19JTlRSQV9EQyk7Ci0gICAgICAgICAgICAgICAgcmVhZF9kY3RfY29lZmZzKGdiLCBkY3RibG9jaywgYmlua19zY2FuLCBiaW5rX2ludHJhX3F1YW50LCAtMSk7CisgICAgICAgICAgICAgICAgaWYgKChxdWFudF9pZHggPSByZWFkX2RjdF9jb2VmZnMoZ2IsIGRjdGJsb2NrLCBiaW5rX3NjYW4sICZjb2VmX2NvdW50LCBjb2VmX2lkeCwgLTEpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWFudF9pZHg7CisgICAgICAgICAgICAgICAgdW5xdWFudGl6ZV9kY3RfY29lZmZzKGRjdGJsb2NrLCBiaW5rX2ludHJhX3F1YW50W3F1YW50X2lkeF0sIGNvZWZfY291bnQsIGNvZWZfaWR4LCBiaW5rX3NjYW4pOwogICAgICAgICAgICAgICAgIGMtPmJpbmtkc3AuaWRjdF9wdXQoZHN0LCBzdHJpZGUsIGRjdGJsb2NrKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRklMTF9CTE9DSzoKQEAgLTExNTIsNyArMTE2NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgbWVtc2V0KGRjdGJsb2NrLCAwLCBzaXplb2YoKmRjdGJsb2NrKSAqIDY0KTsKICAgICAgICAgICAgICAgICBkY3RibG9ja1swXSA9IGdldF92YWx1ZShjLCBCSU5LX1NSQ19JTlRFUl9EQyk7Ci0gICAgICAgICAgICAgICAgcmVhZF9kY3RfY29lZmZzKGdiLCBkY3RibG9jaywgYmlua19zY2FuLCBiaW5rX2ludGVyX3F1YW50LCAtMSk7CisgICAgICAgICAgICAgICAgaWYgKChxdWFudF9pZHggPSByZWFkX2RjdF9jb2VmZnMoZ2IsIGRjdGJsb2NrLCBiaW5rX3NjYW4sICZjb2VmX2NvdW50LCBjb2VmX2lkeCwgLTEpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBxdWFudF9pZHg7CisgICAgICAgICAgICAgICAgdW5xdWFudGl6ZV9kY3RfY29lZmZzKGRjdGJsb2NrLCBiaW5rX2ludGVyX3F1YW50W3F1YW50X2lkeF0sIGNvZWZfY291bnQsIGNvZWZfaWR4LCBiaW5rX3NjYW4pOwogICAgICAgICAgICAgICAgIGMtPmJpbmtkc3AuaWRjdF9hZGQoZHN0LCBzdHJpZGUsIGRjdGJsb2NrKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEFUVEVSTl9CTE9DSzoKQEAgLTEyNDAsNyArMTI1NSw3IEBACiB9CiAKIC8qKgotICogQ2FjbHVsYXRlIHF1YW50aXphdGlvbiB0YWJsZXMgZm9yIHZlcnNpb24gYgorICogQ2FsY3VsYXRlIHF1YW50aXphdGlvbiB0YWJsZXMgZm9yIHZlcnNpb24gYgogICovCiBzdGF0aWMgYXZfY29sZCB2b2lkIGJpbmtiX2NhbGNfcXVhbnQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYmlua2F1ZGlvLmMgYi9saWJhdmNvZGVjL2JpbmthdWRpby5jCmluZGV4IDVjYzIzMzEuLmUwZjNkMTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYmlua2F1ZGlvLmMKKysrIGIvbGliYXZjb2RlYy9iaW5rYXVkaW8uYwpAQCAtMjksMTUgKzI5LDE3IEBACiAgKi8KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQotI2luY2x1ZGUgImdldF9iaXRzLmgiCi0jaW5jbHVkZSAiZGN0LmgiCi0jaW5jbHVkZSAicmRmdC5oIgotI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAid21hX2ZyZXFzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCiAKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJkY3QuaCIKKyNpbmNsdWRlICJkZWNvZGUuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicmRmdC5oIgorI2luY2x1ZGUgIndtYV9mcmVxcy5oIgorCiBzdGF0aWMgZmxvYXQgcXVhbnRfdGFibGVbOTZdOwogCiAjZGVmaW5lIE1BWF9DSEFOTkVMUyAyCkBAIC01Niw3ICs1OCw3IEBACiAgICAgZmxvYXQgcm9vdDsKICAgICBERUNMQVJFX0FMSUdORUQoMzIsIEZGVFNhbXBsZSwgY29lZmZzKVtCSU5LX0JMT0NLX01BWF9TSVpFXTsKICAgICBmbG9hdCBwcmV2aW91c1tNQVhfQ0hBTk5FTFNdW0JJTktfQkxPQ0tfTUFYX1NJWkUgLyAxNl07ICAvLy88IGNvZWZmcyBmcm9tIHByZXZpb3VzIGF1ZGlvIGJsb2NrCi0gICAgdWludDhfdCAqcGFja2V0X2J1ZmZlcjsKKyAgICBBVlBhY2tldCAqcGt0OwogICAgIHVuaW9uIHsKICAgICAgICAgUkRGVENvbnRleHQgcmRmdDsKICAgICAgICAgRENUQ29udGV4dCBkY3Q7CkBAIC0xMzksNiArMTQxLDEwIEBACiAgICAgZWxzZQogICAgICAgICByZXR1cm4gLTE7CiAKKyAgICBzLT5wa3QgPSBhdl9wYWNrZXRfYWxsb2MoKTsKKyAgICBpZiAoIXMtPnBrdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNjgsMTIgKzI3NCwxMyBAQAogewogICAgIEJpbmtBdWRpb0NvbnRleHQgKiBzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBhdl9mcmVlcCgmcy0+YmFuZHMpOwotICAgIGF2X2ZyZWVwKCZzLT5wYWNrZXRfYnVmZmVyKTsKICAgICBpZiAoQ09ORklHX0JJTktBVURJT19SREZUX0RFQ09ERVIgJiYgYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fUkRGVCkKICAgICAgICAgZmZfcmRmdF9lbmQoJnMtPnRyYW5zLnJkZnQpOwogICAgIGVsc2UgaWYgKENPTkZJR19CSU5LQVVESU9fRENUX0RFQ09ERVIpCiAgICAgICAgIGZmX2RjdF9lbmQoJnMtPnRyYW5zLmRjdCk7CiAKKyAgICBhdl9wYWNrZXRfZnJlZSgmcy0+cGt0KTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0yODMsMzQgKzI5MCwyNiBAQAogICAgIGlmIChuKSBza2lwX2JpdHMocywgbik7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQorc3RhdGljIGludCBiaW5rYXVkaW9fcmVjZWl2ZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQogewogICAgIEJpbmtBdWRpb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRnJhbWUgKmZyYW1lICAgICAgPSBkYXRhOwogICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOwotICAgIGludCByZXQsIGNvbnN1bWVkID0gMDsKKyAgICBpbnQgcmV0OwogCi0gICAgaWYgKCFnZXRfYml0c19sZWZ0KGdiKSkgewotICAgICAgICB1aW50OF90ICpidWY7Ci0gICAgICAgIC8qIGhhbmRsZSBlbmQtb2Ytc3RyZWFtICovCi0gICAgICAgIGlmICghYXZwa3QtPnNpemUpIHsKLSAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhdnBrdC0+c2l6ZSA8IDQpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotICAgICAgICBidWYgPSBhdl9yZWFsbG9jKHMtPnBhY2tldF9idWZmZXIsIGF2cGt0LT5zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgIGlmICghYnVmKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgbWVtc2V0KGJ1ZiArIGF2cGt0LT5zaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgcy0+cGFja2V0X2J1ZmZlciA9IGJ1ZjsKLSAgICAgICAgbWVtY3B5KHMtPnBhY2tldF9idWZmZXIsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7Ci0gICAgICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoZ2IsIHMtPnBhY2tldF9idWZmZXIsIGF2cGt0LT5zaXplKSkgPCAwKQorICAgIGlmICghcy0+cGt0LT5kYXRhKSB7CisgICAgICAgIHJldCA9IGZmX2RlY29kZV9nZXRfcGFja2V0KGF2Y3R4LCBzLT5wa3QpOworICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGNvbnN1bWVkID0gYXZwa3QtPnNpemU7CisKKyAgICAgICAgaWYgKHMtPnBrdC0+c2l6ZSA8IDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoZ2IsIHMtPnBrdC0+ZGF0YSwgcy0+cGt0LT5zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CiAKICAgICAgICAgLyogc2tpcCByZXBvcnRlZCBzaXplICovCiAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCAzMik7CkBAIC0zMjcsMTEgKzMyNiwxNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAgICAgZ2V0X2JpdHNfYWxpZ24zMihnYik7CisgICAgaWYgKCFnZXRfYml0c19sZWZ0KGdiKSkgeworICAgICAgICBtZW1zZXQoZ2IsIDAsIHNpemVvZigqZ2IpKTsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKHMtPnBrdCk7CisgICAgfQogCiAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBzLT5ibG9ja19zaXplIC8gYXZjdHgtPmNoYW5uZWxzOwotICAgICpnb3RfZnJhbWVfcHRyICAgID0gMTsKIAotICAgIHJldHVybiBjb25zdW1lZDsKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfcGFja2V0X3VucmVmKHMtPnBrdCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogQVZDb2RlYyBmZl9iaW5rYXVkaW9fcmRmdF9kZWNvZGVyID0gewpAQCAtMzQyLDcgKzM0Nyw3IEBACiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEJpbmtBdWRpb0NvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAogICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCi0gICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5yZWNlaXZlX2ZyYW1lICA9IGJpbmthdWRpb19yZWNlaXZlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9EUjEsCiB9OwogCkBAIC0zNTQsNiArMzU5LDYgQEAKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQmlua0F1ZGlvQ29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCiAgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKLSAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLnJlY2VpdmVfZnJhbWUgID0gYmlua2F1ZGlvX3JlY2VpdmVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0RSMSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Jpbmtkc3AuaCBiL2xpYmF2Y29kZWMvYmlua2RzcC5oCmluZGV4IGYzMTlkMWYuLmIwODlhOTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYmlua2RzcC5oCisrKyBiL2xpYmF2Y29kZWMvYmlua2RzcC5oCkBAIC0yOSwxMSArMjksMTMgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSAiY29uZmlnLmgiCisKIHR5cGVkZWYgc3RydWN0IEJpbmtEU1BDb250ZXh0IHsKICAgICB2b2lkICgqaWRjdF9wdXQpKHVpbnQ4X3QgKmRlc3QvKmFsaWduIDgqLywgaW50IGxpbmVfc2l6ZSwgaW50MzJfdCAqYmxvY2svKmFsaWduIDE2Ki8pOwogICAgIHZvaWQgKCppZGN0X2FkZCkodWludDhfdCAqZGVzdC8qYWxpZ24gOCovLCBpbnQgbGluZV9zaXplLCBpbnQzMl90ICpibG9jay8qYWxpZ24gMTYqLyk7CiAgICAgdm9pZCAoKnNjYWxlX2Jsb2NrKShjb25zdCB1aW50OF90IHNyY1s2NF0vKmFsaWduIDgqLywgdWludDhfdCAqZHN0LyphbGlnbiA4Ki8sIGludCBsaW5lc2l6ZSk7Ci0gICAgdm9pZCAoKmFkZF9waXhlbHM4KSh1aW50OF90ICpwaXhlbHMsIGludDE2X3QgKmJsb2NrLCBpbnQgbGluZV9zaXplKTsKKyAgICB2b2lkICgqYWRkX3BpeGVsczgpKHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscywgaW50MTZfdCAqYmxvY2ssIGludCBsaW5lX3NpemUpOwogfSBCaW5rRFNQQ29udGV4dDsKIAogdm9pZCBmZl9iaW5rZHNwX2luaXQoQmlua0RTUENvbnRleHQgKmMpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9iaW50ZXh0LmMgYi9saWJhdmNvZGVjL2JpbnRleHQuYwppbmRleCA5MGJiZTY3Li5kOTY3MzE3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2JpbnRleHQuYworKysgYi9saWJhdmNvZGVjL2JpbnRleHQuYwpAQCAtMzUsNiArMzUsOCBAQAogI2luY2x1ZGUgImJpbnRleHQuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCisjZGVmaW5lIEZPTlRfV0lEVEggOAorCiB0eXBlZGVmIHN0cnVjdCBYYmluQ29udGV4dCB7CiAgICAgQVZGcmFtZSAqZnJhbWU7CiAgICAgaW50IHBhbGV0dGVbMTZdOwpAQCAtOTEsNiArOTMsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKGF2Y3R4LT53aWR0aCA8IEZPTlRfV0lEVEggfHwgYXZjdHgtPmhlaWdodCA8IHMtPmZvbnRfaGVpZ2h0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogCiAgICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwogICAgIGlmICghcy0+ZnJhbWUpCkBAIC0xMTMsOCArMTE4LDYgQEAKICAgICB9CiB9CiAKLSNkZWZpbmUgRk9OVF9XSURUSCA4Ci0KIC8qKgogICogRHJhdyBjaGFyYWN0ZXIgdG8gc2NyZWVuCiAgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYml0X2RlcHRoX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2JpdF9kZXB0aF90ZW1wbGF0ZS5jCmluZGV4IDgwMTg0ODkuLmQ0NGQ0N2UgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYml0X2RlcHRoX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9iaXRfZGVwdGhfdGVtcGxhdGUuYwpAQCAtMjksNiArMjksNyBAQAogIyAgIHVuZGVmIHBpeGVsMgogIyAgIHVuZGVmIHBpeGVsNAogIyAgIHVuZGVmIGRjdGNvZWYKKyMgICB1bmRlZiBpZGN0aW4KICMgICB1bmRlZiBJTklUX0NMSVAKICMgICB1bmRlZiBub19ybmRfYXZnX3BpeGVsNAogIyAgIHVuZGVmIHJuZF9hdmdfcGl4ZWw0CkBAIC01Myw2ICs1NCwxNiBAQAogIyAgIGRlZmluZSBwaXhlbDQgdWludDY0X3QKICMgICBkZWZpbmUgZGN0Y29lZiBpbnQzMl90CiAKKyNpZmRlZiBJTl9JRENUX0RFUFRICisjaWYgSU5fSURDVF9ERVBUSCA9PSAzMgorIyAgIGRlZmluZSBpZGN0aW4gaW50MzJfdAorI2Vsc2UKKyMgICBkZWZpbmUgaWRjdGluIGludDE2X3QKKyNlbmRpZgorI2Vsc2UKKyMgICBkZWZpbmUgaWRjdGluIGludDE2X3QKKyNlbmRpZgorCiAjICAgZGVmaW5lIElOSVRfQ0xJUAogIyAgIGRlZmluZSBub19ybmRfYXZnX3BpeGVsNCBub19ybmRfYXZnNjQKICMgICBkZWZpbmUgICAgcm5kX2F2Z19waXhlbDQgICAgcm5kX2F2ZzY0CkBAIC03MSw2ICs4Miw3IEBACiAjICAgZGVmaW5lIHBpeGVsMiB1aW50MTZfdAogIyAgIGRlZmluZSBwaXhlbDQgdWludDMyX3QKICMgICBkZWZpbmUgZGN0Y29lZiBpbnQxNl90CisjICAgZGVmaW5lIGlkY3RpbiAgaW50MTZfdAogCiAjICAgZGVmaW5lIElOSVRfQ0xJUAogIyAgIGRlZmluZSBub19ybmRfYXZnX3BpeGVsNCBub19ybmRfYXZnMzIKQEAgLTg3LDcgKzk5LDEwIEBACiAjICAgZGVmaW5lIENMSVAoYSkgYXZfY2xpcF91aW50OChhKQogI2VuZGlmCiAKLSNkZWZpbmUgRlVOQzMoYSwgYiwgYykgIGEgIyMgXyAjIyBiICMjIGMKKyNkZWZpbmUgRlVOQzMoYSwgYiwgYykgIGEgIyMgXyAjIyBiICMjICBjCiAjZGVmaW5lIEZVTkMyKGEsIGIsIGMpICBGVU5DMyhhLCBiLCBjKQogI2RlZmluZSBGVU5DKGEpICBGVU5DMihhLCBCSVRfREVQVEgsKQogI2RlZmluZSBGVU5DQyhhKSBGVU5DMihhLCBCSVRfREVQVEgsIF9jKQorI2RlZmluZSBGVU5DNChhLCBiLCBjKSAgYSAjIyBfaW50ICMjIGIgIyMgXyAjIyBjICMjIGJpdAorI2RlZmluZSBGVU5DNShhLCBiLCBjKSAgRlVOQzQoYSwgYiwgYykKKyNkZWZpbmUgRlVOQzYoYSkgIEZVTkM1KGEsIElOX0lEQ1RfREVQVEgsIEJJVF9ERVBUSCkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYml0cGFja2VkLmMgYi9saWJhdmNvZGVjL2JpdHBhY2tlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjQxN2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2JpdHBhY2tlZC5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogVW5wYWNrIGJpdC1wYWNrZWQgc3RyZWFtcyB0byBmb3JtYXRzIHN1cHBvcnRlZCBieSBGRm1wZWcKKyAqIENvcHlyaWdodCAoYykgMjAxNyBTYXZvaXItZmFpcmUgTGludXgsIEluYworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBEZXZlbG9wbWVudCBzcG9uc29yZWQgYnkgQ0JDL1JhZGlvLUNhbmFkYSAqLworCisvKioKKyAqIEBmaWxlCisgKiBCaXRwYWNrZWQKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKworc3RydWN0IEJpdHBhY2tlZENvbnRleHQgeworICAgIGludCAoKmRlY29kZSkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpOworfTsKKworLyogRm9yIHRoaXMgZm9ybWF0LCBpdCdzIGEgc2ltcGxlIHBhc3N0aHJvdWdoICovCitzdGF0aWMgaW50IGJpdHBhY2tlZF9kZWNvZGVfdXl2eTQyMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGludCByZXQ7CisKKyAgICAvKiB0aGVyZSBpcyBubyBuZWVkIHRvIGNvcHkgYXMgdGhlIGRhdGEgYWxyZWFkeSBtYXRjaAorICAgICAqIGEga25vd24gcGl4ZWwgZm9ybWF0ICovCisgICAgZnJhbWUtPmJ1ZlswXSA9IGF2X2J1ZmZlcl9yZWYoYXZwa3QtPmJ1Zik7CisgICAgcmV0ID0gYXZfaW1hZ2VfZmlsbF9hcnJheXMoZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwgYXZwa3QtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+YnVmWzBdKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaXRwYWNrZWRfZGVjb2RlX3l1djQyMnAxMChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgdWludDY0X3QgZnJhbWVfc2l6ZSA9ICh1aW50NjRfdClhdmN0eC0+d2lkdGggKiAodWludDY0X3QpYXZjdHgtPmhlaWdodCAqIDIwOworICAgIHVpbnQ2NF90IHBhY2tldF9zaXplID0gKHVpbnQ2NF90KWF2cGt0LT5zaXplICogODsKKyAgICBHZXRCaXRDb250ZXh0IGJjOworICAgIHVpbnQxNl90ICp5LCAqdSwgKnY7CisgICAgaW50IHJldCwgaSwgajsKKworICAgIHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChmcmFtZV9zaXplID4gcGFja2V0X3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGF2Y3R4LT53aWR0aCAlIDIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKworICAgIHJldCA9IGluaXRfZ2V0X2JpdHMoJmJjLCBhdnBrdC0+ZGF0YSwgYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDIwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICB5ID0gKHVpbnQxNl90KikoZnJhbWUtPmRhdGFbMF0gKyBpICogZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgdSA9ICh1aW50MTZfdCopKGZyYW1lLT5kYXRhWzFdICsgaSAqIGZyYW1lLT5saW5lc2l6ZVsxXSk7CisgICAgICAgIHYgPSAodWludDE2X3QqKShmcmFtZS0+ZGF0YVsyXSArIGkgKiBmcmFtZS0+bGluZXNpemVbMl0pOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+d2lkdGg7IGogKz0gMikgeworICAgICAgICAgICAgKnUrKyA9IGdldF9iaXRzKCZiYywgMTApOworICAgICAgICAgICAgKnkrKyA9IGdldF9iaXRzKCZiYywgMTApOworICAgICAgICAgICAgKnYrKyA9IGdldF9iaXRzKCZiYywgMTApOworICAgICAgICAgICAgKnkrKyA9IGdldF9iaXRzKCZiYywgMTApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBiaXRwYWNrZWRfaW5pdF9kZWNvZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBzdHJ1Y3QgQml0cGFja2VkQ29udGV4dCAqYmMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKCFhdmN0eC0+Y29kZWNfdGFnIHx8ICFhdmN0eC0+d2lkdGggfHwgIWF2Y3R4LT5oZWlnaHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ1UnLCAnWScsICdWJywgJ1knKSkgeworICAgICAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNiAmJgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9VWVZZNDIyKQorICAgICAgICAgICAgYmMtPmRlY29kZSA9IGJpdHBhY2tlZF9kZWNvZGVfdXl2eTQyMjsKKyAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAyMCAmJgorICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlAxMCkKKyAgICAgICAgICAgIGJjLT5kZWNvZGUgPSBiaXRwYWNrZWRfZGVjb2RlX3l1djQyMnAxMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYml0cGFja2VkX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBzdHJ1Y3QgQml0cGFja2VkQ29udGV4dCAqYmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmVzOworCisgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAxOworCisgICAgcmVzID0gYmMtPmRlY29kZShhdmN0eCwgZnJhbWUsIGF2cGt0KTsKKyAgICBpZiAocmVzKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgcmV0dXJuIGJ1Zl9zaXplOworCit9CisKK0FWQ29kZWMgZmZfYml0cGFja2VkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICA9ICJiaXRwYWNrZWQiLAorICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQml0cGFja2VkIiksCisgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkID0gQVZfQ09ERUNfSURfQklUUEFDS0VELAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2Yoc3RydWN0IEJpdHBhY2tlZENvbnRleHQpLAorICAgIC5pbml0ID0gYml0cGFja2VkX2luaXRfZGVjb2RlciwKKyAgICAuZGVjb2RlID0gYml0cGFja2VkX2RlY29kZSwKKyAgICAuY2FwYWJpbGl0aWVzID0gQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2JpdHN0cmVhbS5jIGIvbGliYXZjb2RlYy9iaXRzdHJlYW0uYwppbmRleCAxYWNiN2EzLi5lZDUyOGZlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2JpdHN0cmVhbS5jCisrKyBiL2xpYmF2Y29kZWMvYml0c3RyZWFtLmMKQEAgLTI4LDE0ICsyOCwxMyBAQAogICogYml0c3RyZWFtIGFwaS4KICAqLwogCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0b21pYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9xc29ydC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgInB1dF9iaXRzLmgiCisjaW5jbHVkZSAidmxjLmgiCiAKIGNvbnN0IHVpbnQ4X3QgZmZfbG9nMl9ydW5bNDFdPXsKICAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLApAQCAtOTksOSArOTgsMTEgQEAKICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgdiA9ICooY29uc3QgdWludDE2X3QgKilwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgdiA9ICooY29uc3QgdWludDMyX3QgKilwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZfYXNzZXJ0MSgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIApAQCAtMTI2LDE0ICsxMjcsNiBAQAogICAgIHJldHVybiBpbmRleDsKIH0KIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgYml0c3dhcF8zMih1aW50MzJfdCB4KQotewotICAgIHJldHVybiAodWludDMyX3QpZmZfcmV2ZXJzZVsgeCAgICAgICAgJiAweEZGXSA8PCAyNCB8Ci0gICAgICAgICAgICh1aW50MzJfdClmZl9yZXZlcnNlWyh4ID4+IDgpICAmIDB4RkZdIDw8IDE2IHwKLSAgICAgICAgICAgKHVpbnQzMl90KWZmX3JldmVyc2VbKHggPj4gMTYpICYgMHhGRl0gPDwgOCAgfAotICAgICAgICAgICAodWludDMyX3QpZmZfcmV2ZXJzZVsgeCA+PiAyNF07Ci19Ci0KIHR5cGVkZWYgc3RydWN0IFZMQ2NvZGUgewogICAgIHVpbnQ4X3QgYml0czsKICAgICB1aW50MTZfdCBzeW1ib2w7CkBAIC0xNTAsNyArMTQzLDcgQEAKIC8qKgogICogQnVpbGQgVkxDIGRlY29kaW5nIHRhYmxlcyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggZ2V0X3ZsYygpLgogICoKLSAqIEBwYXJhbSB2bGMgICAgICAgICAgICB0aGUgY29udGV4dCB0byBiZSBpbml0dGVkCisgKiBAcGFyYW0gdmxjICAgICAgICAgICAgdGhlIGNvbnRleHQgdG8gYmUgaW5pdGlhbGl6ZWQKICAqCiAgKiBAcGFyYW0gdGFibGVfbmJfYml0cyAgbWF4IGxlbmd0aCBvZiB2bGMgY29kZXMgdG8gc3RvcmUgZGlyZWN0bHkgaW4gdGhpcyB0YWJsZQogICogICAgICAgICAgICAgICAgICAgICAgIChMb25nZXIgY29kZXMgYXJlIGRlbGVnYXRlZCB0byBzdWJ0YWJsZXMuKQpAQCAtMTY3LDcgKzE2MCw3IEBACiAgICAgaW50IHRhYmxlX3NpemUsIHRhYmxlX2luZGV4LCBpbmRleCwgY29kZV9wcmVmaXgsIHN5bWJvbCwgc3VidGFibGVfYml0czsKICAgICBpbnQgaSwgaiwgaywgbiwgbmIsIGluYzsKICAgICB1aW50MzJfdCBjb2RlOwotICAgIHZvbGF0aWxlIFZMQ19UWVBFICgqIHZvbGF0aWxlIHRhYmxlKVsyXTsgLy8gdGhlIGRvdWJsZSB2b2xhdGlsZSBpcyBuZWVkZWQgdG8gcHJldmVudCBhIGludGVybmFsIGNvbXBpbGVyIGVycm9yIGluIGdjYyA0LjIKKyAgICB2b2xhdGlsZSBWTENfVFlQRSAoKiB2b2xhdGlsZSB0YWJsZSlbMl07IC8vIHRoZSBkb3VibGUgdm9sYXRpbGUgaXMgbmVlZGVkIHRvIHByZXZlbnQgYW4gaW50ZXJuYWwgY29tcGlsZXIgZXJyb3IgaW4gZ2NjIDQuMgogCiAgICAgdGFibGVfc2l6ZSA9IDEgPDwgdGFibGVfbmJfYml0czsKICAgICBpZiAodGFibGVfbmJfYml0cyA+IDMwKQpAQCAtMTgzLDcgKzE3Niw3IEBACiAgICAgICAgIG4gICAgICA9IGNvZGVzW2ldLmJpdHM7CiAgICAgICAgIGNvZGUgICA9IGNvZGVzW2ldLmNvZGU7CiAgICAgICAgIHN5bWJvbCA9IGNvZGVzW2ldLnN5bWJvbDsKLSAgICAgICAgZmZfZGxvZyhOVUxMLCAiaT0lZCBuPSVkIGNvZGU9MHgleFxuIiwgaSwgbiwgY29kZSk7CisgICAgICAgIGZmX2Rsb2coTlVMTCwgImk9JWQgbj0lZCBjb2RlPTB4JSJQUkl4MzIiXG4iLCBpLCBuLCBjb2RlKTsKICAgICAgICAgaWYgKG4gPD0gdGFibGVfbmJfYml0cykgewogICAgICAgICAgICAgLyogbm8gbmVlZCB0byBhZGQgYW5vdGhlciB0YWJsZSAqLwogICAgICAgICAgICAgaiA9IGNvZGUgPj4gKDMyIC0gdGFibGVfbmJfYml0cyk7CkBAIC0yNDgsNyArMjQxLDcgQEAKIAogLyogQnVpbGQgVkxDIGRlY29kaW5nIHRhYmxlcyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggZ2V0X3ZsYygpLgogCi0gICAnbmJfYml0cycgc2V0IHRoZSBkZWNvZGluZyB0YWJsZSBzaXplICgyXm5iX2JpdHMpIGVudHJpZXMuIFRoZQorICAgJ25iX2JpdHMnIHNldHMgdGhlIGRlY29kaW5nIHRhYmxlIHNpemUgKDJebmJfYml0cykgZW50cmllcy4gVGhlCiAgICBiaWdnZXIgaXQgaXMsIHRoZSBmYXN0ZXIgaXMgdGhlIGRlY29kaW5nLiBCdXQgaXQgc2hvdWxkIG5vdCBiZSB0b28KICAgIGJpZyB0byBzYXZlIG1lbW9yeSBhbmQgTDEgY2FjaGUuICc5JyBpcyBhIGdvb2QgY29tcHJvbWlzZS4KIApAQCAtMjY0LDcgKzI1Nyw3IEBACiAgICAnYml0cycgb3IgJ2NvZGVzJyB0YWJsZXMuCiAKICAgICd4eHhfc2l6ZScgOiBnaXZlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGVhY2ggZW50cnkgb2YgdGhlICdiaXRzJwotICAgb3IgJ2NvZGVzJyB0YWJsZXMuCisgICBvciAnY29kZXMnIHRhYmxlcy4gQ3VycmVudGx5IDEsMiBhbmQgNCBhcmUgc3VwcG9ydGVkLgogCiAgICAnd3JhcCcgYW5kICdzaXplJyBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSBhbnkgbWVtb3J5IGNvbmZpZ3VyYXRpb24gYW5kIHR5cGVzCiAgICAoYnl0ZS93b3JkL2xvbmcpIHRvIHN0b3JlIHRoZSAnYml0cycsICdjb2RlcycsIGFuZCAnc3ltYm9scycgdGFibGVzLgpAQCAtMzE3LDcgKzMxMCw4IEBACiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBHRVRfREFUQShidWZbal0uY29kZSwgY29kZXMsIGksIGNvZGVzX3dyYXAsIGNvZGVzX3NpemUpOyAgICAgICAgICAgIFwKICAgICAgICAgaWYgKGJ1ZltqXS5jb2RlID49ICgxTEw8PGJ1ZltqXS5iaXRzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb2RlIGluIGluaXRfdmxjXG4iKTsgICAgICAgXAorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29kZSAlIlBSSXgzMiIgZm9yICVkIGluICIgIFwKKyAgICAgICAgICAgICAgICAgICAiaW5pdF92bGNcbiIsIGJ1ZltqXS5jb2RlLCBpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBpZiAoIShmbGFncyAmIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKSkgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2JpdHN0cmVhbV9maWx0ZXIuYyBiL2xpYmF2Y29kZWMvYml0c3RyZWFtX2ZpbHRlci5jCmluZGV4IGZiNjkwYjYuLmNhMTFlZDMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYml0c3RyZWFtX2ZpbHRlci5jCisrKyBiL2xpYmF2Y29kZWMvYml0c3RyZWFtX2ZpbHRlci5jCkBAIC0yMSw2MCArMjEsNzYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXRvbWljLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKIAotc3RhdGljIEFWQml0U3RyZWFtRmlsdGVyICpmaXJzdF9iaXRzdHJlYW1fZmlsdGVyID0gTlVMTDsKKyNpZiBGRl9BUElfT0xEX0JTRgorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogCi1BVkJpdFN0cmVhbUZpbHRlciAqYXZfYml0c3RyZWFtX2ZpbHRlcl9uZXh0KGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyICpmKQorY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmF2X2JpdHN0cmVhbV9maWx0ZXJfbmV4dChjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqZikKIHsKLSAgICBpZiAoZikKLSAgICAgICAgcmV0dXJuIGYtPm5leHQ7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gZmlyc3RfYml0c3RyZWFtX2ZpbHRlcjsKKyAgICBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqZmlsdGVyID0gTlVMTDsKKyAgICB2b2lkICpvcGFxdWUgPSBOVUxMOworCisgICAgd2hpbGUgKGZpbHRlciAhPSBmKQorICAgICAgICBmaWx0ZXIgPSBhdl9ic2ZfaXRlcmF0ZSgmb3BhcXVlKTsKKworICAgIHJldHVybiBhdl9ic2ZfaXRlcmF0ZSgmb3BhcXVlKTsKIH0KIAogdm9pZCBhdl9yZWdpc3Rlcl9iaXRzdHJlYW1fZmlsdGVyKEFWQml0U3RyZWFtRmlsdGVyICpic2YpCiB7Ci0gICAgZG8gewotICAgICAgICBic2YtPm5leHQgPSBmaXJzdF9iaXRzdHJlYW1fZmlsdGVyOwotICAgIH0gd2hpbGUoYnNmLT5uZXh0ICE9IGF2cHJpdl9hdG9taWNfcHRyX2Nhcygodm9pZCAqIHZvbGF0aWxlICopJmZpcnN0X2JpdHN0cmVhbV9maWx0ZXIsIGJzZi0+bmV4dCwgYnNmKSk7CiB9CiAKK3R5cGVkZWYgc3RydWN0IEJTRkNvbXBhdENvbnRleHQgeworICAgIEFWQlNGQ29udGV4dCAqY3R4OworICAgIGludCBleHRyYWRhdGFfdXBkYXRlZDsKK30gQlNGQ29tcGF0Q29udGV4dDsKKwogQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICphdl9iaXRzdHJlYW1fZmlsdGVyX2luaXQoY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBBVkJpdFN0cmVhbUZpbHRlciAqYnNmID0gTlVMTDsKKyAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmN0eCA9IE5VTEw7CisgICAgQlNGQ29tcGF0Q29udGV4dCAgICAgICAgICpwcml2ID0gTlVMTDsKKyAgICBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqYnNmOwogCi0gICAgd2hpbGUgKGJzZiA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfbmV4dChic2YpKSB7Ci0gICAgICAgIGlmICghc3RyY21wKG5hbWUsIGJzZi0+bmFtZSkpIHsKLSAgICAgICAgICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYyA9Ci0gICAgICAgICAgICAgICAgYXZfbWFsbG9jeihzaXplb2YoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0KSk7Ci0gICAgICAgICAgICBpZiAoIWJzZmMpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICBic2ZjLT5maWx0ZXIgICAgPSBic2Y7Ci0gICAgICAgICAgICBic2ZjLT5wcml2X2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgaWYgKGJzZi0+cHJpdl9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICBic2ZjLT5wcml2X2RhdGEgPSBhdl9tYWxsb2N6KGJzZi0+cHJpdl9kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghYnNmYy0+cHJpdl9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZic2ZjKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJzZmM7Ci0gICAgICAgIH0KLSAgICB9CisgICAgYnNmID0gYXZfYnNmX2dldF9ieV9uYW1lKG5hbWUpOworICAgIGlmICghYnNmKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGN0eCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjdHgpKTsKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBwcml2ID0gYXZfbWFsbG9jeihzaXplb2YoKnByaXYpKTsKKyAgICBpZiAoIXByaXYpCisgICAgICAgIGdvdG8gZmFpbDsKKworCisgICAgY3R4LT5maWx0ZXIgICAgPSBic2Y7CisgICAgY3R4LT5wcml2X2RhdGEgPSBwcml2OworCisgICAgcmV0dXJuIGN0eDsKKworZmFpbDoKKyAgICBpZiAocHJpdikKKyAgICAgICAgYXZfYnNmX2ZyZWUoJnByaXYtPmN0eCk7CisgICAgYXZfZnJlZXAoJnByaXYpOworICAgIGF2X2ZyZWVwKCZjdHgpOwogICAgIHJldHVybiBOVUxMOwogfQogCiB2b2lkIGF2X2JpdHN0cmVhbV9maWx0ZXJfY2xvc2UoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjKQogeworICAgIEJTRkNvbXBhdENvbnRleHQgKnByaXY7CisKICAgICBpZiAoIWJzZmMpCiAgICAgICAgIHJldHVybjsKLSAgICBpZiAoYnNmYy0+ZmlsdGVyLT5jbG9zZSkKLSAgICAgICAgYnNmYy0+ZmlsdGVyLT5jbG9zZShic2ZjKTsKKworICAgIHByaXYgPSBic2ZjLT5wcml2X2RhdGE7CisKKyAgICBhdl9ic2ZfZnJlZSgmcHJpdi0+Y3R4KTsKICAgICBhdl9mcmVlcCgmYnNmYy0+cHJpdl9kYXRhKTsKLSAgICBhdl9mcmVlcCgmYnNmYy0+YXJncyk7Ci0gICAgYXZfcGFyc2VyX2Nsb3NlKGJzZmMtPnBhcnNlcik7CiAgICAgYXZfZnJlZShic2ZjKTsKIH0KIApAQCAtODMsOCArOTksODcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSkKIHsKLSAgICAqcG91dGJ1ZiAgICAgID0gKHVpbnQ4X3QgKilidWY7Ci0gICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOwotICAgIHJldHVybiBic2ZjLT5maWx0ZXItPmZpbHRlcihic2ZjLCBhdmN0eCwgYXJncyA/IGFyZ3MgOiBic2ZjLT5hcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3V0YnVmLCBwb3V0YnVmX3NpemUsIGJ1ZiwgYnVmX3NpemUsIGtleWZyYW1lKTsKKyAgICBCU0ZDb21wYXRDb250ZXh0ICpwcml2ID0gYnNmYy0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0IHBrdCA9IHsgMCB9OworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXByaXYtPmN0eCkgeworICAgICAgICByZXQgPSBhdl9ic2ZfYWxsb2MoYnNmYy0+ZmlsdGVyLCAmcHJpdi0+Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQocHJpdi0+Y3R4LT5wYXJfaW4sIGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHByaXYtPmN0eC0+dGltZV9iYXNlX2luID0gYXZjdHgtPnRpbWVfYmFzZTsKKworICAgICAgICBpZiAoYnNmYy0+YXJncyAmJiBic2ZjLT5maWx0ZXItPnByaXZfY2xhc3MpIHsKKyAgICAgICAgICAgIGNvbnN0IEFWT3B0aW9uICpvcHQgPSBhdl9vcHRfbmV4dChwcml2LT5jdHgtPnByaXZfZGF0YSwgTlVMTCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICogc2hvcnRoYW5kWzJdID0ge05VTEx9OworCisgICAgICAgICAgICBpZiAob3B0KQorICAgICAgICAgICAgICAgIHNob3J0aGFuZFswXSA9IG9wdC0+bmFtZTsKKworICAgICAgICAgICAgcmV0ID0gYXZfb3B0X3NldF9mcm9tX3N0cmluZyhwcml2LT5jdHgtPnByaXZfZGF0YSwgYnNmYy0+YXJncywgc2hvcnRoYW5kLCAiPSIsICI6Iik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZfYnNmX2luaXQocHJpdi0+Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBrdC5kYXRhID0gKHVpbnQ4X3QgKilidWY7CisgICAgcGt0LnNpemUgPSBidWZfc2l6ZTsKKworICAgIHJldCA9IGF2X2JzZl9zZW5kX3BhY2tldChwcml2LT5jdHgsICZwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgKnBvdXRidWYgICAgICA9IE5VTEw7CisgICAgKnBvdXRidWZfc2l6ZSA9IDA7CisKKyAgICByZXQgPSBhdl9ic2ZfcmVjZWl2ZV9wYWNrZXQocHJpdi0+Y3R4LCAmcGt0KTsKKyAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqcG91dGJ1ZiA9IGF2X21hbGxvYyhwa3Quc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghKnBvdXRidWYpIHsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgICpwb3V0YnVmX3NpemUgPSBwa3Quc2l6ZTsKKyAgICBtZW1jcHkoKnBvdXRidWYsIHBrdC5kYXRhLCBwa3Quc2l6ZSk7CisKKyAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisKKyAgICAvKiBkcmFpbiBhbGwgdGhlIHJlbWFpbmluZyBwYWNrZXRzIHdlIGNhbm5vdCByZXR1cm4gKi8KKyAgICB3aGlsZSAocmV0ID49IDApIHsKKyAgICAgICAgcmV0ID0gYXZfYnNmX3JlY2VpdmVfcGFja2V0KHByaXYtPmN0eCwgJnBrdCk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKKyAgICB9CisKKyAgICBpZiAoIXByaXYtPmV4dHJhZGF0YV91cGRhdGVkKSB7CisgICAgICAgIC8qIHVwZGF0ZSBleHRyYWRhdGEgaW4gYXZjdHggZnJvbSB0aGUgb3V0cHV0IGNvZGVjIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgaWYgKHByaXYtPmN0eC0+cGFyX291dC0+ZXh0cmFkYXRhX3NpemUgJiYgKCFhcmdzIHx8ICFzdHJzdHIoYXJncywgInByaXZhdGVfc3BzcHBzX2J1ZiIpKSkgeworICAgICAgICAgICAgYXZfZnJlZXAoJmF2Y3R4LT5leHRyYWRhdGEpOworICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHByaXYtPmN0eC0+cGFyX291dC0+ZXh0cmFkYXRhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIHByaXYtPmN0eC0+cGFyX291dC0+ZXh0cmFkYXRhLCBwcml2LT5jdHgtPnBhcl9vdXQtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHByaXYtPmN0eC0+cGFyX291dC0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBwcml2LT5leHRyYWRhdGFfdXBkYXRlZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDE7CiB9CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9iaXRzdHJlYW1fZmlsdGVycy5jIGIvbGliYXZjb2RlYy9iaXRzdHJlYW1fZmlsdGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZGM4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2JpdHN0cmVhbV9maWx0ZXJzLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic2YuaCIKKworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX2FhY19hZHRzdG9hc2NfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX2Nob21wX2JzZjsKK2V4dGVybiBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9kdW1wX2V4dHJhZGF0YV9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfZGNhX2NvcmVfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX2VhYzNfY29yZV9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfZXh0cmFjdF9leHRyYWRhdGFfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX2ZpbHRlcl91bml0c19ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfaDI2NF9tZXRhZGF0YV9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfaDI2NF9tcDR0b2FubmV4Yl9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfaDI2NF9yZWR1bmRhbnRfcHBzX2JzZjsKK2V4dGVybiBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9oYXBxYV9leHRyYWN0X2JzZjsKK2V4dGVybiBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9oZXZjX21ldGFkYXRhX2JzZjsKK2V4dGVybiBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9oZXZjX21wNHRvYW5uZXhiX2JzZjsKK2V4dGVybiBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9pbXhfZHVtcF9oZWFkZXJfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX21qcGVnMmpwZWdfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX21qcGVnYV9kdW1wX2hlYWRlcl9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfbXAzX2hlYWRlcl9kZWNvbXByZXNzX2JzZjsKK2V4dGVybiBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9tcGVnMl9tZXRhZGF0YV9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfbXBlZzRfdW5wYWNrX2JmcmFtZXNfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX21vdjJ0ZXh0c3ViX2JzZjsKK2V4dGVybiBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9ub2lzZV9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfbnVsbF9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfcmVtb3ZlX2V4dHJhZGF0YV9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfdGV4dDJtb3ZzdWJfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX3RyYWNlX2hlYWRlcnNfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX3ZwOV9yYXdfcmVvcmRlcl9ic2Y7CitleHRlcm4gY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfdnA5X3N1cGVyZnJhbWVfYnNmOworZXh0ZXJuIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX3ZwOV9zdXBlcmZyYW1lX3NwbGl0X2JzZjsKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYnNmX2xpc3QuYyIKKworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmF2X2JzZl9pdGVyYXRlKHZvaWQgKipvcGFxdWUpCit7CisgICAgdWludHB0cl90IGkgPSAodWludHB0cl90KSpvcGFxdWU7CisgICAgY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmYgPSBiaXRzdHJlYW1fZmlsdGVyc1tpXTsKKworICAgIGlmIChmKQorICAgICAgICAqb3BhcXVlID0gKHZvaWQqKShpICsgMSk7CisKKyAgICByZXR1cm4gZjsKK30KKworI2lmIEZGX0FQSV9ORVhUCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqYXZfYnNmX25leHQodm9pZCAqKm9wYXF1ZSkgeworICAgIHJldHVybiBhdl9ic2ZfaXRlcmF0ZShvcGFxdWUpOworfQorI2VuZGlmCisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyICphdl9ic2ZfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqZiA9IE5VTEw7CisgICAgdm9pZCAqaSA9IDA7CisKKyAgICBpZiAoIW5hbWUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgd2hpbGUgKChmID0gYXZfYnNmX2l0ZXJhdGUoJmkpKSkgeworICAgICAgICBpZiAoIXN0cmNtcChmLT5uYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBmOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitjb25zdCBBVkNsYXNzICpmZl9ic2ZfY2hpbGRfY2xhc3NfbmV4dChjb25zdCBBVkNsYXNzICpwcmV2KQoreworICAgIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyICpmID0gTlVMTDsKKyAgICB2b2lkICppID0gMDsKKworICAgIC8qIGZpbmQgdGhlIGZpbHRlciB0aGF0IGNvcnJlc3BvbmRzIHRvIHByZXYgKi8KKyAgICB3aGlsZSAocHJldiAmJiAoZiA9IGF2X2JzZl9pdGVyYXRlKCZpKSkpIHsKKyAgICAgICAgaWYgKGYtPnByaXZfY2xhc3MgPT0gcHJldikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmaW5kIG5leHQgZmlsdGVyIHdpdGggcHJpdiBvcHRpb25zICovCisgICAgd2hpbGUgKChmID0gYXZfYnNmX2l0ZXJhdGUoJmkpKSkgeworICAgICAgICBpZiAoZi0+cHJpdl9jbGFzcykKKyAgICAgICAgICAgIHJldHVybiBmLT5wcml2X2NsYXNzOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYmxvY2tkc3AuYyBiL2xpYmF2Y29kZWMvYmxvY2tkc3AuYwppbmRleCBhNWM1MjdhLi5jN2VmZTdlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2Jsb2NrZHNwLmMKKysrIGIvbGliYXZjb2RlYy9ibG9ja2RzcC5jCkBAIC0zNSw3ICszNSw4IEBACiAgICAgbWVtc2V0KGJsb2NrcywgMCwgc2l6ZW9mKGludDE2X3QpICogNiAqIDY0KTsKIH0KIAotc3RhdGljIHZvaWQgZmlsbF9ibG9jazE2X2ModWludDhfdCAqYmxvY2ssIHVpbnQ4X3QgdmFsdWUsIGludCBsaW5lX3NpemUsIGludCBoKQorc3RhdGljIHZvaWQgZmlsbF9ibG9jazE2X2ModWludDhfdCAqYmxvY2ssIHVpbnQ4X3QgdmFsdWUsIHB0cmRpZmZfdCBsaW5lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkKIHsKICAgICBpbnQgaTsKIApAQCAtNDUsNyArNDYsOCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZmlsbF9ibG9jazhfYyh1aW50OF90ICpibG9jaywgdWludDhfdCB2YWx1ZSwgaW50IGxpbmVfc2l6ZSwgaW50IGgpCitzdGF0aWMgdm9pZCBmaWxsX2Jsb2NrOF9jKHVpbnQ4X3QgKmJsb2NrLCB1aW50OF90IHZhbHVlLCBwdHJkaWZmX3QgbGluZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCkKIHsKICAgICBpbnQgaTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ibG9ja2RzcC5oIGIvbGliYXZjb2RlYy9ibG9ja2RzcC5oCmluZGV4IDk1ZTFkMGYuLjI2ZmMyZWEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYmxvY2tkc3AuaAorKysgYi9saWJhdmNvZGVjL2Jsb2NrZHNwLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpZm5kZWYgQVZDT0RFQ19CTE9DS0RTUF9ICiAjZGVmaW5lIEFWQ09ERUNfQkxPQ0tEU1BfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCkBAIC0yOSwxMSArMzAsMTEgQEAKICAqIGggZm9yIG9wX3BpeGVsc19mdW5jIGlzIGxpbWl0ZWQgdG8geyB3aWR0aCAvIDIsIHdpZHRoIH0sCiAgKiBidXQgbmV2ZXIgbGFyZ2VyIHRoYW4gMTYgYW5kIG5ldmVyIHNtYWxsZXIgdGhhbiA0LiAqLwogdHlwZWRlZiB2b2lkICgqb3BfZmlsbF9mdW5jKSh1aW50OF90ICpibG9jayAvKiBhbGlnbiB3aWR0aCAoOCBvciAxNikgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsdWUsIGludCBsaW5lX3NpemUsIGludCBoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2YWx1ZSwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwogCiB0eXBlZGVmIHN0cnVjdCBCbG9ja0RTUENvbnRleHQgewotICAgIHZvaWQgKCpjbGVhcl9ibG9jaykoaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8pOwotICAgIHZvaWQgKCpjbGVhcl9ibG9ja3MpKGludDE2X3QgKmJsb2NrcyAvKiBhbGlnbiAxNiAqLyk7CisgICAgdm9pZCAoKmNsZWFyX2Jsb2NrKShpbnQxNl90ICpibG9jayAvKiBhbGlnbiAzMiAqLyk7CisgICAgdm9pZCAoKmNsZWFyX2Jsb2NrcykoaW50MTZfdCAqYmxvY2tzIC8qIGFsaWduIDMyICovKTsKIAogICAgIG9wX2ZpbGxfZnVuYyBmaWxsX2Jsb2NrX3RhYlsyXTsKIH0gQmxvY2tEU1BDb250ZXh0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ibXAuYyBiL2xpYmF2Y29kZWMvYm1wLmMKaW5kZXggZmExZDZhNS4uNDAwMTBhYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9ibXAuYworKysgYi9saWJhdmNvZGVjL2JtcC5jCkBAIC0xMDAsNyArMTAwLDggQEAKICAgICAgICAgaGVpZ2h0ID0gYnl0ZXN0cmVhbV9nZXRfbGUxNigmYnVmKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBCTVAgZmlsZSwgcGF0Y2ggd2VsY29tZVxuIik7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiSW5mb3JtYXRpb24gaGVhZGVyIHNpemUgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaHNpemUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCkBAIC0xMzIsOCArMTMzLDExIEBACiAgICAgICAgIGFscGhhID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYnVmKTsKICAgICB9CiAKLSAgICBhdmN0eC0+d2lkdGggID0gd2lkdGg7Ci0gICAgYXZjdHgtPmhlaWdodCA9IGhlaWdodCA+IDAgPyBoZWlnaHQgOiAtaGVpZ2h0OworICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCB3aWR0aCwgaGVpZ2h0ID4gMCA/IGhlaWdodCA6IC0odW5zaWduZWQpaGVpZ2h0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQgZGltZW5zaW9ucyAlZCAlZFxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KIAogICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOwogCkBAIC0xNDksNyArMTUzLDggQEAKICAgICAgICAgICAgIGVsc2UgaWYgKHJnYlswXSA9PSAweDAwMDAwMEZGICYmIHJnYlsxXSA9PSAweDAwMDBGRjAwICYmIHJnYlsyXSA9PSAweDAwRkYwMDAwKQogICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYWxwaGEgPyBBVl9QSVhfRk1UX1JHQkEgOiBBVl9QSVhfRk1UX1JHQjA7CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gYml0ZmllbGRzICUwWCAlMFggJTBYXG4iLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gYml0ZmllbGRzICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiUwIlBSSVgzMiIgJTAiUFJJWDMyIiAlMCJQUklYMzIiXG4iLCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewpAQCAtMjg2LDcgKzI5MSw3IEBACiAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKICAgICAgICAgICAgICAgICBpbnQgajsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aCA+PiAzOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgcHRyW2oqOCswXSA9ICBidWZbal0gPj4gNzsKICAgICAgICAgICAgICAgICAgICAgcHRyW2oqOCsxXSA9IChidWZbal0gPj4gNikgJiAxOwogICAgICAgICAgICAgICAgICAgICBwdHJbaio4KzJdID0gKGJ1ZltqXSA+PiA1KSAmIDE7CkBAIC0yOTYsNiArMzAxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgcHRyW2oqOCs2XSA9IChidWZbal0gPj4gMSkgJiAxOwogICAgICAgICAgICAgICAgICAgICBwdHJbaio4KzddID0gIGJ1ZltqXSAgICAgICAmIDE7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoYXZjdHgtPndpZHRoICYgNyk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBwdHJbYXZjdHgtPndpZHRoIC0gKGF2Y3R4LT53aWR0aCAmIDcpICsgal0gPSBidWZbYXZjdHgtPndpZHRoID4+IDNdID4+ICg3IC0gaikgJiAxOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBidWYgKz0gbjsKICAgICAgICAgICAgICAgICBwdHIgKz0gbGluZXNpemU7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2JtcF9wYXJzZXIuYyBiL2xpYmF2Y29kZWMvYm1wX3BhcnNlci5jCmluZGV4IGM5NDkzZGMuLmNkNjVmMDIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYm1wX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvYm1wX3BhcnNlci5jCkBAIC01Myw3ICs1Myw4IEBACiAgICAgICAgICAgICBpZiAoYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA+PiA0OCkgPT0gKCgnQicgPDwgOCkgfCAnTScpKSB7CiAgICAgICAgICAgICAgICAgICAgIGJwYy0+ZnNpemUgPSBhdl9ic3dhcDMyKHN0YXRlID4+IDE2KTsKLSAgICAgICAgICAgICAgICAgICAgYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChicGMtPmZzaXplID4gMTcpCisgICAgICAgICAgICAgICAgICAgICAgICBicGMtPnBjLmZyYW1lX3N0YXJ0X2ZvdW5kID0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGJwYy0+cGMuZnJhbWVfc3RhcnRfZm91bmQgPT0gMis0KzQpIHsKIC8vICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoc2l6ZSA9IGF2X2Jzd2FwMzIoc3RhdGU+PjMyKTsKQEAgLTY3LDggKzY4LDEyIEBACiAKICAgICAgICAgICAgICAgICBpZiAoYnBjLT5wYy5pbmRleCArIGkgPiAxNykgewogICAgICAgICAgICAgICAgICAgICBuZXh0ID0gaSAtIDE3OwotICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJwYy0+cGMuc3RhdGU2NCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGJwYy0+cGMuZnJhbWVfc3RhcnRfZm91bmQpCiAgICAgICAgICAgICAgICAgYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCsrOwogICAgICAgICB9CkBAIC04OSw3ICs5NCwxMCBAQAogICAgIGlmIChmZl9jb21iaW5lX2ZyYW1lKCZicGMtPnBjLCBuZXh0LCAmYnVmLCAmYnVmX3NpemUpIDwgMCkKICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOwogCi0gICAgYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgaWYgKG5leHQgIT0gRU5EX05PVF9GT1VORCAmJiBuZXh0IDwgMCkKKyAgICAgICAgYnBjLT5wYy5mcmFtZV9zdGFydF9mb3VuZCA9IEZGTUFYKGJwYy0+cGMuZnJhbWVfc3RhcnRfZm91bmQgLSBpIC0gMSwgMCk7CisgICAgZWxzZQorICAgICAgICBicGMtPnBjLmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKIAogICAgICpwb3V0YnVmICAgICAgPSBidWY7CiAgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ibXZ2aWRlby5jIGIvbGliYXZjb2RlYy9ibXZ2aWRlby5jCmluZGV4IDk3Zjg1MGQuLjY3OWIxNDIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYm12dmlkZW8uYworKysgYi9saWJhdmNvZGVjL2JtdnZpZGVvLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoc3JjIDwgc291cmNlIHx8IHNyYyA+PSBzb3VyY2VfZW5kKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCB8PSAqc3JjIDw8IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICB2YWwgfD0gKHVuc2lnbmVkKSpzcmMgPDwgc2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgIGlmICgqc3JjICYgMHhDKQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTkzLDcgKzE5Myw2IEBACiAgICAgICAgIGlmIChkc3QgPT0gZHN0X2VuZCkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKQEAgLTI5NSw0ICsyOTQsNSBAQAogICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAogICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ic2YuYyBiL2xpYmF2Y29kZWMvYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2MTFlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvYnNmLmMKQEAgLTAsMCArMSw1NDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzZi5oIgorCitzdHJ1Y3QgQVZCU0ZJbnRlcm5hbCB7CisgICAgQVZQYWNrZXQgKmJ1ZmZlcl9wa3Q7CisgICAgaW50IGVvZjsKK307CisKK3ZvaWQgYXZfYnNmX2ZyZWUoQVZCU0ZDb250ZXh0ICoqcGN0eCkKK3sKKyAgICBBVkJTRkNvbnRleHQgKmN0eDsKKworICAgIGlmICghcGN0eCB8fCAhKnBjdHgpCisgICAgICAgIHJldHVybjsKKyAgICBjdHggPSAqcGN0eDsKKworICAgIGlmIChjdHgtPmZpbHRlci0+Y2xvc2UpCisgICAgICAgIGN0eC0+ZmlsdGVyLT5jbG9zZShjdHgpOworICAgIGlmIChjdHgtPmZpbHRlci0+cHJpdl9jbGFzcyAmJiBjdHgtPnByaXZfZGF0YSkKKyAgICAgICAgYXZfb3B0X2ZyZWUoY3R4LT5wcml2X2RhdGEpOworCisgICAgYXZfb3B0X2ZyZWUoY3R4KTsKKworICAgIGF2X3BhY2tldF9mcmVlKCZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0KTsKKyAgICBhdl9mcmVlcCgmY3R4LT5pbnRlcm5hbCk7CisgICAgYXZfZnJlZXAoJmN0eC0+cHJpdl9kYXRhKTsKKworICAgIGF2Y29kZWNfcGFyYW1ldGVyc19mcmVlKCZjdHgtPnBhcl9pbik7CisgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2ZyZWUoJmN0eC0+cGFyX291dCk7CisKKyAgICBhdl9mcmVlcChwY3R4KTsKK30KKworc3RhdGljIHZvaWQgKmJzZl9jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKK3sKKyAgICBBVkJTRkNvbnRleHQgKmN0eCA9IG9iajsKKyAgICBpZiAoIXByZXYgJiYgY3R4LT5maWx0ZXItPnByaXZfY2xhc3MpCisgICAgICAgIHJldHVybiBjdHgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYnNmX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICAgID0gIkFWQlNGQ29udGV4dCIsCisgICAgLml0ZW1fbmFtZSAgICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2hpbGRfbmV4dCAgICAgICA9IGJzZl9jaGlsZF9uZXh0LAorICAgIC5jaGlsZF9jbGFzc19uZXh0ID0gZmZfYnNmX2NoaWxkX2NsYXNzX25leHQsCit9OworCitjb25zdCBBVkNsYXNzICphdl9ic2ZfZ2V0X2NsYXNzKHZvaWQpCit7CisgICAgcmV0dXJuICZic2ZfY2xhc3M7Cit9CisKK2ludCBhdl9ic2ZfYWxsb2MoY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmZpbHRlciwgQVZCU0ZDb250ZXh0ICoqcGN0eCkKK3sKKyAgICBBVkJTRkNvbnRleHQgKmN0eDsKKyAgICBpbnQgcmV0OworCisgICAgY3R4ID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eCkpOworICAgIGlmICghY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY3R4LT5hdl9jbGFzcyA9ICZic2ZfY2xhc3M7CisgICAgY3R4LT5maWx0ZXIgICA9IGZpbHRlcjsKKworICAgIGN0eC0+cGFyX2luICA9IGF2Y29kZWNfcGFyYW1ldGVyc19hbGxvYygpOworICAgIGN0eC0+cGFyX291dCA9IGF2Y29kZWNfcGFyYW1ldGVyc19hbGxvYygpOworICAgIGlmICghY3R4LT5wYXJfaW4gfHwgIWN0eC0+cGFyX291dCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdHgtPmludGVybmFsID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eC0+aW50ZXJuYWwpKTsKKyAgICBpZiAoIWN0eC0+aW50ZXJuYWwpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY3R4LT5pbnRlcm5hbC0+YnVmZmVyX3BrdCA9IGF2X3BhY2tldF9hbGxvYygpOworICAgIGlmICghY3R4LT5pbnRlcm5hbC0+YnVmZmVyX3BrdCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKGN0eCk7CisKKyAgICAvKiBhbGxvY2F0ZSBwcml2IGRhdGEgYW5kIGluaXQgcHJpdmF0ZSBvcHRpb25zICovCisgICAgaWYgKGZpbHRlci0+cHJpdl9kYXRhX3NpemUpIHsKKyAgICAgICAgY3R4LT5wcml2X2RhdGEgPSBhdl9tYWxsb2N6KGZpbHRlci0+cHJpdl9kYXRhX3NpemUpOworICAgICAgICBpZiAoIWN0eC0+cHJpdl9kYXRhKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbHRlci0+cHJpdl9jbGFzcykgeworICAgICAgICAgICAgKihjb25zdCBBVkNsYXNzICoqKWN0eC0+cHJpdl9kYXRhID0gZmlsdGVyLT5wcml2X2NsYXNzOworICAgICAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cyhjdHgtPnByaXZfZGF0YSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqcGN0eCA9IGN0eDsKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfYnNmX2ZyZWUoJmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X2JzZl9pbml0KEFWQlNGQ29udGV4dCAqY3R4KQoreworICAgIGludCByZXQsIGk7CisKKyAgICAvKiBjaGVjayB0aGF0IHRoZSBjb2RlYyBpcyBzdXBwb3J0ZWQgKi8KKyAgICBpZiAoY3R4LT5maWx0ZXItPmNvZGVjX2lkcykgeworICAgICAgICBmb3IgKGkgPSAwOyBjdHgtPmZpbHRlci0+Y29kZWNfaWRzW2ldICE9IEFWX0NPREVDX0lEX05PTkU7IGkrKykKKyAgICAgICAgICAgIGlmIChjdHgtPnBhcl9pbi0+Y29kZWNfaWQgPT0gY3R4LT5maWx0ZXItPmNvZGVjX2lkc1tpXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGN0eC0+ZmlsdGVyLT5jb2RlY19pZHNbaV0gPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGN0eC0+cGFyX2luLT5jb2RlY19pZCk7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb2RlYyAnJXMnICglZCkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgIgorICAgICAgICAgICAgICAgICAgICJiaXRzdHJlYW0gZmlsdGVyICclcycuIFN1cHBvcnRlZCBjb2RlY3MgYXJlOiAiLAorICAgICAgICAgICAgICAgICAgIGRlc2MgPyBkZXNjLT5uYW1lIDogInVua25vd24iLCBjdHgtPnBhcl9pbi0+Y29kZWNfaWQsIGN0eC0+ZmlsdGVyLT5uYW1lKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGN0eC0+ZmlsdGVyLT5jb2RlY19pZHNbaV0gIT0gQVZfQ09ERUNfSURfTk9ORTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZGVzYyA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoY3R4LT5maWx0ZXItPmNvZGVjX2lkc1tpXSk7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiJXMgKCVkKSAiLAorICAgICAgICAgICAgICAgICAgICAgICBkZXNjID8gZGVzYy0+bmFtZSA6ICJ1bmtub3duIiwgY3R4LT5maWx0ZXItPmNvZGVjX2lkc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGluaXRpYWxpemUgb3V0cHV0IHBhcmFtZXRlcnMgdG8gYmUgdGhlIHNhbWUgYXMgaW5wdXQKKyAgICAgKiBpbml0IGJlbG93IG1pZ2h0IG92ZXJ3cml0ZSB0aGF0ICovCisgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkoY3R4LT5wYXJfb3V0LCBjdHgtPnBhcl9pbik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBjdHgtPnRpbWVfYmFzZV9vdXQgPSBjdHgtPnRpbWVfYmFzZV9pbjsKKworICAgIGlmIChjdHgtPmZpbHRlci0+aW5pdCkgeworICAgICAgICByZXQgPSBjdHgtPmZpbHRlci0+aW5pdChjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9ic2Zfc2VuZF9wYWNrZXQoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghcGt0IHx8ICghcGt0LT5kYXRhICYmICFwa3QtPnNpZGVfZGF0YV9lbGVtcykpIHsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZW9mID0gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGN0eC0+aW50ZXJuYWwtPmVvZikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJBIG5vbi1OVUxMIHBhY2tldCBzZW50IGFmdGVyIGFuIEVPRi5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChjdHgtPmludGVybmFsLT5idWZmZXJfcGt0LT5kYXRhIHx8CisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmJ1ZmZlcl9wa3QtPnNpZGVfZGF0YV9lbGVtcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKworICAgIHJldCA9IGF2X3BhY2tldF9tYWtlX3JlZmNvdW50ZWQocGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdl9wYWNrZXRfbW92ZV9yZWYoY3R4LT5pbnRlcm5hbC0+YnVmZmVyX3BrdCwgcGt0KTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfYnNmX3JlY2VpdmVfcGFja2V0KEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIHJldHVybiBjdHgtPmZpbHRlci0+ZmlsdGVyKGN0eCwgcGt0KTsKK30KKworaW50IGZmX2JzZl9nZXRfcGFja2V0KEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqKnBrdCkKK3sKKyAgICBBVkJTRkludGVybmFsICppbiA9IGN0eC0+aW50ZXJuYWw7CisgICAgQVZQYWNrZXQgKnRtcF9wa3Q7CisKKyAgICBpZiAoaW4tPmVvZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKCFjdHgtPmludGVybmFsLT5idWZmZXJfcGt0LT5kYXRhICYmCisgICAgICAgICFjdHgtPmludGVybmFsLT5idWZmZXJfcGt0LT5zaWRlX2RhdGFfZWxlbXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisKKyAgICB0bXBfcGt0ID0gYXZfcGFja2V0X2FsbG9jKCk7CisgICAgaWYgKCF0bXBfcGt0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgKnBrdCA9IGN0eC0+aW50ZXJuYWwtPmJ1ZmZlcl9wa3Q7CisgICAgY3R4LT5pbnRlcm5hbC0+YnVmZmVyX3BrdCA9IHRtcF9wa3Q7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2JzZl9nZXRfcGFja2V0X3JlZihBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkJTRkludGVybmFsICppbiA9IGN0eC0+aW50ZXJuYWw7CisKKyAgICBpZiAoaW4tPmVvZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKCFjdHgtPmludGVybmFsLT5idWZmZXJfcGt0LT5kYXRhICYmCisgICAgICAgICFjdHgtPmludGVybmFsLT5idWZmZXJfcGt0LT5zaWRlX2RhdGFfZWxlbXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisKKyAgICBhdl9wYWNrZXRfbW92ZV9yZWYocGt0LCBjdHgtPmludGVybmFsLT5idWZmZXJfcGt0KTsKKworICAgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBCU0ZMaXN0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBBVkJTRkNvbnRleHQgKipic2ZzOworICAgIGludCBuYl9ic2ZzOworCisgICAgdW5zaWduZWQgaWR4OyAgICAgICAgICAgLy8gaW5kZXggb2YgY3VycmVudGx5IHByb2Nlc3NlZCBCU0YKKyAgICB1bnNpZ25lZCBmbHVzaGVkX2lkeDsgICAvLyBpbmRleCBvZiBCU0YgYmVpbmcgZmx1c2hlZAorCisgICAgY2hhciAqIGl0ZW1fbmFtZTsKK30gQlNGTGlzdENvbnRleHQ7CisKKworc3RhdGljIGludCBic2ZfbGlzdF9pbml0KEFWQlNGQ29udGV4dCAqYnNmKQoreworICAgIEJTRkxpc3RDb250ZXh0ICpsc3QgPSBic2YtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0LCBpOworICAgIGNvbnN0IEFWQ29kZWNQYXJhbWV0ZXJzICpjb2RfcGFyID0gYnNmLT5wYXJfaW47CisgICAgQVZSYXRpb25hbCB0YiA9IGJzZi0+dGltZV9iYXNlX2luOworCisgICAgZm9yIChpID0gMDsgaSA8IGxzdC0+bmJfYnNmczsgKytpKSB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KGxzdC0+YnNmc1tpXS0+cGFyX2luLCBjb2RfcGFyKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgbHN0LT5ic2ZzW2ldLT50aW1lX2Jhc2VfaW4gPSB0YjsKKworICAgICAgICByZXQgPSBhdl9ic2ZfaW5pdChsc3QtPmJzZnNbaV0pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBjb2RfcGFyID0gbHN0LT5ic2ZzW2ldLT5wYXJfb3V0OworICAgICAgICB0YiA9IGxzdC0+YnNmc1tpXS0+dGltZV9iYXNlX291dDsKKyAgICB9CisKKyAgICBic2YtPnRpbWVfYmFzZV9vdXQgPSB0YjsKKyAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShic2YtPnBhcl9vdXQsIGNvZF9wYXIpOworCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnNmX2xpc3RfZmlsdGVyKEFWQlNGQ29udGV4dCAqYnNmLCBBVlBhY2tldCAqb3V0KQoreworICAgIEJTRkxpc3RDb250ZXh0ICpsc3QgPSBic2YtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFsc3QtPm5iX2JzZnMpCisgICAgICAgIHJldHVybiBmZl9ic2ZfZ2V0X3BhY2tldF9yZWYoYnNmLCBvdXQpOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGxzdC0+aWR4ID4gbHN0LT5mbHVzaGVkX2lkeCkgeworICAgICAgICAgICAgcmV0ID0gYXZfYnNmX3JlY2VpdmVfcGFja2V0KGxzdC0+YnNmc1tsc3QtPmlkeC0xXSwgb3V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICAgICAgLyogbm8gbW9yZSBwYWNrZXRzIGZyb20gaWR4LTEsIHRyeSB3aXRoIHByZXZpb3VzICovCisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICBsc3QtPmlkeC0tOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgICAgICAgICAvKiBmaWx0ZXIgaWR4LTEgaXMgZG9uZSwgY29udGludWUgd2l0aCBpZHguLi5uYl9ic2ZzICovCisgICAgICAgICAgICAgICAgbHN0LT5mbHVzaGVkX2lkeCA9IGxzdC0+aWR4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfWVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBmaWx0ZXJpbmcgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGZmX2JzZl9nZXRfcGFja2V0X3JlZihic2YsIG91dCk7CisgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICAgICAgbHN0LT5pZHggPSBsc3QtPmZsdXNoZWRfaWR4OworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxzdC0+aWR4IDwgbHN0LT5uYl9ic2ZzKSB7CisgICAgICAgICAgICBBVlBhY2tldCAqcGt0OworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBsc3QtPmlkeCA9PSBsc3QtPmZsdXNoZWRfaWR4KSB7CisgICAgICAgICAgICAgICAgLyogZmZfYnNmX2dldF9wYWNrZXRfcmVmIHJldHVybmVkIEVPRiBhbmQgaWR4IGlzIGZpcnN0CisgICAgICAgICAgICAgICAgICogZmlsdGVyIG9mIHlldCBub3QgZmx1c2hlZCBmaWx0ZXIgY2hhaW4gKi8KKyAgICAgICAgICAgICAgICBwa3QgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwa3QgPSBvdXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBhdl9ic2Zfc2VuZF9wYWNrZXQobHN0LT5ic2ZzW2xzdC0+aWR4XSwgcGt0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbHN0LT5pZHgrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZSBlbmQgb2YgZmlsdGVyIGNoYWluLCBicmVhayB0byByZXR1cm4gcmVzdWx0ICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYob3V0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGJzZl9saXN0X2Nsb3NlKEFWQlNGQ29udGV4dCAqYnNmKQoreworICAgIEJTRkxpc3RDb250ZXh0ICpsc3QgPSBic2YtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsc3QtPm5iX2JzZnM7ICsraSkKKyAgICAgICAgYXZfYnNmX2ZyZWUoJmxzdC0+YnNmc1tpXSk7CisgICAgYXZfZnJlZXAoJmxzdC0+YnNmcyk7CisgICAgYXZfZnJlZXAoJmxzdC0+aXRlbV9uYW1lKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmJzZl9saXN0X2l0ZW1fbmFtZSh2b2lkICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKm51bGxfZmlsdGVyX25hbWUgPSAibnVsbCI7CisgICAgQVZCU0ZDb250ZXh0ICpic2ZfY3R4ID0gY3R4OworICAgIEJTRkxpc3RDb250ZXh0ICpsc3QgPSBic2ZfY3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoIWxzdC0+bmJfYnNmcykKKyAgICAgICAgcmV0dXJuIG51bGxfZmlsdGVyX25hbWU7CisKKyAgICBpZiAoIWxzdC0+aXRlbV9uYW1lKSB7CisgICAgICAgIGludCBpOworICAgICAgICBBVkJQcmludCBicDsKKyAgICAgICAgYXZfYnByaW50X2luaXQoJmJwLCAxNiwgMTI4KTsKKworICAgICAgICBhdl9icHJpbnRmKCZicCwgImJzZl9saXN0KCIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbHN0LT5uYl9ic2ZzOyBpKyspCisgICAgICAgICAgICBhdl9icHJpbnRmKCZicCwgaSA/ICIsJXMiIDogIiVzIiwgbHN0LT5ic2ZzW2ldLT5maWx0ZXItPm5hbWUpOworICAgICAgICBhdl9icHJpbnRmKCZicCwgIikiKTsKKworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJwLCAmbHN0LT5pdGVtX25hbWUpOworICAgIH0KKworICAgIHJldHVybiBsc3QtPml0ZW1fbmFtZTsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYnNmX2xpc3RfY2xhc3MgPSB7CisgICAgICAgIC5jbGFzc19uYW1lID0gImJzZl9saXN0IiwKKyAgICAgICAgLml0ZW1fbmFtZSAgPSBic2ZfbGlzdF9pdGVtX25hbWUsCisgICAgICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfbGlzdF9ic2YgPSB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJic2ZfbGlzdCIsCisgICAgICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihCU0ZMaXN0Q29udGV4dCksCisgICAgICAgIC5wcml2X2NsYXNzICAgICA9ICZic2ZfbGlzdF9jbGFzcywKKyAgICAgICAgLmluaXQgICAgICAgICAgID0gYnNmX2xpc3RfaW5pdCwKKyAgICAgICAgLmZpbHRlciAgICAgICAgID0gYnNmX2xpc3RfZmlsdGVyLAorICAgICAgICAuY2xvc2UgICAgICAgICAgPSBic2ZfbGlzdF9jbG9zZSwKK307CisKK3N0cnVjdCBBVkJTRkxpc3QgeworICAgIEFWQlNGQ29udGV4dCAqKmJzZnM7CisgICAgaW50IG5iX2JzZnM7Cit9OworCitBVkJTRkxpc3QgKmF2X2JzZl9saXN0X2FsbG9jKHZvaWQpCit7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKEFWQlNGTGlzdCkpOworfQorCit2b2lkIGF2X2JzZl9saXN0X2ZyZWUoQVZCU0ZMaXN0ICoqbHN0KQoreworICAgIGludCBpOworCisgICAgaWYgKCEqbHN0KQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKCpsc3QpLT5uYl9ic2ZzOyArK2kpCisgICAgICAgIGF2X2JzZl9mcmVlKCYoKmxzdCktPmJzZnNbaV0pOworICAgIGF2X2ZyZWUoKCpsc3QpLT5ic2ZzKTsKKyAgICBhdl9mcmVlcChsc3QpOworfQorCitpbnQgYXZfYnNmX2xpc3RfYXBwZW5kKEFWQlNGTGlzdCAqbHN0LCBBVkJTRkNvbnRleHQgKmJzZikKK3sKKyAgICByZXR1cm4gYXZfZHluYXJyYXlfYWRkX25vZnJlZSgmbHN0LT5ic2ZzLCAmbHN0LT5uYl9ic2ZzLCBic2YpOworfQorCitpbnQgYXZfYnNmX2xpc3RfYXBwZW5kMihBVkJTRkxpc3QgKmxzdCwgY29uc3QgY2hhciAqYnNmX25hbWUsIEFWRGljdGlvbmFyeSAqKiBvcHRpb25zKQoreworICAgIGludCByZXQ7CisgICAgY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmZpbHRlcjsKKyAgICBBVkJTRkNvbnRleHQgKmJzZjsKKworICAgIGZpbHRlciA9IGF2X2JzZl9nZXRfYnlfbmFtZShic2ZfbmFtZSk7CisgICAgaWYgKCFmaWx0ZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JTRl9OT1RfRk9VTkQ7CisKKyAgICByZXQgPSBhdl9ic2ZfYWxsb2MoZmlsdGVyLCAmYnNmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChvcHRpb25zKSB7CisgICAgICAgIHJldCA9IGF2X29wdF9zZXRfZGljdDIoYnNmLCBvcHRpb25zLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICByZXQgPSBhdl9ic2ZfbGlzdF9hcHBlbmQobHN0LCBic2YpOworCitlbmQ6CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X2JzZl9mcmVlKCZic2YpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X2JzZl9saXN0X2ZpbmFsaXplKEFWQlNGTGlzdCAqKmxzdCwgQVZCU0ZDb250ZXh0ICoqYnNmKQoreworICAgIGludCByZXQgPSAwOworICAgIEJTRkxpc3RDb250ZXh0ICpjdHg7CisKKyAgICBpZiAoKCpsc3QpLT5uYl9ic2ZzID09IDEpIHsKKyAgICAgICAgKmJzZiA9ICgqbHN0KS0+YnNmc1swXTsKKyAgICAgICAgYXZfZnJlZXAoJigqbHN0KS0+YnNmcyk7CisgICAgICAgICgqbHN0KS0+bmJfYnNmcyA9IDA7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHJldCA9IGF2X2JzZl9hbGxvYygmZmZfbGlzdF9ic2YsIGJzZik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBjdHggPSAoKmJzZiktPnByaXZfZGF0YTsKKworICAgIGN0eC0+YnNmcyA9ICgqbHN0KS0+YnNmczsKKyAgICBjdHgtPm5iX2JzZnMgPSAoKmxzdCktPm5iX2JzZnM7CisKK2VuZDoKKyAgICBhdl9mcmVlcChsc3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYnNmX3BhcnNlX3NpbmdsZShjb25zdCBjaGFyICpzdHIsIEFWQlNGTGlzdCAqYnNmX2xzdCkKK3sKKyAgICBjaGFyICpic2ZfbmFtZSwgKmJzZl9vcHRpb25zX3N0ciwgKmJ1ZjsKKyAgICBBVkRpY3Rpb25hcnkgKmJzZl9vcHRpb25zID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICghKGJ1ZiA9IGF2X3N0cmR1cChzdHIpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGJzZl9uYW1lID0gYXZfc3RydG9rKGJ1ZiwgIj0iLCAmYnNmX29wdGlvbnNfc3RyKTsKKyAgICBpZiAoIWJzZl9uYW1lKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKGJzZl9vcHRpb25zX3N0cikgeworICAgICAgICByZXQgPSBhdl9kaWN0X3BhcnNlX3N0cmluZygmYnNmX29wdGlvbnMsIGJzZl9vcHRpb25zX3N0ciwgIj0iLCAiOiIsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHJldCA9IGF2X2JzZl9saXN0X2FwcGVuZDIoYnNmX2xzdCwgYnNmX25hbWUsICZic2Zfb3B0aW9ucyk7CisKKyAgICBhdl9kaWN0X2ZyZWUoJmJzZl9vcHRpb25zKTsKK2VuZDoKKyAgICBhdl9mcmVlKGJ1Zik7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X2JzZl9saXN0X3BhcnNlX3N0cihjb25zdCBjaGFyICpzdHIsIEFWQlNGQ29udGV4dCAqKmJzZl9sc3QpCit7CisgICAgQVZCU0ZMaXN0ICpsc3Q7CisgICAgY2hhciAqYnNmX3N0ciwgKmJ1ZiwgKmR1cCwgKnNhdmVwdHI7CisgICAgaW50IHJldDsKKworICAgIGlmICghc3RyKQorICAgICAgICByZXR1cm4gYXZfYnNmX2dldF9udWxsX2ZpbHRlcihic2ZfbHN0KTsKKworICAgIGxzdCA9IGF2X2JzZl9saXN0X2FsbG9jKCk7CisgICAgaWYgKCFsc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoIShkdXAgPSBidWYgPSBhdl9zdHJkdXAoc3RyKSkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBic2Zfc3RyID0gYXZfc3RydG9rKGJ1ZiwgIiwiLCAmc2F2ZXB0cik7CisgICAgICAgIGlmICghYnNmX3N0cikKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHJldCA9IGJzZl9wYXJzZV9zaW5nbGUoYnNmX3N0ciwgbHN0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICBidWYgPSBOVUxMOworICAgIH0KKworICAgIHJldCA9IGF2X2JzZl9saXN0X2ZpbmFsaXplKCZsc3QsIGJzZl9sc3QpOworZW5kOgorICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9ic2ZfbGlzdF9mcmVlKCZsc3QpOworICAgIGF2X2ZyZWUoZHVwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfYnNmX2dldF9udWxsX2ZpbHRlcihBVkJTRkNvbnRleHQgKipic2YpCit7CisgICAgcmV0dXJuIGF2X2JzZl9hbGxvYygmZmZfbGlzdF9ic2YsIGJzZik7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2JzZi5oIGIvbGliYXZjb2RlYy9ic2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjAzNWVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9ic2YuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19CU0ZfSAorI2RlZmluZSBBVkNPREVDX0JTRl9ICisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKy8qKgorICogQ2FsbGVkIGJ5IHRoZSBiaXRzdHJlYW0gZmlsdGVycyB0byBnZXQgdGhlIG5leHQgcGFja2V0IGZvciBmaWx0ZXJpbmcuCisgKiBUaGUgZmlsdGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlaXRoZXIgZnJlZWluZyB0aGUgcGFja2V0IG9yIHBhc3NpbmcgaXQgdG8gdGhlCisgKiBjYWxsZXIuCisgKi8KK2ludCBmZl9ic2ZfZ2V0X3BhY2tldChBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKipwa3QpOworCisvKioKKyAqIENhbGxlZCBieSBiaXRzdHJlYW0gZmlsdGVycyB0byBnZXQgcGFja2V0IGZvciBmaWx0ZXJpbmcuCisgKiBUaGUgcmVmZXJlbmNlIHRvIHBhY2tldCBpcyBtb3ZlZCB0byBwcm92aWRlZCBwYWNrZXQgc3RydWN0dXJlLgorICoKKyAqIEBwYXJhbSBjdHggcG9pbnRlciB0byBBVkJTRkNvbnRleHQgb2YgZmlsdGVyCisgKiBAcGFyYW0gcGt0IHBvaW50ZXIgdG8gcGFja2V0IHRvIG1vdmUgcmVmZXJlbmNlIHRvCisgKgorICogQHJldHVybiAwPj0gb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBpbiBjYXNlIG9mIGZhaWx1cmUKKyAqLworaW50IGZmX2JzZl9nZXRfcGFja2V0X3JlZihBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCk7CisKK2NvbnN0IEFWQ2xhc3MgKmZmX2JzZl9jaGlsZF9jbGFzc19uZXh0KGNvbnN0IEFWQ2xhc3MgKnByZXYpOworCisjZW5kaWYgLyogQVZDT0RFQ19CU0ZfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ieXRlc3RyZWFtLmggYi9saWJhdmNvZGVjL2J5dGVzdHJlYW0uaAppbmRleCA3YzA1ZWE2Li43YmU3ZmMyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2J5dGVzdHJlYW0uaAorKysgYi9saWJhdmNvZGVjL2J5dGVzdHJlYW0uaApAQCAtOTQsNyArOTQsNyBAQAogREVGKHVuc2lnbmVkIGludCwgYmUxNiwgMiwgQVZfUkIxNiwgQVZfV0IxNikKIERFRih1bnNpZ25lZCBpbnQsIGJ5dGUsIDEsIEFWX1JCOCAsIEFWX1dCOCkKIAotI2lmIEhBVkVfQklHRU5ESUFOCisjaWYgQVZfSEFWRV9CSUdFTkRJQU4KICMgICBkZWZpbmUgYnl0ZXN0cmVhbTJfZ2V0X25lMTYgIGJ5dGVzdHJlYW0yX2dldF9iZTE2CiAjICAgZGVmaW5lIGJ5dGVzdHJlYW0yX2dldF9uZTI0ICBieXRlc3RyZWFtMl9nZXRfYmUyNAogIyAgIGRlZmluZSBieXRlc3RyZWFtMl9nZXRfbmUzMiAgYnl0ZXN0cmVhbTJfZ2V0X2JlMzIKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvYzkzLmMgYi9saWJhdmNvZGVjL2M5My5jCmluZGV4IGZkMDI2YWMuLmI3MDg2NTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvYzkzLmMKKysrIGIvbGliYXZjb2RlYy9jOTMuYwpAQCAtMjY5LDQgKzI2OSw1IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKICAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2FiYWMuYyBiL2xpYmF2Y29kZWMvY2FiYWMuYwppbmRleCBhOWZhZmJkLi5lNTExMzlkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2NhYmFjLmMKKysrIGIvbGliYXZjb2RlYy9jYWJhYy5jCkBAIC0yOCwxMSArMjgsMTEgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgorCiAjaW5jbHVkZSAiY2FiYWMuaCIKICNpbmNsdWRlICJjYWJhY19mdW5jdGlvbnMuaCIKIAotY29uc3QgdWludDhfdCBmZl9oMjY0X2NhYmFjX3RhYmxlc1s1MTIgKyA0KjIqNjQgKyA0KjY0ICsgNjNdID0geworREVDTEFSRV9BU01fQUxJR05FRCgxLCBjb25zdCB1aW50OF90LCBmZl9oMjY0X2NhYmFjX3RhYmxlcylbNTEyICsgNCoyKjY0ICsgNCo2NCArIDYzXSA9IHsKICAgICA5LDgsNyw3LDYsNiw2LDYsNSw1LDUsNSw1LDUsNSw1LAogICAgIDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCiAgICAgMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywzLDMsMywKQEAgLTE1OSw3ICsxNTksNiBAQAogfTsKIAogLyoqCi0gKgogICogQHBhcmFtIGJ1Zl9zaXplIHNpemUgb2YgYnVmIGluIGJpdHMKICAqLwogdm9pZCBmZl9pbml0X2NhYmFjX2VuY29kZXIoQ0FCQUNDb250ZXh0ICpjLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSl7CkBAIC0xODMsNyArMTgyLDcgQEAKICNpZiBDQUJBQ19CSVRTID09IDE2CiAgICAgYy0+bG93ID0gICgqYy0+Ynl0ZXN0cmVhbSsrKTw8MTg7CiAgICAgYy0+bG93Kz0gICgqYy0+Ynl0ZXN0cmVhbSsrKTw8MTA7Ci0gICAgLy8gS2VlcCBvdXIgZmV0Y2hlcyBvbiBhIDItYnl0ZSBib3VuZHJ5IGFzIHRoaXMgc2hvdWxkIGF2b2lkIGV2ZXIgaGF2aW5nIHRvCisgICAgLy8gS2VlcCBvdXIgZmV0Y2hlcyBvbiBhIDItYnl0ZSBib3VuZGFyeSBhcyB0aGlzIHNob3VsZCBhdm9pZCBldmVyIGhhdmluZyB0bwogICAgIC8vIGRvIHVuYWxpZ25lZCBsb2FkcyBpZiB0aGUgY29tcGlsZXIgKG9yIGFzbSkgb3B0aW1pc2VzIHRoZSBkb3VibGUgYnl0ZQogICAgIC8vIGxvYWQgaW50byBhIHNpbmdsZSBpbnN0cnVjdGlvbgogICAgIGlmKCgodWludHB0cl90KWMtPmJ5dGVzdHJlYW0gJiAxKSA9PSAwKSB7CkBAIC0yMDEsMTUwICsyMDAsMyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICByZXR1cm4gMDsKIH0KLQotI2lmZGVmIFRFU1QKLSNkZWZpbmUgU0laRSAxMDI0MAotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLQotc3RhdGljIGlubGluZSB2b2lkIHB1dF9jYWJhY19iaXQoQ0FCQUNDb250ZXh0ICpjLCBpbnQgYil7Ci0gICAgcHV0X2JpdHMoJmMtPnBiLCAxLCBiKTsKLSAgICBmb3IoO2MtPm91dHN0YW5kaW5nX2NvdW50OyBjLT5vdXRzdGFuZGluZ19jb3VudC0tKXsKLSAgICAgICAgcHV0X2JpdHMoJmMtPnBiLCAxLCAxLWIpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlbm9ybV9jYWJhY19lbmNvZGVyKENBQkFDQ29udGV4dCAqYyl7Ci0gICAgd2hpbGUoYy0+cmFuZ2UgPCAweDEwMCl7Ci0gICAgICAgIC8vRklYTUUgb3B0aW1pemUKLSAgICAgICAgaWYoYy0+bG93PDB4MTAwKXsKLSAgICAgICAgICAgIHB1dF9jYWJhY19iaXQoYywgMCk7Ci0gICAgICAgIH1lbHNlIGlmKGMtPmxvdzwweDIwMCl7Ci0gICAgICAgICAgICBjLT5vdXRzdGFuZGluZ19jb3VudCsrOwotICAgICAgICAgICAgYy0+bG93IC09IDB4MTAwOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHB1dF9jYWJhY19iaXQoYywgMSk7Ci0gICAgICAgICAgICBjLT5sb3cgLT0gMHgyMDA7Ci0gICAgICAgIH0KLQotICAgICAgICBjLT5yYW5nZSs9IGMtPnJhbmdlOwotICAgICAgICBjLT5sb3cgKz0gYy0+bG93OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgcHV0X2NhYmFjKENBQkFDQ29udGV4dCAqYywgdWludDhfdCAqIGNvbnN0IHN0YXRlLCBpbnQgYml0KXsKLSAgICBpbnQgUmFuZ2VMUFM9IGZmX2gyNjRfbHBzX3JhbmdlWzIqKGMtPnJhbmdlJjB4QzApICsgKnN0YXRlXTsKLQotICAgIGlmKGJpdCA9PSAoKCpzdGF0ZSkmMSkpewotICAgICAgICBjLT5yYW5nZSAtPSBSYW5nZUxQUzsKLSAgICAgICAgKnN0YXRlICAgID0gZmZfaDI2NF9tbHBzX3N0YXRlWzEyOCArICpzdGF0ZV07Ci0gICAgfWVsc2V7Ci0gICAgICAgIGMtPmxvdyArPSBjLT5yYW5nZSAtIFJhbmdlTFBTOwotICAgICAgICBjLT5yYW5nZSA9IFJhbmdlTFBTOwotICAgICAgICAqc3RhdGU9IGZmX2gyNjRfbWxwc19zdGF0ZVsxMjcgLSAqc3RhdGVdOwotICAgIH0KLQotICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOwotfQotCi0vKioKLSAqIEBwYXJhbSBiaXQgMCAtPiB3cml0ZSB6ZXJvIGJpdCwgIT0wIHdyaXRlIG9uZSBiaXQKLSAqLwotc3RhdGljIHZvaWQgcHV0X2NhYmFjX2J5cGFzcyhDQUJBQ0NvbnRleHQgKmMsIGludCBiaXQpewotICAgIGMtPmxvdyArPSBjLT5sb3c7Ci0KLSAgICBpZihiaXQpewotICAgICAgICBjLT5sb3cgKz0gYy0+cmFuZ2U7Ci0gICAgfQotLy9GSVhNRSBvcHRpbWl6ZQotICAgIGlmKGMtPmxvdzwweDIwMCl7Ci0gICAgICAgIHB1dF9jYWJhY19iaXQoYywgMCk7Ci0gICAgfWVsc2UgaWYoYy0+bG93PDB4NDAwKXsKLSAgICAgICAgYy0+b3V0c3RhbmRpbmdfY291bnQrKzsKLSAgICAgICAgYy0+bG93IC09IDB4MjAwOwotICAgIH1lbHNlewotICAgICAgICBwdXRfY2FiYWNfYml0KGMsIDEpOwotICAgICAgICBjLT5sb3cgLT0gMHg0MDA7Ci0gICAgfQotfQotCi0vKioKLSAqCi0gKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgotICovCi1zdGF0aWMgaW50IHB1dF9jYWJhY190ZXJtaW5hdGUoQ0FCQUNDb250ZXh0ICpjLCBpbnQgYml0KXsKLSAgICBjLT5yYW5nZSAtPSAyOwotCi0gICAgaWYoIWJpdCl7Ci0gICAgICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOwotICAgIH1lbHNlewotICAgICAgICBjLT5sb3cgKz0gYy0+cmFuZ2U7Ci0gICAgICAgIGMtPnJhbmdlPSAyOwotCi0gICAgICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOwotCi0gICAgICAgIGF2X2Fzc2VydDAoYy0+bG93IDw9IDB4MUZGKTsKLSAgICAgICAgcHV0X2NhYmFjX2JpdChjLCBjLT5sb3c+PjkpOwotICAgICAgICBwdXRfYml0cygmYy0+cGIsIDIsICgoYy0+bG93Pj43KSYzKXwxKTsKLQotICAgICAgICBmbHVzaF9wdXRfYml0cygmYy0+cGIpOyAvL0ZJWE1FIEZJWE1FIEZJWE1FIFhYWCB3cm9uZwotICAgIH0KLQotICAgIHJldHVybiAocHV0X2JpdHNfY291bnQoJmMtPnBiKSs3KT4+MzsKLX0KLQotaW50IG1haW4odm9pZCl7Ci0gICAgQ0FCQUNDb250ZXh0IGM7Ci0gICAgdWludDhfdCBiWzkqU0laRV07Ci0gICAgdWludDhfdCByWzkqU0laRV07Ci0gICAgaW50IGksIHJldCA9IDA7Ci0gICAgdWludDhfdCBzdGF0ZVsxMF09IHswfTsKLSAgICBBVkxGRyBwcm5nOwotCi0gICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOwotICAgIGZmX2luaXRfY2FiYWNfZW5jb2RlcigmYywgYiwgU0laRSk7Ci0KLSAgICBmb3IoaT0wOyBpPFNJWkU7IGkrKyl7Ci0gICAgICAgIGlmKDIqaTxTSVpFKSByW2ldID0gYXZfbGZnX2dldCgmcHJuZykgJSA3OwotICAgICAgICBlbHNlICAgICAgICAgcltpXSA9IChpPj44KSYxOwotICAgIH0KLQotICAgIGZvcihpPTA7IGk8U0laRTsgaSsrKXsKLSAgICAgICAgcHV0X2NhYmFjX2J5cGFzcygmYywgcltpXSYxKTsKLSAgICB9Ci0KLSAgICBmb3IoaT0wOyBpPFNJWkU7IGkrKyl7Ci0gICAgICAgIHB1dF9jYWJhYygmYywgc3RhdGUsIHJbaV0mMSk7Ci0gICAgfQotCi0gICAgaT0gcHV0X2NhYmFjX3Rlcm1pbmF0ZSgmYywgMSk7Ci0gICAgYltpKytdID0gYXZfbGZnX2dldCgmcHJuZyk7Ci0gICAgYltpICBdID0gYXZfbGZnX2dldCgmcHJuZyk7Ci0KLSAgICBmZl9pbml0X2NhYmFjX2RlY29kZXIoJmMsIGIsIFNJWkUpOwotCi0gICAgbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKLQotICAgIGZvcihpPTA7IGk8U0laRTsgaSsrKXsKLSAgICAgICAgaWYoIChyW2ldJjEpICE9IGdldF9jYWJhY19ieXBhc3MoJmMpICkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNBQkFDIGJ5cGFzcyBmYWlsdXJlIGF0ICVkXG4iLCBpKTsKLSAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IoaT0wOyBpPFNJWkU7IGkrKyl7Ci0gICAgICAgIGlmKCAocltpXSYxKSAhPSBnZXRfY2FiYWNfbm9pbmxpbmUoJmMsIHN0YXRlKSApIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDQUJBQyBmYWlsdXJlIGF0ICVkXG4iLCBpKTsKLSAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYoIWdldF9jYWJhY190ZXJtaW5hdGUoJmMpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJ3aGVyZSdzIHRoZSBUZXJtaW5hdG9yP1xuIik7Ci0gICAgICAgIHJldCA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2FiYWNfZnVuY3Rpb25zLmggYi9saWJhdmNvZGVjL2NhYmFjX2Z1bmN0aW9ucy5oCmluZGV4IGNiYjE4NmIuLmZlNzJhODIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY2FiYWNfZnVuY3Rpb25zLmgKKysrIGIvbGliYXZjb2RlYy9jYWJhY19mdW5jdGlvbnMuaApAQCAtMTcyLDcgKzE3Miw2IEBACiAjZW5kaWYKIAogLyoqCi0gKgogICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgMCBpZiBubyBlbmQKICAqLwogI2lmbmRlZiBnZXRfY2FiYWNfdGVybWluYXRlCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2NhdnMuYyBiL2xpYmF2Y29kZWMvY2F2cy5jCmluZGV4IDEwYTI1ZDguLmJhMmI2ZWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY2F2cy5jCisrKyBiL2xpYmF2Y29kZWMvY2F2cy5jCkBAIC0xMDUsNyArMTA1LDYgQEAKICAqIHwgNiB8IDcgfAogICogMSAgIDMgICB8CiAgKiAtLS0tLS0tLS0KLSAqCiAgKi8KIHZvaWQgZmZfY2F2c19maWx0ZXIoQVZTQ29udGV4dCAqaCwgZW51bSBjYXZzX21iIG1iX3R5cGUpCiB7CkBAIC0yNTcsNyArMjU2LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGludHJhX3ByZWRfdmVydCh1aW50OF90ICpkLCB1aW50OF90ICp0b3AsIHVpbnQ4X3QgKmxlZnQsIGludCBzdHJpZGUpCitzdGF0aWMgdm9pZCBpbnRyYV9wcmVkX3ZlcnQodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCB5OwogICAgIHVpbnQ2NF90IGEgPSBBVl9STjY0KCZ0b3BbMV0pOwpAQCAtMjY1LDcgKzI2NCw3IEBACiAgICAgICAgICooKHVpbnQ2NF90ICopKGQgKyB5ICogc3RyaWRlKSkgPSBhOwogfQogCi1zdGF0aWMgdm9pZCBpbnRyYV9wcmVkX2hvcml6KHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgaW50IHN0cmlkZSkKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRfaG9yaXoodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCB5OwogICAgIHVpbnQ2NF90IGE7CkBAIC0yNzUsNyArMjc0LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGludHJhX3ByZWRfZGNfMTI4KHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgaW50IHN0cmlkZSkKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRfZGNfMTI4KHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgcHRyZGlmZl90IHN0cmlkZSkKIHsKICAgICBpbnQgeTsKICAgICB1aW50NjRfdCBhID0gMHg4MDgwODA4MDgwODA4MDgwVUxMOwpAQCAtMjgzLDcgKzI4Miw3IEBACiAgICAgICAgICooKHVpbnQ2NF90ICopKGQgKyB5ICogc3RyaWRlKSkgPSBhOwogfQogCi1zdGF0aWMgdm9pZCBpbnRyYV9wcmVkX3BsYW5lKHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgaW50IHN0cmlkZSkKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRfcGxhbmUodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCB4LCB5LCBpYTsKICAgICBpbnQgaWggPSAwOwpAQCAtMzA1LDcgKzMwNCw3IEBACiAjZGVmaW5lIExPV1BBU1MoQVJSQVksIElOREVYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgKChBUlJBWVsoSU5ERVgpIC0gMV0gKyAyICogQVJSQVlbKElOREVYKV0gKyBBUlJBWVsoSU5ERVgpICsgMV0gKyAyKSA+PiAyKQogCi1zdGF0aWMgdm9pZCBpbnRyYV9wcmVkX2xwKHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgaW50IHN0cmlkZSkKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRfbHAodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCB4LCB5OwogICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCkBAIC0zMTMsNyArMzEyLDcgQEAKICAgICAgICAgICAgIGRbeSAqIHN0cmlkZSArIHhdID0gKExPV1BBU1ModG9wLCB4ICsgMSkgKyBMT1dQQVNTKGxlZnQsIHkgKyAxKSkgPj4gMTsKIH0KIAotc3RhdGljIHZvaWQgaW50cmFfcHJlZF9kb3duX2xlZnQodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBpbnQgc3RyaWRlKQorc3RhdGljIHZvaWQgaW50cmFfcHJlZF9kb3duX2xlZnQodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCB4LCB5OwogICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCkBAIC0zMjEsNyArMzIwLDcgQEAKICAgICAgICAgICAgIGRbeSAqIHN0cmlkZSArIHhdID0gKExPV1BBU1ModG9wLCB4ICsgeSArIDIpICsgTE9XUEFTUyhsZWZ0LCB4ICsgeSArIDIpKSA+PiAxOwogfQogCi1zdGF0aWMgdm9pZCBpbnRyYV9wcmVkX2Rvd25fcmlnaHQodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBpbnQgc3RyaWRlKQorc3RhdGljIHZvaWQgaW50cmFfcHJlZF9kb3duX3JpZ2h0KHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgcHRyZGlmZl90IHN0cmlkZSkKIHsKICAgICBpbnQgeCwgeTsKICAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKQpAQCAtMzM0LDcgKzMzMyw3IEBACiAgICAgICAgICAgICAgICAgZFt5ICogc3RyaWRlICsgeF0gPSBMT1dQQVNTKGxlZnQsIHkgLSB4KTsKIH0KIAotc3RhdGljIHZvaWQgaW50cmFfcHJlZF9scF9sZWZ0KHVpbnQ4X3QgKmQsIHVpbnQ4X3QgKnRvcCwgdWludDhfdCAqbGVmdCwgaW50IHN0cmlkZSkKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRfbHBfbGVmdCh1aW50OF90ICpkLCB1aW50OF90ICp0b3AsIHVpbnQ4X3QgKmxlZnQsIHB0cmRpZmZfdCBzdHJpZGUpCiB7CiAgICAgaW50IHgsIHk7CiAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKQEAgLTM0Miw3ICszNDEsNyBAQAogICAgICAgICAgICAgZFt5ICogc3RyaWRlICsgeF0gPSBMT1dQQVNTKGxlZnQsIHkgKyAxKTsKIH0KIAotc3RhdGljIHZvaWQgaW50cmFfcHJlZF9scF90b3AodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBpbnQgc3RyaWRlKQorc3RhdGljIHZvaWQgaW50cmFfcHJlZF9scF90b3AodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCB4LCB5OwogICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCkBAIC01MzgsOCArNTM3LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2FsZV9tdihBVlNDb250ZXh0ICpoLCBpbnQgKmRfeCwgaW50ICpkX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F2c192ZWN0b3IgKnNyYywgaW50IGRpc3RwKQogewotICAgIGludCBkZW4gPSBoLT5zY2FsZV9kZW5bRkZNQVgoc3JjLT5yZWYsIDApXTsKLQorICAgIGludDY0X3QgZGVuID0gaC0+c2NhbGVfZGVuW0ZGTUFYKHNyYy0+cmVmLCAwKV07CiAgICAgKmRfeCA9IChzcmMtPnggKiBkaXN0cCAqIGRlbiArIDI1NiArIEZGX1NJR05CSVQoc3JjLT54KSkgPj4gOTsKICAgICAqZF95ID0gKHNyYy0+eSAqIGRpc3RwICogZGVuICsgMjU2ICsgRkZfU0lHTkJJVChzcmMtPnkpKSA+PiA5OwogfQpAQCAtNjE0LDggKzYxMiwxNSBAQAogICAgICAgICBtdl9wcmVkX21lZGlhbihoLCBtdlAsIG12QSwgbXZCLCBtdkMpOwogCiAgICAgaWYgKG1vZGUgPCBNVl9QUkVEX1BTS0lQKSB7Ci0gICAgICAgIG12UC0+eCArPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7Ci0gICAgICAgIG12UC0+eSArPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgICAgIGludCBteCA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKSArICh1bnNpZ25lZCltdlAtPng7CisgICAgICAgIGludCBteSA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKSArICh1bnNpZ25lZCltdlAtPnk7CisKKyAgICAgICAgaWYgKG14ICE9IChpbnQxNl90KW14IHx8IG15ICE9IChpbnQxNl90KW15KSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1WICVkICVkIG91dCBvZiBzdXBwb3J0ZWQgcmFuZ2VcbiIsIG14LCBteSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdlAtPnggPSBteDsKKyAgICAgICAgICAgIG12UC0+eSA9IG15OworICAgICAgICB9CiAgICAgfQogICAgIHNldF9tdnMobXZQLCBzaXplKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2F2cy5oIGIvbGliYXZjb2RlYy9jYXZzLmgKaW5kZXggZmI5ZGYxNS4uNmJmYjIyYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jYXZzLmgKKysrIGIvbGliYXZjb2RlYy9jYXZzLmgKQEAgLTIyNyw4ICsyMjcsOCBAQAogICAgIHVpbnQ4X3QgaW50ZXJuX2JvcmRlcl95WzI2XTsKICAgICB1aW50OF90IHRvcGxlZnRfYm9yZGVyX3ksIHRvcGxlZnRfYm9yZGVyX3UsIHRvcGxlZnRfYm9yZGVyX3Y7CiAKLSAgICB2b2lkICgqaW50cmFfcHJlZF9sWzhdKSh1aW50OF90ICpkLHVpbnQ4X3QgKnRvcCx1aW50OF90ICpsZWZ0LGludCBzdHJpZGUpOwotICAgIHZvaWQgKCppbnRyYV9wcmVkX2NbN10pKHVpbnQ4X3QgKmQsdWludDhfdCAqdG9wLHVpbnQ4X3QgKmxlZnQsaW50IHN0cmlkZSk7CisgICAgdm9pZCAoKmludHJhX3ByZWRfbFs4XSkodWludDhfdCAqZCwgdWludDhfdCAqdG9wLCB1aW50OF90ICpsZWZ0LCBwdHJkaWZmX3Qgc3RyaWRlKTsKKyAgICB2b2lkICgqaW50cmFfcHJlZF9jWzddKSh1aW50OF90ICpkLCB1aW50OF90ICp0b3AsIHVpbnQ4X3QgKmxlZnQsIHB0cmRpZmZfdCBzdHJpZGUpOwogICAgIHVpbnQ4X3QgKmNvbF90eXBlX2Jhc2U7CiAKICAgICAvKiBzY2FsaW5nIGZhY3RvcnMgZm9yIE1WIHByZWRpY3Rpb24gKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2F2c2RlYy5jIGIvbGliYXZjb2RlYy9jYXZzZGVjLmMKaW5kZXggNzBhYzZmOC4uNWYzYjM1NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jYXZzZGVjLmMKKysrIGIvbGliYXZjb2RlYy9jYXZzZGVjLmMKQEAgLTQ2NSw3ICs0NjUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdnNfdmVjdG9yICpjb2xfbXYpCiB7CiAgICAgY2F2c192ZWN0b3IgKnBtdl9idyA9IHBtdl9mdyArIE1WX0JXRF9PRkZTOwotICAgIGludCBkZW4gPSBoLT5kaXJlY3RfZGVuW2NvbF9tdi0+cmVmXTsKKyAgICB1bnNpZ25lZCBkZW4gPSBoLT5kaXJlY3RfZGVuW2NvbF9tdi0+cmVmXTsKICAgICBpbnQgbSA9IEZGX1NJR05CSVQoY29sX212LT54KTsKIAogICAgIHBtdl9mdy0+ZGlzdCA9IGgtPmRpc3RbMV07CkBAIC01NDUsNyArNTQ1LDcgQEAKICAqLwogc3RhdGljIGludCBkZWNvZGVfcmVzaWR1YWxfYmxvY2soQVZTQ29udGV4dCAqaCwgR2V0Qml0Q29udGV4dCAqZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGVjXzJkdmxjICpyLCBpbnQgZXNjX2dvbG9tYl9vcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxcCwgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHFwLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUpCiB7CiAgICAgaW50IGksIGVzY19jb2RlLCBsZXZlbCwgbWFzaywgcmV0OwogICAgIHVuc2lnbmVkIGludCBsZXZlbF9jb2RlLCBydW47CkBAIC01OTEsMTQgKzU5MSwyMSBAQAogfQogCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkZWNvZGVfcmVzaWR1YWxfY2hyb21hKEFWU0NvbnRleHQgKmgpCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfcmVzaWR1YWxfY2hyb21hKEFWU0NvbnRleHQgKmgpCiB7Ci0gICAgaWYgKGgtPmNicCAmICgxIDw8IDQpKQotICAgICAgICBkZWNvZGVfcmVzaWR1YWxfYmxvY2soaCwgJmgtPmdiLCBjaHJvbWFfZGVjLCAwLAorICAgIGlmIChoLT5jYnAgJiAoMSA8PCA0KSkgeworICAgICAgICBpbnQgcmV0ID0gZGVjb2RlX3Jlc2lkdWFsX2Jsb2NrKGgsICZoLT5nYiwgY2hyb21hX2RlYywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NhdnNfY2hyb21hX3FwW2gtPnFwXSwgaC0+Y3UsIGgtPmNfc3RyaWRlKTsKLSAgICBpZiAoaC0+Y2JwICYgKDEgPDwgNSkpCi0gICAgICAgIGRlY29kZV9yZXNpZHVhbF9ibG9jayhoLCAmaC0+Z2IsIGNocm9tYV9kZWMsIDAsCisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKGgtPmNicCAmICgxIDw8IDUpKSB7CisgICAgICAgIGludCByZXQgPSBkZWNvZGVfcmVzaWR1YWxfYmxvY2soaCwgJmgtPmdiLCBjaHJvbWFfZGVjLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfY2F2c19jaHJvbWFfcXBbaC0+cXBdLCBoLT5jdiwgaC0+Y19zdHJpZGUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfcmVzaWR1YWxfaW50ZXIoQVZTQ29udGV4dCAqaCkKQEAgLTYxNSw3ICs2MjIsNyBAQAogCiAgICAgLyogZ2V0IHF1YW50aXplciAqLwogICAgIGlmIChoLT5jYnAgJiYgIWgtPnFwX2ZpeGVkKQotICAgICAgICBoLT5xcCA9IChoLT5xcCArIGdldF9zZV9nb2xvbWIoJmgtPmdiKSkgJiA2MzsKKyAgICAgICAgaC0+cXAgPSAoaC0+cXAgKyAodW5zaWduZWQpZ2V0X3NlX2dvbG9tYigmaC0+Z2IpKSAmIDYzOwogICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDQ7IGJsb2NrKyspCiAgICAgICAgIGlmIChoLT5jYnAgJiAoMSA8PCBibG9jaykpCiAgICAgICAgICAgICBkZWNvZGVfcmVzaWR1YWxfYmxvY2soaCwgJmgtPmdiLCBpbnRlcl9kZWMsIDAsIGgtPnFwLApAQCAtNjQ5LDYgKzY1Niw3IEBACiAgICAgdWludDhfdCB0b3BbMThdOwogICAgIHVpbnQ4X3QgKmxlZnQgPSBOVUxMOwogICAgIHVpbnQ4X3QgKmQ7CisgICAgaW50IHJldDsKIAogICAgIGZmX2NhdnNfaW5pdF9tYihoKTsKIApAQCAtNjg0LDcgKzY5Miw3IEBACiAgICAgfQogICAgIGgtPmNicCA9IGNicF90YWJbY2JwX2NvZGVdWzBdOwogICAgIGlmIChoLT5jYnAgJiYgIWgtPnFwX2ZpeGVkKQotICAgICAgICBoLT5xcCA9IChoLT5xcCArIGdldF9zZV9nb2xvbWIoZ2IpKSAmIDYzOyAvL3FwX2RlbHRhCisgICAgICAgIGgtPnFwID0gKGgtPnFwICsgKHVuc2lnbmVkKWdldF9zZV9nb2xvbWIoZ2IpKSAmIDYzOyAvL3FwX2RlbHRhCiAKICAgICAvKiBsdW1hIGludHJhIHByZWRpY3Rpb24gaW50ZXJsZWF2ZWQgd2l0aCByZXNpZHVhbCBkZWNvZGUvdHJhbnNmb3JtL2FkZCAqLwogICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDQ7IGJsb2NrKyspIHsKQEAgLTY5Miw4ICs3MDAsMTEgQEAKICAgICAgICAgZmZfY2F2c19sb2FkX2ludHJhX3ByZWRfbHVtYShoLCB0b3AsICZsZWZ0LCBibG9jayk7CiAgICAgICAgIGgtPmludHJhX3ByZWRfbFtoLT5wcmVkX21vZGVfWVtzY2FuM3gzW2Jsb2NrXV1dCiAgICAgICAgICAgICAoZCwgdG9wLCBsZWZ0LCBoLT5sX3N0cmlkZSk7Ci0gICAgICAgIGlmIChoLT5jYnAgJiAoMTw8YmxvY2spKQotICAgICAgICAgICAgZGVjb2RlX3Jlc2lkdWFsX2Jsb2NrKGgsIGdiLCBpbnRyYV9kZWMsIDEsIGgtPnFwLCBkLCBoLT5sX3N0cmlkZSk7CisgICAgICAgIGlmIChoLT5jYnAgJiAoMTw8YmxvY2spKSB7CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfcmVzaWR1YWxfYmxvY2soaCwgZ2IsIGludHJhX2RlYywgMSwgaC0+cXAsIGQsIGgtPmxfc3RyaWRlKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBjaHJvbWEgaW50cmEgcHJlZGljdGlvbiAqLwpAQCAtNzAzLDcgKzcxNCw5IEBACiAgICAgaC0+aW50cmFfcHJlZF9jW3ByZWRfbW9kZV91dl0oaC0+Y3YsICZoLT50b3BfYm9yZGVyX3ZbaC0+bWJ4ICogMTBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmxlZnRfYm9yZGVyX3YsIGgtPmNfc3RyaWRlKTsKIAotICAgIGRlY29kZV9yZXNpZHVhbF9jaHJvbWEoaCk7CisgICAgcmV0ID0gZGVjb2RlX3Jlc2lkdWFsX2Nocm9tYShoKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICBmZl9jYXZzX2ZpbHRlcihoLCBJXzhYOCk7CiAgICAgc2V0X212X2ludHJhKGgpOwogICAgIHJldHVybiAwOwpAQCAtMTAzMSw2ICsxMDQ0LDEwIEBACiAgICAgaC0+c2NhbGVfZGVuWzFdID0gaC0+ZGlzdFsxXSA/IDUxMi9oLT5kaXN0WzFdIDogMDsKICAgICBpZiAoaC0+Y3VyLmYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgewogICAgICAgICBoLT5zeW1fZmFjdG9yID0gaC0+ZGlzdFswXSAqIGgtPnNjYWxlX2RlblsxXTsKKyAgICAgICAgaWYgKEZGQUJTKGgtPnN5bV9mYWN0b3IpID4gMzI3NjgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3ltX2ZhY3RvciAlZCB0b28gbGFyZ2VcbiIsIGgtPnN5bV9mYWN0b3IpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBoLT5kaXJlY3RfZGVuWzBdID0gaC0+ZGlzdFswXSA/IDE2Mzg0IC8gaC0+ZGlzdFswXSA6IDA7CiAgICAgICAgIGgtPmRpcmVjdF9kZW5bMV0gPSBoLT5kaXN0WzFdID8gMTYzODQgLyBoLT5kaXN0WzFdIDogMDsKQEAgLTEwNjMsMTMgKzEwODAsMjIgQEAKICAgICBpZiAoIWgtPmxvb3BfZmlsdGVyX2Rpc2FibGUgJiYgZ2V0X2JpdHMxKCZoLT5nYikpIHsKICAgICAgICAgaC0+YWxwaGFfb2Zmc2V0ICAgICAgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKICAgICAgICAgaC0+YmV0YV9vZmZzZXQgICAgICAgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgaWYgKCAgIGgtPmFscGhhX29mZnNldCA8IC02NCB8fCBoLT5hbHBoYV9vZmZzZXQgPiA2NAorICAgICAgICAgICAgfHwgaC0+IGJldGFfb2Zmc2V0IDwgLTY0IHx8IGgtPiBiZXRhX29mZnNldCA+IDY0KSB7CisgICAgICAgICAgICBoLT5hbHBoYV9vZmZzZXQgPSBoLT5iZXRhX29mZnNldCAgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBoLT5hbHBoYV9vZmZzZXQgPSBoLT5iZXRhX29mZnNldCAgPSAwOwogICAgIH0KKworICAgIHJldCA9IDA7CiAgICAgaWYgKGgtPmN1ci5mLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKICAgICAgICAgZG8gewogICAgICAgICAgICAgY2hlY2tfZm9yX3NsaWNlKGgpOwotICAgICAgICAgICAgZGVjb2RlX21iX2koaCwgMCk7CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfbWJfaShoLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9IHdoaWxlIChmZl9jYXZzX25leHRfbWIoaCkpOwogICAgIH0gZWxzZSBpZiAoaC0+Y3VyLmYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgewogICAgICAgICBkbyB7CkBAIC0xMDgyLDEwICsxMTA4LDEyIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1iX3R5cGUgPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyBQX1NLSVAgKyBoLT5za2lwX21vZGVfZmxhZzsKICAgICAgICAgICAgICAgICBpZiAobWJfdHlwZSA+IFBfOFg4KQotICAgICAgICAgICAgICAgICAgICBkZWNvZGVfbWJfaShoLCBtYl90eXBlIC0gUF84WDggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZGVjb2RlX21iX2koaCwgbWJfdHlwZSAtIFBfOFg4IC0gMSk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBkZWNvZGVfbWJfcChoLCBtYl90eXBlKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9IHdoaWxlIChmZl9jYXZzX25leHRfbWIoaCkpOwogICAgIH0gZWxzZSB7IC8qIEFWX1BJQ1RVUkVfVFlQRV9CICovCiAgICAgICAgIGRvIHsKQEAgLTEwOTQsMjIgKzExMjIsMjUgQEAKICAgICAgICAgICAgIGlmIChoLT5za2lwX21vZGVfZmxhZyAmJiAoc2tpcF9jb3VudCA8IDApKQogICAgICAgICAgICAgICAgIHNraXBfY291bnQgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CiAgICAgICAgICAgICBpZiAoaC0+c2tpcF9tb2RlX2ZsYWcgJiYgc2tpcF9jb3VudC0tKSB7Ci0gICAgICAgICAgICAgICAgZGVjb2RlX21iX2IoaCwgQl9TS0lQKTsKKyAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfbWJfYihoLCBCX1NLSVApOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtYl90eXBlID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpICsgQl9TS0lQICsgaC0+c2tpcF9tb2RlX2ZsYWc7CiAgICAgICAgICAgICAgICAgaWYgKG1iX3R5cGUgPiBCXzhYOCkKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlX21iX2koaCwgbWJfdHlwZSAtIEJfOFg4IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZV9tYl9pKGgsIG1iX3R5cGUgLSBCXzhYOCAtIDEpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlX21iX2IoaCwgbWJfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZV9tYl9iKGgsIG1iX3R5cGUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gd2hpbGUgKGZmX2NhdnNfbmV4dF9tYihoKSk7CiAgICAgfQotICAgIGlmIChoLT5jdXIuZi0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgZW1tc19jKCk7CisgICAgaWYgKHJldCA+PSAwICYmIGgtPmN1ci5mLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKICAgICAgICAgYXZfZnJhbWVfdW5yZWYoaC0+RFBCWzFdLmYpOwogICAgICAgICBGRlNXQVAoQVZTRnJhbWUsIGgtPmN1ciwgaC0+RFBCWzFdKTsKICAgICAgICAgRkZTV0FQKEFWU0ZyYW1lLCBoLT5EUEJbMF0sIGgtPkRQQlsxXSk7CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiByZXQ7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTIxNyw2ICsxMjQ4LDggQEAKICAgICAgICAgICAgICAgICBoLT5nb3Rfa2V5ZnJhbWUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIFBJQ19QQl9TVEFSVF9DT0RFOgorICAgICAgICAgICAgaWYgKCpnb3RfZnJhbWUpCisgICAgICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYoZGF0YSk7CiAgICAgICAgICAgICAqZ290X2ZyYW1lID0gMDsKICAgICAgICAgICAgIGlmICghaC0+Z290X2tleWZyYW1lKQogICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jYXZzZHNwLmMgYi9saWJhdmNvZGVjL2NhdnNkc3AuYwppbmRleCA5MWY2ZDczLi45MGE2N2U5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2NhdnNkc3AuYworKysgYi9saWJhdmNvZGVjL2NhdnNkc3AuYwpAQCAtNDIsNyArNDIsOCBAQAogI2RlZmluZSBRMSBwMF9wWyAxKnN0cmlkZV0KICNkZWZpbmUgUTIgcDBfcFsgMipzdHJpZGVdCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsb29wX2ZpbHRlcl9sMih1aW50OF90ICpwMF9wLGludCBzdHJpZGUsaW50IGFscGhhLCBpbnQgYmV0YSkgeworc3RhdGljIGlubGluZSB2b2lkIGxvb3BfZmlsdGVyX2wyKHVpbnQ4X3QgKnAwX3AsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpCit7CiAgICAgaW50IHAwID0gUDA7CiAgICAgaW50IHEwID0gUTA7CiAKQEAgLTYyLDcgKzYzLDggQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsb29wX2ZpbHRlcl9sMSh1aW50OF90ICpwMF9wLCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMpIHsKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb29wX2ZpbHRlcl9sMSh1aW50OF90ICpwMF9wLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMpCit7CiAgICAgaW50IHAwID0gUDA7CiAgICAgaW50IHEwID0gUTA7CiAKQEAgLTgxLDcgKzgzLDggQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsb29wX2ZpbHRlcl9jMih1aW50OF90ICpwMF9wLGludCBzdHJpZGUsaW50IGFscGhhLCBpbnQgYmV0YSkgeworc3RhdGljIGlubGluZSB2b2lkIGxvb3BfZmlsdGVyX2MyKHVpbnQ4X3QgKnAwX3AsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEpCit7CiAgICAgaW50IHAwID0gUDA7CiAgICAgaW50IHEwID0gUTA7CiAKQEAgLTk5LDggKzEwMiw5IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbG9vcF9maWx0ZXJfYzEodWludDhfdCAqcDBfcCxpbnQgc3RyaWRlLGludCBhbHBoYSwgaW50IGJldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRjKSB7CitzdGF0aWMgaW5saW5lIHZvaWQgbG9vcF9maWx0ZXJfYzEodWludDhfdCAqcDBfcCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGMpCit7CiAgICAgaWYoYWJzKFAwLVEwKTxhbHBoYSAmJiBhYnMoUDEtUDApPGJldGEgJiYgYWJzKFExLVEwKTxiZXRhKSB7CiAgICAgICAgIGludCBkZWx0YSA9IGF2X2NsaXAoKChRMC1QMCkqMytQMS1RMSs0KT4+MywgLXRjLCB0Yyk7CiAgICAgICAgIFAwID0gYXZfY2xpcF91aW50OChQMCtkZWx0YSk7CkBAIC0xMTUsOCArMTE5LDkgQEAKICN1bmRlZiBRMQogI3VuZGVmIFEyCiAKLXN0YXRpYyB2b2lkIGNhdnNfZmlsdGVyX2x2X2ModWludDhfdCAqZCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50IHRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJzMSwgaW50IGJzMikgeworc3RhdGljIHZvaWQgY2F2c19maWx0ZXJfbHZfYyh1aW50OF90ICpkLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiczEsIGludCBiczIpCit7CiAgICAgaW50IGk7CiAgICAgaWYoYnMxPT0yKQogICAgICAgICBmb3IoaT0wO2k8MTY7aSsrKQpAQCAtMTMxLDggKzEzNiw5IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjYXZzX2ZpbHRlcl9saF9jKHVpbnQ4X3QgKmQsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludCB0YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiczEsIGludCBiczIpIHsKK3N0YXRpYyB2b2lkIGNhdnNfZmlsdGVyX2xoX2ModWludDhfdCAqZCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50IHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnMxLCBpbnQgYnMyKQorewogICAgIGludCBpOwogICAgIGlmKGJzMT09MikKICAgICAgICAgZm9yKGk9MDtpPDE2O2krKykKQEAgLTE0Nyw4ICsxNTMsOSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2F2c19maWx0ZXJfY3ZfYyh1aW50OF90ICpkLCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnMxLCBpbnQgYnMyKSB7CitzdGF0aWMgdm9pZCBjYXZzX2ZpbHRlcl9jdl9jKHVpbnQ4X3QgKmQsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludCB0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJzMSwgaW50IGJzMikKK3sKICAgICBpbnQgaTsKICAgICBpZihiczE9PTIpCiAgICAgICAgIGZvcihpPTA7aTw4O2krKykKQEAgLTE2Myw4ICsxNzAsOSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2F2c19maWx0ZXJfY2hfYyh1aW50OF90ICpkLCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnMxLCBpbnQgYnMyKSB7CitzdGF0aWMgdm9pZCBjYXZzX2ZpbHRlcl9jaF9jKHVpbnQ4X3QgKmQsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsIGludCB0YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJzMSwgaW50IGJzMikKK3sKICAgICBpbnQgaTsKICAgICBpZihiczE9PTIpCiAgICAgICAgIGZvcihpPTA7aTw4O2krKykKQEAgLTE4NSwxMCArMTkzLDEwIEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIGNhdnNfaWRjdDhfYWRkX2ModWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkgeworc3RhdGljIHZvaWQgY2F2c19pZGN0OF9hZGRfYyh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBwdHJkaWZmX3Qgc3RyaWRlKQorewogICAgIGludCBpOwogICAgIGludDE2X3QgKCpzcmMpWzhdID0gKGludDE2X3QoKilbOF0pYmxvY2s7Ci0gICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKIAogICAgIHNyY1swXVswXSArPSA4OwogCkBAIC0yNDMsMTQgKzI1MSwxNCBAQAogICAgICAgICBjb25zdCBpbnQgYjIgPSBhNSAtIGE3OwogICAgICAgICBjb25zdCBpbnQgYjMgPSBhNCAtIGE2OwogCi0gICAgICAgIGRzdFtpICsgMCpzdHJpZGVdID0gY21bIGRzdFtpICsgMCpzdHJpZGVdICsgKChiMCArIGI0KSA+PiA3KV07Ci0gICAgICAgIGRzdFtpICsgMSpzdHJpZGVdID0gY21bIGRzdFtpICsgMSpzdHJpZGVdICsgKChiMSArIGI1KSA+PiA3KV07Ci0gICAgICAgIGRzdFtpICsgMipzdHJpZGVdID0gY21bIGRzdFtpICsgMipzdHJpZGVdICsgKChiMiArIGI2KSA+PiA3KV07Ci0gICAgICAgIGRzdFtpICsgMypzdHJpZGVdID0gY21bIGRzdFtpICsgMypzdHJpZGVdICsgKChiMyArIGI3KSA+PiA3KV07Ci0gICAgICAgIGRzdFtpICsgNCpzdHJpZGVdID0gY21bIGRzdFtpICsgNCpzdHJpZGVdICsgKChiMyAtIGI3KSA+PiA3KV07Ci0gICAgICAgIGRzdFtpICsgNSpzdHJpZGVdID0gY21bIGRzdFtpICsgNSpzdHJpZGVdICsgKChiMiAtIGI2KSA+PiA3KV07Ci0gICAgICAgIGRzdFtpICsgNipzdHJpZGVdID0gY21bIGRzdFtpICsgNipzdHJpZGVdICsgKChiMSAtIGI1KSA+PiA3KV07Ci0gICAgICAgIGRzdFtpICsgNypzdHJpZGVdID0gY21bIGRzdFtpICsgNypzdHJpZGVdICsgKChiMCAtIGI0KSA+PiA3KV07CisgICAgICAgIGRzdFtpICsgMCpzdHJpZGVdID0gYXZfY2xpcF91aW50OCggZHN0W2kgKyAwKnN0cmlkZV0gKyAoKGIwICsgYjQpID4+IDcpKTsKKyAgICAgICAgZHN0W2kgKyAxKnN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KCBkc3RbaSArIDEqc3RyaWRlXSArICgoYjEgKyBiNSkgPj4gNykpOworICAgICAgICBkc3RbaSArIDIqc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoIGRzdFtpICsgMipzdHJpZGVdICsgKChiMiArIGI2KSA+PiA3KSk7CisgICAgICAgIGRzdFtpICsgMypzdHJpZGVdID0gYXZfY2xpcF91aW50OCggZHN0W2kgKyAzKnN0cmlkZV0gKyAoKGIzICsgYjcpID4+IDcpKTsKKyAgICAgICAgZHN0W2kgKyA0KnN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KCBkc3RbaSArIDQqc3RyaWRlXSArICgoYjMgLSBiNykgPj4gNykpOworICAgICAgICBkc3RbaSArIDUqc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoIGRzdFtpICsgNSpzdHJpZGVdICsgKChiMiAtIGI2KSA+PiA3KSk7CisgICAgICAgIGRzdFtpICsgNipzdHJpZGVdID0gYXZfY2xpcF91aW50OCggZHN0W2kgKyA2KnN0cmlkZV0gKyAoKGIxIC0gYjUpID4+IDcpKTsKKyAgICAgICAgZHN0W2kgKyA3KnN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KCBkc3RbaSArIDcqc3RyaWRlXSArICgoYjAgLSBiNCkgPj4gNykpOwogICAgIH0KIH0KIApAQCAtMjYxLDcgKzI2OSw4IEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2RlZmluZSBDQVZTX1NVQlBJWChPUE5BTUUsIE9QLCBOQU1FLCBBLCBCLCBDLCBELCBFLCBGKSBcCi1zdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0OF9oXyAjIyBOQU1FKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0OF9oXyAjIyBOQU1FKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjb25zdCBpbnQgaD04O1wKICAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QO1wKICAgICBpbnQgaTtcCkBAIC0yODAsNyArMjg5LDggQEAKICAgICB9XAogfVwKIFwKLXN0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X3ZfICAjIyBOQU1FKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0OF92XyAgIyMgTkFNRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHNyY1N0cmlkZSlcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgY29uc3QgaW50IHc9ODtcCiAgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDtcCiAgICAgaW50IGk7XApAQCAtMzEyLDcgKzMyMiw4IEBACiAgICAgfVwKIH1cCiBcCi1zdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0MTZfdl8gIyMgTkFNRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfZmlsdDE2X3ZfICMjIE5BTUUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X3ZfICMjIE5BTUUoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAogICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X3ZfICMjIE5BTUUoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAogICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCkBAIC0zMjEsNyArMzMyLDggQEAKICAgICBPUE5BTUUgIyMgY2F2c19maWx0OF92XyAjIyBOQU1FKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKIH1cCiBcCi1zdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0MTZfaF8gIyMgTkFNRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfZmlsdDE2X2hfICMjIE5BTUUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X2hfICMjIE5BTUUoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAogICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X2hfICMjIE5BTUUoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSk7XAogICAgIHNyYyArPSA4KnNyY1N0cmlkZTtcCkBAIC0zMzEsNyArMzQzLDggQEAKIH1cCiAKICNkZWZpbmUgQ0FWU19TVUJQSVhfSFYoT1BOQU1FLCBPUCwgTkFNRSwgQUgsIEJILCBDSCwgREgsIEVILCBGSCwgQVYsIEJWLCBDViwgRFYsIEVWLCBGViwgRlVMTCkgXAotc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfZmlsdDhfaHZfICMjIE5BTUUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0OF9odl8gIyMgTkFNRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGludDE2X3QgdGVtcFs4Kig4KzUpXTtcCiAgICAgaW50MTZfdCAqdG1wID0gdGVtcDtcCiAgICAgY29uc3QgaW50IGg9ODtcCkBAIC00MTIsNyArNDI1LDggQEAKICAgICB9XAogfVwKIFwKLXN0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX2ZpbHQxNl9odl8gIyMgTkFNRSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpeyBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19maWx0MTZfaHZfICMjIE5BTUUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBPUE5BTUUgIyMgY2F2c19maWx0OF9odl8gIyMgTkFNRShkc3QgICwgc3JjMSwgICBzcmMyICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTsgXAogICAgIE9QTkFNRSAjIyBjYXZzX2ZpbHQ4X2h2XyAjIyBOQU1FKGRzdCs4LCBzcmMxKzgsIHNyYzIrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpOyBcCiAgICAgc3JjMSArPSA4KnNyY1N0cmlkZTtcCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2NhdnNkc3AuaCBiL2xpYmF2Y29kZWMvY2F2c2RzcC5oCmluZGV4IDg0N2Y1YzQuLjljY2FhMGEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY2F2c2RzcC5oCisrKyBiL2xpYmF2Y29kZWMvY2F2c2RzcC5oCkBAIC0zMCwxMSArMzAsMTEgQEAKIHR5cGVkZWYgc3RydWN0IENBVlNEU1BDb250ZXh0IHsKICAgICBxcGVsX21jX2Z1bmMgcHV0X2NhdnNfcXBlbF9waXhlbHNfdGFiWzJdWzE2XTsKICAgICBxcGVsX21jX2Z1bmMgYXZnX2NhdnNfcXBlbF9waXhlbHNfdGFiWzJdWzE2XTsKLSAgICB2b2lkICgqY2F2c19maWx0ZXJfbHYpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50IHRjLCBpbnQgYnMxLCBpbnQgYnMyKTsKLSAgICB2b2lkICgqY2F2c19maWx0ZXJfbGgpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50IHRjLCBpbnQgYnMxLCBpbnQgYnMyKTsKLSAgICB2b2lkICgqY2F2c19maWx0ZXJfY3YpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50IHRjLCBpbnQgYnMxLCBpbnQgYnMyKTsKLSAgICB2b2lkICgqY2F2c19maWx0ZXJfY2gpKHVpbnQ4X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwgaW50IHRjLCBpbnQgYnMxLCBpbnQgYnMyKTsKLSAgICB2b2lkICgqY2F2c19pZGN0OF9hZGQpKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOworICAgIHZvaWQgKCpjYXZzX2ZpbHRlcl9sdikodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsIGludCBiczEsIGludCBiczIpOworICAgIHZvaWQgKCpjYXZzX2ZpbHRlcl9saCkodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsIGludCBiczEsIGludCBiczIpOworICAgIHZvaWQgKCpjYXZzX2ZpbHRlcl9jdikodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsIGludCBiczEsIGludCBiczIpOworICAgIHZvaWQgKCpjYXZzX2ZpbHRlcl9jaCkodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQgdGMsIGludCBiczEsIGludCBiczIpOworICAgIHZvaWQgKCpjYXZzX2lkY3Q4X2FkZCkodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgcHRyZGlmZl90IHN0cmlkZSk7CiAgICAgaW50IGlkY3RfcGVybTsKIH0gQ0FWU0RTUENvbnRleHQ7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JydF9kYXRhLmMgYi9saWJhdmNvZGVjL2NicnRfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZTM2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2NicnRfZGF0YS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImNicnRfZGF0YS5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKworI2lmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCisjaW5jbHVkZSAibGliYXZjb2RlYy9jYnJ0X3RhYmxlcy5oIgorI2Vsc2UKKyNpbmNsdWRlICJjYnJ0X3RhYmxlZ2VuLmgiCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JydF9kYXRhLmggYi9saWJhdmNvZGVjL2NicnRfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTE3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2NicnRfZGF0YS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0NCUlRfREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfQ0JSVF9EQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUworI2RlZmluZSBmZl9jYnJ0X3RhYmxlaW5pdF9maXhlZCgpCisjZGVmaW5lIGZmX2NicnRfdGFibGVpbml0KCkKK2V4dGVybiBjb25zdCB1aW50MzJfdCBmZl9jYnJ0X3RhYlsxIDw8IDEzXTsKK2V4dGVybiBjb25zdCB1aW50MzJfdCBmZl9jYnJ0X3RhYl9maXhlZFsxIDw8IDEzXTsKKyNlbHNlCit2b2lkIGZmX2NicnRfdGFibGVpbml0KHZvaWQpOwordm9pZCBmZl9jYnJ0X3RhYmxlaW5pdF9maXhlZCh2b2lkKTsKK2V4dGVybiB1aW50MzJfdCBmZl9jYnJ0X3RhYlsxIDw8IDEzXTsKK2V4dGVybiB1aW50MzJfdCBmZl9jYnJ0X3RhYl9maXhlZFsxIDw8IDEzXTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JydF9kYXRhX2ZpeGVkLmMgYi9saWJhdmNvZGVjL2NicnRfZGF0YV9maXhlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjFiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2NicnRfZGF0YV9maXhlZC5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImNicnRfZGF0YS5oIgorCisjaWYgQ09ORklHX0hBUkRDT0RFRF9UQUJMRVMKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2NicnRfZml4ZWRfdGFibGVzLmgiCisjZWxzZQorI2RlZmluZSBVU0VfRklYRUQgMQorI2luY2x1ZGUgImNicnRfdGFibGVnZW4uaCIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jYnJ0X3RhYmxlZ2VuLmggYi9saWJhdmNvZGVjL2NicnRfdGFibGVnZW4uaAppbmRleCAyMWU0YjlhLi45YWYxOGQ4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2NicnRfdGFibGVnZW4uaAorKysgYi9saWJhdmNvZGVjL2NicnRfdGFibGVnZW4uaApAQCAtMzUsMjEgKzM1LDEyIEBACiAjZGVmaW5lIENCUlQoeCkgYXZfZmxvYXQyaW50KChmbG9hdCkoeCkpCiAjZW5kaWYKIAotI2lmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCi0jaWYgVVNFX0ZJWEVECi0jZGVmaW5lIGNicnRfdGFibGVpbml0X2ZpeGVkKCkKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2NicnRfZml4ZWRfdGFibGVzLmgiCi0jZWxzZQotI2RlZmluZSBjYnJ0X3RhYmxlaW5pdCgpCi0jaW5jbHVkZSAibGliYXZjb2RlYy9jYnJ0X3RhYmxlcy5oIgotI2VuZGlmCi0jZWxzZQotc3RhdGljIHVpbnQzMl90IGNicnRfdGFiWzEgPDwgMTNdOwordWludDMyX3QgQUFDX1JFTkFNRShmZl9jYnJ0X3RhYilbMSA8PCAxM107CiAKLXN0YXRpYyBhdl9jb2xkIHZvaWQgQUFDX1JFTkFNRShjYnJ0X3RhYmxlaW5pdCkodm9pZCkKK2F2X2NvbGQgdm9pZCBBQUNfUkVOQU1FKGZmX2NicnRfdGFibGVpbml0KSh2b2lkKQogewogICAgIHN0YXRpYyBkb3VibGUgY2JydF90YWJfZGJsWzEgPDwgMTNdOwotICAgIGlmICghY2JydF90YWJbKDE8PDEzKSAtIDFdKSB7CisgICAgaWYgKCFBQUNfUkVOQU1FKGZmX2NicnRfdGFiKVsoMTw8MTMpIC0gMV0pIHsKICAgICAgICAgaW50IGksIGosIGs7CiAgICAgICAgIGRvdWJsZSBjYnJ0X3ZhbDsKIApAQCAtNzUsOSArNjYsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE8PDEzOyBpKyspCi0gICAgICAgICAgICBjYnJ0X3RhYltpXSA9IENCUlQoY2JydF90YWJfZGJsW2ldKTsKKyAgICAgICAgICAgIEFBQ19SRU5BTUUoZmZfY2JydF90YWIpW2ldID0gQ0JSVChjYnJ0X3RhYl9kYmxbaV0pOwogICAgIH0KIH0KLSNlbmRpZiAvKiBDT05GSUdfSEFSRENPREVEX1RBQkxFUyAqLwogCiAjZW5kaWYgLyogQVZDT0RFQ19DQlJUX1RBQkxFR0VOX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JydF90YWJsZWdlbl90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9jYnJ0X3RhYmxlZ2VuX3RlbXBsYXRlLmMKaW5kZXggN2RjYWI5MS4uMjFlZDJhNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jYnJ0X3RhYmxlZ2VuX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9jYnJ0X3RhYmxlZ2VuX3RlbXBsYXRlLmMKQEAgLTI4LDExICsyOCwxNSBAQAogCiBpbnQgbWFpbih2b2lkKQogewotICAgIEFBQ19SRU5BTUUoY2JydF90YWJsZWluaXQpKCk7CisgICAgQUFDX1JFTkFNRShmZl9jYnJ0X3RhYmxlaW5pdCkoKTsKIAogICAgIHdyaXRlX2ZpbGVoZWFkZXIoKTsKIAotICAgIFdSSVRFX0FSUkFZKCJzdGF0aWMgY29uc3QiLCB1aW50MzJfdCwgY2JydF90YWIpOworI2lmIFVTRV9GSVhFRAorICAgIFdSSVRFX0FSUkFZKCJjb25zdCIsIHVpbnQzMl90LCBmZl9jYnJ0X3RhYl9maXhlZCk7CisjZWxzZQorICAgIFdSSVRFX0FSUkFZKCJjb25zdCIsIHVpbnQzMl90LCBmZl9jYnJ0X3RhYik7CisjZW5kaWYKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jYnMuYyBiL2xpYmF2Y29kZWMvY2JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3ZTBiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvY2JzLmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorCisjaW5jbHVkZSAiY2JzLmgiCisjaW5jbHVkZSAiY2JzX2ludGVybmFsLmgiCisKKworc3RhdGljIGNvbnN0IENvZGVkQml0c3RyZWFtVHlwZSAqY2JzX3R5cGVfdGFibGVbXSA9IHsKKyNpZiBDT05GSUdfQ0JTX0gyNjQKKyAgICAmZmZfY2JzX3R5cGVfaDI2NCwKKyNlbmRpZgorI2lmIENPTkZJR19DQlNfSDI2NQorICAgICZmZl9jYnNfdHlwZV9oMjY1LAorI2VuZGlmCisjaWYgQ09ORklHX0NCU19NUEVHMgorICAgICZmZl9jYnNfdHlwZV9tcGVnMiwKKyNlbmRpZgorfTsKKworY29uc3QgZW51bSBBVkNvZGVjSUQgZmZfY2JzX2FsbF9jb2RlY19pZHNbXSA9IHsKKyNpZiBDT05GSUdfQ0JTX0gyNjQKKyAgICBBVl9DT0RFQ19JRF9IMjY0LAorI2VuZGlmCisjaWYgQ09ORklHX0NCU19IMjY1CisgICAgQVZfQ09ERUNfSURfSDI2NSwKKyNlbmRpZgorI2lmIENPTkZJR19DQlNfTVBFRzIKKyAgICBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorI2VuZGlmCisgICAgQVZfQ09ERUNfSURfTk9ORQorfTsKKworaW50IGZmX2Nic19pbml0KENvZGVkQml0c3RyZWFtQ29udGV4dCAqKmN0eF9wdHIsCisgICAgICAgICAgICAgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQsIHZvaWQgKmxvZ19jdHgpCit7CisgICAgQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHg7CisgICAgY29uc3QgQ29kZWRCaXRzdHJlYW1UeXBlICp0eXBlOworICAgIGludCBpOworCisgICAgdHlwZSA9IE5VTEw7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNic190eXBlX3RhYmxlKTsgaSsrKSB7CisgICAgICAgIGlmIChjYnNfdHlwZV90YWJsZVtpXS0+Y29kZWNfaWQgPT0gY29kZWNfaWQpIHsKKyAgICAgICAgICAgIHR5cGUgPSBjYnNfdHlwZV90YWJsZVtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghdHlwZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGN0eCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjdHgpKTsKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+bG9nX2N0eCA9IGxvZ19jdHg7CisgICAgY3R4LT5jb2RlYyAgID0gdHlwZTsKKworICAgIGN0eC0+cHJpdl9kYXRhID0gYXZfbWFsbG9jeihjdHgtPmNvZGVjLT5wcml2X2RhdGFfc2l6ZSk7CisgICAgaWYgKCFjdHgtPnByaXZfZGF0YSkgeworICAgICAgICBhdl9mcmVlcCgmY3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBjdHgtPmRlY29tcG9zZV91bml0X3R5cGVzID0gTlVMTDsKKworICAgIGN0eC0+dHJhY2VfZW5hYmxlID0gMDsKKyAgICBjdHgtPnRyYWNlX2xldmVsICA9IEFWX0xPR19UUkFDRTsKKworICAgICpjdHhfcHRyID0gY3R4OworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2Nic19jbG9zZShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKipjdHhfcHRyKQoreworICAgIENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4ID0gKmN0eF9wdHI7CisKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGN0eC0+Y29kZWMgJiYgY3R4LT5jb2RlYy0+Y2xvc2UpCisgICAgICAgIGN0eC0+Y29kZWMtPmNsb3NlKGN0eCk7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5wcml2X2RhdGEpOworICAgIGF2X2ZyZWVwKGN0eF9wdHIpOworfQorCitzdGF0aWMgdm9pZCBjYnNfdW5pdF91bmluaXQoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1Vbml0ICp1bml0KQoreworICAgIGF2X2J1ZmZlcl91bnJlZigmdW5pdC0+Y29udGVudF9yZWYpOworICAgIHVuaXQtPmNvbnRlbnQgPSBOVUxMOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZ1bml0LT5kYXRhX3JlZik7CisgICAgdW5pdC0+ZGF0YSAgICAgICAgICAgICA9IE5VTEw7CisgICAgdW5pdC0+ZGF0YV9zaXplICAgICAgICA9IDA7CisgICAgdW5pdC0+ZGF0YV9iaXRfcGFkZGluZyA9IDA7Cit9CisKK3ZvaWQgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyYWctPm5iX3VuaXRzOyBpKyspCisgICAgICAgIGNic191bml0X3VuaW5pdChjdHgsICZmcmFnLT51bml0c1tpXSk7CisgICAgYXZfZnJlZXAoJmZyYWctPnVuaXRzKTsKKyAgICBmcmFnLT5uYl91bml0cyA9IDA7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmZyYWctPmRhdGFfcmVmKTsKKyAgICBmcmFnLT5kYXRhICAgICAgICAgICAgID0gTlVMTDsKKyAgICBmcmFnLT5kYXRhX3NpemUgICAgICAgID0gMDsKKyAgICBmcmFnLT5kYXRhX2JpdF9wYWRkaW5nID0gMDsKK30KKworc3RhdGljIGludCBjYnNfcmVhZF9mcmFnbWVudF9jb250ZW50KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcpCit7CisgICAgaW50IGVyciwgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFnLT5uYl91bml0czsgaSsrKSB7CisgICAgICAgIGlmIChjdHgtPmRlY29tcG9zZV91bml0X3R5cGVzKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3R4LT5uYl9kZWNvbXBvc2VfdW5pdF90eXBlczsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+ZGVjb21wb3NlX3VuaXRfdHlwZXNbal0gPT0gZnJhZy0+dW5pdHNbaV0udHlwZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA+PSBjdHgtPm5iX2RlY29tcG9zZV91bml0X3R5cGVzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFnLT51bml0c1tpXS5jb250ZW50X3JlZik7CisgICAgICAgIGZyYWctPnVuaXRzW2ldLmNvbnRlbnQgPSBOVUxMOworCisgICAgICAgIGVyciA9IGN0eC0+Y29kZWMtPnJlYWRfdW5pdChjdHgsICZmcmFnLT51bml0c1tpXSk7CisgICAgICAgIGlmIChlcnIgPT0gQVZFUlJPUihFTk9TWVMpKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICAgICAiRGVjb21wb3NpdGlvbiB1bmltcGxlbWVudGVkIGZvciB1bml0ICVkICIKKyAgICAgICAgICAgICAgICAgICAiKHR5cGUgJSJQUkl1MzIiKS5cbiIsIGksIGZyYWctPnVuaXRzW2ldLnR5cGUpOworICAgICAgICB9IGVsc2UgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWFkIHVuaXQgJWQgIgorICAgICAgICAgICAgICAgICAgICIodHlwZSAlIlBSSXUzMiIpLlxuIiwgaSwgZnJhZy0+dW5pdHNbaV0udHlwZSk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9jYnNfcmVhZF9leHRyYWRhdGEoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpCit7CisgICAgaW50IGVycjsKKworICAgIG1lbXNldChmcmFnLCAwLCBzaXplb2YoKmZyYWcpKTsKKworICAgIGZyYWctPmRhdGEgICAgICA9IHBhci0+ZXh0cmFkYXRhOworICAgIGZyYWctPmRhdGFfc2l6ZSA9IHBhci0+ZXh0cmFkYXRhX3NpemU7CisKKyAgICBlcnIgPSBjdHgtPmNvZGVjLT5zcGxpdF9mcmFnbWVudChjdHgsIGZyYWcsIDEpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgZnJhZy0+ZGF0YSAgICAgID0gTlVMTDsKKyAgICBmcmFnLT5kYXRhX3NpemUgPSAwOworCisgICAgcmV0dXJuIGNic19yZWFkX2ZyYWdtZW50X2NvbnRlbnQoY3R4LCBmcmFnKTsKK30KKworc3RhdGljIGludCBjYnNfZmlsbF9mcmFnbWVudF9kYXRhKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgYXZfYXNzZXJ0MCghZnJhZy0+ZGF0YSAmJiAhZnJhZy0+ZGF0YV9yZWYpOworCisgICAgZnJhZy0+ZGF0YV9yZWYgPQorICAgICAgICBhdl9idWZmZXJfYWxsb2Moc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghZnJhZy0+ZGF0YV9yZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmcmFnLT5kYXRhICAgICAgPSBmcmFnLT5kYXRhX3JlZi0+ZGF0YTsKKyAgICBmcmFnLT5kYXRhX3NpemUgPSBzaXplOworCisgICAgbWVtY3B5KGZyYWctPmRhdGEsIGRhdGEsIHNpemUpOworICAgIG1lbXNldChmcmFnLT5kYXRhICsgc2l6ZSwgMCwKKyAgICAgICAgICAgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2Nic19yZWFkX3BhY2tldChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgbWVtc2V0KGZyYWcsIDAsIHNpemVvZigqZnJhZykpOworCisgICAgaWYgKHBrdC0+YnVmKSB7CisgICAgICAgIGZyYWctPmRhdGFfcmVmID0gYXZfYnVmZmVyX3JlZihwa3QtPmJ1Zik7CisgICAgICAgIGlmICghZnJhZy0+ZGF0YV9yZWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGZyYWctPmRhdGEgICAgICA9IHBrdC0+ZGF0YTsKKyAgICAgICAgZnJhZy0+ZGF0YV9zaXplID0gcGt0LT5zaXplOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gY2JzX2ZpbGxfZnJhZ21lbnRfZGF0YShjdHgsIGZyYWcsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGVyciA9IGN0eC0+Y29kZWMtPnNwbGl0X2ZyYWdtZW50KGN0eCwgZnJhZywgMCk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gY2JzX3JlYWRfZnJhZ21lbnRfY29udGVudChjdHgsIGZyYWcpOworfQorCitpbnQgZmZfY2JzX3JlYWQoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZywKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBpbnQgZXJyOworCisgICAgbWVtc2V0KGZyYWcsIDAsIHNpemVvZigqZnJhZykpOworCisgICAgZXJyID0gY2JzX2ZpbGxfZnJhZ21lbnRfZGF0YShjdHgsIGZyYWcsIGRhdGEsIHNpemUpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgZXJyID0gY3R4LT5jb2RlYy0+c3BsaXRfZnJhZ21lbnQoY3R4LCBmcmFnLCAwKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIHJldHVybiBjYnNfcmVhZF9mcmFnbWVudF9jb250ZW50KGN0eCwgZnJhZyk7Cit9CisKKworaW50IGZmX2Nic193cml0ZV9mcmFnbWVudF9kYXRhKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcpCit7CisgICAgaW50IGVyciwgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFnLT5uYl91bml0czsgaSsrKSB7CisgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdCA9ICZmcmFnLT51bml0c1tpXTsKKworICAgICAgICBpZiAoIXVuaXQtPmNvbnRlbnQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnVuaXQtPmRhdGFfcmVmKTsKKyAgICAgICAgdW5pdC0+ZGF0YSA9IE5VTEw7CisKKyAgICAgICAgZXJyID0gY3R4LT5jb2RlYy0+d3JpdGVfdW5pdChjdHgsIHVuaXQpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIHVuaXQgJWQgIgorICAgICAgICAgICAgICAgICAgICIodHlwZSAlIlBSSXUzMiIpLlxuIiwgaSwgdW5pdC0+dHlwZSk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFnLT5kYXRhX3JlZik7CisgICAgZnJhZy0+ZGF0YSA9IE5VTEw7CisKKyAgICBlcnIgPSBjdHgtPmNvZGVjLT5hc3NlbWJsZV9mcmFnbWVudChjdHgsIGZyYWcpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhc3NlbWJsZSBmcmFnbWVudC5cbiIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfY2JzX3dyaXRlX2V4dHJhZGF0YShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnKQoreworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBmZl9jYnNfd3JpdGVfZnJhZ21lbnRfZGF0YShjdHgsIGZyYWcpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgYXZfZnJlZXAoJnBhci0+ZXh0cmFkYXRhKTsKKworICAgIHBhci0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKGZyYWctPmRhdGFfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFwYXItPmV4dHJhZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIG1lbWNweShwYXItPmV4dHJhZGF0YSwgZnJhZy0+ZGF0YSwgZnJhZy0+ZGF0YV9zaXplKTsKKyAgICBtZW1zZXQocGFyLT5leHRyYWRhdGEgKyBmcmFnLT5kYXRhX3NpemUsIDAsCisgICAgICAgICAgIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIHBhci0+ZXh0cmFkYXRhX3NpemUgPSBmcmFnLT5kYXRhX3NpemU7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2Nic193cml0ZV9wYWNrZXQoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZykKK3sKKyAgICBBVkJ1ZmZlclJlZiAqYnVmOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBmZl9jYnNfd3JpdGVfZnJhZ21lbnRfZGF0YShjdHgsIGZyYWcpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgYXZfYXNzZXJ0MChmcmFnLT5kYXRhX3JlZik7CisgICAgYnVmID0gYXZfYnVmZmVyX3JlZihmcmFnLT5kYXRhX3JlZik7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9pbml0X3BhY2tldChwa3QpOworICAgIHBrdC0+YnVmICA9IGJ1ZjsKKyAgICBwa3QtPmRhdGEgPSBmcmFnLT5kYXRhOworICAgIHBrdC0+c2l6ZSA9IGZyYWctPmRhdGFfc2l6ZTsKKworICAgIHJldHVybiAwOworfQorCisKK3ZvaWQgZmZfY2JzX3RyYWNlX2hlYWRlcihDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGlmICghY3R4LT50cmFjZV9lbmFibGUpCisgICAgICAgIHJldHVybjsKKworICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIGN0eC0+dHJhY2VfbGV2ZWwsICIlc1xuIiwgbmFtZSk7Cit9CisKK3ZvaWQgZmZfY2JzX3RyYWNlX3N5bnRheF9lbGVtZW50KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBpbnQgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBzaXplX3QgbmFtZV9sZW4sIGJpdHNfbGVuOworICAgIGludCBwYWQ7CisKKyAgICBpZiAoIWN0eC0+dHJhY2VfZW5hYmxlKQorICAgICAgICByZXR1cm47CisKKyAgICBhdl9hc3NlcnQwKHZhbHVlID49IElOVF9NSU4gJiYgdmFsdWUgPD0gVUlOVDMyX01BWCk7CisKKyAgICBuYW1lX2xlbiA9IHN0cmxlbihuYW1lKTsKKyAgICBiaXRzX2xlbiA9IHN0cmxlbihiaXRzKTsKKworICAgIGlmIChuYW1lX2xlbiArIGJpdHNfbGVuID4gNjApCisgICAgICAgIHBhZCA9IGJpdHNfbGVuICsgMjsKKyAgICBlbHNlCisgICAgICAgIHBhZCA9IDYxIC0gbmFtZV9sZW47CisKKyAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBjdHgtPnRyYWNlX2xldmVsLCAiJS0xMGQgICVzJSpzID0gJSJQUklkNjQiXG4iLAorICAgICAgICAgICBwb3NpdGlvbiwgbmFtZSwgcGFkLCBiaXRzLCB2YWx1ZSk7Cit9CisKK2ludCBmZl9jYnNfcmVhZF91bnNpZ25lZChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgKndyaXRlX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmdlX21pbiwgdWludDMyX3QgcmFuZ2VfbWF4KQoreworICAgIHVpbnQzMl90IHZhbHVlOworICAgIGludCBwb3NpdGlvbjsKKworICAgIGF2X2Fzc2VydDAod2lkdGggPiAwICYmIHdpZHRoIDw9IDMyKTsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiYykgPCB3aWR0aCkgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHZhbHVlIGF0ICIKKyAgICAgICAgICAgICAgICIlczogYml0c3RyZWFtIGVuZGVkLlxuIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChjdHgtPnRyYWNlX2VuYWJsZSkKKyAgICAgICAgcG9zaXRpb24gPSBnZXRfYml0c19jb3VudChnYmMpOworCisgICAgdmFsdWUgPSBnZXRfYml0c19sb25nKGdiYywgd2lkdGgpOworCisgICAgaWYgKGN0eC0+dHJhY2VfZW5hYmxlKSB7CisgICAgICAgIGNoYXIgYml0c1szM107CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgICAgIGJpdHNbaV0gPSB2YWx1ZSA+PiAod2lkdGggLSBpIC0gMSkgJiAxID8gJzEnIDogJzAnOworICAgICAgICBiaXRzW2ldID0gMDsKKworICAgICAgICBmZl9jYnNfdHJhY2Vfc3ludGF4X2VsZW1lbnQoY3R4LCBwb3NpdGlvbiwgbmFtZSwgYml0cywgdmFsdWUpOworICAgIH0KKworICAgIGlmICh2YWx1ZSA8IHJhbmdlX21pbiB8fCB2YWx1ZSA+IHJhbmdlX21heCkgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICIlcyBvdXQgb2YgcmFuZ2U6ICIKKyAgICAgICAgICAgICAgICIlIlBSSXUzMiIsIGJ1dCBtdXN0IGJlIGluIFslIlBSSXUzMiIsJSJQUkl1MzIiXS5cbiIsCisgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAqd3JpdGVfdG8gPSB2YWx1ZTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2Nic193cml0ZV91bnNpZ25lZChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUHV0Qml0Q29udGV4dCAqcGJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5nZV9taW4sIHVpbnQzMl90IHJhbmdlX21heCkKK3sKKyAgICBhdl9hc3NlcnQwKHdpZHRoID4gMCAmJiB3aWR0aCA8PSAzMik7CisKKyAgICBpZiAodmFsdWUgPCByYW5nZV9taW4gfHwgdmFsdWUgPiByYW5nZV9tYXgpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiJXMgb3V0IG9mIHJhbmdlOiAiCisgICAgICAgICAgICAgICAiJSJQUkl1MzIiLCBidXQgbXVzdCBiZSBpbiBbJSJQUkl1MzIiLCUiUFJJdTMyIl0uXG4iLAorICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHB1dF9iaXRzX2xlZnQocGJjKSA8IHdpZHRoKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TUEMpOworCisgICAgaWYgKGN0eC0+dHJhY2VfZW5hYmxlKSB7CisgICAgICAgIGNoYXIgYml0c1szM107CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKyAgICAgICAgICAgIGJpdHNbaV0gPSB2YWx1ZSA+PiAod2lkdGggLSBpIC0gMSkgJiAxID8gJzEnIDogJzAnOworICAgICAgICBiaXRzW2ldID0gMDsKKworICAgICAgICBmZl9jYnNfdHJhY2Vfc3ludGF4X2VsZW1lbnQoY3R4LCBwdXRfYml0c19jb3VudChwYmMpLCBuYW1lLCBiaXRzLCB2YWx1ZSk7CisgICAgfQorCisgICAgaWYgKHdpZHRoIDwgMzIpCisgICAgICAgIHB1dF9iaXRzKHBiYywgd2lkdGgsIHZhbHVlKTsKKyAgICBlbHNlCisgICAgICAgIHB1dF9iaXRzMzIocGJjLCB2YWx1ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworCitpbnQgZmZfY2JzX2FsbG9jX3VuaXRfY29udGVudChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZyZWUpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkpCit7CisgICAgYXZfYXNzZXJ0MCghdW5pdC0+Y29udGVudCAmJiAhdW5pdC0+Y29udGVudF9yZWYpOworCisgICAgdW5pdC0+Y29udGVudCA9IGF2X21hbGxvY3ooc2l6ZSk7CisgICAgaWYgKCF1bml0LT5jb250ZW50KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdW5pdC0+Y29udGVudF9yZWYgPSBhdl9idWZmZXJfY3JlYXRlKHVuaXQtPmNvbnRlbnQsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUsIGN0eCwgMCk7CisgICAgaWYgKCF1bml0LT5jb250ZW50X3JlZikgeworICAgICAgICBhdl9mcmVlcCgmdW5pdC0+Y29udGVudCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9jYnNfYWxsb2NfdW5pdF9kYXRhKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1Vbml0ICp1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpCit7CisgICAgYXZfYXNzZXJ0MCghdW5pdC0+ZGF0YSAmJiAhdW5pdC0+ZGF0YV9yZWYpOworCisgICAgdW5pdC0+ZGF0YV9yZWYgPSBhdl9idWZmZXJfYWxsb2Moc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghdW5pdC0+ZGF0YV9yZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB1bml0LT5kYXRhICAgICAgPSB1bml0LT5kYXRhX3JlZi0+ZGF0YTsKKyAgICB1bml0LT5kYXRhX3NpemUgPSBzaXplOworCisgICAgbWVtc2V0KHVuaXQtPmRhdGEgKyBzaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNic19pbnNlcnRfdW5pdChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24pCit7CisgICAgQ29kZWRCaXRzdHJlYW1Vbml0ICp1bml0czsKKworICAgIHVuaXRzID0gYXZfbWFsbG9jX2FycmF5KGZyYWctPm5iX3VuaXRzICsgMSwgc2l6ZW9mKCp1bml0cykpOworICAgIGlmICghdW5pdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAocG9zaXRpb24gPiAwKQorICAgICAgICBtZW1jcHkodW5pdHMsIGZyYWctPnVuaXRzLCBwb3NpdGlvbiAqIHNpemVvZigqdW5pdHMpKTsKKyAgICBpZiAocG9zaXRpb24gPCBmcmFnLT5uYl91bml0cykKKyAgICAgICAgbWVtY3B5KHVuaXRzICsgcG9zaXRpb24gKyAxLCBmcmFnLT51bml0cyArIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgKGZyYWctPm5iX3VuaXRzIC0gcG9zaXRpb24pICogc2l6ZW9mKCp1bml0cykpOworCisgICAgbWVtc2V0KHVuaXRzICsgcG9zaXRpb24sIDAsIHNpemVvZigqdW5pdHMpKTsKKworICAgIGF2X2ZyZWVwKCZmcmFnLT51bml0cyk7CisgICAgZnJhZy0+dW5pdHMgPSB1bml0czsKKyAgICArK2ZyYWctPm5iX3VuaXRzOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9jYnNfaW5zZXJ0X3VuaXRfY29udGVudChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqY29udGVudF9idWYpCit7CisgICAgQ29kZWRCaXRzdHJlYW1Vbml0ICp1bml0OworICAgIEFWQnVmZmVyUmVmICpjb250ZW50X3JlZjsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKHBvc2l0aW9uID09IC0xKQorICAgICAgICBwb3NpdGlvbiA9IGZyYWctPm5iX3VuaXRzOworICAgIGF2X2Fzc2VydDAocG9zaXRpb24gPj0gMCAmJiBwb3NpdGlvbiA8PSBmcmFnLT5uYl91bml0cyk7CisKKyAgICBpZiAoY29udGVudF9idWYpIHsKKyAgICAgICAgY29udGVudF9yZWYgPSBhdl9idWZmZXJfcmVmKGNvbnRlbnRfYnVmKTsKKyAgICAgICAgaWYgKCFjb250ZW50X3JlZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGVudF9yZWYgPSBOVUxMOworICAgIH0KKworICAgIGVyciA9IGNic19pbnNlcnRfdW5pdChjdHgsIGZyYWcsIHBvc2l0aW9uKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmNvbnRlbnRfcmVmKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICB1bml0ID0gJmZyYWctPnVuaXRzW3Bvc2l0aW9uXTsKKyAgICB1bml0LT50eXBlICAgICAgICA9IHR5cGU7CisgICAgdW5pdC0+Y29udGVudCAgICAgPSBjb250ZW50OworICAgIHVuaXQtPmNvbnRlbnRfcmVmID0gY29udGVudF9yZWY7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2Nic19pbnNlcnRfdW5pdF9kYXRhKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpkYXRhX2J1ZikKK3sKKyAgICBDb2RlZEJpdHN0cmVhbVVuaXQgKnVuaXQ7CisgICAgQVZCdWZmZXJSZWYgKmRhdGFfcmVmOworICAgIGludCBlcnI7CisKKyAgICBpZiAocG9zaXRpb24gPT0gLTEpCisgICAgICAgIHBvc2l0aW9uID0gZnJhZy0+bmJfdW5pdHM7CisgICAgYXZfYXNzZXJ0MChwb3NpdGlvbiA+PSAwICYmIHBvc2l0aW9uIDw9IGZyYWctPm5iX3VuaXRzKTsKKworICAgIGlmIChkYXRhX2J1ZikKKyAgICAgICAgZGF0YV9yZWYgPSBhdl9idWZmZXJfcmVmKGRhdGFfYnVmKTsKKyAgICBlbHNlCisgICAgICAgIGRhdGFfcmVmID0gYXZfYnVmZmVyX2NyZWF0ZShkYXRhLCBkYXRhX3NpemUsIE5VTEwsIE5VTEwsIDApOworICAgIGlmICghZGF0YV9yZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBlcnIgPSBjYnNfaW5zZXJ0X3VuaXQoY3R4LCBmcmFnLCBwb3NpdGlvbik7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZkYXRhX3JlZik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgdW5pdCA9ICZmcmFnLT51bml0c1twb3NpdGlvbl07CisgICAgdW5pdC0+dHlwZSAgICAgID0gdHlwZTsKKyAgICB1bml0LT5kYXRhICAgICAgPSBkYXRhOworICAgIHVuaXQtPmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICB1bml0LT5kYXRhX3JlZiAgPSBkYXRhX3JlZjsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfY2JzX2RlbGV0ZV91bml0KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24pCit7CisgICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiA+PSBmcmFnLT5uYl91bml0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGNic191bml0X3VuaW5pdChjdHgsICZmcmFnLT51bml0c1twb3NpdGlvbl0pOworCisgICAgLS1mcmFnLT5uYl91bml0czsKKworICAgIGlmIChmcmFnLT5uYl91bml0cyA9PSAwKSB7CisgICAgICAgIGF2X2ZyZWVwKCZmcmFnLT51bml0cyk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1tb3ZlKGZyYWctPnVuaXRzICsgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgZnJhZy0+dW5pdHMgKyBwb3NpdGlvbiArIDEsCisgICAgICAgICAgICAgICAgKGZyYWctPm5iX3VuaXRzIC0gcG9zaXRpb24pICogc2l6ZW9mKCpmcmFnLT51bml0cykpOworCisgICAgICAgIC8vIERvbid0IGJvdGhlciByZWFsbG9jYXRpbmcgdGhlIHVuaXQgYXJyYXkuCisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Nicy5oIGIvbGliYXZjb2RlYy9jYnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDJlYjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9jYnMuaApAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQ0JTX0gKKyNkZWZpbmUgQVZDT0RFQ19DQlNfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKworLyoKKyAqIFRoaXMgZGVmaW5lcyBhIGZyYW1ld29yayBmb3IgY29udmVydGluZyBiZXR3ZWVuIGEgY29kZWQgYml0c3RyZWFtCisgKiBhbmQgc3RydWN0dXJlcyBkZWZpbmluZyBhbGwgaW5kaXZpZHVhbCBzeW50YXggZWxlbWVudHMgZm91bmQgaW4KKyAqIHN1Y2ggYSBzdHJlYW0uCisgKgorICogQ29udmVyc2lvbiBpbiBib3RoIGRpcmVjdGlvbnMgaXMgcG9zc2libGUuICBHaXZlbiBhIGNvZGVkIGJpdHN0cmVhbQorICogKGFueSBtZWFuaW5nZnVsIGZyYWdtZW50KSwgaXQgY2FuIGJlIHBhcnNlZCBhbmQgZGVjb21wb3NlZCBpbnRvCisgKiBzeW50YXggZWxlbWVudHMgc3RvcmVkIGluIGEgc2V0IG9mIGNvZGVjLXNwZWNpZmljIHN0cnVjdHVyZXMuCisgKiBTaW1pbGFybHksIGdpdmVuIGEgc2V0IG9mIHRob3NlIHNhbWUgY29kZWMtc3BlY2lmaWMgc3RydWN0dXJlcyB0aGUKKyAqIHN5bnRheCBlbGVtZW50cyBjYW4gYmUgc2VyaWFsaXNlZCBhbmQgY29tYmluZWQgdG8gY3JlYXRlIGEgY29kZWQKKyAqIGJpdHN0cmVhbS4KKyAqLworCitzdHJ1Y3QgQ29kZWRCaXRzdHJlYW1UeXBlOworCisvKioKKyAqIFRoZSBjb2RlYy1zcGVjaWZpYyB0eXBlIG9mIGEgYml0c3RyZWFtIHVuaXQuCisgKgorICogSC4yNjQgLyBBVkM6IG5hbF91bml0X3R5cGUKKyAqIEguMjY1IC8gSEVWQzogbmFsX3VuaXRfdHlwZQorICogTVBFRy0yOiBzdGFydCBjb2RlIHZhbHVlICh3aXRob3V0IHByZWZpeCkKKyAqLwordHlwZWRlZiB1aW50MzJfdCBDb2RlZEJpdHN0cmVhbVVuaXRUeXBlOworCisvKioKKyAqIENvZGVkIGJpdHN0cmVhbSB1bml0IHN0cnVjdHVyZS4KKyAqCisgKiBBIGJpdHN0cmVhbSB1bml0IHRoZSBzbWFsbGVzdCBlbGVtZW50IG9mIGEgYml0c3RyZWFtIHdoaWNoCisgKiBpcyBtZWFuaW5nZnVsIG9uIGl0cyBvd24uICBGb3IgZXhhbXBsZSwgYW4gSC4yNjQgTkFMIHVuaXQuCisgKgorICogU2VlIHRoZSBjb2RlYy1zcGVjaWZpYyBoZWFkZXIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoaXMgZm9yIGFueQorICogcGFydGljdWxhciBjb2RlYy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ29kZWRCaXRzdHJlYW1Vbml0IHsKKyAgICAvKioKKyAgICAgKiBDb2RlYy1zcGVjaWZpYyB0eXBlIG9mIHRoaXMgdW5pdC4KKyAgICAgKi8KKyAgICBDb2RlZEJpdHN0cmVhbVVuaXRUeXBlIHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIHRoZSBkaXJlY3RseS1wYXJzYWJsZSBiaXRzdHJlYW0gZm9ybSBvZiB0aGlzIHVuaXQuCisgICAgICoKKyAgICAgKiBNYXkgYmUgTlVMTCBpZiB0aGUgdW5pdCBjdXJyZW50bHkgb25seSBleGlzdHMgaW4gZGVjb21wb3NlZCBmb3JtLgorICAgICAqLworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYml0c3RyZWFtIChpbmNsdWRpbmcgYW55IHBhZGRpbmcgYml0cworICAgICAqIGluIHRoZSBmaW5hbCBieXRlKS4KKyAgICAgKi8KKyAgICBzaXplX3QgICBkYXRhX3NpemU7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSBmaW5hbCBieXRlLgorICAgICAqCisgICAgICogVGhpcyBzdXBwb3J0cyBub24tYnl0ZS1hbGlnbmVkIGJpdHN0cmVhbXMuCisgICAgICovCisgICAgc2l6ZV90ICAgZGF0YV9iaXRfcGFkZGluZzsKKyAgICAvKioKKyAgICAgKiBJZiBkYXRhIGlzIHJlZmVyZW5jZSBjb3VudGVkLCBhIHJlZmVyZW5jZSB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcKKyAgICAgKiBkYXRhLiAgTnVsbCBpZiBkYXRhIGlzIG5vdCByZWZlcmVuY2UgY291bnRlZC4KKyAgICAgKi8KKyAgICBBVkJ1ZmZlclJlZiAqZGF0YV9yZWY7CisKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIHRoZSBkZWNvbXBvc2VkIGZvcm0gb2YgdGhpcyB1bml0LgorICAgICAqCisgICAgICogVGhlIHR5cGUgb2YgdGhpcyBzdHJ1Y3R1cmUgZGVwZW5kcyBvbiBib3RoIHRoZSBjb2RlYyBhbmQgdGhlCisgICAgICogdHlwZSBvZiB0aGlzIHVuaXQuICBNYXkgYmUgTlVMTCBpZiB0aGUgdW5pdCBvbmx5IGV4aXN0cyBpbgorICAgICAqIGJpdHN0cmVhbSBmb3JtLgorICAgICAqLworICAgIHZvaWQgKmNvbnRlbnQ7CisgICAgLyoqCisgICAgICogSWYgY29udGVudCBpcyByZWZlcmVuY2UgY291bnRlZCwgYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nCisgICAgICogY29udGVudC4gIE51bGwgaWYgY29udGVudCBpcyBub3QgcmVmZXJlbmNlIGNvdW50ZWQuCisgICAgICovCisgICAgQVZCdWZmZXJSZWYgKmNvbnRlbnRfcmVmOworfSBDb2RlZEJpdHN0cmVhbVVuaXQ7CisKKy8qKgorICogQ29kZWQgYml0c3RyZWFtIGZyYWdtZW50IHN0cnVjdHVyZSwgY29tYmluaW5nIG9uZSBvciBtb3JlIHVuaXRzLgorICoKKyAqIFRoaXMgaXMgYW55IHNlcXVlbmNlIG9mIHVuaXRzLiAgSXQgbmVlZCBub3QgZm9ybSBzb21lIGdyZWF0ZXIgd2hvbGUsCisgKiB0aG91Z2ggaW4gbWFueSBjYXNlcyBpdCB3aWxsLiAgRm9yIGV4YW1wbGUsIGFuIEguMjY0IGFjY2VzcyB1bml0LAorICogd2hpY2ggaXMgY29tcG9zZWQgb2YgYSBzZXF1ZW5jZSBvZiBILjI2NCBOQUwgdW5pdHMuCisgKi8KK3R5cGVkZWYgc3RydWN0IENvZGVkQml0c3RyZWFtRnJhZ21lbnQgeworICAgIC8qKgorICAgICAqIFBvaW50ZXIgdG8gdGhlIGJpdHN0cmVhbSBmb3JtIG9mIHRoaXMgZnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBNYXkgYmUgTlVMTCBpZiB0aGUgZnJhZ21lbnQgb25seSBleGlzdHMgYXMgY29tcG9uZW50IHVuaXRzLgorICAgICAqLworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYml0c3RyZWFtLgorICAgICAqCisgICAgICogVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYml0c3RyZWFtIChpbmNsdWRpbmcgYW55IHBhZGRpbmcgYml0cworICAgICAqIGluIHRoZSBmaW5hbCBieXRlKS4KKyAgICAgKi8KKyAgICBzaXplX3QgICBkYXRhX3NpemU7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSBmaW5hbCBieXRlLgorICAgICAqLworICAgIHNpemVfdCBkYXRhX2JpdF9wYWRkaW5nOworICAgIC8qKgorICAgICAqIElmIGRhdGEgaXMgcmVmZXJlbmNlIGNvdW50ZWQsIGEgcmVmZXJlbmNlIHRvIHRoZSBidWZmZXIgY29udGFpbmluZworICAgICAqIGRhdGEuICBOdWxsIGlmIGRhdGEgaXMgbm90IHJlZmVyZW5jZSBjb3VudGVkLgorICAgICAqLworICAgIEFWQnVmZmVyUmVmICpkYXRhX3JlZjsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiB1bml0cyBpbiB0aGlzIGZyYWdtZW50LgorICAgICAqCisgICAgICogVGhpcyBtYXkgYmUgemVybyBpZiB0aGUgZnJhZ21lbnQgb25seSBleGlzdHMgaW4gYml0c3RyZWFtIGZvcm0KKyAgICAgKiBhbmQgaGFzIG5vdCBiZWVuIGRlY29tcG9zZWQuCisgICAgICovCisgICAgaW50ICAgICAgICAgICAgICBuYl91bml0czsKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIGFuIGFycmF5IG9mIHVuaXRzIG9mIGxlbmd0aCBuYl91bml0cy4KKyAgICAgKgorICAgICAqIE11c3QgYmUgTlVMTCBpZiBuYl91bml0cyBpcyB6ZXJvLgorICAgICAqLworICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdHM7Cit9IENvZGVkQml0c3RyZWFtRnJhZ21lbnQ7CisKKy8qKgorICogQ29udGV4dCBzdHJ1Y3R1cmUgZm9yIGNvZGVkIGJpdHN0cmVhbSBvcGVyYXRpb25zLgorICovCit0eXBlZGVmIHN0cnVjdCBDb2RlZEJpdHN0cmVhbUNvbnRleHQgeworICAgIC8qKgorICAgICAqIExvZ2dpbmcgY29udGV4dCB0byBiZSBwYXNzZWQgdG8gYWxsIGF2X2xvZygpIGNhbGxzIGFzc29jaWF0ZWQKKyAgICAgKiB3aXRoIHRoaXMgY29udGV4dC4KKyAgICAgKi8KKyAgICB2b2lkICpsb2dfY3R4OworCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29kZWMtc3BlY2lmaWMgaG9va3MuCisgICAgICovCisgICAgY29uc3Qgc3RydWN0IENvZGVkQml0c3RyZWFtVHlwZSAqY29kZWM7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBjb2RlYy1zcGVjaWZpYyBkYXRhLgorICAgICAqCisgICAgICogVGhpcyBjb250YWlucyBhbnkgaW5mb3JtYXRpb24gbmVlZGVkIHdoZW4gcmVhZGluZy93cml0aW5nCisgICAgICogYml0c3RlYW1zIHdoaWNoIHdpbGwgbm90IG5lY2Vzc2FyaWx5IGJlIHByZXNlbnQgaW4gYSBmcmFnbWVudC4KKyAgICAgKiBGb3IgZXhhbXBsZSwgZm9yIEguMjY0IGl0IGNvbnRhaW5zIGFsbCBjdXJyZW50bHkgdmlzaWJsZQorICAgICAqIHBhcmFtZXRlciBzZXRzIC0gdGhleSBhcmUgcmVxdWlyZWQgdG8gZGV0ZXJtaW5lIHRoZSBiaXRzdHJlYW0KKyAgICAgKiBzeW50YXggYnV0IG5lZWQgbm90IGJlIHByZXNlbnQgaW4gZXZlcnkgYWNjZXNzIHVuaXQuCisgICAgICovCisgICAgdm9pZCAqcHJpdl9kYXRhOworCisgICAgLyoqCisgICAgICogQXJyYXkgb2YgdW5pdCB0eXBlcyB3aGljaCBzaG91bGQgYmUgZGVjb21wb3NlZCB3aGVuIHJlYWRpbmcuCisgICAgICoKKyAgICAgKiBUeXBlcyBub3QgaW4gdGhpcyBsaXN0IHdpbGwgYmUgYXZhaWxhYmxlIGluIGJpdHN0cmVhbSBmb3JtIG9ubHkuCisgICAgICogSWYgTlVMTCwgYWxsIHN1cHBvcnRlZCB0eXBlcyB3aWxsIGJlIGRlY29tcG9zZWQuCisgICAgICovCisgICAgQ29kZWRCaXRzdHJlYW1Vbml0VHlwZSAqZGVjb21wb3NlX3VuaXRfdHlwZXM7CisgICAgLyoqCisgICAgICogTGVuZ3RoIG9mIHRoZSBkZWNvbXBvc2VfdW5pdF90eXBlcyBhcnJheS4KKyAgICAgKi8KKyAgICBpbnQgbmJfZGVjb21wb3NlX3VuaXRfdHlwZXM7CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgdHJhY2Ugb3V0cHV0IGR1cmluZyByZWFkL3dyaXRlIG9wZXJhdGlvbnMuCisgICAgICovCisgICAgaW50IHRyYWNlX2VuYWJsZTsKKyAgICAvKioKKyAgICAgKiBMb2cgbGV2ZWwgdG8gdXNlIGZvciB0cmFjZSBvdXRwdXQuCisgICAgICoKKyAgICAgKiBGcm9tIEFWX0xPR18qOyBkZWZhdWx0cyB0byBBVl9MT0dfVFJBQ0UuCisgICAgICovCisgICAgaW50IHRyYWNlX2xldmVsOworfSBDb2RlZEJpdHN0cmVhbUNvbnRleHQ7CisKKworLyoqCisgKiBUYWJsZSBvZiBhbGwgc3VwcG9ydGVkIGNvZGVjIElEcy4KKyAqCisgKiBUZXJtaW5hdGVkIGJ5IEFWX0NPREVDX0lEX05PTkUuCisgKi8KK2V4dGVybiBjb25zdCBlbnVtIEFWQ29kZWNJRCBmZl9jYnNfYWxsX2NvZGVjX2lkc1tdOworCisKKy8qKgorICogQ3JlYXRlIGFuZCBpbml0aWFsaXNlIGEgbmV3IGNvbnRleHQgZm9yIHRoZSBnaXZlbiBjb2RlYy4KKyAqLworaW50IGZmX2Nic19pbml0KENvZGVkQml0c3RyZWFtQ29udGV4dCAqKmN0eCwKKyAgICAgICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCwgdm9pZCAqbG9nX2N0eCk7CisKKy8qKgorICogQ2xvc2UgYSBjb250ZXh0IGFuZCBmcmVlIGFsbCBpbnRlcm5hbCBzdGF0ZS4KKyAqLwordm9pZCBmZl9jYnNfY2xvc2UoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICoqY3R4KTsKKworCisvKioKKyAqIFJlYWQgdGhlIGV4dHJhZGF0YSBiaXRzdHJlYW0gZm91bmQgaW4gY29kZWMgcGFyYW1ldGVycyBpbnRvIGEKKyAqIGZyYWdtZW50LCB0aGVuIHNwbGl0IGludG8gdW5pdHMgYW5kIGRlY29tcG9zZS4KKyAqCisgKiBUaGlzIGFsc28gdXBkYXRlcyB0aGUgaW50ZXJuYWwgc3RhdGUsIHNvIHdpbGwgbmVlZCB0byBiZSBjYWxsZWQgZm9yCisgKiBjb2RlY3Mgd2l0aCBleHRyYWRhdGEgdG8gcmVhZCBwYXJhbWV0ZXIgc2V0cyBuZWNlc3NhcnkgZm9yIGZ1cnRoZXIKKyAqIHBhcnNpbmcgZXZlbiBpZiB0aGUgZnJhZ21lbnQgaXRzZWxmIGlzIG5vdCBkZXNpcmVkLgorICovCitpbnQgZmZfY2JzX3JlYWRfZXh0cmFkYXRhKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyKTsKKworLyoqCisgKiBSZWFkIHRoZSBkYXRhIGJpdHN0cmVhbSBmcm9tIGEgcGFja2V0IGludG8gYSBmcmFnbWVudCwgdGhlbgorICogc3BsaXQgaW50byB1bml0cyBhbmQgZGVjb21wb3NlLgorICoKKyAqIFRoaXMgYWxzbyB1cGRhdGVzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29kZWQgYml0c3RyZWFtIGNvbnRleHQKKyAqIHdpdGggYW55IHBlcnNpc3RlbnQgZGF0YSBmcm9tIHRoZSBmcmFnbWVudCB3aGljaCBtYXkgYmUgcmVxdWlyZWQgdG8KKyAqIHJlYWQgZm9sbG93aW5nIGZyYWdtZW50cyAoZS5nLiBwYXJhbWV0ZXIgc2V0cykuCisgKi8KK2ludCBmZl9jYnNfcmVhZF9wYWNrZXQoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWUGFja2V0ICpwa3QpOworCisvKioKKyAqIFJlYWQgYSBiaXRzdHJlYW0gZnJvbSBhIG1lbW9yeSByZWdpb24gaW50byBhIGZyYWdtZW50LCB0aGVuCisgKiBzcGxpdCBpbnRvIHVuaXRzIGFuZCBkZWNvbXBvc2UuCisgKgorICogVGhpcyBhbHNvIHVwZGF0ZXMgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSBjb2RlZCBiaXRzdHJlYW0gY29udGV4dAorICogd2l0aCBhbnkgcGVyc2lzdGVudCBkYXRhIGZyb20gdGhlIGZyYWdtZW50IHdoaWNoIG1heSBiZSByZXF1aXJlZCB0bworICogcmVhZCBmb2xsb3dpbmcgZnJhZ21lbnRzIChlLmcuIHBhcmFtZXRlciBzZXRzKS4KKyAqLworaW50IGZmX2Nic19yZWFkKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisKKy8qKgorICogV3JpdGUgdGhlIGNvbnRlbnQgb2YgdGhlIGZyYWdtZW50IHRvIGl0cyBvd24gaW50ZXJuYWwgYnVmZmVyLgorICoKKyAqIFdyaXRlcyB0aGUgY29udGVudCBvZiBhbGwgdW5pdHMgYW5kIHRoZW4gYXNzZW1ibGVzIHRoZW0gaW50byBhIG5ldworICogZGF0YSBidWZmZXIuICBXaGVuIG1vZGlmeWluZyB0aGUgY29udGVudCBvZiBkZWNvbXBvc2VkIHVuaXRzLCB0aGlzCisgKiBjYW4gYmUgdXNlZCB0byByZWdlbmVyYXRlIHRoZSBiaXRzdHJlYW0gZm9ybSBvZiB1bml0cyBvciB0aGUgd2hvbGUKKyAqIGZyYWdtZW50IHNvIHRoYXQgaXQgY2FuIGJlIGV4dHJhY3RlZCBmb3Igb3RoZXIgdXNlLgorICoKKyAqIFRoaXMgYWxzbyB1cGRhdGVzIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgY29kZWQgYml0c3RyZWFtIGNvbnRleHQKKyAqIHdpdGggYW55IHBlcnNpc3RlbnQgZGF0YSBmcm9tIHRoZSBmcmFnbWVudCB3aGljaCBtYXkgYmUgcmVxdWlyZWQgdG8KKyAqIHdyaXRlIGZvbGxvd2luZyBmcmFnbWVudHMgKGUuZy4gcGFyYW1ldGVyIHNldHMpLgorICovCitpbnQgZmZfY2JzX3dyaXRlX2ZyYWdtZW50X2RhdGEoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZyk7CisKKy8qKgorICogV3JpdGUgdGhlIGJpdHN0cmVhbSBvZiBhIGZyYWdtZW50IHRvIHRoZSBleHRyYWRhdGEgaW4gY29kZWMgcGFyYW1ldGVycy4KKyAqCisgKiBUaGlzIHJlcGxhY2VzIGFueSBleGlzdGluZyBleHRyYWRhdGEgaW4gdGhlIHN0cnVjdHVyZS4KKyAqLworaW50IGZmX2Nic193cml0ZV9leHRyYWRhdGEoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZyk7CisKKy8qKgorICogV3JpdGUgdGhlIGJpdHN0cmVhbSBvZiBhIGZyYWdtZW50IHRvIGEgcGFja2V0LgorICovCitpbnQgZmZfY2JzX3dyaXRlX3BhY2tldChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnKTsKKworCisvKioKKyAqIEZyZWUgYWxsIGFsbG9jYXRlZCBtZW1vcnkgaW4gYSBmcmFnbWVudC4KKyAqLwordm9pZCBmZl9jYnNfZnJhZ21lbnRfdW5pbml0KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcpOworCisKKy8qKgorICogQWxsb2NhdGUgYSBuZXcgaW50ZXJuYWwgY29udGVudCBidWZmZXIgb2YgdGhlIGdpdmVuIHNpemUgaW4gdGhlIHVuaXQuCisgKgorICogVGhlIGNvbnRlbnQgd2lsbCBiZSB6ZXJvZWQuCisgKi8KK2ludCBmZl9jYnNfYWxsb2NfdW5pdF9jb250ZW50KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1Vbml0ICp1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqZnJlZSkodm9pZCAqdW5pdCwgdWludDhfdCAqY29udGVudCkpOworCisvKioKKyAqIEFsbG9jYXRlIGEgbmV3IGludGVybmFsIGRhdGEgYnVmZmVyIG9mIHRoZSBnaXZlbiBzaXplIGluIHRoZSB1bml0LgorICoKKyAqIFRoZSBkYXRhIGJ1ZmZlciB3aWxsIGhhdmUgaW5wdXQgcGFkZGluZy4KKyAqLworaW50IGZmX2Nic19hbGxvY191bml0X2RhdGEoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXQgKnVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogSW5zZXJ0IGEgbmV3IHVuaXQgaW50byBhIGZyYWdtZW50IHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuCisgKgorICogVGhlIGNvbnRlbnQgc3RydWN0dXJlIGNvbnRpbnVlcyB0byBiZSBvd25lZCBieSB0aGUgY2FsbGVyIGlmCisgKiBjb250ZW50X2J1ZiBpcyBub3Qgc3VwcGxpZWQuCisgKi8KK2ludCBmZl9jYnNfaW5zZXJ0X3VuaXRfY29udGVudChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqY29udGVudF9idWYpOworCisvKioKKyAqIEluc2VydCBhIG5ldyB1bml0IGludG8gYSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBkYXRhIGJpdHN0cmVhbS4KKyAqCisgKiBJZiBkYXRhX2J1ZiBpcyBub3Qgc3VwcGxpZWQgdGhlbiBkYXRhIG11c3QgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aXRoCisgKiBhdl9tYWxsb2MoKSBhbmQgd2lsbCBiZWNvbWUgb3duZWQgYnkgdGhlIHVuaXQgYWZ0ZXIgdGhpcyBjYWxsLgorICovCitpbnQgZmZfY2JzX2luc2VydF91bml0X2RhdGEoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1Vbml0VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmRhdGFfYnVmKTsKKworLyoqCisgKiBEZWxldGUgYSB1bml0IGZyb20gYSBmcmFnbWVudCBhbmQgZnJlZSBhbGwgbWVtb3J5IGl0IHVzZXMuCisgKi8KK2ludCBmZl9jYnNfZGVsZXRlX3VuaXQoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbik7CisKKworI2VuZGlmIC8qIEFWQ09ERUNfQ0JTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JzX2gyNjQuaCBiL2xpYmF2Y29kZWMvY2JzX2gyNjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjE5ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9jYnNfaDI2NC5oCkBAIC0wLDAgKzEsNDU4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19DQlNfSDI2NF9ICisjZGVmaW5lIEFWQ09ERUNfQ0JTX0gyNjRfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjYnMuaCIKKyNpbmNsdWRlICJjYnNfaDI2NDUuaCIKKyNpbmNsdWRlICJoMjY0LmgiCisKKworZW51bSB7CisgICAgLy8gVGhpcyBsaW1pdCBpcyBhcmJpdHJhcnkgLSBpdCBpcyBzdWZmaWNpZW50IGZvciBvbmUgbWVzc2FnZSBvZiBlYWNoCisgICAgLy8gdHlwZSBwbHVzIHNvbWUgcmVwZWF0cywgYW5kIHdpbGwgdGhlcmVmb3JlIGVhc2lseSBjb3ZlciBhbGwgc2FuZQorICAgIC8vIHN0cmVhbXMuICBIb3dldmVyLCBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIHRlY2huaWNhbGx5LXZhbGlkIHN0cmVhbXMKKyAgICAvLyBmb3Igd2hpY2ggaXQgd2lsbCBmYWlsIChmb3IgZXhhbXBsZSwgYnkgaW5jbHVkaW5nIGEgbGFyZ2UgbnVtYmVyIG9mCisgICAgLy8gdXNlci1kYXRhLXVucmVnaXN0ZXJlZCBtZXNzYWdlcykuCisgICAgSDI2NF9NQVhfU0VJX1BBWUxPQURTID0gNjQsCit9OworCisKK3R5cGVkZWYgc3RydWN0IEgyNjRSYXdOQUxVbml0SGVhZGVyIHsKKyAgICB1aW50OF90IGZvcmJpZGRlbl96ZXJvX2JpdDsKKyAgICB1aW50OF90IG5hbF9yZWZfaWRjOworICAgIHVpbnQ4X3QgbmFsX3VuaXRfdHlwZTsKKworICAgIHVpbnQ4X3Qgc3ZjX2V4dGVuc2lvbl9mbGFnOworICAgIHVpbnQ4X3QgYXZjXzNkX2V4dGVuc2lvbl9mbGFnOworfSBIMjY0UmF3TkFMVW5pdEhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFJhd1NjYWxpbmdMaXN0IHsKKyAgICBpbnQ4X3QgZGVsdGFfc2NhbGVbNjRdOworfSBIMjY0UmF3U2NhbGluZ0xpc3Q7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRSYXdIUkQgeworICAgIHVpbnQ4X3QgY3BiX2NudF9taW51czE7CisgICAgdWludDhfdCBiaXRfcmF0ZV9zY2FsZTsKKyAgICB1aW50OF90IGNwYl9zaXplX3NjYWxlOworCisgICAgdWludDMyX3QgYml0X3JhdGVfdmFsdWVfbWludXMxW0gyNjRfTUFYX0NQQl9DTlRdOworICAgIHVpbnQzMl90IGNwYl9zaXplX3ZhbHVlX21pbnVzMVtIMjY0X01BWF9DUEJfQ05UXTsKKyAgICB1aW50OF90IGNicl9mbGFnW0gyNjRfTUFYX0NQQl9DTlRdOworCisgICAgdWludDhfdCBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czE7CisgICAgdWludDhfdCBjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxOworICAgIHVpbnQ4X3QgZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxOworICAgIHVpbnQ4X3QgdGltZV9vZmZzZXRfbGVuZ3RoOworfSBIMjY0UmF3SFJEOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UmF3VlVJIHsKKyAgICB1aW50OF90IGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IGFzcGVjdF9yYXRpb19pZGM7CisgICAgdWludDE2X3Qgc2FyX3dpZHRoOworICAgIHVpbnQxNl90IHNhcl9oZWlnaHQ7CisKKyAgICB1aW50OF90IG92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3Qgb3ZlcnNjYW5fYXBwcm9wcmlhdGVfZmxhZzsKKworICAgIHVpbnQ4X3QgdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgdmlkZW9fZm9ybWF0OworICAgIHVpbnQ4X3QgdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworICAgIHVpbnQ4X3QgY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IGNvbG91cl9wcmltYXJpZXM7CisgICAgdWludDhfdCB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgdWludDhfdCBtYXRyaXhfY29lZmZpY2llbnRzOworCisgICAgdWludDhfdCBjaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgY2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQ7CisgICAgdWludDhfdCBjaHJvbWFfc2FtcGxlX2xvY190eXBlX2JvdHRvbV9maWVsZDsKKworICAgIHVpbnQ4X3QgdGltaW5nX2luZm9fcHJlc2VudF9mbGFnOworICAgIHVpbnQzMl90IG51bV91bml0c19pbl90aWNrOworICAgIHVpbnQzMl90IHRpbWVfc2NhbGU7CisgICAgdWludDhfdCBmaXhlZF9mcmFtZV9yYXRlX2ZsYWc7CisKKyAgICB1aW50OF90IG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisgICAgSDI2NFJhd0hSRCBuYWxfaHJkX3BhcmFtZXRlcnM7CisgICAgdWludDhfdCB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworICAgIEgyNjRSYXdIUkQgdmNsX2hyZF9wYXJhbWV0ZXJzOworICAgIHVpbnQ4X3QgbG93X2RlbGF5X2hyZF9mbGFnOworCisgICAgdWludDhfdCBwaWNfc3RydWN0X3ByZXNlbnRfZmxhZzsKKworICAgIHVpbnQ4X3QgYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7CisgICAgdWludDhfdCBtb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWc7CisgICAgdWludDhfdCBtYXhfYnl0ZXNfcGVyX3BpY19kZW5vbTsKKyAgICB1aW50OF90IG1heF9iaXRzX3Blcl9tYl9kZW5vbTsKKyAgICB1aW50OF90IGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsOworICAgIHVpbnQ4X3QgbG9nMl9tYXhfbXZfbGVuZ3RoX3ZlcnRpY2FsOworICAgIHVpbnQ4X3QgbWF4X251bV9yZW9yZGVyX2ZyYW1lczsKKyAgICB1aW50OF90IG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nOworfSBIMjY0UmF3VlVJOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UmF3U1BTIHsKKyAgICBIMjY0UmF3TkFMVW5pdEhlYWRlciBuYWxfdW5pdF9oZWFkZXI7CisKKyAgICB1aW50OF90IHByb2ZpbGVfaWRjOworICAgIHVpbnQ4X3QgY29uc3RyYWludF9zZXQwX2ZsYWc7CisgICAgdWludDhfdCBjb25zdHJhaW50X3NldDFfZmxhZzsKKyAgICB1aW50OF90IGNvbnN0cmFpbnRfc2V0Ml9mbGFnOworICAgIHVpbnQ4X3QgY29uc3RyYWludF9zZXQzX2ZsYWc7CisgICAgdWludDhfdCBjb25zdHJhaW50X3NldDRfZmxhZzsKKyAgICB1aW50OF90IGNvbnN0cmFpbnRfc2V0NV9mbGFnOworICAgIHVpbnQ4X3QgcmVzZXJ2ZWRfemVyb18yYml0czsKKyAgICB1aW50OF90IGxldmVsX2lkYzsKKworICAgIHVpbnQ4X3Qgc2VxX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICB1aW50OF90IGNocm9tYV9mb3JtYXRfaWRjOworICAgIHVpbnQ4X3Qgc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWc7CisgICAgdWludDhfdCBiaXRfZGVwdGhfbHVtYV9taW51czg7CisgICAgdWludDhfdCBiaXRfZGVwdGhfY2hyb21hX21pbnVzODsKKyAgICB1aW50OF90IHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZzsKKworICAgIHVpbnQ4X3Qgc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IHNlcV9zY2FsaW5nX2xpc3RfcHJlc2VudF9mbGFnWzEyXTsKKyAgICBIMjY0UmF3U2NhbGluZ0xpc3Qgc2NhbGluZ19saXN0XzR4NFs2XTsKKyAgICBIMjY0UmF3U2NhbGluZ0xpc3Qgc2NhbGluZ19saXN0Xzh4OFs2XTsKKworICAgIHVpbnQ4X3QgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNDsKKyAgICB1aW50OF90IHBpY19vcmRlcl9jbnRfdHlwZTsKKyAgICB1aW50OF90IGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKKyAgICB1aW50OF90IGRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOworICAgIGludDMyX3Qgb2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKyAgICBpbnQzMl90IG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKKyAgICB1aW50OF90IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGU7CisgICAgaW50MzJfdCBvZmZzZXRfZm9yX3JlZl9mcmFtZVsyNTZdOworCisgICAgdWludDhfdCBtYXhfbnVtX3JlZl9mcmFtZXM7CisgICAgdWludDhfdCBnYXBzX2luX2ZyYW1lX251bV9hbGxvd2VkX2ZsYWc7CisKKyAgICB1aW50MTZfdCBwaWNfd2lkdGhfaW5fbWJzX21pbnVzMTsKKyAgICB1aW50MTZfdCBwaWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czE7CisKKyAgICB1aW50OF90IGZyYW1lX21ic19vbmx5X2ZsYWc7CisgICAgdWludDhfdCBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnOworICAgIHVpbnQ4X3QgZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKKworICAgIHVpbnQ4X3QgZnJhbWVfY3JvcHBpbmdfZmxhZzsKKyAgICB1aW50MTZfdCBmcmFtZV9jcm9wX2xlZnRfb2Zmc2V0OworICAgIHVpbnQxNl90IGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0OworICAgIHVpbnQxNl90IGZyYW1lX2Nyb3BfdG9wX29mZnNldDsKKyAgICB1aW50MTZfdCBmcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQ7CisKKyAgICB1aW50OF90IHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICBIMjY0UmF3VlVJIHZ1aTsKK30gSDI2NFJhd1NQUzsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFJhd1NQU0V4dGVuc2lvbiB7CisgICAgSDI2NFJhd05BTFVuaXRIZWFkZXIgbmFsX3VuaXRfaGVhZGVyOworCisgICAgdWludDhfdCBzZXFfcGFyYW1ldGVyX3NldF9pZDsKKworICAgIHVpbnQ4X3QgYXV4X2Zvcm1hdF9pZGM7CisgICAgdWludDhfdCBiaXRfZGVwdGhfYXV4X21pbnVzODsKKyAgICB1aW50OF90IGFscGhhX2luY3JfZmxhZzsKKyAgICB1aW50MTZfdCBhbHBoYV9vcGFxdWVfdmFsdWU7CisgICAgdWludDE2X3QgYWxwaGFfdHJhbnNwYXJlbnRfdmFsdWU7CisKKyAgICB1aW50OF90IGFkZGl0aW9uYWxfZXh0ZW5zaW9uX2ZsYWc7Cit9IEgyNjRSYXdTUFNFeHRlbnNpb247CisKK3R5cGVkZWYgc3RydWN0IEgyNjRSYXdQUFMgeworICAgIEgyNjRSYXdOQUxVbml0SGVhZGVyIG5hbF91bml0X2hlYWRlcjsKKworICAgIHVpbnQ4X3QgcGljX3BhcmFtZXRlcl9zZXRfaWQ7CisgICAgdWludDhfdCBzZXFfcGFyYW1ldGVyX3NldF9pZDsKKworICAgIHVpbnQ4X3QgZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnOworICAgIHVpbnQ4X3QgYm90dG9tX2ZpZWxkX3BpY19vcmRlcl9pbl9mcmFtZV9wcmVzZW50X2ZsYWc7CisKKyAgICB1aW50OF90IG51bV9zbGljZV9ncm91cHNfbWludXMxOworICAgIHVpbnQ4X3Qgc2xpY2VfZ3JvdXBfbWFwX3R5cGU7CisgICAgdWludDE2X3QgcnVuX2xlbmd0aF9taW51czFbSDI2NF9NQVhfU0xJQ0VfR1JPVVBTXTsKKyAgICB1aW50MTZfdCB0b3BfbGVmdFtIMjY0X01BWF9TTElDRV9HUk9VUFNdOworICAgIHVpbnQxNl90IGJvdHRvbV9yaWdodFtIMjY0X01BWF9TTElDRV9HUk9VUFNdOworICAgIHVpbnQ4X3Qgc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnOworICAgIHVpbnQxNl90IHNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMTsKKyAgICB1aW50MTZfdCBwaWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxOworCisgICAgdWludDhfdCAqc2xpY2VfZ3JvdXBfaWQ7CisgICAgQVZCdWZmZXJSZWYgKnNsaWNlX2dyb3VwX2lkX3JlZjsKKworICAgIHVpbnQ4X3QgbnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxOworICAgIHVpbnQ4X3QgbnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxOworCisgICAgdWludDhfdCB3ZWlnaHRlZF9wcmVkX2ZsYWc7CisgICAgdWludDhfdCB3ZWlnaHRlZF9iaXByZWRfaWRjOworCisgICAgaW50OF90IHBpY19pbml0X3FwX21pbnVzMjY7CisgICAgaW50OF90IHBpY19pbml0X3FzX21pbnVzMjY7CisgICAgaW50OF90IGNocm9tYV9xcF9pbmRleF9vZmZzZXQ7CisKKyAgICB1aW50OF90IGRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnOworCisgICAgdWludDhfdCBtb3JlX3Jic3BfZGF0YTsKKworICAgIHVpbnQ4X3QgcmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgdHJhbnNmb3JtXzh4OF9tb2RlX2ZsYWc7CisKKyAgICB1aW50OF90IHBpY19zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCBwaWNfc2NhbGluZ19saXN0X3ByZXNlbnRfZmxhZ1sxMl07CisgICAgSDI2NFJhd1NjYWxpbmdMaXN0IHNjYWxpbmdfbGlzdF80eDRbNl07CisgICAgSDI2NFJhd1NjYWxpbmdMaXN0IHNjYWxpbmdfbGlzdF84eDhbNl07CisKKyAgICBpbnQ4X3Qgc2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQ7Cit9IEgyNjRSYXdQUFM7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRSYXdBVUQgeworICAgIEgyNjRSYXdOQUxVbml0SGVhZGVyIG5hbF91bml0X2hlYWRlcjsKKworICAgIHVpbnQ4X3QgcHJpbWFyeV9waWNfdHlwZTsKK30gSDI2NFJhd0FVRDsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFJhd1NFSUJ1ZmZlcmluZ1BlcmlvZCB7CisgICAgdWludDhfdCBzZXFfcGFyYW1ldGVyX3NldF9pZDsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50MzJfdCBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5W0gyNjRfTUFYX0NQQl9DTlRdOworICAgICAgICB1aW50MzJfdCBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldFtIMjY0X01BWF9DUEJfQ05UXTsKKyAgICB9IG5hbCwgdmNsOworfSBIMjY0UmF3U0VJQnVmZmVyaW5nUGVyaW9kOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UmF3U0VJUGljVGltZXN0YW1wIHsKKyAgICB1aW50OF90IGN0X3R5cGU7CisgICAgdWludDhfdCBudWl0X2ZpZWxkX2Jhc2VkX2ZsYWc7CisgICAgdWludDhfdCBjb3VudGluZ190eXBlOworICAgIHVpbnQ4X3QgZnVsbF90aW1lc3RhbXBfZmxhZzsKKyAgICB1aW50OF90IGRpc2NvbnRpbnVpdHlfZmxhZzsKKyAgICB1aW50OF90IGNudF9kcm9wcGVkX2ZsYWc7CisgICAgdWludDhfdCBuX2ZyYW1lczsKKyAgICB1aW50OF90IHNlY29uZHNfZmxhZzsKKyAgICB1aW50OF90IHNlY29uZHNfdmFsdWU7CisgICAgdWludDhfdCBtaW51dGVzX2ZsYWc7CisgICAgdWludDhfdCBtaW51dGVzX3ZhbHVlOworICAgIHVpbnQ4X3QgaG91cnNfZmxhZzsKKyAgICB1aW50OF90IGhvdXJzX3ZhbHVlOworICAgIHVpbnQzMl90IHRpbWVfb2Zmc2V0OworfSBIMjY0UmF3U0VJUGljVGltZXN0YW1wOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UmF3U0VJUGljVGltaW5nIHsKKyAgICB1aW50MzJfdCBjcGJfcmVtb3ZhbF9kZWxheTsKKyAgICB1aW50MzJfdCBkcGJfb3V0cHV0X2RlbGF5OworICAgIHVpbnQ4X3QgcGljX3N0cnVjdDsKKyAgICB1aW50OF90IGNsb2NrX3RpbWVzdGFtcF9mbGFnWzNdOworICAgIEgyNjRSYXdTRUlQaWNUaW1lc3RhbXAgdGltZXN0YW1wWzNdOworfSBIMjY0UmF3U0VJUGljVGltaW5nOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UmF3U0VJVXNlckRhdGFSZWdpc3RlcmVkIHsKKyAgICB1aW50OF90IGl0dV90X3QzNV9jb3VudHJ5X2NvZGU7CisgICAgdWludDhfdCBpdHVfdF90MzVfY291bnRyeV9jb2RlX2V4dGVuc2lvbl9ieXRlOworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgc2l6ZV90IGRhdGFfbGVuZ3RoOworICAgIEFWQnVmZmVyUmVmICpkYXRhX3JlZjsKK30gSDI2NFJhd1NFSVVzZXJEYXRhUmVnaXN0ZXJlZDsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFJhd1NFSVVzZXJEYXRhVW5yZWdpc3RlcmVkIHsKKyAgICB1aW50OF90IHV1aWRfaXNvX2llY18xMTU3OFsxNl07CisgICAgdWludDhfdCAqZGF0YTsKKyAgICBzaXplX3QgZGF0YV9sZW5ndGg7CisgICAgQVZCdWZmZXJSZWYgKmRhdGFfcmVmOworfSBIMjY0UmF3U0VJVXNlckRhdGFVbnJlZ2lzdGVyZWQ7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRSYXdTRUlSZWNvdmVyeVBvaW50IHsKKyAgICB1aW50MTZfdCByZWNvdmVyeV9mcmFtZV9jbnQ7CisgICAgdWludDhfdCBleGFjdF9tYXRjaF9mbGFnOworICAgIHVpbnQ4X3QgYnJva2VuX2xpbmtfZmxhZzsKKyAgICB1aW50OF90IGNoYW5naW5nX3NsaWNlX2dyb3VwX2lkYzsKK30gSDI2NFJhd1NFSVJlY292ZXJ5UG9pbnQ7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRSYXdTRUlEaXNwbGF5T3JpZW50YXRpb24geworICAgIHVpbnQ4X3QgZGlzcGxheV9vcmllbnRhdGlvbl9jYW5jZWxfZmxhZzsKKyAgICB1aW50OF90IGhvcl9mbGlwOworICAgIHVpbnQ4X3QgdmVyX2ZsaXA7CisgICAgdWludDE2X3QgYW50aWNsb2Nrd2lzZV9yb3RhdGlvbjsKKyAgICB1aW50MTZfdCBkaXNwbGF5X29yaWVudGF0aW9uX3JlcGV0aXRpb25fcGVyaW9kOworICAgIHVpbnQ4X3QgZGlzcGxheV9vcmllbnRhdGlvbl9leHRlbnNpb25fZmxhZzsKK30gSDI2NFJhd1NFSURpc3BsYXlPcmllbnRhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFJhd1NFSVBheWxvYWQgeworICAgIHVpbnQzMl90IHBheWxvYWRfdHlwZTsKKyAgICB1aW50MzJfdCBwYXlsb2FkX3NpemU7CisgICAgdW5pb24geworICAgICAgICBIMjY0UmF3U0VJQnVmZmVyaW5nUGVyaW9kIGJ1ZmZlcmluZ19wZXJpb2Q7CisgICAgICAgIEgyNjRSYXdTRUlQaWNUaW1pbmcgcGljX3RpbWluZzsKKyAgICAgICAgLy8gSDI2NFJhd1NFSUZpbGxlciBmaWxsZXIgLT4gbm8gZmllbGRzLgorICAgICAgICBIMjY0UmF3U0VJVXNlckRhdGFSZWdpc3RlcmVkIHVzZXJfZGF0YV9yZWdpc3RlcmVkOworICAgICAgICBIMjY0UmF3U0VJVXNlckRhdGFVbnJlZ2lzdGVyZWQgdXNlcl9kYXRhX3VucmVnaXN0ZXJlZDsKKyAgICAgICAgSDI2NFJhd1NFSVJlY292ZXJ5UG9pbnQgcmVjb3ZlcnlfcG9pbnQ7CisgICAgICAgIEgyNjRSYXdTRUlEaXNwbGF5T3JpZW50YXRpb24gZGlzcGxheV9vcmllbnRhdGlvbjsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgICAgICAgICBzaXplX3QgZGF0YV9sZW5ndGg7CisgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqZGF0YV9yZWY7CisgICAgICAgIH0gb3RoZXI7CisgICAgfSBwYXlsb2FkOworfSBIMjY0UmF3U0VJUGF5bG9hZDsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFJhd1NFSSB7CisgICAgSDI2NFJhd05BTFVuaXRIZWFkZXIgbmFsX3VuaXRfaGVhZGVyOworCisgICAgSDI2NFJhd1NFSVBheWxvYWQgcGF5bG9hZFtIMjY0X01BWF9TRUlfUEFZTE9BRFNdOworICAgIHVpbnQ4X3QgcGF5bG9hZF9jb3VudDsKK30gSDI2NFJhd1NFSTsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFJhd1NsaWNlSGVhZGVyIHsKKyAgICBIMjY0UmF3TkFMVW5pdEhlYWRlciBuYWxfdW5pdF9oZWFkZXI7CisKKyAgICB1aW50MzJfdCBmaXJzdF9tYl9pbl9zbGljZTsKKyAgICB1aW50OF90IHNsaWNlX3R5cGU7CisKKyAgICB1aW50OF90IHBpY19wYXJhbWV0ZXJfc2V0X2lkOworCisgICAgdWludDhfdCBjb2xvdXJfcGxhbmVfaWQ7CisKKyAgICB1aW50MTZfdCBmcmFtZV9udW07CisgICAgdWludDhfdCBmaWVsZF9waWNfZmxhZzsKKyAgICB1aW50OF90IGJvdHRvbV9maWVsZF9mbGFnOworCisgICAgdWludDE2X3QgaWRyX3BpY19pZDsKKworICAgIHVpbnQxNl90IHBpY19vcmRlcl9jbnRfbHNiOworICAgIGludDMyX3QgZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b207CisgICAgaW50MzJfdCBkZWx0YV9waWNfb3JkZXJfY250WzJdOworCisgICAgdWludDhfdCByZWR1bmRhbnRfcGljX2NudDsKKyAgICB1aW50OF90IGRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZzsKKworICAgIHVpbnQ4X3QgbnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWc7CisgICAgdWludDhfdCBudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOworICAgIHVpbnQ4X3QgbnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMTsKKworICAgIHVpbnQ4X3QgcmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2wwOworICAgIHVpbnQ4X3QgcmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2wxOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgbW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYzsKKyAgICAgICAgaW50MzJfdCBhYnNfZGlmZl9waWNfbnVtX21pbnVzMTsKKyAgICAgICAgdWludDhfdCBsb25nX3Rlcm1fcGljX251bTsKKyAgICB9IHJwbG1fbDBbSDI2NF9NQVhfUlBMTV9DT1VOVF0sIHJwbG1fbDFbSDI2NF9NQVhfUlBMTV9DT1VOVF07CisKKyAgICB1aW50OF90IGx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgdWludDhfdCBjaHJvbWFfbG9nMl93ZWlnaHRfZGVub207CisKKyAgICB1aW50OF90IGx1bWFfd2VpZ2h0X2wwX2ZsYWdbSDI2NF9NQVhfUkVGU107CisgICAgaW50OF90IGx1bWFfd2VpZ2h0X2wwW0gyNjRfTUFYX1JFRlNdOworICAgIGludDhfdCBsdW1hX29mZnNldF9sMFtIMjY0X01BWF9SRUZTXTsKKyAgICB1aW50OF90IGNocm9tYV93ZWlnaHRfbDBfZmxhZ1tIMjY0X01BWF9SRUZTXTsKKyAgICBpbnQ4X3QgY2hyb21hX3dlaWdodF9sMFtIMjY0X01BWF9SRUZTXVsyXTsKKyAgICBpbnQ4X3QgY2hyb21hX29mZnNldF9sMFtIMjY0X01BWF9SRUZTXVsyXTsKKworICAgIHVpbnQ4X3QgbHVtYV93ZWlnaHRfbDFfZmxhZ1tIMjY0X01BWF9SRUZTXTsKKyAgICBpbnQ4X3QgbHVtYV93ZWlnaHRfbDFbSDI2NF9NQVhfUkVGU107CisgICAgaW50OF90IGx1bWFfb2Zmc2V0X2wxW0gyNjRfTUFYX1JFRlNdOworICAgIHVpbnQ4X3QgY2hyb21hX3dlaWdodF9sMV9mbGFnW0gyNjRfTUFYX1JFRlNdOworICAgIGludDhfdCBjaHJvbWFfd2VpZ2h0X2wxW0gyNjRfTUFYX1JFRlNdWzJdOworICAgIGludDhfdCBjaHJvbWFfb2Zmc2V0X2wxW0gyNjRfTUFYX1JFRlNdWzJdOworCisgICAgdWludDhfdCBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnOworICAgIHVpbnQ4X3QgbG9uZ190ZXJtX3JlZmVyZW5jZV9mbGFnOworCisgICAgdWludDhfdCBhZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgbWVtb3J5X21hbmFnZW1lbnRfY29udHJvbF9vcGVyYXRpb247CisgICAgICAgIGludDMyX3QgZGlmZmVyZW5jZV9vZl9waWNfbnVtc19taW51czE7CisgICAgICAgIHVpbnQ4X3QgbG9uZ190ZXJtX3BpY19udW07CisgICAgICAgIHVpbnQ4X3QgbG9uZ190ZXJtX2ZyYW1lX2lkeDsKKyAgICAgICAgdWludDhfdCBtYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMTsKKyAgICB9IG1tY29bSDI2NF9NQVhfTU1DT19DT1VOVF07CisKKyAgICB1aW50OF90IGNhYmFjX2luaXRfaWRjOworCisgICAgaW50OF90IHNsaWNlX3FwX2RlbHRhOworCisgICAgdWludDhfdCBzcF9mb3Jfc3dpdGNoX2ZsYWc7CisgICAgaW50OF90IHNsaWNlX3FzX2RlbHRhOworCisgICAgdWludDhfdCBkaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYzsKKyAgICBpbnQ4X3Qgc2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjI7CisgICAgaW50OF90IHNsaWNlX2JldGFfb2Zmc2V0X2RpdjI7CisKKyAgICB1aW50MTZfdCBzbGljZV9ncm91cF9jaGFuZ2VfY3ljbGU7Cit9IEgyNjRSYXdTbGljZUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFJhd1NsaWNlIHsKKyAgICBIMjY0UmF3U2xpY2VIZWFkZXIgaGVhZGVyOworCisgICAgdWludDhfdCAqZGF0YTsKKyAgICBzaXplX3QgICBkYXRhX3NpemU7CisgICAgaW50ICAgICAgZGF0YV9iaXRfc3RhcnQ7CisgICAgQVZCdWZmZXJSZWYgKmRhdGFfcmVmOworfSBIMjY0UmF3U2xpY2U7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRSYXdGaWxsZXIgeworICAgIEgyNjRSYXdOQUxVbml0SGVhZGVyIG5hbF91bml0X2hlYWRlcjsKKworICAgIHVpbnQzMl90IGZpbGxlcl9zaXplOworfSBIMjY0UmF3RmlsbGVyOworCisKK3R5cGVkZWYgc3RydWN0IENvZGVkQml0c3RyZWFtSDI2NENvbnRleHQgeworICAgIC8vIFJlYWRlci93cml0ZXIgY29udGV4dCBpbiBjb21tb24gd2l0aCB0aGUgSC4yNjUgaW1wbGVtZW50YXRpb24uCisgICAgQ29kZWRCaXRzdHJlYW1IMjY0NUNvbnRleHQgY29tbW9uOworCisgICAgLy8gQWxsIGN1cnJlbnRseSBhdmFpbGFibGUgcGFyYW1ldGVyIHNldHMuICBUaGVzZSBhcmUgdXBkYXRlZCB3aGVuCisgICAgLy8gYW55IHBhcmFtZXRlciBzZXQgTkFMIHVuaXQgaXMgcmVhZC93cml0dGVuIHdpdGggdGhpcyBjb250ZXh0LgorICAgIEgyNjRSYXdTUFMgKnNwc1tIMjY0X01BWF9TUFNfQ09VTlRdOworICAgIEgyNjRSYXdQUFMgKnBwc1tIMjY0X01BWF9QUFNfQ09VTlRdOworCisgICAgLy8gVGhlIGN1cnJlbnRseSBhY3RpdmUgcGFyYW1ldGVyIHNldHMuICBUaGVzZSBhcmUgdXBkYXRlZCB3aGVuIGFueQorICAgIC8vIE5BTCB1bml0IHJlZmVycyB0byB0aGUgcmVsZXZhbnQgcGFyYW1ldGVyIHNldC4gIFRoZXNlIHBvaW50ZXJzCisgICAgLy8gbXVzdCBhbHNvIGJlIHByZXNlbnQgaW4gdGhlIGFycmF5cyBhYm92ZS4KKyAgICBjb25zdCBIMjY0UmF3U1BTICphY3RpdmVfc3BzOworICAgIGNvbnN0IEgyNjRSYXdQUFMgKmFjdGl2ZV9wcHM7CisKKyAgICAvLyBUaGUgTkFMIHVuaXQgdHlwZSBvZiB0aGUgbW9zdCByZWNlbnQgbm9ybWFsIHNsaWNlLiAgVGhpcyBpcyByZXF1aXJlZAorICAgIC8vIHRvIGJlIGFibGUgdG8gcmVhZC93cml0ZSBhdXhpbGlhcnkgc2xpY2VzLCBiZWNhdXNlIElkclBpY0ZsYWcgaXMKKyAgICAvLyBvdGhlcndpc2UgdW5rbm93bi4KKyAgICB1aW50OF90IGxhc3Rfc2xpY2VfbmFsX3VuaXRfdHlwZTsKK30gQ29kZWRCaXRzdHJlYW1IMjY0Q29udGV4dDsKKworCisvKioKKyAqIEFkZCBhbiBTRUkgbWVzc2FnZSB0byBhbiBhY2Nlc3MgdW5pdC4KKyAqLworaW50IGZmX2Nic19oMjY0X2FkZF9zZWlfbWVzc2FnZShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqYWNjZXNzX3VuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEgyNjRSYXdTRUlQYXlsb2FkICpwYXlsb2FkKTsKKworLyoqCisgKiBEZWxldGUgYW4gU0VJIG1lc3NhZ2UgZnJvbSBhbiBhY2Nlc3MgdW5pdC4KKyAqCisgKiBEZWxldGVzIGZyb20gbmFsX3VuaXQsIHdoaWNoIG11c3QgYmUgYW4gU0VJIE5BTCB1bml0LiAgSWYgdGhpcyBpcyB0aGUKKyAqIGxhc3QgbWVzc2FnZSBpbiBuYWxfdW5pdCwgYWxzbyBkZWxldGVzIGl0IGZyb20gYWNjZXNzX3VuaXQuCisgKi8KK2ludCBmZl9jYnNfaDI2NF9kZWxldGVfc2VpX21lc3NhZ2UoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmFjY2Vzc191bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXQgKm5hbF91bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24pOworCisjZW5kaWYgLyogQVZDT0RFQ19DQlNfSDI2NF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Nic19oMjY0NS5jIGIvbGliYXZjb2RlYy9jYnNfaDI2NDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg1ODMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9jYnNfaDI2NDUuYwpAQCAtMCwwICsxLDE1MjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiY2JzLmgiCisjaW5jbHVkZSAiY2JzX2ludGVybmFsLmgiCisjaW5jbHVkZSAiY2JzX2gyNjQuaCIKKyNpbmNsdWRlICJjYnNfaDI2NS5oIgorI2luY2x1ZGUgImdvbG9tYi5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0X3NlaS5oIgorI2luY2x1ZGUgImgyNjQ1X3BhcnNlLmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorCisKK3N0YXRpYyBpbnQgY2JzX3JlYWRfdWVfZ29sb21iKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCAqd3JpdGVfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5nZV9taW4sIHVpbnQzMl90IHJhbmdlX21heCkKK3sKKyAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICBpbnQgcG9zaXRpb24sIGksIGo7CisgICAgdW5zaWduZWQgaW50IGs7CisgICAgY2hhciBiaXRzWzY1XTsKKworICAgIHBvc2l0aW9uID0gZ2V0X2JpdHNfY291bnQoZ2JjKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiYykgPCBpICsgMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB1ZS1nb2xvbWIgY29kZSBhdCAiCisgICAgICAgICAgICAgICAgICAgIiVzOiBiaXRzdHJlYW0gZW5kZWQuXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGsgPSBnZXRfYml0czEoZ2JjKTsKKyAgICAgICAgYml0c1tpXSA9IGsgPyAnMScgOiAnMCc7CisgICAgICAgIGlmIChrKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID49IDMyKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdWUtZ29sb21iIGNvZGUgYXQgIgorICAgICAgICAgICAgICAgIiVzOiBtb3JlIHRoYW4gMzEgemVyb2VzLlxuIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICB2YWx1ZSA9IDE7CisgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworICAgICAgICBrID0gZ2V0X2JpdHMxKGdiYyk7CisgICAgICAgIGJpdHNbaSArIGogKyAxXSA9IGsgPyAnMScgOiAnMCc7CisgICAgICAgIHZhbHVlID0gdmFsdWUgPDwgMSB8IGs7CisgICAgfQorICAgIGJpdHNbaSArIGogKyAxXSA9IDA7CisgICAgLS12YWx1ZTsKKworICAgIGlmIChjdHgtPnRyYWNlX2VuYWJsZSkKKyAgICAgICAgZmZfY2JzX3RyYWNlX3N5bnRheF9lbGVtZW50KGN0eCwgcG9zaXRpb24sIG5hbWUsIGJpdHMsIHZhbHVlKTsKKworICAgIGlmICh2YWx1ZSA8IHJhbmdlX21pbiB8fCB2YWx1ZSA+IHJhbmdlX21heCkgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICIlcyBvdXQgb2YgcmFuZ2U6ICIKKyAgICAgICAgICAgICAgICIlIlBSSXUzMiIsIGJ1dCBtdXN0IGJlIGluIFslIlBSSXUzMiIsJSJQUkl1MzIiXS5cbiIsCisgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAqd3JpdGVfdG8gPSB2YWx1ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYnNfcmVhZF9zZV9nb2xvbWIoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKndyaXRlX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZV9taW4sIGludDMyX3QgcmFuZ2VfbWF4KQoreworICAgIGludDMyX3QgdmFsdWU7CisgICAgaW50IHBvc2l0aW9uLCBpLCBqOworICAgIHVuc2lnbmVkIGludCBrOworICAgIHVpbnQzMl90IHY7CisgICAgY2hhciBiaXRzWzY1XTsKKworICAgIHBvc2l0aW9uID0gZ2V0X2JpdHNfY291bnQoZ2JjKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiYykgPCBpICsgMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzZS1nb2xvbWIgY29kZSBhdCAiCisgICAgICAgICAgICAgICAgICAgIiVzOiBiaXRzdHJlYW0gZW5kZWQuXG4iLCBuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGsgPSBnZXRfYml0czEoZ2JjKTsKKyAgICAgICAgYml0c1tpXSA9IGsgPyAnMScgOiAnMCc7CisgICAgICAgIGlmIChrKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID49IDMyKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2UtZ29sb21iIGNvZGUgYXQgIgorICAgICAgICAgICAgICAgIiVzOiBtb3JlIHRoYW4gMzEgemVyb2VzLlxuIiwgbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICB2ID0gMTsKKyAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7CisgICAgICAgIGsgPSBnZXRfYml0czEoZ2JjKTsKKyAgICAgICAgYml0c1tpICsgaiArIDFdID0gayA/ICcxJyA6ICcwJzsKKyAgICAgICAgdiA9IHYgPDwgMSB8IGs7CisgICAgfQorICAgIGJpdHNbaSArIGogKyAxXSA9IDA7CisgICAgaWYgKHYgJiAxKQorICAgICAgICB2YWx1ZSA9IC0oaW50MzJfdCkodiAvIDIpOworICAgIGVsc2UKKyAgICAgICAgdmFsdWUgPSB2IC8gMjsKKworICAgIGlmIChjdHgtPnRyYWNlX2VuYWJsZSkKKyAgICAgICAgZmZfY2JzX3RyYWNlX3N5bnRheF9lbGVtZW50KGN0eCwgcG9zaXRpb24sIG5hbWUsIGJpdHMsIHZhbHVlKTsKKworICAgIGlmICh2YWx1ZSA8IHJhbmdlX21pbiB8fCB2YWx1ZSA+IHJhbmdlX21heCkgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICIlcyBvdXQgb2YgcmFuZ2U6ICIKKyAgICAgICAgICAgICAgICIlIlBSSWQzMiIsIGJ1dCBtdXN0IGJlIGluIFslIlBSSWQzMiIsJSJQUklkMzIiXS5cbiIsCisgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAqd3JpdGVfdG8gPSB2YWx1ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYnNfd3JpdGVfdWVfZ29sb21iKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBQdXRCaXRDb250ZXh0ICpwYmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZ2VfbWluLCB1aW50MzJfdCByYW5nZV9tYXgpCit7CisgICAgaW50IGxlbjsKKworICAgIGlmICh2YWx1ZSA8IHJhbmdlX21pbiB8fCB2YWx1ZSA+IHJhbmdlX21heCkgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICIlcyBvdXQgb2YgcmFuZ2U6ICIKKyAgICAgICAgICAgICAgICIlIlBSSXUzMiIsIGJ1dCBtdXN0IGJlIGluIFslIlBSSXUzMiIsJSJQUkl1MzIiXS5cbiIsCisgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZfYXNzZXJ0MCh2YWx1ZSAhPSBVSU5UMzJfTUFYKTsKKworICAgIGxlbiA9IGF2X2xvZzIodmFsdWUgKyAxKTsKKyAgICBpZiAocHV0X2JpdHNfbGVmdChwYmMpIDwgMiAqIGxlbiArIDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NQQyk7CisKKyAgICBpZiAoY3R4LT50cmFjZV9lbmFibGUpIHsKKyAgICAgICAgY2hhciBiaXRzWzY1XTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICAgICAgYml0c1tpXSA9ICcwJzsKKyAgICAgICAgYml0c1tsZW5dID0gJzEnOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICBiaXRzW2xlbiArIGkgKyAxXSA9ICh2YWx1ZSArIDEpID4+IChsZW4gLSBpIC0gMSkgJiAxID8gJzEnIDogJzAnOworICAgICAgICBiaXRzW2xlbiArIGxlbiArIDFdID0gMDsKKworICAgICAgICBmZl9jYnNfdHJhY2Vfc3ludGF4X2VsZW1lbnQoY3R4LCBwdXRfYml0c19jb3VudChwYmMpLCBuYW1lLCBiaXRzLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHV0X2JpdHMocGJjLCBsZW4sIDApOworICAgIGlmIChsZW4gKyAxIDwgMzIpCisgICAgICAgIHB1dF9iaXRzKHBiYywgbGVuICsgMSwgdmFsdWUgKyAxKTsKKyAgICBlbHNlCisgICAgICAgIHB1dF9iaXRzMzIocGJjLCB2YWx1ZSArIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2JzX3dyaXRlX3NlX2dvbG9tYihDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUHV0Qml0Q29udGV4dCAqcGJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZV9taW4sIGludDMyX3QgcmFuZ2VfbWF4KQoreworICAgIGludCBsZW47CisgICAgdWludDMyX3QgdXZhbHVlOworCisgICAgaWYgKHZhbHVlIDwgcmFuZ2VfbWluIHx8IHZhbHVlID4gcmFuZ2VfbWF4KSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIiVzIG91dCBvZiByYW5nZTogIgorICAgICAgICAgICAgICAgIiUiUFJJZDMyIiwgYnV0IG11c3QgYmUgaW4gWyUiUFJJZDMyIiwlIlBSSWQzMiJdLlxuIiwKKyAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlLCByYW5nZV9taW4sIHJhbmdlX21heCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdl9hc3NlcnQwKHZhbHVlICE9IElOVDMyX01JTik7CisKKyAgICBpZiAodmFsdWUgPT0gMCkKKyAgICAgICAgdXZhbHVlID0gMDsKKyAgICBlbHNlIGlmICh2YWx1ZSA+IDApCisgICAgICAgIHV2YWx1ZSA9IDIgKiAodWludDMyX3QpdmFsdWUgLSAxOworICAgIGVsc2UKKyAgICAgICAgdXZhbHVlID0gMiAqICh1aW50MzJfdCktdmFsdWU7CisKKyAgICBsZW4gPSBhdl9sb2cyKHV2YWx1ZSArIDEpOworICAgIGlmIChwdXRfYml0c19sZWZ0KHBiYykgPCAyICogbGVuICsgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1BDKTsKKworICAgIGlmIChjdHgtPnRyYWNlX2VuYWJsZSkgeworICAgICAgICBjaGFyIGJpdHNbNjVdOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgICAgICBiaXRzW2ldID0gJzAnOworICAgICAgICBiaXRzW2xlbl0gPSAnMSc7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgICAgIGJpdHNbbGVuICsgaSArIDFdID0gKHV2YWx1ZSArIDEpID4+IChsZW4gLSBpIC0gMSkgJiAxID8gJzEnIDogJzAnOworICAgICAgICBiaXRzW2xlbiArIGxlbiArIDFdID0gMDsKKworICAgICAgICBmZl9jYnNfdHJhY2Vfc3ludGF4X2VsZW1lbnQoY3R4LCBwdXRfYml0c19jb3VudChwYmMpLCBuYW1lLCBiaXRzLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHV0X2JpdHMocGJjLCBsZW4sIDApOworICAgIGlmIChsZW4gKyAxIDwgMzIpCisgICAgICAgIHB1dF9iaXRzKHBiYywgbGVuICsgMSwgdXZhbHVlICsgMSk7CisgICAgZWxzZQorICAgICAgICBwdXRfYml0czMyKHBiYywgdXZhbHVlICsgMSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBIRUFERVIobmFtZSkgZG8geyBcCisgICAgICAgIGZmX2Nic190cmFjZV9oZWFkZXIoY3R4LCBuYW1lKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hFQ0soY2FsbCkgZG8geyBcCisgICAgICAgIGVyciA9IChjYWxsKTsgXAorICAgICAgICBpZiAoZXJyIDwgMCkgXAorICAgICAgICAgICAgcmV0dXJuIGVycjsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRlVOQ19OQU1FKHJ3LCBjb2RlYywgbmFtZSkgY2JzXyAjIyBjb2RlYyAjIyBfICMjIHJ3ICMjIF8gIyMgbmFtZQorI2RlZmluZSBGVU5DX0gyNjQocncsIG5hbWUpIEZVTkNfTkFNRShydywgaDI2NCwgbmFtZSkKKyNkZWZpbmUgRlVOQ19IMjY1KHJ3LCBuYW1lKSBGVU5DX05BTUUocncsIGgyNjUsIG5hbWUpCisKKworI2RlZmluZSBSRUFECisjZGVmaW5lIFJFQURXUklURSByZWFkCisjZGVmaW5lIFJXQ29udGV4dCBHZXRCaXRDb250ZXh0CisKKyNkZWZpbmUgeHUod2lkdGgsIG5hbWUsIHZhciwgcmFuZ2VfbWluLCByYW5nZV9tYXgpIGRvIHsgXAorICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IHJhbmdlX21pbjsgXAorICAgICAgICBDSEVDSyhmZl9jYnNfcmVhZF91bnNpZ25lZChjdHgsIHJ3LCB3aWR0aCwgI25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLCByYW5nZV9taW4sIHJhbmdlX21heCkpOyBcCisgICAgICAgIHZhciA9IHZhbHVlOyBcCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgeHVlKG5hbWUsIHZhciwgcmFuZ2VfbWluLCByYW5nZV9tYXgpIGRvIHsgXAorICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IHJhbmdlX21pbjsgXAorICAgICAgICBDSEVDSyhjYnNfcmVhZF91ZV9nb2xvbWIoY3R4LCBydywgI25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpKTsgXAorICAgICAgICB2YXIgPSB2YWx1ZTsgXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIHhzZShuYW1lLCB2YXIsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KSBkbyB7IFwKKyAgICAgICAgaW50MzJfdCB2YWx1ZSA9IHJhbmdlX21pbjsgXAorICAgICAgICBDSEVDSyhjYnNfcmVhZF9zZV9nb2xvbWIoY3R4LCBydywgI25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpKTsgXAorICAgICAgICB2YXIgPSB2YWx1ZTsgXAorICAgIH0gd2hpbGUgKDApCisKKworI2RlZmluZSB1KHdpZHRoLCBuYW1lLCByYW5nZV9taW4sIHJhbmdlX21heCkgXAorICAgICAgICB4dSh3aWR0aCwgbmFtZSwgY3VycmVudC0+bmFtZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpCisjZGVmaW5lIGZsYWcobmFtZSkgdSgxLCBuYW1lLCAwLCAxKQorI2RlZmluZSB1ZShuYW1lLCByYW5nZV9taW4sIHJhbmdlX21heCkgXAorICAgICAgICB4dWUobmFtZSwgY3VycmVudC0+bmFtZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpCisjZGVmaW5lIHNlKG5hbWUsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KSBcCisgICAgICAgIHhzZShuYW1lLCBjdXJyZW50LT5uYW1lLCByYW5nZV9taW4sIHJhbmdlX21heCkKKworI2RlZmluZSBpbmZlcihuYW1lLCB2YWx1ZSkgZG8geyBcCisgICAgICAgIGN1cnJlbnQtPm5hbWUgPSB2YWx1ZTsgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgY2JzX2gyNjQ1X3JlYWRfbW9yZV9yYnNwX2RhdGEoR2V0Qml0Q29udGV4dCAqZ2JjKQoreworICAgIGludCBiaXRzX2xlZnQgPSBnZXRfYml0c19sZWZ0KGdiYyk7CisgICAgaWYgKGJpdHNfbGVmdCA+IDgpCisgICAgICAgIHJldHVybiAxOworICAgIGlmIChzaG93X2JpdHMoZ2JjLCBiaXRzX2xlZnQpID09IDEgPDwgKGJpdHNfbGVmdCAtIDEpKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gMTsKK30KKworI2RlZmluZSBtb3JlX3Jic3BfZGF0YSh2YXIpICgodmFyKSA9IGNic19oMjY0NV9yZWFkX21vcmVfcmJzcF9kYXRhKHJ3KSkKKworI2RlZmluZSBieXRlX2FsaWdubWVudChydykgKGdldF9iaXRzX2NvdW50KHJ3KSAlIDgpCisKKyNkZWZpbmUgYWxsb2NhdGUobmFtZSwgc2l6ZSkgZG8geyBcCisgICAgICAgIG5hbWUgIyMgX3JlZiA9IGF2X2J1ZmZlcl9hbGxvY3ooc2l6ZSk7IFwKKyAgICAgICAgaWYgKCFuYW1lICMjIF9yZWYpIFwKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7IFwKKyAgICAgICAgbmFtZSA9IG5hbWUgIyMgX3JlZi0+ZGF0YTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRlVOQyhuYW1lKSBGVU5DX0gyNjQoUkVBRFdSSVRFLCBuYW1lKQorI2luY2x1ZGUgImNic19oMjY0X3N5bnRheF90ZW1wbGF0ZS5jIgorI3VuZGVmIEZVTkMKKworI2RlZmluZSBGVU5DKG5hbWUpIEZVTkNfSDI2NShSRUFEV1JJVEUsIG5hbWUpCisjaW5jbHVkZSAiY2JzX2gyNjVfc3ludGF4X3RlbXBsYXRlLmMiCisjdW5kZWYgRlVOQworCisjdW5kZWYgUkVBRAorI3VuZGVmIFJFQURXUklURQorI3VuZGVmIFJXQ29udGV4dAorI3VuZGVmIHh1CisjdW5kZWYgeHVlCisjdW5kZWYgeHNlCisjdW5kZWYgdQorI3VuZGVmIGZsYWcKKyN1bmRlZiB1ZQorI3VuZGVmIHNlCisjdW5kZWYgaW5mZXIKKyN1bmRlZiBtb3JlX3Jic3BfZGF0YQorI3VuZGVmIGJ5dGVfYWxpZ25tZW50CisjdW5kZWYgYWxsb2NhdGUKKworCisjZGVmaW5lIFdSSVRFCisjZGVmaW5lIFJFQURXUklURSB3cml0ZQorI2RlZmluZSBSV0NvbnRleHQgUHV0Qml0Q29udGV4dAorCisjZGVmaW5lIHh1KHdpZHRoLCBuYW1lLCB2YXIsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KSBkbyB7IFwKKyAgICAgICAgdWludDMyX3QgdmFsdWUgPSB2YXI7IFwKKyAgICAgICAgQ0hFQ0soZmZfY2JzX3dyaXRlX3Vuc2lnbmVkKGN0eCwgcncsIHdpZHRoLCAjbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KSk7IFwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSB4dWUobmFtZSwgdmFyLCByYW5nZV9taW4sIHJhbmdlX21heCkgZG8geyBcCisgICAgICAgIHVpbnQzMl90IHZhbHVlID0gdmFyOyBcCisgICAgICAgIENIRUNLKGNic193cml0ZV91ZV9nb2xvbWIoY3R4LCBydywgI25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpKTsgXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIHhzZShuYW1lLCB2YXIsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KSBkbyB7IFwKKyAgICAgICAgaW50MzJfdCB2YWx1ZSA9IHZhcjsgXAorICAgICAgICBDSEVDSyhjYnNfd3JpdGVfc2VfZ29sb21iKGN0eCwgcncsICNuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIHUod2lkdGgsIG5hbWUsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KSBcCisgICAgICAgIHh1KHdpZHRoLCBuYW1lLCBjdXJyZW50LT5uYW1lLCByYW5nZV9taW4sIHJhbmdlX21heCkKKyNkZWZpbmUgZmxhZyhuYW1lKSB1KDEsIG5hbWUsIDAsIDEpCisjZGVmaW5lIHVlKG5hbWUsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KSBcCisgICAgICAgIHh1ZShuYW1lLCBjdXJyZW50LT5uYW1lLCByYW5nZV9taW4sIHJhbmdlX21heCkKKyNkZWZpbmUgc2UobmFtZSwgcmFuZ2VfbWluLCByYW5nZV9tYXgpIFwKKyAgICAgICAgeHNlKG5hbWUsIGN1cnJlbnQtPm5hbWUsIHJhbmdlX21pbiwgcmFuZ2VfbWF4KQorCisjZGVmaW5lIGluZmVyKG5hbWUsIHZhbHVlKSBkbyB7IFwKKyAgICAgICAgaWYgKGN1cnJlbnQtPm5hbWUgIT0gKHZhbHVlKSkgeyBcCisgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfV0FSTklORywgIldhcm5pbmc6ICIgXAorICAgICAgICAgICAgICAgICAgICIlcyBkb2VzIG5vdCBtYXRjaCBpbmZlcnJlZCB2YWx1ZTogIiBcCisgICAgICAgICAgICAgICAgICAgIiUiUFJJZDY0IiwgYnV0IHNob3VsZCBiZSAlIlBSSWQ2NCIuXG4iLCBcCisgICAgICAgICAgICAgICAgICAgI25hbWUsIChpbnQ2NF90KWN1cnJlbnQtPm5hbWUsIChpbnQ2NF90KSh2YWx1ZSkpOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgbW9yZV9yYnNwX2RhdGEodmFyKSAodmFyKQorCisjZGVmaW5lIGJ5dGVfYWxpZ25tZW50KHJ3KSAocHV0X2JpdHNfY291bnQocncpICUgOCkKKworI2RlZmluZSBhbGxvY2F0ZShuYW1lLCBzaXplKSBkbyB7IFwKKyAgICAgICAgaWYgKCFuYW1lKSB7IFwKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIiVzIG11c3QgYmUgc2V0ICIgXAorICAgICAgICAgICAgICAgICAgICJmb3Igd3JpdGluZy5cbiIsICNuYW1lKTsgXAorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBGVU5DKG5hbWUpIEZVTkNfSDI2NChSRUFEV1JJVEUsIG5hbWUpCisjaW5jbHVkZSAiY2JzX2gyNjRfc3ludGF4X3RlbXBsYXRlLmMiCisjdW5kZWYgRlVOQworCisjZGVmaW5lIEZVTkMobmFtZSkgRlVOQ19IMjY1KFJFQURXUklURSwgbmFtZSkKKyNpbmNsdWRlICJjYnNfaDI2NV9zeW50YXhfdGVtcGxhdGUuYyIKKyN1bmRlZiBGVU5DCisKKyN1bmRlZiBXUklURQorI3VuZGVmIFJFQURXUklURQorI3VuZGVmIFJXQ29udGV4dAorI3VuZGVmIHh1CisjdW5kZWYgeHVlCisjdW5kZWYgeHNlCisjdW5kZWYgdQorI3VuZGVmIGZsYWcKKyN1bmRlZiB1ZQorI3VuZGVmIHNlCisjdW5kZWYgaW5mZXIKKyN1bmRlZiBtb3JlX3Jic3BfZGF0YQorI3VuZGVmIGJ5dGVfYWxpZ25tZW50CisjdW5kZWYgYWxsb2NhdGUKKworCitzdGF0aWMgdm9pZCBjYnNfaDI2NF9mcmVlX3Bwcyh2b2lkICp1bml0LCB1aW50OF90ICpjb250ZW50KQoreworICAgIEgyNjRSYXdQUFMgKnBwcyA9IChIMjY0UmF3UFBTKiljb250ZW50OworICAgIGF2X2J1ZmZlcl91bnJlZigmcHBzLT5zbGljZV9ncm91cF9pZF9yZWYpOworICAgIGF2X2ZyZWVwKCZjb250ZW50KTsKK30KKworc3RhdGljIHZvaWQgY2JzX2gyNjRfZnJlZV9zZWlfcGF5bG9hZChIMjY0UmF3U0VJUGF5bG9hZCAqcGF5bG9hZCkKK3sKKyAgICBzd2l0Y2ggKHBheWxvYWQtPnBheWxvYWRfdHlwZSkgeworICAgIGNhc2UgSDI2NF9TRUlfVFlQRV9CVUZGRVJJTkdfUEVSSU9EOgorICAgIGNhc2UgSDI2NF9TRUlfVFlQRV9QSUNfVElNSU5HOgorICAgIGNhc2UgSDI2NF9TRUlfVFlQRV9SRUNPVkVSWV9QT0lOVDoKKyAgICBjYXNlIEgyNjRfU0VJX1RZUEVfRElTUExBWV9PUklFTlRBVElPTjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIMjY0X1NFSV9UWVBFX1VTRVJfREFUQV9SRUdJU1RFUkVEOgorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnBheWxvYWQtPnBheWxvYWQudXNlcl9kYXRhX3JlZ2lzdGVyZWQuZGF0YV9yZWYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEgyNjRfU0VJX1RZUEVfVVNFUl9EQVRBX1VOUkVHSVNURVJFRDoKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZwYXlsb2FkLT5wYXlsb2FkLnVzZXJfZGF0YV91bnJlZ2lzdGVyZWQuZGF0YV9yZWYpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnBheWxvYWQtPnBheWxvYWQub3RoZXIuZGF0YV9yZWYpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNic19oMjY0X2ZyZWVfc2VpKHZvaWQgKnVuaXQsIHVpbnQ4X3QgKmNvbnRlbnQpCit7CisgICAgSDI2NFJhd1NFSSAqc2VpID0gKEgyNjRSYXdTRUkqKWNvbnRlbnQ7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNlaS0+cGF5bG9hZF9jb3VudDsgaSsrKQorICAgICAgICBjYnNfaDI2NF9mcmVlX3NlaV9wYXlsb2FkKCZzZWktPnBheWxvYWRbaV0pOworICAgIGF2X2ZyZWVwKCZjb250ZW50KTsKK30KKworc3RhdGljIHZvaWQgY2JzX2gyNjRfZnJlZV9zbGljZSh2b2lkICp1bml0LCB1aW50OF90ICpjb250ZW50KQoreworICAgIEgyNjRSYXdTbGljZSAqc2xpY2UgPSAoSDI2NFJhd1NsaWNlKiljb250ZW50OworICAgIGF2X2J1ZmZlcl91bnJlZigmc2xpY2UtPmRhdGFfcmVmKTsKKyAgICBhdl9mcmVlcCgmY29udGVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGNic19oMjY1X2ZyZWVfdnBzKHZvaWQgKnVuaXQsIHVpbnQ4X3QgKmNvbnRlbnQpCit7CisgICAgSDI2NVJhd1ZQUyAqdnBzID0gKEgyNjVSYXdWUFMqKWNvbnRlbnQ7CisgICAgYXZfYnVmZmVyX3VucmVmKCZ2cHMtPmV4dGVuc2lvbl9kYXRhLmRhdGFfcmVmKTsKKyAgICBhdl9mcmVlcCgmY29udGVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGNic19oMjY1X2ZyZWVfc3BzKHZvaWQgKnVuaXQsIHVpbnQ4X3QgKmNvbnRlbnQpCit7CisgICAgSDI2NVJhd1NQUyAqc3BzID0gKEgyNjVSYXdTUFMqKWNvbnRlbnQ7CisgICAgYXZfYnVmZmVyX3VucmVmKCZzcHMtPmV4dGVuc2lvbl9kYXRhLmRhdGFfcmVmKTsKKyAgICBhdl9mcmVlcCgmY29udGVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGNic19oMjY1X2ZyZWVfcHBzKHZvaWQgKnVuaXQsIHVpbnQ4X3QgKmNvbnRlbnQpCit7CisgICAgSDI2NVJhd1BQUyAqcHBzID0gKEgyNjVSYXdQUFMqKWNvbnRlbnQ7CisgICAgYXZfYnVmZmVyX3VucmVmKCZwcHMtPmV4dGVuc2lvbl9kYXRhLmRhdGFfcmVmKTsKKyAgICBhdl9mcmVlcCgmY29udGVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGNic19oMjY1X2ZyZWVfc2xpY2Uodm9pZCAqdW5pdCwgdWludDhfdCAqY29udGVudCkKK3sKKyAgICBIMjY1UmF3U2xpY2UgKnNsaWNlID0gKEgyNjVSYXdTbGljZSopY29udGVudDsKKyAgICBhdl9idWZmZXJfdW5yZWYoJnNsaWNlLT5kYXRhX3JlZik7CisgICAgYXZfZnJlZXAoJmNvbnRlbnQpOworfQorCitzdGF0aWMgaW50IGNic19oMjY0NV9mcmFnbWVudF9hZGRfbmFscyhDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIMjY0NVBhY2tldCAqcGFja2V0KQoreworICAgIGludCBlcnIsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFja2V0LT5uYl9uYWxzOyBpKyspIHsKKyAgICAgICAgY29uc3QgSDI2NDVOQUwgKm5hbCA9ICZwYWNrZXQtPm5hbHNbaV07CisgICAgICAgIHNpemVfdCBzaXplID0gbmFsLT5zaXplOworICAgICAgICB1aW50OF90ICpkYXRhOworCisgICAgICAgIC8vIFJlbW92ZSB0cmFpbGluZyB6ZXJvZXMuCisgICAgICAgIHdoaWxlIChzaXplID4gMCAmJiBuYWwtPmRhdGFbc2l6ZSAtIDFdID09IDApCisgICAgICAgICAgICAtLXNpemU7CisgICAgICAgIGF2X2Fzc2VydDAoc2l6ZSA+IDApOworCisgICAgICAgIGRhdGEgPSBhdl9tYWxsb2Moc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWRhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBtZW1jcHkoZGF0YSwgbmFsLT5kYXRhLCBzaXplKTsKKyAgICAgICAgbWVtc2V0KGRhdGEgKyBzaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgICAgICBlcnIgPSBmZl9jYnNfaW5zZXJ0X3VuaXRfZGF0YShjdHgsIGZyYWcsIC0xLCBuYWwtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHNpemUsIE5VTEwpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJmRhdGEpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNic19oMjY0NV9zcGxpdF9mcmFnbWVudChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyKQoreworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkID0gY3R4LT5jb2RlYy0+Y29kZWNfaWQ7CisgICAgQ29kZWRCaXRzdHJlYW1IMjY0NUNvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYmM7CisgICAgaW50IGVycjsKKworICAgIGF2X2Fzc2VydDAoZnJhZy0+ZGF0YSAmJiBmcmFnLT5uYl91bml0cyA9PSAwKTsKKyAgICBpZiAoZnJhZy0+ZGF0YV9zaXplID09IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGhlYWRlciAmJiBmcmFnLT5kYXRhWzBdICYmIGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgLy8gQVZDQyBoZWFkZXIuCisgICAgICAgIHNpemVfdCBzaXplLCBzdGFydCwgZW5kOworICAgICAgICBpbnQgaSwgY291bnQsIHZlcnNpb247CisKKyAgICAgICAgcHJpdi0+bXA0ID0gMTsKKworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYmMsIGZyYWctPmRhdGEsIGZyYWctPmRhdGFfc2l6ZSk7CisKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpIDwgNikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHZlcnNpb24gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKTsKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBBVkNDIGhlYWRlcjogIgorICAgICAgICAgICAgICAgICAgICJmaXJzdCBieXRlICV1LiIsIHZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYmMsIDMpOworICAgICAgICBwcml2LT5uYWxfbGVuZ3RoX3NpemUgPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykgJiAzKSArIDE7CisKKyAgICAgICAgLy8gU1BTIGFycmF5LgorICAgICAgICBjb3VudCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpICYgMHgxZjsKKyAgICAgICAgc3RhcnQgPSBieXRlc3RyZWFtMl90ZWxsKCZnYmMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpIDwgMiAqIChjb3VudCAtIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYmMpOworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpIDwgc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiYywgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZW5kID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2JjKTsKKworICAgICAgICBlcnIgPSBmZl9oMjY0NV9wYWNrZXRfc3BsaXQoJnByaXYtPnJlYWRfcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy0+ZGF0YSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bG9nX2N0eCwgMSwgMiwgQVZfQ09ERUNfSURfSDI2NCwgMSk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc3BsaXQgQVZDQyBTUFMgYXJyYXkuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gY2JzX2gyNjQ1X2ZyYWdtZW50X2FkZF9uYWxzKGN0eCwgZnJhZywgJnByaXYtPnJlYWRfcGFja2V0KTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgIC8vIFBQUyBhcnJheS4KKyAgICAgICAgY291bnQgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKTsKKyAgICAgICAgc3RhcnQgPSBieXRlc3RyZWFtMl90ZWxsKCZnYmMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpIDwgMiAqIChjb3VudCAtIGkpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYmMpOworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpIDwgc2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiYywgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZW5kID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2JjKTsKKworICAgICAgICBlcnIgPSBmZl9oMjY0NV9wYWNrZXRfc3BsaXQoJnByaXYtPnJlYWRfcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy0+ZGF0YSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bG9nX2N0eCwgMSwgMiwgQVZfQ09ERUNfSURfSDI2NCwgMSk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc3BsaXQgQVZDQyBQUFMgYXJyYXkuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gY2JzX2gyNjQ1X2ZyYWdtZW50X2FkZF9uYWxzKGN0eCwgZnJhZywgJnByaXYtPnJlYWRfcGFja2V0KTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2JjKSA+IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19XQVJOSU5HLCAiJXUgYnl0ZXMgbGVmdCBhdCBlbmQgb2YgQVZDQyAiCisgICAgICAgICAgICAgICAgICAgImhlYWRlci5cbiIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmIChoZWFkZXIgJiYgZnJhZy0+ZGF0YVswXSAmJiBjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDKSB7CisgICAgICAgIC8vIEhWQ0MgaGVhZGVyLgorICAgICAgICBzaXplX3Qgc2l6ZSwgc3RhcnQsIGVuZDsKKyAgICAgICAgaW50IGksIGosIG5iX2FycmF5cywgbmFsX3VuaXRfdHlwZSwgbmJfbmFscywgdmVyc2lvbjsKKworICAgICAgICBwcml2LT5tcDQgPSAxOworCisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiYywgZnJhZy0+ZGF0YSwgZnJhZy0+ZGF0YV9zaXplKTsKKworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiYykgPCAyMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHZlcnNpb24gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKTsKKyAgICAgICAgaWYgKHZlcnNpb24gIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBIVkNDIGhlYWRlcjogIgorICAgICAgICAgICAgICAgICAgICJmaXJzdCBieXRlICV1LiIsIHZlcnNpb24pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYmMsIDIwKTsKKyAgICAgICAgcHJpdi0+bmFsX2xlbmd0aF9zaXplID0gKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpICYgMykgKyAxOworCisgICAgICAgIG5iX2FycmF5cyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfYXJyYXlzOyBpKyspIHsKKyAgICAgICAgICAgIG5hbF91bml0X3R5cGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSAmIDB4M2Y7CisgICAgICAgICAgICBuYl9uYWxzID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiYyk7CisKKyAgICAgICAgICAgIHN0YXJ0ID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2JjKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9uYWxzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiYykgPCAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiYyk7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpIDwgc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2JjLCBzaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZCA9IGJ5dGVzdHJlYW0yX3RlbGwoJmdiYyk7CisKKyAgICAgICAgICAgIGVyciA9IGZmX2gyNjQ1X3BhY2tldF9zcGxpdCgmcHJpdi0+cmVhZF9wYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy0+ZGF0YSArIHN0YXJ0LCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmxvZ19jdHgsIDEsIDIsIEFWX0NPREVDX0lEX0hFVkMsIDEpOworICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc3BsaXQgIgorICAgICAgICAgICAgICAgICAgICAgICAiSFZDQyBhcnJheSAlZCAoJWQgTkFMIHVuaXRzIG9mIHR5cGUgJWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgbmJfbmFscywgbmFsX3VuaXRfdHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0NV9mcmFnbWVudF9hZGRfbmFscyhjdHgsIGZyYWcsICZwcml2LT5yZWFkX3BhY2tldCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBbm5leCBCLCBvciBsYXRlciBNUDQgd2l0aCBhbHJlYWR5LWtub3duIHBhcmFtZXRlcnMuCisKKyAgICAgICAgZXJyID0gZmZfaDI2NDVfcGFja2V0X3NwbGl0KCZwcml2LT5yZWFkX3BhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWctPmRhdGEsIGZyYWctPmRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bG9nX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPm1wNCwgcHJpdi0+bmFsX2xlbmd0aF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfaWQsIDEpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgZXJyID0gY2JzX2gyNjQ1X2ZyYWdtZW50X2FkZF9uYWxzKGN0eCwgZnJhZywgJnByaXYtPnJlYWRfcGFja2V0KTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIGNic19oMjY0NV9yZXBsYWNlX3BzKGgyNm4sIHBzX25hbWUsIHBzX3ZhciwgaWRfZWxlbWVudCkgXAorc3RhdGljIGludCBjYnNfaDI2ICMjIGgyNm4gIyMgX3JlcGxhY2VfICMjIHBzX3ZhcihDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIMjYgIyMgaDI2biAjIyBSYXcgIyMgcHNfbmFtZSAqcHNfdmFyKSAgXAoreyBcCisgICAgQ29kZWRCaXRzdHJlYW1IMjYgIyMgaDI2biAjIyBDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7IFwKKyAgICB1bnNpZ25lZCBpbnQgaWQgPSBwc192YXItPmlkX2VsZW1lbnQ7IFwKKyAgICBpZiAoaWQgPiBGRl9BUlJBWV9FTEVNUyhwcml2LT5wc192YXIpKSB7IFwKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCAiICNwc19uYW1lIFwKKyAgICAgICAgICAgICAgICIgaWQgOiAlZC5cbiIsIGlkKTsgXAorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgXAorICAgIH0gXAorICAgIGlmIChwcml2LT5wc192YXJbaWRdID09IHByaXYtPmFjdGl2ZV8gIyMgcHNfdmFyKSBcCisgICAgICAgIHByaXYtPmFjdGl2ZV8gIyMgcHNfdmFyID0gTlVMTCA7IFwKKyAgICBhdl9mcmVlcCgmcHJpdi0+cHNfdmFyW2lkXSk7IFwKKyAgICBwcml2LT5wc192YXJbaWRdID0gYXZfbWFsbG9jKHNpemVvZigqcHNfdmFyKSk7IFwKKyAgICBpZiAoIXByaXYtPnBzX3ZhcltpZF0pIFwKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsgXAorICAgIG1lbWNweShwcml2LT5wc192YXJbaWRdLCBwc192YXIsIHNpemVvZigqcHNfdmFyKSk7IFwKKyAgICByZXR1cm4gMDsgXAorfQorCitjYnNfaDI2NDVfcmVwbGFjZV9wcyg0LCBTUFMsIHNwcywgc2VxX3BhcmFtZXRlcl9zZXRfaWQpCitjYnNfaDI2NDVfcmVwbGFjZV9wcyg0LCBQUFMsIHBwcywgcGljX3BhcmFtZXRlcl9zZXRfaWQpCitjYnNfaDI2NDVfcmVwbGFjZV9wcyg1LCBWUFMsIHZwcywgdnBzX3ZpZGVvX3BhcmFtZXRlcl9zZXRfaWQpCitjYnNfaDI2NDVfcmVwbGFjZV9wcyg1LCBTUFMsIHNwcywgc3BzX3NlcV9wYXJhbWV0ZXJfc2V0X2lkKQorY2JzX2gyNjQ1X3JlcGxhY2VfcHMoNSwgUFBTLCBwcHMsIHBwc19waWNfcGFyYW1ldGVyX3NldF9pZCkKKworc3RhdGljIGludCBjYnNfaDI2NF9yZWFkX25hbF91bml0KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdCkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiYzsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gaW5pdF9nZXRfYml0cygmZ2JjLCB1bml0LT5kYXRhLCA4ICogdW5pdC0+ZGF0YV9zaXplKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIHN3aXRjaCAodW5pdC0+dHlwZSkgeworICAgIGNhc2UgSDI2NF9OQUxfU1BTOgorICAgICAgICB7CisgICAgICAgICAgICBIMjY0UmF3U1BTICpzcHM7CisKKyAgICAgICAgICAgIGVyciA9IGZmX2Nic19hbGxvY191bml0X2NvbnRlbnQoY3R4LCB1bml0LCBzaXplb2YoKnNwcyksIE5VTEwpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHNwcyA9IHVuaXQtPmNvbnRlbnQ7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0X3JlYWRfc3BzKGN0eCwgJmdiYywgc3BzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0X3JlcGxhY2Vfc3BzKGN0eCwgc3BzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEgyNjRfTkFMX1NQU19FWFQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGZmX2Nic19hbGxvY191bml0X2NvbnRlbnQoY3R4LCB1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSDI2NFJhd1NQU0V4dGVuc2lvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjRfcmVhZF9zcHNfZXh0ZW5zaW9uKGN0eCwgJmdiYywgdW5pdC0+Y29udGVudCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X05BTF9QUFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIEgyNjRSYXdQUFMgKnBwczsKKworICAgICAgICAgICAgZXJyID0gZmZfY2JzX2FsbG9jX3VuaXRfY29udGVudChjdHgsIHVuaXQsIHNpemVvZigqcHBzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNic19oMjY0X2ZyZWVfcHBzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICBwcHMgPSB1bml0LT5jb250ZW50OworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NF9yZWFkX3BwcyhjdHgsICZnYmMsIHBwcyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NF9yZXBsYWNlX3BwcyhjdHgsIHBwcyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X05BTF9TTElDRToKKyAgICBjYXNlIEgyNjRfTkFMX0lEUl9TTElDRToKKyAgICBjYXNlIEgyNjRfTkFMX0FVWElMSUFSWV9TTElDRToKKyAgICAgICAgeworICAgICAgICAgICAgSDI2NFJhd1NsaWNlICpzbGljZTsKKyAgICAgICAgICAgIGludCBwb3MsIGxlbjsKKworICAgICAgICAgICAgZXJyID0gZmZfY2JzX2FsbG9jX3VuaXRfY29udGVudChjdHgsIHVuaXQsIHNpemVvZigqc2xpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JzX2gyNjRfZnJlZV9zbGljZSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgc2xpY2UgPSB1bml0LT5jb250ZW50OworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NF9yZWFkX3NsaWNlX2hlYWRlcihjdHgsICZnYmMsICZzbGljZS0+aGVhZGVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIHBvcyA9IGdldF9iaXRzX2NvdW50KCZnYmMpOworICAgICAgICAgICAgbGVuID0gdW5pdC0+ZGF0YV9zaXplOworICAgICAgICAgICAgaWYgKCF1bml0LT5kYXRhW2xlbiAtIDFdKSB7CisgICAgICAgICAgICAgICAgaW50IHo7CisgICAgICAgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IGxlbiAmJiAhdW5pdC0+ZGF0YVtsZW4gLSB6IC0gMV07IHorKyk7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0RFQlVHLCAiRGVsZXRlZCAlZCB0cmFpbGluZyB6ZXJvZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBzbGljZSBkYXRhLlxuIiwgeik7CisgICAgICAgICAgICAgICAgbGVuIC09IHo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNsaWNlLT5kYXRhX3NpemUgPSBsZW4gLSBwb3MgLyA4OworICAgICAgICAgICAgc2xpY2UtPmRhdGFfcmVmICA9IGF2X2J1ZmZlcl9hbGxvYyhzbGljZS0+ZGF0YV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIXNsaWNlLT5kYXRhX3JlZikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgc2xpY2UtPmRhdGEgPSBzbGljZS0+ZGF0YV9yZWYtPmRhdGE7CisgICAgICAgICAgICBtZW1jcHkoc2xpY2UtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgdW5pdC0+ZGF0YSArIHBvcyAvIDgsIHNsaWNlLT5kYXRhX3NpemUpOworICAgICAgICAgICAgbWVtc2V0KHNsaWNlLT5kYXRhICsgc2xpY2UtPmRhdGFfc2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIHNsaWNlLT5kYXRhX2JpdF9zdGFydCA9IHBvcyAlIDg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEgyNjRfTkFMX0FVRDoKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gZmZfY2JzX2FsbG9jX3VuaXRfY29udGVudChjdHgsIHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihIMjY0UmF3QVVEKSwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NF9yZWFkX2F1ZChjdHgsICZnYmMsIHVuaXQtPmNvbnRlbnQpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgSDI2NF9OQUxfU0VJOgorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBmZl9jYnNfYWxsb2NfdW5pdF9jb250ZW50KGN0eCwgdW5pdCwgc2l6ZW9mKEgyNjRSYXdTRUkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JzX2gyNjRfZnJlZV9zZWkpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjRfcmVhZF9zZWkoY3R4LCAmZ2JjLCB1bml0LT5jb250ZW50KTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEgyNjRfTkFMX0ZJTExFUl9EQVRBOgorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBmZl9jYnNfYWxsb2NfdW5pdF9jb250ZW50KGN0eCwgdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEgyNjRSYXdGaWxsZXIpLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0X3JlYWRfZmlsbGVyKGN0eCwgJmdiYywgdW5pdC0+Y29udGVudCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYnNfaDI2NV9yZWFkX25hbF91bml0KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdCkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiYzsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gaW5pdF9nZXRfYml0cygmZ2JjLCB1bml0LT5kYXRhLCA4ICogdW5pdC0+ZGF0YV9zaXplKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIHN3aXRjaCAodW5pdC0+dHlwZSkgeworICAgIGNhc2UgSEVWQ19OQUxfVlBTOgorICAgICAgICB7CisgICAgICAgICAgICBIMjY1UmF3VlBTICp2cHM7CisKKyAgICAgICAgICAgIGVyciA9IGZmX2Nic19hbGxvY191bml0X2NvbnRlbnQoY3R4LCB1bml0LCBzaXplb2YoKnZwcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYnNfaDI2NV9mcmVlX3Zwcyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgdnBzID0gdW5pdC0+Y29udGVudDsKKworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjVfcmVhZF92cHMoY3R4LCAmZ2JjLCB2cHMpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjVfcmVwbGFjZV92cHMoY3R4LCB2cHMpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEhFVkNfTkFMX1NQUzoKKyAgICAgICAgeworICAgICAgICAgICAgSDI2NVJhd1NQUyAqc3BzOworCisgICAgICAgICAgICBlcnIgPSBmZl9jYnNfYWxsb2NfdW5pdF9jb250ZW50KGN0eCwgdW5pdCwgc2l6ZW9mKCpzcHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JzX2gyNjVfZnJlZV9zcHMpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHNwcyA9IHVuaXQtPmNvbnRlbnQ7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY1X3JlYWRfc3BzKGN0eCwgJmdiYywgc3BzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY1X3JlcGxhY2Vfc3BzKGN0eCwgc3BzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhFVkNfTkFMX1BQUzoKKyAgICAgICAgeworICAgICAgICAgICAgSDI2NVJhd1BQUyAqcHBzOworCisgICAgICAgICAgICBlcnIgPSBmZl9jYnNfYWxsb2NfdW5pdF9jb250ZW50KGN0eCwgdW5pdCwgc2l6ZW9mKCpwcHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JzX2gyNjVfZnJlZV9wcHMpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHBwcyA9IHVuaXQtPmNvbnRlbnQ7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY1X3JlYWRfcHBzKGN0eCwgJmdiYywgcHBzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY1X3JlcGxhY2VfcHBzKGN0eCwgcHBzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhFVkNfTkFMX1RSQUlMX046CisgICAgY2FzZSBIRVZDX05BTF9UUkFJTF9SOgorICAgIGNhc2UgSEVWQ19OQUxfVFNBX046CisgICAgY2FzZSBIRVZDX05BTF9UU0FfUjoKKyAgICBjYXNlIEhFVkNfTkFMX1NUU0FfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1NUU0FfUjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBRExfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBRExfUjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBU0xfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBU0xfUjoKKyAgICBjYXNlIEhFVkNfTkFMX0JMQV9XX0xQOgorICAgIGNhc2UgSEVWQ19OQUxfQkxBX1dfUkFETDoKKyAgICBjYXNlIEhFVkNfTkFMX0JMQV9OX0xQOgorICAgIGNhc2UgSEVWQ19OQUxfSURSX1dfUkFETDoKKyAgICBjYXNlIEhFVkNfTkFMX0lEUl9OX0xQOgorICAgIGNhc2UgSEVWQ19OQUxfQ1JBX05VVDoKKyAgICAgICAgeworICAgICAgICAgICAgSDI2NVJhd1NsaWNlICpzbGljZTsKKyAgICAgICAgICAgIGludCBwb3MsIGxlbjsKKworICAgICAgICAgICAgZXJyID0gZmZfY2JzX2FsbG9jX3VuaXRfY29udGVudChjdHgsIHVuaXQsIHNpemVvZigqc2xpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2JzX2gyNjVfZnJlZV9zbGljZSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgc2xpY2UgPSB1bml0LT5jb250ZW50OworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NV9yZWFkX3NsaWNlX3NlZ21lbnRfaGVhZGVyKGN0eCwgJmdiYywgJnNsaWNlLT5oZWFkZXIpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICAgICAgcG9zID0gZ2V0X2JpdHNfY291bnQoJmdiYyk7CisgICAgICAgICAgICBsZW4gPSB1bml0LT5kYXRhX3NpemU7CisgICAgICAgICAgICBpZiAoIXVuaXQtPmRhdGFbbGVuIC0gMV0pIHsKKyAgICAgICAgICAgICAgICBpbnQgejsKKyAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgbGVuICYmICF1bml0LT5kYXRhW2xlbiAtIHogLSAxXTsgeisrKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfREVCVUcsICJEZWxldGVkICVkIHRyYWlsaW5nIHplcm9lcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIHNsaWNlIGRhdGEuXG4iLCB6KTsKKyAgICAgICAgICAgICAgICBsZW4gLT0gejsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2xpY2UtPmRhdGFfc2l6ZSA9IGxlbiAtIHBvcyAvIDg7CisgICAgICAgICAgICBzbGljZS0+ZGF0YV9yZWYgID0gYXZfYnVmZmVyX2FsbG9jKHNsaWNlLT5kYXRhX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghc2xpY2UtPmRhdGFfcmVmKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBzbGljZS0+ZGF0YSA9IHNsaWNlLT5kYXRhX3JlZi0+ZGF0YTsKKyAgICAgICAgICAgIG1lbWNweShzbGljZS0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICB1bml0LT5kYXRhICsgcG9zIC8gOCwgc2xpY2UtPmRhdGFfc2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQoc2xpY2UtPmRhdGEgKyBzbGljZS0+ZGF0YV9zaXplLCAwLAorICAgICAgICAgICAgICAgICAgIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgc2xpY2UtPmRhdGFfYml0X3N0YXJ0ID0gcG9zICUgODsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEVWQ19OQUxfQVVEOgorICAgICAgICB7CisgICAgICAgICAgICBlcnIgPSBmZl9jYnNfYWxsb2NfdW5pdF9jb250ZW50KGN0eCwgdW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEgyNjVSYXdBVUQpLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY1X3JlYWRfYXVkKGN0eCwgJmdiYywgdW5pdC0+Y29udGVudCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYnNfaDI2NF93cml0ZV9uYWxfdW5pdChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1Vbml0ICp1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYmMpCit7CisgICAgaW50IGVycjsKKworICAgIHN3aXRjaCAodW5pdC0+dHlwZSkgeworICAgIGNhc2UgSDI2NF9OQUxfU1BTOgorICAgICAgICB7CisgICAgICAgICAgICBIMjY0UmF3U1BTICpzcHMgPSB1bml0LT5jb250ZW50OworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NF93cml0ZV9zcHMoY3R4LCBwYmMsIHNwcyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NF9yZXBsYWNlX3NwcyhjdHgsIHNwcyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X05BTF9TUFNfRVhUOgorICAgICAgICB7CisgICAgICAgICAgICBIMjY0UmF3U1BTRXh0ZW5zaW9uICpzcHNfZXh0ID0gdW5pdC0+Y29udGVudDsKKworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjRfd3JpdGVfc3BzX2V4dGVuc2lvbihjdHgsIHBiYywgc3BzX2V4dCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X05BTF9QUFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIEgyNjRSYXdQUFMgKnBwcyA9IHVuaXQtPmNvbnRlbnQ7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0X3dyaXRlX3BwcyhjdHgsIHBiYywgcHBzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0X3JlcGxhY2VfcHBzKGN0eCwgcHBzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEgyNjRfTkFMX1NMSUNFOgorICAgIGNhc2UgSDI2NF9OQUxfSURSX1NMSUNFOgorICAgIGNhc2UgSDI2NF9OQUxfQVVYSUxJQVJZX1NMSUNFOgorICAgICAgICB7CisgICAgICAgICAgICBIMjY0UmF3U2xpY2UgKnNsaWNlID0gdW5pdC0+Y29udGVudDsKKyAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2JjOworICAgICAgICAgICAgaW50IGJpdHNfbGVmdCwgZW5kLCB6ZXJvZXM7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0X3dyaXRlX3NsaWNlX2hlYWRlcihjdHgsIHBiYywgJnNsaWNlLT5oZWFkZXIpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICAgICAgaWYgKHNsaWNlLT5kYXRhKSB7CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlLT5kYXRhX3NpemUgKiA4ICsgOCA+IHB1dF9iaXRzX2xlZnQocGJjKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1BDKTsKKworICAgICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiYywgc2xpY2UtPmRhdGEsIHNsaWNlLT5kYXRhX3NpemUgKiA4KTsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2JjLCBzbGljZS0+ZGF0YV9iaXRfc3RhcnQpOworCisgICAgICAgICAgICAgICAgLy8gQ29weSBpbiB0d28tYnl0ZSBibG9ja3MsIGJ1dCBzdG9wIGJlZm9yZSBjb3B5aW5nIHRoZQorICAgICAgICAgICAgICAgIC8vIHJic3Bfc3RvcF9vbmVfYml0IGluIHRoZSBmaW5hbCBieXRlLgorICAgICAgICAgICAgICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KCZnYmMpID4gMjMpCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiYywgMTYsIGdldF9iaXRzKCZnYmMsIDE2KSk7CisKKyAgICAgICAgICAgICAgICBiaXRzX2xlZnQgPSBnZXRfYml0c19sZWZ0KCZnYmMpOworICAgICAgICAgICAgICAgIGVuZCA9IGdldF9iaXRzKCZnYmMsIGJpdHNfbGVmdCk7CisKKyAgICAgICAgICAgICAgICAvLyByYnNwX3N0b3Bfb25lX2JpdCBtdXN0IGJlIHByZXNlbnQgaGVyZS4KKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKGVuZCk7CisgICAgICAgICAgICAgICAgemVyb2VzID0gZmZfY3R6KGVuZCk7CisgICAgICAgICAgICAgICAgaWYgKGJpdHNfbGVmdCA+IHplcm9lcyArIDEpCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiYywgYml0c19sZWZ0IC0gemVyb2VzIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID4+ICh6ZXJvZXMgKyAxKSk7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMocGJjLCAxLCAxKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAocHV0X2JpdHNfY291bnQocGJjKSAlIDggIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocGJjLCAxLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTm8gc2xpY2UgZGF0YSAtIHRoYXQgd2FzIGp1c3QgdGhlIGhlYWRlci4KKyAgICAgICAgICAgICAgICAvLyAoQml0c3RyZWFtIG1heSBiZSB1bmFsaWduZWQhKQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X05BTF9BVUQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0X3dyaXRlX2F1ZChjdHgsIHBiYywgdW5pdC0+Y29udGVudCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X05BTF9TRUk6CisgICAgICAgIHsKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY0X3dyaXRlX3NlaShjdHgsIHBiYywgdW5pdC0+Y29udGVudCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X05BTF9GSUxMRVJfREFUQToKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjRfd3JpdGVfZmlsbGVyKGN0eCwgcGJjLCB1bml0LT5jb250ZW50KTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJXcml0ZSB1bmltcGxlbWVudGVkIGZvciAiCisgICAgICAgICAgICAgICAiTkFMIHVuaXQgdHlwZSAlIlBSSXUzMiIuXG4iLCB1bml0LT50eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNic19oMjY1X3dyaXRlX25hbF91bml0KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXQgKnVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiYykKK3sKKyAgICBpbnQgZXJyOworCisgICAgc3dpdGNoICh1bml0LT50eXBlKSB7CisgICAgY2FzZSBIRVZDX05BTF9WUFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIEgyNjVSYXdWUFMgKnZwcyA9IHVuaXQtPmNvbnRlbnQ7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY1X3dyaXRlX3ZwcyhjdHgsIHBiYywgdnBzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGVyciA9IGNic19oMjY1X3JlcGxhY2VfdnBzKGN0eCwgdnBzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhFVkNfTkFMX1NQUzoKKyAgICAgICAgeworICAgICAgICAgICAgSDI2NVJhd1NQUyAqc3BzID0gdW5pdC0+Y29udGVudDsKKworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjVfd3JpdGVfc3BzKGN0eCwgcGJjLCBzcHMpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjVfcmVwbGFjZV9zcHMoY3R4LCBzcHMpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEVWQ19OQUxfUFBTOgorICAgICAgICB7CisgICAgICAgICAgICBIMjY1UmF3UFBTICpwcHMgPSB1bml0LT5jb250ZW50OworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NV93cml0ZV9wcHMoY3R4LCBwYmMsIHBwcyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgICAgICBlcnIgPSBjYnNfaDI2NV9yZXBsYWNlX3BwcyhjdHgsIHBwcyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIRVZDX05BTF9UUkFJTF9OOgorICAgIGNhc2UgSEVWQ19OQUxfVFJBSUxfUjoKKyAgICBjYXNlIEhFVkNfTkFMX1RTQV9OOgorICAgIGNhc2UgSEVWQ19OQUxfVFNBX1I6CisgICAgY2FzZSBIRVZDX05BTF9TVFNBX046CisgICAgY2FzZSBIRVZDX05BTF9TVFNBX1I6CisgICAgY2FzZSBIRVZDX05BTF9SQURMX046CisgICAgY2FzZSBIRVZDX05BTF9SQURMX1I6CisgICAgY2FzZSBIRVZDX05BTF9SQVNMX046CisgICAgY2FzZSBIRVZDX05BTF9SQVNMX1I6CisgICAgY2FzZSBIRVZDX05BTF9CTEFfV19MUDoKKyAgICBjYXNlIEhFVkNfTkFMX0JMQV9XX1JBREw6CisgICAgY2FzZSBIRVZDX05BTF9CTEFfTl9MUDoKKyAgICBjYXNlIEhFVkNfTkFMX0lEUl9XX1JBREw6CisgICAgY2FzZSBIRVZDX05BTF9JRFJfTl9MUDoKKyAgICBjYXNlIEhFVkNfTkFMX0NSQV9OVVQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEgyNjVSYXdTbGljZSAqc2xpY2UgPSB1bml0LT5jb250ZW50OworICAgICAgICAgICAgR2V0Qml0Q29udGV4dCBnYmM7CisgICAgICAgICAgICBpbnQgYml0c19sZWZ0LCBlbmQsIHplcm9lczsKKworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjVfd3JpdGVfc2xpY2Vfc2VnbWVudF9oZWFkZXIoY3R4LCBwYmMsICZzbGljZS0+aGVhZGVyKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgICAgIGlmIChzbGljZS0+ZGF0YSkgeworICAgICAgICAgICAgICAgIGlmIChzbGljZS0+ZGF0YV9zaXplICogOCArIDggPiBwdXRfYml0c19sZWZ0KHBiYykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NQQyk7CisKKyAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYmMsIHNsaWNlLT5kYXRhLCBzbGljZS0+ZGF0YV9zaXplICogOCk7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiYywgc2xpY2UtPmRhdGFfYml0X3N0YXJ0KTsKKworICAgICAgICAgICAgICAgIC8vIENvcHkgaW4gdHdvLWJ5dGUgYmxvY2tzLCBidXQgc3RvcCBiZWZvcmUgY29weWluZyB0aGUKKyAgICAgICAgICAgICAgICAvLyByYnNwX3N0b3Bfb25lX2JpdCBpbiB0aGUgZmluYWwgYnl0ZS4KKyAgICAgICAgICAgICAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmZ2JjKSA+IDIzKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwYmMsIDE2LCBnZXRfYml0cygmZ2JjLCAxNikpOworCisgICAgICAgICAgICAgICAgYml0c19sZWZ0ID0gZ2V0X2JpdHNfbGVmdCgmZ2JjKTsKKyAgICAgICAgICAgICAgICBlbmQgPSBnZXRfYml0cygmZ2JjLCBiaXRzX2xlZnQpOworCisgICAgICAgICAgICAgICAgLy8gcmJzcF9zdG9wX29uZV9iaXQgbXVzdCBiZSBwcmVzZW50IGhlcmUuCisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChlbmQpOworICAgICAgICAgICAgICAgIHplcm9lcyA9IGZmX2N0eihlbmQpOworICAgICAgICAgICAgICAgIGlmIChiaXRzX2xlZnQgPiB6ZXJvZXMgKyAxKQorICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwYmMsIGJpdHNfbGVmdCAtIHplcm9lcyAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA+PiAoemVyb2VzICsgMSkpOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiYywgMSwgMSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHB1dF9iaXRzX2NvdW50KHBiYykgJSA4ICE9IDApCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiYywgMSwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIE5vIHNsaWNlIGRhdGEgLSB0aGF0IHdhcyBqdXN0IHRoZSBoZWFkZXIuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhFVkNfTkFMX0FVRDoKKyAgICAgICAgeworICAgICAgICAgICAgZXJyID0gY2JzX2gyNjVfd3JpdGVfYXVkKGN0eCwgcGJjLCB1bml0LT5jb250ZW50KTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJXcml0ZSB1bmltcGxlbWVudGVkIGZvciAiCisgICAgICAgICAgICAgICAiTkFMIHVuaXQgdHlwZSAlIlBSSXUzMiIuXG4iLCB1bml0LT50eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNic19oMjY0NV93cml0ZV9uYWxfdW5pdChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbUgyNjQ1Q29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkID0gY3R4LT5jb2RlYy0+Y29kZWNfaWQ7CisgICAgUHV0Qml0Q29udGV4dCBwYmM7CisgICAgaW50IGVycjsKKworICAgIGlmICghcHJpdi0+d3JpdGVfYnVmZmVyKSB7CisgICAgICAgIC8vIEluaXRpYWwgd3JpdGUgYnVmZmVyIHNpemUgaXMgMU1CLgorICAgICAgICBwcml2LT53cml0ZV9idWZmZXJfc2l6ZSA9IDEwMjQgKiAxMDI0OworCisgICAgcmVhbGxvY2F0ZV9hbmRfdHJ5X2FnYWluOgorICAgICAgICBlcnIgPSBhdl9yZWFsbG9jcCgmcHJpdi0+d3JpdGVfYnVmZmVyLCBwcml2LT53cml0ZV9idWZmZXJfc2l6ZSk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gYWxsb2NhdGUgYSAiCisgICAgICAgICAgICAgICAgICAgInN1ZmZpY2llbnRseSBsYXJnZSB3cml0ZSBidWZmZXIgKGxhc3QgYXR0ZW1wdCAiCisgICAgICAgICAgICAgICAgICAgIiUiU0laRV9TUEVDSUZJRVIiIGJ5dGVzKS5cbiIsIHByaXYtPndyaXRlX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYmMsIHByaXYtPndyaXRlX2J1ZmZlciwgcHJpdi0+d3JpdGVfYnVmZmVyX3NpemUpOworCisgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpCisgICAgICAgIGVyciA9IGNic19oMjY0X3dyaXRlX25hbF91bml0KGN0eCwgdW5pdCwgJnBiYyk7CisgICAgZWxzZQorICAgICAgICBlcnIgPSBjYnNfaDI2NV93cml0ZV9uYWxfdW5pdChjdHgsIHVuaXQsICZwYmMpOworCisgICAgaWYgKGVyciA9PSBBVkVSUk9SKEVOT1NQQykpIHsKKyAgICAgICAgLy8gT3ZlcmZsb3cuCisgICAgICAgIHByaXYtPndyaXRlX2J1ZmZlcl9zaXplICo9IDI7CisgICAgICAgIGdvdG8gcmVhbGxvY2F0ZV9hbmRfdHJ5X2FnYWluOworICAgIH0KKyAgICAvLyBPdmVyZmxvdyBidXQgd2UgZGlkbid0IG5vdGljZS4KKyAgICBhdl9hc3NlcnQwKHB1dF9iaXRzX2NvdW50KCZwYmMpIDw9IDggKiBwcml2LT53cml0ZV9idWZmZXJfc2l6ZSk7CisKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAvLyBXcml0ZSBmYWlsZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uLgorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChwdXRfYml0c19jb3VudCgmcGJjKSAlIDgpCisgICAgICAgIHVuaXQtPmRhdGFfYml0X3BhZGRpbmcgPSA4IC0gcHV0X2JpdHNfY291bnQoJnBiYykgJSA4OworICAgIGVsc2UKKyAgICAgICAgdW5pdC0+ZGF0YV9iaXRfcGFkZGluZyA9IDA7CisKKyAgICB1bml0LT5kYXRhX3NpemUgPSAocHV0X2JpdHNfY291bnQoJnBiYykgKyA3KSAvIDg7CisgICAgZmx1c2hfcHV0X2JpdHMoJnBiYyk7CisKKyAgICBlcnIgPSBmZl9jYnNfYWxsb2NfdW5pdF9kYXRhKGN0eCwgdW5pdCwgdW5pdC0+ZGF0YV9zaXplKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIG1lbWNweSh1bml0LT5kYXRhLCBwcml2LT53cml0ZV9idWZmZXIsIHVuaXQtPmRhdGFfc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYnNfaDI2NDVfYXNzZW1ibGVfZnJhZ21lbnQoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnKQoreworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgc2l6ZV90IG1heF9zaXplLCBkcCwgc3A7CisgICAgaW50IGVyciwgaSwgemVyb19ydW47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhZy0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICAvLyBEYXRhIHNob3VsZCBhbHJlYWR5IGFsbCBoYXZlIGJlZW4gd3JpdHRlbiB3aGVuIHdlIGdldCBoZXJlLgorICAgICAgICBhdl9hc3NlcnQwKGZyYWctPnVuaXRzW2ldLmRhdGEpOworICAgIH0KKworICAgIG1heF9zaXplID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhZy0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICAvLyBTdGFydCBjb2RlICsgY29udGVudCB3aXRoIHdvcnN0LWNhc2UgZW11bGF0aW9uIHByZXZlbnRpb24uCisgICAgICAgIG1heF9zaXplICs9IDMgKyBmcmFnLT51bml0c1tpXS5kYXRhX3NpemUgKiAzIC8gMjsKKyAgICB9CisKKyAgICBkYXRhID0gYXZfbWFsbG9jKG1heF9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZHAgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFnLT5uYl91bml0czsgaSsrKSB7CisgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdCA9ICZmcmFnLT51bml0c1tpXTsKKworICAgICAgICBpZiAodW5pdC0+ZGF0YV9iaXRfcGFkZGluZyA+IDApIHsKKyAgICAgICAgICAgIGlmIChpIDwgZnJhZy0+bmJfdW5pdHMgLSAxKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19XQVJOSU5HLCAiUHJvYmFibHkgaW52YWxpZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJ1bmFsaWduZWQgcGFkZGluZyBvbiBub24tZmluYWwgTkFMIHVuaXQuXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcmFnLT5kYXRhX2JpdF9wYWRkaW5nID0gdW5pdC0+ZGF0YV9iaXRfcGFkZGluZzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY3R4LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJgorICAgICAgICAgICAgICh1bml0LT50eXBlID09IEgyNjRfTkFMX1NQUyB8fAorICAgICAgICAgICAgICB1bml0LT50eXBlID09IEgyNjRfTkFMX1BQUykpIHx8CisgICAgICAgICAgICAoY3R4LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQyAmJgorICAgICAgICAgICAgICh1bml0LT50eXBlID09IEhFVkNfTkFMX1ZQUyB8fAorICAgICAgICAgICAgICB1bml0LT50eXBlID09IEhFVkNfTkFMX1NQUyB8fAorICAgICAgICAgICAgICB1bml0LT50eXBlID09IEhFVkNfTkFMX1BQUykpIHx8CisgICAgICAgICAgICBpID09IDAgLyogKEFzc3VtZSB0aGlzIGlzIHRoZSBzdGFydCBvZiBhbiBhY2Nlc3MgdW5pdC4pICovKSB7CisgICAgICAgICAgICAvLyB6ZXJvX2J5dGUKKyAgICAgICAgICAgIGRhdGFbZHArK10gPSAwOworICAgICAgICB9CisgICAgICAgIC8vIHN0YXJ0X2NvZGVfcHJlZml4X29uZV8zYnl0ZXMKKyAgICAgICAgZGF0YVtkcCsrXSA9IDA7CisgICAgICAgIGRhdGFbZHArK10gPSAwOworICAgICAgICBkYXRhW2RwKytdID0gMTsKKworICAgICAgICB6ZXJvX3J1biA9IDA7CisgICAgICAgIGZvciAoc3AgPSAwOyBzcCA8IHVuaXQtPmRhdGFfc2l6ZTsgc3ArKykgeworICAgICAgICAgICAgaWYgKHplcm9fcnVuIDwgMikgeworICAgICAgICAgICAgICAgIGlmICh1bml0LT5kYXRhW3NwXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICArK3plcm9fcnVuOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgemVyb19ydW4gPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKHVuaXQtPmRhdGFbc3BdICYgfjMpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZW11bGF0aW9uX3ByZXZlbnRpb25fdGhyZWVfYnl0ZQorICAgICAgICAgICAgICAgICAgICBkYXRhW2RwKytdID0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgemVyb19ydW4gPSB1bml0LT5kYXRhW3NwXSA9PSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YVtkcCsrXSA9IHVuaXQtPmRhdGFbc3BdOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChkcCA8PSBtYXhfc2l6ZSk7CisgICAgZXJyID0gYXZfcmVhbGxvY3AoJmRhdGEsIGRwICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBtZW1zZXQoZGF0YSArIGRwLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgIGZyYWctPmRhdGFfcmVmID0gYXZfYnVmZmVyX2NyZWF0ZShkYXRhLCBkcCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIDApOworICAgIGlmICghZnJhZy0+ZGF0YV9yZWYpIHsKKyAgICAgICAgYXZfZnJlZXAoJmRhdGEpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZyYWctPmRhdGEgPSBkYXRhOworICAgIGZyYWctPmRhdGFfc2l6ZSA9IGRwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNic19oMjY0X2Nsb3NlKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4KQoreworICAgIENvZGVkQml0c3RyZWFtSDI2NENvbnRleHQgKmgyNjQgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZmX2gyNjQ1X3BhY2tldF91bmluaXQoJmgyNjQtPmNvbW1vbi5yZWFkX3BhY2tldCk7CisKKyAgICBhdl9mcmVlcCgmaDI2NC0+Y29tbW9uLndyaXRlX2J1ZmZlcik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaDI2NC0+c3BzKTsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmaDI2NC0+c3BzW2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaDI2NC0+cHBzKTsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmaDI2NC0+cHBzW2ldKTsKK30KKworc3RhdGljIHZvaWQgY2JzX2gyNjVfY2xvc2UoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgpCit7CisgICAgQ29kZWRCaXRzdHJlYW1IMjY1Q29udGV4dCAqaDI2NSA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZmZfaDI2NDVfcGFja2V0X3VuaW5pdCgmaDI2NS0+Y29tbW9uLnJlYWRfcGFja2V0KTsKKworICAgIGF2X2ZyZWVwKCZoMjY1LT5jb21tb24ud3JpdGVfYnVmZmVyKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhoMjY1LT52cHMpOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZoMjY1LT52cHNbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhoMjY1LT5zcHMpOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZoMjY1LT5zcHNbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhoMjY1LT5wcHMpOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZoMjY1LT5wcHNbaV0pOworfQorCitjb25zdCBDb2RlZEJpdHN0cmVhbVR5cGUgZmZfY2JzX3R5cGVfaDI2NCA9IHsKKyAgICAuY29kZWNfaWQgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKENvZGVkQml0c3RyZWFtSDI2NENvbnRleHQpLAorCisgICAgLnNwbGl0X2ZyYWdtZW50ICAgID0gJmNic19oMjY0NV9zcGxpdF9mcmFnbWVudCwKKyAgICAucmVhZF91bml0ICAgICAgICAgPSAmY2JzX2gyNjRfcmVhZF9uYWxfdW5pdCwKKyAgICAud3JpdGVfdW5pdCAgICAgICAgPSAmY2JzX2gyNjQ1X3dyaXRlX25hbF91bml0LAorICAgIC5hc3NlbWJsZV9mcmFnbWVudCA9ICZjYnNfaDI2NDVfYXNzZW1ibGVfZnJhZ21lbnQsCisKKyAgICAuY2xvc2UgICAgICAgICAgICAgPSAmY2JzX2gyNjRfY2xvc2UsCit9OworCitjb25zdCBDb2RlZEJpdHN0cmVhbVR5cGUgZmZfY2JzX3R5cGVfaDI2NSA9IHsKKyAgICAuY29kZWNfaWQgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAorCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKENvZGVkQml0c3RyZWFtSDI2NUNvbnRleHQpLAorCisgICAgLnNwbGl0X2ZyYWdtZW50ICAgID0gJmNic19oMjY0NV9zcGxpdF9mcmFnbWVudCwKKyAgICAucmVhZF91bml0ICAgICAgICAgPSAmY2JzX2gyNjVfcmVhZF9uYWxfdW5pdCwKKyAgICAud3JpdGVfdW5pdCAgICAgICAgPSAmY2JzX2gyNjQ1X3dyaXRlX25hbF91bml0LAorICAgIC5hc3NlbWJsZV9mcmFnbWVudCA9ICZjYnNfaDI2NDVfYXNzZW1ibGVfZnJhZ21lbnQsCisKKyAgICAuY2xvc2UgICAgICAgICAgICAgPSAmY2JzX2gyNjVfY2xvc2UsCit9OworCitpbnQgZmZfY2JzX2gyNjRfYWRkX3NlaV9tZXNzYWdlKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICphdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NFJhd1NFSVBheWxvYWQgKnBheWxvYWQpCit7CisgICAgSDI2NFJhd1NFSSAqc2VpOworICAgIENvZGVkQml0c3RyZWFtVW5pdCAqbmFsID0gTlVMTDsKKyAgICBpbnQgZXJyLCBpOworCisgICAgLy8gRmluZCBhbiBleGlzdGluZyBTRUkgTkFMIHVuaXQgdG8gYWRkIHRvLgorICAgIGZvciAoaSA9IDA7IGkgPCBhdS0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICBpZiAoYXUtPnVuaXRzW2ldLnR5cGUgPT0gSDI2NF9OQUxfU0VJKSB7CisgICAgICAgICAgICBuYWwgPSAmYXUtPnVuaXRzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5hbCkgeworICAgICAgICBzZWkgPSBuYWwtPmNvbnRlbnQ7CisKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOZWVkIHRvIG1ha2UgYSBuZXcgU0VJIE5BTCB1bml0LiAgSW5zZXJ0IGl0IGJlZm9yZSB0aGUgZmlyc3QKKyAgICAgICAgLy8gc2xpY2UgZGF0YSBOQUwgdW5pdDsgaWYgbm8gc2xpY2UgZGF0YSwgYWRkIGF0IHRoZSBlbmQuCisgICAgICAgIEFWQnVmZmVyUmVmICpzZWlfcmVmOworCisgICAgICAgIHNlaSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzZWkpKTsKKyAgICAgICAgaWYgKCFzZWkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHNlaS0+bmFsX3VuaXRfaGVhZGVyLm5hbF91bml0X3R5cGUgPSBIMjY0X05BTF9TRUk7CisgICAgICAgIHNlaS0+bmFsX3VuaXRfaGVhZGVyLm5hbF9yZWZfaWRjICAgPSAwOworCisgICAgICAgIHNlaV9yZWYgPSBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90KilzZWksIHNpemVvZigqc2VpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNic19oMjY0X2ZyZWVfc2VpLCBjdHgsIDApOworICAgICAgICBpZiAoIXNlaV9yZWYpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzZWkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdS0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKGF1LT51bml0c1tpXS50eXBlID09IEgyNjRfTkFMX1NMSUNFIHx8CisgICAgICAgICAgICAgICAgYXUtPnVuaXRzW2ldLnR5cGUgPT0gSDI2NF9OQUxfSURSX1NMSUNFKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZmZfY2JzX2luc2VydF91bml0X2NvbnRlbnQoY3R4LCBhdSwgaSwgSDI2NF9OQUxfU0VJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWksIHNlaV9yZWYpOworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnNlaV9yZWYpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHNlaS0+cGF5bG9hZF9jb3VudCA+PSBIMjY0X01BWF9TRUlfUEFZTE9BRFMpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgcGF5bG9hZHMgaW4gIgorICAgICAgICAgICAgICAgIlNFSSBOQUwgdW5pdC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG1lbWNweSgmc2VpLT5wYXlsb2FkW3NlaS0+cGF5bG9hZF9jb3VudF0sIHBheWxvYWQsIHNpemVvZigqcGF5bG9hZCkpOworICAgICsrc2VpLT5wYXlsb2FkX2NvdW50OworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9jYnNfaDI2NF9kZWxldGVfc2VpX21lc3NhZ2UoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXQgKm5hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uKQoreworICAgIEgyNjRSYXdTRUkgKnNlaSA9IG5hbC0+Y29udGVudDsKKworICAgIGF2X2Fzc2VydDAobmFsLT50eXBlID09IEgyNjRfTkFMX1NFSSk7CisgICAgYXZfYXNzZXJ0MChwb3NpdGlvbiA+PSAwICYmIHBvc2l0aW9uIDwgc2VpLT5wYXlsb2FkX2NvdW50KTsKKworICAgIGlmIChwb3NpdGlvbiA9PSAwICYmIHNlaS0+cGF5bG9hZF9jb3VudCA9PSAxKSB7CisgICAgICAgIC8vIERlbGV0aW5nIE5BTCB1bml0IGVudGlyZWx5LgorICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXUtPm5iX3VuaXRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgmYXUtPnVuaXRzW2ldID09IG5hbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQwKGkgPCBhdS0+bmJfdW5pdHMgJiYgIk5BTCB1bml0IG5vdCBpbiBhY2Nlc3MgdW5pdC4iKTsKKworICAgICAgICByZXR1cm4gZmZfY2JzX2RlbGV0ZV91bml0KGN0eCwgYXUsIGkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNic19oMjY0X2ZyZWVfc2VpX3BheWxvYWQoJnNlaS0+cGF5bG9hZFtwb3NpdGlvbl0pOworCisgICAgICAgIC0tc2VpLT5wYXlsb2FkX2NvdW50OworICAgICAgICBtZW1tb3ZlKHNlaS0+cGF5bG9hZCArIHBvc2l0aW9uLAorICAgICAgICAgICAgICAgIHNlaS0+cGF5bG9hZCArIHBvc2l0aW9uICsgMSwKKyAgICAgICAgICAgICAgICAoc2VpLT5wYXlsb2FkX2NvdW50IC0gcG9zaXRpb24pICogc2l6ZW9mKCpzZWktPnBheWxvYWQpKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Nic19oMjY0NS5oIGIvbGliYXZjb2RlYy9jYnNfaDI2NDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGNmNjViCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9jYnNfaDI2NDUuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19DQlNfSDI2NDVfSAorI2RlZmluZSBBVkNPREVDX0NCU19IMjY0NV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImgyNjQ1X3BhcnNlLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgQ29kZWRCaXRzdHJlYW1IMjY0NUNvbnRleHQgeworICAgIC8vIElmIHNldCwgdGhlIHN0cmVhbSBiZWluZyByZWFkIGlzIGluIE1QNCAoQVZDQy9IVkNDKSBmb3JtYXQuICBJZiBub3QKKyAgICAvLyBzZXQsIHRoZSBzdHJlYW0gaXMgYXNzdW1lZCB0byBiZSBpbiBhbm5leCBCIGZvcm1hdC4KKyAgICBpbnQgbXA0OworICAgIC8vIFNpemUgaW4gYnl0ZXMgb2YgdGhlIE5BTCBsZW5ndGggZmllbGQgZm9yIE1QNCBmb3JtYXQuCisgICAgaW50IG5hbF9sZW5ndGhfc2l6ZTsKKyAgICAvLyBQYWNrZXQgcmVhZGVyLgorICAgIEgyNjQ1UGFja2V0IHJlYWRfcGFja2V0OworCisgICAgLy8gV3JpdGUgYnVmZmVyCisgICAgdWludDhfdCAqd3JpdGVfYnVmZmVyOworICAgIHNpemVfdCB3cml0ZV9idWZmZXJfc2l6ZTsKK30gQ29kZWRCaXRzdHJlYW1IMjY0NUNvbnRleHQ7CisKKworI2VuZGlmIC8qIEFWQ09ERUNfQ0JTX0gyNjQ1X0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JzX2gyNjRfc3ludGF4X3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2Nic19oMjY0X3N5bnRheF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDg5ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2Nic19oMjY0X3N5bnRheF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMTI4NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCitzdGF0aWMgaW50IEZVTkMocmJzcF90cmFpbGluZ19iaXRzKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydykKK3sKKyAgICBpbnQgZXJyOworICAgIGF2X3VudXNlZCBpbnQgb25lID0gMSwgemVybyA9IDA7CisgICAgeHUoMSwgcmJzcF9zdG9wX29uZV9iaXQsIG9uZSwgMSwgMSk7CisgICAgd2hpbGUgKGJ5dGVfYWxpZ25tZW50KHJ3KSAhPSAwKQorICAgICAgICB4dSgxLCByYnNwX2FsaWdubWVudF96ZXJvX2JpdCwgemVybywgMCwgMCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKG5hbF91bml0X2hlYWRlcikoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UmF3TkFMVW5pdEhlYWRlciAqY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbGlkX3R5cGVfbWFzaykKK3sKKyAgICBpbnQgZXJyOworCisgICAgdSgxLCBmb3JiaWRkZW5femVyb19iaXQsIDAsIDApOworICAgIHUoMiwgbmFsX3JlZl9pZGMsICAgICAgICAwLCAzKTsKKyAgICB1KDUsIG5hbF91bml0X3R5cGUsICAgICAgMCwgMzEpOworCisgICAgaWYgKCEoMSA8PCBjdXJyZW50LT5uYWxfdW5pdF90eXBlICYgdmFsaWRfdHlwZV9tYXNrKSkgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIE5BTCB1bml0IHR5cGUgJWQuXG4iLAorICAgICAgICAgICAgICAgY3VycmVudC0+bmFsX3VuaXRfdHlwZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChjdXJyZW50LT5uYWxfdW5pdF90eXBlID09IDE0IHx8CisgICAgICAgIGN1cnJlbnQtPm5hbF91bml0X3R5cGUgPT0gMjAgfHwKKyAgICAgICAgY3VycmVudC0+bmFsX3VuaXRfdHlwZSA9PSAyMSkgeworICAgICAgICBpZiAoY3VycmVudC0+bmFsX3VuaXRfdHlwZSAhPSAyMSkKKyAgICAgICAgICAgIGZsYWcoc3ZjX2V4dGVuc2lvbl9mbGFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZyhhdmNfM2RfZXh0ZW5zaW9uX2ZsYWcpOworCisgICAgICAgIGlmIChjdXJyZW50LT5zdmNfZXh0ZW5zaW9uX2ZsYWcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlNWQyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisKKyAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LT5hdmNfM2RfZXh0ZW5zaW9uX2ZsYWcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIjNEQVZDIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiTVZDIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoc2NhbGluZ19saXN0KShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTY2FsaW5nTGlzdCAqY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX29mX3NjYWxpbmdfbGlzdCkKK3sKKyAgICBpbnQgZXJyLCBpLCBzY2FsZTsKKworICAgIHNjYWxlID0gODsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9vZl9zY2FsaW5nX2xpc3Q7IGkrKykgeworICAgICAgICB4c2UoZGVsdGFfc2NhbGUsIGN1cnJlbnQtPmRlbHRhX3NjYWxlW2ldLCAtMTI4LCArMTI3KTsKKyAgICAgICAgc2NhbGUgPSAoc2NhbGUgKyBjdXJyZW50LT5kZWx0YV9zY2FsZVtpXSArIDI1NikgJSAyNTY7CisgICAgICAgIGlmIChzY2FsZSA9PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhocmRfcGFyYW1ldGVycykoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdIUkQgKmN1cnJlbnQpCit7CisgICAgaW50IGVyciwgaTsKKworICAgIHVlKGNwYl9jbnRfbWludXMxLCAwLCAzMSk7CisgICAgdSg0LCBiaXRfcmF0ZV9zY2FsZSwgMCwgMTUpOworICAgIHUoNCwgY3BiX3NpemVfc2NhbGUsIDAsIDE1KTsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gY3VycmVudC0+Y3BiX2NudF9taW51czE7IGkrKykgeworICAgICAgICB1ZShiaXRfcmF0ZV92YWx1ZV9taW51czFbaV0sIDAsIFVJTlQzMl9NQVggLSAxKTsKKyAgICAgICAgdWUoY3BiX3NpemVfdmFsdWVfbWludXMxW2ldLCAwLCBVSU5UMzJfTUFYIC0gMSk7CisgICAgICAgIGZsYWcoY2JyX2ZsYWdbaV0pOworICAgIH0KKworICAgIHUoNSwgaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxLCAwLCAzMSk7CisgICAgdSg1LCBjcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxLCAgICAgICAgIDAsIDMxKTsKKyAgICB1KDUsIGRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoX21pbnVzMSwgICAgICAgICAgMCwgMzEpOworICAgIHUoNSwgdGltZV9vZmZzZXRfbGVuZ3RoLCAgICAgICAgICAgICAgICAgICAgICAwLCAzMSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKHZ1aV9wYXJhbWV0ZXJzKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFJhd1ZVSSAqY3VycmVudCwgSDI2NFJhd1NQUyAqc3BzKQoreworICAgIGludCBlcnI7CisKKyAgICBmbGFnKGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPmFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZykgeworICAgICAgICB1KDgsIGFzcGVjdF9yYXRpb19pZGMsIDAsIDI1NSk7CisgICAgICAgIGlmIChjdXJyZW50LT5hc3BlY3RfcmF0aW9faWRjID09IDI1NSkgeworICAgICAgICAgICAgdSgxNiwgc2FyX3dpZHRoLCAgMCwgNjU1MzUpOworICAgICAgICAgICAgdSgxNiwgc2FyX2hlaWdodCwgMCwgNjU1MzUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mZXIoYXNwZWN0X3JhdGlvX2lkYywgMCk7CisgICAgfQorCisgICAgZmxhZyhvdmVyc2Nhbl9pbmZvX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPm92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnKQorICAgICAgICBmbGFnKG92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWcpOworCisgICAgZmxhZyh2aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWcpOworICAgIGlmIChjdXJyZW50LT52aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdSgzLCB2aWRlb19mb3JtYXQsIDAsIDcpOworICAgICAgICBmbGFnKHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyk7CisgICAgICAgIGZsYWcoY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyk7CisgICAgICAgIGlmIChjdXJyZW50LT5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICB1KDgsIGNvbG91cl9wcmltYXJpZXMsICAgICAgICAgMCwgMjU1KTsKKyAgICAgICAgICAgIHUoOCwgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzLCAwLCAyNTUpOworICAgICAgICAgICAgdSg4LCBtYXRyaXhfY29lZmZpY2llbnRzLCAgICAgIDAsIDI1NSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbmZlcih2aWRlb19mb3JtYXQsICAgICAgICAgICAgIDUpOworICAgICAgICBpbmZlcih2aWRlb19mdWxsX3JhbmdlX2ZsYWcsICAgIDApOworICAgICAgICBpbmZlcihjb2xvdXJfcHJpbWFyaWVzLCAgICAgICAgIDIpOworICAgICAgICBpbmZlcih0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MsIDIpOworICAgICAgICBpbmZlcihtYXRyaXhfY29lZmZpY2llbnRzLCAgICAgIDIpOworICAgIH0KKworICAgIGZsYWcoY2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPmNocm9tYV9sb2NfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdWUoY2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQsICAgIDAsIDUpOworICAgICAgICB1ZShjaHJvbWFfc2FtcGxlX2xvY190eXBlX2JvdHRvbV9maWVsZCwgMCwgNSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mZXIoY2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQsICAgIDApOworICAgICAgICBpbmZlcihjaHJvbWFfc2FtcGxlX2xvY190eXBlX2JvdHRvbV9maWVsZCwgMCk7CisgICAgfQorCisgICAgZmxhZyh0aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpOworICAgIGlmIChjdXJyZW50LT50aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdSgzMiwgbnVtX3VuaXRzX2luX3RpY2ssIDEsIFVJTlQzMl9NQVgpOworICAgICAgICB1KDMyLCB0aW1lX3NjYWxlLCAgICAgICAgMSwgVUlOVDMyX01BWCk7CisgICAgICAgIGZsYWcoZml4ZWRfZnJhbWVfcmF0ZV9mbGFnKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZlcihmaXhlZF9mcmFtZV9yYXRlX2ZsYWcsIDApOworICAgIH0KKworICAgIGZsYWcobmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIENIRUNLKEZVTkMoaHJkX3BhcmFtZXRlcnMpKGN0eCwgcncsICZjdXJyZW50LT5uYWxfaHJkX3BhcmFtZXRlcnMpKTsKKworICAgIGZsYWcodmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIENIRUNLKEZVTkMoaHJkX3BhcmFtZXRlcnMpKGN0eCwgcncsICZjdXJyZW50LT52Y2xfaHJkX3BhcmFtZXRlcnMpKTsKKworICAgIGlmIChjdXJyZW50LT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnIHx8CisgICAgICAgIGN1cnJlbnQtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIGZsYWcobG93X2RlbGF5X2hyZF9mbGFnKTsKKyAgICBlbHNlCisgICAgICAgIGluZmVyKGxvd19kZWxheV9ocmRfZmxhZywgMSAtIGN1cnJlbnQtPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyk7CisKKyAgICBmbGFnKHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKTsKKworICAgIGZsYWcoYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZykgeworICAgICAgICBmbGFnKG1vdGlvbl92ZWN0b3JzX292ZXJfcGljX2JvdW5kYXJpZXNfZmxhZyk7CisgICAgICAgIHVlKG1heF9ieXRlc19wZXJfcGljX2Rlbm9tLCAwLCAxNik7CisgICAgICAgIHVlKG1heF9iaXRzX3Blcl9tYl9kZW5vbSwgICAwLCAxNik7CisgICAgICAgIHVlKGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsLCAwLCAxNik7CisgICAgICAgIHVlKGxvZzJfbWF4X212X2xlbmd0aF92ZXJ0aWNhbCwgICAwLCAxNik7CisgICAgICAgIHVlKG1heF9udW1fcmVvcmRlcl9mcmFtZXMsICAwLCBIMjY0X01BWF9EUEJfRlJBTUVTKTsKKyAgICAgICAgdWUobWF4X2RlY19mcmFtZV9idWZmZXJpbmcsIDAsIEgyNjRfTUFYX0RQQl9GUkFNRVMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZmVyKG1vdGlvbl92ZWN0b3JzX292ZXJfcGljX2JvdW5kYXJpZXNfZmxhZywgMSk7CisgICAgICAgIGluZmVyKG1heF9ieXRlc19wZXJfcGljX2Rlbm9tLCAyKTsKKyAgICAgICAgaW5mZXIobWF4X2JpdHNfcGVyX21iX2Rlbm9tLCAgIDEpOworICAgICAgICBpbmZlcihsb2cyX21heF9tdl9sZW5ndGhfaG9yaXpvbnRhbCwgMTYpOworICAgICAgICBpbmZlcihsb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwsICAgMTYpOworCisgICAgICAgIGlmICgoc3BzLT5wcm9maWxlX2lkYyA9PSAgNDQgfHwgc3BzLT5wcm9maWxlX2lkYyA9PSAgODYgfHwKKyAgICAgICAgICAgICBzcHMtPnByb2ZpbGVfaWRjID09IDExMCB8fCBzcHMtPnByb2ZpbGVfaWRjID09IDExMCB8fAorICAgICAgICAgICAgIHNwcy0+cHJvZmlsZV9pZGMgPT0gMTIyIHx8IHNwcy0+cHJvZmlsZV9pZGMgPT0gMjQ0KSAmJgorICAgICAgICAgICAgc3BzLT5jb25zdHJhaW50X3NldDNfZmxhZykgeworICAgICAgICAgICAgaW5mZXIobWF4X251bV9yZW9yZGVyX2ZyYW1lcywgIDApOworICAgICAgICAgICAgaW5mZXIobWF4X2RlY19mcmFtZV9idWZmZXJpbmcsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mZXIobWF4X251bV9yZW9yZGVyX2ZyYW1lcywgIEgyNjRfTUFYX0RQQl9GUkFNRVMpOworICAgICAgICAgICAgaW5mZXIobWF4X2RlY19mcmFtZV9idWZmZXJpbmcsIEgyNjRfTUFYX0RQQl9GUkFNRVMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzcHMpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgSDI2NFJhd1NQUyAqY3VycmVudCkKK3sKKyAgICBpbnQgZXJyLCBpOworCisgICAgSEVBREVSKCJTZXF1ZW5jZSBQYXJhbWV0ZXIgU2V0Iik7CisKKyAgICBDSEVDSyhGVU5DKG5hbF91bml0X2hlYWRlcikoY3R4LCBydywgJmN1cnJlbnQtPm5hbF91bml0X2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBIMjY0X05BTF9TUFMpKTsKKworICAgIHUoOCwgcHJvZmlsZV9pZGMsIDAsIDI1NSk7CisKKyAgICBmbGFnKGNvbnN0cmFpbnRfc2V0MF9mbGFnKTsKKyAgICBmbGFnKGNvbnN0cmFpbnRfc2V0MV9mbGFnKTsKKyAgICBmbGFnKGNvbnN0cmFpbnRfc2V0Ml9mbGFnKTsKKyAgICBmbGFnKGNvbnN0cmFpbnRfc2V0M19mbGFnKTsKKyAgICBmbGFnKGNvbnN0cmFpbnRfc2V0NF9mbGFnKTsKKyAgICBmbGFnKGNvbnN0cmFpbnRfc2V0NV9mbGFnKTsKKworICAgIHUoMiwgcmVzZXJ2ZWRfemVyb18yYml0cywgIDAsIDApOworCisgICAgdSg4LCBsZXZlbF9pZGMsIDAsIDI1NSk7CisKKyAgICB1ZShzZXFfcGFyYW1ldGVyX3NldF9pZCwgMCwgMzEpOworCisgICAgaWYgKGN1cnJlbnQtPnByb2ZpbGVfaWRjID09IDEwMCB8fCBjdXJyZW50LT5wcm9maWxlX2lkYyA9PSAxMTAgfHwKKyAgICAgICAgY3VycmVudC0+cHJvZmlsZV9pZGMgPT0gMTIyIHx8IGN1cnJlbnQtPnByb2ZpbGVfaWRjID09IDI0NCB8fAorICAgICAgICBjdXJyZW50LT5wcm9maWxlX2lkYyA9PSAgNDQgfHwgY3VycmVudC0+cHJvZmlsZV9pZGMgPT0gIDgzIHx8CisgICAgICAgIGN1cnJlbnQtPnByb2ZpbGVfaWRjID09ICA4NiB8fCBjdXJyZW50LT5wcm9maWxlX2lkYyA9PSAxMTggfHwKKyAgICAgICAgY3VycmVudC0+cHJvZmlsZV9pZGMgPT0gMTI4IHx8IGN1cnJlbnQtPnByb2ZpbGVfaWRjID09IDEzOCkgeworICAgICAgICB1ZShjaHJvbWFfZm9ybWF0X2lkYywgMCwgMyk7CisKKyAgICAgICAgaWYgKGN1cnJlbnQtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpCisgICAgICAgICAgICBmbGFnKHNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mZXIoc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcsIDApOworCisgICAgICAgIHVlKGJpdF9kZXB0aF9sdW1hX21pbnVzOCwgICAwLCA2KTsKKyAgICAgICAgdWUoYml0X2RlcHRoX2Nocm9tYV9taW51czgsIDAsIDYpOworCisgICAgICAgIGZsYWcocXBwcmltZV95X3plcm9fdHJhbnNmb3JtX2J5cGFzc19mbGFnKTsKKworICAgICAgICBmbGFnKHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcpOworICAgICAgICBpZiAoY3VycmVudC0+c2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICgoY3VycmVudC0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gMykgPyA4IDogMTIpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmbGFnKHNlcV9zY2FsaW5nX2xpc3RfcHJlc2VudF9mbGFnW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudC0+c2VxX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCA2KQorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soRlVOQyhzY2FsaW5nX2xpc3QpKGN0eCwgcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnQtPnNjYWxpbmdfbGlzdF80eDRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soRlVOQyhzY2FsaW5nX2xpc3QpKGN0eCwgcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnQtPnNjYWxpbmdfbGlzdF84eDhbaSAtIDZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mZXIoY2hyb21hX2Zvcm1hdF9pZGMsIGN1cnJlbnQtPnByb2ZpbGVfaWRjID09IDE4MyA/IDAgOiAxKTsKKworICAgICAgICBpbmZlcihzZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZywgMCk7CisgICAgICAgIGluZmVyKGJpdF9kZXB0aF9sdW1hX21pbnVzOCwgICAgICAwKTsKKyAgICAgICAgaW5mZXIoYml0X2RlcHRoX2Nocm9tYV9taW51czgsICAgIDApOworICAgIH0KKworICAgIHVlKGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQsIDAsIDEyKTsKKyAgICB1ZShwaWNfb3JkZXJfY250X3R5cGUsIDAsIDIpOworCisgICAgaWYgKGN1cnJlbnQtPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKSB7CisgICAgICAgIHVlKGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCwgMCwgMTIpOworICAgIH0gZWxzZSBpZiAoY3VycmVudC0+cGljX29yZGVyX2NudF90eXBlID09IDEpIHsKKyAgICAgICAgZmxhZyhkZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyk7CisgICAgICAgIHNlKG9mZnNldF9mb3Jfbm9uX3JlZl9waWMsICAgICAgICAgSU5UMzJfTUlOICsgMSwgSU5UMzJfTUFYKTsKKyAgICAgICAgc2Uob2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkLCBJTlQzMl9NSU4gKyAxLCBJTlQzMl9NQVgpOworICAgICAgICB1ZShudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlLCAwLCAyNTUpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5udW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyBpKyspCisgICAgICAgICAgICBzZShvZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSwgSU5UMzJfTUlOICsgMSwgSU5UMzJfTUFYKTsKKyAgICB9CisKKyAgICB1ZShtYXhfbnVtX3JlZl9mcmFtZXMsIDAsIEgyNjRfTUFYX0RQQl9GUkFNRVMpOworICAgIGZsYWcoZ2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnKTsKKworICAgIHVlKHBpY193aWR0aF9pbl9tYnNfbWludXMxLCAgICAgICAgMCwgSDI2NF9NQVhfTUJfV0lEVEgpOworICAgIHVlKHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSwgMCwgSDI2NF9NQVhfTUJfSEVJR0hUKTsKKworICAgIGZsYWcoZnJhbWVfbWJzX29ubHlfZmxhZyk7CisgICAgaWYgKCFjdXJyZW50LT5mcmFtZV9tYnNfb25seV9mbGFnKQorICAgICAgICBmbGFnKG1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcpOworCisgICAgZmxhZyhkaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKTsKKworICAgIGZsYWcoZnJhbWVfY3JvcHBpbmdfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcpIHsKKyAgICAgICAgdWUoZnJhbWVfY3JvcF9sZWZ0X29mZnNldCwgICAwLCBIMjY0X01BWF9XSURUSCk7CisgICAgICAgIHVlKGZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0LCAgMCwgSDI2NF9NQVhfV0lEVEgpOworICAgICAgICB1ZShmcmFtZV9jcm9wX3RvcF9vZmZzZXQsICAgIDAsIEgyNjRfTUFYX0hFSUdIVCk7CisgICAgICAgIHVlKGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldCwgMCwgSDI2NF9NQVhfSEVJR0hUKTsKKyAgICB9CisKKyAgICBmbGFnKHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykKKyAgICAgICAgQ0hFQ0soRlVOQyh2dWlfcGFyYW1ldGVycykoY3R4LCBydywgJmN1cnJlbnQtPnZ1aSwgY3VycmVudCkpOworCisgICAgQ0hFQ0soRlVOQyhyYnNwX3RyYWlsaW5nX2JpdHMpKGN0eCwgcncpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoc3BzX2V4dGVuc2lvbikoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFJhd1NQU0V4dGVuc2lvbiAqY3VycmVudCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgSEVBREVSKCJTZXF1ZW5jZSBQYXJhbWV0ZXIgU2V0IEV4dGVuc2lvbiIpOworCisgICAgQ0hFQ0soRlVOQyhuYWxfdW5pdF9oZWFkZXIpKGN0eCwgcncsICZjdXJyZW50LT5uYWxfdW5pdF9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgSDI2NF9OQUxfU1BTX0VYVCkpOworCisgICAgdWUoc2VxX3BhcmFtZXRlcl9zZXRfaWQsIDAsIDMxKTsKKworICAgIHVlKGF1eF9mb3JtYXRfaWRjLCAwLCAzKTsKKworICAgIGlmIChjdXJyZW50LT5hdXhfZm9ybWF0X2lkYyAhPSAwKSB7CisgICAgICAgIGludCBiaXRzOworCisgICAgICAgIHVlKGJpdF9kZXB0aF9hdXhfbWludXM4LCAwLCA0KTsKKyAgICAgICAgZmxhZyhhbHBoYV9pbmNyX2ZsYWcpOworCisgICAgICAgIGJpdHMgPSBjdXJyZW50LT5iaXRfZGVwdGhfYXV4X21pbnVzOCArIDk7CisgICAgICAgIHUoYml0cywgYWxwaGFfb3BhcXVlX3ZhbHVlLCAgICAgIDAsIE1BWF9VSU5UX0JJVFMoYml0cykpOworICAgICAgICB1KGJpdHMsIGFscGhhX3RyYW5zcGFyZW50X3ZhbHVlLCAwLCBNQVhfVUlOVF9CSVRTKGJpdHMpKTsKKyAgICB9CisKKyAgICBmbGFnKGFkZGl0aW9uYWxfZXh0ZW5zaW9uX2ZsYWcpOworCisgICAgQ0hFQ0soRlVOQyhyYnNwX3RyYWlsaW5nX2JpdHMpKGN0eCwgcncpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMocHBzKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdQUFMgKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1IMjY0Q29udGV4dCAqaDI2NCA9IGN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEgyNjRSYXdTUFMgKnNwczsKKyAgICBpbnQgZXJyLCBpOworCisgICAgSEVBREVSKCJQaWN0dXJlIFBhcmFtZXRlciBTZXQiKTsKKworICAgIENIRUNLKEZVTkMobmFsX3VuaXRfaGVhZGVyKShjdHgsIHJ3LCAmY3VycmVudC0+bmFsX3VuaXRfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8IEgyNjRfTkFMX1BQUykpOworCisgICAgdWUocGljX3BhcmFtZXRlcl9zZXRfaWQsIDAsIDI1NSk7CisgICAgdWUoc2VxX3BhcmFtZXRlcl9zZXRfaWQsIDAsIDMxKTsKKworICAgIHNwcyA9IGgyNjQtPnNwc1tjdXJyZW50LT5zZXFfcGFyYW1ldGVyX3NldF9pZF07CisgICAgaWYgKCFzcHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiU1BTIGlkICVkIG5vdCBhdmFpbGFibGUuXG4iLAorICAgICAgICAgICAgICAgY3VycmVudC0+c2VxX3BhcmFtZXRlcl9zZXRfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmbGFnKGVudHJvcHlfY29kaW5nX21vZGVfZmxhZyk7CisgICAgZmxhZyhib3R0b21fZmllbGRfcGljX29yZGVyX2luX2ZyYW1lX3ByZXNlbnRfZmxhZyk7CisKKyAgICB1ZShudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSwgMCwgNyk7CisgICAgaWYgKGN1cnJlbnQtPm51bV9zbGljZV9ncm91cHNfbWludXMxID4gMCkgeworICAgICAgICB1bnNpZ25lZCBpbnQgcGljX3NpemU7CisgICAgICAgIGludCBpR3JvdXA7CisKKyAgICAgICAgcGljX3NpemUgPSAoc3BzLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDEpICoKKyAgICAgICAgICAgICAgICAgICAoc3BzLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxKTsKKworICAgICAgICB1ZShzbGljZV9ncm91cF9tYXBfdHlwZSwgMCwgNik7CisKKyAgICAgICAgaWYgKGN1cnJlbnQtPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDApIHsKKyAgICAgICAgICAgIGZvciAoaUdyb3VwID0gMDsgaUdyb3VwIDw9IGN1cnJlbnQtPm51bV9zbGljZV9ncm91cHNfbWludXMxOyBpR3JvdXArKykKKyAgICAgICAgICAgICAgICB1ZShydW5fbGVuZ3RoX21pbnVzMVtpR3JvdXBdLCAwLCBwaWNfc2l6ZSAtIDEpOworCisgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudC0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPT0gMikgeworICAgICAgICAgICAgZm9yIChpR3JvdXAgPSAwOyBpR3JvdXAgPCBjdXJyZW50LT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMTsgaUdyb3VwKyspIHsKKyAgICAgICAgICAgICAgICB1ZSh0b3BfbGVmdFtpR3JvdXBdLCAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3NpemUgLSAxKTsKKyAgICAgICAgICAgICAgICB1ZShib3R0b21fcmlnaHRbaUdyb3VwXSwgY3VycmVudC0+dG9wX2xlZnRbaUdyb3VwXSwgcGljX3NpemUgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSAzIHx8CisgICAgICAgICAgICAgICAgICAgY3VycmVudC0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPT0gNCB8fAorICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnNsaWNlX2dyb3VwX21hcF90eXBlID09IDUpIHsKKyAgICAgICAgICAgIGZsYWcoc2xpY2VfZ3JvdXBfY2hhbmdlX2RpcmVjdGlvbl9mbGFnKTsKKyAgICAgICAgICAgIHVlKHNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSwgMCwgcGljX3NpemUgLSAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LT5zbGljZV9ncm91cF9tYXBfdHlwZSA9PSA2KSB7CisgICAgICAgICAgICB1ZShwaWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxLCBwaWNfc2l6ZSAtIDEsIHBpY19zaXplIC0gMSk7CisKKyAgICAgICAgICAgIGFsbG9jYXRlKGN1cnJlbnQtPnNsaWNlX2dyb3VwX2lkLAorICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+cGljX3NpemVfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyZW50LT5waWNfc2l6ZV9pbl9tYXBfdW5pdHNfbWludXMxOyBpKyspCisgICAgICAgICAgICAgICAgdShhdl9sb2cyKDIgKiBjdXJyZW50LT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSArIDEpLAorICAgICAgICAgICAgICAgICAgc2xpY2VfZ3JvdXBfaWRbaV0sIDAsIGN1cnJlbnQtPm51bV9zbGljZV9ncm91cHNfbWludXMxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVlKG51bV9yZWZfaWR4X2wwX2RlZmF1bHRfYWN0aXZlX21pbnVzMSwgMCwgMzEpOworICAgIHVlKG51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlX21pbnVzMSwgMCwgMzEpOworCisgICAgZmxhZyh3ZWlnaHRlZF9wcmVkX2ZsYWcpOworICAgIHUoMiwgd2VpZ2h0ZWRfYmlwcmVkX2lkYywgMCwgMik7CisKKyAgICBzZShwaWNfaW5pdF9xcF9taW51czI2LCAtMjYgLSA2ICogc3BzLT5iaXRfZGVwdGhfbHVtYV9taW51czgsICsyNSk7CisgICAgc2UocGljX2luaXRfcXNfbWludXMyNiwgLTI2LCArMjUpOworICAgIHNlKGNocm9tYV9xcF9pbmRleF9vZmZzZXQsIC0xMiwgKzEyKTsKKworICAgIGZsYWcoZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcpOworICAgIGZsYWcoY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnKTsKKyAgICBmbGFnKHJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyk7CisKKyAgICBpZiAobW9yZV9yYnNwX2RhdGEoY3VycmVudC0+bW9yZV9yYnNwX2RhdGEpKQorICAgIHsKKyAgICAgICAgZmxhZyh0cmFuc2Zvcm1fOHg4X21vZGVfZmxhZyk7CisKKyAgICAgICAgZmxhZyhwaWNfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnKTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPnBpY19zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2ICsgKCgoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAzKSA/IDIgOiA2KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT50cmFuc2Zvcm1fOHg4X21vZGVfZmxhZyk7IGkrKykgeworICAgICAgICAgICAgICAgIGZsYWcocGljX3NjYWxpbmdfbGlzdF9wcmVzZW50X2ZsYWdbaV0pOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5waWNfc2NhbGluZ19saXN0X3ByZXNlbnRfZmxhZ1tpXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IDYpCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhGVU5DKHNjYWxpbmdfbGlzdCkoY3R4LCBydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudC0+c2NhbGluZ19saXN0XzR4NFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNikpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDSyhGVU5DKHNjYWxpbmdfbGlzdCkoY3R4LCBydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudC0+c2NhbGluZ19saXN0Xzh4OFtpIC0gNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZShzZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCwgLTEyLCArMTIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZmVyKHRyYW5zZm9ybV84eDhfbW9kZV9mbGFnLCAwKTsKKyAgICAgICAgaW5mZXIocGljX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZywgMCk7CisgICAgICAgIGluZmVyKHNlY29uZF9jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0LCBjdXJyZW50LT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KTsKKyAgICB9CisKKyAgICBDSEVDSyhGVU5DKHJic3BfdHJhaWxpbmdfYml0cykoY3R4LCBydykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzZWlfYnVmZmVyaW5nX3BlcmlvZCkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTRUlCdWZmZXJpbmdQZXJpb2QgKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1IMjY0Q29udGV4dCAqaDI2NCA9IGN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEgyNjRSYXdTUFMgKnNwczsKKyAgICBpbnQgZXJyLCBpLCBsZW5ndGg7CisKKyAgICB1ZShzZXFfcGFyYW1ldGVyX3NldF9pZCwgMCwgMzEpOworCisgICAgc3BzID0gaDI2NC0+c3BzW2N1cnJlbnQtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkXTsKKyAgICBpZiAoIXNwcykgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJTUFMgaWQgJWQgbm90IGF2YWlsYWJsZS5cbiIsCisgICAgICAgICAgICAgICBjdXJyZW50LT5zZXFfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBoMjY0LT5hY3RpdmVfc3BzID0gc3BzOworCisgICAgaWYgKHNwcy0+dnVpLm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBzcHMtPnZ1aS5uYWxfaHJkX3BhcmFtZXRlcnMuY3BiX2NudF9taW51czE7IGkrKykgeworICAgICAgICAgICAgbGVuZ3RoID0gc3BzLT52dWkubmFsX2hyZF9wYXJhbWV0ZXJzLmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDE7CisgICAgICAgICAgICB4dShsZW5ndGgsIGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbU2NoZWRTZWxJZHhdLAorICAgICAgICAgICAgICAgY3VycmVudC0+bmFsLmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbaV0sCisgICAgICAgICAgICAgICAxLCBNQVhfVUlOVF9CSVRTKGxlbmd0aCkpOworICAgICAgICAgICAgeHUobGVuZ3RoLCBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldFtTY2hlZFNlbElkeF0sCisgICAgICAgICAgICAgICBjdXJyZW50LT5uYWwuaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXRbaV0sCisgICAgICAgICAgICAgICAwLCBNQVhfVUlOVF9CSVRTKGxlbmd0aCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNwcy0+dnVpLnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBzcHMtPnZ1aS52Y2xfaHJkX3BhcmFtZXRlcnMuY3BiX2NudF9taW51czE7IGkrKykgeworICAgICAgICAgICAgbGVuZ3RoID0gc3BzLT52dWkudmNsX2hyZF9wYXJhbWV0ZXJzLmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDE7CisgICAgICAgICAgICB4dShsZW5ndGgsIGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbU2NoZWRTZWxJZHhdLAorICAgICAgICAgICAgICAgY3VycmVudC0+dmNsLmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbaV0sCisgICAgICAgICAgICAgICAxLCBNQVhfVUlOVF9CSVRTKGxlbmd0aCkpOworICAgICAgICAgICAgeHUobGVuZ3RoLCBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldFtTY2hlZFNlbElkeF0sCisgICAgICAgICAgICAgICBjdXJyZW50LT52Y2wuaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9vZmZzZXRbaV0sCisgICAgICAgICAgICAgICAwLCBNQVhfVUlOVF9CSVRTKGxlbmd0aCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzZWlfcGljX3RpbWVzdGFtcCkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTRUlQaWNUaW1lc3RhbXAgKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1IMjY0Q29udGV4dCAqaDI2NCA9IGN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEgyNjRSYXdTUFMgKnNwczsKKyAgICB1aW50OF90IHRpbWVfb2Zmc2V0X2xlbmd0aDsKKyAgICBpbnQgZXJyOworCisgICAgdSgyLCBjdF90eXBlLCAwLCAyKTsKKyAgICBmbGFnKG51aXRfZmllbGRfYmFzZWRfZmxhZyk7CisgICAgdSg1LCBjb3VudGluZ190eXBlLCAwLCA2KTsKKyAgICBmbGFnKGZ1bGxfdGltZXN0YW1wX2ZsYWcpOworICAgIGZsYWcoZGlzY29udGludWl0eV9mbGFnKTsKKyAgICBmbGFnKGNudF9kcm9wcGVkX2ZsYWcpOworICAgIHUoOCwgbl9mcmFtZXMsIDAsIDI1NSk7CisgICAgaWYgKGN1cnJlbnQtPmZ1bGxfdGltZXN0YW1wX2ZsYWcpIHsKKyAgICAgICAgICAgIHUoNiwgc2Vjb25kc192YWx1ZSwgMCwgNTkpOworICAgICAgICAgICAgdSg2LCBtaW51dGVzX3ZhbHVlLCAwLCA1OSk7CisgICAgICAgICAgICB1KDUsIGhvdXJzX3ZhbHVlLCAgIDAsIDIzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbGFnKHNlY29uZHNfZmxhZyk7CisgICAgICAgIGlmIChjdXJyZW50LT5zZWNvbmRzX2ZsYWcpIHsKKyAgICAgICAgICAgIHUoNiwgc2Vjb25kc192YWx1ZSwgMCwgNTkpOworICAgICAgICAgICAgZmxhZyhtaW51dGVzX2ZsYWcpOworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm1pbnV0ZXNfZmxhZykgeworICAgICAgICAgICAgICAgIHUoNiwgbWludXRlc192YWx1ZSwgMCwgNTkpOworICAgICAgICAgICAgICAgIGZsYWcoaG91cnNfZmxhZyk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmhvdXJzX2ZsYWcpCisgICAgICAgICAgICAgICAgICAgIHUoNSwgaG91cnNfdmFsdWUsIDAsIDIzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHNwcyA9IGgyNjQtPmFjdGl2ZV9zcHM7CisgICAgaWYgKCFzcHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vIGFjdGl2ZSBTUFMgZm9yIHBpY190aW1lc3RhbXAuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHNwcy0+dnVpLm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIHRpbWVfb2Zmc2V0X2xlbmd0aCA9IHNwcy0+dnVpLm5hbF9ocmRfcGFyYW1ldGVycy50aW1lX29mZnNldF9sZW5ndGg7CisgICAgZWxzZSBpZiAoc3BzLT52dWkudmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykKKyAgICAgICAgdGltZV9vZmZzZXRfbGVuZ3RoID0gc3BzLT52dWkudmNsX2hyZF9wYXJhbWV0ZXJzLnRpbWVfb2Zmc2V0X2xlbmd0aDsKKyAgICBlbHNlCisgICAgICAgIHRpbWVfb2Zmc2V0X2xlbmd0aCA9IDI0OworCisgICAgaWYgKHRpbWVfb2Zmc2V0X2xlbmd0aCA+IDApCisgICAgICAgIHUodGltZV9vZmZzZXRfbGVuZ3RoLCB0aW1lX29mZnNldCwKKyAgICAgICAgICAwLCBNQVhfVUlOVF9CSVRTKHRpbWVfb2Zmc2V0X2xlbmd0aCkpOworICAgIGVsc2UKKyAgICAgICAgaW5mZXIodGltZV9vZmZzZXQsIDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzZWlfcGljX3RpbWluZykoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTRUlQaWNUaW1pbmcgKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1IMjY0Q29udGV4dCAqaDI2NCA9IGN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEgyNjRSYXdTUFMgKnNwczsKKyAgICBpbnQgZXJyOworCisgICAgc3BzID0gaDI2NC0+YWN0aXZlX3NwczsKKyAgICBpZiAoIXNwcykgeworICAgICAgICAvLyBJZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBwb3NzaWJsZSBTUFMgYnV0IGl0IGlzIG5vdCB5ZXQgYWN0aXZlCisgICAgICAgIC8vIHRoZW4ganVzdCBhc3N1bWUgdGhhdCBpdCBzaG91bGQgYmUgdGhlIGFjdGl2ZSBvbmUuCisgICAgICAgIGludCBpLCBrID0gLTE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBIMjY0X01BWF9TUFNfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGgyNjQtPnNwc1tpXSkgeworICAgICAgICAgICAgICAgIGlmIChrID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgayA9IC0xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgayA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGsgPj0gMCkKKyAgICAgICAgICAgIHNwcyA9IGgyNjQtPnNwc1trXTsKKyAgICB9CisgICAgaWYgKCFzcHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vIGFjdGl2ZSBTUFMgZm9yIHBpY190aW1pbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHNwcy0+dnVpLm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgfHwKKyAgICAgICAgc3BzLT52dWkudmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgeworICAgICAgICBjb25zdCBIMjY0UmF3SFJEICpocmQ7CisKKyAgICAgICAgaWYgKHNwcy0+dnVpLm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgICAgICBocmQgPSAmc3BzLT52dWkubmFsX2hyZF9wYXJhbWV0ZXJzOworICAgICAgICBlbHNlIGlmIChzcHMtPnZ1aS52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQorICAgICAgICAgICAgaHJkID0gJnNwcy0+dnVpLnZjbF9ocmRfcGFyYW1ldGVyczsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk5vIEhSRCBwYXJhbWV0ZXJzIGZvciBwaWNfdGltaW5nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIHUoaHJkLT5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICsgMSwgY3BiX3JlbW92YWxfZGVsYXksCisgICAgICAgICAgMCwgTUFYX1VJTlRfQklUUyhocmQtPmNwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEgKyAxKSk7CisgICAgICAgIHUoaHJkLT5kcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKyAxLCBkcGJfb3V0cHV0X2RlbGF5LAorICAgICAgICAgIDAsIE1BWF9VSU5UX0JJVFMoaHJkLT5kcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgKyAxKSk7CisgICAgfQorCisgICAgaWYgKHNwcy0+dnVpLnBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbnVtX2Nsb2NrX3RzWzldID0geworICAgICAgICAgICAgMSwgMSwgMSwgMiwgMiwgMywgMywgMiwgMworICAgICAgICB9OworICAgICAgICBpbnQgaTsKKworICAgICAgICB1KDQsIHBpY19zdHJ1Y3QsIDAsIDgpOworICAgICAgICBpZiAoY3VycmVudC0+cGljX3N0cnVjdCA+IDgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2Nsb2NrX3RzW2N1cnJlbnQtPnBpY19zdHJ1Y3RdOyBpKyspIHsKKyAgICAgICAgICAgIGZsYWcoY2xvY2tfdGltZXN0YW1wX2ZsYWdbaV0pOworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmNsb2NrX3RpbWVzdGFtcF9mbGFnW2ldKQorICAgICAgICAgICAgICAgIENIRUNLKEZVTkMoc2VpX3BpY190aW1lc3RhbXApKGN0eCwgcncsICZjdXJyZW50LT50aW1lc3RhbXBbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoc2VpX3VzZXJfZGF0YV9yZWdpc3RlcmVkKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTRUlVc2VyRGF0YVJlZ2lzdGVyZWQgKmN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcGF5bG9hZF9zaXplKQoreworICAgIGludCBlcnIsIGksIGo7CisKKyAgICB1KDgsIGl0dV90X3QzNV9jb3VudHJ5X2NvZGUsIDB4MDAsIDB4ZmYpOworICAgIGlmIChjdXJyZW50LT5pdHVfdF90MzVfY291bnRyeV9jb2RlICE9IDB4ZmYpCisgICAgICAgIGkgPSAxOworICAgIGVsc2UgeworICAgICAgICB1KDgsIGl0dV90X3QzNV9jb3VudHJ5X2NvZGVfZXh0ZW5zaW9uX2J5dGUsIDB4MDAsIDB4ZmYpOworICAgICAgICBpID0gMjsKKyAgICB9CisKKyNpZmRlZiBSRUFECisgICAgaWYgKCpwYXlsb2FkX3NpemUgPCBpKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIFNFSSB1c2VyIGRhdGEgcmVnaXN0ZXJlZCBwYXlsb2FkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBjdXJyZW50LT5kYXRhX2xlbmd0aCA9ICpwYXlsb2FkX3NpemUgLSBpOworI2Vsc2UKKyAgICAqcGF5bG9hZF9zaXplID0gaSArIGN1cnJlbnQtPmRhdGFfbGVuZ3RoOworI2VuZGlmCisKKyAgICBhbGxvY2F0ZShjdXJyZW50LT5kYXRhLCBjdXJyZW50LT5kYXRhX2xlbmd0aCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGZvciAoaiA9IDA7IGogPCBjdXJyZW50LT5kYXRhX2xlbmd0aDsgaisrKQorICAgICAgICB4dSg4LCBpdHVfdF90MzVfcGF5bG9hZF9ieXRlLCBjdXJyZW50LT5kYXRhW2pdLCAweDAwLCAweGZmKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoc2VpX3VzZXJfZGF0YV91bnJlZ2lzdGVyZWQpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UmF3U0VJVXNlckRhdGFVbnJlZ2lzdGVyZWQgKmN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwYXlsb2FkX3NpemUpCit7CisgICAgaW50IGVyciwgaTsKKworI2lmZGVmIFJFQUQKKyAgICBpZiAoKnBheWxvYWRfc2l6ZSA8IDE2KSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIFNFSSB1c2VyIGRhdGEgdW5yZWdpc3RlcmVkIHBheWxvYWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGN1cnJlbnQtPmRhdGFfbGVuZ3RoID0gKnBheWxvYWRfc2l6ZSAtIDE2OworI2Vsc2UKKyAgICAqcGF5bG9hZF9zaXplID0gMTYgKyBjdXJyZW50LT5kYXRhX2xlbmd0aDsKKyNlbmRpZgorCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgeHUoOCwgdXVpZF9pc29faWVjXzExNTc4LAorICAgICAgICAgICBjdXJyZW50LT51dWlkX2lzb19pZWNfMTE1NzhbaV0sIDB4MDAsIDB4ZmYpOworICAgIH0KKworICAgIGFsbG9jYXRlKGN1cnJlbnQtPmRhdGEsIGN1cnJlbnQtPmRhdGFfbGVuZ3RoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5kYXRhX2xlbmd0aDsgaSsrKQorICAgICAgICB4dSg4LCB1c2VyX2RhdGFfcGF5bG9hZF9ieXRlLCBjdXJyZW50LT5kYXRhW2ldLCAweDAwLCAweGZmKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoc2VpX3JlY292ZXJ5X3BvaW50KShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTRUlSZWNvdmVyeVBvaW50ICpjdXJyZW50KQoreworICAgIGludCBlcnI7CisKKyAgICB1ZShyZWNvdmVyeV9mcmFtZV9jbnQsIDAsIDY1NTM1KTsKKyAgICBmbGFnKGV4YWN0X21hdGNoX2ZsYWcpOworICAgIGZsYWcoYnJva2VuX2xpbmtfZmxhZyk7CisgICAgdSgyLCBjaGFuZ2luZ19zbGljZV9ncm91cF9pZGMsIDAsIDIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzZWlfZGlzcGxheV9vcmllbnRhdGlvbikoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTRUlEaXNwbGF5T3JpZW50YXRpb24gKmN1cnJlbnQpCit7CisgICAgaW50IGVycjsKKworICAgIGZsYWcoZGlzcGxheV9vcmllbnRhdGlvbl9jYW5jZWxfZmxhZyk7CisgICAgaWYgKCFjdXJyZW50LT5kaXNwbGF5X29yaWVudGF0aW9uX2NhbmNlbF9mbGFnKSB7CisgICAgICAgIGZsYWcoaG9yX2ZsaXApOworICAgICAgICBmbGFnKHZlcl9mbGlwKTsKKyAgICAgICAgdSgxNiwgYW50aWNsb2Nrd2lzZV9yb3RhdGlvbiwgMCwgNjU1MzUpOworICAgICAgICB1ZShkaXNwbGF5X29yaWVudGF0aW9uX3JlcGV0aXRpb25fcGVyaW9kLCAwLCAxNjM4NCk7CisgICAgICAgIGZsYWcoZGlzcGxheV9vcmllbnRhdGlvbl9leHRlbnNpb25fZmxhZyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzZWlfcGF5bG9hZCkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTRUlQYXlsb2FkICpjdXJyZW50KQoreworICAgIGludCBlcnIsIGk7CisgICAgaW50IHN0YXJ0X3Bvc2l0aW9uLCBlbmRfcG9zaXRpb247CisKKyNpZmRlZiBSRUFECisgICAgc3RhcnRfcG9zaXRpb24gPSBnZXRfYml0c19jb3VudChydyk7CisjZWxzZQorICAgIHN0YXJ0X3Bvc2l0aW9uID0gcHV0X2JpdHNfY291bnQocncpOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKGN1cnJlbnQtPnBheWxvYWRfdHlwZSkgeworICAgIGNhc2UgSDI2NF9TRUlfVFlQRV9CVUZGRVJJTkdfUEVSSU9EOgorICAgICAgICBDSEVDSyhGVU5DKHNlaV9idWZmZXJpbmdfcGVyaW9kKQorICAgICAgICAgICAgICAoY3R4LCBydywgJmN1cnJlbnQtPnBheWxvYWQuYnVmZmVyaW5nX3BlcmlvZCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEgyNjRfU0VJX1RZUEVfUElDX1RJTUlORzoKKyAgICAgICAgQ0hFQ0soRlVOQyhzZWlfcGljX3RpbWluZykKKyAgICAgICAgICAgICAgKGN0eCwgcncsICZjdXJyZW50LT5wYXlsb2FkLnBpY190aW1pbmcpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIMjY0X1NFSV9UWVBFX0ZJTExFUl9QQVlMT0FEOgorICAgICAgICB7CisgICAgICAgICAgICBhdl91bnVzZWQgaW50IGZmX2J5dGUgPSAweGZmOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSAgPCBjdXJyZW50LT5wYXlsb2FkX3NpemU7IGkrKykKKyAgICAgICAgICAgICAgICB4dSg4LCBmZl9ieXRlLCBmZl9ieXRlLCAweGZmLCAweGZmKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEgyNjRfU0VJX1RZUEVfVVNFUl9EQVRBX1JFR0lTVEVSRUQ6CisgICAgICAgIENIRUNLKEZVTkMoc2VpX3VzZXJfZGF0YV9yZWdpc3RlcmVkKQorICAgICAgICAgICAgICAoY3R4LCBydywgJmN1cnJlbnQtPnBheWxvYWQudXNlcl9kYXRhX3JlZ2lzdGVyZWQsICZjdXJyZW50LT5wYXlsb2FkX3NpemUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIMjY0X1NFSV9UWVBFX1VTRVJfREFUQV9VTlJFR0lTVEVSRUQ6CisgICAgICAgIENIRUNLKEZVTkMoc2VpX3VzZXJfZGF0YV91bnJlZ2lzdGVyZWQpCisgICAgICAgICAgICAgIChjdHgsIHJ3LCAmY3VycmVudC0+cGF5bG9hZC51c2VyX2RhdGFfdW5yZWdpc3RlcmVkLCAmY3VycmVudC0+cGF5bG9hZF9zaXplKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSDI2NF9TRUlfVFlQRV9SRUNPVkVSWV9QT0lOVDoKKyAgICAgICAgQ0hFQ0soRlVOQyhzZWlfcmVjb3ZlcnlfcG9pbnQpCisgICAgICAgICAgICAgIChjdHgsIHJ3LCAmY3VycmVudC0+cGF5bG9hZC5yZWNvdmVyeV9wb2ludCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEgyNjRfU0VJX1RZUEVfRElTUExBWV9PUklFTlRBVElPTjoKKyAgICAgICAgQ0hFQ0soRlVOQyhzZWlfZGlzcGxheV9vcmllbnRhdGlvbikKKyAgICAgICAgICAgICAgKGN0eCwgcncsICZjdXJyZW50LT5wYXlsb2FkLmRpc3BsYXlfb3JpZW50YXRpb24pKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgYWxsb2NhdGUoY3VycmVudC0+cGF5bG9hZC5vdGhlci5kYXRhLCBjdXJyZW50LT5wYXlsb2FkX3NpemUpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnQtPnBheWxvYWRfc2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgIHh1KDgsIHBheWxvYWRfYnl0ZSwgY3VycmVudC0+cGF5bG9hZC5vdGhlci5kYXRhW2ldLCAwLCAyNTUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ5dGVfYWxpZ25tZW50KHJ3KSkgeworICAgICAgICBhdl91bnVzZWQgaW50IG9uZSA9IDEsIHplcm8gPSAwOworICAgICAgICB4dSgxLCBiaXRfZXF1YWxfdG9fb25lLCBvbmUsIDEsIDEpOworICAgICAgICB3aGlsZSAoYnl0ZV9hbGlnbm1lbnQocncpKQorICAgICAgICAgICAgeHUoMSwgYml0X2VxdWFsX3RvX3plcm8sIHplcm8sIDAsIDApOworICAgIH0KKworI2lmZGVmIFJFQUQKKyAgICBlbmRfcG9zaXRpb24gPSBnZXRfYml0c19jb3VudChydyk7CisgICAgaWYgKGVuZF9wb3NpdGlvbiA8IHN0YXJ0X3Bvc2l0aW9uICsgOCAqIGN1cnJlbnQtPnBheWxvYWRfc2l6ZSkgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgU0VJIHBheWxvYWQgbGVuZ3RoOiAiCisgICAgICAgICAgICAgICAiaGVhZGVyICUiUFJJdTMyIiBiaXRzLCBhY3R1YWxseSAlZCBiaXRzLlxuIiwKKyAgICAgICAgICAgICAgIDggKiBjdXJyZW50LT5wYXlsb2FkX3NpemUsCisgICAgICAgICAgICAgICBlbmRfcG9zaXRpb24gLSBzdGFydF9wb3NpdGlvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyNlbHNlCisgICAgZW5kX3Bvc2l0aW9uID0gcHV0X2JpdHNfY291bnQocncpOworICAgIGN1cnJlbnQtPnBheWxvYWRfc2l6ZSA9IChlbmRfcG9zaXRpb24gLSBzdGFydF9wb3NpdGlvbikgLyA4OworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKHNlaSkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICBIMjY0UmF3U0VJICpjdXJyZW50KQoreworICAgIGludCBlcnIsIGs7CisKKyAgICBIRUFERVIoIlN1cHBsZW1lbnRhbCBFbmhhbmNlbWVudCBJbmZvcm1hdGlvbiIpOworCisgICAgQ0hFQ0soRlVOQyhuYWxfdW5pdF9oZWFkZXIpKGN0eCwgcncsICZjdXJyZW50LT5uYWxfdW5pdF9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgSDI2NF9OQUxfU0VJKSk7CisKKyNpZmRlZiBSRUFECisgICAgZm9yIChrID0gMDsgayA8IEgyNjRfTUFYX1NFSV9QQVlMT0FEUzsgaysrKSB7CisgICAgICAgIHVpbnQzMl90IHBheWxvYWRfdHlwZSA9IDA7CisgICAgICAgIHVpbnQzMl90IHBheWxvYWRfc2l6ZSA9IDA7CisgICAgICAgIHVpbnQzMl90IHRtcDsKKworICAgICAgICB3aGlsZSAoc2hvd19iaXRzKHJ3LCA4KSA9PSAweGZmKSB7CisgICAgICAgICAgICB4dSg4LCBmZl9ieXRlLCB0bXAsIDB4ZmYsIDB4ZmYpOworICAgICAgICAgICAgcGF5bG9hZF90eXBlICs9IDI1NTsKKyAgICAgICAgfQorICAgICAgICB4dSg4LCBsYXN0X3BheWxvYWRfdHlwZV9ieXRlLCB0bXAsIDAsIDI1NCk7CisgICAgICAgIHBheWxvYWRfdHlwZSArPSB0bXA7CisKKyAgICAgICAgd2hpbGUgKHNob3dfYml0cyhydywgOCkgPT0gMHhmZikgeworICAgICAgICAgICAgeHUoOCwgZmZfYnl0ZSwgdG1wLCAweGZmLCAweGZmKTsKKyAgICAgICAgICAgIHBheWxvYWRfc2l6ZSArPSAyNTU7CisgICAgICAgIH0KKyAgICAgICAgeHUoOCwgbGFzdF9wYXlsb2FkX3NpemVfYnl0ZSwgdG1wLCAwLCAyNTQpOworICAgICAgICBwYXlsb2FkX3NpemUgKz0gdG1wOworCisgICAgICAgIGN1cnJlbnQtPnBheWxvYWRba10ucGF5bG9hZF90eXBlID0gcGF5bG9hZF90eXBlOworICAgICAgICBjdXJyZW50LT5wYXlsb2FkW2tdLnBheWxvYWRfc2l6ZSA9IHBheWxvYWRfc2l6ZTsKKworICAgICAgICBDSEVDSyhGVU5DKHNlaV9wYXlsb2FkKShjdHgsIHJ3LCAmY3VycmVudC0+cGF5bG9hZFtrXSkpOworCisgICAgICAgIGlmICghY2JzX2gyNjQ1X3JlYWRfbW9yZV9yYnNwX2RhdGEocncpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChrID49IEgyNjRfTUFYX1NFSV9QQVlMT0FEUykgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBwYXlsb2FkcyBpbiAiCisgICAgICAgICAgICAgICAiU0VJIG1lc3NhZ2U6IGZvdW5kICVkLlxuIiwgayk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBjdXJyZW50LT5wYXlsb2FkX2NvdW50ID0gayArIDE7CisjZWxzZQorICAgIGZvciAoayA9IDA7IGsgPCBjdXJyZW50LT5wYXlsb2FkX2NvdW50OyBrKyspIHsKKyAgICAgICAgUHV0Qml0Q29udGV4dCBzdGFydF9zdGF0ZTsKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpbnQgbmVlZF9zaXplLCBpOworCisgICAgICAgIC8vIFNvbWV3aGF0IGNsdW1zeTogd2Ugd3JpdGUgdGhlIHBheWxvYWQgdHdpY2Ugd2hlbgorICAgICAgICAvLyB3ZSBkb24ndCBrbm93IHRoZSBzaXplIGluIGFkdmFuY2UuICBUaGlzIHdpbGwgbWVzcworICAgICAgICAvLyB3aXRoIHRyYWNlIG91dHB1dCwgYnV0IGlzIG90aGVyd2lzZSBoYXJtbGVzcy4KKyAgICAgICAgc3RhcnRfc3RhdGUgPSAqcnc7CisgICAgICAgIG5lZWRfc2l6ZSA9ICFjdXJyZW50LT5wYXlsb2FkW2tdLnBheWxvYWRfc2l6ZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEgKyBuZWVkX3NpemU7IGkrKykgeworICAgICAgICAgICAgKnJ3ID0gc3RhcnRfc3RhdGU7CisKKyAgICAgICAgICAgIHRtcCA9IGN1cnJlbnQtPnBheWxvYWRba10ucGF5bG9hZF90eXBlOworICAgICAgICAgICAgd2hpbGUgKHRtcCA+PSAyNTUpIHsKKyAgICAgICAgICAgICAgICB4dSg4LCBmZl9ieXRlLCAweGZmLCAweGZmLCAweGZmKTsKKyAgICAgICAgICAgICAgICB0bXAgLT0gMjU1OworICAgICAgICAgICAgfQorICAgICAgICAgICAgeHUoOCwgbGFzdF9wYXlsb2FkX3R5cGVfYnl0ZSwgdG1wLCAwLCAyNTQpOworCisgICAgICAgICAgICB0bXAgPSBjdXJyZW50LT5wYXlsb2FkW2tdLnBheWxvYWRfc2l6ZTsKKyAgICAgICAgICAgIHdoaWxlICh0bXAgPj0gMjU1KSB7CisgICAgICAgICAgICAgICAgeHUoOCwgZmZfYnl0ZSwgMHhmZiwgMHhmZiwgMHhmZik7CisgICAgICAgICAgICAgICAgdG1wIC09IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHh1KDgsIGxhc3RfcGF5bG9hZF9zaXplX2J5dGUsIHRtcCwgMCwgMjU0KTsKKworICAgICAgICAgICAgQ0hFQ0soRlVOQyhzZWlfcGF5bG9hZCkoY3R4LCBydywgJmN1cnJlbnQtPnBheWxvYWRba10pKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgQ0hFQ0soRlVOQyhyYnNwX3RyYWlsaW5nX2JpdHMpKGN0eCwgcncpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoYXVkKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdBVUQgKmN1cnJlbnQpCit7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiQWNjZXNzIFVuaXQgRGVsaW1pdGVyIik7CisKKyAgICBDSEVDSyhGVU5DKG5hbF91bml0X2hlYWRlcikoY3R4LCBydywgJmN1cnJlbnQtPm5hbF91bml0X2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBIMjY0X05BTF9BVUQpKTsKKworICAgIHUoMywgcHJpbWFyeV9waWNfdHlwZSwgMCwgNyk7CisKKyAgICBDSEVDSyhGVU5DKHJic3BfdHJhaWxpbmdfYml0cykoY3R4LCBydykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhyZWZfcGljX2xpc3RfbW9kaWZpY2F0aW9uKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UmF3U2xpY2VIZWFkZXIgKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1IMjY0Q29udGV4dCAqaDI2NCA9IGN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEgyNjRSYXdTUFMgKnNwcyA9IGgyNjQtPmFjdGl2ZV9zcHM7CisgICAgaW50IGVyciwgaSwgbW9wbjsKKworICAgIGlmIChjdXJyZW50LT5zbGljZV90eXBlICUgNSAhPSAyICYmCisgICAgICAgIGN1cnJlbnQtPnNsaWNlX3R5cGUgJSA1ICE9IDQpIHsKKyAgICAgICAgZmxhZyhyZWZfcGljX2xpc3RfbW9kaWZpY2F0aW9uX2ZsYWdfbDApOworICAgICAgICBpZiAoY3VycmVudC0+cmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2wwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUlBMTV9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgeHVlKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJwbG1fbDBbaV0ubW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYywgMCwgMyk7CisKKyAgICAgICAgICAgICAgICBtb3BuID0gY3VycmVudC0+cnBsbV9sMFtpXS5tb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjOworICAgICAgICAgICAgICAgIGlmIChtb3BuID09IDMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKG1vcG4gPT0gMCB8fCBtb3BuID09IDEpCisgICAgICAgICAgICAgICAgICAgIHh1ZShhYnNfZGlmZl9waWNfbnVtX21pbnVzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJwbG1fbDBbaV0uYWJzX2RpZmZfcGljX251bV9taW51czEsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAoMSArIGN1cnJlbnQtPmZpZWxkX3BpY19mbGFnKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAoc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCkpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtb3BuID09IDIpCisgICAgICAgICAgICAgICAgICAgIHh1ZShsb25nX3Rlcm1fcGljX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJwbG1fbDBbaV0ubG9uZ190ZXJtX3BpY19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBzcHMtPm1heF9udW1fcmVmX2ZyYW1lcyAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQtPnNsaWNlX3R5cGUgJSA1ID09IDEpIHsKKyAgICAgICAgZmxhZyhyZWZfcGljX2xpc3RfbW9kaWZpY2F0aW9uX2ZsYWdfbDEpOworICAgICAgICBpZiAoY3VycmVudC0+cmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2wxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUlBMTV9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgeHVlKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMsCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJwbG1fbDFbaV0ubW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYywgMCwgMyk7CisKKyAgICAgICAgICAgICAgICBtb3BuID0gY3VycmVudC0+cnBsbV9sMVtpXS5tb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjOworICAgICAgICAgICAgICAgIGlmIChtb3BuID09IDMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKG1vcG4gPT0gMCB8fCBtb3BuID09IDEpCisgICAgICAgICAgICAgICAgICAgIHh1ZShhYnNfZGlmZl9waWNfbnVtX21pbnVzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJwbG1fbDFbaV0uYWJzX2RpZmZfcGljX251bV9taW51czEsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAoMSArIGN1cnJlbnQtPmZpZWxkX3BpY19mbGFnKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAoc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNCkpKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtb3BuID09IDIpCisgICAgICAgICAgICAgICAgICAgIHh1ZShsb25nX3Rlcm1fcGljX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnJwbG1fbDFbaV0ubG9uZ190ZXJtX3BpY19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBzcHMtPm1heF9udW1fcmVmX2ZyYW1lcyAtIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhwcmVkX3dlaWdodF90YWJsZSkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTbGljZUhlYWRlciAqY3VycmVudCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbUgyNjRDb250ZXh0ICpoMjY0ID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgSDI2NFJhd1NQUyAqc3BzID0gaDI2NC0+YWN0aXZlX3NwczsKKyAgICBpbnQgY2hyb21hOworICAgIGludCBlcnIsIGksIGo7CisKKyAgICB1ZShsdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLCAwLCA3KTsKKworICAgIGNocm9tYSA9ICFzcHMtPnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnICYmIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gMDsKKyAgICBpZiAoY2hyb21hKQorICAgICAgICB1ZShjaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sIDAsIDcpOworCisgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyZW50LT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOyBpKyspIHsKKyAgICAgICAgZmxhZyhsdW1hX3dlaWdodF9sMF9mbGFnW2ldKTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPmx1bWFfd2VpZ2h0X2wwX2ZsYWdbaV0pIHsKKyAgICAgICAgICAgIHNlKGx1bWFfd2VpZ2h0X2wwW2ldLCAtMTI4LCArMTI3KTsKKyAgICAgICAgICAgIHNlKGx1bWFfb2Zmc2V0X2wwW2ldLCAtMTI4LCArMTI3KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hyb21hKSB7CisgICAgICAgICAgICBmbGFnKGNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSk7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+Y2hyb21hX3dlaWdodF9sMF9mbGFnW2ldKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICBzZShjaHJvbWFfd2VpZ2h0X2wwW2ldW2pdLCAtMTI4LCArMTI3KTsKKyAgICAgICAgICAgICAgICAgICAgc2UoY2hyb21hX29mZnNldF9sMFtpXVtqXSwgLTEyOCwgKzEyNyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQtPnNsaWNlX3R5cGUgJSA1ID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyZW50LT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOyBpKyspIHsKKyAgICAgICAgICAgIGZsYWcobHVtYV93ZWlnaHRfbDFfZmxhZ1tpXSk7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+bHVtYV93ZWlnaHRfbDFfZmxhZ1tpXSkgeworICAgICAgICAgICAgICAgIHNlKGx1bWFfd2VpZ2h0X2wxW2ldLCAtMTI4LCArMTI3KTsKKyAgICAgICAgICAgICAgICBzZShsdW1hX29mZnNldF9sMVtpXSwgLTEyOCwgKzEyNyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hyb21hKSB7CisgICAgICAgICAgICAgICAgZmxhZyhjaHJvbWFfd2VpZ2h0X2wxX2ZsYWdbaV0pOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5jaHJvbWFfd2VpZ2h0X2wxX2ZsYWdbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2UoY2hyb21hX3dlaWdodF9sMVtpXVtqXSwgLTEyOCwgKzEyNyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZShjaHJvbWFfb2Zmc2V0X2wxW2ldW2pdLCAtMTI4LCArMTI3KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoZGVjX3JlZl9waWNfbWFya2luZykoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFJhd1NsaWNlSGVhZGVyICpjdXJyZW50LCBpbnQgaWRyX3BpY19mbGFnKQoreworICAgIENvZGVkQml0c3RyZWFtSDI2NENvbnRleHQgKmgyNjQgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBIMjY0UmF3U1BTICpzcHMgPSBoMjY0LT5hY3RpdmVfc3BzOworICAgIGludCBlcnIsIGk7CisgICAgdWludDMyX3QgbW1jbzsKKworICAgIGlmIChpZHJfcGljX2ZsYWcpIHsKKyAgICAgICAgZmxhZyhub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnKTsKKyAgICAgICAgZmxhZyhsb25nX3Rlcm1fcmVmZXJlbmNlX2ZsYWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsYWcoYWRhcHRpdmVfcmVmX3BpY19tYXJraW5nX21vZGVfZmxhZyk7CisgICAgICAgIGlmIChjdXJyZW50LT5hZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfTU1DT19DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICAgICAgeHVlKG1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5tbWNvW2ldLm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAwLCA2KTsKKworICAgICAgICAgICAgICAgIG1tY28gPSBjdXJyZW50LT5tbWNvW2ldLm1lbW9yeV9tYW5hZ2VtZW50X2NvbnRyb2xfb3BlcmF0aW9uOworICAgICAgICAgICAgICAgIGlmIChtbWNvID09IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKG1tY28gPT0gMSB8fCBtbWNvID09IDMpCisgICAgICAgICAgICAgICAgICAgIHh1ZShkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPm1tY29baV0uZGlmZmVyZW5jZV9vZl9waWNfbnVtc19taW51czEsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBJTlQzMl9NQVgpOworICAgICAgICAgICAgICAgIGlmIChtbWNvID09IDIpCisgICAgICAgICAgICAgICAgICAgIHh1ZShsb25nX3Rlcm1fcGljX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPm1tY29baV0ubG9uZ190ZXJtX3BpY19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBzcHMtPm1heF9udW1fcmVmX2ZyYW1lcyAtIDEpOworICAgICAgICAgICAgICAgIGlmIChtbWNvID09IDMgfHwgbW1jbyA9PSA2KQorICAgICAgICAgICAgICAgICAgICB4dWUobG9uZ190ZXJtX2ZyYW1lX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPm1tY29baV0ubG9uZ190ZXJtX2ZyYW1lX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNwcy0+bWF4X251bV9yZWZfZnJhbWVzIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKG1tY28gPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgeHVlKG1heF9sb25nX3Rlcm1fZnJhbWVfaWR4X3BsdXMxLAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC0+bW1jb1tpXS5tYXhfbG9uZ190ZXJtX2ZyYW1lX2lkeF9wbHVzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHNwcy0+bWF4X251bV9yZWZfZnJhbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpID09IEgyNjRfTUFYX01NQ09fQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSAiCisgICAgICAgICAgICAgICAgICAgICAgICJtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbnMuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoc2xpY2VfaGVhZGVyKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdTbGljZUhlYWRlciAqY3VycmVudCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbUgyNjRDb250ZXh0ICpoMjY0ID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgSDI2NFJhd1NQUyAqc3BzOworICAgIGNvbnN0IEgyNjRSYXdQUFMgKnBwczsKKyAgICBpbnQgZXJyOworICAgIGludCBpZHJfcGljX2ZsYWc7CisgICAgaW50IHNsaWNlX3R5cGVfaSwgc2xpY2VfdHlwZV9wLCBzbGljZV90eXBlX2I7CisgICAgaW50IHNsaWNlX3R5cGVfc2ksIHNsaWNlX3R5cGVfc3A7CisKKyAgICBIRUFERVIoIlNsaWNlIEhlYWRlciIpOworCisgICAgQ0hFQ0soRlVOQyhuYWxfdW5pdF9oZWFkZXIpKGN0eCwgcncsICZjdXJyZW50LT5uYWxfdW5pdF9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgSDI2NF9OQUxfU0xJQ0UgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA8PCBIMjY0X05BTF9JRFJfU0xJQ0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8IEgyNjRfTkFMX0FVWElMSUFSWV9TTElDRSkpOworCisgICAgaWYgKGN1cnJlbnQtPm5hbF91bml0X2hlYWRlci5uYWxfdW5pdF90eXBlID09IEgyNjRfTkFMX0FVWElMSUFSWV9TTElDRSkgeworICAgICAgICBpZiAoIWgyNjQtPmxhc3Rfc2xpY2VfbmFsX3VuaXRfdHlwZSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiQXV4aWxpYXJ5IHNsaWNlICIKKyAgICAgICAgICAgICAgICAgICAiaXMgbm90IGRlY29kYWJsZSB3aXRob3V0IHRoZSBtYWluIHBpY3R1cmUgIgorICAgICAgICAgICAgICAgICAgICJpbiB0aGUgc2FtZSBhY2Nlc3MgdW5pdC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBoMjY0LT5sYXN0X3NsaWNlX25hbF91bml0X3R5cGUgPQorICAgICAgICAgICAgY3VycmVudC0+bmFsX3VuaXRfaGVhZGVyLm5hbF91bml0X3R5cGU7CisgICAgfQorICAgIGlkcl9waWNfZmxhZyA9IGgyNjQtPmxhc3Rfc2xpY2VfbmFsX3VuaXRfdHlwZSA9PSBIMjY0X05BTF9JRFJfU0xJQ0U7CisKKyAgICB1ZShmaXJzdF9tYl9pbl9zbGljZSwgMCwgSDI2NF9NQVhfTUJfUElDX1NJWkUgLSAxKTsKKyAgICB1ZShzbGljZV90eXBlLCAwLCA5KTsKKworICAgIHNsaWNlX3R5cGVfaSAgPSBjdXJyZW50LT5zbGljZV90eXBlICUgNSA9PSAyOworICAgIHNsaWNlX3R5cGVfcCAgPSBjdXJyZW50LT5zbGljZV90eXBlICUgNSA9PSAwOworICAgIHNsaWNlX3R5cGVfYiAgPSBjdXJyZW50LT5zbGljZV90eXBlICUgNSA9PSAxOworICAgIHNsaWNlX3R5cGVfc2kgPSBjdXJyZW50LT5zbGljZV90eXBlICUgNSA9PSA0OworICAgIHNsaWNlX3R5cGVfc3AgPSBjdXJyZW50LT5zbGljZV90eXBlICUgNSA9PSAzOworCisgICAgaWYgKGlkcl9waWNfZmxhZyAmJiAhKHNsaWNlX3R5cGVfaSB8fCBzbGljZV90eXBlX3NpKSkgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNsaWNlIHR5cGUgJWQgIgorICAgICAgICAgICAgICAgImZvciBJRFIgcGljdHVyZS5cbiIsIGN1cnJlbnQtPnNsaWNlX3R5cGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB1ZShwaWNfcGFyYW1ldGVyX3NldF9pZCwgMCwgMjU1KTsKKworICAgIHBwcyA9IGgyNjQtPnBwc1tjdXJyZW50LT5waWNfcGFyYW1ldGVyX3NldF9pZF07CisgICAgaWYgKCFwcHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiUFBTIGlkICVkIG5vdCBhdmFpbGFibGUuXG4iLAorICAgICAgICAgICAgICAgY3VycmVudC0+cGljX3BhcmFtZXRlcl9zZXRfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaDI2NC0+YWN0aXZlX3BwcyA9IHBwczsKKworICAgIHNwcyA9IGgyNjQtPnNwc1twcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkXTsKKyAgICBpZiAoIXNwcykgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJTUFMgaWQgJWQgbm90IGF2YWlsYWJsZS5cbiIsCisgICAgICAgICAgICAgICBwcHMtPnNlcV9wYXJhbWV0ZXJfc2V0X2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGgyNjQtPmFjdGl2ZV9zcHMgPSBzcHM7CisKKyAgICBpZiAoc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZykKKyAgICAgICAgdSgyLCBjb2xvdXJfcGxhbmVfaWQsIDAsIDIpOworCisgICAgdShzcHMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgKyA0LCBmcmFtZV9udW0sCisgICAgICAwLCBNQVhfVUlOVF9CSVRTKHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCArIDQpKTsKKworICAgIGlmICghc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKSB7CisgICAgICAgIGZsYWcoZmllbGRfcGljX2ZsYWcpOworICAgICAgICBpZiAoY3VycmVudC0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgICAgICBmbGFnKGJvdHRvbV9maWVsZF9mbGFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mZXIoYm90dG9tX2ZpZWxkX2ZsYWcsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZmVyKGZpZWxkX3BpY19mbGFnLCAgICAwKTsKKyAgICAgICAgaW5mZXIoYm90dG9tX2ZpZWxkX2ZsYWcsIDApOworICAgIH0KKworICAgIGlmIChpZHJfcGljX2ZsYWcpCisgICAgICAgIHVlKGlkcl9waWNfaWQsIDAsIDY1NTM1KTsKKworICAgIGlmIChzcHMtPnBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKSB7CisgICAgICAgIHUoc3BzLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0LCBwaWNfb3JkZXJfY250X2xzYiwKKyAgICAgICAgICAwLCBNQVhfVUlOVF9CSVRTKHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCkpOworICAgICAgICBpZiAocHBzLT5ib3R0b21fZmllbGRfcGljX29yZGVyX2luX2ZyYW1lX3ByZXNlbnRfZmxhZyAmJgorICAgICAgICAgICAgIWN1cnJlbnQtPmZpZWxkX3BpY19mbGFnKQorICAgICAgICAgICAgc2UoZGVsdGFfcGljX29yZGVyX2NudF9ib3R0b20sIElOVDMyX01JTiArIDEsIElOVDMyX01BWCk7CisKKyAgICB9IGVsc2UgaWYgKHNwcy0+cGljX29yZGVyX2NudF90eXBlID09IDEpIHsKKyAgICAgICAgaWYgKCFzcHMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSB7CisgICAgICAgICAgICBzZShkZWx0YV9waWNfb3JkZXJfY250WzBdLCBJTlQzMl9NSU4gKyAxLCBJTlQzMl9NQVgpOworICAgICAgICAgICAgaWYgKHBwcy0+Ym90dG9tX2ZpZWxkX3BpY19vcmRlcl9pbl9mcmFtZV9wcmVzZW50X2ZsYWcgJiYKKyAgICAgICAgICAgICAgICAhY3VycmVudC0+ZmllbGRfcGljX2ZsYWcpCisgICAgICAgICAgICAgICAgc2UoZGVsdGFfcGljX29yZGVyX2NudFsxXSwgSU5UMzJfTUlOICsgMSwgSU5UMzJfTUFYKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmZlcihkZWx0YV9waWNfb3JkZXJfY250WzFdLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZmVyKGRlbHRhX3BpY19vcmRlcl9jbnRbMF0sIDApOworICAgICAgICAgICAgaW5mZXIoZGVsdGFfcGljX29yZGVyX2NudFsxXSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHBzLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcpCisgICAgICAgIHVlKHJlZHVuZGFudF9waWNfY250LCAwLCAxMjcpOworCisgICAgaWYgKHNsaWNlX3R5cGVfYikKKyAgICAgICAgZmxhZyhkaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcpOworCisgICAgaWYgKHNsaWNlX3R5cGVfcCB8fCBzbGljZV90eXBlX3NwIHx8IHNsaWNlX3R5cGVfYikgeworICAgICAgICBmbGFnKG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnKTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPm51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnKSB7CisgICAgICAgICAgICB1ZShudW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxLCAwLCAzMSk7CisgICAgICAgICAgICBpZiAoc2xpY2VfdHlwZV9iKQorICAgICAgICAgICAgICAgIHVlKG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEsIDAsIDMxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZmVyKG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEsCisgICAgICAgICAgICAgICAgICBwcHMtPm51bV9yZWZfaWR4X2wwX2RlZmF1bHRfYWN0aXZlX21pbnVzMSk7CisgICAgICAgICAgICBpbmZlcihudW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxLAorICAgICAgICAgICAgICAgICAgcHBzLT5udW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZV9taW51czEpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQtPm5hbF91bml0X2hlYWRlci5uYWxfdW5pdF90eXBlID09IDIwIHx8CisgICAgICAgIGN1cnJlbnQtPm5hbF91bml0X2hlYWRlci5uYWxfdW5pdF90eXBlID09IDIxKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIk1WQyAvIDNEQVZDIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLKEZVTkMocmVmX3BpY19saXN0X21vZGlmaWNhdGlvbikoY3R4LCBydywgY3VycmVudCkpOworICAgIH0KKworICAgIGlmICgocHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcgJiYgKHNsaWNlX3R5cGVfcCB8fCBzbGljZV90eXBlX3NwKSkgfHwKKyAgICAgICAgKHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyA9PSAxICYmIHNsaWNlX3R5cGVfYikpIHsKKyAgICAgICAgQ0hFQ0soRlVOQyhwcmVkX3dlaWdodF90YWJsZSkoY3R4LCBydywgY3VycmVudCkpOworICAgIH0KKworICAgIGlmIChjdXJyZW50LT5uYWxfdW5pdF9oZWFkZXIubmFsX3JlZl9pZGMgIT0gMCkgeworICAgICAgICBDSEVDSyhGVU5DKGRlY19yZWZfcGljX21hcmtpbmcpKGN0eCwgcncsIGN1cnJlbnQsIGlkcl9waWNfZmxhZykpOworICAgIH0KKworICAgIGlmIChwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAmJgorICAgICAgICAhc2xpY2VfdHlwZV9pICYmICFzbGljZV90eXBlX3NpKSB7CisgICAgICAgIHVlKGNhYmFjX2luaXRfaWRjLCAwLCAyKTsKKyAgICB9CisKKyAgICBzZShzbGljZV9xcF9kZWx0YSwgLSA1MSAtIDYgKiBzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCwKKyAgICAgICAgICAgICAgICAgICAgICAgKyA1MSArIDYgKiBzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCk7CisgICAgaWYgKHNsaWNlX3R5cGVfc3AgfHwgc2xpY2VfdHlwZV9zaSkgeworICAgICAgICBpZiAoc2xpY2VfdHlwZV9zcCkKKyAgICAgICAgICAgIGZsYWcoc3BfZm9yX3N3aXRjaF9mbGFnKTsKKyAgICAgICAgc2Uoc2xpY2VfcXNfZGVsdGEsIC01MSwgKzUxKTsKKyAgICB9CisKKyAgICBpZiAocHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZykgeworICAgICAgICB1ZShkaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYywgMCwgMik7CisgICAgICAgIGlmIChjdXJyZW50LT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYyAhPSAxKSB7CisgICAgICAgICAgICBzZShzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiwgLTYsICs2KTsKKyAgICAgICAgICAgIHNlKHNsaWNlX2JldGFfb2Zmc2V0X2RpdjIsICAgICAtNiwgKzYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mZXIoc2xpY2VfYWxwaGFfYzBfb2Zmc2V0X2RpdjIsIDApOworICAgICAgICAgICAgaW5mZXIoc2xpY2VfYmV0YV9vZmZzZXRfZGl2MiwgICAgIDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mZXIoZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMsIDApOworICAgICAgICBpbmZlcihzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiwgICAgMCk7CisgICAgICAgIGluZmVyKHNsaWNlX2JldGFfb2Zmc2V0X2RpdjIsICAgICAgICAwKTsKKyAgICB9CisKKyAgICBpZiAocHBzLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSA+IDAgJiYKKyAgICAgICAgcHBzLT5zbGljZV9ncm91cF9tYXBfdHlwZSA+PSAzICYmCisgICAgICAgIHBwcy0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgPD0gNSkgeworICAgICAgICB1bnNpZ25lZCBpbnQgcGljX3NpemUsIG1heCwgYml0czsKKworICAgICAgICBwaWNfc2l6ZSA9IChzcHMtPnBpY193aWR0aF9pbl9tYnNfbWludXMxICsgMSkgKgorICAgICAgICAgICAgICAgICAgIChzcHMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEpOworICAgICAgICBtYXggPSAocGljX3NpemUgKyBwcHMtPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSkgLworICAgICAgICAgICAgICAocHBzLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czEgKyAxKTsKKyAgICAgICAgYml0cyA9IGF2X2xvZzIoMiAqIG1heCAtIDEpOworCisgICAgICAgIHUoYml0cywgc2xpY2VfZ3JvdXBfY2hhbmdlX2N5Y2xlLCAwLCBtYXgpOworICAgIH0KKworICAgIGlmIChwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZykgeworICAgICAgICBhdl91bnVzZWQgaW50IG9uZSA9IDE7CisgICAgICAgIHdoaWxlIChieXRlX2FsaWdubWVudChydykpCisgICAgICAgICAgICB4dSgxLCBjYWJhY19hbGlnbm1lbnRfb25lX2JpdCwgb25lLCAxLCAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKGZpbGxlcikoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UmF3RmlsbGVyICpjdXJyZW50KQoreworICAgIGF2X3VudXNlZCBpbnQgZmZfYnl0ZSA9IDB4ZmY7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiRmlsbGVyIERhdGEiKTsKKworICAgIENIRUNLKEZVTkMobmFsX3VuaXRfaGVhZGVyKShjdHgsIHJ3LCAmY3VycmVudC0+bmFsX3VuaXRfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIDw8IEgyNjRfTkFMX0ZJTExFUl9EQVRBKSk7CisKKyNpZmRlZiBSRUFECisgICAgd2hpbGUgKHNob3dfYml0cyhydywgOCkgPT0gMHhmZikgeworICAgICAgICB4dSg4LCBmZl9ieXRlLCBmZl9ieXRlLCAweGZmLCAweGZmKTsKKyAgICAgICAgKytjdXJyZW50LT5maWxsZXJfc2l6ZTsKKyAgICB9CisjZWxzZQorICAgIHsKKyAgICAgICAgdWludDMyX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnQtPmZpbGxlcl9zaXplOyBpKyspCisgICAgICAgICAgICB4dSg4LCBmZl9ieXRlLCBmZl9ieXRlLCAweGZmLCAweGZmKTsKKyAgICB9CisjZW5kaWYKKworICAgIENIRUNLKEZVTkMocmJzcF90cmFpbGluZ19iaXRzKShjdHgsIHJ3KSk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JzX2gyNjUuaCBiL2xpYmF2Y29kZWMvY2JzX2gyNjUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2U3MWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9jYnNfaDI2NS5oCkBAIC0wLDAgKzEsNTM5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19DQlNfSDI2NV9ICisjZGVmaW5lIEFWQ09ERUNfQ0JTX0gyNjVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjYnNfaDI2NDUuaCIKKyNpbmNsdWRlICJoZXZjLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NVJhd05BTFVuaXRIZWFkZXIgeworICAgIHVpbnQ4X3QgZm9yYmlkZGVuX3plcm9fYml0OworICAgIHVpbnQ4X3QgbmFsX3VuaXRfdHlwZTsKKyAgICB1aW50OF90IG51aF9sYXllcl9pZDsKKyAgICB1aW50OF90IG51aF90ZW1wb3JhbF9pZF9wbHVzMTsKK30gSDI2NVJhd05BTFVuaXRIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IEgyNjVSYXdQcm9maWxlVGllckxldmVsIHsKKyAgICB1aW50OF90IGdlbmVyYWxfcHJvZmlsZV9zcGFjZTsKKyAgICB1aW50OF90IGdlbmVyYWxfdGllcl9mbGFnOworICAgIHVpbnQ4X3QgZ2VuZXJhbF9wcm9maWxlX2lkYzsKKworICAgIHVpbnQ4X3QgZ2VuZXJhbF9wcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ1szMl07CisKKyAgICB1aW50OF90IGdlbmVyYWxfcHJvZ3Jlc3NpdmVfc291cmNlX2ZsYWc7CisgICAgdWludDhfdCBnZW5lcmFsX2ludGVybGFjZWRfc291cmNlX2ZsYWc7CisgICAgdWludDhfdCBnZW5lcmFsX25vbl9wYWNrZWRfY29uc3RyYWludF9mbGFnOworICAgIHVpbnQ4X3QgZ2VuZXJhbF9mcmFtZV9vbmx5X2NvbnN0cmFpbnRfZmxhZzsKKworICAgIHVpbnQ4X3QgZ2VuZXJhbF9tYXhfMTJiaXRfY29uc3RyYWludF9mbGFnOworICAgIHVpbnQ4X3QgZ2VuZXJhbF9tYXhfMTBiaXRfY29uc3RyYWludF9mbGFnOworICAgIHVpbnQ4X3QgZ2VuZXJhbF9tYXhfOGJpdF9jb25zdHJhaW50X2ZsYWc7CisgICAgdWludDhfdCBnZW5lcmFsX21heF80MjJjaHJvbWFfY29uc3RyYWludF9mbGFnOworICAgIHVpbnQ4X3QgZ2VuZXJhbF9tYXhfNDIwY2hyb21hX2NvbnN0cmFpbnRfZmxhZzsKKyAgICB1aW50OF90IGdlbmVyYWxfbWF4X21vbm9jaHJvbWVfY29uc3RyYWludF9mbGFnOworICAgIHVpbnQ4X3QgZ2VuZXJhbF9pbnRyYV9jb25zdHJhaW50X2ZsYWc7CisgICAgdWludDhfdCBnZW5lcmFsX29uZV9waWN0dXJlX29ubHlfY29uc3RyYWludF9mbGFnOworICAgIHVpbnQ4X3QgZ2VuZXJhbF9sb3dlcl9iaXRfcmF0ZV9jb25zdHJhaW50X2ZsYWc7CisgICAgdWludDhfdCBnZW5lcmFsX21heF8xNGJpdF9jb25zdHJhaW50X2ZsYWc7CisKKyAgICB1aW50OF90IGdlbmVyYWxfaW5ibGRfZmxhZzsKKworICAgIHVpbnQ4X3QgZ2VuZXJhbF9sZXZlbF9pZGM7CisKKyAgICB1aW50OF90IHN1Yl9sYXllcl9wcm9maWxlX3ByZXNlbnRfZmxhZ1tIRVZDX01BWF9TVUJfTEFZRVJTXTsKKyAgICB1aW50OF90IHN1Yl9sYXllcl9sZXZlbF9wcmVzZW50X2ZsYWdbSEVWQ19NQVhfU1VCX0xBWUVSU107CisKKyAgICAvLyBUT0RPOiBtdWNoIG9mIHRoYXQgYWdhaW4gZm9yIGVhY2ggc3ViLWxheWVyLgorfSBIMjY1UmF3UHJvZmlsZVRpZXJMZXZlbDsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NVJhd1N1YkxheWVySFJEUGFyYW1ldGVycyB7CisgICAgdWludDMyX3QgYml0X3JhdGVfdmFsdWVfbWludXMxW0hFVkNfTUFYX0NQQl9DTlRdOworICAgIHVpbnQzMl90IGNwYl9zaXplX3ZhbHVlX21pbnVzMVtIRVZDX01BWF9DUEJfQ05UXTsKKyAgICB1aW50MzJfdCBjcGJfc2l6ZV9kdV92YWx1ZV9taW51czFbSEVWQ19NQVhfQ1BCX0NOVF07CisgICAgdWludDMyX3QgYml0X3JhdGVfZHVfdmFsdWVfbWludXMxW0hFVkNfTUFYX0NQQl9DTlRdOworICAgIHVpbnQ4X3QgY2JyX2ZsYWdbSEVWQ19NQVhfQ1BCX0NOVF07Cit9IEgyNjVSYXdTdWJMYXllckhSRFBhcmFtZXRlcnM7CisKK3R5cGVkZWYgc3RydWN0IEgyNjVSYXdIUkRQYXJhbWV0ZXJzIHsKKyAgICB1aW50OF90IG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCB2Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworCisgICAgdWludDhfdCBzdWJfcGljX2hyZF9wYXJhbXNfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgdGlja19kaXZpc29yX21pbnVzMjsKKyAgICB1aW50OF90IGR1X2NwYl9yZW1vdmFsX2RlbGF5X2luY3JlbWVudF9sZW5ndGhfbWludXMxOworICAgIHVpbnQ4X3Qgc3ViX3BpY19jcGJfcGFyYW1zX2luX3BpY190aW1pbmdfc2VpX2ZsYWc7CisgICAgdWludDhfdCBkcGJfb3V0cHV0X2RlbGF5X2R1X2xlbmd0aF9taW51czE7CisKKyAgICB1aW50OF90IGJpdF9yYXRlX3NjYWxlOworICAgIHVpbnQ4X3QgY3BiX3NpemVfc2NhbGU7CisgICAgdWludDhfdCBjcGJfc2l6ZV9kdV9zY2FsZTsKKworICAgIHVpbnQ4X3QgaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxOworICAgIHVpbnQ4X3QgYXVfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMTsKKyAgICB1aW50OF90IGRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoX21pbnVzMTsKKworICAgIHVpbnQ4X3QgZml4ZWRfcGljX3JhdGVfZ2VuZXJhbF9mbGFnW0hFVkNfTUFYX1NVQl9MQVlFUlNdOworICAgIHVpbnQ4X3QgZml4ZWRfcGljX3JhdGVfd2l0aGluX2N2c19mbGFnW0hFVkNfTUFYX1NVQl9MQVlFUlNdOworICAgIHVpbnQxNl90IGVsZW1lbnRhbF9kdXJhdGlvbl9pbl90Y19taW51czFbSEVWQ19NQVhfU1VCX0xBWUVSU107CisgICAgdWludDhfdCBsb3dfZGVsYXlfaHJkX2ZsYWdbSEVWQ19NQVhfU1VCX0xBWUVSU107CisgICAgdWludDhfdCBjcGJfY250X21pbnVzMVtIRVZDX01BWF9TVUJfTEFZRVJTXTsKKyAgICBIMjY1UmF3U3ViTGF5ZXJIUkRQYXJhbWV0ZXJzIG5hbF9zdWJfbGF5ZXJfaHJkX3BhcmFtZXRlcnNbSEVWQ19NQVhfU1VCX0xBWUVSU107CisgICAgSDI2NVJhd1N1YkxheWVySFJEUGFyYW1ldGVycyB2Y2xfc3ViX2xheWVyX2hyZF9wYXJhbWV0ZXJzW0hFVkNfTUFYX1NVQl9MQVlFUlNdOworfSBIMjY1UmF3SFJEUGFyYW1ldGVyczsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NVJhd1ZVSSB7CisgICAgdWludDhfdCBhc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCBhc3BlY3RfcmF0aW9faWRjOworICAgIHVpbnQxNl90IHNhcl93aWR0aDsKKyAgICB1aW50MTZfdCBzYXJfaGVpZ2h0OworCisgICAgdWludDhfdCBvdmVyc2Nhbl9pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IG92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWc7CisKKyAgICB1aW50OF90IHZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IHZpZGVvX2Zvcm1hdDsKKyAgICB1aW50OF90IHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKyAgICB1aW50OF90IGNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCBjb2xvdXJfcHJpbWFyaWVzOworICAgIHVpbnQ4X3QgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHVpbnQ4X3QgbWF0cml4X2NvZWZmaWNpZW50czsKKworICAgIHVpbnQ4X3QgY2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IGNocm9tYV9zYW1wbGVfbG9jX3R5cGVfdG9wX2ZpZWxkOworICAgIHVpbnQ4X3QgY2hyb21hX3NhbXBsZV9sb2NfdHlwZV9ib3R0b21fZmllbGQ7CisKKyAgICB1aW50OF90IG5ldXRyYWxfY2hyb21hX2luZGljYXRpb25fZmxhZzsKKyAgICB1aW50OF90IGZpZWxkX3NlcV9mbGFnOworICAgIHVpbnQ4X3QgZnJhbWVfZmllbGRfaW5mb19wcmVzZW50X2ZsYWc7CisKKyAgICB1aW50OF90IGRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZzsKKyAgICB1aW50MTZfdCBkZWZfZGlzcF93aW5fbGVmdF9vZmZzZXQ7CisgICAgdWludDE2X3QgZGVmX2Rpc3Bfd2luX3JpZ2h0X29mZnNldDsKKyAgICB1aW50MTZfdCBkZWZfZGlzcF93aW5fdG9wX29mZnNldDsKKyAgICB1aW50MTZfdCBkZWZfZGlzcF93aW5fYm90dG9tX29mZnNldDsKKworICAgIHVpbnQ4X3QgdnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50MzJfdCB2dWlfbnVtX3VuaXRzX2luX3RpY2s7CisgICAgdWludDMyX3QgdnVpX3RpbWVfc2NhbGU7CisgICAgdWludDhfdCB2dWlfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZzsKKyAgICB1aW50MzJfdCB2dWlfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czE7CisgICAgdWludDhfdCB2dWlfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworICAgIEgyNjVSYXdIUkRQYXJhbWV0ZXJzIGhyZF9wYXJhbWV0ZXJzOworCisgICAgdWludDhfdCBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZzsKKyAgICB1aW50OF90IHRpbGVzX2ZpeGVkX3N0cnVjdHVyZV9mbGFnOworICAgIHVpbnQ4X3QgbW90aW9uX3ZlY3RvcnNfb3Zlcl9waWNfYm91bmRhcmllc19mbGFnOworICAgIHVpbnQ4X3QgcmVzdHJpY3RlZF9yZWZfcGljX2xpc3RzX2ZsYWc7CisgICAgdWludDE2X3QgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYzsKKyAgICB1aW50OF90IG1heF9ieXRlc19wZXJfcGljX2Rlbm9tOworICAgIHVpbnQ4X3QgbWF4X2JpdHNfcGVyX21pbl9jdV9kZW5vbTsKKyAgICB1aW50OF90IGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsOworICAgIHVpbnQ4X3QgbG9nMl9tYXhfbXZfbGVuZ3RoX3ZlcnRpY2FsOworfSBIMjY1UmF3VlVJOworCit0eXBlZGVmIHN0cnVjdCBIMjY1UmF3UFNFeHRlbnNpb25EYXRhIHsKKyAgICB1aW50OF90ICpkYXRhOworICAgIHNpemVfdCBiaXRfbGVuZ3RoOworICAgIEFWQnVmZmVyUmVmICpkYXRhX3JlZjsKK30gSDI2NVJhd1BTRXh0ZW5zaW9uRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NVJhd1ZQUyB7CisgICAgSDI2NVJhd05BTFVuaXRIZWFkZXIgbmFsX3VuaXRfaGVhZGVyOworCisgICAgdWludDhfdCB2cHNfdmlkZW9fcGFyYW1ldGVyX3NldF9pZDsKKworICAgIHVpbnQ4X3QgdnBzX2Jhc2VfbGF5ZXJfaW50ZXJuYWxfZmxhZzsKKyAgICB1aW50OF90IHZwc19iYXNlX2xheWVyX2F2YWlsYWJsZV9mbGFnOworICAgIHVpbnQ4X3QgdnBzX21heF9sYXllcnNfbWludXMxOworICAgIHVpbnQ4X3QgdnBzX21heF9zdWJfbGF5ZXJzX21pbnVzMTsKKyAgICB1aW50OF90IHZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWc7CisKKyAgICBIMjY1UmF3UHJvZmlsZVRpZXJMZXZlbCBwcm9maWxlX3RpZXJfbGV2ZWw7CisKKyAgICB1aW50OF90IHZwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCB2cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMVtIRVZDX01BWF9TVUJfTEFZRVJTXTsKKyAgICB1aW50OF90IHZwc19tYXhfbnVtX3Jlb3JkZXJfcGljc1tIRVZDX01BWF9TVUJfTEFZRVJTXTsKKyAgICB1aW50MzJfdCB2cHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VfcGx1czFbSEVWQ19NQVhfU1VCX0xBWUVSU107CisKKyAgICB1aW50OF90IHZwc19tYXhfbGF5ZXJfaWQ7CisgICAgdWludDE2X3QgdnBzX251bV9sYXllcl9zZXRzX21pbnVzMTsKKyAgICB1aW50OF90IGxheWVyX2lkX2luY2x1ZGVkX2ZsYWdbSEVWQ19NQVhfTEFZRVJfU0VUU11bSEVWQ19NQVhfTEFZRVJTXTsKKworICAgIHVpbnQ4X3QgdnBzX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50MzJfdCB2cHNfbnVtX3VuaXRzX2luX3RpY2s7CisgICAgdWludDMyX3QgdnBzX3RpbWVfc2NhbGU7CisgICAgdWludDhfdCB2cHNfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZzsKKyAgICB1aW50MzJfdCB2cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czE7CisgICAgdWludDE2X3QgdnBzX251bV9ocmRfcGFyYW1ldGVyczsKKyAgICB1aW50MTZfdCBocmRfbGF5ZXJfc2V0X2lkeFtIRVZDX01BWF9MQVlFUl9TRVRTXTsKKyAgICB1aW50OF90IGNwcm1zX3ByZXNlbnRfZmxhZ1tIRVZDX01BWF9MQVlFUl9TRVRTXTsKKyAgICBIMjY1UmF3SFJEUGFyYW1ldGVycyBocmRfcGFyYW1ldGVyc1tIRVZDX01BWF9MQVlFUl9TRVRTXTsKKworICAgIHVpbnQ4X3QgdnBzX2V4dGVuc2lvbl9mbGFnOworICAgIEgyNjVSYXdQU0V4dGVuc2lvbkRhdGEgZXh0ZW5zaW9uX2RhdGE7Cit9IEgyNjVSYXdWUFM7CisKK3R5cGVkZWYgc3RydWN0IEgyNjVSYXdTVFJlZlBpY1NldCB7CisgICAgdWludDhfdCBpbnRlcl9yZWZfcGljX3NldF9wcmVkaWN0aW9uX2ZsYWc7CisKKyAgICB1aW50OF90IGRlbHRhX2lkeF9taW51czE7CisgICAgdWludDhfdCBkZWx0YV9ycHNfc2lnbjsKKyAgICB1aW50MTZfdCBhYnNfZGVsdGFfcnBzX21pbnVzMTsKKworICAgIHVpbnQ4X3QgdXNlZF9ieV9jdXJyX3BpY19mbGFnW0hFVkNfTUFYX1JFRlNdOworICAgIHVpbnQ4X3QgdXNlX2RlbHRhX2ZsYWdbSEVWQ19NQVhfUkVGU107CisKKyAgICB1aW50OF90IG51bV9uZWdhdGl2ZV9waWNzOworICAgIHVpbnQ4X3QgbnVtX3Bvc2l0aXZlX3BpY3M7CisgICAgdWludDE2X3QgZGVsdGFfcG9jX3MwX21pbnVzMVtIRVZDX01BWF9SRUZTXTsKKyAgICB1aW50OF90IHVzZWRfYnlfY3Vycl9waWNfczBfZmxhZ1tIRVZDX01BWF9SRUZTXTsKKyAgICB1aW50MTZfdCBkZWx0YV9wb2NfczFfbWludXMxW0hFVkNfTUFYX1JFRlNdOworICAgIHVpbnQ4X3QgdXNlZF9ieV9jdXJyX3BpY19zMV9mbGFnW0hFVkNfTUFYX1JFRlNdOworfSBIMjY1UmF3U1RSZWZQaWNTZXQ7CisKK3R5cGVkZWYgc3RydWN0IEgyNjVSYXdTY2FsaW5nTGlzdCB7CisgICAgdWludDhfdCBzY2FsaW5nX2xpc3RfcHJlZF9tb2RlX2ZsYWdbNF1bNl07CisgICAgdWludDhfdCBzY2FsaW5nX2xpc3RfcHJlZF9tYXRyaXhfaWRfZGVsdGFbNF1bNl07CisgICAgaW50MTZfdCBzY2FsaW5nX2xpc3RfZGNfY29lZl9taW51czhbNF1bNl07CisgICAgaW50OF90IHNjYWxpbmdfbGlzdF9kZWx0YV9jb2VmZls0XVs2XVs2NF07Cit9IEgyNjVSYXdTY2FsaW5nTGlzdDsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NVJhd1NQUyB7CisgICAgSDI2NVJhd05BTFVuaXRIZWFkZXIgbmFsX3VuaXRfaGVhZGVyOworCisgICAgdWludDhfdCBzcHNfdmlkZW9fcGFyYW1ldGVyX3NldF9pZDsKKworICAgIHVpbnQ4X3Qgc3BzX21heF9zdWJfbGF5ZXJzX21pbnVzMTsKKyAgICB1aW50OF90IHNwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWc7CisKKyAgICBIMjY1UmF3UHJvZmlsZVRpZXJMZXZlbCBwcm9maWxlX3RpZXJfbGV2ZWw7CisKKyAgICB1aW50OF90IHNwc19zZXFfcGFyYW1ldGVyX3NldF9pZDsKKworICAgIHVpbnQ4X3QgY2hyb21hX2Zvcm1hdF9pZGM7CisgICAgdWludDhfdCBzZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZzsKKworICAgIHVpbnQxNl90IHBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXM7CisgICAgdWludDE2X3QgcGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXM7CisKKyAgICB1aW50OF90IGNvbmZvcm1hbmNlX3dpbmRvd19mbGFnOworICAgIHVpbnQxNl90IGNvbmZfd2luX2xlZnRfb2Zmc2V0OworICAgIHVpbnQxNl90IGNvbmZfd2luX3JpZ2h0X29mZnNldDsKKyAgICB1aW50MTZfdCBjb25mX3dpbl90b3Bfb2Zmc2V0OworICAgIHVpbnQxNl90IGNvbmZfd2luX2JvdHRvbV9vZmZzZXQ7CisKKyAgICB1aW50OF90IGJpdF9kZXB0aF9sdW1hX21pbnVzODsKKyAgICB1aW50OF90IGJpdF9kZXB0aF9jaHJvbWFfbWludXM4OworCisgICAgdWludDhfdCBsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQ7CisKKyAgICB1aW50OF90IHNwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCBzcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMVtIRVZDX01BWF9TVUJfTEFZRVJTXTsKKyAgICB1aW50OF90IHNwc19tYXhfbnVtX3Jlb3JkZXJfcGljc1tIRVZDX01BWF9TVUJfTEFZRVJTXTsKKyAgICB1aW50MzJfdCBzcHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VfcGx1czFbSEVWQ19NQVhfU1VCX0xBWUVSU107CisKKyAgICB1aW50OF90IGxvZzJfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVfbWludXMzOworICAgIHVpbnQ4X3QgbG9nMl9kaWZmX21heF9taW5fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZTsKKyAgICB1aW50OF90IGxvZzJfbWluX2x1bWFfdHJhbnNmb3JtX2Jsb2NrX3NpemVfbWludXMyOworICAgIHVpbnQ4X3QgbG9nMl9kaWZmX21heF9taW5fbHVtYV90cmFuc2Zvcm1fYmxvY2tfc2l6ZTsKKyAgICB1aW50OF90IG1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyOworICAgIHVpbnQ4X3QgbWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmE7CisKKyAgICB1aW50OF90IHNjYWxpbmdfbGlzdF9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBzcHNfc2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnOworICAgIEgyNjVSYXdTY2FsaW5nTGlzdCBzY2FsaW5nX2xpc3Q7CisKKyAgICB1aW50OF90IGFtcF9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBzYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2VuYWJsZWRfZmxhZzsKKworICAgIHVpbnQ4X3QgcGNtX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IHBjbV9zYW1wbGVfYml0X2RlcHRoX2x1bWFfbWludXMxOworICAgIHVpbnQ4X3QgcGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hX21pbnVzMTsKKyAgICB1aW50OF90IGxvZzJfbWluX3BjbV9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMzsKKyAgICB1aW50OF90IGxvZzJfZGlmZl9tYXhfbWluX3BjbV9sdW1hX2NvZGluZ19ibG9ja19zaXplOworICAgIHVpbnQ4X3QgcGNtX2xvb3BfZmlsdGVyX2Rpc2FibGVkX2ZsYWc7CisKKyAgICB1aW50OF90IG51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0czsKKyAgICBIMjY1UmF3U1RSZWZQaWNTZXQgc3RfcmVmX3BpY19zZXRbSEVWQ19NQVhfU0hPUlRfVEVSTV9SRUZfUElDX1NFVFNdOworCisgICAgdWludDhfdCBsb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgbnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHM7CisgICAgdWludDE2X3QgbHRfcmVmX3BpY19wb2NfbHNiX3Nwc1tIRVZDX01BWF9MT05HX1RFUk1fUkVGX1BJQ1NdOworICAgIHVpbnQ4X3QgdXNlZF9ieV9jdXJyX3BpY19sdF9zcHNfZmxhZ1tIRVZDX01BWF9MT05HX1RFUk1fUkVGX1BJQ1NdOworCisgICAgdWludDhfdCBzcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IHN0cm9uZ19pbnRyYV9zbW9vdGhpbmdfZW5hYmxlZF9mbGFnOworCisgICAgdWludDhfdCB2dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisgICAgSDI2NVJhd1ZVSSB2dWk7CisKKyAgICB1aW50OF90IHNwc19leHRlbnNpb25fcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3Qgc3BzX3JhbmdlX2V4dGVuc2lvbl9mbGFnOworICAgIHVpbnQ4X3Qgc3BzX211bHRpbGF5ZXJfZXh0ZW5zaW9uX2ZsYWc7CisgICAgdWludDhfdCBzcHNfM2RfZXh0ZW5zaW9uX2ZsYWc7CisgICAgdWludDhfdCBzcHNfc2NjX2V4dGVuc2lvbl9mbGFnOworICAgIHVpbnQ4X3Qgc3BzX2V4dGVuc2lvbl80Yml0czsKKworICAgIEgyNjVSYXdQU0V4dGVuc2lvbkRhdGEgZXh0ZW5zaW9uX2RhdGE7CisKKyAgICAvLyBSYW5nZSBleHRlbnNpb24uCisgICAgdWludDhfdCB0cmFuc2Zvcm1fc2tpcF9yb3RhdGlvbl9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCB0cmFuc2Zvcm1fc2tpcF9jb250ZXh0X2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGltcGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGV4cGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGV4dGVuZGVkX3ByZWNpc2lvbl9wcm9jZXNzaW5nX2ZsYWc7CisgICAgdWludDhfdCBpbnRyYV9zbW9vdGhpbmdfZGlzYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGhpZ2hfcHJlY2lzaW9uX29mZnNldHNfZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgcGVyc2lzdGVudF9yaWNlX2FkYXB0YXRpb25fZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgY2FiYWNfYnlwYXNzX2FsaWdubWVudF9lbmFibGVkX2ZsYWc7CisKKyAgICAvLyBTY3JlZW4gY29udGVudCBjb2RpbmcgZXh0ZW5zaW9uLgorICAgIHVpbnQ4X3Qgc3BzX2N1cnJfcGljX3JlZl9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBwYWxldHRlX21vZGVfZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgcGFsZXR0ZV9tYXhfc2l6ZTsKKyAgICB1aW50OF90IGRlbHRhX3BhbGV0dGVfbWF4X3ByZWRpY3Rvcl9zaXplOworICAgIHVpbnQ4X3Qgc3BzX3BhbGV0dGVfcHJlZGljdG9yX2luaXRpYWxpemVyX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IHNwc19udW1fcGFsZXR0ZV9wcmVkaWN0b3JfaW5pdGlhbGl6ZXJfbWludXMxOworICAgIHVpbnQxNl90IHNwc19wYWxldHRlX3ByZWRpY3Rvcl9pbml0aWFsaXplcnNbM11bMTI4XTsKKworICAgIHVpbnQ4X3QgbW90aW9uX3ZlY3Rvcl9yZXNvbHV0aW9uX2NvbnRyb2xfaWRjOworICAgIHVpbnQ4X3QgaW50cmFfYm91bmRhcnlfZmlsdGVyaW5nX2Rpc2FibGVfZmxhZzsKK30gSDI2NVJhd1NQUzsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NVJhd1BQUyB7CisgICAgSDI2NVJhd05BTFVuaXRIZWFkZXIgbmFsX3VuaXRfaGVhZGVyOworCisgICAgdWludDhfdCBwcHNfcGljX3BhcmFtZXRlcl9zZXRfaWQ7CisgICAgdWludDhfdCBwcHNfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICB1aW50OF90IGRlcGVuZGVudF9zbGljZV9zZWdtZW50c19lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBvdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCBudW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHM7CisgICAgdWludDhfdCBzaWduX2RhdGFfaGlkaW5nX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGNhYmFjX2luaXRfcHJlc2VudF9mbGFnOworCisgICAgdWludDhfdCBudW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZV9taW51czE7CisgICAgdWludDhfdCBudW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZV9taW51czE7CisKKyAgICBpbnQ4X3QgaW5pdF9xcF9taW51czI2OworCisgICAgdWludDhfdCBjb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWc7CisgICAgdWludDhfdCB0cmFuc2Zvcm1fc2tpcF9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBjdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBkaWZmX2N1X3FwX2RlbHRhX2RlcHRoOworCisgICAgaW50OF90IHBwc19jYl9xcF9vZmZzZXQ7CisgICAgaW50OF90IHBwc19jcl9xcF9vZmZzZXQ7CisgICAgdWludDhfdCBwcHNfc2xpY2VfY2hyb21hX3FwX29mZnNldHNfcHJlc2VudF9mbGFnOworCisgICAgdWludDhfdCB3ZWlnaHRlZF9wcmVkX2ZsYWc7CisgICAgdWludDhfdCB3ZWlnaHRlZF9iaXByZWRfZmxhZzsKKworICAgIHVpbnQ4X3QgdHJhbnNxdWFudF9ieXBhc3NfZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgdGlsZXNfZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWc7CisKKyAgICB1aW50OF90IG51bV90aWxlX2NvbHVtbnNfbWludXMxOworICAgIHVpbnQ4X3QgbnVtX3RpbGVfcm93c19taW51czE7CisgICAgdWludDhfdCB1bmlmb3JtX3NwYWNpbmdfZmxhZzsKKyAgICB1aW50MTZfdCBjb2x1bW5fd2lkdGhfbWludXMxW0hFVkNfTUFYX1RJTEVfQ09MVU1OU107CisgICAgdWludDE2X3Qgcm93X2hlaWdodF9taW51czFbSEVWQ19NQVhfVElMRV9ST1dTXTsKKyAgICB1aW50OF90IGxvb3BfZmlsdGVyX2Fjcm9zc190aWxlc19lbmFibGVkX2ZsYWc7CisKKyAgICB1aW50OF90IHBwc19sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgcHBzX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWc7CisgICAgaW50OF90IHBwc19iZXRhX29mZnNldF9kaXYyOworICAgIGludDhfdCBwcHNfdGNfb2Zmc2V0X2RpdjI7CisKKyAgICB1aW50OF90IHBwc19zY2FsaW5nX2xpc3RfZGF0YV9wcmVzZW50X2ZsYWc7CisgICAgSDI2NVJhd1NjYWxpbmdMaXN0IHNjYWxpbmdfbGlzdDsKKworICAgIHVpbnQ4X3QgbGlzdHNfbW9kaWZpY2F0aW9uX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IGxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyOworCisgICAgdWludDhfdCBzbGljZV9zZWdtZW50X2hlYWRlcl9leHRlbnNpb25fcHJlc2VudF9mbGFnOworCisgICAgdWludDhfdCBwcHNfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IHBwc19yYW5nZV9leHRlbnNpb25fZmxhZzsKKyAgICB1aW50OF90IHBwc19tdWx0aWxheWVyX2V4dGVuc2lvbl9mbGFnOworICAgIHVpbnQ4X3QgcHBzXzNkX2V4dGVuc2lvbl9mbGFnOworICAgIHVpbnQ4X3QgcHBzX3NjY19leHRlbnNpb25fZmxhZzsKKyAgICB1aW50OF90IHBwc19leHRlbnNpb25fNGJpdHM7CisKKyAgICBIMjY1UmF3UFNFeHRlbnNpb25EYXRhIGV4dGVuc2lvbl9kYXRhOworCisgICAgLy8gUmFuZ2UgZXh0ZW5zaW9uLgorICAgIHVpbnQ4X3QgbG9nMl9tYXhfdHJhbnNmb3JtX3NraXBfYmxvY2tfc2l6ZV9taW51czI7CisgICAgdWludDhfdCBjcm9zc19jb21wb25lbnRfcHJlZGljdGlvbl9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBjaHJvbWFfcXBfb2Zmc2V0X2xpc3RfZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgZGlmZl9jdV9jaHJvbWFfcXBfb2Zmc2V0X2RlcHRoOworICAgIHVpbnQ4X3QgY2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czE7CisgICAgaW50OF90IGNiX3FwX29mZnNldF9saXN0WzZdOworICAgIGludDhfdCBjcl9xcF9vZmZzZXRfbGlzdFs2XTsKKyAgICB1aW50OF90IGxvZzJfc2FvX29mZnNldF9zY2FsZV9sdW1hOworICAgIHVpbnQ4X3QgbG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2Nocm9tYTsKKworICAgIC8vIFNjcmVlbiBjb250ZW50IGNvZGluZyBleHRlbnNpb24uCisgICAgdWludDhfdCBwcHNfY3Vycl9waWNfcmVmX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IHJlc2lkdWFsX2FkYXB0aXZlX2NvbG91cl90cmFuc2Zvcm1fZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgcHBzX3NsaWNlX2FjdF9xcF9vZmZzZXRzX3ByZXNlbnRfZmxhZzsKKyAgICBpbnQ4X3QgcHBzX2FjdF95X3FwX29mZnNldF9wbHVzNTsKKyAgICBpbnQ4X3QgcHBzX2FjdF9jYl9xcF9vZmZzZXRfcGx1czU7CisgICAgaW50OF90IHBwc19hY3RfY3JfcXBfb2Zmc2V0X3BsdXMzOworCisgICAgdWludDhfdCBwcHNfcGFsZXR0ZV9wcmVkaWN0b3JfaW5pdGlhbGl6ZXJfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgcHBzX251bV9wYWxldHRlX3ByZWRpY3Rvcl9pbml0aWFsaXplcjsKKyAgICB1aW50OF90IG1vbm9jaHJvbWVfcGFsZXR0ZV9mbGFnOworICAgIHVpbnQ4X3QgbHVtYV9iaXRfZGVwdGhfZW50cnlfbWludXM4OworICAgIHVpbnQ4X3QgY2hyb21hX2JpdF9kZXB0aF9lbnRyeV9taW51czg7CisgICAgdWludDE2X3QgcHBzX3BhbGV0dGVfcHJlZGljdG9yX2luaXRpYWxpemVyc1szXVsxMjhdOworfSBIMjY1UmF3UFBTOworCit0eXBlZGVmIHN0cnVjdCBIMjY1UmF3QVVEIHsKKyAgICBIMjY1UmF3TkFMVW5pdEhlYWRlciBuYWxfdW5pdF9oZWFkZXI7CisKKyAgICB1aW50OF90IHBpY190eXBlOworfSBIMjY1UmF3QVVEOworCit0eXBlZGVmIHN0cnVjdCAgSDI2NVJhd1NsaWNlSGVhZGVyIHsKKyAgICBIMjY1UmF3TkFMVW5pdEhlYWRlciBuYWxfdW5pdF9oZWFkZXI7CisKKyAgICB1aW50OF90IGZpcnN0X3NsaWNlX3NlZ21lbnRfaW5fcGljX2ZsYWc7CisgICAgdWludDhfdCBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnOworICAgIHVpbnQ4X3Qgc2xpY2VfcGljX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICB1aW50OF90IGRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWc7CisgICAgdWludDE2X3Qgc2xpY2Vfc2VnbWVudF9hZGRyZXNzOworCisgICAgdWludDhfdCBzbGljZV9yZXNlcnZlZF9mbGFnWzhdOworICAgIHVpbnQ4X3Qgc2xpY2VfdHlwZTsKKworICAgIHVpbnQ4X3QgcGljX291dHB1dF9mbGFnOworICAgIHVpbnQ4X3QgY29sb3VyX3BsYW5lX2lkOworCisgICAgdWludDE2X3Qgc2xpY2VfcGljX29yZGVyX2NudF9sc2I7CisKKyAgICB1aW50OF90IHNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWc7CisgICAgSDI2NVJhd1NUUmVmUGljU2V0IHNob3J0X3Rlcm1fcmVmX3BpY19zZXQ7CisgICAgdWludDhfdCBzaG9ydF90ZXJtX3JlZl9waWNfc2V0X2lkeDsKKworICAgIHVpbnQ4X3QgbnVtX2xvbmdfdGVybV9zcHM7CisgICAgdWludDhfdCBudW1fbG9uZ190ZXJtX3BpY3M7CisgICAgdWludDhfdCBsdF9pZHhfc3BzW0hFVkNfTUFYX1JFRlNdOworICAgIHVpbnQ4X3QgcG9jX2xzYl9sdFtIRVZDX01BWF9SRUZTXTsKKyAgICB1aW50OF90IHVzZWRfYnlfY3Vycl9waWNfbHRfZmxhZ1tIRVZDX01BWF9SRUZTXTsKKyAgICB1aW50OF90IGRlbHRhX3BvY19tc2JfcHJlc2VudF9mbGFnW0hFVkNfTUFYX1JFRlNdOworICAgIHVpbnQzMl90IGRlbHRhX3BvY19tc2JfY3ljbGVfbHRbSEVWQ19NQVhfUkVGU107CisKKyAgICB1aW50OF90IHNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWc7CisKKyAgICB1aW50OF90IHNsaWNlX3Nhb19sdW1hX2ZsYWc7CisgICAgdWludDhfdCBzbGljZV9zYW9fY2hyb21hX2ZsYWc7CisKKyAgICB1aW50OF90IG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnOworICAgIHVpbnQ4X3QgbnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsKKyAgICB1aW50OF90IG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7CisKKyAgICB1aW50OF90IHJlZl9waWNfbGlzdF9tb2RpZmljYXRpb25fZmxhZ19sMDsKKyAgICB1aW50OF90IGxpc3RfZW50cnlfbDBbSEVWQ19NQVhfUkVGU107CisgICAgdWludDhfdCByZWZfcGljX2xpc3RfbW9kaWZpY2F0aW9uX2ZsYWdfbDE7CisgICAgdWludDhfdCBsaXN0X2VudHJ5X2wxW0hFVkNfTUFYX1JFRlNdOworCisgICAgdWludDhfdCBtdmRfbDFfemVyb19mbGFnOworICAgIHVpbnQ4X3QgY2FiYWNfaW5pdF9mbGFnOworICAgIHVpbnQ4X3QgY29sbG9jYXRlZF9mcm9tX2wwX2ZsYWc7CisgICAgdWludDhfdCBjb2xsb2NhdGVkX3JlZl9pZHg7CisKKyAgICB1aW50OF90IGx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgaW50OF90IGRlbHRhX2Nocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICB1aW50OF90IGx1bWFfd2VpZ2h0X2wwX2ZsYWdbSEVWQ19NQVhfUkVGU107CisgICAgdWludDhfdCBjaHJvbWFfd2VpZ2h0X2wwX2ZsYWdbSEVWQ19NQVhfUkVGU107CisgICAgaW50OF90IGRlbHRhX2x1bWFfd2VpZ2h0X2wwW0hFVkNfTUFYX1JFRlNdOworICAgIGludDE2X3QgbHVtYV9vZmZzZXRfbDBbSEVWQ19NQVhfUkVGU107CisgICAgaW50OF90IGRlbHRhX2Nocm9tYV93ZWlnaHRfbDBbSEVWQ19NQVhfUkVGU11bMl07CisgICAgaW50MTZfdCBjaHJvbWFfb2Zmc2V0X2wwW0hFVkNfTUFYX1JFRlNdWzJdOworICAgIHVpbnQ4X3QgbHVtYV93ZWlnaHRfbDFfZmxhZ1tIRVZDX01BWF9SRUZTXTsKKyAgICB1aW50OF90IGNocm9tYV93ZWlnaHRfbDFfZmxhZ1tIRVZDX01BWF9SRUZTXTsKKyAgICBpbnQ4X3QgZGVsdGFfbHVtYV93ZWlnaHRfbDFbSEVWQ19NQVhfUkVGU107CisgICAgaW50MTZfdCBsdW1hX29mZnNldF9sMVtIRVZDX01BWF9SRUZTXTsKKyAgICBpbnQ4X3QgZGVsdGFfY2hyb21hX3dlaWdodF9sMVtIRVZDX01BWF9SRUZTXVsyXTsKKyAgICBpbnQxNl90IGNocm9tYV9vZmZzZXRfbDFbSEVWQ19NQVhfUkVGU11bMl07CisKKyAgICB1aW50OF90IGZpdmVfbWludXNfbWF4X251bV9tZXJnZV9jYW5kOworICAgIHVpbnQ4X3QgdXNlX2ludGVnZXJfbXZfZmxhZzsKKworICAgIGludDhfdCBzbGljZV9xcF9kZWx0YTsKKyAgICBpbnQ4X3Qgc2xpY2VfY2JfcXBfb2Zmc2V0OworICAgIGludDhfdCBzbGljZV9jcl9xcF9vZmZzZXQ7CisgICAgaW50OF90IHNsaWNlX2FjdF95X3FwX29mZnNldDsKKyAgICBpbnQ4X3Qgc2xpY2VfYWN0X2NiX3FwX29mZnNldDsKKyAgICBpbnQ4X3Qgc2xpY2VfYWN0X2NyX3FwX29mZnNldDsKKyAgICB1aW50OF90IGN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnOworCisgICAgdWludDhfdCBkZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9mbGFnOworICAgIHVpbnQ4X3Qgc2xpY2VfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZzsKKyAgICBpbnQ4X3Qgc2xpY2VfYmV0YV9vZmZzZXRfZGl2MjsKKyAgICBpbnQ4X3Qgc2xpY2VfdGNfb2Zmc2V0X2RpdjI7CisgICAgdWludDhfdCBzbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZzsKKworICAgIHVpbnQxNl90IG51bV9lbnRyeV9wb2ludF9vZmZzZXRzOworICAgIHVpbnQ4X3Qgb2Zmc2V0X2xlbl9taW51czE7CisgICAgdWludDMyX3QgZW50cnlfcG9pbnRfb2Zmc2V0X21pbnVzMVtIRVZDX01BWF9FTlRSWV9QT0lOVF9PRkZTRVRTXTsKKworICAgIHVpbnQxNl90IHNsaWNlX3NlZ21lbnRfaGVhZGVyX2V4dGVuc2lvbl9sZW5ndGg7CisgICAgdWludDhfdCBzbGljZV9zZWdtZW50X2hlYWRlcl9leHRlbnNpb25fZGF0YV9ieXRlWzI1Nl07Cit9IEgyNjVSYXdTbGljZUhlYWRlcjsKKworCit0eXBlZGVmIHN0cnVjdCBIMjY1UmF3U2xpY2UgeworICAgIEgyNjVSYXdTbGljZUhlYWRlciBoZWFkZXI7CisKKyAgICB1aW50OF90ICpkYXRhOworICAgIHNpemVfdCAgIGRhdGFfc2l6ZTsKKyAgICBpbnQgICAgICBkYXRhX2JpdF9zdGFydDsKKyAgICBBVkJ1ZmZlclJlZiAqZGF0YV9yZWY7Cit9IEgyNjVSYXdTbGljZTsKKworCit0eXBlZGVmIHN0cnVjdCBDb2RlZEJpdHN0cmVhbUgyNjVDb250ZXh0IHsKKyAgICAvLyBSZWFkZXIvd3JpdGVyIGNvbnRleHQgaW4gY29tbW9uIHdpdGggdGhlIEguMjY0IGltcGxlbWVudGF0aW9uLgorICAgIENvZGVkQml0c3RyZWFtSDI2NDVDb250ZXh0IGNvbW1vbjsKKworICAgIC8vIEFsbCBjdXJyZW50bHkgYXZhaWxhYmxlIHBhcmFtZXRlciBzZXRzLiAgVGhlc2UgYXJlIHVwZGF0ZWQgd2hlbgorICAgIC8vIGFueSBwYXJhbWV0ZXIgc2V0IE5BTCB1bml0IGlzIHJlYWQvd3JpdHRlbiB3aXRoIHRoaXMgY29udGV4dC4KKyAgICBIMjY1UmF3VlBTICp2cHNbSEVWQ19NQVhfVlBTX0NPVU5UXTsKKyAgICBIMjY1UmF3U1BTICpzcHNbSEVWQ19NQVhfU1BTX0NPVU5UXTsKKyAgICBIMjY1UmF3UFBTICpwcHNbSEVWQ19NQVhfUFBTX0NPVU5UXTsKKworICAgIC8vIFRoZSBjdXJyZW50bHkgYWN0aXZlIHBhcmFtZXRlciBzZXRzLiAgVGhlc2UgYXJlIHVwZGF0ZWQgd2hlbiBhbnkKKyAgICAvLyBOQUwgdW5pdCByZWZlcnMgdG8gdGhlIHJlbGV2YW50IHBhcmFtZXRlciBzZXQuICBUaGVzZSBwb2ludGVycworICAgIC8vIG11c3QgYWxzbyBiZSBwcmVzZW50IGluIHRoZSBhcnJheXMgYWJvdmUuCisgICAgY29uc3QgSDI2NVJhd1ZQUyAqYWN0aXZlX3ZwczsKKyAgICBjb25zdCBIMjY1UmF3U1BTICphY3RpdmVfc3BzOworICAgIGNvbnN0IEgyNjVSYXdQUFMgKmFjdGl2ZV9wcHM7Cit9IENvZGVkQml0c3RyZWFtSDI2NUNvbnRleHQ7CisKKworI2VuZGlmIC8qIEFWQ09ERUNfQ0JTX0gyNjVfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jYnNfaDI2NV9zeW50YXhfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvY2JzX2gyNjVfc3ludGF4X3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwYzgyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvY2JzX2gyNjVfc3ludGF4X3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxNTAzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKK3N0YXRpYyBpbnQgRlVOQyhyYnNwX3RyYWlsaW5nX2JpdHMpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3KQoreworICAgIGludCBlcnI7CisgICAgYXZfdW51c2VkIGludCBvbmUgPSAxLCB6ZXJvID0gMDsKKyAgICB4dSgxLCByYnNwX3N0b3Bfb25lX2JpdCwgb25lLCAxLCAxKTsKKyAgICB3aGlsZSAoYnl0ZV9hbGlnbm1lbnQocncpICE9IDApCisgICAgICAgIHh1KDEsIHJic3BfYWxpZ25tZW50X3plcm9fYml0LCB6ZXJvLCAwLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMobmFsX3VuaXRfaGVhZGVyKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjVSYXdOQUxVbml0SGVhZGVyICpjdXJyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX25hbF91bml0X3R5cGUpCit7CisgICAgaW50IGVycjsKKworICAgIHUoMSwgZm9yYmlkZGVuX3plcm9fYml0LCAwLCAwKTsKKworICAgIGlmIChleHBlY3RlZF9uYWxfdW5pdF90eXBlID49IDApCisgICAgICAgIHUoNiwgbmFsX3VuaXRfdHlwZSwgZXhwZWN0ZWRfbmFsX3VuaXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9uYWxfdW5pdF90eXBlKTsKKyAgICBlbHNlCisgICAgICAgIHUoNiwgbmFsX3VuaXRfdHlwZSwgMCwgNjMpOworCisgICAgdSg2LCBudWhfbGF5ZXJfaWQsICAgICAgICAgIDAsIDYyKTsKKyAgICB1KDMsIG51aF90ZW1wb3JhbF9pZF9wbHVzMSwgMSwgIDcpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhieXRlX2FsaWdubWVudCkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncpCit7CisgICAgaW50IGVycjsKKyAgICBhdl91bnVzZWQgaW50IG9uZSA9IDEsIHplcm8gPSAwOworICAgIHh1KDEsIGFsaWdubWVudF9iaXRfZXF1YWxfdG9fb25lLCBvbmUsIDEsIDEpOworICAgIHdoaWxlIChieXRlX2FsaWdubWVudChydykgIT0gMCkKKyAgICAgICAgeHUoMSwgYWxpZ25tZW50X2JpdF9lcXVhbF90b196ZXJvLCB6ZXJvLCAwLCAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoZXh0ZW5zaW9uX2RhdGEpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY1UmF3UFNFeHRlbnNpb25EYXRhICpjdXJyZW50KQoreworICAgIGludCBlcnI7CisgICAgc2l6ZV90IGs7CisjaWZkZWYgUkVBRAorICAgIEdldEJpdENvbnRleHQgc3RhcnQ7CisgICAgdWludDhfdCBiaXQ7CisgICAgc3RhcnQgPSAqcnc7CisgICAgZm9yIChrID0gMDsgY2JzX2gyNjQ1X3JlYWRfbW9yZV9yYnNwX2RhdGEocncpOyBrKyspCisgICAgICAgIHNraXBfYml0cyhydywgMSk7CisgICAgY3VycmVudC0+Yml0X2xlbmd0aCA9IGs7CisgICAgaWYgKGsgPiAwKSB7CisgICAgICAgICpydyA9IHN0YXJ0OworICAgICAgICBhbGxvY2F0ZShjdXJyZW50LT5kYXRhLCAoY3VycmVudC0+Yml0X2xlbmd0aCArIDcpIC8gOCk7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBjdXJyZW50LT5iaXRfbGVuZ3RoOyBrKyspIHsKKyAgICAgICAgICAgIHh1KDEsIGV4dGVuc2lvbl9kYXRhLCBiaXQsIDAsIDEpOworICAgICAgICAgICAgY3VycmVudC0+ZGF0YVtrIC8gOF0gfD0gYml0IDw8ICg3IC0gayAlIDgpOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBmb3IgKGsgPSAwOyBrIDwgY3VycmVudC0+Yml0X2xlbmd0aDsgaysrKQorICAgICAgICB4dSgxLCBleHRlbnNpb25fZGF0YSwgY3VycmVudC0+ZGF0YVtrIC8gOF0gPj4gKDcgLSBrICUgOCksIDAsIDEpOworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhwcm9maWxlX3RpZXJfbGV2ZWwpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1Byb2ZpbGVUaWVyTGV2ZWwgKmN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJvZmlsZV9wcmVzZW50X2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X251bV9zdWJfbGF5ZXJzX21pbnVzMSkKK3sKKyAgICBhdl91bnVzZWQgdW5zaWduZWQgaW50IHplcm8gPSAwOworICAgIGludCBlcnIsIGksIGo7CisKKyAgICBpZiAocHJvZmlsZV9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdSgyLCBnZW5lcmFsX3Byb2ZpbGVfc3BhY2UsIDAsIDApOworICAgICAgICBmbGFnKGdlbmVyYWxfdGllcl9mbGFnKTsKKyAgICAgICAgdSg1LCBnZW5lcmFsX3Byb2ZpbGVfaWRjLCAwLCAzMSk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCisgICAgICAgICAgICBmbGFnKGdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdbal0pOworCisgICAgICAgIGZsYWcoZ2VuZXJhbF9wcm9ncmVzc2l2ZV9zb3VyY2VfZmxhZyk7CisgICAgICAgIGZsYWcoZ2VuZXJhbF9pbnRlcmxhY2VkX3NvdXJjZV9mbGFnKTsKKyAgICAgICAgZmxhZyhnZW5lcmFsX25vbl9wYWNrZWRfY29uc3RyYWludF9mbGFnKTsKKyAgICAgICAgZmxhZyhnZW5lcmFsX2ZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnKTsKKworI2RlZmluZSBwcm9maWxlX2NvbXBhdGlibGUoeCkgKGN1cnJlbnQtPmdlbmVyYWxfcHJvZmlsZV9pZGMgPT0gKHgpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5nZW5lcmFsX3Byb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFnW3hdKQorICAgICAgICBpZiAocHJvZmlsZV9jb21wYXRpYmxlKDQpIHx8IHByb2ZpbGVfY29tcGF0aWJsZSg1KSB8fAorICAgICAgICAgICAgcHJvZmlsZV9jb21wYXRpYmxlKDYpIHx8IHByb2ZpbGVfY29tcGF0aWJsZSg3KSB8fAorICAgICAgICAgICAgcHJvZmlsZV9jb21wYXRpYmxlKDgpIHx8IHByb2ZpbGVfY29tcGF0aWJsZSg5KSB8fAorICAgICAgICAgICAgcHJvZmlsZV9jb21wYXRpYmxlKDEwKSkgeworICAgICAgICAgICAgZmxhZyhnZW5lcmFsX21heF8xMmJpdF9jb25zdHJhaW50X2ZsYWcpOworICAgICAgICAgICAgZmxhZyhnZW5lcmFsX21heF8xMGJpdF9jb25zdHJhaW50X2ZsYWcpOworICAgICAgICAgICAgZmxhZyhnZW5lcmFsX21heF84Yml0X2NvbnN0cmFpbnRfZmxhZyk7CisgICAgICAgICAgICBmbGFnKGdlbmVyYWxfbWF4XzQyMmNocm9tYV9jb25zdHJhaW50X2ZsYWcpOworICAgICAgICAgICAgZmxhZyhnZW5lcmFsX21heF80MjBjaHJvbWFfY29uc3RyYWludF9mbGFnKTsKKyAgICAgICAgICAgIGZsYWcoZ2VuZXJhbF9tYXhfbW9ub2Nocm9tZV9jb25zdHJhaW50X2ZsYWcpOworICAgICAgICAgICAgZmxhZyhnZW5lcmFsX2ludHJhX2NvbnN0cmFpbnRfZmxhZyk7CisgICAgICAgICAgICBmbGFnKGdlbmVyYWxfb25lX3BpY3R1cmVfb25seV9jb25zdHJhaW50X2ZsYWcpOworICAgICAgICAgICAgZmxhZyhnZW5lcmFsX2xvd2VyX2JpdF9yYXRlX2NvbnN0cmFpbnRfZmxhZyk7CisKKyAgICAgICAgICAgIGlmIChwcm9maWxlX2NvbXBhdGlibGUoNSkgfHwgcHJvZmlsZV9jb21wYXRpYmxlKDkpIHx8CisgICAgICAgICAgICAgICAgcHJvZmlsZV9jb21wYXRpYmxlKDEwKSkgeworICAgICAgICAgICAgICAgIGZsYWcoZ2VuZXJhbF9tYXhfMTRiaXRfY29uc3RyYWludF9mbGFnKTsKKyAgICAgICAgICAgICAgICB4dSgyNCwgZ2VuZXJhbF9yZXNlcnZlZF96ZXJvXzMzYml0cywgemVybywgMCwgMCk7CisgICAgICAgICAgICAgICAgeHUoOSwgZ2VuZXJhbF9yZXNlcnZlZF96ZXJvXzMzYml0cywgemVybywgMCwgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHh1KDI0LCBnZW5lcmFsX3Jlc2VydmVkX3plcm9fMzRiaXRzLCB6ZXJvLCAwLCAwKTsKKyAgICAgICAgICAgICAgICB4dSgxMCwgZ2VuZXJhbF9yZXNlcnZlZF96ZXJvXzM0Yml0cywgemVybywgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB4dSgyNCwgZ2VuZXJhbF9yZXNlcnZlZF96ZXJvXzQzYml0cywgemVybywgMCwgMCk7CisgICAgICAgICAgICB4dSgxOSwgZ2VuZXJhbF9yZXNlcnZlZF96ZXJvXzQzYml0cywgemVybywgMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvZmlsZV9jb21wYXRpYmxlKDEpIHx8IHByb2ZpbGVfY29tcGF0aWJsZSgyKSB8fAorICAgICAgICAgICAgcHJvZmlsZV9jb21wYXRpYmxlKDMpIHx8IHByb2ZpbGVfY29tcGF0aWJsZSg0KSB8fAorICAgICAgICAgICAgcHJvZmlsZV9jb21wYXRpYmxlKDUpIHx8IHByb2ZpbGVfY29tcGF0aWJsZSg5KSkgeworICAgICAgICAgICAgZmxhZyhnZW5lcmFsX2luYmxkX2ZsYWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgeHUoMSwgZ2VuZXJhbF9yZXNlcnZlZF96ZXJvX2JpdCwgemVybywgMCwgMCk7CisgICAgICAgIH0KKyN1bmRlZiBwcm9maWxlX2NvbXBhdGlibGUKKyAgICB9CisKKyAgICB1KDgsIGdlbmVyYWxfbGV2ZWxfaWRjLCAwLCAyNTUpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1heF9udW1fc3ViX2xheWVyc19taW51czE7IGkrKykgeworICAgICAgICBmbGFnKHN1Yl9sYXllcl9wcm9maWxlX3ByZXNlbnRfZmxhZ1tpXSk7CisgICAgICAgIGZsYWcoc3ViX2xheWVyX2xldmVsX3ByZXNlbnRfZmxhZ1tpXSk7CisgICAgfQorCisgICAgaWYgKG1heF9udW1fc3ViX2xheWVyc19taW51czEgPiAwKSB7CisgICAgICAgIGZvciAoaSA9IG1heF9udW1fc3ViX2xheWVyc19taW51czE7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGF2X3VudXNlZCBpbnQgemVybyA9IDA7CisgICAgICAgICAgICB4dSgyLCByZXNlcnZlZF96ZXJvXzJiaXRzLCB6ZXJvLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfbnVtX3N1Yl9sYXllcnNfbWludXMxOyBpKyspIHsKKyAgICAgICAgaWYgKGN1cnJlbnQtPnN1Yl9sYXllcl9wcm9maWxlX3ByZXNlbnRfZmxhZ1tpXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPnN1Yl9sYXllcl9sZXZlbF9wcmVzZW50X2ZsYWdbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzdWJfbGF5ZXJfaHJkX3BhcmFtZXRlcnMpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd0hSRFBhcmFtZXRlcnMgKmhyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYWwsIGludCBzdWJfbGF5ZXJfaWQpCit7CisgICAgSDI2NVJhd1N1YkxheWVySFJEUGFyYW1ldGVycyAqY3VycmVudDsKKyAgICBpbnQgZXJyLCBpOworCisgICAgaWYgKG5hbCkKKyAgICAgICAgY3VycmVudCA9ICZocmQtPm5hbF9zdWJfbGF5ZXJfaHJkX3BhcmFtZXRlcnNbc3ViX2xheWVyX2lkXTsKKyAgICBlbHNlCisgICAgICAgIGN1cnJlbnQgPSAmaHJkLT52Y2xfc3ViX2xheWVyX2hyZF9wYXJhbWV0ZXJzW3N1Yl9sYXllcl9pZF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGhyZC0+Y3BiX2NudF9taW51czFbc3ViX2xheWVyX2lkXTsgaSsrKSB7CisgICAgICAgIHVlKGJpdF9yYXRlX3ZhbHVlX21pbnVzMVtpXSwgMCwgVUlOVDMyX01BWCAtIDEpOworICAgICAgICB1ZShjcGJfc2l6ZV92YWx1ZV9taW51czFbaV0sIDAsIFVJTlQzMl9NQVggLSAxKTsKKyAgICAgICAgaWYgKGhyZC0+c3ViX3BpY19ocmRfcGFyYW1zX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgICAgdWUoY3BiX3NpemVfZHVfdmFsdWVfbWludXMxW2ldLCAwLCBVSU5UMzJfTUFYIC0gMSk7CisgICAgICAgICAgICB1ZShiaXRfcmF0ZV9kdV92YWx1ZV9taW51czFbaV0sIDAsIFVJTlQzMl9NQVggLSAxKTsKKyAgICAgICAgfQorICAgICAgICBmbGFnKGNicl9mbGFnW2ldKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKGhyZF9wYXJhbWV0ZXJzKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd0hSRFBhcmFtZXRlcnMgKmN1cnJlbnQsIGludCBjb21tb25faW5mX3ByZXNlbnRfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9udW1fc3ViX2xheWVyc19taW51czEpCit7CisgICAgaW50IGVyciwgaTsKKworICAgIGlmIChjb21tb25faW5mX3ByZXNlbnRfZmxhZykgeworICAgICAgICBmbGFnKG5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpOworICAgICAgICBmbGFnKHZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpOworCisgICAgICAgIGlmIChjdXJyZW50LT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnIHx8CisgICAgICAgICAgICBjdXJyZW50LT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICBmbGFnKHN1Yl9waWNfaHJkX3BhcmFtc19wcmVzZW50X2ZsYWcpOworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN1Yl9waWNfaHJkX3BhcmFtc19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgICAgICB1KDgsIHRpY2tfZGl2aXNvcl9taW51czIsIDAsIDI1NSk7CisgICAgICAgICAgICAgICAgdSg1LCBkdV9jcGJfcmVtb3ZhbF9kZWxheV9pbmNyZW1lbnRfbGVuZ3RoX21pbnVzMSwgMCwgMzEpOworICAgICAgICAgICAgICAgIGZsYWcoc3ViX3BpY19jcGJfcGFyYW1zX2luX3BpY190aW1pbmdfc2VpX2ZsYWcpOworICAgICAgICAgICAgICAgIHUoNSwgZHBiX291dHB1dF9kZWxheV9kdV9sZW5ndGhfbWludXMxLCAwLCAzMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHUoNCwgYml0X3JhdGVfc2NhbGUsIDAsIDE1KTsKKyAgICAgICAgICAgIHUoNCwgY3BiX3NpemVfc2NhbGUsIDAsIDE1KTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5zdWJfcGljX2hyZF9wYXJhbXNfcHJlc2VudF9mbGFnKQorICAgICAgICAgICAgICAgIHUoNCwgY3BiX3NpemVfZHVfc2NhbGUsIDAsIDE1KTsKKworICAgICAgICAgICAgdSg1LCBpbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEsIDAsIDMxKTsKKyAgICAgICAgICAgIHUoNSwgYXVfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSwgICAgICAwLCAzMSk7CisgICAgICAgICAgICB1KDUsIGRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoX21pbnVzMSwgICAgICAgICAgMCwgMzEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mZXIoc3ViX3BpY19ocmRfcGFyYW1zX3ByZXNlbnRfZmxhZywgMCk7CisKKyAgICAgICAgICAgIGluZmVyKGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSwgMjMpOworICAgICAgICAgICAgaW5mZXIoYXVfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSwgICAgICAyMyk7CisgICAgICAgICAgICBpbmZlcihkcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEsICAgICAgICAgIDIzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4X251bV9zdWJfbGF5ZXJzX21pbnVzMTsgaSsrKSB7CisgICAgICAgIGZsYWcoZml4ZWRfcGljX3JhdGVfZ2VuZXJhbF9mbGFnW2ldKTsKKworICAgICAgICBpZiAoIWN1cnJlbnQtPmZpeGVkX3BpY19yYXRlX2dlbmVyYWxfZmxhZ1tpXSkKKyAgICAgICAgICAgIGZsYWcoZml4ZWRfcGljX3JhdGVfd2l0aGluX2N2c19mbGFnW2ldKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mZXIoZml4ZWRfcGljX3JhdGVfd2l0aGluX2N2c19mbGFnW2ldLCAxKTsKKworICAgICAgICBpZiAoY3VycmVudC0+Zml4ZWRfcGljX3JhdGVfd2l0aGluX2N2c19mbGFnW2ldKSB7CisgICAgICAgICAgICB1ZShlbGVtZW50YWxfZHVyYXRpb25faW5fdGNfbWludXMxW2ldLCAwLCAyMDQ3KTsKKyAgICAgICAgICAgIGluZmVyKGxvd19kZWxheV9ocmRfZmxhZ1tpXSwgMCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZmxhZyhsb3dfZGVsYXlfaHJkX2ZsYWdbaV0pOworCisgICAgICAgIGlmICghY3VycmVudC0+bG93X2RlbGF5X2hyZF9mbGFnW2ldKQorICAgICAgICAgICAgdWUoY3BiX2NudF9taW51czFbaV0sIDAsIDMxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mZXIoY3BiX2NudF9taW51czFbaV0sIDApOworCisgICAgICAgIGlmIChjdXJyZW50LT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQorICAgICAgICAgICAgQ0hFQ0soRlVOQyhzdWJfbGF5ZXJfaHJkX3BhcmFtZXRlcnMpKGN0eCwgcncsIGN1cnJlbnQsIDAsIGkpKTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgICAgICBDSEVDSyhGVU5DKHN1Yl9sYXllcl9ocmRfcGFyYW1ldGVycykoY3R4LCBydywgY3VycmVudCwgMSwgaSkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkModnVpX3BhcmFtZXRlcnMpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY1UmF3VlVJICpjdXJyZW50LCBjb25zdCBIMjY1UmF3U1BTICpzcHMpCit7CisgICAgaW50IGVycjsKKworICAgIGZsYWcoYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnKTsKKyAgICBpZiAoY3VycmVudC0+YXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHUoOCwgYXNwZWN0X3JhdGlvX2lkYywgMCwgMjU1KTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPmFzcGVjdF9yYXRpb19pZGMgPT0gMjU1KSB7CisgICAgICAgICAgICB1KDE2LCBzYXJfd2lkdGgsICAwLCA2NTUzNSk7CisgICAgICAgICAgICB1KDE2LCBzYXJfaGVpZ2h0LCAwLCA2NTUzNSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbmZlcihhc3BlY3RfcmF0aW9faWRjLCAwKTsKKyAgICB9CisKKyAgICBmbGFnKG92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnKTsKKyAgICBpZiAoY3VycmVudC0+b3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWcpCisgICAgICAgIGZsYWcob3ZlcnNjYW5fYXBwcm9wcmlhdGVfZmxhZyk7CisKKyAgICBmbGFnKHZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZykgeworICAgICAgICB1KDMsIHZpZGVvX2Zvcm1hdCwgMCwgNyk7CisgICAgICAgIGZsYWcodmlkZW9fZnVsbF9yYW5nZV9mbGFnKTsKKyAgICAgICAgZmxhZyhjb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgIHUoOCwgY29sb3VyX3ByaW1hcmllcywgICAgICAgICAwLCAyNTUpOworICAgICAgICAgICAgdSg4LCB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MsIDAsIDI1NSk7CisgICAgICAgICAgICB1KDgsIG1hdHJpeF9jb2VmZmljaWVudHMsICAgICAgMCwgMjU1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluZmVyKGNvbG91cl9wcmltYXJpZXMsICAgICAgICAgMik7CisgICAgICAgICAgICBpbmZlcih0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MsIDIpOworICAgICAgICAgICAgaW5mZXIobWF0cml4X2NvZWZmaWNpZW50cywgICAgICAyKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGluZmVyKHZpZGVvX2Zvcm1hdCwgICAgICAgICAgICAgNSk7CisgICAgICAgIGluZmVyKHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZywgICAgMCk7CisgICAgICAgIGluZmVyKGNvbG91cl9wcmltYXJpZXMsICAgICAgICAgMik7CisgICAgICAgIGluZmVyKHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcywgMik7CisgICAgICAgIGluZmVyKG1hdHJpeF9jb2VmZmljaWVudHMsICAgICAgMik7CisgICAgfQorCisgICAgZmxhZyhjaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnKTsKKyAgICBpZiAoY3VycmVudC0+Y2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZykgeworICAgICAgICB1ZShjaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZCwgICAgMCwgNSk7CisgICAgICAgIHVlKGNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkLCAwLCA1KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZlcihjaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZCwgICAgMCk7CisgICAgICAgIGluZmVyKGNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkLCAwKTsKKyAgICB9CisKKyAgICBmbGFnKG5ldXRyYWxfY2hyb21hX2luZGljYXRpb25fZmxhZyk7CisgICAgZmxhZyhmaWVsZF9zZXFfZmxhZyk7CisgICAgZmxhZyhmcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZyk7CisKKyAgICBmbGFnKGRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPmRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZykgeworICAgICAgICB1ZShkZWZfZGlzcF93aW5fbGVmdF9vZmZzZXQsICAgMCwgMTYzODQpOworICAgICAgICB1ZShkZWZfZGlzcF93aW5fcmlnaHRfb2Zmc2V0LCAgMCwgMTYzODQpOworICAgICAgICB1ZShkZWZfZGlzcF93aW5fdG9wX29mZnNldCwgICAgMCwgMTYzODQpOworICAgICAgICB1ZShkZWZfZGlzcF93aW5fYm90dG9tX29mZnNldCwgMCwgMTYzODQpOworICAgIH0KKworICAgIGZsYWcodnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPnZ1aV90aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdSgzMiwgdnVpX251bV91bml0c19pbl90aWNrLCAxLCBVSU5UMzJfTUFYKTsKKyAgICAgICAgdSgzMiwgdnVpX3RpbWVfc2NhbGUsICAgICAgICAxLCBVSU5UMzJfTUFYKTsKKyAgICAgICAgZmxhZyh2dWlfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZyk7CisgICAgICAgIGlmIChjdXJyZW50LT52dWlfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZykKKyAgICAgICAgICAgIHVlKHZ1aV9udW1fdGlja3NfcG9jX2RpZmZfb25lX21pbnVzMSwgMCwgVUlOVDMyX01BWCAtIDEpOworCisgICAgICAgIGZsYWcodnVpX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyk7CisgICAgICAgIGlmIChjdXJyZW50LT52dWlfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICBDSEVDSyhGVU5DKGhyZF9wYXJhbWV0ZXJzKShjdHgsIHJ3LCAmY3VycmVudC0+aHJkX3BhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBzcHMtPnNwc19tYXhfc3ViX2xheWVyc19taW51czEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsYWcoYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZykgeworICAgICAgICBmbGFnKHRpbGVzX2ZpeGVkX3N0cnVjdHVyZV9mbGFnKTsKKyAgICAgICAgZmxhZyhtb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcpOworICAgICAgICBmbGFnKHJlc3RyaWN0ZWRfcmVmX3BpY19saXN0c19mbGFnKTsKKyAgICAgICAgdWUobWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYywgIDAsIDQwOTUpOworICAgICAgICB1ZShtYXhfYnl0ZXNfcGVyX3BpY19kZW5vbSwgICAgICAgMCwgMTYpOworICAgICAgICB1ZShtYXhfYml0c19wZXJfbWluX2N1X2Rlbm9tLCAgICAgMCwgMTYpOworICAgICAgICB1ZShsb2cyX21heF9tdl9sZW5ndGhfaG9yaXpvbnRhbCwgMCwgMTYpOworICAgICAgICB1ZShsb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwsICAgMCwgMTYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZmVyKHRpbGVzX2ZpeGVkX3N0cnVjdHVyZV9mbGFnLCAgICAwKTsKKyAgICAgICAgaW5mZXIobW90aW9uX3ZlY3RvcnNfb3Zlcl9waWNfYm91bmRhcmllc19mbGFnLCAxKTsKKyAgICAgICAgaW5mZXIobWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYywgIDApOworICAgICAgICBpbmZlcihtYXhfYnl0ZXNfcGVyX3BpY19kZW5vbSwgICAgICAgMik7CisgICAgICAgIGluZmVyKG1heF9iaXRzX3Blcl9taW5fY3VfZGVub20sICAgICAxKTsKKyAgICAgICAgaW5mZXIobG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWwsIDE1KTsKKyAgICAgICAgaW5mZXIobG9nMl9tYXhfbXZfbGVuZ3RoX3ZlcnRpY2FsLCAgIDE1KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKHZwcykoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICBIMjY1UmF3VlBTICpjdXJyZW50KQoreworICAgIGludCBlcnIsIGksIGo7CisKKyAgICBIRUFERVIoIlZpZGVvIFBhcmFtZXRlciBTZXQiKTsKKworICAgIENIRUNLKEZVTkMobmFsX3VuaXRfaGVhZGVyKShjdHgsIHJ3LCAmY3VycmVudC0+bmFsX3VuaXRfaGVhZGVyLCBIRVZDX05BTF9WUFMpKTsKKworICAgIHUoNCwgdnBzX3ZpZGVvX3BhcmFtZXRlcl9zZXRfaWQsIDAsIDE1KTsKKworICAgIGZsYWcodnBzX2Jhc2VfbGF5ZXJfaW50ZXJuYWxfZmxhZyk7CisgICAgZmxhZyh2cHNfYmFzZV9sYXllcl9hdmFpbGFibGVfZmxhZyk7CisgICAgdSg2LCB2cHNfbWF4X2xheWVyc19taW51czEsICAgICAwLCBIRVZDX01BWF9MQVlFUlMgLSAxKTsKKyAgICB1KDMsIHZwc19tYXhfc3ViX2xheWVyc19taW51czEsIDAsIEhFVkNfTUFYX1NVQl9MQVlFUlMgLSAxKTsKKyAgICBmbGFnKHZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcpOworCisgICAgaWYgKGN1cnJlbnQtPnZwc19tYXhfc3ViX2xheWVyc19taW51czEgPT0gMCAmJgorICAgICAgICBjdXJyZW50LT52cHNfdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzdHJlYW06ICIKKyAgICAgICAgICAgICAgICJ2cHNfdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnIG11c3QgYmUgMSBpZiAiCisgICAgICAgICAgICAgICAidnBzX21heF9zdWJfbGF5ZXJzX21pbnVzMSBpcyAwLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHsKKyAgICAgICAgYXZfdW51c2VkIHVpbnQxNl90IGZmZmYgPSAweGZmZmY7CisgICAgICAgIHh1KDE2LCB2cHNfcmVzZXJ2ZWRfMHhmZmZmXzE2Yml0cywgZmZmZiwgMHhmZmZmLCAweGZmZmYpOworICAgIH0KKworICAgIENIRUNLKEZVTkMocHJvZmlsZV90aWVyX2xldmVsKShjdHgsIHJ3LCAmY3VycmVudC0+cHJvZmlsZV90aWVyX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBjdXJyZW50LT52cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxKSk7CisKKyAgICBmbGFnKHZwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWcpOworICAgIGZvciAoaSA9IChjdXJyZW50LT52cHNfc3ViX2xheWVyX29yZGVyaW5nX2luZm9fcHJlc2VudF9mbGFnID8KKyAgICAgICAgICAgICAgMCA6IGN1cnJlbnQtPnZwc19tYXhfc3ViX2xheWVyc19taW51czEpOworICAgICAgICAgaSA8PSBjdXJyZW50LT52cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxOyBpKyspIHsKKyAgICAgICAgdWUodnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFbaV0sIDAsIEhFVkNfTUFYX0RQQl9TSVpFIC0gMSk7CisgICAgICAgIHVlKHZwc19tYXhfbnVtX3Jlb3JkZXJfcGljc1tpXSwgICAgICAgICAwLCBjdXJyZW50LT52cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMVtpXSk7CisgICAgICAgIHVlKHZwc19tYXhfbGF0ZW5jeV9pbmNyZWFzZV9wbHVzMVtpXSwgICAwLCBVSU5UMzJfTUFYIC0gMSk7CisgICAgfQorICAgIGlmICghY3VycmVudC0+dnBzX3N1Yl9sYXllcl9vcmRlcmluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VycmVudC0+dnBzX21heF9zdWJfbGF5ZXJzX21pbnVzMTsgaSsrKSB7CisgICAgICAgICAgICBpbmZlcih2cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMVtpXSwKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxW2N1cnJlbnQtPnZwc19tYXhfc3ViX2xheWVyc19taW51czFdKTsKKyAgICAgICAgICAgIGluZmVyKHZwc19tYXhfbnVtX3Jlb3JkZXJfcGljc1tpXSwKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnZwc19tYXhfbnVtX3Jlb3JkZXJfcGljc1tjdXJyZW50LT52cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxXSk7CisgICAgICAgICAgICBpbmZlcih2cHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VfcGx1czFbaV0sCisgICAgICAgICAgICAgICAgICBjdXJyZW50LT52cHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VfcGx1czFbY3VycmVudC0+dnBzX21heF9zdWJfbGF5ZXJzX21pbnVzMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgdSg2LCB2cHNfbWF4X2xheWVyX2lkLCAgICAgICAgMCwgSEVWQ19NQVhfTEFZRVJTIC0gMSk7CisgICAgdWUodnBzX251bV9sYXllcl9zZXRzX21pbnVzMSwgMCwgSEVWQ19NQVhfTEFZRVJfU0VUUyAtIDEpOworICAgIGZvciAoaSA9IDE7IGkgPD0gY3VycmVudC0+dnBzX251bV9sYXllcl9zZXRzX21pbnVzMTsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gY3VycmVudC0+dnBzX21heF9sYXllcl9pZDsgaisrKQorICAgICAgICAgICAgZmxhZyhsYXllcl9pZF9pbmNsdWRlZF9mbGFnW2ldW2pdKTsKKyAgICB9CisgICAgZm9yIChqID0gMDsgaiA8PSBjdXJyZW50LT52cHNfbWF4X2xheWVyX2lkOyBqKyspCisgICAgICAgIGluZmVyKGxheWVyX2lkX2luY2x1ZGVkX2ZsYWdbMF1bal0sIGogPT0gMCk7CisKKyAgICBmbGFnKHZwc190aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpOworICAgIGlmIChjdXJyZW50LT52cHNfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHUoMzIsIHZwc19udW1fdW5pdHNfaW5fdGljaywgMSwgVUlOVDMyX01BWCk7CisgICAgICAgIHUoMzIsIHZwc190aW1lX3NjYWxlLCAgICAgICAgMSwgVUlOVDMyX01BWCk7CisgICAgICAgIGZsYWcodnBzX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcpOworICAgICAgICBpZiAoY3VycmVudC0+dnBzX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcpCisgICAgICAgICAgICB1ZSh2cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czEsIDAsIFVJTlQzMl9NQVggLSAxKTsKKyAgICAgICAgdWUodnBzX251bV9ocmRfcGFyYW1ldGVycywgMCwgY3VycmVudC0+dnBzX251bV9sYXllcl9zZXRzX21pbnVzMSArIDEpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VycmVudC0+dnBzX251bV9ocmRfcGFyYW1ldGVyczsgaSsrKSB7CisgICAgICAgICAgICB1ZShocmRfbGF5ZXJfc2V0X2lkeFtpXSwKKyAgICAgICAgICAgICAgIGN1cnJlbnQtPnZwc19iYXNlX2xheWVyX2ludGVybmFsX2ZsYWcgPyAwIDogMSwKKyAgICAgICAgICAgICAgIGN1cnJlbnQtPnZwc19udW1fbGF5ZXJfc2V0c19taW51czEpOworICAgICAgICAgICAgaWYgKGkgPiAwKQorICAgICAgICAgICAgICAgIGZsYWcoY3BybXNfcHJlc2VudF9mbGFnW2ldKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmZlcihjcHJtc19wcmVzZW50X2ZsYWdbMF0sIDEpOworCisgICAgICAgICAgICBDSEVDSyhGVU5DKGhyZF9wYXJhbWV0ZXJzKShjdHgsIHJ3LCAmY3VycmVudC0+aHJkX3BhcmFtZXRlcnNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5jcHJtc19wcmVzZW50X2ZsYWdbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT52cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbGFnKHZwc19leHRlbnNpb25fZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPnZwc19leHRlbnNpb25fZmxhZykKKyAgICAgICAgQ0hFQ0soRlVOQyhleHRlbnNpb25fZGF0YSkoY3R4LCBydywgJmN1cnJlbnQtPmV4dGVuc2lvbl9kYXRhKSk7CisKKyAgICBDSEVDSyhGVU5DKHJic3BfdHJhaWxpbmdfYml0cykoY3R4LCBydykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzdF9yZWZfcGljX3NldCkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjVSYXdTVFJlZlBpY1NldCAqY3VycmVudCwgaW50IHN0X3Jwc19pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEgyNjVSYXdTUFMgKnNwcykKK3sKKyAgICBpbnQgZXJyLCBpLCBqOworCisgICAgaWYgKHN0X3Jwc19pZHggIT0gMCkKKyAgICAgICAgZmxhZyhpbnRlcl9yZWZfcGljX3NldF9wcmVkaWN0aW9uX2ZsYWcpOworICAgIGVsc2UKKyAgICAgICAgaW5mZXIoaW50ZXJfcmVmX3BpY19zZXRfcHJlZGljdGlvbl9mbGFnLCAwKTsKKworICAgIGlmIChjdXJyZW50LT5pbnRlcl9yZWZfcGljX3NldF9wcmVkaWN0aW9uX2ZsYWcpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHJlZl9ycHNfaWR4LCBudW1fZGVsdGFfcG9jczsKKyAgICAgICAgY29uc3QgSDI2NVJhd1NUUmVmUGljU2V0ICpyZWY7CisgICAgICAgIGludCBkZWx0YV9ycHMsIGRfcG9jOworICAgICAgICBpbnQgcmVmX2RlbHRhX3BvY19zMFtIRVZDX01BWF9SRUZTXSwgcmVmX2RlbHRhX3BvY19zMVtIRVZDX01BWF9SRUZTXTsKKyAgICAgICAgaW50IGRlbHRhX3BvY19zMFtIRVZDX01BWF9SRUZTXSwgZGVsdGFfcG9jX3MxW0hFVkNfTUFYX1JFRlNdOworICAgICAgICB1aW50OF90IHVzZWRfYnlfY3Vycl9waWNfczBbSEVWQ19NQVhfUkVGU10sCisgICAgICAgICAgICAgICAgdXNlZF9ieV9jdXJyX3BpY19zMVtIRVZDX01BWF9SRUZTXTsKKworICAgICAgICBpZiAoc3RfcnBzX2lkeCA9PSBzcHMtPm51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0cykKKyAgICAgICAgICAgIHVlKGRlbHRhX2lkeF9taW51czEsIDAsIHN0X3Jwc19pZHggLSAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mZXIoZGVsdGFfaWR4X21pbnVzMSwgMCk7CisKKyAgICAgICAgcmVmX3Jwc19pZHggPSBzdF9ycHNfaWR4IC0gKGN1cnJlbnQtPmRlbHRhX2lkeF9taW51czEgKyAxKTsKKyAgICAgICAgcmVmID0gJnNwcy0+c3RfcmVmX3BpY19zZXRbcmVmX3Jwc19pZHhdOworICAgICAgICBudW1fZGVsdGFfcG9jcyA9IHJlZi0+bnVtX25lZ2F0aXZlX3BpY3MgKyByZWYtPm51bV9wb3NpdGl2ZV9waWNzOworCisgICAgICAgIGZsYWcoZGVsdGFfcnBzX3NpZ24pOworICAgICAgICB1ZShhYnNfZGVsdGFfcnBzX21pbnVzMSwgMCwgSU5UMTZfTUFYKTsKKyAgICAgICAgZGVsdGFfcnBzID0gKDEgLSAyICogY3VycmVudC0+ZGVsdGFfcnBzX3NpZ24pICoKKyAgICAgICAgICAgIChjdXJyZW50LT5hYnNfZGVsdGFfcnBzX21pbnVzMSArIDEpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gbnVtX2RlbHRhX3BvY3M7IGorKykgeworICAgICAgICAgICAgZmxhZyh1c2VkX2J5X2N1cnJfcGljX2ZsYWdbal0pOworICAgICAgICAgICAgaWYgKCFjdXJyZW50LT51c2VkX2J5X2N1cnJfcGljX2ZsYWdbal0pCisgICAgICAgICAgICAgICAgZmxhZyh1c2VfZGVsdGFfZmxhZ1tqXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5mZXIodXNlX2RlbHRhX2ZsYWdbal0sIDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2luY2UgdGhlIHN0b3JlZCBmb3JtIG9mIGFuIFJQUyBoZXJlIGlzIGFjdHVhbGx5IHRoZSBkZWx0YS1zdGVwCisgICAgICAgIC8vIGZvcm0gdXNlZCB3aGVuIGludGVyX3JlZl9waWNfc2V0X3ByZWRpY3Rpb25fZmxhZyBpcyBub3Qgc2V0LCB3ZQorICAgICAgICAvLyBuZWVkIHRvIHJlY29uc3RydWN0IHRoYXQgaGVyZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHJlZmVyIHRvCisgICAgICAgIC8vIHRoZSBSUFMgbGF0ZXIgKHdoaWNoIGlzIHJlcXVpcmVkIGZvciBwYXJzaW5nLCBiZWNhdXNlIHdlIGRvbid0CisgICAgICAgIC8vIGV2ZW4ga25vdyB3aGF0IHN5bnRheCBlbGVtZW50cyBhcHBlYXIgd2l0aG91dCBpdCkuICBUaGVyZWZvcmUsCisgICAgICAgIC8vIHRoaXMgY29kZSB0YWtlcyB0aGUgZGVsdGEtc3RlcCBmb3JtIG9mIHRoZSByZWZlcmVuY2Ugc2V0LCB0dXJucworICAgICAgICAvLyBpdCBpbnRvIHRoZSBkZWx0YS1hcnJheSBmb3JtLCBhcHBsaWVzIHRoZSBwcmVkaWN0aW9uIHByb2Nlc3Mgb2YKKyAgICAgICAgLy8gNy40LjgsIGNvbnZlcnRzIHRoZSByZXN1bHQgYmFjayB0byB0aGUgZGVsdGEtc3RlcCBmb3JtLCBhbmQKKyAgICAgICAgLy8gc3RvcmVzIHRoYXQgYXMgdGhlIGN1cnJlbnQgc2V0IGZvciBmdXR1cmUgdXNlLiAgTm90ZSB0aGF0IHRoZQorICAgICAgICAvLyBpbmZlcmVuY2VzIGhlcmUgbWVhbiB0aGF0IHdyaXRlcnMgdXNpbmcgcHJlZGljdGlvbiB3aWxsIG5lZWQKKyAgICAgICAgLy8gdG8gZmlsbCBpbiB0aGUgZGVsdGEtc3RlcCB2YWx1ZXMgY29ycmVjdGx5IGFzIHdlbGwgLSBzaW5jZSB0aGUKKyAgICAgICAgLy8gd2hvbGUgUlBTIHByZWRpY3Rpb24gcHJvY2VzcyBpcyBzb21ld2hhdCBvdmVybHkgc29waGlzdGljYXRlZCwKKyAgICAgICAgLy8gdGhpcyBob3BlZnVsbHkgZm9ybXMgYSB1c2VmdWwgY2hlY2sgZm9yIHRoZW0gdG8gZW5zdXJlIHRoZWlyCisgICAgICAgIC8vIHByZWRpY3RlZCBmb3JtIGFjdHVhbGx5IG1hdGNoZXMgd2hhdCB3YXMgaW50ZW5kZWQgcmF0aGVyIHRoYW4KKyAgICAgICAgLy8gYW4gb25lcm91cyBhZGRpdGlvbmFsIHJlcXVpcmVtZW50LgorCisgICAgICAgIGRfcG9jID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJlZi0+bnVtX25lZ2F0aXZlX3BpY3M7IGkrKykgeworICAgICAgICAgICAgZF9wb2MgLT0gcmVmLT5kZWx0YV9wb2NfczBfbWludXMxW2ldICsgMTsKKyAgICAgICAgICAgIHJlZl9kZWx0YV9wb2NfczBbaV0gPSBkX3BvYzsKKyAgICAgICAgfQorICAgICAgICBkX3BvYyA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZWYtPm51bV9wb3NpdGl2ZV9waWNzOyBpKyspIHsKKyAgICAgICAgICAgIGRfcG9jICs9IHJlZi0+ZGVsdGFfcG9jX3MxX21pbnVzMVtpXSArIDE7CisgICAgICAgICAgICByZWZfZGVsdGFfcG9jX3MxW2ldID0gZF9wb2M7CisgICAgICAgIH0KKworICAgICAgICBpID0gMDsKKyAgICAgICAgZm9yIChqID0gcmVmLT5udW1fcG9zaXRpdmVfcGljcyAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICBkX3BvYyA9IHJlZl9kZWx0YV9wb2NfczFbal0gKyBkZWx0YV9ycHM7CisgICAgICAgICAgICBpZiAoZF9wb2MgPCAwICYmIGN1cnJlbnQtPnVzZV9kZWx0YV9mbGFnW3JlZi0+bnVtX25lZ2F0aXZlX3BpY3MgKyBqXSkgeworICAgICAgICAgICAgICAgIGRlbHRhX3BvY19zMFtpXSA9IGRfcG9jOworICAgICAgICAgICAgICAgIHVzZWRfYnlfY3Vycl9waWNfczBbaSsrXSA9CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnVzZWRfYnlfY3Vycl9waWNfZmxhZ1tyZWYtPm51bV9uZWdhdGl2ZV9waWNzICsgal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlbHRhX3JwcyA8IDAgJiYgY3VycmVudC0+dXNlX2RlbHRhX2ZsYWdbbnVtX2RlbHRhX3BvY3NdKSB7CisgICAgICAgICAgICBkZWx0YV9wb2NfczBbaV0gPSBkZWx0YV9ycHM7CisgICAgICAgICAgICB1c2VkX2J5X2N1cnJfcGljX3MwW2krK10gPQorICAgICAgICAgICAgICAgIGN1cnJlbnQtPnVzZWRfYnlfY3Vycl9waWNfZmxhZ1tudW1fZGVsdGFfcG9jc107CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHJlZi0+bnVtX25lZ2F0aXZlX3BpY3M7IGorKykgeworICAgICAgICAgICAgZF9wb2MgPSByZWZfZGVsdGFfcG9jX3MwW2pdICsgZGVsdGFfcnBzOworICAgICAgICAgICAgaWYgKGRfcG9jIDwgMCAmJiBjdXJyZW50LT51c2VfZGVsdGFfZmxhZ1tqXSkgeworICAgICAgICAgICAgICAgIGRlbHRhX3BvY19zMFtpXSA9IGRfcG9jOworICAgICAgICAgICAgICAgIHVzZWRfYnlfY3Vycl9waWNfczBbaSsrXSA9IGN1cnJlbnQtPnVzZWRfYnlfY3Vycl9waWNfZmxhZ1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZmVyKG51bV9uZWdhdGl2ZV9waWNzLCBpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnQtPm51bV9uZWdhdGl2ZV9waWNzOyBpKyspIHsKKyAgICAgICAgICAgIGluZmVyKGRlbHRhX3BvY19zMF9taW51czFbaV0sCisgICAgICAgICAgICAgICAgICAtKGRlbHRhX3BvY19zMFtpXSAtIChpID09IDAgPyAwIDogZGVsdGFfcG9jX3MwW2kgLSAxXSkpIC0gMSk7CisgICAgICAgICAgICBpbmZlcih1c2VkX2J5X2N1cnJfcGljX3MwX2ZsYWdbaV0sIHVzZWRfYnlfY3Vycl9waWNfczBbaV0pOworICAgICAgICB9CisKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGZvciAoaiA9IHJlZi0+bnVtX25lZ2F0aXZlX3BpY3MgLSAxOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgZF9wb2MgPSByZWZfZGVsdGFfcG9jX3MwW2pdICsgZGVsdGFfcnBzOworICAgICAgICAgICAgaWYgKGRfcG9jID4gMCAmJiBjdXJyZW50LT51c2VfZGVsdGFfZmxhZ1tqXSkgeworICAgICAgICAgICAgICAgIGRlbHRhX3BvY19zMVtpXSA9IGRfcG9jOworICAgICAgICAgICAgICAgIHVzZWRfYnlfY3Vycl9waWNfczFbaSsrXSA9IGN1cnJlbnQtPnVzZWRfYnlfY3Vycl9waWNfZmxhZ1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZGVsdGFfcnBzID4gMCAmJiBjdXJyZW50LT51c2VfZGVsdGFfZmxhZ1tudW1fZGVsdGFfcG9jc10pIHsKKyAgICAgICAgICAgIGRlbHRhX3BvY19zMVtpXSA9IGRlbHRhX3JwczsKKyAgICAgICAgICAgIHVzZWRfYnlfY3Vycl9waWNfczFbaSsrXSA9CisgICAgICAgICAgICAgICAgY3VycmVudC0+dXNlZF9ieV9jdXJyX3BpY19mbGFnW251bV9kZWx0YV9wb2NzXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmVmLT5udW1fcG9zaXRpdmVfcGljczsgaisrKSB7CisgICAgICAgICAgICBkX3BvYyA9IHJlZl9kZWx0YV9wb2NfczFbal0gKyBkZWx0YV9ycHM7CisgICAgICAgICAgICBpZiAoZF9wb2MgPiAwICYmIGN1cnJlbnQtPnVzZV9kZWx0YV9mbGFnW3JlZi0+bnVtX25lZ2F0aXZlX3BpY3MgKyBqXSkgeworICAgICAgICAgICAgICAgIGRlbHRhX3BvY19zMVtpXSA9IGRfcG9jOworICAgICAgICAgICAgICAgIHVzZWRfYnlfY3Vycl9waWNfczFbaSsrXSA9CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnVzZWRfYnlfY3Vycl9waWNfZmxhZ1tyZWYtPm51bV9uZWdhdGl2ZV9waWNzICsgal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmZlcihudW1fcG9zaXRpdmVfcGljcywgaSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5udW1fcG9zaXRpdmVfcGljczsgaSsrKSB7CisgICAgICAgICAgICBpbmZlcihkZWx0YV9wb2NfczFfbWludXMxW2ldLAorICAgICAgICAgICAgICAgICAgZGVsdGFfcG9jX3MxW2ldIC0gKGkgPT0gMCA/IDAgOiBkZWx0YV9wb2NfczFbaSAtIDFdKSAtIDEpOworICAgICAgICAgICAgaW5mZXIodXNlZF9ieV9jdXJyX3BpY19zMV9mbGFnW2ldLCB1c2VkX2J5X2N1cnJfcGljX3MxW2ldKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgdWUobnVtX25lZ2F0aXZlX3BpY3MsIDAsIDE1KTsKKyAgICAgICAgdWUobnVtX3Bvc2l0aXZlX3BpY3MsIDAsIDE1IC0gY3VycmVudC0+bnVtX25lZ2F0aXZlX3BpY3MpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5udW1fbmVnYXRpdmVfcGljczsgaSsrKSB7CisgICAgICAgICAgICB1ZShkZWx0YV9wb2NfczBfbWludXMxW2ldLCAwLCBJTlQxNl9NQVgpOworICAgICAgICAgICAgZmxhZyh1c2VkX2J5X2N1cnJfcGljX3MwX2ZsYWdbaV0pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnQtPm51bV9wb3NpdGl2ZV9waWNzOyBpKyspIHsKKyAgICAgICAgICAgIHVlKGRlbHRhX3BvY19zMV9taW51czFbaV0sIDAsIElOVDE2X01BWCk7CisgICAgICAgICAgICBmbGFnKHVzZWRfYnlfY3Vycl9waWNfczFfZmxhZ1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKHNjYWxpbmdfbGlzdF9kYXRhKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1NjYWxpbmdMaXN0ICpjdXJyZW50KQoreworICAgIGludCBzaXplSWQsIG1hdHJpeElkOworICAgIGludCBlcnIsIG4sIGk7CisKKyAgICBmb3IgKHNpemVJZCA9IDA7IHNpemVJZCA8IDQ7IHNpemVJZCsrKSB7CisgICAgICAgIGZvciAobWF0cml4SWQgPSAwOyBtYXRyaXhJZCA8IDY7IG1hdHJpeElkICs9IChzaXplSWQgPT0gMyA/IDMgOiAxKSkgeworICAgICAgICAgICAgZmxhZyhzY2FsaW5nX2xpc3RfcHJlZF9tb2RlX2ZsYWdbc2l6ZUlkXVttYXRyaXhJZF0pOworICAgICAgICAgICAgaWYgKCFjdXJyZW50LT5zY2FsaW5nX2xpc3RfcHJlZF9tb2RlX2ZsYWdbc2l6ZUlkXVttYXRyaXhJZF0pIHsKKyAgICAgICAgICAgICAgICB1ZShzY2FsaW5nX2xpc3RfcHJlZF9tYXRyaXhfaWRfZGVsdGFbc2l6ZUlkXVttYXRyaXhJZF0sCisgICAgICAgICAgICAgICAgICAgMCwgc2l6ZUlkID09IDMgPyBtYXRyaXhJZCAvIDMgOiBtYXRyaXhJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG4gPSBGRk1JTig2NCwgMSA8PCAoNCArIChzaXplSWQgPDwgMSkpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZUlkID4gMSkKKyAgICAgICAgICAgICAgICAgICAgc2Uoc2NhbGluZ19saXN0X2RjX2NvZWZfbWludXM4W3NpemVJZCAtIDJdW21hdHJpeElkXSwgLTcsICsyNDcpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgeHNlKHNjYWxpbmdfbGlzdF9kZWx0YV9jb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnNjYWxpbmdfbGlzdF9kZWx0YV9jb2VmZltzaXplSWRdW21hdHJpeElkXVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0xMjgsICsxMjcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoc3BzX3JhbmdlX2V4dGVuc2lvbikoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1NQUyAqY3VycmVudCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgZmxhZyh0cmFuc2Zvcm1fc2tpcF9yb3RhdGlvbl9lbmFibGVkX2ZsYWcpOworICAgIGZsYWcodHJhbnNmb3JtX3NraXBfY29udGV4dF9lbmFibGVkX2ZsYWcpOworICAgIGZsYWcoaW1wbGljaXRfcmRwY21fZW5hYmxlZF9mbGFnKTsKKyAgICBmbGFnKGV4cGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZyk7CisgICAgZmxhZyhleHRlbmRlZF9wcmVjaXNpb25fcHJvY2Vzc2luZ19mbGFnKTsKKyAgICBmbGFnKGludHJhX3Ntb290aGluZ19kaXNhYmxlZF9mbGFnKTsKKyAgICBmbGFnKGhpZ2hfcHJlY2lzaW9uX29mZnNldHNfZW5hYmxlZF9mbGFnKTsKKyAgICBmbGFnKHBlcnNpc3RlbnRfcmljZV9hZGFwdGF0aW9uX2VuYWJsZWRfZmxhZyk7CisgICAgZmxhZyhjYWJhY19ieXBhc3NfYWxpZ25tZW50X2VuYWJsZWRfZmxhZyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKHNwc19zY2NfZXh0ZW5zaW9uKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1NQUyAqY3VycmVudCkKK3sKKyAgICBpbnQgZXJyLCBjb21wLCBpOworCisgICAgZmxhZyhzcHNfY3Vycl9waWNfcmVmX2VuYWJsZWRfZmxhZyk7CisKKyAgICBmbGFnKHBhbGV0dGVfbW9kZV9lbmFibGVkX2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5wYWxldHRlX21vZGVfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIHVlKHBhbGV0dGVfbWF4X3NpemUsIDAsIDY0KTsKKyAgICAgICAgdWUoZGVsdGFfcGFsZXR0ZV9tYXhfcHJlZGljdG9yX3NpemUsIDAsIDEyOCk7CisKKyAgICAgICAgZmxhZyhzcHNfcGFsZXR0ZV9wcmVkaWN0b3JfaW5pdGlhbGl6ZXJfcHJlc2VudF9mbGFnKTsKKyAgICAgICAgaWYgKGN1cnJlbnQtPnNwc19wYWxldHRlX3ByZWRpY3Rvcl9pbml0aWFsaXplcl9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgIHVlKHNwc19udW1fcGFsZXR0ZV9wcmVkaWN0b3JfaW5pdGlhbGl6ZXJfbWludXMxLCAwLCAxMjgpOworICAgICAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IChjdXJyZW50LT5jaHJvbWFfZm9ybWF0X2lkYyA/IDMgOiAxKTsgY29tcCsrKSB7CisgICAgICAgICAgICAgICAgaW50IGJpdF9kZXB0aCA9IGNvbXAgPT0gMCA/IGN1cnJlbnQtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCArIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3VycmVudC0+Yml0X2RlcHRoX2Nocm9tYV9taW51czggKyA4OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY3VycmVudC0+c3BzX251bV9wYWxldHRlX3ByZWRpY3Rvcl9pbml0aWFsaXplcl9taW51czE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdShiaXRfZGVwdGgsIHNwc19wYWxldHRlX3ByZWRpY3Rvcl9pbml0aWFsaXplcnNbY29tcF1baV0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgTUFYX1VJTlRfQklUUyhiaXRfZGVwdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHUoMiwgbW90aW9uX3ZlY3Rvcl9yZXNvbHV0aW9uX2NvbnRyb2xfaWRjLCAwLCAyKTsKKyAgICBmbGFnKGludHJhX2JvdW5kYXJ5X2ZpbHRlcmluZ19kaXNhYmxlX2ZsYWcpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhzcHMpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1NQUyAqY3VycmVudCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbUgyNjVDb250ZXh0ICpoMjY1ID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgSDI2NVJhd1ZQUyAqdnBzOworICAgIGludCBlcnIsIGk7CisgICAgdW5zaWduZWQgaW50IG1pbl9jYl9sb2cyX3NpemVfeSwgY3RiX2xvZzJfc2l6ZV95LAorICAgICAgICAgICAgICAgICBtaW5fY2Jfc2l6ZV95LCAgIG1pbl90Yl9sb2cyX3NpemVfeTsKKworICAgIEhFQURFUigiU2VxdWVuY2UgUGFyYW1ldGVyIFNldCIpOworCisgICAgQ0hFQ0soRlVOQyhuYWxfdW5pdF9oZWFkZXIpKGN0eCwgcncsICZjdXJyZW50LT5uYWxfdW5pdF9oZWFkZXIsIEhFVkNfTkFMX1NQUykpOworCisgICAgdSg0LCBzcHNfdmlkZW9fcGFyYW1ldGVyX3NldF9pZCwgMCwgMTUpOworICAgIGgyNjUtPmFjdGl2ZV92cHMgPSB2cHMgPSBoMjY1LT52cHNbY3VycmVudC0+c3BzX3ZpZGVvX3BhcmFtZXRlcl9zZXRfaWRdOworCisgICAgdSgzLCBzcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxLCAwLCBIRVZDX01BWF9TVUJfTEFZRVJTIC0gMSk7CisgICAgZmxhZyhzcHNfdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnKTsKKyAgICBpZiAodnBzKSB7CisgICAgICAgIGlmICh2cHMtPnZwc19tYXhfc3ViX2xheWVyc19taW51czEgPiBjdXJyZW50LT5zcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN0cmVhbTogIgorICAgICAgICAgICAgICAgICAgICJzcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxICglZCkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gIgorICAgICAgICAgICAgICAgICAgICJ2cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxICglZCkuXG4iLAorICAgICAgICAgICAgICAgICAgIHZwcy0+dnBzX21heF9zdWJfbGF5ZXJzX21pbnVzMSwKKyAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5zcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmICh2cHMtPnZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgJiYKKyAgICAgICAgICAgICFjdXJyZW50LT5zcHNfdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN0cmVhbTogIgorICAgICAgICAgICAgICAgICAgICJzcHNfdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnIG11c3QgYmUgMSBpZiAiCisgICAgICAgICAgICAgICAgICAgInZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgaXMgMS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDSEVDSyhGVU5DKHByb2ZpbGVfdGllcl9sZXZlbCkoY3R4LCBydywgJmN1cnJlbnQtPnByb2ZpbGVfdGllcl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgY3VycmVudC0+c3BzX21heF9zdWJfbGF5ZXJzX21pbnVzMSkpOworCisgICAgdWUoc3BzX3NlcV9wYXJhbWV0ZXJfc2V0X2lkLCAwLCAxNSk7CisKKyAgICB1ZShjaHJvbWFfZm9ybWF0X2lkYywgMCwgMyk7CisgICAgaWYgKGN1cnJlbnQtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpCisgICAgICAgIGZsYWcoc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcpOworICAgIGVsc2UKKyAgICAgICAgaW5mZXIoc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcsIDApOworCisgICAgdWUocGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcywgIDEsIEhFVkNfTUFYX1dJRFRIKTsKKyAgICB1ZShwaWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcywgMSwgSEVWQ19NQVhfSEVJR0hUKTsKKworICAgIGZsYWcoY29uZm9ybWFuY2Vfd2luZG93X2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5jb25mb3JtYW5jZV93aW5kb3dfZmxhZykgeworICAgICAgICB1ZShjb25mX3dpbl9sZWZ0X29mZnNldCwgICAwLCBjdXJyZW50LT5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzKTsKKyAgICAgICAgdWUoY29uZl93aW5fcmlnaHRfb2Zmc2V0LCAgMCwgY3VycmVudC0+cGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcyk7CisgICAgICAgIHVlKGNvbmZfd2luX3RvcF9vZmZzZXQsICAgIDAsIGN1cnJlbnQtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzKTsKKyAgICAgICAgdWUoY29uZl93aW5fYm90dG9tX29mZnNldCwgMCwgY3VycmVudC0+cGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZmVyKGNvbmZfd2luX2xlZnRfb2Zmc2V0LCAgIDApOworICAgICAgICBpbmZlcihjb25mX3dpbl9yaWdodF9vZmZzZXQsICAwKTsKKyAgICAgICAgaW5mZXIoY29uZl93aW5fdG9wX29mZnNldCwgICAgMCk7CisgICAgICAgIGluZmVyKGNvbmZfd2luX2JvdHRvbV9vZmZzZXQsIDApOworICAgIH0KKworICAgIHVlKGJpdF9kZXB0aF9sdW1hX21pbnVzOCwgICAwLCA4KTsKKyAgICB1ZShiaXRfZGVwdGhfY2hyb21hX21pbnVzOCwgMCwgOCk7CisKKyAgICB1ZShsb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQsIDAsIDEyKTsKKworICAgIGZsYWcoc3BzX3N1Yl9sYXllcl9vcmRlcmluZ19pbmZvX3ByZXNlbnRfZmxhZyk7CisgICAgZm9yIChpID0gKGN1cnJlbnQtPnNwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWcgPworICAgICAgICAgICAgICAwIDogY3VycmVudC0+c3BzX21heF9zdWJfbGF5ZXJzX21pbnVzMSk7CisgICAgICAgICBpIDw9IGN1cnJlbnQtPnNwc19tYXhfc3ViX2xheWVyc19taW51czE7IGkrKykgeworICAgICAgICB1ZShzcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMVtpXSwgMCwgSEVWQ19NQVhfRFBCX1NJWkUgLSAxKTsKKyAgICAgICAgdWUoc3BzX21heF9udW1fcmVvcmRlcl9waWNzW2ldLCAgICAgICAgIDAsIGN1cnJlbnQtPnNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxW2ldKTsKKyAgICAgICAgdWUoc3BzX21heF9sYXRlbmN5X2luY3JlYXNlX3BsdXMxW2ldLCAgIDAsIFVJTlQzMl9NQVggLSAxKTsKKyAgICB9CisgICAgaWYgKCFjdXJyZW50LT5zcHNfc3ViX2xheWVyX29yZGVyaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5zcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxOyBpKyspIHsKKyAgICAgICAgICAgIGluZmVyKHNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxW2ldLAorICAgICAgICAgICAgICAgICAgY3VycmVudC0+c3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFbY3VycmVudC0+c3BzX21heF9zdWJfbGF5ZXJzX21pbnVzMV0pOworICAgICAgICAgICAgaW5mZXIoc3BzX21heF9udW1fcmVvcmRlcl9waWNzW2ldLAorICAgICAgICAgICAgICAgICAgY3VycmVudC0+c3BzX21heF9udW1fcmVvcmRlcl9waWNzW2N1cnJlbnQtPnNwc19tYXhfc3ViX2xheWVyc19taW51czFdKTsKKyAgICAgICAgICAgIGluZmVyKHNwc19tYXhfbGF0ZW5jeV9pbmNyZWFzZV9wbHVzMVtpXSwKKyAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPnNwc19tYXhfbGF0ZW5jeV9pbmNyZWFzZV9wbHVzMVtjdXJyZW50LT5zcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1ZShsb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMywgICAwLCAzKTsKKyAgICBtaW5fY2JfbG9nMl9zaXplX3kgPSBjdXJyZW50LT5sb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyArIDM7CisKKyAgICB1ZShsb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplLCAwLCAzKTsKKyAgICBjdGJfbG9nMl9zaXplX3kgPSBtaW5fY2JfbG9nMl9zaXplX3kgKworICAgICAgICBjdXJyZW50LT5sb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplOworCisgICAgbWluX2NiX3NpemVfeSA9IDEgPDwgbWluX2NiX2xvZzJfc2l6ZV95OworICAgIGlmIChjdXJyZW50LT5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzICAlIG1pbl9jYl9zaXplX3kgfHwKKyAgICAgICAgY3VycmVudC0+cGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgJSBtaW5fY2Jfc2l6ZV95KSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZGltZW5zaW9uczogJXV4JXUgbm90IGRpdmlzaWJsZSAiCisgICAgICAgICAgICAgICAiYnkgTWluQ2JTaXplWSA9ICV1LlxuIiwgY3VycmVudC0+cGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcywKKyAgICAgICAgICAgICAgIGN1cnJlbnQtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzLCBtaW5fY2Jfc2l6ZV95KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgdWUobG9nMl9taW5fbHVtYV90cmFuc2Zvcm1fYmxvY2tfc2l6ZV9taW51czIsIDAsIG1pbl9jYl9sb2cyX3NpemVfeSAtIDMpOworICAgIG1pbl90Yl9sb2cyX3NpemVfeSA9IGN1cnJlbnQtPmxvZzJfbWluX2x1bWFfdHJhbnNmb3JtX2Jsb2NrX3NpemVfbWludXMyICsgMjsKKworICAgIHVlKGxvZzJfZGlmZl9tYXhfbWluX2x1bWFfdHJhbnNmb3JtX2Jsb2NrX3NpemUsCisgICAgICAgMCwgRkZNSU4oY3RiX2xvZzJfc2l6ZV95LCA1KSAtIG1pbl90Yl9sb2cyX3NpemVfeSk7CisKKyAgICB1ZShtYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlciwKKyAgICAgICAwLCBjdGJfbG9nMl9zaXplX3kgLSBtaW5fdGJfbG9nMl9zaXplX3kpOworICAgIHVlKG1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhLAorICAgICAgIDAsIGN0Yl9sb2cyX3NpemVfeSAtIG1pbl90Yl9sb2cyX3NpemVfeSk7CisKKyAgICBmbGFnKHNjYWxpbmdfbGlzdF9lbmFibGVkX2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5zY2FsaW5nX2xpc3RfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIGZsYWcoc3BzX3NjYWxpbmdfbGlzdF9kYXRhX3ByZXNlbnRfZmxhZyk7CisgICAgICAgIGlmIChjdXJyZW50LT5zcHNfc2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnKQorICAgICAgICAgICAgQ0hFQ0soRlVOQyhzY2FsaW5nX2xpc3RfZGF0YSkoY3R4LCBydywgJmN1cnJlbnQtPnNjYWxpbmdfbGlzdCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluZmVyKHNwc19zY2FsaW5nX2xpc3RfZGF0YV9wcmVzZW50X2ZsYWcsIDApOworICAgIH0KKworICAgIGZsYWcoYW1wX2VuYWJsZWRfZmxhZyk7CisgICAgZmxhZyhzYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2VuYWJsZWRfZmxhZyk7CisKKyAgICBmbGFnKHBjbV9lbmFibGVkX2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5wY21fZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIHUoNCwgcGNtX3NhbXBsZV9iaXRfZGVwdGhfbHVtYV9taW51czEsCisgICAgICAgICAgMCwgY3VycmVudC0+Yml0X2RlcHRoX2x1bWFfbWludXM4ICsgOCAtIDEpOworICAgICAgICB1KDQsIHBjbV9zYW1wbGVfYml0X2RlcHRoX2Nocm9tYV9taW51czEsCisgICAgICAgICAgMCwgY3VycmVudC0+Yml0X2RlcHRoX2Nocm9tYV9taW51czggKyA4IC0gMSk7CisKKyAgICAgICAgdWUobG9nMl9taW5fcGNtX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVfbWludXMzLAorICAgICAgICAgICBGRk1JTihtaW5fY2JfbG9nMl9zaXplX3ksIDUpIC0gMywgRkZNSU4oY3RiX2xvZzJfc2l6ZV95LCA1KSAtIDMpOworICAgICAgICB1ZShsb2cyX2RpZmZfbWF4X21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgMCwgRkZNSU4oY3RiX2xvZzJfc2l6ZV95LCA1KSAtIChjdXJyZW50LT5sb2cyX21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgKyAzKSk7CisKKyAgICAgICAgZmxhZyhwY21fbG9vcF9maWx0ZXJfZGlzYWJsZWRfZmxhZyk7CisgICAgfQorCisgICAgdWUobnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzLCAwLCBIRVZDX01BWF9TSE9SVF9URVJNX1JFRl9QSUNfU0VUUyk7CisgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnQtPm51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0czsgaSsrKQorICAgICAgICBDSEVDSyhGVU5DKHN0X3JlZl9waWNfc2V0KShjdHgsIHJ3LCAmY3VycmVudC0+c3RfcmVmX3BpY19zZXRbaV0sIGksIGN1cnJlbnQpKTsKKworICAgIGZsYWcobG9uZ190ZXJtX3JlZl9waWNzX3ByZXNlbnRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPmxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgdWUobnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMsIDAsIEhFVkNfTUFYX0xPTkdfVEVSTV9SRUZfUElDUyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwczsgaSsrKSB7CisgICAgICAgICAgICB1KGN1cnJlbnQtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCArIDQsCisgICAgICAgICAgICAgIGx0X3JlZl9waWNfcG9jX2xzYl9zcHNbaV0sCisgICAgICAgICAgICAgIDAsIE1BWF9VSU5UX0JJVFMoY3VycmVudC0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCkpOworICAgICAgICAgICAgZmxhZyh1c2VkX2J5X2N1cnJfcGljX2x0X3Nwc19mbGFnW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsYWcoc3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcpOworICAgIGZsYWcoc3Ryb25nX2ludHJhX3Ntb290aGluZ19lbmFibGVkX2ZsYWcpOworCisgICAgZmxhZyh2dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpOworICAgIGlmIChjdXJyZW50LT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCisgICAgICAgIENIRUNLKEZVTkModnVpX3BhcmFtZXRlcnMpKGN0eCwgcncsICZjdXJyZW50LT52dWksIGN1cnJlbnQpKTsKKworICAgIGZsYWcoc3BzX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5zcHNfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZykgeworICAgICAgICBmbGFnKHNwc19yYW5nZV9leHRlbnNpb25fZmxhZyk7CisgICAgICAgIGZsYWcoc3BzX211bHRpbGF5ZXJfZXh0ZW5zaW9uX2ZsYWcpOworICAgICAgICBmbGFnKHNwc18zZF9leHRlbnNpb25fZmxhZyk7CisgICAgICAgIGZsYWcoc3BzX3NjY19leHRlbnNpb25fZmxhZyk7CisgICAgICAgIHUoNCwgc3BzX2V4dGVuc2lvbl80Yml0cywgMCwgTUFYX1VJTlRfQklUUyg0KSk7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQtPnNwc19yYW5nZV9leHRlbnNpb25fZmxhZykKKyAgICAgICAgQ0hFQ0soRlVOQyhzcHNfcmFuZ2VfZXh0ZW5zaW9uKShjdHgsIHJ3LCBjdXJyZW50KSk7CisgICAgaWYgKGN1cnJlbnQtPnNwc19tdWx0aWxheWVyX2V4dGVuc2lvbl9mbGFnKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgaWYgKGN1cnJlbnQtPnNwc18zZF9leHRlbnNpb25fZmxhZykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIGlmIChjdXJyZW50LT5zcHNfc2NjX2V4dGVuc2lvbl9mbGFnKQorICAgICAgICBDSEVDSyhGVU5DKHNwc19zY2NfZXh0ZW5zaW9uKShjdHgsIHJ3LCBjdXJyZW50KSk7CisgICAgaWYgKGN1cnJlbnQtPnNwc19leHRlbnNpb25fNGJpdHMpCisgICAgICAgIENIRUNLKEZVTkMoZXh0ZW5zaW9uX2RhdGEpKGN0eCwgcncsICZjdXJyZW50LT5leHRlbnNpb25fZGF0YSkpOworCisgICAgQ0hFQ0soRlVOQyhyYnNwX3RyYWlsaW5nX2JpdHMpKGN0eCwgcncpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMocHBzX3JhbmdlX2V4dGVuc2lvbikoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1BQUyAqY3VycmVudCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbUgyNjVDb250ZXh0ICpoMjY1ID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgSDI2NVJhd1NQUyAqc3BzID0gaDI2NS0+YWN0aXZlX3NwczsKKyAgICBpbnQgZXJyLCBpOworCisgICAgaWYgKGN1cnJlbnQtPnRyYW5zZm9ybV9za2lwX2VuYWJsZWRfZmxhZykKKyAgICAgICAgdWUobG9nMl9tYXhfdHJhbnNmb3JtX3NraXBfYmxvY2tfc2l6ZV9taW51czIsIDAsIDMpOworICAgIGZsYWcoY3Jvc3NfY29tcG9uZW50X3ByZWRpY3Rpb25fZW5hYmxlZF9mbGFnKTsKKworICAgIGZsYWcoY2hyb21hX3FwX29mZnNldF9saXN0X2VuYWJsZWRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgdWUoZGlmZl9jdV9jaHJvbWFfcXBfb2Zmc2V0X2RlcHRoLAorICAgICAgICAgICAwLCBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUpOworICAgICAgICB1ZShjaHJvbWFfcXBfb2Zmc2V0X2xpc3RfbGVuX21pbnVzMSwgMCwgNSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY3VycmVudC0+Y2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czE7IGkrKykgeworICAgICAgICAgICAgc2UoY2JfcXBfb2Zmc2V0X2xpc3RbaV0sIC0xMiwgKzEyKTsKKyAgICAgICAgICAgIHNlKGNyX3FwX29mZnNldF9saXN0W2ldLCAtMTIsICsxMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1ZShsb2cyX3Nhb19vZmZzZXRfc2NhbGVfbHVtYSwgICAwLCBGRk1BWCgwLCBzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCAgIC0gMikpOworICAgIHVlKGxvZzJfc2FvX29mZnNldF9zY2FsZV9jaHJvbWEsIDAsIEZGTUFYKDAsIHNwcy0+Yml0X2RlcHRoX2Nocm9tYV9taW51czggLSAyKSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKHBwc19zY2NfZXh0ZW5zaW9uKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1BQUyAqY3VycmVudCkKK3sKKyAgICBpbnQgZXJyLCBjb21wLCBpOworCisgICAgZmxhZyhwcHNfY3Vycl9waWNfcmVmX2VuYWJsZWRfZmxhZyk7CisKKyAgICBmbGFnKHJlc2lkdWFsX2FkYXB0aXZlX2NvbG91cl90cmFuc2Zvcm1fZW5hYmxlZF9mbGFnKTsKKyAgICBpZiAoY3VycmVudC0+cmVzaWR1YWxfYWRhcHRpdmVfY29sb3VyX3RyYW5zZm9ybV9lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgZmxhZyhwcHNfc2xpY2VfYWN0X3FwX29mZnNldHNfcHJlc2VudF9mbGFnKTsKKyAgICAgICAgc2UocHBzX2FjdF95X3FwX29mZnNldF9wbHVzNSwgIC03LCArMTcpOworICAgICAgICBzZShwcHNfYWN0X2NiX3FwX29mZnNldF9wbHVzNSwgLTcsICsxNyk7CisgICAgICAgIHNlKHBwc19hY3RfY3JfcXBfb2Zmc2V0X3BsdXMzLCAtOSwgKzE1KTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZlcihwcHNfc2xpY2VfYWN0X3FwX29mZnNldHNfcHJlc2VudF9mbGFnLCAwKTsKKyAgICAgICAgaW5mZXIocHBzX2FjdF95X3FwX29mZnNldF9wbHVzNSwgIDApOworICAgICAgICBpbmZlcihwcHNfYWN0X2NiX3FwX29mZnNldF9wbHVzNSwgMCk7CisgICAgICAgIGluZmVyKHBwc19hY3RfY3JfcXBfb2Zmc2V0X3BsdXMzLCAwKTsKKyAgICB9CisKKyAgICBmbGFnKHBwc19wYWxldHRlX3ByZWRpY3Rvcl9pbml0aWFsaXplcl9wcmVzZW50X2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5wcHNfcGFsZXR0ZV9wcmVkaWN0b3JfaW5pdGlhbGl6ZXJfcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHVlKHBwc19udW1fcGFsZXR0ZV9wcmVkaWN0b3JfaW5pdGlhbGl6ZXIsIDAsIDEyOCk7CisgICAgICAgIGlmIChjdXJyZW50LT5wcHNfbnVtX3BhbGV0dGVfcHJlZGljdG9yX2luaXRpYWxpemVyID4gMCkgeworICAgICAgICAgICAgZmxhZyhtb25vY2hyb21lX3BhbGV0dGVfZmxhZyk7CisgICAgICAgICAgICB1ZShsdW1hX2JpdF9kZXB0aF9lbnRyeV9taW51czgsIDAsIDgpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50LT5tb25vY2hyb21lX3BhbGV0dGVfZmxhZykKKyAgICAgICAgICAgICAgICB1ZShjaHJvbWFfYml0X2RlcHRoX2VudHJ5X21pbnVzOCwgMCwgOCk7CisgICAgICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgKGN1cnJlbnQtPm1vbm9jaHJvbWVfcGFsZXR0ZV9mbGFnID8gMSA6IDMpOyBjb21wKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYml0X2RlcHRoID0gY29tcCA9PSAwID8gY3VycmVudC0+bHVtYV9iaXRfZGVwdGhfZW50cnlfbWludXM4ICsgOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdXJyZW50LT5jaHJvbWFfYml0X2RlcHRoX2VudHJ5X21pbnVzOCArIDg7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnQtPnBwc19udW1fcGFsZXR0ZV9wcmVkaWN0b3JfaW5pdGlhbGl6ZXI7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgdShiaXRfZGVwdGgsIHBwc19wYWxldHRlX3ByZWRpY3Rvcl9pbml0aWFsaXplcnNbY29tcF1baV0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgTUFYX1VJTlRfQklUUyhiaXRfZGVwdGgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMocHBzKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgIEgyNjVSYXdQUFMgKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1IMjY1Q29udGV4dCAqaDI2NSA9IGN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEgyNjVSYXdTUFMgKnNwczsKKyAgICBpbnQgZXJyLCBpOworCisgICAgSEVBREVSKCJQaWN0dXJlIFBhcmFtZXRlciBTZXQiKTsKKworICAgIENIRUNLKEZVTkMobmFsX3VuaXRfaGVhZGVyKShjdHgsIHJ3LCAmY3VycmVudC0+bmFsX3VuaXRfaGVhZGVyLCBIRVZDX05BTF9QUFMpKTsKKworICAgIHVlKHBwc19waWNfcGFyYW1ldGVyX3NldF9pZCwgMCwgNjMpOworICAgIHVlKHBwc19zZXFfcGFyYW1ldGVyX3NldF9pZCwgMCwgMTUpOworICAgIHNwcyA9IGgyNjUtPnNwc1tjdXJyZW50LT5wcHNfc2VxX3BhcmFtZXRlcl9zZXRfaWRdOworICAgIGlmICghc3BzKSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlNQUyBpZCAlZCBub3QgYXZhaWxhYmxlLlxuIiwKKyAgICAgICAgICAgICAgIGN1cnJlbnQtPnBwc19zZXFfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBoMjY1LT5hY3RpdmVfc3BzID0gc3BzOworCisgICAgZmxhZyhkZXBlbmRlbnRfc2xpY2Vfc2VnbWVudHNfZW5hYmxlZF9mbGFnKTsKKyAgICBmbGFnKG91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZyk7CisgICAgdSgzLCBudW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHMsIDAsIDcpOworICAgIGZsYWcoc2lnbl9kYXRhX2hpZGluZ19lbmFibGVkX2ZsYWcpOworICAgIGZsYWcoY2FiYWNfaW5pdF9wcmVzZW50X2ZsYWcpOworCisgICAgdWUobnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxLCAwLCAxNCk7CisgICAgdWUobnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxLCAwLCAxNCk7CisKKyAgICBzZShpbml0X3FwX21pbnVzMjYsIC0oMjYgKyA2ICogc3BzLT5iaXRfZGVwdGhfbHVtYV9taW51czgpLCArMjUpOworCisgICAgZmxhZyhjb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcpOworICAgIGZsYWcodHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnKTsKKyAgICBmbGFnKGN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZyk7CisgICAgaWYgKGN1cnJlbnQtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZykKKyAgICAgICAgdWUoZGlmZl9jdV9xcF9kZWx0YV9kZXB0aCwKKyAgICAgICAgICAgMCwgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplKTsKKyAgICBlbHNlCisgICAgICAgIGluZmVyKGRpZmZfY3VfcXBfZGVsdGFfZGVwdGgsIDApOworCisgICAgc2UocHBzX2NiX3FwX29mZnNldCwgLTEyLCArMTIpOworICAgIHNlKHBwc19jcl9xcF9vZmZzZXQsIC0xMiwgKzEyKTsKKyAgICBmbGFnKHBwc19zbGljZV9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWcpOworCisgICAgZmxhZyh3ZWlnaHRlZF9wcmVkX2ZsYWcpOworICAgIGZsYWcod2VpZ2h0ZWRfYmlwcmVkX2ZsYWcpOworCisgICAgZmxhZyh0cmFuc3F1YW50X2J5cGFzc19lbmFibGVkX2ZsYWcpOworICAgIGZsYWcodGlsZXNfZW5hYmxlZF9mbGFnKTsKKyAgICBmbGFnKGVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnKTsKKworICAgIGlmIChjdXJyZW50LT50aWxlc19lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgdWUobnVtX3RpbGVfY29sdW1uc19taW51czEsIDAsIEhFVkNfTUFYX1RJTEVfQ09MVU1OUyk7CisgICAgICAgIHVlKG51bV90aWxlX3Jvd3NfbWludXMxLCAgICAwLCBIRVZDX01BWF9USUxFX1JPV1MpOworICAgICAgICBmbGFnKHVuaWZvcm1fc3BhY2luZ19mbGFnKTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT51bmlmb3JtX3NwYWNpbmdfZmxhZykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN1cnJlbnQtPm51bV90aWxlX2NvbHVtbnNfbWludXMxOyBpKyspCisgICAgICAgICAgICAgICAgdWUoY29sdW1uX3dpZHRoX21pbnVzMVtpXSwgMCwgc3BzLT5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5udW1fdGlsZV9yb3dzX21pbnVzMTsgaSsrKQorICAgICAgICAgICAgICAgIHVlKHJvd19oZWlnaHRfbWludXMxW2ldLCAgIDAsIHNwcy0+cGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMpOworICAgICAgICB9CisgICAgICAgIGZsYWcobG9vcF9maWx0ZXJfYWNyb3NzX3RpbGVzX2VuYWJsZWRfZmxhZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mZXIobnVtX3RpbGVfY29sdW1uc19taW51czEsIDApOworICAgICAgICBpbmZlcihudW1fdGlsZV9yb3dzX21pbnVzMSwgICAgMCk7CisgICAgfQorCisgICAgZmxhZyhwcHNfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcpOworICAgIGZsYWcoZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcpOworICAgIGlmIChjdXJyZW50LT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZykgeworICAgICAgICBmbGFnKGRlYmxvY2tpbmdfZmlsdGVyX292ZXJyaWRlX2VuYWJsZWRfZmxhZyk7CisgICAgICAgIGZsYWcocHBzX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcpOworICAgICAgICBpZiAoIWN1cnJlbnQtPnBwc19kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnKSB7CisgICAgICAgICAgICBzZShwcHNfYmV0YV9vZmZzZXRfZGl2MiwgLTYsICs2KTsKKyAgICAgICAgICAgIHNlKHBwc190Y19vZmZzZXRfZGl2MiwgICAtNiwgKzYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mZXIocHBzX2JldGFfb2Zmc2V0X2RpdjIsIDApOworICAgICAgICAgICAgaW5mZXIocHBzX3RjX29mZnNldF9kaXYyLCAgIDApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5mZXIoZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnLCAwKTsKKyAgICAgICAgaW5mZXIocHBzX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcsICAgICAwKTsKKyAgICAgICAgaW5mZXIocHBzX2JldGFfb2Zmc2V0X2RpdjIsIDApOworICAgICAgICBpbmZlcihwcHNfdGNfb2Zmc2V0X2RpdjIsICAgMCk7CisgICAgfQorCisgICAgZmxhZyhwcHNfc2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnKTsKKyAgICBpZiAoY3VycmVudC0+cHBzX3NjYWxpbmdfbGlzdF9kYXRhX3ByZXNlbnRfZmxhZykKKyAgICAgICAgQ0hFQ0soRlVOQyhzY2FsaW5nX2xpc3RfZGF0YSkoY3R4LCBydywgJmN1cnJlbnQtPnNjYWxpbmdfbGlzdCkpOworCisgICAgZmxhZyhsaXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnKTsKKworICAgIHVlKGxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyLAorICAgICAgIDAsIChzcHMtPmxvZzJfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVfbWludXMzICsgMyArCisgICAgICAgICAgIHNwcy0+bG9nMl9kaWZmX21heF9taW5fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZSAtIDIpKTsKKworICAgIGZsYWcoc2xpY2Vfc2VnbWVudF9oZWFkZXJfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZyk7CisKKyAgICBmbGFnKHBwc19leHRlbnNpb25fcHJlc2VudF9mbGFnKTsKKyAgICBpZiAoY3VycmVudC0+cHBzX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgZmxhZyhwcHNfcmFuZ2VfZXh0ZW5zaW9uX2ZsYWcpOworICAgICAgICBmbGFnKHBwc19tdWx0aWxheWVyX2V4dGVuc2lvbl9mbGFnKTsKKyAgICAgICAgZmxhZyhwcHNfM2RfZXh0ZW5zaW9uX2ZsYWcpOworICAgICAgICBmbGFnKHBwc19zY2NfZXh0ZW5zaW9uX2ZsYWcpOworICAgICAgICB1KDQsIHBwc19leHRlbnNpb25fNGJpdHMsIDAsIE1BWF9VSU5UX0JJVFMoNCkpOworICAgIH0KKyAgICBpZiAoY3VycmVudC0+cHBzX3JhbmdlX2V4dGVuc2lvbl9mbGFnKQorICAgICAgICBDSEVDSyhGVU5DKHBwc19yYW5nZV9leHRlbnNpb24pKGN0eCwgcncsIGN1cnJlbnQpKTsKKyAgICBpZiAoY3VycmVudC0+cHBzX211bHRpbGF5ZXJfZXh0ZW5zaW9uX2ZsYWcpCisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICBpZiAoY3VycmVudC0+cHBzXzNkX2V4dGVuc2lvbl9mbGFnKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgaWYgKGN1cnJlbnQtPnBwc19zY2NfZXh0ZW5zaW9uX2ZsYWcpCisgICAgICAgIENIRUNLKEZVTkMocHBzX3NjY19leHRlbnNpb24pKGN0eCwgcncsIGN1cnJlbnQpKTsKKyAgICBpZiAoY3VycmVudC0+cHBzX2V4dGVuc2lvbl80Yml0cykKKyAgICAgICAgQ0hFQ0soRlVOQyhleHRlbnNpb25fZGF0YSkoY3R4LCBydywgJmN1cnJlbnQtPmV4dGVuc2lvbl9kYXRhKSk7CisKKyAgICBDSEVDSyhGVU5DKHJic3BfdHJhaWxpbmdfYml0cykoY3R4LCBydykpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhhdWQpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd0FVRCAqY3VycmVudCkKK3sKKyAgICBpbnQgZXJyOworCisgICAgSEVBREVSKCJBY2Nlc3MgVW5pdCBEZWxpbWl0ZXIiKTsKKworICAgIENIRUNLKEZVTkMobmFsX3VuaXRfaGVhZGVyKShjdHgsIHJ3LCAmY3VycmVudC0+bmFsX3VuaXRfaGVhZGVyLCBIRVZDX05BTF9BVUQpKTsKKworICAgIHUoMywgcGljX3R5cGUsIDAsIDIpOworCisgICAgQ0hFQ0soRlVOQyhyYnNwX3RyYWlsaW5nX2JpdHMpKGN0eCwgcncpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMocmVmX3BpY19saXN0c19tb2RpZmljYXRpb24pKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY1UmF3U2xpY2VIZWFkZXIgKmN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fcGljX3RvdGFsX2N1cnIpCit7CisgICAgdW5zaWduZWQgaW50IGVudHJ5X3NpemU7CisgICAgaW50IGVyciwgaTsKKworICAgIGVudHJ5X3NpemUgPSBhdl9sb2cyKG51bV9waWNfdG90YWxfY3VyciAtIDEpICsgMTsKKworICAgIGZsYWcocmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2wwKTsKKyAgICBpZiAoY3VycmVudC0+cmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2wwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY3VycmVudC0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsgaSsrKQorICAgICAgICAgICAgdShlbnRyeV9zaXplLCBsaXN0X2VudHJ5X2wwW2ldLCAwLCBudW1fcGljX3RvdGFsX2N1cnIgLSAxKTsKKyAgICB9CisKKyAgICBpZiAoY3VycmVudC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpIHsKKyAgICAgICAgZmxhZyhyZWZfcGljX2xpc3RfbW9kaWZpY2F0aW9uX2ZsYWdfbDEpOworICAgICAgICBpZiAoY3VycmVudC0+cmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2wxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGN1cnJlbnQtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czE7IGkrKykKKyAgICAgICAgICAgICAgICB1KGVudHJ5X3NpemUsIGxpc3RfZW50cnlfbDFbaV0sIDAsIG51bV9waWNfdG90YWxfY3VyciAtIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhwcmVkX3dlaWdodF90YWJsZSkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjVSYXdTbGljZUhlYWRlciAqY3VycmVudCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbUgyNjVDb250ZXh0ICpoMjY1ID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgSDI2NVJhd1NQUyAqc3BzID0gaDI2NS0+YWN0aXZlX3NwczsKKyAgICBpbnQgZXJyLCBpLCBqOworICAgIGludCBjaHJvbWEgPSAhc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZyAmJgorICAgICAgICAgICAgICAgICAgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwOworCisgICAgdWUobHVtYV9sb2cyX3dlaWdodF9kZW5vbSwgMCwgNyk7CisgICAgaWYgKGNocm9tYSkKKyAgICAgICAgc2UoZGVsdGFfY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tLCAtNywgNyk7CisgICAgZWxzZQorICAgICAgICBpbmZlcihkZWx0YV9jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sIDApOworCisgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyZW50LT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOyBpKyspIHsKKyAgICAgICAgaWYgKDEgLyogaXMgbm90IHNhbWUgUE9DIGFuZCBzYW1lIGxheWVyX2lkICovKQorICAgICAgICAgICAgZmxhZyhsdW1hX3dlaWdodF9sMF9mbGFnW2ldKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mZXIobHVtYV93ZWlnaHRfbDBfZmxhZ1tpXSwgMCk7CisgICAgfQorICAgIGlmIChjaHJvbWEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyZW50LT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgxIC8qIGlzIG5vdCBzYW1lIFBPQyBhbmQgc2FtZSBsYXllcl9pZCAqLykKKyAgICAgICAgICAgICAgICBmbGFnKGNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5mZXIoY2hyb21hX3dlaWdodF9sMF9mbGFnW2ldLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPD0gY3VycmVudC0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMTsgaSsrKSB7CisgICAgICAgIGlmIChjdXJyZW50LT5sdW1hX3dlaWdodF9sMF9mbGFnW2ldKSB7CisgICAgICAgICAgICBzZShkZWx0YV9sdW1hX3dlaWdodF9sMFtpXSwgLTEyOCwgKzEyNyk7CisgICAgICAgICAgICBzZShsdW1hX29mZnNldF9sMFtpXSwKKyAgICAgICAgICAgICAgIC0oMSA8PCAoc3BzLT5iaXRfZGVwdGhfbHVtYV9taW51czggKyA4IC0gMSkpLAorICAgICAgICAgICAgICAgKCgxIDw8IChzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCArIDggLSAxKSkgLSAxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmZlcihkZWx0YV9sdW1hX3dlaWdodF9sMFtpXSwgMCk7CisgICAgICAgICAgICBpbmZlcihsdW1hX29mZnNldF9sMFtpXSwgICAgICAgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnQtPmNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgIHNlKGRlbHRhX2Nocm9tYV93ZWlnaHRfbDBbaV1bal0sIC0xMjgsICsxMjcpOworICAgICAgICAgICAgICAgIHNlKGNocm9tYV9vZmZzZXRfbDBbaV1bal0sCisgICAgICAgICAgICAgICAgICAgLSg0IDw8IChzcHMtPmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICsgOCAtIDEpKSwKKyAgICAgICAgICAgICAgICAgICAoKDQgPDwgKHNwcy0+Yml0X2RlcHRoX2Nocm9tYV9taW51czggKyA4IC0gMSkpIC0gMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgIGluZmVyKGRlbHRhX2Nocm9tYV93ZWlnaHRfbDBbaV1bal0sIDApOworICAgICAgICAgICAgICAgIGluZmVyKGNocm9tYV9vZmZzZXRfbDBbaV1bal0sICAgICAgIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gY3VycmVudC0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoMSAvKiBSZWZQaWNMaXN0MVtpXSBpcyBub3QgQ3VyclBpYywgbm9yIGlzIGl0IGluIGEgZGlmZmVyZW50IGxheWVyICovKQorICAgICAgICAgICAgICAgIGZsYWcobHVtYV93ZWlnaHRfbDFfZmxhZ1tpXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5mZXIobHVtYV93ZWlnaHRfbDFfZmxhZ1tpXSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNocm9tYSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyZW50LT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoMSAvKiBSZWZQaWNMaXN0MVtpXSBpcyBub3QgQ3VyclBpYywgbm9yIGlzIGl0IGluIGEgZGlmZmVyZW50IGxheWVyICovKQorICAgICAgICAgICAgICAgICAgICBmbGFnKGNocm9tYV93ZWlnaHRfbDFfZmxhZ1tpXSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpbmZlcihjaHJvbWFfd2VpZ2h0X2wxX2ZsYWdbaV0sIDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBjdXJyZW50LT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5sdW1hX3dlaWdodF9sMV9mbGFnW2ldKSB7CisgICAgICAgICAgICAgICAgc2UoZGVsdGFfbHVtYV93ZWlnaHRfbDFbaV0sIC0xMjgsICsxMjcpOworICAgICAgICAgICAgICAgIHNlKGx1bWFfb2Zmc2V0X2wxW2ldLAorICAgICAgICAgICAgICAgICAgIC0oMSA8PCAoc3BzLT5iaXRfZGVwdGhfbHVtYV9taW51czggKyA4IC0gMSkpLAorICAgICAgICAgICAgICAgICAgICgoMSA8PCAoc3BzLT5iaXRfZGVwdGhfbHVtYV9taW51czggKyA4IC0gMSkpIC0gMSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmZlcihkZWx0YV9sdW1hX3dlaWdodF9sMVtpXSwgMCk7CisgICAgICAgICAgICAgICAgaW5mZXIobHVtYV9vZmZzZXRfbDFbaV0sICAgICAgIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmNocm9tYV93ZWlnaHRfbDFfZmxhZ1tpXSkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc2UoZGVsdGFfY2hyb21hX3dlaWdodF9sMVtpXVtqXSwgLTEyOCwgKzEyNyk7CisgICAgICAgICAgICAgICAgICAgIHNlKGNocm9tYV9vZmZzZXRfbDFbaV1bal0sCisgICAgICAgICAgICAgICAgICAgICAgIC0oNCA8PCAoc3BzLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCArIDggLSAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICgoNCA8PCAoc3BzLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCArIDggLSAxKSkgLSAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGluZmVyKGRlbHRhX2Nocm9tYV93ZWlnaHRfbDFbaV1bal0sIDApOworICAgICAgICAgICAgICAgICAgICBpbmZlcihjaHJvbWFfb2Zmc2V0X2wxW2ldW2pdLCAgICAgICAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKHNsaWNlX3NlZ21lbnRfaGVhZGVyKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1NsaWNlSGVhZGVyICpjdXJyZW50KQoreworICAgIENvZGVkQml0c3RyZWFtSDI2NUNvbnRleHQgKmgyNjUgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBIMjY1UmF3U1BTICpzcHM7CisgICAgY29uc3QgSDI2NVJhd1BQUyAqcHBzOworICAgIHVuc2lnbmVkIGludCBtaW5fY2JfbG9nMl9zaXplX3ksIGN0Yl9sb2cyX3NpemVfeSwgY3RiX3NpemVfeTsKKyAgICB1bnNpZ25lZCBpbnQgcGljX3dpZHRoX2luX2N0YnNfeSwgcGljX2hlaWdodF9pbl9jdGJzX3ksIHBpY19zaXplX2luX2N0YnNfeTsKKyAgICB1bnNpZ25lZCBpbnQgbnVtX3BpY190b3RhbF9jdXJyID0gMDsKKyAgICBpbnQgZXJyLCBpOworCisgICAgSEVBREVSKCJTbGljZSBTZWdtZW50IEhlYWRlciIpOworCisgICAgQ0hFQ0soRlVOQyhuYWxfdW5pdF9oZWFkZXIpKGN0eCwgcncsICZjdXJyZW50LT5uYWxfdW5pdF9oZWFkZXIsIC0xKSk7CisKKyAgICBmbGFnKGZpcnN0X3NsaWNlX3NlZ21lbnRfaW5fcGljX2ZsYWcpOworCisgICAgaWYgKGN1cnJlbnQtPm5hbF91bml0X2hlYWRlci5uYWxfdW5pdF90eXBlID49IEhFVkNfTkFMX0JMQV9XX0xQICYmCisgICAgICAgIGN1cnJlbnQtPm5hbF91bml0X2hlYWRlci5uYWxfdW5pdF90eXBlIDw9IEhFVkNfTkFMX0lSQVBfVkNMMjMpCisgICAgICAgIGZsYWcobm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyk7CisKKyAgICB1ZShzbGljZV9waWNfcGFyYW1ldGVyX3NldF9pZCwgMCwgNjMpOworCisgICAgcHBzID0gaDI2NS0+cHBzW2N1cnJlbnQtPnNsaWNlX3BpY19wYXJhbWV0ZXJfc2V0X2lkXTsKKyAgICBpZiAoIXBwcykgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJQUFMgaWQgJWQgbm90IGF2YWlsYWJsZS5cbiIsCisgICAgICAgICAgICAgICBjdXJyZW50LT5zbGljZV9waWNfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBoMjY1LT5hY3RpdmVfcHBzID0gcHBzOworCisgICAgc3BzID0gaDI2NS0+c3BzW3Bwcy0+cHBzX3NlcV9wYXJhbWV0ZXJfc2V0X2lkXTsKKyAgICBpZiAoIXNwcykgeworICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJTUFMgaWQgJWQgbm90IGF2YWlsYWJsZS5cbiIsCisgICAgICAgICAgICAgICBwcHMtPnBwc19zZXFfcGFyYW1ldGVyX3NldF9pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBoMjY1LT5hY3RpdmVfc3BzID0gc3BzOworCisgICAgbWluX2NiX2xvZzJfc2l6ZV95ID0gc3BzLT5sb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyArIDM7CisgICAgY3RiX2xvZzJfc2l6ZV95ID0gbWluX2NiX2xvZzJfc2l6ZV95ICsgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplOworICAgIGN0Yl9zaXplX3kgPSAxIDw8IGN0Yl9sb2cyX3NpemVfeTsKKyAgICBwaWNfd2lkdGhfaW5fY3Ric195ID0KKyAgICAgICAgKHNwcy0+cGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcyArIGN0Yl9zaXplX3kgLSAxKSAvIGN0Yl9zaXplX3k7CisgICAgcGljX2hlaWdodF9pbl9jdGJzX3kgPQorICAgICAgICAoc3BzLT5waWNfaGVpZ2h0X2luX2x1bWFfc2FtcGxlcyArIGN0Yl9zaXplX3kgLSAxKSAvIGN0Yl9zaXplX3k7CisgICAgcGljX3NpemVfaW5fY3Ric195ID0gcGljX3dpZHRoX2luX2N0YnNfeSAqIHBpY19oZWlnaHRfaW5fY3Ric195OworCisgICAgaWYgKCFjdXJyZW50LT5maXJzdF9zbGljZV9zZWdtZW50X2luX3BpY19mbGFnKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBhZGRyZXNzX3NpemUgPSBhdl9sb2cyKHBpY19zaXplX2luX2N0YnNfeSAtIDEpICsgMTsKKyAgICAgICAgaWYgKHBwcy0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgIGZsYWcoZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGluZmVyKGRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcsIDApOworICAgICAgICB1KGFkZHJlc3Nfc2l6ZSwgc2xpY2Vfc2VnbWVudF9hZGRyZXNzLCAwLCBwaWNfc2l6ZV9pbl9jdGJzX3kgLSAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZlcihkZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnLCAwKTsKKyAgICB9CisKKyAgICBpZiAoIWN1cnJlbnQtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzOyBpKyspCisgICAgICAgICAgICBmbGFnKHNsaWNlX3Jlc2VydmVkX2ZsYWdbaV0pOworCisgICAgICAgIHVlKHNsaWNlX3R5cGUsIDAsIDIpOworCisgICAgICAgIGlmIChwcHMtPm91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZykKKyAgICAgICAgICAgIGZsYWcocGljX291dHB1dF9mbGFnKTsKKworICAgICAgICBpZiAoc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZykKKyAgICAgICAgICAgIHUoMiwgY29sb3VyX3BsYW5lX2lkLCAwLCAyKTsKKworICAgICAgICBpZiAoY3VycmVudC0+bmFsX3VuaXRfaGVhZGVyLm5hbF91bml0X3R5cGUgIT0gSEVWQ19OQUxfSURSX1dfUkFETCAmJgorICAgICAgICAgICAgY3VycmVudC0+bmFsX3VuaXRfaGVhZGVyLm5hbF91bml0X3R5cGUgIT0gSEVWQ19OQUxfSURSX05fTFApIHsKKyAgICAgICAgICAgIGNvbnN0IEgyNjVSYXdTVFJlZlBpY1NldCAqcnBzOworCisgICAgICAgICAgICB1KHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCwgc2xpY2VfcGljX29yZGVyX2NudF9sc2IsCisgICAgICAgICAgICAgIDAsIE1BWF9VSU5UX0JJVFMoc3BzLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KSk7CisKKyAgICAgICAgICAgIGZsYWcoc2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZyk7CisgICAgICAgICAgICBpZiAoIWN1cnJlbnQtPnNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyhGVU5DKHN0X3JlZl9waWNfc2V0KShjdHgsIHJ3LCAmY3VycmVudC0+c2hvcnRfdGVybV9yZWZfcGljX3NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHMtPm51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0cywgc3BzKSk7CisgICAgICAgICAgICAgICAgcnBzID0gJmN1cnJlbnQtPnNob3J0X3Rlcm1fcmVmX3BpY19zZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNwcy0+bnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzID4gMSkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpZHhfc2l6ZSA9IGF2X2xvZzIoc3BzLT5udW1fc2hvcnRfdGVybV9yZWZfcGljX3NldHMgLSAxKSArIDE7CisgICAgICAgICAgICAgICAgdShpZHhfc2l6ZSwgc2hvcnRfdGVybV9yZWZfcGljX3NldF9pZHgsCisgICAgICAgICAgICAgICAgICAwLCBzcHMtPm51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0cyAtIDEpOworICAgICAgICAgICAgICAgIHJwcyA9ICZzcHMtPnN0X3JlZl9waWNfc2V0W2N1cnJlbnQtPnNob3J0X3Rlcm1fcmVmX3BpY19zZXRfaWR4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mZXIoc2hvcnRfdGVybV9yZWZfcGljX3NldF9pZHgsIDApOworICAgICAgICAgICAgICAgIHJwcyA9ICZzcHMtPnN0X3JlZl9waWNfc2V0WzBdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBudW1fcGljX3RvdGFsX2N1cnIgPSAwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJwcy0+bnVtX25lZ2F0aXZlX3BpY3M7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAocnBzLT51c2VkX2J5X2N1cnJfcGljX3MwX2ZsYWdbaV0pCisgICAgICAgICAgICAgICAgICAgICsrbnVtX3BpY190b3RhbF9jdXJyOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJwcy0+bnVtX3Bvc2l0aXZlX3BpY3M7IGkrKykKKyAgICAgICAgICAgICAgICBpZiAocnBzLT51c2VkX2J5X2N1cnJfcGljX3MxX2ZsYWdbaV0pCisgICAgICAgICAgICAgICAgICAgICsrbnVtX3BpY190b3RhbF9jdXJyOworCisgICAgICAgICAgICBpZiAoc3BzLT5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkeF9zaXplOworCisgICAgICAgICAgICAgICAgaWYgKHNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHVlKG51bV9sb25nX3Rlcm1fc3BzLCAwLCBzcHMtPm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzKTsKKyAgICAgICAgICAgICAgICAgICAgaWR4X3NpemUgPSBhdl9sb2cyKHNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMgLSAxKSArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mZXIobnVtX2xvbmdfdGVybV9zcHMsIDApOworICAgICAgICAgICAgICAgICAgICBpZHhfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVlKG51bV9sb25nX3Rlcm1fcGljcywgMCwgSEVWQ19NQVhfTE9OR19URVJNX1JFRl9QSUNTKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5udW1fbG9uZ190ZXJtX3NwcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQtPm51bV9sb25nX3Rlcm1fcGljczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgY3VycmVudC0+bnVtX2xvbmdfdGVybV9zcHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcHMtPm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1KGlkeF9zaXplLCBsdF9pZHhfc3BzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwcy0+dXNlZF9ieV9jdXJyX3BpY19sdF9zcHNfZmxhZ1tjdXJyZW50LT5sdF9pZHhfc3BzW2ldXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK251bV9waWNfdG90YWxfY3VycjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUoc3BzLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0LCBwb2NfbHNiX2x0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBNQVhfVUlOVF9CSVRTKHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICsgNCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyh1c2VkX2J5X2N1cnJfcGljX2x0X2ZsYWdbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnVzZWRfYnlfY3Vycl9waWNfbHRfZmxhZ1tpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK251bV9waWNfdG90YWxfY3VycjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmbGFnKGRlbHRhX3BvY19tc2JfcHJlc2VudF9mbGFnW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmRlbHRhX3BvY19tc2JfcHJlc2VudF9mbGFnW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgdWUoZGVsdGFfcG9jX21zYl9jeWNsZV9sdFtpXSwgMCwgVUlOVDMyX01BWCAtIDEpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZlcihkZWx0YV9wb2NfbXNiX2N5Y2xlX2x0W2ldLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzcHMtPnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnKQorICAgICAgICAgICAgICAgIGZsYWcoc2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaW5mZXIoc2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZywgMCk7CisKKyAgICAgICAgICAgIGlmIChwcHMtPnBwc19jdXJyX3BpY19yZWZfZW5hYmxlZF9mbGFnKQorICAgICAgICAgICAgICAgICsrbnVtX3BpY190b3RhbF9jdXJyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNwcy0+c2FtcGxlX2FkYXB0aXZlX29mZnNldF9lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgICAgIGZsYWcoc2xpY2Vfc2FvX2x1bWFfZmxhZyk7CisgICAgICAgICAgICBpZiAoIXNwcy0+c2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcgJiYgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwKQorICAgICAgICAgICAgICAgIGZsYWcoc2xpY2Vfc2FvX2Nocm9tYV9mbGFnKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmZlcihzbGljZV9zYW9fY2hyb21hX2ZsYWcsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5mZXIoc2xpY2Vfc2FvX2x1bWFfZmxhZywgICAwKTsKKyAgICAgICAgICAgIGluZmVyKHNsaWNlX3Nhb19jaHJvbWFfZmxhZywgMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VycmVudC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX1AgfHwKKyAgICAgICAgICAgIGN1cnJlbnQtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CKSB7CisgICAgICAgICAgICBmbGFnKG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5udW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZykgeworICAgICAgICAgICAgICAgIHVlKG51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEsIDAsIDE0KTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpCisgICAgICAgICAgICAgICAgICAgIHVlKG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEsIDAsIDE0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGluZmVyKG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEsIHBwcy0+bnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5mZXIobnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSwgcHBzLT5udW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZV9taW51czEpOworICAgICAgICAgICAgICAgIGluZmVyKG51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEsIHBwcy0+bnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBwcy0+bGlzdHNfbW9kaWZpY2F0aW9uX3ByZXNlbnRfZmxhZyAmJiBudW1fcGljX3RvdGFsX2N1cnIgPiAxKQorICAgICAgICAgICAgICAgIENIRUNLKEZVTkMocmVmX3BpY19saXN0c19tb2RpZmljYXRpb24pKGN0eCwgcncsIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BpY190b3RhbF9jdXJyKSk7CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQikKKyAgICAgICAgICAgICAgICBmbGFnKG12ZF9sMV96ZXJvX2ZsYWcpOworICAgICAgICAgICAgaWYgKHBwcy0+Y2FiYWNfaW5pdF9wcmVzZW50X2ZsYWcpCisgICAgICAgICAgICAgICAgZmxhZyhjYWJhY19pbml0X2ZsYWcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZmVyKGNhYmFjX2luaXRfZmxhZywgMCk7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZykgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQikKKyAgICAgICAgICAgICAgICAgICAgZmxhZyhjb2xsb2NhdGVkX2Zyb21fbDBfZmxhZyk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpbmZlcihjb2xsb2NhdGVkX2Zyb21fbDBfZmxhZywgMSk7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPmNvbGxvY2F0ZWRfZnJvbV9sMF9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50LT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVlKGNvbGxvY2F0ZWRfcmVmX2lkeCwgMCwgY3VycmVudC0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZmVyKGNvbGxvY2F0ZWRfcmVmX2lkeCwgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgdWUoY29sbG9jYXRlZF9yZWZfaWR4LCAwLCBjdXJyZW50LT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaW5mZXIoY29sbG9jYXRlZF9yZWZfaWR4LCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcgICAmJiBjdXJyZW50LT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfUCkgfHwKKyAgICAgICAgICAgICAgICAocHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZyAmJiBjdXJyZW50LT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQikpCisgICAgICAgICAgICAgICAgQ0hFQ0soRlVOQyhwcmVkX3dlaWdodF90YWJsZSkoY3R4LCBydywgY3VycmVudCkpOworCisgICAgICAgICAgICB1ZShmaXZlX21pbnVzX21heF9udW1fbWVyZ2VfY2FuZCwgMCwgNCk7CisgICAgICAgICAgICBpZiAoc3BzLT5tb3Rpb25fdmVjdG9yX3Jlc29sdXRpb25fY29udHJvbF9pZGMgPT0gMikKKyAgICAgICAgICAgICAgICBmbGFnKHVzZV9pbnRlZ2VyX212X2ZsYWcpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGluZmVyKHVzZV9pbnRlZ2VyX212X2ZsYWcsIHNwcy0+bW90aW9uX3ZlY3Rvcl9yZXNvbHV0aW9uX2NvbnRyb2xfaWRjKTsKKyAgICAgICAgfQorCisgICAgICAgIHNlKHNsaWNlX3FwX2RlbHRhLAorICAgICAgICAgICAtIDYgKiBzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCAtIChwcHMtPmluaXRfcXBfbWludXMyNiArIDI2KSwKKyAgICAgICAgICAgKyA1MSAtIChwcHMtPmluaXRfcXBfbWludXMyNiArIDI2KSk7CisgICAgICAgIGlmIChwcHMtPnBwc19zbGljZV9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgIHNlKHNsaWNlX2NiX3FwX29mZnNldCwgLTEyLCArMTIpOworICAgICAgICAgICAgc2Uoc2xpY2VfY3JfcXBfb2Zmc2V0LCAtMTIsICsxMik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmZlcihzbGljZV9jYl9xcF9vZmZzZXQsIDApOworICAgICAgICAgICAgaW5mZXIoc2xpY2VfY3JfcXBfb2Zmc2V0LCAwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHBzLT5wcHNfc2xpY2VfYWN0X3FwX29mZnNldHNfcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICBzZShzbGljZV9hY3RfeV9xcF9vZmZzZXQsCisgICAgICAgICAgICAgICAtMTIgLSAocHBzLT5wcHNfYWN0X3lfcXBfb2Zmc2V0X3BsdXM1IC0gNSksCisgICAgICAgICAgICAgICArMTIgLSAocHBzLT5wcHNfYWN0X3lfcXBfb2Zmc2V0X3BsdXM1IC0gNSkpOworICAgICAgICAgICAgc2Uoc2xpY2VfYWN0X2NiX3FwX29mZnNldCwKKyAgICAgICAgICAgICAgIC0xMiAtIChwcHMtPnBwc19hY3RfY2JfcXBfb2Zmc2V0X3BsdXM1IC0gNSksCisgICAgICAgICAgICAgICArMTIgLSAocHBzLT5wcHNfYWN0X2NiX3FwX29mZnNldF9wbHVzNSAtIDUpKTsKKyAgICAgICAgICAgIHNlKHNsaWNlX2FjdF9jcl9xcF9vZmZzZXQsCisgICAgICAgICAgICAgICAtMTIgLSAocHBzLT5wcHNfYWN0X2NyX3FwX29mZnNldF9wbHVzMyAtIDMpLAorICAgICAgICAgICAgICAgKzEyIC0gKHBwcy0+cHBzX2FjdF9jcl9xcF9vZmZzZXRfcGx1czMgLSAzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmZlcihzbGljZV9hY3RfeV9xcF9vZmZzZXQsICAwKTsKKyAgICAgICAgICAgIGluZmVyKHNsaWNlX2FjdF9jYl9xcF9vZmZzZXQsIDApOworICAgICAgICAgICAgaW5mZXIoc2xpY2VfYWN0X2NyX3FwX29mZnNldCwgMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBwcy0+Y2hyb21hX3FwX29mZnNldF9saXN0X2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgIGZsYWcoY3VfY2hyb21hX3FwX29mZnNldF9lbmFibGVkX2ZsYWcpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZlcihjdV9jaHJvbWFfcXBfb2Zmc2V0X2VuYWJsZWRfZmxhZywgMCk7CisKKyAgICAgICAgaWYgKHBwcy0+ZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnKQorICAgICAgICAgICAgZmxhZyhkZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9mbGFnKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5mZXIoZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZmxhZywgMCk7CisgICAgICAgIGlmIChjdXJyZW50LT5kZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9mbGFnKSB7CisgICAgICAgICAgICBmbGFnKHNsaWNlX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcpOworICAgICAgICAgICAgaWYgKCFjdXJyZW50LT5zbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnKSB7CisgICAgICAgICAgICAgICAgc2Uoc2xpY2VfYmV0YV9vZmZzZXRfZGl2MiwgLTYsICs2KTsKKyAgICAgICAgICAgICAgICBzZShzbGljZV90Y19vZmZzZXRfZGl2MiwgICAtNiwgKzYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbmZlcihzbGljZV9iZXRhX29mZnNldF9kaXYyLCBwcHMtPnBwc19iZXRhX29mZnNldF9kaXYyKTsKKyAgICAgICAgICAgICAgICBpbmZlcihzbGljZV90Y19vZmZzZXRfZGl2MiwgICBwcHMtPnBwc190Y19vZmZzZXRfZGl2Mik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmZlcihzbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnLAorICAgICAgICAgICAgICAgICAgcHBzLT5wcHNfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyk7CisgICAgICAgICAgICBpbmZlcihzbGljZV9iZXRhX29mZnNldF9kaXYyLCBwcHMtPnBwc19iZXRhX29mZnNldF9kaXYyKTsKKyAgICAgICAgICAgIGluZmVyKHNsaWNlX3RjX29mZnNldF9kaXYyLCAgIHBwcy0+cHBzX3RjX29mZnNldF9kaXYyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHBzLT5wcHNfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgICAgIChjdXJyZW50LT5zbGljZV9zYW9fbHVtYV9mbGFnIHx8IGN1cnJlbnQtPnNsaWNlX3Nhb19jaHJvbWFfZmxhZyB8fAorICAgICAgICAgICAgICFjdXJyZW50LT5zbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnKSkKKyAgICAgICAgICAgIGZsYWcoc2xpY2VfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbmZlcihzbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgICAgICAgIHBwcy0+cHBzX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnKTsKKyAgICB9CisKKyAgICBpZiAocHBzLT50aWxlc19lbmFibGVkX2ZsYWcgfHwgcHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykgeworICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2VudHJ5X3BvaW50X29mZnNldHNfbGltaXQ7CisgICAgICAgIGlmICghcHBzLT50aWxlc19lbmFibGVkX2ZsYWcgJiYgcHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgIG51bV9lbnRyeV9wb2ludF9vZmZzZXRzX2xpbWl0ID0gcGljX2hlaWdodF9pbl9jdGJzX3kgLSAxOworICAgICAgICBlbHNlIGlmIChwcHMtPnRpbGVzX2VuYWJsZWRfZmxhZyAmJiAhcHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgIG51bV9lbnRyeV9wb2ludF9vZmZzZXRzX2xpbWl0ID0KKyAgICAgICAgICAgICAgICAocHBzLT5udW1fdGlsZV9jb2x1bW5zX21pbnVzMSArIDEpICogKHBwcy0+bnVtX3RpbGVfcm93c19taW51czEgKyAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbnVtX2VudHJ5X3BvaW50X29mZnNldHNfbGltaXQgPQorICAgICAgICAgICAgICAgIChwcHMtPm51bV90aWxlX2NvbHVtbnNfbWludXMxICsgMSkgKiBwaWNfaGVpZ2h0X2luX2N0YnNfeSAtIDE7CisgICAgICAgIHVlKG51bV9lbnRyeV9wb2ludF9vZmZzZXRzLCAwLCBudW1fZW50cnlfcG9pbnRfb2Zmc2V0c19saW1pdCk7CisKKyAgICAgICAgaWYgKGN1cnJlbnQtPm51bV9lbnRyeV9wb2ludF9vZmZzZXRzID4gSEVWQ19NQVhfRU5UUllfUE9JTlRfT0ZGU0VUUykgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgZW50cnkgcG9pbnRzOiAiCisgICAgICAgICAgICAgICAgICAgIiUiUFJJdTE2Ii5cbiIsIGN1cnJlbnQtPm51bV9lbnRyeV9wb2ludF9vZmZzZXRzKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50LT5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyA+IDApIHsKKyAgICAgICAgICAgIHVlKG9mZnNldF9sZW5fbWludXMxLCAwLCAzMSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3VycmVudC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHM7IGkrKykKKyAgICAgICAgICAgICAgICB1KGN1cnJlbnQtPm9mZnNldF9sZW5fbWludXMxICsgMSwgZW50cnlfcG9pbnRfb2Zmc2V0X21pbnVzMVtpXSwKKyAgICAgICAgICAgICAgICAgIDAsIE1BWF9VSU5UX0JJVFMoY3VycmVudC0+b2Zmc2V0X2xlbl9taW51czEgKyAxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHBzLT5zbGljZV9zZWdtZW50X2hlYWRlcl9leHRlbnNpb25fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIHVlKHNsaWNlX3NlZ21lbnRfaGVhZGVyX2V4dGVuc2lvbl9sZW5ndGgsIDAsIDI1Nik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdXJyZW50LT5zbGljZV9zZWdtZW50X2hlYWRlcl9leHRlbnNpb25fbGVuZ3RoOyBpKyspCisgICAgICAgICAgICB1KDgsIHNsaWNlX3NlZ21lbnRfaGVhZGVyX2V4dGVuc2lvbl9kYXRhX2J5dGVbaV0sIDB4MDAsIDB4ZmYpOworICAgIH0KKworICAgIENIRUNLKEZVTkMoYnl0ZV9hbGlnbm1lbnQpKGN0eCwgcncpKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jYnNfaW50ZXJuYWwuaCBiL2xpYmF2Y29kZWMvY2JzX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1NDBlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvY2JzX2ludGVybmFsLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQ0JTX0lOVEVSTkFMX0gKKyNkZWZpbmUgQVZDT0RFQ19DQlNfSU5URVJOQUxfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImNicy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKworCit0eXBlZGVmIHN0cnVjdCBDb2RlZEJpdHN0cmVhbVR5cGUgeworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworCisgICAgc2l6ZV90IHByaXZfZGF0YV9zaXplOworCisgICAgLy8gU3BsaXQgZnJhZy0+ZGF0YSBpbnRvIGNvZGVkIGJpdHN0cmVhbSB1bml0cywgY3JlYXRpbmcgdGhlCisgICAgLy8gZnJhZy0+dW5pdHMgYXJyYXkuICBGaWxsIGRhdGEgYnV0IG5vdCBjb250ZW50IG9uIGVhY2ggdW5pdC4KKyAgICAvLyBUaGUgaGVhZGVyIGFyZ3VtZW50IHNob3VsZCBiZSBzZXQgaWYgdGhlIGZyYWdtZW50IGNhbWUgZnJvbQorICAgIC8vIGEgaGVhZGVyIGJsb2NrLCB3aGljaCBtYXkgcmVxdWlyZSBkaWZmZXJlbnQgcGFyc2luZyBmb3Igc29tZQorICAgIC8vIGNvZGVjcyAoZS5nLiB0aGUgQVZDQyBoZWFkZXIgaW4gSC4yNjQpLgorICAgIGludCAoKnNwbGl0X2ZyYWdtZW50KShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlcik7CisKKyAgICAvLyBSZWFkIHRoZSB1bml0LT5kYXRhIGJpdHN0cmVhbSBhbmQgZGVjb21wb3NlIGl0LCBjcmVhdGluZworICAgIC8vIHVuaXQtPmNvbnRlbnQuCisgICAgaW50ICgqcmVhZF91bml0KShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdCk7CisKKyAgICAvLyBXcml0ZSB0aGUgdW5pdC0+ZGF0YSBiaXRzdHJlYW0gZnJvbSB1bml0LT5jb250ZW50LgorICAgIGludCAoKndyaXRlX3VuaXQpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqdW5pdCk7CisKKyAgICAvLyBSZWFkIHRoZSBkYXRhIGZyb20gYWxsIG9mIGZyYWctPnVuaXRzIGFuZCBhc3NlbWJsZSBpdCBpbnRvCisgICAgLy8gYSBiaXRzdHJlYW0gZm9yIHRoZSB3aG9sZSBmcmFnbWVudC4KKyAgICBpbnQgKCphc3NlbWJsZV9mcmFnbWVudCkoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcpOworCisgICAgLy8gRnJlZSB0aGUgY29kZWMgaW50ZXJuYWwgc3RhdGUuCisgICAgdm9pZCAoKmNsb3NlKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCk7Cit9IENvZGVkQml0c3RyZWFtVHlwZTsKKworCisvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB0cmFjZSBvdXRwdXQuCisKK3ZvaWQgZmZfY2JzX3RyYWNlX2hlYWRlcihDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKKwordm9pZCBmZl9jYnNfdHJhY2Vfc3ludGF4X2VsZW1lbnQoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24sIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpiaXRzdHJpbmcsIGludDY0X3QgdmFsdWUpOworCisKKy8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIHJlYWQvd3JpdGUgb2YgY29tbW9uIGJpdHN0cmVhbSBlbGVtZW50cywgaW5jbHVkaW5nCisvLyBnZW5lcmF0aW9uIG9mIHRyYWNlIG91dHB1dC4KKworaW50IGZmX2Nic19yZWFkX3Vuc2lnbmVkKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCAqd3JpdGVfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZ2VfbWluLCB1aW50MzJfdCByYW5nZV9tYXgpOworCitpbnQgZmZfY2JzX3dyaXRlX3Vuc2lnbmVkKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBQdXRCaXRDb250ZXh0ICpwYmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmdlX21pbiwgdWludDMyX3QgcmFuZ2VfbWF4KTsKKworLy8gVGhlIGxhcmdlc3QgdmFsdWUgcmVwcmVzZW50YWJsZSBpbiBOIGJpdHMsIHN1aXRhYmxlIGZvciB1c2UgYXMKKy8vIHJhbmdlX21heCBpbiB0aGUgYWJvdmUgZnVuY3Rpb25zLgorI2RlZmluZSBNQVhfVUlOVF9CSVRTKGxlbmd0aCkgKChVSU5UNjRfQygxKSA8PCAobGVuZ3RoKSkgLSAxKQorCisKK2V4dGVybiBjb25zdCBDb2RlZEJpdHN0cmVhbVR5cGUgZmZfY2JzX3R5cGVfaDI2NDsKK2V4dGVybiBjb25zdCBDb2RlZEJpdHN0cmVhbVR5cGUgZmZfY2JzX3R5cGVfaDI2NTsKK2V4dGVybiBjb25zdCBDb2RlZEJpdHN0cmVhbVR5cGUgZmZfY2JzX3R5cGVfbXBlZzI7CisKKworI2VuZGlmIC8qIEFWQ09ERUNfQ0JTX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JzX21wZWcyLmMgYi9saWJhdmNvZGVjL2Nic19tcGVnMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjY0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2Nic19tcGVnMi5jCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworI2luY2x1ZGUgImNicy5oIgorI2luY2x1ZGUgImNic19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNic19tcGVnMi5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKworI2RlZmluZSBIRUFERVIobmFtZSkgZG8geyBcCisgICAgICAgIGZmX2Nic190cmFjZV9oZWFkZXIoY3R4LCBuYW1lKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0hFQ0soY2FsbCkgZG8geyBcCisgICAgICAgIGVyciA9IChjYWxsKTsgXAorICAgICAgICBpZiAoZXJyIDwgMCkgXAorICAgICAgICAgICAgcmV0dXJuIGVycjsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRlVOQ19OQU1FKHJ3LCBjb2RlYywgbmFtZSkgY2JzXyAjIyBjb2RlYyAjIyBfICMjIHJ3ICMjIF8gIyMgbmFtZQorI2RlZmluZSBGVU5DX01QRUcyKHJ3LCBuYW1lKSBGVU5DX05BTUUocncsIG1wZWcyLCBuYW1lKQorI2RlZmluZSBGVU5DKG5hbWUpIEZVTkNfTVBFRzIoUkVBRFdSSVRFLCBuYW1lKQorCisKKyNkZWZpbmUgUkVBRAorI2RlZmluZSBSRUFEV1JJVEUgcmVhZAorI2RlZmluZSBSV0NvbnRleHQgR2V0Qml0Q29udGV4dAorCisjZGVmaW5lIHh1aSh3aWR0aCwgbmFtZSwgdmFyKSBkbyB7IFwKKyAgICAgICAgdWludDMyX3QgdmFsdWUgPSAwOyBcCisgICAgICAgIENIRUNLKGZmX2Nic19yZWFkX3Vuc2lnbmVkKGN0eCwgcncsIHdpZHRoLCAjbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWUsIDAsICgxIDw8IHdpZHRoKSAtIDEpKTsgXAorICAgICAgICB2YXIgPSB2YWx1ZTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgdWkod2lkdGgsIG5hbWUpIFwKKyAgICAgICAgeHVpKHdpZHRoLCBuYW1lLCBjdXJyZW50LT5uYW1lKQorCisjZGVmaW5lIG1hcmtlcl9iaXQoKSBkbyB7IFwKKyAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90IG9uZTsgXAorICAgICAgICBDSEVDSyhmZl9jYnNfcmVhZF91bnNpZ25lZChjdHgsIHJ3LCAxLCAibWFya2VyX2JpdCIsICZvbmUsIDEsIDEpKTsgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgbmV4dGJpdHMod2lkdGgsIGNvbXBhcmUsIHZhcikgXAorICAgIChnZXRfYml0c19sZWZ0KHJ3KSA+PSB3aWR0aCAmJiBcCisgICAgICh2YXIgPSBzaG93X2JpdHMocncsIHdpZHRoKSkgPT0gKGNvbXBhcmUpKQorCisjaW5jbHVkZSAiY2JzX21wZWcyX3N5bnRheF90ZW1wbGF0ZS5jIgorCisjdW5kZWYgUkVBRAorI3VuZGVmIFJFQURXUklURQorI3VuZGVmIFJXQ29udGV4dAorI3VuZGVmIHh1aQorI3VuZGVmIHVpCisjdW5kZWYgbWFya2VyX2JpdAorI3VuZGVmIG5leHRiaXRzCisKKworI2RlZmluZSBXUklURQorI2RlZmluZSBSRUFEV1JJVEUgd3JpdGUKKyNkZWZpbmUgUldDb250ZXh0IFB1dEJpdENvbnRleHQKKworI2RlZmluZSB4dWkod2lkdGgsIG5hbWUsIHZhcikgZG8geyBcCisgICAgICAgIENIRUNLKGZmX2Nic193cml0ZV91bnNpZ25lZChjdHgsIHJ3LCB3aWR0aCwgI25hbWUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciwgMCwgKDEgPDwgd2lkdGgpIC0gMSkpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSB1aSh3aWR0aCwgbmFtZSkgXAorICAgICAgICB4dWkod2lkdGgsIG5hbWUsIGN1cnJlbnQtPm5hbWUpCisKKyNkZWZpbmUgbWFya2VyX2JpdCgpIGRvIHsgXAorICAgICAgICBDSEVDSyhmZl9jYnNfd3JpdGVfdW5zaWduZWQoY3R4LCBydywgMSwgIm1hcmtlcl9iaXQiLCAxLCAxLCAxKSk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIG5leHRiaXRzKHdpZHRoLCBjb21wYXJlLCB2YXIpICh2YXIpCisKKyNpbmNsdWRlICJjYnNfbXBlZzJfc3ludGF4X3RlbXBsYXRlLmMiCisKKyN1bmRlZiBSRUFECisjdW5kZWYgUkVBRFdSSVRFCisjdW5kZWYgUldDb250ZXh0CisjdW5kZWYgeHVpCisjdW5kZWYgdWkKKyN1bmRlZiBtYXJrZXJfYml0CisjdW5kZWYgbmV4dGJpdHMKKworCitzdGF0aWMgdm9pZCBjYnNfbXBlZzJfZnJlZV91c2VyX2RhdGEodm9pZCAqdW5pdCwgdWludDhfdCAqY29udGVudCkKK3sKKyAgICBNUEVHMlJhd1VzZXJEYXRhICp1c2VyID0gKE1QRUcyUmF3VXNlckRhdGEqKWNvbnRlbnQ7CisgICAgYXZfYnVmZmVyX3VucmVmKCZ1c2VyLT51c2VyX2RhdGFfcmVmKTsKKyAgICBhdl9mcmVlcCgmY29udGVudCk7Cit9CisKK3N0YXRpYyB2b2lkIGNic19tcGVnMl9mcmVlX3NsaWNlKHZvaWQgKnVuaXQsIHVpbnQ4X3QgKmNvbnRlbnQpCit7CisgICAgTVBFRzJSYXdTbGljZSAqc2xpY2UgPSAoTVBFRzJSYXdTbGljZSopY29udGVudDsKKyAgICBhdl9idWZmZXJfdW5yZWYoJnNsaWNlLT5oZWFkZXIuZXh0cmFfaW5mb3JtYXRpb25fcmVmKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJnNsaWNlLT5kYXRhX3JlZik7CisgICAgYXZfZnJlZXAoJmNvbnRlbnQpOworfQorCitzdGF0aWMgaW50IGNic19tcGVnMl9zcGxpdF9mcmFnbWVudChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnN0YXJ0LCAqZW5kOworICAgIHVpbnQ4X3QgKnVuaXRfZGF0YTsKKyAgICB1aW50MzJfdCBzdGFydF9jb2RlID0gLTEsIG5leHRfc3RhcnRfY29kZSA9IC0xOworICAgIHNpemVfdCB1bml0X3NpemU7CisgICAgaW50IGVyciwgaSwgdW5pdF90eXBlOworCisgICAgc3RhcnQgPSBhdnByaXZfZmluZF9zdGFydF9jb2RlKGZyYWctPmRhdGEsIGZyYWctPmRhdGEgKyBmcmFnLT5kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGFydF9jb2RlKTsKKyAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgICAgIGVuZCA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoc3RhcnQsIGZyYWctPmRhdGEgKyBmcmFnLT5kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5leHRfc3RhcnRfY29kZSk7CisKKyAgICAgICAgdW5pdF90eXBlID0gc3RhcnRfY29kZSAmIDB4ZmY7CisKKyAgICAgICAgLy8gVGhlIHN0YXJ0IGFuZCBlbmQgcG9pbnRlcnMgcG9pbnQgYXQgdG8gdGhlIGJ5dGUgZm9sbG93aW5nIHRoZQorICAgICAgICAvLyBzdGFydF9jb2RlX2lkZW50aWZpZXIgaW4gdGhlIHN0YXJ0IGNvZGUgdGhhdCB0aGV5IGZvdW5kLgorICAgICAgICBpZiAoZW5kID09IGZyYWctPmRhdGEgKyBmcmFnLT5kYXRhX3NpemUpIHsKKyAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIGEgc3RhcnQgY29kZSwgc28gdGhpcyBpcyB0aGUgZmluYWwgdW5pdC4KKyAgICAgICAgICAgIHVuaXRfc2l6ZSA9IGVuZCAtIChzdGFydCAtIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVW5pdCBydW5zIGZyb20gc3RhcnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RhcnQgY29kZQorICAgICAgICAgICAgLy8gcG9pbnRlZCB0byBieSBlbmQgKGluY2x1ZGluZyBhbnkgcGFkZGluZyB6ZXJvZXMpLgorICAgICAgICAgICAgdW5pdF9zaXplID0gKGVuZCAtIDQpIC0gKHN0YXJ0IC0gMSk7CisgICAgICAgIH0KKworICAgICAgICB1bml0X2RhdGEgPSBhdl9tYWxsb2ModW5pdF9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghdW5pdF9kYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHVuaXRfZGF0YSwgc3RhcnQgLSAxLCB1bml0X3NpemUpOworICAgICAgICBtZW1zZXQodW5pdF9kYXRhICsgdW5pdF9zaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgICAgICBlcnIgPSBmZl9jYnNfaW5zZXJ0X3VuaXRfZGF0YShjdHgsIGZyYWcsIGksIHVuaXRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdF9kYXRhLCB1bml0X3NpemUsIE5VTEwpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnVuaXRfZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVuZCA9PSBmcmFnLT5kYXRhICsgZnJhZy0+ZGF0YV9zaXplKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc3RhcnRfY29kZSA9IG5leHRfc3RhcnRfY29kZTsKKyAgICAgICAgc3RhcnQgPSBlbmQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2JzX21wZWcyX3JlYWRfdW5pdChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXQgKnVuaXQpCit7CisgICAgR2V0Qml0Q29udGV4dCBnYmM7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGluaXRfZ2V0X2JpdHMoJmdiYywgdW5pdC0+ZGF0YSwgOCAqIHVuaXQtPmRhdGFfc2l6ZSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAoTVBFRzJfU1RBUlRfSVNfU0xJQ0UodW5pdC0+dHlwZSkpIHsKKyAgICAgICAgTVBFRzJSYXdTbGljZSAqc2xpY2U7CisgICAgICAgIGludCBwb3MsIGxlbjsKKworICAgICAgICBlcnIgPSBmZl9jYnNfYWxsb2NfdW5pdF9jb250ZW50KGN0eCwgdW5pdCwgc2l6ZW9mKCpzbGljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNic19tcGVnMl9mcmVlX3NsaWNlKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBzbGljZSA9IHVuaXQtPmNvbnRlbnQ7CisKKyAgICAgICAgZXJyID0gY2JzX21wZWcyX3JlYWRfc2xpY2VfaGVhZGVyKGN0eCwgJmdiYywgJnNsaWNlLT5oZWFkZXIpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgcG9zID0gZ2V0X2JpdHNfY291bnQoJmdiYyk7CisgICAgICAgIGxlbiA9IHVuaXQtPmRhdGFfc2l6ZTsKKworICAgICAgICBzbGljZS0+ZGF0YV9zaXplID0gbGVuIC0gcG9zIC8gODsKKyAgICAgICAgc2xpY2UtPmRhdGFfcmVmICA9IGF2X2J1ZmZlcl9hbGxvYyhzbGljZS0+ZGF0YV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgaWYgKCFzbGljZS0+ZGF0YV9yZWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzbGljZS0+ZGF0YSA9IHNsaWNlLT5kYXRhX3JlZi0+ZGF0YTsKKworICAgICAgICBtZW1jcHkoc2xpY2UtPmRhdGEsCisgICAgICAgICAgICAgICB1bml0LT5kYXRhICsgcG9zIC8gOCwgc2xpY2UtPmRhdGFfc2l6ZSk7CisgICAgICAgIG1lbXNldChzbGljZS0+ZGF0YSArIHNsaWNlLT5kYXRhX3NpemUsIDAsCisgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgc2xpY2UtPmRhdGFfYml0X3N0YXJ0ID0gcG9zICUgODsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAodW5pdC0+dHlwZSkgeworI2RlZmluZSBTVEFSVChzdGFydF9jb2RlLCB0eXBlLCByZWFkX2Z1bmMsIGZyZWVfZnVuYykgXAorICAgICAgICBjYXNlIHN0YXJ0X2NvZGU6IFwKKyAgICAgICAgICAgIHsgXAorICAgICAgICAgICAgICAgIHR5cGUgKmhlYWRlcjsgXAorICAgICAgICAgICAgICAgIGVyciA9IGZmX2Nic19hbGxvY191bml0X2NvbnRlbnQoY3R4LCB1bml0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmhlYWRlciksIGZyZWVfZnVuYyk7IFwKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkgXAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOyBcCisgICAgICAgICAgICAgICAgaGVhZGVyID0gdW5pdC0+Y29udGVudDsgXAorICAgICAgICAgICAgICAgIGVyciA9IGNic19tcGVnMl9yZWFkXyAjIyByZWFkX2Z1bmMoY3R4LCAmZ2JjLCBoZWFkZXIpOyBcCisgICAgICAgICAgICAgICAgaWYgKGVyciA8IDApIFwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIFNUQVJUKDB4MDAsIE1QRUcyUmF3UGljdHVyZUhlYWRlciwgIHBpY3R1cmVfaGVhZGVyLCAgTlVMTCk7CisgICAgICAgICAgICBTVEFSVCgweGIyLCBNUEVHMlJhd1VzZXJEYXRhLCAgICAgICB1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYnNfbXBlZzJfZnJlZV91c2VyX2RhdGEpOworICAgICAgICAgICAgU1RBUlQoMHhiMywgTVBFRzJSYXdTZXF1ZW5jZUhlYWRlciwgc2VxdWVuY2VfaGVhZGVyLCBOVUxMKTsKKyAgICAgICAgICAgIFNUQVJUKDB4YjUsIE1QRUcyUmF3RXh0ZW5zaW9uRGF0YSwgIGV4dGVuc2lvbl9kYXRhLCAgTlVMTCk7CisgICAgICAgICAgICBTVEFSVCgweGI4LCBNUEVHMlJhd0dyb3VwT2ZQaWN0dXJlc0hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwX29mX3BpY3R1cmVzX2hlYWRlciwgTlVMTCk7CisjdW5kZWYgU1RBUlQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gc3RhcnQgY29kZSAlMDIiUFJJeDMyIi5cbiIsCisgICAgICAgICAgICAgICAgICAgdW5pdC0+dHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNic19tcGVnMl93cml0ZV9oZWFkZXIoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1Vbml0ICp1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgKnBiYykKK3sKKyAgICBpbnQgZXJyOworCisgICAgc3dpdGNoICh1bml0LT50eXBlKSB7CisjZGVmaW5lIFNUQVJUKHN0YXJ0X2NvZGUsIHR5cGUsIGZ1bmMpIFwKKyAgICBjYXNlIHN0YXJ0X2NvZGU6IFwKKyAgICAgICAgZXJyID0gY2JzX21wZWcyX3dyaXRlXyAjIyBmdW5jKGN0eCwgcGJjLCB1bml0LT5jb250ZW50KTsgXAorICAgICAgICBicmVhazsKKyAgICAgICAgU1RBUlQoMHgwMCwgTVBFRzJSYXdQaWN0dXJlSGVhZGVyLCAgcGljdHVyZV9oZWFkZXIpOworICAgICAgICBTVEFSVCgweGIyLCBNUEVHMlJhd1VzZXJEYXRhLCAgICAgICB1c2VyX2RhdGEpOworICAgICAgICBTVEFSVCgweGIzLCBNUEVHMlJhd1NlcXVlbmNlSGVhZGVyLCBzZXF1ZW5jZV9oZWFkZXIpOworICAgICAgICBTVEFSVCgweGI1LCBNUEVHMlJhd0V4dGVuc2lvbkRhdGEsICBleHRlbnNpb25fZGF0YSk7CisgICAgICAgIFNUQVJUKDB4YjgsIE1QRUcyUmF3R3JvdXBPZlBpY3R1cmVzSGVhZGVyLCBncm91cF9vZl9waWN0dXJlc19oZWFkZXIpOworI3VuZGVmIFNUQVJUCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGN0eC0+bG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiV3JpdGUgdW5pbXBsZW1lbnRlZCBmb3Igc3RhcnQgIgorICAgICAgICAgICAgICAgImNvZGUgJTAyIlBSSXgzMiIuXG4iLCB1bml0LT50eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY2JzX21wZWcyX3dyaXRlX3NsaWNlKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1Vbml0ICp1bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCAqcGJjKQoreworICAgIE1QRUcyUmF3U2xpY2UgKnNsaWNlID0gdW5pdC0+Y29udGVudDsKKyAgICBHZXRCaXRDb250ZXh0IGdiYzsKKyAgICBzaXplX3QgYml0c19sZWZ0OworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBjYnNfbXBlZzJfd3JpdGVfc2xpY2VfaGVhZGVyKGN0eCwgcGJjLCAmc2xpY2UtPmhlYWRlcik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAoc2xpY2UtPmRhdGEpIHsKKyAgICAgICAgaWYgKHNsaWNlLT5kYXRhX3NpemUgKiA4ICsgOCA+IHB1dF9iaXRzX2xlZnQocGJjKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NQQyk7CisKKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2JjLCBzbGljZS0+ZGF0YSwgc2xpY2UtPmRhdGFfc2l6ZSAqIDgpOworICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2JjLCBzbGljZS0+ZGF0YV9iaXRfc3RhcnQpOworCisgICAgICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KCZnYmMpID4gMTUpCisgICAgICAgICAgICBwdXRfYml0cyhwYmMsIDE2LCBnZXRfYml0cygmZ2JjLCAxNikpOworCisgICAgICAgIGJpdHNfbGVmdCA9IGdldF9iaXRzX2xlZnQoJmdiYyk7CisgICAgICAgIHB1dF9iaXRzKHBiYywgYml0c19sZWZ0LCBnZXRfYml0cygmZ2JjLCBiaXRzX2xlZnQpKTsKKworICAgICAgICAvLyBBbGlnbiB3aXRoIHplcm9lcy4KKyAgICAgICAgd2hpbGUgKHB1dF9iaXRzX2NvdW50KHBiYykgJSA4ICE9IDApCisgICAgICAgICAgICBwdXRfYml0cyhwYmMsIDEsIDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNic19tcGVnMl93cml0ZV91bml0KENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXQgKnVuaXQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1NUEVHMkNvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBQdXRCaXRDb250ZXh0IHBiYzsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKCFwcml2LT53cml0ZV9idWZmZXIpIHsKKyAgICAgICAgLy8gSW5pdGlhbCB3cml0ZSBidWZmZXIgc2l6ZSBpcyAxTUIuCisgICAgICAgIHByaXYtPndyaXRlX2J1ZmZlcl9zaXplID0gMTAyNCAqIDEwMjQ7CisKKyAgICByZWFsbG9jYXRlX2FuZF90cnlfYWdhaW46CisgICAgICAgIGVyciA9IGF2X3JlYWxsb2NwKCZwcml2LT53cml0ZV9idWZmZXIsIHByaXYtPndyaXRlX2J1ZmZlcl9zaXplKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBhICIKKyAgICAgICAgICAgICAgICAgICAic3VmZmljaWVudGx5IGxhcmdlIHdyaXRlIGJ1ZmZlciAobGFzdCBhdHRlbXB0ICIKKyAgICAgICAgICAgICAgICAgICAiJSJTSVpFX1NQRUNJRklFUiIgYnl0ZXMpLlxuIiwgcHJpdi0+d3JpdGVfYnVmZmVyX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRfcHV0X2JpdHMoJnBiYywgcHJpdi0+d3JpdGVfYnVmZmVyLCBwcml2LT53cml0ZV9idWZmZXJfc2l6ZSk7CisKKyAgICBpZiAodW5pdC0+dHlwZSA+PSAweDAxICYmIHVuaXQtPnR5cGUgPD0gMHhhZikKKyAgICAgICAgZXJyID0gY2JzX21wZWcyX3dyaXRlX3NsaWNlKGN0eCwgdW5pdCwgJnBiYyk7CisgICAgZWxzZQorICAgICAgICBlcnIgPSBjYnNfbXBlZzJfd3JpdGVfaGVhZGVyKGN0eCwgdW5pdCwgJnBiYyk7CisKKyAgICBpZiAoZXJyID09IEFWRVJST1IoRU5PU1BDKSkgeworICAgICAgICAvLyBPdmVyZmxvdy4KKyAgICAgICAgcHJpdi0+d3JpdGVfYnVmZmVyX3NpemUgKj0gMjsKKyAgICAgICAgZ290byByZWFsbG9jYXRlX2FuZF90cnlfYWdhaW47CisgICAgfQorICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIC8vIFdyaXRlIGZhaWxlZCBmb3Igc29tZSBvdGhlciByZWFzb24uCisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKHB1dF9iaXRzX2NvdW50KCZwYmMpICUgOCkKKyAgICAgICAgdW5pdC0+ZGF0YV9iaXRfcGFkZGluZyA9IDggLSBwdXRfYml0c19jb3VudCgmcGJjKSAlIDg7CisgICAgZWxzZQorICAgICAgICB1bml0LT5kYXRhX2JpdF9wYWRkaW5nID0gMDsKKworICAgIHVuaXQtPmRhdGFfc2l6ZSA9IChwdXRfYml0c19jb3VudCgmcGJjKSArIDcpIC8gODsKKyAgICBmbHVzaF9wdXRfYml0cygmcGJjKTsKKworICAgIGVyciA9IGZmX2Nic19hbGxvY191bml0X2RhdGEoY3R4LCB1bml0LCB1bml0LT5kYXRhX3NpemUpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgbWVtY3B5KHVuaXQtPmRhdGEsIHByaXYtPndyaXRlX2J1ZmZlciwgdW5pdC0+ZGF0YV9zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNic19tcGVnMl9hc3NlbWJsZV9mcmFnbWVudChDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcpCit7CisgICAgdWludDhfdCAqZGF0YTsKKyAgICBzaXplX3Qgc2l6ZSwgZHAsIHNwOworICAgIGludCBpOworCisgICAgc2l6ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGZyYWctPm5iX3VuaXRzOyBpKyspCisgICAgICAgIHNpemUgKz0gMyArIGZyYWctPnVuaXRzW2ldLmRhdGFfc2l6ZTsKKworICAgIGZyYWctPmRhdGFfcmVmID0gYXZfYnVmZmVyX2FsbG9jKHNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIWZyYWctPmRhdGFfcmVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGRhdGEgPSBmcmFnLT5kYXRhX3JlZi0+ZGF0YTsKKworICAgIGRwID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhZy0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXQgKnVuaXQgPSAmZnJhZy0+dW5pdHNbaV07CisKKyAgICAgICAgZGF0YVtkcCsrXSA9IDA7CisgICAgICAgIGRhdGFbZHArK10gPSAwOworICAgICAgICBkYXRhW2RwKytdID0gMTsKKworICAgICAgICBmb3IgKHNwID0gMDsgc3AgPCB1bml0LT5kYXRhX3NpemU7IHNwKyspCisgICAgICAgICAgICBkYXRhW2RwKytdID0gdW5pdC0+ZGF0YVtzcF07CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChkcCA9PSBzaXplKTsKKworICAgIG1lbXNldChkYXRhICsgc2l6ZSwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgZnJhZy0+ZGF0YSAgICAgID0gZGF0YTsKKyAgICBmcmFnLT5kYXRhX3NpemUgPSBzaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNic19tcGVnMl9jbG9zZShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbU1QRUcyQ29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnByaXYtPndyaXRlX2J1ZmZlcik7Cit9CisKK2NvbnN0IENvZGVkQml0c3RyZWFtVHlwZSBmZl9jYnNfdHlwZV9tcGVnMiA9IHsKKyAgICAuY29kZWNfaWQgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKENvZGVkQml0c3RyZWFtTVBFRzJDb250ZXh0KSwKKworICAgIC5zcGxpdF9mcmFnbWVudCAgICA9ICZjYnNfbXBlZzJfc3BsaXRfZnJhZ21lbnQsCisgICAgLnJlYWRfdW5pdCAgICAgICAgID0gJmNic19tcGVnMl9yZWFkX3VuaXQsCisgICAgLndyaXRlX3VuaXQgICAgICAgID0gJmNic19tcGVnMl93cml0ZV91bml0LAorICAgIC5hc3NlbWJsZV9mcmFnbWVudCA9ICZjYnNfbXBlZzJfYXNzZW1ibGVfZnJhZ21lbnQsCisKKyAgICAuY2xvc2UgICAgICAgICAgICAgPSAmY2JzX21wZWcyX2Nsb3NlLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2JzX21wZWcyLmggYi9saWJhdmNvZGVjL2Nic19tcGVnMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyY2FhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2Nic19tcGVnMi5oCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19DQlNfTVBFRzJfSAorI2RlZmluZSBBVkNPREVDX0NCU19NUEVHMl9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKworCitlbnVtIHsKKyAgICBNUEVHMl9TVEFSVF9QSUNUVVJFICAgICAgICAgPSAweDAwLAorICAgIE1QRUcyX1NUQVJUX1NMSUNFX01JTiAgICAgICA9IDB4MDEsCisgICAgTVBFRzJfU1RBUlRfU0xJQ0VfTUFYICAgICAgID0gMHhhZiwKKyAgICBNUEVHMl9TVEFSVF9VU0VSX0RBVEEgICAgICAgPSAweGIyLAorICAgIE1QRUcyX1NUQVJUX1NFUVVFTkNFX0hFQURFUiA9IDB4YjMsCisgICAgTVBFRzJfU1RBUlRfU0VRVUVOQ0VfRVJST1IgID0gMHhiNCwKKyAgICBNUEVHMl9TVEFSVF9FWFRFTlNJT04gICAgICAgPSAweGI1LAorICAgIE1QRUcyX1NUQVJUX1NFUVVFTkNFX0VORCAgICA9IDB4YjcsCisgICAgTVBFRzJfU1RBUlRfR1JPVVAgICAgICAgICAgID0gMHhiOCwKK307CisKKyNkZWZpbmUgTVBFRzJfU1RBUlRfSVNfU0xJQ0UodHlwZSkgXAorICAgICgodHlwZSkgPj0gTVBFRzJfU1RBUlRfU0xJQ0VfTUlOICYmIFwKKyAgICAgKHR5cGUpIDw9IE1QRUcyX1NUQVJUX1NMSUNFX01BWCkKKworZW51bSB7CisgICAgTVBFRzJfRVhURU5TSU9OX1NFUVVFTkNFICAgICAgICAgICAgICAgICAgPSAweDEsCisgICAgTVBFRzJfRVhURU5TSU9OX1NFUVVFTkNFX0RJU1BMQVkgICAgICAgICAgPSAweDIsCisgICAgTVBFRzJfRVhURU5TSU9OX1FVQU5UX01BVFJJWCAgICAgICAgICAgICAgPSAweDMsCisgICAgTVBFRzJfRVhURU5TSU9OX0NPUFlSSUdIVCAgICAgICAgICAgICAgICAgPSAweDQsCisgICAgTVBFRzJfRVhURU5TSU9OX1NFUVVFTkNFX1NDQUxBQkxFICAgICAgICAgPSAweDUsCisgICAgTVBFRzJfRVhURU5TSU9OX1BJQ1RVUkVfRElTUExBWSAgICAgICAgICAgPSAweDcsCisgICAgTVBFRzJfRVhURU5TSU9OX1BJQ1RVUkVfQ09ESU5HICAgICAgICAgICAgPSAweDgsCisgICAgTVBFRzJfRVhURU5TSU9OX1BJQ1RVUkVfU1BBVElBTF9TQ0FMQUJMRSAgPSAweDksCisgICAgTVBFRzJfRVhURU5TSU9OX1BJQ1RVUkVfVEVNUE9SQUxfU0NBTEFCTEUgPSAweGEsCisgICAgTVBFRzJfRVhURU5TSU9OX0NBTUFFUkFfUEFSQU1FVEVSUyAgICAgICAgPSAweGIsCisgICAgTVBFRzJfRVhURU5TSU9OX0lUVV9UICAgICAgICAgICAgICAgICAgICAgPSAweGMsCit9OworCisKK3R5cGVkZWYgc3RydWN0IE1QRUcyUmF3U2VxdWVuY2VIZWFkZXIgeworICAgIHVpbnQ4X3Qgc2VxdWVuY2VfaGVhZGVyX2NvZGU7CisKKyAgICB1aW50MTZfdCBob3Jpem9udGFsX3NpemVfdmFsdWU7CisgICAgdWludDE2X3QgdmVydGljYWxfc2l6ZV92YWx1ZTsKKyAgICB1aW50OF90IGFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbjsKKyAgICB1aW50OF90IGZyYW1lX3JhdGVfY29kZTsKKyAgICB1aW50MzJfdCBiaXRfcmF0ZV92YWx1ZTsKKyAgICB1aW50MTZfdCB2YnZfYnVmZmVyX3NpemVfdmFsdWU7CisgICAgdWludDhfdCBjb25zdHJhaW5lZF9wYXJhbWV0ZXJzX2ZsYWc7CisKKyAgICB1aW50OF90IGxvYWRfaW50cmFfcXVhbnRpc2VyX21hdHJpeDsKKyAgICB1aW50OF90IGludHJhX3F1YW50aXNlcl9tYXRyaXhbNjRdOworICAgIHVpbnQ4X3QgbG9hZF9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeDsKKyAgICB1aW50OF90IG5vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4WzY0XTsKK30gTVBFRzJSYXdTZXF1ZW5jZUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgTVBFRzJSYXdVc2VyRGF0YSB7CisgICAgdWludDhfdCB1c2VyX2RhdGFfc3RhcnRfY29kZTsKKworICAgIHVpbnQ4X3QgKnVzZXJfZGF0YTsKKyAgICBzaXplX3QgdXNlcl9kYXRhX2xlbmd0aDsKKyAgICBBVkJ1ZmZlclJlZiAqdXNlcl9kYXRhX3JlZjsKK30gTVBFRzJSYXdVc2VyRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgTVBFRzJSYXdTZXF1ZW5jZUV4dGVuc2lvbiB7CisgICAgdWludDhfdCBwcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uOworICAgIHVpbnQ4X3QgcHJvZ3Jlc3NpdmVfc2VxdWVuY2U7CisgICAgdWludDhfdCBjaHJvbWFfZm9ybWF0OworICAgIHVpbnQ4X3QgaG9yaXpvbnRhbF9zaXplX2V4dGVuc2lvbjsKKyAgICB1aW50OF90IHZlcnRpY2FsX3NpemVfZXh0ZW5zaW9uOworICAgIHVpbnQxNl90IGJpdF9yYXRlX2V4dGVuc2lvbjsKKyAgICB1aW50OF90IHZidl9idWZmZXJfc2l6ZV9leHRlbnNpb247CisgICAgdWludDhfdCBsb3dfZGVsYXk7CisgICAgdWludDhfdCBmcmFtZV9yYXRlX2V4dGVuc2lvbl9uOworICAgIHVpbnQ4X3QgZnJhbWVfcmF0ZV9leHRlbnNpb25fZDsKK30gTVBFRzJSYXdTZXF1ZW5jZUV4dGVuc2lvbjsKKwordHlwZWRlZiBzdHJ1Y3QgTVBFRzJSYXdTZXF1ZW5jZURpc3BsYXlFeHRlbnNpb24geworICAgIHVpbnQ4X3QgdmlkZW9fZm9ybWF0OworCisgICAgdWludDhfdCBjb2xvdXJfZGVzY3JpcHRpb247CisgICAgdWludDhfdCBjb2xvdXJfcHJpbWFyaWVzOworICAgIHVpbnQ4X3QgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHVpbnQ4X3QgbWF0cml4X2NvZWZmaWNpZW50czsKKworICAgIHVpbnQxNl90IGRpc3BsYXlfaG9yaXpvbnRhbF9zaXplOworICAgIHVpbnQxNl90IGRpc3BsYXlfdmVydGljYWxfc2l6ZTsKK30gTVBFRzJSYXdTZXF1ZW5jZURpc3BsYXlFeHRlbnNpb247CisKK3R5cGVkZWYgc3RydWN0IE1QRUcyUmF3R3JvdXBPZlBpY3R1cmVzSGVhZGVyIHsKKyAgICB1aW50OF90IGdyb3VwX3N0YXJ0X2NvZGU7CisKKyAgICB1aW50MzJfdCB0aW1lX2NvZGU7CisgICAgdWludDhfdCBjbG9zZWRfZ29wOworICAgIHVpbnQ4X3QgYnJva2VuX2xpbms7Cit9IE1QRUcyUmF3R3JvdXBPZlBpY3R1cmVzSGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCBNUEVHMlJhd1BpY3R1cmVIZWFkZXIgeworICAgIHVpbnQ4X3QgcGljdHVyZV9zdGFydF9jb2RlOworCisgICAgdWludDE2X3QgdGVtcG9yYWxfcmVmZXJlbmNlOworICAgIHVpbnQ4X3QgcGljdHVyZV9jb2RpbmdfdHlwZTsKKyAgICB1aW50MTZfdCB2YnZfZGVsYXk7CisKKyAgICB1aW50OF90IGZ1bGxfcGVsX2ZvcndhcmRfdmVjdG9yOworICAgIHVpbnQ4X3QgZm9yd2FyZF9mX2NvZGU7CisgICAgdWludDhfdCBmdWxsX3BlbF9iYWNrd2FyZF92ZWN0b3I7CisgICAgdWludDhfdCBiYWNrd2FyZF9mX2NvZGU7CisKKyAgICB1aW50OF90IGV4dHJhX2JpdF9waWN0dXJlOworfSBNUEVHMlJhd1BpY3R1cmVIZWFkZXI7CisKK3R5cGVkZWYgc3RydWN0IE1QRUcyUmF3UGljdHVyZUNvZGluZ0V4dGVuc2lvbiB7CisgICAgdWludDhfdCBmX2NvZGVbMl1bMl07CisKKyAgICB1aW50OF90IGludHJhX2RjX3ByZWNpc2lvbjsKKyAgICB1aW50OF90IHBpY3R1cmVfc3RydWN0dXJlOworICAgIHVpbnQ4X3QgdG9wX2ZpZWxkX2ZpcnN0OworICAgIHVpbnQ4X3QgZnJhbWVfcHJlZF9mcmFtZV9kY3Q7CisgICAgdWludDhfdCBjb25jZWFsbWVudF9tb3Rpb25fdmVjdG9yczsKKyAgICB1aW50OF90IHFfc2NhbGVfdHlwZTsKKyAgICB1aW50OF90IGludHJhX3ZsY19mb3JtYXQ7CisgICAgdWludDhfdCBhbHRlcm5hdGVfc2NhbjsKKyAgICB1aW50OF90IHJlcGVhdF9maXJzdF9maWVsZDsKKyAgICB1aW50OF90IGNocm9tYV80MjBfdHlwZTsKKyAgICB1aW50OF90IHByb2dyZXNzaXZlX2ZyYW1lOworCisgICAgdWludDhfdCBjb21wb3NpdGVfZGlzcGxheV9mbGFnOworICAgIHVpbnQ4X3Qgdl9heGlzOworICAgIHVpbnQ4X3QgZmllbGRfc2VxdWVuY2U7CisgICAgdWludDhfdCBzdWJfY2FycmllcjsKKyAgICB1aW50OF90IGJ1cnN0X2FtcGxpdHVkZTsKKyAgICB1aW50OF90IHN1Yl9jYXJyaWVyX3BoYXNlOworfSBNUEVHMlJhd1BpY3R1cmVDb2RpbmdFeHRlbnNpb247CisKK3R5cGVkZWYgc3RydWN0IE1QRUcyUmF3UXVhbnRNYXRyaXhFeHRlbnNpb24geworICAgIHVpbnQ4X3QgbG9hZF9pbnRyYV9xdWFudGlzZXJfbWF0cml4OworICAgIHVpbnQ4X3QgaW50cmFfcXVhbnRpc2VyX21hdHJpeFs2NF07CisgICAgdWludDhfdCBsb2FkX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4OworICAgIHVpbnQ4X3Qgbm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXhbNjRdOworICAgIHVpbnQ4X3QgbG9hZF9jaHJvbWFfaW50cmFfcXVhbnRpc2VyX21hdHJpeDsKKyAgICB1aW50OF90IGNocm9tYV9pbnRyYV9xdWFudGlzZXJfbWF0cml4WzY0XTsKKyAgICB1aW50OF90IGxvYWRfY2hyb21hX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4OworICAgIHVpbnQ4X3QgY2hyb21hX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4WzY0XTsKK30gTVBFRzJSYXdRdWFudE1hdHJpeEV4dGVuc2lvbjsKKwordHlwZWRlZiBzdHJ1Y3QgTVBFRzJSYXdQaWN0dXJlRGlzcGxheUV4dGVuc2lvbiB7CisgICAgdWludDE2X3QgZnJhbWVfY2VudHJlX2hvcml6b250YWxfb2Zmc2V0WzNdOworICAgIHVpbnQxNl90IGZyYW1lX2NlbnRyZV92ZXJ0aWNhbF9vZmZzZXRbM107Cit9IE1QRUcyUmF3UGljdHVyZURpc3BsYXlFeHRlbnNpb247CisKK3R5cGVkZWYgc3RydWN0IE1QRUcyUmF3RXh0ZW5zaW9uRGF0YSB7CisgICAgdWludDhfdCBleHRlbnNpb25fc3RhcnRfY29kZTsKKyAgICB1aW50OF90IGV4dGVuc2lvbl9zdGFydF9jb2RlX2lkZW50aWZpZXI7CisKKyAgICB1bmlvbiB7CisgICAgICAgIE1QRUcyUmF3U2VxdWVuY2VFeHRlbnNpb24gc2VxdWVuY2U7CisgICAgICAgIE1QRUcyUmF3U2VxdWVuY2VEaXNwbGF5RXh0ZW5zaW9uIHNlcXVlbmNlX2Rpc3BsYXk7CisgICAgICAgIE1QRUcyUmF3UXVhbnRNYXRyaXhFeHRlbnNpb24gcXVhbnRfbWF0cml4OworICAgICAgICBNUEVHMlJhd1BpY3R1cmVDb2RpbmdFeHRlbnNpb24gcGljdHVyZV9jb2Rpbmc7CisgICAgICAgIE1QRUcyUmF3UGljdHVyZURpc3BsYXlFeHRlbnNpb24gcGljdHVyZV9kaXNwbGF5OworICAgIH0gZGF0YTsKK30gTVBFRzJSYXdFeHRlbnNpb25EYXRhOworCit0eXBlZGVmIHN0cnVjdCBNUEVHMlJhd1NsaWNlSGVhZGVyIHsKKyAgICB1aW50OF90IHNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uOworCisgICAgdWludDhfdCBzbGljZV92ZXJ0aWNhbF9wb3NpdGlvbl9leHRlbnNpb247CisgICAgdWludDhfdCBwcmlvcml0eV9icmVha3BvaW50OworCisgICAgdWludDhfdCBxdWFudGlzZXJfc2NhbGVfY29kZTsKKworICAgIHVpbnQ4X3Qgc2xpY2VfZXh0ZW5zaW9uX2ZsYWc7CisgICAgdWludDhfdCBpbnRyYV9zbGljZTsKKyAgICB1aW50OF90IHNsaWNlX3BpY3R1cmVfaWRfZW5hYmxlOworICAgIHVpbnQ4X3Qgc2xpY2VfcGljdHVyZV9pZDsKKworICAgIHVpbnQ4X3QgZXh0cmFfYml0X3NsaWNlOworCisgICAgc2l6ZV90IGV4dHJhX2luZm9ybWF0aW9uX2xlbmd0aDsKKyAgICB1aW50OF90ICpleHRyYV9pbmZvcm1hdGlvbjsKKyAgICBBVkJ1ZmZlclJlZiAqZXh0cmFfaW5mb3JtYXRpb25fcmVmOworfSBNUEVHMlJhd1NsaWNlSGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCBNUEVHMlJhd1NsaWNlIHsKKyAgICBNUEVHMlJhd1NsaWNlSGVhZGVyIGhlYWRlcjsKKworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgc2l6ZV90ICAgZGF0YV9zaXplOworICAgIGludCAgICAgIGRhdGFfYml0X3N0YXJ0OworICAgIEFWQnVmZmVyUmVmICpkYXRhX3JlZjsKK30gTVBFRzJSYXdTbGljZTsKKworCit0eXBlZGVmIHN0cnVjdCBDb2RlZEJpdHN0cmVhbU1QRUcyQ29udGV4dCB7CisgICAgLy8gRWxlbWVudHMgc3RvcmVkIGluIGhlYWRlcnMgd2hpY2ggYXJlIHJlcXVpcmVkIGZvciBvdGhlciBkZWNvZGluZy4KKyAgICB1aW50MTZfdCBob3Jpem9udGFsX3NpemU7CisgICAgdWludDE2X3QgdmVydGljYWxfc2l6ZTsKKyAgICB1aW50OF90IHNjYWxhYmxlOworICAgIHVpbnQ4X3Qgc2NhbGFibGVfbW9kZTsKKyAgICB1aW50OF90IHByb2dyZXNzaXZlX3NlcXVlbmNlOworICAgIHVpbnQ4X3QgbnVtYmVyX29mX2ZyYW1lX2NlbnRyZV9vZmZzZXRzOworCisgICAgLy8gV3JpdGUgYnVmZmVyLgorICAgIHVpbnQ4X3QgKndyaXRlX2J1ZmZlcjsKKyAgICBzaXplX3Qgd3JpdGVfYnVmZmVyX3NpemU7Cit9IENvZGVkQml0c3RyZWFtTVBFRzJDb250ZXh0OworCisKKyNlbmRpZiAvKiBBVkNPREVDX0NCU19NUEVHMl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Nic19tcGVnMl9zeW50YXhfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvY2JzX21wZWcyX3N5bnRheF90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNWYxOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2Nic19tcGVnMl9zeW50YXhfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDM4NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCitzdGF0aWMgaW50IEZVTkMoc2VxdWVuY2VfaGVhZGVyKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUcyUmF3U2VxdWVuY2VIZWFkZXIgKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1NUEVHMkNvbnRleHQgKm1wZWcyID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGVyciwgaTsKKworICAgIEhFQURFUigiU2VxdWVuY2UgSGVhZGVyIik7CisKKyAgICB1aSg4LCAgc2VxdWVuY2VfaGVhZGVyX2NvZGUpOworCisgICAgdWkoMTIsIGhvcml6b250YWxfc2l6ZV92YWx1ZSk7CisgICAgdWkoMTIsIHZlcnRpY2FsX3NpemVfdmFsdWUpOworCisgICAgbXBlZzItPmhvcml6b250YWxfc2l6ZSA9IGN1cnJlbnQtPmhvcml6b250YWxfc2l6ZV92YWx1ZTsKKyAgICBtcGVnMi0+dmVydGljYWxfc2l6ZSAgID0gY3VycmVudC0+dmVydGljYWxfc2l6ZV92YWx1ZTsKKworICAgIHVpKDQsICBhc3BlY3RfcmF0aW9faW5mb3JtYXRpb24pOworICAgIHVpKDQsICBmcmFtZV9yYXRlX2NvZGUpOworICAgIHVpKDE4LCBiaXRfcmF0ZV92YWx1ZSk7CisKKyAgICBtYXJrZXJfYml0KCk7CisKKyAgICB1aSgxMCwgdmJ2X2J1ZmZlcl9zaXplX3ZhbHVlKTsKKyAgICB1aSgxLCAgY29uc3RyYWluZWRfcGFyYW1ldGVyc19mbGFnKTsKKworICAgIHVpKDEsIGxvYWRfaW50cmFfcXVhbnRpc2VyX21hdHJpeCk7CisgICAgaWYgKGN1cnJlbnQtPmxvYWRfaW50cmFfcXVhbnRpc2VyX21hdHJpeCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIHVpKDgsIGludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0pOworICAgIH0KKworICAgIHVpKDEsIGxvYWRfbm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXgpOworICAgIGlmIChjdXJyZW50LT5sb2FkX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgdWkoOCwgbm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkModXNlcl9kYXRhKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUcyUmF3VXNlckRhdGEgKmN1cnJlbnQpCit7CisgICAgc2l6ZV90IGs7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiVXNlciBEYXRhIik7CisKKyAgICB1aSg4LCB1c2VyX2RhdGFfc3RhcnRfY29kZSk7CisKKyNpZmRlZiBSRUFECisgICAgayA9IGdldF9iaXRzX2xlZnQocncpOworICAgIGF2X2Fzc2VydDAoayAlIDggPT0gMCk7CisgICAgY3VycmVudC0+dXNlcl9kYXRhX2xlbmd0aCA9IGsgLz0gODsKKyAgICBpZiAoayA+IDApIHsKKyAgICAgICAgY3VycmVudC0+dXNlcl9kYXRhX3JlZiA9IGF2X2J1ZmZlcl9hbGxvY3ooayArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWN1cnJlbnQtPnVzZXJfZGF0YV9yZWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBjdXJyZW50LT51c2VyX2RhdGEgPSBjdXJyZW50LT51c2VyX2RhdGFfcmVmLT5kYXRhOworICAgIH0KKyNlbmRpZgorCisgICAgZm9yIChrID0gMDsgayA8IGN1cnJlbnQtPnVzZXJfZGF0YV9sZW5ndGg7IGsrKykKKyAgICAgICAgeHVpKDgsIHVzZXJfZGF0YSwgY3VycmVudC0+dXNlcl9kYXRhW2tdKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoc2VxdWVuY2VfZXh0ZW5zaW9uKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUcyUmF3U2VxdWVuY2VFeHRlbnNpb24gKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1NUEVHMkNvbnRleHQgKm1wZWcyID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiU2VxdWVuY2UgRXh0ZW5zaW9uIik7CisKKyAgICB1aSg4LCAgcHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbik7CisgICAgdWkoMSwgIHByb2dyZXNzaXZlX3NlcXVlbmNlKTsKKyAgICB1aSgyLCAgY2hyb21hX2Zvcm1hdCk7CisgICAgdWkoMiwgIGhvcml6b250YWxfc2l6ZV9leHRlbnNpb24pOworICAgIHVpKDIsICB2ZXJ0aWNhbF9zaXplX2V4dGVuc2lvbik7CisKKyAgICBtcGVnMi0+aG9yaXpvbnRhbF9zaXplID0gKG1wZWcyLT5ob3Jpem9udGFsX3NpemUgJiAweGZmZikgfAorICAgICAgICBjdXJyZW50LT5ob3Jpem9udGFsX3NpemVfZXh0ZW5zaW9uIDw8IDEyOworICAgIG1wZWcyLT52ZXJ0aWNhbF9zaXplID0gKG1wZWcyLT52ZXJ0aWNhbF9zaXplICYgMHhmZmYpIHwKKyAgICAgICAgY3VycmVudC0+dmVydGljYWxfc2l6ZV9leHRlbnNpb24gPDwgMTI7CisgICAgbXBlZzItPnByb2dyZXNzaXZlX3NlcXVlbmNlID0gY3VycmVudC0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2U7CisKKyAgICB1aSgxMiwgYml0X3JhdGVfZXh0ZW5zaW9uKTsKKyAgICBtYXJrZXJfYml0KCk7CisgICAgdWkoOCwgIHZidl9idWZmZXJfc2l6ZV9leHRlbnNpb24pOworICAgIHVpKDEsICBsb3dfZGVsYXkpOworICAgIHVpKDIsICBmcmFtZV9yYXRlX2V4dGVuc2lvbl9uKTsKKyAgICB1aSg1LCAgZnJhbWVfcmF0ZV9leHRlbnNpb25fZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBGVU5DKHNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRzJSYXdTZXF1ZW5jZURpc3BsYXlFeHRlbnNpb24gKmN1cnJlbnQpCit7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiU2VxdWVuY2UgRGlzcGxheSBFeHRlbnNpb24iKTsKKworICAgIHVpKDMsIHZpZGVvX2Zvcm1hdCk7CisKKyAgICB1aSgxLCBjb2xvdXJfZGVzY3JpcHRpb24pOworICAgIGlmIChjdXJyZW50LT5jb2xvdXJfZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdWkoOCwgY29sb3VyX3ByaW1hcmllcyk7CisgICAgICAgIHVpKDgsIHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyk7CisgICAgICAgIHVpKDgsIG1hdHJpeF9jb2VmZmljaWVudHMpOworICAgIH0KKworICAgIHVpKDE0LCBkaXNwbGF5X2hvcml6b250YWxfc2l6ZSk7CisgICAgbWFya2VyX2JpdCgpOworICAgIHVpKDE0LCBkaXNwbGF5X3ZlcnRpY2FsX3NpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRlVOQyhncm91cF9vZl9waWN0dXJlc19oZWFkZXIpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRzJSYXdHcm91cE9mUGljdHVyZXNIZWFkZXIgKmN1cnJlbnQpCit7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiR3JvdXAgb2YgUGljdHVyZXMgSGVhZGVyIik7CisKKyAgICB1aSg4LCAgZ3JvdXBfc3RhcnRfY29kZSk7CisKKyAgICB1aSgyNSwgdGltZV9jb2RlKTsKKyAgICB1aSgxLCAgY2xvc2VkX2dvcCk7CisgICAgdWkoMSwgIGJyb2tlbl9saW5rKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMocGljdHVyZV9oZWFkZXIpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHMlJhd1BpY3R1cmVIZWFkZXIgKmN1cnJlbnQpCit7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiUGljdHVyZSBIZWFkZXIiKTsKKworICAgIHVpKDgsICBwaWN0dXJlX3N0YXJ0X2NvZGUpOworCisgICAgdWkoMTAsIHRlbXBvcmFsX3JlZmVyZW5jZSk7CisgICAgdWkoMywgIHBpY3R1cmVfY29kaW5nX3R5cGUpOworICAgIHVpKDE2LCB2YnZfZGVsYXkpOworCisgICAgaWYgKGN1cnJlbnQtPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMiB8fAorICAgICAgICBjdXJyZW50LT5waWN0dXJlX2NvZGluZ190eXBlID09IDMpIHsKKyAgICAgICAgdWkoMSwgZnVsbF9wZWxfZm9yd2FyZF92ZWN0b3IpOworICAgICAgICB1aSgzLCBmb3J3YXJkX2ZfY29kZSk7CisgICAgfQorCisgICAgaWYgKGN1cnJlbnQtPnBpY3R1cmVfY29kaW5nX3R5cGUgPT0gMykgeworICAgICAgICB1aSgxLCBmdWxsX3BlbF9iYWNrd2FyZF92ZWN0b3IpOworICAgICAgICB1aSgzLCBiYWNrd2FyZF9mX2NvZGUpOworICAgIH0KKworICAgIHVpKDEsIGV4dHJhX2JpdF9waWN0dXJlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMocGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUcyUmF3UGljdHVyZUNvZGluZ0V4dGVuc2lvbiAqY3VycmVudCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbU1QRUcyQ29udGV4dCAqbXBlZzIgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgZXJyOworCisgICAgSEVBREVSKCJQaWN0dXJlIENvZGluZyBFeHRlbnNpb24iKTsKKworICAgIHVpKDQsIGZfY29kZVswXVswXSk7CisgICAgdWkoNCwgZl9jb2RlWzBdWzFdKTsKKyAgICB1aSg0LCBmX2NvZGVbMV1bMF0pOworICAgIHVpKDQsIGZfY29kZVsxXVsxXSk7CisKKyAgICB1aSgyLCBpbnRyYV9kY19wcmVjaXNpb24pOworICAgIHVpKDIsIHBpY3R1cmVfc3RydWN0dXJlKTsKKyAgICB1aSgxLCB0b3BfZmllbGRfZmlyc3QpOworICAgIHVpKDEsIGZyYW1lX3ByZWRfZnJhbWVfZGN0KTsKKyAgICB1aSgxLCBjb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycyk7CisgICAgdWkoMSwgcV9zY2FsZV90eXBlKTsKKyAgICB1aSgxLCBpbnRyYV92bGNfZm9ybWF0KTsKKyAgICB1aSgxLCBhbHRlcm5hdGVfc2Nhbik7CisgICAgdWkoMSwgcmVwZWF0X2ZpcnN0X2ZpZWxkKTsKKyAgICB1aSgxLCBjaHJvbWFfNDIwX3R5cGUpOworICAgIHVpKDEsIHByb2dyZXNzaXZlX2ZyYW1lKTsKKworICAgIGlmIChtcGVnMi0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQtPnJlcGVhdF9maXJzdF9maWVsZCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnRvcF9maWVsZF9maXJzdCkKKyAgICAgICAgICAgICAgICBtcGVnMi0+bnVtYmVyX29mX2ZyYW1lX2NlbnRyZV9vZmZzZXRzID0gMzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtcGVnMi0+bnVtYmVyX29mX2ZyYW1lX2NlbnRyZV9vZmZzZXRzID0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1wZWcyLT5udW1iZXJfb2ZfZnJhbWVfY2VudHJlX29mZnNldHMgPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGN1cnJlbnQtPnBpY3R1cmVfc3RydWN0dXJlID09IDEgfHwgLy8gVG9wIGZpZWxkLgorICAgICAgICAgICAgY3VycmVudC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gMikgeyAvLyBCb3R0b20gZmllbGQuCisgICAgICAgICAgICBtcGVnMi0+bnVtYmVyX29mX2ZyYW1lX2NlbnRyZV9vZmZzZXRzID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50LT5yZXBlYXRfZmlyc3RfZmllbGQpCisgICAgICAgICAgICAgICAgbXBlZzItPm51bWJlcl9vZl9mcmFtZV9jZW50cmVfb2Zmc2V0cyA9IDM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbXBlZzItPm51bWJlcl9vZl9mcmFtZV9jZW50cmVfb2Zmc2V0cyA9IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aSgxLCBjb21wb3NpdGVfZGlzcGxheV9mbGFnKTsKKyAgICBpZiAoY3VycmVudC0+Y29tcG9zaXRlX2Rpc3BsYXlfZmxhZykgeworICAgICAgICB1aSgxLCB2X2F4aXMpOworICAgICAgICB1aSgzLCBmaWVsZF9zZXF1ZW5jZSk7CisgICAgICAgIHVpKDEsIHN1Yl9jYXJyaWVyKTsKKyAgICAgICAgdWkoNywgYnVyc3RfYW1wbGl0dWRlKTsKKyAgICAgICAgdWkoOCwgc3ViX2NhcnJpZXJfcGhhc2UpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMocXVhbnRfbWF0cml4X2V4dGVuc2lvbikoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRzJSYXdRdWFudE1hdHJpeEV4dGVuc2lvbiAqY3VycmVudCkKK3sKKyAgICBpbnQgZXJyLCBpOworCisgICAgSEVBREVSKCJRdWFudCBNYXRyaXggRXh0ZW5zaW9uIik7CisKKyAgICB1aSgxLCBsb2FkX2ludHJhX3F1YW50aXNlcl9tYXRyaXgpOworICAgIGlmIChjdXJyZW50LT5sb2FkX2ludHJhX3F1YW50aXNlcl9tYXRyaXgpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICB1aSg4LCBpbnRyYV9xdWFudGlzZXJfbWF0cml4W2ldKTsKKyAgICB9CisKKyAgICB1aSgxLCBsb2FkX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4KTsKKyAgICBpZiAoY3VycmVudC0+bG9hZF9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIHVpKDgsIG5vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4W2ldKTsKKyAgICB9CisKKyAgICB1aSgxLCBsb2FkX2Nocm9tYV9pbnRyYV9xdWFudGlzZXJfbWF0cml4KTsKKyAgICBpZiAoY3VycmVudC0+bG9hZF9jaHJvbWFfaW50cmFfcXVhbnRpc2VyX21hdHJpeCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIHVpKDgsIGludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0pOworICAgIH0KKworICAgIHVpKDEsIGxvYWRfY2hyb21hX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4KTsKKyAgICBpZiAoY3VycmVudC0+bG9hZF9jaHJvbWFfbm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXgpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICB1aSg4LCBjaHJvbWFfbm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMocGljdHVyZV9kaXNwbGF5X2V4dGVuc2lvbikoQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjdHgsIFJXQ29udGV4dCAqcncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRzJSYXdQaWN0dXJlRGlzcGxheUV4dGVuc2lvbiAqY3VycmVudCkKK3sKKyAgICBDb2RlZEJpdHN0cmVhbU1QRUcyQ29udGV4dCAqbXBlZzIgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgZXJyLCBpOworCisgICAgSEVBREVSKCJQaWN0dXJlIERpc3BsYXkgRXh0ZW5zaW9uIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXBlZzItPm51bWJlcl9vZl9mcmFtZV9jZW50cmVfb2Zmc2V0czsgaSsrKSB7CisgICAgICAgIHVpKDE2LCBmcmFtZV9jZW50cmVfaG9yaXpvbnRhbF9vZmZzZXRbaV0pOworICAgICAgICBtYXJrZXJfYml0KCk7CisgICAgICAgIHVpKDE2LCBmcmFtZV9jZW50cmVfdmVydGljYWxfb2Zmc2V0W2ldKTsKKyAgICAgICAgbWFya2VyX2JpdCgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZVTkMoZXh0ZW5zaW9uX2RhdGEpKENvZGVkQml0c3RyZWFtQ29udGV4dCAqY3R4LCBSV0NvbnRleHQgKnJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHMlJhd0V4dGVuc2lvbkRhdGEgKmN1cnJlbnQpCit7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiRXh0ZW5zaW9uIERhdGEiKTsKKworICAgIHVpKDgsIGV4dGVuc2lvbl9zdGFydF9jb2RlKTsKKyAgICB1aSg0LCBleHRlbnNpb25fc3RhcnRfY29kZV9pZGVudGlmaWVyKTsKKworICAgIHN3aXRjaCAoY3VycmVudC0+ZXh0ZW5zaW9uX3N0YXJ0X2NvZGVfaWRlbnRpZmllcikgeworICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIEZVTkMoc2VxdWVuY2VfZXh0ZW5zaW9uKQorICAgICAgICAgICAgKGN0eCwgcncsICZjdXJyZW50LT5kYXRhLnNlcXVlbmNlKTsKKyAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBGVU5DKHNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uKQorICAgICAgICAgICAgKGN0eCwgcncsICZjdXJyZW50LT5kYXRhLnNlcXVlbmNlX2Rpc3BsYXkpOworICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIEZVTkMocXVhbnRfbWF0cml4X2V4dGVuc2lvbikKKyAgICAgICAgICAgIChjdHgsIHJ3LCAmY3VycmVudC0+ZGF0YS5xdWFudF9tYXRyaXgpOworICAgIGNhc2UgNzoKKyAgICAgICAgcmV0dXJuIEZVTkMocGljdHVyZV9kaXNwbGF5X2V4dGVuc2lvbikKKyAgICAgICAgICAgIChjdHgsIHJ3LCAmY3VycmVudC0+ZGF0YS5waWN0dXJlX2Rpc3BsYXkpOworICAgIGNhc2UgODoKKyAgICAgICAgcmV0dXJuIEZVTkMocGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uKQorICAgICAgICAgICAgKGN0eCwgcncsICZjdXJyZW50LT5kYXRhLnBpY3R1cmVfY29kaW5nKTsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coY3R4LT5sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGV4dGVuc2lvbiBJRCAlZC5cbiIsCisgICAgICAgICAgICAgICBjdXJyZW50LT5leHRlbnNpb25fc3RhcnRfY29kZV9pZGVudGlmaWVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorfQorCitzdGF0aWMgaW50IEZVTkMoc2xpY2VfaGVhZGVyKShDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmN0eCwgUldDb250ZXh0ICpydywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUcyUmF3U2xpY2VIZWFkZXIgKmN1cnJlbnQpCit7CisgICAgQ29kZWRCaXRzdHJlYW1NUEVHMkNvbnRleHQgKm1wZWcyID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGVycjsKKworICAgIEhFQURFUigiU2xpY2UgSGVhZGVyIik7CisKKyAgICB1aSg4LCBzbGljZV92ZXJ0aWNhbF9wb3NpdGlvbik7CisKKyAgICBpZiAobXBlZzItPnZlcnRpY2FsX3NpemUgPiAyODAwKQorICAgICAgICB1aSgzLCBzbGljZV92ZXJ0aWNhbF9wb3NpdGlvbl9leHRlbnNpb24pOworICAgIGlmIChtcGVnMi0+c2NhbGFibGUpIHsKKyAgICAgICAgaWYgKG1wZWcyLT5zY2FsYWJsZV9tb2RlID09IDApCisgICAgICAgICAgICB1aSg3LCBwcmlvcml0eV9icmVha3BvaW50KTsKKyAgICB9CisKKyAgICB1aSg1LCBxdWFudGlzZXJfc2NhbGVfY29kZSk7CisKKyAgICBpZiAobmV4dGJpdHMoMSwgMSwgY3VycmVudC0+c2xpY2VfZXh0ZW5zaW9uX2ZsYWcpKSB7CisgICAgICAgIHVpKDEsIHNsaWNlX2V4dGVuc2lvbl9mbGFnKTsKKyAgICAgICAgdWkoMSwgaW50cmFfc2xpY2UpOworICAgICAgICB1aSgxLCBzbGljZV9waWN0dXJlX2lkX2VuYWJsZSk7CisgICAgICAgIHVpKDYsIHNsaWNlX3BpY3R1cmVfaWQpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVfdCBrOworI2lmZGVmIFJFQUQKKyAgICAgICAgICAgIEdldEJpdENvbnRleHQgc3RhcnQ7CisgICAgICAgICAgICB1aW50OF90IGJpdDsKKyAgICAgICAgICAgIHN0YXJ0ID0gKnJ3OworICAgICAgICAgICAgZm9yIChrID0gMDsgbmV4dGJpdHMoMSwgMSwgYml0KTsgaysrKQorICAgICAgICAgICAgICAgIHNraXBfYml0cyhydywgOCk7CisgICAgICAgICAgICBjdXJyZW50LT5leHRyYV9pbmZvcm1hdGlvbl9sZW5ndGggPSBrOworICAgICAgICAgICAgaWYgKGsgPiAwKSB7CisgICAgICAgICAgICAgICAgKnJ3ID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgY3VycmVudC0+ZXh0cmFfaW5mb3JtYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBhdl9tYWxsb2MoY3VycmVudC0+ZXh0cmFfaW5mb3JtYXRpb25fbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWN1cnJlbnQtPmV4dHJhX2luZm9ybWF0aW9uKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjdXJyZW50LT5leHRyYV9pbmZvcm1hdGlvbl9sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgICAgICB4dWkoMSwgZXh0cmFfYml0X3NsaWNlLCBiaXQpOworICAgICAgICAgICAgICAgICAgICB4dWkoOCwgZXh0cmFfaW5mb3JtYXRpb25fc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5leHRyYV9pbmZvcm1hdGlvbltrXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjdXJyZW50LT5leHRyYV9pbmZvcm1hdGlvbl9sZW5ndGg7IGsrKykgeworICAgICAgICAgICAgICAgIHh1aSgxLCBleHRyYV9iaXRfc2xpY2UsIDEpOworICAgICAgICAgICAgICAgIHh1aSg4LCBleHRyYV9pbmZvcm1hdGlvbl9zbGljZSwgY3VycmVudC0+ZXh0cmFfaW5mb3JtYXRpb25ba10pOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyAgICB9CisgICAgdWkoMSwgZXh0cmFfYml0X3NsaWNlKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jY2FwdGlvbl9kZWMuYyBiL2xpYmF2Y29kZWMvY2NhcHRpb25fZGVjLmMKaW5kZXggNzkwZjA3MS4uMDljZWIxYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jY2FwdGlvbl9kZWMuYworKysgYi9saWJhdmNvZGVjL2NjYXB0aW9uX2RlYy5jCkBAIC0zMCw3ICszMCw3IEBACiAjZGVmaW5lIFVOU0VUX0ZMQUcodmFyLCB2YWwpICggKHZhcikgJj0gIH4oIDEgPDwgKHZhbCkpICkKICNkZWZpbmUgQ0hFQ0tfRkxBRyh2YXIsIHZhbCkgKCAodmFyKSAmICAgICggMSA8PCAodmFsKSkgKQogCi1zdGF0aWMgY29uc3QgQVZSYXRpb25hbCBhc3NfdGIgPSB7MSwgMTAwfTsKK3N0YXRpYyBjb25zdCBBVlJhdGlvbmFsIG1zX3RiID0gezEsIDEwMDB9OwogCiAvKgogICogVE9ETyBsaXN0CkBAIC02Myw2ICs2MywxMTYgQEAKICAgICBDQ0ZPTlRfVU5ERVJMSU5FRF9JVEFMSUNTLAogfTsKIAorZW51bSBjY19jaGFyc2V0IHsKKyAgICBDQ1NFVF9CQVNJQ19BTUVSSUNBTiwKKyAgICBDQ1NFVF9TUEVDSUFMX0FNRVJJQ0FOLAorICAgIENDU0VUX0VYVEVOREVEX1NQQU5JU0hfRlJFTkNIX01JU0MsCisgICAgQ0NTRVRfRVhURU5ERURfUE9SVFVHVUVTRV9HRVJNQU5fREFOSVNILAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNoYXJzZXRfb3ZlcnJpZGVzWzRdWzEyOF0gPQoreworICAgIFtDQ1NFVF9CQVNJQ19BTUVSSUNBTl0gPSB7CisgICAgICAgIFsweDI3XSA9ICJcdTIwMTkiLAorICAgICAgICBbMHgyYV0gPSAiXHUwMGUxIiwKKyAgICAgICAgWzB4NWNdID0gIlx1MDBlOSIsCisgICAgICAgIFsweDVlXSA9ICJcdTAwZWQiLAorICAgICAgICBbMHg1Zl0gPSAiXHUwMGYzIiwKKyAgICAgICAgWzB4NjBdID0gIlx1MDBmYSIsCisgICAgICAgIFsweDdiXSA9ICJcdTAwZTciLAorICAgICAgICBbMHg3Y10gPSAiXHUwMGY3IiwKKyAgICAgICAgWzB4N2RdID0gIlx1MDBkMSIsCisgICAgICAgIFsweDdlXSA9ICJcdTAwZjEiLAorICAgICAgICBbMHg3Zl0gPSAiXHUyNTg4IgorICAgIH0sCisgICAgW0NDU0VUX1NQRUNJQUxfQU1FUklDQU5dID0geworICAgICAgICBbMHgzMF0gPSAiXHUwMGFlIiwKKyAgICAgICAgWzB4MzFdID0gIlx1MDBiMCIsCisgICAgICAgIFsweDMyXSA9ICJcdTAwYmQiLAorICAgICAgICBbMHgzM10gPSAiXHUwMGJmIiwKKyAgICAgICAgWzB4MzRdID0gIlx1MjEyMiIsCisgICAgICAgIFsweDM1XSA9ICJcdTAwYTIiLAorICAgICAgICBbMHgzNl0gPSAiXHUwMGEzIiwKKyAgICAgICAgWzB4MzddID0gIlx1MjY2YSIsCisgICAgICAgIFsweDM4XSA9ICJcdTAwZTAiLAorICAgICAgICBbMHgzOV0gPSAiXHUwMEEwIiwKKyAgICAgICAgWzB4M2FdID0gIlx1MDBlOCIsCisgICAgICAgIFsweDNiXSA9ICJcdTAwZTIiLAorICAgICAgICBbMHgzY10gPSAiXHUwMGVhIiwKKyAgICAgICAgWzB4M2RdID0gIlx1MDBlZSIsCisgICAgICAgIFsweDNlXSA9ICJcdTAwZjQiLAorICAgICAgICBbMHgzZl0gPSAiXHUwMGZiIiwKKyAgICB9LAorICAgIFtDQ1NFVF9FWFRFTkRFRF9TUEFOSVNIX0ZSRU5DSF9NSVNDXSA9IHsKKyAgICAgICAgWzB4MjBdID0gIlx1MDBjMSIsCisgICAgICAgIFsweDIxXSA9ICJcdTAwYzkiLAorICAgICAgICBbMHgyMl0gPSAiXHUwMGQzIiwKKyAgICAgICAgWzB4MjNdID0gIlx1MDBkYSIsCisgICAgICAgIFsweDI0XSA9ICJcdTAwZGMiLAorICAgICAgICBbMHgyNV0gPSAiXHUwMGZjIiwKKyAgICAgICAgWzB4MjZdID0gIlx1MDBiNCIsCisgICAgICAgIFsweDI3XSA9ICJcdTAwYTEiLAorICAgICAgICBbMHgyOF0gPSAiKiIsCisgICAgICAgIFsweDI5XSA9ICJcdTIwMTgiLAorICAgICAgICBbMHgyYV0gPSAiLSIsCisgICAgICAgIFsweDJiXSA9ICJcdTAwYTkiLAorICAgICAgICBbMHgyY10gPSAiXHUyMTIwIiwKKyAgICAgICAgWzB4MmRdID0gIlx1MDBiNyIsCisgICAgICAgIFsweDJlXSA9ICJcdTIwMWMiLAorICAgICAgICBbMHgyZl0gPSAiXHUyMDFkIiwKKyAgICAgICAgWzB4MzBdID0gIlx1MDBjMCIsCisgICAgICAgIFsweDMxXSA9ICJcdTAwYzIiLAorICAgICAgICBbMHgzMl0gPSAiXHUwMGM3IiwKKyAgICAgICAgWzB4MzNdID0gIlx1MDBjOCIsCisgICAgICAgIFsweDM0XSA9ICJcdTAwY2EiLAorICAgICAgICBbMHgzNV0gPSAiXHUwMGNiIiwKKyAgICAgICAgWzB4MzZdID0gIlx1MDBlYiIsCisgICAgICAgIFsweDM3XSA9ICJcdTAwY2UiLAorICAgICAgICBbMHgzOF0gPSAiXHUwMGNmIiwKKyAgICAgICAgWzB4MzldID0gIlx1MDBlZiIsCisgICAgICAgIFsweDNhXSA9ICJcdTAwZDQiLAorICAgICAgICBbMHgzYl0gPSAiXHUwMGQ5IiwKKyAgICAgICAgWzB4M2NdID0gIlx1MDBmOSIsCisgICAgICAgIFsweDNkXSA9ICJcdTAwZGIiLAorICAgICAgICBbMHgzZV0gPSAiXHUwMGFiIiwKKyAgICAgICAgWzB4M2ZdID0gIlx1MDBiYiIsCisgICAgfSwKKyAgICBbQ0NTRVRfRVhURU5ERURfUE9SVFVHVUVTRV9HRVJNQU5fREFOSVNIXSA9IHsKKyAgICAgICAgWzB4MjBdID0gIlx1MDBjMyIsCisgICAgICAgIFsweDIxXSA9ICJcdTAwZTMiLAorICAgICAgICBbMHgyMl0gPSAiXHUwMGNkIiwKKyAgICAgICAgWzB4MjNdID0gIlx1MDBjYyIsCisgICAgICAgIFsweDI0XSA9ICJcdTAwZWMiLAorICAgICAgICBbMHgyNV0gPSAiXHUwMGQyIiwKKyAgICAgICAgWzB4MjZdID0gIlx1MDBmMiIsCisgICAgICAgIFsweDI3XSA9ICJcdTAwZDUiLAorICAgICAgICBbMHgyOF0gPSAiXHUwMGY1IiwKKyAgICAgICAgWzB4MjldID0gInsiLAorICAgICAgICBbMHgyYV0gPSAifSIsCisgICAgICAgIFsweDJiXSA9ICJcXCIsCisgICAgICAgIFsweDJjXSA9ICJeIiwKKyAgICAgICAgWzB4MmRdID0gIl8iLAorICAgICAgICBbMHgyZV0gPSAifCIsCisgICAgICAgIFsweDJmXSA9ICJ+IiwKKyAgICAgICAgWzB4MzBdID0gIlx1MDBjNCIsCisgICAgICAgIFsweDMxXSA9ICJcdTAwZTQiLAorICAgICAgICBbMHgzMl0gPSAiXHUwMGQ2IiwKKyAgICAgICAgWzB4MzNdID0gIlx1MDBmNiIsCisgICAgICAgIFsweDM0XSA9ICJcdTAwZGYiLAorICAgICAgICBbMHgzNV0gPSAiXHUwMGE1IiwKKyAgICAgICAgWzB4MzZdID0gIlx1MDBhNCIsCisgICAgICAgIFsweDM3XSA9ICJcdTAwYTYiLAorICAgICAgICBbMHgzOF0gPSAiXHUwMGM1IiwKKyAgICAgICAgWzB4MzldID0gIlx1MDBlNSIsCisgICAgICAgIFsweDNhXSA9ICJcdTAwZDgiLAorICAgICAgICBbMHgzYl0gPSAiXHUwMGY4IiwKKyAgICAgICAgWzB4M2NdID0gIlx1MjUwYyIsCisgICAgICAgIFsweDNkXSA9ICJcdTI1MTAiLAorICAgICAgICBbMHgzZV0gPSAiXHUyNTE0IiwKKyAgICAgICAgWzB4M2ZdID0gIlx1MjUxOCIsCisgICAgfSwKK307CisKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBhYzJfYXR0cmlic1szMl1bM10gPSAvLyBDb2xvciwgZm9udCwgaWRlbnQKIHsKICAgICB7IENDQ09MX1dISVRFLCAgIENDRk9OVF9SRUdVTEFSLCAgICAgICAgICAgIDAgfSwgIC8vIDB4NDAgfHwgMHg2MApAQCAtMTAzLDYgKzIxMyw3IEBACiBzdHJ1Y3QgU2NyZWVuIHsKICAgICAvKiArMSBpcyB1c2VkIHRvIGNvbXBlbnNhdGUgbnVsbCBjaGFyYWN0ZXIgb2Ygc3RyaW5nICovCiAgICAgdWludDhfdCBjaGFyYWN0ZXJzW1NDUkVFTl9ST1dTXVtTQ1JFRU5fQ09MVU1OUysxXTsKKyAgICB1aW50OF90IGNoYXJzZXRzW1NDUkVFTl9ST1dTXVtTQ1JFRU5fQ09MVU1OUysxXTsKICAgICB1aW50OF90IGNvbG9yc1tTQ1JFRU5fUk9XU11bU0NSRUVOX0NPTFVNTlMrMV07CiAgICAgdWludDhfdCBmb250c1tTQ1JFRU5fUk9XU11bU0NSRUVOX0NPTFVNTlMrMV07CiAgICAgLyoKQEAgLTEyMyw2ICsyMzQsNyBAQAogICAgIHVpbnQ4X3QgY3Vyc29yX2NvbHVtbjsKICAgICB1aW50OF90IGN1cnNvcl9jb2xvcjsKICAgICB1aW50OF90IGN1cnNvcl9mb250OworICAgIHVpbnQ4X3QgY3Vyc29yX2NoYXJzZXQ7CiAgICAgQVZCUHJpbnQgYnVmZmVyOwogICAgIGludCBidWZmZXJfY2hhbmdlZDsKICAgICBpbnQgcm9sbHVwOwpAQCAtMTM1LDcgKzI0Nyw5IEBACiAgICAgaW50NjRfdCBsYXN0X3JlYWxfdGltZTsKICAgICBjaGFyIHByZXZfY21kWzJdOwogICAgIC8qIGJ1ZmZlciB0byBzdG9yZSBwa3QgZGF0YSAqLwotICAgIEFWQnVmZmVyUmVmICpwa3RidWY7CisgICAgdWludDhfdCAqcGt0YnVmOworICAgIGludCBwa3RidWZfc2l6ZTsKKyAgICBpbnQgcmVhZG9yZGVyOwogfSBDQ2FwdGlvblN1YkNvbnRleHQ7CiAKIApAQCAtMTQ4LDYgKzI2Miw3IEBACiAgICAgLyogdGFraW5nIGJ5IGRlZmF1bHQgcm9sbCB1cCB0byAyICovCiAgICAgY3R4LT5tb2RlID0gQ0NNT0RFX1JPTExVUDsKICAgICBjdHgtPnJvbGx1cCA9IDI7CisgICAgY3R4LT5jdXJzb3Jfcm93ID0gMTA7CiAgICAgcmV0ID0gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcihhdmN0eCwgIk1vbm9zcGFjZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NfREVGQVVMVF9GT05UX1NJWkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NfREVGQVVMVF9DT0xPUiwKQEAgLTE2MCwxMSArMjc1LDcgQEAKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSAgICAvKiBhbGxvY2F0ZSBwa3QgYnVmZmVyICovCi0gICAgY3R4LT5wa3RidWYgPSBhdl9idWZmZXJfYWxsb2MoMTI4KTsKLSAgICBpZiAoIWN0eC0+cGt0YnVmKSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICB9CisKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0xNzIsNyArMjgzLDggQEAKIHsKICAgICBDQ2FwdGlvblN1YkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZjdHgtPmJ1ZmZlciwgTlVMTCk7Ci0gICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPnBrdGJ1Zik7CisgICAgYXZfZnJlZXAoJmN0eC0+cGt0YnVmKTsKKyAgICBjdHgtPnBrdGJ1Zl9zaXplID0gMDsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTg1LDQwICsyOTcsNDYgQEAKICAgICBjdHgtPnByZXZfY21kWzFdID0gMDsKICAgICBjdHgtPm1vZGUgPSBDQ01PREVfUk9MTFVQOwogICAgIGN0eC0+cm9sbHVwID0gMjsKLSAgICBjdHgtPmN1cnNvcl9yb3cgPSAwOworICAgIGN0eC0+Y3Vyc29yX3JvdyA9IDEwOwogICAgIGN0eC0+Y3Vyc29yX2NvbHVtbiA9IDA7CiAgICAgY3R4LT5jdXJzb3JfZm9udCA9IDA7CiAgICAgY3R4LT5jdXJzb3JfY29sb3IgPSAwOworICAgIGN0eC0+Y3Vyc29yX2NoYXJzZXQgPSAwOwogICAgIGN0eC0+YWN0aXZlX3NjcmVlbiA9IDA7CiAgICAgY3R4LT5sYXN0X3JlYWxfdGltZSA9IDA7CiAgICAgY3R4LT5zY3JlZW5fdG91Y2hlZCA9IDA7CiAgICAgY3R4LT5idWZmZXJfY2hhbmdlZCA9IDA7CisgICAgaWYgKCEoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX1JPX0ZMVVNIX05PT1ApKQorICAgICAgICBjdHgtPnJlYWRvcmRlciA9IDA7CiAgICAgYXZfYnByaW50X2NsZWFyKCZjdHgtPmJ1ZmZlcik7CiB9CiAKIC8qKgogICogQHBhcmFtIGN0eCBjbG9zZWQgY2FwdGlvbiBjb250ZXh0IGp1c3QgdG8gcHJpbnQgbG9nCiAgKi8KLXN0YXRpYyBpbnQgd3JpdGVfY2hhcihDQ2FwdGlvblN1YkNvbnRleHQgKmN0eCwgc3RydWN0IFNjcmVlbiAqc2NyZWVuLCBjaGFyIGNoKQorc3RhdGljIHZvaWQgd3JpdGVfY2hhcihDQ2FwdGlvblN1YkNvbnRleHQgKmN0eCwgc3RydWN0IFNjcmVlbiAqc2NyZWVuLCBjaGFyIGNoKQogewogICAgIHVpbnQ4X3QgY29sID0gY3R4LT5jdXJzb3JfY29sdW1uOwogICAgIGNoYXIgKnJvdyA9IHNjcmVlbi0+Y2hhcmFjdGVyc1tjdHgtPmN1cnNvcl9yb3ddOwogICAgIGNoYXIgKmZvbnQgPSBzY3JlZW4tPmZvbnRzW2N0eC0+Y3Vyc29yX3Jvd107CisgICAgY2hhciAqY2hhcnNldCA9IHNjcmVlbi0+Y2hhcnNldHNbY3R4LT5jdXJzb3Jfcm93XTsKIAogICAgIGlmIChjb2wgPCBTQ1JFRU5fQ09MVU1OUykgewogICAgICAgICByb3dbY29sXSA9IGNoOwogICAgICAgICBmb250W2NvbF0gPSBjdHgtPmN1cnNvcl9mb250OworICAgICAgICBjaGFyc2V0W2NvbF0gPSBjdHgtPmN1cnNvcl9jaGFyc2V0OworICAgICAgICBjdHgtPmN1cnNvcl9jaGFyc2V0ID0gQ0NTRVRfQkFTSUNfQU1FUklDQU47CiAgICAgICAgIGlmIChjaCkgY3R4LT5jdXJzb3JfY29sdW1uKys7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm47CiAgICAgfQogICAgIC8qIFdlIGhhdmUgZXh0cmEgc3BhY2UgYXQgZW5kIG9ubHkgZm9yIG51bGwgY2hhcmFjdGVyICovCiAgICAgZWxzZSBpZiAoY29sID09IFNDUkVFTl9DT0xVTU5TICYmIGNoID09IDApIHsKICAgICAgICAgcm93W2NvbF0gPSBjaDsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGF0YSBJZ25vcmVkIHNpbmNlIGV4Y2VlZGluZyBzY3JlZW4gd2lkdGhcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIH0KIApAQCAtMzA2LDYgKzQyNCw3IEBACiAgICAgICAgIG1lbWNweShzY3JlZW4tPmNoYXJhY3RlcnNbaV9yb3ddLCBzY3JlZW4tPmNoYXJhY3RlcnNbaV9yb3crMV0sIFNDUkVFTl9DT0xVTU5TKTsKICAgICAgICAgbWVtY3B5KHNjcmVlbi0+Y29sb3JzW2lfcm93XSwgc2NyZWVuLT5jb2xvcnNbaV9yb3crMV0sIFNDUkVFTl9DT0xVTU5TKTsKICAgICAgICAgbWVtY3B5KHNjcmVlbi0+Zm9udHNbaV9yb3ddLCBzY3JlZW4tPmZvbnRzW2lfcm93KzFdLCBTQ1JFRU5fQ09MVU1OUyk7CisgICAgICAgIG1lbWNweShzY3JlZW4tPmNoYXJzZXRzW2lfcm93XSwgc2NyZWVuLT5jaGFyc2V0c1tpX3JvdysxXSwgU0NSRUVOX0NPTFVNTlMpOwogICAgICAgICBpZiAoQ0hFQ0tfRkxBRyhzY3JlZW4tPnJvd191c2VkLCBpX3JvdyArIDEpKQogICAgICAgICAgICAgU0VUX0ZMQUcoc2NyZWVuLT5yb3dfdXNlZCwgaV9yb3cpOwogICAgIH0KQEAgLTMxNSw3ICs0MzQsNyBAQAogCiBzdGF0aWMgaW50IGNhcHR1cmVfc2NyZWVuKENDYXB0aW9uU3ViQ29udGV4dCAqY3R4KQogewotICAgIGludCBpOworICAgIGludCBpLCBqLCB0YWIgPSAwOwogICAgIHN0cnVjdCBTY3JlZW4gKnNjcmVlbiA9IGN0eC0+c2NyZWVuICsgY3R4LT5hY3RpdmVfc2NyZWVuOwogICAgIGVudW0gY2NfZm9udCBwcmV2X2ZvbnQgPSBDQ0ZPTlRfUkVHVUxBUjsKICAgICBhdl9icHJpbnRfY2xlYXIoJmN0eC0+YnVmZmVyKTsKQEAgLTMyNCwxMyArNDQzLDMzIEBACiAgICAgewogICAgICAgICBpZiAoQ0hFQ0tfRkxBRyhzY3JlZW4tPnJvd191c2VkLCBpKSkgewogICAgICAgICAgICAgY29uc3QgY2hhciAqcm93ID0gc2NyZWVuLT5jaGFyYWN0ZXJzW2ldOworICAgICAgICAgICAgY29uc3QgY2hhciAqY2hhcnNldCA9IHNjcmVlbi0+Y2hhcnNldHNbaV07CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChyb3dbal0gPT0gJyAnICYmIGNoYXJzZXRbal0gPT0gQ0NTRVRfQkFTSUNfQU1FUklDQU4pCisgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgaWYgKCF0YWIgfHwgaiA8IHRhYikKKyAgICAgICAgICAgICAgICB0YWIgPSBqOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgc2NyZWVuLT5yb3dfdXNlZCAmJiBpIDwgU0NSRUVOX1JPV1M7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChDSEVDS19GTEFHKHNjcmVlbi0+cm93X3VzZWQsIGkpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpyb3cgPSBzY3JlZW4tPmNoYXJhY3RlcnNbaV07CiAgICAgICAgICAgICBjb25zdCBjaGFyICpmb250ID0gc2NyZWVuLT5mb250c1tpXTsKLSAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNoYXJzZXQgPSBzY3JlZW4tPmNoYXJzZXRzW2ldOworICAgICAgICAgICAgY29uc3QgY2hhciAqb3ZlcnJpZGU7CisgICAgICAgICAgICBpbnQgeCwgeSwgc2Vlbl9jaGFyID0gMDsKKyAgICAgICAgICAgIGogPSAwOwogCiAgICAgICAgICAgICAvKiBza2lwIGxlYWRpbmcgc3BhY2UgKi8KLSAgICAgICAgICAgIHdoaWxlIChyb3dbal0gPT0gJyAnKQorICAgICAgICAgICAgd2hpbGUgKHJvd1tqXSA9PSAnICcgJiYgY2hhcnNldFtqXSA9PSBDQ1NFVF9CQVNJQ19BTUVSSUNBTiAmJiBqIDwgdGFiKQogICAgICAgICAgICAgICAgIGorKzsKIAorICAgICAgICAgICAgeCA9IEFTU19ERUZBVUxUX1BMQVlSRVNYICogKDAuMSArIDAuMDI1MCAqIGopOworICAgICAgICAgICAgeSA9IEFTU19ERUZBVUxUX1BMQVlSRVNZICogKDAuMSArIDAuMDUzMyAqIGkpOworICAgICAgICAgICAgYXZfYnByaW50ZigmY3R4LT5idWZmZXIsICJ7XFxhbjd9e1xccG9zKCVkLCVkKX0iLCB4LCB5KTsKKwogICAgICAgICAgICAgZm9yICg7IGogPCBTQ1JFRU5fQ09MVU1OUzsgaisrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZV90YWcgPSAiIiwgKnNfdGFnID0gIiI7CiAKQEAgLTM2Miw3ICs1MDEsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwcmV2X2ZvbnQgPSBmb250W2pdOwotICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmN0eC0+YnVmZmVyLCAiJXMlcyVjIiwgZV90YWcsIHNfdGFnLCByb3dbal0pOworICAgICAgICAgICAgICAgIG92ZXJyaWRlID0gY2hhcnNldF9vdmVycmlkZXNbKGludCljaGFyc2V0W2pdXVsoaW50KXJvd1tqXV07CisgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmN0eC0+YnVmZmVyLCAiJXMlcyVzIiwgZV90YWcsIHNfdGFnLCBvdmVycmlkZSk7CisgICAgICAgICAgICAgICAgICAgIHNlZW5fY2hhciA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3dbal0gPT0gJyAnICYmICFzZWVuX2NoYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmY3R4LT5idWZmZXIsICIlcyVzXFxoIiwgZV90YWcsIHNfdGFnKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKCZjdHgtPmJ1ZmZlciwgIiVzJXMlYyIsIGVfdGFnLCBzX3RhZywgcm93W2pdKTsKKyAgICAgICAgICAgICAgICAgICAgc2Vlbl9jaGFyID0gMTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2X2JwcmludGYoJmN0eC0+YnVmZmVyLCAiXFxOIik7CiAgICAgICAgIH0KQEAgLTQxOSw2ICs1NjgsNyBAQAogICAgIGN0eC0+Y3Vyc29yX3JvdyA9IHJvd19tYXBbaW5kZXhdIC0gMTsKICAgICBjdHgtPmN1cnNvcl9jb2xvciA9ICBwYWMyX2F0dHJpYnNbbG9dWzBdOwogICAgIGN0eC0+Y3Vyc29yX2ZvbnQgPSBwYWMyX2F0dHJpYnNbbG9dWzFdOworICAgIGN0eC0+Y3Vyc29yX2NoYXJzZXQgPSBDQ1NFVF9CQVNJQ19BTUVSSUNBTjsKICAgICBjdHgtPmN1cnNvcl9jb2x1bW4gPSAwOwogICAgIGluZGVudCA9IHBhYzJfYXR0cmlic1tsb11bMl07CiAgICAgZm9yIChpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7CkBAIC00NzQsNyArNjI0LDI1IEBACiAKICAgICBTRVRfRkxBRyhzY3JlZW4tPnJvd191c2VkLCBjdHgtPmN1cnNvcl9yb3cpOwogCi0gICAgd3JpdGVfY2hhcihjdHgsIHNjcmVlbiwgaGkpOworICAgIHN3aXRjaCAoaGkpIHsKKyAgICAgIGNhc2UgMHgxMToKKyAgICAgICAgY3R4LT5jdXJzb3JfY2hhcnNldCA9IENDU0VUX1NQRUNJQUxfQU1FUklDQU47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDEyOgorICAgICAgICBpZiAoY3R4LT5jdXJzb3JfY29sdW1uID4gMCkKKyAgICAgICAgICAgIGN0eC0+Y3Vyc29yX2NvbHVtbiAtPSAxOworICAgICAgICBjdHgtPmN1cnNvcl9jaGFyc2V0ID0gQ0NTRVRfRVhURU5ERURfU1BBTklTSF9GUkVOQ0hfTUlTQzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MTM6CisgICAgICAgIGlmIChjdHgtPmN1cnNvcl9jb2x1bW4gPiAwKQorICAgICAgICAgICAgY3R4LT5jdXJzb3JfY29sdW1uIC09IDE7CisgICAgICAgIGN0eC0+Y3Vyc29yX2NoYXJzZXQgPSBDQ1NFVF9FWFRFTkRFRF9QT1JUVUdVRVNFX0dFUk1BTl9EQU5JU0g7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY3R4LT5jdXJzb3JfY2hhcnNldCA9IENDU0VUX0JBU0lDX0FNRVJJQ0FOOworICAgICAgICB3cml0ZV9jaGFyKGN0eCwgc2NyZWVuLCBoaSk7CisgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGlmIChsbykgewogICAgICAgICB3cml0ZV9jaGFyKGN0eCwgc2NyZWVuLCBsbyk7CkBAIC00ODQsOSArNjUyLDYgQEAKICAgICBpZiAoY3R4LT5tb2RlICE9IENDTU9ERV9QT1BPTikKICAgICAgICAgY3R4LT5zY3JlZW5fdG91Y2hlZCA9IDE7CiAKLSAgICAvKiByZXNldCBwcmV2IGNvbW1hbmQgc2luY2UgY2hhcmFjdGVyIGNhbiByZXBlYXQgKi8KLSAgICBjdHgtPnByZXZfY21kWzBdID0gMDsKLSAgICBjdHgtPnByZXZfY21kWzFdID0gMDsKICAgICBpZiAobG8pCiAgICAgICAgZmZfZGxvZyhjdHgsICIoJWMsJWMpXG4iLCBoaSwgbG8pOwogICAgIGVsc2UKQEAgLTQ5Nyw4ICs2NjIsMTUgQEAKIHsKICAgICBpZiAoaGkgPT0gY3R4LT5wcmV2X2NtZFswXSAmJiBsbyA9PSBjdHgtPnByZXZfY21kWzFdKSB7CiAgICAgICAgIC8qIGlnbm9yZSByZWR1bmRhbnQgY29tbWFuZCAqLwotICAgIH0gZWxzZSBpZiAoIChoaSA9PSAweDEwICYmIChsbyA+PSAweDQwICYmIGxvIDw9IDB4NWYpKSB8fAotICAgICAgICAgICAgICAoIChoaSA+PSAweDExICYmIGhpIDw9IDB4MTcpICYmIChsbyA+PSAweDQwICYmIGxvIDw9IDB4N2YpICkgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBzZXQgcHJldiBjb21tYW5kICovCisgICAgY3R4LT5wcmV2X2NtZFswXSA9IGhpOworICAgIGN0eC0+cHJldl9jbWRbMV0gPSBsbzsKKworICAgIGlmICggKGhpID09IDB4MTAgJiYgKGxvID49IDB4NDAgJiYgbG8gPD0gMHg1ZikpIHx8CisgICAgICAgKCAoaGkgPj0gMHgxMSAmJiBoaSA8PSAweDE3KSAmJiAobG8gPj0gMHg0MCAmJiBsbyA8PSAweDdmKSApICkgewogICAgICAgICBoYW5kbGVfcGFjKGN0eCwgaGksIGxvKTsKICAgICB9IGVsc2UgaWYgKCAoIGhpID09IDB4MTEgJiYgbG8gPj0gMHgyMCAmJiBsbyA8PSAweDJmICkgfHwKICAgICAgICAgICAgICAgICAoIGhpID09IDB4MTcgJiYgbG8gPj0gMHgyZSAmJiBsbyA8PSAweDJmKSApIHsKQEAgLTU1NiwzOCArNzI4LDQyIEBACiAgICAgICAgICAgICBmZl9kbG9nKGN0eCwgIlVua25vd24gY29tbWFuZCAweCVoaHggMHglaGh4XG4iLCBoaSwgbG8pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGhpID49IDB4MTEgJiYgaGkgPD0gMHgxMykgeworICAgICAgICAvKiBTcGVjaWFsIGNoYXJhY3RlcnMgKi8KKyAgICAgICAgaGFuZGxlX2NoYXIoY3R4LCBoaSwgbG8sIHB0cyk7CiAgICAgfSBlbHNlIGlmIChoaSA+PSAweDIwKSB7CiAgICAgICAgIC8qIFN0YW5kYXJkIGNoYXJhY3RlcnMgKGFsd2F5cyBpbiBwYWlycykgKi8KICAgICAgICAgaGFuZGxlX2NoYXIoY3R4LCBoaSwgbG8sIHB0cyk7CisgICAgICAgIGN0eC0+cHJldl9jbWRbMF0gPSBjdHgtPnByZXZfY21kWzFdID0gMDsKKyAgICB9IGVsc2UgaWYgKGhpID09IDB4MTcgJiYgbG8gPj0gMHgyMSAmJiBsbyA8PSAweDIzKSB7CisgICAgICAgIGludCBpOworICAgICAgICAvKiBUYWIgb2Zmc2V0cyAoc3BhY2luZykgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxvIC0gMHgyMDsgaSsrKSB7CisgICAgICAgICAgICBoYW5kbGVfY2hhcihjdHgsICcgJywgMCwgcHRzKTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIElnbm9yaW5nIGFsbCBvdGhlciBub24gZGF0YSBjb2RlICovCiAgICAgICAgIGZmX2Rsb2coY3R4LCAiVW5rbm93biBjb21tYW5kIDB4JWhoeCAweCVoaHhcbiIsIGhpLCBsbyk7CiAgICAgfQotCi0gICAgLyogc2V0IHByZXYgY29tbWFuZCAqLwotICAgIGN0eC0+cHJldl9jbWRbMF0gPSBoaTsKLSAgICBjdHgtPnByZXZfY21kWzFdID0gbG87CiB9CiAKIHN0YXRpYyBpbnQgZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3Rfc3ViLCBBVlBhY2tldCAqYXZwa3QpCiB7CiAgICAgQ0NhcHRpb25TdWJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFWU3VidGl0bGUgKnN1YiA9IGRhdGE7CisgICAgY29uc3QgaW50NjRfdCBzdGFydF90aW1lID0gc3ViLT5wdHM7CiAgICAgdWludDhfdCAqYnB0ciA9IE5VTEw7CiAgICAgaW50IGxlbiA9IGF2cGt0LT5zaXplOwogICAgIGludCByZXQgPSAwOwogICAgIGludCBpOwogCi0gICAgaWYgKGN0eC0+cGt0YnVmLT5zaXplIDwgbGVuKSB7Ci0gICAgICAgIHJldCA9IGF2X2J1ZmZlcl9yZWFsbG9jKCZjdHgtPnBrdGJ1ZiwgbGVuKTsKLSAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkluc3VmZmljaWVudCBNZW1vcnkgb2YgJWQgdHJ1bmNhdGVkIHRvICVkXG4iLCBsZW4sIGN0eC0+cGt0YnVmLT5zaXplKTsKLSAgICAgICAgICAgIGxlbiA9IGN0eC0+cGt0YnVmLT5zaXplOwotICAgICAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgfQorICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmY3R4LT5wa3RidWYsICZjdHgtPnBrdGJ1Zl9zaXplLCBsZW4pOworICAgIGlmICghY3R4LT5wa3RidWYpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnN1ZmZpY2llbnQgTWVtb3J5IG9mICVkIHRydW5jYXRlZCB0byAlZFxuIiwgbGVuLCBjdHgtPnBrdGJ1Zl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9Ci0gICAgbWVtY3B5KGN0eC0+cGt0YnVmLT5kYXRhLCBhdnBrdC0+ZGF0YSwgbGVuKTsKLSAgICBicHRyID0gY3R4LT5wa3RidWYtPmRhdGE7CisgICAgbWVtY3B5KGN0eC0+cGt0YnVmLCBhdnBrdC0+ZGF0YSwgbGVuKTsKKyAgICBicHRyID0gY3R4LT5wa3RidWY7CiAKICAgICBmb3IgKGkgID0gMDsgaSA8IGxlbjsgaSArPSAzKSB7CiAgICAgICAgIHVpbnQ4X3QgY2NfdHlwZSA9ICooYnB0ciArIGkpICYgMzsKQEAgLTU5Nyw3ICs3NzMsNyBAQAogICAgICAgICBpZihjY190eXBlID09IDEpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJvY2Vzc19jYzYwOChjdHgsIGF2cGt0LT5wdHMsICooYnB0ciArIGkgKyAxKSAmIDB4N2YsICooYnB0ciArIGkgKyAyKSAmIDB4N2YpOworICAgICAgICAgICAgcHJvY2Vzc19jYzYwOChjdHgsIHN0YXJ0X3RpbWUsICooYnB0ciArIGkgKyAxKSAmIDB4N2YsICooYnB0ciArIGkgKyAyKSAmIDB4N2YpOwogCiAgICAgICAgIGlmICghY3R4LT5idWZmZXJfY2hhbmdlZCkKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtNjA1LDM4ICs3ODEsMzQgQEAKIAogICAgICAgICBpZiAoKmN0eC0+YnVmZmVyLnN0ciB8fCBjdHgtPnJlYWxfdGltZSkKICAgICAgICAgewotICAgICAgICAgICAgaW50NjRfdCBzdWJfcHRzID0gY3R4LT5yZWFsX3RpbWUgPyBhdnBrdC0+cHRzIDogY3R4LT5zdGFydF90aW1lOwotICAgICAgICAgICAgaW50IHN0YXJ0X3RpbWUgPSBhdl9yZXNjYWxlX3Eoc3ViX3B0cywgYXZjdHgtPnRpbWVfYmFzZSwgYXNzX3RiKTsKLSAgICAgICAgICAgIGludCBkdXJhdGlvbiA9IC0xOwotICAgICAgICAgICAgaWYgKCFjdHgtPnJlYWxfdGltZSkgewotICAgICAgICAgICAgICAgIGludCBlbmRfdGltZSA9IGF2X3Jlc2NhbGVfcShjdHgtPmVuZF90aW1lLCBhdmN0eC0+dGltZV9iYXNlLCBhc3NfdGIpOwotICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gZW5kX3RpbWUgLSBzdGFydF90aW1lOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgZmZfZGxvZyhjdHgsICJjZHAgd3JpdGluZyBkYXRhICglcylcbiIsY3R4LT5idWZmZXIuc3RyKTsKLSAgICAgICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmY3R4LT5idWZmZXIsIHN0YXJ0X3RpbWUsIGR1cmF0aW9uKTsKKyAgICAgICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdChzdWIsIGN0eC0+YnVmZmVyLnN0ciwgY3R4LT5yZWFkb3JkZXIrKywgMCwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgc3ViLT5wdHMgPSBhdl9yZXNjYWxlX3Eoc3ViX3B0cywgYXZjdHgtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOworICAgICAgICAgICAgc3ViLT5wdHMgPSBjdHgtPnN0YXJ0X3RpbWU7CisgICAgICAgICAgICBpZiAoIWN0eC0+cmVhbF90aW1lKQorICAgICAgICAgICAgICAgIHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSA9IGF2X3Jlc2NhbGVfcShjdHgtPmVuZF90aW1lIC0gY3R4LT5zdGFydF90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSwgbXNfdGIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSA9IC0xOwogICAgICAgICAgICAgY3R4LT5idWZmZXJfY2hhbmdlZCA9IDA7Ci0gICAgICAgICAgICBjdHgtPmxhc3RfcmVhbF90aW1lID0gYXZwa3QtPnB0czsKKyAgICAgICAgICAgIGN0eC0+bGFzdF9yZWFsX3RpbWUgPSBzdWItPnB0czsKICAgICAgICAgICAgIGN0eC0+c2NyZWVuX3RvdWNoZWQgPSAwOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGN0eC0+cmVhbF90aW1lICYmIGN0eC0+c2NyZWVuX3RvdWNoZWQgJiYKLSAgICAgICAgYXZwa3QtPnB0cyA+IGN0eC0+bGFzdF9yZWFsX3RpbWUgKyBhdl9yZXNjYWxlX3EoMjAsIGFzc190YiwgYXZjdHgtPnRpbWVfYmFzZSkpIHsKLSAgICAgICAgaW50IHN0YXJ0X3RpbWU7Ci0gICAgICAgIGN0eC0+bGFzdF9yZWFsX3RpbWUgPSBhdnBrdC0+cHRzOworICAgICAgICBzdWItPnB0cyA+IGN0eC0+bGFzdF9yZWFsX3RpbWUgKyBhdl9yZXNjYWxlX3EoMjAwLCBtc190YiwgQVZfVElNRV9CQVNFX1EpKSB7CisgICAgICAgIGN0eC0+bGFzdF9yZWFsX3RpbWUgPSBzdWItPnB0czsKICAgICAgICAgY3R4LT5zY3JlZW5fdG91Y2hlZCA9IDA7CiAKICAgICAgICAgY2FwdHVyZV9zY3JlZW4oY3R4KTsKICAgICAgICAgY3R4LT5idWZmZXJfY2hhbmdlZCA9IDA7CiAKLSAgICAgICAgc3RhcnRfdGltZSA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzLCBhdmN0eC0+dGltZV9iYXNlLCBhc3NfdGIpOwotICAgICAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3RfYnByaW50KHN1YiwgJmN0eC0+YnVmZmVyLCBzdGFydF90aW1lLCAtMSk7CisgICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdChzdWIsIGN0eC0+YnVmZmVyLnN0ciwgY3R4LT5yZWFkb3JkZXIrKywgMCwgTlVMTCwgTlVMTCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgc3ViLT5wdHMgPSBhdl9yZXNjYWxlX3EoYXZwa3QtPnB0cywgYXZjdHgtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOworICAgICAgICBzdWItPmVuZF9kaXNwbGF5X3RpbWUgPSAtMTsKICAgICB9CiAKICAgICAqZ290X3N1YiA9IHN1Yi0+bnVtX3JlY3RzID4gMDsKQEAgLTY1OSw3ICs4MzEsNyBAQAogCiBBVkNvZGVjIGZmX2NjYXB0aW9uX2RlY29kZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImNjX2RlYyIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNsb3NlZCBDYXB0aW9uIChFSUEtNjA4IC8gQ0VBLTcwOCkgRGVjb2RlciIpLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDbG9zZWQgQ2FwdGlvbiAoRUlBLTYwOCAvIENFQS03MDgpIiksCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0VJQV82MDgsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENDYXB0aW9uU3ViQ29udGV4dCksCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2NkZ3JhcGhpY3MuYyBiL2xpYmF2Y29kZWMvY2RncmFwaGljcy5jCmluZGV4IDg3YWQ1ZTcuLmRhNmZiN2EgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY2RncmFwaGljcy5jCisrKyBiL2xpYmF2Y29kZWMvY2RncmFwaGljcy5jCkBAIC04MCwxMSArODAsOCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIGNjLT50cmFuc3BhcmVuY3kgPSAtMTsKIAotICAgIGF2Y3R4LT53aWR0aCAgID0gQ0RHX0ZVTExfV0lEVEg7Ci0gICAgYXZjdHgtPmhlaWdodCAgPSBDREdfRlVMTF9IRUlHSFQ7CiAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIENER19GVUxMX1dJRFRILCBDREdfRlVMTF9IRUlHSFQpOwogfQogCiBzdGF0aWMgdm9pZCBjZGdfYm9yZGVyX3ByZXNldChDREdyYXBoaWNzQ29udGV4dCAqY2MsIHVpbnQ4X3QgKmRhdGEpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2NkeGwuYyBiL2xpYmF2Y29kZWMvY2R4bC5jCmluZGV4IDUwZDUxNGIuLjc4ZjVkNTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY2R4bC5jCisrKyBiL2xpYmF2Y29kZWMvY2R4bC5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC0xMDcsNiArMTA4LDE3IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBjaHVua3kyY2h1bmt5KENEWExWaWRlb0NvbnRleHQgKmMsIGludCBsaW5lc2l6ZSwgdWludDhfdCAqb3V0KQoreworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIGludCB5OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGMtPnZpZGVvLCBjLT52aWRlb19zaXplKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgYy0+YXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmdiLCBvdXQgKyBsaW5lc2l6ZSAqIHksIGMtPmF2Y3R4LT53aWR0aCAqIDMpOworICAgIH0KK30KKwogc3RhdGljIHZvaWQgaW1wb3J0X2Zvcm1hdChDRFhMVmlkZW9Db250ZXh0ICpjLCBpbnQgbGluZXNpemUsIHVpbnQ4X3QgKm91dCkKIHsKICAgICBtZW1zZXQob3V0LCAwLCBsaW5lc2l6ZSAqIGMtPmF2Y3R4LT5oZWlnaHQpOwpAQCAtMTE4LDYgKzEzMCw5IEBACiAgICAgY2FzZSBCSVRfTElORToKICAgICAgICAgYml0bGluZTJjaHVua3koYywgbGluZXNpemUsIG91dCk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ0hVTktZOgorICAgICAgICBjaHVua3kyY2h1bmt5KGMsIGxpbmVzaXplLCBvdXQpOworICAgICAgICBicmVhazsKICAgICB9CiB9CiAKQEAgLTEzMCw2ICsxNDUsMTEgQEAKICAgICBpbXBvcnRfZm9ybWF0KGMsIGZyYW1lLT5saW5lc2l6ZVswXSwgZnJhbWUtPmRhdGFbMF0pOwogfQogCitzdGF0aWMgdm9pZCBjZHhsX2RlY29kZV9yYXcoQ0RYTFZpZGVvQ29udGV4dCAqYywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW1wb3J0X2Zvcm1hdChjLCBmcmFtZS0+bGluZXNpemVbMF0sIGZyYW1lLT5kYXRhWzBdKTsKK30KKwogc3RhdGljIHZvaWQgY2R4bF9kZWNvZGVfaGFtNihDRFhMVmlkZW9Db250ZXh0ICpjLCBBVkZyYW1lICpmcmFtZSkKIHsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBjLT5hdmN0eDsKQEAgLTI0Miw3ICsyNjIsNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICBpZiAoYy0+YnBwIDwgMSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgaWYgKGMtPmZvcm1hdCAhPSBCSVRfUExBTkFSICYmIGMtPmZvcm1hdCAhPSBCSVRfTElORSkgeworICAgIGlmIChjLT5mb3JtYXQgIT0gQklUX1BMQU5BUiAmJiBjLT5mb3JtYXQgIT0gQklUX0xJTkUgJiYgYy0+Zm9ybWF0ICE9IENIVU5LWSkgewogICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJQaXhlbCBmb3JtYXQgMHglMHgiLCBjLT5mb3JtYXQpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQpAQCAtMjUwLDE5ICsyNzAsMjUgQEAKICAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCB3LCBoKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgYWxpZ25lZF93aWR0aCA9IEZGQUxJR04oYy0+YXZjdHgtPndpZHRoLCAxNik7CisgICAgaWYgKGMtPmZvcm1hdCA9PSBDSFVOS1kpCisgICAgICAgIGFsaWduZWRfd2lkdGggPSBhdmN0eC0+d2lkdGg7CisgICAgZWxzZQorICAgICAgICBhbGlnbmVkX3dpZHRoID0gRkZBTElHTihjLT5hdmN0eC0+d2lkdGgsIDE2KTsKICAgICBjLT5wYWRkZWRfYml0cyAgPSBhbGlnbmVkX3dpZHRoIC0gYy0+YXZjdHgtPndpZHRoOwotICAgIGlmIChjLT52aWRlb19zaXplIDwgYWxpZ25lZF93aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiBjLT5icHAgLyA4KQorICAgIGlmIChjLT52aWRlb19zaXplIDwgYWxpZ25lZF93aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiAoaW50NjRfdCljLT5icHAgLyA4KQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBpZiAoIWVuY29kaW5nICYmIGMtPnBhbGV0dGVfc2l6ZSAmJiBjLT5icHAgPD0gOCkgeworICAgIGlmICghZW5jb2RpbmcgJiYgYy0+cGFsZXR0ZV9zaXplICYmIGMtPmJwcCA8PSA4ICYmIGMtPmZvcm1hdCAhPSBDSFVOS1kpIHsKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7Ci0gICAgfSBlbHNlIGlmIChlbmNvZGluZyA9PSAxICYmIChjLT5icHAgPT0gNiB8fCBjLT5icHAgPT0gOCkpIHsKKyAgICB9IGVsc2UgaWYgKGVuY29kaW5nID09IDEgJiYgKGMtPmJwcCA9PSA2IHx8IGMtPmJwcCA9PSA4KSAmJiBjLT5mb3JtYXQgIT0gQ0hVTktZKSB7CiAgICAgICAgIGlmIChjLT5wYWxldHRlX3NpemUgIT0gKDEgPDwgKGMtPmJwcCAtIDEpKSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7CisgICAgfSBlbHNlIGlmICghZW5jb2RpbmcgJiYgYy0+YnBwID09IDI0ICYmIGMtPmZvcm1hdCA9PSBDSFVOS1kgJiYKKyAgICAgICAgICAgICAgICFjLT5wYWxldHRlX3NpemUpIHsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjI0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkVuY29kaW5nICVkIGFuZCBicHAgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RpbmcsIGMtPmJwcCk7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkVuY29kaW5nICVkLCBicHAgJWQgYW5kIGZvcm1hdCAweCV4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLCBjLT5icHAsIGMtPmZvcm1hdCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKQEAgLTI3OSw4ICszMDUsMTAgQEAKICAgICAgICAgICAgIGNkeGxfZGVjb2RlX2hhbTgoYywgcCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGNkeGxfZGVjb2RlX2hhbTYoYywgcCk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkgewogICAgICAgICBjZHhsX2RlY29kZV9yZ2IoYywgcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2R4bF9kZWNvZGVfcmF3KGMsIHApOwogICAgIH0KICAgICAqZ290X2ZyYW1lID0gMTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jZWxwX2ZpbHRlcnMuYyBiL2xpYmF2Y29kZWMvY2VscF9maWx0ZXJzLmMKaW5kZXggYTgxZmQ4OC4uZmFmZWRkOSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jZWxwX2ZpbHRlcnMuYworKysgYi9saWJhdmNvZGVjL2NlbHBfZmlsdGVycy5jCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgZm9yIChuID0gMDsgbiA8IGJ1ZmZlcl9sZW5ndGg7IG4rKykgewogICAgICAgICBpbnQgc3VtID0gLXJvdW5kZXIsIHN1bTE7CiAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gZmlsdGVyX2xlbmd0aDsgaSsrKQotICAgICAgICAgICAgc3VtICs9IGZpbHRlcl9jb2VmZnNbaS0xXSAqIG91dFtuLWldOworICAgICAgICAgICAgc3VtICs9ICh1bnNpZ25lZCkoZmlsdGVyX2NvZWZmc1tpLTFdICogb3V0W24taV0pOwogCiAgICAgICAgIHN1bTEgPSAoKC1zdW0gPj4gMTIpICsgaW5bbl0pID4+IHNoaWZ0OwogICAgICAgICBzdW0gID0gYXZfY2xpcF9pbnQxNihzdW0xKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2ZoZC5jIGIvbGliYXZjb2RlYy9jZmhkLmMKaW5kZXggZDZkODMxYi4uZjEwNzQyZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jZmhkLmMKKysrIGIvbGliYXZjb2RlYy9jZmhkLmMKQEAgLTIwLDMxICsyMCw0NyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBDRkhEIFZpZGVvIERlY29kZXIKKyAqIENpbmVmb3JtIEhEIHZpZGVvIGRlY29kZXIKICAqLwogCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJjZmhkLmgiCiAKLSNkZWZpbmUgU1VCQkFORF9DT1VOVCAxMAorI2RlZmluZSBBTFBIQV9DT01QQU5EX0RDX09GRlNFVCAyNTYKKyNkZWZpbmUgQUxQSEFfQ09NUEFORF9HQUlOIDk0MDAKIAotc3RhdGljIGF2X2NvbGQgaW50IGNmaGRfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQorZW51bSBDRkhEUGFyYW0geworICAgIENoYW5uZWxDb3VudCAgICAgPSAgMTIsCisgICAgU3ViYmFuZENvdW50ICAgICA9ICAxNCwKKyAgICBJbWFnZVdpZHRoICAgICAgID0gIDIwLAorICAgIEltYWdlSGVpZ2h0ICAgICAgPSAgMjEsCisgICAgTG93cGFzc1ByZWNpc2lvbiA9ICAzNSwKKyAgICBTdWJiYW5kTnVtYmVyICAgID0gIDQ4LAorICAgIFF1YW50aXphdGlvbiAgICAgPSAgNTMsCisgICAgQ2hhbm5lbE51bWJlciAgICA9ICA2MiwKKyAgICBCaXRzUGVyQ29tcG9uZW50ID0gMTAxLAorICAgIENoYW5uZWxXaWR0aCAgICAgPSAxMDQsCisgICAgQ2hhbm5lbEhlaWdodCAgICA9IDEwNSwKKyAgICBQcmVzY2FsZVNoaWZ0ICAgID0gMTA5LAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGNmaGRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgQ0ZIRENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogCiAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAxMDsKICAgICBzLT5hdmN0eCAgICAgICAgICAgICAgICAgICA9IGF2Y3R4OwotICAgIGF2Y3R4LT53aWR0aCAgICAgICAgICAgICAgID0gMDsKLSAgICBhdmN0eC0+aGVpZ2h0ICAgICAgICAgICAgICA9IDA7CiAKICAgICByZXR1cm4gZmZfY2ZoZF9pbml0X3ZsY3Mocyk7CiB9CkBAIC02MCw5ICs3NiwxMCBAQAogewogICAgIHMtPmNvZGVkX3dpZHRoICAgICAgID0gMDsKICAgICBzLT5jb2RlZF9oZWlnaHQgICAgICA9IDA7CisgICAgcy0+Y3JvcHBlZF9oZWlnaHQgICAgPSAwOwogICAgIHMtPmJwYyAgICAgICAgICAgICAgID0gMTA7CiAgICAgcy0+Y2hhbm5lbF9jbnQgICAgICAgPSA0OwotICAgIHMtPnN1YmJhbmRfY250ICAgICAgID0gMTA7CisgICAgcy0+c3ViYmFuZF9jbnQgICAgICAgPSBTVUJCQU5EX0NPVU5UOwogICAgIHMtPmNoYW5uZWxfbnVtICAgICAgID0gMDsKICAgICBzLT5sb3dwYXNzX3ByZWNpc2lvbiA9IDE2OwogICAgIHMtPnF1YW50aXNhdGlvbiAgICAgID0gMTsKQEAgLTc2LDE1ICs5MywzMiBAQAogc3RhdGljIGlubGluZSBpbnQgZGVxdWFudF9hbmRfZGVjb21wYW5kKGludCBsZXZlbCwgaW50IHF1YW50aXNhdGlvbikKIHsKICAgICBpbnQ2NF90IGFic2xldmVsID0gYWJzKGxldmVsKTsKLSAgICByZXR1cm4gKGFic2xldmVsICsgKCg3NjggKiBhYnNsZXZlbCAqIGFic2xldmVsICogYWJzbGV2ZWwpIC8gKDI1NSAqIDI1NSAqIDI1NSkpKSAqIEZGU0lHTihsZXZlbCkgKiBxdWFudGlzYXRpb247CisgICAgcmV0dXJuIChhYnNsZXZlbCArICgoNzY4ICogYWJzbGV2ZWwgKiBhYnNsZXZlbCAqIGFic2xldmVsKSAvICgyNTUgKiAyNTUgKiAyNTUpKSkgKgorICAgICAgICAgICBGRlNJR04obGV2ZWwpICogcXVhbnRpc2F0aW9uOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmlsdGVyKGludDE2X3QgKm91dHB1dCwgcHRyZGlmZl90IG91dF9zdHJpZGUsIGludDE2X3QgKmxvdywgcHRyZGlmZl90IGxvd19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmhpZ2gsIHB0cmRpZmZfdCBoaWdoX3N0cmlkZSwgaW50IGxlbiwgdWludDhfdCBjbGlwKQorc3RhdGljIGlubGluZSB2b2lkIHByb2Nlc3NfYWxwaGEoaW50MTZfdCAqYWxwaGEsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaSwgY2hhbm5lbDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBjaGFubmVsICAgPSBhbHBoYVtpXTsKKyAgICAgICAgY2hhbm5lbCAgLT0gQUxQSEFfQ09NUEFORF9EQ19PRkZTRVQ7CisgICAgICAgIGNoYW5uZWwgPDw9IDM7CisgICAgICAgIGNoYW5uZWwgICo9IEFMUEhBX0NPTVBBTkRfR0FJTjsKKyAgICAgICAgY2hhbm5lbCA+Pj0gMTY7CisgICAgICAgIGNoYW5uZWwgICA9IGF2X2NsaXBfdWludHAyKGNoYW5uZWwsIDEyKTsKKyAgICAgICAgYWxwaGFbaV0gID0gY2hhbm5lbDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaWx0ZXIoaW50MTZfdCAqb3V0cHV0LCBwdHJkaWZmX3Qgb3V0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqbG93LCBwdHJkaWZmX3QgbG93X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqaGlnaCwgcHRyZGlmZl90IGhpZ2hfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgY2xpcCkKIHsKICAgICBpbnQxNl90IHRtcDsKLQogICAgIGludCBpOworCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgIHRtcCA9ICgxMSpsb3dbMCpsb3dfc3RyaWRlXSAtIDQqbG93WzEqbG93X3N0cmlkZV0gKyBsb3dbMipsb3dfc3RyaWRlXSArIDQpID4+IDM7CkBAIC0xMjAsMzAgKzE1NCwzOCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaG9yaXpfZmlsdGVyKGludDE2X3QgKm91dHB1dCwgaW50MTZfdCAqbG93LCBpbnQxNl90ICpoaWdoLCBpbnQgd2lkdGgpCitzdGF0aWMgdm9pZCBob3Jpel9maWx0ZXIoaW50MTZfdCAqb3V0cHV0LCBpbnQxNl90ICpsb3csIGludDE2X3QgKmhpZ2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQogewogICAgIGZpbHRlcihvdXRwdXQsIDEsIGxvdywgMSwgaGlnaCwgMSwgd2lkdGgsIDApOwogfQogCi1zdGF0aWMgdm9pZCBob3Jpel9maWx0ZXJfY2xpcChpbnQxNl90ICpvdXRwdXQsIGludDE2X3QgKmxvdywgaW50MTZfdCAqaGlnaCwgaW50IHdpZHRoLCB1aW50OF90IGNsaXApCitzdGF0aWMgdm9pZCBob3Jpel9maWx0ZXJfY2xpcChpbnQxNl90ICpvdXRwdXQsIGludDE2X3QgKmxvdywgaW50MTZfdCAqaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGNsaXApCiB7CiAgICAgZmlsdGVyKG91dHB1dCwgMSwgbG93LCAxLCBoaWdoLCAxLCB3aWR0aCwgY2xpcCk7CiB9CiAKLXN0YXRpYyB2b2lkIHZlcnRfZmlsdGVyKGludDE2X3QgKm91dHB1dCwgaW50IG91dF9zdHJpZGUsIGludDE2X3QgKmxvdywgaW50IGxvd19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpoaWdoLCBpbnQgaGlnaF9zdHJpZGUsIGludCBsZW4pCitzdGF0aWMgdm9pZCB2ZXJ0X2ZpbHRlcihpbnQxNl90ICpvdXRwdXQsIHB0cmRpZmZfdCBvdXRfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqbG93LCBwdHJkaWZmX3QgbG93X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmhpZ2gsIHB0cmRpZmZfdCBoaWdoX3N0cmlkZSwgaW50IGxlbikKIHsKICAgICBmaWx0ZXIob3V0cHV0LCBvdXRfc3RyaWRlLCBsb3csIGxvd19zdHJpZGUsIGhpZ2gsIGhpZ2hfc3RyaWRlLCBsZW4sIDApOwogfQogCi1zdGF0aWMgdm9pZCBmcmVlX2J1ZmZlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQorc3RhdGljIHZvaWQgZnJlZV9idWZmZXJzKENGSERDb250ZXh0ICpzKQogewotICAgIENGSERDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgajsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+cGxhbmUpOyBpKyspIHsKICAgICAgICAgYXZfZnJlZXAoJnMtPnBsYW5lW2ldLmlkd3RfYnVmKTsKICAgICAgICAgYXZfZnJlZXAoJnMtPnBsYW5lW2ldLmlkd3RfdG1wKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgOTsgaisrKQorICAgICAgICAgICAgcy0+cGxhbmVbaV0uc3ViYmFuZFtqXSA9IE5VTEw7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykKKyAgICAgICAgICAgIHMtPnBsYW5lW2ldLmxfaFtqXSA9IE5VTEw7CiAgICAgfQogICAgIHMtPmFfaGVpZ2h0ID0gMDsKICAgICBzLT5hX3dpZHRoICA9IDA7CkBAIC0xNTIsMzUgKzE5NCw0NCBAQAogc3RhdGljIGludCBhbGxvY19idWZmZXJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBDRkhEQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IGksIGosIGssIHJldDsKKyAgICBpbnQgaSwgaiwgcmV0LCBwbGFuZXM7CisgICAgaW50IGNocm9tYV94X3NoaWZ0LCBjaHJvbWFfeV9zaGlmdDsKKyAgICB1bnNpZ25lZCBrOwogCiAgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgcy0+Y29kZWRfd2lkdGgsIHMtPmNvZGVkX2hlaWdodCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IHMtPmNvZGVkX2Zvcm1hdDsKIAotICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LCAmcy0+Y2hyb21hX3hfc2hpZnQsICZzLT5jaHJvbWFfeV9zaGlmdCk7CisgICAgaWYgKChyZXQgPSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShzLT5jb2RlZF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hyb21hX3hfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hyb21hX3lfc2hpZnQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMocy0+Y29kZWRfZm9ybWF0KTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgaW50IHdpZHRoID0gaSA/IGF2Y3R4LT53aWR0aCA+PiBzLT5jaHJvbWFfeF9zaGlmdCA6IGF2Y3R4LT53aWR0aDsKLSAgICAgICAgaW50IGhlaWdodCA9IGkgPyBhdmN0eC0+aGVpZ2h0ID4+IHMtPmNocm9tYV95X3NoaWZ0IDogYXZjdHgtPmhlaWdodDsKLSAgICAgICAgaW50IHN0cmlkZSA9IEZGQUxJR04od2lkdGggLyA4LCA4KSAqIDg7CisgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lczsgaSsrKSB7CiAgICAgICAgIGludCB3OCwgaDgsIHc0LCBoNCwgdzIsIGgyOwotICAgICAgICBoZWlnaHQgPSBGRkFMSUdOKGhlaWdodCAvIDgsIDIpICogODsKLSAgICAgICAgcy0+cGxhbmVbaV0ud2lkdGggPSB3aWR0aDsKKyAgICAgICAgaW50IHdpZHRoICA9IGkgPyBhdmN0eC0+d2lkdGggID4+IGNocm9tYV94X3NoaWZ0IDogYXZjdHgtPndpZHRoOworICAgICAgICBpbnQgaGVpZ2h0ID0gaSA/IGF2Y3R4LT5oZWlnaHQgPj4gY2hyb21hX3lfc2hpZnQgOiBhdmN0eC0+aGVpZ2h0OworICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlID0gRkZBTElHTih3aWR0aCAgLyA4LCA4KSAqIDg7CisgICAgICAgIGlmIChjaHJvbWFfeV9zaGlmdCkKKyAgICAgICAgICAgIGhlaWdodCA9IEZGQUxJR04oaGVpZ2h0IC8gOCwgMikgKiA4OworICAgICAgICBzLT5wbGFuZVtpXS53aWR0aCAgPSB3aWR0aDsKICAgICAgICAgcy0+cGxhbmVbaV0uaGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICBzLT5wbGFuZVtpXS5zdHJpZGUgPSBzdHJpZGU7CiAKLSAgICAgICAgdzggPSBGRkFMSUdOKHMtPnBsYW5lW2ldLndpZHRoIC8gOCwgOCk7Ci0gICAgICAgIGg4ID0gRkZBTElHTihzLT5wbGFuZVtpXS5oZWlnaHQgLyA4LCAyKTsKKyAgICAgICAgdzggPSBGRkFMSUdOKHMtPnBsYW5lW2ldLndpZHRoICAvIDgsIDgpOworICAgICAgICBoOCA9IGhlaWdodCAvIDg7CiAgICAgICAgIHc0ID0gdzggKiAyOwogICAgICAgICBoNCA9IGg4ICogMjsKICAgICAgICAgdzIgPSB3NCAqIDI7CiAgICAgICAgIGgyID0gaDQgKiAyOwogCi0gICAgICAgIHMtPnBsYW5lW2ldLmlkd3RfYnVmID0gYXZfbWFsbG9jX2FycmF5KGhlaWdodCAqIHN0cmlkZSwgc2l6ZW9mKCpzLT5wbGFuZVtpXS5pZHd0X2J1ZikpOwotICAgICAgICBzLT5wbGFuZVtpXS5pZHd0X3RtcCA9IGF2X21hbGxvY19hcnJheShoZWlnaHQgKiBzdHJpZGUsIHNpemVvZigqcy0+cGxhbmVbaV0uaWR3dF90bXApKTsKLSAgICAgICAgaWYgKCFzLT5wbGFuZVtpXS5pZHd0X2J1ZiB8fCAhcy0+cGxhbmVbaV0uaWR3dF90bXApIHsKKyAgICAgICAgcy0+cGxhbmVbaV0uaWR3dF9idWYgPQorICAgICAgICAgICAgYXZfbWFsbG9jel9hcnJheShoZWlnaHQgKiBzdHJpZGUsIHNpemVvZigqcy0+cGxhbmVbaV0uaWR3dF9idWYpKTsKKyAgICAgICAgcy0+cGxhbmVbaV0uaWR3dF90bXAgPQorICAgICAgICAgICAgYXZfbWFsbG9jX2FycmF5KGhlaWdodCAqIHN0cmlkZSwgc2l6ZW9mKCpzLT5wbGFuZVtpXS5pZHd0X3RtcCkpOworICAgICAgICBpZiAoIXMtPnBsYW5lW2ldLmlkd3RfYnVmIHx8ICFzLT5wbGFuZVtpXS5pZHd0X3RtcCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KIAogICAgICAgICBzLT5wbGFuZVtpXS5zdWJiYW5kWzBdID0gcy0+cGxhbmVbaV0uaWR3dF9idWY7CiAgICAgICAgIHMtPnBsYW5lW2ldLnN1YmJhbmRbMV0gPSBzLT5wbGFuZVtpXS5pZHd0X2J1ZiArIDIgKiB3OCAqIGg4OwpAQCAtMTk0LDcgKzI0NSw3IEBACiAgICAgICAgIHMtPnBsYW5lW2ldLnN1YmJhbmRbOV0gPSBzLT5wbGFuZVtpXS5pZHd0X2J1ZiArIDMgKiB3MiAqIGgyOwogCiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBEV1RfTEVWRUxTOyBqKyspIHsKLSAgICAgICAgICAgIGZvcihrID0gMDsgayA8IDQ7IGsrKykgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IEZGX0FSUkFZX0VMRU1TKHMtPnBsYW5lW2ldLmJhbmRbal0pOyBrKyspIHsKICAgICAgICAgICAgICAgICBzLT5wbGFuZVtpXS5iYW5kW2pdW2tdLmFfd2lkdGggID0gdzggPDwgajsKICAgICAgICAgICAgICAgICBzLT5wbGFuZVtpXS5iYW5kW2pdW2tdLmFfaGVpZ2h0ID0gaDggPDwgajsKICAgICAgICAgICAgIH0KQEAgLTIwMywxNiArMjU0LDE3IEBACiAgICAgICAgIC8qIGxsMiBhbmQgbGwxIGNvbW1lbnRlZCBvdXQgYmVjYXVzZSB0aGV5IGFyZSBkb25lIGluLXBsYWNlICovCiAgICAgICAgIHMtPnBsYW5lW2ldLmxfaFswXSA9IHMtPnBsYW5lW2ldLmlkd3RfdG1wOwogICAgICAgICBzLT5wbGFuZVtpXS5sX2hbMV0gPSBzLT5wbGFuZVtpXS5pZHd0X3RtcCArIDIgKiB3OCAqIGg4OwotICAgICAgICAvL3MtPnBsYW5lW2ldLmxfaFsyXSA9IGxsMjsKKyAgICAgICAgLy8gcy0+cGxhbmVbaV0ubF9oWzJdID0gbGwyOwogICAgICAgICBzLT5wbGFuZVtpXS5sX2hbM10gPSBzLT5wbGFuZVtpXS5pZHd0X3RtcDsKICAgICAgICAgcy0+cGxhbmVbaV0ubF9oWzRdID0gcy0+cGxhbmVbaV0uaWR3dF90bXAgKyAyICogdzQgKiBoNDsKLSAgICAgICAgLy9zLT5wbGFuZVtpXS5sX2hbNV0gPSBsbDE7CisgICAgICAgIC8vIHMtPnBsYW5lW2ldLmxfaFs1XSA9IGxsMTsKICAgICAgICAgcy0+cGxhbmVbaV0ubF9oWzZdID0gcy0+cGxhbmVbaV0uaWR3dF90bXA7CiAgICAgICAgIHMtPnBsYW5lW2ldLmxfaFs3XSA9IHMtPnBsYW5lW2ldLmlkd3RfdG1wICsgMiAqIHcyICogaDI7CiAgICAgfQogCiAgICAgcy0+YV9oZWlnaHQgPSBzLT5jb2RlZF9oZWlnaHQ7CiAgICAgcy0+YV93aWR0aCAgPSBzLT5jb2RlZF93aWR0aDsKKyAgICBzLT5hX2Zvcm1hdCA9IHMtPmNvZGVkX2Zvcm1hdDsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjI0LDExICsyNzYsMTIgQEAKICAgICBHZXRCeXRlQ29udGV4dCBnYjsKICAgICBUaHJlYWRGcmFtZSBmcmFtZSA9IHsgLmYgPSBkYXRhIH07CiAgICAgQVZGcmFtZSAqcGljID0gZGF0YTsKLSAgICBpbnQgcmV0ID0gMCwgaSwgaiwgcGxhbmUsIGdvdF9idWZmZXIgPSAwOworICAgIGludCByZXQgPSAwLCBpLCBqLCBwbGFuZXMsIHBsYW5lLCBnb3RfYnVmZmVyID0gMDsKICAgICBpbnQxNl90ICpjb2VmZl9kYXRhOwogCi0gICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICBzLT5jb2RlZF9mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKICAgICBpbml0X2ZyYW1lX2RlZmF1bHRzKHMpOworICAgIHBsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKHMtPmNvZGVkX2Zvcm1hdCk7CiAKICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKIApAQCAtMjQyLDQwICsyOTUsNDUgQEAKICAgICAgICAgdWludDE2X3QgZGF0YSAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKICAgICAgICAgaWYgKGFic190YWc4ID49IDB4NjAgJiYgYWJzX3RhZzggPD0gMHg2ZikgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJsYXJnZSBsZW4gJXhcbiIsICgodGFndSAmIDB4ZmYpIDw8IDE2KSB8IGRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAyMCkgeworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBJbWFnZVdpZHRoKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIldpZHRoICUiUFJJdTE2IlxuIiwgZGF0YSk7CiAgICAgICAgICAgICBzLT5jb2RlZF93aWR0aCA9IGRhdGE7Ci0gICAgICAgIH0gZWxzZSBpZiAodGFnID09IDIxKSB7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IEltYWdlSGVpZ2h0KSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkhlaWdodCAlIlBSSXUxNiJcbiIsIGRhdGEpOwogICAgICAgICAgICAgcy0+Y29kZWRfaGVpZ2h0ID0gZGF0YTsKICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMTAxKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkJpdHMgcGVyIGNvbXBvbmVudDogJSJQUkl1MTYiXG4iLCBkYXRhKTsKKyAgICAgICAgICAgIGlmIChkYXRhIDwgMSB8fCBkYXRhID4gMzEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJpdHMgcGVyIGNvbXBvbmVudCAlZCBpcyBpbnZhbGlkXG4iLCBkYXRhKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzLT5icGMgPSBkYXRhOwotICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAxMikgeworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBDaGFubmVsQ291bnQpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiQ2hhbm5lbCBDb3VudDogJSJQUkl1MTYiXG4iLCBkYXRhKTsKICAgICAgICAgICAgIHMtPmNoYW5uZWxfY250ID0gZGF0YTsKLSAgICAgICAgICAgIGlmIChkYXRhICE9IDMpIHsKKyAgICAgICAgICAgIGlmIChkYXRhID4gNCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2hhbm5lbCBDb3VudCBvZiAlIlBSSXUxNiIgaXMgdW5zdXBwb3J0ZWRcbiIsIGRhdGEpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAxNCkgeworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBTdWJiYW5kQ291bnQpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU3ViYmFuZCBDb3VudDogJSJQUkl1MTYiXG4iLCBkYXRhKTsKICAgICAgICAgICAgIGlmIChkYXRhICE9IFNVQkJBTkRfQ09VTlQpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN1YmJhbmQgQ291bnQgb2YgJSJQUkl1MTYiIGlzIHVuc3VwcG9ydGVkXG4iLCBkYXRhKTsKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gNjIpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gQ2hhbm5lbE51bWJlcikgewogICAgICAgICAgICAgcy0+Y2hhbm5lbF9udW0gPSBkYXRhOwogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJDaGFubmVsIG51bWJlciAlIlBSSXUxNiJcbiIsIGRhdGEpOwotICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfbnVtID4gMikgeworICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfbnVtID49IHBsYW5lcykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVsIG51bWJlclxuIik7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW5pdF9wbGFuZV9kZWZhdWx0cyhzKTsKLSAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gNDgpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gU3ViYmFuZE51bWJlcikgewogICAgICAgICAgICAgaWYgKHMtPnN1YmJhbmRfbnVtICE9IDAgJiYgZGF0YSA9PSAxKSAgLy8gaGFjawogICAgICAgICAgICAgICAgIHMtPmxldmVsKys7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlN1YmJhbmQgbnVtYmVyICUiUFJJdTE2IlxuIiwgZGF0YSk7CkBAIC0yOTgsNDggKzM1Niw0OCBAQAogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMzUpCisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IExvd3Bhc3NQcmVjaXNpb24pCiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkxvd3Bhc3MgcHJlY2lzaW9uIGJpdHM6ICUiUFJJdTE2IlxuIiwgZGF0YSk7Ci0gICAgICAgIGVsc2UgaWYgKHRhZyA9PSA1MykgeworICAgICAgICBlbHNlIGlmICh0YWcgPT0gUXVhbnRpemF0aW9uKSB7CiAgICAgICAgICAgICBzLT5xdWFudGlzYXRpb24gPSBkYXRhOwogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJRdWFudGlzYXRpb246ICUiUFJJdTE2IlxuIiwgZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGFnID09IDEwOSkgeworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBQcmVzY2FsZVNoaWZ0KSB7CiAgICAgICAgICAgICBzLT5wcmVzY2FsZV9zaGlmdFswXSA9IChkYXRhID4+IDApICYgMHg3OwogICAgICAgICAgICAgcy0+cHJlc2NhbGVfc2hpZnRbMV0gPSAoZGF0YSA+PiAzKSAmIDB4NzsKICAgICAgICAgICAgIHMtPnByZXNjYWxlX3NoaWZ0WzJdID0gKGRhdGEgPj4gNikgJiAweDc7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlByZXNjYWxlIHNoaWZ0IChWQy01KTogJXhcbiIsIGRhdGEpOwogICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAyNykgewotICAgICAgICAgICAgcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbMF1bMF0ud2lkdGggID0gZGF0YTsKLSAgICAgICAgICAgIHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kWzBdWzBdLnN0cmlkZSA9IGRhdGE7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkxvd3Bhc3Mgd2lkdGggJSJQUkl1MTYiXG4iLCBkYXRhKTsKLSAgICAgICAgICAgIGlmIChkYXRhIDwgMiB8fCBkYXRhID4gcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbMF1bMF0uYV93aWR0aCkgeworICAgICAgICAgICAgaWYgKGRhdGEgPCAzIHx8IGRhdGEgPiBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFswXVswXS5hX3dpZHRoKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGxvd3Bhc3Mgd2lkdGhcbiIpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kWzBdWzBdLndpZHRoICA9IGRhdGE7CisgICAgICAgICAgICBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFswXVswXS5zdHJpZGUgPSBkYXRhOwogICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAyOCkgewotICAgICAgICAgICAgcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbMF1bMF0uaGVpZ2h0ID0gZGF0YTsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiTG93cGFzcyBoZWlnaHQgJSJQUkl1MTYiXG4iLCBkYXRhKTsKLSAgICAgICAgICAgIGlmIChkYXRhIDwgMiB8fCBkYXRhID4gcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbMF1bMF0uaGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoZGF0YSA8IDMgfHwgZGF0YSA+IHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kWzBdWzBdLmFfaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGxvd3Bhc3MgaGVpZ2h0XG4iKTsKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFswXVswXS5oZWlnaHQgPSBkYXRhOwogICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAxKQogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJTYW1wbGUgdHlwZT8gJSJQUkl1MTYiXG4iLCBkYXRhKTsKICAgICAgICAgZWxzZSBpZiAodGFnID09IDEwKSB7CiAgICAgICAgICAgICBpZiAoZGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJUcmFuc2Zvcm0gdHlwZSBvZiAlIlBSSXUxNiIgaXMgdW5zdXBwb3J0ZWRcbiIsIGRhdGEpOworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiVHJhbnNmb3JtIHR5cGUgb2YgJSJQUkl1MTYsIGRhdGEpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJUcmFuc2Zvcm0tdHlwZT8gJSJQUkl1MTYiXG4iLCBkYXRhKTsKICAgICAgICAgfSBlbHNlIGlmIChhYnN0YWcgPj0gMHg0MDAwICYmIGFic3RhZyA8PSAweDQwZmYpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU21hbGwgY2h1bmsgbGVuZ3RoICUiUFJJdTE2IiAlc1xuIiwgZGF0YSAqIDQsIHRhZyA8IDAgPyAib3B0aW9uYWwiIDogInJlcXVpcmVkIik7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlNtYWxsIGNodW5rIGxlbmd0aCAlZCAlc1xuIiwgZGF0YSAqIDQsIHRhZyA8IDAgPyAib3B0aW9uYWwiIDogInJlcXVpcmVkIik7CiAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIGRhdGEgKiA0KTsKICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMjMpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU2tpcCBmcmFtZVxuIik7Ci0gICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIlNraXAgZnJhbWUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIlNraXAgZnJhbWUiKTsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDIpIHsKQEAgLTM1NSwzOSArNDEzLDM5IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJUYWcvVmFsdWUgPSAleCAleFxuIiwgdGFnMiwgdmFsMik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDQxKSB7Ci0gICAgICAgICAgICBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFtzLT5sZXZlbF1bcy0+c3ViYmFuZF9udW1dLndpZHRoICA9IGRhdGE7Ci0gICAgICAgICAgICBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFtzLT5sZXZlbF1bcy0+c3ViYmFuZF9udW1dLnN0cmlkZSA9IEZGQUxJR04oZGF0YSwgOCk7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkhpZ2hwYXNzIHdpZHRoICVpIGNoYW5uZWwgJWkgbGV2ZWwgJWkgc3ViYmFuZCAlaVxuIiwgZGF0YSwgcy0+Y2hhbm5lbF9udW0sIHMtPmxldmVsLCBzLT5zdWJiYW5kX251bSk7Ci0gICAgICAgICAgICBpZiAoZGF0YSA8IDIpIHsKKyAgICAgICAgICAgIGlmIChkYXRhIDwgMykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBoaWdocGFzcyB3aWR0aFxuIik7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbcy0+bGV2ZWxdW3MtPnN1YmJhbmRfbnVtXS53aWR0aCAgPSBkYXRhOworICAgICAgICAgICAgcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbcy0+bGV2ZWxdW3MtPnN1YmJhbmRfbnVtXS5zdHJpZGUgPSBGRkFMSUdOKGRhdGEsIDgpOwogICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSA0MikgewotICAgICAgICAgICAgcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbcy0+bGV2ZWxdW3MtPnN1YmJhbmRfbnVtXS5oZWlnaHQgPSBkYXRhOwogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJIaWdocGFzcyBoZWlnaHQgJWlcbiIsIGRhdGEpOwotICAgICAgICAgICAgaWYgKGRhdGEgPCAyKSB7CisgICAgICAgICAgICBpZiAoZGF0YSA8IDMpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaGlnaHBhc3MgaGVpZ2h0XG4iKTsKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFtzLT5sZXZlbF1bcy0+c3ViYmFuZF9udW1dLmhlaWdodCA9IGRhdGE7CiAgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDQ5KSB7Ci0gICAgICAgICAgICBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFtzLT5sZXZlbF1bcy0+c3ViYmFuZF9udW1dLndpZHRoICA9IGRhdGE7Ci0gICAgICAgICAgICBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFtzLT5sZXZlbF1bcy0+c3ViYmFuZF9udW1dLnN0cmlkZSA9IEZGQUxJR04oZGF0YSwgOCk7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkhpZ2hwYXNzIHdpZHRoMiAlaVxuIiwgZGF0YSk7Ci0gICAgICAgICAgICBpZiAoZGF0YSA8IDIpIHsKKyAgICAgICAgICAgIGlmIChkYXRhIDwgMykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBoaWdocGFzcyB3aWR0aDJcbiIpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kW3MtPmxldmVsXVtzLT5zdWJiYW5kX251bV0ud2lkdGggID0gZGF0YTsKKyAgICAgICAgICAgIHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kW3MtPmxldmVsXVtzLT5zdWJiYW5kX251bV0uc3RyaWRlID0gRkZBTElHTihkYXRhLCA4KTsKICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gNTApIHsKLSAgICAgICAgICAgIHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kW3MtPmxldmVsXVtzLT5zdWJiYW5kX251bV0uaGVpZ2h0ID0gZGF0YTsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSGlnaHBhc3MgaGVpZ2h0MiAlaVxuIiwgZGF0YSk7Ci0gICAgICAgICAgICBpZiAoZGF0YSA8IDIpIHsKKyAgICAgICAgICAgIGlmIChkYXRhIDwgMykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBoaWdocGFzcyBoZWlnaHQyXG4iKTsKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5wbGFuZVtzLT5jaGFubmVsX251bV0uYmFuZFtzLT5sZXZlbF1bcy0+c3ViYmFuZF9udW1dLmhlaWdodCA9IGRhdGE7CiAgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDcxKSB7CiAgICAgICAgICAgICBzLT5jb2RlYm9vayA9IGRhdGE7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkNvZGVib29rICVpXG4iLCBzLT5jb2RlYm9vayk7CkBAIC0zOTYsNDEgKzQ1NCw1NyBAQAogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJPdGhlciBjb2RlYm9vaz8gJWlcbiIsIHMtPmNvZGVib29rKTsKICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gNzApIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU3Vic2FtcGxpbmcgb3IgYml0LWRlcHRoIGZsYWc/ICVpXG4iLCBkYXRhKTsKLSAgICAgICAgICAgIHMtPmJwYyA9IGRhdGE7Ci0gICAgICAgICAgICBpZiAoIShzLT5icGMgPT0gMTAgfHwgcy0+YnBjID09IDEyKSkgeworICAgICAgICAgICAgaWYgKCEoZGF0YSA9PSAxMCB8fCBkYXRhID09IDEyKSkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBiaXRzIHBlciBjaGFubmVsXG4iKTsKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5icGMgPSBkYXRhOwogICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSA4NCkgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJTYW1wbGUgZm9ybWF0PyAlaVxuIiwgZGF0YSk7CiAgICAgICAgICAgICBpZiAoZGF0YSA9PSAxKQotICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CisgICAgICAgICAgICAgICAgcy0+Y29kZWRfZm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CiAgICAgICAgICAgICBlbHNlIGlmIChkYXRhID09IDMpCi0gICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMjsKKyAgICAgICAgICAgICAgICBzLT5jb2RlZF9mb3JtYXQgPSBBVl9QSVhfRk1UX0dCUlAxMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgPT0gNCkKKyAgICAgICAgICAgICAgICBzLT5jb2RlZF9mb3JtYXQgPSBBVl9QSVhfRk1UX0dCUkFQMTI7CiAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIlNhbXBsZSBmb3JtYXQgb2YgJSJQUkl1MTYiIGlzIHVuc3VwcG9ydGVkXG4iLCBkYXRhKTsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIlNhbXBsZSBmb3JtYXQgb2YgJSJQUkl1MTYsIGRhdGEpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMocy0+Y29kZWRfZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gLTg1KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkNyb3BwZWQgaGVpZ2h0ICUiUFJJdTE2IlxuIiwgZGF0YSk7CisgICAgICAgICAgICBzLT5jcm9wcGVkX2hlaWdodCA9IGRhdGE7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICAiVW5rbm93biB0YWcgJWkgZGF0YSAleFxuIiwgdGFnLCBkYXRhKTsKIAogICAgICAgICAvKiBTb21lIGtpbmQgb2YgZW5kIG9mIGhlYWRlciB0YWcgKi8KLSAgICAgICAgaWYgKHRhZyA9PSA0ICYmIGRhdGEgPT0gMHgxYTRhICYmIHMtPmNvZGVkX3dpZHRoICYmIHMtPmNvZGVkX2hlaWdodCAmJiBhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUpIHsKLSAgICAgICAgICAgIGlmIChzLT5hX3dpZHRoICE9IHMtPmNvZGVkX3dpZHRoIHx8IHMtPmFfaGVpZ2h0ICE9IHMtPmNvZGVkX2hlaWdodCkgewotICAgICAgICAgICAgICAgIGZyZWVfYnVmZmVycyhhdmN0eCk7CisgICAgICAgIGlmICh0YWcgPT0gNCAmJiBkYXRhID09IDB4MWE0YSAmJiBzLT5jb2RlZF93aWR0aCAmJiBzLT5jb2RlZF9oZWlnaHQgJiYKKyAgICAgICAgICAgIHMtPmNvZGVkX2Zvcm1hdCAhPSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChzLT5hX3dpZHRoICE9IHMtPmNvZGVkX3dpZHRoIHx8IHMtPmFfaGVpZ2h0ICE9IHMtPmNvZGVkX2hlaWdodCB8fAorICAgICAgICAgICAgICAgIHMtPmFfZm9ybWF0ICE9IHMtPmNvZGVkX2Zvcm1hdCkgeworICAgICAgICAgICAgICAgIGZyZWVfYnVmZmVycyhzKTsKICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGFsbG9jX2J1ZmZlcnMoYXZjdHgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZnJlZV9idWZmZXJzKGF2Y3R4KTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZV9idWZmZXJzKHMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBzLT5jb2RlZF93aWR0aCwgcy0+Y29kZWRfaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAocy0+Y3JvcHBlZF9oZWlnaHQpCisgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA9IHMtPmNyb3BwZWRfaGVpZ2h0OworICAgICAgICAgICAgZnJhbWUuZi0+d2lkdGggPQorICAgICAgICAgICAgZnJhbWUuZi0+aGVpZ2h0ID0gMDsKIAogICAgICAgICAgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAgICAgICAgIHMtPmNvZGVkX3dpZHRoID0gMDsKICAgICAgICAgICAgIHMtPmNvZGVkX2hlaWdodCA9IDA7CisgICAgICAgICAgICBzLT5jb2RlZF9mb3JtYXQgPSBBVl9QSVhfRk1UX05PTkU7CiAgICAgICAgICAgICBnb3RfYnVmZmVyID0gMTsKICAgICAgICAgfQogICAgICAgICBjb2VmZl9kYXRhID0gcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLnN1YmJhbmRbcy0+c3ViYmFuZF9udW1fYWN0dWFsXTsKQEAgLTQ0Miw2ICs1MTYsMTIgQEAKICAgICAgICAgICAgIGludCBsb3dwYXNzX2FfaGVpZ2h0ID0gcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbMF1bMF0uYV9oZWlnaHQ7CiAgICAgICAgICAgICBpbnQgbG93cGFzc19hX3dpZHRoICA9IHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kWzBdWzBdLmFfd2lkdGg7CiAKKyAgICAgICAgICAgIGlmICghZ290X2J1ZmZlcikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gZW5kIG9mIGhlYWRlciB0YWcgZm91bmRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGxvd3Bhc3NfaGVpZ2h0ID4gbG93cGFzc19hX2hlaWdodCB8fCBsb3dwYXNzX3dpZHRoID4gbG93cGFzc19hX3dpZHRoIHx8CiAgICAgICAgICAgICAgICAgbG93cGFzc19hX3dpZHRoICogbG93cGFzc19hX2hlaWdodCAqIHNpemVvZihpbnQxNl90KSA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGxvd3Bhc3MgY29lZmZpY2llbnRzXG4iKTsKQEAgLTQ0OSw3ICs1MjksNyBAQAogICAgICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlN0YXJ0IG9mIGxvd3Bhc3MgY29lZmZzIGNvbXBvbmVudCAlIlBSSXUxNiIgaGVpZ2h0OiVkLCB3aWR0aDolZFxuIiwgcy0+Y2hhbm5lbF9udW0sIGxvd3Bhc3NfaGVpZ2h0LCBsb3dwYXNzX3dpZHRoKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU3RhcnQgb2YgbG93cGFzcyBjb2VmZnMgY29tcG9uZW50ICVkIGhlaWdodDolZCwgd2lkdGg6JWRcbiIsIHMtPmNoYW5uZWxfbnVtLCBsb3dwYXNzX2hlaWdodCwgbG93cGFzc193aWR0aCk7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbG93cGFzc19oZWlnaHQ7IGkrKykgewogICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsb3dwYXNzX3dpZHRoOyBqKyspCiAgICAgICAgICAgICAgICAgICAgIGNvZWZmX2RhdGFbal0gPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJmdiKTsKQEAgLTQ1Nyw2ICs1MzcsOSBAQAogICAgICAgICAgICAgICAgIGNvZWZmX2RhdGEgKz0gbG93cGFzc193aWR0aDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgLyogQWxpZ24gdG8gbW9kLTQgcG9zaXRpb24gdG8gY29udGludWUgcmVhZGluZyB0YWdzICovCisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYiwgYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpICYgMywgU0VFS19DVVIpOworCiAgICAgICAgICAgICAvKiBDb3B5IGxhc3QgbGluZSBvZiBjb2VmZmljaWVudHMgaWYgb2RkIGhlaWdodCAqLwogICAgICAgICAgICAgaWYgKGxvd3Bhc3NfaGVpZ2h0ICYgMSkgewogICAgICAgICAgICAgICAgIG1lbWNweSgmY29lZmZfZGF0YVtsb3dwYXNzX2hlaWdodCAqIGxvd3Bhc3Nfd2lkdGhdLApAQCAtNDY0LDcgKzU0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGxvd3Bhc3Nfd2lkdGggKiBzaXplb2YoKmNvZWZmX2RhdGEpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJMb3dwYXNzIGNvZWZmaWNpZW50cyAlIlBSSXUxNiJcbiIsIGxvd3Bhc3Nfd2lkdGggKiBsb3dwYXNzX2hlaWdodCk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkxvd3Bhc3MgY29lZmZpY2llbnRzICVkXG4iLCBsb3dwYXNzX3dpZHRoICogbG93cGFzc19oZWlnaHQpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHRhZyA9PSA1NSAmJiBzLT5zdWJiYW5kX251bV9hY3R1YWwgIT0gMjU1ICYmIHMtPmFfd2lkdGggJiYgcy0+YV9oZWlnaHQpIHsKQEAgLTQ3MywxNyArNTU2LDI0IEBACiAgICAgICAgICAgICBpbnQgaGlnaHBhc3NfYV93aWR0aCA9IHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kW3MtPmxldmVsXVtzLT5zdWJiYW5kX251bV0uYV93aWR0aDsKICAgICAgICAgICAgIGludCBoaWdocGFzc19hX2hlaWdodCA9IHMtPnBsYW5lW3MtPmNoYW5uZWxfbnVtXS5iYW5kW3MtPmxldmVsXVtzLT5zdWJiYW5kX251bV0uYV9oZWlnaHQ7CiAgICAgICAgICAgICBpbnQgaGlnaHBhc3Nfc3RyaWRlID0gcy0+cGxhbmVbcy0+Y2hhbm5lbF9udW1dLmJhbmRbcy0+bGV2ZWxdW3MtPnN1YmJhbmRfbnVtXS5zdHJpZGU7Ci0gICAgICAgICAgICBpbnQgZXhwZWN0ZWQgPSBoaWdocGFzc19oZWlnaHQgKiBoaWdocGFzc19zdHJpZGU7CisgICAgICAgICAgICBpbnQgZXhwZWN0ZWQ7CiAgICAgICAgICAgICBpbnQgYV9leHBlY3RlZCA9IGhpZ2hwYXNzX2FfaGVpZ2h0ICogaGlnaHBhc3NfYV93aWR0aDsKICAgICAgICAgICAgIGludCBsZXZlbCwgcnVuLCBjb2VmZjsKICAgICAgICAgICAgIGludCBjb3VudCA9IDAsIGJ5dGVzOwogCi0gICAgICAgICAgICBpZiAoaGlnaHBhc3NfaGVpZ2h0ID4gaGlnaHBhc3NfYV9oZWlnaHQgfHwgaGlnaHBhc3Nfd2lkdGggPiBoaWdocGFzc19hX3dpZHRoIHx8IGFfZXhwZWN0ZWQgPCBleHBlY3RlZCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgaGlnaHBhc3MgY29lZmZpY2VudHNcbiIpOworICAgICAgICAgICAgaWYgKCFnb3RfYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBlbmQgb2YgaGVhZGVyIHRhZyBmb3VuZFxuIik7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoaGlnaHBhc3NfaGVpZ2h0ID4gaGlnaHBhc3NfYV9oZWlnaHQgfHwgaGlnaHBhc3Nfd2lkdGggPiBoaWdocGFzc19hX3dpZHRoIHx8IGFfZXhwZWN0ZWQgPCBoaWdocGFzc19oZWlnaHQgKiAodWludDY0X3QpaGlnaHBhc3Nfc3RyaWRlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBoaWdocGFzcyBjb2VmZmljaWVudHNcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4cGVjdGVkID0gaGlnaHBhc3NfaGVpZ2h0ICogaGlnaHBhc3Nfc3RyaWRlOworCiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlN0YXJ0IHN1YmJhbmQgY29lZmZzIHBsYW5lICVpIGxldmVsICVpIGNvZGVib29rICVpIGV4cGVjdGVkICVpXG4iLCBzLT5jaGFubmVsX251bSwgcy0+bGV2ZWwsIHMtPmNvZGVib29rLCBleHBlY3RlZCk7CiAKICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBnYi5idWZmZXIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgKiA4KTsKQEAgLTU1Nyw3ICs2NDcsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCFzLT5hX3dpZHRoIHx8ICFzLT5hX2hlaWdodCB8fCBzLT5jb2RlZF93aWR0aCB8fCBzLT5jb2RlZF9oZWlnaHQpIHsKKyAgICBpZiAoIXMtPmFfd2lkdGggfHwgIXMtPmFfaGVpZ2h0IHx8IHMtPmFfZm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSB8fAorICAgICAgICBzLT5jb2RlZF93aWR0aCB8fCBzLT5jb2RlZF9oZWlnaHQgfHwgcy0+Y29kZWRfZm9ybWF0ICE9IEFWX1BJWF9GTVRfTk9ORSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZGltZW5zaW9uc1xuIik7CiAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgZ290byBlbmQ7CkBAIC01NjksMTIgKzY2MCwxMyBAQAogICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKLSAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzICYmICFyZXQ7IHBsYW5lKyspIHsKKyAgICBwbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhhdmN0eC0+cGl4X2ZtdCk7CisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcGxhbmVzICYmICFyZXQ7IHBsYW5lKyspIHsKICAgICAgICAgLyogbGV2ZWwgMSAqLwogICAgICAgICBpbnQgbG93cGFzc19oZWlnaHQgID0gcy0+cGxhbmVbcGxhbmVdLmJhbmRbMF1bMF0uaGVpZ2h0OwogICAgICAgICBpbnQgbG93cGFzc193aWR0aCAgID0gcy0+cGxhbmVbcGxhbmVdLmJhbmRbMF1bMF0ud2lkdGg7CiAgICAgICAgIGludCBoaWdocGFzc19zdHJpZGUgPSBzLT5wbGFuZVtwbGFuZV0uYmFuZFswXVsxXS5zdHJpZGU7Ci0gICAgICAgIGludCBhY3RfcGxhbmUgPSBwbGFuZSA9PSAxID8gMiA6IHBsYW5lID09IDIgPyAxIDogMDsKKyAgICAgICAgaW50IGFjdF9wbGFuZSA9IHBsYW5lID09IDEgPyAyIDogcGxhbmUgPT0gMiA/IDEgOiBwbGFuZTsKICAgICAgICAgaW50MTZfdCAqbG93LCAqaGlnaCwgKm91dHB1dCwgKmRzdDsKIAogICAgICAgICBpZiAobG93cGFzc19oZWlnaHQgPiBzLT5wbGFuZVtwbGFuZV0uYmFuZFswXVswXS5hX2hlaWdodCB8fCBsb3dwYXNzX3dpZHRoID4gcy0+cGxhbmVbcGxhbmVdLmJhbmRbMF1bMF0uYV93aWR0aCB8fApAQCAtNjE3LDExICs3MDksMTEgQEAKICAgICAgICAgICAgIGhpZ2ggICArPSBsb3dwYXNzX3dpZHRoOwogICAgICAgICAgICAgb3V0cHV0ICs9IGxvd3Bhc3Nfd2lkdGggKiAyOwogICAgICAgICB9Ci0gICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAxMikgeworICAgICAgICBpZiAocy0+YnBjID09IDEyKSB7CiAgICAgICAgICAgICBvdXRwdXQgPSBzLT5wbGFuZVtwbGFuZV0uc3ViYmFuZFswXTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsb3dwYXNzX2hlaWdodCAqIDI7IGkrKykgewogICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsb3dwYXNzX3dpZHRoICogMjsgaisrKQotICAgICAgICAgICAgICAgICAgICBvdXRwdXRbal0gPDw9IDI7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dFtqXSAqPSA0OwogCiAgICAgICAgICAgICAgICAgb3V0cHV0ICs9IGxvd3Bhc3Nfd2lkdGggKiAyOwogICAgICAgICAgICAgfQpAQCAtNjc0LDcgKzc2Niw3IEBACiAgICAgICAgIG91dHB1dCA9IHMtPnBsYW5lW3BsYW5lXS5zdWJiYW5kWzBdOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbG93cGFzc19oZWlnaHQgKiAyOyBpKyspIHsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsb3dwYXNzX3dpZHRoICogMjsgaisrKQotICAgICAgICAgICAgICAgIG91dHB1dFtqXSA8PD0gMjsKKyAgICAgICAgICAgICAgICBvdXRwdXRbal0gKj0gNDsKIAogICAgICAgICAgICAgb3V0cHV0ICs9IGxvd3Bhc3Nfd2lkdGggKiAyOwogICAgICAgICB9CkBAIC03MTgsNiArODEwLDggQEAKICAgICAgICAgaGlnaCA9IHMtPnBsYW5lW3BsYW5lXS5sX2hbN107CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsb3dwYXNzX2hlaWdodCAqIDI7IGkrKykgewogICAgICAgICAgICAgaG9yaXpfZmlsdGVyX2NsaXAoZHN0LCBsb3csIGhpZ2gsIGxvd3Bhc3Nfd2lkdGgsIHMtPmJwYyk7CisgICAgICAgICAgICBpZiAoYWN0X3BsYW5lID09IDMpCisgICAgICAgICAgICAgICAgcHJvY2Vzc19hbHBoYShkc3QsIGxvd3Bhc3Nfd2lkdGggKiAyKTsKICAgICAgICAgICAgIGxvdyAgKz0gbG93cGFzc193aWR0aDsKICAgICAgICAgICAgIGhpZ2ggKz0gbG93cGFzc193aWR0aDsKICAgICAgICAgICAgIGRzdCAgKz0gcGljLT5saW5lc2l6ZVthY3RfcGxhbmVdIC8gMjsKQEAgLTczMywxMSArODI3LDExIEBACiAgICAgcmV0dXJuIGF2cGt0LT5zaXplOwogfQogCi1zdGF0aWMgYXZfY29sZCBpbnQgY2ZoZF9jbG9zZV9kZWNvZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3N0YXRpYyBhdl9jb2xkIGludCBjZmhkX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBDRkhEQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKLSAgICBmcmVlX2J1ZmZlcnMoYXZjdHgpOworICAgIGZyZWVfYnVmZmVycyhzKTsKIAogICAgIGlmICghYXZjdHgtPmludGVybmFsLT5pc19jb3B5KSB7CiAgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT52bGNfOSk7CkBAIC03NDgsMTQgKzg0MiwxNCBAQAogfQogCiBBVkNvZGVjIGZmX2NmaGRfZGVjb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAiY2ZoZCIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNpbmVmb3JtIEhEIiksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NGSEQsCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENGSERDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBjZmhkX2RlY29kZV9pbml0LAotICAgIC5jbG9zZSAgICAgICAgICA9IGNmaGRfY2xvc2VfZGVjb2RlciwKLSAgICAuZGVjb2RlICAgICAgICAgPSBjZmhkX2RlY29kZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAotICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfCBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC5uYW1lICAgICAgICAgICAgID0gImNmaGQiLAorICAgIC5sb25nX25hbWUgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNpbmVmb3JtIEhEIiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9DRkhELAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKENGSERDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IGNmaGRfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGNmaGRfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBjZmhkX2RlY29kZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKKyAgICAuY2Fwc19pbnRlcm5hbCAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfCBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2ZoZC5oIGIvbGliYXZjb2RlYy9jZmhkLmgKaW5kZXggYTI2MzEyNC4uMjU3M2U3NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jZmhkLmgKKysrIGIvbGliYXZjb2RlYy9jZmhkLmgKQEAgLTI3LDEwICsyNywxMCBAQAogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAidmxjLmgiCiAKLSNkZWZpbmUgVkxDX0JJVFMgOQotI2RlZmluZSBOQl9WTENfVEFCTEVfOSAoNzErMykKLSNkZWZpbmUgTkJfVkxDX1RBQkxFXzE4ICgyNjMrMSkKKyNkZWZpbmUgVkxDX0JJVFMgICAgICAgOQorI2RlZmluZSBTVUJCQU5EX0NPVU5UIDEwCiAKIHR5cGVkZWYgc3RydWN0IENGSERfUkxfVkxDX0VMRU0gewogICAgIGludDE2X3QgbGV2ZWw7CkBAIC00Myw3ICs0Myw3IEBACiB0eXBlZGVmIHN0cnVjdCBTdWJCYW5kIHsKICAgICBpbnQgbGV2ZWw7CiAgICAgaW50IG9yaWVudGF0aW9uOwotICAgIGludCBzdHJpZGU7CisgICAgcHRyZGlmZl90IHN0cmlkZTsKICAgICBpbnQgYV93aWR0aDsKICAgICBpbnQgd2lkdGg7CiAgICAgaW50IGFfaGVpZ2h0OwpAQCAtNjIsNyArNjIsNyBAQAogICAgIGludDE2X3QgKmlkd3RfdG1wOwogCiAgICAgLyogVE9ETzogbWVyZ2UgdGhpcyBpbnRvIFN1YkJhbmQgc3RydWN0dXJlICovCi0gICAgaW50MTZfdCAqc3ViYmFuZFsxMF07CisgICAgaW50MTZfdCAqc3ViYmFuZFtTVUJCQU5EX0NPVU5UXTsKICAgICBpbnQxNl90ICpsX2hbOF07CiAKICAgICBTdWJCYW5kIGJhbmRbRFdUX0xFVkVMU11bNF07CkBAIC03OSwxNiArNzksMTYgQEAKIAogICAgIEdldEJpdENvbnRleHQgZ2I7CiAKLSAgICBpbnQgY2hyb21hX3hfc2hpZnQ7Ci0gICAgaW50IGNocm9tYV95X3NoaWZ0OwotCiAgICAgaW50IGNvZGVkX3dpZHRoOwogICAgIGludCBjb2RlZF9oZWlnaHQ7CisgICAgaW50IGNyb3BwZWRfaGVpZ2h0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBjb2RlZF9mb3JtYXQ7CiAKICAgICBpbnQgYV93aWR0aDsKICAgICBpbnQgYV9oZWlnaHQ7CisgICAgaW50IGFfZm9ybWF0OwogCi0gICAgaW50IGJwYzsKKyAgICBpbnQgYnBjOyAvLyBiaXRzIHBlciBjaGFubmVsL2NvbXBvbmVudAogICAgIGludCBjaGFubmVsX2NudDsKICAgICBpbnQgc3ViYmFuZF9jbnQ7CiAgICAgaW50IGNoYW5uZWxfbnVtOwpAQCAtMTA0LDcgKzEwNCw2IEBACiAKICAgICB1aW50OF90IHByZXNjYWxlX3NoaWZ0WzNdOwogICAgIFBsYW5lIHBsYW5lWzRdOwotCiB9IENGSERDb250ZXh0OwogCiBpbnQgZmZfY2ZoZF9pbml0X3ZsY3MoQ0ZIRENvbnRleHQgKnMpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jZmhkZGF0YS5jIGIvbGliYXZjb2RlYy9jZmhkZGF0YS5jCmluZGV4IDkzMzBkMzQuLjVkZjY4ZDQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY2ZoZGRhdGEuYworKysgYi9saWJhdmNvZGVjL2NmaGRkYXRhLmMKQEAgLTE4LDcgKzE4LDEwIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgInN0ZGludC5oIgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKwogI2luY2x1ZGUgImNmaGQuaCIKIAogLyogc29tZSBzcGVjaWFsIGNvZGV3b3Jkcywgbm90IHN1cmUgd2hhdCB0aGV5IGFsbCBtZWFuICovCkBAIC0yOSw2ICszMiwzMSBAQAogI2RlZmluZSBUQUJMRV85X0JBTkRfRU5EMyAweDM4RjBCM0VoCiAjZGVmaW5lIFRBQkxFXzlfQkFORF9FTkRfTEVOMyAyNgogCisjZGVmaW5lIE5CX1ZMQ19UQUJMRV85ICAgKDcxICsgMykKKyNkZWZpbmUgTkJfVkxDX1RBQkxFXzE4ICgyNjMgKyAxKQorCitzdGF0aWMgY29uc3QgdWludDMyX3QgdGFibGVfOV92bGNfYml0c1tOQl9WTENfVEFCTEVfOV0gPSB7CisgICAgICAgICAgICAwLCAgICAgICAweDIsICAgICAgIDB4YywgICAgICAweDFhLAorICAgICAgICAgMHgxZCwgICAgICAweDFlLCAgICAgIDB4MzksICAgICAgMHgzZSwKKyAgICAgICAgIDB4MzcsICAgICAgMHg3ZSwgICAgICAweDZjLCAgICAgIDB4ZTIsCisgICAgICAgICAweGZlLCAgICAgIDB4ZGIsICAgICAgMHhlMCwgICAgIDB4MWMzLAorICAgICAgICAweDFjNiwgICAgIDB4MWZmLCAgICAgMHgxZmUsICAgICAweDFiNSwKKyAgICAgICAgMHgzNjksICAgICAweDM4NSwgICAgIDB4NzFkLCAgICAgMHg2ZDAsCisgICAgICAgIDB4NzA4LCAgICAgMHg3MWYsICAgICAweGUzZCwgICAgIDB4ZTM5LAorICAgICAgICAweGUxMywgICAgIDB4ZTEyLCAgICAweDFjNzEsICAgIDB4MWI0NSwKKyAgICAgICAweDFiNDcsICAgIDB4MzY4OSwgICAgMHgzOGYyLCAgICAweDM4ZTEsCisgICAgICAgMHgzOGUwLCAgICAweDM4ZjEsICAgIDB4MzY4OCwgICAgMHg2ZDFiLAorICAgICAgIDB4NzFlMCwgICAgMHg2ZDE5LCAgICAweDcxZTcsICAgIDB4ZTNjZCwKKyAgICAgICAweGRhMzUsICAgIDB4ZGEzMCwgICAgMHhlM2MzLCAgIDB4MWI0NjksCisgICAgICAweDFiNDYyLCAgIDB4MWM3OTgsICAgMHgxYjQ2MywgICAweDFjNzk5LAorICAgICAgMHgzOGYwOCwgICAweDM4ZjA5LCAgIDB4MzhmMGEsICAgMHg2ZDFhMCwKKyAgICAgIDB4NmQxYTMsICAgMHg2ZDFhMSwgICAweGRhMzQ1LCAgIDB4ZGEzNDQsCisgICAgICAweGUzYzJkLCAgIDB4ZTNjMmYsICAgMHhlM2MyZSwgIDB4MzhmMGIyLAorICAgICAweDcxZTE2MCwgIDB4NzFlMTYyLCAgMHg3MWUxNjYsICAweDcxZTE2MSwKKyAgICAgMHhlM2MyY2UsICAweGUzYzJjNiwgIDB4ZTNjMmM3LCAweDFDNzg1OUUsCisgICAgMHgzOEYwQjNGLCAweDM4RjBCM0UsCit9OworCiBzdGF0aWMgY29uc3QgdWludDhfdCB0YWJsZV85X3ZsY19sZW5bTkJfVkxDX1RBQkxFXzldID0gewogICAgICAxLCAgICAyLCAgICA0LCAgICA1LCAgICA1LCAgICA1LCAgICA2LCAgICA2LAogICAgICA2LCAgICA3LCAgICA3LCAgICA4LCAgICA4LCAgICA4LCAgICA4LCAgICA5LApAQCAtNDIsMTkgKzcwLDYgQEAKICAgICAyNiwgICAyNiwKIH07CiAKLXN0YXRpYyBjb25zdCB1aW50MzJfdCB0YWJsZV85X3ZsY19iaXRzW05CX1ZMQ19UQUJMRV85XSA9IHsKLSAgICAgICAgICAgIDAsICAgICAgIDB4MiwgICAgICAgMHhjLCAgICAgIDB4MWEsICAgICAgMHgxZCwgICAgICAweDFlLCAgICAgIDB4MzksICAgICAgMHgzZSwKLSAgICAgICAgIDB4MzcsICAgICAgMHg3ZSwgICAgICAweDZjLCAgICAgIDB4ZTIsICAgICAgMHhmZSwgICAgICAweGRiLCAgICAgIDB4ZTAsICAgICAweDFjMywKLSAgICAgICAgMHgxYzYsICAgICAweDFmZiwgICAgIDB4MWZlLCAgICAgMHgxYjUsICAgICAweDM2OSwgICAgIDB4Mzg1LCAgICAgMHg3MWQsICAgICAweDZkMCwKLSAgICAgICAgMHg3MDgsICAgICAweDcxZiwgICAgIDB4ZTNkLCAgICAgMHhlMzksICAgICAweGUxMywgICAgIDB4ZTEyLCAgICAweDFjNzEsICAgIDB4MWI0NSwKLSAgICAgICAweDFiNDcsICAgIDB4MzY4OSwgICAgMHgzOGYyLCAgICAweDM4ZTEsICAgIDB4MzhlMCwgICAgMHgzOGYxLCAgICAweDM2ODgsICAgIDB4NmQxYiwKLSAgICAgICAweDcxZTAsICAgIDB4NmQxOSwgICAgMHg3MWU3LCAgICAweGUzY2QsICAgIDB4ZGEzNSwgICAgMHhkYTMwLCAgICAweGUzYzMsICAgMHgxYjQ2OSwKLSAgICAgIDB4MWI0NjIsICAgMHgxYzc5OCwgICAweDFiNDYzLCAgIDB4MWM3OTksICAgMHgzOGYwOCwgICAweDM4ZjA5LCAgIDB4MzhmMGEsICAgMHg2ZDFhMCwKLSAgICAgIDB4NmQxYTMsICAgMHg2ZDFhMSwgICAweGRhMzQ1LCAgIDB4ZGEzNDQsICAgMHhlM2MyZCwgICAweGUzYzJmLCAgIDB4ZTNjMmUsICAweDM4ZjBiMiwKLSAgICAgMHg3MWUxNjAsICAweDcxZTE2MiwgIDB4NzFlMTY2LCAgMHg3MWUxNjEsICAweGUzYzJjZSwgIDB4ZTNjMmM2LCAgMHhlM2MyYzcsIDB4MUM3ODU5RSwKLSAgICAweDM4RjBCM0YsIDB4MzhGMEIzRSwKLX07Ci0KIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0YWJsZV85X3ZsY19ydW5bTkJfVkxDX1RBQkxFXzldID0gewogICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgMTIsICAgIDEsICAgMzIsICAxNjAsCiAgICAgMSwgICAgMSwgICAgMSwgIDMyMCwgICAgMSwgICAgMSwgICA4MCwgIDEyMCwKQEAgLTgyLDM5ICs5Nyw3MiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHVpbnQzMl90IHRhYmxlXzE4X3ZsY19iaXRzW05CX1ZMQ19UQUJMRV8xOF0gPSB7Ci0gICAgICAgICAgICAwLCAgICAgICAweDIsICAgICAgIDB4NywgICAgICAweDE5LCAgICAgIDB4MzAsICAgICAgMHgzNiwgICAgICAweDZmLCAgICAgIDB4NjMsCi0gICAgICAgICAweDY5LCAgICAgIDB4NmIsICAgICAgMHhkMSwgICAgICAweGQ0LCAgICAgIDB4ZGMsICAgICAweDE4OSwgICAgIDB4MThhLCAgICAgMHgxYTAsCi0gICAgICAgIDB4MWFiLCAgICAgMHgzNzcsICAgICAweDMxMCwgICAgIDB4MzE2LCAgICAgMHgzNDMsICAgICAweDM1NCwgICAgIDB4Mzc1LCAgICAgMHg2MjMsCi0gICAgICAgIDB4Njg0LCAgICAgMHg2ODUsICAgICAweDZhYiwgICAgIDB4NmVjLCAgICAgMHhkZGIsICAgICAweGM1YywgICAgIDB4YzVlLCAgICAgMHhjNDQsCi0gICAgICAgIDB4ZDU1LCAgICAgMHhkZDEsICAgICAweGRkMywgICAgMHgxYmI1LCAgICAweDE4OGIsICAgIDB4MThiYiwgICAgMHgxOGJmLCAgICAweDFhYTgsCi0gICAgICAgMHgxYmEwLCAgICAweDFiYTUsICAgIDB4MWJhNCwgICAgMHgzMTE1LCAgICAweDMxNzUsICAgIDB4MzE3ZCwgICAgMHgzNTUzLCAgICAweDM3NjgsCi0gICAgICAgMHg2ZTg3LCAgICAweDZlZDMsICAgIDB4NjJlOCwgICAgMHg2MmY4LCAgICAweDYyMjgsICAgIDB4NmFhNCwgICAgMHg2ZTg1LCAgICAweGM0NTMsCi0gICAgICAgMHhjNWQzLCAgICAweGM1ZjMsICAgIDB4ZGRhNCwgICAgMHhkZDA4LCAgICAweGRkMGMsICAgMHgxYmI0YiwgICAweDFiYjRhLCAgIDB4MThiYTUsCi0gICAgICAweDE4YmU1LCAgIDB4MWFhOTUsICAgMHgxYWE5NywgICAweDE4OGE0LCAgIDB4MWJhMTMsICAgMHgzMTc0OCwgICAweDMxN2M4LCAgIDB4MzU1MjgsCi0gICAgICAweDM1NTJjLCAgIDB4Mzc0MjQsICAgMHgzNzQzNCwgICAweDM3NDM2LCAgIDB4NjIyOTQsICAgMHg2MmU5MiwgICAweDYyZjkyLCAgIDB4NmFhNTIsCi0gICAgICAweDZhYTVhLCAgIDB4NmU4NmEsICAgMHg2ZTg2ZSwgICAweDZlODRhLCAgIDB4YzQ1MmEsICAgMHhjNWQyNywgICAweGM1ZjI2LCAgIDB4ZDU0YTYsCi0gICAgICAweGQ1NGI2LCAgIDB4ZGQwOTYsICAgMHhkZDBkNiwgICAweGRkMGRlLCAgMHgxODhhNTYsICAweDE4YmE0ZCwgIDB4MThiZTRlLCAgMHgxOGJlNGYsCi0gICAgIDB4MWFhOTZlLCAgMHgxYmExMmUsICAweDFiYTEyZiwgIDB4MWJhMWFmLCAgMHgxYmExYmYsICAweDM3NDM1ZCwgIDB4Mzc0MzdkLCAgMHgzMTc0OTgsCi0gICAgIDB4MzU1MjljLCAgMHgzNTUyOWQsICAweDM1NTJkZSwgIDB4MzU1MmRmLCAgMHg2MmU5MzMsICAweDYyMjk1ZCwgIDB4NmFhNTNkLCAgMHg2YWE1M2YsCi0gICAgIDB4NmFhNTNlLCAgMHg2ZTg2YjksICAweDZlODZmOCwgIDB4ZDU0YTc5LCAgMHhjNWQyNjUsICAweGM0NTJiOCwgIDB4ZGQwZDcxLCAgMHhkNTRhNzgsCi0gICAgIDB4ZGQwZDcwLCAgMHhkZDBkZjIsICAweGRkMGRmMywgMHgxODhhNWY2LCAweDE4OGE1ZjUsIDB4MTg4YTVmNCwgMHgxODhhNWYzLCAweDE4OGE1ZjIsCi0gICAgMHgxODhhNWYxLCAweDE4OGE1ZjAsIDB4MTg4YTVlZiwgMHgxODhhNWVlLCAweDE4OGE1ZWQsIDB4MTg4YTVhYSwgMHgxODhhNWUzLCAweDE4OGE1ZGYsCi0gICAgMHgxODhhNTg5LCAweDE4OGE1ZGQsIDB4MTg4YTU3OCwgMHgxODhhNWUwLCAweDE4OGE1ODgsIDB4MTg4YTVkNiwgMHgxODhhNWRiLCAweDE4OGE1ZTEsCi0gICAgMHgxODhhNTg3LCAweDE4OGE1OWEsIDB4MTg4YTVjNCwgMHgxODhhNWVjLCAweDE4OGE1ODYsIDB4MTg4YTU3MywgMHgxODhhNTljLCAweDE4OGE1YzgsCi0gICAgMHgxODhhNWZiLCAweDE4OGE1YTEsIDB4MTg4YTVlYiwgMHgxODhhNWE4LCAweDE4OGE1ODQsIDB4MTg4YTVkMiwgMHgxODhhNTk5LCAweDE4OGE1OTgsCi0gICAgMHgxODhhNTgzLCAweDE4YmE0YzksIDB4MTg4YTVkMCwgMHgxODhhNTk0LCAweDE4OGE1ODIsIDB4MTg4YTVjYiwgMHgxODhhNWQ4LCAweDE4OGE1ZTcsCi0gICAgMHgxODhhNTgxLCAweDE4OGE1ZWEsIDB4MTg4YTVhOSwgMHgxODhhNWE2LCAweDE4OGE1ODAsIDB4MTg4YTVhMCwgMHgxODhhNTlkLCAweDE4OGE1YzMsCi0gICAgMHgxODhhNTdmLCAweDE4OGE1YzAsIDB4MTg4YTVkZSwgMHgxODhhNWQ0LCAweDE4OGE1N2UsIDB4MTg4YTVjMiwgMHgxODhhNTkyLCAweDE4OGE1Y2QsCi0gICAgMHgxODhhNTdkLCAweDE4OGE1YTMsIDB4MTg4YTVlOCwgMHgxODhhNWEyLCAweDE4OGE1N2MsIDB4MTg4YTU4ZSwgMHgxODhhNWIzLCAweDE4OGE1YjIsCi0gICAgMHgxODhhNWIxLCAweDE4OGE1YjAsIDB4MTg4YTVhZiwgMHgxODhhNWFlLCAweDE4OGE1YWQsIDB4MTg4YTVhYywgMHgxODhhNWFiLCAweDE4OGE1ZGEsCi0gICAgMHgxODhhNWU0LCAweDE4OGE1ZTUsIDB4MTg4YTVkOSwgMHgxODhhNWI1LCAweDE4OGE1YmMsIDB4MTg4YTViZCwgMHgxODhhNWU5LCAweDE4OGE1Y2MsCi0gICAgMHgxODhhNTg1LCAweDE4OGE1ZDMsIDB4MTg4YTVlMiwgMHgxODhhNTk1LCAweDE4OGE1OTYsIDB4MTg4YTViOCwgMHgxODhhNTkwLCAweDE4OGE1YzksCi0gICAgMHgxODhhNWE0LCAweDE4OGE1ZTYsIDB4MTg4YTVhNSwgMHgxODhhNWNlLCAweDE4OGE1YmYsIDB4MTg4YTU3MiwgMHgxODhhNTliLCAweDE4OGE1YmUsCi0gICAgMHgxODhhNWM3LCAweDE4OGE1Y2EsIDB4MTg4YTVkNSwgMHgxODhhNTdiLCAweDE4OGE1OGQsIDB4MTg4YTU4YywgMHgxODhhNThiLCAweDE4OGE1OGEsCi0gICAgMHgxOGJhNGM4LCAweDE4OGE1YzUsIDB4MTg4YTVmYSwgMHgxODhhNWJiLCAweDE4OGE1YzEsIDB4MTg4YTVjZiwgMHgxODhhNWI5LCAweDE4OGE1YjYsCi0gICAgMHgxODhhNTk3LCAweDE4OGE1ZmUsIDB4MTg4YTVkNywgMHgxODhhNWJhLCAweDE4OGE1OTEsIDB4MTg4YTVjNiwgMHgxODhhNWRjLCAweDE4OGE1N2EsCi0gICAgMHgxODhhNTlmLCAweDE4OGE1ZjksIDB4MTg4YTViNCwgMHgxODhhNWE3LCAweDE4OGE1OGYsIDB4MTg4YTVmZCwgMHgxODhhNWI3LCAweDE4OGE1OTMsCi0gICAgMHgxODhhNTllLCAweDE4OGE1ZjgsIDB4MTg4YTVmZiwgMHgxODhhNWZjLCAweDE4OGE1NzksIDB4MTg4YTVmNywgMHgzMTE0YmEyLCAweDMxMTRiYTMsCisgICAgICAgICAgICAwLCAgICAgICAweDIsICAgICAgIDB4NywgICAgICAweDE5LAorICAgICAgICAgMHgzMCwgICAgICAweDM2LCAgICAgIDB4NmYsICAgICAgMHg2MywKKyAgICAgICAgIDB4NjksICAgICAgMHg2YiwgICAgICAweGQxLCAgICAgIDB4ZDQsCisgICAgICAgICAweGRjLCAgICAgMHgxODksICAgICAweDE4YSwgICAgIDB4MWEwLAorICAgICAgICAweDFhYiwgICAgIDB4Mzc3LCAgICAgMHgzMTAsICAgICAweDMxNiwKKyAgICAgICAgMHgzNDMsICAgICAweDM1NCwgICAgIDB4Mzc1LCAgICAgMHg2MjMsCisgICAgICAgIDB4Njg0LCAgICAgMHg2ODUsICAgICAweDZhYiwgICAgIDB4NmVjLAorICAgICAgICAweGRkYiwgICAgIDB4YzVjLCAgICAgMHhjNWUsICAgICAweGM0NCwKKyAgICAgICAgMHhkNTUsICAgICAweGRkMSwgICAgIDB4ZGQzLCAgICAweDFiYjUsCisgICAgICAgMHgxODhiLCAgICAweDE4YmIsICAgIDB4MThiZiwgICAgMHgxYWE4LAorICAgICAgIDB4MWJhMCwgICAgMHgxYmE1LCAgICAweDFiYTQsICAgIDB4MzExNSwKKyAgICAgICAweDMxNzUsICAgIDB4MzE3ZCwgICAgMHgzNTUzLCAgICAweDM3NjgsCisgICAgICAgMHg2ZTg3LCAgICAweDZlZDMsICAgIDB4NjJlOCwgICAgMHg2MmY4LAorICAgICAgIDB4NjIyOCwgICAgMHg2YWE0LCAgICAweDZlODUsICAgIDB4YzQ1MywKKyAgICAgICAweGM1ZDMsICAgIDB4YzVmMywgICAgMHhkZGE0LCAgICAweGRkMDgsCisgICAgICAgMHhkZDBjLCAgIDB4MWJiNGIsICAgMHgxYmI0YSwgICAweDE4YmE1LAorICAgICAgMHgxOGJlNSwgICAweDFhYTk1LCAgIDB4MWFhOTcsICAgMHgxODhhNCwKKyAgICAgIDB4MWJhMTMsICAgMHgzMTc0OCwgICAweDMxN2M4LCAgIDB4MzU1MjgsCisgICAgICAweDM1NTJjLCAgIDB4Mzc0MjQsICAgMHgzNzQzNCwgICAweDM3NDM2LAorICAgICAgMHg2MjI5NCwgICAweDYyZTkyLCAgIDB4NjJmOTIsICAgMHg2YWE1MiwKKyAgICAgIDB4NmFhNWEsICAgMHg2ZTg2YSwgICAweDZlODZlLCAgIDB4NmU4NGEsCisgICAgICAweGM0NTJhLCAgIDB4YzVkMjcsICAgMHhjNWYyNiwgICAweGQ1NGE2LAorICAgICAgMHhkNTRiNiwgICAweGRkMDk2LCAgIDB4ZGQwZDYsICAgMHhkZDBkZSwKKyAgICAgMHgxODhhNTYsICAweDE4YmE0ZCwgIDB4MThiZTRlLCAgMHgxOGJlNGYsCisgICAgIDB4MWFhOTZlLCAgMHgxYmExMmUsICAweDFiYTEyZiwgIDB4MWJhMWFmLAorICAgICAweDFiYTFiZiwgIDB4Mzc0MzVkLCAgMHgzNzQzN2QsICAweDMxNzQ5OCwKKyAgICAgMHgzNTUyOWMsICAweDM1NTI5ZCwgIDB4MzU1MmRlLCAgMHgzNTUyZGYsCisgICAgIDB4NjJlOTMzLCAgMHg2MjI5NWQsICAweDZhYTUzZCwgIDB4NmFhNTNmLAorICAgICAweDZhYTUzZSwgIDB4NmU4NmI5LCAgMHg2ZTg2ZjgsICAweGQ1NGE3OSwKKyAgICAgMHhjNWQyNjUsICAweGM0NTJiOCwgIDB4ZGQwZDcxLCAgMHhkNTRhNzgsCisgICAgIDB4ZGQwZDcwLCAgMHhkZDBkZjIsICAweGRkMGRmMywgMHgxODhhNWY2LAorICAgIDB4MTg4YTVmNSwgMHgxODhhNWY0LCAweDE4OGE1ZjMsIDB4MTg4YTVmMiwKKyAgICAweDE4OGE1ZjEsIDB4MTg4YTVmMCwgMHgxODhhNWVmLCAweDE4OGE1ZWUsCisgICAgMHgxODhhNWVkLCAweDE4OGE1YWEsIDB4MTg4YTVlMywgMHgxODhhNWRmLAorICAgIDB4MTg4YTU4OSwgMHgxODhhNWRkLCAweDE4OGE1NzgsIDB4MTg4YTVlMCwKKyAgICAweDE4OGE1ODgsIDB4MTg4YTVkNiwgMHgxODhhNWRiLCAweDE4OGE1ZTEsCisgICAgMHgxODhhNTg3LCAweDE4OGE1OWEsIDB4MTg4YTVjNCwgMHgxODhhNWVjLAorICAgIDB4MTg4YTU4NiwgMHgxODhhNTczLCAweDE4OGE1OWMsIDB4MTg4YTVjOCwKKyAgICAweDE4OGE1ZmIsIDB4MTg4YTVhMSwgMHgxODhhNWViLCAweDE4OGE1YTgsCisgICAgMHgxODhhNTg0LCAweDE4OGE1ZDIsIDB4MTg4YTU5OSwgMHgxODhhNTk4LAorICAgIDB4MTg4YTU4MywgMHgxOGJhNGM5LCAweDE4OGE1ZDAsIDB4MTg4YTU5NCwKKyAgICAweDE4OGE1ODIsIDB4MTg4YTVjYiwgMHgxODhhNWQ4LCAweDE4OGE1ZTcsCisgICAgMHgxODhhNTgxLCAweDE4OGE1ZWEsIDB4MTg4YTVhOSwgMHgxODhhNWE2LAorICAgIDB4MTg4YTU4MCwgMHgxODhhNWEwLCAweDE4OGE1OWQsIDB4MTg4YTVjMywKKyAgICAweDE4OGE1N2YsIDB4MTg4YTVjMCwgMHgxODhhNWRlLCAweDE4OGE1ZDQsCisgICAgMHgxODhhNTdlLCAweDE4OGE1YzIsIDB4MTg4YTU5MiwgMHgxODhhNWNkLAorICAgIDB4MTg4YTU3ZCwgMHgxODhhNWEzLCAweDE4OGE1ZTgsIDB4MTg4YTVhMiwKKyAgICAweDE4OGE1N2MsIDB4MTg4YTU4ZSwgMHgxODhhNWIzLCAweDE4OGE1YjIsCisgICAgMHgxODhhNWIxLCAweDE4OGE1YjAsIDB4MTg4YTVhZiwgMHgxODhhNWFlLAorICAgIDB4MTg4YTVhZCwgMHgxODhhNWFjLCAweDE4OGE1YWIsIDB4MTg4YTVkYSwKKyAgICAweDE4OGE1ZTQsIDB4MTg4YTVlNSwgMHgxODhhNWQ5LCAweDE4OGE1YjUsCisgICAgMHgxODhhNWJjLCAweDE4OGE1YmQsIDB4MTg4YTVlOSwgMHgxODhhNWNjLAorICAgIDB4MTg4YTU4NSwgMHgxODhhNWQzLCAweDE4OGE1ZTIsIDB4MTg4YTU5NSwKKyAgICAweDE4OGE1OTYsIDB4MTg4YTViOCwgMHgxODhhNTkwLCAweDE4OGE1YzksCisgICAgMHgxODhhNWE0LCAweDE4OGE1ZTYsIDB4MTg4YTVhNSwgMHgxODhhNWNlLAorICAgIDB4MTg4YTViZiwgMHgxODhhNTcyLCAweDE4OGE1OWIsIDB4MTg4YTViZSwKKyAgICAweDE4OGE1YzcsIDB4MTg4YTVjYSwgMHgxODhhNWQ1LCAweDE4OGE1N2IsCisgICAgMHgxODhhNThkLCAweDE4OGE1OGMsIDB4MTg4YTU4YiwgMHgxODhhNThhLAorICAgIDB4MThiYTRjOCwgMHgxODhhNWM1LCAweDE4OGE1ZmEsIDB4MTg4YTViYiwKKyAgICAweDE4OGE1YzEsIDB4MTg4YTVjZiwgMHgxODhhNWI5LCAweDE4OGE1YjYsCisgICAgMHgxODhhNTk3LCAweDE4OGE1ZmUsIDB4MTg4YTVkNywgMHgxODhhNWJhLAorICAgIDB4MTg4YTU5MSwgMHgxODhhNWM2LCAweDE4OGE1ZGMsIDB4MTg4YTU3YSwKKyAgICAweDE4OGE1OWYsIDB4MTg4YTVmOSwgMHgxODhhNWI0LCAweDE4OGE1YTcsCisgICAgMHgxODhhNThmLCAweDE4OGE1ZmQsIDB4MTg4YTViNywgMHgxODhhNTkzLAorICAgIDB4MTg4YTU5ZSwgMHgxODhhNWY4LCAweDE4OGE1ZmYsIDB4MTg4YTVmYywKKyAgICAweDE4OGE1NzksIDB4MTg4YTVmNywgMHgzMTE0YmEyLCAweDMxMTRiYTMsCiB9OwogCiBzdGF0aWMgY29uc3QgdWludDhfdCB0YWJsZV8xOF92bGNfbGVuW05CX1ZMQ19UQUJMRV8xOF0gPSB7CkBAIC0xNTQsMzkgKzIwMiwzOSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHVpbnQxNl90IHRhYmxlXzE4X3ZsY19ydW5bTkJfVkxDX1RBQkxFXzE4XSA9IHsKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgMTIsICAgIDEsICAgMjAsICAgIDEsICAgIDEsICAgIDEsICAgMzIsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICA2MCwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgMTAwLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAxODAsICAgIDEsCi0gICAgMSwgIDMyMCwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKLSAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAotICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCi0gICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMiwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAxMiwgICAgMSwgICAyMCwgICAgMSwgICAgMSwgICAgMSwgICAzMiwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICA2MCwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgIDEwMCwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgIDE4MCwgICAgMSwKKyAgICAgMSwgIDMyMCwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMiwKIH07CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlXzE4X3ZsY19sZXZlbFtOQl9WTENfVEFCTEVfMThdID0gewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jaG9tcF9ic2YuYyBiL2xpYmF2Y29kZWMvY2hvbXBfYnNmLmMKaW5kZXggMmI5M2ZhOS4uM2JhNDVmMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jaG9tcF9ic2YuYworKysgYi9saWJhdmNvZGVjL2Nob21wX2JzZi5jCkBAIC0yMCwxOSArMjAsMTkgQEAKICAqLwogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzZi5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLXN0YXRpYyBpbnQgY2hvbXBfZmlsdGVyKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywKLSAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCAgICAgIGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleWZyYW1lKQorc3RhdGljIGludCBjaG9tcF9maWx0ZXIoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgd2hpbGUgKGJ1Zl9zaXplID4gMCAmJiAhYnVmW2J1Zl9zaXplLTFdKQotICAgICAgICBidWZfc2l6ZS0tOworICAgIGludCByZXQ7CiAKLSAgICAqcG91dGJ1ZiA9ICh1aW50OF90KikgYnVmOwotICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICByZXQgPSBmZl9ic2ZfZ2V0X3BhY2tldF9yZWYoY3R4LCBwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgd2hpbGUgKHBrdC0+c2l6ZSA+IDAgJiYgIXBrdC0+ZGF0YVtwa3QtPnNpemUgLSAxXSkKKyAgICAgICAgcGt0LT5zaXplLS07CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTQwLDcgKzQwLDcgQEAKIC8qKgogICogVGhpcyBmaWx0ZXIgcmVtb3ZlcyBhIHN0cmluZyBvZiBOVUxMIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiBhIHBhY2tldC4KICAqLwotQVZCaXRTdHJlYW1GaWx0ZXIgZmZfY2hvbXBfYnNmID0geworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfY2hvbXBfYnNmID0gewogICAgIC5uYW1lICAgPSAiY2hvbXAiLAogICAgIC5maWx0ZXIgPSBjaG9tcF9maWx0ZXIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jaW5lcGFrLmMgYi9saWJhdmNvZGVjL2NpbmVwYWsuYwppbmRleCBmMWE0NjU2Li45YjAwNzc0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2NpbmVwYWsuYworKysgYi9saWJhdmNvZGVjL2NpbmVwYWsuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDaW5lcGFrIFZpZGVvIERlY29kZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMTU1LDggKzE1NSw4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0vKiB0byBnZXQgdGhlIGNvcnJlY3QgcGljdHVyZSBmb3Igbm90LW11bHRpcGxlLW9mLTQgY2FzZXMgbGV0IHVzIGZpbGwKLSAqIGVhY2ggYmxvY2sgZnJvbSB0aGUgYm90dG9tIHVwLCB0aHVzIHBvc3NpYmx5IG92ZXJ3cml0aW5nIHRoZSB0b3AgbGluZQorLyogdG8gZ2V0IHRoZSBjb3JyZWN0IHBpY3R1cmUgZm9yIG5vdC1tdWx0aXBsZS1vZi00IGNhc2VzIGxldCB1cyBmaWxsIGVhY2gKKyAqIGJsb2NrIGZyb20gdGhlIGJvdHRvbSB1cCwgdGh1cyBwb3NzaWJseSBvdmVyd3JpdGluZyB0aGUgYm90dG9tbW9zdCBsaW5lCiAgKiBtb3JlIHRoYW4gb25jZSBidXQgZW5kaW5nIHdpdGggdGhlIGNvcnJlY3QgZGF0YSBpbiBwbGFjZQogICogKGluc3RlYWQgb2YgaW4tbG9vcCBjaGVja2luZykgKi8KIApAQCAtMzE1LDE3ICszMTUsMTEgQEAKICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIH0KIAotc3RhdGljIGludCBjaW5lcGFrX2RlY29kZSAoQ2luZXBha0NvbnRleHQgKnMpCitzdGF0aWMgaW50IGNpbmVwYWtfcHJlZGVjb2RlX2NoZWNrIChDaW5lcGFrQ29udGV4dCAqcykKIHsKLSAgICBjb25zdCB1aW50OF90ICAqZW9kID0gKHMtPmRhdGEgKyBzLT5zaXplKTsKLSAgICBpbnQgICAgICAgICAgIGksIHJlc3VsdCwgc3RyaXBfc2l6ZSwgZnJhbWVfZmxhZ3MsIG51bV9zdHJpcHM7Ci0gICAgaW50ICAgICAgICAgICB5MCA9IDA7CisgICAgaW50ICAgICAgICAgICBudW1fc3RyaXBzOwogICAgIGludCAgICAgICAgICAgZW5jb2RlZF9idWZfc2l6ZTsKIAotICAgIGlmIChzLT5zaXplIDwgMTApCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotCi0gICAgZnJhbWVfZmxhZ3MgPSBzLT5kYXRhWzBdOwogICAgIG51bV9zdHJpcHMgID0gQVZfUkIxNiAoJnMtPmRhdGFbOF0pOwogICAgIGVuY29kZWRfYnVmX3NpemUgPSBBVl9SQjI0KCZzLT5kYXRhWzFdKTsKIApAQCAtMzU2LDYgKzM1MCwyMSBAQAogICAgICAgICAgICAgcy0+c2VnYV9maWxtX3NraXBfYnl0ZXMgPSAwOwogICAgIH0KIAorICAgIGlmIChzLT5zaXplIDwgMTAgKyBzLT5zZWdhX2ZpbG1fc2tpcF9ieXRlcyArIG51bV9zdHJpcHMgKiAxMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaW5lcGFrX2RlY29kZSAoQ2luZXBha0NvbnRleHQgKnMpCit7CisgICAgY29uc3QgdWludDhfdCAgKmVvZCA9IChzLT5kYXRhICsgcy0+c2l6ZSk7CisgICAgaW50ICAgICAgICAgICBpLCByZXN1bHQsIHN0cmlwX3NpemUsIGZyYW1lX2ZsYWdzLCBudW1fc3RyaXBzOworICAgIGludCAgICAgICAgICAgeTAgPSAwOworCisgICAgZnJhbWVfZmxhZ3MgPSBzLT5kYXRhWzBdOworICAgIG51bV9zdHJpcHMgID0gQVZfUkIxNiAoJnMtPmRhdGFbOF0pOworCiAgICAgcy0+ZGF0YSArPSAxMCArIHMtPnNlZ2FfZmlsbV9za2lwX2J5dGVzOwogCiAgICAgbnVtX3N0cmlwcyA9IEZGTUlOKG51bV9zdHJpcHMsIE1BWF9TVFJJUFMpOwpAQCAtNDM1LDE4ICs0NDQsMzYgQEAKICAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKICAgICBpbnQgcmV0ID0gMCwgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKICAgICBDaW5lcGFrQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IG51bV9zdHJpcHM7CiAKICAgICBzLT5kYXRhID0gYnVmOwogICAgIHMtPnNpemUgPSBidWZfc2l6ZTsKIAorICAgIGlmIChzLT5zaXplIDwgMTApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgbnVtX3N0cmlwcyA9IEFWX1JCMTYgKCZzLT5kYXRhWzhdKTsKKworICAgIC8vRW1wdHkgZnJhbWUsIGRvIG5vdCB3YXN0ZSB0aW1lCisgICAgaWYgKCFudW1fc3RyaXBzICYmICghcy0+cGFsZXR0ZV92aWRlbyB8fCAhYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpKSkKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworCisgICAgaWYgKChyZXQgPSBjaW5lcGFrX3ByZWRlY29kZV9jaGVjayhzKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2luZXBha19wcmVkZWNvZGVfY2hlY2sgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKICAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBpZiAocy0+cGFsZXR0ZV92aWRlbykgewotICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7Ci0gICAgICAgIGlmIChwYWwpIHsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhbCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCAmc2l6ZSk7CisgICAgICAgIGlmIChwYWwgJiYgc2l6ZSA9PSBBVlBBTEVUVEVfU0laRSkgewogICAgICAgICAgICAgcy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOwogICAgICAgICAgICAgbWVtY3B5KHMtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIH0gZWxzZSBpZiAocGFsKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhbGV0dGUgc2l6ZSAlZCBpcyB3cm9uZ1xuIiwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2luZXBha2VuYy5jIGIvbGliYXZjb2RlYy9jaW5lcGFrZW5jLmMKaW5kZXggMDZiMDZkYS4uOTM5MTdmYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jaW5lcGFrZW5jLmMKKysrIGIvbGliYXZjb2RlYy9jaW5lcGFrZW5jLmMKQEAgLTEsOTggKzEsNjYgQEAKIC8qCi0gKiBDaW5lcGFrIGVuY29kZXIgKGMpIDIwMTEgVG9tYXMgSORyZGluCisgKiBDaW5lcGFrIGVuY29kZXIgKGMpIDIwMTEgVG9tYXMgSMOkcmRpbgogICogaHR0cDovL3RpdGFuLmNvZGVtaWxsLnNlL350b21oYXIvY2luZXBha2VuYy5wYXRjaAogICoKICAqIEZpeGVzIGFuZCBpbXByb3ZlbWVudHMsIHZpbnRhZ2UgZGVjb2RlcnMgY29tcGF0aWJpbGl0eQogICogIChjKSAyMDEzLCAyMDE0IFJsLCBBZXRleSBHbG9iYWwgVGVjaG5vbG9naWVzIEFCCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCiAKLVBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCi1jb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi1hbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLVNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLVRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi1pbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLQotVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLUlNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLVRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCi1PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKLUFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgotT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotCisvKgogICogVE9ETzoKLSAqIC0gb3B0aW1pemU6IGNvbG9yIHNwYWNlIGNvbnZlcnNpb24sIC4uLgotICogLSBpbXBsZW1lbnQgb3B0aW9ucyB0byBzZXQgdGhlIG1pbi9tYXggbnVtYmVyIG9mIHN0cmlwcz8KKyAqIC0gb3B0aW1pemU6IGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gKG1vdmUgY29udmVyc2lvbiB0byBsaWJzd3NjYWxlKSwgLi4uCiAgKiBNQVlCRToKICAqIC0gIm9wdGltYWxseSIgc3BsaXQgdGhlIGZyYW1lIGludG8gc2V2ZXJhbCBub24tcmVndWxhciBhcmVhcwogICogICB1c2luZyBhIHNlcGFyYXRlIGNvZGVib29rIHBhaXIgZm9yIGVhY2ggYXJlYSBhbmQgYXBwcm94aW1hdGluZwogICogICB0aGUgYXJlYSBieSBzZXZlcmFsIHJlY3Rhbmd1bGFyIHN0cmlwcyAoZ2VuZXJhbGx5IG5vdCBmdWxsIHdpZHRoIG9uZXMpCiAgKiAgICh1c2UgcXVhZHRyZWUgc3BsaXR0aW5nPyBhIHNpbXBsZSBmaXhlZC1ncmFudWxhcml0eSBncmlkPykKLSAqCi0gKgotICogdmVyc2lvbiAyMDE0LTAxLTIzIFJsCi0gKiAtIGFkZGVkIG9wdGlvbiBoYW5kbGluZyBmb3IgZmxleGliaWxpdHkKLSAqCi0gKiB2ZXJzaW9uIDIwMTQtMDEtMjEgUmwKLSAqIC0gYmVsaWV2ZSBpdCBvciBub3QsIG5vdyB3ZSBnZXQgZXZlbiBzbWFsbGVyIGZpbGVzLCB3aXRoIGJldHRlciBxdWFsaXR5Ci0gKiAgICh3aGljaCBtZWFucyBJIG1pc3NlZCBhbiBvcHRpbWl6YXRpb24gZWFybGllciA6KQotICoKLSAqIHZlcnNpb24gMjAxNC0wMS0yMCBSbAotICogLSBtYWRlIHRoZSBlbmNvZGVyIGNvbXBhdGlibGUgd2l0aCB2aW50YWdlIGRlY29kZXJzCi0gKiAgIGFuZCBhZGRlZCBzb21lIHlldCB1bnVzZWQgY29kZSBmb3IgcG9zc2libGUgZnV0dXJlCi0gKiAgIGluY3JlbWVudGFsIGNvZGVib29rIHVwZGF0ZXMKLSAqIC0gZml4ZWQgYSBzbWFsbCBtZW1vcnkgbGVhawotICoKLSAqIHZlcnNpb24gMjAxMy0wNC0yOCBSbAotICogLSBidWdmaXhlZCBjb2RlYm9vayBvcHRpbWl6YXRpb24gbG9naWMKLSAqCi0gKiB2ZXJzaW9uIDIwMTMtMDItMTQgUmwKLSAqICJWYWxlbnRpbmUncyBEYXkiIHZlcnNpb246Ci0gKiAtIG1hZGUgc3RyaXAgZGl2aXNpb24gbW9yZSByb2J1c3QKLSAqIC0gbWluaW1pemVkIGJydXRlZm9yY2luZyB0aGUgbnVtYmVyIG9mIHN0cmlwcywKLSAqICAgKGNvc3RzIHNvbWUgUi9EIGJ1dCBzcGVlZHMgdXAgY29tcGVzc2lvbiBhIGxvdCksIHRoZSBoZXVyaXN0aWMKLSAqICAgYXNzdW1wdGlvbiBpcyB0aGF0IHNjb3JlIGFzIGEgZnVuY3Rpb24gb2YgdGhlIG51bWJlciBvZiBzdHJpcHMgaGFzCi0gKiAgIG9uZSB3aWRlIG1pbmltdW0gd2hpY2ggbW92ZXMgc2xvd2x5LCBvZiBjb3Vyc2Ugbm90IGZ1bGx5IHRydWUKLSAqIC0gc2ltcGxpZmllZCBjb2RlYm9vayBnZW5lcmF0aW9uLAotICogICB0aGUgb2xkIGNvZGUgd2FzIG1lYW50IGZvciBvdGhlciBvcHRpbWl6YXRpb25zIHRoYW4gd2UgYWN0dWFsbHkgZG8KLSAqIC0gb3B0aW1pemVkIHRoZSBjb2RlYm9vayBnZW5lcmF0aW9uIC8gZXJyb3IgZXN0aW1hdGlvbiBmb3IgTU9ERV9NQwotICoKLSAqIHZlcnNpb24gMjAxMy0wMi0xMiBSbAotICogLSBzZXBhcmF0ZWQgY29kZWJvb2sgdHJhaW5pbmcgc2V0cywgYXZvaWRlZCB0aGUgdHJhbnNmZXIgb2Ygd2FzdGVkIGJ5dGVzLAotICogICB3aGljaCB5aWVsZHMgYm90aCBiZXR0ZXIgcXVhbGl0eSBhbmQgc21hbGxlciBmaWxlcwotICogLSBub3cgdXNpbmcgdGhlIGNvcnJlY3QgY29sb3JzcGFjZSAoVE9ETzogbW92ZSBjb252ZXJzaW9uIHRvIGxpYnN3c2NhbGUpCi0gKgotICogdmVyc2lvbiAyMDEzLTAyLTA4IFJsCi0gKiAtIGZpeGVzL29wdGltaXphdGlvbiBpbiBtdWx0aXN0cmlwIGVuY29kaW5nIGFuZCBjb2RlYm9vayBzaXplIGNob2ljZSwKLSAqICAgcXVhbGl0eS9iaXRyYXRlIGlzIG5vdyBiZXR0ZXIgdGhhbiB0aGF0IG9mIHRoZSBiaW5hcnkgcHJvcHJpZXRhcnkgZW5jb2RlcgogICovCiAKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKLSNpbmNsdWRlICJlbGJnLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKIAorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJlbGJnLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwogI2RlZmluZSBDVklEX0hFQURFUl9TSVpFIDEwCiAjZGVmaW5lIFNUUklQX0hFQURFUl9TSVpFIDEyCiAjZGVmaW5lIENIVU5LX0hFQURFUl9TSVpFIDQKIAogI2RlZmluZSBNQl9TSVpFIDQgICAgICAgICAgIC8vNHg0IE1CcwotI2RlZmluZSBNQl9BUkVBIChNQl9TSVpFKk1CX1NJWkUpCisjZGVmaW5lIE1CX0FSRUEgKE1CX1NJWkUgKiBNQl9TSVpFKQogCi0jZGVmaW5lIFZFQ1RPUl9NQVggNiAgICAgICAgLy9zaXggb3IgZm91ciBlbnRyaWVzIHBlciB2ZWN0b3IgZGVwZW5kaW5nIG9uIGZvcm1hdAotI2RlZmluZSBDT0RFQk9PS19NQVggMjU2ICAgIC8vc2l6ZSBvZiBhIGNvZGVib29rCisjZGVmaW5lIFZFQ1RPUl9NQVggICAgIDYgICAgLy8gc2l4IG9yIGZvdXIgZW50cmllcyBwZXIgdmVjdG9yIGRlcGVuZGluZyBvbiBmb3JtYXQKKyNkZWZpbmUgQ09ERUJPT0tfTUFYIDI1NiAgICAvLyBzaXplIG9mIGEgY29kZWJvb2sKIAotI2RlZmluZSBNQVhfU1RSSVBTICAzMiAgICAgIC8vTm90ZTogaGF2aW5nIGZld2VyIGNob2ljZXMgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2Ygc3RyaXBzIHNwZWVkcyB1cCBlbmNvZGluZyAob2J2aW91c2x5KQotI2RlZmluZSBNSU5fU1RSSVBTICAxICAgICAgIC8vTm90ZTogaGF2aW5nIG1vcmUgc3RyaXBzIHNwZWVkcyB1cCBlbmNvZGluZyB0aGUgZnJhbWUgKHRoaXMgaXMgbGVzcyBvYnZpb3VzKQorI2RlZmluZSBNQVhfU1RSSVBTICAzMiAgICAgIC8vIE5vdGU6IGhhdmluZyBmZXdlciBjaG9pY2VzIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIHN0cmlwcyBzcGVlZHMgdXAgZW5jb2RpbmcgKG9idmlvdXNseSkKKyNkZWZpbmUgTUlOX1NUUklQUyAgIDEgICAgICAvLyBOb3RlOiBoYXZpbmcgbW9yZSBzdHJpcHMgc3BlZWRzIHVwIGVuY29kaW5nIHRoZSBmcmFtZSAodGhpcyBpcyBsZXNzIG9idmlvdXMpCiAvLyBNQVhfU1RSSVBTIGxpbWl0cyB0aGUgbWF4aW11bSBxdWFsaXR5IHlvdSBjYW4gcmVhY2gKLS8vICAgICAgICAgICAgd2hlbiB5b3Ugd2FudCBoaWdodCBxdWFsaXR5IG9uIGhpZ2ggcmVzb2x1dGlvbnMsCisvLyAgICAgICAgICAgIHdoZW4geW91IHdhbnQgaGlnaCBxdWFsaXR5IG9uIGhpZ2ggcmVzb2x1dGlvbnMsCiAvLyBNSU5fU1RSSVBTIGxpbWl0cyB0aGUgbWluaW11bSBlZmZpY2llbnRseSBlbmNvZGFibGUgYml0IHJhdGUKIC8vICAgICAgICAgICAgb24gbG93IHJlc29sdXRpb25zCiAvLyB0aGUgbnVtYmVycyBhcmUgb25seSB1c2VkIGZvciBicnV0ZSBmb3JjZSBvcHRpbWl6YXRpb24gZm9yIHRoZSBmaXJzdCBmcmFtZSwKQEAgLTEwMCw3ICs2OCw3IEBACiAvLyBOT1RFIHRoZSBkZWNvZGVyIGluIGZmbXBlZyBoYXMgaXRzIG93biBhcmJpdHJhcnkgbGltaXRhdGlvbiBvbiB0aGUgbnVtYmVyCiAvLyBvZiBzdHJpcHMsIGN1cnJlbnRseSAzMgogCi10eXBlZGVmIGVudW0gewordHlwZWRlZiBlbnVtIENpbmVwYWtNb2RlIHsKICAgICBNT0RFX1YxX09OTFkgPSAwLAogICAgIE1PREVfVjFfVjQsCiAgICAgTU9ERV9NQywKQEAgLTEwOCw3ICs3Niw3IEBACiAgICAgTU9ERV9DT1VOVCwKIH0gQ2luZXBha01vZGU7CiAKLXR5cGVkZWYgZW51bSB7Cit0eXBlZGVmIGVudW0gbWJfZW5jb2RpbmcgewogICAgIEVOQ19WMSwKICAgICBFTkNfVjQsCiAgICAgRU5DX1NLSVAsCkBAIC0xMTYsMjQgKzg0LDI0IEBACiAgICAgRU5DX1VOQ0VSVEFJTgogfSBtYl9lbmNvZGluZzsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCB2MV92ZWN0b3I7ICAgICAgICAgICAgICAgICAgLy9pbmRleCBpbnRvIHYxIGNvZGVib29rCi0gICAgaW50IHYxX2Vycm9yOyAgICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gdXNpbmcgVjEgZW5jb2RpbmcKLSAgICBpbnQgdjRfdmVjdG9yWzRdOyAgICAgICAgICAgICAgIC8vaW5kaWNlcyBpbnRvIHY0IGNvZGVib29rcwotICAgIGludCB2NF9lcnJvcjsgICAgICAgICAgICAgICAgICAgLy9lcnJvciB3aGVuIHVzaW5nIFY0IGVuY29kaW5nCi0gICAgaW50IHNraXBfZXJyb3I7ICAgICAgICAgICAgICAgICAvL2Vycm9yIHdoZW4gYmxvY2sgaXMgc2tpcHBlZCAoYWthIGNvcGllZCBmcm9tIGxhc3QgZnJhbWUpCi0gICAgbWJfZW5jb2RpbmcgYmVzdF9lbmNvZGluZzsgICAgICAvL2xhc3QgcmVzdWx0IGZyb20gY2FsY3VsYXRlX21vZGVfc2NvcmUoKQordHlwZWRlZiBzdHJ1Y3QgbWJfaW5mbyB7CisgICAgaW50IHYxX3ZlY3RvcjsgICAgICAgICAgICAgIC8vIGluZGV4IGludG8gdjEgY29kZWJvb2sKKyAgICBpbnQgdjFfZXJyb3I7ICAgICAgICAgICAgICAgLy8gZXJyb3Igd2hlbiB1c2luZyBWMSBlbmNvZGluZworICAgIGludCB2NF92ZWN0b3JbNF07ICAgICAgICAgICAvLyBpbmRpY2VzIGludG8gdjQgY29kZWJvb2sKKyAgICBpbnQgdjRfZXJyb3I7ICAgICAgICAgICAgICAgLy8gZXJyb3Igd2hlbiB1c2luZyBWNCBlbmNvZGluZworICAgIGludCBza2lwX2Vycm9yOyAgICAgICAgICAgICAvLyBlcnJvciB3aGVuIGJsb2NrIGlzIHNraXBwZWQgKGFrYSBjb3BpZWQgZnJvbSBsYXN0IGZyYW1lKQorICAgIG1iX2VuY29kaW5nIGJlc3RfZW5jb2Rpbmc7ICAvLyBsYXN0IHJlc3VsdCBmcm9tIGNhbGN1bGF0ZV9tb2RlX3Njb3JlKCkKIH0gbWJfaW5mbzsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCB2MV9jb2RlYm9va1tDT0RFQk9PS19NQVgqVkVDVE9SX01BWF07Ci0gICAgaW50IHY0X2NvZGVib29rW0NPREVCT09LX01BWCpWRUNUT1JfTUFYXTsKK3R5cGVkZWYgc3RydWN0IHN0cmlwX2luZm8geworICAgIGludCB2MV9jb2RlYm9va1tDT0RFQk9PS19NQVggKiBWRUNUT1JfTUFYXTsKKyAgICBpbnQgdjRfY29kZWJvb2tbQ09ERUJPT0tfTUFYICogVkVDVE9SX01BWF07CiAgICAgaW50IHYxX3NpemU7CiAgICAgaW50IHY0X3NpemU7CiAgICAgQ2luZXBha01vZGUgbW9kZTsKIH0gc3RyaXBfaW5mbzsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQ2luZXBha0VuY0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKICAgICB1bnNpZ25lZCBjaGFyICpwaWN0X2J1ZnNbNF0sICpzdHJpcF9idWYsICpmcmFtZV9idWY7CkBAIC0xNDksMTUgKzExNywxMCBAQAogICAgIHVpbnQ2NF90IGxhbWJkYTsKICAgICBpbnQgKmNvZGVib29rX2lucHV0OwogICAgIGludCAqY29kZWJvb2tfY2xvc2VzdDsKLSAgICBtYl9pbmZvICptYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTUIgUkQgc3RhdGUKLSAgICBpbnQgbWluX3N0cmlwczsgICAgICAgICAgLy90aGUgY3VycmVudCBsaW1pdAotICAgIGludCBtYXhfc3RyaXBzOyAgICAgICAgICAvL3RoZSBjdXJyZW50IGxpbWl0Ci0jaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwotICAgIG1iX2luZm8gKmJlc3RfbWI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPOiByZW1vdmUuIG9ubHkgdXNlZCBmb3IgcHJpbnRpbmcgc3RhdHMKLSAgICBpbnQgbnVtX3YxX21vZGUsIG51bV92NF9tb2RlLCBudW1fbWNfbW9kZTsKLSAgICBpbnQgbnVtX3YxX2VuY3MsIG51bV92NF9lbmNzLCBudW1fc2tpcHM7Ci0jZW5kaWYKLS8vIG9wdGlvbnMKKyAgICBtYl9pbmZvICptYjsgICAgICAgICAgICAgICAgLy8gTUIgUkQgc3RhdGUKKyAgICBpbnQgbWluX3N0cmlwczsgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgbGltaXQKKyAgICBpbnQgbWF4X3N0cmlwczsgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgbGltaXQKKyAgICAvLyBvcHRpb25zCiAgICAgaW50IG1heF9leHRyYV9jYl9pdGVyYXRpb25zOwogICAgIGludCBza2lwX2VtcHR5X2NiOwogICAgIGludCBtaW5fbWluX3N0cmlwczsKQEAgLTE2OCwxMSArMTMxLDE2IEBACiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDaW5lcGFrRW5jQ29udGV4dCwgeCkKICNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKLSAgICB7ICJtYXhfZXh0cmFfY2JfaXRlcmF0aW9ucyIsICJNYXggZXh0cmEgY29kZWJvb2sgcmVjYWxjdWxhdGlvbiBwYXNzZXMsIG1vcmUgaXMgYmV0dGVyIGFuZCBzbG93ZXIiLCBPRkZTRVQobWF4X2V4dHJhX2NiX2l0ZXJhdGlvbnMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDIgfSwgMCwgSU5UX01BWCwgVkUgfSwKLSAgICB7ICJza2lwX2VtcHR5X2NiIiwgIkF2b2lkIHdhc3RpbmcgYnl0ZXMsIGlnbm9yZSB2aW50YWdlIE1hY09TIGRlY29kZXIiLCBPRkZTRVQoc2tpcF9lbXB0eV9jYiksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKLSAgICB7ICJtYXhfc3RyaXBzIiwgIkxpbWl0IHN0cmlwcy9mcmFtZSwgdmludGFnZSBjb21wYXRpYmxlIGlzIDEuLjMsIG90aGVyd2lzZSB0aGUgbW9yZSB0aGUgYmV0dGVyIiwgT0ZGU0VUKG1heF9tYXhfc3RyaXBzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAzIH0sIE1JTl9TVFJJUFMsIE1BWF9TVFJJUFMsIFZFIH0sCi0gICAgeyAibWluX3N0cmlwcyIsICJFbmZvcmNlIG1pbiBzdHJpcHMvZnJhbWUsIG1vcmUgaXMgd29yc2UgYW5kIGZhc3RlciwgbXVzdCBiZSA8PSBtYXhfc3RyaXBzIiwgT0ZGU0VUKG1pbl9taW5fc3RyaXBzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBNSU5fU1RSSVBTIH0sIE1JTl9TVFJJUFMsIE1BWF9TVFJJUFMsIFZFIH0sCi0gICAgeyAic3RyaXBfbnVtYmVyX2FkYXB0aXZpdHkiLCAiSG93IGZhc3QgdGhlIHN0cmlwIG51bWJlciBhZGFwdHMsIG1vcmUgaXMgc2xpZ2h0bHkgYmV0dGVyLCBtdWNoIHNsb3dlciIsIE9GRlNFVChzdHJpcF9udW1iZXJfZGVsdGFfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgTUFYX1NUUklQUy1NSU5fU1RSSVBTLCBWRSB9LAorICAgIHsgIm1heF9leHRyYV9jYl9pdGVyYXRpb25zIiwgIk1heCBleHRyYSBjb2RlYm9vayByZWNhbGN1bGF0aW9uIHBhc3NlcywgbW9yZSBpcyBiZXR0ZXIgYW5kIHNsb3dlciIsCisgICAgICBPRkZTRVQobWF4X2V4dHJhX2NiX2l0ZXJhdGlvbnMpLCAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAgICAgICAgICAyIH0sICAgICAgICAgIDAsIElOVF9NQVgsICAgICAgICAgICAgICAgICBWRSB9LAorICAgIHsgInNraXBfZW1wdHlfY2IiLCAgICAgICAgICAgIkF2b2lkIHdhc3RpbmcgYnl0ZXMsIGlnbm9yZSB2aW50YWdlIE1hY09TIGRlY29kZXIiLAorICAgICAgT0ZGU0VUKHNraXBfZW1wdHlfY2IpLCAgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9ICAgICAgICAgMCB9LCAgICAgICAgICAwLCAxLCAgICAgICAgICAgICAgICAgICAgICAgVkUgfSwKKyAgICB7ICJtYXhfc3RyaXBzIiwgICAgICAgICAgICAgICJMaW1pdCBzdHJpcHMvZnJhbWUsIHZpbnRhZ2UgY29tcGF0aWJsZSBpcyAxLi4zLCBvdGhlcndpc2UgdGhlIG1vcmUgdGhlIGJldHRlciIsCisgICAgICBPRkZTRVQobWF4X21heF9zdHJpcHMpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAgICAgICAgICAzIH0sIE1JTl9TVFJJUFMsIE1BWF9TVFJJUFMsICAgICAgICAgICAgICBWRSB9LAorICAgIHsgIm1pbl9zdHJpcHMiLCAgICAgICAgICAgICAgIkVuZm9yY2UgbWluIHN0cmlwcy9mcmFtZSwgbW9yZSBpcyB3b3JzZSBhbmQgZmFzdGVyLCBtdXN0IGJlIDw9IG1heF9zdHJpcHMiLAorICAgICAgT0ZGU0VUKG1pbl9taW5fc3RyaXBzKSwgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gTUlOX1NUUklQUyB9LCBNSU5fU1RSSVBTLCBNQVhfU1RSSVBTLCAgICAgICAgICAgICAgVkUgfSwKKyAgICB7ICJzdHJpcF9udW1iZXJfYWRhcHRpdml0eSIsICJIb3cgZmFzdCB0aGUgc3RyaXAgbnVtYmVyIGFkYXB0cywgbW9yZSBpcyBzbGlnaHRseSBiZXR0ZXIsIG11Y2ggc2xvd2VyIiwKKyAgICAgIE9GRlNFVChzdHJpcF9udW1iZXJfZGVsdGFfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9ICAgICAgICAgIDAgfSwgICAgICAgICAgMCwgTUFYX1NUUklQUyAtIE1JTl9TVFJJUFMsIFZFIH0sCiAgICAgeyBOVUxMIH0sCiB9OwogCkBAIC0xOTAsMTMgKzE1OCwxMyBAQAogCiAgICAgaWYgKGF2Y3R4LT53aWR0aCAmIDMgfHwgYXZjdHgtPmhlaWdodCAmIDMpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgbXVsdGlwbGVzIG9mIGZvdXIgKGdvdCAlaXglaSlcbiIsCi0gICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCiAgICAgaWYgKHMtPm1pbl9taW5fc3RyaXBzID4gcy0+bWF4X21heF9zdHJpcHMpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaW5pbWFsIG51bWJlciBvZiBzdHJpcHMgY2FuIG5vdCBleGNlZWQgbWF4aW1hbCAoZ290ICVpIGFuZCAlaSlcbiIsCi0gICAgICAgICAgICAgICAgcy0+bWluX21pbl9zdHJpcHMsIHMtPm1heF9tYXhfc3RyaXBzKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaW5pbXVtIG51bWJlciBvZiBzdHJpcHMgbXVzdCBub3QgZXhjZWVkIG1heGltdW0gKGdvdCAlaSBhbmQgJWkpXG4iLAorICAgICAgICAgICAgICAgcy0+bWluX21pbl9zdHJpcHMsIHMtPm1heF9tYXhfc3RyaXBzKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKQEAgLTIxMCwyMyArMTc4LDIzIEBACiAgICAgICAgIGlmICghKHMtPmlucHV0X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKSkpCiAgICAgICAgICAgICBnb3RvIGVub21lbTsKIAotICAgIGlmICghKHMtPmNvZGVib29rX2lucHV0ID0gYXZfbWFsbG9jKHNpemVvZihpbnQpICogKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNCkgKiAoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMikpKQorICAgIGlmICghKHMtPmNvZGVib29rX2lucHV0ID0gYXZfbWFsbG9jX2FycmF5KChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQpICogKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpID4+IDIsIHNpemVvZigqcy0+Y29kZWJvb2tfaW5wdXQpKSkpCiAgICAgICAgIGdvdG8gZW5vbWVtOwogCi0gICAgaWYgKCEocy0+Y29kZWJvb2tfY2xvc2VzdCA9IGF2X21hbGxvYyhzaXplb2YoaW50KSAqIChhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0KSA+PiAyKSkpCisgICAgaWYgKCEocy0+Y29kZWJvb2tfY2xvc2VzdCA9IGF2X21hbGxvY19hcnJheSgoYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCkgPj4gMiwgc2l6ZW9mKCpzLT5jb2RlYm9va19jbG9zZXN0KSkpKQogICAgICAgICBnb3RvIGVub21lbTsKIAotICAgIGZvcih4ID0gMDsgeCA8IChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNCA6IDMpOyB4KyspCi0gICAgICAgIGlmKCEocy0+cGljdF9idWZzW3hdID0gYXZfbWFsbG9jKChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQpICogKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpID4+IDIpKSkKKyAgICBmb3IgKHggPSAwOyB4IDwgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA0IDogMyk7IHgrKykKKyAgICAgICAgaWYgKCEocy0+cGljdF9idWZzW3hdID0gYXZfbWFsbG9jKChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQpICogKGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQpID4+IDIpKSkKICAgICAgICAgICAgIGdvdG8gZW5vbWVtOwogCiAgICAgbWJfY291bnQgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0IC8gTUJfQVJFQTsKIAotICAgIC8vdGhlIGxhcmdlc3QgcG9zc2libGUgY2h1bmsgaXMgMHgzMSB3aXRoIGFsbCBNQnMgZW5jb2RlZCBpbiBWNCBtb2RlCi0gICAgLy9hbmQgZnVsbCBjb2RlYm9va3MgYmVpbmcgcmVwbGFjZWQgaW4gSU5URVIgbW9kZSwKKyAgICAvLyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBjaHVuayBpcyAweDMxIHdpdGggYWxsIE1CcyBlbmNvZGVkIGluIFY0IG1vZGUKKyAgICAvLyBhbmQgZnVsbCBjb2RlYm9va3MgYmVpbmcgcmVwbGFjZWQgaW4gSU5URVIgbW9kZSwKICAgICAvLyB3aGljaCBpcyAzNCBiaXRzIHBlciBNQgotICAgIC8vYW5kIDIqMjU2IGV4dHJhIGZsYWcgYml0cyBwZXIgc3RyaXAKLSAgICBzdHJpcF9idWZfc2l6ZSA9IFNUUklQX0hFQURFUl9TSVpFICsgMyAqIENIVU5LX0hFQURFUl9TSVpFICsgMiAqIFZFQ1RPUl9NQVggKiBDT0RFQk9PS19NQVggKyA0ICogKG1iX2NvdW50ICsgKG1iX2NvdW50ICsgMTUpIC8gMTYpICsgKDIgKiBDT0RFQk9PS19NQVgpLzg7CisgICAgLy8gYW5kIDIqMjU2IGV4dHJhIGZsYWcgYml0cyBwZXIgc3RyaXAKKyAgICBzdHJpcF9idWZfc2l6ZSA9IFNUUklQX0hFQURFUl9TSVpFICsgMyAqIENIVU5LX0hFQURFUl9TSVpFICsgMiAqIFZFQ1RPUl9NQVggKiBDT0RFQk9PS19NQVggKyA0ICogKG1iX2NvdW50ICsgKG1iX2NvdW50ICsgMTUpIC8gMTYpICsgKDIgKiBDT0RFQk9PS19NQVgpIC8gODsKIAogICAgIGZyYW1lX2J1Zl9zaXplID0gQ1ZJRF9IRUFERVJfU0laRSArIHMtPm1heF9tYXhfc3RyaXBzICogc3RyaXBfYnVmX3NpemU7CiAKQEAgLTIzOSwyMSArMjA3LDE2IEBACiAgICAgaWYgKCEocy0+bWIgPSBhdl9tYWxsb2NfYXJyYXkobWJfY291bnQsIHNpemVvZihtYl9pbmZvKSkpKQogICAgICAgICBnb3RvIGVub21lbTsKIAotI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKLSAgICBpZiAoIShzLT5iZXN0X21iID0gYXZfbWFsbG9jX2FycmF5KG1iX2NvdW50LCBzaXplb2YobWJfaW5mbykpKSkKLSAgICAgICAgZ290byBlbm9tZW07Ci0jZW5kaWYKLQogICAgIGF2X2xmZ19pbml0KCZzLT5yYW5kY3R4LCAxKTsKLSAgICBzLT5hdmN0eCA9IGF2Y3R4OwotICAgIHMtPncgPSBhdmN0eC0+d2lkdGg7Ci0gICAgcy0+aCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgcy0+YXZjdHggICAgICAgICAgPSBhdmN0eDsKKyAgICBzLT53ICAgICAgICAgICAgICA9IGF2Y3R4LT53aWR0aDsKKyAgICBzLT5oICAgICAgICAgICAgICA9IGF2Y3R4LT5oZWlnaHQ7CiAgICAgcy0+ZnJhbWVfYnVmX3NpemUgPSBmcmFtZV9idWZfc2l6ZTsKLSAgICBzLT5jdXJmcmFtZSA9IDA7Ci0gICAgcy0+a2V5aW50ID0gYXZjdHgtPmtleWludF9taW47Ci0gICAgcy0+cGl4X2ZtdCA9IGF2Y3R4LT5waXhfZm10OworICAgIHMtPmN1cmZyYW1lICAgICAgID0gMDsKKyAgICBzLT5rZXlpbnQgICAgICAgICA9IGF2Y3R4LT5rZXlpbnRfbWluOworICAgIHMtPnBpeF9mbXQgICAgICAgID0gYXZjdHgtPnBpeF9mbXQ7CiAKLSAgICAvL3NldCB1cCBBVkZyYW1lcworICAgIC8vIHNldCB1cCBBVkZyYW1lcwogICAgIHMtPmxhc3RfZnJhbWUtPmRhdGFbMF0gICAgICAgID0gcy0+cGljdF9idWZzWzBdOwogICAgIHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzBdICAgID0gcy0+dzsKICAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzBdICAgICAgICA9IHMtPnBpY3RfYnVmc1sxXTsKQEAgLTI2MiwzMiArMjI1LDMyIEBACiAgICAgcy0+c2NyYXRjaF9mcmFtZS0+bGluZXNpemVbMF0gPSBzLT53OwogCiAgICAgaWYgKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewotICAgICAgICBzLT5sYXN0X2ZyYW1lLT5kYXRhWzFdICAgICAgICA9IHMtPmxhc3RfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKLSAgICAgICAgcy0+bGFzdF9mcmFtZS0+ZGF0YVsyXSAgICAgICAgPSBzLT5sYXN0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7Ci0gICAgICAgIHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzFdICAgID0gcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMl0gPSBzLT53ID4+IDE7CisgICAgICAgIHMtPmxhc3RfZnJhbWUtPmRhdGFbMV0gICAgID0gcy0+bGFzdF9mcmFtZS0+ZGF0YVswXSArICAgcy0+dyAqIHMtPmg7CisgICAgICAgIHMtPmxhc3RfZnJhbWUtPmRhdGFbMl0gICAgID0gcy0+bGFzdF9mcmFtZS0+ZGF0YVsxXSArICgocy0+dyAqIHMtPmgpID4+IDIpOworICAgICAgICBzLT5sYXN0X2ZyYW1lLT5saW5lc2l6ZVsxXSA9CisgICAgICAgIHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOwogCi0gICAgICAgIHMtPmJlc3RfZnJhbWUtPmRhdGFbMV0gICAgICAgID0gcy0+YmVzdF9mcmFtZS0+ZGF0YVswXSArIHMtPncgKiBzLT5oOwotICAgICAgICBzLT5iZXN0X2ZyYW1lLT5kYXRhWzJdICAgICAgICA9IHMtPmJlc3RfZnJhbWUtPmRhdGFbMV0gKyAoKHMtPncgKiBzLT5oKSA+PiAyKTsKLSAgICAgICAgcy0+YmVzdF9mcmFtZS0+bGluZXNpemVbMV0gICAgPSBzLT5iZXN0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKKyAgICAgICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVsxXSAgICAgPSBzLT5iZXN0X2ZyYW1lLT5kYXRhWzBdICsgICBzLT53ICogcy0+aDsKKyAgICAgICAgcy0+YmVzdF9mcmFtZS0+ZGF0YVsyXSAgICAgPSBzLT5iZXN0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CisgICAgICAgIHMtPmJlc3RfZnJhbWUtPmxpbmVzaXplWzFdID0KKyAgICAgICAgcy0+YmVzdF9mcmFtZS0+bGluZXNpemVbMl0gPSBzLT53ID4+IDE7CiAKLSAgICAgICAgcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVsxXSAgICAgPSBzLT5zY3JhdGNoX2ZyYW1lLT5kYXRhWzBdICsgcy0+dyAqIHMtPmg7CisgICAgICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMV0gICAgID0gcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVswXSArICAgcy0+dyAqIHMtPmg7CiAgICAgICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGFbMl0gICAgID0gcy0+c2NyYXRjaF9mcmFtZS0+ZGF0YVsxXSArICgocy0+dyAqIHMtPmgpID4+IDIpOwotICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZVsxXSA9IHMtPnNjcmF0Y2hfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOworICAgICAgICBzLT5zY3JhdGNoX2ZyYW1lLT5saW5lc2l6ZVsxXSA9CisgICAgICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmxpbmVzaXplWzJdID0gcy0+dyA+PiAxOwogCi0gICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzBdICAgICAgID0gcy0+cGljdF9idWZzWzNdOwotICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMF0gICA9IHMtPnc7Ci0gICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzFdICAgICAgID0gcy0+aW5wdXRfZnJhbWUtPmRhdGFbMF0gKyBzLT53ICogcy0+aDsKLSAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmRhdGFbMl0gICAgICAgPSBzLT5pbnB1dF9mcmFtZS0+ZGF0YVsxXSArICgocy0+dyAqIHMtPmgpID4+IDIpOwotICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMV0gICA9IHMtPmlucHV0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKKyAgICAgICAgcy0+aW5wdXRfZnJhbWUtPmRhdGFbMF0gICAgID0gcy0+cGljdF9idWZzWzNdOworICAgICAgICBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemVbMF0gPSBzLT53OworICAgICAgICBzLT5pbnB1dF9mcmFtZS0+ZGF0YVsxXSAgICAgPSBzLT5pbnB1dF9mcmFtZS0+ZGF0YVswXSArICAgcy0+dyAqIHMtPmg7CisgICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhWzJdICAgICA9IHMtPmlucHV0X2ZyYW1lLT5kYXRhWzFdICsgKChzLT53ICogcy0+aCkgPj4gMik7CisgICAgICAgIHMtPmlucHV0X2ZyYW1lLT5saW5lc2l6ZVsxXSA9CisgICAgICAgIHMtPmlucHV0X2ZyYW1lLT5saW5lc2l6ZVsyXSA9IHMtPncgPj4gMTsKICAgICB9CiAKICAgICBzLT5taW5fc3RyaXBzID0gcy0+bWluX21pbl9zdHJpcHM7CiAgICAgcy0+bWF4X3N0cmlwcyA9IHMtPm1heF9tYXhfc3RyaXBzOwogCi0jaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwotICAgIHMtPm51bV92MV9tb2RlID0gcy0+bnVtX3Y0X21vZGUgPSBzLT5udW1fbWNfbW9kZSA9IHMtPm51bV92MV9lbmNzID0gcy0+bnVtX3Y0X2VuY3MgPSBzLT5udW1fc2tpcHMgPSAwOwotI2VuZGlmCi0KICAgICByZXR1cm4gMDsKIAogZW5vbWVtOgpAQCAtMzAxLDkwICsyNjQsNjggQEAKICAgICBhdl9mcmVlcCgmcy0+c3RyaXBfYnVmKTsKICAgICBhdl9mcmVlcCgmcy0+ZnJhbWVfYnVmKTsKICAgICBhdl9mcmVlcCgmcy0+bWIpOwotI2lmZGVmIENJTkVQQUtFTkNfREVCVUcKLSAgICBhdl9mcmVlcCgmcy0+YmVzdF9tYik7Ci0jZW5kaWYKIAotICAgIGZvcih4ID0gMDsgeCA8IChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNCA6IDMpOyB4KyspCisgICAgZm9yICh4ID0gMDsgeCA8IChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNCA6IDMpOyB4KyspCiAgICAgICAgIGF2X2ZyZWVwKCZzLT5waWN0X2J1ZnNbeF0pOwogCiAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIH0KIAotc3RhdGljIGludDY0X3QgY2FsY3VsYXRlX21vZGVfc2NvcmUoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCBoLCBzdHJpcF9pbmZvICppbmZvLCBpbnQgcmVwb3J0LCBpbnQgKnRyYWluaW5nX3NldF92MV9zaHJ1bmssIGludCAqdHJhaW5pbmdfc2V0X3Y0X3NocnVuawotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSwgaW50NjRfdCAqc2VycgotI2VuZGlmCi0pCitzdGF0aWMgaW50NjRfdCBjYWxjdWxhdGVfbW9kZV9zY29yZShDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9pbmZvICppbmZvLCBpbnQgcmVwb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0cmFpbmluZ19zZXRfdjFfc2hydW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0cmFpbmluZ19zZXRfdjRfc2hydW5rKQogewotICAgIC8vc2NvcmUgPSBGRl9MQU1CREFfU0NBTEUgKiBlcnJvciArIGxhbWJkYSAqIGJpdHMKKyAgICAvLyBzY29yZSA9IEZGX0xBTUJEQV9TQ0FMRSAqIGVycm9yICsgbGFtYmRhICogYml0cwogICAgIGludCB4OwogICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7Ci0gICAgaW50IG1iX2NvdW50ID0gcy0+dyAqIGggLyBNQl9BUkVBOworICAgIGludCBtYl9jb3VudCAgID0gcy0+dyAqIGggLyBNQl9BUkVBOwogICAgIG1iX2luZm8gKm1iOwogICAgIGludDY0X3Qgc2NvcmUxLCBzY29yZTIsIHNjb3JlMzsKICAgICBpbnQ2NF90IHJldCA9IHMtPmxhbWJkYSAqICgoaW5mby0+djFfc2l6ZSA/IENIVU5LX0hFQURFUl9TSVpFICsgaW5mby0+djFfc2l6ZSAqIGVudHJ5X3NpemUgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgKGluZm8tPnY0X3NpemUgPyBDSFVOS19IRUFERVJfU0laRSArIGluZm8tPnY0X3NpemUgKiBlbnRyeV9zaXplIDogMCkgKwotICAgICAgICAgICAgICAgICAgIENIVU5LX0hFQURFUl9TSVpFKSA8PCAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbmZvLT52NF9zaXplID8gQ0hVTktfSEVBREVSX1NJWkUgKyBpbmZvLT52NF9zaXplICogZW50cnlfc2l6ZSA6IDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSFVOS19IRUFERVJfU0laRSkgPDwgMzsKIAotICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInNpemVzICUzaSAlM2kgLT4gJTkiUFJJZDY0IiBzY29yZSBtYl9jb3VudCAlaSIsIGluZm8tPnYxX3NpemUsIGluZm8tPnY0X3NpemUsIHJldCwgbWJfY291bnQpOwotCi0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICpzZXJyID0gMDsKLSNlbmRpZgotCi0gICAgc3dpdGNoKGluZm8tPm1vZGUpIHsKKyAgICBzd2l0Y2ggKGluZm8tPm1vZGUpIHsKICAgICBjYXNlIE1PREVfVjFfT05MWToKLSAgICAgICAgLy9vbmUgYnl0ZSBwZXIgTUIKKyAgICAgICAgLy8gb25lIGJ5dGUgcGVyIE1CCiAgICAgICAgIHJldCArPSBzLT5sYW1iZGEgKiA4ICogbWJfY291bnQ7CiAKLS8vIHdoaWxlIGNhbGN1bGF0aW5nIHdlIGFzc3VtZSBhbGwgYmxvY2tzIGFyZSBFTkNfVjEKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewotICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07CisgICAgICAgIC8vIHdoaWxlIGNhbGN1bGF0aW5nIHdlIGFzc3VtZSBhbGwgYmxvY2tzIGFyZSBFTkNfVjEKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKKyAgICAgICAgICAgIG1iICAgPSAmcy0+bWJbeF07CiAgICAgICAgICAgICByZXQgKz0gRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOwotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSAgICAgICAgICAgICpzZXJyICs9IG1iLT52MV9lcnJvcjsKLSNlbmRpZgotLy8gdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgZm9yIHJlcG9ydCBpbiBNT0RFX1YxX09OTFkKLS8vICAgICAgICAgICAgaWYoIXJlcG9ydCkKKyAgICAgICAgICAgIC8vIHRoaXMgZnVuY3Rpb24gaXMgbmV2ZXIgY2FsbGVkIGZvciByZXBvcnQgaW4gTU9ERV9WMV9PTkxZCisgICAgICAgICAgICAvLyBpZiAoIXJlcG9ydCkKICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOwogICAgICAgICB9CiAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNT0RFX1YxX1Y0OgotICAgICAgICAvLzkgb3IgMzMgYml0cyBwZXIgTUIKLSAgICAgICAgaWYocmVwb3J0KSB7Ci0vLyBubyBtb3ZlcyBiZXR3ZWVuIHRoZSBjb3JyZXNwb25kaW5nIHRyYWluaW5nIHNldHMgYXJlIGFsbG93ZWQKKyAgICAgICAgLy8gOSBvciAzMyBiaXRzIHBlciBNQgorICAgICAgICBpZiAocmVwb3J0KSB7CisgICAgICAgICAgICAvLyBubyBtb3ZlcyBiZXR3ZWVuIHRoZSBjb3JyZXNwb25kaW5nIHRyYWluaW5nIHNldHMgYXJlIGFsbG93ZWQKICAgICAgICAgICAgICp0cmFpbmluZ19zZXRfdjFfc2hydW5rID0gKnRyYWluaW5nX3NldF92NF9zaHJ1bmsgPSAwOwotICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgICAgICBpbnQgbWJlcnI7CiAgICAgICAgICAgICAgICAgbWIgPSAmcy0+bWJbeF07Ci0gICAgICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQotICAgICAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiA5ICArIEZGX0xBTUJEQV9TQ0FMRSAqIChtYmVycj1tYi0+djFfZXJyb3IpOworICAgICAgICAgICAgICAgIGlmIChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCisgICAgICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDkgKyBGRl9MQU1CREFfU0NBTEUgKiAobWJlcnIgPSBtYi0+djFfZXJyb3IpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMzMgKyBGRl9MQU1CREFfU0NBTEUgKiAobWJlcnI9bWItPnY0X2Vycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMzMgKyBGRl9MQU1CREFfU0NBTEUgKiAobWJlcnIgPSBtYi0+djRfZXJyb3IpOwogICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICAgICAgICAgICAgICpzZXJyICs9IG1iZXJyOwotI2VuZGlmCiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7IC8vIGZpbmQgYmVzdCBtb2RlIHBlciBibG9jawotICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgewotICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3hdOwotICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDkgICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKKyAgICAgICAgICAgICAgICBtYiAgICAgPSAmcy0+bWJbeF07CisgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogOSArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52MV9lcnJvcjsKICAgICAgICAgICAgICAgICBzY29yZTIgPSBzLT5sYW1iZGEgKiAzMyArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT52NF9lcnJvcjsKIAotICAgICAgICAgICAgICAgIGlmKHNjb3JlMSA8PSBzY29yZTIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2NvcmUxIDw9IHNjb3JlMikgewogICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOwotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTI7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMzkyLDc1ICszMzMsNTEgQEAKIAogICAgICAgICBicmVhazsKICAgICBjYXNlIE1PREVfTUM6Ci0gICAgICAgIC8vMSwgMTAgb3IgMzQgYml0cyBwZXIgTUIKLSAgICAgICAgaWYocmVwb3J0KSB7CisgICAgICAgIC8vIDEsIDEwIG9yIDM0IGJpdHMgcGVyIE1CCisgICAgICAgIGlmIChyZXBvcnQpIHsKICAgICAgICAgICAgIGludCB2MV9zaHJ1bmsgPSAwLCB2NF9zaHJ1bmsgPSAwOwotICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKICAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKLS8vIGl0IGlzIE9LIHRvIG1vdmUgYmxvY2tzIHRvIEVOQ19TS0lQIGhlcmUKLS8vIGJ1dCBub3QgdG8gYW55IGNvZGVib29rIGVuY29kaW5nIQotICAgICAgICAgICAgICAgIHNjb3JlMSA9IHMtPmxhbWJkYSAqIDEgICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnNraXBfZXJyb3I7Ci0gICAgICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1NLSVApIHsKKyAgICAgICAgICAgICAgICAvLyBpdCBpcyBPSyB0byBtb3ZlIGJsb2NrcyB0byBFTkNfU0tJUCBoZXJlCisgICAgICAgICAgICAgICAgLy8gYnV0IG5vdCB0byBhbnkgY29kZWJvb2sgZW5jb2RpbmchCisgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMSArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT5za2lwX2Vycm9yOworICAgICAgICAgICAgICAgIGlmIChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCkgewogICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChzY29yZTI9cy0+bGFtYmRhICogMTAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djFfZXJyb3IpID49IHNjb3JlMSkgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc2NvcmUyID0gcy0+bGFtYmRhICogMTAgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djFfZXJyb3IpID49IHNjb3JlMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfU0tJUDsKICAgICAgICAgICAgICAgICAgICAgICAgICsrdjFfc2hydW5rOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMTsKLSNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCi0gICAgICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+c2tpcF9lcnJvcjsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0ICs9IHNjb3JlMjsKLSNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCi0gICAgICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djFfZXJyb3I7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChzY29yZTM9cy0+bGFtYmRhICogMzQgKyBGRl9MQU1CREFfU0NBTEUgKiBtYi0+djRfZXJyb3IpID49IHNjb3JlMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHNjb3JlMyA9IHMtPmxhbWJkYSAqIDM0ICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnY0X2Vycm9yKSA+PSBzY29yZTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1NLSVA7CiAgICAgICAgICAgICAgICAgICAgICAgICArK3Y0X3NocnVuazsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTE7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTM7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnY0X2Vycm9yOwotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqdHJhaW5pbmdfc2V0X3YxX3NocnVuayA9IHYxX3NocnVuazsKICAgICAgICAgICAgICp0cmFpbmluZ19zZXRfdjRfc2hydW5rID0gdjRfc2hydW5rOwogICAgICAgICB9IGVsc2UgeyAvLyBmaW5kIGJlc3QgbW9kZSBwZXIgYmxvY2sKLSAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKLSAgICAgICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKLSAgICAgICAgICAgICAgICBzY29yZTEgPSBzLT5sYW1iZGEgKiAxICArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT5za2lwX2Vycm9yOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspIHsKKyAgICAgICAgICAgICAgICBtYiAgICAgPSAmcy0+bWJbeF07CisgICAgICAgICAgICAgICAgc2NvcmUxID0gcy0+bGFtYmRhICogMSArIEZGX0xBTUJEQV9TQ0FMRSAqIG1iLT5za2lwX2Vycm9yOwogICAgICAgICAgICAgICAgIHNjb3JlMiA9IHMtPmxhbWJkYSAqIDEwICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnYxX2Vycm9yOwogICAgICAgICAgICAgICAgIHNjb3JlMyA9IHMtPmxhbWJkYSAqIDM0ICsgRkZfTEFNQkRBX1NDQUxFICogbWItPnY0X2Vycm9yOwogCi0gICAgICAgICAgICAgICAgaWYoc2NvcmUxIDw9IHNjb3JlMiAmJiBzY29yZTEgPD0gc2NvcmUzKSB7CisgICAgICAgICAgICAgICAgaWYgKHNjb3JlMSA8PSBzY29yZTIgJiYgc2NvcmUxIDw9IHNjb3JlMykgewogICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUxOwotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnNraXBfZXJyb3I7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfU0tJUDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYoc2NvcmUyIDw9IHNjb3JlMykgeworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2NvcmUyIDw9IHNjb3JlMykgewogICAgICAgICAgICAgICAgICAgICByZXQgKz0gc2NvcmUyOwotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSAgICAgICAgICAgICAgICAgICAgKnNlcnIgKz0gbWItPnYxX2Vycm9yOwotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIG1iLT5iZXN0X2VuY29kaW5nID0gRU5DX1YxOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHJldCArPSBzY29yZTM7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICAgICAgICAgICAgICAgICAqc2VyciArPSBtYi0+djRfZXJyb3I7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgbWItPmJlc3RfZW5jb2RpbmcgPSBFTkNfVjQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDc5LDEyMyArMzk2LDEyNSBAQAogICAgIHJldHVybiBDSFVOS19IRUFERVJfU0laRTsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfY29kZWJvb2soQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCAqY29kZWJvb2ssIGludCBzaXplLCBpbnQgY2h1bmtfdHlwZV95dXYsIGludCBjaHVua190eXBlX2dyYXksIHVuc2lnbmVkIGNoYXIgKmJ1ZikKK3N0YXRpYyBpbnQgZW5jb2RlX2NvZGVib29rKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgKmNvZGVib29rLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHVua190eXBlX3l1diwgaW50IGNodW5rX3R5cGVfZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZikKIHsKICAgICBpbnQgeCwgeSwgcmV0LCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CiAgICAgaW50IGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGUgPSAwOyAvLyBoYXJkY29kZWQgaGVyZSwKLSAgICAgICAgICAgICAgICAvLyB0aGUgY29tcGlsZXIgc2hvdWxkIG5vdGljZSB0aGF0IHRoaXMgaXMgYSBjb25zdGFudCAtLSBybAorICAgIC8vIHRoZSBjb21waWxlciBzaG91bGQgbm90aWNlIHRoYXQgdGhpcyBpcyBhIGNvbnN0YW50IC0tIHJsCiAKICAgICByZXQgPSB3cml0ZV9jaHVua19oZWFkZXIoYnVmLAotICAgICAgICAgIHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/Ci0gICAgICAgICAgIGNodW5rX3R5cGVfeXV2KyhpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlPzE6MCkgOgotICAgICAgICAgICBjaHVua190eXBlX2dyYXkrKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGU/MTowKSwKLSAgICAgICAgICBlbnRyeV9zaXplICogc2l6ZQotICAgICAgICAgICArIChpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlPyhzaXplKzMxKS8zMio0OjApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3R5cGVfeXV2ICArIChpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlID8gMSA6IDApIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZV9ncmF5ICsgKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGUgPyAxIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X3NpemUgKiBzaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGUgPyAoc2l6ZSArIDMxKSAvIDMyICogNCA6IDApKTsKIAotLy8gd2UgZG8gY29kZWJvb2sgZW5jb2RpbmcgYWNjb3JkaW5nIHRvIHRoZSAiaW50cmEiIG1vZGUKLS8vIGJ1dCB3ZSBrZWVwIHRoZSAiZGVhZCIgY29kZSBmb3IgcmVmZXJlbmNlIGluIGNhc2Ugd2Ugd2lsbCB3YW50Ci0vLyB0byB1c2UgaW5jcmVtZW50YWwgY29kZWJvb2sgdXBkYXRlcyAod2hpY2ggYWN0dWFsbHkgd291bGQgZ2l2ZSB1cwotLy8gImtpbmQgb2YiIG1vdGlvbiBjb21wZW5zYXRpb24sIGVzcGVjaWFsbHkgaW4gMSBzdHJpcC9mcmFtZSBjYXNlKSAtLSBybAotLy8gKG9mIGNvdXJzZSwgdGhlIGNvZGUgd2lsbCBiZSBub3QgdXNlZnVsIGFzLWlzKQotICAgIGlmKGluY3JlbWVudGFsX2NvZGVib29rX3JlcGxhY2VtZW50X21vZGUpIHsKKyAgICAvLyB3ZSBkbyBjb2RlYm9vayBlbmNvZGluZyBhY2NvcmRpbmcgdG8gdGhlICJpbnRyYSIgbW9kZQorICAgIC8vIGJ1dCB3ZSBrZWVwIHRoZSAiZGVhZCIgY29kZSBmb3IgcmVmZXJlbmNlIGluIGNhc2Ugd2Ugd2lsbCB3YW50CisgICAgLy8gdG8gdXNlIGluY3JlbWVudGFsIGNvZGVib29rIHVwZGF0ZXMgKHdoaWNoIGFjdHVhbGx5IHdvdWxkIGdpdmUgdXMKKyAgICAvLyAia2luZCBvZiIgbW90aW9uIGNvbXBlbnNhdGlvbiwgZXNwZWNpYWxseSBpbiAxIHN0cmlwL2ZyYW1lIGNhc2UpIC0tIHJsCisgICAgLy8gKG9mIGNvdXJzZSwgdGhlIGNvZGUgd2lsbCBiZSBub3QgdXNlZnVsIGFzLWlzKQorICAgIGlmIChpbmNyZW1lbnRhbF9jb2RlYm9va19yZXBsYWNlbWVudF9tb2RlKSB7CiAgICAgICAgIGludCBmbGFncyA9IDA7CiAgICAgICAgIGludCBmbGFnc2luZDsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7Ci0gICAgICAgICAgICBpZihmbGFncyA9PSAwKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyB4KyspIHsKKyAgICAgICAgICAgIGlmIChmbGFncyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZmxhZ3NpbmQgPSByZXQ7Ci0gICAgICAgICAgICAgICAgcmV0ICs9IDQ7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgPSAweDgwMDAwMDAwOworICAgICAgICAgICAgICAgIHJldCAgICAgKz0gNDsKKyAgICAgICAgICAgICAgICBmbGFncyAgICA9IDB4ODAwMDAwMDA7CiAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBmbGFncyA9ICgoZmxhZ3M+PjEpIHwgMHg4MDAwMDAwMCk7Ci0gICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBlbnRyeV9zaXplOyB5KyspCi0gICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IGNvZGVib29rW3kgKyB4KmVudHJ5X3NpemVdIF4gKHkgPj0gNCA/IDB4ODAgOiAwKTsKLSAgICAgICAgICAgIGlmKChmbGFncyYweGZmZmZmZmZmKSA9PSAweGZmZmZmZmZmKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgPSAoKGZsYWdzID4+IDEpIHwgMHg4MDAwMDAwMCk7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZW50cnlfc2l6ZTsgeSsrKQorICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBjb2RlYm9va1t5ICsgeCAqIGVudHJ5X3NpemVdIF4gKHkgPj0gNCA/IDB4ODAgOiAwKTsKKyAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAweGZmZmZmZmZmKSA9PSAweGZmZmZmZmZmKSB7CiAgICAgICAgICAgICAgICAgQVZfV0IzMigmYnVmW2ZsYWdzaW5kXSwgZmxhZ3MpOwogICAgICAgICAgICAgICAgIGZsYWdzID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZihmbGFncykKKyAgICAgICAgaWYgKGZsYWdzKQogICAgICAgICAgICAgQVZfV0IzMigmYnVmW2ZsYWdzaW5kXSwgZmxhZ3MpOwogICAgIH0gZWxzZQotICAgICAgICBmb3IoeCA9IDA7IHggPCBzaXplOyB4KyspCi0gICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBlbnRyeV9zaXplOyB5KyspCi0gICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IGNvZGVib29rW3kgKyB4KmVudHJ5X3NpemVdIF4gKHkgPj0gNCA/IDB4ODAgOiAwKTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7IHgrKykKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBlbnRyeV9zaXplOyB5KyspCisgICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IGNvZGVib29rW3kgKyB4ICogZW50cnlfc2l6ZV0gXiAoeSA+PSA0ID8gMHg4MCA6IDApOwogCiAgICAgcmV0dXJuIHJldDsKIH0KIAotLy9zZXRzIG91dCB0byB0aGUgc3ViIHBpY3R1cmUgc3RhcnRpbmcgYXQgKHgseSkgaW4gaW4KKy8vIHNldHMgb3V0IHRvIHRoZSBzdWIgcGljdHVyZSBzdGFydGluZyBhdCAoeCx5KSBpbiBpbgogc3RhdGljIHZvaWQgZ2V0X3N1Yl9waWN0dXJlKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqIGluX2RhdGFbNF0sIGludCAgaW5fbGluZXNpemVbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0X2RhdGFbNF0sIGludCBvdXRfbGluZXNpemVbNF0pCiB7Ci0gICAgb3V0X2RhdGFbMF0gPSBpbl9kYXRhWzBdICsgeCArIHkgKiBpbl9saW5lc2l6ZVswXTsKKyAgICBvdXRfZGF0YVswXSAgICAgPSBpbl9kYXRhWzBdICsgeCArIHkgKiBpbl9saW5lc2l6ZVswXTsKICAgICBvdXRfbGluZXNpemVbMF0gPSBpbl9saW5lc2l6ZVswXTsKIAotICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewotICAgICAgICBvdXRfZGF0YVsxXSA9IGluX2RhdGFbMV0gKyAoeCA+PiAxKSArICh5ID4+IDEpICogaW5fbGluZXNpemVbMV07CisgICAgaWYgKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgeworICAgICAgICBvdXRfZGF0YVsxXSAgICAgPSBpbl9kYXRhWzFdICsgKHggPj4gMSkgKyAoeSA+PiAxKSAqIGluX2xpbmVzaXplWzFdOwogICAgICAgICBvdXRfbGluZXNpemVbMV0gPSBpbl9saW5lc2l6ZVsxXTsKIAotICAgICAgICBvdXRfZGF0YVsyXSA9IGluX2RhdGFbMl0gKyAoeCA+PiAxKSArICh5ID4+IDEpICogaW5fbGluZXNpemVbMl07CisgICAgICAgIG91dF9kYXRhWzJdICAgICA9IGluX2RhdGFbMl0gKyAoeCA+PiAxKSArICh5ID4+IDEpICogaW5fbGluZXNpemVbMl07CiAgICAgICAgIG91dF9saW5lc2l6ZVsyXSA9IGluX2xpbmVzaXplWzJdOwogICAgIH0KIH0KIAotLy9kZWNvZGVzIHRoZSBWMSB2ZWN0b3IgaW4gbWIgaW50byB0aGUgNHg0IE1CIHBvaW50ZWQgdG8gYnkgZGF0YQorLy8gZGVjb2RlcyB0aGUgVjEgdmVjdG9yIGluIG1iIGludG8gdGhlIDR4NCBNQiBwb2ludGVkIHRvIGJ5IGRhdGEKIHN0YXRpYyB2b2lkIGRlY29kZV92MV92ZWN0b3IoQ2luZXBha0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRhdGFbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZVs0XSwgaW50IHYxX3ZlY3Rvciwgc3RyaXBfaW5mbyAqaW5mbykKIHsKICAgICBpbnQgZW50cnlfc2l6ZSA9IHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCA/IDYgOiA0OwogCiAgICAgZGF0YVswXVswXSA9Ci0gICAgICAgICAgICBkYXRhWzBdWzFdID0KLSAgICAgICAgICAgIGRhdGFbMF1bICAgIGxpbmVzaXplWzBdXSA9Ci0gICAgICAgICAgICBkYXRhWzBdWzErICBsaW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZV07CisgICAgZGF0YVswXVsxXSA9CisgICAgZGF0YVswXVsgICAgbGluZXNpemVbMF1dID0KKyAgICBkYXRhWzBdWzEgKyBsaW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IgKiBlbnRyeV9zaXplXTsKIAogICAgIGRhdGFbMF1bMl0gPQotICAgICAgICAgICAgZGF0YVswXVszXSA9Ci0gICAgICAgICAgICBkYXRhWzBdWzIrICBsaW5lc2l6ZVswXV0gPQotICAgICAgICAgICAgZGF0YVswXVszKyAgbGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrMV07CisgICAgZGF0YVswXVszXSA9CisgICAgZGF0YVswXVsyICsgbGluZXNpemVbMF1dID0KKyAgICBkYXRhWzBdWzMgKyBsaW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IgKiBlbnRyeV9zaXplICsgMV07CiAKLSAgICBkYXRhWzBdWzIqbGluZXNpemVbMF1dID0KLSAgICAgICAgICAgIGRhdGFbMF1bMSsyKmxpbmVzaXplWzBdXSA9Ci0gICAgICAgICAgICBkYXRhWzBdWyAgMypsaW5lc2l6ZVswXV0gPQotICAgICAgICAgICAgZGF0YVswXVsxKzMqbGluZXNpemVbMF1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrMl07CisgICAgZGF0YVswXVsgICAgMiAqIGxpbmVzaXplWzBdXSA9CisgICAgZGF0YVswXVsxICsgMiAqIGxpbmVzaXplWzBdXSA9CisgICAgZGF0YVswXVsgICAgMyAqIGxpbmVzaXplWzBdXSA9CisgICAgZGF0YVswXVsxICsgMyAqIGxpbmVzaXplWzBdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciAqIGVudHJ5X3NpemUgKyAyXTsKIAotICAgIGRhdGFbMF1bMisyKmxpbmVzaXplWzBdXSA9Ci0gICAgICAgICAgICBkYXRhWzBdWzMrMipsaW5lc2l6ZVswXV0gPQotICAgICAgICAgICAgZGF0YVswXVsyKzMqbGluZXNpemVbMF1dID0KLSAgICAgICAgICAgIGRhdGFbMF1bMyszKmxpbmVzaXplWzBdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciplbnRyeV9zaXplKzNdOworICAgIGRhdGFbMF1bMiArIDIgKiBsaW5lc2l6ZVswXV0gPQorICAgIGRhdGFbMF1bMyArIDIgKiBsaW5lc2l6ZVswXV0gPQorICAgIGRhdGFbMF1bMiArIDMgKiBsaW5lc2l6ZVswXV0gPQorICAgIGRhdGFbMF1bMyArIDMgKiBsaW5lc2l6ZVswXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IgKiBlbnRyeV9zaXplICsgM107CiAKLSAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICBpZiAocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgIGRhdGFbMV1bMF0gPQotICAgICAgICAgICAgZGF0YVsxXVsxXSA9Ci0gICAgICAgICAgICBkYXRhWzFdWyAgICBsaW5lc2l6ZVsxXV0gPQotICAgICAgICAgICAgZGF0YVsxXVsxKyAgbGluZXNpemVbMV1dID0gaW5mby0+djFfY29kZWJvb2tbdjFfdmVjdG9yKmVudHJ5X3NpemUrNF07CisgICAgICAgIGRhdGFbMV1bMV0gPQorICAgICAgICBkYXRhWzFdWyAgICBsaW5lc2l6ZVsxXV0gPQorICAgICAgICBkYXRhWzFdWzEgKyBsaW5lc2l6ZVsxXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IgKiBlbnRyeV9zaXplICsgNF07CiAKICAgICAgICAgZGF0YVsyXVswXSA9Ci0gICAgICAgICAgICBkYXRhWzJdWzFdID0KLSAgICAgICAgICAgIGRhdGFbMl1bICAgIGxpbmVzaXplWzJdXSA9Ci0gICAgICAgICAgICBkYXRhWzJdWzErICBsaW5lc2l6ZVsyXV0gPSBpbmZvLT52MV9jb2RlYm9va1t2MV92ZWN0b3IqZW50cnlfc2l6ZSs1XTsKKyAgICAgICAgZGF0YVsyXVsxXSA9CisgICAgICAgIGRhdGFbMl1bICAgIGxpbmVzaXplWzJdXSA9CisgICAgICAgIGRhdGFbMl1bMSArIGxpbmVzaXplWzJdXSA9IGluZm8tPnYxX2NvZGVib29rW3YxX3ZlY3RvciAqIGVudHJ5X3NpemUgKyA1XTsKICAgICB9CiB9CiAKLS8vZGVjb2RlcyB0aGUgVjQgdmVjdG9ycyBpbiBtYiBpbnRvIHRoZSA0eDQgTUIgcG9pbnRlZCB0byBieSBkYXRhCisvLyBkZWNvZGVzIHRoZSBWNCB2ZWN0b3JzIGluIG1iIGludG8gdGhlIDR4NCBNQiBwb2ludGVkIHRvIGJ5IGRhdGEKIHN0YXRpYyB2b2lkIGRlY29kZV92NF92ZWN0b3IoQ2luZXBha0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRhdGFbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZVs0XSwgaW50ICp2NF92ZWN0b3IsIHN0cmlwX2luZm8gKmluZm8pCiB7CiAgICAgaW50IGksIHgsIHksIGVudHJ5X3NpemUgPSBzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA2IDogNDsKIAotICAgIGZvcihpID0geSA9IDA7IHkgPCA0OyB5ICs9IDIpIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgNDsgeCArPSAyLCBpKyspIHsKLSAgICAgICAgICAgIGRhdGFbMF1beCAgICsgICAgIHkqbGluZXNpemVbMF1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemVdOwotICAgICAgICAgICAgZGF0YVswXVt4KzEgKyAgICAgeSpsaW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0qZW50cnlfc2l6ZSsxXTsKLSAgICAgICAgICAgIGRhdGFbMF1beCAgICsgKHkrMSkqbGluZXNpemVbMF1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrMl07Ci0gICAgICAgICAgICBkYXRhWzBdW3grMSArICh5KzEpKmxpbmVzaXplWzBdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSplbnRyeV9zaXplKzNdOworICAgIGZvciAoaSA9IHkgPSAwOyB5IDwgNDsgeSArPSAyKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4ICs9IDIsIGkrKykgeworICAgICAgICAgICAgZGF0YVswXVt4ICAgICArICB5ICAgICAgKiBsaW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0gKiBlbnRyeV9zaXplXTsKKyAgICAgICAgICAgIGRhdGFbMF1beCArIDEgKyAgeSAgICAgICogbGluZXNpemVbMF1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldICogZW50cnlfc2l6ZSArIDFdOworICAgICAgICAgICAgZGF0YVswXVt4ICAgICArICh5ICsgMSkgKiBsaW5lc2l6ZVswXV0gPSBpbmZvLT52NF9jb2RlYm9va1t2NF92ZWN0b3JbaV0gKiBlbnRyeV9zaXplICsgMl07CisgICAgICAgICAgICBkYXRhWzBdW3ggKyAxICsgKHkgKyAxKSAqIGxpbmVzaXplWzBdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSAqIGVudHJ5X3NpemUgKyAzXTsKIAotICAgICAgICAgICAgaWYocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7Ci0gICAgICAgICAgICAgICAgZGF0YVsxXVsoeD4+MSkgKyAoeT4+MSkqbGluZXNpemVbMV1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrNF07Ci0gICAgICAgICAgICAgICAgZGF0YVsyXVsoeD4+MSkgKyAoeT4+MSkqbGluZXNpemVbMl1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldKmVudHJ5X3NpemUrNV07CisgICAgICAgICAgICBpZiAocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CisgICAgICAgICAgICAgICAgZGF0YVsxXVsoeCA+PiAxKSArICh5ID4+IDEpICogbGluZXNpemVbMV1dID0gaW5mby0+djRfY29kZWJvb2tbdjRfdmVjdG9yW2ldICogZW50cnlfc2l6ZSArIDRdOworICAgICAgICAgICAgICAgIGRhdGFbMl1bKHggPj4gMSkgKyAoeSA+PiAxKSAqIGxpbmVzaXplWzJdXSA9IGluZm8tPnY0X2NvZGVib29rW3Y0X3ZlY3RvcltpXSAqIGVudHJ5X3NpemUgKyA1XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTYwNywxOSArNTI2LDE2IEBACiB7CiAgICAgaW50IHksIHA7CiAKLSAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFOyB5KyspIHsKLSAgICAgICAgbWVtY3B5KGFfZGF0YVswXSt5KmFfbGluZXNpemVbMF0sIGJfZGF0YVswXSt5KmJfbGluZXNpemVbMF0sCisgICAgZm9yICh5ID0gMDsgeSA8IE1CX1NJWkU7IHkrKykKKyAgICAgICAgbWVtY3B5KGFfZGF0YVswXSArIHkgKiBhX2xpbmVzaXplWzBdLCBiX2RhdGFbMF0gKyB5ICogYl9saW5lc2l6ZVswXSwKICAgICAgICAgICAgICAgIE1CX1NJWkUpOwotICAgIH0KIAotICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkgewotICAgICAgICBmb3IocCA9IDE7IHAgPD0gMjsgcCsrKSB7Ci0gICAgICAgICAgICBmb3IoeSA9IDA7IHkgPCBNQl9TSVpFLzI7IHkrKykgewotICAgICAgICAgICAgICAgIG1lbWNweShhX2RhdGFbcF0gKyB5KmFfbGluZXNpemVbcF0sCi0gICAgICAgICAgICAgICAgICAgICAgIGJfZGF0YVtwXSArIHkqYl9saW5lc2l6ZVtwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgTUJfU0laRS8yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGlmIChzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICAgICAgZm9yIChwID0gMTsgcCA8PSAyOyBwKyspCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgTUJfU0laRSAvIDI7IHkrKykKKyAgICAgICAgICAgICAgICBtZW1jcHkoYV9kYXRhW3BdICsgeSAqIGFfbGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgIGJfZGF0YVtwXSArIHkgKiBiX2xpbmVzaXplW3BdLAorICAgICAgICAgICAgICAgICAgICAgICBNQl9TSVpFIC8gMik7CiAgICAgfQogfQogCkBAIC02MzAsNzQgKzU0Niw3MSBAQAogewogICAgIGludCB4LCB5LCB6LCBmbGFncywgYml0cywgdGVtcF9zaXplLCBoZWFkZXJfb2ZzLCByZXQgPSAwLCBtYl9jb3VudCA9IHMtPncgKiBoIC8gTUJfQVJFQTsKICAgICBpbnQgbmVlZHNfZXh0cmFfYml0LCBzaG91bGRfd3JpdGVfdGVtcDsKLSAgICB1bnNpZ25lZCBjaGFyIHRlbXBbNjRdOyAvLzMyLzIgPSAxNiBWNCBibG9ja3MgYXQgNCBCIGVhY2ggLT4gNjQgQgorICAgIHVuc2lnbmVkIGNoYXIgdGVtcFs2NF07IC8vIDMyLzIgPSAxNiBWNCBibG9ja3MgYXQgNCBCIGVhY2ggLT4gNjQgQgogICAgIG1iX2luZm8gKm1iOwotICAgIHVpbnQ4X3QgKnN1Yl9zY3JhdGNoX2RhdGFbNF0gPSB7MH0sICpzdWJfbGFzdF9kYXRhWzRdID0gezB9OwotICAgIGludCBzdWJfc2NyYXRjaF9saW5lc2l6ZVs0XSA9IHswfSwgc3ViX2xhc3RfbGluZXNpemVbNF0gPSB7MH07CisgICAgdWludDhfdCAqc3ViX3NjcmF0Y2hfZGF0YVs0XSA9IHsgMCB9LCAqc3ViX2xhc3RfZGF0YVs0XSA9IHsgMCB9OworICAgIGludCBzdWJfc2NyYXRjaF9saW5lc2l6ZVs0XSA9IHsgMCB9LCBzdWJfbGFzdF9saW5lc2l6ZVs0XSA9IHsgMCB9OwogCi0gICAgLy9lbmNvZGUgY29kZWJvb2tzCi0vLy8vLy8gTWFjT1MgdmludGFnZSBkZWNvZGVyIGNvbXBhdGliaWxpdHkgZGljdGF0ZXMgdGhlIHByZXNlbmNlIG9mCi0vLy8vLy8gdGhlIGNvZGVib29rIGNodW5rIGV2ZW4gd2hlbiB0aGUgY29kZWJvb2sgaXMgZW1wdHkgLSBwcmV0dHkgZHVtYi4uLgotLy8vLy8vIGFuZCBhbHNvIHRoZSBjZXJ0YWluIG9yZGVyIG9mIHRoZSBjb2RlYm9vayBjaHVua3MgLS0gcmwKLSAgICBpZihpbmZvLT52NF9zaXplIHx8ICFzLT5za2lwX2VtcHR5X2NiKQorICAgIC8vIGVuY29kZSBjb2RlYm9va3MKKyAgICAvLy8vLy8gTWFjT1MgdmludGFnZSBkZWNvZGVyIGNvbXBhdGliaWxpdHkgZGljdGF0ZXMgdGhlIHByZXNlbmNlIG9mCisgICAgLy8vLy8vIHRoZSBjb2RlYm9vayBjaHVuayBldmVuIHdoZW4gdGhlIGNvZGVib29rIGlzIGVtcHR5IC0gcHJldHR5IGR1bWIuLi4KKyAgICAvLy8vLy8gYW5kIGFsc28gdGhlIGNlcnRhaW4gb3JkZXIgb2YgdGhlIGNvZGVib29rIGNodW5rcyAtLSBybAorICAgIGlmIChpbmZvLT52NF9zaXplIHx8ICFzLT5za2lwX2VtcHR5X2NiKQogICAgICAgICByZXQgKz0gZW5jb2RlX2NvZGVib29rKHMsIGluZm8tPnY0X2NvZGVib29rLCBpbmZvLT52NF9zaXplLCAweDIwLCAweDI0LCBidWYgKyByZXQpOwogCi0gICAgaWYoaW5mby0+djFfc2l6ZSB8fCAhcy0+c2tpcF9lbXB0eV9jYikKKyAgICBpZiAoaW5mby0+djFfc2l6ZSB8fCAhcy0+c2tpcF9lbXB0eV9jYikKICAgICAgICAgcmV0ICs9IGVuY29kZV9jb2RlYm9vayhzLCBpbmZvLT52MV9jb2RlYm9vaywgaW5mby0+djFfc2l6ZSwgMHgyMiwgMHgyNiwgYnVmICsgcmV0KTsKIAotICAgIC8vdXBkYXRlIHNjcmF0Y2ggcGljdHVyZQotICAgIGZvcih6ID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCB6KyspIHsKKyAgICAvLyB1cGRhdGUgc2NyYXRjaCBwaWN0dXJlCisgICAgZm9yICh6ID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsIHorKykgewogICAgICAgICAgICAgbWIgPSAmcy0+bWJbel07CiAKICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBzY3JhdGNoX2RhdGEsIHNjcmF0Y2hfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3NjcmF0Y2hfZGF0YSwgc3ViX3NjcmF0Y2hfbGluZXNpemUpOwogCi0gICAgICAgICAgICBpZihpbmZvLT5tb2RlID09IE1PREVfTUMgJiYgbWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1NLSVApIHsKLSAgICAgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9kYXRhLCBsYXN0X2xpbmVzaXplLAorICAgICAgICAgICAgaWYgKGluZm8tPm1vZGUgPT0gTU9ERV9NQyAmJiBtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCkgeworICAgICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBsYXN0X2RhdGEsIGxhc3RfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9sYXN0X2RhdGEsIHN1Yl9sYXN0X2xpbmVzaXplKTsKICAgICAgICAgICAgICAgICBjb3B5X21iKHMsIHN1Yl9zY3JhdGNoX2RhdGEsIHN1Yl9zY3JhdGNoX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2xhc3RfZGF0YSwgc3ViX2xhc3RfbGluZXNpemUpOwotICAgICAgICAgICAgfSBlbHNlIGlmKGluZm8tPm1vZGUgPT0gTU9ERV9WMV9PTkxZIHx8IG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby0+bW9kZSA9PSBNT0RFX1YxX09OTFkgfHwgbWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQogICAgICAgICAgICAgICAgIGRlY29kZV92MV92ZWN0b3Iocywgc3ViX3NjcmF0Y2hfZGF0YSwgc3ViX3NjcmF0Y2hfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYi0+djFfdmVjdG9yLCBpbmZvKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBkZWNvZGVfdjRfdmVjdG9yKHMsIHN1Yl9zY3JhdGNoX2RhdGEsIHN1Yl9zY3JhdGNoX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWItPnY0X3ZlY3RvciwgaW5mbyk7CiAgICAgICAgIH0KLSAgICB9CiAKLSAgICBzd2l0Y2goaW5mby0+bW9kZSkgeworICAgIHN3aXRjaCAoaW5mby0+bW9kZSkgewogICAgIGNhc2UgTU9ERV9WMV9PTkxZOgotICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtYl9jb3VudCA9ICVpXG4iLCBtYl9jb3VudCk7CiAgICAgICAgIHJldCArPSB3cml0ZV9jaHVua19oZWFkZXIoYnVmICsgcmV0LCAweDMyLCBtYl9jb3VudCk7CiAKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgbWJfY291bnQ7IHgrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IG1iX2NvdW50OyB4KyspCiAgICAgICAgICAgICBidWZbcmV0KytdID0gcy0+bWJbeF0udjFfdmVjdG9yOwogCiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTU9ERV9WMV9WNDoKLSAgICAgICAgLy9yZW1lbWJlciBoZWFkZXIgcG9zaXRpb24KKyAgICAgICAgLy8gcmVtZW1iZXIgaGVhZGVyIHBvc2l0aW9uCiAgICAgICAgIGhlYWRlcl9vZnMgPSByZXQ7Ci0gICAgICAgIHJldCArPSBDSFVOS19IRUFERVJfU0laRTsKKyAgICAgICAgcmV0ICAgICAgICs9IENIVU5LX0hFQURFUl9TSVpFOwogCi0gICAgICAgIGZvcih4ID0gMDsgeCA8IG1iX2NvdW50OyB4ICs9IDMyKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBtYl9jb3VudDsgeCArPSAzMikgewogICAgICAgICAgICAgZmxhZ3MgPSAwOwotICAgICAgICAgICAgZm9yKHkgPSB4OyB5IDwgRkZNSU4oeCszMiwgbWJfY291bnQpOyB5KyspCi0gICAgICAgICAgICAgICAgaWYocy0+bWJbeV0uYmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCisgICAgICAgICAgICBmb3IgKHkgPSB4OyB5IDwgRkZNSU4oeCArIDMyLCBtYl9jb3VudCk7IHkrKykKKyAgICAgICAgICAgICAgICBpZiAocy0+bWJbeV0uYmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCiAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IDEgPDwgKDMxIC0geSArIHgpOwogCiAgICAgICAgICAgICBBVl9XQjMyKCZidWZbcmV0XSwgZmxhZ3MpOwogICAgICAgICAgICAgcmV0ICs9IDQ7CiAKLSAgICAgICAgICAgIGZvcih5ID0geDsgeSA8IEZGTUlOKHgrMzIsIG1iX2NvdW50KTsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHkgPSB4OyB5IDwgRkZNSU4oeCArIDMyLCBtYl9jb3VudCk7IHkrKykgewogICAgICAgICAgICAgICAgIG1iID0gJnMtPm1iW3ldOwogCi0gICAgICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQorICAgICAgICAgICAgICAgIGlmIChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjEpCiAgICAgICAgICAgICAgICAgICAgIGJ1ZltyZXQrK10gPSBtYi0+djFfdmVjdG9yOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZm9yKHogPSAwOyB6IDwgNDsgeisrKQorICAgICAgICAgICAgICAgICAgICBmb3IgKHogPSAwOyB6IDwgNDsgeisrKQogICAgICAgICAgICAgICAgICAgICAgICAgYnVmW3JldCsrXSA9IG1iLT52NF92ZWN0b3Jbel07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTcwNiw1NiArNjE5LDU2IEBACiAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNT0RFX01DOgotICAgICAgICAvL3JlbWVtYmVyIGhlYWRlciBwb3NpdGlvbgorICAgICAgICAvLyByZW1lbWJlciBoZWFkZXIgcG9zaXRpb24KICAgICAgICAgaGVhZGVyX29mcyA9IHJldDsKLSAgICAgICAgcmV0ICs9IENIVU5LX0hFQURFUl9TSVpFOwotICAgICAgICBmbGFncyA9IGJpdHMgPSB0ZW1wX3NpemUgPSAwOworICAgICAgICByZXQgICAgICAgKz0gQ0hVTktfSEVBREVSX1NJWkU7CisgICAgICAgIGZsYWdzICAgICAgPSBiaXRzID0gdGVtcF9zaXplID0gMDsKIAotICAgICAgICBmb3IoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7Ci0gICAgICAgICAgICBtYiA9ICZzLT5tYlt4XTsKLSAgICAgICAgICAgIGZsYWdzIHw9IChtYi0+YmVzdF9lbmNvZGluZyAhPSBFTkNfU0tJUCkgPDwgKDMxIC0gYml0cysrKTsKLSAgICAgICAgICAgIG5lZWRzX2V4dHJhX2JpdCA9IDA7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBtYl9jb3VudDsgeCsrKSB7CisgICAgICAgICAgICBtYiAgICAgICAgICAgICAgICA9ICZzLT5tYlt4XTsKKyAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgfD0gKG1iLT5iZXN0X2VuY29kaW5nICE9IEVOQ19TS0lQKSA8PCAoMzEgLSBiaXRzKyspOworICAgICAgICAgICAgbmVlZHNfZXh0cmFfYml0ICAgPSAwOwogICAgICAgICAgICAgc2hvdWxkX3dyaXRlX3RlbXAgPSAwOwogCi0gICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyAhPSBFTkNfU0tJUCkgewotICAgICAgICAgICAgICAgIGlmKGJpdHMgPCAzMikKKyAgICAgICAgICAgIGlmIChtYi0+YmVzdF9lbmNvZGluZyAhPSBFTkNfU0tJUCkgeworICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgMzIpCiAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpIDw8ICgzMSAtIGJpdHMrKyk7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBuZWVkc19leHRyYV9iaXQgPSAxOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZihiaXRzID09IDMyKSB7CisgICAgICAgICAgICBpZiAoYml0cyA9PSAzMikgewogICAgICAgICAgICAgICAgIEFWX1dCMzIoJmJ1ZltyZXRdLCBmbGFncyk7Ci0gICAgICAgICAgICAgICAgcmV0ICs9IDQ7CisgICAgICAgICAgICAgICAgcmV0ICArPSA0OwogICAgICAgICAgICAgICAgIGZsYWdzID0gYml0cyA9IDA7CiAKLSAgICAgICAgICAgICAgICBpZihtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfU0tJUCB8fCBuZWVkc19leHRyYV9iaXQpIHsKKyAgICAgICAgICAgICAgICBpZiAobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1NLSVAgfHwgbmVlZHNfZXh0cmFfYml0KSB7CiAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmYnVmW3JldF0sIHRlbXAsIHRlbXBfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldCArPSB0ZW1wX3NpemU7CisgICAgICAgICAgICAgICAgICAgIHJldCAgICAgICs9IHRlbXBfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgdGVtcF9zaXplID0gMDsKICAgICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICAgICAgc2hvdWxkX3dyaXRlX3RlbXAgPSAxOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZihuZWVkc19leHRyYV9iaXQpIHsKKyAgICAgICAgICAgIGlmIChuZWVkc19leHRyYV9iaXQpIHsKICAgICAgICAgICAgICAgICBmbGFncyA9IChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpIDw8IDMxOwotICAgICAgICAgICAgICAgIGJpdHMgPSAxOworICAgICAgICAgICAgICAgIGJpdHMgID0gMTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYobWItPmJlc3RfZW5jb2RpbmcgPT0gRU5DX1YxKQorICAgICAgICAgICAgaWYgKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKICAgICAgICAgICAgICAgICB0ZW1wW3RlbXBfc2l6ZSsrXSA9IG1iLT52MV92ZWN0b3I7Ci0gICAgICAgICAgICBlbHNlIGlmKG1iLT5iZXN0X2VuY29kaW5nID09IEVOQ19WNCkKLSAgICAgICAgICAgICAgICBmb3IoeiA9IDA7IHogPCA0OyB6KyspCisgICAgICAgICAgICBlbHNlIGlmIChtYi0+YmVzdF9lbmNvZGluZyA9PSBFTkNfVjQpCisgICAgICAgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IDQ7IHorKykKICAgICAgICAgICAgICAgICAgICAgdGVtcFt0ZW1wX3NpemUrK10gPSBtYi0+djRfdmVjdG9yW3pdOwogCi0gICAgICAgICAgICBpZihzaG91bGRfd3JpdGVfdGVtcCkgeworICAgICAgICAgICAgaWYgKHNob3VsZF93cml0ZV90ZW1wKSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KCZidWZbcmV0XSwgdGVtcCwgdGVtcF9zaXplKTsKLSAgICAgICAgICAgICAgICByZXQgKz0gdGVtcF9zaXplOworICAgICAgICAgICAgICAgIHJldCAgICAgICs9IHRlbXBfc2l6ZTsKICAgICAgICAgICAgICAgICB0ZW1wX3NpemUgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYoYml0cyA+IDApIHsKKyAgICAgICAgaWYgKGJpdHMgPiAwKSB7CiAgICAgICAgICAgICBBVl9XQjMyKCZidWZbcmV0XSwgZmxhZ3MpOwogICAgICAgICAgICAgcmV0ICs9IDQ7CiAgICAgICAgICAgICBtZW1jcHkoJmJ1ZltyZXRdLCB0ZW1wLCB0ZW1wX3NpemUpOwpAQCAtNzcwLDI4ICs2ODMsMjYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0vL2NvbXB1dGVzIGRpc3RvcnRpb24gb2YgNHg0IE1CIGluIGIgY29tcGFyZWQgdG8gYQorLy8gY29tcHV0ZXMgZGlzdG9ydGlvbiBvZiA0eDQgTUIgaW4gYiBjb21wYXJlZCB0byBhCiBzdGF0aWMgaW50IGNvbXB1dGVfbWJfZGlzdG9ydGlvbihDaW5lcGFrRW5jQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmFfZGF0YVs0XSwgaW50IGFfbGluZXNpemVbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpiX2RhdGFbNF0sIGludCBiX2xpbmVzaXplWzRdKQogewogICAgIGludCB4LCB5LCBwLCBkLCByZXQgPSAwOwogCi0gICAgZm9yKHkgPSAwOyB5IDwgTUJfU0laRTsgeSsrKSB7Ci0gICAgICAgIGZvcih4ID0gMDsgeCA8IE1CX1NJWkU7IHgrKykgewotICAgICAgICAgICAgZCA9IGFfZGF0YVswXVt4ICsgeSphX2xpbmVzaXplWzBdXSAtIGJfZGF0YVswXVt4ICsgeSpiX2xpbmVzaXplWzBdXTsKLSAgICAgICAgICAgIHJldCArPSBkKmQ7CisgICAgZm9yICh5ID0gMDsgeSA8IE1CX1NJWkU7IHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IE1CX1NJWkU7IHgrKykgeworICAgICAgICAgICAgZCA9IGFfZGF0YVswXVt4ICsgeSAqIGFfbGluZXNpemVbMF1dIC0gYl9kYXRhWzBdW3ggKyB5ICogYl9saW5lc2l6ZVswXV07CisgICAgICAgICAgICByZXQgKz0gZCAqIGQ7CiAgICAgICAgIH0KLSAgICB9CiAKLSAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKLSAgICAgICAgZm9yKHAgPSAxOyBwIDw9IDI7IHArKykgewotICAgICAgICAgICAgZm9yKHkgPSAwOyB5IDwgTUJfU0laRS8yOyB5KyspIHsKLSAgICAgICAgICAgICAgICBmb3IoeCA9IDA7IHggPCBNQl9TSVpFLzI7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBkID0gYV9kYXRhW3BdW3ggKyB5KmFfbGluZXNpemVbcF1dIC0gYl9kYXRhW3BdW3ggKyB5KmJfbGluZXNpemVbcF1dOwotICAgICAgICAgICAgICAgICAgICByZXQgKz0gZCpkOworICAgIGlmIChzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICAgICAgZm9yIChwID0gMTsgcCA8PSAyOyBwKyspIHsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBNQl9TSVpFIC8gMjsgeSsrKQorICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBNQl9TSVpFIC8gMjsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGQgPSBhX2RhdGFbcF1beCArIHkgKiBhX2xpbmVzaXplW3BdXSAtIGJfZGF0YVtwXVt4ICsgeSAqIGJfbGluZXNpemVbcF1dOworICAgICAgICAgICAgICAgICAgICByZXQgKz0gZCAqIGQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC03OTksMTE0ICs3MTAsMTA4IEBACiB9CiAKIC8vIHJldHVybiB0aGUgcG9zc2libHkgYWRqdXN0ZWQgc2l6ZSBvZiB0aGUgY29kZWJvb2sKLSNkZWZpbmUgQ0VSVEFJTih4KSAoKHgpIT1FTkNfVU5DRVJUQUlOKQotc3RhdGljIGludCBxdWFudGl6ZShDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGFbNF0sIGludCBsaW5lc2l6ZVs0XSwKLSAgICAgICAgICAgICAgICAgICAgaW50IHYxbW9kZSwgc3RyaXBfaW5mbyAqaW5mbywKKyNkZWZpbmUgQ0VSVEFJTih4KSAoKHgpICE9IEVOQ19VTkNFUlRBSU4pCitzdGF0aWMgaW50IHF1YW50aXplKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgaCwgdWludDhfdCAqZGF0YVs0XSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplWzRdLCBpbnQgdjFtb2RlLCBzdHJpcF9pbmZvICppbmZvLAogICAgICAgICAgICAgICAgICAgICBtYl9lbmNvZGluZyBlbmNvZGluZykKIHsKICAgICBpbnQgeCwgeSwgaSwgaiwgaywgeDIsIHkyLCB4MywgeTMsIHBsYW5lLCBzaGlmdCwgbWJuOwotICAgIGludCBlbnRyeV9zaXplID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7Ci0gICAgaW50ICpjb2RlYm9vayA9IHYxbW9kZSA/IGluZm8tPnYxX2NvZGVib29rIDogaW5mby0+djRfY29kZWJvb2s7Ci0gICAgaW50IHNpemUgPSB2MW1vZGUgPyBpbmZvLT52MV9zaXplIDogaW5mby0+djRfc2l6ZTsKKyAgICBpbnQgZW50cnlfc2l6ZSAgICAgID0gcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0ID8gNiA6IDQ7CisgICAgaW50ICpjb2RlYm9vayAgICAgICA9IHYxbW9kZSA/IGluZm8tPnYxX2NvZGVib29rIDogaW5mby0+djRfY29kZWJvb2s7CisgICAgaW50IHNpemUgICAgICAgICAgICA9IHYxbW9kZSA/IGluZm8tPnYxX3NpemUgOiBpbmZvLT52NF9zaXplOwogICAgIGludDY0X3QgdG90YWxfZXJyb3IgPSAwOwotICAgIHVpbnQ4X3QgdnFfcGljdF9idWZbKE1CX0FSRUEqMykvMl07Ci0gICAgdWludDhfdCAqc3ViX2RhdGEgICAgWzRdLCAqdnFfZGF0YSAgICBbNF07CisgICAgdWludDhfdCB2cV9waWN0X2J1ZlsoTUJfQVJFQSAqIDMpIC8gMl07CisgICAgdWludDhfdCAgICAgKnN1Yl9kYXRhWzRdLCAgICAgKnZxX2RhdGFbNF07CiAgICAgaW50ICAgICAgc3ViX2xpbmVzaXplWzRdLCAgdnFfbGluZXNpemVbNF07CiAKLSAgICBmb3IobWJuID0gaSA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKSB7Ci0gICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gTUJfU0laRSwgKyttYm4pIHsKKyAgICBmb3IgKG1ibiA9IGkgPSB5ID0gMDsgeSA8IGg7IHkgKz0gTUJfU0laRSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCArK21ibikgewogICAgICAgICAgICAgaW50ICpiYXNlOwogCi0gICAgICAgICAgICBpZihDRVJUQUlOKGVuY29kaW5nKSkgewotLy8gdXNlIGZvciB0aGUgdHJhaW5pbmcgb25seSB0aGUgYmxvY2tzIGtub3duIHRvIGJlIHRvIGJlIGVuY29kZWQgW3NpYzotXQotICAgICAgICAgICAgICAgaWYocy0+bWJbbWJuXS5iZXN0X2VuY29kaW5nICE9IGVuY29kaW5nKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChDRVJUQUlOKGVuY29kaW5nKSkgeworICAgICAgICAgICAgICAgIC8vIHVzZSBmb3IgdGhlIHRyYWluaW5nIG9ubHkgdGhlIGJsb2NrcyBrbm93biB0byBiZSB0byBiZSBlbmNvZGVkIFtzaWM6LV0KKyAgICAgICAgICAgICAgICBpZiAocy0+bWJbbWJuXS5iZXN0X2VuY29kaW5nICE9IGVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYmFzZSA9IHMtPmNvZGVib29rX2lucHV0ICsgaSplbnRyeV9zaXplOwotICAgICAgICAgICAgaWYodjFtb2RlKSB7Ci0gICAgICAgICAgICAgICAgLy9zdWJzYW1wbGUKLSAgICAgICAgICAgICAgICBmb3IoaiA9IHkyID0gMDsgeTIgPCBlbnRyeV9zaXplOyB5MiArPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvcih4MiA9IDA7IHgyIDwgNDsgeDIgKz0gMiwgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSA9IHkyIDwgNCA/IDAgOiAxICsgKHgyID4+IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgPSB5MiA8IDQgPyAwIDogMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHgzID0gc2hpZnQgPyAwIDogeDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5MyA9IHNoaWZ0ID8gMCA6IHkyOwotICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVtqXSA9IChkYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArICAgICAgKCh5K3kzKSA+PiBzaGlmdCkgICAgICAqIGxpbmVzaXplW3BsYW5lXV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArIDEgKyAgKCh5K3kzKSA+PiBzaGlmdCkgICAgICAqIGxpbmVzaXplW3BsYW5lXV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArICAgICAoKCh5K3kzKSA+PiBzaGlmdCkgKyAxKSAqIGxpbmVzaXplW3BsYW5lXV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3BsYW5lXVsoKHgreDMpID4+IHNoaWZ0KSArIDEgKyAoKCh5K3kzKSA+PiBzaGlmdCkgKyAxKSAqIGxpbmVzaXplW3BsYW5lXV0pID4+IDI7CisgICAgICAgICAgICBiYXNlID0gcy0+Y29kZWJvb2tfaW5wdXQgKyBpICogZW50cnlfc2l6ZTsKKyAgICAgICAgICAgIGlmICh2MW1vZGUpIHsKKyAgICAgICAgICAgICAgICAvLyBzdWJzYW1wbGUKKyAgICAgICAgICAgICAgICBmb3IgKGogPSB5MiA9IDA7IHkyIDwgZW50cnlfc2l6ZTsgeTIgKz0gMikKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4MiA9IDA7IHgyIDwgNDsgeDIgKz0gMiwgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZSAgID0geTIgPCA0ID8gMCA6IDEgKyAoeDIgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdCAgID0geTIgPCA0ID8gMCA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB4MyAgICAgID0gc2hpZnQgPyAwIDogeDI7CisgICAgICAgICAgICAgICAgICAgICAgICB5MyAgICAgID0gc2hpZnQgPyAwIDogeTI7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlW2pdID0gKGRhdGFbcGxhbmVdWygoeCArIHgzKSA+PiBzaGlmdCkgKyAgICAgICgoeSArIHkzKSA+PiBzaGlmdCkgICAgICAqIGxpbmVzaXplW3BsYW5lXV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3BsYW5lXVsoKHggKyB4MykgPj4gc2hpZnQpICsgMSArICAoKHkgKyB5MykgPj4gc2hpZnQpICAgICAgKiBsaW5lc2l6ZVtwbGFuZV1dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtwbGFuZV1bKCh4ICsgeDMpID4+IHNoaWZ0KSArICAgICAoKCh5ICsgeTMpID4+IHNoaWZ0KSArIDEpICogbGluZXNpemVbcGxhbmVdXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbcGxhbmVdWygoeCArIHgzKSA+PiBzaGlmdCkgKyAxICsgKCgoeSArIHkzKSA+PiBzaGlmdCkgKyAxKSAqIGxpbmVzaXplW3BsYW5lXV0pID4+IDI7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vY29weQotICAgICAgICAgICAgICAgIGZvcihqID0geTIgPSAwOyB5MiA8IE1CX1NJWkU7IHkyICs9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yKHgyID0gMDsgeDIgPCBNQl9TSVpFOyB4MiArPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IoayA9IDA7IGsgPCBlbnRyeV9zaXplOyBrKyssIGorKykgeworICAgICAgICAgICAgICAgIC8vIGNvcHkKKyAgICAgICAgICAgICAgICBmb3IgKGogPSB5MiA9IDA7IHkyIDwgTUJfU0laRTsgeTIgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHgyID0gMDsgeDIgPCBNQl9TSVpFOyB4MiArPSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGVudHJ5X3NpemU7IGsrKywgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUgPSBrID49IDQgPyBrIC0gMyA6IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihrID49IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDMgPSAoeCt4MikgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTMgPSAoeSt5MikgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA+PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzID0gKHggKyB4MikgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTMgPSAoeSArIHkyKSA+PiAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgzID0geCArIHgyICsgKGsgJiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTMgPSB5ICsgeTIgKyAoayA+PiAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlW2pdID0gZGF0YVtwbGFuZV1beDMgKyB5MypsaW5lc2l6ZVtwbGFuZV1dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vbal0gPSBkYXRhW3BsYW5lXVt4MyArIHkzICogbGluZXNpemVbcGxhbmVdXTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGkgKz0gdjFtb2RlID8gMSA6IDQ7CiAgICAgICAgIH0KICAgICB9Ci0vLyAgICBpZihpIDwgbWJuKih2MW1vZGUgPyAxIDogNCkpIHsKLS8vICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAicmVkdWNpbmcgdHJhaW5pbmcgc2V0IGZvciAlcyBmcm9tICVpIHRvICVpIChlbmNvZGluZyAlaSlcbiIsIHYxbW9kZT8idjEiOiJ2NCIsIG1ibioodjFtb2RlID8gMSA6IDQpLCBpLCBlbmNvZGluZyk7Ci0vLyAgICB9CiAKLSAgICBpZihpID09IDApIC8vIGVtcHR5IHRyYWluaW5nIHNldCwgbm90aGluZyB0byBkbworICAgIGlmIChpID09IDApIC8vIGVtcHR5IHRyYWluaW5nIHNldCwgbm90aGluZyB0byBkbwogICAgICAgICByZXR1cm4gMDsKLSAgICBpZihpIDwgc2l6ZSkgewotICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgKENFUlRBSU4oZW5jb2RpbmcpID8gQVZfTE9HX0VSUk9SIDogQVZfTE9HX0lORk8pLCAiV09VTEQgV0FTVEU6ICVzIGNic2l6ZSAlaSBiaWdnZXIgdGhhbiB0cmFpbmluZyBzZXQgc2l6ZSAlaSAoZW5jb2RpbmcgJWkpXG4iLCB2MW1vZGU/InYxIjoidjQiLCBzaXplLCBpLCBlbmNvZGluZyk7CisgICAgaWYgKGkgPCBzaXplKQogICAgICAgICBzaXplID0gaTsKLSAgICB9CiAKICAgICBhdnByaXZfaW5pdF9lbGJnKHMtPmNvZGVib29rX2lucHV0LCBlbnRyeV9zaXplLCBpLCBjb2RlYm9vaywgc2l6ZSwgMSwgcy0+Y29kZWJvb2tfY2xvc2VzdCwgJnMtPnJhbmRjdHgpOwogICAgIGF2cHJpdl9kb19lbGJnKHMtPmNvZGVib29rX2lucHV0LCBlbnRyeV9zaXplLCBpLCBjb2RlYm9vaywgc2l6ZSwgMSwgcy0+Y29kZWJvb2tfY2xvc2VzdCwgJnMtPnJhbmRjdHgpOwogCi0gICAgLy9zZXR1cCB2cV9kYXRhLCB3aGljaCBjb250YWlucyBhIHNpbmdsZSBNQgotICAgIHZxX2RhdGFbMF0gPSB2cV9waWN0X2J1ZjsKKyAgICAvLyBzZXQgdXAgdnFfZGF0YSwgd2hpY2ggY29udGFpbnMgYSBzaW5nbGUgTUIKKyAgICB2cV9kYXRhWzBdICAgICA9IHZxX3BpY3RfYnVmOwogICAgIHZxX2xpbmVzaXplWzBdID0gTUJfU0laRTsKLSAgICB2cV9kYXRhWzFdID0gJnZxX3BpY3RfYnVmW01CX0FSRUFdOwotICAgIHZxX2RhdGFbMl0gPSB2cV9kYXRhWzFdICsgKE1CX0FSRUEgPj4gMik7Ci0gICAgdnFfbGluZXNpemVbMV0gPSB2cV9saW5lc2l6ZVsyXSA9IE1CX1NJWkUgPj4gMTsKKyAgICB2cV9kYXRhWzFdICAgICA9ICZ2cV9waWN0X2J1ZltNQl9BUkVBXTsKKyAgICB2cV9kYXRhWzJdICAgICA9IHZxX2RhdGFbMV0gKyAoTUJfQVJFQSA+PiAyKTsKKyAgICB2cV9saW5lc2l6ZVsxXSA9CisgICAgdnFfbGluZXNpemVbMl0gPSBNQl9TSVpFID4+IDE7CiAKLSAgICAvL2NvcHkgaW5kaWNlcwotICAgIGZvcihpID0gaiA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKSB7Ci0gICAgICAgIGZvcih4ID0gMDsgeCA8IHMtPnc7IHggKz0gTUJfU0laRSwgaisrKSB7CisgICAgLy8gY29weSBpbmRpY2VzCisgICAgZm9yIChpID0gaiA9IHkgPSAwOyB5IDwgaDsgeSArPSBNQl9TSVpFKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCBqKyspIHsKICAgICAgICAgICAgIG1iX2luZm8gKm1iID0gJnMtPm1iW2pdOwotLy8gc2tpcCB1bmludGVyZXN0aW5nIGJsb2NrcyBpZiB3ZSBrbm93IHRoZWlyIHByZWZlcnJlZCBlbmNvZGluZwotICAgICAgICAgICAgaWYoQ0VSVEFJTihlbmNvZGluZykgJiYgbWItPmJlc3RfZW5jb2RpbmcgIT0gZW5jb2RpbmcpCisgICAgICAgICAgICAvLyBza2lwIHVuaW50ZXJlc3RpbmcgYmxvY2tzIGlmIHdlIGtub3cgdGhlaXIgcHJlZmVycmVkIGVuY29kaW5nCisgICAgICAgICAgICBpZiAoQ0VSVEFJTihlbmNvZGluZykgJiYgbWItPmJlc3RfZW5jb2RpbmcgIT0gZW5jb2RpbmcpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgIC8vcG9pbnQgc3ViX2RhdGEgdG8gY3VycmVudCBNQgorICAgICAgICAgICAgLy8gcG9pbnQgc3ViX2RhdGEgdG8gY3VycmVudCBNQgogICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIGRhdGEsIGxpbmVzaXplLCBzdWJfZGF0YSwgc3ViX2xpbmVzaXplKTsKIAotICAgICAgICAgICAgaWYodjFtb2RlKSB7CisgICAgICAgICAgICBpZiAodjFtb2RlKSB7CiAgICAgICAgICAgICAgICAgbWItPnYxX3ZlY3RvciA9IHMtPmNvZGVib29rX2Nsb3Nlc3RbaV07CiAKLSAgICAgICAgICAgICAgICAvL2ZpbGwgaW4gdnFfZGF0YSB3aXRoIFYxIGRhdGEKKyAgICAgICAgICAgICAgICAvLyBmaWxsIGluIHZxX2RhdGEgd2l0aCBWMSBkYXRhCiAgICAgICAgICAgICAgICAgZGVjb2RlX3YxX3ZlY3RvcihzLCB2cV9kYXRhLCB2cV9saW5lc2l6ZSwgbWItPnYxX3ZlY3RvciwgaW5mbyk7CiAKICAgICAgICAgICAgICAgICBtYi0+djFfZXJyb3IgPSBjb21wdXRlX21iX2Rpc3RvcnRpb24ocywgc3ViX2RhdGEsIHN1Yl9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnFfZGF0YSwgdnFfbGluZXNpemUpOwogICAgICAgICAgICAgICAgIHRvdGFsX2Vycm9yICs9IG1iLT52MV9lcnJvcjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yKGsgPSAwOyBrIDwgNDsgaysrKQotICAgICAgICAgICAgICAgICAgICBtYi0+djRfdmVjdG9yW2tdID0gcy0+Y29kZWJvb2tfY2xvc2VzdFtpK2tdOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgICAgICAgICAgICAgIG1iLT52NF92ZWN0b3Jba10gPSBzLT5jb2RlYm9va19jbG9zZXN0W2kgKyBrXTsKIAotICAgICAgICAgICAgICAgIC8vZmlsbCBpbiB2cV9kYXRhIHdpdGggVjQgZGF0YQorICAgICAgICAgICAgICAgIC8vIGZpbGwgaW4gdnFfZGF0YSB3aXRoIFY0IGRhdGEKICAgICAgICAgICAgICAgICBkZWNvZGVfdjRfdmVjdG9yKHMsIHZxX2RhdGEsIHZxX2xpbmVzaXplLCBtYi0+djRfdmVjdG9yLCBpbmZvKTsKIAogICAgICAgICAgICAgICAgIG1iLT52NF9lcnJvciA9IGNvbXB1dGVfbWJfZGlzdG9ydGlvbihzLCBzdWJfZGF0YSwgc3ViX2xpbmVzaXplLApAQCAtOTE1LDEyICs4MjAsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaSArPSB2MW1vZGUgPyAxIDogNDsKICAgICAgICAgfQotICAgIH0KLS8vIGNoZWNrIHRoYXQgd2UgZGlkIGl0IHJpZ2h0IGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uCisgICAgLy8gY2hlY2sgdGhhdCB3ZSBkaWQgaXQgcmlnaHQgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24KICAgICBhdl9hc3NlcnQwKGkgPj0gc2l6ZSk7IC8vIHRyYWluaW5nIHNldCBpcyBubyBzbWFsbGVyIHRoYW4gdGhlIGNvZGVib29rCiAKLSAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJpc3YxICVpIHNpemU9ICVpIGk9ICVpIGVycm9yICUiUFJJZDY0IlxuIiwgdjFtb2RlLCBzaXplLCBpLCB0b3RhbF9lcnJvcik7Ci0KICAgICByZXR1cm4gc2l6ZTsKIH0KIApAQCAtOTMzLDIyMSArODM1LDE2MCBAQAogICAgIHVpbnQ4X3QgKnN1Yl9sYXN0X2RhdGEgICAgWzRdLCAqc3ViX3BpY3RfZGF0YSAgICBbNF07CiAgICAgaW50ICAgICAgc3ViX2xhc3RfbGluZXNpemVbNF0sICBzdWJfcGljdF9saW5lc2l6ZVs0XTsKIAotICAgIGZvcihpID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSBNQl9TSVpFLCBpKyspIHsKLSAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCB4LCB5LCBsYXN0X2RhdGEsICAgICBsYXN0X2xpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2xhc3RfZGF0YSwgc3ViX2xhc3RfbGluZXNpemUpOwotICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksICAgICAgZGF0YSwgICAgICAgICAgbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfcGljdF9kYXRhLCBzdWJfcGljdF9saW5lc2l6ZSk7CisgICAgZm9yIChpID0geSA9IDA7IHkgPCBoOyB5ICs9IE1CX1NJWkUpCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT53OyB4ICs9IE1CX1NJWkUsIGkrKykgeworICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksIGxhc3RfZGF0YSwgbGFzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfbGFzdF9kYXRhLCBzdWJfbGFzdF9saW5lc2l6ZSk7CisgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgeCwgeSwgZGF0YSwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX3BpY3RfZGF0YSwgc3ViX3BpY3RfbGluZXNpemUpOwogCi0gICAgICAgICAgICBzLT5tYltpXS5za2lwX2Vycm9yID0gY29tcHV0ZV9tYl9kaXN0b3J0aW9uKHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9sYXN0X2RhdGEsIHN1Yl9sYXN0X2xpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJfcGljdF9kYXRhLCBzdWJfcGljdF9saW5lc2l6ZSk7CisgICAgICAgICAgICBzLT5tYltpXS5za2lwX2Vycm9yID0KKyAgICAgICAgICAgICAgICBjb21wdXRlX21iX2Rpc3RvcnRpb24ocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViX2xhc3RfZGF0YSwgc3ViX2xhc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9waWN0X2RhdGEsIHN1Yl9waWN0X2xpbmVzaXplKTsKICAgICAgICAgfQotICAgIH0KIH0KIAotc3RhdGljIHZvaWQgd3JpdGVfc3RyaXBfaGVhZGVyKENpbmVwYWtFbmNDb250ZXh0ICpzLCBpbnQgeSwgaW50IGgsIGludCBrZXlmcmFtZSwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RyaXBfc2l6ZSkKK3N0YXRpYyB2b2lkIHdyaXRlX3N0cmlwX2hlYWRlcihDaW5lcGFrRW5jQ29udGV4dCAqcywgaW50IHksIGludCBoLCBpbnQga2V5ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc3RyaXBfc2l6ZSkKIHsKLS8vIGFjdHVhbGx5IHdlIGFyZSBleGNsdXNpdmVseSB1c2luZyBpbnRyYSBzdHJpcCBjb2RpbmcgKGhvdyBtdWNoIGNhbiB3ZSB3aW4KLS8vIG90aGVyd2lzZT8gaG93IHRvIGNob29zZSB3aGljaCBwYXJ0IG9mIGEgY29kZWJvb2sgdG8gdXBkYXRlPyksCi0vLyBrZXlmcmFtZXMgYXJlIGRpZmZlcmVudCBvbmx5IGJlY2F1c2Ugd2UgZGlzYWxsb3cgRU5DX1NLSVAgb24gdGhlbSAtLSBybAotLy8gKGJlc2lkZXMsIHRoZSBsb2dpYyBoZXJlIHVzZWQgdG8gYmUgaW52ZXJ0ZWQ6ICkKLS8vICAgIGJ1ZlswXSA9IGtleWZyYW1lID8gMHgxMTogMHgxMDsKLSAgICBidWZbMF0gPSBrZXlmcmFtZSA/IDB4MTA6IDB4MTE7CisgICAgLy8gYWN0dWFsbHkgd2UgYXJlIGV4Y2x1c2l2ZWx5IHVzaW5nIGludHJhIHN0cmlwIGNvZGluZyAoaG93IG11Y2ggY2FuIHdlIHdpbgorICAgIC8vIG90aGVyd2lzZT8gaG93IHRvIGNob29zZSB3aGljaCBwYXJ0IG9mIGEgY29kZWJvb2sgdG8gdXBkYXRlPyksCisgICAgLy8ga2V5ZnJhbWVzIGFyZSBkaWZmZXJlbnQgb25seSBiZWNhdXNlIHdlIGRpc2FsbG93IEVOQ19TS0lQIG9uIHRoZW0gLS0gcmwKKyAgICAvLyAoYmVzaWRlcywgdGhlIGxvZ2ljIGhlcmUgdXNlZCB0byBiZSBpbnZlcnRlZDogKQorICAgIC8vICAgIGJ1ZlswXSA9IGtleWZyYW1lID8gMHgxMTogMHgxMDsKKyAgICBidWZbMF0gPSBrZXlmcmFtZSA/IDB4MTAgOiAweDExOwogICAgIEFWX1dCMjQoJmJ1ZlsxXSwgc3RyaXBfc2l6ZSArIFNUUklQX0hFQURFUl9TSVpFKTsKLS8vICAgIEFWX1dCMTYoJmJ1Zls0XSwgeSk7IC8qIHVzaW5nIGFic29sdXRlIHkgdmFsdWVzIHdvcmtzIC0tIHJsICovCisgICAgLy8gQVZfV0IxNigmYnVmWzRdLCB5KTsgLyogdXNpbmcgYWJzb2x1dGUgeSB2YWx1ZXMgd29ya3MgLS0gcmwgKi8KICAgICBBVl9XQjE2KCZidWZbNF0sIDApOyAvKiB1c2luZyByZWxhdGl2ZSB2YWx1ZXMgd29ya3MgYXMgd2VsbCAtLSBybCAqLwogICAgIEFWX1dCMTYoJmJ1Zls2XSwgMCk7Ci0vLyAgICBBVl9XQjE2KCZidWZbOF0sIHkraCk7IC8qIHVzaW5nIGFic29sdXRlIHkgdmFsdWVzIHdvcmtzIC0tIHJsICovCisgICAgLy8gQVZfV0IxNigmYnVmWzhdLCB5ICsgaCk7IC8qIHVzaW5nIGFic29sdXRlIHkgdmFsdWVzIHdvcmtzIC0tIHJsICovCiAgICAgQVZfV0IxNigmYnVmWzhdLCBoKTsgLyogdXNpbmcgcmVsYXRpdmUgdmFsdWVzIHdvcmtzIGFzIHdlbGwgLS0gcmwgKi8KICAgICBBVl9XQjE2KCZidWZbMTBdLCBzLT53KTsKLSAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJ3cml0ZV9zdHJpcF9oZWFkZXIoKSAleCBrZXlmcmFtZT0lZFxuIiwgYnVmWzBdLCBrZXlmcmFtZSk7CiB9CiAKIHN0YXRpYyBpbnQgcmRfc3RyaXAoQ2luZXBha0VuY0NvbnRleHQgKnMsIGludCB5LCBpbnQgaCwgaW50IGtleWZyYW1lLAogICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpsYXN0X2RhdGFbNF0sIGludCBsYXN0X2xpbmVzaXplWzRdLAogICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhWzRdLCBpbnQgbGluZXNpemVbNF0sCiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNjcmF0Y2hfZGF0YVs0XSwgaW50IHNjcmF0Y2hfbGluZXNpemVbNF0sCi0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50NjRfdCAqYmVzdF9zY29yZQotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSwgaW50NjRfdCAqYmVzdF9zZXJyCi0jZW5kaWYKLSkKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQ2NF90ICpiZXN0X3Njb3JlKQogewogICAgIGludDY0X3Qgc2NvcmUgPSAwOwotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSAgICBpbnQ2NF90IHNlcnI7Ci0jZW5kaWYKICAgICBpbnQgYmVzdF9zaXplID0gMDsKICAgICBzdHJpcF9pbmZvIGluZm87Ci0vLyBmb3IgY29kZWJvb2sgb3B0aW1pemF0aW9uOgorICAgIC8vIGZvciBjb2RlYm9vayBvcHRpbWl6YXRpb246CiAgICAgaW50IHYxZW5vdWdoLCB2MV9zaXplLCB2NGVub3VnaCwgdjRfc2l6ZTsKICAgICBpbnQgbmV3X3YxX3NpemUsIG5ld192NF9zaXplOwogICAgIGludCB2MXNocnVuaywgdjRzaHJ1bms7CiAKLSAgICBpZigha2V5ZnJhbWUpCisgICAgaWYgKCFrZXlmcmFtZSkKICAgICAgICAgY2FsY3VsYXRlX3NraXBfZXJyb3JzKHMsIGgsIGxhc3RfZGF0YSwgbGFzdF9saW5lc2l6ZSwgZGF0YSwgbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbyk7CiAKLSAgICAvL3RyeSBzb21lIHBvd2VycyBvZiA0IGZvciB0aGUgc2l6ZSBvZiB0aGUgY29kZWJvb2tzCi0gICAgLy9jb25zdHJhaW50IHRoZSB2NCBjb2RlYm9vayB0byBiZSBubyBiaWdnZXIgdGhhbiB2MSBvbmUsCi0gICAgLy8oYW5kIG5vIGxlc3MgdGhhbiB2MV9zaXplLzQpCi0gICAgLy90aHVzIG1ha2luZyB2MSBwcmVmZXJhYmxlIGFuZCBwb3NzaWJseSBsb3Npbmcgc21hbGwgZGV0YWlscz8gc2hvdWxkIGJlIG9rCisgICAgLy8gdHJ5IHNvbWUgcG93ZXJzIG9mIDQgZm9yIHRoZSBzaXplIG9mIHRoZSBjb2RlYm9va3MKKyAgICAvLyBjb25zdHJhaW50IHRoZSB2NCBjb2RlYm9vayB0byBiZSBubyBiaWdnZXIgdGhhbiB2MSBvbmUsCisgICAgLy8gKGFuZCBubyBsZXNzIHRoYW4gdjFfc2l6ZS80KQorICAgIC8vIHRodXMgbWFraW5nIHYxIHByZWZlcmFibGUgYW5kIHBvc3NpYmx5IGxvc2luZyBzbWFsbCBkZXRhaWxzPyBzaG91bGQgYmUgb2sKICNkZWZpbmUgU01BTExFU1RfQ09ERUJPT0sgMQotICAgIGZvcih2MWVub3VnaCA9IDAsIHYxX3NpemUgPSBTTUFMTEVTVF9DT0RFQk9PSzsgdjFfc2l6ZSA8PSBDT0RFQk9PS19NQVggJiYgIXYxZW5vdWdoOyB2MV9zaXplIDw8PSAyKSB7Ci0gICAgICAgIGZvcih2NGVub3VnaCA9IDAsIHY0X3NpemUgPSAwOyB2NF9zaXplIDw9IHYxX3NpemUgJiYgIXY0ZW5vdWdoOyB2NF9zaXplID0gdjRfc2l6ZSA/IHY0X3NpemUgPDwgMiA6IHYxX3NpemUgPj0gU01BTExFU1RfQ09ERUJPT0sgPDwgMiA/IHYxX3NpemUgPj4gMiA6IFNNQUxMRVNUX0NPREVCT09LKSB7Ci0gICAgICAgICAgICAvL3RyeSBhbGwgbW9kZXMKLSAgICAgICAgICAgIGZvcihDaW5lcGFrTW9kZSBtb2RlID0gMDsgbW9kZSA8IE1PREVfQ09VTlQ7IG1vZGUrKykgewotICAgICAgICAgICAgICAgIC8vZG9uJ3QgYWxsb3cgTU9ERV9NQyBpbiBpbnRyYSBmcmFtZXMKLSAgICAgICAgICAgICAgICBpZihrZXlmcmFtZSAmJiBtb2RlID09IE1PREVfTUMpCisgICAgZm9yICh2MWVub3VnaCA9IDAsIHYxX3NpemUgPSBTTUFMTEVTVF9DT0RFQk9PSzsgdjFfc2l6ZSA8PSBDT0RFQk9PS19NQVggJiYgIXYxZW5vdWdoOyB2MV9zaXplIDw8PSAyKSB7CisgICAgICAgIGZvciAodjRlbm91Z2ggPSAwLCB2NF9zaXplID0gMDsgdjRfc2l6ZSA8PSB2MV9zaXplICYmICF2NGVub3VnaDsgdjRfc2l6ZSA9IHY0X3NpemUgPyB2NF9zaXplIDw8IDIgOiB2MV9zaXplID49IFNNQUxMRVNUX0NPREVCT09LIDw8IDIgPyB2MV9zaXplID4+IDIgOiBTTUFMTEVTVF9DT0RFQk9PSykgeworICAgICAgICAgICAgQ2luZXBha01vZGUgbW9kZTsKKyAgICAgICAgICAgIC8vIHRyeSBhbGwgbW9kZXMKKyAgICAgICAgICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBNT0RFX0NPVU5UOyBtb2RlKyspIHsKKyAgICAgICAgICAgICAgICAvLyBkb24ndCBhbGxvdyBNT0RFX01DIGluIGludHJhIGZyYW1lcworICAgICAgICAgICAgICAgIGlmIChrZXlmcmFtZSAmJiBtb2RlID09IE1PREVfTUMpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICAgICAgaWYobW9kZSA9PSBNT0RFX1YxX09OTFkpIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kZSA9PSBNT0RFX1YxX09OTFkpIHsKICAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gdjFfc2l6ZTsKLS8vIHRoZSBzaXplIG1heSBzaHJpbmsgZXZlbiBiZWZvcmUgb3B0aW1pemF0aW9ucyBpZiB0aGUgaW5wdXQgaXMgc2hvcnQ6CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaXplIG1heSBzaHJpbmsgZXZlbiBiZWZvcmUgb3B0aW1pemF0aW9ucyBpZiB0aGUgaW5wdXQgaXMgc2hvcnQ6CiAgICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IHF1YW50aXplKHMsIGgsIGRhdGEsIGxpbmVzaXplLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5mbywgRU5DX1VOQ0VSVEFJTik7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGluZm8udjFfc2l6ZSA8IHYxX3NpemUpCi0vLyB0b28gZmV3IGVsaWdpYmxlIGJsb2Nrcywgbm8gc2Vuc2UgaW4gdHJ5aW5nIGJpZ2dlciBzaXplcworICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby52MV9zaXplIDwgdjFfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvbyBmZXcgZWxpZ2libGUgYmxvY2tzLCBubyBzZW5zZSBpbiB0cnlpbmcgYmlnZ2VyIHNpemVzCiAgICAgICAgICAgICAgICAgICAgICAgICB2MWVub3VnaCA9IDE7CiAKICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gMDsKICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBtb2RlICE9IE1PREVfVjFfT05MWQogICAgICAgICAgICAgICAgICAgICAvLyBpZiB2NCBjb2RlYm9vayBpcyBlbXB0eSB0aGVuIG9ubHkgYWxsb3cgVjEtb25seSBtb2RlCi0gICAgICAgICAgICAgICAgICAgIGlmKCF2NF9zaXplKQorICAgICAgICAgICAgICAgICAgICBpZiAoIXY0X3NpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgICAgICAgICBpZihtb2RlID09IE1PREVfVjFfVjQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT0gTU9ERV9WMV9WNCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gdjRfc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIGRhdGEsIGxpbmVzaXplLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8sIEVOQ19VTkNFUlRBSU4pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoaW5mby52NF9zaXplIDwgdjRfc2l6ZSkKLS8vIHRvbyBmZXcgZWxpZ2libGUgYmxvY2tzLCBubyBzZW5zZSBpbiB0cnlpbmcgYmlnZ2VyIHNpemVzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby52NF9zaXplIDwgdjRfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b28gZmV3IGVsaWdpYmxlIGJsb2Nrcywgbm8gc2Vuc2UgaW4gdHJ5aW5nIGJpZ2dlciBzaXplcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY0ZW5vdWdoID0gMTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGluZm8ubW9kZSA9IG1vZGU7Ci0vLyBjaG9vc2UgdGhlIGJlc3QgZW5jb2RpbmcgcGVyIGJsb2NrLCBiYXNlZCBvbiBjdXJyZW50IGV4cGVyaWVuY2UKKyAgICAgICAgICAgICAgICAvLyBjaG9vc2UgdGhlIGJlc3QgZW5jb2RpbmcgcGVyIGJsb2NrLCBiYXNlZCBvbiBjdXJyZW50IGV4cGVyaWVuY2UKICAgICAgICAgICAgICAgICBzY29yZSA9IGNhbGN1bGF0ZV9tb2RlX3Njb3JlKHMsIGgsICZpbmZvLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYxc2hydW5rLCAmdjRzaHJ1bmsKLSNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCi0sICZzZXJyCi0jZW5kaWYKLSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdjFzaHJ1bmssICZ2NHNocnVuayk7CiAKLSAgICAgICAgICAgICAgICBpZihtb2RlICE9IE1PREVfVjFfT05MWSl7CisgICAgICAgICAgICAgICAgaWYgKG1vZGUgIT0gTU9ERV9WMV9PTkxZKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBleHRyYV9pdGVyYXRpb25zX2xpbWl0ID0gcy0+bWF4X2V4dHJhX2NiX2l0ZXJhdGlvbnM7Ci0vLyByZWNvbXB1dGUgdGhlIGNvZGVib29rcywgb21pdHRpbmcgdGhlIGV4dHJhIGJsb2NrcwotLy8gd2UgYXNzdW1lIHdlIF9tYXlfIGNvbWUgaGVyZSB3aXRoIG1vcmUgYmxvY2tzIHRvIGVuY29kZSB0aGFuIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAvLyByZWNvbXB1dGUgdGhlIGNvZGVib29rcywgb21pdHRpbmcgdGhlIGV4dHJhIGJsb2NrcworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhc3N1bWUgd2UgX21heV8gY29tZSBoZXJlIHdpdGggbW9yZSBibG9ja3MgdG8gZW5jb2RlIHRoYW4gYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IHYxX3NpemU7CiAgICAgICAgICAgICAgICAgICAgIG5ld192MV9zaXplID0gcXVhbnRpemUocywgaCwgZGF0YSwgbGluZXNpemUsIDEsICZpbmZvLCBFTkNfVjEpOwotICAgICAgICAgICAgICAgICAgICBpZihuZXdfdjFfc2l6ZSA8IGluZm8udjFfc2l6ZSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHYxIGNvZGVib29rIHRvICVpIGVudHJpZXNcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192MV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld192MV9zaXplIDwgaW5mby52MV9zaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52MV9zaXplID0gbmV3X3YxX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLS8vIHdlIGFzc3VtZSB3ZSBfbWF5XyBjb21lIGhlcmUgd2l0aCBtb3JlIGJsb2NrcyB0byBlbmNvZGUgdGhhbiBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHdlIF9tYXlfIGNvbWUgaGVyZSB3aXRoIG1vcmUgYmxvY2tzIHRvIGVuY29kZSB0aGFuIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSB2NF9zaXplOwogICAgICAgICAgICAgICAgICAgICBuZXdfdjRfc2l6ZSA9IHF1YW50aXplKHMsIGgsIGRhdGEsIGxpbmVzaXplLCAwLCAmaW5mbywgRU5DX1Y0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYobmV3X3Y0X3NpemUgPCBpbmZvLnY0X3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjQgY29kZWJvb2sgdG8gJWkgZW50cmllcyBhdCBmaXJzdCBpdGVyYXRpb25cbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192NF9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld192NF9zaXplIDwgaW5mby52NF9zaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gbmV3X3Y0X3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLS8vIGNhbGN1bGF0ZSB0aGUgcmVzdWx0aW5nIHNjb3JlCi0vLyAoZG8gbm90IG1vdmUgYmxvY2tzIHRvIGNvZGVib29rIGVuY29kaW5ncyBub3csIGFzIHNvbWUgYmxvY2tzIG1heSBoYXZlCi0vLyBnb3QgYmlnZ2VyIGVycm9ycyBkZXNwaXRlIGEgc21hbGxlciB0cmFpbmluZyBzZXQgLSBidXQgd2UgZG8gbm90Ci0vLyBldmVyIGdyb3cgdGhlIHRyYWluaW5nIHNldHMgYmFjaykKLSAgICAgICAgICAgICAgICAgICAgZm9yKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgcmVzdWx0aW5nIHNjb3JlCisgICAgICAgICAgICAgICAgICAgIC8vIChkbyBub3QgbW92ZSBibG9ja3MgdG8gY29kZWJvb2sgZW5jb2RpbmdzIG5vdywgYXMgc29tZSBibG9ja3MgbWF5IGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gZ290IGJpZ2dlciBlcnJvcnMgZGVzcGl0ZSBhIHNtYWxsZXIgdHJhaW5pbmcgc2V0IC0gYnV0IHdlIGRvIG5vdAorICAgICAgICAgICAgICAgICAgICAvLyBldmVyIGdyb3cgdGhlIHRyYWluaW5nIHNldHMgYmFjaykKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgPSBjYWxjdWxhdGVfbW9kZV9zY29yZShzLCBoLCAmaW5mbywgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYxc2hydW5rLCAmdjRzaHJ1bmsKLSNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCi0sICZzZXJyCi0jZW5kaWYKLSk7Ci0vLyBkbyB3ZSBoYXZlIGEgcmVhc29uIHRvIHJlaXRlcmF0ZT8gaWYgc28sIGhhdmUgd2UgcmVhY2hlZCB0aGUgbGltaXQ/Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZigoIXYxc2hydW5rICYmICF2NHNocnVuaykgfHwgIWV4dHJhX2l0ZXJhdGlvbnNfbGltaXQtLSkgYnJlYWs7Ci0vLyByZWNvbXB1dGUgdGhlIGNvZGVib29rcywgb21pdHRpbmcgdGhlIGV4dHJhIGJsb2NrcwotICAgICAgICAgICAgICAgICAgICAgICAgaWYodjFzaHJ1bmspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnYxc2hydW5rLCAmdjRzaHJ1bmspOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gd2UgaGF2ZSBhIHJlYXNvbiB0byByZWl0ZXJhdGU/IGlmIHNvLCBoYXZlIHdlIHJlYWNoZWQgdGhlIGxpbWl0PworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghdjFzaHJ1bmsgJiYgIXY0c2hydW5rKSB8fCAhZXh0cmFfaXRlcmF0aW9uc19saW1pdC0tKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb21wdXRlIHRoZSBjb2RlYm9va3MsIG9taXR0aW5nIHRoZSBleHRyYSBibG9ja3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2MXNocnVuaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IHYxX3NpemU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3YxX3NpemUgPSBxdWFudGl6ZShzLCBoLCBkYXRhLCBsaW5lc2l6ZSwgMSwgJmluZm8sIEVOQ19WMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobmV3X3YxX3NpemUgPCBpbmZvLnYxX3NpemUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtb2RlICVpLCAlM2ksICUzaTogY3V0IHYxIGNvZGVib29rIHRvICVpIGVudHJpZXNcbiIsIG1vZGUsIHYxX3NpemUsIHY0X3NpemUsIG5ld192MV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3X3YxX3NpemUgPCBpbmZvLnYxX3NpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8udjFfc2l6ZSA9IG5ld192MV9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHY0c2hydW5rKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodjRzaHJ1bmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnY0X3NpemUgPSB2NF9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192NF9zaXplID0gcXVhbnRpemUocywgaCwgZGF0YSwgbGluZXNpemUsIDAsICZpbmZvLCBFTkNfVjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG5ld192NF9zaXplIDwgaW5mby52NF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiBjdXQgdjQgY29kZWJvb2sgdG8gJWkgZW50cmllc1xuIiwgbW9kZSwgdjFfc2l6ZSwgdjRfc2l6ZSwgbmV3X3Y0X3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdfdjRfc2l6ZSA8IGluZm8udjRfc2l6ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby52NF9zaXplID0gbmV3X3Y0X3NpemU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiJTNpICUzaSBzY29yZSA9ICUiUFJJZDY0IlxuIiwgdjFfc2l6ZSwgdjRfc2l6ZSwgc2NvcmUpOwotCi0gICAgICAgICAgICAgICAgaWYoYmVzdF9zaXplID09IDAgfHwgc2NvcmUgPCAqYmVzdF9zY29yZSkgewotCisgICAgICAgICAgICAgICAgaWYgKGJlc3Rfc2l6ZSA9PSAwIHx8IHNjb3JlIDwgKmJlc3Rfc2NvcmUpIHsKICAgICAgICAgICAgICAgICAgICAgKmJlc3Rfc2NvcmUgPSBzY29yZTsKLSNpZmRlZiBDSU5FUEFLX1JFUE9SVF9TRVJSCi0gICAgICAgICAgICAgICAgICAgICpiZXN0X3NlcnIgPSBzZXJyOwotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2l6ZSA9IGVuY29kZV9tb2RlKHMsIGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfZGF0YSwgc2NyYXRjaF9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9kYXRhLCBsYXN0X2xpbmVzaXplLCAmaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyaXBfYnVmICsgU1RSSVBfSEVBREVSX1NJWkUpOwogCi0gICAgICAgICAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiAlMTgiUFJJZDY0IiAlaSBCIiwgbW9kZSwgaW5mby52MV9zaXplLCBpbmZvLnY0X3NpemUsIHNjb3JlLCBiZXN0X3NpemUpOwotICAgICAgICAgICAgICAgICAgICAvL2F2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJcbiIpOwotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIm1vZGUgJWksICUzaSwgJTNpOiAlMTgiUFJJZDY0IiAlaSBCXG4iLCBtb2RlLCB2MV9zaXplLCB2NF9zaXplLCBzZXJyLCBiZXN0X3NpemUpOwotI2VuZGlmCi0KLSNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCi0gICAgICAgICAgICAgICAgICAgIC8vc2F2ZSBNQiBlbmNvZGluZyBjaG9pY2VzCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5iZXN0X21iLCBzLT5tYiwgbWJfY291bnQqc2l6ZW9mKG1iX2luZm8pKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgICAgIC8vbWVtY3B5KHN0cmlwX3RlbXAgKyBTVFJJUF9IRUFERVJfU0laRSwgc3RyaXBfdGVtcCwgYmVzdF9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgd3JpdGVfc3RyaXBfaGVhZGVyKHMsIHksIGgsIGtleWZyYW1lLCBzLT5zdHJpcF9idWYsIGJlc3Rfc2l6ZSk7Ci0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCi0gICAgLy9nYXRoZXIgc3RhdHMuIHRoaXMgd2lsbCBvbmx5IHdvcmsgcHJvcGVybHkgb2YgTUFYX1NUUklQUyA9PSAxCi0gICAgaWYoYmVzdF9pbmZvLm1vZGUgPT0gTU9ERV9WMV9PTkxZKSB7Ci0gICAgICAgIHMtPm51bV92MV9tb2RlKys7Ci0gICAgICAgIHMtPm51bV92MV9lbmNzICs9IHMtPncqaC9NQl9BUkVBOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmKGJlc3RfaW5mby5tb2RlID09IE1PREVfVjFfVjQpCi0gICAgICAgICAgICBzLT5udW1fdjRfbW9kZSsrOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzLT5udW1fbWNfbW9kZSsrOwotCi0gICAgICAgIGludCB4OwotICAgICAgICBmb3IoeCA9IDA7IHggPCBzLT53KmgvTUJfQVJFQTsgeCsrKQotICAgICAgICAgICAgaWYocy0+YmVzdF9tYlt4XS5iZXN0X2VuY29kaW5nID09IEVOQ19WMSkKLSAgICAgICAgICAgICAgICBzLT5udW1fdjFfZW5jcysrOwotICAgICAgICAgICAgZWxzZSBpZihzLT5iZXN0X21iW3hdLmJlc3RfZW5jb2RpbmcgPT0gRU5DX1Y0KQotICAgICAgICAgICAgICAgIHMtPm51bV92NF9lbmNzKys7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcy0+bnVtX3NraXBzKys7Ci0gICAgfQotI2VuZGlmCi0KICAgICBiZXN0X3NpemUgKz0gU1RSSVBfSEVBREVSX1NJWkU7CiAgICAgbWVtY3B5KGJ1Ziwgcy0+c3RyaXBfYnVmLCBiZXN0X3NpemUpOwogCiAgICAgcmV0dXJuIGJlc3Rfc2l6ZTsKIH0KIAotc3RhdGljIGludCB3cml0ZV9jdmlkX2hlYWRlcihDaW5lcGFrRW5jQ29udGV4dCAqcywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbnVtX3N0cmlwcywgaW50IGRhdGFfc2l6ZSwgaW50IGlzYWtleWZyYW1lKQorc3RhdGljIGludCB3cml0ZV9jdmlkX2hlYWRlcihDaW5lcGFrRW5jQ29udGV4dCAqcywgdW5zaWduZWQgY2hhciAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3N0cmlwcywgaW50IGRhdGFfc2l6ZSwgaW50IGlzYWtleWZyYW1lKQogewogICAgIGJ1ZlswXSA9IGlzYWtleWZyYW1lID8gMCA6IDE7CiAgICAgQVZfV0IyNCgmYnVmWzFdLCBkYXRhX3NpemUgKyBDVklEX0hFQURFUl9TSVpFKTsKQEAgLTExNjEsOTEgKzEwMDIsOTMgQEAKIHN0YXRpYyBpbnQgcmRfZnJhbWUoQ2luZXBha0VuY0NvbnRleHQgKnMsIGNvbnN0IEFWRnJhbWUgKmZyYW1lLAogICAgICAgICAgICAgICAgICAgICBpbnQgaXNha2V5ZnJhbWUsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplKQogewotICAgIGludCBudW1fc3RyaXBzLCBzdHJpcCwgaSwgeSwgbmV4dHksIHNpemUsIHRlbXBfc2l6ZTsKKyAgICBpbnQgbnVtX3N0cmlwcywgc3RyaXAsIGksIHksIG5leHR5LCBzaXplLCB0ZW1wX3NpemUsIGJlc3Rfc2l6ZTsKICAgICB1aW50OF90ICpsYXN0X2RhdGEgICAgWzRdLCAqZGF0YSAgICBbNF0sICpzY3JhdGNoX2RhdGEgICAgWzRdOwogICAgIGludCAgICAgIGxhc3RfbGluZXNpemVbNF0sICBsaW5lc2l6ZVs0XSwgIHNjcmF0Y2hfbGluZXNpemVbNF07CiAgICAgaW50NjRfdCBiZXN0X3Njb3JlID0gMCwgc2NvcmUsIHNjb3JlX3RlbXA7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgIGludDY0X3QgYmVzdF9zZXJyID0gMCwgc2Vyciwgc2Vycl90ZW1wOwotI2VuZGlmCisgICAgaW50IGJlc3RfbnN0cmlwczsKIAotICAgIGludCBiZXN0X25zdHJpcHMgPSAtMSwgYmVzdF9zaXplID0gLTE7IC8vIG1hcmsgYXMgdW5pbml0aWFsemVkCi0KLSAgICBpZihzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICBpZiAocy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgIGludCB4OwotLy8gYnVpbGQgYSBjb3B5IG9mIHRoZSBnaXZlbiBmcmFtZSBpbiB0aGUgY29ycmVjdCBjb2xvcnNwYWNlCi0gICAgICAgIGZvcih5ID0gMDsgeSA8IHMtPmg7IHkgKz0gMikgewotICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgcy0+dzsgeCArPSAyKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqaXJbMl07IGludDMyX3QgciwgZywgYiwgcnIsIGdnLCBiYjsKLSAgICAgICAgICAgICAgICBpclswXSA9IGZyYW1lLT5kYXRhWzBdICsgeCozICsgeSpmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIC8vIGJ1aWxkIGEgY29weSBvZiB0aGUgZ2l2ZW4gZnJhbWUgaW4gdGhlIGNvcnJlY3QgY29sb3JzcGFjZQorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+aDsgeSArPSAyKQorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPnc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmlyWzJdOworICAgICAgICAgICAgICAgIGludDMyX3QgciwgZywgYiwgcnIsIGdnLCBiYjsKKyAgICAgICAgICAgICAgICBpclswXSA9IGZyYW1lLT5kYXRhWzBdICsgeCAqIDMgKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdOwogICAgICAgICAgICAgICAgIGlyWzFdID0gaXJbMF0gKyBmcmFtZS0+bGluZXNpemVbMF07CiAgICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIHgsIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhLCBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfZGF0YSwgc2NyYXRjaF9saW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgciA9IGcgPSBiID0gMDsKLSAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7ICsraSkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGkxLCBpMjsKLSAgICAgICAgICAgICAgICAgICAgaTEgPSAoaSYxKTsgaTIgPSAoaT49Mik7Ci0gICAgICAgICAgICAgICAgICAgIHJyID0gaXJbaTJdW2kxKjMrMF07Ci0gICAgICAgICAgICAgICAgICAgIGdnID0gaXJbaTJdW2kxKjMrMV07Ci0gICAgICAgICAgICAgICAgICAgIGJiID0gaXJbaTJdW2kxKjMrMl07Ci0gICAgICAgICAgICAgICAgICAgIHIgKz0gcnI7IGcgKz0gZ2c7IGIgKz0gYmI7Ci0vLyB1c2luZyBmaXhlZCBwb2ludCBhcml0aG1ldGljIGZvciBwb3J0YWJsZSByZXBlYXRhYmlsaXR5LCBzY2FsaW5nIGJ5IDJeMjMKLS8vICJZIgotLy8gICAgICAgICAgICAgICAgICAgIHJyID0gMC4yODU3KnJyICsgMC41NzE0KmdnICsgMC4xNDI5KmJiOwotICAgICAgICAgICAgICAgICAgICByciA9ICgyMzk2NjI1KnJyICsgNDc5MzI1MSpnZyArIDExOTg3MzIqYmIpID4+IDIzOwotICAgICAgICAgICAgICAgICAgICBpZiggICAgICByciA8ICAgMCkgcnIgPSAgIDA7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gMjU1KSByciA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9kYXRhWzBdW2kxICsgaTIqc2NyYXRjaF9saW5lc2l6ZVswXV0gPSBycjsKKyAgICAgICAgICAgICAgICAgICAgaTEgPSAoaSAmIDEpOworICAgICAgICAgICAgICAgICAgICBpMiA9IChpID49IDIpOworICAgICAgICAgICAgICAgICAgICByciA9IGlyW2kyXVtpMSAqIDMgKyAwXTsKKyAgICAgICAgICAgICAgICAgICAgZ2cgPSBpcltpMl1baTEgKiAzICsgMV07CisgICAgICAgICAgICAgICAgICAgIGJiID0gaXJbaTJdW2kxICogMyArIDJdOworICAgICAgICAgICAgICAgICAgICByICs9IHJyOworICAgICAgICAgICAgICAgICAgICBnICs9IGdnOworICAgICAgICAgICAgICAgICAgICBiICs9IGJiOworICAgICAgICAgICAgICAgICAgICAvLyB1c2luZyBmaXhlZCBwb2ludCBhcml0aG1ldGljIGZvciBwb3J0YWJsZSByZXBlYXRhYmlsaXR5LCBzY2FsaW5nIGJ5IDJeMjMKKyAgICAgICAgICAgICAgICAgICAgLy8gIlkiCisgICAgICAgICAgICAgICAgICAgIC8vIHJyID0gMC4yODU3ICogcnIgKyAwLjU3MTQgKiBnZyArIDAuMTQyOSAqIGJiOworICAgICAgICAgICAgICAgICAgICByciA9ICgyMzk2NjI1ICogcnIgKyA0NzkzMjUxICogZ2cgKyAxMTk4NzMyICogYmIpID4+IDIzOworICAgICAgICAgICAgICAgICAgICBpZiAocnIgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcnIgPSAwOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyciA+IDI1NSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJyID0gMjU1OworICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX2RhdGFbMF1baTEgKyBpMiAqIHNjcmF0Y2hfbGluZXNpemVbMF1dID0gcnI7CiAgICAgICAgICAgICAgICAgfQotLy8gbGV0IHVzIHNjYWxlIGRvd24gYXMgbGF0ZSBhcyBwb3NzaWJsZQotLy8gICAgICAgICAgICAgICAgciAvPSA0OyBnIC89IDQ7IGIgLz0gNDsKLS8vICJVIgotLy8gICAgICAgICAgICAgICAgcnIgPSAtMC4xNDI5KnIgLSAwLjI4NTcqZyArIDAuNDI4NipiOwotICAgICAgICAgICAgICAgIHJyID0gKC0yOTk2ODMqciAtIDU5OTE1NipnICsgODk4ODM5KmIpID4+IDIzOwotICAgICAgICAgICAgICAgIGlmKCAgICAgIHJyIDwgLTEyOCkgcnIgPSAtMTI4OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gIDEyNykgcnIgPSAgMTI3OworICAgICAgICAgICAgICAgIC8vIGxldCB1cyBzY2FsZSBkb3duIGFzIGxhdGUgYXMgcG9zc2libGUKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICByIC89IDQ7IGcgLz0gNDsgYiAvPSA0OworICAgICAgICAgICAgICAgIC8vICJVIgorICAgICAgICAgICAgICAgIC8vIHJyID0gLTAuMTQyOSAqIHIgLSAwLjI4NTcgKiBnICsgMC40Mjg2ICogYjsKKyAgICAgICAgICAgICAgICByciA9ICgtMjk5NjgzICogciAtIDU5OTE1NiAqIGcgKyA4OTg4MzkgKiBiKSA+PiAyMzsKKyAgICAgICAgICAgICAgICBpZiAocnIgPCAtMTI4KQorICAgICAgICAgICAgICAgICAgICByciA9IC0xMjg7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocnIgPiAxMjcpCisgICAgICAgICAgICAgICAgICAgIHJyID0gMTI3OwogICAgICAgICAgICAgICAgIHNjcmF0Y2hfZGF0YVsxXVswXSA9IHJyICsgMTI4OyAvLyBxdWFudGl6ZSBuZWVkcyB1bnNpZ25lZAotLy8gIlYiCi0vLyAgICAgICAgICAgICAgICByciA9IDAuMzU3MSpyIC0gMC4yODU3KmcgLSAwLjA3MTQqYjsKLSAgICAgICAgICAgICAgICByciA9ICg3NDg4OTMqciAtIDU5OTE1NipnIC0gMTQ5NzM3KmIpID4+IDIzOwotICAgICAgICAgICAgICAgIGlmKCAgICAgIHJyIDwgLTEyOCkgcnIgPSAtMTI4OwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gIDEyNykgcnIgPSAgMTI3OworICAgICAgICAgICAgICAgIC8vICJWIgorICAgICAgICAgICAgICAgIC8vIHJyID0gMC4zNTcxICogciAtIDAuMjg1NyAqIGcgLSAwLjA3MTQgKiBiOworICAgICAgICAgICAgICAgIHJyID0gKDc0ODg5MyAqIHIgLSA1OTkxNTYgKiBnIC0gMTQ5NzM3ICogYikgPj4gMjM7CisgICAgICAgICAgICAgICAgaWYgKHJyIDwgLTEyOCkKKyAgICAgICAgICAgICAgICAgICAgcnIgPSAtMTI4OworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJyID4gMTI3KQorICAgICAgICAgICAgICAgICAgICByciA9IDEyNzsKICAgICAgICAgICAgICAgICBzY3JhdGNoX2RhdGFbMl1bMF0gPSByciArIDEyODsgLy8gcXVhbnRpemUgbmVlZHMgdW5zaWduZWQKICAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgIH0KIAotICAgIC8vd291bGQgYmUgbmljZSBidXQgcXVpdGUgY2VydGFpbmx5IGluY29tcGF0aWJsZSB3aXRoIHZpbnRhZ2UgcGxheWVyczoKKyAgICAvLyB3b3VsZCBiZSBuaWNlIGJ1dCBxdWl0ZSBjZXJ0YWlubHkgaW5jb21wYXRpYmxlIHdpdGggdmludGFnZSBwbGF5ZXJzOgogICAgIC8vIHN1cHBvcnQgZW5jb2RpbmcgemVybyBzdHJpcHMgKG1lYW5pbmcgc2tpcCB0aGUgd2hvbGUgZnJhbWUpCi0gICAgZm9yKG51bV9zdHJpcHMgPSBzLT5taW5fc3RyaXBzOyBudW1fc3RyaXBzIDw9IHMtPm1heF9zdHJpcHMgJiYgbnVtX3N0cmlwcyA8PSBzLT5oIC8gTUJfU0laRTsgbnVtX3N0cmlwcysrKSB7CisgICAgZm9yIChudW1fc3RyaXBzID0gcy0+bWluX3N0cmlwczsgbnVtX3N0cmlwcyA8PSBzLT5tYXhfc3RyaXBzICYmIG51bV9zdHJpcHMgPD0gcy0+aCAvIE1CX1NJWkU7IG51bV9zdHJpcHMrKykgewogICAgICAgICBzY29yZSA9IDA7Ci0gICAgICAgIHNpemUgPSAwOwotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSAgICAgICAgc2VyciA9IDA7Ci0jZW5kaWYKKyAgICAgICAgc2l6ZSAgPSAwOwogCi0gICAgICAgIGZvcih5ID0gMCwgc3RyaXAgPSAxOyB5IDwgcy0+aDsgc3RyaXArKywgeSA9IG5leHR5KSB7CisgICAgICAgIGZvciAoeSA9IDAsIHN0cmlwID0gMTsgeSA8IHMtPmg7IHN0cmlwKyssIHkgPSBuZXh0eSkgewogICAgICAgICAgICAgaW50IHN0cmlwX2hlaWdodDsKIAogICAgICAgICAgICAgbmV4dHkgPSBzdHJpcCAqIHMtPmggLyBudW1fc3RyaXBzOyAvLyA8PSBzLT5oCi0gICAgICAgICAgICAvL21ha2UgbmV4dHkgdGhlIG5leHQgbXVsdGlwbGUgb2YgNCBpZiBub3QgYWxyZWFkeSB0aGVyZQotICAgICAgICAgICAgaWYobmV4dHkgJiAzKQorICAgICAgICAgICAgLy8gbWFrZSBuZXh0eSB0aGUgbmV4dCBtdWx0aXBsZSBvZiA0IGlmIG5vdCBhbHJlYWR5IHRoZXJlCisgICAgICAgICAgICBpZiAobmV4dHkgJiAzKQogICAgICAgICAgICAgICAgIG5leHR5ICs9IDQgLSAobmV4dHkgJiAzKTsKIAogICAgICAgICAgICAgc3RyaXBfaGVpZ2h0ID0gbmV4dHkgLSB5OwotICAgICAgICAgICAgaWYoc3RyaXBfaGVpZ2h0IDw9IDApIHsgLy8gY2FuIHRoaXMgZXZlciBoYXBwZW4/CisgICAgICAgICAgICBpZiAoc3RyaXBfaGVpZ2h0IDw9IDApIHsgLy8gY2FuIHRoaXMgZXZlciBoYXBwZW4/CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgInNraXBwaW5nIHplcm8gaGVpZ2h0IHN0cmlwICVpIG9mICVpXG4iLCBzdHJpcCwgbnVtX3N0cmlwcyk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkKKyAgICAgICAgICAgIGlmIChzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpCiAgICAgICAgICAgICAgICAgZ2V0X3N1Yl9waWN0dXJlKHMsIDAsIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmlucHV0X2ZyYW1lLT5kYXRhLCBzLT5pbnB1dF9mcmFtZS0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGxpbmVzaXplKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBnZXRfc3ViX3BpY3R1cmUocywgMCwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiopZnJhbWUtPmRhdGEsIChpbnQqKWZyYW1lLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiopZnJhbWUtPmRhdGEsIChpbnQgKilmcmFtZS0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIGxpbmVzaXplKTsKICAgICAgICAgICAgIGdldF9zdWJfcGljdHVyZShzLCAwLCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfZnJhbWUtPmRhdGEsIHMtPmxhc3RfZnJhbWUtPmxpbmVzaXplLApAQCAtMTI1NCw2OCArMTA5Nyw1MSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNjcmF0Y2hfZnJhbWUtPmRhdGEsIHMtPnNjcmF0Y2hfZnJhbWUtPmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfZGF0YSwgc2NyYXRjaF9saW5lc2l6ZSk7CiAKLSAgICAgICAgICAgIGlmKCh0ZW1wX3NpemUgPSByZF9zdHJpcChzLCB5LCBzdHJpcF9oZWlnaHQsIGlzYWtleWZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZGF0YSwgbGFzdF9saW5lc2l6ZSwgZGF0YSwgbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaF9kYXRhLCBzY3JhdGNoX2xpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX2J1ZiArIHNpemUgKyBDVklEX0hFQURFUl9TSVpFLCAmc2NvcmVfdGVtcAotI2lmZGVmIENJTkVQQUtfUkVQT1JUX1NFUlIKLSwgJnNlcnJfdGVtcAotI2VuZGlmCi0pKSA8IDApCisgICAgICAgICAgICBpZiAoKHRlbXBfc2l6ZSA9IHJkX3N0cmlwKHMsIHksIHN0cmlwX2hlaWdodCwgaXNha2V5ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfZGF0YSwgbGFzdF9saW5lc2l6ZSwgZGF0YSwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmF0Y2hfZGF0YSwgc2NyYXRjaF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVfYnVmICsgc2l6ZSArIENWSURfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzY29yZV90ZW1wKSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiB0ZW1wX3NpemU7CiAKICAgICAgICAgICAgIHNjb3JlICs9IHNjb3JlX3RlbXA7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICAgICAgICAgc2VyciArPSBzZXJyX3RlbXA7Ci0jZW5kaWYKICAgICAgICAgICAgIHNpemUgKz0gdGVtcF9zaXplOwotICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAic3RyaXAgJWQsIGlzYWtleWZyYW1lPSVkIiwgc3RyaXAsIGlzYWtleWZyYW1lKTsKLSAgICAgICAgICAgIC8vYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlxuIik7CiAgICAgICAgIH0KIAotICAgICAgICBpZihiZXN0X3Njb3JlID09IDAgfHwgc2NvcmUgPCBiZXN0X3Njb3JlKSB7CisgICAgICAgIGlmIChiZXN0X3Njb3JlID09IDAgfHwgc2NvcmUgPCBiZXN0X3Njb3JlKSB7CiAgICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICAgICAgICAgYmVzdF9zZXJyID0gc2VycjsKLSNlbmRpZgogICAgICAgICAgICAgYmVzdF9zaXplID0gc2l6ZSArIHdyaXRlX2N2aWRfaGVhZGVyKHMsIHMtPmZyYW1lX2J1ZiwgbnVtX3N0cmlwcywgc2l6ZSwgaXNha2V5ZnJhbWUpOwotICAgICAgICAgICAgLy9hdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiYmVzdCBudW1iZXIgb2Ygc3RyaXBzIHNvIGZhcjogJTJpLCAlMTIiUFJJZDY0IiwgJWkgQlxuIiwgbnVtX3N0cmlwcywgc2NvcmUsIGJlc3Rfc2l6ZSk7Ci0jaWZkZWYgQ0lORVBBS19SRVBPUlRfU0VSUgotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgImJlc3QgbnVtYmVyIG9mIHN0cmlwcyBzbyBmYXI6ICUyaSwgJTEyIlBSSWQ2NCIsICVpIEJcbiIsIG51bV9zdHJpcHMsIHNlcnIsIGJlc3Rfc2l6ZSk7Ci0jZW5kaWYKIAogICAgICAgICAgICAgRkZTV0FQKEFWRnJhbWUgKiwgcy0+YmVzdF9mcmFtZSwgcy0+c2NyYXRjaF9mcmFtZSk7CiAgICAgICAgICAgICBtZW1jcHkoYnVmLCBzLT5mcmFtZV9idWYsIGJlc3Rfc2l6ZSk7CiAgICAgICAgICAgICBiZXN0X25zdHJpcHMgPSBudW1fc3RyaXBzOwogICAgICAgICB9Ci0vLyBhdm9pZCB0cnlpbmcgdG9vIG1hbnkgc3RyaXAgbnVtYmVycyB3aXRob3V0IGEgcmVhbCByZWFzb24KLS8vICh0aGlzIG1ha2VzIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSB2ZXJ5IGZpcnN0IGZyYW1lIGZhc3RlcikKLSAgICAgICAgaWYobnVtX3N0cmlwcyAtIGJlc3RfbnN0cmlwcyA+IDQpCisgICAgICAgIC8vIGF2b2lkIHRyeWluZyB0b28gbWFueSBzdHJpcCBudW1iZXJzIHdpdGhvdXQgYSByZWFsIHJlYXNvbgorICAgICAgICAvLyAodGhpcyBtYWtlcyB0aGUgcHJvY2Vzc2luZyBvZiB0aGUgdmVyeSBmaXJzdCBmcmFtZSBmYXN0ZXIpCisgICAgICAgIGlmIChudW1fc3RyaXBzIC0gYmVzdF9uc3RyaXBzID4gNCkKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGF2X2Fzc2VydDAoYmVzdF9uc3RyaXBzID49IDAgJiYgYmVzdF9zaXplID49IDApOwotCi0vLyBsZXQgdGhlIG51bWJlciBvZiBzdHJpcHMgc2xvd2x5IGFkYXB0IHRvIHRoZSBjaGFuZ2VzIGluIHRoZSBjb250ZW50cywKLS8vIGNvbXBhcmVkIHRvIGZ1bGwgYnJ1dGVmb3JjaW5nIGV2ZXJ5IHRpbWUgdGhpcyB3aWxsIG9jY2FzaW9uYWxseSBsZWFkCi0vLyB0byBzb21lIHIvZCBwZXJmb3JtYW5jZSBsb3NzIGJ1dCBtYWtlcyBlbmNvZGluZyB1cCB0byBzZXZlcmFsIHRpbWVzIGZhc3RlcgotICAgIGlmKCFzLT5zdHJpcF9udW1iZXJfZGVsdGFfcmFuZ2UpIHsKLSAgICAgICAgaWYoYmVzdF9uc3RyaXBzID09IHMtPm1heF9zdHJpcHMpIHsgLy8gbGV0IHVzIHRyeSB0byBzdGVwIHVwCisgICAgLy8gbGV0IHRoZSBudW1iZXIgb2Ygc3RyaXBzIHNsb3dseSBhZGFwdCB0byB0aGUgY2hhbmdlcyBpbiB0aGUgY29udGVudHMsCisgICAgLy8gY29tcGFyZWQgdG8gZnVsbCBicnV0ZWZvcmNpbmcgZXZlcnkgdGltZSB0aGlzIHdpbGwgb2NjYXNpb25hbGx5IGxlYWQKKyAgICAvLyB0byBzb21lIHIvZCBwZXJmb3JtYW5jZSBsb3NzIGJ1dCBtYWtlcyBlbmNvZGluZyB1cCB0byBzZXZlcmFsIHRpbWVzIGZhc3RlcgorICAgIGlmICghcy0+c3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlKSB7CisgICAgICAgIGlmIChiZXN0X25zdHJpcHMgPT0gcy0+bWF4X3N0cmlwcykgeyAvLyBsZXQgdXMgdHJ5IHRvIHN0ZXAgdXAKICAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBiZXN0X25zdHJpcHMgKyAxOwotICAgICAgICAgICAgaWYocy0+bWF4X3N0cmlwcyA+PSBzLT5tYXhfbWF4X3N0cmlwcykKKyAgICAgICAgICAgIGlmIChzLT5tYXhfc3RyaXBzID49IHMtPm1heF9tYXhfc3RyaXBzKQogICAgICAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBzLT5tYXhfbWF4X3N0cmlwczsKICAgICAgICAgfSBlbHNlIHsgLy8gdHJ5IHRvIHN0ZXAgZG93bgogICAgICAgICAgICAgcy0+bWF4X3N0cmlwcyA9IGJlc3RfbnN0cmlwczsKICAgICAgICAgfQogICAgICAgICBzLT5taW5fc3RyaXBzID0gcy0+bWF4X3N0cmlwcyAtIDE7Ci0gICAgICAgIGlmKHMtPm1pbl9zdHJpcHMgPCBzLT5taW5fbWluX3N0cmlwcykKKyAgICAgICAgaWYgKHMtPm1pbl9zdHJpcHMgPCBzLT5taW5fbWluX3N0cmlwcykKICAgICAgICAgICAgIHMtPm1pbl9zdHJpcHMgPSBzLT5taW5fbWluX3N0cmlwczsKICAgICB9IGVsc2UgewogICAgICAgICBzLT5tYXhfc3RyaXBzID0gYmVzdF9uc3RyaXBzICsgcy0+c3RyaXBfbnVtYmVyX2RlbHRhX3JhbmdlOwotICAgICAgICBpZihzLT5tYXhfc3RyaXBzID49IHMtPm1heF9tYXhfc3RyaXBzKQorICAgICAgICBpZiAocy0+bWF4X3N0cmlwcyA+PSBzLT5tYXhfbWF4X3N0cmlwcykKICAgICAgICAgICAgIHMtPm1heF9zdHJpcHMgPSBzLT5tYXhfbWF4X3N0cmlwczsKICAgICAgICAgcy0+bWluX3N0cmlwcyA9IGJlc3RfbnN0cmlwcyAtIHMtPnN0cmlwX251bWJlcl9kZWx0YV9yYW5nZTsKLSAgICAgICAgaWYocy0+bWluX3N0cmlwcyA8IHMtPm1pbl9taW5fc3RyaXBzKQorICAgICAgICBpZiAocy0+bWluX3N0cmlwcyA8IHMtPm1pbl9taW5fc3RyaXBzKQogICAgICAgICAgICAgcy0+bWluX3N0cmlwcyA9IHMtPm1pbl9taW5fc3RyaXBzOwogICAgIH0KIApAQCAtMTMzMiw3ICsxMTU4LDcgQEAKIAogICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBzLT5mcmFtZV9idWZfc2l6ZSwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICByZXQgPSByZF9mcmFtZShzLCBmcmFtZSwgKHMtPmN1cmZyYW1lID09IDApLCBwa3QtPmRhdGEsIHMtPmZyYW1lX2J1Zl9zaXplKTsKKyAgICByZXQgICAgICAgPSByZF9mcmFtZShzLCBmcmFtZSwgKHMtPmN1cmZyYW1lID09IDApLCBwa3QtPmRhdGEsIHMtPmZyYW1lX2J1Zl9zaXplKTsKICAgICBwa3QtPnNpemUgPSByZXQ7CiAgICAgaWYgKHMtPmN1cmZyYW1lID09IDApCiAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwpAQCAtMTM2MSwzMCArMTE4NywyMiBAQAogICAgIGF2X2ZyZWVwKCZzLT5zdHJpcF9idWYpOwogICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9idWYpOwogICAgIGF2X2ZyZWVwKCZzLT5tYik7Ci0jaWZkZWYgQ0lORVBBS0VOQ19ERUJVRwotICAgIGF2X2ZyZWVwKCZzLT5iZXN0X21iKTsKLSNlbmRpZgogCi0gICAgZm9yKHggPSAwOyB4IDwgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA0IDogMyk7IHgrKykKKyAgICBmb3IgKHggPSAwOyB4IDwgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQgPyA0IDogMyk7IHgrKykKICAgICAgICAgYXZfZnJlZXAoJnMtPnBpY3RfYnVmc1t4XSk7CiAKLSNpZmRlZiBDSU5FUEFLRU5DX0RFQlVHCi0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgInN0cmlwIGNvZGluZyBzdGF0czogJWkgVjEgbW9kZSwgJWkgVjQgbW9kZSwgJWkgTUMgbW9kZSAoJWkgVjEgZW5jcywgJWkgVjQgZW5jcywgJWkgc2tpcHMpXG4iLAotICAgICAgICBzLT5udW1fdjFfbW9kZSwgcy0+bnVtX3Y0X21vZGUsIHMtPm51bV9tY19tb2RlLCBzLT5udW1fdjFfZW5jcywgcy0+bnVtX3Y0X2VuY3MsIHMtPm51bV9za2lwcyk7Ci0jZW5kaWYKLQogICAgIHJldHVybiAwOwogfQogCiBBVkNvZGVjIGZmX2NpbmVwYWtfZW5jb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAiY2luZXBhayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNpbmVwYWsiKSwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQ0lORVBBSywKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ2luZXBha0VuY0NvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICA9IGNpbmVwYWtfZW5jb2RlX2luaXQsCiAgICAgLmVuY29kZTIgICAgICAgID0gY2luZXBha19lbmNvZGVfZnJhbWUsCiAgICAgLmNsb3NlICAgICAgICAgID0gY2luZXBha19lbmNvZGVfZW5kLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7QVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9OT05FfSwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2luZXBhayAvIENWSUQiKSwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9OT05FIH0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmNpbmVwYWtfY2xhc3MsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jbGVhcnZpZGVvLmMgYi9saWJhdmNvZGVjL2NsZWFydmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTMzNjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9jbGVhcnZpZGVvLmMKQEAgLTAsMCArMSw5MTcgQEAKKy8qCisgKiBDbGVhclZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE4IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogQ2xlYXJWaWRlbyBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpZGN0ZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAiY2xlYXJ2aWRlb2RhdGEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTGV2ZWxDb2RlcyB7CisgICAgdWludDE2X3QgICAgbXZfZXNjOworICAgIHVpbnQxNl90ICAgIGJpYXNfZXNjOworICAgIFZMQyAgICAgICAgIGZsYWdzX2NiOworICAgIFZMQyAgICAgICAgIG12X2NiOworICAgIFZMQyAgICAgICAgIGJpYXNfY2I7Cit9IExldmVsQ29kZXM7CisKK3R5cGVkZWYgc3RydWN0IE1WIHsKKyAgICBpbnQxNl90IHgsIHk7Cit9IE1WOworCitzdGF0aWMgY29uc3QgTVYgemVyb19tdiA9IHsgMCB9OworCit0eXBlZGVmIHN0cnVjdCBNVkluZm8geworICAgIGludCBtYl93OworICAgIGludCBtYl9oOworICAgIGludCBtYl9zaXplOworICAgIGludCBtYl9zdHJpZGU7CisgICAgaW50IHRvcDsKKyAgICBNViAgKm12OworfSBNVkluZm87CisKK3R5cGVkZWYgc3RydWN0IFRpbGVJbmZvIHsKKyAgICB1aW50MTZfdCAgICAgICAgZmxhZ3M7CisgICAgaW50MTZfdCAgICAgICAgIGJpYXM7CisgICAgTVYgICAgICAgICAgICAgIG12OworICAgIHN0cnVjdCBUaWxlSW5mbyAqY2hpbGRbNF07Cit9IFRpbGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBDTFZDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgSURDVERTUENvbnRleHQgaWRzcDsKKyAgICBBVkZyYW1lICAgICAgICAqcGljOworICAgIEFWRnJhbWUgICAgICAgICpwcmV2OworICAgIEdldEJpdENvbnRleHQgIGdiOworICAgIGludCAgICAgICAgICAgIG1iX3dpZHRoLCBtYl9oZWlnaHQ7CisgICAgaW50ICAgICAgICAgICAgcG1iX3dpZHRoLCBwbWJfaGVpZ2h0OworICAgIE1WSW5mbyAgICAgICAgIG12aTsKKyAgICBpbnQgICAgICAgICAgICB0aWxlX3NpemU7CisgICAgaW50ICAgICAgICAgICAgdGlsZV9zaGlmdDsKKyAgICBWTEMgICAgICAgICAgICBkY192bGMsIGFjX3ZsYzsKKyAgICBMZXZlbENvZGVzICAgICB5bGV2WzRdLCB1bGV2WzNdLCB2bGV2WzNdOworICAgIGludCAgICAgICAgICAgIGx1bWFfZGNfcXVhbnQsIGNocm9tYV9kY19xdWFudCwgYWNfcXVhbnQ7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBibG9jaylbNjRdOworICAgIGludCAgICAgICAgICAgIHRvcF9kY1szXSwgbGVmdF9kY1s0XTsKK30gQ0xWQ29udGV4dDsKKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX2Jsb2NrKENMVkNvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxrLCBpbnQgaGFzX2FjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY19xdWFudCkKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZjdHgtPmdiOworICAgIGludCBpZHggPSAxLCBsYXN0ID0gMCwgdmFsLCBza2lwOworCisgICAgbWVtc2V0KGJsaywgMCwgc2l6ZW9mKCpibGspICogNjQpOworICAgIGJsa1swXSA9IGdldF92bGMyKGdiLCBjdHgtPmRjX3ZsYy50YWJsZSwgOSwgMyk7CisgICAgaWYgKGJsa1swXSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGJsa1swXSAtPSA2MzsKKworICAgIGlmICghaGFzX2FjKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHdoaWxlIChpZHggPCA2NCAmJiAhbGFzdCkgeworICAgICAgICB2YWwgPSBnZXRfdmxjMihnYiwgY3R4LT5hY192bGMudGFibGUsIDksIDIpOworICAgICAgICBpZiAodmFsIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAodmFsICE9IDB4MUJGRikgeworICAgICAgICAgICAgbGFzdCA9ICB2YWwgPj4gMTI7CisgICAgICAgICAgICBza2lwID0gKHZhbCA+PiA0KSAmIDB4RkY7CisgICAgICAgICAgICB2YWwgJj0gMHhGOworICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgICAgICAgICAgdmFsID0gLXZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxhc3QgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgc2tpcCA9IGdldF9iaXRzKGdiLCA2KTsKKyAgICAgICAgICAgIHZhbCAgPSBnZXRfc2JpdHMoZ2IsIDgpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWwpIHsKKyAgICAgICAgICAgIGludCBhdmFsID0gRkZBQlModmFsKSwgc2lnbiA9IHZhbCA8IDA7CisgICAgICAgICAgICB2YWwgPSBhY19xdWFudCAqICgyICogYXZhbCArIDEpOworICAgICAgICAgICAgaWYgKCEoYWNfcXVhbnQgJiAxKSkKKyAgICAgICAgICAgICAgICB2YWwtLTsKKyAgICAgICAgICAgIGlmIChzaWduKQorICAgICAgICAgICAgICAgIHZhbCA9IC12YWw7CisgICAgICAgIH0KKyAgICAgICAgaWR4ICs9IHNraXA7CisgICAgICAgIGlmIChpZHggPj0gNjQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYmxrW2ZmX3ppZ3phZ19kaXJlY3RbaWR4KytdXSA9IHZhbDsKKyAgICB9CisKKyAgICByZXR1cm4gKGlkeCA8PSA2NCAmJiBsYXN0KSA/IDAgOiAtMTsKK30KKworI2RlZmluZSBEQ1RfVEVNUExBVEUoYmxrLCBzdGVwLCBiaWFzLCBzaGlmdCwgZHNoaWZ0LCBPUCkgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0MCA9IE9QKDI4NDEgKiBibGtbMSAqIHN0ZXBdICsgIDU2NSAqIGJsa1s3ICogc3RlcF0pOyAgICAgXAorICAgIGNvbnN0IGludCB0MSA9IE9QKCA1NjUgKiBibGtbMSAqIHN0ZXBdIC0gMjg0MSAqIGJsa1s3ICogc3RlcF0pOyAgICAgXAorICAgIGNvbnN0IGludCB0MiA9IE9QKDE2MDkgKiBibGtbNSAqIHN0ZXBdICsgMjQwOCAqIGJsa1szICogc3RlcF0pOyAgICAgXAorICAgIGNvbnN0IGludCB0MyA9IE9QKDI0MDggKiBibGtbNSAqIHN0ZXBdIC0gMTYwOSAqIGJsa1szICogc3RlcF0pOyAgICAgXAorICAgIGNvbnN0IGludCB0NCA9IE9QKDExMDggKiBibGtbMiAqIHN0ZXBdIC0gMjY3NiAqIGJsa1s2ICogc3RlcF0pOyAgICAgXAorICAgIGNvbnN0IGludCB0NSA9IE9QKDI2NzYgKiBibGtbMiAqIHN0ZXBdICsgMTEwOCAqIGJsa1s2ICogc3RlcF0pOyAgICAgXAorICAgIGNvbnN0IGludCB0NiA9ICgoYmxrWzAgKiBzdGVwXSArIGJsa1s0ICogc3RlcF0pICogKDEgPDwgZHNoaWZ0KSkgKyBiaWFzOyAgXAorICAgIGNvbnN0IGludCB0NyA9ICgoYmxrWzAgKiBzdGVwXSAtIGJsa1s0ICogc3RlcF0pICogKDEgPDwgZHNoaWZ0KSkgKyBiaWFzOyAgXAorICAgIGNvbnN0IGludCB0OCA9IHQwICsgdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0OSA9IHQwIC0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0QSA9IChpbnQpKDE4MVUgKiAodDkgKyAodDEgLSB0MykpICsgMHg4MCkgPj4gODsgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0QiA9IChpbnQpKDE4MVUgKiAodDkgLSAodDEgLSB0MykpICsgMHg4MCkgPj4gODsgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0QyA9IHQxICsgdDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsa1swICogc3RlcF0gPSAodDYgKyB0NSArIHQ4KSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsa1sxICogc3RlcF0gPSAodDcgKyB0NCArIHRBKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsa1syICogc3RlcF0gPSAodDcgLSB0NCArIHRCKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsa1szICogc3RlcF0gPSAodDYgLSB0NSArIHRDKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsa1s0ICogc3RlcF0gPSAodDYgLSB0NSAtIHRDKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsa1s1ICogc3RlcF0gPSAodDcgLSB0NCAtIHRCKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsa1s2ICogc3RlcF0gPSAodDcgKyB0NCAtIHRBKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJsa1s3ICogc3RlcF0gPSAodDYgKyB0NSAtIHQ4KSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIFJPUCh4KSB4CisjZGVmaW5lIENPUCh4KSAoKCh4KSArIDQpID4+IDMpCisKK3N0YXRpYyB2b2lkIGNsdl9kY3QoaW50MTZfdCAqYmxvY2spCit7CisgICAgaW50IGk7CisgICAgaW50MTZfdCAqcHRyOworCisgICAgcHRyID0gYmxvY2s7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBEQ1RfVEVNUExBVEUocHRyLCAxLCAweDgwLCA4LCAxMSwgUk9QKTsKKyAgICAgICAgcHRyICs9IDg7CisgICAgfQorCisgICAgcHRyID0gYmxvY2s7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBEQ1RfVEVNUExBVEUocHRyLCA4LCAweDIwMDAsIDE0LCA4LCBDT1ApOworICAgICAgICBwdHIrKzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX21iKENMVkNvbnRleHQgKmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBpbnQgaSwgaGFzX2FjWzZdLCBvZmY7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICBoYXNfYWNbaV0gPSBnZXRfYml0czEoJmMtPmdiKTsKKworICAgIG9mZiA9IHggKiAxNiArIHkgKiAxNiAqIGMtPnBpYy0+bGluZXNpemVbMF07CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpZiAoZGVjb2RlX2Jsb2NrKGMsIGMtPmJsb2NrLCBoYXNfYWNbaV0sIGMtPmFjX3F1YW50KSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKCF4ICYmICEoaSAmIDEpKSB7CisgICAgICAgICAgICBjLT5ibG9ja1swXSArPSBjLT50b3BfZGNbMF07CisgICAgICAgICAgICBjLT50b3BfZGNbMF0gPSBjLT5ibG9ja1swXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGMtPmJsb2NrWzBdICs9IGMtPmxlZnRfZGNbKGkgJiAyKSA+PiAxXTsKKyAgICAgICAgfQorICAgICAgICBjLT5sZWZ0X2RjWyhpICYgMikgPj4gMV0gPSBjLT5ibG9ja1swXTsKKyAgICAgICAgYy0+YmxvY2tbMF0gICAgICAgICAgICAgKj0gYy0+bHVtYV9kY19xdWFudDsKKyAgICAgICAgY2x2X2RjdChjLT5ibG9jayk7CisgICAgICAgIGlmIChpID09IDIpCisgICAgICAgICAgICBvZmYgKz0gYy0+cGljLT5saW5lc2l6ZVswXSAqIDg7CisgICAgICAgIGMtPmlkc3AucHV0X3BpeGVsc19jbGFtcGVkKGMtPmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5waWMtPmRhdGFbMF0gKyBvZmYgKyAoaSAmIDEpICogOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGljLT5saW5lc2l6ZVswXSk7CisgICAgfQorCisgICAgb2ZmID0geCAqIDggKyB5ICogOCAqIGMtPnBpYy0+bGluZXNpemVbMV07CisgICAgZm9yIChpID0gMTsgaSA8IDM7IGkrKykgeworICAgICAgICBpZiAoZGVjb2RlX2Jsb2NrKGMsIGMtPmJsb2NrLCBoYXNfYWNbaSArIDNdLCBjLT5hY19xdWFudCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGlmICgheCkgeworICAgICAgICAgICAgYy0+YmxvY2tbMF0gKz0gYy0+dG9wX2RjW2ldOworICAgICAgICAgICAgYy0+dG9wX2RjW2ldID0gYy0+YmxvY2tbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjLT5ibG9ja1swXSArPSBjLT5sZWZ0X2RjW2kgKyAxXTsKKyAgICAgICAgfQorICAgICAgICBjLT5sZWZ0X2RjW2kgKyAxXSA9IGMtPmJsb2NrWzBdOworICAgICAgICBjLT5ibG9ja1swXSAgICAgICo9IGMtPmNocm9tYV9kY19xdWFudDsKKyAgICAgICAgY2x2X2RjdChjLT5ibG9jayk7CisgICAgICAgIGMtPmlkc3AucHV0X3BpeGVsc19jbGFtcGVkKGMtPmJsb2NrLCBjLT5waWMtPmRhdGFbaV0gKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBpYy0+bGluZXNpemVbaV0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvcHlfYmxvY2soQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpkc3QsIEFWRnJhbWUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmUsIGludCB4LCBpbnQgeSwgaW50IGR4LCBpbnQgZHksIGludCBzaXplKQoreworICAgIGludCBzaGlmdCA9IHBsYW5lID4gMDsKKyAgICBpbnQgc3ggPSB4ICsgZHg7CisgICAgaW50IHN5ID0geSArIGR5OworICAgIGludCBzc3RyaWRlLCBkc3RyaWRlLCBzb2ZmLCBkb2ZmOworICAgIHVpbnQ4X3QgKnNidWYsICpkYnVmOworICAgIGludCBpOworCisgICAgaWYgKHggPCAwIHx8IHN4IDwgMCB8fCB5IDwgMCB8fCBzeSA8IDAgfHwKKyAgICAgICAgeCArIHNpemUgPiBhdmN0eC0+Y29kZWRfd2lkdGggPj4gc2hpZnQgfHwKKyAgICAgICAgeSArIHNpemUgPiBhdmN0eC0+Y29kZWRfaGVpZ2h0ID4+IHNoaWZ0IHx8CisgICAgICAgIHN4ICsgc2l6ZSA+IGF2Y3R4LT5jb2RlZF93aWR0aCA+PiBzaGlmdCB8fAorICAgICAgICBzeSArIHNpemUgPiBhdmN0eC0+Y29kZWRfaGVpZ2h0ID4+IHNoaWZ0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHNzdHJpZGUgPSBzcmMtPmxpbmVzaXplW3BsYW5lXTsKKyAgICBkc3RyaWRlID0gZHN0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgc29mZiAgICA9IHN4ICsgc3kgKiBzc3RyaWRlOworICAgIHNidWYgICAgPSBzcmMtPmRhdGFbcGxhbmVdOworICAgIGRvZmYgICAgPSB4ICsgeSAqIGRzdHJpZGU7CisgICAgZGJ1ZiAgICA9IGRzdC0+ZGF0YVtwbGFuZV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKmRwdHIgPSAmZGJ1Zltkb2ZmXTsKKyAgICAgICAgdWludDhfdCAqc3B0ciA9ICZzYnVmW3NvZmZdOworCisgICAgICAgIG1lbWNweShkcHRyLCBzcHRyLCBzaXplKTsKKyAgICAgICAgZG9mZiArPSBkc3RyaWRlOworICAgICAgICBzb2ZmICs9IHNzdHJpZGU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29weWFkZF9ibG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGFuZSwgaW50IHgsIGludCB5LCBpbnQgZHgsIGludCBkeSwgaW50IHNpemUsIGludCBiaWFzKQoreworICAgIGludCBzaGlmdCA9IHBsYW5lID4gMDsKKyAgICBpbnQgc3ggPSB4ICsgZHg7CisgICAgaW50IHN5ID0geSArIGR5OworICAgIGludCBzc3RyaWRlICAgPSBzcmMtPmxpbmVzaXplW3BsYW5lXTsKKyAgICBpbnQgZHN0cmlkZSAgID0gZHN0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgaW50IHNvZmYgICAgICA9IHN4ICsgc3kgKiBzc3RyaWRlOworICAgIHVpbnQ4X3QgKnNidWYgPSBzcmMtPmRhdGFbcGxhbmVdOworICAgIGludCBkb2ZmICAgICAgPSB4ICsgeSAqIGRzdHJpZGU7CisgICAgdWludDhfdCAqZGJ1ZiA9IGRzdC0+ZGF0YVtwbGFuZV07CisgICAgaW50IGksIGo7CisKKyAgICBpZiAoeCA8IDAgfHwgc3ggPCAwIHx8IHkgPCAwIHx8IHN5IDwgMCB8fAorICAgICAgICB4ICsgc2l6ZSA+IGF2Y3R4LT5jb2RlZF93aWR0aCA+PiBzaGlmdCB8fAorICAgICAgICB5ICsgc2l6ZSA+IGF2Y3R4LT5jb2RlZF9oZWlnaHQgPj4gc2hpZnQgfHwKKyAgICAgICAgc3ggKyBzaXplID4gYXZjdHgtPmNvZGVkX3dpZHRoID4+IHNoaWZ0IHx8CisgICAgICAgIHN5ICsgc2l6ZSA+IGF2Y3R4LT5jb2RlZF9oZWlnaHQgPj4gc2hpZnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgeworICAgICAgICB1aW50OF90ICpkcHRyID0gJmRidWZbZG9mZl07CisgICAgICAgIHVpbnQ4X3QgKnNwdHIgPSAmc2J1Zltzb2ZmXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdmFsID0gc3B0cltpXSArIGJpYXM7CisKKyAgICAgICAgICAgIGRwdHJbaV0gPSBhdl9jbGlwX3VpbnQ4KHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBkb2ZmICs9IGRzdHJpZGU7CisgICAgICAgIHNvZmYgKz0gc3N0cmlkZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIE1WIG12aV9wcmVkaWN0KE1WSW5mbyAqbXZpLCBpbnQgbWJfeCwgaW50IG1iX3ksIE1WIGRpZmYpCit7CisgICAgTVYgcmVzLCBwcmVkX212OworICAgIGludCBsZWZ0X212LCByaWdodF9tdiwgdG9wX212LCBib3RfbXY7CisKKyAgICBpZiAobXZpLT50b3ApIHsKKyAgICAgICAgaWYgKG1iX3ggPiAwKSB7CisgICAgICAgICAgICBwcmVkX212ID0gbXZpLT5tdlttdmktPm1iX3N0cmlkZSArIG1iX3ggLSAxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZWRfbXYgPSB6ZXJvX212OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgobWJfeCA9PSAwKSB8fCAobWJfeCA9PSBtdmktPm1iX3cgLSAxKSkgeworICAgICAgICBwcmVkX212ID0gbXZpLT5tdlttYl94XTsKKyAgICB9IGVsc2UgeworICAgICAgICBNViBBID0gbXZpLT5tdlttdmktPm1iX3N0cmlkZSArIG1iX3ggLSAxXTsKKyAgICAgICAgTVYgQiA9IG12aS0+bXZbICAgICAgICAgICAgICAgICBtYl94ICAgIF07CisgICAgICAgIE1WIEMgPSBtdmktPm12WyAgICAgICAgICAgICAgICAgbWJfeCArIDFdOworICAgICAgICBwcmVkX212LnggPSBtaWRfcHJlZChBLngsIEIueCwgQy54KTsKKyAgICAgICAgcHJlZF9tdi55ID0gbWlkX3ByZWQoQS55LCBCLnksIEMueSk7CisgICAgfQorCisgICAgcmVzID0gcHJlZF9tdjsKKworICAgIGxlZnRfbXYgPSAtKChtYl94ICogbXZpLT5tYl9zaXplKSk7CisgICAgcmlnaHRfbXYgPSAoKG12aS0+bWJfdyAtIG1iX3ggLSAxKSAqIG12aS0+bWJfc2l6ZSk7CisgICAgaWYgKHJlcy54IDwgbGVmdF9tdikgeworICAgICAgICByZXMueCA9IGxlZnRfbXY7CisgICAgfQorICAgIGlmIChyZXMueCA+IHJpZ2h0X212KSB7CisgICAgICAgIHJlcy54ID0gcmlnaHRfbXY7CisgICAgfQorICAgIHRvcF9tdiA9IC0oKG1iX3kgKiBtdmktPm1iX3NpemUpKTsKKyAgICBib3RfbXYgPSAoKG12aS0+bWJfaCAtIG1iX3kgLSAxKSAqIG12aS0+bWJfc2l6ZSk7CisgICAgaWYgKHJlcy55IDwgdG9wX212KSB7CisgICAgICAgIHJlcy55ID0gdG9wX212OworICAgIH0KKyAgICBpZiAocmVzLnkgPiBib3RfbXYpIHsKKyAgICAgICAgcmVzLnkgPSBib3RfbXY7CisgICAgfQorCisgICAgbXZpLT5tdlttdmktPm1iX3N0cmlkZSArIG1iX3hdLnggPSByZXMueCArIGRpZmYueDsKKyAgICBtdmktPm12W212aS0+bWJfc3RyaWRlICsgbWJfeF0ueSA9IHJlcy55ICsgZGlmZi55OworCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgbXZpX3Jlc2V0KE1WSW5mbyAqbXZpLCBpbnQgbWJfdywgaW50IG1iX2gsIGludCBtYl9zaXplKQoreworICAgIG12aS0+dG9wICAgICAgID0gMTsKKyAgICBtdmktPm1iX3cgICAgICA9IG1iX3c7CisgICAgbXZpLT5tYl9oICAgICAgPSBtYl9oOworICAgIG12aS0+bWJfc2l6ZSAgID0gbWJfc2l6ZTsKKyAgICBtdmktPm1iX3N0cmlkZSA9IG1iX3c7CisgICAgbWVtc2V0KG12aS0+bXYsIDAsIHNpemVvZihNVikgKiBtdmktPm1iX3N0cmlkZSAqIDIpOworfQorCitzdGF0aWMgdm9pZCBtdmlfdXBkYXRlX3JvdyhNVkluZm8gKm12aSkKK3sKKyAgICBpbnQgaTsKKworICAgIG12aS0+dG9wID0gMDsKKyAgICBmb3IgKGkgPSAwIDsgaSA8IG12aS0+bWJfc3RyaWRlOyBpKyspIHsKKyAgICAgICAgbXZpLT5tdltpXSA9IG12aS0+bXZbbXZpLT5tYl9zdHJpZGUgKyBpXTsKKyAgICB9Cit9CisKK3N0YXRpYyBUaWxlSW5mbyogZGVjb2RlX3RpbGVfaW5mbyhHZXRCaXRDb250ZXh0ICpnYiwgTGV2ZWxDb2RlcyAqbGMsIGludCBsZXZlbCkKK3sKKyAgICBUaWxlSW5mbyAqdGk7CisgICAgaW50IGksIGZsYWdzID0gMDsKKyAgICBpbnQxNl90IGJpYXMgPSAwOworICAgIE1WIG12ID0geyAwIH07CisKKyAgICBpZiAobGNbbGV2ZWxdLmZsYWdzX2NiLnRhYmxlKSB7CisgICAgICAgIGZsYWdzID0gZ2V0X3ZsYzIoZ2IsIGxjW2xldmVsXS5mbGFnc19jYi50YWJsZSwgbGNbbGV2ZWxdLmZsYWdzX2NiLmJpdHMsIDIpOworICAgIH0KKworICAgIGlmIChsY1tsZXZlbF0ubXZfY2IudGFibGUpIHsKKyAgICAgICAgdWludDE2X3QgbXZfY29kZSA9IGdldF92bGMyKGdiLCBsY1tsZXZlbF0ubXZfY2IudGFibGUsIGxjW2xldmVsXS5tdl9jYi5iaXRzLCAzKTsKKworICAgICAgICBpZiAobXZfY29kZSAhPSBsY1tsZXZlbF0ubXZfZXNjKSB7CisgICAgICAgICAgICBtdi54ID0gKGludDhfdCkobXZfY29kZSAmIDB4ZmYpOworICAgICAgICAgICAgbXYueSA9IChpbnQ4X3QpKG12X2NvZGUgPj4gOCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdi54ID0gZ2V0X3NiaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIG12LnkgPSBnZXRfc2JpdHMoZ2IsIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxjW2xldmVsXS5iaWFzX2NiLnRhYmxlKSB7CisgICAgICAgIHVpbnQxNl90IGJpYXNfdmFsID0gZ2V0X3ZsYzIoZ2IsIGxjW2xldmVsXS5iaWFzX2NiLnRhYmxlLCBsY1tsZXZlbF0uYmlhc19jYi5iaXRzLCAyKTsKKworICAgICAgICBpZiAoYmlhc192YWwgIT0gbGNbbGV2ZWxdLmJpYXNfZXNjKSB7CisgICAgICAgICAgICBiaWFzID0gKGludDE2X3QpKGJpYXNfdmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpYXMgPSBnZXRfc2JpdHMoZ2IsIDE2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRpID0gYXZfY2FsbG9jKDEsIHNpemVvZigqdGkpKTsKKyAgICBpZiAoIXRpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHRpLT5mbGFncyA9IGZsYWdzOworICAgIHRpLT5tdiA9IG12OworICAgIHRpLT5iaWFzID0gYmlhczsKKworICAgIGlmICh0aS0+ZmxhZ3MpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKHRpLT5mbGFncyAmICgxIDw8IGkpKSB7CisgICAgICAgICAgICAgICAgVGlsZUluZm8gKnN1YnRpID0gZGVjb2RlX3RpbGVfaW5mbyhnYiwgbGMsIGxldmVsICsgMSk7CisgICAgICAgICAgICAgICAgdGktPmNoaWxkW2ldID0gc3VidGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdGk7Cit9CisKK3N0YXRpYyBpbnQgdGlsZV9kb19ibG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGFuZSwgaW50IHgsIGludCB5LCBpbnQgZHgsIGludCBkeSwgaW50IHNpemUsIGludCBiaWFzKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoIWJpYXMpIHsKKyAgICAgICAgcmV0ID0gY29weV9ibG9jayhhdmN0eCwgZHN0LCBzcmMsIHBsYW5lLCB4LCB5LCBkeCwgZHksIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGNvcHlhZGRfYmxvY2soYXZjdHgsIGRzdCwgc3JjLCBwbGFuZSwgeCwgeSwgZHgsIGR5LCBzaXplLCBiaWFzKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlc3RvcmVfdHJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYW5lLCBpbnQgeCwgaW50IHksIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgVGlsZUluZm8gKnRpbGUsIE1WIHJvb3RfbXYpCit7CisgICAgaW50IHJldDsKKyAgICBNViBtdjsKKworICAgIG12LnggPSByb290X212LnggKyB0aWxlLT5tdi54OworICAgIG12LnkgPSByb290X212LnkgKyB0aWxlLT5tdi55OworCisgICAgaWYgKCF0aWxlLT5mbGFncykgeworICAgICAgICByZXQgPSB0aWxlX2RvX2Jsb2NrKGF2Y3R4LCBkc3QsIHNyYywgcGxhbmUsIHgsIHksIG12LngsIG12LnksIHNpemUsIHRpbGUtPmJpYXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpLCBoc2l6ZSA9IHNpemUgPj4gMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgeG9mZiA9IChpICYgMikgPT0gMCA/IDAgOiBoc2l6ZTsKKyAgICAgICAgICAgIGludCB5b2ZmID0gKGkgJiAxKSA9PSAwID8gMCA6IGhzaXplOworCisgICAgICAgICAgICBpZiAodGlsZS0+Y2hpbGRbaV0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSByZXN0b3JlX3RyZWUoYXZjdHgsIGRzdCwgc3JjLCBwbGFuZSwgeCArIHhvZmYsIHkgKyB5b2ZmLCBoc2l6ZSwgdGlsZS0+Y2hpbGRbaV0sIHJvb3RfbXYpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ0aWxlLT5jaGlsZFtpXSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IHRpbGVfZG9fYmxvY2soYXZjdHgsIGRzdCwgc3JjLCBwbGFuZSwgeCArIHhvZmYsIHkgKyB5b2ZmLCBtdi54LCBtdi55LCBoc2l6ZSwgdGlsZS0+Ymlhcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBleHRlbmRfZWRnZXMoQVZGcmFtZSAqYnVmLCBpbnQgdGlsZV9zaXplKQoreworICAgIGludCBjb21wLCBpLCBqOworCisgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDM7IGNvbXArKykgeworICAgICAgICBpbnQgc2hpZnQgPSBjb21wID4gMDsKKyAgICAgICAgaW50IHcgPSBidWYtPndpZHRoICA+PiBzaGlmdDsKKyAgICAgICAgaW50IGggPSBidWYtPmhlaWdodCA+PiBzaGlmdDsKKyAgICAgICAgaW50IHNpemUgPSBjb21wID09IDAgPyB0aWxlX3NpemUgOiB0aWxlX3NpemUgPj4gMTsKKyAgICAgICAgaW50IHN0cmlkZSA9IGJ1Zi0+bGluZXNpemVbY29tcF07CisgICAgICAgIHVpbnQ4X3QgKmZyYW1lYnVmID0gYnVmLT5kYXRhW2NvbXBdOworCisgICAgICAgIGludCByaWdodCAgPSBzaXplIC0gKHcgJiAoc2l6ZSAtIDEpKTsKKyAgICAgICAgaW50IGJvdHRvbSA9IHNpemUgLSAoaCAmIChzaXplIC0gMSkpOworCisgICAgICAgIGlmICgocmlnaHQgPT0gc2l6ZSkgJiYgKGJvdHRvbSA9PSBzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChyaWdodCAhPSBzaXplKSB7CisgICAgICAgICAgICBpbnQgb2ZmID0gdzsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZltvZmYgKyBpXSA9IDB4ODA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZiArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJvdHRvbSAhPSBzaXplKSB7CisgICAgICAgICAgICBpbnQgb2ZmID0gaCAqIHN0cmlkZTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBib3R0b207IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpZGU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZltvZmYgKyBpXSA9IDB4ODA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mZiArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY2x2X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBDTFZDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICB1aW50MzJfdCBmcmFtZV90eXBlOworICAgIGludCBpLCBqLCByZXQ7CisgICAgaW50IG1iX3JldCA9IDA7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0MnLCAnTCcsICdWJywgJzEnKSkgeworICAgICAgICBpbnQgc2tpcCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAoc2tpcCArIDEpICogOCk7CisgICAgfQorCisgICAgZnJhbWVfdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisKKyAgICBpZiAoKGZyYW1lX3R5cGUgJiAweDdmKSA9PSAweDMwKSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjLT5waWMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGMtPnBpYy0+a2V5X2ZyYW1lID0gMDsKKyAgICAgICAgYy0+cGljLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICB9IGVsc2UgaWYgKGZyYW1lX3R5cGUgJiAweDIpIHsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgYy0+bWJfd2lkdGggKiBjLT5tYl9oZWlnaHQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjLT5waWMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGMtPnBpYy0+a2V5X2ZyYW1lID0gMTsKKyAgICAgICAgYy0+cGljLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKworICAgICAgICBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOyAvLyBmcmFtZSBzaXplOworICAgICAgICBjLT5hY19xdWFudCAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICBjLT5sdW1hX2RjX3F1YW50ICAgPSAzMjsKKyAgICAgICAgYy0+Y2hyb21hX2RjX3F1YW50ID0gMzI7CisKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmYy0+Z2IsIGJ1ZiArIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAtIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGMtPnRvcF9kY1tpXSA9IDMyOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgYy0+bGVmdF9kY1tpXSA9IDMyOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT5tYl9oZWlnaHQ7IGorKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPm1iX3dpZHRoOyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfbWIoYywgaSwgaik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIG1iX3JldCA9IHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleHRlbmRfZWRnZXMoYy0+cGljLCBjLT50aWxlX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwbGFuZTsKKworICAgICAgICBpZiAoYy0+cG1iX3dpZHRoICogYy0+cG1iX2hlaWdodCA+IDhMTCooYnVmX3NpemUgLSBieXRlc3RyZWFtMl90ZWxsKCZnYikpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGMtPnBpYykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weShjLT5waWMsIGMtPnByZXYpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmYy0+Z2IsIGJ1ZiArIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZfc2l6ZSAtIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgbXZpX3Jlc2V0KCZjLT5tdmksIGMtPnBtYl93aWR0aCwgYy0+cG1iX2hlaWdodCwgMSA8PCBjLT50aWxlX3NoaWZ0KTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYy0+cG1iX2hlaWdodDsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cG1iX3dpZHRoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmYy0+Z2IpIDw9IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmMtPmdiKSkgeworICAgICAgICAgICAgICAgICAgICBNViBtdiA9IG12aV9wcmVkaWN0KCZjLT5tdmksIGksIGosIHplcm9fbXYpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDM7IHBsYW5lKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgeCA9IHBsYW5lID09IDAgPyBpIDw8IGMtPnRpbGVfc2hpZnQgOiBpIDw8IChjLT50aWxlX3NoaWZ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHkgPSBwbGFuZSA9PSAwID8gaiA8PCBjLT50aWxlX3NoaWZ0IDogaiA8PCAoYy0+dGlsZV9zaGlmdCAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBzaXplID0gcGxhbmUgPT0gMCA/IDEgPDwgYy0+dGlsZV9zaGlmdCA6IDEgPDwgKGMtPnRpbGVfc2hpZnQgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgbXggPSBwbGFuZSA9PSAwID8gbXYueCA6IG12LnggLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBteSA9IHBsYW5lID09IDAgPyBtdi55IDogbXYueSAvIDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNvcHlfYmxvY2soYXZjdHgsIGMtPnBpYywgYy0+cHJldiwgcGxhbmUsIHgsIHksIG14LCBteSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl9yZXQgPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgeCA9IGkgPDwgYy0+dGlsZV9zaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHkgPSBqIDw8IGMtPnRpbGVfc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gMSA8PCBjLT50aWxlX3NoaWZ0OworICAgICAgICAgICAgICAgICAgICBUaWxlSW5mbyAqdGlsZTsKKyAgICAgICAgICAgICAgICAgICAgTVYgbXYsIGNtdjsKKworICAgICAgICAgICAgICAgICAgICB0aWxlID0gZGVjb2RlX3RpbGVfaW5mbygmYy0+Z2IsIGMtPnlsZXYsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAoIXRpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBtdiA9IG12aV9wcmVkaWN0KCZjLT5tdmksIGksIGosIHRpbGUtPm12KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVzdG9yZV90cmVlKGF2Y3R4LCBjLT5waWMsIGMtPnByZXYsIDAsIHgsIHksIHNpemUsIHRpbGUsIG12KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBtYl9yZXQgPSByZXQ7CisgICAgICAgICAgICAgICAgICAgIHggPSBpIDw8IChjLT50aWxlX3NoaWZ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHkgPSBqIDw8IChjLT50aWxlX3NoaWZ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSAxIDw8IChjLT50aWxlX3NoaWZ0IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGNtdi54ID0gbXYueCArIHRpbGUtPm12Lng7CisgICAgICAgICAgICAgICAgICAgIGNtdi55ID0gbXYueSArIHRpbGUtPm12Lnk7CisgICAgICAgICAgICAgICAgICAgIGNtdi54IC89IDI7CisgICAgICAgICAgICAgICAgICAgIGNtdi55IC89IDI7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ0aWxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZSA9IGRlY29kZV90aWxlX2luZm8oJmMtPmdiLCBjLT51bGV2LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0aWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVzdG9yZV90cmVlKGF2Y3R4LCBjLT5waWMsIGMtPnByZXYsIDEsIHgsIHksIHNpemUsIHRpbGUsIGNtdik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbWJfcmV0ID0gcmV0OworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdGlsZSk7CisgICAgICAgICAgICAgICAgICAgIHRpbGUgPSBkZWNvZGVfdGlsZV9pbmZvKCZjLT5nYiwgYy0+dmxldiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHJlc3RvcmVfdHJlZShhdmN0eCwgYy0+cGljLCBjLT5wcmV2LCAyLCB4LCB5LCBzaXplLCB0aWxlLCBjbXYpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1iX3JldCA9IHJldDsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnRpbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG12aV91cGRhdGVfcm93KCZjLT5tdmkpOworICAgICAgICB9CisgICAgICAgIGV4dGVuZF9lZGdlcyhjLT5waWMsIGMtPnRpbGVfc2l6ZSk7CisKKyAgICAgICAgYy0+cGljLT5rZXlfZnJhbWUgPSAwOworICAgICAgICBjLT5waWMtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIGMtPnBpYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIEZGU1dBUChBVkZyYW1lICosIGMtPnBpYywgYy0+cHJldik7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBtYl9yZXQgPCAwID8gbWJfcmV0IDogYnVmX3NpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjbHZfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENMVkNvbnRleHQgKmNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQsIHcsIGg7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID09IDExMCkgeworICAgICAgICBjLT50aWxlX3NpemUgPSBBVl9STDMyKCZhdmN0eC0+ZXh0cmFkYXRhWzk0XSk7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPT0gMTUwKSB7CisgICAgICAgIGMtPnRpbGVfc2l6ZSA9IEFWX1JCMzIoJmF2Y3R4LT5leHRyYWRhdGFbMTM0XSk7CisgICAgfSBlbHNlIGlmICghYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIGMtPnRpbGVfc2l6ZSA9IDE2OworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgZXh0cmFkYXRhIHNpemU6ICVkXG4iLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBjLT50aWxlX3NoaWZ0ID0gYXZfbG9nMihjLT50aWxlX3NpemUpOworICAgIGlmICgxIDw8IGMtPnRpbGVfc2hpZnQgIT0gYy0+dGlsZV9zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGlsZSBzaXplOiAlZCwgaXMgbm90IHBvd2VyIG9mIDIuXG4iLCBjLT50aWxlX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICB3ID0gYXZjdHgtPndpZHRoOworICAgIGggPSBhdmN0eC0+aGVpZ2h0OworICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBGRkFMSUdOKHcsIDEgPDwgYy0+dGlsZV9zaGlmdCksIEZGQUxJR04oaCwgMSA8PCBjLT50aWxlX3NoaWZ0KSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYXZjdHgtPndpZHRoICA9IHc7CisgICAgYXZjdHgtPmhlaWdodCA9IGg7CisKKyAgICBjLT5hdmN0eCAgICAgICAgICAgPSBhdmN0eDsKKyAgICBjLT5tYl93aWR0aCAgICAgICAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgIDE2KSA+PiA0OworICAgIGMtPm1iX2hlaWdodCAgICAgICA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgMTYpID4+IDQ7CisgICAgYy0+cG1iX3dpZHRoICAgICAgID0gKHcgKyBjLT50aWxlX3NpemUgLSAxKSA+PiBjLT50aWxlX3NoaWZ0OworICAgIGMtPnBtYl9oZWlnaHQgICAgICA9IChoICsgYy0+dGlsZV9zaXplIC0gMSkgPj4gYy0+dGlsZV9zaGlmdDsKKyAgICBjLT5waWMgICAgICAgICAgICAgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGMtPnByZXYgICAgICAgICAgICA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgYy0+bXZpLm12ICAgICAgICAgID0gYXZfY2FsbG9jKGMtPnBtYl93aWR0aCAqIDIsIHNpemVvZigqYy0+bXZpLm12KSk7CisgICAgaWYgKCFjLT5waWMgfHwgIWMtPnByZXYgfHwgIWMtPm12aS5tdikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZmX2lkY3Rkc3BfaW5pdCgmYy0+aWRzcCwgYXZjdHgpOworICAgIHJldCA9IGluaXRfdmxjKCZjLT5kY192bGMsIDksIE5VTV9EQ19DT0RFUywKKyAgICAgICAgICAgICAgICAgICBjbHZfZGNfYml0cywgIDEsIDEsCisgICAgICAgICAgICAgICAgICAgY2x2X2RjX2NvZGVzLCAxLCAxLCAwKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGlzaW5nIERDIFZMQ1xuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldCA9IGZmX2luaXRfdmxjX3NwYXJzZSgmYy0+YWNfdmxjLCA5LCBOVU1fQUNfQ09ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9hY19iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X2FjX2NvZGVzLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfYWNfc3ltcywgIDIsIDIsIDApOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXNpbmcgQUMgVkxDXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBpbml0X3ZsYygmYy0+eWxldlswXS5mbGFnc19jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X2ZsYWdzeV8wX2JpdHMpLAorICAgICAgICAgICAgICAgICAgIGNsdl9mbGFnc3lfMF9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICBjbHZfZmxhZ3N5XzBfY29kZXMsIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBpbml0X3ZsYygmYy0+eWxldlsxXS5mbGFnc19jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X2ZsYWdzeV8xX2JpdHMpLAorICAgICAgICAgICAgICAgICAgIGNsdl9mbGFnc3lfMV9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICBjbHZfZmxhZ3N5XzFfY29kZXMsIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBpbml0X3ZsYygmYy0+eWxldlsyXS5mbGFnc19jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X2ZsYWdzeV8yX2JpdHMpLAorICAgICAgICAgICAgICAgICAgIGNsdl9mbGFnc3lfMl9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICBjbHZfZmxhZ3N5XzJfY29kZXMsIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBpbml0X3ZsYygmYy0+dWxldlswXS5mbGFnc19jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X2ZsYWdzdV8wX2JpdHMpLAorICAgICAgICAgICAgICAgICAgIGNsdl9mbGFnc3VfMF9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICBjbHZfZmxhZ3N1XzBfY29kZXMsIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBpbml0X3ZsYygmYy0+dWxldlsxXS5mbGFnc19jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X2ZsYWdzdV8xX2JpdHMpLAorICAgICAgICAgICAgICAgICAgIGNsdl9mbGFnc3VfMV9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICBjbHZfZmxhZ3N1XzFfY29kZXMsIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBpbml0X3ZsYygmYy0+dmxldlswXS5mbGFnc19jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X2ZsYWdzdl8wX2JpdHMpLAorICAgICAgICAgICAgICAgICAgIGNsdl9mbGFnc3ZfMF9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICBjbHZfZmxhZ3N2XzBfY29kZXMsIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBpbml0X3ZsYygmYy0+dmxldlsxXS5mbGFnc19jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X2ZsYWdzdl8xX2JpdHMpLAorICAgICAgICAgICAgICAgICAgIGNsdl9mbGFnc3ZfMV9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICBjbHZfZmxhZ3N2XzFfY29kZXMsIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmZl9pbml0X3ZsY19zcGFyc2UoJmMtPnlsZXZbMF0ubXZfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9tdnlfMF9iaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X212eV8wX2JpdHMsICAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfbXZ5XzBfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9tdnlfMF9zeW1zLCAgMiwgMiwgMCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZmX2luaXRfdmxjX3NwYXJzZSgmYy0+eWxldlsxXS5tdl9jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X212eV8xX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfbXZ5XzFfYml0cywgIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9tdnlfMV9jb2RlcywgMiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X212eV8xX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT55bGV2WzJdLm12X2NiLCA5LCBGRl9BUlJBWV9FTEVNUyhjbHZfbXZ5XzJfYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9tdnlfMl9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X212eV8yX2NvZGVzLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfbXZ5XzJfc3ltcywgIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmZl9pbml0X3ZsY19zcGFyc2UoJmMtPnlsZXZbM10ubXZfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9tdnlfM19iaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X212eV8zX2JpdHMsICAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfbXZ5XzNfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9tdnlfM19zeW1zLCAgMiwgMiwgMCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZmX2luaXRfdmxjX3NwYXJzZSgmYy0+dWxldlsxXS5tdl9jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X212dV8xX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfbXZ1XzFfYml0cywgIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9tdnVfMV9jb2RlcywgMiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X212dV8xX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT51bGV2WzJdLm12X2NiLCA5LCBGRl9BUlJBWV9FTEVNUyhjbHZfbXZ1XzJfYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9tdnVfMl9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X212dV8yX2NvZGVzLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfbXZ1XzJfc3ltcywgIDIsIDIsIDApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmZl9pbml0X3ZsY19zcGFyc2UoJmMtPnZsZXZbMV0ubXZfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9tdnZfMV9iaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X212dl8xX2JpdHMsICAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfbXZ2XzFfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9tdnZfMV9zeW1zLCAgMiwgMiwgMCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZmX2luaXRfdmxjX3NwYXJzZSgmYy0+dmxldlsyXS5tdl9jYiwgOSwgRkZfQVJSQVlfRUxFTVMoY2x2X212dl8yX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfbXZ2XzJfYml0cywgIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9tdnZfMl9jb2RlcywgMiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X212dl8yX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT55bGV2WzFdLmJpYXNfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9iaWFzeV8xX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfYmlhc3lfMV9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X2JpYXN5XzFfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9iaWFzeV8xX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT55bGV2WzJdLmJpYXNfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9iaWFzeV8yX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfYmlhc3lfMl9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X2JpYXN5XzJfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9iaWFzeV8yX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT55bGV2WzNdLmJpYXNfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9iaWFzeV8zX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfYmlhc3lfM19iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X2JpYXN5XzNfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9iaWFzeV8zX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT51bGV2WzFdLmJpYXNfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9iaWFzdV8xX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfYmlhc3VfMV9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X2JpYXN1XzFfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9iaWFzdV8xX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT51bGV2WzJdLmJpYXNfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9iaWFzdV8yX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfYmlhc3VfMl9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X2JpYXN1XzJfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9iaWFzdV8yX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT52bGV2WzFdLmJpYXNfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9iaWFzdl8xX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfYmlhc3ZfMV9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X2JpYXN2XzFfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9iaWFzdl8xX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfaW5pdF92bGNfc3BhcnNlKCZjLT52bGV2WzJdLmJpYXNfY2IsIDksIEZGX0FSUkFZX0VMRU1TKGNsdl9iaWFzdl8yX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHZfYmlhc3ZfMl9iaXRzLCAgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x2X2JpYXN2XzJfY29kZXMsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsdl9iaWFzdl8yX3N5bXMsICAyLCAyLCAwKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYy0+eWxldlswXS5tdl9lc2MgPSAweDA5MDk7CisgICAgYy0+eWxldlsxXS5tdl9lc2MgPSAweDBBMEE7CisgICAgYy0+eWxldlsyXS5tdl9lc2MgPSAweDEwMTA7CisgICAgYy0+eWxldlszXS5tdl9lc2MgPSAweDEzMTM7CisgICAgYy0+dWxldlsxXS5tdl9lc2MgPSAweDA4MDg7CisgICAgYy0+dWxldlsyXS5tdl9lc2MgPSAweDBCMEI7CisgICAgYy0+dmxldlsxXS5tdl9lc2MgPSAweDA4MDg7CisgICAgYy0+dmxldlsyXS5tdl9lc2MgPSAweDBCMEI7CisKKyAgICBjLT55bGV2WzFdLmJpYXNfZXNjID0gMHgxMDA7CisgICAgYy0+eWxldlsyXS5iaWFzX2VzYyA9IDB4MTAwOworICAgIGMtPnlsZXZbM10uYmlhc19lc2MgPSAweDEwMDsKKyAgICBjLT51bGV2WzFdLmJpYXNfZXNjID0gMHgxMDA7CisgICAgYy0+dWxldlsyXS5iaWFzX2VzYyA9IDB4MTAwOworICAgIGMtPnZsZXZbMV0uYmlhc19lc2MgPSAweDEwMDsKKyAgICBjLT52bGV2WzJdLmJpYXNfZXNjID0gMHgxMDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGNsdl9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDTFZDb250ZXh0ICpjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnByZXYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmMtPnBpYyk7CisKKyAgICBhdl9mcmVlcCgmYy0+bXZpLm12KTsKKworICAgIGZmX2ZyZWVfdmxjKCZjLT5kY192bGMpOworICAgIGZmX2ZyZWVfdmxjKCZjLT5hY192bGMpOworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZmZfZnJlZV92bGMoJmMtPnlsZXZbaV0ubXZfY2IpOworICAgICAgICBmZl9mcmVlX3ZsYygmYy0+eWxldltpXS5mbGFnc19jYik7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjLT55bGV2W2ldLmJpYXNfY2IpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjLT51bGV2W2ldLm12X2NiKTsKKyAgICAgICAgZmZfZnJlZV92bGMoJmMtPnVsZXZbaV0uZmxhZ3NfY2IpOworICAgICAgICBmZl9mcmVlX3ZsYygmYy0+dWxldltpXS5iaWFzX2NiKTsKKyAgICAgICAgZmZfZnJlZV92bGMoJmMtPnZsZXZbaV0ubXZfY2IpOworICAgICAgICBmZl9mcmVlX3ZsYygmYy0+dmxldltpXS5mbGFnc19jYik7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjLT52bGV2W2ldLmJpYXNfY2IpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2NsZWFydmlkZW9fZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY2xlYXJ2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkl0ZXJhdGVkIFN5c3RlbXMgQ2xlYXJWaWRlbyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9DTEVBUlZJREVPLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDTFZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBjbHZfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gY2x2X2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0gY2x2X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfCBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY2xlYXJ2aWRlb2RhdGEuaCBiL2xpYmF2Y29kZWMvY2xlYXJ2aWRlb2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2QxMmRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9jbGVhcnZpZGVvZGF0YS5oCkBAIC0wLDAgKzEsMTgzMiBAQAorLyoKKyAqIENsZWFyVmlkZW8gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTggS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfQ0xFQVJWSURFT0RBVEFfSAorI2RlZmluZSBBVkNPREVDX0NMRUFSVklERU9EQVRBX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2RlZmluZSBOVU1fRENfQ09ERVMgMTI3CisjZGVmaW5lIE5VTV9BQ19DT0RFUyAxMDMKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X2RjX2NvZGVzW05VTV9EQ19DT0RFU10gPSB7CisgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELCAweDBFLCAweDBGLAorICAgIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTMsIDB4MTQsIDB4MDcsIDB4MEIsCisgICAgMHgwQywgMHgwOCwgMHgwOCwgMHgwOSwgMHgwNCwgMHgwNiwgMHgwNywgMHgwNSwKKyAgICAweDA0LCAweDA1LCAweDA0LCAweDA2LCAweDA1LCAweDA2LCAweDA3LCAweDA1LAorICAgIDB4MDYsIDB4MDcsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDYsIDB4MDcsIDB4MDgsCisgICAgMHgwOSwgMHgwQSwgMHgwQiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwNywgMHgwOCwKKyAgICAweDA2LCAweDA3LCAweDA4LCAweDA2LCAweDA0LCAweDA1LCAweDAyLCAweDAxLAorICAgIDB4MDMsIDB4MDYsIDB4MDcsIDB4MDcsIDB4MDksIDB4MEEsIDB4MEIsIDB4MDksCisgICAgMHgwQSwgMHgwQiwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwgMHgwQywgMHgwOSwKKyAgICAweDBELCAweDBBLCAweDBCLCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDA3LAorICAgIDB4MDgsIDB4MDksIDB4MEEsIDB4MEIsIDB4MDYsIDB4MDcsIDB4MDYsIDB4MDgsCisgICAgMHgwNywgMHgwOSwgMHgwQSwgMHgwQiwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywKKyAgICAweDE0LCAweDBELCAweDBELCAweDBFLCAweDBGLCAweDE1LCAweDE1LCAweDE2LAorICAgIDB4MTcsIDB4MTgsIDB4MTksIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsCisgICAgMHgxRiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsdl9kY19iaXRzW05VTV9EQ19DT0RFU10gPSB7CisgICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLAorICAgIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKKyAgICAyMiwgMjIsIDIyLCAyMSwgMjIsIDIyLCAxOSwgMjAsCisgICAgMjAsIDE5LCAxOCwgMTgsIDE1LCAxNywgMTcsIDE2LAorICAgIDE0LCAxNSwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxMiwKKyAgICAxMiwgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDgsICA4LAorICAgICA3LCAgNywgIDcsICA2LCAgNSwgIDUsICAzLCAgMSwKKyAgICAgMywgIDUsICA1LCAgNiwgIDcsICA3LCAgNywgIDgsCisgICAgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgMTAsIDExLAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTcsCisgICAgMTYsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMTksIDE5LAorICAgIDIxLCAxOSwgMjAsIDE5LCAxOSwgMjEsIDIyLCAyMiwKKyAgICAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsCisgICAgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2FjX3N5bXNbTlVNX0FDX0NPREVTXSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNSwgMHgwMDA2LCAweDAwMDcsIDB4MDAwOCwKKyAgICAweDAwMDksIDB4MDAwQSwgMHgwMDBCLCAweDAwMEMsIDB4MDAxMSwgMHgwMDEyLCAweDAwMTMsIDB4MDAxNCwKKyAgICAweDAwMTUsIDB4MDAxNiwgMHgwMDIxLCAweDAwMjIsIDB4MDAyMywgMHgwMDI0LCAweDAwMzEsIDB4MDAzMiwKKyAgICAweDAwMzMsIDB4MDA0MSwgMHgwMDQyLCAweDAwNDMsIDB4MDA1MSwgMHgwMDUyLCAweDAwNTMsIDB4MDA2MSwKKyAgICAweDAwNjIsIDB4MDA2MywgMHgwMDcxLCAweDAwNzIsIDB4MDA4MSwgMHgwMDgyLCAweDAwOTEsIDB4MDA5MiwKKyAgICAweDAwQTEsIDB4MDBBMiwgMHgwMEIxLCAweDAwQzEsIDB4MDBEMSwgMHgwMEUxLCAweDAwRjEsIDB4MDEwMSwKKyAgICAweDAxMTEsIDB4MDEyMSwgMHgwMTMxLCAweDAxNDEsIDB4MDE1MSwgMHgwMTYxLCAweDAxNzEsIDB4MDE4MSwKKyAgICAweDAxOTEsIDB4MDFBMSwgMHgxMDAxLCAweDEwMDIsIDB4MTAwMywgMHgxMDExLCAweDEwMTIsIDB4MTAyMSwKKyAgICAweDEwMzEsIDB4MTA0MSwgMHgxMDUxLCAweDEwNjEsIDB4MTA3MSwgMHgxMDgxLCAweDEwOTEsIDB4MTBBMSwKKyAgICAweDEwQjEsIDB4MTBDMSwgMHgxMEQxLCAweDEwRTEsIDB4MTBGMSwgMHgxMTAxLCAweDExMTEsIDB4MTEyMSwKKyAgICAweDExMzEsIDB4MTE0MSwgMHgxMTUxLCAweDExNjEsIDB4MTE3MSwgMHgxMTgxLCAweDExOTEsIDB4MTFBMSwKKyAgICAweDExQjEsIDB4MTFDMSwgMHgxMUQxLCAweDExRTEsIDB4MTFGMSwgMHgxMjAxLCAweDEyMTEsIDB4MTIyMSwKKyAgICAweDEyMzEsIDB4MTI0MSwgMHgxMjUxLCAweDEyNjEsIDB4MTI3MSwgMHgxMjgxLCAweDFCRkYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfYWNfY29kZXNbTlVNX0FDX0NPREVTXSA9IHsKKyAgICAweDAyLCAweDBGLCAweDE1LCAweDE3LCAweDFGLCAweDI1LCAweDI0LCAweDIxLAorICAgIDB4MjAsIDB4MDcsIDB4MDYsIDB4MjAsIDB4MDYsIDB4MTQsIDB4MUUsIDB4MEYsCisgICAgMHgyMSwgMHg1MCwgMHgwRSwgMHgxRCwgMHgwRSwgMHg1MSwgMHgwRCwgMHgyMywKKyAgICAweDBELCAweDBDLCAweDIyLCAweDUyLCAweDBCLCAweDBDLCAweDUzLCAweDEzLAorICAgIDB4MEIsIDB4NTQsIDB4MTIsIDB4MEEsIDB4MTEsIDB4MDksIDB4MTAsIDB4MDgsCisgICAgMHgxNiwgMHg1NSwgMHgxNSwgMHgxNCwgMHgxQywgMHgxQiwgMHgyMSwgMHgyMCwKKyAgICAweDFGLCAweDFFLCAweDFELCAweDFDLCAweDFCLCAweDFBLCAweDIyLCAweDIzLAorICAgIDB4NTYsIDB4NTcsIDB4MDcsIDB4MTksIDB4MDUsIDB4MEYsIDB4MDQsIDB4MEUsCisgICAgMHgwRCwgMHgwQywgMHgxMywgMHgxMiwgMHgxMSwgMHgxMCwgMHgxQSwgMHgxOSwKKyAgICAweDE4LCAweDE3LCAweDE2LCAweDE1LCAweDE0LCAweDEzLCAweDE4LCAweDE3LAorICAgIDB4MTYsIDB4MTUsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MTEsIDB4MDcsIDB4MDYsCisgICAgMHgwNSwgMHgwNCwgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHg1OCwgMHg1OSwKKyAgICAweDVBLCAweDVCLCAweDVDLCAweDVELCAweDVFLCAweDVGLCAweDAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X2FjX2JpdHNbTlVNX0FDX0NPREVTXSA9IHsKKyAgICAgMiwgIDQsICA2LCAgNywgIDgsICA5LCAgOSwgMTAsCisgICAgMTAsIDExLCAxMSwgMTEsICAzLCAgNiwgIDgsIDEwLAorICAgIDExLCAxMiwgIDQsICA4LCAxMCwgMTIsICA1LCAgOSwKKyAgICAxMCwgIDUsICA5LCAxMiwgIDUsIDEwLCAxMiwgIDYsCisgICAgMTAsIDEyLCAgNiwgMTAsICA2LCAxMCwgIDYsIDEwLAorICAgICA3LCAxMiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMSwgMTEsCisgICAgMTIsIDEyLCAgNCwgIDksIDExLCAgNiwgMTEsICA2LAorICAgICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAgNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsdl9mbGFnc3lfMF9iaXRzW10gPSB7CisgICAgIDMsICA0LCAgNCwgIDQsICA0LCAgNCwgIDYsICA1LCAgNCwgIDcsICA0LCAgNSwgIDQsICA3LCAgNSwgIDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2ZsYWdzeV8wX2NvZGVzW10gPSB7CisgICAgMHgwMDAyLCAweDAwMDksIDB4MDAwQiwgMHgwMDA2LCAweDAwMEMsIDB4MDAwNywgMHgwMDNFLCAweDAwMUMsCisgICAgMHgwMDBELCAweDAwN0UsIDB4MDAwQSwgMHgwMDFELCAweDAwMDgsIDB4MDA3RiwgMHgwMDFFLCAweDAwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfZmxhZ3N5XzFfYml0c1tdID0geworICAgICAyLCAgNCwgIDQsICAzLCAgNCwgIDQsICA3LCAgNiwgIDQsICA2LCAgNCwgIDYsICA0LCAgOCwgIDgsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNsdl9mbGFnc3lfMV9jb2Rlc1tdID0geworICAgIDB4MDAwMCwgMHgwMDBBLCAweDAwMEMsIDB4MDAwMywgMHgwMDBCLCAweDAwMDksIDB4MDA3RSwgMHgwMDNELAorICAgIDB4MDAwRCwgMHgwMDNFLCAweDAwMEUsIDB4MDAzQywgMHgwMDA4LCAweDAwRkUsIDB4MDBGRiwgMHgwMDAyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X2ZsYWdzeV8yX2JpdHNbXSA9IHsKKyAgICAgMSwgIDQsICA0LCAgNCwgIDQsICA1LCAgNywgIDUsICA0LCAgNiwgIDUsICA4LCAgNCwgIDksIDEwLCAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfZmxhZ3N5XzJfY29kZXNbXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwQywgMHgwMDBCLCAweDAwMDgsIDB4MDAwQSwgMHgwMDFDLCAweDAwN0UsIDB4MDAxRCwKKyAgICAweDAwMEQsIDB4MDAzRSwgMHgwMDFFLCAweDAwRkUsIDB4MDAwOSwgMHgwMUZFLCAweDAzRkUsIDB4MDNGRiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsdl9mbGFnc3VfMF9iaXRzW10gPSB7CisgICAgIDEsICA0LCAgNCwgIDQsICA1LCAgNSwgIDksICA3LCAgNSwgIDksICA0LCAgNywgIDQsICA4LCAgNywgIDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2ZsYWdzdV8wX2NvZGVzW10gPSB7CisgICAgMHgwMDAwLCAweDAwMEIsIDB4MDAwRCwgMHgwMDA5LCAweDAwMUQsIDB4MDAxQywgMHgwMUZGLCAweDAwN0QsCisgICAgMHgwMDFFLCAweDAxRkUsIDB4MDAwQywgMHgwMDdDLCAweDAwMEEsIDB4MDBGRSwgMHgwMDdFLCAweDAwMDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfZmxhZ3N1XzFfYml0c1tdID0geworICAgICAxLCAgNCwgIDQsICA0LCAgNCwgIDQsICA4LCAgNiwgIDQsICA4LCAgNSwgIDgsICA0LCAxMCwgIDksIDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNsdl9mbGFnc3VfMV9jb2Rlc1tdID0geworICAgIDB4MDAwMCwgMHgwMDBDLCAweDAwMDgsIDB4MDAwQSwgMHgwMDBCLCAweDAwMEUsIDB4MDBGRCwgMHgwMDNFLAorICAgIDB4MDAwRCwgMHgwMEZDLCAweDAwMUUsIDB4MDBGRSwgMHgwMDA5LCAweDAzRkUsIDB4MDFGRSwgMHgwM0ZGLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X2ZsYWdzdl8wX2JpdHNbXSA9IHsKKyAgICAgMSwgIDQsICA1LCAgNCwgIDUsICA1LCAgOCwgMTAsICA1LCAgOSwgIDUsICA2LCAgNCwgMTAsICA3LCAgMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfZmxhZ3N2XzBfY29kZXNbXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwQSwgMHgwMDFCLCAweDAwMEMsIDB4MDAxRSwgMHgwMDFDLCAweDAwRkUsIDB4MDNGRSwKKyAgICAweDAwMUQsIDB4MDFGRSwgMHgwMDFBLCAweDAwM0UsIDB4MDAwQiwgMHgwM0ZGLCAweDAwN0UsIDB4MDAwNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsdl9mbGFnc3ZfMV9iaXRzW10gPSB7CisgICAgIDEsICA0LCAgNCwgIDQsICA0LCAgNSwgIDgsICA2LCAgMywgIDcsICA1LCAxMCwgIDUsIDExLCAgOSwgMTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2ZsYWdzdl8xX2NvZGVzW10gPSB7CisgICAgMHgwMDAwLCAweDAwMEQsIDB4MDAwQywgMHgwMDBBLCAweDAwMEIsIDB4MDAxRCwgMHgwMEZFLCAweDAwM0UsCisgICAgMHgwMDA0LCAweDAwN0UsIDB4MDAxRSwgMHgwM0ZFLCAweDAwMUMsIDB4MDdGRSwgMHgwMUZFLCAweDA3RkYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfbXZ5XzBfYml0c1tdID0geworICAgIDE2LCAxNCwgMTMsIDEzLCAxMywgMTIsIDExLCAxMSwgIDksIDExLCAxMSwgMTIsIDEzLCAxMywgMTMsIDE0LAorICAgIDE2LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTAsICA3LCAxMCwgMTIsIDEzLCAxMywgMTQsIDE0LAorICAgIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTEsIDEwLCAgNywgMTAsIDExLCAxMywgMTMsIDE0LAorICAgIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTQsIDEzLCAxMywgMTIsIDExLCAxMCwgIDcsIDEwLCAxMSwgMTIsIDEzLAorICAgIDEzLCAxNCwgMTQsIDE1LCAxNiwgMTUsIDE0LCAxMiwgMTIsIDEyLCAxMSwgMTAsICA2LCAxMCwgMTEsIDEyLAorICAgIDEyLCAxMiwgMTQsIDE1LCAxNiwgMTUsIDE0LCAxMywgMTMsIDEyLCAxMSwgMTAsICA5LCAgNiwgIDksIDEwLAorICAgIDExLCAxMiwgMTMsIDEzLCAxNCwgMTUsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTEsIDEwLCAgOCwgIDYsICA4LAorICAgIDEwLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTEsIDExLCAgOSwgIDcsICA0LAorICAgICA3LCAgOSwgMTEsIDExLCAxMiwgMTMsIDEzLCAxNCwgMTEsIDEwLCAxMCwgIDksICA5LCAgOCwgIDcsICA1LAorICAgICAxLCAgNSwgIDcsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDE0LCAxMywgMTMsIDEyLCAxMSwgMTEsICA5LAorICAgICA3LCAgNCwgIDcsICA5LCAxMSwgMTEsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTIsIDExLAorICAgIDEwLCAgOCwgIDYsICA4LCAxMCwgMTEsIDEyLCAxMiwgMTMsIDE0LCAxNCwgMTUsIDE0LCAxMywgMTMsIDEyLAorICAgIDExLCAxMCwgIDksICA3LCAgOSwgMTAsIDExLCAxMiwgMTMsIDEzLCAxNCwgMTUsIDE2LCAxNSwgMTQsIDEyLAorICAgIDEyLCAxMiwgMTEsIDEwLCAgNiwgMTAsIDExLCAxMiwgMTIsIDEyLCAxNCwgMTUsIDE2LCAxNSwgMTQsIDE0LAorICAgIDEzLCAxMywgMTIsIDExLCAxMCwgIDcsIDEwLCAxMSwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE0LAorICAgIDE0LCAxNCwgMTMsIDEzLCAxMSwgMTAsICA3LCAxMCwgMTEsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTIsIDEwLCAgNywgMTAsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LAorICAgIDE2LCAxNCwgMTMsIDEzLCAxMywgMTIsIDExLCAxMSwgIDksIDExLCAxMSwgMTIsIDEzLCAxMywgMTMsIDE0LAorICAgIDE2LCAgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfbXZ5XzBfY29kZXNbXSA9IHsKKyAgICAweEZGRkQsIDB4M0ZFNSwgMHgxRkQ4LCAweDFGQzQsIDB4MUZCQywgMHgwRkNCLCAweDA3Q0YsIDB4MDdDNCwKKyAgICAweDAxRDcsIDB4MDdDNiwgMHgwN0NFLCAweDBGQ0EsIDB4MUZCRCwgMHgxRkMyLCAweDFGRDksIDB4M0ZFNCwKKyAgICAweEZGRkUsIDB4N0ZGMCwgMHgzRkVGLCAweDNGRDIsIDB4M0ZDOSwgMHgxRkNDLCAweDFGQzAsIDB4MEZCNiwKKyAgICAweDAzRDYsIDB4MDA3MCwgMHgwM0Q3LCAweDBGQjcsIDB4MUZDMSwgMHgxRkNELCAweDNGQ0IsIDB4M0ZEMCwKKyAgICAweDNGRUQsIDB4N0ZGMiwgMHg3RkZCLCAweDNGREMsIDB4M0ZEOSwgMHgzRkQ0LCAweDFGQjYsIDB4MUZBRSwKKyAgICAweDA3QzAsIDB4MDNCQywgMHgwMDZELCAweDAzQkQsIDB4MDdDMSwgMHgxRkFGLCAweDFGQjcsIDB4M0ZEMSwKKyAgICAweDNGREIsIDB4M0ZERiwgMHg3RkY5LCAweDdGRUUsIDB4M0ZGMCwgMHgzRkM3LCAweDFGQzksIDB4MUZBNywKKyAgICAweDBGQUQsIDB4MDdEMiwgMHgwM0NFLCAweDAwNkMsIDB4MDNDRiwgMHgwN0QwLCAweDBGQUYsIDB4MUZBNiwKKyAgICAweDFGQzYsIDB4M0ZDNCwgMHgzRkYxLCAweDdGRUQsIDB4RkZGQiwgMHg3RkY2LCAweDNGRTYsIDB4MEZDQywKKyAgICAweDBGQzQsIDB4MEZCMCwgMHgwN0IwLCAweDAzQzYsIDB4MDAzMSwgMHgwM0M3LCAweDA3QjEsIDB4MEZCMSwKKyAgICAweDBGQzUsIDB4MEZDRCwgMHgzRkVBLCAweDdGRjcsIDB4RkZGOSwgMHg3RkU5LCAweDNGQ0UsIDB4MUZDRiwKKyAgICAweDFGQjIsIDB4MEZCOCwgMHgwN0JDLCAweDAzRDAsIDB4MDFEQSwgMHgwMDJGLCAweDAxREIsIDB4MDNEMSwKKyAgICAweDA3QkUsIDB4MEZCQSwgMHgxRkI0LCAweDFGRDAsIDB4M0ZDRCwgMHg3RkVCLCAweDNGRTEsIDB4M0ZDMSwKKyAgICAweDFGRDMsIDB4MEZDMywgMHgwRkJFLCAweDA3QjYsIDB4MDNDNCwgMHgwMEU0LCAweDAwMkQsIDB4MDBFNSwKKyAgICAweDAzQzUsIDB4MDdCNywgMHgwRkJGLCAweDBGQzEsIDB4MUZEMiwgMHgzRkMzLCAweDNGRTIsIDB4M0ZCRiwKKyAgICAweDFGREIsIDB4MUZBRCwgMHgxRkE1LCAweDA3Q0IsIDB4MDdCQiwgMHgwMUQ1LCAweDAwNjgsIDB4MDAwOCwKKyAgICAweDAwNjUsIDB4MDFEMiwgMHgwN0I4LCAweDA3QzgsIDB4MEZEMCwgMHgxRkFBLCAweDFGREEsIDB4M0ZCQywKKyAgICAweDA3RDQsIDB4MDNDQSwgMHgwM0MwLCAweDAxRDgsIDB4MDFEMCwgMHgwMEU2LCAweDAwNjksIDB4MDAxNCwKKyAgICAweDAwMDAsIDB4MDAxNSwgMHgwMDZBLCAweDAwRTcsIDB4MDFEMSwgMHgwMUQ5LCAweDAzQzEsIDB4MDNDQiwKKyAgICAweDA3RDUsIDB4M0ZCRSwgMHgxRkRDLCAweDFGQUIsIDB4MEZEMSwgMHgwN0M5LCAweDA3QjksIDB4MDFEMywKKyAgICAweDAwNjYsIDB4MDAwOSwgMHgwMDY3LCAweDAxRDQsIDB4MDdCQSwgMHgwN0NBLCAweDFGQTQsIDB4MUZBQywKKyAgICAweDFGREQsIDB4M0ZCRCwgMHgzRkUwLCAweDNGQzAsIDB4MUZENSwgMHgwRkMwLCAweDBGQkMsIDB4MDdCNCwKKyAgICAweDAzQzIsIDB4MDBFMiwgMHgwMDJDLCAweDAwRTMsIDB4MDNDMywgMHgwN0I1LCAweDBGQkQsIDB4MEZDMiwKKyAgICAweDFGRDcsIDB4M0ZDMiwgMHgzRkUzLCAweDdGRUEsIDB4M0ZDQywgMHgxRkNFLCAweDFGQjMsIDB4MEZCOSwKKyAgICAweDA3QkQsIDB4MDNEMiwgMHgwMURDLCAweDAwNjQsIDB4MDFERCwgMHgwM0QzLCAweDA3QkYsIDB4MEZCQiwKKyAgICAweDFGQjUsIDB4MUZEMSwgMHgzRkNGLCAweDdGRTgsIDB4RkZGQSwgMHg3RkY0LCAweDNGRUIsIDB4MEZDRSwKKyAgICAweDBGQzYsIDB4MEZCMiwgMHgwN0IyLCAweDAzQzgsIDB4MDAzMCwgMHgwM0M5LCAweDA3QjMsIDB4MEZCMywKKyAgICAweDBGQzcsIDB4MEZDRiwgMHgzRkU5LCAweDdGRjUsIDB4RkZGOCwgMHg3RkYzLCAweDNGRjMsIDB4M0ZDNiwKKyAgICAweDFGQzgsIDB4MUZBOCwgMHgwRkFDLCAweDA3RDEsIDB4MDNDQywgMHgwMDZCLCAweDAzQ0QsIDB4MDdEMywKKyAgICAweDBGQUUsIDB4MUZBOSwgMHgxRkM3LCAweDNGQzUsIDB4M0ZGMiwgMHg3RkVDLCAweDdGRkEsIDB4M0ZERSwKKyAgICAweDNGREEsIDB4M0ZENywgMHgxRkI5LCAweDFGQjAsIDB4MDdDMiwgMHgwM0JFLCAweDAwNkUsIDB4MDNCRiwKKyAgICAweDA3QzMsIDB4MUZCMSwgMHgxRkI4LCAweDNGRDMsIDB4M0ZEOCwgMHgzRkRELCAweDdGRjgsIDB4N0ZFRiwKKyAgICAweDNGRUUsIDB4M0ZENiwgMHgzRkM4LCAweDFGQ0IsIDB4MUZCRSwgMHgwRkI1LCAweDAzRDQsIDB4MDA2RiwKKyAgICAweDAzRDUsIDB4MEZCNCwgMHgxRkJGLCAweDFGQ0EsIDB4M0ZDQSwgMHgzRkQ1LCAweDNGRUMsIDB4N0ZGMSwKKyAgICAweEZGRkYsIDB4M0ZFOCwgMHgxRkQ0LCAweDFGQzUsIDB4MUZCQSwgMHgwRkM5LCAweDA3Q0QsIDB4MDdDNywKKyAgICAweDAxRDYsIDB4MDdDNSwgMHgwN0NDLCAweDBGQzgsIDB4MUZCQiwgMHgxRkMzLCAweDFGRDYsIDB4M0ZFNywKKyAgICAweEZGRkMsIDB4MDAyRSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfbXZ5XzBfc3ltc1tdID0geworICAgIDB4RjhGOCwgMHhGOUY4LCAweEZBRjgsIDB4RkJGOCwgMHhGQ0Y4LCAweEZERjgsIDB4RkVGOCwgMHhGRkY4LAorICAgIDB4MDBGOCwgMHgwMUY4LCAweDAyRjgsIDB4MDNGOCwgMHgwNEY4LCAweDA1RjgsIDB4MDZGOCwgMHgwN0Y4LAorICAgIDB4MDhGOCwgMHhGOEY5LCAweEY5RjksIDB4RkFGOSwgMHhGQkY5LCAweEZDRjksIDB4RkRGOSwgMHhGRUY5LAorICAgIDB4RkZGOSwgMHgwMEY5LCAweDAxRjksIDB4MDJGOSwgMHgwM0Y5LCAweDA0RjksIDB4MDVGOSwgMHgwNkY5LAorICAgIDB4MDdGOSwgMHgwOEY5LCAweEY4RkEsIDB4RjlGQSwgMHhGQUZBLCAweEZCRkEsIDB4RkNGQSwgMHhGREZBLAorICAgIDB4RkVGQSwgMHhGRkZBLCAweDAwRkEsIDB4MDFGQSwgMHgwMkZBLCAweDAzRkEsIDB4MDRGQSwgMHgwNUZBLAorICAgIDB4MDZGQSwgMHgwN0ZBLCAweDA4RkEsIDB4RjhGQiwgMHhGOUZCLCAweEZBRkIsIDB4RkJGQiwgMHhGQ0ZCLAorICAgIDB4RkRGQiwgMHhGRUZCLCAweEZGRkIsIDB4MDBGQiwgMHgwMUZCLCAweDAyRkIsIDB4MDNGQiwgMHgwNEZCLAorICAgIDB4MDVGQiwgMHgwNkZCLCAweDA3RkIsIDB4MDhGQiwgMHhGOEZDLCAweEY5RkMsIDB4RkFGQywgMHhGQkZDLAorICAgIDB4RkNGQywgMHhGREZDLCAweEZFRkMsIDB4RkZGQywgMHgwMEZDLCAweDAxRkMsIDB4MDJGQywgMHgwM0ZDLAorICAgIDB4MDRGQywgMHgwNUZDLCAweDA2RkMsIDB4MDdGQywgMHgwOEZDLCAweEY4RkQsIDB4RjlGRCwgMHhGQUZELAorICAgIDB4RkJGRCwgMHhGQ0ZELCAweEZERkQsIDB4RkVGRCwgMHhGRkZELCAweDAwRkQsIDB4MDFGRCwgMHgwMkZELAorICAgIDB4MDNGRCwgMHgwNEZELCAweDA1RkQsIDB4MDZGRCwgMHgwN0ZELCAweDA4RkQsIDB4RjhGRSwgMHhGOUZFLAorICAgIDB4RkFGRSwgMHhGQkZFLCAweEZDRkUsIDB4RkRGRSwgMHhGRUZFLCAweEZGRkUsIDB4MDBGRSwgMHgwMUZFLAorICAgIDB4MDJGRSwgMHgwM0ZFLCAweDA0RkUsIDB4MDVGRSwgMHgwNkZFLCAweDA3RkUsIDB4MDhGRSwgMHhGOEZGLAorICAgIDB4RjlGRiwgMHhGQUZGLCAweEZCRkYsIDB4RkNGRiwgMHhGREZGLCAweEZFRkYsIDB4RkZGRiwgMHgwMEZGLAorICAgIDB4MDFGRiwgMHgwMkZGLCAweDAzRkYsIDB4MDRGRiwgMHgwNUZGLCAweDA2RkYsIDB4MDdGRiwgMHgwOEZGLAorICAgIDB4RjgwMCwgMHhGOTAwLCAweEZBMDAsIDB4RkIwMCwgMHhGQzAwLCAweEZEMDAsIDB4RkUwMCwgMHhGRjAwLAorICAgIDB4MDAwMCwgMHgwMTAwLCAweDAyMDAsIDB4MDMwMCwgMHgwNDAwLCAweDA1MDAsIDB4MDYwMCwgMHgwNzAwLAorICAgIDB4MDgwMCwgMHhGODAxLCAweEY5MDEsIDB4RkEwMSwgMHhGQjAxLCAweEZDMDEsIDB4RkQwMSwgMHhGRTAxLAorICAgIDB4RkYwMSwgMHgwMDAxLCAweDAxMDEsIDB4MDIwMSwgMHgwMzAxLCAweDA0MDEsIDB4MDUwMSwgMHgwNjAxLAorICAgIDB4MDcwMSwgMHgwODAxLCAweEY4MDIsIDB4RjkwMiwgMHhGQTAyLCAweEZCMDIsIDB4RkMwMiwgMHhGRDAyLAorICAgIDB4RkUwMiwgMHhGRjAyLCAweDAwMDIsIDB4MDEwMiwgMHgwMjAyLCAweDAzMDIsIDB4MDQwMiwgMHgwNTAyLAorICAgIDB4MDYwMiwgMHgwNzAyLCAweDA4MDIsIDB4RjgwMywgMHhGOTAzLCAweEZBMDMsIDB4RkIwMywgMHhGQzAzLAorICAgIDB4RkQwMywgMHhGRTAzLCAweEZGMDMsIDB4MDAwMywgMHgwMTAzLCAweDAyMDMsIDB4MDMwMywgMHgwNDAzLAorICAgIDB4MDUwMywgMHgwNjAzLCAweDA3MDMsIDB4MDgwMywgMHhGODA0LCAweEY5MDQsIDB4RkEwNCwgMHhGQjA0LAorICAgIDB4RkMwNCwgMHhGRDA0LCAweEZFMDQsIDB4RkYwNCwgMHgwMDA0LCAweDAxMDQsIDB4MDIwNCwgMHgwMzA0LAorICAgIDB4MDQwNCwgMHgwNTA0LCAweDA2MDQsIDB4MDcwNCwgMHgwODA0LCAweEY4MDUsIDB4RjkwNSwgMHhGQTA1LAorICAgIDB4RkIwNSwgMHhGQzA1LCAweEZEMDUsIDB4RkUwNSwgMHhGRjA1LCAweDAwMDUsIDB4MDEwNSwgMHgwMjA1LAorICAgIDB4MDMwNSwgMHgwNDA1LCAweDA1MDUsIDB4MDYwNSwgMHgwNzA1LCAweDA4MDUsIDB4RjgwNiwgMHhGOTA2LAorICAgIDB4RkEwNiwgMHhGQjA2LCAweEZDMDYsIDB4RkQwNiwgMHhGRTA2LCAweEZGMDYsIDB4MDAwNiwgMHgwMTA2LAorICAgIDB4MDIwNiwgMHgwMzA2LCAweDA0MDYsIDB4MDUwNiwgMHgwNjA2LCAweDA3MDYsIDB4MDgwNiwgMHhGODA3LAorICAgIDB4RjkwNywgMHhGQTA3LCAweEZCMDcsIDB4RkMwNywgMHhGRDA3LCAweEZFMDcsIDB4RkYwNywgMHgwMDA3LAorICAgIDB4MDEwNywgMHgwMjA3LCAweDAzMDcsIDB4MDQwNywgMHgwNTA3LCAweDA2MDcsIDB4MDcwNywgMHgwODA3LAorICAgIDB4RjgwOCwgMHhGOTA4LCAweEZBMDgsIDB4RkIwOCwgMHhGQzA4LCAweEZEMDgsIDB4RkUwOCwgMHhGRjA4LAorICAgIDB4MDAwOCwgMHgwMTA4LCAweDAyMDgsIDB4MDMwOCwgMHgwNDA4LCAweDA1MDgsIDB4MDYwOCwgMHgwNzA4LAorICAgIDB4MDgwOCwgMHgwOTA5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X212eV8xX2JpdHNbXSA9IHsKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTMsIDExLCAgOSwgMTEsIDEzLCAxMywgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTIsIDEwLCAgOSwgMTAsIDEyLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDExLCAgOCwKKyAgICAxMSwgMTIsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEyLCAxMiwKKyAgICAxMiwgMTAsICA4LCAxMCwgMTIsIDEyLCAxMiwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTQsIDE0LCAxMywKKyAgICAxMywgMTIsIDEyLCAxMSwgMTAsICA4LCAxMCwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNCwKKyAgICAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMSwgIDksICA3LCAgOSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDExLCAxMCwgIDksICA3LCAgOSwgMTAsIDExLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTEsIDExLCAxMCwgIDgsICA3LCAgOCwKKyAgICAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTQsIDEzLCAxMywgMTMsIDEyLCAxMSwgMTEsIDEwLCAgOSwKKyAgICAgNiwgIDQsICA2LCAgOSwgMTAsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEyLCAxMSwgMTAsIDEwLCAxMCwKKyAgICAgOSwgIDksICA3LCAgNSwgIDEsICA1LCAgNywgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTIsIDEzLCAxMywKKyAgICAxMywgMTIsIDExLCAxMSwgMTAsICA5LCAgNiwgIDQsICA2LCAgOSwgMTAsIDExLCAxMSwgMTIsIDEzLCAxMywKKyAgICAxMywgMTQsIDEzLCAxMywgMTIsIDEyLCAxMSwgMTEsIDEwLCAgOCwgIDcsICA4LCAxMCwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMiwgMTEsIDEwLCAgOSwgIDcsICA5LCAxMCwKKyAgICAxMSwgMTIsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMiwgMTIsIDExLCAgOSwKKyAgICAgNywgIDksIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMiwKKyAgICAxMiwgMTEsIDEwLCAgOCwgMTAsIDExLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTMsIDEyLCAxMiwgMTIsIDEwLCAgOCwgMTAsIDEyLCAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNSwgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDExLCAgOCwgMTEsIDEyLCAxMywgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTIsIDEwLCAgOSwgMTAsIDEyLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTMsIDExLCAgOSwKKyAgICAxMSwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAgNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfbXZ5XzFfY29kZXNbXSA9IHsKKyAgICAweDdGRjksIDB4N0ZGNiwgMHg3RkVCLCAweDdGRTMsIDB4M0ZDRiwgMHgzRkIzLCAweDFGQkQsIDB4MUZBMSwKKyAgICAweDA3QUQsIDB4MDFDRSwgMHgwN0FGLCAweDFGQTAsIDB4MUZCQiwgMHgzRkIwLCAweDNGQ0MsIDB4N0ZFMiwKKyAgICAweDdGRTksIDB4N0ZGNCwgMHg3RkZCLCAweDdGRjEsIDB4M0ZFNywgMHgzRkJELCAweDFGQTUsIDB4MUY5QiwKKyAgICAweDBGQjQsIDB4MEZBRiwgMHgwRkFBLCAweDAzQ0MsIDB4MDFDRCwgMHgwM0NELCAweDBGQUIsIDB4MEZBRCwKKyAgICAweDBGQjEsIDB4MUY5QywgMHgxRkEzLCAweDNGQkUsIDB4M0ZFNiwgMHg3RkYwLCAweDdGRkMsIDB4N0ZFNSwKKyAgICAweDNGQjUsIDB4M0ZBRSwgMHgxRkI0LCAweDFGQUEsIDB4MUY5NywgMHgwRjg1LCAweDA3QTIsIDB4MDBERCwKKyAgICAweDA3QTMsIDB4MEY4NiwgMHgxRjk5LCAweDFGQUQsIDB4MUZCMiwgMHgzRkFDLCAweDNGQjcsIDB4N0ZFNCwKKyAgICAweDdGRkQsIDB4M0ZFQSwgMHgzRkQ4LCAweDNGQzMsIDB4M0ZCQiwgMHgxRkM5LCAweDBGQkMsIDB4MEY5NywKKyAgICAweDBGOEYsIDB4MDNCOCwgMHgwMERBLCAweDAzQjksIDB4MEY5MCwgMHgwRjk4LCAweDBGQjksIDB4MUZDNiwKKyAgICAweDNGQkEsIDB4M0ZDMCwgMHgzRkQ5LCAweDNGRUIsIDB4N0ZFRiwgMHgzRkVFLCAweDNGRDcsIDB4MUZDMywKKyAgICAweDFGOTYsIDB4MEZDMCwgMHgwRkE4LCAweDA3QUEsIDB4MDNCRSwgMHgwMEQ5LCAweDAzQkYsIDB4MDdBQiwKKyAgICAweDBGQTcsIDB4MEZCRiwgMHgxRjk4LCAweDFGQzUsIDB4M0ZENiwgMHgzRkVGLCAweDdGRUUsIDB4M0ZEQywKKyAgICAweDNGQ0EsIDB4MUZCRiwgMHgxRjhCLCAweDFGODcsIDB4MEZBMiwgMHgwRjk0LCAweDA3QTUsIDB4MDFENCwKKyAgICAweDAwNjksIDB4MDFENSwgMHgwN0E2LCAweDBGOTUsIDB4MEZBMywgMHgxRjg5LCAweDFGOEQsIDB4MUZDMCwKKyAgICAweDNGQzYsIDB4M0ZERSwgMHgzRkUwLCAweDNGRDMsIDB4MUZCOCwgMHgxRjhGLCAweDFGODQsIDB4MEY4OSwKKyAgICAweDA3QkMsIDB4MDNDNiwgMHgwMUM2LCAweDAwNjcsIDB4MDFDNywgMHgwM0M3LCAweDA3QkQsIDB4MEY4NywKKyAgICAweDFGODIsIDB4MUY4QSwgMHgxRkI2LCAweDNGRDEsIDB4M0ZFMiwgMHgzRkM1LCAweDFGQ0UsIDB4MUZBRSwKKyAgICAweDBGQjUsIDB4MEY4QiwgMHgwN0I0LCAweDA3QjAsIDB4MDNCNCwgMHgwMERFLCAweDAwNjQsIDB4MDBERiwKKyAgICAweDAzQjUsIDB4MDdCMSwgMHgwN0I1LCAweDBGOEMsIDB4MEZCNiwgMHgxRkFGLCAweDFGRDEsIDB4M0ZDQiwKKyAgICAweDFGRDMsIDB4MUZDQywgMHgxRkE3LCAweDBGOUIsIDB4MDdCRSwgMHgwNzlDLCAweDAzQzAsIDB4MDFDOCwKKyAgICAweDAwMkUsIDB4MDAwOCwgMHgwMDJGLCAweDAxQzksIDB4MDNDMSwgMHgwNzlELCAweDBGODIsIDB4MEY5QSwKKyAgICAweDFGQTksIDB4MUZDQSwgMHgxRkQ0LCAweDBGOUYsIDB4MDdCNiwgMHgwM0M4LCAweDAzQjIsIDB4MDNCMCwKKyAgICAweDAxRDYsIDB4MDFEMCwgMHgwMDZBLCAweDAwMTQsIDB4MDAwMCwgMHgwMDE1LCAweDAwNkIsIDB4MDFEMSwKKyAgICAweDAxRDcsIDB4MDNCMSwgMHgwM0IzLCAweDAzQzksIDB4MDdCNywgMHgwRkEwLCAweDFGRDUsIDB4MUZDQiwKKyAgICAweDFGQUIsIDB4MEY5QywgMHgwN0JGLCAweDA3OUUsIDB4MDNDMiwgMHgwMUNBLCAweDAwMzAsIDB4MDAwOSwKKyAgICAweDAwMzEsIDB4MDFDQiwgMHgwM0MzLCAweDA3OUYsIDB4MDdDMCwgMHgwRjlELCAweDFGQUMsIDB4MUZDRCwKKyAgICAweDFGRDIsIDB4M0ZDOCwgMHgxRkQwLCAweDFGQjAsIDB4MEZCNywgMHgwRjhELCAweDA3QjgsIDB4MDdCMiwKKyAgICAweDAzQjYsIDB4MDBFMCwgMHgwMDY1LCAweDAwRTEsIDB4MDNCNywgMHgwN0IzLCAweDA3QjksIDB4MEY4RSwKKyAgICAweDBGQjgsIDB4MUZCMSwgMHgxRkNGLCAweDNGQzksIDB4M0ZFMSwgMHgzRkQyLCAweDFGQjcsIDB4MUY4RSwKKyAgICAweDFGODMsIDB4MEY4OCwgMHgwN0JBLCAweDAzQzQsIDB4MDFDNCwgMHgwMDY2LCAweDAxQzUsIDB4MDNDNSwKKyAgICAweDA3QkIsIDB4MEY4QSwgMHgxRjg1LCAweDFGOTAsIDB4MUZCOSwgMHgzRkQwLCAweDNGRTMsIDB4M0ZERCwKKyAgICAweDNGQzcsIDB4MUZDMSwgMHgxRjkxLCAweDFGODgsIDB4MEZBNCwgMHgwRjk2LCAweDA3QTcsIDB4MDFEMiwKKyAgICAweDAwNjgsIDB4MDFEMywgMHgwN0E0LCAweDBGOTMsIDB4MEZBMSwgMHgxRjg2LCAweDFGOEMsIDB4MUZCRSwKKyAgICAweDNGQzQsIDB4M0ZERiwgMHg3RkVELCAweDNGRUMsIDB4M0ZENCwgMHgxRkM0LCAweDFGOTIsIDB4MEZCRCwKKyAgICAweDBGQTUsIDB4MDdBOCwgMHgwM0JDLCAweDAwRDgsIDB4MDNCRCwgMHgwN0E5LCAweDBGQTYsIDB4MEZCRSwKKyAgICAweDFGOTMsIDB4MUZDMiwgMHgzRkQ1LCAweDNGRUQsIDB4N0ZFQywgMHgzRkU4LCAweDNGREIsIDB4M0ZDMSwKKyAgICAweDNGQjksIDB4MUZDNywgMHgwRkJBLCAweDBGOUUsIDB4MEY5MSwgMHgwM0JBLCAweDAwREIsIDB4MDNCQiwKKyAgICAweDBGOTIsIDB4MEY5OSwgMHgwRkJCLCAweDFGQzgsIDB4M0ZCOCwgMHgzRkMyLCAweDNGREEsIDB4M0ZFOSwKKyAgICAweDdGRkYsIDB4N0ZFNywgMHgzRkI2LCAweDNGQUYsIDB4MUZCMywgMHgxRkE2LCAweDFGOTQsIDB4MEY4MywKKyAgICAweDA3QTAsIDB4MDBEQywgMHgwN0ExLCAweDBGODQsIDB4MUY5NSwgMHgxRkE4LCAweDFGQjUsIDB4M0ZBRCwKKyAgICAweDNGQjQsIDB4N0ZFNiwgMHg3RkZFLCAweDdGRjMsIDB4M0ZFNSwgMHgzRkJDLCAweDFGQTQsIDB4MUY5RCwKKyAgICAweDBGQjIsIDB4MEZBRSwgMHgwRkE5LCAweDAzQ0EsIDB4MDFDQywgMHgwM0NCLCAweDBGQUMsIDB4MEZCMCwKKyAgICAweDBGQjMsIDB4MUY5QSwgMHgxRkEyLCAweDNGQkYsIDB4M0ZFNCwgMHg3RkYyLCAweDdGRjgsIDB4N0ZGNSwKKyAgICAweDdGRUEsIDB4N0ZFMCwgMHgzRkNELCAweDNGQjEsIDB4MUZCQSwgMHgxRjlGLCAweDA3QUUsIDB4MDFDRiwKKyAgICAweDA3QUMsIDB4MUY5RSwgMHgxRkJDLCAweDNGQjIsIDB4M0ZDRSwgMHg3RkUxLCAweDdGRTgsIDB4N0ZGNywKKyAgICAweDdGRkEsIDB4MDAxNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfbXZ5XzFfc3ltc1tdID0geworICAgIDB4RjdGNywgMHhGOEY3LCAweEY5RjcsIDB4RkFGNywgMHhGQkY3LCAweEZDRjcsIDB4RkRGNywgMHhGRUY3LAorICAgIDB4RkZGNywgMHgwMEY3LCAweDAxRjcsIDB4MDJGNywgMHgwM0Y3LCAweDA0RjcsIDB4MDVGNywgMHgwNkY3LAorICAgIDB4MDdGNywgMHgwOEY3LCAweDA5RjcsIDB4RjdGOCwgMHhGOEY4LCAweEY5RjgsIDB4RkFGOCwgMHhGQkY4LAorICAgIDB4RkNGOCwgMHhGREY4LCAweEZFRjgsIDB4RkZGOCwgMHgwMEY4LCAweDAxRjgsIDB4MDJGOCwgMHgwM0Y4LAorICAgIDB4MDRGOCwgMHgwNUY4LCAweDA2RjgsIDB4MDdGOCwgMHgwOEY4LCAweDA5RjgsIDB4RjdGOSwgMHhGOEY5LAorICAgIDB4RjlGOSwgMHhGQUY5LCAweEZCRjksIDB4RkNGOSwgMHhGREY5LCAweEZFRjksIDB4RkZGOSwgMHgwMEY5LAorICAgIDB4MDFGOSwgMHgwMkY5LCAweDAzRjksIDB4MDRGOSwgMHgwNUY5LCAweDA2RjksIDB4MDdGOSwgMHgwOEY5LAorICAgIDB4MDlGOSwgMHhGN0ZBLCAweEY4RkEsIDB4RjlGQSwgMHhGQUZBLCAweEZCRkEsIDB4RkNGQSwgMHhGREZBLAorICAgIDB4RkVGQSwgMHhGRkZBLCAweDAwRkEsIDB4MDFGQSwgMHgwMkZBLCAweDAzRkEsIDB4MDRGQSwgMHgwNUZBLAorICAgIDB4MDZGQSwgMHgwN0ZBLCAweDA4RkEsIDB4MDlGQSwgMHhGN0ZCLCAweEY4RkIsIDB4RjlGQiwgMHhGQUZCLAorICAgIDB4RkJGQiwgMHhGQ0ZCLCAweEZERkIsIDB4RkVGQiwgMHhGRkZCLCAweDAwRkIsIDB4MDFGQiwgMHgwMkZCLAorICAgIDB4MDNGQiwgMHgwNEZCLCAweDA1RkIsIDB4MDZGQiwgMHgwN0ZCLCAweDA4RkIsIDB4MDlGQiwgMHhGN0ZDLAorICAgIDB4RjhGQywgMHhGOUZDLCAweEZBRkMsIDB4RkJGQywgMHhGQ0ZDLCAweEZERkMsIDB4RkVGQywgMHhGRkZDLAorICAgIDB4MDBGQywgMHgwMUZDLCAweDAyRkMsIDB4MDNGQywgMHgwNEZDLCAweDA1RkMsIDB4MDZGQywgMHgwN0ZDLAorICAgIDB4MDhGQywgMHgwOUZDLCAweEY3RkQsIDB4RjhGRCwgMHhGOUZELCAweEZBRkQsIDB4RkJGRCwgMHhGQ0ZELAorICAgIDB4RkRGRCwgMHhGRUZELCAweEZGRkQsIDB4MDBGRCwgMHgwMUZELCAweDAyRkQsIDB4MDNGRCwgMHgwNEZELAorICAgIDB4MDVGRCwgMHgwNkZELCAweDA3RkQsIDB4MDhGRCwgMHgwOUZELCAweEY3RkUsIDB4RjhGRSwgMHhGOUZFLAorICAgIDB4RkFGRSwgMHhGQkZFLCAweEZDRkUsIDB4RkRGRSwgMHhGRUZFLCAweEZGRkUsIDB4MDBGRSwgMHgwMUZFLAorICAgIDB4MDJGRSwgMHgwM0ZFLCAweDA0RkUsIDB4MDVGRSwgMHgwNkZFLCAweDA3RkUsIDB4MDhGRSwgMHgwOUZFLAorICAgIDB4RjdGRiwgMHhGOEZGLCAweEY5RkYsIDB4RkFGRiwgMHhGQkZGLCAweEZDRkYsIDB4RkRGRiwgMHhGRUZGLAorICAgIDB4RkZGRiwgMHgwMEZGLCAweDAxRkYsIDB4MDJGRiwgMHgwM0ZGLCAweDA0RkYsIDB4MDVGRiwgMHgwNkZGLAorICAgIDB4MDdGRiwgMHgwOEZGLCAweDA5RkYsIDB4RjcwMCwgMHhGODAwLCAweEY5MDAsIDB4RkEwMCwgMHhGQjAwLAorICAgIDB4RkMwMCwgMHhGRDAwLCAweEZFMDAsIDB4RkYwMCwgMHgwMDAwLCAweDAxMDAsIDB4MDIwMCwgMHgwMzAwLAorICAgIDB4MDQwMCwgMHgwNTAwLCAweDA2MDAsIDB4MDcwMCwgMHgwODAwLCAweDA5MDAsIDB4RjcwMSwgMHhGODAxLAorICAgIDB4RjkwMSwgMHhGQTAxLCAweEZCMDEsIDB4RkMwMSwgMHhGRDAxLCAweEZFMDEsIDB4RkYwMSwgMHgwMDAxLAorICAgIDB4MDEwMSwgMHgwMjAxLCAweDAzMDEsIDB4MDQwMSwgMHgwNTAxLCAweDA2MDEsIDB4MDcwMSwgMHgwODAxLAorICAgIDB4MDkwMSwgMHhGNzAyLCAweEY4MDIsIDB4RjkwMiwgMHhGQTAyLCAweEZCMDIsIDB4RkMwMiwgMHhGRDAyLAorICAgIDB4RkUwMiwgMHhGRjAyLCAweDAwMDIsIDB4MDEwMiwgMHgwMjAyLCAweDAzMDIsIDB4MDQwMiwgMHgwNTAyLAorICAgIDB4MDYwMiwgMHgwNzAyLCAweDA4MDIsIDB4MDkwMiwgMHhGNzAzLCAweEY4MDMsIDB4RjkwMywgMHhGQTAzLAorICAgIDB4RkIwMywgMHhGQzAzLCAweEZEMDMsIDB4RkUwMywgMHhGRjAzLCAweDAwMDMsIDB4MDEwMywgMHgwMjAzLAorICAgIDB4MDMwMywgMHgwNDAzLCAweDA1MDMsIDB4MDYwMywgMHgwNzAzLCAweDA4MDMsIDB4MDkwMywgMHhGNzA0LAorICAgIDB4RjgwNCwgMHhGOTA0LCAweEZBMDQsIDB4RkIwNCwgMHhGQzA0LCAweEZEMDQsIDB4RkUwNCwgMHhGRjA0LAorICAgIDB4MDAwNCwgMHgwMTA0LCAweDAyMDQsIDB4MDMwNCwgMHgwNDA0LCAweDA1MDQsIDB4MDYwNCwgMHgwNzA0LAorICAgIDB4MDgwNCwgMHgwOTA0LCAweEY3MDUsIDB4RjgwNSwgMHhGOTA1LCAweEZBMDUsIDB4RkIwNSwgMHhGQzA1LAorICAgIDB4RkQwNSwgMHhGRTA1LCAweEZGMDUsIDB4MDAwNSwgMHgwMTA1LCAweDAyMDUsIDB4MDMwNSwgMHgwNDA1LAorICAgIDB4MDUwNSwgMHgwNjA1LCAweDA3MDUsIDB4MDgwNSwgMHgwOTA1LCAweEY3MDYsIDB4RjgwNiwgMHhGOTA2LAorICAgIDB4RkEwNiwgMHhGQjA2LCAweEZDMDYsIDB4RkQwNiwgMHhGRTA2LCAweEZGMDYsIDB4MDAwNiwgMHgwMTA2LAorICAgIDB4MDIwNiwgMHgwMzA2LCAweDA0MDYsIDB4MDUwNiwgMHgwNjA2LCAweDA3MDYsIDB4MDgwNiwgMHgwOTA2LAorICAgIDB4RjcwNywgMHhGODA3LCAweEY5MDcsIDB4RkEwNywgMHhGQjA3LCAweEZDMDcsIDB4RkQwNywgMHhGRTA3LAorICAgIDB4RkYwNywgMHgwMDA3LCAweDAxMDcsIDB4MDIwNywgMHgwMzA3LCAweDA0MDcsIDB4MDUwNywgMHgwNjA3LAorICAgIDB4MDcwNywgMHgwODA3LCAweDA5MDcsIDB4RjcwOCwgMHhGODA4LCAweEY5MDgsIDB4RkEwOCwgMHhGQjA4LAorICAgIDB4RkMwOCwgMHhGRDA4LCAweEZFMDgsIDB4RkYwOCwgMHgwMDA4LCAweDAxMDgsIDB4MDIwOCwgMHgwMzA4LAorICAgIDB4MDQwOCwgMHgwNTA4LCAweDA2MDgsIDB4MDcwOCwgMHgwODA4LCAweDA5MDgsIDB4RjcwOSwgMHhGODA5LAorICAgIDB4RjkwOSwgMHhGQTA5LCAweEZCMDksIDB4RkMwOSwgMHhGRDA5LCAweEZFMDksIDB4RkYwOSwgMHgwMDA5LAorICAgIDB4MDEwOSwgMHgwMjA5LCAweDAzMDksIDB4MDQwOSwgMHgwNTA5LCAweDA2MDksIDB4MDcwOSwgMHgwODA5LAorICAgIDB4MDkwOSwgMHgwQTBBLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X212eV8yX2JpdHNbXSA9IHsKKyAgICAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMSwKKyAgICAxMiwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTEsIDEwLCAxMSwKKyAgICAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMSwgMTAsIDExLCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE1LCAxNSwKKyAgICAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDExLCAgOSwgMTEsIDEyLCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTUsIDE1LCAxNCwKKyAgICAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEyLCAxMSwgMTEsICA5LCAxMSwgMTEsIDEyLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNCwKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDExLCAxMSwgIDksIDExLCAxMSwgMTIsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNCwKKyAgICAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsIDExLCAgOSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTAsICA4LCAxMCwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywKKyAgICAxMywgMTIsIDEyLCAxMiwgMTEsIDExLCAxMCwgIDgsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMiwgMTIsIDEyLCAxMSwgMTAsICA5LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMiwKKyAgICAxMiwgMTEsIDExLCAxMCwgMTAsICA3LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMSwgMTEsIDEwLCAgOSwgIDcsICA5LCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTUsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTAsICA4LCAgNywgIDgsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwKKyAgICAgOSwgIDgsICA2LCAgOCwgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTQsIDE2LCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwgIDksICA5LCAgOCwKKyAgICAgNiwgIDQsICA2LCAgOCwgIDksICA5LCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxNiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTAsIDEwLCAgOSwgIDksICA4LCAgOCwgIDgsICA3LCAgNCwKKyAgICAgMiwgIDQsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxNiwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTAsICA5LCAgOSwgIDgsICA2LCAgNCwKKyAgICAgNiwgIDgsICA5LCAgOSwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDE2LCAxNCwKKyAgICAxNCwgMTQsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTAsIDEwLCAgOSwgIDgsICA2LCAgOCwKKyAgICAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDEwLCAgOCwgIDcsICA4LCAxMCwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxNSwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTAsICA5LCAgNywgIDksIDEwLCAxMSwKKyAgICAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTEsIDExLCAxMCwgMTAsICA3LCAxMCwgMTAsIDExLCAxMSwKKyAgICAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsIDEwLCAgOSwgIDgsICA5LCAxMCwgMTEsIDEyLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE1LCAxNCwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEwLCAgOCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTAsICA4LCAxMCwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywKKyAgICAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEyLCAxMiwgMTIsIDExLCAxMSwgIDksIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMiwgMTEsIDExLCAgOSwgMTEsIDExLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEyLCAxMSwgMTEsICA5LCAxMSwgMTEsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE0LCAxNSwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEyLCAxMSwgIDksIDExLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNSwgMTUsIDE1LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDExLCAxMCwgMTEsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywKKyAgICAxMywgMTIsIDEwLCAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMiwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwKKyAgICAxNiwgIDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X212eV8yX2NvZGVzW10gPSB7CisgICAgMHhGRkY1LCAweEZGRDgsIDB4N0ZFNiwgMHg3RkI5LCAweDdGQjUsIDB4N0ZCMCwgMHg3RkEwLCAweDdGOTksCisgICAgMHg3RjkzLCAweDNGQUEsIDB4M0Y5QiwgMHgzRjUyLCAweDFGNzYsIDB4MUVGNSwgMHgwRjBCLCAweDA2RjAsCisgICAgMHgwRjA4LCAweDFFRjAsIDB4MUY3NSwgMHgzRjUzLCAweDNGOUEsIDB4M0ZBOCwgMHg3Rjk0LCAweDdGOTgsCisgICAgMHg3RjlFLCAweDdGQUUsIDB4N0ZBRiwgMHg3RkI3LCAweDdGRTksIDB4RkZEQiwgMHhGRkY2LCAweEZGRkQsCisgICAgMHg3RkQ5LCAweDdGQ0MsIDB4N0ZDNiwgMHg3RjlDLCAweDdGODAsIDB4M0ZBNSwgMHgzRjgwLCAweDNGNkEsCisgICAgMHgzRjMxLCAweDFGNTQsIDB4MUY0MCwgMHgxRjExLCAweDFGMDUsIDB4MDc1RSwgMHgwMzYwLCAweDA3NUYsCisgICAgMHgxRjA3LCAweDFGMTIsIDB4MUY0MywgMHgxRjU2LCAweDNGMzMsIDB4M0Y2OCwgMHgzRjgzLCAweDNGQTYsCisgICAgMHg3RjdGLCAweDdGOUEsIDB4N0ZDOSwgMHg3RkNBLCAweDdGREIsIDB4RkZGOCwgMHhGRkVDLCAweDdGREUsCisgICAgMHg3RkUyLCAweDdGQTYsIDB4N0Y2RiwgMHgzRkExLCAweDNGOEQsIDB4M0Y1QywgMHgzRjM5LCAweDNGMjEsCisgICAgMHgzRjE4LCAweDFGNTgsIDB4MUYxRSwgMHgxRUYxLCAweDA3NDAsIDB4MDM1QSwgMHgwNzQxLCAweDFFRjIsCisgICAgMHgxRjFGLCAweDFGNUEsIDB4M0YxOSwgMHgzRjIyLCAweDNGM0IsIDB4M0Y1RSwgMHgzRjhFLCAweDNGQTMsCisgICAgMHg3RjZCLCAweDdGQTIsIDB4N0ZFMywgMHg3RkUxLCAweEZGRUUsIDB4RkZGQywgMHg3RkMzLCAweDdGQkMsCisgICAgMHg3RjcxLCAweDNGOTYsIDB4M0Y4NiwgMHgzRjdBLCAweDNGNzIsIDB4M0Y1OSwgMHgzRjQ2LCAweDFGMEEsCisgICAgMHgxRUZELCAweDFFRDAsIDB4MEYwMiwgMHgwNzEyLCAweDAxOUYsIDB4MDcxMywgMHgwRjAzLCAweDFFRDMsCisgICAgMHgxRUZGLCAweDFGMDksIDB4M0Y0QSwgMHgzRjVBLCAweDNGNzYsIDB4M0Y3QiwgMHgzRjg3LCAweDNGOTcsCisgICAgMHg3RjczLCAweDdGQkIsIDB4N0ZCRiwgMHhGRkZCLCAweEZGRUIsIDB4N0Y4OCwgMHg3RjVDLCAweDNGN0MsCisgICAgMHgzRjNDLCAweDFGNjAsIDB4MUY0QywgMHgxRjE0LCAweDFGMEMsIDB4MUYwMCwgMHgxRUY5LCAweDFFRDgsCisgICAgMHgwRjQyLCAweDA3NUEsIDB4MDcxNCwgMHgwMTg2LCAweDA3MTUsIDB4MDc1QiwgMHgwRjQzLCAweDFFREEsCisgICAgMHgxRUZBLCAweDFGMDEsIDB4MUYwRSwgMHgxRjE1LCAweDFGNEQsIDB4MUY2MiwgMHgzRjNELCAweDNGN0QsCisgICAgMHgzRkFDLCAweDdGODYsIDB4RkZFOCwgMHhGRkU3LCAweDdGQTcsIDB4N0Y4QywgMHg3RjY4LCAweDNGOUMsCisgICAgMHgxRjdDLCAweDFGNkMsIDB4MUY2OSwgMHgxRUVDLCAweDFFRTQsIDB4MUVENSwgMHgxRUNELCAweDBFRjAsCisgICAgMHgwNzUyLCAweDA2RjYsIDB4MDE4QywgMHgwNkY3LCAweDA3NTMsIDB4MEVGMSwgMHgxRUNFLCAweDFFRDYsCisgICAgMHgxRUU1LCAweDFFRUQsIDB4MUY2QSwgMHgxRjZFLCAweDFGN0QsIDB4M0Y5RiwgMHg3RjY2LCAweDdGOEEsCisgICAgMHg3RkE1LCAweEZGRTYsIDB4RkZEQywgMHg3RkRBLCAweDdGQzAsIDB4N0ZBQywgMHg3RjYxLCAweDNGNDIsCisgICAgMHgzRjBFLCAweDFGNDUsIDB4MUYyQywgMHgxRUNBLCAweDBGMjcsIDB4MEVGNiwgMHgwRUVFLCAweDA3MkUsCisgICAgMHgwNkY0LCAweDAxODUsIDB4MDZGNSwgMHgwNzJGLCAweDBFRUYsIDB4MEVGNywgMHgwRjI4LCAweDFFQ0IsCisgICAgMHgxRjJGLCAweDFGNDYsIDB4M0YwRiwgMHgzRjQwLCAweDdGNUYsIDB4N0ZCNCwgMHg3RkMyLCAweDdGREMsCisgICAgMHhGRkRBLCAweEZGRTAsIDB4N0Y3MiwgMHg3RjYzLCAweDNGNzAsIDB4M0YxQywgMHgzRjE2LCAweDFGODIsCisgICAgMHgxRUUyLCAweDFFQjIsIDB4MEY0QywgMHgwRUZDLCAweDBFRTAsIDB4MEVEMywgMHgwNzIyLCAweDAzNkMsCisgICAgMHgwMEJGLCAweDAzNkQsIDB4MDcyMywgMHgwRUNDLCAweDBFRTEsIDB4MEVGRiwgMHgwRjRELCAweDFFQjMsCisgICAgMHgxRUUzLCAweDFGODMsIDB4M0YxNywgMHgzRjFGLCAweDNGNzUsIDB4N0Y2NSwgMHg3RjcwLCAweEZGRTIsCisgICAgMHhGRkQ3LCAweDdGNzYsIDB4M0YyQiwgMHgzRjEzLCAweDNGMEEsIDB4MUYzMywgMHgxRjIzLCAweDFFQjQsCisgICAgMHgxRUEwLCAweDBGNDYsIDB4MEYzMiwgMHgwRjFBLCAweDA3NTYsIDB4MDcyOCwgMHgwMzU2LCAweDAwQjAsCisgICAgMHgwMzU3LCAweDA3MjksIDB4MDc1NywgMHgwRjFCLCAweDBGMzMsIDB4MEY0NywgMHgxRUExLCAweDFFQjUsCisgICAgMHgxRjIwLCAweDFGMzAsIDB4M0YwOCwgMHgzRjEwLCAweDNGMjgsIDB4N0Y3NywgMHhGRkQ1LCAweDdGRDUsCisgICAgMHg3RkQxLCAweDNGNUQsIDB4M0YyNSwgMHgxRjM0LCAweDFGMjQsIDB4MUVFOCwgMHgxRUJDLCAweDFFQTgsCisgICAgMHgwRjNBLCAweDBGMkUsIDB4MEVFMiwgMHgwNzFDLCAweDAzNzQsIDB4MDFBMCwgMHgwMEFFLCAweDAxQTEsCisgICAgMHgwMzc1LCAweDA3MUQsIDB4MEVFMywgMHgwRjJGLCAweDBGM0MsIDB4MUVBOSwgMHgxRUJELCAweDFFRTksCisgICAgMHgxRjI1LCAweDFGMzYsIDB4M0YyNCwgMHgzRjYxLCAweDdGQ0UsIDB4N0ZEMiwgMHg3RjkxLCAweDdGN0QsCisgICAgMHgzRjZDLCAweDNGMzQsIDB4MUY3MiwgMHgxRjYxLCAweDFFREQsIDB4MUVDNSwgMHgxRUE1LCAweDBGMDUsCisgICAgMHgwRUQ2LCAweDA3NTAsIDB4MDczRSwgMHgwMzY4LCAweDAzNEEsIDB4MDA1MiwgMHgwMzRCLCAweDAzNjksCisgICAgMHgwNzNGLCAweDA3NTEsIDB4MEVENywgMHgwRjA3LCAweDFFQTcsIDB4MUVDNywgMHgxRURGLCAweDFGNjUsCisgICAgMHgxRjcwLCAweDNGMzYsIDB4M0Y2RiwgMHg3RjdDLCAweDdGOEYsIDB4M0Y5MCwgMHgzRjY2LCAweDNGNTgsCisgICAgMHgzRjRFLCAweDFGNDgsIDB4MUVCQiwgMHgwRjQwLCAweDBGMTgsIDB4MEYxMCwgMHgwRURBLCAweDBFQ0YsCisgICAgMHgwNzMyLCAweDA3MDQsIDB4MDM1NCwgMHgwMTkwLCAweDAwNEYsIDB4MDE5MSwgMHgwMzU1LCAweDA3MDUsCisgICAgMHgwNzMzLCAweDBFRDAsIDB4MEVEQiwgMHgwRjExLCAweDBGMTksIDB4MEY0MSwgMHgxRUI4LCAweDFGNEIsCisgICAgMHgzRjRGLCAweDNGNTUsIDB4M0Y2NSwgMHgzRjkyLCAweDdGODUsIDB4MUY1MSwgMHgxRjM5LCAweDFGMkIsCisgICAgMHgxRjE4LCAweDFFQzIsIDB4MEYzOCwgMHgwRjE0LCAweDBFQ0EsIDB4MDc0QywgMHgwNzM2LCAweDA3MDAsCisgICAgMHgwNkZDLCAweDAzNTAsIDB4MDBCQSwgMHgwMDRELCAweDAwQkIsIDB4MDM1MSwgMHgwNkZELCAweDA3MDEsCisgICAgMHgwNzM3LCAweDA3NEQsIDB4MEVDQiwgMHgwRjE1LCAweDBGMzksIDB4MUVDMywgMHgxRjFCLCAweDFGMkUsCisgICAgMHgxRjNBLCAweDFGNTMsIDB4N0Y4MiwgMHgzRjhBLCAweDNGNDcsIDB4M0YyRSwgMHgxRjVFLCAweDFFOUUsCisgICAgMHgwRjI0LCAweDBGMjAsIDB4MEVDNiwgMHgwNzQ2LCAweDA3MjYsIDB4MDcwRSwgMHgwMzcwLCAweDAzNUUsCisgICAgMHgwMThBLCAweDAwQUMsIDB4MDAyMSwgMHgwMEFELCAweDAxOEIsIDB4MDM1RiwgMHgwMzcxLCAweDA3MEYsCisgICAgMHgwNzI3LCAweDA3NDcsIDB4MEVDNywgMHgwRjIxLCAweDBGMjUsIDB4MUU5RiwgMHgxRjVGLCAweDNGMkQsCisgICAgMHgzRjQ4LCAweDNGOEIsIDB4RkZGMSwgMHgxRjc4LCAweDFGM0QsIDB4MUVBRCwgMHgwRjJCLCAweDBFRjksCisgICAgMHgwRUU5LCAweDA3MzksIDB4MDcxOSwgMHgwNzA5LCAweDAzNjMsIDB4MDE5QiwgMHgwMTk1LCAweDAwQjMsCisgICAgMHgwMDIzLCAweDAwMDUsIDB4MDAyNCwgMHgwMEI0LCAweDAxOTYsIDB4MDE5QywgMHgwMzY0LCAweDA3MEEsCisgICAgMHgwNzFBLCAweDA3M0EsIDB4MEVFQSwgMHgwRUZBLCAweDBGMkMsIDB4MUVBRSwgMHgxRjNFLCAweDFGNzksCisgICAgMHhGRkYwLCAweDBGMEMsIDB4MEVFNiwgMHgwRURDLCAweDBFQzIsIDB4MDc0OCwgMHgwNzA2LCAweDAzNzIsCisgICAgMHgwMzRDLCAweDAxOTgsIDB4MDE5MiwgMHgwMEMwLCAweDAwQkMsIDB4MDBCNiwgMHgwMDUzLCAweDAwMDYsCisgICAgMHgwMDAwLCAweDAwMDcsIDB4MDA1NCwgMHgwMEI3LCAweDAwQkQsIDB4MDBDMSwgMHgwMTkzLCAweDAxOTksCisgICAgMHgwMzRELCAweDAzNzMsIDB4MDcwNywgMHgwNzQ5LCAweDBFQzMsIDB4MEVERCwgMHgwRUU3LCAweDBGMEQsCisgICAgMHhGRkYyLCAweDFGN0EsIDB4MUYzRiwgMHgxRUFGLCAweDBGMkQsIDB4MEVGQiwgMHgwRUVCLCAweDA3M0IsCisgICAgMHgwNzFCLCAweDA3MEIsIDB4MDM2NSwgMHgwMTlELCAweDAxOTcsIDB4MDBCNSwgMHgwMDI1LCAweDAwMDQsCisgICAgMHgwMDIyLCAweDAwQjIsIDB4MDE5NCwgMHgwMTlBLCAweDAzNjIsIDB4MDcwOCwgMHgwNzE4LCAweDA3MzgsCisgICAgMHgwRUU4LCAweDBFRjgsIDB4MEYyQSwgMHgxRUFDLCAweDFGM0MsIDB4MUY3QiwgMHhGRkYzLCAweDNGODksCisgICAgMHgzRjQ0LCAweDNGMkYsIDB4MUY1QywgMHgxRTlDLCAweDBGMjIsIDB4MEYxRSwgMHgwRUM0LCAweDA3NDQsCisgICAgMHgwNzI0LCAweDA3MEMsIDB4MDM2RSwgMHgwMzVDLCAweDAxODgsIDB4MDBBQSwgMHgwMDIwLCAweDAwQUIsCisgICAgMHgwMTg5LCAweDAzNUQsIDB4MDM2RiwgMHgwNzBELCAweDA3MjUsIDB4MDc0NSwgMHgwRUM1LCAweDBGMUYsCisgICAgMHgwRjIzLCAweDFFOUQsIDB4MUY1RCwgMHgzRjJDLCAweDNGNDUsIDB4M0Y4OCwgMHg3RjgxLCAweDFGNTIsCisgICAgMHgxRjM4LCAweDFGMjgsIDB4MUYxOSwgMHgxRUMwLCAweDBGMzYsIDB4MEYxMiwgMHgwRUM4LCAweDA3NEEsCisgICAgMHgwNzM0LCAweDA2RkUsIDB4MDZGQSwgMHgwMzRFLCAweDAwQjgsIDB4MDA0QywgMHgwMEI5LCAweDAzNEYsCisgICAgMHgwNkZCLCAweDA2RkYsIDB4MDczNSwgMHgwNzRCLCAweDBFQzksIDB4MEYxMywgMHgwRjM3LCAweDFFQzEsCisgICAgMHgxRjFBLCAweDFGMjksIDB4MUYzQiwgMHgxRjUwLCAweDdGODQsIDB4M0Y5MSwgMHgzRjY0LCAweDNGNTQsCisgICAgMHgzRjRDLCAweDFGNDksIDB4MUVCOSwgMHgwRjNCLCAweDBGMTYsIDB4MEYwRSwgMHgwRUQ4LCAweDBFQ0QsCisgICAgMHgwNzMwLCAweDA3MDIsIDB4MDM1MiwgMHgwMThFLCAweDAwNEUsIDB4MDE4RiwgMHgwMzUzLCAweDA3MDMsCisgICAgMHgwNzMxLCAweDBFQ0UsIDB4MEVEOSwgMHgwRjBGLCAweDBGMTcsIDB4MEYzRCwgMHgxRUJBLCAweDFGNEEsCisgICAgMHgzRjRELCAweDNGNTEsIDB4M0Y2NywgMHgzRjkzLCAweDdGOTAsIDB4N0Y3QSwgMHgzRjZFLCAweDNGMzcsCisgICAgMHgxRjcxLCAweDFGNjMsIDB4MUVEQywgMHgxRUM0LCAweDFFQTQsIDB4MEYwNCwgMHgwRUQ0LCAweDA3NEUsCisgICAgMHgwNzNDLCAweDAzNjYsIDB4MDM0OCwgMHgwMDUxLCAweDAzNDksIDB4MDM2NywgMHgwNzNELCAweDA3NEYsCisgICAgMHgwRUQ1LCAweDBGMDYsIDB4MUVBNiwgMHgxRUM2LCAweDFFREUsIDB4MUY2NCwgMHgxRjczLCAweDNGMzUsCisgICAgMHgzRjZELCAweDdGN0IsIDB4N0Y4RSwgMHg3RkQ0LCAweDdGRDAsIDB4M0Y1RiwgMHgzRjI2LCAweDFGMzUsCisgICAgMHgxRjI3LCAweDFFRUEsIDB4MUVCRSwgMHgxRUFBLCAweDBGM0UsIDB4MEYzMCwgMHgwRUU0LCAweDA3MUUsCisgICAgMHgwMzc2LCAweDAxQTIsIDB4MDBBRiwgMHgwMUEzLCAweDAzNzcsIDB4MDcxRiwgMHgwRUU1LCAweDBGMzEsCisgICAgMHgwRjNGLCAweDFFQUIsIDB4MUVCRiwgMHgxRUVCLCAweDFGMjYsIDB4MUYzNywgMHgzRjI3LCAweDNGNjIsCisgICAgMHg3RkNGLCAweDdGRDMsIDB4RkZENCwgMHg3Rjc4LCAweDNGMjksIDB4M0YxMSwgMHgzRjBCLCAweDFGMzIsCisgICAgMHgxRjIyLCAweDFFQjYsIDB4MUVBMiwgMHgwRjQ4LCAweDBGMzQsIDB4MEYxQywgMHgwNzU4LCAweDA3MkEsCisgICAgMHgwMzU4LCAweDAwQjEsIDB4MDM1OSwgMHgwNzJCLCAweDA3NTksIDB4MEYxRCwgMHgwRjM1LCAweDBGNDksCisgICAgMHgxRUEzLCAweDFFQjcsIDB4MUYyMSwgMHgxRjMxLCAweDNGMDksIDB4M0YxMiwgMHgzRjJBLCAweDdGNzksCisgICAgMHhGRkQ2LCAweEZGRTEsIDB4N0Y2RCwgMHg3RjY0LCAweDNGNzMsIDB4M0YxRCwgMHgzRjE0LCAweDFGODEsCisgICAgMHgxRUUwLCAweDFFQjAsIDB4MEY0QSwgMHgwRUZELCAweDBFREUsIDB4MEVEMSwgMHgwNzIwLCAweDAzNkEsCisgICAgMHgwMEJFLCAweDAzNkIsIDB4MDcyMSwgMHgwRUQyLCAweDBFREYsIDB4MEVGRSwgMHgwRjRCLCAweDFFQjEsCisgICAgMHgxRUUxLCAweDFGN0UsIDB4M0YxNSwgMHgzRjFFLCAweDNGNzQsIDB4N0Y2MiwgMHg3Rjc1LCAweEZGRTMsCisgICAgMHhGRkRFLCAweDdGREQsIDB4N0ZCRSwgMHg3RkIzLCAweDdGNjAsIDB4M0Y0MywgMHgzRjBDLCAweDFGNDcsCisgICAgMHgxRjJELCAweDFFQzgsIDB4MEYyNiwgMHgwRUY0LCAweDBFRUMsIDB4MDcyQywgMHgwNkYyLCAweDAxODQsCisgICAgMHgwNkYzLCAweDA3MkQsIDB4MEVFRCwgMHgwRUY1LCAweDBGMjksIDB4MUVDOSwgMHgxRjJBLCAweDFGNDQsCisgICAgMHgzRjBELCAweDNGNDEsIDB4N0Y1RSwgMHg3RkIxLCAweDdGQzEsIDB4N0ZENywgMHhGRkRGLCAweEZGRUEsCisgICAgMHg3RkEzLCAweDdGOEIsIDB4N0Y2OSwgMHgzRjlFLCAweDFGN0YsIDB4MUY2RCwgMHgxRjZCLCAweDFFRUUsCisgICAgMHgxRUU2LCAweDFFRDQsIDB4MUVDRiwgMHgwRUYyLCAweDA3NTQsIDB4MDZGOCwgMHgwMThELCAweDA2RjksCisgICAgMHgwNzU1LCAweDBFRjMsIDB4MUVDQywgMHgxRUQ3LCAweDFFRTcsIDB4MUVFRiwgMHgxRjY4LCAweDFGNkYsCisgICAgMHgxRjgwLCAweDNGOUQsIDB4N0Y2NywgMHg3RjhELCAweDdGQTgsIDB4RkZFOSwgMHhGRkU1LCAweDdGODksCisgICAgMHg3RjVELCAweDNGN0YsIDB4M0YzRiwgMHgxRjY3LCAweDFGNEYsIDB4MUYxNywgMHgxRjBGLCAweDFGMDIsCisgICAgMHgxRUZCLCAweDFFRDksIDB4MEY0NSwgMHgwNzVDLCAweDA3MTYsIDB4MDE4NywgMHgwNzE3LCAweDA3NUQsCisgICAgMHgwRjQ0LCAweDFFREIsIDB4MUVGOCwgMHgxRjAzLCAweDFGMEQsIDB4MUYxNiwgMHgxRjRFLCAweDFGNjYsCisgICAgMHgzRjNFLCAweDNGN0UsIDB4M0ZBRCwgMHg3Rjg3LCAweEZGRTQsIDB4RkZGOSwgMHg3RkM0LCAweDdGQkEsCisgICAgMHg3RjZFLCAweDNGOTUsIDB4M0Y4NSwgMHgzRjc4LCAweDNGNzcsIDB4M0Y1QiwgMHgzRjQ5LCAweDFGMDgsCisgICAgMHgxRUZFLCAweDFFRDIsIDB4MEYwMSwgMHgwNzEwLCAweDAxOUUsIDB4MDcxMSwgMHgwRjAwLCAweDFFRDEsCisgICAgMHgxRUZDLCAweDFGMEIsIDB4M0Y0QiwgMHgzRjU3LCAweDNGNzEsIDB4M0Y3OSwgMHgzRjg0LCAweDNGOTQsCisgICAgMHg3Rjc0LCAweDdGQkQsIDB4N0ZDNSwgMHhGRkZFLCAweEZGRUQsIDB4N0ZFMCwgMHg3RkRGLCAweDdGQTQsCisgICAgMHg3RjZBLCAweDNGQTAsIDB4M0Y4RiwgMHgzRjYzLCAweDNGM0EsIDB4M0YyMywgMHgzRjFBLCAweDFGNTksCisgICAgMHgxRjFELCAweDFFRjMsIDB4MDc0MywgMHgwMzVCLCAweDA3NDIsIDB4MUVGNywgMHgxRjFDLCAweDFGNUIsCisgICAgMHgzRjFCLCAweDNGMjAsIDB4M0YzOCwgMHgzRjYwLCAweDNGOEMsIDB4M0ZBMiwgMHg3RjZDLCAweDdGQTksCisgICAgMHg3RkU1LCAweDdGRTQsIDB4RkZFRiwgMHhGRkZGLCAweDdGRDYsIDB4N0ZDQiwgMHg3RkM3LCAweDdGOUIsCisgICAgMHg3RjgzLCAweDNGQTQsIDB4M0Y4MSwgMHgzRjY5LCAweDNGMzAsIDB4MUY1NywgMHgxRjQxLCAweDFGMTMsCisgICAgMHgxRjA2LCAweDBFQzAsIDB4MDM2MSwgMHgwRUMxLCAweDFGMDQsIDB4MUYxMCwgMHgxRjQyLCAweDFGNTUsCisgICAgMHgzRjMyLCAweDNGNkIsIDB4M0Y4MiwgMHgzRkE3LCAweDdGN0UsIDB4N0Y5RCwgMHg3RkM4LCAweDdGQ0QsCisgICAgMHg3RkQ4LCAweEZGRkEsIDB4RkZGNywgMHhGRkQ5LCAweDdGRTgsIDB4N0ZCNiwgMHg3RkFCLCAweDdGQUEsCisgICAgMHg3RkExLCAweDdGOTYsIDB4N0Y5NSwgMHgzRkFCLCAweDNGOTgsIDB4M0Y1MCwgMHgxRjc3LCAweDFFRjQsCisgICAgMHgwRjBBLCAweDA2RjEsIDB4MEYwOSwgMHgxRUY2LCAweDFGNzQsIDB4M0Y1NiwgMHgzRjk5LCAweDNGQTksCisgICAgMHg3RjkyLCAweDdGOTcsIDB4N0Y5RiwgMHg3RkFELCAweDdGQjIsIDB4N0ZCOCwgMHg3RkU3LCAweEZGREQsCisgICAgMHhGRkY0LCAweDAwNTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X212eV8yX3N5bXNbXSA9IHsKKyAgICAweEYxRjEsIDB4RjJGMSwgMHhGM0YxLCAweEY0RjEsIDB4RjVGMSwgMHhGNkYxLCAweEY3RjEsIDB4RjhGMSwKKyAgICAweEY5RjEsIDB4RkFGMSwgMHhGQkYxLCAweEZDRjEsIDB4RkRGMSwgMHhGRUYxLCAweEZGRjEsIDB4MDBGMSwKKyAgICAweDAxRjEsIDB4MDJGMSwgMHgwM0YxLCAweDA0RjEsIDB4MDVGMSwgMHgwNkYxLCAweDA3RjEsIDB4MDhGMSwKKyAgICAweDA5RjEsIDB4MEFGMSwgMHgwQkYxLCAweDBDRjEsIDB4MERGMSwgMHgwRUYxLCAweDBGRjEsIDB4RjFGMiwKKyAgICAweEYyRjIsIDB4RjNGMiwgMHhGNEYyLCAweEY1RjIsIDB4RjZGMiwgMHhGN0YyLCAweEY4RjIsIDB4RjlGMiwKKyAgICAweEZBRjIsIDB4RkJGMiwgMHhGQ0YyLCAweEZERjIsIDB4RkVGMiwgMHhGRkYyLCAweDAwRjIsIDB4MDFGMiwKKyAgICAweDAyRjIsIDB4MDNGMiwgMHgwNEYyLCAweDA1RjIsIDB4MDZGMiwgMHgwN0YyLCAweDA4RjIsIDB4MDlGMiwKKyAgICAweDBBRjIsIDB4MEJGMiwgMHgwQ0YyLCAweDBERjIsIDB4MEVGMiwgMHgwRkYyLCAweEYxRjMsIDB4RjJGMywKKyAgICAweEYzRjMsIDB4RjRGMywgMHhGNUYzLCAweEY2RjMsIDB4RjdGMywgMHhGOEYzLCAweEY5RjMsIDB4RkFGMywKKyAgICAweEZCRjMsIDB4RkNGMywgMHhGREYzLCAweEZFRjMsIDB4RkZGMywgMHgwMEYzLCAweDAxRjMsIDB4MDJGMywKKyAgICAweDAzRjMsIDB4MDRGMywgMHgwNUYzLCAweDA2RjMsIDB4MDdGMywgMHgwOEYzLCAweDA5RjMsIDB4MEFGMywKKyAgICAweDBCRjMsIDB4MENGMywgMHgwREYzLCAweDBFRjMsIDB4MEZGMywgMHhGMUY0LCAweEYyRjQsIDB4RjNGNCwKKyAgICAweEY0RjQsIDB4RjVGNCwgMHhGNkY0LCAweEY3RjQsIDB4RjhGNCwgMHhGOUY0LCAweEZBRjQsIDB4RkJGNCwKKyAgICAweEZDRjQsIDB4RkRGNCwgMHhGRUY0LCAweEZGRjQsIDB4MDBGNCwgMHgwMUY0LCAweDAyRjQsIDB4MDNGNCwKKyAgICAweDA0RjQsIDB4MDVGNCwgMHgwNkY0LCAweDA3RjQsIDB4MDhGNCwgMHgwOUY0LCAweDBBRjQsIDB4MEJGNCwKKyAgICAweDBDRjQsIDB4MERGNCwgMHgwRUY0LCAweDBGRjQsIDB4RjFGNSwgMHhGMkY1LCAweEYzRjUsIDB4RjRGNSwKKyAgICAweEY1RjUsIDB4RjZGNSwgMHhGN0Y1LCAweEY4RjUsIDB4RjlGNSwgMHhGQUY1LCAweEZCRjUsIDB4RkNGNSwKKyAgICAweEZERjUsIDB4RkVGNSwgMHhGRkY1LCAweDAwRjUsIDB4MDFGNSwgMHgwMkY1LCAweDAzRjUsIDB4MDRGNSwKKyAgICAweDA1RjUsIDB4MDZGNSwgMHgwN0Y1LCAweDA4RjUsIDB4MDlGNSwgMHgwQUY1LCAweDBCRjUsIDB4MENGNSwKKyAgICAweDBERjUsIDB4MEVGNSwgMHgwRkY1LCAweEYxRjYsIDB4RjJGNiwgMHhGM0Y2LCAweEY0RjYsIDB4RjVGNiwKKyAgICAweEY2RjYsIDB4RjdGNiwgMHhGOEY2LCAweEY5RjYsIDB4RkFGNiwgMHhGQkY2LCAweEZDRjYsIDB4RkRGNiwKKyAgICAweEZFRjYsIDB4RkZGNiwgMHgwMEY2LCAweDAxRjYsIDB4MDJGNiwgMHgwM0Y2LCAweDA0RjYsIDB4MDVGNiwKKyAgICAweDA2RjYsIDB4MDdGNiwgMHgwOEY2LCAweDA5RjYsIDB4MEFGNiwgMHgwQkY2LCAweDBDRjYsIDB4MERGNiwKKyAgICAweDBFRjYsIDB4MEZGNiwgMHhGMUY3LCAweEYyRjcsIDB4RjNGNywgMHhGNEY3LCAweEY1RjcsIDB4RjZGNywKKyAgICAweEY3RjcsIDB4RjhGNywgMHhGOUY3LCAweEZBRjcsIDB4RkJGNywgMHhGQ0Y3LCAweEZERjcsIDB4RkVGNywKKyAgICAweEZGRjcsIDB4MDBGNywgMHgwMUY3LCAweDAyRjcsIDB4MDNGNywgMHgwNEY3LCAweDA1RjcsIDB4MDZGNywKKyAgICAweDA3RjcsIDB4MDhGNywgMHgwOUY3LCAweDBBRjcsIDB4MEJGNywgMHgwQ0Y3LCAweDBERjcsIDB4MEVGNywKKyAgICAweDBGRjcsIDB4RjFGOCwgMHhGMkY4LCAweEYzRjgsIDB4RjRGOCwgMHhGNUY4LCAweEY2RjgsIDB4RjdGOCwKKyAgICAweEY4RjgsIDB4RjlGOCwgMHhGQUY4LCAweEZCRjgsIDB4RkNGOCwgMHhGREY4LCAweEZFRjgsIDB4RkZGOCwKKyAgICAweDAwRjgsIDB4MDFGOCwgMHgwMkY4LCAweDAzRjgsIDB4MDRGOCwgMHgwNUY4LCAweDA2RjgsIDB4MDdGOCwKKyAgICAweDA4RjgsIDB4MDlGOCwgMHgwQUY4LCAweDBCRjgsIDB4MENGOCwgMHgwREY4LCAweDBFRjgsIDB4MEZGOCwKKyAgICAweEYxRjksIDB4RjJGOSwgMHhGM0Y5LCAweEY0RjksIDB4RjVGOSwgMHhGNkY5LCAweEY3RjksIDB4RjhGOSwKKyAgICAweEY5RjksIDB4RkFGOSwgMHhGQkY5LCAweEZDRjksIDB4RkRGOSwgMHhGRUY5LCAweEZGRjksIDB4MDBGOSwKKyAgICAweDAxRjksIDB4MDJGOSwgMHgwM0Y5LCAweDA0RjksIDB4MDVGOSwgMHgwNkY5LCAweDA3RjksIDB4MDhGOSwKKyAgICAweDA5RjksIDB4MEFGOSwgMHgwQkY5LCAweDBDRjksIDB4MERGOSwgMHgwRUY5LCAweDBGRjksIDB4RjFGQSwKKyAgICAweEYyRkEsIDB4RjNGQSwgMHhGNEZBLCAweEY1RkEsIDB4RjZGQSwgMHhGN0ZBLCAweEY4RkEsIDB4RjlGQSwKKyAgICAweEZBRkEsIDB4RkJGQSwgMHhGQ0ZBLCAweEZERkEsIDB4RkVGQSwgMHhGRkZBLCAweDAwRkEsIDB4MDFGQSwKKyAgICAweDAyRkEsIDB4MDNGQSwgMHgwNEZBLCAweDA1RkEsIDB4MDZGQSwgMHgwN0ZBLCAweDA4RkEsIDB4MDlGQSwKKyAgICAweDBBRkEsIDB4MEJGQSwgMHgwQ0ZBLCAweDBERkEsIDB4MEVGQSwgMHgwRkZBLCAweEYxRkIsIDB4RjJGQiwKKyAgICAweEYzRkIsIDB4RjRGQiwgMHhGNUZCLCAweEY2RkIsIDB4RjdGQiwgMHhGOEZCLCAweEY5RkIsIDB4RkFGQiwKKyAgICAweEZCRkIsIDB4RkNGQiwgMHhGREZCLCAweEZFRkIsIDB4RkZGQiwgMHgwMEZCLCAweDAxRkIsIDB4MDJGQiwKKyAgICAweDAzRkIsIDB4MDRGQiwgMHgwNUZCLCAweDA2RkIsIDB4MDdGQiwgMHgwOEZCLCAweDA5RkIsIDB4MEFGQiwKKyAgICAweDBCRkIsIDB4MENGQiwgMHgwREZCLCAweDBFRkIsIDB4MEZGQiwgMHhGMUZDLCAweEYyRkMsIDB4RjNGQywKKyAgICAweEY0RkMsIDB4RjVGQywgMHhGNkZDLCAweEY3RkMsIDB4RjhGQywgMHhGOUZDLCAweEZBRkMsIDB4RkJGQywKKyAgICAweEZDRkMsIDB4RkRGQywgMHhGRUZDLCAweEZGRkMsIDB4MDBGQywgMHgwMUZDLCAweDAyRkMsIDB4MDNGQywKKyAgICAweDA0RkMsIDB4MDVGQywgMHgwNkZDLCAweDA3RkMsIDB4MDhGQywgMHgwOUZDLCAweDBBRkMsIDB4MEJGQywKKyAgICAweDBDRkMsIDB4MERGQywgMHgwRUZDLCAweDBGRkMsIDB4RjFGRCwgMHhGMkZELCAweEYzRkQsIDB4RjRGRCwKKyAgICAweEY1RkQsIDB4RjZGRCwgMHhGN0ZELCAweEY4RkQsIDB4RjlGRCwgMHhGQUZELCAweEZCRkQsIDB4RkNGRCwKKyAgICAweEZERkQsIDB4RkVGRCwgMHhGRkZELCAweDAwRkQsIDB4MDFGRCwgMHgwMkZELCAweDAzRkQsIDB4MDRGRCwKKyAgICAweDA1RkQsIDB4MDZGRCwgMHgwN0ZELCAweDA4RkQsIDB4MDlGRCwgMHgwQUZELCAweDBCRkQsIDB4MENGRCwKKyAgICAweDBERkQsIDB4MEVGRCwgMHgwRkZELCAweEYxRkUsIDB4RjJGRSwgMHhGM0ZFLCAweEY0RkUsIDB4RjVGRSwKKyAgICAweEY2RkUsIDB4RjdGRSwgMHhGOEZFLCAweEY5RkUsIDB4RkFGRSwgMHhGQkZFLCAweEZDRkUsIDB4RkRGRSwKKyAgICAweEZFRkUsIDB4RkZGRSwgMHgwMEZFLCAweDAxRkUsIDB4MDJGRSwgMHgwM0ZFLCAweDA0RkUsIDB4MDVGRSwKKyAgICAweDA2RkUsIDB4MDdGRSwgMHgwOEZFLCAweDA5RkUsIDB4MEFGRSwgMHgwQkZFLCAweDBDRkUsIDB4MERGRSwKKyAgICAweDBFRkUsIDB4MEZGRSwgMHhGMUZGLCAweEYyRkYsIDB4RjNGRiwgMHhGNEZGLCAweEY1RkYsIDB4RjZGRiwKKyAgICAweEY3RkYsIDB4RjhGRiwgMHhGOUZGLCAweEZBRkYsIDB4RkJGRiwgMHhGQ0ZGLCAweEZERkYsIDB4RkVGRiwKKyAgICAweEZGRkYsIDB4MDBGRiwgMHgwMUZGLCAweDAyRkYsIDB4MDNGRiwgMHgwNEZGLCAweDA1RkYsIDB4MDZGRiwKKyAgICAweDA3RkYsIDB4MDhGRiwgMHgwOUZGLCAweDBBRkYsIDB4MEJGRiwgMHgwQ0ZGLCAweDBERkYsIDB4MEVGRiwKKyAgICAweDBGRkYsIDB4RjEwMCwgMHhGMjAwLCAweEYzMDAsIDB4RjQwMCwgMHhGNTAwLCAweEY2MDAsIDB4RjcwMCwKKyAgICAweEY4MDAsIDB4RjkwMCwgMHhGQTAwLCAweEZCMDAsIDB4RkMwMCwgMHhGRDAwLCAweEZFMDAsIDB4RkYwMCwKKyAgICAweDAwMDAsIDB4MDEwMCwgMHgwMjAwLCAweDAzMDAsIDB4MDQwMCwgMHgwNTAwLCAweDA2MDAsIDB4MDcwMCwKKyAgICAweDA4MDAsIDB4MDkwMCwgMHgwQTAwLCAweDBCMDAsIDB4MEMwMCwgMHgwRDAwLCAweDBFMDAsIDB4MEYwMCwKKyAgICAweEYxMDEsIDB4RjIwMSwgMHhGMzAxLCAweEY0MDEsIDB4RjUwMSwgMHhGNjAxLCAweEY3MDEsIDB4RjgwMSwKKyAgICAweEY5MDEsIDB4RkEwMSwgMHhGQjAxLCAweEZDMDEsIDB4RkQwMSwgMHhGRTAxLCAweEZGMDEsIDB4MDAwMSwKKyAgICAweDAxMDEsIDB4MDIwMSwgMHgwMzAxLCAweDA0MDEsIDB4MDUwMSwgMHgwNjAxLCAweDA3MDEsIDB4MDgwMSwKKyAgICAweDA5MDEsIDB4MEEwMSwgMHgwQjAxLCAweDBDMDEsIDB4MEQwMSwgMHgwRTAxLCAweDBGMDEsIDB4RjEwMiwKKyAgICAweEYyMDIsIDB4RjMwMiwgMHhGNDAyLCAweEY1MDIsIDB4RjYwMiwgMHhGNzAyLCAweEY4MDIsIDB4RjkwMiwKKyAgICAweEZBMDIsIDB4RkIwMiwgMHhGQzAyLCAweEZEMDIsIDB4RkUwMiwgMHhGRjAyLCAweDAwMDIsIDB4MDEwMiwKKyAgICAweDAyMDIsIDB4MDMwMiwgMHgwNDAyLCAweDA1MDIsIDB4MDYwMiwgMHgwNzAyLCAweDA4MDIsIDB4MDkwMiwKKyAgICAweDBBMDIsIDB4MEIwMiwgMHgwQzAyLCAweDBEMDIsIDB4MEUwMiwgMHgwRjAyLCAweEYxMDMsIDB4RjIwMywKKyAgICAweEYzMDMsIDB4RjQwMywgMHhGNTAzLCAweEY2MDMsIDB4RjcwMywgMHhGODAzLCAweEY5MDMsIDB4RkEwMywKKyAgICAweEZCMDMsIDB4RkMwMywgMHhGRDAzLCAweEZFMDMsIDB4RkYwMywgMHgwMDAzLCAweDAxMDMsIDB4MDIwMywKKyAgICAweDAzMDMsIDB4MDQwMywgMHgwNTAzLCAweDA2MDMsIDB4MDcwMywgMHgwODAzLCAweDA5MDMsIDB4MEEwMywKKyAgICAweDBCMDMsIDB4MEMwMywgMHgwRDAzLCAweDBFMDMsIDB4MEYwMywgMHhGMTA0LCAweEYyMDQsIDB4RjMwNCwKKyAgICAweEY0MDQsIDB4RjUwNCwgMHhGNjA0LCAweEY3MDQsIDB4RjgwNCwgMHhGOTA0LCAweEZBMDQsIDB4RkIwNCwKKyAgICAweEZDMDQsIDB4RkQwNCwgMHhGRTA0LCAweEZGMDQsIDB4MDAwNCwgMHgwMTA0LCAweDAyMDQsIDB4MDMwNCwKKyAgICAweDA0MDQsIDB4MDUwNCwgMHgwNjA0LCAweDA3MDQsIDB4MDgwNCwgMHgwOTA0LCAweDBBMDQsIDB4MEIwNCwKKyAgICAweDBDMDQsIDB4MEQwNCwgMHgwRTA0LCAweDBGMDQsIDB4RjEwNSwgMHhGMjA1LCAweEYzMDUsIDB4RjQwNSwKKyAgICAweEY1MDUsIDB4RjYwNSwgMHhGNzA1LCAweEY4MDUsIDB4RjkwNSwgMHhGQTA1LCAweEZCMDUsIDB4RkMwNSwKKyAgICAweEZEMDUsIDB4RkUwNSwgMHhGRjA1LCAweDAwMDUsIDB4MDEwNSwgMHgwMjA1LCAweDAzMDUsIDB4MDQwNSwKKyAgICAweDA1MDUsIDB4MDYwNSwgMHgwNzA1LCAweDA4MDUsIDB4MDkwNSwgMHgwQTA1LCAweDBCMDUsIDB4MEMwNSwKKyAgICAweDBEMDUsIDB4MEUwNSwgMHgwRjA1LCAweEYxMDYsIDB4RjIwNiwgMHhGMzA2LCAweEY0MDYsIDB4RjUwNiwKKyAgICAweEY2MDYsIDB4RjcwNiwgMHhGODA2LCAweEY5MDYsIDB4RkEwNiwgMHhGQjA2LCAweEZDMDYsIDB4RkQwNiwKKyAgICAweEZFMDYsIDB4RkYwNiwgMHgwMDA2LCAweDAxMDYsIDB4MDIwNiwgMHgwMzA2LCAweDA0MDYsIDB4MDUwNiwKKyAgICAweDA2MDYsIDB4MDcwNiwgMHgwODA2LCAweDA5MDYsIDB4MEEwNiwgMHgwQjA2LCAweDBDMDYsIDB4MEQwNiwKKyAgICAweDBFMDYsIDB4MEYwNiwgMHhGMTA3LCAweEYyMDcsIDB4RjMwNywgMHhGNDA3LCAweEY1MDcsIDB4RjYwNywKKyAgICAweEY3MDcsIDB4RjgwNywgMHhGOTA3LCAweEZBMDcsIDB4RkIwNywgMHhGQzA3LCAweEZEMDcsIDB4RkUwNywKKyAgICAweEZGMDcsIDB4MDAwNywgMHgwMTA3LCAweDAyMDcsIDB4MDMwNywgMHgwNDA3LCAweDA1MDcsIDB4MDYwNywKKyAgICAweDA3MDcsIDB4MDgwNywgMHgwOTA3LCAweDBBMDcsIDB4MEIwNywgMHgwQzA3LCAweDBEMDcsIDB4MEUwNywKKyAgICAweDBGMDcsIDB4RjEwOCwgMHhGMjA4LCAweEYzMDgsIDB4RjQwOCwgMHhGNTA4LCAweEY2MDgsIDB4RjcwOCwKKyAgICAweEY4MDgsIDB4RjkwOCwgMHhGQTA4LCAweEZCMDgsIDB4RkMwOCwgMHhGRDA4LCAweEZFMDgsIDB4RkYwOCwKKyAgICAweDAwMDgsIDB4MDEwOCwgMHgwMjA4LCAweDAzMDgsIDB4MDQwOCwgMHgwNTA4LCAweDA2MDgsIDB4MDcwOCwKKyAgICAweDA4MDgsIDB4MDkwOCwgMHgwQTA4LCAweDBCMDgsIDB4MEMwOCwgMHgwRDA4LCAweDBFMDgsIDB4MEYwOCwKKyAgICAweEYxMDksIDB4RjIwOSwgMHhGMzA5LCAweEY0MDksIDB4RjUwOSwgMHhGNjA5LCAweEY3MDksIDB4RjgwOSwKKyAgICAweEY5MDksIDB4RkEwOSwgMHhGQjA5LCAweEZDMDksIDB4RkQwOSwgMHhGRTA5LCAweEZGMDksIDB4MDAwOSwKKyAgICAweDAxMDksIDB4MDIwOSwgMHgwMzA5LCAweDA0MDksIDB4MDUwOSwgMHgwNjA5LCAweDA3MDksIDB4MDgwOSwKKyAgICAweDA5MDksIDB4MEEwOSwgMHgwQjA5LCAweDBDMDksIDB4MEQwOSwgMHgwRTA5LCAweDBGMDksIDB4RjEwQSwKKyAgICAweEYyMEEsIDB4RjMwQSwgMHhGNDBBLCAweEY1MEEsIDB4RjYwQSwgMHhGNzBBLCAweEY4MEEsIDB4RjkwQSwKKyAgICAweEZBMEEsIDB4RkIwQSwgMHhGQzBBLCAweEZEMEEsIDB4RkUwQSwgMHhGRjBBLCAweDAwMEEsIDB4MDEwQSwKKyAgICAweDAyMEEsIDB4MDMwQSwgMHgwNDBBLCAweDA1MEEsIDB4MDYwQSwgMHgwNzBBLCAweDA4MEEsIDB4MDkwQSwKKyAgICAweDBBMEEsIDB4MEIwQSwgMHgwQzBBLCAweDBEMEEsIDB4MEUwQSwgMHgwRjBBLCAweEYxMEIsIDB4RjIwQiwKKyAgICAweEYzMEIsIDB4RjQwQiwgMHhGNTBCLCAweEY2MEIsIDB4RjcwQiwgMHhGODBCLCAweEY5MEIsIDB4RkEwQiwKKyAgICAweEZCMEIsIDB4RkMwQiwgMHhGRDBCLCAweEZFMEIsIDB4RkYwQiwgMHgwMDBCLCAweDAxMEIsIDB4MDIwQiwKKyAgICAweDAzMEIsIDB4MDQwQiwgMHgwNTBCLCAweDA2MEIsIDB4MDcwQiwgMHgwODBCLCAweDA5MEIsIDB4MEEwQiwKKyAgICAweDBCMEIsIDB4MEMwQiwgMHgwRDBCLCAweDBFMEIsIDB4MEYwQiwgMHhGMTBDLCAweEYyMEMsIDB4RjMwQywKKyAgICAweEY0MEMsIDB4RjUwQywgMHhGNjBDLCAweEY3MEMsIDB4RjgwQywgMHhGOTBDLCAweEZBMEMsIDB4RkIwQywKKyAgICAweEZDMEMsIDB4RkQwQywgMHhGRTBDLCAweEZGMEMsIDB4MDAwQywgMHgwMTBDLCAweDAyMEMsIDB4MDMwQywKKyAgICAweDA0MEMsIDB4MDUwQywgMHgwNjBDLCAweDA3MEMsIDB4MDgwQywgMHgwOTBDLCAweDBBMEMsIDB4MEIwQywKKyAgICAweDBDMEMsIDB4MEQwQywgMHgwRTBDLCAweDBGMEMsIDB4RjEwRCwgMHhGMjBELCAweEYzMEQsIDB4RjQwRCwKKyAgICAweEY1MEQsIDB4RjYwRCwgMHhGNzBELCAweEY4MEQsIDB4RjkwRCwgMHhGQTBELCAweEZCMEQsIDB4RkMwRCwKKyAgICAweEZEMEQsIDB4RkUwRCwgMHhGRjBELCAweDAwMEQsIDB4MDEwRCwgMHgwMjBELCAweDAzMEQsIDB4MDQwRCwKKyAgICAweDA1MEQsIDB4MDYwRCwgMHgwNzBELCAweDA4MEQsIDB4MDkwRCwgMHgwQTBELCAweDBCMEQsIDB4MEMwRCwKKyAgICAweDBEMEQsIDB4MEUwRCwgMHgwRjBELCAweEYxMEUsIDB4RjIwRSwgMHhGMzBFLCAweEY0MEUsIDB4RjUwRSwKKyAgICAweEY2MEUsIDB4RjcwRSwgMHhGODBFLCAweEY5MEUsIDB4RkEwRSwgMHhGQjBFLCAweEZDMEUsIDB4RkQwRSwKKyAgICAweEZFMEUsIDB4RkYwRSwgMHgwMDBFLCAweDAxMEUsIDB4MDIwRSwgMHgwMzBFLCAweDA0MEUsIDB4MDUwRSwKKyAgICAweDA2MEUsIDB4MDcwRSwgMHgwODBFLCAweDA5MEUsIDB4MEEwRSwgMHgwQjBFLCAweDBDMEUsIDB4MEQwRSwKKyAgICAweDBFMEUsIDB4MEYwRSwgMHhGMTBGLCAweEYyMEYsIDB4RjMwRiwgMHhGNDBGLCAweEY1MEYsIDB4RjYwRiwKKyAgICAweEY3MEYsIDB4RjgwRiwgMHhGOTBGLCAweEZBMEYsIDB4RkIwRiwgMHhGQzBGLCAweEZEMEYsIDB4RkUwRiwKKyAgICAweEZGMEYsIDB4MDAwRiwgMHgwMTBGLCAweDAyMEYsIDB4MDMwRiwgMHgwNDBGLCAweDA1MEYsIDB4MDYwRiwKKyAgICAweDA3MEYsIDB4MDgwRiwgMHgwOTBGLCAweDBBMEYsIDB4MEIwRiwgMHgwQzBGLCAweDBEMEYsIDB4MEUwRiwKKyAgICAweDBGMEYsIDB4MTAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsdl9tdnlfM19iaXRzW10gPSB7CisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTMsCisgICAgMTMsIDEyLCAxMSwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTIsIDExLCAxMiwgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTEsIDEyLCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsCisgICAgMTIsIDExLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTAsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMCwgMTIsIDEyLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTEsCisgICAgMTAsIDExLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTEsIDEwLCAgOSwgMTAsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsCisgICAgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTAsICA5LCAxMCwgMTEsIDExLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwgIDksCisgICAgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTEsIDExLCAxMSwgMTAsICA5LCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwgIDgsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTAsIDEwLCAgOCwgMTAsCisgICAgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsCisgICAgMTAsIDEwLCAgOSwgIDcsICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsCisgICAgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwgMTAsICA5LCAgNywgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDEwLCAgOSwgIDksICA3LCAgOSwgIDksCisgICAgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsCisgICAgIDksICA4LCAgNiwgIDgsICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEzLCAxMywgMTMsCisgICAgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTEsCisgICAgMTEsIDEwLCAxMCwgIDksICA5LCAgOCwgIDYsICA0LCAgNiwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsCisgICAgMTIsIDExLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOCwgIDgsICA3LCAgNSwgIDIsICA1LCAgNywgIDgsCisgICAgIDgsICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTUsCisgICAgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsICA5LCAgOSwgIDgsCisgICAgIDYsICA0LCAgNiwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsCisgICAgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTIsIDExLCAxMSwgMTEsCisgICAgMTEsIDEwLCAxMCwgMTAsICA5LCAgOCwgIDYsICA4LCAgOSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsCisgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsCisgICAgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMCwgIDksICA5LCAgNywgIDksICA5LCAxMCwgMTEsCisgICAgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwgIDksCisgICAgIDcsICA5LCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTEsCisgICAgMTEsIDExLCAxMCwgMTAsICA5LCAgNywgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwgMTAsICA4LCAxMCwgMTAsIDExLCAxMSwgMTEsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwgIDgsCisgICAgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTEsIDExLCAxMSwgMTAsICA5LCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxMywgMTMsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwgIDksIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTUsIDE1LCAxNSwgMTQsCisgICAgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEwLCAgOSwgMTAsCisgICAgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDExLCAxMCwgIDksIDEwLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsCisgICAgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDExLCAxMCwgMTEsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEwLCAxMiwgMTIsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsCisgICAgMTMsIDEyLCAxMCwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTIsIDExLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMiwgMTEsIDEyLCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTMsCisgICAgMTIsIDExLCAxMiwgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTEsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgIDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X212eV8zX2NvZGVzW10gPSB7CisgICAgMHhGRkY2LCAweEZGRUUsIDB4RkZEQywgMHhGRkQ3LCAweEZGQjQsIDB4RkZBQSwgMHhGRkEwLCAweDdGQ0MsCisgICAgMHg3RjhFLCAweDdGN0IsIDB4N0Y3NywgMHg3RjEzLCAweDdGMTEsIDB4M0Y1NiwgMHgzRjQ4LCAweDFGMTYsCisgICAgMHgxRTk0LCAweDBGMjgsIDB4MDZGMCwgMHgwRjJBLCAweDFFOTYsIDB4MUYxQywgMHgzRjQ2LCAweDNGNTgsCisgICAgMHg3RjE1LCAweDdGMEUsIDB4N0Y3NiwgMHg3RjgwLCAweDdGOTAsIDB4N0ZDOCwgMHhGRkEyLCAweEZGQTcsCisgICAgMHhGRkI1LCAweEZGRDgsIDB4RkZERCwgMHhGRkVDLCAweEZGRjUsIDB4RkZGMSwgMHhGRkVBLCAweEZGRTQsCisgICAgMHhGRkQxLCAweEZGQzEsIDB4RkZBOCwgMHg3RjcwLCAweDdGNUMsIDB4N0Y0NCwgMHg3RjQwLCAweDdGMkEsCisgICAgMHg3RjE2LCAweDdFREYsIDB4M0VENiwgMHgzRUNBLCAweDNFQ0MsIDB4MUVCNSwgMHgwRURFLCAweDA2RDMsCisgICAgMHgwRURGLCAweDFFQjYsIDB4M0VDRSwgMHgzRUQwLCAweDNFRDgsIDB4N0VFNSwgMHg3RjE5LCAweDdGMzEsCisgICAgMHg3RjNFLCAweDdGNDUsIDB4N0Y1QiwgMHg3RjZGLCAweEZGQTksIDB4RkZDMCwgMHhGRkNFLCAweEZGRTUsCisgICAgMHhGRkU4LCAweEZGRjIsIDB4RkZGRSwgMHhGRkUyLCAweEZGQkUsIDB4N0ZCQiwgMHg3Rjc1LCAweDdGNkIsCisgICAgMHg3RjU4LCAweDdFRjksIDB4N0VEQywgMHgzRjY4LCAweDNGMjcsIDB4M0YyOCwgMHgzRURGLCAweDNFRDIsCisgICAgMHgzRUMxLCAweDNFQTYsIDB4M0U4NywgMHgwRjBGLCAweDA2QjMsIDB4MEYxMCwgMHgzRTg5LCAweDNFQTgsCisgICAgMHgzRUMzLCAweDNFRDUsIDB4M0VFMCwgMHgzRjJCLCAweDNGMjYsIDB4M0Y2NywgMHg3RURBLCAweDdFRkIsCisgICAgMHg3RjU2LCAweDdGNkEsIDB4N0Y3MiwgMHg3RkMxLCAweEZGQkMsIDB4RkZFMCwgMHhGRkZGLCAweEZGRjgsCisgICAgMHhGRkQzLCAweEZGQjksIDB4N0ZBQywgMHg3Rjk0LCAweDdGOEIsIDB4N0Y2MiwgMHg3RjRBLCAweDdGMDUsCisgICAgMHg3RUVFLCAweDNGNDQsIDB4M0VBNCwgMHgzRTc4LCAweDNFNkYsIDB4M0U1NCwgMHgxRUVGLCAweDFFQTksCisgICAgMHgwRUQ0LCAweDA2QTgsIDB4MEVENSwgMHgxRUE4LCAweDFFRUMsIDB4M0U1MSwgMHgzRTY5LCAweDNFNzUsCisgICAgMHgzRUEzLCAweDNGNDMsIDB4N0VGMSwgMHg3RjA0LCAweDdGNEIsIDB4N0Y1RCwgMHg3Rjg5LCAweDdGOTUsCisgICAgMHg3RkFBLCAweEZGQkIsIDB4RkZDOCwgMHhGRkY5LCAweEZGRDksIDB4RkZDQSwgMHg3RkMzLCAweDdGOEMsCisgICAgMHg3RjM4LCAweDdGMDIsIDB4M0Y1QSwgMHgzRjRBLCAweDNGMzAsIDB4M0VGRiwgMHgzRUY0LCAweDNFRTksCisgICAgMHgzRTk1LCAweDNFNzMsIDB4M0U0MywgMHgxRjA4LCAweDFFODEsIDB4MEU4NCwgMHgwMzQ5LCAweDBFODUsCisgICAgMHgxRTgyLCAweDFGMDcsIDB4M0U0NSwgMHgzRTc0LCAweDNFOTYsIDB4M0VFQSwgMHgzRUYxLCAweDNGMDAsCisgICAgMHgzRjMyLCAweDNGNEYsIDB4M0Y1QywgMHg3RjAxLCAweDdGM0IsIDB4N0Y4RCwgMHg3RkMyLCAweEZGQ0YsCisgICAgMHhGRkQ2LCAweEZGQzcsIDB4RkZCMSwgMHhGRkE2LCAweDdGQTEsIDB4N0YyRiwgMHg3RjI0LCAweDdGMEEsCisgICAgMHgzRUY2LCAweDNFOTcsIDB4M0U4MywgMHgzRTdGLCAweDFGMDQsIDB4MUVFMSwgMHgxRUNCLCAweDFFQUUsCisgICAgMHgxRTdFLCAweDBFQkEsIDB4MEU4QywgMHgwMzMzLCAweDBFOEQsIDB4MEVCQiwgMHgxRTdGLCAweDFFQUYsCisgICAgMHgxRUNDLCAweDFFRTIsIDB4MUYwNSwgMHgzRTgwLCAweDNFODQsIDB4M0U5OCwgMHgzRUY5LCAweDdGMDYsCisgICAgMHg3RjFCLCAweDdGMkQsIDB4N0Y5RiwgMHhGRkFGLCAweEZGQjAsIDB4RkZDNiwgMHg3RkI1LCAweDdGQjEsCisgICAgMHg3RjM2LCAweDdGMjUsIDB4M0Y2MywgMHgzRjNBLCAweDNGMUIsIDB4M0VCQiwgMHgzRTYzLCAweDNFNUIsCisgICAgMHgzRTQwLCAweDFGMTQsIDB4MUVGNSwgMHgxRUVCLCAweDFFQkUsIDB4MUU5MiwgMHgxRTZBLCAweDA3MEMsCisgICAgMHgwMzJELCAweDA3MEQsIDB4MUU2QiwgMHgxRTkzLCAweDFFQkYsIDB4MUVFOCwgMHgxRUYzLCAweDFGMTUsCisgICAgMHgzRTNGLCAweDNFNUMsIDB4M0U2NCwgMHgzRUI5LCAweDNGMUMsIDB4M0YzQywgMHgzRjYyLCAweDdGMjIsCisgICAgMHg3RjM5LCAweDdGQUYsIDB4N0ZBRSwgMHg3RkM2LCAweDdGN0YsIDB4N0Y1MywgMHg3RjMyLCAweDNGNjYsCisgICAgMHgzRUYwLCAweDNFNjUsIDB4MUVEQSwgMHgxRUQzLCAweDFFOTgsIDB4MUU3NCwgMHgwRjIwLCAweDBGMUQsCisgICAgMHgwRUVBLCAweDBFQTksIDB4MEU3MCwgMHgwNzE4LCAweDAzM0UsIDB4MDE3OSwgMHgwMzNGLCAweDA3MTksCisgICAgMHgwRTcxLCAweDBFQUIsIDB4MEVFOSwgMHgwRjFGLCAweDBGMjIsIDB4MUU3NiwgMHgxRTlCLCAweDFFRDUsCisgICAgMHgxRURELCAweDNFNjgsIDB4M0VGMywgMHgzRjZDLCAweDdGMzMsIDB4N0Y0RSwgMHg3RjdELCAweDdGQ0IsCisgICAgMHg3RkJELCAweDdGMjEsIDB4N0VGNiwgMHgzRjBDLCAweDNFQkUsIDB4M0VBRSwgMHgxRUEzLCAweDFFODUsCisgICAgMHgwRjBDLCAweDBGMDYsIDB4MEVFRSwgMHgwRUU2LCAweDBFQ0EsIDB4MEVBMiwgMHgwRTc4LCAweDA3MjAsCisgICAgMHgwNkJBLCAweDAzMjYsIDB4MDE1RCwgMHgwMzI3LCAweDA2QkIsIDB4MDcyMSwgMHgwRTc5LCAweDBFQTMsCisgICAgMHgwRUNCLCAweDBFRTcsIDB4MEVFRiwgMHgwRjA3LCAweDBGMEQsIDB4MUU4NiwgMHgxRUE0LCAweDNFQUYsCisgICAgMHgzRUJGLCAweDNGMEEsIDB4N0VGOCwgMHg3RjFFLCAweDdGQkYsIDB4RkY5RiwgMHg3RkIzLCAweDdGOTYsCisgICAgMHg3RjBCLCAweDdFRjUsIDB4M0U4NSwgMHgzRTRFLCAweDFFQjMsIDB4MUU2RSwgMHgwRjJELCAweDBFQkQsCisgICAgMHgwRTk3LCAweDBFOTMsIDB4MEU4NiwgMHgwNzFBLCAweDA2RTQsIDB4MDZCQywgMHgwMzM4LCAweDAxNUEsCisgICAgMHgwMzM5LCAweDA2QkQsIDB4MDZFNSwgMHgwNzFCLCAweDBFODcsIDB4MEU5NCwgMHgwRTk4LCAweDBFQkUsCisgICAgMHgwRjJFLCAweDFFNkYsIDB4MUVCNCwgMHgzRTRGLCAweDNFODgsIDB4N0VGNCwgMHg3RjA3LCAweDdGOTksCisgICAgMHg3RkI3LCAweEZGOUQsIDB4N0ZBOCwgMHg3RUVCLCAweDNGNUQsIDB4M0VCMiwgMHgzRUFBLCAweDNFNUQsCisgICAgMHgzRTQ5LCAweDFFRkUsIDB4MUU4OSwgMHgwRjE2LCAweDBGMTIsIDB4MEVFMCwgMHgwRTdBLCAweDBFNkEsCisgICAgMHgwNzBFLCAweDA2RkEsIDB4MDZCNCwgMHgwMzE0LCAweDAxNTgsIDB4MDMxNSwgMHgwNkI1LCAweDA2RkIsCisgICAgMHgwNzBGLCAweDBFNkIsIDB4MEU3QiwgMHgwRUUxLCAweDBGMTMsIDB4MEYxNywgMHgxRThBLCAweDFFRkYsCisgICAgMHgzRTRBLCAweDNFNUUsIDB4M0VBQiwgMHgzRUIzLCAweDNGNTksIDB4N0VFQywgMHg3RkEyLCAweDdGODIsCisgICAgMHg3RjVFLCAweDdGMjgsIDB4M0VEQSwgMHgzRUM5LCAweDNFN0EsIDB4MUVENiwgMHgxRUNFLCAweDBFRkMsCisgICAgMHgwRUYwLCAweDBFOUEsIDB4MEU3RSwgMHgwRTY2LCAweDBFNUUsIDB4MDcyMiwgMHgwNkMwLCAweDA2QTAsCisgICAgMHgwMkZBLCAweDAwQTgsIDB4MDJGQiwgMHgwNkExLCAweDA2QzEsIDB4MDcyMywgMHgwRTVGLCAweDBFNjcsCisgICAgMHgwRTdGLCAweDBFOUIsIDB4MEVGMSwgMHgwRUZELCAweDFFQ0YsIDB4MUVENywgMHgzRTc5LCAweDNFQ0QsCisgICAgMHgzRURCLCAweDdGMjYsIDB4N0Y1QSwgMHg3RjgzLCAweDdGNTQsIDB4N0VFOCwgMHgzRjU0LCAweDNGMEUsCisgICAgMHgzRUZCLCAweDNFNDcsIDB4MUVDMSwgMHgxRUI5LCAweDBFRjksIDB4MEVGMywgMHgwRUMxLCAweDBFOEYsCisgICAgMHgwRTc0LCAweDA3MTQsIDB4MDZGNCwgMHgwNkIwLCAweDAzMzYsIDB4MDMwQSwgMHgwMDlGLCAweDAzMEIsCisgICAgMHgwMzM3LCAweDA2QjEsIDB4MDZGNSwgMHgwNzE1LCAweDBFNzUsIDB4MEU5MSwgMHgwRUMzLCAweDBFRjYsCisgICAgMHgwRUZCLCAweDFFQkIsIDB4MUVDMywgMHgzRTQxLCAweDNFRjgsIDB4M0YxMCwgMHgzRjRELCAweDdFRTksCisgICAgMHg3RjUyLCAweDdGOUEsIDB4M0YzRiwgMHgzRjFGLCAweDNGMDMsIDB4M0VBMCwgMHgxRjBGLCAweDFFNzIsCisgICAgMHgxRTYyLCAweDBFREEsIDB4MEVEMiwgMHgwRUIyLCAweDBFNjQsIDB4MDcwOCwgMHgwNkVBLCAweDA2REEsCisgICAgMHgwMzQ2LCAweDAzMkEsIDB4MDE3NiwgMHgwMDRCLCAweDAxNzcsIDB4MDMyQiwgMHgwMzQ3LCAweDA2REIsCisgICAgMHgwNkVCLCAweDA3MDksIDB4MEU2NSwgMHgwRUIzLCAweDBFRDMsIDB4MEVEQiwgMHgxRTYzLCAweDFFNkMsCisgICAgMHgxRjBFLCAweDNFOUUsIDB4M0YwMSwgMHgzRjFELCAweDNGM0QsIDB4N0Y5QiwgMHg3RURFLCAweDNGMzYsCisgICAgMHgzRjJFLCAweDNGMDcsIDB4M0U5OSwgMHgxRjBELCAweDFFQTEsIDB4MUU4QywgMHgwRUI0LCAweDBFQUMsCisgICAgMHgwRTVBLCAweDBFNTAsIDB4MDcwMiwgMHgwNkQ0LCAweDA2QzYsIDB4MDMyRSwgMHgwMzEwLCAweDAxNjIsCisgICAgMHgwMDQ2LCAweDAxNjMsIDB4MDMxMSwgMHgwMzJGLCAweDA2QzcsIDB4MDZENSwgMHgwNzAzLCAweDBFNTEsCisgICAgMHgwRTVCLCAweDBFQUQsIDB4MEVCNSwgMHgxRThGLCAweDFFQTcsIDB4MUYwQywgMHgzRTlBLCAweDNGMDIsCisgICAgMHgzRjJELCAweDNGMzUsIDB4N0VFMCwgMHg3RjY2LCAweDNGMTEsIDB4M0VFMSwgMHgzRUJDLCAweDNFNTYsCisgICAgMHgxRUM0LCAweDFFNjQsIDB4MEYwNCwgMHgwRUM3LCAweDBFNTYsIDB4MEU0QywgMHgwNkVDLCAweDA2REMsCisgICAgMHgwNjlDLCAweDA2OTQsIDB4MDMyMCwgMHgwMTZDLCAweDAxNTQsIDB4MDA0NCwgMHgwMTU1LCAweDAxNkQsCisgICAgMHgwMzIxLCAweDA2OTUsIDB4MDY5RCwgMHgwNkRELCAweDA2RUQsIDB4MEU0RCwgMHgwRTU3LCAweDBFQzQsCisgICAgMHgwRjA1LCAweDFFNjUsIDB4MUVDNSwgMHgzRTU1LCAweDNFQjcsIDB4M0VFMywgMHgzRjEzLCAweDdGNjcsCisgICAgMHg3RkE3LCAweDNGNDksIDB4M0YyMiwgMHgzRUU1LCAweDFFRjYsIDB4MUVFNSwgMHgxRTlDLCAweDFFNzgsCisgICAgMHgwRUE0LCAweDA2RjYsIDB4MDZERSwgMHgwNkNFLCAweDA2QUEsIDB4MDM0MCwgMHgwMzE4LCAweDAyRkUsCisgICAgMHgwMTVFLCAweDAwOUEsIDB4MDAxQywgMHgwMDlCLCAweDAxNUYsIDB4MDJGRiwgMHgwMzE5LCAweDAzNDEsCisgICAgMHgwNkFCLCAweDA2Q0YsIDB4MDZERiwgMHgwNkY3LCAweDBFQTUsIDB4MUU3OSwgMHgxRTlELCAweDFFRTcsCisgICAgMHgxRUY3LCAweDNFRTYsIDB4M0YyMywgMHgzRjRCLCAweDdGQTMsIDB4N0Y0OSwgMHgzRjE0LCAweDNFOEQsCisgICAgMHgzRTZCLCAweDFGMTcsIDB4MUVGOCwgMHgwRjI0LCAweDBFQ0MsIDB4MDZGRSwgMHgwNkNBLCAweDA2QTQsCisgICAgMHgwNjk4LCAweDAzMEMsIDB4MDMwMiwgMHgwMTcwLCAweDAxNjgsIDB4MDBBMCwgMHgwMDFFLCAweDAwMDQsCisgICAgMHgwMDFGLCAweDAwQTEsIDB4MDE2OSwgMHgwMTcxLCAweDAzMDMsIDB4MDMwRCwgMHgwNjk5LCAweDA2QTUsCisgICAgMHgwNkNCLCAweDA2RkYsIDB4MEVDRCwgMHgwRjI1LCAweDFFRjksIDB4MUYxOCwgMHgzRTZDLCAweDNFOEUsCisgICAgMHgzRjE1LCAweDdGNDYsIDB4MUVGMCwgMHgxRURFLCAweDFFQzgsIDB4MEYxQSwgMHgwRjAwLCAweDBFOUUsCisgICAgMHgwRTU0LCAweDA2QzQsIDB4MDMxRSwgMHgwMzFDLCAweDAzMDYsIDB4MDJGOCwgMHgwMTdBLCAweDAxNjYsCisgICAgMHgwMEE2LCAweDAwQTQsIDB4MDA0OCwgMHgwMDBDLCAweDAwMDAsIDB4MDAwRCwgMHgwMDQ5LCAweDAwQTUsCisgICAgMHgwMEE3LCAweDAxNjcsIDB4MDE3QiwgMHgwMkY5LCAweDAzMDcsIDB4MDMxRCwgMHgwMzFGLCAweDA2QzUsCisgICAgMHgwRTU1LCAweDBFOUYsIDB4MEYwMSwgMHgwRjFCLCAweDFFQzksIDB4MUVERiwgMHgxRUYxLCAweDdGNDcsCisgICAgMHgzRjEyLCAweDNFOEYsIDB4M0U2RCwgMHgxRjFCLCAweDFFRkEsIDB4MEYyNiwgMHgwRUNFLCAweDA3MDAsCisgICAgMHgwNkNDLCAweDA2QTYsIDB4MDY5QSwgMHgwMzBFLCAweDAzMDQsIDB4MDE3MiwgMHgwMTZBLCAweDAwQTIsCisgICAgMHgwMDIwLCAweDAwMDUsIDB4MDAyMSwgMHgwMEEzLCAweDAxNkIsIDB4MDE3MywgMHgwMzA1LCAweDAzMEYsCisgICAgMHgwNjlCLCAweDA2QTcsIDB4MDZDRCwgMHgwNzAxLCAweDBFQ0YsIDB4MEYyNywgMHgxRUZCLCAweDFGMUQsCisgICAgMHgzRTZFLCAweDNFOTAsIDB4M0YxNywgMHg3RjQ4LCAweDdGQTksIDB4M0Y1MCwgMHgzRjI0LCAweDNFRTcsCisgICAgMHgxRUZDLCAweDFFRTksIDB4MUU5RSwgMHgxRTdBLCAweDBFQTYsIDB4MDZGOCwgMHgwNkUwLCAweDA2RDAsCisgICAgMHgwNkFDLCAweDAzNDIsIDB4MDMxQSwgMHgwMzAwLCAweDAxNjAsIDB4MDA5QywgMHgwMDFELCAweDAwOUQsCisgICAgMHgwMTYxLCAweDAzMDEsIDB4MDMxQiwgMHgwMzQzLCAweDA2QUQsIDB4MDZEMSwgMHgwNkUxLCAweDA2RjksCisgICAgMHgwRUE3LCAweDFFN0IsIDB4MUU5RiwgMHgxRUVBLCAweDFFRkQsIDB4M0VFOCwgMHgzRjIxLCAweDNGNTIsCisgICAgMHg3RjlFLCAweDdGNjgsIDB4M0YxNiwgMHgzRUUyLCAweDNFQkEsIDB4M0U1NywgMHgxRUM2LCAweDFFNjYsCisgICAgMHgwRjA4LCAweDBFQzUsIDB4MEU1OCwgMHgwRTRFLCAweDA2RUUsIDB4MDZFMiwgMHgwNjlFLCAweDA2OTYsCisgICAgMHgwMzIyLCAweDAxNkUsIDB4MDE1NiwgMHgwMDQ1LCAweDAxNTcsIDB4MDE2RiwgMHgwMzIzLCAweDA2OTcsCisgICAgMHgwNjlGLCAweDA2RTMsIDB4MDZFRiwgMHgwRTRGLCAweDBFNTksIDB4MEVDNiwgMHgwRjA5LCAweDFFNjcsCisgICAgMHgxRUM3LCAweDNFNTgsIDB4M0VCOCwgMHgzRUU0LCAweDNGMTgsIDB4N0Y2OSwgMHg3RUUyLCAweDNGMzgsCisgICAgMHgzRjMzLCAweDNGMDQsIDB4M0U5QywgMHgxRjBBLCAweDFFQTUsIDB4MUU4RCwgMHgwRUI2LCAweDBFQUUsCisgICAgMHgwRTVDLCAweDBFNTIsIDB4MDcwNCwgMHgwNkQ2LCAweDA2QzgsIDB4MDMzMCwgMHgwMzEyLCAweDAxNjQsCisgICAgMHgwMDQ3LCAweDAxNjUsIDB4MDMxMywgMHgwMzMxLCAweDA2QzksIDB4MDZENywgMHgwNzA1LCAweDBFNTMsCisgICAgMHgwRTVELCAweDBFQUYsIDB4MEVCNywgMHgxRThFLCAweDFFQTYsIDB4MUYwQiwgMHgzRTlCLCAweDNGMDUsCisgICAgMHgzRjMxLCAweDNGMzksIDB4N0VFMSwgMHg3RjlDLCAweDNGNDAsIDB4M0YxRSwgMHgzRjA2LCAweDNFOUQsCisgICAgMHgxRjEwLCAweDFFNzAsIDB4MUU2MCwgMHgwRUQ4LCAweDBFRDAsIDB4MEVCMCwgMHgwRTYyLCAweDA3MDYsCisgICAgMHgwNkU4LCAweDA2RDgsIDB4MDM0NCwgMHgwMzI4LCAweDAxNzQsIDB4MDA0QSwgMHgwMTc1LCAweDAzMjksCisgICAgMHgwMzQ1LCAweDA2RDksIDB4MDZFOSwgMHgwNzA3LCAweDBFNjMsIDB4MEVCMSwgMHgwRUQxLCAweDBFRDksCisgICAgMHgxRTYxLCAweDFFNzEsIDB4MUYxMSwgMHgzRTlGLCAweDNGMDgsIDB4M0YyMCwgMHgzRjNFLCAweDdGOUQsCisgICAgMHg3RjRGLCAweDdFRTYsIDB4M0Y1MywgMHgzRjBELCAweDNFRkEsIDB4M0U0NiwgMHgxRUMwLCAweDFFQjgsCisgICAgMHgwRUY4LCAweDBFRjIsIDB4MEVDMCwgMHgwRThFLCAweDBFNzIsIDB4MDcxMiwgMHgwNkYyLCAweDA2QUUsCisgICAgMHgwMzM0LCAweDAzMDgsIDB4MDA5RSwgMHgwMzA5LCAweDAzMzUsIDB4MDZBRiwgMHgwNkYzLCAweDA3MTMsCisgICAgMHgwRTczLCAweDBFOTAsIDB4MEVDMiwgMHgwRUY0LCAweDBFRkEsIDB4MUVCQSwgMHgxRUMyLCAweDNFNDgsCisgICAgMHgzRUZDLCAweDNGMEIsIDB4M0Y1MSwgMHg3RUU3LCAweDdGNTEsIDB4N0Y4NCwgMHg3RjYxLCAweDdGMjcsCisgICAgMHgzRURDLCAweDNFQzUsIDB4M0U3QywgMHgxRUQ4LCAweDFFRDAsIDB4MEVGRSwgMHgwRUY1LCAweDBFOUMsCisgICAgMHgwRTgwLCAweDBFNjgsIDB4MEU2MCwgMHgwNzI0LCAweDA2QzIsIDB4MDZBMiwgMHgwMkZDLCAweDAwQTksCisgICAgMHgwMkZELCAweDA2QTMsIDB4MDZDMywgMHgwNzI1LCAweDBFNjEsIDB4MEU2OSwgMHgwRTgxLCAweDBFOUQsCisgICAgMHgwRUY3LCAweDBFRkYsIDB4MUVEMSwgMHgxRUQ5LCAweDNFN0IsIDB4M0VDRiwgMHgzRUQ5LCAweDdGMjksCisgICAgMHg3RjY1LCAweDdGODUsIDB4N0ZBMCwgMHg3RUVBLCAweDNGNjAsIDB4M0VCNCwgMHgzRUFDLCAweDNFNUYsCisgICAgMHgzRTRCLCAweDFGMDAsIDB4MUU4QiwgMHgwRjE4LCAweDBGMTQsIDB4MEVFMiwgMHgwRTdDLCAweDBFNkMsCisgICAgMHgwNzEwLCAweDA2RkMsIDB4MDZCNiwgMHgwMzE2LCAweDAxNTksIDB4MDMxNywgMHgwNkI3LCAweDA2RkQsCisgICAgMHgwNzExLCAweDBFNkQsIDB4MEU3RCwgMHgwRUUzLCAweDBGMTUsIDB4MEYxOSwgMHgxRTg4LCAweDFGMDEsCisgICAgMHgzRTRDLCAweDNFNjAsIDB4M0VBOSwgMHgzRUIxLCAweDNGNUIsIDB4N0VFRCwgMHg3RkE1LCAweEZGOUUsCisgICAgMHg3RkJFLCAweDdGOTgsIDB4N0YwRCwgMHg3RUYzLCAweDNFOEMsIDB4M0U1MCwgMHgxRUI3LCAweDFFNzMsCisgICAgMHgwRjJGLCAweDBFQkYsIDB4MEU5OSwgMHgwRTk1LCAweDBFODgsIDB4MDcxQywgMHgwNkU2LCAweDA2QkUsCisgICAgMHgwMzNBLCAweDAxNUIsIDB4MDMzQiwgMHgwNkJGLCAweDA2RTcsIDB4MDcxRCwgMHgwRTg5LCAweDBFOTIsCisgICAgMHgwRTk2LCAweDBFQkMsIDB4MEYyQywgMHgxRTZELCAweDFFQjAsIDB4M0U0RCwgMHgzRThCLCAweDdFRjIsCisgICAgMHg3RjA4LCAweDdGOTcsIDB4N0ZCMCwgMHhGRjlDLCAweDdGQjIsIDB4N0YyMywgMHg3RUZBLCAweDNGMEYsCisgICAgMHgzRUJELCAweDNFQUQsIDB4MUVBMCwgMHgxRTg3LCAweDBGMEEsIDB4MEYwMiwgMHgwRUVELCAweDBFRTQsCisgICAgMHgwRUM4LCAweDBFQTAsIDB4MEU3NiwgMHgwNzFFLCAweDA2QjgsIDB4MDMyNCwgMHgwMTVDLCAweDAzMjUsCisgICAgMHgwNkI5LCAweDA3MUYsIDB4MEU3NywgMHgwRUExLCAweDBFQzksIDB4MEVFNSwgMHgwRUVDLCAweDBGMDMsCisgICAgMHgwRjBCLCAweDFFODQsIDB4MUVBMiwgMHgzRUIwLCAweDNFQzQsIDB4M0YwOSwgMHg3RUY3LCAweDdGMUQsCisgICAgMHg3RkJDLCAweDdGQ0QsIDB4N0Y4MSwgMHg3RjUwLCAweDdGMzQsIDB4M0Y2NSwgMHgzRUVELCAweDNFNjcsCisgICAgMHgxRURCLCAweDFFRDIsIDB4MUU5OSwgMHgxRTc3LCAweDBGMjEsIDB4MEYxQywgMHgwRUU4LCAweDBFQTgsCisgICAgMHgwRTZFLCAweDA3MTYsIDB4MDMzQywgMHgwMTc4LCAweDAzM0QsIDB4MDcxNywgMHgwRTZGLCAweDBFQUEsCisgICAgMHgwRUVCLCAweDBGMUUsIDB4MEYyMywgMHgxRTc1LCAweDFFOUEsIDB4MUVENCwgMHgxRURDLCAweDNFNjYsCisgICAgMHgzRUVFLCAweDNGNkIsIDB4N0YzNSwgMHg3RjU1LCAweDdGN0EsIDB4N0ZDQSwgMHg3RkI2LCAweDdGQjgsCisgICAgMHg3RjM3LCAweDdGMUYsIDB4M0Y2MSwgMHgzRjM3LCAweDNGMUEsIDB4M0VCNSwgMHgzRTYyLCAweDNFNUEsCisgICAgMHgxRjFFLCAweDFGMTMsIDB4MUVGMiwgMHgxRUU2LCAweDFFQkMsIDB4MUU5MSwgMHgxRTY4LCAweDA3MEEsCisgICAgMHgwMzJDLCAweDA3MEIsIDB4MUU2OSwgMHgxRTkwLCAweDFFQkQsIDB4MUVFNCwgMHgxRUY0LCAweDFGMTIsCisgICAgMHgzRTNFLCAweDNFNTksIDB4M0U2MSwgMHgzRUI2LCAweDNGMTksIDB4M0YzQiwgMHgzRjY0LCAweDdGMUMsCisgICAgMHg3RjNELCAweDdGQjQsIDB4N0ZCOSwgMHhGRkM1LCAweEZGQjYsIDB4RkZBRCwgMHg3RkE0LCAweDdGMkMsCisgICAgMHg3RjIwLCAweDdGMDksIDB4M0VGNSwgMHgzRTkzLCAweDNFODIsIDB4M0U3RSwgMHgxRjAyLCAweDFFRTMsCisgICAgMHgxRUNBLCAweDFFQUQsIDB4MUU3QywgMHgwRUI4LCAweDBFOEEsIDB4MDMzMiwgMHgwRThCLCAweDBFQjksCisgICAgMHgxRTdELCAweDFFQUMsIDB4MUVDRCwgMHgxRUUwLCAweDFGMDMsIDB4M0U3RCwgMHgzRTgxLCAweDNFOTEsCisgICAgMHgzRUY3LCAweDdGMEMsIDB4N0YxQSwgMHg3RjJFLCAweDdGQTYsIDB4RkZBNCwgMHhGRkI3LCAweEZGQzQsCisgICAgMHhGRkQ0LCAweEZGQ0MsIDB4N0ZDNSwgMHg3RjhBLCAweDdGM0MsIDB4N0VGRiwgMHgzRjVFLCAweDNGNEUsCisgICAgMHgzRjJGLCAweDNFRkQsIDB4M0VFRiwgMHgzRUVCLCAweDNFOTIsIDB4M0U3MSwgMHgzRTQyLCAweDFGMDksCisgICAgMHgxRTgzLCAweDBFODIsIDB4MDM0OCwgMHgwRTgzLCAweDFFODAsIDB4MUYwNiwgMHgzRTQ0LCAweDNFNzIsCisgICAgMHgzRTk0LCAweDNFRUMsIDB4M0VGMiwgMHgzRUZFLCAweDNGMzQsIDB4M0Y0QywgMHgzRjVGLCAweDdFRkUsCisgICAgMHg3RjNBLCAweDdGODYsIDB4N0ZDNCwgMHhGRkQyLCAweEZGRDUsIDB4RkZGQSwgMHhGRkNELCAweEZGQkEsCisgICAgMHg3RkFCLCAweDdGOTIsIDB4N0Y4NywgMHg3RjYzLCAweDdGNEMsIDB4N0YwMywgMHg3RUYwLCAweDNGNDIsCisgICAgMHgzRUExLCAweDNFNzYsIDB4M0U2QSwgMHgzRTUyLCAweDFFRUUsIDB4MUVBQiwgMHgwRUQ2LCAweDA2QTksCisgICAgMHgwRUQ3LCAweDFFQUEsIDB4MUVFRCwgMHgzRTUzLCAweDNFNzAsIDB4M0U3NywgMHgzRUEyLCAweDNGNDEsCisgICAgMHg3RUVGLCAweDdGMDAsIDB4N0Y0RCwgMHg3RjYwLCAweDdGODgsIDB4N0Y5MywgMHg3RkFELCAweEZGQjgsCisgICAgMHhGRkNCLCAweEZGRkIsIDB4RkZGQywgMHhGRkUxLCAweEZGQkYsIDB4N0ZCQSwgMHg3RjczLCAweDdGNkMsCisgICAgMHg3RjU3LCAweDdFRkMsIDB4N0VERCwgMHgzRjZBLCAweDNGMkEsIDB4M0YyNSwgMHgzRURELCAweDNFRDMsCisgICAgMHgzRUMyLCAweDNFQTcsIDB4M0U4NiwgMHgwRjExLCAweDA2QjIsIDB4MEYwRSwgMHgzRThBLCAweDNFQTUsCisgICAgMHgzRUMwLCAweDNFRDEsIDB4M0VERSwgMHgzRjJDLCAweDNGMjksIDB4M0Y2OSwgMHg3RURCLCAweDdFRkQsCisgICAgMHg3RjU5LCAweDdGNkQsIDB4N0Y3NCwgMHg3RkMwLCAweEZGQzMsIDB4RkZFMywgMHhGRkZELCAweEZGRjAsCisgICAgMHhGRkU5LCAweEZGRTcsIDB4RkZDOSwgMHhGRkJELCAweEZGQUUsIDB4N0Y3MSwgMHg3RjVGLCAweDdGNDIsCisgICAgMHg3RjQxLCAweDdGMzAsIDB4N0YxNywgMHg3RUU0LCAweDNFRDcsIDB4M0VDNywgMHgzRUNCLCAweDFFQjEsCisgICAgMHgwRURDLCAweDA2RDIsIDB4MEVERCwgMHgxRUIyLCAweDNFQzYsIDB4M0VDOCwgMHgzRUQ0LCAweDdFRTMsCisgICAgMHg3RjE4LCAweDdGMkIsIDB4N0YzRiwgMHg3RjQzLCAweDdGNjQsIDB4N0Y2RSwgMHhGRkFCLCAweEZGQzIsCisgICAgMHhGRkQwLCAweEZGRTYsIDB4RkZFRiwgMHhGRkYzLCAweEZGRjcsIDB4RkZFQiwgMHhGRkRFLCAweEZGREEsCisgICAgMHhGRkIzLCAweEZGQUMsIDB4RkZBMywgMHg3RkM5LCAweDdGOEYsIDB4N0Y3QywgMHg3Rjc5LCAweDdGMEYsCisgICAgMHg3RjEwLCAweDNGNTUsIDB4M0Y0NSwgMHgxRjFBLCAweDFFOTUsIDB4MEYyQiwgMHgwNkYxLCAweDBGMjksCisgICAgMHgxRTk3LCAweDFGMTksIDB4M0Y0NywgMHgzRjU3LCAweDdGMTQsIDB4N0YxMiwgMHg3Rjc4LCAweDdGN0UsCisgICAgMHg3RjkxLCAweDdGQzcsIDB4RkZBMSwgMHhGRkE1LCAweEZGQjIsIDB4RkZEQiwgMHhGRkRGLCAweEZGRUQsCisgICAgMHhGRkY0LCAweDAwNEMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X212eV8zX3N5bXNbXSA9IHsKKyAgICAweEVFRUUsIDB4RUZFRSwgMHhGMEVFLCAweEYxRUUsIDB4RjJFRSwgMHhGM0VFLCAweEY0RUUsIDB4RjVFRSwKKyAgICAweEY2RUUsIDB4RjdFRSwgMHhGOEVFLCAweEY5RUUsIDB4RkFFRSwgMHhGQkVFLCAweEZDRUUsIDB4RkRFRSwKKyAgICAweEZFRUUsIDB4RkZFRSwgMHgwMEVFLCAweDAxRUUsIDB4MDJFRSwgMHgwM0VFLCAweDA0RUUsIDB4MDVFRSwKKyAgICAweDA2RUUsIDB4MDdFRSwgMHgwOEVFLCAweDA5RUUsIDB4MEFFRSwgMHgwQkVFLCAweDBDRUUsIDB4MERFRSwKKyAgICAweDBFRUUsIDB4MEZFRSwgMHgxMEVFLCAweDExRUUsIDB4MTJFRSwgMHhFRUVGLCAweEVGRUYsIDB4RjBFRiwKKyAgICAweEYxRUYsIDB4RjJFRiwgMHhGM0VGLCAweEY0RUYsIDB4RjVFRiwgMHhGNkVGLCAweEY3RUYsIDB4RjhFRiwKKyAgICAweEY5RUYsIDB4RkFFRiwgMHhGQkVGLCAweEZDRUYsIDB4RkRFRiwgMHhGRUVGLCAweEZGRUYsIDB4MDBFRiwKKyAgICAweDAxRUYsIDB4MDJFRiwgMHgwM0VGLCAweDA0RUYsIDB4MDVFRiwgMHgwNkVGLCAweDA3RUYsIDB4MDhFRiwKKyAgICAweDA5RUYsIDB4MEFFRiwgMHgwQkVGLCAweDBDRUYsIDB4MERFRiwgMHgwRUVGLCAweDBGRUYsIDB4MTBFRiwKKyAgICAweDExRUYsIDB4MTJFRiwgMHhFRUYwLCAweEVGRjAsIDB4RjBGMCwgMHhGMUYwLCAweEYyRjAsIDB4RjNGMCwKKyAgICAweEY0RjAsIDB4RjVGMCwgMHhGNkYwLCAweEY3RjAsIDB4RjhGMCwgMHhGOUYwLCAweEZBRjAsIDB4RkJGMCwKKyAgICAweEZDRjAsIDB4RkRGMCwgMHhGRUYwLCAweEZGRjAsIDB4MDBGMCwgMHgwMUYwLCAweDAyRjAsIDB4MDNGMCwKKyAgICAweDA0RjAsIDB4MDVGMCwgMHgwNkYwLCAweDA3RjAsIDB4MDhGMCwgMHgwOUYwLCAweDBBRjAsIDB4MEJGMCwKKyAgICAweDBDRjAsIDB4MERGMCwgMHgwRUYwLCAweDBGRjAsIDB4MTBGMCwgMHgxMUYwLCAweDEyRjAsIDB4RUVGMSwKKyAgICAweEVGRjEsIDB4RjBGMSwgMHhGMUYxLCAweEYyRjEsIDB4RjNGMSwgMHhGNEYxLCAweEY1RjEsIDB4RjZGMSwKKyAgICAweEY3RjEsIDB4RjhGMSwgMHhGOUYxLCAweEZBRjEsIDB4RkJGMSwgMHhGQ0YxLCAweEZERjEsIDB4RkVGMSwKKyAgICAweEZGRjEsIDB4MDBGMSwgMHgwMUYxLCAweDAyRjEsIDB4MDNGMSwgMHgwNEYxLCAweDA1RjEsIDB4MDZGMSwKKyAgICAweDA3RjEsIDB4MDhGMSwgMHgwOUYxLCAweDBBRjEsIDB4MEJGMSwgMHgwQ0YxLCAweDBERjEsIDB4MEVGMSwKKyAgICAweDBGRjEsIDB4MTBGMSwgMHgxMUYxLCAweDEyRjEsIDB4RUVGMiwgMHhFRkYyLCAweEYwRjIsIDB4RjFGMiwKKyAgICAweEYyRjIsIDB4RjNGMiwgMHhGNEYyLCAweEY1RjIsIDB4RjZGMiwgMHhGN0YyLCAweEY4RjIsIDB4RjlGMiwKKyAgICAweEZBRjIsIDB4RkJGMiwgMHhGQ0YyLCAweEZERjIsIDB4RkVGMiwgMHhGRkYyLCAweDAwRjIsIDB4MDFGMiwKKyAgICAweDAyRjIsIDB4MDNGMiwgMHgwNEYyLCAweDA1RjIsIDB4MDZGMiwgMHgwN0YyLCAweDA4RjIsIDB4MDlGMiwKKyAgICAweDBBRjIsIDB4MEJGMiwgMHgwQ0YyLCAweDBERjIsIDB4MEVGMiwgMHgwRkYyLCAweDEwRjIsIDB4MTFGMiwKKyAgICAweDEyRjIsIDB4RUVGMywgMHhFRkYzLCAweEYwRjMsIDB4RjFGMywgMHhGMkYzLCAweEYzRjMsIDB4RjRGMywKKyAgICAweEY1RjMsIDB4RjZGMywgMHhGN0YzLCAweEY4RjMsIDB4RjlGMywgMHhGQUYzLCAweEZCRjMsIDB4RkNGMywKKyAgICAweEZERjMsIDB4RkVGMywgMHhGRkYzLCAweDAwRjMsIDB4MDFGMywgMHgwMkYzLCAweDAzRjMsIDB4MDRGMywKKyAgICAweDA1RjMsIDB4MDZGMywgMHgwN0YzLCAweDA4RjMsIDB4MDlGMywgMHgwQUYzLCAweDBCRjMsIDB4MENGMywKKyAgICAweDBERjMsIDB4MEVGMywgMHgwRkYzLCAweDEwRjMsIDB4MTFGMywgMHgxMkYzLCAweEVFRjQsIDB4RUZGNCwKKyAgICAweEYwRjQsIDB4RjFGNCwgMHhGMkY0LCAweEYzRjQsIDB4RjRGNCwgMHhGNUY0LCAweEY2RjQsIDB4RjdGNCwKKyAgICAweEY4RjQsIDB4RjlGNCwgMHhGQUY0LCAweEZCRjQsIDB4RkNGNCwgMHhGREY0LCAweEZFRjQsIDB4RkZGNCwKKyAgICAweDAwRjQsIDB4MDFGNCwgMHgwMkY0LCAweDAzRjQsIDB4MDRGNCwgMHgwNUY0LCAweDA2RjQsIDB4MDdGNCwKKyAgICAweDA4RjQsIDB4MDlGNCwgMHgwQUY0LCAweDBCRjQsIDB4MENGNCwgMHgwREY0LCAweDBFRjQsIDB4MEZGNCwKKyAgICAweDEwRjQsIDB4MTFGNCwgMHgxMkY0LCAweEVFRjUsIDB4RUZGNSwgMHhGMEY1LCAweEYxRjUsIDB4RjJGNSwKKyAgICAweEYzRjUsIDB4RjRGNSwgMHhGNUY1LCAweEY2RjUsIDB4RjdGNSwgMHhGOEY1LCAweEY5RjUsIDB4RkFGNSwKKyAgICAweEZCRjUsIDB4RkNGNSwgMHhGREY1LCAweEZFRjUsIDB4RkZGNSwgMHgwMEY1LCAweDAxRjUsIDB4MDJGNSwKKyAgICAweDAzRjUsIDB4MDRGNSwgMHgwNUY1LCAweDA2RjUsIDB4MDdGNSwgMHgwOEY1LCAweDA5RjUsIDB4MEFGNSwKKyAgICAweDBCRjUsIDB4MENGNSwgMHgwREY1LCAweDBFRjUsIDB4MEZGNSwgMHgxMEY1LCAweDExRjUsIDB4MTJGNSwKKyAgICAweEVFRjYsIDB4RUZGNiwgMHhGMEY2LCAweEYxRjYsIDB4RjJGNiwgMHhGM0Y2LCAweEY0RjYsIDB4RjVGNiwKKyAgICAweEY2RjYsIDB4RjdGNiwgMHhGOEY2LCAweEY5RjYsIDB4RkFGNiwgMHhGQkY2LCAweEZDRjYsIDB4RkRGNiwKKyAgICAweEZFRjYsIDB4RkZGNiwgMHgwMEY2LCAweDAxRjYsIDB4MDJGNiwgMHgwM0Y2LCAweDA0RjYsIDB4MDVGNiwKKyAgICAweDA2RjYsIDB4MDdGNiwgMHgwOEY2LCAweDA5RjYsIDB4MEFGNiwgMHgwQkY2LCAweDBDRjYsIDB4MERGNiwKKyAgICAweDBFRjYsIDB4MEZGNiwgMHgxMEY2LCAweDExRjYsIDB4MTJGNiwgMHhFRUY3LCAweEVGRjcsIDB4RjBGNywKKyAgICAweEYxRjcsIDB4RjJGNywgMHhGM0Y3LCAweEY0RjcsIDB4RjVGNywgMHhGNkY3LCAweEY3RjcsIDB4RjhGNywKKyAgICAweEY5RjcsIDB4RkFGNywgMHhGQkY3LCAweEZDRjcsIDB4RkRGNywgMHhGRUY3LCAweEZGRjcsIDB4MDBGNywKKyAgICAweDAxRjcsIDB4MDJGNywgMHgwM0Y3LCAweDA0RjcsIDB4MDVGNywgMHgwNkY3LCAweDA3RjcsIDB4MDhGNywKKyAgICAweDA5RjcsIDB4MEFGNywgMHgwQkY3LCAweDBDRjcsIDB4MERGNywgMHgwRUY3LCAweDBGRjcsIDB4MTBGNywKKyAgICAweDExRjcsIDB4MTJGNywgMHhFRUY4LCAweEVGRjgsIDB4RjBGOCwgMHhGMUY4LCAweEYyRjgsIDB4RjNGOCwKKyAgICAweEY0RjgsIDB4RjVGOCwgMHhGNkY4LCAweEY3RjgsIDB4RjhGOCwgMHhGOUY4LCAweEZBRjgsIDB4RkJGOCwKKyAgICAweEZDRjgsIDB4RkRGOCwgMHhGRUY4LCAweEZGRjgsIDB4MDBGOCwgMHgwMUY4LCAweDAyRjgsIDB4MDNGOCwKKyAgICAweDA0RjgsIDB4MDVGOCwgMHgwNkY4LCAweDA3RjgsIDB4MDhGOCwgMHgwOUY4LCAweDBBRjgsIDB4MEJGOCwKKyAgICAweDBDRjgsIDB4MERGOCwgMHgwRUY4LCAweDBGRjgsIDB4MTBGOCwgMHgxMUY4LCAweDEyRjgsIDB4RUVGOSwKKyAgICAweEVGRjksIDB4RjBGOSwgMHhGMUY5LCAweEYyRjksIDB4RjNGOSwgMHhGNEY5LCAweEY1RjksIDB4RjZGOSwKKyAgICAweEY3RjksIDB4RjhGOSwgMHhGOUY5LCAweEZBRjksIDB4RkJGOSwgMHhGQ0Y5LCAweEZERjksIDB4RkVGOSwKKyAgICAweEZGRjksIDB4MDBGOSwgMHgwMUY5LCAweDAyRjksIDB4MDNGOSwgMHgwNEY5LCAweDA1RjksIDB4MDZGOSwKKyAgICAweDA3RjksIDB4MDhGOSwgMHgwOUY5LCAweDBBRjksIDB4MEJGOSwgMHgwQ0Y5LCAweDBERjksIDB4MEVGOSwKKyAgICAweDBGRjksIDB4MTBGOSwgMHgxMUY5LCAweDEyRjksIDB4RUVGQSwgMHhFRkZBLCAweEYwRkEsIDB4RjFGQSwKKyAgICAweEYyRkEsIDB4RjNGQSwgMHhGNEZBLCAweEY1RkEsIDB4RjZGQSwgMHhGN0ZBLCAweEY4RkEsIDB4RjlGQSwKKyAgICAweEZBRkEsIDB4RkJGQSwgMHhGQ0ZBLCAweEZERkEsIDB4RkVGQSwgMHhGRkZBLCAweDAwRkEsIDB4MDFGQSwKKyAgICAweDAyRkEsIDB4MDNGQSwgMHgwNEZBLCAweDA1RkEsIDB4MDZGQSwgMHgwN0ZBLCAweDA4RkEsIDB4MDlGQSwKKyAgICAweDBBRkEsIDB4MEJGQSwgMHgwQ0ZBLCAweDBERkEsIDB4MEVGQSwgMHgwRkZBLCAweDEwRkEsIDB4MTFGQSwKKyAgICAweDEyRkEsIDB4RUVGQiwgMHhFRkZCLCAweEYwRkIsIDB4RjFGQiwgMHhGMkZCLCAweEYzRkIsIDB4RjRGQiwKKyAgICAweEY1RkIsIDB4RjZGQiwgMHhGN0ZCLCAweEY4RkIsIDB4RjlGQiwgMHhGQUZCLCAweEZCRkIsIDB4RkNGQiwKKyAgICAweEZERkIsIDB4RkVGQiwgMHhGRkZCLCAweDAwRkIsIDB4MDFGQiwgMHgwMkZCLCAweDAzRkIsIDB4MDRGQiwKKyAgICAweDA1RkIsIDB4MDZGQiwgMHgwN0ZCLCAweDA4RkIsIDB4MDlGQiwgMHgwQUZCLCAweDBCRkIsIDB4MENGQiwKKyAgICAweDBERkIsIDB4MEVGQiwgMHgwRkZCLCAweDEwRkIsIDB4MTFGQiwgMHgxMkZCLCAweEVFRkMsIDB4RUZGQywKKyAgICAweEYwRkMsIDB4RjFGQywgMHhGMkZDLCAweEYzRkMsIDB4RjRGQywgMHhGNUZDLCAweEY2RkMsIDB4RjdGQywKKyAgICAweEY4RkMsIDB4RjlGQywgMHhGQUZDLCAweEZCRkMsIDB4RkNGQywgMHhGREZDLCAweEZFRkMsIDB4RkZGQywKKyAgICAweDAwRkMsIDB4MDFGQywgMHgwMkZDLCAweDAzRkMsIDB4MDRGQywgMHgwNUZDLCAweDA2RkMsIDB4MDdGQywKKyAgICAweDA4RkMsIDB4MDlGQywgMHgwQUZDLCAweDBCRkMsIDB4MENGQywgMHgwREZDLCAweDBFRkMsIDB4MEZGQywKKyAgICAweDEwRkMsIDB4MTFGQywgMHgxMkZDLCAweEVFRkQsIDB4RUZGRCwgMHhGMEZELCAweEYxRkQsIDB4RjJGRCwKKyAgICAweEYzRkQsIDB4RjRGRCwgMHhGNUZELCAweEY2RkQsIDB4RjdGRCwgMHhGOEZELCAweEY5RkQsIDB4RkFGRCwKKyAgICAweEZCRkQsIDB4RkNGRCwgMHhGREZELCAweEZFRkQsIDB4RkZGRCwgMHgwMEZELCAweDAxRkQsIDB4MDJGRCwKKyAgICAweDAzRkQsIDB4MDRGRCwgMHgwNUZELCAweDA2RkQsIDB4MDdGRCwgMHgwOEZELCAweDA5RkQsIDB4MEFGRCwKKyAgICAweDBCRkQsIDB4MENGRCwgMHgwREZELCAweDBFRkQsIDB4MEZGRCwgMHgxMEZELCAweDExRkQsIDB4MTJGRCwKKyAgICAweEVFRkUsIDB4RUZGRSwgMHhGMEZFLCAweEYxRkUsIDB4RjJGRSwgMHhGM0ZFLCAweEY0RkUsIDB4RjVGRSwKKyAgICAweEY2RkUsIDB4RjdGRSwgMHhGOEZFLCAweEY5RkUsIDB4RkFGRSwgMHhGQkZFLCAweEZDRkUsIDB4RkRGRSwKKyAgICAweEZFRkUsIDB4RkZGRSwgMHgwMEZFLCAweDAxRkUsIDB4MDJGRSwgMHgwM0ZFLCAweDA0RkUsIDB4MDVGRSwKKyAgICAweDA2RkUsIDB4MDdGRSwgMHgwOEZFLCAweDA5RkUsIDB4MEFGRSwgMHgwQkZFLCAweDBDRkUsIDB4MERGRSwKKyAgICAweDBFRkUsIDB4MEZGRSwgMHgxMEZFLCAweDExRkUsIDB4MTJGRSwgMHhFRUZGLCAweEVGRkYsIDB4RjBGRiwKKyAgICAweEYxRkYsIDB4RjJGRiwgMHhGM0ZGLCAweEY0RkYsIDB4RjVGRiwgMHhGNkZGLCAweEY3RkYsIDB4RjhGRiwKKyAgICAweEY5RkYsIDB4RkFGRiwgMHhGQkZGLCAweEZDRkYsIDB4RkRGRiwgMHhGRUZGLCAweEZGRkYsIDB4MDBGRiwKKyAgICAweDAxRkYsIDB4MDJGRiwgMHgwM0ZGLCAweDA0RkYsIDB4MDVGRiwgMHgwNkZGLCAweDA3RkYsIDB4MDhGRiwKKyAgICAweDA5RkYsIDB4MEFGRiwgMHgwQkZGLCAweDBDRkYsIDB4MERGRiwgMHgwRUZGLCAweDBGRkYsIDB4MTBGRiwKKyAgICAweDExRkYsIDB4MTJGRiwgMHhFRTAwLCAweEVGMDAsIDB4RjAwMCwgMHhGMTAwLCAweEYyMDAsIDB4RjMwMCwKKyAgICAweEY0MDAsIDB4RjUwMCwgMHhGNjAwLCAweEY3MDAsIDB4RjgwMCwgMHhGOTAwLCAweEZBMDAsIDB4RkIwMCwKKyAgICAweEZDMDAsIDB4RkQwMCwgMHhGRTAwLCAweEZGMDAsIDB4MDAwMCwgMHgwMTAwLCAweDAyMDAsIDB4MDMwMCwKKyAgICAweDA0MDAsIDB4MDUwMCwgMHgwNjAwLCAweDA3MDAsIDB4MDgwMCwgMHgwOTAwLCAweDBBMDAsIDB4MEIwMCwKKyAgICAweDBDMDAsIDB4MEQwMCwgMHgwRTAwLCAweDBGMDAsIDB4MTAwMCwgMHgxMTAwLCAweDEyMDAsIDB4RUUwMSwKKyAgICAweEVGMDEsIDB4RjAwMSwgMHhGMTAxLCAweEYyMDEsIDB4RjMwMSwgMHhGNDAxLCAweEY1MDEsIDB4RjYwMSwKKyAgICAweEY3MDEsIDB4RjgwMSwgMHhGOTAxLCAweEZBMDEsIDB4RkIwMSwgMHhGQzAxLCAweEZEMDEsIDB4RkUwMSwKKyAgICAweEZGMDEsIDB4MDAwMSwgMHgwMTAxLCAweDAyMDEsIDB4MDMwMSwgMHgwNDAxLCAweDA1MDEsIDB4MDYwMSwKKyAgICAweDA3MDEsIDB4MDgwMSwgMHgwOTAxLCAweDBBMDEsIDB4MEIwMSwgMHgwQzAxLCAweDBEMDEsIDB4MEUwMSwKKyAgICAweDBGMDEsIDB4MTAwMSwgMHgxMTAxLCAweDEyMDEsIDB4RUUwMiwgMHhFRjAyLCAweEYwMDIsIDB4RjEwMiwKKyAgICAweEYyMDIsIDB4RjMwMiwgMHhGNDAyLCAweEY1MDIsIDB4RjYwMiwgMHhGNzAyLCAweEY4MDIsIDB4RjkwMiwKKyAgICAweEZBMDIsIDB4RkIwMiwgMHhGQzAyLCAweEZEMDIsIDB4RkUwMiwgMHhGRjAyLCAweDAwMDIsIDB4MDEwMiwKKyAgICAweDAyMDIsIDB4MDMwMiwgMHgwNDAyLCAweDA1MDIsIDB4MDYwMiwgMHgwNzAyLCAweDA4MDIsIDB4MDkwMiwKKyAgICAweDBBMDIsIDB4MEIwMiwgMHgwQzAyLCAweDBEMDIsIDB4MEUwMiwgMHgwRjAyLCAweDEwMDIsIDB4MTEwMiwKKyAgICAweDEyMDIsIDB4RUUwMywgMHhFRjAzLCAweEYwMDMsIDB4RjEwMywgMHhGMjAzLCAweEYzMDMsIDB4RjQwMywKKyAgICAweEY1MDMsIDB4RjYwMywgMHhGNzAzLCAweEY4MDMsIDB4RjkwMywgMHhGQTAzLCAweEZCMDMsIDB4RkMwMywKKyAgICAweEZEMDMsIDB4RkUwMywgMHhGRjAzLCAweDAwMDMsIDB4MDEwMywgMHgwMjAzLCAweDAzMDMsIDB4MDQwMywKKyAgICAweDA1MDMsIDB4MDYwMywgMHgwNzAzLCAweDA4MDMsIDB4MDkwMywgMHgwQTAzLCAweDBCMDMsIDB4MEMwMywKKyAgICAweDBEMDMsIDB4MEUwMywgMHgwRjAzLCAweDEwMDMsIDB4MTEwMywgMHgxMjAzLCAweEVFMDQsIDB4RUYwNCwKKyAgICAweEYwMDQsIDB4RjEwNCwgMHhGMjA0LCAweEYzMDQsIDB4RjQwNCwgMHhGNTA0LCAweEY2MDQsIDB4RjcwNCwKKyAgICAweEY4MDQsIDB4RjkwNCwgMHhGQTA0LCAweEZCMDQsIDB4RkMwNCwgMHhGRDA0LCAweEZFMDQsIDB4RkYwNCwKKyAgICAweDAwMDQsIDB4MDEwNCwgMHgwMjA0LCAweDAzMDQsIDB4MDQwNCwgMHgwNTA0LCAweDA2MDQsIDB4MDcwNCwKKyAgICAweDA4MDQsIDB4MDkwNCwgMHgwQTA0LCAweDBCMDQsIDB4MEMwNCwgMHgwRDA0LCAweDBFMDQsIDB4MEYwNCwKKyAgICAweDEwMDQsIDB4MTEwNCwgMHgxMjA0LCAweEVFMDUsIDB4RUYwNSwgMHhGMDA1LCAweEYxMDUsIDB4RjIwNSwKKyAgICAweEYzMDUsIDB4RjQwNSwgMHhGNTA1LCAweEY2MDUsIDB4RjcwNSwgMHhGODA1LCAweEY5MDUsIDB4RkEwNSwKKyAgICAweEZCMDUsIDB4RkMwNSwgMHhGRDA1LCAweEZFMDUsIDB4RkYwNSwgMHgwMDA1LCAweDAxMDUsIDB4MDIwNSwKKyAgICAweDAzMDUsIDB4MDQwNSwgMHgwNTA1LCAweDA2MDUsIDB4MDcwNSwgMHgwODA1LCAweDA5MDUsIDB4MEEwNSwKKyAgICAweDBCMDUsIDB4MEMwNSwgMHgwRDA1LCAweDBFMDUsIDB4MEYwNSwgMHgxMDA1LCAweDExMDUsIDB4MTIwNSwKKyAgICAweEVFMDYsIDB4RUYwNiwgMHhGMDA2LCAweEYxMDYsIDB4RjIwNiwgMHhGMzA2LCAweEY0MDYsIDB4RjUwNiwKKyAgICAweEY2MDYsIDB4RjcwNiwgMHhGODA2LCAweEY5MDYsIDB4RkEwNiwgMHhGQjA2LCAweEZDMDYsIDB4RkQwNiwKKyAgICAweEZFMDYsIDB4RkYwNiwgMHgwMDA2LCAweDAxMDYsIDB4MDIwNiwgMHgwMzA2LCAweDA0MDYsIDB4MDUwNiwKKyAgICAweDA2MDYsIDB4MDcwNiwgMHgwODA2LCAweDA5MDYsIDB4MEEwNiwgMHgwQjA2LCAweDBDMDYsIDB4MEQwNiwKKyAgICAweDBFMDYsIDB4MEYwNiwgMHgxMDA2LCAweDExMDYsIDB4MTIwNiwgMHhFRTA3LCAweEVGMDcsIDB4RjAwNywKKyAgICAweEYxMDcsIDB4RjIwNywgMHhGMzA3LCAweEY0MDcsIDB4RjUwNywgMHhGNjA3LCAweEY3MDcsIDB4RjgwNywKKyAgICAweEY5MDcsIDB4RkEwNywgMHhGQjA3LCAweEZDMDcsIDB4RkQwNywgMHhGRTA3LCAweEZGMDcsIDB4MDAwNywKKyAgICAweDAxMDcsIDB4MDIwNywgMHgwMzA3LCAweDA0MDcsIDB4MDUwNywgMHgwNjA3LCAweDA3MDcsIDB4MDgwNywKKyAgICAweDA5MDcsIDB4MEEwNywgMHgwQjA3LCAweDBDMDcsIDB4MEQwNywgMHgwRTA3LCAweDBGMDcsIDB4MTAwNywKKyAgICAweDExMDcsIDB4MTIwNywgMHhFRTA4LCAweEVGMDgsIDB4RjAwOCwgMHhGMTA4LCAweEYyMDgsIDB4RjMwOCwKKyAgICAweEY0MDgsIDB4RjUwOCwgMHhGNjA4LCAweEY3MDgsIDB4RjgwOCwgMHhGOTA4LCAweEZBMDgsIDB4RkIwOCwKKyAgICAweEZDMDgsIDB4RkQwOCwgMHhGRTA4LCAweEZGMDgsIDB4MDAwOCwgMHgwMTA4LCAweDAyMDgsIDB4MDMwOCwKKyAgICAweDA0MDgsIDB4MDUwOCwgMHgwNjA4LCAweDA3MDgsIDB4MDgwOCwgMHgwOTA4LCAweDBBMDgsIDB4MEIwOCwKKyAgICAweDBDMDgsIDB4MEQwOCwgMHgwRTA4LCAweDBGMDgsIDB4MTAwOCwgMHgxMTA4LCAweDEyMDgsIDB4RUUwOSwKKyAgICAweEVGMDksIDB4RjAwOSwgMHhGMTA5LCAweEYyMDksIDB4RjMwOSwgMHhGNDA5LCAweEY1MDksIDB4RjYwOSwKKyAgICAweEY3MDksIDB4RjgwOSwgMHhGOTA5LCAweEZBMDksIDB4RkIwOSwgMHhGQzA5LCAweEZEMDksIDB4RkUwOSwKKyAgICAweEZGMDksIDB4MDAwOSwgMHgwMTA5LCAweDAyMDksIDB4MDMwOSwgMHgwNDA5LCAweDA1MDksIDB4MDYwOSwKKyAgICAweDA3MDksIDB4MDgwOSwgMHgwOTA5LCAweDBBMDksIDB4MEIwOSwgMHgwQzA5LCAweDBEMDksIDB4MEUwOSwKKyAgICAweDBGMDksIDB4MTAwOSwgMHgxMTA5LCAweDEyMDksIDB4RUUwQSwgMHhFRjBBLCAweEYwMEEsIDB4RjEwQSwKKyAgICAweEYyMEEsIDB4RjMwQSwgMHhGNDBBLCAweEY1MEEsIDB4RjYwQSwgMHhGNzBBLCAweEY4MEEsIDB4RjkwQSwKKyAgICAweEZBMEEsIDB4RkIwQSwgMHhGQzBBLCAweEZEMEEsIDB4RkUwQSwgMHhGRjBBLCAweDAwMEEsIDB4MDEwQSwKKyAgICAweDAyMEEsIDB4MDMwQSwgMHgwNDBBLCAweDA1MEEsIDB4MDYwQSwgMHgwNzBBLCAweDA4MEEsIDB4MDkwQSwKKyAgICAweDBBMEEsIDB4MEIwQSwgMHgwQzBBLCAweDBEMEEsIDB4MEUwQSwgMHgwRjBBLCAweDEwMEEsIDB4MTEwQSwKKyAgICAweDEyMEEsIDB4RUUwQiwgMHhFRjBCLCAweEYwMEIsIDB4RjEwQiwgMHhGMjBCLCAweEYzMEIsIDB4RjQwQiwKKyAgICAweEY1MEIsIDB4RjYwQiwgMHhGNzBCLCAweEY4MEIsIDB4RjkwQiwgMHhGQTBCLCAweEZCMEIsIDB4RkMwQiwKKyAgICAweEZEMEIsIDB4RkUwQiwgMHhGRjBCLCAweDAwMEIsIDB4MDEwQiwgMHgwMjBCLCAweDAzMEIsIDB4MDQwQiwKKyAgICAweDA1MEIsIDB4MDYwQiwgMHgwNzBCLCAweDA4MEIsIDB4MDkwQiwgMHgwQTBCLCAweDBCMEIsIDB4MEMwQiwKKyAgICAweDBEMEIsIDB4MEUwQiwgMHgwRjBCLCAweDEwMEIsIDB4MTEwQiwgMHgxMjBCLCAweEVFMEMsIDB4RUYwQywKKyAgICAweEYwMEMsIDB4RjEwQywgMHhGMjBDLCAweEYzMEMsIDB4RjQwQywgMHhGNTBDLCAweEY2MEMsIDB4RjcwQywKKyAgICAweEY4MEMsIDB4RjkwQywgMHhGQTBDLCAweEZCMEMsIDB4RkMwQywgMHhGRDBDLCAweEZFMEMsIDB4RkYwQywKKyAgICAweDAwMEMsIDB4MDEwQywgMHgwMjBDLCAweDAzMEMsIDB4MDQwQywgMHgwNTBDLCAweDA2MEMsIDB4MDcwQywKKyAgICAweDA4MEMsIDB4MDkwQywgMHgwQTBDLCAweDBCMEMsIDB4MEMwQywgMHgwRDBDLCAweDBFMEMsIDB4MEYwQywKKyAgICAweDEwMEMsIDB4MTEwQywgMHgxMjBDLCAweEVFMEQsIDB4RUYwRCwgMHhGMDBELCAweEYxMEQsIDB4RjIwRCwKKyAgICAweEYzMEQsIDB4RjQwRCwgMHhGNTBELCAweEY2MEQsIDB4RjcwRCwgMHhGODBELCAweEY5MEQsIDB4RkEwRCwKKyAgICAweEZCMEQsIDB4RkMwRCwgMHhGRDBELCAweEZFMEQsIDB4RkYwRCwgMHgwMDBELCAweDAxMEQsIDB4MDIwRCwKKyAgICAweDAzMEQsIDB4MDQwRCwgMHgwNTBELCAweDA2MEQsIDB4MDcwRCwgMHgwODBELCAweDA5MEQsIDB4MEEwRCwKKyAgICAweDBCMEQsIDB4MEMwRCwgMHgwRDBELCAweDBFMEQsIDB4MEYwRCwgMHgxMDBELCAweDExMEQsIDB4MTIwRCwKKyAgICAweEVFMEUsIDB4RUYwRSwgMHhGMDBFLCAweEYxMEUsIDB4RjIwRSwgMHhGMzBFLCAweEY0MEUsIDB4RjUwRSwKKyAgICAweEY2MEUsIDB4RjcwRSwgMHhGODBFLCAweEY5MEUsIDB4RkEwRSwgMHhGQjBFLCAweEZDMEUsIDB4RkQwRSwKKyAgICAweEZFMEUsIDB4RkYwRSwgMHgwMDBFLCAweDAxMEUsIDB4MDIwRSwgMHgwMzBFLCAweDA0MEUsIDB4MDUwRSwKKyAgICAweDA2MEUsIDB4MDcwRSwgMHgwODBFLCAweDA5MEUsIDB4MEEwRSwgMHgwQjBFLCAweDBDMEUsIDB4MEQwRSwKKyAgICAweDBFMEUsIDB4MEYwRSwgMHgxMDBFLCAweDExMEUsIDB4MTIwRSwgMHhFRTBGLCAweEVGMEYsIDB4RjAwRiwKKyAgICAweEYxMEYsIDB4RjIwRiwgMHhGMzBGLCAweEY0MEYsIDB4RjUwRiwgMHhGNjBGLCAweEY3MEYsIDB4RjgwRiwKKyAgICAweEY5MEYsIDB4RkEwRiwgMHhGQjBGLCAweEZDMEYsIDB4RkQwRiwgMHhGRTBGLCAweEZGMEYsIDB4MDAwRiwKKyAgICAweDAxMEYsIDB4MDIwRiwgMHgwMzBGLCAweDA0MEYsIDB4MDUwRiwgMHgwNjBGLCAweDA3MEYsIDB4MDgwRiwKKyAgICAweDA5MEYsIDB4MEEwRiwgMHgwQjBGLCAweDBDMEYsIDB4MEQwRiwgMHgwRTBGLCAweDBGMEYsIDB4MTAwRiwKKyAgICAweDExMEYsIDB4MTIwRiwgMHhFRTEwLCAweEVGMTAsIDB4RjAxMCwgMHhGMTEwLCAweEYyMTAsIDB4RjMxMCwKKyAgICAweEY0MTAsIDB4RjUxMCwgMHhGNjEwLCAweEY3MTAsIDB4RjgxMCwgMHhGOTEwLCAweEZBMTAsIDB4RkIxMCwKKyAgICAweEZDMTAsIDB4RkQxMCwgMHhGRTEwLCAweEZGMTAsIDB4MDAxMCwgMHgwMTEwLCAweDAyMTAsIDB4MDMxMCwKKyAgICAweDA0MTAsIDB4MDUxMCwgMHgwNjEwLCAweDA3MTAsIDB4MDgxMCwgMHgwOTEwLCAweDBBMTAsIDB4MEIxMCwKKyAgICAweDBDMTAsIDB4MEQxMCwgMHgwRTEwLCAweDBGMTAsIDB4MTAxMCwgMHgxMTEwLCAweDEyMTAsIDB4RUUxMSwKKyAgICAweEVGMTEsIDB4RjAxMSwgMHhGMTExLCAweEYyMTEsIDB4RjMxMSwgMHhGNDExLCAweEY1MTEsIDB4RjYxMSwKKyAgICAweEY3MTEsIDB4RjgxMSwgMHhGOTExLCAweEZBMTEsIDB4RkIxMSwgMHhGQzExLCAweEZEMTEsIDB4RkUxMSwKKyAgICAweEZGMTEsIDB4MDAxMSwgMHgwMTExLCAweDAyMTEsIDB4MDMxMSwgMHgwNDExLCAweDA1MTEsIDB4MDYxMSwKKyAgICAweDA3MTEsIDB4MDgxMSwgMHgwOTExLCAweDBBMTEsIDB4MEIxMSwgMHgwQzExLCAweDBEMTEsIDB4MEUxMSwKKyAgICAweDBGMTEsIDB4MTAxMSwgMHgxMTExLCAweDEyMTEsIDB4RUUxMiwgMHhFRjEyLCAweEYwMTIsIDB4RjExMiwKKyAgICAweEYyMTIsIDB4RjMxMiwgMHhGNDEyLCAweEY1MTIsIDB4RjYxMiwgMHhGNzEyLCAweEY4MTIsIDB4RjkxMiwKKyAgICAweEZBMTIsIDB4RkIxMiwgMHhGQzEyLCAweEZEMTIsIDB4RkUxMiwgMHhGRjEyLCAweDAwMTIsIDB4MDExMiwKKyAgICAweDAyMTIsIDB4MDMxMiwgMHgwNDEyLCAweDA1MTIsIDB4MDYxMiwgMHgwNzEyLCAweDA4MTIsIDB4MDkxMiwKKyAgICAweDBBMTIsIDB4MEIxMiwgMHgwQzEyLCAweDBEMTIsIDB4MEUxMiwgMHgwRjEyLCAweDEwMTIsIDB4MTExMiwKKyAgICAweDEyMTIsIDB4MTMxMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNsdl9tdnVfMV9iaXRzW10gPSB7CisgICAgMTYsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTIsIDEwLCAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNiwgMTUsCisgICAgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgIDcsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE1LCAxNiwgMTYsCisgICAgMTYsIDEzLCAxMiwgMTAsIDEwLCAgNiwgMTAsIDEwLCAxMiwgMTMsIDE2LCAxNiwgMTYsIDE0LCAxNCwgMTEsCisgICAgMTEsIDExLCAxMSwgIDksICA3LCAgOSwgMTEsIDExLCAxMSwgMTEsIDE0LCAxNCwgMTUsIDEzLCAxMywgMTIsCisgICAgIDksICA4LCAgOCwgIDQsICA4LCAgOCwgIDksIDEyLCAxMywgMTMsIDE1LCAxNCwgMTQsIDExLCAxMSwgMTAsCisgICAgIDksICA4LCAgNCwgIDgsICA5LCAxMCwgMTEsIDEyLCAxNCwgMTQsIDEyLCAxMiwgMTEsIDEwLCAxMCwgIDgsCisgICAgIDYsICAzLCAgNiwgIDgsIDEwLCAxMCwgMTEsIDEyLCAxMiwgMTEsIDEwLCAgOSwgIDYsICA2LCAgNiwgIDUsCisgICAgIDQsICA1LCAgNiwgIDYsICA2LCAgOSwgMTAsIDExLCAxMiwgMTIsIDExLCAxMCwgMTAsICA4LCAgNiwgIDMsCisgICAgIDYsICA3LCAxMCwgMTAsIDExLCAxMiwgMTIsIDE0LCAxNCwgMTEsIDExLCAxMCwgIDksICA4LCAgNCwgIDgsCisgICAgIDksIDEwLCAxMSwgMTEsIDE0LCAxNCwgMTUsIDEzLCAxMywgMTIsICA5LCAgOCwgIDgsICA0LCAgOCwgIDgsCisgICAgIDksIDEyLCAxMywgMTMsIDE1LCAxNCwgMTQsIDExLCAxMSwgMTEsIDExLCAgOSwgIDcsICA5LCAxMSwgMTEsCisgICAgMTEsIDExLCAxNCwgMTQsIDE2LCAxNiwgMTYsIDEzLCAxMiwgMTAsIDEwLCAgNiwgMTAsIDEwLCAxMiwgMTMsCisgICAgMTYsIDE2LCAxNiwgMTUsIDEzLCAxMywgMTIsIDEyLCAxMSwgMTEsICA3LCAxMSwgMTEsIDEyLCAxMiwgMTMsCisgICAgMTMsIDE1LCAxNiwgMTQsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTAsIDEyLCAxMiwgMTMsIDE0LCAxNCwgMTQsCisgICAgMTYsICA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNsdl9tdnVfMV9jb2Rlc1tdID0geworICAgIDB4RkZGQywgMHgzRkVELCAweDNGRTUsIDB4M0ZFMywgMHgxRkQ5LCAweDBGRDksIDB4MEZENiwgMHgwM0NFLAorICAgIDB4MEZEMywgMHgwRkQ4LCAweDFGRDYsIDB4M0ZFMCwgMHgzRkU4LCAweDNGRUMsIDB4RkZGRSwgMHg3RkYzLAorICAgIDB4MUZFNywgMHgxRkRBLCAweDBGQ0YsIDB4MEZDQywgMHgwN0RELCAweDA3Q0MsIDB4MDA2QiwgMHgwN0NELAorICAgIDB4MDdERSwgMHgwRkNFLCAweDBGRDIsIDB4MUZERCwgMHgxRkVDLCAweDdGRjAsIDB4RkZGNiwgMHhGRkZBLAorICAgIDB4RkZGMiwgMHgxRkRFLCAweDBGREIsIDB4MDNEOCwgMHgwM0NBLCAweDAwMkUsIDB4MDNDQiwgMHgwM0Q5LAorICAgIDB4MEZEQywgMHgxRkRGLCAweEZGRjMsIDB4RkZGOSwgMHhGRkY1LCAweDNGRjMsIDB4M0ZERCwgMHgwN0RBLAorICAgIDB4MDdEMiwgMHgwN0NBLCAweDA3QzIsIDB4MDFERSwgMHgwMDY5LCAweDAxREYsIDB4MDdDMywgMHgwN0NCLAorICAgIDB4MDdEMywgMHgwN0RCLCAweDNGREYsIDB4M0ZGNiwgMHg3RkY3LCAweDFGRUQsIDB4MUZFNSwgMHgwRkRGLAorICAgIDB4MDFEOCwgMHgwMEUzLCAweDAwREYsIDB4MDAwNywgMHgwMEUwLCAweDAwRTQsIDB4MDFEOSwgMHgwRkUwLAorICAgIDB4MUZFMywgMHgxRkU5LCAweDdGRjQsIDB4M0ZGNSwgMHgzRkU3LCAweDA3RTQsIDB4MDdDNiwgMHgwM0QyLAorICAgIDB4MDFFMiwgMHgwMEU5LCAweDAwMDYsIDB4MDBFQSwgMHgwMUUzLCAweDAzRDMsIDB4MDdDNywgMHgwRkNBLAorICAgIDB4M0ZFOSwgMHgzRkYwLCAweDBGRTgsIDB4MEZFNSwgMHgwN0Q1LCAweDAzREQsIDB4MDNENSwgMHgwMERDLAorICAgIDB4MDAyQiwgMHgwMDAxLCAweDAwMkMsIDB4MDBERCwgMHgwM0Q2LCAweDAzREUsIDB4MDdENiwgMHgwRkU0LAorICAgIDB4MEZFOSwgMHgwN0UwLCAweDAzQzgsIDB4MDFENiwgMHgwMDMyLCAweDAwMzAsIDB4MDAyOCwgMHgwMDEyLAorICAgIDB4MDAwNCwgMHgwMDEzLCAweDAwMjksIDB4MDAzMSwgMHgwMDMzLCAweDAxRDcsIDB4MDNDOSwgMHgwN0UxLAorICAgIDB4MEZFQSwgMHgwRkU2LCAweDA3RDcsIDB4MDNERiwgMHgwM0Q3LCAweDAwREUsIDB4MDAyRCwgMHgwMDAwLAorICAgIDB4MDAyQSwgMHgwMDZELCAweDAzRDQsIDB4MDNEQywgMHgwN0Q0LCAweDBGRTMsIDB4MEZFNywgMHgzRkYxLAorICAgIDB4M0ZFNCwgMHgwN0UyLCAweDA3QzQsIDB4MDNEMCwgMHgwMUUwLCAweDAwRTcsIDB4MDAwNSwgMHgwMEU4LAorICAgIDB4MDFFMSwgMHgwM0QxLCAweDA3QzUsIDB4MDdFMywgMHgzRkVBLCAweDNGRjcsIDB4N0ZGNiwgMHgxRkU2LAorICAgIDB4MUZFNCwgMHgwRkUxLCAweDAxREEsIDB4MDBFNSwgMHgwMEUxLCAweDAwMDgsIDB4MDBFMiwgMHgwMEU2LAorICAgIDB4MDFEQiwgMHgwRkUyLCAweDFGRTIsIDB4MUZFQiwgMHg3RkY1LCAweDNGRjQsIDB4M0ZEQywgMHgwN0Q5LAorICAgIDB4MDdEMCwgMHgwN0M4LCAweDA3QzAsIDB4MDFEQywgMHgwMDY4LCAweDAxREQsIDB4MDdDMSwgMHgwN0M5LAorICAgIDB4MDdEMSwgMHgwN0Q4LCAweDNGREUsIDB4M0ZGMiwgMHhGRkZCLCAweEZGRjQsIDB4RkZGMCwgMHgxRkUxLAorICAgIDB4MEZERCwgMHgwM0RBLCAweDAzQ0MsIDB4MDAyRiwgMHgwM0NELCAweDAzREIsIDB4MEZERSwgMHgxRkUwLAorICAgIDB4RkZGMSwgMHhGRkY3LCAweEZGRjgsIDB4N0ZGMiwgMHgxRkVBLCAweDFGREMsIDB4MEZEMSwgMHgwRkNELAorICAgIDB4MDdEQywgMHgwN0NGLCAweDAwNkMsIDB4MDdDRSwgMHgwN0RGLCAweDBGQ0IsIDB4MEZEMCwgMHgxRkRCLAorICAgIDB4MUZFOCwgMHg3RkYxLCAweEZGRkQsIDB4M0ZFRSwgMHgzRkVCLCAweDNGRTEsIDB4MUZENywgMHgwRkQ3LAorICAgIDB4MEZENSwgMHgwM0NGLCAweDBGRDQsIDB4MEZEQSwgMHgxRkQ4LCAweDNGRTIsIDB4M0ZFNiwgMHgzRkVGLAorICAgIDB4RkZGRiwgMHgwMDZBLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNsdl9tdnVfMV9zeW1zW10gPSB7CisgICAgMHhGOUY5LCAweEZBRjksIDB4RkJGOSwgMHhGQ0Y5LCAweEZERjksIDB4RkVGOSwgMHhGRkY5LCAweDAwRjksCisgICAgMHgwMUY5LCAweDAyRjksIDB4MDNGOSwgMHgwNEY5LCAweDA1RjksIDB4MDZGOSwgMHgwN0Y5LCAweEY5RkEsCisgICAgMHhGQUZBLCAweEZCRkEsIDB4RkNGQSwgMHhGREZBLCAweEZFRkEsIDB4RkZGQSwgMHgwMEZBLCAweDAxRkEsCisgICAgMHgwMkZBLCAweDAzRkEsIDB4MDRGQSwgMHgwNUZBLCAweDA2RkEsIDB4MDdGQSwgMHhGOUZCLCAweEZBRkIsCisgICAgMHhGQkZCLCAweEZDRkIsIDB4RkRGQiwgMHhGRUZCLCAweEZGRkIsIDB4MDBGQiwgMHgwMUZCLCAweDAyRkIsCisgICAgMHgwM0ZCLCAweDA0RkIsIDB4MDVGQiwgMHgwNkZCLCAweDA3RkIsIDB4RjlGQywgMHhGQUZDLCAweEZCRkMsCisgICAgMHhGQ0ZDLCAweEZERkMsIDB4RkVGQywgMHhGRkZDLCAweDAwRkMsIDB4MDFGQywgMHgwMkZDLCAweDAzRkMsCisgICAgMHgwNEZDLCAweDA1RkMsIDB4MDZGQywgMHgwN0ZDLCAweEY5RkQsIDB4RkFGRCwgMHhGQkZELCAweEZDRkQsCisgICAgMHhGREZELCAweEZFRkQsIDB4RkZGRCwgMHgwMEZELCAweDAxRkQsIDB4MDJGRCwgMHgwM0ZELCAweDA0RkQsCisgICAgMHgwNUZELCAweDA2RkQsIDB4MDdGRCwgMHhGOUZFLCAweEZBRkUsIDB4RkJGRSwgMHhGQ0ZFLCAweEZERkUsCisgICAgMHhGRUZFLCAweEZGRkUsIDB4MDBGRSwgMHgwMUZFLCAweDAyRkUsIDB4MDNGRSwgMHgwNEZFLCAweDA1RkUsCisgICAgMHgwNkZFLCAweDA3RkUsIDB4RjlGRiwgMHhGQUZGLCAweEZCRkYsIDB4RkNGRiwgMHhGREZGLCAweEZFRkYsCisgICAgMHhGRkZGLCAweDAwRkYsIDB4MDFGRiwgMHgwMkZGLCAweDAzRkYsIDB4MDRGRiwgMHgwNUZGLCAweDA2RkYsCisgICAgMHgwN0ZGLCAweEY5MDAsIDB4RkEwMCwgMHhGQjAwLCAweEZDMDAsIDB4RkQwMCwgMHhGRTAwLCAweEZGMDAsCisgICAgMHgwMDAwLCAweDAxMDAsIDB4MDIwMCwgMHgwMzAwLCAweDA0MDAsIDB4MDUwMCwgMHgwNjAwLCAweDA3MDAsCisgICAgMHhGOTAxLCAweEZBMDEsIDB4RkIwMSwgMHhGQzAxLCAweEZEMDEsIDB4RkUwMSwgMHhGRjAxLCAweDAwMDEsCisgICAgMHgwMTAxLCAweDAyMDEsIDB4MDMwMSwgMHgwNDAxLCAweDA1MDEsIDB4MDYwMSwgMHgwNzAxLCAweEY5MDIsCisgICAgMHhGQTAyLCAweEZCMDIsIDB4RkMwMiwgMHhGRDAyLCAweEZFMDIsIDB4RkYwMiwgMHgwMDAyLCAweDAxMDIsCisgICAgMHgwMjAyLCAweDAzMDIsIDB4MDQwMiwgMHgwNTAyLCAweDA2MDIsIDB4MDcwMiwgMHhGOTAzLCAweEZBMDMsCisgICAgMHhGQjAzLCAweEZDMDMsIDB4RkQwMywgMHhGRTAzLCAweEZGMDMsIDB4MDAwMywgMHgwMTAzLCAweDAyMDMsCisgICAgMHgwMzAzLCAweDA0MDMsIDB4MDUwMywgMHgwNjAzLCAweDA3MDMsIDB4RjkwNCwgMHhGQTA0LCAweEZCMDQsCisgICAgMHhGQzA0LCAweEZEMDQsIDB4RkUwNCwgMHhGRjA0LCAweDAwMDQsIDB4MDEwNCwgMHgwMjA0LCAweDAzMDQsCisgICAgMHgwNDA0LCAweDA1MDQsIDB4MDYwNCwgMHgwNzA0LCAweEY5MDUsIDB4RkEwNSwgMHhGQjA1LCAweEZDMDUsCisgICAgMHhGRDA1LCAweEZFMDUsIDB4RkYwNSwgMHgwMDA1LCAweDAxMDUsIDB4MDIwNSwgMHgwMzA1LCAweDA0MDUsCisgICAgMHgwNTA1LCAweDA2MDUsIDB4MDcwNSwgMHhGOTA2LCAweEZBMDYsIDB4RkIwNiwgMHhGQzA2LCAweEZEMDYsCisgICAgMHhGRTA2LCAweEZGMDYsIDB4MDAwNiwgMHgwMTA2LCAweDAyMDYsIDB4MDMwNiwgMHgwNDA2LCAweDA1MDYsCisgICAgMHgwNjA2LCAweDA3MDYsIDB4RjkwNywgMHhGQTA3LCAweEZCMDcsIDB4RkMwNywgMHhGRDA3LCAweEZFMDcsCisgICAgMHhGRjA3LCAweDAwMDcsIDB4MDEwNywgMHgwMjA3LCAweDAzMDcsIDB4MDQwNywgMHgwNTA3LCAweDA2MDcsCisgICAgMHgwNzA3LCAweDA4MDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfbXZ1XzJfYml0c1tdID0geworICAgIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLAorICAgIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LAorICAgIDE1LCAxNSwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDE0LCAxNSwgMTUsIDE2LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTAsIDExLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMSwgMTAsICA5LCAxMCwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE0LAorICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAxMCwgIDgsIDEwLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxNCwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsICA5LCAgNywgIDksIDEwLAorICAgIDExLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsIDEwLAorICAgICA5LCAgOCwgIDcsICA4LCAgOSwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTMsIDEzLAorICAgIDEyLCAxMSwgIDksICA5LCAgOCwgIDcsICA2LCAgNSwgIDYsICA3LCAgOCwgIDksICA5LCAxMSwgMTIsIDEzLAorICAgIDEzLCAxNCwgMTQsIDEzLCAxMywgMTMsIDExLCAxMSwgMTAsICA4LCAgNywgIDQsICAxLCAgNCwgIDcsICA4LAorICAgIDEwLCAxMSwgMTEsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTEsICA5LCAgOSwgIDgsICA3LAorICAgICA2LCAgNSwgIDYsICA3LCAgOCwgIDksICA5LCAxMSwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTMsIDEyLAorICAgIDExLCAxMSwgMTEsICA5LCAgOSwgIDgsICA3LCAgOCwgIDksIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsIDEwLCAgOSwgIDcsICA5LCAxMCwgMTEsIDExLAorICAgIDEyLCAxMiwgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEwLAorICAgICA5LCAxMCwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEyLAorICAgIDEyLCAxMiwgMTIsIDExLCAxMCwgIDgsIDEwLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAxMCwgMTEsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTYsIDE1LCAxNSwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLAorICAgIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNSwgMTUsIDE2LCAxNiwgMTUsIDE1LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LAorICAgIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsICA2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNsdl9tdnVfMl9jb2Rlc1tdID0geworICAgIDB4RkZGMiwgMHhGRkVGLCAweEZGRUEsIDB4N0ZFQywgMHg3RkQ1LCAweDdGQzUsIDB4N0ZDRiwgMHgzRkQzLAorICAgIDB4M0ZDOSwgMHgzRkI0LCAweDNGNzIsIDB4M0ZBRSwgMHgzRkRDLCAweDNGRTEsIDB4N0ZDNCwgMHg3RkM4LAorICAgIDB4N0ZENywgMHg3RkYwLCAweEZGRTksIDB4RkZFQywgMHhGRkY4LCAweEZGRjQsIDB4N0ZGMywgMHg3RkRFLAorICAgIDB4N0ZEMywgMHgzRkMwLCAweDNGOTksIDB4M0ZBOCwgMHgzRkFDLCAweDNGOEUsIDB4MUZBOCwgMHgxRjc5LAorICAgIDB4MUZBMiwgMHgzRjg5LCAweDNGOTMsIDB4M0Y5NSwgMHgzRjlDLCAweDNGQjgsIDB4N0ZEMiwgMHg3RkU2LAorICAgIDB4N0ZEQSwgMHhGRkY3LCAweEZGRkUsIDB4N0ZFRCwgMHg3RkUyLCAweDNGRDUsIDB4M0ZENywgMHgzRkIzLAorICAgIDB4M0ZBMiwgMHgzRjgwLCAweDNGN0EsIDB4MUY4OCwgMHgxRjcwLCAweDFGOEEsIDB4M0Y4MywgMHgzRjg0LAorICAgIDB4M0ZBQSwgMHgzRkM0LCAweDNGREEsIDB4M0ZERiwgMHg3RkRCLCAweDdGRTMsIDB4RkZGMSwgMHhGRkZCLAorICAgIDB4N0ZFMSwgMHg3RkM3LCAweDNGQjAsIDB4MUZBQSwgMHgxRkFCLCAweDFGQTMsIDB4MUY4RSwgMHgxRjgxLAorICAgIDB4MEZBNywgMHgwRjdGLCAweDBGQTgsIDB4MUY4MiwgMHgxRjhGLCAweDFGQTQsIDB4MUZBQywgMHgxRkFELAorICAgIDB4M0ZCNSwgMHg3RkM2LCAweDdGREQsIDB4RkZGMywgMHgzRkRELCAweDNGQkUsIDB4M0ZCOSwgMHgzRjdDLAorICAgIDB4MUY3NywgMHgwRkI1LCAweDBGOUQsIDB4MEY5OSwgMHgwRjkwLCAweDA3OTQsIDB4MDNCRSwgMHgwNzk1LAorICAgIDB4MEY5MiwgMHgwRjlBLCAweDBGOUUsIDB4MEZCNiwgMHgxRjc4LCAweDNGNzgsIDB4M0ZCMiwgMHgzRkJGLAorICAgIDB4M0ZEMiwgMHgzRkE3LCAweDNGOEMsIDB4M0Y3NSwgMHgxRjlFLCAweDBGOTMsIDB4MEY5NCwgMHgwRjdCLAorICAgIDB4MEY3MywgMHgwN0I0LCAweDAzQkIsIDB4MDFEOSwgMHgwM0JDLCAweDA3QjUsIDB4MEY3NCwgMHgwRjdDLAorICAgIDB4MEY5NSwgMHgwRjk2LCAweDFGQTAsIDB4M0Y3NiwgMHgzRjhGLCAweDNGQTUsIDB4N0ZFNSwgMHgzRkM3LAorICAgIDB4MUY5NSwgMHgxRjcxLCAweDBGQUIsIDB4MEZBQywgMHgwRjlGLCAweDBGN0QsIDB4MDc5NiwgMHgwM0JGLAorICAgIDB4MDBERSwgMHgwM0MwLCAweDA3OTcsIDB4MEY3RSwgMHgwRkEwLCAweDBGQUQsIDB4MEZBRSwgMHgxRjcyLAorICAgIDB4MUY5NywgMHgzRkQxLCAweDdGRDgsIDB4M0ZBOSwgMHgzRkEwLCAweDNGNkQsIDB4MUY5OSwgMHgwRjg3LAorICAgIDB4MEY3NywgMHgwN0E4LCAweDA3OUMsIDB4MDNDNSwgMHgwMUNBLCAweDAwNjcsIDB4MDFDQiwgMHgwM0M2LAorICAgIDB4MDc5RCwgMHgwN0E5LCAweDBGNzgsIDB4MEY4QSwgMHgxRjlGLCAweDNGNkUsIDB4M0Y5OCwgMHgzRjlBLAorICAgIDB4M0ZDQSwgMHgzRjcwLCAweDFGQUYsIDB4MEY4RCwgMHgwRjZGLCAweDA3QUMsIDB4MDdBMCwgMHgwM0I3LAorICAgIDB4MDFDRSwgMHgwMERBLCAweDAwNjMsIDB4MDBEQiwgMHgwMUNGLCAweDAzQjgsIDB4MDdBMSwgMHgwN0FELAorICAgIDB4MEY3MCwgMHgwRjkxLCAweDFGQjIsIDB4M0Y3MywgMHgzRkQ2LCAweDNGN0QsIDB4MUY5MSwgMHgxRjg1LAorICAgIDB4MEZBMywgMHgwN0EyLCAweDAxRDQsIDB4MDFEMCwgMHgwMEUwLCAweDAwNjgsIDB4MDAyQywgMHgwMDE0LAorICAgIDB4MDAyRCwgMHgwMDY5LCAweDAwRTEsIDB4MDFEMSwgMHgwMUQ1LCAweDA3QTMsIDB4MEZBNCwgMHgxRjg5LAorICAgIDB4MUY5MiwgMHgzRjgxLCAweDNGQTYsIDB4MUY3QiwgMHgxRjdDLCAweDFGN0QsIDB4MDdCMCwgMHgwN0FFLAorICAgIDB4MDNDNywgMHgwMERDLCAweDAwNjQsIDB4MDAwOCwgMHgwMDAwLCAweDAwMDksIDB4MDA2NSwgMHgwMERELAorICAgIDB4MDNDOCwgMHgwN0FGLCAweDA3QjEsIDB4MUY3RSwgMHgxRjdGLCAweDFGODAsIDB4M0Y5RSwgMHgzRjg1LAorICAgIDB4MUY5MywgMHgxRjhCLCAweDBGQTUsIDB4MDdBNCwgMHgwMUQ2LCAweDAxRDIsIDB4MDBFMiwgMHgwMDZBLAorICAgIDB4MDAyRSwgMHgwMDE1LCAweDAwMkYsIDB4MDA2QiwgMHgwMEUzLCAweDAxRDMsIDB4MDFENywgMHgwN0E1LAorICAgIDB4MEZBNiwgMHgxRjhDLCAweDFGOTQsIDB4M0Y4NywgMHgzRkNFLCAweDNGNzcsIDB4MUZCNCwgMHgwRjgzLAorICAgIDB4MDdCNiwgMHgwN0FBLCAweDA3OUUsIDB4MDFEQSwgMHgwMUNDLCAweDAwRDgsIDB4MDA2MiwgMHgwMEQ5LAorICAgIDB4MDFDRCwgMHgwM0I2LCAweDA3OUYsIDB4MDdBQiwgMHgwRjZFLCAweDBGODQsIDB4MUZBOSwgMHgzRjZBLAorICAgIDB4M0ZDRCwgMHgzRjkwLCAweDNGOTIsIDB4M0Y2QiwgMHgxRjk2LCAweDBGODUsIDB4MEY3NSwgMHgwN0E2LAorICAgIDB4MDc5QSwgMHgwM0MzLCAweDAxQzgsIDB4MDA2NiwgMHgwMUM5LCAweDAzQzQsIDB4MDc5QiwgMHgwN0E3LAorICAgIDB4MEY3NiwgMHgwRjg2LCAweDFGOUQsIDB4M0Y2QywgMHgzRjk2LCAweDNGOTcsIDB4N0ZFOSwgMHgzRkQ4LAorICAgIDB4MUY5OCwgMHgxRjczLCAweDBGQUYsIDB4MEZCMCwgMHgwRkExLCAweDBGODAsIDB4MDc5OCwgMHgwM0MxLAorICAgIDB4MDFEOCwgMHgwM0MyLCAweDA3OTksIDB4MEY4MSwgMHgwRkEyLCAweDBGQjEsIDB4MEZCMiwgMHgxRjc0LAorICAgIDB4MUY5QSwgMHgzRkUwLCAweDdGRUUsIDB4M0Y5NCwgMHgzRjhCLCAweDNGNkYsIDB4MUY5QiwgMHgwRjg4LAorICAgIDB4MEY4OSwgMHgwRjc5LCAweDBGNzEsIDB4MDdCMiwgMHgwM0I5LCAweDAwREYsIDB4MDNCQSwgMHgwN0IzLAorICAgIDB4MEY3MiwgMHgwRjdBLCAweDBGOEIsIDB4MEY4QywgMHgxRjlDLCAweDNGNzEsIDB4M0Y4QSwgMHgzRjlCLAorICAgIDB4M0ZDOCwgMHgzRkJELCAweDNGQzUsIDB4M0Y3OSwgMHgxRjc1LCAweDBGQjMsIDB4MEY5QywgMHgwRjk3LAorICAgIDB4MEY4RSwgMHgwNzkyLCAweDAzQkQsIDB4MDc5MywgMHgwRjhGLCAweDBGOTgsIDB4MEY5QiwgMHgwRkI0LAorICAgIDB4MUY3NiwgMHgzRjgyLCAweDNGQzMsIDB4M0ZCQSwgMHgzRkM2LCAweEZGRkQsIDB4N0ZERiwgMHg3RkNDLAorICAgIDB4M0ZCQiwgMHgxRkIwLCAweDFGQUUsIDB4MUZBMSwgMHgxRjkwLCAweDFGODMsIDB4MEZBQSwgMHgwRjgyLAorICAgIDB4MEZBOSwgMHgxRjg0LCAweDFGOEQsIDB4MUZBNSwgMHgxRkIxLCAweDFGQjMsIDB4M0ZDMiwgMHg3RkNBLAorICAgIDB4N0ZFOCwgMHhGRkY1LCAweEZGRkYsIDB4N0ZEQywgMHg3RkQ5LCAweDNGQ0MsIDB4M0ZEOSwgMHgzRkI3LAorICAgIDB4M0Y5RiwgMHgzRjdFLCAweDNGODYsIDB4MUY4NiwgMHgwRkI3LCAweDFGODcsIDB4M0Y3QiwgMHgzRjdGLAorICAgIDB4M0ZBMSwgMHgzRkJDLCAweDNGQ0IsIDB4M0ZENCwgMHg3RkYxLCAweDdGRjIsIDB4RkZGQSwgMHhGRkZDLAorICAgIDB4N0ZFNCwgMHg3RkU3LCAweDdGRDQsIDB4M0ZBRiwgMHgzRkEzLCAweDNGOTEsIDB4M0Y5RCwgMHgzRjg4LAorICAgIDB4MUZBNiwgMHgxRjdBLCAweDFGQTcsIDB4M0Y4RCwgMHgzRkFCLCAweDNGQUQsIDB4M0ZBNCwgMHgzRkI2LAorICAgIDB4N0ZEMCwgMHg3RkUwLCAweDdGRUIsIDB4RkZGMCwgMHhGRkY5LCAweEZGRUIsIDB4RkZFRCwgMHg3RkVBLAorICAgIDB4N0ZENiwgMHg3RkM5LCAweDdGQ0IsIDB4M0ZEMCwgMHgzRkRFLCAweDNGQjEsIDB4M0Y3NCwgMHgzRkMxLAorICAgIDB4M0ZDRiwgMHgzRkRCLCAweDdGQ0QsIDB4N0ZDRSwgMHg3RkQxLCAweDdGRUYsIDB4RkZFOCwgMHhGRkVFLAorICAgIDB4RkZGNiwgMHgwMDMwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNsdl9tdnVfMl9zeW1zW10gPSB7CisgICAgMHhGNkY2LCAweEY3RjYsIDB4RjhGNiwgMHhGOUY2LCAweEZBRjYsIDB4RkJGNiwgMHhGQ0Y2LCAweEZERjYsCisgICAgMHhGRUY2LCAweEZGRjYsIDB4MDBGNiwgMHgwMUY2LCAweDAyRjYsIDB4MDNGNiwgMHgwNEY2LCAweDA1RjYsCisgICAgMHgwNkY2LCAweDA3RjYsIDB4MDhGNiwgMHgwOUY2LCAweDBBRjYsIDB4RjZGNywgMHhGN0Y3LCAweEY4RjcsCisgICAgMHhGOUY3LCAweEZBRjcsIDB4RkJGNywgMHhGQ0Y3LCAweEZERjcsIDB4RkVGNywgMHhGRkY3LCAweDAwRjcsCisgICAgMHgwMUY3LCAweDAyRjcsIDB4MDNGNywgMHgwNEY3LCAweDA1RjcsIDB4MDZGNywgMHgwN0Y3LCAweDA4RjcsCisgICAgMHgwOUY3LCAweDBBRjcsIDB4RjZGOCwgMHhGN0Y4LCAweEY4RjgsIDB4RjlGOCwgMHhGQUY4LCAweEZCRjgsCisgICAgMHhGQ0Y4LCAweEZERjgsIDB4RkVGOCwgMHhGRkY4LCAweDAwRjgsIDB4MDFGOCwgMHgwMkY4LCAweDAzRjgsCisgICAgMHgwNEY4LCAweDA1RjgsIDB4MDZGOCwgMHgwN0Y4LCAweDA4RjgsIDB4MDlGOCwgMHgwQUY4LCAweEY2RjksCisgICAgMHhGN0Y5LCAweEY4RjksIDB4RjlGOSwgMHhGQUY5LCAweEZCRjksIDB4RkNGOSwgMHhGREY5LCAweEZFRjksCisgICAgMHhGRkY5LCAweDAwRjksIDB4MDFGOSwgMHgwMkY5LCAweDAzRjksIDB4MDRGOSwgMHgwNUY5LCAweDA2RjksCisgICAgMHgwN0Y5LCAweDA4RjksIDB4MDlGOSwgMHgwQUY5LCAweEY2RkEsIDB4RjdGQSwgMHhGOEZBLCAweEY5RkEsCisgICAgMHhGQUZBLCAweEZCRkEsIDB4RkNGQSwgMHhGREZBLCAweEZFRkEsIDB4RkZGQSwgMHgwMEZBLCAweDAxRkEsCisgICAgMHgwMkZBLCAweDAzRkEsIDB4MDRGQSwgMHgwNUZBLCAweDA2RkEsIDB4MDdGQSwgMHgwOEZBLCAweDA5RkEsCisgICAgMHgwQUZBLCAweEY2RkIsIDB4RjdGQiwgMHhGOEZCLCAweEY5RkIsIDB4RkFGQiwgMHhGQkZCLCAweEZDRkIsCisgICAgMHhGREZCLCAweEZFRkIsIDB4RkZGQiwgMHgwMEZCLCAweDAxRkIsIDB4MDJGQiwgMHgwM0ZCLCAweDA0RkIsCisgICAgMHgwNUZCLCAweDA2RkIsIDB4MDdGQiwgMHgwOEZCLCAweDA5RkIsIDB4MEFGQiwgMHhGNkZDLCAweEY3RkMsCisgICAgMHhGOEZDLCAweEY5RkMsIDB4RkFGQywgMHhGQkZDLCAweEZDRkMsIDB4RkRGQywgMHhGRUZDLCAweEZGRkMsCisgICAgMHgwMEZDLCAweDAxRkMsIDB4MDJGQywgMHgwM0ZDLCAweDA0RkMsIDB4MDVGQywgMHgwNkZDLCAweDA3RkMsCisgICAgMHgwOEZDLCAweDA5RkMsIDB4MEFGQywgMHhGNkZELCAweEY3RkQsIDB4RjhGRCwgMHhGOUZELCAweEZBRkQsCisgICAgMHhGQkZELCAweEZDRkQsIDB4RkRGRCwgMHhGRUZELCAweEZGRkQsIDB4MDBGRCwgMHgwMUZELCAweDAyRkQsCisgICAgMHgwM0ZELCAweDA0RkQsIDB4MDVGRCwgMHgwNkZELCAweDA3RkQsIDB4MDhGRCwgMHgwOUZELCAweDBBRkQsCisgICAgMHhGNkZFLCAweEY3RkUsIDB4RjhGRSwgMHhGOUZFLCAweEZBRkUsIDB4RkJGRSwgMHhGQ0ZFLCAweEZERkUsCisgICAgMHhGRUZFLCAweEZGRkUsIDB4MDBGRSwgMHgwMUZFLCAweDAyRkUsIDB4MDNGRSwgMHgwNEZFLCAweDA1RkUsCisgICAgMHgwNkZFLCAweDA3RkUsIDB4MDhGRSwgMHgwOUZFLCAweDBBRkUsIDB4RjZGRiwgMHhGN0ZGLCAweEY4RkYsCisgICAgMHhGOUZGLCAweEZBRkYsIDB4RkJGRiwgMHhGQ0ZGLCAweEZERkYsIDB4RkVGRiwgMHhGRkZGLCAweDAwRkYsCisgICAgMHgwMUZGLCAweDAyRkYsIDB4MDNGRiwgMHgwNEZGLCAweDA1RkYsIDB4MDZGRiwgMHgwN0ZGLCAweDA4RkYsCisgICAgMHgwOUZGLCAweDBBRkYsIDB4RjYwMCwgMHhGNzAwLCAweEY4MDAsIDB4RjkwMCwgMHhGQTAwLCAweEZCMDAsCisgICAgMHhGQzAwLCAweEZEMDAsIDB4RkUwMCwgMHhGRjAwLCAweDAwMDAsIDB4MDEwMCwgMHgwMjAwLCAweDAzMDAsCisgICAgMHgwNDAwLCAweDA1MDAsIDB4MDYwMCwgMHgwNzAwLCAweDA4MDAsIDB4MDkwMCwgMHgwQTAwLCAweEY2MDEsCisgICAgMHhGNzAxLCAweEY4MDEsIDB4RjkwMSwgMHhGQTAxLCAweEZCMDEsIDB4RkMwMSwgMHhGRDAxLCAweEZFMDEsCisgICAgMHhGRjAxLCAweDAwMDEsIDB4MDEwMSwgMHgwMjAxLCAweDAzMDEsIDB4MDQwMSwgMHgwNTAxLCAweDA2MDEsCisgICAgMHgwNzAxLCAweDA4MDEsIDB4MDkwMSwgMHgwQTAxLCAweEY2MDIsIDB4RjcwMiwgMHhGODAyLCAweEY5MDIsCisgICAgMHhGQTAyLCAweEZCMDIsIDB4RkMwMiwgMHhGRDAyLCAweEZFMDIsIDB4RkYwMiwgMHgwMDAyLCAweDAxMDIsCisgICAgMHgwMjAyLCAweDAzMDIsIDB4MDQwMiwgMHgwNTAyLCAweDA2MDIsIDB4MDcwMiwgMHgwODAyLCAweDA5MDIsCisgICAgMHgwQTAyLCAweEY2MDMsIDB4RjcwMywgMHhGODAzLCAweEY5MDMsIDB4RkEwMywgMHhGQjAzLCAweEZDMDMsCisgICAgMHhGRDAzLCAweEZFMDMsIDB4RkYwMywgMHgwMDAzLCAweDAxMDMsIDB4MDIwMywgMHgwMzAzLCAweDA0MDMsCisgICAgMHgwNTAzLCAweDA2MDMsIDB4MDcwMywgMHgwODAzLCAweDA5MDMsIDB4MEEwMywgMHhGNjA0LCAweEY3MDQsCisgICAgMHhGODA0LCAweEY5MDQsIDB4RkEwNCwgMHhGQjA0LCAweEZDMDQsIDB4RkQwNCwgMHhGRTA0LCAweEZGMDQsCisgICAgMHgwMDA0LCAweDAxMDQsIDB4MDIwNCwgMHgwMzA0LCAweDA0MDQsIDB4MDUwNCwgMHgwNjA0LCAweDA3MDQsCisgICAgMHgwODA0LCAweDA5MDQsIDB4MEEwNCwgMHhGNjA1LCAweEY3MDUsIDB4RjgwNSwgMHhGOTA1LCAweEZBMDUsCisgICAgMHhGQjA1LCAweEZDMDUsIDB4RkQwNSwgMHhGRTA1LCAweEZGMDUsIDB4MDAwNSwgMHgwMTA1LCAweDAyMDUsCisgICAgMHgwMzA1LCAweDA0MDUsIDB4MDUwNSwgMHgwNjA1LCAweDA3MDUsIDB4MDgwNSwgMHgwOTA1LCAweDBBMDUsCisgICAgMHhGNjA2LCAweEY3MDYsIDB4RjgwNiwgMHhGOTA2LCAweEZBMDYsIDB4RkIwNiwgMHhGQzA2LCAweEZEMDYsCisgICAgMHhGRTA2LCAweEZGMDYsIDB4MDAwNiwgMHgwMTA2LCAweDAyMDYsIDB4MDMwNiwgMHgwNDA2LCAweDA1MDYsCisgICAgMHgwNjA2LCAweDA3MDYsIDB4MDgwNiwgMHgwOTA2LCAweDBBMDYsIDB4RjYwNywgMHhGNzA3LCAweEY4MDcsCisgICAgMHhGOTA3LCAweEZBMDcsIDB4RkIwNywgMHhGQzA3LCAweEZEMDcsIDB4RkUwNywgMHhGRjA3LCAweDAwMDcsCisgICAgMHgwMTA3LCAweDAyMDcsIDB4MDMwNywgMHgwNDA3LCAweDA1MDcsIDB4MDYwNywgMHgwNzA3LCAweDA4MDcsCisgICAgMHgwOTA3LCAweDBBMDcsIDB4RjYwOCwgMHhGNzA4LCAweEY4MDgsIDB4RjkwOCwgMHhGQTA4LCAweEZCMDgsCisgICAgMHhGQzA4LCAweEZEMDgsIDB4RkUwOCwgMHhGRjA4LCAweDAwMDgsIDB4MDEwOCwgMHgwMjA4LCAweDAzMDgsCisgICAgMHgwNDA4LCAweDA1MDgsIDB4MDYwOCwgMHgwNzA4LCAweDA4MDgsIDB4MDkwOCwgMHgwQTA4LCAweEY2MDksCisgICAgMHhGNzA5LCAweEY4MDksIDB4RjkwOSwgMHhGQTA5LCAweEZCMDksIDB4RkMwOSwgMHhGRDA5LCAweEZFMDksCisgICAgMHhGRjA5LCAweDAwMDksIDB4MDEwOSwgMHgwMjA5LCAweDAzMDksIDB4MDQwOSwgMHgwNTA5LCAweDA2MDksCisgICAgMHgwNzA5LCAweDA4MDksIDB4MDkwOSwgMHgwQTA5LCAweEY2MEEsIDB4RjcwQSwgMHhGODBBLCAweEY5MEEsCisgICAgMHhGQTBBLCAweEZCMEEsIDB4RkMwQSwgMHhGRDBBLCAweEZFMEEsIDB4RkYwQSwgMHgwMDBBLCAweDAxMEEsCisgICAgMHgwMjBBLCAweDAzMEEsIDB4MDQwQSwgMHgwNTBBLCAweDA2MEEsIDB4MDcwQSwgMHgwODBBLCAweDA5MEEsCisgICAgMHgwQTBBLCAweDBCMEIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfbXZ2XzFfYml0c1tdID0geworICAgIDE2LCAxNSwgMTMsIDEzLCAxMywgMTIsIDEwLCAxMCwgMTAsIDEyLCAxMywgMTMsIDEzLCAxNSwgMTYsIDE2LAorICAgIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTUsIDE0LAorICAgIDEzLCAxMywgMTEsIDEwLCAxMCwgIDUsIDEwLCAxMCwgMTEsIDEzLCAxMywgMTQsIDE1LCAxMiwgMTIsIDEyLAorICAgIDExLCAxMCwgMTAsICA5LCAgNSwgIDksIDEwLCAxMCwgMTEsIDEyLCAxMiwgMTIsIDE0LCAxMiwgMTIsIDEyLAorICAgIDExLCAgOSwgIDgsICA1LCAgOCwgIDksIDExLCAxMiwgMTIsIDEyLCAxNCwgMTQsIDExLCAxMSwgIDksICA5LAorICAgICA5LCAgNywgIDUsICA3LCAgOSwgIDksICA5LCAxMSwgMTEsIDE0LCAxMywgMTIsIDExLCAxMCwgMTAsICA4LAorICAgICA2LCAgMywgIDYsICA4LCAxMCwgMTAsIDExLCAxMiwgMTMsIDExLCAxMCwgIDksICA3LCAgNiwgIDYsICA0LAorICAgICA0LCAgNCwgIDYsICA3LCAgNywgMTAsIDEwLCAxMSwgMTMsIDEyLCAxMSwgMTAsIDEwLCAgOCwgIDYsICAzLAorICAgICA2LCAgOCwgMTAsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTEsIDExLCAgOSwgIDksICA5LCAgNywgIDUsICA3LAorICAgICA5LCAgOSwgIDksIDExLCAxMSwgMTQsIDE0LCAxMiwgMTIsIDEyLCAxMSwgIDksICA4LCAgNSwgIDgsICA5LAorICAgIDExLCAxMiwgMTIsIDEyLCAxNCwgMTIsIDEyLCAxMiwgMTEsIDEwLCAxMCwgIDksICA1LCAgOSwgMTAsIDEwLAorICAgIDExLCAxMiwgMTIsIDEyLCAxNSwgMTQsIDEzLCAxMywgMTEsIDEwLCAxMCwgIDUsIDEwLCAxMCwgMTEsIDEzLAorICAgIDEzLCAxNCwgMTUsIDE2LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LAorICAgIDE1LCAxNiwgMTYsIDE1LCAxMywgMTMsIDEzLCAxMiwgMTAsIDEwLCAxMCwgMTIsIDEzLCAxMywgMTMsIDE1LAorICAgIDE2LCAgNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfbXZ2XzFfY29kZXNbXSA9IHsKKyAgICAweEZGRkQsIDB4N0ZGOCwgMHgxRkYyLCAweDFGREMsIDB4MUZEQiwgMHgwRkQyLCAweDAzRDYsIDB4MDNCRiwKKyAgICAweDAzRDMsIDB4MEZEMCwgMHgxRkRBLCAweDFGREUsIDB4MUZGMCwgMHg3RkY5LCAweEZGRkUsIDB4RkZGQSwKKyAgICAweDdGRkIsIDB4M0ZGMywgMHgxRkU5LCAweDBGRDYsIDB4MDdDQiwgMHgwM0UxLCAweDAxQzgsIDB4MDNFMiwKKyAgICAweDA3Q0MsIDB4MEZEOSwgMHgxRkU4LCAweDNGRjYsIDB4N0ZGQSwgMHhGRkY5LCAweDdGRjEsIDB4M0ZFRSwKKyAgICAweDFGRTQsIDB4MUZFMCwgMHgwN0Q0LCAweDAzREIsIDB4MDNDQiwgMHgwMDE0LCAweDAzQ0MsIDB4MDNEQywKKyAgICAweDA3RDYsIDB4MUZFMywgMHgxRkU3LCAweDNGRUMsIDB4N0ZGMywgMHgwRkVBLCAweDBGRTAsIDB4MEZERSwKKyAgICAweDA3REUsIDB4MDNDOSwgMHgwM0MzLCAweDAxREMsIDB4MDAxMywgMHgwMURELCAweDAzQzQsIDB4MDNDQSwKKyAgICAweDA3REYsIDB4MEZERiwgMHgwRkUzLCAweDBGRUIsIDB4M0ZGMSwgMHgwRkU3LCAweDBGQ0YsIDB4MEZDOCwKKyAgICAweDA3RDgsIDB4MDFEMiwgMHgwMEUwLCAweDAwMTAsIDB4MDBFMSwgMHgwMUQ0LCAweDA3RDksIDB4MEZDOSwKKyAgICAweDBGQ0MsIDB4MEZFNiwgMHgzRkY1LCAweDNGRUEsIDB4MDdFMiwgMHgwN0QyLCAweDAxRDcsIDB4MDFEMCwKKyAgICAweDAxQ0MsIDB4MDA2QSwgMHgwMDBGLCAweDAwNkIsIDB4MDFDRCwgMHgwMUQxLCAweDAxRDksIDB4MDdEMywKKyAgICAweDA3RTMsIDB4M0ZFQiwgMHgxRkVFLCAweDBGRDUsIDB4MDdDNywgMHgwM0Q4LCAweDAzRDAsIDB4MDBERCwKKyAgICAweDAwMkQsIDB4MDAwMSwgMHgwMDJFLCAweDAwREUsIDB4MDNEMSwgMHgwM0Q5LCAweDA3QzgsIDB4MEZEOCwKKyAgICAweDFGRUYsIDB4MDdDRSwgMHgwM0M1LCAweDAxREUsIDB4MDA2QywgMHgwMDMyLCAweDAwMzAsIDB4MDAwNSwKKyAgICAweDAwMDQsIDB4MDAwNiwgMHgwMDMxLCAweDAwNjYsIDB4MDA2RCwgMHgwM0JFLCAweDAzQzYsIDB4MDdDRiwKKyAgICAweDFGRUMsIDB4MEZEQSwgMHgwN0M5LCAweDAzREEsIDB4MDNEMiwgMHgwMERGLCAweDAwMkYsIDB4MDAwMCwKKyAgICAweDAwMkMsIDB4MDBEQywgMHgwM0NGLCAweDAzRDcsIDB4MDdDNiwgMHgwRkQ0LCAweDFGRUQsIDB4M0ZFOSwKKyAgICAweDA3RTAsIDB4MDdEMCwgMHgwMUQzLCAweDAxQ0UsIDB4MDFDQSwgMHgwMDY4LCAweDAwMEUsIDB4MDA2OSwKKyAgICAweDAxQ0IsIDB4MDFDRiwgMHgwMUQ1LCAweDA3RDEsIDB4MDdFMSwgMHgzRkU4LCAweDNGRjQsIDB4MEZFNCwKKyAgICAweDBGQ0QsIDB4MEZDQiwgMHgwN0RBLCAweDAxRDYsIDB4MDBFMiwgMHgwMDExLCAweDAwRTMsIDB4MDFEOCwKKyAgICAweDA3REIsIDB4MEZDQSwgMHgwRkNFLCAweDBGRTUsIDB4M0ZGNywgMHgwRkU4LCAweDBGRTEsIDB4MEZERCwKKyAgICAweDA3REQsIDB4MDNDNywgMHgwM0MxLCAweDAxREEsIDB4MDAxMiwgMHgwMURCLCAweDAzQzIsIDB4MDNDOCwKKyAgICAweDA3REMsIDB4MEZEQywgMHgwRkUyLCAweDBGRTksIDB4N0ZGMCwgMHgzRkVGLCAweDFGRTUsIDB4MUZFMSwKKyAgICAweDA3RDcsIDB4MDNERCwgMHgwM0NELCAweDAwMTUsIDB4MDNDRSwgMHgwM0RFLCAweDA3RDUsIDB4MUZFMiwKKyAgICAweDFGRTYsIDB4M0ZFRCwgMHg3RkYyLCAweEZGRjgsIDB4N0ZGNCwgMHgzRkYyLCAweDFGRUIsIDB4MEZENywKKyAgICAweDA3Q0QsIDB4MDNERiwgMHgwMUM5LCAweDAzRTAsIDB4MDdDQSwgMHgwRkRCLCAweDFGRUEsIDB4M0ZGMCwKKyAgICAweDdGRjUsIDB4RkZGQiwgMHhGRkZDLCAweDdGRjYsIDB4MUZGMywgMHgxRkRELCAweDFGRDksIDB4MEZEMSwKKyAgICAweDAzRDUsIDB4MDNDMCwgMHgwM0Q0LCAweDBGRDMsIDB4MUZEOCwgMHgxRkRGLCAweDFGRjEsIDB4N0ZGNywKKyAgICAweEZGRkYsIDB4MDA2NywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfbXZ2XzFfc3ltc1tdID0geworICAgIDB4RjlGOSwgMHhGQUY5LCAweEZCRjksIDB4RkNGOSwgMHhGREY5LCAweEZFRjksIDB4RkZGOSwgMHgwMEY5LAorICAgIDB4MDFGOSwgMHgwMkY5LCAweDAzRjksIDB4MDRGOSwgMHgwNUY5LCAweDA2RjksIDB4MDdGOSwgMHhGOUZBLAorICAgIDB4RkFGQSwgMHhGQkZBLCAweEZDRkEsIDB4RkRGQSwgMHhGRUZBLCAweEZGRkEsIDB4MDBGQSwgMHgwMUZBLAorICAgIDB4MDJGQSwgMHgwM0ZBLCAweDA0RkEsIDB4MDVGQSwgMHgwNkZBLCAweDA3RkEsIDB4RjlGQiwgMHhGQUZCLAorICAgIDB4RkJGQiwgMHhGQ0ZCLCAweEZERkIsIDB4RkVGQiwgMHhGRkZCLCAweDAwRkIsIDB4MDFGQiwgMHgwMkZCLAorICAgIDB4MDNGQiwgMHgwNEZCLCAweDA1RkIsIDB4MDZGQiwgMHgwN0ZCLCAweEY5RkMsIDB4RkFGQywgMHhGQkZDLAorICAgIDB4RkNGQywgMHhGREZDLCAweEZFRkMsIDB4RkZGQywgMHgwMEZDLCAweDAxRkMsIDB4MDJGQywgMHgwM0ZDLAorICAgIDB4MDRGQywgMHgwNUZDLCAweDA2RkMsIDB4MDdGQywgMHhGOUZELCAweEZBRkQsIDB4RkJGRCwgMHhGQ0ZELAorICAgIDB4RkRGRCwgMHhGRUZELCAweEZGRkQsIDB4MDBGRCwgMHgwMUZELCAweDAyRkQsIDB4MDNGRCwgMHgwNEZELAorICAgIDB4MDVGRCwgMHgwNkZELCAweDA3RkQsIDB4RjlGRSwgMHhGQUZFLCAweEZCRkUsIDB4RkNGRSwgMHhGREZFLAorICAgIDB4RkVGRSwgMHhGRkZFLCAweDAwRkUsIDB4MDFGRSwgMHgwMkZFLCAweDAzRkUsIDB4MDRGRSwgMHgwNUZFLAorICAgIDB4MDZGRSwgMHgwN0ZFLCAweEY5RkYsIDB4RkFGRiwgMHhGQkZGLCAweEZDRkYsIDB4RkRGRiwgMHhGRUZGLAorICAgIDB4RkZGRiwgMHgwMEZGLCAweDAxRkYsIDB4MDJGRiwgMHgwM0ZGLCAweDA0RkYsIDB4MDVGRiwgMHgwNkZGLAorICAgIDB4MDdGRiwgMHhGOTAwLCAweEZBMDAsIDB4RkIwMCwgMHhGQzAwLCAweEZEMDAsIDB4RkUwMCwgMHhGRjAwLAorICAgIDB4MDAwMCwgMHgwMTAwLCAweDAyMDAsIDB4MDMwMCwgMHgwNDAwLCAweDA1MDAsIDB4MDYwMCwgMHgwNzAwLAorICAgIDB4RjkwMSwgMHhGQTAxLCAweEZCMDEsIDB4RkMwMSwgMHhGRDAxLCAweEZFMDEsIDB4RkYwMSwgMHgwMDAxLAorICAgIDB4MDEwMSwgMHgwMjAxLCAweDAzMDEsIDB4MDQwMSwgMHgwNTAxLCAweDA2MDEsIDB4MDcwMSwgMHhGOTAyLAorICAgIDB4RkEwMiwgMHhGQjAyLCAweEZDMDIsIDB4RkQwMiwgMHhGRTAyLCAweEZGMDIsIDB4MDAwMiwgMHgwMTAyLAorICAgIDB4MDIwMiwgMHgwMzAyLCAweDA0MDIsIDB4MDUwMiwgMHgwNjAyLCAweDA3MDIsIDB4RjkwMywgMHhGQTAzLAorICAgIDB4RkIwMywgMHhGQzAzLCAweEZEMDMsIDB4RkUwMywgMHhGRjAzLCAweDAwMDMsIDB4MDEwMywgMHgwMjAzLAorICAgIDB4MDMwMywgMHgwNDAzLCAweDA1MDMsIDB4MDYwMywgMHgwNzAzLCAweEY5MDQsIDB4RkEwNCwgMHhGQjA0LAorICAgIDB4RkMwNCwgMHhGRDA0LCAweEZFMDQsIDB4RkYwNCwgMHgwMDA0LCAweDAxMDQsIDB4MDIwNCwgMHgwMzA0LAorICAgIDB4MDQwNCwgMHgwNTA0LCAweDA2MDQsIDB4MDcwNCwgMHhGOTA1LCAweEZBMDUsIDB4RkIwNSwgMHhGQzA1LAorICAgIDB4RkQwNSwgMHhGRTA1LCAweEZGMDUsIDB4MDAwNSwgMHgwMTA1LCAweDAyMDUsIDB4MDMwNSwgMHgwNDA1LAorICAgIDB4MDUwNSwgMHgwNjA1LCAweDA3MDUsIDB4RjkwNiwgMHhGQTA2LCAweEZCMDYsIDB4RkMwNiwgMHhGRDA2LAorICAgIDB4RkUwNiwgMHhGRjA2LCAweDAwMDYsIDB4MDEwNiwgMHgwMjA2LCAweDAzMDYsIDB4MDQwNiwgMHgwNTA2LAorICAgIDB4MDYwNiwgMHgwNzA2LCAweEY5MDcsIDB4RkEwNywgMHhGQjA3LCAweEZDMDcsIDB4RkQwNywgMHhGRTA3LAorICAgIDB4RkYwNywgMHgwMDA3LCAweDAxMDcsIDB4MDIwNywgMHgwMzA3LCAweDA0MDcsIDB4MDUwNywgMHgwNjA3LAorICAgIDB4MDcwNywgMHgwODA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X212dl8yX2JpdHNbXSA9IHsKKyAgICAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwKKyAgICAxMiwgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxNSwKKyAgICAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTQsIDE1LCAxNSwgMTYsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTIsIDEyLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTIsIDEyLCAxMiwgMTMsIDE0LCAxNCwgMTQsIDE2LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwKKyAgICAxMiwgMTAsIDEwLCAgNywgMTAsIDEwLCAxMiwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxMywgMTIsIDEyLCAxMiwgMTIsIDEwLCAgOSwgIDgsICA3LCAgOCwgIDksIDEwLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTAsICA5LCAgOCwgIDcsICA4LCAgOSwKKyAgICAxMCwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDExLCAxMCwKKyAgICAgOSwgIDgsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMiwgMTAsIDEwLCAgOSwgIDgsICA3LCAgNiwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTAsIDEyLCAxMywKKyAgICAxMywgMTQsIDEzLCAxMywgMTMsIDEzLCAxMSwgMTAsICA5LCAgOCwgIDcsICA1LCAgMSwgIDUsICA3LCAgOCwKKyAgICAgOSwgMTAsIDExLCAxMywgMTMsIDEzLCAxMywgMTQsIDEzLCAxMywgMTIsIDEwLCAxMCwgIDksICA4LCAgNywKKyAgICAgNiwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTAsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMiwgMTIsIDExLCAgOSwgIDksICA4LCAgNywgIDgsICA5LCAgOSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxMywgMTIsIDEyLCAxMiwgMTIsIDEwLCAgOSwgIDgsICA3LCAgOCwgIDksIDEwLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTAsICA5LCAgOCwKKyAgICAgNywgIDgsICA5LCAxMCwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMiwgMTIsIDEyLCAxMCwgMTAsICA3LCAxMCwgMTAsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsIDE0LCAxNCwKKyAgICAxNiwgMTQsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTIsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTQsIDE0LCAxNCwgMTYsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEyLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEyLCAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTMsIDEwLCAxMywKKyAgICAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAgNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfbXZ2XzJfY29kZXNbXSA9IHsKKyAgICAweEZGRkYsIDB4N0ZFNywgMHg3RkQ5LCAweDdGRTYsIDB4N0ZFNSwgMHg3RkNFLCAweDNGRDYsIDB4M0ZEMywKKyAgICAweDNGOUMsIDB4MUZCMiwgMHgwRjdBLCAweDFGQjUsIDB4M0ZBOCwgMHgzRkRELCAweDNGRTUsIDB4N0ZEMCwKKyAgICAweDdGRUEsIDB4N0ZFQywgMHg3RkVGLCAweDdGREIsIDB4RkZGMywgMHhGRkY1LCAweEZGRTIsIDB4RkZFQiwKKyAgICAweDdGRUIsIDB4N0ZFMCwgMHgzRkE3LCAweDNGODQsIDB4M0Y3OSwgMHgxRkFFLCAweDFGNzAsIDB4MEY3OCwKKyAgICAweDBGQUEsIDB4MUZBQSwgMHgzRjc2LCAweDNGN0UsIDB4M0ZBQywgMHg3RkUxLCAweDdGREQsIDB4RkZFQywKKyAgICAweEZGRUUsIDB4RkZGOCwgMHhGRkY5LCAweEZGRUEsIDB4RkZFNCwgMHgzRkUxLCAweDNGQkEsIDB4M0ZDNSwKKyAgICAweDNGQjksIDB4M0ZBMSwgMHgzRkFBLCAweDFGOEIsIDB4MUY4RCwgMHgxRjhFLCAweDNGQTYsIDB4M0ZBOSwKKyAgICAweDNGQzQsIDB4M0ZCQywgMHgzRkM2LCAweDNGREIsIDB4RkZFMywgMHhGRkUxLCAweEZGRkIsIDB4N0ZENCwKKyAgICAweDdGQ0MsIDB4M0ZDRCwgMHgzRjg4LCAweDNGN0MsIDB4MUZBMSwgMHgxRkEyLCAweDFGOTUsIDB4MUY3NywKKyAgICAweDBGOTUsIDB4MEY3OSwgMHgwRjk3LCAweDFGNzgsIDB4MUY5NiwgMHgxRkEzLCAweDFGQTQsIDB4M0Y3RiwKKyAgICAweDNGOEIsIDB4M0ZDQiwgMHg3RkNGLCAweDdGRDUsIDB4RkZGNiwgMHgzRkQ3LCAweDNGRTAsIDB4M0Y5MSwKKyAgICAweDFGN0IsIDB4MEZCNCwgMHgwRkE1LCAweDBGQTYsIDB4MDNENSwgMHgwM0NCLCAweDAzQkYsIDB4MDNDQywKKyAgICAweDAzRDYsIDB4MEZBNywgMHgwRkE4LCAweDBGQjUsIDB4MUY3RCwgMHgzRjg3LCAweDNGRDIsIDB4M0ZERiwKKyAgICAweEZGRjAsIDB4M0Y5NSwgMHgzRjhBLCAweDNGOTYsIDB4MUZCNywgMHgxRjlGLCAweDBGOUYsIDB4MEY4RiwKKyAgICAweDBGNzYsIDB4MDNEMSwgMHgwM0JDLCAweDAwNjcsIDB4MDNCRCwgMHgwM0QyLCAweDBGNzcsIDB4MEY5MCwKKyAgICAweDBGQTAsIDB4MUZBMCwgMHgxRkI5LCAweDNGOTcsIDB4M0Y5OCwgMHgzRjk5LCAweDNGQzMsIDB4M0ZBRiwKKyAgICAweDFGODEsIDB4MEZBOSwgMHgwRjkxLCAweDBGN0UsIDB4MEY2OCwgMHgwM0IyLCAweDAxQzYsIDB4MDBENCwKKyAgICAweDAwNjIsIDB4MDBENSwgMHgwMUM3LCAweDAzQjMsIDB4MEY2QSwgMHgwRjgxLCAweDBGOTMsIDB4MEZBQywKKyAgICAweDFGODMsIDB4M0ZCMywgMHgzRkI0LCAweDNGQzcsIDB4M0ZCQiwgMHgxRjg2LCAweDBGQUYsIDB4MEY5OCwKKyAgICAweDBGODQsIDB4MEY2RCwgMHgwM0I4LCAweDAxQ0MsIDB4MDBEQSwgMHgwMDY1LCAweDAwREIsIDB4MDFDRCwKKyAgICAweDAzQjksIDB4MEY2RiwgMHgwRjg2LCAweDBGOUIsIDB4MEZCMSwgMHgxRjg4LCAweDNGQjgsIDB4M0ZDOSwKKyAgICAweDNGREMsIDB4M0Y4MCwgMHgxRkIzLCAweDFGOTMsIDB4MEY4NywgMHgwRjcyLCAweDA3QjAsIDB4MDNCMCwKKyAgICAweDAxRDQsIDB4MDBFMCwgMHgwMDYxLCAweDAwRTEsIDB4MDFENSwgMHgwM0IxLCAweDA3QjEsIDB4MEY3MywKKyAgICAweDBGODgsIDB4MUY5NCwgMHgxRkI0LCAweDNGODEsIDB4M0ZENCwgMHgzRjlFLCAweDFGOTksIDB4MUY3MywKKyAgICAweDBGODksIDB4MDNDNCwgMHgwM0MwLCAweDAxQ0UsIDB4MDBEMCwgMHgwMDVDLCAweDAwMjgsIDB4MDAxMCwKKyAgICAweDAwMjksIDB4MDA1RCwgMHgwMEQxLCAweDAxQ0YsIDB4MDNDMSwgMHgwM0M1LCAweDBGOEEsIDB4MUY3NCwKKyAgICAweDFGOUEsIDB4M0ZBNCwgMHgxRkFDLCAweDFGOEMsIDB4MUY3RSwgMHgxRjcxLCAweDA3QjIsIDB4MDNDRiwKKyAgICAweDAxQzQsIDB4MDBEQywgMHgwMDVBLCAweDAwMTIsIDB4MDAwMCwgMHgwMDEzLCAweDAwNUIsIDB4MDBERCwKKyAgICAweDAxQzUsIDB4MDNEMCwgMHgwN0IzLCAweDFGNzIsIDB4MUY3RiwgMHgxRjhGLCAweDFGQUQsIDB4M0ZBQiwKKyAgICAweDFGOUIsIDB4MUY3NSwgMHgwRjhCLCAweDAzQzYsIDB4MDNDMiwgMHgwMUQwLCAweDAwRDIsIDB4MDA1RSwKKyAgICAweDAwMkEsIDB4MDAxMSwgMHgwMDJCLCAweDAwNUYsIDB4MDBEMywgMHgwMUQxLCAweDAzQzMsIDB4MDNDNywKKyAgICAweDBGOEMsIDB4MUY3NiwgMHgxRjlDLCAweDNGQUQsIDB4M0ZDRiwgMHgzRjg1LCAweDFGQkEsIDB4MUY5MSwKKyAgICAweDBGN0QsIDB4MEY3MCwgMHgwN0FFLCAweDAxRDYsIDB4MDFEMiwgMHgwMERFLCAweDAwNjAsIDB4MDBERiwKKyAgICAweDAxRDMsIDB4MDFENywgMHgwN0FGLCAweDBGNzEsIDB4MEY3RiwgMHgxRjkyLCAweDFGQUYsIDB4M0Y3QiwKKyAgICAweDNGRDAsIDB4M0ZDMCwgMHgzRkIxLCAweDFGODIsIDB4MEZBQiwgMHgwRjkyLCAweDBGODAsIDB4MEY2OSwKKyAgICAweDAzQjQsIDB4MDFDOCwgMHgwMEQ2LCAweDAwNjMsIDB4MDBENywgMHgwMUM5LCAweDAzQjUsIDB4MEY2QiwKKyAgICAweDBGODIsIDB4MEY5NCwgMHgwRkFELCAweDFGODQsIDB4M0ZCNSwgMHgzRkMyLCAweDNGQjYsIDB4M0ZCRiwKKyAgICAweDFGODUsIDB4MEZBRSwgMHgwRjk2LCAweDBGODMsIDB4MEY2QywgMHgwM0I2LCAweDAxQ0EsIDB4MDBEOCwKKyAgICAweDAwNjQsIDB4MDBEOSwgMHgwMUNCLCAweDAzQjcsIDB4MEY2RSwgMHgwRjg1LCAweDBGOTksIDB4MEZCMCwKKyAgICAweDFGODcsIDB4M0ZCMCwgMHgzRkIyLCAweDNGOTMsIDB4M0Y4NiwgMHgzRjhFLCAweDFGQjEsIDB4MUY5RCwKKyAgICAweDBGOUEsIDB4MEY4RCwgMHgwRjc0LCAweDAzQ0QsIDB4MDNCQSwgMHgwMDY2LCAweDAzQkIsIDB4MDNDRSwKKyAgICAweDBGNzUsIDB4MEY4RSwgMHgwRjlDLCAweDFGOUUsIDB4MUZCMCwgMHgzRjhDLCAweDNGOTQsIDB4M0Y4RCwKKyAgICAweEZGRkMsIDB4M0ZDQSwgMHgzRkQ1LCAweDNGOEYsIDB4MUY3OSwgMHgwRkIyLCAweDBGQTEsIDB4MEZBMiwKKyAgICAweDAzRDMsIDB4MDNDOSwgMHgwM0JFLCAweDAzQ0EsIDB4MDNENCwgMHgwRkEzLCAweDBGQTQsIDB4MEZCMywKKyAgICAweDFGN0EsIDB4M0Y5MCwgMHgzRkUzLCAweDNGRDgsIDB4RkZGMiwgMHg3RkQ3LCAweDdGQ0QsIDB4M0ZFNCwKKyAgICAweDNGOTIsIDB4M0Y4MiwgMHgxRkE2LCAweDFGQTgsIDB4MUY5OCwgMHgxRjdDLCAweDBGOUQsIDB4MEY3QiwKKyAgICAweDBGOUUsIDB4MUY4MCwgMHgxRjk3LCAweDFGQTcsIDB4MUZBNSwgMHgzRjdBLCAweDNGODksIDB4M0ZEQSwKKyAgICAweDdGRDIsIDB4N0ZENiwgMHhGRkZFLCAweEZGRUQsIDB4RkZFOCwgMHgzRkNDLCAweDNGQkQsIDB4M0ZBRSwKKyAgICAweDNGQzEsIDB4M0Y5RiwgMHgzRjlBLCAweDFGODksIDB4MUY5MCwgMHgxRjhBLCAweDNGQTMsIDB4M0ZBMCwKKyAgICAweDNGQzgsIDB4M0ZCRSwgMHgzRkI3LCAweDNGRDEsIDB4RkZFNywgMHhGRkU5LCAweEZGRkQsIDB4RkZGNCwKKyAgICAweEZGRTUsIDB4RkZFRiwgMHg3RkQ4LCAweDdGREMsIDB4M0ZBMiwgMHgzRjgzLCAweDNGNzgsIDB4MUZBOSwKKyAgICAweDBGQjYsIDB4MEY3QywgMHgwRkI3LCAweDFGQUIsIDB4M0Y3NywgMHgzRjdELCAweDNGOUIsIDB4N0ZERSwKKyAgICAweDdGRUQsIDB4RkZFNiwgMHhGRkUwLCAweEZGRjcsIDB4RkZGMSwgMHg3RkRBLCAweDdGRTksIDB4N0ZFMiwKKyAgICAweDdGRTMsIDB4N0ZEMSwgMHgzRkQ5LCAweDNGRTIsIDB4M0ZBNSwgMHgxRkI4LCAweDAzQzgsIDB4MUZCNiwKKyAgICAweDNGOUQsIDB4M0ZERSwgMHgzRkNFLCAweDdGRDMsIDB4N0ZFRSwgMHg3RkRGLCAweDdGRTgsIDB4N0ZFNCwKKyAgICAweEZGRkEsIDB4MDAyQywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfbXZ2XzJfc3ltc1tdID0geworICAgIDB4RjZGNiwgMHhGN0Y2LCAweEY4RjYsIDB4RjlGNiwgMHhGQUY2LCAweEZCRjYsIDB4RkNGNiwgMHhGREY2LAorICAgIDB4RkVGNiwgMHhGRkY2LCAweDAwRjYsIDB4MDFGNiwgMHgwMkY2LCAweDAzRjYsIDB4MDRGNiwgMHgwNUY2LAorICAgIDB4MDZGNiwgMHgwN0Y2LCAweDA4RjYsIDB4MDlGNiwgMHgwQUY2LCAweEY2RjcsIDB4RjdGNywgMHhGOEY3LAorICAgIDB4RjlGNywgMHhGQUY3LCAweEZCRjcsIDB4RkNGNywgMHhGREY3LCAweEZFRjcsIDB4RkZGNywgMHgwMEY3LAorICAgIDB4MDFGNywgMHgwMkY3LCAweDAzRjcsIDB4MDRGNywgMHgwNUY3LCAweDA2RjcsIDB4MDdGNywgMHgwOEY3LAorICAgIDB4MDlGNywgMHgwQUY3LCAweEY2RjgsIDB4RjdGOCwgMHhGOEY4LCAweEY5RjgsIDB4RkFGOCwgMHhGQkY4LAorICAgIDB4RkNGOCwgMHhGREY4LCAweEZFRjgsIDB4RkZGOCwgMHgwMEY4LCAweDAxRjgsIDB4MDJGOCwgMHgwM0Y4LAorICAgIDB4MDRGOCwgMHgwNUY4LCAweDA2RjgsIDB4MDdGOCwgMHgwOEY4LCAweDA5RjgsIDB4MEFGOCwgMHhGNkY5LAorICAgIDB4RjdGOSwgMHhGOEY5LCAweEY5RjksIDB4RkFGOSwgMHhGQkY5LCAweEZDRjksIDB4RkRGOSwgMHhGRUY5LAorICAgIDB4RkZGOSwgMHgwMEY5LCAweDAxRjksIDB4MDJGOSwgMHgwM0Y5LCAweDA0RjksIDB4MDVGOSwgMHgwNkY5LAorICAgIDB4MDdGOSwgMHgwOEY5LCAweDA5RjksIDB4MEFGOSwgMHhGNkZBLCAweEY3RkEsIDB4RjhGQSwgMHhGOUZBLAorICAgIDB4RkFGQSwgMHhGQkZBLCAweEZDRkEsIDB4RkRGQSwgMHhGRUZBLCAweEZGRkEsIDB4MDBGQSwgMHgwMUZBLAorICAgIDB4MDJGQSwgMHgwM0ZBLCAweDA0RkEsIDB4MDVGQSwgMHgwNkZBLCAweDA3RkEsIDB4MDhGQSwgMHgwOUZBLAorICAgIDB4MEFGQSwgMHhGNkZCLCAweEY3RkIsIDB4RjhGQiwgMHhGOUZCLCAweEZBRkIsIDB4RkJGQiwgMHhGQ0ZCLAorICAgIDB4RkRGQiwgMHhGRUZCLCAweEZGRkIsIDB4MDBGQiwgMHgwMUZCLCAweDAyRkIsIDB4MDNGQiwgMHgwNEZCLAorICAgIDB4MDVGQiwgMHgwNkZCLCAweDA3RkIsIDB4MDhGQiwgMHgwOUZCLCAweDBBRkIsIDB4RjZGQywgMHhGN0ZDLAorICAgIDB4RjhGQywgMHhGOUZDLCAweEZBRkMsIDB4RkJGQywgMHhGQ0ZDLCAweEZERkMsIDB4RkVGQywgMHhGRkZDLAorICAgIDB4MDBGQywgMHgwMUZDLCAweDAyRkMsIDB4MDNGQywgMHgwNEZDLCAweDA1RkMsIDB4MDZGQywgMHgwN0ZDLAorICAgIDB4MDhGQywgMHgwOUZDLCAweDBBRkMsIDB4RjZGRCwgMHhGN0ZELCAweEY4RkQsIDB4RjlGRCwgMHhGQUZELAorICAgIDB4RkJGRCwgMHhGQ0ZELCAweEZERkQsIDB4RkVGRCwgMHhGRkZELCAweDAwRkQsIDB4MDFGRCwgMHgwMkZELAorICAgIDB4MDNGRCwgMHgwNEZELCAweDA1RkQsIDB4MDZGRCwgMHgwN0ZELCAweDA4RkQsIDB4MDlGRCwgMHgwQUZELAorICAgIDB4RjZGRSwgMHhGN0ZFLCAweEY4RkUsIDB4RjlGRSwgMHhGQUZFLCAweEZCRkUsIDB4RkNGRSwgMHhGREZFLAorICAgIDB4RkVGRSwgMHhGRkZFLCAweDAwRkUsIDB4MDFGRSwgMHgwMkZFLCAweDAzRkUsIDB4MDRGRSwgMHgwNUZFLAorICAgIDB4MDZGRSwgMHgwN0ZFLCAweDA4RkUsIDB4MDlGRSwgMHgwQUZFLCAweEY2RkYsIDB4RjdGRiwgMHhGOEZGLAorICAgIDB4RjlGRiwgMHhGQUZGLCAweEZCRkYsIDB4RkNGRiwgMHhGREZGLCAweEZFRkYsIDB4RkZGRiwgMHgwMEZGLAorICAgIDB4MDFGRiwgMHgwMkZGLCAweDAzRkYsIDB4MDRGRiwgMHgwNUZGLCAweDA2RkYsIDB4MDdGRiwgMHgwOEZGLAorICAgIDB4MDlGRiwgMHgwQUZGLCAweEY2MDAsIDB4RjcwMCwgMHhGODAwLCAweEY5MDAsIDB4RkEwMCwgMHhGQjAwLAorICAgIDB4RkMwMCwgMHhGRDAwLCAweEZFMDAsIDB4RkYwMCwgMHgwMDAwLCAweDAxMDAsIDB4MDIwMCwgMHgwMzAwLAorICAgIDB4MDQwMCwgMHgwNTAwLCAweDA2MDAsIDB4MDcwMCwgMHgwODAwLCAweDA5MDAsIDB4MEEwMCwgMHhGNjAxLAorICAgIDB4RjcwMSwgMHhGODAxLCAweEY5MDEsIDB4RkEwMSwgMHhGQjAxLCAweEZDMDEsIDB4RkQwMSwgMHhGRTAxLAorICAgIDB4RkYwMSwgMHgwMDAxLCAweDAxMDEsIDB4MDIwMSwgMHgwMzAxLCAweDA0MDEsIDB4MDUwMSwgMHgwNjAxLAorICAgIDB4MDcwMSwgMHgwODAxLCAweDA5MDEsIDB4MEEwMSwgMHhGNjAyLCAweEY3MDIsIDB4RjgwMiwgMHhGOTAyLAorICAgIDB4RkEwMiwgMHhGQjAyLCAweEZDMDIsIDB4RkQwMiwgMHhGRTAyLCAweEZGMDIsIDB4MDAwMiwgMHgwMTAyLAorICAgIDB4MDIwMiwgMHgwMzAyLCAweDA0MDIsIDB4MDUwMiwgMHgwNjAyLCAweDA3MDIsIDB4MDgwMiwgMHgwOTAyLAorICAgIDB4MEEwMiwgMHhGNjAzLCAweEY3MDMsIDB4RjgwMywgMHhGOTAzLCAweEZBMDMsIDB4RkIwMywgMHhGQzAzLAorICAgIDB4RkQwMywgMHhGRTAzLCAweEZGMDMsIDB4MDAwMywgMHgwMTAzLCAweDAyMDMsIDB4MDMwMywgMHgwNDAzLAorICAgIDB4MDUwMywgMHgwNjAzLCAweDA3MDMsIDB4MDgwMywgMHgwOTAzLCAweDBBMDMsIDB4RjYwNCwgMHhGNzA0LAorICAgIDB4RjgwNCwgMHhGOTA0LCAweEZBMDQsIDB4RkIwNCwgMHhGQzA0LCAweEZEMDQsIDB4RkUwNCwgMHhGRjA0LAorICAgIDB4MDAwNCwgMHgwMTA0LCAweDAyMDQsIDB4MDMwNCwgMHgwNDA0LCAweDA1MDQsIDB4MDYwNCwgMHgwNzA0LAorICAgIDB4MDgwNCwgMHgwOTA0LCAweDBBMDQsIDB4RjYwNSwgMHhGNzA1LCAweEY4MDUsIDB4RjkwNSwgMHhGQTA1LAorICAgIDB4RkIwNSwgMHhGQzA1LCAweEZEMDUsIDB4RkUwNSwgMHhGRjA1LCAweDAwMDUsIDB4MDEwNSwgMHgwMjA1LAorICAgIDB4MDMwNSwgMHgwNDA1LCAweDA1MDUsIDB4MDYwNSwgMHgwNzA1LCAweDA4MDUsIDB4MDkwNSwgMHgwQTA1LAorICAgIDB4RjYwNiwgMHhGNzA2LCAweEY4MDYsIDB4RjkwNiwgMHhGQTA2LCAweEZCMDYsIDB4RkMwNiwgMHhGRDA2LAorICAgIDB4RkUwNiwgMHhGRjA2LCAweDAwMDYsIDB4MDEwNiwgMHgwMjA2LCAweDAzMDYsIDB4MDQwNiwgMHgwNTA2LAorICAgIDB4MDYwNiwgMHgwNzA2LCAweDA4MDYsIDB4MDkwNiwgMHgwQTA2LCAweEY2MDcsIDB4RjcwNywgMHhGODA3LAorICAgIDB4RjkwNywgMHhGQTA3LCAweEZCMDcsIDB4RkMwNywgMHhGRDA3LCAweEZFMDcsIDB4RkYwNywgMHgwMDA3LAorICAgIDB4MDEwNywgMHgwMjA3LCAweDAzMDcsIDB4MDQwNywgMHgwNTA3LCAweDA2MDcsIDB4MDcwNywgMHgwODA3LAorICAgIDB4MDkwNywgMHgwQTA3LCAweEY2MDgsIDB4RjcwOCwgMHhGODA4LCAweEY5MDgsIDB4RkEwOCwgMHhGQjA4LAorICAgIDB4RkMwOCwgMHhGRDA4LCAweEZFMDgsIDB4RkYwOCwgMHgwMDA4LCAweDAxMDgsIDB4MDIwOCwgMHgwMzA4LAorICAgIDB4MDQwOCwgMHgwNTA4LCAweDA2MDgsIDB4MDcwOCwgMHgwODA4LCAweDA5MDgsIDB4MEEwOCwgMHhGNjA5LAorICAgIDB4RjcwOSwgMHhGODA5LCAweEY5MDksIDB4RkEwOSwgMHhGQjA5LCAweEZDMDksIDB4RkQwOSwgMHhGRTA5LAorICAgIDB4RkYwOSwgMHgwMDA5LCAweDAxMDksIDB4MDIwOSwgMHgwMzA5LCAweDA0MDksIDB4MDUwOSwgMHgwNjA5LAorICAgIDB4MDcwOSwgMHgwODA5LCAweDA5MDksIDB4MEEwOSwgMHhGNjBBLCAweEY3MEEsIDB4RjgwQSwgMHhGOTBBLAorICAgIDB4RkEwQSwgMHhGQjBBLCAweEZDMEEsIDB4RkQwQSwgMHhGRTBBLCAweEZGMEEsIDB4MDAwQSwgMHgwMTBBLAorICAgIDB4MDIwQSwgMHgwMzBBLCAweDA0MEEsIDB4MDUwQSwgMHgwNjBBLCAweDA3MEEsIDB4MDgwQSwgMHgwOTBBLAorICAgIDB4MEEwQSwgMHgwQjBCLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X2JpYXN5XzFfYml0c1tdID0geworICAgIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsICA5LAorICAgICA4LCAgOCwgIDcsICA3LCAgNSwgIDIsICAxLCAgMywgIDUsICA3LCAgNywgIDgsICA5LCAgOSwgMTAsIDEwLAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfYmlhc3lfMV9jb2Rlc1tdID0geworICAgIDB4RkZGRSwgMHg3RkZFLCAweDdGRkMsIDB4N0ZGQSwgMHg3RkY2LCAweDdGRjcsIDB4N0ZGMywgMHg3RkYyLAorICAgIDB4N0ZFRiwgMHg3RkVFLCAweDNGRjUsIDB4M0ZGMywgMHgzRkYxLCAweDFGRjcsIDB4MUZGNSwgMHgxRkYyLAorICAgIDB4MUZGMCwgMHgxRkVFLCAweDFGRUMsIDB4MUZFQSwgMHgxRkU4LCAweDBGRjIsIDB4MEZGMCwgMHgwRkVFLAorICAgIDB4MEZFQiwgMHgwN0Y0LCAweDA3RjMsIDB4MDdGMSwgMHgwM0Y3LCAweDAzRjUsIDB4MDNGMywgMHgwMUY3LAorICAgIDB4MDBGQSwgMHgwMEY4LCAweDAwN0EsIDB4MDA3OCwgMHgwMDFDLCAweDAwMDIsIDB4MDAwMCwgMHgwMDA2LAorICAgIDB4MDAxRCwgMHgwMDc5LCAweDAwN0IsIDB4MDBGOSwgMHgwMUY2LCAweDAxRjgsIDB4MDNGMiwgMHgwM0Y0LAorICAgIDB4MDNGNiwgMHgwN0YwLCAweDA3RjIsIDB4MEZFQSwgMHgwRkVDLCAweDBGRUYsIDB4MEZGMSwgMHgwRkYzLAorICAgIDB4MUZFOSwgMHgxRkVCLCAweDFGRUQsIDB4MUZFRiwgMHgxRkYxLCAweDFGRjMsIDB4MUZGNCwgMHgxRkY2LAorICAgIDB4M0ZGMCwgMHgzRkYyLCAweDNGRjQsIDB4M0ZGNiwgMHg3RkYwLCAweDdGRjEsIDB4N0ZGNCwgMHg3RkY4LAorICAgIDB4N0ZGNSwgMHg3RkY5LCAweDdGRkIsIDB4N0ZGRCwgMHhGRkZGLCAweDBGRUQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2JpYXN5XzFfc3ltc1tdID0geworICAgIDB4RkY2OCwgMHhGRjZDLCAweEZGNzAsIDB4RkY3NCwgMHhGRjc4LCAweEZGN0MsIDB4RkY4MCwgMHhGRjg0LAorICAgIDB4RkY4OCwgMHhGRjhDLCAweEZGOTAsIDB4RkY5NCwgMHhGRjk4LCAweEZGOUMsIDB4RkZBMCwgMHhGRkE0LAorICAgIDB4RkZBOCwgMHhGRkFDLCAweEZGQjAsIDB4RkZCNCwgMHhGRkI4LCAweEZGQkMsIDB4RkZDMCwgMHhGRkM0LAorICAgIDB4RkZDOCwgMHhGRkNDLCAweEZGRDAsIDB4RkZENCwgMHhGRkQ4LCAweEZGREMsIDB4RkZFMCwgMHhGRkU0LAorICAgIDB4RkZFOCwgMHhGRkVDLCAweEZGRjAsIDB4RkZGNCwgMHhGRkY4LCAweEZGRkMsIDB4MDAwMCwgMHgwMDA0LAorICAgIDB4MDAwOCwgMHgwMDBDLCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4LCAweDAwMUMsIDB4MDAyMCwgMHgwMDI0LAorICAgIDB4MDAyOCwgMHgwMDJDLCAweDAwMzAsIDB4MDAzNCwgMHgwMDM4LCAweDAwM0MsIDB4MDA0MCwgMHgwMDQ0LAorICAgIDB4MDA0OCwgMHgwMDRDLCAweDAwNTAsIDB4MDA1NCwgMHgwMDU4LCAweDAwNUMsIDB4MDA2MCwgMHgwMDY0LAorICAgIDB4MDA2OCwgMHgwMDZDLCAweDAwNzAsIDB4MDA3NCwgMHgwMDc4LCAweDAwN0MsIDB4MDA4MCwgMHgwMDg0LAorICAgIDB4MDA4OCwgMHgwMDhDLCAweDAwOTAsIDB4MDA5NCwgMHgwMDk4LCAweDAxMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfYmlhc3lfMl9iaXRzW10gPSB7CisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsCisgICAgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOCwgIDgsICA4LCAgNywgIDYsICA2LCAgNCwgIDMsCisgICAgIDEsICAzLCAgNCwgIDYsICA2LCAgNywgIDgsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNsdl9iaWFzeV8yX2NvZGVzW10gPSB7CisgICAgMHhGRkZFLCAweEZGRkMsIDB4RkZGQSwgMHhGRkY5LCAweEZGRjYsIDB4RkZGNSwgMHhGRkYzLCAweDdGRjcsCisgICAgMHg3RkY1LCAweDdGRjEsIDB4N0ZGMywgMHg3RkYwLCAweDdGRUUsIDB4N0ZFQywgMHg3RkU5LCAweDdGRTYsCisgICAgMHg3RkU0LCAweDdGRTIsIDB4M0ZFRiwgMHgzRkVFLCAweDNGRUMsIDB4M0ZFQSwgMHgxRkYyLCAweDFGRjEsCisgICAgMHgxRkVGLCAweDFGRUQsIDB4MEZGNCwgMHgwRkYzLCAweDBGRjEsIDB4MEZFRiwgMHgwRkVELCAweDA3RjQsCisgICAgMHgwN0YzLCAweDA3RjEsIDB4MDNGNiwgMHgwM0Y0LCAweDAzRjIsIDB4MDNGMCwgMHgwMUY2LCAweDAxRjQsCisgICAgMHgwMEY4LCAweDAwRjYsIDB4MDBGNCwgMHgwMDc4LCAweDAwM0EsIDB4MDAzOCwgMHgwMDBDLCAweDAwMDQsCisgICAgMHgwMDAwLCAweDAwMDUsIDB4MDAwRCwgMHgwMDM5LCAweDAwM0IsIDB4MDA3OSwgMHgwMEY1LCAweDAwRjcsCisgICAgMHgwMEY5LCAweDAxRjUsIDB4MDFGNywgMHgwM0YxLCAweDAzRjMsIDB4MDNGNSwgMHgwM0Y3LCAweDA3RjAsCisgICAgMHgwN0YyLCAweDA3RjUsIDB4MEZFQywgMHgwRkVFLCAweDBGRjAsIDB4MEZGMiwgMHgwRkY1LCAweDFGRUMsCisgICAgMHgxRkVFLCAweDFGRjAsIDB4MUZGMywgMHgxRkY0LCAweDNGRUIsIDB4M0ZFRCwgMHgzRkYwLCAweDdGRTMsCisgICAgMHg3RkU1LCAweDdGRTcsIDB4N0ZFQSwgMHg3RkVCLCAweDdGRUQsIDB4N0ZFRiwgMHg3RkY0LCAweDdGRjIsCisgICAgMHg3RkY2LCAweDdGRjgsIDB4RkZGMiwgMHhGRkY0LCAweEZGRjcsIDB4RkZGOCwgMHhGRkZCLCAweEZGRkQsCisgICAgMHhGRkZGLCAweDdGRTgsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2JpYXN5XzJfc3ltc1tdID0geworICAgIDB4RkY0MCwgMHhGRjQ0LCAweEZGNDgsIDB4RkY0QywgMHhGRjUwLCAweEZGNTQsIDB4RkY1OCwgMHhGRjVDLAorICAgIDB4RkY2MCwgMHhGRjY0LCAweEZGNjgsIDB4RkY2QywgMHhGRjcwLCAweEZGNzQsIDB4RkY3OCwgMHhGRjdDLAorICAgIDB4RkY4MCwgMHhGRjg0LCAweEZGODgsIDB4RkY4QywgMHhGRjkwLCAweEZGOTQsIDB4RkY5OCwgMHhGRjlDLAorICAgIDB4RkZBMCwgMHhGRkE0LCAweEZGQTgsIDB4RkZBQywgMHhGRkIwLCAweEZGQjQsIDB4RkZCOCwgMHhGRkJDLAorICAgIDB4RkZDMCwgMHhGRkM0LCAweEZGQzgsIDB4RkZDQywgMHhGRkQwLCAweEZGRDQsIDB4RkZEOCwgMHhGRkRDLAorICAgIDB4RkZFMCwgMHhGRkU0LCAweEZGRTgsIDB4RkZFQywgMHhGRkYwLCAweEZGRjQsIDB4RkZGOCwgMHhGRkZDLAorICAgIDB4MDAwMCwgMHgwMDA0LCAweDAwMDgsIDB4MDAwQywgMHgwMDEwLCAweDAwMTQsIDB4MDAxOCwgMHgwMDFDLAorICAgIDB4MDAyMCwgMHgwMDI0LCAweDAwMjgsIDB4MDAyQywgMHgwMDMwLCAweDAwMzQsIDB4MDAzOCwgMHgwMDNDLAorICAgIDB4MDA0MCwgMHgwMDQ0LCAweDAwNDgsIDB4MDA0QywgMHgwMDUwLCAweDAwNTQsIDB4MDA1OCwgMHgwMDVDLAorICAgIDB4MDA2MCwgMHgwMDY0LCAweDAwNjgsIDB4MDA2QywgMHgwMDcwLCAweDAwNzQsIDB4MDA3OCwgMHgwMDdDLAorICAgIDB4MDA4MCwgMHgwMDg0LCAweDAwODgsIDB4MDA4QywgMHgwMDkwLCAweDAwOTQsIDB4MDA5OCwgMHgwMDlDLAorICAgIDB4MDBBMCwgMHgwMEE0LCAweDAwQTgsIDB4MDBBQywgMHgwMEIwLCAweDAwQjQsIDB4MDBCOCwgMHgwMEJDLAorICAgIDB4MDBDMCwgMHgwMTAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2x2X2JpYXN5XzNfYml0c1tdID0geworICAgIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLAorICAgIDEwLCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgNywgIDcsICA2LCAgNSwgIDQsICA0LCAgMiwgIDIsICAzLAorICAgICA0LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLAorICAgIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfYmlhc3lfM19jb2Rlc1tdID0geworICAgIDB4RkZGRiwgMHhGRkZDLCAweEZGRkEsIDB4N0ZGQywgMHg3RkY5LCAweDdGRjYsIDB4N0ZGNCwgMHg3RkYyLAorICAgIDB4N0ZGMSwgMHg3RkVGLCAweDdGRUMsIDB4N0ZFQiwgMHg3RkU5LCAweDNGRjMsIDB4M0ZGMCwgMHgzRkVFLAorICAgIDB4M0ZFRCwgMHgzRkVBLCAweDFGRjMsIDB4MUZGMiwgMHgxRkYwLCAweDFGRUUsIDB4MEZGNCwgMHgwRkYzLAorICAgIDB4MEZGMSwgMHgwN0Y3LCAweDA3RjUsIDB4MDdGMywgMHgwN0YxLCAweDAzRjcsIDB4MDNGNCwgMHgwM0YyLAorICAgIDB4MDNGMCwgMHgwMUY2LCAweDAxRjQsIDB4MDFGMiwgMHgwMUYwLCAweDAwRjYsIDB4MDBGNCwgMHgwMDc4LAorICAgIDB4MDA3NiwgMHgwMDM5LCAweDAwMUIsIDB4MDAwQywgMHgwMDBBLCAweDAwMDEsIDB4MDAwMCwgMHgwMDA0LAorICAgIDB4MDAwQiwgMHgwMDFBLCAweDAwMzgsIDB4MDAzQSwgMHgwMDc3LCAweDAwNzksIDB4MDBGNSwgMHgwMEY3LAorICAgIDB4MDFGMSwgMHgwMUYzLCAweDAxRjUsIDB4MDFGNywgMHgwM0YxLCAweDAzRjMsIDB4MDNGNSwgMHgwM0Y2LAorICAgIDB4MDdGMCwgMHgwN0YyLCAweDA3RjQsIDB4MDdGNiwgMHgwRkYwLCAweDBGRjIsIDB4MEZGNSwgMHgwRkY2LAorICAgIDB4MUZFRiwgMHgxRkYxLCAweDFGRjQsIDB4M0ZFQiwgMHgzRkVDLCAweDNGRUYsIDB4M0ZGMSwgMHgzRkYyLAorICAgIDB4N0ZFOCwgMHg3RkVBLCAweDdGRUQsIDB4N0ZFRSwgMHg3RkYwLCAweDdGRjMsIDB4N0ZGNSwgMHg3RkY3LAorICAgIDB4N0ZGQSwgMHg3RkZCLCAweEZGRkIsIDB4RkZGRCwgMHhGRkZFLCAweDdGRjgsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2JpYXN5XzNfc3ltc1tdID0geworICAgIDB4RkY0OCwgMHhGRjRDLCAweEZGNTAsIDB4RkY1NCwgMHhGRjU4LCAweEZGNUMsIDB4RkY2MCwgMHhGRjY0LAorICAgIDB4RkY2OCwgMHhGRjZDLCAweEZGNzAsIDB4RkY3NCwgMHhGRjc4LCAweEZGN0MsIDB4RkY4MCwgMHhGRjg0LAorICAgIDB4RkY4OCwgMHhGRjhDLCAweEZGOTAsIDB4RkY5NCwgMHhGRjk4LCAweEZGOUMsIDB4RkZBMCwgMHhGRkE0LAorICAgIDB4RkZBOCwgMHhGRkFDLCAweEZGQjAsIDB4RkZCNCwgMHhGRkI4LCAweEZGQkMsIDB4RkZDMCwgMHhGRkM0LAorICAgIDB4RkZDOCwgMHhGRkNDLCAweEZGRDAsIDB4RkZENCwgMHhGRkQ4LCAweEZGREMsIDB4RkZFMCwgMHhGRkU0LAorICAgIDB4RkZFOCwgMHhGRkVDLCAweEZGRjAsIDB4RkZGNCwgMHhGRkY4LCAweEZGRkMsIDB4MDAwMCwgMHgwMDA0LAorICAgIDB4MDAwOCwgMHgwMDBDLCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4LCAweDAwMUMsIDB4MDAyMCwgMHgwMDI0LAorICAgIDB4MDAyOCwgMHgwMDJDLCAweDAwMzAsIDB4MDAzNCwgMHgwMDM4LCAweDAwM0MsIDB4MDA0MCwgMHgwMDQ0LAorICAgIDB4MDA0OCwgMHgwMDRDLCAweDAwNTAsIDB4MDA1NCwgMHgwMDU4LCAweDAwNUMsIDB4MDA2MCwgMHgwMDY0LAorICAgIDB4MDA2OCwgMHgwMDZDLCAweDAwNzAsIDB4MDA3NCwgMHgwMDc4LCAweDAwN0MsIDB4MDA4MCwgMHgwMDg0LAorICAgIDB4MDA4OCwgMHgwMDhDLCAweDAwOTAsIDB4MDA5NCwgMHgwMDk4LCAweDAwOUMsIDB4MDBBMCwgMHgwMEE0LAorICAgIDB4MDBBOCwgMHgwMEFDLCAweDAwQjAsIDB4MDBCNCwgMHgwMEI4LCAweDAxMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfYmlhc3VfMV9iaXRzW10gPSB7CisgICAgMTYsIDE1LCAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDExLCAxMCwgMTAsICA5LCAgOSwgIDgsCisgICAgIDcsICA2LCAgNSwgIDIsICAxLCAgMywgIDUsICA3LCAgNywgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE1LCAxNSwgMTYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2JpYXN1XzFfY29kZXNbXSA9IHsKKyAgICAweEZGRkUsIDB4N0ZGQywgMHgzRkZDLCAweDFGRkMsIDB4MUZGQSwgMHgxRkY5LCAweDBGRkEsIDB4MEZGNywKKyAgICAweDBGRjgsIDB4MEZGNSwgMHgwN0Y4LCAweDAzRkEsIDB4MDNGOCwgMHgwMUZBLCAweDAxRjksIDB4MDBGQSwKKyAgICAweDAwN0IsIDB4MDAzQywgMHgwMDFDLCAweDAwMDIsIDB4MDAwMCwgMHgwMDA2LCAweDAwMUQsIDB4MDA3QSwKKyAgICAweDAwN0MsIDB4MDBGQiwgMHgwMUY4LCAweDAxRkIsIDB4MDNGOSwgMHgwM0ZCLCAweDA3RjksIDB4MEZGNCwKKyAgICAweDBGRjYsIDB4MEZGOSwgMHgwRkZCLCAweDFGRjgsIDB4MUZGQiwgMHgxRkZELCAweDNGRkQsIDB4N0ZGRCwKKyAgICAweDdGRkUsIDB4RkZGRiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfYmlhc3VfMV9zeW1zW10gPSB7CisgICAgMHhGRkIwLCAweEZGQjQsIDB4RkZCOCwgMHhGRkJDLCAweEZGQzAsIDB4RkZDNCwgMHhGRkM4LCAweEZGQ0MsCisgICAgMHhGRkQwLCAweEZGRDQsIDB4RkZEOCwgMHhGRkRDLCAweEZGRTAsIDB4RkZFNCwgMHhGRkU4LCAweEZGRUMsCisgICAgMHhGRkYwLCAweEZGRjQsIDB4RkZGOCwgMHhGRkZDLCAweDAwMDAsIDB4MDAwNCwgMHgwMDA4LCAweDAwMEMsCisgICAgMHgwMDEwLCAweDAwMTQsIDB4MDAxOCwgMHgwMDFDLCAweDAwMjAsIDB4MDAyNCwgMHgwMDI4LCAweDAwMkMsCisgICAgMHgwMDMwLCAweDAwMzQsIDB4MDAzOCwgMHgwMDNDLCAweDAwNDAsIDB4MDA0NCwgMHgwMDQ4LCAweDAwNEMsCisgICAgMHgwMDUwLCAweDAxMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfYmlhc3VfMl9iaXRzW10gPSB7CisgICAgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsCisgICAgMTAsICA5LCAgOSwgIDgsICA4LCAgNywgIDYsICA1LCAgNCwgIDMsICAxLCAgMywgIDQsICA2LCAgNiwgIDcsCisgICAgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxNCwgMTQsIDE0LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfYmlhc3VfMl9jb2Rlc1tdID0geworICAgIDB4RkZGQywgMHhGRkY4LCAweEZGRkEsIDB4RkZGRCwgMHg3RkY4LCAweDdGRkEsIDB4N0ZGNywgMHgzRkY2LAorICAgIDB4M0ZGNywgMHgzRkY0LCAweDFGRjksIDB4MEZGQiwgMHgwRkY5LCAweDA3RkIsIDB4MDdGOSwgMHgwM0ZBLAorICAgIDB4MDNGOCwgMHgwMUZBLCAweDAxRjksIDB4MDBGQiwgMHgwMEY5LCAweDAwN0IsIDB4MDAzQiwgMHgwMDFDLAorICAgIDB4MDAwQywgMHgwMDA0LCAweDAwMDAsIDB4MDAwNSwgMHgwMDBELCAweDAwM0EsIDB4MDAzQywgMHgwMDdBLAorICAgIDB4MDBGOCwgMHgwMEZBLCAweDAxRjgsIDB4MDFGQiwgMHgwM0Y5LCAweDAzRkIsIDB4MDdGOCwgMHgwN0ZBLAorICAgIDB4MEZGOCwgMHgwRkZBLCAweDFGRjgsIDB4M0ZGNSwgMHgzRkY4LCAweDNGRjksIDB4N0ZGQiwgMHg3RkY5LAorICAgIDB4N0ZGNiwgMHhGRkY5LCAweEZGRkYsIDB4RkZGRSwgMHhGRkZCLCAweDNGRkEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2JpYXN1XzJfc3ltc1tdID0geworICAgIDB4RkY5OCwgMHhGRjlDLCAweEZGQTAsIDB4RkZBNCwgMHhGRkE4LCAweEZGQUMsIDB4RkZCMCwgMHhGRkI0LAorICAgIDB4RkZCOCwgMHhGRkJDLCAweEZGQzAsIDB4RkZDNCwgMHhGRkM4LCAweEZGQ0MsIDB4RkZEMCwgMHhGRkQ0LAorICAgIDB4RkZEOCwgMHhGRkRDLCAweEZGRTAsIDB4RkZFNCwgMHhGRkU4LCAweEZGRUMsIDB4RkZGMCwgMHhGRkY0LAorICAgIDB4RkZGOCwgMHhGRkZDLCAweDAwMDAsIDB4MDAwNCwgMHgwMDA4LCAweDAwMEMsIDB4MDAxMCwgMHgwMDE0LAorICAgIDB4MDAxOCwgMHgwMDFDLCAweDAwMjAsIDB4MDAyNCwgMHgwMDI4LCAweDAwMkMsIDB4MDAzMCwgMHgwMDM0LAorICAgIDB4MDAzOCwgMHgwMDNDLCAweDAwNDAsIDB4MDA0NCwgMHgwMDQ4LCAweDAwNEMsIDB4MDA1MCwgMHgwMDU0LAorICAgIDB4MDA1OCwgMHgwMDVDLCAweDAwNjAsIDB4MDA2NCwgMHgwMDY4LCAweDAxMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfYmlhc3ZfMV9iaXRzW10gPSB7CisgICAgMTYsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsIDEwLCAgOSwgIDgsCisgICAgIDcsICA2LCAgNSwgIDIsICAxLCAgMywgIDUsICA2LCAgOCwgIDgsICA5LCAxMCwgMTAsIDExLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LCAxNiwgMTQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2x2X2JpYXN2XzFfY29kZXNbXSA9IHsKKyAgICAweEZGRkYsIDB4N0ZGRCwgMHgzRkZELCAweDNGRkIsIDB4M0ZGOSwgMHgxRkZCLCAweDFGRjgsIDB4MUZGNiwKKyAgICAweDBGRkEsIDB4MEZGOCwgMHgwN0ZBLCAweDA3RjgsIDB4MDNGQSwgMHgwM0Y4LCAweDAxRkIsIDB4MDBGQiwKKyAgICAweDAwN0MsIDB4MDAzQywgMHgwMDFDLCAweDAwMDIsIDB4MDAwMCwgMHgwMDA2LCAweDAwMUQsIDB4MDAzRCwKKyAgICAweDAwRkEsIDB4MDBGQywgMHgwMUZBLCAweDAzRjksIDB4MDNGQiwgMHgwN0Y5LCAweDBGRjYsIDB4MEZGNywKKyAgICAweDBGRjksIDB4MUZGNywgMHgxRkY5LCAweDFGRkEsIDB4M0ZGQSwgMHgzRkZDLCAweDdGRkMsIDB4N0ZGRSwKKyAgICAweEZGRkUsIDB4M0ZGOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfYmlhc3ZfMV9zeW1zW10gPSB7CisgICAgMHhGRkIwLCAweEZGQjQsIDB4RkZCOCwgMHhGRkJDLCAweEZGQzAsIDB4RkZDNCwgMHhGRkM4LCAweEZGQ0MsCisgICAgMHhGRkQwLCAweEZGRDQsIDB4RkZEOCwgMHhGRkRDLCAweEZGRTAsIDB4RkZFNCwgMHhGRkU4LCAweEZGRUMsCisgICAgMHhGRkYwLCAweEZGRjQsIDB4RkZGOCwgMHhGRkZDLCAweDAwMDAsIDB4MDAwNCwgMHgwMDA4LCAweDAwMEMsCisgICAgMHgwMDEwLCAweDAwMTQsIDB4MDAxOCwgMHgwMDFDLCAweDAwMjAsIDB4MDAyNCwgMHgwMDI4LCAweDAwMkMsCisgICAgMHgwMDMwLCAweDAwMzQsIDB4MDAzOCwgMHgwMDNDLCAweDAwNDAsIDB4MDA0NCwgMHgwMDQ4LCAweDAwNEMsCisgICAgMHgwMDUwLCAweDAxMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbHZfYmlhc3ZfMl9iaXRzW10gPSB7CisgICAgMTYsIDE1LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDExLCAxMCwgMTAsICA5LCAgOSwgIDgsCisgICAgIDcsICA2LCAgNSwgIDQsICAzLCAgMSwgIDMsICA0LCAgNSwgIDcsICA3LCAgOCwgIDksICA5LCAxMCwgMTAsCisgICAgMTAsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTYsIDE1LCAxNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfYmlhc3ZfMl9jb2Rlc1tdID0geworICAgIDB4RkZGRSwgMHg3RkZELCAweDNGRkMsIDB4MUZGQywgMHgxRkZCLCAweDFGRjgsIDB4MUZGNywgMHgxRkY0LAorICAgIDB4MEZGOCwgMHgwRkY3LCAweDA3RkEsIDB4MDNGQiwgMHgwM0Y4LCAweDAxRkEsIDB4MDFGOSwgMHgwMEZBLAorICAgIDB4MDA3QiwgMHgwMDNDLCAweDAwMUMsIDB4MDAwQywgMHgwMDA0LCAweDAwMDAsIDB4MDAwNSwgMHgwMDBELAorICAgIDB4MDAxRCwgMHgwMDdBLCAweDAwN0MsIDB4MDBGQiwgMHgwMUY4LCAweDAxRkIsIDB4MDNGOSwgMHgwM0ZBLAorICAgIDB4MDNGQywgMHgwRkY2LCAweDBGRjksIDB4MUZGNSwgMHgxRkY5LCAweDFGRjYsIDB4MUZGQSwgMHgxRkZELAorICAgIDB4M0ZGRCwgMHhGRkZGLCAweDdGRkUsIDB4N0ZGQywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjbHZfYmlhc3ZfMl9zeW1zW10gPSB7CisgICAgMHhGRkFDLCAweEZGQjAsIDB4RkZCNCwgMHhGRkI4LCAweEZGQkMsIDB4RkZDMCwgMHhGRkM0LCAweEZGQzgsCisgICAgMHhGRkNDLCAweEZGRDAsIDB4RkZENCwgMHhGRkQ4LCAweEZGREMsIDB4RkZFMCwgMHhGRkU0LCAweEZGRTgsCisgICAgMHhGRkVDLCAweEZGRjAsIDB4RkZGNCwgMHhGRkY4LCAweEZGRkMsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDgsCisgICAgMHgwMDBDLCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4LCAweDAwMUMsIDB4MDAyMCwgMHgwMDI0LCAweDAwMjgsCisgICAgMHgwMDJDLCAweDAwMzAsIDB4MDAzNCwgMHgwMDM4LCAweDAwM0MsIDB4MDA0MCwgMHgwMDQ0LCAweDAwNDgsCisgICAgMHgwMDRDLCAweDAwNTAsIDB4MDA1NCwgMHgwMTAwLAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfQ0xFQVJWSURFT0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jbGxjLmMgYi9saWJhdmNvZGVjL2NsbGMuYwppbmRleCAxYzY5MDJhLi5hZjBmNmRhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2NsbGMuYworKysgYi9saWJhdmNvZGVjL2NsbGMuYwpAQCAtMjgsNiArMjgsMTEgQEAKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCisjZGVmaW5lIFZMQ19CSVRTIDcKKyNkZWZpbmUgVkxDX0RFUFRIIDIKKwogCiB0eXBlZGVmIHN0cnVjdCBDTExDQ29udGV4dCB7CiAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwpAQCAtNTEsNiArNTYsMTMgQEAKIAogICAgIG51bV9sZW5zID0gZ2V0X2JpdHMoZ2IsIDUpOwogCisgICAgaWYgKG51bV9sZW5zID4gVkxDX0JJVFMgKiBWTENfREVQVEgpIHsKKyAgICAgICAgdmxjLT50YWJsZSA9IE5VTEw7CisKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvIGxvbmcgVkxDcyAlZFxuIiwgbnVtX2xlbnMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2xlbnM7IGkrKykgewogICAgICAgICBudW1fY29kZXMgICAgICA9IGdldF9iaXRzKGdiLCA5KTsKICAgICAgICAgbnVtX2NvZGVzX3N1bSArPSBudW1fY29kZXM7CkBAIC03MCwxMSArODIsMTUgQEAKIAogICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgfQorICAgICAgICBpZiAocHJlZml4ID4gKDY1NTM1IC0gMjU2KS8yKSB7CisgICAgICAgICAgICB2bGMtPnRhYmxlID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAKICAgICAgICAgcHJlZml4IDw8PSAxOwogICAgIH0KIAotICAgIHJldHVybiBmZl9pbml0X3ZsY19zcGFyc2UodmxjLCA3LCBjb3VudCwgYml0cywgMSwgMSwKKyAgICByZXR1cm4gZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgVkxDX0JJVFMsIGNvdW50LCBiaXRzLCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXMsIDIsIDIsIHN5bWJvbHMsIDEsIDEsIDApOwogfQogCkBAIC0xMDEsNyArMTE3LDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5hdmN0eC0+d2lkdGg7IGkrKykgewogICAgICAgICAvKiBBbHdheXMgZ2V0IHRoZSBhbHBoYSBjb21wb25lbnQgKi8KICAgICAgICAgVVBEQVRFX0NBQ0hFKGJpdHMsIGdiKTsKLSAgICAgICAgR0VUX1ZMQyhjb2RlLCBiaXRzLCBnYiwgdmxjWzBdLnRhYmxlLCA3LCAyKTsKKyAgICAgICAgR0VUX1ZMQyhjb2RlLCBiaXRzLCBnYiwgdmxjWzBdLnRhYmxlLCBWTENfQklUUywgVkxDX0RFUFRIKTsKIAogICAgICAgICBwcmVkWzBdICs9IGNvZGU7CiAgICAgICAgIGRzdFswXSAgID0gcHJlZFswXTsKQEAgLTExMCwyMSArMTI2LDIxIEBACiAgICAgICAgIGlmIChkc3RbMF0pIHsKICAgICAgICAgICAgIC8qIFJlZCAqLwogICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKGJpdHMsIGdiKTsKLSAgICAgICAgICAgIEdFVF9WTEMoY29kZSwgYml0cywgZ2IsIHZsY1sxXS50YWJsZSwgNywgMik7CisgICAgICAgICAgICBHRVRfVkxDKGNvZGUsIGJpdHMsIGdiLCB2bGNbMV0udGFibGUsIFZMQ19CSVRTLCBWTENfREVQVEgpOwogCiAgICAgICAgICAgICBwcmVkWzFdICs9IGNvZGU7CiAgICAgICAgICAgICBkc3RbMV0gICA9IHByZWRbMV07CiAKICAgICAgICAgICAgIC8qIEdyZWVuICovCiAgICAgICAgICAgICBVUERBVEVfQ0FDSEUoYml0cywgZ2IpOwotICAgICAgICAgICAgR0VUX1ZMQyhjb2RlLCBiaXRzLCBnYiwgdmxjWzJdLnRhYmxlLCA3LCAyKTsKKyAgICAgICAgICAgIEdFVF9WTEMoY29kZSwgYml0cywgZ2IsIHZsY1syXS50YWJsZSwgVkxDX0JJVFMsIFZMQ19ERVBUSCk7CiAKICAgICAgICAgICAgIHByZWRbMl0gKz0gY29kZTsKICAgICAgICAgICAgIGRzdFsyXSAgID0gcHJlZFsyXTsKIAogICAgICAgICAgICAgLyogQmx1ZSAqLwogICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKGJpdHMsIGdiKTsKLSAgICAgICAgICAgIEdFVF9WTEMoY29kZSwgYml0cywgZ2IsIHZsY1szXS50YWJsZSwgNywgMik7CisgICAgICAgICAgICBHRVRfVkxDKGNvZGUsIGJpdHMsIGdiLCB2bGNbM10udGFibGUsIFZMQ19CSVRTLCBWTENfREVQVEgpOwogCiAgICAgICAgICAgICBwcmVkWzNdICs9IGNvZGU7CiAgICAgICAgICAgICBkc3RbM10gICA9IHByZWRbM107CkBAIC0xNjYsNyArMTgyLDcgQEAKICAgICAvKiBTaW11bHRhbmVvdXNseSByZWFkIGFuZCByZXN0b3JlIHRoZSBsaW5lICovCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+YXZjdHgtPndpZHRoOyBpKyspIHsKICAgICAgICAgVVBEQVRFX0NBQ0hFKGJpdHMsIGdiKTsKLSAgICAgICAgR0VUX1ZMQyhjb2RlLCBiaXRzLCBnYiwgdmxjLT50YWJsZSwgNywgMik7CisgICAgICAgIEdFVF9WTEMoY29kZSwgYml0cywgZ2IsIHZsYy0+dGFibGUsIFZMQ19CSVRTLCBWTENfREVQVEgpOwogCiAgICAgICAgIHByZWQgICs9IGNvZGU7CiAgICAgICAgIGRzdFswXSA9IHByZWQ7CkBAIC0xOTUsNyArMjExLDcgQEAKICAgICAvKiBTaW11bHRhbmVvdXNseSByZWFkIGFuZCByZXN0b3JlIHRoZSBsaW5lICovCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+YXZjdHgtPndpZHRoID4+IGlzX2Nocm9tYTsgaSsrKSB7CiAgICAgICAgIFVQREFURV9DQUNIRShiaXRzLCBnYik7Ci0gICAgICAgIEdFVF9WTEMoY29kZSwgYml0cywgZ2IsIHZsYy0+dGFibGUsIDcsIDIpOworICAgICAgICBHRVRfVkxDKGNvZGUsIGJpdHMsIGdiLCB2bGMtPnRhYmxlLCBWTENfQklUUywgVkxDX0RFUFRIKTsKIAogICAgICAgICBwcmVkICAgICArPSBjb2RlOwogICAgICAgICBvdXRidWZbaV0gPSBwcmVkOwpAQCAtMzU3LDYgKzM3Myw3IEBACiB7CiAgICAgQ0xMQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgQVZGcmFtZSAqcGljID0gZGF0YTsKKyAgICBUaHJlYWRGcmFtZSBmcmFtZSA9IHsgLmYgPSBkYXRhIH07CiAgICAgdWludDhfdCAqc3JjID0gYXZwa3QtPmRhdGE7CiAgICAgdWludDMyX3QgaW5mb190YWcsIGluZm9fb2Zmc2V0OwogICAgIGludCBkYXRhX3NpemU7CkBAIC00MTIsMTIgKzQyOSwxNSBAQAogICAgIGNvZGluZ190eXBlID0gKEFWX1JMMzIoc3JjKSA+PiA4KSAmIDB4RkY7CiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJGcmFtZSBjb2RpbmcgdHlwZTogJWRcbiIsIGNvZGluZ190eXBlKTsKIAorICAgIGlmKGdldF9iaXRzX2xlZnQoJmdiKSA8IGF2Y3R4LT5oZWlnaHQgKiBhdmN0eC0+d2lkdGgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgc3dpdGNoIChjb2RpbmdfdHlwZSkgewogICAgIGNhc2UgMDoKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CiAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gODsKIAotICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHBpYywgMCkpIDwgMCkKKyAgICAgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgICAgICByZXQgPSBkZWNvZGVfeXV2X2ZyYW1lKGN0eCwgJmdiLCBwaWMpOwpAQCAtNDMwLDcgKzQ1MCw3IEBACiAgICAgICAgIGF2Y3R4LT5waXhfZm10ICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9SR0IyNDsKICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA4OwogCi0gICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZnJhbWUsIDApKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgIHJldCA9IGRlY29kZV9yZ2IyNF9mcmFtZShjdHgsICZnYiwgcGljKTsKQEAgLTQ0Miw3ICs0NjIsNyBAQAogICAgICAgICBhdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfQVJHQjsKICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA4OwogCi0gICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgICAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZnJhbWUsIDApKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgIHJldCA9IGRlY29kZV9hcmdiX2ZyYW1lKGN0eCwgJmdiLCBwaWMpOwpAQCAtNDYzLDYgKzQ4MywxOSBAQAogICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKIH0KIAorI2lmIEhBVkVfVEhSRUFEUworc3RhdGljIGludCBjbGxjX2luaXRfdGhyZWFkX2NvcHkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENMTENDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgY3R4LT5hdmN0eCAgICAgICAgICAgID0gYXZjdHg7CisgICAgY3R4LT5zd2FwcGVkX2J1ZiAgICAgID0gTlVMTDsKKyAgICBjdHgtPnN3YXBwZWRfYnVmX3NpemUgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKwogc3RhdGljIGF2X2NvbGQgaW50IGNsbGNfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBDTExDQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKQEAgLTQ5Myw3ICs1MjYsOSBAQAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NMTEMsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENMTENDb250ZXh0KSwKICAgICAuaW5pdCAgICAgICAgICAgPSBjbGxjX2RlY29kZV9pbml0LAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoY2xsY19pbml0X3RocmVhZF9jb3B5KSwKICAgICAuZGVjb2RlICAgICAgICAgPSBjbGxjX2RlY29kZV9mcmFtZSwKICAgICAuY2xvc2UgICAgICAgICAgPSBjbGxjX2RlY29kZV9jbG9zZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY25nZGVjLmMgYi9saWJhdmNvZGVjL2NuZ2RlYy5jCmluZGV4IDAyNTEwODYuLjI4NDMyYWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY25nZGVjLmMKKysrIGIvbGliYXZjb2RlYy9jbmdkZWMuYwpAQCAtMjIsNyArMjIsOCBAQAogI2luY2x1ZGUgPG1hdGguaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmZtYXRoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJjZWxwX2ZpbHRlcnMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMTIwLDYgKzEyMSwxMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzID4gMTAgKiBhdmN0eC0+ZnJhbWVfc2l6ZSkgeworICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIGlmIChwLT5pbml0ZWQpIHsKICAgICAgICAgcC0+ZW5lcmd5ID0gcC0+ZW5lcmd5IC8gMiArIHAtPnRhcmdldF9lbmVyZ3kgLyAyOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcC0+b3JkZXI7IGkrKykKQEAgLTE0Nyw3ICsxNTMsNyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIGJ1Zl9vdXQgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOwogICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+ZnJhbWVfc2l6ZTsgaSsrKQotICAgICAgICBidWZfb3V0W2ldID0gcC0+ZmlsdGVyX291dFtpICsgcC0+b3JkZXJdOworICAgICAgICBidWZfb3V0W2ldID0gYXZfY2xpcF9pbnQxNihwLT5maWx0ZXJfb3V0W2kgKyBwLT5vcmRlcl0pOwogICAgIG1lbWNweShwLT5maWx0ZXJfb3V0LCBwLT5maWx0ZXJfb3V0ICsgYXZjdHgtPmZyYW1lX3NpemUsCiAgICAgICAgICAgIHAtPm9yZGVyICogc2l6ZW9mKCpwLT5maWx0ZXJfb3V0KSk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY25nZW5jLmMgYi9saWJhdmNvZGVjL2NuZ2VuYy5jCmluZGV4IDMwMmM3MDMuLmUxODVjNGEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY25nZW5jLmMKKysrIGIvbGliYXZjb2RlYy9jbmdlbmMuYwpAQCAtOTEsNyArOTEsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIHFkYm92ID0gMTI3OwogICAgIH0KLSAgICByZXQgPSBmZl9scGNfY2FsY19yZWZfY29lZnMoJnAtPmxwYywgcC0+c2FtcGxlczMyLCBwLT5vcmRlciwgcC0+cmVmX2NvZWYpOworICAgIGZmX2xwY19jYWxjX3JlZl9jb2VmcygmcC0+bHBjLCBwLT5zYW1wbGVzMzIsIHAtPm9yZGVyLCBwLT5yZWZfY29lZik7CiAgICAgYXZwa3QtPmRhdGFbMF0gPSBxZGJvdjsKICAgICBmb3IgKGkgPSAwOyBpIDwgcC0+b3JkZXI7IGkrKykKICAgICAgICAgYXZwa3QtPmRhdGFbMSArIGldID0gcC0+cmVmX2NvZWZbaV0gKiAxMjcgKyAxMjc7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2NvZGVjMnV0aWxzLmMgYi9saWJhdmNvZGVjL2NvZGVjMnV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMxNDc4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvY29kZWMydXRpbHMuYwpAQCAtMCwwICsxLDgwIEBACisvKgorICogY29kZWMyIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVG9tYXMgSMOkcmRpbgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2NvZGVjMnV0aWxzLmgiCisKK2ludCBhdnByaXZfY29kZWMyX21vZGVfYml0X3JhdGUodm9pZCAqbG9nY3R4LCBpbnQgbW9kZSkKK3sKKyAgICBpbnQgZnJhbWVfc2l6ZSAgPSBhdnByaXZfY29kZWMyX21vZGVfZnJhbWVfc2l6ZShsb2djdHgsIG1vZGUpOworICAgIGludCBibG9ja19hbGlnbiA9IGF2cHJpdl9jb2RlYzJfbW9kZV9ibG9ja19hbGlnbihsb2djdHgsIG1vZGUpOworCisgICAgaWYgKGZyYW1lX3NpemUgPD0gMCB8fCBibG9ja19hbGlnbiA8PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiA4ICogODAwMCAqIGJsb2NrX2FsaWduIC8gZnJhbWVfc2l6ZTsKK30KKworaW50IGF2cHJpdl9jb2RlYzJfbW9kZV9mcmFtZV9zaXplKHZvaWQgKmxvZ2N0eCwgaW50IG1vZGUpCit7CisgICAgaW50IGZyYW1lX3NpemVfdGFibGVbQVZQUklWX0NPREVDMl9NT0RFX01BWCsxXSA9IHsKKyAgICAgICAgMTYwLCAgICAvLyAzMjAwCisgICAgICAgIDE2MCwgICAgLy8gMjQwMAorICAgICAgICAzMjAsICAgIC8vIDE2MDAKKyAgICAgICAgMzIwLCAgICAvLyAxNDAwCisgICAgICAgIDMyMCwgICAgLy8gMTMwMAorICAgICAgICAzMjAsICAgIC8vIDEyMDAKKyAgICAgICAgMzIwLCAgICAvLyA3MDAKKyAgICAgICAgMzIwLCAgICAvLyA3MDBCCisgICAgICAgIDMyMCwgICAgLy8gNzAwQworICAgIH07CisKKyAgICBpZiAobW9kZSA8IDAgfHwgbW9kZSA+IEFWUFJJVl9DT0RFQzJfTU9ERV9NQVgpIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLCAidW5rbm93biBjb2RlYzIgbW9kZSAlaSwgY2FuJ3QgZmluZCBmcmFtZV9zaXplXG4iLCBtb2RlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGZyYW1lX3NpemVfdGFibGVbbW9kZV07CisgICAgfQorfQorCitpbnQgYXZwcml2X2NvZGVjMl9tb2RlX2Jsb2NrX2FsaWduKHZvaWQgKmxvZ2N0eCwgaW50IG1vZGUpCit7CisgICAgaW50IGJsb2NrX2FsaWduX3RhYmxlW0FWUFJJVl9DT0RFQzJfTU9ERV9NQVgrMV0gPSB7CisgICAgICAgIDgsICAgICAgLy8gMzIwMAorICAgICAgICA2LCAgICAgIC8vIDI0MDAKKyAgICAgICAgOCwgICAgICAvLyAxNjAwCisgICAgICAgIDcsICAgICAgLy8gMTQwMAorICAgICAgICA3LCAgICAgIC8vIDEzMDAKKyAgICAgICAgNiwgICAgICAvLyAxMjAwCisgICAgICAgIDQsICAgICAgLy8gNzAwCisgICAgICAgIDQsICAgICAgLy8gNzAwQgorICAgICAgICA0LCAgICAgIC8vIDcwMEMKKyAgICB9OworCisgICAgaWYgKG1vZGUgPCAwIHx8IG1vZGUgPiBBVlBSSVZfQ09ERUMyX01PREVfTUFYKSB7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgInVua25vd24gY29kZWMyIG1vZGUgJWksIGNhbid0IGZpbmQgYmxvY2tfYWxpZ25cbiIsIG1vZGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gYmxvY2tfYWxpZ25fdGFibGVbbW9kZV07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jb2RlYzJ1dGlscy5oIGIvbGliYXZjb2RlYy9jb2RlYzJ1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZWY0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2NvZGVjMnV0aWxzLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIGNvZGVjMiB1dGlsaXR5IGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDE3IFRvbWFzIEjDpHJkaW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0NPREVDMlVUSUxTX0gKKyNkZWZpbmUgQVZDT0RFQ19DT0RFQzJVVElMU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLy9IaWdoZXN0IG1vZGUgd2UncmUgd2lsbGluZyB0byB1c2UuCisvL0Rvbid0IHdhbnQgdG8gbGV0IHVzZXJzIGFjY2lkZW50YWxseSBwcm9kdWNlIGZpbGVzIHRoYXQgY2FuJ3QgYmUgZGVjb2RlZCBpbiB0aGUgZnV0dXJlLgorLy9DT0RFQzJfTU9ERV9XQiAoOSkgaXMgZXhwZXJpbWVudGFsL3Vuc3RhYmxlIGFzIG9mIDIwMTctMTEtMjMuCisjZGVmaW5lIEFWUFJJVl9DT0RFQzJfTU9ERV9NQVggOCAvL0NPREVDMl9NT0RFXzcwMEMKKworLy9Vc2VkIGJ5IGJvdGggY29kZWMycmF3IGRlbXV4ZXIgYW5kIGxpYmNvZGVjMiBlbmNvZGVyLgorLy9UaGUgaW50ZWdlcnMgbWF0Y2ggdGhlIHZhbHVlcyBpbiBjb2RlYzIuaCwgc28gIjMyMDAiIC0+IENPREVDMl9NT0RFXzMwMDAgPSAwIGFuZCBzbyBvbi4KKy8vSXQgaXMgcG9zc2libGUgdGhhdCB3ZSdyZSBsaW5rZWQgdG8gYSB2ZXJzaW9uIG9mIGxpYmNvZGVjMiB0aGF0IGxhY2tzIHNvbWUgb2YgdGhlc2UgbW9kZXMuCisvL0ZvciBleGFtcGxlIERlYmlhbiBzdHJldGNoIHNoaXBzIHdpdGggbGliY29kZWMyLnNvLjAuNCB3aGljaCBsYWNrcyBDT0RFQzJfTU9ERV83MDBDLgorI2RlZmluZSBBVlBSSVZfQ09ERUMyX0FWT1BUSU9OUyhkZXNjLCBjbGFzc25hbWUsIG1pbl92YWwsIGRlZmF1bHRfdmFsLCBvcHRpb25fZmxhZ3MpIFwKKyAgICB7ICJtb2RlIiwgZGVzYywgb2Zmc2V0b2YoY2xhc3NuYW1lLCBtb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IGRlZmF1bHRfdmFsfSwgbWluX3ZhbCwgQVZQUklWX0NPREVDMl9NT0RFX01BWCwgLmZsYWdzPW9wdGlvbl9mbGFncywgLnVuaXQ9ImNvZGVjMl9tb2RlIn0sXAorICAgIHsgIjMyMDAiLCAiMzIwMCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDB9LCAuZmxhZ3M9b3B0aW9uX2ZsYWdzLCAudW5pdD0iY29kZWMyX21vZGUifSxcCisgICAgeyAiMjQwMCIsICIyNDAwIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMX0sIC5mbGFncz1vcHRpb25fZmxhZ3MsIC51bml0PSJjb2RlYzJfbW9kZSJ9LFwKKyAgICB7ICIxNjAwIiwgIjE2MDAiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAyfSwgLmZsYWdzPW9wdGlvbl9mbGFncywgLnVuaXQ9ImNvZGVjMl9tb2RlIn0sXAorICAgIHsgIjE0MDAiLCAiMTQwMCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDN9LCAuZmxhZ3M9b3B0aW9uX2ZsYWdzLCAudW5pdD0iY29kZWMyX21vZGUifSxcCisgICAgeyAiMTMwMCIsICIxMzAwIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gNH0sIC5mbGFncz1vcHRpb25fZmxhZ3MsIC51bml0PSJjb2RlYzJfbW9kZSJ9LFwKKyAgICB7ICIxMjAwIiwgIjEyMDAiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSA1fSwgLmZsYWdzPW9wdGlvbl9mbGFncywgLnVuaXQ9ImNvZGVjMl9tb2RlIn0sXAorICAgIHsgIjcwMCIsICAiNzAwIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDZ9LCAuZmxhZ3M9b3B0aW9uX2ZsYWdzLCAudW5pdD0iY29kZWMyX21vZGUifSxcCisgICAgeyAiNzAwQiIsICI3MDBCIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gN30sIC5mbGFncz1vcHRpb25fZmxhZ3MsIC51bml0PSJjb2RlYzJfbW9kZSJ9LFwKKyAgICB7ICI3MDBDIiwgIjcwMEMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSA4fSwgLmZsYWdzPW9wdGlvbl9mbGFncywgLnVuaXQ9ImNvZGVjMl9tb2RlIn0KKworLy9UaGUgdGhyZWUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgaGVyZSB0byBhdm9pZCBuZWVkaW5nIGxpYmF2Zm9ybWF0L2NvZGVjMi5jIHRvIGRlcGVuZCBvbiBsaWJjb2RlYzIKKworLy9Db21wdXRlcyBiaXRyYXRlIGZyb20gbW9kZSwgd2l0aCBmcmFtZXMgcm91bmRlZCB1cCB0byB0aGUgbmVhcmVzdCBvY3RldC4KKy8vU28gNzAwIGJpdC9zICgyOCBiaXRzL2ZyYW1lKSBiZWNvbWVzIDgwMCBiaXRzL3MgKDMyIGJpdHMvZnJhbWUpLgorLy9sb2djdHggaXMgdXNlZCBmb3IgYXZfbG9nKCkKKy8vUmV0dXJucyA8MCBpZiBtb2RlIGlzIGludmFsaWQKK2ludCBhdnByaXZfY29kZWMyX21vZGVfYml0X3JhdGUodm9pZCAqbG9nY3R4LCBpbnQgbW9kZSk7CisKKy8vTWltaWNzIGNvZGVjMl9zYW1wbGVzX3Blcl9mcmFtZSgpCitpbnQgYXZwcml2X2NvZGVjMl9tb2RlX2ZyYW1lX3NpemUodm9pZCAqbG9nY3R4LCBpbnQgbW9kZSk7CisKKy8vTWltaWNzIChjb2RlYzJfYml0c19wZXJfZnJhbWUoKSs3KS84CitpbnQgYXZwcml2X2NvZGVjMl9tb2RlX2Jsb2NrX2FsaWduKHZvaWQgKmxvZ2N0eCwgaW50IG1vZGUpOworCisjZGVmaW5lIEFWUFJJVl9DT0RFQzJfRVhUUkFEQVRBX1NJWkUgNAorCisvL1VzZWQgaW4gY29kZWMycmF3IGRlbXV4ZXIgYW5kIGxpYmNvZGVjMiBlbmNvZGVyCitzdGF0aWMgaW5saW5lIHZvaWQgYXZwcml2X2NvZGVjMl9tYWtlX2V4dHJhZGF0YSh1aW50OF90ICpwdHIsIGludCBtb2RlKSB7CisgICAgLy92ZXJzaW9uIDAuOCBhcyBvZiAyMDE3LTEyLTIzIChyMzM4NikKKyAgICBwdHJbMF0gPSAwOyAgICAgLy9tYWpvcgorICAgIHB0clsxXSA9IDg7ICAgICAvL21pbm9yCisgICAgcHRyWzJdID0gbW9kZTsgIC8vbW9kZQorICAgIHB0clszXSA9IDA7ICAgICAvL2ZsYWdzCit9CisKKy8vUmV0dXJucyB2ZXJzaW9uIGFzIGEgMTYtYml0IHZhbHVlLiAwLjggLT4gMHgwMDA4CitzdGF0aWMgaW5saW5lIHVpbnQxNl90IGF2cHJpdl9jb2RlYzJfdmVyc2lvbl9mcm9tX2V4dHJhZGF0YSh1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gKHB0clswXSA8PCA4KSArIHB0clsxXTsKK30KKworc3RhdGljIGlubGluZSB1aW50OF90IGF2cHJpdl9jb2RlYzJfbW9kZV9mcm9tX2V4dHJhZGF0YSh1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzJdOworfQorCisjZW5kaWYgLyogQVZDT0RFQ19DT0RFQzJVVElMU19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2NvZGVjX2Rlc2MuYyBiL2xpYmF2Y29kZWMvY29kZWNfZGVzYy5jCmluZGV4IDY3MmJmM2YuLjc5NTUyYTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY29kZWNfZGVzYy5jCisrKyBiL2xpYmF2Y29kZWMvY29kZWNfZGVzYy5jCkBAIC00NiwxNSArNDYsNiBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfUkVPUkRFUiwKICAgICAgICAgLnByb2ZpbGVzICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX21wZWcyX3ZpZGVvX3Byb2ZpbGVzKSwKICAgICB9LAotI2lmIEZGX0FQSV9YVk1DCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFT19YVk1DLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gIm1wZWd2aWRlb194dm1jIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTEvMiB2aWRlbyBYdk1DIChYLVZpZGVvIE1vdGlvbiBDb21wZW5zYXRpb24pIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAotICAgIH0sCi0jZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KICAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYxLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLApAQCAtOTksNiArOTAsMjggQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9MSlBFRywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJsanBlZyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTG9zc2xlc3MgSlBFRyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NQNVgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic3A1eCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3VucGx1cyBKUEVHIChTUDVYKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0pQRUdMUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJqcGVnbHMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkpQRUctTFMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1kgfAorICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gIm1wZWc0IiwKQEAgLTQwOSwxMyArNDIyLDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TTk9XLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gInNub3ciLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNub3ciKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgIH0sCi0gICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVFNDQywKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJ0c2NjIiwKQEAgLTQ1MSw2ICs0NTcsNTAgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QTkcsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicG5nIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQTkcgKFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MpIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgICAgICAubWltZV90eXBlcz0gTVQoImltYWdlL3BuZyIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUFBNLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInBwbSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUFBNIChQb3J0YWJsZSBQaXhlbE1hcCkgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQk0sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGJtIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQk0gKFBvcnRhYmxlIEJpdE1hcCkgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QR00sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGdtIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQR00gKFBvcnRhYmxlIEdyYXlNYXApIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUEdNWVVWLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInBnbXl1diIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEdNWVVWIChQb3J0YWJsZSBHcmF5TWFwIFlVVikgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQU0sCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGFtIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQU0gKFBvcnRhYmxlIEFueU1hcCkgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAiKSwKKyAgICB9LAorICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0ZGVkhVRkYsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiZmZ2aHVmZiIsCkBAIC01MjAsNyArNTcwLDcgQEAKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJmcmFwcyIsCiAgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRnJhcHMiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAogICAgIH0sCiAgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVFJVRU1PVElPTjIsCkBAIC02MzksNiArNjg5LDE0IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVEFSR0EsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidGFyZ2EiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRydWV2aXNpb24gVGFyZ2EgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC10YXJnYSIsICJpbWFnZS94LXRnYSIpLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRFNJQ0lOVklERU8sCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiZHNpY2ludmlkZW8iLApAQCAtNjUzLDYgKzcxMSwyMiBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAogICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RJRkYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidGlmZiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVElGRiBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS90aWZmIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9HSUYsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZ2lmIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHSUYgKEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UvZ2lmIiksCisgICAgfSwKKyAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EWEEsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiZHhhIiwKQEAgLTY2NSw2ICs3MzksNyBAQAogICAgICAgICAubmFtZSAgICAgID0gImRueGhkIiwKICAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWQzMvRE54SEQiKSwKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgICAgIC5wcm9maWxlcyAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl9kbnhoZF9wcm9maWxlcyksCiAgICAgfSwKICAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9USFAsCkBAIC02NzQsNiArNzQ5LDEzIEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU0dJLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNnaSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0dJIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQzkzLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gImM5MyIsCkBAIC02ODgsNiArNzcwLDIwIEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUFRYLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInB0eCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVi5GbGFzaCBQVFggaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UWEQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidHhkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZW5kZXJ3YXJlIFRYRCAoVGVYdHVyZSBEaWN0aW9uYXJ5KSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZQNkEsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAidnA2YSIsCkBAIC03MDksNiArODA1LDIxIEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENYLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInBjeCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEMgUGFpbnRicnVzaCBQQ1ggaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC1wY3giKSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NVTlJBU1QsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic3VucmFzdCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3VuIFJhc3RlcmZpbGUgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9JTkRFTzQsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiaW5kZW80IiwKQEAgLTc0NCwxMyArODU1LDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EQUFMQSwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJkYWFsYSIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGFhbGEiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgIH0sCi0gICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRElSQUMsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiZGlyYWMiLApAQCAtODM1LDYgKzkzOSwxMyBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAogICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RQWCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJkcHgiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQWCAoRGlnaXRhbCBQaWN0dXJlIEV4Y2hhbmdlKSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01BRCwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJtYWQiLApAQCAtODg3LDcgKzk5OCw3IEBACiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9JRkZfSUxCTSwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJpZmZfaWxibSIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSUZGIElMQk0iKSwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJJRkYgQUNCTS9BTklNL0RFRVAvSUxCTS9QQk0vUkdCOC9SR0JOIiksCiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgewpAQCAtOTEyLDE0ICsxMDIzLDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDksCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAidnA5IiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHb29nbGUgVlA5IiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAotICAgICAgICAucHJvZmlsZXMgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoZmZfdnA5X3Byb2ZpbGVzKSwKLSAgICB9LAotICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BJQ1RPUiwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJwaWN0b3IiLApAQCAtOTI3LDYgKzEwMzAsMTMgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BTlNJLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImFuc2kiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTQ0lJL0FOU0kgYXJ0IiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQTY0X01VTFRJLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gImE2NF9tdWx0aSIsCkBAIC05NDgsMjAgKzEwNTgsNiBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01WQzEsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAibXZjMSIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2lsaWNvbiBHcmFwaGljcyBNb3Rpb24gVmlkZW8gQ29tcHJlc3NvciAxIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVZDMiwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJtdmMyIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaWxpY29uIEdyYXBoaWNzIE1vdGlvbiBWaWRlbyBDb21wcmVzc29yIDIiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCi0gICAgfSwKLSAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NWFBFRywKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJteHBlZyIsCkBAIC05OTcsNiArMTA5MywyMCBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAogICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjNJTUFHRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3bXYzaW1hZ2UiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldpbmRvd3MgTWVkaWEgVmlkZW8gOSBJbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMUlNQUdFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInZjMWltYWdlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDkgSW1hZ2UgdjIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9VVFZJREVPLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gInV0dmlkZW8iLApAQCAtMTAzMiw2ICsxMTQyLDE0IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWFdELAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInh3ZCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWFdEIChYIFdpbmRvdyBEdW1wKSBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS94LXh3aW5kb3dkdW1wIiksCisgICAgfSwKKyAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9DRFhMLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gImNkeGwiLApAQCAtMTAzOSw2ICsxMTU3LDE0IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWEJNLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInhibSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWEJNIChYIEJpdE1hcCkgaW1hZ2UiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC14Yml0bWFwIiksCisgICAgfSwKKyAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9aRVJPQ09ERUMsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiemVyb2NvZGVjIiwKQEAgLTEwODgsNiArMTIxNCwxNCBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAogICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZQOSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2cDkiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdvb2dsZSBWUDkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgICAgIC5wcm9maWxlcyAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl92cDlfcHJvZmlsZXMpLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQUlDLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gImFpYyIsCkBAIC0xMDk1LDEzICsxMjI5LDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9ZNDFQLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gInk0MXAiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBZVVYgNDoxOjEgMTItYml0IiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFksCi0gICAgfSwKLSAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9FU0NBUEUxMzAsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiZXNjYXBlMTMwIiwKQEAgLTExMDksODggKzEyMzYsNiBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FWUlAsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAiYXZycCIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXZpZCAxOjEgMTAtYml0IFJHQiBQYWNrZXIiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEXzAxMlYsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAiMDEydiIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIDQ6MjoyIDEwLWJpdCIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVZVSSwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJhdnVpIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIE1lcmlkaWVuIFVuY29tcHJlc3NlZCIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVlVViwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJheXV2IiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgcGFja2VkIE1TIDQ6NDo0OjQiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RBUkdBX1kyMTYsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAidGFyZ2FfeTIxNiIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUGlubmFjbGUgVEFSR0EgQ2luZVdhdmUgWVVWMTYiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1YzMDgsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAidjMwOCIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIHBhY2tlZCA0OjQ6NCIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVjQwOCwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJ2NDA4IiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgcGFja2VkIFFUIDQ6NDo0OjQiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1lVVjQsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAieXV2NCIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIHBhY2tlZCA0OjI6MCIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVZSTiwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJhdnJuIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIEFWSSBDb2RlYyIpLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQ1BJQSwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJjcGlhIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDUGlBIHZpZGVvIGZvcm1hdCIpLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWEZBQ0UsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAieGZhY2UiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlgtZmFjZSBpbWFnZSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NNVkpQRUcsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAic212anBlZyIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2lnbWF0ZWwgTW90aW9uIFZpZGVvIiksCi0gICAgfSwKLQotICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0cyTSwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJnMm0iLApAQCAtMTE5OCw2ICsxMjQzLDE1IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfV0VCUCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3ZWJwIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXZWJQIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZIHwKKyAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2Uvd2VicCIpLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSE5NNF9WSURFTywKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJobm00dmlkZW8iLApAQCAtMTIyMCw2ICsxMjc0LDIwIEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQUxJQVNfUElYLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImFsaWFzX3BpeCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQWxpYXMvV2F2ZWZyb250IFBJWCBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0JSRU5ERVJfUElYLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImJyZW5kZXJfcGl4IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCUmVuZGVyIFBJWCBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BBRl9WSURFTywKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJwYWZfdmlkZW8iLApAQCAtMTIyNyw2ICsxMjk1LDE0IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRVhSLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImV4ciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT3BlbkVYUiBpbWFnZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSB8CisgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVlA3LAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gInZwNyIsCkBAIC0xMjQ4LDYgKzEzMjQsMjAgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NVkMxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm12YzEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNpbGljb24gR3JhcGhpY3MgTW90aW9uIFZpZGVvIENvbXByZXNzb3IgMSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01WQzIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXZjMiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2lsaWNvbiBHcmFwaGljcyBNb3Rpb24gVmlkZW8gQ29tcHJlc3NvciAyIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSFFYLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gImhxeCIsCkBAIC0xMjU1LDYgKzEzNDUsMTMgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9URFNDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInRkc2MiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlREU0MiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9IUV9IUUEsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiaHFfaHFhIiwKQEAgLTEyNjUsMTAgKzEzNjIsMTggQEAKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0hBUCwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJoYXAiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZpZHZveCBIYXAgZGVjb2RlciIpLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZpZHZveCBIYXAiKSwKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9ERFMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZGRzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEaXJlY3REcmF3IFN1cmZhY2UgaW1hZ2UgZGVjb2RlciIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSB8CisgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRFhWLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAubmFtZSAgICAgID0gImR4diIsCkBAIC0xMjgzLDIzNSArMTM4OCwxMDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9XUkFQUEVEX0FWRlJBTUUsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAid3JhcHBlZF9hdmZyYW1lIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVkZyYW1lIHRvIEFWUGFja2V0IHBhc3N0aHJvdWdoIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgIH0sCi0gICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUlNDQywKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJyc2NjIiwKICAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJpbm5vSGVpbS9Sc3VwcG9ydCBTY3JlZW4gQ2FwdHVyZSBDb2RlYyIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAotCi0gICAgLyogaW1hZ2UgY29kZWNzICovCiAgICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQUxJQVNfUElYLAorICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWTQxUCwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJhbGlhc19waXgiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFsaWFzL1dhdmVmcm9udCBQSVggaW1hZ2UiKSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJ5NDFwIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgWVVWIDQ6MToxIDEyLWJpdCIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FOU0ksCisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BVlJQLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gImFuc2kiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTQ0lJL0FOU0kgYXJ0IiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQlJFTkRFUl9QSVgsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAiYnJlbmRlcl9waXgiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJSZW5kZXIgUElYIGltYWdlIiksCisgICAgICAgIC5uYW1lICAgICAgPSAiYXZycCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXZpZCAxOjEgMTAtYml0IFJHQiBQYWNrZXIiKSwKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9ERFMsCisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF8wMTJWLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gImRkcyIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGlyZWN0RHJhdyBTdXJmYWNlIGltYWdlIGRlY29kZXIiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1kgfAotICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RQWCwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJkcHgiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQWCAoRGlnaXRhbCBQaWN0dXJlIEV4Y2hhbmdlKSBpbWFnZSIpLAorICAgICAgICAubmFtZSAgICAgID0gIjAxMnYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCA0OjI6MiAxMC1iaXQiKSwKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9FWFIsCisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BVlVJLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gImV4ciIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT3BlbkVYUiBpbWFnZSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSB8Ci0gICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfR0lGLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gImdpZiIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR0lGIChHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQpIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgICAgICAubWltZV90eXBlcz0gTVQoImltYWdlL2dpZiIpLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSlBFR0xTLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gImpwZWdscyIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSlBFRy1MUyIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSB8Ci0gICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTEpQRUcsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAibGpwZWciLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxvc3NsZXNzIEpQRUciKSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJhdnVpIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIE1lcmlkaWVuIFVuY29tcHJlc3NlZCIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BBTSwKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FZVVYsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAicGFtIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQU0gKFBvcnRhYmxlIEFueU1hcCkgaW1hZ2UiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCi0gICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAiKSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BCTSwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJwYm0iLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBCTSAoUG9ydGFibGUgQml0TWFwKSBpbWFnZSIpLAorICAgICAgICAubmFtZSAgICAgID0gImF5dXYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBwYWNrZWQgTVMgNDo0OjQ6NCIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDWCwKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RBUkdBX1kyMTYsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAicGN4IiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQyBQYWludGJydXNoIFBDWCBpbWFnZSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKLSAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS94LXBjeCIpLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUEdNLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gInBnbSIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEdNIChQb3J0YWJsZSBHcmF5TWFwKSBpbWFnZSIpLAorICAgICAgICAubmFtZSAgICAgID0gInRhcmdhX3kyMTYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBpbm5hY2xlIFRBUkdBIENpbmVXYXZlIFlVVjE2IiksCiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAogICAgIH0sCiAgICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUEdNWVVWLAorICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVjMwOCwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJwZ215dXYiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBHTVlVViAoUG9ydGFibGUgR3JheU1hcCBZVVYpIGltYWdlIiksCisgICAgICAgIC5uYW1lICAgICAgPSAidjMwOCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVW5jb21wcmVzc2VkIHBhY2tlZCA0OjQ6NCIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BORywKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1Y0MDgsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAicG5nIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQTkcgKFBvcnRhYmxlIE5ldHdvcmsgR3JhcGhpY3MpIGltYWdlIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgICAgICAubWltZV90eXBlcz0gTVQoImltYWdlL3BuZyIpLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUFBNLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gInBwbSIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUFBNIChQb3J0YWJsZSBQaXhlbE1hcCkgaW1hZ2UiKSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2NDA4IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgcGFja2VkIFFUIDQ6NDo0OjQiKSwKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QVFgsCisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9ZVVY0LAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gInB0eCIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVi5GbGFzaCBQVFggaW1hZ2UiKSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJ5dXY0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVbmNvbXByZXNzZWQgcGFja2VkIDQ6MjowIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVZSTiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhdnJuIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIEFWSSBDb2RlYyIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQ1BJQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJjcGlhIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDUGlBIHZpZGVvIGZvcm1hdCIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfWEZBQ0UsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAieGZhY2UiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlgtZmFjZSBpbWFnZSIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NHSSwKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NOT1csCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAic2dpIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTR0kgaW1hZ2UiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5uYW1lICAgICAgPSAic25vdyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU25vdyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TUDVYLAorICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU01WSlBFRywKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJzcDV4IiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTdW5wbHVzIEpQRUcgKFNQNVgpIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1VOUkFTVCwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJzdW5yYXN0IiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTdW4gUmFzdGVyZmlsZSBpbWFnZSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RBUkdBLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gInRhcmdhIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUcnVldmlzaW9uIFRhcmdhIGltYWdlIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgICAgICAubWltZV90eXBlcz0gTVQoImltYWdlL3gtdGFyZ2EiLCAiaW1hZ2UveC10Z2EiKSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1REU0MsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAidGRzYyIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVERTQyIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RJRkYsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAidGlmZiIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVElGRiBpbWFnZSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKLSAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS90aWZmIiksCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9UWEQsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAidHhkIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJSZW5kZXJ3YXJlIFRYRCAoVGVYdHVyZSBEaWN0aW9uYXJ5KSBpbWFnZSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTWSwKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMUlNQUdFLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gInZjMWltYWdlIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDkgSW1hZ2UgdjIiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9XRUJQLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAubmFtZSAgICAgID0gIndlYnAiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldlYlAiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1kgfAotICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKLSAgICAgICAgLm1pbWVfdHlwZXM9IE1UKCJpbWFnZS93ZWJwIiksCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9XTVYzSU1BR0UsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAid212M2ltYWdlIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIFZpZGVvIDkgSW1hZ2UiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9YQk0sCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAieGJtIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJYQk0gKFggQml0TWFwKSBpbWFnZSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKLSAgICB9LAotICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1hXRCwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJ4d2QiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhXRCAoWCBXaW5kb3cgRHVtcCkgaW1hZ2UiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCi0gICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UveC14d2luZG93ZHVtcCIpLAorICAgICAgICAubmFtZSAgICAgID0gInNtdmpwZWciLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNpZ21hdGVsIE1vdGlvbiBWaWRlbyIpLAogICAgIH0sCiAgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVBORywKQEAgLTE1MjIsMTIgKzE0OTgsMTU1IEBACiAgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiaW1hZ2UvcG5nIiksCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EQUFMQSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJkYWFsYSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGFhbGEiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1kgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQ0ZIRCwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJjZmhkIiwKICAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDaW5lZm9ybSBIRCIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1RSVUVNT1RJT04yUlQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAidHJ1ZW1vdGlvbjJydCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRHVjayBUcnVlTW90aW9uIDIuMCBSZWFsIFRpbWUiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NMTAxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gIm0xMDEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1hdHJveCBVbmNvbXByZXNzZWQgU0QiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NQUdJQ1lVViwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJtYWdpY3l1diIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWFnaWNZVVYgdmlkZW8iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNoZWVydmlkZW8iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJpdEphenogU2hlZXJWaWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1lMQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ5bGMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIllVWTIgTG9zc2xlc3MgQ29kZWMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QU0QsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicHNkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaG90b3Nob3AgUFNEIGZpbGUiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QSVhMRVQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGl4bGV0IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBQaXhsZXQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TUEVFREhRLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNwZWVkaHEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5ld1RlayBTcGVlZEhRIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRk1WQywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJmbXZjIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGTSBTY3JlZW4gQ2FwdHVyZSBDb2RlYyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NDUFIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic2NwciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2NyZWVuUHJlc3NvciIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUyB8IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9DTEVBUlZJREVPLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImNsZWFydmlkZW8iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkl0ZXJhdGVkIFN5c3RlbXMgQ2xlYXJWaWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1hQTSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ4cG0iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhQTSAoWCBQaXhNYXApIGltYWdlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgICAgICAubWltZV90eXBlcz0gTVQoImltYWdlL3gteHBpeG1hcCIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVYxLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gImF2MSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQWxsaWFuY2UgZm9yIE9wZW4gTWVkaWEgQVYxIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgICAgICAucHJvZmlsZXMgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoZmZfYXYxX3Byb2ZpbGVzKSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0JJVFBBQ0tFRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJiaXRwYWNrZWQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJpdHBhY2tlZCIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01TQ0MsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAibXNjYyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWFuZHNvZnQgU2NyZWVuIENhcHR1cmUgQ29kZWMiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TUkdDLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInNyZ2MiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNjcmVlbiBSZWNvcmRlciBHb2xkIENvZGVjIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1ZHLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAubmFtZSAgICAgID0gInN2ZyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2NhbGFibGUgVmVjdG9yIEdyYXBoaWNzIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgICAgICAubWltZV90eXBlcz0gTVQoImltYWdlL3N2Zyt4bWwiKSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0dEViwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJnZHYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdyZW1saW4gRGlnaXRhbCBWaWRlbyIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0ZJVFMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZml0cyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRklUUyAoRmxleGlibGUgSW1hZ2UgVHJhbnNwb3J0IFN5c3RlbSkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKIAogICAgIC8qIHZhcmlvdXMgUENNICJjb2RlY3MiICovCiAgICAgewpAQCAtMTY1NywxMyArMTc3Niw2IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkJFX1BMQU5BUiwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczE2YmVfcGxhbmFyIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDE2LWJpdCBiaWctZW5kaWFuIHBsYW5hciIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKLSAgICB9LAotICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRV9QTEFOQVIsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3MxNmxlX3BsYW5hciIsCkBAIC0xNjcxLDIwICsxNzgzLDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEVfUExBTkFSLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAotICAgICAgICAubmFtZSAgICAgID0gInBjbV9zMjRsZV9wbGFuYXIiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMjQtYml0IGxpdHRsZS1lbmRpYW4gcGxhbmFyIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MzMkxFX1BMQU5BUiwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczMybGVfcGxhbmFyIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDMyLWJpdCBsaXR0bGUtZW5kaWFuIHBsYW5hciIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKLSAgICB9LAotICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9EVkQsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAicGNtX2R2ZCIsCkBAIC0xNzQ3LDYgKzE4NDUsNTUgQEAKICAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDgtYml0IHBsYW5hciIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMjRMRV9QTEFOQVIsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3MyNGxlX3BsYW5hciIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUENNIHNpZ25lZCAyNC1iaXQgbGl0dGxlLWVuZGlhbiBwbGFuYXIiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzMyTEVfUExBTkFSLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9zMzJsZV9wbGFuYXIiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgMzItYml0IGxpdHRsZS1lbmRpYW4gcGxhbmFyIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkJFX1BMQU5BUiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczE2YmVfcGxhbmFyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDE2LWJpdCBiaWctZW5kaWFuIHBsYW5hciIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TNjRMRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fczY0bGUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSBzaWduZWQgNjQtYml0IGxpdHRsZS1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzY0QkUsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAicGNtX3M2NGJlIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQQ00gc2lnbmVkIDY0LWJpdCBiaWctZW5kaWFuIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX0YxNkxFLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gInBjbV9mMTZsZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUENNIDE2LjggZmxvYXRpbmcgcG9pbnQgbGl0dGxlLWVuZGlhbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9GMjRMRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJwY21fZjI0bGUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBDTSAyNC4wIGZsb2F0aW5nIHBvaW50IGxpdHRsZS1lbmRpYW4iKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKIAogICAgIC8qIHZhcmlvdXMgQURQQ00gY29kZWNzICovCiAgICAgewpAQCAtMTg4MywxMyArMjAzMCw2IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fVEhQX0xFLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAotICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX3RocF9sZSIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gTmludGVuZG8gVEhQIChMaXR0bGUtRW5kaWFuKSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKLSAgICB9LAotICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9BTVYsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21faW1hX2FtdiIsCkBAIC0xOTY3LDYgKzIxMDcsMTMgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9WSU1BLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX3ZpbWEiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkx1Y2FzQXJ0cyBWSU1BIGF1ZGlvIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fQUZDLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX2FmYyIsCkBAIC0yMDAyLDEwICsyMTQ5LDEwIEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCiAgICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fVklNQSwKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX1RIUF9MRSwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJhZHBjbV92aW1hIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMdWNhc0FydHMgVklNQSBhdWRpbyIpLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX3RocF9sZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQURQQ00gTmludGVuZG8gVEhQIChMaXR0bGUtRW5kaWFuKSIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAogICAgIHsKQEAgLTIwMjIsNiArMjE2OSwyMCBAQAogICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIFlhbWFoYSBBSUNBIiksCiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0RBVDQsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYWRwY21faW1hX2RhdDQiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIElNQSBFdXJvY29tIERBVDQiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9NVEFGLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImFkcGNtX210YWYiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFEUENNIE1UQUYiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKIAogICAgIC8qIEFNUiAqLwogICAgIHsKQEAgLTIwOTEsNiArMjI1MiwxMyBAQAogICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQQ00gU3F1YXJlcm9vdC1EZWx0YS1FeGFjdCIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0dSRU1MSU5fRFBDTSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJncmVtbGluX2RwY20iLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRQQ00gR3JlbWxpbiIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAogCiAgICAgLyogYXVkaW8gY29kZWNzICovCiAgICAgewpAQCAtMjE4NCw3ICsyMzUyLDcgQEAKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgLm5hbWUgICAgICA9ICJmbGFjIiwKICAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGTEFDIChGcmVlIExvc3NsZXNzIEF1ZGlvIENvZGVjKSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDNBRFUsCkBAIC0yMjEyLDcgKzIzODAsNyBAQAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgICAgICAubmFtZSAgICAgID0gImFsYWMiLAogICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFMQUMgKEFwcGxlIExvc3NsZXNzIEF1ZGlvIENvZGVjKSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9XRVNUV09PRF9TTkQxLApAQCAtMjI1NCw3ICsyNDIyLDcgQEAKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgLm5hbWUgICAgICA9ICJ0dGEiLAogICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRUQSAoVHJ1ZSBBdWRpbykiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAogICAgIH0sCiAgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU01BQ0tBVURJTywKQEAgLTIyNzUsNyArMjQ0Myw4IEBACiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAid2F2cGFjayIsCiAgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2F2UGFjayIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0lOVFJBX09OTFkgfAorICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfUFJPUF9MT1NTWSB8IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCiAgICAgfSwKICAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EU0lDSU5BVURJTywKQEAgLTIzMTksMTUgKzI0ODgsNiBAQAogICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFUUkFDMyAoQWRhcHRpdmUgVFJhbnNmb3JtIEFjb3VzdGljIENvZGluZyAzKSIpLAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAotI2lmIEZGX0FQSV9WT1hXQVJFCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVk9YV0FSRSwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJ2b3h3YXJlIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWb3h3YXJlIFJUMjkgTWV0YXNvdW5kIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAotICAgIH0sCi0jZW5kaWYKICAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BUEUsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCkBAIC0yNDc3LDEzICsyNjM3LDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EU1NfU1AsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAiZHNzX3NwIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEaWdpdGFsIFNwZWVjaCBTdGFuZGFyZCAtIFN0YW5kYXJkIFBsYXkgbW9kZSAoRFNTIFNQKSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKLSAgICB9LAotICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0c3MjksCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAiZzcyOSIsCkBAIC0yNTMzLDI0ICsyNjg2LDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9GRldBVkVTWU5USCwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJ3YXZlc3ludGgiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldhdmUgc3ludGhlc2lzIHBzZXVkby1jb2RlYyIpLAotICAgIH0sCi0gICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU09OSUMsCi0gICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCi0gICAgICAgIC5uYW1lICAgICAgPSAic29uaWMiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNvbmljIiksCi0gICAgfSwKLSAgICB7Ci0gICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TT05JQ19MUywKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKLSAgICAgICAgLm5hbWUgICAgICA9ICJzb25pY2xzIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb25pYyBsb3NzbGVzcyIpLAotICAgIH0sCi0gICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfT1BVUywKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgLm5hbWUgICAgICA9ICJvcHVzIiwKQEAgLTI1NjksNyArMjcwNCw3IEBACiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgICAgIC5uYW1lICAgICAgPSAidGFrIiwKICAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUQUsgKFRvbSdzIGxvc3NsZXNzIEF1ZGlvIEtvbXByZXNzb3IpIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NMRVNTLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZIHwgQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKICAgICB9LAogICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX01FVEFTT1VORCwKQEAgLTI1OTMsNiArMjcyOCwzOCBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAogICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RTU19TUCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJkc3Nfc3AiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRpZ2l0YWwgU3BlZWNoIFN0YW5kYXJkIC0gU3RhbmRhcmQgUGxheSBtb2RlIChEU1MgU1ApIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQ09ERUMyLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImNvZGVjMiIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiY29kZWMyICh2ZXJ5IGxvdyBiaXRyYXRlIHNwZWVjaCBjb2RlYykiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9GRldBVkVTWU5USCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3YXZlc3ludGgiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIldhdmUgc3ludGhlc2lzIHBzZXVkby1jb2RlYyIpLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU09OSUMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic29uaWMiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNvbmljIiksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TT05JQ19MUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJzb25pY2xzIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTb25pYyBsb3NzbGVzcyIpLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRVZSQywKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgLm5hbWUgICAgICA9ICJldnJjIiwKQEAgLTI2MDcsMTMgKzI3NzQsNiBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEXzRHViwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKLSAgICAgICAgLm5hbWUgICAgICA9ICI0Z3YiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIjRHViAoRm91cnRoIEdlbmVyYXRpb24gVm9jb2RlcikiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCi0gICAgfSwKLSAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9EU0RfTFNCRiwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgLm5hbWUgICAgICA9ICJkc2RfbHNiZiIsCkBAIC0yNjQyLDYgKzI4MDIsMTMgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCiAgICAgfSwKICAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF80R1YsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiNGd2IiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCI0R1YgKEZvdXJ0aCBHZW5lcmF0aW9uIFZvY29kZXIpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfSU5URVJQTEFZX0FDTSwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgLm5hbWUgICAgICA9ICJpbnRlcnBsYXlhY20iLApAQCAtMjY2Miw2ICsyODI5LDU1IEBACiAgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWGJveCBNZWRpYSBBdWRpbyAyIiksCiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAogICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRFNULAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImRzdCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFNUIChEaXJlY3QgU3RyZWFtIFRyYW5zZmVyKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FUUkFDM0FMLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAubmFtZSAgICAgID0gImF0cmFjM2FsIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVFJBQzMgQUwgKEFkYXB0aXZlIFRSYW5zZm9ybSBBY291c3RpYyBDb2RpbmcgMyBBZHZhbmNlZCBMb3NzbGVzcykiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9BVFJBQzNQQUwsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYXRyYWMzcGFsIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBVFJBQzMrIEFMIChBZGFwdGl2ZSBUUmFuc2Zvcm0gQWNvdXN0aWMgQ29kaW5nIDMrIEFkdmFuY2VkIExvc3NsZXNzKSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTTEVTUywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0RPTEJZX0UsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiZG9sYnlfZSIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRG9sYnkgRSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9MT1NTWSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FQVFgsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAiYXB0eCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiYXB0WCAoQXVkaW8gUHJvY2Vzc2luZyBUZWNobm9sb2d5IGZvciBCbHVldG9vdGgpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVBUWF9IRCwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJhcHR4X2hkIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJhcHRYIEhEIChBdWRpbyBQcm9jZXNzaW5nIFRlY2hub2xvZ3kgZm9yIEJsdWV0b290aCkiKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU1ksCisgICAgfSwKKyAgICB7CisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TQkMsCisgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uYW1lICAgICAgPSAic2JjIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTQkMgKGxvdy1jb21wbGV4aXR5IHN1YmJhbmQgY29kZWMpIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX0xPU1NZLAorICAgIH0sCiAKICAgICAvKiBzdWJ0aXRsZSBjb2RlY3MgKi8KICAgICB7CkBAIC0yNjkzLDEzICsyOTA5LDYgQEAKICAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfQklUTUFQX1NVQiwKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FTUywKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKLSAgICAgICAgLm5hbWUgICAgICA9ICJhc3MiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTUyAoQWR2YW5jZWQgU1NBKSBzdWJ0aXRsZSIpLAotICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKLSAgICB9LAotICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1NTQSwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKICAgICAgICAgLm5hbWUgICAgICA9ICJzc2EiLApAQCAtMjczNCwxMyArMjk0Myw2IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAogICAgIH0sCiAgICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU1VCUklQLAotICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAotICAgICAgICAubmFtZSAgICAgID0gInN1YnJpcCIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3ViUmlwIHN1YnRpdGxlIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAotICAgIH0sCi0gICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTUlDUk9EVkQsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCiAgICAgICAgIC5uYW1lICAgICAgPSAibWljcm9kdmQiLApAQCAtMjc0OCwxMyArMjk1MCw2IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAogICAgIH0sCiAgICAgewotICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVBMMiwKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKLSAgICAgICAgLm5hbWUgICAgICA9ICJtcGwyIiwKLSAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEwyIHN1YnRpdGxlIiksCi0gICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAotICAgIH0sCi0gICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfRUlBXzYwOCwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKICAgICAgICAgLm5hbWUgICAgICA9ICJlaWFfNjA4IiwKQEAgLTI3NjksMTMgKzI5NjQsNiBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1BKUywKLSAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKLSAgICAgICAgLm5hbWUgICAgICA9ICJwanMiLAotICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBKUyAoUGhvZW5peCBKYXBhbmltYXRpb24gU29jaWV0eSkgc3VidGl0bGUiKSwKLSAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfVEVYVF9TVUIsCi0gICAgfSwKLSAgICB7CiAgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TQU1JLAogICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAogICAgICAgICAubmFtZSAgICAgID0gInNhbWkiLApAQCAtMjgxMSwxMCArMjk5OSwxMCBAQAogICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKICAgICB9LAogICAgIHsKLSAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1ZQTEFZRVIsCisgICAgICAgIC5pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9TVUJSSVAsCiAgICAgICAgIC50eXBlICAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEUsCi0gICAgICAgIC5uYW1lICAgICAgPSAidnBsYXllciIsCi0gICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVlBsYXllciBzdWJ0aXRsZSIpLAorICAgICAgICAubmFtZSAgICAgID0gInN1YnJpcCIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3ViUmlwIHN1YnRpdGxlIiksCiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAogICAgIH0sCiAgICAgewpAQCAtMjgyNSw2ICszMDEzLDM0IEBACiAgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfTVBMMiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJtcGwyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEwyIHN1YnRpdGxlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfVlBMQVlFUiwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJ2cGxheWVyIiwKKyAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWUGxheWVyIHN1YnRpdGxlIiksCisgICAgICAgIC5wcm9wcyAgICAgPSBBVl9DT0RFQ19QUk9QX1RFWFRfU1VCLAorICAgIH0sCisgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfUEpTLAorICAgICAgICAudHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFLAorICAgICAgICAubmFtZSAgICAgID0gInBqcyIsCisgICAgICAgIC5sb25nX25hbWUgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUEpTIChQaG9lbml4IEphcGFuaW1hdGlvbiBTb2NpZXR5KSBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0FTUywKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKKyAgICAgICAgLm5hbWUgICAgICA9ICJhc3MiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFTUyAoQWR2YW5jZWQgU1NBKSBzdWJ0aXRsZSIpLAorICAgICAgICAucHJvcHMgICAgID0gQVZfQ09ERUNfUFJPUF9URVhUX1NVQiwKKyAgICB9LAorICAgIHsKICAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX0hETVZfVEVYVF9TVUJUSVRMRSwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSwKICAgICAgICAgLm5hbWUgICAgICA9ICJoZG12X3RleHRfc3VidGl0bGUiLApAQCAtMjg0MSw2ICszMDU3LDEyIEBACiAgICAgICAgIC5taW1lX3R5cGVzPSBNVCgiYXBwbGljYXRpb24veC10cnVldHlwZS1mb250IiwgImFwcGxpY2F0aW9uL3gtZm9udCIpLAogICAgIH0sCiAgICAgeworICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfU0NURV8zNSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9EQVRBLAorICAgICAgICAubmFtZSAgICAgID0gInNjdGVfMzUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNDVEUgMzUgTWVzc2FnZSBRdWV1ZSIpLAorICAgIH0sCisgICAgewogICAgICAgICAuaWQgICAgICAgID0gQVZfQ09ERUNfSURfQklOVEVYVCwKICAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLm5hbWUgICAgICA9ICJiaW50ZXh0IiwKQEAgLTI4OTMsMTggKzMxMTUsMjcgQEAKICAgICAgICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJiaW5hcnkgZGF0YSIpLAogICAgICAgICAubWltZV90eXBlcz0gTVQoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpLAogICAgIH0sCi0KLSAgICAvKiBkZXByZWNhdGVkIGNvZGVjIGlkcyAqLworICAgIHsKKyAgICAgICAgLmlkICAgICAgICA9IEFWX0NPREVDX0lEX1dSQVBQRURfQVZGUkFNRSwKKyAgICAgICAgLnR5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLm5hbWUgICAgICA9ICJ3cmFwcGVkX2F2ZnJhbWUiLAorICAgICAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFWRnJhbWUgdG8gQVZQYWNrZXQgcGFzc3Rocm91Z2giKSwKKyAgICAgICAgLnByb3BzICAgICA9IEFWX0NPREVDX1BST1BfTE9TU0xFU1MsCisgICAgfSwKIH07CiAKK3N0YXRpYyBpbnQgZGVzY3JpcHRvcl9jb21wYXJlKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqbWVtYmVyKQoreworICAgIGVudW0gQVZDb2RlY0lEIGlkID0gKihjb25zdCBlbnVtIEFWQ29kZWNJRCAqKSBrZXk7CisgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2MgPSBtZW1iZXI7CisKKyAgICByZXR1cm4gaWQgLSBkZXNjLT5pZDsKK30KKwogY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmF2Y29kZWNfZGVzY3JpcHRvcl9nZXQoZW51bSBBVkNvZGVjSUQgaWQpCiB7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoY29kZWNfZGVzY3JpcHRvcnMpOyBpKyspCi0gICAgICAgIGlmIChjb2RlY19kZXNjcmlwdG9yc1tpXS5pZCA9PSBpZCkKLSAgICAgICAgICAgIHJldHVybiAmY29kZWNfZGVzY3JpcHRvcnNbaV07Ci0gICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGJzZWFyY2goJmlkLCBjb2RlY19kZXNjcmlwdG9ycywgRkZfQVJSQVlfRUxFTVMoY29kZWNfZGVzY3JpcHRvcnMpLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihjb2RlY19kZXNjcmlwdG9yc1swXSksIGRlc2NyaXB0b3JfY29tcGFyZSk7CiB9CiAKIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICphdmNvZGVjX2Rlc2NyaXB0b3JfbmV4dChjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqcHJldikKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY29vay5jIGIvbGliYXZjb2RlYy9jb29rLmMKaW5kZXggMWIzODAxOS4uNTNjYjgzOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jb29rLmMKKysrIGIvbGliYXZjb2RlYy9jb29rLmMKQEAgLTE0MSw3ICsxNDEsNyBAQAogICAgIFZMQyAgICAgICAgICAgICAgICAgZW52ZWxvcGVfcXVhbnRfaW5kZXhbMTNdOwogICAgIFZMQyAgICAgICAgICAgICAgICAgc3F2aFs3XTsgICAgICAgICAgLy8gc2NhbGFyIHF1YW50aXphdGlvbgogCi0gICAgLyogZ2VuZXJhdGFibGUgdGFibGVzIGFuZCByZWxhdGVkIHZhcmlhYmxlcyAqLworICAgIC8qIGdlbmVyYXRlIHRhYmxlcyBhbmQgcmVsYXRlZCB2YXJpYWJsZXMgKi8KICAgICBpbnQgICAgICAgICAgICAgICAgIGdhaW5fc2l6ZV9mYWN0b3I7CiAgICAgZmxvYXQgICAgICAgICAgICAgICBnYWluX3RhYmxlWzIzXTsKIApAQCAtODgyLDcgKzg4Miw3IEBACiBzdGF0aWMgdm9pZCBzYXR1cmF0ZV9vdXRwdXRfZmxvYXQoQ09PS0NvbnRleHQgKnEsIGZsb2F0ICpvdXQpCiB7CiAgICAgcS0+YWRzcC52ZWN0b3JfY2xpcGYob3V0LCBxLT5tb25vX21kY3Rfb3V0cHV0ICsgcS0+c2FtcGxlc19wZXJfY2hhbm5lbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwgMS4wZiwgRkZBTElHTihxLT5zYW1wbGVzX3Blcl9jaGFubmVsLCA4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTElHTihxLT5zYW1wbGVzX3Blcl9jaGFubmVsLCA4KSwgLTEuMGYsIDEuMGYpOwogfQogCiAKQEAgLTEwNTMsOSArMTA1Myw3IEBACiBzdGF0aWMgYXZfY29sZCBpbnQgY29va19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgQ09PS0NvbnRleHQgKnEgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGNvbnN0IHVpbnQ4X3QgKmVkYXRhX3B0ciA9IGF2Y3R4LT5leHRyYWRhdGE7Ci0gICAgY29uc3QgdWludDhfdCAqZWRhdGFfcHRyX2VuZCA9IGVkYXRhX3B0ciArIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsKLSAgICBpbnQgZXh0cmFkYXRhX3NpemUgPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CiAgICAgaW50IHMgPSAwOwogICAgIHVuc2lnbmVkIGludCBjaGFubmVsX21hc2sgPSAwOwogICAgIGludCBzYW1wbGVzX3Blcl9mcmFtZSA9IDA7CkBAIC0xMDYzLDEyICsxMDYxLDE0IEBACiAgICAgcS0+YXZjdHggPSBhdmN0eDsKIAogICAgIC8qIFRha2UgY2FyZSBvZiB0aGUgY29kZWMgc3BlY2lmaWMgZXh0cmFkYXRhLiAqLwotICAgIGlmIChleHRyYWRhdGFfc2l6ZSA8IDgpIHsKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgOCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5lY2Vzc2FyeSBleHRyYWRhdGEgbWlzc2luZyFcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJjb2RlY2RhdGFfbGVuZ3RoPSVkXG4iLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOwogCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisKICAgICAvKiBUYWtlIGRhdGEgZnJvbSB0aGUgQVZDb2RlY0NvbnRleHQgKFJNIGNvbnRhaW5lcikuICovCiAgICAgaWYgKCFhdmN0eC0+Y2hhbm5lbHMpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIik7CkBAIC0xMDgwLDI2ICsxMDgwLDE5IEBACiAKICAgICBmZl9hdWRpb2RzcF9pbml0KCZxLT5hZHNwKTsKIAotICAgIHdoaWxlIChlZGF0YV9wdHIgPCBlZGF0YV9wdHJfZW5kKSB7CisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpIHsKICAgICAgICAgLyogOCBmb3IgbW9ubywgMTYgZm9yIHN0ZXJlbywgPyBmb3IgbXVsdGljaGFubmVsCiAgICAgICAgICAgIFN3YXAgdG8gcmlnaHQgZW5kaWFubmVzcyBzbyB3ZSBkb24ndCBuZWVkIHRvIGNhcmUgbGF0ZXIgb24uICovCi0gICAgICAgIGlmIChleHRyYWRhdGFfc2l6ZSA+PSA4KSB7Ci0gICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10uY29va3ZlcnNpb24gPSBieXRlc3RyZWFtX2dldF9iZTMyKCZlZGF0YV9wdHIpOwotICAgICAgICAgICAgc2FtcGxlc19wZXJfZnJhbWUgICAgICAgICAgID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZWRhdGFfcHRyKTsKLSAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5zdWJiYW5kcyA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmVkYXRhX3B0cik7Ci0gICAgICAgICAgICBleHRyYWRhdGFfc2l6ZSAtPSA4OworICAgICAgICBxLT5zdWJwYWNrZXRbc10uY29va3ZlcnNpb24gICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgICAgIHNhbXBsZXNfcGVyX2ZyYW1lICAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKyAgICAgICAgcS0+c3VicGFja2V0W3NdLnN1YmJhbmRzICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworICAgICAgICBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOyAgICAvLyBVbmtub3duIHVudXNlZAorICAgICAgICBxLT5zdWJwYWNrZXRbc10uanNfc3ViYmFuZF9zdGFydCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisgICAgICAgIGlmIChxLT5zdWJwYWNrZXRbc10uanNfc3ViYmFuZF9zdGFydCA+PSA1MSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJqc19zdWJiYW5kX3N0YXJ0ICVkIGlzIHRvbyBsYXJnZVxuIiwgcS0+c3VicGFja2V0W3NdLmpzX3N1YmJhbmRfc3RhcnQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhZGF0YV9zaXplID49IDgpIHsKLSAgICAgICAgICAgIGJ5dGVzdHJlYW1fZ2V0X2JlMzIoJmVkYXRhX3B0cik7ICAgIC8vIFVua25vd24gdW51c2VkCi0gICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10uanNfc3ViYmFuZF9zdGFydCA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmVkYXRhX3B0cik7Ci0gICAgICAgICAgICBpZiAocS0+c3VicGFja2V0W3NdLmpzX3N1YmJhbmRfc3RhcnQgPj0gNTEpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImpzX3N1YmJhbmRfc3RhcnQgJWQgaXMgdG9vIGxhcmdlXG4iLCBxLT5zdWJwYWNrZXRbc10uanNfc3ViYmFuZF9zdGFydCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHEtPnN1YnBhY2tldFtzXS5qc192bGNfYml0cyA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmVkYXRhX3B0cik7Ci0gICAgICAgICAgICBleHRyYWRhdGFfc2l6ZSAtPSA4OwotICAgICAgICB9CisgICAgICAgIHEtPnN1YnBhY2tldFtzXS5qc192bGNfYml0cyAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKIAogICAgICAgICAvKiBJbml0aWFsaXplIGV4dHJhZGF0YSByZWxhdGVkIHZhcmlhYmxlcy4gKi8KICAgICAgICAgcS0+c3VicGFja2V0W3NdLnNhbXBsZXNfcGVyX2NoYW5uZWwgPSBzYW1wbGVzX3Blcl9mcmFtZSAvIGF2Y3R4LT5jaGFubmVsczsKQEAgLTExNTEsOCArMTE0NCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNQ19DT09LOgogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJNVUxUSV9DSEFOTkVMXG4iKTsKLSAgICAgICAgICAgIGlmIChleHRyYWRhdGFfc2l6ZSA+PSA0KQotICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFzayB8PSBxLT5zdWJwYWNrZXRbc10uY2hhbm5lbF9tYXNrID0gYnl0ZXN0cmVhbV9nZXRfYmUzMigmZWRhdGFfcHRyKTsKKyAgICAgICAgICAgIGNoYW5uZWxfbWFzayB8PSBxLT5zdWJwYWNrZXRbc10uY2hhbm5lbF9tYXNrID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKIAogICAgICAgICAgICAgaWYgKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhxLT5zdWJwYWNrZXRbc10uY2hhbm5lbF9tYXNrKSA+IDEpIHsKICAgICAgICAgICAgICAgICBxLT5zdWJwYWNrZXRbc10udG90YWxfc3ViYmFuZHMgPSBxLT5zdWJwYWNrZXRbc10uc3ViYmFuZHMgKwpAQCAtMTE4Nyw3ICsxMTc5LDcgQEAKICAgICAgICAgLyogSW5pdGlhbGl6ZSB2YXJpYWJsZSByZWxhdGlvbnMgKi8KICAgICAgICAgcS0+c3VicGFja2V0W3NdLm51bXZlY3Rvcl9zaXplID0gKDEgPDwgcS0+c3VicGFja2V0W3NdLmxvZzJfbnVtdmVjdG9yX3NpemUpOwogCi0gICAgICAgIC8qIFRyeSB0byBjYXRjaCBzb21lIG9idmlvdXNseSBmYXVsdHkgc3RyZWFtcywgb3RoZXJ2aXNlIGl0IG1pZ2h0IGJlIGV4cGxvaXRhYmxlICovCisgICAgICAgIC8qIFRyeSB0byBjYXRjaCBzb21lIG9idmlvdXNseSBmYXVsdHkgc3RyZWFtcywgb3RoZXJ3aXNlIGl0IG1pZ2h0IGJlIGV4cGxvaXRhYmxlICovCiAgICAgICAgIGlmIChxLT5zdWJwYWNrZXRbc10udG90YWxfc3ViYmFuZHMgPiA1MykgewogICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidG90YWxfc3ViYmFuZHMgPiA1MyIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwpAQCAtMTI2MCw3ICsxMjUyLDcgQEAKICAgICAgICAgcS0+c2F0dXJhdGVfb3V0cHV0ID0gc2F0dXJhdGVfb3V0cHV0X2Zsb2F0OwogICAgIH0KIAotICAgIC8qIFRyeSB0byBjYXRjaCBzb21lIG9idmlvdXNseSBmYXVsdHkgc3RyZWFtcywgb3RoZXJ2aXNlIGl0IG1pZ2h0IGJlIGV4cGxvaXRhYmxlICovCisgICAgLyogVHJ5IHRvIGNhdGNoIHNvbWUgb2J2aW91c2x5IGZhdWx0eSBzdHJlYW1zLCBvdGhlcndpc2UgaXQgbWlnaHQgYmUgZXhwbG9pdGFibGUgKi8KICAgICBpZiAocS0+c2FtcGxlc19wZXJfY2hhbm5lbCAhPSAyNTYgJiYgcS0+c2FtcGxlc19wZXJfY2hhbm5lbCAhPSA1MTIgJiYKICAgICAgICAgcS0+c2FtcGxlc19wZXJfY2hhbm5lbCAhPSAxMDI0KSB7CiAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInNhbXBsZXNfcGVyX2NoYW5uZWwgPSAlZCIsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Nvb2tkYXRhLmggYi9saWJhdmNvZGVjL2Nvb2tkYXRhLmgKaW5kZXggN2I5Y2JhMy4uZGNkYjkxMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jb29rZGF0YS5oCisrKyBiL2xpYmF2Y29kZWMvY29va2RhdGEuaApAQCAtMjIsNyArMjIsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBDb29rIEFLQSBSZWFsQXVkaW8gRzIgY29tcGF0aWJsZSBkZWNvZGVyZGF0YQorICogQ29vayBBS0EgUmVhbEF1ZGlvIEcyIGNvbXBhdGlibGUgZGVjb2RlciBkYXRhCiAgKi8KIAogI2lmbmRlZiBBVkNPREVDX0NPT0tEQVRBX0gKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvY29weV9ibG9jay5oIGIvbGliYXZjb2RlYy9jb3B5X2Jsb2NrLmgKaW5kZXggOWVkNDUxZi4uMzkzZDQ1NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jb3B5X2Jsb2NrLmgKKysrIGIvbGliYXZjb2RlYy9jb3B5X2Jsb2NrLmgKQEAgLTE5LDIyICsxOSwyMiBAQAogI2lmbmRlZiBBVkNPREVDX0NPUFlfQkxPQ0tfSAogI2RlZmluZSBBVkNPREVDX0NPUFlfQkxPQ0tfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9ibG9jazIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUsIGludCBoKQogewogICAgIGludCBpOwotICAgIGZvcihpPTA7IGk8aDsgaSsrKQotICAgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CiAgICAgICAgIEFWX0NPUFkxNlUoZHN0LCBzcmMpOwotICAgICAgICBkc3QrPWRzdFN0cmlkZTsKLSAgICAgICAgc3JjKz1zcmNTdHJpZGU7CisgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNTdHJpZGU7CiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weV9ibG9jazQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfYmxvY2s0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlLCBpbnQgaCkKIHsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CkBAIC00NCw3ICs0NCw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weV9ibG9jazgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfYmxvY2s4KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlLCBpbnQgaCkKIHsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CkBAIC01NCw3ICs1NCw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weV9ibG9jazkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfYmxvY2s5KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlLCBpbnQgaCkKIHsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CkBAIC02NSw3ICs2NSw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29weV9ibG9jazE2KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrMTYodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUsIGludCBoKQogewogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKQEAgLTc1LDcgKzc1LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrMTcodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQorc3RhdGljIGlubGluZSB2b2lkIGNvcHlfYmxvY2sxNyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHNyY1N0cmlkZSwgaW50IGgpCiB7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jb3NfdGFibGVnZW4uYyBiL2xpYmF2Y29kZWMvY29zX3RhYmxlZ2VuLmMKaW5kZXggZGJkMGNjMC4uNzIwNmFhZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jb3NfdGFibGVnZW4uYworKysgYi9saWJhdmNvZGVjL2Nvc190YWJsZWdlbi5jCkBAIC0yNiw3ICsyNiw3IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKIAotI2RlZmluZSBCSVRTIDE2CisjZGVmaW5lIEJJVFMgMTcKICNkZWZpbmUgRkxPQVRGTVQgIiUuMThlIgogI2RlZmluZSBGSVhFREZNVCAiJTZkIgogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2NwaWEuYyBiL2xpYmF2Y29kZWMvY3BpYS5jCmluZGV4IDZiNzg0YjIuLjU4ODMzYjIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY3BpYS5jCisrKyBiL2xpYmF2Y29kZWMvY3BpYS5jCkBAIC0xMTMsMTIgKzExMywxMiBAQAogICAgICAgICBzcmMgKz0gMjsKIAogICAgICAgICBpZiAoc3JjX3NpemUgPCBsaW5lbGVuZ3RoKSB7Ci0gICAgICAgICAgICBhdl9mcmFtZV9zZXRfZGVjb2RlX2Vycm9yX2ZsYWdzKGZyYW1lLCBGRl9ERUNPREVfRVJST1JfSU5WQUxJRF9CSVRTVFJFQU0pOworICAgICAgICAgICAgZnJhbWUtPmRlY29kZV9lcnJvcl9mbGFncyA9IEZGX0RFQ09ERV9FUlJPUl9JTlZBTElEX0JJVFNUUkVBTTsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGcmFtZSBlbmRlZCB1bmV4cGVjdGVkbHkhXG4iKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChzcmNbbGluZWxlbmd0aCAtIDFdICE9IEVPTCkgewotICAgICAgICAgICAgYXZfZnJhbWVfc2V0X2RlY29kZV9lcnJvcl9mbGFncyhmcmFtZSwgRkZfREVDT0RFX0VSUk9SX0lOVkFMSURfQklUU1RSRUFNKTsKKyAgICAgICAgICAgIGZyYW1lLT5kZWNvZGVfZXJyb3JfZmxhZ3MgPSBGRl9ERUNPREVfRVJST1JfSU5WQUxJRF9CSVRTVFJFQU07CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiV3JvbmcgbGluZSBsZW5ndGggJWQgb3IgbGluZSBub3QgdGVybWluYXRlZCBwcm9wZXJseSAoZm91bmQgMHglMDJ4KSFcbiIsIGxpbmVsZW5ndGgsIHNyY1tsaW5lbGVuZ3RoIC0gMV0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTEzNCwxMiArMTM0LDEyIEBACiAgICAgICAgIHZfZW5kID0gdiArIGZyYW1lLT5saW5lc2l6ZVsyXSAtIDE7CiAKICAgICAgICAgaWYgKChpICYgMSkgJiYgaGVhZGVyWzE3XSA9PSBTVUJTQU1QTEVfNDIwKSB7Ci0gICAgICAgICAgICAvKiBXZSBhcmUgb24gYSBvZGQgbGluZSBhbmQgNDIwIHN1YnNhbXBsZSBpcyB1c2VkLgorICAgICAgICAgICAgLyogV2UgYXJlIG9uIGFuIG9kZCBsaW5lIGFuZCA0MjAgc3Vic2FtcGxlIGlzIHVzZWQuCiAgICAgICAgICAgICAgKiBPbiB0aGlzIGxpbmUgb25seSBZIHZhbHVlcyBhcmUgc3BlY2lmaWVkLCBvbmUgcGVyIHBpeGVsLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGluZWxlbmd0aCAtIDE7IGorKykgewogICAgICAgICAgICAgICAgIGlmICh5ID4geV9lbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfc2V0X2RlY29kZV9lcnJvcl9mbGFncyhmcmFtZSwgRkZfREVDT0RFX0VSUk9SX0lOVkFMSURfQklUU1RSRUFNKTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmRlY29kZV9lcnJvcl9mbGFncyA9IEZGX0RFQ09ERV9FUlJPUl9JTlZBTElEX0JJVFNUUkVBTTsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkRlY29kZWQgZGF0YSBleGNlZWRlZCBsaW5lc2l6ZSFcbiIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC0xNTksNyArMTU5LDcgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxpbmVsZW5ndGggLSA0OyApIHsKICAgICAgICAgICAgICAgICBpZiAoeSArIDEgPiB5X2VuZCB8fCB1ID4gdV9lbmQgfHwgdiA+IHZfZW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3NldF9kZWNvZGVfZXJyb3JfZmxhZ3MoZnJhbWUsIEZGX0RFQ09ERV9FUlJPUl9JTlZBTElEX0JJVFNUUkVBTSk7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5kZWNvZGVfZXJyb3JfZmxhZ3MgPSBGRl9ERUNPREVfRVJST1JfSU5WQUxJRF9CSVRTVFJFQU07CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEZWNvZGVkIGRhdGEgZXhjZWVkZWQgbGluZXNpemUhXG4iKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jcnlzdGFsaGQuYyBiL2xpYmF2Y29kZWMvY3J5c3RhbGhkLmMKaW5kZXggM2NiMzJhOC4uZTNjNTk1NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9jcnlzdGFsaGQuYworKysgYi9saWJhdmNvZGVjL2NyeXN0YWxoZC5jCkBAIC0zNCwzOSArMzQsMTEgQEAKICAqIGlzIG5vdCBqdXN0IGEgZnVuY3Rpb24gb2YgdGltZSwgYnV0IGFsc28gb25lIG9mIHRoZSBkZXBlbmRlbmN5IG9uIGFkZGl0aW9uYWwKICAqIGZyYW1lcyBiZWluZyBmZWQgaW50byB0aGUgZGVjb2RlciB0byBzYXRpc2Z5IHRoZSBiLWZyYW1lIGRlcGVuZGVuY2llcy4KICAqCi0gKiBBcyBzdWNoLCBhIHBpcGVsaW5lIHdpbGwgYnVpbGQgdXAgdGhhdCBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gdGhlIHJlcXVpcmVkCi0gKiBEUEIgZm9yIHRoZSBmaWxlIGJlaW5nIHBsYXllZC4gSWYgdGhhdCB3YXMgYWxsIGl0IHRvb2ssIHRoaW5ncyB3b3VsZCBzdGlsbAotICogYmUgc2ltcGxlIC0gc28sIG9mIGNvdXJzZSwgaXQgaXNuJ3QuCi0gKgotICogVGhlIGhhcmR3YXJlIGhhcyBhIHdheSBvZiBpbmRpY2F0aW5nIHRoYXQgYSBwaWN0dXJlIGlzIHJlYWR5IHRvIGJlIGNvcGllZCBvdXQsCi0gKiBidXQgdGhpcyBpcyB1bnJlbGlhYmxlIC0gYW5kIHNvbWV0aW1lcyB0aGUgYXR0ZW1wdCB3aWxsIHN0aWxsIGZhaWwgc28sIGJhc2VkCi0gKiBvbiB0ZXN0aW5nLCB0aGUgY29kZSB3aWxsIHdhaXQgdW50aWwgMyBwaWN0dXJlcyBhcmUgcmVhZHkgYmVmb3JlIHN0YXJ0aW5nCi0gKiB0byBjb3B5IG91dCAtIGFuZCB0aGlzIGhhcyB0aGUgZWZmZWN0IG9mIGV4dGVuZGluZyB0aGUgcGlwZWxpbmUuCi0gKgotICogRmluYWxseSwgd2hpbGUgaXQgaXMgdGVtcHRpbmcgdG8gc2F5IHRoYXQgb25jZSB0aGUgZGVjb2RlciBzdGFydHMgb3V0cHV0dGluZwotICogZnJhbWVzLCB0aGUgc29mdHdhcmUgc2hvdWxkIG5ldmVyIGZhaWwgdG8gcmV0dXJuIGEgZnJhbWUgZnJvbSBhIGRlY29kZSgpLAotICogdGhpcyBpcyBhIGhhcmQgYXNzZXJ0aW9uIHRvIG1ha2UsIGJlY2F1c2UgdGhlIHN0cmVhbSBtYXkgc3dpdGNoIGJldHdlZW4KLSAqIGRpZmZlcmVudGx5IGVuY29kZWQgY29udGVudCAobnVtYmVyIG9mIGItZnJhbWVzLCBpbnRlcmxhY2luZywgZXRjKSB3aGljaAotICogbWlnaHQgcmVxdWlyZSBhIGxvbmdlciBwaXBlbGluZSB0aGFuIGJlZm9yZS4gSWYgdGhhdCBoYXBwZW5lZCwgeW91IGNvdWxkCi0gKiBkZWFkbG9jayB0cnlpbmcgdG8gcmV0cmlldmUgYSBmcmFtZSB0aGF0IGNhbid0IGJlIGRlY29kZWQgd2l0aG91dCBmZWVkaW5nCi0gKiBpbiBhZGRpdGlvbmFsIHBhY2tldHMuCi0gKgotICogQXMgc3VjaCwgdGhlIGNvZGUgd2lsbCByZXR1cm4gaW4gdGhlIGV2ZW50IHRoYXQgYSBwaWN0dXJlIGNhbm5vdCBiZSBjb3BpZWQKLSAqIG91dCwgbGVhZGluZyB0byBhbiBpbmNyZWFzZSBpbiB0aGUgbGVuZ3RoIG9mIHRoZSBwaXBlbGluZS4gVGhpcyBpbiB0dXJuLAotICogbWVhbnMgd2UgaGF2ZSB0byBiZSBzZW5zaXRpdmUgdG8gdGhlIHRpbWUgaXQgdGFrZXMgdG8gZGVjb2RlIGEgcGljdHVyZTsKLSAqIFdlIGRvIG5vdCB3YW50IHRvIGdpdmUgdXAganVzdCBiZWNhdXNlIHRoZSBoYXJkd2FyZSBuZWVkZWQgYSBsaXR0bGUgbW9yZQotICogdGltZSB0byBwcmVwYXJlIHRoZSBwaWN0dXJlISBGb3IgdGhpcyByZWFzb24sIHRoZXJlIGFyZSBkZWxheXMgaW5jbHVkZWQKLSAqIGluIHRoZSBkZWNvZGUoKSBwYXRoIHRoYXQgZW5zdXJlIHRoYXQsIHVuZGVyIG5vcm1hbCBjb25kaXRpb25zLCB0aGUgaGFyZHdhcmUKLSAqIHdpbGwgb25seSBmYWlsIHRvIHJldHVybiBhIGZyYW1lIGlmIGl0IHJlYWxseSBuZWVkcyBhZGRpdGlvbmFsIHBhY2tldHMgdG8KLSAqIGNvbXBsZXRlIHRoZSBkZWNvZGluZy4KLSAqCi0gKiBGaW5hbGx5LCB0byBiZSBleHBsaWNpdCwgd2UgZG8gbm90IHdhbnQgdGhlIHBpcGVsaW5lIHRvIGdyb3cgd2l0aG91dCBib3VuZAotICogZm9yIHR3byByZWFzb25zOiAxKSBUaGUgaGFyZHdhcmUgY2FuIG9ubHkgYnVmZmVyIGEgZmluaXRlIG51bWJlciBvZiBwYWNrZXRzLAotICogYW5kIDIpIFRoZSBjbGllbnQgYXBwbGljYXRpb24gbWF5IG5vdCBiZSBhYmxlIHRvIGNvcGUgd2l0aCBhcmJpdHJhcmlseSBsb25nCi0gKiBkZWxheXMgaW4gdGhlIHZpZGVvIHBhdGggcmVsYXRpdmUgdG8gdGhlIGF1ZGlvIHBhdGguIEZvciBleGFtcGxlLiBNUGxheWVyCi0gKiBjYW4gb25seSBoYW5kbGUgYSAyMCBwaWN0dXJlIGRlbGF5IChhbHRob3VnaCB0aGlzIGlzIGFyYml0cmFyeSwgYW5kIG5lZWRzCi0gKiB0byBiZSBleHRlbmRlZCB0byBmdWxseSBzdXBwb3J0IHRoZSBDcnlzdGFsSEQgd2hlcmUgdGhlIGRlbGF5IGNvdWxkIGJlIHVwCi0gKiB0byAzMiBwaWN0dXJlcyAtIGNvbnNpZGVyIFBBRkYgSC4yNjQgY29udGVudCB3aXRoIDE2IGItZnJhbWVzKS4KKyAqIEFzIHN1Y2gsIHRoZSBoYXJkd2FyZSBjYW4gb25seSBiZSB1c2VkIGVmZmVjdGl2ZWx5IHdpdGggYSBkZWNvZGUgQVBJIHRoYXQKKyAqIGRvZXNuJ3QgYXNzdW1lIGEgMToxIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGlucHV0IHBhY2tldHMgYW5kIG91dHB1dCBmcmFtZXMuCisgKiBUaGUgbmV3IGF2Y29kZWMgZGVjb2RlIEFQSSBpcyBzdWNoIGFuIEFQSSAoYW4gbTpuIEFQSSkgd2hpbGUgdGhlIG9sZCBvbmUgaXMKKyAqIDE6MS4gQ29uc2VxdWVudGx5LCB3ZSBubyBsb25nZXIgc3VwcG9ydCB0aGUgb2xkIEFQSSwgd2hpY2ggYWxsb3dzIHVzIHRvIGF2b2lkCisgKiB0aGUgdmljaW91cyBoYWNrcyB0aGF0IGFyZSByZXF1aXJlZCB0byBhcHByb3hpbWF0ZSAxOjEgb3BlcmF0aW9uLgogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODMsNyArNTUsNyBAQAogI2luY2x1ZGUgPGxpYmNyeXN0YWxoZC9saWJjcnlzdGFsaGRfaWYuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiZGVjb2RlLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCkBAIC05NywxMCArNjksNiBAQAogI2RlZmluZSBPVVRQVVRfUFJPQ19USU1FT1VUIDUwCiAvKiogU3RlcCBiZXR3ZWVuIGZha2UgdGltZXN0YW1wcyBwYXNzZWQgdG8gaGFyZHdhcmUgaW4gdW5pdHMgb2YgMTAwbnMgKi8KICNkZWZpbmUgVElNRVNUQU1QX1VOSVQgMTAwMDAwCi0vKiogSW5pdGlhbCB2YWx1ZSBpbiB1cyBvZiB0aGUgd2FpdCBpbiBkZWNvZGUoKSAqLwotI2RlZmluZSBCQVNFX1dBSVQgMTAwMDAKLS8qKiBJbmNyZW1lbnQgaW4gdXMgdG8gYWRqdXN0IHdhaXQgaW4gZGVjb2RlKCkgKi8KLSNkZWZpbmUgV0FJVF9VTklUIDEwMDAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTExMSw0NiArNzksMjggQEAKICAgICBSRVRfRVJST1IgICAgICAgICAgID0gLTEsCiAgICAgUkVUX09LICAgICAgICAgICAgICA9IDAsCiAgICAgUkVUX0NPUFlfQUdBSU4gICAgICA9IDEsCi0gICAgUkVUX1NLSVBfTkVYVF9DT1BZICA9IDIsCi0gICAgUkVUX0NPUFlfTkVYVF9GSUVMRCA9IDMsCiB9IENvcHlSZXQ7CiAKIHR5cGVkZWYgc3RydWN0IE9wYXF1ZUxpc3QgewogICAgIHN0cnVjdCBPcGFxdWVMaXN0ICpuZXh0OwogICAgIHVpbnQ2NF90IGZha2VfdGltZXN0YW1wOwogICAgIHVpbnQ2NF90IHJlb3JkZXJlZF9vcGFxdWU7Ci0gICAgdWludDhfdCBwaWNfdHlwZTsKIH0gT3BhcXVlTGlzdDsKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIEFWQ2xhc3MgKmF2X2NsYXNzOwogICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKLSAgICBBVkZyYW1lICpwaWM7CiAgICAgSEFORExFIGRldjsKIAotICAgIHVpbnQ4X3QgKm9yaWdfZXh0cmFkYXRhOwotICAgIHVpbnQzMl90IG9yaWdfZXh0cmFkYXRhX3NpemU7Ci0KLSAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmM7Ci0gICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnBhcnNlcjsKLQogICAgIHVpbnQ4X3QgaXNfNzAwMTI7Ci0gICAgdWludDhfdCAqc3BzX3Bwc19idWY7Ci0gICAgdWludDMyX3Qgc3BzX3Bwc19zaXplOwotICAgIHVpbnQ4X3QgaXNfbmFsOwotICAgIHVpbnQ4X3Qgb3V0cHV0X3JlYWR5OwogICAgIHVpbnQ4X3QgbmVlZF9zZWNvbmRfZmllbGQ7Ci0gICAgdWludDhfdCBza2lwX25leHRfb3V0cHV0OwotICAgIHVpbnQ2NF90IGRlY29kZV93YWl0OwotCi0gICAgdWludDY0X3QgbGFzdF9waWN0dXJlOworICAgIHVpbnQ4X3QgZHJhaW5pbmc7CiAKICAgICBPcGFxdWVMaXN0ICpoZWFkOwogICAgIE9wYXF1ZUxpc3QgKnRhaWw7CiAKICAgICAvKiBPcHRpb25zICovCiAgICAgdWludDMyX3Qgc1dpZHRoOwotICAgIHVpbnQ4X3QgYmZyYW1lX2J1ZzsKIH0gQ0hEQ29udGV4dDsKIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKQEAgLTE4MSw3ICsxMzEsNyBAQAogICAgIGNhc2UgQVZfQ09ERUNfSURfV01WMzoKICAgICAgICAgcmV0dXJuIEJDX01TVUJUWVBFX1dNVjM7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OgotICAgICAgICByZXR1cm4gcHJpdi0+aXNfbmFsID8gQkNfTVNVQlRZUEVfQVZDMSA6IEJDX01TVUJUWVBFX0gyNjQ7CisgICAgICAgIHJldHVybiBCQ19NU1VCVFlQRV9IMjY0OwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBCQ19NU1VCVFlQRV9JTlZBTElEOwogICAgIH0KQEAgLTE4OSw0MiArMTM5LDQyIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmludF9mcmFtZV9pbmZvKENIRENvbnRleHQgKnByaXYsIEJDX0RUU19QUk9DX09VVCAqb3V0cHV0KQogewotICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdFlCdWZmU3o6ICV1XG4iLCBvdXRwdXQtPllidWZmU3opOwotICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdFlCdWZmRG9uZVN6OiAldVxuIiwKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19UUkFDRSwgIlx0WUJ1ZmZTejogJXVcbiIsIG91dHB1dC0+WWJ1ZmZTeik7CisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJcdFlCdWZmRG9uZVN6OiAldVxuIiwKICAgICAgICAgICAgb3V0cHV0LT5ZQnVmZkRvbmVTeik7Ci0gICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0VVZCdWZmRG9uZVN6OiAldVxuIiwKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19UUkFDRSwgIlx0VVZCdWZmRG9uZVN6OiAldVxuIiwKICAgICAgICAgICAgb3V0cHV0LT5VVkJ1ZmZEb25lU3opOwotICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdFRpbWVzdGFtcDogJSJQUkl1NjQiXG4iLAorICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1RSQUNFLCAiXHRUaW1lc3RhbXA6ICUiUFJJdTY0IlxuIiwKICAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLnRpbWVTdGFtcCk7Ci0gICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0UGljdHVyZSBOdW1iZXI6ICV1XG4iLAorICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1RSQUNFLCAiXHRQaWN0dXJlIE51bWJlcjogJXVcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5waWN0dXJlX251bWJlcik7Ci0gICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0V2lkdGg6ICV1XG4iLAorICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1RSQUNFLCAiXHRXaWR0aDogJXVcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby53aWR0aCk7Ci0gICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0SGVpZ2h0OiAldVxuIiwKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19UUkFDRSwgIlx0SGVpZ2h0OiAldVxuIiwKICAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLmhlaWdodCk7Ci0gICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0Q2hyb21hOiAweCUwM3hcbiIsCisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJcdENocm9tYTogMHglMDN4XG4iLAogICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8uY2hyb21hX2Zvcm1hdCk7Ci0gICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0UHVsbGRvd246ICV1XG4iLAorICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1RSQUNFLCAiXHRQdWxsZG93bjogJXVcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5wdWxsZG93bik7Ci0gICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0RmxhZ3M6IDB4JTA4eFxuIiwKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19UUkFDRSwgIlx0RmxhZ3M6IDB4JTA4eFxuIiwKICAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLmZsYWdzKTsKLSAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRGcmFtZSBSYXRlL1JlczogJXVcbiIsCisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJcdEZyYW1lIFJhdGUvUmVzOiAldVxuIiwKICAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLmZyYW1lX3JhdGUpOwotICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdEFzcGVjdCBSYXRpbzogJXVcbiIsCisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJcdEFzcGVjdCBSYXRpbzogJXVcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5hc3BlY3RfcmF0aW8pOwotICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdENvbG9yIFByaW1hcmllczogJXVcbiIsCisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJcdENvbG9yIFByaW1hcmllczogJXVcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5jb2xvdXJfcHJpbWFyaWVzKTsKLSAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRNZXRhRGF0YTogJXVcbiIsCisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJcdE1ldGFEYXRhOiAldVxuIiwKICAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLnBpY3R1cmVfbWV0YV9wYXlsb2FkKTsKLSAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRTZXNzaW9uIE51bWJlcjogJXVcbiIsCisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJcdFNlc3Npb24gTnVtYmVyOiAldVxuIiwKICAgICAgICAgICAgb3V0cHV0LT5QaWNJbmZvLnNlc3NfbnVtKTsKLSAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHR5Y29tOiAldVxuIiwKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19UUkFDRSwgIlx0eWNvbTogJXVcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby55Y29tKTsKLSAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXHRDdXN0b20gQXNwZWN0OiAldVxuIiwKKyAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19UUkFDRSwgIlx0Q3VzdG9tIEFzcGVjdDogJXVcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5jdXN0b21fYXNwZWN0X3JhdGlvX3dpZHRoX2hlaWdodCk7Ci0gICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlx0RnJhbWVzIHRvIERyb3A6ICV1XG4iLAorICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1RSQUNFLCAiXHRGcmFtZXMgdG8gRHJvcDogJXVcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5uX2Ryb3ApOwotICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJcdEgyNjQgVmFsaWQgRmllbGRzOiAweCUwOHhcbiIsCisgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJcdEgyNjQgVmFsaWQgRmllbGRzOiAweCUwOHhcbiIsCiAgICAgICAgICAgIG91dHB1dC0+UGljSW5mby5vdGhlci5oMjY0LnZhbGlkKTsKIH0KIApAQCAtMjMzLDggKzE4Myw3IEBACiAgKiBPcGFxdWVMaXN0IGZ1bmN0aW9ucwogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB1aW50NjRfdCBvcGFxdWVfbGlzdF9wdXNoKENIRENvbnRleHQgKnByaXYsIHVpbnQ2NF90IHJlb3JkZXJlZF9vcGFxdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHBpY190eXBlKQorc3RhdGljIHVpbnQ2NF90IG9wYXF1ZV9saXN0X3B1c2goQ0hEQ29udGV4dCAqcHJpdiwgdWludDY0X3QgcmVvcmRlcmVkX29wYXF1ZSkKIHsKICAgICBPcGFxdWVMaXN0ICpuZXdOb2RlID0gYXZfbWFsbG9jeihzaXplb2YgKE9wYXF1ZUxpc3QpKTsKICAgICBpZiAoIW5ld05vZGUpIHsKQEAgLTI1MSw3ICsyMDAsNiBAQAogICAgIH0KICAgICBwcml2LT50YWlsID0gbmV3Tm9kZTsKICAgICBuZXdOb2RlLT5yZW9yZGVyZWRfb3BhcXVlID0gcmVvcmRlcmVkX29wYXF1ZTsKLSAgICBuZXdOb2RlLT5waWNfdHlwZSA9IHBpY190eXBlOwogCiAgICAgcmV0dXJuIG5ld05vZGUtPmZha2VfdGltZXN0YW1wOwogfQpAQCAtMzIwLDE0ICsyNjgsOCBAQAogewogICAgIENIRENvbnRleHQgKnByaXYgPSBhdmN0eC0+cHJpdl9kYXRhOwogCi0gICAgYXZjdHgtPmhhc19iX2ZyYW1lcyAgICAgPSAwOwotICAgIHByaXYtPmxhc3RfcGljdHVyZSAgICAgID0gLTE7Ci0gICAgcHJpdi0+b3V0cHV0X3JlYWR5ICAgICAgPSAwOwogICAgIHByaXYtPm5lZWRfc2Vjb25kX2ZpZWxkID0gMDsKLSAgICBwcml2LT5za2lwX25leHRfb3V0cHV0ICA9IDA7Ci0gICAgcHJpdi0+ZGVjb2RlX3dhaXQgICAgICAgPSBCQVNFX1dBSVQ7Ci0KLSAgICBhdl9mcmFtZV91bnJlZiAocHJpdi0+cGljKTsKKyAgICBwcml2LT5kcmFpbmluZyAgICAgICAgICA9IDA7CiAKICAgICAvKiBGbHVzaCBtb2RlIDQgZmx1c2hlcyBhbGwgc29mdHdhcmUgYW5kIGhhcmR3YXJlIGJ1ZmZlcnMuICovCiAgICAgRHRzRmx1c2hJbnB1dChwcml2LT5kZXYsIDQpOwpAQCAtMzQ0LDI4ICsyODYsNiBAQAogICAgIER0c0Nsb3NlRGVjb2RlcihkZXZpY2UpOwogICAgIER0c0RldmljZUNsb3NlKGRldmljZSk7CiAKLSAgICAvKgotICAgICAqIFJlc3RvcmUgb3JpZ2luYWwgZXh0cmFkYXRhLCBzbyB0aGF0IGlmIHRoZSBkZWNvZGVyIGlzCi0gICAgICogcmVpbml0aWFsaXNlZCwgdGhlIGJpdHN0cmVhbSBkZXRlY3Rpb24gYW5kIGZpbHRlcmluZwotICAgICAqIHdpbGwgd29yayBhcyBleHBlY3RlZC4KLSAgICAgKi8KLSAgICBpZiAocHJpdi0+b3JpZ19leHRyYWRhdGEpIHsKLSAgICAgICAgYXZfZnJlZShhdmN0eC0+ZXh0cmFkYXRhKTsKLSAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSA9IHByaXYtPm9yaWdfZXh0cmFkYXRhOwotICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBwcml2LT5vcmlnX2V4dHJhZGF0YV9zaXplOwotICAgICAgICBwcml2LT5vcmlnX2V4dHJhZGF0YSA9IE5VTEw7Ci0gICAgICAgIHByaXYtPm9yaWdfZXh0cmFkYXRhX3NpemUgPSAwOwotICAgIH0KLQotICAgIGF2X3BhcnNlcl9jbG9zZShwcml2LT5wYXJzZXIpOwotICAgIGlmIChwcml2LT5ic2ZjKSB7Ci0gICAgICAgIGF2X2JpdHN0cmVhbV9maWx0ZXJfY2xvc2UocHJpdi0+YnNmYyk7Ci0gICAgfQotCi0gICAgYXZfZnJlZXAoJnByaXYtPnNwc19wcHNfYnVmKTsKLQotICAgIGF2X2ZyYW1lX2ZyZWUgKCZwcml2LT5waWMpOwotCiAgICAgaWYgKHByaXYtPmhlYWQpIHsKICAgICAgICBPcGFxdWVMaXN0ICpub2RlID0gcHJpdi0+aGVhZDsKICAgICAgICB3aGlsZSAobm9kZSkgewpAQCAtMzc4LDcgKzI5OCw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIENIRENvbnRleHQqIHByaXY7CkBAIC00MDksMzkgKzMyOCwxMCBAQAogICAgIC8qIEluaXRpYWxpemUgdGhlIGxpYnJhcnkgKi8KICAgICBwcml2ICAgICAgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIHByaXYtPmF2Y3R4ICAgICAgICA9IGF2Y3R4OwotICAgIHByaXYtPmlzX25hbCAgICAgICA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYgKihhdmN0eC0+ZXh0cmFkYXRhKSA9PSAxOwotICAgIHByaXYtPmxhc3RfcGljdHVyZSA9IC0xOwotICAgIHByaXYtPmRlY29kZV93YWl0ICA9IEJBU0VfV0FJVDsKLSAgICBwcml2LT5waWMgICAgICAgICAgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIHByaXYtPmRyYWluaW5nICAgICA9IDA7CiAKICAgICBzdWJ0eXBlID0gaWQyc3VidHlwZShwcml2LCBhdmN0eC0+Y29kZWMtPmlkKTsKICAgICBzd2l0Y2ggKHN1YnR5cGUpIHsKLSAgICBjYXNlIEJDX01TVUJUWVBFX0FWQzE6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmR1bW15X3A7Ci0gICAgICAgICAgICBpbnQgZHVtbXlfaW50OwotCi0gICAgICAgICAgICAvKiBCYWNrIHVwIHRoZSBleHRyYWRhdGEgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGF0IGNsb3NlIHRpbWUuICovCi0gICAgICAgICAgICBwcml2LT5vcmlnX2V4dHJhZGF0YSA9IGF2X21hbGxvYyhhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgICAgIGlmICghcHJpdi0+b3JpZ19leHRyYWRhdGEpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBjb3B5IG9mIGV4dHJhZGF0YVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaXYtPm9yaWdfZXh0cmFkYXRhX3NpemUgPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7Ci0gICAgICAgICAgICBtZW1jcHkocHJpdi0+b3JpZ19leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7Ci0KLSAgICAgICAgICAgIHByaXYtPmJzZmMgPSBhdl9iaXRzdHJlYW1fZmlsdGVyX2luaXQoImgyNjRfbXA0dG9hbm5leGIiKTsKLSAgICAgICAgICAgIGlmICghcHJpdi0+YnNmYykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IG9wZW4gdGhlIGgyNjRfbXA0dG9hbm5leGIgQlNGIVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlNGX05PVF9GT1VORDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF2X2JpdHN0cmVhbV9maWx0ZXJfZmlsdGVyKHByaXYtPmJzZmMsIGF2Y3R4LCBOVUxMLCAmZHVtbXlfcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teV9pbnQsIE5VTEwsIDAsIDApOwotICAgICAgICB9Ci0gICAgICAgIHN1YnR5cGUgPSBCQ19NU1VCVFlQRV9IMjY0OwotICAgICAgICAvLyBGYWxsLXRocm91Z2gKICAgICBjYXNlIEJDX01TVUJUWVBFX0gyNjQ6CiAgICAgICAgIGZvcm1hdC5zdGFydENvZGVTeiA9IDQ7CiAgICAgICAgIC8vIEZhbGwtdGhyb3VnaApAQCAtNTE4LDE0ICs0MDgsNiBAQAogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCi0gICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgewotICAgICAgICBwcml2LT5wYXJzZXIgPSBhdl9wYXJzZXJfaW5pdChhdmN0eC0+Y29kZWMtPmlkKTsKLSAgICAgICAgaWYgKCFwcml2LT5wYXJzZXIpCi0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgb3BlbiB0aGUgaC4yNjQgcGFyc2VyISBJbnRlcmxhY2VkIGguMjY0IGNvbnRlbnQgIgotICAgICAgICAgICAgICAgICAgICJ3aWxsIG5vdCBiZSBkZXRlY3RlZCByZWxpYWJseS5cbiIpOwotICAgICAgICBwcml2LT5wYXJzZXItPmZsYWdzID0gUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTOwotICAgIH0KICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ3J5c3RhbEhEOiBJbml0IGNvbXBsZXRlLlxuIik7CiAKICAgICByZXR1cm4gMDsKQEAgLTUzOCwxNiArNDIwLDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgQ29weVJldCBjb3B5X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDX0RUU19QUk9DX09VVCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfZnJhbWUpCiB7CiAgICAgQkNfU1RBVFVTIHJldDsKICAgICBCQ19EVFNfU1RBVFVTIGRlY29kZXJfc3RhdHVzID0geyAwLCB9OwotICAgIHVpbnQ4X3QgdHJ1c3RfaW50ZXJsYWNlZDsKICAgICB1aW50OF90IGludGVybGFjZWQ7CiAKICAgICBDSERDb250ZXh0ICpwcml2ID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBpbnQ2NF90IHBrdF9wdHMgID0gQVZfTk9QVFNfVkFMVUU7Ci0gICAgdWludDhfdCBwaWNfdHlwZSA9IDA7CiAKICAgICB1aW50OF90IGJvdHRvbV9maWVsZCA9IChvdXRwdXQtPlBpY0luZm8uZmxhZ3MgJiBWREVDX0ZMQUdfQk9UVE9NRklFTEQpID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWREVDX0ZMQUdfQk9UVE9NRklFTEQ7CkBAIC01NjUsMjMgKzQ0NSwxOCBAQAogICAgICAgICBPcGFxdWVMaXN0ICpub2RlID0gb3BhcXVlX2xpc3RfcG9wKHByaXYsIG91dHB1dC0+UGljSW5mby50aW1lU3RhbXApOwogICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICAgcGt0X3B0cyA9IG5vZGUtPnJlb3JkZXJlZF9vcGFxdWU7Ci0gICAgICAgICAgICBwaWNfdHlwZSA9IG5vZGUtPnBpY190eXBlOwogICAgICAgICAgICAgYXZfZnJlZShub2RlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBXZSB3aWxsIGVuY291bnRlciBhIHNpdHVhdGlvbiB3aGVyZSBhIHRpbWVzdGFtcCBjYW5ub3QgYmUKICAgICAgICAgICAgICAqIHBvcHBlZCBpZiBhIHNlY29uZCBmaWVsZCBpcyBiZWluZyByZXR1cm5lZC4gSW4gdGhpcyBjYXNlLAogICAgICAgICAgICAgICogZWFjaCBmaWVsZCBoYXMgdGhlIHNhbWUgdGltZXN0YW1wIGFuZCB0aGUgZmlyc3Qgb25lIHdpbGwKLSAgICAgICAgICAgICAqIGNhdXNlIGl0IHRvIGJlIHBvcHBlZC4gVG8ga2VlcCBzdWJzZXF1ZW50IGNhbGN1bGF0aW9ucwotICAgICAgICAgICAgICogc2ltcGxlLCBwaWNfdHlwZSBzaG91bGQgYmUgc2V0IGEgRklFTEQgdmFsdWUgLSBkb2Vzbid0Ci0gICAgICAgICAgICAgKiBtYXR0ZXIgd2hpY2gsIGJ1dCBJIGNob3NlIEJPVFRPTS4KKyAgICAgICAgICAgICAqIGNhdXNlIGl0IHRvIGJlIHBvcHBlZC4gV2UnbGwgYXZvaWQgb3ZlcndyaXRpbmcgdGhlIHZhbGlkCisgICAgICAgICAgICAgKiB0aW1lc3RhbXAgYmVsb3cuCiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBpY190eXBlID0gUElDVF9CT1RUT01fRklFTEQ7CiAgICAgICAgIH0KICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIm91dHB1dCBcInB0c1wiOiAlIlBSSXU2NCJcbiIsCiAgICAgICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8udGltZVN0YW1wKTsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIm91dHB1dCBwaWN0dXJlIHR5cGUgJWRcbiIsCi0gICAgICAgICAgICAgICBwaWNfdHlwZSk7CiAgICAgfQogCiAgICAgcmV0ID0gRHRzR2V0RHJpdmVyU3RhdHVzKHByaXYtPmRldiwgJmRlY29kZXJfc3RhdHVzKTsKQEAgLTU5MSw2MyArNDY2LDIyIEBACiAgICAgICAgcmV0dXJuIFJFVF9FUlJPUjsKICAgICB9CiAKLSAgICAvKgotICAgICAqIEZvciBtb3N0IGNvbnRlbnQsIHdlIGNhbiB0cnVzdCB0aGUgaW50ZXJsYWNlZCBmbGFnIHJldHVybmVkCi0gICAgICogYnkgdGhlIGhhcmR3YXJlLCBidXQgc29tZXRpbWVzIHdlIGNhbid0LiBUaGVzZSBhcmUgdGhlCi0gICAgICogY29uZGl0aW9ucyB1bmRlciB3aGljaCB3ZSBjYW4gdHJ1c3QgdGhlIGZsYWc6Ci0gICAgICoKLSAgICAgKiAxKSBJdCdzIG5vdCBoLjI2NCBjb250ZW50Ci0gICAgICogMikgVGhlIFVOS05PV05fU1JDIGZsYWcgaXMgbm90IHNldAotICAgICAqIDMpIFdlIGtub3cgd2UncmUgZXhwZWN0aW5nIGEgc2Vjb25kIGZpZWxkCi0gICAgICogNCkgVGhlIGhhcmR3YXJlIHJlcG9ydHMgdGhpcyBwaWN0dXJlIGFuZCB0aGUgbmV4dCBwaWN0dXJlCi0gICAgICogICAgaGF2ZSB0aGUgc2FtZSBwaWN0dXJlIG51bWJlci4KLSAgICAgKgotICAgICAqIE5vdGUgdGhhdCB0aGVyZSBjYW4gc3RpbGwgYmUgaW50ZXJsYWNlZCBjb250ZW50IHRoYXQgd2lsbAotICAgICAqIGZhaWwgdGhpcyBjaGVjaywgaWYgdGhlIGhhcmR3YXJlIGhhc24ndCBkZWNvZGVkIHRoZSBuZXh0Ci0gICAgICogcGljdHVyZSBvciBpZiB0aGVyZSBpcyBhIGNvcnJ1cHRpb24gaW4gdGhlIHN0cmVhbS4gKEluIGVpdGhlcgotICAgICAqIGNhc2UgYSAwIHdpbGwgYmUgcmV0dXJuZWQgZm9yIHRoZSBuZXh0IHBpY3R1cmUgbnVtYmVyKQotICAgICAqLwotICAgIHRydXN0X2ludGVybGFjZWQgPSBhdmN0eC0+Y29kZWMtPmlkICE9IEFWX0NPREVDX0lEX0gyNjQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIShvdXRwdXQtPlBpY0luZm8uZmxhZ3MgJiBWREVDX0ZMQUdfVU5LTk9XTl9TUkMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHByaXYtPm5lZWRfc2Vjb25kX2ZpZWxkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIChkZWNvZGVyX3N0YXR1cy5waWNOdW1GbGFncyAmIH4weDQwMDAwMDAwKSA9PQotICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPlBpY0luZm8ucGljdHVyZV9udW1iZXI7CisgICAgaW50ZXJsYWNlZCA9IG91dHB1dC0+UGljSW5mby5mbGFncyAmIFZERUNfRkxBR19JTlRFUkxBQ0VEX1NSQzsKIAotICAgIC8qCi0gICAgICogSWYgd2UgZ290IGEgZmFsc2UgbmVnYXRpdmUgZm9yIHRydXN0X2ludGVybGFjZWQgb24gdGhlIGZpcnN0IGZpZWxkLAotICAgICAqIHdlIHdpbGwgcmVhbGlzZSBvdXIgbWlzdGFrZSBoZXJlIHdoZW4gd2Ugc2VlIHRoYXQgdGhlIHBpY3R1cmUgbnVtYmVyIGlzIHRoYXQKLSAgICAgKiBvZiB0aGUgcHJldmlvdXMgcGljdHVyZS4gV2UgY2Fubm90IHJlY292ZXIgdGhlIGZyYW1lIGFuZCBzaG91bGQgZGlzY2FyZCB0aGUKLSAgICAgKiBzZWNvbmQgZmllbGQgdG8ga2VlcCB0aGUgY29ycmVjdCBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcy4KLSAgICAgKi8KLSAgICBpZiAob3V0cHV0LT5QaWNJbmZvLnBpY3R1cmVfbnVtYmVyID09IHByaXYtPmxhc3RfcGljdHVyZSAmJiAhcHJpdi0+bmVlZF9zZWNvbmRfZmllbGQpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICJJbmNvcnJlY3RseSBndWVzc2VkIHByb2dyZXNzaXZlIGZyYW1lLiBEaXNjYXJkaW5nIHNlY29uZCBmaWVsZFxuIik7Ci0gICAgICAgIC8qIFJldHVybmluZyB3aXRob3V0IHByb3ZpZGluZyBhIHBpY3R1cmUuICovCi0gICAgICAgIHJldHVybiBSRVRfT0s7Ci0gICAgfQotCi0gICAgaW50ZXJsYWNlZCA9IChvdXRwdXQtPlBpY0luZm8uZmxhZ3MgJiBWREVDX0ZMQUdfSU5URVJMQUNFRF9TUkMpICYmCi0gICAgICAgICAgICAgICAgIHRydXN0X2ludGVybGFjZWQ7Ci0KLSAgICBpZiAoIXRydXN0X2ludGVybGFjZWQgJiYgKGRlY29kZXJfc3RhdHVzLnBpY051bUZsYWdzICYgfjB4NDAwMDAwMDApID09IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICJOZXh0IHBpY3R1cmUgbnVtYmVyIHVua25vd24uIEFzc3VtaW5nIHByb2dyZXNzaXZlIGZyYW1lLlxuIik7Ci0gICAgfQotCi0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkludGVybGFjZWQgc3RhdGU6ICVkIHwgdHJ1c3RfaW50ZXJsYWNlZCAlZFxuIiwKLSAgICAgICAgICAgaW50ZXJsYWNlZCwgdHJ1c3RfaW50ZXJsYWNlZCk7Ci0KLSAgICBpZiAocHJpdi0+cGljLT5kYXRhWzBdICYmICFwcml2LT5uZWVkX3NlY29uZF9maWVsZCkKLSAgICAgICAgYXZfZnJhbWVfdW5yZWYocHJpdi0+cGljKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiSW50ZXJsYWNlZCBzdGF0ZTogJWRcbiIsCisgICAgICAgICAgIGludGVybGFjZWQpOwogCiAgICAgcHJpdi0+bmVlZF9zZWNvbmRfZmllbGQgPSBpbnRlcmxhY2VkICYmICFwcml2LT5uZWVkX3NlY29uZF9maWVsZDsKIAotICAgIGlmICghcHJpdi0+cGljLT5kYXRhWzBdKSB7Ci0gICAgICAgIGlmIChmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwcml2LT5waWMsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpIDwgMCkKKyAgICBpZiAoIWZyYW1lLT5kYXRhWzBdKSB7CisgICAgICAgIGlmIChmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIFJFVF9FUlJPUjsKICAgICB9CiAKICAgICBid2lkdGggPSBhdl9pbWFnZV9nZXRfbGluZXNpemUoYXZjdHgtPnBpeF9mbXQsIHdpZHRoLCAwKTsKKyAgICBpZiAoYndpZHRoIDwgMCkKKyAgICAgICByZXR1cm4gUkVUX0VSUk9SOworCiAgICAgaWYgKHByaXYtPmlzXzcwMDEyKSB7CiAgICAgICAgIGludCBwU3RyaWRlOwogCkBAIC02NTcsMTUgKzQ5MSwyNiBAQAogICAgICAgICAgICAgcFN0cmlkZSA9IDEyODA7CiAgICAgICAgIGVsc2UgcFN0cmlkZSA9IDE5MjA7CiAgICAgICAgIHNTdHJpZGUgPSBhdl9pbWFnZV9nZXRfbGluZXNpemUoYXZjdHgtPnBpeF9mbXQsIHBTdHJpZGUsIDApOworICAgICAgICBpZiAoc1N0cmlkZSA8IDApCisgICAgICAgICAgICByZXR1cm4gUkVUX0VSUk9SOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHNTdHJpZGUgPSBid2lkdGg7CiAgICAgfQogCi0gICAgZFN0cmlkZSA9IHByaXYtPnBpYy0+bGluZXNpemVbMF07Ci0gICAgZHN0ICAgICA9IHByaXYtPnBpYy0+ZGF0YVswXTsKKyAgICBkU3RyaWRlID0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGRzdCAgICAgPSBmcmFtZS0+ZGF0YVswXTsKIAogICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDcnlzdGFsSEQ6IENvcHlpbmcgb3V0IGZyYW1lXG4iKTsKIAorICAgIC8qCisgICAgICogVGhlIGhhcmR3YXJlIGRvZXNuJ3QgcmV0dXJuIHRoZSBmaXJzdCBzYW1wbGUgb2YgYSBwaWN0dXJlLgorICAgICAqIElnbm9yaW5nIHdoeSBpdCBiZWhhdmVzIHRoaXMgd2F5LCBpdCdzIGJldHRlciB0byBjb3B5IHRoZSBzYW1wbGUgZnJvbQorICAgICAqIHRoZSBzZWNvbmQgbGluZSwgcmF0aGVyIHRoYW4gdGhlIG5leHQgc2FtcGxlIGFjcm9zcyBiZWNhdXNlIHRoZSBjaHJvbWEKKyAgICAgKiB2YWx1ZXMgc2hvdWxkIGJlIGNvcnJlY3QgKGFzc3VtaW5nIHRoZSBkZWNvZGVkIHZpZGVvIHdhcyA0OjI6MCwgd2hpY2gKKyAgICAgKiBpdCB3YXMpLgorICAgICAqLworICAgICooKHVpbnQzMl90ICopc3JjKSA9ICooKHVpbnQzMl90ICopKHNyYyArIHNTdHJpZGUpKTsKKwogICAgIGlmIChpbnRlcmxhY2VkKSB7CiAgICAgICAgIGludCBkWSA9IDA7CiAgICAgICAgIGludCBzWSA9IDA7CkBAIC02ODcsNTMgKzUzMiwzMyBAQAogICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdCwgZFN0cmlkZSwgc3JjLCBzU3RyaWRlLCBid2lkdGgsIGhlaWdodCk7CiAgICAgfQogCi0gICAgcHJpdi0+cGljLT5pbnRlcmxhY2VkX2ZyYW1lID0gaW50ZXJsYWNlZDsKKyAgICBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9IGludGVybGFjZWQ7CiAgICAgaWYgKGludGVybGFjZWQpCi0gICAgICAgIHByaXYtPnBpYy0+dG9wX2ZpZWxkX2ZpcnN0ID0gIWJvdHRvbV9maXJzdDsKKyAgICAgICAgZnJhbWUtPnRvcF9maWVsZF9maXJzdCA9ICFib3R0b21fZmlyc3Q7CiAKLSAgICBwcml2LT5waWMtPnBrdF9wdHMgPSBwa3RfcHRzOworICAgIGZyYW1lLT5wdHMgPSBwa3RfcHRzOworI2lmIEZGX0FQSV9QS1RfUFRTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgZnJhbWUtPnBrdF9wdHMgPSBwa3RfcHRzOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworICAgIGZyYW1lLT5wa3RfcG9zID0gLTE7CisgICAgZnJhbWUtPnBrdF9kdXJhdGlvbiA9IDA7CisgICAgZnJhbWUtPnBrdF9zaXplID0gLTE7CiAKICAgICBpZiAoIXByaXYtPm5lZWRfc2Vjb25kX2ZpZWxkKSB7CiAgICAgICAgICpnb3RfZnJhbWUgICAgICAgPSAxOwotICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBwcml2LT5waWMpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gUkVUX0NPUFlfQUdBSU47CiAgICAgfQogCi0gICAgLyoKLSAgICAgKiBUd28gdHlwZXMgb2YgUEFGRiBjb250ZW50IGhhdmUgYmVlbiBvYnNlcnZlZC4gT25lIGZvcm0gY2F1c2VzIHRoZQotICAgICAqIGhhcmR3YXJlIHRvIHJldHVybiBhIGZpZWxkIHBhaXIgYW5kIHRoZSBvdGhlciBpbmRpdmlkdWFsIGZpZWxkcywKLSAgICAgKiBldmVuIHRob3VnaCB0aGUgaW5wdXQgaXMgYWx3YXlzIGluZGl2aWR1YWwgZmllbGRzLiBXZSBtdXN0IHNraXAKLSAgICAgKiBjb3B5aW5nIG9uIHRoZSBuZXh0IGRlY29kZSgpIGNhbGwgdG8gbWFpbnRhaW4gcGlwZWxpbmUgbGVuZ3RoIGluCi0gICAgICogdGhlIGZpcnN0IGNhc2UuCi0gICAgICovCi0gICAgaWYgKCFpbnRlcmxhY2VkICYmIChvdXRwdXQtPlBpY0luZm8uZmxhZ3MgJiBWREVDX0ZMQUdfVU5LTk9XTl9TUkMpICYmCi0gICAgICAgIChwaWNfdHlwZSA9PSBQSUNUX1RPUF9GSUVMRCB8fCBwaWNfdHlwZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCkpIHsKLSAgICAgICAgYXZfbG9nKHByaXYtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkZpZWxkcGFpciBmcm9tIHR3byBwYWNrZXRzLlxuIik7Ci0gICAgICAgIHJldHVybiBSRVRfU0tJUF9ORVhUX0NPUFk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgbG9naWMgaGVyZSBpcyBwdXJlbHkgYmFzZWQgb24gZW1waXJpY2FsIHRlc3Rpbmcgd2l0aCBzYW1wbGVzLgotICAgICAqIElmIHdlIG5lZWQgYSBzZWNvbmQgZmllbGQsIGl0IGNvdWxkIGNvbWUgZnJvbSBhIHNlY29uZCBpbnB1dCBwYWNrZXQsCi0gICAgICogb3IgaXQgY291bGQgY29tZSBmcm9tIHRoZSBzYW1lIGZpZWxkLXBhaXIgaW5wdXQgcGFja2V0IGF0IHRoZSBjdXJyZW50Ci0gICAgICogZmllbGQuIEluIHRoZSBmaXJzdCBjYXNlLCB3ZSBzaG91bGQgcmV0dXJuIGFuZCB3YWl0IGZvciB0aGUgbmV4dCB0aW1lCi0gICAgICogcm91bmQgdG8gZ2V0IHRoZSBzZWNvbmQgZmllbGQsIHdoaWxlIGluIHRoZSBzZWNvbmQgY2FzZSwgd2Ugc2hvdWxkCi0gICAgICogYXNrIHRoZSBkZWNvZGVyIGZvciBpdCBpbW1lZGlhdGVseS4KLSAgICAgKgotICAgICAqIFRlc3RpbmcgaGFzIHNob3duIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCB0aGUgZmllbGRwYWlyIC0+IHR3byBmaWVsZHMKLSAgICAgKiBjYXNlIGlmIHRoZSBWREVDX0ZMQUdfVU5LTk9XTl9TUkMgaXMgbm90IHNldCBvciBpZiB0aGUgaW5wdXQgcGljdHVyZQotICAgICAqIHR5cGUgd2FzIFBJQ1RfRlJBTUUgKGluIHRoaXMgc2Vjb25kIGNhc2UsIHRoZSBmbGFnIG1pZ2h0IHN0aWxsIGJlIHNldCkKLSAgICAgKi8KLSAgICByZXR1cm4gcHJpdi0+bmVlZF9zZWNvbmRfZmllbGQgJiYKLSAgICAgICAgICAgKCEob3V0cHV0LT5QaWNJbmZvLmZsYWdzICYgVkRFQ19GTEFHX1VOS05PV05fU1JDKSB8fAotICAgICAgICAgICAgcGljX3R5cGUgPT0gUElDVF9GUkFNRSkgPwotICAgICAgICAgICBSRVRfQ09QWV9ORVhUX0ZJRUxEIDogUkVUX09LOworICAgIHJldHVybiBSRVRfT0s7CiB9CiAKIAogc3RhdGljIGlubGluZSBDb3B5UmV0IHJlY2VpdmVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfZnJhbWUpCiB7CiAgICAgQkNfU1RBVFVTIHJldDsKICAgICBCQ19EVFNfUFJPQ19PVVQgb3V0cHV0ID0gewpAQCAtODA1LDU2ICs2MzAsMTYgQEAKICAgICB9IGVsc2UgaWYgKHJldCA9PSBCQ19TVFNfU1VDQ0VTUykgewogICAgICAgICBpbnQgY29weV9yZXQgPSAtMTsKICAgICAgICAgaWYgKG91dHB1dC5Qb3V0RmxhZ3MgJiBCQ19QT1VUX0ZMQUdTX1BJQl9WQUxJRCkgewotICAgICAgICAgICAgaWYgKHByaXYtPmxhc3RfcGljdHVyZSA9PSAtMSkgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSW5pdCB0byBvbmUgbGVzcywgc28gdGhhdCB0aGUgaW5jcmVtZW50aW5nIGNvZGUgZG9lc24ndAotICAgICAgICAgICAgICAgICAqIG5lZWQgdG8gYmUgc3BlY2lhbC1jYXNlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcml2LT5sYXN0X3BpY3R1cmUgPSBvdXRwdXQuUGljSW5mby5waWN0dXJlX251bWJlciAtIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX01QRUc0ICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0LlBpY0luZm8udGltZVN0YW1wID09IDAgJiYgcHJpdi0+YmZyYW1lX2J1ZykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICJDcnlzdGFsSEQ6IE5vdCByZXR1cm5pbmcgcGFja2VkIGZyYW1lIHR3aWNlLlxuIik7Ci0gICAgICAgICAgICAgICAgcHJpdi0+bGFzdF9waWN0dXJlKys7Ci0gICAgICAgICAgICAgICAgRHRzUmVsZWFzZU91dHB1dEJ1ZmZzKGRldiwgTlVMTCwgRkFMU0UpOwotICAgICAgICAgICAgICAgIHJldHVybiBSRVRfQ09QWV9BR0FJTjsKLSAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgcHJpbnRfZnJhbWVfaW5mbyhwcml2LCAmb3V0cHV0KTsKIAotICAgICAgICAgICAgaWYgKHByaXYtPmxhc3RfcGljdHVyZSArIDEgPCBvdXRwdXQuUGljSW5mby5waWN0dXJlX251bWJlcikgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICJDcnlzdGFsSEQ6IFBpY3R1cmUgTnVtYmVyIGRpc2NvbnRpbnVpdHlcbiIpOwotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogSGF2ZSB3ZSBsb3N0IGZyYW1lcz8gSWYgc28sIHdlIG5lZWQgdG8gc2hyaW5rIHRoZQotICAgICAgICAgICAgICAgICAqIHBpcGVsaW5lIGxlbmd0aCBhcHByb3ByaWF0ZWx5LgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogWFhYOiBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBzaXR1YXRpb24KLSAgICAgICAgICAgICAgICAgKiBhcmUgc28gSSBkb24ndCBldmVuIGtub3cgaWYgd2UndmUgbG9zdCBmcmFtZXMgb3Igd2hpY2gKLSAgICAgICAgICAgICAgICAgKiBvbmVzLgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogSW4gYW55IGNhc2UsIG9ubHkgd2FybiB0aGUgZmlyc3QgdGltZS4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgIHByaXYtPmxhc3RfcGljdHVyZSA9IG91dHB1dC5QaWNJbmZvLnBpY3R1cmVfbnVtYmVyIC0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY29weV9yZXQgPSBjb3B5X2ZyYW1lKGF2Y3R4LCAmb3V0cHV0LCBkYXRhLCBnb3RfZnJhbWUpOwotICAgICAgICAgICAgaWYgKCpnb3RfZnJhbWUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPmhhc19iX2ZyYW1lcy0tOwotICAgICAgICAgICAgICAgIHByaXYtPmxhc3RfcGljdHVyZSsrOwotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDcnlzdGFsSEQ6IFBpcGVsaW5lIGxlbmd0aDogJXVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY29weV9yZXQgPSBjb3B5X2ZyYW1lKGF2Y3R4LCAmb3V0cHV0LCBmcmFtZSwgZ290X2ZyYW1lKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBBbiBpbnZhbGlkIGZyYW1lIGhhcyBiZWVuIGNvbnN1bWVkLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNyeXN0YWxIRDogUHJvY091dHB1dCBzdWNjZWVkZWQgd2l0aCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgUElCXG4iKTsKLSAgICAgICAgICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMtLTsKLSAgICAgICAgICAgIGNvcHlfcmV0ID0gUkVUX09LOworICAgICAgICAgICAgY29weV9yZXQgPSBSRVRfQ09QWV9BR0FJTjsKICAgICAgICAgfQogICAgICAgICBEdHNSZWxlYXNlT3V0cHV0QnVmZnMoZGV2LCBOVUxMLCBGQUxTRSk7CiAKQEAgLTg2NywzNjAgKzY1MiwxNjUgQEAKICAgICB9CiB9CiAKLQotc3RhdGljIGludCBkZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQorc3RhdGljIGludCBjcnlzdGFsaGRfZGVjb2RlX3BhY2tldChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWUGFja2V0ICphdnBrdCkKIHsKLSAgICBCQ19TVEFUVVMgcmV0OworICAgIEJDX1NUQVRVUyBiY19yZXQ7CisgICAgQ0hEQ29udGV4dCAqcHJpdiAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBIQU5ETEUgZGV2ICAgICAgICAgPSBwcml2LT5kZXY7CisgICAgQVZQYWNrZXQgZmlsdGVyZWRfcGFja2V0ID0geyAwIH07CisgICAgaW50IHJldCA9IDA7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ3J5c3RhbEhEOiBkZWNvZGVfcGFja2V0XG4iKTsKKworICAgIGlmIChhdnBrdCAmJiBhdnBrdC0+c2l6ZSkgeworICAgICAgICB1aW50NjRfdCBwdHM7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGVzcGl0ZSBiZWluZyBub3Rpb25hbGx5IG9wYXF1ZSwgZWl0aGVyIGxpYmNyeXN0YWxoZCBvcgorICAgICAgICAgKiB0aGUgaGFyZHdhcmUgaXRzZWxmIHdpbGwgbWFuZ2xlIHB0cyB2YWx1ZXMgdGhhdCBhcmUgdG9vCisgICAgICAgICAqIHNtYWxsIG9yIHRvbyBsYXJnZS4gVGhlIGRvY3MgY2xhaW0gaXQgc2hvdWxkIGJlIGluIHVuaXRzCisgICAgICAgICAqIG9mIDEwMG5zLiBHaXZlbiB0aGF0IHdlJ3JlIG5vbWluYWxseSBkZWFsaW5nIHdpdGggYSBibGFjaworICAgICAgICAgKiBib3ggb24gYm90aCBzaWRlcywgYW55IHRyYW5zZm9ybSB3ZSBkbyBoYXMgbm8gZ3VhcmFudGVlIG9mCisgICAgICAgICAqIGF2b2lkaW5nIG1hbmdsaW5nIHNvIHdlIG5lZWQgdG8gYnVpbGQgYSBtYXBwaW5nIHRvIHZhbHVlcworICAgICAgICAgKiB3ZSBrbm93IHdpbGwgbm90IGJlIG1hbmdsZWQuCisgICAgICAgICAqLworICAgICAgICBwdHMgPSBvcGFxdWVfbGlzdF9wdXNoKHByaXYsIGF2cGt0LT5wdHMpOworICAgICAgICBpZiAoIXB0cykgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhwcml2LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAiaW5wdXQgXCJwdHNcIjogJSJQUkl1NjQiXG4iLCBwdHMpOworICAgICAgICBiY19yZXQgPSBEdHNQcm9jSW5wdXQoZGV2LCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUsIHB0cywgMCk7CisgICAgICAgIGlmIChiY19yZXQgPT0gQkNfU1RTX0JVU1kpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogUHJvY0lucHV0IHJldHVybmVkIGJ1c3lcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFQUdBSU4pOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9IGVsc2UgaWYgKGJjX3JldCAhPSBCQ19TVFNfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogUHJvY0lucHV0IGZhaWxlZDogJXVcbiIsIHJldCk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJDcnlzdGFsSEQ6IE5vIG1vcmUgaW5wdXQgZGF0YVxuIik7CisgICAgICAgIHByaXYtPmRyYWluaW5nID0gMTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgICAgIGdvdG8gZXhpdDsKKyAgICB9CisgZXhpdDoKKyAgICBhdl9wYWNrZXRfdW5yZWYoJmZpbHRlcmVkX3BhY2tldCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjcnlzdGFsaGRfcmVjZWl2ZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEJDX1NUQVRVUyBiY19yZXQ7CiAgICAgQkNfRFRTX1NUQVRVUyBkZWNvZGVyX3N0YXR1cyA9IHsgMCwgfTsKICAgICBDb3B5UmV0IHJlY19yZXQ7CiAgICAgQ0hEQ29udGV4dCAqcHJpdiAgID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBIQU5ETEUgZGV2ICAgICAgICAgPSBwcml2LT5kZXY7Ci0gICAgdWludDhfdCAqaW5fZGF0YSAgID0gYXZwa3QtPmRhdGE7Ci0gICAgaW50IGxlbiAgICAgICAgICAgID0gYXZwa3QtPnNpemU7Ci0gICAgaW50IGZyZWVfZGF0YSAgICAgID0gMDsKLSAgICB1aW50OF90IHBpY190eXBlICAgPSAwOworICAgIGludCBnb3RfZnJhbWUgPSAwOworICAgIGludCByZXQgPSAwOworICAgIEFWUGFja2V0IHBrdCA9IHswfTsKIAotICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDcnlzdGFsSEQ6IGRlY29kZV9mcmFtZVxuIik7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNyeXN0YWxIRDogcmVjZWl2ZV9mcmFtZVxuIik7CiAKLSAgICBpZiAoYXZwa3QtPnNpemUgPT0gNyAmJiAhcHJpdi0+YmZyYW1lX2J1ZykgeworICAgIHJldCA9IGZmX2RlY29kZV9nZXRfcGFja2V0KGF2Y3R4LCAmcGt0KTsKKyAgICBpZiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICB3aGlsZSAocGt0LnNpemUgPiBEdHNUeEZyZWVTaXplKGRldikpIHsKICAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHVzZSBvZiBhIGRyb3AgZnJhbWUgdHJpZ2dlcnMgdGhlIGJ1ZworICAgICAgICAgKiBCbG9jayB1bnRpbCB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgYnVmZmVyIGZvciB0aGUgbmV4dCBwYWNrZXQuCisgICAgICAgICAqIFdlIGFzc3VtZSB0aGF0IHRoZSBoYXJkd2FyZSB3aWxsIG1ha2UgZm9yd2FyZCBwcm9ncmVzcyBhdCB0aGlzCisgICAgICAgICAqIHBvaW50LCBhbHRob3VnaCBpbiBwYXRob2xvZ2ljYWwgY2FzZXMgdGhhdCBtYXkgbm90IGhhcHBlbi4KICAgICAgICAgICovCi0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBFbmFibGluZyB3b3JrLWFyb3VuZCBmb3IgcGFja2VkIGItZnJhbWUgYnVnXG4iKTsKLSAgICAgICAgcHJpdi0+YmZyYW1lX2J1ZyA9IDE7Ci0gICAgfSBlbHNlIGlmIChhdnBrdC0+c2l6ZSA9PSA4ICYmIHByaXYtPmJmcmFtZV9idWcpIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogRGVsYXkgZnJhbWVzIGRvbid0IHRyaWdnZXIgdGhlIGJ1ZwotICAgICAgICAgKi8KLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICJDcnlzdGFsSEQ6IERpc2FibGluZyB3b3JrLWFyb3VuZCBmb3IgcGFja2VkIGItZnJhbWUgYnVnXG4iKTsKLSAgICAgICAgcHJpdi0+YmZyYW1lX2J1ZyA9IDA7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1RSQUNFLCAiQ3J5c3RhbEhEOiBXYWl0aW5nIGZvciBzcGFjZSBpbiBpbnB1dCBidWZmZXJcbiIpOwogICAgIH0KIAotICAgIGlmIChsZW4pIHsKLSAgICAgICAgaW50MzJfdCB0eF9mcmVlID0gKGludDMyX3QpRHRzVHhGcmVlU2l6ZShkZXYpOwotCi0gICAgICAgIGlmIChwcml2LT5wYXJzZXIpIHsKLSAgICAgICAgICAgIGludCByZXQgPSAwOwotCi0gICAgICAgICAgICBpZiAocHJpdi0+YnNmYykgewotICAgICAgICAgICAgICAgIHJldCA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfZmlsdGVyKHByaXYtPmJzZmMsIGF2Y3R4LCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbl9kYXRhLCAmbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cGt0LT5kYXRhLCBsZW4sIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZV9kYXRhID0gcmV0ID4gMDsKLQotICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqcG91dDsKLSAgICAgICAgICAgICAgICBpbnQgcHNpemU7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4OwotICAgICAgICAgICAgICAgIEgyNjRDb250ZXh0ICpoID0gcHJpdi0+cGFyc2VyLT5wcml2X2RhdGE7Ci0KLSAgICAgICAgICAgICAgICBpbmRleCA9IGF2X3BhcnNlcl9wYXJzZTIocHJpdi0+cGFyc2VyLCBhdmN0eCwgJnBvdXQsICZwc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZGF0YSwgbGVuLCBhdmN0eC0+aW50ZXJuYWwtPnBrdC0+cHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnBrdC0+ZHRzLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBGYWlsZWQgdG8gcGFyc2UgaC4yNjQgcGFja2V0IHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXRlY3QgaW50ZXJsYWNpbmcuXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZGV4ICE9IGxlbikgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogRmFpbGVkIHRvIHBhcnNlIGguMjY0IHBhY2tldCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcGxldGVseS4gSW50ZXJsYWNlZCBmcmFtZXMgbWF5IGJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3RseSBkZXRlY3RlZC5cbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBwYXJzZXIgcGljdHVyZSB0eXBlICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOwotICAgICAgICAgICAgICAgICAgICBwaWNfdHlwZSA9IGgtPnBpY3R1cmVfc3RydWN0dXJlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgIkNyeXN0YWxIRDogbXA0dG9hbm5leGIgZmlsdGVyIGZhaWxlZCB0byBmaWx0ZXIgIgotICAgICAgICAgICAgICAgICAgICAgICAicGFja2V0LiBJbnRlcmxhY2VkIGZyYW1lcyBtYXkgYmUgaW5jb3JyZWN0bHkgIgotICAgICAgICAgICAgICAgICAgICAgICAiZGV0ZWN0ZWQuXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsZW4gPCB0eF9mcmVlIC0gMTAyNCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIERlc3BpdGUgYmVpbmcgbm90aW9uYWxseSBvcGFxdWUsIGVpdGhlciBsaWJjcnlzdGFsaGQgb3IKLSAgICAgICAgICAgICAqIHRoZSBoYXJkd2FyZSBpdHNlbGYgd2lsbCBtYW5nbGUgcHRzIHZhbHVlcyB0aGF0IGFyZSB0b28KLSAgICAgICAgICAgICAqIHNtYWxsIG9yIHRvbyBsYXJnZS4gVGhlIGRvY3MgY2xhaW0gaXQgc2hvdWxkIGJlIGluIHVuaXRzCi0gICAgICAgICAgICAgKiBvZiAxMDBucy4gR2l2ZW4gdGhhdCB3ZSdyZSBub21pbmFsbHkgZGVhbGluZyB3aXRoIGEgYmxhY2sKLSAgICAgICAgICAgICAqIGJveCBvbiBib3RoIHNpZGVzLCBhbnkgdHJhbnNmb3JtIHdlIGRvIGhhcyBubyBndWFyYW50ZWUgb2YKLSAgICAgICAgICAgICAqIGF2b2lkaW5nIG1hbmdsaW5nIHNvIHdlIG5lZWQgdG8gYnVpbGQgYSBtYXBwaW5nIHRvIHZhbHVlcwotICAgICAgICAgICAgICogd2Uga25vdyB3aWxsIG5vdCBiZSBtYW5nbGVkLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICB1aW50NjRfdCBwdHMgPSBvcGFxdWVfbGlzdF9wdXNoKHByaXYsIGF2Y3R4LT5pbnRlcm5hbC0+cGt0LT5wdHMsIHBpY190eXBlKTsKLSAgICAgICAgICAgIGlmICghcHRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZyZWVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmaW5fZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdl9sb2cocHJpdi0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLAotICAgICAgICAgICAgICAgICAgICJpbnB1dCBcInB0c1wiOiAlIlBSSXU2NCJcbiIsIHB0cyk7Ci0gICAgICAgICAgICByZXQgPSBEdHNQcm9jSW5wdXQoZGV2LCBpbl9kYXRhLCBsZW4sIHB0cywgMCk7Ci0gICAgICAgICAgICBpZiAoZnJlZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZXAoJmluX2RhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJldCA9PSBCQ19TVFNfQlVTWSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICJDcnlzdGFsSEQ6IFByb2NJbnB1dCByZXR1cm5lZCBidXN5XG4iKTsKLSAgICAgICAgICAgICAgICB1c2xlZXAoQkFTRV9XQUlUKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQlVTWSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBCQ19TVFNfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiQ3J5c3RhbEhEOiBQcm9jSW5wdXQgZmFpbGVkOiAldVxuIiwgcmV0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdmN0eC0+aGFzX2JfZnJhbWVzKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ3J5c3RhbEhEOiBJbnB1dCBidWZmZXIgZnVsbFxuIik7Ci0gICAgICAgICAgICBsZW4gPSAwOyAvLyBXZSBkaWRuJ3QgY29uc3VtZSBhbnkgYnl0ZXMuCi0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQ3J5c3RhbEhEOiBObyBtb3JlIGlucHV0IGRhdGFcbiIpOworICAgIHJldCA9IGNyeXN0YWxoZF9kZWNvZGVfcGFja2V0KGF2Y3R4LCAmcGt0KTsKKyAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgLy8gY3J5c3RhbGhkX2lzX2J1ZmZlcl9mdWxsKCkgc2hvdWxkIGF2b2lkIHRoaXMuCisgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKICAgICB9Ci0KLSAgICBpZiAocHJpdi0+c2tpcF9uZXh0X291dHB1dCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ3J5c3RhbEhEOiBTa2lwcGluZyBuZXh0IG91dHB1dC5cbiIpOwotICAgICAgICBwcml2LT5za2lwX25leHRfb3V0cHV0ID0gMDsKLSAgICAgICAgYXZjdHgtPmhhc19iX2ZyYW1lcy0tOwotICAgICAgICByZXR1cm4gbGVuOwotICAgIH0KLQotICAgIHJldCA9IER0c0dldERyaXZlclN0YXR1cyhkZXYsICZkZWNvZGVyX3N0YXR1cyk7Ci0gICAgaWYgKHJldCAhPSBCQ19TVFNfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNyeXN0YWxIRDogR2V0RHJpdmVyU3RhdHVzIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIE5vIGZyYW1lcyByZWFkeS4gRG9uJ3QgdHJ5IHRvIGV4dHJhY3QuCi0gICAgICoKLSAgICAgKiBFbXBpcmljYWwgdGVzdGluZyBzaG93cyB0aGF0IFJlYWR5TGlzdENvdW50IGNhbiBiZSBhIGRhbW4gbGllLAotICAgICAqIGFuZCBQcm9jT3V0IHN0aWxsIGZhaWxzIHdoZW4gY291bnQgPiAwLiBUaGUgc2FtZSB0ZXN0aW5nIHNob3dlZAotICAgICAqIHRoYXQgdHdvIG1vcmUgaXRlcmF0aW9ucyB3ZXJlIG5lZWRlZCBiZWZvcmUgUHJvY091dHB1dCB3b3VsZAotICAgICAqIHN1Y2NlZWQuCi0gICAgICovCi0gICAgaWYgKHByaXYtPm91dHB1dF9yZWFkeSA8IDIpIHsKLSAgICAgICAgaWYgKGRlY29kZXJfc3RhdHVzLlJlYWR5TGlzdENvdW50ICE9IDApCi0gICAgICAgICAgICBwcml2LT5vdXRwdXRfcmVhZHkrKzsKLSAgICAgICAgdXNsZWVwKEJBU0VfV0FJVCk7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJDcnlzdGFsSEQ6IEZpbGxpbmcgcGlwZWxpbmUuXG4iKTsKLSAgICAgICAgcmV0dXJuIGxlbjsKLSAgICB9IGVsc2UgaWYgKGRlY29kZXJfc3RhdHVzLlJlYWR5TGlzdENvdW50ID09IDApIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQWZ0ZXIgdGhlIHBpcGVsaW5lIGlzIGVzdGFibGlzaGVkLCBpZiB3ZSBlbmNvdW50ZXIgYSBsYWNrIG9mIGZyYW1lcwotICAgICAgICAgKiB0aGF0IHByb2JhYmx5IG1lYW5zIHdlJ3JlIG5vdCBnaXZpbmcgdGhlIGhhcmR3YXJlIGVub3VnaCB0aW1lIHRvCi0gICAgICAgICAqIGRlY29kZSB0aGVtLCBzbyBzdGFydCBpbmNyZWFzaW5nIHRoZSB3YWl0IHRpbWUgYXQgdGhlIGVuZCBvZiBhCi0gICAgICAgICAqIGRlY29kZSBjYWxsLgotICAgICAgICAgKi8KLSAgICAgICAgdXNsZWVwKEJBU0VfV0FJVCk7Ci0gICAgICAgIHByaXYtPmRlY29kZV93YWl0ICs9IFdBSVRfVU5JVDsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkNyeXN0YWxIRDogTm8gZnJhbWVzIHJlYWR5LiBSZXR1cm5pbmdcbiIpOwotICAgICAgICByZXR1cm4gbGVuOworICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikgeworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIGRvIHsKLSAgICAgICAgcmVjX3JldCA9IHJlY2VpdmVfZnJhbWUoYXZjdHgsIGRhdGEsIGdvdF9mcmFtZSk7Ci0gICAgICAgIGlmIChyZWNfcmV0ID09IFJFVF9PSyAmJiAqZ290X2ZyYW1lID09IDApIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGlzIGNhc2UgaXMgZm9yIHdoZW4gdGhlIGVuY29kZWQgZmllbGRzIGFyZSBzdG9yZWQKLSAgICAgICAgICAgICAqIHNlcGFyYXRlbHkgYW5kIHdlIGdldCBhIHNlcGFyYXRlIGF2cGt0IGZvciBlYWNoIG9uZS4gVG8ga2VlcAotICAgICAgICAgICAgICogdGhlIHBpcGVsaW5lIHN0YWJsZSwgd2Ugc2hvdWxkIHJldHVybiBub3RoaW5nIGFuZCB3YWl0IGZvcgotICAgICAgICAgICAgICogdGhlIG5leHQgdGltZSByb3VuZCB0byBncmFiIHRoZSBzZWNvbmQgZmllbGQuCi0gICAgICAgICAgICAgKiBILjI2NCBQQUZGIGlzIGFuIGV4YW1wbGUgb2YgdGhpcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlJldHVybmluZyBhZnRlciBmaXJzdCBmaWVsZC5cbiIpOwotICAgICAgICAgICAgYXZjdHgtPmhhc19iX2ZyYW1lcy0tOwotICAgICAgICB9IGVsc2UgaWYgKHJlY19yZXQgPT0gUkVUX0NPUFlfTkVYVF9GSUVMRCkgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoaXMgY2FzZSBpcyBmb3Igd2hlbiB0aGUgZW5jb2RlZCBmaWVsZHMgYXJlIHN0b3JlZCBpbiBhCi0gICAgICAgICAgICAgKiBzaW5nbGUgYXZwa3QgYnV0IHRoZSBoYXJkd2FyZSByZXR1cm5zIHRoZW4gc2VwYXJhdGVseS4gVW5sZXNzCi0gICAgICAgICAgICAgKiB3ZSBncmFiIHRoZSBzZWNvbmQgZmllbGQgYmVmb3JlIHJldHVybmluZywgd2UnbGwgc2xpcCBhbm90aGVyCi0gICAgICAgICAgICAgKiBmcmFtZSBpbiB0aGUgcGlwZWxpbmUgYW5kIGlmIHRoYXQgaGFwcGVucyBhIGxvdCwgd2UncmUgc3Vuay4KLSAgICAgICAgICAgICAqIFNvIHdlIGhhdmUgdG8gZ2V0IHRoYXQgc2Vjb25kIGZpZWxkIG5vdy4KLSAgICAgICAgICAgICAqIEludGVybGFjZWQgbXBlZzIgYW5kIHZjMSBhcmUgZXhhbXBsZXMgb2YgdGhpcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlRyeWluZyB0byBnZXQgc2Vjb25kIGZpZWxkLlxuIik7Ci0gICAgICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgICAgIHVzbGVlcChwcml2LT5kZWNvZGVfd2FpdCk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gRHRzR2V0RHJpdmVyU3RhdHVzKGRldiwgJmRlY29kZXJfc3RhdHVzKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ID09IEJDX1NUU19TVUNDRVNTICYmCi0gICAgICAgICAgICAgICAgICAgIGRlY29kZXJfc3RhdHVzLlJlYWR5TGlzdENvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZWNfcmV0ID0gcmVjZWl2ZV9mcmFtZShhdmN0eCwgZGF0YSwgZ290X2ZyYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZWNfcmV0ID09IFJFVF9PSyAmJiAqZ290X2ZyYW1lID4gMCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY19yZXQgPT0gUkVUX0VSUk9SKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNyeXN0YWxIRDogR290IHNlY29uZCBmaWVsZC5cbiIpOwotICAgICAgICB9IGVsc2UgaWYgKHJlY19yZXQgPT0gUkVUX1NLSVBfTkVYVF9DT1BZKSB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVHdvIGlucHV0IHBhY2tldHMgZ290IHR1cm5lZCBpbnRvIGEgZmllbGQgcGFpci4gR2F3ZC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICAgICAiRG9uJ3Qgb3V0cHV0IG9uIG5leHQgZGVjb2RlIGNhbGwuXG4iKTsKLSAgICAgICAgICAgIHByaXYtPnNraXBfbmV4dF9vdXRwdXQgPSAxOworICAgICAgICBiY19yZXQgPSBEdHNHZXREcml2ZXJTdGF0dXMoZGV2LCAmZGVjb2Rlcl9zdGF0dXMpOworICAgICAgICBpZiAoYmNfcmV0ICE9IEJDX1NUU19TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNyeXN0YWxIRDogR2V0RHJpdmVyU3RhdHVzIGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgcmVjX3JldCA9PSBSRVRfQ09QWV9BR0FJTiwgdGhhdCBtZWFucyB0aGF0IGVpdGhlciB3ZSBqdXN0IGhhbmRsZWQKLSAgICAgICAgICogYSBGTVRfQ0hBTkdFIGV2ZW50IGFuZCBuZWVkIHRvIGdvIGFyb3VuZCBhZ2FpbiBmb3IgdGhlIGFjdHVhbCBmcmFtZSwKLSAgICAgICAgICogd2UgZ290IGEgYnVzeSBzdGF0dXMgYW5kIG5lZWQgdG8gdHJ5IGFnYWluLCBvciB3ZSdyZSBkZWFsaW5nIHdpdGgKLSAgICAgICAgICogcGFja2VkIGItZnJhbWVzLCB3aGVyZSB0aGUgaGFyZHdhcmUgc3RyYW5nZWx5IHJldHVybnMgdGhlIHBhY2tlZAotICAgICAgICAgKiBwLWZyYW1lIHR3aWNlLiBXZSBjaG9vc2UgdG8ga2VlcCB0aGUgc2Vjb25kIGNvcHkgYXMgaXQgY2FycmllcyB0aGUKLSAgICAgICAgICogdmFsaWQgcHRzLgotICAgICAgICAgKi8KKworICAgICAgICBpZiAoZGVjb2Rlcl9zdGF0dXMuUmVhZHlMaXN0Q291bnQgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNyeXN0YWxIRDogSW5zdWZmaWNpZW50IGZyYW1lcyByZWFkeS4gUmV0dXJuaW5nXG4iKTsKKyAgICAgICAgICAgIGdvdF9mcmFtZSA9IDA7CisgICAgICAgICAgICByZWNfcmV0ID0gUkVUX09LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZWNfcmV0ID0gcmVjZWl2ZV9mcmFtZShhdmN0eCwgZnJhbWUsICZnb3RfZnJhbWUpOwogICAgIH0gd2hpbGUgKHJlY19yZXQgPT0gUkVUX0NPUFlfQUdBSU4pOwotICAgIHVzbGVlcChwcml2LT5kZWNvZGVfd2FpdCk7Ci0gICAgcmV0dXJuIGxlbjsKKworICAgIGlmIChyZWNfcmV0ID09IFJFVF9FUlJPUikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmIChnb3RfZnJhbWUgPT0gMCkgeworICAgICAgICByZXR1cm4gcHJpdi0+ZHJhaW5pbmcgPyBBVkVSUk9SX0VPRiA6IEFWRVJST1IoRUFHQUlOKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKKyNkZWZpbmUgREVGSU5FX0NSWVNUQUxIRF9ERUNPREVSKHgsIFgsIGJzZl9uYW1lKSBcCisgICAgc3RhdGljIGNvbnN0IEFWQ2xhc3MgeCMjX2NyeXN0YWxoZF9jbGFzcyA9IHsgXAorICAgICAgICAuY2xhc3NfbmFtZSA9ICN4ICJfY3J5c3RhbGhkIiwgXAorICAgICAgICAuaXRlbV9uYW1lID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsIFwKKyAgICAgICAgLm9wdGlvbiA9IG9wdGlvbnMsIFwKKyAgICAgICAgLnZlcnNpb24gPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsIFwKKyAgICB9OyBcCisgICAgQVZDb2RlYyBmZl8jI3gjI19jcnlzdGFsaGRfZGVjb2RlciA9IHsgXAorICAgICAgICAubmFtZSAgICAgICAgICAgPSAjeCAiX2NyeXN0YWxoZCIsIFwKKyAgICAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNyeXN0YWxIRCAiICNYICIgZGVjb2RlciIpLCBcCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywgXAorICAgICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF8jI1gsIFwKKyAgICAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENIRENvbnRleHQpLCBcCisgICAgICAgIC5wcml2X2NsYXNzICAgICA9ICZ4IyNfY3J5c3RhbGhkX2NsYXNzLCBcCisgICAgICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsIFwKKyAgICAgICAgLmNsb3NlICAgICAgICAgID0gdW5pbml0LCBcCisgICAgICAgIC5yZWNlaXZlX2ZyYW1lICA9IGNyeXN0YWxoZF9yZWNlaXZlX2ZyYW1lLCBcCisgICAgICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLCBcCisgICAgICAgIC5ic2ZzICAgICAgICAgICA9IGJzZl9uYW1lLCBcCisgICAgICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9BVk9JRF9QUk9CSU5HIHwgQVZfQ09ERUNfQ0FQX0hBUkRXQVJFLCBcCisgICAgICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7QVZfUElYX0ZNVF9ZVVlWNDIyLCBBVl9QSVhfRk1UX05PTkV9LCBcCisgICAgICAgIC53cmFwcGVyX25hbWUgICA9ICJjcnlzdGFsaGQiLCBcCisgICAgfTsKIAogI2lmIENPTkZJR19IMjY0X0NSWVNUQUxIRF9ERUNPREVSCi1zdGF0aWMgQVZDbGFzcyBoMjY0X2NsYXNzID0gewotICAgICJoMjY0X2NyeXN0YWxoZCIsCi0gICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgb3B0aW9ucywKLSAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi19OwotCi1BVkNvZGVjIGZmX2gyNjRfY3J5c3RhbGhkX2RlY29kZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfY3J5c3RhbGhkIiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjQgLyBBVkMgLyBNUEVHLTQgQVZDIC8gTVBFRy00IHBhcnQgMTAgKENyeXN0YWxIRCBhY2NlbGVyYXRpb24pIiksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENIRENvbnRleHQpLAotICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gdW5pbml0LAotICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0RFTEFZLAotICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7QVZfUElYX0ZNVF9ZVVlWNDIyLCBBVl9QSVhfRk1UX05PTkV9LAotICAgIC5wcml2X2NsYXNzICAgICA9ICZoMjY0X2NsYXNzLAotfTsKK0RFRklORV9DUllTVEFMSERfREVDT0RFUihoMjY0LCBIMjY0LCAiaDI2NF9tcDR0b2FubmV4YiIpCiAjZW5kaWYKIAogI2lmIENPTkZJR19NUEVHMl9DUllTVEFMSERfREVDT0RFUgotc3RhdGljIEFWQ2xhc3MgbXBlZzJfY2xhc3MgPSB7Ci0gICAgIm1wZWcyX2NyeXN0YWxoZCIsCi0gICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgb3B0aW9ucywKLSAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi19OwotCi1BVkNvZGVjIGZmX21wZWcyX2NyeXN0YWxoZF9kZWNvZGVyID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnMl9jcnlzdGFsaGQiLAotICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTIgVmlkZW8gKENyeXN0YWxIRCBhY2NlbGVyYXRpb24pIiksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENIRENvbnRleHQpLAotICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gdW5pbml0LAotICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0RFTEFZLAotICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7QVZfUElYX0ZNVF9ZVVlWNDIyLCBBVl9QSVhfRk1UX05PTkV9LAotICAgIC5wcml2X2NsYXNzICAgICA9ICZtcGVnMl9jbGFzcywKLX07CitERUZJTkVfQ1JZU1RBTEhEX0RFQ09ERVIobXBlZzIsIE1QRUcyVklERU8sIE5VTEwpCiAjZW5kaWYKIAogI2lmIENPTkZJR19NUEVHNF9DUllTVEFMSERfREVDT0RFUgotc3RhdGljIEFWQ2xhc3MgbXBlZzRfY2xhc3MgPSB7Ci0gICAgIm1wZWc0X2NyeXN0YWxoZCIsCi0gICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgb3B0aW9ucywKLSAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi19OwotCi1BVkNvZGVjIGZmX21wZWc0X2NyeXN0YWxoZF9kZWNvZGVyID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnNF9jcnlzdGFsaGQiLAotICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTQgUGFydCAyIChDcnlzdGFsSEQgYWNjZWxlcmF0aW9uKSIpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0hEQ29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgPSB1bmluaXQsCi0gICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfREVMQVksCi0gICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCi0gICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXtBVl9QSVhfRk1UX1lVWVY0MjIsIEFWX1BJWF9GTVRfTk9ORX0sCi0gICAgLnByaXZfY2xhc3MgICAgID0gJm1wZWc0X2NsYXNzLAotfTsKK0RFRklORV9DUllTVEFMSERfREVDT0RFUihtcGVnNCwgTVBFRzQsICJtcGVnNF91bnBhY2tfYmZyYW1lcyIpCiAjZW5kaWYKIAogI2lmIENPTkZJR19NU01QRUc0X0NSWVNUQUxIRF9ERUNPREVSCi1zdGF0aWMgQVZDbGFzcyBtc21wZWc0X2NsYXNzID0gewotICAgICJtc21wZWc0X2NyeXN0YWxoZCIsCi0gICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgb3B0aW9ucywKLSAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi19OwotCi1BVkNvZGVjIGZmX21zbXBlZzRfY3J5c3RhbGhkX2RlY29kZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gIm1zbXBlZzRfY3J5c3RhbGhkIiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy00IFBhcnQgMiBNaWNyb3NvZnQgdmFyaWFudCB2ZXJzaW9uIDMgKENyeXN0YWxIRCBhY2NlbGVyYXRpb24pIiksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01TTVBFRzRWMywKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0hEQ29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgPSB1bmluaXQsCi0gICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMLAotICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7QVZfUElYX0ZNVF9ZVVlWNDIyLCBBVl9QSVhfRk1UX05PTkV9LAotICAgIC5wcml2X2NsYXNzICAgICA9ICZtc21wZWc0X2NsYXNzLAotfTsKK0RFRklORV9DUllTVEFMSERfREVDT0RFUihtc21wZWc0LCBNU01QRUc0VjMsIE5VTEwpCiAjZW5kaWYKIAogI2lmIENPTkZJR19WQzFfQ1JZU1RBTEhEX0RFQ09ERVIKLXN0YXRpYyBBVkNsYXNzIHZjMV9jbGFzcyA9IHsKLSAgICAidmMxX2NyeXN0YWxoZCIsCi0gICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgb3B0aW9ucywKLSAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi19OwotCi1BVkNvZGVjIGZmX3ZjMV9jcnlzdGFsaGRfZGVjb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAidmMxX2NyeXN0YWxoZCIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNNUFRFIFZDLTEgKENyeXN0YWxIRCBhY2NlbGVyYXRpb24pIiksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ0hEQ29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgPSB1bmluaXQsCi0gICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfREVMQVksCi0gICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCi0gICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXtBVl9QSVhfRk1UX1lVWVY0MjIsIEFWX1BJWF9GTVRfTk9ORX0sCi0gICAgLnByaXZfY2xhc3MgICAgID0gJnZjMV9jbGFzcywKLX07CitERUZJTkVfQ1JZU1RBTEhEX0RFQ09ERVIodmMxLCBWQzEsIE5VTEwpCiAjZW5kaWYKIAogI2lmIENPTkZJR19XTVYzX0NSWVNUQUxIRF9ERUNPREVSCi1zdGF0aWMgQVZDbGFzcyB3bXYzX2NsYXNzID0gewotICAgICJ3bXYzX2NyeXN0YWxoZCIsCi0gICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgb3B0aW9ucywKLSAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi19OwotCi1BVkNvZGVjIGZmX3dtdjNfY3J5c3RhbGhkX2RlY29kZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gIndtdjNfY3J5c3RhbGhkIiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBWaWRlbyA5IChDcnlzdGFsSEQgYWNjZWxlcmF0aW9uKSIpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XTVYzLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihDSERDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBpbml0LAotICAgIC5jbG9zZSAgICAgICAgICA9IHVuaW5pdCwKLSAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9ERUxBWSwKLSAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKLSAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pe0FWX1BJWF9GTVRfWVVZVjQyMiwgQVZfUElYX0ZNVF9OT05FfSwKLSAgICAucHJpdl9jbGFzcyAgICAgPSAmd212M19jbGFzcywKLX07CitERUZJTkVfQ1JZU1RBTEhEX0RFQ09ERVIod212MywgV01WMywgTlVMTCkKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9jc2NkLmMgYi9saWJhdmNvZGVjL2NzY2QuYwppbmRleCA5ZTFkZWM5Li41ZWI1MTFhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2NzY2QuYworKysgYi9saWJhdmNvZGVjL2NzY2QuYwpAQCAtODEsMTUgKzgxLDE5IEBACiAgICAgc3dpdGNoICgoYnVmWzBdID4+IDEpICYgNykgewogICAgICAgICBjYXNlIDA6IHsgLy8gbHpvIGNvbXByZXNzaW9uCiAgICAgICAgICAgICBpbnQgb3V0bGVuID0gYy0+ZGVjb21wX3NpemUsIGlubGVuID0gYnVmX3NpemUgLSAyOwotICAgICAgICAgICAgaWYgKGF2X2x6bzF4X2RlY29kZShjLT5kZWNvbXBfYnVmLCAmb3V0bGVuLCAmYnVmWzJdLCAmaW5sZW4pKQorICAgICAgICAgICAgaWYgKGF2X2x6bzF4X2RlY29kZShjLT5kZWNvbXBfYnVmLCAmb3V0bGVuLCAmYnVmWzJdLCAmaW5sZW4pIHx8IG91dGxlbikgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgZHVyaW5nIGx6byBkZWNvbXByZXNzaW9uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgMTogeyAvLyB6bGliIGNvbXByZXNzaW9uCiAjaWYgQ09ORklHX1pMSUIKICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZGxlbiA9IGMtPmRlY29tcF9zaXplOwotICAgICAgICAgICAgaWYgKHVuY29tcHJlc3MoYy0+ZGVjb21wX2J1ZiwgJmRsZW4sICZidWZbMl0sIGJ1Zl9zaXplIC0gMikgIT0gWl9PSykKKyAgICAgICAgICAgIGlmICh1bmNvbXByZXNzKGMtPmRlY29tcF9idWYsICZkbGVuLCAmYnVmWzJdLCBidWZfc2l6ZSAtIDIpICE9IFpfT0spIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGR1cmluZyB6bGliIGRlY29tcHJlc3Npb25cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAjZWxzZQogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjb21waWxlZCB3aXRob3V0IHpsaWIgc3VwcG9ydFxuIik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2N1dmlkZGVjLmMgYi9saWJhdmNvZGVjL2N1dmlkZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2MjM4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvY3V2aWRkZWMuYwpAQCAtMCwwICsxLDExOTEgQEAKKy8qCisgKiBOdmlkaWEgQ1VWSUQgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDE2IFRpbW8gUm90aGVucGllbGVyIDx0aW1vQHJvdGhlbnBpZWxlci5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb21wYXQvY3VkYS9keW5saW5rX2xvYWRlci5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X2N1ZGFfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJkZWNvZGUuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ3V2aWRDb250ZXh0Cit7CisgICAgQVZDbGFzcyAqYXZjbGFzczsKKworICAgIENVdmlkZW9kZWNvZGVyIGN1ZGVjb2RlcjsKKyAgICBDVXZpZGVvcGFyc2VyIGN1cGFyc2VyOworCisgICAgY2hhciAqY3VfZ3B1OworICAgIGludCBuYl9zdXJmYWNlczsKKyAgICBpbnQgZHJvcF9zZWNvbmRfZmllbGQ7CisgICAgY2hhciAqY3JvcF9leHByOworICAgIGNoYXIgKnJlc2l6ZV9leHByOworCisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IGxlZnQ7CisgICAgICAgIGludCB0b3A7CisgICAgICAgIGludCByaWdodDsKKyAgICAgICAgaW50IGJvdHRvbTsKKyAgICB9IGNyb3A7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIGludCBoZWlnaHQ7CisgICAgfSByZXNpemU7CisKKyAgICBBVkJ1ZmZlclJlZiAqaHdkZXZpY2U7CisgICAgQVZCdWZmZXJSZWYgKmh3ZnJhbWU7CisKKyAgICBBVkJTRkNvbnRleHQgKmJzZjsKKworICAgIEFWRmlmb0J1ZmZlciAqZnJhbWVfcXVldWU7CisKKyAgICBpbnQgZGVpbnRfbW9kZTsKKyAgICBpbnQgZGVpbnRfbW9kZV9jdXJyZW50OworICAgIGludDY0X3QgcHJldl9wdHM7CisKKyAgICBpbnQgaW50ZXJuYWxfZXJyb3I7CisgICAgaW50IGRlY29kZXJfZmx1c2hpbmc7CisKKyAgICBpbnQgKmtleV9mcmFtZTsKKworICAgIGN1ZGFWaWRlb0NvZGVjIGNvZGVjX3R5cGU7CisgICAgY3VkYVZpZGVvQ2hyb21hRm9ybWF0IGNocm9tYV9mb3JtYXQ7CisKKyAgICBDVVZJRERFQ09ERUNBUFMgY2FwczgsIGNhcHMxMCwgY2FwczEyOworCisgICAgQ1VWSURQQVJTRVJQQVJBTVMgY3VwYXJzZWluZm87CisgICAgQ1VWSURFT0ZPUk1BVEVYIGN1cGFyc2VfZXh0OworCisgICAgQ3VkYUZ1bmN0aW9ucyAqY3VkbDsKKyAgICBDdXZpZEZ1bmN0aW9ucyAqY3ZkbDsKK30gQ3V2aWRDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBDdXZpZFBhcnNlZEZyYW1lCit7CisgICAgQ1VWSURQQVJTRVJESVNQSU5GTyBkaXNwaW5mbzsKKyAgICBpbnQgc2Vjb25kX2ZpZWxkOworICAgIGludCBpc19kZWludGVybGFjaW5nOworfSBDdXZpZFBhcnNlZEZyYW1lOworCitzdGF0aWMgaW50IGNoZWNrX2N1KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQ1VyZXN1bHQgZXJyLCBjb25zdCBjaGFyICpmdW5jKQoreworICAgIEN1dmlkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBjaGFyICplcnJfbmFtZTsKKyAgICBjb25zdCBjaGFyICplcnJfc3RyaW5nOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJDYWxsaW5nICVzXG4iLCBmdW5jKTsKKworICAgIGlmIChlcnIgPT0gQ1VEQV9TVUNDRVNTKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGN0eC0+Y3VkbC0+Y3VHZXRFcnJvck5hbWUoZXJyLCAmZXJyX25hbWUpOworICAgIGN0eC0+Y3VkbC0+Y3VHZXRFcnJvclN0cmluZyhlcnIsICZlcnJfc3RyaW5nKTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiJXMgZmFpbGVkIiwgZnVuYyk7CisgICAgaWYgKGVycl9uYW1lICYmIGVycl9zdHJpbmcpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiIC0+ICVzOiAlcyIsIGVycl9uYW1lLCBlcnJfc3RyaW5nKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlxuIik7CisKKyAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKK30KKworI2RlZmluZSBDSEVDS19DVSh4KSBjaGVja19jdShhdmN0eCwgKHgpLCAjeCkKKworc3RhdGljIGludCBDVURBQVBJIGN1dmlkX2hhbmRsZV92aWRlb19zZXF1ZW5jZSh2b2lkICpvcGFxdWUsIENVVklERU9GT1JNQVQqIGZvcm1hdCkKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBvcGFxdWU7CisgICAgQ3V2aWRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpod2ZyYW1lX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopY3R4LT5od2ZyYW1lLT5kYXRhOworICAgIENVVklEREVDT0RFQ0FQUyAqY2FwcyA9IE5VTEw7CisgICAgQ1VWSURERUNPREVDUkVBVEVJTkZPIGN1aW5mbzsKKyAgICBpbnQgc3VyZmFjZV9mbXQ7CisKKyAgICBpbnQgb2xkX3dpZHRoID0gYXZjdHgtPndpZHRoOworICAgIGludCBvbGRfaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1szXSA9IHsgQVZfUElYX0ZNVF9DVURBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FLCAgLy8gV2lsbCBiZSB1cGRhdGVkIGJlbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1RSQUNFLCAicGZuU2VxdWVuY2VDYWxsYmFjaywgcHJvZ3Jlc3NpdmVfc2VxdWVuY2U9JWRcbiIsIGZvcm1hdC0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpOworCisgICAgbWVtc2V0KCZjdWluZm8sIDAsIHNpemVvZihjdWluZm8pKTsKKworICAgIGN0eC0+aW50ZXJuYWxfZXJyb3IgPSAwOworCisgICAgYXZjdHgtPmNvZGVkX3dpZHRoID0gY3VpbmZvLnVsV2lkdGggPSBmb3JtYXQtPmNvZGVkX3dpZHRoOworICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQgPSBjdWluZm8udWxIZWlnaHQgPSBmb3JtYXQtPmNvZGVkX2hlaWdodDsKKworICAgIC8vIGFwcGx5IGNyb3BwaW5nCisgICAgY3VpbmZvLmRpc3BsYXlfYXJlYS5sZWZ0ID0gZm9ybWF0LT5kaXNwbGF5X2FyZWEubGVmdCArIGN0eC0+Y3JvcC5sZWZ0OworICAgIGN1aW5mby5kaXNwbGF5X2FyZWEudG9wID0gZm9ybWF0LT5kaXNwbGF5X2FyZWEudG9wICsgY3R4LT5jcm9wLnRvcDsKKyAgICBjdWluZm8uZGlzcGxheV9hcmVhLnJpZ2h0ID0gZm9ybWF0LT5kaXNwbGF5X2FyZWEucmlnaHQgLSBjdHgtPmNyb3AucmlnaHQ7CisgICAgY3VpbmZvLmRpc3BsYXlfYXJlYS5ib3R0b20gPSBmb3JtYXQtPmRpc3BsYXlfYXJlYS5ib3R0b20gLSBjdHgtPmNyb3AuYm90dG9tOworCisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBuZWVkIHRvIGJlIHNldCBiZWZvcmUgY2FsbGluZyBmZl9nZXRfZm9ybWF0CisgICAgaWYgKGN0eC0+cmVzaXplX2V4cHIpIHsKKyAgICAgICAgYXZjdHgtPndpZHRoID0gY3R4LT5yZXNpemUud2lkdGg7CisgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBjdHgtPnJlc2l6ZS5oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZjdHgtPndpZHRoID0gY3VpbmZvLmRpc3BsYXlfYXJlYS5yaWdodCAtIGN1aW5mby5kaXNwbGF5X2FyZWEubGVmdDsKKyAgICAgICAgYXZjdHgtPmhlaWdodCA9IGN1aW5mby5kaXNwbGF5X2FyZWEuYm90dG9tIC0gY3VpbmZvLmRpc3BsYXlfYXJlYS50b3A7CisgICAgfQorCisgICAgLy8gdGFyZ2V0IHdpZHRoL2hlaWdodCBuZWVkIHRvIGJlIG11bHRpcGxlcyBvZiB0d28KKyAgICBjdWluZm8udWxUYXJnZXRXaWR0aCA9IGF2Y3R4LT53aWR0aCA9IChhdmN0eC0+d2lkdGggKyAxKSAmIH4xOworICAgIGN1aW5mby51bFRhcmdldEhlaWdodCA9IGF2Y3R4LT5oZWlnaHQgPSAoYXZjdHgtPmhlaWdodCArIDEpICYgfjE7CisKKyAgICAvLyBhc3BlY3QgcmF0aW8gY29udmVyc2lvbiwgMToxLCBkZXBlbmRzIG9uIHNjYWxlZCByZXNvbHV0aW9uCisgICAgY3VpbmZvLnRhcmdldF9yZWN0LmxlZnQgPSAwOworICAgIGN1aW5mby50YXJnZXRfcmVjdC50b3AgPSAwOworICAgIGN1aW5mby50YXJnZXRfcmVjdC5yaWdodCA9IGN1aW5mby51bFRhcmdldFdpZHRoOworICAgIGN1aW5mby50YXJnZXRfcmVjdC5ib3R0b20gPSBjdWluZm8udWxUYXJnZXRIZWlnaHQ7CisKKyAgICBzd2l0Y2ggKGZvcm1hdC0+Yml0X2RlcHRoX2x1bWFfbWludXM4KSB7CisgICAgY2FzZSAwOiAvLyA4LWJpdAorICAgICAgICBwaXhfZm10c1sxXSA9IEFWX1BJWF9GTVRfTlYxMjsKKyAgICAgICAgY2FwcyA9ICZjdHgtPmNhcHM4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6IC8vIDEwLWJpdAorICAgICAgICBwaXhfZm10c1sxXSA9IEFWX1BJWF9GTVRfUDAxMDsKKyAgICAgICAgY2FwcyA9ICZjdHgtPmNhcHMxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OiAvLyAxMi1iaXQKKyAgICAgICAgcGl4X2ZtdHNbMV0gPSBBVl9QSVhfRk1UX1AwMTY7CisgICAgICAgIGNhcHMgPSAmY3R4LT5jYXBzMTI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghY2FwcyB8fCAhY2Fwcy0+YklzU3VwcG9ydGVkKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgYml0IGRlcHRoOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGZvcm1hdC0+Yml0X2RlcHRoX2x1bWFfbWludXM4ICsgOCk7CisgICAgICAgIGN0eC0+aW50ZXJuYWxfZXJyb3IgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHN1cmZhY2VfZm10ID0gZmZfZ2V0X2Zvcm1hdChhdmN0eCwgcGl4X2ZtdHMpOworICAgIGlmIChzdXJmYWNlX2ZtdCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmZl9nZXRfZm9ybWF0IGZhaWxlZDogJWRcbiIsIHN1cmZhY2VfZm10KTsKKyAgICAgICAgY3R4LT5pbnRlcm5hbF9lcnJvciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkZvcm1hdHM6IE9yaWdpbmFsOiAlcyB8IEhXOiAlcyB8IFNXOiAlc1xuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShhdmN0eC0+cGl4X2ZtdCksCisgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoc3VyZmFjZV9mbXQpLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGF2Y3R4LT5zd19waXhfZm10KSk7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IHN1cmZhY2VfZm10OworCisgICAgLy8gVXBkYXRlIG91ciBod2ZyYW1lIGN0eCwgYXMgdGhlIGdldF9mb3JtYXQgY2FsbGJhY2sgbWlnaHQgaGF2ZSByZWZyZXNoZWQgaXQhCisgICAgaWYgKGF2Y3R4LT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5od2ZyYW1lKTsKKworICAgICAgICBjdHgtPmh3ZnJhbWUgPSBhdl9idWZmZXJfcmVmKGF2Y3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgaWYgKCFjdHgtPmh3ZnJhbWUpIHsKKyAgICAgICAgICAgIGN0eC0+aW50ZXJuYWxfZXJyb3IgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGh3ZnJhbWVfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KiljdHgtPmh3ZnJhbWUtPmRhdGE7CisgICAgfQorCisgICAgZmZfc2V0X3NhcihhdmN0eCwgYXZfZGl2X3EoCisgICAgICAgIChBVlJhdGlvbmFsKXsgZm9ybWF0LT5kaXNwbGF5X2FzcGVjdF9yYXRpby54LCBmb3JtYXQtPmRpc3BsYXlfYXNwZWN0X3JhdGlvLnkgfSwKKyAgICAgICAgKEFWUmF0aW9uYWwpeyBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQgfSkpOworCisgICAgY3R4LT5kZWludF9tb2RlX2N1cnJlbnQgPSBmb3JtYXQtPnByb2dyZXNzaXZlX3NlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGN1ZGFWaWRlb0RlaW50ZXJsYWNlTW9kZV9XZWF2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdHgtPmRlaW50X21vZGU7CisKKyAgICBpZiAoIWZvcm1hdC0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UgJiYgY3R4LT5kZWludF9tb2RlX2N1cnJlbnQgPT0gY3VkYVZpZGVvRGVpbnRlcmxhY2VNb2RlX1dlYXZlKQorICAgICAgICBhdmN0eC0+ZmxhZ3MgfD0gQVZfQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVDsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5mbGFncyAmPSB+QVZfQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVDsKKworICAgIGlmIChmb3JtYXQtPnZpZGVvX3NpZ25hbF9kZXNjcmlwdGlvbi52aWRlb19mdWxsX3JhbmdlX2ZsYWcpCisgICAgICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgZWxzZQorICAgICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9NUEVHOworCisgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IGZvcm1hdC0+dmlkZW9fc2lnbmFsX2Rlc2NyaXB0aW9uLmNvbG9yX3ByaW1hcmllczsKKyAgICBhdmN0eC0+Y29sb3JfdHJjID0gZm9ybWF0LT52aWRlb19zaWduYWxfZGVzY3JpcHRpb24udHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIGF2Y3R4LT5jb2xvcnNwYWNlID0gZm9ybWF0LT52aWRlb19zaWduYWxfZGVzY3JpcHRpb24ubWF0cml4X2NvZWZmaWNpZW50czsKKworICAgIGlmIChmb3JtYXQtPmJpdHJhdGUpCisgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGZvcm1hdC0+Yml0cmF0ZTsKKworICAgIGlmIChmb3JtYXQtPmZyYW1lX3JhdGUubnVtZXJhdG9yICYmIGZvcm1hdC0+ZnJhbWVfcmF0ZS5kZW5vbWluYXRvcikgeworICAgICAgICBhdmN0eC0+ZnJhbWVyYXRlLm51bSA9IGZvcm1hdC0+ZnJhbWVfcmF0ZS5udW1lcmF0b3I7CisgICAgICAgIGF2Y3R4LT5mcmFtZXJhdGUuZGVuID0gZm9ybWF0LT5mcmFtZV9yYXRlLmRlbm9taW5hdG9yOworICAgIH0KKworICAgIGlmIChjdHgtPmN1ZGVjb2RlcgorICAgICAgICAgICAgJiYgYXZjdHgtPmNvZGVkX3dpZHRoID09IGZvcm1hdC0+Y29kZWRfd2lkdGgKKyAgICAgICAgICAgICYmIGF2Y3R4LT5jb2RlZF9oZWlnaHQgPT0gZm9ybWF0LT5jb2RlZF9oZWlnaHQKKyAgICAgICAgICAgICYmIGF2Y3R4LT53aWR0aCA9PSBvbGRfd2lkdGgKKyAgICAgICAgICAgICYmIGF2Y3R4LT5oZWlnaHQgPT0gb2xkX2hlaWdodAorICAgICAgICAgICAgJiYgY3R4LT5jaHJvbWFfZm9ybWF0ID09IGZvcm1hdC0+Y2hyb21hX2Zvcm1hdAorICAgICAgICAgICAgJiYgY3R4LT5jb2RlY190eXBlID09IGZvcm1hdC0+Y29kZWMpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKGN0eC0+Y3VkZWNvZGVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1RSQUNFLCAiUmUtaW5pdGlhbGl6aW5nIGRlY29kZXJcbiIpOworICAgICAgICBjdHgtPmludGVybmFsX2Vycm9yID0gQ0hFQ0tfQ1UoY3R4LT5jdmRsLT5jdXZpZERlc3Ryb3lEZWNvZGVyKGN0eC0+Y3VkZWNvZGVyKSk7CisgICAgICAgIGlmIChjdHgtPmludGVybmFsX2Vycm9yIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjdHgtPmN1ZGVjb2RlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGh3ZnJhbWVfY3R4LT5wb29sICYmICgKKyAgICAgICAgICAgIGh3ZnJhbWVfY3R4LT53aWR0aCA8IGF2Y3R4LT53aWR0aCB8fAorICAgICAgICAgICAgaHdmcmFtZV9jdHgtPmhlaWdodCA8IGF2Y3R4LT5oZWlnaHQgfHwKKyAgICAgICAgICAgIGh3ZnJhbWVfY3R4LT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9DVURBIHx8CisgICAgICAgICAgICBod2ZyYW1lX2N0eC0+c3dfZm9ybWF0ICE9IGF2Y3R4LT5zd19waXhfZm10KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkFWSFdGcmFtZXNDb250ZXh0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBpbmNvbXBhdGlibGUgcGFyYW1ldGVyc1xuIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAid2lkdGg6ICVkIDwtPiAlZFxuIiwgaHdmcmFtZV9jdHgtPndpZHRoLCBhdmN0eC0+d2lkdGgpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImhlaWdodDogJWQgPC0+ICVkXG4iLCBod2ZyYW1lX2N0eC0+aGVpZ2h0LCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJmb3JtYXQ6ICVzIDwtPiBjdWRhXG4iLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGh3ZnJhbWVfY3R4LT5mb3JtYXQpKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJzd19mb3JtYXQ6ICVzIDwtPiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoaHdmcmFtZV9jdHgtPnN3X2Zvcm1hdCksIGF2X2dldF9waXhfZm10X25hbWUoYXZjdHgtPnN3X3BpeF9mbXQpKTsKKyAgICAgICAgY3R4LT5pbnRlcm5hbF9lcnJvciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGZvcm1hdC0+Y2hyb21hX2Zvcm1hdCAhPSBjdWRhVmlkZW9DaHJvbWFGb3JtYXRfNDIwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2hyb21hIGZvcm1hdHMgb3RoZXIgdGhhbiA0MjAgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICBjdHgtPmludGVybmFsX2Vycm9yID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjdHgtPmNocm9tYV9mb3JtYXQgPSBmb3JtYXQtPmNocm9tYV9mb3JtYXQ7CisKKyAgICBjdWluZm8uQ29kZWNUeXBlID0gY3R4LT5jb2RlY190eXBlID0gZm9ybWF0LT5jb2RlYzsKKyAgICBjdWluZm8uQ2hyb21hRm9ybWF0ID0gZm9ybWF0LT5jaHJvbWFfZm9ybWF0OworCisgICAgc3dpdGNoIChhdmN0eC0+c3dfcGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICBjdWluZm8uT3V0cHV0Rm9ybWF0ID0gY3VkYVZpZGVvU3VyZmFjZUZvcm1hdF9OVjEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUDAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUDAxNjoKKyAgICAgICAgY3VpbmZvLk91dHB1dEZvcm1hdCA9IGN1ZGFWaWRlb1N1cmZhY2VGb3JtYXRfUDAxNjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPdXRwdXQgZm9ybWF0cyBvdGhlciB0aGFuIE5WMTIsIFAwMTAgb3IgUDAxNiBhcmUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGN0eC0+aW50ZXJuYWxfZXJyb3IgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGN1aW5mby51bE51bURlY29kZVN1cmZhY2VzID0gY3R4LT5uYl9zdXJmYWNlczsKKyAgICBjdWluZm8udWxOdW1PdXRwdXRTdXJmYWNlcyA9IDE7CisgICAgY3VpbmZvLnVsQ3JlYXRpb25GbGFncyA9IGN1ZGFWaWRlb0NyZWF0ZV9QcmVmZXJDVVZJRDsKKyAgICBjdWluZm8uYml0RGVwdGhNaW51czggPSBmb3JtYXQtPmJpdF9kZXB0aF9sdW1hX21pbnVzODsKKyAgICBjdWluZm8uRGVpbnRlcmxhY2VNb2RlID0gY3R4LT5kZWludF9tb2RlX2N1cnJlbnQ7CisKKyAgICBpZiAoY3R4LT5kZWludF9tb2RlX2N1cnJlbnQgIT0gY3VkYVZpZGVvRGVpbnRlcmxhY2VNb2RlX1dlYXZlICYmICFjdHgtPmRyb3Bfc2Vjb25kX2ZpZWxkKQorICAgICAgICBhdmN0eC0+ZnJhbWVyYXRlID0gYXZfbXVsX3EoYXZjdHgtPmZyYW1lcmF0ZSwgKEFWUmF0aW9uYWwpezIsIDF9KTsKKworICAgIGN0eC0+aW50ZXJuYWxfZXJyb3IgPSBDSEVDS19DVShjdHgtPmN2ZGwtPmN1dmlkQ3JlYXRlRGVjb2RlcigmY3R4LT5jdWRlY29kZXIsICZjdWluZm8pKTsKKyAgICBpZiAoY3R4LT5pbnRlcm5hbF9lcnJvciA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFod2ZyYW1lX2N0eC0+cG9vbCkgeworICAgICAgICBod2ZyYW1lX2N0eC0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9DVURBOworICAgICAgICBod2ZyYW1lX2N0eC0+c3dfZm9ybWF0ID0gYXZjdHgtPnN3X3BpeF9mbXQ7CisgICAgICAgIGh3ZnJhbWVfY3R4LT53aWR0aCA9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgaHdmcmFtZV9jdHgtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICAgICAgaWYgKChjdHgtPmludGVybmFsX2Vycm9yID0gYXZfaHdmcmFtZV9jdHhfaW5pdChjdHgtPmh3ZnJhbWUpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYXZfaHdmcmFtZV9jdHhfaW5pdCBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBDVURBQVBJIGN1dmlkX2hhbmRsZV9waWN0dXJlX2RlY29kZSh2b2lkICpvcGFxdWUsIENVVklEUElDUEFSQU1TKiBwaWNwYXJhbXMpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gb3BhcXVlOworICAgIEN1dmlkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1RSQUNFLCAicGZuRGVjb2RlUGljdHVyZVxuIik7CisKKyAgICBjdHgtPmtleV9mcmFtZVtwaWNwYXJhbXMtPkN1cnJQaWNJZHhdID0gcGljcGFyYW1zLT5pbnRyYV9waWNfZmxhZzsKKworICAgIGN0eC0+aW50ZXJuYWxfZXJyb3IgPSBDSEVDS19DVShjdHgtPmN2ZGwtPmN1dmlkRGVjb2RlUGljdHVyZShjdHgtPmN1ZGVjb2RlciwgcGljcGFyYW1zKSk7CisgICAgaWYgKGN0eC0+aW50ZXJuYWxfZXJyb3IgPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IENVREFBUEkgY3V2aWRfaGFuZGxlX3BpY3R1cmVfZGlzcGxheSh2b2lkICpvcGFxdWUsIENVVklEUEFSU0VSRElTUElORk8qIGRpc3BpbmZvKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IG9wYXF1ZTsKKyAgICBDdXZpZENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQ3V2aWRQYXJzZWRGcmFtZSBwYXJzZWRfZnJhbWUgPSB7IHsgMCB9IH07CisKKyAgICBwYXJzZWRfZnJhbWUuZGlzcGluZm8gPSAqZGlzcGluZm87CisgICAgY3R4LT5pbnRlcm5hbF9lcnJvciA9IDA7CisKKyAgICBpZiAoY3R4LT5kZWludF9tb2RlX2N1cnJlbnQgPT0gY3VkYVZpZGVvRGVpbnRlcmxhY2VNb2RlX1dlYXZlKSB7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShjdHgtPmZyYW1lX3F1ZXVlLCAmcGFyc2VkX2ZyYW1lLCBzaXplb2YoQ3V2aWRQYXJzZWRGcmFtZSksIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnNlZF9mcmFtZS5pc19kZWludGVybGFjaW5nID0gMTsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGN0eC0+ZnJhbWVfcXVldWUsICZwYXJzZWRfZnJhbWUsIHNpemVvZihDdXZpZFBhcnNlZEZyYW1lKSwgTlVMTCk7CisgICAgICAgIGlmICghY3R4LT5kcm9wX3NlY29uZF9maWVsZCkgeworICAgICAgICAgICAgcGFyc2VkX2ZyYW1lLnNlY29uZF9maWVsZCA9IDE7CisgICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoY3R4LT5mcmFtZV9xdWV1ZSwgJnBhcnNlZF9mcmFtZSwgc2l6ZW9mKEN1dmlkUGFyc2VkRnJhbWUpLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGN1dmlkX2lzX2J1ZmZlcl9mdWxsKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDdXZpZENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpbnQgZGVsYXkgPSBjdHgtPmN1cGFyc2VpbmZvLnVsTWF4RGlzcGxheURlbGF5OworICAgIGlmIChjdHgtPmRlaW50X21vZGUgIT0gY3VkYVZpZGVvRGVpbnRlcmxhY2VNb2RlX1dlYXZlICYmICFjdHgtPmRyb3Bfc2Vjb25kX2ZpZWxkKQorICAgICAgICBkZWxheSAqPSAyOworCisgICAgcmV0dXJuIChhdl9maWZvX3NpemUoY3R4LT5mcmFtZV9xdWV1ZSkgLyBzaXplb2YoQ3V2aWRQYXJzZWRGcmFtZSkpICsgZGVsYXkgPj0gY3R4LT5uYl9zdXJmYWNlczsKK30KKworc3RhdGljIGludCBjdXZpZF9kZWNvZGVfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEN1dmlkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqZGV2aWNlX2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCopY3R4LT5od2RldmljZS0+ZGF0YTsKKyAgICBBVkNVREFEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBkZXZpY2VfY3R4LT5od2N0eDsKKyAgICBDVWNvbnRleHQgZHVtbXksIGN1ZGFfY3R4ID0gZGV2aWNlX2h3Y3R4LT5jdWRhX2N0eDsKKyAgICBDVVZJRFNPVVJDRURBVEFQQUNLRVQgY3Vwa3Q7CisgICAgQVZQYWNrZXQgZmlsdGVyX3BhY2tldCA9IHsgMCB9OworICAgIEFWUGFja2V0IGZpbHRlcmVkX3BhY2tldCA9IHsgMCB9OworICAgIGludCByZXQgPSAwLCBlcmV0ID0gMCwgaXNfZmx1c2ggPSBjdHgtPmRlY29kZXJfZmx1c2hpbmc7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19UUkFDRSwgImN1dmlkX2RlY29kZV9wYWNrZXRcbiIpOworCisgICAgaWYgKGlzX2ZsdXNoICYmIGF2cGt0ICYmIGF2cGt0LT5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBpZiAoY3V2aWRfaXNfYnVmZmVyX2Z1bGwoYXZjdHgpICYmIGF2cGt0ICYmIGF2cGt0LT5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworCisgICAgaWYgKGN0eC0+YnNmICYmIGF2cGt0ICYmIGF2cGt0LT5zaXplKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZfcGFja2V0X3JlZigmZmlsdGVyX3BhY2tldCwgYXZwa3QpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYXZfcGFja2V0X3JlZiBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gYXZfYnNmX3NlbmRfcGFja2V0KGN0eC0+YnNmLCAmZmlsdGVyX3BhY2tldCkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhdl9ic2Zfc2VuZF9wYWNrZXQgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmZmlsdGVyX3BhY2tldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBhdl9ic2ZfcmVjZWl2ZV9wYWNrZXQoY3R4LT5ic2YsICZmaWx0ZXJlZF9wYWNrZXQpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYXZfYnNmX3JlY2VpdmVfcGFja2V0IGZhaWxlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgYXZwa3QgPSAmZmlsdGVyZWRfcGFja2V0OworICAgIH0KKworICAgIHJldCA9IENIRUNLX0NVKGN0eC0+Y3VkbC0+Y3VDdHhQdXNoQ3VycmVudChjdWRhX2N0eCkpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmZmlsdGVyZWRfcGFja2V0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtZW1zZXQoJmN1cGt0LCAwLCBzaXplb2YoY3Vwa3QpKTsKKworICAgIGlmIChhdnBrdCAmJiBhdnBrdC0+c2l6ZSkgeworICAgICAgICBjdXBrdC5wYXlsb2FkX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICAgICAgY3Vwa3QucGF5bG9hZCA9IGF2cGt0LT5kYXRhOworCisgICAgICAgIGlmIChhdnBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBjdXBrdC5mbGFncyA9IENVVklEX1BLVF9USU1FU1RBTVA7CisgICAgICAgICAgICBpZiAoYXZjdHgtPnBrdF90aW1lYmFzZS5udW0gJiYgYXZjdHgtPnBrdF90aW1lYmFzZS5kZW4pCisgICAgICAgICAgICAgICAgY3Vwa3QudGltZXN0YW1wID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMsIGF2Y3R4LT5wa3RfdGltZWJhc2UsIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwMH0pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN1cGt0LnRpbWVzdGFtcCA9IGF2cGt0LT5wdHM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjdXBrdC5mbGFncyA9IENVVklEX1BLVF9FTkRPRlNUUkVBTTsKKyAgICAgICAgY3R4LT5kZWNvZGVyX2ZsdXNoaW5nID0gMTsKKyAgICB9CisKKyAgICByZXQgPSBDSEVDS19DVShjdHgtPmN2ZGwtPmN1dmlkUGFyc2VWaWRlb0RhdGEoY3R4LT5jdXBhcnNlciwgJmN1cGt0KSk7CisKKyAgICBhdl9wYWNrZXRfdW5yZWYoJmZpbHRlcmVkX3BhY2tldCk7CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIC8vIGN1dmlkUGFyc2VWaWRlb0RhdGEgZG9lc24ndCByZXR1cm4gYW4gZXJyb3IganVzdCBiZWNhdXNlIHN0dWZmIGZhaWxlZC4uLgorICAgIGlmIChjdHgtPmludGVybmFsX2Vycm9yKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY3V2aWQgZGVjb2RlIGNhbGxiYWNrIGVycm9yXG4iKTsKKyAgICAgICAgcmV0ID0gY3R4LT5pbnRlcm5hbF9lcnJvcjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKK2Vycm9yOgorICAgIGVyZXQgPSBDSEVDS19DVShjdHgtPmN1ZGwtPmN1Q3R4UG9wQ3VycmVudCgmZHVtbXkpKTsKKworICAgIGlmIChlcmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIGVyZXQ7CisgICAgZWxzZSBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBlbHNlIGlmIChpc19mbHVzaCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3V2aWRfb3V0cHV0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQ3V2aWRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpkZXZpY2VfY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0KiljdHgtPmh3ZGV2aWNlLT5kYXRhOworICAgIEFWQ1VEQURldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGRldmljZV9jdHgtPmh3Y3R4OworICAgIENVY29udGV4dCBkdW1teSwgY3VkYV9jdHggPSBkZXZpY2VfaHdjdHgtPmN1ZGFfY3R4OworICAgIENVZGV2aWNlcHRyIG1hcHBlZF9mcmFtZSA9IDA7CisgICAgaW50IHJldCA9IDAsIGVyZXQgPSAwOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJjdXZpZF9vdXRwdXRfZnJhbWVcbiIpOworCisgICAgaWYgKGN0eC0+ZGVjb2Rlcl9mbHVzaGluZykgeworICAgICAgICByZXQgPSBjdXZpZF9kZWNvZGVfcGFja2V0KGF2Y3R4LCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoIWN1dmlkX2lzX2J1ZmZlcl9mdWxsKGF2Y3R4KSkgeworICAgICAgICBBVlBhY2tldCBwa3QgPSB7MH07CisgICAgICAgIHJldCA9IGZmX2RlY29kZV9nZXRfcGFja2V0KGF2Y3R4LCAmcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0ID0gY3V2aWRfZGVjb2RlX3BhY2tldChhdmN0eCwgJnBrdCk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKKyAgICAgICAgLy8gY3V2aWRfaXNfYnVmZmVyX2Z1bGwoKSBzaG91bGQgYXZvaWQgdGhpcy4KKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBpZiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IENIRUNLX0NVKGN0eC0+Y3VkbC0+Y3VDdHhQdXNoQ3VycmVudChjdWRhX2N0eCkpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGF2X2ZpZm9fc2l6ZShjdHgtPmZyYW1lX3F1ZXVlKSkgeworICAgICAgICBDdXZpZFBhcnNlZEZyYW1lIHBhcnNlZF9mcmFtZTsKKyAgICAgICAgQ1VWSURQUk9DUEFSQU1TIHBhcmFtczsKKyAgICAgICAgdW5zaWduZWQgaW50IHBpdGNoID0gMDsKKyAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgIGludCBpOworCisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKGN0eC0+ZnJhbWVfcXVldWUsICZwYXJzZWRfZnJhbWUsIHNpemVvZihDdXZpZFBhcnNlZEZyYW1lKSwgTlVMTCk7CisKKyAgICAgICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKyAgICAgICAgcGFyYW1zLnByb2dyZXNzaXZlX2ZyYW1lID0gcGFyc2VkX2ZyYW1lLmRpc3BpbmZvLnByb2dyZXNzaXZlX2ZyYW1lOworICAgICAgICBwYXJhbXMuc2Vjb25kX2ZpZWxkID0gcGFyc2VkX2ZyYW1lLnNlY29uZF9maWVsZDsKKyAgICAgICAgcGFyYW1zLnRvcF9maWVsZF9maXJzdCA9IHBhcnNlZF9mcmFtZS5kaXNwaW5mby50b3BfZmllbGRfZmlyc3Q7CisKKyAgICAgICAgcmV0ID0gQ0hFQ0tfQ1UoY3R4LT5jdmRsLT5jdXZpZE1hcFZpZGVvRnJhbWUoY3R4LT5jdWRlY29kZXIsIHBhcnNlZF9mcmFtZS5kaXNwaW5mby5waWN0dXJlX2luZGV4LCAmbWFwcGVkX2ZyYW1lLCAmcGl0Y2gsICZwYXJhbXMpKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0NVREEpIHsKKyAgICAgICAgICAgIHJldCA9IGF2X2h3ZnJhbWVfZ2V0X2J1ZmZlcihjdHgtPmh3ZnJhbWUsIGZyYW1lLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhdl9od2ZyYW1lX2dldF9idWZmZXIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBmZl9kZWNvZGVfZnJhbWVfcHJvcHMoYXZjdHgsIGZyYW1lKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmZl9kZWNvZGVfZnJhbWVfcHJvcHMgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgQ1VEQV9NRU1DUFkyRCBjcHkgPSB7CisgICAgICAgICAgICAgICAgICAgIC5zcmNNZW1vcnlUeXBlID0gQ1VfTUVNT1JZVFlQRV9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgIC5kc3RNZW1vcnlUeXBlID0gQ1VfTUVNT1JZVFlQRV9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgIC5zcmNEZXZpY2UgICAgID0gbWFwcGVkX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAuZHN0RGV2aWNlICAgICA9IChDVWRldmljZXB0cilmcmFtZS0+ZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgLnNyY1BpdGNoICAgICAgPSBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgLmRzdFBpdGNoICAgICAgPSBmcmFtZS0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgIC5zcmNZICAgICAgICAgID0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAuV2lkdGhJbkJ5dGVzICA9IEZGTUlOKHBpdGNoLCBmcmFtZS0+bGluZXNpemVbaV0pLAorICAgICAgICAgICAgICAgICAgICAuSGVpZ2h0ICAgICAgICA9IGF2Y3R4LT5oZWlnaHQgPj4gKGkgPyAxIDogMCksCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHJldCA9IENIRUNLX0NVKGN0eC0+Y3VkbC0+Y3VNZW1jcHkyRCgmY3B5KSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gYXZjdHgtPmhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05WMTIgfHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1AwMTAgfHwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1AwMTYpIHsKKyAgICAgICAgICAgIEFWRnJhbWUgKnRtcF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgICAgICBpZiAoIXRtcF9mcmFtZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYXZfZnJhbWVfYWxsb2MgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG1wX2ZyYW1lLT5mb3JtYXQgICAgICAgID0gQVZfUElYX0ZNVF9DVURBOworICAgICAgICAgICAgdG1wX2ZyYW1lLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihjdHgtPmh3ZnJhbWUpOworICAgICAgICAgICAgdG1wX2ZyYW1lLT5kYXRhWzBdICAgICAgID0gKHVpbnQ4X3QqKW1hcHBlZF9mcmFtZTsKKyAgICAgICAgICAgIHRtcF9mcmFtZS0+bGluZXNpemVbMF0gICA9IHBpdGNoOworICAgICAgICAgICAgdG1wX2ZyYW1lLT5kYXRhWzFdICAgICAgID0gKHVpbnQ4X3QqKShtYXBwZWRfZnJhbWUgKyBhdmN0eC0+aGVpZ2h0ICogcGl0Y2gpOworICAgICAgICAgICAgdG1wX2ZyYW1lLT5saW5lc2l6ZVsxXSAgID0gcGl0Y2g7CisgICAgICAgICAgICB0bXBfZnJhbWUtPndpZHRoICAgICAgICAgPSBhdmN0eC0+d2lkdGg7CisgICAgICAgICAgICB0bXBfZnJhbWUtPmhlaWdodCAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgICAgICAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZmZfZ2V0X2J1ZmZlciBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnRtcF9mcmFtZSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gYXZfaHdmcmFtZV90cmFuc2Zlcl9kYXRhKGZyYW1lLCB0bXBfZnJhbWUsIDApOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYXZfaHdmcmFtZV90cmFuc2Zlcl9kYXRhIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmdG1wX2ZyYW1lKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmdG1wX2ZyYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfQlVHOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lLT5rZXlfZnJhbWUgPSBjdHgtPmtleV9mcmFtZVtwYXJzZWRfZnJhbWUuZGlzcGluZm8ucGljdHVyZV9pbmRleF07CisgICAgICAgIGZyYW1lLT53aWR0aCA9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgZnJhbWUtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgICAgIGlmIChhdmN0eC0+cGt0X3RpbWViYXNlLm51bSAmJiBhdmN0eC0+cGt0X3RpbWViYXNlLmRlbikKKyAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBhdl9yZXNjYWxlX3EocGFyc2VkX2ZyYW1lLmRpc3BpbmZvLnRpbWVzdGFtcCwgKEFWUmF0aW9uYWwpezEsIDEwMDAwMDAwfSwgYXZjdHgtPnBrdF90aW1lYmFzZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBwYXJzZWRfZnJhbWUuZGlzcGluZm8udGltZXN0YW1wOworCisgICAgICAgIGlmIChwYXJzZWRfZnJhbWUuc2Vjb25kX2ZpZWxkKSB7CisgICAgICAgICAgICBpZiAoY3R4LT5wcmV2X3B0cyA9PSBJTlQ2NF9NSU4pIHsKKyAgICAgICAgICAgICAgICBjdHgtPnByZXZfcHRzID0gZnJhbWUtPnB0czsKKyAgICAgICAgICAgICAgICBmcmFtZS0+cHRzICs9IChhdmN0eC0+cGt0X3RpbWViYXNlLmRlbiAqIGF2Y3R4LT5mcmFtZXJhdGUuZGVuKSAvIChhdmN0eC0+cGt0X3RpbWViYXNlLm51bSAqIGF2Y3R4LT5mcmFtZXJhdGUubnVtKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHB0c19kaWZmID0gKGZyYW1lLT5wdHMgLSBjdHgtPnByZXZfcHRzKSAvIDI7CisgICAgICAgICAgICAgICAgY3R4LT5wcmV2X3B0cyA9IGZyYW1lLT5wdHM7CisgICAgICAgICAgICAgICAgZnJhbWUtPnB0cyArPSBwdHNfZGlmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIENVVklEcyBvcGFxdWUgcmVvcmRlcmluZyBicmVha3MgdGhlIGludGVybmFsIHBrdCBsb2dpYy4KKyAgICAgICAgICogU28gc2V0IHBrdF9wdHMgYW5kIGNsZWFyIGFsbCB0aGUgb3RoZXIgcGt0XyBmaWVsZHMuCisgICAgICAgICAqLworI2lmIEZGX0FQSV9QS1RfUFRTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIGZyYW1lLT5wa3RfcHRzID0gZnJhbWUtPnB0czsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgICAgIGZyYW1lLT5wa3RfcG9zID0gLTE7CisgICAgICAgIGZyYW1lLT5wa3RfZHVyYXRpb24gPSAwOworICAgICAgICBmcmFtZS0+cGt0X3NpemUgPSAtMTsKKworICAgICAgICBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9ICFwYXJzZWRfZnJhbWUuaXNfZGVpbnRlcmxhY2luZyAmJiAhcGFyc2VkX2ZyYW1lLmRpc3BpbmZvLnByb2dyZXNzaXZlX2ZyYW1lOworCisgICAgICAgIGlmIChmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSkKKyAgICAgICAgICAgIGZyYW1lLT50b3BfZmllbGRfZmlyc3QgPSBwYXJzZWRfZnJhbWUuZGlzcGluZm8udG9wX2ZpZWxkX2ZpcnN0OworICAgIH0gZWxzZSBpZiAoY3R4LT5kZWNvZGVyX2ZsdXNoaW5nKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKK2Vycm9yOgorICAgIGlmIChtYXBwZWRfZnJhbWUpCisgICAgICAgIGVyZXQgPSBDSEVDS19DVShjdHgtPmN2ZGwtPmN1dmlkVW5tYXBWaWRlb0ZyYW1lKGN0eC0+Y3VkZWNvZGVyLCBtYXBwZWRfZnJhbWUpKTsKKworICAgIGVyZXQgPSBDSEVDS19DVShjdHgtPmN1ZGwtPmN1Q3R4UG9wQ3VycmVudCgmZHVtbXkpKTsKKworICAgIGlmIChlcmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIGVyZXQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGN1dmlkX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQ3V2aWRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1RSQUNFLCAiY3V2aWRfZGVjb2RlX2ZyYW1lXG4iKTsKKworICAgIGlmIChjdHgtPmRlaW50X21vZGVfY3VycmVudCAhPSBjdWRhVmlkZW9EZWludGVybGFjZU1vZGVfV2VhdmUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWludGVybGFjaW5nIGlzIG5vdCBzdXBwb3J0ZWQgdmlhIHRoZSBvbGQgQVBJXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoIWN0eC0+ZGVjb2Rlcl9mbHVzaGluZykgeworICAgICAgICByZXQgPSBjdXZpZF9kZWNvZGVfcGFja2V0KGF2Y3R4LCBhdnBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBjdXZpZF9vdXRwdXRfZnJhbWUoYXZjdHgsIGZyYW1lKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgKmdvdF9mcmFtZSA9IDA7CisgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjdXZpZF9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDdXZpZENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9maWZvX2ZyZWVwKCZjdHgtPmZyYW1lX3F1ZXVlKTsKKworICAgIGlmIChjdHgtPmJzZikKKyAgICAgICAgYXZfYnNmX2ZyZWUoJmN0eC0+YnNmKTsKKworICAgIGlmIChjdHgtPmN1cGFyc2VyKQorICAgICAgICBjdHgtPmN2ZGwtPmN1dmlkRGVzdHJveVZpZGVvUGFyc2VyKGN0eC0+Y3VwYXJzZXIpOworCisgICAgaWYgKGN0eC0+Y3VkZWNvZGVyKQorICAgICAgICBjdHgtPmN2ZGwtPmN1dmlkRGVzdHJveURlY29kZXIoY3R4LT5jdWRlY29kZXIpOworCisgICAgY3R4LT5jdWRsID0gTlVMTDsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5od2ZyYW1lKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aHdkZXZpY2UpOworCisgICAgYXZfZnJlZXAoJmN0eC0+a2V5X2ZyYW1lKTsKKworICAgIGN1dmlkX2ZyZWVfZnVuY3Rpb25zKCZjdHgtPmN2ZGwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3V2aWRfdGVzdF9jYXBhYmlsaXRpZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDVVZJRFBBUlNFUlBBUkFNUyAqY3VwYXJzZWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9iZWRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9iZWRfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0X2RlcHRoKQoreworICAgIEN1dmlkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBDVVZJRERFQ09ERUNBUFMgKmNhcHM7CisgICAgaW50IHJlczggPSAwLCByZXMxMCA9IDAsIHJlczEyID0gMDsKKworICAgIGlmICghY3R4LT5jdmRsLT5jdXZpZEdldERlY29kZXJDYXBzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVc2VkIE52aWRpYSBkcml2ZXIgaXMgdG9vIG9sZCB0byBwZXJmb3JtIGEgY2FwYWJpbGl0eSBjaGVjay5cbiIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlIG1pbmltdW0gcmVxdWlyZWQgdmVyc2lvbiBpcyAiCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyAgICAgICAgICAgICIzNzguNjYiCisjZWxzZQorICAgICAgICAgICAgIjM3OC4xMyIKKyNlbmRpZgorICAgICAgICAgICAgIi4gQ29udGludWluZyBibGluZC5cbiIpOworICAgICAgICBjdHgtPmNhcHM4LmJJc1N1cHBvcnRlZCA9IGN0eC0+Y2FwczEwLmJJc1N1cHBvcnRlZCA9IDE7CisgICAgICAgIC8vIDEyIGJpdCB3YXMgbm90IHN1cHBvcnRlZCBiZWZvcmUgdGhlIGNhcGFiaWxpdHkgY2hlY2sgd2FzIGludHJvZHVjZWQsIHNvIGRpc2FibGUgaXQuCisgICAgICAgIGN0eC0+Y2FwczEyLmJJc1N1cHBvcnRlZCA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGN0eC0+Y2FwczguZUNvZGVjVHlwZSA9IGN0eC0+Y2FwczEwLmVDb2RlY1R5cGUgPSBjdHgtPmNhcHMxMi5lQ29kZWNUeXBlCisgICAgICAgID0gY3VwYXJzZWluZm8tPkNvZGVjVHlwZTsKKyAgICBjdHgtPmNhcHM4LmVDaHJvbWFGb3JtYXQgPSBjdHgtPmNhcHMxMC5lQ2hyb21hRm9ybWF0ID0gY3R4LT5jYXBzMTIuZUNocm9tYUZvcm1hdAorICAgICAgICA9IGN1ZGFWaWRlb0Nocm9tYUZvcm1hdF80MjA7CisKKyAgICBjdHgtPmNhcHM4Lm5CaXREZXB0aE1pbnVzOCA9IDA7CisgICAgY3R4LT5jYXBzMTAubkJpdERlcHRoTWludXM4ID0gMjsKKyAgICBjdHgtPmNhcHMxMi5uQml0RGVwdGhNaW51czggPSA0OworCisgICAgcmVzOCA9IENIRUNLX0NVKGN0eC0+Y3ZkbC0+Y3V2aWRHZXREZWNvZGVyQ2FwcygmY3R4LT5jYXBzOCkpOworICAgIHJlczEwID0gQ0hFQ0tfQ1UoY3R4LT5jdmRsLT5jdXZpZEdldERlY29kZXJDYXBzKCZjdHgtPmNhcHMxMCkpOworICAgIHJlczEyID0gQ0hFQ0tfQ1UoY3R4LT5jdmRsLT5jdXZpZEdldERlY29kZXJDYXBzKCZjdHgtPmNhcHMxMikpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNVVklEIGNhcGFiaWxpdGllcyBmb3IgJXM6XG4iLCBhdmN0eC0+Y29kZWMtPm5hbWUpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICI4IGJpdDogc3VwcG9ydGVkOiAlZCwgbWluX3dpZHRoOiAlZCwgbWF4X3dpZHRoOiAlZCwgbWluX2hlaWdodDogJWQsIG1heF9oZWlnaHQ6ICVkXG4iLAorICAgICAgICAgICBjdHgtPmNhcHM4LmJJc1N1cHBvcnRlZCwgY3R4LT5jYXBzOC5uTWluV2lkdGgsIGN0eC0+Y2Fwczgubk1heFdpZHRoLCBjdHgtPmNhcHM4Lm5NaW5IZWlnaHQsIGN0eC0+Y2Fwczgubk1heEhlaWdodCk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIjEwIGJpdDogc3VwcG9ydGVkOiAlZCwgbWluX3dpZHRoOiAlZCwgbWF4X3dpZHRoOiAlZCwgbWluX2hlaWdodDogJWQsIG1heF9oZWlnaHQ6ICVkXG4iLAorICAgICAgICAgICBjdHgtPmNhcHMxMC5iSXNTdXBwb3J0ZWQsIGN0eC0+Y2FwczEwLm5NaW5XaWR0aCwgY3R4LT5jYXBzMTAubk1heFdpZHRoLCBjdHgtPmNhcHMxMC5uTWluSGVpZ2h0LCBjdHgtPmNhcHMxMC5uTWF4SGVpZ2h0KTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiMTIgYml0OiBzdXBwb3J0ZWQ6ICVkLCBtaW5fd2lkdGg6ICVkLCBtYXhfd2lkdGg6ICVkLCBtaW5faGVpZ2h0OiAlZCwgbWF4X2hlaWdodDogJWRcbiIsCisgICAgICAgICAgIGN0eC0+Y2FwczEyLmJJc1N1cHBvcnRlZCwgY3R4LT5jYXBzMTIubk1pbldpZHRoLCBjdHgtPmNhcHMxMi5uTWF4V2lkdGgsIGN0eC0+Y2FwczEyLm5NaW5IZWlnaHQsIGN0eC0+Y2FwczEyLm5NYXhIZWlnaHQpOworCisgICAgc3dpdGNoIChiaXRfZGVwdGgpIHsKKyAgICBjYXNlIDEwOgorICAgICAgICBjYXBzID0gJmN0eC0+Y2FwczEwOworICAgICAgICBpZiAocmVzMTAgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEyOgorICAgICAgICBjYXBzID0gJmN0eC0+Y2FwczEyOworICAgICAgICBpZiAocmVzMTIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczEyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBjYXBzID0gJmN0eC0+Y2Fwczg7CisgICAgICAgIGlmIChyZXM4IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM4OworICAgIH0KKworICAgIGlmICghY3R4LT5jYXBzOC5iSXNTdXBwb3J0ZWQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb2RlYyAlcyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwgYXZjdHgtPmNvZGVjLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoIWNhcHMtPmJJc1N1cHBvcnRlZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJpdCBkZXB0aCAlZCBpcyBub3Qgc3VwcG9ydGVkLlxuIiwgYml0X2RlcHRoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocHJvYmVkX3dpZHRoID4gY2Fwcy0+bk1heFdpZHRoIHx8IHByb2JlZF93aWR0aCA8IGNhcHMtPm5NaW5XaWR0aCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZpZGVvIHdpZHRoICVkIG5vdCB3aXRoaW4gcmFuZ2UgZnJvbSAlZCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgIHByb2JlZF93aWR0aCwgY2Fwcy0+bk1pbldpZHRoLCBjYXBzLT5uTWF4V2lkdGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChwcm9iZWRfaGVpZ2h0ID4gY2Fwcy0+bk1heEhlaWdodCB8fCBwcm9iZWRfaGVpZ2h0IDwgY2Fwcy0+bk1pbkhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZpZGVvIGhlaWdodCAlZCBub3Qgd2l0aGluIHJhbmdlIGZyb20gJWQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICBwcm9iZWRfaGVpZ2h0LCBjYXBzLT5uTWluSGVpZ2h0LCBjYXBzLT5uTWF4SGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGN1dmlkX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDdXZpZENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZDVURBRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4OworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpkZXZpY2VfY3R4OworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpod2ZyYW1lX2N0eDsKKyAgICBDVVZJRFNPVVJDRURBVEFQQUNLRVQgc2VxX3BrdDsKKyAgICBDVWNvbnRleHQgY3VkYV9jdHggPSBOVUxMOworICAgIENVY29udGV4dCBkdW1teTsKKyAgICBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqYnNmOworICAgIGludCByZXQgPSAwOworCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzWzNdID0geyBBVl9QSVhfRk1UX0NVREEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05WMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfTsKKworICAgIGludCBwcm9iZWRfd2lkdGggPSBhdmN0eC0+Y29kZWRfd2lkdGggPyBhdmN0eC0+Y29kZWRfd2lkdGggOiAxMjgwOworICAgIGludCBwcm9iZWRfaGVpZ2h0ID0gYXZjdHgtPmNvZGVkX2hlaWdodCA/IGF2Y3R4LT5jb2RlZF9oZWlnaHQgOiA3MjA7CisgICAgaW50IHByb2JlZF9iaXRfZGVwdGggPSA4OworCisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwcm9iZV9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CisgICAgaWYgKHByb2JlX2Rlc2MgJiYgcHJvYmVfZGVzYy0+bmJfY29tcG9uZW50cykKKyAgICAgICAgcHJvYmVkX2JpdF9kZXB0aCA9IHByb2JlX2Rlc2MtPmNvbXBbMF0uZGVwdGg7CisKKyAgICAvLyBBY2NlbGVyYXRlZCB0cmFuc2NvZGluZyBzY2VuYXJpb3Mgd2l0aCAnZmZtcGVnJyByZXF1aXJlIHRoYXQgdGhlCisgICAgLy8gcGl4X2ZtdCBiZSBzZXQgdG8gQVZfUElYX0ZNVF9DVURBIGVhcmx5LiBUaGUgc3dfcGl4X2ZtdCwgYW5kIHRoZQorICAgIC8vIHBpeF9mbXQgZm9yIG5vbi1hY2NlbGVyYXRlZCB0cmFuc2NvZGluZywgZG8gbm90IG5lZWQgdG8gYmUgY29ycmVjdAorICAgIC8vIGJ1dCBuZWVkIHRvIGJlIHNldCB0byBzb21ldGhpbmcuIFdlIGFyYml0cmFyaWx5IHBpY2sgTlYxMi4KKyAgICByZXQgPSBmZl9nZXRfZm9ybWF0KGF2Y3R4LCBwaXhfZm10cyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmZl9nZXRfZm9ybWF0IGZhaWxlZDogJWRcbiIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF2Y3R4LT5waXhfZm10ID0gcmV0OworCisgICAgaWYgKGN0eC0+cmVzaXplX2V4cHIgJiYgc3NjYW5mKGN0eC0+cmVzaXplX2V4cHIsICIlZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnJlc2l6ZS53aWR0aCwgJmN0eC0+cmVzaXplLmhlaWdodCkgIT0gMikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcmVzaXplIGV4cHJlc3Npb25zXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChjdHgtPmNyb3BfZXhwciAmJiBzc2NhbmYoY3R4LT5jcm9wX2V4cHIsICIlZHglZHglZHglZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5jcm9wLnRvcCwgJmN0eC0+Y3JvcC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5jcm9wLmxlZnQsICZjdHgtPmNyb3AucmlnaHQpICE9IDQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNyb3BwaW5nIGV4cHJlc3Npb25zXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldCA9IGN1dmlkX2xvYWRfZnVuY3Rpb25zKCZjdHgtPmN2ZGwsIGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCBsb2FkaW5nIG52Y3V2aWQuXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBjdHgtPmZyYW1lX3F1ZXVlID0gYXZfZmlmb19hbGxvYyhjdHgtPm5iX3N1cmZhY2VzICogc2l6ZW9mKEN1dmlkUGFyc2VkRnJhbWUpKTsKKyAgICBpZiAoIWN0eC0+ZnJhbWVfcXVldWUpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGlmIChhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBjdHgtPmh3ZnJhbWUgPSBhdl9idWZmZXJfcmVmKGF2Y3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgaWYgKCFjdHgtPmh3ZnJhbWUpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBod2ZyYW1lX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopY3R4LT5od2ZyYW1lLT5kYXRhOworCisgICAgICAgIGN0eC0+aHdkZXZpY2UgPSBhdl9idWZmZXJfcmVmKGh3ZnJhbWVfY3R4LT5kZXZpY2VfcmVmKTsKKyAgICAgICAgaWYgKCFjdHgtPmh3ZGV2aWNlKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgICAgICBjdHgtPmh3ZGV2aWNlID0gYXZfYnVmZmVyX3JlZihhdmN0eC0+aHdfZGV2aWNlX2N0eCk7CisgICAgICAgICAgICBpZiAoIWN0eC0+aHdkZXZpY2UpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGF2X2h3ZGV2aWNlX2N0eF9jcmVhdGUoJmN0eC0+aHdkZXZpY2UsIEFWX0hXREVWSUNFX1RZUEVfQ1VEQSwgY3R4LT5jdV9ncHUsIE5VTEwsIDApOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+aHdmcmFtZSA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGN0eC0+aHdkZXZpY2UpOworICAgICAgICBpZiAoIWN0eC0+aHdmcmFtZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhdl9od2ZyYW1lX2N0eF9hbGxvYyBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGh3ZnJhbWVfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KiljdHgtPmh3ZnJhbWUtPmRhdGE7CisgICAgfQorCisgICAgZGV2aWNlX2N0eCA9IGh3ZnJhbWVfY3R4LT5kZXZpY2VfY3R4OworICAgIGRldmljZV9od2N0eCA9IGRldmljZV9jdHgtPmh3Y3R4OworCisgICAgY3VkYV9jdHggPSBkZXZpY2VfaHdjdHgtPmN1ZGFfY3R4OworICAgIGN0eC0+Y3VkbCA9IGRldmljZV9od2N0eC0+aW50ZXJuYWwtPmN1ZGFfZGw7CisKKyAgICBtZW1zZXQoJmN0eC0+Y3VwYXJzZWluZm8sIDAsIHNpemVvZihjdHgtPmN1cGFyc2VpbmZvKSk7CisgICAgbWVtc2V0KCZjdHgtPmN1cGFyc2VfZXh0LCAwLCBzaXplb2YoY3R4LT5jdXBhcnNlX2V4dCkpOworICAgIG1lbXNldCgmc2VxX3BrdCwgMCwgc2l6ZW9mKHNlcV9wa3QpKTsKKworICAgIGN0eC0+Y3VwYXJzZWluZm8ucEV4dFZpZGVvSW5mbyA9ICZjdHgtPmN1cGFyc2VfZXh0OworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7CisjaWYgQ09ORklHX0gyNjRfQ1VWSURfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICAgICAgY3R4LT5jdXBhcnNlaW5mby5Db2RlY1R5cGUgPSBjdWRhVmlkZW9Db2RlY19IMjY0OworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIENPTkZJR19IRVZDX0NVVklEX0RFQ09ERVIKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgIGN0eC0+Y3VwYXJzZWluZm8uQ29kZWNUeXBlID0gY3VkYVZpZGVvQ29kZWNfSEVWQzsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfTUpQRUdfQ1VWSURfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfTUpQRUc6CisgICAgICAgIGN0eC0+Y3VwYXJzZWluZm8uQ29kZWNUeXBlID0gY3VkYVZpZGVvQ29kZWNfSlBFRzsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzFfQ1VWSURfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKKyAgICAgICAgY3R4LT5jdXBhcnNlaW5mby5Db2RlY1R5cGUgPSBjdWRhVmlkZW9Db2RlY19NUEVHMTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzJfQ1VWSURfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKKyAgICAgICAgY3R4LT5jdXBhcnNlaW5mby5Db2RlY1R5cGUgPSBjdWRhVmlkZW9Db2RlY19NUEVHMjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzRfQ1VWSURfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisgICAgICAgIGN0eC0+Y3VwYXJzZWluZm8uQ29kZWNUeXBlID0gY3VkYVZpZGVvQ29kZWNfTVBFRzQ7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgQ09ORklHX1ZQOF9DVVZJRF9ERUNPREVSCisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDg6CisgICAgICAgIGN0eC0+Y3VwYXJzZWluZm8uQ29kZWNUeXBlID0gY3VkYVZpZGVvQ29kZWNfVlA4OworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIENPTkZJR19WUDlfQ1VWSURfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfVlA5OgorICAgICAgICBjdHgtPmN1cGFyc2VpbmZvLkNvZGVjVHlwZSA9IGN1ZGFWaWRlb0NvZGVjX1ZQOTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfVkMxX0NVVklEX0RFQ09ERVIKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZDMToKKyAgICAgICAgY3R4LT5jdXBhcnNlaW5mby5Db2RlY1R5cGUgPSBjdWRhVmlkZW9Db2RlY19WQzE7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIENVVklEIGNvZGVjIVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSEVWQykgeworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQorICAgICAgICAgICAgYnNmID0gYXZfYnNmX2dldF9ieV9uYW1lKCJoMjY0X21wNHRvYW5uZXhiIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJzZiA9IGF2X2JzZl9nZXRfYnlfbmFtZSgiaGV2Y19tcDR0b2FubmV4YiIpOworCisgICAgICAgIGlmICghYnNmKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0JTRl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPSBhdl9ic2ZfYWxsb2MoYnNmLCAmY3R4LT5ic2YpKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmICgoKHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQoY3R4LT5ic2YtPnBhcl9pbiwgYXZjdHgpKSA8IDApIHx8ICgocmV0ID0gYXZfYnNmX2luaXQoY3R4LT5ic2YpKSA8IDApKSB7CisgICAgICAgICAgICBhdl9ic2ZfZnJlZSgmY3R4LT5ic2YpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+Y3VwYXJzZV9leHQuZm9ybWF0LnNlcWhkcl9kYXRhX2xlbmd0aCA9IGN0eC0+YnNmLT5wYXJfb3V0LT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgbWVtY3B5KGN0eC0+Y3VwYXJzZV9leHQucmF3X3NlcWhkcl9kYXRhLAorICAgICAgICAgICAgICAgY3R4LT5ic2YtPnBhcl9vdXQtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgIEZGTUlOKHNpemVvZihjdHgtPmN1cGFyc2VfZXh0LnJhd19zZXFoZHJfZGF0YSksIGN0eC0+YnNmLT5wYXJfb3V0LT5leHRyYWRhdGFfc2l6ZSkpOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMCkgeworICAgICAgICBjdHgtPmN1cGFyc2VfZXh0LmZvcm1hdC5zZXFoZHJfZGF0YV9sZW5ndGggPSBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIG1lbWNweShjdHgtPmN1cGFyc2VfZXh0LnJhd19zZXFoZHJfZGF0YSwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICBGRk1JTihzaXplb2YoY3R4LT5jdXBhcnNlX2V4dC5yYXdfc2VxaGRyX2RhdGEpLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpKTsKKyAgICB9CisKKyAgICBjdHgtPmtleV9mcmFtZSA9IGF2X21hbGxvY3ooY3R4LT5uYl9zdXJmYWNlcyAqIHNpemVvZihpbnQpKTsKKyAgICBpZiAoIWN0eC0+a2V5X2ZyYW1lKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBjdHgtPmN1cGFyc2VpbmZvLnVsTWF4TnVtRGVjb2RlU3VyZmFjZXMgPSBjdHgtPm5iX3N1cmZhY2VzOworICAgIGN0eC0+Y3VwYXJzZWluZm8udWxNYXhEaXNwbGF5RGVsYXkgPSA0OworICAgIGN0eC0+Y3VwYXJzZWluZm8ucFVzZXJEYXRhID0gYXZjdHg7CisgICAgY3R4LT5jdXBhcnNlaW5mby5wZm5TZXF1ZW5jZUNhbGxiYWNrID0gY3V2aWRfaGFuZGxlX3ZpZGVvX3NlcXVlbmNlOworICAgIGN0eC0+Y3VwYXJzZWluZm8ucGZuRGVjb2RlUGljdHVyZSA9IGN1dmlkX2hhbmRsZV9waWN0dXJlX2RlY29kZTsKKyAgICBjdHgtPmN1cGFyc2VpbmZvLnBmbkRpc3BsYXlQaWN0dXJlID0gY3V2aWRfaGFuZGxlX3BpY3R1cmVfZGlzcGxheTsKKworICAgIHJldCA9IENIRUNLX0NVKGN0eC0+Y3VkbC0+Y3VDdHhQdXNoQ3VycmVudChjdWRhX2N0eCkpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgcmV0ID0gY3V2aWRfdGVzdF9jYXBhYmlsaXRpZXMoYXZjdHgsICZjdHgtPmN1cGFyc2VpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlZF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9iZWRfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2JlZF9iaXRfZGVwdGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgcmV0ID0gQ0hFQ0tfQ1UoY3R4LT5jdmRsLT5jdXZpZENyZWF0ZVZpZGVvUGFyc2VyKCZjdHgtPmN1cGFyc2VyLCAmY3R4LT5jdXBhcnNlaW5mbykpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgc2VxX3BrdC5wYXlsb2FkID0gY3R4LT5jdXBhcnNlX2V4dC5yYXdfc2VxaGRyX2RhdGE7CisgICAgc2VxX3BrdC5wYXlsb2FkX3NpemUgPSBjdHgtPmN1cGFyc2VfZXh0LmZvcm1hdC5zZXFoZHJfZGF0YV9sZW5ndGg7CisKKyAgICBpZiAoc2VxX3BrdC5wYXlsb2FkICYmIHNlcV9wa3QucGF5bG9hZF9zaXplKSB7CisgICAgICAgIHJldCA9IENIRUNLX0NVKGN0eC0+Y3ZkbC0+Y3V2aWRQYXJzZVZpZGVvRGF0YShjdHgtPmN1cGFyc2VyLCAmc2VxX3BrdCkpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0ID0gQ0hFQ0tfQ1UoY3R4LT5jdWRsLT5jdUN0eFBvcEN1cnJlbnQoJmR1bW15KSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBjdHgtPnByZXZfcHRzID0gSU5UNjRfTUlOOworCisgICAgaWYgKCFhdmN0eC0+cGt0X3RpbWViYXNlLm51bSB8fCAhYXZjdHgtPnBrdF90aW1lYmFzZS5kZW4pCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIHBrdF90aW1lYmFzZSwgcGFzc2luZyB0aW1lc3RhbXBzIGFzLWlzLlxuIik7CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgY3V2aWRfZGVjb2RlX2VuZChhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY3V2aWRfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEN1dmlkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqZGV2aWNlX2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCopY3R4LT5od2RldmljZS0+ZGF0YTsKKyAgICBBVkNVREFEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBkZXZpY2VfY3R4LT5od2N0eDsKKyAgICBDVWNvbnRleHQgZHVtbXksIGN1ZGFfY3R4ID0gZGV2aWNlX2h3Y3R4LT5jdWRhX2N0eDsKKyAgICBDVVZJRFNPVVJDRURBVEFQQUNLRVQgc2VxX3BrdCA9IHsgMCB9OworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBDSEVDS19DVShjdHgtPmN1ZGwtPmN1Q3R4UHVzaEN1cnJlbnQoY3VkYV9jdHgpKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGF2X2ZpZm9fZnJlZXAoJmN0eC0+ZnJhbWVfcXVldWUpOworCisgICAgY3R4LT5mcmFtZV9xdWV1ZSA9IGF2X2ZpZm9fYWxsb2MoY3R4LT5uYl9zdXJmYWNlcyAqIHNpemVvZihDdXZpZFBhcnNlZEZyYW1lKSk7CisgICAgaWYgKCFjdHgtPmZyYW1lX3F1ZXVlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlY3JlYXRlIGZyYW1lIHF1ZXVlIG9uIGZsdXNoXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChjdHgtPmN1ZGVjb2RlcikgeworICAgICAgICBjdHgtPmN2ZGwtPmN1dmlkRGVzdHJveURlY29kZXIoY3R4LT5jdWRlY29kZXIpOworICAgICAgICBjdHgtPmN1ZGVjb2RlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGN0eC0+Y3VwYXJzZXIpIHsKKyAgICAgICAgY3R4LT5jdmRsLT5jdXZpZERlc3Ryb3lWaWRlb1BhcnNlcihjdHgtPmN1cGFyc2VyKTsKKyAgICAgICAgY3R4LT5jdXBhcnNlciA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gQ0hFQ0tfQ1UoY3R4LT5jdmRsLT5jdXZpZENyZWF0ZVZpZGVvUGFyc2VyKCZjdHgtPmN1cGFyc2VyLCAmY3R4LT5jdXBhcnNlaW5mbykpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgc2VxX3BrdC5wYXlsb2FkID0gY3R4LT5jdXBhcnNlX2V4dC5yYXdfc2VxaGRyX2RhdGE7CisgICAgc2VxX3BrdC5wYXlsb2FkX3NpemUgPSBjdHgtPmN1cGFyc2VfZXh0LmZvcm1hdC5zZXFoZHJfZGF0YV9sZW5ndGg7CisKKyAgICBpZiAoc2VxX3BrdC5wYXlsb2FkICYmIHNlcV9wa3QucGF5bG9hZF9zaXplKSB7CisgICAgICAgIHJldCA9IENIRUNLX0NVKGN0eC0+Y3ZkbC0+Y3V2aWRQYXJzZVZpZGVvRGF0YShjdHgtPmN1cGFyc2VyLCAmc2VxX3BrdCkpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0ID0gQ0hFQ0tfQ1UoY3R4LT5jdWRsLT5jdUN0eFBvcEN1cnJlbnQoJmR1bW15KSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBjdHgtPnByZXZfcHRzID0gSU5UNjRfTUlOOworICAgIGN0eC0+ZGVjb2Rlcl9mbHVzaGluZyA9IDA7CisKKyAgICByZXR1cm47CisgZXJyb3I6CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDVURBIHJlaW5pdCBvbiBmbHVzaCBmYWlsZWRcbiIpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDdXZpZENvbnRleHQsIHgpCisjZGVmaW5lIFZEIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZGVpbnQiLCAgICAiU2V0IGRlaW50ZXJsYWNpbmcgbW9kZSIsIE9GRlNFVChkZWludF9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IGN1ZGFWaWRlb0RlaW50ZXJsYWNlTW9kZV9XZWF2ZSAgICB9LCBjdWRhVmlkZW9EZWludGVybGFjZU1vZGVfV2VhdmUsIGN1ZGFWaWRlb0RlaW50ZXJsYWNlTW9kZV9BZGFwdGl2ZSwgVkQsICJkZWludCIgfSwKKyAgICB7ICJ3ZWF2ZSIsICAgICJXZWF2ZSBkZWludGVybGFjaW5nIChkbyBub3RoaW5nKSIsICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gY3VkYVZpZGVvRGVpbnRlcmxhY2VNb2RlX1dlYXZlICAgIH0sIDAsIDAsIFZELCAiZGVpbnQiIH0sCisgICAgeyAiYm9iIiwgICAgICAiQm9iIGRlaW50ZXJsYWNpbmciLCAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IGN1ZGFWaWRlb0RlaW50ZXJsYWNlTW9kZV9Cb2IgICAgICB9LCAwLCAwLCBWRCwgImRlaW50IiB9LAorICAgIHsgImFkYXB0aXZlIiwgIkFkYXB0aXZlIGRlaW50ZXJsYWNpbmciLCAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBjdWRhVmlkZW9EZWludGVybGFjZU1vZGVfQWRhcHRpdmUgfSwgMCwgMCwgVkQsICJkZWludCIgfSwKKyAgICB7ICJncHUiLCAgICAgICJHUFUgdG8gYmUgdXNlZCBmb3IgZGVjb2RpbmciLCBPRkZTRVQoY3VfZ3B1KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIFZEIH0sCisgICAgeyAic3VyZmFjZXMiLCAiTWF4aW11bSBzdXJmYWNlcyB0byBiZSB1c2VkIGZvciBkZWNvZGluZyIsIE9GRlNFVChuYl9zdXJmYWNlcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMjUgfSwgMCwgSU5UX01BWCwgVkQgfSwKKyAgICB7ICJkcm9wX3NlY29uZF9maWVsZCIsICJEcm9wIHNlY29uZCBmaWVsZCB3aGVuIGRlaW50ZXJsYWNpbmciLCBPRkZTRVQoZHJvcF9zZWNvbmRfZmllbGQpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZEIH0sCisgICAgeyAiY3JvcCIsICAgICAiQ3JvcCAodG9wKXgoYm90dG9tKXgobGVmdCl4KHJpZ2h0KSIsIE9GRlNFVChjcm9wX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgVkQgfSwKKyAgICB7ICJyZXNpemUiLCAgICJSZXNpemUgKHdpZHRoKXgoaGVpZ2h0KSIsIE9GRlNFVChyZXNpemVfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBWRCB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwgKmN1dmlkX2h3X2NvbmZpZ3NbXSA9IHsKKyAgICAmKGNvbnN0IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsKSB7CisgICAgICAgIC5wdWJsaWMgPSB7CisgICAgICAgICAgICAucGl4X2ZtdCAgICAgPSBBVl9QSVhfRk1UX0NVREEsCisgICAgICAgICAgICAubWV0aG9kcyAgICAgPSBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0hXX0RFVklDRV9DVFggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9JTlRFUk5BTCwKKyAgICAgICAgICAgIC5kZXZpY2VfdHlwZSA9IEFWX0hXREVWSUNFX1RZUEVfQ1VEQQorICAgICAgICB9LAorICAgICAgICAuaHdhY2NlbCA9IE5VTEwsCisgICAgfSwKKyAgICBOVUxMCit9OworCisjZGVmaW5lIERFRklORV9DVVZJRF9DT0RFQyh4LCBYKSBcCisgICAgc3RhdGljIGNvbnN0IEFWQ2xhc3MgeCMjX2N1dmlkX2NsYXNzID0geyBcCisgICAgICAgIC5jbGFzc19uYW1lID0gI3ggIl9jdXZpZCIsIFwKKyAgICAgICAgLml0ZW1fbmFtZSA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLCBcCisgICAgICAgIC5vcHRpb24gPSBvcHRpb25zLCBcCisgICAgICAgIC52ZXJzaW9uID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULCBcCisgICAgfTsgXAorICAgIEFWQ29kZWMgZmZfIyN4IyNfY3V2aWRfZGVjb2RlciA9IHsgXAorICAgICAgICAubmFtZSAgICAgICAgICAgPSAjeCAiX2N1dmlkIiwgXAorICAgICAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTnZpZGlhIENVVklEICIgI1ggIiBkZWNvZGVyIiksIFwKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLCBcCisgICAgICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEXyMjWCwgXAorICAgICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ3V2aWRDb250ZXh0KSwgXAorICAgICAgICAucHJpdl9jbGFzcyAgICAgPSAmeCMjX2N1dmlkX2NsYXNzLCBcCisgICAgICAgIC5pbml0ICAgICAgICAgICA9IGN1dmlkX2RlY29kZV9pbml0LCBcCisgICAgICAgIC5jbG9zZSAgICAgICAgICA9IGN1dmlkX2RlY29kZV9lbmQsIFwKKyAgICAgICAgLmRlY29kZSAgICAgICAgID0gY3V2aWRfZGVjb2RlX2ZyYW1lLCBcCisgICAgICAgIC5yZWNlaXZlX2ZyYW1lICA9IGN1dmlkX291dHB1dF9mcmFtZSwgXAorICAgICAgICAuZmx1c2ggICAgICAgICAgPSBjdXZpZF9mbHVzaCwgXAorICAgICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfQVZPSURfUFJPQklORyB8IEFWX0NPREVDX0NBUF9IQVJEV0FSRSwgXAorICAgICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX0NVREEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OVjEyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUDAxMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1AwMTYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sIFwKKyAgICAgICAgLmh3X2NvbmZpZ3MgICAgID0gY3V2aWRfaHdfY29uZmlncywgXAorICAgICAgICAud3JhcHBlcl9uYW1lICAgPSAiY3V2aWQiLCBcCisgICAgfTsKKworI2lmIENPTkZJR19IRVZDX0NVVklEX0RFQ09ERVIKK0RFRklORV9DVVZJRF9DT0RFQyhoZXZjLCBIRVZDKQorI2VuZGlmCisKKyNpZiBDT05GSUdfSDI2NF9DVVZJRF9ERUNPREVSCitERUZJTkVfQ1VWSURfQ09ERUMoaDI2NCwgSDI2NCkKKyNlbmRpZgorCisjaWYgQ09ORklHX01KUEVHX0NVVklEX0RFQ09ERVIKK0RFRklORV9DVVZJRF9DT0RFQyhtanBlZywgTUpQRUcpCisjZW5kaWYKKworI2lmIENPTkZJR19NUEVHMV9DVVZJRF9ERUNPREVSCitERUZJTkVfQ1VWSURfQ09ERUMobXBlZzEsIE1QRUcxVklERU8pCisjZW5kaWYKKworI2lmIENPTkZJR19NUEVHMl9DVVZJRF9ERUNPREVSCitERUZJTkVfQ1VWSURfQ09ERUMobXBlZzIsIE1QRUcyVklERU8pCisjZW5kaWYKKworI2lmIENPTkZJR19NUEVHNF9DVVZJRF9ERUNPREVSCitERUZJTkVfQ1VWSURfQ09ERUMobXBlZzQsIE1QRUc0KQorI2VuZGlmCisKKyNpZiBDT05GSUdfVlA4X0NVVklEX0RFQ09ERVIKK0RFRklORV9DVVZJRF9DT0RFQyh2cDgsIFZQOCkKKyNlbmRpZgorCisjaWYgQ09ORklHX1ZQOV9DVVZJRF9ERUNPREVSCitERUZJTkVfQ1VWSURfQ09ERUModnA5LCBWUDkpCisjZW5kaWYKKworI2lmIENPTkZJR19WQzFfQ1VWSURfREVDT0RFUgorREVGSU5FX0NVVklEX0NPREVDKHZjMSwgVkMxKQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2N5dXYuYyBiL2xpYmF2Y29kZWMvY3l1di5jCmluZGV4IGM3ZWMwMDguLmYyYjBhN2MgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvY3l1di5jCisrKyBiL2xpYmF2Y29kZWMvY3l1di5jCkBAIC00LDcgKzQsNyBAQAogICogYmFzZWQgb24gIkNyZWF0aXZlIFlVViAoQ1lVVikgc3RyZWFtIGZvcm1hdCBmb3IgQVZJIjoKICAqICAgaHR0cDovL3d3dy5jc3NlLm1vbmFzaC5lZHUuYXUvfnRpbWYvdmlkZW9jb2RlYy9jeXV2LnR4dAogICoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMTg1LDYgKzE4NSw3IEBACiAgICAgLmluaXQgICAgICAgICAgID0gY3l1dl9kZWNvZGVfaW5pdCwKICAgICAuZGVjb2RlICAgICAgICAgPSBjeXV2X2RlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwogI2VuZGlmCiAKQEAgLTE5OCw1ICsxOTksNiBAQAogICAgIC5pbml0ICAgICAgICAgICA9IGN5dXZfZGVjb2RlX2luaXQsCiAgICAgLmRlY29kZSAgICAgICAgID0gY3l1dl9kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kY2EuYyBiL2xpYmF2Y29kZWMvZGNhLmMKaW5kZXggNzE0NTA5Yi4uYTA3MjllNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kY2EuYworKysgYi9saWJhdmNvZGVjL2RjYS5jCkBAIC0yOCw3ICsyOCw5IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2Vycm9yLmgiCiAKICNpbmNsdWRlICJkY2EuaCIKKyNpbmNsdWRlICJkY2FfY29yZS5oIgogI2luY2x1ZGUgImRjYV9zeW5jd29yZHMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgInB1dF9iaXRzLmgiCiAKIGNvbnN0IHVpbnQzMl90IGF2cHJpdl9kY2Ffc2FtcGxlX3JhdGVzWzE2XSA9IHsKQEAgLTM2LDYgKzM4LDE5IEBACiAgICAgMTIwMDAsIDI0MDAwLCA0ODAwMCwgOTYwMDAsIDE5MjAwMAogfTsKIAorY29uc3QgdWludDMyX3QgZmZfZGNhX3NhbXBsaW5nX2ZyZXFzWzE2XSA9IHsKKyAgICAgIDgwMDAsICAxNjAwMCwgMzIwMDAsIDY0MDAwLCAxMjgwMDAsIDIyMDUwLCAgNDQxMDAsICA4ODIwMCwKKyAgICAxNzY0MDAsIDM1MjgwMCwgMTIwMDAsIDI0MDAwLCAgNDgwMDAsIDk2MDAwLCAxOTIwMDAsIDM4NDAwMCwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfZGNhX2ZyZXFfcmFuZ2VzWzE2XSA9IHsKKyAgICAwLCAxLCAyLCAzLCA0LCAxLCAyLCAzLCA0LCA0LCAwLCAxLCAyLCAzLCA0LCA0Cit9OworCitjb25zdCB1aW50OF90IGZmX2RjYV9iaXRzX3Blcl9zYW1wbGVbOF0gPSB7CisgICAgMTYsIDE2LCAyMCwgMjAsIDAsIDI0LCAyNCwgMAorfTsKKwogaW50IGF2cHJpdl9kY2FfY29udmVydF9iaXRzdHJlYW0oY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3NpemUsIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9zaXplKQogewpAQCAtNDksNiArNjQsNyBAQAogICAgIG1yayA9IEFWX1JCMzIoc3JjKTsKICAgICBzd2l0Y2ggKG1yaykgewogICAgIGNhc2UgRENBX1NZTkNXT1JEX0NPUkVfQkU6CisgICAgY2FzZSBEQ0FfU1lOQ1dPUkRfU1VCU1RSRUFNOgogICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHNyY19zaXplKTsKICAgICAgICAgcmV0dXJuIHNyY19zaXplOwogICAgIGNhc2UgRENBX1NZTkNXT1JEX0NPUkVfTEU6CkBAIC03MSwzICs4Nyw3NiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiB9CisKK2ludCBmZl9kY2FfcGFyc2VfY29yZV9mcmFtZV9oZWFkZXIoRENBQ29yZUZyYW1lSGVhZGVyICpoLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpZiAoZ2V0X2JpdHNfbG9uZyhnYiwgMzIpICE9IERDQV9TWU5DV09SRF9DT1JFX0JFKQorICAgICAgICByZXR1cm4gRENBX1BBUlNFX0VSUk9SX1NZTkNfV09SRDsKKworICAgIGgtPm5vcm1hbF9mcmFtZSA9IGdldF9iaXRzMShnYik7CisgICAgaC0+ZGVmaWNpdF9zYW1wbGVzID0gZ2V0X2JpdHMoZ2IsIDUpICsgMTsKKyAgICBpZiAoaC0+ZGVmaWNpdF9zYW1wbGVzICE9IERDQV9QQ01CTE9DS19TQU1QTEVTKQorICAgICAgICByZXR1cm4gRENBX1BBUlNFX0VSUk9SX0RFRklDSVRfU0FNUExFUzsKKworICAgIGgtPmNyY19wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBoLT5ucGNtYmxvY2tzID0gZ2V0X2JpdHMoZ2IsIDcpICsgMTsKKyAgICBpZiAoaC0+bnBjbWJsb2NrcyAmIChEQ0FfU1VCQkFORF9TQU1QTEVTIC0gMSkpCisgICAgICAgIHJldHVybiBEQ0FfUEFSU0VfRVJST1JfUENNX0JMT0NLUzsKKworICAgIGgtPmZyYW1lX3NpemUgPSBnZXRfYml0cyhnYiwgMTQpICsgMTsKKyAgICBpZiAoaC0+ZnJhbWVfc2l6ZSA8IDk2KQorICAgICAgICByZXR1cm4gRENBX1BBUlNFX0VSUk9SX0ZSQU1FX1NJWkU7CisKKyAgICBoLT5hdWRpb19tb2RlID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgIGlmIChoLT5hdWRpb19tb2RlID49IERDQV9BTU9ERV9DT1VOVCkKKyAgICAgICAgcmV0dXJuIERDQV9QQVJTRV9FUlJPUl9BTU9ERTsKKworICAgIGgtPnNyX2NvZGUgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgaWYgKCFhdnByaXZfZGNhX3NhbXBsZV9yYXRlc1toLT5zcl9jb2RlXSkKKyAgICAgICAgcmV0dXJuIERDQV9QQVJTRV9FUlJPUl9TQU1QTEVfUkFURTsKKworICAgIGgtPmJyX2NvZGUgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgIHJldHVybiBEQ0FfUEFSU0VfRVJST1JfUkVTRVJWRURfQklUOworCisgICAgaC0+ZHJjX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgIGgtPnRzX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgIGgtPmF1eF9wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBoLT5oZGNkX21hc3RlciA9IGdldF9iaXRzMShnYik7CisgICAgaC0+ZXh0X2F1ZGlvX3R5cGUgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgaC0+ZXh0X2F1ZGlvX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgIGgtPnN5bmNfc3NmID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBoLT5sZmVfcHJlc2VudCA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICBpZiAoaC0+bGZlX3ByZXNlbnQgPT0gRENBX0xGRV9GTEFHX0lOVkFMSUQpCisgICAgICAgIHJldHVybiBEQ0FfUEFSU0VfRVJST1JfTEZFX0ZMQUc7CisKKyAgICBoLT5wcmVkaWN0b3JfaGlzdG9yeSA9IGdldF9iaXRzMShnYik7CisgICAgaWYgKGgtPmNyY19wcmVzZW50KQorICAgICAgICBza2lwX2JpdHMoZ2IsIDE2KTsKKyAgICBoLT5maWx0ZXJfcGVyZmVjdCA9IGdldF9iaXRzMShnYik7CisgICAgaC0+ZW5jb2Rlcl9yZXYgPSBnZXRfYml0cyhnYiwgNCk7CisgICAgaC0+Y29weV9oaXN0ID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgIGgtPnBjbXJfY29kZSA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICBpZiAoIWZmX2RjYV9iaXRzX3Blcl9zYW1wbGVbaC0+cGNtcl9jb2RlXSkKKyAgICAgICAgcmV0dXJuIERDQV9QQVJTRV9FUlJPUl9QQ01fUkVTOworCisgICAgaC0+c3VtZGlmZl9mcm9udCA9IGdldF9iaXRzMShnYik7CisgICAgaC0+c3VtZGlmZl9zdXJyb3VuZCA9IGdldF9iaXRzMShnYik7CisgICAgaC0+ZG5fY29kZSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2cHJpdl9kY2FfcGFyc2VfY29yZV9mcmFtZV9oZWFkZXIoRENBQ29yZUZyYW1lSGVhZGVyICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgYnVmLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChmZl9kY2FfcGFyc2VfY29yZV9mcmFtZV9oZWFkZXIoaCwgJmdiKSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjYS5oIGIvbGliYXZjb2RlYy9kY2EuaAppbmRleCBjY2IwMmFmLi5lOTZjNTg5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RjYS5oCisrKyBiL2xpYmF2Y29kZWMvZGNhLmgKQEAgLTI4LDkgKzI4LDUzIEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgRENBX0NPUkVfRlJBTUVfSEVBREVSX1NJWkUgICAgICAxOAorCitlbnVtIERDQVBhcnNlRXJyb3IgeworICAgIERDQV9QQVJTRV9FUlJPUl9TWU5DX1dPUkQgICAgICAgPSAtMSwKKyAgICBEQ0FfUEFSU0VfRVJST1JfREVGSUNJVF9TQU1QTEVTID0gLTIsCisgICAgRENBX1BBUlNFX0VSUk9SX1BDTV9CTE9DS1MgICAgICA9IC0zLAorICAgIERDQV9QQVJTRV9FUlJPUl9GUkFNRV9TSVpFICAgICAgPSAtNCwKKyAgICBEQ0FfUEFSU0VfRVJST1JfQU1PREUgICAgICAgICAgID0gLTUsCisgICAgRENBX1BBUlNFX0VSUk9SX1NBTVBMRV9SQVRFICAgICA9IC02LAorICAgIERDQV9QQVJTRV9FUlJPUl9SRVNFUlZFRF9CSVQgICAgPSAtNywKKyAgICBEQ0FfUEFSU0VfRVJST1JfTEZFX0ZMQUcgICAgICAgID0gLTgsCisgICAgRENBX1BBUlNFX0VSUk9SX1BDTV9SRVMgICAgICAgICA9IC05LAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgRENBQ29yZUZyYW1lSGVhZGVyIHsKKyAgICB1aW50OF90ICAgICBub3JtYWxfZnJhbWU7ICAgICAgIC8vLzwgRnJhbWUgdHlwZQorICAgIHVpbnQ4X3QgICAgIGRlZmljaXRfc2FtcGxlczsgICAgLy8vPCBEZWZpY2l0IHNhbXBsZSBjb3VudAorICAgIHVpbnQ4X3QgICAgIGNyY19wcmVzZW50OyAgICAgICAgLy8vPCBDUkMgcHJlc2VudCBmbGFnCisgICAgdWludDhfdCAgICAgbnBjbWJsb2NrczsgICAgICAgICAvLy88IE51bWJlciBvZiBQQ00gc2FtcGxlIGJsb2NrcworICAgIHVpbnQxNl90ICAgIGZyYW1lX3NpemU7ICAgICAgICAgLy8vPCBQcmltYXJ5IGZyYW1lIGJ5dGUgc2l6ZQorICAgIHVpbnQ4X3QgICAgIGF1ZGlvX21vZGU7ICAgICAgICAgLy8vPCBBdWRpbyBjaGFubmVsIGFycmFuZ2VtZW50CisgICAgdWludDhfdCAgICAgc3JfY29kZTsgICAgICAgICAgICAvLy88IENvcmUgYXVkaW8gc2FtcGxpbmcgZnJlcXVlbmN5CisgICAgdWludDhfdCAgICAgYnJfY29kZTsgICAgICAgICAgICAvLy88IFRyYW5zbWlzc2lvbiBiaXQgcmF0ZQorICAgIHVpbnQ4X3QgICAgIGRyY19wcmVzZW50OyAgICAgICAgLy8vPCBFbWJlZGRlZCBkeW5hbWljIHJhbmdlIGZsYWcKKyAgICB1aW50OF90ICAgICB0c19wcmVzZW50OyAgICAgICAgIC8vLzwgRW1iZWRkZWQgdGltZSBzdGFtcCBmbGFnCisgICAgdWludDhfdCAgICAgYXV4X3ByZXNlbnQ7ICAgICAgICAvLy88IEF1eGlsaWFyeSBkYXRhIGZsYWcKKyAgICB1aW50OF90ICAgICBoZGNkX21hc3RlcjsgICAgICAgIC8vLzwgSERDRCBtYXN0ZXJpbmcgZmxhZworICAgIHVpbnQ4X3QgICAgIGV4dF9hdWRpb190eXBlOyAgICAgLy8vPCBFeHRlbnNpb24gYXVkaW8gZGVzY3JpcHRvciBmbGFnCisgICAgdWludDhfdCAgICAgZXh0X2F1ZGlvX3ByZXNlbnQ7ICAvLy88IEV4dGVuZGVkIGNvZGluZyBmbGFnCisgICAgdWludDhfdCAgICAgc3luY19zc2Y7ICAgICAgICAgICAvLy88IEF1ZGlvIHN5bmMgd29yZCBpbnNlcnRpb24gZmxhZworICAgIHVpbnQ4X3QgICAgIGxmZV9wcmVzZW50OyAgICAgICAgLy8vPCBMb3cgZnJlcXVlbmN5IGVmZmVjdHMgZmxhZworICAgIHVpbnQ4X3QgICAgIHByZWRpY3Rvcl9oaXN0b3J5OyAgLy8vPCBQcmVkaWN0b3IgaGlzdG9yeSBmbGFnIHN3aXRjaAorICAgIHVpbnQ4X3QgICAgIGZpbHRlcl9wZXJmZWN0OyAgICAgLy8vPCBNdWx0aXJhdGUgaW50ZXJwb2xhdG9yIHN3aXRjaAorICAgIHVpbnQ4X3QgICAgIGVuY29kZXJfcmV2OyAgICAgICAgLy8vPCBFbmNvZGVyIHNvZnR3YXJlIHJldmlzaW9uCisgICAgdWludDhfdCAgICAgY29weV9oaXN0OyAgICAgICAgICAvLy88IENvcHkgaGlzdG9yeQorICAgIHVpbnQ4X3QgICAgIHBjbXJfY29kZTsgICAgICAgICAgLy8vPCBTb3VyY2UgUENNIHJlc29sdXRpb24KKyAgICB1aW50OF90ICAgICBzdW1kaWZmX2Zyb250OyAgICAgIC8vLzwgRnJvbnQgc3VtL2RpZmZlcmVuY2UgZmxhZworICAgIHVpbnQ4X3QgICAgIHN1bWRpZmZfc3Vycm91bmQ7ICAgLy8vPCBTdXJyb3VuZCBzdW0vZGlmZmVyZW5jZSBmbGFnCisgICAgdWludDhfdCAgICAgZG5fY29kZTsgICAgICAgICAgICAvLy88IERpYWxvZyBub3JtYWxpemF0aW9uIC8gdW5zcGVjaWZpZWQKK30gRENBQ29yZUZyYW1lSGVhZGVyOworCiBlbnVtIERDQVNwZWFrZXIgewogICAgIERDQV9TUEVBS0VSX0MsICAgIERDQV9TUEVBS0VSX0wsICAgIERDQV9TUEVBS0VSX1IsICAgIERDQV9TUEVBS0VSX0xzLAogICAgIERDQV9TUEVBS0VSX1JzLCAgIERDQV9TUEVBS0VSX0xGRTEsIERDQV9TUEVBS0VSX0NzLCAgIERDQV9TUEVBS0VSX0xzciwKQEAgLTkwLDYgKzEzNCwzMyBAQAogI2RlZmluZSBEQ0FfSEFTX1NURVJFTyhtYXNrKSBcCiAgICAgKChtYXNrICYgRENBX1NQRUFLRVJfTEFZT1VUX1NURVJFTykgPT0gRENBX1NQRUFLRVJfTEFZT1VUX1NURVJFTykKIAorZW51bSBEQ0FTcGVha2VyUGFpciB7CisgICAgRENBX1NQRUFLRVJfUEFJUl9DICAgICAgPSAweDAwMDEsCisgICAgRENBX1NQRUFLRVJfUEFJUl9MUiAgICAgPSAweDAwMDIsCisgICAgRENBX1NQRUFLRVJfUEFJUl9Mc1JzICAgPSAweDAwMDQsCisgICAgRENBX1NQRUFLRVJfUEFJUl9MRkUxICAgPSAweDAwMDgsCisgICAgRENBX1NQRUFLRVJfUEFJUl9DcyAgICAgPSAweDAwMTAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9MaFJoICAgPSAweDAwMjAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9Mc3JSc3IgPSAweDAwNDAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9DaCAgICAgPSAweDAwODAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9PaCAgICAgPSAweDAxMDAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9MY1JjICAgPSAweDAyMDAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9Md1J3ICAgPSAweDA0MDAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9Mc3NSc3MgPSAweDA4MDAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9MRkUyICAgPSAweDEwMDAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9MaHNSaHMgPSAweDIwMDAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9DaHIgICAgPSAweDQwMDAsCisgICAgRENBX1NQRUFLRVJfUEFJUl9MaHJSaHIgPSAweDgwMDAKK307CisKKy8qKgorICogUmV0dXJuIG51bWJlciBvZiBpbmRpdmlkdWFsIGNoYW5uZWxzIGluIERDQVNwZWFrZXJQYWlyIG1hc2sKKyAqLworc3RhdGljIGlubGluZSBpbnQgZmZfZGNhX2NvdW50X2Noc19mb3JfbWFzayh1bnNpZ25lZCBpbnQgbWFzaykKK3sKKyAgICByZXR1cm4gYXZfcG9wY291bnQoKG1hc2sgJiAweGZmZmYpIHwgKChtYXNrICYgMHhhZTY2KSA8PCAxNikpOworfQorCiBlbnVtIERDQVJlcHJlc2VudGF0aW9uVHlwZSB7CiAgICAgRENBX1JFUFJfVFlQRV9MdFJ0ID0gMiwKICAgICBEQ0FfUkVQUl9UWVBFX0xoUmggPSAzCkBAIC0xMjQsNyArMTk1LDEyIEBACiAgICAgRENBX0RNSVhfVFlQRV9DT1VOVAogfTsKIAotZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50MzJfdCBhdnByaXZfZGNhX3NhbXBsZV9yYXRlc1sxNl07CitleHRlcm4gYXZfZXhwb3J0X2F2Y29kZWMgY29uc3QgdWludDMyX3QgYXZwcml2X2RjYV9zYW1wbGVfcmF0ZXNbMTZdOworCitleHRlcm4gY29uc3QgdWludDMyX3QgZmZfZGNhX3NhbXBsaW5nX2ZyZXFzWzE2XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2RjYV9mcmVxX3Jhbmdlc1sxNl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfYml0c19wZXJfc2FtcGxlWzhdOworCiAKIC8qKgogICogQ29udmVydCBiaXRzdHJlYW0gdG8gb25lIHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIHN5bmMgbWFya2VyCkBAIC0xMzIsNCArMjA4LDIxIEBACiBpbnQgYXZwcml2X2RjYV9jb252ZXJ0X2JpdHN0cmVhbShjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSwgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9zaXplKTsKIAorLyoqCisgKiBQYXJzZSBhbmQgdmFsaWRhdGUgY29yZSBmcmFtZSBoZWFkZXIKKyAqIEBwYXJhbVtvdXRdIGggICAgUG9pbnRlciB0byBzdHJ1Y3Qgd2hlcmUgaGVhZGVyIGluZm8gaXMgd3JpdHRlbi4KKyAqIEBwYXJhbVtpbl0gIGJ1ZiAgUG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIKKyAqIEBwYXJhbVtpbl0gIHNpemUgU2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZwcml2X2RjYV9wYXJzZV9jb3JlX2ZyYW1lX2hlYWRlcihEQ0FDb3JlRnJhbWVIZWFkZXIgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpOworCisvKioKKyAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBjb3JlIGZyYW1lIGhlYWRlcgorICogQHBhcmFtW291dF0gaCAgIFBvaW50ZXIgdG8gc3RydWN0IHdoZXJlIGhlYWRlciBpbmZvIGlzIHdyaXR0ZW4uCisgKiBAcGFyYW1baW5dICBnYmMgQml0Q29udGV4dCBjb250YWluaW5nIHRoZSBmaXJzdCAxMjAgYml0cyBvZiB0aGUgZnJhbWUuCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgRENBX1BBUlNFX0VSUk9SXyBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGZmX2RjYV9wYXJzZV9jb3JlX2ZyYW1lX2hlYWRlcihEQ0FDb3JlRnJhbWVIZWFkZXIgKmgsIEdldEJpdENvbnRleHQgKmdiKTsKKwogI2VuZGlmIC8qIEFWQ09ERUNfRENBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhX2NvcmUuYyBiL2xpYmF2Y29kZWMvZGNhX2NvcmUuYwppbmRleCA0OGE4ZjYxLi5hY2NjNWVmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RjYV9jb3JlLmMKKysrIGIvbGliYXZjb2RlYy9kY2FfY29yZS5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorI2luY2x1ZGUgImRjYWFkcGNtLmgiCiAjaW5jbHVkZSAiZGNhZGVjLmgiCiAjaW5jbHVkZSAiZGNhZGF0YS5oIgogI2luY2x1ZGUgImRjYWh1ZmYuaCIKQEAgLTM0LDM1ICszNSw3IEBACiAgICAgSEVBREVSX1hYQ0gKIH07CiAKLWVudW0gQXVkaW9Nb2RlIHsKLSAgICBBTU9ERV9NT05PLCAgICAgICAgICAgICAvLyBNb2RlIDA6IEEgKG1vbm8pCi0gICAgQU1PREVfTU9OT19EVUFMLCAgICAgICAgLy8gTW9kZSAxOiBBICsgQiAoZHVhbCBtb25vKQotICAgIEFNT0RFX1NURVJFTywgICAgICAgICAgIC8vIE1vZGUgMjogTCArIFIgKHN0ZXJlbykKLSAgICBBTU9ERV9TVEVSRU9fU1VNRElGRiwgICAvLyBNb2RlIDM6IChMK1IpICsgKEwtUikgKHN1bS1kaWZmKQotICAgIEFNT0RFX1NURVJFT19UT1RBTCwgICAgIC8vIE1vZGUgNDogTFQgKyBSVCAobGVmdCBhbmQgcmlnaHQgdG90YWwpCi0gICAgQU1PREVfM0YsICAgICAgICAgICAgICAgLy8gTW9kZSA1OiBDICsgTCArIFIKLSAgICBBTU9ERV8yRjFSLCAgICAgICAgICAgICAvLyBNb2RlIDY6IEwgKyBSICsgUwotICAgIEFNT0RFXzNGMVIsICAgICAgICAgICAgIC8vIE1vZGUgNzogQyArIEwgKyBSICsgUwotICAgIEFNT0RFXzJGMlIsICAgICAgICAgICAgIC8vIE1vZGUgODogTCArIFIgKyBTTCArIFNSCi0gICAgQU1PREVfM0YyUiwgICAgICAgICAgICAgLy8gTW9kZSA5OiBDICsgTCArIFIgKyBTTCArIFNSCi0KLSAgICBBTU9ERV9DT1VOVAotfTsKLQotZW51bSBFeHRBdWRpb1R5cGUgewotICAgIEVYVF9BVURJT19YQ0ggICA9IDAsCi0gICAgRVhUX0FVRElPX1g5NiAgID0gMiwKLSAgICBFWFRfQVVESU9fWFhDSCAgPSA2Ci19OwotCi1lbnVtIExGRUZsYWcgewotICAgIExGRV9GTEFHX05PTkUsCi0gICAgTEZFX0ZMQUdfMTI4LAotICAgIExGRV9GTEFHXzY0LAotICAgIExGRV9GTEFHX0lOVkFMSUQKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3QgcHJtX2NoX3RvX3Nwa3JfbWFwW0FNT0RFX0NPVU5UXVs1XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgcHJtX2NoX3RvX3Nwa3JfbWFwW0RDQV9BTU9ERV9DT1VOVF1bNV0gPSB7CiAgICAgeyBEQ0FfU1BFQUtFUl9DLCAgICAgICAgICAgIC0xLCAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgLTEsICAgICAgICAgICAgIC0xIH0sCiAgICAgeyBEQ0FfU1BFQUtFUl9MLCBEQ0FfU1BFQUtFUl9SLCAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgLTEsICAgICAgICAgICAgIC0xIH0sCiAgICAgeyBEQ0FfU1BFQUtFUl9MLCBEQ0FfU1BFQUtFUl9SLCAgICAgICAgICAgICAtMSwgICAgICAgICAgICAgLTEsICAgICAgICAgICAgIC0xIH0sCkBAIC03NSw3ICs0OCw3IEBACiAgICAgeyBEQ0FfU1BFQUtFUl9DLCBEQ0FfU1BFQUtFUl9MLCBEQ0FfU1BFQUtFUl9SLCAgRENBX1NQRUFLRVJfTHMsIERDQV9TUEVBS0VSX1JzIH0KIH07CiAKLXN0YXRpYyBjb25zdCB1aW50OF90IGF1ZGlvX21vZGVfY2hfbWFza1tBTU9ERV9DT1VOVF0gPSB7CitzdGF0aWMgY29uc3QgdWludDhfdCBhdWRpb19tb2RlX2NoX21hc2tbRENBX0FNT0RFX0NPVU5UXSA9IHsKICAgICBEQ0FfU1BFQUtFUl9MQVlPVVRfTU9OTywKICAgICBEQ0FfU1BFQUtFUl9MQVlPVVRfU1RFUkVPLAogICAgIERDQV9TUEVBS0VSX0xBWU9VVF9TVEVSRU8sCkBAIC05Miw3MCArNjUsNiBAQAogICAgIDcsIDEwLCAxMiwgMTMsIDE1LCAxNywgMTkKIH07CiAKLXN0YXRpYyBjb25zdCB1aW50OF90IHF1YW50X2luZGV4X3NlbF9uYml0c1tEQ0FfQ09ERV9CT09LU10gPSB7Ci0gICAgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMwotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgcXVhbnRfaW5kZXhfZ3JvdXBfc2l6ZVtEQ0FfQ09ERV9CT09LU10gPSB7Ci0gICAgMSwgMywgMywgMywgMywgNywgNywgNywgNywgNwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgRENBVkxDIHsKLSAgICBpbnQgb2Zmc2V0OyAgICAgICAgIC8vLzwgQ29kZSB2YWx1ZXMgb2Zmc2V0Ci0gICAgaW50IG1heF9kZXB0aDsgICAgICAvLy88IFBhcmFtZXRlciBmb3IgZ2V0X3ZsYzIoKQotICAgIFZMQyB2bGNbN107ICAgICAgICAgLy8vPCBBY3R1YWwgY29kZXMKLX0gRENBVkxDOwotCi1zdGF0aWMgRENBVkxDICAgdmxjX2JpdF9hbGxvY2F0aW9uOwotc3RhdGljIERDQVZMQyAgIHZsY190cmFuc2l0aW9uX21vZGU7Ci1zdGF0aWMgRENBVkxDICAgdmxjX3NjYWxlX2ZhY3RvcjsKLXN0YXRpYyBEQ0FWTEMgICB2bGNfcXVhbnRfaW5kZXhbRENBX0NPREVfQk9PS1NdOwotCi1zdGF0aWMgYXZfY29sZCB2b2lkIGRjYV9pbml0X3ZsY3Modm9pZCkKLXsKLSAgICBzdGF0aWMgVkxDX1RZUEUgZGNhX3RhYmxlWzIzNjIyXVsyXTsKLSAgICBzdGF0aWMgaW50IHZsY3NfaW5pdGlhbGl6ZWQgPSAwOwotICAgIGludCBpLCBqLCBrOwotCi0gICAgaWYgKHZsY3NfaW5pdGlhbGl6ZWQpCi0gICAgICAgIHJldHVybjsKLQotI2RlZmluZSBEQ0FfSU5JVF9WTEModmxjLCBhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB2bGMudGFibGUgICAgICAgICAgID0gJmRjYV90YWJsZVtmZl9kY2FfdmxjX29mZnNba11dOyAgICAgICAgICAgICAgXAotICAgICAgICB2bGMudGFibGVfYWxsb2NhdGVkID0gZmZfZGNhX3ZsY19vZmZzW2sgKyAxXSAtIGZmX2RjYV92bGNfb2Zmc1trXTsgXAotICAgICAgICBpbml0X3ZsYygmdmxjLCBhLCBiLCBjLCAxLCAxLCBkLCAyLCAyLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7ICAgXAotICAgIH0gd2hpbGUgKDApCi0KLSAgICB2bGNfYml0X2FsbG9jYXRpb24ub2Zmc2V0ICAgID0gMTsKLSAgICB2bGNfYml0X2FsbG9jYXRpb24ubWF4X2RlcHRoID0gMjsKLSAgICBmb3IgKGkgPSAwLCBrID0gMDsgaSA8IDU7IGkrKywgaysrKQotICAgICAgICBEQ0FfSU5JVF9WTEModmxjX2JpdF9hbGxvY2F0aW9uLnZsY1tpXSwgYml0YWxsb2NfMTJfdmxjX2JpdHNbaV0sIDEyLAotICAgICAgICAgICAgICAgICAgICAgYml0YWxsb2NfMTJfYml0c1tpXSwgYml0YWxsb2NfMTJfY29kZXNbaV0pOwotCi0gICAgdmxjX3NjYWxlX2ZhY3Rvci5vZmZzZXQgICAgPSAtNjQ7Ci0gICAgdmxjX3NjYWxlX2ZhY3Rvci5tYXhfZGVwdGggPSAyOwotICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyssIGsrKykKLSAgICAgICAgRENBX0lOSVRfVkxDKHZsY19zY2FsZV9mYWN0b3IudmxjW2ldLCBTQ0FMRVNfVkxDX0JJVFMsIDEyOSwKLSAgICAgICAgICAgICAgICAgICAgIHNjYWxlc19iaXRzW2ldLCBzY2FsZXNfY29kZXNbaV0pOwotCi0gICAgdmxjX3RyYW5zaXRpb25fbW9kZS5vZmZzZXQgICAgPSAwOwotICAgIHZsY190cmFuc2l0aW9uX21vZGUubWF4X2RlcHRoID0gMTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrLCBrKyspCi0gICAgICAgIERDQV9JTklUX1ZMQyh2bGNfdHJhbnNpdGlvbl9tb2RlLnZsY1tpXSwgdG1vZGVfdmxjX2JpdHNbaV0sIDQsCi0gICAgICAgICAgICAgICAgICAgICB0bW9kZV9iaXRzW2ldLCB0bW9kZV9jb2Rlc1tpXSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRENBX0NPREVfQk9PS1M7IGkrKykgewotICAgICAgICB2bGNfcXVhbnRfaW5kZXhbaV0ub2Zmc2V0ICAgID0gYml0YWxsb2Nfb2Zmc2V0c1tpXTsKLSAgICAgICAgdmxjX3F1YW50X2luZGV4W2ldLm1heF9kZXB0aCA9IDEgKyAoaSA+IDQpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgcXVhbnRfaW5kZXhfZ3JvdXBfc2l6ZVtpXTsgaisrLCBrKyspCi0gICAgICAgICAgICBEQ0FfSU5JVF9WTEModmxjX3F1YW50X2luZGV4W2ldLnZsY1tqXSwgYml0YWxsb2NfbWF4Yml0c1tpXVtqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiaXRhbGxvY19zaXplc1tpXSwgYml0YWxsb2NfYml0c1tpXVtqXSwgYml0YWxsb2NfY29kZXNbaV1bal0pOwotICAgIH0KLQotICAgIHZsY3NfaW5pdGlhbGl6ZWQgPSAxOwotfQotCiBzdGF0aWMgaW50IGRjYV9nZXRfdmxjKEdldEJpdENvbnRleHQgKnMsIERDQVZMQyAqdiwgaW50IGkpCiB7CiAgICAgcmV0dXJuIGdldF92bGMyKHMsIHYtPnZsY1tpXS50YWJsZSwgdi0+dmxjW2ldLmJpdHMsIHYtPm1heF9kZXB0aCkgKyB2LT5vZmZzZXQ7CkBAIC0xNzIsMTE0ICs4MSw2OCBAQAogLy8gNS4zLjEgLSBCaXQgc3RyZWFtIGhlYWRlcgogc3RhdGljIGludCBwYXJzZV9mcmFtZV9oZWFkZXIoRENBQ29yZURlY29kZXIgKnMpCiB7Ci0gICAgaW50IG5vcm1hbF9mcmFtZSwgcGNtcl9pbmRleDsKKyAgICBEQ0FDb3JlRnJhbWVIZWFkZXIgaCA9IHsgMCB9OworICAgIGludCBlcnIgPSBmZl9kY2FfcGFyc2VfY29yZV9mcmFtZV9oZWFkZXIoJmgsICZzLT5nYik7CiAKLSAgICAvLyBGcmFtZSB0eXBlCi0gICAgbm9ybWFsX2ZyYW1lID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSBEQ0FfUEFSU0VfRVJST1JfREVGSUNJVF9TQU1QTEVTOgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWZpY2l0IHNhbXBsZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIGgubm9ybWFsX2ZyYW1lID8gQVZFUlJPUl9JTlZBTElEREFUQSA6IEFWRVJST1JfUEFUQ0hXRUxDT01FOwogCi0gICAgLy8gRGVmaWNpdCBzYW1wbGUgY291bnQKLSAgICBpZiAoZ2V0X2JpdHMoJnMtPmdiLCA1KSAhPSBEQ0FfUENNQkxPQ0tfU0FNUExFUyAtIDEpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWZpY2l0IHNhbXBsZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOwotICAgICAgICByZXR1cm4gbm9ybWFsX2ZyYW1lID8gQVZFUlJPUl9JTlZBTElEREFUQSA6IEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICBjYXNlIERDQV9QQVJTRV9FUlJPUl9QQ01fQkxPQ0tTOgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgUENNIHNhbXBsZSBibG9ja3MgKCVkKVxuIiwgaC5ucGNtYmxvY2tzKTsKKyAgICAgICAgICAgIHJldHVybiAoaC5ucGNtYmxvY2tzIDwgNiB8fCBoLm5vcm1hbF9mcmFtZSkgPyBBVkVSUk9SX0lOVkFMSUREQVRBIDogQVZFUlJPUl9QQVRDSFdFTENPTUU7CisKKyAgICAgICAgY2FzZSBEQ0FfUEFSU0VfRVJST1JfRlJBTUVfU0laRToKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb3JlIGZyYW1lIHNpemUgKCVkIGJ5dGVzKVxuIiwgaC5mcmFtZV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGNhc2UgRENBX1BBUlNFX0VSUk9SX0FNT0RFOgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBhdWRpbyBjaGFubmVsIGFycmFuZ2VtZW50ICglZClcbiIsIGguYXVkaW9fbW9kZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisKKyAgICAgICAgY2FzZSBEQ0FfUEFSU0VfRVJST1JfU0FNUExFX1JBVEU6CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29yZSBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3lcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgY2FzZSBEQ0FfUEFSU0VfRVJST1JfUkVTRVJWRURfQklUOgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZXNlcnZlZCBiaXQgc2V0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGNhc2UgRENBX1BBUlNFX0VSUk9SX0xGRV9GTEFHOgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGxvdyBmcmVxdWVuY3kgZWZmZWN0cyBmbGFnXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGNhc2UgRENBX1BBUlNFX0VSUk9SX1BDTV9SRVM6CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc291cmNlIFBDTSByZXNvbHV0aW9uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY29yZSBmcmFtZSBoZWFkZXIgZXJyb3JcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDUkMgcHJlc2VudCBmbGFnCi0gICAgcy0+Y3JjX3ByZXNlbnQgPSBnZXRfYml0czEoJnMtPmdiKTsKLQotICAgIC8vIE51bWJlciBvZiBQQ00gc2FtcGxlIGJsb2NrcwotICAgIHMtPm5wY21ibG9ja3MgPSBnZXRfYml0cygmcy0+Z2IsIDcpICsgMTsKLSAgICBpZiAocy0+bnBjbWJsb2NrcyAmIChEQ0FfU1VCQkFORF9TQU1QTEVTIC0gMSkpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgUENNIHNhbXBsZSBibG9ja3MgKCVkKVxuIiwgcy0+bnBjbWJsb2Nrcyk7Ci0gICAgICAgIHJldHVybiAocy0+bnBjbWJsb2NrcyA8IDYgfHwgbm9ybWFsX2ZyYW1lKSA/IEFWRVJST1JfSU5WQUxJRERBVEEgOiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKLSAgICB9Ci0KLSAgICAvLyBQcmltYXJ5IGZyYW1lIGJ5dGUgc2l6ZQotICAgIHMtPmZyYW1lX3NpemUgPSBnZXRfYml0cygmcy0+Z2IsIDE0KSArIDE7Ci0gICAgaWYgKHMtPmZyYW1lX3NpemUgPCA5NikgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29yZSBmcmFtZSBzaXplICglZCBieXRlcylcbiIsIHMtPmZyYW1lX3NpemUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICAvLyBBdWRpbyBjaGFubmVsIGFycmFuZ2VtZW50Ci0gICAgcy0+YXVkaW9fbW9kZSA9IGdldF9iaXRzKCZzLT5nYiwgNik7Ci0gICAgaWYgKHMtPmF1ZGlvX21vZGUgPj0gQU1PREVfQ09VTlQpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBhdWRpbyBjaGFubmVsIGFycmFuZ2VtZW50ICglZClcbiIsIHMtPmF1ZGlvX21vZGUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Ci0gICAgfQotCi0gICAgLy8gQ29yZSBhdWRpbyBzYW1wbGluZyBmcmVxdWVuY3kKLSAgICBzLT5zYW1wbGVfcmF0ZSA9IGF2cHJpdl9kY2Ffc2FtcGxlX3JhdGVzW2dldF9iaXRzKCZzLT5nYiwgNCldOwotICAgIGlmICghcy0+c2FtcGxlX3JhdGUpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvcmUgYXVkaW8gc2FtcGxpbmcgZnJlcXVlbmN5XG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotCi0gICAgLy8gVHJhbnNtaXNzaW9uIGJpdCByYXRlCi0gICAgcy0+Yml0X3JhdGUgPSBmZl9kY2FfYml0X3JhdGVzW2dldF9iaXRzKCZzLT5nYiwgNSldOwotCi0gICAgLy8gUmVzZXJ2ZWQgZmllbGQKLSAgICBza2lwX2JpdHMxKCZzLT5nYik7Ci0KLSAgICAvLyBFbWJlZGRlZCBkeW5hbWljIHJhbmdlIGZsYWcKLSAgICBzLT5kcmNfcHJlc2VudCA9IGdldF9iaXRzMSgmcy0+Z2IpOwotCi0gICAgLy8gRW1iZWRkZWQgdGltZSBzdGFtcCBmbGFnCi0gICAgcy0+dHNfcHJlc2VudCA9IGdldF9iaXRzMSgmcy0+Z2IpOwotCi0gICAgLy8gQXV4aWxpYXJ5IGRhdGEgZmxhZwotICAgIHMtPmF1eF9wcmVzZW50ID0gZ2V0X2JpdHMxKCZzLT5nYik7Ci0KLSAgICAvLyBIRENEIG1hc3RlcmluZyBmbGFnCi0gICAgc2tpcF9iaXRzMSgmcy0+Z2IpOwotCi0gICAgLy8gRXh0ZW5zaW9uIGF1ZGlvIGRlc2NyaXB0b3IgZmxhZwotICAgIHMtPmV4dF9hdWRpb190eXBlID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKLQotICAgIC8vIEV4dGVuZGVkIGNvZGluZyBmbGFnCi0gICAgcy0+ZXh0X2F1ZGlvX3ByZXNlbnQgPSBnZXRfYml0czEoJnMtPmdiKTsKLQotICAgIC8vIEF1ZGlvIHN5bmMgd29yZCBpbnNlcnRpb24gZmxhZwotICAgIHMtPnN5bmNfc3NmID0gZ2V0X2JpdHMxKCZzLT5nYik7Ci0KLSAgICAvLyBMb3cgZnJlcXVlbmN5IGVmZmVjdHMgZmxhZwotICAgIHMtPmxmZV9wcmVzZW50ID0gZ2V0X2JpdHMoJnMtPmdiLCAyKTsKLSAgICBpZiAocy0+bGZlX3ByZXNlbnQgPT0gTEZFX0ZMQUdfSU5WQUxJRCkgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbG93IGZyZXF1ZW5jeSBlZmZlY3RzIGZsYWdcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICAvLyBQcmVkaWN0b3IgaGlzdG9yeSBmbGFnIHN3aXRjaAotICAgIHMtPnByZWRpY3Rvcl9oaXN0b3J5ID0gZ2V0X2JpdHMxKCZzLT5nYik7Ci0KLSAgICAvLyBIZWFkZXIgQ1JDIGNoZWNrIGJ5dGVzCi0gICAgaWYgKHMtPmNyY19wcmVzZW50KQotICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7Ci0KLSAgICAvLyBNdWx0aXJhdGUgaW50ZXJwb2xhdG9yIHN3aXRjaAotICAgIHMtPmZpbHRlcl9wZXJmZWN0ID0gZ2V0X2JpdHMxKCZzLT5nYik7Ci0KLSAgICAvLyBFbmNvZGVyIHNvZnR3YXJlIHJldmlzaW9uCi0gICAgc2tpcF9iaXRzKCZzLT5nYiwgNCk7Ci0KLSAgICAvLyBDb3B5IGhpc3RvcnkKLSAgICBza2lwX2JpdHMoJnMtPmdiLCAyKTsKLQotICAgIC8vIFNvdXJjZSBQQ00gcmVzb2x1dGlvbgotICAgIHMtPnNvdXJjZV9wY21fcmVzID0gZmZfZGNhX2JpdHNfcGVyX3NhbXBsZVtwY21yX2luZGV4ID0gZ2V0X2JpdHMoJnMtPmdiLCAzKV07Ci0gICAgaWYgKCFzLT5zb3VyY2VfcGNtX3JlcykgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc291cmNlIFBDTSByZXNvbHV0aW9uXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotICAgIHMtPmVzX2Zvcm1hdCA9IHBjbXJfaW5kZXggJiAxOwotCi0gICAgLy8gRnJvbnQgc3VtL2RpZmZlcmVuY2UgZmxhZwotICAgIHMtPnN1bWRpZmZfZnJvbnQgPSBnZXRfYml0czEoJnMtPmdiKTsKLQotICAgIC8vIFN1cnJvdW5kIHN1bS9kaWZmZXJlbmNlIGZsYWcKLSAgICBzLT5zdW1kaWZmX3N1cnJvdW5kID0gZ2V0X2JpdHMxKCZzLT5nYik7Ci0KLSAgICAvLyBEaWFsb2cgbm9ybWFsaXphdGlvbiAvIHVuc3BlY2lmaWVkCi0gICAgc2tpcF9iaXRzKCZzLT5nYiwgNCk7CisgICAgcy0+Y3JjX3ByZXNlbnQgICAgICAgICAgPSBoLmNyY19wcmVzZW50OworICAgIHMtPm5wY21ibG9ja3MgICAgICAgICAgID0gaC5ucGNtYmxvY2tzOworICAgIHMtPmZyYW1lX3NpemUgICAgICAgICAgID0gaC5mcmFtZV9zaXplOworICAgIHMtPmF1ZGlvX21vZGUgICAgICAgICAgID0gaC5hdWRpb19tb2RlOworICAgIHMtPnNhbXBsZV9yYXRlICAgICAgICAgID0gYXZwcml2X2RjYV9zYW1wbGVfcmF0ZXNbaC5zcl9jb2RlXTsKKyAgICBzLT5iaXRfcmF0ZSAgICAgICAgICAgICA9IGZmX2RjYV9iaXRfcmF0ZXNbaC5icl9jb2RlXTsKKyAgICBzLT5kcmNfcHJlc2VudCAgICAgICAgICA9IGguZHJjX3ByZXNlbnQ7CisgICAgcy0+dHNfcHJlc2VudCAgICAgICAgICAgPSBoLnRzX3ByZXNlbnQ7CisgICAgcy0+YXV4X3ByZXNlbnQgICAgICAgICAgPSBoLmF1eF9wcmVzZW50OworICAgIHMtPmV4dF9hdWRpb190eXBlICAgICAgID0gaC5leHRfYXVkaW9fdHlwZTsKKyAgICBzLT5leHRfYXVkaW9fcHJlc2VudCAgICA9IGguZXh0X2F1ZGlvX3ByZXNlbnQ7CisgICAgcy0+c3luY19zc2YgICAgICAgICAgICAgPSBoLnN5bmNfc3NmOworICAgIHMtPmxmZV9wcmVzZW50ICAgICAgICAgID0gaC5sZmVfcHJlc2VudDsKKyAgICBzLT5wcmVkaWN0b3JfaGlzdG9yeSAgICA9IGgucHJlZGljdG9yX2hpc3Rvcnk7CisgICAgcy0+ZmlsdGVyX3BlcmZlY3QgICAgICAgPSBoLmZpbHRlcl9wZXJmZWN0OworICAgIHMtPnNvdXJjZV9wY21fcmVzICAgICAgID0gZmZfZGNhX2JpdHNfcGVyX3NhbXBsZVtoLnBjbXJfY29kZV07CisgICAgcy0+ZXNfZm9ybWF0ICAgICAgICAgICAgPSBoLnBjbXJfY29kZSAmIDE7CisgICAgcy0+c3VtZGlmZl9mcm9udCAgICAgICAgPSBoLnN1bWRpZmZfZnJvbnQ7CisgICAgcy0+c3VtZGlmZl9zdXJyb3VuZCAgICAgPSBoLnN1bWRpZmZfc3Vycm91bmQ7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTMyNSw4ICsxODgsNyBAQAogCiAgICAgICAgIC8vIENoZWNrIENSQwogICAgICAgICBpZiAocy0+eHhjaF9jcmNfcHJlc2VudAotICAgICAgICAgICAgJiYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQ1JDQ0hFQ0sgfCBBVl9FRl9DQVJFRlVMKSkKLSAgICAgICAgICAgICYmIGZmX2RjYV9jaGVja19jcmMoJnMtPmdiLCBoZWFkZXJfcG9zLCBoZWFkZXJfcG9zICsgaGVhZGVyX3NpemUgKiA4KSkgeworICAgICAgICAgICAgJiYgZmZfZGNhX2NoZWNrX2NyYyhzLT5hdmN0eCwgJnMtPmdiLCBoZWFkZXJfcG9zLCBoZWFkZXJfcG9zICsgaGVhZGVyX3NpemUgKiA4KSkgewogICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFhYQ0ggY2hhbm5lbCBzZXQgaGVhZGVyIGNoZWNrc3VtXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CkBAIC00NTcsMTIgKzMxOSwxMiBAQAogICAgIC8vIFF1YW50aXphdGlvbiBpbmRleCBjb2RlYm9vayBzZWxlY3QKICAgICBmb3IgKG4gPSAwOyBuIDwgRENBX0NPREVfQk9PS1M7IG4rKykKICAgICAgICAgZm9yIChjaCA9IHhjaF9iYXNlOyBjaCA8IHMtPm5jaGFubmVsczsgY2grKykKLSAgICAgICAgICAgIHMtPnF1YW50X2luZGV4X3NlbFtjaF1bbl0gPSBnZXRfYml0cygmcy0+Z2IsIHF1YW50X2luZGV4X3NlbF9uYml0c1tuXSk7CisgICAgICAgICAgICBzLT5xdWFudF9pbmRleF9zZWxbY2hdW25dID0gZ2V0X2JpdHMoJnMtPmdiLCBmZl9kY2FfcXVhbnRfaW5kZXhfc2VsX25iaXRzW25dKTsKIAogICAgIC8vIFNjYWxlIGZhY3RvciBhZGp1c3RtZW50IGluZGV4CiAgICAgZm9yIChuID0gMDsgbiA8IERDQV9DT0RFX0JPT0tTOyBuKyspCiAgICAgICAgIGZvciAoY2ggPSB4Y2hfYmFzZTsgY2ggPCBzLT5uY2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICBpZiAocy0+cXVhbnRfaW5kZXhfc2VsW2NoXVtuXSA8IHF1YW50X2luZGV4X2dyb3VwX3NpemVbbl0pCisgICAgICAgICAgICBpZiAocy0+cXVhbnRfaW5kZXhfc2VsW2NoXVtuXSA8IGZmX2RjYV9xdWFudF9pbmRleF9ncm91cF9zaXplW25dKQogICAgICAgICAgICAgICAgIHMtPnNjYWxlX2ZhY3Rvcl9hZGpbY2hdW25dID0gZmZfZGNhX3NjYWxlX2ZhY3Rvcl9hZGpbZ2V0X2JpdHMoJnMtPmdiLCAyKV07CiAKICAgICBpZiAoaGVhZGVyID09IEhFQURFUl9YWENIKSB7CkBAIC00OTgsNyArMzYwLDcgQEAKIAogICAgIC8vIElmIEh1ZmZtYW4gY29kZSB3YXMgdXNlZCwgdGhlIGRpZmZlcmVuY2Ugb2Ygc2NhbGVzIHdhcyBlbmNvZGVkCiAgICAgaWYgKHNlbCA8IDUpCi0gICAgICAgICpzY2FsZV9pbmRleCArPSBkY2FfZ2V0X3ZsYygmcy0+Z2IsICZ2bGNfc2NhbGVfZmFjdG9yLCBzZWwpOworICAgICAgICAqc2NhbGVfaW5kZXggKz0gZGNhX2dldF92bGMoJnMtPmdiLCAmZmZfZGNhX3ZsY19zY2FsZV9mYWN0b3IsIHNlbCk7CiAgICAgZWxzZQogICAgICAgICAqc2NhbGVfaW5kZXggPSBnZXRfYml0cygmcy0+Z2IsIHNlbCArIDEpOwogCkBAIC01MTcsNyArMzc5LDcgQEAKIAogICAgIC8vIEFic29sdXRlIHZhbHVlIHdhcyBlbmNvZGVkIGV2ZW4gd2hlbiBIdWZmbWFuIGNvZGUgd2FzIHVzZWQKICAgICBpZiAoc2VsIDwgNSkKLSAgICAgICAgc2NhbGVfaW5kZXggPSBkY2FfZ2V0X3ZsYygmcy0+Z2IsICZ2bGNfc2NhbGVfZmFjdG9yLCBzZWwpOworICAgICAgICBzY2FsZV9pbmRleCA9IGRjYV9nZXRfdmxjKCZzLT5nYiwgJmZmX2RjYV92bGNfc2NhbGVfZmFjdG9yLCBzZWwpOwogICAgIGVsc2UKICAgICAgICAgc2NhbGVfaW5kZXggPSBnZXRfYml0cygmcy0+Z2IsIHNlbCArIDEpOwogCkBAIC01NjksNyArNDMxLDcgQEAKICAgICAgICAgICAgIGludCBhYml0czsKIAogICAgICAgICAgICAgaWYgKHNlbCA8IDUpCi0gICAgICAgICAgICAgICAgYWJpdHMgPSBkY2FfZ2V0X3ZsYygmcy0+Z2IsICZ2bGNfYml0X2FsbG9jYXRpb24sIHNlbCk7CisgICAgICAgICAgICAgICAgYWJpdHMgPSBkY2FfZ2V0X3ZsYygmcy0+Z2IsICZmZl9kY2FfdmxjX2JpdF9hbGxvY2F0aW9uLCBzZWwpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGFiaXRzID0gZ2V0X2JpdHMoJnMtPmdiLCBzZWwgLSAxKTsKIApAQCAtNTkyLDcgKzQ1NCw3IEBACiAgICAgICAgICAgICBpbnQgc2VsID0gcy0+dHJhbnNpdGlvbl9tb2RlX3NlbFtjaF07CiAgICAgICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgcy0+c3ViYmFuZF92cV9zdGFydFtjaF07IGJhbmQrKykKICAgICAgICAgICAgICAgICBpZiAocy0+Yml0X2FsbG9jYXRpb25bY2hdW2JhbmRdKQotICAgICAgICAgICAgICAgICAgICBzLT50cmFuc2l0aW9uX21vZGVbc2ZdW2NoXVtiYW5kXSA9IGRjYV9nZXRfdmxjKCZzLT5nYiwgJnZsY190cmFuc2l0aW9uX21vZGUsIHNlbCk7CisgICAgICAgICAgICAgICAgICAgIHMtPnRyYW5zaXRpb25fbW9kZVtzZl1bY2hdW2JhbmRdID0gZGNhX2dldF92bGMoJnMtPmdiLCAmZmZfZGNhX3ZsY190cmFuc2l0aW9uX21vZGUsIHNlbCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcwMyw3ICs1NjUsNyBAQAogCiAgICAgLy8gRXh0cmFjdCBIdWZmbWFuIGNvZGVzIGZyb20gdGhlIGJpdCBzdHJlYW0KICAgICBmb3IgKGkgPSAwOyBpIDwgRENBX1NVQkJBTkRfU0FNUExFUzsgaSsrKQotICAgICAgICBhdWRpb1tpXSA9IGRjYV9nZXRfdmxjKCZzLT5nYiwgJnZsY19xdWFudF9pbmRleFthYml0cyAtIDFdLCBzZWwpOworICAgICAgICBhdWRpb1tpXSA9IGRjYV9nZXRfdmxjKCZzLT5nYiwgJmZmX2RjYV92bGNfcXVhbnRfaW5kZXhbYWJpdHMgLSAxXSwgc2VsKTsKIAogICAgIHJldHVybiAxOwogfQpAQCAtNzIwLDcgKzU4Miw3IEBACiAKICAgICBpZiAoYWJpdHMgPD0gRENBX0NPREVfQk9PS1MpIHsKICAgICAgICAgaW50IHNlbCA9IHMtPnF1YW50X2luZGV4X3NlbFtjaF1bYWJpdHMgLSAxXTsKLSAgICAgICAgaWYgKHNlbCA8IHF1YW50X2luZGV4X2dyb3VwX3NpemVbYWJpdHMgLSAxXSkgeworICAgICAgICBpZiAoc2VsIDwgZmZfZGNhX3F1YW50X2luZGV4X2dyb3VwX3NpemVbYWJpdHMgLSAxXSkgewogICAgICAgICAgICAgLy8gSHVmZm1hbiBjb2RlcwogICAgICAgICAgICAgcmV0dXJuIHBhcnNlX2h1ZmZtYW5fY29kZXMocywgYXVkaW8sIGFiaXRzLCBzZWwpOwogICAgICAgICB9CkBAIC03MzUsNDYgKzU5NywyMSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVxdWFudGl6ZShpbnQzMl90ICpvdXRwdXQsIGNvbnN0IGludDMyX3QgKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGVwX3NpemUsIGludDMyX3Qgc2NhbGUsIGludCByZXNpZHVhbCkKLXsKLSAgICAvLyBBY2NvdW50IGZvciBxdWFudGl6ZXIgc3RlcCBzaXplCi0gICAgaW50NjRfdCBzdGVwX3NjYWxlID0gKGludDY0X3Qpc3RlcF9zaXplICogc2NhbGU7Ci0gICAgaW50IG4sIHNoaWZ0ID0gMDsKLQotICAgIC8vIExpbWl0IHNjYWxlIGZhY3RvciByZXNvbHV0aW9uIHRvIDIyIGJpdHMKLSAgICBpZiAoc3RlcF9zY2FsZSA+ICgxIDw8IDIzKSkgewotICAgICAgICBzaGlmdCA9IGF2X2xvZzIoc3RlcF9zY2FsZSA+PiAyMykgKyAxOwotICAgICAgICBzdGVwX3NjYWxlID4+PSBzaGlmdDsKLSAgICB9Ci0KLSAgICAvLyBTY2FsZSB0aGUgc2FtcGxlcwotICAgIGlmIChyZXNpZHVhbCkgewotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgRENBX1NVQkJBTkRfU0FNUExFUzsgbisrKQotICAgICAgICAgICAgb3V0cHV0W25dICs9IGNsaXAyMyhub3JtX18oaW5wdXRbbl0gKiBzdGVwX3NjYWxlLCAyMiAtIHNoaWZ0KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IERDQV9TVUJCQU5EX1NBTVBMRVM7IG4rKykKLSAgICAgICAgICAgIG91dHB1dFtuXSAgPSBjbGlwMjMobm9ybV9fKGlucHV0W25dICogc3RlcF9zY2FsZSwgMjIgLSBzaGlmdCkpOwotICAgIH0KLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGludmVyc2VfYWRwY20oaW50MzJfdCAqKnN1YmJhbmRfc2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnZxX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpwcmVkaWN0aW9uX21vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Jfc3RhcnQsIGludCBzYl9lbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZzLCBpbnQgbGVuKQogewotICAgIGludCBpLCBqLCBrOworICAgIGludCBpLCBqOwogCiAgICAgZm9yIChpID0gc2Jfc3RhcnQ7IGkgPCBzYl9lbmQ7IGkrKykgewogICAgICAgICBpZiAocHJlZGljdGlvbl9tb2RlW2ldKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQxNl90ICpjb2VmZiA9IGZmX2RjYV9hZHBjbV92Ylt2cV9pbmRleFtpXV07CisgICAgICAgICAgICBjb25zdCBpbnQgcHJlZF9pZCA9IHZxX2luZGV4W2ldOwogICAgICAgICAgICAgaW50MzJfdCAqcHRyID0gc3ViYmFuZF9zYW1wbGVzW2ldICsgb2ZzOwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBlcnIgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBEQ0FfQURQQ01fQ09FRkZTOyBrKyspCi0gICAgICAgICAgICAgICAgICAgIGVyciArPSAoaW50NjRfdClwdHJbaiAtIGsgLSAxXSAqIGNvZWZmW2tdOwotICAgICAgICAgICAgICAgIHB0cltqXSA9IGNsaXAyMyhwdHJbal0gKyBjbGlwMjMobm9ybTEzKGVycikpKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHggPSBmZl9kY2FhZHBjbV9wcmVkaWN0KHByZWRfaWQsIHB0ciArIGogLSBEQ0FfQURQQ01fQ09FRkZTKTsKKyAgICAgICAgICAgICAgICBwdHJbal0gPSBjbGlwMjMocHRyW2pdICsgeCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC04ODIsOCArNzE5LDggQEAKICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBjbGlwMjMoYWRqICogc2NhbGUgPj4gMjIpOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGRlcXVhbnRpemUocy0+c3ViYmFuZF9zYW1wbGVzW2NoXVtiYW5kXSArIG9mcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLCBzdGVwX3NpemUsIHNjYWxlLCAwKTsKKyAgICAgICAgICAgICAgICBmZl9kY2FfY29yZV9kZXF1YW50aXplKHMtPnN1YmJhbmRfc2FtcGxlc1tjaF1bYmFuZF0gKyBvZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbywgc3RlcF9zaXplLCBzY2FsZSwgMCwgRENBX1NVQkJBTkRfU0FNUExFUyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTAzMyw4ICs4NzAsNyBAQAogICAgIGhlYWRlcl9zaXplID0gZ2V0X2JpdHMoJnMtPmdiLCA2KSArIDE7CiAKICAgICAvLyBDaGVjayBYWENIIGZyYW1lIGhlYWRlciBDUkMKLSAgICBpZiAoKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQ1JDQ0hFQ0sgfCBBVl9FRl9DQVJFRlVMKSkKLSAgICAgICAgJiYgZmZfZGNhX2NoZWNrX2NyYygmcy0+Z2IsIGhlYWRlcl9wb3MgKyAzMiwgaGVhZGVyX3BvcyArIGhlYWRlcl9zaXplICogOCkpIHsKKyAgICBpZiAoZmZfZGNhX2NoZWNrX2NyYyhzLT5hdmN0eCwgJnMtPmdiLCBoZWFkZXJfcG9zICsgMzIsIGhlYWRlcl9wb3MgKyBoZWFkZXJfc2l6ZSAqIDgpKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBYWENIIGZyYW1lIGhlYWRlciBjaGVja3N1bVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KQEAgLTEyMTIsOCArMTA0OCw4IEBACiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IHhicl9zY2FsZV9mYWN0b3JzW2NoXVtiYW5kXVsxXTsKIAotICAgICAgICAgICAgICAgIGRlcXVhbnRpemUocy0+c3ViYmFuZF9zYW1wbGVzW2NoXVtiYW5kXSArIG9mcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvLCBzdGVwX3NpemUsIHNjYWxlLCAxKTsKKyAgICAgICAgICAgICAgICBmZl9kY2FfY29yZV9kZXF1YW50aXplKHMtPnN1YmJhbmRfc2FtcGxlc1tjaF1bYmFuZF0gKyBvZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbywgc3RlcF9zaXplLCBzY2FsZSwgMSwgRENBX1NVQkJBTkRfU0FNUExFUyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTI0OSw4ICsxMDg1LDcgQEAKICAgICBoZWFkZXJfc2l6ZSA9IGdldF9iaXRzKCZzLT5nYiwgNikgKyAxOwogCiAgICAgLy8gQ2hlY2sgWEJSIGZyYW1lIGhlYWRlciBDUkMKLSAgICBpZiAoKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQ1JDQ0hFQ0sgfCBBVl9FRl9DQVJFRlVMKSkKLSAgICAgICAgJiYgZmZfZGNhX2NoZWNrX2NyYygmcy0+Z2IsIGhlYWRlcl9wb3MgKyAzMiwgaGVhZGVyX3BvcyArIGhlYWRlcl9zaXplICogOCkpIHsKKyAgICBpZiAoZmZfZGNhX2NoZWNrX2NyYyhzLT5hdmN0eCwgJnMtPmdiLCBoZWFkZXJfcG9zICsgMzIsIGhlYWRlcl9wb3MgKyBoZWFkZXJfc2l6ZSAqIDgpKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBYQlIgZnJhbWUgaGVhZGVyIGNoZWNrc3VtXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtMTM5Myw4ICsxMjI4LDggQEAKICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHNjYWxlIGZhY3RvcgogICAgICAgICAgICAgICAgIHNjYWxlID0gcy0+c2NhbGVfZmFjdG9yc1tjaF1bYmFuZCA+PiAxXVtiYW5kICYgMV07CiAKLSAgICAgICAgICAgICAgICBkZXF1YW50aXplKHMtPng5Nl9zdWJiYW5kX3NhbXBsZXNbY2hdW2JhbmRdICsgb2ZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8sIHN0ZXBfc2l6ZSwgc2NhbGUsIDApOworICAgICAgICAgICAgICAgIGZmX2RjYV9jb3JlX2RlcXVhbnRpemUocy0+eDk2X3N1YmJhbmRfc2FtcGxlc1tjaF1bYmFuZF0gKyBvZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpbywgc3RlcF9zaXplLCBzY2FsZSwgMCwgRENBX1NVQkJBTkRfU0FNUExFUyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTQ5NCw3ICsxMzI5LDcgQEAKICAgICAgICAgZm9yIChiYW5kID0gcy0+eDk2X3N1YmJhbmRfc3RhcnQ7IGJhbmQgPCBzLT5uc3ViYmFuZHNbY2hdOyBiYW5kKyspIHsKICAgICAgICAgICAgIC8vIElmIEh1ZmZtYW4gY29kZSB3YXMgdXNlZCwgdGhlIGRpZmZlcmVuY2Ugb2YgYWJpdHMgd2FzIGVuY29kZWQKICAgICAgICAgICAgIGlmIChzZWwgPCA3KQotICAgICAgICAgICAgICAgIGFiaXRzICs9IGRjYV9nZXRfdmxjKCZzLT5nYiwgJnZsY19xdWFudF9pbmRleFs1ICsgMiAqIHMtPng5Nl9oaWdoX3Jlc10sIHNlbCk7CisgICAgICAgICAgICAgICAgYWJpdHMgKz0gZGNhX2dldF92bGMoJnMtPmdiLCAmZmZfZGNhX3ZsY19xdWFudF9pbmRleFs1ICsgMiAqIHMtPng5Nl9oaWdoX3Jlc10sIHNlbCk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgYWJpdHMgPSBnZXRfYml0cygmcy0+Z2IsIDMgKyBzLT54OTZfaGlnaF9yZXMpOwogCkBAIC0xNTY1LDggKzE0MDAsNyBAQAogCiAgICAgICAgIC8vIENoZWNrIENSQwogICAgICAgICBpZiAocy0+eDk2X2NyY19wcmVzZW50Ci0gICAgICAgICAgICAmJiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9DUkNDSEVDSyB8IEFWX0VGX0NBUkVGVUwpKQotICAgICAgICAgICAgJiYgZmZfZGNhX2NoZWNrX2NyYygmcy0+Z2IsIGhlYWRlcl9wb3MsIGhlYWRlcl9wb3MgKyBoZWFkZXJfc2l6ZSAqIDgpKSB7CisgICAgICAgICAgICAmJiBmZl9kY2FfY2hlY2tfY3JjKHMtPmF2Y3R4LCAmcy0+Z2IsIGhlYWRlcl9wb3MsIGhlYWRlcl9wb3MgKyBoZWFkZXJfc2l6ZSAqIDgpKSB7CiAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgWDk2IGNoYW5uZWwgc2V0IGhlYWRlciBjaGVja3N1bVxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQpAQCAtMTYyMiw3ICsxNDU2LDcgQEAKICAgICAvLyBRdWFudGl6YXRpb24gaW5kZXggY29kZWJvb2sgc2VsZWN0CiAgICAgZm9yIChuID0gMDsgbiA8IDYgKyA0ICogcy0+eDk2X2hpZ2hfcmVzOyBuKyspCiAgICAgICAgIGZvciAoY2ggPSB4Y2hfYmFzZTsgY2ggPCBzLT54OTZfbmNoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgcy0+cXVhbnRfaW5kZXhfc2VsW2NoXVtuXSA9IGdldF9iaXRzKCZzLT5nYiwgcXVhbnRfaW5kZXhfc2VsX25iaXRzW25dKTsKKyAgICAgICAgICAgIHMtPnF1YW50X2luZGV4X3NlbFtjaF1bbl0gPSBnZXRfYml0cygmcy0+Z2IsIGZmX2RjYV9xdWFudF9pbmRleF9zZWxfbmJpdHNbbl0pOwogCiAgICAgaWYgKGV4c3MpIHsKICAgICAgICAgLy8gUmVzZXJ2ZWQKQEAgLTE3MjEsOCArMTU1NSw3IEBACiAgICAgaGVhZGVyX3NpemUgPSBnZXRfYml0cygmcy0+Z2IsIDYpICsgMTsKIAogICAgIC8vIENoZWNrIFg5NiBmcmFtZSBoZWFkZXIgQ1JDCi0gICAgaWYgKChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0NSQ0NIRUNLIHwgQVZfRUZfQ0FSRUZVTCkpCi0gICAgICAgICYmIGZmX2RjYV9jaGVja19jcmMoJnMtPmdiLCBoZWFkZXJfcG9zICsgMzIsIGhlYWRlcl9wb3MgKyBoZWFkZXJfc2l6ZSAqIDgpKSB7CisgICAgaWYgKGZmX2RjYV9jaGVja19jcmMocy0+YXZjdHgsICZzLT5nYiwgaGVhZGVyX3BvcyArIDMyLCBoZWFkZXJfcG9zICsgaGVhZGVyX3NpemUgKiA4KSkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgWDk2IGZyYW1lIGhlYWRlciBjaGVja3N1bVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KQEAgLTE3NjAsNiArMTU5Myw3IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAvLyBDaGFubmVsIHNldCBkYXRhCisgICAgcy0+eDk2X25jaGFubmVscyA9IDA7CiAgICAgZm9yIChpID0gMCwgeDk2X2Jhc2VfY2ggPSAwOyBpIDwgeDk2X25jaHNldHM7IGkrKykgewogICAgICAgICBoZWFkZXJfcG9zID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKIApAQCAtMTg0MCw4ICsxNjc0LDcgQEAKICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7CiAKICAgICAvLyBDaGVjayBDUkMKLSAgICBpZiAoKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQ1JDQ0hFQ0sgfCBBVl9FRl9DQVJFRlVMKSkKLSAgICAgICAgJiYgZmZfZGNhX2NoZWNrX2NyYygmcy0+Z2IsIGF1eF9wb3MsIGdldF9iaXRzX2NvdW50KCZzLT5nYikpKSB7CisgICAgaWYgKGZmX2RjYV9jaGVja19jcmMocy0+YXZjdHgsICZzLT5nYiwgYXV4X3BvcywgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSkpIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGF1eGlsaWFyeSBkYXRhIGNoZWNrc3VtXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtMTg3MSwxMiArMTcwNCwxMyBAQAogICAgICAgICBpbnQgc3luY19wb3MgPSBGRk1JTihzLT5mcmFtZV9zaXplIC8gNCwgcy0+Z2Iuc2l6ZV9pbl9iaXRzIC8gMzIpIC0gMTsKICAgICAgICAgaW50IGxhc3RfcG9zID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAvIDMyOwogICAgICAgICBpbnQgc2l6ZSwgZGlzdDsKKyAgICAgICAgdWludDMyX3QgdzEsIHcyID0gMDsKIAogICAgICAgICAvLyBTZWFyY2ggZm9yIGV4dGVuc2lvbiBzeW5jIHdvcmRzIGFsaWduZWQgb24gNC1ieXRlIGJvdW5kYXJ5LiBTZWFyY2gKICAgICAgICAgLy8gbXVzdCBiZSBkb25lIGJhY2t3YXJkcyBmcm9tIHRoZSBlbmQgb2YgY29yZSBmcmFtZSB0byB3b3JrIGFyb3VuZAogICAgICAgICAvLyBzeW5jIHdvcmQgYWxpYXNpbmcgaXNzdWVzLgogICAgICAgICBzd2l0Y2ggKHMtPmV4dF9hdWRpb190eXBlKSB7Ci0gICAgICAgIGNhc2UgRVhUX0FVRElPX1hDSDoKKyAgICAgICAgY2FzZSBEQ0FfRVhUX0FVRElPX1hDSDoKICAgICAgICAgICAgIGlmIChkY2EtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTE4ODUsNzAgKzE3MTksNzQgQEAKICAgICAgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgYml0c3RyZWFtcy4gTWluaW11bSBYQ0ggZnJhbWUgc2l6ZSBpcwogICAgICAgICAgICAgLy8gOTYgYnl0ZXMuIEFNT0RFIGFuZCBQQ0hTIGFyZSBmdXJ0aGVyIGNoZWNrZWQgdG8gcmVkdWNlCiAgICAgICAgICAgICAvLyBwcm9iYWJpbGl0eSBvZiBhbGlhcyBzeW5jIGRldGVjdGlvbi4KLSAgICAgICAgICAgIGZvciAoOyBzeW5jX3BvcyA+PSBsYXN0X3Bvczsgc3luY19wb3MtLSkgewotICAgICAgICAgICAgICAgIGlmIChBVl9SQjMyKHMtPmdiLmJ1ZmZlciArIHN5bmNfcG9zICogNCkgPT0gRENBX1NZTkNXT1JEX1hDSCkgewotICAgICAgICAgICAgICAgICAgICBzLT5nYi5pbmRleCA9IChzeW5jX3BvcyArIDEpICogMzI7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBnZXRfYml0cygmcy0+Z2IsIDEwKSArIDE7CisgICAgICAgICAgICBmb3IgKDsgc3luY19wb3MgPj0gbGFzdF9wb3M7IHN5bmNfcG9zLS0sIHcyID0gdzEpIHsKKyAgICAgICAgICAgICAgICB3MSA9IEFWX1JCMzIocy0+Z2IuYnVmZmVyICsgc3luY19wb3MgKiA0KTsKKyAgICAgICAgICAgICAgICBpZiAodzEgPT0gRENBX1NZTkNXT1JEX1hDSCkgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gKHcyID4+IDIyKSArIDE7CiAgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBzLT5mcmFtZV9zaXplIC0gc3luY19wb3MgKiA0OwogICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSA5NgogICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHNpemUgPT0gZGlzdCB8fCBzaXplIC0gMSA9PSBkaXN0KQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZ2V0X2JpdHMoJnMtPmdiLCA3KSA9PSAweDA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT54Y2hfcG9zID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICh3MiA+PiAxNSAmIDB4N2YpID09IDB4MDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnhjaF9wb3MgPSBzeW5jX3BvcyAqIDMyICsgNDk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSB7CisgICAgICAgICAgICBpZiAoIXMtPnhjaF9wb3MpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlhDSCBzeW5jIHdvcmQgbm90IGZvdW5kXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgY2FzZSBFWFRfQVVESU9fWDk2OgorICAgICAgICBjYXNlIERDQV9FWFRfQVVESU9fWDk2OgogICAgICAgICAgICAgLy8gVGhlIGRpc3RhbmNlIGJldHdlZW4gWDk2IHN5bmMgd29yZCBhbmQgZW5kIG9mIHRoZSBjb3JlIGZyYW1lCiAgICAgICAgICAgICAvLyBtdXN0IGJlIGVxdWFsIHRvIFg5NiBmcmFtZSBzaXplLiBNaW5pbXVtIFg5NiBmcmFtZSBzaXplIGlzIDk2CiAgICAgICAgICAgICAvLyBieXRlcy4KLSAgICAgICAgICAgIGZvciAoOyBzeW5jX3BvcyA+PSBsYXN0X3Bvczsgc3luY19wb3MtLSkgewotICAgICAgICAgICAgICAgIGlmIChBVl9SQjMyKHMtPmdiLmJ1ZmZlciArIHN5bmNfcG9zICogNCkgPT0gRENBX1NZTkNXT1JEX1g5NikgewotICAgICAgICAgICAgICAgICAgICBzLT5nYi5pbmRleCA9IChzeW5jX3BvcyArIDEpICogMzI7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBnZXRfYml0cygmcy0+Z2IsIDEyKSArIDE7CisgICAgICAgICAgICBmb3IgKDsgc3luY19wb3MgPj0gbGFzdF9wb3M7IHN5bmNfcG9zLS0sIHcyID0gdzEpIHsKKyAgICAgICAgICAgICAgICB3MSA9IEFWX1JCMzIocy0+Z2IuYnVmZmVyICsgc3luY19wb3MgKiA0KTsKKyAgICAgICAgICAgICAgICBpZiAodzEgPT0gRENBX1NZTkNXT1JEX1g5NikgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gKHcyID4+IDIwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBzLT5mcmFtZV9zaXplIC0gc3luY19wb3MgKiA0OwogICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSA5NiAmJiBzaXplID09IGRpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPng5Nl9wb3MgPSBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+eDk2X3BvcyA9IHN5bmNfcG9zICogMzIgKyA0NDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgICAgIGlmICghcy0+eDk2X3BvcykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiWDk2IHN5bmMgd29yZCBub3QgZm91bmRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIEVYVF9BVURJT19YWENIOgorICAgICAgICBjYXNlIERDQV9FWFRfQVVESU9fWFhDSDoKICAgICAgICAgICAgIGlmIChkY2EtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIC8vIFhYQ0ggZnJhbWUgaGVhZGVyIENSQyBtdXN0IGJlIHZhbGlkLiBNaW5pbXVtIFhYQ0ggZnJhbWUgaGVhZGVyCiAgICAgICAgICAgICAvLyBzaXplIGlzIDExIGJ5dGVzLgotICAgICAgICAgICAgZm9yICg7IHN5bmNfcG9zID49IGxhc3RfcG9zOyBzeW5jX3Bvcy0tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKEFWX1JCMzIocy0+Z2IuYnVmZmVyICsgc3luY19wb3MgKiA0KSA9PSBEQ0FfU1lOQ1dPUkRfWFhDSCkgewotICAgICAgICAgICAgICAgICAgICBzLT5nYi5pbmRleCA9IChzeW5jX3BvcyArIDEpICogMzI7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUgPSBnZXRfYml0cygmcy0+Z2IsIDYpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gMTEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICFmZl9kY2FfY2hlY2tfY3JjKCZzLT5nYiwgKHN5bmNfcG9zICsgMSkgKiAzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNfcG9zICogMzIgKyBzaXplICogOCkpIHsKKyAgICAgICAgICAgIGZvciAoOyBzeW5jX3BvcyA+PSBsYXN0X3Bvczsgc3luY19wb3MtLSwgdzIgPSB3MSkgeworICAgICAgICAgICAgICAgIHcxID0gQVZfUkIzMihzLT5nYi5idWZmZXIgKyBzeW5jX3BvcyAqIDQpOworICAgICAgICAgICAgICAgIGlmICh3MSA9PSBEQ0FfU1lOQ1dPUkRfWFhDSCkgeworICAgICAgICAgICAgICAgICAgICBzaXplID0gKHcyID4+IDI2KSArIDE7CisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBzLT5nYi5zaXplX2luX2JpdHMgLyA4IC0gc3luY19wb3MgKiA0OworICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA+PSAxMSAmJiBzaXplIDw9IGRpc3QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFhdl9jcmMoZGNhLT5jcmN0YWIsIDB4ZmZmZiwgcy0+Z2IuYnVmZmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5bmNfcG9zICsgMSkgKiA0LCBzaXplIC0gNCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnh4Y2hfcG9zID0gc3luY19wb3MgKiAzMjsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgICAgIGlmICghcy0+eHhjaF9wb3MpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlhYQ0ggc3luYyB3b3JkIG5vdCBmb3VuZFxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xOTY2LDggKzE4MDQsOCBAQAogCiAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmcy0+Z2IsIGRhdGEsIHNpemUpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CisgICAgcy0+Z2JfaW4gPSBzLT5nYjsKIAotICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgMzIpOwogICAgIGlmICgocmV0ID0gcGFyc2VfZnJhbWVfaGVhZGVyKHMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgaWYgKChyZXQgPSBhbGxvY19zYW1wbGVfYnVmZmVyKHMpKSA8IDApCkBAIC0xOTc4LDEwICsxODE2LDggQEAKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIC8vIFdvcmthcm91bmQgZm9yIERUUyBpbiBXQVYKLSAgICBpZiAocy0+ZnJhbWVfc2l6ZSA+IHNpemUgJiYgcy0+ZnJhbWVfc2l6ZSA8IHNpemUgKyA0KSB7Ci0gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiV29ya2luZyBhcm91bmQgZXhjZXNzaXZlIGNvcmUgZnJhbWUgc2l6ZSAoJWQgPiAlZClcbiIsIHMtPmZyYW1lX3NpemUsIHNpemUpOworICAgIGlmIChzLT5mcmFtZV9zaXplID4gc2l6ZSkKICAgICAgICAgcy0+ZnJhbWVfc2l6ZSA9IHNpemU7Ci0gICAgfQogCiAgICAgaWYgKGZmX2RjYV9zZWVrX2JpdHMoJnMtPmdiLCBzLT5mcmFtZV9zaXplICogOCkpIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWFkIHBhc3QgZW5kIG9mIGNvcmUgZnJhbWVcbiIpOwpAQCAtMTk5Niw3ICsxODMyLDYgQEAKIHsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5hdmN0eDsKICAgICBEQ0FDb250ZXh0ICpkY2EgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEdldEJpdENvbnRleHQgZ2IgPSBzLT5nYjsKICAgICBpbnQgZXhzc19tYXNrID0gYXNzZXQgPyBhc3NldC0+ZXh0ZW5zaW9uX21hc2sgOiAwOwogICAgIGludCByZXQgPSAwLCBleHQgPSAwOwogCkBAIC0yMDA4LDExICsxODQzLDEzIEBACiAgICAgICAgICAgICByZXQgPSBwYXJzZV94eGNoX2ZyYW1lKHMpOwogICAgICAgICAgICAgZXh0ID0gRENBX0VYU1NfWFhDSDsKICAgICAgICAgfSBlbHNlIGlmIChzLT54eGNoX3BvcykgewotICAgICAgICAgICAgcy0+Z2IuaW5kZXggPSBzLT54eGNoX3BvczsKKyAgICAgICAgICAgIHMtPmdiID0gcy0+Z2JfaW47CisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIHMtPnh4Y2hfcG9zKTsKICAgICAgICAgICAgIHJldCA9IHBhcnNlX3h4Y2hfZnJhbWUocyk7CiAgICAgICAgICAgICBleHQgPSBEQ0FfQ1NTX1hYQ0g7CiAgICAgICAgIH0gZWxzZSBpZiAocy0+eGNoX3BvcykgewotICAgICAgICAgICAgcy0+Z2IuaW5kZXggPSBzLT54Y2hfcG9zOworICAgICAgICAgICAgcy0+Z2IgPSBzLT5nYl9pbjsKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZzLT5nYiwgcy0+eGNoX3Bvcyk7CiAgICAgICAgICAgICByZXQgPSBwYXJzZV94Y2hfZnJhbWUocyk7CiAgICAgICAgICAgICBleHQgPSBEQ0FfQ1NTX1hDSDsKICAgICAgICAgfQpAQCAtMjA1NCw4ICsxODkxLDggQEAKICAgICAgICAgICAgICAgICBzLT5leHRfYXVkaW9fbWFzayB8PSBEQ0FfRVhTU19YOTY7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocy0+eDk2X3BvcykgewotICAgICAgICAgICAgcy0+Z2IgPSBnYjsKLSAgICAgICAgICAgIHMtPmdiLmluZGV4ID0gcy0+eDk2X3BvczsKKyAgICAgICAgICAgIHMtPmdiID0gcy0+Z2JfaW47CisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIHMtPng5Nl9wb3MpOwogICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV94OTZfZnJhbWUocykpIDwgMCkgewogICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFTk9NRU0pIHx8IChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC0yMTkzLDcgKzIwMzAsNyBAQAogICAgICAgICBpbnQgbmxmZXNhbXBsZXMgPSBzLT5ucGNtYmxvY2tzID4+IDE7CiAKICAgICAgICAgLy8gQ2hlY2sgTEZGCi0gICAgICAgIGlmIChzLT5sZmVfcHJlc2VudCA9PSBMRkVfRkxBR18xMjgpIHsKKyAgICAgICAgaWYgKHMtPmxmZV9wcmVzZW50ID09IERDQV9MRkVfRkxBR18xMjgpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRml4ZWQgcG9pbnQgbW9kZSBkb2Vzbid0IHN1cHBvcnQgTEZGPTFcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQpAQCAtMjI0Myw3ICsyMDgwLDcgQEAKIAogICAgIC8vIFVuZG8gZW1iZWRkZWQgWENIIGRvd25taXgKICAgICBpZiAocy0+ZXNfZm9ybWF0ICYmIChzLT5leHRfYXVkaW9fbWFzayAmIERDQV9DU1NfWENIKQotICAgICAgICAmJiBzLT5hdWRpb19tb2RlID49IEFNT0RFXzJGMlIpIHsKKyAgICAgICAgJiYgcy0+YXVkaW9fbW9kZSA+PSBEQ0FfQU1PREVfMkYyUikgewogICAgICAgICBzLT5kY2Fkc3AtPmRtaXhfc3ViX3hjaChzLT5vdXRwdXRfc2FtcGxlc1tEQ0FfU1BFQUtFUl9Mc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9zYW1wbGVzW0RDQV9TUEVBS0VSX1JzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0cHV0X3NhbXBsZXNbRENBX1NQRUFLRVJfQ3NdLApAQCAtMjI4NywxNSArMjEyNCwxNSBAQAogCiAgICAgaWYgKCEocy0+ZXh0X2F1ZGlvX21hc2sgJiAoRENBX0NTU19YWENIIHwgRENBX0NTU19YQ0ggfCBEQ0FfRVhTU19YWENIKSkpIHsKICAgICAgICAgLy8gRnJvbnQgc3VtL2RpZmZlcmVuY2UgZGVjb2RpbmcKLSAgICAgICAgaWYgKChzLT5zdW1kaWZmX2Zyb250ICYmIHMtPmF1ZGlvX21vZGUgPiBBTU9ERV9NT05PKQotICAgICAgICAgICAgfHwgcy0+YXVkaW9fbW9kZSA9PSBBTU9ERV9TVEVSRU9fU1VNRElGRikgeworICAgICAgICBpZiAoKHMtPnN1bWRpZmZfZnJvbnQgJiYgcy0+YXVkaW9fbW9kZSA+IERDQV9BTU9ERV9NT05PKQorICAgICAgICAgICAgfHwgcy0+YXVkaW9fbW9kZSA9PSBEQ0FfQU1PREVfU1RFUkVPX1NVTURJRkYpIHsKICAgICAgICAgICAgIHMtPmZpeGVkX2RzcC0+YnV0dGVyZmxpZXNfZml4ZWQocy0+b3V0cHV0X3NhbXBsZXNbRENBX1NQRUFLRVJfTF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9zYW1wbGVzW0RDQV9TUEVBS0VSX1JdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2FtcGxlcyk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBTdXJyb3VuZCBzdW0vZGlmZmVyZW5jZSBkZWNvZGluZwotICAgICAgICBpZiAocy0+c3VtZGlmZl9zdXJyb3VuZCAmJiBzLT5hdWRpb19tb2RlID49IEFNT0RFXzJGMlIpIHsKKyAgICAgICAgaWYgKHMtPnN1bWRpZmZfc3Vycm91bmQgJiYgcy0+YXVkaW9fbW9kZSA+PSBEQ0FfQU1PREVfMkYyUikgewogICAgICAgICAgICAgcy0+Zml4ZWRfZHNwLT5idXR0ZXJmbGllc19maXhlZChzLT5vdXRwdXRfc2FtcGxlc1tEQ0FfU1BFQUtFUl9Mc10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9zYW1wbGVzW0RDQV9TUEVBS0VSX1JzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNhbXBsZXMpOwpAQCAtMjM5OSw3ICsyMjM2LDcgQEAKIAogICAgIC8vIEZpbHRlciBMRkUgY2hhbm5lbAogICAgIGlmIChzLT5sZmVfcHJlc2VudCkgewotICAgICAgICBpbnQgZGVjX3NlbGVjdCA9IChzLT5sZmVfcHJlc2VudCA9PSBMRkVfRkxBR18xMjgpOworICAgICAgICBpbnQgZGVjX3NlbGVjdCA9IChzLT5sZmVfcHJlc2VudCA9PSBEQ0FfTEZFX0ZMQUdfMTI4KTsKICAgICAgICAgZmxvYXQgKnNhbXBsZXMgPSBvdXRwdXRfc2FtcGxlc1tEQ0FfU1BFQUtFUl9MRkUxXTsKICAgICAgICAgaW50IG5sZmVzYW1wbGVzID0gcy0+bnBjbWJsb2NrcyA+PiAoZGVjX3NlbGVjdCArIDEpOwogCkBAIC0yNDMzLDcgKzIyNzAsNyBAQAogCiAgICAgLy8gVW5kbyBlbWJlZGRlZCBYQ0ggZG93bm1peAogICAgIGlmIChzLT5lc19mb3JtYXQgJiYgKHMtPmV4dF9hdWRpb19tYXNrICYgRENBX0NTU19YQ0gpCi0gICAgICAgICYmIHMtPmF1ZGlvX21vZGUgPj0gQU1PREVfMkYyUikgeworICAgICAgICAmJiBzLT5hdWRpb19tb2RlID49IERDQV9BTU9ERV8yRjJSKSB7CiAgICAgICAgIHMtPmZsb2F0X2RzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyKG91dHB1dF9zYW1wbGVzW0RDQV9TUEVBS0VSX0xzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3NhbXBsZXNbRENBX1NQRUFLRVJfQ3NdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtTV9TUVJUMV8yLCBuc2FtcGxlcyk7CkBAIC0yNDgwLDE1ICsyMzE3LDE1IEBACiAKICAgICBpZiAoIShzLT5leHRfYXVkaW9fbWFzayAmIChEQ0FfQ1NTX1hYQ0ggfCBEQ0FfQ1NTX1hDSCB8IERDQV9FWFNTX1hYQ0gpKSkgewogICAgICAgICAvLyBGcm9udCBzdW0vZGlmZmVyZW5jZSBkZWNvZGluZwotICAgICAgICBpZiAoKHMtPnN1bWRpZmZfZnJvbnQgJiYgcy0+YXVkaW9fbW9kZSA+IEFNT0RFX01PTk8pCi0gICAgICAgICAgICB8fCBzLT5hdWRpb19tb2RlID09IEFNT0RFX1NURVJFT19TVU1ESUZGKSB7CisgICAgICAgIGlmICgocy0+c3VtZGlmZl9mcm9udCAmJiBzLT5hdWRpb19tb2RlID4gRENBX0FNT0RFX01PTk8pCisgICAgICAgICAgICB8fCBzLT5hdWRpb19tb2RlID09IERDQV9BTU9ERV9TVEVSRU9fU1VNRElGRikgewogICAgICAgICAgICAgcy0+ZmxvYXRfZHNwLT5idXR0ZXJmbGllc19mbG9hdChvdXRwdXRfc2FtcGxlc1tEQ0FfU1BFQUtFUl9MXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3NhbXBsZXNbRENBX1NQRUFLRVJfUl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zYW1wbGVzKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFN1cnJvdW5kIHN1bS9kaWZmZXJlbmNlIGRlY29kaW5nCi0gICAgICAgIGlmIChzLT5zdW1kaWZmX3N1cnJvdW5kICYmIHMtPmF1ZGlvX21vZGUgPj0gQU1PREVfMkYyUikgeworICAgICAgICBpZiAocy0+c3VtZGlmZl9zdXJyb3VuZCAmJiBzLT5hdWRpb19tb2RlID49IERDQV9BTU9ERV8yRjJSKSB7CiAgICAgICAgICAgICBzLT5mbG9hdF9kc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0KG91dHB1dF9zYW1wbGVzW0RDQV9TUEVBS0VSX0xzXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3NhbXBsZXNbRENBX1NQRUFLRVJfUnNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2FtcGxlcyk7CkBAIC0yNTE1LDcgKzIzNTIsNyBAQAogCiAgICAgLy8gSGFuZGxlIGRvd25taXhpbmcgdG8gc3RlcmVvIHJlcXVlc3QKICAgICBpZiAoZGNhLT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ID09IERDQV9TUEVBS0VSX0xBWU9VVF9TVEVSRU8KLSAgICAgICAgJiYgcy0+YXVkaW9fbW9kZSA+IEFNT0RFX01PTk8gJiYgcy0+cHJpbV9kbWl4X2VtYmVkZGVkCisgICAgICAgICYmIHMtPmF1ZGlvX21vZGUgPiBEQ0FfQU1PREVfTU9OTyAmJiBzLT5wcmltX2RtaXhfZW1iZWRkZWQKICAgICAgICAgJiYgKHMtPnByaW1fZG1peF90eXBlID09IERDQV9ETUlYX1RZUEVfTG9SbyB8fAogICAgICAgICAgICAgcy0+cHJpbV9kbWl4X3R5cGUgPT0gRENBX0RNSVhfVFlQRV9MdFJ0KSkKICAgICAgICAgcy0+cmVxdWVzdF9tYXNrID0gRENBX1NQRUFLRVJfTEFZT1VUX1NURVJFTzsKQEAgLTI1NDgsOCArMjM4NSw4IEBACiAgICAgZWxzZQogICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSAwOwogCi0gICAgaWYgKHMtPmF1ZGlvX21vZGUgPT0gQU1PREVfU1RFUkVPX1RPVEFMIHx8IChzLT5yZXF1ZXN0X21hc2sgIT0gcy0+Y2hfbWFzayAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJpbV9kbWl4X3R5cGUgPT0gRENBX0RNSVhfVFlQRV9MdFJ0KSkKKyAgICBpZiAocy0+YXVkaW9fbW9kZSA9PSBEQ0FfQU1PREVfU1RFUkVPX1RPVEFMIHx8IChzLT5yZXF1ZXN0X21hc2sgIT0gcy0+Y2hfbWFzayAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByaW1fZG1peF90eXBlID09IERDQV9ETUlYX1RZUEVfTHRSdCkpCiAgICAgICAgIG1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWTsKICAgICBlbHNlCiAgICAgICAgIG1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19OT05FOwpAQCAtMjU3NCw4ICsyNDExLDYgQEAKIAogYXZfY29sZCBpbnQgZmZfZGNhX2NvcmVfaW5pdChEQ0FDb3JlRGVjb2RlciAqcykKIHsKLSAgICBkY2FfaW5pdF92bGNzKCk7Ci0KICAgICBpZiAoIShzLT5mbG9hdF9kc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKDApKSkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmICghKHMtPmZpeGVkX2RzcCA9IGF2cHJpdl9hbGxvY19maXhlZF9kc3AoMCkpKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kY2FfY29yZS5oIGIvbGliYXZjb2RlYy9kY2FfY29yZS5oCmluZGV4IDExMmI3MmIuLjEwMTI4ZDEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGNhX2NvcmUuaAorKysgYi9saWJhdmNvZGVjL2RjYV9jb3JlLmgKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlICJkY2FfZXhzcy5oIgogI2luY2x1ZGUgImRjYWRzcC5oIgogI2luY2x1ZGUgImRjYWRjdC5oIgorI2luY2x1ZGUgImRjYW1hdGguaCIKKyNpbmNsdWRlICJkY2FodWZmLmgiCiAjaW5jbHVkZSAiZmZ0LmgiCiAjaW5jbHVkZSAic3ludGhfZmlsdGVyLmgiCiAKQEAgLTQyLDkgKzQ0LDcgQEAKICNkZWZpbmUgRENBX1NVQkZSQU1FUyAgICAgICAgICAgMTYKICNkZWZpbmUgRENBX1NVQkJBTkRfU0FNUExFUyAgICAgOAogI2RlZmluZSBEQ0FfUENNQkxPQ0tfU0FNUExFUyAgICAzMgotI2RlZmluZSBEQ0FfQURQQ01fQ09FRkZTICAgICAgICA0CiAjZGVmaW5lIERDQV9MRkVfSElTVE9SWSAgICAgICAgIDgKLSNkZWZpbmUgRENBX0NPREVfQk9PS1MgICAgICAgICAgMTAKICNkZWZpbmUgRENBX0FCSVRTX01BWCAgICAgICAgICAgMjYKIAogI2RlZmluZSBEQ0FfQ09SRV9DSEFOTkVMU19NQVggICAgICAgNgpAQCAtNTYsNiArNTYsMzQgQEAKICNkZWZpbmUgRENBX0ZJTFRFUl9NT0RFX1g5NiAgICAgMHgwMQogI2RlZmluZSBEQ0FfRklMVEVSX01PREVfRklYRUQgICAweDAyCiAKK2VudW0gRENBQ29yZUF1ZGlvTW9kZSB7CisgICAgRENBX0FNT0RFX01PTk8sICAgICAgICAgICAgIC8vIE1vZGUgMDogQSAobW9ubykKKyAgICBEQ0FfQU1PREVfTU9OT19EVUFMLCAgICAgICAgLy8gTW9kZSAxOiBBICsgQiAoZHVhbCBtb25vKQorICAgIERDQV9BTU9ERV9TVEVSRU8sICAgICAgICAgICAvLyBNb2RlIDI6IEwgKyBSIChzdGVyZW8pCisgICAgRENBX0FNT0RFX1NURVJFT19TVU1ESUZGLCAgIC8vIE1vZGUgMzogKEwrUikgKyAoTC1SKSAoc3VtLWRpZmYpCisgICAgRENBX0FNT0RFX1NURVJFT19UT1RBTCwgICAgIC8vIE1vZGUgNDogTFQgKyBSVCAobGVmdCBhbmQgcmlnaHQgdG90YWwpCisgICAgRENBX0FNT0RFXzNGLCAgICAgICAgICAgICAgIC8vIE1vZGUgNTogQyArIEwgKyBSCisgICAgRENBX0FNT0RFXzJGMVIsICAgICAgICAgICAgIC8vIE1vZGUgNjogTCArIFIgKyBTCisgICAgRENBX0FNT0RFXzNGMVIsICAgICAgICAgICAgIC8vIE1vZGUgNzogQyArIEwgKyBSICsgUworICAgIERDQV9BTU9ERV8yRjJSLCAgICAgICAgICAgICAvLyBNb2RlIDg6IEwgKyBSICsgU0wgKyBTUgorICAgIERDQV9BTU9ERV8zRjJSLCAgICAgICAgICAgICAvLyBNb2RlIDk6IEMgKyBMICsgUiArIFNMICsgU1IKKworICAgIERDQV9BTU9ERV9DT1VOVAorfTsKKworZW51bSBEQ0FDb3JlRXh0QXVkaW9UeXBlIHsKKyAgICBEQ0FfRVhUX0FVRElPX1hDSCAgID0gMCwKKyAgICBEQ0FfRVhUX0FVRElPX1g5NiAgID0gMiwKKyAgICBEQ0FfRVhUX0FVRElPX1hYQ0ggID0gNgorfTsKKworZW51bSBEQ0FDb3JlTEZFRmxhZyB7CisgICAgRENBX0xGRV9GTEFHX05PTkUsCisgICAgRENBX0xGRV9GTEFHXzEyOCwKKyAgICBEQ0FfTEZFX0ZMQUdfNjQsCisgICAgRENBX0xGRV9GTEFHX0lOVkFMSUQKK307CisKIHR5cGVkZWYgc3RydWN0IERDQURTUERhdGEgewogICAgIHVuaW9uIHsKICAgICAgICAgc3RydWN0IHsKQEAgLTczLDYgKzEwMSw3IEBACiB0eXBlZGVmIHN0cnVjdCBEQ0FDb3JlRGVjb2RlciB7CiAgICAgQVZDb2RlY0NvbnRleHQgICphdmN0eDsKICAgICBHZXRCaXRDb250ZXh0ICAgZ2I7CisgICAgR2V0Qml0Q29udGV4dCAgIGdiX2luOwogCiAgICAgLy8gQml0IHN0cmVhbSBoZWFkZXIKICAgICBpbnQgICAgIGNyY19wcmVzZW50OyAgICAgICAgLy8vPCBDUkMgcHJlc2VudCBmbGFnCkBAIC0xOTUsNiArMjI0LDI5IEBACiAgICAgcmV0dXJuIC0xOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgZmZfZGNhX2NvcmVfZGVxdWFudGl6ZShpbnQzMl90ICpvdXRwdXQsIGNvbnN0IGludDMyX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGVwX3NpemUsIGludDMyX3Qgc2NhbGUsIGludCByZXNpZHVhbCwgaW50IGxlbikKK3sKKyAgICAvLyBBY2NvdW50IGZvciBxdWFudGl6ZXIgc3RlcCBzaXplCisgICAgaW50NjRfdCBzdGVwX3NjYWxlID0gKGludDY0X3Qpc3RlcF9zaXplICogc2NhbGU7CisgICAgaW50IG4sIHNoaWZ0ID0gMDsKKworICAgIC8vIExpbWl0IHNjYWxlIGZhY3RvciByZXNvbHV0aW9uIHRvIDIyIGJpdHMKKyAgICBpZiAoc3RlcF9zY2FsZSA+ICgxIDw8IDIzKSkgeworICAgICAgICBzaGlmdCA9IGF2X2xvZzIoc3RlcF9zY2FsZSA+PiAyMykgKyAxOworICAgICAgICBzdGVwX3NjYWxlID4+PSBzaGlmdDsKKyAgICB9CisKKyAgICAvLyBTY2FsZSB0aGUgc2FtcGxlcworICAgIGlmIChyZXNpZHVhbCkgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyBuKyspCisgICAgICAgICAgICBvdXRwdXRbbl0gKz0gY2xpcDIzKG5vcm1fXyhpbnB1dFtuXSAqIHN0ZXBfc2NhbGUsIDIyIC0gc2hpZnQpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbGVuOyBuKyspCisgICAgICAgICAgICBvdXRwdXRbbl0gID0gY2xpcDIzKG5vcm1fXyhpbnB1dFtuXSAqIHN0ZXBfc2NhbGUsIDIyIC0gc2hpZnQpKTsKKyAgICB9Cit9CisKIGludCBmZl9kY2FfY29yZV9wYXJzZShEQ0FDb3JlRGVjb2RlciAqcywgdWludDhfdCAqZGF0YSwgaW50IHNpemUpOwogaW50IGZmX2RjYV9jb3JlX3BhcnNlX2V4c3MoRENBQ29yZURlY29kZXIgKnMsIHVpbnQ4X3QgKmRhdGEsIERDQUV4c3NBc3NldCAqYXNzZXQpOwogaW50IGZmX2RjYV9jb3JlX2ZpbHRlcl9maXhlZChEQ0FDb3JlRGVjb2RlciAqcywgaW50IHg5Nl9zeW50aCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjYV9jb3JlX2JzZi5jIGIvbGliYXZjb2RlYy9kY2FfY29yZV9ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTY1Nzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9kY2FfY29yZV9ic2YuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzZi5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJkY2Ffc3luY3dvcmRzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCitzdGF0aWMgaW50IGRjYV9jb3JlX2ZpbHRlcihBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICB1aW50MzJfdCBzeW5jd29yZDsKKyAgICBpbnQgY29yZV9zaXplID0gMCwgcmV0OworCisgICAgcmV0ID0gZmZfYnNmX2dldF9wYWNrZXRfcmVmKGN0eCwgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgc3luY3dvcmQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAxKTsKKworICAgIHN3aXRjaCAoc3luY3dvcmQpIHsKKyAgICBjYXNlIERDQV9TWU5DV09SRF9DT1JFX0JFOgorICAgICAgICBjb3JlX3NpemUgPSAoKGJ5dGVzdHJlYW0yX2dldF9iZTI0KCZnYikgPj4gNCkgJiAweDNmZmYpICsgMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKGNvcmVfc2l6ZSA+IDAgJiYgY29yZV9zaXplIDw9IHBrdC0+c2l6ZSkgeworICAgICAgICBwa3QtPnNpemUgPSBjb3JlX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZHNbXSA9IHsKKyAgICBBVl9DT0RFQ19JRF9EVFMsIEFWX0NPREVDX0lEX05PTkUsCit9OworCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9kY2FfY29yZV9ic2YgPSB7CisgICAgLm5hbWUgICAgICA9ICJkY2FfY29yZSIsCisgICAgLmZpbHRlciAgICA9IGRjYV9jb3JlX2ZpbHRlciwKKyAgICAuY29kZWNfaWRzID0gY29kZWNfaWRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhX2V4c3MuYyBiL2xpYmF2Y29kZWMvZGNhX2V4c3MuYwppbmRleCA0NTc5ZjIzLi5lODczMDg4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RjYV9leHNzLmMKKysrIGIvbGliYXZjb2RlYy9kY2FfZXhzcy5jCkBAIC0xOSwxMiArMTksNiBAQAogICovCiAKICNpbmNsdWRlICJkY2FkZWMuaCIKLSNpbmNsdWRlICJkY2FkYXRhLmgiCi0KLXN0YXRpYyBpbnQgY291bnRfY2hzX2Zvcl9tYXNrKGludCBtYXNrKQotewotICAgIHJldHVybiBhdl9wb3Bjb3VudChtYXNrKSArIGF2X3BvcGNvdW50KG1hc2sgJiAweGFlNjYpOwotfQogCiBzdGF0aWMgdm9pZCBwYXJzZV94bGxfcGFyYW1ldGVycyhEQ0FFeHNzUGFyc2VyICpzLCBEQ0FFeHNzQXNzZXQgKmFzc2V0KQogewpAQCAtMTE3LDEyICsxMTEsMTAgQEAKICAgICAgICAgICAgIGludCBuc3BlYWtlcnNbOF07CiAKICAgICAgICAgICAgIC8vIEVtYmVkZGVkIHN0ZXJlbyBmbGFnCi0gICAgICAgICAgICBpZiAoYXNzZXQtPm5jaGFubmVsc190b3RhbCA+IDIpCi0gICAgICAgICAgICAgICAgYXNzZXQtPmVtYmVkZGVkX3N0ZXJlbyA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgYXNzZXQtPmVtYmVkZGVkX3N0ZXJlbyA9IGFzc2V0LT5uY2hhbm5lbHNfdG90YWwgPiAyICYmIGdldF9iaXRzMSgmcy0+Z2IpOwogCiAgICAgICAgICAgICAvLyBFbWJlZGRlZCA2IGNoYW5uZWxzIGZsYWcKLSAgICAgICAgICAgIGlmIChhc3NldC0+bmNoYW5uZWxzX3RvdGFsID4gNikKLSAgICAgICAgICAgICAgICBhc3NldC0+ZW1iZWRkZWRfNmNoID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgICAgICAgICBhc3NldC0+ZW1iZWRkZWRfNmNoID0gYXNzZXQtPm5jaGFubmVsc190b3RhbCA+IDYgJiYgZ2V0X2JpdHMxKCZzLT5nYik7CiAKICAgICAgICAgICAgIC8vIFNwZWFrZXIgbWFzayBlbmFibGVkIGZsYWcKICAgICAgICAgICAgIGlmIChhc3NldC0+c3Brcl9tYXNrX2VuYWJsZWQgPSBnZXRfYml0czEoJnMtPmdiKSkgewpAQCAtMTM1LDEzICsxMjcsMTQgQEAKIAogICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHNwZWFrZXIgcmVtYXBwaW5nIHNldHMKICAgICAgICAgICAgIGlmICgoc3Brcl9yZW1hcF9uc2V0cyA9IGdldF9iaXRzKCZzLT5nYiwgMykpICYmICFzcGtyX21hc2tfbmJpdHMpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNwZWFrZXIgbWFzayBkaXNhYmxlZCB5ZXQgdGhlcmUgYXJlIHJlbWFwcGluZyBzZXRzXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU3BlYWtlciBtYXNrIGRpc2FibGVkIHlldCB0aGVyZSBhcmUgcmVtYXBwaW5nIHNldHNcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBTdGFuZGFyZCBsb3Vkc3BlYWtlciBsYXlvdXQgbWFzawogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNwa3JfcmVtYXBfbnNldHM7IGkrKykKLSAgICAgICAgICAgICAgICBuc3BlYWtlcnNbaV0gPSBjb3VudF9jaHNfZm9yX21hc2soZ2V0X2JpdHMoJnMtPmdiLCBzcGtyX21hc2tfbmJpdHMpKTsKKyAgICAgICAgICAgICAgICBuc3BlYWtlcnNbaV0gPSBmZl9kY2FfY291bnRfY2hzX2Zvcl9tYXNrKGdldF9iaXRzKCZzLT5nYiwgc3Brcl9tYXNrX25iaXRzKSk7CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcGtyX3JlbWFwX25zZXRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgY2hhbm5lbHMgdG8gYmUgZGVjb2RlZCBmb3Igc3BlYWtlciByZW1hcHBpbmcKQEAgLTIyMCw3ICsyMTMsOCBAQAogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ubWl4b3V0Y29uZmlnczsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoIXMtPm5taXhvdXRjaHNbaV0pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc3BlYWtlciBsYXlvdXQgbWFzayBmb3IgbWl4aW5nIGNvbmZpZ3VyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNwZWFrZXIgbGF5b3V0IG1hc2sgZm9yIG1peGluZyBjb25maWd1cmF0aW9uXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuY2hhbm5lbHNfZG1peDsgaisrKSB7CkBAIC0zMTcsNyArMzExLDggQEAKICAgICAvLyBSZXNlcnZlZAogICAgIC8vIFplcm8gcGFkCiAgICAgaWYgKGZmX2RjYV9zZWVrX2JpdHMoJnMtPmdiLCBkZXNjcl9wb3MgKyBkZXNjcl9zaXplICogOCkpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWFkIHBhc3QgZW5kIG9mIEVYU1MgYXNzZXQgZGVzY3JpcHRvclxuIik7CisgICAgICAgIGlmIChzLT5hdmN0eCkKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVhZCBwYXN0IGVuZCBvZiBFWFNTIGFzc2V0IGRlc2NyaXB0b3JcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKQEAgLTM4MCw3ICszNzUsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1pbnQgZmZfZGNhX2V4c3NfcGFyc2UoRENBRXhzc1BhcnNlciAqcywgdWludDhfdCAqZGF0YSwgaW50IHNpemUpCitpbnQgZmZfZGNhX2V4c3NfcGFyc2UoRENBRXhzc1BhcnNlciAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUpCiB7CiAgICAgaW50IGksIHJldCwgb2Zmc2V0LCB3aWRlX2hkciwgaGVhZGVyX3NpemU7CiAKQEAgLTQwMyw4ICszOTgsNyBAQAogICAgIGhlYWRlcl9zaXplID0gZ2V0X2JpdHMoJnMtPmdiLCA4ICsgNCAqIHdpZGVfaGRyKSArIDE7CiAKICAgICAvLyBDaGVjayBDUkMKLSAgICBpZiAoKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQ1JDQ0hFQ0sgfCBBVl9FRl9DQVJFRlVMKSkKLSAgICAgICAgJiYgZmZfZGNhX2NoZWNrX2NyYygmcy0+Z2IsIDMyICsgOCwgaGVhZGVyX3NpemUgKiA4KSkgeworICAgIGlmIChzLT5hdmN0eCAmJiBmZl9kY2FfY2hlY2tfY3JjKHMtPmF2Y3R4LCAmcy0+Z2IsIDMyICsgOCwgaGVhZGVyX3NpemUgKiA4KSkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgRVhTUyBoZWFkZXIgY2hlY2tzdW1cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC00MTQsNyArNDA4LDggQEAKICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgZXh0ZW5zaW9uIHN1YnN0cmVhbQogICAgIHMtPmV4c3Nfc2l6ZSA9IGdldF9iaXRzKCZzLT5nYiwgcy0+ZXhzc19zaXplX25iaXRzKSArIDE7CiAgICAgaWYgKHMtPmV4c3Nfc2l6ZSA+IHNpemUpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWNrZXQgdG9vIHNob3J0IGZvciBFWFNTIGZyYW1lXG4iKTsKKyAgICAgICAgaWYgKHMtPmF2Y3R4KQorICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWNrZXQgdG9vIHNob3J0IGZvciBFWFNTIGZyYW1lXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCkBAIC00MzYsMTQgKzQzMSwxNiBAQAogICAgICAgICAvLyBOdW1iZXIgb2YgZGVmaW5lZCBhdWRpbyBwcmVzZW50YXRpb25zCiAgICAgICAgIHMtPm5wcmVzZW50cyA9IGdldF9iaXRzKCZzLT5nYiwgMykgKyAxOwogICAgICAgICBpZiAocy0+bnByZXNlbnRzID4gMSkgewotICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiJWQgYXVkaW8gcHJlc2VudGF0aW9ucyIsIHMtPm5wcmVzZW50cyk7CisgICAgICAgICAgICBpZiAocy0+YXZjdHgpCisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiJWQgYXVkaW8gcHJlc2VudGF0aW9ucyIsIHMtPm5wcmVzZW50cyk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBOdW1iZXIgb2YgYXVkaW8gYXNzZXRzIGluIGV4dGVuc2lvbiBzdWJzdHJlYW0KICAgICAgICAgcy0+bmFzc2V0cyA9IGdldF9iaXRzKCZzLT5nYiwgMykgKyAxOwogICAgICAgICBpZiAocy0+bmFzc2V0cyA+IDEpIHsKLSAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIiVkIGF1ZGlvIGFzc2V0cyIsIHMtPm5hc3NldHMpOworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4KQorICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIiVkIGF1ZGlvIGFzc2V0cyIsIHMtPm5hc3NldHMpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9CiAKQEAgLTQ3MCw3ICs0NjcsNyBAQAogCiAgICAgICAgICAgICAvLyBTcGVha2VyIGxheW91dCBtYXNrIGZvciBtaXhlciBvdXRwdXQgY2hhbm5lbHMKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ubWl4b3V0Y29uZmlnczsgaSsrKQotICAgICAgICAgICAgICAgIHMtPm5taXhvdXRjaHNbaV0gPSBjb3VudF9jaHNfZm9yX21hc2soZ2V0X2JpdHMoJnMtPmdiLCBzcGtyX21hc2tfbmJpdHMpKTsKKyAgICAgICAgICAgICAgICBzLT5ubWl4b3V0Y2hzW2ldID0gZmZfZGNhX2NvdW50X2Noc19mb3JfbWFzayhnZXRfYml0cygmcy0+Z2IsIHNwa3JfbWFza19uYml0cykpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcy0+bnByZXNlbnRzID0gMTsKQEAgLTQ4NCw3ICs0ODEsOCBAQAogICAgICAgICBzLT5hc3NldHNbaV0uYXNzZXRfc2l6ZSA9IGdldF9iaXRzKCZzLT5nYiwgcy0+ZXhzc19zaXplX25iaXRzKSArIDE7CiAgICAgICAgIG9mZnNldCArPSBzLT5hc3NldHNbaV0uYXNzZXRfc2l6ZTsKICAgICAgICAgaWYgKG9mZnNldCA+IHMtPmV4c3Nfc2l6ZSkgewotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFWFNTIGFzc2V0IG91dCBvZiBib3VuZHNcbiIpOworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4KQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRVhTUyBhc3NldCBvdXQgb2YgYm91bmRzXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgfQpAQCAtNDk0LDcgKzQ5Miw4IEBACiAgICAgICAgIGlmICgocmV0ID0gcGFyc2VfZGVzY3JpcHRvcihzLCAmcy0+YXNzZXRzW2ldKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgaWYgKChyZXQgPSBzZXRfZXhzc19vZmZzZXRzKCZzLT5hc3NldHNbaV0pKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBleHRlbnNpb24gc2l6ZSBpbiBFWFNTIGFzc2V0IGRlc2NyaXB0b3JcbiIpOworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4KQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBleHRlbnNpb24gc2l6ZSBpbiBFWFNTIGFzc2V0IGRlc2NyaXB0b3JcbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgIH0KQEAgLTUwNiw3ICs1MDUsOCBAQAogICAgIC8vIEJ5dGUgYWxpZ24KICAgICAvLyBDUkMxNiBvZiBleHRlbnNpb24gc3Vic3RyZWFtIGhlYWRlcgogICAgIGlmIChmZl9kY2Ffc2Vla19iaXRzKCZzLT5nYiwgaGVhZGVyX3NpemUgKiA4KSkgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlYWQgcGFzdCBlbmQgb2YgRVhTUyBoZWFkZXJcbiIpOworICAgICAgICBpZiAocy0+YXZjdHgpCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlYWQgcGFzdCBlbmQgb2YgRVhTUyBoZWFkZXJcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhX2V4c3MuaCBiL2xpYmF2Y29kZWMvZGNhX2V4c3MuaAppbmRleCAzMjMwNjNhLi4yMDhmYWUxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RjYV9leHNzLmgKKysrIGIvbGliYXZjb2RlYy9kY2FfZXhzcy5oCkBAIC04Nyw2ICs4Nyw2IEBACiAgICAgRENBRXhzc0Fzc2V0ICAgYXNzZXRzWzFdOyAgICAvLy88IEF1ZGlvIGFzc2V0IGRlc2NyaXB0b3JzCiB9IERDQUV4c3NQYXJzZXI7CiAKLWludCBmZl9kY2FfZXhzc19wYXJzZShEQ0FFeHNzUGFyc2VyICpzLCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSk7CitpbnQgZmZfZGNhX2V4c3NfcGFyc2UoRENBRXhzc1BhcnNlciAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhX2xici5jIGIvbGliYXZjb2RlYy9kY2FfbGJyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1MGE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZGNhX2xici5jCkBAIC0wLDAgKzEsMTgxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBmb284NgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorCisjaW5jbHVkZSAiZGNhZGVjLmgiCisjaW5jbHVkZSAiZGNhZGF0YS5oIgorI2luY2x1ZGUgImRjYWh1ZmYuaCIKKyNpbmNsdWRlICJkY2Ffc3luY3dvcmRzLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorCisjZGVmaW5lIEFNUF9NQVggICAgIDU2CisKK2VudW0gTEJSRmxhZ3MgeworICAgIExCUl9GTEFHXzI0X0JJVCAgICAgICAgICAgICA9IDB4MDEsCisgICAgTEJSX0ZMQUdfTEZFX1BSRVNFTlQgICAgICAgID0gMHgwMiwKKyAgICBMQlJfRkxBR19CQU5EX0xJTUlUXzJfMyAgICAgPSAweDA0LAorICAgIExCUl9GTEFHX0JBTkRfTElNSVRfMV8yICAgICA9IDB4MDgsCisgICAgTEJSX0ZMQUdfQkFORF9MSU1JVF8xXzMgICAgID0gMHgwYywKKyAgICBMQlJfRkxBR19CQU5EX0xJTUlUXzFfNCAgICAgPSAweDEwLAorICAgIExCUl9GTEFHX0JBTkRfTElNSVRfMV84ICAgICA9IDB4MTgsCisgICAgTEJSX0ZMQUdfQkFORF9MSU1JVF9OT05FICAgID0gMHgxNCwKKyAgICBMQlJfRkxBR19CQU5EX0xJTUlUX01BU0sgICAgPSAweDFjLAorICAgIExCUl9GTEFHX0RNSVhfU1RFUkVPICAgICAgICA9IDB4MjAsCisgICAgTEJSX0ZMQUdfRE1JWF9NVUxUSV9DSCAgICAgID0gMHg0MAorfTsKKworZW51bSBMQlJDaHVua1R5cGVzIHsKKyAgICBMQlJfQ0hVTktfTlVMTCAgICAgICAgICAgICAgPSAweDAwLAorICAgIExCUl9DSFVOS19QQUQgICAgICAgICAgICAgICA9IDB4MDEsCisgICAgTEJSX0NIVU5LX0ZSQU1FICAgICAgICAgICAgID0gMHgwNCwKKyAgICBMQlJfQ0hVTktfRlJBTUVfTk9fQ1NVTSAgICAgPSAweDA2LAorICAgIExCUl9DSFVOS19MRkUgICAgICAgICAgICAgICA9IDB4MGEsCisgICAgTEJSX0NIVU5LX0VDUyAgICAgICAgICAgICAgID0gMHgwYiwKKyAgICBMQlJfQ0hVTktfUkVTRVJWRURfMSAgICAgICAgPSAweDBjLAorICAgIExCUl9DSFVOS19SRVNFUlZFRF8yICAgICAgICA9IDB4MGQsCisgICAgTEJSX0NIVU5LX1NDRiAgICAgICAgICAgICAgID0gMHgwZSwKKyAgICBMQlJfQ0hVTktfVE9OQUwgICAgICAgICAgICAgPSAweDEwLAorICAgIExCUl9DSFVOS19UT05BTF9HUlBfMSAgICAgICA9IDB4MTEsCisgICAgTEJSX0NIVU5LX1RPTkFMX0dSUF8yICAgICAgID0gMHgxMiwKKyAgICBMQlJfQ0hVTktfVE9OQUxfR1JQXzMgICAgICAgPSAweDEzLAorICAgIExCUl9DSFVOS19UT05BTF9HUlBfNCAgICAgICA9IDB4MTQsCisgICAgTEJSX0NIVU5LX1RPTkFMX0dSUF81ICAgICAgID0gMHgxNSwKKyAgICBMQlJfQ0hVTktfVE9OQUxfU0NGICAgICAgICAgPSAweDE2LAorICAgIExCUl9DSFVOS19UT05BTF9TQ0ZfR1JQXzEgICA9IDB4MTcsCisgICAgTEJSX0NIVU5LX1RPTkFMX1NDRl9HUlBfMiAgID0gMHgxOCwKKyAgICBMQlJfQ0hVTktfVE9OQUxfU0NGX0dSUF8zICAgPSAweDE5LAorICAgIExCUl9DSFVOS19UT05BTF9TQ0ZfR1JQXzQgICA9IDB4MWEsCisgICAgTEJSX0NIVU5LX1RPTkFMX1NDRl9HUlBfNSAgID0gMHgxYiwKKyAgICBMQlJfQ0hVTktfUkVTX0dSSURfTFIgICAgICAgPSAweDMwLAorICAgIExCUl9DSFVOS19SRVNfR1JJRF9MUl9MQVNUICA9IDB4M2YsCisgICAgTEJSX0NIVU5LX1JFU19HUklEX0hSICAgICAgID0gMHg0MCwKKyAgICBMQlJfQ0hVTktfUkVTX0dSSURfSFJfTEFTVCAgPSAweDRmLAorICAgIExCUl9DSFVOS19SRVNfVFNfMSAgICAgICAgICA9IDB4NTAsCisgICAgTEJSX0NIVU5LX1JFU19UU18xX0xBU1QgICAgID0gMHg1ZiwKKyAgICBMQlJfQ0hVTktfUkVTX1RTXzIgICAgICAgICAgPSAweDYwLAorICAgIExCUl9DSFVOS19SRVNfVFNfMl9MQVNUICAgICA9IDB4NmYsCisgICAgTEJSX0NIVU5LX0VYVEVOU0lPTiAgICAgICAgID0gMHg3ZgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgTEJSQ2h1bmsgeworICAgIGludCBpZCwgbGVuOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7Cit9IExCUkNodW5rOworCitzdGF0aWMgY29uc3QgaW50OF90IGNoYW5uZWxfcmVvcmRlcl9ub2xmZVs3XVs1XSA9IHsKKyAgICB7IDAsIC0xLCAtMSwgLTEsIC0xIH0sICAvLyBDCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSB9LCAgLy8gTFIKKyAgICB7IDAsICAxLCAgMiwgLTEsIC0xIH0sICAvLyBMUiBDCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSB9LCAgLy8gTHNScworICAgIHsgMSwgIDIsICAwLCAtMSwgLTEgfSwgIC8vIExzUnMgQworICAgIHsgMCwgIDEsICAyLCAgMywgLTEgfSwgIC8vIExSIExzUnMKKyAgICB7IDAsICAxLCAgMywgIDQsICAyIH0sICAvLyBMUiBMc1JzIEMKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgY2hhbm5lbF9yZW9yZGVyX2xmZVs3XVs1XSA9IHsKKyAgICB7IDAsIC0xLCAtMSwgLTEsIC0xIH0sICAvLyBDCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSB9LCAgLy8gTFIKKyAgICB7IDAsICAxLCAgMiwgLTEsIC0xIH0sICAvLyBMUiBDCisgICAgeyAxLCAgMiwgLTEsIC0xLCAtMSB9LCAgLy8gTHNScworICAgIHsgMiwgIDMsICAwLCAtMSwgLTEgfSwgIC8vIExzUnMgQworICAgIHsgMCwgIDEsICAzLCAgNCwgLTEgfSwgIC8vIExSIExzUnMKKyAgICB7IDAsICAxLCAgNCwgIDUsICAyIH0sICAvLyBMUiBMc1JzIEMKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxmZV9pbmRleFs3XSA9IHsKKyAgICAxLCAyLCAzLCAwLCAxLCAyLCAzCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjaGFubmVsX2NvdW50c1s3XSA9IHsKKyAgICAxLCAyLCAzLCAyLCAzLCA0LCA1Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgY2hhbm5lbF9sYXlvdXRzWzddID0geworICAgIEFWX0NIX0xBWU9VVF9NT05PLAorICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCisgICAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5ELAorICAgIEFWX0NIX1NJREVfTEVGVCB8IEFWX0NIX1NJREVfUklHSFQsCisgICAgQVZfQ0hfRlJPTlRfQ0VOVEVSIHwgQVZfQ0hfU0lERV9MRUZUIHwgQVZfQ0hfU0lERV9SSUdIVCwKKyAgICBBVl9DSF9MQVlPVVRfMl8yLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwCit9OworCitzdGF0aWMgZmxvYXQgICAgY29zX3RhYlsyNTZdOworc3RhdGljIGZsb2F0ICAgIGxwY190YWJbMTZdOworCitzdGF0aWMgYXZfY29sZCB2b2lkIGluaXRfdGFibGVzKHZvaWQpCit7CisgICAgc3RhdGljIGludCBpbml0aWFsaXplZDsKKyAgICBpbnQgaTsKKworICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBjb3NfdGFiW2ldID0gY29zKE1fUEkgKiBpIC8gMTI4KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICBscGNfdGFiW2ldID0gc2luKChpIC0gOCkgKiAoTV9QSSAvICgoaSA8IDgpID8gMTcgOiAxNSkpKTsKKworICAgIGluaXRpYWxpemVkID0gMTsKK30KKworc3RhdGljIGludCBwYXJzZV9sZmVfMjQoRENBTGJyRGVjb2RlciAqcykKK3sKKyAgICBpbnQgc3RlcF9tYXggPSBGRl9BUlJBWV9FTEVNUyhmZl9kY2FfbGZlX3N0ZXBfc2l6ZV8yNCkgLSAxOworICAgIGludCBpLCBwcywgc2ksIGNvZGUsIHN0ZXBfaTsKKyAgICBmbG9hdCBzdGVwLCB2YWx1ZSwgZGVsdGE7CisKKyAgICBwcyA9IGdldF9iaXRzKCZzLT5nYiwgMjQpOworICAgIHNpID0gcHMgPj4gMjM7CisKKyAgICB2YWx1ZSA9ICgoKHBzICYgMHg3ZmZmZmYpIF4gLXNpKSArIHNpKSAqICgxLjBmIC8gMHg3ZmZmZmYpOworCisgICAgc3RlcF9pID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICBpZiAoc3RlcF9pID4gc3RlcF9tYXgpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIExGRSBzdGVwIHNpemUgaW5kZXhcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgc3RlcCA9IGZmX2RjYV9sZmVfc3RlcF9zaXplXzI0W3N0ZXBfaV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICBjb2RlID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKworICAgICAgICBkZWx0YSA9IHN0ZXAgKiAwLjAzMTI1ZjsKKyAgICAgICAgaWYgKGNvZGUgJiAxNikKKyAgICAgICAgICAgIGRlbHRhICs9IHN0ZXA7CisgICAgICAgIGlmIChjb2RlICYgOCkKKyAgICAgICAgICAgIGRlbHRhICs9IHN0ZXAgKiAwLjVmOworICAgICAgICBpZiAoY29kZSAmIDQpCisgICAgICAgICAgICBkZWx0YSArPSBzdGVwICogMC4yNWY7CisgICAgICAgIGlmIChjb2RlICYgMikKKyAgICAgICAgICAgIGRlbHRhICs9IHN0ZXAgKiAwLjEyNWY7CisgICAgICAgIGlmIChjb2RlICYgMSkKKyAgICAgICAgICAgIGRlbHRhICs9IHN0ZXAgKiAwLjA2MjVmOworCisgICAgICAgIGlmIChjb2RlICYgMzIpIHsKKyAgICAgICAgICAgIHZhbHVlIC09IGRlbHRhOworICAgICAgICAgICAgaWYgKHZhbHVlIDwgLTMuMGYpCisgICAgICAgICAgICAgICAgdmFsdWUgPSAtMy4wZjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbHVlICs9IGRlbHRhOworICAgICAgICAgICAgaWYgKHZhbHVlID4gMy4wZikKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDMuMGY7CisgICAgICAgIH0KKworICAgICAgICBzdGVwX2kgKz0gZmZfZGNhX2xmZV9kZWx0YV9pbmRleF8yNFtjb2RlICYgMzFdOworICAgICAgICBzdGVwX2kgPSBhdl9jbGlwKHN0ZXBfaSwgMCwgc3RlcF9tYXgpOworCisgICAgICAgIHN0ZXAgPSBmZl9kY2FfbGZlX3N0ZXBfc2l6ZV8yNFtzdGVwX2ldOworICAgICAgICBzLT5sZmVfZGF0YVtpXSA9IHZhbHVlICogcy0+bGZlX3NjYWxlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2xmZV8xNihEQ0FMYnJEZWNvZGVyICpzKQoreworICAgIGludCBzdGVwX21heCA9IEZGX0FSUkFZX0VMRU1TKGZmX2RjYV9sZmVfc3RlcF9zaXplXzE2KSAtIDE7CisgICAgaW50IGksIHBzLCBzaSwgY29kZSwgc3RlcF9pOworICAgIGZsb2F0IHN0ZXAsIHZhbHVlLCBkZWx0YTsKKworICAgIHBzID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CisgICAgc2kgPSBwcyA+PiAxNTsKKworICAgIHZhbHVlID0gKCgocHMgJiAweDdmZmYpIF4gLXNpKSArIHNpKSAqICgxLjBmIC8gMHg3ZmZmKTsKKworICAgIHN0ZXBfaSA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgaWYgKHN0ZXBfaSA+IHN0ZXBfbWF4KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBMRkUgc3RlcCBzaXplIGluZGV4XG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN0ZXAgPSBmZl9kY2FfbGZlX3N0ZXBfc2l6ZV8xNltzdGVwX2ldOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgY29kZSA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisKKyAgICAgICAgZGVsdGEgPSBzdGVwICogMC4xMjVmOworICAgICAgICBpZiAoY29kZSAmIDQpCisgICAgICAgICAgICBkZWx0YSArPSBzdGVwOworICAgICAgICBpZiAoY29kZSAmIDIpCisgICAgICAgICAgICBkZWx0YSArPSBzdGVwICogMC41ZjsKKyAgICAgICAgaWYgKGNvZGUgJiAxKQorICAgICAgICAgICAgZGVsdGEgKz0gc3RlcCAqIDAuMjVmOworCisgICAgICAgIGlmIChjb2RlICYgOCkgeworICAgICAgICAgICAgdmFsdWUgLT0gZGVsdGE7CisgICAgICAgICAgICBpZiAodmFsdWUgPCAtMy4wZikKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IC0zLjBmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWUgKz0gZGVsdGE7CisgICAgICAgICAgICBpZiAodmFsdWUgPiAzLjBmKQorICAgICAgICAgICAgICAgIHZhbHVlID0gMy4wZjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZXBfaSArPSBmZl9kY2FfbGZlX2RlbHRhX2luZGV4XzE2W2NvZGUgJiA3XTsKKyAgICAgICAgc3RlcF9pID0gYXZfY2xpcChzdGVwX2ksIDAsIHN0ZXBfbWF4KTsKKworICAgICAgICBzdGVwID0gZmZfZGNhX2xmZV9zdGVwX3NpemVfMTZbc3RlcF9pXTsKKyAgICAgICAgcy0+bGZlX2RhdGFbaV0gPSB2YWx1ZSAqIHMtPmxmZV9zY2FsZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9sZmVfY2h1bmsoRENBTGJyRGVjb2RlciAqcywgTEJSQ2h1bmsgKmNodW5rKQoreworICAgIGlmICghKHMtPmZsYWdzICYgTEJSX0ZMQUdfTEZFX1BSRVNFTlQpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmICghY2h1bmstPmxlbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoaW5pdF9nZXRfYml0czgoJnMtPmdiLCBjaHVuay0+ZGF0YSwgY2h1bmstPmxlbikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBEZXRlcm1pbmUgYml0IGRlcHRoIGZyb20gY2h1bmsgc2l6ZQorICAgIGlmIChjaHVuay0+bGVuID49IDUyKQorICAgICAgICByZXR1cm4gcGFyc2VfbGZlXzI0KHMpOworICAgIGlmIChjaHVuay0+bGVuID49IDM1KQorICAgICAgICByZXR1cm4gcGFyc2VfbGZlXzE2KHMpOworCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJMRkUgY2h1bmsgdG9vIHNob3J0XG4iKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBhcnNlX3ZsYyhHZXRCaXRDb250ZXh0ICpzLCBWTEMgKnZsYywgaW50IG1heF9kZXB0aCkKK3sKKyAgICBpbnQgdiA9IGdldF92bGMyKHMsIHZsYy0+dGFibGUsIHZsYy0+Yml0cywgbWF4X2RlcHRoKTsKKyAgICBpZiAodiA+IDApCisgICAgICAgIHJldHVybiB2IC0gMTsKKyAgICAvLyBSYXJlIHZhbHVlCisgICAgcmV0dXJuIGdldF9iaXRzKHMsIGdldF9iaXRzKHMsIDMpICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdG9uYWwoRENBTGJyRGVjb2RlciAqcywgaW50IGdyb3VwKQoreworICAgIHVuc2lnbmVkIGludCBhbXBbRENBX0xCUl9DSEFOTkVMU19UT1RBTF07CisgICAgdW5zaWduZWQgaW50IHBoc1tEQ0FfTEJSX0NIQU5ORUxTX1RPVEFMXTsKKyAgICB1bnNpZ25lZCBpbnQgZGlmZiwgbWFpbl9hbXAsIHNoaWZ0OworICAgIGludCBzZiwgc2ZfaWR4LCBjaCwgbWFpbl9jaCwgZnJlcTsKKyAgICBpbnQgY2hfbmJpdHMgPSBhdl9jZWlsX2xvZzIocy0+bmNoYW5uZWxzX3RvdGFsKTsKKworICAgIC8vIFBhcnNlIHN1YmZyYW1lcyBmb3IgdGhpcyBncm91cAorICAgIGZvciAoc2YgPSAwOyBzZiA8IDEgPDwgZ3JvdXA7IHNmICs9IGRpZmYgPyA4IDogMSkgeworICAgICAgICBzZl9pZHggPSAoKHMtPmZyYW1lbnVtIDw8IGdyb3VwKSArIHNmKSAmIDMxOworICAgICAgICBzLT50b25hbF9ib3VuZHNbZ3JvdXBdW3NmX2lkeF1bMF0gPSBzLT5udG9uZXM7CisKKyAgICAgICAgLy8gUGFyc2UgdG9uZXMgZm9yIHRoaXMgc3ViZnJhbWUKKyAgICAgICAgZm9yIChmcmVxID0gMTs7IGZyZXErKykgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbmFsIGdyb3VwIGNodW5rIHRvbyBzaG9ydFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkaWZmID0gcGFyc2VfdmxjKCZzLT5nYiwgJmZmX2RjYV92bGNfdG5sX2dycFtncm91cF0sIDIpOworICAgICAgICAgICAgaWYgKGRpZmYgPj0gRkZfQVJSQVlfRUxFTVMoZmZfZGNhX2ZzdF9hbXApKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHRvbmFsIGZyZXF1ZW5jeSBkaWZmXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRpZmYgPSBnZXRfYml0c3ooJnMtPmdiLCBkaWZmID4+IDIpICsgZmZfZGNhX2ZzdF9hbXBbZGlmZl07CisgICAgICAgICAgICBpZiAoZGlmZiA8PSAxKQorICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gRW5kIG9mIHN1YmZyYW1lCisKKyAgICAgICAgICAgIGZyZXEgKz0gZGlmZiAtIDI7CisgICAgICAgICAgICBpZiAoZnJlcSA+PiAoNSAtIGdyb3VwKSA+IHMtPm5zdWJiYW5kcyAqIDQgLSA2KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNwZWN0cmFsIGxpbmUgb2Zmc2V0XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1haW4gY2hhbm5lbAorICAgICAgICAgICAgbWFpbl9jaCA9IGdldF9iaXRzeigmcy0+Z2IsIGNoX25iaXRzKTsKKyAgICAgICAgICAgIG1haW5fYW1wID0gcGFyc2VfdmxjKCZzLT5nYiwgJmZmX2RjYV92bGNfdG5sX3NjZiwgMikKKyAgICAgICAgICAgICAgICArIHMtPnRvbmFsX3NjZltmZl9kY2FfZnJlcV90b19zYltmcmVxID4+ICg3IC0gZ3JvdXApXV0KKyAgICAgICAgICAgICAgICArIHMtPmxpbWl0ZWRfcmFuZ2UgLSAyOworICAgICAgICAgICAgYW1wW21haW5fY2hdID0gbWFpbl9hbXAgPCBBTVBfTUFYID8gbWFpbl9hbXAgOiAwOworICAgICAgICAgICAgcGhzW21haW5fY2hdID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKworICAgICAgICAgICAgLy8gU2Vjb25kYXJ5IGNoYW5uZWxzCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uY2hhbm5lbHNfdG90YWw7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gbWFpbl9jaCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgICAgICAgICAgICAgIGFtcFtjaF0gPSBhbXBbbWFpbl9jaF0gLSBwYXJzZV92bGMoJnMtPmdiLCAmZmZfZGNhX3ZsY19kYW1wLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgcGhzW2NoXSA9IHBoc1ttYWluX2NoXSAtIHBhcnNlX3ZsYygmcy0+Z2IsICZmZl9kY2FfdmxjX2RwaCwgIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFtcFtjaF0gPSAwOworICAgICAgICAgICAgICAgICAgICBwaHNbY2hdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhbXBbbWFpbl9jaF0pIHsKKyAgICAgICAgICAgICAgICAvLyBBbGxvY2F0ZSBuZXcgdG9uZQorICAgICAgICAgICAgICAgIERDQUxiclRvbmUgKnQgPSAmcy0+dG9uZXNbcy0+bnRvbmVzXTsKKyAgICAgICAgICAgICAgICBzLT5udG9uZXMgPSAocy0+bnRvbmVzICsgMSkgJiAoRENBX0xCUl9UT05FUyAtIDEpOworCisgICAgICAgICAgICAgICAgdC0+eF9mcmVxID0gZnJlcSA+PiAoNSAtIGdyb3VwKTsKKyAgICAgICAgICAgICAgICB0LT5mX2RlbHQgPSAoZnJlcSAmICgoMSA8PCAoNSAtIGdyb3VwKSkgLSAxKSkgPDwgZ3JvdXA7CisgICAgICAgICAgICAgICAgdC0+cGhfcm90ID0gMjU2IC0gKHQtPnhfZnJlcSAmIDEpICogMTI4IC0gdC0+Zl9kZWx0ICogNDsKKworICAgICAgICAgICAgICAgIHNoaWZ0ID0gZmZfZGNhX3BoMF9zaGlmdFsodC0+eF9mcmVxICYgMykgKiAyICsgKGZyZXEgJiAxKV0KKyAgICAgICAgICAgICAgICAgICAgLSAoKHQtPnBoX3JvdCA8PCAoNSAtIGdyb3VwKSkgLSB0LT5waF9yb3QpOworCisgICAgICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHQtPmFtcFtjaF0gPSBhbXBbY2hdIDwgQU1QX01BWCA/IGFtcFtjaF0gOiAwOworICAgICAgICAgICAgICAgICAgICB0LT5waHNbY2hdID0gMTI4IC0gcGhzW2NoXSAqIDMyICsgc2hpZnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+dG9uYWxfYm91bmRzW2dyb3VwXVtzZl9pZHhdWzFdID0gcy0+bnRvbmVzOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3RvbmFsX2NodW5rKERDQUxickRlY29kZXIgKnMsIExCUkNodW5rICpjaHVuaykKK3sKKyAgICBpbnQgc2IsIGdyb3VwOworCisgICAgaWYgKCFjaHVuay0+bGVuKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChpbml0X2dldF9iaXRzOCgmcy0+Z2IsIGNodW5rLT5kYXRhLCBjaHVuay0+bGVuKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIFNjYWxlIGZhY3RvcnMKKyAgICBpZiAoY2h1bmstPmlkID09IExCUl9DSFVOS19TQ0YgfHwgY2h1bmstPmlkID09IExCUl9DSFVOS19UT05BTF9TQ0YpIHsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDM2KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbmFsIHNjYWxlIGZhY3RvciBjaHVuayB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDY7IHNiKyspCisgICAgICAgICAgICBzLT50b25hbF9zY2Zbc2JdID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKyAgICB9CisKKyAgICAvLyBUb25hbCBncm91cHMKKyAgICBpZiAoY2h1bmstPmlkID09IExCUl9DSFVOS19UT05BTCB8fCBjaHVuay0+aWQgPT0gTEJSX0NIVU5LX1RPTkFMX1NDRikKKyAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgNTsgZ3JvdXArKykKKyAgICAgICAgICAgIGlmIChwYXJzZV90b25hbChzLCBncm91cCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3RvbmFsX2dyb3VwKERDQUxickRlY29kZXIgKnMsIExCUkNodW5rICpjaHVuaykKK3sKKyAgICBpZiAoIWNodW5rLT5sZW4pCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGluaXRfZ2V0X2JpdHM4KCZzLT5nYiwgY2h1bmstPmRhdGEsIGNodW5rLT5sZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIHBhcnNlX3RvbmFsKHMsIGNodW5rLT5pZCk7Cit9CisKKy8qKgorICogQ2hlY2sgcG9pbnQgdG8gZW5zdXJlIHRoYXQgZW5vdWdoIGJpdHMgYXJlIGxlZnQuIEFib3J0cyBkZWNvZGluZworICogYnkgc2tpcHBpbmcgdG8gdGhlIGVuZCBvZiBjaHVuayBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZW5zdXJlX2JpdHMoR2V0Qml0Q29udGV4dCAqcywgaW50IG4pCit7CisgICAgaW50IGxlZnQgPSBnZXRfYml0c19sZWZ0KHMpOworICAgIGlmIChsZWZ0IDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChsZWZ0IDwgbikgeworICAgICAgICBza2lwX2JpdHNfbG9uZyhzLCBsZWZ0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX3NjYWxlX2ZhY3RvcnMoRENBTGJyRGVjb2RlciAqcywgdWludDhfdCAqc2NmKQoreworICAgIGludCBpLCBzZiwgcHJldiwgbmV4dCwgZGlzdDsKKworICAgIC8vIFRydW5jYXRlZCBzY2FsZSBmYWN0b3JzIHJlbWFpbiB6ZXJvCisgICAgaWYgKGVuc3VyZV9iaXRzKCZzLT5nYiwgMjApKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIEluaXRpYWwgc2NhbGUgZmFjdG9yCisgICAgcHJldiA9IHBhcnNlX3ZsYygmcy0+Z2IsICZmZl9kY2FfdmxjX2ZzdF9yc2RfYW1wLCAyKTsKKworICAgIGZvciAoc2YgPSAwOyBzZiA8IDc7IHNmICs9IGRpc3QpIHsKKyAgICAgICAgc2NmW3NmXSA9IHByZXY7IC8vIFN0b3JlIHByZXZpb3VzIHZhbHVlCisKKyAgICAgICAgaWYgKGVuc3VyZV9iaXRzKCZzLT5nYiwgMjApKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLy8gSW50ZXJwb2xhdGlvbiBkaXN0YW5jZQorICAgICAgICBkaXN0ID0gcGFyc2VfdmxjKCZzLT5nYiwgJmZmX2RjYV92bGNfcnNkX2FwcHJ4LCAxKSArIDE7CisgICAgICAgIGlmIChkaXN0ID4gNyAtIHNmKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2NhbGUgZmFjdG9yIGRpc3RhbmNlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbnN1cmVfYml0cygmcy0+Z2IsIDIwKSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIC8vIEZpbmFsIGludGVycG9sYXRpb24gcG9pbnQKKyAgICAgICAgbmV4dCA9IHBhcnNlX3ZsYygmcy0+Z2IsICZmZl9kY2FfdmxjX3JzZF9hbXAsIDIpOworCisgICAgICAgIGlmIChuZXh0ICYgMSkKKyAgICAgICAgICAgIG5leHQgPSBwcmV2ICsgKChuZXh0ICsgMSkgPj4gMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG5leHQgPSBwcmV2IC0gKCBuZXh0ICAgICAgPj4gMSk7CisKKyAgICAgICAgLy8gSW50ZXJwb2xhdGUKKyAgICAgICAgc3dpdGNoIChkaXN0KSB7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChuZXh0ID4gcHJldikKKyAgICAgICAgICAgICAgICBzY2Zbc2YgKyAxXSA9IHByZXYgKyAoKG5leHQgLSBwcmV2KSA+PiAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzY2Zbc2YgKyAxXSA9IHByZXYgLSAoKHByZXYgLSBuZXh0KSA+PiAxKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIGlmIChuZXh0ID4gcHJldikgeworICAgICAgICAgICAgICAgIHNjZltzZiArIDFdID0gcHJldiArICggKG5leHQgLSBwcmV2KSAgICAgID4+IDIpOworICAgICAgICAgICAgICAgIHNjZltzZiArIDJdID0gcHJldiArICggKG5leHQgLSBwcmV2KSAgICAgID4+IDEpOworICAgICAgICAgICAgICAgIHNjZltzZiArIDNdID0gcHJldiArICgoKG5leHQgLSBwcmV2KSAqIDMpID4+IDIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzY2Zbc2YgKyAxXSA9IHByZXYgLSAoIChwcmV2IC0gbmV4dCkgICAgICA+PiAyKTsKKyAgICAgICAgICAgICAgICBzY2Zbc2YgKyAyXSA9IHByZXYgLSAoIChwcmV2IC0gbmV4dCkgICAgICA+PiAxKTsKKyAgICAgICAgICAgICAgICBzY2Zbc2YgKyAzXSA9IHByZXYgLSAoKChwcmV2IC0gbmV4dCkgKiAzKSA+PiAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZGlzdDsgaSsrKQorICAgICAgICAgICAgICAgIHNjZltzZiArIGldID0gcHJldiArIChuZXh0IC0gcHJldikgKiBpIC8gZGlzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgfQorCisgICAgc2NmW3NmXSA9IG5leHQ7IC8vIFN0b3JlIGZpbmFsIHZhbHVlCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9zdF9jb2RlKEdldEJpdENvbnRleHQgKnMsIGludCBtaW5fdikKK3sKKyAgICB1bnNpZ25lZCBpbnQgdiA9IHBhcnNlX3ZsYyhzLCAmZmZfZGNhX3ZsY19zdF9ncmlkLCAyKSArIG1pbl92OworCisgICAgaWYgKHYgJiAxKQorICAgICAgICB2ID0gMTYgKyAodiA+PiAxKTsKKyAgICBlbHNlCisgICAgICAgIHYgPSAxNiAtICh2ID4+IDEpOworCisgICAgaWYgKHYgPj0gRkZfQVJSQVlfRUxFTVMoZmZfZGNhX3N0X2NvZWZmKSkKKyAgICAgICAgdiA9IDE2OworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW50IHBhcnNlX2dyaWRfMV9jaHVuayhEQ0FMYnJEZWNvZGVyICpzLCBMQlJDaHVuayAqY2h1bmssIGludCBjaDEsIGludCBjaDIpCit7CisgICAgaW50IGNoLCBzYiwgc2YsIG5zdWJiYW5kczsKKworICAgIGlmICghY2h1bmstPmxlbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoaW5pdF9nZXRfYml0czgoJnMtPmdiLCBjaHVuay0+ZGF0YSwgY2h1bmstPmxlbikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBTY2FsZSBmYWN0b3JzCisgICAgbnN1YmJhbmRzID0gZmZfZGNhX3NjZl90b19ncmlkXzFbcy0+bnN1YmJhbmRzIC0gMV0gKyAxOworICAgIGZvciAoc2IgPSAyOyBzYiA8IG5zdWJiYW5kczsgc2IrKykgeworICAgICAgICBpZiAocGFyc2Vfc2NhbGVfZmFjdG9ycyhzLCBzLT5ncmlkXzFfc2NmW2NoMV1bc2JdKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGlmIChjaDEgIT0gY2gyICYmIGZmX2RjYV9ncmlkXzFfdG9fc2NmW3NiXSA8IHMtPm1pbl9tb25vX3N1YmJhbmQKKyAgICAgICAgICAgICYmIHBhcnNlX3NjYWxlX2ZhY3RvcnMocywgcy0+Z3JpZF8xX3NjZltjaDJdW3NiXSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAxKQorICAgICAgICByZXR1cm4gMDsgICAvLyBTaG91bGQgbm90IGhhcHBlbiwgYnV0IGEgc2FtcGxlIGV4aXN0cyB0aGF0IHByb3ZlcyBvdGhlcndpc2UKKworICAgIC8vIEF2ZXJhZ2UgdmFsdWVzIGZvciB0aGlyZCBncmlkCisgICAgZm9yIChzYiA9IDA7IHNiIDwgcy0+bnN1YmJhbmRzIC0gNDsgc2IrKykgeworICAgICAgICBzLT5ncmlkXzNfYXZnW2NoMV1bc2JdID0gcGFyc2VfdmxjKCZzLT5nYiwgJmZmX2RjYV92bGNfYXZnX2czLCAyKSAtIDE2OworICAgICAgICBpZiAoY2gxICE9IGNoMikgeworICAgICAgICAgICAgaWYgKHNiICsgNCA8IHMtPm1pbl9tb25vX3N1YmJhbmQpCisgICAgICAgICAgICAgICAgcy0+Z3JpZF8zX2F2Z1tjaDJdW3NiXSA9IHBhcnNlX3ZsYygmcy0+Z2IsICZmZl9kY2FfdmxjX2F2Z19nMywgMikgLSAxNjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzLT5ncmlkXzNfYXZnW2NoMl1bc2JdID0gcy0+Z3JpZF8zX2F2Z1tjaDFdW3NiXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmlyc3QgZ3JpZCBjaHVuayB0b28gc2hvcnRcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gU3RlcmVvIGltYWdlIGZvciBwYXJ0aWFsIG1vbm8gbW9kZQorICAgIGlmIChjaDEgIT0gY2gyKSB7CisgICAgICAgIGludCBtaW5fdlsyXTsKKworICAgICAgICBpZiAoZW5zdXJlX2JpdHMoJnMtPmdiLCA4KSkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIG1pbl92WzBdID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICAgICAgbWluX3ZbMV0gPSBnZXRfYml0cygmcy0+Z2IsIDQpOworCisgICAgICAgIG5zdWJiYW5kcyA9IChzLT5uc3ViYmFuZHMgLSBzLT5taW5fbW9ub19zdWJiYW5kICsgMykgLyA0OworICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBuc3ViYmFuZHM7IHNiKyspCisgICAgICAgICAgICBmb3IgKGNoID0gY2gxOyBjaCA8PSBjaDI7IGNoKyspCisgICAgICAgICAgICAgICAgZm9yIChzZiA9IDE7IHNmIDw9IDQ7IHNmKyspCisgICAgICAgICAgICAgICAgICAgIHMtPnBhcnRfc3RlcmVvW2NoXVtzYl1bc2ZdID0gcGFyc2Vfc3RfY29kZSgmcy0+Z2IsIG1pbl92W2NoIC0gY2gxXSk7CisKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA+PSAwKQorICAgICAgICAgICAgcy0+cGFydF9zdGVyZW9fcHJlcyB8PSAxIDw8IGNoMTsKKyAgICB9CisKKyAgICAvLyBMb3cgcmVzb2x1dGlvbiBzcGF0aWFsIGluZm9ybWF0aW9uIGlzIG5vdCBkZWNvZGVkCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9ncmlkXzFfc2VjX2NoKERDQUxickRlY29kZXIgKnMsIGludCBjaDIpCit7CisgICAgaW50IHNiLCBuc3ViYmFuZHM7CisKKyAgICAvLyBTY2FsZSBmYWN0b3JzCisgICAgbnN1YmJhbmRzID0gZmZfZGNhX3NjZl90b19ncmlkXzFbcy0+bnN1YmJhbmRzIC0gMV0gKyAxOworICAgIGZvciAoc2IgPSAyOyBzYiA8IG5zdWJiYW5kczsgc2IrKykgeworICAgICAgICBpZiAoZmZfZGNhX2dyaWRfMV90b19zY2Zbc2JdID49IHMtPm1pbl9tb25vX3N1YmJhbmQKKyAgICAgICAgICAgICYmIHBhcnNlX3NjYWxlX2ZhY3RvcnMocywgcy0+Z3JpZF8xX3NjZltjaDJdW3NiXSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIEF2ZXJhZ2UgdmFsdWVzIGZvciB0aGlyZCBncmlkCisgICAgZm9yIChzYiA9IDA7IHNiIDwgcy0+bnN1YmJhbmRzIC0gNDsgc2IrKykgeworICAgICAgICBpZiAoc2IgKyA0ID49IHMtPm1pbl9tb25vX3N1YmJhbmQpIHsKKyAgICAgICAgICAgIGlmIChlbnN1cmVfYml0cygmcy0+Z2IsIDIwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHMtPmdyaWRfM19hdmdbY2gyXVtzYl0gPSBwYXJzZV92bGMoJnMtPmdiLCAmZmZfZGNhX3ZsY19hdmdfZzMsIDIpIC0gMTY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfZ3JpZF8zKERDQUxickRlY29kZXIgKnMsIGludCBjaDEsIGludCBjaDIsIGludCBzYiwgaW50IGZsYWcpCit7CisgICAgaW50IGksIGNoOworCisgICAgZm9yIChjaCA9IGNoMTsgY2ggPD0gY2gyOyBjaCsrKSB7CisgICAgICAgIGlmICgoY2ggIT0gY2gxICYmIHNiICsgNCA+PSBzLT5taW5fbW9ub19zdWJiYW5kKSAhPSBmbGFnKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHMtPmdyaWRfM19wcmVzW2NoXSAmICgxVSA8PCBzYikpCisgICAgICAgICAgICBjb250aW51ZTsgICAvLyBBbHJlYWR5IHBhcnNlZAorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChlbnN1cmVfYml0cygmcy0+Z2IsIDIwKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzLT5ncmlkXzNfc2NmW2NoXVtzYl1baV0gPSBwYXJzZV92bGMoJnMtPmdiLCAmZmZfZGNhX3ZsY19ncmlkXzMsIDIpIC0gMTY7CisgICAgICAgIH0KKworICAgICAgICAvLyBGbGFnIHNjYWxlIGZhY3RvcnMgZm9yIHRoaXMgc3ViYmFuZCBwYXJzZWQKKyAgICAgICAgcy0+Z3JpZF8zX3ByZXNbY2hdIHw9IDFVIDw8IHNiOworICAgIH0KK30KKworc3RhdGljIGZsb2F0IGxicl9yYW5kKERDQUxickRlY29kZXIgKnMsIGludCBzYikKK3sKKyAgICBzLT5sYnJfcmFuZCA9IDExMDM1MTUyNDVVICogcy0+bGJyX3JhbmQgKyAxMjM0NVU7CisgICAgcmV0dXJuIHMtPmxicl9yYW5kICogcy0+c2Jfc2NmW3NiXTsKK30KKworLyoqCisgKiBQYXJzZSB0aW1lIHNhbXBsZXMgZm9yIG9uZSBzdWJiYW5kLCBmaWxsaW5nIHRydW5jYXRlZCBzYW1wbGVzIHdpdGggcmFuZG9tbmVzcworICovCitzdGF0aWMgdm9pZCBwYXJzZV9jaChEQ0FMYnJEZWNvZGVyICpzLCBpbnQgY2gsIGludCBzYiwgaW50IHF1YW50X2xldmVsLCBpbnQgZmxhZykKK3sKKyAgICBmbG9hdCAqc2FtcGxlcyA9IHMtPnRpbWVfc2FtcGxlc1tjaF1bc2JdOworICAgIGludCBpLCBqLCBjb2RlLCBuYmxvY2tzLCBjb2RpbmdfbWV0aG9kOworCisgICAgaWYgKGVuc3VyZV9iaXRzKCZzLT5nYiwgMjApKQorICAgICAgICByZXR1cm47IC8vIFRvbyBmZXcgYml0cyBsZWZ0CisKKyAgICBjb2RpbmdfbWV0aG9kID0gZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICBzd2l0Y2ggKHF1YW50X2xldmVsKSB7CisgICAgY2FzZSAxOgorICAgICAgICBuYmxvY2tzID0gRkZNSU4oZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIC8gOCwgRENBX0xCUl9USU1FX1NBTVBMRVMgLyA4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5ibG9ja3M7IGkrKywgc2FtcGxlcyArPSA4KSB7CisgICAgICAgICAgICBjb2RlID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgc2FtcGxlc1tqXSA9IGZmX2RjYV9yc2RfbGV2ZWxfMmFbKGNvZGUgPj4gaikgJiAxXTsKKyAgICAgICAgfQorICAgICAgICBpID0gbmJsb2NrcyAqIDg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAyOgorICAgICAgICBpZiAoY29kaW5nX21ldGhvZCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IERDQV9MQlJfVElNRV9TQU1QTEVTICYmIGdldF9iaXRzX2xlZnQoJnMtPmdiKSA+PSAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBmZl9kY2FfcnNkX2xldmVsXzJiW2dldF9iaXRzMSgmcy0+Z2IpXTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmJsb2NrcyA9IEZGTUlOKGdldF9iaXRzX2xlZnQoJnMtPmdiKSAvIDgsIChEQ0FfTEJSX1RJTUVfU0FNUExFUyArIDQpIC8gNSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJsb2NrczsgaSsrLCBzYW1wbGVzICs9IDUpIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gZmZfZGNhX3JzZF9wYWNrXzVfaW5fOFtnZXRfYml0cygmcy0+Z2IsIDgpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgICAgICAgICBzYW1wbGVzW2pdID0gZmZfZGNhX3JzZF9sZXZlbF8zWyhjb2RlID4+IGogKiAyKSAmIDNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSA9IG5ibG9ja3MgKiA1OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgICAgICBuYmxvY2tzID0gRkZNSU4oZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIC8gNywgKERDQV9MQlJfVElNRV9TQU1QTEVTICsgMikgLyAzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5ibG9ja3M7IGkrKywgc2FtcGxlcyArPSAzKSB7CisgICAgICAgICAgICBjb2RlID0gZ2V0X2JpdHMoJnMtPmdiLCA3KTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspCisgICAgICAgICAgICAgICAgc2FtcGxlc1tqXSA9IGZmX2RjYV9yc2RfbGV2ZWxfNVtmZl9kY2FfcnNkX3BhY2tfM19pbl83W2NvZGVdW2pdXTsKKyAgICAgICAgfQorICAgICAgICBpID0gbmJsb2NrcyAqIDM7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA0OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRENBX0xCUl9USU1FX1NBTVBMRVMgJiYgZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID49IDY7IGkrKykKKyAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBmZl9kY2FfcnNkX2xldmVsXzhbZ2V0X3ZsYzIoJnMtPmdiLCBmZl9kY2FfdmxjX3JzZC50YWJsZSwgNiwgMSldOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgNToKKyAgICAgICAgbmJsb2NrcyA9IEZGTUlOKGdldF9iaXRzX2xlZnQoJnMtPmdiKSAvIDQsIERDQV9MQlJfVElNRV9TQU1QTEVTKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5ibG9ja3M7IGkrKykKKyAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBmZl9kY2FfcnNkX2xldmVsXzE2W2dldF9iaXRzKCZzLT5nYiwgNCldOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgaWYgKGZsYWcgJiYgZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMjApCisgICAgICAgIHJldHVybjsgLy8gU2tpcCBpbmNvbXBsZXRlIG1vbm8gc3ViYmFuZAorCisgICAgZm9yICg7IGkgPCBEQ0FfTEJSX1RJTUVfU0FNUExFUzsgaSsrKQorICAgICAgICBzLT50aW1lX3NhbXBsZXNbY2hdW3NiXVtpXSA9IGxicl9yYW5kKHMsIHNiKTsKKworICAgIHMtPmNoX3ByZXNbY2hdIHw9IDFVIDw8IHNiOworfQorCitzdGF0aWMgaW50IHBhcnNlX3RzKERDQUxickRlY29kZXIgKnMsIGludCBjaDEsIGludCBjaDIsCisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9zYiwgaW50IGVuZF9zYiwgaW50IGZsYWcpCit7CisgICAgaW50IHNiLCBzYl9nMywgc2JfcmVvcmRlciwgcXVhbnRfbGV2ZWw7CisKKyAgICBmb3IgKHNiID0gc3RhcnRfc2I7IHNiIDwgZW5kX3NiOyBzYisrKSB7CisgICAgICAgIC8vIFN1YmJhbmQgbnVtYmVyIGJlZm9yZSByZW9yZGVyaW5nCisgICAgICAgIGlmIChzYiA8IDYpIHsKKyAgICAgICAgICAgIHNiX3Jlb3JkZXIgPSBzYjsKKyAgICAgICAgfSBlbHNlIGlmIChmbGFnICYmIHNiIDwgcy0+bWF4X21vbm9fc3ViYmFuZCkgeworICAgICAgICAgICAgc2JfcmVvcmRlciA9IHMtPnNiX2luZGljZXNbc2JdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGVuc3VyZV9iaXRzKCZzLT5nYiwgMjgpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc2JfcmVvcmRlciA9IGdldF9iaXRzKCZzLT5nYiwgcy0+bGltaXRlZF9yYW5nZSArIDMpOworICAgICAgICAgICAgaWYgKHNiX3Jlb3JkZXIgPCA2KQorICAgICAgICAgICAgICAgIHNiX3Jlb3JkZXIgPSA2OworICAgICAgICAgICAgcy0+c2JfaW5kaWNlc1tzYl0gPSBzYl9yZW9yZGVyOworICAgICAgICB9CisgICAgICAgIGlmIChzYl9yZW9yZGVyID49IHMtPm5zdWJiYW5kcykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvLyBUaGlyZCBncmlkIHNjYWxlIGZhY3RvcnMKKyAgICAgICAgaWYgKHNiID09IDEyKSB7CisgICAgICAgICAgICBmb3IgKHNiX2czID0gMDsgc2JfZzMgPCBzLT5nM19hdmdfb25seV9zdGFydF9zYiAtIDQ7IHNiX2czKyspCisgICAgICAgICAgICAgICAgcGFyc2VfZ3JpZF8zKHMsIGNoMSwgY2gyLCBzYl9nMywgZmxhZyk7CisgICAgICAgIH0gZWxzZSBpZiAoc2IgPCAxMiAmJiBzYl9yZW9yZGVyID49IDQpIHsKKyAgICAgICAgICAgIHBhcnNlX2dyaWRfMyhzLCBjaDEsIGNoMiwgc2JfcmVvcmRlciAtIDQsIGZsYWcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2Vjb25kYXJ5IGNoYW5uZWwgZmxhZ3MKKyAgICAgICAgaWYgKGNoMSAhPSBjaDIpIHsKKyAgICAgICAgICAgIGlmIChlbnN1cmVfYml0cygmcy0+Z2IsIDIwKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghZmxhZyB8fCBzYl9yZW9yZGVyID49IHMtPm1heF9tb25vX3N1YmJhbmQpCisgICAgICAgICAgICAgICAgcy0+c2VjX2NoX3NibXNbY2gxIC8gMl1bc2JfcmVvcmRlcl0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgaWYgKGZsYWcgJiYgc2JfcmVvcmRlciA+PSBzLT5taW5fbW9ub19zdWJiYW5kKQorICAgICAgICAgICAgICAgIHMtPnNlY19jaF9scm1zW2NoMSAvIDJdW3NiX3Jlb3JkZXJdID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIHF1YW50X2xldmVsID0gcy0+cXVhbnRfbGV2ZWxzW2NoMSAvIDJdW3NiXTsKKyAgICAgICAgaWYgKCFxdWFudF9sZXZlbCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAvLyBUaW1lIHNhbXBsZXMgZm9yIG9uZSBvciBib3RoIGNoYW5uZWxzCisgICAgICAgIGlmIChzYiA8IHMtPm1heF9tb25vX3N1YmJhbmQgJiYgc2JfcmVvcmRlciA+PSBzLT5taW5fbW9ub19zdWJiYW5kKSB7CisgICAgICAgICAgICBpZiAoIWZsYWcpCisgICAgICAgICAgICAgICAgcGFyc2VfY2gocywgY2gxLCBzYl9yZW9yZGVyLCBxdWFudF9sZXZlbCwgMCk7CisgICAgICAgICAgICBlbHNlIGlmIChjaDEgIT0gY2gyKQorICAgICAgICAgICAgICAgIHBhcnNlX2NoKHMsIGNoMiwgc2JfcmVvcmRlciwgcXVhbnRfbGV2ZWwsIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyc2VfY2gocywgY2gxLCBzYl9yZW9yZGVyLCBxdWFudF9sZXZlbCwgMCk7CisgICAgICAgICAgICBpZiAoY2gxICE9IGNoMikKKyAgICAgICAgICAgICAgICBwYXJzZV9jaChzLCBjaDIsIHNiX3Jlb3JkZXIsIHF1YW50X2xldmVsLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIENvbnZlcnQgZnJvbSByZWZsZWN0aW9uIGNvZWZmaWNpZW50cyB0byBkaXJlY3QgZm9ybSBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIHZvaWQgY29udmVydF9scGMoZmxvYXQgKmNvZWZmLCBjb25zdCBpbnQgKmNvZGVzKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmbG9hdCByYyA9IGxwY190YWJbY29kZXNbaV1dOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgKGkgKyAxKSAvIDI7IGorKykgeworICAgICAgICAgICAgZmxvYXQgdG1wMSA9IGNvZWZmWyAgICBqICAgIF07CisgICAgICAgICAgICBmbG9hdCB0bXAyID0gY29lZmZbaSAtIGogLSAxXTsKKyAgICAgICAgICAgIGNvZWZmWyAgICBqICAgIF0gPSB0bXAxICsgcmMgKiB0bXAyOworICAgICAgICAgICAgY29lZmZbaSAtIGogLSAxXSA9IHRtcDIgKyByYyAqIHRtcDE7CisgICAgICAgIH0KKyAgICAgICAgY29lZmZbaV0gPSByYzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbHBjKERDQUxickRlY29kZXIgKnMsIGludCBjaDEsIGludCBjaDIsIGludCBzdGFydF9zYiwgaW50IGVuZF9zYikKK3sKKyAgICBpbnQgZiA9IHMtPmZyYW1lbnVtICYgMTsKKyAgICBpbnQgaSwgc2IsIGNoLCBjb2Rlc1sxNl07CisKKyAgICAvLyBGaXJzdCB0d28gc3ViYmFuZHMgaGF2ZSB0d28gc2V0cyBvZiBjb2VmZmljaWVudHMsIHRoaXJkIHN1YmJhbmQgaGFzIG9uZQorICAgIGZvciAoc2IgPSBzdGFydF9zYjsgc2IgPCBlbmRfc2I7IHNiKyspIHsKKyAgICAgICAgaW50IG5jb2RlcyA9IDggKiAoMSArIChzYiA8IDIpKTsKKyAgICAgICAgZm9yIChjaCA9IGNoMTsgY2ggPD0gY2gyOyBjaCsrKSB7CisgICAgICAgICAgICBpZiAoZW5zdXJlX2JpdHMoJnMtPmdiLCA0ICogbmNvZGVzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuY29kZXM7IGkrKykKKyAgICAgICAgICAgICAgICBjb2Rlc1tpXSA9IGdldF9iaXRzKCZzLT5nYiwgNCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmNvZGVzIC8gODsgaSsrKQorICAgICAgICAgICAgICAgIGNvbnZlcnRfbHBjKHMtPmxwY19jb2VmZltmXVtjaF1bc2JdW2ldLCAmY29kZXNbaSAqIDhdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2hpZ2hfcmVzX2dyaWQoRENBTGJyRGVjb2RlciAqcywgTEJSQ2h1bmsgKmNodW5rLCBpbnQgY2gxLCBpbnQgY2gyKQoreworICAgIGludCBxdWFudF9sZXZlbHNbRENBX0xCUl9TVUJCQU5EU107CisgICAgaW50IHNiLCBjaCwgb2wsIHN0LCBtYXhfc2IsIHByb2ZpbGU7CisKKyAgICBpZiAoIWNodW5rLT5sZW4pCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGluaXRfZ2V0X2JpdHM4KCZzLT5nYiwgY2h1bmstPmRhdGEsIGNodW5rLT5sZW4pIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLy8gUXVhbnRpemVyIHByb2ZpbGUKKyAgICBwcm9maWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAvLyBPdmVyYWxsIGxldmVsCisgICAgb2wgPSAocHJvZmlsZSA+PiAzKSAmIDc7CisgICAgLy8gU3RlZXBuZXNzCisgICAgc3QgPSBwcm9maWxlID4+IDY7CisgICAgLy8gTWF4IGVuZXJneSBzdWJiYW5kCisgICAgbWF4X3NiID0gcHJvZmlsZSAmIDc7CisKKyAgICAvLyBDYWxjdWxhdGUgcXVhbnRpemF0aW9uIGxldmVscworICAgIGZvciAoc2IgPSAwOyBzYiA8IHMtPm5zdWJiYW5kczsgc2IrKykgeworICAgICAgICBpbnQgZiA9IHNiICogcy0+bGltaXRlZF9yYXRlIC8gcy0+bnN1YmJhbmRzOworICAgICAgICBpbnQgYSA9IDE4MDAwIC8gKDEyICogZiAvIDEwMDAgKyAxMDAgKyA0MCAqIHN0KSArIDIwICogb2w7CisgICAgICAgIGlmIChhIDw9IDk1KQorICAgICAgICAgICAgcXVhbnRfbGV2ZWxzW3NiXSA9IDE7CisgICAgICAgIGVsc2UgaWYgKGEgPD0gMTQwKQorICAgICAgICAgICAgcXVhbnRfbGV2ZWxzW3NiXSA9IDI7CisgICAgICAgIGVsc2UgaWYgKGEgPD0gMTgwKQorICAgICAgICAgICAgcXVhbnRfbGV2ZWxzW3NiXSA9IDM7CisgICAgICAgIGVsc2UgaWYgKGEgPD0gMjMwKQorICAgICAgICAgICAgcXVhbnRfbGV2ZWxzW3NiXSA9IDQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHF1YW50X2xldmVsc1tzYl0gPSA1OworICAgIH0KKworICAgIC8vIFJlb3JkZXIgcXVhbnRpemF0aW9uIGxldmVscyBmb3IgbG93ZXIgc3ViYmFuZHMKKyAgICBmb3IgKHNiID0gMDsgc2IgPCA4OyBzYisrKQorICAgICAgICBzLT5xdWFudF9sZXZlbHNbY2gxIC8gMl1bc2JdID0gcXVhbnRfbGV2ZWxzW2ZmX2RjYV9zYl9yZW9yZGVyW21heF9zYl1bc2JdXTsKKyAgICBmb3IgKDsgc2IgPCBzLT5uc3ViYmFuZHM7IHNiKyspCisgICAgICAgIHMtPnF1YW50X2xldmVsc1tjaDEgLyAyXVtzYl0gPSBxdWFudF9sZXZlbHNbc2JdOworCisgICAgLy8gTFBDIGZvciB0aGUgZmlyc3QgdHdvIHN1YmJhbmRzCisgICAgaWYgKHBhcnNlX2xwYyhzLCBjaDEsIGNoMiwgMCwgMikgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBUaW1lLXNhbXBsZXMgZm9yIHRoZSBmaXJzdCB0d28gc3ViYmFuZHMgb2YgbWFpbiBjaGFubmVsCisgICAgaWYgKHBhcnNlX3RzKHMsIGNoMSwgY2gyLCAwLCAyLCAwKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8vIEZpcnN0IHR3byBiYW5kcyBvZiB0aGUgZmlyc3QgZ3JpZAorICAgIGZvciAoc2IgPSAwOyBzYiA8IDI7IHNiKyspCisgICAgICAgIGZvciAoY2ggPSBjaDE7IGNoIDw9IGNoMjsgY2grKykKKyAgICAgICAgICAgIGlmIChwYXJzZV9zY2FsZV9mYWN0b3JzKHMsIHMtPmdyaWRfMV9zY2ZbY2hdW3NiXSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2dyaWRfMihEQ0FMYnJEZWNvZGVyICpzLCBpbnQgY2gxLCBpbnQgY2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3NiLCBpbnQgZW5kX3NiLCBpbnQgZmxhZykKK3sKKyAgICBpbnQgaSwgaiwgc2IsIGNoLCBuc3ViYmFuZHM7CisKKyAgICBuc3ViYmFuZHMgPSBmZl9kY2Ffc2NmX3RvX2dyaWRfMltzLT5uc3ViYmFuZHMgLSAxXSArIDE7CisgICAgaWYgKGVuZF9zYiA+IG5zdWJiYW5kcykKKyAgICAgICAgZW5kX3NiID0gbnN1YmJhbmRzOworCisgICAgZm9yIChzYiA9IHN0YXJ0X3NiOyBzYiA8IGVuZF9zYjsgc2IrKykgeworICAgICAgICBmb3IgKGNoID0gY2gxOyBjaCA8PSBjaDI7IGNoKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmcyX3NjZiA9IHMtPmdyaWRfMl9zY2ZbY2hdW3NiXTsKKworICAgICAgICAgICAgaWYgKChjaCAhPSBjaDEgJiYgZmZfZGNhX2dyaWRfMl90b19zY2Zbc2JdID49IHMtPm1pbl9tb25vX3N1YmJhbmQpICE9IGZsYWcpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZsYWcpCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShnMl9zY2YsIHMtPmdyaWRfMl9zY2ZbY2gxXVtzYl0sIDY0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2NhbGUgZmFjdG9ycyBpbiBncm91cHMgb2YgOAorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKywgZzJfc2NmICs9IDgpIHsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMSkgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoZzJfc2NmLCAwLCA2NCAtIGkgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEJpdCBpbmRpY2F0aW5nIGlmIHdob2xlIGdyb3VwIGhhcyB6ZXJvIHZhbHVlcworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW5zdXJlX2JpdHMoJnMtPmdiLCAyMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBnMl9zY2Zbal0gPSBwYXJzZV92bGMoJnMtPmdiLCAmZmZfZGNhX3ZsY19ncmlkXzIsIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGcyX3NjZiwgMCwgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdHMxX2NodW5rKERDQUxickRlY29kZXIgKnMsIExCUkNodW5rICpjaHVuaywgaW50IGNoMSwgaW50IGNoMikKK3sKKyAgICBpZiAoIWNodW5rLT5sZW4pCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChpbml0X2dldF9iaXRzOCgmcy0+Z2IsIGNodW5rLT5kYXRhLCBjaHVuay0+bGVuKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocGFyc2VfbHBjKHMsIGNoMSwgY2gyLCAyLCAzKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocGFyc2VfdHMocywgY2gxLCBjaDIsIDIsIDQsIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChwYXJzZV9ncmlkXzIocywgY2gxLCBjaDIsIDAsIDEsIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChwYXJzZV90cyhzLCBjaDEsIGNoMiwgNCwgNiwgMCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdHMyX2NodW5rKERDQUxickRlY29kZXIgKnMsIExCUkNodW5rICpjaHVuaywgaW50IGNoMSwgaW50IGNoMikKK3sKKyAgICBpZiAoIWNodW5rLT5sZW4pCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChpbml0X2dldF9iaXRzOCgmcy0+Z2IsIGNodW5rLT5kYXRhLCBjaHVuay0+bGVuKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocGFyc2VfZ3JpZF8yKHMsIGNoMSwgY2gyLCAxLCAzLCAwKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpZiAocGFyc2VfdHMocywgY2gxLCBjaDIsIDYsIHMtPm1heF9tb25vX3N1YmJhbmQsIDApIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChjaDEgIT0gY2gyKSB7CisgICAgICAgIGlmIChwYXJzZV9ncmlkXzFfc2VjX2NoKHMsIGNoMikgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAocGFyc2VfZ3JpZF8yKHMsIGNoMSwgY2gyLCAwLCAzLCAxKSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChwYXJzZV90cyhzLCBjaDEsIGNoMiwgcy0+bWluX21vbm9fc3ViYmFuZCwgcy0+bnN1YmJhbmRzLCAxKSA8IDApCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0X3NhbXBsZV9yYXRlKERDQUxickRlY29kZXIgKnMpCit7CisgICAgZG91YmxlIHNjYWxlID0gKC0xLjAgLyAoMSA8PCAxNykpICogc3FydCgxIDw8ICgyIC0gcy0+bGltaXRlZF9yYW5nZSkpOworICAgIGludCBpLCBicl9wZXJfY2ggPSBzLT5iaXRfcmF0ZV9zY2FsZWQgLyBzLT5uY2hhbm5lbHNfdG90YWw7CisKKyAgICBmZl9tZGN0X2VuZCgmcy0+aW1kY3QpOworCisgICAgaWYgKGZmX21kY3RfaW5pdCgmcy0+aW1kY3QsIHMtPmZyZXFfcmFuZ2UgKyA2LCAxLCBzY2FsZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzIgPDwgcy0+ZnJlcV9yYW5nZTsgaSsrKQorICAgICAgICBzLT53aW5kb3dbaV0gPSBmZl9kY2FfbG9uZ193aW5kb3dbaSA8PCAoMiAtIHMtPmZyZXFfcmFuZ2UpXTsKKworICAgIGlmIChicl9wZXJfY2ggPCAxNDAwMCkKKyAgICAgICAgc2NhbGUgPSAwLjg1OworICAgIGVsc2UgaWYgKGJyX3Blcl9jaCA8IDMyMDAwKQorICAgICAgICBzY2FsZSA9IChicl9wZXJfY2ggLSAxNDAwMCkgKiAoMS4wIC8gMTIwMDAwKSArIDAuODU7CisgICAgZWxzZQorICAgICAgICBzY2FsZSA9IDEuMDsKKworICAgIHNjYWxlICo9IDEuMCAvIElOVF9NQVg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnN1YmJhbmRzOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPCAyKQorICAgICAgICAgICAgcy0+c2Jfc2NmW2ldID0gMDsgICAvLyBUaGUgZmlyc3QgdHdvIHN1YmJhbmRzIGFyZSBhbHdheXMgemVybworICAgICAgICBlbHNlIGlmIChpIDwgNSkKKyAgICAgICAgICAgIHMtPnNiX3NjZltpXSA9IChpIC0gMSkgKiAwLjI1ICogMC43ODUgKiBzY2FsZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcy0+c2Jfc2NmW2ldID0gMC43ODUgKiBzY2FsZTsKKyAgICB9CisKKyAgICBzLT5sZmVfc2NhbGUgPSAoMTYgPDwgcy0+ZnJlcV9yYW5nZSkgKiAwLjAwMDAwNzgyNjU4OTQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbGxvY19zYW1wbGVfYnVmZmVyKERDQUxickRlY29kZXIgKnMpCit7CisgICAgLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgaGlzdG9yeSBhbmQgcGFkZGluZworICAgIGludCBuY2hzYW1wbGVzID0gRENBX0xCUl9USU1FX1NBTVBMRVMgKyBEQ0FfTEJSX1RJTUVfSElTVE9SWSAqIDI7CisgICAgaW50IG5zYW1wbGVzID0gbmNoc2FtcGxlcyAqIHMtPm5jaGFubmVscyAqIHMtPm5zdWJiYW5kczsKKyAgICBpbnQgY2gsIHNiOworICAgIGZsb2F0ICpwdHI7CisKKyAgICAvLyBSZWFsbG9jYXRlIHRpbWUgc2FtcGxlIGJ1ZmZlcgorICAgIGF2X2Zhc3RfbWFsbG9jeigmcy0+dHNfYnVmZmVyLCAmcy0+dHNfc2l6ZSwgbnNhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBpZiAoIXMtPnRzX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcHRyID0gcy0+dHNfYnVmZmVyICsgRENBX0xCUl9USU1FX0hJU1RPUlk7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHMtPm5zdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgcy0+dGltZV9zYW1wbGVzW2NoXVtzYl0gPSBwdHI7CisgICAgICAgICAgICBwdHIgKz0gbmNoc2FtcGxlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2RlY29kZXJfaW5pdChEQ0FMYnJEZWNvZGVyICpzLCBHZXRCeXRlQ29udGV4dCAqZ2IpCit7CisgICAgaW50IG9sZF9yYXRlID0gcy0+c2FtcGxlX3JhdGU7CisgICAgaW50IG9sZF9iYW5kX2xpbWl0ID0gcy0+YmFuZF9saW1pdDsKKyAgICBpbnQgb2xkX25jaGFubmVscyA9IHMtPm5jaGFubmVsczsKKyAgICBpbnQgdmVyc2lvbiwgYml0X3JhdGVfaGk7CisgICAgdW5zaWduZWQgaW50IHNyX2NvZGU7CisKKyAgICAvLyBTYW1wbGUgcmF0ZSBvZiBMQlIgYXVkaW8KKyAgICBzcl9jb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgIGlmIChzcl9jb2RlID49IEZGX0FSUkFZX0VMRU1TKGZmX2RjYV9zYW1wbGluZ19mcmVxcykpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIExCUiBzYW1wbGUgcmF0ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzLT5zYW1wbGVfcmF0ZSA9IGZmX2RjYV9zYW1wbGluZ19mcmVxc1tzcl9jb2RlXTsKKyAgICBpZiAocy0+c2FtcGxlX3JhdGUgPiA0ODAwMCkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIiVkIEh6IExCUiBzYW1wbGUgcmF0ZSIsIHMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIC8vIExCUiBzcGVha2VyIG1hc2sKKyAgICBzLT5jaF9tYXNrID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgIGlmICghKHMtPmNoX21hc2sgJiAweDcpKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiTEJSIGNoYW5uZWwgbWFzayAlI3giLCBzLT5jaF9tYXNrKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAoKHMtPmNoX21hc2sgJiAweGZmZjApICYmICEocy0+d2FybmVkICYgMSkpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICJMQlIgY2hhbm5lbCBtYXNrICUjeCIsIHMtPmNoX21hc2spOworICAgICAgICBzLT53YXJuZWQgfD0gMTsKKyAgICB9CisKKyAgICAvLyBMQlIgYml0c3RyZWFtIHZlcnNpb24KKyAgICB2ZXJzaW9uID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgIGlmICgodmVyc2lvbiAmIDB4ZmYwMCkgIT0gMHgwODAwKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiTEJSIHN0cmVhbSB2ZXJzaW9uICUjeCIsIHZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgLy8gRmxhZ3MgZm9yIExCUiBkZWNvZGVyIGluaXRpYWxpemF0aW9uCisgICAgcy0+ZmxhZ3MgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgaWYgKHMtPmZsYWdzICYgTEJSX0ZMQUdfRE1JWF9NVUxUSV9DSCkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIkxCUiBtdWx0aS1jaGFubmVsIGRvd25taXgiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAoKHMtPmZsYWdzICYgTEJSX0ZMQUdfTEZFX1BSRVNFTlQpICYmIHMtPnNhbXBsZV9yYXRlICE9IDQ4MDAwKSB7CisgICAgICAgIGlmICghKHMtPndhcm5lZCAmIDIpKSB7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIiVkIEh6IExGRSBpbnRlcnBvbGF0aW9uIiwgcy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgcy0+d2FybmVkIHw9IDI7CisgICAgICAgIH0KKyAgICAgICAgcy0+ZmxhZ3MgJj0gfkxCUl9GTEFHX0xGRV9QUkVTRU5UOworICAgIH0KKworICAgIC8vIE1vc3Qgc2lnbmlmaWNhbnQgYml0IHJhdGUgbmliYmxlcworICAgIGJpdF9yYXRlX2hpID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworCisgICAgLy8gTGVhc3Qgc2lnbmlmaWNhbnQgb3JpZ2luYWwgYml0IHJhdGUgd29yZAorICAgIHMtPmJpdF9yYXRlX29yaWcgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYikgfCAoKGJpdF9yYXRlX2hpICYgMHgwRikgPDwgMTYpOworCisgICAgLy8gTGVhc3Qgc2lnbmlmaWNhbnQgc2NhbGVkIGJpdCByYXRlIHdvcmQKKyAgICBzLT5iaXRfcmF0ZV9zY2FsZWQgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYikgfCAoKGJpdF9yYXRlX2hpICYgMHhGMCkgPDwgMTIpOworCisgICAgLy8gU2V0dXAgbnVtYmVyIG9mIGZ1bGxiYW5kIGNoYW5uZWxzCisgICAgcy0+bmNoYW5uZWxzX3RvdGFsID0gZmZfZGNhX2NvdW50X2Noc19mb3JfbWFzayhzLT5jaF9tYXNrICYgfkRDQV9TUEVBS0VSX1BBSVJfTEZFMSk7CisgICAgcy0+bmNoYW5uZWxzID0gRkZNSU4ocy0+bmNoYW5uZWxzX3RvdGFsLCBEQ0FfTEJSX0NIQU5ORUxTKTsKKworICAgIC8vIFNldHVwIGJhbmQgbGltaXQKKyAgICBzd2l0Y2ggKHMtPmZsYWdzICYgTEJSX0ZMQUdfQkFORF9MSU1JVF9NQVNLKSB7CisgICAgY2FzZSBMQlJfRkxBR19CQU5EX0xJTUlUX05PTkU6CisgICAgICAgIHMtPmJhbmRfbGltaXQgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIExCUl9GTEFHX0JBTkRfTElNSVRfMV8yOgorICAgICAgICBzLT5iYW5kX2xpbWl0ID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMQlJfRkxBR19CQU5EX0xJTUlUXzFfNDoKKyAgICAgICAgcy0+YmFuZF9saW1pdCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiTEJSIGJhbmQgbGltaXQgJSN4Iiwgcy0+ZmxhZ3MgJiBMQlJfRkxBR19CQU5EX0xJTUlUX01BU0spOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgLy8gU2V0dXAgZnJlcXVlbmN5IHJhbmdlCisgICAgcy0+ZnJlcV9yYW5nZSA9IGZmX2RjYV9mcmVxX3Jhbmdlc1tzcl9jb2RlXTsKKworICAgIC8vIFNldHVwIHJlc29sdXRpb24gcHJvZmlsZQorICAgIGlmIChzLT5iaXRfcmF0ZV9vcmlnID49IDQ0MDAwICogKHMtPm5jaGFubmVsc190b3RhbCArIDIpKQorICAgICAgICBzLT5yZXNfcHJvZmlsZSA9IDI7CisgICAgZWxzZSBpZiAocy0+Yml0X3JhdGVfb3JpZyA+PSAyNTAwMCAqIChzLT5uY2hhbm5lbHNfdG90YWwgKyAyKSkKKyAgICAgICAgcy0+cmVzX3Byb2ZpbGUgPSAxOworICAgIGVsc2UKKyAgICAgICAgcy0+cmVzX3Byb2ZpbGUgPSAwOworCisgICAgLy8gU2V0dXAgbGltaXRlZCBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIHN1YmJhbmRzLCBldGMKKyAgICBzLT5saW1pdGVkX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZSA+PiBzLT5iYW5kX2xpbWl0OworICAgIHMtPmxpbWl0ZWRfcmFuZ2UgPSBzLT5mcmVxX3JhbmdlIC0gcy0+YmFuZF9saW1pdDsKKyAgICBpZiAocy0+bGltaXRlZF9yYW5nZSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIExCUiBiYW5kIGxpbWl0IGZvciBmcmVxdWVuY3kgcmFuZ2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5uc3ViYmFuZHMgPSA4IDw8IHMtPmxpbWl0ZWRfcmFuZ2U7CisKKyAgICBzLT5nM19hdmdfb25seV9zdGFydF9zYiA9IHMtPm5zdWJiYW5kcyAqIGZmX2RjYV9hdmdfZzNfZnJlcXNbcy0+cmVzX3Byb2ZpbGVdIC8gKHMtPmxpbWl0ZWRfcmF0ZSAvIDIpOworICAgIGlmIChzLT5nM19hdmdfb25seV9zdGFydF9zYiA+IHMtPm5zdWJiYW5kcykKKyAgICAgICAgcy0+ZzNfYXZnX29ubHlfc3RhcnRfc2IgPSBzLT5uc3ViYmFuZHM7CisKKyAgICBzLT5taW5fbW9ub19zdWJiYW5kID0gcy0+bnN1YmJhbmRzICogIDIwMDAgLyAocy0+bGltaXRlZF9yYXRlIC8gMik7CisgICAgaWYgKHMtPm1pbl9tb25vX3N1YmJhbmQgPiBzLT5uc3ViYmFuZHMpCisgICAgICAgIHMtPm1pbl9tb25vX3N1YmJhbmQgPSBzLT5uc3ViYmFuZHM7CisKKyAgICBzLT5tYXhfbW9ub19zdWJiYW5kID0gcy0+bnN1YmJhbmRzICogMTQwMDAgLyAocy0+bGltaXRlZF9yYXRlIC8gMik7CisgICAgaWYgKHMtPm1heF9tb25vX3N1YmJhbmQgPiBzLT5uc3ViYmFuZHMpCisgICAgICAgIHMtPm1heF9tb25vX3N1YmJhbmQgPSBzLT5uc3ViYmFuZHM7CisKKyAgICAvLyBIYW5kbGUgY2hhbmdlIG9mIHNhbXBsZSByYXRlCisgICAgaWYgKChvbGRfcmF0ZSAhPSBzLT5zYW1wbGVfcmF0ZSB8fCBvbGRfYmFuZF9saW1pdCAhPSBzLT5iYW5kX2xpbWl0KSAmJiBpbml0X3NhbXBsZV9yYXRlKHMpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8vIFNldHVwIHN0ZXJlbyBkb3dubWl4CisgICAgaWYgKHMtPmZsYWdzICYgTEJSX0ZMQUdfRE1JWF9TVEVSRU8pIHsKKyAgICAgICAgRENBQ29udGV4dCAqZGNhID0gcy0+YXZjdHgtPnByaXZfZGF0YTsKKworICAgICAgICBpZiAocy0+bmNoYW5uZWxzX3RvdGFsIDwgMyB8fCBzLT5uY2hhbm5lbHNfdG90YWwgPiBEQ0FfTEJSX0NIQU5ORUxTX1RPVEFMIC0gMikgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyBmb3IgTEJSIHN0ZXJlbyBkb3dubWl4XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBkZWNvZGVyIGRvZXNuJ3Qgc3VwcG9ydCBFQ1MgY2h1bmsKKyAgICAgICAgaWYgKGRjYS0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAhPSBEQ0FfU1BFQUtFUl9MQVlPVVRfU1RFUkVPICYmICEocy0+d2FybmVkICYgNCkpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiRW1iZWRkZWQgTEJSIHN0ZXJlbyBkb3dubWl4Iik7CisgICAgICAgICAgICBzLT53YXJuZWQgfD0gNDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjY291bnQgZm9yIGV4dHJhIGRvd25taXhlZCBjaGFubmVsIHBhaXIKKyAgICAgICAgcy0+bmNoYW5uZWxzX3RvdGFsICs9IDI7CisgICAgICAgIHMtPm5jaGFubmVscyA9IDI7CisgICAgICAgIHMtPmNoX21hc2sgPSBEQ0FfU1BFQUtFUl9QQUlSX0xSOworICAgICAgICBzLT5mbGFncyAmPSB+TEJSX0ZMQUdfTEZFX1BSRVNFTlQ7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNoYW5nZSBvZiBzYW1wbGUgcmF0ZSBvciBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICBpZiAob2xkX3JhdGUgIT0gcy0+c2FtcGxlX3JhdGUKKyAgICAgICAgfHwgb2xkX2JhbmRfbGltaXQgIT0gcy0+YmFuZF9saW1pdAorICAgICAgICB8fCBvbGRfbmNoYW5uZWxzICE9IHMtPm5jaGFubmVscykgeworICAgICAgICBpZiAoYWxsb2Nfc2FtcGxlX2J1ZmZlcihzKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmZl9kY2FfbGJyX2ZsdXNoKHMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZGNhX2xicl9wYXJzZShEQ0FMYnJEZWNvZGVyICpzLCB1aW50OF90ICpkYXRhLCBEQ0FFeHNzQXNzZXQgKmFzc2V0KQoreworICAgIHN0cnVjdCB7CisgICAgICAgIExCUkNodW5rICAgIGxmZTsKKyAgICAgICAgTEJSQ2h1bmsgICAgdG9uYWw7CisgICAgICAgIExCUkNodW5rICAgIHRvbmFsX2dycFs1XTsKKyAgICAgICAgTEJSQ2h1bmsgICAgZ3JpZDFbRENBX0xCUl9DSEFOTkVMUyAvIDJdOworICAgICAgICBMQlJDaHVuayAgICBocl9ncmlkW0RDQV9MQlJfQ0hBTk5FTFMgLyAyXTsKKyAgICAgICAgTEJSQ2h1bmsgICAgdHMxW0RDQV9MQlJfQ0hBTk5FTFMgLyAyXTsKKyAgICAgICAgTEJSQ2h1bmsgICAgdHMyW0RDQV9MQlJfQ0hBTk5FTFMgLyAyXTsKKyAgICB9IGNodW5rID0geyB7MH0gfTsKKworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgaW50IGksIGNoLCBzYiwgc2YsIHJldCwgZ3JvdXAsIGNodW5rX2lkLCBjaHVua19sZW47CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgZGF0YSArIGFzc2V0LT5sYnJfb2Zmc2V0LCBhc3NldC0+bGJyX3NpemUpOworCisgICAgLy8gTEJSIHN5bmMgd29yZAorICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpICE9IERDQV9TWU5DV09SRF9MQlIpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIExCUiBzeW5jIHdvcmRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvLyBMQlIgaGVhZGVyIHR5cGUKKyAgICBzd2l0Y2ggKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikpIHsKKyAgICBjYXNlIERDQV9MQlJfSEVBREVSX1NZTkNfT05MWToKKyAgICAgICAgaWYgKCFzLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJMQlIgZGVjb2RlciBub3QgaW5pdGlhbGl6ZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEQ0FfTEJSX0hFQURFUl9ERUNPREVSX0lOSVQ6CisgICAgICAgIGlmICgocmV0ID0gcGFyc2VfZGVjb2Rlcl9pbml0KHMsICZnYikpIDwgMCkgeworICAgICAgICAgICAgcy0+c2FtcGxlX3JhdGUgPSAwOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgTEJSIGhlYWRlciB0eXBlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLy8gTEJSIGZyYW1lIGNodW5rIGhlYWRlcgorICAgIGNodW5rX2lkID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICBjaHVua19sZW4gPSAoY2h1bmtfaWQgJiAweDgwKSA/IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYikgOiBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworCisgICAgaWYgKGNodW5rX2xlbiA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpIHsKKyAgICAgICAgY2h1bmtfbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkxCUiBmcmFtZSBjaHVuayB3YXMgdHJ1bmNhdGVkXG4iKTsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGdiLmJ1ZmZlciwgY2h1bmtfbGVuKTsKKworICAgIHN3aXRjaCAoY2h1bmtfaWQgJiAweDdmKSB7CisgICAgY2FzZSBMQlJfQ0hVTktfRlJBTUU6CisgICAgICAgIGlmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0NSQ0NIRUNLIHwgQVZfRUZfQ0FSRUZVTCkpIHsKKyAgICAgICAgICAgIGludCBjaGVja3N1bSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisgICAgICAgICAgICB1aW50MTZfdCByZXMgPSBjaHVua19pZDsKKyAgICAgICAgICAgIHJlcyArPSAoY2h1bmtfbGVuID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgIHJlcyArPSBjaHVua19sZW4gJiAweGZmOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNodW5rX2xlbiAtIDI7IGkrKykKKyAgICAgICAgICAgICAgICByZXMgKz0gZ2IuYnVmZmVyW2ldOworICAgICAgICAgICAgaWYgKGNoZWNrc3VtICE9IHJlcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIExCUiBjaGVja3N1bVxuIik7CisgICAgICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIExCUl9DSFVOS19GUkFNRV9OT19DU1VNOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgTEJSIGZyYW1lIGNodW5rIElEXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLy8gQ2xlYXIgY3VycmVudCBmcmFtZQorICAgIG1lbXNldChzLT5xdWFudF9sZXZlbHMsIDAsIHNpemVvZihzLT5xdWFudF9sZXZlbHMpKTsKKyAgICBtZW1zZXQocy0+c2JfaW5kaWNlcywgMHhmZiwgc2l6ZW9mKHMtPnNiX2luZGljZXMpKTsKKyAgICBtZW1zZXQocy0+c2VjX2NoX3NibXMsIDAsIHNpemVvZihzLT5zZWNfY2hfc2JtcykpOworICAgIG1lbXNldChzLT5zZWNfY2hfbHJtcywgMCwgc2l6ZW9mKHMtPnNlY19jaF9scm1zKSk7CisgICAgbWVtc2V0KHMtPmNoX3ByZXMsIDAsIHNpemVvZihzLT5jaF9wcmVzKSk7CisgICAgbWVtc2V0KHMtPmdyaWRfMV9zY2YsIDAsIHNpemVvZihzLT5ncmlkXzFfc2NmKSk7CisgICAgbWVtc2V0KHMtPmdyaWRfMl9zY2YsIDAsIHNpemVvZihzLT5ncmlkXzJfc2NmKSk7CisgICAgbWVtc2V0KHMtPmdyaWRfM19hdmcsIDAsIHNpemVvZihzLT5ncmlkXzNfYXZnKSk7CisgICAgbWVtc2V0KHMtPmdyaWRfM19zY2YsIDAsIHNpemVvZihzLT5ncmlkXzNfc2NmKSk7CisgICAgbWVtc2V0KHMtPmdyaWRfM19wcmVzLCAwLCBzaXplb2Yocy0+Z3JpZF8zX3ByZXMpKTsKKyAgICBtZW1zZXQocy0+dG9uYWxfc2NmLCAwLCBzaXplb2Yocy0+dG9uYWxfc2NmKSk7CisgICAgbWVtc2V0KHMtPmxmZV9kYXRhLCAwLCBzaXplb2Yocy0+bGZlX2RhdGEpKTsKKyAgICBzLT5wYXJ0X3N0ZXJlb19wcmVzID0gMDsKKyAgICBzLT5mcmFtZW51bSA9IChzLT5mcmFtZW51bSArIDEpICYgMzE7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgcy0+bnN1YmJhbmRzIC8gNDsgc2IrKykgeworICAgICAgICAgICAgcy0+cGFydF9zdGVyZW9bY2hdW3NiXVswXSA9IHMtPnBhcnRfc3RlcmVvW2NoXVtzYl1bNF07CisgICAgICAgICAgICBzLT5wYXJ0X3N0ZXJlb1tjaF1bc2JdWzRdID0gMTY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtZW1zZXQocy0+bHBjX2NvZWZmW3MtPmZyYW1lbnVtICYgMV0sIDAsIHNpemVvZihzLT5scGNfY29lZmZbMF0pKTsKKworICAgIGZvciAoZ3JvdXAgPSAwOyBncm91cCA8IDU7IGdyb3VwKyspIHsKKyAgICAgICAgZm9yIChzZiA9IDA7IHNmIDwgMSA8PCBncm91cDsgc2YrKykgeworICAgICAgICAgICAgaW50IHNmX2lkeCA9ICgocy0+ZnJhbWVudW0gPDwgZ3JvdXApICsgc2YpICYgMzE7CisgICAgICAgICAgICBzLT50b25hbF9ib3VuZHNbZ3JvdXBdW3NmX2lkeF1bMF0gPQorICAgICAgICAgICAgcy0+dG9uYWxfYm91bmRzW2dyb3VwXVtzZl9pZHhdWzFdID0gcy0+bnRvbmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUGFyc2UgY2h1bmsgaGVhZGVycworICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpID4gMCkgeworICAgICAgICBjaHVua19pZCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgIGNodW5rX2xlbiA9IChjaHVua19pZCAmIDB4ODApID8gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKSA6IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgIGNodW5rX2lkICY9IDB4N2Y7CisKKyAgICAgICAgaWYgKGNodW5rX2xlbiA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpIHsKKyAgICAgICAgICAgIGNodW5rX2xlbiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYik7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTEJSIGNodW5rICUjeCB3YXMgdHJ1bmNhdGVkXG4iLCBjaHVua19pZCk7CisgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGNodW5rX2lkKSB7CisgICAgICAgIGNhc2UgTEJSX0NIVU5LX0xGRToKKyAgICAgICAgICAgIGNodW5rLmxmZS5sZW4gID0gY2h1bmtfbGVuOworICAgICAgICAgICAgY2h1bmsubGZlLmRhdGEgPSBnYi5idWZmZXI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExCUl9DSFVOS19TQ0Y6CisgICAgICAgIGNhc2UgTEJSX0NIVU5LX1RPTkFMOgorICAgICAgICBjYXNlIExCUl9DSFVOS19UT05BTF9TQ0Y6CisgICAgICAgICAgICBjaHVuay50b25hbC5pZCAgID0gY2h1bmtfaWQ7CisgICAgICAgICAgICBjaHVuay50b25hbC5sZW4gID0gY2h1bmtfbGVuOworICAgICAgICAgICAgY2h1bmsudG9uYWwuZGF0YSA9IGdiLmJ1ZmZlcjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgTEJSX0NIVU5LX1RPTkFMX0dSUF8xOgorICAgICAgICBjYXNlIExCUl9DSFVOS19UT05BTF9HUlBfMjoKKyAgICAgICAgY2FzZSBMQlJfQ0hVTktfVE9OQUxfR1JQXzM6CisgICAgICAgIGNhc2UgTEJSX0NIVU5LX1RPTkFMX0dSUF80OgorICAgICAgICBjYXNlIExCUl9DSFVOS19UT05BTF9HUlBfNToKKyAgICAgICAgICAgIGkgPSBMQlJfQ0hVTktfVE9OQUxfR1JQXzUgLSBjaHVua19pZDsKKyAgICAgICAgICAgIGNodW5rLnRvbmFsX2dycFtpXS5pZCAgID0gaTsKKyAgICAgICAgICAgIGNodW5rLnRvbmFsX2dycFtpXS5sZW4gID0gY2h1bmtfbGVuOworICAgICAgICAgICAgY2h1bmsudG9uYWxfZ3JwW2ldLmRhdGEgPSBnYi5idWZmZXI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExCUl9DSFVOS19UT05BTF9TQ0ZfR1JQXzE6CisgICAgICAgIGNhc2UgTEJSX0NIVU5LX1RPTkFMX1NDRl9HUlBfMjoKKyAgICAgICAgY2FzZSBMQlJfQ0hVTktfVE9OQUxfU0NGX0dSUF8zOgorICAgICAgICBjYXNlIExCUl9DSFVOS19UT05BTF9TQ0ZfR1JQXzQ6CisgICAgICAgIGNhc2UgTEJSX0NIVU5LX1RPTkFMX1NDRl9HUlBfNToKKyAgICAgICAgICAgIGkgPSBMQlJfQ0hVTktfVE9OQUxfU0NGX0dSUF81IC0gY2h1bmtfaWQ7CisgICAgICAgICAgICBjaHVuay50b25hbF9ncnBbaV0uaWQgICA9IGk7CisgICAgICAgICAgICBjaHVuay50b25hbF9ncnBbaV0ubGVuICA9IGNodW5rX2xlbjsKKyAgICAgICAgICAgIGNodW5rLnRvbmFsX2dycFtpXS5kYXRhID0gZ2IuYnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMQlJfQ0hVTktfUkVTX0dSSURfTFI6CisgICAgICAgIGNhc2UgTEJSX0NIVU5LX1JFU19HUklEX0xSICsgMToKKyAgICAgICAgY2FzZSBMQlJfQ0hVTktfUkVTX0dSSURfTFIgKyAyOgorICAgICAgICAgICAgaSA9IGNodW5rX2lkIC0gTEJSX0NIVU5LX1JFU19HUklEX0xSOworICAgICAgICAgICAgY2h1bmsuZ3JpZDFbaV0ubGVuICA9IGNodW5rX2xlbjsKKyAgICAgICAgICAgIGNodW5rLmdyaWQxW2ldLmRhdGEgPSBnYi5idWZmZXI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExCUl9DSFVOS19SRVNfR1JJRF9IUjoKKyAgICAgICAgY2FzZSBMQlJfQ0hVTktfUkVTX0dSSURfSFIgKyAxOgorICAgICAgICBjYXNlIExCUl9DSFVOS19SRVNfR1JJRF9IUiArIDI6CisgICAgICAgICAgICBpID0gY2h1bmtfaWQgLSBMQlJfQ0hVTktfUkVTX0dSSURfSFI7CisgICAgICAgICAgICBjaHVuay5ocl9ncmlkW2ldLmxlbiAgPSBjaHVua19sZW47CisgICAgICAgICAgICBjaHVuay5ocl9ncmlkW2ldLmRhdGEgPSBnYi5idWZmZXI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIExCUl9DSFVOS19SRVNfVFNfMToKKyAgICAgICAgY2FzZSBMQlJfQ0hVTktfUkVTX1RTXzEgKyAxOgorICAgICAgICBjYXNlIExCUl9DSFVOS19SRVNfVFNfMSArIDI6CisgICAgICAgICAgICBpID0gY2h1bmtfaWQgLSBMQlJfQ0hVTktfUkVTX1RTXzE7CisgICAgICAgICAgICBjaHVuay50czFbaV0ubGVuICA9IGNodW5rX2xlbjsKKyAgICAgICAgICAgIGNodW5rLnRzMVtpXS5kYXRhID0gZ2IuYnVmZmVyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBMQlJfQ0hVTktfUkVTX1RTXzI6CisgICAgICAgIGNhc2UgTEJSX0NIVU5LX1JFU19UU18yICsgMToKKyAgICAgICAgY2FzZSBMQlJfQ0hVTktfUkVTX1RTXzIgKyAyOgorICAgICAgICAgICAgaSA9IGNodW5rX2lkIC0gTEJSX0NIVU5LX1JFU19UU18yOworICAgICAgICAgICAgY2h1bmsudHMyW2ldLmxlbiAgPSBjaHVua19sZW47CisgICAgICAgICAgICBjaHVuay50czJbaV0uZGF0YSA9IGdiLmJ1ZmZlcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGNodW5rX2xlbik7CisgICAgfQorCisgICAgLy8gUGFyc2UgdGhlIGNodW5rcworICAgIHJldCA9IHBhcnNlX2xmZV9jaHVuayhzLCAmY2h1bmsubGZlKTsKKworICAgIHJldCB8PSBwYXJzZV90b25hbF9jaHVuayhzLCAmY2h1bmsudG9uYWwpOworCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgcmV0IHw9IHBhcnNlX3RvbmFsX2dyb3VwKHMsICZjaHVuay50b25hbF9ncnBbaV0pOworCisgICAgZm9yIChpID0gMDsgaSA8IChzLT5uY2hhbm5lbHMgKyAxKSAvIDI7IGkrKykgeworICAgICAgICBpbnQgY2gxID0gaSAqIDI7CisgICAgICAgIGludCBjaDIgPSBGRk1JTihjaDEgKyAxLCBzLT5uY2hhbm5lbHMgLSAxKTsKKworICAgICAgICBpZiAocGFyc2VfZ3JpZF8xX2NodW5rIChzLCAmY2h1bmsuZ3JpZDEgIFtpXSwgY2gxLCBjaDIpIDwgMCB8fAorICAgICAgICAgICAgcGFyc2VfaGlnaF9yZXNfZ3JpZChzLCAmY2h1bmsuaHJfZ3JpZFtpXSwgY2gxLCBjaDIpIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRTIGNodW5rcyBkZXBlbmQgb24gYm90aCBncmlkcy4gVFNfMiBkZXBlbmRzIG9uIFRTXzEuCisgICAgICAgIGlmICghY2h1bmsuZ3JpZDFbaV0ubGVuIHx8ICFjaHVuay5ocl9ncmlkW2ldLmxlbiB8fCAhY2h1bmsudHMxW2ldLmxlbikKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChwYXJzZV90czFfY2h1bmsocywgJmNodW5rLnRzMVtpXSwgY2gxLCBjaDIpIDwgMCB8fAorICAgICAgICAgICAgcGFyc2VfdHMyX2NodW5rKHMsICZjaHVuay50czJbaV0sIGNoMSwgY2gyKSA8IDApIHsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCAmJiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFJlY29uc3RydWN0IGhpZ2gtZnJlcXVlbmN5IHJlc29sdXRpb24gZ3JpZCBmcm9tIGZpcnN0IGFuZCB0aGlyZCBncmlkcworICovCitzdGF0aWMgdm9pZCBkZWNvZGVfZ3JpZChEQ0FMYnJEZWNvZGVyICpzLCBpbnQgY2gxLCBpbnQgY2gyKQoreworICAgIGludCBpLCBjaCwgc2I7CisKKyAgICBmb3IgKGNoID0gY2gxOyBjaCA8PSBjaDI7IGNoKyspIHsKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgcy0+bnN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICBpbnQgZzFfc2IgPSBmZl9kY2Ffc2NmX3RvX2dyaWRfMVtzYl07CisKKyAgICAgICAgICAgIHVpbnQ4X3QgKmcxX3NjZl9hID0gcy0+Z3JpZF8xX3NjZltjaF1bZzFfc2IgICAgXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmcxX3NjZl9iID0gcy0+Z3JpZF8xX3NjZltjaF1bZzFfc2IgKyAxXTsKKworICAgICAgICAgICAgaW50IHcxID0gZmZfZGNhX2dyaWRfMV93ZWlnaHRzW2cxX3NiICAgIF1bc2JdOworICAgICAgICAgICAgaW50IHcyID0gZmZfZGNhX2dyaWRfMV93ZWlnaHRzW2cxX3NiICsgMV1bc2JdOworCisgICAgICAgICAgICB1aW50OF90ICpocl9zY2YgPSBzLT5oaWdoX3Jlc19zY2ZbY2hdW3NiXTsKKworICAgICAgICAgICAgaWYgKHNiIDwgNCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNjZiA9IHcxICogZzFfc2NmX2FbaV0gKyB3MiAqIGcxX3NjZl9iW2ldOworICAgICAgICAgICAgICAgICAgICBocl9zY2ZbaV0gPSBzY2YgPj4gNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDhfdCAqZzNfc2NmID0gcy0+Z3JpZF8zX3NjZltjaF1bc2IgLSA0XTsKKyAgICAgICAgICAgICAgICBpbnQgZzNfYXZnID0gcy0+Z3JpZF8zX2F2Z1tjaF1bc2IgLSA0XTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNjZiA9IHcxICogZzFfc2NmX2FbaV0gKyB3MiAqIGcxX3NjZl9iW2ldOworICAgICAgICAgICAgICAgICAgICBocl9zY2ZbaV0gPSAoc2NmID4+IDcpIC0gZzNfYXZnIC0gZzNfc2NmW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiBGaWxsIHVuYWxsb2NhdGVkIHN1YmJhbmRzIHdpdGggcmFuZG9tbmVzcworICovCitzdGF0aWMgdm9pZCByYW5kb21fdHMoRENBTGJyRGVjb2RlciAqcywgaW50IGNoMSwgaW50IGNoMikKK3sKKyAgICBpbnQgaSwgaiwgaywgY2gsIHNiOworCisgICAgZm9yIChjaCA9IGNoMTsgY2ggPD0gY2gyOyBjaCsrKSB7CisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHMtPm5zdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgZmxvYXQgKnNhbXBsZXMgPSBzLT50aW1lX3NhbXBsZXNbY2hdW3NiXTsKKworICAgICAgICAgICAgaWYgKHMtPmNoX3ByZXNbY2hdICYgKDFVIDw8IHNiKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAvLyBTa2lwIGFsbG9jYXRlZCBzdWJiYW5kCisKKyAgICAgICAgICAgIGlmIChzYiA8IDIpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdHdvIHN1YmJhbmRzIGFyZSBhbHdheXMgemVybworICAgICAgICAgICAgICAgIG1lbXNldChzYW1wbGVzLCAwLCBEQ0FfTEJSX1RJTUVfU0FNUExFUyAqIHNpemVvZihmbG9hdCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzYiA8IDEwKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IERDQV9MQlJfVElNRV9TQU1QTEVTOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBsYnJfcmFuZChzLCBzYik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ0FfTEJSX1RJTUVfU0FNUExFUyAvIDg7IGkrKywgc2FtcGxlcyArPSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFjY3VtWzhdID0geyAwIH07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTW9kdWxhdGUgYnkgc3ViYmFuZHMgMi01IGluIGJsb2NrcyBvZiA4CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDI7IGsgPCA2OyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdGhlciA9ICZzLT50aW1lX3NhbXBsZXNbY2hdW2tdW2kgKiA4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW1bal0gKz0gZmFicyhvdGhlcltqXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1tqXSA9IChhY2N1bVtqXSAqIDAuMjVmICsgMC41ZikgKiBsYnJfcmFuZChzLCBzYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVkaWN0KGZsb2F0ICpzYW1wbGVzLCBjb25zdCBmbG9hdCAqY29lZmYsIGludCBuc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGZsb2F0IHJlcyA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspCisgICAgICAgICAgICByZXMgKz0gY29lZmZbal0gKiBzYW1wbGVzW2kgLSBqIC0gMV07CisgICAgICAgIHNhbXBsZXNbaV0gLT0gcmVzOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3ludGhfbHBjKERDQUxickRlY29kZXIgKnMsIGludCBjaDEsIGludCBjaDIsIGludCBzYikKK3sKKyAgICBpbnQgZiA9IHMtPmZyYW1lbnVtICYgMTsKKyAgICBpbnQgY2g7CisKKyAgICBmb3IgKGNoID0gY2gxOyBjaCA8PSBjaDI7IGNoKyspIHsKKyAgICAgICAgZmxvYXQgKnNhbXBsZXMgPSBzLT50aW1lX3NhbXBsZXNbY2hdW3NiXTsKKworICAgICAgICBpZiAoIShzLT5jaF9wcmVzW2NoXSAmICgxVSA8PCBzYikpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHNiIDwgMikgeworICAgICAgICAgICAgcHJlZGljdChzYW1wbGVzLCAgICAgIHMtPmxwY19jb2VmZltmXjFdW2NoXVtzYl1bMV0sICAxNik7CisgICAgICAgICAgICBwcmVkaWN0KHNhbXBsZXMgKyAxNiwgcy0+bHBjX2NvZWZmW2YgIF1bY2hdW3NiXVswXSwgIDY0KTsKKyAgICAgICAgICAgIHByZWRpY3Qoc2FtcGxlcyArIDgwLCBzLT5scGNfY29lZmZbZiAgXVtjaF1bc2JdWzFdLCAgNDgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJlZGljdChzYW1wbGVzLCAgICAgIHMtPmxwY19jb2VmZltmXjFdW2NoXVtzYl1bMF0sICAxNik7CisgICAgICAgICAgICBwcmVkaWN0KHNhbXBsZXMgKyAxNiwgcy0+bHBjX2NvZWZmW2YgIF1bY2hdW3NiXVswXSwgMTEyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyX3RzKERDQUxickRlY29kZXIgKnMsIGludCBjaDEsIGludCBjaDIpCit7CisgICAgaW50IGksIGosIHNiLCBjaDsKKworICAgIGZvciAoc2IgPSAwOyBzYiA8IHMtPm5zdWJiYW5kczsgc2IrKykgeworICAgICAgICAvLyBTY2FsZSBmYWN0b3JzCisgICAgICAgIGZvciAoY2ggPSBjaDE7IGNoIDw9IGNoMjsgY2grKykgeworICAgICAgICAgICAgZmxvYXQgKnNhbXBsZXMgPSBzLT50aW1lX3NhbXBsZXNbY2hdW3NiXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmhyX3NjZiA9IHMtPmhpZ2hfcmVzX3NjZltjaF1bc2JdOworICAgICAgICAgICAgaWYgKHNiIDwgNCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ0FfTEJSX1RJTUVfU0FNUExFUyAvIDE2OyBpKyssIHNhbXBsZXMgKz0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNjZiA9IGhyX3NjZltpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjZiA+IEFNUF9NQVgpCisgICAgICAgICAgICAgICAgICAgICAgICBzY2YgPSBBTVBfTUFYOworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbal0gKj0gZmZfZGNhX3F1YW50X2FtcFtzY2ZdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqZzJfc2NmID0gcy0+Z3JpZF8yX3NjZltjaF1bZmZfZGNhX3NjZl90b19ncmlkXzJbc2JdXTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRENBX0xCUl9USU1FX1NBTVBMRVMgLyAyOyBpKyssIHNhbXBsZXMgKz0gMikgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2NmID0gaHJfc2NmW2kgLyA4XSAtIGcyX3NjZltpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjZiA+IEFNUF9NQVgpCisgICAgICAgICAgICAgICAgICAgICAgICBzY2YgPSBBTVBfTUFYOworICAgICAgICAgICAgICAgICAgICBzYW1wbGVzWzBdICo9IGZmX2RjYV9xdWFudF9hbXBbc2NmXTsKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1sxXSAqPSBmZl9kY2FfcXVhbnRfYW1wW3NjZl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTWlkLXNpZGUgc3RlcmVvCisgICAgICAgIGlmIChjaDEgIT0gY2gyKSB7CisgICAgICAgICAgICBmbG9hdCAqc2FtcGxlc19sID0gcy0+dGltZV9zYW1wbGVzW2NoMV1bc2JdOworICAgICAgICAgICAgZmxvYXQgKnNhbXBsZXNfciA9IHMtPnRpbWVfc2FtcGxlc1tjaDJdW3NiXTsKKyAgICAgICAgICAgIGludCBjaDJfcHJlcyA9IHMtPmNoX3ByZXNbY2gyXSAmICgxVSA8PCBzYik7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ0FfTEJSX1RJTUVfU0FNUExFUyAvIDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc2JtcyA9IChzLT5zZWNfY2hfc2Jtc1tjaDEgLyAyXVtzYl0gPj4gaSkgJiAxOworICAgICAgICAgICAgICAgIGludCBscm1zID0gKHMtPnNlY19jaF9scm1zW2NoMSAvIDJdW3NiXSA+PiBpKSAmIDE7CisKKyAgICAgICAgICAgICAgICBpZiAoc2IgPj0gcy0+bWluX21vbm9fc3ViYmFuZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobHJtcyAmJiBjaDJfcHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNibXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0bXAgPSBzYW1wbGVzX2xbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfbFtqXSA9ICBzYW1wbGVzX3Jbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfcltqXSA9IC10bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0bXAgPSBzYW1wbGVzX2xbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfbFtqXSA9ICBzYW1wbGVzX3Jbal07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNfcltqXSA9ICB0bXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaDJfcHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNibXMgJiYgKHMtPnBhcnRfc3RlcmVvX3ByZXMgJiAoMSA8PCBjaDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzX3Jbal0gPSAtc2FtcGxlc19sW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19yW2pdID0gIHNhbXBsZXNfbFtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2JtcyAmJiBjaDJfcHJlcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG1wID0gc2FtcGxlc19sW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19sW2pdID0gKHRtcCArIHNhbXBsZXNfcltqXSkgKiAwLjVmOworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc19yW2pdID0gKHRtcCAtIHNhbXBsZXNfcltqXSkgKiAwLjVmOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2FtcGxlc19sICs9IDE2OworICAgICAgICAgICAgICAgIHNhbXBsZXNfciArPSAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEludmVyc2UgcHJlZGljdGlvbgorICAgICAgICBpZiAoc2IgPCAzKQorICAgICAgICAgICAgc3ludGhfbHBjKHMsIGNoMSwgY2gyLCBzYik7CisgICAgfQorfQorCisvKioKKyAqIE1vZHVsYXRlIGJ5IGludGVycG9sYXRlZCBwYXJ0aWFsIHN0ZXJlbyBjb2VmZmljaWVudHMKKyAqLworc3RhdGljIHZvaWQgZGVjb2RlX3BhcnRfc3RlcmVvKERDQUxickRlY29kZXIgKnMsIGludCBjaDEsIGludCBjaDIpCit7CisgICAgaW50IGksIGNoLCBzYiwgc2Y7CisKKyAgICBmb3IgKGNoID0gY2gxOyBjaCA8PSBjaDI7IGNoKyspIHsKKyAgICAgICAgZm9yIChzYiA9IHMtPm1pbl9tb25vX3N1YmJhbmQ7IHNiIDwgcy0+bnN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICB1aW50OF90ICpwdF9zdCA9IHMtPnBhcnRfc3RlcmVvW2NoXVsoc2IgLSBzLT5taW5fbW9ub19zdWJiYW5kKSAvIDRdOworICAgICAgICAgICAgZmxvYXQgKnNhbXBsZXMgPSBzLT50aW1lX3NhbXBsZXNbY2hdW3NiXTsKKworICAgICAgICAgICAgaWYgKHMtPmNoX3ByZXNbY2gyXSAmICgxVSA8PCBzYikpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvciAoc2YgPSAxOyBzZiA8PSA0OyBzZisrLCBzYW1wbGVzICs9IDMyKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgcHJldiA9IGZmX2RjYV9zdF9jb2VmZltwdF9zdFtzZiAtIDFdXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBuZXh0ID0gZmZfZGNhX3N0X2NvZWZmW3B0X3N0W3NmICAgIF1dOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gKj0gKDMyIC0gaSkgKiBwcmV2ICsgaSAqIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogU3ludGhlc2lzZSB0b25lcyBpbiB0aGUgZ2l2ZW4gZ3JvdXAgZm9yIHRoZSBnaXZlbiB0b25hbCBzdWJmcmFtZQorICovCitzdGF0aWMgdm9pZCBzeW50aF90b25lcyhEQ0FMYnJEZWNvZGVyICpzLCBpbnQgY2gsIGZsb2F0ICp2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JvdXAsIGludCBncm91cF9zZiwgaW50IHN5bnRoX2lkeCkKK3sKKyAgICBpbnQgaSwgc3RhcnQsIGNvdW50OworCisgICAgaWYgKHN5bnRoX2lkeCA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIHN0YXJ0ID0gIHMtPnRvbmFsX2JvdW5kc1tncm91cF1bZ3JvdXBfc2ZdWzBdOworICAgIGNvdW50ID0gKHMtPnRvbmFsX2JvdW5kc1tncm91cF1bZ3JvdXBfc2ZdWzFdIC0gc3RhcnQpICYgKERDQV9MQlJfVE9ORVMgLSAxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIERDQUxiclRvbmUgKnQgPSAmcy0+dG9uZXNbKHN0YXJ0ICsgaSkgJiAoRENBX0xCUl9UT05FUyAtIDEpXTsKKworICAgICAgICBpZiAodC0+YW1wW2NoXSkgeworICAgICAgICAgICAgZmxvYXQgYW1wID0gZmZfZGNhX3N5bnRoX2VudltzeW50aF9pZHhdICogZmZfZGNhX3F1YW50X2FtcFt0LT5hbXBbY2hdXTsKKyAgICAgICAgICAgIGZsb2F0IGMgPSBhbXAgKiBjb3NfdGFiWyh0LT5waHNbY2hdICAgICApICYgMjU1XTsKKyAgICAgICAgICAgIGZsb2F0IHMgPSBhbXAgKiBjb3NfdGFiWyh0LT5waHNbY2hdICsgNjQpICYgMjU1XTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjZiA9IGZmX2RjYV9jb3JyX2NmW3QtPmZfZGVsdF07CisgICAgICAgICAgICBpbnQgeF9mcmVxID0gdC0+eF9mcmVxOworCisgICAgICAgICAgICBzd2l0Y2ggKHhfZnJlcSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGdvdG8gcDA7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgdmFsdWVzWzNdICs9IGNmWzBdICogLXM7CisgICAgICAgICAgICAgICAgdmFsdWVzWzJdICs9IGNmWzFdICogIGM7CisgICAgICAgICAgICAgICAgdmFsdWVzWzFdICs9IGNmWzJdICogIHM7CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdICs9IGNmWzNdICogLWM7CisgICAgICAgICAgICAgICAgZ290byBwMTsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMl0gKz0gY2ZbMF0gKiAtczsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMV0gKz0gY2ZbMV0gKiAgYzsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0gKz0gY2ZbMl0gKiAgczsKKyAgICAgICAgICAgICAgICBnb3RvIHAyOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHZhbHVlc1sxXSArPSBjZlswXSAqIC1zOworICAgICAgICAgICAgICAgIHZhbHVlc1swXSArPSBjZlsxXSAqICBjOworICAgICAgICAgICAgICAgIGdvdG8gcDM7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgdmFsdWVzWzBdICs9IGNmWzBdICogLXM7CisgICAgICAgICAgICAgICAgZ290byBwNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmFsdWVzW3hfZnJlcSAtIDVdICs9IGNmWyAwXSAqIC1zOworICAgICAgICBwNDogdmFsdWVzW3hfZnJlcSAtIDRdICs9IGNmWyAxXSAqICBjOworICAgICAgICBwMzogdmFsdWVzW3hfZnJlcSAtIDNdICs9IGNmWyAyXSAqICBzOworICAgICAgICBwMjogdmFsdWVzW3hfZnJlcSAtIDJdICs9IGNmWyAzXSAqIC1jOworICAgICAgICBwMTogdmFsdWVzW3hfZnJlcSAtIDFdICs9IGNmWyA0XSAqIC1zOworICAgICAgICBwMDogdmFsdWVzW3hfZnJlcSAgICBdICs9IGNmWyA1XSAqICBjOworICAgICAgICAgICAgdmFsdWVzW3hfZnJlcSArIDFdICs9IGNmWyA2XSAqICBzOworICAgICAgICAgICAgdmFsdWVzW3hfZnJlcSArIDJdICs9IGNmWyA3XSAqIC1jOworICAgICAgICAgICAgdmFsdWVzW3hfZnJlcSArIDNdICs9IGNmWyA4XSAqIC1zOworICAgICAgICAgICAgdmFsdWVzW3hfZnJlcSArIDRdICs9IGNmWyA5XSAqICBjOworICAgICAgICAgICAgdmFsdWVzW3hfZnJlcSArIDVdICs9IGNmWzEwXSAqICBzOworICAgICAgICB9CisKKyAgICAgICAgdC0+cGhzW2NoXSArPSB0LT5waF9yb3Q7CisgICAgfQorfQorCisvKioKKyAqIFN5bnRoZXNpc2UgYWxsIHRvbmVzIGluIGFsbCBncm91cHMgZm9yIHRoZSBnaXZlbiByZXNpZHVhbCBzdWJmcmFtZQorICovCitzdGF0aWMgdm9pZCBiYXNlX2Z1bmNfc3ludGgoRENBTGJyRGVjb2RlciAqcywgaW50IGNoLCBmbG9hdCAqdmFsdWVzLCBpbnQgc2YpCit7CisgICAgaW50IGdyb3VwOworCisgICAgLy8gVG9uYWwgdnMgcmVzaWR1YWwgc2hpZnQgaXMgMjIgc3ViZnJhbWVzCisgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgNTsgZ3JvdXArKykgeworICAgICAgICBpbnQgZ3JvdXBfc2YgPSAocy0+ZnJhbWVudW0gPDwgZ3JvdXApICsgKChzZiAtIDIyKSA+PiAoNSAtIGdyb3VwKSk7CisgICAgICAgIGludCBzeW50aF9pZHggPSAoKCgoc2YgLSAyMikgJiAzMSkgPDwgZ3JvdXApICYgMzEpICsgKDEgPDwgZ3JvdXApIC0gMTsKKworICAgICAgICBzeW50aF90b25lcyhzLCBjaCwgdmFsdWVzLCBncm91cCwgKGdyb3VwX3NmIC0gMSkgJiAzMSwgMzAgLSBzeW50aF9pZHgpOworICAgICAgICBzeW50aF90b25lcyhzLCBjaCwgdmFsdWVzLCBncm91cCwgKGdyb3VwX3NmICAgICkgJiAzMSwgICAgICBzeW50aF9pZHgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtX2NoYW5uZWwoRENBTGJyRGVjb2RlciAqcywgaW50IGNoLCBmbG9hdCAqb3V0cHV0KQoreworICAgIExPQ0FMX0FMSUdORURfMzIoZmxvYXQsIHZhbHVlcywgW0RDQV9MQlJfU1VCQkFORFMgICAgXSwgWzRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGZsb2F0LCByZXN1bHQsIFtEQ0FfTEJSX1NVQkJBTkRTICogMl0sIFs0XSk7CisgICAgaW50IHNmLCBzYiwgbnN1YmJhbmRzID0gcy0+bnN1YmJhbmRzLCBub3V0c3ViYmFuZHMgPSA4IDw8IHMtPmZyZXFfcmFuZ2U7CisKKyAgICAvLyBDbGVhciBpbmFjdGl2ZSBzdWJiYW5kcworICAgIGlmIChuc3ViYmFuZHMgPCBub3V0c3ViYmFuZHMpCisgICAgICAgIG1lbXNldCh2YWx1ZXNbbnN1YmJhbmRzXSwgMCwgKG5vdXRzdWJiYW5kcyAtIG5zdWJiYW5kcykgKiBzaXplb2YodmFsdWVzWzBdKSk7CisKKyAgICBmb3IgKHNmID0gMDsgc2YgPCBEQ0FfTEJSX1RJTUVfU0FNUExFUyAvIDQ7IHNmKyspIHsKKyAgICAgICAgLy8gSHlicmlkIGZpbHRlcmJhbmsKKyAgICAgICAgcy0+ZGNhZHNwLT5sYnJfYmFuayh2YWx1ZXMsIHMtPnRpbWVfc2FtcGxlc1tjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfZGNhX2JhbmtfY29lZmYsIHNmICogNCwgbnN1YmJhbmRzKTsKKworICAgICAgICBiYXNlX2Z1bmNfc3ludGgocywgY2gsIHZhbHVlc1swXSwgc2YpOworCisgICAgICAgIHMtPmltZGN0LmltZGN0X2NhbGMoJnMtPmltZGN0LCByZXN1bHRbMF0sIHZhbHVlc1swXSk7CisKKyAgICAgICAgLy8gTG9uZyB3aW5kb3cgYW5kIG92ZXJsYXAtYWRkCisgICAgICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsX2FkZChvdXRwdXQsIHJlc3VsdFswXSwgcy0+d2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGlzdG9yeVtjaF0sIG5vdXRzdWJiYW5kcyAqIDQpOworICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKHMtPmhpc3RvcnlbY2hdLCByZXN1bHRbbm91dHN1YmJhbmRzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aW5kb3csIG5vdXRzdWJiYW5kcyAqIDQpOworICAgICAgICBvdXRwdXQgKz0gbm91dHN1YmJhbmRzICogNDsKKyAgICB9CisKKyAgICAvLyBVcGRhdGUgaGlzdG9yeSBmb3IgTFBDIGFuZCBmb3J3YXJkIE1EQ1QKKyAgICBmb3IgKHNiID0gMDsgc2IgPCBuc3ViYmFuZHM7IHNiKyspIHsKKyAgICAgICAgZmxvYXQgKnNhbXBsZXMgPSBzLT50aW1lX3NhbXBsZXNbY2hdW3NiXSAtIERDQV9MQlJfVElNRV9ISVNUT1JZOworICAgICAgICBtZW1jcHkoc2FtcGxlcywgc2FtcGxlcyArIERDQV9MQlJfVElNRV9TQU1QTEVTLCBEQ0FfTEJSX1RJTUVfSElTVE9SWSAqIHNpemVvZihmbG9hdCkpOworICAgIH0KK30KKworaW50IGZmX2RjYV9sYnJfZmlsdGVyX2ZyYW1lKERDQUxickRlY29kZXIgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OworICAgIGludCBpLCByZXQsIG5jaGFubmVscywgY2hfY29uZiA9IChzLT5jaF9tYXNrICYgMHg3KSAtIDE7CisgICAgY29uc3QgaW50OF90ICpyZW9yZGVyOworCisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbF9sYXlvdXRzW2NoX2NvbmZdOworICAgIGF2Y3R4LT5jaGFubmVscyA9IG5jaGFubmVscyA9IGNoYW5uZWxfY291bnRzW2NoX2NvbmZdOworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9GTFRQOworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMDsKKyAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfRFRTX0VYUFJFU1M7CisgICAgYXZjdHgtPmJpdF9yYXRlID0gcy0+Yml0X3JhdGVfc2NhbGVkOworCisgICAgaWYgKHMtPmZsYWdzICYgTEJSX0ZMQUdfTEZFX1BSRVNFTlQpIHsKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0IHw9IEFWX0NIX0xPV19GUkVRVUVOQ1k7CisgICAgICAgIGF2Y3R4LT5jaGFubmVscysrOworICAgICAgICByZW9yZGVyID0gY2hhbm5lbF9yZW9yZGVyX2xmZVtjaF9jb25mXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZW9yZGVyID0gY2hhbm5lbF9yZW9yZGVyX25vbGZlW2NoX2NvbmZdOworICAgIH0KKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gMTAyNCA8PCBzLT5mcmVxX3JhbmdlOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvLyBGaWx0ZXIgZnVsbGJhbmQgY2hhbm5lbHMKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPm5jaGFubmVscyArIDEpIC8gMjsgaSsrKSB7CisgICAgICAgIGludCBjaDEgPSBpICogMjsKKyAgICAgICAgaW50IGNoMiA9IEZGTUlOKGNoMSArIDEsIHMtPm5jaGFubmVscyAtIDEpOworCisgICAgICAgIGRlY29kZV9ncmlkKHMsIGNoMSwgY2gyKTsKKworICAgICAgICByYW5kb21fdHMocywgY2gxLCBjaDIpOworCisgICAgICAgIGZpbHRlcl90cyhzLCBjaDEsIGNoMik7CisKKyAgICAgICAgaWYgKGNoMSAhPSBjaDIgJiYgKHMtPnBhcnRfc3RlcmVvX3ByZXMgJiAoMSA8PCBjaDEpKSkKKyAgICAgICAgICAgIGRlY29kZV9wYXJ0X3N0ZXJlbyhzLCBjaDEsIGNoMik7CisKKyAgICAgICAgaWYgKGNoMSA8IG5jaGFubmVscykKKyAgICAgICAgICAgIHRyYW5zZm9ybV9jaGFubmVsKHMsIGNoMSwgKGZsb2F0ICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbcmVvcmRlcltjaDFdXSk7CisKKyAgICAgICAgaWYgKGNoMSAhPSBjaDIgJiYgY2gyIDwgbmNoYW5uZWxzKQorICAgICAgICAgICAgdHJhbnNmb3JtX2NoYW5uZWwocywgY2gyLCAoZmxvYXQgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtyZW9yZGVyW2NoMl1dKTsKKyAgICB9CisKKyAgICAvLyBJbnRlcnBvbGF0ZSBMRkUgY2hhbm5lbAorICAgIGlmIChzLT5mbGFncyAmIExCUl9GTEFHX0xGRV9QUkVTRU5UKSB7CisgICAgICAgIHMtPmRjYWRzcC0+bGZlX2lpcigoZmxvYXQgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtsZmVfaW5kZXhbY2hfY29uZl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGZlX2RhdGEsIGZmX2RjYV9sZmVfaWlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGZlX2hpc3RvcnksIDE2IDw8IHMtPmZyZXFfcmFuZ2UpOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfc2lkZV9kYXRhX3VwZGF0ZV9tYXRyaXhfZW5jb2RpbmcoZnJhbWUsIEFWX01BVFJJWF9FTkNPRElOR19OT05FKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9kY2FfbGJyX2ZsdXNoKERDQUxickRlY29kZXIgKnMpCit7CisgICAgaW50IGNoLCBzYjsKKworICAgIGlmICghcy0+c2FtcGxlX3JhdGUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIENsZWFyIGhpc3RvcnkKKyAgICBtZW1zZXQocy0+cGFydF9zdGVyZW8sIDE2LCBzaXplb2Yocy0+cGFydF9zdGVyZW8pKTsKKyAgICBtZW1zZXQocy0+bHBjX2NvZWZmLCAwLCBzaXplb2Yocy0+bHBjX2NvZWZmKSk7CisgICAgbWVtc2V0KHMtPmhpc3RvcnksIDAsIHNpemVvZihzLT5oaXN0b3J5KSk7CisgICAgbWVtc2V0KHMtPnRvbmFsX2JvdW5kcywgMCwgc2l6ZW9mKHMtPnRvbmFsX2JvdW5kcykpOworICAgIG1lbXNldChzLT5sZmVfaGlzdG9yeSwgMCwgc2l6ZW9mKHMtPmxmZV9oaXN0b3J5KSk7CisgICAgcy0+ZnJhbWVudW0gPSAwOworICAgIHMtPm50b25lcyA9IDA7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgcy0+bnN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICBmbG9hdCAqc2FtcGxlcyA9IHMtPnRpbWVfc2FtcGxlc1tjaF1bc2JdIC0gRENBX0xCUl9USU1FX0hJU1RPUlk7CisgICAgICAgICAgICBtZW1zZXQoc2FtcGxlcywgMCwgRENBX0xCUl9USU1FX0hJU1RPUlkgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYXZfY29sZCBpbnQgZmZfZGNhX2xicl9pbml0KERDQUxickRlY29kZXIgKnMpCit7CisgICAgaW5pdF90YWJsZXMoKTsKKworICAgIGlmICghKHMtPmZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKDApKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcy0+bGJyX3JhbmQgPSAxOworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIHZvaWQgZmZfZGNhX2xicl9jbG9zZShEQ0FMYnJEZWNvZGVyICpzKQoreworICAgIHMtPnNhbXBsZV9yYXRlID0gMDsKKworICAgIGF2X2ZyZWVwKCZzLT50c19idWZmZXIpOworICAgIHMtPnRzX3NpemUgPSAwOworCisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworICAgIGZmX21kY3RfZW5kKCZzLT5pbWRjdCk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjYV9sYnIuaCBiL2xpYmF2Y29kZWMvZGNhX2xici5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNGMwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2RjYV9sYnIuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBmb284NgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRENBX0xCUl9ICisjZGVmaW5lIEFWQ09ERUNfRENBX0xCUl9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZGNhLmgiCisjaW5jbHVkZSAiZGNhX2V4c3MuaCIKKyNpbmNsdWRlICJkY2Fkc3AuaCIKKyNpbmNsdWRlICJmZnQuaCIKKworI2RlZmluZSBEQ0FfTEJSX0NIQU5ORUxTICAgICAgICA2CisjZGVmaW5lIERDQV9MQlJfQ0hBTk5FTFNfVE9UQUwgIDMyCisjZGVmaW5lIERDQV9MQlJfU1VCQkFORFMgICAgICAgIDMyCisjZGVmaW5lIERDQV9MQlJfVE9ORVMgICAgICAgICAgIDUxMgorCisjZGVmaW5lIERDQV9MQlJfVElNRV9TQU1QTEVTICAgIDEyOAorI2RlZmluZSBEQ0FfTEJSX1RJTUVfSElTVE9SWSAgICA4CisKK2VudW0gRENBTEJSSGVhZGVyIHsKKyAgICBEQ0FfTEJSX0hFQURFUl9TWU5DX09OTFkgICAgPSAxLAorICAgIERDQV9MQlJfSEVBREVSX0RFQ09ERVJfSU5JVCA9IDIKK307CisKK3R5cGVkZWYgc3RydWN0IERDQUxiclRvbmUgeworICAgIHVpbnQ4X3QgICAgIHhfZnJlcTsgICAgIC8vLzwgU3BlY3RyYWwgbGluZSBvZmZzZXQKKyAgICB1aW50OF90ICAgICBmX2RlbHQ7ICAgICAvLy88IERpZmZlcmVuY2UgYmV0d2VlbiBvcmlnaW5hbCBhbmQgY2VudGVyIGZyZXF1ZW5jeQorICAgIHVpbnQ4X3QgICAgIHBoX3JvdDsgICAgIC8vLzwgUGhhc2Ugcm90YXRpb24KKyAgICB1aW50OF90ICAgICBwYWQ7ICAgICAgICAvLy88IFBhZGRpbmcgZmllbGQKKyAgICB1aW50OF90ICAgICBhbXBbRENBX0xCUl9DSEFOTkVMU107ICAvLy88IFBlci1jaGFubmVsIGFtcGxpdHVkZQorICAgIHVpbnQ4X3QgICAgIHBoc1tEQ0FfTEJSX0NIQU5ORUxTXTsgIC8vLzwgUGVyLWNoYW5uZWwgcGhhc2UKK30gRENBTGJyVG9uZTsKKwordHlwZWRlZiBzdHJ1Y3QgRENBTGJyRGVjb2RlciB7CisgICAgQVZDb2RlY0NvbnRleHQgICphdmN0eDsKKyAgICBHZXRCaXRDb250ZXh0ICAgZ2I7CisKKyAgICBpbnQgICAgIHNhbXBsZV9yYXRlOyAgICAgICAgLy8vPCBTYW1wbGUgcmF0ZSBvZiBMQlIgYXVkaW8KKyAgICBpbnQgICAgIGNoX21hc2s7ICAgICAgICAgICAgLy8vPCBMQlIgc3BlYWtlciBtYXNrCisgICAgaW50ICAgICBmbGFnczsgICAgICAgICAgICAgIC8vLzwgRmxhZ3MgZm9yIExCUiBkZWNvZGVyIGluaXRpYWxpemF0aW9uCisgICAgaW50ICAgICBiaXRfcmF0ZV9vcmlnOyAgICAgIC8vLzwgT3JpZ2luYWwgYml0IHJhdGUKKyAgICBpbnQgICAgIGJpdF9yYXRlX3NjYWxlZDsgICAgLy8vPCBTY2FsZWQgYml0IHJhdGUKKworICAgIGludCAgICAgbmNoYW5uZWxzOyAgICAgICAgICAvLy88IE51bWJlciBvZiBmdWxsYmFuZCBjaGFubmVscyB0byBkZWNvZGUKKyAgICBpbnQgICAgIG5jaGFubmVsc190b3RhbDsgICAgLy8vPCBUb3RhbCBudW1iZXIgb2YgZnVsbGJhbmQgY2hhbm5lbHMKKyAgICBpbnQgICAgIGZyZXFfcmFuZ2U7ICAgICAgICAgLy8vPCBGcmVxdWVuY3kgcmFuZ2Ugb2YgTEJSIGF1ZGlvCisgICAgaW50ICAgICBiYW5kX2xpbWl0OyAgICAgICAgIC8vLzwgQmFuZCBsaW1pdCBmYWN0b3IKKyAgICBpbnQgICAgIGxpbWl0ZWRfcmF0ZTsgICAgICAgLy8vPCBCYW5kIGxpbWl0ZWQgc2FtcGxlIHJhdGUKKyAgICBpbnQgICAgIGxpbWl0ZWRfcmFuZ2U7ICAgICAgLy8vPCBCYW5kIGxpbWl0ZWQgZnJlcXVlbmN5IHJhbmdlCisgICAgaW50ICAgICByZXNfcHJvZmlsZTsgICAgICAgIC8vLzwgUmVzb2x1dGlvbiBwcm9maWxlCisgICAgaW50ICAgICBuc3ViYmFuZHM7ICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIGVuY29kZWQgc3ViYmFuZHMKKyAgICBpbnQgICAgIGczX2F2Z19vbmx5X3N0YXJ0X3NiOyAgIC8vLzwgU3ViYmFuZCBpbmRleCB3aGVyZSBncmlkIDMgc2NhbGUgZmFjdG9ycyBlbmQKKyAgICBpbnQgICAgIG1pbl9tb25vX3N1YmJhbmQ7ICAgLy8vPCBTdWJiYW5kIGluZGV4IHdoZXJlIG1vbm8gZW5jb2Rpbmcgc3RhcnRzCisgICAgaW50ICAgICBtYXhfbW9ub19zdWJiYW5kOyAgIC8vLzwgU3ViYmFuZCBpbmRleCB3aGVyZSBtb25vIGVuY29kaW5nIGVuZHMKKworICAgIGludCAgICAgZnJhbWVudW07ICAgLy8vPCBMb3dlciA1IGJpdHMgb2YgY3VycmVudCBmcmFtZSBudW1iZXIKKyAgICBpbnQgICAgIGxicl9yYW5kOyAgIC8vLzwgU2VlZCBmb3Igc3ViYmFuZCByYW5kb21pemF0aW9uCisgICAgaW50ICAgICB3YXJuZWQ7ICAgICAvLy88IEZsYWdzIGZvciB3YXJuaW5nIHN1cHByZXNzaW9uCisKKyAgICB1aW50OF90ICAgICBxdWFudF9sZXZlbHNbRENBX0xCUl9DSEFOTkVMUyAvIDJdW0RDQV9MQlJfU1VCQkFORFNdOyAgIC8vLzwgUXVhbnRpemF0aW9uIGxldmVscworICAgIHVpbnQ4X3QgICAgIHNiX2luZGljZXNbRENBX0xCUl9TVUJCQU5EU107ICAgLy8vPCBTdWJiYW5kIHJlb3JkZXJpbmcgaW5kaWNlcworCisgICAgdWludDhfdCAgICAgc2VjX2NoX3NibXNbRENBX0xCUl9DSEFOTkVMUyAvIDJdW0RDQV9MQlJfU1VCQkFORFNdOyAgICAvLy88IFJpZ2h0IGNoYW5uZWwgaW52ZXJzaW9uIG9yIG1pZC9zaWRlIGRlY29kaW5nIGZsYWdzCisgICAgdWludDhfdCAgICAgc2VjX2NoX2xybXNbRENBX0xCUl9DSEFOTkVMUyAvIDJdW0RDQV9MQlJfU1VCQkFORFNdOyAgICAvLy88IEZsYWdzIGluZGljYXRpbmcgaWYgbGVmdC9yaWdodCBjaGFubmVsIGFyZSBzd2FwcGVkCisgICAgdWludDMyX3QgICAgY2hfcHJlc1tEQ0FfTEJSX0NIQU5ORUxTXTsgIC8vLzwgU3ViYmFuZCBhbGxvY2F0aW9uIGZsYWdzCisKKyAgICB1aW50OF90ICAgICBncmlkXzFfc2NmW0RDQV9MQlJfQ0hBTk5FTFNdWzEyXVs4XTsgICAgLy8vPCBHcmlkIDEgc2NhbGUgZmFjdG9ycworICAgIHVpbnQ4X3QgICAgIGdyaWRfMl9zY2ZbRENBX0xCUl9DSEFOTkVMU11bM11bNjRdOyAgICAvLy88IEdyaWQgMiBzY2FsZSBmYWN0b3JzCisKKyAgICBpbnQ4X3QgICAgICBncmlkXzNfYXZnW0RDQV9MQlJfQ0hBTk5FTFNdW0RDQV9MQlJfU1VCQkFORFMgLSA0XTsgICAgIC8vLzwgR3JpZCAzIGF2ZXJhZ2UgdmFsdWVzCisgICAgaW50OF90ICAgICAgZ3JpZF8zX3NjZltEQ0FfTEJSX0NIQU5ORUxTXVtEQ0FfTEJSX1NVQkJBTkRTIC0gNF1bOF07ICAvLy88IEdyaWQgMyBzY2FsZSBmYWN0b3JzCisgICAgdWludDMyX3QgICAgZ3JpZF8zX3ByZXNbRENBX0xCUl9DSEFOTkVMU107ICAvLy88IEdyaWQgMyBzY2FsZSBmYWN0b3JzIHByZXNlbmNlIGZsYWdzCisKKyAgICB1aW50OF90ICAgICBoaWdoX3Jlc19zY2ZbRENBX0xCUl9DSEFOTkVMU11bRENBX0xCUl9TVUJCQU5EU11bOF07ICAgIC8vLzwgSGlnaC1mcmVxdWVuY3kgcmVzb2x1dGlvbiBzY2FsZSBmYWN0b3JzCisKKyAgICB1aW50OF90ICAgICBwYXJ0X3N0ZXJlb1tEQ0FfTEJSX0NIQU5ORUxTXVtEQ0FfTEJSX1NVQkJBTkRTIC8gNF1bNV07IC8vLzwgUGFydGlhbCBzdGVyZW8gY29lZmZpY2llbnRzCisgICAgdWludDhfdCAgICAgcGFydF9zdGVyZW9fcHJlczsgICAvLy88IFBhcnRpYWwgc3RlcmVvIGNvZWZmaWNpZW50cyBwcmVzZW5jZSBmbGFncworCisgICAgZmxvYXQgICAgICAgbHBjX2NvZWZmWzJdW0RDQV9MQlJfQ0hBTk5FTFNdWzNdWzJdWzhdOyAgICAvLy88IFByZWRpY3RvciBjb2VmZmljaWVudHMKKworICAgIGZsb2F0ICAgICAgIHNiX3NjZltEQ0FfTEJSX1NVQkJBTkRTXTsgICAvLy88IFN1YmJhbmQgcmFuZG9taXphdGlvbiBzY2FsZSBmYWN0b3JzCisKKyAgICBmbG9hdCAgICAgICAqdGltZV9zYW1wbGVzW0RDQV9MQlJfQ0hBTk5FTFNdW0RDQV9MQlJfU1VCQkFORFNdOyAvLy88IFRpbWUgc2FtcGxlcworCisgICAgZmxvYXQgICAgICAgICAgICp0c19idWZmZXI7IC8vLzwgVGltZSBzYW1wbGUgYnVmZmVyIGJhc2UKKyAgICB1bnNpZ25lZCBpbnQgICAgdHNfc2l6ZTsgICAgLy8vPCBUaW1lIHNhbXBsZSBidWZmZXIgc2l6ZQorCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgaGlzdG9yeSlbRENBX0xCUl9DSEFOTkVMU11bRENBX0xCUl9TVUJCQU5EUyAqIDRdOyAgICAvLy88IElNRENUIGhpc3RvcnkKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCB3aW5kb3cpW0RDQV9MQlJfU1VCQkFORFMgKiA0XTsgICAvLy88IExvbmcgd2luZG93IGZvciBJTURDVAorCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgbGZlX2RhdGEpWzY0XTsgICAgICAgLy8vPCBEZWNpbWF0ZWQgTEZFIHNhbXBsZXMKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBsZmVfaGlzdG9yeSlbNV1bMl07ICAvLy88IExGRSBJSVIgZmlsdGVyIGhpc3RvcnkKKyAgICBmbG9hdCBsZmVfc2NhbGU7ICAgIC8vLzwgU2NhbGUgZmFjdG9yIG9mIExGRSBzYW1wbGVzIGJlZm9yZSBJSVIgZmlsdGVyCisKKyAgICB1aW50OF90ICAgICB0b25hbF9zY2ZbNl07ICAgICAgICAgICAvLy88IFRvbmFsIHNjYWxlIGZhY3RvcnMKKyAgICB1aW50MTZfdCAgICB0b25hbF9ib3VuZHNbNV1bMzJdWzJdOyAvLy88IFBlci1ncm91cCBwZXItc3ViZnJhbWUgc3RhcnQvZW5kIHBvc2l0aW9ucyBvZiB0b25lcworICAgIERDQUxiclRvbmUgIHRvbmVzW0RDQV9MQlJfVE9ORVNdOyAgIC8vLzwgQ2lyY3VsYXIgYnVmZmVyIG9mIHRvbmVzCisgICAgaW50ICAgICAgICAgbnRvbmVzOyAgICAgICAgICAgICAgICAgLy8vPCBDaXJjdWxhciBidWZmZXIgaGVhZCBwb3NpdGlvbgorCisgICAgRkZUQ29udGV4dCAgICAgICAgICBpbWRjdDsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAgICpmZHNwOworICAgIERDQURTUENvbnRleHQgICAgICAgKmRjYWRzcDsKK30gRENBTGJyRGVjb2RlcjsKKworaW50IGZmX2RjYV9sYnJfcGFyc2UoRENBTGJyRGVjb2RlciAqcywgdWludDhfdCAqZGF0YSwgRENBRXhzc0Fzc2V0ICphc3NldCk7CitpbnQgZmZfZGNhX2xicl9maWx0ZXJfZnJhbWUoRENBTGJyRGVjb2RlciAqcywgQVZGcmFtZSAqZnJhbWUpOworYXZfY29sZCB2b2lkIGZmX2RjYV9sYnJfZmx1c2goRENBTGJyRGVjb2RlciAqcyk7Cithdl9jb2xkIGludCBmZl9kY2FfbGJyX2luaXQoRENBTGJyRGVjb2RlciAqcyk7Cithdl9jb2xkIHZvaWQgZmZfZGNhX2xicl9jbG9zZShEQ0FMYnJEZWNvZGVyICpzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjYV9wYXJzZXIuYyBiL2xpYmF2Y29kZWMvZGNhX3BhcnNlci5jCmluZGV4IGJkZTdkZmUuLjgwZDY2NTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGNhX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvZGNhX3BhcnNlci5jCkBAIC0yMyw2ICsyMyw5IEBACiAgKi8KIAogI2luY2x1ZGUgImRjYS5oIgorI2luY2x1ZGUgImRjYV9jb3JlLmgiCisjaW5jbHVkZSAiZGNhX2V4c3MuaCIKKyNpbmNsdWRlICJkY2FfbGJyLmgiCiAjaW5jbHVkZSAiZGNhX3N5bmN3b3Jkcy5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAicGFyc2VyLmgiCkBAIC0zMiw2ICszNSw5IEBACiAgICAgdWludDMyX3QgbGFzdG1hcmtlcjsKICAgICBpbnQgc2l6ZTsKICAgICBpbnQgZnJhbWVzaXplOworICAgIHVuc2lnbmVkIGludCBzdGFydHBvczsKKyAgICBEQ0FFeHNzUGFyc2VyIGV4c3M7CisgICAgdW5zaWduZWQgaW50IHNyX2NvZGU7CiB9IERDQVBhcnNlQ29udGV4dDsKIAogI2RlZmluZSBJU19DT1JFX01BUktFUihzdGF0ZSkgXApAQCAtNDcsNiArNTMsMTQgQEAKICNkZWZpbmUgQ09SRV9NQVJLRVIoc3RhdGUpICAgICAgKChzdGF0ZSA+PiAxNikgJiAweEZGRkZGRkZGKQogI2RlZmluZSBFWFNTX01BUktFUihzdGF0ZSkgICAgICAoc3RhdGUgJiAweEZGRkZGRkZGKQogCisjZGVmaW5lIFNUQVRFX0xFKHN0YXRlKSAgICAgKCgoc3RhdGUgJiAweEZGMDBGRjAwKSA+PiA4KSB8ICgoc3RhdGUgJiAweDAwRkYwMEZGKSA8PCA4KSkKKyNkZWZpbmUgU1RBVEVfMTQoc3RhdGUpICAgICAoKChzdGF0ZSAmIDB4M0ZGRjAwMDApID4+IDgpIHwgKChzdGF0ZSAmIDB4MDAwMDNGRkYpID4+IDYpKQorCisjZGVmaW5lIENPUkVfRlJBTUVTSVpFKHN0YXRlKSAgICgoKHN0YXRlID4+IDQpICYgMHgzRkZGKSArIDEpCisjZGVmaW5lIEVYU1NfRlJBTUVTSVpFKHN0YXRlKSAgICgoc3RhdGUgJiAweDIwMDAwMDAwMDApID8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdGF0ZSA+PiAgNSkgJiAweEZGRkZGKSArIDEgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0YXRlID4+IDEzKSAmIDB4MEZGRkYpICsgMSkKKwogLyoqCiAgKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWUgaW4gdGhlIGJpdHN0cmVhbS4KICAqIEByZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBuZXh0IGZyYW1lLCBvciAtMQpAQCAtNTQsNDEgKzY4LDEwNSBAQAogc3RhdGljIGludCBkY2FfZmluZF9mcmFtZV9lbmQoRENBUGFyc2VDb250ZXh0ICpwYzEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSkKIHsKLSAgICBpbnQgc3RhcnRfZm91bmQsIGk7CisgICAgaW50IHN0YXJ0X2ZvdW5kLCBzaXplLCBpOwogICAgIHVpbnQ2NF90IHN0YXRlOwogICAgIFBhcnNlQ29udGV4dCAqcGMgPSAmcGMxLT5wYzsKIAogICAgIHN0YXJ0X2ZvdW5kID0gcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kOwogICAgIHN0YXRlICAgICAgID0gcGMtPnN0YXRlNjQ7CisgICAgc2l6ZSAgICAgICAgPSBwYzEtPnNpemU7CiAKICAgICBpID0gMDsKICAgICBpZiAoIXN0YXJ0X2ZvdW5kKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrKSB7CisgICAgICAgIGZvciAoOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICAgICAgc2l6ZSsrOwogICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBidWZbaV07Ci0gICAgICAgICAgICBpZiAoSVNfTUFSS0VSKHN0YXRlKSkgewotICAgICAgICAgICAgICAgIGlmICghcGMxLT5sYXN0bWFya2VyIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBjMS0+bGFzdG1hcmtlciA9PSBDT1JFX01BUktFUihzdGF0ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcGMxLT5sYXN0bWFya2VyID09IERDQV9TWU5DV09SRF9TVUJTVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhcnRfZm91bmQgPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoSVNfRVhTU19NQVJLRVIoc3RhdGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgcGMxLT5sYXN0bWFya2VyID0gRVhTU19NQVJLRVIoc3RhdGUpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwYzEtPmxhc3RtYXJrZXIgPSBDT1JFX01BUktFUihzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSVNfTUFSS0VSKHN0YXRlKSAmJgorICAgICAgICAgICAgICAgICghcGMxLT5sYXN0bWFya2VyIHx8CisgICAgICAgICAgICAgICAgICBwYzEtPmxhc3RtYXJrZXIgPT0gQ09SRV9NQVJLRVIoc3RhdGUpIHx8CisgICAgICAgICAgICAgICAgICBwYzEtPmxhc3RtYXJrZXIgPT0gRENBX1NZTkNXT1JEX1NVQlNUUkVBTSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBjMS0+bGFzdG1hcmtlcikKKyAgICAgICAgICAgICAgICAgICAgcGMxLT5zdGFydHBvcyA9IElTX0VYU1NfTUFSS0VSKHN0YXRlKSA/IHNpemUgLSA0IDogc2l6ZSAtIDY7CisKKyAgICAgICAgICAgICAgICBpZiAoSVNfRVhTU19NQVJLRVIoc3RhdGUpKQorICAgICAgICAgICAgICAgICAgICBwYzEtPmxhc3RtYXJrZXIgPSBFWFNTX01BUktFUihzdGF0ZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwYzEtPmxhc3RtYXJrZXIgPSBDT1JFX01BUktFUihzdGF0ZSk7CisKKyAgICAgICAgICAgICAgICBzdGFydF9mb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgPSAwOworCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiAgICAgaWYgKHN0YXJ0X2ZvdW5kKSB7CiAgICAgICAgIGZvciAoOyBpIDwgYnVmX3NpemU7IGkrKykgewotICAgICAgICAgICAgcGMxLT5zaXplKys7CisgICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGJ1ZltpXTsKKworICAgICAgICAgICAgaWYgKHN0YXJ0X2ZvdW5kID09IDEpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHBjMS0+bGFzdG1hcmtlcikgeworICAgICAgICAgICAgICAgIGNhc2UgRENBX1NZTkNXT1JEX0NPUkVfQkU6CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjMS0+ZnJhbWVzaXplID0gQ09SRV9GUkFNRVNJWkUoc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfZm91bmQgICAgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRENBX1NZTkNXT1JEX0NPUkVfTEU6CisgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjMS0+ZnJhbWVzaXplID0gQ09SRV9GUkFNRVNJWkUoU1RBVEVfTEUoc3RhdGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2ZvdW5kICAgID0gNDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIERDQV9TWU5DV09SRF9DT1JFXzE0Ql9CRToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGMxLT5mcmFtZXNpemUgPSBDT1JFX0ZSQU1FU0laRShTVEFURV8xNChzdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfZm91bmQgICAgPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRENBX1NZTkNXT1JEX0NPUkVfMTRCX0xFOgorICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYzEtPmZyYW1lc2l6ZSA9IENPUkVfRlJBTUVTSVpFKFNUQVRFXzE0KFNUQVRFX0xFKHN0YXRlKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfZm91bmQgICAgPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRENBX1NZTkNXT1JEX1NVQlNUUkVBTToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgcGMxLT5mcmFtZXNpemUgPSBFWFNTX0ZSQU1FU0laRShzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9mb3VuZCAgICA9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGFydF9mb3VuZCA9PSAyICYmIElTX0VYU1NfTUFSS0VSKHN0YXRlKSAmJgorICAgICAgICAgICAgICAgIHBjMS0+ZnJhbWVzaXplIDw9IHNpemUgKyAyKSB7CisgICAgICAgICAgICAgICAgcGMxLT5mcmFtZXNpemUgID0gc2l6ZSArIDI7CisgICAgICAgICAgICAgICAgc3RhcnRfZm91bmQgICAgID0gMzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0YXJ0X2ZvdW5kID09IDMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSBwYzEtPmZyYW1lc2l6ZSArIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGMxLT5mcmFtZXNpemUgKz0gRVhTU19GUkFNRVNJWkUoc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBzdGFydF9mb3VuZCAgICAgPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBjMS0+ZnJhbWVzaXplID4gc2l6ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKwogICAgICAgICAgICAgaWYgKElTX01BUktFUihzdGF0ZSkgJiYKICAgICAgICAgICAgICAgICAocGMxLT5sYXN0bWFya2VyID09IENPUkVfTUFSS0VSKHN0YXRlKSB8fAogICAgICAgICAgICAgICAgICBwYzEtPmxhc3RtYXJrZXIgPT0gRENBX1NZTkNXT1JEX1NVQlNUUkVBTSkpIHsKLSAgICAgICAgICAgICAgICBpZiAocGMxLT5mcmFtZXNpemUgPiBwYzEtPnNpemUpCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CiAgICAgICAgICAgICAgICAgcGMtPnN0YXRlNjQgICAgICAgICAgID0gLTE7CiAgICAgICAgICAgICAgICAgcGMxLT5zaXplICAgICAgICAgICAgID0gMDsKQEAgLTk2LDggKzE3NCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gc3RhcnRfZm91bmQ7CiAgICAgcGMtPnN0YXRlNjQgICAgICAgICAgID0gc3RhdGU7CisgICAgcGMxLT5zaXplICAgICAgICAgICAgID0gc2l6ZTsKICAgICByZXR1cm4gRU5EX05PVF9GT1VORDsKIH0KIApAQCAtMTA2LDM5ICsxODYsMTE5IEBACiAgICAgRENBUGFyc2VDb250ZXh0ICpwYzEgPSBzLT5wcml2X2RhdGE7CiAKICAgICBwYzEtPmxhc3RtYXJrZXIgPSAwOworICAgIHBjMS0+c3JfY29kZSA9IC0xOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRjYV9wYXJzZV9wYXJhbXMoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCAqZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzYW1wbGVfcmF0ZSwgaW50ICpmcmFtZXNpemUpCitzdGF0aWMgaW50IGRjYV9wYXJzZV9wYXJhbXMoRENBUGFyc2VDb250ZXh0ICpwYzEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIGludCAqZHVyYXRpb24sIGludCAqc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwcm9maWxlKQogeworICAgIERDQUV4c3NBc3NldCAqYXNzZXQgPSAmcGMxLT5leHNzLmFzc2V0c1swXTsKICAgICBHZXRCaXRDb250ZXh0IGdiOwotICAgIHVpbnQ4X3QgaGRyWzEyICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0gPSB7IDAgfTsKLSAgICBpbnQgcmV0LCBzYW1wbGVfYmxvY2tzLCBzcl9jb2RlOworICAgIERDQUNvcmVGcmFtZUhlYWRlciBoOworICAgIHVpbnQ4X3QgaGRyW0RDQV9DT1JFX0ZSQU1FX0hFQURFUl9TSVpFICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0gPSB7IDAgfTsKKyAgICBpbnQgcmV0LCBmcmFtZV9zaXplOwogCi0gICAgaWYgKGJ1Zl9zaXplIDwgMTIpCisgICAgaWYgKGJ1Zl9zaXplIDwgRENBX0NPUkVfRlJBTUVfSEVBREVSX1NJWkUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgaWYgKChyZXQgPSBhdnByaXZfZGNhX2NvbnZlcnRfYml0c3RyZWFtKGJ1ZiwgMTIsIGhkciwgMTIpKSA8IDApCisgICAgaWYgKEFWX1JCMzIoYnVmKSA9PSBEQ0FfU1lOQ1dPUkRfU1VCU1RSRUFNKSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfZGNhX2V4c3NfcGFyc2UoJnBjMS0+ZXhzcywgYnVmLCBidWZfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGFzc2V0LT5leHRlbnNpb25fbWFzayAmIERDQV9FWFNTX0xCUikgeworICAgICAgICAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZiArIGFzc2V0LT5sYnJfb2Zmc2V0LCBhc3NldC0+bGJyX3NpemUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xvbmcoJmdiLCAzMikgIT0gRENBX1NZTkNXT1JEX0xCUikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgc3dpdGNoIChnZXRfYml0cygmZ2IsIDgpKSB7CisgICAgICAgICAgICBjYXNlIERDQV9MQlJfSEVBREVSX0RFQ09ERVJfSU5JVDoKKyAgICAgICAgICAgICAgICBwYzEtPnNyX2NvZGUgPSBnZXRfYml0cygmZ2IsIDgpOworICAgICAgICAgICAgY2FzZSBEQ0FfTEJSX0hFQURFUl9TWU5DX09OTFk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGMxLT5zcl9jb2RlID49IEZGX0FSUkFZX0VMRU1TKGZmX2RjYV9zYW1wbGluZ19mcmVxcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICpzYW1wbGVfcmF0ZSA9IGZmX2RjYV9zYW1wbGluZ19mcmVxc1twYzEtPnNyX2NvZGVdOworICAgICAgICAgICAgKmR1cmF0aW9uID0gMTAyNCA8PCBmZl9kY2FfZnJlcV9yYW5nZXNbcGMxLT5zcl9jb2RlXTsKKyAgICAgICAgICAgICpwcm9maWxlID0gRkZfUFJPRklMRV9EVFNfRVhQUkVTUzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFzc2V0LT5leHRlbnNpb25fbWFzayAmIERDQV9FWFNTX1hMTCkgeworICAgICAgICAgICAgaW50IG5zYW1wbGVzX2xvZzI7CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBidWYgKyBhc3NldC0+eGxsX29mZnNldCwgYXNzZXQtPnhsbF9zaXplKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sb25nKCZnYiwgMzIpICE9IERDQV9TWU5DV09SRF9YTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0cygmZ2IsIDQpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBza2lwX2JpdHMoJmdiLCA4KTsKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgZ2V0X2JpdHMoJmdiLCA1KSArIDEpOworICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgNCk7CisgICAgICAgICAgICBuc2FtcGxlc19sb2cyID0gZ2V0X2JpdHMoJmdiLCA0KSArIGdldF9iaXRzKCZnYiwgNCk7CisgICAgICAgICAgICBpZiAobnNhbXBsZXNfbG9nMiA+IDI0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAqc2FtcGxlX3JhdGUgPSBhc3NldC0+bWF4X3NhbXBsZV9yYXRlOworICAgICAgICAgICAgKmR1cmF0aW9uID0gKDEgKyAoKnNhbXBsZV9yYXRlID4gOTYwMDApKSA8PCBuc2FtcGxlc19sb2cyOworICAgICAgICAgICAgKnByb2ZpbGUgPSBGRl9QUk9GSUxFX0RUU19IRF9NQTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdnByaXZfZGNhX2NvbnZlcnRfYml0c3RyZWFtKGJ1ZiwgRENBX0NPUkVfRlJBTUVfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkciwgRENBX0NPUkVfRlJBTUVfSEVBREVSX1NJWkUpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBpbml0X2dldF9iaXRzKCZnYiwgaGRyLCA5Nik7Ci0KLSAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDM5KTsKLSAgICBzYW1wbGVfYmxvY2tzID0gZ2V0X2JpdHMoJmdiLCA3KSArIDE7Ci0gICAgaWYgKHNhbXBsZV9ibG9ja3MgPCA4KQotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAqZHVyYXRpb24gPSAyNTYgKiAoc2FtcGxlX2Jsb2NrcyAvIDgpOwotCi0gICAgKmZyYW1lc2l6ZSA9IGdldF9iaXRzKCZnYiwgMTQpICsgMTsKLSAgICBpZiAoKmZyYW1lc2l6ZSA8IDk1KQorICAgIGlmIChhdnByaXZfZGNhX3BhcnNlX2NvcmVfZnJhbWVfaGVhZGVyKCZoLCBoZHIsIHJldCkgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIHNraXBfYml0cygmZ2IsIDYpOwotICAgIHNyX2NvZGUgICAgICA9IGdldF9iaXRzKCZnYiwgNCk7Ci0gICAgKnNhbXBsZV9yYXRlID0gYXZwcml2X2RjYV9zYW1wbGVfcmF0ZXNbc3JfY29kZV07Ci0gICAgaWYgKCpzYW1wbGVfcmF0ZSA9PSAwKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAqZHVyYXRpb24gPSBoLm5wY21ibG9ja3MgKiBEQ0FfUENNQkxPQ0tfU0FNUExFUzsKKyAgICAqc2FtcGxlX3JhdGUgPSBhdnByaXZfZGNhX3NhbXBsZV9yYXRlc1toLnNyX2NvZGVdOworICAgIGlmICgqcHJvZmlsZSAhPSBGRl9QUk9GSUxFX1VOS05PV04pCisgICAgICAgIHJldHVybiAwOworCisgICAgKnByb2ZpbGUgPSBGRl9QUk9GSUxFX0RUUzsKKyAgICBpZiAoaC5leHRfYXVkaW9fcHJlc2VudCkgeworICAgICAgICBzd2l0Y2ggKGguZXh0X2F1ZGlvX3R5cGUpIHsKKyAgICAgICAgY2FzZSBEQ0FfRVhUX0FVRElPX1hDSDoKKyAgICAgICAgY2FzZSBEQ0FfRVhUX0FVRElPX1hYQ0g6CisgICAgICAgICAgICAqcHJvZmlsZSA9IEZGX1BST0ZJTEVfRFRTX0VTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRENBX0VYVF9BVURJT19YOTY6CisgICAgICAgICAgICAqcHJvZmlsZSA9IEZGX1BST0ZJTEVfRFRTXzk2XzI0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZV9zaXplID0gRkZBTElHTihoLmZyYW1lX3NpemUsIDQpOworICAgIGlmIChidWZfc2l6ZSAtIDQgPCBmcmFtZV9zaXplKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGJ1ZiAgICAgICs9IGZyYW1lX3NpemU7CisgICAgYnVmX3NpemUgLT0gZnJhbWVfc2l6ZTsKKyAgICBpZiAoQVZfUkIzMihidWYpICE9IERDQV9TWU5DV09SRF9TVUJTVFJFQU0pCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChmZl9kY2FfZXhzc19wYXJzZSgmcGMxLT5leHNzLCBidWYsIGJ1Zl9zaXplKSA8IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGFzc2V0LT5leHRlbnNpb25fbWFzayAmIERDQV9FWFNTX1hMTCkKKyAgICAgICAgKnByb2ZpbGUgPSBGRl9QUk9GSUxFX0RUU19IRF9NQTsKKyAgICBlbHNlIGlmIChhc3NldC0+ZXh0ZW5zaW9uX21hc2sgJiAoRENBX0VYU1NfWEJSIHwgRENBX0VYU1NfWFhDSCB8IERDQV9FWFNTX1g5NikpCisgICAgICAgICpwcm9maWxlID0gRkZfUFJPRklMRV9EVFNfSERfSFJBOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNjEsMTAgKzMyMSwxNyBAQAogICAgICAgICAgICAgKnBvdXRidWZfc2l6ZSA9IDA7CiAgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CiAgICAgICAgIH0KKworICAgICAgICAvKiBza2lwIGluaXRpYWwgcGFkZGluZyAqLworICAgICAgICBpZiAoYnVmX3NpemUgID4gcGMxLT5zdGFydHBvcykgeworICAgICAgICAgICAgYnVmICAgICAgKz0gcGMxLT5zdGFydHBvczsKKyAgICAgICAgICAgIGJ1Zl9zaXplIC09IHBjMS0+c3RhcnRwb3M7CisgICAgICAgIH0KKyAgICAgICAgcGMxLT5zdGFydHBvcyA9IDA7CiAgICAgfQogCiAgICAgLyogcmVhZCB0aGUgZHVyYXRpb24gYW5kIHNhbXBsZSByYXRlIGZyb20gdGhlIGZyYW1lIGhlYWRlciAqLwotICAgIGlmICghZGNhX3BhcnNlX3BhcmFtcyhidWYsIGJ1Zl9zaXplLCAmZHVyYXRpb24sICZzYW1wbGVfcmF0ZSwgJnBjMS0+ZnJhbWVzaXplKSkgeworICAgIGlmICghZGNhX3BhcnNlX3BhcmFtcyhwYzEsIGJ1ZiwgYnVmX3NpemUsICZkdXJhdGlvbiwgJnNhbXBsZV9yYXRlLCAmYXZjdHgtPnByb2ZpbGUpKSB7CiAgICAgICAgIGlmICghYXZjdHgtPnNhbXBsZV9yYXRlKQogICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CiAgICAgICAgIHMtPmR1cmF0aW9uID0gYXZfcmVzY2FsZShkdXJhdGlvbiwgYXZjdHgtPnNhbXBsZV9yYXRlLCBzYW1wbGVfcmF0ZSk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjYV94bGwuYyBiL2xpYmF2Y29kZWMvZGNhX3hsbC5jCmluZGV4IGNkMWFmODEuLmQyNjVjYWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGNhX3hsbC5jCisrKyBiL2xpYmF2Y29kZWMvZGNhX3hsbC5jCkBAIC0zMiw3ICszMiw3IEBACiAKIHN0YXRpYyBpbnQgZ2V0X3JpY2VfdW4oR2V0Qml0Q29udGV4dCAqZ2IsIGludCBrKQogewotICAgIHVuc2lnbmVkIGludCB2ID0gZ2V0X3VuYXJ5KGdiLCAxLCAxMjgpOworICAgIHVuc2lnbmVkIGludCB2ID0gZ2V0X3VuYXJ5KGdiLCAxLCBnZXRfYml0c19sZWZ0KGdiKSk7CiAgICAgcmV0dXJuICh2IDw8IGspIHwgZ2V0X2JpdHNfbG9uZyhnYiwgayk7CiB9CiAKQEAgLTEyMyw4ICsxMjMsNyBAQAogICAgIGhlYWRlcl9zaXplID0gZ2V0X2JpdHMoJnMtPmdiLCAxMCkgKyAxOwogCiAgICAgLy8gQ2hlY2sgQ1JDCi0gICAgaWYgKChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0NSQ0NIRUNLIHwgQVZfRUZfQ0FSRUZVTCkpCi0gICAgICAgICYmIGZmX2RjYV9jaGVja19jcmMoJnMtPmdiLCBoZWFkZXJfcG9zLCBoZWFkZXJfcG9zICsgaGVhZGVyX3NpemUgKiA4KSkgeworICAgIGlmIChmZl9kY2FfY2hlY2tfY3JjKHMtPmF2Y3R4LCAmcy0+Z2IsIGhlYWRlcl9wb3MsIGhlYWRlcl9wb3MgKyBoZWFkZXJfc2l6ZSAqIDgpKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBYTEwgc3ViLWhlYWRlciBjaGVja3N1bVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KQEAgLTE0NCw3ICsxNDMsNyBAQAogCiAgICAgLy8gU3RvcmFnZSB1bml0IHdpZHRoCiAgICAgYy0+c3RvcmFnZV9iaXRfcmVzID0gZ2V0X2JpdHMoJnMtPmdiLCA1KSArIDE7Ci0gICAgaWYgKGMtPnN0b3JhZ2VfYml0X3JlcyAhPSAxNiAmJiBjLT5zdG9yYWdlX2JpdF9yZXMgIT0gMjQpIHsKKyAgICBpZiAoYy0+c3RvcmFnZV9iaXRfcmVzICE9IDE2ICYmIGMtPnN0b3JhZ2VfYml0X3JlcyAhPSAyMCAmJiBjLT5zdG9yYWdlX2JpdF9yZXMgIT0gMjQpIHsKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiJWQtYml0IFhMTCBzdG9yYWdlIHJlc29sdXRpb24iLCBjLT5zdG9yYWdlX2JpdF9yZXMpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQpAQCAtNDYwLDE5ICs0NTksMTQgQEAKICAgICAgICAgICAgIC8vIFVucGFjayBSaWNlIGNvZGluZyBmbGFnCiAgICAgICAgICAgICAvLyAwIC0gbGluZWFyIGNvZGUsIDEgLSBSaWNlIGNvZGUKICAgICAgICAgICAgIGMtPnJpY2VfY29kZV9mbGFnW2ldID0gZ2V0X2JpdHMxKCZzLT5nYik7Ci0gICAgICAgICAgICBpZiAoIWMtPnNlZ19jb21tb24gJiYgYy0+cmljZV9jb2RlX2ZsYWdbaV0pIHsKLSAgICAgICAgICAgICAgICAvLyBVbnBhY2sgSHlicmlkIFJpY2UgY29kaW5nIGZsYWcKLSAgICAgICAgICAgICAgICAvLyAwIC0gUmljZSBjb2RlLCAxIC0gSHlicmlkIFJpY2UgY29kZQotICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkKLSAgICAgICAgICAgICAgICAgICAgLy8gVW5wYWNrIGJpbmFyeSBjb2RlIGxlbmd0aCBmb3IgaXNvbGF0ZWQgc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICBjLT5iaXRhbGxvY19oeWJyaWRfbGluZWFyW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCBjLT5uYWJpdHMpICsgMTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIC8vIDAgaW5kaWNhdGVzIG5vIEh5YnJpZCBSaWNlIGNvZGluZwotICAgICAgICAgICAgICAgICAgICBjLT5iaXRhbGxvY19oeWJyaWRfbGluZWFyW2ldID0gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBVbnBhY2sgSHlicmlkIFJpY2UgY29kaW5nIGZsYWcKKyAgICAgICAgICAgIC8vIDAgLSBSaWNlIGNvZGUsIDEgLSBIeWJyaWQgUmljZSBjb2RlCisgICAgICAgICAgICBpZiAoIWMtPnNlZ19jb21tb24gJiYgYy0+cmljZV9jb2RlX2ZsYWdbaV0gJiYgZ2V0X2JpdHMxKCZzLT5nYikpCisgICAgICAgICAgICAgICAgLy8gVW5wYWNrIGJpbmFyeSBjb2RlIGxlbmd0aCBmb3IgaXNvbGF0ZWQgc2FtcGxlcworICAgICAgICAgICAgICAgIGMtPmJpdGFsbG9jX2h5YnJpZF9saW5lYXJbaV0gPSBnZXRfYml0cygmcy0+Z2IsIGMtPm5hYml0cykgKyAxOworICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIC8vIDAgaW5kaWNhdGVzIG5vIEh5YnJpZCBSaWNlIGNvZGluZwogICAgICAgICAgICAgICAgIGMtPmJpdGFsbG9jX2h5YnJpZF9saW5lYXJbaV0gPSAwOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gVW5wYWNrIGNvZGluZyBwYXJhbWV0ZXJzCkBAIC02MDIsNyArNTk2LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYXZfY29sZCBjaHNfY2xlYXJfYmFuZF9kYXRhKERDQVhsbERlY29kZXIgKnMsIERDQVhsbENoU2V0ICpjLCBpbnQgYmFuZCwgaW50IHNlZykKK3N0YXRpYyBhdl9jb2xkIHZvaWQgY2hzX2NsZWFyX2JhbmRfZGF0YShEQ0FYbGxEZWNvZGVyICpzLCBEQ0FYbGxDaFNldCAqYywgaW50IGJhbmQsIGludCBzZWcpCiB7CiAgICAgRENBWGxsQmFuZCAqYiA9ICZjLT5iYW5kc1tiYW5kXTsKICAgICBpbnQgaSwgb2Zmc2V0LCBuc2FtcGxlczsKQEAgLTY1OCwxMyArNjUyLDEzIEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBlcnIgPSAwOwogICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBvcmRlcjsgaysrKQogICAgICAgICAgICAgICAgICAgICBlcnIgKz0gKGludDY0X3QpYnVmW2ogKyBrXSAqIGNvZWZmW29yZGVyIC0gayAtIDFdOwotICAgICAgICAgICAgICAgIGJ1ZltqICsga10gLT0gY2xpcDIzKG5vcm0xNihlcnIpKTsKKyAgICAgICAgICAgICAgICBidWZbaiArIGtdIC09IChTVUlOVCljbGlwMjMobm9ybTE2KGVycikpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gSW52ZXJzZSBmaXhlZCBjb2VmZmljaWVudCBwcmVkaWN0aW9uCiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYi0+Zml4ZWRfcHJlZF9vcmRlcltpXTsgaisrKQogICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCBuc2FtcGxlczsgaysrKQotICAgICAgICAgICAgICAgICAgICBidWZba10gKz0gYnVmW2sgLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgYnVmW2tdICs9ICh1bnNpZ25lZClidWZbayAtIDFdOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MjMsMTAgKzcxNywxMCBAQAogICAgICAgICAgICAgICAgIGludDMyX3QgKmxzYiA9IGItPmxzYl9zYW1wbGVfYnVmZmVyW2NoXTsKICAgICAgICAgICAgICAgICBpbnQgYWRqID0gYi0+Yml0X3dpZHRoX2FkanVzdFtjaF07CiAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG5zYW1wbGVzOyBuKyspCi0gICAgICAgICAgICAgICAgICAgIG1zYltuXSA9IG1zYltuXSAqICgxIDw8IHNoaWZ0KSArIChsc2Jbbl0gPDwgYWRqKTsKKyAgICAgICAgICAgICAgICAgICAgbXNiW25dID0gbXNiW25dICogKFNVSU5UKSgxIDw8IHNoaWZ0KSArIChsc2Jbbl0gPDwgYWRqKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IG5zYW1wbGVzOyBuKyspCi0gICAgICAgICAgICAgICAgICAgIG1zYltuXSA9IG1zYltuXSAqICgxIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNiW25dID0gbXNiW25dICogKFNVSU5UKSgxIDw8IHNoaWZ0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTc4OSw4ICs3ODMsNyBAQAogICAgIGhlYWRlcl9zaXplID0gZ2V0X2JpdHMoJnMtPmdiLCA4KSArIDE7CiAKICAgICAvLyBDaGVjayBDUkMKLSAgICBpZiAoKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQ1JDQ0hFQ0sgfCBBVl9FRl9DQVJFRlVMKSkKLSAgICAgICAgJiYgZmZfZGNhX2NoZWNrX2NyYygmcy0+Z2IsIDMyLCBoZWFkZXJfc2l6ZSAqIDgpKSB7CisgICAgaWYgKGZmX2RjYV9jaGVja19jcmMocy0+YXZjdHgsICZzLT5nYiwgMzIsIGhlYWRlcl9zaXplICogOCkpIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFhMTCBjb21tb24gaGVhZGVyIGNoZWNrc3VtXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtOTk4LDggKzk5MSw3IEBACiAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMTYpOwogCiAgICAgLy8gQ2hlY2sgQ1JDCi0gICAgaWYgKChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgKEFWX0VGX0NSQ0NIRUNLIHwgQVZfRUZfQ0FSRUZVTCkpCi0gICAgICAgICYmIGZmX2RjYV9jaGVja19jcmMoJnMtPmdiLCBuYXZpX3BvcywgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSkpIHsKKyAgICBpZiAoZmZfZGNhX2NoZWNrX2NyYyhzLT5hdmN0eCwgJnMtPmdiLCBuYXZpX3BvcywgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSkpIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIE5BVkkgY2hlY2tzdW1cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC0xMDM2LDcgKzEwMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaHNfY2xlYXJfYmFuZF9kYXRhKHMsIGMsIGJhbmQsIHNlZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcy0+Z2IuaW5kZXggPSBuYXZpX3BvczsKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBuYXZpX3BvcyAtIGdldF9iaXRzX2NvdW50KCZzLT5nYikpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBuYXZpX3B0cisrOwogICAgICAgICAgICAgfQpAQCAtMTA3OCw3ICsxMDcwLDcgQEAKICAgICBpZiAoc2l6ZSA+IERDQV9YTExfUEJSX0JVRkZFUl9NQVgpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NQQyk7CiAKLSAgICBpZiAoIXMtPnBicl9idWZmZXIgJiYgIShzLT5wYnJfYnVmZmVyID0gYXZfbWFsbG9jKERDQV9YTExfUEJSX0JVRkZFUl9NQVggKyBEQ0FfQlVGRkVSX1BBRERJTkdfU0laRSkpKQorICAgIGlmICghcy0+cGJyX2J1ZmZlciAmJiAhKHMtPnBicl9idWZmZXIgPSBhdl9tYWxsb2MoRENBX1hMTF9QQlJfQlVGRkVSX01BWCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIG1lbWNweShzLT5wYnJfYnVmZmVyLCBkYXRhLCBzaXplKTsKQEAgLTEyNDIsNyArMTIzNCw3IEBACiAKIC8vIENsZWFyIGFsbCBiYW5kIGRhdGEgYW5kIHJlcGxhY2Ugbm9uLXJlc2lkdWFsIGVuY29kZWQgY2hhbm5lbHMgd2l0aCBsb3NzeQogLy8gY291bnRlcnBhcnRzCi1zdGF0aWMgdm9pZCBhdl9jb2xkIGZvcmNlX2xvc3N5X291dHB1dChEQ0FYbGxEZWNvZGVyICpzLCBEQ0FYbGxDaFNldCAqYykKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZm9yY2VfbG9zc3lfb3V0cHV0KERDQVhsbERlY29kZXIgKnMsIERDQVhsbENoU2V0ICpjKQogewogICAgIERDQUNvbnRleHQgKmRjYSA9IHMtPmF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IGJhbmQsIGNoOwpAQCAtMTMxNiwxMSArMTMwOCwxMSBAQAogICAgICAgICAgICAgLy8gVW5kbyBlbWJlZGRlZCBjb3JlIGRvd25taXggcHJlLXNjYWxpbmcKICAgICAgICAgICAgIGludCBzY2FsZV9pbnYgPSBvLT5kbWl4X3NjYWxlX2ludltjLT5oaWVyX29mcyArIGNoXTsKICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBuc2FtcGxlczsgbisrKQotICAgICAgICAgICAgICAgIGRzdFtuXSArPSBjbGlwMjMoKG11bDE2KHNyY1tuXSwgc2NhbGVfaW52KSArIHJvdW5kKSA+PiBzaGlmdCk7CisgICAgICAgICAgICAgICAgZHN0W25dICs9IChTVUlOVCljbGlwMjMoKG11bDE2KHNyY1tuXSwgc2NhbGVfaW52KSArIHJvdW5kKSA+PiBzaGlmdCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBObyBkb3dubWl4IHNjYWxpbmcKICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBuc2FtcGxlczsgbisrKQotICAgICAgICAgICAgICAgIGRzdFtuXSArPSAoc3JjW25dICsgcm91bmQpID4+IHNoaWZ0OworICAgICAgICAgICAgICAgIGRzdFtuXSArPSAodW5zaWduZWQpKChzcmNbbl0gKyByb3VuZCkgPj4gc2hpZnQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDIzLDkgKzE0MTUsMTIgQEAKICAgICBzd2l0Y2ggKHAtPnN0b3JhZ2VfYml0X3JlcykgewogICAgIGNhc2UgMTY6CiAgICAgICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgICAgICBzaGlmdCA9IDE2IC0gcC0+cGNtX2JpdF9yZXM7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjA6CiAgICAgY2FzZSAyNDoKICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MzMlA7CisgICAgICAgIHNoaWZ0ID0gMjQgLSBwLT5wY21fYml0X3JlczsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKQEAgLTE0NDYsMTcgKzE0NDEsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9tYXNrKTsKICAgICB9CiAKLSAgICBzaGlmdCA9IHAtPnN0b3JhZ2VfYml0X3JlcyAtIHAtPnBjbV9iaXRfcmVzOwogICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgewogICAgICAgICBpbnQzMl90ICpzYW1wbGVzID0gcy0+b3V0cHV0X3NhbXBsZXNbY2hfcmVtYXBbaV1dOwogICAgICAgICBpZiAoZnJhbWUtPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlApIHsKICAgICAgICAgICAgIGludDE2X3QgKnBsYW5lID0gKGludDE2X3QgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXTsKICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBuc2FtcGxlczsgaysrKQotICAgICAgICAgICAgICAgIHBsYW5lW2tdID0gYXZfY2xpcF9pbnQxNihzYW1wbGVzW2tdICogKDEgPDwgc2hpZnQpKTsKKyAgICAgICAgICAgICAgICBwbGFuZVtrXSA9IGF2X2NsaXBfaW50MTYoc2FtcGxlc1trXSAqIChTVUlOVCkoMSA8PCBzaGlmdCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50MzJfdCAqcGxhbmUgPSAoaW50MzJfdCAqKWZyYW1lLT5leHRlbmRlZF9kYXRhW2ldOwogICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG5zYW1wbGVzOyBrKyspCi0gICAgICAgICAgICAgICAgcGxhbmVba10gPSBjbGlwMjMoc2FtcGxlc1trXSAqICgxIDw8IHNoaWZ0KSkgKiAoMSA8PCA4KTsKKyAgICAgICAgICAgICAgICBwbGFuZVtrXSA9IGNsaXAyMyhzYW1wbGVzW2tdICogKFNVSU5UKSgxIDw8IHNoaWZ0KSkgKiAoMSA8PCA4KTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kY2FhZHBjbS5jIGIvbGliYXZjb2RlYy9kY2FhZHBjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNjE1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2RjYWFkcGNtLmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBEQ0EgQURQQ00gZW5naW5lCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgRGFuaWlsIENoZXJlZG5paworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisKKyNpbmNsdWRlICJkY2FhZHBjbS5oIgorI2luY2x1ZGUgImRjYWVuYy5oIgorI2luY2x1ZGUgImRjYV9jb3JlLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCit0eXBlZGVmIGludDMyX3QgcHJlbXVsdGlwbGllZF9jb2VmZnNbMTBdOworCisvL2Fzc3VtZSB3ZSBoYXZlIERDQV9BRFBDTV9DT0VGRlMgdmFsdWVzIGJlZm9yZSB4CitzdGF0aWMgaW5saW5lIGludDY0X3QgY2FsY19jb3JyKGNvbnN0IGludDMyX3QgKngsIGludCBsZW4sIGludCBqLCBpbnQgaykKK3sKKyAgICBpbnQgbjsKKyAgICBpbnQ2NF90IHMgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBsZW47IG4rKykKKyAgICAgICAgcyArPSBNVUw2NCh4W24tal0sIHhbbi1rXSk7CisgICAgcmV0dXJuIHM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBhcHBseV9maWx0ZXIoY29uc3QgaW50MTZfdCBhW0RDQV9BRFBDTV9DT0VGRlNdLCBjb25zdCBpbnQ2NF90IGNvcnJbMTVdLCBjb25zdCBpbnQzMl90IGFhWzEwXSkKK3sKKyAgICBpbnQ2NF90IGVyciA9IDA7CisgICAgaW50NjRfdCB0bXAgPSAwOworCisgICAgZXJyID0gY29yclswXTsKKworICAgIHRtcCArPSBNVUw2NChhWzBdLCBjb3JyWzFdKTsKKyAgICB0bXAgKz0gTVVMNjQoYVsxXSwgY29yclsyXSk7CisgICAgdG1wICs9IE1VTDY0KGFbMl0sIGNvcnJbM10pOworICAgIHRtcCArPSBNVUw2NChhWzNdLCBjb3JyWzRdKTsKKworICAgIHRtcCA9IG5vcm1fXyh0bXAsIDEzKTsKKyAgICB0bXAgKz0gdG1wOworCisgICAgZXJyIC09IHRtcDsKKyAgICB0bXAgPSAwOworCisgICAgdG1wICs9IE1VTDY0KGNvcnJbNV0sIGFhWzBdKTsKKyAgICB0bXAgKz0gTVVMNjQoY29ycls2XSwgYWFbMV0pOworICAgIHRtcCArPSBNVUw2NChjb3JyWzddLCBhYVsyXSk7CisgICAgdG1wICs9IE1VTDY0KGNvcnJbOF0sIGFhWzNdKTsKKworICAgIHRtcCArPSBNVUw2NChjb3JyWzldLCBhYVs0XSk7CisgICAgdG1wICs9IE1VTDY0KGNvcnJbMTBdLCBhYVs1XSk7CisgICAgdG1wICs9IE1VTDY0KGNvcnJbMTFdLCBhYVs2XSk7CisKKyAgICB0bXAgKz0gTVVMNjQoY29yclsxMl0sIGFhWzddKTsKKyAgICB0bXAgKz0gTVVMNjQoY29yclsxM10sIGFhWzhdKTsKKworICAgIHRtcCArPSBNVUw2NChjb3JyWzE0XSwgYWFbOV0pOworCisgICAgdG1wID0gbm9ybV9fKHRtcCwgMjYpOworCisgICAgZXJyICs9IHRtcDsKKworICAgIHJldHVybiBsbGFicyhlcnIpOworfQorCitzdGF0aWMgaW50NjRfdCBmaW5kX2Jlc3RfZmlsdGVyKGNvbnN0IERDQUFEUENNRW5jQ29udGV4dCAqcywgY29uc3QgaW50MzJfdCAqaW4sIGludCBsZW4pCit7CisgICAgY29uc3QgcHJlbXVsdGlwbGllZF9jb2VmZnMgKnByZWNhbGNfZGF0YSA9IHMtPnByaXZhdGVfZGF0YTsKKyAgICBpbnQgaSwgaiwgayA9IDA7CisgICAgaW50IHZxID0gLTE7CisgICAgaW50NjRfdCBlcnI7CisgICAgaW50NjRfdCBtaW5fZXJyID0gMWxsIDw8IDYyOworICAgIGludDY0X3QgY29yclsxNV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IERDQV9BRFBDTV9DT0VGRlM7IGkrKykKKyAgICAgICAgZm9yIChqID0gaTsgaiA8PSBEQ0FfQURQQ01fQ09FRkZTOyBqKyspCisgICAgICAgICAgICBjb3JyW2srK10gPSBjYWxjX2NvcnIoaW4rNCwgbGVuLCBpLCBqKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQ0FfQURQQ01fVlFDT0RFQk9PS19TWjsgaSsrKSB7CisgICAgICAgIGVyciA9IGFwcGx5X2ZpbHRlcihmZl9kY2FfYWRwY21fdmJbaV0sIGNvcnIsICpwcmVjYWxjX2RhdGEpOworICAgICAgICBpZiAoZXJyIDwgbWluX2VycikgeworICAgICAgICAgICAgbWluX2VyciA9IGVycjsKKyAgICAgICAgICAgIHZxID0gaTsKKyAgICAgICAgfQorICAgICAgICBwcmVjYWxjX2RhdGErKzsKKyAgICB9CisKKyAgICByZXR1cm4gdnE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50NjRfdCBjYWxjX3ByZWRpY3Rpb25fZ2FpbihpbnQgcHJlZF92cSwgY29uc3QgaW50MzJfdCAqaW4sIGludDMyX3QgKm91dCwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQzMl90IGVycm9yOworCisgICAgaW50NjRfdCBzaWduYWxfZW5lcmd5ID0gMDsKKyAgICBpbnQ2NF90IGVycm9yX2VuZXJneSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgZXJyb3IgPSBpbltEQ0FfQURQQ01fQ09FRkZTICsgaV0gLSBmZl9kY2FhZHBjbV9wcmVkaWN0KHByZWRfdnEsIGluICsgaSk7CisgICAgICAgIG91dFtpXSA9IGVycm9yOworICAgICAgICBzaWduYWxfZW5lcmd5ICs9IE1VTDY0KGluW0RDQV9BRFBDTV9DT0VGRlMgKyBpXSwgaW5bRENBX0FEUENNX0NPRUZGUyArIGldKTsKKyAgICAgICAgZXJyb3JfZW5lcmd5ICs9IE1VTDY0KGVycm9yLCBlcnJvcik7CisgICAgfQorCisgICAgaWYgKCFlcnJvcl9lbmVyZ3kpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJldHVybiBzaWduYWxfZW5lcmd5IC8gZXJyb3JfZW5lcmd5OworfQorCitpbnQgZmZfZGNhYWRwY21fc3ViYmFuZF9hbmFseXNpcyhjb25zdCBEQ0FBRFBDTUVuY0NvbnRleHQgKnMsIGNvbnN0IGludDMyX3QgKmluLCBpbnQgbGVuLCBpbnQgKmRpZmYpCit7CisgICAgaW50IHByZWRfdnEsIGk7CisgICAgaW50MzJfdCBpbnB1dF9idWZmZXJbMTYgKyBEQ0FfQURQQ01fQ09FRkZTXTsKKyAgICBpbnQzMl90IGlucHV0X2J1ZmZlcjJbMTYgKyBEQ0FfQURQQ01fQ09FRkZTXTsKKworICAgIGludDMyX3QgbWF4ID0gMDsKKyAgICBpbnQgc2hpZnRfYml0czsKKyAgICB1aW50NjRfdCBwZyA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuICsgRENBX0FEUENNX0NPRUZGUzsgaSsrKQorICAgICAgICBtYXggfD0gRkZBQlMoaW5baV0pOworCisgICAgLy8gbm9ybWFsaXplIGlucHV0IHRvIHNpbXBsaWZ5IGFwcGx5X2ZpbHRlcgorICAgIHNoaWZ0X2JpdHMgPSBhdl9sb2cyKG1heCkgLSAxMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gKyBEQ0FfQURQQ01fQ09FRkZTOyBpKyspIHsKKyAgICAgICAgaW5wdXRfYnVmZmVyW2ldID0gbm9ybV9fKGluW2ldLCA3KTsKKyAgICAgICAgaW5wdXRfYnVmZmVyMltpXSA9IG5vcm1fXyhpbltpXSwgc2hpZnRfYml0cyk7CisgICAgfQorCisgICAgcHJlZF92cSA9IGZpbmRfYmVzdF9maWx0ZXIocywgaW5wdXRfYnVmZmVyMiwgbGVuKTsKKworICAgIGlmIChwcmVkX3ZxIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcGcgPSBjYWxjX3ByZWRpY3Rpb25fZ2FpbihwcmVkX3ZxLCBpbnB1dF9idWZmZXIsIGRpZmYsIGxlbik7CisKKyAgICAvLyBHcmVhdGVyIHRoYW4gMTBkYiAoMTAqbG9nKDEwKSkgcHJlZGljdGlvbiBnYWluIHRvIHVzZSBBRFBDTS4KKyAgICAvLyBUT0RPOiBUdW5lIGl0LgorICAgIGlmIChwZyA8IDEwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIGRpZmZbaV0gPDw9IDc7CisKKyAgICByZXR1cm4gcHJlZF92cTsKK30KKworc3RhdGljIHZvaWQgcHJlY2FsYyhwcmVtdWx0aXBsaWVkX2NvZWZmcyAqZGF0YSkKK3sKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQ0FfQURQQ01fVlFDT0RFQk9PS19TWjsgaSsrKSB7CisgICAgICAgIGludCBpZCA9IDA7CisgICAgICAgIGludDMyX3QgdCA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBEQ0FfQURQQ01fQ09FRkZTOyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoayA9IGo7IGsgPCBEQ0FfQURQQ01fQ09FRkZTOyBrKyspIHsKKyAgICAgICAgICAgICAgICB0ID0gKGludDMyX3QpZmZfZGNhX2FkcGNtX3ZiW2ldW2pdICogKGludDMyX3QpZmZfZGNhX2FkcGNtX3ZiW2ldW2tdOworICAgICAgICAgICAgICAgIGlmIChqICE9IGspCisgICAgICAgICAgICAgICAgICAgIHQgKj0gMjsKKyAgICAgICAgICAgICAgICAoKmRhdGEpW2lkKytdID0gdDsKKyAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGF0YSsrOworICAgIH0KK30KKworaW50IGZmX2RjYWFkcGNtX2RvX3JlYWwoaW50IHByZWRfdnFfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBzb2Z0ZmxvYXQgcXVhbnQsIGludDMyX3Qgc2NhbGVfZmFjdG9yLCBpbnQzMl90IHN0ZXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnByZXZfaGlzdCwgY29uc3QgaW50MzJfdCAqaW4sIGludDMyX3QgKm5leHRfaGlzdCwgaW50MzJfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50MzJfdCBwZWFrKQoreworICAgIGludCBpOworICAgIGludDY0X3QgZGVsdGE7CisgICAgaW50MzJfdCBkZXF1YW50X2RlbHRhOworICAgIGludDMyX3Qgd29ya19idWZlclsxNiArIERDQV9BRFBDTV9DT0VGRlNdOworCisgICAgbWVtY3B5KHdvcmtfYnVmZXIsIHByZXZfaGlzdCwgc2l6ZW9mKGludDMyX3QpICogRENBX0FEUENNX0NPRUZGUyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgd29ya19idWZlcltEQ0FfQURQQ01fQ09FRkZTICsgaV0gPSBmZl9kY2FhZHBjbV9wcmVkaWN0KHByZWRfdnFfaW5kZXgsICZ3b3JrX2J1ZmVyW2ldKTsKKworICAgICAgICBkZWx0YSA9IChpbnQ2NF90KWluW2ldIC0gKChpbnQ2NF90KXdvcmtfYnVmZXJbRENBX0FEUENNX0NPRUZGUyArIGldIDw8IDcpOworCisgICAgICAgIG91dFtpXSA9IHF1YW50aXplX3ZhbHVlKGF2X2NsaXA2NChkZWx0YSwgLXBlYWssIHBlYWspLCBxdWFudCk7CisKKyAgICAgICAgZmZfZGNhX2NvcmVfZGVxdWFudGl6ZSgmZGVxdWFudF9kZWx0YSwgJm91dFtpXSwgc3RlcF9zaXplLCBzY2FsZV9mYWN0b3IsIDAsIDEpOworCisgICAgICAgIHdvcmtfYnVmZXJbRENBX0FEUENNX0NPRUZGUytpXSArPSBkZXF1YW50X2RlbHRhOworICAgIH0KKworICAgIG1lbWNweShuZXh0X2hpc3QsICZ3b3JrX2J1ZmVyW2xlbl0sIHNpemVvZihpbnQzMl90KSAqIERDQV9BRFBDTV9DT0VGRlMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgaW50IGZmX2RjYWFkcGNtX2luaXQoRENBQURQQ01FbmNDb250ZXh0ICpzKQoreworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcy0+cHJpdmF0ZV9kYXRhID0gYXZfbWFsbG9jKHNpemVvZihwcmVtdWx0aXBsaWVkX2NvZWZmcykgKiBEQ0FfQURQQ01fVlFDT0RFQk9PS19TWik7CisgICAgaWYgKCFzLT5wcml2YXRlX2RhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBwcmVjYWxjKHMtPnByaXZhdGVfZGF0YSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9kY2FhZHBjbV9mcmVlKERDQUFEUENNRW5jQ29udGV4dCAqcykKK3sKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybjsKKworICAgIGF2X2ZyZWVwKCZzLT5wcml2YXRlX2RhdGEpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kY2FhZHBjbS5oIGIvbGliYXZjb2RlYy9kY2FhZHBjbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYmZhNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2RjYWFkcGNtLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIERDQSBBRFBDTSBlbmdpbmUKKyAqIENvcHlyaWdodCAoQykgMjAxNyBEYW5paWwgQ2hlcmVkbmlrCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19EQ0FBRFBDTV9ICisjZGVmaW5lIEFWQ09ERUNfRENBQURQQ01fSAorCisjaW5jbHVkZSAiZGNhbWF0aC5oIgorI2luY2x1ZGUgImRjYWRhdGEuaCIKKyNpbmNsdWRlICJkY2FlbmMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRENBQURQQ01FbmNDb250ZXh0IHsKKyAgICB2b2lkICpwcml2YXRlX2RhdGE7Cit9IERDQUFEUENNRW5jQ29udGV4dDsKKworc3RhdGljIGlubGluZSBpbnQ2NF90IGZmX2RjYWFkcGNtX3ByZWRpY3QoaW50IHByZWRfdnFfaW5kZXgsIGNvbnN0IGludDMyX3QgKmlucHV0KQoreworICAgIGludCBpOworICAgIGNvbnN0IGludDE2X3QgKmNvZWZmID0gZmZfZGNhX2FkcGNtX3ZiW3ByZWRfdnFfaW5kZXhdOworICAgIGludDY0X3QgcHJlZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IERDQV9BRFBDTV9DT0VGRlM7IGkrKykKKyAgICAgICAgcHJlZCArPSAoaW50NjRfdClpbnB1dFtEQ0FfQURQQ01fQ09FRkZTIC0gMSAtIGldICogY29lZmZbaV07CisKKyAgICByZXR1cm4gY2xpcDIzKG5vcm0xMyhwcmVkKSk7Cit9CisKK2ludCBmZl9kY2FhZHBjbV9zdWJiYW5kX2FuYWx5c2lzKGNvbnN0IERDQUFEUENNRW5jQ29udGV4dCAqcywgY29uc3QgaW50MzJfdCAqaW5wdXQsIGludCBsZW4sIGludCAqZGlmZik7CisKK2ludCBmZl9kY2FhZHBjbV9kb19yZWFsKGludCBwcmVkX3ZxX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgc29mdGZsb2F0IHF1YW50LCBpbnQzMl90IHNjYWxlX2ZhY3RvciwgaW50MzJfdCBzdGVwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpwcmV2X2hpc3QsIGNvbnN0IGludDMyX3QgKmluLCBpbnQzMl90ICpuZXh0X2hpc3QsIGludDMyX3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludDMyX3QgcGVhayk7CisKK2F2X2NvbGQgaW50IGZmX2RjYWFkcGNtX2luaXQoRENBQURQQ01FbmNDb250ZXh0ICpzKTsKK2F2X2NvbGQgdm9pZCBmZl9kY2FhZHBjbV9mcmVlKERDQUFEUENNRW5jQ29udGV4dCAqcyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0RDQUFEUENNX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhZGF0YS5jIGIvbGliYXZjb2RlYy9kY2FkYXRhLmMKaW5kZXggZTk5MTEzNC4uMWI2NDZhNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kY2FkYXRhLmMKKysrIGIvbGliYXZjb2RlYy9kY2FkYXRhLmMKQEAgLTQyLDE4ICs0MiwyMiBAQAogICAgIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDYsIDYsIDYsIDcsIDgsIDgKIH07CiAKLWNvbnN0IHVpbnQ4X3QgZmZfZGNhX2JpdHNfcGVyX3NhbXBsZVs4XSA9IHsKLSAgICAxNiwgMTYsIDIwLCAyMCwgMCwgMjQsIDI0LCAwCi19OwotCiBjb25zdCB1aW50OF90IGZmX2RjYV9kbWl4X3ByaW1hcnlfbmNoWzhdID0gewogICAgIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDAKIH07CiAKK2NvbnN0IHVpbnQ4X3QgZmZfZGNhX3F1YW50X2luZGV4X3NlbF9uYml0c1tEQ0FfQ09ERV9CT09LU10gPSB7CisgICAgMSwgMiwgMiwgMiwgMiwgMywgMywgMywgMywgMworfTsKKworY29uc3QgdWludDhfdCBmZl9kY2FfcXVhbnRfaW5kZXhfZ3JvdXBfc2l6ZVtEQ0FfQ09ERV9CT09LU10gPSB7CisgICAgMSwgMywgMywgMywgMywgNywgNywgNywgNywgNworfTsKKwogLyogQURQQ00gZGF0YSAqLwogCi0vKiAxNmJpdHMgc2lnbmVkIGZyYWN0aW9uYWwgUTEzIGJpbmFyeSBjb2RlcyAqLwotY29uc3QgaW50MTZfdCBmZl9kY2FfYWRwY21fdmJbNDA5Nl1bNF0gPSB7CisvKiAxNiBiaXRzIHNpZ25lZCBmcmFjdGlvbmFsIFExMyBiaW5hcnkgY29kZXMgKi8KK2NvbnN0IGludDE2X3QgZmZfZGNhX2FkcGNtX3ZiW0RDQV9BRFBDTV9WUUNPREVCT09LX1NaXVtEQ0FfQURQQ01fQ09FRkZTXSA9IHsKICAgICB7ICAgOTkyOCwgIC0yNjE4LCAgLTEwOTMsIC0xMjYzIH0sCiAgICAgeyAgMTEwNzcsICAtMjg3NiwgIC0xNzQ3LCAgLTMwOCB9LAogICAgIHsgIDEwNTAzLCAgLTEwODIsICAtMTQyNiwgLTExNjcgfSwKQEAgLTQyMTUsNyArNDIxOSw3IEBACiAgICAgMjA5NzE1MiwgNDE5NDMwNCwgODM4ODYwOCwgICAgIDAsICAgICAgMCwgICAgICAwLCAgICAgIDAsICAgICAgIDAKIH07CiAKLS8qIDIwYml0cyB1bnNpZ25lZCBmcmFjdGlvbmFsIGJpbmFyeSBjb2RlcyAqLworLyogMjAgYml0cyB1bnNpZ25lZCBmcmFjdGlvbmFsIGJpbmFyeSBjb2RlcyAqLwogY29uc3QgdWludDMyX3QgZmZfZGNhX2xvc3N5X3F1YW50WzMyXSA9IHsKICAgICAgICAgIDAsIDY3MTA4ODYsIDQxOTQzMDQsIDMzNTU0NDMsIDI0NzQ2MzksIDIwOTcxNTIsIDE3NjE2MDgsIDE0MjYwNjMsCiAgICAgNzk2OTE4LCAgNDYxMzczLCAgMjUxNjU4LCAgMTQ2ODAxLCAgIDc5NjkyLCAgIDQ2MTM3LCAgIDI3MjYzLCAgIDE2Nzc3LApAQCAtNDIyMyw3ICs0MjI3LDcgQEAKICAgICAgICAgODQsICAgICAgNDIsICAgICAgMjEsICAgICAgIDAsICAgICAgIDAsICAgICAgIDAsICAgICAgIDAsICAgICAgIDAKIH07CiAKLS8qIDIwYml0cyB1bnNpZ25lZCBmcmFjdGlvbmFsIGJpbmFyeSBjb2RlcyAqLworLyogMjAgYml0cyB1bnNpZ25lZCBmcmFjdGlvbmFsIGJpbmFyeSBjb2RlcyAqLwogY29uc3QgdWludDMyX3QgZmZfZGNhX2xvc3NsZXNzX3F1YW50WzMyXSA9IHsKICAgICAgICAgIDAsIDQxOTQzMDQsIDIwOTcxNTIsIDEzODQxMjAsIDEwNDg1NzYsIDY5NjI1NCwgNTI0Mjg4LCAzNDgxMjcsCiAgICAgMjYyMTQ0LCAgMTMxMDcyLCAgIDY1NDMxLCAgIDMzMDI2LCAgIDE2NDUwLCAgIDgyMDgsICAgNDEwMCwgICAyMDQ5LApAQCAtODcyNSw1OCArODcyOSw0NjggQEAKICAgICAgMzI1OTMzMywgLTUwNzQ5NDEsICA2OTI4NTUwLCAtODIwNDg4MwogfTsKIAotY29uc3QgaW50MzJfdCBmZl9kY2Ffc2FtcGxpbmdfZnJlcXNbMTZdID0gewotICAgICAgODAwMCwgIDE2MDAwLCAzMjAwMCwgNjQwMDAsIDEyODAwMCwgMjIwNTAsICA0NDEwMCwgIDg4MjAwLAotICAgIDE3NjQwMCwgMzUyODAwLCAxMjAwMCwgMjQwMDAsICA0ODAwMCwgOTYwMDAsIDE5MjAwMCwgMzg0MDAwLAorY29uc3QgdWludDE2X3QgZmZfZGNhX2F2Z19nM19mcmVxc1szXSA9IHsgMTYwMDAsIDE4MDAwLCAyNDAwMCB9OworCitjb25zdCB1aW50MTZfdCBmZl9kY2FfZnN0X2FtcFs0NF0gPSB7CisgICAgICAgMCwgICAgMSwgICAgMiwgICAgMywKKyAgICAgICA0LCAgICA2LCAgICA4LCAgIDEwLAorICAgICAgMTIsICAgMTYsICAgMjAsICAgMjQsCisgICAgICAyOCwgICAzNiwgICA0NCwgICA1MiwKKyAgICAgIDYwLCAgIDc2LCAgIDkyLCAgMTA4LAorICAgICAxMjQsICAxNTYsICAxODgsICAyMjAsCisgICAgIDI1MiwgIDMxNiwgIDM4MCwgIDQ0NCwKKyAgICAgNTA4LCAgNjM2LCAgNzY0LCAgODkyLAorICAgIDEwMjAsIDEyNzYsIDE1MzIsIDE3ODgsCisgICAgMjA0NCwgMjU1NiwgMzA2OCwgMzU4MCwKKyAgICA0MDkyLCA1MTE2LCA2MTQwLCA3MTY0CiB9OwogCi1jb25zdCBpbnQ4X3QgZmZfZGNhX2xmZV9pbmRleFsxNl0gPSB7Ci0gICAgMSwgMiwgMiwgMiwgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMSwgMywgMiwgMworY29uc3QgdWludDhfdCBmZl9kY2FfZnJlcV90b19zYlszMl0gPSB7CisgICAgMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1CiB9OwogCi1jb25zdCBpbnQ4X3QgZmZfZGNhX2NoYW5uZWxfcmVvcmRlcl9sZmVbMTZdWzldID0gewotICAgIHsgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLSAgICB7IDAsICAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLSAgICB7IDIsICAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotICAgIHsgMCwgIDEsICAzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAyLCAgMCwgIDEsICA0LCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLSAgICB7IDAsICAxLCAgMywgIDQsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotICAgIHsgMiwgIDAsICAxLCAgNCwgIDUsIC0xLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAzLCAgNCwgIDAsICAxLCAgNSwgIDYsIC0xLCAtMSwgLTEgfSwKLSAgICB7IDIsICAwLCAgMSwgIDQsICA1LCAgNiwgLTEsIC0xLCAtMSB9LAotICAgIHsgMCwgIDYsICA0LCAgNSwgIDIsICAzLCAtMSwgLTEsIC0xIH0sCi0gICAgeyA0LCAgMiwgIDUsICAwLCAgMSwgIDYsICA3LCAtMSwgLTEgfSwKLSAgICB7IDUsICA2LCAgMCwgIDEsICA3LCAgMywgIDgsICA0LCAtMSB9LAotICAgIHsgNCwgIDIsICA1LCAgMCwgIDEsICA2LCAgOCwgIDcsIC0xIH0sCitjb25zdCBpbnQ4X3QgZmZfZGNhX3BoMF9zaGlmdFs4XSA9IHsKKyAgICAtMzIsICs5NiwgLTk2LCArMzIsICs5NiwgLTMyLCArMzIsIC05NgogfTsKIAotY29uc3QgaW50OF90IGZmX2RjYV9jaGFubmVsX3Jlb3JkZXJfbm9sZmVbMTZdWzldID0gewotICAgIHsgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLSAgICB7IDAsICAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLSAgICB7IDIsICAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotICAgIHsgMCwgIDEsICAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAyLCAgMCwgIDEsICAzLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKLSAgICB7IDAsICAxLCAgMiwgIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAotICAgIHsgMiwgIDAsICAxLCAgMywgIDQsIC0xLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAyLCAgMywgIDAsICAxLCAgNCwgIDUsIC0xLCAtMSwgLTEgfSwKLSAgICB7IDIsICAwLCAgMSwgIDMsICA0LCAgNSwgLTEsIC0xLCAtMSB9LAotICAgIHsgMCwgIDUsICAzLCAgNCwgIDEsICAyLCAtMSwgLTEsIC0xIH0sCi0gICAgeyAzLCAgMiwgIDQsICAwLCAgMSwgIDUsICA2LCAtMSwgLTEgfSwKLSAgICB7IDQsICA1LCAgMCwgIDEsICA2LCAgMiwgIDcsICAzLCAtMSB9LAotICAgIHsgMywgIDIsICA0LCAgMCwgIDEsICA1LCAgNywgIDYsIC0xIH0sCitjb25zdCB1aW50OF90IGZmX2RjYV9ncmlkXzFfdG9fc2NmWzExXSA9IHsKKyAgICAwLCAxLCAyLCAzLCA0LCA2LCA3LCAxMCwgMTQsIDE5LCAyNgogfTsKIAotY29uc3QgdWludDE2X3QgZmZfZGNhX3ZsY19vZmZzWzYzXSA9IHsKLSAgICAgICAgMCwgICA1MTIsICAgNjQwLCAgIDc2OCwgIDEyODIsICAxNzk0LCAgMjQzNiwgIDMwODAsICAzNzcwLCAgNDQ1NCwgIDUzNjQsCi0gICAgIDUzNzIsICA1MzgwLCAgNTM4OCwgIDUzOTIsICA1Mzk2LCAgNTQxMiwgIDU0MjAsICA1NDI4LCAgNTQ2MCwgIDU0OTIsICA1NTA4LAotICAgICA1NTcyLCAgNTYwNCwgIDU2NjgsICA1Nzk2LCAgNTg2MCwgIDU4OTIsICA2NDEyLCAgNjY2OCwgIDY3OTYsICA3MzA4LCAgNzU2NCwKLSAgICAgNzgyMCwgIDgwNzYsICA4NjIwLCAgOTEzMiwgIDkzODgsICA5OTEwLCAxMDE2NiwgMTA2ODAsIDExMTk2LCAxMTcyNiwgMTIyNDAsCi0gICAgMTI3NTIsIDEzMjk4LCAxMzgxMCwgMTQzMjYsIDE0ODQwLCAxNTUwMCwgMTYwMjIsIDE2NTQwLCAxNzE1OCwgMTc2NzgsIDE4MjY0LAotICAgIDE4Nzk2LCAxOTM1MiwgMTk5MjYsIDIwNDY4LCAyMTQ3MiwgMjIzOTgsIDIzMDE0LCAyMzYyMiwKK2NvbnN0IHVpbnQ4X3QgZmZfZGNhX2dyaWRfMl90b19zY2ZbM10gPSB7CisgICAgNCwgMTAsIDE4Cit9OworCitjb25zdCB1aW50OF90IGZmX2RjYV9zY2ZfdG9fZ3JpZF8xWzMyXSA9IHsKKyAgICAwLCAxLCAyLCAzLCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA3LCA3LCA3LAorICAgIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDksIDksIDksIDksIDksIDksIDksIDEwCit9OworCitjb25zdCB1aW50OF90IGZmX2RjYV9zY2ZfdG9fZ3JpZF8yWzMyXSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfZGNhX2dyaWRfMV93ZWlnaHRzWzEyXVszMl0gPSB7CisgICAgeworICAgICAgICAxMjgsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICB9LCB7CisgICAgICAgICAgMCwgMTI4LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIH0sIHsKKyAgICAgICAgICAwLCAgIDAsIDEyOCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgfSwgeworICAgICAgICAgIDAsICAgMCwgICAwLCAxMjgsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICB9LCB7CisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgMTI4LCAxMjgsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIH0sIHsKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgMTI4LCAgODUsCisgICAgICAgICA0MywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgfSwgeworICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICA0MywKKyAgICAgICAgIDg1LCAxMjgsICA5NiwgIDY0LCAgMzIsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICB9LCB7CisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgIDMyLCAgNjQsICA5NiwgMTI4LCAxMDIsICA3NywKKyAgICAgICAgIDUxLCAgMjYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIH0sIHsKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAyNiwgIDUxLAorICAgICAgICAgNzcsIDEwMiwgMTI4LCAxMDcsICA4NSwgIDY0LCAgNDMsICAyMSwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgfSwgeworICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAyMSwgIDQzLCAgNjQsICA4NSwgMTA3LAorICAgICAgICAxMjgsIDExMCwgIDkxLCAgNzMsICA1NSwgIDM3LCAgMTgsICAgMCwKKyAgICB9LCB7CisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgIDE4LCAgMzcsICA1NSwgIDczLCAgOTEsIDExMCwgMTI4LAorICAgIH0sIHsKKyAgICAgICAgMCAvKiBlbXB0eSAqLworICAgIH0KK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfZGNhX3NiX3Jlb3JkZXJbOF1bOF0gPSB7CisgICAgeyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3IH0sCisgICAgeyAxLCAwLCAyLCAzLCA0LCA1LCA2LCA3IH0sCisgICAgeyAzLCAxLCAwLCAyLCA0LCA1LCA2LCA3IH0sCisgICAgeyAxLCAyLCAzLCAwLCA0LCA1LCA2LCA3IH0sCisgICAgeyAxLCAyLCA1LCAzLCAwLCA0LCA2LCA3IH0sCisgICAgeyAxLCAyLCAyLCA1LCAzLCAwLCA0LCA2IH0sCisgICAgeyAxLCAyLCAyLCA2LCA1LCAzLCAwLCA0IH0sCisgICAgeyAxLCAyLCAyLCA2LCA1LCA0LCAwLCAzIH0KK307CisKK2NvbnN0IGludDhfdCBmZl9kY2FfbGZlX2RlbHRhX2luZGV4XzE2WzhdID0geworICAgIC00LCAtMywgLTIsIC0xLCAyLCA0LCA2LCA4Cit9OworCitjb25zdCBpbnQ4X3QgZmZfZGNhX2xmZV9kZWx0YV9pbmRleF8yNFszMl0gPSB7CisgICAgLTgsIC04LCAtNywgLTcsIC02LCAtNiwgLTUsIC01LCAtNCwgLTQsIC0zLCAtMywgLTIsIC0yLCAtMSwgLTEsCisgICAgIDEsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX2RjYV9yc2RfcGFja181X2luXzhbMjU2XSA9IHsKKyAgICAweDAwMDAsIDB4MDEwMCwgMHgwMjAwLCAweDAwNDAsIDB4MDE0MCwgMHgwMjQwLCAweDAwODAsIDB4MDE4MCwKKyAgICAweDAyODAsIDB4MDAxMCwgMHgwMTEwLCAweDAyMTAsIDB4MDA1MCwgMHgwMTUwLCAweDAyNTAsIDB4MDA5MCwKKyAgICAweDAxOTAsIDB4MDI5MCwgMHgwMDIwLCAweDAxMjAsIDB4MDIyMCwgMHgwMDYwLCAweDAxNjAsIDB4MDI2MCwKKyAgICAweDAwYTAsIDB4MDFhMCwgMHgwMmEwLCAweDAwMDQsIDB4MDEwNCwgMHgwMjA0LCAweDAwNDQsIDB4MDE0NCwKKyAgICAweDAyNDQsIDB4MDA4NCwgMHgwMTg0LCAweDAyODQsIDB4MDAxNCwgMHgwMTE0LCAweDAyMTQsIDB4MDA1NCwKKyAgICAweDAxNTQsIDB4MDI1NCwgMHgwMDk0LCAweDAxOTQsIDB4MDI5NCwgMHgwMDI0LCAweDAxMjQsIDB4MDIyNCwKKyAgICAweDAwNjQsIDB4MDE2NCwgMHgwMjY0LCAweDAwYTQsIDB4MDFhNCwgMHgwMmE0LCAweDAwMDgsIDB4MDEwOCwKKyAgICAweDAyMDgsIDB4MDA0OCwgMHgwMTQ4LCAweDAyNDgsIDB4MDA4OCwgMHgwMTg4LCAweDAyODgsIDB4MDAxOCwKKyAgICAweDAxMTgsIDB4MDIxOCwgMHgwMDU4LCAweDAxNTgsIDB4MDI1OCwgMHgwMDk4LCAweDAxOTgsIDB4MDI5OCwKKyAgICAweDAwMjgsIDB4MDEyOCwgMHgwMjI4LCAweDAwNjgsIDB4MDE2OCwgMHgwMjY4LCAweDAwYTgsIDB4MDFhOCwKKyAgICAweDAyYTgsIDB4MDAwMSwgMHgwMTAxLCAweDAyMDEsIDB4MDA0MSwgMHgwMTQxLCAweDAyNDEsIDB4MDA4MSwKKyAgICAweDAxODEsIDB4MDI4MSwgMHgwMDExLCAweDAxMTEsIDB4MDIxMSwgMHgwMDUxLCAweDAxNTEsIDB4MDI1MSwKKyAgICAweDAwOTEsIDB4MDE5MSwgMHgwMjkxLCAweDAwMjEsIDB4MDEyMSwgMHgwMjIxLCAweDAwNjEsIDB4MDE2MSwKKyAgICAweDAyNjEsIDB4MDBhMSwgMHgwMWExLCAweDAyYTEsIDB4MDAwNSwgMHgwMTA1LCAweDAyMDUsIDB4MDA0NSwKKyAgICAweDAxNDUsIDB4MDI0NSwgMHgwMDg1LCAweDAxODUsIDB4MDI4NSwgMHgwMDE1LCAweDAxMTUsIDB4MDIxNSwKKyAgICAweDAwNTUsIDB4MDE1NSwgMHgwMjU1LCAweDAwOTUsIDB4MDE5NSwgMHgwMjk1LCAweDAwMjUsIDB4MDEyNSwKKyAgICAweDAyMjUsIDB4MDA2NSwgMHgwMTY1LCAweDAyNjUsIDB4MDBhNSwgMHgwMWE1LCAweDAyYTUsIDB4MDAwOSwKKyAgICAweDAxMDksIDB4MDIwOSwgMHgwMDQ5LCAweDAxNDksIDB4MDI0OSwgMHgwMDg5LCAweDAxODksIDB4MDI4OSwKKyAgICAweDAwMTksIDB4MDExOSwgMHgwMjE5LCAweDAwNTksIDB4MDE1OSwgMHgwMjU5LCAweDAwOTksIDB4MDE5OSwKKyAgICAweDAyOTksIDB4MDAyOSwgMHgwMTI5LCAweDAyMjksIDB4MDA2OSwgMHgwMTY5LCAweDAyNjksIDB4MDBhOSwKKyAgICAweDAxYTksIDB4MDJhOSwgMHgwMDAyLCAweDAxMDIsIDB4MDIwMiwgMHgwMDQyLCAweDAxNDIsIDB4MDI0MiwKKyAgICAweDAwODIsIDB4MDE4MiwgMHgwMjgyLCAweDAwMTIsIDB4MDExMiwgMHgwMjEyLCAweDAwNTIsIDB4MDE1MiwKKyAgICAweDAyNTIsIDB4MDA5MiwgMHgwMTkyLCAweDAyOTIsIDB4MDAyMiwgMHgwMTIyLCAweDAyMjIsIDB4MDA2MiwKKyAgICAweDAxNjIsIDB4MDI2MiwgMHgwMGEyLCAweDAxYTIsIDB4MDJhMiwgMHgwMDA2LCAweDAxMDYsIDB4MDIwNiwKKyAgICAweDAwNDYsIDB4MDE0NiwgMHgwMjQ2LCAweDAwODYsIDB4MDE4NiwgMHgwMjg2LCAweDAwMTYsIDB4MDExNiwKKyAgICAweDAyMTYsIDB4MDA1NiwgMHgwMTU2LCAweDAyNTYsIDB4MDA5NiwgMHgwMTk2LCAweDAyOTYsIDB4MDAyNiwKKyAgICAweDAxMjYsIDB4MDIyNiwgMHgwMDY2LCAweDAxNjYsIDB4MDI2NiwgMHgwMGE2LCAweDAxYTYsIDB4MDJhNiwKKyAgICAweDAwMGEsIDB4MDEwYSwgMHgwMjBhLCAweDAwNGEsIDB4MDE0YSwgMHgwMjRhLCAweDAwOGEsIDB4MDE4YSwKKyAgICAweDAyOGEsIDB4MDAxYSwgMHgwMTFhLCAweDAyMWEsIDB4MDA1YSwgMHgwMTVhLCAweDAyNWEsIDB4MDA5YSwKKyAgICAweDAxOWEsIDB4MDI5YSwgMHgwMDJhLCAweDAxMmEsIDB4MDIyYSwgMHgwMDZhLCAweDAxNmEsIDB4MDI2YSwKKyAgICAweDAwYWEsIDB4MDFhYSwgMHgwMmFhLCAweDAxNTUsIDB4MDE1NSwgMHgwMTU1LCAweDAxNTUsIDB4MDE1NSwKKyAgICAweDAxNTUsIDB4MDE1NSwgMHgwMTU1LCAweDAxNTUsIDB4MDE1NSwgMHgwMTU1LCAweDAxNTUsIDB4MDE1NQorfTsKKworY29uc3QgdWludDhfdCBmZl9kY2FfcnNkX3BhY2tfM19pbl83WzEyOF1bM10gPSB7CisgICAgeyAwLCAwLCAwIH0sIHsgMCwgMCwgMSB9LCB7IDAsIDAsIDIgfSwgeyAwLCAwLCAzIH0sCisgICAgeyAwLCAwLCA0IH0sIHsgMCwgMSwgMCB9LCB7IDAsIDEsIDEgfSwgeyAwLCAxLCAyIH0sCisgICAgeyAwLCAxLCAzIH0sIHsgMCwgMSwgNCB9LCB7IDAsIDIsIDAgfSwgeyAwLCAyLCAxIH0sCisgICAgeyAwLCAyLCAyIH0sIHsgMCwgMiwgMyB9LCB7IDAsIDIsIDQgfSwgeyAwLCAzLCAwIH0sCisgICAgeyAwLCAzLCAxIH0sIHsgMCwgMywgMiB9LCB7IDAsIDMsIDMgfSwgeyAwLCAzLCA0IH0sCisgICAgeyAwLCA0LCAwIH0sIHsgMCwgNCwgMSB9LCB7IDAsIDQsIDIgfSwgeyAwLCA0LCAzIH0sCisgICAgeyAwLCA0LCA0IH0sIHsgMSwgMCwgMCB9LCB7IDEsIDAsIDEgfSwgeyAxLCAwLCAyIH0sCisgICAgeyAxLCAwLCAzIH0sIHsgMSwgMCwgNCB9LCB7IDEsIDEsIDAgfSwgeyAxLCAxLCAxIH0sCisgICAgeyAxLCAxLCAyIH0sIHsgMSwgMSwgMyB9LCB7IDEsIDEsIDQgfSwgeyAxLCAyLCAwIH0sCisgICAgeyAxLCAyLCAxIH0sIHsgMSwgMiwgMiB9LCB7IDEsIDIsIDMgfSwgeyAxLCAyLCA0IH0sCisgICAgeyAxLCAzLCAwIH0sIHsgMSwgMywgMSB9LCB7IDEsIDMsIDIgfSwgeyAxLCAzLCAzIH0sCisgICAgeyAxLCAzLCA0IH0sIHsgMSwgNCwgMCB9LCB7IDEsIDQsIDEgfSwgeyAxLCA0LCAyIH0sCisgICAgeyAxLCA0LCAzIH0sIHsgMSwgNCwgNCB9LCB7IDIsIDAsIDAgfSwgeyAyLCAwLCAxIH0sCisgICAgeyAyLCAwLCAyIH0sIHsgMiwgMCwgMyB9LCB7IDIsIDAsIDQgfSwgeyAyLCAxLCAwIH0sCisgICAgeyAyLCAxLCAxIH0sIHsgMiwgMSwgMiB9LCB7IDIsIDEsIDMgfSwgeyAyLCAxLCA0IH0sCisgICAgeyAyLCAyLCAwIH0sIHsgMiwgMiwgMSB9LCB7IDIsIDIsIDIgfSwgeyAyLCAyLCAzIH0sCisgICAgeyAyLCAyLCA0IH0sIHsgMiwgMywgMCB9LCB7IDIsIDMsIDEgfSwgeyAyLCAzLCAyIH0sCisgICAgeyAyLCAzLCAzIH0sIHsgMiwgMywgNCB9LCB7IDIsIDQsIDAgfSwgeyAyLCA0LCAxIH0sCisgICAgeyAyLCA0LCAyIH0sIHsgMiwgNCwgMyB9LCB7IDIsIDQsIDQgfSwgeyAzLCAwLCAwIH0sCisgICAgeyAzLCAwLCAxIH0sIHsgMywgMCwgMiB9LCB7IDMsIDAsIDMgfSwgeyAzLCAwLCA0IH0sCisgICAgeyAzLCAxLCAwIH0sIHsgMywgMSwgMSB9LCB7IDMsIDEsIDIgfSwgeyAzLCAxLCAzIH0sCisgICAgeyAzLCAxLCA0IH0sIHsgMywgMiwgMCB9LCB7IDMsIDIsIDEgfSwgeyAzLCAyLCAyIH0sCisgICAgeyAzLCAyLCAzIH0sIHsgMywgMiwgNCB9LCB7IDMsIDMsIDAgfSwgeyAzLCAzLCAxIH0sCisgICAgeyAzLCAzLCAyIH0sIHsgMywgMywgMyB9LCB7IDMsIDMsIDQgfSwgeyAzLCA0LCAwIH0sCisgICAgeyAzLCA0LCAxIH0sIHsgMywgNCwgMiB9LCB7IDMsIDQsIDMgfSwgeyAzLCA0LCA0IH0sCisgICAgeyA0LCAwLCAwIH0sIHsgNCwgMCwgMSB9LCB7IDQsIDAsIDIgfSwgeyA0LCAwLCAzIH0sCisgICAgeyA0LCAwLCA0IH0sIHsgNCwgMSwgMCB9LCB7IDQsIDEsIDEgfSwgeyA0LCAxLCAyIH0sCisgICAgeyA0LCAxLCAzIH0sIHsgNCwgMSwgNCB9LCB7IDQsIDIsIDAgfSwgeyA0LCAyLCAxIH0sCisgICAgeyA0LCAyLCAyIH0sIHsgNCwgMiwgMyB9LCB7IDQsIDIsIDQgfSwgeyA0LCAzLCAwIH0sCisgICAgeyA0LCAzLCAxIH0sIHsgNCwgMywgMiB9LCB7IDQsIDMsIDMgfSwgeyA0LCAzLCA0IH0sCisgICAgeyA0LCA0LCAwIH0sIHsgNCwgNCwgMSB9LCB7IDQsIDQsIDIgfSwgeyA0LCA0LCAzIH0sCisgICAgeyA0LCA0LCA0IH0sIHsgMiwgMiwgMiB9LCB7IDIsIDIsIDIgfSwgeyAyLCAyLCAyIH0KK307CisKK2NvbnN0IGZsb2F0IGZmX2RjYV9yc2RfbGV2ZWxfMmFbMl0gPSB7CisgICAgLTAuNDcsIDAuNDcKK307CisKK2NvbnN0IGZsb2F0IGZmX2RjYV9yc2RfbGV2ZWxfMmJbMl0gPSB7CisgICAgLTAuNjQ1LCAwLjY0NQorfTsKKworY29uc3QgZmxvYXQgZmZfZGNhX3JzZF9sZXZlbF8zWzNdID0geworICAgIC0wLjY0NSwgMC4wLCAwLjY0NQorfTsKKworY29uc3QgZmxvYXQgZmZfZGNhX3JzZF9sZXZlbF81WzVdID0geworICAgIC0wLjg3NSwgLTAuMzc1LCAwLjAsIDAuMzc1LCAwLjg3NQorfTsKKworY29uc3QgZmxvYXQgZmZfZGNhX3JzZF9sZXZlbF84WzhdID0geworICAgIC0xLjAsIC0wLjYyNSwgLTAuMjkxNjY2NjY3LCAwLjAsIDAuMjUsIDAuNSwgMC43NSwgMS4wCit9OworCitjb25zdCBmbG9hdCBmZl9kY2FfcnNkX2xldmVsXzE2WzE2XSA9IHsKKyAgICAtMS4zMTI1LCAtMS4xMzc1LCAtMC45NjI1LCAtMC43ODc1LAorICAgIC0wLjYxMjUsIC0wLjQzNzUsIC0wLjI2MjUsIC0wLjA4NzUsCisgICAgIDAuMDg3NSwgIDAuMjYyNSwgIDAuNDM3NSwgIDAuNjEyNSwKKyAgICAgMC43ODc1LCAgMC45NjI1LCAgMS4xMzc1LCAgMS4zMTI1Cit9OworCitjb25zdCBmbG9hdCBmZl9kY2Ffc3ludGhfZW52WzMyXSA9IHsKKyAgICAwLjAwMjQwNzYzNjY2MzkwLCAwLjAwOTYwNzM1OTc5ODM4LCAwLjAyMTUyOTgzMjEzMzkwLCAwLjAzODA2MDIzMzc0NDM2LAorICAgIDAuMDU5MDM5MzY3ODI1ODIsIDAuMDg0MjY1MTkzODQ4NzMsIDAuMTEzNDk0NzczMzE4NjMsIDAuMTQ2NDQ2NjA5NDA2NzMsCisgICAgMC4xODI4MDMzNTc5MTgxOCwgMC4yMjIyMTQ4ODM0OTAyMCwgMC4yNjQzMDE2MzE1ODcwMCwgMC4zMDg2NTgyODM4MTc0NiwKKyAgICAwLjM1NDg1NzY2MTM3Mjc3LCAwLjQwMjQ1NDgzODk5MTk0LCAwLjQ1MDk5MTQyOTgzNTIyLCAwLjUsCisgICAgMC41NDkwMDg1NzAxNjQ3OCwgMC41OTc1NDUxNjEwMDgwNiwgMC42NDUxNDIzMzg2MjcyMywgMC42OTEzNDE3MTYxODI1NCwKKyAgICAwLjczNTY5ODM2ODQxMzAwLCAwLjc3Nzc4NTExNjUwOTgwLCAwLjgxNzE5NjY0MjA4MTgyLCAwLjg1MzU1MzM5MDU5MzI3LAorICAgIDAuODg2NTA1MjI2NjgxMzcsIDAuOTE1NzM0ODA2MTUxMjcsIDAuOTQwOTYwNjMyMTc0MTgsIDAuOTYxOTM5NzY2MjU1NjQsCisgICAgMC45Nzg0NzAxNjc4NjYxMCwgMC45OTAzOTI2NDAyMDE2MiwgMC45OTc1OTIzNjMzMzYxMCwgMS4wCit9OworCitjb25zdCBmbG9hdCBmZl9kY2FfY29ycl9jZlszMl1bMTFdID0geworICAgIHstMC4wMTE3OSwgMC4wNDI4MSwgMC40NjcxMiwgMC40NjM0NSwtMy45NDUyNSwgMy45NDUyNSwKKyAgICAgLTAuNDYzNDUsLTAuNDY3MTIsLTAuMDQyODEsIDAuMDExNzksLTAuMDAyOTkgfSwKKyAgICB7LTAuMDA5MjksIDAuMDQ4ODIsIDAuNDUyNTIsIDAuMzc5NzIsLTMuODU0NDYsIDQuMDMxODksCisgICAgIC0wLjU1MDY5LC0wLjQ4MDQwLC0wLjAzNTk5LCAwLjAxNDQ1LC0wLjAwMjI5IH0sCisgICAgey0wLjAwNjk2LCAwLjA1NDAzLCAwLjQzNjc0LCAwLjI5OTYxLC0zLjc1OTc1LCA0LjExNDEzLAorICAgICAtMC42NDEzNSwtMC40OTIyMSwtMC4wMjgzNCwgMC4wMTcyNiwtMC4wMDE1NiB9LAorICAgIHstMC4wMDQ4MSwgMC4wNTg0NywgMC40MTk5MywgMC4yMjMxOSwtMy42NjEzOCwgNC4xOTE3NSwKKyAgICAgLTAuNzM1MjksLTAuNTAyNDEsLTAuMDE5ODMsIDAuMDIwMjEsLTAuMDAwODAgfSwKKyAgICB7LTAuMDAyODQsIDAuMDYyMTYsIDAuNDAyMjQsIDAuMTUwNTMsLTMuNTU5NjMsIDQuMjY0NTIsCisgICAgIC0wLjgzMjM5LC0wLjUxMDg1LC0wLjAxMDQ3LCAwLjAyMzI4LC0wLjAwMDAzIH0sCisgICAgey0wLjAwMTA1LCAwLjA2NTE1LCAwLjM4Mzc4LCAwLjA4MTY4LC0zLjQ1NDc1LCA0LjMzMjI1LAorICAgICAtMC45MzI0OSwtMC41MTczOCwtMC4wMDAyNCwgMC4wMjY0NiwgMC4wMDA3NCB9LAorICAgIHsgMC4wMDA1NCwgMC4wNjc0NSwgMC4zNjQ3MSwgMC4wMTY2OCwtMy4zNDcwMywgNC4zOTQ3NSwKKyAgICAgLTEuMDM1NDMsLTAuNTIxODQsIDAuMDEwODUsIDAuMDI5NzMsIDAuMDAxNTIgfSwKKyAgICB7IDAuMDAxOTUsIDAuMDY5MTIsIDAuMzQ1MTUsLTAuMDQ0NDUsLTMuMjM2NzYsIDQuNDUxODUsCisgICAgIC0xLjE0MTA1LC0wLjUyNDEwLCAwLjAyMjgwLCAwLjAzMzA2LCAwLjAwMjI4IH0sCisgICAgeyAwLjAwMzE4LCAwLjA3MDE3LCAwLjMyNTIxLC0wLjEwMTY4LC0zLjEyNDIyLCA0LjUwMzM5LAorICAgICAtMS4yNDkxNCwtMC41MjQwMCwgMC4wMzU2MSwgMC4wMzY0MywgMC4wMDMwMiB9LAorICAgIHsgMC4wMDQyMiwgMC4wNzA2NSwgMC4zMDUwMywtMC4xNTUwMywtMy4wMDk2OSwgNC41NDkyMSwKKyAgICAgLTEuMzU5NTIsLTAuNTIxNDEsIDAuMDQ5MjUsIDAuMDM5ODEsIDAuMDAzNzMgfSwKKyAgICB7IDAuMDA1MDgsIDAuMDcwNjEsIDAuMjg0NzEsLTAuMjA0NTAsLTIuODkzNDgsIDQuNTg5MTksCisgICAgIC0xLjQ3MTk3LC0wLjUxNjE4LCAwLjA2MzcwLCAwLjA0MzE5LCAwLjAwNDQwIH0sCisgICAgeyAwLjAwNTc3LCAwLjA3MDA3LCAwLjI2NDM2LC0wLjI1MDEzLC0yLjc3NTg3LCA0LjYyMzIxLAorICAgICAtMS41ODYyNywtMC41MDgxOCwgMC4wNzg5NSwgMC4wNDY1MiwgMC4wMDUwMSB9LAorICAgIHsgMC4wMDYyOSwgMC4wNjkwOSwgMC4yNDQxMCwtMC4yOTE5NCwtMi42NTcxNiwgNC42NTExOCwKKyAgICAgLTEuNzAyMTksLTAuNDk3MjcsIDAuMDk0OTQsIDAuMDQ5NzksIDAuMDA1NTYgfSwKKyAgICB7IDAuMDA2NjYsIDAuMDY3NjksIDAuMjI0MDAsLTAuMzMwMDAsLTIuNTM3NjQsIDQuNjczMDIsCisgICAgIC0xLjgxOTQ5LC0wLjQ4MzM1LCAwLjExMTY2LCAwLjA1Mjk1LCAwLjAwNjA0IH0sCisgICAgeyAwLjAwNjg3LCAwLjA2NTkyLCAwLjIwNDE2LC0wLjM2NDM1LC0yLjQxNzYwLCA0LjY4ODY2LAorICAgICAtMS45Mzc5MSwtMC40NjYyNywgMC4xMjkwNCwgMC4wNTU5NywgMC4wMDY0MiB9LAorICAgIHsgMC4wMDY5NCwgMC4wNjM4MywgMC4xODQ2OCwtMC4zOTUwNiwtMi4yOTczMiwgNC42OTgwNiwKKyAgICAgLTIuMDU3MjAsLTAuNDQ1OTMsIDAuMTQ3MDUsIDAuMDU4ODEsIDAuMDA2NzEgfSwKKyAgICB7IDAuMDA2ODksIDAuMDYxNDQsIDAuMTY1NjEsLTAuNDIyMjMsLTIuMTc3MTAsIDQuNzAxMjAsCisgICAgIC0yLjE3NzEwLC0wLjQyMjIzLCAwLjE2NTYxLCAwLjA2MTQ0LCAwLjAwNjg5IH0sCisgICAgeyAwLjAwNjcxLCAwLjA1ODgxLCAwLjE0NzA1LC0wLjQ0NTkzLC0yLjA1NzIwLCA0LjY5ODA2LAorICAgICAtMi4yOTczMiwtMC4zOTUwNiwgMC4xODQ2OCwgMC4wNjM4MywgMC4wMDY5NCB9LAorICAgIHsgMC4wMDY0MiwgMC4wNTU5NywgMC4xMjkwNCwtMC40NjYyNywtMS45Mzc5MSwgNC42ODg2NSwKKyAgICAgLTIuNDE3NTksLTAuMzY0MzUsIDAuMjA0MTYsIDAuMDY1OTIsIDAuMDA2ODcgfSwKKyAgICB7IDAuMDA2MDQsIDAuMDUyOTUsIDAuMTExNjYsLTAuNDgzMzQsLTEuODE5NDksIDQuNjczMDEsCisgICAgIC0yLjUzNzYzLC0wLjMzMDAwLCAwLjIyNDAwLCAwLjA2NzY5LCAwLjAwNjY2IH0sCisgICAgeyAwLjAwNTU2LCAwLjA0OTc5LCAwLjA5NDk0LC0wLjQ5NzI3LC0xLjcwMjE5LCA0LjY1MTE3LAorICAgICAtMi42NTcxNSwtMC4yOTE5NCwgMC4yNDQwOSwgMC4wNjkwOSwgMC4wMDYyOSB9LAorICAgIHsgMC4wMDUwMSwgMC4wNDY1MiwgMC4wNzg5NCwtMC41MDgxOCwtMS41ODYyNywgNC42MjMyMSwKKyAgICAgLTIuNzc1ODcsLTAuMjUwMTMsIDAuMjY0MzYsIDAuMDcwMDcsIDAuMDA1NzcgfSwKKyAgICB7IDAuMDA0NDAsIDAuMDQzMTksIDAuMDYzNzAsLTAuNTE2MTgsLTEuNDcxOTcsIDQuNTg5MTksCisgICAgIC0yLjg5MzQ4LC0wLjIwNDUwLCAwLjI4NDcxLCAwLjA3MDYxLCAwLjAwNTA4IH0sCisgICAgeyAwLjAwMzczLCAwLjAzOTgxLCAwLjA0OTI1LC0wLjUyMTQxLC0xLjM1OTUyLCA0LjU0OTIxLAorICAgICAtMy4wMDk3MCwtMC4xNTUwMywgMC4zMDUwMywgMC4wNzA2NSwgMC4wMDQyMiB9LAorICAgIHsgMC4wMDMwMiwgMC4wMzY0MywgMC4wMzU2MSwtMC41MjQwMCwtMS4yNDkxNSwgNC41MDMzOSwKKyAgICAgLTMuMTI0MjIsLTAuMTAxNjgsIDAuMzI1MjEsIDAuMDcwMTcsIDAuMDAzMTggfSwKKyAgICB7IDAuMDAyMjgsIDAuMDMzMDYsIDAuMDIyODAsLTAuNTI0MTAsLTEuMTQxMDUsIDQuNDUxODYsCisgICAgIC0zLjIzNjc3LC0wLjA0NDQ1LCAwLjM0NTE1LCAwLjA2OTEyLCAwLjAwMTk1IH0sCisgICAgeyAwLjAwMTUyLCAwLjAyOTczLCAwLjAxMDg1LC0wLjUyMTg0LC0xLjAzNTQ0LCA0LjM5NDc3LAorICAgICAtMy4zNDcwNCwgMC4wMTY2OCwgMC4zNjQ3MSwgMC4wNjc0NSwgMC4wMDA1NCB9LAorICAgIHsgMC4wMDA3NCwgMC4wMjY0NiwtMC4wMDAyNCwtMC41MTczOCwtMC45MzI0OSwgNC4zMzIyNiwKKyAgICAgLTMuNDU0NzYsIDAuMDgxNjgsIDAuMzgzNzgsIDAuMDY1MTUsLTAuMDAxMDUgfSwKKyAgICB7LTAuMDAwMDMsIDAuMDIzMjgsLTAuMDEwNDcsLTAuNTEwODUsLTAuODMyMzksIDQuMjY0NTIsCisgICAgIC0zLjU1OTYzLCAwLjE1MDUzLCAwLjQwMjI0LCAwLjA2MjE2LC0wLjAwMjg0IH0sCisgICAgey0wLjAwMDgwLCAwLjAyMDIxLC0wLjAxOTgzLC0wLjUwMjQxLC0wLjczNTI5LCA0LjE5MTc0LAorICAgICAtMy42NjEzOCwgMC4yMjMxOSwgMC40MTk5MywgMC4wNTg0NywtMC4wMDQ4MSB9LAorICAgIHstMC4wMDE1NiwgMC4wMTcyNiwtMC4wMjgzNCwtMC40OTIyMSwtMC42NDEzNSwgNC4xMTQxMywKKyAgICAgLTMuNzU5NzQsIDAuMjk5NjEsIDAuNDM2NzQsIDAuMDU0MDMsLTAuMDA2OTYgfSwKKyAgICB7LTAuMDAyMjksIDAuMDE0NDUsLTAuMDM1OTksLTAuNDgwNDAsLTAuNTUwNjksIDQuMDMxODgsCisgICAgIC0zLjg1NDQ1LCAwLjM3OTcyLCAwLjQ1MjUxLCAwLjA0ODgyLC0wLjAwOTI5IH0sCit9OworCitjb25zdCBmbG9hdCBmZl9kY2FfcXVhbnRfYW1wWzU3XSA9IHsKKyAgICA0Ljg4MjgxMjUwRS0wNCwgMS40NjQ4NDM3NUUtMDMsIDIuMzIyNjcwMzFFLTAzLCAzLjI4NDc1MTY3RS0wMywKKyAgICA0LjY0NTM0MDE0RS0wMywgNi41Njk1MDMzNEUtMDMsIDkuMjkwNjgwMjlFLTAzLCAxLjMxMzkwMDY3RS0wMiwKKyAgICAxLjg1ODEzNjA2RS0wMiwgMi42Mjc4MDEzNEUtMDIsIDMuNzE2MjcyMTJFLTAyLCA1LjI1NTYwMjY3RS0wMiwKKyAgICA3LjQzMjU0NDIzRS0wMiwgMS4wNTExMjA1M0UtMDEsIDEuNDg2NTA4ODVFLTAxLCAyLjEwMjI0MTA3RS0wMSwKKyAgICAyLjk3MzAxNzY5RS0wMSwgNC4yMDQ0ODIxNEUtMDEsIDUuOTQ2MDM1MzlFLTAxLCA4LjQwODk2NDI4RS0wMSwKKyAgICAxLjE4OTIwNzA4RSswMCwgMS42ODE3OTI4NkUrMDAsIDIuMzc4NDE0MTVFKzAwLCAzLjM2MzU4NTcxRSswMCwKKyAgICA0Ljc1NjgyODMxRSswMCwgNi43MjcxNzE0MkUrMDAsIDkuNTEzNjU2NjJFKzAwLCAxLjM0NTQzNDI4RSswMSwKKyAgICAxLjkwMjczMTMyRSswMSwgMi42OTA4Njg1N0UrMDEsIDMuODA1NDYyNjVFKzAxLCA1LjM4MTczNzE0RSswMSwKKyAgICA3LjYxMDkyNTI5RSswMSwgMS4wNzYzNDc0M0UrMDIsIDEuNTIyMTg1MDZFKzAyLCAyLjE1MjY5NDg1RSswMiwKKyAgICAzLjA0NDM3MDEyRSswMiwgNC4zMDUzODk3MUUrMDIsIDYuMDg4NzQwMjNFKzAyLCA4LjYxMDc3OTQyRSswMiwKKyAgICAxLjIxNzc0ODA1RSswMywgMS43MjIxNTU4OEUrMDMsIDIuNDM1NDk2MDlFKzAzLCAzLjQ0NDMxMTc3RSswMywKKyAgICA0Ljg3MDk5MjE5RSswMywgNi44ODg2MjM1NEUrMDMsIDkuNzQxOTg0MzhFKzAzLCAxLjM3NzcyNDcxRSswNCwKKyAgICAxLjk0ODM5Njg4RSswNCwgMi43NTU0NDk0MUUrMDQsIDMuODk2NzkzNzVFKzA0LCA1LjUxMDg5ODgzRSswNCwKKyAgICA3Ljc5MzU4NzUwRSswNCwgMS4xMDIxNzk3N0UrMDUsIDEuNTU4NzE3NTBFKzA1LCAyLjIwNDM1OTUzRSswNSwKKyAgICAwLjAwMDAwMDAwRSswMCwKK307CisKK2NvbnN0IGZsb2F0IGZmX2RjYV9zdF9jb2VmZlszNF0gPSB7CisgICAgMi42OTA4Njg1N0UrMDEsIDIuNjkwODY4NTdFKzAxLCAxLjM0NTQzNDE5RSswMSwgNi43MjcxNzE0MkUrMDAsCisgICAgMy4zNjM1ODU3MUUrMDAsIDEuNjgxNzkyODZFKzAwLCA4LjQwODk2NDI4RS0wMSwgNS45NDYwMzQ3OUUtMDEsCisgICAgNC4yMDQ0ODIxNEUtMDEsIDIuOTczMDE3OTlFLTAxLCAyLjEwMjI0MTA3RS0wMSwgMS40ODY1MDkwMEUtMDEsCisgICAgMS4wNTExMjA5OEUtMDEsIDcuNDMyNTM5NzZFLTAyLCA1LjI1NTYwMDA2RS0wMiwgMy43MTYyNjk4OEUtMDIsCisgICAgMy4xMjUwMDAwMEUtMDIsIDIuNjI3ODAwMDNFLTAyLCAxLjg1ODEzOTk3RS0wMiwgMS4zMTM5MDAwMkUtMDIsCisgICAgOS4yOTA2OTk4NUUtMDMsIDYuNTY5NTAwMDhFLTAzLCA0LjY0NTMwMDEwRS0wMywgMy4yODQ4MDAxMEUtMDMsCisgICAgMi4zMjI3MDAxMUUtMDMsIDEuNjQyNDAwMDVFLTAzLCAxLjE2MTMwMDAwRS0wMywgNS44MDY5OTk5OEUtMDQsCisgICAgMi45MDI5OTk5OUUtMDQsIDEuNDUyMDAwMDBFLTA0LCA3LjI1OTk5OTk4RS0wNSwgMy42Mjk5OTk5OUUtMDUsCisgICAgMS44MjAwMDAwM0UtMDUsIDAuMDAwMDAwMDBFKzAwLAorfTsKKworY29uc3QgZmxvYXQgZmZfZGNhX2xvbmdfd2luZG93WzEyOF0gPSB7CisgICAgMC4wMDAwMDAwMEUrMDAsIDcuNDI4ODI0MTJFLTA2LCA1LjI4MDIwOTczRS0wNSwgMS43MTAwNzAwNkUtMDQsCisgICAgMy45NjY1MzIyNEUtMDQsIDcuNjM5NDYwOTZFLTA0LCAxLjMwNjU1NzkxRS0wMywgMi4wNTc1MDExMUUtMDMsCisgICAgMy4wNDkwMDQ1OUUtMDMsIDQuMzEyMzkxMzlFLTAzLCA1Ljg3Nzk2MjgwRS0wMywgNy43NzQ4ODI5NUUtMDMsCisgICAgMS4wMDMxMDY4N0UtMDIsIDEuMjY3MzA4NzRFLTAyLCAxLjU3MjYwNTU5RS0wMiwgMS45MjEzNTQ2MUUtMDIsCisgICAgMi4zMTU3NDk0MUUtMDIsIDIuNzU3ODEyNjZFLTAyLCAzLjI0OTM4NzQ0RS0wMiwgMy43OTIxMzE2OUUtMDIsCisgICAgNC4zODc1MTAyMEUtMDIsIDUuMDM2NzkxMDRFLTAyLCA1Ljc0MTA0MDA0RS0wMiwgNi41MDExMTY2MEUtMDIsCisgICAgNy4zMTc2NzE5MkUtMDIsIDguMTkxMTQ0NDdFLTAyLCA5LjEyMTc2MDczRS0wMiwgMS4wMTA5NTMyNkUtMDEsCisgICAgMS4xMTU0MjU5N0UtMDEsIDEuMjI1NTUyNzhFLTAxLCAxLjM0MTI3MTI1RS0wMSwgMS40NjI0OTgxNkUtMDEsCisgICAgMS41ODkxMjk3MkUtMDEsIDEuNzIxMDQyMTBFLTAxLCAxLjg1ODA5MTgwRS0wMSwgMi4wMDAxMTY0MUUtMDEsCisgICAgMi4xNDY5MzUxNkUtMDEsIDIuMjk4MzQ5NTlFLTAxLCAyLjQ1NDE0NDIxRS0wMSwgMi42MTQwODc3NkUtMDEsCisgICAgMi43Nzc5MzM3OEUtMDEsIDIuOTQ1NDIxMzRFLTAxLCAzLjExNjI3Njg2RS0wMSwgMy4yOTAyMTM5NEUtMDEsCisgICAgMy40NjY5MzYzNUUtMDEsIDMuNjQ2MTM2ODJFLTAxLCAzLjgyNzUwMDY0RS0wMSwgNC4wMTA3MDQ0NkUtMDEsCisgICAgNC4xOTU0MTk4NUUtMDEsIDQuMzgxMzEzMzJFLTAxLCA0LjU2ODA0NzIzRS0wMSwgNC43NTUyODI3MEUtMDEsCisgICAgNC45NDI2Nzk0MUUtMDEsIDUuMTI5ODk3MDBFLTAxLCA1LjMxNjU5NzgyRS0wMSwgNS41MDI0NDY4OUUtMDEsCisgICAgNS42ODcxMTI4MUUtMDEsIDUuODcwMjcxMzNFLTAxLCA2LjA1MTYwNDE1RS0wMSwgNi4yMzA4MDEzNEUtMDEsCisgICAgNi40MDc1NjE5MEUtMDEsIDYuNTgxNTk1NTRFLTAxLCA2Ljc1MjYyMzkyRS0wMSwgNi45MjAzODA1OUUtMDEsCisgICAgNy4wODQ2MTM0NEUtMDEsIDcuMjQ1MDg0NjRFLTAxLCA3LjQwMTU3MTg3RS0wMSwgNy41NTM4NjgyOUUtMDEsCisgICAgNy43MDE3ODU1NkUtMDEsIDcuODQ1MTUxNDJFLTAxLCA3Ljk4MzgxMjY5RS0wMSwgOC4xMTc2MzQ2NUUtMDEsCisgICAgOC4yNDY1MDE2OEUtMDEsIDguMzcwMzE2MDNFLTAxLCA4LjQ4OTAwMjU5RS0wMSwgOC42MDI1MDIzNUUtMDEsCisgICAgOC43MTA3NzgzNkUtMDEsIDguODEzODEyNzNFLTAxLCA4LjkxMTYwNTQ4RS0wMSwgOS4wMDQxNzc0NUUtMDEsCisgICAgOS4wOTE1NjYyMUUtMDEsIDkuMTczODI5NTZFLTAxLCA5LjI1MTA0MDgyRS0wMSwgOS4zMjMyODk5OUUtMDEsCisgICAgOS4zOTA2ODQzN0UtMDEsIDkuNDUzMzQ0OTRFLTAxLCA5LjUxMTQwNjQyRS0wMSwgOS41NjUwMTc4MkUtMDEsCisgICAgOS42MTQzMzc2OEUtMDEsIDkuNjU5NTM2NDhFLTAxLCA5LjcwMDc5MzAzRS0wMSwgOS43MzgyOTM4OUUtMDEsCisgICAgOS43NzIyMzIxN0UtMDEsIDkuODAyODA1NzhFLTAxLCA5LjgzMDIxNTU3RS0wMSwgOS44NTQ2NjU0MEUtMDEsCisgICAgOS44NzYzNTg1MUUtMDEsIDkuODk1NDk4MTZFLTAxLCA5LjkxMjI4NDAyRS0wMSwgOS45MjY5MTMzOEUtMDEsCisgICAgOS45Mzk1Nzg3N0UtMDEsIDkuOTUwNDY2MTZFLTAxLCA5Ljk1OTc1NDM1RS0wMSwgOS45Njc2MTM4MkUtMDEsCisgICAgOS45NzQyMDcyOEUtMDEsIDkuOTc5Njg3MzNFLTAxLCA5Ljk4NDE5NjQyRS0wMSwgOS45ODc4NjU2OUUtMDEsCisgICAgOS45OTA4MTczMUUtMDEsIDkuOTkzMTU5NzdFLTAxLCA5Ljk5NDk5MzIxRS0wMSwgOS45OTY0MDY0NEUtMDEsCisgICAgOS45OTc0NzU3NEUtMDEsIDkuOTk4MjY5NjhFLTAxLCA5Ljk5ODg0NjY1RS0wMSwgOS45OTkyNTQ5NEUtMDEsCisgICAgOS45OTk1MzYyOEUtMDEsIDkuOTk5NzIzNDNFLTAxLCA5Ljk5OTg0MzI0RS0wMSwgOS45OTk5MTY1NUUtMDEsCisgICAgOS45OTk5NTg4N0UtMDEsIDkuOTk5OTgxNTJFLTAxLCA5Ljk5OTk5Mjg1RS0wMSwgOS45OTk5OTc2MkUtMDEsCisgICAgOS45OTk5OTk0MEUtMDEsIDEuMDAwMDAwMDBFKzAwLCAxLjAwMDAwMDAwRSswMCwgMS4wMDAwMDAwMEUrMDAsCit9OworCitjb25zdCBmbG9hdCBmZl9kY2FfbGZlX3N0ZXBfc2l6ZV8xNlsxMDFdID0geworICAgIDIuMTM2Mjk1NjYzMzE5ODAzNUUtMDA0LCAyLjQ0MTQ4MDc1ODA3OTc3NTRFLTAwNCwgMi43NDY2NjU4NTI4Mzk3NDczRS0wMDQsCisgICAgMi43NDY2NjU4NTI4Mzk3NDczRS0wMDQsIDMuMDUxODUwOTQ3NTk5NzE5MkUtMDA0LCAzLjM1NzAzNjA0MjM1OTY5MTFFLTAwNCwKKyAgICAzLjk2NzQwNjIzMTg3OTYzNTBFLTAwNCwgNC4yNzI1OTEzMjY2Mzk2MDY5RS0wMDQsIDQuNTc3Nzc2NDIxMzk5NTc4OEUtMDA0LAorICAgIDUuMTg4MTQ2NjEwOTE5NTIyN0UtMDA0LCA1Ljc5ODUxNjgwMDQzOTQ2NjVFLTAwNCwgNi4xMDM3MDE4OTUxOTk0Mzg1RS0wMDQsCisgICAgNi43MTQwNzIwODQ3MTkzODIzRS0wMDQsIDcuNjI5NjI3MzY4OTk5Mjk4MUUtMDA0LCA4LjIzOTk5NzU1ODUxOTI0MTlFLTAwNCwKKyAgICA5LjE1NTU1Mjg0Mjc5OTE1NzdFLTAwNCwgMS4wMDcxMTA4MTI3MDc5MDczRS0wMDMsIDEuMDk4NjY2MzQxMTM1ODk4OUUtMDAzLAorICAgIDEuMjIwNzQwMzc5MDM5ODg3N0UtMDAzLCAxLjM0MjgxNDQxNjk0Mzg3NjVFLTAwMywgMS40NjQ4ODg0NTQ4NDc4NjUyRS0wMDMsCisgICAgMS42MTc0ODEwMDIyMjc4NTEyRS0wMDMsIDEuNzcwMDczNTQ5NjA3ODM3MkUtMDAzLCAxLjk1MzE4NDYwNjQ2MzgyMDNFLTAwMywKKyAgICAyLjEzNjI5NTY2MzMxOTgwMzVFLTAwMywgMi4zNDk5MjUyMjk2NTE3ODM4RS0wMDMsIDIuNTk0MDczMzA1NDU5NzYxM0UtMDAzLAorICAgIDIuODY4NzM5ODkwNzQzNzM2MUUtMDAzLCAzLjE0MzQwNjQ3NjAyNzcxMDhFLTAwMywgMy40NDg1OTE1NzA3ODc2ODI3RS0wMDMsCisgICAgMy43ODQyOTUxNzUwMjM2NTE4RS0wMDMsIDQuMTgxMDM1Nzk4MjExNjE1M0UtMDAzLCA0LjYwODI5NDkzMDg3NTU3NjBFLTAwMywKKyAgICA1LjA2NjA3MjU3MzAxNTUzMzlFLTAwMywgNS41NTQzNjg3MjQ2MzE0ODkwRS0wMDMsIDYuMTAzNzAxODk1MTk5NDM4NUUtMDAzLAorICAgIDYuNzQ0NTkwNTk0MTk1Mzc5NUUtMDAzLCA3LjQxNTk5NzgwMjY2NzMxNzdFLTAwMywgOC4xNDg0NDIwMzAwOTEyNTEyRS0wMDMsCisgICAgOC45NDE5MjMyNzY0NjcxNzgyRS0wMDMsIDkuODU3NDc4NTYwNzQ3MDk0MEUtMDAzLCAxLjA4MzQwNzA4NjM5NzkwMDRFLTAwMiwKKyAgICAxLjE5MzI3MzcyMDUxMTQ5MDNFLTAwMiwgMS4zMTIyOTU5MDc0Njc4NzkzRS0wMDIsIDEuNDQzNTI1NDk4MjE0NjY3M0UtMDAyLAorICAgIDEuNTg2OTYyNDkyNzUxODU0MEUtMDAyLCAxLjc0NTY1ODc0MjAyNzAzOTRFLTAwMiwgMS45MTk2MTQyNDYwNDAyMjMzRS0wMDIsCisgICAgMi4xMTE4ODA4NTU3MzkwMDU3RS0wMDIsIDIuMzIyNDU4NTcxMTIzMzg2MkUtMDAyLCAyLjU1NDM5OTI0MzE0MDk2NDlFLTAwMiwKKyAgICAyLjgxMDc1NDcyMjczOTM0MTNFLTAwMiwgMy4wOTE1MjUwMDk5MTg1MTU1RS0wMDIsIDMuNDAyODEzODA2NTczNjg2N0UtMDAyLAorICAgIDMuNzQxNTY5MjYxNzU3MjU1NkUtMDAyLCA0LjExNjk0NjkyODMxMjAyMTVFLTAwMiwgNC41MjU4OTQ5NTUyOTAzODM0RS0wMDIsCisgICAgNC45ODA2MjA3NDY0ODI3NDE4RS0wMDIsIDUuNDc4MDcyNDUwOTQxNDk1OEUtMDAyLCA2LjAyNzQwNTYyMTUwOTQ0NTZFLTAwMiwKKyAgICA2LjYyODYyMDI1ODE4NjU5MDVFLTAwMiwgNy4yOTA4NzE5MTM4MTU3Mjg4RS0wMDIsIDguMDIwMjY0MjkwMjkyMDYxOEUtMDAyLAorICAgIDguODIyOTAxMDg5NTEwNzg4N0UtMDAyLCA5LjcwNDg4NjAxMzM2NzEwNzVFLTAwMiwgMS4wNjc1Mzc0NjE0NzAzODE4RS0wMDEsCisgICAgMS4xNzQzNTIyNDQ2MzYzNzIwRS0wMDEsIDEuMjkxODQ4NTA2MTE4OTYxMUUtMDAxLCAxLjQyMDk0MTgwMTIwMjQyOTRFLTAwMSwKKyAgICAxLjU2Mjg1Mjg3MDI2NTgxNjJFLTAwMSwgMS43MTkxMDc2Mzg3ODI5MjE4RS0wMDEsIDEuODkxMjMyMDMyMjI3NTQ2MUUtMDAxLAorICAgIDIuMDgwNDQ2NzkwOTc4NzI4NkUtMDAxLCAyLjI4ODI3Nzg0MDUxMDI2OTRFLTAwMSwgMi41MTcxNjY2NjE1ODAyNDg1RS0wMDEsCisgICAgMi43Njg5NDQzNjQ3NTcyMjU0RS0wMDEsIDMuMDQ1NzQ3MjQ1NzA0NTE5OEUtMDAxLCAzLjM1MDMyMTk3MDI3NDk3MjBFLTAwMSwKKyAgICAzLjY4NTQxNTIwNDMyMTQyMTFFLTAwMSwgNC4wNTM3NzM2MTM2OTY3MDczRS0wMDEsIDQuNDU5MzY0NjA0NjMyNzA5NkUtMDAxLAorICAgIDQuOTA1MjQwMDI4MDc3MDI4NkUtMDAxLCA1LjM5NTY3MjQ3NTM1NjMwMzVFLTAwMSwgNS45MzUyMzk3MjI4OTE5MzQwRS0wMDEsCisgICAgNi41Mjg4MjQ3MzIyMDAwNzkyRS0wMDEsIDcuMTgxNjE1NjQ5ODkxNjU5NUUtMDAxLCA3LjkwMDAyMTM2Mjk1NjYzMjlFLTAwMSwKKyAgICA4LjY4OTg0MDM4ODE5NTQ0MDBFLTAwMSwgOS41NTkwMDc1MzgwNzE4NDA5RS0wMDEsIDEuMDUxNDg0NzI1NDg2MDA3NEUrMDAwLAorICAgIDEuMTU2NjIwOTkwNjMwODE3NkUrMDAwLCAxLjI3MjI4NjE0MTU0NDg0NzBFKzAwMCwgMS4zOTk1MTc4MDc1NTAyNzkyRSswMDAsCisgICAgMS41Mzk0NzU2OTIwMDcyMDI0RSswMDAsIDEuNjkzNDExMDUzODA0MTMyM0UrMDAwLCAxLjg2Mjc1ODI2Mjg4NjQ0MDVFKzAwMCwKKyAgICAyLjA0OTA0MzI0NDcyNzkyNzRFKzAwMCwgMi4yNTM5NDQ1MTczNDk3NzI1RSswMDAsIDIuNDc5MzIzNzA5ODMwMDEyMEUrMDAwLAorICAgIDIuNzI3Mjg2NTk5MzIyNDg5M0UrMDAwLCAzLjAwMDAwMDAwMDAwMDAwMDBFKzAwMAorfTsKKworY29uc3QgZmxvYXQgZmZfZGNhX2xmZV9zdGVwX3NpemVfMjRbMTQ0XSA9IHsKKyAgICAzLjU3NjI3OTExMjg0OTEyOThFLTAwNiwgMy45MzM5MDcwMjQxMzQwNDI4RS0wMDYsIDQuNDEwNzQ0MjM5MTgwNTkzNEUtMDA2LAorICAgIDQuNzY4MzcyMTUwNDY1NTA2NEUtMDA2LCA1LjI0NTIwOTM2NTUxMjA1NzBFLTAwNiwgNS44NDEyNTU4ODQzMjAyNDUzRS0wMDYsCisgICAgNi40MzczMDI0MDMxMjg0MzM2RS0wMDYsIDcuMDMzMzQ4OTIxOTM2NjIxOUUtMDA2LCA3Ljc0ODYwNDc0NDUwNjQ0NzlFLTAwNiwKKyAgICA4LjQ2Mzg2MDU2NzA3NjI3MzhFLTAwNiwgOS40MTc1MzQ5OTcxNjkzNzUxRS0wMDYsIDEuMDI1MjAwMDEyMzUwMDgzOUUtMDA1LAorICAgIDEuMTMyNDg4Mzg1NzM1NTU3OEUtMDA1LCAxLjI1MTY5NzY4OTQ5NzE5NTRFLTAwNSwgMS4zNzA5MDY5OTMyNTg4MzMxRS0wMDUsCisgICAgMS41MTM5NTgxNTc3NzI3OTgzRS0wMDUsIDEuNjU3MDA5MzIyMjg2NzYzNkUtMDA1LCAxLjgyMzkwMjM0NzU1MzA1NjRFLTAwNSwKKyAgICAyLjAxNDYzNzIzMzU3MTY3NjZFLTAwNSwgMi4yMDUzNzIxMTk1OTAyOTY5RS0wMDUsIDIuNDMxODY5Nzk2NzM3NDA4MkUtMDA1LAorICAgIDIuNjcwMjg4NDA0MjYwNjgzNkUtMDA1LCAyLjk0NDQ2OTgwMjkxMjQ1MDRFLTAwNSwgMy4yMzA1NzIxMzE5NDAzODA3RS0wMDUsCisgICAgMy41NjQzNTgxODI0NzI5NjYyRS0wMDUsIDMuOTEwMDY1MTYzMzgxNzE1MkUtMDA1LCA0LjMwMzQ1NTg2NTc5NTExOTNFLTAwNSwKKyAgICA0LjczMjYwOTM1OTMzNzAxNDlFLTAwNSwgNS4yMDk0NDY1NzQzODM1NjU1RS0wMDUsIDUuNzMzOTY3NTEwOTM0NzcxMkUtMDA1LAorICAgIDYuMzA2MTcyMTY4OTkwNjMyMEUtMDA1LCA2LjkzNzk4MTQ3ODkyNzMxMjFFLTAwNSwgNy42MjkzOTU0NDA3NDQ4MTAyRS0wMDUsCisgICAgOC4zOTIzMzQ5ODQ4MTkyOTEyRS0wMDUsIDkuMjI2ODAwMTExMTUwNzU1MkUtMDA1LCAxLjAxNTY2MzI2ODA0OTE1MjlFLTAwNCwKKyAgICAxLjExNjk5MTE3NjI0NjU0NDlFLTAwNCwgMS4yMjkwNDc5MjE3ODI0ODQxRS0wMDQsIDEuMzUxODMzNTA0NjU2OTcxMUUtMDA0LAorICAgIDEuNDg2NTQwMDE3OTA3NjIxNkUtMDA0LCAxLjYzNTU1MTY0NzYwOTY2ODhFLTAwNCwgMS43OTg4NjgzOTM3NjMxMTIyRS0wMDQsCisgICAgMS45Nzg4NzQ0NDI0NDMxODUyRS0wMDQsIDIuMTc2NzYxODg2Njg3NTAzNkUtMDA0LCAyLjM5NDkxNDkxMjU3MTMwMDdFLTAwNCwKKyAgICAyLjYzNDUyNTYxMzEzMjE5MjJFLTAwNCwgMi44OTc5NzgxNzQ0NDU0MTE1RS0wMDQsIDMuMTg3NjU2NzgyNTg2MTkxMkUtMDA0LAorICAgIDMuNTA1OTQ1NjIzNjI5NzYzNkUtMDA0LCAzLjg1NjQyMDk3NjY4ODk3ODJFLTAwNCwgNC4yNDI2NTkxMjA4NzY2ODQyRS0wMDQsCisgICAgNC42NjcwNDQyNDIyNjgxMTQyRS0wMDQsIDUuMTMzMTUyNjE5OTc2MTE3M0UtMDA0LCA1LjY0Njk0NDcxOTE4ODc3NTlFLTAwNCwKKyAgICA2LjIxMDgwNDcyNTk4MTMyMTZFLTAwNCwgNi44MzE4ODUxOTg1Nzk0NTQ3RS0wMDQsIDcuNTE0OTU0NTA5MTMzNjM4NkUtMDA0LAorICAgIDguMjY3MTY1MjE1ODY5NTcxM0UtMDA0LCA5LjA5MzI4NTY5MDkzNzcyMDRFLTAwNCwgMS4wMDAyODUyNjc4NjM5MDE3RS0wMDMsCisgICAgMS4xMDAzMDE4NzM3MTk5MTU2RS0wMDMsIDEuMjEwMzMyMDYxMDkxOTA3MUUtMDAzLCAxLjMzMTQ0ODcxMzcxMzczMTBFLTAwMywKKyAgICAxLjQ2NDYwNTUwNjAxNTQ4MDNFLTAwMywgMS42MTA5OTQ1MzEwMzQ3NzE0RS0wMDMsIDEuNzcyMTY1NTA5NzIwNTA1NEUtMDAzLAorICAgIDEuOTQ5MzEwNTM1MTEwMjk5MUUtMDAzLCAyLjE0NDIxNzc0Njc2MDU3NjVFLTAwMywgMi4zNTg2NzUyODQyMjc3NjI2RS0wMDMsCisgICAgMi41OTQ1OTA0OTYzNzIwNDM2RS0wMDMsIDIuODUzOTg5OTQxMzU3MzY3NEUtMDAzLCAzLjEzOTM3NzAxNDU2MjcyNzhFLTAwMywKKyAgICAzLjQ1MzM3NDMyMDY3MDg4MTNFLTAwMywgMy43OTg3MjM2NzM2NjgzNDU0RS0wMDMsIDQuMTc4NTI0NTE1NDUyOTIyOEUtMDAzLAorICAgIDQuNTk2MzUzMTI1MTM3NDYzMEUtMDAzLCA1LjA1NjAyNDIwMDQ0MjMzODJFLTAwMywgNS41NjE3MTAwNjY5OTkyMDQ5RS0wMDMsCisgICAgNi4xMTc4MjE0NjkwNDcyNDQ1RS0wMDMsIDYuNzI5NjAzNjE1OTUxOTY4OUUtMDAzLCA3LjQwMjU0MDEzNTY4NjQxMzVFLTAwMywKKyAgICA4LjE0MjgyOTkxMjA0NjE4NDFFLTAwMywgOC45NTcxNDg2NjYwNDE5Mjk4RS0wMDMsIDkuODUyNzY4MTY1MjAzMTE0N0UtMDAzLAorICAgIDEuMDgzODAzMzA2MDc5MzA1MEUtMDAyLCAxLjE5MjE4ODQwNTA1OTM4NjBFLTAwMiwgMS4zMTE0MDk2Mjk3NTEzOTk3RS0wMDIsCisgICAgMS40NDI1NTE3ODQ4MTk1NzczRS0wMDIsIDEuNTg2ODA2OTYzMzAxNTM1MEUtMDAyLCAxLjc0NTQ4NjQ2NzUzODY1MDhFLTAwMiwKKyAgICAxLjkyMDAzMjczMDEwNjQ0MDlFLTAwMiwgMi4xMTIwNDMxNTU2NzUzMTA3RS0wMDIsIDIuMzIzMjQ2Mjc5MTQ5ODA0MEUtMDAyLAorICAgIDIuNTU1NTYxMzcwMzIwNDgzNkUtMDAyLCAyLjgxMTEyMjI3NTcyNDY4MjJFLTAwMiwgMy4wOTIyMjk3MzQ5MjUwMDAyRS0wMDIsCisgICAgMy40MDE0NTg2Njg4ODI2ODg0RS0wMDIsIDMuNzQxNTk4NTc1MzA1NzY5MUUtMDAyLCA0LjExNTc2MDgxNzAyMjQyMDhFLTAwMiwKKyAgICA0LjUyNzM0Mjg1OTE4OTg1MTRFLTAwMiwgNC45ODAwNzU5NTMwMTU3OTg3RS0wMDIsIDUuNDc4MDg0NzQwNDEwNDE2MEUtMDAyLAorICAgIDYuMDI1ODg3MjUzOTg2MjY5NEUtMDAyLCA2LjYyODQ3ODM2MzU3MDk3MjFFLTAwMiwgNy4yOTEzMjk3NzYyMDcxODI0RS0wMDIsCisgICAgOC4wMjA0NjE1NjE3MzQ4NjI0RS0wMDIsIDguODIyNTAxNzU3NDQzMTYwMkUtMDAyLCA5LjcwNDc1Nzg5MzY1MjY2NDNFLTAwMiwKKyAgICAxLjA2NzUyMjg5MTQ2NDU3ODBFLTAwMSwgMS4xNzQyNzQ4MjI5ODMxMjQ2RS0wMDEsIDEuMjkxNzAzMTM5NzQ2NTYzNEUtMDAxLAorICAgIDEuNDIwODczNTcyOTMwNTIzNkUtMDAxLCAxLjU2Mjk2MDMzNDE3NzA1NzBFLTAwMSwgMS43MTkyNTY4NDQ0MzE5Nzc4RS0wMDEsCisgICAgMS44OTExODE2OTQ0MTAwNDkzRS0wMDEsIDIuMDgwMzAwMTAyMjY5NjYxOEUtMDAxLCAyLjI4ODMzMTA2NjE3MTA1NzlFLTAwMSwKKyAgICAyLjUxNzE2NDA1MzU3ODg1OThFLTAwMSwgMi43Njg4ODA0NTg5MzY3NDYxRS0wMDEsIDMuMDQ1NzY3OTA4NzgzOTAxOEUtMDAxLAorICAgIDMuMzUwMzQ1Mjk1NzA4ODEwOUUtMDAxLCAzLjY4NTM3OTQ2NzY1MTc4MDRFLTAwMSwgNC4wNTM5MTc0MTQ0MTY5NTg3RS0wMDEsCisgICAgNC40NTkzMDg5MTc0NDAwNDY5RS0wMDEsIDQuOTA1MjM5OTI4MzkzMzU1N0UtMDAxLCA1LjM5NTc2MzU2MzYwNDc3OTZFLTAwMSwKKyAgICA1LjkzNTM0MDYzNTIyMTA4MDJFLTAwMSwgNi41Mjg4NzQyMjE5MDU5NzM3RS0wMDEsIDcuMTgxNzYwOTI4ODQwNzQ4MEUtMDAxLAorICAgIDcuODk5OTM3Mzc5MzUyNzMzOUUtMDAxLCA4LjY4OTkzMTQ3NDkxNTkxODRFLTAwMSwgOS41NTg5MjQzODM5ODg5MDI3RS0wMDEsCisgICAgMS4wNTE0ODE3Mjk5MjI1MDA4RSswMDAsIDEuMTU2NjI5ODE5NDY4MjM4M0UrMDAwLCAxLjI3MjI5Mjg4NDg2MTU3NDdFKzAwMCwKKyAgICAxLjM5OTUyMjExMzc0MzA4MDRFKzAwMCwgMS41Mzk0NzQzMTMxOTY0NTgxRSswMDAsIDEuNjkzNDIxODA0MTIwNzU1NkUrMDAwLAorICAgIDEuODYyNzYzOTg0NTMyODMxMkUrMDAwLCAyLjA0OTA0MDMyMzM4MTQ2MjdFKzAwMCwgMi4yNTM5NDQ0MjcyNDUxOTEwRSswMDAsCisgICAgMi40NzkzMzg5NDE0OTUyOTIyRSswMDAsIDIuNzI3MjcyODM1NjQ0ODIxNUUrMDAwLCAyLjk5OTk5OTg4MDc5MDY5NjJFKzAwMAorfTsKKworY29uc3QgZmxvYXQgZmZfZGNhX2JhbmtfY29lZmZbMTBdID0geworICAgIDAuMDIyODEwODkzLCAwLjQxNzk5NzcyLCAwLjkwODQ0ODEwLCAwLjk5OTczOTgzLAorICAgIDAuMDY4OTc0ODQ1LCAwLjM0Njc1OTk3LCAwLjI5Mzk2ODg5LCAwLjE5NjQyMzc0LAorICAgIDAuMzA4NjU4MjcwLCAwLjAzODA2MDIzMworfTsKKworY29uc3QgZmxvYXQgZmZfZGNhX2xmZV9paXJbNV1bNF0gPSB7CisgICAgeyAtMC45ODYxODQ2NiwgMS45ODYxMjU5LCAxLjAsIC0xLjk4NDA1MTAgfSwKKyAgICB7IC0wLjk4ODgzMTUyLCAxLjk4ODcxOTMsIDEuMCwgLTEuOTk3OTg0OCB9LAorICAgIHsgLTAuOTkyNTIwODcsIDEuOTkyMzM4MSwgMS4wLCAtMS45OTkwODk3IH0sCisgICAgeyAtMC45OTU5MTY5MCwgMS45OTU2NzgxLCAxLjAsIC0xLjk5OTM3NDUgfSwKKyAgICB7IC0wLjk5ODcyMjg1LCAxLjk5ODQ1NTAsIDEuMCwgLTEuOTk5NDYzOSB9CiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kY2FkYXRhLmggYi9saWJhdmNvZGVjL2RjYWRhdGEuaAppbmRleCBkODY0MjUxLi41YWE4NWIzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RjYWRhdGEuaAorKysgYi9saWJhdmNvZGVjL2RjYWRhdGEuaApAQCAtMjMsMTUgKzIzLDIxIEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgImRjYWh1ZmYuaCIKKworI2RlZmluZSBEQ0FfQURQQ01fQ09FRkZTICAgICAgICA0CisjZGVmaW5lIERDQV9BRFBDTV9WUUNPREVCT09LX1NaIDQwOTYKKwogZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGZmX2RjYV9iaXRfcmF0ZXNbMzJdOwogCiBleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfY2hhbm5lbHNbMTZdOwogCi1leHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfYml0c19wZXJfc2FtcGxlWzhdOwotCiBleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfZG1peF9wcmltYXJ5X25jaFs4XTsKIAotZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfZGNhX2FkcGNtX3ZiWzQwOTZdWzRdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZGNhX3F1YW50X2luZGV4X3NlbF9uYml0c1tEQ0FfQ09ERV9CT09LU107CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfcXVhbnRfaW5kZXhfZ3JvdXBfc2l6ZVtEQ0FfQ09ERV9CT09LU107CisKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX2RjYV9hZHBjbV92YltEQ0FfQURQQ01fVlFDT0RFQk9PS19TWl1bRENBX0FEUENNX0NPRUZGU107CiAKIGV4dGVybiBjb25zdCB1aW50MzJfdCBmZl9kY2Ffc2NhbGVfZmFjdG9yX3F1YW50Nls2NF07CiBleHRlcm4gY29uc3QgdWludDMyX3QgZmZfZGNhX3NjYWxlX2ZhY3Rvcl9xdWFudDdbMTI4XTsKQEAgLTcxLDEzICs3Nyw1MSBAQAogCiBleHRlcm4gY29uc3QgaW50MzJfdCBmZl9kY2FfeGxsX2JhbmRfY29lZmZbMjBdOwogCi1leHRlcm4gY29uc3QgaW50MzJfdCBmZl9kY2Ffc2FtcGxpbmdfZnJlcXNbMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2RjYV9hdmdfZzNfZnJlcXNbM107CiAKLWV4dGVybiBjb25zdCBpbnQ4X3QgZmZfZGNhX2xmZV9pbmRleFsxNl07CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfZGNhX2ZzdF9hbXBbNDRdOwogCi1leHRlcm4gY29uc3QgaW50OF90IGZmX2RjYV9jaGFubmVsX3Jlb3JkZXJfbGZlWzE2XVs5XTsKLWV4dGVybiBjb25zdCBpbnQ4X3QgZmZfZGNhX2NoYW5uZWxfcmVvcmRlcl9ub2xmZVsxNl1bOV07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfZnJlcV90b19zYlszMl07CiAKLWV4dGVybiBjb25zdCB1aW50MTZfdCBmZl9kY2FfdmxjX29mZnNbNjNdOworZXh0ZXJuIGNvbnN0IGludDhfdCBmZl9kY2FfcGgwX3NoaWZ0WzhdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfZ3JpZF8xX3RvX3NjZlsxMV07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfZ3JpZF8yX3RvX3NjZlszXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZGNhX3NjZl90b19ncmlkXzFbMzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZGNhX3NjZl90b19ncmlkXzJbMzJdOworCitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfZ3JpZF8xX3dlaWdodHNbMTJdWzMyXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfZGNhX3NiX3Jlb3JkZXJbOF1bOF07CisKK2V4dGVybiBjb25zdCBpbnQ4X3QgZmZfZGNhX2xmZV9kZWx0YV9pbmRleF8xNls4XTsKK2V4dGVybiBjb25zdCBpbnQ4X3QgZmZfZGNhX2xmZV9kZWx0YV9pbmRleF8yNFszMl07CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9kY2FfcnNkX3BhY2tfNV9pbl84WzI1Nl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9kY2FfcnNkX3BhY2tfM19pbl83WzEyOF1bM107CisKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9kY2FfcnNkX2xldmVsXzJhWzJdOworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX2RjYV9yc2RfbGV2ZWxfMmJbMl07CitleHRlcm4gY29uc3QgZmxvYXQgZmZfZGNhX3JzZF9sZXZlbF8zWzNdOworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX2RjYV9yc2RfbGV2ZWxfNVs1XTsKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9kY2FfcnNkX2xldmVsXzhbOF07CitleHRlcm4gY29uc3QgZmxvYXQgZmZfZGNhX3JzZF9sZXZlbF8xNlsxNl07CisKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9kY2Ffc3ludGhfZW52WzMyXTsKKworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX2RjYV9jb3JyX2NmWzMyXVsxMV07CisKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9kY2FfcXVhbnRfYW1wWzU3XTsKKworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX2RjYV9zdF9jb2VmZlszNF07CisKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9kY2FfbG9uZ193aW5kb3dbMTI4XTsKKworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX2RjYV9sZmVfc3RlcF9zaXplXzE2WzEwMV07CitleHRlcm4gY29uc3QgZmxvYXQgZmZfZGNhX2xmZV9zdGVwX3NpemVfMjRbMTQ0XTsKKworZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX2RjYV9iYW5rX2NvZWZmWzEwXTsKK2V4dGVybiBjb25zdCBmbG9hdCBmZl9kY2FfbGZlX2lpcls1XVs0XTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfRENBREFUQV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjYWRlYy5jIGIvbGliYXZjb2RlYy9kY2FkZWMuYwppbmRleCBmM2MzOTcyLi40MTQ2YTg1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RjYWRlYy5jCisrKyBiL2xpYmF2Y29kZWMvZGNhZGVjLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKIAogI2luY2x1ZGUgImRjYWRlYy5oIgotI2luY2x1ZGUgImRjYW1hdGguaCIKKyNpbmNsdWRlICJkY2FodWZmLmgiCiAjaW5jbHVkZSAiZGNhX3N5bmN3b3Jkcy5oIgogI2luY2x1ZGUgInByb2ZpbGVzLmgiCiAKQEAgLTc2LDMzICs3Niw2IEBACiAgICAgcmV0dXJuIG5jaGFubmVsczsKIH0KIAotc3RhdGljIHVpbnQxNl90IGNyYzE2KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQotewotICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBjcmN0YWJbMTZdID0gewotICAgICAgICAweDAwMDAsIDB4MTAyMSwgMHgyMDQyLCAweDMwNjMsIDB4NDA4NCwgMHg1MGE1LCAweDYwYzYsIDB4NzBlNywKLSAgICAgICAgMHg4MTA4LCAweDkxMjksIDB4YTE0YSwgMHhiMTZiLCAweGMxOGMsIDB4ZDFhZCwgMHhlMWNlLCAweGYxZWYsCi0gICAgfTsKLQotICAgIHVpbnQxNl90IHJlcyA9IDB4ZmZmZjsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgcmVzID0gKHJlcyA8PCA0KSBeIGNyY3RhYlsoZGF0YVtpXSA+PiA0KSBeIChyZXMgPj4gMTIpXTsKLSAgICAgICAgcmVzID0gKHJlcyA8PCA0KSBeIGNyY3RhYlsoZGF0YVtpXSAmIDE1KSBeIChyZXMgPj4gMTIpXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi1pbnQgZmZfZGNhX2NoZWNrX2NyYyhHZXRCaXRDb250ZXh0ICpzLCBpbnQgcDEsIGludCBwMikKLXsKLSAgICBpZiAoKChwMSB8IHAyKSAmIDcpIHx8IHAxIDwgMCB8fCBwMiA+IHMtPnNpemVfaW5fYml0cyB8fCBwMiAtIHAxIDwgMTYpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoY3JjMTYocy0+YnVmZmVyICsgcDEgLyA4LCAocDIgLSBwMSkgLyA4KSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHJldHVybiAwOwotfQotCiB2b2lkIGZmX2RjYV9kb3dubWl4X3RvX3N0ZXJlb19maXhlZChEQ0FEU1BDb250ZXh0ICpkY2Fkc3AsIGludDMyX3QgKipzYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb2VmZl9sLCBpbnQgbnNhbXBsZXMsIGludCBjaF9tYXNrKQogewpAQCAtMTY4LDIyICsxNDEsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBjb252ZXJ0X2JpdHN0cmVhbShjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSwgdWludDhfdCAqZHN0LCBpbnQgbWF4X3NpemUpCi17Ci0gICAgc3dpdGNoIChBVl9SQjMyKHNyYykpIHsKLSAgICBjYXNlIERDQV9TWU5DV09SRF9DT1JFX0JFOgotICAgIGNhc2UgRENBX1NZTkNXT1JEX1NVQlNUUkVBTToKLSAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCBzcmNfc2l6ZSk7Ci0gICAgICAgIHJldHVybiBzcmNfc2l6ZTsKLSAgICBjYXNlIERDQV9TWU5DV09SRF9DT1JFX0xFOgotICAgIGNhc2UgRENBX1NZTkNXT1JEX0NPUkVfMTRCX0JFOgotICAgIGNhc2UgRENBX1NZTkNXT1JEX0NPUkVfMTRCX0xFOgotICAgICAgICByZXR1cm4gYXZwcml2X2RjYV9jb252ZXJ0X2JpdHN0cmVhbShzcmMsIHNyY19zaXplLCBkc3QsIG1heF9zaXplKTsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci19Ci0KIHN0YXRpYyBpbnQgZGNhZGVjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCiB7CkBAIC0xOTIsMjUgKzE0OSwzMSBAQAogICAgIHVpbnQ4X3QgKmlucHV0ID0gYXZwa3QtPmRhdGE7CiAgICAgaW50IGlucHV0X3NpemUgPSBhdnBrdC0+c2l6ZTsKICAgICBpbnQgaSwgcmV0LCBwcmV2X3BhY2tldCA9IHMtPnBhY2tldDsKKyAgICB1aW50MzJfdCBtcms7CiAKICAgICBpZiAoaW5wdXRfc2l6ZSA8IE1JTl9QQUNLRVRfU0laRSB8fCBpbnB1dF9zaXplID4gTUFYX1BBQ0tFVF9TSVpFKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWNrZXQgc2l6ZVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5idWZmZXIsICZzLT5idWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGRkFMSUdOKGlucHV0X3NpemUsIDQwOTYpICsgRENBX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGlmICghcy0+YnVmZmVyKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIC8vIENvbnZlcnQgaW5wdXQgdG8gQkUgZm9ybWF0CisgICAgbXJrID0gQVZfUkIzMihpbnB1dCk7CisgICAgaWYgKG1yayAhPSBEQ0FfU1lOQ1dPUkRfQ09SRV9CRSAmJiBtcmsgIT0gRENBX1NZTkNXT1JEX1NVQlNUUkVBTSkgeworICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnMtPmJ1ZmZlciwgJnMtPmJ1ZmZlcl9zaXplLCBpbnB1dF9zaXplKTsKKyAgICAgICAgaWYgKCFzLT5idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgZm9yIChpID0gMCwgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsgaSA8IGlucHV0X3NpemUgLSBNSU5fUEFDS0VUX1NJWkUgKyAxICYmIHJldCA8IDA7IGkrKykKLSAgICAgICAgcmV0ID0gY29udmVydF9iaXRzdHJlYW0oaW5wdXQgKyBpLCBpbnB1dF9zaXplIC0gaSwgcy0+YnVmZmVyLCBzLT5idWZmZXJfc2l6ZSk7CisgICAgICAgIGZvciAoaSA9IDAsIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7IGkgPCBpbnB1dF9zaXplIC0gTUlOX1BBQ0tFVF9TSVpFICsgMSAmJiByZXQgPCAwOyBpKyspCisgICAgICAgICAgICByZXQgPSBhdnByaXZfZGNhX2NvbnZlcnRfYml0c3RyZWFtKGlucHV0ICsgaSwgaW5wdXRfc2l6ZSAtIGksIHMtPmJ1ZmZlciwgcy0+YnVmZmVyX3NpemUpOwogCi0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBhIHZhbGlkIERDQSBmcmFtZVxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAKLSAgICBpbnB1dCAgICAgID0gcy0+YnVmZmVyOwotICAgIGlucHV0X3NpemUgPSByZXQ7CisgICAgICAgIGlucHV0ICAgICAgPSBzLT5idWZmZXI7CisgICAgICAgIGlucHV0X3NpemUgPSByZXQ7CisgICAgfQogCiAgICAgcy0+cGFja2V0ID0gMDsKIApAQCAtMjE4LDEwICsxODEsOCBAQAogICAgIGlmIChBVl9SQjMyKGlucHV0KSA9PSBEQ0FfU1lOQ1dPUkRfQ09SRV9CRSkgewogICAgICAgICBpbnQgZnJhbWVfc2l6ZTsKIAotICAgICAgICBpZiAoKHJldCA9IGZmX2RjYV9jb3JlX3BhcnNlKCZzLT5jb3JlLCBpbnB1dCwgaW5wdXRfc2l6ZSkpIDwgMCkgewotICAgICAgICAgICAgcy0+Y29yZV9yZXNpZHVhbF92YWxpZCA9IDA7CisgICAgICAgIGlmICgocmV0ID0gZmZfZGNhX2NvcmVfcGFyc2UoJnMtPmNvcmUsIGlucHV0LCBpbnB1dF9zaXplKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQogCiAgICAgICAgIHMtPnBhY2tldCB8PSBEQ0FfUEFDS0VUX0NPUkU7CiAKQEAgLTI2Miw2ICsyMjMsMTYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIC8vIFBhcnNlIExCUiBjb21wb25lbnQgaW4gRVhTUworICAgICAgICBpZiAoYXNzZXQgJiYgKGFzc2V0LT5leHRlbnNpb25fbWFzayAmIERDQV9FWFNTX0xCUikpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfZGNhX2xicl9wYXJzZSgmcy0+bGJyLCBpbnB1dCwgYXNzZXQpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRU5PTUVNKSB8fCAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5wYWNrZXQgfD0gRENBX1BBQ0tFVF9MQlI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvLyBQYXJzZSBjb3JlIGV4dGVuc2lvbnMgaW4gRVhTUyBvciBiYWNrd2FyZCBjb21wYXRpYmxlIGNvcmUgc3ViLXN0cmVhbQogICAgICAgICBpZiAoKHMtPnBhY2tldCAmIERDQV9QQUNLRVRfQ09SRSkKICAgICAgICAgICAgICYmIChyZXQgPSBmZl9kY2FfY29yZV9wYXJzZV9leHNzKCZzLT5jb3JlLCBpbnB1dCwgYXNzZXQpKSA8IDApCkBAIC0yNjksNyArMjQwLDEwIEBACiAgICAgfQogCiAgICAgLy8gRmlsdGVyIHRoZSBmcmFtZQotICAgIGlmIChzLT5wYWNrZXQgJiBEQ0FfUEFDS0VUX1hMTCkgeworICAgIGlmIChzLT5wYWNrZXQgJiBEQ0FfUEFDS0VUX0xCUikgeworICAgICAgICBpZiAoKHJldCA9IGZmX2RjYV9sYnJfZmlsdGVyX2ZyYW1lKCZzLT5sYnIsIGZyYW1lKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKHMtPnBhY2tldCAmIERDQV9QQUNLRVRfWExMKSB7CiAgICAgICAgIGlmIChzLT5wYWNrZXQgJiBEQ0FfUEFDS0VUX0NPUkUpIHsKICAgICAgICAgICAgIGludCB4OTZfc3ludGggPSAtMTsKIApAQCAtMjc3LDE5ICsyNTEsMjAgQEAKICAgICAgICAgICAgIGlmIChzLT54bGwuY2hzZXRbMF0uZnJlcSA9PSA5NjAwMCAmJiBzLT5jb3JlLnNhbXBsZV9yYXRlID09IDQ4MDAwKQogICAgICAgICAgICAgICAgIHg5Nl9zeW50aCA9IDE7CiAKLSAgICAgICAgICAgIGlmICgocmV0ID0gZmZfZGNhX2NvcmVfZmlsdGVyX2ZpeGVkKCZzLT5jb3JlLCB4OTZfc3ludGgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICBzLT5jb3JlX3Jlc2lkdWFsX3ZhbGlkID0gMDsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfZGNhX2NvcmVfZmlsdGVyX2ZpeGVkKCZzLT5jb3JlLCB4OTZfc3ludGgpKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gRm9yY2UgbG9zc3kgZG93bm1peGVkIG91dHB1dCBvbiB0aGUgZmlyc3QgY29yZSBmcmFtZSBmaWx0ZXJlZC4KICAgICAgICAgICAgIC8vIFRoaXMgcHJldmVudHMgYXVkaWJsZSBjbGlja3Mgd2hlbiBzZWVraW5nIGFuZCBpcyBjb25zaXN0ZW50IHdpdGgKICAgICAgICAgICAgIC8vIHdoYXQgcmVmZXJlbmNlIGRlY29kZXIgZG9lcyB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBjaGFubmVsIHNldHMuCi0gICAgICAgICAgICBpZiAoIXMtPmNvcmVfcmVzaWR1YWxfdmFsaWQpIHsKLSAgICAgICAgICAgICAgICBpZiAocy0+eGxsLm5yZXNjaHNldHMgPiAwICYmIHMtPnhsbC5uY2hzZXRzID4gMSkKLSAgICAgICAgICAgICAgICAgICAgcy0+cGFja2V0IHw9IERDQV9QQUNLRVRfUkVDT1ZFUlk7Ci0gICAgICAgICAgICAgICAgcy0+Y29yZV9yZXNpZHVhbF92YWxpZCA9IDE7CisgICAgICAgICAgICBpZiAoIShwcmV2X3BhY2tldCAmIERDQV9QQUNLRVRfUkVTSURVQUwpICYmIHMtPnhsbC5ucmVzY2hzZXRzID4gMAorICAgICAgICAgICAgICAgICYmIHMtPnhsbC5uY2hzZXRzID4gMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJGb3JjaW5nIFhMTCByZWNvdmVyeSBtb2RlXG4iKTsKKyAgICAgICAgICAgICAgICBzLT5wYWNrZXQgfD0gRENBX1BBQ0tFVF9SRUNPVkVSWTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0ICdyZXNpZHVhbCBvaycgZmxhZyBmb3IgdGhlIG5leHQgZnJhbWUKKyAgICAgICAgICAgIHMtPnBhY2tldCB8PSBEQ0FfUEFDS0VUX1JFU0lEVUFMOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKChyZXQgPSBmZl9kY2FfeGxsX2ZpbHRlcl9mcmFtZSgmcy0+eGxsLCBmcmFtZSkpIDwgMCkgewpAQCAtMjk4LDE4ICsyNzMsMTggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SX0lOVkFMSUREQVRBIHx8IChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIGlmICgocmV0ID0gZmZfZGNhX2NvcmVfZmlsdGVyX2ZyYW1lKCZzLT5jb3JlLCBmcmFtZSkpIDwgMCkgewotICAgICAgICAgICAgICAgIHMtPmNvcmVfcmVzaWR1YWxfdmFsaWQgPSAwOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9kY2FfY29yZV9maWx0ZXJfZnJhbWUoJnMtPmNvcmUsIGZyYW1lKSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHMtPnBhY2tldCAmIERDQV9QQUNLRVRfQ09SRSkgewotICAgICAgICBpZiAoKHJldCA9IGZmX2RjYV9jb3JlX2ZpbHRlcl9mcmFtZSgmcy0+Y29yZSwgZnJhbWUpKSA8IDApIHsKLSAgICAgICAgICAgIHMtPmNvcmVfcmVzaWR1YWxfdmFsaWQgPSAwOworICAgICAgICBpZiAoKHJldCA9IGZmX2RjYV9jb3JlX2ZpbHRlcl9mcmFtZSgmcy0+Y29yZSwgZnJhbWUpKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgICAgIHMtPmNvcmVfcmVzaWR1YWxfdmFsaWQgPSAhIShzLT5jb3JlLmZpbHRlcl9tb2RlICYgRENBX0ZJTFRFUl9NT0RFX0ZJWEVEKTsKKyAgICAgICAgaWYgKHMtPmNvcmUuZmlsdGVyX21vZGUgJiBEQ0FfRklMVEVSX01PREVfRklYRUQpCisgICAgICAgICAgICBzLT5wYWNrZXQgfD0gRENBX1BBQ0tFVF9SRVNJRFVBTDsKICAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIHZhbGlkIERDQSBzdWItc3RyZWFtIGZvdW5kXG4iKTsKKyAgICAgICAgaWYgKHMtPmNvcmVfb25seSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDb25zaWRlciBkaXNhYmxpbmcgJ2NvcmVfb25seScgb3B0aW9uXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCkBAIC0zMjQsOCArMjk5LDkgQEAKIAogICAgIGZmX2RjYV9jb3JlX2ZsdXNoKCZzLT5jb3JlKTsKICAgICBmZl9kY2FfeGxsX2ZsdXNoKCZzLT54bGwpOworICAgIGZmX2RjYV9sYnJfZmx1c2goJnMtPmxicik7CiAKLSAgICBzLT5jb3JlX3Jlc2lkdWFsX3ZhbGlkID0gMDsKKyAgICBzLT5wYWNrZXQgJj0gRENBX1BBQ0tFVF9NQVNLOwogfQogCiBzdGF0aWMgYXZfY29sZCBpbnQgZGNhZGVjX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKQEAgLTMzNCw2ICszMTAsNyBAQAogCiAgICAgZmZfZGNhX2NvcmVfY2xvc2UoJnMtPmNvcmUpOwogICAgIGZmX2RjYV94bGxfY2xvc2UoJnMtPnhsbCk7CisgICAgZmZfZGNhX2xicl9jbG9zZSgmcy0+bGJyKTsKIAogICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIpOwogICAgIHMtPmJ1ZmZlcl9zaXplID0gMDsKQEAgLTM0OSwxMyArMzI2LDIyIEBACiAgICAgcy0+Y29yZS5hdmN0eCA9IGF2Y3R4OwogICAgIHMtPmV4c3MuYXZjdHggPSBhdmN0eDsKICAgICBzLT54bGwuYXZjdHggPSBhdmN0eDsKKyAgICBzLT5sYnIuYXZjdHggPSBhdmN0eDsKKworICAgIGZmX2RjYV9pbml0X3ZsY3MoKTsKIAogICAgIGlmIChmZl9kY2FfY29yZV9pbml0KCZzLT5jb3JlKSA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKKyAgICBpZiAoZmZfZGNhX2xicl9pbml0KCZzLT5sYnIpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKwogICAgIGZmX2RjYWRzcF9pbml0KCZzLT5kY2Fkc3ApOwogICAgIHMtPmNvcmUuZGNhZHNwID0gJnMtPmRjYWRzcDsKICAgICBzLT54bGwuZGNhZHNwID0gJnMtPmRjYWRzcDsKKyAgICBzLT5sYnIuZGNhZHNwID0gJnMtPmRjYWRzcDsKKworICAgIHMtPmNyY3RhYiA9IGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzE2X0NDSVRUKTsKIAogICAgIHN3aXRjaCAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiB+QVZfQ0hfTEFZT1VUX05BVElWRSkgewogICAgIGNhc2UgMDoKQEAgLTM3Niw5ICszNjIsNiBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyUDsKLSAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDI0OwotCiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhZGVjLmggYi9saWJhdmNvZGVjL2RjYWRlYy5oCmluZGV4IDY3MjYxMjEuLjlkYThkM2IgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGNhZGVjLmgKKysrIGIvbGliYXZjb2RlYy9kY2FkZWMuaApAQCAtMjIsNiArMjIsNyBAQAogI2RlZmluZSBBVkNPREVDX0RDQURFQ19ICiAKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKQEAgLTMxLDEzICszMiwxNiBAQAogI2luY2x1ZGUgImRjYV9jb3JlLmgiCiAjaW5jbHVkZSAiZGNhX2V4c3MuaCIKICNpbmNsdWRlICJkY2FfeGxsLmgiCi0KLSNkZWZpbmUgRENBX0JVRkZFUl9QQURESU5HX1NJWkUgICAgIDEwMjQKKyNpbmNsdWRlICJkY2FfbGJyLmgiCiAKICNkZWZpbmUgRENBX1BBQ0tFVF9DT1JFICAgICAgICAgMHgwMQogI2RlZmluZSBEQ0FfUEFDS0VUX0VYU1MgICAgICAgICAweDAyCiAjZGVmaW5lIERDQV9QQUNLRVRfWExMICAgICAgICAgIDB4MDQKLSNkZWZpbmUgRENBX1BBQ0tFVF9SRUNPVkVSWSAgICAgMHgwOAorI2RlZmluZSBEQ0FfUEFDS0VUX0xCUiAgICAgICAgICAweDA4CisjZGVmaW5lIERDQV9QQUNLRVRfTUFTSyAgICAgICAgIDB4MGYKKworI2RlZmluZSBEQ0FfUEFDS0VUX1JFQ09WRVJZICAgICAweDEwICAgIC8vLzwgU3luYyBlcnJvciByZWNvdmVyeSBmbGFnCisjZGVmaW5lIERDQV9QQUNLRVRfUkVTSURVQUwgICAgIDB4MjAgICAgLy8vPCBDb3JlIHZhbGlkIGZvciByZXNpZHVhbCBkZWNvZGluZwogCiB0eXBlZGVmIHN0cnVjdCBEQ0FDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICAgKmNsYXNzOyAgICAgICAvLy88IGNsYXNzIGZvciBBVk9wdGlvbnMKQEAgLTQ2LDM0ICs1MCw0NyBAQAogICAgIERDQUNvcmVEZWNvZGVyIGNvcmU7ICAvLy88IENvcmUgZGVjb2RlciBjb250ZXh0CiAgICAgRENBRXhzc1BhcnNlciAgZXhzczsgIC8vLzwgRVhTUyBwYXJzZXIgY29udGV4dAogICAgIERDQVhsbERlY29kZXIgIHhsbDsgICAvLy88IFhMTCBkZWNvZGVyIGNvbnRleHQKKyAgICBEQ0FMYnJEZWNvZGVyICBsYnI7ICAgLy8vPCBMQlIgZGVjb2RlciBjb250ZXh0CiAKICAgICBEQ0FEU1BDb250ZXh0ICAgZGNhZHNwOwogCisgICAgY29uc3QgQVZDUkMgICAgICpjcmN0YWI7CisKICAgICB1aW50OF90ICAgICAgICAgKmJ1ZmZlcjsgICAgLy8vPCBQYWNrZXQgYnVmZmVyCiAgICAgdW5zaWduZWQgaW50ICAgIGJ1ZmZlcl9zaXplOwogCiAgICAgaW50ICAgICBwYWNrZXQ7IC8vLzwgUGFja2V0IGZsYWdzCiAKLSAgICBpbnQgICAgIGNvcmVfcmVzaWR1YWxfdmFsaWQ7ICAgIC8vLzwgQ29yZSB2YWxpZCBmb3IgcmVzaWR1YWwgZGVjb2RpbmcKLQogICAgIGludCAgICAgcmVxdWVzdF9jaGFubmVsX2xheW91dDsgLy8vPCBDb252ZXJ0ZWQgZnJvbSBhdmN0eC5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0CiAgICAgaW50ICAgICBjb3JlX29ubHk7ICAgICAgICAgICAgICAvLy88IENvcmUgb25seSBkZWNvZGluZyBmbGFnCiB9IERDQUNvbnRleHQ7CiAKIGludCBmZl9kY2Ffc2V0X2NoYW5uZWxfbGF5b3V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50ICpjaF9yZW1hcCwgaW50IGRjYV9tYXNrKTsKIAotaW50IGZmX2RjYV9jaGVja19jcmMoR2V0Qml0Q29udGV4dCAqcywgaW50IHAxLCBpbnQgcDIpOwotCiB2b2lkIGZmX2RjYV9kb3dubWl4X3RvX3N0ZXJlb19maXhlZChEQ0FEU1BDb250ZXh0ICpkY2Fkc3AsIGludDMyX3QgKipzYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb2VmZl9sLCBpbnQgbnNhbXBsZXMsIGludCBjaF9tYXNrKTsKIHZvaWQgZmZfZGNhX2Rvd25taXhfdG9fc3RlcmVvX2Zsb2F0KEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBmbG9hdCAqKnNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvZWZmX2wsIGludCBuc2FtcGxlcywgaW50IGNoX21hc2spOwogCitzdGF0aWMgaW5saW5lIGludCBmZl9kY2FfY2hlY2tfY3JjKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qml0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHAxLCBpbnQgcDIpCit7CisgICAgRENBQ29udGV4dCAqZGNhID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICghKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQ1JDQ0hFQ0sgfCBBVl9FRl9DQVJFRlVMKSkpCisgICAgICAgIHJldHVybiAwOworICAgIGlmICgoKHAxIHwgcDIpICYgNykgfHwgcDEgPCAwIHx8IHAyID4gcy0+c2l6ZV9pbl9iaXRzIHx8IHAyIC0gcDEgPCAxNikKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChhdl9jcmMoZGNhLT5jcmN0YWIsIDB4ZmZmZiwgcy0+YnVmZmVyICsgcDEgLyA4LCAocDIgLSBwMSkgLyA4KSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBmZl9kY2Ffc2Vla19iaXRzKEdldEJpdENvbnRleHQgKnMsIGludCBwKQogewotICAgIGlmIChwIDwgcy0+aW5kZXggfHwgcCA+IHMtPnNpemVfaW5fYml0cykKKyAgICBpZiAocCA8IGdldF9iaXRzX2NvdW50KHMpIHx8IHAgPiBzLT5zaXplX2luX2JpdHMpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBzLT5pbmRleCA9IHA7CisgICAgc2tpcF9iaXRzX2xvbmcocywgcCAtIGdldF9iaXRzX2NvdW50KHMpKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kY2Fkc3AuYyBiL2xpYmF2Y29kZWMvZGNhZHNwLmMKaW5kZXggMDlmYWVlNS4uZmFkZTFhNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kY2Fkc3AuYworKysgYi9saWJhdmNvZGVjL2RjYWRzcC5jCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpmaWx0ZXJfY29lZmYsIHB0cmRpZmZfdCBucGNtYmxvY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUpCiB7Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGlucHV0LCBbMzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGZsb2F0LCBpbnB1dCwgWzMyXSk7CiAgICAgaW50IGksIGo7CiAKICAgICBmb3IgKGogPSAwOyBqIDwgbnBjbWJsb2NrczsgaisrKSB7CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpmaWx0ZXJfY29lZmYsIHB0cmRpZmZfdCBucGNtYmxvY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUpCiB7Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGlucHV0LCBbNjRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGZsb2F0LCBpbnB1dCwgWzY0XSk7CiAgICAgaW50IGksIGo7CiAKICAgICBpZiAoIXN1YmJhbmRfc2FtcGxlc19oaSkKQEAgLTI0Myw3ICsyNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqaGlzdDEsIGludCAqb2Zmc2V0LCBpbnQzMl90ICpoaXN0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmZpbHRlcl9jb2VmZiwgcHRyZGlmZl90IG5wY21ibG9ja3MpCiB7Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgaW50MzJfdCwgaW5wdXQsIFszMl0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MzJfdCwgaW5wdXQsIFszMl0pOwogICAgIGludCBpLCBqOwogCiAgICAgZm9yIChqID0gMDsgaiA8IG5wY21ibG9ja3M7IGorKykgewpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpoaXN0MSwgaW50ICpvZmZzZXQsIGludDMyX3QgKmhpc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqZmlsdGVyX2NvZWZmLCBwdHJkaWZmX3QgbnBjbWJsb2NrcykKIHsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBpbnQzMl90LCBpbnB1dCwgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQzMl90LCBpbnB1dCwgWzY0XSk7CiAgICAgaW50IGksIGo7CiAKICAgICBpZiAoIXN1YmJhbmRfc2FtcGxlc19oaSkKQEAgLTMwMCw3ICszMDAsNyBAQAogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICBkc3RbaV0gKz0gc3JjW2ldICogY29lZmYgKyAoMSA8PCAyKSA+PiAzOworICAgICAgICBkc3RbaV0gKz0gKFNVSU5UKSgoaW50KShzcmNbaV0gKiAoU1VJTlQpY29lZmYgKyAoMSA8PCAyKSkgPj4gMyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRtaXhfc3ViX3hjaF9jKGludDMyX3QgKmRzdDEsIGludDMyX3QgKmRzdDIsCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICBpbnQgaTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgZHN0W2ldIC09IG11bDE1KHNyY1tpXSwgY29lZmYpOworICAgICAgICBkc3RbaV0gLT0gKHVuc2lnbmVkKW11bDE1KHNyY1tpXSwgY29lZmYpOwogfQogCiBzdGF0aWMgdm9pZCBkbWl4X2FkZF9jKGludDMyX3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLCBpbnQgY29lZmYsIHB0cmRpZmZfdCBsZW4pCkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICAgICAgZHN0W2ldID0gbXVsMTYoZHN0W2ldLCBzY2FsZV9pbnYpOwogfQogCi1zdGF0aWMgdm9pZCBmaWx0ZXIwKGludDMyX3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLCBpbnQzMl90IGNvZWZmLCBwdHJkaWZmX3QgbGVuKQorc3RhdGljIHZvaWQgZmlsdGVyMChTVUlOVDMyICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywgaW50MzJfdCBjb2VmZiwgcHRyZGlmZl90IGxlbikKIHsKICAgICBpbnQgaTsKIApAQCAtMzU1LDcgKzM1NSw3IEBACiAgICAgICAgIGRzdFtpXSAtPSBtdWwyMihzcmNbaV0sIGNvZWZmKTsKIH0KIAotc3RhdGljIHZvaWQgZmlsdGVyMShpbnQzMl90ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywgaW50MzJfdCBjb2VmZiwgcHRyZGlmZl90IGxlbikKK3N0YXRpYyB2b2lkIGZpbHRlcjEoU1VJTlQzMiAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGludDMyX3QgY29lZmYsIHB0cmRpZmZfdCBsZW4pCiB7CiAgICAgaW50IGk7CiAKQEAgLTM4NSw2ICszODUsNzcgQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIGxicl9iYW5rX2MoZmxvYXQgb3V0cHV0WzMyXVs0XSwgZmxvYXQgKippbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWZmLCBwdHJkaWZmX3Qgb2ZzLCBwdHJkaWZmX3QgbGVuKQoreworICAgIGZsb2F0IFNXMCA9IGNvZWZmWzBdOworICAgIGZsb2F0IFNXMSA9IGNvZWZmWzFdOworICAgIGZsb2F0IFNXMiA9IGNvZWZmWzJdOworICAgIGZsb2F0IFNXMyA9IGNvZWZmWzNdOworCisgICAgZmxvYXQgQzEgID0gY29lZmZbNF07CisgICAgZmxvYXQgQzIgID0gY29lZmZbNV07CisgICAgZmxvYXQgQzMgID0gY29lZmZbNl07CisgICAgZmxvYXQgQzQgID0gY29lZmZbN107CisKKyAgICBmbG9hdCBBTDEgPSBjb2VmZls4XTsKKyAgICBmbG9hdCBBTDIgPSBjb2VmZls5XTsKKworICAgIGludCBpOworCisgICAgLy8gU2hvcnQgd2luZG93IGFuZCA4IHBvaW50IGZvcndhcmQgTURDVAorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBmbG9hdCAqc3JjID0gaW5wdXRbaV0gKyBvZnM7CisKKyAgICAgICAgZmxvYXQgYSA9IHNyY1stNF0gKiBTVzAgLSBzcmNbLTFdICogU1czOworICAgICAgICBmbG9hdCBiID0gc3JjWy0zXSAqIFNXMSAtIHNyY1stMl0gKiBTVzI7CisgICAgICAgIGZsb2F0IGMgPSBzcmNbIDJdICogU1cxICsgc3JjWyAxXSAqIFNXMjsKKyAgICAgICAgZmxvYXQgZCA9IHNyY1sgM10gKiBTVzAgKyBzcmNbIDBdICogU1czOworCisgICAgICAgIG91dHB1dFtpXVswXSA9IEMxICogYiAtIEMyICogYyArIEM0ICogYSAtIEMzICogZDsKKyAgICAgICAgb3V0cHV0W2ldWzFdID0gQzEgKiBkIC0gQzIgKiBhIC0gQzQgKiBiIC0gQzMgKiBjOworICAgICAgICBvdXRwdXRbaV1bMl0gPSBDMyAqIGIgKyBDMiAqIGQgLSBDNCAqIGMgKyBDMSAqIGE7CisgICAgICAgIG91dHB1dFtpXVszXSA9IEMzICogYSAtIEMyICogYiArIEM0ICogZCAtIEMxICogYzsKKyAgICB9CisKKyAgICAvLyBBbGlhc2luZyBjYW5jZWxsYXRpb24gZm9yIGhpZ2ggZnJlcXVlbmNpZXMKKyAgICBmb3IgKGkgPSAxMjsgaSA8IGxlbiAtIDE7IGkrKykgeworICAgICAgICBmbG9hdCBhID0gb3V0cHV0W2kgIF1bM10gKiBBTDE7CisgICAgICAgIGZsb2F0IGIgPSBvdXRwdXRbaSsxXVswXSAqIEFMMTsKKyAgICAgICAgb3V0cHV0W2kgIF1bM10gKz0gYiAtIGE7CisgICAgICAgIG91dHB1dFtpKzFdWzBdIC09IGIgKyBhOworICAgICAgICBhID0gb3V0cHV0W2kgIF1bMl0gKiBBTDI7CisgICAgICAgIGIgPSBvdXRwdXRbaSsxXVsxXSAqIEFMMjsKKyAgICAgICAgb3V0cHV0W2kgIF1bMl0gKz0gYiAtIGE7CisgICAgICAgIG91dHB1dFtpKzFdWzFdIC09IGIgKyBhOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbGZlX2lpcl9jKGZsb2F0ICpvdXRwdXQsIGNvbnN0IGZsb2F0ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBpaXJbNV1bNF0sIGZsb2F0IGhpc3RbNV1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGZhY3RvcikKK3sKKyAgICBmbG9hdCByZXMsIHRtcDsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIHJlcyA9ICppbnB1dCsrOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmYWN0b3I7IGorKykgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDU7IGsrKykgeworICAgICAgICAgICAgICAgIHRtcCA9IGhpc3Rba11bMF0gKiBpaXJba11bMF0gKyBoaXN0W2tdWzFdICogaWlyW2tdWzFdICsgcmVzOworICAgICAgICAgICAgICAgIHJlcyA9IGhpc3Rba11bMF0gKiBpaXJba11bMl0gKyBoaXN0W2tdWzFdICogaWlyW2tdWzNdICsgdG1wOworCisgICAgICAgICAgICAgICAgaGlzdFtrXVswXSA9IGhpc3Rba11bMV07CisgICAgICAgICAgICAgICAgaGlzdFtrXVsxXSA9IHRtcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKm91dHB1dCsrID0gcmVzOworICAgICAgICAgICAgcmVzID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKwogYXZfY29sZCB2b2lkIGZmX2RjYWRzcF9pbml0KERDQURTUENvbnRleHQgKnMpCiB7CiAgICAgcy0+ZGVjb2RlX2hmICAgICA9IGRlY29kZV9oZl9jOwpAQCAtNDExLDYgKzQ4Miw5IEBACiAKICAgICBzLT5hc3NlbWJsZV9mcmVxX2JhbmRzID0gYXNzZW1ibGVfZnJlcV9iYW5kc19jOwogCisgICAgcy0+bGJyX2JhbmsgPSBsYnJfYmFua19jOworICAgIHMtPmxmZV9paXIgPSBsZmVfaWlyX2M7CisKICAgICBpZiAoQVJDSF9YODYpCiAgICAgICAgIGZmX2RjYWRzcF9pbml0X3g4NihzKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhZHNwLmggYi9saWJhdmNvZGVjL2RjYWRzcC5oCmluZGV4IGM4MmI3YjEuLjhmMmY0NjcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGNhZHNwLmgKKysrIGIvbGliYXZjb2RlYy9kY2Fkc3AuaApAQCAtODQsNiArODQsMTMgQEAKIAogICAgIHZvaWQgKCphc3NlbWJsZV9mcmVxX2JhbmRzKShpbnQzMl90ICpkc3QsIGludDMyX3QgKnNyYzAsIGludDMyX3QgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmNvZWZmLCBwdHJkaWZmX3QgbGVuKTsKKworICAgIHZvaWQgKCpsYnJfYmFuaykoZmxvYXQgb3V0cHV0WzMyXVs0XSwgZmxvYXQgKippbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb2VmZiwgcHRyZGlmZl90IG9mcywgcHRyZGlmZl90IGxlbik7CisKKyAgICB2b2lkICgqbGZlX2lpcikoZmxvYXQgKm91dHB1dCwgY29uc3QgZmxvYXQgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBpaXJbNV1bNF0sIGZsb2F0IGhpc3RbNV1bMl0sCisgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBmYWN0b3IpOwogfSBEQ0FEU1BDb250ZXh0OwogCiBhdl9jb2xkIHZvaWQgZmZfZGNhZHNwX2luaXQoRENBRFNQQ29udGV4dCAqcyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjYWVuYy5jIGIvbGliYXZjb2RlYy9kY2FlbmMuYwppbmRleCA3MGU5MjMwLi4xODY5OTdjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RjYWVuYy5jCisrKyBiL2xpYmF2Y29kZWMvZGNhZW5jLmMKQEAgLTIxLDE0ICsyMSwyMiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNkZWZpbmUgRkZUX0ZMT0FUIDAKKyNkZWZpbmUgRkZUX0ZJWEVEXzMyIDEKKwogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmZtYXRoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJkY2EuaCIKKyNpbmNsdWRlICJkY2FhZHBjbS5oIgorI2luY2x1ZGUgImRjYW1hdGguaCIKKyNpbmNsdWRlICJkY2FfY29yZS5oIgogI2luY2x1ZGUgImRjYWRhdGEuaCIKICNpbmNsdWRlICJkY2FlbmMuaCIKKyNpbmNsdWRlICJmZnQuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJwdXRfYml0cy5oIgpAQCAtNDQsOCArNTIsMTggQEAKICNkZWZpbmUgU1VCQkFORF9TQU1QTEVTIChTVUJGUkFNRVMgKiBTVUJTVUJGUkFNRVMgKiA4KQogI2RlZmluZSBBVUJBTkRTIDI1CiAKKyNkZWZpbmUgQ09TX1QoeCkgKGMtPmNvc190YWJsZVsoeCkgJiAyMDQ3XSkKKwordHlwZWRlZiBzdHJ1Y3QgQ29tcHJlc3Npb25PcHRpb25zIHsKKyAgICBpbnQgYWRwY21fbW9kZTsKK30gQ29tcHJlc3Npb25PcHRpb25zOworCiB0eXBlZGVmIHN0cnVjdCBEQ0FFbmNDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKICAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIERDQUFEUENNRW5jQ29udGV4dCBhZHBjbV9jdHg7CisgICAgRkZUQ29udGV4dCBtZGN0OworICAgIENvbXByZXNzaW9uT3B0aW9ucyBvcHRpb25zOwogICAgIGludCBmcmFtZV9zaXplOwogICAgIGludCBmcmFtZV9iaXRzOwogICAgIGludCBmdWxsYmFuZF9jaGFubmVsczsKQEAgLTYxLDI5ICs3OSwzNSBAQAogICAgIGludDMyX3QgbGZlX3BlYWtfY2I7CiAgICAgY29uc3QgaW50OF90ICpjaGFubmVsX29yZGVyX3RhYjsgIC8vLzwgY2hhbm5lbCByZW9yZGVyaW5nIHRhYmxlLCBsZmUgYW5kIG5vbiBsZmUKIAotICAgIGludDMyX3QgaGlzdG9yeVs1MTJdW01BWF9DSEFOTkVMU107IC8qIFRoaXMgaXMgYSBjaXJjdWxhciBidWZmZXIgKi8KLSAgICBpbnQzMl90IHN1YmJhbmRbU1VCQkFORF9TQU1QTEVTXVtEQ0FFTkNfU1VCQkFORFNdW01BWF9DSEFOTkVMU107Ci0gICAgaW50MzJfdCBxdWFudGl6ZWRbU1VCQkFORF9TQU1QTEVTXVtEQ0FFTkNfU1VCQkFORFNdW01BWF9DSEFOTkVMU107Ci0gICAgaW50MzJfdCBwZWFrX2NiW0RDQUVOQ19TVUJCQU5EU11bTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQzMl90IHByZWRpY3Rpb25fbW9kZVtNQVhfQ0hBTk5FTFNdW0RDQUVOQ19TVUJCQU5EU107CisgICAgaW50MzJfdCBhZHBjbV9oaXN0b3J5W01BWF9DSEFOTkVMU11bRENBRU5DX1NVQkJBTkRTXVtEQ0FfQURQQ01fQ09FRkZTICogMl07CisgICAgaW50MzJfdCBoaXN0b3J5W01BWF9DSEFOTkVMU11bNTEyXTsgLyogVGhpcyBpcyBhIGNpcmN1bGFyIGJ1ZmZlciAqLworICAgIGludDMyX3QgKnN1YmJhbmRbTUFYX0NIQU5ORUxTXVtEQ0FFTkNfU1VCQkFORFNdOworICAgIGludDMyX3QgcXVhbnRpemVkW01BWF9DSEFOTkVMU11bRENBRU5DX1NVQkJBTkRTXVtTVUJCQU5EX1NBTVBMRVNdOworICAgIGludDMyX3QgcGVha19jYltNQVhfQ0hBTk5FTFNdW0RDQUVOQ19TVUJCQU5EU107CisgICAgaW50MzJfdCBkaWZmX3BlYWtfY2JbTUFYX0NIQU5ORUxTXVtEQ0FFTkNfU1VCQkFORFNdOyAvLy88IGV4cGVjdGVkIHBlYWsgb2YgcmVzaWR1YWwgc2lnbmFsCiAgICAgaW50MzJfdCBkb3duc2FtcGxlZF9sZmVbRENBX0xGRV9TQU1QTEVTXTsKICAgICBpbnQzMl90IG1hc2tpbmdfY3VydmVfY2JbU1VCU1VCRlJBTUVTXVsyNTZdOwotICAgIGludCBhYml0c1tEQ0FFTkNfU1VCQkFORFNdW01BWF9DSEFOTkVMU107Ci0gICAgaW50IHNjYWxlX2ZhY3RvcltEQ0FFTkNfU1VCQkFORFNdW01BWF9DSEFOTkVMU107Ci0gICAgc29mdGZsb2F0IHF1YW50W0RDQUVOQ19TVUJCQU5EU11bTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQzMl90IGJpdF9hbGxvY2F0aW9uX3NlbFtNQVhfQ0hBTk5FTFNdOworICAgIGludCBhYml0c1tNQVhfQ0hBTk5FTFNdW0RDQUVOQ19TVUJCQU5EU107CisgICAgaW50IHNjYWxlX2ZhY3RvcltNQVhfQ0hBTk5FTFNdW0RDQUVOQ19TVUJCQU5EU107CisgICAgc29mdGZsb2F0IHF1YW50W01BWF9DSEFOTkVMU11bRENBRU5DX1NVQkJBTkRTXTsKKyAgICBpbnQzMl90IHF1YW50X2luZGV4X3NlbFtNQVhfQ0hBTk5FTFNdW0RDQV9DT0RFX0JPT0tTXTsKICAgICBpbnQzMl90IGVmZl9tYXNraW5nX2N1cnZlX2NiWzI1Nl07CiAgICAgaW50MzJfdCBiYW5kX21hc2tpbmdfY2JbMzJdOwogICAgIGludDMyX3Qgd29yc3RfcXVhbnRpemF0aW9uX25vaXNlOwogICAgIGludDMyX3Qgd29yc3Rfbm9pc2VfZXZlcjsKICAgICBpbnQgY29uc3VtZWRfYml0czsKLX0gRENBRW5jQ29udGV4dDsKKyAgICBpbnQgY29uc3VtZWRfYWRwY21fYml0czsgLy8vPCBOdW1iZXIgb2YgYml0cyB0byB0cmFuc21pdCBBRFBDTSByZWxhdGVkIGluZm8KIAotc3RhdGljIGludDMyX3QgY29zX3RhYmxlWzIwNDhdOwotc3RhdGljIGludDMyX3QgYmFuZF9pbnRlcnBvbGF0aW9uWzJdWzUxMl07Ci1zdGF0aWMgaW50MzJfdCBiYW5kX3NwZWN0cnVtWzJdWzhdOwotc3RhdGljIGludDMyX3QgYXVmWzldW0FVQkFORFNdWzI1Nl07Ci1zdGF0aWMgaW50MzJfdCBjYl90b19hZGRbMjU2XTsKLXN0YXRpYyBpbnQzMl90IGNiX3RvX2xldmVsWzIwNDhdOwotc3RhdGljIGludDMyX3QgbGZlX2Zpcl82NGlbNTEyXTsKKyAgICBpbnQzMl90IGNvc190YWJsZVsyMDQ4XTsKKyAgICBpbnQzMl90IGJhbmRfaW50ZXJwb2xhdGlvbl90YWJbMl1bNTEyXTsKKyAgICBpbnQzMl90IGJhbmRfc3BlY3RydW1fdGFiWzJdWzhdOworICAgIGludDMyX3QgYXVmWzldW0FVQkFORFNdWzI1Nl07CisgICAgaW50MzJfdCBjYl90b19hZGRbMjU2XTsKKyAgICBpbnQzMl90IGNiX3RvX2xldmVsWzIwNDhdOworICAgIGludDMyX3QgbGZlX2Zpcl82NGlbNTEyXTsKK30gRENBRW5jQ29udGV4dDsKIAogLyogVHJhbnNmZXIgZnVuY3Rpb24gb2Ygb3V0ZXIgYW5kIG1pZGRsZSBlYXIsIEh6IC0+IGRCICovCiBzdGF0aWMgZG91YmxlIGhvbShkb3VibGUgZikKQEAgLTEwNSwxOCArMTI5LDUzIEBACiAgICAgcmV0dXJuIDIwICogbG9nMTAoaCk7CiB9CiAKK3N0YXRpYyBpbnQgc3ViYmFuZF9idWZlcl9hbGxvYyhEQ0FFbmNDb250ZXh0ICpjKQoreworICAgIGludCBjaCwgYmFuZDsKKyAgICBpbnQzMl90ICpidWZlciA9IGF2X2NhbGxvYyhNQVhfQ0hBTk5FTFMgKiBEQ0FFTkNfU1VCQkFORFMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTVUJCQU5EX1NBTVBMRVMgKyBEQ0FfQURQQ01fQ09FRkZTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MzJfdCkpOworICAgIGlmICghYnVmZXIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIC8qIHdlIG5lZWQgYSBwbGFjZSBmb3IgRENBX0FEUENNX0NPRUZGIHNhbXBsZXMgZnJvbSBwcmV2aW91cyBmcmFtZQorICAgICAqIHRvIGNhbGMgcHJlZGljdGlvbiBjb2VmZmljaWVudHMgZm9yIGVhY2ggc3ViYmFuZCAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IE1BWF9DSEFOTkVMUzsgY2grKykgeworICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgRENBRU5DX1NVQkJBTkRTOyBiYW5kKyspIHsKKyAgICAgICAgICAgIGMtPnN1YmJhbmRbY2hdW2JhbmRdID0gYnVmZXIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCAqIERDQUVOQ19TVUJCQU5EUyAqIChTVUJCQU5EX1NBTVBMRVMgKyBEQ0FfQURQQ01fQ09FRkZTKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQgKiAoU1VCQkFORF9TQU1QTEVTICsgRENBX0FEUENNX0NPRUZGUykgKyBEQ0FfQURQQ01fQ09FRkZTOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdWJiYW5kX2J1ZmVyX2ZyZWUoRENBRW5jQ29udGV4dCAqYykKK3sKKyAgICBpbnQzMl90ICpidWZlciA9IGMtPnN1YmJhbmRbMF1bMF0gLSBEQ0FfQURQQ01fQ09FRkZTOworICAgIGF2X2ZyZWVwKCZidWZlcik7Cit9CisKIHN0YXRpYyBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIERDQUVuY0NvbnRleHQgKmMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIHVpbnQ2NF90IGxheW91dCA9IGF2Y3R4LT5jaGFubmVsX2xheW91dDsKLSAgICBpbnQgaSwgbWluX2ZyYW1lX2JpdHM7CisgICAgaW50IGksIGosIGssIG1pbl9mcmFtZV9iaXRzOworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3ViYmFuZF9idWZlcl9hbGxvYyhjKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIGMtPmZ1bGxiYW5kX2NoYW5uZWxzID0gYy0+Y2hhbm5lbHMgPSBhdmN0eC0+Y2hhbm5lbHM7CiAgICAgYy0+bGZlX2NoYW5uZWwgPSAoYXZjdHgtPmNoYW5uZWxzID09IDMgfHwgYXZjdHgtPmNoYW5uZWxzID09IDYpOwotICAgIGMtPmJhbmRfaW50ZXJwb2xhdGlvbiA9IGJhbmRfaW50ZXJwb2xhdGlvblsxXTsKLSAgICBjLT5iYW5kX3NwZWN0cnVtID0gYmFuZF9zcGVjdHJ1bVsxXTsKKyAgICBjLT5iYW5kX2ludGVycG9sYXRpb24gPSBjLT5iYW5kX2ludGVycG9sYXRpb25fdGFiWzFdOworICAgIGMtPmJhbmRfc3BlY3RydW0gPSBjLT5iYW5kX3NwZWN0cnVtX3RhYlsxXTsKICAgICBjLT53b3JzdF9xdWFudGl6YXRpb25fbm9pc2UgPSAtMjA0NzsKICAgICBjLT53b3JzdF9ub2lzZV9ldmVyID0gLTIwNDc7CisgICAgYy0+Y29uc3VtZWRfYWRwY21fYml0cyA9IDA7CisKKyAgICBpZiAoZmZfZGNhYWRwY21faW5pdCgmYy0+YWRwY21fY3R4KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIGlmICghbGF5b3V0KSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJObyBjaGFubmVsIGxheW91dCBzcGVjaWZpZWQuIFRoZSAiCkBAIC0xMzcsOSArMTk2LDIzIEBACiAKICAgICBpZiAoYy0+bGZlX2NoYW5uZWwpIHsKICAgICAgICAgYy0+ZnVsbGJhbmRfY2hhbm5lbHMtLTsKLSAgICAgICAgYy0+Y2hhbm5lbF9vcmRlcl90YWIgPSBmZl9kY2FfY2hhbm5lbF9yZW9yZGVyX2xmZVtjLT5jaGFubmVsX2NvbmZpZ107CisgICAgICAgIGMtPmNoYW5uZWxfb3JkZXJfdGFiID0gY2hhbm5lbF9yZW9yZGVyX2xmZVtjLT5jaGFubmVsX2NvbmZpZ107CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYy0+Y2hhbm5lbF9vcmRlcl90YWIgPSBmZl9kY2FfY2hhbm5lbF9yZW9yZGVyX25vbGZlW2MtPmNoYW5uZWxfY29uZmlnXTsKKyAgICAgICAgYy0+Y2hhbm5lbF9vcmRlcl90YWIgPSBjaGFubmVsX3Jlb3JkZXJfbm9sZmVbYy0+Y2hhbm5lbF9jb25maWddOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgRENBX0NPREVfQk9PS1M7IGorKykgeworICAgICAgICAgICAgYy0+cXVhbnRfaW5kZXhfc2VsW2ldW2pdID0gZmZfZGNhX3F1YW50X2luZGV4X2dyb3VwX3NpemVbal07CisgICAgICAgIH0KKyAgICAgICAgLyogNiAtIG5vIEh1ZmZtYW4gKi8KKyAgICAgICAgYy0+Yml0X2FsbG9jYXRpb25fc2VsW2ldID0gNjsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgRENBRU5DX1NVQkJBTkRTOyBqKyspIHsKKyAgICAgICAgICAgIC8qIC0xIC0gbm8gQURQQ00gKi8KKyAgICAgICAgICAgIGMtPnByZWRpY3Rpb25fbW9kZVtpXVtqXSA9IC0xOworICAgICAgICAgICAgbWVtc2V0KGMtPmFkcGNtX2hpc3RvcnlbaV1bal0sIDAsIHNpemVvZihpbnQzMl90KSpEQ0FfQURQQ01fQ09FRkZTKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKQEAgLTE1MSw3ICsyMjQsNyBAQAogICAgIGMtPnNhbXBsZXJhdGVfaW5kZXggPSBpOwogCiAgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA8IDMyMDAwIHx8IGF2Y3R4LT5iaXRfcmF0ZSA+IDM4NDAwMDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJCaXQgcmF0ZSAlIlBSSWQ2NCIgbm90IHN1cHBvcnRlZC4iLCAoaW50NjRfdClhdmN0eC0+Yml0X3JhdGUpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJpdCByYXRlICUiUFJJZDY0IiBub3Qgc3VwcG9ydGVkLiIsIGF2Y3R4LT5iaXRfcmF0ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGZmX2RjYV9iaXRfcmF0ZXNbaV0gPCBhdmN0eC0+Yml0X3JhdGU7IGkrKykKQEAgLTE2Niw4NyArMjM5LDc3IEBACiAKICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IDMyICogU1VCQkFORF9TQU1QTEVTOwogCi0gICAgaWYgKCFjb3NfdGFibGVbMF0pIHsKLSAgICAgICAgaW50IGosIGs7CisgICAgaWYgKChyZXQgPSBmZl9tZGN0X2luaXQoJmMtPm1kY3QsIDksIDAsIDEuMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICBjb3NfdGFibGVbMF0gPSAweDdmZmZmZmZmOwotICAgICAgICBjb3NfdGFibGVbNTEyXSA9IDA7Ci0gICAgICAgIGNvc190YWJsZVsxMDI0XSA9IC1jb3NfdGFibGVbMF07Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCA1MTI7IGkrKykgewotICAgICAgICAgICAgY29zX3RhYmxlW2ldICAgPSAoaW50MzJfdCkoMHg3ZmZmZmZmZiAqIGNvcyhNX1BJICogaSAvIDEwMjQpKTsKLSAgICAgICAgICAgIGNvc190YWJsZVsxMDI0LWldID0gLWNvc190YWJsZVtpXTsKLSAgICAgICAgICAgIGNvc190YWJsZVsxMDI0K2ldID0gLWNvc190YWJsZVtpXTsKLSAgICAgICAgICAgIGNvc190YWJsZVsyMDQ4LWldID0gY29zX3RhYmxlW2ldOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyMDQ4OyBpKyspIHsKLSAgICAgICAgICAgIGNiX3RvX2xldmVsW2ldID0gKGludDMyX3QpKDB4N2ZmZmZmZmYgKiBmZl9leHAxMCgtMC4wMDUgKiBpKSk7Ci0gICAgICAgIH0KKyAgICAvKiBJbml0IGFsbCB0YWJsZXMgKi8KKyAgICBjLT5jb3NfdGFibGVbMF0gPSAweDdmZmZmZmZmOworICAgIGMtPmNvc190YWJsZVs1MTJdID0gMDsKKyAgICBjLT5jb3NfdGFibGVbMTAyNF0gPSAtYy0+Y29zX3RhYmxlWzBdOworICAgIGZvciAoaSA9IDE7IGkgPCA1MTI7IGkrKykgeworICAgICAgICBjLT5jb3NfdGFibGVbaV0gICA9IChpbnQzMl90KSgweDdmZmZmZmZmICogY29zKE1fUEkgKiBpIC8gMTAyNCkpOworICAgICAgICBjLT5jb3NfdGFibGVbMTAyNC1pXSA9IC1jLT5jb3NfdGFibGVbaV07CisgICAgICAgIGMtPmNvc190YWJsZVsxMDI0K2ldID0gLWMtPmNvc190YWJsZVtpXTsKKyAgICAgICAgYy0+Y29zX3RhYmxlWzIwNDgtaV0gPSArYy0+Y29zX3RhYmxlW2ldOworICAgIH0KIAotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzI7IGsrKykgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotICAgICAgICAgICAgICAgIGxmZV9maXJfNjRpWzY0ICogaiArIGtdID0gKGludDMyX3QpKDB4ZmZmZmZmODAwMDAwVUxMICogZmZfZGNhX2xmZV9maXJfNjRbOCAqIGsgKyBqXSk7Ci0gICAgICAgICAgICAgICAgbGZlX2Zpcl82NGlbNjQgKiAoNy1qKSArICg2MyAtIGspXSA9IChpbnQzMl90KSgweGZmZmZmZjgwMDAwMFVMTCAqIGZmX2RjYV9sZmVfZmlyXzY0WzggKiBrICsgal0pOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDIwNDg7IGkrKykKKyAgICAgICAgYy0+Y2JfdG9fbGV2ZWxbaV0gPSAoaW50MzJfdCkoMHg3ZmZmZmZmZiAqIGZmX2V4cDEwKC0wLjAwNSAqIGkpKTsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKLSAgICAgICAgICAgIGJhbmRfaW50ZXJwb2xhdGlvblswXVtpXSA9IChpbnQzMl90KSgweDEwMDAwMDAwMDBVTEwgKiBmZl9kY2FfZmlyXzMyYmFuZHNfcGVyZmVjdFtpXSk7Ci0gICAgICAgICAgICBiYW5kX2ludGVycG9sYXRpb25bMV1baV0gPSAoaW50MzJfdCkoMHgxMDAwMDAwMDAwVUxMICogZmZfZGNhX2Zpcl8zMmJhbmRzX25vbnBlcmZlY3RbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IEFVQkFORFM7IGorKykgewotICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyNTY7IGsrKykgewotICAgICAgICAgICAgICAgICAgICBkb3VibGUgZnJlcSA9IHNhbXBsZV9yYXRlc1tpXSAqIChrICsgMC41KSAvIDUxMjsKLQotICAgICAgICAgICAgICAgICAgICBhdWZbaV1bal1ba10gPSAoaW50MzJfdCkoMTAgKiAoaG9tKGZyZXEpICsgZ2FtbWFmaWx0ZXIoaiwgZnJlcSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBhZGQgPSAxICsgZmZfZXhwMTAoLTAuMDEgKiBpKTsKLSAgICAgICAgICAgIGNiX3RvX2FkZFtpXSA9IChpbnQzMl90KSgxMDAgKiBsb2cxMChhZGQpKTsKLSAgICAgICAgfQorICAgIGZvciAoayA9IDA7IGsgPCAzMjsgaysrKSB7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBhY2N1bSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgcmVjb25zdCA9IGZmX2RjYV9maXJfMzJiYW5kc19wZXJmZWN0W2ldICogKChpICYgNjQpID8gKC0xKSA6IDEpOwotICAgICAgICAgICAgICAgIGFjY3VtICs9IHJlY29uc3QgKiBjb3MoMiAqIE1fUEkgKiAoaSArIDAuNSAtIDI1NikgKiAoaiArIDAuNSkgLyA1MTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFuZF9zcGVjdHJ1bVswXVtqXSA9IChpbnQzMl90KSgyMDAgKiBsb2cxMChhY2N1bSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBhY2N1bSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgcmVjb25zdCA9IGZmX2RjYV9maXJfMzJiYW5kc19ub25wZXJmZWN0W2ldICogKChpICYgNjQpID8gKC0xKSA6IDEpOwotICAgICAgICAgICAgICAgIGFjY3VtICs9IHJlY29uc3QgKiBjb3MoMiAqIE1fUEkgKiAoaSArIDAuNSAtIDI1NikgKiAoaiArIDAuNSkgLyA1MTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmFuZF9zcGVjdHJ1bVsxXVtqXSA9IChpbnQzMl90KSgyMDAgKiBsb2cxMChhY2N1bSkpOworICAgICAgICAgICAgYy0+bGZlX2Zpcl82NGlbNjQgKiBqICsga10gPSAoaW50MzJfdCkoMHhmZmZmZmY4MDAwMDBVTEwgKiBmZl9kY2FfbGZlX2Zpcl82NFs4ICogayArIGpdKTsKKyAgICAgICAgICAgIGMtPmxmZV9maXJfNjRpWzY0ICogKDctaikgKyAoNjMgLSBrKV0gPSAoaW50MzJfdCkoMHhmZmZmZmY4MDAwMDBVTEwgKiBmZl9kY2FfbGZlX2Zpcl82NFs4ICogayArIGpdKTsKICAgICAgICAgfQogICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworICAgICAgICBjLT5iYW5kX2ludGVycG9sYXRpb25fdGFiWzBdW2ldID0gKGludDMyX3QpKDB4MTAwMDAwMDAwMFVMTCAqIGZmX2RjYV9maXJfMzJiYW5kc19wZXJmZWN0W2ldKTsKKyAgICAgICAgYy0+YmFuZF9pbnRlcnBvbGF0aW9uX3RhYlsxXVtpXSA9IChpbnQzMl90KSgweDEwMDAwMDAwMDBVTEwgKiBmZl9kY2FfZmlyXzMyYmFuZHNfbm9ucGVyZmVjdFtpXSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgQVVCQU5EUzsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjU2OyBrKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZnJlcSA9IHNhbXBsZV9yYXRlc1tpXSAqIChrICsgMC41KSAvIDUxMjsKKworICAgICAgICAgICAgICAgIGMtPmF1ZltpXVtqXVtrXSA9IChpbnQzMl90KSgxMCAqIChob20oZnJlcSkgKyBnYW1tYWZpbHRlcihqLCBmcmVxKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBhZGQgPSAxICsgZmZfZXhwMTAoLTAuMDEgKiBpKTsKKyAgICAgICAgYy0+Y2JfdG9fYWRkW2ldID0gKGludDMyX3QpKDEwMCAqIGxvZzEwKGFkZCkpOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgIGRvdWJsZSBhY2N1bSA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1MTI7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHJlY29uc3QgPSBmZl9kY2FfZmlyXzMyYmFuZHNfcGVyZmVjdFtpXSAqICgoaSAmIDY0KSA/ICgtMSkgOiAxKTsKKyAgICAgICAgICAgIGFjY3VtICs9IHJlY29uc3QgKiBjb3MoMiAqIE1fUEkgKiAoaSArIDAuNSAtIDI1NikgKiAoaiArIDAuNSkgLyA1MTIpOworICAgICAgICB9CisgICAgICAgIGMtPmJhbmRfc3BlY3RydW1fdGFiWzBdW2pdID0gKGludDMyX3QpKDIwMCAqIGxvZzEwKGFjY3VtKSk7CisgICAgfQorICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgZG91YmxlIGFjY3VtID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgcmVjb25zdCA9IGZmX2RjYV9maXJfMzJiYW5kc19ub25wZXJmZWN0W2ldICogKChpICYgNjQpID8gKC0xKSA6IDEpOworICAgICAgICAgICAgYWNjdW0gKz0gcmVjb25zdCAqIGNvcygyICogTV9QSSAqIChpICsgMC41IC0gMjU2KSAqIChqICsgMC41KSAvIDUxMik7CisgICAgICAgIH0KKyAgICAgICAgYy0+YmFuZF9zcGVjdHJ1bV90YWJbMV1bal0gPSAoaW50MzJfdCkoMjAwICogbG9nMTAoYWNjdW0pKTsKKyAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQzMl90IGNvc190KGludCB4KQorc3RhdGljIGF2X2NvbGQgaW50IGVuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgcmV0dXJuIGNvc190YWJsZVt4ICYgMjA0N107Ci19CisgICAgRENBRW5jQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZmZfbWRjdF9lbmQoJmMtPm1kY3QpOworICAgIHN1YmJhbmRfYnVmZXJfZnJlZShjKTsKKyAgICBmZl9kY2FhZHBjbV9mcmVlKCZjLT5hZHBjbV9jdHgpOwogCi1zdGF0aWMgaW5saW5lIGludDMyX3Qgc2luX3QoaW50IHgpCi17Ci0gICAgcmV0dXJuIGNvc190KHggLSA1MTIpOwotfQotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgaGFsZjMyKGludDMyX3QgYSkKLXsKLSAgICByZXR1cm4gKGEgKyAxKSA+PiAxOwotfQotCi1zdGF0aWMgaW5saW5lIGludDMyX3QgbXVsMzIoaW50MzJfdCBhLCBpbnQzMl90IGIpCi17Ci0gICAgaW50NjRfdCByID0gKGludDY0X3QpYSAqIGIgKyAweDgwMDAwMDAwVUxMOwotICAgIHJldHVybiByID4+IDMyOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzdWJiYW5kX3RyYW5zZm9ybShEQ0FFbmNDb250ZXh0ICpjLCBjb25zdCBpbnQzMl90ICppbnB1dCkKQEAgLTI1OSw4ICszMjIsNyBAQAogICAgICAgICBpbnQgaGlzdF9zdGFydCA9IDA7CiAgICAgICAgIGNvbnN0IGludCBjaGkgPSBjLT5jaGFubmVsX29yZGVyX3RhYltjaF07CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKQotICAgICAgICAgICAgaGlzdFtpXSA9IGMtPmhpc3RvcnlbaV1bY2hdOworICAgICAgICBtZW1jcHkoaGlzdCwgJmMtPmhpc3RvcnlbY2hdWzBdLCA1MTIgKiBzaXplb2YoaW50MzJfdCkpOwogCiAgICAgICAgIGZvciAoc3VicyA9IDA7IHN1YnMgPCBTVUJCQU5EX1NBTVBMRVM7IHN1YnMrKykgewogICAgICAgICAgICAgaW50MzJfdCBhY2N1bVs2NF07CkBAIC0yNjgsOCArMzMwLDcgQEAKICAgICAgICAgICAgIGludCBiYW5kOwogCiAgICAgICAgICAgICAvKiBDYWxjdWxhdGUgdGhlIGNvbnZvbHV0aW9ucyBhdCBvbmNlICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICAgICAgICAgICAgICBhY2N1bVtpXSA9IDA7CisgICAgICAgICAgICBtZW1zZXQoYWNjdW0sIDAsIDY0ICogc2l6ZW9mKGludDMyX3QpKTsKIAogICAgICAgICAgICAgZm9yIChrID0gMCwgaSA9IGhpc3Rfc3RhcnQsIGogPSAwOwogICAgICAgICAgICAgICAgICAgICBpIDwgNTEyOyBrID0gKGsgKyAxKSAmIDYzLCBpKyssIGorKykKQEAgLTI4NiwxNSArMzQ3LDE2IEBACiAgICAgICAgICAgICAgICAgcmVzcCA9IDA7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMTY7IGkgPCA0ODsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGludCBzID0gKDIgKiBiYW5kICsgMSkgKiAoMiAqIChpICsgMTYpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3AgKz0gbXVsMzIoYWNjdW1baV0sIGNvc190KHMgPDwgMykpID4+IDM7CisgICAgICAgICAgICAgICAgICAgIHJlc3AgKz0gbXVsMzIoYWNjdW1baV0sIENPU19UKHMgPDwgMykpID4+IDM7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYy0+c3ViYmFuZFtzdWJzXVtiYW5kXVtjaF0gPSAoKGJhbmQgKyAxKSAmIDIpID8gLXJlc3AgOiByZXNwOworICAgICAgICAgICAgICAgIGMtPnN1YmJhbmRbY2hdW2JhbmRdW3N1YnNdID0gKChiYW5kICsgMSkgJiAyKSA/IC1yZXNwIDogcmVzcDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogQ29weSBpbiAzMiBuZXcgc2FtcGxlcyBmcm9tIGlucHV0ICovCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKICAgICAgICAgICAgICAgICBoaXN0W2kgKyBoaXN0X3N0YXJ0XSA9IGlucHV0WyhzdWJzICogMzIgKyBpKSAqIGMtPmNoYW5uZWxzICsgY2hpXTsKKwogICAgICAgICAgICAgaGlzdF9zdGFydCA9IChoaXN0X3N0YXJ0ICsgMzIpICYgNTExOwogICAgICAgICB9CiAgICAgfQpAQCAtMzAzLDIzICszNjUsMjIgQEAKIHN0YXRpYyB2b2lkIGxmZV9kb3duc2FtcGxlKERDQUVuY0NvbnRleHQgKmMsIGNvbnN0IGludDMyX3QgKmlucHV0KQogewogICAgIC8qIEZJWE1FOiBtYWtlIDEyOHggTEZFIGRvd25zYW1wbGluZyBwb3NzaWJsZSAqLwotICAgIGNvbnN0IGludCBsZmVjaCA9IGZmX2RjYV9sZmVfaW5kZXhbYy0+Y2hhbm5lbF9jb25maWddOworICAgIGNvbnN0IGludCBsZmVjaCA9IGxmZV9pbmRleFtjLT5jaGFubmVsX2NvbmZpZ107CiAgICAgaW50IGksIGosIGxmZXM7CiAgICAgaW50MzJfdCBoaXN0WzUxMl07CiAgICAgaW50MzJfdCBhY2N1bTsKICAgICBpbnQgaGlzdF9zdGFydCA9IDA7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspCi0gICAgICAgIGhpc3RbaV0gPSBjLT5oaXN0b3J5W2ldW2MtPmNoYW5uZWxzIC0gMV07CisgICAgbWVtY3B5KGhpc3QsICZjLT5oaXN0b3J5W2MtPmNoYW5uZWxzIC0gMV1bMF0sIDUxMiAqIHNpemVvZihpbnQzMl90KSk7CiAKICAgICBmb3IgKGxmZXMgPSAwOyBsZmVzIDwgRENBX0xGRV9TQU1QTEVTOyBsZmVzKyspIHsKICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBjb252b2x1dGlvbiAqLwogICAgICAgICBhY2N1bSA9IDA7CiAKICAgICAgICAgZm9yIChpID0gaGlzdF9zdGFydCwgaiA9IDA7IGkgPCA1MTI7IGkrKywgaisrKQotICAgICAgICAgICAgYWNjdW0gKz0gbXVsMzIoaGlzdFtpXSwgbGZlX2Zpcl82NGlbal0pOworICAgICAgICAgICAgYWNjdW0gKz0gbXVsMzIoaGlzdFtpXSwgYy0+bGZlX2Zpcl82NGlbal0pOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGlzdF9zdGFydDsgaSsrLCBqKyspCi0gICAgICAgICAgICBhY2N1bSArPSBtdWwzMihoaXN0W2ldLCBsZmVfZmlyXzY0aVtqXSk7CisgICAgICAgICAgICBhY2N1bSArPSBtdWwzMihoaXN0W2ldLCBjLT5sZmVfZmlyXzY0aVtqXSk7CiAKICAgICAgICAgYy0+ZG93bnNhbXBsZWRfbGZlW2xmZXNdID0gYWNjdW07CiAKQEAgLTMzMSwxMzEgKzM5Miw3MiBAQAogICAgIH0KIH0KIAotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludDMyX3QgcmU7Ci0gICAgaW50MzJfdCBpbTsKLX0gY3BseDMyOwotCi1zdGF0aWMgdm9pZCBmZnQoY29uc3QgaW50MzJfdCBpblsyICogMjU2XSwgY3BseDMyIG91dFsyNTZdKQorc3RhdGljIGludDMyX3QgZ2V0X2NiKERDQUVuY0NvbnRleHQgKmMsIGludDMyX3QgaW4pCiB7Ci0gICAgY3BseDMyIGJ1ZlsyNTZdLCByaW5bMjU2XSwgcm91dFsyNTZdOwotICAgIGludCBpLCBqLCBrLCBsOworICAgIGludCBpLCByZXMgPSAwOworICAgIGluID0gRkZBQlMoaW4pOwogCi0gICAgLyogZG8gdHdvIHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgLyogQXBwbHkgdGhlIEhhbm4gd2luZG93ICovCi0gICAgICAgIHJpbltpXS5yZSA9IG11bDMyKGluWzIgKiBpXSwgMHgzZmZmZmZmZiAtIChjb3NfdCg4ICogaSArIDIpID4+IDEpKTsKLSAgICAgICAgcmluW2ldLmltID0gbXVsMzIoaW5bMiAqIGkgKyAxXSwgMHgzZmZmZmZmZiAtIChjb3NfdCg4ICogaSArIDYpID4+IDEpKTsKLSAgICB9Ci0gICAgLyogcHJlLXJvdGF0aW9uICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAgIGJ1ZltpXS5yZSA9IG11bDMyKGNvc190KDQgKiBpICsgMiksIHJpbltpXS5yZSkKLSAgICAgICAgICAgICAgICAgIC0gbXVsMzIoc2luX3QoNCAqIGkgKyAyKSwgcmluW2ldLmltKTsKLSAgICAgICAgYnVmW2ldLmltID0gbXVsMzIoY29zX3QoNCAqIGkgKyAyKSwgcmluW2ldLmltKQotICAgICAgICAgICAgICAgICAgKyBtdWwzMihzaW5fdCg0ICogaSArIDIpLCByaW5baV0ucmUpOwotICAgIH0KLQotICAgIGZvciAoaiA9IDI1NiwgbCA9IDE7IGogIT0gMTsgaiA+Pj0gMSwgbCA8PD0gMSkgewotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjU2OyBrICs9IGopIHsKLSAgICAgICAgICAgIGZvciAoaSA9IGs7IGkgPCBrICsgaiAvIDI7IGkrKykgewotICAgICAgICAgICAgICAgIGNwbHgzMiBzdW0sIGRpZmY7Ci0gICAgICAgICAgICAgICAgaW50IHQgPSA4ICogbCAqIGk7Ci0KLSAgICAgICAgICAgICAgICBzdW0ucmUgPSBidWZbaV0ucmUgKyBidWZbaSArIGogLyAyXS5yZTsKLSAgICAgICAgICAgICAgICBzdW0uaW0gPSBidWZbaV0uaW0gKyBidWZbaSArIGogLyAyXS5pbTsKLQotICAgICAgICAgICAgICAgIGRpZmYucmUgPSBidWZbaV0ucmUgLSBidWZbaSArIGogLyAyXS5yZTsKLSAgICAgICAgICAgICAgICBkaWZmLmltID0gYnVmW2ldLmltIC0gYnVmW2kgKyBqIC8gMl0uaW07Ci0KLSAgICAgICAgICAgICAgICBidWZbaV0ucmUgPSBoYWxmMzIoc3VtLnJlKTsKLSAgICAgICAgICAgICAgICBidWZbaV0uaW0gPSBoYWxmMzIoc3VtLmltKTsKLQotICAgICAgICAgICAgICAgIGJ1ZltpICsgaiAvIDJdLnJlID0gbXVsMzIoZGlmZi5yZSwgY29zX3QodCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBtdWwzMihkaWZmLmltLCBzaW5fdCh0KSk7Ci0gICAgICAgICAgICAgICAgYnVmW2kgKyBqIC8gMl0uaW0gPSBtdWwzMihkaWZmLmltLCBjb3NfdCh0KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG11bDMyKGRpZmYucmUsIHNpbl90KHQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBwb3N0LXJvdGF0aW9uICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAgIGludCBiID0gZmZfcmV2ZXJzZVtpXTsKLSAgICAgICAgcm91dFtpXS5yZSA9IG11bDMyKGJ1ZltiXS5yZSwgY29zX3QoNCAqIGkpKQotICAgICAgICAgICAgICAgICAgIC0gbXVsMzIoYnVmW2JdLmltLCBzaW5fdCg0ICogaSkpOwotICAgICAgICByb3V0W2ldLmltID0gbXVsMzIoYnVmW2JdLmltLCBjb3NfdCg0ICogaSkpCi0gICAgICAgICAgICAgICAgICAgKyBtdWwzMihidWZbYl0ucmUsIHNpbl90KDQgKiBpKSk7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICAvKiBzZXBhcmF0ZSB0aGUgcmVzdWx0cyBvZiB0aGUgdHdvIHRyYW5zZm9ybXMgKi8KLSAgICAgICAgY3BseDMyIG8xLCBvMjsKLQotICAgICAgICBvMS5yZSA9ICByb3V0W2ldLnJlIC0gcm91dFsyNTUgLSBpXS5yZTsKLSAgICAgICAgbzEuaW0gPSAgcm91dFtpXS5pbSArIHJvdXRbMjU1IC0gaV0uaW07Ci0KLSAgICAgICAgbzIucmUgPSAgcm91dFtpXS5pbSAtIHJvdXRbMjU1IC0gaV0uaW07Ci0gICAgICAgIG8yLmltID0gLXJvdXRbaV0ucmUgLSByb3V0WzI1NSAtIGldLnJlOwotCi0gICAgICAgIC8qIGNvbWJpbmUgdGhlbSBpbnRvIG9uZSBsb25nIHRyYW5zZm9ybSAqLwotICAgICAgICBvdXRbaV0ucmUgPSBtdWwzMiggbzEucmUgKyBvMi5yZSwgY29zX3QoMiAqIGkgKyAxKSkKLSAgICAgICAgICAgICAgICAgICsgbXVsMzIoIG8xLmltIC0gbzIuaW0sIHNpbl90KDIgKiBpICsgMSkpOwotICAgICAgICBvdXRbaV0uaW0gPSBtdWwzMiggbzEuaW0gKyBvMi5pbSwgY29zX3QoMiAqIGkgKyAxKSkKLSAgICAgICAgICAgICAgICAgICsgbXVsMzIoLW8xLnJlICsgbzIucmUsIHNpbl90KDIgKiBpICsgMSkpOwotICAgIH0KLX0KLQotc3RhdGljIGludDMyX3QgZ2V0X2NiKGludDMyX3QgaW4pCi17Ci0gICAgaW50IGksIHJlczsKLQotICAgIHJlcyA9IDA7Ci0gICAgaWYgKGluIDwgMCkKLSAgICAgICAgaW4gPSAtaW47CiAgICAgZm9yIChpID0gMTAyNDsgaSA+IDA7IGkgPj49IDEpIHsKLSAgICAgICAgaWYgKGNiX3RvX2xldmVsW2kgKyByZXNdID49IGluKQorICAgICAgICBpZiAoYy0+Y2JfdG9fbGV2ZWxbaSArIHJlc10gPj0gaW4pCiAgICAgICAgICAgICByZXMgKz0gaTsKICAgICB9CiAgICAgcmV0dXJuIC1yZXM7CiB9CiAKLXN0YXRpYyBpbnQzMl90IGFkZF9jYihpbnQzMl90IGEsIGludDMyX3QgYikKK3N0YXRpYyBpbnQzMl90IGFkZF9jYihEQ0FFbmNDb250ZXh0ICpjLCBpbnQzMl90IGEsIGludDMyX3QgYikKIHsKICAgICBpZiAoYSA8IGIpCiAgICAgICAgIEZGU1dBUChpbnQzMl90LCBhLCBiKTsKIAogICAgIGlmIChhIC0gYiA+PSAyNTYpCiAgICAgICAgIHJldHVybiBhOwotICAgIHJldHVybiBhICsgY2JfdG9fYWRkW2EgLSBiXTsKKyAgICByZXR1cm4gYSArIGMtPmNiX3RvX2FkZFthIC0gYl07CiB9CiAKLXN0YXRpYyB2b2lkIGFkanVzdF9qbmQoaW50IHNhbXBsZXJhdGVfaW5kZXgsCitzdGF0aWMgdm9pZCBjYWxjX3Bvd2VyKERDQUVuY0NvbnRleHQgKmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaW5bMiAqIDI1Nl0sIGludDMyX3QgcG93ZXJbMjU2XSkKK3sKKyAgICBpbnQgaTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDMyX3QsIGRhdGEsICBbNTEyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQzMl90LCBjb2VmZiwgWzI1Nl0pOworCisgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKQorICAgICAgICBkYXRhW2ldID0gbm9ybV9fKG11bDMyKGluW2ldLCAweDNmZmZmZmZmIC0gKENPU19UKDQgKiBpICsgMikgPj4gMSkpLCA0KTsKKworICAgIGMtPm1kY3QubWRjdF9jYWxjKCZjLT5tZGN0LCBjb2VmZiwgZGF0YSk7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludDMyX3QgY2IgPSBnZXRfY2IoYywgY29lZmZbaV0pOworICAgICAgICBwb3dlcltpXSA9IGFkZF9jYihjLCBjYiwgY2IpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYWRqdXN0X2puZChEQ0FFbmNDb250ZXh0ICpjLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGluWzUxMl0sIGludDMyX3Qgb3V0X2NiWzI1Nl0pCiB7CiAgICAgaW50MzJfdCBwb3dlclsyNTZdOwotICAgIGNwbHgzMiBvdXRbMjU2XTsKICAgICBpbnQzMl90IG91dF9jYl91bm5vcm1bMjU2XTsKICAgICBpbnQzMl90IGRlbm9tOwogICAgIGNvbnN0IGludDMyX3QgY2FfY2IgPSAtMTExNDsKICAgICBjb25zdCBpbnQzMl90IGNzX2NiID0gOTI4OworICAgIGNvbnN0IGludCBzYW1wbGVyYXRlX2luZGV4ID0gYy0+c2FtcGxlcmF0ZV9pbmRleDsKICAgICBpbnQgaSwgajsKIAotICAgIGZmdChpbiwgb3V0KTsKKyAgICBjYWxjX3Bvd2VyKGMsIGluLCBwb3dlcik7CiAKLSAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKLSAgICAgICAgcG93ZXJbal0gPSBhZGRfY2IoZ2V0X2NiKG91dFtqXS5yZSksIGdldF9jYihvdXRbal0uaW0pKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspCiAgICAgICAgIG91dF9jYl91bm5vcm1bal0gPSAtMjA0NzsgLyogYW5kIGNhbiBvbmx5IGdyb3cgKi8KLSAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgQVVCQU5EUzsgaSsrKSB7CiAgICAgICAgIGRlbm9tID0gY2FfY2I7IC8qIGFuZCBjYW4gb25seSBncm93ICovCiAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykKLSAgICAgICAgICAgIGRlbm9tID0gYWRkX2NiKGRlbm9tLCBwb3dlcltqXSArIGF1ZltzYW1wbGVyYXRlX2luZGV4XVtpXVtqXSk7CisgICAgICAgICAgICBkZW5vbSA9IGFkZF9jYihjLCBkZW5vbSwgcG93ZXJbal0gKyBjLT5hdWZbc2FtcGxlcmF0ZV9pbmRleF1baV1bal0pOwogICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspCi0gICAgICAgICAgICBvdXRfY2JfdW5ub3JtW2pdID0gYWRkX2NiKG91dF9jYl91bm5vcm1bal0sCi0gICAgICAgICAgICAgICAgICAgIC1kZW5vbSArIGF1ZltzYW1wbGVyYXRlX2luZGV4XVtpXVtqXSk7CisgICAgICAgICAgICBvdXRfY2JfdW5ub3JtW2pdID0gYWRkX2NiKGMsIG91dF9jYl91bm5vcm1bal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1kZW5vbSArIGMtPmF1ZltzYW1wbGVyYXRlX2luZGV4XVtpXVtqXSk7CiAgICAgfQogCiAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQotICAgICAgICBvdXRfY2Jbal0gPSBhZGRfY2Iob3V0X2NiW2pdLCAtb3V0X2NiX3Vubm9ybVtqXSAtIGNhX2NiIC0gY3NfY2IpOworICAgICAgICBvdXRfY2Jbal0gPSBhZGRfY2IoYywgb3V0X2NiW2pdLCAtb3V0X2NiX3Vubm9ybVtqXSAtIGNhX2NiIC0gY3NfY2IpOwogfQogCiB0eXBlZGVmIHZvaWQgKCp3YWxrX2JhbmRfdCkoRENBRW5jQ29udGV4dCAqYywgaW50IGJhbmQxLCBpbnQgYmFuZDIsIGludCBmLApAQCAtNTE2LDEwICs1MTgsMTAgQEAKICAgICAgICAgICAgIGNvbnN0IGludCBjaGkgPSBjLT5jaGFubmVsX29yZGVyX3RhYltjaF07CiAKICAgICAgICAgICAgIGZvciAoaSA9IDAsIGsgPSAxMjggKyAyNTYgKiBzc2Y7IGsgPCA1MTI7IGkrKywgaysrKQotICAgICAgICAgICAgICAgIGRhdGFbaV0gPSBjLT5oaXN0b3J5W2tdW2NoXTsKKyAgICAgICAgICAgICAgICBkYXRhW2ldID0gYy0+aGlzdG9yeVtjaF1ba107CiAgICAgICAgICAgICBmb3IgKGsgLT0gNTEyOyBpIDwgNTEyOyBpKyssIGsrKykKICAgICAgICAgICAgICAgICBkYXRhW2ldID0gaW5wdXRbayAqIGMtPmNoYW5uZWxzICsgY2hpXTsKLSAgICAgICAgICAgIGFkanVzdF9qbmQoYy0+c2FtcGxlcmF0ZV9pbmRleCwgZGF0YSwgYy0+bWFza2luZ19jdXJ2ZV9jYltzc2ZdKTsKKyAgICAgICAgICAgIGFkanVzdF9qbmQoYywgZGF0YSwgYy0+bWFza2luZ19jdXJ2ZV9jYltzc2ZdKTsKICAgICAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgICBpbnQzMl90IG0gPSAyMDQ4OwpAQCAtNTM3LDcyICs1MzksMzAyIEBACiAgICAgfQogfQogCitzdGF0aWMgaW5saW5lIGludDMyX3QgZmluZF9wZWFrKERDQUVuY0NvbnRleHQgKmMsIGNvbnN0IGludDMyX3QgKmluLCBpbnQgbGVuKQoreworICAgIGludCBzYW1wbGU7CisgICAgaW50MzJfdCBtID0gMDsKKyAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGxlbjsgc2FtcGxlKyspIHsKKyAgICAgICAgaW50MzJfdCBzID0gYWJzKGluW3NhbXBsZV0pOworICAgICAgICBpZiAobSA8IHMpCisgICAgICAgICAgICBtID0gczsKKyAgICB9CisgICAgcmV0dXJuIGdldF9jYihjLCBtKTsKK30KKwogc3RhdGljIHZvaWQgZmluZF9wZWFrcyhEQ0FFbmNDb250ZXh0ICpjKQogewogICAgIGludCBiYW5kLCBjaDsKIAotICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKQotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgaW50IHNhbXBsZTsKLSAgICAgICAgICAgIGludDMyX3QgbSA9IDA7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IDMyOyBiYW5kKyspCisgICAgICAgICAgICBjLT5wZWFrX2NiW2NoXVtiYW5kXSA9IGZpbmRfcGVhayhjLCBjLT5zdWJiYW5kW2NoXVtiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQkJBTkRfU0FNUExFUyk7CisgICAgfQogCi0gICAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IFNVQkJBTkRfU0FNUExFUzsgc2FtcGxlKyspIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHMgPSBhYnMoYy0+c3ViYmFuZFtzYW1wbGVdW2JhbmRdW2NoXSk7Ci0gICAgICAgICAgICAgICAgaWYgKG0gPCBzKQotICAgICAgICAgICAgICAgICAgICBtID0gczsKKyAgICBpZiAoYy0+bGZlX2NoYW5uZWwpCisgICAgICAgIGMtPmxmZV9wZWFrX2NiID0gZmluZF9wZWFrKGMsIGMtPmRvd25zYW1wbGVkX2xmZSwgRENBX0xGRV9TQU1QTEVTKTsKK30KKworc3RhdGljIHZvaWQgYWRwY21fYW5hbHlzaXMoRENBRW5jQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY2gsIGJhbmQ7CisgICAgaW50IHByZWRfdnFfaWQ7CisgICAgaW50MzJfdCAqc2FtcGxlczsKKyAgICBpbnQzMl90IGVzdGltYXRlZF9kaWZmW1NVQkJBTkRfU0FNUExFU107CisKKyAgICBjLT5jb25zdW1lZF9hZHBjbV9iaXRzID0gMDsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykgeworICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgMzI7IGJhbmQrKykgeworICAgICAgICAgICAgc2FtcGxlcyA9IGMtPnN1YmJhbmRbY2hdW2JhbmRdIC0gRENBX0FEUENNX0NPRUZGUzsKKyAgICAgICAgICAgIHByZWRfdnFfaWQgPSBmZl9kY2FhZHBjbV9zdWJiYW5kX2FuYWx5c2lzKCZjLT5hZHBjbV9jdHgsIHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVUJCQU5EX1NBTVBMRVMsIGVzdGltYXRlZF9kaWZmKTsKKyAgICAgICAgICAgIGlmIChwcmVkX3ZxX2lkID49IDApIHsKKyAgICAgICAgICAgICAgICBjLT5wcmVkaWN0aW9uX21vZGVbY2hdW2JhbmRdID0gcHJlZF92cV9pZDsKKyAgICAgICAgICAgICAgICBjLT5jb25zdW1lZF9hZHBjbV9iaXRzICs9IDEyOyAvLzEyIGJpdHMgdG8gdHJhbnNtaXQgcHJlZGljdGlvbiB2cSBpbmRleAorICAgICAgICAgICAgICAgIGMtPmRpZmZfcGVha19jYltjaF1bYmFuZF0gPSBmaW5kX3BlYWsoYywgZXN0aW1hdGVkX2RpZmYsIDE2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYy0+cHJlZGljdGlvbl9tb2RlW2NoXVtiYW5kXSA9IC0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYy0+cGVha19jYltiYW5kXVtjaF0gPSBnZXRfY2IobSk7CiAgICAgICAgIH0KLQotICAgIGlmIChjLT5sZmVfY2hhbm5lbCkgewotICAgICAgICBpbnQgc2FtcGxlOwotICAgICAgICBpbnQzMl90IG0gPSAwOwotCi0gICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgRENBX0xGRV9TQU1QTEVTOyBzYW1wbGUrKykKLSAgICAgICAgICAgIGlmIChtIDwgYWJzKGMtPmRvd25zYW1wbGVkX2xmZVtzYW1wbGVdKSkKLSAgICAgICAgICAgICAgICBtID0gYWJzKGMtPmRvd25zYW1wbGVkX2xmZVtzYW1wbGVdKTsKLSAgICAgICAgYy0+bGZlX3BlYWtfY2IgPSBnZXRfY2IobSk7CiAgICAgfQogfQogCiBzdGF0aWMgY29uc3QgaW50IHNucl9mdWRnZSA9IDEyODsKICNkZWZpbmUgVVNFRF8xQUJJVFMgMQotI2RlZmluZSBVU0VEX05BQklUUyAyCiAjZGVmaW5lIFVTRURfMjZBQklUUyA0CiAKLXN0YXRpYyBpbnQgaW5pdF9xdWFudGl6YXRpb25fbm9pc2UoRENBRW5jQ29udGV4dCAqYywgaW50IG5vaXNlKQorc3RhdGljIGlubGluZSBpbnQzMl90IGdldF9zdGVwX3NpemUoRENBRW5jQ29udGV4dCAqYywgaW50IGNoLCBpbnQgYmFuZCkKIHsKLSAgICBpbnQgY2gsIGJhbmQsIHJldCA9IDA7CisgICAgaW50MzJfdCBzdGVwX3NpemU7CiAKLSAgICBjLT5jb25zdW1lZF9iaXRzID0gMTMyICsgNDkzICogYy0+ZnVsbGJhbmRfY2hhbm5lbHM7CisgICAgaWYgKGMtPmJpdHJhdGVfaW5kZXggPT0gMykKKyAgICAgICAgc3RlcF9zaXplID0gZmZfZGNhX2xvc3NsZXNzX3F1YW50W2MtPmFiaXRzW2NoXVtiYW5kXV07CisgICAgZWxzZQorICAgICAgICBzdGVwX3NpemUgPSBmZl9kY2FfbG9zc3lfcXVhbnRbYy0+YWJpdHNbY2hdW2JhbmRdXTsKKworICAgIHJldHVybiBzdGVwX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgY2FsY19vbmVfc2NhbGUoRENBRW5jQ29udGV4dCAqYywgaW50MzJfdCBwZWFrX2NiLCBpbnQgYWJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZnRmbG9hdCAqcXVhbnQpCit7CisgICAgaW50MzJfdCBwZWFrOworICAgIGludCBvdXJfbnNjYWxlLCB0cnlfcmVtb3ZlOworICAgIHNvZnRmbG9hdCBvdXJfcXVhbnQ7CisKKyAgICBhdl9hc3NlcnQwKHBlYWtfY2IgPD0gMCk7CisgICAgYXZfYXNzZXJ0MChwZWFrX2NiID49IC0yMDQ3KTsKKworICAgIG91cl9uc2NhbGUgPSAxMjc7CisgICAgcGVhayA9IGMtPmNiX3RvX2xldmVsWy1wZWFrX2NiXTsKKworICAgIGZvciAodHJ5X3JlbW92ZSA9IDY0OyB0cnlfcmVtb3ZlID4gMDsgdHJ5X3JlbW92ZSA+Pj0gMSkgeworICAgICAgICBpZiAoc2NhbGVmYWN0b3JfaW52W291cl9uc2NhbGUgLSB0cnlfcmVtb3ZlXS5lICsgc3RlcHNpemVfaW52W2FiaXRzXS5lIDw9IDE3KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG91cl9xdWFudC5tID0gbXVsMzIoc2NhbGVmYWN0b3JfaW52W291cl9uc2NhbGUgLSB0cnlfcmVtb3ZlXS5tLCBzdGVwc2l6ZV9pbnZbYWJpdHNdLm0pOworICAgICAgICBvdXJfcXVhbnQuZSA9IHNjYWxlZmFjdG9yX2ludltvdXJfbnNjYWxlIC0gdHJ5X3JlbW92ZV0uZSArIHN0ZXBzaXplX2ludlthYml0c10uZSAtIDE3OworICAgICAgICBpZiAoKGZmX2RjYV9xdWFudF9sZXZlbHNbYWJpdHNdIC0gMSkgLyAyIDwgcXVhbnRpemVfdmFsdWUocGVhaywgb3VyX3F1YW50KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBvdXJfbnNjYWxlIC09IHRyeV9yZW1vdmU7CisgICAgfQorCisgICAgaWYgKG91cl9uc2NhbGUgPj0gMTI1KQorICAgICAgICBvdXJfbnNjYWxlID0gMTI0OworCisgICAgcXVhbnQtPm0gPSBtdWwzMihzY2FsZWZhY3Rvcl9pbnZbb3VyX25zY2FsZV0ubSwgc3RlcHNpemVfaW52W2FiaXRzXS5tKTsKKyAgICBxdWFudC0+ZSA9IHNjYWxlZmFjdG9yX2ludltvdXJfbnNjYWxlXS5lICsgc3RlcHNpemVfaW52W2FiaXRzXS5lIC0gMTc7CisgICAgYXZfYXNzZXJ0MCgoZmZfZGNhX3F1YW50X2xldmVsc1thYml0c10gLSAxKSAvIDIgPj0gcXVhbnRpemVfdmFsdWUocGVhaywgKnF1YW50KSk7CisKKyAgICByZXR1cm4gb3VyX25zY2FsZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHF1YW50aXplX2FkcGNtX3N1YmJhbmQoRENBRW5jQ29udGV4dCAqYywgaW50IGNoLCBpbnQgYmFuZCkKK3sKKyAgICBpbnQzMl90IHN0ZXBfc2l6ZTsKKyAgICBpbnQzMl90IGRpZmZfcGVha19jYiA9IGMtPmRpZmZfcGVha19jYltjaF1bYmFuZF07CisgICAgYy0+c2NhbGVfZmFjdG9yW2NoXVtiYW5kXSA9IGNhbGNfb25lX3NjYWxlKGMsIGRpZmZfcGVha19jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YWJpdHNbY2hdW2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYy0+cXVhbnRbY2hdW2JhbmRdKTsKKworICAgIHN0ZXBfc2l6ZSA9IGdldF9zdGVwX3NpemUoYywgY2gsIGJhbmQpOworICAgIGZmX2RjYWFkcGNtX2RvX3JlYWwoYy0+cHJlZGljdGlvbl9tb2RlW2NoXVtiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGMtPnF1YW50W2NoXVtiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX2RjYV9zY2FsZV9mYWN0b3JfcXVhbnQ3W2MtPnNjYWxlX2ZhY3RvcltjaF1bYmFuZF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RlcF9zaXplLCBjLT5hZHBjbV9oaXN0b3J5W2NoXVtiYW5kXSwgYy0+c3ViYmFuZFtjaF1bYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjLT5hZHBjbV9oaXN0b3J5W2NoXVtiYW5kXSArIDQsIGMtPnF1YW50aXplZFtjaF1bYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICBTVUJCQU5EX1NBTVBMRVMsIGMtPmNiX3RvX2xldmVsWy1kaWZmX3BlYWtfY2JdKTsKK30KKworc3RhdGljIHZvaWQgcXVhbnRpemVfYWRwY20oRENBRW5jQ29udGV4dCAqYykKK3sKKyAgICBpbnQgYmFuZCwgY2g7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykKKyAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IDMyOyBiYW5kKyspCisgICAgICAgICAgICBpZiAoYy0+cHJlZGljdGlvbl9tb2RlW2NoXVtiYW5kXSA+PSAwKQorICAgICAgICAgICAgICAgIHF1YW50aXplX2FkcGNtX3N1YmJhbmQoYywgY2gsIGJhbmQpOworfQorCitzdGF0aWMgdm9pZCBxdWFudGl6ZV9wY20oRENBRW5jQ29udGV4dCAqYykKK3sKKyAgICBpbnQgc2FtcGxlLCBiYW5kLCBjaDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKSB7CisgICAgICAgICAgICBpZiAoYy0+cHJlZGljdGlvbl9tb2RlW2NoXVtiYW5kXSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgU1VCQkFORF9TQU1QTEVTOyBzYW1wbGUrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbCA9IHF1YW50aXplX3ZhbHVlKGMtPnN1YmJhbmRbY2hdW2JhbmRdW3NhbXBsZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cXVhbnRbY2hdW2JhbmRdKTsKKyAgICAgICAgICAgICAgICAgICAgYy0+cXVhbnRpemVkW2NoXVtiYW5kXVtzYW1wbGVdID0gdmFsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgYWNjdW11bGF0ZV9odWZmX2JpdF9jb25zdW1wdGlvbihpbnQgYWJpdHMsIGludDMyX3QgKnF1YW50aXplZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlc3VsdCkKK3sKKyAgICB1aW50OF90IHNlbCwgaWQgPSBhYml0cyAtIDE7CisgICAgZm9yIChzZWwgPSAwOyBzZWwgPCBmZl9kY2FfcXVhbnRfaW5kZXhfZ3JvdXBfc2l6ZVtpZF07IHNlbCsrKQorICAgICAgICByZXN1bHRbc2VsXSArPSBmZl9kY2FfdmxjX2NhbGNfcXVhbnRfYml0cyhxdWFudGl6ZWQsIFNVQkJBTkRfU0FNUExFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsLCBpZCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBzZXRfYmVzdF9jb2RlKHVpbnQzMl90IHZsY19iaXRzW0RDQV9DT0RFX0JPT0tTXVs3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNsY19iaXRzW0RDQV9DT0RFX0JPT0tTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVzW0RDQV9DT0RFX0JPT0tTXSkKK3sKKyAgICB1aW50OF90IGksIHNlbDsKKyAgICB1aW50MzJfdCBiZXN0X3NlbF9iaXRzW0RDQV9DT0RFX0JPT0tTXTsKKyAgICBpbnQzMl90IGJlc3Rfc2VsX2lkW0RDQV9DT0RFX0JPT0tTXTsKKyAgICB1aW50MzJfdCB0LCBiaXRzID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQ0FfQ09ERV9CT09LUzsgaSsrKSB7CisKKyAgICAgICAgYXZfYXNzZXJ0MCghKCghIXZsY19iaXRzW2ldWzBdKSBeICghIWNsY19iaXRzW2ldKSkpOworICAgICAgICBpZiAodmxjX2JpdHNbaV1bMF0gPT0gMCkgeworICAgICAgICAgICAgLyogZG8gbm90IHRyYW5zbWl0IGFkanVzdG1lbnQgaW5kZXggZm9yIGVtcHR5IGNvZGVib29rcyAqLworICAgICAgICAgICAgcmVzW2ldID0gZmZfZGNhX3F1YW50X2luZGV4X2dyb3VwX3NpemVbaV07CisgICAgICAgICAgICAvKiBhbmQgc2tpcCBpdCAqLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBiZXN0X3NlbF9iaXRzW2ldID0gdmxjX2JpdHNbaV1bMF07CisgICAgICAgIGJlc3Rfc2VsX2lkW2ldID0gMDsKKyAgICAgICAgZm9yIChzZWwgPSAwOyBzZWwgPCBmZl9kY2FfcXVhbnRfaW5kZXhfZ3JvdXBfc2l6ZVtpXTsgc2VsKyspIHsKKyAgICAgICAgICAgIGlmIChiZXN0X3NlbF9iaXRzW2ldID4gdmxjX2JpdHNbaV1bc2VsXSAmJiB2bGNfYml0c1tpXVtzZWxdKSB7CisgICAgICAgICAgICAgICAgYmVzdF9zZWxfYml0c1tpXSA9IHZsY19iaXRzW2ldW3NlbF07CisgICAgICAgICAgICAgICAgYmVzdF9zZWxfaWRbaV0gPSBzZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiAyIGJpdHMgdG8gdHJhbnNtaXQgc2NhbGUgZmFjdG9yIGFkanVzdG1lbnQgaW5kZXggKi8KKyAgICAgICAgdCA9IGJlc3Rfc2VsX2JpdHNbaV0gKyAyOworICAgICAgICBpZiAodCA8IGNsY19iaXRzW2ldKSB7CisgICAgICAgICAgICByZXNbaV0gPSBiZXN0X3NlbF9pZFtpXTsKKyAgICAgICAgICAgIGJpdHMgKz0gdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc1tpXSA9IGZmX2RjYV9xdWFudF9pbmRleF9ncm91cF9zaXplW2ldOworICAgICAgICAgICAgYml0cyArPSBjbGNfYml0c1tpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYml0czsKK30KKworc3RhdGljIHVpbnQzMl90IHNldF9iZXN0X2FiaXRzX2NvZGUoaW50IGFiaXRzW0RDQUVOQ19TVUJCQU5EU10sIGludCBiYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnJlcykKK3sKKyAgICB1aW50OF90IGk7CisgICAgdWludDMyX3QgdDsKKyAgICBpbnQzMl90IGJlc3Rfc2VsID0gNjsKKyAgICBpbnQzMl90IGJlc3RfYml0cyA9IGJhbmRzICogNTsKKworICAgIC8qIENoZWNrIGRvIHdlIGhhdmUgc3ViYmFuZCB3aGljaCBjYW5ub3QgYmUgZW5jb2RlZCBieSBIdWZmbWFuIHRhYmxlcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBiYW5kczsgaSsrKSB7CisgICAgICAgIGlmIChhYml0c1tpXSA+IDEyIHx8IGFiaXRzW2ldID09IDApIHsKKyAgICAgICAgICAgICpyZXMgPSBiZXN0X3NlbDsKKyAgICAgICAgICAgIHJldHVybiBiZXN0X2JpdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRENBX0JJVEFMTE9DXzEyX0NPVU5UOyBpKyspIHsKKyAgICAgICAgdCA9IGZmX2RjYV92bGNfY2FsY19hbGxvY19iaXRzKGFiaXRzLCBiYW5kcywgaSk7CisgICAgICAgIGlmICh0IDwgYmVzdF9iaXRzKSB7CisgICAgICAgICAgICBiZXN0X2JpdHMgPSB0OworICAgICAgICAgICAgYmVzdF9zZWwgPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgKnJlcyA9IGJlc3Rfc2VsOworICAgIHJldHVybiBiZXN0X2JpdHM7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9xdWFudGl6YXRpb25fbm9pc2UoRENBRW5jQ29udGV4dCAqYywgaW50IG5vaXNlLCBpbnQgZm9yYmlkX3plcm8pCit7CisgICAgaW50IGNoLCBiYW5kLCByZXQgPSBVU0VEXzI2QUJJVFMgfCBVU0VEXzFBQklUUzsKKyAgICB1aW50MzJfdCBodWZmX2JpdF9jb3VudF9hY2N1bVtNQVhfQ0hBTk5FTFNdW0RDQV9DT0RFX0JPT0tTXVs3XTsKKyAgICB1aW50MzJfdCBjbGNfYml0X2NvdW50X2FjY3VtW01BWF9DSEFOTkVMU11bRENBX0NPREVfQk9PS1NdOworICAgIHVpbnQzMl90IGJpdHNfY291bnRlciA9IDA7CisKKyAgICBjLT5jb25zdW1lZF9iaXRzID0gMTMyICsgMzMzICogYy0+ZnVsbGJhbmRfY2hhbm5lbHM7CisgICAgYy0+Y29uc3VtZWRfYml0cyArPSBjLT5jb25zdW1lZF9hZHBjbV9iaXRzOwogICAgIGlmIChjLT5sZmVfY2hhbm5lbCkKICAgICAgICAgYy0+Y29uc3VtZWRfYml0cyArPSA3MjsKIAogICAgIC8qIGF0dGVtcHQgdG8gZ3Vlc3MgdGhlIGJpdCBkaXN0cmlidXRpb24gYmFzZWQgb24gdGhlIHByZXZvaXVzIGZyYW1lICovCiAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IDMyOyBiYW5kKyspIHsKLSAgICAgICAgICAgIGludCBzbnJfY2IgPSBjLT5wZWFrX2NiW2JhbmRdW2NoXSAtIGMtPmJhbmRfbWFza2luZ19jYltiYW5kXSAtIG5vaXNlOworICAgICAgICAgICAgaW50IHNucl9jYiA9IGMtPnBlYWtfY2JbY2hdW2JhbmRdIC0gYy0+YmFuZF9tYXNraW5nX2NiW2JhbmRdIC0gbm9pc2U7CiAKICAgICAgICAgICAgIGlmIChzbnJfY2IgPj0gMTMxMikgewotICAgICAgICAgICAgICAgIGMtPmFiaXRzW2JhbmRdW2NoXSA9IDI2OwotICAgICAgICAgICAgICAgIHJldCB8PSBVU0VEXzI2QUJJVFM7CisgICAgICAgICAgICAgICAgYy0+YWJpdHNbY2hdW2JhbmRdID0gMjY7CisgICAgICAgICAgICAgICAgcmV0ICY9IH5VU0VEXzFBQklUUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc25yX2NiID49IDIyMikgewotICAgICAgICAgICAgICAgIGMtPmFiaXRzW2JhbmRdW2NoXSA9IDggKyBtdWwzMihzbnJfY2IgLSAyMjIsIDY5MDAwMDAwKTsKLSAgICAgICAgICAgICAgICByZXQgfD0gVVNFRF9OQUJJVFM7CisgICAgICAgICAgICAgICAgYy0+YWJpdHNbY2hdW2JhbmRdID0gOCArIG11bDMyKHNucl9jYiAtIDIyMiwgNjkwMDAwMDApOworICAgICAgICAgICAgICAgIHJldCAmPSB+KFVTRURfMjZBQklUUyB8IFVTRURfMUFCSVRTKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc25yX2NiID49IDApIHsKLSAgICAgICAgICAgICAgICBjLT5hYml0c1tiYW5kXVtjaF0gPSAyICsgbXVsMzIoc25yX2NiLCAxMDYwMDAwMDApOwotICAgICAgICAgICAgICAgIHJldCB8PSBVU0VEX05BQklUUzsKKyAgICAgICAgICAgICAgICBjLT5hYml0c1tjaF1bYmFuZF0gPSAyICsgbXVsMzIoc25yX2NiLCAxMDYwMDAwMDApOworICAgICAgICAgICAgICAgIHJldCAmPSB+KFVTRURfMjZBQklUUyB8IFVTRURfMUFCSVRTKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9yYmlkX3plcm8gfHwgc25yX2NiID49IC0xNDApIHsKKyAgICAgICAgICAgICAgICBjLT5hYml0c1tjaF1bYmFuZF0gPSAxOworICAgICAgICAgICAgICAgIHJldCAmPSB+VVNFRF8yNkFCSVRTOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjLT5hYml0c1tiYW5kXVtjaF0gPSAxOwotICAgICAgICAgICAgICAgIHJldCB8PSBVU0VEXzFBQklUUzsKKyAgICAgICAgICAgICAgICBjLT5hYml0c1tjaF1bYmFuZF0gPSAwOworICAgICAgICAgICAgICAgIHJldCAmPSB+KFVTRURfMjZBQklUUyB8IFVTRURfMUFCSVRTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjLT5jb25zdW1lZF9iaXRzICs9IHNldF9iZXN0X2FiaXRzX2NvZGUoYy0+YWJpdHNbY2hdLCAzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5iaXRfYWxsb2NhdGlvbl9zZWxbY2hdKTsKKyAgICB9CisKKyAgICAvKiBSZWNhbGMgc2NhbGVfZmFjdG9yIGVhY2ggdGltZSB0byBnZXQgYml0cyBjb25zdW1wdGlvbiBpbiBjYXNlIG9mIEh1ZmZtYW4gY29kaW5nLgorICAgICAgIEl0IGlzIHN1Ym9wdGltYWwgc29sdXRpb24gKi8KKyAgICAvKiBUT0RPOiBNYXkgYmUgY2FjaGUgc2NhbGVkIHZhbHVlcyAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKSB7CisgICAgICAgICAgICBpZiAoYy0+cHJlZGljdGlvbl9tb2RlW2NoXVtiYW5kXSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGMtPnNjYWxlX2ZhY3RvcltjaF1bYmFuZF0gPSBjYWxjX29uZV9zY2FsZShjLCBjLT5wZWFrX2NiW2NoXVtiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YWJpdHNbY2hdW2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYy0+cXVhbnRbY2hdW2JhbmRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBxdWFudGl6ZV9hZHBjbShjKTsKKyAgICBxdWFudGl6ZV9wY20oYyk7CisKKyAgICBtZW1zZXQoaHVmZl9iaXRfY291bnRfYWNjdW0sIDAsIE1BWF9DSEFOTkVMUyAqIERDQV9DT0RFX0JPT0tTICogNyAqIHNpemVvZih1aW50MzJfdCkpOworICAgIG1lbXNldChjbGNfYml0X2NvdW50X2FjY3VtLCAwLCBNQVhfQ0hBTk5FTFMgKiBEQ0FfQ09ERV9CT09LUyAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKSB7CisgICAgICAgICAgICBpZiAoYy0+YWJpdHNbY2hdW2JhbmRdICYmIGMtPmFiaXRzW2NoXVtiYW5kXSA8PSBEQ0FfQ09ERV9CT09LUykgeworICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVfaHVmZl9iaXRfY29uc3VtcHRpb24oYy0+YWJpdHNbY2hdW2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cXVhbnRpemVkW2NoXVtiYW5kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmZfYml0X2NvdW50X2FjY3VtW2NoXVtjLT5hYml0c1tjaF1bYmFuZF0gLSAxXSk7CisgICAgICAgICAgICAgICAgY2xjX2JpdF9jb3VudF9hY2N1bVtjaF1bYy0+YWJpdHNbY2hdW2JhbmRdIC0gMV0gKz0gYml0X2NvbnN1bXB0aW9uW2MtPmFiaXRzW2NoXVtiYW5kXV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJpdHNfY291bnRlciArPSBiaXRfY29uc3VtcHRpb25bYy0+YWJpdHNbY2hdW2JhbmRdXTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKQotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgYy0+Y29uc3VtZWRfYml0cyArPSBiaXRfY29uc3VtcHRpb25bYy0+YWJpdHNbYmFuZF1bY2hdXTsKLSAgICAgICAgfQorICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGJpdHNfY291bnRlciArPSBzZXRfYmVzdF9jb2RlKGh1ZmZfYml0X2NvdW50X2FjY3VtW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xjX2JpdF9jb3VudF9hY2N1bVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnF1YW50X2luZGV4X3NlbFtjaF0pOworICAgIH0KKworICAgIGMtPmNvbnN1bWVkX2JpdHMgKz0gYml0c19jb3VudGVyOwogCiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTYxMiwxNSArODQ0LDE5IEBACiAgICAgLyogRmluZCB0aGUgYm91bmRzIHdoZXJlIHRoZSBiaW5hcnkgc2VhcmNoIHNob3VsZCB3b3JrICovCiAgICAgaW50IGxvdywgaGlnaCwgZG93bjsKICAgICBpbnQgdXNlZF9hYml0cyA9IDA7Ci0KLSAgICBpbml0X3F1YW50aXphdGlvbl9ub2lzZShjLCBjLT53b3JzdF9xdWFudGl6YXRpb25fbm9pc2UpOworICAgIGludCBmb3JiaWRfemVybyA9IDE7CityZXN0YXJ0OgorICAgIGluaXRfcXVhbnRpemF0aW9uX25vaXNlKGMsIGMtPndvcnN0X3F1YW50aXphdGlvbl9ub2lzZSwgZm9yYmlkX3plcm8pOwogICAgIGxvdyA9IGhpZ2ggPSBjLT53b3JzdF9xdWFudGl6YXRpb25fbm9pc2U7CiAgICAgaWYgKGMtPmNvbnN1bWVkX2JpdHMgPiBjLT5mcmFtZV9iaXRzKSB7CiAgICAgICAgIHdoaWxlIChjLT5jb25zdW1lZF9iaXRzID4gYy0+ZnJhbWVfYml0cykgewotICAgICAgICAgICAgYXZfYXNzZXJ0MCh1c2VkX2FiaXRzICE9IFVTRURfMUFCSVRTKTsKKyAgICAgICAgICAgIGlmICh1c2VkX2FiaXRzID09IFVTRURfMUFCSVRTICYmIGZvcmJpZF96ZXJvKSB7CisgICAgICAgICAgICAgICAgZm9yYmlkX3plcm8gPSAwOworICAgICAgICAgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxvdyA9IGhpZ2g7CiAgICAgICAgICAgICBoaWdoICs9IHNucl9mdWRnZTsKLSAgICAgICAgICAgIHVzZWRfYWJpdHMgPSBpbml0X3F1YW50aXphdGlvbl9ub2lzZShjLCBoaWdoKTsKKyAgICAgICAgICAgIHVzZWRfYWJpdHMgPSBpbml0X3F1YW50aXphdGlvbl9ub2lzZShjLCBoaWdoLCBmb3JiaWRfemVybyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICB3aGlsZSAoYy0+Y29uc3VtZWRfYml0cyA8PSBjLT5mcmFtZV9iaXRzKSB7CkBAIC02MjgsMTcgKzg2NCwxNyBAQAogICAgICAgICAgICAgaWYgKHVzZWRfYWJpdHMgPT0gVVNFRF8yNkFCSVRTKQogICAgICAgICAgICAgICAgIGdvdG8gb3V0OyAvKiBUaGUgcmVxdWVzdGVkIGJpdHJhdGUgaXMgdG9vIGhpZ2gsIHBhZCB3aXRoIHplcm9zICovCiAgICAgICAgICAgICBsb3cgLT0gc25yX2Z1ZGdlOwotICAgICAgICAgICAgdXNlZF9hYml0cyA9IGluaXRfcXVhbnRpemF0aW9uX25vaXNlKGMsIGxvdyk7CisgICAgICAgICAgICB1c2VkX2FiaXRzID0gaW5pdF9xdWFudGl6YXRpb25fbm9pc2UoYywgbG93LCBmb3JiaWRfemVybyk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBOb3cgZG8gYSBiaW5hcnkgc2VhcmNoIGJldHdlZW4gbG93IGFuZCBoaWdoIHRvIHNlZSB3aGF0IGZpdHMgKi8KICAgICBmb3IgKGRvd24gPSBzbnJfZnVkZ2UgPj4gMTsgZG93bjsgZG93biA+Pj0gMSkgewotICAgICAgICBpbml0X3F1YW50aXphdGlvbl9ub2lzZShjLCBoaWdoIC0gZG93bik7CisgICAgICAgIGluaXRfcXVhbnRpemF0aW9uX25vaXNlKGMsIGhpZ2ggLSBkb3duLCBmb3JiaWRfemVybyk7CiAgICAgICAgIGlmIChjLT5jb25zdW1lZF9iaXRzIDw9IGMtPmZyYW1lX2JpdHMpCiAgICAgICAgICAgICBoaWdoIC09IGRvd247CiAgICAgfQotICAgIGluaXRfcXVhbnRpemF0aW9uX25vaXNlKGMsIGhpZ2gpOworICAgIGluaXRfcXVhbnRpemF0aW9uX25vaXNlKGMsIGhpZ2gsIGZvcmJpZF96ZXJvKTsKIG91dDoKICAgICBjLT53b3JzdF9xdWFudGl6YXRpb25fbm9pc2UgPSBoaWdoOwogICAgIGlmIChoaWdoID4gYy0+d29yc3Rfbm9pc2VfZXZlcikKQEAgLTY1Myw3MyArODg5LDUwIEBACiAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmNoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgICBjb25zdCBpbnQgY2hpID0gYy0+Y2hhbm5lbF9vcmRlcl90YWJbY2hdOwogCi0gICAgICAgICAgICBjLT5oaXN0b3J5W2tdW2NoXSA9IGlucHV0W2sgKiBjLT5jaGFubmVscyArIGNoaV07CisgICAgICAgICAgICBjLT5oaXN0b3J5W2NoXVtrXSA9IGlucHV0W2sgKiBjLT5jaGFubmVscyArIGNoaV07CiAgICAgICAgIH0KIH0KIAotc3RhdGljIGludDMyX3QgcXVhbnRpemVfdmFsdWUoaW50MzJfdCB2YWx1ZSwgc29mdGZsb2F0IHF1YW50KQorc3RhdGljIHZvaWQgZmlsbF9pbl9hZHBjbV9idWZlcihEQ0FFbmNDb250ZXh0ICpjKQogewotICAgIGludDMyX3Qgb2Zmc2V0ID0gMSA8PCAocXVhbnQuZSAtIDEpOworICAgICBpbnQgY2gsIGJhbmQ7CisgICAgIGludDMyX3Qgc3RlcF9zaXplOworICAgICAvKiBXZSBmaWxsIGluIEFEUENNIHdvcmsgYnVmZmVyIGZvciBzdWJiYW5kcyB3aGljaCBoYXNuJ3QgYmVlbiBBRFBDTSBjb2RlZAorICAgICAgKiBpbiBjdXJyZW50IGZyYW1lIC0gd2UgbmVlZCB0aGlzIGRhdGEgaWYgc3ViYmFuZCBvZiBuZXh0IGZyYW1lIGlzCisgICAgICAqIEFEUENNCisgICAgICAqLworICAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgMzI7IGJhbmQrKykgeworICAgICAgICAgICAgaW50MzJfdCAqc2FtcGxlcyA9IGMtPnN1YmJhbmRbY2hdW2JhbmRdIC0gRENBX0FEUENNX0NPRUZGUzsKKyAgICAgICAgICAgIGlmIChjLT5wcmVkaWN0aW9uX21vZGVbY2hdW2JhbmRdID09IC0xKSB7CisgICAgICAgICAgICAgICAgc3RlcF9zaXplID0gZ2V0X3N0ZXBfc2l6ZShjLCBjaCwgYmFuZCk7CiAKLSAgICB2YWx1ZSA9IG11bDMyKHZhbHVlLCBxdWFudC5tKSArIG9mZnNldDsKLSAgICB2YWx1ZSA9IHZhbHVlID4+IHF1YW50LmU7Ci0gICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgICAgIGZmX2RjYV9jb3JlX2RlcXVhbnRpemUoYy0+YWRwY21faGlzdG9yeVtjaF1bYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5xdWFudGl6ZWRbY2hdW2JhbmRdKzEyLCBzdGVwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9kY2Ffc2NhbGVfZmFjdG9yX3F1YW50N1tjLT5zY2FsZV9mYWN0b3JbY2hdW2JhbmRdXSwgMCwgNCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFWX0NPUFkxMjhVKGMtPmFkcGNtX2hpc3RvcnlbY2hdW2JhbmRdLCBjLT5hZHBjbV9oaXN0b3J5W2NoXVtiYW5kXSs0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIENvcHkgZGVxdWFudGl6ZWQgdmFsdWVzIGZvciBMUEMgYW5hbHlzaXMuCisgICAgICAgICAgICAgKiBJdCByZWR1Y2VzIGFydGlmYWN0cyBpbiBjYXNlIG9mIGV4dHJlbWUgcXVhbnRpemF0aW9uLAorICAgICAgICAgICAgICogZXhhbXBsZTogaW4gY3VycmVudCBmcmFtZSBhYml0cyBpcyAxIGFuZCBoYXMgbm8gcHJlZGljdGlvbiBmbGFnLAorICAgICAgICAgICAgICogYnV0IGVuZCBvZiB0aGlzIGZyYW1lIGlzIHNpbmUgbGlrZSBzaWduYWwuIEluIHRoaXMgY2FzZSwgaWYgTFBDIGFuYWx5c2lzIHVzZXMKKyAgICAgICAgICAgICAqIG9yaWdpbmFsIHZhbHVlcywgbGlrZWx5IExQQyBhbmFseXNpcyByZXR1cm5zIGdvb2QgcHJlZGljdGlvbiBnYWluLCBhbmQgc2V0cyBwcmVkaWN0aW9uIGZsYWcuCisgICAgICAgICAgICAgKiBCdXQgdGhlcmUgYXJlIG5vIHByb3BlciB2YWx1ZSBpbiBkZWNvZGVyIGhpc3RvcnksIHNvIGxpa2VseSByZXN1bHQgd2lsbCBiZSBubyBnb29kLgorICAgICAgICAgICAgICogQml0c3RyZWFtIGhhcyAiUHJlZGljdG9yIGhpc3RvcnkgZmxhZyBzd2l0Y2giLCBidXQgdGhpcyBmbGFnIGRpc2FibGVzIGhpc3RvcnkgZm9yIGFsbCBzdWJiYW5kcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBzYW1wbGVzWzBdID0gYy0+YWRwY21faGlzdG9yeVtjaF1bYmFuZF1bMF0gPDwgNzsKKyAgICAgICAgICAgIHNhbXBsZXNbMV0gPSBjLT5hZHBjbV9oaXN0b3J5W2NoXVtiYW5kXVsxXSA8PCA3OworICAgICAgICAgICAgc2FtcGxlc1syXSA9IGMtPmFkcGNtX2hpc3RvcnlbY2hdW2JhbmRdWzJdIDw8IDc7CisgICAgICAgICAgICBzYW1wbGVzWzNdID0gYy0+YWRwY21faGlzdG9yeVtjaF1bYmFuZF1bM10gPDwgNzsKKyAgICAgICAgfQorICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgY2FsY19vbmVfc2NhbGUoaW50MzJfdCBwZWFrX2NiLCBpbnQgYWJpdHMsIHNvZnRmbG9hdCAqcXVhbnQpCitzdGF0aWMgdm9pZCBjYWxjX2xmZV9zY2FsZXMoRENBRW5jQ29udGV4dCAqYykKIHsKLSAgICBpbnQzMl90IHBlYWs7Ci0gICAgaW50IG91cl9uc2NhbGUsIHRyeV9yZW1vdmU7Ci0gICAgc29mdGZsb2F0IG91cl9xdWFudDsKLQotICAgIGF2X2Fzc2VydDAocGVha19jYiA8PSAwKTsKLSAgICBhdl9hc3NlcnQwKHBlYWtfY2IgPj0gLTIwNDcpOwotCi0gICAgb3VyX25zY2FsZSA9IDEyNzsKLSAgICBwZWFrID0gY2JfdG9fbGV2ZWxbLXBlYWtfY2JdOwotCi0gICAgZm9yICh0cnlfcmVtb3ZlID0gNjQ7IHRyeV9yZW1vdmUgPiAwOyB0cnlfcmVtb3ZlID4+PSAxKSB7Ci0gICAgICAgIGlmIChzY2FsZWZhY3Rvcl9pbnZbb3VyX25zY2FsZSAtIHRyeV9yZW1vdmVdLmUgKyBzdGVwc2l6ZV9pbnZbYWJpdHNdLmUgPD0gMTcpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgb3VyX3F1YW50Lm0gPSBtdWwzMihzY2FsZWZhY3Rvcl9pbnZbb3VyX25zY2FsZSAtIHRyeV9yZW1vdmVdLm0sIHN0ZXBzaXplX2ludlthYml0c10ubSk7Ci0gICAgICAgIG91cl9xdWFudC5lID0gc2NhbGVmYWN0b3JfaW52W291cl9uc2NhbGUgLSB0cnlfcmVtb3ZlXS5lICsgc3RlcHNpemVfaW52W2FiaXRzXS5lIC0gMTc7Ci0gICAgICAgIGlmICgocXVhbnRfbGV2ZWxzW2FiaXRzXSAtIDEpIC8gMiA8IHF1YW50aXplX3ZhbHVlKHBlYWssIG91cl9xdWFudCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgb3VyX25zY2FsZSAtPSB0cnlfcmVtb3ZlOwotICAgIH0KLQotICAgIGlmIChvdXJfbnNjYWxlID49IDEyNSkKLSAgICAgICAgb3VyX25zY2FsZSA9IDEyNDsKLQotICAgIHF1YW50LT5tID0gbXVsMzIoc2NhbGVmYWN0b3JfaW52W291cl9uc2NhbGVdLm0sIHN0ZXBzaXplX2ludlthYml0c10ubSk7Ci0gICAgcXVhbnQtPmUgPSBzY2FsZWZhY3Rvcl9pbnZbb3VyX25zY2FsZV0uZSArIHN0ZXBzaXplX2ludlthYml0c10uZSAtIDE3OwotICAgIGF2X2Fzc2VydDAoKHF1YW50X2xldmVsc1thYml0c10gLSAxKSAvIDIgPj0gcXVhbnRpemVfdmFsdWUocGVhaywgKnF1YW50KSk7Ci0KLSAgICByZXR1cm4gb3VyX25zY2FsZTsKLX0KLQotc3RhdGljIHZvaWQgY2FsY19zY2FsZXMoRENBRW5jQ29udGV4dCAqYykKLXsKLSAgICBpbnQgYmFuZCwgY2g7Ci0KLSAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgMzI7IGJhbmQrKykKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICBjLT5zY2FsZV9mYWN0b3JbYmFuZF1bY2hdID0gY2FsY19vbmVfc2NhbGUoYy0+cGVha19jYltiYW5kXVtjaF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YWJpdHNbYmFuZF1bY2hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5xdWFudFtiYW5kXVtjaF0pOwotCiAgICAgaWYgKGMtPmxmZV9jaGFubmVsKQotICAgICAgICBjLT5sZmVfc2NhbGVfZmFjdG9yID0gY2FsY19vbmVfc2NhbGUoYy0+bGZlX3BlYWtfY2IsIDExLCAmYy0+bGZlX3F1YW50KTsKLX0KLQotc3RhdGljIHZvaWQgcXVhbnRpemVfYWxsKERDQUVuY0NvbnRleHQgKmMpCi17Ci0gICAgaW50IHNhbXBsZSwgYmFuZCwgY2g7Ci0KLSAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IFNVQkJBTkRfU0FNUExFUzsgc2FtcGxlKyspCi0gICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCAzMjsgYmFuZCsrKQotICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICAgICAgYy0+cXVhbnRpemVkW3NhbXBsZV1bYmFuZF1bY2hdID0gcXVhbnRpemVfdmFsdWUoYy0+c3ViYmFuZFtzYW1wbGVdW2JhbmRdW2NoXSwgYy0+cXVhbnRbYmFuZF1bY2hdKTsKKyAgICAgICAgYy0+bGZlX3NjYWxlX2ZhY3RvciA9IGNhbGNfb25lX3NjYWxlKGMsIGMtPmxmZV9wZWFrX2NiLCAxMSwgJmMtPmxmZV9xdWFudCk7CiB9CiAKIHN0YXRpYyB2b2lkIHB1dF9mcmFtZV9oZWFkZXIoRENBRW5jQ29udGV4dCAqYykKQEAgLTgwNyw5ICsxMDIwLDYgQEAKIAogc3RhdGljIHZvaWQgcHV0X3ByaW1hcnlfYXVkaW9faGVhZGVyKERDQUVuY0NvbnRleHQgKmMpCiB7Ci0gICAgc3RhdGljIGNvbnN0IGludCBiaXRsZW5bMTFdID0geyAwLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzIH07Ci0gICAgc3RhdGljIGNvbnN0IGludCB0aHJbMTFdICAgID0geyAwLCAxLCAzLCAzLCAzLCAzLCA3LCA3LCA3LCA3LCA3IH07Ci0KICAgICBpbnQgY2gsIGk7CiAgICAgLyogTnVtYmVyIG9mIHN1YmZyYW1lcyAqLwogICAgIHB1dF9iaXRzKCZjLT5wYiwgNCwgU1VCRlJBTUVTIC0gMSk7CkBAIC04MzksMzcgKzEwNDksNTMgQEAKIAogICAgIC8qIEJpdCBhbGxvY2F0aW9uIHF1YW50aXplciBzZWxlY3Q6IGxpbmVhciA1LWJpdCAqLwogICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQotICAgICAgICBwdXRfYml0cygmYy0+cGIsIDMsIDYpOworICAgICAgICBwdXRfYml0cygmYy0+cGIsIDMsIGMtPmJpdF9hbGxvY2F0aW9uX3NlbFtjaF0pOwogCi0gICAgLyogUXVhbnRpemF0aW9uIGluZGV4IGNvZGVib29rIHNlbGVjdDogZHVtbXkgZGF0YQotICAgICAgIHRvIGF2b2lkIHRyYW5zbWlzc2lvbiBvZiBzY2FsZSBmYWN0b3IgYWRqdXN0bWVudCAqLwotICAgIGZvciAoaSA9IDE7IGkgPCAxMTsgaSsrKQorICAgIC8qIFF1YW50aXphdGlvbiBpbmRleCBjb2RlYm9vayBzZWxlY3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRENBX0NPREVfQk9PS1M7IGkrKykKICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIGJpdGxlbltpXSwgdGhyW2ldKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZjLT5wYiwgZmZfZGNhX3F1YW50X2luZGV4X3NlbF9uYml0c1tpXSwgYy0+cXVhbnRfaW5kZXhfc2VsW2NoXVtpXSk7CiAKLSAgICAvKiBTY2FsZSBmYWN0b3IgYWRqdXN0bWVudCBpbmRleDogbm90IHRyYW5zbWl0dGVkICovCisgICAgLyogU2NhbGUgZmFjdG9yIGFkanVzdG1lbnQgaW5kZXg6IHRyYW5zbWl0dGVkIGluIGNhc2Ugb2YgSHVmZm1hbiBjb2RpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRENBX0NPREVfQk9PS1M7IGkrKykKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBpZiAoYy0+cXVhbnRfaW5kZXhfc2VsW2NoXVtpXSA8IGZmX2RjYV9xdWFudF9pbmRleF9ncm91cF9zaXplW2ldKQorICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZjLT5wYiwgMiwgMCk7CisKICAgICAvKiBBdWRpbyBoZWFkZXIgQ1JDIGNoZWNrIHdvcmQ6IG5vdCB0cmFuc21pdHRlZCAqLwogfQogCiBzdGF0aWMgdm9pZCBwdXRfc3ViZnJhbWVfc2FtcGxlcyhEQ0FFbmNDb250ZXh0ICpjLCBpbnQgc3MsIGludCBiYW5kLCBpbnQgY2gpCiB7Ci0gICAgaWYgKGMtPmFiaXRzW2JhbmRdW2NoXSA8PSA3KSB7Ci0gICAgICAgIGludCBzdW0sIGksIGo7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpICs9IDQpIHsKLSAgICAgICAgICAgIHN1bSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGogPSAzOyBqID49IDA7IGotLSkgewotICAgICAgICAgICAgICAgIHN1bSAqPSBxdWFudF9sZXZlbHNbYy0+YWJpdHNbYmFuZF1bY2hdXTsKLSAgICAgICAgICAgICAgICBzdW0gKz0gYy0+cXVhbnRpemVkW3NzICogOCArIGkgKyBqXVtiYW5kXVtjaF07Ci0gICAgICAgICAgICAgICAgc3VtICs9IChxdWFudF9sZXZlbHNbYy0+YWJpdHNbYmFuZF1bY2hdXSAtIDEpIC8gMjsKKyAgICBpbnQgaSwgaiwgc3VtLCBiaXRzLCBzZWw7CisgICAgaWYgKGMtPmFiaXRzW2NoXVtiYW5kXSA8PSBEQ0FfQ09ERV9CT09LUykgeworICAgICAgICBhdl9hc3NlcnQwKGMtPmFiaXRzW2NoXVtiYW5kXSA+IDApOworICAgICAgICBzZWwgPSBjLT5xdWFudF9pbmRleF9zZWxbY2hdW2MtPmFiaXRzW2NoXVtiYW5kXSAtIDFdOworICAgICAgICAvLyBIdWZmbWFuIGNvZGVzCisgICAgICAgIGlmIChzZWwgPCBmZl9kY2FfcXVhbnRfaW5kZXhfZ3JvdXBfc2l6ZVtjLT5hYml0c1tjaF1bYmFuZF0gLSAxXSkgeworICAgICAgICAgICAgZmZfZGNhX3ZsY19lbmNfcXVhbnQoJmMtPnBiLCAmYy0+cXVhbnRpemVkW2NoXVtiYW5kXVtzcyAqIDhdLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsLCBjLT5hYml0c1tjaF1bYmFuZF0gLSAxKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEJsb2NrIGNvZGVzCisgICAgICAgIGlmIChjLT5hYml0c1tjaF1bYmFuZF0gPD0gNykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkgKz0gNCkgeworICAgICAgICAgICAgICAgIHN1bSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMzsgaiA+PSAwOyBqLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICo9IGZmX2RjYV9xdWFudF9sZXZlbHNbYy0+YWJpdHNbY2hdW2JhbmRdXTsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IGMtPnF1YW50aXplZFtjaF1bYmFuZF1bc3MgKiA4ICsgaSArIGpdOworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gKGZmX2RjYV9xdWFudF9sZXZlbHNbYy0+YWJpdHNbY2hdW2JhbmRdXSAtIDEpIC8gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJmMtPnBiLCBiaXRfY29uc3VtcHRpb25bYy0+YWJpdHNbY2hdW2JhbmRdXSAvIDQsIHN1bSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIGJpdF9jb25zdW1wdGlvbltjLT5hYml0c1tiYW5kXVtjaF1dIC8gNCwgc3VtKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgYml0cyA9IGJpdF9jb25zdW1wdGlvbltjLT5hYml0c1tiYW5kXVtjaF1dIC8gMTY7Ci0gICAgICAgICAgICBwdXRfc2JpdHMoJmMtPnBiLCBiaXRzLCBjLT5xdWFudGl6ZWRbc3MgKiA4ICsgaV1bYmFuZF1bY2hdKTsKLSAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgYml0cyA9IGJpdF9jb25zdW1wdGlvbltjLT5hYml0c1tjaF1bYmFuZF1dIC8gMTY7CisgICAgICAgIHB1dF9zYml0cygmYy0+cGIsIGJpdHMsIGMtPnF1YW50aXplZFtjaF1bYmFuZF1bc3MgKiA4ICsgaV0pOwogICAgIH0KIH0KIApAQCAtODg2LDI1ICsxMTEyLDM5IEBACiAgICAgLyogUHJlZGljdGlvbiBtb2RlOiBubyBBRFBDTSwgaW4gZWFjaCBjaGFubmVsIGFuZCBzdWJiYW5kICovCiAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspCiAgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBEQ0FFTkNfU1VCQkFORFM7IGJhbmQrKykKLSAgICAgICAgICAgIHB1dF9iaXRzKCZjLT5wYiwgMSwgMCk7CisgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDEsICEoYy0+cHJlZGljdGlvbl9tb2RlW2NoXVtiYW5kXSA9PSAtMSkpOwogCi0gICAgLyogUHJlZGljdGlvbiBWUSBhZGRyZXNzOiBub3QgdHJhbnNtaXR0ZWQgKi8KLSAgICAvKiBCaXQgYWxsb2NhdGlvbiBpbmRleCAqLworICAgIC8qIFByZWRpY3Rpb24gVlEgYWRkcmVzcyAqLwogICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQogICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgRENBRU5DX1NVQkJBTkRTOyBiYW5kKyspCi0gICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDUsIGMtPmFiaXRzW2JhbmRdW2NoXSk7CisgICAgICAgICAgICBpZiAoYy0+cHJlZGljdGlvbl9tb2RlW2NoXVtiYW5kXSA+PSAwKQorICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZjLT5wYiwgMTIsIGMtPnByZWRpY3Rpb25fbW9kZVtjaF1bYmFuZF0pOworCisgICAgLyogQml0IGFsbG9jYXRpb24gaW5kZXggKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAoYy0+Yml0X2FsbG9jYXRpb25fc2VsW2NoXSA9PSA2KSB7CisgICAgICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgRENBRU5DX1NVQkJBTkRTOyBiYW5kKyspIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDUsIGMtPmFiaXRzW2NoXVtiYW5kXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmZl9kY2FfdmxjX2VuY19hbGxvYygmYy0+cGIsIGMtPmFiaXRzW2NoXSwgRENBRU5DX1NVQkJBTkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Yml0X2FsbG9jYXRpb25fc2VsW2NoXSk7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoU1VCU1VCRlJBTUVTID4gMSkgewogICAgICAgICAvKiBUcmFuc2l0aW9uIG1vZGU6IG5vbmUgZm9yIGVhY2ggY2hhbm5lbCBhbmQgc3ViYmFuZCAqLwogICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5mdWxsYmFuZF9jaGFubmVsczsgY2grKykKICAgICAgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBEQ0FFTkNfU1VCQkFORFM7IGJhbmQrKykKLSAgICAgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDEsIDApOyAvKiBjb2RlYm9vayBBNCAqLworICAgICAgICAgICAgICAgIGlmIChjLT5hYml0c1tjaF1bYmFuZF0pCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZjLT5wYiwgMSwgMCk7IC8qIGNvZGVib29rIEE0ICovCiAgICAgfQogCiAgICAgLyogU2NhbGUgZmFjdG9ycyAqLwogICAgIGZvciAoY2ggPSAwOyBjaCA8IGMtPmZ1bGxiYW5kX2NoYW5uZWxzOyBjaCsrKQogICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgRENBRU5DX1NVQkJBTkRTOyBiYW5kKyspCi0gICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDcsIGMtPnNjYWxlX2ZhY3RvcltiYW5kXVtjaF0pOworICAgICAgICAgICAgaWYgKGMtPmFiaXRzW2NoXVtiYW5kXSkKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmYy0+cGIsIDcsIGMtPnNjYWxlX2ZhY3RvcltjaF1bYmFuZF0pOwogCiAgICAgLyogSm9pbnQgc3ViYmFuZCBzY2FsZSBmYWN0b3IgY29kZWJvb2sgc2VsZWN0OiBub3QgdHJhbnNtaXR0ZWQgKi8KICAgICAvKiBTY2FsZSBmYWN0b3JzIGZvciBqb2ludCBzdWJiYW5kIGNvZGluZzogbm90IHRyYW5zbWl0dGVkICovCkBAIC05MjQsNiArMTE2NCw3IEBACiAgICAgZm9yIChzcyA9IDA7IHNzIDwgU1VCU1VCRlJBTUVTIDsgc3MrKykKICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgYy0+ZnVsbGJhbmRfY2hhbm5lbHM7IGNoKyspCiAgICAgICAgICAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgRENBRU5DX1NVQkJBTkRTOyBiYW5kKyspCisgICAgICAgICAgICAgICAgaWYgKGMtPmFiaXRzW2NoXVtiYW5kXSkKICAgICAgICAgICAgICAgICAgICAgcHV0X3N1YmZyYW1lX3NhbXBsZXMoYywgc3MsIGJhbmQsIGNoKTsKIAogICAgIC8qIERTWU5DICovCkBAIC05NDcsMTMgKzExODgsMTUgQEAKICAgICAgICAgbGZlX2Rvd25zYW1wbGUoYywgc2FtcGxlcyk7CiAKICAgICBjYWxjX21hc2tpbmcoYywgc2FtcGxlcyk7CisgICAgaWYgKGMtPm9wdGlvbnMuYWRwY21fbW9kZSkKKyAgICAgICAgYWRwY21fYW5hbHlzaXMoYyk7CiAgICAgZmluZF9wZWFrcyhjKTsKICAgICBhc3NpZ25fYml0cyhjKTsKLSAgICBjYWxjX3NjYWxlcyhjKTsKLSAgICBxdWFudGl6ZV9hbGwoYyk7CisgICAgY2FsY19sZmVfc2NhbGVzKGMpOwogICAgIHNoaWZ0X2hpc3RvcnkoYywgc2FtcGxlcyk7CiAKICAgICBpbml0X3B1dF9iaXRzKCZjLT5wYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBmaWxsX2luX2FkcGNtX2J1ZmVyKGMpOwogICAgIHB1dF9mcmFtZV9oZWFkZXIoYyk7CiAgICAgcHV0X3ByaW1hcnlfYXVkaW9faGVhZGVyKGMpOwogICAgIGZvciAoaSA9IDA7IGkgPCBTVUJGUkFNRVM7IGkrKykKQEAgLTk3Miw2ICsxMjE1LDIwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgRENBRU5DX0ZMQUdTIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJkY2FfYWRwY20iLCAiVXNlIEFEUENNIGVuY29kaW5nIiwgb2Zmc2V0b2YoRENBRW5jQ29udGV4dCwgb3B0aW9ucy5hZHBjbV9tb2RlKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgRENBRU5DX0ZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBkY2FlbmNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiRENBIChEVFMgQ29oZXJlbnQgQWNvdXN0aWNzKSIsCisgICAgLml0ZW1fbmFtZSA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gPSBvcHRpb25zLAorICAgIC52ZXJzaW9uID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKwogc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IGRlZmF1bHRzW10gPSB7CiAgICAgeyAiYiIsICAgICAgICAgICIxNDExMjAwIiB9LAogICAgIHsgTlVMTCB9LApAQCAtOTg0LDggKzEyNDEsMTAgQEAKICAgICAuaWQgICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRFRTLAogICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoRENBRW5jQ29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IGVuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBlbmNvZGVfY2xvc2UsCiAgICAgLmVuY29kZTIgICAgICAgICAgICAgICA9IGVuY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCwKKyAgICAuY2Fwc19pbnRlcm5hbCAgICAgICAgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8IEZGX0NPREVDX0NBUF9JTklUX0NMRUFOVVAsCiAgICAgLnNhbXBsZV9mbXRzICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAogICAgIC5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMgPSBzYW1wbGVfcmF0ZXMsCkBAIC05OTYsNCArMTI1NSw1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH0sCiAgICAgLmRlZmF1bHRzICAgICAgICAgICAgICA9IGRlZmF1bHRzLAorICAgIC5wcml2X2NsYXNzICAgICAgICAgICAgPSAmZGNhZW5jX2NsYXNzLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhZW5jLmggYi9saWJhdmNvZGVjL2RjYWVuYy5oCmluZGV4IDA0NDNjYTYuLjYzZmRhZjAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGNhZW5jLmgKKysrIGIvbGliYXZjb2RlYy9kY2FlbmMuaApAQCAtMjQsNiArMjQsOCBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKKyNpbmNsdWRlICJkY2FtYXRoLmgiCisKIHR5cGVkZWYgc3RydWN0IHsKICAgICBpbnQzMl90IG07CiAgICAgaW50MzJfdCBlOwpAQCAtOTUsNyArOTcsNiBAQAogCiAvKiBtYW51YWxseSBkZXJpdmVkIGZyb20KICAqIFRhYmxlIEIuNTogU2VsZWN0aW9uIG9mIHF1YW50aXphdGlvbiBsZXZlbHMgYW5kIGNvZGVib29rcwotICogRklYTUU6IHdpbGwgYmVjb21lIGludmFsaWQgd2hlbiBIdWZmbWFuIGNvZGVzIGFyZSBpbnRyb2R1Y2VkLgogICovCiBzdGF0aWMgY29uc3QgaW50IGJpdF9jb25zdW1wdGlvblsyN10gPSB7CiAgICAgLTgsIDI4LCA0MCwgNDgsIDUyLCA2MCwgNjgsIDc2LCA4MCwgOTYsCkBAIC0xMDMsMTEgKzEwNCw1NSBAQAogICAgIDI3MiwgMjg4LCAzMDQsIDMyMCwgMzM2LCAzNTIsIDM2OCwKIH07CiAKLS8qIFRhYmxlIEIuNTogU2VsZWN0aW9uIG9mIHF1YW50aXphdGlvbiBsZXZlbHMgYW5kIGNvZGVib29rcyAqLwotc3RhdGljIGNvbnN0IGludCBxdWFudF9sZXZlbHNbMjddID0gewotICAgIDEsIDMsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMyLCA2NCwKLSAgICAxMjgsIDI1NiwgNTEyLCAxMDI0LCAyMDQ4LCA0MDk2LCA4MTkyLCAxNjM4NCwgMzI3NjgsIDY1NTM2LAotICAgIDEzMTA3MiwgMjYyMTQ0LCA1MjQyODgsIDEwNDg1NzYsIDIwOTcxNTIsIDQxOTQzMDQsIDgzODg2MDgsCitzdGF0aWMgY29uc3QgaW50OF90IGxmZV9pbmRleFsxNl0gPSB7CisgICAgMSwgMiwgMiwgMiwgMiwgMywgMiwgMywgMiwgMywgMiwgMywgMSwgMywgMiwgMwogfTsKIAorc3RhdGljIGNvbnN0IGludDhfdCBjaGFubmVsX3Jlb3JkZXJfbGZlWzE2XVs5XSA9IHsKKyAgICB7IDAsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAgMywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMiwgIDAsICAxLCAgNCwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgIDMsICA0LCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgIDQsICA1LCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMywgIDQsICAwLCAgMSwgIDUsICA2LCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMCwgIDEsICA0LCAgNSwgIDYsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICA2LCAgNCwgIDUsICAyLCAgMywgLTEsIC0xLCAtMSB9LAorICAgIHsgNCwgIDIsICA1LCAgMCwgIDEsICA2LCAgNywgLTEsIC0xIH0sCisgICAgeyA1LCAgNiwgIDAsICAxLCAgNywgIDMsICA4LCAgNCwgLTEgfSwKKyAgICB7IDQsICAyLCAgNSwgIDAsICAxLCAgNiwgIDgsICA3LCAtMSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBjaGFubmVsX3Jlb3JkZXJfbm9sZmVbMTZdWzldID0geworICAgIHsgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDEsICAyLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMCwgIDEsICAzLCAtMSwgLTEsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDAsICAxLCAgMiwgIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMiwgIDAsICAxLCAgMywgIDQsIC0xLCAtMSwgLTEsIC0xIH0sCisgICAgeyAyLCAgMywgIDAsICAxLCAgNCwgIDUsIC0xLCAtMSwgLTEgfSwKKyAgICB7IDIsICAwLCAgMSwgIDMsICA0LCAgNSwgLTEsIC0xLCAtMSB9LAorICAgIHsgMCwgIDUsICAzLCAgNCwgIDEsICAyLCAtMSwgLTEsIC0xIH0sCisgICAgeyAzLCAgMiwgIDQsICAwLCAgMSwgIDUsICA2LCAtMSwgLTEgfSwKKyAgICB7IDQsICA1LCAgMCwgIDEsICA2LCAgMiwgIDcsICAzLCAtMSB9LAorICAgIHsgMywgIDIsICA0LCAgMCwgIDEsICA1LCAgNywgIDYsIC0xIH0sCit9OworCitzdGF0aWMgaW5saW5lIGludDMyX3QgcXVhbnRpemVfdmFsdWUoaW50MzJfdCB2YWx1ZSwgc29mdGZsb2F0IHF1YW50KQoreworICAgIGludDMyX3Qgb2Zmc2V0ID0gMSA8PCAocXVhbnQuZSAtIDEpOworCisgICAgdmFsdWUgPSBtdWwzMih2YWx1ZSwgcXVhbnQubSkgKyBvZmZzZXQ7CisgICAgdmFsdWUgPSB2YWx1ZSA+PiBxdWFudC5lOworICAgIHJldHVybiB2YWx1ZTsKK30KKwogI2VuZGlmIC8qIEFWQ09ERUNfRENBRU5DX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhaHVmZi5jIGIvbGliYXZjb2RlYy9kY2FodWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZWViNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZGNhaHVmZi5jCkBAIC0wLDAgKzEsMTM3OCBAQAorLyoKKyAqIERDQSBjb21wYXRpYmxlIGRlY29kZXIgLSBodWZmbWFuIHRhYmxlcworICogQ29weXJpZ2h0IChDKSAyMDA0IEdpbGRhcyBCYXppbgorICogQ29weXJpZ2h0IChDKSAyMDA3IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImRjYWh1ZmYuaCIKKworI2RlZmluZSBUTU9ERV9DT1VOVCA0CitzdGF0aWMgY29uc3QgdWludDhfdCB0bW9kZV92bGNfYml0c1tUTU9ERV9DT1VOVF0gPSB7IDMsIDMsIDMsIDIgfTsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0bW9kZV9jb2Rlc1tUTU9ERV9DT1VOVF1bNF0gPSB7CisgICAgeyAweDAwMDAsIDB4MDAwMiwgMHgwMDA2LCAweDAwMDcgfSwKKyAgICB7IDB4MDAwMiwgMHgwMDA2LCAweDAwMDcsIDB4MDAwMCB9LAorICAgIHsgMHgwMDA2LCAweDAwMDcsIDB4MDAwMCwgMHgwMDAyIH0sCisgICAgeyAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdG1vZGVfYml0c1tUTU9ERV9DT1VOVF1bNF0gPSB7CisgICAgeyAxLCAyLCAzLCAzIH0sCisgICAgeyAyLCAzLCAzLCAxIH0sCisgICAgeyAzLCAzLCAxLCAyIH0sCisgICAgeyAyLCAyLCAyLCAyIH0KK307CisKKyNkZWZpbmUgQklUQUxMT0NfMTJfVkxDX0JJVFMgOQorc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTJfdmxjX2JpdHNbRENBX0JJVEFMTE9DXzEyX0NPVU5UXSA9IHsKKyAgICA5LCA3LCA3LCA5LCA5Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTJfY29kZXNbRENBX0JJVEFMTE9DXzEyX0NPVU5UXVsxMl0gPSB7CisgICAgeyAweDAwMDAsIDB4MDAwMiwgMHgwMDA2LCAweDAwMEUsIDB4MDAxRSwgMHgwMDNFLCAweDAwRkYsIDB4MDBGRSwKKyAgICAgIDB4MDFGQiwgMHgwMUZBLCAweDAxRjksIDB4MDFGOCwgfSwKKyAgICB7IDB4MDAwMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwRiwgMHgwMDBDLCAweDAwMUQsIDB4MDAzOSwgMHgwMDM4LAorICAgICAgMHgwMDM3LCAweDAwMzYsIDB4MDAzNSwgMHgwMDM0LCB9LAorICAgIHsgMHgwMDAwLCAweDAwMDcsIDB4MDAwNSwgMHgwMDA0LCAweDAwMDIsIDB4MDAwRCwgMHgwMDBDLCAweDAwMDYsCisgICAgICAweDAwMEYsIDB4MDAxRCwgMHgwMDM5LCAweDAwMzgsIH0sCisgICAgeyAweDAwMDMsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwNiwgMHgwMDBFLCAweDAwMUUsIDB4MDAzRSwKKyAgICAgIDB4MDA3RSwgMHgwMEZFLCAweDAxRkYsIDB4MDFGRSwgfSwKKyAgICB7IDB4MDAwMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwNiwgMHgwMDBFLCAweDAwM0YsIDB4MDAzRCwgMHgwMDdDLAorICAgICAgMHgwMDc5LCAweDAwNzgsIDB4MDBGQiwgMHgwMEZBLCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xMl9iaXRzW0RDQV9CSVRBTExPQ18xMl9DT1VOVF1bMTJdID0geworICAgIHsgMSwgMiwgMywgNCwgNSwgNiwgOCwgOCwgOSwgOSwgIDksICA5IH0sCisgICAgeyAxLCAyLCAzLCA1LCA1LCA2LCA3LCA3LCA3LCA3LCAgNywgIDcgfSwKKyAgICB7IDIsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDUsIDYsICA3LCAgNyB9LAorICAgIHsgMiwgMiwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDEwIH0sCisgICAgeyAxLCAyLCAzLCA0LCA1LCA3LCA3LCA4LCA4LCA4LCAgOSwgIDkgfQorfTsKKworI2RlZmluZSBTQ0FMRVNfQ09VTlQgICAgNQorI2RlZmluZSBTQ0FMRVNfVkxDX0JJVFMgOQorc3RhdGljIGNvbnN0IHVpbnQxNl90IHNjYWxlc19jb2Rlc1tTQ0FMRVNfQ09VTlRdWzEyOV0gPSB7CisgICAgeyAweDNBQjAsIDB4M0FCMiwgMHgzQUI0LCAweDNBQjYsIDB4M0FCOCwgMHgzQUJBLCAweDNBQkMsIDB4M0FCRSwKKyAgICAgIDB4M0FDMCwgMHgzQUMyLCAweDNBQzQsIDB4M0FDNiwgMHgzQUM4LCAweDNBQ0EsIDB4M0FDQywgMHgzQUNFLAorICAgICAgMHgzQUQwLCAweDNBRDIsIDB4M0FENCwgMHgzQUQ2LCAweDNBRDgsIDB4M0FEQSwgMHgzQURDLCAweDNBREUsCisgICAgICAweDNBRTAsIDB4M0FFMiwgMHgzQUU0LCAweDNBRTYsIDB4M0FFOCwgMHgzQUVBLCAweDNBRUMsIDB4M0FFRSwKKyAgICAgIDB4M0FGMCwgMHgzQUYyLCAweDNBRjQsIDB4M0FGNiwgMHgzQUY4LCAweDNBRkEsIDB4M0FGQywgMHgzQUZFLAorICAgICAgMHgwNTQwLCAweDA1NDIsIDB4MDU0NCwgMHgwNTQ2LCAweDA1NDgsIDB4MDU0QSwgMHgwNTRDLCAweDA1NEUsCisgICAgICAweDA1NTgsIDB4MDU1RSwgMHgwMkFELCAweDAxNTQsIDB4MDc1NCwgMHgwM0E4LCAweDAwNTYsIDB4MDAyOCwKKyAgICAgIDB4MDBFOCwgMHgwMDRBLCAweDAwMEIsIDB4MDAzQiwgMHgwMDEzLCAweDAwMDMsIDB4MDAwRiwgMHgwMDA1LAorICAgICAgMHgwMDAxLCAweDAwMDYsIDB4MDAwMCwgMHgwMDA4LCAweDAwMUMsIDB4MDAwNCwgMHgwMDI0LCAweDAwNEIsCisgICAgICAweDAwRTksIDB4MDAyOSwgMHgwMDU3LCAweDAzQTksIDB4MDc1NSwgMHgwMTU1LCAweDAyQUUsIDB4MDU1RiwKKyAgICAgIDB4MDU1OSwgMHgwNTRGLCAweDA1NEQsIDB4MDU0QiwgMHgwNTQ5LCAweDA1NDcsIDB4MDU0NSwgMHgwNTQzLAorICAgICAgMHgwNTQxLCAweDNBRkYsIDB4M0FGRCwgMHgzQUZCLCAweDNBRjksIDB4M0FGNywgMHgzQUY1LCAweDNBRjMsCisgICAgICAweDNBRjEsIDB4M0FFRiwgMHgzQUVELCAweDNBRUIsIDB4M0FFOSwgMHgzQUU3LCAweDNBRTUsIDB4M0FFMywKKyAgICAgIDB4M0FFMSwgMHgzQURGLCAweDNBREQsIDB4M0FEQiwgMHgzQUQ5LCAweDNBRDcsIDB4M0FENSwgMHgzQUQzLAorICAgICAgMHgzQUQxLCAweDNBQ0YsIDB4M0FDRCwgMHgzQUNCLCAweDNBQzksIDB4M0FDNywgMHgzQUM1LCAweDNBQzMsCisgICAgICAweDNBQzEsIDB4M0FCRiwgMHgzQUJELCAweDNBQkIsIDB4M0FCOSwgMHgzQUI3LCAweDNBQjUsIDB4M0FCMywKKyAgICAgIDB4M0FCMSwgfSwKKyAgICB7IDB4MEY2MCwgMHgwRjYyLCAweDBGNjQsIDB4MEY2NiwgMHgwRjY4LCAweDBGNkEsIDB4MEY2QywgMHgwRjZFLAorICAgICAgMHgwRjcwLCAweDBGNzIsIDB4MEY3NCwgMHgwRjc2LCAweDBGNzgsIDB4MEY3QSwgMHgwRjdDLCAweDBGN0UsCisgICAgICAweDBGODAsIDB4MEY4MiwgMHgwRjg0LCAweDBGODYsIDB4MEY4OCwgMHgwRjhBLCAweDBGOEMsIDB4MEY4RSwKKyAgICAgIDB4MEY5MCwgMHgwRjkyLCAweDBGOTQsIDB4MEY5NiwgMHgwRjk4LCAweDBGOUEsIDB4MEY5QywgMHgwRjlFLAorICAgICAgMHgwRkEwLCAweDBGQTIsIDB4MEZBNCwgMHgwRkE2LCAweDBGQTgsIDB4MEZBQSwgMHgwRkFDLCAweDBGQUUsCisgICAgICAweDBGQjAsIDB4MEZCMiwgMHgwRkI0LCAweDBGQjYsIDB4MEZCOCwgMHgwRkJBLCAweDBGQkMsIDB4MEZCRSwKKyAgICAgIDB4MDdBMCwgMHgwN0EyLCAweDAzRDIsIDB4MDFFQSwgMHgwMEZDLCAweDAwN0YsIDB4MDAxQywgMHgwMDBDLAorICAgICAgMHgwMDA0LCAweDAwMzQsIDB4MDAxMCwgMHgwMDFCLCAweDAwMDksIDB4MDAwQiwgMHgwMDBFLCAweDAwMDEsCisgICAgICAweDAwMDMsIDB4MDAwMiwgMHgwMDBGLCAweDAwMEMsIDB4MDAwQSwgMHgwMDAwLCAweDAwMTEsIDB4MDAzNSwKKyAgICAgIDB4MDAwNSwgMHgwMDBELCAweDAwMUQsIDB4MDAzQywgMHgwMEZELCAweDAxRUIsIDB4MDNEMywgMHgwN0EzLAorICAgICAgMHgwN0ExLCAweDBGQkYsIDB4MEZCRCwgMHgwRkJCLCAweDBGQjksIDB4MEZCNywgMHgwRkI1LCAweDBGQjMsCisgICAgICAweDBGQjEsIDB4MEZBRiwgMHgwRkFELCAweDBGQUIsIDB4MEZBOSwgMHgwRkE3LCAweDBGQTUsIDB4MEZBMywKKyAgICAgIDB4MEZBMSwgMHgwRjlGLCAweDBGOUQsIDB4MEY5QiwgMHgwRjk5LCAweDBGOTcsIDB4MEY5NSwgMHgwRjkzLAorICAgICAgMHgwRjkxLCAweDBGOEYsIDB4MEY4RCwgMHgwRjhCLCAweDBGODksIDB4MEY4NywgMHgwRjg1LCAweDBGODMsCisgICAgICAweDBGODEsIDB4MEY3RiwgMHgwRjdELCAweDBGN0IsIDB4MEY3OSwgMHgwRjc3LCAweDBGNzUsIDB4MEY3MywKKyAgICAgIDB4MEY3MSwgMHgwRjZGLCAweDBGNkQsIDB4MEY2QiwgMHgwRjY5LCAweDBGNjcsIDB4MEY2NSwgMHgwRjYzLAorICAgICAgMHgwRjYxLCB9LAorICAgIHsgMHg1MUQwLCAweDUxRDIsIDB4NTFENCwgMHg1MUQ2LCAweDUxRDgsIDB4NTFEQSwgMHg1MURDLCAweDUxREUsCisgICAgICAweDUxRTAsIDB4NTFFMiwgMHg1MUU0LCAweDUxRTYsIDB4NTFFOCwgMHg1MUVBLCAweDUxRUMsIDB4NTFFRSwKKyAgICAgIDB4NTFGMCwgMHg1MUYyLCAweDUxRjQsIDB4NTFGNiwgMHg1MUY4LCAweDUxRkEsIDB4NTFGQywgMHg1MUZFLAorICAgICAgMHg3MEMwLCAweDcwQzIsIDB4NzBDNCwgMHg3MEM2LCAweDcwQzgsIDB4NzBDQSwgMHg3MENDLCAweDcwQ0UsCisgICAgICAweDcwRUMsIDB4MTBFQSwgMHgzODY4LCAweDM4NzcsIDB4MDg3NiwgMHgxQzM1LCAweDA0MzQsIDB4MEEzNCwKKyAgICAgIDB4MEUxQiwgMHgwMjFCLCAweDA1MUIsIDB4MDcwRiwgMHgwMTBGLCAweDAzODAsIDB4MDA4MCwgMHgwMTQwLAorICAgICAgMHgwMUMxLCAweDAwNDEsIDB4MDBBMSwgMHgwMEUyLCAweDAwMjIsIDB4MDA1MiwgMHgwMDcyLCAweDAwMTIsCisgICAgICAweDAwMkEsIDB4MDAzQSwgMHgwMDBBLCAweDAwMTYsIDB4MDAxRSwgMHgwMDA2LCAweDAwMEMsIDB4MDAwMCwKKyAgICAgIDB4MDAwNCwgMHgwMDAxLCAweDAwMEQsIDB4MDAwNywgMHgwMDFGLCAweDAwMTcsIDB4MDAwQiwgMHgwMDNCLAorICAgICAgMHgwMDJCLCAweDAwMTMsIDB4MDA3MywgMHgwMDUzLCAweDAwMjMsIDB4MDBFMywgMHgwMEEyLCAweDAwNDIsCisgICAgICAweDAxQzIsIDB4MDE0MSwgMHgwMDgxLCAweDAzODEsIDB4MDI4QywgMHgwMTBDLCAweDA1MUMsIDB4MDIxQywKKyAgICAgIDB4MEUxQywgMHgwQTM1LCAweDA0MzUsIDB4MUMzQSwgMHgwODc3LCAweDA4NzQsIDB4Mzg2OSwgMHgxMEVCLAorICAgICAgMHg3MEVELCAweDcwQ0YsIDB4NzBDRCwgMHg3MENCLCAweDcwQzksIDB4NzBDNywgMHg3MEM1LCAweDcwQzMsCisgICAgICAweDcwQzEsIDB4NTFGRiwgMHg1MUZELCAweDUxRkIsIDB4NTFGOSwgMHg1MUY3LCAweDUxRjUsIDB4NTFGMywKKyAgICAgIDB4NTFGMSwgMHg1MUVGLCAweDUxRUQsIDB4NTFFQiwgMHg1MUU5LCAweDUxRTcsIDB4NTFFNSwgMHg1MUUzLAorICAgICAgMHg1MUUxLCAweDUxREYsIDB4NTFERCwgMHg1MURCLCAweDUxRDksIDB4NTFENywgMHg1MUQ1LCAweDUxRDMsCisgICAgICAweDUxRDEsIH0sCisgICAgeyAweDZGNjQsIDB4NkY2NiwgMHg2RjY4LCAweDZGNkEsIDB4NkY2QywgMHg2RjZFLCAweDZGNzAsIDB4NkY3MiwKKyAgICAgIDB4NkY3NCwgMHg2Rjc2LCAweDZGNzgsIDB4NkY3QSwgMHg2RjdDLCAweDZGN0UsIDB4NkY4MCwgMHg2RjgyLAorICAgICAgMHg2Rjg0LCAweDZGODYsIDB4NkY4OCwgMHg2RjhBLCAweDZGOEMsIDB4NkY4RSwgMHg2RjkwLCAweDZGOTIsCisgICAgICAweDZGOTQsIDB4NkY5NiwgMHg2Rjk4LCAweDZGOUEsIDB4NkY5QywgMHg2RjlFLCAweDZGQTAsIDB4NkZBMiwKKyAgICAgIDB4NkZBNCwgMHg2RkE2LCAweDZGQTgsIDB4NkZBQSwgMHg2RkFDLCAweDZGQUUsIDB4NkZCMCwgMHg2RkIyLAorICAgICAgMHg2RkI0LCAweDZGQjYsIDB4MTdCNCwgMHgzN0RDLCAweDBCREIsIDB4MUJFRiwgMHgwNUVFLCAweDBERjgsCisgICAgICAweDAyRjgsIDB4MDZGRCwgMHgwMTdELCAweDAzN0YsIDB4MDBCRiwgMHgwMDQwLCAweDAwQzAsIDB4MDAyMSwKKyAgICAgIDB4MDA2MSwgMHgwMDExLCAweDAwMzEsIDB4MDAwOSwgMHgwMDE5LCAweDAwMDYsIDB4MDAwRSwgMHgwMDA0LAorICAgICAgMHgwMDAwLCAweDAwMDUsIDB4MDAwRiwgMHgwMDA3LCAweDAwMUEsIDB4MDAwQSwgMHgwMDM2LCAweDAwMTYsCisgICAgICAweDAwNkUsIDB4MDAyRSwgMHgwMEMxLCAweDAwNDEsIDB4MDFCQywgMHgwMEJDLCAweDAzN0EsIDB4MDE3QSwKKyAgICAgIDB4MDJGOSwgMHgwREY5LCAweDA1RUYsIDB4MDVFQywgMHgxQkQ4LCAweDM3REQsIDB4MTdCNSwgMHg2RkI3LAorICAgICAgMHg2RkI1LCAweDZGQjMsIDB4NkZCMSwgMHg2RkFGLCAweDZGQUQsIDB4NkZBQiwgMHg2RkE5LCAweDZGQTcsCisgICAgICAweDZGQTUsIDB4NkZBMywgMHg2RkExLCAweDZGOUYsIDB4NkY5RCwgMHg2RjlCLCAweDZGOTksIDB4NkY5NywKKyAgICAgIDB4NkY5NSwgMHg2RjkzLCAweDZGOTEsIDB4NkY4RiwgMHg2RjhELCAweDZGOEIsIDB4NkY4OSwgMHg2Rjg3LAorICAgICAgMHg2Rjg1LCAweDZGODMsIDB4NkY4MSwgMHg2RjdGLCAweDZGN0QsIDB4NkY3QiwgMHg2Rjc5LCAweDZGNzcsCisgICAgICAweDZGNzUsIDB4NkY3MywgMHg2RjcxLCAweDZGNkYsIDB4NkY2RCwgMHg2RjZCLCAweDZGNjksIDB4NkY2NywKKyAgICAgIDB4NkY2NSwgfSwKKyAgICB7IDB4REY1NCwgMHhERjU2LCAweERGQzgsIDB4REZDQSwgMHhERkNDLCAweERGQ0UsIDB4REZEMCwgMHhERkQyLAorICAgICAgMHhERkQ0LCAweERGRDYsIDB4REZEOCwgMHhERkRBLCAweERGREMsIDB4REZERSwgMHhERkUwLCAweERGRTIsCisgICAgICAweDBGRTgsIDB4MkZFQSwgMHg2RkE4LCAweDZGRjYsIDB4MDdGNSwgMHgwN0Y3LCAweDM3RDIsIDB4MzdGOSwKKyAgICAgIDB4MDNGOCwgMHgwQkY4LCAweDBCRkIsIDB4MUJFQiwgMHgwMUZBLCAweDA1RkEsIDB4MDlGQSwgMHgwREZBLAorICAgICAgMHgwREZGLCAweDAwRkYsIDB4MDJGRiwgMHgwNkZCLCAweDAwN0MsIDB4MDE3QywgMHgwMjdDLCAweDAyN0YsCisgICAgICAweDAwM0MsIDB4MDBCQywgMHgwMTNDLCAweDAxQkMsIDB4MDAxQywgMHgwMDVDLCAweDAwOUMsIDB4MDBEQywKKyAgICAgIDB4MDAwQywgMHgwMDJDLCAweDAwNEMsIDB4MDA2QywgMHgwMDA0LCAweDAwMTQsIDB4MDAyNCwgMHgwMDM0LAorICAgICAgMHgwMDAwLCAweDAwMDgsIDB4MDAxMCwgMHgwMDE4LCAweDAwMUUsIDB4MDAwMiwgMHgwMDA2LCAweDAwMEEsCisgICAgICAweDAwMEUsIDB4MDAwQiwgMHgwMDA3LCAweDAwMDMsIDB4MDAxRiwgMHgwMDE5LCAweDAwMTEsIDB4MDAwOSwKKyAgICAgIDB4MDAwMSwgMHgwMDM1LCAweDAwMjUsIDB4MDAxNSwgMHgwMDA1LCAweDAwNkQsIDB4MDA0RCwgMHgwMDJELAorICAgICAgMHgwMDBELCAweDAwREQsIDB4MDA5RCwgMHgwMDVELCAweDAwMUQsIDB4MDFCRCwgMHgwMTNELCAweDAwQkQsCisgICAgICAweDAwM0QsIDB4MDM3QywgMHgwMjdELCAweDAxN0QsIDB4MDA3RCwgMHgwNkZDLCAweDA0RkMsIDB4MDJGQywKKyAgICAgIDB4MDBGQywgMHgwREZCLCAweDA5RkIsIDB4MDVGQiwgMHgwMUZCLCAweDFCRjgsIDB4MUJFOCwgMHgwQkY5LAorICAgICAgMHgwM0Y5LCAweDM3RkEsIDB4MzdEMywgMHgxN0Y0LCAweDA3RjYsIDB4NkZGNywgMHg2RkE5LCAweDJGRUIsCisgICAgICAweDBGRTksIDB4REZFMywgMHhERkUxLCAweERGREYsIDB4REZERCwgMHhERkRCLCAweERGRDksIDB4REZENywKKyAgICAgIDB4REZENSwgMHhERkQzLCAweERGRDEsIDB4REZDRiwgMHhERkNELCAweERGQ0IsIDB4REZDOSwgMHhERjU3LAorICAgICAgMHhERjU1LCB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzY2FsZXNfYml0c1tTQ0FMRVNfQ09VTlRdWzEyOV0gPSB7CisgICAgeyAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgICAxMywgMTMsIDEyLCAxMSwgMTEsIDEwLCAgOSwgIDgsCisgICAgICAgOCwgIDcsICA2LCAgNiwgIDUsICA0LCAgNCwgIDMsCisgICAgICAgMiwgIDMsICAzLCAgNCwgIDUsICA1LCAgNiwgIDcsCisgICAgICAgOCwgIDgsICA5LCAxMCwgMTEsIDExLCAxMiwgMTMsCisgICAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgICAxNCwgfSwKKyAgICB7IDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE0LCAxNCwgMTMsIDEyLCAxMSwgMTAsICA4LCAgNywKKyAgICAgICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywKKyAgICAgICAzLCAgMywgIDQsICA0LCAgNCwgIDQsICA1LCAgNiwKKyAgICAgICA2LCAgNywgIDgsICA5LCAxMSwgMTIsIDEzLCAxNCwKKyAgICAgIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCB9LAorICAgIHsgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTIsIDEyLAorICAgICAgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwgIDksICA5LAorICAgICAgIDksICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA2LAorICAgICAgIDYsICA2LCAgNSwgIDUsICA1LCAgNCwgIDQsICAzLAorICAgICAgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LAorICAgICAgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LAorICAgICAgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTEsIDExLAorICAgICAgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgICAgMTUsIH0sCisgICAgeyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsCisgICAgICAxMSwgMTEsIDEwLCAxMCwgIDksICA4LCAgOCwgIDcsCisgICAgICAgNywgIDYsICA2LCAgNSwgIDUsICA0LCAgNCwgIDMsCisgICAgICAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsCisgICAgICAgNywgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsCisgICAgICAxMSwgMTIsIDEyLCAxMiwgMTMsIDE0LCAxNCwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgICAxNSwgfSwKKyAgICB7IDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAgIDEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAgIDEyLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAgICA5LCAgOSwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwKKyAgICAgICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwKKyAgICAgICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKKyAgICAgICA3LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwKKyAgICAgICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwKKyAgICAgIDExLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAgIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwKKyAgICAgIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAgIDE2LAorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18zX2NvZGVzWzNdID0geworICAgIDB4MDAwMywgMHgwMDAwLCAweDAwMDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18zX2JpdHNbM10gPSB7CisgICAgMiwgIDEsICAyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzVfY29kZXNfYVs1XSA9IHsKKyAgICAweDAwMEYsIDB4MDAwNiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwRSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY181X2NvZGVzX2JbNV0gPSB7CisgICAgMHgwMDA3LCAweDAwMDEsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNV9jb2Rlc19jWzVdID0geworICAgIDB4MDAwNywgMHgwMDA1LCAweDAwMDAsIDB4MDAwNCwgMHgwMDA2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNV9iaXRzX2FbNV0gPSB7CisgICAgNCwgIDMsICAxLCAgMiwgIDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY181X2JpdHNfYls1XSA9IHsKKyAgICAzLCAgMiwgIDIsICAyLCAgMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzVfYml0c19jWzVdID0geworICAgIDMsICAzLCAgMSwgIDMsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzdfY29kZXNfYVs3XSA9IHsKKyAgICAweDAwMUUsIDB4MDAwRSwgMHgwMDA1LCAweDAwMDAsIDB4MDAwNiwgMHgwMDA0LCAweDAwMUYsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfN19jb2Rlc19iWzddID0geworICAgIDB4MDAxNCwgMHgwMDBCLCAweDAwMDAsIDB4MDAwMywgMHgwMDAxLCAweDAwMDQsIDB4MDAxNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY183X2NvZGVzX2NbN10gPSB7CisgICAgMHgwMDAwLCAweDAwMDIsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDIsIDB4MDAwMywgMHgwMDAxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfN19iaXRzX2FbN10gPSB7CisgICAgNSwgIDQsICAzLCAgMSwgIDMsICAzLCAgNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzdfYml0c19iWzddID0geworICAgIDUsICA0LCAgMiwgIDIsICAyLCAgMywgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY183X2JpdHNfY1s3XSA9IHsKKyAgICA0LCAgNCwgIDIsICAyLCAgMiwgIDQsICA0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzlfY29kZXNfYVs5XSA9IHsKKyAgICAweDAwMzAsIDB4MDAxOSwgMHgwMDA5LCAweDAwMDUsIDB4MDAwMCwgMHgwMDA3LCAweDAwMEQsIDB4MDAwOCwKKyAgICAweDAwMzEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfOV9jb2Rlc19iWzldID0geworICAgIDB4MDAxOCwgMHgwMDFBLCAweDAwMDIsIDB4MDAwNywgMHgwMDAyLCAweDAwMDAsIDB4MDAwMywgMHgwMDFCLAorICAgIDB4MDAxOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY185X2NvZGVzX2NbOV0gPSB7CisgICAgMHgwMDFDLCAweDAwMEYsIDB4MDAwMiwgMHgwMDA3LCAweDAwMDIsIDB4MDAwMCwgMHgwMDA2LCAweDAwMDYsCisgICAgMHgwMDFELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfOV9iaXRzX2FbOV0gPSB7CisgICAgNiwgIDUsICA0LCAgMywgIDEsICAzLCAgNCwgIDQsICA2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfOV9iaXRzX2JbOV0gPSB7CisgICAgNSwgIDUsICAzLCAgMywgIDIsICAyLCAgMywgIDUsICA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfOV9iaXRzX2NbOV0gPSB7CisgICAgNiwgIDUsICAzLCAgMywgIDIsICAyLCAgMywgIDQsICA2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEzX2NvZGVzX2FbMTNdID0geworICAgIDB4MDA3MCwgMHgwMDJFLCAweDAwMzksIDB4MDAxRCwgMHgwMDBDLCAweDAwMEYsIDB4MDAwMCwgMHgwMDA0LAorICAgIDB4MDAwRCwgMHgwMDBBLCAweDAwMTYsIDB4MDAyRiwgMHgwMDcxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEzX2NvZGVzX2JbMTNdID0geworICAgIDB4MDAzOCwgMHgwMDEwLCAweDAwMUQsIDB4MDAwNywgMHgwMDBGLCAweDAwMDUsIDB4MDAwMCwgMHgwMDA2LAorICAgIDB4MDAwMiwgMHgwMDA5LCAweDAwMDYsIDB4MDAxMSwgMHgwMDM5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEzX2NvZGVzX2NbMTNdID0geworICAgIDB4MDAwNCwgMHgwMDFBLCAweDAwMDMsIDB4MDAwRSwgMHgwMDAwLCAweDAwMDMsIDB4MDAwNSwgMHgwMDA0LAorICAgIDB4MDAwMiwgMHgwMDBGLCAweDAwMEMsIDB4MDAxQiwgMHgwMDA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTNfYml0c19hWzEzXSA9IHsKKyAgICAgNywgIDYsICA2LCAgNSwgIDQsICA0LCAgMSwgIDMsICA0LCAgNCwgIDUsICA2LCAgNywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEzX2JpdHNfYlsxM10gPSB7CisgICAgIDYsICA1LCAgNSwgIDQsICA0LCAgMywgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDYsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xM19iaXRzX2NbMTNdID0geworICAgICA1LCAgNSwgIDQsICA0LCAgMywgIDMsICAzLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzE3X2NvZGVzX2FbMTddID0geworICAgIDB4MDE1NCwgMHgwMEFCLCAweDAwMkIsIDB4MDAwQiwgMHgwMDAzLCAweDAwMEEsIDB4MDAwMSwgMHgwMDA2LAorICAgIDB4MDAwMSwgMHgwMDA3LCAweDAwMDQsIDB4MDAwQiwgMHgwMDAwLCAweDAwMDQsIDB4MDAxNCwgMHgwMDU0LAorICAgIDB4MDE1NSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xN19jb2Rlc19iWzE3XSA9IHsKKyAgICAweDAwN0MsIDB4MDAzRiwgMHgwMDE5LCAweDAwMEQsIDB4MDAxQywgMHgwMDA4LCAweDAwMEYsIDB4MDAwNSwKKyAgICAweDAwMDAsIDB4MDAwNiwgMHgwMDAyLCAweDAwMDksIDB4MDAxRCwgMHgwMDBFLCAweDAwMUUsIDB4MDAxOCwKKyAgICAweDAwN0QsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTdfY29kZXNfY1sxN10gPSB7CisgICAgMHgwMDJDLCAweDAwMTcsIDB4MDAwNSwgMHgwMDFDLCAweDAwMDMsIDB4MDAwQSwgMHgwMDBGLCAweDAwMDMsCisgICAgMHgwMDA2LCAweDAwMDQsIDB4MDAwMCwgMHgwMDBCLCAweDAwMDQsIDB4MDAxRCwgMHgwMDBBLCAweDAwMDQsCisgICAgMHgwMDJELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzE3X2NvZGVzX2RbMTddID0geworICAgIDB4MDEwMCwgMHgwMTAyLCAweDAwODIsIDB4MDA0MiwgMHgwMDIyLCAweDAwMTIsIDB4MDAwQSwgMHgwMDA2LAorICAgIDB4MDAwMCwgMHgwMDA3LCAweDAwMEIsIDB4MDAxMywgMHgwMDIzLCAweDAwNDMsIDB4MDA4MywgMHgwMTAzLAorICAgIDB4MDEwMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xN19jb2Rlc19lWzE3XSA9IHsKKyAgICAweDAwRTgsIDB4MDBGNiwgMHgwMDc1LCAweDAwMzQsIDB4MDAzQiwgMHgwMDFCLCAweDAwMUYsIDB4MDAwNCwKKyAgICAweDAwMDAsIDB4MDAwNSwgMHgwMDBDLCAweDAwMUMsIDB4MDAzQywgMHgwMDM1LCAweDAwN0EsIDB4MDBGNywKKyAgICAweDAwRTksCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTdfY29kZXNfZlsxN10gPSB7CisgICAgMHgwMDA0LCAweDAwMDMsIDB4MDAxRSwgMHgwMDAxLCAweDAwMDEsIDB4MDAwRSwgMHgwMDAxLCAweDAwMDQsCisgICAgMHgwMDA2LCAweDAwMDUsIDB4MDAwMiwgMHgwMDBGLCAweDAwMDYsIDB4MDAwRSwgMHgwMDFGLCAweDAwMDAsCisgICAgMHgwMDA1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzE3X2NvZGVzX2dbMTddID0geworICAgIDB4MDA2MCwgMHgwMDdFLCAweDAwMzEsIDB4MDAxOSwgMHgwMDBELCAweDAwMDQsIDB4MDAwMCwgMHgwMDA2LAorICAgIDB4MDAwMiwgMHgwMDA3LCAweDAwMDEsIDB4MDAwNSwgMHgwMDBFLCAweDAwMUUsIDB4MDAzRSwgMHgwMDdGLAorICAgIDB4MDA2MSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzE3X2JpdHNfYVsxN10gPSB7CisgICAgMTIsIDExLCAgOSwgIDcsICA1LCAgNCwgIDMsICAzLCAgMiwgIDMsICAzLCAgNCwgIDQsICA2LCAgOCwgMTAsCisgICAgMTIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xN19iaXRzX2JbMTddID0geworICAgIDgsICA3LCAgNiwgIDUsICA1LCAgNCwgIDQsICAzLCAgMiwgIDMsICAzLCAgNCwgIDUsICA1LCAgNiwgIDYsCisgICAgOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzE3X2JpdHNfY1sxN10gPSB7CisgICAgNywgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDMsICAzLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwKKyAgICA3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTdfYml0c19kWzE3XSA9IHsKKyAgICA5LCAgOSwgIDgsICA3LCAgNiwgIDUsICA0LCAgMywgIDEsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LAorICAgIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xN19iaXRzX2VbMTddID0geworICAgIDgsICA4LCAgNywgIDYsICA2LCAgNSwgIDUsICAzLCAgMSwgIDMsICA0LCAgNSwgIDYsICA2LCAgNywgIDgsCisgICAgOCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzE3X2JpdHNfZlsxN10gPSB7CisgICAgOCwgIDcsICA2LCAgNSwgIDQsICA0LCAgMywgIDMsICAzLCAgMywgIDMsICA0LCAgNCwgIDUsICA2LCAgNiwKKyAgICA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTdfYml0c19nWzE3XSA9IHsKKyAgICA4LCAgOCwgIDcsICA2LCAgNSwgIDQsICAzLCAgMywgIDIsICAzLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorICAgIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMjVfY29kZXNfYVsyNV0gPSB7CisgICAgMHgyODU0LCAweDE0MkIsIDB4MDUwQiwgMHgwMTQzLCAweDAwQTIsIDB4MDA1MiwgMHgwMDJFLCAweDAwMTUsCisgICAgMHgwMDA0LCAweDAwMEUsIDB4MDAwMCwgMHgwMDAzLCAweDAwMDYsIDB4MDAwNCwgMHgwMDAxLCAweDAwMEYsCisgICAgMHgwMDA1LCAweDAwMTYsIDB4MDAyRiwgMHgwMDUzLCAweDAwQTMsIDB4MDBBMCwgMHgwMjg0LCAweDBBMTQsCisgICAgMHgyODU1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzI1X2NvZGVzX2JbMjVdID0geworICAgIDB4MDAxQywgMHgwMDBGLCAweDAwMDUsIDB4MDAwMCwgMHgwMDMwLCAweDAwMzYsIDB4MDAwRSwgMHgwMDE5LAorICAgIDB4MDAwMSwgMHgwMDA4LCAweDAwMEUsIDB4MDAwMSwgMHgwMDA1LCAweDAwMDIsIDB4MDAwRiwgMHgwMDA5LAorICAgIDB4MDAwNiwgMHgwMDFBLCAweDAwMEYsIDB4MDAzNywgMHgwMDMxLCAweDAwMDEsIDB4MDAwNiwgMHgwMDA0LAorICAgIDB4MDAxRCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18yNV9jb2Rlc19jWzI1XSA9IHsKKyAgICAweDAwNEMsIDB4MDAyNywgMHgwMDZELCAweDAwMjgsIDB4MDAzNywgMHgwMDBFLCAweDAwMTUsIDB4MDAwMCwKKyAgICAweDAwMDUsIDB4MDAwOCwgMHgwMDBCLCAweDAwMEUsIDB4MDAwMSwgMHgwMDBGLCAweDAwMEMsIDB4MDAwOSwKKyAgICAweDAwMDYsIDB4MDAwMSwgMHgwMDFBLCAweDAwMEYsIDB4MDAwOCwgMHgwMDI5LCAweDAwMTIsIDB4MDA2QywKKyAgICAweDAwNEQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMjVfY29kZXNfZFsyNV0gPSB7CisgICAgMHgwNzgwLCAweDA3ODIsIDB4MDNDMiwgMHgwMUUyLCAweDAwRkUsIDB4MDA3OSwgMHgwMDNELCAweDAwMUMsCisgICAgMHgwMDBDLCAweDAwMDQsIDB4MDAwMCwgMHgwMDA2LCAweDAwMDIsIDB4MDAwNywgMHgwMDAxLCAweDAwMDUsCisgICAgMHgwMDBELCAweDAwMUQsIDB4MDAzRSwgMHgwMDdFLCAweDAwRkYsIDB4MDFFMywgMHgwM0MzLCAweDA3ODMsCisgICAgMHgwNzgxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzI1X2NvZGVzX2VbMjVdID0geworICAgIDB4MDAzQywgMHgwMDkyLCAweDAwMTgsIDB4MDAxRiwgMHgwMDRFLCAweDAwMEQsIDB4MDAyNSwgMHgwMDA0LAorICAgIDB4MDAxMCwgMHgwMDAwLCAweDAwMEEsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDMsIDB4MDAwQiwgMHgwMDAxLAorICAgIDB4MDAxMSwgMHgwMDA1LCAweDAwMjYsIDB4MDAwRSwgMHgwMDRGLCAweDAwNDgsIDB4MDAxOSwgMHgwMDkzLAorICAgIDB4MDAzRCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18yNV9jb2Rlc19mWzI1XSA9IHsKKyAgICAweDAzMjQsIDB4MDE5MywgMHgwMENFLCAweDAwNjUsIDB4MDAyNCwgMHgwMDBDLCAweDAwMTMsIDB4MDAwNCwKKyAgICAweDAwMDcsIDB4MDAwQSwgMHgwMDBELCAweDAwMEYsIDB4MDAwMSwgMHgwMDAwLCAweDAwMEUsIDB4MDAwQiwKKyAgICAweDAwMDgsIDB4MDAwNSwgMHgwMDE4LCAweDAwMEQsIDB4MDAyNSwgMHgwMDY2LCAweDAwQ0YsIDB4MDBDOCwKKyAgICAweDAzMjUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMjVfY29kZXNfZ1syNV0gPSB7CisgICAgMHgwM0E4LCAweDAzQUUsIDB4MDFENSwgMHgwMDk0LCAweDAwMTQsIDB4MDA0QiwgMHgwMDBCLCAweDAwM0IsCisgICAgMHgwMDEzLCAweDAwMDMsIDB4MDAwRiwgMHgwMDA1LCAweDAwMDEsIDB4MDAwNiwgMHgwMDAwLCAweDAwMDgsCisgICAgMHgwMDFDLCAweDAwMDQsIDB4MDAyNCwgMHgwMDc0LCAweDAwMTUsIDB4MDA5NSwgMHgwMUQ2LCAweDAzQUYsCisgICAgMHgwM0E5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMjVfYml0c19hWzI1XSA9IHsKKyAgICAxNCwgMTMsIDExLCAgOSwgIDgsICA3LCAgNiwgIDUsICA0LCAgNCwgIDMsICAzLCAgMywgIDMsICAzLCAgNCwKKyAgICAgNCwgIDUsICA2LCAgNywgIDgsICA4LCAxMCwgMTIsIDE0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMjVfYml0c19iWzI1XSA9IHsKKyAgICA5LCAgOCwgIDcsICA2LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDMsICAzLCAgMywgIDQsICA0LAorICAgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzI1X2JpdHNfY1syNV0gPSB7CisgICAgOCwgIDcsICA3LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LCAgMywgIDQsICA0LCAgNCwKKyAgICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNywgIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2RbMjVdID0geworICAgIDEyLCAxMiwgMTEsIDEwLCAgOSwgIDgsICA3LCAgNiwgIDUsICA0LCAgMywgIDMsICAyLCAgMywgIDMsICA0LAorICAgICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2VbMjVdID0geworICAgIDgsICA4LCAgNywgIDcsICA3LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgMywgIDIsICAzLCAgNCwgIDQsCisgICAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMjVfYml0c19mWzI1XSA9IHsKKyAgICAxMCwgIDksICA4LCAgNywgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LCAgMywgIDMsICA0LCAgNCwKKyAgICAgNCwgIDQsICA1LCAgNSwgIDYsICA3LCAgOCwgIDgsIDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMjVfYml0c19nWzI1XSA9IHsKKyAgICAxMCwgMTAsICA5LCAgOCwgIDcsICA3LCAgNiwgIDYsICA1LCAgNCwgIDQsICAzLCAgMiwgIDMsICAzLCAgNCwKKyAgICAgNSwgIDUsICA2LCAgNywgIDcsICA4LCAgOSwgMTAsIDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzMzX2NvZGVzX2FbMzNdID0geworICAgIDB4MTU4MCwgMHgxNTgyLCAweDBBQzIsIDB4MDU2MiwgMHgwMkIyLCAweDAxNUUsIDB4MDBBRCwgMHgwMDU0LAorICAgIDB4MDAxQywgMHgwMDNDLCAweDAwMEYsIDB4MDAxRiwgMHgwMDA4LCAweDAwMEIsIDB4MDAwRCwgMHgwMDAwLAorICAgIDB4MDAwMiwgMHgwMDAxLCAweDAwMEUsIDB4MDAwQywgMHgwMDA5LCAweDAwMDYsIDB4MDAxNCwgMHgwMDNELAorICAgIDB4MDAxRCwgMHgwMDU1LCAweDAwQUUsIDB4MDE1RiwgMHgwMkIzLCAweDA1NjMsIDB4MEFDMywgMHgxNTgzLAorICAgIDB4MTU4MSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18zM19jb2Rlc19iWzMzXSA9IHsKKyAgICAweDAzMEMsIDB4MDE4NywgMHgwMDZELCAweDAwMjgsIDB4MDAzNywgMHgwMDY2LCAweDAwMTUsIDB4MDAzMSwKKyAgICAweDAwMDAsIDB4MDAwQiwgMHgwMDEyLCAweDAwMUEsIDB4MDAwMSwgMHgwMDA3LCAweDAwMEEsIDB4MDAwRSwKKyAgICAweDAwMDEsIDB4MDAwRiwgMHgwMDBCLCAweDAwMDgsIDB4MDAwNCwgMHgwMDFCLCAweDAwMTMsIDB4MDAwQywKKyAgICAweDAwMDEsIDB4MDAzMiwgMHgwMDFBLCAweDAwNjcsIDB4MDA2MCwgMHgwMDI5LCAweDAwQzIsIDB4MDA2QywKKyAgICAweDAzMEQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMzNfY29kZXNfY1szM10gPSB7CisgICAgMHgwMENDLCAweDAwNjcsIDB4MDAwNSwgMHgwMDcwLCAweDAwMDMsIDB4MDAxQSwgMHgwMDM5LCAweDAwM0YsCisgICAgMHgwMDBBLCAweDAwMTIsIDB4MDAxOCwgMHgwMDFELCAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMEEsCisgICAgMHgwMDBELCAweDAwMEIsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDIsIDB4MDAxRSwgMHgwMDE5LCAweDAwMTMsCisgICAgMHgwMDBCLCAweDAwMDAsIDB4MDAzRSwgMHgwMDFCLCAweDAwMTgsIDB4MDA3MSwgMHgwMDMyLCAweDAwMDQsCisgICAgMHgwMENELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzMzX2NvZGVzX2RbMzNdID0geworICAgIDB4M0FGOCwgMHgzQUZBLCAweDFEN0UsIDB4MEVCQywgMHgwNzVDLCAweDAzQUMsIDB4MDFENCwgMHgwMDk0LAorICAgIDB4MDAxNCwgMHgwMDRCLCAweDAwMEIsIDB4MDAzQiwgMHgwMDEzLCAweDAwMDMsIDB4MDAwRiwgMHgwMDA1LAorICAgIDB4MDAwMSwgMHgwMDA2LCAweDAwMDAsIDB4MDAwOCwgMHgwMDFDLCAweDAwMDQsIDB4MDAyNCwgMHgwMDc0LAorICAgIDB4MDAxNSwgMHgwMDk1LCAweDAxRDUsIDB4MDNBRCwgMHgwNzVELCAweDBFQkQsIDB4MUQ3RiwgMHgzQUZCLAorICAgIDB4M0FGOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18zM19jb2Rlc19lWzMzXSA9IHsKKyAgICAweDAxQzgsIDB4MDFFNiwgMHgwMDY0LCAweDAwRTIsIDB4MDBFNSwgMHgwMDMwLCAweDAwMzMsIDB4MDA3MywKKyAgICAweDAwN0EsIDB4MDAxQSwgMHgwMDNBLCAweDAwMDIsIDB4MDAxQSwgMHgwMDFGLCAweDAwMDcsIDB4MDAwMSwKKyAgICAweDAwMDIsIDB4MDAwMiwgMHgwMDBDLCAweDAwMDAsIDB4MDAxQiwgMHgwMDAzLCAweDAwM0IsIDB4MDAxQiwKKyAgICAweDAwN0IsIDB4MDA3OCwgMHgwMDcwLCAweDAwMzEsIDB4MDBGMiwgMHgwMEUzLCAweDAwNjUsIDB4MDFFNywKKyAgICAweDAxQzksCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMzNfY29kZXNfZlszM10gPSB7CisgICAgMHgwNzI0LCAweDAzOTMsIDB4MDFDRSwgMHgwMEU1LCAweDAwMkMsIDB4MDAwOCwgMHgwMDE3LCAweDAwM0UsCisgICAgMHgwMDA1LCAweDAwMTQsIDB4MDAxRCwgMHgwMDAwLCAweDAwMDMsIDB4MDAwNiwgMHgwMDA4LCAweDAwMEIsCisgICAgMHgwMDBELCAweDAwMEMsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDQsIDB4MDAwMSwgMHgwMDFFLCAweDAwMTUsCisgICAgMHgwMDBBLCAweDAwM0YsIDB4MDAzOCwgMHgwMDA5LCAweDAwMkQsIDB4MDBFNiwgMHgwMUNGLCAweDAxQzgsCisgICAgMHgwNzI1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzMzX2NvZGVzX2dbMzNdID0geworICAgIDB4MDI4NCwgMHgwMDQyLCAweDAxNDAsIDB4MDE0MywgMHgwMDNFLCAweDAwQkUsIDB4MDAxMSwgMHgwMDUxLAorICAgIDB4MDAwOSwgMHgwMDI5LCAweDAwMDUsIDB4MDAxNSwgMHgwMDAwLCAweDAwMDgsIDB4MDAwRSwgMHgwMDAyLAorICAgIDB4MDAwNiwgMHgwMDAzLCAweDAwMEYsIDB4MDAwOSwgMHgwMDAxLCAweDAwMTYsIDB4MDAwNiwgMHgwMDJFLAorICAgIDB4MDAwRSwgMHgwMDVFLCAweDAwMUUsIDB4MDBCRiwgMHgwMDNGLCAweDAwMjAsIDB4MDE0MSwgMHgwMDQzLAorICAgIDB4MDI4NSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzMzX2JpdHNfYVszM10gPSB7CisgICAgMTMsIDEzLCAxMiwgMTEsIDEwLCAgOSwgIDgsICA3LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDMsCisgICAgIDMsICAzLCAgNCwgIDQsICA0LCAgNCwgIDUsICA2LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsCisgICAgMTMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18zM19iaXRzX2JbMzNdID0geworICAgIDEwLCAgOSwgIDgsICA3LCAgNywgIDcsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA0LCAgNCwgIDQsICA0LAorICAgICAzLCAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LAorICAgIDEwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMzNfYml0c19jWzMzXSA9IHsKKyAgICA5LCAgOCwgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA0LCAgNCwgIDQsICA0LAorICAgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsCisgICAgOSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzMzX2JpdHNfZFszM10gPSB7CisgICAgMTQsIDE0LCAxMywgMTIsIDExLCAxMCwgIDksICA4LCAgNywgIDcsICA2LCAgNiwgIDUsICA0LCAgNCwgIDMsCisgICAgIDIsICAzLCAgMywgIDQsICA1LCAgNSwgIDYsICA3LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgMTQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18zM19iaXRzX2VbMzNdID0geworICAgIDksICA5LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNSwgIDUsICA1LCAgNCwgIDMsCisgICAgMiwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwKKyAgICA5LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMzNfYml0c19mWzMzXSA9IHsKKyAgICAxMSwgMTAsICA5LCAgOCwgIDcsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA0LCAgNCwgIDQsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDgsICA5LCAgOSwKKyAgICAxMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzMzX2JpdHNfZ1szM10gPSB7CisgICAgMTAsICA5LCAgOSwgIDksICA4LCAgOCwgIDcsICA3LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDMsCisgICAgIDMsICAzLCAgNCwgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksCisgICAgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNjVfY29kZXNfYVs2NV0gPSB7CisgICAgMHg5RTVDLCAweDlFNUUsIDB4NEYyQywgMHgyNzk0LCAweDEzQzQsIDB4MUU0NCwgMHgwOUUzLCAweDBGMjMsCisgICAgMHgwNEYzLCAweDA3OTIsIDB4MDI3RSwgMHgwM0NFLCAweDAxM0QsIDB4MDFFNSwgMHgwMDlDLCAweDAwQ0MsCisgICAgMHgwMDQwLCAweDAwNTgsIDB4MDA2NywgMHgwMDFFLCAweDAwMjEsIDB4MDAyRCwgMHgwMDNELCAweDAwMDcsCisgICAgMHgwMDExLCAweDAwMTQsIDB4MDAxNywgMHgwMDFBLCAweDAwMUMsIDB4MDAxRiwgMHgwMDAxLCAweDAwMDQsCisgICAgMHgwMDA2LCAweDAwMDUsIDB4MDAwMiwgMHgwMDAwLCAweDAwMUQsIDB4MDAxQiwgMHgwMDE4LCAweDAwMTUsCisgICAgMHgwMDEyLCAweDAwMEUsIDB4MDAwNiwgMHgwMDMyLCAweDAwMjYsIDB4MDAxRiwgMHgwMDc4LCAweDAwNTksCisgICAgMHgwMDQxLCAweDAwQ0QsIDB4MDA5RCwgMHgwMUU2LCAweDAxM0UsIDB4MDNDRiwgMHgwMjdGLCAweDA3OTMsCisgICAgMHgwNzkwLCAweDA0RjAsIDB4MDlFNCwgMHgxRTQ1LCAweDEzQzUsIDB4Mjc5NSwgMHg0RjJELCAweDlFNUYsCisgICAgMHg5RTVELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzY1X2NvZGVzX2JbNjVdID0geworICAgIDB4MEE4QywgMHgwNTQ3LCAweDAxQjUsIDB4MDAwOCwgMHgwMERCLCAweDAxNTIsIDB4MDAwNSwgMHgwMDBCLAorICAgIDB4MDA4RSwgMHgwMEFFLCAweDAwRTQsIDB4MDAwMywgMHgwMDM3LCAweDAwMzksIDB4MDA1NSwgMHgwMDZDLAorICAgIDB4MDA3MywgMHgwMDAzLCAweDAwMTUsIDB4MDAxRCwgMHgwMDI4LCAweDAwMzAsIDB4MDAzNywgMHgwMDNFLAorICAgIDB4MDAwNiwgMHgwMDBCLCAweDAwMEYsIDB4MDAxMiwgMHgwMDE2LCAweDAwMTksIDB4MDAxRCwgMHgwMDAxLAorICAgIDB4MDAwNCwgMHgwMDAyLCAweDAwMUUsIDB4MDAxQSwgMHgwMDE3LCAweDAwMTMsIDB4MDAxMCwgMHgwMDBDLAorICAgIDB4MDAwNywgMHgwMDNGLCAweDAwMzgsIDB4MDAzMSwgMHgwMDI5LCAweDAwMjIsIDB4MDAxQSwgMHgwMDE0LAorICAgIDB4MDAwMCwgMHgwMDZELCAweDAwNTYsIDB4MDA0NiwgMHgwMDM4LCAweDAwMDQsIDB4MDBFNSwgMHgwMEFGLAorICAgIDB4MDA4RiwgMHgwMDZDLCAweDAwMEEsIDB4MDE1MywgMHgwMTUwLCAweDAwMDksIDB4MDJBMiwgMHgwMUI0LAorICAgIDB4MEE4RCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY182NV9jb2Rlc19jWzY1XSA9IHsKKyAgICAweDA0NUMsIDB4MDIyRiwgMHgwM0Y1LCAweDAxQkMsIDB4MDFGQiwgMHgwMDU5LCAweDAwRDAsIDB4MDBERiwKKyAgICAweDAwMEEsIDB4MDAyRCwgMHgwMDJGLCAweDAwNTIsIDB4MDA2OSwgMHgwMDc4LCAweDAwN0YsIDB4MDAwQSwKKyAgICAweDAwMTAsIDB4MDAxQywgMHgwMDIzLCAweDAwMkEsIDB4MDAzNSwgMHgwMDNBLCAweDAwM0QsIDB4MDAwMCwKKyAgICAweDAwMDMsIDB4MDAwNiwgMHgwMDA5LCAweDAwMEMsIDB4MDAwRiwgMHgwMDEyLCAweDAwMTYsIDB4MDAxOCwKKyAgICAweDAwMUMsIDB4MDAxOSwgMHgwMDE3LCAweDAwMTMsIDB4MDAxMCwgMHgwMDBELCAweDAwMEEsIDB4MDAwNywKKyAgICAweDAwMDQsIDB4MDAwMSwgMHgwMDNFLCAweDAwM0IsIDB4MDAzNiwgMHgwMDJCLCAweDAwMjgsIDB4MDAxRCwKKyAgICAweDAwMTEsIDB4MDAwQiwgMHgwMDA0LCAweDAwNzksIDB4MDA2RSwgMHgwMDUzLCAweDAwNDQsIDB4MDAyRSwKKyAgICAweDAwMEIsIDB4MDBGQywgMHgwMEQxLCAweDAwOEEsIDB4MDA1OCwgMHgwMUJELCAweDAxMTYsIDB4MDNGNCwKKyAgICAweDA0NUQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNjVfY29kZXNfZFs2NV0gPSB7CisgICAgMHg3MEIwLCAweDcwQjIsIDB4NzBCNCwgMHgyODUyLCAweDM4NUIsIDB4MTQyRSwgMHgxQzJFLCAweDBBMTUsCisgICAgMHgwRTE0LCAweDAyMTQsIDB4MDcwNCwgMHgwMTA0LCAweDAxMEIsIDB4MDM4MywgMHgwMDgzLCAweDAxNDMsCisgICAgMHgwMUMzLCAweDAwNDMsIDB4MDBBMiwgMHgwMEUyLCAweDAwMjIsIDB4MDA1MiwgMHgwMDcyLCAweDAwMTIsCisgICAgMHgwMDJBLCAweDAwM0EsIDB4MDAwQSwgMHgwMDE2LCAweDAwMUUsIDB4MDAwNiwgMHgwMDBDLCAweDAwMDAsCisgICAgMHgwMDA0LCAweDAwMDEsIDB4MDAwRCwgMHgwMDA3LCAweDAwMUYsIDB4MDAxNywgMHgwMDBCLCAweDAwM0IsCisgICAgMHgwMDJCLCAweDAwMTMsIDB4MDA3MywgMHgwMDUzLCAweDAwMjMsIDB4MDBFMywgMHgwMEEzLCAweDAwQTAsCisgICAgMHgwMDQwLCAweDAxQzAsIDB4MDA4NCwgMHgwMzg0LCAweDAyODQsIDB4MDEwNSwgMHgwNzA1LCAweDAyMTUsCisgICAgMHgwRTE1LCAweDBBMTYsIDB4MUMyRiwgMHgxNDJGLCAweDE0MjgsIDB4Mjg1MywgMHg3MEI1LCAweDcwQjMsCisgICAgMHg3MEIxLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzY1X2NvZGVzX2VbNjVdID0geworICAgIDB4MDMyQywgMHgwMzMyLCAweDAzNzgsIDB4MDM3RSwgMHgwMDhDLCAweDAxNEEsIDB4MDE4OCwgMHgwMTk3LAorICAgIDB4MDE5RSwgMHgwMUJELCAweDAwNDQsIDB4MDA0NywgMHgwMEFBLCAweDAwQzUsIDB4MDBDRCwgMHgwMERDLAorICAgIDB4MDAxQywgMHgwMDJDLCAweDAwNTMsIDB4MDA2MywgMHgwMDY4LCAweDAwMDgsIDB4MDAwRiwgMHgwMDE3LAorICAgIDB4MDAyQiwgMHgwMDM1LCAweDAwMDUsIDB4MDAwOSwgMHgwMDE2LCAweDAwMUMsIDB4MDAwNiwgMHgwMDBGLAorICAgIDB4MDAwNCwgMHgwMDAwLCAweDAwMDcsIDB4MDAxRCwgMHgwMDE3LCAweDAwMEEsIDB4MDAwNiwgMHgwMDM2LAorICAgIDB4MDAzMCwgMHgwMDI4LCAweDAwMTAsIDB4MDAwOSwgMHgwMDY5LCAweDAwNjQsIDB4MDA1NCwgMHgwMDJELAorICAgIDB4MDAxRCwgMHgwMERELCAweDAwQ0UsIDB4MDBDQSwgMHgwMEFCLCAweDAwQTQsIDB4MDA0NSwgMHgwMUJFLAorICAgIDB4MDE5RiwgMHgwMTk4LCAweDAxODksIDB4MDE0QiwgMHgwMDhELCAweDAzN0YsIDB4MDM3OSwgMHgwMzMzLAorICAgIDB4MDMyRCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY182NV9jb2Rlc19mWzY1XSA9IHsKKyAgICAweDBGRTAsIDB4MEZFMiwgMHgwRkU4LCAweDBGRUEsIDB4MEZFQywgMHgwRkVFLCAweDBGRjAsIDB4MEZGMiwKKyAgICAweDBGRjQsIDB4MkZGMiwgMHgwN0YyLCAweDA3RkIsIDB4MDNGNiwgMHgwQkZBLCAweDBCRkQsIDB4MDFGRiwKKyAgICAweDA1RkYsIDB4MDJGQywgMHgwMDdDLCAweDAxN0MsIDB4MDAzQywgMHgwMEJDLCAweDAwMUMsIDB4MDA1QywKKyAgICAweDAwMEMsIDB4MDAyQywgMHgwMDA0LCAweDAwMTQsIDB4MDAwMCwgMHgwMDA4LCAweDAwMEUsIDB4MDAwMiwKKyAgICAweDAwMDYsIDB4MDAwMywgMHgwMDBGLCAweDAwMDksIDB4MDAwMSwgMHgwMDE1LCAweDAwMDUsIDB4MDAyRCwKKyAgICAweDAwMEQsIDB4MDA1RCwgMHgwMDFELCAweDAwQkQsIDB4MDAzRCwgMHgwMTdELCAweDAwN0QsIDB4MDJGRCwKKyAgICAweDAwRkMsIDB4MDVGQywgMHgwMUZBLCAweDBCRkIsIDB4MDNGNywgMHgxN0Y4LCAweDA3RjMsIDB4MkZGMywKKyAgICAweDBGRjUsIDB4MEZGMywgMHgwRkYxLCAweDBGRUYsIDB4MEZFRCwgMHgwRkVCLCAweDBGRTksIDB4MEZFMywKKyAgICAweDBGRTEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNjVfY29kZXNfZ1s2NV0gPSB7CisgICAgMHgwMTBDLCAweDAzOEEsIDB4MDYwOCwgMHgwNzg2LCAweDAwODQsIDB4MDA4NywgMHgwMzAyLCAweDAzMDUsCisgICAgMHgwMDQwLCAweDAwRTAsIDB4MDBFMywgMHgwMTgzLCAweDAwMUUsIDB4MDA1RSwgMHgwMDlFLCAweDAwREUsCisgICAgMHgwMEYxLCAweDAwMTEsIDB4MDAzOSwgMHgwMDYxLCAweDAwNzksIDB4MDAwOSwgMHgwMDFELCAweDAwMzEsCisgICAgMHgwMDNELCAweDAwMDUsIDB4MDAwRiwgMHgwMDE5LCAweDAwMUYsIDB4MDAwMywgMHgwMDA2LCAweDAwMEEsCisgICAgMHgwMDBFLCAweDAwMEIsIDB4MDAwOCwgMHgwMDA0LCAweDAwMDAsIDB4MDAxQSwgMHgwMDEyLCAweDAwMEEsCisgICAgMHgwMDAyLCAweDAwMzYsIDB4MDAyNiwgMHgwMDE2LCAweDAwMDYsIDB4MDA2RSwgMHgwMDRFLCAweDAwMkUsCisgICAgMHgwMDBFLCAweDAwREYsIDB4MDA5RiwgMHgwMDVGLCAweDAwMUYsIDB4MDFFMCwgMHgwMTgwLCAweDAwRTEsCisgICAgMHgwMDQxLCAweDAzQzIsIDB4MDMwMywgMHgwMUM0LCAweDAwODUsIDB4MDc4NywgMHgwNjA5LCAweDAzOEIsCisgICAgMHgwMTBELAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNjVfYml0c19hWzY1XSA9IHsKKyAgICAxNiwgMTYsIDE1LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsIDEwLCAgOSwgIDksICA4LCAgOCwKKyAgICAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgNywKKyAgICAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEzLCAxMywgMTQsIDE1LCAxNiwKKyAgICAxNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzY1X2JpdHNfYls2NV0gPSB7CisgICAgMTIsIDExLCAxMCwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsCisgICAgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDQsCisgICAgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsCisgICAgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAxMCwgMTAsCisgICAgMTIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY182NV9iaXRzX2NbNjVdID0geworICAgIDExLCAxMCwgMTAsICA5LCAgOSwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA2LAorICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAorICAgICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLAorICAgIDExLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNjVfYml0c19kWzY1XSA9IHsKKyAgICAxNSwgMTUsIDE1LCAxNCwgMTQsIDEzLCAxMywgMTIsIDEyLCAxMSwgMTEsIDEwLCAxMCwgMTAsICA5LCAgOSwKKyAgICAgOSwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDQsICA0LCAgMywKKyAgICAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOCwKKyAgICAgOCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE1LCAxNSwKKyAgICAxNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzY1X2JpdHNfZVs2NV0gPSB7CisgICAgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNCwgIDQsCisgICAgIDMsICAzLCAgNCwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsCisgICAgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgICAgMTAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY182NV9iaXRzX2ZbNjVdID0geworICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTIsIDExLAorICAgIDExLCAxMCwgIDksICA5LCAgOCwgIDgsICA3LCAgNywgIDYsICA2LCAgNSwgIDUsICA0LCAgNCwgIDQsICAzLAorICAgICAzLCAgMywgIDQsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNjVfYml0c19nWzY1XSA9IHsKKyAgICAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKKyAgICAgNywgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwKKyAgICAxMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xMjlfY29kZXNfYVsxMjldID0geworICAgIDB4MDY2MCwgMHgwNjY2LCAweDA2RUMsIDB4MDcyMiwgMHgwNzYwLCAweDA3NkUsIDB4MDA0QywgMHgwMDRFLAorICAgIDB4MDBGNCwgMHgwMTBBLCAweDAxNDgsIDB4MDE1NiwgMHgwMUQ0LCAweDAxRjIsIDB4MDMzMSwgMHgwMzcwLAorICAgIDB4MDM3NywgMHgwMzk2LCAweDAzQjEsIDB4MDAyNCwgMHgwMDY0LCAweDAwN0IsIDB4MDA4QSwgMHgwMEE1LAorICAgIDB4MDBENCwgMHgwMEVCLCAweDAwRkEsIDB4MDE5QSwgMHgwMUI5LCAweDAxQzksIDB4MDFEOSwgMHgwMDEwLAorICAgIDB4MDAzMCwgMHgwMDMzLCAweDAwNDMsIDB4MDA1MywgMHgwMDZCLCAweDAwN0EsIDB4MDBDQSwgMHgwMEQyLAorICAgIDB4MDBERSwgMHgwMEU2LCAweDAwRjYsIDB4MDAwRSwgMHgwMDFGLCAweDAwMjMsIDB4MDAyQiwgMHgwMDNCLAorICAgIDB4MDAzRiwgMHgwMDY3LCAweDAwNzAsIDB4MDA3NywgMHgwMDA1LCAweDAwMEQsIDB4MDAxMiwgMHgwMDFCLAorICAgIDB4MDAyQywgMHgwMDM1LCAweDAwM0EsIDB4MDAwNCwgMHgwMDBCLCAweDAwMTcsIDB4MDAxRiwgMHgwMDA5LAorICAgIDB4MDAwOCwgMHgwMDBBLCAweDAwMDAsIDB4MDAxOCwgMHgwMDBDLCAweDAwMDUsIDB4MDAzQywgMHgwMDM2LAorICAgIDB4MDAyRCwgMHgwMDFDLCAweDAwMTMsIDB4MDAwRSwgMHgwMDA2LCAweDAwN0EsIDB4MDA3MSwgMHgwMDY4LAorICAgIDB4MDA2NCwgMHgwMDNDLCAweDAwMzQsIDB4MDAyOCwgMHgwMDIwLCAweDAwMEYsIDB4MDBGNywgMHgwMEU3LAorICAgIDB4MDBERiwgMHgwMEQzLCAweDAwQ0IsIDB4MDA3QiwgMHgwMDc0LCAweDAwNTQsIDB4MDA0NCwgMHgwMDNDLAorICAgIDB4MDAzMSwgMHgwMDExLCAweDAxREEsIDB4MDFDQSwgMHgwMUJBLCAweDAxOUIsIDB4MDBGQiwgMHgwMEY4LAorICAgIDB4MDBENSwgMHgwMEFBLCAweDAwOEIsIDB4MDA4NCwgMHgwMDY1LCAweDAwMjUsIDB4MDNCNiwgMHgwMzk3LAorICAgIDB4MDM5MCwgMHgwMzcxLCAweDAzMzIsIDB4MDFGMywgMHgwMUQ1LCAweDAxNTcsIDB4MDE0OSwgMHgwMTBCLAorICAgIDB4MDBGNSwgMHgwMDRGLCAweDAwNEQsIDB4MDc2RiwgMHgwNzYxLCAweDA3MjMsIDB4MDZFRCwgMHgwNjY3LAorICAgIDB4MDY2MSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xMjlfY29kZXNfYlsxMjldID0geworICAgIDB4MjlEQywgMHgxNEVGLCAweDA0NTUsIDB4MEU5QywgMHgwMjJCLCAweDA0ODksIDB4MDc0MCwgMHgwNzRGLAorICAgIDB4MDE3MiwgMHgwMjQ1LCAweDAyNDcsIDB4MDMwQSwgMHgwM0ExLCAweDAwMUMsIDB4MDA4QiwgMHgwMEQ2LAorICAgIDB4MDEwQywgMHgwMTQ4LCAweDAxNEYsIDB4MDE4NiwgMHgwMUQxLCAweDAwMDgsIDB4MDAwRiwgMHgwMDQ2LAorICAgIDB4MDA1RCwgMHgwMDc4LCAweDAwODcsIDB4MDA5NiwgMHgwMEE1LCAweDAwQkMsIDB4MDBEOCwgMHgwMERFLAorICAgIDB4MDBGNiwgMHgwMDA1LCAweDAwMTQsIDB4MDAyNCwgMHgwMDJGLCAweDAwM0EsIDB4MDAzRCwgMHgwMDQ5LAorICAgIDB4MDA1MCwgMHgwMDU4LCAweDAwNUYsIDB4MDA2NiwgMHgwMDZELCAweDAwNzUsIDB4MDA3QywgMHgwMDA0LAorICAgIDB4MDAwQiwgMHgwMDEzLCAweDAwMTgsIDB4MDAxQiwgMHgwMDFGLCAweDAwMjIsIDB4MDAyNiwgMHgwMDJBLAorICAgIDB4MDAyRCwgMHgwMDMxLCAweDAwMzQsIDB4MDAzOCwgMHgwMDNCLCAweDAwM0YsIDB4MDAwMywgMHgwMDA2LAorICAgIDB4MDAwQSwgMHgwMDA3LCAweDAwMDQsIDB4MDAwMCwgMHgwMDNDLCAweDAwMzksIDB4MDAzNSwgMHgwMDMyLAorICAgIDB4MDAyRSwgMHgwMDJCLCAweDAwMjcsIDB4MDAyMywgMHgwMDIwLCAweDAwMUMsIDB4MDAxOSwgMHgwMDE2LAorICAgIDB4MDAxMCwgMHgwMDA1LCAweDAwN0QsIDB4MDA3QSwgMHgwMDZFLCAweDAwNjcsIDB4MDA2MCwgMHgwMDU5LAorICAgIDB4MDA1MSwgMHgwMDRBLCAweDAwNDIsIDB4MDAzQiwgMHgwMDM0LCAweDAwMjUsIDB4MDAxNSwgMHgwMDA2LAorICAgIDB4MDBGNywgMHgwMERGLCAweDAwRDksIDB4MDBCRCwgMHgwMEE2LCAweDAwOTcsIDB4MDA5MCwgMHgwMDc5LAorICAgIDB4MDA2QSwgMHgwMDQ3LCAweDAwNDQsIDB4MDAwOSwgMHgwMUQyLCAweDAxODcsIDB4MDE4NCwgMHgwMTQ5LAorICAgIDB4MDEwRCwgMHgwMEQ3LCAweDAwQjgsIDB4MDAxRCwgMHgwM0E2LCAweDAzMEIsIDB4MDI5QywgMHgwMjQ2LAorICAgIDB4MDE3MywgMHgwMTE0LCAweDA3NDEsIDB4MDUzQSwgMHgwNDg4LCAweDBFOUQsIDB4MEE3NiwgMHgwNDU0LAorICAgIDB4MjlERCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xMjlfY29kZXNfY1sxMjldID0geworICAgIDB4MEU1QywgMHgwNzJGLCAweDAwMUQsIDB4MDcyNCwgMHgwMDBGLCAweDAxMEQsIDB4MDMyNCwgMHgwMzkzLAorICAgIDB4MDNFOSwgMHgwMDgwLCAweDAwODcsIDB4MDBGQSwgMHgwMTY0LCAweDAxOTMsIDB4MDFERSwgMHgwMUY1LAorICAgIDB4MDAxMCwgMHgwMDJBLCAweDAwNDEsIDB4MDA2NCwgMHgwMDczLCAweDAwOEUsIDB4MDBBNCwgMHgwMEIzLAorICAgIDB4MDBENiwgMHgwMEU1LCAweDAwRjQsIDB4MDBGQiwgMHgwMDAyLCAweDAwMDksIDB4MDAxMywgMHgwMDFFLAorICAgIDB4MDAyNiwgMHgwMDJDLCAweDAwMzMsIDB4MDAzRiwgMHgwMDQxLCAweDAwNEMsIDB4MDA1MywgMHgwMDVFLAorICAgIDB4MDA2NSwgMHgwMDcwLCAweDAwNzMsIDB4MDA3OCwgMHgwMDdCLCAweDAwN0UsIDB4MDAwMiwgMHgwMDA1LAorICAgIDB4MDAwNywgMHgwMDBCLCAweDAwMEQsIDB4MDAxMSwgMHgwMDE0LCAweDAwMTcsIDB4MDAxQSwgMHgwMDFELAorICAgIDB4MDAyMSwgMHgwMDI0LCAweDAwMjcsIDB4MDAyQSwgMHgwMDJELCAweDAwMzAsIDB4MDAzMywgMHgwMDM2LAorICAgIDB4MDAzQSwgMHgwMDM3LCAweDAwMzQsIDB4MDAzMSwgMHgwMDJFLCAweDAwMkIsIDB4MDAyOCwgMHgwMDI1LAorICAgIDB4MDAyMiwgMHgwMDFFLCAweDAwMUIsIDB4MDAxOCwgMHgwMDE1LCAweDAwMTIsIDB4MDAwRSwgMHgwMDBDLAorICAgIDB4MDAwOCwgMHgwMDA2LCAweDAwMDMsIDB4MDA3RiwgMHgwMDdDLCAweDAwNzksIDB4MDA3NiwgMHgwMDcxLAorICAgIDB4MDA2QSwgMHgwMDVGLCAweDAwNTgsIDB4MDA0RCwgMHgwMDQ2LCAweDAwNDAsIDB4MDAzOCwgMHgwMDJELAorICAgIDB4MDAyNywgMHgwMDFGLCAweDAwMTQsIDB4MDAxMiwgMHgwMDAzLCAweDAwMDAsIDB4MDBGNSwgMHgwMEVFLAorICAgIDB4MDBENywgMHgwMEM4LCAweDAwQTUsIDB4MDA4RiwgMHgwMDdDLCAweDAwNjUsIDB4MDA0MiwgMHgwMDJCLAorICAgIDB4MDAxMSwgMHgwMDAyLCAweDAxREYsIDB4MDFDOCwgMHgwMTY1LCAweDAwRkIsIDB4MDBFNCwgMHgwMDgxLAorICAgIDB4MDAwNiwgMHgwM0U4LCAweDAzMjUsIDB4MDFDQSwgMHgwMTBDLCAweDA3MjUsIDB4MDM5NiwgMHgwMDFDLAorICAgIDB4MEU1RCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xMjlfY29kZXNfZFsxMjldID0geworICAgIDB4QTU5OCwgMHhBNTlBLCAweEE1OUMsIDB4QTU5RSwgMHhDNTk4LCAweEU1ODYsIDB4M0FDQywgMHg1MkNBLAorICAgIDB4NjJDRCwgMHgwRDQ4LCAweDFENjcsIDB4Mjk3OCwgMHgzMTY3LCAweDM5NjYsIDB4MDZBNSwgMHgwRUJDLAorICAgIDB4MTRCRCwgMHgxQ0IxLCAweDAzNTAsIDB4MDM1MywgMHgwNzVGLCAweDBBNUYsIDB4MEM1RSwgMHgwRTVFLAorICAgIDB4MDFBRSwgMHgwM0FELCAweDA1MkQsIDB4MDYyRCwgMHgwNzJELCAweDAwRDUsIDB4MDFENCwgMHgwMjk0LAorICAgIDB4MDMxNCwgMHgwMzk0LCAweDAwMTQsIDB4MDA5NCwgMHgwMTE0LCAweDAxNzQsIDB4MDFCNCwgMHgwMUY0LAorICAgIDB4MDAwQiwgMHgwMDRCLCAweDAwOEIsIDB4MDBCQiwgMHgwMERCLCAweDAwRkIsIDB4MDAxQiwgMHgwMDNCLAorICAgIDB4MDA1MywgMHgwMDYzLCAweDAwNzMsIDB4MDAwMywgMHgwMDEzLCAweDAwMjMsIDB4MDAyRiwgMHgwMDM3LAorICAgIDB4MDAzRiwgMHgwMDA3LCAweDAwMEYsIDB4MDAxNSwgMHgwMDE5LCAweDAwMUQsIDB4MDAwMSwgMHgwMDA1LAorICAgIDB4MDAwOSwgMHgwMDA2LCAweDAwMDIsIDB4MDAxRSwgMHgwMDFBLCAweDAwMTYsIDB4MDAxMCwgMHgwMDA4LAorICAgIDB4MDAwMCwgMHgwMDM4LCAweDAwMzAsIDB4MDAyOCwgMHgwMDFDLCAweDAwMEMsIDB4MDA3QywgMHgwMDZDLAorICAgIDB4MDA1QywgMHgwMDQ0LCAweDAwMjQsIDB4MDAwNCwgMHgwMEU0LCAweDAwQzQsIDB4MDBBNCwgMHgwMDc0LAorICAgIDB4MDAzNCwgMHgwMUY1LCAweDAxQjUsIDB4MDE3NSwgMHgwMTE1LCAweDAwOTUsIDB4MDAxNSwgMHgwMzk1LAorICAgIDB4MDMxNSwgMHgwMjk1LCAweDAxRDUsIDB4MDBENiwgMHgwNzJFLCAweDA2MkUsIDB4MDUyRSwgMHgwM0FFLAorICAgIDB4MDFBRiwgMHgwRTVGLCAweDBDNUYsIDB4MEM1OCwgMHgwQTU4LCAweDA3NTgsIDB4MDM1MSwgMHgxQ0IyLAorICAgIDB4MThCMiwgMHgwRUJELCAweDBFQjIsIDB4Mzk2NywgMHgzOTYwLCAweDI5NzksIDB4Mjk2NCwgMHgwRDQ5LAorICAgIDB4NzJDMiwgMHg1MkNCLCAweDNBQ0QsIDB4RTU4NywgMHhDNTk5LCAweEE1OUYsIDB4QTU5RCwgMHhBNTlCLAorICAgIDB4QTU5OSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xMjlfY29kZXNfZVsxMjldID0geworICAgIDB4QTEzQywgMHhDNzIwLCAweEExM0YsIDB4QTEzRSwgMHhBMTNELCAweEU3MjIsIDB4NTA5MCwgMHg2MzkzLAorICAgIDB4NzM5MiwgMHgyODQ5LCAweDMxQ0UsIDB4MzlDRSwgMHgxNDI1LCAweDE4RTUsIDB4MUNFNSwgMHgwODQ0LAorICAgIDB4MEExQywgMHgwQzdDLCAweDAzNkMsIDB4MDQyMywgMHgwNTBGLCAweDA2M0YsIDB4MDFCNywgMHgwMjE2LAorICAgIDB4MDI4NSwgMHgwMzFELCAweDAzOUQsIDB4MDEwOSwgMHgwMTQwLCAweDAxODAsIDB4MDFDOCwgMHgwMUNGLAorICAgIDB4MDA3QSwgMHgwMDhBLCAweDAwQTIsIDB4MDBDMSwgMHgwMEU1LCAweDAwMTQsIDB4MDAzNywgMHgwMDQzLAorICAgIDB4MDA0RSwgMHgwMDU2LCAweDAwNjEsIDB4MDA2QywgMHgwMDdDLCAweDAwMEIsIDB4MDAxQywgMHgwMDFGLAorICAgIDB4MDAyMywgMHgwMDI1LCAweDAwMjksIDB4MDAyQywgMHgwMDJFLCAweDAwMzIsIDB4MDAzNCwgMHgwMDM3LAorICAgIDB4MDAzQSwgMHgwMDNDLCAweDAwM0YsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDYsIDB4MDAwOCwgMHgwMDBBLAorICAgIDB4MDAwQywgMHgwMDBCLCAweDAwMDksIDB4MDAwNywgMHgwMDA0LCAweDAwMDIsIDB4MDAwMCwgMHgwMDNELAorICAgIDB4MDAzQiwgMHgwMDM4LCAweDAwMzUsIDB4MDAzMywgMHgwMDJGLCAweDAwMkQsIDB4MDAyQSwgMHgwMDI2LAorICAgIDB4MDAyNCwgMHgwMDIwLCAweDAwMUQsIDB4MDAxQSwgMHgwMDdELCAweDAwNkQsIDB4MDA2MiwgMHgwMDU3LAorICAgIDB4MDA0RiwgMHgwMDQ0LCAweDAwM0MsIDB4MDAxNSwgMHgwMEU2LCAweDAwQzYsIDB4MDBBMywgMHgwMDhCLAorICAgIDB4MDA3QiwgMHgwMDZDLCAweDAxQzksIDB4MDE4MSwgMHgwMTQxLCAweDAxMEEsIDB4MDBEQSwgMHgwMzFFLAorICAgIDB4MDI4NiwgMHgwMjE3LCAweDAyMTAsIDB4MDczOCwgMHgwNjM4LCAweDA1MDgsIDB4MDM2RCwgMHgwQzdELAorICAgIDB4MEExRCwgMHgwODQ1LCAweDFDRTYsIDB4MThFNiwgMHgxNDI2LCAweDM5Q0YsIDB4MzFDRiwgMHgyODRFLAorICAgIDB4NzM5MywgMHg3MzkwLCAweDUwOTEsIDB4RTcyMywgMHhDNzI0LCAweEM3MjUsIDB4QzcyMiwgMHhDNzIzLAorICAgIDB4QzcyMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xMjlfY29kZXNfZlsxMjldID0geworICAgIDB4NzYyQywgMHgzQjE3LCAweDE1NTUsIDB4MDYwOCwgMHgwQUFCLCAweDBGRjIsIDB4MDMwNSwgMHgwMzA3LAorICAgIDB4MDc2MywgMHgwMDQ2LCAweDAxMEMsIDB4MDFCQywgMHgwMkFCLCAweDAzQjYsIDB4MDNGRCwgMHgwMDgwLAorICAgIDB4MDA4NywgMHgwMERGLCAweDAxNTYsIDB4MDFEOSwgMHgwMUY4LCAweDAxRkYsIDB4MDAyQSwgMHgwMDQxLAorICAgIDB4MDA2MSwgMHgwMDk0LCAweDAwRDQsIDB4MDBFQSwgMHgwMEYyLCAweDAwRkQsIDB4MDAwOSwgMHgwMDBCLAorICAgIDB4MDAxQSwgMHgwMDI2LCAweDAwMzEsIDB4MDA0MCwgMHgwMDRCLCAweDAwNkIsIDB4MDA3MywgMHgwMDc3LAorICAgIDB4MDA3QSwgMHgwMDdDLCAweDAwMDAsIDB4MDAwMiwgMHgwMDA2LCAweDAwMDgsIDB4MDAwQiwgMHgwMDBFLAorICAgIDB4MDAxMSwgMHgwMDE0LCAweDAwMTYsIDB4MDAxOSwgMHgwMDFDLCAweDAwMUUsIDB4MDAyMSwgMHgwMDIzLAorICAgIDB4MDAyNiwgMHgwMDI4LCAweDAwMkIsIDB4MDAyRCwgMHgwMDJGLCAweDAwMzEsIDB4MDAzMywgMHgwMDM2LAorICAgIDB4MDAzOCwgMHgwMDM3LCAweDAwMzQsIDB4MDAzMiwgMHgwMDMwLCAweDAwMkUsIDB4MDAyQywgMHgwMDI5LAorICAgIDB4MDAyNywgMHgwMDI0LCAweDAwMjIsIDB4MDAxRiwgMHgwMDFELCAweDAwMUEsIDB4MDAxNywgMHgwMDE1LAorICAgIDB4MDAxMiwgMHgwMDBGLCAweDAwMEMsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDMsIDB4MDAwMSwgMHgwMDdELAorICAgIDB4MDA3QiwgMHgwMDc4LCAweDAwNzQsIDB4MDA3MiwgMHgwMDU0LCAweDAwNDEsIDB4MDAzNiwgMHgwMDI3LAorICAgIDB4MDAxQiwgMHgwMDE0LCAweDAwMEEsIDB4MDBGRSwgMHgwMEYzLCAweDAwRUIsIDB4MDBENSwgMHgwMDk1LAorICAgIDB4MDA2RSwgMHgwMDQyLCAweDAwMkIsIDB4MDAxMCwgMHgwMUY5LCAweDAxREEsIDB4MDE1NywgMHgwMTU0LAorICAgIDB4MDBDMCwgMHgwMDgxLCAweDAwMjIsIDB4MDNCNywgMHgwM0IwLCAweDAxQkQsIDB4MDEwRCwgMHgwMDQ3LAorICAgIDB4MDdGOCwgMHgwNTU0LCAweDAzMDYsIDB4MEZGMywgMHgwRUM0LCAweDA2MDksIDB4MUQ4QSwgMHgxNTU0LAorICAgIDB4NzYyRCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xMjlfY29kZXNfZ1sxMjldID0geworICAgIDB4MUUyMCwgMHgxRTVFLCAweDAzMUMsIDB4MDUxQSwgMHgwNzE4LCAweDA5MTYsIDB4MEIxNCwgMHgwRDEyLAorICAgIDB4MEYxMSwgMHgwMDkwLCAweDAxOEYsIDB4MDI4RSwgMHgwMzhELCAweDA0OEMsIDB4MDU4QiwgMHgwNjhBLAorICAgIDB4MDc4OSwgMHgwMDQ5LCAweDAwQzgsIDB4MDE0OCwgMHgwMUM3LCAweDAyNDcsIDB4MDJDNiwgMHgwMzQ2LAorICAgIDB4MDNDNSwgMHgwMDI1LCAweDAwNjUsIDB4MDBBNSwgMHgwMEU0LCAweDAxMjQsIDB4MDE2NCwgMHgwMUE0LAorICAgIDB4MDFFMywgMHgwMDEzLCAweDAwMzMsIDB4MDA1MywgMHgwMDczLCAweDAwOTMsIDB4MDBCMywgMHgwMEQzLAorICAgIDB4MDBGMywgMHgwMDBBLCAweDAwMUEsIDB4MDAyQSwgMHgwMDNBLCAweDAwNEEsIDB4MDA1QSwgMHgwMDZBLAorICAgIDB4MDA3QSwgMHgwMDA2LCAweDAwMEUsIDB4MDAxNiwgMHgwMDFFLCAweDAwMjYsIDB4MDAyRSwgMHgwMDM2LAorICAgIDB4MDAzRSwgMHgwMDA0LCAweDAwMDgsIDB4MDAwQywgMHgwMDEwLCAweDAwMTQsIDB4MDAxOCwgMHgwMDFDLAorICAgIDB4MDAwMCwgMHgwMDFELCAweDAwMTksIDB4MDAxNSwgMHgwMDExLCAweDAwMEQsIDB4MDAwOSwgMHgwMDA1LAorICAgIDB4MDAzRiwgMHgwMDM3LCAweDAwMkYsIDB4MDAyNywgMHgwMDFGLCAweDAwMTcsIDB4MDAwRiwgMHgwMDA3LAorICAgIDB4MDA3QiwgMHgwMDZCLCAweDAwNUIsIDB4MDA0QiwgMHgwMDNCLCAweDAwMkIsIDB4MDAxQiwgMHgwMDBCLAorICAgIDB4MDAwOCwgMHgwMEYwLCAweDAwRDAsIDB4MDBCMCwgMHgwMDkwLCAweDAwNzAsIDB4MDA1MCwgMHgwMDMwLAorICAgIDB4MDFFNCwgMHgwMUE1LCAweDAxNjUsIDB4MDEyNSwgMHgwMEU1LCAweDAwRTIsIDB4MDBBMiwgMHgwMDYyLAorICAgIDB4MDNDQSwgMHgwMzQ3LCAweDAyQzcsIDB4MDJDNCwgMHgwMjQ0LCAweDAxNDksIDB4MDBDOSwgMHgwMEM2LAorICAgIDB4MDc5NiwgMHgwNjhCLCAweDA2ODgsIDB4MDQ4RCwgMHgwNDhBLCAweDAyOEYsIDB4MDI4QywgMHgwMDkxLAorICAgIDB4MEYyRSwgMHgwRDEzLCAweDBCMTUsIDB4MDkxNywgMHgwNzE5LCAweDA1MUIsIDB4MDMxRCwgMHgxRTVGLAorICAgIDB4MUUyMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEyOV9iaXRzX2FbMTI5XSA9IHsKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEyOV9iaXRzX2JbMTI5XSA9IHsKKyAgICAxNCwgMTMsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwKKyAgICAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwKKyAgICAxNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEyOV9iaXRzX2NbMTI5XSA9IHsKKyAgICAxMywgMTIsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA2LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwKKyAgICAxMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEyOV9iaXRzX2RbMTI5XSA9IHsKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDUsICA0LCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywKKyAgICAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEyOV9iaXRzX2VbMTI5XSA9IHsKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMiwKKyAgICAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwKKyAgICAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTIsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEyOV9iaXRzX2ZbMTI5XSA9IHsKKyAgICAxNSwgMTQsIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywKKyAgICAxNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEyOV9iaXRzX2dbMTI5XSA9IHsKKyAgICAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywKKyAgICAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwKKyAgICAgNCwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywKKyAgICAxMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jX3NpemVzW0RDQV9DT0RFX0JPT0tTXSA9IHsKKyAgICAzLCA1LCA3LCA5LCAxMywgMTcsIDI1LCAzMywgNjUsIDEyOQorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBiaXRhbGxvY19vZmZzZXRzW0RDQV9DT0RFX0JPT0tTXSA9IHsKKyAgICAtMSwgLTIsIC0zLCAtNCwgLTYsIC04LCAtMTIsIC0xNiwgLTMyLCAtNjQKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jX21heGJpdHNbRENBX0NPREVfQk9PS1NdWzddID0geworICAgIHsgMiB9LAorICAgIHsgNCwgMywgMyB9LAorICAgIHsgNSwgNSwgNCB9LAorICAgIHsgNiwgNSwgNiB9LAorICAgIHsgNywgNiwgNSB9LAorICAgIHsgOSwgOCwgNywgOSwgOCwgOCwgOCB9LAorICAgIHsgOSwgOSwgOCwgOSwgOCwgOSwgOSB9LAorICAgIHsgOSwgOSwgOSwgOSwgOSwgOSwgOSB9LAorICAgIHsgOSwgOSwgOSwgOSwgOSwgOSwgOSB9LAorICAgIHsgOSwgOSwgOSwgOSwgOSwgOSwgOSB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgKmNvbnN0IGJpdGFsbG9jX2NvZGVzW0RDQV9DT0RFX0JPT0tTXVs4XSA9IHsKKyAgICB7IGJpdGFsbG9jXzNfY29kZXMsICAgICBOVUxMIH0sCisgICAgeyBiaXRhbGxvY181X2NvZGVzX2EsICAgYml0YWxsb2NfNV9jb2Rlc19iLCAgIGJpdGFsbG9jXzVfY29kZXNfYywgICBOVUxMIH0sCisgICAgeyBiaXRhbGxvY183X2NvZGVzX2EsICAgYml0YWxsb2NfN19jb2Rlc19iLCAgIGJpdGFsbG9jXzdfY29kZXNfYywgICBOVUxMIH0sCisgICAgeyBiaXRhbGxvY185X2NvZGVzX2EsICAgYml0YWxsb2NfOV9jb2Rlc19iLCAgIGJpdGFsbG9jXzlfY29kZXNfYywgICBOVUxMIH0sCisgICAgeyBiaXRhbGxvY18xM19jb2Rlc19hLCAgYml0YWxsb2NfMTNfY29kZXNfYiwgIGJpdGFsbG9jXzEzX2NvZGVzX2MsICBOVUxMIH0sCisgICAgeyBiaXRhbGxvY18xN19jb2Rlc19hLCAgYml0YWxsb2NfMTdfY29kZXNfYiwgIGJpdGFsbG9jXzE3X2NvZGVzX2MsICBiaXRhbGxvY18xN19jb2Rlc19kLAorICAgICAgYml0YWxsb2NfMTdfY29kZXNfZSwgIGJpdGFsbG9jXzE3X2NvZGVzX2YsICBiaXRhbGxvY18xN19jb2Rlc19nLCAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfMjVfY29kZXNfYSwgIGJpdGFsbG9jXzI1X2NvZGVzX2IsICBiaXRhbGxvY18yNV9jb2Rlc19jLCAgYml0YWxsb2NfMjVfY29kZXNfZCwKKyAgICAgIGJpdGFsbG9jXzI1X2NvZGVzX2UsICBiaXRhbGxvY18yNV9jb2Rlc19mLCAgYml0YWxsb2NfMjVfY29kZXNfZywgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzMzX2NvZGVzX2EsICBiaXRhbGxvY18zM19jb2Rlc19iLCAgYml0YWxsb2NfMzNfY29kZXNfYywgIGJpdGFsbG9jXzMzX2NvZGVzX2QsCisgICAgICBiaXRhbGxvY18zM19jb2Rlc19lLCAgYml0YWxsb2NfMzNfY29kZXNfZiwgIGJpdGFsbG9jXzMzX2NvZGVzX2csICBOVUxMIH0sCisgICAgeyBiaXRhbGxvY182NV9jb2Rlc19hLCAgYml0YWxsb2NfNjVfY29kZXNfYiwgIGJpdGFsbG9jXzY1X2NvZGVzX2MsICBiaXRhbGxvY182NV9jb2Rlc19kLAorICAgICAgYml0YWxsb2NfNjVfY29kZXNfZSwgIGJpdGFsbG9jXzY1X2NvZGVzX2YsICBiaXRhbGxvY182NV9jb2Rlc19nLCAgTlVMTCB9LAorICAgIHsgYml0YWxsb2NfMTI5X2NvZGVzX2EsIGJpdGFsbG9jXzEyOV9jb2Rlc19iLCBiaXRhbGxvY18xMjlfY29kZXNfYywgYml0YWxsb2NfMTI5X2NvZGVzX2QsCisgICAgICBiaXRhbGxvY18xMjlfY29kZXNfZSwgYml0YWxsb2NfMTI5X2NvZGVzX2YsIGJpdGFsbG9jXzEyOV9jb2Rlc19nLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICpjb25zdCBiaXRhbGxvY19iaXRzW0RDQV9DT0RFX0JPT0tTXVs4XSA9IHsKKyAgICB7IGJpdGFsbG9jXzNfYml0cywgICAgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzVfYml0c19hLCAgIGJpdGFsbG9jXzVfYml0c19iLCAgIGJpdGFsbG9jXzVfYml0c19jLCAgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzdfYml0c19hLCAgIGJpdGFsbG9jXzdfYml0c19iLCAgIGJpdGFsbG9jXzdfYml0c19jLCAgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzlfYml0c19hLCAgIGJpdGFsbG9jXzlfYml0c19iLCAgIGJpdGFsbG9jXzlfYml0c19jLCAgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzEzX2JpdHNfYSwgIGJpdGFsbG9jXzEzX2JpdHNfYiwgIGJpdGFsbG9jXzEzX2JpdHNfYywgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzE3X2JpdHNfYSwgIGJpdGFsbG9jXzE3X2JpdHNfYiwgIGJpdGFsbG9jXzE3X2JpdHNfYywgIGJpdGFsbG9jXzE3X2JpdHNfZCwKKyAgICAgIGJpdGFsbG9jXzE3X2JpdHNfZSwgIGJpdGFsbG9jXzE3X2JpdHNfZiwgIGJpdGFsbG9jXzE3X2JpdHNfZywgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzI1X2JpdHNfYSwgIGJpdGFsbG9jXzI1X2JpdHNfYiwgIGJpdGFsbG9jXzI1X2JpdHNfYywgIGJpdGFsbG9jXzI1X2JpdHNfZCwKKyAgICAgIGJpdGFsbG9jXzI1X2JpdHNfZSwgIGJpdGFsbG9jXzI1X2JpdHNfZiwgIGJpdGFsbG9jXzI1X2JpdHNfZywgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzMzX2JpdHNfYSwgIGJpdGFsbG9jXzMzX2JpdHNfYiwgIGJpdGFsbG9jXzMzX2JpdHNfYywgIGJpdGFsbG9jXzMzX2JpdHNfZCwKKyAgICAgIGJpdGFsbG9jXzMzX2JpdHNfZSwgIGJpdGFsbG9jXzMzX2JpdHNfZiwgIGJpdGFsbG9jXzMzX2JpdHNfZywgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzY1X2JpdHNfYSwgIGJpdGFsbG9jXzY1X2JpdHNfYiwgIGJpdGFsbG9jXzY1X2JpdHNfYywgIGJpdGFsbG9jXzY1X2JpdHNfZCwKKyAgICAgIGJpdGFsbG9jXzY1X2JpdHNfZSwgIGJpdGFsbG9jXzY1X2JpdHNfZiwgIGJpdGFsbG9jXzY1X2JpdHNfZywgIE5VTEwgfSwKKyAgICB7IGJpdGFsbG9jXzEyOV9iaXRzX2EsIGJpdGFsbG9jXzEyOV9iaXRzX2IsIGJpdGFsbG9jXzEyOV9iaXRzX2MsIGJpdGFsbG9jXzEyOV9iaXRzX2QsCisgICAgICBiaXRhbGxvY18xMjlfYml0c19lLCBiaXRhbGxvY18xMjlfYml0c19mLCBiaXRhbGxvY18xMjlfYml0c19nLCBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB0bmxfZ3JwXzBfY29kZXNbMzddID0geworICAgIDB4MDAwMCwgMHgwMDAzLCAweDAwMDQsIDB4MDAwNywgMHgwMDAxLCAweDAwMDksIDB4MDAwYSwgMHgwMDBkLAorICAgIDB4MDAwZSwgMHgwMDA2LCAweDAwMTIsIDB4MDAwNSwgMHgwMDE1LCAweDAwMTYsIDB4MDAyMiwgMHgwMDI1LAorICAgIDB4MDAzNSwgMHgwMDc2LCAweDAwMDIsIDB4MDA0MiwgMHgwMGI2LCAweDAwMzYsIDB4MDBjMiwgMHgwMTM2LAorICAgIDB4MDE4MiwgMHgwMWMyLCAweDAzYzIsIDB4MDQ4MiwgMHgwNjgyLCAweDAwODIsIDB4MDg4MiwgMHgwYTgyLAorICAgIDB4MDI4MiwgMHgyMjgyLCAweDMyODIsIDB4MTI4MiwgMHg1MjgyLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHRubF9ncnBfMV9jb2Rlc1szNF0gPSB7CisgICAgMHgwMDAxLCAweDAwMDMsIDB4MDAwNiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA1LCAweDAwMDcsCisgICAgMHgwMDA4LCAweDAwMGYsIDB4MDAxYSwgMHgwMDFjLCAweDAwMWQsIDB4MDAwYSwgMHgwMDJjLCAweDAwMmQsCisgICAgMHgwMDBkLCAweDAwMmEsIDB4MDA0YywgMHgwMDRkLCAweDAwNmEsIDB4MDA4YywgMHgwMGNkLCAweDAwZWEsCisgICAgMHgwMDBjLCAweDAxMGMsIDB4MDFlYSwgMHgwMjBjLCAweDAzMGMsIDB4MDdlYSwgMHgwYmVhLCAweDAzZWEsCisgICAgMHgxM2VhLCAweDMzZWEsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdG5sX2dycF8yX2NvZGVzWzMxXSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMywgMHgwMDA2LCAweDAwMDcsIDB4MDAwNCwgMHgwMDA4LCAweDAwMGMsIDB4MDAxMCwKKyAgICAweDAwMTIsIDB4MDAxYSwgMHgwMDIyLCAweDAwMDAsIDB4MDAwYSwgMHgwMDIwLCAweDAwNDAsIDB4MDA0YSwKKyAgICAweDAwNmEsIDB4MDAwMiwgMHgwMDJhLCAweDAwNDIsIDB4MDA4MiwgMHgwMGFhLCAweDAwZTAsIDB4MDA2MCwKKyAgICAweDAwYzIsIDB4MDFjMiwgMHgwMTYwLCAweDAzNjAsIDB4MGY2MCwgMHgwNzYwLCAweDE3NjAsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdG5sX2dycF8zX2NvZGVzWzI4XSA9IHsKKyAgICAweDAwMDEsIDB4MDAwNiwgMHgwMDA4LCAweDAwMTQsIDB4MDAxYywgMHgwMDAwLCAweDAwMDIsIDB4MDAwNCwKKyAgICAweDAwMGEsIDB4MDAwYywgMHgwMDEwLCAweDAwMTIsIDB4MDAxYSwgMHgwMDIwLCAweDAwMmEsIDB4MDAyYywKKyAgICAweDAwMzIsIDB4MDAzYSwgMHgwMDIyLCAweDAwMzAsIDB4MDA2MiwgMHgwMDY0LCAweDAwNzAsIDB4MDAyNCwKKyAgICAweDAwYTQsIDB4MDFhNCwgMHgwM2E0LCAweDA3YTQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdG5sX2dycF80X2NvZGVzWzIzXSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMCwgMHgwMDBhLCAweDAwMDYsIDB4MDAxMiwgMHgwMDFlLCAweDAwMjIsIDB4MDAyZSwKKyAgICAweDAwMzYsIDB4MDAzZSwgMHgwMDAyLCAweDAwMTYsIDB4MDAzMiwgMHgwMDRlLCAweDAwNTYsIDB4MDAwZSwKKyAgICAweDAwNDIsIDB4MDA3MiwgMHgwMGMyLCAweDAwZjIsIDB4MDA4ZSwgMHgwMThlLCAweDAzOGUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgdG5sX3NjZl9jb2Rlc1syMF0gPSB7CisgICAgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgMHgwMDBiLCAweDAwMGMsCisgICAgMHgwMDEzLCAweDAwMTQsIDB4MDAwMywgMHgwMDA0LCAweDAwMjMsIDB4MDA2NCwgMHgwMGE0LCAweDAwMjQsCisgICAgMHgwMTI0LCAweDAzMjQsIDB4MDcyNCwgMHgwZjI0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRhbXBfY29kZXNbN10gPSB7CisgICAgMHgwMDAxLCAweDAwMDAsIDB4MDAwMiwgMHgwMDA2LCAweDAwMGUsIDB4MDAxZSwgMHgwMDNlLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRwaF9jb2Rlc1s5XSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDEsIDB4MDAwOSwgMHgwMDBkLCAweDAwMDUsIDB4MDAxNSwKKyAgICAweDAwMzUsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZnN0X3JzZF9hbXBfY29kZXNbMjRdID0geworICAgIDB4MDAwMywgMHgwMDA1LCAweDAwMDYsIDB4MDAwNywgMHgwMDAwLCAweDAwMDEsIDB4MDAwMiwgMHgwMDA4LAorICAgIDB4MDAwOSwgMHgwMDBhLCAweDAwMTQsIDB4MDAwNCwgMHgwMDFhLCAweDAwMWMsIDB4MDAyNCwgMHgwMDJjLAorICAgIDB4MDAzYSwgMHgwMDBjLCAweDAwM2MsIDB4MDA0YywgMHgwMGZjLCAweDAwN2MsIDB4MDE3YywgMHgwMzdjLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHJzZF9hcHByeF9jb2Rlc1s2XSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDcsIDB4MDAwZiwgMHgwMDFmLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHJzZF9hbXBfY29kZXNbMzNdID0geworICAgIDB4MDAwMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwMywgMHgwMDA0LCAweDAwMGUsIDB4MDAwZiwgMHgwMDE2LAorICAgIDB4MDAwNywgMHgwMDI3LCAweDAwMzcsIDB4MDAyNiwgMHgwMDY2LCAweDAwMDYsIDB4MDAxNywgMHgwMDQ2LAorICAgIDB4MDA5NywgMHgwMGQ3LCAweDAwODYsIDB4MDBjNiwgMHgwMWM2LCAweDAxNTcsIDB4MDE4NiwgMHgwMjU3LAorICAgIDB4MDM1NywgMHgwMDU3LCAweDA3ODYsIDB4MDM4NiwgMHgwYjg2LCAweDA0NTcsIDB4MGM1NywgMHgxNDU3LAorICAgIDB4MWM1NywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBhdmdfZzNfY29kZXNbMThdID0geworICAgIDB4MDAwMSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwMCwgMHgwMDBjLCAweDAwMTQsIDB4MDAxOCwgMHgwMDA0LAorICAgIDB4MDAwOCwgMHgwMDI4LCAweDAwNjgsIDB4MDAyNCwgMHgwMGE0LCAweDAwZTQsIDB4MDE2NCwgMHgwMDY0LAorICAgIDB4MDI2NCwgMHgwNjY0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHN0X2dyaWRfY29kZXNbMjJdID0geworICAgIDB4MDAwMSwgMHgwMDAyLCAweDAwMDAsIDB4MDAwNCwgMHgwMDA4LCAweDAwMWMsIDB4MDA0YywgMHgwMDZjLAorICAgIDB4MDAwYywgMHgwMDJjLCAweDAwOGMsIDB4MDBhYywgMHgwMTJjLCAweDAxOGMsIDB4MDFhYywgMHgwMzhjLAorICAgIDB4MDNhYywgMHgwMzJjLCAweDA3MmMsIDB4MGYyYywgMHgxNzJjLCAweDFmMmMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ3JpZF8yX2NvZGVzWzIwXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDEsIDB4MDAwNSwgMHgwMDBkLCAweDAwM2QsIDB4MDA1ZCwKKyAgICAweDAwOWQsIDB4MDExZCwgMHgwMDFkLCAweDA2MWQsIDB4MDQxZCwgMHgwYzFkLCAweDBhMWQsIDB4MTIxZCwKKyAgICAweDAyMWQsIDB4MWExZCwgMHgyMjFkLCAweDNhMWQsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZ3JpZF8zX2NvZGVzWzEzXSA9IHsKKyAgICAweDAwMDEsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDQsIDB4MDAwYywgMHgwMDFjLCAweDAwN2MsIDB4MDAzYywKKyAgICAweDAxYmMsIDB4MDBiYywgMHgwNmJjLCAweDAyYmMsIDB4MGFiYywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCByc2RfY29kZXNbOV0gPSB7CisgICAgMHgwMDAxLCAweDAwMDMsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDYsIDB4MDAwNCwgMHgwMDBjLCAweDAwMWMsCisgICAgMHgwMDNjLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdG5sX2dycF8wX2JpdHZhbHNbNzRdID0geworICAgICAzLCAgNSwgIDMsICA5LCAgMywgIDQsICAzLCAgNiwgIDQsIDEwLCAgNCwgMTMsICA0LCAgNywgIDQsIDExLAorICAgICA0LCAgOCwgIDUsIDEyLCAgNSwgMTQsICA2LCAxNSwgIDYsIDE4LCAgNiwgIDEsICA2LCAxNywgIDYsIDE2LAorICAgICA2LCAyMSwgIDcsIDIwLCAgOCwgMTksICA4LCAyMiwgIDgsIDI1LCAgOSwgMjYsICA5LCAyMywgIDksICAzLAorICAgICA5LCAyNCwgMTAsIDI5LCAxMCwgMjcsIDExLCAyOCwgMTEsIDMwLCAxMiwgMzMsIDEyLCAzMSwgMTIsIDMyLAorICAgIDE0LCAzNCwgMTQsIDM3LCAxNCwgMzYsIDE1LCAzNSwgMTUsICAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdG5sX2dycF8xX2JpdHZhbHNbNjhdID0geworICAgICAzLCAgOSwgIDMsICA2LCAgMywgIDUsICA0LCAgNCwgIDQsICA4LCAgNCwgMTAsICA0LCAgMSwgIDQsIDExLAorICAgICA0LCAgNywgIDQsIDEzLCAgNSwgMTIsICA1LCAxNCwgIDUsIDE3LCAgNiwgMTYsICA2LCAxNSwgIDYsIDE4LAorICAgICA3LCAyMCwgIDcsIDE5LCAgNywgMjEsICA4LCAyNSwgIDgsIDIzLCAgOCwgMjIsICA4LCAyNCwgIDksIDI2LAorICAgIDEwLCAgMywgMTAsIDI5LCAxMCwgMzAsIDEwLCAyNywgMTAsIDI4LCAxMSwgMzEsIDEyLCAzMiwgMTMsIDMzLAorICAgIDE0LCAzNCwgMTQsICAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdG5sX2dycF8yX2JpdHZhbHNbNjJdID0geworICAgICAyLCAgMSwgIDMsICA2LCAgMywgIDUsICAzLCAgNywgIDQsICA5LCAgNCwgIDgsICA0LCAgNCwgIDUsIDEwLAorICAgICA1LCAxMSwgIDUsIDEzLCAgNiwgMTIsICA3LCAxNCwgIDcsIDE2LCAgNywgMTUsICA3LCAxNywgIDcsIDE4LAorICAgICA3LCAxOSwgIDgsIDIyLCAgOCwgMjAsICA4LCAyMSwgIDgsICAzLCAgOCwgMjQsICA4LCAyNSwgIDksIDIzLAorICAgICA5LCAyNiwgIDksIDI3LCAxMCwgMjgsIDExLCAyOSwgMTIsIDMxLCAxMywgMzAsIDEzLCAgMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRubF9ncnBfM19iaXR2YWxzWzU2XSA9IHsKKyAgICAgMSwgIDEsICAzLCAgNiwgIDQsICA1LCAgNSwgIDksICA1LCAgNCwgIDYsICA4LCAgNiwgMTQsICA2LCAxMCwKKyAgICAgNiwgMjEsICA2LCAxMywgIDYsICA3LCAgNiwgIDMsICA2LCAxNiwgIDYsICAyLCAgNiwgMTgsICA2LCAxNywKKyAgICAgNiwgMTEsICA2LCAxNSwgIDcsIDE5LCAgNywgMjMsICA3LCAyNCwgIDcsIDIyLCAgNywgMTIsICA4LCAyMCwKKyAgICAgOSwgMjUsIDEwLCAyNiwgMTEsIDI3LCAxMSwgIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0bmxfZ3JwXzRfYml0dmFsc1s0Nl0gPSB7CisgICAgIDEsICAxLCAgMiwgIDIsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgOCwgIDYsICAzLCAgNiwgMTksCisgICAgIDYsIDIwLCAgNiwgIDksICA3LCAgNywgIDcsIDExLCAgNywgMTMsICA3LCAxNywgIDcsIDEwLCAgOCwgMTIsCisgICAgIDgsIDE1LCAgOCwgMTQsICA4LCAyMSwgIDgsIDE4LCAgOSwgMTYsIDEwLCAyMiwgMTAsICAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdG5sX3NjZl9iaXR2YWxzWzQwXSA9IHsKKyAgICAgMywgIDMsICAzLCAgMSwgIDMsICAyLCAgMywgIDUsICAzLCAgNCwgIDMsICA2LCAgNCwgIDgsICA0LCAgNywKKyAgICAgNSwgMTAsICA1LCAgOSwgIDYsIDEyLCAgNiwgMTEsICA2LCAxMywgIDcsIDE0LCAgOCwgMTUsICA5LCAxNiwKKyAgICAxMCwgMTcsIDExLCAxOCwgMTIsIDE5LCAxMiwgIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBkYW1wX2JpdHZhbHNbMTRdID0geworICAgICAxLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRwaF9iaXR2YWxzWzE4XSA9IHsKKyAgICAgMiwgIDIsICAyLCAgMSwgIDIsICA4LCAgNCwgIDMsICA0LCAgNywgIDQsICA0LCAgNSwgIDYsICA2LCAgNSwKKyAgICAgNiwgIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmc3RfcnNkX2FtcF9iaXR2YWxzWzQ4XSA9IHsKKyAgICAgMywgMTMsICAzLCAxNSwgIDMsIDE2LCAgMywgMTQsICA0LCAxMiwgIDQsIDEwLCAgNCwgMTEsICA0LCAxNywKKyAgICAgNCwgMTgsICA1LCAxOSwgIDUsICA5LCAgNiwgIDEsICA2LCAgNywgIDYsICA2LCAgNiwgIDgsICA2LCAgNSwKKyAgICAgNiwgIDQsICA3LCAyMCwgIDcsICAyLCAgNywgIDMsICA4LCAyMSwgIDksIDIyLCAxMCwgMjMsIDEwLCAgMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJzZF9hcHByeF9iaXR2YWxzWzEyXSA9IHsKKyAgICAgMSwgIDEsICAyLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDUsICAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnNkX2FtcF9iaXR2YWxzWzY2XSA9IHsKKyAgICAgMiwgIDMsICAzLCAgMiwgIDMsICA1LCAgMywgIDQsICAzLCAgMSwgIDQsICA3LCAgNCwgIDYsICA1LCAgOSwKKyAgICAgNiwgIDgsICA2LCAxMSwgIDYsIDEwLCAgNywgMTIsICA3LCAxMywgIDgsIDE0LCAgOCwgMTgsICA4LCAxNiwKKyAgICAgOCwgMTUsICA4LCAyMiwgIDksIDIwLCAgOSwgMjQsICA5LCAxNywgMTAsIDI4LCAxMCwgMjYsIDEwLCAyMSwKKyAgICAxMCwgMjMsIDExLCAzMCwgMTEsIDE5LCAxMiwgMjUsIDEyLCAzMiwgMTMsIDM2LCAxMywgMjksIDEzLCAzNCwKKyAgICAxMywgIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhdmdfZzNfYml0dmFsc1szNl0gPSB7CisgICAgIDIsIDE1LCAgMiwgMTYsICAyLCAxNywgIDQsIDE0LCAgNCwgMTgsICA1LCAxMiwgIDUsIDEzLCAgNiwgMTAsCisgICAgIDYsIDExLCAgNywgMTksICA3LCAgOSwgIDgsIDIwLCAgOCwgIDgsICA4LCAgNywgIDksIDIxLCAxMCwgIDYsCisgICAgMTEsIDIzLCAxMSwgIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzdF9ncmlkX2JpdHZhbHNbNDRdID0geworICAgICAxLCAgNiwgIDIsICAxLCAgNCwgIDQsICA0LCAgOCwgIDQsICAzLCAgNSwgMTAsICA3LCAxMiwgIDcsICA1LAorICAgICA4LCAxNCwgIDksIDE2LCAgOSwgIDcsICA5LCAxOCwgMTAsIDExLCAxMCwgIDksIDEwLCAyMCwgMTAsIDIyLAorICAgIDEwLCAgMiwgMTEsIDEzLCAxMywgMTcsIDEzLCAyNCwgMTMsIDE1LCAxMywgIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBncmlkXzJfYml0dmFsc1s0MF0gPSB7CisgICAgIDIsICAzLCAgMiwgIDIsICAyLCAgMSwgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDgsCisgICAgIDgsICA5LCAgOSwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEyLCAxNywgMTMsIDE1LCAxMywgMTgsCisgICAgMTQsIDE5LCAxNCwgMTYsIDE0LCAxNCwgMTQsICAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ3JpZF8zX2JpdHZhbHNbMjZdID0geworICAgICAxLCAxNywgIDIsIDE2LCAgMywgMTgsICA0LCAxNSwgIDUsIDE5LCAgNiwgMTQsICA3LCAyMCwgIDgsIDEzLAorICAgICA5LCAyMSwgMTAsIDEyLCAxMSwgMjIsIDEyLCAxMSwgMTIsICAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnNkX2JpdHZhbHNbMThdID0geworICAgICAyLCAgMiwgIDIsICAzLCAgMywgIDEsICAzLCAgNCwgIDMsICAwLCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LAorICAgICA2LCAgNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCB2bGNfb2Zmc1s4MF0gPSB7CisgICAgICAgIDAsICAgNTEyLCAgIDY0MCwgICA3NjgsICAxMjgyLCAgMTc5NCwgIDI0MzYsICAzMDgwLCAgMzc3MCwgIDQ0NTQsICA1MzY0LAorICAgICA1MzcyLCAgNTM4MCwgIDUzODgsICA1MzkyLCAgNTM5NiwgIDU0MTIsICA1NDIwLCAgNTQyOCwgIDU0NjAsICA1NDkyLCAgNTUwOCwKKyAgICAgNTU3MiwgIDU2MDQsICA1NjY4LCAgNTc5NiwgIDU4NjAsICA1ODkyLCAgNjQxMiwgIDY2NjgsICA2Nzk2LCAgNzMwOCwgIDc1NjQsCisgICAgIDc4MjAsICA4MDc2LCAgODYyMCwgIDkxMzIsICA5Mzg4LCAgOTkxMCwgMTAxNjYsIDEwNjgwLCAxMTE5NiwgMTE3MjYsIDEyMjQwLAorICAgIDEyNzUyLCAxMzI5OCwgMTM4MTAsIDE0MzI2LCAxNDg0MCwgMTU1MDAsIDE2MDIyLCAxNjU0MCwgMTcxNTgsIDE3Njc4LCAxODI2NCwKKyAgICAxODc5NiwgMTkzNTIsIDE5OTI2LCAyMDQ2OCwgMjE0NzIsIDIyMzk4LCAyMzAxNCwgMjM2MjIsIDI0MjAwLCAyNDc0OCwgMjUyNzYsCisgICAgMjU3OTIsIDI2MzA2LCAyNjgyNiwgMjY4OTAsIDI2OTU0LCAyNzQ2OCwgMjc1MDAsIDI4MDM4LCAyODU1NCwgMjkwODYsIDI5NjMwLAorICAgIDMwMTUwLCAzMDIxNAorfTsKKworRENBVkxDICBmZl9kY2FfdmxjX2JpdF9hbGxvY2F0aW9uOworRENBVkxDICBmZl9kY2FfdmxjX3RyYW5zaXRpb25fbW9kZTsKK0RDQVZMQyAgZmZfZGNhX3ZsY19zY2FsZV9mYWN0b3I7CitEQ0FWTEMgIGZmX2RjYV92bGNfcXVhbnRfaW5kZXhbRENBX0NPREVfQk9PS1NdOworCitWTEMgICAgIGZmX2RjYV92bGNfdG5sX2dycFs1XTsKK1ZMQyAgICAgZmZfZGNhX3ZsY190bmxfc2NmOworVkxDICAgICBmZl9kY2FfdmxjX2RhbXA7CitWTEMgICAgIGZmX2RjYV92bGNfZHBoOworVkxDICAgICBmZl9kY2FfdmxjX2ZzdF9yc2RfYW1wOworVkxDICAgICBmZl9kY2FfdmxjX3JzZF9hcHByeDsKK1ZMQyAgICAgZmZfZGNhX3ZsY19yc2RfYW1wOworVkxDICAgICBmZl9kY2FfdmxjX2F2Z19nMzsKK1ZMQyAgICAgZmZfZGNhX3ZsY19zdF9ncmlkOworVkxDICAgICBmZl9kY2FfdmxjX2dyaWRfMjsKK1ZMQyAgICAgZmZfZGNhX3ZsY19ncmlkXzM7CitWTEMgICAgIGZmX2RjYV92bGNfcnNkOworCithdl9jb2xkIHZvaWQgZmZfZGNhX2luaXRfdmxjcyh2b2lkKQoreworICAgIHN0YXRpYyBWTENfVFlQRSBkY2FfdGFibGVbMzAyMTRdWzJdOworICAgIHN0YXRpYyBpbnQgdmxjc19pbml0aWFsaXplZCA9IDA7CisgICAgaW50IGksIGosIGsgPSAwOworCisgICAgaWYgKHZsY3NfaW5pdGlhbGl6ZWQpCisgICAgICAgIHJldHVybjsKKworI2RlZmluZSBEQ0FfSU5JVF9WTEModmxjLCBhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZsYy50YWJsZSAgICAgICAgICAgPSAmZGNhX3RhYmxlW3ZsY19vZmZzW2tdXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2bGMudGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbayArIDFdIC0gdmxjX29mZnNba107ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW5pdF92bGMoJnZsYywgYSwgYiwgYywgMSwgMSwgZCwgMiwgMiwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOyAgICBcCisgICAgICAgIGsrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICBmZl9kY2FfdmxjX2JpdF9hbGxvY2F0aW9uLm9mZnNldCAgICA9IDE7CisgICAgZmZfZGNhX3ZsY19iaXRfYWxsb2NhdGlvbi5tYXhfZGVwdGggPSAyOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgIERDQV9JTklUX1ZMQyhmZl9kY2FfdmxjX2JpdF9hbGxvY2F0aW9uLnZsY1tpXSwgYml0YWxsb2NfMTJfdmxjX2JpdHNbaV0sIDEyLAorICAgICAgICAgICAgICAgICAgICAgYml0YWxsb2NfMTJfYml0c1tpXSwgYml0YWxsb2NfMTJfY29kZXNbaV0pOworCisgICAgZmZfZGNhX3ZsY19zY2FsZV9mYWN0b3Iub2Zmc2V0ICAgID0gLTY0OworICAgIGZmX2RjYV92bGNfc2NhbGVfZmFjdG9yLm1heF9kZXB0aCA9IDI7CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgRENBX0lOSVRfVkxDKGZmX2RjYV92bGNfc2NhbGVfZmFjdG9yLnZsY1tpXSwgU0NBTEVTX1ZMQ19CSVRTLCAxMjksCisgICAgICAgICAgICAgICAgICAgICBzY2FsZXNfYml0c1tpXSwgc2NhbGVzX2NvZGVzW2ldKTsKKworICAgIGZmX2RjYV92bGNfdHJhbnNpdGlvbl9tb2RlLm9mZnNldCAgICA9IDA7CisgICAgZmZfZGNhX3ZsY190cmFuc2l0aW9uX21vZGUubWF4X2RlcHRoID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBEQ0FfSU5JVF9WTEMoZmZfZGNhX3ZsY190cmFuc2l0aW9uX21vZGUudmxjW2ldLCB0bW9kZV92bGNfYml0c1tpXSwgNCwKKyAgICAgICAgICAgICAgICAgICAgIHRtb2RlX2JpdHNbaV0sIHRtb2RlX2NvZGVzW2ldKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBEQ0FfQ09ERV9CT09LUzsgaSsrKSB7CisgICAgICAgIGZmX2RjYV92bGNfcXVhbnRfaW5kZXhbaV0ub2Zmc2V0ICAgID0gYml0YWxsb2Nfb2Zmc2V0c1tpXTsKKyAgICAgICAgZmZfZGNhX3ZsY19xdWFudF9pbmRleFtpXS5tYXhfZGVwdGggPSAxICsgKGkgPiA0KTsKKyAgICAgICAgZm9yIChqID0gMDsgYml0YWxsb2NfY29kZXNbaV1bal07IGorKykKKyAgICAgICAgICAgIERDQV9JTklUX1ZMQyhmZl9kY2FfdmxjX3F1YW50X2luZGV4W2ldLnZsY1tqXSwgYml0YWxsb2NfbWF4Yml0c1tpXVtqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiaXRhbGxvY19zaXplc1tpXSwgYml0YWxsb2NfYml0c1tpXVtqXSwgYml0YWxsb2NfY29kZXNbaV1bal0pOworICAgIH0KKworI2RlZmluZSBMQlJfSU5JVF9WTEModmxjLCB0YWIsIG5iX2JpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2bGMudGFibGUgICAgICAgICAgID0gJmRjYV90YWJsZVt2bGNfb2Zmc1trXV07ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2bGMudGFibGVfYWxsb2NhdGVkID0gdmxjX29mZnNbayArIDFdIC0gdmxjX29mZnNba107ICAgICAgICAgICAgXAorICAgICAgICBmZl9pbml0X3ZsY19zcGFyc2UoJnZsYywgbmJfYml0cywgRkZfQVJSQVlfRUxFTVModGFiIyNfY29kZXMpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYiMjX2JpdHZhbHNbMF0sIDIsIDEsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiIyNfY29kZXMsIDIsIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYiMjX2JpdHZhbHNbMV0sIDIsIDEsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5JVF9WTENfTEUgfCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7ICAgICAgXAorICAgICAgICBrKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICBMQlJfSU5JVF9WTEMoZmZfZGNhX3ZsY190bmxfZ3JwWzBdLCAgdG5sX2dycF8wLCAgIDkpOworICAgIExCUl9JTklUX1ZMQyhmZl9kY2FfdmxjX3RubF9ncnBbMV0sICB0bmxfZ3JwXzEsICAgOSk7CisgICAgTEJSX0lOSVRfVkxDKGZmX2RjYV92bGNfdG5sX2dycFsyXSwgIHRubF9ncnBfMiwgICA5KTsKKyAgICBMQlJfSU5JVF9WTEMoZmZfZGNhX3ZsY190bmxfZ3JwWzNdLCAgdG5sX2dycF8zLCAgIDkpOworICAgIExCUl9JTklUX1ZMQyhmZl9kY2FfdmxjX3RubF9ncnBbNF0sICB0bmxfZ3JwXzQsICAgOSk7CisgICAgTEJSX0lOSVRfVkxDKGZmX2RjYV92bGNfdG5sX3NjZiwgICAgIHRubF9zY2YsICAgICA5KTsKKyAgICBMQlJfSU5JVF9WTEMoZmZfZGNhX3ZsY19kYW1wLCAgICAgICAgZGFtcCwgICAgICAgIDYpOworICAgIExCUl9JTklUX1ZMQyhmZl9kY2FfdmxjX2RwaCwgICAgICAgICBkcGgsICAgICAgICAgNik7CisgICAgTEJSX0lOSVRfVkxDKGZmX2RjYV92bGNfZnN0X3JzZF9hbXAsIGZzdF9yc2RfYW1wLCA5KTsKKyAgICBMQlJfSU5JVF9WTEMoZmZfZGNhX3ZsY19yc2RfYXBwcngsICAgcnNkX2FwcHJ4LCAgIDUpOworICAgIExCUl9JTklUX1ZMQyhmZl9kY2FfdmxjX3JzZF9hbXAsICAgICByc2RfYW1wLCAgICAgOSk7CisgICAgTEJSX0lOSVRfVkxDKGZmX2RjYV92bGNfYXZnX2czLCAgICAgIGF2Z19nMywgICAgICA5KTsKKyAgICBMQlJfSU5JVF9WTEMoZmZfZGNhX3ZsY19zdF9ncmlkLCAgICAgc3RfZ3JpZCwgICAgIDkpOworICAgIExCUl9JTklUX1ZMQyhmZl9kY2FfdmxjX2dyaWRfMiwgICAgICBncmlkXzIsICAgICAgOSk7CisgICAgTEJSX0lOSVRfVkxDKGZmX2RjYV92bGNfZ3JpZF8zLCAgICAgIGdyaWRfMywgICAgICA5KTsKKyAgICBMQlJfSU5JVF9WTEMoZmZfZGNhX3ZsY19yc2QsICAgICAgICAgcnNkLCAgICAgICAgIDYpOworCisgICAgdmxjc19pbml0aWFsaXplZCA9IDE7Cit9CisKK3VpbnQzMl90IGZmX2RjYV92bGNfY2FsY19xdWFudF9iaXRzKGludCAqdmFsdWVzLCB1aW50OF90IG4sIHVpbnQ4X3Qgc2VsLCB1aW50OF90IHRhYmxlKQoreworICAgIHVpbnQ4X3QgaSwgaWQ7CisgICAgdWludDMyX3Qgc3VtID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlkID0gdmFsdWVzW2ldIC0gYml0YWxsb2Nfb2Zmc2V0c1t0YWJsZV07CisgICAgICAgIGF2X2Fzc2VydDAoaWQgPCBiaXRhbGxvY19zaXplc1t0YWJsZV0pOworICAgICAgICBzdW0gKz0gYml0YWxsb2NfYml0c1t0YWJsZV1bc2VsXVtpZF07CisgICAgfQorICAgIHJldHVybiBzdW07Cit9CisKK3ZvaWQgZmZfZGNhX3ZsY19lbmNfcXVhbnQoUHV0Qml0Q29udGV4dCAqcGIsIGludCAqdmFsdWVzLCB1aW50OF90IG4sIHVpbnQ4X3Qgc2VsLCB1aW50OF90IHRhYmxlKQoreworICAgIHVpbnQ4X3QgaSwgaWQ7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBpZCA9IHZhbHVlc1tpXSAtIGJpdGFsbG9jX29mZnNldHNbdGFibGVdOworICAgICAgICBhdl9hc3NlcnQwKGlkIDwgYml0YWxsb2Nfc2l6ZXNbdGFibGVdKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIGJpdGFsbG9jX2JpdHNbdGFibGVdW3NlbF1baWRdLCBiaXRhbGxvY19jb2Rlc1t0YWJsZV1bc2VsXVtpZF0pOworICAgIH0KK30KKwordWludDMyX3QgZmZfZGNhX3ZsY19jYWxjX2FsbG9jX2JpdHMoaW50ICp2YWx1ZXMsIHVpbnQ4X3QgbiwgdWludDhfdCBzZWwpCit7CisgICAgdWludDhfdCBpLCBpZDsKKyAgICB1aW50MzJfdCBzdW0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWQgPSB2YWx1ZXNbaV0gLSAxOworICAgICAgICBzdW0gKz0gYml0YWxsb2NfMTJfYml0c1tzZWxdW2lkXTsKKyAgICB9CisgICAgcmV0dXJuIHN1bTsKK30KKwordm9pZCBmZl9kY2FfdmxjX2VuY19hbGxvYyhQdXRCaXRDb250ZXh0ICpwYiwgaW50ICp2YWx1ZXMsIHVpbnQ4X3QgbiwgdWludDhfdCBzZWwpCit7CisgICAgdWludDhfdCBpLCBpZDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlkID0gdmFsdWVzW2ldIC0gMTsKKyAgICAgICAgcHV0X2JpdHMocGIsIGJpdGFsbG9jXzEyX2JpdHNbc2VsXVtpZF0sIGJpdGFsbG9jXzEyX2NvZGVzW3NlbF1baWRdKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjYWh1ZmYuaCBiL2xpYmF2Y29kZWMvZGNhaHVmZi5oCmluZGV4IDkzODhiNjMuLjAyYjBlMzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGNhaHVmZi5oCisrKyBiL2xpYmF2Y29kZWMvZGNhaHVmZi5oCkBAIC0yMywxMDE5ICsyMyw0MyBAQAogI2lmbmRlZiBBVkNPREVDX0RDQUhVRkZfSAogI2RlZmluZSBBVkNPREVDX0RDQUhVRkZfSAogCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogCi0jZGVmaW5lIFRNT0RFX0NPVU5UIDQKLXN0YXRpYyBjb25zdCB1aW50OF90IHRtb2RlX3ZsY19iaXRzW1RNT0RFX0NPVU5UXSA9IHsgMywgMywgMywgMiB9Owotc3RhdGljIGNvbnN0IHVpbnQxNl90IHRtb2RlX2NvZGVzW1RNT0RFX0NPVU5UXVs0XSA9IHsKLSAgICB7IDB4MDAwMCwgMHgwMDAyLCAweDAwMDYsIDB4MDAwNyB9LAotICAgIHsgMHgwMDAyLCAweDAwMDYsIDB4MDAwNywgMHgwMDAwIH0sCi0gICAgeyAweDAwMDYsIDB4MDAwNywgMHgwMDAwLCAweDAwMDIgfSwKLSAgICB7IDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwMyB9Ci19OworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCiAKLXN0YXRpYyBjb25zdCB1aW50OF90IHRtb2RlX2JpdHNbVE1PREVfQ09VTlRdWzRdID0gewotICAgIHsgMSwgMiwgMywgMyB9LAotICAgIHsgMiwgMywgMywgMSB9LAotICAgIHsgMywgMywgMSwgMiB9LAotICAgIHsgMiwgMiwgMiwgMiB9Ci19OworI2RlZmluZSBEQ0FfQ09ERV9CT09LUyAgICAgIDEwCisjZGVmaW5lIERDQV9CSVRBTExPQ18xMl9DT1VOVCAgICA1CiAKLSNkZWZpbmUgQklUQUxMT0NfMTJfQ09VTlQgICAgNQotI2RlZmluZSBCSVRBTExPQ18xMl9WTENfQklUUyA5Ci1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xMl92bGNfYml0c1tCSVRBTExPQ18xMl9DT1VOVF0gPSB7Ci0gICAgOSwgNywgNywgOSwgOQotfTsKK3R5cGVkZWYgc3RydWN0IERDQVZMQyB7CisgICAgaW50IG9mZnNldDsgICAgICAgICAvLy88IENvZGUgdmFsdWVzIG9mZnNldAorICAgIGludCBtYXhfZGVwdGg7ICAgICAgLy8vPCBQYXJhbWV0ZXIgZm9yIGdldF92bGMyKCkKKyAgICBWTEMgdmxjWzddOyAgICAgICAgIC8vLzwgQWN0dWFsIGNvZGVzCit9IERDQVZMQzsKIAotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyX2NvZGVzW0JJVEFMTE9DXzEyX0NPVU5UXVsxMl0gPSB7Ci0gICAgeyAweDAwMDAsIDB4MDAwMiwgMHgwMDA2LCAweDAwMEUsIDB4MDAxRSwgMHgwMDNFLCAweDAwRkYsIDB4MDBGRSwKLSAgICAgIDB4MDFGQiwgMHgwMUZBLCAweDAxRjksIDB4MDFGOCwgfSwKLSAgICB7IDB4MDAwMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwRiwgMHgwMDBDLCAweDAwMUQsIDB4MDAzOSwgMHgwMDM4LAotICAgICAgMHgwMDM3LCAweDAwMzYsIDB4MDAzNSwgMHgwMDM0LCB9LAotICAgIHsgMHgwMDAwLCAweDAwMDcsIDB4MDAwNSwgMHgwMDA0LCAweDAwMDIsIDB4MDAwRCwgMHgwMDBDLCAweDAwMDYsCi0gICAgICAweDAwMEYsIDB4MDAxRCwgMHgwMDM5LCAweDAwMzgsIH0sCi0gICAgeyAweDAwMDMsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDIsIDB4MDAwNiwgMHgwMDBFLCAweDAwMUUsIDB4MDAzRSwKLSAgICAgIDB4MDA3RSwgMHgwMEZFLCAweDAxRkYsIDB4MDFGRSwgfSwKLSAgICB7IDB4MDAwMSwgMHgwMDAwLCAweDAwMDIsIDB4MDAwNiwgMHgwMDBFLCAweDAwM0YsIDB4MDAzRCwgMHgwMDdDLAotICAgICAgMHgwMDc5LCAweDAwNzgsIDB4MDBGQiwgMHgwMEZBLCB9Ci19OworZXh0ZXJuIERDQVZMQyAgIGZmX2RjYV92bGNfYml0X2FsbG9jYXRpb247CitleHRlcm4gRENBVkxDICAgZmZfZGNhX3ZsY190cmFuc2l0aW9uX21vZGU7CitleHRlcm4gRENBVkxDICAgZmZfZGNhX3ZsY19zY2FsZV9mYWN0b3I7CitleHRlcm4gRENBVkxDICAgZmZfZGNhX3ZsY19xdWFudF9pbmRleFtEQ0FfQ09ERV9CT09LU107CiAKLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEyX2JpdHNbQklUQUxMT0NfMTJfQ09VTlRdWzEyXSA9IHsKLSAgICB7IDEsIDIsIDMsIDQsIDUsIDYsIDgsIDgsIDksIDksICA5LCAgOSB9LAotICAgIHsgMSwgMiwgMywgNSwgNSwgNiwgNywgNywgNywgNywgIDcsICA3IH0sCi0gICAgeyAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA2LCAgNywgIDcgfSwKLSAgICB7IDIsIDIsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMCB9LAotICAgIHsgMSwgMiwgMywgNCwgNSwgNywgNywgOCwgOCwgOCwgIDksICA5IH0KLX07CitleHRlcm4gVkxDICBmZl9kY2FfdmxjX3RubF9ncnBbNV07CitleHRlcm4gVkxDICBmZl9kY2FfdmxjX3RubF9zY2Y7CitleHRlcm4gVkxDICBmZl9kY2FfdmxjX2RhbXA7CitleHRlcm4gVkxDICBmZl9kY2FfdmxjX2RwaDsKK2V4dGVybiBWTEMgIGZmX2RjYV92bGNfZnN0X3JzZF9hbXA7CitleHRlcm4gVkxDICBmZl9kY2FfdmxjX3JzZF9hcHByeDsKK2V4dGVybiBWTEMgIGZmX2RjYV92bGNfcnNkX2FtcDsKK2V4dGVybiBWTEMgIGZmX2RjYV92bGNfYXZnX2czOworZXh0ZXJuIFZMQyAgZmZfZGNhX3ZsY19zdF9ncmlkOworZXh0ZXJuIFZMQyAgZmZfZGNhX3ZsY19ncmlkXzI7CitleHRlcm4gVkxDICBmZl9kY2FfdmxjX2dyaWRfMzsKK2V4dGVybiBWTEMgIGZmX2RjYV92bGNfcnNkOwogCi0jZGVmaW5lIFNDQUxFU19DT1VOVCAgICA1Ci0jZGVmaW5lIFNDQUxFU19WTENfQklUUyA5Ci1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2NhbGVzX2NvZGVzW1NDQUxFU19DT1VOVF1bMTI5XSA9IHsKLSAgICB7IDB4M0FCMCwgMHgzQUIyLCAweDNBQjQsIDB4M0FCNiwgMHgzQUI4LCAweDNBQkEsIDB4M0FCQywgMHgzQUJFLAotICAgICAgMHgzQUMwLCAweDNBQzIsIDB4M0FDNCwgMHgzQUM2LCAweDNBQzgsIDB4M0FDQSwgMHgzQUNDLCAweDNBQ0UsCi0gICAgICAweDNBRDAsIDB4M0FEMiwgMHgzQUQ0LCAweDNBRDYsIDB4M0FEOCwgMHgzQURBLCAweDNBREMsIDB4M0FERSwKLSAgICAgIDB4M0FFMCwgMHgzQUUyLCAweDNBRTQsIDB4M0FFNiwgMHgzQUU4LCAweDNBRUEsIDB4M0FFQywgMHgzQUVFLAotICAgICAgMHgzQUYwLCAweDNBRjIsIDB4M0FGNCwgMHgzQUY2LCAweDNBRjgsIDB4M0FGQSwgMHgzQUZDLCAweDNBRkUsCi0gICAgICAweDA1NDAsIDB4MDU0MiwgMHgwNTQ0LCAweDA1NDYsIDB4MDU0OCwgMHgwNTRBLCAweDA1NEMsIDB4MDU0RSwKLSAgICAgIDB4MDU1OCwgMHgwNTVFLCAweDAyQUQsIDB4MDE1NCwgMHgwNzU0LCAweDAzQTgsIDB4MDA1NiwgMHgwMDI4LAotICAgICAgMHgwMEU4LCAweDAwNEEsIDB4MDAwQiwgMHgwMDNCLCAweDAwMTMsIDB4MDAwMywgMHgwMDBGLCAweDAwMDUsCi0gICAgICAweDAwMDEsIDB4MDAwNiwgMHgwMDAwLCAweDAwMDgsIDB4MDAxQywgMHgwMDA0LCAweDAwMjQsIDB4MDA0QiwKLSAgICAgIDB4MDBFOSwgMHgwMDI5LCAweDAwNTcsIDB4MDNBOSwgMHgwNzU1LCAweDAxNTUsIDB4MDJBRSwgMHgwNTVGLAotICAgICAgMHgwNTU5LCAweDA1NEYsIDB4MDU0RCwgMHgwNTRCLCAweDA1NDksIDB4MDU0NywgMHgwNTQ1LCAweDA1NDMsCi0gICAgICAweDA1NDEsIDB4M0FGRiwgMHgzQUZELCAweDNBRkIsIDB4M0FGOSwgMHgzQUY3LCAweDNBRjUsIDB4M0FGMywKLSAgICAgIDB4M0FGMSwgMHgzQUVGLCAweDNBRUQsIDB4M0FFQiwgMHgzQUU5LCAweDNBRTcsIDB4M0FFNSwgMHgzQUUzLAotICAgICAgMHgzQUUxLCAweDNBREYsIDB4M0FERCwgMHgzQURCLCAweDNBRDksIDB4M0FENywgMHgzQUQ1LCAweDNBRDMsCi0gICAgICAweDNBRDEsIDB4M0FDRiwgMHgzQUNELCAweDNBQ0IsIDB4M0FDOSwgMHgzQUM3LCAweDNBQzUsIDB4M0FDMywKLSAgICAgIDB4M0FDMSwgMHgzQUJGLCAweDNBQkQsIDB4M0FCQiwgMHgzQUI5LCAweDNBQjcsIDB4M0FCNSwgMHgzQUIzLAotICAgICAgMHgzQUIxLCB9LAotICAgIHsgMHgwRjYwLCAweDBGNjIsIDB4MEY2NCwgMHgwRjY2LCAweDBGNjgsIDB4MEY2QSwgMHgwRjZDLCAweDBGNkUsCi0gICAgICAweDBGNzAsIDB4MEY3MiwgMHgwRjc0LCAweDBGNzYsIDB4MEY3OCwgMHgwRjdBLCAweDBGN0MsIDB4MEY3RSwKLSAgICAgIDB4MEY4MCwgMHgwRjgyLCAweDBGODQsIDB4MEY4NiwgMHgwRjg4LCAweDBGOEEsIDB4MEY4QywgMHgwRjhFLAotICAgICAgMHgwRjkwLCAweDBGOTIsIDB4MEY5NCwgMHgwRjk2LCAweDBGOTgsIDB4MEY5QSwgMHgwRjlDLCAweDBGOUUsCi0gICAgICAweDBGQTAsIDB4MEZBMiwgMHgwRkE0LCAweDBGQTYsIDB4MEZBOCwgMHgwRkFBLCAweDBGQUMsIDB4MEZBRSwKLSAgICAgIDB4MEZCMCwgMHgwRkIyLCAweDBGQjQsIDB4MEZCNiwgMHgwRkI4LCAweDBGQkEsIDB4MEZCQywgMHgwRkJFLAotICAgICAgMHgwN0EwLCAweDA3QTIsIDB4MDNEMiwgMHgwMUVBLCAweDAwRkMsIDB4MDA3RiwgMHgwMDFDLCAweDAwMEMsCi0gICAgICAweDAwMDQsIDB4MDAzNCwgMHgwMDEwLCAweDAwMUIsIDB4MDAwOSwgMHgwMDBCLCAweDAwMEUsIDB4MDAwMSwKLSAgICAgIDB4MDAwMywgMHgwMDAyLCAweDAwMEYsIDB4MDAwQywgMHgwMDBBLCAweDAwMDAsIDB4MDAxMSwgMHgwMDM1LAotICAgICAgMHgwMDA1LCAweDAwMEQsIDB4MDAxRCwgMHgwMDNDLCAweDAwRkQsIDB4MDFFQiwgMHgwM0QzLCAweDA3QTMsCi0gICAgICAweDA3QTEsIDB4MEZCRiwgMHgwRkJELCAweDBGQkIsIDB4MEZCOSwgMHgwRkI3LCAweDBGQjUsIDB4MEZCMywKLSAgICAgIDB4MEZCMSwgMHgwRkFGLCAweDBGQUQsIDB4MEZBQiwgMHgwRkE5LCAweDBGQTcsIDB4MEZBNSwgMHgwRkEzLAotICAgICAgMHgwRkExLCAweDBGOUYsIDB4MEY5RCwgMHgwRjlCLCAweDBGOTksIDB4MEY5NywgMHgwRjk1LCAweDBGOTMsCi0gICAgICAweDBGOTEsIDB4MEY4RiwgMHgwRjhELCAweDBGOEIsIDB4MEY4OSwgMHgwRjg3LCAweDBGODUsIDB4MEY4MywKLSAgICAgIDB4MEY4MSwgMHgwRjdGLCAweDBGN0QsIDB4MEY3QiwgMHgwRjc5LCAweDBGNzcsIDB4MEY3NSwgMHgwRjczLAotICAgICAgMHgwRjcxLCAweDBGNkYsIDB4MEY2RCwgMHgwRjZCLCAweDBGNjksIDB4MEY2NywgMHgwRjY1LCAweDBGNjMsCi0gICAgICAweDBGNjEsIH0sCi0gICAgeyAweDUxRDAsIDB4NTFEMiwgMHg1MUQ0LCAweDUxRDYsIDB4NTFEOCwgMHg1MURBLCAweDUxREMsIDB4NTFERSwKLSAgICAgIDB4NTFFMCwgMHg1MUUyLCAweDUxRTQsIDB4NTFFNiwgMHg1MUU4LCAweDUxRUEsIDB4NTFFQywgMHg1MUVFLAotICAgICAgMHg1MUYwLCAweDUxRjIsIDB4NTFGNCwgMHg1MUY2LCAweDUxRjgsIDB4NTFGQSwgMHg1MUZDLCAweDUxRkUsCi0gICAgICAweDcwQzAsIDB4NzBDMiwgMHg3MEM0LCAweDcwQzYsIDB4NzBDOCwgMHg3MENBLCAweDcwQ0MsIDB4NzBDRSwKLSAgICAgIDB4NzBFQywgMHgxMEVBLCAweDM4NjgsIDB4Mzg3NywgMHgwODc2LCAweDFDMzUsIDB4MDQzNCwgMHgwQTM0LAotICAgICAgMHgwRTFCLCAweDAyMUIsIDB4MDUxQiwgMHgwNzBGLCAweDAxMEYsIDB4MDM4MCwgMHgwMDgwLCAweDAxNDAsCi0gICAgICAweDAxQzEsIDB4MDA0MSwgMHgwMEExLCAweDAwRTIsIDB4MDAyMiwgMHgwMDUyLCAweDAwNzIsIDB4MDAxMiwKLSAgICAgIDB4MDAyQSwgMHgwMDNBLCAweDAwMEEsIDB4MDAxNiwgMHgwMDFFLCAweDAwMDYsIDB4MDAwQywgMHgwMDAwLAotICAgICAgMHgwMDA0LCAweDAwMDEsIDB4MDAwRCwgMHgwMDA3LCAweDAwMUYsIDB4MDAxNywgMHgwMDBCLCAweDAwM0IsCi0gICAgICAweDAwMkIsIDB4MDAxMywgMHgwMDczLCAweDAwNTMsIDB4MDAyMywgMHgwMEUzLCAweDAwQTIsIDB4MDA0MiwKLSAgICAgIDB4MDFDMiwgMHgwMTQxLCAweDAwODEsIDB4MDM4MSwgMHgwMjhDLCAweDAxMEMsIDB4MDUxQywgMHgwMjFDLAotICAgICAgMHgwRTFDLCAweDBBMzUsIDB4MDQzNSwgMHgxQzNBLCAweDA4NzcsIDB4MDg3NCwgMHgzODY5LCAweDEwRUIsCi0gICAgICAweDcwRUQsIDB4NzBDRiwgMHg3MENELCAweDcwQ0IsIDB4NzBDOSwgMHg3MEM3LCAweDcwQzUsIDB4NzBDMywKLSAgICAgIDB4NzBDMSwgMHg1MUZGLCAweDUxRkQsIDB4NTFGQiwgMHg1MUY5LCAweDUxRjcsIDB4NTFGNSwgMHg1MUYzLAotICAgICAgMHg1MUYxLCAweDUxRUYsIDB4NTFFRCwgMHg1MUVCLCAweDUxRTksIDB4NTFFNywgMHg1MUU1LCAweDUxRTMsCi0gICAgICAweDUxRTEsIDB4NTFERiwgMHg1MURELCAweDUxREIsIDB4NTFEOSwgMHg1MUQ3LCAweDUxRDUsIDB4NTFEMywKLSAgICAgIDB4NTFEMSwgfSwKLSAgICB7IDB4NkY2NCwgMHg2RjY2LCAweDZGNjgsIDB4NkY2QSwgMHg2RjZDLCAweDZGNkUsIDB4NkY3MCwgMHg2RjcyLAotICAgICAgMHg2Rjc0LCAweDZGNzYsIDB4NkY3OCwgMHg2RjdBLCAweDZGN0MsIDB4NkY3RSwgMHg2RjgwLCAweDZGODIsCi0gICAgICAweDZGODQsIDB4NkY4NiwgMHg2Rjg4LCAweDZGOEEsIDB4NkY4QywgMHg2RjhFLCAweDZGOTAsIDB4NkY5MiwKLSAgICAgIDB4NkY5NCwgMHg2Rjk2LCAweDZGOTgsIDB4NkY5QSwgMHg2RjlDLCAweDZGOUUsIDB4NkZBMCwgMHg2RkEyLAotICAgICAgMHg2RkE0LCAweDZGQTYsIDB4NkZBOCwgMHg2RkFBLCAweDZGQUMsIDB4NkZBRSwgMHg2RkIwLCAweDZGQjIsCi0gICAgICAweDZGQjQsIDB4NkZCNiwgMHgxN0I0LCAweDM3REMsIDB4MEJEQiwgMHgxQkVGLCAweDA1RUUsIDB4MERGOCwKLSAgICAgIDB4MDJGOCwgMHgwNkZELCAweDAxN0QsIDB4MDM3RiwgMHgwMEJGLCAweDAwNDAsIDB4MDBDMCwgMHgwMDIxLAotICAgICAgMHgwMDYxLCAweDAwMTEsIDB4MDAzMSwgMHgwMDA5LCAweDAwMTksIDB4MDAwNiwgMHgwMDBFLCAweDAwMDQsCi0gICAgICAweDAwMDAsIDB4MDAwNSwgMHgwMDBGLCAweDAwMDcsIDB4MDAxQSwgMHgwMDBBLCAweDAwMzYsIDB4MDAxNiwKLSAgICAgIDB4MDA2RSwgMHgwMDJFLCAweDAwQzEsIDB4MDA0MSwgMHgwMUJDLCAweDAwQkMsIDB4MDM3QSwgMHgwMTdBLAotICAgICAgMHgwMkY5LCAweDBERjksIDB4MDVFRiwgMHgwNUVDLCAweDFCRDgsIDB4MzdERCwgMHgxN0I1LCAweDZGQjcsCi0gICAgICAweDZGQjUsIDB4NkZCMywgMHg2RkIxLCAweDZGQUYsIDB4NkZBRCwgMHg2RkFCLCAweDZGQTksIDB4NkZBNywKLSAgICAgIDB4NkZBNSwgMHg2RkEzLCAweDZGQTEsIDB4NkY5RiwgMHg2RjlELCAweDZGOUIsIDB4NkY5OSwgMHg2Rjk3LAotICAgICAgMHg2Rjk1LCAweDZGOTMsIDB4NkY5MSwgMHg2RjhGLCAweDZGOEQsIDB4NkY4QiwgMHg2Rjg5LCAweDZGODcsCi0gICAgICAweDZGODUsIDB4NkY4MywgMHg2RjgxLCAweDZGN0YsIDB4NkY3RCwgMHg2RjdCLCAweDZGNzksIDB4NkY3NywKLSAgICAgIDB4NkY3NSwgMHg2RjczLCAweDZGNzEsIDB4NkY2RiwgMHg2RjZELCAweDZGNkIsIDB4NkY2OSwgMHg2RjY3LAotICAgICAgMHg2RjY1LCB9LAotICAgIHsgMHhERjU0LCAweERGNTYsIDB4REZDOCwgMHhERkNBLCAweERGQ0MsIDB4REZDRSwgMHhERkQwLCAweERGRDIsCi0gICAgICAweERGRDQsIDB4REZENiwgMHhERkQ4LCAweERGREEsIDB4REZEQywgMHhERkRFLCAweERGRTAsIDB4REZFMiwKLSAgICAgIDB4MEZFOCwgMHgyRkVBLCAweDZGQTgsIDB4NkZGNiwgMHgwN0Y1LCAweDA3RjcsIDB4MzdEMiwgMHgzN0Y5LAotICAgICAgMHgwM0Y4LCAweDBCRjgsIDB4MEJGQiwgMHgxQkVCLCAweDAxRkEsIDB4MDVGQSwgMHgwOUZBLCAweDBERkEsCi0gICAgICAweDBERkYsIDB4MDBGRiwgMHgwMkZGLCAweDA2RkIsIDB4MDA3QywgMHgwMTdDLCAweDAyN0MsIDB4MDI3RiwKLSAgICAgIDB4MDAzQywgMHgwMEJDLCAweDAxM0MsIDB4MDFCQywgMHgwMDFDLCAweDAwNUMsIDB4MDA5QywgMHgwMERDLAotICAgICAgMHgwMDBDLCAweDAwMkMsIDB4MDA0QywgMHgwMDZDLCAweDAwMDQsIDB4MDAxNCwgMHgwMDI0LCAweDAwMzQsCi0gICAgICAweDAwMDAsIDB4MDAwOCwgMHgwMDEwLCAweDAwMTgsIDB4MDAxRSwgMHgwMDAyLCAweDAwMDYsIDB4MDAwQSwKLSAgICAgIDB4MDAwRSwgMHgwMDBCLCAweDAwMDcsIDB4MDAwMywgMHgwMDFGLCAweDAwMTksIDB4MDAxMSwgMHgwMDA5LAotICAgICAgMHgwMDAxLCAweDAwMzUsIDB4MDAyNSwgMHgwMDE1LCAweDAwMDUsIDB4MDA2RCwgMHgwMDRELCAweDAwMkQsCi0gICAgICAweDAwMEQsIDB4MDBERCwgMHgwMDlELCAweDAwNUQsIDB4MDAxRCwgMHgwMUJELCAweDAxM0QsIDB4MDBCRCwKLSAgICAgIDB4MDAzRCwgMHgwMzdDLCAweDAyN0QsIDB4MDE3RCwgMHgwMDdELCAweDA2RkMsIDB4MDRGQywgMHgwMkZDLAotICAgICAgMHgwMEZDLCAweDBERkIsIDB4MDlGQiwgMHgwNUZCLCAweDAxRkIsIDB4MUJGOCwgMHgxQkU4LCAweDBCRjksCi0gICAgICAweDAzRjksIDB4MzdGQSwgMHgzN0QzLCAweDE3RjQsIDB4MDdGNiwgMHg2RkY3LCAweDZGQTksIDB4MkZFQiwKLSAgICAgIDB4MEZFOSwgMHhERkUzLCAweERGRTEsIDB4REZERiwgMHhERkRELCAweERGREIsIDB4REZEOSwgMHhERkQ3LAotICAgICAgMHhERkQ1LCAweERGRDMsIDB4REZEMSwgMHhERkNGLCAweERGQ0QsIDB4REZDQiwgMHhERkM5LCAweERGNTcsCi0gICAgICAweERGNTUsIH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNjYWxlc19iaXRzW1NDQUxFU19DT1VOVF1bMTI5XSA9IHsKLSAgICB7IDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAgICAgIDEzLCAxMywgMTIsIDExLCAxMSwgMTAsICA5LCAgOCwKLSAgICAgICA4LCAgNywgIDYsICA2LCAgNSwgIDQsICA0LCAgMywKLSAgICAgICAyLCAgMywgIDMsICA0LCAgNSwgIDUsICA2LCAgNywKLSAgICAgICA4LCAgOCwgIDksIDEwLCAxMSwgMTEsIDEyLCAxMywKLSAgICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAgICAgIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAgICAgIDE0LCB9LAotICAgIHsgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTQsIDE0LCAxMywgMTIsIDExLCAxMCwgIDgsICA3LAotICAgICAgIDYsICA2LCAgNSwgIDUsICA0LCAgNCwgIDQsICAzLAotICAgICAgIDMsICAzLCAgNCwgIDQsICA0LCAgNCwgIDUsICA2LAotICAgICAgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE0LAotICAgICAgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIH0sCi0gICAgeyAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gICAgICAxNSwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsCi0gICAgICAxMiwgMTEsIDExLCAxMSwgMTAsIDEwLCAgOSwgIDksCi0gICAgICAgOSwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDYsCi0gICAgICAgNiwgIDYsICA1LCAgNSwgIDUsICA0LCAgNCwgIDMsCi0gICAgICAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsCi0gICAgICAgNiwgIDYsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsCi0gICAgICAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsCi0gICAgICAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsCi0gICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gICAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gICAgICAxNSwgfSwKLSAgICB7IDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwKLSAgICAgIDExLCAxMSwgMTAsIDEwLCAgOSwgIDgsICA4LCAgNywKLSAgICAgICA3LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgMywKLSAgICAgICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwKLSAgICAgICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwKLSAgICAgIDExLCAxMiwgMTIsIDEyLCAxMywgMTQsIDE0LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAgICAgIDE1LCB9LAotICAgIHsgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotICAgICAgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LAotICAgICAgMTMsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLAotICAgICAgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLAotICAgICAgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LAotICAgICAgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LAotICAgICAgIDUsICA1LCAgNSwgIDUsICA1LCAgNCwgIDQsICA0LAotICAgICAgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LAotICAgICAgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAotICAgICAgIDcsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LAotICAgICAgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAotICAgICAgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLAotICAgICAgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LAotICAgICAgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotICAgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotICAgICAgMTYsCi0gICAgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzNfY29kZXNbM10gPSB7Ci0gICAgMHgwMDAzLCAweDAwMDAsIDB4MDAwMiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzNfYml0c1szXSA9IHsKLSAgICAyLCAgMSwgIDIsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNV9jb2Rlc19hWzVdID0gewotICAgIDB4MDAwRiwgMHgwMDA2LCAweDAwMDAsIDB4MDAwMiwgMHgwMDBFLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzVfY29kZXNfYls1XSA9IHsKLSAgICAweDAwMDcsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDAsIDB4MDAwNiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY181X2NvZGVzX2NbNV0gPSB7Ci0gICAgMHgwMDA3LCAweDAwMDUsIDB4MDAwMCwgMHgwMDA0LCAweDAwMDYsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY181X2JpdHNfYVs1XSA9IHsKLSAgICA0LCAgMywgIDEsICAyLCAgNCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzVfYml0c19iWzVdID0gewotICAgIDMsICAyLCAgMiwgIDIsICAzLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNV9iaXRzX2NbNV0gPSB7Ci0gICAgMywgIDMsICAxLCAgMywgIDMsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfN19jb2Rlc19hWzddID0gewotICAgIDB4MDAxRSwgMHgwMDBFLCAweDAwMDUsIDB4MDAwMCwgMHgwMDA2LCAweDAwMDQsIDB4MDAxRiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY183X2NvZGVzX2JbN10gPSB7Ci0gICAgMHgwMDE0LCAweDAwMEIsIDB4MDAwMCwgMHgwMDAzLCAweDAwMDEsIDB4MDAwNCwgMHgwMDE1LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzdfY29kZXNfY1s3XSA9IHsKLSAgICAweDAwMDAsIDB4MDAwMiwgMHgwMDAxLCAweDAwMDMsIDB4MDAwMiwgMHgwMDAzLCAweDAwMDEsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY183X2JpdHNfYVs3XSA9IHsKLSAgICA1LCAgNCwgIDMsICAxLCAgMywgIDMsICA1LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfN19iaXRzX2JbN10gPSB7Ci0gICAgNSwgIDQsICAyLCAgMiwgIDIsICAzLCAgNSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzdfYml0c19jWzddID0gewotICAgIDQsICA0LCAgMiwgIDIsICAyLCAgNCwgIDQsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfOV9jb2Rlc19hWzldID0gewotICAgIDB4MDAzMCwgMHgwMDE5LCAweDAwMDksIDB4MDAwNSwgMHgwMDAwLCAweDAwMDcsIDB4MDAwRCwgMHgwMDA4LAotICAgIDB4MDAzMSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY185X2NvZGVzX2JbOV0gPSB7Ci0gICAgMHgwMDE4LCAweDAwMUEsIDB4MDAwMiwgMHgwMDA3LCAweDAwMDIsIDB4MDAwMCwgMHgwMDAzLCAweDAwMUIsCi0gICAgMHgwMDE5LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzlfY29kZXNfY1s5XSA9IHsKLSAgICAweDAwMUMsIDB4MDAwRiwgMHgwMDAyLCAweDAwMDcsIDB4MDAwMiwgMHgwMDAwLCAweDAwMDYsIDB4MDAwNiwKLSAgICAweDAwMUQsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY185X2JpdHNfYVs5XSA9IHsKLSAgICA2LCAgNSwgIDQsICAzLCAgMSwgIDMsICA0LCAgNCwgIDYsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY185X2JpdHNfYls5XSA9IHsKLSAgICA1LCAgNSwgIDMsICAzLCAgMiwgIDIsICAzLCAgNSwgIDUsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY185X2JpdHNfY1s5XSA9IHsKLSAgICA2LCAgNSwgIDMsICAzLCAgMiwgIDIsICAzLCAgNCwgIDYsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTNfY29kZXNfYVsxM10gPSB7Ci0gICAgMHgwMDcwLCAweDAwMkUsIDB4MDAzOSwgMHgwMDFELCAweDAwMEMsIDB4MDAwRiwgMHgwMDAwLCAweDAwMDQsCi0gICAgMHgwMDBELCAweDAwMEEsIDB4MDAxNiwgMHgwMDJGLCAweDAwNzEsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTNfY29kZXNfYlsxM10gPSB7Ci0gICAgMHgwMDM4LCAweDAwMTAsIDB4MDAxRCwgMHgwMDA3LCAweDAwMEYsIDB4MDAwNSwgMHgwMDAwLCAweDAwMDYsCi0gICAgMHgwMDAyLCAweDAwMDksIDB4MDAwNiwgMHgwMDExLCAweDAwMzksCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTNfY29kZXNfY1sxM10gPSB7Ci0gICAgMHgwMDA0LCAweDAwMUEsIDB4MDAwMywgMHgwMDBFLCAweDAwMDAsIDB4MDAwMywgMHgwMDA1LCAweDAwMDQsCi0gICAgMHgwMDAyLCAweDAwMEYsIDB4MDAwQywgMHgwMDFCLCAweDAwMDUsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xM19iaXRzX2FbMTNdID0gewotICAgICA3LCAgNiwgIDYsICA1LCAgNCwgIDQsICAxLCAgMywgIDQsICA0LCAgNSwgIDYsICA3LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTNfYml0c19iWzEzXSA9IHsKLSAgICAgNiwgIDUsICA1LCAgNCwgIDQsICAzLCAgMiwgIDMsICAzLCAgNCwgIDQsICA1LCAgNiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzEzX2JpdHNfY1sxM10gPSB7Ci0gICAgIDUsICA1LCAgNCwgIDQsICAzLCAgMywgIDMsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTdfY29kZXNfYVsxN10gPSB7Ci0gICAgMHgwMTU0LCAweDAwQUIsIDB4MDAyQiwgMHgwMDBCLCAweDAwMDMsIDB4MDAwQSwgMHgwMDAxLCAweDAwMDYsCi0gICAgMHgwMDAxLCAweDAwMDcsIDB4MDAwNCwgMHgwMDBCLCAweDAwMDAsIDB4MDAwNCwgMHgwMDE0LCAweDAwNTQsCi0gICAgMHgwMTU1LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzE3X2NvZGVzX2JbMTddID0gewotICAgIDB4MDA3QywgMHgwMDNGLCAweDAwMTksIDB4MDAwRCwgMHgwMDFDLCAweDAwMDgsIDB4MDAwRiwgMHgwMDA1LAotICAgIDB4MDAwMCwgMHgwMDA2LCAweDAwMDIsIDB4MDAwOSwgMHgwMDFELCAweDAwMEUsIDB4MDAxRSwgMHgwMDE4LAotICAgIDB4MDA3RCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xN19jb2Rlc19jWzE3XSA9IHsKLSAgICAweDAwMkMsIDB4MDAxNywgMHgwMDA1LCAweDAwMUMsIDB4MDAwMywgMHgwMDBBLCAweDAwMEYsIDB4MDAwMywKLSAgICAweDAwMDYsIDB4MDAwNCwgMHgwMDAwLCAweDAwMEIsIDB4MDAwNCwgMHgwMDFELCAweDAwMEEsIDB4MDAwNCwKLSAgICAweDAwMkQsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTdfY29kZXNfZFsxN10gPSB7Ci0gICAgMHgwMTAwLCAweDAxMDIsIDB4MDA4MiwgMHgwMDQyLCAweDAwMjIsIDB4MDAxMiwgMHgwMDBBLCAweDAwMDYsCi0gICAgMHgwMDAwLCAweDAwMDcsIDB4MDAwQiwgMHgwMDEzLCAweDAwMjMsIDB4MDA0MywgMHgwMDgzLCAweDAxMDMsCi0gICAgMHgwMTAxLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzE3X2NvZGVzX2VbMTddID0gewotICAgIDB4MDBFOCwgMHgwMEY2LCAweDAwNzUsIDB4MDAzNCwgMHgwMDNCLCAweDAwMUIsIDB4MDAxRiwgMHgwMDA0LAotICAgIDB4MDAwMCwgMHgwMDA1LCAweDAwMEMsIDB4MDAxQywgMHgwMDNDLCAweDAwMzUsIDB4MDA3QSwgMHgwMEY3LAotICAgIDB4MDBFOSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18xN19jb2Rlc19mWzE3XSA9IHsKLSAgICAweDAwMDQsIDB4MDAwMywgMHgwMDFFLCAweDAwMDEsIDB4MDAwMSwgMHgwMDBFLCAweDAwMDEsIDB4MDAwNCwKLSAgICAweDAwMDYsIDB4MDAwNSwgMHgwMDAyLCAweDAwMEYsIDB4MDAwNiwgMHgwMDBFLCAweDAwMUYsIDB4MDAwMCwKLSAgICAweDAwMDUsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMTdfY29kZXNfZ1sxN10gPSB7Ci0gICAgMHgwMDYwLCAweDAwN0UsIDB4MDAzMSwgMHgwMDE5LCAweDAwMEQsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDYsCi0gICAgMHgwMDAyLCAweDAwMDcsIDB4MDAwMSwgMHgwMDA1LCAweDAwMEUsIDB4MDAxRSwgMHgwMDNFLCAweDAwN0YsCi0gICAgMHgwMDYxLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTdfYml0c19hWzE3XSA9IHsKLSAgICAxMiwgMTEsICA5LCAgNywgIDUsICA0LCAgMywgIDMsICAyLCAgMywgIDMsICA0LCAgNCwgIDYsICA4LCAxMCwKLSAgICAxMiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzE3X2JpdHNfYlsxN10gPSB7Ci0gICAgOCwgIDcsICA2LCAgNSwgIDUsICA0LCAgNCwgIDMsICAyLCAgMywgIDMsICA0LCAgNSwgIDUsICA2LCAgNiwKLSAgICA4LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTdfYml0c19jWzE3XSA9IHsKLSAgICA3LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywgIDMsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA1LAotICAgIDcsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xN19iaXRzX2RbMTddID0gewotICAgIDksICA5LCAgOCwgIDcsICA2LCAgNSwgIDQsICAzLCAgMSwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksCi0gICAgOSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzE3X2JpdHNfZVsxN10gPSB7Ci0gICAgOCwgIDgsICA3LCAgNiwgIDYsICA1LCAgNSwgIDMsICAxLCAgMywgIDQsICA1LCAgNiwgIDYsICA3LCAgOCwKLSAgICA4LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTdfYml0c19mWzE3XSA9IHsKLSAgICA4LCAgNywgIDYsICA1LCAgNCwgIDQsICAzLCAgMywgIDMsICAzLCAgMywgIDQsICA0LCAgNSwgIDYsICA2LAotICAgIDgsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18xN19iaXRzX2dbMTddID0gewotICAgIDgsICA4LCAgNywgIDYsICA1LCAgNCwgIDMsICAzLCAgMiwgIDMsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCi0gICAgOCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18yNV9jb2Rlc19hWzI1XSA9IHsKLSAgICAweDI4NTQsIDB4MTQyQiwgMHgwNTBCLCAweDAxNDMsIDB4MDBBMiwgMHgwMDUyLCAweDAwMkUsIDB4MDAxNSwKLSAgICAweDAwMDQsIDB4MDAwRSwgMHgwMDAwLCAweDAwMDMsIDB4MDAwNiwgMHgwMDA0LCAweDAwMDEsIDB4MDAwRiwKLSAgICAweDAwMDUsIDB4MDAxNiwgMHgwMDJGLCAweDAwNTMsIDB4MDBBMywgMHgwMEEwLCAweDAyODQsIDB4MEExNCwKLSAgICAweDI4NTUsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMjVfY29kZXNfYlsyNV0gPSB7Ci0gICAgMHgwMDFDLCAweDAwMEYsIDB4MDAwNSwgMHgwMDAwLCAweDAwMzAsIDB4MDAzNiwgMHgwMDBFLCAweDAwMTksCi0gICAgMHgwMDAxLCAweDAwMDgsIDB4MDAwRSwgMHgwMDAxLCAweDAwMDUsIDB4MDAwMiwgMHgwMDBGLCAweDAwMDksCi0gICAgMHgwMDA2LCAweDAwMUEsIDB4MDAwRiwgMHgwMDM3LCAweDAwMzEsIDB4MDAwMSwgMHgwMDA2LCAweDAwMDQsCi0gICAgMHgwMDFELAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzI1X2NvZGVzX2NbMjVdID0gewotICAgIDB4MDA0QywgMHgwMDI3LCAweDAwNkQsIDB4MDAyOCwgMHgwMDM3LCAweDAwMEUsIDB4MDAxNSwgMHgwMDAwLAotICAgIDB4MDAwNSwgMHgwMDA4LCAweDAwMEIsIDB4MDAwRSwgMHgwMDAxLCAweDAwMEYsIDB4MDAwQywgMHgwMDA5LAotICAgIDB4MDAwNiwgMHgwMDAxLCAweDAwMUEsIDB4MDAwRiwgMHgwMDA4LCAweDAwMjksIDB4MDAxMiwgMHgwMDZDLAotICAgIDB4MDA0RCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18yNV9jb2Rlc19kWzI1XSA9IHsKLSAgICAweDA3ODAsIDB4MDc4MiwgMHgwM0MyLCAweDAxRTIsIDB4MDBGRSwgMHgwMDc5LCAweDAwM0QsIDB4MDAxQywKLSAgICAweDAwMEMsIDB4MDAwNCwgMHgwMDAwLCAweDAwMDYsIDB4MDAwMiwgMHgwMDA3LCAweDAwMDEsIDB4MDAwNSwKLSAgICAweDAwMEQsIDB4MDAxRCwgMHgwMDNFLCAweDAwN0UsIDB4MDBGRiwgMHgwMUUzLCAweDAzQzMsIDB4MDc4MywKLSAgICAweDA3ODEsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMjVfY29kZXNfZVsyNV0gPSB7Ci0gICAgMHgwMDNDLCAweDAwOTIsIDB4MDAxOCwgMHgwMDFGLCAweDAwNEUsIDB4MDAwRCwgMHgwMDI1LCAweDAwMDQsCi0gICAgMHgwMDEwLCAweDAwMDAsIDB4MDAwQSwgMHgwMDAyLCAweDAwMDMsIDB4MDAwMywgMHgwMDBCLCAweDAwMDEsCi0gICAgMHgwMDExLCAweDAwMDUsIDB4MDAyNiwgMHgwMDBFLCAweDAwNEYsIDB4MDA0OCwgMHgwMDE5LCAweDAwOTMsCi0gICAgMHgwMDNELAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzI1X2NvZGVzX2ZbMjVdID0gewotICAgIDB4MDMyNCwgMHgwMTkzLCAweDAwQ0UsIDB4MDA2NSwgMHgwMDI0LCAweDAwMEMsIDB4MDAxMywgMHgwMDA0LAotICAgIDB4MDAwNywgMHgwMDBBLCAweDAwMEQsIDB4MDAwRiwgMHgwMDAxLCAweDAwMDAsIDB4MDAwRSwgMHgwMDBCLAotICAgIDB4MDAwOCwgMHgwMDA1LCAweDAwMTgsIDB4MDAwRCwgMHgwMDI1LCAweDAwNjYsIDB4MDBDRiwgMHgwMEM4LAotICAgIDB4MDMyNSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18yNV9jb2Rlc19nWzI1XSA9IHsKLSAgICAweDAzQTgsIDB4MDNBRSwgMHgwMUQ1LCAweDAwOTQsIDB4MDAxNCwgMHgwMDRCLCAweDAwMEIsIDB4MDAzQiwKLSAgICAweDAwMTMsIDB4MDAwMywgMHgwMDBGLCAweDAwMDUsIDB4MDAwMSwgMHgwMDA2LCAweDAwMDAsIDB4MDAwOCwKLSAgICAweDAwMUMsIDB4MDAwNCwgMHgwMDI0LCAweDAwNzQsIDB4MDAxNSwgMHgwMDk1LCAweDAxRDYsIDB4MDNBRiwKLSAgICAweDAzQTksCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2FbMjVdID0gewotICAgIDE0LCAxMywgMTEsICA5LCAgOCwgIDcsICA2LCAgNSwgIDQsICA0LCAgMywgIDMsICAzLCAgMywgIDMsICA0LAotICAgICA0LCAgNSwgIDYsICA3LCAgOCwgIDgsIDEwLCAxMiwgMTQsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2JbMjVdID0gewotICAgIDksICA4LCAgNywgIDYsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywgIDMsICAzLCAgNCwgIDQsCi0gICAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA5LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMjVfYml0c19jWzI1XSA9IHsKLSAgICA4LCAgNywgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgNCwgIDQsICAzLCAgNCwgIDQsICA0LAotICAgIDQsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYsICA3LCAgOCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzI1X2JpdHNfZFsyNV0gPSB7Ci0gICAgMTIsIDEyLCAxMSwgMTAsICA5LCAgOCwgIDcsICA2LCAgNSwgIDQsICAzLCAgMywgIDIsICAzLCAgMywgIDQsCi0gICAgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzI1X2JpdHNfZVsyNV0gPSB7Ci0gICAgOCwgIDgsICA3LCAgNywgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICAzLCAgMiwgIDMsICA0LCAgNCwKLSAgICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2ZbMjVdID0gewotICAgIDEwLCAgOSwgIDgsICA3LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgNCwgIDQsICAzLCAgMywgIDQsICA0LAotICAgICA0LCAgNCwgIDUsICA1LCAgNiwgIDcsICA4LCAgOCwgMTAsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18yNV9iaXRzX2dbMjVdID0gewotICAgIDEwLCAxMCwgIDksICA4LCAgNywgIDcsICA2LCAgNiwgIDUsICA0LCAgNCwgIDMsICAyLCAgMywgIDMsICA0LAotICAgICA1LCAgNSwgIDYsICA3LCAgNywgIDgsICA5LCAxMCwgMTAsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMzNfY29kZXNfYVszM10gPSB7Ci0gICAgMHgxNTgwLCAweDE1ODIsIDB4MEFDMiwgMHgwNTYyLCAweDAyQjIsIDB4MDE1RSwgMHgwMEFELCAweDAwNTQsCi0gICAgMHgwMDFDLCAweDAwM0MsIDB4MDAwRiwgMHgwMDFGLCAweDAwMDgsIDB4MDAwQiwgMHgwMDBELCAweDAwMDAsCi0gICAgMHgwMDAyLCAweDAwMDEsIDB4MDAwRSwgMHgwMDBDLCAweDAwMDksIDB4MDAwNiwgMHgwMDE0LCAweDAwM0QsCi0gICAgMHgwMDFELCAweDAwNTUsIDB4MDBBRSwgMHgwMTVGLCAweDAyQjMsIDB4MDU2MywgMHgwQUMzLCAweDE1ODMsCi0gICAgMHgxNTgxLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzMzX2NvZGVzX2JbMzNdID0gewotICAgIDB4MDMwQywgMHgwMTg3LCAweDAwNkQsIDB4MDAyOCwgMHgwMDM3LCAweDAwNjYsIDB4MDAxNSwgMHgwMDMxLAotICAgIDB4MDAwMCwgMHgwMDBCLCAweDAwMTIsIDB4MDAxQSwgMHgwMDAxLCAweDAwMDcsIDB4MDAwQSwgMHgwMDBFLAotICAgIDB4MDAwMSwgMHgwMDBGLCAweDAwMEIsIDB4MDAwOCwgMHgwMDA0LCAweDAwMUIsIDB4MDAxMywgMHgwMDBDLAotICAgIDB4MDAwMSwgMHgwMDMyLCAweDAwMUEsIDB4MDA2NywgMHgwMDYwLCAweDAwMjksIDB4MDBDMiwgMHgwMDZDLAotICAgIDB4MDMwRCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18zM19jb2Rlc19jWzMzXSA9IHsKLSAgICAweDAwQ0MsIDB4MDA2NywgMHgwMDA1LCAweDAwNzAsIDB4MDAwMywgMHgwMDFBLCAweDAwMzksIDB4MDAzRiwKLSAgICAweDAwMEEsIDB4MDAxMiwgMHgwMDE4LCAweDAwMUQsIDB4MDAwMSwgMHgwMDAzLCAweDAwMDcsIDB4MDAwQSwKLSAgICAweDAwMEQsIDB4MDAwQiwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMiwgMHgwMDFFLCAweDAwMTksIDB4MDAxMywKLSAgICAweDAwMEIsIDB4MDAwMCwgMHgwMDNFLCAweDAwMUIsIDB4MDAxOCwgMHgwMDcxLCAweDAwMzIsIDB4MDAwNCwKLSAgICAweDAwQ0QsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMzNfY29kZXNfZFszM10gPSB7Ci0gICAgMHgzQUY4LCAweDNBRkEsIDB4MUQ3RSwgMHgwRUJDLCAweDA3NUMsIDB4MDNBQywgMHgwMUQ0LCAweDAwOTQsCi0gICAgMHgwMDE0LCAweDAwNEIsIDB4MDAwQiwgMHgwMDNCLCAweDAwMTMsIDB4MDAwMywgMHgwMDBGLCAweDAwMDUsCi0gICAgMHgwMDAxLCAweDAwMDYsIDB4MDAwMCwgMHgwMDA4LCAweDAwMUMsIDB4MDAwNCwgMHgwMDI0LCAweDAwNzQsCi0gICAgMHgwMDE1LCAweDAwOTUsIDB4MDFENSwgMHgwM0FELCAweDA3NUQsIDB4MEVCRCwgMHgxRDdGLCAweDNBRkIsCi0gICAgMHgzQUY5LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzMzX2NvZGVzX2VbMzNdID0gewotICAgIDB4MDFDOCwgMHgwMUU2LCAweDAwNjQsIDB4MDBFMiwgMHgwMEU1LCAweDAwMzAsIDB4MDAzMywgMHgwMDczLAotICAgIDB4MDA3QSwgMHgwMDFBLCAweDAwM0EsIDB4MDAwMiwgMHgwMDFBLCAweDAwMUYsIDB4MDAwNywgMHgwMDAxLAotICAgIDB4MDAwMiwgMHgwMDAyLCAweDAwMEMsIDB4MDAwMCwgMHgwMDFCLCAweDAwMDMsIDB4MDAzQiwgMHgwMDFCLAotICAgIDB4MDA3QiwgMHgwMDc4LCAweDAwNzAsIDB4MDAzMSwgMHgwMEYyLCAweDAwRTMsIDB4MDA2NSwgMHgwMUU3LAotICAgIDB4MDFDOSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY18zM19jb2Rlc19mWzMzXSA9IHsKLSAgICAweDA3MjQsIDB4MDM5MywgMHgwMUNFLCAweDAwRTUsIDB4MDAyQywgMHgwMDA4LCAweDAwMTcsIDB4MDAzRSwKLSAgICAweDAwMDUsIDB4MDAxNCwgMHgwMDFELCAweDAwMDAsIDB4MDAwMywgMHgwMDA2LCAweDAwMDgsIDB4MDAwQiwKLSAgICAweDAwMEQsIDB4MDAwQywgMHgwMDA5LCAweDAwMDcsIDB4MDAwNCwgMHgwMDAxLCAweDAwMUUsIDB4MDAxNSwKLSAgICAweDAwMEEsIDB4MDAzRiwgMHgwMDM4LCAweDAwMDksIDB4MDAyRCwgMHgwMEU2LCAweDAxQ0YsIDB4MDFDOCwKLSAgICAweDA3MjUsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfMzNfY29kZXNfZ1szM10gPSB7Ci0gICAgMHgwMjg0LCAweDAwNDIsIDB4MDE0MCwgMHgwMTQzLCAweDAwM0UsIDB4MDBCRSwgMHgwMDExLCAweDAwNTEsCi0gICAgMHgwMDA5LCAweDAwMjksIDB4MDAwNSwgMHgwMDE1LCAweDAwMDAsIDB4MDAwOCwgMHgwMDBFLCAweDAwMDIsCi0gICAgMHgwMDA2LCAweDAwMDMsIDB4MDAwRiwgMHgwMDA5LCAweDAwMDEsIDB4MDAxNiwgMHgwMDA2LCAweDAwMkUsCi0gICAgMHgwMDBFLCAweDAwNUUsIDB4MDAxRSwgMHgwMEJGLCAweDAwM0YsIDB4MDAyMCwgMHgwMTQxLCAweDAwNDMsCi0gICAgMHgwMjg1LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMzNfYml0c19hWzMzXSA9IHsKLSAgICAxMywgMTMsIDEyLCAxMSwgMTAsICA5LCAgOCwgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywKLSAgICAgMywgIDMsICA0LCAgNCwgIDQsICA0LCAgNSwgIDYsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywKLSAgICAxMywKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzMzX2JpdHNfYlszM10gPSB7Ci0gICAgMTAsICA5LCAgOCwgIDcsICA3LCAgNywgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsCi0gICAgIDMsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsCi0gICAgMTAsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18zM19iaXRzX2NbMzNdID0gewotICAgIDksICA4LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsCi0gICAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKLSAgICA5LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMzNfYml0c19kWzMzXSA9IHsKLSAgICAxNCwgMTQsIDEzLCAxMiwgMTEsIDEwLCAgOSwgIDgsICA3LCAgNywgIDYsICA2LCAgNSwgIDQsICA0LCAgMywKLSAgICAgMiwgIDMsICAzLCAgNCwgIDUsICA1LCAgNiwgIDcsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKLSAgICAxNCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzMzX2JpdHNfZVszM10gPSB7Ci0gICAgOSwgIDksICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA1LCAgNSwgIDUsICA0LCAgMywKLSAgICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LAotICAgIDksCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY18zM19iaXRzX2ZbMzNdID0gewotICAgIDExLCAxMCwgIDksICA4LCAgNywgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LAotICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgOCwgIDksICA5LAotICAgIDExLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMzNfYml0c19nWzMzXSA9IHsKLSAgICAxMCwgIDksICA5LCAgOSwgIDgsICA4LCAgNywgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LCAgMywKLSAgICAgMywgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwKLSAgICAxMCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY182NV9jb2Rlc19hWzY1XSA9IHsKLSAgICAweDlFNUMsIDB4OUU1RSwgMHg0RjJDLCAweDI3OTQsIDB4MTNDNCwgMHgxRTQ0LCAweDA5RTMsIDB4MEYyMywKLSAgICAweDA0RjMsIDB4MDc5MiwgMHgwMjdFLCAweDAzQ0UsIDB4MDEzRCwgMHgwMUU1LCAweDAwOUMsIDB4MDBDQywKLSAgICAweDAwNDAsIDB4MDA1OCwgMHgwMDY3LCAweDAwMUUsIDB4MDAyMSwgMHgwMDJELCAweDAwM0QsIDB4MDAwNywKLSAgICAweDAwMTEsIDB4MDAxNCwgMHgwMDE3LCAweDAwMUEsIDB4MDAxQywgMHgwMDFGLCAweDAwMDEsIDB4MDAwNCwKLSAgICAweDAwMDYsIDB4MDAwNSwgMHgwMDAyLCAweDAwMDAsIDB4MDAxRCwgMHgwMDFCLCAweDAwMTgsIDB4MDAxNSwKLSAgICAweDAwMTIsIDB4MDAwRSwgMHgwMDA2LCAweDAwMzIsIDB4MDAyNiwgMHgwMDFGLCAweDAwNzgsIDB4MDA1OSwKLSAgICAweDAwNDEsIDB4MDBDRCwgMHgwMDlELCAweDAxRTYsIDB4MDEzRSwgMHgwM0NGLCAweDAyN0YsIDB4MDc5MywKLSAgICAweDA3OTAsIDB4MDRGMCwgMHgwOUU0LCAweDFFNDUsIDB4MTNDNSwgMHgyNzk1LCAweDRGMkQsIDB4OUU1RiwKLSAgICAweDlFNUQsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNjVfY29kZXNfYls2NV0gPSB7Ci0gICAgMHgwQThDLCAweDA1NDcsIDB4MDFCNSwgMHgwMDA4LCAweDAwREIsIDB4MDE1MiwgMHgwMDA1LCAweDAwMEIsCi0gICAgMHgwMDhFLCAweDAwQUUsIDB4MDBFNCwgMHgwMDAzLCAweDAwMzcsIDB4MDAzOSwgMHgwMDU1LCAweDAwNkMsCi0gICAgMHgwMDczLCAweDAwMDMsIDB4MDAxNSwgMHgwMDFELCAweDAwMjgsIDB4MDAzMCwgMHgwMDM3LCAweDAwM0UsCi0gICAgMHgwMDA2LCAweDAwMEIsIDB4MDAwRiwgMHgwMDEyLCAweDAwMTYsIDB4MDAxOSwgMHgwMDFELCAweDAwMDEsCi0gICAgMHgwMDA0LCAweDAwMDIsIDB4MDAxRSwgMHgwMDFBLCAweDAwMTcsIDB4MDAxMywgMHgwMDEwLCAweDAwMEMsCi0gICAgMHgwMDA3LCAweDAwM0YsIDB4MDAzOCwgMHgwMDMxLCAweDAwMjksIDB4MDAyMiwgMHgwMDFBLCAweDAwMTQsCi0gICAgMHgwMDAwLCAweDAwNkQsIDB4MDA1NiwgMHgwMDQ2LCAweDAwMzgsIDB4MDAwNCwgMHgwMEU1LCAweDAwQUYsCi0gICAgMHgwMDhGLCAweDAwNkMsIDB4MDAwQSwgMHgwMTUzLCAweDAxNTAsIDB4MDAwOSwgMHgwMkEyLCAweDAxQjQsCi0gICAgMHgwQThELAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzY1X2NvZGVzX2NbNjVdID0gewotICAgIDB4MDQ1QywgMHgwMjJGLCAweDAzRjUsIDB4MDFCQywgMHgwMUZCLCAweDAwNTksIDB4MDBEMCwgMHgwMERGLAotICAgIDB4MDAwQSwgMHgwMDJELCAweDAwMkYsIDB4MDA1MiwgMHgwMDY5LCAweDAwNzgsIDB4MDA3RiwgMHgwMDBBLAotICAgIDB4MDAxMCwgMHgwMDFDLCAweDAwMjMsIDB4MDAyQSwgMHgwMDM1LCAweDAwM0EsIDB4MDAzRCwgMHgwMDAwLAotICAgIDB4MDAwMywgMHgwMDA2LCAweDAwMDksIDB4MDAwQywgMHgwMDBGLCAweDAwMTIsIDB4MDAxNiwgMHgwMDE4LAotICAgIDB4MDAxQywgMHgwMDE5LCAweDAwMTcsIDB4MDAxMywgMHgwMDEwLCAweDAwMEQsIDB4MDAwQSwgMHgwMDA3LAotICAgIDB4MDAwNCwgMHgwMDAxLCAweDAwM0UsIDB4MDAzQiwgMHgwMDM2LCAweDAwMkIsIDB4MDAyOCwgMHgwMDFELAotICAgIDB4MDAxMSwgMHgwMDBCLCAweDAwMDQsIDB4MDA3OSwgMHgwMDZFLCAweDAwNTMsIDB4MDA0NCwgMHgwMDJFLAotICAgIDB4MDAwQiwgMHgwMEZDLCAweDAwRDEsIDB4MDA4QSwgMHgwMDU4LCAweDAxQkQsIDB4MDExNiwgMHgwM0Y0LAotICAgIDB4MDQ1RCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY182NV9jb2Rlc19kWzY1XSA9IHsKLSAgICAweDcwQjAsIDB4NzBCMiwgMHg3MEI0LCAweDI4NTIsIDB4Mzg1QiwgMHgxNDJFLCAweDFDMkUsIDB4MEExNSwKLSAgICAweDBFMTQsIDB4MDIxNCwgMHgwNzA0LCAweDAxMDQsIDB4MDEwQiwgMHgwMzgzLCAweDAwODMsIDB4MDE0MywKLSAgICAweDAxQzMsIDB4MDA0MywgMHgwMEEyLCAweDAwRTIsIDB4MDAyMiwgMHgwMDUyLCAweDAwNzIsIDB4MDAxMiwKLSAgICAweDAwMkEsIDB4MDAzQSwgMHgwMDBBLCAweDAwMTYsIDB4MDAxRSwgMHgwMDA2LCAweDAwMEMsIDB4MDAwMCwKLSAgICAweDAwMDQsIDB4MDAwMSwgMHgwMDBELCAweDAwMDcsIDB4MDAxRiwgMHgwMDE3LCAweDAwMEIsIDB4MDAzQiwKLSAgICAweDAwMkIsIDB4MDAxMywgMHgwMDczLCAweDAwNTMsIDB4MDAyMywgMHgwMEUzLCAweDAwQTMsIDB4MDBBMCwKLSAgICAweDAwNDAsIDB4MDFDMCwgMHgwMDg0LCAweDAzODQsIDB4MDI4NCwgMHgwMTA1LCAweDA3MDUsIDB4MDIxNSwKLSAgICAweDBFMTUsIDB4MEExNiwgMHgxQzJGLCAweDE0MkYsIDB4MTQyOCwgMHgyODUzLCAweDcwQjUsIDB4NzBCMywKLSAgICAweDcwQjEsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgYml0YWxsb2NfNjVfY29kZXNfZVs2NV0gPSB7Ci0gICAgMHgwMzJDLCAweDAzMzIsIDB4MDM3OCwgMHgwMzdFLCAweDAwOEMsIDB4MDE0QSwgMHgwMTg4LCAweDAxOTcsCi0gICAgMHgwMTlFLCAweDAxQkQsIDB4MDA0NCwgMHgwMDQ3LCAweDAwQUEsIDB4MDBDNSwgMHgwMENELCAweDAwREMsCi0gICAgMHgwMDFDLCAweDAwMkMsIDB4MDA1MywgMHgwMDYzLCAweDAwNjgsIDB4MDAwOCwgMHgwMDBGLCAweDAwMTcsCi0gICAgMHgwMDJCLCAweDAwMzUsIDB4MDAwNSwgMHgwMDA5LCAweDAwMTYsIDB4MDAxQywgMHgwMDA2LCAweDAwMEYsCi0gICAgMHgwMDA0LCAweDAwMDAsIDB4MDAwNywgMHgwMDFELCAweDAwMTcsIDB4MDAwQSwgMHgwMDA2LCAweDAwMzYsCi0gICAgMHgwMDMwLCAweDAwMjgsIDB4MDAxMCwgMHgwMDA5LCAweDAwNjksIDB4MDA2NCwgMHgwMDU0LCAweDAwMkQsCi0gICAgMHgwMDFELCAweDAwREQsIDB4MDBDRSwgMHgwMENBLCAweDAwQUIsIDB4MDBBNCwgMHgwMDQ1LCAweDAxQkUsCi0gICAgMHgwMTlGLCAweDAxOTgsIDB4MDE4OSwgMHgwMTRCLCAweDAwOEQsIDB4MDM3RiwgMHgwMzc5LCAweDAzMzMsCi0gICAgMHgwMzJELAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzY1X2NvZGVzX2ZbNjVdID0gewotICAgIDB4MEZFMCwgMHgwRkUyLCAweDBGRTgsIDB4MEZFQSwgMHgwRkVDLCAweDBGRUUsIDB4MEZGMCwgMHgwRkYyLAotICAgIDB4MEZGNCwgMHgyRkYyLCAweDA3RjIsIDB4MDdGQiwgMHgwM0Y2LCAweDBCRkEsIDB4MEJGRCwgMHgwMUZGLAotICAgIDB4MDVGRiwgMHgwMkZDLCAweDAwN0MsIDB4MDE3QywgMHgwMDNDLCAweDAwQkMsIDB4MDAxQywgMHgwMDVDLAotICAgIDB4MDAwQywgMHgwMDJDLCAweDAwMDQsIDB4MDAxNCwgMHgwMDAwLCAweDAwMDgsIDB4MDAwRSwgMHgwMDAyLAotICAgIDB4MDAwNiwgMHgwMDAzLCAweDAwMEYsIDB4MDAwOSwgMHgwMDAxLCAweDAwMTUsIDB4MDAwNSwgMHgwMDJELAotICAgIDB4MDAwRCwgMHgwMDVELCAweDAwMUQsIDB4MDBCRCwgMHgwMDNELCAweDAxN0QsIDB4MDA3RCwgMHgwMkZELAotICAgIDB4MDBGQywgMHgwNUZDLCAweDAxRkEsIDB4MEJGQiwgMHgwM0Y3LCAweDE3RjgsIDB4MDdGMywgMHgyRkYzLAotICAgIDB4MEZGNSwgMHgwRkYzLCAweDBGRjEsIDB4MEZFRiwgMHgwRkVELCAweDBGRUIsIDB4MEZFOSwgMHgwRkUzLAotICAgIDB4MEZFMSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiaXRhbGxvY182NV9jb2Rlc19nWzY1XSA9IHsKLSAgICAweDAxMEMsIDB4MDM4QSwgMHgwNjA4LCAweDA3ODYsIDB4MDA4NCwgMHgwMDg3LCAweDAzMDIsIDB4MDMwNSwKLSAgICAweDAwNDAsIDB4MDBFMCwgMHgwMEUzLCAweDAxODMsIDB4MDAxRSwgMHgwMDVFLCAweDAwOUUsIDB4MDBERSwKLSAgICAweDAwRjEsIDB4MDAxMSwgMHgwMDM5LCAweDAwNjEsIDB4MDA3OSwgMHgwMDA5LCAweDAwMUQsIDB4MDAzMSwKLSAgICAweDAwM0QsIDB4MDAwNSwgMHgwMDBGLCAweDAwMTksIDB4MDAxRiwgMHgwMDAzLCAweDAwMDYsIDB4MDAwQSwKLSAgICAweDAwMEUsIDB4MDAwQiwgMHgwMDA4LCAweDAwMDQsIDB4MDAwMCwgMHgwMDFBLCAweDAwMTIsIDB4MDAwQSwKLSAgICAweDAwMDIsIDB4MDAzNiwgMHgwMDI2LCAweDAwMTYsIDB4MDAwNiwgMHgwMDZFLCAweDAwNEUsIDB4MDAyRSwKLSAgICAweDAwMEUsIDB4MDBERiwgMHgwMDlGLCAweDAwNUYsIDB4MDAxRiwgMHgwMUUwLCAweDAxODAsIDB4MDBFMSwKLSAgICAweDAwNDEsIDB4MDNDMiwgMHgwMzAzLCAweDAxQzQsIDB4MDA4NSwgMHgwNzg3LCAweDA2MDksIDB4MDM4QiwKLSAgICAweDAxMEQsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY182NV9iaXRzX2FbNjVdID0gewotICAgIDE2LCAxNiwgMTUsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTEsIDExLCAxMCwgMTAsICA5LCAgOSwgIDgsICA4LAotICAgICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LAotICAgICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LAotICAgICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTMsIDEzLCAxNCwgMTUsIDE2LAotICAgIDE2LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNjVfYml0c19iWzY1XSA9IHsKLSAgICAxMiwgMTEsIDEwLCAgOSwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNywKLSAgICAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNCwKLSAgICAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwKLSAgICAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksIDEwLCAxMCwKLSAgICAxMiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzY1X2JpdHNfY1s2NV0gPSB7Ci0gICAgMTEsIDEwLCAxMCwgIDksICA5LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDYsCi0gICAgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsCi0gICAgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsCi0gICAgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgMTAsCi0gICAgMTEsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY182NV9iaXRzX2RbNjVdID0gewotICAgIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsIDEwLCAxMCwgIDksICA5LAotICAgICA5LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNCwgIDQsICAzLAotICAgICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LAotICAgICA4LCAgOSwgIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTUsIDE1LAotICAgIDE1LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfNjVfYml0c19lWzY1XSA9IHsKLSAgICAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKLSAgICAgNywgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA0LCAgNCwKLSAgICAgMywgIDMsICA0LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywKLSAgICAgNywgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwKLSAgICAxMCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJpdGFsbG9jXzY1X2JpdHNfZls2NV0gPSB7Ci0gICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsCi0gICAgMTEsIDEwLCAgOSwgIDksICA4LCAgOCwgIDcsICA3LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwgIDMsCi0gICAgIDMsICAzLCAgNCwgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsCi0gICAgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gICAgMTQsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBiaXRhbGxvY182NV9iaXRzX2dbNjVdID0gewotICAgIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LAotICAgICA4LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNCwgIDQsICA0LAotICAgICA0LCAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAotICAgICA3LCAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAotICAgIDExLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19hWzEyOV0gPSB7Ci0gICAgMHgwNjYwLCAweDA2NjYsIDB4MDZFQywgMHgwNzIyLCAweDA3NjAsIDB4MDc2RSwgMHgwMDRDLCAweDAwNEUsCi0gICAgMHgwMEY0LCAweDAxMEEsIDB4MDE0OCwgMHgwMTU2LCAweDAxRDQsIDB4MDFGMiwgMHgwMzMxLCAweDAzNzAsCi0gICAgMHgwMzc3LCAweDAzOTYsIDB4MDNCMSwgMHgwMDI0LCAweDAwNjQsIDB4MDA3QiwgMHgwMDhBLCAweDAwQTUsCi0gICAgMHgwMEQ0LCAweDAwRUIsIDB4MDBGQSwgMHgwMTlBLCAweDAxQjksIDB4MDFDOSwgMHgwMUQ5LCAweDAwMTAsCi0gICAgMHgwMDMwLCAweDAwMzMsIDB4MDA0MywgMHgwMDUzLCAweDAwNkIsIDB4MDA3QSwgMHgwMENBLCAweDAwRDIsCi0gICAgMHgwMERFLCAweDAwRTYsIDB4MDBGNiwgMHgwMDBFLCAweDAwMUYsIDB4MDAyMywgMHgwMDJCLCAweDAwM0IsCi0gICAgMHgwMDNGLCAweDAwNjcsIDB4MDA3MCwgMHgwMDc3LCAweDAwMDUsIDB4MDAwRCwgMHgwMDEyLCAweDAwMUIsCi0gICAgMHgwMDJDLCAweDAwMzUsIDB4MDAzQSwgMHgwMDA0LCAweDAwMEIsIDB4MDAxNywgMHgwMDFGLCAweDAwMDksCi0gICAgMHgwMDA4LCAweDAwMEEsIDB4MDAwMCwgMHgwMDE4LCAweDAwMEMsIDB4MDAwNSwgMHgwMDNDLCAweDAwMzYsCi0gICAgMHgwMDJELCAweDAwMUMsIDB4MDAxMywgMHgwMDBFLCAweDAwMDYsIDB4MDA3QSwgMHgwMDcxLCAweDAwNjgsCi0gICAgMHgwMDY0LCAweDAwM0MsIDB4MDAzNCwgMHgwMDI4LCAweDAwMjAsIDB4MDAwRiwgMHgwMEY3LCAweDAwRTcsCi0gICAgMHgwMERGLCAweDAwRDMsIDB4MDBDQiwgMHgwMDdCLCAweDAwNzQsIDB4MDA1NCwgMHgwMDQ0LCAweDAwM0MsCi0gICAgMHgwMDMxLCAweDAwMTEsIDB4MDFEQSwgMHgwMUNBLCAweDAxQkEsIDB4MDE5QiwgMHgwMEZCLCAweDAwRjgsCi0gICAgMHgwMEQ1LCAweDAwQUEsIDB4MDA4QiwgMHgwMDg0LCAweDAwNjUsIDB4MDAyNSwgMHgwM0I2LCAweDAzOTcsCi0gICAgMHgwMzkwLCAweDAzNzEsIDB4MDMzMiwgMHgwMUYzLCAweDAxRDUsIDB4MDE1NywgMHgwMTQ5LCAweDAxMEIsCi0gICAgMHgwMEY1LCAweDAwNEYsIDB4MDA0RCwgMHgwNzZGLCAweDA3NjEsIDB4MDcyMywgMHgwNkVELCAweDA2NjcsCi0gICAgMHgwNjYxLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19iWzEyOV0gPSB7Ci0gICAgMHgyOURDLCAweDE0RUYsIDB4MDQ1NSwgMHgwRTlDLCAweDAyMkIsIDB4MDQ4OSwgMHgwNzQwLCAweDA3NEYsCi0gICAgMHgwMTcyLCAweDAyNDUsIDB4MDI0NywgMHgwMzBBLCAweDAzQTEsIDB4MDAxQywgMHgwMDhCLCAweDAwRDYsCi0gICAgMHgwMTBDLCAweDAxNDgsIDB4MDE0RiwgMHgwMTg2LCAweDAxRDEsIDB4MDAwOCwgMHgwMDBGLCAweDAwNDYsCi0gICAgMHgwMDVELCAweDAwNzgsIDB4MDA4NywgMHgwMDk2LCAweDAwQTUsIDB4MDBCQywgMHgwMEQ4LCAweDAwREUsCi0gICAgMHgwMEY2LCAweDAwMDUsIDB4MDAxNCwgMHgwMDI0LCAweDAwMkYsIDB4MDAzQSwgMHgwMDNELCAweDAwNDksCi0gICAgMHgwMDUwLCAweDAwNTgsIDB4MDA1RiwgMHgwMDY2LCAweDAwNkQsIDB4MDA3NSwgMHgwMDdDLCAweDAwMDQsCi0gICAgMHgwMDBCLCAweDAwMTMsIDB4MDAxOCwgMHgwMDFCLCAweDAwMUYsIDB4MDAyMiwgMHgwMDI2LCAweDAwMkEsCi0gICAgMHgwMDJELCAweDAwMzEsIDB4MDAzNCwgMHgwMDM4LCAweDAwM0IsIDB4MDAzRiwgMHgwMDAzLCAweDAwMDYsCi0gICAgMHgwMDBBLCAweDAwMDcsIDB4MDAwNCwgMHgwMDAwLCAweDAwM0MsIDB4MDAzOSwgMHgwMDM1LCAweDAwMzIsCi0gICAgMHgwMDJFLCAweDAwMkIsIDB4MDAyNywgMHgwMDIzLCAweDAwMjAsIDB4MDAxQywgMHgwMDE5LCAweDAwMTYsCi0gICAgMHgwMDEwLCAweDAwMDUsIDB4MDA3RCwgMHgwMDdBLCAweDAwNkUsIDB4MDA2NywgMHgwMDYwLCAweDAwNTksCi0gICAgMHgwMDUxLCAweDAwNEEsIDB4MDA0MiwgMHgwMDNCLCAweDAwMzQsIDB4MDAyNSwgMHgwMDE1LCAweDAwMDYsCi0gICAgMHgwMEY3LCAweDAwREYsIDB4MDBEOSwgMHgwMEJELCAweDAwQTYsIDB4MDA5NywgMHgwMDkwLCAweDAwNzksCi0gICAgMHgwMDZBLCAweDAwNDcsIDB4MDA0NCwgMHgwMDA5LCAweDAxRDIsIDB4MDE4NywgMHgwMTg0LCAweDAxNDksCi0gICAgMHgwMTBELCAweDAwRDcsIDB4MDBCOCwgMHgwMDFELCAweDAzQTYsIDB4MDMwQiwgMHgwMjlDLCAweDAyNDYsCi0gICAgMHgwMTczLCAweDAxMTQsIDB4MDc0MSwgMHgwNTNBLCAweDA0ODgsIDB4MEU5RCwgMHgwQTc2LCAweDA0NTQsCi0gICAgMHgyOURELAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19jWzEyOV0gPSB7Ci0gICAgMHgwRTVDLCAweDA3MkYsIDB4MDAxRCwgMHgwNzI0LCAweDAwMEYsIDB4MDEwRCwgMHgwMzI0LCAweDAzOTMsCi0gICAgMHgwM0U5LCAweDAwODAsIDB4MDA4NywgMHgwMEZBLCAweDAxNjQsIDB4MDE5MywgMHgwMURFLCAweDAxRjUsCi0gICAgMHgwMDEwLCAweDAwMkEsIDB4MDA0MSwgMHgwMDY0LCAweDAwNzMsIDB4MDA4RSwgMHgwMEE0LCAweDAwQjMsCi0gICAgMHgwMEQ2LCAweDAwRTUsIDB4MDBGNCwgMHgwMEZCLCAweDAwMDIsIDB4MDAwOSwgMHgwMDEzLCAweDAwMUUsCi0gICAgMHgwMDI2LCAweDAwMkMsIDB4MDAzMywgMHgwMDNGLCAweDAwNDEsIDB4MDA0QywgMHgwMDUzLCAweDAwNUUsCi0gICAgMHgwMDY1LCAweDAwNzAsIDB4MDA3MywgMHgwMDc4LCAweDAwN0IsIDB4MDA3RSwgMHgwMDAyLCAweDAwMDUsCi0gICAgMHgwMDA3LCAweDAwMEIsIDB4MDAwRCwgMHgwMDExLCAweDAwMTQsIDB4MDAxNywgMHgwMDFBLCAweDAwMUQsCi0gICAgMHgwMDIxLCAweDAwMjQsIDB4MDAyNywgMHgwMDJBLCAweDAwMkQsIDB4MDAzMCwgMHgwMDMzLCAweDAwMzYsCi0gICAgMHgwMDNBLCAweDAwMzcsIDB4MDAzNCwgMHgwMDMxLCAweDAwMkUsIDB4MDAyQiwgMHgwMDI4LCAweDAwMjUsCi0gICAgMHgwMDIyLCAweDAwMUUsIDB4MDAxQiwgMHgwMDE4LCAweDAwMTUsIDB4MDAxMiwgMHgwMDBFLCAweDAwMEMsCi0gICAgMHgwMDA4LCAweDAwMDYsIDB4MDAwMywgMHgwMDdGLCAweDAwN0MsIDB4MDA3OSwgMHgwMDc2LCAweDAwNzEsCi0gICAgMHgwMDZBLCAweDAwNUYsIDB4MDA1OCwgMHgwMDRELCAweDAwNDYsIDB4MDA0MCwgMHgwMDM4LCAweDAwMkQsCi0gICAgMHgwMDI3LCAweDAwMUYsIDB4MDAxNCwgMHgwMDEyLCAweDAwMDMsIDB4MDAwMCwgMHgwMEY1LCAweDAwRUUsCi0gICAgMHgwMEQ3LCAweDAwQzgsIDB4MDBBNSwgMHgwMDhGLCAweDAwN0MsIDB4MDA2NSwgMHgwMDQyLCAweDAwMkIsCi0gICAgMHgwMDExLCAweDAwMDIsIDB4MDFERiwgMHgwMUM4LCAweDAxNjUsIDB4MDBGQiwgMHgwMEU0LCAweDAwODEsCi0gICAgMHgwMDA2LCAweDAzRTgsIDB4MDMyNSwgMHgwMUNBLCAweDAxMEMsIDB4MDcyNSwgMHgwMzk2LCAweDAwMUMsCi0gICAgMHgwRTVELAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19kWzEyOV0gPSB7Ci0gICAgMHhBNTk4LCAweEE1OUEsIDB4QTU5QywgMHhBNTlFLCAweEM1OTgsIDB4RTU4NiwgMHgzQUNDLCAweDUyQ0EsCi0gICAgMHg2MkNELCAweDBENDgsIDB4MUQ2NywgMHgyOTc4LCAweDMxNjcsIDB4Mzk2NiwgMHgwNkE1LCAweDBFQkMsCi0gICAgMHgxNEJELCAweDFDQjEsIDB4MDM1MCwgMHgwMzUzLCAweDA3NUYsIDB4MEE1RiwgMHgwQzVFLCAweDBFNUUsCi0gICAgMHgwMUFFLCAweDAzQUQsIDB4MDUyRCwgMHgwNjJELCAweDA3MkQsIDB4MDBENSwgMHgwMUQ0LCAweDAyOTQsCi0gICAgMHgwMzE0LCAweDAzOTQsIDB4MDAxNCwgMHgwMDk0LCAweDAxMTQsIDB4MDE3NCwgMHgwMUI0LCAweDAxRjQsCi0gICAgMHgwMDBCLCAweDAwNEIsIDB4MDA4QiwgMHgwMEJCLCAweDAwREIsIDB4MDBGQiwgMHgwMDFCLCAweDAwM0IsCi0gICAgMHgwMDUzLCAweDAwNjMsIDB4MDA3MywgMHgwMDAzLCAweDAwMTMsIDB4MDAyMywgMHgwMDJGLCAweDAwMzcsCi0gICAgMHgwMDNGLCAweDAwMDcsIDB4MDAwRiwgMHgwMDE1LCAweDAwMTksIDB4MDAxRCwgMHgwMDAxLCAweDAwMDUsCi0gICAgMHgwMDA5LCAweDAwMDYsIDB4MDAwMiwgMHgwMDFFLCAweDAwMUEsIDB4MDAxNiwgMHgwMDEwLCAweDAwMDgsCi0gICAgMHgwMDAwLCAweDAwMzgsIDB4MDAzMCwgMHgwMDI4LCAweDAwMUMsIDB4MDAwQywgMHgwMDdDLCAweDAwNkMsCi0gICAgMHgwMDVDLCAweDAwNDQsIDB4MDAyNCwgMHgwMDA0LCAweDAwRTQsIDB4MDBDNCwgMHgwMEE0LCAweDAwNzQsCi0gICAgMHgwMDM0LCAweDAxRjUsIDB4MDFCNSwgMHgwMTc1LCAweDAxMTUsIDB4MDA5NSwgMHgwMDE1LCAweDAzOTUsCi0gICAgMHgwMzE1LCAweDAyOTUsIDB4MDFENSwgMHgwMEQ2LCAweDA3MkUsIDB4MDYyRSwgMHgwNTJFLCAweDAzQUUsCi0gICAgMHgwMUFGLCAweDBFNUYsIDB4MEM1RiwgMHgwQzU4LCAweDBBNTgsIDB4MDc1OCwgMHgwMzUxLCAweDFDQjIsCi0gICAgMHgxOEIyLCAweDBFQkQsIDB4MEVCMiwgMHgzOTY3LCAweDM5NjAsIDB4Mjk3OSwgMHgyOTY0LCAweDBENDksCi0gICAgMHg3MkMyLCAweDUyQ0IsIDB4M0FDRCwgMHhFNTg3LCAweEM1OTksIDB4QTU5RiwgMHhBNTlELCAweEE1OUIsCi0gICAgMHhBNTk5LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19lWzEyOV0gPSB7Ci0gICAgMHhBMTNDLCAweEM3MjAsIDB4QTEzRiwgMHhBMTNFLCAweEExM0QsIDB4RTcyMiwgMHg1MDkwLCAweDYzOTMsCi0gICAgMHg3MzkyLCAweDI4NDksIDB4MzFDRSwgMHgzOUNFLCAweDE0MjUsIDB4MThFNSwgMHgxQ0U1LCAweDA4NDQsCi0gICAgMHgwQTFDLCAweDBDN0MsIDB4MDM2QywgMHgwNDIzLCAweDA1MEYsIDB4MDYzRiwgMHgwMUI3LCAweDAyMTYsCi0gICAgMHgwMjg1LCAweDAzMUQsIDB4MDM5RCwgMHgwMTA5LCAweDAxNDAsIDB4MDE4MCwgMHgwMUM4LCAweDAxQ0YsCi0gICAgMHgwMDdBLCAweDAwOEEsIDB4MDBBMiwgMHgwMEMxLCAweDAwRTUsIDB4MDAxNCwgMHgwMDM3LCAweDAwNDMsCi0gICAgMHgwMDRFLCAweDAwNTYsIDB4MDA2MSwgMHgwMDZDLCAweDAwN0MsIDB4MDAwQiwgMHgwMDFDLCAweDAwMUYsCi0gICAgMHgwMDIzLCAweDAwMjUsIDB4MDAyOSwgMHgwMDJDLCAweDAwMkUsIDB4MDAzMiwgMHgwMDM0LCAweDAwMzcsCi0gICAgMHgwMDNBLCAweDAwM0MsIDB4MDAzRiwgMHgwMDAxLCAweDAwMDMsIDB4MDAwNiwgMHgwMDA4LCAweDAwMEEsCi0gICAgMHgwMDBDLCAweDAwMEIsIDB4MDAwOSwgMHgwMDA3LCAweDAwMDQsIDB4MDAwMiwgMHgwMDAwLCAweDAwM0QsCi0gICAgMHgwMDNCLCAweDAwMzgsIDB4MDAzNSwgMHgwMDMzLCAweDAwMkYsIDB4MDAyRCwgMHgwMDJBLCAweDAwMjYsCi0gICAgMHgwMDI0LCAweDAwMjAsIDB4MDAxRCwgMHgwMDFBLCAweDAwN0QsIDB4MDA2RCwgMHgwMDYyLCAweDAwNTcsCi0gICAgMHgwMDRGLCAweDAwNDQsIDB4MDAzQywgMHgwMDE1LCAweDAwRTYsIDB4MDBDNiwgMHgwMEEzLCAweDAwOEIsCi0gICAgMHgwMDdCLCAweDAwNkMsIDB4MDFDOSwgMHgwMTgxLCAweDAxNDEsIDB4MDEwQSwgMHgwMERBLCAweDAzMUUsCi0gICAgMHgwMjg2LCAweDAyMTcsIDB4MDIxMCwgMHgwNzM4LCAweDA2MzgsIDB4MDUwOCwgMHgwMzZELCAweDBDN0QsCi0gICAgMHgwQTFELCAweDA4NDUsIDB4MUNFNiwgMHgxOEU2LCAweDE0MjYsIDB4MzlDRiwgMHgzMUNGLCAweDI4NEUsCi0gICAgMHg3MzkzLCAweDczOTAsIDB4NTA5MSwgMHhFNzIzLCAweEM3MjQsIDB4QzcyNSwgMHhDNzIyLCAweEM3MjMsCi0gICAgMHhDNzIxLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19mWzEyOV0gPSB7Ci0gICAgMHg3NjJDLCAweDNCMTcsIDB4MTU1NSwgMHgwNjA4LCAweDBBQUIsIDB4MEZGMiwgMHgwMzA1LCAweDAzMDcsCi0gICAgMHgwNzYzLCAweDAwNDYsIDB4MDEwQywgMHgwMUJDLCAweDAyQUIsIDB4MDNCNiwgMHgwM0ZELCAweDAwODAsCi0gICAgMHgwMDg3LCAweDAwREYsIDB4MDE1NiwgMHgwMUQ5LCAweDAxRjgsIDB4MDFGRiwgMHgwMDJBLCAweDAwNDEsCi0gICAgMHgwMDYxLCAweDAwOTQsIDB4MDBENCwgMHgwMEVBLCAweDAwRjIsIDB4MDBGRCwgMHgwMDA5LCAweDAwMEIsCi0gICAgMHgwMDFBLCAweDAwMjYsIDB4MDAzMSwgMHgwMDQwLCAweDAwNEIsIDB4MDA2QiwgMHgwMDczLCAweDAwNzcsCi0gICAgMHgwMDdBLCAweDAwN0MsIDB4MDAwMCwgMHgwMDAyLCAweDAwMDYsIDB4MDAwOCwgMHgwMDBCLCAweDAwMEUsCi0gICAgMHgwMDExLCAweDAwMTQsIDB4MDAxNiwgMHgwMDE5LCAweDAwMUMsIDB4MDAxRSwgMHgwMDIxLCAweDAwMjMsCi0gICAgMHgwMDI2LCAweDAwMjgsIDB4MDAyQiwgMHgwMDJELCAweDAwMkYsIDB4MDAzMSwgMHgwMDMzLCAweDAwMzYsCi0gICAgMHgwMDM4LCAweDAwMzcsIDB4MDAzNCwgMHgwMDMyLCAweDAwMzAsIDB4MDAyRSwgMHgwMDJDLCAweDAwMjksCi0gICAgMHgwMDI3LCAweDAwMjQsIDB4MDAyMiwgMHgwMDFGLCAweDAwMUQsIDB4MDAxQSwgMHgwMDE3LCAweDAwMTUsCi0gICAgMHgwMDEyLCAweDAwMEYsIDB4MDAwQywgMHgwMDA5LCAweDAwMDcsIDB4MDAwMywgMHgwMDAxLCAweDAwN0QsCi0gICAgMHgwMDdCLCAweDAwNzgsIDB4MDA3NCwgMHgwMDcyLCAweDAwNTQsIDB4MDA0MSwgMHgwMDM2LCAweDAwMjcsCi0gICAgMHgwMDFCLCAweDAwMTQsIDB4MDAwQSwgMHgwMEZFLCAweDAwRjMsIDB4MDBFQiwgMHgwMEQ1LCAweDAwOTUsCi0gICAgMHgwMDZFLCAweDAwNDIsIDB4MDAyQiwgMHgwMDEwLCAweDAxRjksIDB4MDFEQSwgMHgwMTU3LCAweDAxNTQsCi0gICAgMHgwMEMwLCAweDAwODEsIDB4MDAyMiwgMHgwM0I3LCAweDAzQjAsIDB4MDFCRCwgMHgwMTBELCAweDAwNDcsCi0gICAgMHgwN0Y4LCAweDA1NTQsIDB4MDMwNiwgMHgwRkYzLCAweDBFQzQsIDB4MDYwOSwgMHgxRDhBLCAweDE1NTQsCi0gICAgMHg3NjJELAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGJpdGFsbG9jXzEyOV9jb2Rlc19nWzEyOV0gPSB7Ci0gICAgMHgxRTIwLCAweDFFNUUsIDB4MDMxQywgMHgwNTFBLCAweDA3MTgsIDB4MDkxNiwgMHgwQjE0LCAweDBEMTIsCi0gICAgMHgwRjExLCAweDAwOTAsIDB4MDE4RiwgMHgwMjhFLCAweDAzOEQsIDB4MDQ4QywgMHgwNThCLCAweDA2OEEsCi0gICAgMHgwNzg5LCAweDAwNDksIDB4MDBDOCwgMHgwMTQ4LCAweDAxQzcsIDB4MDI0NywgMHgwMkM2LCAweDAzNDYsCi0gICAgMHgwM0M1LCAweDAwMjUsIDB4MDA2NSwgMHgwMEE1LCAweDAwRTQsIDB4MDEyNCwgMHgwMTY0LCAweDAxQTQsCi0gICAgMHgwMUUzLCAweDAwMTMsIDB4MDAzMywgMHgwMDUzLCAweDAwNzMsIDB4MDA5MywgMHgwMEIzLCAweDAwRDMsCi0gICAgMHgwMEYzLCAweDAwMEEsIDB4MDAxQSwgMHgwMDJBLCAweDAwM0EsIDB4MDA0QSwgMHgwMDVBLCAweDAwNkEsCi0gICAgMHgwMDdBLCAweDAwMDYsIDB4MDAwRSwgMHgwMDE2LCAweDAwMUUsIDB4MDAyNiwgMHgwMDJFLCAweDAwMzYsCi0gICAgMHgwMDNFLCAweDAwMDQsIDB4MDAwOCwgMHgwMDBDLCAweDAwMTAsIDB4MDAxNCwgMHgwMDE4LCAweDAwMUMsCi0gICAgMHgwMDAwLCAweDAwMUQsIDB4MDAxOSwgMHgwMDE1LCAweDAwMTEsIDB4MDAwRCwgMHgwMDA5LCAweDAwMDUsCi0gICAgMHgwMDNGLCAweDAwMzcsIDB4MDAyRiwgMHgwMDI3LCAweDAwMUYsIDB4MDAxNywgMHgwMDBGLCAweDAwMDcsCi0gICAgMHgwMDdCLCAweDAwNkIsIDB4MDA1QiwgMHgwMDRCLCAweDAwM0IsIDB4MDAyQiwgMHgwMDFCLCAweDAwMEIsCi0gICAgMHgwMDA4LCAweDAwRjAsIDB4MDBEMCwgMHgwMEIwLCAweDAwOTAsIDB4MDA3MCwgMHgwMDUwLCAweDAwMzAsCi0gICAgMHgwMUU0LCAweDAxQTUsIDB4MDE2NSwgMHgwMTI1LCAweDAwRTUsIDB4MDBFMiwgMHgwMEEyLCAweDAwNjIsCi0gICAgMHgwM0NBLCAweDAzNDcsIDB4MDJDNywgMHgwMkM0LCAweDAyNDQsIDB4MDE0OSwgMHgwMEM5LCAweDAwQzYsCi0gICAgMHgwNzk2LCAweDA2OEIsIDB4MDY4OCwgMHgwNDhELCAweDA0OEEsIDB4MDI4RiwgMHgwMjhDLCAweDAwOTEsCi0gICAgMHgwRjJFLCAweDBEMTMsIDB4MEIxNSwgMHgwOTE3LCAweDA3MTksIDB4MDUxQiwgMHgwMzFELCAweDFFNUYsCi0gICAgMHgxRTIxLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfYVsxMjldID0gewotICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAotICAgIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LAotICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDcsICA3LAotICAgICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA0LAotICAgICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LAotICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAotICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLAotICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLAotICAgIDExLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfYlsxMjldID0gewotICAgIDE0LCAxMywgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LAotICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAotICAgICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA2LAotICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LAotICAgICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAotICAgICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAotICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LAotICAgICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLAotICAgIDE0LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfY1sxMjldID0gewotICAgIDEzLCAxMiwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAotICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LAotICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDYsICA2LAotICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAotICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAotICAgICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAotICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAotICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAotICAgIDEzLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfZFsxMjldID0gewotICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLAotICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLAotICAgIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LAotICAgICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LAotICAgICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LAotICAgICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLAotICAgIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAotICAgIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAotICAgIDE2LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfZVsxMjldID0gewotICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEyLAotICAgIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LAotICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LAotICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsICA1LAotICAgICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAotICAgICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LAotICAgICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDEyLAotICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LAotICAgIDE2LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfZlsxMjldID0gewotICAgIDE1LCAxNCwgMTMsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LAotICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LAotICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAotICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAotICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAotICAgICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAotICAgICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LAotICAgICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLAotICAgIDE1LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfMTI5X2JpdHNfZ1sxMjldID0gewotICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAotICAgIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAotICAgICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LAotICAgICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LAotICAgICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LAotICAgICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAotICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAotICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAotICAgIDEzLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2Nfc2l6ZXNbMTBdID0gewotICAgIDMsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA2NSwgMTI5Ci19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IGJpdGFsbG9jX29mZnNldHNbMTBdID0gewotICAgIC0xLCAtMiwgLTMsIC00LCAtNiwgLTgsIC0xMiwgLTE2LCAtMzIsIC02NAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYml0YWxsb2NfbWF4Yml0c1sxMF1bN10gPSB7Ci0gICAgeyAyIH0sCi0gICAgeyA0LCAzLCAzIH0sCi0gICAgeyA1LCA1LCA0IH0sCi0gICAgeyA2LCA1LCA2IH0sCi0gICAgeyA3LCA2LCA1IH0sCi0gICAgeyA5LCA4LCA3LCA5LCA4LCA4LCA4IH0sCi0gICAgeyA5LCA5LCA4LCA5LCA4LCA5LCA5IH0sCi0gICAgeyA5LCA5LCA5LCA5LCA5LCA5LCA5IH0sCi0gICAgeyA5LCA5LCA5LCA5LCA5LCA5LCA5IH0sCi0gICAgeyA5LCA5LCA5LCA5LCA5LCA5LCA5IH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCAqY29uc3QgYml0YWxsb2NfY29kZXNbMTBdWzhdID0gewotICAgIHsgYml0YWxsb2NfM19jb2RlcywgICAgIE5VTEwgfSwKLSAgICB7IGJpdGFsbG9jXzVfY29kZXNfYSwgICBiaXRhbGxvY181X2NvZGVzX2IsICAgYml0YWxsb2NfNV9jb2Rlc19jLCAgIE5VTEwgfSwKLSAgICB7IGJpdGFsbG9jXzdfY29kZXNfYSwgICBiaXRhbGxvY183X2NvZGVzX2IsICAgYml0YWxsb2NfN19jb2Rlc19jLCAgIE5VTEwgfSwKLSAgICB7IGJpdGFsbG9jXzlfY29kZXNfYSwgICBiaXRhbGxvY185X2NvZGVzX2IsICAgYml0YWxsb2NfOV9jb2Rlc19jLCAgIE5VTEwgfSwKLSAgICB7IGJpdGFsbG9jXzEzX2NvZGVzX2EsICBiaXRhbGxvY18xM19jb2Rlc19iLCAgYml0YWxsb2NfMTNfY29kZXNfYywgIE5VTEwgfSwKLSAgICB7IGJpdGFsbG9jXzE3X2NvZGVzX2EsICBiaXRhbGxvY18xN19jb2Rlc19iLCAgYml0YWxsb2NfMTdfY29kZXNfYywgIGJpdGFsbG9jXzE3X2NvZGVzX2QsCi0gICAgICBiaXRhbGxvY18xN19jb2Rlc19lLCAgYml0YWxsb2NfMTdfY29kZXNfZiwgIGJpdGFsbG9jXzE3X2NvZGVzX2csICBOVUxMIH0sCi0gICAgeyBiaXRhbGxvY18yNV9jb2Rlc19hLCAgYml0YWxsb2NfMjVfY29kZXNfYiwgIGJpdGFsbG9jXzI1X2NvZGVzX2MsICBiaXRhbGxvY18yNV9jb2Rlc19kLAotICAgICAgYml0YWxsb2NfMjVfY29kZXNfZSwgIGJpdGFsbG9jXzI1X2NvZGVzX2YsICBiaXRhbGxvY18yNV9jb2Rlc19nLCAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfMzNfY29kZXNfYSwgIGJpdGFsbG9jXzMzX2NvZGVzX2IsICBiaXRhbGxvY18zM19jb2Rlc19jLCAgYml0YWxsb2NfMzNfY29kZXNfZCwKLSAgICAgIGJpdGFsbG9jXzMzX2NvZGVzX2UsICBiaXRhbGxvY18zM19jb2Rlc19mLCAgYml0YWxsb2NfMzNfY29kZXNfZywgIE5VTEwgfSwKLSAgICB7IGJpdGFsbG9jXzY1X2NvZGVzX2EsICBiaXRhbGxvY182NV9jb2Rlc19iLCAgYml0YWxsb2NfNjVfY29kZXNfYywgIGJpdGFsbG9jXzY1X2NvZGVzX2QsCi0gICAgICBiaXRhbGxvY182NV9jb2Rlc19lLCAgYml0YWxsb2NfNjVfY29kZXNfZiwgIGJpdGFsbG9jXzY1X2NvZGVzX2csICBOVUxMIH0sCi0gICAgeyBiaXRhbGxvY18xMjlfY29kZXNfYSwgYml0YWxsb2NfMTI5X2NvZGVzX2IsIGJpdGFsbG9jXzEyOV9jb2Rlc19jLCBiaXRhbGxvY18xMjlfY29kZXNfZCwKLSAgICAgIGJpdGFsbG9jXzEyOV9jb2Rlc19lLCBiaXRhbGxvY18xMjlfY29kZXNfZiwgYml0YWxsb2NfMTI5X2NvZGVzX2csIE5VTEwgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJpdGFsbG9jX2JpdHNbMTBdWzhdID0gewotICAgIHsgYml0YWxsb2NfM19iaXRzLCAgICAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfNV9iaXRzX2EsICAgYml0YWxsb2NfNV9iaXRzX2IsICAgYml0YWxsb2NfNV9iaXRzX2MsICAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfN19iaXRzX2EsICAgYml0YWxsb2NfN19iaXRzX2IsICAgYml0YWxsb2NfN19iaXRzX2MsICAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfOV9iaXRzX2EsICAgYml0YWxsb2NfOV9iaXRzX2IsICAgYml0YWxsb2NfOV9iaXRzX2MsICAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfMTNfYml0c19hLCAgYml0YWxsb2NfMTNfYml0c19iLCAgYml0YWxsb2NfMTNfYml0c19jLCAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfMTdfYml0c19hLCAgYml0YWxsb2NfMTdfYml0c19iLCAgYml0YWxsb2NfMTdfYml0c19jLCAgYml0YWxsb2NfMTdfYml0c19kLAotICAgICAgYml0YWxsb2NfMTdfYml0c19lLCAgYml0YWxsb2NfMTdfYml0c19mLCAgYml0YWxsb2NfMTdfYml0c19nLCAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfMjVfYml0c19hLCAgYml0YWxsb2NfMjVfYml0c19iLCAgYml0YWxsb2NfMjVfYml0c19jLCAgYml0YWxsb2NfMjVfYml0c19kLAotICAgICAgYml0YWxsb2NfMjVfYml0c19lLCAgYml0YWxsb2NfMjVfYml0c19mLCAgYml0YWxsb2NfMjVfYml0c19nLCAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfMzNfYml0c19hLCAgYml0YWxsb2NfMzNfYml0c19iLCAgYml0YWxsb2NfMzNfYml0c19jLCAgYml0YWxsb2NfMzNfYml0c19kLAotICAgICAgYml0YWxsb2NfMzNfYml0c19lLCAgYml0YWxsb2NfMzNfYml0c19mLCAgYml0YWxsb2NfMzNfYml0c19nLCAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfNjVfYml0c19hLCAgYml0YWxsb2NfNjVfYml0c19iLCAgYml0YWxsb2NfNjVfYml0c19jLCAgYml0YWxsb2NfNjVfYml0c19kLAotICAgICAgYml0YWxsb2NfNjVfYml0c19lLCAgYml0YWxsb2NfNjVfYml0c19mLCAgYml0YWxsb2NfNjVfYml0c19nLCAgTlVMTCB9LAotICAgIHsgYml0YWxsb2NfMTI5X2JpdHNfYSwgYml0YWxsb2NfMTI5X2JpdHNfYiwgYml0YWxsb2NfMTI5X2JpdHNfYywgYml0YWxsb2NfMTI5X2JpdHNfZCwKLSAgICAgIGJpdGFsbG9jXzEyOV9iaXRzX2UsIGJpdGFsbG9jXzEyOV9iaXRzX2YsIGJpdGFsbG9jXzEyOV9iaXRzX2csIE5VTEwgfQotfTsKK2F2X2NvbGQgdm9pZCBmZl9kY2FfaW5pdF92bGNzKHZvaWQpOwordWludDMyX3QgZmZfZGNhX3ZsY19jYWxjX3F1YW50X2JpdHMoaW50ICp2YWx1ZXMsIHVpbnQ4X3QgbiwgdWludDhfdCBzZWwsIHVpbnQ4X3QgYWJpdHMpOwordm9pZCBmZl9kY2FfdmxjX2VuY19xdWFudChQdXRCaXRDb250ZXh0ICpwYiwgaW50ICp2YWx1ZXMsIHVpbnQ4X3QgbiwgdWludDhfdCBzZWwsIHVpbnQ4X3QgYWJpdHMpOwordWludDMyX3QgZmZfZGNhX3ZsY19jYWxjX2FsbG9jX2JpdHMoaW50ICp2YWx1ZXMsIHVpbnQ4X3QgbiwgdWludDhfdCBzZWwpOwordm9pZCBmZl9kY2FfdmxjX2VuY19hbGxvYyhQdXRCaXRDb250ZXh0ICpwYiwgaW50ICp2YWx1ZXMsIHVpbnQ4X3QgbiwgdWludDhfdCBzZWwpOwogCiAjZW5kaWYgLyogQVZDT0RFQ19EQ0FIVUZGX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGNhbWF0aC5oIGIvbGliYXZjb2RlYy9kY2FtYXRoLmgKaW5kZXggZTBkNmY0Zi4uMzhmYTlhNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kY2FtYXRoLmgKKysrIGIvbGliYXZjb2RlYy9kY2FtYXRoLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50MzJfdCBtdWwyMihpbnQzMl90IGEsIGludDMyX3QgYikgeyByZXR1cm4gbXVsX18oYSwgYiwgMjIpOyB9CiBzdGF0aWMgaW5saW5lIGludDMyX3QgbXVsMjMoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsgcmV0dXJuIG11bF9fKGEsIGIsIDIzKTsgfQogc3RhdGljIGlubGluZSBpbnQzMl90IG11bDMxKGludDMyX3QgYSwgaW50MzJfdCBiKSB7IHJldHVybiBtdWxfXyhhLCBiLCAzMSk7IH0KK3N0YXRpYyBpbmxpbmUgaW50MzJfdCBtdWwzMihpbnQzMl90IGEsIGludDMyX3QgYikgeyByZXR1cm4gbXVsX18oYSwgYiwgMzIpOyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50MzJfdCBjbGlwMjMoaW50MzJfdCBhKSB7IHJldHVybiBhdl9jbGlwX2ludHAyKGEsIDIzKTsgfQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RjdC10ZXN0LmMgYi9saWJhdmNvZGVjL2RjdC10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZWY4MzcuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9kY3QtdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIyICswLDAgQEAKLS8qCi0gKiAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKLSAqICAgICAyMDA3IE1hcmMgSG9mZm1hbiA8bWFyYy5ob2ZmbWFuQGFuYWxvZy5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLS8qKgotICogQGZpbGUKLSAqIERDVCB0ZXN0IChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAotICogU3RhcnRlZCBmcm9tIHNhbXBsZSBjb2RlIGJ5IEp1YW4gSi4gU2llcnJhbHRhIFAuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKLQotI2luY2x1ZGUgImRjdC5oIgotI2luY2x1ZGUgImlkY3Rkc3AuaCIKLSNpbmNsdWRlICJzaW1wbGVfaWRjdC5oIgotI2luY2x1ZGUgInh2aWRpZGN0LmgiCi0jaW5jbHVkZSAiYWFuZGN0dGFiLmgiCi0jaW5jbHVkZSAiZmFhbmRjdC5oIgotI2luY2x1ZGUgImZhYW5pZGN0LmgiCi0jaW5jbHVkZSAiZGN0cmVmLmgiCi0KLXN0cnVjdCBhbGdvIHsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotICAgIHZvaWQgKCpmdW5jKShpbnQxNl90ICpibG9jayk7Ci0gICAgZW51bSBpZGN0X3Blcm11dGF0aW9uX3R5cGUgcGVybV90eXBlOwotICAgIGludCBjcHVfZmxhZzsKLSAgICBpbnQgbm9uc3BlYzsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBmZGN0X3RhYltdID0gewotICAgIHsgIlJFRi1EQkwiLCAgICAgZmZfcmVmX2ZkY3QsICAgICAgICAgIEZGX0lEQ1RfUEVSTV9OT05FIH0sCi0gICAgeyAiSUpHLUFBTi1JTlQiLCBmZl9mZGN0X2lmYXN0LCAgICAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKLSAgICB7ICJJSkctTExNLUlOVCIsIGZmX2pwZWdfZmRjdF9pc2xvd184LCBGRl9JRENUX1BFUk1fTk9ORSB9LAotI2lmIENPTkZJR19GQUFORENUCi0gICAgeyAiRkFBTiIsICAgICAgICBmZl9mYWFuZGN0LCAgICAgICAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKLSNlbmRpZiAvKiBDT05GSUdfRkFBTkRDVCAqLwotfTsKLQotc3RhdGljIHZvaWQgZmZfcHJvcmVzX2lkY3Rfd3JhcChpbnQxNl90ICpkc3QpewotICAgIExPQ0FMX0FMSUdORUQoMTYsIGludDE2X3QsIHFtYXQsIFs2NF0pOwotICAgIGludCBpOwotCi0gICAgZm9yKGk9MDsgaTw2NDsgaSsrKXsKLSAgICAgICAgcW1hdFtpXT00OwotICAgIH0KLSAgICBmZl9wcm9yZXNfaWRjdChkc3QsIHFtYXQpOwotICAgIGZvcihpPTA7IGk8NjQ7IGkrKykgewotICAgICAgICAgZHN0W2ldIC09IDUxMjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBpZGN0X3RhYltdID0gewotICAgIHsgIlJFRi1EQkwiLCAgICAgZmZfcmVmX2lkY3QsICAgICAgICAgIEZGX0lEQ1RfUEVSTV9OT05FIH0sCi0gICAgeyAiSU5UIiwgICAgICAgICBmZl9qX3Jldl9kY3QsICAgICAgICAgRkZfSURDVF9QRVJNX0xJQk1QRUcyIH0sCi0gICAgeyAiU0lNUExFLUMiLCAgICBmZl9zaW1wbGVfaWRjdF84LCAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKLSAgICB7ICJTSU1QTEUtQzEwIiwgIGZmX3NpbXBsZV9pZGN0XzEwLCAgICBGRl9JRENUX1BFUk1fTk9ORSB9LAotICAgIHsgIlNJTVBMRS1DMTIiLCAgZmZfc2ltcGxlX2lkY3RfMTIsICAgIEZGX0lEQ1RfUEVSTV9OT05FLCAwLCAxIH0sCi0gICAgeyAiUFItQyIsICAgICAgICBmZl9wcm9yZXNfaWRjdF93cmFwLCAgRkZfSURDVF9QRVJNX05PTkUsIDAsIDEgfSwKLSNpZiBDT05GSUdfRkFBTklEQ1QKLSAgICB7ICJGQUFOSSIsICAgICAgIGZmX2ZhYW5pZGN0LCAgICAgICAgICBGRl9JRENUX1BFUk1fTk9ORSB9LAotI2VuZGlmIC8qIENPTkZJR19GQUFOSURDVCAqLwotI2lmIENPTkZJR19NUEVHNF9ERUNPREVSCi0gICAgeyAiWFZJRCIsICAgICAgICBmZl94dmlkX2lkY3QsICAgICAgICAgRkZfSURDVF9QRVJNX05PTkUsIDAsIDEgfSwKLSNlbmRpZiAvKiBDT05GSUdfTVBFRzRfREVDT0RFUiAqLwotfTsKLQotI2lmIEFSQ0hfQVJNCi0jaW5jbHVkZSAiYXJtL2RjdC10ZXN0LmMiCi0jZWxpZiBBUkNIX1BQQwotI2luY2x1ZGUgInBwYy9kY3QtdGVzdC5jIgotI2VsaWYgQVJDSF9YODYKLSNpbmNsdWRlICJ4ODYvZGN0LXRlc3QuYyIKLSNlbHNlCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gZmRjdF90YWJfYXJjaFtdID0geyB7IDAgfSB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGlkY3RfdGFiX2FyY2hbXSA9IHsgeyAwIH0gfTsKLSNlbmRpZgotCi0jZGVmaW5lIEFBTlNDQUxFX0JJVFMgMTIKLQotI2RlZmluZSBOQl9JVFMgMjAwMDAKLSNkZWZpbmUgTkJfSVRTX1NQRUVEIDUwMDAwCi0KLURFQ0xBUkVfQUxJR05FRCgxNiwgc3RhdGljIGludDE2X3QsIGJsb2NrKVs2NF07Ci1ERUNMQVJFX0FMSUdORUQoOCwgIHN0YXRpYyBpbnQxNl90LCBibG9jazEpWzY0XTsKLQotc3RhdGljIHZvaWQgaW5pdF9ibG9jayhpbnQxNl90IGJsb2NrWzY0XSwgaW50IHRlc3QsIGludCBpc19pZGN0LCBBVkxGRyAqcHJuZywgaW50IHZhbHMpCi17Ci0gICAgaW50IGksIGo7Ci0KLSAgICBtZW1zZXQoYmxvY2ssIDAsIDY0ICogc2l6ZW9mKCpibG9jaykpOwotCi0gICAgc3dpdGNoICh0ZXN0KSB7Ci0gICAgY2FzZSAwOgotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICAgICAgICAgIGJsb2NrW2ldID0gKGF2X2xmZ19nZXQocHJuZykgJSAoMip2YWxzKSkgLXZhbHM7Ci0gICAgICAgIGlmIChpc19pZGN0KSB7Ci0gICAgICAgICAgICBmZl9yZWZfZmRjdChibG9jayk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICAgICAgICAgICAgICBibG9ja1tpXSA+Pj0gMzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICAgIGogPSBhdl9sZmdfZ2V0KHBybmcpICUgMTAgKyAxOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgaWR4ID0gYXZfbGZnX2dldChwcm5nKSAlIDY0OwotICAgICAgICAgICAgYmxvY2tbaWR4XSA9IGF2X2xmZ19nZXQocHJuZykgJSAoMip2YWxzKSAtdmFsczsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICAgIGJsb2NrWyAwXSA9IGF2X2xmZ19nZXQocHJuZykgJSAoMTYqdmFscykgLSAoOCp2YWxzKTsKLSAgICAgICAgYmxvY2tbNjNdID0gKGJsb2NrWzBdICYgMSkgXiAxOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHBlcm11dGUoaW50MTZfdCBkc3RbNjRdLCBjb25zdCBpbnQxNl90IHNyY1s2NF0sCi0gICAgICAgICAgICAgICAgICAgIGVudW0gaWRjdF9wZXJtdXRhdGlvbl90eXBlIHBlcm1fdHlwZSkKLXsKLSAgICBpbnQgaTsKLQotI2lmIEFSQ0hfWDg2Ci0gICAgaWYgKHBlcm11dGVfeDg2KGRzdCwgc3JjLCBwZXJtX3R5cGUpKQotICAgICAgICByZXR1cm47Ci0jZW5kaWYKLQotICAgIHN3aXRjaCAocGVybV90eXBlKSB7Ci0gICAgY2FzZSBGRl9JRENUX1BFUk1fTElCTVBFRzI6Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQotICAgICAgICAgICAgZHN0WyhpICYgMHgzOCkgfCAoKGkgJiA2KSA+PiAxKSB8ICgoaSAmIDEpIDw8IDIpXSA9IHNyY1tpXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGRl9JRENUX1BFUk1fUEFSVFRSQU5TOgotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICAgICAgICAgIGRzdFsoaSAmIDB4MjQpIHwgKChpICYgMykgPDwgMykgfCAoKGkgPj4gMykgJiAzKV0gPSBzcmNbaV07Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRkZfSURDVF9QRVJNX1RSQU5TUE9TRToKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgICAgICAgICBkc3RbKGk+PjMpIHwgKChpPDwzKSYweDM4KV0gPSBzcmNbaV07Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQotICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgZGN0X2Vycm9yKGNvbnN0IHN0cnVjdCBhbGdvICpkY3QsIGludCB0ZXN0LCBpbnQgaXNfaWRjdCwgaW50IHNwZWVkLCBjb25zdCBpbnQgYml0cykKLXsKLSAgICB2b2lkICgqcmVmKShpbnQxNl90ICpibG9jaykgPSBpc19pZGN0ID8gZmZfcmVmX2lkY3QgOiBmZl9yZWZfZmRjdDsKLSAgICBpbnQgaXQsIGksIHNjYWxlOwotICAgIGludCBlcnJfaW5mLCB2OwotICAgIGludDY0X3QgZXJyMiwgdGksIHRpMSwgaXQxLCBlcnJfc3VtID0gMDsKLSAgICBpbnQ2NF90IHN5c0Vycls2NF0sIHN5c0Vyck1heCA9IDA7Ci0gICAgaW50IG1heG91dCA9IDA7Ci0gICAgaW50IGJsb2NrU3VtRXJyTWF4ID0gMCwgYmxvY2tTdW1FcnI7Ci0gICAgQVZMRkcgcHJuZzsKLSAgICBjb25zdCBpbnQgdmFscz0xPDxiaXRzOwotICAgIGRvdWJsZSBvbXNlLCBvbWU7Ci0gICAgaW50IHNwZWNfZXJyOwotCi0gICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOwotCi0gICAgZXJyX2luZiA9IDA7Ci0gICAgZXJyMiA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgICAgIHN5c0VycltpXSA9IDA7Ci0gICAgZm9yIChpdCA9IDA7IGl0IDwgTkJfSVRTOyBpdCsrKSB7Ci0gICAgICAgIGluaXRfYmxvY2soYmxvY2sxLCB0ZXN0LCBpc19pZGN0LCAmcHJuZywgdmFscyk7Ci0gICAgICAgIHBlcm11dGUoYmxvY2ssIGJsb2NrMSwgZGN0LT5wZXJtX3R5cGUpOwotCi0gICAgICAgIGRjdC0+ZnVuYyhibG9jayk7Ci0gICAgICAgIGVtbXNfYygpOwotCi0gICAgICAgIGlmICghc3RyY21wKGRjdC0+bmFtZSwgIklKRy1BQU4tSU5UIikpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2NhbGUgPSA4ICogKDEgPDwgKEFBTlNDQUxFX0JJVFMgKyAxMSkpIC8gZmZfYWFuc2NhbGVzW2ldOwotICAgICAgICAgICAgICAgIGJsb2NrW2ldID0gKGJsb2NrW2ldICogc2NhbGUpID4+IEFBTlNDQUxFX0JJVFM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZWYoYmxvY2sxKTsKLSAgICAgICAgaWYgKCFzdHJjbXAoZGN0LT5uYW1lLCAiUFItU1NFMiIpKQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgICAgICAgICAgICAgYmxvY2sxW2ldID0gYXZfY2xpcChibG9jazFbaV0sIDQtNTEyLCAxMDE5LTUxMik7Ci0KLSAgICAgICAgYmxvY2tTdW1FcnIgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotICAgICAgICAgICAgaW50IGVyciA9IGJsb2NrW2ldIC0gYmxvY2sxW2ldOwotICAgICAgICAgICAgZXJyX3N1bSArPSBlcnI7Ci0gICAgICAgICAgICB2ID0gYWJzKGVycik7Ci0gICAgICAgICAgICBpZiAodiA+IGVycl9pbmYpCi0gICAgICAgICAgICAgICAgZXJyX2luZiA9IHY7Ci0gICAgICAgICAgICBlcnIyICs9IHYgKiB2OwotICAgICAgICAgICAgc3lzRXJyW2ldICs9IGJsb2NrW2ldIC0gYmxvY2sxW2ldOwotICAgICAgICAgICAgYmxvY2tTdW1FcnIgKz0gdjsKLSAgICAgICAgICAgIGlmIChhYnMoYmxvY2tbaV0pID4gbWF4b3V0KQotICAgICAgICAgICAgICAgIG1heG91dCA9IGFicyhibG9ja1tpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJsb2NrU3VtRXJyTWF4IDwgYmxvY2tTdW1FcnIpCi0gICAgICAgICAgICBibG9ja1N1bUVyck1heCA9IGJsb2NrU3VtRXJyOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICAgICAgc3lzRXJyTWF4ID0gRkZNQVgoc3lzRXJyTWF4LCBGRkFCUyhzeXNFcnJbaV0pKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0gICAgICAgIGlmIChpICUgOCA9PSAwKQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICBwcmludGYoIiU3ZCAiLCAoaW50KSBzeXNFcnJbaV0pOwotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci0KLSAgICBvbXNlID0gKGRvdWJsZSkgZXJyMiAvIE5CX0lUUyAvIDY0OwotICAgIG9tZSAgPSAoZG91YmxlKSBlcnJfc3VtIC8gTkJfSVRTIC8gNjQ7Ci0KLSAgICBzcGVjX2VyciA9IGlzX2lkY3QgJiYgKGVycl9pbmYgPiAxIHx8IG9tc2UgPiAwLjAyIHx8IGZhYnMob21lKSA+IDAuMDAxNSk7Ci0KLSAgICBwcmludGYoIiVzICVzOiBtYXhfZXJyPSVkIG9tc2U9JTAuOGYgb21lPSUwLjhmIHN5c2Vycj0lMC44ZiBtYXhvdXQ9JWQgYmxvY2tTdW1FcnI9JWRcbiIsCi0gICAgICAgICAgIGlzX2lkY3QgPyAiSURDVCIgOiAiRENUIiwgZGN0LT5uYW1lLCBlcnJfaW5mLAotICAgICAgICAgICBvbXNlLCBvbWUsIChkb3VibGUpIHN5c0Vyck1heCAvIE5CX0lUUywKLSAgICAgICAgICAgbWF4b3V0LCBibG9ja1N1bUVyck1heCk7Ci0KLSAgICBpZiAoc3BlY19lcnIgJiYgIWRjdC0+bm9uc3BlYykgewotICAgICAgICBwcmludGYoIkZhaWxlZCFcbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZiAoIXNwZWVkKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIHNwZWVkIHRlc3QgKi8KLQotICAgIGluaXRfYmxvY2soYmxvY2ssIHRlc3QsIGlzX2lkY3QsICZwcm5nLCB2YWxzKTsKLSAgICBwZXJtdXRlKGJsb2NrMSwgYmxvY2ssIGRjdC0+cGVybV90eXBlKTsKLQotICAgIHRpID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOwotICAgIGl0MSA9IDA7Ci0gICAgZG8gewotICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBOQl9JVFNfU1BFRUQ7IGl0KyspIHsKLSAgICAgICAgICAgIG1lbWNweShibG9jaywgYmxvY2sxLCBzaXplb2YoYmxvY2spKTsKLSAgICAgICAgICAgIGRjdC0+ZnVuYyhibG9jayk7Ci0gICAgICAgIH0KLSAgICAgICAgZW1tc19jKCk7Ci0gICAgICAgIGl0MSArPSBOQl9JVFNfU1BFRUQ7Ci0gICAgICAgIHRpMSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHRpOwotICAgIH0gd2hpbGUgKHRpMSA8IDEwMDAwMDApOwotCi0gICAgcHJpbnRmKCIlcyAlczogJTAuMWYga2RjdC9zXG4iLCBpc19pZGN0ID8gIklEQ1QiIDogIkRDVCIsIGRjdC0+bmFtZSwKLSAgICAgICAgICAgKGRvdWJsZSkgaXQxICogMTAwMC4wIC8gKGRvdWJsZSkgdGkxKTsKLQotICAgIHJldHVybiAwOwotfQotCi1ERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIHVpbnQ4X3QsIGltZ19kZXN0KVs2NF07Ci1ERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIHVpbnQ4X3QsIGltZ19kZXN0MSlbNjRdOwotCi1zdGF0aWMgdm9pZCBpZGN0MjQ4X3JlZih1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQotewotICAgIHN0YXRpYyBpbnQgaW5pdDsKLSAgICBzdGF0aWMgZG91YmxlIGM4WzhdWzhdOwotICAgIHN0YXRpYyBkb3VibGUgYzRbNF1bNF07Ci0gICAgZG91YmxlIGJsb2NrMVs2NF0sIGJsb2NrMls2NF0sIGJsb2NrM1s2NF07Ci0gICAgZG91YmxlIHMsIHN1bSwgdjsKLSAgICBpbnQgaSwgaiwgazsKLQotICAgIGlmICghaW5pdCkgewotICAgICAgICBpbml0ID0gMTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgICAgICBzdW0gPSAwOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotICAgICAgICAgICAgICAgIHMgPSAoaSA9PSAwKSA/IHNxcnQoMS4wIC8gOC4wKSA6IHNxcnQoMS4wIC8gNC4wKTsKLSAgICAgICAgICAgICAgICBjOFtpXVtqXSA9IHMgKiBjb3MoTV9QSSAqIGkgKiAoaiArIDAuNSkgLyA4LjApOwotICAgICAgICAgICAgICAgIHN1bSArPSBjOFtpXVtqXSAqIGM4W2ldW2pdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKLSAgICAgICAgICAgICAgICBzID0gKGkgPT0gMCkgPyBzcXJ0KDEuMCAvIDQuMCkgOiBzcXJ0KDEuMCAvIDIuMCk7Ci0gICAgICAgICAgICAgICAgYzRbaV1bal0gPSBzICogY29zKE1fUEkgKiBpICogKGogKyAwLjUpIC8gNC4wKTsKLSAgICAgICAgICAgICAgICBzdW0gKz0gYzRbaV1bal0gKiBjNFtpXVtqXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGJ1dHRlcmZseSAqLwotICAgIHMgPSAwLjUgKiBzcXJ0KDIuMCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7Ci0gICAgICAgICAgICBibG9jazFbOCAqICgyICogaSkgKyBqXSA9Ci0gICAgICAgICAgICAgICAgKGJsb2NrWzggKiAoMiAqIGkpICsgal0gKyBibG9ja1s4ICogKDIgKiBpICsgMSkgKyBqXSkgKiBzOwotICAgICAgICAgICAgYmxvY2sxWzggKiAoMiAqIGkgKyAxKSArIGpdID0KLSAgICAgICAgICAgICAgICAoYmxvY2tbOCAqICgyICogaSkgKyBqXSAtIGJsb2NrWzggKiAoMiAqIGkgKyAxKSArIGpdKSAqIHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpZGN0OCBvbiBsaW5lcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgewotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCi0gICAgICAgICAgICAgICAgc3VtICs9IGM4W2tdW2pdICogYmxvY2sxWzggKiBpICsga107Ci0gICAgICAgICAgICBibG9jazJbOCAqIGkgKyBqXSA9IHN1bTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGlkY3Q0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0gICAgICAgICAgICAvKiB0b3AgKi8KLSAgICAgICAgICAgIHN1bSA9IDA7Ci0gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQotICAgICAgICAgICAgICAgIHN1bSArPSBjNFtrXVtqXSAqIGJsb2NrMls4ICogKDIgKiBrKSArIGldOwotICAgICAgICAgICAgYmxvY2szWzggKiAoMiAqIGopICsgaV0gPSBzdW07Ci0KLSAgICAgICAgICAgIC8qIGJvdHRvbSAqLwotICAgICAgICAgICAgc3VtID0gMDsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCi0gICAgICAgICAgICAgICAgc3VtICs9IGM0W2tdW2pdICogYmxvY2syWzggKiAoMiAqIGsgKyAxKSArIGldOwotICAgICAgICAgICAgYmxvY2szWzggKiAoMiAqIGogKyAxKSArIGldID0gc3VtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogY2xhbXAgYW5kIHN0b3JlIHRoZSByZXN1bHQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKLSAgICAgICAgICAgIHYgPSBibG9jazNbOCAqIGkgKyBqXTsKLSAgICAgICAgICAgIGlmICAgICAgKHYgPCAwKSAgIHYgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAodiA+IDI1NSkgdiA9IDI1NTsKLSAgICAgICAgICAgIGRlc3RbaSAqIGxpbmVzaXplICsgal0gPSAoaW50KSByaW50KHYpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBpZGN0MjQ4X2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCppZGN0MjQ4X3B1dCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGVlZCkKLXsKLSAgICBpbnQgaXQsIGksIGl0MSwgdGksIHRpMSwgZXJyX21heCwgdjsKLSAgICBBVkxGRyBwcm5nOwotCi0gICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOwotCi0gICAgLyoganVzdCBvbmUgdGVzdCB0byBzZWUgaWYgY29kZSBpcyBjb3JyZWN0IChwcmVjaXNpb24gaXMgbGVzcwotICAgICAgIGltcG9ydGFudCBoZXJlKSAqLwotICAgIGVycl9tYXggPSAwOwotICAgIGZvciAoaXQgPSAwOyBpdCA8IE5CX0lUUzsgaXQrKykgewotICAgICAgICAvKiBYWFg6IHVzZSBmb3J3YXJkIHRyYW5zZm9ybSB0byBnZW5lcmF0ZSB2YWx1ZXMgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgICAgICAgICBibG9jazFbaV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDI1NiAtIDEyODsKLSAgICAgICAgYmxvY2sxWzBdICs9IDEwMjQ7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgICAgICAgICBibG9ja1tpXSA9IGJsb2NrMVtpXTsKLSAgICAgICAgaWRjdDI0OF9yZWYoaW1nX2Rlc3QxLCA4LCBibG9jayk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgICAgICAgICBibG9ja1tpXSA9IGJsb2NrMVtpXTsKLSAgICAgICAgaWRjdDI0OF9wdXQoaW1nX2Rlc3QsIDgsIGJsb2NrKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotICAgICAgICAgICAgdiA9IGFicygoaW50KSBpbWdfZGVzdFtpXSAtIChpbnQpIGltZ19kZXN0MVtpXSk7Ci0gICAgICAgICAgICBpZiAodiA9PSAyNTUpCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlZCAlZFxuIiwgaW1nX2Rlc3RbaV0sIGltZ19kZXN0MVtpXSk7Ci0gICAgICAgICAgICBpZiAodiA+IGVycl9tYXgpCi0gICAgICAgICAgICAgICAgZXJyX21heCA9IHY7Ci0gICAgICAgIH0KLSNpZiAwCi0gICAgICAgIHByaW50ZigicmVmPVxuIik7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykgewotICAgICAgICAgICAgaW50IGo7Ci0gICAgICAgICAgICBmb3Ioaj0wO2o8ODtqKyspIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAlM2QiLCBpbWdfZGVzdDFbaSo4K2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaW50Zigib3V0PVxuIik7Ci0gICAgICAgIGZvcihpPTA7aTw4O2krKykgewotICAgICAgICAgICAgaW50IGo7Ci0gICAgICAgICAgICBmb3Ioaj0wO2o8ODtqKyspIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAlM2QiLCBpbWdfZGVzdFtpKjgral0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICB9Ci0gICAgcHJpbnRmKCIlcyAlczogZXJyX2luZj0lZFxuIiwgMSA/ICJJRENUMjQ4IiA6ICJEQ1QyNDgiLCBuYW1lLCBlcnJfbWF4KTsKLQotICAgIGlmICghc3BlZWQpCi0gICAgICAgIHJldHVybjsKLQotICAgIHRpID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOwotICAgIGl0MSA9IDA7Ci0gICAgZG8gewotICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBOQl9JVFNfU1BFRUQ7IGl0KyspIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQotICAgICAgICAgICAgICAgIGJsb2NrW2ldID0gYmxvY2sxW2ldOwotICAgICAgICAgICAgaWRjdDI0OF9wdXQoaW1nX2Rlc3QsIDgsIGJsb2NrKTsKLSAgICAgICAgfQotICAgICAgICBlbW1zX2MoKTsKLSAgICAgICAgaXQxICs9IE5CX0lUU19TUEVFRDsKLSAgICAgICAgdGkxID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gdGk7Ci0gICAgfSB3aGlsZSAodGkxIDwgMTAwMDAwMCk7Ci0KLSAgICBwcmludGYoIiVzICVzOiAlMC4xZiBrZGN0L3NcbiIsIDEgPyAiSURDVDI0OCIgOiAiRENUMjQ4IiwgbmFtZSwKLSAgICAgICAgICAgKGRvdWJsZSkgaXQxICogMTAwMC4wIC8gKGRvdWJsZSkgdGkxKTsKLX0KLQotc3RhdGljIHZvaWQgaGVscCh2b2lkKQotewotICAgIHByaW50ZigiZGN0LXRlc3QgWy1pXSBbPHRlc3QtbnVtYmVyPl0gWzxiaXRzPl1cbiIKLSAgICAgICAgICAgInRlc3QtbnVtYmVyIDAgLT4gdGVzdCB3aXRoIHJhbmRvbSBtYXRyaXhlc1xuIgotICAgICAgICAgICAiICAgICAgICAgICAgMSAtPiB0ZXN0IHdpdGggcmFuZG9tIHNwYXJzZSBtYXRyaXhlc1xuIgotICAgICAgICAgICAiICAgICAgICAgICAgMiAtPiBkbyAzLiB0ZXN0IGZyb20gbXBlZzQgc3RkXG4iCi0gICAgICAgICAgICJiaXRzICAgICAgICBOdW1iZXIgb2YgdGltZSBkb21haW4gYml0cyB0byB1c2UsIDggaXMgZGVmYXVsdFxuIgotICAgICAgICAgICAiLWkgICAgICAgICAgdGVzdCBJRENUIGltcGxlbWVudGF0aW9uc1xuIgotICAgICAgICAgICAiLTQgICAgICAgICAgdGVzdCBJRENUMjQ4IGltcGxlbWVudGF0aW9uc1xuIgotICAgICAgICAgICAiLXQgICAgICAgICAgc3BlZWQgdGVzdFxuIik7Ci19Ci0KLSNpZiAhSEFWRV9HRVRPUFQKLSNpbmNsdWRlICJjb21wYXQvZ2V0b3B0LmMiCi0jZW5kaWYKLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCB0ZXN0X2lkY3QgPSAwLCB0ZXN0XzI0OF9kY3QgPSAwOwotICAgIGludCBjLCBpOwotICAgIGludCB0ZXN0ID0gMTsKLSAgICBpbnQgc3BlZWQgPSAwOwotICAgIGludCBlcnIgPSAwOwotICAgIGludCBiaXRzPTg7Ci0KLSAgICBmZl9yZWZfZGN0X2luaXQoKTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaWg0dCIpOwotICAgICAgICBpZiAoYyA9PSAtMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgICAgICB0ZXN0X2lkY3QgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgdGVzdF8yNDhfZGN0ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgIHNwZWVkID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICBjYXNlICdoJzoKLSAgICAgICAgICAgIGhlbHAoKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG9wdGluZCA8IGFyZ2MpCi0gICAgICAgIHRlc3QgPSBhdG9pKGFyZ3Zbb3B0aW5kXSk7Ci0gICAgaWYob3B0aW5kKzEgPCBhcmdjKSBiaXRzPSBhdG9pKGFyZ3Zbb3B0aW5kKzFdKTsKLQotICAgIHByaW50ZigiZmZtcGVnIERDVC9JRENUIHRlc3RcbiIpOwotCi0gICAgaWYgKHRlc3RfMjQ4X2RjdCkgewotICAgICAgICBpZGN0MjQ4X2Vycm9yKCJTSU1QTEUtQyIsIGZmX3NpbXBsZV9pZGN0MjQ4X3B1dCwgc3BlZWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7Ci0gICAgICAgIGlmICh0ZXN0X2lkY3QpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhpZGN0X3RhYik7IGkrKykKLSAgICAgICAgICAgICAgICBlcnIgfD0gZGN0X2Vycm9yKCZpZGN0X3RhYltpXSwgdGVzdCwgdGVzdF9pZGN0LCBzcGVlZCwgYml0cyk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGlkY3RfdGFiX2FyY2hbaV0ubmFtZTsgaSsrKQotICAgICAgICAgICAgICAgIGlmICghKH5jcHVfZmxhZ3MgJiBpZGN0X3RhYl9hcmNoW2ldLmNwdV9mbGFnKSkKLSAgICAgICAgICAgICAgICAgICAgZXJyIHw9IGRjdF9lcnJvcigmaWRjdF90YWJfYXJjaFtpXSwgdGVzdCwgdGVzdF9pZGN0LCBzcGVlZCwgYml0cyk7Ci0gICAgICAgIH0KLSNpZiBDT05GSUdfRkRDVERTUAotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhmZGN0X3RhYik7IGkrKykKLSAgICAgICAgICAgICAgICBlcnIgfD0gZGN0X2Vycm9yKCZmZGN0X3RhYltpXSwgdGVzdCwgdGVzdF9pZGN0LCBzcGVlZCwgYml0cyk7Ci0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGZkY3RfdGFiX2FyY2hbaV0ubmFtZTsgaSsrKQotICAgICAgICAgICAgICAgIGlmICghKH5jcHVfZmxhZ3MgJiBmZGN0X3RhYl9hcmNoW2ldLmNwdV9mbGFnKSkKLSAgICAgICAgICAgICAgICAgICAgZXJyIHw9IGRjdF9lcnJvcigmZmRjdF90YWJfYXJjaFtpXSwgdGVzdCwgdGVzdF9pZGN0LCBzcGVlZCwgYml0cyk7Ci0gICAgICAgIH0KLSNlbmRpZiAvKiBDT05GSUdfRkRDVERTUCAqLwotICAgIH0KLQotICAgIGlmIChlcnIpCi0gICAgICAgIHByaW50ZigiRXJyb3I6ICVkLlxuIiwgZXJyKTsKLQotICAgIHJldHVybiAhIWVycjsKLX0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGN0LmggYi9saWJhdmNvZGVjL2RjdC5oCmluZGV4IDA1Mjk3YmEuLjBhMDNlMjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGN0LmgKKysrIGIvbGliYXZjb2RlYy9kY3QuaApAQCAtMjQsNiArMjQsNyBAQAogI2lmICFkZWZpbmVkKEFWQ09ERUNfRENUX0gpICYmICghZGVmaW5lZChGRlRfRkxPQVQpIHx8IEZGVF9GTE9BVCkKICNkZWZpbmUgQVZDT0RFQ19EQ1RfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJyZGZ0LmgiCkBAIC02Miw3ICs2Myw3IEBACiB2b2lkIGZmX2pfcmV2X2RjdDQoaW50MTZfdCAqZGF0YSk7CiB2b2lkIGZmX2pfcmV2X2RjdDIoaW50MTZfdCAqZGF0YSk7CiB2b2lkIGZmX2pfcmV2X2RjdDEoaW50MTZfdCAqZGF0YSk7Ci12b2lkIGZmX2pyZWZfaWRjdF9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl9qcmVmX2lkY3RfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfanJlZl9pZGN0X3B1dCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX2pyZWZfaWRjdF9hZGQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwogCiAjZW5kaWYgLyogQVZDT0RFQ19EQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kY3QzMl90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9kY3QzMl90ZW1wbGF0ZS5jCmluZGV4IGM3MDM5NmUuLjUxY2ViYzAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGN0MzJfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2RjdDMyX3RlbXBsYXRlLmMKQEAgLTIxLDE3ICsyMSwyOCBAQAogCiAjaW5jbHVkZSAiZGN0MzIuaCIKICNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKKyNpZmRlZiBDSEVDS0VECisjZGVmaW5lIFNVSU5UICAgaW50CisjZGVmaW5lIFNVSU5UMzIgaW50MzJfdAorI2Vsc2UKKyNkZWZpbmUgU1VJTlQgICB1bnNpZ25lZAorI2RlZmluZSBTVUlOVDMyIHVpbnQzMl90CisjZW5kaWYKIAogI2lmIERDVDMyX0ZMT0FUCiAjICAgZGVmaW5lIGRjdDMyIGZmX2RjdDMyX2Zsb2F0CiAjICAgZGVmaW5lIEZJWEhSKHgpICAgICAgICgoZmxvYXQpKHgpKQogIyAgIGRlZmluZSBNVUxIMyh4LCB5LCBzKSAoKHMpKih5KSooeCkpCiAjICAgZGVmaW5lIElOVEZMT0FUIGZsb2F0CisjICAgZGVmaW5lIFNVSU5URkxPQVQgZmxvYXQKICNlbHNlCiAjICAgZGVmaW5lIGRjdDMyIGZmX2RjdDMyX2ZpeGVkCiAjICAgZGVmaW5lIEZJWEhSKGEpICAgICAgICgoaW50KSgoYSkgKiAoMUxMPDwzMikgKyAwLjUpKQogIyAgIGRlZmluZSBNVUxIMyh4LCB5LCBzKSBNVUxIKChzKSooeCksIHkpCiAjICAgZGVmaW5lIElOVEZMT0FUIGludAorIyAgIGRlZmluZSBTVUlOVEZMT0FUIFNVSU5UCiAjZW5kaWYKIAogCkBAIC0xMTIsMTEgKzEyMywxMiBAQAogI2RlZmluZSBBREQoYSwgYikgdmFsIyNhICs9IHZhbCMjYgogCiAvKiBEQ1QzMiB3aXRob3V0IDEvc3FydCgyKSBjb2VmIHplcm8gc2NhbGluZy4gKi8KLXZvaWQgZGN0MzIoSU5URkxPQVQgKm91dCwgY29uc3QgSU5URkxPQVQgKnRhYikKK3ZvaWQgZGN0MzIoSU5URkxPQVQgKm91dCwgY29uc3QgSU5URkxPQVQgKnRhYl9hcmcpCiB7Ci0gICAgSU5URkxPQVQgdG1wMCwgdG1wMTsKKyAgICBjb25zdCBTVUlOVEZMT0FUICp0YWIgPSB0YWJfYXJnOworICAgIFNVSU5URkxPQVQgdG1wMCwgdG1wMTsKIAotICAgIElOVEZMT0FUIHZhbDAgLCB2YWwxICwgdmFsMiAsIHZhbDMgLCB2YWw0ICwgdmFsNSAsIHZhbDYgLCB2YWw3ICwKKyAgICBTVUlOVEZMT0FUIHZhbDAgLCB2YWwxICwgdmFsMiAsIHZhbDMgLCB2YWw0ICwgdmFsNSAsIHZhbDYgLCB2YWw3ICwKICAgICAgICAgICAgICB2YWw4ICwgdmFsOSAsIHZhbDEwLCB2YWwxMSwgdmFsMTIsIHZhbDEzLCB2YWwxNCwgdmFsMTUsCiAgICAgICAgICAgICAgdmFsMTYsIHZhbDE3LCB2YWwxOCwgdmFsMTksIHZhbDIwLCB2YWwyMSwgdmFsMjIsIHZhbDIzLAogICAgICAgICAgICAgIHZhbDI0LCB2YWwyNSwgdmFsMjYsIHZhbDI3LCB2YWwyOCwgdmFsMjksIHZhbDMwLCB2YWwzMTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGRzLmMgYi9saWJhdmNvZGVjL2Rkcy5jCmluZGV4IDk1NzdiNjcuLmYwMjZmOWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGRzLmMKKysrIGIvbGliYXZjb2RlYy9kZHMuYwpAQCAtMzksNyArMzksNyBAQAogCiAjZGVmaW5lIEREUEZfRk9VUkNDICAgICgxIDw8ICAyKQogI2RlZmluZSBERFBGX1BBTEVUVEUgICAoMSA8PCAgNSkKLSNkZWZpbmUgRERQRl9OT1JNQUxNQVAgKDEgPDwgMzEpCisjZGVmaW5lIEREUEZfTk9STUFMTUFQICgxVSA8PCAzMSkKIAogZW51bSBERFNQb3N0UHJvYyB7CiAgICAgRERTX05PTkUgPSAwLApAQCAtMTAyLDYgKzEwMiw3IEBACiAKICAgICBpbnQgY29tcHJlc3NlZDsKICAgICBpbnQgcGFsZXR0ZWQ7CisgICAgaW50IGJwcDsKICAgICBlbnVtIEREU1Bvc3RQcm9jIHBvc3Rwcm9jOwogCiAgICAgY29uc3QgdWludDhfdCAqdGV4X2RhdGE7IC8vIENvbXByZXNzZWQgdGV4dHVyZQpAQCAtMTE2LDcgKzExNyw2IEBACiB7CiAgICAgRERTQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBHZXRCeXRlQ29udGV4dCAqZ2JjID0gJmN0eC0+Z2JjOwotICAgIGNoYXIgYnVmWzMyXTsKICAgICB1aW50MzJfdCBmbGFncywgZm91cmNjLCBnaW1wX3RhZzsKICAgICBlbnVtIEREU0RYR0lGb3JtYXQgZHhnaTsKICAgICBpbnQgc2l6ZSwgYnBwLCByLCBnLCBiLCBhOwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgICAgIGN0eC0+cGFsZXR0ZWQgPSAwOwogICAgIH0KIAotICAgIGJwcCA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiYyk7IC8vIHJnYmJpdGNvdW50CisgICAgYnBwID0gY3R4LT5icHAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYmMpOyAvLyByZ2JiaXRjb3VudAogICAgIHIgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiYyk7IC8vIHJiaXRtYXNrCiAgICAgZyAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2JjKTsgLy8gZ2JpdG1hc2sKICAgICBiICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYmMpOyAvLyBiYml0bWFzawpAQCAtMTYwLDEzICsxNjAsMTAgQEAKICAgICBieXRlc3RyZWFtMl9za2lwKGdiYywgNCk7IC8vIGNhcHM0CiAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYmMsIDQpOyAvLyByZXNlcnZlZDIKIAotICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvdXJjYyk7CiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgImZvdXJjYyAlcyBicHAgJWQgIgotICAgICAgICAgICAiciAweCV4IGcgMHgleCBiIDB4JXggYSAweCV4XG4iLCBidWYsIGJwcCwgciwgZywgYiwgYSk7Ci0gICAgaWYgKGdpbXBfdGFnKSB7Ci0gICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGdpbXBfdGFnKTsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgImFuZCBHSU1QLUREUyB0YWcgJXNcbiIsIGJ1Zik7Ci0gICAgfQorICAgICAgICAgICAiciAweCV4IGcgMHgleCBiIDB4JXggYSAweCV4XG4iLCBhdl9mb3VyY2Myc3RyKGZvdXJjYyksIGJwcCwgciwgZywgYiwgYSk7CisgICAgaWYgKGdpbXBfdGFnKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiYW5kIEdJTVAtRERTIHRhZyAlc1xuIiwgYXZfZm91cmNjMnN0cihnaW1wX3RhZykpOwogCiAgICAgaWYgKGN0eC0+Y29tcHJlc3NlZCkKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQkE7CkBAIC0yNDIsNiArMjM5LDEwIEBACiAgICAgICAgICAgICBjdHgtPnBhbGV0dGVkICAgPSAxOwogICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgID0gQVZfUElYX0ZNVF9QQUw4OwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ0cnLCAnMScsICcgJywgJyAnKToKKyAgICAgICAgICAgIGN0eC0+Y29tcHJlc3NlZCA9IDA7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCAgPSBBVl9QSVhfRk1UX01PTk9CTEFDSzsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1LVEFHKCdEJywgJ1gnLCAnMScsICcwJyk6CiAgICAgICAgICAgICAvKiBEaXJlY3RYIDEwIGV4dHJhIGhlYWRlciAqLwogICAgICAgICAgICAgZHhnaSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiYyk7CkBAIC0zMzksNyArMzQwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCAlcyBmb3VyY2MuXG4iLCBidWYpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCAlcyBmb3VyY2MuXG4iLCBhdl9mb3VyY2Myc3RyKGZvdXJjYykpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGN0eC0+cGFsZXR0ZWQpIHsKQEAgLTM1MCwxNCArMzUxLDI3IEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CisgICAgICAgIC8qICA0IGJwcCAqLworICAgICAgICBpZiAoYnBwID09IDQgJiYgciA9PSAwICYmIGcgPT0gMCAmJiBiID09IDAgJiYgYSA9PSAwKQorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CiAgICAgICAgIC8qICA4IGJwcCAqLwotICAgICAgICBpZiAoYnBwID09IDggJiYgciA9PSAweGZmICYmIGcgPT0gMCAmJiBiID09IDAgJiYgYSA9PSAwKQorICAgICAgICBlbHNlIGlmIChicHAgPT0gOCAmJiByID09IDB4ZmYgJiYgZyA9PSAwICYmIGIgPT0gMCAmJiBhID09IDApCisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgICAgIGVsc2UgaWYgKGJwcCA9PSA4ICYmIHIgPT0gMCAmJiBnID09IDAgJiYgYiA9PSAwICYmIGEgPT0gMHhmZikKICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKICAgICAgICAgLyogMTYgYnBwICovCiAgICAgICAgIGVsc2UgaWYgKGJwcCA9PSAxNiAmJiByID09IDB4ZmYgJiYgZyA9PSAwICYmIGIgPT0gMCAmJiBhID09IDB4ZmYwMCkKICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZQTg7CisgICAgICAgIGVsc2UgaWYgKGJwcCA9PSAxNiAmJiByID09IDB4ZmYwMCAmJiBnID09IDAgJiYgYiA9PSAwICYmIGEgPT0gMHhmZikgeworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lBODsKKyAgICAgICAgICAgIGN0eC0+cG9zdHByb2MgPSBERFNfU1dBUF9BTFBIQTsKKyAgICAgICAgfQogICAgICAgICBlbHNlIGlmIChicHAgPT0gMTYgJiYgciA9PSAweGZmZmYgJiYgZyA9PSAwICYmIGIgPT0gMCAmJiBhID09IDApCiAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTE2TEU7CisgICAgICAgIGVsc2UgaWYgKGJwcCA9PSAxNiAmJiByID09IDB4N2MwMCAmJiBnID09IDB4M2UwICYmIGIgPT0gMHgxZiAmJiBhID09IDApCisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1TEU7CisgICAgICAgIGVsc2UgaWYgKGJwcCA9PSAxNiAmJiByID09IDB4N2MwMCAmJiBnID09IDB4M2UwICYmIGIgPT0gMHgxZiAmJiBhID09IDB4ODAwMCkKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTVMRTsgLy8gYWxwaGEgaWdub3JlZAogICAgICAgICBlbHNlIGlmIChicHAgPT0gMTYgJiYgciA9PSAweGY4MDAgJiYgZyA9PSAweDdlMCAmJiBiID09IDB4MWYgJiYgYSA9PSAwKQogICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU2NUxFOwogICAgICAgICAvKiAyNCBicHAgKi8KQEAgLTM4Nyw4ICs0MDEsNiBAQAogICAgICAgICBjdHgtPnBvc3Rwcm9jID0gRERTX05PUk1BTF9NQVA7CiAgICAgZWxzZSBpZiAoeWNvY2dfY2xhc3NpYyAmJiAhY3R4LT5jb21wcmVzc2VkKQogICAgICAgICBjdHgtPnBvc3Rwcm9jID0gRERTX1JBV19ZQ09DRzsKLSAgICBlbHNlIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lBOCkKLSAgICAgICAgY3R4LT5wb3N0cHJvYyA9IEREU19TV0FQX0FMUEhBOwogCiAgICAgLyogQVRJL05WaWRpYSB2YXJpYW50cyBzb21ldGltZXMgYWRkIHN3aXp6bGluZyBpbiBicHAuICovCiAgICAgc3dpdGNoIChicHApIHsKQEAgLTY2NCw2ICs2NzYsMzYgQEAKICAgICAgICAgLyogVXNlIHRoZSBkZWNvbXByZXNzIGZ1bmN0aW9uIG9uIHRoZSB0ZXh0dXJlLCBvbmUgYmxvY2sgcGVyIHRocmVhZC4gKi8KICAgICAgICAgY3R4LT50ZXhfZGF0YSA9IGdiYy0+YnVmZmVyOwogICAgICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIGRlY29tcHJlc3NfdGV4dHVyZV90aHJlYWQsIGZyYW1lLCBOVUxMLCBjdHgtPnNsaWNlX2NvdW50KTsKKyAgICB9IGVsc2UgaWYgKCFjdHgtPnBhbGV0dGVkICYmIGN0eC0+YnBwID09IDQgJiYgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGZyYW1lLT5kYXRhWzBdOworICAgICAgICBpbnQgeCwgeSwgaTsKKworICAgICAgICAvKiBVc2UgdGhlIGZpcnN0IDY0IGJ5dGVzIGFzIHBhbGV0dGUsIHRoZW4gY29weSB0aGUgcmVzdC4gKi8KKyAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcihnYmMsIGZyYW1lLT5kYXRhWzFdLCAxNiAqIDQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgQVZfV04zMihmcmFtZS0+ZGF0YVsxXSArIGkqNCwKKyAgICAgICAgICAgICAgICAgICAgKGZyYW1lLT5kYXRhWzFdWzIraSo0XTw8MCkrCisgICAgICAgICAgICAgICAgICAgIChmcmFtZS0+ZGF0YVsxXVsxK2kqNF08PDgpKworICAgICAgICAgICAgICAgICAgICAoZnJhbWUtPmRhdGFbMV1bMCtpKjRdPDwxNikrCisgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpZnJhbWUtPmRhdGFbMV1bMytpKjRdPDwyNCkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworCisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYmMpIDwgZnJhbWUtPmhlaWdodCAqIGZyYW1lLT53aWR0aCAvIDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQnVmZmVyIGlzIHRvbyBzbWFsbCAoJWQgPCAlZCkuXG4iLAorICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiYyksIGZyYW1lLT5oZWlnaHQgKiBmcmFtZS0+d2lkdGggLyAyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGZyYW1lLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGZyYW1lLT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCB2YWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYmMpOworICAgICAgICAgICAgICAgIGRzdFt4ICAgIF0gPSB2YWwgJiAweEY7CisgICAgICAgICAgICAgICAgZHN0W3ggKyAxXSA9IHZhbCA+PiA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBsaW5lc2l6ZSA9IGF2X2ltYWdlX2dldF9saW5lc2l6ZShhdmN0eC0+cGl4X2ZtdCwgZnJhbWUtPndpZHRoLCAwKTsKIApAQCAtNjc2LDcgKzcxOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWUtPmRhdGFbMV1bMitpKjRdPDwwKSsKICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZS0+ZGF0YVsxXVsxK2kqNF08PDgpKwogICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lLT5kYXRhWzFdWzAraSo0XTw8MTYpKwotICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lLT5kYXRhWzFdWzMraSo0XTw8MjQpCisgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKWZyYW1lLT5kYXRhWzFdWzMraSo0XTw8MjQpCiAgICAgICAgICAgICAgICAgKTsKIAogICAgICAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOwpAQCAtNjk0LDExICs3MzYsNyBAQAogICAgIH0KIAogICAgIC8qIFJ1biBhbnkgcG9zdCBwcm9jZXNzaW5nIGhlcmUgaWYgbmVlZGVkLiAqLwotICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUkEgfHwKLSAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0JBIHx8Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMCB8fAotICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjAgfHwKLSAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZQTgpCisgICAgaWYgKGN0eC0+cG9zdHByb2MgIT0gRERTX05PTkUpCiAgICAgICAgIHJ1bl9wb3N0cHJvYyhhdmN0eCwgZnJhbWUpOwogCiAgICAgLyogRnJhbWUgaXMgcmVhZHkgdG8gYmUgb3V0cHV0LiAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kZWNvZGUuYyBiL2xpYmF2Y29kZWMvZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxYThmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZGVjb2RlLmMKQEAgLTAsMCArMSwxOTgxIEBACisvKgorICogZ2VuZXJpYyBkZWNvZGluZy1yZWxhdGVkIGNvZGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBDT05GSUdfSUNPTlYKKyMgaW5jbHVkZSA8aWNvbnYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludG1hdGguaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZGVjb2RlLmgiCisjaW5jbHVkZSAiaHdhY2NlbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisKK3N0YXRpYyBpbnQgYXBwbHlfcGFyYW1fY2hhbmdlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGludCBzaXplID0gMCwgcmV0OworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB2YWw7CisKKyAgICBkYXRhID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBUkFNX0NIQU5HRSwgJnNpemUpOworICAgIGlmICghZGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9QQVJBTV9DSEFOR0UpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhpcyBkZWNvZGVyIGRvZXMgbm90IHN1cHBvcnQgcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICJjaGFuZ2VzLCBidXQgUEFSQU1fQ0hBTkdFIHNpZGUgZGF0YSB3YXMgc2VudCB0byBpdC5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDI7CisgICAgfQorCisgICAgaWYgKHNpemUgPCA0KQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmbGFncyA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmRhdGEpOworICAgIHNpemUgLT0gNDsKKworICAgIGlmIChmbGFncyAmIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfQ0hBTk5FTF9DT1VOVCkgeworICAgICAgICBpZiAoc2l6ZSA8IDQpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHZhbCA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmRhdGEpOworICAgICAgICBpZiAodmFsIDw9IDAgfHwgdmFsID4gSU5UX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNoYW5uZWwgY291bnQiKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGZhaWwyOworICAgICAgICB9CisgICAgICAgIGF2Y3R4LT5jaGFubmVscyA9IHZhbDsKKyAgICAgICAgc2l6ZSAtPSA0OworICAgIH0KKyAgICBpZiAoZmxhZ3MgJiBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0NIQU5ORUxfTEFZT1VUKSB7CisgICAgICAgIGlmIChzaXplIDwgOCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gYnl0ZXN0cmVhbV9nZXRfbGU2NCgmZGF0YSk7CisgICAgICAgIHNpemUgLT0gODsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9TQU1QTEVfUkFURSkgeworICAgICAgICBpZiAoc2l6ZSA8IDQpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHZhbCA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmRhdGEpOworICAgICAgICBpZiAodmFsIDw9IDAgfHwgdmFsID4gSU5UX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsMjsKKyAgICAgICAgfQorICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSB2YWw7CisgICAgICAgIHNpemUgLT0gNDsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9ESU1FTlNJT05TKSB7CisgICAgICAgIGlmIChzaXplIDwgOCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYXZjdHgtPndpZHRoICA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmRhdGEpOworICAgICAgICBhdmN0eC0+aGVpZ2h0ID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmZGF0YSk7CisgICAgICAgIHNpemUgLT0gODsKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsMjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQQVJBTV9DSEFOR0Ugc2lkZSBkYXRhIHRvbyBzbWFsbC5cbiIpOworICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CitmYWlsMjoKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFwcGx5aW5nIHBhcmFtZXRlciBjaGFuZ2VzLlxuIik7CisgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dHJhY3RfcGFja2V0X3Byb3BzKEFWQ29kZWNJbnRlcm5hbCAqYXZjaSwgY29uc3QgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGF2X3BhY2tldF91bnJlZihhdmNpLT5sYXN0X3BrdF9wcm9wcyk7CisgICAgaWYgKHBrdCkgeworICAgICAgICByZXQgPSBhdl9wYWNrZXRfY29weV9wcm9wcyhhdmNpLT5sYXN0X3BrdF9wcm9wcywgcGt0KTsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICBhdmNpLT5sYXN0X3BrdF9wcm9wcy0+c2l6ZSA9IHBrdC0+c2l6ZTsgLy8gSEFDSzogTmVlZGVkIGZvciBmZl9kZWNvZGVfZnJhbWVfcHJvcHMoKS4KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1bnJlZmNvdW50X2ZyYW1lKEFWQ29kZWNJbnRlcm5hbCAqYXZjaSwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHJldDsKKworICAgIC8qIG1vdmUgdGhlIG9yaWdpbmFsIGZyYW1lIHRvIG91ciBiYWNrdXAgKi8KKyAgICBhdl9mcmFtZV91bnJlZihhdmNpLT50b19mcmVlKTsKKyAgICBhdl9mcmFtZV9tb3ZlX3JlZihhdmNpLT50b19mcmVlLCBmcmFtZSk7CisKKyAgICAvKiBub3cgY29weSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgQVZCdWZmZXJSZWZzIGJhY2sKKyAgICAgKiBub3RlIHRoYXQgd2UgbWFrZSBhIENPUFkgb2YgdGhlIHNpZGUgZGF0YSwgc28gY2FsbGluZyBhdl9mcmFtZV9mcmVlKCkgb24KKyAgICAgKiB0aGUgY2FsbGVyJ3MgZnJhbWUgd2lsbCB3b3JrIHByb3Blcmx5ICovCisgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhmcmFtZSwgYXZjaS0+dG9fZnJlZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBtZW1jcHkoZnJhbWUtPmRhdGEsICAgICBhdmNpLT50b19mcmVlLT5kYXRhLCAgICAgc2l6ZW9mKGZyYW1lLT5kYXRhKSk7CisgICAgbWVtY3B5KGZyYW1lLT5saW5lc2l6ZSwgYXZjaS0+dG9fZnJlZS0+bGluZXNpemUsIHNpemVvZihmcmFtZS0+bGluZXNpemUpKTsKKyAgICBpZiAoYXZjaS0+dG9fZnJlZS0+ZXh0ZW5kZWRfZGF0YSAhPSBhdmNpLT50b19mcmVlLT5kYXRhKSB7CisgICAgICAgIGludCBwbGFuZXMgPSBhdmNpLT50b19mcmVlLT5jaGFubmVsczsKKyAgICAgICAgaW50IHNpemUgICA9IHBsYW5lcyAqIHNpemVvZigqZnJhbWUtPmV4dGVuZGVkX2RhdGEpOworCisgICAgICAgIGlmICghc2l6ZSkgeworICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBhdl9tYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2RhdGEpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGZyYW1lLT5leHRlbmRlZF9kYXRhLCBhdmNpLT50b19mcmVlLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgc2l6ZSk7CisgICAgfSBlbHNlCisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhID0gZnJhbWUtPmRhdGE7CisKKyAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgPSBhdmNpLT50b19mcmVlLT5mb3JtYXQ7CisgICAgZnJhbWUtPndpZHRoICAgICAgICAgID0gYXZjaS0+dG9fZnJlZS0+d2lkdGg7CisgICAgZnJhbWUtPmhlaWdodCAgICAgICAgID0gYXZjaS0+dG9fZnJlZS0+aGVpZ2h0OworICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCA9IGF2Y2ktPnRvX2ZyZWUtPmNoYW5uZWxfbGF5b3V0OworICAgIGZyYW1lLT5uYl9zYW1wbGVzICAgICA9IGF2Y2ktPnRvX2ZyZWUtPm5iX3NhbXBsZXM7CisgICAgZnJhbWUtPmNoYW5uZWxzICAgICAgID0gYXZjaS0+dG9fZnJlZS0+Y2hhbm5lbHM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBic2ZzX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEFWQ29kZWNJbnRlcm5hbCAqYXZjaSA9IGF2Y3R4LT5pbnRlcm5hbDsKKyAgICBEZWNvZGVGaWx0ZXJDb250ZXh0ICpzID0gJmF2Y2ktPmZpbHRlcjsKKyAgICBjb25zdCBjaGFyICpic2ZzX3N0cjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHMtPm5iX2JzZnMpCisgICAgICAgIHJldHVybiAwOworCisgICAgYnNmc19zdHIgPSBhdmN0eC0+Y29kZWMtPmJzZnMgPyBhdmN0eC0+Y29kZWMtPmJzZnMgOiAibnVsbCI7CisgICAgd2hpbGUgKGJzZnNfc3RyICYmICpic2ZzX3N0cikgeworICAgICAgICBBVkJTRkNvbnRleHQgKip0bXA7CisgICAgICAgIGNvbnN0IEFWQml0U3RyZWFtRmlsdGVyICpmaWx0ZXI7CisgICAgICAgIGNoYXIgKmJzZjsKKworICAgICAgICBic2YgPSBhdl9nZXRfdG9rZW4oJmJzZnNfc3RyLCAiLCIpOworICAgICAgICBpZiAoIWJzZikgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyID0gYXZfYnNmX2dldF9ieV9uYW1lKGJzZik7CisgICAgICAgIGlmICghZmlsdGVyKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkEgbm9uLWV4aXN0aW5nIGJpdHN0cmVhbSBmaWx0ZXIgJXMgIgorICAgICAgICAgICAgICAgICAgICJyZXF1ZXN0ZWQgYnkgYSBkZWNvZGVyLiBUaGlzIGlzIGEgYnVnLCBwbGVhc2UgcmVwb3J0IGl0LlxuIiwKKyAgICAgICAgICAgICAgICAgICBic2YpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9CVUc7CisgICAgICAgICAgICBhdl9mcmVlcCgmYnNmKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmYnNmKTsKKworICAgICAgICB0bXAgPSBhdl9yZWFsbG9jX2FycmF5KHMtPmJzZnMsIHMtPm5iX2JzZnMgKyAxLCBzaXplb2YoKnMtPmJzZnMpKTsKKyAgICAgICAgaWYgKCF0bXApIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBzLT5ic2ZzID0gdG1wOworICAgICAgICBzLT5uYl9ic2ZzKys7CisKKyAgICAgICAgcmV0ID0gYXZfYnNmX2FsbG9jKGZpbHRlciwgJnMtPmJzZnNbcy0+bmJfYnNmcyAtIDFdKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgaWYgKHMtPm5iX2JzZnMgPT0gMSkgeworICAgICAgICAgICAgLyogV2UgZG8gbm90IGN1cnJlbnRseSBoYXZlIGFuIEFQSSBmb3IgcGFzc2luZyB0aGUgaW5wdXQgdGltZWJhc2UgaW50byBkZWNvZGVycywKKyAgICAgICAgICAgICAqIGJ1dCBubyBmaWx0ZXJzIHVzZWQgaGVyZSBzaG91bGQgYWN0dWFsbHkgbmVlZCBpdC4KKyAgICAgICAgICAgICAqIFNvIHdlIG1ha2UgdXAgc29tZSBwbGF1c2libGUtbG9va2luZyBudW1iZXIgKHRoZSBNUEVHIDkwa0h6IHRpbWViYXNlKSAqLworICAgICAgICAgICAgcy0+YnNmc1tzLT5uYl9ic2ZzIC0gMV0tPnRpbWVfYmFzZV9pbiA9IChBVlJhdGlvbmFsKXsgMSwgOTAwMDAgfTsKKyAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQocy0+YnNmc1tzLT5uYl9ic2ZzIC0gMV0tPnBhcl9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+YnNmc1tzLT5uYl9ic2ZzIC0gMV0tPnRpbWVfYmFzZV9pbiA9IHMtPmJzZnNbcy0+bmJfYnNmcyAtIDJdLT50aW1lX2Jhc2Vfb3V0OworICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkocy0+YnNmc1tzLT5uYl9ic2ZzIC0gMV0tPnBhcl9pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJzZnNbcy0+bmJfYnNmcyAtIDJdLT5wYXJfb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICByZXQgPSBhdl9ic2ZfaW5pdChzLT5ic2ZzW3MtPm5iX2JzZnMgLSAxXSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmZl9kZWNvZGVfYnNmc191bmluaXQoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIHRyeSB0byBnZXQgb25lIG91dHB1dCBwYWNrZXQgZnJvbSB0aGUgZmlsdGVyIGNoYWluICovCitzdGF0aWMgaW50IGJzZnNfcG9sbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRGVjb2RlRmlsdGVyQ29udGV4dCAqcyA9ICZhdmN0eC0+aW50ZXJuYWwtPmZpbHRlcjsKKyAgICBpbnQgaWR4LCByZXQ7CisKKyAgICAvKiBzdGFydCB3aXRoIHRoZSBsYXN0IGZpbHRlciBpbiB0aGUgY2hhaW4gKi8KKyAgICBpZHggPSBzLT5uYl9ic2ZzIC0gMTsKKyAgICB3aGlsZSAoaWR4ID49IDApIHsKKyAgICAgICAgLyogcmVxdWVzdCBhIHBhY2tldCBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZmlsdGVyICovCisgICAgICAgIHJldCA9IGF2X2JzZl9yZWNlaXZlX3BhY2tldChzLT5ic2ZzW2lkeF0sIHBrdCk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICAvKiBubyBwYWNrZXRzIGF2YWlsYWJsZSwgdHJ5IHRoZSBuZXh0IGZpbHRlciB1cCB0aGUgY2hhaW4gKi8KKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICBpZHgtLTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLyogZ290IGEgcGFja2V0IG9yIEVPRiAtLSBwYXNzIGl0IHRvIHRoZSBjYWxsZXIgb3IgdG8gdGhlIG5leHQgZmlsdGVyCisgICAgICAgICAqIGRvd24gdGhlIGNoYWluICovCisgICAgICAgIGlmIChpZHggPT0gcy0+bmJfYnNmcyAtIDEpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZHgrKzsKKyAgICAgICAgICAgIHJldCA9IGF2X2JzZl9zZW5kX3BhY2tldChzLT5ic2ZzW2lkeF0sIHJldCA8IDAgPyBOVUxMIDogcGt0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwcmUtcHJvY2Vzc2luZyBhIHBhY2tldCBiZWZvcmUgZGVjb2RpbmdcbiIpOworICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworfQorCitpbnQgZmZfZGVjb2RlX2dldF9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWQ29kZWNJbnRlcm5hbCAqYXZjaSA9IGF2Y3R4LT5pbnRlcm5hbDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGF2Y2ktPmRyYWluaW5nKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXQgPSBic2ZzX3BvbGwoYXZjdHgsIHBrdCk7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikKKyAgICAgICAgYXZjaS0+ZHJhaW5pbmcgPSAxOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZXh0cmFjdF9wYWNrZXRfcHJvcHMoYXZjdHgtPmludGVybmFsLCBwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgIHJldCA9IGFwcGx5X3BhcmFtX2NoYW5nZShhdmN0eCwgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmaW5pc2g7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5yZWNlaXZlX2ZyYW1lKQorICAgICAgICBhdmNpLT5jb21wYXRfZGVjb2RlX2NvbnN1bWVkICs9IHBrdC0+c2l6ZTsKKworICAgIHJldHVybiAwOworZmluaXNoOgorICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogQXR0ZW1wdCB0byBndWVzcyBwcm9wZXIgbW9ub3RvbmljIHRpbWVzdGFtcHMgZm9yIGRlY29kZWQgdmlkZW8gZnJhbWVzCisgKiB3aGljaCBtaWdodCBoYXZlIGluY29ycmVjdCB0aW1lcy4gSW5wdXQgdGltZXN0YW1wcyBtYXkgd3JhcCBhcm91bmQsIGluCisgKiB3aGljaCBjYXNlIHRoZSBvdXRwdXQgd2lsbCBhcyB3ZWxsLgorICoKKyAqIEBwYXJhbSBwdHMgdGhlIHB0cyBmaWVsZCBvZiB0aGUgZGVjb2RlZCBBVlBhY2tldCwgYXMgcGFzc2VkIHRocm91Z2gKKyAqIEFWRnJhbWUucHRzCisgKiBAcGFyYW0gZHRzIHRoZSBkdHMgZmllbGQgb2YgdGhlIGRlY29kZWQgQVZQYWNrZXQKKyAqIEByZXR1cm4gb25lIG9mIHRoZSBpbnB1dCB2YWx1ZXMsIG1heSBiZSBBVl9OT1BUU19WQUxVRQorICovCitzdGF0aWMgaW50NjRfdCBndWVzc19jb3JyZWN0X3B0cyhBVkNvZGVjQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCByZW9yZGVyZWRfcHRzLCBpbnQ2NF90IGR0cykKK3sKKyAgICBpbnQ2NF90IHB0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgaWYgKGR0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBjdHgtPnB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfZHRzICs9IGR0cyA8PSBjdHgtPnB0c19jb3JyZWN0aW9uX2xhc3RfZHRzOworICAgICAgICBjdHgtPnB0c19jb3JyZWN0aW9uX2xhc3RfZHRzID0gZHRzOworICAgIH0gZWxzZSBpZiAocmVvcmRlcmVkX3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X2R0cyA9IHJlb3JkZXJlZF9wdHM7CisKKyAgICBpZiAocmVvcmRlcmVkX3B0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBjdHgtPnB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfcHRzICs9IHJlb3JkZXJlZF9wdHMgPD0gY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X3B0czsKKyAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X3B0cyA9IHJlb3JkZXJlZF9wdHM7CisgICAgfSBlbHNlIGlmKGR0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X3B0cyA9IGR0czsKKworICAgIGlmICgoY3R4LT5wdHNfY29ycmVjdGlvbl9udW1fZmF1bHR5X3B0czw9Y3R4LT5wdHNfY29ycmVjdGlvbl9udW1fZmF1bHR5X2R0cyB8fCBkdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgJiYgcmVvcmRlcmVkX3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcHRzID0gcmVvcmRlcmVkX3B0czsKKyAgICBlbHNlCisgICAgICAgIHB0cyA9IGR0czsKKworICAgIHJldHVybiBwdHM7Cit9CisKKy8qCisgKiBUaGUgY29yZSBvZiB0aGUgcmVjZWl2ZV9mcmFtZV93cmFwcGVyIGZvciB0aGUgZGVjb2RlcnMgaW1wbGVtZW50aW5nCisgKiB0aGUgc2ltcGxlIEFQSS4gQ2VydGFpbiBkZWNvZGVycyBtaWdodCBjb25zdW1lIHBhcnRpYWwgcGFja2V0cyB3aXRob3V0CisgKiByZXR1cm5pbmcgYW55IG91dHB1dCwgc28gdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSBjYWxsZWQgaW4gYSBsb29wIHVudGlsIGl0CisgKiByZXR1cm5zIEVBR0FJTi4KKyAqKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3NpbXBsZV9pbnRlcm5hbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWQ29kZWNJbnRlcm5hbCAgICphdmNpID0gYXZjdHgtPmludGVybmFsOworICAgIERlY29kZVNpbXBsZUNvbnRleHQgKmRzID0gJmF2Y2ktPmRzOworICAgIEFWUGFja2V0ICAgICAgICAgICAqcGt0ID0gZHMtPmluX3BrdDsKKyAgICAvLyBjb3B5IHRvIGVuc3VyZSB3ZSBkbyBub3QgY2hhbmdlIHBrdAorICAgIGludCBnb3RfZnJhbWUsIGFjdHVhbF9nb3RfZnJhbWU7CisgICAgaW50IHJldDsKKworICAgIGlmICghcGt0LT5kYXRhICYmICFhdmNpLT5kcmFpbmluZykgeworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0ID0gZmZfZGVjb2RlX2dldF9wYWNrZXQoYXZjdHgsIHBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gU29tZSBjb2RlY3MgKGF0IGxlYXN0IHdtYSBsb3NzbGVzcykgd2lsbCBjcmFzaCB3aGVuIGZlZWRpbmcgZHJhaW4gcGFja2V0cworICAgIC8vIGFmdGVyIEVPRiB3YXMgc2lnbmFsZWQuCisgICAgaWYgKGF2Y2ktPmRyYWluaW5nX2RvbmUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmICghcGt0LT5kYXRhICYmCisgICAgICAgICEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfREVMQVkgfHwKKyAgICAgICAgICBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgZ290X2ZyYW1lID0gMDsKKworICAgIGlmIChIQVZFX1RIUkVBRFMgJiYgYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkgeworICAgICAgICByZXQgPSBmZl90aHJlYWRfZGVjb2RlX2ZyYW1lKGF2Y3R4LCBmcmFtZSwgJmdvdF9mcmFtZSwgcGt0KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBhdmN0eC0+Y29kZWMtPmRlY29kZShhdmN0eCwgZnJhbWUsICZnb3RfZnJhbWUsIHBrdCk7CisKKyAgICAgICAgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBzX2ludGVybmFsICYgRkZfQ09ERUNfQ0FQX1NFVFNfUEtUX0RUUykpCisgICAgICAgICAgICBmcmFtZS0+cGt0X2R0cyA9IHBrdC0+ZHRzOworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT50eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgaWYoIWF2Y3R4LT5oYXNfYl9mcmFtZXMpCisgICAgICAgICAgICAgICAgZnJhbWUtPnBrdF9wb3MgPSBwa3QtPnBvczsKKyAgICAgICAgICAgIC8vRklYTUUgdGhlc2Ugc2hvdWxkIGJlIHVuZGVyIGlmKCFhdmN0eC0+aGFzX2JfZnJhbWVzKQorICAgICAgICAgICAgLyogZ2V0X2J1ZmZlciBpcyBzdXBwb3NlZCB0byBzZXQgZnJhbWUgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfRFIxKSkgeworICAgICAgICAgICAgICAgIGlmICghZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKSAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICAgICAgICAgICAgICBpZiAoIWZyYW1lLT53aWR0aCkgICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCAgICAgICAgICAgICAgID0gYXZjdHgtPndpZHRoOworICAgICAgICAgICAgICAgIGlmICghZnJhbWUtPmhlaWdodCkgICAgICAgICAgICAgICAgICAgZnJhbWUtPmhlaWdodCAgICAgICAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OworICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgZnJhbWUtPmZvcm1hdCAgICAgICAgICAgICAgPSBhdmN0eC0+cGl4X2ZtdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbW1zX2MoKTsKKyAgICBhY3R1YWxfZ290X2ZyYW1lID0gZ290X2ZyYW1lOworCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKGZyYW1lLT5mbGFncyAmIEFWX0ZSQU1FX0ZMQUdfRElTQ0FSRCkKKyAgICAgICAgICAgIGdvdF9mcmFtZSA9IDA7CisgICAgICAgIGlmIChnb3RfZnJhbWUpCisgICAgICAgICAgICBmcmFtZS0+YmVzdF9lZmZvcnRfdGltZXN0YW1wID0gZ3Vlc3NfY29ycmVjdF9wdHMoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cGt0X2R0cyk7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29kZWMtPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIHVpbnQ4X3QgKnNpZGU7CisgICAgICAgIGludCBzaWRlX3NpemU7CisgICAgICAgIHVpbnQzMl90IGRpc2NhcmRfcGFkZGluZyA9IDA7CisgICAgICAgIHVpbnQ4X3Qgc2tpcF9yZWFzb24gPSAwOworICAgICAgICB1aW50OF90IGRpc2NhcmRfcmVhc29uID0gMDsKKworICAgICAgICBpZiAocmV0ID49IDAgJiYgZ290X2ZyYW1lKSB7CisgICAgICAgICAgICBmcmFtZS0+YmVzdF9lZmZvcnRfdGltZXN0YW1wID0gZ3Vlc3NfY29ycmVjdF9wdHMoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cGt0X2R0cyk7CisgICAgICAgICAgICBpZiAoZnJhbWUtPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX05PTkUpCisgICAgICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCA9IGF2Y3R4LT5zYW1wbGVfZm10OworICAgICAgICAgICAgaWYgKCFmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgICAgICAgICAgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ID0gYXZjdHgtPmNoYW5uZWxfbGF5b3V0OworICAgICAgICAgICAgaWYgKCFmcmFtZS0+Y2hhbm5lbHMpCisgICAgICAgICAgICAgICAgZnJhbWUtPmNoYW5uZWxzID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICAgICAgaWYgKCFmcmFtZS0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9yYXRlID0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgICAgICB9CisKKyAgICAgICAgc2lkZT0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZjaS0+bGFzdF9wa3RfcHJvcHMsIEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUywgJnNpZGVfc2l6ZSk7CisgICAgICAgIGlmKHNpZGUgJiYgc2lkZV9zaXplPj0xMCkgeworICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMgPSBBVl9STDMyKHNpZGUpICogYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXNfbXVsdGlwbGllcjsKKyAgICAgICAgICAgIGRpc2NhcmRfcGFkZGluZyA9IEFWX1JMMzIoc2lkZSArIDQpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJza2lwICVkIC8gZGlzY2FyZCAlZCBzYW1wbGVzIGR1ZSB0byBzaWRlIGRhdGFcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMsIChpbnQpZGlzY2FyZF9wYWRkaW5nKTsKKyAgICAgICAgICAgIHNraXBfcmVhc29uID0gQVZfUkw4KHNpZGUgKyA4KTsKKyAgICAgICAgICAgIGRpc2NhcmRfcmVhc29uID0gQVZfUkw4KHNpZGUgKyA5KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZnJhbWUtPmZsYWdzICYgQVZfRlJBTUVfRkxBR19ESVNDQVJEKSAmJiBnb3RfZnJhbWUgJiYKKyAgICAgICAgICAgICEoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX1NLSVBfTUFOVUFMKSkgeworICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMgPSBGRk1BWCgwLCBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyAtIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGdvdF9mcmFtZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMgPiAwICYmIGdvdF9mcmFtZSAmJgorICAgICAgICAgICAgIShhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfU0tJUF9NQU5VQUwpKSB7CisgICAgICAgICAgICBpZihmcmFtZS0+bmJfc2FtcGxlcyA8PSBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyl7CisgICAgICAgICAgICAgICAgZ290X2ZyYW1lID0gMDsKKyAgICAgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyAtPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNraXAgd2hvbGUgZnJhbWUsIHNraXAgbGVmdDogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfc2FtcGxlc19jb3B5KGZyYW1lLT5leHRlbmRlZF9kYXRhLCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgMCwgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzIC0gYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMsIGF2Y3R4LT5jaGFubmVscywgZnJhbWUtPmZvcm1hdCk7CisgICAgICAgICAgICAgICAgaWYoYXZjdHgtPnBrdF90aW1lYmFzZS5udW0gJiYgYXZjdHgtPnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlmZl90cyA9IGF2X3Jlc2NhbGVfcShhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBhdmN0eC0+c2FtcGxlX3JhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBrdF90aW1lYmFzZSk7CisgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1lLT5wdHMhPUFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnB0cyArPSBkaWZmX3RzOworI2lmIEZGX0FQSV9QS1RfUFRTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1lLT5wa3RfcHRzIT1BVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wa3RfcHRzICs9IGRpZmZfdHM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBpZihmcmFtZS0+cGt0X2R0cyE9QVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cGt0X2R0cyArPSBkaWZmX3RzOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWUtPnBrdF9kdXJhdGlvbiA+PSBkaWZmX3RzKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnBrdF9kdXJhdGlvbiAtPSBkaWZmX3RzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDb3VsZCBub3QgdXBkYXRlIHRpbWVzdGFtcHMgZm9yIHNraXBwZWQgc2FtcGxlcy5cbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNraXAgJWQvJWQgc2FtcGxlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMsIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyAtPSBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlczsKKyAgICAgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZGlzY2FyZF9wYWRkaW5nID4gMCAmJiBkaXNjYXJkX3BhZGRpbmcgPD0gZnJhbWUtPm5iX3NhbXBsZXMgJiYgZ290X2ZyYW1lICYmCisgICAgICAgICAgICAhKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9TS0lQX01BTlVBTCkpIHsKKyAgICAgICAgICAgIGlmIChkaXNjYXJkX3BhZGRpbmcgPT0gZnJhbWUtPm5iX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICBnb3RfZnJhbWUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZihhdmN0eC0+cGt0X3RpbWViYXNlLm51bSAmJiBhdmN0eC0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkaWZmX3RzID0gYXZfcmVzY2FsZV9xKGZyYW1lLT5uYl9zYW1wbGVzIC0gZGlzY2FyZF9wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIGF2Y3R4LT5zYW1wbGVfcmF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGt0X3RpbWViYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnBrdF9kdXJhdGlvbiA9IGRpZmZfdHM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNvdWxkIG5vdCB1cGRhdGUgdGltZXN0YW1wcyBmb3IgZGlzY2FyZGVkIHNhbXBsZXMuXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJkaXNjYXJkICVkLyVkIHNhbXBsZXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIChpbnQpZGlzY2FyZF9wYWRkaW5nLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgLT0gZGlzY2FyZF9wYWRkaW5nOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfU0tJUF9NQU5VQUwpICYmIGdvdF9mcmFtZSkgeworICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpmc2lkZSA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoZnJhbWUsIEFWX0ZSQU1FX0RBVEFfU0tJUF9TQU1QTEVTLCAxMCk7CisgICAgICAgICAgICBpZiAoZnNpZGUpIHsKKyAgICAgICAgICAgICAgICBBVl9XTDMyKGZzaWRlLT5kYXRhLCBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgQVZfV0wzMihmc2lkZS0+ZGF0YSArIDQsIGRpc2NhcmRfcGFkZGluZyk7CisgICAgICAgICAgICAgICAgQVZfV0w4KGZzaWRlLT5kYXRhICsgOCwgc2tpcF9yZWFzb24pOworICAgICAgICAgICAgICAgIEFWX1dMOChmc2lkZS0+ZGF0YSArIDksIGRpc2NhcmRfcmVhc29uKTsKKyAgICAgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAhYXZjaS0+c2hvd2VkX211bHRpX3BhY2tldF93YXJuaW5nICYmCisgICAgICAgIHJldCA+PSAwICYmIHJldCAhPSBwa3QtPnNpemUgJiYgIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9TVUJGUkFNRVMpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJNdWx0aXBsZSBmcmFtZXMgaW4gYSBwYWNrZXQuXG4iKTsKKyAgICAgICAgYXZjaS0+c2hvd2VkX211bHRpX3BhY2tldF93YXJuaW5nID0gMTsKKyAgICB9CisKKyAgICBpZiAoIWdvdF9mcmFtZSkKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworCisgICAgaWYgKHJldCA+PSAwICYmIGF2Y3R4LT5jb2RlYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgIShhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1RSVU5DQVRFRCkpCisgICAgICAgIHJldCA9IHBrdC0+c2l6ZTsKKworI2lmIEZGX0FQSV9BVkNUWF9USU1FQkFTRQorICAgIGlmIChhdmN0eC0+ZnJhbWVyYXRlLm51bSA+IDAgJiYgYXZjdHgtPmZyYW1lcmF0ZS5kZW4gPiAwKQorICAgICAgICBhdmN0eC0+dGltZV9iYXNlID0gYXZfaW52X3EoYXZfbXVsX3EoYXZjdHgtPmZyYW1lcmF0ZSwgKEFWUmF0aW9uYWwpe2F2Y3R4LT50aWNrc19wZXJfZnJhbWUsIDF9KSk7CisjZW5kaWYKKworICAgIC8qIGRvIG5vdCBzdG9wIGRyYWluaW5nIHdoZW4gYWN0dWFsX2dvdF9mcmFtZSAhPSAwIG9yIHJldCA8IDAgKi8KKyAgICAvKiBnb3RfZnJhbWUgPT0gMCBidXQgYWN0dWFsX2dvdF9mcmFtZSAhPSAwIHdoZW4gZnJhbWUgaXMgZGlzY2FyZGVkICovCisgICAgaWYgKGF2Y3R4LT5pbnRlcm5hbC0+ZHJhaW5pbmcgJiYgIWFjdHVhbF9nb3RfZnJhbWUpIHsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIC8qIHByZXZlbnQgaW5maW5pdGUgbG9vcCBpZiBhIGRlY29kZXIgd3JvbmdseSBhbHdheXMgcmV0dXJuIGVycm9yIG9uIGRyYWluaW5nICovCisgICAgICAgICAgICAvKiByZWFzb25hYmxlIG5iX2Vycm9yc19tYXggPSBtYXhpbXVtIGIgZnJhbWVzICsgdGhyZWFkIGNvdW50ICovCisgICAgICAgICAgICBpbnQgbmJfZXJyb3JzX21heCA9IDIwICsgKEhBVkVfVEhSRUFEUyAmJiBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRocmVhZF9jb3VudCA6IDEpOworCisgICAgICAgICAgICBpZiAoYXZjaS0+bmJfZHJhaW5pbmdfZXJyb3JzKysgPj0gbmJfZXJyb3JzX21heCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgZXJyb3JzIHdoZW4gZHJhaW5pbmcsIHRoaXMgaXMgYSBidWcuICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlN0b3AgZHJhaW5pbmcgYW5kIGZvcmNlIEVPRi5cbiIpOworICAgICAgICAgICAgICAgIGF2Y2ktPmRyYWluaW5nX2RvbmUgPSAxOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfQlVHOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZjaS0+ZHJhaW5pbmdfZG9uZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmNpLT5jb21wYXRfZGVjb2RlX2NvbnN1bWVkICs9IHJldDsKKworICAgIGlmIChyZXQgPj0gcGt0LT5zaXplIHx8IHJldCA8IDApIHsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGNvbnN1bWVkID0gcmV0OworCisgICAgICAgIHBrdC0+ZGF0YSAgICAgICAgICAgICAgICArPSBjb25zdW1lZDsKKyAgICAgICAgcGt0LT5zaXplICAgICAgICAgICAgICAgIC09IGNvbnN1bWVkOworICAgICAgICBhdmNpLT5sYXN0X3BrdF9wcm9wcy0+c2l6ZSAtPSBjb25zdW1lZDsgLy8gU2VlIGV4dHJhY3RfcGFja2V0X3Byb3BzKCkgY29tbWVudC4KKyAgICAgICAgcGt0LT5wdHMgICAgICAgICAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBwa3QtPmR0cyAgICAgICAgICAgICAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIGF2Y2ktPmxhc3RfcGt0X3Byb3BzLT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgYXZjaS0+bGFzdF9wa3RfcHJvcHMtPmR0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIH0KKworICAgIGlmIChnb3RfZnJhbWUpCisgICAgICAgIGF2X2Fzc2VydDAoZnJhbWUtPmJ1ZlswXSk7CisKKyAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3NpbXBsZV9yZWNlaXZlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHJldDsKKworICAgIHdoaWxlICghZnJhbWUtPmJ1ZlswXSkgeworICAgICAgICByZXQgPSBkZWNvZGVfc2ltcGxlX2ludGVybmFsKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmVjZWl2ZV9mcmFtZV9pbnRlcm5hbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWQ29kZWNJbnRlcm5hbCAqYXZjaSA9IGF2Y3R4LT5pbnRlcm5hbDsKKyAgICBpbnQgcmV0OworCisgICAgYXZfYXNzZXJ0MCghZnJhbWUtPmJ1ZlswXSk7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjLT5yZWNlaXZlX2ZyYW1lKQorICAgICAgICByZXQgPSBhdmN0eC0+Y29kZWMtPnJlY2VpdmVfZnJhbWUoYXZjdHgsIGZyYW1lKTsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IGRlY29kZV9zaW1wbGVfcmVjZWl2ZV9mcmFtZShhdmN0eCwgZnJhbWUpOworCisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikKKyAgICAgICAgYXZjaS0+ZHJhaW5pbmdfZG9uZSA9IDE7CisKKyAgICBpZiAoIXJldCkgeworICAgICAgICAvKiB0aGUgb25seSBjYXNlIHdoZXJlIGRlY29kZSBkYXRhIGlzIG5vdCBzZXQgc2hvdWxkIGJlIGRlY29kZXJzCisgICAgICAgICAqIHRoYXQgZG8gbm90IGNhbGwgZmZfZ2V0X2J1ZmZlcigpICovCisgICAgICAgIGF2X2Fzc2VydDAoKGZyYW1lLT5wcml2YXRlX3JlZiAmJiBmcmFtZS0+cHJpdmF0ZV9yZWYtPnNpemUgPT0gc2l6ZW9mKEZyYW1lRGVjb2RlRGF0YSkpIHx8CisgICAgICAgICAgICAgICAgICAgIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9EUjEpKTsKKworICAgICAgICBpZiAoZnJhbWUtPnByaXZhdGVfcmVmKSB7CisgICAgICAgICAgICBGcmFtZURlY29kZURhdGEgKmZkZCA9IChGcmFtZURlY29kZURhdGEqKWZyYW1lLT5wcml2YXRlX3JlZi0+ZGF0YTsKKworICAgICAgICAgICAgaWYgKGZkZC0+cG9zdF9wcm9jZXNzKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZmRkLT5wb3N0X3Byb2Nlc3MoYXZjdHgsIGZyYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogZnJlZSB0aGUgcGVyLWZyYW1lIGRlY29kZSBkYXRhICovCisgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+cHJpdmF0ZV9yZWYpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZjb2RlY19zZW5kX3BhY2tldChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkNvZGVjSW50ZXJuYWwgKmF2Y2kgPSBhdmN0eC0+aW50ZXJuYWw7CisgICAgaW50IHJldDsKKworICAgIGlmICghYXZjb2RlY19pc19vcGVuKGF2Y3R4KSB8fCAhYXZfY29kZWNfaXNfZGVjb2RlcihhdmN0eC0+Y29kZWMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKGF2Y3R4LT5pbnRlcm5hbC0+ZHJhaW5pbmcpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmIChhdnBrdCAmJiAhYXZwa3QtPnNpemUgJiYgYXZwa3QtPmRhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICByZXQgPSBic2ZzX2luaXQoYXZjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfcGFja2V0X3VucmVmKGF2Y2ktPmJ1ZmZlcl9wa3QpOworICAgIGlmIChhdnBrdCAmJiAoYXZwa3QtPmRhdGEgfHwgYXZwa3QtPnNpZGVfZGF0YV9lbGVtcykpIHsKKyAgICAgICAgcmV0ID0gYXZfcGFja2V0X3JlZihhdmNpLT5idWZmZXJfcGt0LCBhdnBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBhdl9ic2Zfc2VuZF9wYWNrZXQoYXZjaS0+ZmlsdGVyLmJzZnNbMF0sIGF2Y2ktPmJ1ZmZlcl9wa3QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihhdmNpLT5idWZmZXJfcGt0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoIWF2Y2ktPmJ1ZmZlcl9mcmFtZS0+YnVmWzBdKSB7CisgICAgICAgIHJldCA9IGRlY29kZV9yZWNlaXZlX2ZyYW1lX2ludGVybmFsKGF2Y3R4LCBhdmNpLT5idWZmZXJfZnJhbWUpOworICAgICAgICBpZiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUihFQUdBSU4pICYmIHJldCAhPSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfY3JvcHBpbmcoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICAvKiBtYWtlIHN1cmUgd2UgYXJlIG5vaXN5IGFib3V0IGRlY29kZXJzIHJldHVybmluZyBpbnZhbGlkIGNyb3BwaW5nIGRhdGEgKi8KKyAgICBpZiAoZnJhbWUtPmNyb3BfbGVmdCA+PSBJTlRfTUFYIC0gZnJhbWUtPmNyb3BfcmlnaHQgICAgICAgIHx8CisgICAgICAgIGZyYW1lLT5jcm9wX3RvcCAgPj0gSU5UX01BWCAtIGZyYW1lLT5jcm9wX2JvdHRvbSAgICAgICB8fAorICAgICAgICAoZnJhbWUtPmNyb3BfbGVmdCArIGZyYW1lLT5jcm9wX3JpZ2h0KSA+PSBmcmFtZS0+d2lkdGggfHwKKyAgICAgICAgKGZyYW1lLT5jcm9wX3RvcCArIGZyYW1lLT5jcm9wX2JvdHRvbSkgPj0gZnJhbWUtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkludmFsaWQgY3JvcHBpbmcgaW5mb3JtYXRpb24gc2V0IGJ5IGEgZGVjb2RlcjogIgorICAgICAgICAgICAgICAgIiUiU0laRV9TUEVDSUZJRVIiLyUiU0laRV9TUEVDSUZJRVIiLyUiU0laRV9TUEVDSUZJRVIiLyUiU0laRV9TUEVDSUZJRVIiICIKKyAgICAgICAgICAgICAgICIoZnJhbWUgc2l6ZSAlZHglZCkuIFRoaXMgaXMgYSBidWcsIHBsZWFzZSByZXBvcnQgaXRcbiIsCisgICAgICAgICAgICAgICBmcmFtZS0+Y3JvcF9sZWZ0LCBmcmFtZS0+Y3JvcF9yaWdodCwgZnJhbWUtPmNyb3BfdG9wLCBmcmFtZS0+Y3JvcF9ib3R0b20sCisgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQpOworICAgICAgICBmcmFtZS0+Y3JvcF9sZWZ0ICAgPSAwOworICAgICAgICBmcmFtZS0+Y3JvcF9yaWdodCAgPSAwOworICAgICAgICBmcmFtZS0+Y3JvcF90b3AgICAgPSAwOworICAgICAgICBmcmFtZS0+Y3JvcF9ib3R0b20gPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWF2Y3R4LT5hcHBseV9jcm9wcGluZykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gYXZfZnJhbWVfYXBwbHlfY3JvcHBpbmcoZnJhbWUsIGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfVU5BTElHTkVEID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0ZSQU1FX0NST1BfVU5BTElHTkVEIDogMCk7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2Y29kZWNfcmVjZWl2ZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWQ29kZWNJbnRlcm5hbCAqYXZjaSA9IGF2Y3R4LT5pbnRlcm5hbDsKKyAgICBpbnQgcmV0OworCisgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworCisgICAgaWYgKCFhdmNvZGVjX2lzX29wZW4oYXZjdHgpIHx8ICFhdl9jb2RlY19pc19kZWNvZGVyKGF2Y3R4LT5jb2RlYykpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICByZXQgPSBic2ZzX2luaXQoYXZjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGF2Y2ktPmJ1ZmZlcl9mcmFtZS0+YnVmWzBdKSB7CisgICAgICAgIGF2X2ZyYW1lX21vdmVfcmVmKGZyYW1lLCBhdmNpLT5idWZmZXJfZnJhbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGRlY29kZV9yZWNlaXZlX2ZyYW1lX2ludGVybmFsKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIHJldCA9IGFwcGx5X2Nyb3BwaW5nKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBjb25zdCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWQ29kZWNJbnRlcm5hbCAqYXZjaSA9IGF2Y3R4LT5pbnRlcm5hbDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGF2X2Fzc2VydDAoYXZjaS0+Y29tcGF0X2RlY29kZV9jb25zdW1lZCA9PSAwKTsKKworICAgIGlmIChhdmNpLT5kcmFpbmluZ19kb25lICYmIHBrdCAmJiBwa3QtPnNpemUgIT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiR290IHVuZXhwZWN0ZWQgcGFja2V0IGFmdGVyIEVPRlxuIik7CisgICAgICAgIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhhdmN0eCk7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDA7CisgICAgYXZjaS0+Y29tcGF0X2RlY29kZSA9IDE7CisKKyAgICBpZiAoYXZjaS0+Y29tcGF0X2RlY29kZV9wYXJ0aWFsX3NpemUgPiAwICYmCisgICAgICAgIGF2Y2ktPmNvbXBhdF9kZWNvZGVfcGFydGlhbF9zaXplICE9IHBrdC0+c2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJHb3QgdW5leHBlY3RlZCBwYWNrZXQgc2l6ZSBhZnRlciBhIHBhcnRpYWwgZGVjb2RlXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKKyAgICBpZiAoIWF2Y2ktPmNvbXBhdF9kZWNvZGVfcGFydGlhbF9zaXplKSB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfc2VuZF9wYWNrZXQoYXZjdHgsIHBrdCk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICBlbHNlIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICAvKiB3ZSBmdWxseSBkcmFpbiBhbGwgdGhlIG91dHB1dCBpbiBlYWNoIGRlY29kZSBjYWxsLCBzbyB0aGlzIHNob3VsZCBub3QKKyAgICAgICAgICAgICAqIGV2ZXIgaGFwcGVuICovCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0JVRzsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKKyAgICB3aGlsZSAocmV0ID49IDApIHsKKyAgICAgICAgcmV0ID0gYXZjb2RlY19yZWNlaXZlX2ZyYW1lKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lICE9IGF2Y2ktPmNvbXBhdF9kZWNvZGVfZnJhbWUpIHsKKyAgICAgICAgICAgIGlmICghYXZjdHgtPnJlZmNvdW50ZWRfZnJhbWVzKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gdW5yZWZjb3VudF9mcmFtZShhdmNpLCBmcmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICAgICAgICAgIGZyYW1lID0gYXZjaS0+Y29tcGF0X2RlY29kZV9mcmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghYXZjaS0+Y29tcGF0X2RlY29kZV93YXJuZWQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlIGRlcHJlY2F0ZWQgYXZjb2RlY19kZWNvZGVfKiAiCisgICAgICAgICAgICAgICAgICAgICAgICJBUEkgY2Fubm90IHJldHVybiBhbGwgdGhlIGZyYW1lcyBmb3IgdGhpcyBkZWNvZGVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICJTb21lIGZyYW1lcyB3aWxsIGJlIGRyb3BwZWQuIFVwZGF0ZSB5b3VyIGNvZGUgdG8gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm5ldyBkZWNvZGluZyBBUEkgdG8gZml4IHRoaXMuXG4iKTsKKyAgICAgICAgICAgICAgICBhdmNpLT5jb21wYXRfZGVjb2RlX3dhcm5lZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZjaS0+ZHJhaW5pbmcgfHwgKCFhdmN0eC0+Y29kZWMtPmJzZnMgJiYgYXZjaS0+Y29tcGF0X2RlY29kZV9jb25zdW1lZCA8IHBrdC0+c2l6ZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKK2ZpbmlzaDoKKyAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgLyogaWYgdGhlcmUgYXJlIGFueSBic2ZzIHRoZW4gYXNzdW1lIGZ1bGwgcGFja2V0IGlzIGFsd2F5cyBjb25zdW1lZCAqLworICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5ic2ZzKQorICAgICAgICAgICAgcmV0ID0gcGt0LT5zaXplOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQgPSBGRk1JTihhdmNpLT5jb21wYXRfZGVjb2RlX2NvbnN1bWVkLCBwa3QtPnNpemUpOworICAgIH0KKyAgICBhdmNpLT5jb21wYXRfZGVjb2RlX2NvbnN1bWVkID0gMDsKKyAgICBhdmNpLT5jb21wYXRfZGVjb2RlX3BhcnRpYWxfc2l6ZSA9IChyZXQgPj0gMCkgPyBwa3QtPnNpemUgLSByZXQgOiAwOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZjb2RlY19kZWNvZGVfdmlkZW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9waWN0dXJlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgcmV0dXJuIGNvbXBhdF9kZWNvZGUoYXZjdHgsIHBpY3R1cmUsIGdvdF9waWN0dXJlX3B0ciwgYXZwa3QpOworfQorCitpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdmNvZGVjX2RlY29kZV9hdWRpbzQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgcmV0dXJuIGNvbXBhdF9kZWNvZGUoYXZjdHgsIGZyYW1lLCBnb3RfZnJhbWVfcHRyLCBhdnBrdCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9zdWJ0aXRsZV9kZWZhdWx0cyhBVlN1YnRpdGxlICpzdWIpCit7CisgICAgbWVtc2V0KHN1YiwgMCwgc2l6ZW9mKCpzdWIpKTsKKyAgICBzdWItPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworfQorCisjZGVmaW5lIFVURjhfTUFYX0JZVEVTIDQgLyogNSBhbmQgNiBieXRlcyBzZXF1ZW5jZXMgc2hvdWxkIG5vdCBiZSB1c2VkICovCitzdGF0aWMgaW50IHJlY29kZV9zdWJ0aXRsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqb3V0cGt0LCBjb25zdCBBVlBhY2tldCAqaW5wa3QpCit7CisjaWYgQ09ORklHX0lDT05WCisgICAgaWNvbnZfdCBjZCA9IChpY29udl90KS0xOworICAgIGludCByZXQgPSAwOworICAgIGNoYXIgKmluYiwgKm91dGI7CisgICAgc2l6ZV90IGlubCwgb3V0bDsKKyAgICBBVlBhY2tldCB0bXA7CisjZW5kaWYKKworICAgIGlmIChhdmN0eC0+c3ViX2NoYXJlbmNfbW9kZSAhPSBGRl9TVUJfQ0hBUkVOQ19NT0RFX1BSRV9ERUNPREVSIHx8IGlucGt0LT5zaXplID09IDApCisgICAgICAgIHJldHVybiAwOworCisjaWYgQ09ORklHX0lDT05WCisgICAgY2QgPSBpY29udl9vcGVuKCJVVEYtOCIsIGF2Y3R4LT5zdWJfY2hhcmVuYyk7CisgICAgYXZfYXNzZXJ0MChjZCAhPSAoaWNvbnZfdCktMSk7CisKKyAgICBpbmIgPSBpbnBrdC0+ZGF0YTsKKyAgICBpbmwgPSBpbnBrdC0+c2l6ZTsKKworICAgIGlmIChpbmwgPj0gSU5UX01BWCAvIFVURjhfTUFYX0JZVEVTIC0gQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN1YnRpdGxlcyBwYWNrZXQgaXMgdG9vIGJpZyBmb3IgcmVjb2RpbmdcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHJldCA9IGF2X25ld19wYWNrZXQoJnRtcCwgaW5sICogVVRGOF9NQVhfQllURVMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBvdXRwa3QtPmJ1ZiAgPSB0bXAuYnVmOworICAgIG91dHBrdC0+ZGF0YSA9IHRtcC5kYXRhOworICAgIG91dHBrdC0+c2l6ZSA9IHRtcC5zaXplOworICAgIG91dGIgPSBvdXRwa3QtPmRhdGE7CisgICAgb3V0bCA9IG91dHBrdC0+c2l6ZTsKKworICAgIGlmIChpY29udihjZCwgJmluYiwgJmlubCwgJm91dGIsICZvdXRsKSA9PSAoc2l6ZV90KS0xIHx8CisgICAgICAgIGljb252KGNkLCBOVUxMLCBOVUxMLCAmb3V0YiwgJm91dGwpID09IChzaXplX3QpLTEgfHwKKyAgICAgICAgb3V0bCA+PSBvdXRwa3QtPnNpemUgfHwgaW5sICE9IDApIHsKKyAgICAgICAgcmV0ID0gRkZNSU4oQVZFUlJPUihlcnJubyksIC0xKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVjb2RlIHN1YnRpdGxlIGV2ZW50IFwiJXNcIiAiCisgICAgICAgICAgICAgICAiZnJvbSAlcyB0byBVVEYtOFxuIiwgaW5wa3QtPmRhdGEsIGF2Y3R4LT5zdWJfY2hhcmVuYyk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmdG1wKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIG91dHBrdC0+c2l6ZSAtPSBvdXRsOworICAgIG1lbXNldChvdXRwa3QtPmRhdGEgKyBvdXRwa3QtPnNpemUsIDAsIG91dGwpOworCitlbmQ6CisgICAgaWYgKGNkICE9IChpY29udl90KS0xKQorICAgICAgICBpY29udl9jbG9zZShjZCk7CisgICAgcmV0dXJuIHJldDsKKyNlbHNlCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZXF1ZXN0aW5nIHN1YnRpdGxlcyByZWNvZGluZyB3aXRob3V0IGljb252Iik7CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHV0ZjhfY2hlY2soY29uc3QgdWludDhfdCAqc3RyKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGU7CisgICAgdWludDMyX3QgY29kZXBvaW50LCBtaW47CisKKyAgICB3aGlsZSAoKnN0cikgeworICAgICAgICBieXRlID0gc3RyOworICAgICAgICBHRVRfVVRGOChjb2RlcG9pbnQsICooYnl0ZSsrKSwgcmV0dXJuIDA7KTsKKyAgICAgICAgbWluID0gYnl0ZSAtIHN0ciA9PSAxID8gMCA6IGJ5dGUgLSBzdHIgPT0gMiA/IDB4ODAgOgorICAgICAgICAgICAgICAxIDw8ICg1ICogKGJ5dGUgLSBzdHIpIC0gNCk7CisgICAgICAgIGlmIChjb2RlcG9pbnQgPCBtaW4gfHwgY29kZXBvaW50ID49IDB4MTEwMDAwIHx8CisgICAgICAgICAgICBjb2RlcG9pbnQgPT0gMHhGRkZFIC8qIEJPTSAqLyB8fAorICAgICAgICAgICAgY29kZXBvaW50ID49IDB4RDgwMCAmJiBjb2RlcG9pbnQgPD0gMHhERkZGIC8qIHN1cnJvZ2F0ZXMgKi8pCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgc3RyID0gYnl0ZTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKyNpZiBGRl9BUElfQVNTX1RJTUlORworc3RhdGljIHZvaWQgaW5zZXJ0X3RzKEFWQlByaW50ICpidWYsIGludCB0cykKK3sKKyAgICBpZiAodHMgPT0gLTEpIHsKKyAgICAgICAgYXZfYnByaW50ZihidWYsICI5OjU5OjU5Ljk5LCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBoLCBtLCBzOworCisgICAgICAgIGggPSB0cy8zNjAwMDA7ICB0cyAtPSAzNjAwMDAqaDsKKyAgICAgICAgbSA9IHRzLyAgNjAwMDsgIHRzIC09ICAgNjAwMCptOworICAgICAgICBzID0gdHMvICAgMTAwOyAgdHMgLT0gICAgMTAwKnM7CisgICAgICAgIGF2X2JwcmludGYoYnVmLCAiJWQ6JTAyZDolMDJkLiUwMmQsIiwgaCwgbSwgcywgdHMpOworICAgIH0KK30KKworc3RhdGljIGludCBjb252ZXJ0X3N1Yl90b19vbGRfYXNzX2Zvcm0oQVZTdWJ0aXRsZSAqc3ViLCBjb25zdCBBVlBhY2tldCAqcGt0LCBBVlJhdGlvbmFsIHRiKQoreworICAgIGludCBpOworICAgIEFWQlByaW50IGJ1ZjsKKworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3ViLT5udW1fcmVjdHM7IGkrKykgeworICAgICAgICBjaGFyICpmaW5hbF9kaWFsb2c7CisgICAgICAgIGNvbnN0IGNoYXIgKmRpYWxvZzsKKyAgICAgICAgQVZTdWJ0aXRsZVJlY3QgKnJlY3QgPSBzdWItPnJlY3RzW2ldOworICAgICAgICBpbnQgdHNfc3RhcnQsIHRzX2R1cmF0aW9uID0gLTE7CisgICAgICAgIGxvbmcgaW50IGxheWVyOworCisgICAgICAgIGlmIChyZWN0LT50eXBlICE9IFNVQlRJVExFX0FTUyB8fCAhc3RybmNtcChyZWN0LT5hc3MsICJEaWFsb2d1ZTogIiwgMTApKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYXZfYnByaW50X2NsZWFyKCZidWYpOworCisgICAgICAgIC8qIHNraXAgUmVhZE9yZGVyICovCisgICAgICAgIGRpYWxvZyA9IHN0cmNocihyZWN0LT5hc3MsICcsJyk7CisgICAgICAgIGlmICghZGlhbG9nKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRpYWxvZysrOworCisgICAgICAgIC8qIGV4dHJhY3QgTGF5ZXIgb3IgTWFya2VkICovCisgICAgICAgIGxheWVyID0gc3RydG9sKGRpYWxvZywgKGNoYXIqKikmZGlhbG9nLCAxMCk7CisgICAgICAgIGlmICgqZGlhbG9nICE9ICcsJykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBkaWFsb2crKzsKKworICAgICAgICAvKiByZXNjYWxlIHRpbWluZyB0byBBU1MgdGltZSBiYXNlIChtcykgKi8KKyAgICAgICAgdHNfc3RhcnQgPSBhdl9yZXNjYWxlX3EocGt0LT5wdHMsIHRiLCBhdl9tYWtlX3EoMSwgMTAwKSk7CisgICAgICAgIGlmIChwa3QtPmR1cmF0aW9uICE9IC0xKQorICAgICAgICAgICAgdHNfZHVyYXRpb24gPSBhdl9yZXNjYWxlX3EocGt0LT5kdXJhdGlvbiwgdGIsIGF2X21ha2VfcSgxLCAxMDApKTsKKyAgICAgICAgc3ViLT5lbmRfZGlzcGxheV90aW1lID0gRkZNQVgoc3ViLT5lbmRfZGlzcGxheV90aW1lLCAxMCAqIHRzX2R1cmF0aW9uKTsKKworICAgICAgICAvKiBjb25zdHJ1Y3QgQVNTIChzdGFuZGFsb25lIGZpbGUgZm9ybSB3aXRoIHRpbWVzdGFtcHMpIHN0cmluZyAqLworICAgICAgICBhdl9icHJpbnRmKCZidWYsICJEaWFsb2d1ZTogJWxkLCIsIGxheWVyKTsKKyAgICAgICAgaW5zZXJ0X3RzKCZidWYsIHRzX3N0YXJ0KTsKKyAgICAgICAgaW5zZXJ0X3RzKCZidWYsIHRzX2R1cmF0aW9uID09IC0xID8gLTEgOiB0c19zdGFydCArIHRzX2R1cmF0aW9uKTsKKyAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiJXNcclxuIiwgZGlhbG9nKTsKKworICAgICAgICBmaW5hbF9kaWFsb2cgPSBhdl9zdHJkdXAoYnVmLnN0cik7CisgICAgICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKCZidWYpIHx8ICFmaW5hbF9kaWFsb2cpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZmaW5hbF9kaWFsb2cpOworICAgICAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmcmVjdC0+YXNzKTsKKyAgICAgICAgcmVjdC0+YXNzID0gZmluYWxfZGlhbG9nOworICAgIH0KKworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitpbnQgYXZjb2RlY19kZWNvZGVfc3VidGl0bGUyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZTdWJ0aXRsZSAqc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9zdWJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBpZiAoIWF2cGt0LT5kYXRhICYmIGF2cGt0LT5zaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwYWNrZXQ6IE5VTEwgZGF0YSwgc2l6ZSAhPSAwXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKCFhdmN0eC0+Y29kZWMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+dHlwZSAhPSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1lZGlhIHR5cGUgZm9yIHN1YnRpdGxlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgKmdvdF9zdWJfcHRyID0gMDsKKyAgICBnZXRfc3VidGl0bGVfZGVmYXVsdHMoc3ViKTsKKworICAgIGlmICgoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfREVMQVkpIHx8IGF2cGt0LT5zaXplKSB7CisgICAgICAgIEFWUGFja2V0IHBrdF9yZWNvZGVkID0gKmF2cGt0OworCisgICAgICAgIHJldCA9IHJlY29kZV9zdWJ0aXRsZShhdmN0eCwgJnBrdF9yZWNvZGVkLCBhdnBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAqZ290X3N1Yl9wdHIgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHJldCA9IGV4dHJhY3RfcGFja2V0X3Byb3BzKGF2Y3R4LT5pbnRlcm5hbCwgJnBrdF9yZWNvZGVkKTsKKyAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBpZiAoYXZjdHgtPnBrdF90aW1lYmFzZS5udW0gJiYgYXZwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgICAgICBzdWItPnB0cyA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5wa3RfdGltZWJhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgICAgIHJldCA9IGF2Y3R4LT5jb2RlYy0+ZGVjb2RlKGF2Y3R4LCBzdWIsIGdvdF9zdWJfcHRyLCAmcGt0X3JlY29kZWQpOworICAgICAgICAgICAgYXZfYXNzZXJ0MSgocmV0ID49IDApID49ICEhKmdvdF9zdWJfcHRyICYmCisgICAgICAgICAgICAgICAgICAgICAgICEhKmdvdF9zdWJfcHRyID49ICEhc3ViLT5udW1fcmVjdHMpOworCisjaWYgRkZfQVBJX0FTU19USU1JTkcKKyAgICAgICAgICAgIGlmIChhdmN0eC0+c3ViX3RleHRfZm9ybWF0ID09IEZGX1NVQl9URVhUX0ZNVF9BU1NfV0lUSF9USU1JTkdTCisgICAgICAgICAgICAgICAgJiYgKmdvdF9zdWJfcHRyICYmIHN1Yi0+bnVtX3JlY3RzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgQVZSYXRpb25hbCB0YiA9IGF2Y3R4LT5wa3RfdGltZWJhc2UubnVtID8gYXZjdHgtPnBrdF90aW1lYmFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF2Y3R4LT50aW1lX2Jhc2U7CisgICAgICAgICAgICAgICAgaW50IGVyciA9IGNvbnZlcnRfc3ViX3RvX29sZF9hc3NfZm9ybShzdWIsIGF2cGt0LCB0Yik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGVycjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoc3ViLT5udW1fcmVjdHMgJiYgIXN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSAmJiBhdnBrdC0+ZHVyYXRpb24gJiYKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGt0X3RpbWViYXNlLm51bSkgeworICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgbXMgPSB7IDEsIDEwMDAgfTsKKyAgICAgICAgICAgICAgICBzdWItPmVuZF9kaXNwbGF5X3RpbWUgPSBhdl9yZXNjYWxlX3EoYXZwa3QtPmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGt0X3RpbWViYXNlLCBtcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfZGVzY3JpcHRvci0+cHJvcHMgJiBBVl9DT0RFQ19QUk9QX0JJVE1BUF9TVUIpCisgICAgICAgICAgICAgICAgc3ViLT5mb3JtYXQgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmNvZGVjX2Rlc2NyaXB0b3ItPnByb3BzICYgQVZfQ09ERUNfUFJPUF9URVhUX1NVQikKKyAgICAgICAgICAgICAgICBzdWItPmZvcm1hdCA9IDE7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdWItPm51bV9yZWN0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5zdWJfY2hhcmVuY19tb2RlICE9IEZGX1NVQl9DSEFSRU5DX01PREVfSUdOT1JFICYmCisgICAgICAgICAgICAgICAgICAgIHN1Yi0+cmVjdHNbaV0tPmFzcyAmJiAhdXRmOF9jaGVjayhzdWItPnJlY3RzW2ldLT5hc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgVVRGLTggaW4gZGVjb2RlZCBzdWJ0aXRsZXMgdGV4dDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heWJlIG1pc3NpbmcgLXN1Yl9jaGFyZW5jIG9wdGlvblxuIik7CisgICAgICAgICAgICAgICAgICAgIGF2c3VidGl0bGVfZnJlZShzdWIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdnBrdC0+ZGF0YSAhPSBwa3RfcmVjb2RlZC5kYXRhKSB7IC8vIGRpZCB3ZSByZWNvZGU/CisgICAgICAgICAgICAgICAgLyogcHJldmVudCBmcm9tIGRlc3Ryb3lpbmcgc2lkZSBkYXRhIGZyb20gb3JpZ2luYWwgcGFja2V0ICovCisgICAgICAgICAgICAgICAgcGt0X3JlY29kZWQuc2lkZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICBwa3RfcmVjb2RlZC5zaWRlX2RhdGFfZWxlbXMgPSAwOworCisgICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3RfcmVjb2RlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmdvdF9zdWJfcHRyKQorICAgICAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2VudW0gQVZQaXhlbEZvcm1hdCBhdmNvZGVjX2RlZmF1bHRfZ2V0X2Zvcm1hdChzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqZm10KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBjb25zdCBBVkNvZGVjSFdDb25maWcgKmNvbmZpZzsKKyAgICBpbnQgaSwgbjsKKworICAgIC8vIElmIGEgZGV2aWNlIHdhcyBzdXBwbGllZCB3aGVuIHRoZSBjb2RlYyB3YXMgb3BlbmVkLCBhc3N1bWUgdGhhdCB0aGUKKyAgICAvLyB1c2VyIHdhbnRzIHRvIHVzZSBpdC4KKyAgICBpZiAoYXZjdHgtPmh3X2RldmljZV9jdHggJiYgYXZjdHgtPmNvZGVjLT5od19jb25maWdzKSB7CisgICAgICAgIEFWSFdEZXZpY2VDb250ZXh0ICpkZXZpY2VfY3R4ID0KKyAgICAgICAgICAgIChBVkhXRGV2aWNlQ29udGV4dCopYXZjdHgtPmh3X2RldmljZV9jdHgtPmRhdGE7CisgICAgICAgIGZvciAoaSA9IDA7OyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZpZyA9ICZhdmN0eC0+Y29kZWMtPmh3X2NvbmZpZ3NbaV0tPnB1YmxpYzsKKyAgICAgICAgICAgIGlmICghY29uZmlnKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKCEoY29uZmlnLT5tZXRob2RzICYKKyAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0hXX0NPTkZJR19NRVRIT0RfSFdfREVWSUNFX0NUWCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoZGV2aWNlX2N0eC0+dHlwZSAhPSBjb25maWctPmRldmljZV90eXBlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChuID0gMDsgZm10W25dICE9IEFWX1BJWF9GTVRfTk9ORTsgbisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+cGl4X2ZtdCA9PSBmbXRbbl0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbXRbbl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTm8gZGV2aWNlIG9yIG90aGVyIHNldHVwLCBzbyB3ZSBoYXZlIHRvIGNob29zZSBmcm9tIHRoaW5ncyB3aGljaAorICAgIC8vIGRvbid0IGFueSBvdGhlciBleHRlcm5hbCBpbmZvcm1hdGlvbi4KKworICAgIC8vIElmIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIGxpc3QgaXMgYSBzb2Z0d2FyZSBmb3JtYXQsIGNob29zZSBpdAorICAgIC8vICh0aGlzIHNob3VsZCBiZSBiZXN0IHNvZnR3YXJlIGZvcm1hdCBpZiBhbnkgZXhpc3QpLgorICAgIGZvciAobiA9IDA7IGZtdFtuXSAhPSBBVl9QSVhfRk1UX05PTkU7IG4rKyk7CisgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10W24gLSAxXSk7CisgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkpCisgICAgICAgIHJldHVybiBmbXRbbiAtIDFdOworCisgICAgLy8gRmluYWxseSwgdHJhdmVyc2UgdGhlIGxpc3QgaW4gb3JkZXIgYW5kIGNob29zZSB0aGUgZmlyc3QgZW50cnkKKyAgICAvLyB3aXRoIG5vIGV4dGVybmFsIGRlcGVuZGVuY2llcyAoaWYgdGhlcmUgaXMgbm8gaGFyZHdhcmUgY29uZmlndXJhdGlvbgorICAgIC8vIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0aGVuIHRoaXMganVzdCBwaWNrcyB0aGUgZmlyc3QgZW50cnkpLgorICAgIGZvciAobiA9IDA7IGZtdFtuXSAhPSBBVl9QSVhfRk1UX05PTkU7IG4rKykgeworICAgICAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICBjb25maWcgPSBhdmNvZGVjX2dldF9od19jb25maWcoYXZjdHgtPmNvZGVjLCBpKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGNvbmZpZy0+cGl4X2ZtdCA9PSBmbXRbbl0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb25maWcpIHsKKyAgICAgICAgICAgIC8vIE5vIHNwZWNpZmljIGNvbmZpZyBhdmFpbGFibGUsIHNvIHRoZSBkZWNvZGVyIG11c3QgYmUgYWJsZQorICAgICAgICAgICAgLy8gdG8gaGFuZGxlIHRoaXMgZm9ybWF0IHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgc2V0dXAuCisgICAgICAgICAgICByZXR1cm4gZm10W25dOworICAgICAgICB9CisgICAgICAgIGlmIChjb25maWctPm1ldGhvZHMgJiBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0lOVEVSTkFMKSB7CisgICAgICAgICAgICAvLyBVc2FibGUgd2l0aCBvbmx5IGludGVybmFsIHNldHVwLgorICAgICAgICAgICAgcmV0dXJuIGZtdFtuXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdGhpbmcgaXMgdXNhYmxlLCBnaXZlIHVwLgorICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7Cit9CisKK2ludCBmZl9kZWNvZGVfZ2V0X2h3X2ZyYW1lc19jdHgoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWSFdEZXZpY2VUeXBlIGRldl90eXBlKQoreworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpkZXZpY2VfY3R4OworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmcmFtZXNfY3R4OworICAgIGludCByZXQ7CisKKyAgICBpZiAoIWF2Y3R4LT5od2FjY2VsKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgaWYgKGF2Y3R4LT5od19mcmFtZXNfY3R4KQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIWF2Y3R4LT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQSBoYXJkd2FyZSBmcmFtZXMgb3IgZGV2aWNlIGNvbnRleHQgaXMgIgorICAgICAgICAgICAgICAgICJyZXF1aXJlZCBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0ZWQgZGVjb2RpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBkZXZpY2VfY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0ICopYXZjdHgtPmh3X2RldmljZV9jdHgtPmRhdGE7CisgICAgaWYgKGRldmljZV9jdHgtPnR5cGUgIT0gZGV2X3R5cGUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZXZpY2UgdHlwZSAlcyBleHBlY3RlZCBmb3IgaGFyZHdhcmUgIgorICAgICAgICAgICAgICAgImRlY29kaW5nLCBidXQgZ290ICVzLlxuIiwgYXZfaHdkZXZpY2VfZ2V0X3R5cGVfbmFtZShkZXZfdHlwZSksCisgICAgICAgICAgICAgICBhdl9od2RldmljZV9nZXRfdHlwZV9uYW1lKGRldmljZV9jdHgtPnR5cGUpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXQgPSBhdmNvZGVjX2dldF9od19mcmFtZXNfcGFyYW1ldGVycyhhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aHdfZGV2aWNlX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aHdhY2NlbC0+cGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZjdHgtPmh3X2ZyYW1lc19jdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKworICAgIGlmIChmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSkgeworICAgICAgICAvLyBXZSBndWFyYW50ZWUgNCBiYXNlIHdvcmsgc3VyZmFjZXMuIFRoZSBmdW5jdGlvbiBhYm92ZSBndWFyYW50ZWVzIDEKKyAgICAgICAgLy8gKHRoZSBhYnNvbHV0ZSBtaW5pbXVtKSwgc28gYWRkIHRoZSBtaXNzaW5nIGNvdW50LgorICAgICAgICBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSArPSAzOworICAgIH0KKworICAgIHJldCA9IGF2X2h3ZnJhbWVfY3R4X2luaXQoYXZjdHgtPmh3X2ZyYW1lc19jdHgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmYXZjdHgtPmh3X2ZyYW1lc19jdHgpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZjb2RlY19nZXRfaHdfZnJhbWVzX3BhcmFtZXRlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpkZXZpY2VfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBod19waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICoqb3V0X2ZyYW1lc19yZWYpCit7CisgICAgQVZCdWZmZXJSZWYgKmZyYW1lc19yZWYgPSBOVUxMOworICAgIGNvbnN0IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsICpod19jb25maWc7CisgICAgY29uc3QgQVZIV0FjY2VsICpod2E7CisgICAgaW50IGksIHJldDsKKworICAgIGZvciAoaSA9IDA7OyBpKyspIHsKKyAgICAgICAgaHdfY29uZmlnID0gYXZjdHgtPmNvZGVjLT5od19jb25maWdzW2ldOworICAgICAgICBpZiAoIWh3X2NvbmZpZykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT0VOVCk7CisgICAgICAgIGlmIChod19jb25maWctPnB1YmxpYy5waXhfZm10ID09IGh3X3BpeF9mbXQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBod2EgPSBod19jb25maWctPmh3YWNjZWw7CisgICAgaWYgKCFod2EgfHwgIWh3YS0+ZnJhbWVfcGFyYW1zKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOworCisgICAgZnJhbWVzX3JlZiA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGRldmljZV9yZWYpOworICAgIGlmICghZnJhbWVzX3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldCA9IGh3YS0+ZnJhbWVfcGFyYW1zKGF2Y3R4LCBmcmFtZXNfcmVmKTsKKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWZyYW1lc19yZWYtPmRhdGE7CisKKyAgICAgICAgaWYgKGZyYW1lc19jdHgtPmluaXRpYWxfcG9vbF9zaXplKSB7CisgICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIHRoYXQgZXh0cmEgb3V0cHV0IHN1cmZhY2VzIGJlCisgICAgICAgICAgICAvLyBhdmFpbGFibGUgdGhlbiBhZGQgdGhlbSBoZXJlLgorICAgICAgICAgICAgaWYgKGF2Y3R4LT5leHRyYV9od19mcmFtZXMgPiAwKQorICAgICAgICAgICAgICAgIGZyYW1lc19jdHgtPmluaXRpYWxfcG9vbF9zaXplICs9IGF2Y3R4LT5leHRyYV9od19mcmFtZXM7CisKKyAgICAgICAgICAgIC8vIElmIGZyYW1lIHRocmVhZGluZyBpcyBlbmFibGVkIHRoZW4gYW4gZXh0cmEgc3VyZmFjZSBwZXIgdGhyZWFkCisgICAgICAgICAgICAvLyBpcyBhbHNvIHJlcXVpcmVkLgorICAgICAgICAgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpCisgICAgICAgICAgICAgICAgZnJhbWVzX2N0eC0+aW5pdGlhbF9wb29sX3NpemUgKz0gYXZjdHgtPnRocmVhZF9jb3VudDsKKyAgICAgICAgfQorCisgICAgICAgICpvdXRfZnJhbWVzX3JlZiA9IGZyYW1lc19yZWY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZXNfcmVmKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBod2FjY2VsX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwgKmh3X2NvbmZpZykKK3sKKyAgICBjb25zdCBBVkhXQWNjZWwgKmh3YWNjZWw7CisgICAgaW50IGVycjsKKworICAgIGh3YWNjZWwgPSBod19jb25maWctPmh3YWNjZWw7CisgICAgaWYgKGh3YWNjZWwtPmNhcGFiaWxpdGllcyAmIEFWX0hXQUNDRUxfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCAmJgorICAgICAgICBhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIklnbm9yaW5nIGV4cGVyaW1lbnRhbCBod2FjY2VsOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGh3YWNjZWwtPm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKGh3YWNjZWwtPnByaXZfZGF0YV9zaXplKSB7CisgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGEgPQorICAgICAgICAgICAgYXZfbWFsbG9jeihod2FjY2VsLT5wcml2X2RhdGFfc2l6ZSk7CisgICAgICAgIGlmICghYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgYXZjdHgtPmh3YWNjZWwgPSBod2FjY2VsOworICAgIGlmIChod2FjY2VsLT5pbml0KSB7CisgICAgICAgIGVyciA9IGh3YWNjZWwtPmluaXQoYXZjdHgpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgc2V0dXAgZm9yIGZvcm1hdCAlczogIgorICAgICAgICAgICAgICAgICAgICJod2FjY2VsIGluaXRpYWxpc2F0aW9uIHJldHVybmVkIGVycm9yLlxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGh3X2NvbmZpZy0+cHVibGljLnBpeF9mbXQpKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhKTsKKyAgICAgICAgICAgIGF2Y3R4LT5od2FjY2VsID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaHdhY2NlbF91bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGlmIChhdmN0eC0+aHdhY2NlbCAmJiBhdmN0eC0+aHdhY2NlbC0+dW5pbml0KQorICAgICAgICBhdmN0eC0+aHdhY2NlbC0+dW5pbml0KGF2Y3R4KTsKKworICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhKTsKKworICAgIGF2Y3R4LT5od2FjY2VsID0gTlVMTDsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmYXZjdHgtPmh3X2ZyYW1lc19jdHgpOworfQorCitpbnQgZmZfZ2V0X2Zvcm1hdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqZm10KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKmNob2ljZXM7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHJldCwgdXNlcl9jaG9pY2U7CisgICAgY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwgKmh3X2NvbmZpZzsKKyAgICBjb25zdCBBVkNvZGVjSFdDb25maWcgKmNvbmZpZzsKKyAgICBpbnQgaSwgbiwgZXJyOworCisgICAgLy8gRmluZCBlbmQgb2YgbGlzdC4KKyAgICBmb3IgKG4gPSAwOyBmbXRbbl0gIT0gQVZfUElYX0ZNVF9OT05FOyBuKyspOworICAgIC8vIE11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZW50cnkuCisgICAgYXZfYXNzZXJ0MChuID49IDEpOworICAgIC8vIElmIGEgc29mdHdhcmUgZm9ybWF0IGlzIGF2YWlsYWJsZSwgaXQgbXVzdCBiZSB0aGUgbGFzdCBlbnRyeS4KKyAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmbXRbbiAtIDFdKTsKKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkgeworICAgICAgICAvLyBObyBzb2Z0d2FyZSBmb3JtYXQgaXMgYXZhaWxhYmxlLgorICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y3R4LT5zd19waXhfZm10ID0gZm10W24gLSAxXTsKKyAgICB9CisKKyAgICBjaG9pY2VzID0gYXZfbWFsbG9jX2FycmF5KG4gKyAxLCBzaXplb2YoKmNob2ljZXMpKTsKKyAgICBpZiAoIWNob2ljZXMpCisgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7CisKKyAgICBtZW1jcHkoY2hvaWNlcywgZm10LCAobiArIDEpICogc2l6ZW9mKCpjaG9pY2VzKSk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgcHJldmlvdXMgaHdhY2NlbCwgaWYgdGhlcmUgd2FzIG9uZS4KKyAgICAgICAgaHdhY2NlbF91bmluaXQoYXZjdHgpOworCisgICAgICAgIHVzZXJfY2hvaWNlID0gYXZjdHgtPmdldF9mb3JtYXQoYXZjdHgsIGNob2ljZXMpOworICAgICAgICBpZiAodXNlcl9jaG9pY2UgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgICAgICAvLyBFeHBsaWNpdGx5IGNob3NlIG5vdGhpbmcsIGdpdmUgdXAuCisgICAgICAgICAgICByZXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHVzZXJfY2hvaWNlKTsKKyAgICAgICAgaWYgKCFkZXNjKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZm9ybWF0IHJldHVybmVkIGJ5ICIKKyAgICAgICAgICAgICAgICAgICAiZ2V0X2Zvcm1hdCgpIGNhbGxiYWNrLlxuIik7CisgICAgICAgICAgICByZXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkZvcm1hdCAlcyBjaG9zZW4gYnkgZ2V0X2Zvcm1hdCgpLlxuIiwKKyAgICAgICAgICAgICAgIGRlc2MtPm5hbWUpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjaG9pY2VzW2ldID09IHVzZXJfY2hvaWNlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IG4pIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCByZXR1cm4gZnJvbSBnZXRfZm9ybWF0KCk6ICIKKyAgICAgICAgICAgICAgICAgICAiJXMgbm90IGluIHBvc3NpYmxlIGxpc3QuXG4iLCBkZXNjLT5uYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aHdfY29uZmlncykgeworICAgICAgICAgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgIGh3X2NvbmZpZyA9IGF2Y3R4LT5jb2RlYy0+aHdfY29uZmlnc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoIWh3X2NvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKGh3X2NvbmZpZy0+cHVibGljLnBpeF9mbXQgPT0gdXNlcl9jaG9pY2UpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaHdfY29uZmlnID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghaHdfY29uZmlnKSB7CisgICAgICAgICAgICAvLyBObyBjb25maWcgYXZhaWxhYmxlLCBzbyBubyBleHRyYSBzZXR1cCByZXF1aXJlZC4KKyAgICAgICAgICAgIHJldCA9IHVzZXJfY2hvaWNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uZmlnID0gJmh3X2NvbmZpZy0+cHVibGljOworCisgICAgICAgIGlmIChjb25maWctPm1ldGhvZHMgJgorICAgICAgICAgICAgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9IV19GUkFNRVNfQ1RYICYmCisgICAgICAgICAgICBhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICAgICAgY29uc3QgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggPQorICAgICAgICAgICAgICAgIChBVkhXRnJhbWVzQ29udGV4dCopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgICAgICAgICBpZiAoZnJhbWVzX2N0eC0+Zm9ybWF0ICE9IHVzZXJfY2hvaWNlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNldHVwIGZvciBmb3JtYXQgJXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXQgb2YgdGhlIHByb3ZpZGVkIGZyYW1lcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJjb250ZXh0LlxuIiwgZGVzYy0+bmFtZSk7CisgICAgICAgICAgICAgICAgZ290byB0cnlfYWdhaW47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLT5tZXRob2RzICYKKyAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0hXX0RFVklDRV9DVFggJiYKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+aHdfZGV2aWNlX2N0eCkgeworICAgICAgICAgICAgY29uc3QgQVZIV0RldmljZUNvbnRleHQgKmRldmljZV9jdHggPQorICAgICAgICAgICAgICAgIChBVkhXRGV2aWNlQ29udGV4dCopYXZjdHgtPmh3X2RldmljZV9jdHgtPmRhdGE7CisgICAgICAgICAgICBpZiAoZGV2aWNlX2N0eC0+dHlwZSAhPSBjb25maWctPmRldmljZV90eXBlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNldHVwIGZvciBmb3JtYXQgJXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImRvZXMgbm90IG1hdGNoIHRoZSB0eXBlIG9mIHRoZSBwcm92aWRlZCBkZXZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAiY29udGV4dC5cbiIsIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgICAgIGdvdG8gdHJ5X2FnYWluOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+bWV0aG9kcyAmCisgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9JTlRFUk5BTCkgeworICAgICAgICAgICAgLy8gSW50ZXJuYWwtb25seSBzZXR1cCwgbm8gYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLgorICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZy0+bWV0aG9kcyAmCisgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9BRF9IT0MpIHsKKyAgICAgICAgICAgIC8vIFNvbWUgYWQtaG9jIGNvbmZpZ3VyYXRpb24gd2UgY2FuJ3Qgc2VlIGFuZCBjYW4ndCBjaGVjay4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzZXR1cCBmb3IgZm9ybWF0ICVzOiAiCisgICAgICAgICAgICAgICAgICAgIm1pc3NpbmcgY29uZmlndXJhdGlvbi5cbiIsIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgZ290byB0cnlfYWdhaW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGh3X2NvbmZpZy0+aHdhY2NlbCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJGb3JtYXQgJXMgcmVxdWlyZXMgaHdhY2NlbCAiCisgICAgICAgICAgICAgICAgICAgImluaXRpYWxpc2F0aW9uLlxuIiwgZGVzYy0+bmFtZSk7CisgICAgICAgICAgICBlcnIgPSBod2FjY2VsX2luaXQoYXZjdHgsIGh3X2NvbmZpZyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIHRyeV9hZ2FpbjsKKyAgICAgICAgfQorICAgICAgICByZXQgPSB1c2VyX2Nob2ljZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICB0cnlfYWdhaW46CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRm9ybWF0ICVzIG5vdCB1c2FibGUsIHJldHJ5aW5nICIKKyAgICAgICAgICAgICAgICJnZXRfZm9ybWF0KCkgd2l0aG91dCBpdC5cbiIsIGRlc2MtPm5hbWUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY2hvaWNlc1tpXSA9PSB1c2VyX2Nob2ljZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgaSArIDEgPCBuOyBpKyspCisgICAgICAgICAgICBjaG9pY2VzW2ldID0gY2hvaWNlc1tpICsgMV07CisgICAgICAgIC0tbjsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmY2hvaWNlcyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB1cGRhdGVfZnJhbWVfcG9vbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEZyYW1lUG9vbCAqcG9vbCA9IGF2Y3R4LT5pbnRlcm5hbC0+cG9vbDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOiB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGFbNF07CisgICAgICAgIGludCBsaW5lc2l6ZVs0XTsKKyAgICAgICAgaW50IHNpemVbNF0gPSB7IDAgfTsKKyAgICAgICAgaW50IHcgPSBmcmFtZS0+d2lkdGg7CisgICAgICAgIGludCBoID0gZnJhbWUtPmhlaWdodDsKKyAgICAgICAgaW50IHRtcHNpemUsIHVuYWxpZ25lZDsKKworICAgICAgICBpZiAocG9vbC0+Zm9ybWF0ID09IGZyYW1lLT5mb3JtYXQgJiYKKyAgICAgICAgICAgIHBvb2wtPndpZHRoID09IGZyYW1lLT53aWR0aCAmJiBwb29sLT5oZWlnaHQgPT0gZnJhbWUtPmhlaWdodCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGF2Y29kZWNfYWxpZ25fZGltZW5zaW9uczIoYXZjdHgsICZ3LCAmaCwgcG9vbC0+c3RyaWRlX2FsaWduKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICAvLyBOT1RFOiBkbyBub3QgYWxpZ24gbGluZXNpemVzIGluZGl2aWR1YWxseSwgdGhpcyBicmVha3MgZS5nLiBhc3N1bXB0aW9ucworICAgICAgICAgICAgLy8gdGhhdCBsaW5lc2l6ZVswXSA9PSAyKmxpbmVzaXplWzFdIGluIHRoZSBNUEVHLWVuY29kZXIgZm9yIDQ6MjoyCisgICAgICAgICAgICByZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhsaW5lc2l6ZSwgYXZjdHgtPnBpeF9mbXQsIHcpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIC8vIGluY3JlYXNlIGFsaWdubWVudCBvZiB3IGZvciBuZXh0IHRyeSAocmhzIGdpdmVzIHRoZSBsb3dlc3QgYml0IHNldCBpbiB3KQorICAgICAgICAgICAgdyArPSB3ICYgfih3IC0gMSk7CisKKyAgICAgICAgICAgIHVuYWxpZ25lZCA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgICAgIHVuYWxpZ25lZCB8PSBsaW5lc2l6ZVtpXSAlIHBvb2wtPnN0cmlkZV9hbGlnbltpXTsKKyAgICAgICAgfSB3aGlsZSAodW5hbGlnbmVkKTsKKworICAgICAgICB0bXBzaXplID0gYXZfaW1hZ2VfZmlsbF9wb2ludGVycyhkYXRhLCBhdmN0eC0+cGl4X2ZtdCwgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbGluZXNpemUpOworICAgICAgICBpZiAodG1wc2l6ZSA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgZGF0YVtpICsgMV07IGkrKykKKyAgICAgICAgICAgIHNpemVbaV0gPSBkYXRhW2kgKyAxXSAtIGRhdGFbaV07CisgICAgICAgIHNpemVbaV0gPSB0bXBzaXplIC0gKGRhdGFbaV0gLSBkYXRhWzBdKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJnBvb2wtPnBvb2xzW2ldKTsKKyAgICAgICAgICAgIHBvb2wtPmxpbmVzaXplW2ldID0gbGluZXNpemVbaV07CisgICAgICAgICAgICBpZiAoc2l6ZVtpXSkgeworICAgICAgICAgICAgICAgIHBvb2wtPnBvb2xzW2ldID0gYXZfYnVmZmVyX3Bvb2xfaW5pdChzaXplW2ldICsgMTYgKyBTVFJJREVfQUxJR04gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfTUVNT1JZX1BPSVNPTklORyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9idWZmZXJfYWxsb2N6KTsKKyAgICAgICAgICAgICAgICBpZiAoIXBvb2wtPnBvb2xzW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwb29sLT5mb3JtYXQgPSBmcmFtZS0+Zm9ybWF0OworICAgICAgICBwb29sLT53aWR0aCAgPSBmcmFtZS0+d2lkdGg7CisgICAgICAgIHBvb2wtPmhlaWdodCA9IGZyYW1lLT5oZWlnaHQ7CisKKyAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzogeworICAgICAgICBpbnQgY2ggICAgID0gZnJhbWUtPmNoYW5uZWxzOyAvL2F2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICBpbnQgcGxhbmFyID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZnJhbWUtPmZvcm1hdCk7CisgICAgICAgIGludCBwbGFuZXMgPSBwbGFuYXIgPyBjaCA6IDE7CisKKyAgICAgICAgaWYgKHBvb2wtPmZvcm1hdCA9PSBmcmFtZS0+Zm9ybWF0ICYmIHBvb2wtPnBsYW5lcyA9PSBwbGFuZXMgJiYKKyAgICAgICAgICAgIHBvb2wtPmNoYW5uZWxzID09IGNoICYmIGZyYW1lLT5uYl9zYW1wbGVzID09IHBvb2wtPnNhbXBsZXMpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJnBvb2wtPnBvb2xzWzBdKTsKKyAgICAgICAgcmV0ID0gYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoJnBvb2wtPmxpbmVzaXplWzBdLCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMsIGZyYW1lLT5mb3JtYXQsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBwb29sLT5wb29sc1swXSA9IGF2X2J1ZmZlcl9wb29sX2luaXQocG9vbC0+bGluZXNpemVbMF0sIE5VTEwpOworICAgICAgICBpZiAoIXBvb2wtPnBvb2xzWzBdKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBwb29sLT5mb3JtYXQgICAgID0gZnJhbWUtPmZvcm1hdDsKKyAgICAgICAgcG9vbC0+cGxhbmVzICAgICA9IHBsYW5lczsKKyAgICAgICAgcG9vbC0+Y2hhbm5lbHMgICA9IGNoOworICAgICAgICBwb29sLT5zYW1wbGVzID0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZGVmYXVsdDogYXZfYXNzZXJ0MCgwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmcG9vbC0+cG9vbHNbaV0pOworICAgIHBvb2wtPmZvcm1hdCA9IC0xOworICAgIHBvb2wtPnBsYW5lcyA9IHBvb2wtPmNoYW5uZWxzID0gcG9vbC0+c2FtcGxlcyA9IDA7CisgICAgcG9vbC0+d2lkdGggID0gcG9vbC0+aGVpZ2h0ID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF1ZGlvX2dldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBGcmFtZVBvb2wgKnBvb2wgPSBhdmN0eC0+aW50ZXJuYWwtPnBvb2w7CisgICAgaW50IHBsYW5lcyA9IHBvb2wtPnBsYW5lczsKKyAgICBpbnQgaTsKKworICAgIGZyYW1lLT5saW5lc2l6ZVswXSA9IHBvb2wtPmxpbmVzaXplWzBdOworCisgICAgaWYgKHBsYW5lcyA+IEFWX05VTV9EQVRBX1BPSU5URVJTKSB7CisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhID0gYXZfbWFsbG9jel9hcnJheShwbGFuZXMsIHNpemVvZigqZnJhbWUtPmV4dGVuZGVkX2RhdGEpKTsKKyAgICAgICAgZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZiA9IHBsYW5lcyAtIEFWX05VTV9EQVRBX1BPSU5URVJTOworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfYnVmICA9IGF2X21hbGxvY3pfYXJyYXkoZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqZnJhbWUtPmV4dGVuZGVkX2J1ZikpOworICAgICAgICBpZiAoIWZyYW1lLT5leHRlbmRlZF9kYXRhIHx8ICFmcmFtZS0+ZXh0ZW5kZWRfYnVmKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmZnJhbWUtPmV4dGVuZGVkX2RhdGEpOworICAgICAgICAgICAgYXZfZnJlZXAoJmZyYW1lLT5leHRlbmRlZF9idWYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhID0gZnJhbWUtPmRhdGE7CisgICAgICAgIGF2X2Fzc2VydDAoZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZiA9PSAwKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZNSU4ocGxhbmVzLCBBVl9OVU1fREFUQV9QT0lOVEVSUyk7IGkrKykgeworICAgICAgICBmcmFtZS0+YnVmW2ldID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KHBvb2wtPnBvb2xzWzBdKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+YnVmW2ldKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXSA9IGZyYW1lLT5kYXRhW2ldID0gZnJhbWUtPmJ1ZltpXS0+ZGF0YTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9leHRlbmRlZF9idWY7IGkrKykgeworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KHBvb2wtPnBvb2xzWzBdKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpICsgQVZfTlVNX0RBVEFfUE9JTlRFUlNdID0gZnJhbWUtPmV4dGVuZGVkX2J1ZltpXS0+ZGF0YTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfQlVGRkVSUykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJkZWZhdWx0X2dldF9idWZmZXIgY2FsbGVkIG9uIGZyYW1lICVwIiwgZnJhbWUpOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitzdGF0aWMgaW50IHZpZGVvX2dldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKnMsIEFWRnJhbWUgKnBpYykKK3sKKyAgICBGcmFtZVBvb2wgKnBvb2wgPSBzLT5pbnRlcm5hbC0+cG9vbDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpYy0+Zm9ybWF0KTsKKyAgICBpbnQgaTsKKworICAgIGlmIChwaWMtPmRhdGFbMF0gfHwgcGljLT5kYXRhWzFdIHx8IHBpYy0+ZGF0YVsyXSB8fCBwaWMtPmRhdGFbM10pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInBpYy0+ZGF0YVsqXSE9TlVMTCBpbiBhdmNvZGVjX2RlZmF1bHRfZ2V0X2J1ZmZlclxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoIWRlc2MpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICJVbmFibGUgdG8gZ2V0IHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yIGZvciBmb3JtYXQgJXNcbiIsCisgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHBpYy0+Zm9ybWF0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgbWVtc2V0KHBpYy0+ZGF0YSwgMCwgc2l6ZW9mKHBpYy0+ZGF0YSkpOworICAgIHBpYy0+ZXh0ZW5kZWRfZGF0YSA9IHBpYy0+ZGF0YTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHBvb2wtPnBvb2xzW2ldOyBpKyspIHsKKyAgICAgICAgcGljLT5saW5lc2l6ZVtpXSA9IHBvb2wtPmxpbmVzaXplW2ldOworCisgICAgICAgIHBpYy0+YnVmW2ldID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KHBvb2wtPnBvb2xzW2ldKTsKKyAgICAgICAgaWYgKCFwaWMtPmJ1ZltpXSkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBwaWMtPmRhdGFbaV0gPSBwaWMtPmJ1ZltpXS0+ZGF0YTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBBVl9OVU1fREFUQV9QT0lOVEVSUzsgaSsrKSB7CisgICAgICAgIHBpYy0+ZGF0YVtpXSA9IE5VTEw7CisgICAgICAgIHBpYy0+bGluZXNpemVbaV0gPSAwOworICAgIH0KKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8CisgICAgICAgICgoZGVzYy0+ZmxhZ3MgJiBGRl9QU0VVRE9QQUwpICYmIHBpYy0+ZGF0YVsxXSkpCisgICAgICAgIGF2cHJpdl9zZXRfc3lzdGVtYXRpY19wYWwyKCh1aW50MzJfdCAqKXBpYy0+ZGF0YVsxXSwgcGljLT5mb3JtYXQpOworCisgICAgaWYgKHMtPmRlYnVnICYgRkZfREVCVUdfQlVGRkVSUykKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImRlZmF1bHRfZ2V0X2J1ZmZlciBjYWxsZWQgb24gcGljICVwXG4iLCBwaWMpOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2ZyYW1lX3VucmVmKHBpYyk7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworaW50IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICByZXQgPSBhdl9od2ZyYW1lX2dldF9idWZmZXIoYXZjdHgtPmh3X2ZyYW1lc19jdHgsIGZyYW1lLCAwKTsKKyAgICAgICAgZnJhbWUtPndpZHRoICA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgZnJhbWUtPmhlaWdodCA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSB1cGRhdGVfZnJhbWVfcG9vbChhdmN0eCwgZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIHJldHVybiB2aWRlb19nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSk7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIHJldHVybiBhdWRpb19nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc3RhdGljIGludCBhZGRfbWV0YWRhdGFfZnJvbV9zaWRlX2RhdGEoY29uc3QgQVZQYWNrZXQgKmF2cGt0LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpzaWRlX21ldGFkYXRhOworCisgICAgQVZEaWN0aW9uYXJ5ICoqZnJhbWVfbWQgPSAmZnJhbWUtPm1ldGFkYXRhOworCisgICAgc2lkZV9tZXRhZGF0YSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9TVFJJTkdTX01FVEFEQVRBLCAmc2l6ZSk7CisgICAgcmV0dXJuIGF2X3BhY2tldF91bnBhY2tfZGljdGlvbmFyeShzaWRlX21ldGFkYXRhLCBzaXplLCBmcmFtZV9tZCk7Cit9CisKK2ludCBmZl9kZWNvZGVfZnJhbWVfcHJvcHMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBjb25zdCBBVlBhY2tldCAqcGt0ID0gYXZjdHgtPmludGVybmFsLT5sYXN0X3BrdF9wcm9wczsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSBwYWNrZXQ7CisgICAgICAgIGVudW0gQVZGcmFtZVNpZGVEYXRhVHlwZSBmcmFtZTsKKyAgICB9IHNkW10gPSB7CisgICAgICAgIHsgQVZfUEtUX0RBVEFfUkVQTEFZR0FJTiAsICAgICAgICAgICAgICAgIEFWX0ZSQU1FX0RBVEFfUkVQTEFZR0FJTiB9LAorICAgICAgICB7IEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVgsICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX0RJU1BMQVlNQVRSSVggfSwKKyAgICAgICAgeyBBVl9QS1RfREFUQV9TUEhFUklDQUwsICAgICAgICAgICAgICAgICAgQVZfRlJBTUVfREFUQV9TUEhFUklDQUwgfSwKKyAgICAgICAgeyBBVl9QS1RfREFUQV9TVEVSRU8zRCwgICAgICAgICAgICAgICAgICAgQVZfRlJBTUVfREFUQV9TVEVSRU8zRCB9LAorICAgICAgICB7IEFWX1BLVF9EQVRBX0FVRElPX1NFUlZJQ0VfVFlQRSwgICAgICAgICBBVl9GUkFNRV9EQVRBX0FVRElPX1NFUlZJQ0VfVFlQRSB9LAorICAgICAgICB7IEFWX1BLVF9EQVRBX01BU1RFUklOR19ESVNQTEFZX01FVEFEQVRBLCBBVl9GUkFNRV9EQVRBX01BU1RFUklOR19ESVNQTEFZX01FVEFEQVRBIH0sCisgICAgICAgIHsgQVZfUEtUX0RBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTCwgICAgICAgIEFWX0ZSQU1FX0RBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTCB9LAorICAgICAgICB7IEFWX1BLVF9EQVRBX0E1M19DQywgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX0E1M19DQyB9LAorICAgIH07CisKKyAgICBpZiAocGt0KSB7CisgICAgICAgIGZyYW1lLT5wdHMgPSBwa3QtPnB0czsKKyNpZiBGRl9BUElfUEtUX1BUUworRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICBmcmFtZS0+cGt0X3B0cyA9IHBrdC0+cHRzOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICAgICAgZnJhbWUtPnBrdF9wb3MgICAgICA9IHBrdC0+cG9zOworICAgICAgICBmcmFtZS0+cGt0X2R1cmF0aW9uID0gcGt0LT5kdXJhdGlvbjsKKyAgICAgICAgZnJhbWUtPnBrdF9zaXplICAgICA9IHBrdC0+c2l6ZTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc2QpOyBpKyspIHsKKyAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgdWludDhfdCAqcGFja2V0X3NkID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEocGt0LCBzZFtpXS5wYWNrZXQsICZzaXplKTsKKyAgICAgICAgICAgIGlmIChwYWNrZXRfc2QpIHsKKyAgICAgICAgICAgICAgICBBVkZyYW1lU2lkZURhdGEgKmZyYW1lX3NkID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZFtpXS5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZyYW1lX3NkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICAgICAgbWVtY3B5KGZyYW1lX3NkLT5kYXRhLCBwYWNrZXRfc2QsIHNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZF9tZXRhZGF0YV9mcm9tX3NpZGVfZGF0YShwa3QsIGZyYW1lKTsKKworICAgICAgICBpZiAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0RJU0NBUkQpIHsKKyAgICAgICAgICAgIGZyYW1lLT5mbGFncyB8PSBBVl9GUkFNRV9GTEFHX0RJU0NBUkQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZS0+ZmxhZ3MgPSAoZnJhbWUtPmZsYWdzICYgfkFWX0ZSQU1FX0ZMQUdfRElTQ0FSRCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZnJhbWUtPnJlb3JkZXJlZF9vcGFxdWUgPSBhdmN0eC0+cmVvcmRlcmVkX29wYXF1ZTsKKworICAgIGlmIChmcmFtZS0+Y29sb3JfcHJpbWFyaWVzID09IEFWQ09MX1BSSV9VTlNQRUNJRklFRCkKKyAgICAgICAgZnJhbWUtPmNvbG9yX3ByaW1hcmllcyA9IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXM7CisgICAgaWYgKGZyYW1lLT5jb2xvcl90cmMgPT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKQorICAgICAgICBmcmFtZS0+Y29sb3JfdHJjID0gYXZjdHgtPmNvbG9yX3RyYzsKKyAgICBpZiAoZnJhbWUtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEKQorICAgICAgICBmcmFtZS0+Y29sb3JzcGFjZSA9IGF2Y3R4LT5jb2xvcnNwYWNlOworICAgIGlmIChmcmFtZS0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQpCisgICAgICAgIGZyYW1lLT5jb2xvcl9yYW5nZSA9IGF2Y3R4LT5jb2xvcl9yYW5nZTsKKyAgICBpZiAoZnJhbWUtPmNocm9tYV9sb2NhdGlvbiA9PSBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQpCisgICAgICAgIGZyYW1lLT5jaHJvbWFfbG9jYXRpb24gPSBhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbjsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT50eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIGZyYW1lLT5mb3JtYXQgICAgICAgICAgICAgID0gYXZjdHgtPnBpeF9mbXQ7CisgICAgICAgIGlmICghZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKQorICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgICAgICBpZiAoZnJhbWUtPndpZHRoICYmIGZyYW1lLT5oZWlnaHQgJiYKKyAgICAgICAgICAgIGF2X2ltYWdlX2NoZWNrX3NhcihmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8pIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImlnbm9yaW5nIGludmFsaWQgU0FSOiAldS8ldVxuIiwKKyAgICAgICAgICAgICAgICAgICBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpeyAwLCAxIH07CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgaWYgKCFmcmFtZS0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICBmcmFtZS0+c2FtcGxlX3JhdGUgICAgPSBhdmN0eC0+c2FtcGxlX3JhdGU7CisgICAgICAgIGlmIChmcmFtZS0+Zm9ybWF0IDwgMCkKKyAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQgICAgICAgICA9IGF2Y3R4LT5zYW1wbGVfZm10OworICAgICAgICBpZiAoIWZyYW1lLT5jaGFubmVsX2xheW91dCkgeworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVsX2xheW91dCkgeworICAgICAgICAgICAgICAgICBpZiAoYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGF2Y3R4LT5jaGFubmVsX2xheW91dCkgIT0KKyAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscykgeworICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvbnNpc3RlbnQgY2hhbm5lbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24uXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCA9IGF2Y3R4LT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IEZGX1NBTkVfTkJfQ0hBTk5FTFMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBjaGFubmVsczogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUtPmNoYW5uZWxzID0gYXZjdHgtPmNoYW5uZWxzOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZhbGlkYXRlX2F2ZnJhbWVfYWxsb2NhdGlvbihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGlmIChhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBudW1fcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoZnJhbWUtPmZvcm1hdCk7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZnJhbWUtPmZvcm1hdCk7CisgICAgICAgIGludCBmbGFncyA9IGRlc2MgPyBkZXNjLT5mbGFncyA6IDA7CisgICAgICAgIGlmIChudW1fcGxhbmVzID09IDEgJiYgKGZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCkpCisgICAgICAgICAgICBudW1fcGxhbmVzID0gMjsKKyAgICAgICAgaWYgKChmbGFncyAmIEZGX1BTRVVET1BBTCkgJiYgZnJhbWUtPmRhdGFbMV0pCisgICAgICAgICAgICBudW1fcGxhbmVzID0gMjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgYXZfYXNzZXJ0MChmcmFtZS0+ZGF0YVtpXSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gRm9yIGZvcm1hdHMgd2l0aG91dCBkYXRhIGxpa2UgaHdhY2NlbCBhbGxvdyB1bnVzZWQgcG9pbnRlcnMgdG8gYmUgbm9uLU5VTEwuCisgICAgICAgIGZvciAoaSA9IG51bV9wbGFuZXM7IG51bV9wbGFuZXMgPiAwICYmIGkgPCBGRl9BUlJBWV9FTEVNUyhmcmFtZS0+ZGF0YSk7IGkrKykgeworICAgICAgICAgICAgaWYgKGZyYW1lLT5kYXRhW2ldKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQnVmZmVyIHJldHVybmVkIGJ5IGdldF9idWZmZXIyKCkgZGlkIG5vdCB6ZXJvIHVudXNlZCBwbGFuZSBwb2ludGVyc1xuIik7CisgICAgICAgICAgICBmcmFtZS0+ZGF0YVtpXSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9kYXRhX2ZyZWUodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQoreworICAgIEZyYW1lRGVjb2RlRGF0YSAqZmRkID0gKEZyYW1lRGVjb2RlRGF0YSopZGF0YTsKKworICAgIGlmIChmZGQtPnBvc3RfcHJvY2Vzc19vcGFxdWVfZnJlZSkKKyAgICAgICAgZmRkLT5wb3N0X3Byb2Nlc3Nfb3BhcXVlX2ZyZWUoZmRkLT5wb3N0X3Byb2Nlc3Nfb3BhcXVlKTsKKworICAgIGlmIChmZGQtPmh3YWNjZWxfcHJpdl9mcmVlKQorICAgICAgICBmZGQtPmh3YWNjZWxfcHJpdl9mcmVlKGZkZC0+aHdhY2NlbF9wcml2KTsKKworICAgIGF2X2ZyZWVwKCZmZGQpOworfQorCitpbnQgZmZfYXR0YWNoX2RlY29kZV9kYXRhKEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWQnVmZmVyUmVmICpmZGRfYnVmOworICAgIEZyYW1lRGVjb2RlRGF0YSAqZmRkOworCisgICAgYXZfYXNzZXJ0MSghZnJhbWUtPnByaXZhdGVfcmVmKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5wcml2YXRlX3JlZik7CisKKyAgICBmZGQgPSBhdl9tYWxsb2N6KHNpemVvZigqZmRkKSk7CisgICAgaWYgKCFmZGQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmZGRfYnVmID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCopZmRkLCBzaXplb2YoKmZkZCksIGRlY29kZV9kYXRhX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgQVZfQlVGRkVSX0ZMQUdfUkVBRE9OTFkpOworICAgIGlmICghZmRkX2J1ZikgeworICAgICAgICBhdl9mcmVlcCgmZmRkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmcmFtZS0+cHJpdmF0ZV9yZWYgPSBmZGRfYnVmOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2J1ZmZlcl9pbnRlcm5hbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgY29uc3QgQVZIV0FjY2VsICpod2FjY2VsID0gYXZjdHgtPmh3YWNjZWw7CisgICAgaW50IG92ZXJyaWRlX2RpbWVuc2lvbnMgPSAxOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZTIoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBhdmN0eC0+bWF4X3BpeGVscywgQVZfUElYX0ZNVF9OT05FLCAwLCBhdmN0eCkpIDwgMCB8fCBhdmN0eC0+cGl4X2ZtdDwwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInZpZGVvX2dldF9idWZmZXI6IGltYWdlIHBhcmFtZXRlcnMgaW52YWxpZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lLT53aWR0aCA8PSAwIHx8IGZyYW1lLT5oZWlnaHQgPD0gMCkgeworICAgICAgICAgICAgZnJhbWUtPndpZHRoICA9IEZGTUFYKGF2Y3R4LT53aWR0aCwgIEFWX0NFSUxfUlNISUZUKGF2Y3R4LT5jb2RlZF93aWR0aCwgIGF2Y3R4LT5sb3dyZXMpKTsKKyAgICAgICAgICAgIGZyYW1lLT5oZWlnaHQgPSBGRk1BWChhdmN0eC0+aGVpZ2h0LCBBVl9DRUlMX1JTSElGVChhdmN0eC0+Y29kZWRfaGVpZ2h0LCBhdmN0eC0+bG93cmVzKSk7CisgICAgICAgICAgICBvdmVycmlkZV9kaW1lbnNpb25zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFtZS0+ZGF0YVswXSB8fCBmcmFtZS0+ZGF0YVsxXSB8fCBmcmFtZS0+ZGF0YVsyXSB8fCBmcmFtZS0+ZGF0YVszXSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaWMtPmRhdGFbKl0hPU5VTEwgaW4gZ2V0X2J1ZmZlcl9pbnRlcm5hbFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIHJldCA9IGZmX2RlY29kZV9mcmFtZV9wcm9wcyhhdmN0eCwgZnJhbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGh3YWNjZWwpIHsKKyAgICAgICAgaWYgKGh3YWNjZWwtPmFsbG9jX2ZyYW1lKSB7CisgICAgICAgICAgICByZXQgPSBod2FjY2VsLT5hbGxvY19mcmFtZShhdmN0eCwgZnJhbWUpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgYXZjdHgtPnN3X3BpeF9mbXQgPSBhdmN0eC0+cGl4X2ZtdDsKKworICAgIHJldCA9IGF2Y3R4LT5nZXRfYnVmZmVyMihhdmN0eCwgZnJhbWUsIGZsYWdzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICB2YWxpZGF0ZV9hdmZyYW1lX2FsbG9jYXRpb24oYXZjdHgsIGZyYW1lKTsKKworICAgIHJldCA9IGZmX2F0dGFjaF9kZWNvZGVfZGF0YShmcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworCitlbmQ6CisgICAgaWYgKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiAhb3ZlcnJpZGVfZGltZW5zaW9ucyAmJgorICAgICAgICAhKGF2Y3R4LT5jb2RlYy0+Y2Fwc19pbnRlcm5hbCAmIEZGX0NPREVDX0NBUF9FWFBPUlRTX0NST1BQSU5HKSkgeworICAgICAgICBmcmFtZS0+d2lkdGggID0gYXZjdHgtPndpZHRoOworICAgICAgICBmcmFtZS0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX2dldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKQoreworICAgIGludCByZXQgPSBnZXRfYnVmZmVyX2ludGVybmFsKGF2Y3R4LCBmcmFtZSwgZmxhZ3MpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZ2V0X2J1ZmZlcigpIGZhaWxlZFxuIik7CisgICAgICAgIGZyYW1lLT53aWR0aCA9IGZyYW1lLT5oZWlnaHQgPSAwOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlZ2V0X2J1ZmZlcl9pbnRlcm5hbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRnJhbWUgKnRtcDsKKyAgICBpbnQgcmV0OworCisgICAgYXZfYXNzZXJ0MChhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pOworCisgICAgaWYgKGZyYW1lLT5kYXRhWzBdICYmIChmcmFtZS0+d2lkdGggIT0gYXZjdHgtPndpZHRoIHx8IGZyYW1lLT5oZWlnaHQgIT0gYXZjdHgtPmhlaWdodCB8fCBmcmFtZS0+Zm9ybWF0ICE9IGF2Y3R4LT5waXhfZm10KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUGljdHVyZSBjaGFuZ2VkIGZyb20gc2l6ZTolZHglZCBmbXQ6JXMgdG8gc2l6ZTolZHglZCBmbXQ6JXMgaW4gcmVnZXQgYnVmZmVyKClcbiIsCisgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsIGF2X2dldF9waXhfZm10X25hbWUoZnJhbWUtPmZvcm1hdCksIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgYXZfZ2V0X3BpeF9mbXRfbmFtZShhdmN0eC0+cGl4X2ZtdCkpOworICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgfQorCisgICAgaWYgKCFmcmFtZS0+ZGF0YVswXSkKKyAgICAgICAgcmV0dXJuIGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKTsKKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShmcmFtZSkpCisgICAgICAgIHJldHVybiBmZl9kZWNvZGVfZnJhbWVfcHJvcHMoYXZjdHgsIGZyYW1lKTsKKworICAgIHRtcCA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9mcmFtZV9tb3ZlX3JlZih0bXAsIGZyYW1lKTsKKworICAgIHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGF2X2ZyYW1lX2NvcHkoZnJhbWUsIHRtcCk7CisgICAgYXZfZnJhbWVfZnJlZSgmdG1wKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcmVnZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHJldCA9IHJlZ2V0X2J1ZmZlcl9pbnRlcm5hbChhdmN0eCwgZnJhbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInJlZ2V0X2J1ZmZlcigpIGZhaWxlZFxuIik7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBhdmNvZGVjX2ZsdXNoX2J1ZmZlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2Y3R4LT5pbnRlcm5hbC0+ZHJhaW5pbmcgICAgICA9IDA7CisgICAgYXZjdHgtPmludGVybmFsLT5kcmFpbmluZ19kb25lID0gMDsKKyAgICBhdmN0eC0+aW50ZXJuYWwtPm5iX2RyYWluaW5nX2Vycm9ycyA9IDA7CisgICAgYXZfZnJhbWVfdW5yZWYoYXZjdHgtPmludGVybmFsLT5idWZmZXJfZnJhbWUpOworICAgIGF2X2ZyYW1lX3VucmVmKGF2Y3R4LT5pbnRlcm5hbC0+Y29tcGF0X2RlY29kZV9mcmFtZSk7CisgICAgYXZfcGFja2V0X3VucmVmKGF2Y3R4LT5pbnRlcm5hbC0+YnVmZmVyX3BrdCk7CisgICAgYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0X3ZhbGlkID0gMDsKKworICAgIGF2X3BhY2tldF91bnJlZihhdmN0eC0+aW50ZXJuYWwtPmRzLmluX3BrdCk7CisKKyAgICBpZiAoSEFWRV9USFJFQURTICYmIGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpCisgICAgICAgIGZmX3RocmVhZF9mbHVzaChhdmN0eCk7CisgICAgZWxzZSBpZiAoYXZjdHgtPmNvZGVjLT5mbHVzaCkKKyAgICAgICAgYXZjdHgtPmNvZGVjLT5mbHVzaChhdmN0eCk7CisKKyAgICBhdmN0eC0+cHRzX2NvcnJlY3Rpb25fbGFzdF9wdHMgPQorICAgIGF2Y3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X2R0cyA9IElOVDY0X01JTjsKKworICAgIGZmX2RlY29kZV9ic2ZzX3VuaW5pdChhdmN0eCk7CisKKyAgICBpZiAoIWF2Y3R4LT5yZWZjb3VudGVkX2ZyYW1lcykKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoYXZjdHgtPmludGVybmFsLT50b19mcmVlKTsKK30KKwordm9pZCBmZl9kZWNvZGVfYnNmc191bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERlY29kZUZpbHRlckNvbnRleHQgKnMgPSAmYXZjdHgtPmludGVybmFsLT5maWx0ZXI7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfYnNmczsgaSsrKQorICAgICAgICBhdl9ic2ZfZnJlZSgmcy0+YnNmc1tpXSk7CisgICAgYXZfZnJlZXAoJnMtPmJzZnMpOworICAgIHMtPm5iX2JzZnMgPSAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kZWNvZGUuaCBiL2xpYmF2Y29kZWMvZGVjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUyNzFjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZGVjb2RlLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIGdlbmVyaWMgZGVjb2RpbmctcmVsYXRlZCBjb2RlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19ERUNPREVfSAorI2RlZmluZSBBVkNPREVDX0RFQ09ERV9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisvKioKKyAqIFRoaXMgc3RydWN0IHN0b3JlcyBwZXItZnJhbWUgbGF2Yy1pbnRlcm5hbCBkYXRhIGFuZCBpcyBhdHRhY2hlZCB0byBpdCB2aWEKKyAqIHByaXZhdGVfcmVmLgorICovCit0eXBlZGVmIHN0cnVjdCBGcmFtZURlY29kZURhdGEgeworICAgIC8qKgorICAgICAqIFRoZSBjYWxsYmFjayB0byBwZXJmb3JtIHNvbWUgZGVsYXllZCBwcm9jZXNzaW5nIG9uIHRoZSBmcmFtZSByaWdodAorICAgICAqIGJlZm9yZSBpdCBpcyByZXR1cm5lZCB0byB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogQG5vdGUgVGhpcyBjb2RlIGlzIGNhbGxlZCBhdCBzb21lIHVuc3BlY2lmaWVkIHBvaW50IGFmdGVyIHRoZSBmcmFtZSBpcworICAgICAqIHJldHVybmVkIGZyb20gdGhlIGRlY29kZXIncyBkZWNvZGUvcmVjZWl2ZV9mcmFtZSBjYWxsLiBUaGVyZWZvcmUgaXQgY2Fubm90IHJlbHkKKyAgICAgKiBvbiBBVkNvZGVjQ29udGV4dCBiZWluZyBpbiBhbnkgc3BlY2lmaWMgc3RhdGUsIHNvIGl0IGRvZXMgbm90IGdldCB0bworICAgICAqIGFjY2VzcyBBVkNvZGVjQ29udGV4dCBkaXJlY3RseSBhdCBhbGwuIEFsbCB0aGUgc3RhdGUgaXQgbmVlZHMgbXVzdCBiZQorICAgICAqIHN0b3JlZCBpbiB0aGUgcG9zdF9wcm9jZXNzX29wYXF1ZSBvYmplY3QuCisgICAgICovCisgICAgaW50ICgqcG9zdF9wcm9jZXNzKSh2b2lkICpsb2djdHgsIEFWRnJhbWUgKmZyYW1lKTsKKyAgICB2b2lkICpwb3N0X3Byb2Nlc3Nfb3BhcXVlOworICAgIHZvaWQgKCpwb3N0X3Byb2Nlc3Nfb3BhcXVlX2ZyZWUpKHZvaWQgKm9wYXF1ZSk7CisKKyAgICAvKioKKyAgICAgKiBQZXItZnJhbWUgcHJpdmF0ZSBkYXRhIGZvciBod2FjY2Vscy4KKyAgICAgKi8KKyAgICB2b2lkICpod2FjY2VsX3ByaXY7CisgICAgdm9pZCAoKmh3YWNjZWxfcHJpdl9mcmVlKSh2b2lkICpwcml2KTsKK30gRnJhbWVEZWNvZGVEYXRhOworCisvKioKKyAqIENhbGxlZCBieSBkZWNvZGVycyB0byBnZXQgdGhlIG5leHQgcGFja2V0IGZvciBkZWNvZGluZy4KKyAqCisgKiBAcGFyYW0gcGt0IEFuIGVtcHR5IHBhY2tldCB0byBiZSBmaWxsZWQgd2l0aCBkYXRhLgorICogQHJldHVybiAwIGlmIGEgbmV3IHJlZmVyZW5jZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgd3JpdHRlbiB0byBwa3QKKyAqICAgICAgICAgQVZFUlJPUihFQUdBSU4pIGlmIG5vIGRhdGEgaXMgY3VycmVudGx5IGF2YWlsYWJsZQorICogICAgICAgICBBVkVSUk9SX0VPRiBpZiBhbmQgZW5kIG9mIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLCBzbyBubyBtb3JlIGRhdGEKKyAqICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhdmFpbGFibGUKKyAqLworaW50IGZmX2RlY29kZV9nZXRfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCk7CisKK3ZvaWQgZmZfZGVjb2RlX2JzZnNfdW5pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKy8qKgorICogTWFrZSBzdXJlIGF2Y3R4Lmh3X2ZyYW1lc19jdHggaXMgc2V0LiBJZiBpdCdzIG5vdCBzZXQsIHRoZSBmdW5jdGlvbiB3aWxsCisgKiB0cnkgdG8gYWxsb2NhdGUgaXQgZnJvbSBod19kZXZpY2VfY3R4LiBJZiB0aGF0IGlzIG5vdCBwb3NzaWJsZSwgYW4gZXJyb3IKKyAqIG1lc3NhZ2UgaXMgcHJpbnRlZCwgYW5kIGFuIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQuCisgKi8KK2ludCBmZl9kZWNvZGVfZ2V0X2h3X2ZyYW1lc19jdHgoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWSFdEZXZpY2VUeXBlIGRldl90eXBlKTsKKworaW50IGZmX2F0dGFjaF9kZWNvZGVfZGF0YShBVkZyYW1lICpmcmFtZSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0RFQ09ERV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RmYS5jIGIvbGliYXZjb2RlYy9kZmEuYwppbmRleCBmNDVkMDE5Li5jNjEwNmI5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RmYS5jCisrKyBiL2xpYmF2Y29kZWMvZGZhLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OwogCi0gICAgaWYgKCFhdmN0eC0+d2lkdGggfHwgIWF2Y3R4LT5oZWlnaHQpCisgICAgaWYgKCFhdmN0eC0+d2lkdGggfHwgIWF2Y3R4LT5oZWlnaHQgfHwgRkZNQVgoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KSA+PSAoMTw8MTYpKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIGF2X2Fzc2VydDAoYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KSA+PSAwKTsKQEAgLTY3LDcgKzY3LDggQEAKICAgICBjb25zdCB1aW50OF90ICpmcmFtZV9zdGFydCA9IGZyYW1lOwogICAgIGNvbnN0IHVpbnQ4X3QgKmZyYW1lX2VuZCAgID0gZnJhbWUgKyB3aWR0aCAqIGhlaWdodDsKICAgICBpbnQgbWFzayA9IDB4MTAwMDAsIGJpdGJ1ZiA9IDA7Ci0gICAgaW50IHYsIGNvdW50LCBzZWdtZW50czsKKyAgICBpbnQgdiwgY291bnQ7CisgICAgdW5zaWduZWQgc2VnbWVudHM7CiAgICAgdW5zaWduZWQgb2Zmc2V0OwogCiAgICAgc2VnbWVudHMgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CkBAIC0xNDgsNiArMTQ5LDggQEAKICAgICBpbnQgbWFzayA9IDB4MTAwMDAsIGJpdGJ1ZiA9IDA7CiAgICAgaW50IGksIHYsIG9mZnNldCwgY291bnQsIHNlZ21lbnRzOwogCisgICAgaWYgKCh3aWR0aCB8IGhlaWdodCkgJiAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICBzZWdtZW50cyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKTsKICAgICB3aGlsZSAoc2VnbWVudHMtLSkgewogICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpIDwgMikKQEAgLTE3NSw3ICsxNzgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgZnJhbWUgKz0gdjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmcmFtZV9lbmQgLSBmcmFtZSA8IHdpZHRoICsgMykKKyAgICAgICAgICAgIGlmICh3aWR0aCA8IDQgfHwgZnJhbWVfZW5kIC0gZnJhbWUgPCB3aWR0aCArIDQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBmcmFtZVswXSA9IGZyYW1lWzFdID0KICAgICAgICAgICAgIGZyYW1lW3dpZHRoXSA9IGZyYW1lW3dpZHRoICsgMV0gPSAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOwpAQCAtMjQ5LDcgKzI1Miw3IEBACiAgICAgICAgIHNlZ21lbnRzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTZ1KGdiKTsKICAgICAgICAgd2hpbGUgKChzZWdtZW50cyAmIDB4QzAwMCkgPT0gMHhDMDAwKSB7CiAgICAgICAgICAgICB1bnNpZ25lZCBza2lwX2xpbmVzID0gLShpbnQxNl90KXNlZ21lbnRzOwotICAgICAgICAgICAgdW5zaWduZWQgZGVsdGEgPSAtKChpbnQxNl90KXNlZ21lbnRzICogd2lkdGgpOworICAgICAgICAgICAgaW50NjRfdCBkZWx0YSA9IC0oKGludDE2X3Qpc2VnbWVudHMgKiAoaW50NjRfdCl3aWR0aCk7CiAgICAgICAgICAgICBpZiAoZnJhbWVfZW5kIC0gZnJhbWUgPD0gZGVsdGEgfHwgeSArIGxpbmVzICsgc2tpcF9saW5lcyA+IGhlaWdodCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGZyYW1lICAgICs9IGRlbHRhOwpAQCAtMzI5LDcgKzMzMiw3IEBACiAgICAgZGVjb2RlX3RkbHQsIGRlY29kZV9kc3cxLCBkZWNvZGVfYmxjaywgZGVjb2RlX2RkczEsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciogY2h1bmtfbmFtZVs4XSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgY2h1bmtfbmFtZVs4XSA9IHsKICAgICAiQ09QWSIsICJUU1cxIiwgIkJETFQiLCAiV0RMVCIsICJURExUIiwgIkRTVzEiLCAiQkxDSyIsICJERFMxIgogfTsKIApAQCAtMzUyLDYgKzM1NSw4IEBACiAKICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDApIHsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCAxMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgNCk7CiAgICAgICAgIGNodW5rX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpOwogICAgICAgICBjaHVua190eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGlyYWMuYyBiL2xpYmF2Y29kZWMvZGlyYWMuYwppbmRleCA1MjdmMDE1Li5kNTg3MGQ2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RpcmFjLmMKKysrIGIvbGliYXZjb2RlYy9kaXJhYy5jCkBAIC0xNDcsMTIgKzE0NywxMyBAQAogICAgIHVuc2lnbmVkIGx1bWFfZGVwdGggPSA4LCBsdW1hX29mZnNldCA9IDE2OwogICAgIGludCBpZHg7CiAgICAgaW50IGNocm9tYV94X3NoaWZ0LCBjaHJvbWFfeV9zaGlmdDsKKyAgICBpbnQgcmV0OwogCiAgICAgLyogW0RJUkFDX1NURF0gMTAuMy4yIEZyYW1lIHNpemUuIGZyYW1lX3NpemUodmlkZW9fcGFyYW1zKSAqLwogICAgIC8qIFtESVJBQ19TVERdIGN1c3RvbV9kaW1lbnNpb25zX2ZsYWcgKi8KICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgewotICAgICAgICBkc2gtPndpZHRoICA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7IC8qIFtESVJBQ19TVERdIEZSQU1FX1dJRFRIICAqLwotICAgICAgICBkc2gtPmhlaWdodCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7IC8qIFtESVJBQ19TVERdIEZSQU1FX0hFSUdIVCAqLworICAgICAgICBkc2gtPndpZHRoICA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOyAvKiBbRElSQUNfU1REXSBGUkFNRV9XSURUSCAgKi8KKyAgICAgICAgZHNoLT5oZWlnaHQgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsgLyogW0RJUkFDX1NURF0gRlJBTUVfSEVJR0hUICovCiAgICAgfQogCiAgICAgLyogW0RJUkFDX1NURF0gMTAuMy4zIENocm9tYSBTYW1wbGluZyBGb3JtYXQuCkBAIC0xNjAsNyArMTYxLDcgQEAKICAgICAvKiBbRElSQUNfU1REXSBjdXN0b21fY2hyb21hX2Zvcm1hdF9mbGFnICovCiAgICAgaWYgKGdldF9iaXRzMShnYikpCiAgICAgICAgIC8qIFtESVJBQ19TVERdIENIUk9NQV9GT1JNQVRfSU5ERVggKi8KLSAgICAgICAgZHNoLT5jaHJvbWFfZm9ybWF0ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgZHNoLT5jaHJvbWFfZm9ybWF0ID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CiAgICAgaWYgKGRzaC0+Y2hyb21hX2Zvcm1hdCA+IDJVKSB7CiAgICAgICAgIGlmIChsb2dfY3R4KQogICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY2hyb21hIGZvcm1hdCAlZFxuIiwKQEAgLTE3MiwyMiArMTczLDIyIEBACiAgICAgLyogW0RJUkFDX1NURF0gY3VzdG9tX3NjYW5fZm9ybWF0X2ZsYWcgKi8KICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKICAgICAgICAgLyogW0RJUkFDX1NURF0gU09VUkNFX1NBTVBMSU5HICovCi0gICAgICAgIGRzaC0+aW50ZXJsYWNlZCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgIGRzaC0+aW50ZXJsYWNlZCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgIGlmIChkc2gtPmludGVybGFjZWQgPiAxVSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAvKiBbRElSQUNfU1REXSAxMC4zLjUgRnJhbWUgUmF0ZS4gZnJhbWVfcmF0ZSh2aWRlb19wYXJhbXMpICovCiAgICAgaWYgKGdldF9iaXRzMShnYikpIHsgLyogW0RJUkFDX1NURF0gY3VzdG9tX2ZyYW1lX3JhdGVfZmxhZyAqLwotICAgICAgICBkc2gtPmZyYW1lX3JhdGVfaW5kZXggPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBkc2gtPmZyYW1lX3JhdGVfaW5kZXggPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsKIAogICAgICAgICBpZiAoZHNoLT5mcmFtZV9yYXRlX2luZGV4ID4gMTBVKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgaWYgKCFkc2gtPmZyYW1lX3JhdGVfaW5kZXgpIHsKICAgICAgICAgICAgIC8qIFtESVJBQ19TVERdIEZSQU1FX1JBVEVfTlVNRVIgKi8KLSAgICAgICAgICAgIGZyYW1lX3JhdGUubnVtID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgIGZyYW1lX3JhdGUubnVtID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CiAgICAgICAgICAgICAvKiBbRElSQUNfU1REXSBGUkFNRV9SQVRFX0RFTk9NICovCi0gICAgICAgICAgICBmcmFtZV9yYXRlLmRlbiA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICBmcmFtZV9yYXRlLmRlbiA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgICAgICB9CiAgICAgfQogICAgIC8qIFtESVJBQ19TVERdIHByZXNldF9mcmFtZV9yYXRlKHZpZGVvX3BhcmFtcywgaW5kZXgpICovCkBAIC0yMDQsMTQgKzIwNSwxNCBAQAogICAgICAqIHBpeGVsX2FzcGVjdF9yYXRpbyh2aWRlb19wYXJhbXMpICovCiAgICAgaWYgKGdldF9iaXRzMShnYikpIHsgLyogW0RJUkFDX1NURF0gY3VzdG9tX3BpeGVsX2FzcGVjdF9yYXRpb19mbGFnICovCiAgICAgICAgIC8qIFtESVJBQ19TVERdIGluZGV4ICovCi0gICAgICAgIGRzaC0+YXNwZWN0X3JhdGlvX2luZGV4ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgZHNoLT5hc3BlY3RfcmF0aW9faW5kZXggPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsKIAogICAgICAgICBpZiAoZHNoLT5hc3BlY3RfcmF0aW9faW5kZXggPiA2VSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgIGlmICghZHNoLT5hc3BlY3RfcmF0aW9faW5kZXgpIHsKLSAgICAgICAgICAgIGRzaC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOwotICAgICAgICAgICAgZHNoLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICBkc2gtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICBkc2gtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CiAgICAgICAgIH0KICAgICB9CiAgICAgLyogW0RJUkFDX1NURF0gVGFrZSB2YWx1ZSBmcm9tIFRhYmxlIDEwLjQgQXZhaWxhYmxlIHByZXNldCBwaXhlbApAQCAtMjIzLDEzICsyMjQsMTMgQEAKICAgICAvKiBbRElSQUNfU1REXSAxMC4zLjcgQ2xlYW4gYXJlYS4gY2xlYW5fYXJlYSh2aWRlb19wYXJhbXMpICovCiAgICAgaWYgKGdldF9iaXRzMShnYikpIHsgLyogW0RJUkFDX1NURF0gY3VzdG9tX2NsZWFuX2FyZWFfZmxhZyAqLwogICAgICAgICAvKiBbRElSQUNfU1REXSBDTEVBTl9XSURUSCAqLwotICAgICAgICBkc2gtPmNsZWFuX3dpZHRoID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgZHNoLT5jbGVhbl93aWR0aCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgICAgICAvKiBbRElSQUNfU1REXSBDTEVBTl9IRUlHSFQgKi8KLSAgICAgICAgZHNoLT5jbGVhbl9oZWlnaHQgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBkc2gtPmNsZWFuX2hlaWdodCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgICAgICAvKiBbRElSQUNfU1REXSBDTEVBTl9MRUZUX09GRlNFVCAqLwotICAgICAgICBkc2gtPmNsZWFuX2xlZnRfb2Zmc2V0ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgZHNoLT5jbGVhbl9sZWZ0X29mZnNldCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgICAgICAvKiBbRElSQUNfU1REXSBDTEVBTl9SSUdIVF9PRkZTRVQgKi8KLSAgICAgICAgZHNoLT5jbGVhbl9yaWdodF9vZmZzZXQgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBkc2gtPmNsZWFuX3JpZ2h0X29mZnNldCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgIH0KIAogICAgIC8qIFtESVJBQ19TVERdIDEwLjMuOCBTaWduYWwgcmFuZ2UuIHNpZ25hbF9yYW5nZSh2aWRlb19wYXJhbXMpCkBAIC0yMzcsMTcgKzIzOCwxNyBAQAogICAgICAqIEFWQ09MX1JBTkdFX01QRUcvSlBFRyB2YWx1ZXMgKi8KICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvKiBbRElSQUNfU1REXSBjdXN0b21fc2lnbmFsX3JhbmdlX2ZsYWcgKi8KICAgICAgICAgLyogW0RJUkFDX1NURF0gaW5kZXggKi8KLSAgICAgICAgZHNoLT5waXhlbF9yYW5nZV9pbmRleCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgIGRzaC0+cGl4ZWxfcmFuZ2VfaW5kZXggPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsKIAogICAgICAgICBpZiAoZHNoLT5waXhlbF9yYW5nZV9pbmRleCA+IDRVKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgLyogVGhpcyBhc3N1bWVzIGVpdGhlciBmdWxscmFuZ2Ugb3IgTVBFRyBsZXZlbHMgb25seSAqLwogICAgICAgICBpZiAoIWRzaC0+cGl4ZWxfcmFuZ2VfaW5kZXgpIHsKLSAgICAgICAgICAgIGx1bWFfb2Zmc2V0ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKLSAgICAgICAgICAgIGx1bWFfZGVwdGggID0gYXZfbG9nMihzdnEzX2dldF91ZV9nb2xvbWIoZ2IpKSArIDE7Ci0gICAgICAgICAgICBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOyAvKiBjaHJvbWEgb2Zmc2V0ICAgICovCi0gICAgICAgICAgICBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOyAvKiBjaHJvbWEgZXhjdXJzaW9uICovCisgICAgICAgICAgICBsdW1hX29mZnNldCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgbHVtYV9kZXB0aCAgPSBhdl9sb2cyKGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpKSArIDE7CisgICAgICAgICAgICBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsgLyogY2hyb21hIG9mZnNldCAgICAqLworICAgICAgICAgICAgZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7IC8qIGNocm9tYSBleGN1cnNpb24gKi8KICAgICAgICAgICAgIGRzaC0+Y29sb3JfcmFuZ2UgPSBsdW1hX29mZnNldCA/IEFWQ09MX1JBTkdFX01QRUcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWQ09MX1JBTkdFX0pQRUc7CiAgICAgICAgIH0KQEAgLTI2OSw3ICsyNzAsMTAgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBkc2gtPnBpeF9mbXQgPSBkaXJhY19waXhfZm10W2RzaC0+Y2hyb21hX2Zvcm1hdF1bZHNoLT5waXhlbF9yYW5nZV9pbmRleC0yXTsKLSAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShkc2gtPnBpeF9mbXQsICZjaHJvbWFfeF9zaGlmdCwgJmNocm9tYV95X3NoaWZ0KTsKKyAgICByZXQgPSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShkc2gtPnBpeF9mbXQsICZjaHJvbWFfeF9zaGlmdCwgJmNocm9tYV95X3NoaWZ0KTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCiAgICAgaWYgKChkc2gtPndpZHRoICUgKDE8PGNocm9tYV94X3NoaWZ0KSkgfHwgKGRzaC0+aGVpZ2h0ICUgKDE8PGNocm9tYV95X3NoaWZ0KSkpIHsKICAgICAgICAgaWYgKGxvZ19jdHgpCiAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiRGltZW5zaW9ucyBtdXN0IGJlIGFuIGludGVnZXIgbXVsdGlwbGUgb2YgdGhlIGNocm9tYSBzdWJzYW1wbGluZ1xuIik7CkBAIC0yNzksNyArMjgzLDcgQEAKICAgICAvKiBbRElSQUNfU1REXSAxMC4zLjkgQ29sb3VyIHNwZWNpZmljYXRpb24uIGNvbG91cl9zcGVjKHZpZGVvX3BhcmFtcykgKi8KICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvKiBbRElSQUNfU1REXSBjdXN0b21fY29sb3VyX3NwZWNfZmxhZyAqLwogICAgICAgICAvKiBbRElSQUNfU1REXSBpbmRleCAqLwotICAgICAgICBpZHggPSBkc2gtPmNvbG9yX3NwZWNfaW5kZXggPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBpZHggPSBkc2gtPmNvbG9yX3NwZWNfaW5kZXggPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsKIAogICAgICAgICBpZiAoZHNoLT5jb2xvcl9zcGVjX2luZGV4ID4gNFUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTI5MSwyMCArMjk1LDIwIEBACiAgICAgICAgIGlmICghZHNoLT5jb2xvcl9zcGVjX2luZGV4KSB7CiAgICAgICAgICAgICAvKiBbRElSQUNfU1REXSAxMC4zLjkuMSBDb2xvdXIgcHJpbWFyaWVzICovCiAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgewotICAgICAgICAgICAgICAgIGlkeCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgaWR4ID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CiAgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDNVKQogICAgICAgICAgICAgICAgICAgICBkc2gtPmNvbG9yX3ByaW1hcmllcyA9IGRpcmFjX3ByaW1hcmllc1tpZHhdOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogW0RJUkFDX1NURF0gMTAuMy45LjIgQ29sb3VyIG1hdHJpeCAqLwogICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKLSAgICAgICAgICAgICAgICBpZHggPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIGlkeCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgICAgICAgICAgICAgIGlmICghaWR4KQogICAgICAgICAgICAgICAgICAgICBkc2gtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaWR4ID09IDEpCiAgICAgICAgICAgICAgICAgICAgIGRzaC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogW0RJUkFDX1NURF0gMTAuMy45LjMgVHJhbnNmZXIgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpICYmICFzdnEzX2dldF91ZV9nb2xvbWIoZ2IpKQorICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikgJiYgIWdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpKQogICAgICAgICAgICAgICAgIGRzaC0+Y29sb3JfdHJjID0gQVZDT0xfVFJDX0JUNzA5OwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTMzNiwxMyArMzQwLDEzIEBACiAgICAgICAgIGdvdG8gZmFpbDsKIAogICAgIC8qIFtESVJBQ19TUEVDXSAxMC4xIFBhcnNlIFBhcmFtZXRlcnMuIHBhcnNlX3BhcmFtZXRlcnMoKSAqLwotICAgIGRzaC0+dmVyc2lvbi5tYWpvciA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOwotICAgIGRzaC0+dmVyc2lvbi5taW5vciA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOwotICAgIGRzaC0+cHJvZmlsZSAgID0gc3ZxM19nZXRfdWVfZ29sb21iKCZnYik7Ci0gICAgZHNoLT5sZXZlbCAgICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoJmdiKTsKKyAgICBkc2gtPnZlcnNpb24ubWFqb3IgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZnYik7CisgICAgZHNoLT52ZXJzaW9uLm1pbm9yID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYigmZ2IpOworICAgIGRzaC0+cHJvZmlsZSAgID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYigmZ2IpOworICAgIGRzaC0+bGV2ZWwgICAgID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYigmZ2IpOwogICAgIC8qIFtESVJBQ19TUEVDXSBzZXF1ZW5jZV9oZWFkZXIoKSAtPiBiYXNlX3ZpZGVvX2Zvcm1hdCBhcyBkZWZpbmVkIGluCiAgICAgICogMTAuMiBCYXNlIFZpZGVvIEZvcm1hdCwgdGFibGUgMTAuMSBEaXJhYyBwcmVkZWZpbmVkIHZpZGVvIGZvcm1hdHMgKi8KLSAgICB2aWRlb19mb3JtYXQgICA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOworICAgIHZpZGVvX2Zvcm1hdCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJmdiKTsKIAogICAgIGlmIChkc2gtPnZlcnNpb24ubWFqb3IgPCAyICYmIGxvZ19jdHgpCiAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfV0FSTklORywgIlN0cmVhbSBpcyBvbGQgYW5kIG1heSBub3Qgd29ya1xuIik7CkBAIC0zNzcsNyArMzgxLDcgQEAKIAogICAgIC8qIFtESVJBQ19TVERdIHBpY3R1cmVfY29kaW5nX21vZGUgc2hhbGwgYmUgMCBmb3IgZmllbGRzIGFuZCAxIGZvciBmcmFtZXMKICAgICAgKiBjdXJyZW50bHkgb25seSB1c2VkIHRvIHNpZ25hbCBmaWVsZCBjb2RpbmcgKi8KLSAgICBwaWN0dXJlX2NvZGluZ19tb2RlID0gc3ZxM19nZXRfdWVfZ29sb21iKCZnYik7CisgICAgcGljdHVyZV9jb2RpbmdfbW9kZSA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJmdiKTsKICAgICBpZiAocGljdHVyZV9jb2RpbmdfbW9kZSAhPSAwKSB7CiAgICAgICAgIGlmIChsb2dfY3R4KSB7CiAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGljdHVyZSBjb2RpbmcgbW9kZSAlZCIsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RpcmFjX2FyaXRoLmMgYi9saWJhdmNvZGVjL2RpcmFjX2FyaXRoLmMKaW5kZXggYmY5MTM5Mi4uN2ViOWJkNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kaXJhY19hcml0aC5jCisrKyBiL2xpYmF2Y29kZWMvZGlyYWNfYXJpdGguYwpAQCAtODMsNiArODMsMTYgQEAKIAogaW50MTZfdCBmZl9kaXJhY19wcm9iX2JyYW5jaGxlc3NbMjU2XVsyXTsKIAorYXZfY29sZCB2b2lkIGZmX2RpcmFjX2luaXRfYXJpdGhfdGFibGVzKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgZmZfZGlyYWNfcHJvYl9icmFuY2hsZXNzW2ldWzBdID0gIGZmX2RpcmFjX3Byb2JbMjU1LWldOworICAgICAgICBmZl9kaXJhY19wcm9iX2JyYW5jaGxlc3NbaV1bMV0gPSAtZmZfZGlyYWNfcHJvYltpXTsKKyAgICB9Cit9CisKIHZvaWQgZmZfZGlyYWNfaW5pdF9hcml0aF9kZWNvZGVyKERpcmFjQXJpdGggKmMsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgbGVuZ3RoKQogewogICAgIGludCBpOwpAQCAtMTA2LDExICsxMTYsNiBAQAogICAgIGMtPmNvdW50ZXIgPSAtMTY7CiAgICAgYy0+cmFuZ2UgICA9IDB4ZmZmZjsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICBmZl9kaXJhY19wcm9iX2JyYW5jaGxlc3NbaV1bMF0gPSAgZmZfZGlyYWNfcHJvYlsyNTUtaV07Ci0gICAgICAgIGZmX2RpcmFjX3Byb2JfYnJhbmNobGVzc1tpXVsxXSA9IC1mZl9kaXJhY19wcm9iW2ldOwotICAgIH0KLQogICAgIGZvciAoaSA9IDA7IGkgPCBESVJBQ19DVFhfQ09VTlQ7IGkrKykKICAgICAgICAgYy0+Y29udGV4dHNbaV0gPSAweDgwMDA7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RpcmFjX2FyaXRoLmggYi9saWJhdmNvZGVjL2RpcmFjX2FyaXRoLmgKaW5kZXggMDAzNDMwYS4uMjRhN2NhMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kaXJhY19hcml0aC5oCisrKyBiL2xpYmF2Y29kZWMvZGlyYWNfYXJpdGguaApAQCAtMTkwLDYgKzE5MCw3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAordm9pZCBmZl9kaXJhY19pbml0X2FyaXRoX3RhYmxlcyh2b2lkKTsKIHZvaWQgZmZfZGlyYWNfaW5pdF9hcml0aF9kZWNvZGVyKERpcmFjQXJpdGggKmMsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgbGVuZ3RoKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfRElSQUNfQVJJVEhfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kaXJhY19kd3QuaCBiL2xpYmF2Y29kZWMvZGlyYWNfZHd0LmgKaW5kZXggNGQzMzg2NS4uOTk0ZGMyMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kaXJhY19kd3QuaAorKysgYi9saWJhdmNvZGVjL2RpcmFjX2R3dC5oCkBAIC05Myw0MCArOTMsNDAgQEAKIAogLy8gc2hhcmVkIHN0dWZmIGZvciBzaW1kIG9wdGltaXphdGlvbnMKICNkZWZpbmUgQ09NUE9TRV81M2lMMChiMCwgYjEsIGIyKVwKLSAgICAoYjEgLSAoKGIwICsgYjIgKyAyKSA+PiAyKSkKKyAgICAoYjEgLSAodW5zaWduZWQpKChpbnQpKGIwICsgKHVuc2lnbmVkKShiMikgKyAyKSA+PiAyKSkKIAogI2RlZmluZSBDT01QT1NFX0RJUkFDNTNpSDAoYjAsIGIxLCBiMilcCi0gICAgKGIxICsgKChiMCArIGIyICsgMSkgPj4gMSkpCisgICAgKGIxICsgKHVuc2lnbmVkKSgoaW50KShiMCArICh1bnNpZ25lZCkoYjIpICsgMSkgPj4gMSkpCiAKICNkZWZpbmUgQ09NUE9TRV9ERDk3aUgwKGIwLCBiMSwgYjIsIGIzLCBiNClcCi0gICAgKGIyICsgKCgtYjAgKyA5KmIxICsgOSpiMyAtIGI0ICsgOCkgPj4gNCkpCisgICAgKGludCkoKCh1bnNpZ25lZCkoYjIpICsgKChpbnQpKDlVKmIxICsgOVUqYjMgLSBiNCAtIGIwICsgIDgpID4+IDQpKSkKIAogI2RlZmluZSBDT01QT1NFX0REMTM3aUwwKGIwLCBiMSwgYjIsIGIzLCBiNClcCi0gICAgKGIyIC0gKCgtYjAgKyA5KmIxICsgOSpiMyAtIGI0ICsgMTYpID4+IDUpKQorICAgIChpbnQpKCgodW5zaWduZWQpKGIyKSAtICgoaW50KSg5VSpiMSArIDlVKmIzIC0gYjQgLSBiMCArIDE2KSA+PiA1KSkpCiAKICNkZWZpbmUgQ09NUE9TRV9IQUFSaUwwKGIwLCBiMSlcCi0gICAgKGIwIC0gKChiMSArIDEpID4+IDEpKQorICAgICgoaW50KShiMCAtICh1bnNpZ25lZCkoKGludCkoYjEgKyAxVSkgPj4gMSkpKQogCiAjZGVmaW5lIENPTVBPU0VfSEFBUmlIMChiMCwgYjEpXAotICAgIChiMCArIGIxKQorICAgICgoaW50KShiMCArICh1bnNpZ25lZCkoYjEpKSkKIAogI2RlZmluZSBDT01QT1NFX0ZJREVMSVRZaUwwKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpXAotICAgIChiNCAtICgoLTgqKGIwK2I4KSArIDIxKihiMStiNykgLSA0NiooYjIrYjYpICsgMTYxKihiMytiNSkgKyAxMjgpID4+IDgpKQorICAgICgodW5zaWduZWQpYjQgLSAoKGludCkoLTgqKGIwKyh1bnNpZ25lZCliOCkgKyAyMSooYjErKHVuc2lnbmVkKWI3KSAtIDQ2KihiMisodW5zaWduZWQpYjYpICsgMTYxKihiMysodW5zaWduZWQpYjUpICsgMTI4KSA+PiA4KSkKIAogI2RlZmluZSBDT01QT1NFX0ZJREVMSVRZaUgwKGIwLCBiMSwgYjIsIGIzLCBiNCwgYjUsIGI2LCBiNywgYjgpXAotICAgIChiNCArICgoLTIqKGIwK2I4KSArIDEwKihiMStiNykgLSAyNSooYjIrYjYpICsgODEqKGIzK2I1KSArIDEyOCkgPj4gOCkpCisgICAgKCh1bnNpZ25lZCliNCArICgoaW50KSgtMiooYjArKHVuc2lnbmVkKWI4KSArIDEwKihiMSsodW5zaWduZWQpYjcpIC0gMjUqKGIyKyh1bnNpZ25lZCliNikgKyAgODEqKGIzKyh1bnNpZ25lZCliNSkgKyAxMjgpID4+IDgpKQogCiAjZGVmaW5lIENPTVBPU0VfREFVQjk3aUwxKGIwLCBiMSwgYjIpXAotICAgIChiMSAtICgoMTgxNyooYjAgKyBiMikgKyAyMDQ4KSA+PiAxMikpCisgICAgKCh1bnNpZ25lZCkoYjEpIC0gKChpbnQpKDE4MTcqKGIwICsgKHVuc2lnbmVkKWIyKSArIDIwNDgpID4+IDEyKSkKIAogI2RlZmluZSBDT01QT1NFX0RBVUI5N2lIMShiMCwgYjEsIGIyKVwKLSAgICAoYjEgLSAoKCAxMTMqKGIwICsgYjIpICsgNjQpID4+IDcpKQorICAgICgodW5zaWduZWQpKGIxKSAtICgoaW50KSggMTEzKihiMCArICh1bnNpZ25lZCliMikgKyA2NCkgPj4gNykpCiAKICNkZWZpbmUgQ09NUE9TRV9EQVVCOTdpTDAoYjAsIGIxLCBiMilcCi0gICAgKGIxICsgKCggMjE3KihiMCArIGIyKSArIDIwNDgpID4+IDEyKSkKKyAgICAoKHVuc2lnbmVkKShiMSkgKyAoKGludCkoIDIxNyooYjAgKyAodW5zaWduZWQpYjIpICsgMjA0OCkgPj4gMTIpKQogCiAjZGVmaW5lIENPTVBPU0VfREFVQjk3aUgwKGIwLCBiMSwgYjIpXAotICAgIChiMSArICgoNjQ5NyooYjAgKyBiMikgKyAyMDQ4KSA+PiAxMikpCisgICAgKCh1bnNpZ25lZCkoYjEpICsgKChpbnQpKDY0OTcqKGIwICsgKHVuc2lnbmVkKWIyKSArIDIwNDgpID4+IDEyKSkKIAogCiAjZW5kaWYgLyogQVZDT0RFQ19EV1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kaXJhY19kd3RfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvZGlyYWNfZHd0X3RlbXBsYXRlLmMKaW5kZXggOTcyYzcxMS4uNWQ1NWQ5MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kaXJhY19kd3RfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2RpcmFjX2R3dF90ZW1wbGF0ZS5jCkBAIC00OSw3ICs0OSw3IEBACiAgICAgVFlQRSAqYjEgPSAoVFlQRSAqKV9iMTsKICAgICBUWVBFICpiMiA9IChUWVBFICopX2IyOwogICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQotICAgICAgICBiMVtpXSAtPSAoYjBbaV0gKyBiMltpXSArIDIpID4+IDI7CisgICAgICAgIGIxW2ldIC09ICh1bnNpZ25lZCkoKGludCkoYjBbaV0gKyAodW5zaWduZWQpYjJbaV0gKyAyKSA+PiAyKTsKIH0KIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBSRU5BTUUoaW50ZXJsZWF2ZSkoVFlQRSAqZHN0LCBUWVBFICpzcmMwLCBUWVBFICpzcmMxLCBpbnQgdzIsCkBAIC01Nyw4ICs1Nyw4IEBACiB7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IHcyOyBpKyspIHsKLSAgICAgICAgZHN0WzIqaSAgXSA9IChzcmMwW2ldICsgYWRkKSA+PiBzaGlmdDsKLSAgICAgICAgZHN0WzIqaSsxXSA9IChzcmMxW2ldICsgYWRkKSA+PiBzaGlmdDsKKyAgICAgICAgZHN0WzIqaSAgXSA9ICgoaW50KShzcmMwW2ldICsgKHVuc2lnbmVkKWFkZCkpID4+IHNoaWZ0OworICAgICAgICBkc3RbMippKzFdID0gKChpbnQpKHNyYzFbaV0gKyAodW5zaWduZWQpYWRkKSkgPj4gc2hpZnQ7CiAgICAgfQogfQogCkBAIC05NSw4ICs5NSw4IEBACiAgICAgdG1wW3cyKzFdID0gdG1wW3cyXSA9IHRtcFt3Mi0xXTsKIAogICAgIGZvciAoeCA9IDA7IHggPCB3MjsgeCsrKSB7Ci0gICAgICAgIGJbMip4ICBdID0gKHRtcFt4XSArIDEpPj4xOwotICAgICAgICBiWzIqeCsxXSA9IChDT01QT1NFX0REOTdpSDAodG1wW3gtMV0sIHRtcFt4XSwgYlt4K3cyXSwgdG1wW3grMV0sIHRtcFt4KzJdKSArIDEpPj4xOworICAgICAgICBiWzIqeCAgXSA9ICgoaW50KSh0bXBbeF0gKyAxVSkpPj4xOworICAgICAgICBiWzIqeCsxXSA9ICgoaW50KShDT01QT1NFX0REOTdpSDAodG1wW3gtMV0sIHRtcFt4XSwgYlt4K3cyXSwgdG1wW3grMV0sIHRtcFt4KzJdKSArIDFVKSk+PjE7CiAgICAgfQogfQogCkBAIC0xMTgsOCArMTE4LDggQEAKICAgICB0bXBbdzIrMV0gPSB0bXBbdzJdID0gdG1wW3cyLTFdOwogCiAgICAgZm9yICh4ID0gMDsgeCA8IHcyOyB4KyspIHsKLSAgICAgICAgYlsyKnggIF0gPSAodG1wW3hdICsgMSk+PjE7Ci0gICAgICAgIGJbMip4KzFdID0gKENPTVBPU0VfREQ5N2lIMCh0bXBbeC0xXSwgdG1wW3hdLCBiW3grdzJdLCB0bXBbeCsxXSwgdG1wW3grMl0pICsgMSk+PjE7CisgICAgICAgIGJbMip4ICBdID0gKChpbnQpKHRtcFt4XSArIDFVKSk+PjE7CisgICAgICAgIGJbMip4KzFdID0gKChpbnQpKENPTVBPU0VfREQ5N2lIMCh0bXBbeC0xXSwgdG1wW3hdLCBiW3grdzJdLCB0bXBbeCsxXSwgdG1wW3grMl0pICsgMVUpKT4+MTsKICAgICB9CiB9CiAKQEAgLTE5MCwxNSArMTkwLDE1IEBACiAKICAgICAvLyBzZWNvbmQgc3RhZ2UgY29tYmluZWQgd2l0aCBpbnRlcmxlYXZlIGFuZCBzaGlmdAogICAgIGIwID0gYjIgPSBDT01QT1NFX0RBVUI5N2lMMCh0ZW1wW3cyXSwgdGVtcFswXSwgdGVtcFt3Ml0pOwotICAgIGJbMF0gPSAoYjAgKyAxKSA+PiAxOworICAgIGJbMF0gPSB+KCh+YjApID4+IDEpOwogICAgIGZvciAoeCA9IDE7IHggPCB3MjsgeCsrKSB7CiAgICAgICAgIGIyID0gQ09NUE9TRV9EQVVCOTdpTDAodGVtcFt4K3cyLTFdLCB0ZW1wW3ggICAgIF0sIHRlbXBbeCt3Ml0pOwogICAgICAgICBiMSA9IENPTVBPU0VfREFVQjk3aUgwKCAgICAgICAgICBiMCwgdGVtcFt4K3cyLTFdLCBiMiAgICAgICAgKTsKLSAgICAgICAgYlsyKngtMV0gPSAoYjEgKyAxKSA+PiAxOwotICAgICAgICBiWzIqeCAgXSA9IChiMiArIDEpID4+IDE7CisgICAgICAgIGJbMip4LTFdID0gfigofmIxKSA+PiAxKTsKKyAgICAgICAgYlsyKnggIF0gPSB+KCh+YjIpID4+IDEpOwogICAgICAgICBiMCA9IGIyOwogICAgIH0KLSAgICBiW3ctMV0gPSAoQ09NUE9TRV9EQVVCOTdpSDAoYjIsIHRlbXBbdy0xXSwgYjIpICsgMSkgPj4gMTsKKyAgICBiW3ctMV0gPSB+KCh+Q09NUE9TRV9EQVVCOTdpSDAoYjIsIHRlbXBbdy0xXSwgYjIpKSA+PiAxKTsKIH0KIAogc3RhdGljIHZvaWQgUkVOQU1FKHZlcnRpY2FsX2NvbXBvc2VfZGlyYWM1M2lIMCkodWludDhfdCAqX2IwLCB1aW50OF90ICpfYjEsIHVpbnQ4X3QgKl9iMiwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGlyYWNfdmxjLmMgYi9saWJhdmNvZGVjL2RpcmFjX3ZsYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NmQ4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2RpcmFjX3ZsYy5jCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IE9wZW4gQnJvYWRjYXN0IFN5c3RlbXMgTHRkLgorICogQXV0aG9yICAgICAgICAyMDE2IFJvc3Rpc2xhdiBQZWhsaXZhbm92IDxycGVobGl2YW5vdkBvYmUudHY+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJkaXJhY192bGMuaCIKKworI2RlZmluZSBMVVRfU0laRSAgICgxIDw8IExVVF9CSVRTKQorI2RlZmluZSBSU0laRV9CSVRTIChDSEFSX0JJVCpzaXplb2YocmVzaWR1YWwpKQorCisjZGVmaW5lIENPTlZFUlRfVE9fUkVTSURVRShhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKHJlc2lkdWFsKShhKSkgPDwgKFJTSVpFX0JJVFMgLSAoYikpKQorCisjZGVmaW5lIElOSVRfUkVTSURVRShOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlc2lkdWFsIE4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl91bnVzZWQgaW50MzJfdCBOICMjIF9iaXRzICA9IDAKKworI2RlZmluZSBTRVRfUkVTSURVRShOLCBJLCBCKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOICAgICAgICAgID0gQ09OVkVSVF9UT19SRVNJRFVFKEksIEIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTiAjIyBfYml0cyA9IEIKKworI2RlZmluZSBBUFBFTkRfUkVTSURVRShOLCBNKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBOICAgICAgICAgIHw9IE0gPj4gKE4gIyMgX2JpdHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTiAjIyBfYml0cyAgPSAoTiAjIyBfYml0cyArIChNICMjIF9iaXRzKSkgJiAweDNGCisKK2ludCBmZl9kaXJhY19nb2xvbWJfcmVhZF8zMmJpdChEaXJhY0dvbG9tYkxVVCAqbHV0X2N0eCwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlcywgdWludDhfdCAqX2RzdCwgaW50IGNvZWZmcykKK3sKKyAgICBpbnQgaSwgYiwgY19pZHggPSAwOworICAgIGludDMyX3QgKmRzdCA9IChpbnQzMl90ICopX2RzdDsKKyAgICBEaXJhY0dvbG9tYkxVVCAqZnV0dXJlWzRdLCAqbCA9ICZsdXRfY3R4WzIqTFVUX1NJWkUgKyBidWZbMF1dOworICAgIElOSVRfUkVTSURVRShyZXMpOworCisgICAgZm9yIChiID0gMTsgYiA8PSBieXRlczsgYisrKSB7CisgICAgICAgIGZ1dHVyZVswXSA9ICZsdXRfY3R4W2J1ZltiXV07CisgICAgICAgIGZ1dHVyZVsxXSA9IGZ1dHVyZVswXSArIDEqTFVUX1NJWkU7CisgICAgICAgIGZ1dHVyZVsyXSA9IGZ1dHVyZVswXSArIDIqTFVUX1NJWkU7CisgICAgICAgIGZ1dHVyZVszXSA9IGZ1dHVyZVswXSArIDMqTFVUX1NJWkU7CisKKyAgICAgICAgaWYgKChjX2lkeCArIDEpID4gY29lZmZzKQorICAgICAgICAgICAgcmV0dXJuIGNfaWR4OworCisgICAgICAgIC8qIHJlc19iaXRzIGlzIGEgaGludCBmb3IgYmV0dGVyIGJyYW5jaCBwcmVkaWN0aW9uICovCisgICAgICAgIGlmIChyZXNfYml0cyAmJiBsLT5zaWduKSB7CisgICAgICAgICAgICBpbnQzMl90IGNvZWZmID0gMTsKKyAgICAgICAgICAgIEFQUEVORF9SRVNJRFVFKHJlcywgbC0+cHJlYW1ibGUpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChyZXNfYml0cyA+PiAxKSAtIDE7IGkrKykgeworICAgICAgICAgICAgICAgIGNvZWZmIDw8PSAxOworICAgICAgICAgICAgICAgIGNvZWZmIHw9IChyZXMgPj4gKFJTSVpFX0JJVFMgLSAyKmkgLSAyKSkgJiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0W2NfaWR4KytdID0gbC0+c2lnbiAqIChjb2VmZiAtIDEpOworICAgICAgICAgICAgcmVzX2JpdHMgPSByZXMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCZkc3RbY19pZHhdLCBsLT5yZWFkeSwgTFVUX0JJVFMqc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgY19pZHggKz0gbC0+cmVhZHlfbnVtOworCisgICAgICAgIEFQUEVORF9SRVNJRFVFKHJlcywgbC0+bGVmdG92ZXIpOworCisgICAgICAgIGwgPSBmdXR1cmVbbC0+bmVlZF9zID8gMyA6ICFyZXNfYml0cyA/IDIgOiByZXNfYml0cyAmIDFdOworICAgIH0KKworICAgIHJldHVybiBjX2lkeDsKK30KKworaW50IGZmX2RpcmFjX2dvbG9tYl9yZWFkXzE2Yml0KERpcmFjR29sb21iTFVUICpsdXRfY3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzLCB1aW50OF90ICpfZHN0LCBpbnQgY29lZmZzKQoreworICAgIGludCBpLCBiLCBjX2lkeCA9IDA7CisgICAgaW50MTZfdCAqZHN0ID0gKGludDE2X3QgKilfZHN0OworICAgIERpcmFjR29sb21iTFVUICpmdXR1cmVbNF0sICpsID0gJmx1dF9jdHhbMipMVVRfU0laRSArIGJ1ZlswXV07CisgICAgSU5JVF9SRVNJRFVFKHJlcyk7CisKKyAgICBmb3IgKGIgPSAxOyBiIDw9IGJ5dGVzOyBiKyspIHsKKyAgICAgICAgZnV0dXJlWzBdID0gJmx1dF9jdHhbYnVmW2JdXTsKKyAgICAgICAgZnV0dXJlWzFdID0gZnV0dXJlWzBdICsgMSpMVVRfU0laRTsKKyAgICAgICAgZnV0dXJlWzJdID0gZnV0dXJlWzBdICsgMipMVVRfU0laRTsKKyAgICAgICAgZnV0dXJlWzNdID0gZnV0dXJlWzBdICsgMypMVVRfU0laRTsKKworICAgICAgICBpZiAoKGNfaWR4ICsgMSkgPiBjb2VmZnMpCisgICAgICAgICAgICByZXR1cm4gY19pZHg7CisKKyAgICAgICAgaWYgKHJlc19iaXRzICYmIGwtPnNpZ24pIHsKKyAgICAgICAgICAgIGludDMyX3QgY29lZmYgPSAxOworICAgICAgICAgICAgQVBQRU5EX1JFU0lEVUUocmVzLCBsLT5wcmVhbWJsZSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHJlc19iaXRzID4+IDEpIC0gMTsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29lZmYgPDw9IDE7CisgICAgICAgICAgICAgICAgY29lZmYgfD0gKHJlcyA+PiAoUlNJWkVfQklUUyAtIDIqaSAtIDIpKSAmIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RbY19pZHgrK10gPSBsLT5zaWduICogKGNvZWZmIC0gMSk7CisgICAgICAgICAgICByZXNfYml0cyA9IHJlcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTFVUX0JJVFM7IGkrKykKKyAgICAgICAgICAgIGRzdFtjX2lkeCArIGldID0gbC0+cmVhZHlbaV07CisgICAgICAgIGNfaWR4ICs9IGwtPnJlYWR5X251bTsKKworICAgICAgICBBUFBFTkRfUkVTSURVRShyZXMsIGwtPmxlZnRvdmVyKTsKKworICAgICAgICBsID0gZnV0dXJlW2wtPm5lZWRfcyA/IDMgOiAhcmVzX2JpdHMgPyAyIDogcmVzX2JpdHMgJiAxXTsKKyAgICB9CisKKyAgICByZXR1cm4gY19pZHg7Cit9CisKKy8qIFNlYXJjaGVzIGZvciBnb2xvbWIgY29kZXMgaW4gYSByZXNpZHVlICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2VhcmNoX2Zvcl9nb2xvbWIoRGlyYWNHb2xvbWJMVVQgKmwsIHJlc2lkdWFsIHIsIGludCBiaXRzKQoreworICAgIGludCByX2NvdW50ID0gUlNJWkVfQklUUyAtIDE7CisgICAgaW50IGJpdHNfc3RhcnQsIGJpdHNfdG90ID0gYml0cywgbmVlZF9zaWduID0gMDsKKworI2RlZmluZSBSRUFEX0JJVChOKSAoKChOKSA+PiAoTiAjIyBfY291bnQtLSkpICYgMSkKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludDMyX3QgY29lZiA9IDE7CisgICAgICAgIGJpdHNfc3RhcnQgPSAoUlNJWkVfQklUUyAtIDEpIC0gcl9jb3VudDsKKworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgaWYgKCFiaXRzLS0pCisgICAgICAgICAgICAgICAgZ290byBsZWZ0b3ZlcjsKKyAgICAgICAgICAgIGlmIChSRUFEX0JJVChyKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY29lZiA8PD0gMTsKKworICAgICAgICAgICAgaWYgKCFiaXRzLS0pCisgICAgICAgICAgICAgICAgZ290byBsZWZ0b3ZlcjsKKyAgICAgICAgICAgIGNvZWYgfD0gUkVBRF9CSVQocik7CisgICAgICAgIH0KKworICAgICAgICBsLT5yZWFkeVtsLT5yZWFkeV9udW1dID0gY29lZiAtIDE7CisgICAgICAgIGlmIChsLT5yZWFkeVtsLT5yZWFkeV9udW1dKSB7CisgICAgICAgICAgICBpZiAoIWJpdHMtLSkgeworICAgICAgICAgICAgICAgIG5lZWRfc2lnbiA9IDE7CisgICAgICAgICAgICAgICAgZ290byBsZWZ0b3ZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGwtPnJlYWR5W2wtPnJlYWR5X251bV0gKj0gUkVBRF9CSVQocikgPyAtMSA6ICsxOworICAgICAgICB9CisgICAgICAgIGwtPnJlYWR5X251bSsrOworCisgICAgICAgIGlmICghYml0cykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsZWZ0b3ZlcjoKKyAgICAgICAgbC0+bGVmdG92ZXIgICAgICA9IHIgPDwgYml0c19zdGFydDsKKyAgICAgICAgbC0+bGVmdG92ZXJfYml0cyA9IGJpdHNfdG90IC0gYml0c19zdGFydDsKKyAgICAgICAgbC0+bmVlZF9zICAgICAgICA9IG5lZWRfc2lnbjsKK30KKworLyogUGFyaXR5IExVVHMgLSBldmVuIGFuZCBvZGQgYml0IGVuZCBwb3NpdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGdlbmVyYXRlX3Bhcml0eV9sdXQoRGlyYWNHb2xvbWJMVVQgKmx1dCwgaW50IGV2ZW4pCit7CisgICAgaW50IGlkeDsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IExVVF9TSVpFOyBpZHgrKykgeworICAgICAgICBEaXJhY0dvbG9tYkxVVCAqbCA9ICZsdXRbaWR4XTsKKyAgICAgICAgaW50IHN5bWJvbF9lbmRfbG9jID0gLTE7CisgICAgICAgIHVpbnQzMl90IGNvZGU7CisgICAgICAgIGludCBpOworCisgICAgICAgIElOSVRfUkVTSURVRShyZXMpOworICAgICAgICBTRVRfUkVTSURVRShyZXMsIGlkeCwgTFVUX0JJVFMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMVVRfQklUUzsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgY29uZCA9IGV2ZW4gPyAoaSAmIDEpIDogIShpICYgMSk7CisgICAgICAgICAgICBpZiAoKChyZXMgPj4gKFJTSVpFX0JJVFMgLSBpIC0gMSkpICYgMSkgJiYgY29uZCkgeworICAgICAgICAgICAgICAgIHN5bWJvbF9lbmRfbG9jID0gaSArIDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ltYm9sX2VuZF9sb2MgPCAwIHx8IHN5bWJvbF9lbmRfbG9jID4gTFVUX0JJVFMpIHsKKyAgICAgICAgICAgIGwtPnByZWFtYmxlICAgICAgPSAwOworICAgICAgICAgICAgbC0+cHJlYW1ibGVfYml0cyA9IDA7CisgICAgICAgICAgICBsLT5sZWZ0b3Zlcl9iaXRzID0gTFVUX0JJVFM7CisgICAgICAgICAgICBsLT5sZWZ0b3ZlciAgICAgID0gQ09OVkVSVF9UT19SRVNJRFVFKGlkeCwgbC0+bGVmdG92ZXJfYml0cyk7CisgICAgICAgICAgICBpZiAoZXZlbikKKyAgICAgICAgICAgICAgICBsLT5uZWVkX3MgICAgPSBpZHggJiAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBHZXRzIGJpdHMgMCB0aHJvdWdoIHRvIChzeW1ib2xfZW5kX2xvYyAtIDEpIGluY2x1c2l2ZSAqLworICAgICAgICBjb2RlICA9IGlkeCA+PiAoKExVVF9CSVRTIC0gMSkgLSAoc3ltYm9sX2VuZF9sb2MgLSAxKSk7CisgICAgICAgIGNvZGUgJj0gKCgxIDw8IExVVF9CSVRTKSAtIDEpID4+IChMVVRfQklUUyAtIHN5bWJvbF9lbmRfbG9jKTsKKyAgICAgICAgbC0+cHJlYW1ibGVfYml0cyA9IHN5bWJvbF9lbmRfbG9jOworICAgICAgICBsLT5wcmVhbWJsZSAgICAgID0gQ09OVkVSVF9UT19SRVNJRFVFKGNvZGUsIGwtPnByZWFtYmxlX2JpdHMpOworICAgICAgICBsLT5zaWduID0gKChsLT5wcmVhbWJsZSA+PiAoUlNJWkVfQklUUyAtIGwtPnByZWFtYmxlX2JpdHMpKSAmIDEpID8gLTEgOiArMTsKKworICAgICAgICBzZWFyY2hfZm9yX2dvbG9tYihsLCByZXMgPDwgc3ltYm9sX2VuZF9sb2MsIExVVF9CSVRTIC0gc3ltYm9sX2VuZF9sb2MpOworICAgIH0KK30KKworLyogUmVzZXQgKG9mZiA9PSAwKSBhbmQgbmVlZHMtb25lLW1vcmUtYml0IChvZmYgPT0gMSkgTFVUcyAqLworc3RhdGljIHZvaWQgZ2VuZXJhdGVfb2Zmc2V0X2x1dChEaXJhY0dvbG9tYkxVVCAqbHV0LCBpbnQgb2ZmKQoreworICAgIGludCBpZHg7CisgICAgZm9yIChpZHggPSAwOyBpZHggPCBMVVRfU0laRTsgaWR4KyspIHsKKyAgICAgICAgRGlyYWNHb2xvbWJMVVQgKmwgPSAmbHV0W2lkeF07CisKKyAgICAgICAgSU5JVF9SRVNJRFVFKHJlcyk7CisgICAgICAgIFNFVF9SRVNJRFVFKHJlcywgaWR4LCBMVVRfQklUUyk7CisKKyAgICAgICAgbC0+cHJlYW1ibGVfYml0cyA9IG9mZjsKKyAgICAgICAgaWYgKG9mZikgeworICAgICAgICAgICAgbC0+cHJlYW1ibGUgID0gQ09OVkVSVF9UT19SRVNJRFVFKHJlcyA+PiAoUlNJWkVfQklUUyAtIG9mZiksIG9mZik7CisgICAgICAgICAgICBsLT5zaWduICAgICAgPSAoKGwtPnByZWFtYmxlID4+IChSU0laRV9CSVRTIC0gbC0+cHJlYW1ibGVfYml0cykpICYgMSkgPyAtMSA6ICsxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbC0+cHJlYW1ibGUgID0gMDsKKyAgICAgICAgICAgIGwtPnNpZ24gPSAxOworICAgICAgICB9CisKKyAgICAgICAgc2VhcmNoX2Zvcl9nb2xvbWIobCwgcmVzIDw8IG9mZiwgTFVUX0JJVFMgLSBvZmYpOworICAgIH0KK30KKworYXZfY29sZCBpbnQgZmZfZGlyYWNfZ29sb21iX3JlYWRlcl9pbml0KERpcmFjR29sb21iTFVUICoqbHV0X2N0eCkKK3sKKyAgICBEaXJhY0dvbG9tYkxVVCAqbHV0OworCisgICAgaWYgKCEobHV0ID0gYXZfY2FsbG9jKDQqTFVUX1NJWkUsIHNpemVvZihEaXJhY0dvbG9tYkxVVCkpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGdlbmVyYXRlX3Bhcml0eV9sdXQoJmx1dFswKkxVVF9TSVpFXSwgMCk7CisgICAgZ2VuZXJhdGVfcGFyaXR5X2x1dCgmbHV0WzEqTFVUX1NJWkVdLCAxKTsKKyAgICBnZW5lcmF0ZV9vZmZzZXRfbHV0KCZsdXRbMipMVVRfU0laRV0sIDApOworICAgIGdlbmVyYXRlX29mZnNldF9sdXQoJmx1dFszKkxVVF9TSVpFXSwgMSk7CisKKyAgICAqbHV0X2N0eCA9IGx1dDsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIHZvaWQgZmZfZGlyYWNfZ29sb21iX3JlYWRlcl9lbmQoRGlyYWNHb2xvbWJMVVQgKipsdXRfY3R4KQoreworICAgIGF2X2ZyZWVwKGx1dF9jdHgpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kaXJhY192bGMuaCBiL2xpYmF2Y29kZWMvZGlyYWNfdmxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhZTQxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZGlyYWNfdmxjLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBPcGVuIEJyb2FkY2FzdCBTeXN0ZW1zIEx0ZC4KKyAqIEF1dGhvciAgICAgICAgMjAxNiBSb3N0aXNsYXYgUGVobGl2YW5vdiA8cnBlaGxpdmFub3ZAb2JlLnR2PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRElSQUNfVkxDX0gKKyNkZWZpbmUgQVZDT0RFQ19ESVJBQ19WTENfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorCisvKiBDYW4gYmUgMzIgYml0cyB3aWRlIGZvciBzb21lIHBlcmZvcm1hbmNlIGdhaW4gb24gc29tZSBtYWNoaW5lcywgYnV0IGl0IHdpbGwKKyAqIGluY29ycmVjdGx5IGRlY29kZSB2ZXJ5IGxvbmcgY29lZmZpY2llbnRzICh1c3VhbGx5IG9ubHkgMSBvciAyIHBlciBmcmFtZSkgKi8KK3R5cGVkZWYgdWludDY0X3QgcmVzaWR1YWw7CisKKyNkZWZpbmUgTFVUX0JJVFMgOAorCisvKiBFeGFjdGx5IDY0IGJ5dGVzICovCit0eXBlZGVmIHN0cnVjdCBEaXJhY0dvbG9tYkxVVCB7CisgICAgcmVzaWR1YWwgcHJlYW1ibGUsIGxlZnRvdmVyOworICAgIGludDMyX3QgIHJlYWR5W0xVVF9CSVRTXTsKKyAgICBpbnQzMl90ICBwcmVhbWJsZV9iaXRzLCBsZWZ0b3Zlcl9iaXRzLCByZWFkeV9udW07CisgICAgaW50OF90ICAgbmVlZF9zLCBzaWduOworfSBEaXJhY0dvbG9tYkxVVDsKKworYXZfY29sZCBpbnQgZmZfZGlyYWNfZ29sb21iX3JlYWRlcl9pbml0KERpcmFjR29sb21iTFVUICoqbHV0X2N0eCk7CisKK2ludCBmZl9kaXJhY19nb2xvbWJfcmVhZF8zMmJpdChEaXJhY0dvbG9tYkxVVCAqbHV0X2N0eCwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlcywgdWludDhfdCAqZHN0LCBpbnQgY29lZmZzKTsKKworaW50IGZmX2RpcmFjX2dvbG9tYl9yZWFkXzE2Yml0KERpcmFjR29sb21iTFVUICpsdXRfY3R4LCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzLCB1aW50OF90ICpfZHN0LCBpbnQgY29lZmZzKTsKKworYXZfY29sZCB2b2lkIGZmX2RpcmFjX2dvbG9tYl9yZWFkZXJfZW5kKERpcmFjR29sb21iTFVUICoqbHV0X2N0eCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0RJUkFDX1ZMQ19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RpcmFjZGVjLmMgYi9saWJhdmNvZGVjL2RpcmFjZGVjLmMKaW5kZXggZTUzMGEwNS4uMzdjOTc2ZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kaXJhY2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvZGlyYWNkZWMuYwpAQCAtMjYsMTIgKzI2LDE1IEBACiAgKiBAYXV0aG9yIE1hcmNvIEdlcmFyZHMgPG1hcmNvQGdudS5vcmc+LCBEYXZpZCBDb25yYWQsIEpvcmRpIE9ydGl6IDxuZW5qb3JkaUBnbWFpbC5jb20+CiAgKi8KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImdvbG9tYi5oIgogI2luY2x1ZGUgImRpcmFjX2FyaXRoLmgiCisjaW5jbHVkZSAiZGlyYWNfdmxjLmgiCiAjaW5jbHVkZSAibXBlZzEyZGF0YS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAibXBlZ3ZpZGVvZW5jZHNwLmgiCkBAIC0xMjAsMTYgKzEyMywyNSBAQAogICAgIFN1YkJhbmQgYmFuZFtNQVhfRFdUX0xFVkVMU11bNF07CiB9IFBsYW5lOwogCisvKiBVc2VkIGJ5IExvdyBEZWxheSBhbmQgSGlnaCBRdWFsaXR5IHByb2ZpbGVzICovCit0eXBlZGVmIHN0cnVjdCBEaXJhY1NsaWNlIHsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBzbGljZV94OworICAgIGludCBzbGljZV95OworICAgIGludCBieXRlczsKK30gRGlyYWNTbGljZTsKKwogdHlwZWRlZiBzdHJ1Y3QgRGlyYWNDb250ZXh0IHsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CiAgICAgTXBlZ3ZpZGVvRW5jRFNQQ29udGV4dCBtcHZlbmNkc3A7CiAgICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7CiAgICAgRGlyYWNEU1BDb250ZXh0IGRpcmFjZHNwOworICAgIERpcmFjR29sb21iTFVUICpyZWFkZXJfY3R4OwogICAgIERpcmFjVmVyc2lvbkluZm8gdmVyc2lvbjsKICAgICBHZXRCaXRDb250ZXh0IGdiOwogICAgIEFWRGlyYWNTZXFIZWFkZXIgc2VxOwogICAgIGludCBzZWVuX3NlcXVlbmNlX2hlYWRlcjsKLSAgICBpbnQgZnJhbWVfbnVtYmVyOyAgICAgICAgICAgLyogbnVtYmVyIG9mIHRoZSBuZXh0IGZyYW1lIHRvIGRpc3BsYXkgICAgICAgKi8KKyAgICBpbnQ2NF90IGZyYW1lX251bWJlcjsgICAgICAgLyogbnVtYmVyIG9mIHRoZSBuZXh0IGZyYW1lIHRvIGRpc3BsYXkgICAgICAgKi8KICAgICBQbGFuZSBwbGFuZVszXTsKICAgICBpbnQgY2hyb21hX3hfc2hpZnQ7CiAgICAgaW50IGNocm9tYV95X3NoaWZ0OwpAQCAtMTYxLDYgKzE3MywxMyBAQAogICAgIHVuc2lnbmVkIG51bV94OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGhvcml6b250YWwgc2xpY2VzICAgICAgICAgICAgICAgKi8KICAgICB1bnNpZ25lZCBudW1feTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB2ZXJ0aWNhbCBzbGljZXMgICAgICAgICAgICAgICAgICovCiAKKyAgICB1aW50OF90ICp0aHJlYWRfYnVmOyAgICAgICAgIC8qIFBlci10aHJlYWQgYnVmZmVyIGZvciBjb2VmZmljaWVudCBzdG9yYWdlICovCisgICAgaW50IHRocmVhZHNfbnVtX2J1ZjsgICAgICAgICAvKiBDdXJyZW50ICMgb2YgYnVmZmVycyBhbGxvY2F0ZWQgICAgICAgICAgICAqLworICAgIGludCB0aHJlYWRfYnVmX3NpemU7ICAgICAgICAgLyogRWFjaCB0aHJlYWQgaGFzIGEgYnVmZmVyIHRoaXMgc2l6ZSAgICAgICAgKi8KKworICAgIERpcmFjU2xpY2UgKnNsaWNlX3BhcmFtc19idWY7CisgICAgaW50IHNsaWNlX3BhcmFtc19udW1fYnVmOworCiAgICAgc3RydWN0IHsKICAgICAgICAgdW5zaWduZWQgd2lkdGg7CiAgICAgICAgIHVuc2lnbmVkIGhlaWdodDsKQEAgLTE3Myw3ICsxOTIsNyBAQAogCiAgICAgc3RydWN0IHsKICAgICAgICAgdW5zaWduZWQgcHJlZml4X2J5dGVzOwotICAgICAgICB1bnNpZ25lZCBzaXplX3NjYWxlcjsKKyAgICAgICAgdWludDY0X3Qgc2l6ZV9zY2FsZXI7CiAgICAgfSBoaWdocXVhbGl0eTsKIAogICAgIHN0cnVjdCB7CkBAIC0yMzEsNyArMjUwLDcgQEAKIC8qIG1hZ2ljIG51bWJlciBkaXZpc2lvbiBieSAzIGZyb20gc2Nocm9lZGluZ2VyICovCiBzdGF0aWMgaW5saW5lIGludCBkaXZpZGUzKGludCB4KQogewotICAgIHJldHVybiAoKHgrMSkqMjE4NDUgKyAxMDkyMikgPj4gMTY7CisgICAgcmV0dXJuIChpbnQpKCh4KzFVKSoyMTg0NSArIDEwOTIyKSA+PiAxNjsKIH0KIAogc3RhdGljIERpcmFjRnJhbWUgKnJlbW92ZV9mcmFtZShEaXJhY0ZyYW1lICpmcmFtZWxpc3RbXSwgaW50IHBpY251bSkKQEAgLTM2MiwxNCArMzgxLDIxIEBACiAgICAgYXZfZnJlZXAoJnMtPm1jc2NyYXRjaCk7CiB9CiAKK3N0YXRpYyBBVk9uY2UgZGlyYWNfYXJpdGhfaW5pdCA9IEFWX09OQ0VfSU5JVDsKKwogc3RhdGljIGF2X2NvbGQgaW50IGRpcmFjX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBEaXJhY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGludCBpOworICAgIGludCBpLCByZXQ7CiAKICAgICBzLT5hdmN0eCA9IGF2Y3R4OwogICAgIHMtPmZyYW1lX251bWJlciA9IC0xOwogCisgICAgcy0+dGhyZWFkX2J1ZiA9IE5VTEw7CisgICAgcy0+dGhyZWFkc19udW1fYnVmID0gLTE7CisgICAgcy0+dGhyZWFkX2J1Zl9zaXplID0gLTE7CisKKyAgICBmZl9kaXJhY19nb2xvbWJfcmVhZGVyX2luaXQoJnMtPnJlYWRlcl9jdHgpOwogICAgIGZmX2RpcmFjZHNwX2luaXQoJnMtPmRpcmFjZHNwKTsKICAgICBmZl9tcGVndmlkZW9lbmNkc3BfaW5pdCgmcy0+bXB2ZW5jZHNwLCBhdmN0eCk7CiAgICAgZmZfdmlkZW9kc3BfaW5pdCgmcy0+dmRzcCwgOCk7CkBAIC0zODIsNiArNDA4LDkgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0KICAgICB9CisgICAgcmV0ID0gZmZfdGhyZWFkX29uY2UoJmRpcmFjX2FyaXRoX2luaXQsIGZmX2RpcmFjX2luaXRfYXJpdGhfdGFibGVzKTsKKyAgICBpZiAocmV0ICE9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTM5OSw3MCArNDI4LDM1IEBACiAgICAgRGlyYWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBpbnQgaTsKIAorICAgIGZmX2RpcmFjX2dvbG9tYl9yZWFkZXJfZW5kKCZzLT5yZWFkZXJfY3R4KTsKKwogICAgIGRpcmFjX2RlY29kZV9mbHVzaChhdmN0eCk7CiAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9GUkFNRVM7IGkrKykKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+YWxsX2ZyYW1lc1tpXS5hdmZyYW1lKTsKIAorICAgIGF2X2ZyZWVwKCZzLT50aHJlYWRfYnVmKTsKKyAgICBhdl9mcmVlcCgmcy0+c2xpY2VfcGFyYW1zX2J1Zik7CisKICAgICByZXR1cm4gMDsKIH0KIAotI2RlZmluZSBTSUdOX0NUWCh4KSAoQ1RYX1NJR05fWkVSTyArICgoeCkgPiAwKSAtICgoeCkgPCAwKSkKLQogc3RhdGljIGlubGluZSBpbnQgY29lZmZfdW5wYWNrX2dvbG9tYihHZXRCaXRDb250ZXh0ICpnYiwgaW50IHFmYWN0b3IsIGludCBxb2Zmc2V0KQogewotICAgIGludCBzaWduLCBjb2VmZjsKLSAgICB1aW50MzJfdCBidWY7Ci0KLSAgICBPUEVOX1JFQURFUihyZSwgZ2IpOwotICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOwotICAgIGJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOwotCi0gICAgaWYgKGJ1ZiAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsZ2IsMSk7Ci0gICAgICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoYnVmICYgMHhBQTgwMDAwMCkgewotICAgICAgICBidWYgPj49IDMyIC0gODsKLSAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgZmZfaW50ZXJsZWF2ZWRfZ29sb21iX3ZsY19sZW5bYnVmXSk7Ci0KLSAgICAgICAgY29lZmYgPSBmZl9pbnRlcmxlYXZlZF91ZV9nb2xvbWJfdmxjX2NvZGVbYnVmXTsKLSAgICB9IGVsc2UgewotICAgICAgICB1bnNpZ25lZCByZXQgPSAxOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGJ1ZiA+Pj0gMzIgLSA4OwotICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGZmX2ludGVybGVhdmVkX2dvbG9tYl92bGNfbGVuW2J1Zl0sIDgpKTsKLQotICAgICAgICAgICAgaWYgKGZmX2ludGVybGVhdmVkX2dvbG9tYl92bGNfbGVuW2J1Zl0gIT0gOSkgewotICAgICAgICAgICAgICAgIHJldCA8PD0gKGZmX2ludGVybGVhdmVkX2dvbG9tYl92bGNfbGVuW2J1Zl0gLSAxKSA+PiAxOwotICAgICAgICAgICAgICAgIHJldCAgfD0gZmZfaW50ZXJsZWF2ZWRfZGlyYWNfZ29sb21iX3ZsY19jb2RlW2J1Zl07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXQgPSAocmV0IDw8IDQpIHwgZmZfaW50ZXJsZWF2ZWRfZGlyYWNfZ29sb21iX3ZsY19jb2RlW2J1Zl07Ci0gICAgICAgICAgICBVUERBVEVfQ0FDSEUocmUsIGdiKTsKLSAgICAgICAgICAgIGJ1ZiA9IEdFVF9DQUNIRShyZSwgZ2IpOwotICAgICAgICB9IHdoaWxlIChyZXQ8MHg4MDAwMDAwVSAmJiBCSVRTX0FWQUlMQUJMRShyZSwgZ2IpKTsKLQotICAgICAgICBjb2VmZiA9IHJldCAtIDE7Ci0gICAgfQotCi0gICAgY29lZmYgPSAoY29lZmYgKiBxZmFjdG9yICsgcW9mZnNldCkgPj4gMjsKLSAgICBzaWduICA9IFNIT1dfU0JJVFMocmUsIGdiLCAxKTsKLSAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDEpOwotICAgIGNvZWZmID0gKGNvZWZmIF4gc2lnbikgLSBzaWduOwotCi0gICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CisgICAgaW50IGNvZWZmID0gZGlyYWNfZ2V0X3NlX2dvbG9tYihnYik7CisgICAgY29uc3QgdW5zaWduZWQgc2lnbiA9IEZGU0lHTihjb2VmZik7CisgICAgaWYgKGNvZWZmKQorICAgICAgICBjb2VmZiA9IHNpZ24qKChzaWduICogY29lZmYgKiBxZmFjdG9yICsgcW9mZnNldCkgPj4gMik7CiAgICAgcmV0dXJuIGNvZWZmOwogfQogCisjZGVmaW5lIFNJR05fQ1RYKHgpIChDVFhfU0lHTl9aRVJPICsgKCh4KSA+IDApIC0gKCh4KSA8IDApKQorCiAjZGVmaW5lIFVOUEFDS19BUklUSChuLCB0eXBlKSBcCiAgICAgc3RhdGljIGlubGluZSB2b2lkIGNvZWZmX3VucGFja19hcml0aF8jI24oRGlyYWNBcml0aCAqYywgaW50IHFmYWN0b3IsIGludCBxb2Zmc2V0LCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViQmFuZCAqYiwgdHlwZSAqYnVmLCBpbnQgeCwgaW50IHkpIFwKICAgICB7IFwKLSAgICAgICAgaW50IGNvZWZmLCBzaWduLCBzaWduX3ByZWQgPSAwLCBwcmVkX2N0eCA9IENUWF9aUFpOX0YxOyBcCisgICAgICAgIGludCBzaWduLCBzaWduX3ByZWQgPSAwLCBwcmVkX2N0eCA9IENUWF9aUFpOX0YxOyBcCisgICAgICAgIHVuc2lnbmVkIGNvZWZmOyBcCiAgICAgICAgIGNvbnN0IGludCBtc3RyaWRlID0gLShiLT5zdHJpZGUgPj4gKDErYi0+cHNoaWZ0KSk7IFwKICAgICAgICAgaWYgKGItPnBhcmVudCkgeyBcCiAgICAgICAgICAgICBjb25zdCB0eXBlICpwYnVmID0gKHR5cGUgKiliLT5wYXJlbnQtPmlidWY7IFwKQEAgLTUxNSwxOSArNTA5LDE5IEBACiAgICAgfQogCiAgICAgaWYgKHMtPmNvZGVibG9ja19tb2RlICYmICEocy0+b2xkX2RlbHRhX3F1YW50ICYmIGJsb2NrY250X29uZSkpIHsKLSAgICAgICAgaW50IHF1YW50ID0gYi0+cXVhbnQ7CisgICAgICAgIGludCBxdWFudDsKICAgICAgICAgaWYgKGlzX2FyaXRoKQotICAgICAgICAgICAgcXVhbnQgKz0gZGlyYWNfZ2V0X2FyaXRoX2ludChjLCBDVFhfREVMVEFfUV9GLCBDVFhfREVMVEFfUV9EQVRBKTsKKyAgICAgICAgICAgIHF1YW50ID0gZGlyYWNfZ2V0X2FyaXRoX2ludChjLCBDVFhfREVMVEFfUV9GLCBDVFhfREVMVEFfUV9EQVRBKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgcXVhbnQgKz0gZGlyYWNfZ2V0X3NlX2dvbG9tYihnYik7Ci0gICAgICAgIGlmIChxdWFudCA8IDApIHsKKyAgICAgICAgICAgIHF1YW50ID0gZGlyYWNfZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgIGlmIChxdWFudCA+IElOVF9NQVggLSBiLT5xdWFudCB8fCBiLT5xdWFudCArIHF1YW50IDwgMCkgewogICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHF1YW50XG4iKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBiLT5xdWFudCA9IHF1YW50OworICAgICAgICBiLT5xdWFudCArPSBxdWFudDsKICAgICB9CiAKLSAgICBpZiAoYi0+cXVhbnQgPiAxMTUpIHsKKyAgICBpZiAoYi0+cXVhbnQgPiAoRElSQUNfTUFYX1FVQU5UX0lOREVYIC0gMSkpIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBxdWFudCAlZFxuIiwgYi0+cXVhbnQpOwogICAgICAgICBiLT5xdWFudCA9IDA7CiAgICAgICAgIHJldHVybjsKQEAgLTU5Myw3ICs1ODcsNyBAQAogICAgIH0gXAogCiBJTlRSQV9EQ19QUkVEKDgsIGludDE2X3QpCi1JTlRSQV9EQ19QUkVEKDEwLCBpbnQzMl90KQorSU5UUkFfRENfUFJFRCgxMCwgdWludDMyX3QpCiAKIC8qKgogICogRGlyYWMgU3BlY2lmaWNhdGlvbiAtPgpAQCAtNjcxLDkgKzY2NSwxMyBAQAogCiAgICAgICAgICAgICBhbGlnbl9nZXRfYml0cygmcy0+Z2IpOwogICAgICAgICAgICAgLyogW0RJUkFDX1NURF0gMTMuNC4yIHN1YmJhbmQoKSAqLwotICAgICAgICAgICAgYi0+bGVuZ3RoID0gc3ZxM19nZXRfdWVfZ29sb21iKCZzLT5nYik7CisgICAgICAgICAgICBiLT5sZW5ndGggPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZzLT5nYik7CiAgICAgICAgICAgICBpZiAoYi0+bGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgYi0+cXVhbnQgPSBzdnEzX2dldF91ZV9nb2xvbWIoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBiLT5xdWFudCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoYi0+cXVhbnQgPiAoRElSQUNfTUFYX1FVQU5UX0lOREVYIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBxdWFudCAlZFxuIiwgYi0+cXVhbnQpOworICAgICAgICAgICAgICAgICAgICBiLT5xdWFudCA9IDA7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CiAgICAgICAgICAgICAgICAgYi0+Y29lZmZfZGF0YSA9IHMtPmdiLmJ1ZmZlciArIGdldF9iaXRzX2NvdW50KCZzLT5nYikvODsKICAgICAgICAgICAgICAgICBiLT5sZW5ndGggPSBGRk1JTihiLT5sZW5ndGgsIEZGTUFYKGdldF9iaXRzX2xlZnQoJnMtPmdiKS84LCAwKSk7CkBAIC03MTcsMTIgKzcxNSwxMiBAQAogICAgIHVpbnQ4X3QgKmJ1ZjIgPSBiMiA/IGIyLT5pYnVmICsgdG9wICogYjItPnN0cmlkZTogTlVMTDsKICAgICBpbnQgeCwgeTsKIAotICAgIGlmIChxdWFudCA+IDExNSkgeworICAgIGlmIChxdWFudCA+IChESVJBQ19NQVhfUVVBTlRfSU5ERVggLSAxKSkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHF1YW50ICVkXG4iLCBxdWFudCk7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgcWZhY3RvciA9IGZmX2RpcmFjX3FzY2FsZV90YWJbcXVhbnQgJiAweDdmXTsKLSAgICBxb2Zmc2V0ID0gZmZfZGlyYWNfcW9mZnNldF9pbnRyYV90YWJbcXVhbnQgJiAweDdmXSArIDI7CisgICAgcWZhY3RvciA9IGZmX2RpcmFjX3FzY2FsZV90YWJbcXVhbnRdOworICAgIHFvZmZzZXQgPSBmZl9kaXJhY19xb2Zmc2V0X2ludHJhX3RhYltxdWFudF0gKyAyOwogICAgIC8qIHdlIGhhdmUgdG8gY29uc3RhbnRseSBjaGVjayBmb3Igb3ZlcnJlYWQgc2luY2UgdGhlIHNwZWMgZXhwbGljaXRseQogICAgICAgIHJlcXVpcmVzIHRoaXMsIHdpdGggdGhlIG1lYW5pbmcgdGhhdCBhbGwgcmVtYWluaW5nIGNvZWZmcyBhcmUgc2V0IHRvIDAgKi8KICAgICBpZiAoZ2V0X2JpdHNfY291bnQoZ2IpID49IGJpdHNfZW5kKQpAQCAtNzUwLDE1ICs3NDgsNiBAQAogICAgIH0KIH0KIAotLyogVXNlZCBieSBMb3cgRGVsYXkgYW5kIEhpZ2ggUXVhbGl0eSBwcm9maWxlcyAqLwotdHlwZWRlZiBzdHJ1Y3QgRGlyYWNTbGljZSB7Ci0gICAgR2V0Qml0Q29udGV4dCBnYjsKLSAgICBpbnQgc2xpY2VfeDsKLSAgICBpbnQgc2xpY2VfeTsKLSAgICBpbnQgYnl0ZXM7Ci19IERpcmFjU2xpY2U7Ci0KLQogLyoqCiAgKiBEaXJhYyBTcGVjaWZpY2F0aW9uIC0+CiAgKiAxMy41LjIgU2xpY2VzLiBzbGljZShzeCxzeSkKQEAgLTgwMSw0NiArNzkwLDEyMCBAQAogICAgIHJldHVybiAwOwogfQogCit0eXBlZGVmIHN0cnVjdCBTbGljZUNvZWZmcyB7CisgICAgaW50IGxlZnQ7CisgICAgaW50IHRvcDsKKyAgICBpbnQgdG90X2g7CisgICAgaW50IHRvdF92OworICAgIGludCB0b3Q7Cit9IFNsaWNlQ29lZmZzOworCitzdGF0aWMgaW50IHN1YmJhbmRfY29lZmZzKERpcmFjQ29udGV4dCAqcywgaW50IHgsIGludCB5LCBpbnQgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2xpY2VDb2VmZnMgY1tNQVhfRFdUX0xFVkVMU10pCit7CisgICAgaW50IGxldmVsLCBjb2VmID0gMDsKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBzLT53YXZlbGV0X2RlcHRoOyBsZXZlbCsrKSB7CisgICAgICAgIFNsaWNlQ29lZmZzICpvID0gJmNbbGV2ZWxdOworICAgICAgICBTdWJCYW5kICpiID0gJnMtPnBsYW5lW3BdLmJhbmRbbGV2ZWxdWzNdOyAvKiBvcmllbnRhdGlvbiBkb2Vucyd0IG1hdHRlciAqLworICAgICAgICBvLT50b3AgICA9IGItPmhlaWdodCAqIHkgLyBzLT5udW1feTsKKyAgICAgICAgby0+bGVmdCAgPSBiLT53aWR0aCAgKiB4IC8gcy0+bnVtX3g7CisgICAgICAgIG8tPnRvdF9oID0gKChiLT53aWR0aCAgKiAoeCArIDEpKSAvIHMtPm51bV94KSAtIG8tPmxlZnQ7CisgICAgICAgIG8tPnRvdF92ID0gKChiLT5oZWlnaHQgKiAoeSArIDEpKSAvIHMtPm51bV95KSAtIG8tPnRvcDsKKyAgICAgICAgby0+dG90ICAgPSBvLT50b3RfaCpvLT50b3RfdjsKKyAgICAgICAgY29lZiAgICArPSBvLT50b3QgKiAoNCAtICEhbGV2ZWwpOworICAgIH0KKyAgICByZXR1cm4gY29lZjsKK30KKwogLyoqCiAgKiBWQy0yIFNwZWNpZmljYXRpb24gLT4KICAqIDEzLjUuMyBocV9zbGljZShzeCxzeSkKICAqLwotc3RhdGljIGludCBkZWNvZGVfaHFfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICphcmcpCitzdGF0aWMgaW50IGRlY29kZV9ocV9zbGljZShEaXJhY0NvbnRleHQgKnMsIERpcmFjU2xpY2UgKnNsaWNlLCB1aW50OF90ICp0bXBfYnVmKQogewotICAgIGludCBpLCBxdWFudCwgbGV2ZWwsIG9yaWVudGF0aW9uLCBxdWFudF9pZHg7Ci0gICAgdWludDhfdCBxdWFudHNbTUFYX0RXVF9MRVZFTFNdWzRdOwotICAgIERpcmFjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgRGlyYWNTbGljZSAqc2xpY2UgPSBhcmc7CisgICAgaW50IGksIGxldmVsLCBvcmllbnRhdGlvbiwgcXVhbnRfaWR4OworICAgIGludCBxZmFjdG9yW01BWF9EV1RfTEVWRUxTXVs0XSwgcW9mZnNldFtNQVhfRFdUX0xFVkVMU11bNF07CiAgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmc2xpY2UtPmdiOworICAgIFNsaWNlQ29lZmZzIGNvZWZmc19udW1bTUFYX0RXVF9MRVZFTFNdOwogCiAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIDgqcy0+aGlnaHF1YWxpdHkucHJlZml4X2J5dGVzKTsKICAgICBxdWFudF9pZHggPSBnZXRfYml0cyhnYiwgOCk7CiAKKyAgICBpZiAocXVhbnRfaWR4ID4gRElSQUNfTUFYX1FVQU5UX0lOREVYIC0gMSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcXVhbnRpemF0aW9uIGluZGV4IC0gJWlcbiIsIHF1YW50X2lkeCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIC8qIFNsaWNlIHF1YW50aXphdGlvbiAoc2xpY2VfcXVhbnRpemVycygpIGluIHRoZSBzcGVjcykgKi8KICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBzLT53YXZlbGV0X2RlcHRoOyBsZXZlbCsrKSB7CiAgICAgICAgIGZvciAob3JpZW50YXRpb24gPSAhIWxldmVsOyBvcmllbnRhdGlvbiA8IDQ7IG9yaWVudGF0aW9uKyspIHsKLSAgICAgICAgICAgIHF1YW50ID0gRkZNQVgocXVhbnRfaWR4IC0gcy0+bG93ZGVsYXkucXVhbnRbbGV2ZWxdW29yaWVudGF0aW9uXSwgMCk7Ci0gICAgICAgICAgICBxdWFudHNbbGV2ZWxdW29yaWVudGF0aW9uXSA9IHF1YW50OworICAgICAgICAgICAgY29uc3QgaW50IHF1YW50ID0gRkZNQVgocXVhbnRfaWR4IC0gcy0+bG93ZGVsYXkucXVhbnRbbGV2ZWxdW29yaWVudGF0aW9uXSwgMCk7CisgICAgICAgICAgICBxZmFjdG9yW2xldmVsXVtvcmllbnRhdGlvbl0gPSBmZl9kaXJhY19xc2NhbGVfdGFiW3F1YW50XTsKKyAgICAgICAgICAgIHFvZmZzZXRbbGV2ZWxdW29yaWVudGF0aW9uXSA9IGZmX2RpcmFjX3FvZmZzZXRfaW50cmFfdGFiW3F1YW50XSArIDI7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBMdW1hICsgMiBDaHJvbWEgcGxhbmVzICovCiAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICBpbnQgbGVuZ3RoID0gcy0+aGlnaHF1YWxpdHkuc2l6ZV9zY2FsZXIgKiBnZXRfYml0cyhnYiwgOCk7Ci0gICAgICAgIGludCBiaXRzX2xlZnQgPSA4ICogbGVuZ3RoOwotICAgICAgICBpbnQgYml0c19lbmQgPSBnZXRfYml0c19jb3VudChnYikgKyBiaXRzX2xlZnQ7CisgICAgICAgIGludCBjb2VmX251bSwgY29lZl9wYXIsIG9mZiA9IDA7CisgICAgICAgIGludDY0X3QgbGVuZ3RoID0gcy0+aGlnaHF1YWxpdHkuc2l6ZV9zY2FsZXIqZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBpbnQ2NF90IGJpdHNfZW5kID0gZ2V0X2JpdHNfY291bnQoZ2IpICsgOCpsZW5ndGg7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkZHIgPSBhbGlnbl9nZXRfYml0cyhnYik7CisKKyAgICAgICAgaWYgKGxlbmd0aCo4ID4gZ2V0X2JpdHNfbGVmdChnYikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5kIHRvbyBmYXIgYXdheVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGNvZWZfbnVtID0gc3ViYmFuZF9jb2VmZnMocywgc2xpY2UtPnNsaWNlX3gsIHNsaWNlLT5zbGljZV95LCBpLCBjb2VmZnNfbnVtKTsKKworICAgICAgICBpZiAocy0+cHNoaWZ0KQorICAgICAgICAgICAgY29lZl9wYXIgPSBmZl9kaXJhY19nb2xvbWJfcmVhZF8zMmJpdChzLT5yZWFkZXJfY3R4LCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHRtcF9idWYsIGNvZWZfbnVtKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29lZl9wYXIgPSBmZl9kaXJhY19nb2xvbWJfcmVhZF8xNmJpdChzLT5yZWFkZXJfY3R4LCBhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHRtcF9idWYsIGNvZWZfbnVtKTsKKworICAgICAgICBpZiAoY29lZl9udW0gPiBjb2VmX3BhcikgeworICAgICAgICAgICAgY29uc3QgaW50IHN0YXJ0X2IgPSBjb2VmX3BhciAqICgxIDw8IChzLT5wc2hpZnQgKyAxKSk7CisgICAgICAgICAgICBjb25zdCBpbnQgZW5kX2IgICA9IGNvZWZfbnVtICogKDEgPDwgKHMtPnBzaGlmdCArIDEpKTsKKyAgICAgICAgICAgIG1lbXNldCgmdG1wX2J1ZltzdGFydF9iXSwgMCwgZW5kX2IgLSBzdGFydF9iKTsKKyAgICAgICAgfQorCiAgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IHMtPndhdmVsZXRfZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFNsaWNlQ29lZmZzICpjID0gJmNvZWZmc19udW1bbGV2ZWxdOwogICAgICAgICAgICAgZm9yIChvcmllbnRhdGlvbiA9ICEhbGV2ZWw7IG9yaWVudGF0aW9uIDwgNDsgb3JpZW50YXRpb24rKykgewotICAgICAgICAgICAgICAgIGRlY29kZV9zdWJiYW5kKHMsIGdiLCBxdWFudHNbbGV2ZWxdW29yaWVudGF0aW9uXSwgc2xpY2UtPnNsaWNlX3gsIHNsaWNlLT5zbGljZV95LCBiaXRzX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+cGxhbmVbaV0uYmFuZFtsZXZlbF1bb3JpZW50YXRpb25dLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBjb25zdCBTdWJCYW5kICpiMSA9ICZzLT5wbGFuZVtpXS5iYW5kW2xldmVsXVtvcmllbnRhdGlvbl07CisgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmID0gYjEtPmlidWYgKyBjLT50b3AgKiBiMS0+c3RyaWRlICsgKGMtPmxlZnQgPDwgKHMtPnBzaGlmdCArIDEpKTsKKworICAgICAgICAgICAgICAgIC8qIENoYW5nZSB0byBjLT50b3RfaCA8PSA0IGZvciBBVlgyIGRlcXVhbnRpemF0aW9uICovCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHFmdW5jID0gcy0+cHNoaWZ0ICsgMiooYy0+dG90X2ggPD0gMik7CisgICAgICAgICAgICAgICAgcy0+ZGlyYWNkc3AuZGVxdWFudF9zdWJiYW5kW3FmdW5jXSgmdG1wX2J1ZltvZmZdLCBidWYsIGIxLT5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxZmFjdG9yW2xldmVsXVtvcmllbnRhdGlvbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxb2Zmc2V0W2xldmVsXVtvcmllbnRhdGlvbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT50b3RfdiwgYy0+dG90X2gpOworCisgICAgICAgICAgICAgICAgb2ZmICs9IGMtPnRvdCA8PCAocy0+cHNoaWZ0ICsgMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgYml0c19lbmQgLSBnZXRfYml0c19jb3VudChnYikpOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRlY29kZV9ocV9zbGljZV9yb3coQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IHRocmVhZG5yKQoreworICAgIGludCBpOworICAgIERpcmFjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgRGlyYWNTbGljZSAqc2xpY2VzID0gKChEaXJhY1NsaWNlICopYXJnKSArIHMtPm51bV94KmpvYm5yOworICAgIHVpbnQ4X3QgKnRocmVhZF9idWYgPSAmcy0+dGhyZWFkX2J1ZltzLT50aHJlYWRfYnVmX3NpemUqdGhyZWFkbnJdOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1feDsgaSsrKQorICAgICAgICBkZWNvZGVfaHFfc2xpY2UocywgJnNsaWNlc1tpXSwgdGhyZWFkX2J1Zik7CisgICAgcmV0dXJuIDA7Cit9CisKIC8qKgogICogRGlyYWMgU3BlY2lmaWNhdGlvbiAtPgogICogMTMuNS4xIGxvd19kZWxheV90cmFuc2Zvcm1fZGF0YSgpCkBAIC04NDgsMTQgKzkxMSwzOSBAQAogc3RhdGljIGludCBkZWNvZGVfbG93ZGVsYXkoRGlyYWNDb250ZXh0ICpzKQogewogICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OwotICAgIGludCBzbGljZV94LCBzbGljZV95LCBieXRlcyA9IDAsIGJ1ZnNpemU7CisgICAgaW50IHNsaWNlX3gsIHNsaWNlX3ksIGJ1ZnNpemU7CisgICAgaW50NjRfdCBjb2VmX2J1Zl9zaXplLCBieXRlcyA9IDA7CiAgICAgY29uc3QgdWludDhfdCAqYnVmOwogICAgIERpcmFjU2xpY2UgKnNsaWNlczsKKyAgICBTbGljZUNvZWZmcyB0bXBbTUFYX0RXVF9MRVZFTFNdOwogICAgIGludCBzbGljZV9udW0gPSAwOwogCi0gICAgc2xpY2VzID0gYXZfbWFsbG9jel9hcnJheShzLT5udW1feCwgcy0+bnVtX3kgKiBzaXplb2YoRGlyYWNTbGljZSkpOwotICAgIGlmICghc2xpY2VzKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmIChzLT5zbGljZV9wYXJhbXNfbnVtX2J1ZiAhPSAocy0+bnVtX3ggKiBzLT5udW1feSkpIHsKKyAgICAgICAgcy0+c2xpY2VfcGFyYW1zX2J1ZiA9IGF2X3JlYWxsb2NfZihzLT5zbGljZV9wYXJhbXNfYnVmLCBzLT5udW1feCAqIHMtPm51bV95LCBzaXplb2YoRGlyYWNTbGljZSkpOworICAgICAgICBpZiAoIXMtPnNsaWNlX3BhcmFtc19idWYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2xpY2UgcGFyYW1zIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgcy0+c2xpY2VfcGFyYW1zX251bV9idWYgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBzLT5zbGljZV9wYXJhbXNfbnVtX2J1ZiA9IHMtPm51bV94ICogcy0+bnVtX3k7CisgICAgfQorICAgIHNsaWNlcyA9IHMtPnNsaWNlX3BhcmFtc19idWY7CisKKyAgICAvKiA4IGJlY2FjdXNlIHRoYXQncyBob3cgbXVjaCB0aGUgZ29sb21iIHJlYWRlciBjb3VsZCBvdmVycmVhZCBqdW5rIGRhdGEKKyAgICAgKiBmcm9tIGFub3RoZXIgcGxhbmUvc2xpY2UgYXQgbW9zdCwgYW5kIDUxMiBiZWNhdXNlIFNJTUQgKi8KKyAgICBjb2VmX2J1Zl9zaXplID0gc3ViYmFuZF9jb2VmZnMocywgcy0+bnVtX3ggLSAxLCBzLT5udW1feSAtIDEsIDAsIHRtcCkgKyA4OworICAgIGNvZWZfYnVmX3NpemUgPSAoY29lZl9idWZfc2l6ZSA8PCAoMSArIHMtPnBzaGlmdCkpICsgNTEyOworCisgICAgaWYgKHMtPnRocmVhZHNfbnVtX2J1ZiAhPSBhdmN0eC0+dGhyZWFkX2NvdW50IHx8CisgICAgICAgIHMtPnRocmVhZF9idWZfc2l6ZSAhPSBjb2VmX2J1Zl9zaXplKSB7CisgICAgICAgIHMtPnRocmVhZHNfbnVtX2J1ZiAgPSBhdmN0eC0+dGhyZWFkX2NvdW50OworICAgICAgICBzLT50aHJlYWRfYnVmX3NpemUgID0gY29lZl9idWZfc2l6ZTsKKyAgICAgICAgcy0+dGhyZWFkX2J1ZiAgICAgICA9IGF2X3JlYWxsb2NfZihzLT50aHJlYWRfYnVmLCBhdmN0eC0+dGhyZWFkX2NvdW50LCBzLT50aHJlYWRfYnVmX3NpemUpOworICAgICAgICBpZiAoIXMtPnRocmVhZF9idWYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidGhyZWFkIGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWx1cmVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGFsaWduX2dldF9iaXRzKCZzLT5nYik7CiAgICAgLypbRElSQUNfU1REXSAxMy41LjIgU2xpY2VzLiBzbGljZShzeCxzeSkgKi8KQEAgLTg3Miw2ICs5NjAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzIDw9IGJ1ZnNpemUvOCkKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzICs9IGJ1ZltieXRlc10gKiBzLT5oaWdocXVhbGl0eS5zaXplX3NjYWxlciArIDE7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChieXRlcyA+PSBJTlRfTUFYIHx8IGJ5dGVzKjggPiBidWZzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIG1hbnkgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBzbGljZXNbc2xpY2VfbnVtXS5ieXRlcyAgID0gYnl0ZXM7CiAgICAgICAgICAgICAgICAgc2xpY2VzW3NsaWNlX251bV0uc2xpY2VfeCA9IHNsaWNlX3g7CkBAIC04ODYsMTMgKzk3OCwyMiBAQAogICAgICAgICAgICAgICAgICAgICBidWZzaXplID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBhdmN0eC0+ZXhlY3V0ZShhdmN0eCwgZGVjb2RlX2hxX3NsaWNlLCBzbGljZXMsIE5VTEwsIHNsaWNlX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKERpcmFjU2xpY2UpKTsKKworICAgICAgICBpZiAocy0+bnVtX3gqcy0+bnVtX3kgIT0gc2xpY2VfbnVtKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInRvbyBmZXcgc2xpY2VzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgYXZjdHgtPmV4ZWN1dGUyKGF2Y3R4LCBkZWNvZGVfaHFfc2xpY2Vfcm93LCBzbGljZXMsIE5VTEwsIHMtPm51bV95KTsKICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKHNsaWNlX3kgPSAwOyBidWZzaXplID4gMCAmJiBzbGljZV95IDwgcy0+bnVtX3k7IHNsaWNlX3krKykgewogICAgICAgICAgICAgZm9yIChzbGljZV94ID0gMDsgYnVmc2l6ZSA+IDAgJiYgc2xpY2VfeCA8IHMtPm51bV94OyBzbGljZV94KyspIHsKLSAgICAgICAgICAgICAgICBieXRlcyA9IChzbGljZV9udW0rMSkgKiBzLT5sb3dkZWxheS5ieXRlcy5udW0gLyBzLT5sb3dkZWxheS5ieXRlcy5kZW4KLSAgICAgICAgICAgICAgICAgICAgLSBzbGljZV9udW0gICAgKiBzLT5sb3dkZWxheS5ieXRlcy5udW0gLyBzLT5sb3dkZWxheS5ieXRlcy5kZW47CisgICAgICAgICAgICAgICAgYnl0ZXMgPSAoc2xpY2VfbnVtKzEpICogKGludDY0X3Qpcy0+bG93ZGVsYXkuYnl0ZXMubnVtIC8gcy0+bG93ZGVsYXkuYnl0ZXMuZGVuCisgICAgICAgICAgICAgICAgICAgICAgIC0gc2xpY2VfbnVtICAgICogKGludDY0X3Qpcy0+bG93ZGVsYXkuYnl0ZXMubnVtIC8gcy0+bG93ZGVsYXkuYnl0ZXMuZGVuOworICAgICAgICAgICAgICAgIGlmIChieXRlcyA+PSBJTlRfTUFYIHx8IGJ5dGVzKjggPiBidWZzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIG1hbnkgYnl0ZXNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc2xpY2VzW3NsaWNlX251bV0uYnl0ZXMgICA9IGJ5dGVzOwogICAgICAgICAgICAgICAgIHNsaWNlc1tzbGljZV9udW1dLnNsaWNlX3ggPSBzbGljZV94OwogICAgICAgICAgICAgICAgIHNsaWNlc1tzbGljZV9udW1dLnNsaWNlX3kgPSBzbGljZV95OwpAQCAtOTIxLDcgKzEwMjIsNyBAQAogICAgICAgICAgICAgaW50cmFfZGNfcHJlZGljdGlvbl84KCZzLT5wbGFuZVsyXS5iYW5kWzBdWzBdKTsKICAgICAgICAgfQogICAgIH0KLSAgICBhdl9mcmVlKHNsaWNlcyk7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtOTg5LDcgKzEwOTAsNyBAQAogICAgIGFsaWduX2dldF9iaXRzKGdiKTsKICAgICAvKiBbRElSQUNfU1REXSAxMS4yLjIgQmxvY2sgcGFyYW1ldGVycy4gYmxvY2tfcGFyYW1ldGVycygpICovCiAgICAgLyogTHVtYSBhbmQgQ2hyb21hIGFyZSBlcXVhbC4gMTEuMi4zICovCi0gICAgaWR4ID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsgLyogW0RJUkFDX1NURF0gaW5kZXggKi8KKyAgICBpZHggPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsgLyogW0RJUkFDX1NURF0gaW5kZXggKi8KIAogICAgIGlmIChpZHggPiA0KSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmxvY2sgcHJlZGljdGlvbiBpbmRleCB0b28gaGlnaFxuIik7CkBAIC05OTcsMTAgKzEwOTgsMTAgQEAKICAgICB9CiAKICAgICBpZiAoaWR4ID09IDApIHsKLSAgICAgICAgcy0+cGxhbmVbMF0ueGJsZW4gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOwotICAgICAgICBzLT5wbGFuZVswXS55YmxlbiA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7Ci0gICAgICAgIHMtPnBsYW5lWzBdLnhic2VwID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKLSAgICAgICAgcy0+cGxhbmVbMF0ueWJzZXAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5wbGFuZVswXS54YmxlbiA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5wbGFuZVswXS55YmxlbiA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5wbGFuZVswXS54YnNlcCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5wbGFuZVswXS55YnNlcCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qW0RJUkFDX1NURF0gcHJlc2V0X2Jsb2NrX3BhcmFtcyhpbmRleCkuIFRhYmxlIDExLjEgKi8KICAgICAgICAgcy0+cGxhbmVbMF0ueGJsZW4gPSBkZWZhdWx0X2JsZW5baWR4LTFdOwpAQCAtMTAzNCw3ICsxMTM1LDcgQEAKIAogICAgIC8qW0RJUkFDX1NURF0gMTEuMi41IE1vdGlvbiB2ZWN0b3IgcHJlY2lzaW9uLiBtb3Rpb25fdmVjdG9yX3ByZWNpc2lvbigpCiAgICAgICBSZWFkIG1vdGlvbiB2ZWN0b3IgcHJlY2lzaW9uICovCi0gICAgcy0+bXZfcHJlY2lzaW9uID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICBzLT5tdl9wcmVjaXNpb24gPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsKICAgICBpZiAocy0+bXZfcHJlY2lzaW9uID4gMykgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1WIHByZWNpc2lvbiBmaW5lciB0aGFuIGVpZ2h0aC1wZWxcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTEwNTQsNyArMTE1NSw3IEBACiAgICAgICAgICAgICAvKiBbRElSQUNfU1REXSB6b29tX3JvdGF0ZV9zaGVhcihncGFyYW1zKQogICAgICAgICAgICAgICAgem9vbS9yb3RhdGlvbi9zaGVhciBwYXJhbWV0ZXJzICovCiAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgewotICAgICAgICAgICAgICAgIHMtPmdsb2JhbG1jW3JlZl0uenJzX2V4cCAgID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICBzLT5nbG9iYWxtY1tyZWZdLnpyc19leHAgICA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOwogICAgICAgICAgICAgICAgIHMtPmdsb2JhbG1jW3JlZl0uenJzWzBdWzBdID0gZGlyYWNfZ2V0X3NlX2dvbG9tYihnYik7CiAgICAgICAgICAgICAgICAgcy0+Z2xvYmFsbWNbcmVmXS56cnNbMF1bMV0gPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKICAgICAgICAgICAgICAgICBzLT5nbG9iYWxtY1tyZWZdLnpyc1sxXVswXSA9IGRpcmFjX2dldF9zZV9nb2xvbWIoZ2IpOwpAQCAtMTA2NSwxNiArMTE2NiwyMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogW0RJUkFDX1NURF0gcGVyc3BlY3RpdmUoZ3BhcmFtcykgKi8KICAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7Ci0gICAgICAgICAgICAgICAgcy0+Z2xvYmFsbWNbcmVmXS5wZXJzcGVjdGl2ZV9leHAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIHMtPmdsb2JhbG1jW3JlZl0ucGVyc3BlY3RpdmVfZXhwID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CiAgICAgICAgICAgICAgICAgcy0+Z2xvYmFsbWNbcmVmXS5wZXJzcGVjdGl2ZVswXSAgPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKICAgICAgICAgICAgICAgICBzLT5nbG9iYWxtY1tyZWZdLnBlcnNwZWN0aXZlWzFdICA9IGRpcmFjX2dldF9zZV9nb2xvbWIoZ2IpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmdsb2JhbG1jW3JlZl0ucGVyc3BlY3RpdmVfZXhwICsgKHVpbnQ2NF90KXMtPmdsb2JhbG1jW3JlZl0uenJzX2V4cCA+IDMwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qW0RJUkFDX1NURF0gMTEuMi43IFBpY3R1cmUgcHJlZGljdGlvbiBtb2RlLiBwcmVkaWN0aW9uX21vZGUoKQogICAgICAgUGljdHVyZSBwcmVkaWN0aW9uIG1vZGUsIG5vdCBjdXJyZW50bHkgdXNlZC4gKi8KLSAgICBpZiAoc3ZxM19nZXRfdWVfZ29sb21iKGdiKSkgeworICAgIGlmIChnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKSkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gcGljdHVyZSBwcmVkaWN0aW9uIG1vZGVcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC0xMDg2LDcgKzExOTEsMTIgQEAKICAgICBzLT53ZWlnaHRbMV0gICAgICAgID0gMTsKIAogICAgIGlmIChnZXRfYml0czEoZ2IpKSB7Ci0gICAgICAgIHMtPndlaWdodF9sb2cyZGVub20gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT53ZWlnaHRfbG9nMmRlbm9tID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CisgICAgICAgIGlmIChzLT53ZWlnaHRfbG9nMmRlbm9tIDwgMSB8fCBzLT53ZWlnaHRfbG9nMmRlbm9tID4gOCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3ZWlnaHRfbG9nMmRlbm9tIHVuc3VwcG9ydGVkIG9yIGludmFsaWRcbiIpOworICAgICAgICAgICAgcy0+d2VpZ2h0X2xvZzJkZW5vbSA9IDE7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogICAgICAgICBzLT53ZWlnaHRbMF0gPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKICAgICAgICAgaWYgKHMtPm51bV9yZWZzID09IDIpCiAgICAgICAgICAgICBzLT53ZWlnaHRbMV0gPSBkaXJhY19nZXRfc2VfZ29sb21iKGdiKTsKQEAgLTExMDUsNyArMTIxNSw3IEBACiAgICAgdW5zaWduZWQgdG1wOwogCiAjZGVmaW5lIENIRUNLRURSRUFEKGRzdCwgY29uZCwgZXJybXNnKSBcCi0gICAgdG1wID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsgXAorICAgIHRtcCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOyBcCiAgICAgaWYgKGNvbmQpIHsgXAogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgZXJybXNnKTsgXAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgXApAQCAtMTEzOSwyOSArMTI0OSw0MCBAQAogICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewotICAgICAgICBzLT5udW1feCAgICAgICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOwotICAgICAgICBzLT5udW1feSAgICAgICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICBzLT5udW1feCAgICAgICAgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgcy0+bnVtX3kgICAgICAgID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CisgICAgICAgIGlmIChzLT5udW1feCAqIHMtPm51bV95ID09IDAgfHwgcy0+bnVtX3ggKiAodWludDY0X3Qpcy0+bnVtX3kgPiBJTlRfTUFYIHx8CisgICAgICAgICAgICBzLT5udW1feCAqICh1aW50NjRfdClzLT5hdmN0eC0+d2lkdGggID4gSU5UX01BWCB8fAorICAgICAgICAgICAgcy0+bnVtX3kgKiAodWludDY0X3Qpcy0+YXZjdHgtPmhlaWdodCA+IElOVF9NQVgKKyAgICAgICAgKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsQVZfTE9HX0VSUk9SLCJJbnZhbGlkIG51bXgveVxuIik7CisgICAgICAgICAgICBzLT5udW1feCA9IHMtPm51bV95ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAgICAgICAgIGlmIChzLT5sZF9waWN0dXJlKSB7Ci0gICAgICAgICAgICBzLT5sb3dkZWxheS5ieXRlcy5udW0gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOwotICAgICAgICAgICAgcy0+bG93ZGVsYXkuYnl0ZXMuZGVuID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgIHMtPmxvd2RlbGF5LmJ5dGVzLm51bSA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgcy0+bG93ZGVsYXkuYnl0ZXMuZGVuID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CiAgICAgICAgICAgICBpZiAocy0+bG93ZGVsYXkuYnl0ZXMuZGVuIDw9IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsQVZfTE9HX0VSUk9SLCJJbnZhbGlkIGxvd2RlbGF5LmJ5dGVzLmRlblxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocy0+aHFfcGljdHVyZSkgewotICAgICAgICAgICAgcy0+aGlnaHF1YWxpdHkucHJlZml4X2J5dGVzID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKLSAgICAgICAgICAgIHMtPmhpZ2hxdWFsaXR5LnNpemVfc2NhbGVyICA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICBzLT5oaWdocXVhbGl0eS5wcmVmaXhfYnl0ZXMgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgICAgIHMtPmhpZ2hxdWFsaXR5LnNpemVfc2NhbGVyICA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgaWYgKHMtPmhpZ2hxdWFsaXR5LnByZWZpeF9ieXRlcyA+PSBJTlRfTUFYIC8gOCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCxBVl9MT0dfRVJST1IsInRvbyBtYW55IHByZWZpeCBieXRlc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKiBbRElSQUNfU1REXSAxMS4zLjUgUXVhbnRpc2F0aW9uIG1hdHJpY2VzIChsb3ctZGVsYXkgc3ludGF4KS4gcXVhbnRfbWF0cml4KCkgKi8KICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCxBVl9MT0dfREVCVUcsIkxvdyBEZWxheTogSGFzIEN1c3RvbSBRdWFudGl6YXRpb24gTWF0cml4IVxuIik7CiAgICAgICAgICAgICAvKiBjdXN0b20gcXVhbnRpemF0aW9uIG1hdHJpeCAqLwotICAgICAgICAgICAgcy0+bG93ZGVsYXkucXVhbnRbMF1bMF0gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOwogICAgICAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgcy0+d2F2ZWxldF9kZXB0aDsgbGV2ZWwrKykgewotICAgICAgICAgICAgICAgIHMtPmxvd2RlbGF5LnF1YW50W2xldmVsXVsxXSA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7Ci0gICAgICAgICAgICAgICAgcy0+bG93ZGVsYXkucXVhbnRbbGV2ZWxdWzJdID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKLSAgICAgICAgICAgICAgICBzLT5sb3dkZWxheS5xdWFudFtsZXZlbF1bM10gPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIGZvciAoaSA9ICEhbGV2ZWw7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+bG93ZGVsYXkucXVhbnRbbGV2ZWxdW2ldID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKHMtPndhdmVsZXRfZGVwdGggPiA0KSB7CkBAIC0xMjg5LDggKzE0MTAsOCBAQAogICAgIGludCAqYyAgICAgID0gcy0+Z2xvYmFsbWNbcmVmXS5wZXJzcGVjdGl2ZTsKIAogICAgIGludCBtICAgICAgID0gKDE8PGVwKSAtIChjWzBdKnggKyBjWzFdKnkpOwotICAgIGludCBteCAgICAgID0gbSAqICgoQVswXVswXSAqIHggKyBBWzBdWzFdKnkpICsgKDE8PGV6KSAqIGJbMF0pOwotICAgIGludCBteSAgICAgID0gbSAqICgoQVsxXVswXSAqIHggKyBBWzFdWzFdKnkpICsgKDE8PGV6KSAqIGJbMV0pOworICAgIGludDY0X3QgbXggID0gbSAqIChpbnQ2NF90KSgoQVswXVswXSAqIChpbnQ2NF90KXggKyBBWzBdWzFdKihpbnQ2NF90KXkpICsgKDE8PGV6KSAqIGJbMF0pOworICAgIGludDY0X3QgbXkgID0gbSAqIChpbnQ2NF90KSgoQVsxXVswXSAqIChpbnQ2NF90KXggKyBBWzFdWzFdKihpbnQ2NF90KXkpICsgKDE8PGV6KSAqIGJbMV0pOwogCiAgICAgYmxvY2stPnUubXZbcmVmXVswXSA9IChteCArICgxPDwoZXorZXApKSkgPj4gKGV6K2VwKTsKICAgICBibG9jay0+dS5tdltyZWZdWzFdID0gKG15ICsgKDE8PChleitlcCkpKSA+PiAoZXorZXApOwpAQCAtMTMxMiw3ICsxNDMzLDcgQEAKICAgICBpZiAoIWJsb2NrLT5yZWYpIHsKICAgICAgICAgcHJlZF9ibG9ja19kYyhibG9jaywgc3RyaWRlLCB4LCB5KTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIGJsb2NrLT51LmRjW2ldICs9IGRpcmFjX2dldF9hcml0aF9pbnQoYXJpdGgrMStpLCBDVFhfRENfRjEsIENUWF9EQ19EQVRBKTsKKyAgICAgICAgICAgIGJsb2NrLT51LmRjW2ldICs9ICh1bnNpZ25lZClkaXJhY19nZXRfYXJpdGhfaW50KGFyaXRoKzEraSwgQ1RYX0RDX0YxLCBDVFhfRENfREFUQSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTEzMjcsOCArMTQ0OCw4IEBACiAgICAgICAgICAgICAgICAgZ2xvYmFsX212KHMsIGJsb2NrLCB4LCB5LCBpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcHJlZF9tdihibG9jaywgc3RyaWRlLCB4LCB5LCBpKTsKLSAgICAgICAgICAgICAgICBibG9jay0+dS5tdltpXVswXSArPSBkaXJhY19nZXRfYXJpdGhfaW50KGFyaXRoICsgNCArIDIgKiBpLCBDVFhfTVZfRjEsIENUWF9NVl9EQVRBKTsKLSAgICAgICAgICAgICAgICBibG9jay0+dS5tdltpXVsxXSArPSBkaXJhY19nZXRfYXJpdGhfaW50KGFyaXRoICsgNSArIDIgKiBpLCBDVFhfTVZfRjEsIENUWF9NVl9EQVRBKTsKKyAgICAgICAgICAgICAgICBibG9jay0+dS5tdltpXVswXSArPSAodW5zaWduZWQpZGlyYWNfZ2V0X2FyaXRoX2ludChhcml0aCArIDQgKyAyICogaSwgQ1RYX01WX0YxLCBDVFhfTVZfREFUQSk7CisgICAgICAgICAgICAgICAgYmxvY2stPnUubXZbaV1bMV0gKz0gKHVuc2lnbmVkKWRpcmFjX2dldF9hcml0aF9pbnQoYXJpdGggKyA1ICsgMiAqIGksIENUWF9NVl9GMSwgQ1RYX01WX0RBVEEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiB9CkBAIC0xMzcyLDcgKzE0OTMsNyBAQAogCiAgICAgLyogW0RJUkFDX1NURF0gMTIuMy4xIFN1cGVyYmxvY2sgc3BsaXR0aW5nIG1vZGVzLiBzdXBlcmJsb2NrX3NwbGl0X21vZGVzKCkKICAgICAgICBkZWNvZGUgc3VwZXJibG9jayBzcGxpdCBtb2RlcyAqLwotICAgIGZmX2RpcmFjX2luaXRfYXJpdGhfZGVjb2Rlcihhcml0aCwgZ2IsIHN2cTNfZ2V0X3VlX2dvbG9tYihnYikpOyAgICAgLyogc3ZxM19nZXRfdWVfZ29sb21iKGdiKSBpcyB0aGUgbGVuZ3RoICovCisgICAgZmZfZGlyYWNfaW5pdF9hcml0aF9kZWNvZGVyKGFyaXRoLCBnYiwgZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYikpOyAgICAgLyogZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYikgaXMgdGhlIGxlbmd0aCAqLwogICAgIGZvciAoeSA9IDA7IHkgPCBzLT5zYmhlaWdodDsgeSsrKSB7CiAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5zYndpZHRoOyB4KyspIHsKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcGxpdCAgPSBkaXJhY19nZXRfYXJpdGhfdWludChhcml0aCwgQ1RYX1NCX0YxLCBDVFhfU0JfREFUQSk7CkBAIC0xMzg0LDEzICsxNTA1LDEzIEBACiAgICAgfQogCiAgICAgLyogc2V0dXAgYXJpdGggZGVjb2RpbmcgKi8KLSAgICBmZl9kaXJhY19pbml0X2FyaXRoX2RlY29kZXIoYXJpdGgsIGdiLCBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpKTsKKyAgICBmZl9kaXJhY19pbml0X2FyaXRoX2RlY29kZXIoYXJpdGgsIGdiLCBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKSk7CiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9yZWZzOyBpKyspIHsKLSAgICAgICAgZmZfZGlyYWNfaW5pdF9hcml0aF9kZWNvZGVyKGFyaXRoICsgNCArIDIgKiBpLCBnYiwgc3ZxM19nZXRfdWVfZ29sb21iKGdiKSk7Ci0gICAgICAgIGZmX2RpcmFjX2luaXRfYXJpdGhfZGVjb2Rlcihhcml0aCArIDUgKyAyICogaSwgZ2IsIHN2cTNfZ2V0X3VlX2dvbG9tYihnYikpOworICAgICAgICBmZl9kaXJhY19pbml0X2FyaXRoX2RlY29kZXIoYXJpdGggKyA0ICsgMiAqIGksIGdiLCBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKSk7CisgICAgICAgIGZmX2RpcmFjX2luaXRfYXJpdGhfZGVjb2Rlcihhcml0aCArIDUgKyAyICogaSwgZ2IsIGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoZ2IpKTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgZmZfZGlyYWNfaW5pdF9hcml0aF9kZWNvZGVyKGFyaXRoKzEraSwgZ2IsIHN2cTNfZ2V0X3VlX2dvbG9tYihnYikpOworICAgICAgICBmZl9kaXJhY19pbml0X2FyaXRoX2RlY29kZXIoYXJpdGgrMStpLCBnYiwgZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYikpOwogCiAgICAgZm9yICh5ID0gMDsgeSA8IHMtPnNiaGVpZ2h0OyB5KyspCiAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5zYndpZHRoOyB4KyspIHsKQEAgLTE3MjcsOSArMTg0OCwxMSBAQAogCiAgICAgaWYgKHMtPmxvd19kZWxheSkgewogICAgICAgICAvKiBbRElSQUNfU1REXSAxMy41LjEgbG93X2RlbGF5X3RyYW5zZm9ybV9kYXRhKCkgKi8KLSAgICAgICAgZm9yIChjb21wID0gMDsgY29tcCA8IDM7IGNvbXArKykgewotICAgICAgICAgICAgUGxhbmUgKnAgPSAmcy0+cGxhbmVbY29tcF07Ci0gICAgICAgICAgICBtZW1zZXQocC0+aWR3dC5idWYsIDAsIHAtPmlkd3Quc3RyaWRlICogcC0+aWR3dC5oZWlnaHQpOworICAgICAgICBpZiAoIXMtPmhxX3BpY3R1cmUpIHsKKyAgICAgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCAzOyBjb21wKyspIHsKKyAgICAgICAgICAgICAgICBQbGFuZSAqcCA9ICZzLT5wbGFuZVtjb21wXTsKKyAgICAgICAgICAgICAgICBtZW1zZXQocC0+aWR3dC5idWYsIDAsIHAtPmlkd3Quc3RyaWRlICogcC0+aWR3dC5oZWlnaHQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghcy0+emVyb19yZXMpIHsKICAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2xvd2RlbGF5KHMpKSA8IDApCkBAIC0xODE2LDcgKzE5MzksMTAgQEAKIHsKICAgICBpbnQgcmV0LCBpOwogICAgIGludCBjaHJvbWFfeF9zaGlmdCwgY2hyb21hX3lfc2hpZnQ7Ci0gICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZjaHJvbWFfeF9zaGlmdCwgJmNocm9tYV95X3NoaWZ0KTsKKyAgICByZXQgPSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJmNocm9tYV94X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaHJvbWFfeV9zaGlmdCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBmLT53aWR0aCAgPSBhdmN0eC0+d2lkdGggICsgMiAqIEVER0VfV0lEVEg7CiAgICAgZi0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodCArIDIgKiBFREdFX1dJRFRIICsgMjsKQEAgLTE4NzksNyArMjAwNSw5IEBACiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX0ZSQU1FUzsgaisrKQogICAgICAgICAgICAgICAgIGlmICghcy0+YWxsX2ZyYW1lc1tqXS5hdmZyYW1lLT5kYXRhWzBdKSB7CiAgICAgICAgICAgICAgICAgICAgIHMtPnJlZl9waWNzW2ldID0gJnMtPmFsbF9mcmFtZXNbal07Ci0gICAgICAgICAgICAgICAgICAgIGdldF9idWZmZXJfd2l0aF9lZGdlKHMtPmF2Y3R4LCBzLT5yZWZfcGljc1tpXS0+YXZmcmFtZSwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRik7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGdldF9idWZmZXJfd2l0aF9lZGdlKHMtPmF2Y3R4LCBzLT5yZWZfcGljc1tpXS0+YXZmcmFtZSwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xOTQzLDkgKzIwNzEsOSBAQAogCiAgICAgaWYgKG91dCkgewogICAgICAgICBvdXQtPnJlZmVyZW5jZSBePSBERUxBWUVEX1BJQ19SRUY7Ci0gICAgICAgICpnb3RfZnJhbWUgPSAxOwogICAgICAgICBpZigocmV0ID0gYXZfZnJhbWVfcmVmKHBpY3R1cmUsIG91dC0+YXZmcmFtZSkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICpnb3RfZnJhbWUgPSAxOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMTk4Nyw3ICsyMTE1LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAKLSAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIGRzaC0+d2lkdGgsIGRzaC0+aGVpZ2h0KTsKKyAgICAgICAgaWYgKENBTENfUEFERElORygoaW50NjRfdClkc2gtPndpZHRoLCBNQVhfRFdUX0xFVkVMUykgKiBDQUxDX1BBRERJTkcoKGludDY0X3QpZHNoLT5oZWlnaHQsIE1BWF9EV1RfTEVWRUxTKSA+IGF2Y3R4LT5tYXhfcGl4ZWxzKQorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFUkFOR0UpOworICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgZHNoLT53aWR0aCwgZHNoLT5oZWlnaHQpOwogICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgYXZfZnJlZXAoJmRzaCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtMjAxMCw3ICsyMTQxLDExIEBACiAKICAgICAgICAgcy0+cHNoaWZ0ID0gcy0+Yml0X2RlcHRoID4gODsKIAotICAgICAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJnMtPmNocm9tYV94X3NoaWZ0LCAmcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICByZXQgPSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmNocm9tYV94X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAgICAgcmV0ID0gYWxsb2Nfc2VxdWVuY2VfYnVmZmVycyhzKTsKICAgICAgICAgaWYgKHJldCA8IDApCkBAIC0yMTg2LDcgKzIzMjEsNyBAQAogICAgIH0KIAogICAgIGlmICgqZ290X2ZyYW1lKQotICAgICAgICBzLT5mcmFtZV9udW1iZXIgPSBwaWN0dXJlLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyICsgMTsKKyAgICAgICAgcy0+ZnJhbWVfbnVtYmVyID0gcGljdHVyZS0+ZGlzcGxheV9waWN0dXJlX251bWJlciArIDFMTDsKIAogICAgIHJldHVybiBidWZfaWR4OwogfQpAQCAtMjIwMSw1ICsyMzM2LDYgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBkaXJhY19kZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICA9IGRpcmFjX2RlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKICAgICAuZmx1c2ggICAgICAgICAgPSBkaXJhY19kZWNvZGVfZmx1c2gsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kaXJhY2RzcC5jIGIvbGliYXZjb2RlYy9kaXJhY2RzcC5jCmluZGV4IGFiOGQxNDkuLjJkZDU2ZjggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZGlyYWNkc3AuYworKysgYi9saWJhdmNvZGVjL2RpcmFjZHNwLmMKQEAgLTE1OSwxMCArMTU5LDEwIEBACiAgICAgaW50MzJfdCAqc3JjID0gKGludDMyX3QgKilfc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrPTQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBkc3RbeCAgXSA9IGF2X2NsaXBfdWludHAyKHNyY1t4ICBdICsgKDEgPDwgKFBYIC0gMSkpLCBQWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGRzdFt4KzFdID0gYXZfY2xpcF91aW50cDIoc3JjW3grMV0gKyAoMSA8PCAoUFggLSAxKSksIFBYKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZHN0W3grMl0gPSBhdl9jbGlwX3VpbnRwMihzcmNbeCsyXSArICgxIDw8IChQWCAtIDEpKSwgUFgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBkc3RbeCszXSA9IGF2X2NsaXBfdWludHAyKHNyY1t4KzNdICsgKDEgPDwgKFBYIC0gMSkpLCBQWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4ICBdID0gYXZfY2xpcF91aW50cDIoc3JjW3ggIF0gKyAoMVUgPDwgKFBYIC0gMSkpLCBQWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4KzFdID0gYXZfY2xpcF91aW50cDIoc3JjW3grMV0gKyAoMVUgPDwgKFBYIC0gMSkpLCBQWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4KzJdID0gYXZfY2xpcF91aW50cDIoc3JjW3grMl0gKyAoMVUgPDwgKFBYIC0gMSkpLCBQWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4KzNdID0gYXZfY2xpcF91aW50cDIoc3JjW3grM10gKyAoMVUgPDwgKFBYIC0gMSkpLCBQWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlID4+IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE4OSw2ICsxODksMjcgQEAKICAgICB9CiB9CiAKKyNkZWZpbmUgREVRVUFOVF9TVUJCQU5EKFBYKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBkZXF1YW50X3N1YmJhbmRfICMjIFBYICMjIF9jKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcWYsIGNvbnN0IGludCBxcywgaW50IHRvdF92LCBpbnQgdG90X2gpIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeSA9IDA7IHkgPCB0b3RfdjsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFggYywgc2lnbiwgKnNyY19yID0gKFBYICopc3JjLCAqZHN0X3IgPSAoUFggKilkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RfaDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYyA9ICpzcmNfcisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpZ24gPSBGRlNJR04oYykqKCEhYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjID0gKEZGQUJTKGMpKih1bnNpZ25lZClxZiArIHFzKSA+PiAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICpkc3RfcisrID0gYypzaWduOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMgKz0gdG90X2ggPDwgKHNpemVvZihQWCkgPj4gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitERVFVQU5UX1NVQkJBTkQoaW50MTZfdCkKK0RFUVVBTlRfU1VCQkFORChpbnQzMl90KQorCiAjZGVmaW5lIFBJWEZVTkMoUEZYLCBXSURUSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgYy0+UEZYICMjIF9kaXJhY19waXhlbHNfdGFiW1dJRFRIPj40XVswXSA9IGZmXyAjIyBQRlggIyMgX2RpcmFjX3BpeGVscyAjIyBXSURUSCAjIyBfYzsgXAogICAgIGMtPlBGWCAjIyBfZGlyYWNfcGl4ZWxzX3RhYltXSURUSD4+NF1bMV0gPSBmZl8gIyMgUEZYICMjIF9kaXJhY19waXhlbHMgIyMgV0lEVEggIyMgX2wyX2M7IFwKQEAgLTIxNCw2ICsyMzUsOSBAQAogICAgIGMtPmJpd2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbMV0gPSBiaXdlaWdodF9kaXJhY19waXhlbHMxNl9jOwogICAgIGMtPmJpd2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbMl0gPSBiaXdlaWdodF9kaXJhY19waXhlbHMzMl9jOwogCisgICAgYy0+ZGVxdWFudF9zdWJiYW5kWzBdID0gYy0+ZGVxdWFudF9zdWJiYW5kWzJdID0gZGVxdWFudF9zdWJiYW5kX2ludDE2X3RfYzsKKyAgICBjLT5kZXF1YW50X3N1YmJhbmRbMV0gPSBjLT5kZXF1YW50X3N1YmJhbmRbM10gPSBkZXF1YW50X3N1YmJhbmRfaW50MzJfdF9jOworCiAgICAgUElYRlVOQyhwdXQsIDgpOwogICAgIFBJWEZVTkMocHV0LCAxNik7CiAgICAgUElYRlVOQyhwdXQsIDMyKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGlyYWNkc3AuaCBiL2xpYmF2Y29kZWMvZGlyYWNkc3AuaAppbmRleCAyNWE4NzJkLi4yMjQ4MjhkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RpcmFjZHNwLmgKKysrIGIvbGliYXZjb2RlYy9kaXJhY2RzcC5oCkBAIC0yMiw2ICsyMiw3IEBACiAjZGVmaW5lIEFWQ09ERUNfRElSQUNEU1BfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CiAKIHR5cGVkZWYgdm9pZCAoKmRpcmFjX3dlaWdodF9mdW5jKSh1aW50OF90ICpibG9jaywgaW50IHN0cmlkZSwgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHQsIGludCBoKTsKIHR5cGVkZWYgdm9pZCAoKmRpcmFjX2Jpd2VpZ2h0X2Z1bmMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLCBpbnQgaCk7CkBAIC00Niw2ICs0Nyw5IEBACiAgICAgdm9pZCAoKmFkZF9yZWN0X2NsYW1wZWQpKHVpbnQ4X3QgKmRzdC8qYWxpZ24gMTYqLywgY29uc3QgdWludDE2X3QgKnNyYy8qYWxpZ24gMTYqLywgaW50IHN0cmlkZSwgY29uc3QgaW50MTZfdCAqaWR3dC8qYWxpZ24gMTYqLywgaW50IGlkd3Rfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQvKm1vZCAyKi8pOwogICAgIHZvaWQgKCphZGRfZGlyYWNfb2JtY1szXSkodWludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50OF90ICpvYm1jX3dlaWdodCwgaW50IHlibGVuKTsKIAorICAgIC8qIDAtMTogaW50MTZfdCBhbmQgaW50MzJfdCBhc20vYywgMi0zOiBpbnQxNiBhbmQgaW50MzJfdCwgQyBvbmx5ICovCisgICAgdm9pZCAoKmRlcXVhbnRfc3ViYmFuZFs0XSkodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IGludCBxZiwgY29uc3QgaW50IHFzLCBpbnQgdG90X3YsIGludCB0b3RfaCk7CisKICAgICBkaXJhY193ZWlnaHRfZnVuYyB3ZWlnaHRfZGlyYWNfcGl4ZWxzX3RhYlszXTsKICAgICBkaXJhY19iaXdlaWdodF9mdW5jIGJpd2VpZ2h0X2RpcmFjX3BpeGVsc190YWJbM107CiB9IERpcmFjRFNQQ29udGV4dDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZGlyYWN0YWIuaCBiL2xpYmF2Y29kZWMvZGlyYWN0YWIuaAppbmRleCBjZDhiOGFjLi4yNDIzYjA3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RpcmFjdGFiLmgKKysrIGIvbGliYXZjb2RlYy9kaXJhY3RhYi5oCkBAIC0zOCw0ICszOCw2IEBACiAvKiBTY2FsaW5nIG9mZnNldHMgbmVlZGVkIGZvciBxdWFudGl6YXRpb24vZGVxdWFudGl6YXRpb24sIGZvciBpbnRlciBmcmFtZXMgKi8KIGV4dGVybiBjb25zdCBpbnQgZmZfZGlyYWNfcW9mZnNldF9pbnRlcl90YWJbMTIyXTsKIAorI2RlZmluZSBESVJBQ19NQVhfUVVBTlRfSU5ERVggKEZGX0FSUkFZX0VMRU1TKGZmX2RpcmFjX3FzY2FsZV90YWIpKQorCiAjZW5kaWYgLyogQVZDT0RFQ19ESVJBQ1RBQl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RueGhkX3BhcnNlci5jIGIvbGliYXZjb2RlYy9kbnhoZF9wYXJzZXIuYwppbmRleCAwMzNiOGVlLi43OWNhMWQ2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RueGhkX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvZG54aGRfcGFyc2VyLmMKQEAgLTI5LDggKzI5LDkgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogICAgIFBhcnNlQ29udGV4dCBwYzsKLSAgICBpbnQgaW50ZXJsYWNlZDsKLSAgICBpbnQgY3VyX2ZpZWxkOyAvKiBmaXJzdCBmaWVsZCBpcyAwLCBzZWNvbmQgaXMgMSAqLworICAgIGludCBjdXJfYnl0ZTsKKyAgICBpbnQgcmVtYWluaW5nOworICAgIGludCB3LCBoOwogfSBETlhIRFBhcnNlckNvbnRleHQ7CiAKIHN0YXRpYyBpbnQgZG54aGRfZmluZF9mcmFtZV9lbmQoRE5YSERQYXJzZXJDb250ZXh0ICpkY3R4LApAQCAtNDAsOCArNDEsNiBAQAogICAgIHVpbnQ2NF90IHN0YXRlID0gcGMtPnN0YXRlNjQ7CiAgICAgaW50IHBpY19mb3VuZCA9IHBjLT5mcmFtZV9zdGFydF9mb3VuZDsKICAgICBpbnQgaSA9IDA7Ci0gICAgaW50IGludGVybGFjZWQgPSBkY3R4LT5pbnRlcmxhY2VkOwotICAgIGludCBjdXJfZmllbGQgPSBkY3R4LT5jdXJfZmllbGQ7CiAKICAgICBpZiAoIXBpY19mb3VuZCkgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgewpAQCAtNDksMzcgKzQ4LDY2IEBACiAgICAgICAgICAgICBpZiAoZmZfZG54aGRfY2hlY2tfaGVhZGVyX3ByZWZpeChzdGF0ZSAmIDB4ZmZmZmZmZmZmZjAwTEwpICE9IDApIHsKICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgcGljX2ZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICBpbnRlcmxhY2VkID0gKHN0YXRlJjIpPj4xOyAvKiBieXRlIGZvbGxvd2luZyB0aGUgNS1ieXRlIGhlYWRlciBwcmVmaXggKi8KLSAgICAgICAgICAgICAgICBjdXJfZmllbGQgPSBzdGF0ZSYxOworICAgICAgICAgICAgICAgIGRjdHgtPmN1cl9ieXRlID0gMDsKKyAgICAgICAgICAgICAgICBkY3R4LT5yZW1haW5pbmcgPSAwOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHBpY19mb3VuZCkgeworICAgIGlmIChwaWNfZm91bmQgJiYgIWRjdHgtPnJlbWFpbmluZykgewogICAgICAgICBpZiAoIWJ1Zl9zaXplKSAvKiBFT0YgY29uc2lkZXJlZCBhcyBlbmQgb2YgZnJhbWUgKi8KICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBmb3IgKDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGRjdHgtPmN1cl9ieXRlKys7CiAgICAgICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGJ1ZltpXTsKLSAgICAgICAgICAgIGlmIChmZl9kbnhoZF9jaGVja19oZWFkZXJfcHJlZml4KHN0YXRlICYgMHhmZmZmZmZmZmZmMDBMTCkgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICghaW50ZXJsYWNlZCB8fCBkY3R4LT5jdXJfZmllbGQpIHsKKworICAgICAgICAgICAgaWYgKGRjdHgtPmN1cl9ieXRlID09IDI0KSB7CisgICAgICAgICAgICAgICAgZGN0eC0+aCA9IChzdGF0ZSA+PiAzMikgJiAweEZGRkY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRjdHgtPmN1cl9ieXRlID09IDI2KSB7CisgICAgICAgICAgICAgICAgZGN0eC0+dyA9IChzdGF0ZSA+PiAzMikgJiAweEZGRkY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRjdHgtPmN1cl9ieXRlID09IDQyKSB7CisgICAgICAgICAgICAgICAgaW50IGNpZCA9IChzdGF0ZSA+PiAzMikgJiAweEZGRkZGRkZGOworICAgICAgICAgICAgICAgIGludCByZW1haW5pbmc7CisKKyAgICAgICAgICAgICAgICBpZiAoY2lkIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gYXZwcml2X2RueGhkX2dldF9mcmFtZV9zaXplKGNpZCk7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IGZmX2RueGhkX2dldF9ocl9mcmFtZV9zaXplKGNpZCwgZGN0eC0+dywgZGN0eC0+aCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkY3R4LT5yZW1haW5pbmcgPSByZW1haW5pbmc7CisgICAgICAgICAgICAgICAgaWYgKGJ1Zl9zaXplIC0gaSArIDQ3ID49IGRjdHgtPnJlbWFpbmluZykgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmVtYWluaW5nID0gZGN0eC0+cmVtYWluaW5nOworCiAgICAgICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIHBjLT5zdGF0ZTY0ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGRjdHgtPmludGVybGFjZWQgPSBpbnRlcmxhY2VkOwotICAgICAgICAgICAgICAgICAgICBkY3R4LT5jdXJfZmllbGQgPSAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSAtIDU7CisgICAgICAgICAgICAgICAgICAgIGRjdHgtPmN1cl9ieXRlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZGN0eC0+cmVtYWluaW5nID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbWFpbmluZzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiBjb250aW51ZSwgdG8gZ2V0IHRoZSBzZWNvbmQgZmllbGQgKi8KLSAgICAgICAgICAgICAgICAgICAgZGN0eC0+aW50ZXJsYWNlZCA9IGludGVybGFjZWQgPSAoc3RhdGUmMik+PjE7Ci0gICAgICAgICAgICAgICAgICAgIGRjdHgtPmN1cl9maWVsZCA9IGN1cl9maWVsZCA9IHN0YXRlJjE7CisgICAgICAgICAgICAgICAgICAgIGRjdHgtPnJlbWFpbmluZyAtPSBidWZfc2l6ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHBpY19mb3VuZCkgeworICAgICAgICBpZiAoZGN0eC0+cmVtYWluaW5nID4gYnVmX3NpemUpIHsKKyAgICAgICAgICAgIGRjdHgtPnJlbWFpbmluZyAtPSBidWZfc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCByZW1haW5pbmcgPSBkY3R4LT5yZW1haW5pbmc7CisKKyAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CisgICAgICAgICAgICBwYy0+c3RhdGU2NCA9IC0xOworICAgICAgICAgICAgZGN0eC0+Y3VyX2J5dGUgPSAwOworICAgICAgICAgICAgZGN0eC0+cmVtYWluaW5nID0gMDsKKyAgICAgICAgICAgIHJldHVybiByZW1haW5pbmc7CisgICAgICAgIH0KICAgICB9CiAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gcGljX2ZvdW5kOwogICAgIHBjLT5zdGF0ZTY0ID0gc3RhdGU7Ci0gICAgZGN0eC0+aW50ZXJsYWNlZCA9IGludGVybGFjZWQ7Ci0gICAgZGN0eC0+Y3VyX2ZpZWxkID0gY3VyX2ZpZWxkOwogICAgIHJldHVybiBFTkRfTk9UX0ZPVU5EOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RueGhkZGF0YS5jIGIvbGliYXZjb2RlYy9kbnhoZGRhdGEuYwppbmRleCA3ZDkzNWEzLi5lOWRkMjljIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RueGhkZGF0YS5jCisrKyBiL2xpYmF2Y29kZWMvZG54aGRkYXRhLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiZG54aGRkYXRhLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKIAogLyogVGhlIHF1YW50aXphdGlvbiB0YWJsZXMgYmVsb3cgYXJlIGluIHppZ3phZyBvcmRlciEgKi8KIApAQCAtMjM0LDYgKzIzMyw3IEBACiAgICAgMTE0LCAxMjgsIDEyNSwgMTI5LCAxMzQsIDEyNSwgMTE2LCAxMTYsCiB9OwogCisvKiBVc2VkIGluIENJRCAxMjQ0LCAxMjYwICovCiBzdGF0aWMgY29uc3QgdWludDhfdCBkbnhoZF8xMjYwX2x1bWFfd2VpZ2h0W10gPSB7CiAgICAgIDAsIDMyLCAzMywgMzQsIDM2LCAzNywgMzcsIDM2LAogICAgIDM0LCAzMywgMzQsIDM1LCAzNywgMzgsIDQwLCA0MSwKQEAgLTI0NSw2ICsyNDUsNyBAQAogICAgIDUyLCA1MywgNTMsIDUwLCA1MCwgNTQsIDU0LCA1NCwKIH07CiAKKy8qIFVzZWQgaW4gQ0lEIDEyNDQsIDEyNjAgKi8KIHN0YXRpYyBjb25zdCB1aW50OF90IGRueGhkXzEyNjBfY2hyb21hX3dlaWdodFtdID0gewogICAgICAwLCAzMiwgMzQsIDM4LCA0MiwgNDAsIDM4LCAzNiwKICAgICAzNSwgMzUsIDM4LCA0MiwgNDMsIDQzLCA0MiwgNDAsCkBAIC05MzgsODggKzkzOSw4NCBAQAogICAgICAgZG54aGRfMTIzNV9kY19jb2RlcywgZG54aGRfMTIzNV9kY19iaXRzLAogICAgICAgZG54aGRfMTIzNV9hY19jb2RlcywgZG54aGRfMTIzNV9hY19iaXRzLCBkbnhoZF8xMjM1X2FjX2luZm8sCiAgICAgICBkbnhoZF8xMjM1X3J1bl9jb2RlcywgZG54aGRfMTIzNV9ydW5fYml0cywgZG54aGRfMTIzNV9ydW4sCi0gICAgICB7IDE3NSwgMTg1LCAzNjUsIDQ0MCB9LAotICAgICAgeyB7IDI0MDAwLCAxMDAxIH0sIHsgMjUsIDEgfSwgeyA1MCwgMSB9LCB7IDYwMDAwLCAxMDAxIH0gfSB9LAorICAgICAgeyAxNzUsIDE4NSwgMzY1LCA0NDAgfSB9LAogICAgIHsgMTIzNywgMTkyMCwgMTA4MCwgNjA2MjA4LCA2MDYyMDgsCiAgICAgICAwLCA0LCA4LCAzLAogICAgICAgZG54aGRfMTIzN19sdW1hX3dlaWdodCwgZG54aGRfMTIzN19jaHJvbWFfd2VpZ2h0LAogICAgICAgZG54aGRfMTIzN19kY19jb2RlcywgZG54aGRfMTIzN19kY19iaXRzLAogICAgICAgZG54aGRfMTIzN19hY19jb2RlcywgZG54aGRfMTIzN19hY19iaXRzLCBkbnhoZF8xMjM3X2FjX2luZm8sCiAgICAgICBkbnhoZF8xMjM3X3J1bl9jb2RlcywgZG54aGRfMTIzN19ydW5fYml0cywgZG54aGRfMTIzN19ydW4sCi0gICAgICB7IDExNSwgMTIwLCAxNDUsIDI0MCwgMjkwIH0sCi0gICAgICB7IHsgMjQwMDAsIDEwMDEgfSwgeyAyNSwgMSB9LCB7IDMwMDAwLCAxMDAxIH0sIHsgNTAsIDEgfSwgeyA2MDAwMCwgMTAwMSB9IH0gfSwKKyAgICAgIHsgMTE1LCAxMjAsIDE0NSwgMjQwLCAyOTAgfSB9LAogICAgIHsgMTIzOCwgMTkyMCwgMTA4MCwgOTE3NTA0LCA5MTc1MDQsCiAgICAgICAwLCA0LCA4LCA0LAogICAgICAgZG54aGRfMTIzOF9sdW1hX3dlaWdodCwgZG54aGRfMTIzOF9jaHJvbWFfd2VpZ2h0LAogICAgICAgZG54aGRfMTIzN19kY19jb2RlcywgZG54aGRfMTIzN19kY19iaXRzLAogICAgICAgZG54aGRfMTIzOF9hY19jb2RlcywgZG54aGRfMTIzOF9hY19iaXRzLCBkbnhoZF8xMjM4X2FjX2luZm8sCiAgICAgICBkbnhoZF8xMjM1X3J1bl9jb2RlcywgZG54aGRfMTIzNV9ydW5fYml0cywgZG54aGRfMTIzOF9ydW4sCi0gICAgICB7IDE3NSwgMTg1LCAyMjAsIDM2NSwgNDQwIH0sCi0gICAgICB7IHsgMjQwMDAsIDEwMDEgfSwgeyAyNSwgMSB9LCB7IDMwMDAwLCAxMDAxIH0sIHsgNTAsIDEgfSwgeyA2MDAwMCwgMTAwMSB9IH0gfSwKKyAgICAgIHsgMTc1LCAxODUsIDIyMCwgMzY1LCA0NDAgfSB9LAogICAgIHsgMTI0MSwgMTkyMCwgMTA4MCwgOTE3NTA0LCA0NTg3NTIsCiAgICAgICBETlhIRF9JTlRFUkxBQ0VELCA2LCAxMCwgNCwKICAgICAgIGRueGhkXzEyNDFfbHVtYV93ZWlnaHQsIGRueGhkXzEyNDFfY2hyb21hX3dlaWdodCwKICAgICAgIGRueGhkXzEyMzVfZGNfY29kZXMsIGRueGhkXzEyMzVfZGNfYml0cywKICAgICAgIGRueGhkXzEyMzVfYWNfY29kZXMsIGRueGhkXzEyMzVfYWNfYml0cywgZG54aGRfMTIzNV9hY19pbmZvLAogICAgICAgZG54aGRfMTIzNV9ydW5fY29kZXMsIGRueGhkXzEyMzVfcnVuX2JpdHMsIGRueGhkXzEyMzVfcnVuLAotICAgICAgeyAxODUsIDIyMCB9LAotICAgICAgeyB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSB9IH0sCisgICAgICB7IDE4NSwgMjIwIH0gfSwKICAgICB7IDEyNDIsIDE5MjAsIDEwODAsIDYwNjIwOCwgMzAzMTA0LAogICAgICAgRE5YSERfSU5URVJMQUNFRCwgNCwgOCwgMywKICAgICAgIGRueGhkXzEyNDJfbHVtYV93ZWlnaHQsIGRueGhkXzEyNDJfY2hyb21hX3dlaWdodCwKICAgICAgIGRueGhkXzEyMzdfZGNfY29kZXMsIGRueGhkXzEyMzdfZGNfYml0cywKICAgICAgIGRueGhkXzEyMzdfYWNfY29kZXMsIGRueGhkXzEyMzdfYWNfYml0cywgZG54aGRfMTIzN19hY19pbmZvLAogICAgICAgZG54aGRfMTIzN19ydW5fY29kZXMsIGRueGhkXzEyMzdfcnVuX2JpdHMsIGRueGhkXzEyMzdfcnVuLAotICAgICAgeyAxMjAsIDE0NSB9LAotICAgICAgeyB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSB9IH0sCisgICAgICB7IDEyMCwgMTQ1IH0gfSwKICAgICB7IDEyNDMsIDE5MjAsIDEwODAsIDkxNzUwNCwgNDU4NzUyLAogICAgICAgRE5YSERfSU5URVJMQUNFRCwgNCwgOCwgNCwKICAgICAgIGRueGhkXzEyNDNfbHVtYV93ZWlnaHQsIGRueGhkXzEyNDNfY2hyb21hX3dlaWdodCwKICAgICAgIGRueGhkXzEyMzdfZGNfY29kZXMsIGRueGhkXzEyMzdfZGNfYml0cywKICAgICAgIGRueGhkXzEyMzhfYWNfY29kZXMsIGRueGhkXzEyMzhfYWNfYml0cywgZG54aGRfMTIzOF9hY19pbmZvLAogICAgICAgZG54aGRfMTIzNV9ydW5fY29kZXMsIGRueGhkXzEyMzVfcnVuX2JpdHMsIGRueGhkXzEyMzhfcnVuLAotICAgICAgeyAxODUsIDIyMCB9LAotICAgICAgeyB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSB9IH0sCisgICAgICB7IDE4NSwgMjIwIH0gfSwKKyAgICB7IDEyNDQsIDE0NDAsIDEwODAsIDYwNjIwOCwgMzAzMTA0LAorICAgICAgRE5YSERfSU5URVJMQUNFRCwgNCwgOCwgMywKKyAgICAgIGRueGhkXzEyNjBfbHVtYV93ZWlnaHQsIGRueGhkXzEyNjBfY2hyb21hX3dlaWdodCwKKyAgICAgIGRueGhkXzEyMzdfZGNfY29kZXMsIGRueGhkXzEyMzdfZGNfYml0cywKKyAgICAgIGRueGhkXzEyMzdfYWNfY29kZXMsIGRueGhkXzEyMzdfYWNfYml0cywgZG54aGRfMTIzN19hY19pbmZvLAorICAgICAgZG54aGRfMTIzN19ydW5fY29kZXMsIGRueGhkXzEyMzdfcnVuX2JpdHMsIGRueGhkXzEyMzdfcnVuLAorICAgICAgeyAxMjAsIDE0NSB9IH0sCiAgICAgeyAxMjUwLCAxMjgwLCAgNzIwLCA0NTg3NTIsIDQ1ODc1MiwKICAgICAgIDAsIDYsIDEwLCA0LAogICAgICAgZG54aGRfMTI1MF9sdW1hX3dlaWdodCwgZG54aGRfMTI1MF9jaHJvbWFfd2VpZ2h0LAogICAgICAgZG54aGRfMTIzNV9kY19jb2RlcywgZG54aGRfMTIzNV9kY19iaXRzLAogICAgICAgZG54aGRfMTI1MF9hY19jb2RlcywgZG54aGRfMTI1MF9hY19iaXRzLCBkbnhoZF8xMjUwX2FjX2luZm8sCiAgICAgICBkbnhoZF8xMjUwX3J1bl9jb2RlcywgZG54aGRfMTI1MF9ydW5fYml0cywgZG54aGRfMTI1MF9ydW4sCi0gICAgICB7IDkwLCA5MCwgMTgwLCAyMjAgfSwKLSAgICAgIHsgeyAyNDAwMCwgMTAwMSB9LCB7IDI1LCAxIH0sIHsgNTAsIDEgfSwgeyA2MDAwMCwgMTAwMSB9IH0gfSwKKyAgICAgIHsgOTAsIDE4MCwgMjIwIH0gfSwKICAgICB7IDEyNTEsIDEyODAsICA3MjAsIDQ1ODc1MiwgNDU4NzUyLAogICAgICAgMCwgNCwgOCwgNCwKICAgICAgIGRueGhkXzEyNTFfbHVtYV93ZWlnaHQsIGRueGhkXzEyNTFfY2hyb21hX3dlaWdodCwKICAgICAgIGRueGhkXzEyMzdfZGNfY29kZXMsIGRueGhkXzEyMzdfZGNfYml0cywKICAgICAgIGRueGhkXzEyNTFfYWNfY29kZXMsIGRueGhkXzEyNTFfYWNfYml0cywgZG54aGRfMTI1MV9hY19pbmZvLAogICAgICAgZG54aGRfMTI1MF9ydW5fY29kZXMsIGRueGhkXzEyNTBfcnVuX2JpdHMsIGRueGhkXzEyNTBfcnVuLAotICAgICAgeyA5MCwgOTAsIDExMCwgMTgwLCAyMjAgfSwKLSAgICAgIHsgeyAyNDAwMCwgMTAwMSB9LCB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSwgeyA1MCwgMSB9LCB7IDYwMDAwLCAxMDAxIH0gfSB9LAorICAgICAgeyA5MCwgMTEwLCAxODAsIDIyMCB9IH0sCiAgICAgeyAxMjUyLCAxMjgwLCAgNzIwLCAzMDMxMDQsIDMwMzEwNCwKICAgICAgIDAsIDQsIDgsIDUsCiAgICAgICBkbnhoZF8xMjUyX2x1bWFfd2VpZ2h0LCBkbnhoZF8xMjUyX2Nocm9tYV93ZWlnaHQsCiAgICAgICBkbnhoZF8xMjM3X2RjX2NvZGVzLCBkbnhoZF8xMjM3X2RjX2JpdHMsCiAgICAgICBkbnhoZF8xMjUyX2FjX2NvZGVzLCBkbnhoZF8xMjUyX2FjX2JpdHMsIGRueGhkXzEyNTJfYWNfaW5mbywKICAgICAgIGRueGhkXzEyNTBfcnVuX2NvZGVzLCBkbnhoZF8xMjUwX3J1bl9iaXRzLCBkbnhoZF8xMjUwX3J1biwKLSAgICAgIHsgNjAsIDYwLCA3NSwgMTIwLCAxNDUgfSwKLSAgICAgIHsgeyAyNDAwMCwgMTAwMSB9LCB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSwgeyA1MCwgMSB9LCB7IDYwMDAwLCAxMDAxIH0gfSB9LAorICAgICAgeyA2MCwgNzUsIDEyMCwgMTQ1IH0gfSwKICAgICB7IDEyNTMsIDE5MjAsIDEwODAsIDE4ODQxNiwgMTg4NDE2LAogICAgICAgMCwgNCwgOCwgMywKICAgICAgIGRueGhkXzEyMzdfbHVtYV93ZWlnaHQsIGRueGhkXzEyMzdfY2hyb21hX3dlaWdodCwKICAgICAgIGRueGhkXzEyMzdfZGNfY29kZXMsIGRueGhkXzEyMzdfZGNfYml0cywKICAgICAgIGRueGhkXzEyMzdfYWNfY29kZXMsIGRueGhkXzEyMzdfYWNfYml0cywgZG54aGRfMTIzN19hY19pbmZvLAogICAgICAgZG54aGRfMTIzN19ydW5fY29kZXMsIGRueGhkXzEyMzdfcnVuX2JpdHMsIGRueGhkXzEyMzdfcnVuLAotICAgICAgeyAzNiwgMzYsIDQ1LCA3NSwgOTAgfSwKLSAgICAgIHsgeyAyNDAwMCwgMTAwMSB9LCB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSwgeyA1MCwgMSB9LCB7IDYwMDAwLCAxMDAxIH0gfSB9LAorICAgICAgeyAzNiwgNDUsIDc1LCA5MCB9IH0sCiAgICAgeyAxMjU2LCAxOTIwLCAxMDgwLCAxODM1MDA4LCAxODM1MDA4LAogICAgICAgRE5YSERfNDQ0LCA2LCAxMCwgNCwKICAgICAgIGRueGhkXzEyMzVfbHVtYV93ZWlnaHQsIGRueGhkXzEyMzVfbHVtYV93ZWlnaHQsCiAgICAgICBkbnhoZF8xMjM1X2RjX2NvZGVzLCBkbnhoZF8xMjM1X2RjX2JpdHMsCiAgICAgICBkbnhoZF8xMjM1X2FjX2NvZGVzLCBkbnhoZF8xMjM1X2FjX2JpdHMsIGRueGhkXzEyMzVfYWNfaW5mbywKICAgICAgIGRueGhkXzEyMzVfcnVuX2NvZGVzLCBkbnhoZF8xMjM1X3J1bl9iaXRzLCBkbnhoZF8xMjM1X3J1biwKLSAgICAgIHsgMzUwLCAzOTAsIDQ0MCwgNzMwLCA4ODAgfSwKLSAgICAgIHsgeyAyNDAwMCwgMTAwMSB9LCB7IDI1LCAxIH0sIHsgMzAwMDAsIDEwMDEgfSwgeyA1MCwgMSB9LCB7IDYwMDAwLCAxMDAxIH0gfSB9LAorICAgICAgeyAzNTAsIDM5MCwgNDQwLCA3MzAsIDg4MCB9IH0sCiAgICAgeyAxMjU4LCA5NjAsIDcyMCwgMjEyOTkyLCAyMTI5OTIsCiAgICAgICAwLCA0LCA4LCA1LAogICAgICAgZG54aGRfMTI1Ml9sdW1hX3dlaWdodCwgZG54aGRfMTI1Ml9jaHJvbWFfd2VpZ2h0LApAQCAtMTA0NywzNSArMTA0NCwzNSBAQAogICAgICAgZG54aGRfMTIzNV9kY19jb2RlcywgZG54aGRfMTIzNV9kY19iaXRzLAogICAgICAgZG54aGRfMTIzNV9hY19jb2RlcywgZG54aGRfMTIzNV9hY19iaXRzLCBkbnhoZF8xMjM1X2FjX2luZm8sCiAgICAgICBkbnhoZF8xMjM1X3J1bl9jb2RlcywgZG54aGRfMTIzNV9ydW5fYml0cywgZG54aGRfMTIzNV9ydW4sCi0gICAgICB7IDAgfSB9LAorICAgICAgeyAwIH0sIHsgNTczNDQsIDI1NX0gfSwKICAgICB7IDEyNzEsIEROWEhEX1ZBUklBQkxFLCBETlhIRF9WQVJJQUJMRSwgRE5YSERfVkFSSUFCTEUsIEROWEhEX1ZBUklBQkxFLAogICAgICAgMCwgNiwgRE5YSERfVkFSSUFCTEUsIDQsCiAgICAgICBkbnhoZF8xMjQxX2x1bWFfd2VpZ2h0LCBkbnhoZF8xMjQxX2Nocm9tYV93ZWlnaHQsCiAgICAgICBkbnhoZF8xMjM1X2RjX2NvZGVzLCBkbnhoZF8xMjM1X2RjX2JpdHMsCiAgICAgICBkbnhoZF8xMjM1X2FjX2NvZGVzLCBkbnhoZF8xMjM1X2FjX2JpdHMsIGRueGhkXzEyMzVfYWNfaW5mbywKICAgICAgIGRueGhkXzEyMzVfcnVuX2NvZGVzLCBkbnhoZF8xMjM1X3J1bl9iaXRzLCBkbnhoZF8xMjM1X3J1biwKLSAgICAgIHsgMCB9IH0sCisgICAgICB7IDAgfSwgeyAyODY3MiwgMjU1fSB9LAogICAgIHsgMTI3MiwgRE5YSERfVkFSSUFCTEUsIEROWEhEX1ZBUklBQkxFLCBETlhIRF9WQVJJQUJMRSwgRE5YSERfVkFSSUFCTEUsCiAgICAgICAwLCA0LCA4LCA0LAogICAgICAgZG54aGRfMTIzOF9sdW1hX3dlaWdodCwgZG54aGRfMTIzOF9jaHJvbWFfd2VpZ2h0LAogICAgICAgZG54aGRfMTIzN19kY19jb2RlcywgZG54aGRfMTIzN19kY19iaXRzLAogICAgICAgZG54aGRfMTIzOF9hY19jb2RlcywgZG54aGRfMTIzOF9hY19iaXRzLCBkbnhoZF8xMjM4X2FjX2luZm8sCiAgICAgICBkbnhoZF8xMjM1X3J1bl9jb2RlcywgZG54aGRfMTIzNV9ydW5fYml0cywgZG54aGRfMTIzOF9ydW4sCi0gICAgICB7IDAgfSB9LAorICAgICAgeyAwIH0sIHsgMjg2NzIsIDI1NX0gfSwKICAgICB7IDEyNzMsIEROWEhEX1ZBUklBQkxFLCBETlhIRF9WQVJJQUJMRSwgRE5YSERfVkFSSUFCTEUsIEROWEhEX1ZBUklBQkxFLAogICAgICAgMCwgNCwgOCwgMywKICAgICAgIGRueGhkXzEyMzdfbHVtYV93ZWlnaHQsIGRueGhkXzEyMzdfY2hyb21hX3dlaWdodCwKICAgICAgIGRueGhkXzEyMzdfZGNfY29kZXMsIGRueGhkXzEyMzdfZGNfYml0cywKICAgICAgIGRueGhkXzEyMzdfYWNfY29kZXMsIGRueGhkXzEyMzdfYWNfYml0cywgZG54aGRfMTIzN19hY19pbmZvLAogICAgICAgZG54aGRfMTIzN19ydW5fY29kZXMsIGRueGhkXzEyMzdfcnVuX2JpdHMsIGRueGhkXzEyMzdfcnVuLAotICAgICAgeyAwIH0gfSwKKyAgICAgIHsgMCB9LCB7IDE4OTQ0LCAyNTV9IH0sCiAgICAgeyAxMjc0LCBETlhIRF9WQVJJQUJMRSwgRE5YSERfVkFSSUFCTEUsIEROWEhEX1ZBUklBQkxFLCBETlhIRF9WQVJJQUJMRSwKICAgICAgIDAsIDQsIDgsIDMsCiAgICAgICBkbnhoZF8xMjM3X2x1bWFfd2VpZ2h0LCBkbnhoZF8xMjM3X2Nocm9tYV93ZWlnaHQsCiAgICAgICBkbnhoZF8xMjM3X2RjX2NvZGVzLCBkbnhoZF8xMjM3X2RjX2JpdHMsCiAgICAgICBkbnhoZF8xMjM3X2FjX2NvZGVzLCBkbnhoZF8xMjM3X2FjX2JpdHMsIGRueGhkXzEyMzdfYWNfaW5mbywKICAgICAgIGRueGhkXzEyMzdfcnVuX2NvZGVzLCBkbnhoZF8xMjM3X3J1bl9iaXRzLCBkbnhoZF8xMjM3X3J1biwKLSAgICAgIHsgMCB9IH0sCisgICAgICB7IDAgfSwgeyA1ODg4LCAyNTV9IH0sCiB9OwogCiBpbnQgZmZfZG54aGRfZ2V0X2NpZF90YWJsZShpbnQgY2lkKQpAQCAtMTEwMywxNyArMTEwMCwzMSBAQAogICAgIHJldHVybiBmZl9kbnhoZF9jaWRfdGFibGVbaV0uZmxhZ3MgJiBETlhIRF9JTlRFUkxBQ0VEID8gMSA6IDA7CiB9CiAKLXVpbnQ2NF90IGF2cHJpdl9kbnhoZF9wYXJzZV9oZWFkZXJfcHJlZml4KGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3N0YXRpYyBpbnQgZG54aGRfZmluZF9ocl9jaWQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIHVpbnQ2NF90IHByZWZpeCA9IEFWX1JCMzIoYnVmKTsKLSAgICBwcmVmaXggPSAocHJlZml4IDw8IDE2KSB8IGJ1Zls0XSA8PCA4OwotICAgIHJldHVybiBmZl9kbnhoZF9jaGVja19oZWFkZXJfcHJlZml4KHByZWZpeCk7CisgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSkgeworICAgIGNhc2UgRkZfUFJPRklMRV9ETlhIUl80NDQ6CisgICAgICAgIHJldHVybiAxMjcwOworICAgIGNhc2UgRkZfUFJPRklMRV9ETlhIUl9IUVg6CisgICAgICAgIHJldHVybiAxMjcxOworICAgIGNhc2UgRkZfUFJPRklMRV9ETlhIUl9IUToKKyAgICAgICAgcmV0dXJuIDEyNzI7CisgICAgY2FzZSBGRl9QUk9GSUxFX0ROWEhSX1NROgorICAgICAgICByZXR1cm4gMTI3MzsKKyAgICBjYXNlIEZGX1BST0ZJTEVfRE5YSFJfTEI6CisgICAgICAgIHJldHVybiAxMjc0OworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogaW50IGZmX2RueGhkX2ZpbmRfY2lkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGJpdF9kZXB0aCkKIHsKICAgICBpbnQgaSwgajsKICAgICBpbnQgbWJzID0gYXZjdHgtPmJpdF9yYXRlIC8gMTAwMDAwMDsKKworICAgIGlmIChhdmN0eC0+cHJvZmlsZSAhPSBGRl9QUk9GSUxFX0ROWEhEKQorICAgICAgICByZXR1cm4gZG54aGRfZmluZF9ocl9jaWQoYXZjdHgpOworCiAgICAgaWYgKCFtYnMpCiAgICAgICAgIHJldHVybiAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhmZl9kbnhoZF9jaWRfdGFibGUpOyBpKyspIHsKQEAgLTExNDUsOSArMTE1Niw5IEBACiAgICAgICAgICAgICBpZiAoIWNpZC0+Yml0X3JhdGVzW2pdKQogICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIGxvZ2xldmVsLCAiRnJhbWUgc2l6ZTogJWR4JWQlYzsgYml0cmF0ZTogJWRNYnBzOyBwaXhlbCBmb3JtYXQ6ICVzOyBmcmFtZXJhdGU6ICVkLyVkXG4iLAorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBsb2dsZXZlbCwgIkZyYW1lIHNpemU6ICVkeCVkJWM7IGJpdHJhdGU6ICVkTWJwczsgcGl4ZWwgZm9ybWF0OiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBjaWQtPndpZHRoLCBjaWQtPmhlaWdodCwgY2lkLT5mbGFncyAmIEROWEhEX0lOVEVSTEFDRUQgPyAnaScgOiAncCcsIGNpZC0+Yml0X3JhdGVzW2pdLAotICAgICAgICAgICAgICAgICAgIGNpZC0+Yml0X2RlcHRoID09IDEwID8gInl1djQyMnAxMCIgOiAieXV2NDIycCIsIGNpZC0+ZnJhbWVfcmF0ZXNbal0ubnVtLCBjaWQtPmZyYW1lX3JhdGVzW2pdLmRlbik7CisgICAgICAgICAgICAgICAgICAgY2lkLT5mbGFncyAmIEROWEhEXzQ0NCA/ICJ5dXY0NDRwMTAsIGdicnAxMCIgOiBjaWQtPmJpdF9kZXB0aCA9PSAxMCA/ICJ5dXY0MjJwMTAiIDogInl1djQyMnAiKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZG54aGRkYXRhLmggYi9saWJhdmNvZGVjL2RueGhkZGF0YS5oCmluZGV4IDNhZTQ2ODMuLmY4MGNlMTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZG54aGRkYXRhLmgKKysrIGIvbGliYXZjb2RlYy9kbnhoZGRhdGEuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAKIC8qKiBBZGRpdGlvbmFsIHByb2ZpbGUgaW5mbyBmbGFncyAqLwogI2RlZmluZSBETlhIRF9JTlRFUkxBQ0VEICAgKDE8PDApCkBAIC0zNCw4ICszNSw2IEBACiAvKiogRnJhbWUgaGVhZGVycywgZXh0cmEgMHgwMCBhZGRlZCB0byBlbmQgZm9yIHBhcnNlciAqLwogI2RlZmluZSBETlhIRF9IRUFERVJfSU5JVElBTCAweDAwMDAwMjgwMDEwMAogI2RlZmluZSBETlhIRF9IRUFERVJfNDQ0ICAgICAweDAwMDAwMjgwMDIwMAotI2RlZmluZSBETlhIRF9IRUFERVJfSFIxICAgICAweDAwMDAwMjgwMDMwMAotI2RlZmluZSBETlhIRF9IRUFERVJfSFIyICAgICAweDAwMDAwMzhDMDMwMAogCiAvKiogSW5kaWNhdGUgdGhhdCBhIENJREVudHJ5IHZhbHVlIG11c3QgYmUgcmVhZCBpbiB0aGUgYml0c3RyZWFtICovCiAjZGVmaW5lIEROWEhEX1ZBUklBQkxFIDAKQEAgLTU2LDcgKzU1LDcgQEAKICAgICBjb25zdCB1aW50MTZfdCAqcnVuX2NvZGVzOwogICAgIGNvbnN0IHVpbnQ4X3QgKnJ1bl9iaXRzLCAqcnVuOwogICAgIGludCBiaXRfcmF0ZXNbNV07IC8vLzwgSGVscGVyIHRvIGNob29zZSB2YXJpYW50cywgcm91bmRlZCB0byBuZWFyZXN0IDVNYi9zCi0gICAgQVZSYXRpb25hbCBmcmFtZV9yYXRlc1s1XTsKKyAgICBBVlJhdGlvbmFsIHBhY2tldF9zY2FsZTsKIH0gQ0lERW50cnk7CiAKIGV4dGVybiBjb25zdCBDSURFbnRyeSBmZl9kbnhoZF9jaWRfdGFibGVbXTsKQEAgLTY1LDE3ICs2NCw0NiBAQAogaW50IGZmX2RueGhkX2ZpbmRfY2lkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGJpdF9kZXB0aCk7CiB2b2lkIGZmX2RueGhkX3ByaW50X3Byb2ZpbGVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGxvZ2xldmVsKTsKIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDY0X3QgZmZfZG54aGRfY2hlY2tfaGVhZGVyX3ByZWZpeCh1aW50NjRfdCBwcmVmaXgpCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50NjRfdCBmZl9kbnhoZF9jaGVja19oZWFkZXJfcHJlZml4X2hyKHVpbnQ2NF90IHByZWZpeCkKIHsKLSAgICBpZiAocHJlZml4ID09IEROWEhEX0hFQURFUl9JTklUSUFMIHx8Ci0gICAgICAgIHByZWZpeCA9PSBETlhIRF9IRUFERVJfNDQ0ICAgICB8fAotICAgICAgICBwcmVmaXggPT0gRE5YSERfSEVBREVSX0hSMSAgICAgfHwKLSAgICAgICAgcHJlZml4ID09IEROWEhEX0hFQURFUl9IUjIpCisgICAgdWludDY0X3QgZGF0YV9vZmZzZXQgPSBwcmVmaXggPj4gMTY7CisgICAgaWYgKChwcmVmaXggJiAweEZGRkYwMDAwRkZGRkxMKSA9PSAweDAzMDAgJiYKKyAgICAgICAgIGRhdGFfb2Zmc2V0ID49IDB4MDI4MCAmJiBkYXRhX29mZnNldCA8PSAweDIxNzAgJiYKKyAgICAgICAgIChkYXRhX29mZnNldCAmIDMpID09IDApCiAgICAgICAgIHJldHVybiBwcmVmaXg7CiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ2NF90IGZmX2RueGhkX2NoZWNrX2hlYWRlcl9wcmVmaXgodWludDY0X3QgcHJlZml4KQoreworICAgIGlmIChwcmVmaXggPT0gRE5YSERfSEVBREVSX0lOSVRJQUwgfHwKKyAgICAgICAgcHJlZml4ID09IEROWEhEX0hFQURFUl80NDQgICAgIHx8CisgICAgICAgIGZmX2RueGhkX2NoZWNrX2hlYWRlcl9wcmVmaXhfaHIocHJlZml4KSkKKyAgICAgICAgcmV0dXJuIHByZWZpeDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDY0X3QgZmZfZG54aGRfcGFyc2VfaGVhZGVyX3ByZWZpeChjb25zdCB1aW50OF90ICpidWYpCit7CisgICAgdWludDY0X3QgcHJlZml4ID0gQVZfUkIzMihidWYpOworICAgIHByZWZpeCA9IChwcmVmaXggPDwgMTYpIHwgYnVmWzRdIDw8IDg7CisgICAgcmV0dXJuIGZmX2RueGhkX2NoZWNrX2hlYWRlcl9wcmVmaXgocHJlZml4KTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGZmX2RueGhkX2dldF9ocl9mcmFtZV9zaXplKGludCBjaWQsIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgcmVzdWx0LCBpID0gZmZfZG54aGRfZ2V0X2NpZF90YWJsZShjaWQpOworCisgICAgaWYgKGkgPCAwKQorICAgICAgICByZXR1cm4gaTsKKworICAgIHJlc3VsdCA9ICgoaCArIDE1KSAvIDE2KSAqICgodyArIDE1KSAvIDE2KSAqIChpbnQ2NF90KWZmX2RueGhkX2NpZF90YWJsZVtpXS5wYWNrZXRfc2NhbGUubnVtIC8gZmZfZG54aGRfY2lkX3RhYmxlW2ldLnBhY2tldF9zY2FsZS5kZW47CisgICAgcmVzdWx0ID0gKHJlc3VsdCArIDIwNDgpIC8gNDA5NiAqIDQwOTY7CisKKyAgICByZXR1cm4gRkZNQVgocmVzdWx0LCA4MTkyKTsKK30KKwogaW50IGF2cHJpdl9kbnhoZF9nZXRfZnJhbWVfc2l6ZShpbnQgY2lkKTsKIGludCBhdnByaXZfZG54aGRfZ2V0X2ludGVybGFjZWQoaW50IGNpZCk7Ci11aW50NjRfdCBhdnByaXZfZG54aGRfcGFyc2VfaGVhZGVyX3ByZWZpeChjb25zdCB1aW50OF90ICpidWYpOworCiAjZW5kaWYgLyogQVZDT0RFQ19ETlhIRERBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kbnhoZGRlYy5jIGIvbGliYXZjb2RlYy9kbnhoZGRlYy5jCmluZGV4IDE4MDgwODAuLjExZDBiZjQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZG54aGRkZWMuYworKysgYi9saWJhdmNvZGVjL2RueGhkZGVjLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJkbnhoZGRhdGEuaCIKICNpbmNsdWRlICJpZGN0ZHNwLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwcm9maWxlcy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogCiB0eXBlZGVmIHN0cnVjdCBSb3dDb250ZXh0IHsKQEAgLTU3LDcgKzU4LDcgQEAKICAgICB1bnNpZ25lZCBpbnQgd2lkdGgsIGhlaWdodDsKICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKICAgICB1bnNpZ25lZCBpbnQgbWJfd2lkdGgsIG1iX2hlaWdodDsKLSAgICB1aW50MzJfdCBtYl9zY2FuX2luZGV4WzI1Nl07CisgICAgdWludDMyX3QgbWJfc2Nhbl9pbmRleFs1MTJdOwogICAgIGludCBkYXRhX29mZnNldDsgICAgICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBtYl9zY2FuX2luZGV4LCB3aGVyZSBtYWNyb2Jsb2NrcyBzdGFydAogICAgIGludCBjdXJfZmllbGQ7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBpbnRlcmxhY2VkIGZpZWxkCiAgICAgVkxDIGFjX3ZsYywgZGNfdmxjLCBydW5fdmxjOwpAQCAtOTIsNyArOTMsOSBAQAogCiAgICAgY3R4LT5hdmN0eCA9IGF2Y3R4OwogICAgIGN0eC0+Y2lkID0gLTE7Ci0gICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgaWYgKGF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19VTlNQRUNJRklFRCkgeworICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDcwOTsKKyAgICB9CiAKICAgICBhdmN0eC0+Y29kZWRfd2lkdGggID0gRkZBTElHTihhdmN0eC0+d2lkdGgsICAxNik7CiAgICAgYXZjdHgtPmNvZGVkX2hlaWdodCA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgMTYpOwpAQCAtMTEwLDcgKzExMyw3IEBACiAgICAgICAgIGludCBpbmRleDsKIAogICAgICAgICBpZiAoKGluZGV4ID0gZmZfZG54aGRfZ2V0X2NpZF90YWJsZShjaWQpKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBjaWQgJWRcbiIsIGNpZCk7CisgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY2lkICUiUFJJdTMyIlxuIiwgY2lkKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZmX2RueGhkX2NpZF90YWJsZVtpbmRleF0uYml0X2RlcHRoICE9IGJpdGRlcHRoICYmCkBAIC0xMTgsMTMgKzEyMSw4IEBACiAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0IGRlcHRoIG1pc21hdGNoZXMgJWQgJWRcbiIsIGZmX2RueGhkX2NpZF90YWJsZVtpbmRleF0uYml0X2RlcHRoLCBiaXRkZXB0aCk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQotICAgICAgICBpZiAoYml0ZGVwdGggPiAxMCkgewotICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGN0eC0+YXZjdHgsICJETlhIUiAxMi1iaXQiKTsKLSAgICAgICAgICAgIGlmIChjdHgtPmF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Ci0gICAgICAgIH0KICAgICAgICAgY3R4LT5jaWRfdGFibGUgPSAmZmZfZG54aGRfY2lkX3RhYmxlW2luZGV4XTsKLSAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiUHJvZmlsZSBjaWQgJWQuXG4iLCBjaWQpOworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJQcm9maWxlIGNpZCAlIlBSSXUzMiIuXG4iLCBjaWQpOwogCiAgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmFjX3ZsYyk7CiAgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmRjX3ZsYyk7CkBAIC0xMzMsNyArMTMxLDcgQEAKICAgICAgICAgaW5pdF92bGMoJmN0eC0+YWNfdmxjLCBETlhIRF9WTENfQklUUywgMjU3LAogICAgICAgICAgICAgICAgICBjdHgtPmNpZF90YWJsZS0+YWNfYml0cywgMSwgMSwKICAgICAgICAgICAgICAgICAgY3R4LT5jaWRfdGFibGUtPmFjX2NvZGVzLCAyLCAyLCAwKTsKLSAgICAgICAgaW5pdF92bGMoJmN0eC0+ZGNfdmxjLCBETlhIRF9EQ19WTENfQklUUywgYml0ZGVwdGggKyA0LAorICAgICAgICBpbml0X3ZsYygmY3R4LT5kY192bGMsIEROWEhEX0RDX1ZMQ19CSVRTLCBiaXRkZXB0aCA+IDggPyAxNCA6IDEyLAogICAgICAgICAgICAgICAgICBjdHgtPmNpZF90YWJsZS0+ZGNfYml0cywgMSwgMSwKICAgICAgICAgICAgICAgICAgY3R4LT5jaWRfdGFibGUtPmRjX2NvZGVzLCAxLCAxLCAwKTsKICAgICAgICAgaW5pdF92bGMoJmN0eC0+cnVuX3ZsYywgRE5YSERfVkxDX0JJVFMsIDYyLApAQCAtMTQ5LDYgKzE0Nyw3IEBACiB7CiAgICAgRE5YSERDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogCisgICAgY3R4LT5hdmN0eCA9IGF2Y3R4OwogICAgIC8vIG1ha2Ugc3VyZSBWTEMgdGFibGVzIHdpbGwgYmUgbG9hZGVkIHdoZW4gY2lkIGlzIHBhcnNlZAogICAgIGN0eC0+Y2lkID0gLTE7CiAKQEAgLTE1OSw2ICsxNTgsMjMgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkbnhoZF9nZXRfcHJvZmlsZShpbnQgY2lkKQoreworICAgIHN3aXRjaChjaWQpIHsKKyAgICBjYXNlIDEyNzA6CisgICAgICAgIHJldHVybiBGRl9QUk9GSUxFX0ROWEhSXzQ0NDsKKyAgICBjYXNlIDEyNzE6CisgICAgICAgIHJldHVybiBGRl9QUk9GSUxFX0ROWEhSX0hRWDsKKyAgICBjYXNlIDEyNzI6CisgICAgICAgIHJldHVybiBGRl9QUk9GSUxFX0ROWEhSX0hROworICAgIGNhc2UgMTI3MzoKKyAgICAgICAgcmV0dXJuIEZGX1BST0ZJTEVfRE5YSFJfU1E7CisgICAgY2FzZSAxMjc0OgorICAgICAgICByZXR1cm4gRkZfUFJPRklMRV9ETlhIUl9MQjsKKyAgICB9CisgICAgcmV0dXJuIEZGX1BST0ZJTEVfRE5YSEQ7Cit9CisKIHN0YXRpYyBpbnQgZG54aGRfZGVjb2RlX2hlYWRlcihETlhIRENvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X2ZpZWxkKQpAQCAtMTcyLDcgKzE4OCw3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGhlYWRlcl9wcmVmaXggPSBhdnByaXZfZG54aGRfcGFyc2VfaGVhZGVyX3ByZWZpeChidWYpOworICAgIGhlYWRlcl9wcmVmaXggPSBmZl9kbnhoZF9wYXJzZV9oZWFkZXJfcHJlZml4KGJ1Zik7CiAgICAgaWYgKGhlYWRlcl9wcmVmaXggPT0gMCkgewogICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgInVua25vd24gaGVhZGVyIDB4JTAyWCAweCUwMlggMHglMDJYIDB4JTAyWCAweCUwMlhcbiIsCkBAIC0yMDQsNiArMjIwLDkgQEAKICAgICB9CiAKICAgICBjaWQgPSBBVl9SQjMyKGJ1ZiArIDB4MjgpOworCisgICAgY3R4LT5hdmN0eC0+cHJvZmlsZSA9IGRueGhkX2dldF9wcm9maWxlKGNpZCk7CisKICAgICBpZiAoKHJldCA9IGRueGhkX2luaXRfdmxjKGN0eCwgY2lkLCBiaXRkZXB0aCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKICAgICBpZiAoY3R4LT5tYmFmZiAmJiBjdHgtPmNpZF90YWJsZS0+Y2lkICE9IDEyNjApCkBAIC0yMTgsNyArMjM3LDcgQEAKICAgICBjdHgtPmlzXzQ0NCA9IChidWZbMHgyQ10gPj4gNikgJiAxOwogICAgIGlmIChjdHgtPmlzXzQ0NCkgewogICAgICAgICBpZiAoYml0ZGVwdGggPT0gOCkgewotICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGN0eC0+YXZjdHgsICI0OjQ6NCA4IGJpdHNcbiIpOworICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGN0eC0+YXZjdHgsICI0OjQ6NCA4IGJpdHMiKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9IGVsc2UgaWYgKGJpdGRlcHRoID09IDEwKSB7CiAgICAgICAgICAgICBjdHgtPmRlY29kZV9kY3RfYmxvY2sgPSBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzEwXzQ0NDsKQEAgLTIzMyw3ICsyNTIsMTAgQEAKICAgICAgICAgY3R4LT5kZWNvZGVfZGN0X2Jsb2NrID0gZG54aGRfZGVjb2RlX2RjdF9ibG9ja18xMjsKICAgICAgICAgY3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTI7CiAgICAgfSBlbHNlIGlmIChiaXRkZXB0aCA9PSAxMCkgewotICAgICAgICBjdHgtPmRlY29kZV9kY3RfYmxvY2sgPSBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzEwOworICAgICAgICBpZiAoY3R4LT5hdmN0eC0+cHJvZmlsZSA9PSBGRl9QUk9GSUxFX0ROWEhSX0hRWCkKKyAgICAgICAgICAgIGN0eC0+ZGVjb2RlX2RjdF9ibG9jayA9IGRueGhkX2RlY29kZV9kY3RfYmxvY2tfMTBfNDQ0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBjdHgtPmRlY29kZV9kY3RfYmxvY2sgPSBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzEwOwogICAgICAgICBjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKICAgICB9IGVsc2UgewogICAgICAgICBjdHgtPmRlY29kZV9kY3RfYmxvY2sgPSBkbnhoZF9kZWNvZGVfZGN0X2Jsb2NrXzg7CkBAIC0yNTksMTMgKzI4MSwxMyBAQAogICAgIH0KIAogICAgIGlmIChidWZfc2l6ZSA8IGN0eC0+Y2lkX3RhYmxlLT5jb2RpbmdfdW5pdF9zaXplKSB7Ci0gICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbmNvcnJlY3QgZnJhbWUgc2l6ZSAoJWQgPCAlZCkuXG4iLAorICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW5jb3JyZWN0IGZyYW1lIHNpemUgKCVkIDwgJXUpLlxuIiwKICAgICAgICAgICAgICAgIGJ1Zl9zaXplLCBjdHgtPmNpZF90YWJsZS0+Y29kaW5nX3VuaXRfc2l6ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAogICAgIGN0eC0+bWJfd2lkdGggID0gKGN0eC0+d2lkdGggKyAxNSk+PiA0OwotICAgIGN0eC0+bWJfaGVpZ2h0ID0gYnVmWzB4MTZkXTsKKyAgICBjdHgtPm1iX2hlaWdodCA9IEFWX1JCMTYoYnVmICsgMHgxNmMpOwogCiAgICAgaWYgKChjdHgtPmhlaWdodCArIDE1KSA+PiA0ID09IGN0eC0+bWJfaGVpZ2h0ICYmIGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lKQogICAgICAgICBjdHgtPmhlaWdodCA8PD0gMTsKQEAgLTI3NSwxNyArMjk3LDIxIEBACiAgICAgICAgICAgIGN0eC0+Yml0X2RlcHRoLCBjdHgtPm1iYWZmLCBjdHgtPmFjdCk7CiAKICAgICAvLyBOZXdlciBmb3JtYXQgc3VwcG9ydHMgdmFyaWFibGUgbWJfc2Nhbl9pbmRleCBzaXplcwotICAgIGlmIChoZWFkZXJfcHJlZml4ID09IEROWEhEX0hFQURFUl9IUjIpIHsKKyAgICBpZiAoY3R4LT5tYl9oZWlnaHQgPiA2OCAmJiBmZl9kbnhoZF9jaGVja19oZWFkZXJfcHJlZml4X2hyKGhlYWRlcl9wcmVmaXgpKSB7CiAgICAgICAgIGN0eC0+ZGF0YV9vZmZzZXQgPSAweDE3MCArIChjdHgtPm1iX2hlaWdodCA8PCAyKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoY3R4LT5tYl9oZWlnaHQgPiA2OCB8fAotICAgICAgICAgICAgKGN0eC0+bWJfaGVpZ2h0IDw8IGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lKSA+IChjdHgtPmhlaWdodCArIDE1KSA+PiA0KSB7CisgICAgICAgIGlmIChjdHgtPm1iX2hlaWdodCA+IDY4KSB7CiAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJtYiBoZWlnaHQgdG9vIGJpZzogJWRcbiIsIGN0eC0+bWJfaGVpZ2h0KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgICAgIGN0eC0+ZGF0YV9vZmZzZXQgPSAweDI4MDsKICAgICB9CisgICAgaWYgKChjdHgtPm1iX2hlaWdodCA8PCBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSkgPiAoY3R4LT5oZWlnaHQgKyAxNSkgPj4gNCkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJtYiBoZWlnaHQgdG9vIGJpZzogJWRcbiIsIGN0eC0+bWJfaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQogCiAgICAgaWYgKGJ1Zl9zaXplIDwgY3R4LT5kYXRhX29mZnNldCkgewogICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLApAQCAtMjkzLDE0ICszMTksMTkgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgYXZfYXNzZXJ0MCgodW5zaWduZWQpY3R4LT5tYl9oZWlnaHQgPD0gRkZfQVJSQVlfRUxFTVMoY3R4LT5tYl9zY2FuX2luZGV4KSk7CisgICAgaWYgKGN0eC0+bWJfaGVpZ2h0ID4gRkZfQVJSQVlfRUxFTVMoY3R4LT5tYl9zY2FuX2luZGV4KSkgeworICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIm1iX2hlaWdodCB0b28gYmlnICglZCA+ICUiU0laRV9TUEVDSUZJRVIiKS5cbiIsIGN0eC0+bWJfaGVpZ2h0LCBGRl9BUlJBWV9FTEVNUyhjdHgtPm1iX3NjYW5faW5kZXgpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bWJfaGVpZ2h0OyBpKyspIHsKICAgICAgICAgY3R4LT5tYl9zY2FuX2luZGV4W2ldID0gQVZfUkIzMihidWYgKyAweDE3MCArIChpIDw8IDIpKTsKLSAgICAgICAgZmZfZGxvZyhjdHgtPmF2Y3R4LCAibWIgc2NhbiBpbmRleCAlZCwgcG9zICVkOiAldVxuIiwgaSwgMHgxNzAgKyAoaSA8PCAyKSwgY3R4LT5tYl9zY2FuX2luZGV4W2ldKTsKKyAgICAgICAgZmZfZGxvZyhjdHgtPmF2Y3R4LCAibWIgc2NhbiBpbmRleCAlZCwgcG9zICVkOiAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgaSwgMHgxNzAgKyAoaSA8PCAyKSwgY3R4LT5tYl9zY2FuX2luZGV4W2ldKTsKICAgICAgICAgaWYgKGJ1Zl9zaXplIC0gY3R4LT5kYXRhX29mZnNldCA8IGN0eC0+bWJfc2Nhbl9pbmRleFtpXSkgewogICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBtYiBzY2FuIGluZGV4ICgldSB2cyAldSkuXG4iLAorICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG1iIHNjYW4gaW5kZXggKCUiUFJJdTMyIiB2cyAldSkuXG4iLAogICAgICAgICAgICAgICAgICAgIGN0eC0+bWJfc2Nhbl9pbmRleFtpXSwgYnVmX3NpemUgLSBjdHgtPmRhdGFfb2Zmc2V0KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CkBAIC0zNTIsNiArMzgzLDEwIEBACiAKICAgICBVUERBVEVfQ0FDSEUoYnMsICZyb3ctPmdiKTsKICAgICBHRVRfVkxDKGxlbiwgYnMsICZyb3ctPmdiLCBjdHgtPmRjX3ZsYy50YWJsZSwgRE5YSERfRENfVkxDX0JJVFMsIDEpOworICAgIGlmIChsZW4gPCAwKSB7CisgICAgICAgIHJldCA9IGxlbjsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAgICAgaWYgKGxlbikgewogICAgICAgICBsZXZlbCA9IEdFVF9DQUNIRShicywgJnJvdy0+Z2IpOwogICAgICAgICBMQVNUX1NLSVBfQklUUyhicywgJnJvdy0+Z2IsIGxlbik7CkBAIC00MDUsNyArNDQwLDcgQEAKICAgICAgICAgR0VUX1ZMQyhpbmRleDEsIGJzLCAmcm93LT5nYiwgY3R4LT5hY192bGMudGFibGUsCiAgICAgICAgICAgICAgICAgRE5YSERfVkxDX0JJVFMsIDIpOwogICAgIH0KLQorZXJyb3I6CiAgICAgQ0xPU0VfUkVBREVSKGJzLCAmcm93LT5nYik7CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTU4OSw3ICs2MjQsNyBAQAogCiAgICAgaWYgKChhdmN0eC0+d2lkdGggfHwgYXZjdHgtPmhlaWdodCkgJiYKICAgICAgICAgKGN0eC0+d2lkdGggIT0gYXZjdHgtPndpZHRoIHx8IGN0eC0+aGVpZ2h0ICE9IGF2Y3R4LT5oZWlnaHQpKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJmcmFtZSBzaXplIGNoYW5nZWQ6ICVkeCVkIC0+ICVkeCVkXG4iLAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZnJhbWUgc2l6ZSBjaGFuZ2VkOiAlZHglZCAtPiAldXgldVxuIiwKICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQpOwogICAgICAgICBmaXJzdF9maWVsZCA9IDE7CiAgICAgfQpAQCAtNjkyLDQgKzcyNyw1IEBACiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTIHwKICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUywKICAgICAuaW5pdF90aHJlYWRfY29weSA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKGRueGhkX2RlY29kZV9pbml0X3RocmVhZF9jb3B5KSwKKyAgICAucHJvZmlsZXMgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl9kbnhoZF9wcm9maWxlcyksCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kbnhoZGVuYy5jIGIvbGliYXZjb2RlYy9kbnhoZGVuYy5jCmluZGV4IGUyZWJlZWIuLjg2ZTcxY2EgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZG54aGRlbmMuYworKysgYi9saWJhdmNvZGVjL2RueGhkZW5jLmMKQEAgLTM0LDEwICszNCwxMCBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAicGl4YmxvY2tkc3AuaCIKKyNpbmNsdWRlICJwcm9maWxlcy5oIgogI2luY2x1ZGUgImRueGhkZW5jLmgiCiAKLQotLy8gVGhlIGxhcmdlc3QgdmFsdWUgdGhhdCB3aWxsIG5vdCBsZWFkIHRvIG92ZXJmbG93IGZvciAxMGJpdCBzYW1wbGVzLgorLy8gVGhlIGxhcmdlc3QgdmFsdWUgdGhhdCB3aWxsIG5vdCBsZWFkIHRvIG92ZXJmbG93IGZvciAxMC1iaXQgc2FtcGxlcy4KICNkZWZpbmUgRE5YMTBCSVRfUU1BVF9TSElGVCAxOAogI2RlZmluZSBSQ19WQVJJQU5DRSAxIC8vIHVzZSB2YXJpYW5jZSBvciBzc2QgZm9yIGZhc3QgcmMKICNkZWZpbmUgTEFNQkRBX0ZSQUNfQklUUyAxMApAQCAtNDksNiArNDksMjEgQEAKICAgICB7ICJpYmlhcyIsICJpbnRyYSBxdWFudCBiaWFzIiwKICAgICAgICAgb2Zmc2V0b2YoRE5YSERFbmNDb250ZXh0LCBpbnRyYV9xdWFudF9iaWFzKSwgQVZfT1BUX1RZUEVfSU5ULAogICAgICAgICB7IC5pNjQgPSAwIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFIH0sCisgICAgeyAicHJvZmlsZSIsICAgICAgIE5VTEwsIG9mZnNldG9mKEROWEhERW5jQ29udGV4dCwgcHJvZmlsZSksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gRkZfUFJPRklMRV9ETlhIRCB9LAorICAgICAgICBGRl9QUk9GSUxFX0ROWEhELCBGRl9QUk9GSUxFX0ROWEhSXzQ0NCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImRueGhkIiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGRl9QUk9GSUxFX0ROWEhEIH0sCisgICAgICAgIDAsIDAsIFZFLCAicHJvZmlsZSIgfSwKKyAgICB7ICJkbnhocl80NDQiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfUFJPRklMRV9ETlhIUl80NDQgfSwKKyAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImRueGhyX2hxeCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGRl9QUk9GSUxFX0ROWEhSX0hRWCB9LAorICAgICAgICAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAiZG54aHJfaHEiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZGX1BST0ZJTEVfRE5YSFJfSFEgfSwKKyAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImRueGhyX3NxIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGRl9QUk9GSUxFX0ROWEhSX1NRIH0sCisgICAgICAgIDAsIDAsIFZFLCAicHJvZmlsZSIgfSwKKyAgICB7ICJkbnhocl9sYiIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfUFJPRklMRV9ETlhIUl9MQiB9LAorICAgICAgICAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTk3LDYgKzExMiw2NSBAQAogICAgIG1lbWNweShibG9jayArIDQgKiA4LCBwaXhlbHMgKyAzICogbGluZV9zaXplLCA4ICogc2l6ZW9mKCpibG9jaykpOwogfQogCitzdGF0aWMgaW50IGRueGhkXzEwYml0X2RjdF9xdWFudGl6ZV80NDQoTXBlZ0VuY0NvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBxc2NhbGUsIGludCAqb3ZlcmZsb3cpCit7CisgICAgaW50IGksIGosIGxldmVsLCBsYXN0X25vbl96ZXJvLCBzdGFydF9pOworICAgIGNvbnN0IGludCAqcW1hdDsKKyAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGU9IGN0eC0+aW50cmFfc2NhbnRhYmxlLnNjYW50YWJsZTsKKyAgICBpbnQgYmlhczsKKyAgICBpbnQgbWF4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkMSwgdGhyZXNob2xkMjsKKworICAgIGN0eC0+ZmRzcC5mZGN0KGJsb2NrKTsKKworICAgIGJsb2NrWzBdID0gKGJsb2NrWzBdICsgMikgPj4gMjsKKyAgICBzdGFydF9pID0gMTsKKyAgICBsYXN0X25vbl96ZXJvID0gMDsKKyAgICBxbWF0ID0gbiA8IDQgPyBjdHgtPnFfaW50cmFfbWF0cml4W3FzY2FsZV0gOiBjdHgtPnFfY2hyb21hX2ludHJhX21hdHJpeFtxc2NhbGVdOworICAgIGJpYXM9IGN0eC0+aW50cmFfcXVhbnRfYmlhcyAqICgxIDw8ICgxNiAtIDgpKTsKKyAgICB0aHJlc2hvbGQxID0gKDEgPDwgMTYpIC0gYmlhcyAtIDE7CisgICAgdGhyZXNob2xkMiA9ICh0aHJlc2hvbGQxIDw8IDEpOworCisgICAgZm9yIChpID0gNjM7IGkgPj0gc3RhcnRfaTsgaS0tKSB7CisgICAgICAgIGogPSBzY2FudGFibGVbaV07CisgICAgICAgIGxldmVsID0gYmxvY2tbal0gKiBxbWF0W2pdOworCisgICAgICAgIGlmICgoKHVuc2lnbmVkKShsZXZlbCArIHRocmVzaG9sZDEpKSA+IHRocmVzaG9sZDIpIHsKKyAgICAgICAgICAgIGxhc3Rfbm9uX3plcm8gPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgIGJsb2NrW2pdPTA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSBzdGFydF9pOyBpIDw9IGxhc3Rfbm9uX3plcm87IGkrKykgeworICAgICAgICBqID0gc2NhbnRhYmxlW2ldOworICAgICAgICBsZXZlbCA9IGJsb2NrW2pdICogcW1hdFtqXTsKKworICAgICAgICBpZiAoKCh1bnNpZ25lZCkobGV2ZWwgKyB0aHJlc2hvbGQxKSkgPiB0aHJlc2hvbGQyKSB7CisgICAgICAgICAgICBpZiAobGV2ZWwgPiAwKSB7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAoYmlhcyArIGxldmVsKSA+PiAxNjsKKyAgICAgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOworICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgIGxldmVsID0gKGJpYXMgLSBsZXZlbCkgPj4gMTY7CisgICAgICAgICAgICAgICAgYmxvY2tbal0gPSAtbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXggfD0gbGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBibG9ja1tqXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgKm92ZXJmbG93ID0gY3R4LT5tYXhfcWNvZWZmIDwgbWF4OyAvL292ZXJmbG93IG1pZ2h0IGhhdmUgaGFwcGVuZWQKKworICAgIC8qIHdlIG5lZWQgdGhpcyBwZXJtdXRhdGlvbiBzbyB0aGF0IHdlIGNvcnJlY3QgdGhlIElEQ1QsIHdlIG9ubHkgcGVybXV0ZSB0aGUgIT0wIGVsZW1lbnRzICovCisgICAgaWYgKGN0eC0+aWRzcC5wZXJtX3R5cGUgIT0gRkZfSURDVF9QRVJNX05PTkUpCisgICAgICAgIGZmX2Jsb2NrX3Blcm11dGUoYmxvY2ssIGN0eC0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW50YWJsZSwgbGFzdF9ub25femVybyk7CisKKyAgICByZXR1cm4gbGFzdF9ub25femVybzsKK30KKwogc3RhdGljIGludCBkbnhoZF8xMGJpdF9kY3RfcXVhbnRpemUoTXBlZ0VuY0NvbnRleHQgKmN0eCwgaW50MTZfdCAqYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IHFzY2FsZSwgaW50ICpvdmVyZmxvdykKIHsKQEAgLTEzMSw3ICsyMDUsNyBAQAogc3RhdGljIGF2X2NvbGQgaW50IGRueGhkX2luaXRfdmxjKEROWEhERW5jQ29udGV4dCAqY3R4KQogewogICAgIGludCBpLCBqLCBsZXZlbCwgcnVuOwotICAgIGludCBtYXhfbGV2ZWwgPSAxIDw8IChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoICsgMik7CisgICAgaW50IG1heF9sZXZlbCA9IDEgPDwgKGN0eC0+Yml0X2RlcHRoICsgMik7CiAKICAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhjdHgtPm0uYXZjdHgsIGN0eC0+dmxjX2NvZGVzLAogICAgICAgICAgICAgICAgICAgICAgIG1heF9sZXZlbCwgNCAqIHNpemVvZigqY3R4LT52bGNfY29kZXMpLCBmYWlsKTsKQEAgLTIwOCw3ICsyODIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIChjdHgtPm0uYXZjdHgtPnFtYXggKyAxKSwgNjQgKiAyICogc2l6ZW9mKHVpbnQxNl90KSwKICAgICAgICAgICAgICAgICAgICAgICBmYWlsKTsKIAotICAgIGlmIChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoID09IDgpIHsKKyAgICBpZiAoY3R4LT5iaXRfZGVwdGggPT0gOCkgewogICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNjQ7IGkrKykgewogICAgICAgICAgICAgaW50IGogPSBjdHgtPm0uaWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOwogICAgICAgICAgICAgd2VpZ2h0X21hdHJpeFtqXSA9IGN0eC0+Y2lkX3RhYmxlLT5sdW1hX3dlaWdodFtpXTsKQEAgLTI3MSwxMyArMzQ1LDE2IEBACiAKIHN0YXRpYyBhdl9jb2xkIGludCBkbnhoZF9pbml0X3JjKEROWEhERW5jQ29udGV4dCAqY3R4KQogewotICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGN0eC0+bS5hdmN0eCwgY3R4LT5tYl9yYywgKGN0eC0+bS5hdmN0eC0+cW1heCArIDEpLCA4MTYwICogc2l6ZW9mKFJDRW50cnkpLCBmYWlsKTsKLSAgICBpZiAoY3R4LT5tLmF2Y3R4LT5tYl9kZWNpc2lvbiAhPSBGRl9NQl9ERUNJU0lPTl9SRCkKKyAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhjdHgtPm0uYXZjdHgsIGN0eC0+bWJfcmMsIChjdHgtPm0uYXZjdHgtPnFtYXggKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tLm1iX251bSAqIHNpemVvZihSQ0VudHJ5KSwgZmFpbCk7CisgICAgaWYgKGN0eC0+bS5hdmN0eC0+bWJfZGVjaXNpb24gIT0gRkZfTUJfREVDSVNJT05fUkQpIHsKICAgICAgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oY3R4LT5tLmF2Y3R4LCBjdHgtPm1iX2NtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tLm1iX251bSwgc2l6ZW9mKFJDQ01QRW50cnkpLCBmYWlsKTsKLQotICAgIGN0eC0+ZnJhbWVfYml0cyA9IChjdHgtPmNpZF90YWJsZS0+Y29kaW5nX3VuaXRfc2l6ZSAtCi0gICAgICAgICAgICAgICAgICAgICAgIDY0MCAtIDQgLSBjdHgtPm1pbl9wYWRkaW5nKSAqIDg7CisgICAgICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGN0eC0+bS5hdmN0eCwgY3R4LT5tYl9jbXBfdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm0ubWJfbnVtLCBzaXplb2YoUkNDTVBFbnRyeSksIGZhaWwpOworICAgIH0KKyAgICBjdHgtPmZyYW1lX2JpdHMgPSAoY3R4LT5jb2RpbmdfdW5pdF9zaXplIC0KKyAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5kYXRhX29mZnNldCAtIDQgLSBjdHgtPm1pbl9wYWRkaW5nKSAqIDg7CiAgICAgY3R4LT5xc2NhbGUgPSAxOwogICAgIGN0eC0+bGFtYmRhID0gMiA8PCBMQU1CREFfRlJBQ19CSVRTOyAvLyBxc2NhbGUgMgogICAgIHJldHVybiAwOwpAQCAtMjg4LDE0ICszNjUsMTYgQEAKIHN0YXRpYyBhdl9jb2xkIGludCBkbnhoZF9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgRE5YSERFbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGludCBpLCBpbmRleCwgYml0X2RlcHRoLCByZXQ7CisgICAgaW50IGksIGluZGV4LCByZXQ7CiAKICAgICBzd2l0Y2ggKGF2Y3R4LT5waXhfZm10KSB7CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6Ci0gICAgICAgIGJpdF9kZXB0aCA9IDg7CisgICAgICAgIGN0eC0+Yml0X2RlcHRoID0gODsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKLSAgICAgICAgYml0X2RlcHRoID0gMTA7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwOgorICAgICAgICBjdHgtPmJpdF9kZXB0aCA9IDEwOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKQEAgLTMwMyw3ICszODIsMzIgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBjdHgtPmNpZCA9IGZmX2RueGhkX2ZpbmRfY2lkKGF2Y3R4LCBiaXRfZGVwdGgpOworICAgIGlmICgoY3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfRE5YSFJfNDQ0ICYmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX0dCUlAxMCkpIHx8CisgICAgICAgIChjdHgtPnByb2ZpbGUgIT0gRkZfUFJPRklMRV9ETlhIUl80NDQgJiYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UDEwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSUDEwKSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAicGl4ZWwgZm9ybWF0IGlzIGluY29tcGF0aWJsZSB3aXRoIEROeEhEIHByb2ZpbGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9ETlhIUl9IUVggJiYgYXZjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9ZVVY0MjJQMTApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAicGl4ZWwgZm9ybWF0IGlzIGluY29tcGF0aWJsZSB3aXRoIEROeEhSIEhRWCBwcm9maWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoKGN0eC0+cHJvZmlsZSA9PSBGRl9QUk9GSUxFX0ROWEhSX0xCIHx8CisgICAgICAgICBjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9ETlhIUl9TUSB8fAorICAgICAgICAgY3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfRE5YSFJfSFEpICYmIGF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfWVVWNDIyUCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJwaXhlbCBmb3JtYXQgaXMgaW5jb21wYXRpYmxlIHdpdGggRE54SFIgTEIvU1EvSFEgcHJvZmlsZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY3R4LT5pc180NDQgPSBjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9ETlhIUl80NDQ7CisgICAgYXZjdHgtPnByb2ZpbGUgPSBjdHgtPnByb2ZpbGU7CisgICAgY3R4LT5jaWQgPSBmZl9kbnhoZF9maW5kX2NpZChhdmN0eCwgY3R4LT5iaXRfZGVwdGgpOwogICAgIGlmICghY3R4LT5jaWQpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAidmlkZW8gcGFyYW1ldGVycyBpbmNvbXBhdGlibGUgd2l0aCBETnhIRC4gVmFsaWQgRE54SEQgcHJvZmlsZXM6XG4iKTsKQEAgLTMxMiw2ICs0MTYsMTUgQEAKICAgICB9CiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJjaWQgJWRcbiIsIGN0eC0+Y2lkKTsKIAorICAgIGlmIChjdHgtPmNpZCA+PSAxMjcwICYmIGN0eC0+Y2lkIDw9IDEyNzQpCisgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnQScsJ1YnLCdkJywnaCcpOworCisgICAgaWYgKGF2Y3R4LT53aWR0aCA8IDI1NiB8fCBhdmN0eC0+aGVpZ2h0IDwgMTIwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIklucHV0IGRpbWVuc2lvbnMgdG9vIHNtYWxsLCBpbnB1dCBtdXN0IGJlIGF0IGxlYXN0IDI1NngxMjBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKwogICAgIGluZGV4ID0gZmZfZG54aGRfZ2V0X2NpZF90YWJsZShjdHgtPmNpZCk7CiAgICAgYXZfYXNzZXJ0MChpbmRleCA+PSAwKTsKIApAQCAtMzIxLDcgKzQzNCw3IEBACiAgICAgY3R4LT5tLm1iX2ludHJhID0gMTsKICAgICBjdHgtPm0uaDI2M19haWMgPSAxOwogCi0gICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoOworICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gY3R4LT5iaXRfZGVwdGg7CiAKICAgICBmZl9ibG9ja2RzcF9pbml0KCZjdHgtPmJkc3AsIGF2Y3R4KTsKICAgICBmZl9mZGN0ZHNwX2luaXQoJmN0eC0+bS5mZHNwLCBhdmN0eCk7CkBAIC0zMzAsMTAgKzQ0MywxNyBAQAogICAgIGZmX3BpeGJsb2NrZHNwX2luaXQoJmN0eC0+bS5wZHNwLCBhdmN0eCk7CiAgICAgZmZfZGN0X2VuY29kZV9pbml0KCZjdHgtPm0pOwogCisgICAgaWYgKGN0eC0+cHJvZmlsZSAhPSBGRl9QUk9GSUxFX0ROWEhEKQorICAgICAgICBmZl92aWRlb2RzcF9pbml0KCZjdHgtPm0udmRzcCwgY3R4LT5iaXRfZGVwdGgpOworCiAgICAgaWYgKCFjdHgtPm0uZGN0X3F1YW50aXplKQogICAgICAgICBjdHgtPm0uZGN0X3F1YW50aXplID0gZmZfZGN0X3F1YW50aXplX2M7CiAKLSAgICBpZiAoY3R4LT5jaWRfdGFibGUtPmJpdF9kZXB0aCA9PSAxMCkgeworICAgIGlmIChjdHgtPmlzXzQ0NCB8fCBjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9ETlhIUl9IUVgpIHsKKyAgICAgICAgY3R4LT5tLmRjdF9xdWFudGl6ZSAgICAgPSBkbnhoZF8xMGJpdF9kY3RfcXVhbnRpemVfNDQ0OworICAgICAgICBjdHgtPmdldF9waXhlbHNfOHg0X3N5bSA9IGRueGhkXzEwYml0X2dldF9waXhlbHNfOHg0X3N5bTsKKyAgICAgICAgY3R4LT5ibG9ja193aWR0aF9sMiAgICAgPSA0OworICAgIH0gZWxzZSBpZiAoY3R4LT5iaXRfZGVwdGggPT0gMTApIHsKICAgICAgICAgY3R4LT5tLmRjdF9xdWFudGl6ZSAgICAgPSBkbnhoZF8xMGJpdF9kY3RfcXVhbnRpemU7CiAgICAgICAgIGN0eC0+Z2V0X3BpeGVsc184eDRfc3ltID0gZG54aGRfMTBiaXRfZ2V0X3BpeGVsc184eDRfc3ltOwogICAgICAgICBjdHgtPmJsb2NrX3dpZHRoX2wyICAgICA9IDQ7CkBAIC0zNTUsMTIgKzQ3NSwyMSBAQAogCiAgICAgY3R4LT5tLm1iX251bSA9IGN0eC0+bS5tYl9oZWlnaHQgKiBjdHgtPm0ubWJfd2lkdGg7CiAKLSNpZiBGRl9BUElfUVVBTlRfQklBUwotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGlmIChhdmN0eC0+aW50cmFfcXVhbnRfYmlhcyAhPSBGRl9ERUZBVUxUX1FVQU5UX0JJQVMpCi0gICAgICAgIGN0eC0+aW50cmFfcXVhbnRfYmlhcyA9IGF2Y3R4LT5pbnRyYV9xdWFudF9iaWFzOwotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKKyAgICBpZiAoY3R4LT5jaWRfdGFibGUtPmZyYW1lX3NpemUgPT0gRE5YSERfVkFSSUFCTEUpIHsKKyAgICAgICAgY3R4LT5mcmFtZV9zaXplID0gZmZfZG54aGRfZ2V0X2hyX2ZyYW1lX3NpemUoY3R4LT5jaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIGF2X2Fzc2VydDAoY3R4LT5mcmFtZV9zaXplID49IDApOworICAgICAgICBjdHgtPmNvZGluZ191bml0X3NpemUgPSBjdHgtPmZyYW1lX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5mcmFtZV9zaXplID0gY3R4LT5jaWRfdGFibGUtPmZyYW1lX3NpemU7CisgICAgICAgIGN0eC0+Y29kaW5nX3VuaXRfc2l6ZSA9IGN0eC0+Y2lkX3RhYmxlLT5jb2RpbmdfdW5pdF9zaXplOworICAgIH0KKworICAgIGlmIChjdHgtPm0ubWJfaGVpZ2h0ID4gNjgpCisgICAgICAgIGN0eC0+ZGF0YV9vZmZzZXQgPSAweDE3MCArIChjdHgtPm0ubWJfaGVpZ2h0IDw8IDIpOworICAgIGVsc2UKKyAgICAgICAgY3R4LT5kYXRhX29mZnNldCA9IDB4MjgwOworCiAgICAgLy8gWFhYIHR1bmUgbGJpYXMvY2JpYXMKICAgICBpZiAoKHJldCA9IGRueGhkX2luaXRfcW1hdChjdHgsIGN0eC0+aW50cmFfcXVhbnRfYmlhcywgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTM5MSw5ICs1MjAsMTEgQEAKIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogI2VuZGlmCiAKLSAgICBpZiAoYXZjdHgtPnRocmVhZF9jb3VudCA+IE1BWF9USFJFQURTKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIG1hbnkgdGhyZWFkc1xuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPT0gRkZfVEhSRUFEX1NMSUNFKSB7CisgICAgICAgIGlmIChhdmN0eC0+dGhyZWFkX2NvdW50ID4gTUFYX1RIUkVBRFMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIG1hbnkgdGhyZWFkc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGF2Y3R4LT5xbWF4IDw9IDEpIHsKQEAgLTQwMiw5ICs1MzMsMTEgQEAKICAgICB9CiAKICAgICBjdHgtPnRocmVhZFswXSA9IGN0eDsKLSAgICBmb3IgKGkgPSAxOyBpIDwgYXZjdHgtPnRocmVhZF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGN0eC0+dGhyZWFkW2ldID0gYXZfbWFsbG9jKHNpemVvZihETlhIREVuY0NvbnRleHQpKTsKLSAgICAgICAgbWVtY3B5KGN0eC0+dGhyZWFkW2ldLCBjdHgsIHNpemVvZihETlhIREVuY0NvbnRleHQpKTsKKyAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfU0xJQ0UpIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGF2Y3R4LT50aHJlYWRfY291bnQ7IGkrKykgeworICAgICAgICAgICAgY3R4LT50aHJlYWRbaV0gPSBhdl9tYWxsb2Moc2l6ZW9mKEROWEhERW5jQ29udGV4dCkpOworICAgICAgICAgICAgbWVtY3B5KGN0eC0+dGhyZWFkW2ldLCBjdHgsIHNpemVvZihETlhIREVuY0NvbnRleHQpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtNDE1LDExICs1NDgsMTYgQEAKIHN0YXRpYyBpbnQgZG54aGRfd3JpdGVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDhfdCAqYnVmKQogewogICAgIEROWEhERW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCBoZWFkZXJfcHJlZml4WzVdID0geyAweDAwLCAweDAwLCAweDAyLCAweDgwLCAweDAxIH07CiAKLSAgICBtZW1zZXQoYnVmLCAwLCA2NDApOworICAgIG1lbXNldChidWYsIDAsIGN0eC0+ZGF0YV9vZmZzZXQpOwogCi0gICAgbWVtY3B5KGJ1ZiwgaGVhZGVyX3ByZWZpeCwgNSk7CisgICAgLy8gKiB3cml0ZSBwcmVmaXggKi8KKyAgICBBVl9XQjE2KGJ1ZiArIDB4MDIsIGN0eC0+ZGF0YV9vZmZzZXQpOworICAgIGlmIChjdHgtPmNpZCA+PSAxMjcwICYmIGN0eC0+Y2lkIDw9IDEyNzQpCisgICAgICAgIGJ1Zls0XSA9IDB4MDM7CisgICAgZWxzZQorICAgICAgICBidWZbNF0gPSAweDAxOworCiAgICAgYnVmWzVdID0gY3R4LT5pbnRlcmxhY2VkID8gY3R4LT5jdXJfZmllbGQgKyAyIDogMHgwMTsKICAgICBidWZbNl0gPSAweDgwOyAvLyBjcmMgZmxhZyBvZmYKICAgICBidWZbN10gPSAweGEwOyAvLyByZXNlcnZlZApAQCAtNDI3LDE2ICs1NjUsMTYgQEAKICAgICBBVl9XQjE2KGJ1ZiArIDB4MWEsIGF2Y3R4LT53aWR0aCk7ICAvLyBTUEwKICAgICBBVl9XQjE2KGJ1ZiArIDB4MWQsIGF2Y3R4LT5oZWlnaHQgPj4gY3R4LT5pbnRlcmxhY2VkKTsgLy8gTkFMCiAKLSAgICBidWZbMHgyMV0gPSBjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoID09IDEwID8gMHg1OCA6IDB4Mzg7CisgICAgYnVmWzB4MjFdID0gY3R4LT5iaXRfZGVwdGggPT0gMTAgPyAweDU4IDogMHgzODsKICAgICBidWZbMHgyMl0gPSAweDg4ICsgKGN0eC0+aW50ZXJsYWNlZCA8PCAyKTsKICAgICBBVl9XQjMyKGJ1ZiArIDB4MjgsIGN0eC0+Y2lkKTsgLy8gQ0lECi0gICAgYnVmWzB4MmNdID0gY3R4LT5pbnRlcmxhY2VkID8gMCA6IDB4ODA7CisgICAgYnVmWzB4MmNdID0gKCFjdHgtPmludGVybGFjZWQgPDwgNykgfCAoY3R4LT5pc180NDQgPDwgNikgfCAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQMTApOwogCiAgICAgYnVmWzB4NWZdID0gMHgwMTsgLy8gVURMCiAKICAgICBidWZbMHgxNjddID0gMHgwMjsgLy8gcmVzZXJ2ZWQKICAgICBBVl9XQjE2KGJ1ZiArIDB4MTZhLCBjdHgtPm0ubWJfaGVpZ2h0ICogNCArIDQpOyAvLyBNU0lQUwotICAgIGJ1ZlsweDE2ZF0gPSBjdHgtPm0ubWJfaGVpZ2h0OyAvLyBOcworICAgIEFWX1dCMTYoYnVmICsgMHgxNmMsIGN0eC0+bS5tYl9oZWlnaHQpOyAvLyBOcwogICAgIGJ1ZlsweDE2Zl0gPSAweDEwOyAvLyByZXNlcnZlZAogCiAgICAgY3R4LT5tc2lwID0gYnVmICsgMHgxNzA7CkBAIC00OTEsOCArNjI5LDEzIEBACiAgICAgaW50IGxldmVsOwogICAgIGludCBpOwogCi0gICAgd2VpZ2h0X21hdHJpeCA9IChuICYgMikgPyBjdHgtPmNpZF90YWJsZS0+Y2hyb21hX3dlaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY3R4LT5jaWRfdGFibGUtPmx1bWFfd2VpZ2h0OworICAgIGlmIChjdHgtPmlzXzQ0NCkgeworICAgICAgICB3ZWlnaHRfbWF0cml4ID0gKChuICUgNikgPCAyKSA/IGN0eC0+Y2lkX3RhYmxlLT5sdW1hX3dlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGN0eC0+Y2lkX3RhYmxlLT5jaHJvbWFfd2VpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIHdlaWdodF9tYXRyaXggPSAobiAmIDIpID8gY3R4LT5jaWRfdGFibGUtPmNocm9tYV93ZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdHgtPmNpZF90YWJsZS0+bHVtYV93ZWlnaHQ7CisgICAgfQogCiAgICAgZm9yIChpID0gMTsgaSA8PSBsYXN0X2luZGV4OyBpKyspIHsKICAgICAgICAgaW50IGogPSBjdHgtPm0uaW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWRbaV07CkBAIC01MDAsNyArNjQzLDcgQEAKICAgICAgICAgaWYgKGxldmVsKSB7CiAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CiAgICAgICAgICAgICAgICAgbGV2ZWwgPSAoMSAtIDIgKiBsZXZlbCkgKiBxc2NhbGUgKiB3ZWlnaHRfbWF0cml4W2ldOwotICAgICAgICAgICAgICAgIGlmIChjdHgtPmNpZF90YWJsZS0+Yml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+Yml0X2RlcHRoID09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICh3ZWlnaHRfbWF0cml4W2ldICE9IDgpCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCArPSA4OwogICAgICAgICAgICAgICAgICAgICBsZXZlbCA+Pj0gNDsKQEAgLTUxMiw3ICs2NTUsNyBAQAogICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBsZXZlbCA9ICgyICogbGV2ZWwgKyAxKSAqIHFzY2FsZSAqIHdlaWdodF9tYXRyaXhbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGN0eC0+Y2lkX3RhYmxlLT5iaXRfZGVwdGggPT0gMTApIHsKKyAgICAgICAgICAgICAgICBpZiAoY3R4LT5iaXRfZGVwdGggPT0gMTApIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHdlaWdodF9tYXRyaXhbaV0gIT0gOCkKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsICs9IDg7CiAgICAgICAgICAgICAgICAgICAgIGxldmVsID4+PSA0OwpAQCAtNTYwLDU2ICs3MDMsMTQxIEBACiB7CiAgICAgY29uc3QgaW50IGJzID0gY3R4LT5ibG9ja193aWR0aF9sMjsKICAgICBjb25zdCBpbnQgYncgPSAxIDw8IGJzOworICAgIGludCBkY3RfeV9vZmZzZXQgPSBjdHgtPmRjdF95X29mZnNldDsKKyAgICBpbnQgZGN0X3V2X29mZnNldCA9IGN0eC0+ZGN0X3V2X29mZnNldDsKKyAgICBpbnQgbGluZXNpemUgPSBjdHgtPm0ubGluZXNpemU7CisgICAgaW50IHV2bGluZXNpemUgPSBjdHgtPm0udXZsaW5lc2l6ZTsKICAgICBjb25zdCB1aW50OF90ICpwdHJfeSA9IGN0eC0+dGhyZWFkWzBdLT5zcmNbMF0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChtYl95IDw8IDQpICogY3R4LT5tLmxpbmVzaXplKSArIChtYl94IDw8IGJzICsgMSk7CiAgICAgY29uc3QgdWludDhfdCAqcHRyX3UgPSBjdHgtPnRocmVhZFswXS0+c3JjWzFdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgobWJfeSA8PCA0KSAqIGN0eC0+bS51dmxpbmVzaXplKSArIChtYl94IDw8IGJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgobWJfeSA8PCA0KSAqIGN0eC0+bS51dmxpbmVzaXplKSArIChtYl94IDw8IGJzICsgY3R4LT5pc180NDQpOwogICAgIGNvbnN0IHVpbnQ4X3QgKnB0cl92ID0gY3R4LT50aHJlYWRbMF0tPnNyY1syXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1iX3kgPDwgNCkgKiBjdHgtPm0udXZsaW5lc2l6ZSkgKyAobWJfeCA8PCBicyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1iX3kgPDwgNCkgKiBjdHgtPm0udXZsaW5lc2l6ZSkgKyAobWJfeCA8PCBicyArIGN0eC0+aXNfNDQ0KTsKICAgICBQaXhibG9ja0RTUENvbnRleHQgKnBkc3AgPSAmY3R4LT5tLnBkc3A7CisgICAgVmlkZW9EU1BDb250ZXh0ICp2ZHNwID0gJmN0eC0+bS52ZHNwOwogCi0gICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1swXSwgcHRyX3ksICAgICAgY3R4LT5tLmxpbmVzaXplKTsKLSAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzFdLCBwdHJfeSArIGJ3LCBjdHgtPm0ubGluZXNpemUpOwotICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbMl0sIHB0cl91LCAgICAgIGN0eC0+bS51dmxpbmVzaXplKTsKLSAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzNdLCBwdHJfdiwgICAgICBjdHgtPm0udXZsaW5lc2l6ZSk7CisgICAgaWYgKGN0eC0+Yml0X2RlcHRoICE9IDEwICYmIHZkc3AtPmVtdWxhdGVkX2VkZ2VfbWMgJiYgKChtYl94IDw8IDQpICsgMTYgPiBjdHgtPm0uYXZjdHgtPndpZHRoIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYl95IDw8IDQpICsgMTYgPiBjdHgtPm0uYXZjdHgtPmhlaWdodCkpIHsKKyAgICAgICAgaW50IHlfdyA9IGN0eC0+bS5hdmN0eC0+d2lkdGggIC0gKG1iX3ggPDwgNCk7CisgICAgICAgIGludCB5X2ggPSBjdHgtPm0uYXZjdHgtPmhlaWdodCAtIChtYl95IDw8IDQpOworICAgICAgICBpbnQgdXZfdyA9ICh5X3cgKyAxKSAvIDI7CisgICAgICAgIGludCB1dl9oID0geV9oOworICAgICAgICBsaW5lc2l6ZSA9IDE2OworICAgICAgICB1dmxpbmVzaXplID0gODsKIAotICAgIGlmIChtYl95ICsgMSA9PSBjdHgtPm0ubWJfaGVpZ2h0ICYmIGN0eC0+bS5hdmN0eC0+aGVpZ2h0ID09IDEwODApIHsKLSAgICAgICAgaWYgKGN0eC0+aW50ZXJsYWNlZCkgewotICAgICAgICAgICAgY3R4LT5nZXRfcGl4ZWxzXzh4NF9zeW0oY3R4LT5ibG9ja3NbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfeSArIGN0eC0+ZGN0X3lfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tLmxpbmVzaXplKTsKLSAgICAgICAgICAgIGN0eC0+Z2V0X3BpeGVsc184eDRfc3ltKGN0eC0+YmxvY2tzWzVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3kgKyBjdHgtPmRjdF95X29mZnNldCArIGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tLmxpbmVzaXplKTsKLSAgICAgICAgICAgIGN0eC0+Z2V0X3BpeGVsc184eDRfc3ltKGN0eC0+YmxvY2tzWzZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3UgKyBjdHgtPmRjdF91dl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm0udXZsaW5lc2l6ZSk7Ci0gICAgICAgICAgICBjdHgtPmdldF9waXhlbHNfOHg0X3N5bShjdHgtPmJsb2Nrc1s3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl92ICsgY3R4LT5kY3RfdXZfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tLnV2bGluZXNpemUpOworICAgICAgICB2ZHNwLT5lbXVsYXRlZF9lZGdlX21jKCZjdHgtPmVkZ2VfYnVmX3lbMF0sIHB0cl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLCBjdHgtPm0ubGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHlfdywgeV9oKTsKKyAgICAgICAgdmRzcC0+ZW11bGF0ZWRfZWRnZV9tYygmY3R4LT5lZGdlX2J1Zl91dlswXVswXSwgcHRyX3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgY3R4LT5tLnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgdXZfdywgdXZfaCk7CisgICAgICAgIHZkc3AtPmVtdWxhdGVkX2VkZ2VfbWMoJmN0eC0+ZWRnZV9idWZfdXZbMV1bMF0sIHB0cl92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIGN0eC0+bS51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHV2X3csIHV2X2gpOworCisgICAgICAgIGRjdF95X29mZnNldCA9ICBidyAqIGxpbmVzaXplOworICAgICAgICBkY3RfdXZfb2Zmc2V0ID0gYncgKiB1dmxpbmVzaXplOworICAgICAgICBwdHJfeSA9ICZjdHgtPmVkZ2VfYnVmX3lbMF07CisgICAgICAgIHB0cl91ID0gJmN0eC0+ZWRnZV9idWZfdXZbMF1bMF07CisgICAgICAgIHB0cl92ID0gJmN0eC0+ZWRnZV9idWZfdXZbMV1bMF07CisgICAgfSBlbHNlIGlmIChjdHgtPmJpdF9kZXB0aCA9PSAxMCAmJiB2ZHNwLT5lbXVsYXRlZF9lZGdlX21jICYmICgobWJfeCA8PCA0KSArIDE2ID4gY3R4LT5tLmF2Y3R4LT53aWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX3kgPDwgNCkgKyAxNiA+IGN0eC0+bS5hdmN0eC0+aGVpZ2h0KSkgeworICAgICAgICBpbnQgeV93ID0gY3R4LT5tLmF2Y3R4LT53aWR0aCAgLSAobWJfeCA8PCA0KTsKKyAgICAgICAgaW50IHlfaCA9IGN0eC0+bS5hdmN0eC0+aGVpZ2h0IC0gKG1iX3kgPDwgNCk7CisgICAgICAgIGludCB1dl93ID0gY3R4LT5pc180NDQgPyB5X3cgOiAoeV93ICsgMSkgLyAyOworICAgICAgICBpbnQgdXZfaCA9IHlfaDsKKyAgICAgICAgbGluZXNpemUgPSAzMjsKKyAgICAgICAgdXZsaW5lc2l6ZSA9IDE2ICsgMTYgKiBjdHgtPmlzXzQ0NDsKKworICAgICAgICB2ZHNwLT5lbXVsYXRlZF9lZGdlX21jKCZjdHgtPmVkZ2VfYnVmX3lbMF0sIHB0cl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLCBjdHgtPm0ubGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUgLyAyLCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCB5X3csIHlfaCk7CisgICAgICAgIHZkc3AtPmVtdWxhdGVkX2VkZ2VfbWMoJmN0eC0+ZWRnZV9idWZfdXZbMF1bMF0sIHB0cl91LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIGN0eC0+bS51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUgLyAyLCAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCB1dl93LCB1dl9oKTsKKyAgICAgICAgdmRzcC0+ZW11bGF0ZWRfZWRnZV9tYygmY3R4LT5lZGdlX2J1Zl91dlsxXVswXSwgcHRyX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgY3R4LT5tLnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSAvIDIsIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIHV2X3csIHV2X2gpOworCisgICAgICAgIGRjdF95X29mZnNldCA9ICBidyAqIGxpbmVzaXplIC8gMjsKKyAgICAgICAgZGN0X3V2X29mZnNldCA9IGJ3ICogdXZsaW5lc2l6ZSAvIDI7CisgICAgICAgIHB0cl95ID0gJmN0eC0+ZWRnZV9idWZfeVswXTsKKyAgICAgICAgcHRyX3UgPSAmY3R4LT5lZGdlX2J1Zl91dlswXVswXTsKKyAgICAgICAgcHRyX3YgPSAmY3R4LT5lZGdlX2J1Zl91dlsxXVswXTsKKyAgICB9CisKKyAgICBpZiAoIWN0eC0+aXNfNDQ0KSB7CisgICAgICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbMF0sIHB0cl95LCAgICAgIGxpbmVzaXplKTsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1sxXSwgcHRyX3kgKyBidywgbGluZXNpemUpOworICAgICAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzJdLCBwdHJfdSwgICAgICB1dmxpbmVzaXplKTsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1szXSwgcHRyX3YsICAgICAgdXZsaW5lc2l6ZSk7CisKKyAgICAgICAgaWYgKG1iX3kgKyAxID09IGN0eC0+bS5tYl9oZWlnaHQgJiYgY3R4LT5tLmF2Y3R4LT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICAgICAgaWYgKGN0eC0+aW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgIGN0eC0+Z2V0X3BpeGVsc184eDRfc3ltKGN0eC0+YmxvY2tzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl95ICsgZGN0X3lfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBjdHgtPmdldF9waXhlbHNfOHg0X3N5bShjdHgtPmJsb2Nrc1s1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfeSArIGRjdF95X29mZnNldCArIGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBjdHgtPmdldF9waXhlbHNfOHg0X3N5bShjdHgtPmJsb2Nrc1s2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfdSArIGRjdF91dl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgY3R4LT5nZXRfcGl4ZWxzXzh4NF9zeW0oY3R4LT5ibG9ja3NbN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3YgKyBkY3RfdXZfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdHgtPmJkc3AuY2xlYXJfYmxvY2soY3R4LT5ibG9ja3NbNF0pOworICAgICAgICAgICAgICAgIGN0eC0+YmRzcC5jbGVhcl9ibG9jayhjdHgtPmJsb2Nrc1s1XSk7CisgICAgICAgICAgICAgICAgY3R4LT5iZHNwLmNsZWFyX2Jsb2NrKGN0eC0+YmxvY2tzWzZdKTsKKyAgICAgICAgICAgICAgICBjdHgtPmJkc3AuY2xlYXJfYmxvY2soY3R4LT5ibG9ja3NbN10pOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3R4LT5iZHNwLmNsZWFyX2Jsb2NrKGN0eC0+YmxvY2tzWzRdKTsKLSAgICAgICAgICAgIGN0eC0+YmRzcC5jbGVhcl9ibG9jayhjdHgtPmJsb2Nrc1s1XSk7Ci0gICAgICAgICAgICBjdHgtPmJkc3AuY2xlYXJfYmxvY2soY3R4LT5ibG9ja3NbNl0pOwotICAgICAgICAgICAgY3R4LT5iZHNwLmNsZWFyX2Jsb2NrKGN0eC0+YmxvY2tzWzddKTsKKyAgICAgICAgICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl95ICsgZGN0X3lfb2Zmc2V0LCBsaW5lc2l6ZSk7CisgICAgICAgICAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfeSArIGRjdF95X29mZnNldCArIGJ3LCBsaW5lc2l6ZSk7CisgICAgICAgICAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfdSArIGRjdF91dl9vZmZzZXQsIHV2bGluZXNpemUpOworICAgICAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s3XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3YgKyBkY3RfdXZfb2Zmc2V0LCB1dmxpbmVzaXplKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3kgKyBjdHgtPmRjdF95X29mZnNldCwgY3R4LT5tLmxpbmVzaXplKTsKLSAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s1XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfeSArIGN0eC0+ZGN0X3lfb2Zmc2V0ICsgYncsIGN0eC0+bS5saW5lc2l6ZSk7Ci0gICAgICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3UgKyBjdHgtPmRjdF91dl9vZmZzZXQsIGN0eC0+bS51dmxpbmVzaXplKTsKLSAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfdiArIGN0eC0+ZGN0X3V2X29mZnNldCwgY3R4LT5tLnV2bGluZXNpemUpOworICAgICAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzBdLCBwdHJfeSwgICAgICBsaW5lc2l6ZSk7CisgICAgICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbMV0sIHB0cl95ICsgYncsIGxpbmVzaXplKTsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s2XSwgcHRyX3kgKyBkY3RfeV9vZmZzZXQsIGxpbmVzaXplKTsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s3XSwgcHRyX3kgKyBkY3RfeV9vZmZzZXQgKyBidywgbGluZXNpemUpOworCisgICAgICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbMl0sIHB0cl91LCAgICAgIHV2bGluZXNpemUpOworICAgICAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzNdLCBwdHJfdSArIGJ3LCB1dmxpbmVzaXplKTsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s4XSwgcHRyX3UgKyBkY3RfdXZfb2Zmc2V0LCB1dmxpbmVzaXplKTsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1s5XSwgcHRyX3UgKyBkY3RfdXZfb2Zmc2V0ICsgYncsIHV2bGluZXNpemUpOworCisgICAgICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbNF0sIHB0cl92LCAgICAgIHV2bGluZXNpemUpOworICAgICAgICBwZHNwLT5nZXRfcGl4ZWxzKGN0eC0+YmxvY2tzWzVdLCBwdHJfdiArIGJ3LCB1dmxpbmVzaXplKTsKKyAgICAgICAgcGRzcC0+Z2V0X3BpeGVscyhjdHgtPmJsb2Nrc1sxMF0sIHB0cl92ICsgZGN0X3V2X29mZnNldCwgdXZsaW5lc2l6ZSk7CisgICAgICAgIHBkc3AtPmdldF9waXhlbHMoY3R4LT5ibG9ja3NbMTFdLCBwdHJfdiArIGRjdF91dl9vZmZzZXQgKyBidywgdXZsaW5lc2l6ZSk7CiAgICAgfQogfQogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZQogaW50IGRueGhkX3N3aXRjaF9tYXRyaXgoRE5YSERFbmNDb250ZXh0ICpjdHgsIGludCBpKQogewotICAgIGNvbnN0IHN0YXRpYyB1aW50OF90IGNvbXBvbmVudFs4XT17MCwwLDEsMiwwLDAsMSwyfTsKLSAgICByZXR1cm4gY29tcG9uZW50W2ldOworICAgIGludCB4OworCisgICAgaWYgKGN0eC0+aXNfNDQ0KSB7CisgICAgICAgIHggPSAoaSA+PiAxKSAlIDM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3Qgc3RhdGljIHVpbnQ4X3QgY29tcG9uZW50WzhdPXswLDAsMSwyLDAsMCwxLDJ9OworICAgICAgICB4ID0gY29tcG9uZW50W2ldOworICAgIH0KKyAgICByZXR1cm4geDsKIH0KIAogc3RhdGljIGludCBkbnhoZF9jYWxjX2JpdHNfdGhyZWFkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqYXJnLApAQCAtNjIzLDcgKzg1MSw3IEBACiAKICAgICBjdHgtPm0ubGFzdF9kY1swXSA9CiAgICAgY3R4LT5tLmxhc3RfZGNbMV0gPQotICAgIGN0eC0+bS5sYXN0X2RjWzJdID0gMSA8PCAoY3R4LT5jaWRfdGFibGUtPmJpdF9kZXB0aCArIDIpOworICAgIGN0eC0+bS5sYXN0X2RjWzJdID0gMSA8PCAoY3R4LT5iaXRfZGVwdGggKyAyKTsKIAogICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBjdHgtPm0ubWJfd2lkdGg7IG1iX3grKykgewogICAgICAgICB1bnNpZ25lZCBtYiA9IG1iX3kgKiBjdHgtPm0ubWJfd2lkdGggKyBtYl94OwpAQCAtNjM0LDEzICs4NjIsMTQgQEAKIAogICAgICAgICBkbnhoZF9nZXRfYmxvY2tzKGN0eCwgbWJfeCwgbWJfeSk7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCArIDQgKiBjdHgtPmlzXzQ0NDsgaSsrKSB7CiAgICAgICAgICAgICBpbnQxNl90ICpzcmNfYmxvY2sgPSBjdHgtPmJsb2Nrc1tpXTsKICAgICAgICAgICAgIGludCBvdmVyZmxvdywgbmJpdHMsIGRpZmYsIGxhc3RfaW5kZXg7CiAgICAgICAgICAgICBpbnQgbiA9IGRueGhkX3N3aXRjaF9tYXRyaXgoY3R4LCBpKTsKIAogICAgICAgICAgICAgbWVtY3B5KGJsb2NrLCBzcmNfYmxvY2ssIDY0ICogc2l6ZW9mKCpibG9jaykpOwotICAgICAgICAgICAgbGFzdF9pbmRleCA9IGN0eC0+bS5kY3RfcXVhbnRpemUoJmN0eC0+bSwgYmxvY2ssIDQgJiAoMippKSwKKyAgICAgICAgICAgIGxhc3RfaW5kZXggPSBjdHgtPm0uZGN0X3F1YW50aXplKCZjdHgtPm0sIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pc180NDQgPyA0ICogKG4gPiAwKTogNCAmICgyKmkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNjYWxlLCAmb3ZlcmZsb3cpOwogICAgICAgICAgICAgYWNfYml0cyAgICs9IGRueGhkX2NhbGNfYWNfYml0cyhjdHgsIGJsb2NrLCBsYXN0X2luZGV4KTsKIApAQCAtNjUwLDcgKzg3OSw3IEBACiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgbmJpdHMgPSBhdl9sb2cyXzE2Yml0KDIgKiBkaWZmKTsKIAotICAgICAgICAgICAgYXZfYXNzZXJ0MShuYml0cyA8IGN0eC0+Y2lkX3RhYmxlLT5iaXRfZGVwdGggKyA0KTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDEobmJpdHMgPCBjdHgtPmJpdF9kZXB0aCArIDQpOwogICAgICAgICAgICAgZGNfYml0cyArPSBjdHgtPmNpZF90YWJsZS0+ZGNfYml0c1tuYml0c10gKyBuYml0czsKIAogICAgICAgICAgICAgY3R4LT5tLmxhc3RfZGNbbl0gPSBibG9ja1swXTsKQEAgLTY2MSw5ICs4OTAsOSBAQAogICAgICAgICAgICAgICAgIHNzZCArPSBkbnhoZF9zc2RfYmxvY2soYmxvY2ssIHNyY19ibG9jayk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY3R4LT5tYl9yY1txc2NhbGVdW21iXS5zc2QgID0gc3NkOwotICAgICAgICBjdHgtPm1iX3JjW3FzY2FsZV1bbWJdLmJpdHMgPSBhY19iaXRzICsgZGNfYml0cyArIDEyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAqIGN0eC0+dmxjX2JpdHNbMF07CisgICAgICAgIGN0eC0+bWJfcmNbKHFzY2FsZSAqIGN0eC0+bS5tYl9udW0pICsgbWJdLnNzZCAgPSBzc2Q7CisgICAgICAgIGN0eC0+bWJfcmNbKHFzY2FsZSAqIGN0eC0+bS5tYl9udW0pICsgbWJdLmJpdHMgPSBhY19iaXRzICsgZGNfYml0cyArIDEyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSArIGN0eC0+aXNfNDQ0KSAqIDggKiBjdHgtPnZsY19iaXRzWzBdOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTY3NCwyNSArOTAzLDI3IEBACiAgICAgRE5YSERFbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGludCBtYl95ID0gam9ibnIsIG1iX3g7CiAgICAgY3R4ID0gY3R4LT50aHJlYWRbdGhyZWFkbnJdOwotICAgIGluaXRfcHV0X2JpdHMoJmN0eC0+bS5wYiwgKHVpbnQ4X3QgKilhcmcgKyA2NDAgKyBjdHgtPnNsaWNlX29mZnNbam9ibnJdLAorICAgIGluaXRfcHV0X2JpdHMoJmN0eC0+bS5wYiwgKHVpbnQ4X3QgKilhcmcgKyBjdHgtPmRhdGFfb2Zmc2V0ICsgY3R4LT5zbGljZV9vZmZzW2pvYm5yXSwKICAgICAgICAgICAgICAgICAgIGN0eC0+c2xpY2Vfc2l6ZVtqb2Jucl0pOwogCiAgICAgY3R4LT5tLmxhc3RfZGNbMF0gPQogICAgIGN0eC0+bS5sYXN0X2RjWzFdID0KLSAgICBjdHgtPm0ubGFzdF9kY1syXSA9IDEgPDwgKGN0eC0+Y2lkX3RhYmxlLT5iaXRfZGVwdGggKyAyKTsKKyAgICBjdHgtPm0ubGFzdF9kY1syXSA9IDEgPDwgKGN0eC0+Yml0X2RlcHRoICsgMik7CiAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IGN0eC0+bS5tYl93aWR0aDsgbWJfeCsrKSB7CiAgICAgICAgIHVuc2lnbmVkIG1iID0gbWJfeSAqIGN0eC0+bS5tYl93aWR0aCArIG1iX3g7CiAgICAgICAgIGludCBxc2NhbGUgPSBjdHgtPm1iX3FzY2FsZVttYl07CiAgICAgICAgIGludCBpOwogCi0gICAgICAgIHB1dF9iaXRzKCZjdHgtPm0ucGIsIDEyLCBxc2NhbGUgPDwgMSk7CisgICAgICAgIHB1dF9iaXRzKCZjdHgtPm0ucGIsIDExLCBxc2NhbGUpOworICAgICAgICBwdXRfYml0cygmY3R4LT5tLnBiLCAxLCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFAxMCk7CiAKICAgICAgICAgZG54aGRfZ2V0X2Jsb2NrcyhjdHgsIG1iX3gsIG1iX3kpOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDggKyA0ICogY3R4LT5pc180NDQ7IGkrKykgewogICAgICAgICAgICAgaW50MTZfdCAqYmxvY2sgPSBjdHgtPmJsb2Nrc1tpXTsKICAgICAgICAgICAgIGludCBvdmVyZmxvdywgbiA9IGRueGhkX3N3aXRjaF9tYXRyaXgoY3R4LCBpKTsKLSAgICAgICAgICAgIGludCBsYXN0X2luZGV4ID0gY3R4LT5tLmRjdF9xdWFudGl6ZSgmY3R4LT5tLCBibG9jaywgNCAmICgyKmkpLAorICAgICAgICAgICAgaW50IGxhc3RfaW5kZXggPSBjdHgtPm0uZGN0X3F1YW50aXplKCZjdHgtPm0sIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aXNfNDQ0ID8gKCgoaSA+PiAxKSAlIDMpIDwgMSA/IDAgOiA0KTogNCAmICgyKmkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFzY2FsZSwgJm92ZXJmbG93KTsKICAgICAgICAgICAgIC8vIFNUQVJUX1RJTUVSOwogICAgICAgICAgICAgZG54aGRfZW5jb2RlX2Jsb2NrKGN0eCwgYmxvY2ssIGxhc3RfaW5kZXgsIG4pOwpAQCAtNzMzLDE0ICs5NjQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYXZjdHgtPmhlaWdodCA+PiBjdHgtPmludGVybGFjZWQpICYgMHhGKTsKIAogICAgIGN0eCA9IGN0eC0+dGhyZWFkW3RocmVhZG5yXTsKLSAgICBpZiAoY3R4LT5jaWRfdGFibGUtPmJpdF9kZXB0aCA9PSA4KSB7CisgICAgaWYgKGN0eC0+Yml0X2RlcHRoID09IDgpIHsKICAgICAgICAgdWludDhfdCAqcGl4ID0gY3R4LT50aHJlYWRbMF0tPnNyY1swXSArICgobWJfeSA8PCA0KSAqIGN0eC0+bS5saW5lc2l6ZSk7CiAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBjdHgtPm0ubWJfd2lkdGg7ICsrbWJfeCwgcGl4ICs9IDE2KSB7CiAgICAgICAgICAgICB1bnNpZ25lZCBtYiA9IG1iX3kgKiBjdHgtPm0ubWJfd2lkdGggKyBtYl94OwogICAgICAgICAgICAgaW50IHN1bTsKICAgICAgICAgICAgIGludCB2YXJjOwogCi0gICAgICAgICAgICBpZiAoIXBhcnRpYWxfbGFzdF9yb3cgJiYgbWJfeCAqIDE2IDw9IGF2Y3R4LT53aWR0aCAtIDE2KSB7CisgICAgICAgICAgICBpZiAoIXBhcnRpYWxfbGFzdF9yb3cgJiYgbWJfeCAqIDE2IDw9IGF2Y3R4LT53aWR0aCAtIDE2ICYmIChhdmN0eC0+d2lkdGggJSAxNikgPT0gMCkgewogICAgICAgICAgICAgICAgIHN1bSAgPSBjdHgtPm0ubXB2ZW5jZHNwLnBpeF9zdW0ocGl4LCBjdHgtPm0ubGluZXNpemUpOwogICAgICAgICAgICAgICAgIHZhcmMgPSBjdHgtPm0ubXB2ZW5jZHNwLnBpeF9ub3JtMShwaXgsIGN0eC0+bS5saW5lc2l6ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNzYxLDcgKzk5Miw3IEBACiAgICAgICAgICAgICBjdHgtPm1iX2NtcFttYl0ubWIgICAgPSBtYjsKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIDEwLWJpdAotICAgICAgICBpbnQgY29uc3QgbGluZXNpemUgPSBjdHgtPm0ubGluZXNpemUgPj4gMTsKKyAgICAgICAgY29uc3QgaW50IGxpbmVzaXplID0gY3R4LT5tLmxpbmVzaXplID4+IDE7CiAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBjdHgtPm0ubWJfd2lkdGg7ICsrbWJfeCkgewogICAgICAgICAgICAgdWludDE2X3QgKnBpeCA9ICh1aW50MTZfdCAqKWN0eC0+dGhyZWFkWzBdLT5zcmNbMF0gKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobWJfeSA8PCA0KSAqIGxpbmVzaXplKSArIChtYl94IDw8IDQpOwpAQCAtNzc2LDcgKzEwMDcsNyBAQAogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJoOyArK2kpIHsKICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnc7ICsraikgewogICAgICAgICAgICAgICAgICAgICAvLyBUdXJuIDE2LWJpdCBwaXhlbHMgaW50byAxMC1iaXQgb25lcy4KLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbnN0IHNhbXBsZSA9ICh1bnNpZ25lZCkgcGl4W2pdID4+IDY7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzYW1wbGUgPSAodW5zaWduZWQpIHBpeFtqXSA+PiA2OwogICAgICAgICAgICAgICAgICAgICBzdW0gICArPSBzYW1wbGU7CiAgICAgICAgICAgICAgICAgICAgIHNxc3VtICs9IHNhbXBsZSAqIHNhbXBsZTsKICAgICAgICAgICAgICAgICAgICAgLy8gMl4xMCAqIDJeMTAgKiAxNiAqIDE2ID0gMl4yOCwgd2hpY2ggaXMgbGVzcyB0aGFuIElOVF9NQVgKQEAgLTgxOCwyNSArMTA0OSwyNSBAQAogICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1pbiA9IFVJTlRfTUFYOwogICAgICAgICAgICAgICAgIGludCBxc2NhbGUgPSAxOwogICAgICAgICAgICAgICAgIGludCBtYiAgICAgPSB5ICogY3R4LT5tLm1iX3dpZHRoICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgcmMgPSAwOwogICAgICAgICAgICAgICAgIGZvciAocSA9IDE7IHEgPCBhdmN0eC0+cW1heDsgcSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNjb3JlID0gY3R4LT5tYl9yY1txXVttYl0uYml0cyAqIGxhbWJkYSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkgY3R4LT5tYl9yY1txXVttYl0uc3NkIDw8IExBTUJEQV9GUkFDX0JJVFMpOworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IChxKmN0eC0+bS5tYl9udW0pICsgbWI7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNjb3JlID0gY3R4LT5tYl9yY1tpXS5iaXRzICogbGFtYmRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKSBjdHgtPm1iX3JjW2ldLnNzZCA8PCBMQU1CREFfRlJBQ19CSVRTKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlIDwgbWluKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gICAgPSBzY29yZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHFzY2FsZSA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICByYyA9IGk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYml0cyArPSBjdHgtPm1iX3JjW3FzY2FsZV1bbWJdLmJpdHM7CisgICAgICAgICAgICAgICAgYml0cyArPSBjdHgtPm1iX3JjW3JjXS5iaXRzOwogICAgICAgICAgICAgICAgIGN0eC0+bWJfcXNjYWxlW21iXSA9IHFzY2FsZTsKLSAgICAgICAgICAgICAgICBjdHgtPm1iX2JpdHNbbWJdICAgPSBjdHgtPm1iX3JjW3FzY2FsZV1bbWJdLmJpdHM7CisgICAgICAgICAgICAgICAgY3R4LT5tYl9iaXRzW21iXSAgID0gY3R4LT5tYl9yY1tyY10uYml0czsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJpdHMgPSAoYml0cyArIDMxKSAmIH4zMTsgLy8gcGFkZGluZwogICAgICAgICAgICAgaWYgKGJpdHMgPiBjdHgtPmZyYW1lX2JpdHMpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgLy8gZmZfZGxvZyhjdHgtPm0uYXZjdHgsCi0gICAgICAgIC8vICAgICAgICAgImxhbWJkYSAlZCwgdXAgJXUsIGRvd24gJXUsIGJpdHMgJWQsIGZyYW1lICVkXG4iLAotICAgICAgICAvLyAgICAgICAgIGxhbWJkYSwgbGFzdF9oaWdoZXIsIGxhc3RfbG93ZXIsIGJpdHMsIGN0eC0+ZnJhbWVfYml0cyk7CiAgICAgICAgIGlmIChlbmQpIHsKICAgICAgICAgICAgIGlmIChiaXRzID4gY3R4LT5mcmFtZV9iaXRzKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC04NjUsNyArMTA5Niw2IEBACiAgICAgICAgICAgICBkb3duX3N0ZXAgPSAxPDxMQU1CREFfRlJBQ19CSVRTOwogICAgICAgICB9CiAgICAgfQotICAgIC8vZmZfZGxvZyhjdHgtPm0uYXZjdHgsICJvdXQgbGFtYmRhICVkXG4iLCBsYW1iZGEpOwogICAgIGN0eC0+bGFtYmRhID0gbGFtYmRhOwogICAgIHJldHVybiAwOwogfQpAQCAtODg5LDE1ICsxMTE5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgY3R4LT5tLm1iX2hlaWdodCk7CiAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBjdHgtPm0ubWJfaGVpZ2h0OyB5KyspIHsKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBjdHgtPm0ubWJfd2lkdGg7IHgrKykKLSAgICAgICAgICAgICAgICBiaXRzICs9IGN0eC0+bWJfcmNbcXNjYWxlXVt5KmN0eC0+bS5tYl93aWR0aCt4XS5iaXRzOworICAgICAgICAgICAgICAgIGJpdHMgKz0gY3R4LT5tYl9yY1socXNjYWxlKmN0eC0+bS5tYl9udW0pICsgKHkqY3R4LT5tLm1iX3dpZHRoK3gpXS5iaXRzOwogICAgICAgICAgICAgYml0cyA9IChiaXRzKzMxKSZ+MzE7IC8vIHBhZGRpbmcKICAgICAgICAgICAgIGlmIChiaXRzID4gY3R4LT5mcmFtZV9iaXRzKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIGZmX2Rsb2coY3R4LT5tLmF2Y3R4LAotICAgICAgICAvLyAgICAgICAgICIlZCwgcXNjYWxlICVkLCBiaXRzICVkLCBmcmFtZSAlZCwgaGlnaGVyICVkLCBsb3dlciAlZFxuIiwKLSAgICAgICAgLy8gICAgICAgICBjdHgtPm0uYXZjdHgtPmZyYW1lX251bWJlciwgcXNjYWxlLCBiaXRzLCBjdHgtPmZyYW1lX2JpdHMsCi0gICAgICAgIC8vICAgICAgICAgbGFzdF9oaWdoZXIsIGxhc3RfbG93ZXIpOwogICAgICAgICBpZiAoYml0cyA8IGN0eC0+ZnJhbWVfYml0cykgewogICAgICAgICAgICAgaWYgKHFzY2FsZSA9PSAxKQogICAgICAgICAgICAgICAgIHJldHVybiAxOwpAQCAtOTI2LDcgKzExNTIsNiBAQAogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgLy9mZl9kbG9nKGN0eC0+bS5hdmN0eCwgIm91dCBxc2NhbGUgJWRcbiIsIHFzY2FsZSk7CiAgICAgY3R4LT5xc2NhbGUgPSBxc2NhbGU7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC05NzUsMTAgKzEyMDAsOSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgcmFkaXhfc29ydChSQ0NNUEVudHJ5ICpkYXRhLCBpbnQgc2l6ZSkKK3N0YXRpYyB2b2lkIHJhZGl4X3NvcnQoUkNDTVBFbnRyeSAqZGF0YSwgUkNDTVBFbnRyeSAqdG1wLCBpbnQgc2l6ZSkKIHsKICAgICBpbnQgYnVja2V0c1tSQURJWF9QQVNTRVNdW05CVUNLRVRTXTsKLSAgICBSQ0NNUEVudHJ5ICp0bXAgPSBhdl9tYWxsb2NfYXJyYXkoc2l6ZSwgc2l6ZW9mKCp0bXApKTsKICAgICByYWRpeF9jb3VudChkYXRhLCBzaXplLCBidWNrZXRzKTsKICAgICByYWRpeF9zb3J0X3Bhc3ModG1wLCBkYXRhLCBzaXplLCBidWNrZXRzWzBdLCAwKTsKICAgICByYWRpeF9zb3J0X3Bhc3MoZGF0YSwgdG1wLCBzaXplLCBidWNrZXRzWzFdLCAxKTsKQEAgLTk4Niw3ICsxMjEwLDYgQEAKICAgICAgICAgcmFkaXhfc29ydF9wYXNzKHRtcCwgZGF0YSwgc2l6ZSwgYnVja2V0c1syXSwgMik7CiAgICAgICAgIHJhZGl4X3NvcnRfcGFzcyhkYXRhLCB0bXAsIHNpemUsIGJ1Y2tldHNbM10sIDMpOwogICAgIH0KLSAgICBhdl9mcmVlKHRtcCk7CiB9CiAKIHN0YXRpYyBpbnQgZG54aGRfZW5jb2RlX2Zhc3QoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBETlhIREVuY0NvbnRleHQgKmN0eCkKQEAgLTk5OCwxNyArMTIyMSwxOCBAQAogICAgIGZvciAoeSA9IDA7IHkgPCBjdHgtPm0ubWJfaGVpZ2h0OyB5KyspIHsKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGN0eC0+bS5tYl93aWR0aDsgeCsrKSB7CiAgICAgICAgICAgICBpbnQgbWIgPSB5ICogY3R4LT5tLm1iX3dpZHRoICsgeDsKKyAgICAgICAgICAgIGludCByYyA9IChjdHgtPnFzY2FsZSAqIGN0eC0+bS5tYl9udW0gKSArIG1iOwogICAgICAgICAgICAgaW50IGRlbHRhX2JpdHM7CiAgICAgICAgICAgICBjdHgtPm1iX3FzY2FsZVttYl0gPSBjdHgtPnFzY2FsZTsKLSAgICAgICAgICAgIGN0eC0+bWJfYml0c1ttYl0gPSBjdHgtPm1iX3JjW2N0eC0+cXNjYWxlXVttYl0uYml0czsKLSAgICAgICAgICAgIG1heF9iaXRzICs9IGN0eC0+bWJfcmNbY3R4LT5xc2NhbGVdW21iXS5iaXRzOworICAgICAgICAgICAgY3R4LT5tYl9iaXRzW21iXSA9IGN0eC0+bWJfcmNbcmNdLmJpdHM7CisgICAgICAgICAgICBtYXhfYml0cyArPSBjdHgtPm1iX3JjW3JjXS5iaXRzOwogICAgICAgICAgICAgaWYgKCFSQ19WQVJJQU5DRSkgewotICAgICAgICAgICAgICAgIGRlbHRhX2JpdHMgPSBjdHgtPm1iX3JjW2N0eC0+cXNjYWxlXVttYl0uYml0cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bWJfcmNbY3R4LT5xc2NhbGUgKyAxXVttYl0uYml0czsKKyAgICAgICAgICAgICAgICBkZWx0YV9iaXRzID0gY3R4LT5tYl9yY1tyY10uYml0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bWJfcmNbcmMgKyBjdHgtPm0ubWJfbnVtXS5iaXRzOwogICAgICAgICAgICAgICAgIGN0eC0+bWJfY21wW21iXS5tYiA9IG1iOwogICAgICAgICAgICAgICAgIGN0eC0+bWJfY21wW21iXS52YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhX2JpdHMgPyAoKGN0eC0+bWJfcmNbY3R4LT5xc2NhbGVdW21iXS5zc2QgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm1iX3JjW2N0eC0+cXNjYWxlICsgMV1bbWJdLnNzZCkgKiAxMDApIC8KKyAgICAgICAgICAgICAgICAgICAgZGVsdGFfYml0cyA/ICgoY3R4LT5tYl9yY1tyY10uc3NkIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5tYl9yY1tyYyArIGN0eC0+bS5tYl9udW1dLnNzZCkgKiAxMDApIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YV9iaXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJTlRfTUlOOyAvLyBhdm9pZCBpbmNyZWFzaW5nIHFzY2FsZQogICAgICAgICAgICAgfQpAQCAtMTAxOSwxMyArMTI0MywxNCBAQAogICAgICAgICBpZiAoUkNfVkFSSUFOQ0UpCiAgICAgICAgICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIGRueGhkX21iX3Zhcl90aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgY3R4LT5tLm1iX2hlaWdodCk7Ci0gICAgICAgIHJhZGl4X3NvcnQoY3R4LT5tYl9jbXAsIGN0eC0+bS5tYl9udW0pOworICAgICAgICByYWRpeF9zb3J0KGN0eC0+bWJfY21wLCBjdHgtPm1iX2NtcF90bXAsIGN0eC0+bS5tYl9udW0pOwogICAgICAgICBmb3IgKHggPSAwOyB4IDwgY3R4LT5tLm1iX251bSAmJiBtYXhfYml0cyA+IGN0eC0+ZnJhbWVfYml0czsgeCsrKSB7CiAgICAgICAgICAgICBpbnQgbWIgPSBjdHgtPm1iX2NtcFt4XS5tYjsKLSAgICAgICAgICAgIG1heF9iaXRzIC09IGN0eC0+bWJfcmNbY3R4LT5xc2NhbGVdW21iXS5iaXRzIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bWJfcmNbY3R4LT5xc2NhbGUgKyAxXVttYl0uYml0czsKKyAgICAgICAgICAgIGludCByYyA9IChjdHgtPnFzY2FsZSAqIGN0eC0+bS5tYl9udW0gKSArIG1iOworICAgICAgICAgICAgbWF4X2JpdHMgLT0gY3R4LT5tYl9yY1tyY10uYml0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm1iX3JjW3JjICsgY3R4LT5tLm1iX251bV0uYml0czsKICAgICAgICAgICAgIGN0eC0+bWJfcXNjYWxlW21iXSA9IGN0eC0+cXNjYWxlICsgMTsKLSAgICAgICAgICAgIGN0eC0+bWJfYml0c1ttYl0gICA9IGN0eC0+bWJfcmNbY3R4LT5xc2NhbGUgKyAxXVttYl0uYml0czsKKyAgICAgICAgICAgIGN0eC0+bWJfYml0c1ttYl0gICA9IGN0eC0+bWJfcmNbcmMgKyBjdHgtPm0ubWJfbnVtXS5iaXRzOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtMTA1OCw3ICsxMjgzLDcgQEAKICAgICBpbnQgb2Zmc2V0LCBpLCByZXQ7CiAgICAgdWludDhfdCAqYnVmOwogCi0gICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIGN0eC0+Y2lkX3RhYmxlLT5mcmFtZV9zaXplLCAwKSkgPCAwKQorICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBjdHgtPmZyYW1lX3NpemUsIDApKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgYnVmID0gcGt0LT5kYXRhOwogCkBAIC0xMDk0LDE2ICsxMzE5LDE2IEBACiAKICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIGRueGhkX2VuY29kZV90aHJlYWQsIGJ1ZiwgTlVMTCwgY3R4LT5tLm1iX2hlaWdodCk7CiAKLSAgICBhdl9hc3NlcnQxKDY0MCArIG9mZnNldCArIDQgPD0gY3R4LT5jaWRfdGFibGUtPmNvZGluZ191bml0X3NpemUpOwotICAgIG1lbXNldChidWYgKyA2NDAgKyBvZmZzZXQsIDAsCi0gICAgICAgICAgIGN0eC0+Y2lkX3RhYmxlLT5jb2RpbmdfdW5pdF9zaXplIC0gNCAtIG9mZnNldCAtIDY0MCk7CisgICAgYXZfYXNzZXJ0MShjdHgtPmRhdGFfb2Zmc2V0ICsgb2Zmc2V0ICsgNCA8PSBjdHgtPmNvZGluZ191bml0X3NpemUpOworICAgIG1lbXNldChidWYgKyBjdHgtPmRhdGFfb2Zmc2V0ICsgb2Zmc2V0LCAwLAorICAgICAgICAgICBjdHgtPmNvZGluZ191bml0X3NpemUgLSA0IC0gb2Zmc2V0IC0gY3R4LT5kYXRhX29mZnNldCk7CiAKLSAgICBBVl9XQjMyKGJ1ZiArIGN0eC0+Y2lkX3RhYmxlLT5jb2RpbmdfdW5pdF9zaXplIC0gNCwgMHg2MDBEQzBERSk7IC8vIEVPRgorICAgIEFWX1dCMzIoYnVmICsgY3R4LT5jb2RpbmdfdW5pdF9zaXplIC0gNCwgMHg2MDBEQzBERSk7IC8vIEVPRgogCiAgICAgaWYgKGN0eC0+aW50ZXJsYWNlZCAmJiBmaXJzdF9maWVsZCkgewogICAgICAgICBmaXJzdF9maWVsZCAgICAgPSAwOwogICAgICAgICBjdHgtPmN1cl9maWVsZCBePSAxOwotICAgICAgICBidWYgICAgICAgICAgICArPSBjdHgtPmNpZF90YWJsZS0+Y29kaW5nX3VuaXRfc2l6ZTsKKyAgICAgICAgYnVmICAgICAgICAgICAgKz0gY3R4LT5jb2RpbmdfdW5pdF9zaXplOwogICAgICAgICBnb3RvIGVuY29kZV9jb2RpbmdfdW5pdDsKICAgICB9CiAKQEAgLTExMjMsNyArMTM0OCw3IEBACiBzdGF0aWMgYXZfY29sZCBpbnQgZG54aGRfZW5jb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgRE5YSERFbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGludCBtYXhfbGV2ZWwgICAgICAgID0gMSA8PCAoY3R4LT5jaWRfdGFibGUtPmJpdF9kZXB0aCArIDIpOworICAgIGludCBtYXhfbGV2ZWwgICAgICAgID0gMSA8PCAoY3R4LT5iaXRfZGVwdGggKyAyKTsKICAgICBpbnQgaTsKIAogICAgIGF2X2ZyZWUoY3R4LT52bGNfY29kZXMgLSBtYXhfbGV2ZWwgKiAyKTsKQEAgLTExMzUsNiArMTM2MCw3IEBACiAgICAgYXZfZnJlZXAoJmN0eC0+bWJfcXNjYWxlKTsKICAgICBhdl9mcmVlcCgmY3R4LT5tYl9yYyk7CiAgICAgYXZfZnJlZXAoJmN0eC0+bWJfY21wKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5tYl9jbXBfdG1wKTsKICAgICBhdl9mcmVlcCgmY3R4LT5zbGljZV9zaXplKTsKICAgICBhdl9mcmVlcCgmY3R4LT5zbGljZV9vZmZzKTsKIApAQCAtMTE2MywxMiArMTM4OSwxNSBAQAogICAgIC5pbml0ICAgICAgICAgICA9IGRueGhkX2VuY29kZV9pbml0LAogICAgIC5lbmNvZGUyICAgICAgICA9IGRueGhkX2VuY29kZV9waWN0dXJlLAogICAgIC5jbG9zZSAgICAgICAgICA9IGRueGhkX2VuY29kZV9lbmQsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IEFWX0NPREVDX0NBUF9JTlRSQV9PTkxZLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgewogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTAsCiAgICAgICAgIEFWX1BJWF9GTVRfTk9ORQogICAgIH0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmRueGhkX2NsYXNzLAogICAgIC5kZWZhdWx0cyAgICAgICA9IGRueGhkX2RlZmF1bHRzLAorICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX2RueGhkX3Byb2ZpbGVzKSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RueGhkZW5jLmggYi9saWJhdmNvZGVjL2RueGhkZW5jLmgKaW5kZXggM2Y1MzFlZi4uOTYzODIxYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kbnhoZGVuYy5oCisrKyBiL2xpYmF2Y29kZWMvZG54aGRlbmMuaApAQCAtMjYsNiArMjYsOCBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKKyNpbmNsdWRlICJjb25maWcuaCIKKwogI2luY2x1ZGUgIm1wZWd2aWRlby5oIgogI2luY2x1ZGUgImRueGhkZGF0YS5oIgogCkBAIC00NSw2ICs0Nyw5IEBACiAgICAgTXBlZ0VuY0NvbnRleHQgbTsgLy8vPCBVc2VkIGZvciBxdWFudGl6YXRpb24gZHNwIGZ1bmN0aW9ucwogCiAgICAgaW50IGNpZDsKKyAgICBpbnQgcHJvZmlsZTsKKyAgICBpbnQgYml0X2RlcHRoOworICAgIGludCBpc180NDQ7CiAgICAgY29uc3QgQ0lERW50cnkgKmNpZF90YWJsZTsKICAgICB1aW50OF90ICptc2lwOyAvLy88IE1hY3JvYmxvY2sgU2NhbiBJbmRleGVzIFBheWxvYWQKICAgICB1aW50MzJfdCAqc2xpY2Vfc2l6ZTsKQEAgLTU4LDYgKzYzLDEwIEBACiAgICAgdW5zaWduZWQgZGN0X3V2X29mZnNldDsKICAgICB1bnNpZ25lZCBibG9ja193aWR0aF9sMjsKIAorICAgIGludCBmcmFtZV9zaXplOworICAgIGludCBjb2RpbmdfdW5pdF9zaXplOworICAgIGludCBkYXRhX29mZnNldDsKKwogICAgIGludCBpbnRlcmxhY2VkOwogICAgIGludCBjdXJfZmllbGQ7CiAKQEAgLTY1LDcgKzc0LDkgQEAKICAgICB1bnNpZ25lZCBtaW5fcGFkZGluZzsKICAgICBpbnQgaW50cmFfcXVhbnRfYmlhczsKIAotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2tzKVs4XVs2NF07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBpbnQxNl90LCBibG9ja3MpWzEyXVs2NF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBlZGdlX2J1Zl95KVs1MTJdOyAvLyBoYXMgdG8gaG9sZCAxNngxNiB1aW50MTYgd2hlbiBkZXB0aD0xMAorICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgZWRnZV9idWZfdXYpWzJdWzUxMl07IC8vIGhhcyB0byBob2xkIDE2eDE2IHVpbnQxNl90IHdoZW4gZGVwdGg9MTAKIAogICAgIGludCAgICAgICgqcW1hdHJpeF9jKSAgICAgWzY0XTsKICAgICBpbnQgICAgICAoKnFtYXRyaXhfbCkgICAgIFs2NF07CkBAIC04OSwxMCArMTAwLDExIEBACiAgICAgdWludDhfdCAgKm1iX3FzY2FsZTsKIAogICAgIFJDQ01QRW50cnkgKm1iX2NtcDsKLSAgICBSQ0VudHJ5ICAgKCptYl9yYylbODE2MF07CisgICAgUkNDTVBFbnRyeSAqbWJfY21wX3RtcDsKKyAgICBSQ0VudHJ5ICAgICptYl9yYzsKIAotICAgIHZvaWQgKCpnZXRfcGl4ZWxzXzh4NF9zeW0pKGludDE2X3QgKiAvKiBhbGlnbiAxNiAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICosIHB0cmRpZmZfdCk7CisgICAgdm9pZCAoKmdldF9waXhlbHNfOHg0X3N5bSkoaW50MTZfdCAqYXZfcmVzdHJpY3QgLyogYWxpZ24gMTYgKi8gYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplKTsKIH0gRE5YSERFbmNDb250ZXh0OwogCiB2b2lkIGZmX2RueGhkZW5jX2luaXRfeDg2KEROWEhERW5jQ29udGV4dCAqY3R4KTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZG9sYnlfZS5jIGIvbGliYXZjb2RlYy9kb2xieV9lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhMDBjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZG9sYnlfZS5jCkBAIC0wLDAgKzEsNzE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IGZvbzg2CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgImRvbGJ5X2UuaCIKKyNpbmNsdWRlICJmZnQuaCIKKworc3RhdGljIGludCBza2lwX2lucHV0KERCRUNvbnRleHQgKnMsIGludCBuYl93b3JkcykKK3sKKyAgICBpZiAobmJfd29yZHMgPiBzLT5pbnB1dF9zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmlucHV0ICAgICAgKz0gbmJfd29yZHMgKiBzLT53b3JkX2J5dGVzOworICAgIHMtPmlucHV0X3NpemUgLT0gbmJfd29yZHM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfa2V5KERCRUNvbnRleHQgKnMpCit7CisgICAgaWYgKHMtPmtleV9wcmVzZW50KSB7CisgICAgICAgIHVpbnQ4X3QgKmtleSA9IHMtPmlucHV0OworICAgICAgICBpbnQgICAgICByZXQgPSBza2lwX2lucHV0KHMsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldHVybiBBVl9SQjI0KGtleSkgPj4gMjQgLSBzLT53b3JkX2JpdHM7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbnZlcnRfaW5wdXQoREJFQ29udGV4dCAqcywgaW50IG5iX3dvcmRzLCBpbnQga2V5KQoreworICAgIHVpbnQ4X3QgKnNyYyA9IHMtPmlucHV0OworICAgIHVpbnQ4X3QgKmRzdCA9IHMtPmJ1ZmZlcjsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIGludCBpOworCisgICAgYXZfYXNzZXJ0MChuYl93b3JkcyA8PSAxMDI0dSk7CisKKyAgICBpZiAobmJfd29yZHMgPiBzLT5pbnB1dF9zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHN3aXRjaCAocy0+d29yZF9iaXRzKSB7CisgICAgY2FzZSAxNjoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3dvcmRzOyBpKyssIHNyYyArPSAyLCBkc3QgKz0gMikKKyAgICAgICAgICAgIEFWX1dCMTYoZHN0LCBBVl9SQjE2KHNyYykgXiBrZXkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDIwOgorICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgcy0+YnVmZmVyLCBzaXplb2Yocy0+YnVmZmVyKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl93b3JkczsgaSsrLCBzcmMgKz0gMykKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMjAsIEFWX1JCMjQoc3JjKSA+PiA0IF4ga2V5KTsKKyAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX3dvcmRzOyBpKyssIHNyYyArPSAzLCBkc3QgKz0gMykKKyAgICAgICAgICAgIEFWX1dCMjQoZHN0LCBBVl9SQjI0KHNyYykgXiBrZXkpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIHJldHVybiBpbml0X2dldF9iaXRzKCZzLT5nYiwgcy0+YnVmZmVyLCBuYl93b3JkcyAqIHMtPndvcmRfYml0cyk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbWV0YWRhdGEoREJFQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgcmV0LCBrZXksIG10ZF9zaXplOworCisgICAgaWYgKChrZXkgPSBwYXJzZV9rZXkocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIGtleTsKKyAgICBpZiAoKHJldCA9IGNvbnZlcnRfaW5wdXQocywgMSwga2V5KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc2tpcF9iaXRzKCZzLT5nYiwgNCk7CisgICAgbXRkX3NpemUgPSBnZXRfYml0cygmcy0+Z2IsIDEwKTsKKyAgICBpZiAoIW10ZF9zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBtZXRhZGF0YSBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBjb252ZXJ0X2lucHV0KHMsIG10ZF9zaXplLCBrZXkpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBza2lwX2JpdHMoJnMtPmdiLCAxNCk7CisgICAgcy0+cHJvZ19jb25mID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKyAgICBpZiAocy0+cHJvZ19jb25mID4gTUFYX1BST0dfQ09ORikgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcHJvZ3JhbSBjb25maWd1cmF0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+bmJfY2hhbm5lbHMgPSBuYl9jaGFubmVsc190YWJbcy0+cHJvZ19jb25mXTsKKyAgICBzLT5uYl9wcm9ncmFtcyA9IG5iX3Byb2dyYW1zX3RhYltzLT5wcm9nX2NvbmZdOworCisgICAgcy0+ZnJfY29kZSAgICAgID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKKyAgICBzLT5mcl9jb2RlX29yaWcgPSBnZXRfYml0cygmcy0+Z2IsIDQpOworICAgIGlmICghc2FtcGxlX3JhdGVfdGFiW3MtPmZyX2NvZGVdIHx8CisgICAgICAgICFzYW1wbGVfcmF0ZV90YWJbcy0+ZnJfY29kZV9vcmlnXSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgcmF0ZSBjb2RlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCA4OCk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYW5uZWxzOyBpKyspCisgICAgICAgIHMtPmNoX3NpemVbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDEwKTsKKyAgICBzLT5tdGRfZXh0X3NpemUgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgIHMtPm1ldGVyX3NpemUgICA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisKKyAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIDEwICogcy0+bmJfcHJvZ3JhbXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIHMtPnJldl9pZFtpXSAgICAgPSBnZXRfYml0cygmcy0+Z2IsICA0KTsKKyAgICAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOworICAgICAgICBzLT5iZWdpbl9nYWluW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCAxMCk7CisgICAgICAgIHMtPmVuZF9nYWluW2ldICAgPSBnZXRfYml0cygmcy0+Z2IsIDEwKTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlYWQgcGFzdCBlbmQgb2YgbWV0YWRhdGFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gc2tpcF9pbnB1dChzLCBtdGRfc2l6ZSArIDEpOworfQorCitzdGF0aWMgaW50IHBhcnNlX21ldGFkYXRhX2V4dChEQkVDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5tdGRfZXh0X3NpemUpCisgICAgICAgIHJldHVybiBza2lwX2lucHV0KHMsIHMtPmtleV9wcmVzZW50ICsgcy0+bXRkX2V4dF9zaXplICsgMSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVuYmlhc19leHBvbmVudHMoREJFQ29udGV4dCAqcywgREJFQ2hhbm5lbCAqYywgREJFR3JvdXAgKmcpCit7CisgICAgaW50IG1zdHJfZXhwW01BWF9NU1RSX0VYUF07CisgICAgaW50IGJpYXNfZXhwW01BWF9CSUFTX0VYUF07CisgICAgaW50IGksIGosIGs7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bmJfbXN0cl9leHA7IGkrKykKKyAgICAgICAgbXN0cl9leHBbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDIpICogNjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBnLT5uYl9leHBvbmVudDsgaSsrKQorICAgICAgICBiaWFzX2V4cFtpXSA9IGdldF9iaXRzKCZzLT5nYiwgNSk7CisKKyAgICBmb3IgKGkgPSBrID0gMDsgaSA8IGMtPm5iX21zdHJfZXhwOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBnLT5uYl9iaWFzX2V4cFtpXTsgaisrLCBrKyspCisgICAgICAgICAgICBjLT5leHBvbmVudHNbZy0+ZXhwX29mcyArIGtdID0gbXN0cl9leHBbaV0gKyBiaWFzX2V4cFtrXTsKK30KKworc3RhdGljIGludCBwYXJzZV9leHBvbmVudHMoREJFQ29udGV4dCAqcywgREJFQ2hhbm5lbCAqYykKK3sKKyAgICBEQkVHcm91cCAqcCwgKmc7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwLCBwID0gTlVMTCwgZyA9IGMtPmdyb3VwczsgaSA8IGMtPm5iX2dyb3VwczsgaSsrLCBwID0gZywgZysrKSB7CisgICAgICAgIGMtPmV4cF9zdHJhdGVneVtpXSA9ICFpIHx8IGctPm5iX2V4cG9uZW50ICE9IHAtPm5iX2V4cG9uZW50IHx8IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICBpZiAoYy0+ZXhwX3N0cmF0ZWd5W2ldKSB7CisgICAgICAgICAgICB1bmJpYXNfZXhwb25lbnRzKHMsIGMsIGcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KGMtPmV4cG9uZW50cyArIGctPmV4cF9vZnMsCisgICAgICAgICAgICAgICAgICAgYy0+ZXhwb25lbnRzICsgcC0+ZXhwX29mcywKKyAgICAgICAgICAgICAgICAgICBnLT5uYl9leHBvbmVudCAqIHNpemVvZihjLT5leHBvbmVudHNbMF0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsb2dfYWRkKGludCBhLCBpbnQgYikKK3sKKyAgICBpbnQgYyA9IEZGQUJTKGEgLSBiKSA+PiAxOworICAgIHJldHVybiBGRk1BWChhLCBiKSArIGxvZ19hZGRfdGFiW0ZGTUlOKGMsIDIxMSldOworfQorCitzdGF0aWMgdm9pZCBjYWxjX2xvd2NvbXAoaW50ICptc2tfdmFsKQoreworICAgIGludCBsd2NfdmFsWzE3XSA9IHsgMCB9OworICAgIGludCBpLCBqLCBrOworCisgICAgZm9yIChpID0gMDsgaSA8IDExOyBpKyspIHsKKyAgICAgICAgaW50IG1heF9qID0gMDsKKyAgICAgICAgaW50IG1heF92ID0gSU5UX01JTjsKKyAgICAgICAgaW50IHRociAgID0gMDsKKworICAgICAgICBmb3IgKGogPSBGRk1BWChpIC0gMywgMCksIGsgPSAwOyBqIDw9IGkgKyAzOyBqKyssIGsrKykgeworICAgICAgICAgICAgaW50IHYgPSBtc2tfdmFsW2pdICsgbHdjX2dhaW5fdGFiW2ldW2tdOworICAgICAgICAgICAgaWYgKHYgPiBtYXhfdikgeworICAgICAgICAgICAgICAgIG1heF9qID0gajsKKyAgICAgICAgICAgICAgICBtYXhfdiA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHIgPSBsb2dfYWRkKHRociwgdik7CisgICAgICAgIH0KKworICAgICAgICBpZiAobXNrX3ZhbFtpXSA8IHRocikgeworICAgICAgICAgICAgZm9yIChqID0gRkZNQVgobWF4X2ogLSAzLCAwKSwKKyAgICAgICAgICAgICAgICAgayA9IEZGTUFYKDMgLSBtYXhfaiwgMCk7CisgICAgICAgICAgICAgICAgIGogPD0gbWF4X2ogKyAzOyBqKyssIGsrKykKKyAgICAgICAgICAgICAgICBsd2NfdmFsW2pdICs9IGx3Y19hZGpfdGFiW2tdOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgaW50IHYgPSBGRk1BWChsd2NfdmFsW2ldLCAtNTEyKTsKKyAgICAgICAgbXNrX3ZhbFtpXSA9IEZGTUFYKG1za192YWxbaV0gKyB2LCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJpdF9hbGxvY2F0ZShpbnQgbmJfZXhwb25lbnQsIGludCBuYl9jb2RlLCBpbnQgZnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmV4cCwgaW50ICpiYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZnX3NwYywgaW50IGZnX29mcywgaW50IG1za19tb2QsIGludCBzbnJfb2ZzKQoreworICAgIGludCBtc2tfdmFsW01BWF9CSUFTX0VYUF07CisgICAgaW50IHBzZF92YWxbTUFYX0JJQVNfRVhQXTsKKyAgICBpbnQgZmFzdF9sZWFrICA9IDA7CisgICAgaW50IHNsb3dfbGVhayAgPSAwOworICAgIGludCBkY19jb2RlICAgID0gZGNfY29kZV90YWJbZnJfY29kZSAtIDFdOworICAgIGludCBodF9jb2RlICAgID0gaHRfY29kZV90YWJbZnJfY29kZSAtIDFdOworICAgIGludCBmYXN0X2dhaW4gID0gZmFzdF9nYWluX3RhYltmZ19vZnNdOworICAgIGludCBzbG93X2RlY2F5ID0gc2xvd19kZWNheV90YWJbZGNfY29kZV1bbXNrX21vZF07CisgICAgaW50IG1pc2NfZGVjYXkgPSBtaXNjX2RlY2F5X3RhYltuYl9jb2RlXVtkY19jb2RlXVttc2tfbW9kXTsKKyAgICBjb25zdCB1aW50MTZfdCAqc2xvd19nYWluICAgICAgPSBzbG93X2dhaW5fdGFiW25iX2NvZGVdW21za19tb2RdOworICAgIGNvbnN0IHVpbnQxNl90ICpmYXN0X2RlY2F5ICAgICA9IGZhc3RfZGVjYXlfdGFiW25iX2NvZGVdW2RjX2NvZGVdW21za19tb2RdOworICAgIGNvbnN0IHVpbnQxNl90ICpmYXN0X2dhaW5fYWRqICA9IGZhc3RfZ2Fpbl9hZGpfdGFiW25iX2NvZGVdW2RjX2NvZGVdOworICAgIGNvbnN0IHVpbnQxNl90ICpoZWFyaW5nX3RocmVzaCA9IGhlYXJpbmdfdGhyZXNoX3RhYltuYl9jb2RlXVtodF9jb2RlXTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9leHBvbmVudDsgaSsrKQorICAgICAgICBwc2RfdmFsW2ldID0gKDQ4IC0gZXhwW2ldKSAqIDY0OworCisgICAgZmFzdF9nYWluX2FkaiArPSBiYW5kX29mc190YWJbbmJfY29kZV1bZmdfc3BjXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZXhwb25lbnQ7IGkrKykgeworICAgICAgICBmYXN0X2xlYWsgPSBsb2dfYWRkKGZhc3RfbGVhayAgLSBmYXN0X2RlY2F5W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzZF92YWxbaV0gLSBmYXN0X2dhaW4gKyBmYXN0X2dhaW5fYWRqW2ldKTsKKyAgICAgICAgc2xvd19sZWFrID0gbG9nX2FkZChzbG93X2xlYWsgIC0gc2xvd19kZWNheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2RfdmFsW2ldIC0gc2xvd19nYWluW2ldKTsKKyAgICAgICAgbXNrX3ZhbFtpXSA9IEZGTUFYKGZhc3RfbGVhaywgc2xvd19sZWFrKTsKKyAgICB9CisKKyAgICBmYXN0X2xlYWsgPSAwOworICAgIGZvciAoaSA9IG5iX2V4cG9uZW50IC0gMTsgaSA+IGJhbmRfbG93X3RhYltuYl9jb2RlXTsgaS0tKSB7CisgICAgICAgIGZhc3RfbGVhayA9IGxvZ19hZGQoZmFzdF9sZWFrIC0gbWlzY19kZWNheSwgcHNkX3ZhbFtpXSAtIGZhc3RfZ2Fpbik7CisgICAgICAgIG1za192YWxbaV0gPSBGRk1BWChtc2tfdmFsW2ldLCBmYXN0X2xlYWspOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9leHBvbmVudDsgaSsrKQorICAgICAgICBtc2tfdmFsW2ldID0gRkZNQVgobXNrX3ZhbFtpXSwgaGVhcmluZ190aHJlc2hbaV0pOworCisgICAgaWYgKCFuYl9jb2RlKQorICAgICAgICBjYWxjX2xvd2NvbXAobXNrX3ZhbCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZXhwb25lbnQ7IGkrKykgeworICAgICAgICBpbnQgdiA9IDE2ICogKHNucl9vZnMgLSA2NCkgKyBwc2RfdmFsW2ldIC0gbXNrX3ZhbFtpXSA+PiA1OworICAgICAgICBiYXBbaV0gPSBiYXBfdGFiW2F2X2NsaXBfdWludHAyKHYsIDYpXTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYml0X2FsbG9jKERCRUNvbnRleHQgKnMsIERCRUNoYW5uZWwgKmMpCit7CisgICAgREJFR3JvdXAgKnAsICpnOworICAgIGludCBiYXBfc3RyYXRlZ3lbTUFYX0dST1VQU10sIGZnX3NwY1tNQVhfR1JPVVBTXTsKKyAgICBpbnQgZmdfb2ZzW01BWF9HUk9VUFNdLCBtc2tfbW9kW01BWF9HUk9VUFNdOworICAgIGludCBpLCBzbnJfb2ZzOworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5iX2dyb3VwczsgaSsrKSB7CisgICAgICAgIGJhcF9zdHJhdGVneVtpXSA9ICFpIHx8IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICBpZiAoYmFwX3N0cmF0ZWd5W2ldKSB7CisgICAgICAgICAgICAgZmdfc3BjW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKyAgICAgICAgICAgICBmZ19vZnNbaV0gPSBnZXRfYml0cygmcy0+Z2IsIDMpOworICAgICAgICAgICAgbXNrX21vZFtpXSA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIGZnX3NwY1tpXSA9ICBmZ19zcGNbaSAtIDFdOworICAgICAgICAgICAgIGZnX29mc1tpXSA9ICBmZ19vZnNbaSAtIDFdOworICAgICAgICAgICAgbXNrX21vZFtpXSA9IG1za19tb2RbaSAtIDFdOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiRGVsdGEgYml0IGFsbG9jYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHNucl9vZnMgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgIGlmICghc25yX29mcykgeworICAgICAgICBtZW1zZXQoYy0+YmFwLCAwLCBzaXplb2YoYy0+YmFwKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaSA9IDAsIHAgPSBOVUxMLCBnID0gYy0+Z3JvdXBzOyBpIDwgYy0+bmJfZ3JvdXBzOyBpKyssIHAgPSBnLCBnKyspIHsKKyAgICAgICAgaWYgKGMtPmV4cF9zdHJhdGVneVtpXSB8fCBiYXBfc3RyYXRlZ3lbaV0pIHsKKyAgICAgICAgICAgIGJpdF9hbGxvY2F0ZShnLT5uYl9leHBvbmVudCwgZy0+aW1kY3RfaWR4LCBzLT5mcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmV4cG9uZW50cyArIGctPmV4cF9vZnMsIGMtPmJhcCArIGctPmV4cF9vZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmdfc3BjW2ldLCBmZ19vZnNbaV0sIG1za19tb2RbaV0sIHNucl9vZnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KGMtPmJhcCArIGctPmV4cF9vZnMsCisgICAgICAgICAgICAgICAgICAgYy0+YmFwICsgcC0+ZXhwX29mcywKKyAgICAgICAgICAgICAgICAgICBnLT5uYl9leHBvbmVudCAqIHNpemVvZihjLT5iYXBbMF0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2luZGljZXMoREJFQ29udGV4dCAqcywgREJFQ2hhbm5lbCAqYykKK3sKKyAgICBEQkVHcm91cCAqcCwgKmc7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwLCBwID0gTlVMTCwgZyA9IGMtPmdyb3VwczsgaSA8IGMtPm5iX2dyb3VwczsgaSsrLCBwID0gZywgZysrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgaW50IHN0YXJ0ID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKKworICAgICAgICAgICAgaWYgKHN0YXJ0ID4gZy0+bmJfZXhwb25lbnQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc3RhcnQgaW5kZXhcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3RhcnQ7IGorKykKKyAgICAgICAgICAgICAgICBjLT5pZHhbZy0+ZXhwX29mcyArIGpdID0gMDsKKworICAgICAgICAgICAgZm9yICg7IGogPCBnLT5uYl9leHBvbmVudDsgaisrKQorICAgICAgICAgICAgICAgIGMtPmlkeFtnLT5leHBfb2ZzICsgal0gPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgICAgICB9IGVsc2UgaWYgKGkgJiYgZy0+bmJfZXhwb25lbnQgPT0gcC0+bmJfZXhwb25lbnQpIHsKKyAgICAgICAgICAgIG1lbWNweShjLT5pZHggKyBnLT5leHBfb2ZzLAorICAgICAgICAgICAgICAgICAgIGMtPmlkeCArIHAtPmV4cF9vZnMsCisgICAgICAgICAgICAgICAgICAgZy0+bmJfZXhwb25lbnQgKiBzaXplb2YoYy0+aWR4WzBdKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQoYy0+aWR4ICsgZy0+ZXhwX29mcywgMCwgZy0+bmJfZXhwb25lbnQgKiBzaXplb2YoYy0+aWR4WzBdKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9tYW50aXNzYXMoREJFQ29udGV4dCAqcywgREJFQ2hhbm5lbCAqYykKK3sKKyAgICBEQkVHcm91cCAqZzsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGZvciAoaSA9IDAsIGcgPSBjLT5ncm91cHM7IGkgPCBjLT5uYl9ncm91cHM7IGkrKywgZysrKSB7CisgICAgICAgIGZsb2F0ICptbnQgPSBjLT5tYW50aXNzYXMgKyBnLT5tbnRfb2ZzOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBnLT5uYl9leHBvbmVudDsgaisrKSB7CisgICAgICAgICAgICBpbnQgYmFwICAgICA9IGMtPmJhcFtnLT5leHBfb2ZzICsgal07CisgICAgICAgICAgICBpbnQgaWR4ICAgICA9IGMtPmlkeFtnLT5leHBfb2ZzICsgal07CisgICAgICAgICAgICBpbnQgc2l6ZTEgICA9IG1hbnRpc3NhX3NpemUxW2JhcF1baWR4XTsKKyAgICAgICAgICAgIGludCBjb3VudCAgID0gZy0+bmJfbWFudGlzc2Fbal07CisgICAgICAgICAgICBmbG9hdCBleHAgICA9IGV4cG9uZW50X3RhYltjLT5leHBvbmVudHNbZy0+ZXhwX29mcyArIGpdXTsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gbWFudGlzc2FfdGFiMVtzaXplMV1baWR4XSAqIGV4cDsKKworICAgICAgICAgICAgaWYgKCFzaXplMSkgeworICAgICAgICAgICAgICAgIG1lbXNldChtbnQsIDAsIGNvdW50ICogc2l6ZW9mKCptbnQpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaWR4KSB7CisgICAgICAgICAgICAgICAgaW50IHZhbHVlc1sxMDBdOworICAgICAgICAgICAgICAgIGludCBlc2NhcGUgPSAtKDEgPDwgc2l6ZTEgLSAxKTsKKworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBjb3VudDsgaysrKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZXNba10gPSBnZXRfc2JpdHMoJnMtPmdiLCBzaXplMSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY291bnQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVzW2tdICE9IGVzY2FwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbW50W2tdID0gdmFsdWVzW2tdICogc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZTIgPSBtYW50aXNzYV9zaXplMltiYXBdW2lkeF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUgPSBnZXRfc2JpdHMoJnMtPmdiLCBzaXplMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhID0gbWFudGlzc2FfdGFiMltzaXplMl1baWR4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGIgPSBtYW50aXNzYV90YWIzW3NpemUyXVtpZHhdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtbnRba10gPSAoKHZhbHVlICsgMSkgKiBhIC0gYikgKiBleHA7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW50W2tdID0gKHZhbHVlICogYSArIGIpICogZXhwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgY291bnQ7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgbW50W2tdID0gZ2V0X3NiaXRzKCZzLT5nYiwgc2l6ZTEpICogc2NhbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1udCArPSBjb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoOyBqIDwgZy0+bmJfZXhwb25lbnQgKyBjLT5id19jb2RlOyBqKyspIHsKKyAgICAgICAgICAgIG1lbXNldChtbnQsIDAsIGctPm5iX21hbnRpc3NhW2pdICogc2l6ZW9mKCptbnQpKTsKKyAgICAgICAgICAgIG1udCArPSBnLT5uYl9tYW50aXNzYVtqXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2NoYW5uZWwoREJFQ29udGV4dCAqcywgaW50IGNoLCBpbnQgc2VnX2lkKQoreworICAgIERCRUNoYW5uZWwgKmMgPSAmcy0+Y2hhbm5lbHNbc2VnX2lkXVtjaF07CisgICAgaW50IGksIHJldDsKKworICAgIGlmIChzLT5yZXZfaWRbY2hdID4gMSkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIkVuY29kZXIgcmV2aXNpb24gJWQiLCBzLT5yZXZfaWRbY2hdKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmIChjaCA9PSBsZmVfY2hhbm5lbF90YWJbcy0+cHJvZ19jb25mXSkgeworICAgICAgICBjLT5ncl9jb2RlID0gMzsKKyAgICAgICAgYy0+YndfY29kZSA9IDI5OworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPmdyX2NvZGUgPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgICAgICBjLT5id19jb2RlID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKKyAgICAgICAgaWYgKGMtPmdyX2NvZGUgPT0gMykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGdyb3VwIHR5cGUgY29kZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMtPm5iX2dyb3VwcyAgID0gbmJfZ3JvdXBzX3RhYltjLT5ncl9jb2RlXTsKKyAgICBjLT5uYl9tc3RyX2V4cCA9IG5iX21zdHJfZXhwX3RhYltjLT5ncl9jb2RlXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uYl9ncm91cHM7IGkrKykgeworICAgICAgICBjLT5ncm91cHNbaV0gPSBmcm1fb2ZzX3RhYltzZWdfaWRdW2MtPmdyX2NvZGVdW2ldOworICAgICAgICBpZiAoYy0+bmJfbXN0cl9leHAgPT0gMikgeworICAgICAgICAgICAgYy0+Z3JvdXBzW2ldLm5iX2V4cG9uZW50ICAgIC09IGMtPmJ3X2NvZGU7CisgICAgICAgICAgICBjLT5ncm91cHNbaV0ubmJfYmlhc19leHBbMV0gLT0gYy0+YndfY29kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocmV0ID0gcGFyc2VfZXhwb25lbnRzKHMsIGMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBwYXJzZV9iaXRfYWxsb2MocywgYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IHBhcnNlX2luZGljZXMocywgYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IHBhcnNlX21hbnRpc3NhcyhzLCBjKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWFkIHBhc3QgZW5kIG9mIGNoYW5uZWwgJWRcbiIsIGNoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfYXVkaW8oREJFQ29udGV4dCAqcywgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgc2VnX2lkKQoreworICAgIGludCBjaCwgcmV0LCBrZXk7CisKKyAgICBpZiAoKGtleSA9IHBhcnNlX2tleShzKSkgPCAwKQorICAgICAgICByZXR1cm4ga2V5OworCisgICAgZm9yIChjaCA9IHN0YXJ0OyBjaCA8IGVuZDsgY2grKykgeworICAgICAgICBpZiAoIXMtPmNoX3NpemVbY2hdKSB7CisgICAgICAgICAgICBzLT5jaGFubmVsc1tzZWdfaWRdW2NoXS5uYl9ncm91cHMgPSAwOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBjb252ZXJ0X2lucHV0KHMsIHMtPmNoX3NpemVbY2hdLCBrZXkpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IHBhcnNlX2NoYW5uZWwocywgY2gsIHNlZ19pZCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBzLT5jaGFubmVsc1tzZWdfaWRdW2NoXS5uYl9ncm91cHMgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gc2tpcF9pbnB1dChzLCBzLT5jaF9zaXplW2NoXSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHNraXBfaW5wdXQocywgMSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbWV0ZXIoREJFQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+bWV0ZXJfc2l6ZSkKKyAgICAgICAgcmV0dXJuIHNraXBfaW5wdXQocywgcy0+a2V5X3ByZXNlbnQgKyBzLT5tZXRlcl9zaXplICsgMSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGltZGN0X2NhbGMoREJFQ29udGV4dCAqcywgREJFR3JvdXAgKmcsIGZsb2F0ICpyZXN1bHQsIGZsb2F0ICp2YWx1ZXMpCit7CisgICAgRkZUQ29udGV4dCAqaW1kY3QgPSAmcy0+aW1kY3RbZy0+aW1kY3RfaWR4XTsKKyAgICBpbnQgbiAgID0gMSA8PCBpbWRjdF9iaXRzX3RhYltnLT5pbWRjdF9pZHhdOworICAgIGludCBuMiAgPSBuID4+IDE7CisgICAgaW50IGk7CisKKyAgICBzd2l0Y2ggKGctPmltZGN0X3BocykgeworICAgIGNhc2UgMDoKKyAgICAgICAgaW1kY3QtPmltZGN0X2hhbGYoaW1kY3QsIHJlc3VsdCwgdmFsdWVzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG4yOyBpKyspCisgICAgICAgICAgICByZXN1bHRbbjIgKyBpXSA9IHJlc3VsdFtuMiAtIGkgLSAxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpbWRjdC0+aW1kY3RfY2FsYyhpbWRjdCwgcmVzdWx0LCB2YWx1ZXMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIGltZGN0LT5pbWRjdF9oYWxmKGltZGN0LCByZXN1bHQgKyBuMiwgdmFsdWVzKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG4yOyBpKyspCisgICAgICAgICAgICByZXN1bHRbaV0gPSAtcmVzdWx0W24gLSBpIC0gMV07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm0oREJFQ29udGV4dCAqcywgREJFQ2hhbm5lbCAqYywgZmxvYXQgKmhpc3RvcnksIGZsb2F0ICpvdXRwdXQpCit7CisgICAgTE9DQUxfQUxJR05FRF8zMihmbG9hdCwgYnVmZmVyLCBbMjA0OF0pOworICAgIExPQ0FMX0FMSUdORURfMzIoZmxvYXQsIHJlc3VsdCwgWzExNTJdKTsKKyAgICBEQkVHcm91cCAqZzsKKyAgICBpbnQgaTsKKworICAgIG1lbXNldChyZXN1bHQsIDAsIDExNTIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBmb3IgKGkgPSAwLCBnID0gYy0+Z3JvdXBzOyBpIDwgYy0+bmJfZ3JvdXBzOyBpKyssIGcrKykgeworICAgICAgICBmbG9hdCAqc3JjID0gYnVmZmVyICsgZy0+c3JjX29mczsKKyAgICAgICAgZmxvYXQgKmRzdCA9IHJlc3VsdCArIGctPmRzdF9vZnM7CisgICAgICAgIGZsb2F0ICp3aW4gPSB3aW5kb3cgKyBnLT53aW5fb2ZzOworCisgICAgICAgIGltZGN0X2NhbGMocywgZywgYnVmZmVyLCBjLT5tYW50aXNzYXMgKyBnLT5tbnRfb2ZzKTsKKyAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfYWRkKGRzdCwgc3JjLCB3aW4sIGRzdCwgZy0+d2luX2xlbik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBvdXRwdXRbaV0gPSBoaXN0b3J5W2ldICsgcmVzdWx0W2ldOworICAgIGZvciAoaSA9IDI1NjsgaSA8IDg5NjsgaSsrKQorICAgICAgICBvdXRwdXRbaV0gPSByZXN1bHRbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBoaXN0b3J5W2ldID0gcmVzdWx0Wzg5NiArIGldOworfQorCitzdGF0aWMgdm9pZCBhcHBseV9nYWluKERCRUNvbnRleHQgKnMsIGludCBiZWdpbiwgaW50IGVuZCwgZmxvYXQgKm91dHB1dCkKK3sKKyAgICBpZiAoYmVnaW4gPT0gOTYwICYmIGVuZCA9PSA5NjApCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChiZWdpbiA9PSBlbmQpIHsKKyAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKG91dHB1dCwgb3V0cHV0LCBnYWluX3RhYltlbmRdLCBGUkFNRV9TQU1QTEVTKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCBhID0gZ2Fpbl90YWJbYmVnaW5dICogKDEuMGYgLyAoRlJBTUVfU0FNUExFUyAtIDEpKTsKKyAgICAgICAgZmxvYXQgYiA9IGdhaW5fdGFiW2VuZCAgXSAqICgxLjBmIC8gKEZSQU1FX1NBTVBMRVMgLSAxKSk7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGUkFNRV9TQU1QTEVTOyBpKyspCisgICAgICAgICAgICBvdXRwdXRbaV0gKj0gYSAqIChGUkFNRV9TQU1QTEVTIC0gaSAtIDEpICsgYiAqIGk7CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShEQkVDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpyZW9yZGVyOworICAgIGludCBjaCwgcmV0OworCisgICAgaWYgKHMtPm5iX2NoYW5uZWxzID09IDQpCisgICAgICAgIHJlb3JkZXIgPSBjaF9yZW9yZGVyXzQ7CisgICAgZWxzZSBpZiAocy0+bmJfY2hhbm5lbHMgPT0gNikKKyAgICAgICAgcmVvcmRlciA9IGNoX3Jlb3JkZXJfNjsKKyAgICBlbHNlIGlmIChzLT5uYl9wcm9ncmFtcyA9PSAxICYmICEocy0+YXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9MQVlPVVRfTkFUSVZFKSkKKyAgICAgICAgcmVvcmRlciA9IGNoX3Jlb3JkZXJfODsKKyAgICBlbHNlCisgICAgICAgIHJlb3JkZXIgPSBjaF9yZW9yZGVyX247CisKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IEZSQU1FX1NBTVBMRVM7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKHMtPmF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZsb2F0ICpvdXRwdXQgPSAoZmxvYXQgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtyZW9yZGVyW2NoXV07CisgICAgICAgIHRyYW5zZm9ybShzLCAmcy0+Y2hhbm5lbHNbMF1bY2hdLCBzLT5oaXN0b3J5W2NoXSwgb3V0cHV0KTsKKyAgICAgICAgdHJhbnNmb3JtKHMsICZzLT5jaGFubmVsc1sxXVtjaF0sIHMtPmhpc3RvcnlbY2hdLCBvdXRwdXQgKyBGUkFNRV9TQU1QTEVTIC8gMik7CisgICAgICAgIGFwcGx5X2dhaW4ocywgcy0+YmVnaW5fZ2FpbltjaF0sIHMtPmVuZF9nYWluW2NoXSwgb3V0cHV0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb2xieV9lX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIERCRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpLCBqLCBoZHIsIHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8IDMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaGRyID0gQVZfUkIyNChhdnBrdC0+ZGF0YSk7CisgICAgaWYgKChoZHIgJiAweGZmZmZmZSkgPT0gMHg3ODg4ZSkgeworICAgICAgICBzLT53b3JkX2JpdHMgPSAyNDsKKyAgICB9IGVsc2UgaWYgKChoZHIgJiAweGZmZmZlMCkgPT0gMHg3ODhlMCkgeworICAgICAgICBzLT53b3JkX2JpdHMgPSAyMDsKKyAgICB9IGVsc2UgaWYgKChoZHIgJiAweGZmZmUwMCkgPT0gMHg3OGUwMCkgeworICAgICAgICBzLT53b3JkX2JpdHMgPSAxNjsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+d29yZF9ieXRlcyAgPSBzLT53b3JkX2JpdHMgKyA3ID4+IDM7CisgICAgcy0+aW5wdXQgICAgICAgPSBhdnBrdC0+ZGF0YSArIHMtPndvcmRfYnl0ZXM7CisgICAgcy0+aW5wdXRfc2l6ZSAgPSBhdnBrdC0+c2l6ZSAvIHMtPndvcmRfYnl0ZXMgLSAxOworICAgIHMtPmtleV9wcmVzZW50ID0gaGRyID4+IDI0IC0gcy0+d29yZF9iaXRzICYgMTsKKworICAgIGlmICgocmV0ID0gcGFyc2VfbWV0YWRhdGEocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChzLT5uYl9wcm9ncmFtcyA+IDEgJiYgIXMtPm11bHRpX3Byb2dfd2FybmVkKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJTdHJlYW0gaGFzICVkIHByb2dyYW1zIChjb25maWd1cmF0aW9uICVkKSwgIgorICAgICAgICAgICAgICAgImNoYW5uZWxzIHdpbGwgYmUgb3V0cHV0IGluIG5hdGl2ZSBvcmRlci5cbiIsIHMtPm5iX3Byb2dyYW1zLCBzLT5wcm9nX2NvbmYpOworICAgICAgICBzLT5tdWx0aV9wcm9nX3dhcm5lZCA9IDE7CisgICAgfQorCisgICAgc3dpdGNoIChzLT5uYl9jaGFubmVscykgeworICAgIGNhc2UgNDoKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzRQT0lOVDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzVQT0lOVDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzdQT0lOVDE7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGF2Y3R4LT5jaGFubmVscyAgICA9IHMtPm5iX2NoYW5uZWxzOworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlX3RhYltzLT5mcl9jb2RlXTsKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCAgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7CisKKyAgICBpID0gcy0+bmJfY2hhbm5lbHMgLyAyOworICAgIGogPSBzLT5uYl9jaGFubmVsczsKKyAgICBpZiAoKHJldCA9IHBhcnNlX2F1ZGlvKHMsIDAsIGksIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBwYXJzZV9hdWRpbyhzLCBpLCBqLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gcGFyc2VfbWV0YWRhdGFfZXh0KHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBwYXJzZV9hdWRpbyhzLCAwLCBpLCAxKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gcGFyc2VfYXVkaW8ocywgaSwgaiwgMSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoKHJldCA9IHBhcnNlX21ldGVyKHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBmaWx0ZXJfZnJhbWUocywgZGF0YSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZG9sYnlfZV9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgREJFQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBtZW1zZXQocy0+aGlzdG9yeSwgMCwgc2l6ZW9mKHMtPmhpc3RvcnkpKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRvbGJ5X2VfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERCRUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgZmZfbWRjdF9lbmQoJnMtPmltZGN0W2ldKTsKKworICAgIGF2X2ZyZWVwKCZzLT5mZHNwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRvbGJ5X2VfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgc3RhdGljIEFWT25jZSBpbml0X29uY2UgPSBBVl9PTkNFX0lOSVQ7CisgICAgREJFQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBpZiAoZmZfdGhyZWFkX29uY2UoJmluaXRfb25jZSwgaW5pdF90YWJsZXMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgaWYgKGZmX21kY3RfaW5pdCgmcy0+aW1kY3RbaV0sIGltZGN0X2JpdHNfdGFiW2ldLCAxLCAyLjApIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoIShzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYygwKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5tdWx0aV9wcm9nX3dhcm5lZCA9ICEhKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ICYgQVZfQ0hfTEFZT1VUX05BVElWRSk7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9kb2xieV9lX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImRvbGJ5X2UiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEb2xieSBFIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0RPTEJZX0UsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKERCRUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGRvbGJ5X2VfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkb2xieV9lX2RlY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkb2xieV9lX2Nsb3NlLAorICAgIC5mbHVzaCAgICAgICAgICA9IGRvbGJ5X2VfZmx1c2gsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9DSEFOTkVMX0NPTkYsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfCBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZG9sYnlfZS5oIGIvbGliYXZjb2RlYy9kb2xieV9lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5MDIzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZG9sYnlfZS5oCkBAIC0wLDAgKzEsNzMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IGZvbzg2CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19ET0xCWV9FX0gKKyNkZWZpbmUgQVZDT0RFQ19ET0xCWV9FX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJrYmR3aW4uaCIKKyNpbmNsdWRlICJmZnQuaCIKKworI2RlZmluZSBGUkFNRV9TQU1QTEVTICAgMTc5MgorCisjZGVmaW5lIE1BWF9QUk9HX0NPTkYgICAyMworI2RlZmluZSBNQVhfUFJPR1JBTVMgICAgOAorI2RlZmluZSBNQVhfQ0hBTk5FTFMgICAgOAorI2RlZmluZSBNQVhfU0VHTUVOVFMgICAgMgorCisjZGVmaW5lIE1BWF9HUk9VUFMgICAgICA4CisjZGVmaW5lIE1BWF9FWFBPTkVOVFMgICAzMDQKKyNkZWZpbmUgTUFYX01BTlRJU1NBUyAgIDEwMjQKKworI2RlZmluZSBNQVhfTVNUUl9FWFAgICAgMgorI2RlZmluZSBNQVhfQklBU19FWFAgICAgNTAKKwordHlwZWRlZiBzdHJ1Y3QgREJFR3JvdXAgeworICAgIHVpbnQ4X3QgICAgICAgICBuYl9leHBvbmVudDsKKyAgICB1aW50OF90ICAgICAgICAgbmJfYmlhc19leHBbTUFYX01TVFJfRVhQXTsKKyAgICB1aW50MTZfdCAgICAgICAgZXhwX29mczsKKyAgICB1aW50MTZfdCAgICAgICAgbW50X29mczsKKyAgICBjb25zdCB1aW50OF90ICAgKm5iX21hbnRpc3NhOworICAgIHVpbnQ4X3QgICAgICAgICBpbWRjdF9pZHg7CisgICAgdWludDhfdCAgICAgICAgIGltZGN0X3BoczsKKyAgICB1aW50MTZfdCAgICAgICAgd2luX2xlbjsKKyAgICB1aW50MTZfdCAgICAgICAgZHN0X29mczsKKyAgICB1aW50MTZfdCAgICAgICAgd2luX29mczsKKyAgICB1aW50MTZfdCAgICAgICAgc3JjX29mczsKK30gREJFR3JvdXA7CisKK3R5cGVkZWYgc3RydWN0IERCRUNoYW5uZWwgeworICAgIGludCAgICAgZ3JfY29kZTsKKyAgICBpbnQgICAgIGJ3X2NvZGU7CisKKyAgICBpbnQgICAgICAgICBuYl9ncm91cHM7CisgICAgaW50ICAgICAgICAgbmJfbXN0cl9leHA7CisgICAgREJFR3JvdXAgICAgZ3JvdXBzW01BWF9HUk9VUFNdOworCisgICAgaW50ICAgICBleHBfc3RyYXRlZ3lbTUFYX0dST1VQU107CisgICAgaW50ICAgICBleHBvbmVudHNbTUFYX0VYUE9ORU5UU107CisgICAgaW50ICAgICBiYXBbTUFYX0VYUE9ORU5UU107CisgICAgaW50ICAgICBpZHhbTUFYX0VYUE9ORU5UU107CisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBtYW50aXNzYXMpW01BWF9NQU5USVNTQVNdOworfSBEQkVDaGFubmVsOworCit0eXBlZGVmIHN0cnVjdCBEQkVDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAgKmF2Y3R4OworICAgIEdldEJpdENvbnRleHQgICBnYjsKKworICAgIHVpbnQ4X3QgICAgICppbnB1dDsKKyAgICBpbnQgICAgICAgICBpbnB1dF9zaXplOworCisgICAgaW50ICAgICAgICAgd29yZF9iaXRzOworICAgIGludCAgICAgICAgIHdvcmRfYnl0ZXM7CisgICAgaW50ICAgICAgICAga2V5X3ByZXNlbnQ7CisKKyAgICBpbnQgICAgICAgICBwcm9nX2NvbmY7CisgICAgaW50ICAgICAgICAgbmJfY2hhbm5lbHM7CisgICAgaW50ICAgICAgICAgbmJfcHJvZ3JhbXM7CisKKyAgICBpbnQgICAgICAgICBmcl9jb2RlOworICAgIGludCAgICAgICAgIGZyX2NvZGVfb3JpZzsKKworICAgIGludCAgICAgICAgIGNoX3NpemVbTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQgICAgICAgICBtdGRfZXh0X3NpemU7CisgICAgaW50ICAgICAgICAgbWV0ZXJfc2l6ZTsKKworICAgIGludCAgICAgICAgIHJldl9pZFtNQVhfQ0hBTk5FTFNdOworICAgIGludCAgICAgICAgIGJlZ2luX2dhaW5bTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQgICAgICAgICBlbmRfZ2FpbltNQVhfQ0hBTk5FTFNdOworCisgICAgaW50ICAgICAgICAgbXVsdGlfcHJvZ193YXJuZWQ7CisKKyAgICBEQkVDaGFubmVsICBjaGFubmVsc1tNQVhfU0VHTUVOVFNdW01BWF9DSEFOTkVMU107CisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBoaXN0b3J5KVtNQVhfQ0hBTk5FTFNdWzI1Nl07CisKKyAgICBGRlRDb250ZXh0ICAgICAgICAgIGltZGN0WzNdOworICAgIEFWRmxvYXREU1BDb250ZXh0ICAgKmZkc3A7CisKKyAgICB1aW50OF90ICAgICBidWZmZXJbMTAyNCAqIDMgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXTsKK30gREJFQ29udGV4dDsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbmJfcHJvZ3JhbXNfdGFiW01BWF9QUk9HX0NPTkYgKyAxXSA9IHsKKyAgICAyLCAzLCAyLCAzLCA0LCA1LCA0LCA1LCA2LCA3LCA4LCAxLCAyLCAzLCAzLCA0LCA1LCA2LCAxLCAyLCAzLCA0LCAxLCAxCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBuYl9jaGFubmVsc190YWJbTUFYX1BST0dfQ09ORiArIDFdID0geworICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDQsIDQsIDQsIDQsIDgsIDgKK307CisKK3N0YXRpYyBjb25zdCBpbnQ4X3QgbGZlX2NoYW5uZWxfdGFiW01BWF9QUk9HX0NPTkYgKyAxXSA9IHsKKyAgICAgNSwgIDUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDQsCisgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsICA1LCA1Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjaF9yZW9yZGVyXzRbNF0gPSB7IDAsIDIsIDEsIDMgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IGNoX3Jlb3JkZXJfNls2XSA9IHsgMCwgMiwgNCwgMSwgMywgNSB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2hfcmVvcmRlcl84WzhdID0geyAwLCAyLCA2LCA0LCAxLCAzLCA3LCA1IH07CitzdGF0aWMgY29uc3QgdWludDhfdCBjaF9yZW9yZGVyX25bOF0gPSB7IDAsIDIsIDQsIDYsIDEsIDMsIDUsIDcgfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHNhbXBsZV9yYXRlX3RhYlsxNl0gPSB7CisgICAgMCwgNDI5NjUsIDQzMDA4LCA0NDgwMCwgNTM3MDYsIDUzNzYwCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBuYl9ncm91cHNfdGFiWzRdID0geyAxLCA4LCA3LCAxIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG5iX21zdHJfZXhwX3RhYls0XSA9IHsgMiwgMiwgMiwgMSB9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBuYl9tYW50aXNzYV8zOFszOF0gPSB7CisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDQsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsCisgICAgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG5iX21hbnRpc3NhXzQ0WzQ0XSA9IHsKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwKKyAgICAgMiwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA3LCAgNywKKyAgICAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNSwgMTYsIDE4LCAyMCwgMjIsIDI1LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbmJfbWFudGlzc2FfNTBbNTBdID0geworICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLAorICAgICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNywgIDgsICA5LCAgOSwgMTAsIDEyLCAxMywgMTQsIDE2LAorICAgIDE4LCAxOSwgMjIsIDI0LCAyNywgMjksIDMyLCAzNiwgNDAsIDQ0LCA0OSwgNTQsIDYwLCA2NiwgNzQsIDgyLAorICAgIDkwLCAxMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBpbWRjdF9iaXRzX3RhYlszXSA9IHsgOCwgOSwgMTEgfTsKKworc3RhdGljIGNvbnN0IERCRUdyb3VwIGdycF90YWJfMFsxXSA9IHsKKyAgICB7IDUwLCB7IDI3LCAyMyB9LCAwLCAwLCBuYl9tYW50aXNzYV81MCwgMiwgMCwgMTE1MiwgMCwgMTQwOCwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IERCRUdyb3VwIGdycF90YWJfMVs4XSA9IHsKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAwLCAwLCBuYl9tYW50aXNzYV8zOCwgMCwgMCwgMTkyLCAwLCAyNTYsIDAgfSwKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAzOCwgMTI4LCBuYl9tYW50aXNzYV8zOCwgMCwgMSwgMjU2LCA2NCwgNDQ4LCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgNzYsIDI1NiwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgMTkyLCA3MDQsIDAgfSwKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAxMTQsIDM4NCwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgMzIwLCAwLCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgMTUyLCA1MTIsIG5iX21hbnRpc3NhXzM4LCAwLCAxLCAyNTYsIDQ0OCwgMCwgMCB9LAorICAgIHsgMzgsIHsgMTIsIDI2IH0sIDE5MCwgNjQwLCBuYl9tYW50aXNzYV8zOCwgMCwgMSwgMjU2LCA1NzYsIDAsIDAgfSwKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAyMjgsIDc2OCwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgNzA0LCAwLCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgMjY2LCA4OTYsIG5iX21hbnRpc3NhXzM4LCAwLCAxLCAyNTYsIDgzMiwgMCwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IERCRUdyb3VwIGdycF90YWJfMls3XSA9IHsKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAwLCAwLCBuYl9tYW50aXNzYV8zOCwgMCwgMCwgMTkyLCAwLCAyNTYsIDAgfSwKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAzOCwgMTI4LCBuYl9tYW50aXNzYV8zOCwgMCwgMSwgMjU2LCA2NCwgNDQ4LCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgNzYsIDI1NiwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgMTkyLCA3MDQsIDAgfSwKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAxMTQsIDM4NCwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgMzIwLCAwLCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgMTUyLCA1MTIsIG5iX21hbnRpc3NhXzM4LCAwLCAxLCAyNTYsIDQ0OCwgMCwgMCB9LAorICAgIHsgMzgsIHsgMTIsIDI2IH0sIDE5MCwgNjQwLCBuYl9tYW50aXNzYV8zOCwgMCwgMSwgMjU2LCA1NzYsIDAsIDAgfSwKKyAgICB7IDQ0LCB7IDE5LCAyNSB9LCAyMjgsIDc2OCwgbmJfbWFudGlzc2FfNDQsIDEsIDEsIDQ0OCwgNzA0LCA5NjAsIDY0IH0sCit9OworCitzdGF0aWMgY29uc3QgREJFR3JvdXAgZ3JwX3RhYl8zWzFdID0geworICAgIHsgMjEsIHsgMjEgfSwgMCwgMCwgbmJfbWFudGlzc2FfNTAsIDIsIDAsIDExNTIsIDAsIDE0MDgsIDAgfSwKK307CisKK3N0YXRpYyBjb25zdCBEQkVHcm91cCBncnBfdGFiXzRbMV0gPSB7CisgICAgeyA1MCwgeyAyNywgMjMgfSwgMCwgMCwgbmJfbWFudGlzc2FfNTAsIDIsIDIsIDExNTIsIDAsIDE0MDgsIDg5NiB9LAorfTsKKworc3RhdGljIGNvbnN0IERCRUdyb3VwIGdycF90YWJfNVs4XSA9IHsKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAwLCAwLCBuYl9tYW50aXNzYV8zOCwgMCwgMSwgMjU2LCA2NCwgMCwgMCB9LAorICAgIHsgMzgsIHsgMTIsIDI2IH0sIDM4LCAxMjgsIG5iX21hbnRpc3NhXzM4LCAwLCAxLCAyNTYsIDE5MiwgMCwgMCB9LAorICAgIHsgMzgsIHsgMTIsIDI2IH0sIDc2LCAyNTYsIG5iX21hbnRpc3NhXzM4LCAwLCAxLCAyNTYsIDMyMCwgMCwgMCB9LAorICAgIHsgMzgsIHsgMTIsIDI2IH0sIDExNCwgMzg0LCBuYl9tYW50aXNzYV8zOCwgMCwgMSwgMjU2LCA0NDgsIDAsIDAgfSwKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAxNTIsIDUxMiwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgNTc2LCAwLCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgMTkwLCA2NDAsIG5iX21hbnRpc3NhXzM4LCAwLCAxLCAyNTYsIDcwNCwgMzAwOCwgMCB9LAorICAgIHsgMzgsIHsgMTIsIDI2IH0sIDIyOCwgNzY4LCBuYl9tYW50aXNzYV8zOCwgMCwgMSwgMjU2LCA4MzIsIDI3NTIsIDAgfSwKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAyNjYsIDg5NiwgbmJfbWFudGlzc2FfMzgsIDAsIDIsIDE5MiwgOTYwLCAyNTYwLCA2NCB9LAorfTsKKworc3RhdGljIGNvbnN0IERCRUdyb3VwIGdycF90YWJfNls3XSA9IHsKKyAgICB7IDQ0LCB7IDE5LCAyNSB9LCAwLCAwLCBuYl9tYW50aXNzYV80NCwgMSwgMSwgNDQ4LCAwLCAzMjY0LCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgNDQsIDI1NiwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgMzIwLCAwLCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgODIsIDM4NCwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgNDQ4LCAwLCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgMTIwLCA1MTIsIG5iX21hbnRpc3NhXzM4LCAwLCAxLCAyNTYsIDU3NiwgMCwgMCB9LAorICAgIHsgMzgsIHsgMTIsIDI2IH0sIDE1OCwgNjQwLCBuYl9tYW50aXNzYV8zOCwgMCwgMSwgMjU2LCA3MDQsIDMwMDgsIDAgfSwKKyAgICB7IDM4LCB7IDEyLCAyNiB9LCAxOTYsIDc2OCwgbmJfbWFudGlzc2FfMzgsIDAsIDEsIDI1NiwgODMyLCAyNzUyLCAwIH0sCisgICAgeyAzOCwgeyAxMiwgMjYgfSwgMjM0LCA4OTYsIG5iX21hbnRpc3NhXzM4LCAwLCAyLCAxOTIsIDk2MCwgMjU2MCwgNjQgfSwKK307CisKK3N0YXRpYyBjb25zdCBEQkVHcm91cCBncnBfdGFiXzdbMV0gPSB7CisgICAgeyAyMSwgeyAyMSB9LCAwLCAwLCBuYl9tYW50aXNzYV81MCwgMiwgMiwgMTE1MiwgMCwgMTQwOCwgODk2IH0sCit9OworCitzdGF0aWMgY29uc3QgREJFR3JvdXAgKmNvbnN0IGZybV9vZnNfdGFiWzJdWzRdID0geworICAgIHsgZ3JwX3RhYl8wLCBncnBfdGFiXzEsIGdycF90YWJfMiwgZ3JwX3RhYl8zIH0sCisgICAgeyBncnBfdGFiXzQsIGdycF90YWJfNSwgZ3JwX3RhYl82LCBncnBfdGFiXzcgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWFudGlzc2Ffc2l6ZTFbMTZdWzRdID0geworICAgIHsgIDAsICAwLCAgMCwgIDAgfSwgeyAgMiwgIDEsICAxLCAgMSB9LCB7ICAzLCAgMiwgIDEsICAxIH0sIHsgIDQsICAzLCAgMiwgIDEgfSwKKyAgICB7ICA1LCAgNCwgIDMsICAyIH0sIHsgIDYsICA1LCAgNCwgIDMgfSwgeyAgNywgIDYsICA1LCAgNCB9LCB7ICA4LCAgNywgIDYsICA1IH0sCisgICAgeyAgOSwgIDgsICA3LCAgNiB9LCB7IDEwLCAgOSwgIDgsICA3IH0sIHsgMTEsIDEwLCAgOSwgIDggfSwgeyAxMiwgMTEsIDEwLCAgOSB9LAorICAgIHsgMTMsIDEyLCAxMSwgMTAgfSwgeyAxNCwgMTMsIDEyLCAxMSB9LCB7IDE1LCAxNCwgMTMsIDEyIH0sIHsgMTYsIDE1LCAxNCwgMTMgfSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG1hbnRpc3NhX3NpemUyWzE2XVs0XSA9IHsKKyAgICB7ICAwLCAgMCwgIDAsICAwIH0sIHsgIDIsICAxLCAgMiwgIDIgfSwgeyAgMywgIDIsICAzLCAgMyB9LCB7ICA0LCAgMywgIDQsICA0IH0sCisgICAgeyAgNSwgIDQsICA1LCAgNSB9LCB7ICA2LCAgNSwgIDYsICA2IH0sIHsgIDcsICA2LCAgNywgIDcgfSwgeyAgOCwgIDcsICA4LCAgOCB9LAorICAgIHsgIDksICA4LCAgOSwgIDkgfSwgeyAxMCwgIDksIDEwLCAxMCB9LCB7IDExLCAxMCwgMTEsIDExIH0sIHsgMTIsIDExLCAxMiwgMTIgfSwKKyAgICB7IDEzLCAxMiwgMTMsIDEzIH0sIHsgMTQsIDEzLCAxNCwgMTQgfSwgeyAxNSwgMTQsIDE1LCAxNSB9LCB7IDE2LCAxNSwgMTYsIDE2IH0sCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgc3RhcnRfd2luZG93WzE5Ml0gPSB7CisgICAgMC4wMDE2MTU2OTM3OTgyNiwgMC4wMDE4NTc0ODIzMzM0NywgMC4wMDE5ODU2Mjc1ODU0OCwgMC4wMDIwNzgzNDA3ODEwNCwKKyAgICAwLjAwMjE1NzE3NzQ4NTIzLCAwLjAwMjIzMDY3MDk2MzkzLCAwLjAwMjMwMjk5MjEzMTQ3LCAwLjAwMjM3NjUxMjE1Mzk2LAorICAgIDAuMDAyNDUyNzU1NjE2MDYsIDAuMDAyNTMyODE0MDIwNjksIDAuMDAyNjE3NTQ2NzM2MTMsIDAuMDAyNzA3Njg3ODYxNjgsCisgICAgMC4wMDI4MDM5MDc2MTg5NSwgMC4wMDI5MDY4NDk5ODY1NiwgMC4wMDMwMTcxNTc1MTE2MSwgMC4wMDMxMzU0ODg3Mjc5OCwKKyAgICAwLjAwMzI2MjUzMTIyOTM0LCAwLjAwMzM5OTAxMjE1OTk1LCAwLjAwMzU0NTcwNzE2NjM2LCAwLjAwMzcwMzQ0ODQ1MDIzLAorICAgIDAuMDAzODczMTMyMzI1ODYsIDAuMDA0MDU1NzI2NTM5MTEsIDAuMDA0MjUyMjc3NTA5NzAsIDAuMDA0NDYzOTE3NTkyNjUsCisgICAgMC4wMDQ2OTE4NzI0MDU1MSwgMC4wMDQ5Mzc0NjgyMjgxNiwgMC4wMDUyMDIxMzk0NDYxOSwgMC4wMDU0ODc0MzU5NzUwNywKKyAgICAwLjAwNTc5NTAzMDU2NzM3LCAwLjAwNjEyNjcyNTg2OTUzLCAwLjAwNjQ4NDQ2MTA1NjA2LCAwLjAwNjg3MDMxNzgyODczLAorICAgIDAuMDA3Mjg2NTI1NTI2NzcsIDAuMDA3NzM1NDY1MDUyMDUsIDAuMDA4MjE5NjcxMjc0MTUsIDAuMDA4NzQxODMzNTQ2MTksCisgICAgMC4wMDkzMDQ3OTM5MzgzMiwgMC4wMDk5MTE1NDI3ODY1MywgMC4wMTA1NjUyMTExNjY5MiwgMC4wMTEyNjkwNTk5NDU2NywKKyAgICAwLjAxMjAyNjQ2NTEzMDUwLCAwLjAxMjg0MDg5OTM2NTU5LCAwLjAxMzcxNTkwOTU3NDE3LCAwLjAxNDY1NTA5MDk2MDY2LAorICAgIDAuMDE1NjYyMDU3ODM0MDgsIDAuMDE2NzQwNDExOTk1MjMsIDAuMDE3ODkzNzA5NzIzNTgsIDAuMDE5MTI1NDI4Njc4NjUsCisgICAgMC4wMjA0Mzg5MzYyNjI2NSwgMC4wMjE4Mzc0NjExMzc5MywgMC4wMjMzMjQwNjk2MTc5NiwgMC4wMjQ5MDE2NDg1MjM2NCwKKyAgICAwLjAyNjU3Mjg5NTgwMTc4LCAwLjAyODM0MDMxOTc0MTkzLCAwLjAzMDIwNjI0NzAyOTAzLCAwLjAzMjE3MjgzOTE4MzU0LAorICAgIDAuMDM0MjQyMTE2MjM4MTAsIDAuMDM2NDE1OTg1ODYxODAsIDAuMDM4Njk2Mjc1NjUwMTUsIDAuMDQxMDg0NzY2MDE0OTgsCisgICAgMC4wNDM1ODMyMjEwNzM5MCwgMC4wNDYxOTM0MTUxNTkzOSwgMC4wNDg5MTcxNTMwMTg4MiwgMC4wNTE3NTYyODIzOTE0OSwKKworICAgIDAuMDU0NzEyMzczMjcyNjcsIDAuMDU3Nzg3MzQ3MzM3NTUsIDAuMDYwOTgyOTE0MDI0MTMsIDAuMDY0MzAxMDEzNTIwODQsCisgICAgMC4wNjc3NDM0NTIxMjE4NiwgMC4wNzEzMTE4ODY0NDcyNiwgMC4wNzUwMDc4MDY0OTE5OSwgMC4wNzg4MzI1MTc0ODU5NSwKKyAgICAwLjA4Mjc4NzEyMDU2NjUxLCAwLjA4Njg3MjQ5MjI4MDYxLCAwLjA5MTA4OTI2Mjk1NzMwLCAwLjA5NTQzNzc5NDAxMDc0LAorICAgIDAuMDk5OTE4MTU0MjU4NTEsIDAuMTA0NTMwMDk1MzY0MjcsIDAuMTA5MjczMDI2NTM4OTQsIDAuMTE0MTQ1OTg4NjU5ODcsCisgICAgMC4xMTkxNDc2Mjc5OTIyMCwgMC4xMjQyNzYxNjk3MjA5NywgMC4xMjk1MjkzOTE1MjU2MCwgMC4xMzQ5MDQ1OTc0NDkzNCwKKyAgICAwLjE0MDM5ODU5MjMzNTk1LCAwLjE0NjAwNzY1NzEyMjAxLCAwLjE1MTcyNzUyNTI4NzIyLCAwLjE1NzU1MzM2MDc3NTI4LAorICAgIDAuMTYzNDc5NzM3NzA0OTEsIDAuMTY5NTAwNjIyMTkzNDIsIDAuMTc1NjA5MzU2NjE0NDIsIDAuMTgxNzk4NjQ2NjA2MTksCisgICAgMC4xODgwNjA1NTExMzgyMSwgMC4xOTQzODY0NzU5MzAxMiwgMC4yMDA3NjcxNzA1MDAxMCwgMC4yMDcxOTI3MjkwOTg4MiwKKyAgICAwLjIxMzY1MjU5NTc2MDMwLCAwLjIyMDEzNTU3MzY3MjgzLCAwLjIyNjYyOTgzOTA0MTk0LCAwLjIzMzEyMjk1OTU4MzI4LAorICAgIDAuMjM5NjAxOTE3NzQ2NjYsIDAuMjQ2MDUzMTM4NzMzODgsIDAuMjUyNDYyNTIzMzMyNTMsIDAuMjU4ODE1NDg1NTQ2MzEsCisgICAgMC4yNjUwOTY5OTQ5NTk4NywgMC4yNzEyOTE2MjM3MzMxNiwgMC4yNzczODM1OTgwNzcwNywgMC4yODMzNTY4NTQwMTk4NywKKyAgICAwLjI4OTE5NTA5NzIzMTc5LCAwLjI5NDg4MTg2NjYzNDY3LCAwLjMwMDQwMDYwMTQ4NDU1LCAwLjMwNTczNDcxMTU3ODE5LAorICAgIDAuMzEwODY3NjUwMTk5OTMsIDAuMzE1NzgyOTg5MzkzMTcsIDAuMzIwNDY0NDk3MTEyMjcsIDAuMzI0ODk2MjE1Nzg0NjgsCisgICAgMC4zMjkwNjI1NDE3OTE1NiwgMC4zMzI5NDgzMDUzNTY1NCwgMC4zMzY1Mzg4NTAzMTg0MCwgMC4zMzk4MjAxMTMyNTMzNiwKKyAgICAwLjM0Mjc3ODcwMTQwNjc5LCAwLjM0NTQwMTk2ODg5MzAwLCAwLjM0NzY3ODA5MDYyNDgwLCAwLjM0OTU5NjEzMzQ0MTk0LAorICAgIDAuMzUxMTQ2MTIzOTE5NTgsIDAuMzUyMzE5MTEyMzU0MjIsIDAuMzUzMTA3MjMyNDQ1MDQsIDAuMzUzNTAzNzU2MjEzMDgsCisKKyAgICAwLjM1MzUwMzE0MzcyOTQ1LCAwLjM1MzEwMTA4NzI1NTc5LCAwLjM1MjI5NDU0OTQzNTkxLCAwLjM1MTA4MTc5NTIxNjM0LAorICAgIDAuMzQ5NDYyNDE3MjE1MjIsIDAuMzQ3NDM3MzU0MzAyOTAsIDAuMzQ1MDA4OTAzMjA0MjAsIDAuMzQyMTgwNzIyOTgwMDEsCisgICAgMC4zMzg5NTc4MzIyOTU0MSwgMC4zMzUzNDY1OTk0MzE2OCwgMC4zMzEzNTQ3MjUwNTA2MCwgMC4zMjY5OTEyMTc3Njk5NiwKKyAgICAwLjMyMjI2NjM2MjY2MDAwLCAwLjMxNzE5MTY4MjgyMDE5LCAwLjMxMTc3OTg5NDI0NDMyLCAwLjMwNjA0NDg1NDIyODc1LAorICAgIDAuMzAwMDAxNTAzNjIzNzksIDAuMjkzNjY1ODAzMjcwODgsIDAuMjg3MDU0NjY1MDA3NzUsIDAuMjgwMTg1ODc3NjYxMzEsCisgICAgMC4yNzMwNzgwMjg0ODA5NSwgMC4yNjU3NTA0MjA0OTUzNSwgMC4yNTgyMjI5ODYzMDE4OSwgMC4yNTA1MTYxOTg4MjAwMCwKKyAgICAwLjI0MjY1MDk3OTU1NzgzLCAwLjIzNDY0ODYwNDk1NTIyLCAwLjIyNjUzMDYxMTM3NTQ4LCAwLjIxODMxODY5OTMyMzM1LAorICAgIDAuMjEwMDM0NjM3NDY3MDUsIDAuMjAxNzAwMTY3MDM4NTcsIDAuMTkzMzM2OTA3MTc4MTEsIDAuMTg0OTY2MjYxNzc2MjAsCisgICAgMC4xNzY2MDkzMjgzNTA2MiwgMC4xNjgyODY4MDk0NzQ3NCwgMC4xNjAwMTg5MjcyNDk4NiwgMC4xNTE4MjUzNDEyODU5NywKKyAgICAwLjE0MzcyNTA3MDYyNDc3LCAwLjEzNTczNjQyMDAwMzY0LCAwLjEyNzg3NjkxMDgyMjMzLCAwLjEyMDE2MzIxNzEzMzE3LAorICAgIDAuMTEyNjExMTA2OTMyMzQsIDAuMTA1MjM1Mzg4OTgyODIsIDAuMDk4MDQ5ODY1MzQ5NTUsIDAuMDkxMDY3Mjg5NzcyNjMsCisgICAgMC4wODQyOTkzMzE5NDQzOCwgMC4wNzc3NTY1NDc2ODgxMCwgMC4wNzE0NDgzNTQ5NTY4MywgMC4wNjUzODMwMTU0NzMyNCwKKyAgICAwLjA1OTU2NzYyMTcwNjg3LCAwLjA1NDAwODA4ODcxNDI1LCAwLjA0ODcwOTE1MDEyMTA3LCAwLjA0MzY3NDM1NzE0OTkzLAorICAgIDAuMDM4OTA2MDc4OTkxNzIsIDAuMDM0NDA1NTAxNzk2NjMsIDAuMDMwMTcyNjIxNzQ2MjcsIDAuMDI2MjA2MjI0Mjg1MTMsCisgICAgMC4wMjI1MDM4MzQ5MjUwNywgMC4wMTkwNjE2MTMwNTczMiwgMC4wMTU4NzQxMjg0ODIyMSwgMC4wMTI5MzM4ODAzMjM1NCwKKyAgICAwLjAxMDIzMDE5Njc3Mjg4LCAwLjAwNzc0NjQxMzIwNjI2LCAwLjAwNTQ1MTA5NzM2ODkxLCAwLjAwMzI1ODY4NjUxMjYzLAorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHNob3J0X3dpbmRvdzJbMTkyXSA9IHsKKyAgICAwLjAwMDE4ODYxMDk0NjA2LCAwLjAwMDMzNDMzMDEwMjAyLCAwLjAwMDUwMzA5NjI0NDg1LCAwLjAwMDcwMzA2MTYxNzQ4LAorICAgIDAuMDAwOTM5OTUxNzQ1MzMsIDAuMDAxMjE5MTMwNjcxMjgsIDAuMDAxNTQ2MDY1MDU1NjgsIDAuMDAxOTI2NDc4MDYxMjYsCisgICAgMC4wMDIzNjY0MTI0ODY5MiwgMC4wMDI4NzIyNTk4NTI0MCwgMC4wMDM0NTA3NzM3NzQ0MCwgMC4wMDQxMDkwNzQ2NTAyMywKKyAgICAwLjAwNDg1NDY0ODU1MjQxLCAwLjAwNTY5NTM0MTYzMjE5LCAwLjAwNjYzOTM1MDYzNTA4LCAwLjAwNzY5NTIwOTgxMjQ5LAorICAgIDAuMDA4ODcxNzc0MzYyNDYsIDAuMDEwMTc4MjAwNDYzOTUsIDAuMDExNjIzOTIxOTQxNTAsIDAuMDEzMjE4NjIzNTkzMzUsCisgICAgMC4wMTQ5NzIyMTEyMjQ2OCwgMC4wMTY4OTQ3Nzg0NDQyNywgMC4wMTg5OTY1NzAzMDQ0MSwgMC4wMjEyODc5NDM4ODg0NiwKKyAgICAwLjAyMzc3OTMyNTk3NjkyLCAwLjAyNjQ4MTE2Nzk1MDM5LCAwLjAyOTQwMzg5ODExNTkwLCAwLjAzMjU1Nzg3MTY3MTMwLAorICAgIDAuMDM1OTUzMzE4NTQ5ODYsIDAuMDM5NjAwMjg5NDE0MzcsIDAuMDQzNTA4NjAwMDk1NjMsIDAuMDQ3Njg3Nzc0Nzk0NTQsCisgICAgMC4wNTIxNDY5ODgzODk0OSwgMC4wNTY4OTUwMDgyMTEyMSwgMC4wNjE5NDAxMzU2NjUyNSwgMC4wNjcyOTAxNDgwOTc2NiwKKyAgICAwLjA3Mjk1MjI0MTMxMjEwLCAwLjA3ODkzMjk3MzE1NjAyLCAwLjA4NTIzODIwODU5OTg5LCAwLjA5MTg3MzA2NjczNjIwLAorICAgIDAuMDk4ODQxODcwMTI0MjIsIDAuMTA2MTQ4MDk2OTAyMjIsIDAuMTEzNzk0MzM2MDgwNjQsIDAuMTIxNzgyMjQ2NDE3OTcsCisgICAgMC4xMzAxMTI1MTkyNjUzMSwgMC4xMzg3ODQ4NDU3NDY2MCwgMC4xNDc3OTc4ODg2MTgzMCwgMC4xNTcxNDkyNTkxMjYxMCwKKyAgICAwLjE2NjgzNTQ5OTE0NjMxLCAwLjE3Njg1MjA2ODg2NjczLCAwLjE4NzE5MzM0MDIyNTg5LCAwLjE5Nzg1MjU5NjI5MDk5LAorICAgIDAuMjA4ODIyMDM2NzEzNzIsIDAuMjIwMDkyNzg5MzYwMzAsIDAuMjMxNjU0OTI4MTY2OTQsIDAuMjQzNDk3NDk3MjI1ODUsCisgICAgMC4yNTU2MDg1NDEwNTk2MSwgMC4yNjc5NzUxNDA5OTM2OCwgMC4yODA1ODM0NTc0ODg4MiwgMC4yOTM0MTg3NzgyNDczMiwKKyAgICAwLjMwNjQ2NTU3MTg1OTQyLCAwLjMxOTcwNzU0NjcxMDI2LCAwLjMzMzEyNzcxNDgyMjk1LCAwLjM0NjcwODQ2MDI3MDI0LAorCisgICAgMC4zNjA0MzE2MTE3NDY5MiwgMC4zNzQyNzg1MTg4NTcyMywgMC4zODgyMzAxMzE2MzY0NSwgMC40MDIyNjcwODI3OTQ4NiwKKyAgICAwLjQxNjM2OTc3MjE0NDM2LCAwLjQzMDUxODQ1MjY0NDYyLCAwLjQ0NDY5MzMxNzQ4NjMyLCAwLjQ1ODg3NDU4NzYxNDcwLAorICAgIDAuNDczMDQyNTk5MDg2MzYsIDAuNDg3MTc3ODg5NjQ3OTgsIDAuNTAxMjYxMjgzOTI1NDYsIDAuNTE1MjczOTc2NjE3NzgsCisgICAgMC41MjkxOTc2MTMxMDA1MCwgMC41NDMwMTQzNjY4NTk5OCwgMC41NTY3MDcwMTMyMDA2OSwgMC41NzAyNTg5OTg2OTQ0OCwKKyAgICAwLjU4MzY1NDUwNTg3MjMwLCAwLjU5Njg3ODUxMjY5NTQyLCAwLjYwOTkxNjg0NjM4NDE0LCAwLjYyMjc1NjIzMTIyNzkzLAorICAgIDAuNjM1Mzg0MzMwMDUwMzUsIDAuNjQ3Nzg5Nzc5MDU1OTMsIDAuNjU5OTYyMjE1ODQyNjQsIDAuNjcxODkyMzAwNDIzNzksCisgICAgMC42ODM1NzE3MjkxNjQ4NiwgMC42OTQ5OTMyNDE2MDUxMSwgMC43MDYxNTA2MjAxOTg2MSwgMC43MTcwMzg2ODMwNzU0OCwKKyAgICAwLjcyNzY1MzI2OTk4OTE5LCAwLjczNzk5MTIyMTY4MDk5LCAwLjc0ODA1MDM1Mjk1NTIxLCAwLjc1NzgyOTQxOTgxOTk1LAorICAgIDAuNzY3MzI4MDgxMTA1MjAsIDAuNzc2NTQ2ODU1MDIzMzksIDAuNzg1NDg3MDcxMTg2MjIsIDAuNzk0MTUwODE4NjM0MjMsCisgICAgMC44MDI1NDA4OTA0NzIwNywgMC44MTA2NjA3MjU3MzE4OCwgMC44MTg1MTQzNDkxMDg5MywgMC44MjYxMDYzMDkyMjczNCwKKyAgICAwLjgzMzQ0MTYxNjA5ODYyLCAwLjg0MDUyNTY3ODQzMjMwLCAwLjg0NzM2NDI0MTQ0NTI0LCAwLjg1Mzk2MzMyNTc5NDU5LAorICAgIDAuODYwMzI5MTY4MjI5NzMsIDAuODY2NDY4MTY0NTE5OTksIDAuODcyMzg2ODE1MTY5MTgsIDAuODc4MDkxNjc0Mzc1MzIsCisgICAgMC44ODM1ODkzMDI2MzUzNywgMC44ODg4ODYyMjMzMzA3MywgMC44OTM5ODg4ODM1NjI1NiwgMC44OTg5MDM2MTk0MzU2NCwKKyAgICAwLjkwMzYzNjYyNTkxODYxLCAwLjkwODE5MzkzMTMzNzQ0LCAwLjkxMjU4MTM3NjQ4OTc5LCAwLjkxNjgwNDU5ODMwMDcwLAorICAgIDAuOTIwODY5MDE3ODc3MTgsIDAuOTI0Nzc5ODMyNzYwODcsIDAuOTI4NTQyMDEzMTI1ODMsIDAuOTMyMTYwMzAxNjM4MzQsCisgICAgMC45MzU2MzkyMTY2MjM0MywgMC45Mzg5ODMwNTgxOTM4NCwgMC45NDIxOTU5MTY5MzY5MCwgMC45NDUyODE2ODQ3Nzk3OSwKKworICAgIDAuOTQ4MjM4NDMzMTk4MjEsIDAuOTUxMDY4MzQzNjczMzAsIDAuOTUzNzc3NzY1NTg1MzksIDAuOTU2MzY3MTgzMzU3NzUsCisgICAgMC45NTg4MzY3OTk2MTQ3OSwgMC45NjExODY1MDIxMjM0MSwgMC45NjM0MTU4MzE3OTE5NSwgMC45NjU1MjM5NTIxMjkwNiwKKyAgICAwLjk2NzUwOTYyMDYwNTQ3LCAwLjk2OTM3MTE2MjMxNzY4LCAwLjk3MTEwNjQ0NjM4MzA5LCAwLjk3MjcxMjg2NTQ0MTU0LAorICAgIDAuOTc0MTg3MzE4NjI3OTgsIDAuOTc1NTI2MTk4MzQ5NjQsIDAuOTc2NzI1MzgxMTYyNTcsIDAuOTc3NzgwMjIyOTk5NzQsCisgICAgMC45Nzg2ODU1NTg5NTU4NiwgMC45Nzk0MzU3MDc3ODM1NywgMC45ODAwMjQ0ODEyMDI1NSwgMC45ODA0NDUxOTgwNjg2NiwKKyAgICAwLjk4MDY5MDcwMzM5NDkzLCAwLjk4MDc1MzM5MjE2MTIzLCAwLjk4MDYyNTIzNzc5NjM3LCAwLjk4MDI5NzgyNTE2NDc4LAorICAgIDAuOTc5NzYyMzg3ODQyMjIsIDAuOTc5MDA5ODQ5NDIwMzEsIDAuOTc4MDMwODY4NTQwMDIsIDAuOTc2ODE1ODg3MzE4OTUsCisgICAgMC45NzUzNTUxODI4MDc1NSwgMC45NzM2Mzg5MjEwODQ3NCwgMC45NzE2NTcyMTM1ODQ1MiwgMC45Njk0MDAxNzUyMzE0NSwKKyAgICAwLjk2Njg1Nzk4Mzk1NDUyLCAwLjk2NDAyMDk0MTE0NTg5LCAwLjk2MDg3OTUzMjYzMTk0LCAwLjk1NzQyNDQ4OTczMDQ3LAorICAgIDAuOTUzNjQ2ODQ5OTc2OTksIDAuOTQ5NTM4MDE3MTE2NjAsIDAuOTQ1MDg5ODE5OTczOTYsIDAuOTQwMjk0NTY5ODMyNTMsCisgICAgMC45MzUxNDUxMTU5NzUwNCwgMC45Mjk2MzQ4OTkwNTk1MSwgMC45MjM3NTgwMDIwMjg4MywgMC45MTc1MDkxOTgyNzYyNCwKKyAgICAwLjkxMDg4Mzk5NjgxNDA2LCAwLjkwMzg3ODY4NDIxODMyLCAwLjg5NjQ5MDM2MzE0NjkyLCAwLjg4ODcxNjk4NzI1Mzk3LAorICAgIDAuODgwNTU3MzkyMzQ3MzUsIDAuODcyMDExMzIzNjYwNjIsIDAuODYzMDc5NDU5MTMzMzYsIDAuODUzNzYzNDI4NjE2OTMsCisgICAgMC44NDQwNjU4Mjg5NDQ1NSwgMC44MzM5OTAyMzQ4MjYzNywgMC44MjM1NDEyMDU1NDc1NywgMC44MTI3MjQyODc0NTk5NSwKKyAgICAwLjgwMTU0NjAxMjMwNDU3LCAwLjc5MDAxMzg5MTM4MTAxLCAwLjc3ODEzNjQwNTYyMTk5LCAwLjc2NTkyMjk5MTY0MjI3LAorICAgIDAuNzUzMzg0MDIzODQzOTUsIDAuNzQwNTMwNzkyNjc1MjYsIDAuNzI3Mzc1NDc5MTU0NjAsIDAuNzEzOTMxMTI1Nzg1MjcsCit9OworCitzdGF0aWMgY29uc3QgZmxvYXQgc2hvcnRfd2luZG93M1s2NF0gPSB7CisgICAgMC4wMDMyNjg4NzkzNjQ1MCwgMC4wMDU1MDI0MjkwMDkzNiwgMC4wMDc4Njg0NjY0Mzc5MSwgMC4wMTA0NTY4MzQ1MzUyMCwKKyAgICAwLjAxMzMwNDAyMTIwMTMyLCAwLjAxNjQzMjIxMDcyODYzLCAwLjAxOTg1Nzk4MDQwNjA5LCAwLjAyMzU5NTA5NDY0NzY2LAorICAgIDAuMDI3NjU1NTkyMjE5NTQsIDAuMDMyMDUwMjU4OTMxMjgsIDAuMDM2Nzg4ODQzNjk2MTQsIDAuMDQxODgwMTU2Nzk0OTUsCisgICAgMC4wNDczMzIxMDk4Nzc4MSwgMC4wNTMxNTE3MjU4MzkyNCwgMC4wNTkzNDUxMzI4NzYwOSwgMC4wNjU5MTc1NTA0NTI5MCwKKyAgICAwLjA3Mjg3MzI3MTU2Mzc4LCAwLjA4MDIxNTY0Mzg5ODIyLCAwLjA4Nzk0NzA1MTUyMzA3LCAwLjA5NjA2ODg5ODExMTc5LAorICAgIDAuMTA0NTgxNTkyNDAwNzAsIDAuMTEzNDg0NTM2MzI5NDAsIDAuMTIyNzc2MTE2MTc4MDksIDAuMTMyNDUzNjk2OTE1MTEsCisgICAgMC4xNDI1MTM2MTk4OTg3NiwgMC4xNTI5NTEyMDQwMjU2NywgMC4xNjM3NjA3NTAzNzkwNCwgMC4xNzQ5MzU1NTAzOTg4NSwKKyAgICAwLjE4NjQ2Nzg5NzU3MDcyLCAwLjE5ODM0OTEwMjYwODkxLCAwLjIxMDU2OTUxMjA4OTk1LCAwLjIyMzExODUzMDQ3Nzg3LAorICAgIDAuMjM1OTg0NjQ1NDY2ODMsIDAuMjQ5MTU1NDU2NTU0MTksIDAuMjYyNjE3NzA2NzQ1MDAsIDAuMjc2MzU3MzE3Mjc3NzgsCisgICAgMC4yOTAzNTk0MjUyNTEzNiwgMC4zMDQ2MDg0MjQwMjMxOCwgMC4zMTkwODgwMDYyNDAzMiwgMC4zMzM3ODEyMDkzNTY4MSwKKyAgICAwLjM0ODY3MDQ2MzQ4MjYwLCAwLjM2MzczNzY0MTQwMjg1LCAwLjM3ODk2NDExMDU5OTA5LCAwLjM5NDMzMDc4NzA5Nzg4LAorICAgIDAuNDA5ODE4MTkwOTY2NTcsIDAuNDI1NDA2NTAzMjcwMzEsIDAuNDQxMDc1NjI0Mjk5NTksIDAuNDU2ODA1MjMyODcyNzAsCisgICAgMC40NzI1NzQ4NDY1MTM1MSwgMC40ODgzNjM4ODIzMDA3NywgMC41MDQxNTE3MTgxODIxNCwgMC41MTk5MTc3NTQ1NDI1OCwKKyAgICAwLjUzNTY0MTQ3NTgxNDk2LCAwLjU1MTMwMjUxMTkxODg3LCAwLjU2Njg4MDY5OTMxMDQ3LCAwLjU4MjM1NjE0MTQyMDA3LAorICAgIDAuNTk3NzA5MjY4MjcyNzEsIDAuNjEyOTIwODk1MDYxMTgsIDAuNjI3OTcyMjc5NDU4MjMsIDAuNjQyODQ1MTc3NDUyNTUsCisgICAgMC42NTc1MjE4OTc0OTM0OSwgMC42NzE5ODUzNTI3MzIwOSwgMC42ODYyMTkxMTExNDk4NCwgMC43MDAyMDc0NDMzNzA5OSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRjX2NvZGVfdGFiWzVdID0geyAwLCAwLCAwLCAxLCAxIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGh0X2NvZGVfdGFiWzVdID0geyAwLCAwLCAxLCAyLCAyIH07CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJhbmRfb2ZzX3RhYlszXVs0XSA9IHsKKyAgICB7IDEyLCA4LCA0LCAwIH0sIHsgMTQsIDEwLCA2LCAwIH0sIHsgMTIsIDgsIDQsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmFuZF9sb3dfdGFiWzNdID0geyA5LCAxNywgMjQgfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGZhc3RfZ2Fpbl90YWJbOF0gPSB7CisgICAgMTI4LCAyNTYsIDM4NCwgNTEyLCA2NDAsIDc2OCwgODk2LCAxMDI0Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2xvd19kZWNheV90YWJbMl1bMl0gPSB7IHsgMjcsIC0xIH0sIHsgMzIsIDIxIH0gfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IG1pc2NfZGVjYXlfdGFiWzNdWzJdWzJdID0geworICAgIHsgeyAzNTQsIC0xIH0sIHsgNDI1LCA0MjUgfSB9LAorICAgIHsgeyAyNjYsIC0xIH0sIHsgMzIwLCAgLTEgfSB9LAorICAgIHsgeyAyMTMsIC0xIH0sIHsgMjU2LCAgLTEgfSB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgZmFzdF9kZWNheV90YWJbM11bMl1bMl1bNTBdID0geworICAgIHt7eworICAgICAgICAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsCisgICAgICAgIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwKKyAgICAgICAgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLAorICAgICAgICAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwgMTQyLCAxNDIsIDE0MiwKKyAgICB9LCB7CisgICAgICAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICAgICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgICAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgIH19LCB7eworICAgICAgICAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwgMTcwLCAxNzAsCisgICAgICAgIDE3MCwgMTcwLCAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwKKyAgICAgICAgMTcwLCAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwgMTcwLAorICAgICAgICAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwgMTcwLCAxNzAsIDE3MCwKKyAgICB9LCB7CisgICAgICAgICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwKKyAgICAgICAgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LAorICAgICAgICAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsCisgICAgICAgICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LCAgNjQsICA2NCwgIDY0LAorICAgIH19fSwge3t7CisgICAgICAgIDI2NiwgMjY2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwKKyAgICAgICAgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LAorICAgICAgICAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsCisgICAgICAgIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwKKyAgICAgICAgMTA2LCAxMDYsIDEwNiwgMTA2LAorICAgIH0sIHsKKyAgICAgICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgICAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICAgICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgfX0sIHt7CisgICAgICAgIDMxOSwgMzE5LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwKKyAgICAgICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LAorICAgICAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsCisgICAgICAgIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwKKyAgICAgICAgMTI4LCAxMjgsIDEyOCwgMTI4LAorICAgIH0sIHsKKyAgICAgICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgICAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICAgICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgfX19LCB7e3sKKyAgICAgICAgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LAorICAgICAgICAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsCisgICAgICAgIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwKKyAgICAgICAgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LAorICAgICAgICAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsIDEwNiwgMTA2LCAxMDYsCisgICAgfSwgeworICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgICAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICAgICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgICAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICB9fSwge3sKKyAgICAgICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LAorICAgICAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsCisgICAgICAgIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwKKyAgICAgICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LAorICAgICAgICAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsCisgICAgfSwgeworICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgICAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICAgICAgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLAorICAgICAgICAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisgICAgICAgICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwKKyAgICB9fX0KK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBmYXN0X2dhaW5fYWRqX3RhYlszXVsyXVs2Ml0gPSB7CisgICAge3sKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDEsICAgMiwgICA0LCAgIDcsICAxMSwgIDE2LCAgMjksICA0NCwgIDU5LAorICAgICAgICAgNzYsICA5NCwgMTE2LCAxNDIsIDE3OSwgMjIxLCAyNTIsIDI4NSwgMzEyLCAzMzQsCisgICAgfSwgeworICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDIsICAgNSwgICA4LCAgMTAsICAxNSwgIDI4LCAgNDIsICA1NywgIDc1LCAgOTMsCisgICAgICAgIDExNSwgMTQwLCAxNzcsIDIxOSwgMjQ3LCAyODAsIDMwOCwgMzMwLCA0MjcsIDUzMywKKyAgICB9fSwge3sKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMiwgICA1LCAgIDgsICAxMiwgIDIxLCAgMzUsICA1MSwgIDY5LCAgODksCisgICAgICAgIDExMSwgMTM4LCAxNzYsIDIyMCwgMjUxLCAyODQsIDMxMiwgMzM0LAorICAgIH0sIHsKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAyLAorICAgICAgICAgIDUsICAgOCwgIDExLCAgMTgsICAzMywgIDQ5LCAgNjUsICA4NCwgMTA2LCAxMzIsCisgICAgICAgIDE2OCwgMjE0LCAyNDUsIDI3OSwgMzA4LCAzMjksIDQyNywgNTMzLAorICAgIH19LCB7eworICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEsICAgNCwgICA3LCAgMTAsICAxNywKKyAgICAgICAgIDMxLCAgNDcsICA2NSwgIDg0LCAxMDcsIDEzNCwgMTcxLCAyMTUsIDI1MCwgMjgzLAorICAgICAgICAzMTIsIDMzNCwKKyAgICB9LCB7CisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDMsICAgNiwgICA5LCAgMTMsICAyNywgIDQzLAorICAgICAgICAgNjAsICA3OSwgMTAwLCAxMjYsIDE2MCwgMjA3LCAyNDIsIDI3NiwgMzA3LCAzMjksCisgICAgICAgIDQyNywgNTMzLAorICAgIH19Cit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc2xvd19nYWluX3RhYlszXVsyXVs1MF0gPSB7CisgICAge3sKKyAgICAgICAgMzA3MiwgMzA3MiwgMzA3MiwgMzA3MiwgMzA3MiwgMzA3MiwgMTA2MywgMTA2MywgMTA2MywgMTA2MywKKyAgICAgICAgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywKKyAgICAgICAgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywKKyAgICAgICAgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywgMTA2MywKKyAgICB9LCB7CisgICAgICAgIDMwNzIsIDMwNzIsIDMwNzIsIDMwNzIsIDMwNzIsIDMwNzIsICA4NTAsICA4NTAsICA4NTAsICA4NTAsCisgICAgICAgICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsCisgICAgICAgICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsCisgICAgICAgICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsICA4NTAsCisgICAgfX0sIHt7CisgICAgICAgIDMwNzIsIDEyMTIsIDEyMTIsIDEyMTIsICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksCisgICAgICAgICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksCisgICAgICAgICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksCisgICAgICAgICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksICA5OTksCisgICAgICAgICA5OTksICA5OTksICA5OTksICA5OTksCisgICAgfSwgeworICAgICAgICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAorICAgICAgICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAorICAgICAgICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAorICAgICAgICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAorICAgICAgICAgIC0xLCAgIC0xLCAgIC0xLCAgIC0xLAorICAgIH19LCB7eworICAgICAgICAzMDcyLCAzMDcyLCAzMDcyLCAzMDcyLCAzMDcyLCAzMDcyLCAzMDcyLCAzMDcyLCAzMDcyLCAzMDcyLAorICAgICAgICAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LAorICAgICAgICAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LAorICAgICAgICAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LAorICAgICAgICAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LCAgOTk5LAorICAgIH0sIHsKKyAgICAgICAgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKKyAgICAgICAgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKKyAgICAgICAgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKKyAgICAgICAgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKKyAgICAgICAgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwgICAtMSwKKyAgICB9fQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGhlYXJpbmdfdGhyZXNoX3RhYlszXVszXVs1MF0gPSB7CisgICAge3sKKyAgICAgICAgMTQwMywgMTE0MSwgMTAwMCwgIDk1OSwgIDk0OCwgIDk1NywgIDk0NiwgIDkyNSwgIDg5OSwgIDg3MSwKKyAgICAgICAgIDg0MywgIDgxNSwgIDc4OSwgIDc2NiwgIDc0NSwgIDcyNywgIDcwNSwgIDY4NywgIDY4MSwgIDY4NiwKKyAgICAgICAgIDcwMSwgIDcyNSwgIDc2OCwgIDg1NCwgIDk0MCwgMTAxOCwgMTA3NSwgMTEwMywgMTExMSwgMTEwNiwKKyAgICAgICAgMTA5OCwgMTEwNSwgMTE0MiwgMTIzNywgMTQxOSwgMTcyMSwgMjE2OSwgMjgwNSwKKyAgICB9LCB7CisgICAgICAgIDE0MDEsIDExMzAsICA5OTUsICA5NTcsICA5NDcsICA5NTUsICA5NDEsICA5MTgsICA4OTAsICA4NjEsCisgICAgICAgICA4MzEsICA4MDMsICA3NzcsICA3NTQsICA3MzQsICA3MTcsICA2OTgsICA2ODQsICA2ODIsICA2OTIsCisgICAgICAgICA3MTIsICA3NDMsICA3OTgsICA4OTQsICA5NzYsIDEwNDUsIDEwOTEsIDExMDksIDExMTAsIDExMDIsCisgICAgICAgIDEwOTgsIDExMTYsIDExNzQsIDEzMDAsIDE1MjYsIDE4ODQsIDI0MDEsIDMwNzIsCisgICAgfSwgeworICAgICAgICAxMzkzLCAxMDg2LCAgOTc0LCAgOTQ5LCAgOTU3LCAgOTQxLCAgOTEzLCAgODc4LCAgODQzLCAgODA4LAorICAgICAgICAgNzc3LCAgNzUwLCAgNzI3LCAgNzA4LCAgNjk1LCAgNjg2LCAgNjgxLCAgNjg5LCAgNzE0LCAgNzUyLAorICAgICAgICAgODExLCAgODg4LCAgOTcxLCAxMDQ0LCAxMDg3LCAxMTA4LCAxMTEwLCAxMTAyLCAxMDk4LCAxMTE1LAorICAgICAgICAxMTcyLCAxMjkwLCAxNDg5LCAxODEyLCAyMjkzLCAyOTY0LCAzMDcyLCAzMDcyLAorICAgIH19LCB7eworICAgICAgICAxNDEyLCAxMzQzLCAxMTQxLCAxMDQ3LCAxMDAwLCAgOTc0LCAgOTU5LCAgOTUxLCAgOTQ4LCAgOTQ3LAorICAgICAgICAgOTU3LCAgOTUzLCAgOTQ2LCAgOTM2LCAgOTI1LCAgOTA2LCAgODc4LCAgODUwLCAgODIyLCAgNzk1LAorICAgICAgICAgNzcxLCAgNzQ1LCAgNzE5LCAgNzAwLCAgNjg3LCAgNjgxLCAgNjg1LCAgNzAxLCAgNzMzLCAgNzg0LAorICAgICAgICAgODg1LCAgOTc3LCAxMDQ3LCAxMDkyLCAxMTEwLCAxMTA4LCAxMDk5LCAxMTAyLCAxMTM4LCAxMjMzLAorICAgICAgICAxNDEzLCAxNzExLCAyMTU3LCAyNzk3LAorICAgIH0sIHsKKyAgICAgICAgMTQxMiwgMTMzNiwgMTEzMCwgMTA0MCwgIDk5NSwgIDk3MCwgIDk1NywgIDk1MCwgIDk0NywgIDk0NywKKyAgICAgICAgIDk1NSwgIDk1MCwgIDk0MSwgIDkzMCwgIDkxOCwgIDg5NywgIDg2OCwgIDgzOCwgIDgxMCwgIDc4MywKKyAgICAgICAgIDc1OSwgIDczNCwgIDcxMCwgIDY5MywgIDY4NCwgIDY4MSwgIDY5MCwgIDcxMiwgIDc1MiwgIDgyMywKKyAgICAgICAgIDkyNCwgMTAwOSwgMTA2OSwgMTEwMiwgMTExMSwgMTEwNCwgMTA5OCwgMTExMSwgMTE2OCwgMTI5NSwKKyAgICAgICAgMTUxOCwgMTg3MywgMjM4OCwgMzA3MiwKKyAgICB9LCB7CisgICAgICAgIDE0MTEsIDEyOTMsIDEwODYsIDEwMDksICA5NzQsICA5NTcsICA5NDksICA5NDcsICA5NTcsICA5NTEsCisgICAgICAgICA5NDEsICA5MjgsICA5MTMsICA4OTYsICA4NzgsICA4NTIsICA4MTcsICA3ODUsICA3NTYsICA3MzIsCisgICAgICAgICA3MTMsICA2OTUsICA2ODMsICA2ODIsICA2ODksICA3MTAsICA3NDYsICA4MTEsICA5MDYsICA5OTIsCisgICAgICAgIDEwNjEsIDEwOTksIDExMTEsIDExMDYsIDEwOTgsIDExMDcsIDExNTUsIDEyNjYsIDE0NzEsIDE3OTksCisgICAgICAgIDIyNzcsIDI5NDUsIDMwNzIsIDMwNzIsCisgICAgfX0sIHt7CisgICAgICAgIDE0MzEsIDE0MTIsIDE0MDMsIDEzNzksIDEzNDMsIDEyOTMsIDEyMjksIDExODAsIDExMjUsIDEwNzUsCisgICAgICAgIDEwNDAsIDEwMTQsICA5OTYsICA5NzksICA5NjUsICA5NTcsICA5NTEsICA5NDgsICA5NDcsICA5NTcsCisgICAgICAgICA5NTEsICA5NDAsICA5MjQsICA5MDMsICA4NzcsICA4NDYsICA4MTUsICA3ODUsICA3NTMsICA3MjUsCisgICAgICAgICA3MDIsICA2ODYsICA2ODEsICA2ODksICA3MTQsICA3NjAsICA4NDcsICA5NDcsIDEwMjgsIDEwODMsCisgICAgICAgIDExMDgsIDExMDksIDExMDEsIDExMDAsIDExMzIsIDEyMjIsIDE0MDIsIDE3MDUsIDIxNjAsIDI4MDMsCisgICAgfSwgeworICAgICAgICAxNDMxLCAxNDEyLCAxNDAxLCAxMzc1LCAxMzM2LCAxMjc4LCAxMjE1LCAxMTY4LCAxMTE1LCAxMDY2LAorICAgICAgICAxMDMyLCAxMDA4LCAgOTkxLCAgOTc1LCAgOTYyLCAgOTU0LCAgOTUwLCAgOTQ3LCAgOTQ3LCAgOTU1LAorICAgICAgICAgOTQ4LCAgOTM1LCAgOTE2LCAgODk0LCAgODY2LCAgODM1LCAgODAzLCAgNzcyLCAgNzQyLCAgNzE1LAorICAgICAgICAgNjk1LCAgNjgzLCAgNjgzLCAgNjk3LCAgNzI5LCAgNzg0LCAgODg3LCAgOTgyLCAxMDU0LCAxMDk2LAorICAgICAgICAxMTExLCAxMTA2LCAxMDk4LCAxMTA3LCAxMTU5LCAxMjgxLCAxNTA1LCAxODY1LCAyMzkxLCAzMDcyLAorICAgIH0sIHsKKyAgICAgICAgMTQyNywgMTQxMSwgMTM5MywgMTM1MywgMTI5MywgMTIxNSwgMTE2MCwgMTExOCwgMTA3MiwgMTAzMSwKKyAgICAgICAgMTAwMywgIDk4NCwgIDk3MSwgIDk2MCwgIDk1MiwgIDk0OCwgIDk0NywgIDk1NywgIDk1MiwgIDk0MSwKKyAgICAgICAgIDkyNCwgIDkwMiwgIDg3NiwgIDg0NywgIDgxNSwgIDc4MSwgIDc1MCwgIDcyMywgIDcwMCwgIDY4NSwKKyAgICAgICAgIDY4MSwgIDY5MSwgIDcxOSwgIDc2NiwgIDg1OCwgIDk1OCwgMTAzOSwgMTA4OSwgMTEwOSwgMTEwOCwKKyAgICAgICAgMTA5OSwgMTEwMiwgMTE0MSwgMTI0NSwgMTQ0MiwgMTc2NiwgMjI1MCwgMjkzMCwgMzA3MiwgMzA3MiwKKyAgICB9fQorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgbHdjX2dhaW5fdGFiWzExXVs3XSA9IHsKKyAgICB7ICAgLTIxLCAgLTE5NywgIC0yNzEsICAtNDY2LCAzMjc2NywgMzI3NjcsIDMyNzY3IH0sCisgICAgeyAgLTE5NywgICAtMjksICAtMjQ0LCAgLTI3MSwgIC01NDAsIDMyNzY3LCAzMjc2NyB9LAorICAgIHsgIC0yNzEsICAtMjQ0LCAgIC0yOSwgIC0yNDksICAtMjcxLCAgLTU5MywgMzI3NjcgfSwKKyAgICB7ICAtNDY2LCAgLTI3MSwgIC0yNDksICAgLTI5LCAgLTI1MSwgIC0yNzEsICAtNjMyIH0sCisgICAgeyAgLTU0MCwgIC0yNzEsICAtMjUxLCAgIC0yOSwgIC0yNTEsICAtMjcxLCAgLTY2NCB9LAorICAgIHsgIC01OTMsICAtMjcxLCAgLTI1MSwgICAtMjksICAtMjUyLCAgLTI3MSwgIC02OTAgfSwKKyAgICB7ICAtNjMyLCAgLTI3MSwgIC0yNTIsICAgLTI5LCAgLTI1MiwgIC0yNzEsICAtNzExIH0sCisgICAgeyAgLTY2NCwgIC0yNzEsICAtMjUyLCAgIC0yOSwgIC0yNTIsICAtMjcxLCAgLTczMCB9LAorICAgIHsgIC02OTAsICAtMjcxLCAgLTI1MiwgICAtMjksICAtMjUyLCAgLTI3MSwgIC03NDUgfSwKKyAgICB7ICAtNzExLCAgLTI3MSwgIC0yNTIsICAgLTI5LCAgLTI1MywgIC0yNzEsICAtNzU5IH0sCisgICAgeyAgLTczMCwgIC0yNzEsICAtMjUzLCAgIC0yOSwgIC0yNTMsICAtMjcxLCAgLTc3MSB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgbHdjX2Fkal90YWJbN10gPSB7CisgICAgLTE5MiwgLTMyMCwgLTQ0OCwgLTUxMiwgLTQ0OCwgLTMyMCwgLTE5MiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxvZ19hZGRfdGFiWzIxMl0gPSB7CisgICAgNjQsIDYzLCA2MiwgNjEsIDYwLCA1OSwgNTgsIDU3LCA1NiwgNTUsIDU0LCA1MywgNTIsIDUyLCA1MSwgNTAsCisgICAgNDksIDQ4LCA0NywgNDcsIDQ2LCA0NSwgNDQsIDQ0LCA0MywgNDIsIDQxLCA0MSwgNDAsIDM5LCAzOCwgMzgsCisgICAgMzcsIDM2LCAzNiwgMzUsIDM1LCAzNCwgMzMsIDMzLCAzMiwgMzIsIDMxLCAzMCwgMzAsIDI5LCAyOSwgMjgsCisgICAgMjgsIDI3LCAyNywgMjYsIDI2LCAyNSwgMjUsIDI0LCAyNCwgMjMsIDIzLCAyMiwgMjIsIDIxLCAyMSwgMjEsCisgICAgMjAsIDIwLCAxOSwgMTksIDE5LCAxOCwgMTgsIDE4LCAxNywgMTcsIDE3LCAxNiwgMTYsIDE2LCAxNSwgMTUsCisgICAgMTUsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsCisgICAgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsCisgICAgIDQsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDIsCisgICAgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgIDIsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMCwgIDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBiYXBfdGFiWzY0XSA9IHsKKyAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywgIDMsICAzLCAgNCwKKyAgICAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwKK307CisKK3N0YXRpYyBmbG9hdCBtYW50aXNzYV90YWIxWzE3XVs0XTsKK3N0YXRpYyBmbG9hdCBtYW50aXNzYV90YWIyWzE3XVs0XTsKK3N0YXRpYyBmbG9hdCBtYW50aXNzYV90YWIzWzE3XVs0XTsKK3N0YXRpYyBmbG9hdCBleHBvbmVudF90YWJbNTBdOworc3RhdGljIGZsb2F0IGdhaW5fdGFiWzEwMjRdOworCitERUNMQVJFX0FMSUdORUQoMzIsIHN0YXRpYyBmbG9hdCwgd2luZG93KVszNzEyXTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X3RhYmxlcyh2b2lkKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMTsgaSA8IDE3OyBpKyspCisgICAgICAgIG1hbnRpc3NhX3RhYjFbaV1bMF0gPSAxLjBmIC8gKDEgPDwgaSAtIDEpOworCisgICAgZm9yIChpID0gMjsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgbWFudGlzc2FfdGFiMVtpXVsxXSA9IDEuMGYgIC8gKCgxIDw8IGkpIC0gMSk7CisgICAgICAgIG1hbnRpc3NhX3RhYjFbaV1bMl0gPSAwLjVmICAvICgoMSA8PCBpKSAtIDEpOworICAgICAgICBtYW50aXNzYV90YWIxW2ldWzNdID0gMC4yNWYgLyAoKDEgPDwgaSkgLSAxKTsKKyAgICB9CisKKyAgICBtYW50aXNzYV90YWIxW2ldWzFdID0gMC41ZiAgIC8gKDEgPDwgMTUpOworICAgIG1hbnRpc3NhX3RhYjFbaV1bMl0gPSAwLjc1ZiAgLyAoMSA8PCAxNSk7CisgICAgbWFudGlzc2FfdGFiMVtpXVszXSA9IDAuODc1ZiAvICgxIDw8IDE1KTsKKworICAgIGZvciAoaSA9IDE7IGkgPCAxNzsgaSsrKSB7CisgICAgICAgIG1hbnRpc3NhX3RhYjJbaV1bMV0gPSBtYW50aXNzYV90YWIxW2ldWzBdICogMC41ZjsKKyAgICAgICAgbWFudGlzc2FfdGFiMltpXVsyXSA9IG1hbnRpc3NhX3RhYjFbaV1bMF0gKiAwLjc1ZjsKKyAgICAgICAgbWFudGlzc2FfdGFiMltpXVszXSA9IG1hbnRpc3NhX3RhYjFbaV1bMF0gKiAwLjg3NWY7CisgICAgICAgIGZvciAoaiA9IDE7IGogPCA0OyBqKyspCisgICAgICAgICAgICBtYW50aXNzYV90YWIzW2ldW2pdID0gMS4wZiAvICgxIDw8IGkpICsgMS4wZiAvICgxIDw8IGopIC0gMS4wZiAvICgxIDw8IGkgKyBqKTsKKyAgICB9CisKKyAgICBtYW50aXNzYV90YWIzWzFdWzNdID0gMC42ODc1ZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTsgaSsrKSB7CisgICAgICAgIGV4cG9uZW50X3RhYltpICogMiAgICBdID0gMS4wZiAgICAgIC8gKDEgPDwgaSk7CisgICAgICAgIGV4cG9uZW50X3RhYltpICogMiArIDFdID0gTV9TUVJUMV8yIC8gKDEgPDwgaSk7CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8IDEwMjQ7IGkrKykKKyAgICAgICAgZ2Fpbl90YWJbaV0gPSBleHAyZigoaSAtIDk2MCkgLyA2NC4wZik7CisKKyAgICAvLyBzaG9ydCAxCisgICAgZmZfa2JkX3dpbmRvd19pbml0KHdpbmRvdywgMy4wZiwgMTI4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisgICAgICAgIHdpbmRvd1sxMjggKyBpXSA9IHdpbmRvd1sxMjcgLSBpXTsKKworICAgIC8vIHN0YXJ0CisgICAgZm9yIChpID0gMDsgaSA8IDE5MjsgaSsrKQorICAgICAgICB3aW5kb3dbMjU2ICsgaV0gPSBzdGFydF93aW5kb3dbaV07CisKKyAgICAvLyBzaG9ydCAyCisgICAgZm9yIChpID0gMDsgaSA8IDE5MjsgaSsrKQorICAgICAgICB3aW5kb3dbNDQ4ICsgaV0gPSBzaG9ydF93aW5kb3cyW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICB3aW5kb3dbNjQwICsgaV0gPSB3aW5kb3dbNjMgLSBpXTsKKworICAgIC8vIHNob3J0IDMKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgd2luZG93WzcwNCArIGldID0gc2hvcnRfd2luZG93M1tpXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTkyOyBpKyspCisgICAgICAgIHdpbmRvd1s3NjggKyBpXSA9IHdpbmRvd1s2NCArIGldOworCisgICAgLy8gYnJpZGdlCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKQorICAgICAgICB3aW5kb3dbOTYwICsgaV0gPSB3aW5kb3dbaV07CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIHdpbmRvd1sxMDg4ICsgaV0gPSAxLjBmOworCisgICAgLy8gbG9uZworICAgIGZmX2tiZF93aW5kb3dfaW5pdCh3aW5kb3cgKyAxNDA4LCAzLjBmLCAyNTYpOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDA7IGkrKykKKyAgICAgICAgd2luZG93WzE2NjQgKyBpXSA9IDEuMGY7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICB3aW5kb3dbMjMwNCArIGldID0gd2luZG93WzExNTIgKyBpXSA9IHdpbmRvd1sxNjYzIC0gaV07CisKKyAgICAvLyByZXZlcnNlIHN0YXJ0CisgICAgZm9yIChpID0gMDsgaSA8IDE5MjsgaSsrKQorICAgICAgICB3aW5kb3dbMjU2MCArIGldID0gd2luZG93WzQ0NyAtIGldOworCisgICAgLy8gcmV2ZXJzZSBzaG9ydCAyCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICB3aW5kb3dbMjc1MiArIGldID0gd2luZG93WzcwMyAtIGldOworCisgICAgLy8gcmV2ZXJzZSBzaG9ydCAzCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICB3aW5kb3dbMzAwOCArIGldID0gd2luZG93Wzk1OSAtIGldOworCisgICAgLy8gcmV2ZXJzZSBicmlkZ2UKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDQ4OyBpKyspCisgICAgICAgIHdpbmRvd1szMjY0ICsgaV0gPSB3aW5kb3dbMTQwNyAtIGldOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHBjbS5jIGIvbGliYXZjb2RlYy9kcGNtLmMKaW5kZXggNTJhMmM2MS4uN2QzOTM0ZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kcGNtLmMKKysrIGIvbGliYXZjb2RlYy9kcGNtLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQXNzb3J0ZWQgRFBDTSBjb2RlY3MKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtNDQsNyArNDQsNyBAQAogI2luY2x1ZGUgIm1hdGhvcHMuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgRFBDTUNvbnRleHQgewotICAgIGludDE2X3Qgc3F1YXJlX2FycmF5WzI1Nl07CisgICAgaW50MTZfdCBhcnJheVsyNTZdOwogICAgIGludCBzYW1wbGVbMl07ICAgICAgICAgICAgICAgICAgLy8vPCBwcmV2aW91cyBzYW1wbGUgKGZvciBTT0xfRFBDTSkKICAgICBjb25zdCBpbnQ4X3QgKnNvbF90YWJsZTsgICAgICAgIC8vLzwgZGVsdGEgdGFibGUgZm9yIFNPTF9EUENNCiB9IERQQ01Db250ZXh0OwpAQCAtMTMwLDggKzEzMCw4IEBACiAgICAgICAgIC8qIGluaXRpYWxpemUgc3F1YXJlIHRhYmxlICovCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgewogICAgICAgICAgICAgaW50MTZfdCBzcXVhcmUgPSBpICogaTsKLSAgICAgICAgICAgIHMtPnNxdWFyZV9hcnJheVtpICAgICAgXSA9ICBzcXVhcmU7Ci0gICAgICAgICAgICBzLT5zcXVhcmVfYXJyYXlbaSArIDEyOF0gPSAtc3F1YXJlOworICAgICAgICAgICAgcy0+YXJyYXlbaSAgICAgIF0gPSAgc3F1YXJlOworICAgICAgICAgICAgcy0+YXJyYXlbaSArIDEyOF0gPSAtc3F1YXJlOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCkBAIC0xNTYsNyArMTU2LDI1IEBACiAgICAgY2FzZSBBVl9DT0RFQ19JRF9TRFgyX0RQQ006CiAgICAgICAgIGZvciAoaSA9IC0xMjg7IGkgPCAxMjg7IGkrKykgewogICAgICAgICAgICAgaW50MTZfdCBzcXVhcmUgPSBpICogaSAqIDI7Ci0gICAgICAgICAgICBzLT5zcXVhcmVfYXJyYXlbaSsxMjhdID0gaSA8IDAgPyAtc3F1YXJlOiBzcXVhcmU7CisgICAgICAgICAgICBzLT5hcnJheVtpKzEyOF0gPSBpIDwgMCA/IC1zcXVhcmU6IHNxdWFyZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZfQ09ERUNfSURfR1JFTUxJTl9EUENNOiB7CisgICAgICAgIGludCBkZWx0YSA9IDA7CisgICAgICAgIGludCBjb2RlID0gNjQ7CisgICAgICAgIGludCBzdGVwID0gNDU7CisKKyAgICAgICAgcy0+YXJyYXlbMF0gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI3OyBpKyspIHsKKyAgICAgICAgICAgIGRlbHRhICs9IChjb2RlID4+IDUpOworICAgICAgICAgICAgY29kZSAgKz0gc3RlcDsKKyAgICAgICAgICAgIHN0ZXAgICs9IDI7CisKKyAgICAgICAgICAgIHMtPmFycmF5W2kqMiArIDFdID0gIGRlbHRhOworICAgICAgICAgICAgcy0+YXJyYXlbaSoyICsgMl0gPSAtZGVsdGE7CisgICAgICAgIH0KKyAgICAgICAgcy0+YXJyYXlbMjU1XSA9IGRlbHRhICsgKGNvZGUgPj4gNSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAKQEAgLTIwNyw2ICsyMjUsNyBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBvdXQgPSBidWZfc2l6ZTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9HUkVNTElOX0RQQ006CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9TRFgyX0RQQ006CiAgICAgICAgIG91dCA9IGJ1Zl9zaXplOwogICAgICAgICBicmVhazsKQEAgLTI0MCw3ICsyNTksNyBAQAogCiAgICAgICAgIC8qIGRlY29kZSB0aGUgc2FtcGxlcyAqLwogICAgICAgICB3aGlsZSAob3V0cHV0X3NhbXBsZXMgPCBzYW1wbGVzX2VuZCkgewotICAgICAgICAgICAgcHJlZGljdG9yW2NoXSArPSBzLT5zcXVhcmVfYXJyYXlbYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZnYildOworICAgICAgICAgICAgcHJlZGljdG9yW2NoXSArPSBzLT5hcnJheVtieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKV07CiAgICAgICAgICAgICBwcmVkaWN0b3JbY2hdICA9IGF2X2NsaXBfaW50MTYocHJlZGljdG9yW2NoXSk7CiAgICAgICAgICAgICAqb3V0cHV0X3NhbXBsZXMrKyA9IHByZWRpY3RvcltjaF07CiAKQEAgLTMzNSwxMiArMzU0LDI0IEBACiAKICAgICAgICAgICAgIGlmICghKG4gJiAxKSkKICAgICAgICAgICAgICAgICBzLT5zYW1wbGVbY2hdID0gMDsKLSAgICAgICAgICAgIHMtPnNhbXBsZVtjaF0gKz0gcy0+c3F1YXJlX2FycmF5W24gKyAxMjhdOworICAgICAgICAgICAgcy0+c2FtcGxlW2NoXSArPSBzLT5hcnJheVtuICsgMTI4XTsKICAgICAgICAgICAgIHMtPnNhbXBsZVtjaF0gID0gYXZfY2xpcF9pbnQxNihzLT5zYW1wbGVbY2hdKTsKICAgICAgICAgICAgICpvdXRwdXRfc2FtcGxlcysrID0gcy0+c2FtcGxlW2NoXTsKICAgICAgICAgICAgIGNoIF49IHN0ZXJlbzsKICAgICAgICAgfQogICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZfQ09ERUNfSURfR1JFTUxJTl9EUENNOiB7CisgICAgICAgIGludCBpZHggPSAwOworCisgICAgICAgIHdoaWxlIChvdXRwdXRfc2FtcGxlcyA8IHNhbXBsZXNfZW5kKSB7CisgICAgICAgICAgICB1aW50OF90IG4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiKTsKKworICAgICAgICAgICAgKm91dHB1dF9zYW1wbGVzKysgPSBzLT5zYW1wbGVbaWR4XSArPSBzLT5hcnJheVtuXTsKKyAgICAgICAgICAgIGlkeCBePSAxOworICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgKmdvdF9mcmFtZV9wdHIgPSAxOwpAQCAtMzYwLDYgKzM5MSw3IEBACiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKK0RQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9HUkVNTElOX0RQQ00sICAgZ3JlbWxpbl9kcGNtLCAgICJEUENNIEdyZW1saW4iKTsKIERQQ01fREVDT0RFUihBVl9DT0RFQ19JRF9JTlRFUlBMQVlfRFBDTSwgaW50ZXJwbGF5X2RwY20sICJEUENNIEludGVycGxheSIpOwogRFBDTV9ERUNPREVSKEFWX0NPREVDX0lEX1JPUV9EUENNLCAgICAgICByb3FfZHBjbSwgICAgICAgIkRQQ00gaWQgUm9RIik7CiBEUENNX0RFQ09ERVIoQVZfQ09ERUNfSURfU0RYMl9EUENNLCAgICAgIHNkeDJfZHBjbSwgICAgICAiRFBDTSBTcXVhcmVyb290LURlbHRhLUV4YWN0Iik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RweC5jIGIvbGliYXZjb2RlYy9kcHguYwppbmRleCBhZjcyNzZhLi43MjBhOWI4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RweC5jCisrKyBiL2xpYmF2Y29kZWMvZHB4LmMKQEAgLTY1LDYgKzY1LDM4IEBACiAgICAgcmV0dXJuICpsYnVmICYgMHgzRkY7CiB9CiAKK3N0YXRpYyB1aW50MTZfdCByZWFkMTJpbjMyKGNvbnN0IHVpbnQ4X3QgKipwdHIsIHVpbnQzMl90ICogbGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKiBuX2RhdHVtLCBpbnQgaXNfYmlnKQoreworICAgIGlmICgqbl9kYXR1bSkKKyAgICAgICAgKCpuX2RhdHVtKS0tOworICAgIGVsc2UgeworICAgICAgICAqbGJ1ZiA9IHJlYWQzMihwdHIsIGlzX2JpZyk7CisgICAgICAgICpuX2RhdHVtID0gNzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCpuX2RhdHVtKXsKKyAgICBjYXNlIDc6IHJldHVybiAqbGJ1ZiAmIDB4RkZGOworICAgIGNhc2UgNjogcmV0dXJuICgqbGJ1ZiA+PiAxMikgJiAweEZGRjsKKyAgICBjYXNlIDU6IHsKKyAgICAgICAgICAgIHVpbnQzMl90IGMgPSAqbGJ1ZiA+PiAyNDsKKyAgICAgICAgICAgICpsYnVmID0gcmVhZDMyKHB0ciwgaXNfYmlnKTsKKyAgICAgICAgICAgIGMgfD0gKmxidWYgPDwgODsKKyAgICAgICAgICAgIHJldHVybiBjICYgMHhGRkY7CisgICAgICAgICAgICB9CisgICAgY2FzZSA0OiByZXR1cm4gKCpsYnVmID4+IDQpICYgMHhGRkY7CisgICAgY2FzZSAzOiByZXR1cm4gKCpsYnVmID4+IDE2KSAmIDB4RkZGOworICAgIGNhc2UgMjogeworICAgICAgICAgICAgdWludDMyX3QgYyA9ICpsYnVmID4+IDI4OworICAgICAgICAgICAgKmxidWYgPSByZWFkMzIocHRyLCBpc19iaWcpOworICAgICAgICAgICAgYyB8PSAqbGJ1ZiA8PCA0OworICAgICAgICAgICAgcmV0dXJuIGMgJiAweEZGRjsKKyAgICAgICAgICAgIH0KKyAgICBjYXNlIDE6IHJldHVybiAoKmxidWYgPj4gOCkgJiAweEZGRjsKKyAgICBkZWZhdWx0OiByZXR1cm4gKmxidWYgPj4gMjA7CisgICAgfQorfQorCiBzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsCkBAIC0yMDEsMTAgKzIzMywyNyBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIDEyOgogICAgICAgICBpZiAoIXBhY2tpbmcpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2luZyB0byAxNmJpdCByZXF1aXJlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBpbnQgdGVzdGVkID0gMDsKKyAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IDUwICYmIGVuZGlhbiAmJiAoYXZjdHgtPndpZHRoJTgpID09IDApIHsgLy8gTGl0dGxlIGVuZGlhbiBhbmQgd2lkdGhzIG5vdCBhIG11bHRpcGxlIG9mIDggbmVlZCB0ZXN0cworICAgICAgICAgICAgICAgIHRlc3RlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXRlc3RlZCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2luZyB0byAxNmJpdCByZXF1aXJlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHN0cmlkZSA9IDIgKiBhdmN0eC0+d2lkdGggKiBlbGVtZW50czsKKyAgICAgICAgc3RyaWRlID0gYXZjdHgtPndpZHRoICogZWxlbWVudHM7CisgICAgICAgIGlmIChwYWNraW5nKSB7CisgICAgICAgICAgICBzdHJpZGUgKj0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0cmlkZSAqPSAzOworICAgICAgICAgICAgaWYgKHN0cmlkZSAlIDgpIHsKKyAgICAgICAgICAgICAgICBzdHJpZGUgLz0gODsKKyAgICAgICAgICAgICAgICBzdHJpZGUrKzsKKyAgICAgICAgICAgICAgICBzdHJpZGUgKj0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmlkZSAvPSAyOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTY6CiAgICAgICAgIHN0cmlkZSA9IDIgKiBhdmN0eC0+d2lkdGggKiBlbGVtZW50czsKQEAgLTI0Myw2ICsyOTIsMTAgQEAKICAgICBjYXNlIDYwODA6CiAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2MTIxOgorICAgIGNhc2UgNjEyMDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxMjsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA1MDA4MToKICAgICBjYXNlIDUwMDgwOgogICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CkBAIC0yNTYsMTcgKzMwOSwyMSBAQAogICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCQTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA1MDEwMDoKLSAgICBjYXNlIDUxMTAwOgogICAgIGNhc2UgNTAxMDE6Ci0gICAgY2FzZSA1MTEwMToKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MTEwMDoKKyAgICBjYXNlIDUxMTAxOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSQVAxMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA1MDEyMDoKLSAgICBjYXNlIDUxMTIwOgogICAgIGNhc2UgNTAxMjE6Ci0gICAgY2FzZSA1MTEyMToKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1MTEyMDoKKyAgICBjYXNlIDUxMTIxOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSQVAxMjsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA2MTYxOgogICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTE2QkU7CiAgICAgICAgIGJyZWFrOwpAQCAtMzEzLDkgKzM3MCwxMCBAQAogICAgIHN3aXRjaCAoYml0c19wZXJfY29sb3IpIHsKICAgICBjYXNlIDEwOgogICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPmhlaWdodDsgeCsrKSB7Ci0gICAgICAgICAgICB1aW50MTZfdCAqZHN0WzNdID0geyh1aW50MTZfdCopcHRyWzBdLAorICAgICAgICAgICAgdWludDE2X3QgKmRzdFs0XSA9IHsodWludDE2X3QqKXB0clswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KilwdHJbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopcHRyWzJdfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KilwdHJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopcHRyWzNdfTsKICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+d2lkdGg7IHkrKykgewogICAgICAgICAgICAgICAgICpkc3RbMl0rKyA9IHJlYWQxMGluMzIoJmJ1ZiwgJnJnYkJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX2RhdHVtLCBlbmRpYW4pOwpAQCAtMzIzLDMzICszODEsNDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX2RhdHVtLCBlbmRpYW4pOwogICAgICAgICAgICAgICAgICpkc3RbMV0rKyA9IHJlYWQxMGluMzIoJmJ1ZiwgJnJnYkJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX2RhdHVtLCBlbmRpYW4pOwotICAgICAgICAgICAgICAgIC8vIEZvciAxMCBiaXQsIGlnbm9yZSBhbHBoYQogICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cyA9PSA0KQorICAgICAgICAgICAgICAgICAgICAqZHN0WzNdKysgPQogICAgICAgICAgICAgICAgICAgICByZWFkMTBpbjMyKCZidWYsICZyZ2JCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5fZGF0dW0sIGVuZGlhbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuX2RhdHVtID0gMDsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHM7IGkrKykKICAgICAgICAgICAgICAgICBwdHJbaV0gKz0gcC0+bGluZXNpemVbaV07CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxMjoKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT5oZWlnaHQ7IHgrKykgewotICAgICAgICAgICAgdWludDE2X3QgKmRzdFszXSA9IHsodWludDE2X3QqKXB0clswXSwKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3RbNF0gPSB7KHVpbnQxNl90KilwdHJbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopcHRyWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QqKXB0clsyXX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCopcHRyWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QqKXB0clszXX07CiAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPndpZHRoOyB5KyspIHsKLSAgICAgICAgICAgICAgICAqZHN0WzJdID0gcmVhZDE2KCZidWYsIGVuZGlhbikgPj4gNDsKLSAgICAgICAgICAgICAgICBkc3RbMl0rKzsKKyAgICAgICAgICAgICAgICBpZiAocGFja2luZykgeworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cyA+PSAzKQorICAgICAgICAgICAgICAgICAgICAqZHN0WzJdKysgPSByZWFkMTYoJmJ1ZiwgZW5kaWFuKSA+PiA0OwogICAgICAgICAgICAgICAgICpkc3RbMF0gPSByZWFkMTYoJmJ1ZiwgZW5kaWFuKSA+PiA0OwogICAgICAgICAgICAgICAgIGRzdFswXSsrOwotICAgICAgICAgICAgICAgICpkc3RbMV0gPSByZWFkMTYoJmJ1ZiwgZW5kaWFuKSA+PiA0OwotICAgICAgICAgICAgICAgIGRzdFsxXSsrOwotICAgICAgICAgICAgICAgIC8vIEZvciAxMiBiaXQsIGlnbm9yZSBhbHBoYQorICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cyA+PSAyKQorICAgICAgICAgICAgICAgICAgICAqZHN0WzFdKysgPSByZWFkMTYoJmJ1ZiwgZW5kaWFuKSA+PiA0OwogICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cyA9PSA0KQotICAgICAgICAgICAgICAgICAgICBidWYgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgKmRzdFszXSsrID0gcmVhZDE2KCZidWYsIGVuZGlhbikgPj4gNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMgPj0gMykKKyAgICAgICAgICAgICAgICAgICAgICAgICpkc3RbMl0rKyA9IHJlYWQxMmluMzIoJmJ1ZiwgJnJnYkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5fZGF0dW0sIGVuZGlhbik7CisgICAgICAgICAgICAgICAgICAgICpkc3RbMF0rKyA9IHJlYWQxMmluMzIoJmJ1ZiwgJnJnYkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbl9kYXR1bSwgZW5kaWFuKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzID49IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAqZHN0WzFdKysgPSByZWFkMTJpbjMyKCZidWYsICZyZ2JCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuX2RhdHVtLCBlbmRpYW4pOworICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICpkc3RbM10rKyA9IHJlYWQxMmluMzIoJmJ1ZiwgJnJnYkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5fZGF0dW0sIGVuZGlhbik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbGVtZW50czsgaSsrKQogICAgICAgICAgICAgICAgIHB0cltpXSArPSBwLT5saW5lc2l6ZVtpXTsKICAgICAgICAgICAgIC8vIEp1bXAgdG8gbmV4dCBhbGlnbmVkIHBvc2l0aW9uCiAgICAgICAgICAgICBidWYgKz0gbmVlZF9hbGlnbjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHNkLmMgYi9saWJhdmNvZGVjL2RzZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDRmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2RzZC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBEaXJlY3QgU3RyZWFtIERpZ2l0YWwgKERTRCkgZGVjb2RlcgorICogYmFzZWQgb24gQlNEIGxpY2Vuc2VkIGRzZDJwY20gYnkgU2ViYXN0aWFuIEdlc2VtYW5uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgU2ViYXN0aWFuIEdlc2VtYW5uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21hdGhvcHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZHNkX3RhYmxlZ2VuLmgiCisjaW5jbHVkZSAiZHNkLmgiCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZHNkX2N0YWJsZXNfdGFibGVpbml0KHZvaWQpCit7CisgICAgaW50IHQsIGUsIG0sIHNpZ247CisgICAgZG91YmxlIGFjY1tDVEFCTEVTXTsKKyAgICBmb3IgKGUgPSAwOyBlIDwgMjU2OyArK2UpIHsKKyAgICAgICAgbWVtc2V0KGFjYywgMCwgc2l6ZW9mKGFjYykpOworICAgICAgICBmb3IgKG0gPSAwOyBtIDwgODsgKyttKSB7CisgICAgICAgICAgICBzaWduID0gKCgoZSA+PiAoNyAtIG0pKSAmIDEpICogMiAtIDEpOworICAgICAgICAgICAgZm9yICh0ID0gMDsgdCA8IENUQUJMRVM7ICsrdCkKKyAgICAgICAgICAgICAgICBhY2NbdF0gKz0gc2lnbiAqIGh0YXBzW3QgKiA4ICsgbV07CisgICAgICAgIH0KKyAgICAgICAgZm9yICh0ID0gMDsgdCA8IENUQUJMRVM7ICsrdCkKKyAgICAgICAgICAgIGN0YWJsZXNbQ1RBQkxFUyAtIDEgLSB0XVtlXSA9IGFjY1t0XTsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9pbml0X2RzZF9kYXRhKHZvaWQpCit7CisgICAgc3RhdGljIGludCBkb25lID0gMDsKKyAgICBpZiAoZG9uZSkKKyAgICAgICAgcmV0dXJuOworICAgIGRzZF9jdGFibGVzX3RhYmxlaW5pdCgpOworICAgIGRvbmUgPSAxOworfQorCit2b2lkIGZmX2RzZDJwY21fdHJhbnNsYXRlKERTRENvbnRleHQqIHMsIHNpemVfdCBzYW1wbGVzLCBpbnQgbHNiZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUpCit7CisgICAgdW5zaWduZWQgcG9zLCBpOworICAgIHVuc2lnbmVkIGNoYXIqIHA7CisgICAgZG91YmxlIHN1bTsKKworICAgIHBvcyA9IHMtPnBvczsKKworICAgIHdoaWxlIChzYW1wbGVzLS0gPiAwKSB7CisgICAgICAgIHMtPmJ1Zltwb3NdID0gbHNiZiA/IGZmX3JldmVyc2VbKnNyY10gOiAqc3JjOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKworICAgICAgICBwID0gcy0+YnVmICsgKChwb3MgLSBDVEFCTEVTKSAmIEZJRk9NQVNLKTsKKyAgICAgICAgKnAgPSBmZl9yZXZlcnNlWypwXTsKKworICAgICAgICBzdW0gPSAwLjA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDVEFCTEVTOyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYSA9IHMtPmJ1ZlsocG9zICAgICAgICAgICAgICAgICAgIC0gaSkgJiBGSUZPTUFTS107CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGIgPSBzLT5idWZbKHBvcyAtIChDVEFCTEVTKjIgLSAxKSArIGkpICYgRklGT01BU0tdOworICAgICAgICAgICAgc3VtICs9IGN0YWJsZXNbaV1bYV0gKyBjdGFibGVzW2ldW2JdOworICAgICAgICB9CisKKyAgICAgICAgKmRzdCA9IChmbG9hdClzdW07CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworCisgICAgICAgIHBvcyA9IChwb3MgKyAxKSAmIEZJRk9NQVNLOworICAgIH0KKworICAgIHMtPnBvcyA9IHBvczsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHNkLmggYi9saWJhdmNvZGVjL2RzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTQ1NzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2RzZC5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBEaXJlY3QgU3RyZWFtIERpZ2l0YWwgKERTRCkgZGVjb2RlcgorICogYmFzZWQgb24gQlNEIGxpY2Vuc2VkIGRzZDJwY20gYnkgU2ViYXN0aWFuIEdlc2VtYW5uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDksIDIwMTEgU2ViYXN0aWFuIEdlc2VtYW5uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE0IFBldGVyIFJvc3MKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0RTRF9ICisjZGVmaW5lIEFWQ09ERUNfRFNEX0gKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21hdGhvcHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKyNkZWZpbmUgSFRBUFMgICA0OCAgICAgICAgICAgICAgIC8qKiBudW1iZXIgb2YgRklSIGNvbnN0YW50cyAqLworI2RlZmluZSBGSUZPU0laRSAxNiAgICAgICAgICAgICAgLyoqIG11c3QgYmUgYSBwb3dlciBvZiB0d28gKi8KKyNkZWZpbmUgRklGT01BU0sgKEZJRk9TSVpFIC0gMSkgIC8qKiBiaXQgbWFzayBmb3IgRklGTyBvZmZzZXRzICovCisKKyNpZiBGSUZPU0laRSAqIDggPCBIVEFQUyAqIDIKKyNlcnJvciAiRklGT1NJWkUgdG9vIHNtYWxsIgorI2VuZGlmCisKKy8qKgorICogUGVyLWNoYW5uZWwgYnVmZmVyCisgKi8KK3R5cGVkZWYgc3RydWN0IERTRENvbnRleHQgeworICAgIHVuc2lnbmVkIGNoYXIgYnVmW0ZJRk9TSVpFXTsKKyAgICB1bnNpZ25lZCBwb3M7Cit9IERTRENvbnRleHQ7CisKK3ZvaWQgZmZfaW5pdF9kc2RfZGF0YSh2b2lkKTsKKwordm9pZCBmZl9kc2QycGNtX3RyYW5zbGF0ZShEU0RDb250ZXh0KiBzLCBzaXplX3Qgc2FtcGxlcywgaW50IGxzYmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgcHRyZGlmZl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlKTsKKyNlbmRpZiAvKiBBVkNPREVDX0RTRF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RzZF90YWJsZWdlbi5oIGIvbGliYXZjb2RlYy9kc2RfdGFibGVnZW4uaAppbmRleCA5OTBkNTdhLi5lNWRhODZhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2RzZF90YWJsZWdlbi5oCisrKyBiL2xpYmF2Y29kZWMvZHNkX3RhYmxlZ2VuLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAiZHNkLmgiCiAKICNkZWZpbmUgSFRBUFMgICA0OCAgICAgICAgICAgICAgICAvKiogbnVtYmVyIG9mIEZJUiBjb25zdGFudHMgKi8KICNkZWZpbmUgQ1RBQkxFUyAoKEhUQVBTICsgNykgLyA4KSAvKiogbnVtYmVyIG9mICI4IE1BQ3MiIGxvb2t1cCB0YWJsZXMgKi8KQEAgLTcxLDIxICs3Miw0IEBACiB9OwogCiBzdGF0aWMgZmxvYXQgY3RhYmxlc1tDVEFCTEVTXVsyNTZdOwotCi1zdGF0aWMgYXZfY29sZCB2b2lkIGRzZF9jdGFibGVzX3RhYmxlaW5pdCh2b2lkKQotewotICAgIGludCB0LCBlLCBtLCBzaWduOwotICAgIGRvdWJsZSBhY2NbQ1RBQkxFU107Ci0gICAgZm9yIChlID0gMDsgZSA8IDI1NjsgKytlKSB7Ci0gICAgICAgIG1lbXNldChhY2MsIDAsIHNpemVvZihhY2MpKTsKLSAgICAgICAgZm9yIChtID0gMDsgbSA8IDg7ICsrbSkgewotICAgICAgICAgICAgc2lnbiA9ICgoKGUgPj4gKDcgLSBtKSkgJiAxKSAqIDIgLSAxKTsKLSAgICAgICAgICAgIGZvciAodCA9IDA7IHQgPCBDVEFCTEVTOyArK3QpCi0gICAgICAgICAgICAgICAgYWNjW3RdICs9IHNpZ24gKiBodGFwc1t0ICogOCArIG1dOwotICAgICAgICB9Ci0gICAgICAgIGZvciAodCA9IDA7IHQgPCBDVEFCTEVTOyArK3QpCi0gICAgICAgICAgICBjdGFibGVzW0NUQUJMRVMgLSAxIC0gdF1bZV0gPSBhY2NbdF07Ci0gICAgfQotfQotCiAjZW5kaWYgLyogQVZDT0RFQ19EU0RfVEFCTEVHRU5fSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kc2RkZWMuYyBiL2xpYmF2Y29kZWMvZHNkZGVjLmMKaW5kZXggZjFkZmQ0Yi4uMmM1YzM1NyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kc2RkZWMuYworKysgYi9saWJhdmNvZGVjL2RzZGRlYy5jCkBAIC0yOSw4NSArMjksMzEgQEAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9tYXRob3BzLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImRzZF90YWJsZWdlbi5oIgorI2luY2x1ZGUgImRzZC5oIgogCi0jZGVmaW5lIEZJRk9TSVpFIDE2ICAgICAgICAgICAgICAvKiogbXVzdCBiZSBhIHBvd2VyIG9mIHR3byAqLwotI2RlZmluZSBGSUZPTUFTSyAoRklGT1NJWkUgLSAxKSAgLyoqIGJpdCBtYXNrIGZvciBGSUZPIG9mZnNldHMgKi8KLQotI2lmIEZJRk9TSVpFICogOCA8IEhUQVBTICogMgotI2Vycm9yICJGSUZPU0laRSB0b28gc21hbGwiCi0jZW5kaWYKLQotLyoqCi0gKiBQZXItY2hhbm5lbCBidWZmZXIKKyNkZWZpbmUgRFNEX1NJTEVOQ0UgMHg2OQorLyogMHg2OSA9IDAxMTAxMDAxCisgKiBUaGlzIHBhdHRlcm4gIm9uIHJlcGVhdCIgbWFrZXMgYSBsb3cgZW5lcmd5IDM1Mi44IGtIeiB0b25lCisgKiBhbmQgYSBoaWdoIGVuZXJneSAxLjA1ODQgTUh6IHRvbmUgd2hpY2ggc2hvdWxkIGJlIGZpbHRlcmVkCisgKiBvdXQgY29tcGxldGVseSBieSBhbnkgcGxheWJhY2sgc3lzdGVtIC0tPiBzaWxlbmNlCiAgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1bnNpZ25lZCBjaGFyIGJ1ZltGSUZPU0laRV07Ci0gICAgdW5zaWduZWQgcG9zOwotfSBEU0RDb250ZXh0OwotCi1zdGF0aWMgdm9pZCBkc2QycGNtX3RyYW5zbGF0ZShEU0RDb250ZXh0KiBzLCBzaXplX3Qgc2FtcGxlcywgaW50IGxzYmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUpCi17Ci0gICAgdW5zaWduZWQgcG9zLCBpOwotICAgIHVuc2lnbmVkIGNoYXIqIHA7Ci0gICAgZG91YmxlIHN1bTsKLQotICAgIHBvcyA9IHMtPnBvczsKLQotICAgIHdoaWxlIChzYW1wbGVzLS0gPiAwKSB7Ci0gICAgICAgIHMtPmJ1Zltwb3NdID0gbHNiZiA/IGZmX3JldmVyc2VbKnNyY10gOiAqc3JjOwotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLQotICAgICAgICBwID0gcy0+YnVmICsgKChwb3MgLSBDVEFCTEVTKSAmIEZJRk9NQVNLKTsKLSAgICAgICAgKnAgPSBmZl9yZXZlcnNlWypwXTsKLQotICAgICAgICBzdW0gPSAwLjA7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBDVEFCTEVTOyBpKyspIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYSA9IHMtPmJ1ZlsocG9zICAgICAgICAgICAgICAgICAgIC0gaSkgJiBGSUZPTUFTS107Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGIgPSBzLT5idWZbKHBvcyAtIChDVEFCTEVTKjIgLSAxKSArIGkpICYgRklGT01BU0tdOwotICAgICAgICAgICAgc3VtICs9IGN0YWJsZXNbaV1bYV0gKyBjdGFibGVzW2ldW2JdOwotICAgICAgICB9Ci0KLSAgICAgICAgKmRzdCA9IChmbG9hdClzdW07Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotCi0gICAgICAgIHBvcyA9IChwb3MgKyAxKSAmIEZJRk9NQVNLOwotICAgIH0KLQotICAgIHMtPnBvcyA9IHBvczsKLX0KLQotc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0X3N0YXRpY19kYXRhKHZvaWQpCi17Ci0gICAgc3RhdGljIGludCBkb25lID0gMDsKLSAgICBpZiAoZG9uZSkKLSAgICAgICAgcmV0dXJuOwotICAgIGRzZF9jdGFibGVzX3RhYmxlaW5pdCgpOwotICAgIGRvbmUgPSAxOwotfQogCiBzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIERTRENvbnRleHQgKiBzOwogICAgIGludCBpOworICAgIHVpbnQ4X3Qgc2lsZW5jZTsKIAotICAgIGluaXRfc3RhdGljX2RhdGEoKTsKKyAgICBmZl9pbml0X2RzZF9kYXRhKCk7CiAKICAgICBzID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZihEU0RDb250ZXh0KSwgYXZjdHgtPmNoYW5uZWxzKTsKICAgICBpZiAoIXMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKKyAgICBzaWxlbmNlID0gYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RTRF9MU0JGIHx8IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EU0RfTFNCRl9QTEFOQVIgPyBmZl9yZXZlcnNlW0RTRF9TSUxFTkNFXSA6IERTRF9TSUxFTkNFOwogICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgewogICAgICAgICBzW2ldLnBvcyA9IDA7Ci0gICAgICAgIG1lbXNldChzW2ldLmJ1ZiwgMHg2OSwgc2l6ZW9mKHNbaV0uYnVmKSk7Ci0KLSAgICAgICAgLyogMHg2OSA9IDAxMTAxMDAxCi0gICAgICAgICAqIFRoaXMgcGF0dGVybiAib24gcmVwZWF0IiBtYWtlcyBhIGxvdyBlbmVyZ3kgMzUyLjgga0h6IHRvbmUKLSAgICAgICAgICogYW5kIGEgaGlnaCBlbmVyZ3kgMS4wNTg0IE1IeiB0b25lIHdoaWNoIHNob3VsZCBiZSBmaWx0ZXJlZAotICAgICAgICAgKiBvdXQgY29tcGxldGVseSBieSBhbnkgcGxheWJhY2sgc3lzdGVtIC0tPiBzaWxlbmNlCi0gICAgICAgICAqLworICAgICAgICBtZW1zZXQoc1tpXS5idWYsIHNpbGVuY2UsIHNpemVvZihzW2ldLmJ1ZikpOwogICAgIH0KIAogICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9GTFRQOwpAQCAtMTQwLDcgKzg2LDcgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgewogICAgICAgICBmbG9hdCAqIGRzdCA9ICgoZmxvYXQgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGEpW2ldOwotICAgICAgICBkc2QycGNtX3RyYW5zbGF0ZSgmc1tpXSwgZnJhbWUtPm5iX3NhbXBsZXMsIGxzYmYsCisgICAgICAgIGZmX2RzZDJwY21fdHJhbnNsYXRlKCZzW2ldLCBmcmFtZS0+bmJfc2FtcGxlcywgbHNiZiwKICAgICAgICAgICAgIGF2cGt0LT5kYXRhICsgaSAqIHNyY19uZXh0LCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgZHN0LCAxKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RzaWNpbnZpZGVvLmMgYi9saWJhdmNvZGVjL2RzaWNpbnZpZGVvLmMKaW5kZXggZjk1Y2JjNy4uYWEwODA0MSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kc2ljaW52aWRlby5jCisrKyBiL2xpYmF2Y29kZWMvZHNpY2ludmlkZW8uYwpAQCAtMTU4LDYgKzE1OCw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoZHN0X2VuZCAtIGRzdCA+IGRzdF9zaXplIC0gZHN0X3NpemUvMTApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE4NCw2ICsxODcsMTAgQEAKICAgICAgICAgfQogICAgICAgICBkc3QgKz0gbGVuOwogICAgIH0KKworICAgIGlmIChkc3RfZW5kIC0gZHN0ID4gZHN0X3NpemUgLSBkc3Rfc2l6ZS8xMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjI2LDI3ICsyMzMsMzUgQEAKICAgICAgKiBzdXJmYWNlLndpZHRoID0gc3VyZmFjZS5waXRjaCAqLwogICAgIHN3aXRjaCAoYml0bWFwX2ZyYW1lX3R5cGUpIHsKICAgICBjYXNlIDk6Ci0gICAgICAgIGNpbl9kZWNvZGVfcmxlKGJ1ZiwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgIHJlcyA9ICBjaW5fZGVjb2RlX3JsZShidWYsIGJpdG1hcF9mcmFtZV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBjaW4tPmJpdG1hcF90YWJsZVtDSU5fQ1VSX0JNUF0sIGNpbi0+Yml0bWFwX3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzQ6Ci0gICAgICAgIGNpbl9kZWNvZGVfcmxlKGJ1ZiwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgIHJlcyA9ICBjaW5fZGVjb2RlX3JsZShidWYsIGJpdG1hcF9mcmFtZV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBjaW4tPmJpdG1hcF90YWJsZVtDSU5fQ1VSX0JNUF0sIGNpbi0+Yml0bWFwX3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIGNpbl9hcHBseV9kZWx0YV9kYXRhKGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9QUkVfQk1QXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2luLT5iaXRtYXBfdGFibGVbQ0lOX0NVUl9CTVBdLCBjaW4tPmJpdG1hcF9zaXplKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAzNToKICAgICAgICAgYml0bWFwX2ZyYW1lX3NpemUgPSBjaW5fZGVjb2RlX2h1ZmZtYW4oYnVmLCBiaXRtYXBfZnJhbWVfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwgY2luLT5iaXRtYXBfc2l6ZSk7Ci0gICAgICAgIGNpbl9kZWNvZGVfcmxlKGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgIHJlcyA9ICBjaW5fZGVjb2RlX3JsZShjaW4tPmJpdG1hcF90YWJsZVtDSU5fSU5UX0JNUF0sIGJpdG1hcF9mcmFtZV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBjaW4tPmJpdG1hcF90YWJsZVtDSU5fQ1VSX0JNUF0sIGNpbi0+Yml0bWFwX3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzY6CiAgICAgICAgIGJpdG1hcF9mcmFtZV9zaXplID0gY2luX2RlY29kZV9odWZmbWFuKGJ1ZiwgYml0bWFwX2ZyYW1lX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2luLT5iaXRtYXBfc2l6ZSk7Ci0gICAgICAgIGNpbl9kZWNvZGVfcmxlKGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwgYml0bWFwX2ZyYW1lX3NpemUsCisgICAgICAgIHJlcyA9IGNpbl9kZWNvZGVfcmxlKGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9JTlRfQk1QXSwgYml0bWFwX2ZyYW1lX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNpbi0+Yml0bWFwX3RhYmxlW0NJTl9DVVJfQk1QXSwgY2luLT5iaXRtYXBfc2l6ZSk7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgY2luX2FwcGx5X2RlbHRhX2RhdGEoY2luLT5iaXRtYXBfdGFibGVbQ0lOX1BSRV9CTVBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaW4tPmJpdG1hcF90YWJsZVtDSU5fQ1VSX0JNUF0sIGNpbi0+Yml0bWFwX3NpemUpOwogICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHNzX3NwLmMgYi9saWJhdmNvZGVjL2Rzc19zcC5jCmluZGV4IDdjZjg0ODkuLjE0MDI1ZmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZHNzX3NwLmMKKysrIGIvbGliYXZjb2RlYy9kc3Nfc3AuYwpAQCAtMzMsNyArMzMsNyBAQAogCiAjZGVmaW5lIERTU19TUF9GUkFNRV9TSVpFICAgICAgICA0MgogI2RlZmluZSBEU1NfU1BfU0FNUExFX0NPVU5UICAgICAoNjYgKiBTVUJGUkFNRVMpCi0jZGVmaW5lIERTU19TUF9GT1JNVUxBKGEsIGIsIGMpICgoKCgoYSkgPDwgMTUpICsgKGIpICogKGMpKSArIDB4NDAwMCkgPj4gMTUpCisjZGVmaW5lIERTU19TUF9GT1JNVUxBKGEsIGIsIGMpICgoaW50KSgoKChhKSAqICgxIDw8IDE1KSkgKyAoYikgKiAodW5zaWduZWQpKGMpKSArIDB4NDAwMCkgPj4gMTUpCiAKIHR5cGVkZWYgc3RydWN0IERzc1NwU3ViZnJhbWUgewogICAgIGludDE2X3QgZ2FpbjsKQEAgLTQ5OSw3ICs0OTksNyBAQAogICAgICAgICAgICAgdmVjW2ldID0gdmVjW2ldID4+IC1iaXRzOwogICAgIGVsc2UKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICAgIHZlY1tpXSA9IHZlY1tpXSA8PCBiaXRzOworICAgICAgICAgICAgdmVjW2ldID0gdmVjW2ldICogKDEgPDwgYml0cyk7CiB9CiAKIHN0YXRpYyB2b2lkIGRzc19zcF91cGRhdGVfYnVmKGludDMyX3QgKmhpc3QsIGludDMyX3QgKnZlY3RvcikKQEAgLTUyNCwxMiArNTI0LDEyIEBACiAgICAgICAgIHRtcCA9IGRzdFthXSAqIGZpbHRlcl9idWZbMF07CiAKICAgICAgICAgZm9yIChpID0gMTQ7IGkgPiAwOyBpLS0pCi0gICAgICAgICAgICB0bXAgLT0gZXJyb3JfYnVmW2ldICogZmlsdGVyX2J1ZltpXTsKKyAgICAgICAgICAgIHRtcCAtPSBlcnJvcl9idWZbaV0gKiAodW5zaWduZWQpZmlsdGVyX2J1ZltpXTsKIAogICAgICAgICBmb3IgKGkgPSAxNDsgaSA+IDA7IGktLSkKICAgICAgICAgICAgIGVycm9yX2J1ZltpXSA9IGVycm9yX2J1ZltpIC0gMV07CiAKLSAgICAgICAgdG1wID0gKHRtcCArIDQwOTYpID4+IDEzOworICAgICAgICB0bXAgPSAoaW50KSh0bXAgKyA0MDk2VSkgPj4gMTM7CiAKICAgICAgICAgZXJyb3JfYnVmWzFdID0gdG1wOwogCkBAIC03NjEsMTAgKzc2MSw4IEBACiAgICAgfQogCiAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBEU1NfU1BfU0FNUExFX0NPVU5UOwotICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJnZXRfYnVmZmVyKCkgZmFpbGVkLlxuIik7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9CiAKICAgICBvdXQgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2RzdGRlYy5jIGIvbGliYXZjb2RlYy9kc3RkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjhjYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9kc3RkZWMuYwpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIERpcmVjdCBTdHJlYW0gVHJhbnNmZXIgKERTVCkgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDE0IFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBEaXJlY3QgU3RyZWFtIFRyYW5zZmVyIChEU1QpIGRlY29kZXIKKyAqIElTTy9JRUMgMTQ0OTYtMyBQYXJ0IDMgU3VicGFydCAxMDogVGVjaG5pY2FsIGRlc2NyaXB0aW9uIG9mIGxvc3NsZXNzIGNvZGluZyBvZiBvdmVyc2FtcGxlZCBhdWRpbworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAiZHNkLmgiCisKKyNkZWZpbmUgRFNUX01BWF9DSEFOTkVMUyA2CisjZGVmaW5lIERTVF9NQVhfRUxFTUVOVFMgKDIgKiBEU1RfTUFYX0NIQU5ORUxTKQorCisjZGVmaW5lIERTRF9GUzQ0KHNhbXBsZV9yYXRlKSAoc2FtcGxlX3JhdGUgKiA4IC8gNDQxMDApCisKKyNkZWZpbmUgRFNUX1NBTVBMRVNfUEVSX0ZSQU1FKHNhbXBsZV9yYXRlKSAoNTg4ICogRFNEX0ZTNDQoc2FtcGxlX3JhdGUpKQorCitzdGF0aWMgY29uc3QgaW50OF90IGZzZXRzX2NvZGVfcHJlZF9jb2VmZlszXVszXSA9IHsKKyAgICB7ICAtOCB9LAorICAgIHsgLTE2LCAgOCB9LAorICAgIHsgIC05LCAtNSwgNiB9LAorfTsKKworc3RhdGljIGNvbnN0IGludDhfdCBwcm9ic19jb2RlX3ByZWRfY29lZmZbM11bM10gPSB7CisgICAgeyAgLTggfSwKKyAgICB7IC0xNiwgIDggfSwKKyAgICB7IC0yNCwgMjQsIC04IH0sCit9OworCit0eXBlZGVmIHN0cnVjdCBBcml0aENvZGVyIHsKKyAgICB1bnNpZ25lZCBpbnQgYTsKKyAgICB1bnNpZ25lZCBpbnQgYzsKK30gQXJpdGhDb2RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgVGFibGUgeworICAgIHVuc2lnbmVkIGludCBlbGVtZW50czsKKyAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoW0RTVF9NQVhfRUxFTUVOVFNdOworICAgIGludCBjb2VmZltEU1RfTUFYX0VMRU1FTlRTXVsxMjhdOworfSBUYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgRFNUQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEFyaXRoQ29kZXIgYWM7CisgICAgVGFibGUgZnNldHMsIHByb2JzOworICAgIERFQ0xBUkVfQUxJR05FRCg2NCwgdWludDhfdCwgc3RhdHVzKVtEU1RfTUFYX0NIQU5ORUxTXVsxNl07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBmaWx0ZXIpW0RTVF9NQVhfRUxFTUVOVFNdWzE2XVsyNTZdOworICAgIERTRENvbnRleHQgZHNkY3R4W0RTVF9NQVhfQ0hBTk5FTFNdOworfSBEU1RDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIERTVENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IERTVF9NQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiQ2hhbm5lbCBjb3VudCAlZCIsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUOworCisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKQorICAgICAgICBtZW1zZXQocy0+ZHNkY3R4W2ldLmJ1ZiwgMHg2OSwgc2l6ZW9mKHMtPmRzZGN0eFtpXS5idWYpKTsKKworICAgIGZmX2luaXRfZHNkX2RhdGEoKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfbWFwKEdldEJpdENvbnRleHQgKmdiLCBUYWJsZSAqdCwgdW5zaWduZWQgaW50IG1hcFtEU1RfTUFYX0NIQU5ORUxTXSwgaW50IGNoYW5uZWxzKQoreworICAgIGludCBjaDsKKyAgICB0LT5lbGVtZW50cyA9IDE7CisgICAgbWFwWzBdID0gMDsKKyAgICBpZiAoIWdldF9iaXRzMShnYikpIHsKKyAgICAgICAgZm9yIChjaCA9IDE7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGludCBiaXRzID0gYXZfbG9nMih0LT5lbGVtZW50cykgKyAxOworICAgICAgICAgICAgbWFwW2NoXSA9IGdldF9iaXRzKGdiLCBiaXRzKTsKKyAgICAgICAgICAgIGlmIChtYXBbY2hdID09IHQtPmVsZW1lbnRzKSB7CisgICAgICAgICAgICAgICAgdC0+ZWxlbWVudHMrKzsKKyAgICAgICAgICAgICAgICBpZiAodC0+ZWxlbWVudHMgPj0gRFNUX01BWF9FTEVNRU5UUykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcFtjaF0gPiB0LT5lbGVtZW50cykgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KG1hcCwgMCwgc2l6ZW9mKCptYXApICogRFNUX01BWF9DSEFOTkVMUyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X3NyX2dvbG9tYl9kc3QoR2V0Qml0Q29udGV4dCAqZ2IsIHVuc2lnbmVkIGludCBrKQoreworICAgIGludCB2ID0gZ2V0X3VyX2dvbG9tYihnYiwgaywgZ2V0X2JpdHNfbGVmdChnYiksIDApOworICAgIGlmICh2ICYmIGdldF9iaXRzMShnYikpCisgICAgICAgIHYgPSAtdjsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgcmVhZF91bmNvZGVkX2NvZWZmKEdldEJpdENvbnRleHQgKmdiLCBpbnQgKmRzdCwgdW5zaWduZWQgaW50IGVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2VmZl9iaXRzLCBpbnQgaXNfc2lnbmVkLCBpbnQgb2Zmc2V0KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGVsZW1lbnRzOyBpKyspIHsKKyAgICAgICAgZHN0W2ldID0gKGlzX3NpZ25lZCA/IGdldF9zYml0cyhnYiwgY29lZmZfYml0cykgOiBnZXRfYml0cyhnYiwgY29lZmZfYml0cykpICsgb2Zmc2V0OworICAgIH0KK30KKworc3RhdGljIGludCByZWFkX3RhYmxlKEdldEJpdENvbnRleHQgKmdiLCBUYWJsZSAqdCwgY29uc3QgaW50OF90IGNvZGVfcHJlZF9jb2VmZlszXVszXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoX2JpdHMsIGludCBjb2VmZl9iaXRzLCBpbnQgaXNfc2lnbmVkLCBpbnQgb2Zmc2V0KQoreworICAgIHVuc2lnbmVkIGludCBpLCBqLCBrOworICAgIGZvciAoaSA9IDA7IGkgPCB0LT5lbGVtZW50czsgaSsrKSB7CisgICAgICAgIHQtPmxlbmd0aFtpXSA9IGdldF9iaXRzKGdiLCBsZW5ndGhfYml0cykgKyAxOworICAgICAgICBpZiAoIWdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIHJlYWRfdW5jb2RlZF9jb2VmZihnYiwgdC0+Y29lZmZbaV0sIHQtPmxlbmd0aFtpXSwgY29lZmZfYml0cywgaXNfc2lnbmVkLCBvZmZzZXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IG1ldGhvZCA9IGdldF9iaXRzKGdiLCAyKSwgbHNiX3NpemU7CisgICAgICAgICAgICBpZiAobWV0aG9kID09IDMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIHJlYWRfdW5jb2RlZF9jb2VmZihnYiwgdC0+Y29lZmZbaV0sIG1ldGhvZCArIDEsIGNvZWZmX2JpdHMsIGlzX3NpZ25lZCwgb2Zmc2V0KTsKKworICAgICAgICAgICAgbHNiX3NpemUgID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgZm9yIChqID0gbWV0aG9kICsgMTsgaiA8IHQtPmxlbmd0aFtpXTsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IGMsIHggPSAwOworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBtZXRob2QgKyAxOyBrKyspCisgICAgICAgICAgICAgICAgICAgIHggKz0gY29kZV9wcmVkX2NvZWZmW21ldGhvZF1ba10gKiB0LT5jb2VmZltpXVtqIC0gayAtIDFdOworICAgICAgICAgICAgICAgIGMgPSBnZXRfc3JfZ29sb21iX2RzdChnYiwgbHNiX3NpemUpOworICAgICAgICAgICAgICAgIGlmICh4ID49IDApCisgICAgICAgICAgICAgICAgICAgIGMgLT0gKHggKyA0KSAvIDg7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjICs9ICgteCArIDMpIC8gODsKKyAgICAgICAgICAgICAgICB0LT5jb2VmZltpXVtqXSA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFjX2luaXQoQXJpdGhDb2RlciAqYWMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGFjLT5hID0gNDA5NTsKKyAgICBhYy0+YyA9IGdldF9iaXRzKGdiLCAxMik7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgYWNfZ2V0KEFyaXRoQ29kZXIgKmFjLCBHZXRCaXRDb250ZXh0ICpnYiwgaW50IHAsIGludCAqZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgayA9IChhYy0+YSA+PiA4KSB8ICgoYWMtPmEgPj4gNykgJiAxKTsKKyAgICB1bnNpZ25lZCBpbnQgcSA9IGsgKiBwOworICAgIHVuc2lnbmVkIGludCBhX3EgPSBhYy0+YSAtIHE7CisKKyAgICAqZSA9IGFjLT5jIDwgYV9xOworICAgIGlmICgqZSkgeworICAgICAgICBhYy0+YSAgPSBhX3E7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYWMtPmEgID0gcTsKKyAgICAgICAgYWMtPmMgLT0gYV9xOworICAgIH0KKworICAgIGlmIChhYy0+YSA8IDIwNDgpIHsKKyAgICAgICAgaW50IG4gPSAxMSAtIGF2X2xvZzIoYWMtPmEpOworICAgICAgICBhYy0+YSA8PD0gbjsKKyAgICAgICAgYWMtPmMgPSAoYWMtPmMgPDwgbikgfCBnZXRfYml0cyhnYiwgbik7CisgICAgfQorfQorCitzdGF0aWMgdWludDhfdCBwcm9iX2RzdF94X2JpdChpbnQgYykKK3sKKyAgICByZXR1cm4gKGZmX3JldmVyc2VbYyAmIDEyN10gPj4gMSkgKyAxOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9maWx0ZXIoaW50MTZfdCB0YWJsZVtEU1RfTUFYX0VMRU1FTlRTXVsxNl1bMjU2XSwgY29uc3QgVGFibGUgKmZzZXRzKQoreworICAgIGludCBpLCBqLCBrLCBsOworCisgICAgZm9yIChpID0gMDsgaSA8IGZzZXRzLT5lbGVtZW50czsgaSsrKSB7CisgICAgICAgIGludCBsZW5ndGggPSBmc2V0cy0+bGVuZ3RoW2ldOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgICAgICBpbnQgdG90YWwgPSBhdl9jbGlwKGxlbmd0aCAtIGogKiA4LCAwLCA4KTsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDI1NjsgaysrKSB7CisgICAgICAgICAgICAgICAgaW50IHYgPSAwOworCisgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IHRvdGFsOyBsKyspCisgICAgICAgICAgICAgICAgICAgIHYgKz0gKCgoayA+PiBsKSAmIDEpICogMiAtIDEpICogZnNldHMtPmNvZWZmW2ldW2ogKiA4ICsgbF07CisgICAgICAgICAgICAgICAgdGFibGVbaV1bal1ba10gPSB2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICB1bnNpZ25lZCBzYW1wbGVzX3Blcl9mcmFtZSA9IERTVF9TQU1QTEVTX1BFUl9GUkFNRShhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgIHVuc2lnbmVkIG1hcF9jaF90b19mZWxlbVtEU1RfTUFYX0NIQU5ORUxTXTsKKyAgICB1bnNpZ25lZCBtYXBfY2hfdG9fcGVsZW1bRFNUX01BWF9DSEFOTkVMU107CisgICAgdW5zaWduZWQgaSwgY2gsIHNhbWVfbWFwLCBkc3RfeF9iaXQ7CisgICAgdW5zaWduZWQgaGFsZl9wcm9iW0RTVF9NQVhfQ0hBTk5FTFNdOworICAgIGNvbnN0IGludCBjaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKyAgICBEU1RDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBBcml0aENvZGVyICphYyA9ICZzLT5hYzsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisgICAgdWludDhfdCAqZHNkOworICAgIGZsb2F0ICpwY207CisgICAgaW50IHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8PSAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gc2FtcGxlc19wZXJfZnJhbWUgLyA4OworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZHNkID0gZnJhbWUtPmRhdGFbMF07CisgICAgcGNtID0gKGZsb2F0ICopZnJhbWUtPmRhdGFbMF07CisKKyAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHM4KGdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIWdldF9iaXRzMShnYikpIHsKKyAgICAgICAgc2tpcF9iaXRzMShnYik7CisgICAgICAgIGlmIChnZXRfYml0cyhnYiwgNikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzBdLCBhdnBrdC0+ZGF0YSArIDEsIEZGTUlOKGF2cGt0LT5zaXplIC0gMSwgZnJhbWUtPm5iX3NhbXBsZXMgKiBhdmN0eC0+Y2hhbm5lbHMpKTsKKyAgICAgICAgZ290byBkc2Q7CisgICAgfQorCisgICAgLyogU2VnbWVudGF0aW9uICgxMC40LCAxMC41LCAxMC42KSAqLworCisgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIk5vdCBTYW1lIFNlZ21lbnRhdGlvbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKCFnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIk5vdCBTYW1lIFNlZ21lbnRhdGlvbiBGb3IgQWxsIENoYW5uZWxzIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoIWdldF9iaXRzMShnYikpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiTm90IEVuZCBPZiBDaGFubmVsIFNlZ21lbnRhdGlvbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgLyogTWFwcGluZyAoMTAuNywgMTAuOCwgMTAuOSkgKi8KKworICAgIHNhbWVfbWFwID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIGlmICgocmV0ID0gcmVhZF9tYXAoZ2IsICZzLT5mc2V0cywgbWFwX2NoX3RvX2ZlbGVtLCBhdmN0eC0+Y2hhbm5lbHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoc2FtZV9tYXApIHsKKyAgICAgICAgcy0+cHJvYnMuZWxlbWVudHMgPSBzLT5mc2V0cy5lbGVtZW50czsKKyAgICAgICAgbWVtY3B5KG1hcF9jaF90b19wZWxlbSwgbWFwX2NoX3RvX2ZlbGVtLCBzaXplb2YobWFwX2NoX3RvX2ZlbGVtKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiTm90IFNhbWUgTWFwcGluZyIpOworICAgICAgICBpZiAoKHJldCA9IHJlYWRfbWFwKGdiLCAmcy0+cHJvYnMsIG1hcF9jaF90b19wZWxlbSwgYXZjdHgtPmNoYW5uZWxzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBIYWxmIFByb2JhYmlsaXR5ICgxMC4xMCkgKi8KKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Y3R4LT5jaGFubmVsczsgY2grKykKKyAgICAgICAgaGFsZl9wcm9iW2NoXSA9IGdldF9iaXRzMShnYik7CisKKyAgICAvKiBGaWx0ZXIgQ29lZiBTZXRzICgxMC4xMikgKi8KKworICAgIHJlYWRfdGFibGUoZ2IsICZzLT5mc2V0cywgZnNldHNfY29kZV9wcmVkX2NvZWZmLCA3LCA5LCAxLCAwKTsKKworICAgIC8qIFByb2JhYmlsaXR5IFRhYmxlcyAoMTAuMTMpICovCisKKyAgICByZWFkX3RhYmxlKGdiLCAmcy0+cHJvYnMsIHByb2JzX2NvZGVfcHJlZF9jb2VmZiwgNiwgNywgMCwgMSk7CisKKyAgICAvKiBBcml0aG1ldGljIENvZGVkIERhdGEgKDEwLjExKSAqLworCisgICAgaWYgKGdldF9iaXRzMShnYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGFjX2luaXQoYWMsIGdiKTsKKworICAgIGJ1aWxkX2ZpbHRlcihzLT5maWx0ZXIsICZzLT5mc2V0cyk7CisKKyAgICBtZW1zZXQocy0+c3RhdHVzLCAweEFBLCBzaXplb2Yocy0+c3RhdHVzKSk7CisgICAgbWVtc2V0KGRzZCwgMCwgZnJhbWUtPm5iX3NhbXBsZXMgKiA0ICogYXZjdHgtPmNoYW5uZWxzKTsKKworICAgIGFjX2dldChhYywgZ2IsIHByb2JfZHN0X3hfYml0KHMtPmZzZXRzLmNvZWZmWzBdWzBdKSwgJmRzdF94X2JpdCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlc19wZXJfZnJhbWU7IGkrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgZmVsZW0gPSBtYXBfY2hfdG9fZmVsZW1bY2hdOworICAgICAgICAgICAgaW50MTZfdCAoKmZpbHRlcilbMjU2XSA9IHMtPmZpbHRlcltmZWxlbV07CisgICAgICAgICAgICB1aW50OF90ICpzdGF0dXMgPSBzLT5zdGF0dXNbY2hdOworICAgICAgICAgICAgaW50IHByb2IsIHJlc2lkdWFsLCB2OworCisjZGVmaW5lIEYoeCkgZmlsdGVyWyh4KV1bc3RhdHVzWyh4KV1dCisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHByZWRpY3QgPSBGKCAwKSArIEYoIDEpICsgRiggMikgKyBGKCAzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKCA0KSArIEYoIDUpICsgRiggNikgKyBGKCA3KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKCA4KSArIEYoIDkpICsgRigxMCkgKyBGKDExKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGKDEyKSArIEYoMTMpICsgRigxNCkgKyBGKDE1KTsKKyN1bmRlZiBGCisKKyAgICAgICAgICAgIGlmICghaGFsZl9wcm9iW2NoXSB8fCBpID49IHMtPmZzZXRzLmxlbmd0aFtmZWxlbV0pIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBwZWxlbSA9IG1hcF9jaF90b19wZWxlbVtjaF07CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXggPSBGRkFCUyhwcmVkaWN0KSA+PiAzOworICAgICAgICAgICAgICAgIHByb2IgPSBzLT5wcm9icy5jb2VmZltwZWxlbV1bRkZNSU4oaW5kZXgsIHMtPnByb2JzLmxlbmd0aFtwZWxlbV0gLSAxKV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2IgPSAxMjg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFjX2dldChhYywgZ2IsIHByb2IsICZyZXNpZHVhbCk7CisgICAgICAgICAgICB2ID0gKChwcmVkaWN0ID4+IDE1KSBeIHJlc2lkdWFsKSAmIDE7CisgICAgICAgICAgICBkc2RbKChpID4+IDMpICogY2hhbm5lbHMgKyBjaCkgPDwgMl0gfD0gdiA8PCAoNyAtIChpICYgMHg3ICkpOworCisgICAgICAgICAgICBBVl9XTjY0QShzdGF0dXMgKyA4LCAoQVZfUk42NEEoc3RhdHVzICsgOCkgPDwgMSkgfCAoKEFWX1JONjRBKHN0YXR1cykgPj4gNjMpICYgMSkpOworICAgICAgICAgICAgQVZfV042NEEoc3RhdHVzLCAoQVZfUk42NEEoc3RhdHVzKSA8PCAxKSB8IHYpOworICAgICAgICB9CisgICAgfQorCitkc2Q6CisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGZmX2RzZDJwY21fdHJhbnNsYXRlKCZzLT5kc2RjdHhbaV0sIGZyYW1lLT5uYl9zYW1wbGVzLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVswXSArIGkgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgKiA0LCBwY20gKyBpLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgIH0KKworICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworQVZDb2RlYyBmZl9kc3RfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZHN0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFNUIChEaWdpdGFsIFN0cmVhbSBUcmFuc2ZlcikiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRFNULAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEU1RDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfRkxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kdW1wX2V4dHJhZGF0YV9ic2YuYyBiL2xpYmF2Y29kZWMvZHVtcF9leHRyYWRhdGFfYnNmLmMKaW5kZXggMDhjNDIyNy4uOTg3MDM3NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kdW1wX2V4dHJhZGF0YV9ic2YuYworKysgYi9saWJhdmNvZGVjL2R1bXBfZXh0cmFkYXRhX2JzZi5jCkBAIC0yMSwzNCArMjEsODQgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic2YuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogCitlbnVtIER1bXBGcmVxIHsKKyAgICBEVU1QX0ZSRVFfS0VZRlJBTUUsCisgICAgRFVNUF9GUkVRX0FMTCwKK307CiAKLXN0YXRpYyBpbnQgZHVtcF9leHRyYWRhdGEoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IGtleWZyYW1lKXsKLSAgICBpbnQgY21kPSBhcmdzID8gKmFyZ3MgOiAwOwotICAgIC8qIGNhc3QgdG8gYXZvaWQgd2FybmluZyBhYm91dCBkaXNjYXJkaW5nIHF1YWxpZmllcnMgKi8KLSAgICBpZihhdmN0eC0+ZXh0cmFkYXRhKXsKLSAgICAgICAgaWYoICAoa2V5ZnJhbWUgJiYgKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9MT0NBTF9IRUFERVIpICYmIGNtZCA9PSAnYScpCi0gICAgICAgICAgIHx8KGtleWZyYW1lICYmIChjbWQ9PSdrJyB8fCAhY21kKSkKLSAgICAgICAgICAgfHwoY21kPT0nZScpCi0gICAgICAgICAgICAvKnx8KD8gJiYgKHMtPmZsYWdzICYgUEFSU0VSX0ZMQUdfRFVNUF9FWFRSQURBVEFfQVRfQkVHSU4pKi8pewotICAgICAgICAgICAgaW50IHNpemU9IGJ1Zl9zaXplICsgYXZjdHgtPmV4dHJhZGF0YV9zaXplOwotICAgICAgICAgICAgKnBvdXRidWZfc2l6ZT0gc2l6ZTsKLSAgICAgICAgICAgICpwb3V0YnVmPSBhdl9tYWxsb2Moc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgICAgICAgICAgaWYgKCEqcG91dGJ1ZikKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwordHlwZWRlZiBzdHJ1Y3QgRHVtcEV4dHJhZGF0YUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBmcmVxOworfSBEdW1wRXh0cmFkYXRhQ29udGV4dDsKIAotICAgICAgICAgICAgbWVtY3B5KCpwb3V0YnVmLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICAgICAgbWVtY3B5KCgqcG91dGJ1ZikgKyBhdmN0eC0+ZXh0cmFkYXRhX3NpemUsIGJ1ZiwgYnVmX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgICAgIHJldHVybiAxOworc3RhdGljIGludCBkdW1wX2V4dHJhZGF0YShBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKm91dCkKK3sKKyAgICBEdW1wRXh0cmFkYXRhQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0ICppbjsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHJldCA9IGZmX2JzZl9nZXRfcGFja2V0KGN0eCwgJmluKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhICYmCisgICAgICAgIChzLT5mcmVxID09IERVTVBfRlJFUV9BTEwgfHwKKyAgICAgICAgIChzLT5mcmVxID09IERVTVBfRlJFUV9LRVlGUkFNRSAmJiBpbi0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSkgeworICAgICAgICBpZiAoaW4tPnNpemUgPj0gSU5UX01BWCAtIGN0eC0+cGFyX2luLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFUkFOR0UpOworICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZfbmV3X3BhY2tldChvdXQsIGluLT5zaXplICsgY3R4LT5wYXJfaW4tPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgcmV0ID0gYXZfcGFja2V0X2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYob3V0KTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShvdXQtPmRhdGEsIGN0eC0+cGFyX2luLT5leHRyYWRhdGEsIGN0eC0+cGFyX2luLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIG1lbWNweShvdXQtPmRhdGEgKyBjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhX3NpemUsIGluLT5kYXRhLCBpbi0+c2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfcGFja2V0X21vdmVfcmVmKG91dCwgaW4pOwogICAgIH0KLSAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9wYWNrZXRfZnJlZSgmaW4pOworCisgICAgcmV0dXJuIHJldDsKIH0KIAotQVZCaXRTdHJlYW1GaWx0ZXIgZmZfZHVtcF9leHRyYWRhdGFfYnNmPXsKLSAgICAubmFtZSAgID0gImR1bXBfZXh0cmEiLAotICAgIC5maWx0ZXIgPSBkdW1wX2V4dHJhZGF0YSwKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKER1bXBFeHRyYWRhdGFDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfQlNGX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJmcmVxIiwgIldoZW4gZG8gZHVtcCBleHRyYWRhdGEiLCBPRkZTRVQoZnJlcSksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gRFVNUF9GUkVRX0tFWUZSQU1FIH0sIERVTVBfRlJFUV9LRVlGUkFNRSwgRFVNUF9GUkVRX0FMTCwgRkxBR1MsICJmcmVxIiB9LAorICAgICAgICB7ICJrIiwgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBEVU1QX0ZSRVFfS0VZRlJBTUUgfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZyZXEiIH0sCisgICAgICAgIHsgImtleWZyYW1lIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IERVTVBfRlJFUV9LRVlGUkFNRSB9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZnJlcSIgfSwKKyAgICAgICAgeyAiZSIsICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRFVNUF9GUkVRX0FMTCAgICAgIH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmcmVxIiB9LAorICAgICAgICB7ICJhbGwiLCAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBEVU1QX0ZSRVFfQUxMICAgICAgfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZyZXEiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBkdW1wX2V4dHJhZGF0YV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJkdW1wX2V4dHJhZGF0YSBic2YiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfZHVtcF9leHRyYWRhdGFfYnNmID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJkdW1wX2V4dHJhIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRHVtcEV4dHJhZGF0YUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZkdW1wX2V4dHJhZGF0YV9jbGFzcywKKyAgICAuZmlsdGVyICAgICAgICAgPSBkdW1wX2V4dHJhZGF0YSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2R2LmMgYi9saWJhdmNvZGVjL2R2LmMKaW5kZXggMzFkMTMxNS4uOWM3NWNmZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kdi5jCisrKyBiL2xpYmF2Y29kZWMvZHYuYwpAQCAtNDQsNyArNDQsNiBAQAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJkdi5oIgogI2luY2x1ZGUgImR2ZGF0YS5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJwdXRfYml0cy5oIgogI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2R2LmggYi9saWJhdmNvZGVjL2R2LmgKaW5kZXggYWY1MDZlYi4uMGU5N2JiMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kdi5oCisrKyBiL2xpYmF2Y29kZWMvZHYuaApAQCAtMjksOCArMjksOCBAQAogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImR2X3Byb2ZpbGUuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgIm1lX2NtcC5oIgorI2luY2x1ZGUgInZsYy5oIgogCiB0eXBlZGVmIHN0cnVjdCBEVndvcmtfY2h1bmsgewogICAgIHVpbnQxNl90IGJ1Zl9vZmZzZXQ7CkBAIC0zOCw2ICszOCw3IEBACiB9IERWd29ya19jaHVuazsKIAogdHlwZWRlZiBzdHJ1Y3QgRFZWaWRlb0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmF2Y2xhc3M7CiAgICAgY29uc3QgQVZEVlByb2ZpbGUgKnN5czsKICAgICBjb25zdCBBVkZyYW1lICAgKmZyYW1lOwogICAgIEFWQ29kZWNDb250ZXh0ICAqYXZjdHg7CkBAIC00NSwxMiArNDYsMTQgQEAKIAogICAgIHVpbnQ4X3QgZHZfemlnemFnWzJdWzY0XTsKIAotICAgIHZvaWQgKCpnZXRfcGl4ZWxzKShpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplKTsKKyAgICB2b2lkICgqZ2V0X3BpeGVscykoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVzaXplKTsKICAgICB2b2lkICgqZmRjdFsyXSkoaW50MTZfdCAqYmxvY2spOwotICAgIHZvaWQgKCppZGN0X3B1dFsyXSkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCppZGN0X3B1dFsyXSkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOwogICAgIG1lX2NtcF9mdW5jIGlsZGN0X2NtcDsKICAgICBEVndvcmtfY2h1bmsgd29ya19jaHVua3NbNCAqIDEyICogMjddOwogICAgIHVpbnQzMl90IGlkY3RfZmFjdG9yWzIgKiA0ICogMTYgKiA2NF07CisKKyAgICBpbnQgcXVhbnRfZGVhZHpvbmU7CiB9IERWVmlkZW9Db250ZXh0OwogCiBlbnVtIGR2X3NlY3Rpb25fdHlwZSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2R2X3RhYmxlZ2VuLmMgYi9saWJhdmNvZGVjL2R2X3RhYmxlZ2VuLmMKaW5kZXggMjU3OTM0MS4uZDAzMjEwMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kdl90YWJsZWdlbi5jCisrKyBiL2xpYmF2Y29kZWMvZHZfdGFibGVnZW4uYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIFdSSVRFXzFEX0ZVTkNfQVJHVihkdl92bGNfcGFpciwgNywKLSAgICAgICAgICAgICAgICAgICAiezB4JSJQUkl4MzIiLCAlIlBSSWQ4In0iLCBkYXRhW2ldLnZsYywgZGF0YVtpXS5zaXplKQorICAgICAgICAgICAgICAgICAgICJ7MHglIlBSSXgzMiIsICUiUFJJdTMyIn0iLCBkYXRhW2ldLnZsYywgZGF0YVtpXS5zaXplKQogV1JJVEVfMkRfRlVOQyhkdl92bGNfcGFpcikKIAogaW50IG1haW4odm9pZCkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHZhdWRpb2RlYy5jIGIvbGliYXZjb2RlYy9kdmF1ZGlvZGVjLmMKaW5kZXggZmFhOWU1Zi4uNWFhMmE5NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kdmF1ZGlvZGVjLmMKKysrIGIvbGliYXZjb2RlYy9kdmF1ZGlvZGVjLmMKQEAgLTUyLDcgKzUyLDcgQEAKICAgICB9CiAKICAgICBzLT5pc19wYWwgPSBzLT5ibG9ja19zaXplID09IDg2NDA7Ci0gICAgcy0+aXNfMTJiaXQgPSBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMjsKKyAgICBzLT5pc18xMmJpdCA9IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTI7CiAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2R2YnN1Yi5jIGIvbGliYXZjb2RlYy9kdmJzdWIuYwppbmRleCAzY2RiYWRlLi44Y2NlNzAyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2R2YnN1Yi5jCisrKyBiL2xpYmF2Y29kZWMvZHZic3ViLmMKQEAgLTIzOSw5ICsyMzksOSBAQAogICAgICAgICAgICAgeCArPSBsZW47CiAgICAgICAgIH0KICAgICAgICAgLyogZW5kIG9mIGxpbmUgKi8KLSAgICAgICAgLy8gMDAwMDAwMDAgMDAwMDAwMDAgZW5kIG9mIDgtYml0L3BpeGVsX2NvZGVfc3RyaW5nCisgICAgICAgIC8vIDAwMDAwMDAwIGVuZCBvZiA4LWJpdC9waXhlbF9jb2RlX3N0cmluZwogICAgICAgICAqcSsrID0gMHgwMDsKLSAgICAgICAgKnErKyA9IDB4MDA7CisgICAgICAgICpxKysgPSAweGYwOwogICAgICAgICBiaXRtYXAgKz0gbGluZXNpemU7CiAgICAgfQogICAgICpwcSA9IHE7CkBAIC0zNDIsNiArMzQyLDkgQEAKICAgICAgICAgfSBlbHNlIGlmIChoLT5yZWN0c1tyZWdpb25faWRdLT5uYl9jb2xvcnMgPD0gMTYpIHsKICAgICAgICAgICAgIC8qIDQgYnBwLCBzdGFuZGFyZCBlbmNvZGluZyAqLwogICAgICAgICAgICAgYnBwX2luZGV4ID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChoLT5yZWN0c1tyZWdpb25faWRdLT5uYl9jb2xvcnMgPD0gMjU2KSB7CisgICAgICAgICAgICAvKiA4IGJwcCwgc3RhbmRhcmQgZW5jb2RpbmcgKi8KKyAgICAgICAgICAgIGJwcF9pbmRleCA9IDI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHZic3ViX3BhcnNlci5jIGIvbGliYXZjb2RlYy9kdmJzdWJfcGFyc2VyLmMKaW5kZXggYWY0NjdmNy4uZTc3Yjk2NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kdmJzdWJfcGFyc2VyLmMKKysrIGIvbGliYXZjb2RlYy9kdmJzdWJfcGFyc2VyLmMKQEAgLTE4LDggKzE4LDE0IEBACiAgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogLyogUGFyc2VyIChtb3N0bHkpIGNvcGllZCBmcm9tIGR2ZHN1Yi5jICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2R2YnN1YmRlYy5jIGIvbGliYXZjb2RlYy9kdmJzdWJkZWMuYwppbmRleCBhNDY2M2Q5Li42YWY2ZWY3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2R2YnN1YmRlYy5jCisrKyBiL2xpYmF2Y29kZWMvZHZic3ViZGVjLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY29sb3JzcGFjZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKIAogI2RlZmluZSBEVkJTVUJfUEFHRV9TRUdNRU5UICAgICAweDEwCkBAIC0zNSwxMjEgKzM2LDYgQEAKIAogI2RlZmluZSBjbSAoZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1ApCiAKLSNpZmRlZiBERUJVRwotI2lmIDAKLXN0YXRpYyB2b2lkIHBuZ19zYXZlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1aW50OF90ICpiaXRtYXAsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZ2JhX3BhbGV0dGUpCi17Ci0gICAgaW50IHgsIHksIHY7Ci0gICAgRklMRSAqZjsKLSAgICBjaGFyIGZuYW1lWzQwXSwgZm5hbWUyWzQwXTsKLSAgICBjaGFyIGNvbW1hbmRbMTAyNF07Ci0KLSAgICBzbnByaW50ZihmbmFtZSwgNDAsICIlcy5wcG0iLCBmaWxlbmFtZSk7Ci0KLSAgICBmID0gZm9wZW4oZm5hbWUsICJ3Iik7Ci0gICAgaWYgKCFmKSB7Ci0gICAgICAgIHBlcnJvcihmbmFtZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZnByaW50ZihmLCAiUDZcbiIKLSAgICAgICAgICAgICIlZCAlZFxuIgotICAgICAgICAgICAgIiVkXG4iLAotICAgICAgICAgICAgdywgaCwgMjU1KTsKLSAgICBmb3IoeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgZm9yKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgICAgICB2ID0gcmdiYV9wYWxldHRlW2JpdG1hcFt5ICogdyArIHhdXTsKLSAgICAgICAgICAgIHB1dGMoKHYgPj4gMTYpICYgMHhmZiwgZik7Ci0gICAgICAgICAgICBwdXRjKCh2ID4+IDgpICYgMHhmZiwgZik7Ci0gICAgICAgICAgICBwdXRjKCh2ID4+IDApICYgMHhmZiwgZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKGYpOwotCi0KLSAgICBzbnByaW50ZihmbmFtZTIsIDQwLCAiJXMtYS5wZ20iLCBmaWxlbmFtZSk7Ci0KLSAgICBmID0gZm9wZW4oZm5hbWUyLCAidyIpOwotICAgIGlmICghZikgewotICAgICAgICBwZXJyb3IoZm5hbWUyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmcHJpbnRmKGYsICJQNVxuIgotICAgICAgICAgICAgIiVkICVkXG4iCi0gICAgICAgICAgICAiJWRcbiIsCi0gICAgICAgICAgICB3LCBoLCAyNTUpOwotICAgIGZvcih5ID0gMDsgeSA8IGg7IHkrKykgewotICAgICAgICBmb3IoeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgICAgIHYgPSByZ2JhX3BhbGV0dGVbYml0bWFwW3kgKiB3ICsgeF1dOwotICAgICAgICAgICAgcHV0YygodiA+PiAyNCkgJiAweGZmLCBmKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmY2xvc2UoZik7Ci0KLSAgICBzbnByaW50Zihjb21tYW5kLCAxMDI0LCAicG5tdG9wbmcgLWFscGhhICVzICVzID4gJXMucG5nIDI+IC9kZXYvbnVsbCIsIGZuYW1lMiwgZm5hbWUsIGZpbGVuYW1lKTsKLSAgICBzeXN0ZW0oY29tbWFuZCk7Ci0KLSAgICBzbnByaW50Zihjb21tYW5kLCAxMDI0LCAicm0gJXMgJXMiLCBmbmFtZSwgZm5hbWUyKTsKLSAgICBzeXN0ZW0oY29tbWFuZCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgcG5nX3NhdmUyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1aW50MzJfdCAqYml0bWFwLCBpbnQgdywgaW50IGgpCi17Ci0gICAgaW50IHgsIHksIHY7Ci0gICAgRklMRSAqZjsKLSAgICBjaGFyIGZuYW1lWzQwXSwgZm5hbWUyWzQwXTsKLSAgICBjaGFyIGNvbW1hbmRbMTAyNF07Ci0KLSAgICBzbnByaW50ZihmbmFtZSwgc2l6ZW9mKGZuYW1lKSwgIiVzLnBwbSIsIGZpbGVuYW1lKTsKLQotICAgIGYgPSBmb3BlbihmbmFtZSwgInciKTsKLSAgICBpZiAoIWYpIHsKLSAgICAgICAgcGVycm9yKGZuYW1lKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmcHJpbnRmKGYsICJQNlxuIgotICAgICAgICAgICAgIiVkICVkXG4iCi0gICAgICAgICAgICAiJWRcbiIsCi0gICAgICAgICAgICB3LCBoLCAyNTUpOwotICAgIGZvcih5ID0gMDsgeSA8IGg7IHkrKykgewotICAgICAgICBmb3IoeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgICAgIHYgPSBiaXRtYXBbeSAqIHcgKyB4XTsKLSAgICAgICAgICAgIHB1dGMoKHYgPj4gMTYpICYgMHhmZiwgZik7Ci0gICAgICAgICAgICBwdXRjKCh2ID4+IDgpICYgMHhmZiwgZik7Ci0gICAgICAgICAgICBwdXRjKCh2ID4+IDApICYgMHhmZiwgZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKGYpOwotCi0KLSAgICBzbnByaW50ZihmbmFtZTIsIHNpemVvZihmbmFtZTIpLCAiJXMtYS5wZ20iLCBmaWxlbmFtZSk7Ci0KLSAgICBmID0gZm9wZW4oZm5hbWUyLCAidyIpOwotICAgIGlmICghZikgewotICAgICAgICBwZXJyb3IoZm5hbWUyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmcHJpbnRmKGYsICJQNVxuIgotICAgICAgICAgICAgIiVkICVkXG4iCi0gICAgICAgICAgICAiJWRcbiIsCi0gICAgICAgICAgICB3LCBoLCAyNTUpOwotICAgIGZvcih5ID0gMDsgeSA8IGg7IHkrKykgewotICAgICAgICBmb3IoeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgICAgIHYgPSBiaXRtYXBbeSAqIHcgKyB4XTsKLSAgICAgICAgICAgIHB1dGMoKHYgPj4gMjQpICYgMHhmZiwgZik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmNsb3NlKGYpOwotCi0gICAgc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAicG5tdG9wbmcgLWFscGhhICVzICVzID4gJXMucG5nIDI+IC9kZXYvbnVsbCIsIGZuYW1lMiwgZm5hbWUsIGZpbGVuYW1lKTsKLSAgICBzeXN0ZW0oY29tbWFuZCk7Ci0KLSAgICBzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICJybSAlcyAlcyIsIGZuYW1lLCBmbmFtZTIpOwotICAgIHN5c3RlbShjb21tYW5kKTsKLX0KLSNlbmRpZgotCiAjZGVmaW5lIFJHQkEocixnLGIsYSkgKCgodW5zaWduZWQpKGEpIDw8IDI0KSB8ICgocikgPDwgMTYpIHwgKChnKSA8PCA4KSB8IChiKSkKIAogdHlwZWRlZiBzdHJ1Y3QgRFZCU3ViQ0xVVCB7CkBAIC0yMTAsNiArOTYsOSBAQAogICAgIGludCBjbHV0OwogICAgIGludCBiZ2NvbG9yOwogCisgICAgdWludDhfdCBjb21wdXRlZF9jbHV0WzQqMjU2XTsKKyAgICBpbnQgaGFzX2NvbXB1dGVkX2NsdXQ7CisKICAgICB1aW50OF90ICpwYnVmOwogICAgIGludCBidWZfc2l6ZTsKICAgICBpbnQgZGlydHk7CkBAIC03NjEsMTQgKzY1MCwxNCBAQAogICAgIHJldHVybiBwaXhlbHNfcmVhZDsKIH0KIAotc3RhdGljIHZvaWQgY29tcHV0ZV9kZWZhdWx0X2NsdXQoQVZTdWJ0aXRsZVJlY3QgKnJlY3QsIGludCB3LCBpbnQgaCkKK3N0YXRpYyB2b2lkIGNvbXB1dGVfZGVmYXVsdF9jbHV0KHVpbnQ4X3QgKmNsdXQsIEFWU3VidGl0bGVSZWN0ICpyZWN0LCBpbnQgdywgaW50IGgpCiB7CiAgICAgdWludDhfdCBsaXN0WzI1Nl0gPSB7MH07CiAgICAgdWludDhfdCBsaXN0X2ludlsyNTZdOwogICAgIGludCBjb3VudHRhYlsyNTZdID0gezB9OwogICAgIGludCBjb3VudCwgaSwgeCwgeTsKLQotI2RlZmluZSBWKHgseSkgcmVjdC0+ZGF0YVswXVsoeCkgKyAoeSkqcmVjdC0+bGluZXNpemVbMF1dCisgICAgcHRyZGlmZl90IHN0cmlkZSA9IHJlY3QtPmxpbmVzaXplWzBdOworI2RlZmluZSBWKHgseSkgcmVjdC0+ZGF0YVswXVsoeCkgKyAoeSkqc3RyaWRlXQogICAgIGZvciAoeSA9IDA7IHk8aDsgeSsrKSB7CiAgICAgICAgIGZvciAoeCA9IDA7IHg8dzsgeCsrKSB7CiAgICAgICAgICAgICBpbnQgdiA9IFYoeCx5KSArIDE7CkBAIC03NzksNyArNjY4LDcgQEAKICAgICAgICAgICAgIGNvdW50dGFiW3YtMV0gKz0gISEoKHYhPXZsKSArICh2IT12cikgKyAodiE9dnQpICsgKHYhPXZiKSk7CiAgICAgICAgIH0KICAgICB9Ci0jZGVmaW5lIEwoeCx5KSBsaXN0WyByZWN0LT5kYXRhWzBdWyh4KSArICh5KSpyZWN0LT5saW5lc2l6ZVswXV0gXQorI2RlZmluZSBMKHgseSkgbGlzdFtkWyh4KSArICh5KSpzdHJpZGVdXQogCiAgICAgZm9yIChpID0gMDsgaTwyNTY7IGkrKykgewogICAgICAgICBpbnQgc2NvcmV0YWJbMjU2XSA9IHswfTsKQEAgLTc4NywyMCArNjc2LDI0IEBACiAgICAgICAgIGludCBiZXN0diA9IDA7CiAgICAgICAgIGZvciAoeSA9IDA7IHk8aDsgeSsrKSB7CiAgICAgICAgICAgICBmb3IgKHggPSAwOyB4PHc7IHgrKykgewotICAgICAgICAgICAgICAgIGludCB2ID0gcmVjdC0+ZGF0YVswXVt4ICsgeSpyZWN0LT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgdWludDhfdCAqZCA9ICZyZWN0LT5kYXRhWzBdW3ggKyB5KnN0cmlkZV07CisgICAgICAgICAgICAgICAgaW50IHYgPSAqZDsKICAgICAgICAgICAgICAgICBpbnQgbF9tID0gbGlzdFt2XTsKLSAgICAgICAgICAgICAgICBpbnQgbF9sID0geCAgICAgPyBMKHgtMSwgeSkgOiAxOwotICAgICAgICAgICAgICAgIGludCBsX3IgPSB4KzE8dyA/IEwoeCsxLCB5KSA6IDE7Ci0gICAgICAgICAgICAgICAgaW50IGxfdCA9IHkgICAgID8gTCh4LCB5LTEpIDogMTsKLSAgICAgICAgICAgICAgICBpbnQgbF9iID0geSsxPGggPyBMKHgsIHkrMSkgOiAxOwotICAgICAgICAgICAgICAgIGludCBzY29yZTsKKyAgICAgICAgICAgICAgICBpbnQgbF9sID0geCAgICAgPyBMKC0xLCAwKSA6IDE7CisgICAgICAgICAgICAgICAgaW50IGxfciA9IHgrMTx3ID8gTCggMSwgMCkgOiAxOworICAgICAgICAgICAgICAgIGludCBsX3QgPSB5ICAgICA/IEwoIDAsLTEpIDogMTsKKyAgICAgICAgICAgICAgICBpbnQgbF9iID0geSsxPGggPyBMKCAwLCAxKSA6IDE7CiAgICAgICAgICAgICAgICAgaWYgKGxfbSkKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgc2NvcmV0YWJbdl0gKz0gbF9sICsgbF9yICsgbF90ICsgbF9iOwotICAgICAgICAgICAgICAgIHNjb3JlID0gMTAyNExMKnNjb3JldGFiW3ZdIC8gY291bnR0YWJbdl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI1NjsgeCsrKSB7CisgICAgICAgICAgICBpZiAoc2NvcmV0YWJbeF0pIHsKKyAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSAxMDI0TEwqc2NvcmV0YWJbeF0gLyBjb3VudHRhYlt4XTsKICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0c2NvcmUpIHsKICAgICAgICAgICAgICAgICAgICAgYmVzdHNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICAgICAgICAgIGJlc3R2ID0gdjsKKyAgICAgICAgICAgICAgICAgICAgYmVzdHYgPSB4OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODEwLDEwICs3MDMsMTAgQEAKICAgICAgICAgbGlzdF9pbnZbICAgICBpIF0gPSBiZXN0djsKICAgICB9CiAKLSAgICBjb3VudCA9IGkgLSAxOworICAgIGNvdW50ID0gRkZNQVgoaSAtIDEsIDEpOwogICAgIGZvciAoaS0tOyBpPj0wOyBpLS0pIHsKICAgICAgICAgaW50IHYgPSBpKjI1NS9jb3VudDsKLSAgICAgICAgQVZfV04zMihyZWN0LT5kYXRhWzFdICsgNCpsaXN0X2ludltpXSwgUkdCQSh2LzIsdix2LzIsdikpOworICAgICAgICBBVl9XTjMyKGNsdXQgKyA0Kmxpc3RfaW52W2ldLCBSR0JBKHYvMix2LHYvMix2KSk7CiAgICAgfQogfQogCkBAIC04MjcsNyArNzIwLDcgQEAKICAgICBBVlN1YnRpdGxlUmVjdCAqcmVjdDsKICAgICBEVkJTdWJDTFVUICpjbHV0OwogICAgIHVpbnQzMl90ICpjbHV0X3RhYmxlOwotICAgIGludCBpLGo7CisgICAgaW50IGk7CiAgICAgaW50IG9mZnNldF94PTAsIG9mZnNldF95PTA7CiAgICAgaW50IHJldCA9IDA7CiAKQEAgLTg2Myw4ICs3NTYsMTMgQEAKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogCi0gICAgICAgIGZvcihpPTA7IGk8c3ViLT5udW1fcmVjdHM7IGkrKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Yi0+bnVtX3JlY3RzOyBpKyspIHsKICAgICAgICAgICAgIHN1Yi0+cmVjdHNbaV0gPSBhdl9tYWxsb2N6KHNpemVvZigqc3ViLT5yZWN0c1tpXSkpOworICAgICAgICAgICAgaWYgKCFzdWItPnJlY3RzW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIGkgPSAwOwogCkBAIC05MTksMTUgKzgxNywyNCBAQAogCiAgICAgICAgICAgICBtZW1jcHkocmVjdC0+ZGF0YVswXSwgcmVnaW9uLT5wYnVmLCByZWdpb24tPmJ1Zl9zaXplKTsKIAotICAgICAgICAgICAgaWYgKChjbHV0ID09ICZkZWZhdWx0X2NsdXQgJiYgY3R4LT5jb21wdXRlX2NsdXQgPT0gLTEpIHx8IGN0eC0+Y29tcHV0ZV9jbHV0ID09IDEpCi0gICAgICAgICAgICAgICAgY29tcHV0ZV9kZWZhdWx0X2NsdXQocmVjdCwgcmVjdC0+dywgcmVjdC0+aCk7CisgICAgICAgICAgICBpZiAoKGNsdXQgPT0gJmRlZmF1bHRfY2x1dCAmJiBjdHgtPmNvbXB1dGVfY2x1dCA9PSAtMSkgfHwgY3R4LT5jb21wdXRlX2NsdXQgPT0gMSkgeworICAgICAgICAgICAgICAgIGlmICghcmVnaW9uLT5oYXNfY29tcHV0ZWRfY2x1dCkgeworICAgICAgICAgICAgICAgICAgICBjb21wdXRlX2RlZmF1bHRfY2x1dChyZWdpb24tPmNvbXB1dGVkX2NsdXQsIHJlY3QsIHJlY3QtPncsIHJlY3QtPmgpOworICAgICAgICAgICAgICAgICAgICByZWdpb24tPmhhc19jb21wdXRlZF9jbHV0ID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZW1jcHkocmVjdC0+ZGF0YVsxXSwgcmVnaW9uLT5jb21wdXRlZF9jbHV0LCBzaXplb2YocmVnaW9uLT5jb21wdXRlZF9jbHV0KSk7CisgICAgICAgICAgICB9CiAKICNpZiBGRl9BUElfQVZQSUNUVVJFCiBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCit7CisgICAgICAgICAgICBpbnQgajsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKICAgICAgICAgICAgICAgICByZWN0LT5waWN0LmRhdGFbal0gPSByZWN0LT5kYXRhW2pdOwogICAgICAgICAgICAgICAgIHJlY3QtPnBpY3QubGluZXNpemVbal0gPSByZWN0LT5saW5lc2l6ZVtqXTsKICAgICAgICAgICAgIH0KK30KIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogI2VuZGlmCiAKQEAgLTEwNjYsNiArOTczLDcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHJlZ2lvbi0+aGFzX2NvbXB1dGVkX2NsdXQgPSAwOwogfQogCiBzdGF0aWMgaW50IGR2YnN1Yl9wYXJzZV9vYmplY3Rfc2VnbWVudChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCkBAIC0xMjE0LDkgKzExMjIsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGRlcHRoICYgMHg4MCkKKyAgICAgICAgaWYgKGRlcHRoICYgMHg4MCAmJiBlbnRyeV9pZCA8IDQpCiAgICAgICAgICAgICBjbHV0LT5jbHV0NFtlbnRyeV9pZF0gPSBSR0JBKHIsZyxiLDI1NSAtIGFscGhhKTsKLSAgICAgICAgZWxzZSBpZiAoZGVwdGggJiAweDQwKQorICAgICAgICBlbHNlIGlmIChkZXB0aCAmIDB4NDAgJiYgZW50cnlfaWQgPCAxNikKICAgICAgICAgICAgIGNsdXQtPmNsdXQxNltlbnRyeV9pZF0gPSBSR0JBKHIsZyxiLDI1NSAtIGFscGhhKTsKICAgICAgICAgZWxzZSBpZiAoZGVwdGggJiAweDIwKQogICAgICAgICAgICAgY2x1dC0+Y2x1dDI1NltlbnRyeV9pZF0gPSBSR0JBKHIsZyxiLDI1NSAtIGFscGhhKTsKQEAgLTEyMzksNiArMTE0Nyw3IEBACiAgICAgRFZCU3ViT2JqZWN0ICpvYmplY3Q7CiAgICAgRFZCU3ViT2JqZWN0RGlzcGxheSAqZGlzcGxheTsKICAgICBpbnQgZmlsbDsKKyAgICBpbnQgcmV0OwogCiAgICAgaWYgKGJ1Zl9zaXplIDwgMTApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtMTI2Nyw2ICsxMTc2LDE2IEBACiAgICAgcmVnaW9uLT5oZWlnaHQgPSBBVl9SQjE2KGJ1Zik7CiAgICAgYnVmICs9IDI7CiAKKyAgICByZXQgPSBhdl9pbWFnZV9jaGVja19zaXplMihyZWdpb24tPndpZHRoLCByZWdpb24tPmhlaWdodCwgYXZjdHgtPm1heF9waXhlbHMsIEFWX1BJWF9GTVRfUEFMOCwgMCwgYXZjdHgpOworICAgIGlmIChyZXQgPj0gMCAmJiByZWdpb24tPndpZHRoICogcmVnaW9uLT5oZWlnaHQgKiAyID4gMzIwICogMTAyNCAqIDgpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQaXhlbCBidWZmZXIgbWVtb3J5IGNvbnN0cmFpbnQgdmlvbGF0ZWRcbiIpOworICAgIH0KKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZWdpb24tPndpZHRoPSByZWdpb24tPmhlaWdodD0gMDsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKICAgICBpZiAocmVnaW9uLT53aWR0aCAqIHJlZ2lvbi0+aGVpZ2h0ICE9IHJlZ2lvbi0+YnVmX3NpemUpIHsKICAgICAgICAgYXZfZnJlZShyZWdpb24tPnBidWYpOwogCkBAIC0xMzQyLDYgKzEyNjEsMTMgQEAKICAgICAgICAgZGlzcGxheS0+eV9wb3MgPSBBVl9SQjE2KGJ1ZikgJiAweGZmZjsKICAgICAgICAgYnVmICs9IDI7CiAKKyAgICAgICAgaWYgKGRpc3BsYXktPnhfcG9zID49IHJlZ2lvbi0+d2lkdGggfHwKKyAgICAgICAgICAgIGRpc3BsYXktPnlfcG9zID49IHJlZ2lvbi0+aGVpZ2h0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9iamVjdCBvdXRzaWRlIHJlZ2lvblxuIik7CisgICAgICAgICAgICBhdl9mcmVlKGRpc3BsYXkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoKG9iamVjdC0+dHlwZSA9PSAxIHx8IG9iamVjdC0+dHlwZSA9PSAyKSAmJiBidWYrMSA8IGJ1Zl9lbmQpIHsKICAgICAgICAgICAgIGRpc3BsYXktPmZnY29sb3IgPSAqYnVmKys7CiAgICAgICAgICAgICBkaXNwbGF5LT5iZ2NvbG9yID0gKmJ1ZisrOwpAQCAtMTQwMiw2ICsxMzI4LDE1IEBACiAgICAgICAgIHJlZ2lvbl9pZCA9ICpidWYrKzsKICAgICAgICAgYnVmICs9IDE7CiAKKyAgICAgICAgZGlzcGxheSA9IGN0eC0+ZGlzcGxheV9saXN0OworICAgICAgICB3aGlsZSAoZGlzcGxheSAmJiBkaXNwbGF5LT5yZWdpb25faWQgIT0gcmVnaW9uX2lkKSB7CisgICAgICAgICAgICBkaXNwbGF5ID0gZGlzcGxheS0+bmV4dDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlzcGxheSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkdXBsaWNhdGUgcmVnaW9uXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGlzcGxheSA9IHRtcF9kaXNwbGF5X2xpc3Q7CiAgICAgICAgIHRtcF9wdHIgPSAmdG1wX2Rpc3BsYXlfbGlzdDsKIApAQCAtMTQ0NCw2ICsxMzc5LDY3IEBACiAKIAogI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBwbmdfc2F2ZShEVkJTdWJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1aW50MzJfdCAqYml0bWFwLCBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHgsIHksIHY7CisgICAgRklMRSAqZjsKKyAgICBjaGFyIGZuYW1lWzQwXSwgZm5hbWUyWzQwXTsKKyAgICBjaGFyIGNvbW1hbmRbMTAyNF07CisKKyAgICBzbnByaW50ZihmbmFtZSwgc2l6ZW9mKGZuYW1lKSwgIiVzLnBwbSIsIGZpbGVuYW1lKTsKKworICAgIGYgPSBmb3BlbihmbmFtZSwgInciKTsKKyAgICBpZiAoIWYpIHsKKyAgICAgICAgcGVycm9yKGZuYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcHJpbnRmKGYsICJQNlxuIgorICAgICAgICAgICAgIiVkICVkXG4iCisgICAgICAgICAgICAiJWRcbiIsCisgICAgICAgICAgICB3LCBoLCAyNTUpOworICAgIGZvcih5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIHYgPSBiaXRtYXBbeSAqIHcgKyB4XTsKKyAgICAgICAgICAgIHB1dGMoKHYgPj4gMTYpICYgMHhmZiwgZik7CisgICAgICAgICAgICBwdXRjKCh2ID4+IDgpICYgMHhmZiwgZik7CisgICAgICAgICAgICBwdXRjKCh2ID4+IDApICYgMHhmZiwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGYpOworCisKKyAgICBzbnByaW50ZihmbmFtZTIsIHNpemVvZihmbmFtZTIpLCAiJXMtYS5wZ20iLCBmaWxlbmFtZSk7CisKKyAgICBmID0gZm9wZW4oZm5hbWUyLCAidyIpOworICAgIGlmICghZikgeworICAgICAgICBwZXJyb3IoZm5hbWUyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmcHJpbnRmKGYsICJQNVxuIgorICAgICAgICAgICAgIiVkICVkXG4iCisgICAgICAgICAgICAiJWRcbiIsCisgICAgICAgICAgICB3LCBoLCAyNTUpOworICAgIGZvcih5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIHYgPSBiaXRtYXBbeSAqIHcgKyB4XTsKKyAgICAgICAgICAgIHB1dGMoKHYgPj4gMjQpICYgMHhmZiwgZik7CisgICAgICAgIH0KKyAgICB9CisgICAgZmNsb3NlKGYpOworCisgICAgc25wcmludGYoY29tbWFuZCwgc2l6ZW9mKGNvbW1hbmQpLCAicG5tdG9wbmcgLWFscGhhICVzICVzID4gJXMucG5nIDI+IC9kZXYvbnVsbCIsIGZuYW1lMiwgZm5hbWUsIGZpbGVuYW1lKTsKKyAgICBpZiAoc3lzdGVtKGNvbW1hbmQpICE9IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcnVubmluZyBwbm10b3BuZ1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICJybSAlcyAlcyIsIGZuYW1lLCBmbmFtZTIpOworICAgIGlmIChzeXN0ZW0oY29tbWFuZCkgIT0gMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciByZW1vdmluZyAlcyBhbmQgJXNcbiIsIGZuYW1lLCBmbmFtZTIpOworICAgICAgICByZXR1cm47CisgICAgfQorfQorCiBzdGF0aWMgaW50IHNhdmVfZGlzcGxheV9zZXQoRFZCU3ViQ29udGV4dCAqY3R4KQogewogICAgIERWQlN1YlJlZ2lvbiAqcmVnaW9uOwpAQCAtMTUzNyw3ICsxNTMzLDcgQEAKIAogICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgImR2YnMuJWQiLCBmaWxlbm9faW5kZXgpOwogCi0gICAgICAgIHBuZ19zYXZlMihmaWxlbmFtZSwgcGJ1Ziwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIHBuZ19zYXZlKGN0eCwgZmlsZW5hbWUsIHBidWYsIHdpZHRoLCBoZWlnaHQpOwogCiAgICAgICAgIGF2X2ZyZWVwKCZwYnVmKTsKICAgICB9CkBAIC0xNTQ1LDcgKzE1NDEsNyBAQAogICAgIGZpbGVub19pbmRleCsrOwogICAgIHJldHVybiAwOwogfQotI2VuZGlmCisjZW5kaWYgLyogREVCVUcgKi8KIAogc3RhdGljIGludCBkdmJzdWJfcGFyc2VfZGlzcGxheV9kZWZpbml0aW9uX3NlZ21lbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kdmJ0eHQuaCBiL2xpYmF2Y29kZWMvZHZidHh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4OGZjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZHZidHh0LmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIERWQiB0ZWxldGV4dCBjb21tb24gZnVuY3Rpb25zLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfRFZCVFhUX0gKKyNkZWZpbmUgQVZDT0RFQ19EVkJUWFRfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworLyogUmV0dXJucyB0cnVlIGlmIGRhdGEgaWRlbnRpZmllciBtYXRjaGVzIGEgdGVsZXRleHQgc3RyZWFtIGFjY29yZGluZyB0byBFTgorICogMzAxIDc3NSBzZWN0aW9uIDQuNC4yICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZmZfZGF0YV9pZGVudGlmaWVyX2lzX3RlbGV0ZXh0KGludCBkYXRhX2lkZW50aWZpZXIpCit7CisgICAgcmV0dXJuIChkYXRhX2lkZW50aWZpZXIgPj0gMHgxMCAmJiBkYXRhX2lkZW50aWZpZXIgPD0gMHgxRiB8fAorICAgICAgICAgICAgZGF0YV9pZGVudGlmaWVyID49IDB4OTkgJiYgZGF0YV9pZGVudGlmaWVyIDw9IDB4OUIpOworfQorCisvKiBSZXR1cm5zIHRydWUgaWYgZGF0YSB1bml0IGlkIG1hdGNoZXMgRUJVIHRlbGV0ZXh0IGRhdGEgYWNjb3JkaW5nIHRvCisgKiBFTiAzMDEgNzc1IHNlY3Rpb24gNC40LjIgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBmZl9kYXRhX3VuaXRfaWRfaXNfdGVsZXRleHQoaW50IGRhdGFfdW5pdF9pZCkKK3sKKyAgICByZXR1cm4gKGRhdGFfdW5pdF9pZCA9PSAweDAyIHx8IGRhdGFfdW5pdF9pZCA9PSAweDAzKTsKK30KKworI2VuZGlmIC8qIEFWQ09ERUNfRFZCVFhUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHZkZWMuYyBiL2xpYmF2Y29kZWMvZHZkZWMuYwppbmRleCAwYjRjMWJjLi43YjE2Nzg3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2R2ZGVjLmMKKysrIGIvbGliYXZjb2RlYy9kdmRlYy5jCkBAIC01NCw3ICs1NCw3IEBACiAgICAgY29uc3QgdWludDMyX3QgKmZhY3Rvcl90YWJsZTsKICAgICBjb25zdCB1aW50OF90ICpzY2FuX3RhYmxlOwogICAgIHVpbnQ4X3QgcG9zOyAvKiBwb3NpdGlvbiBpbiBibG9jayAqLwotICAgIHZvaWQgKCppZGN0X3B1dCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCppZGN0X3B1dCkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOwogICAgIHVpbnQ4X3QgcGFydGlhbF9iaXRfY291bnQ7CiAgICAgdWludDMyX3QgcGFydGlhbF9iaXRfYnVmZmVyOwogICAgIGludCBzaGlmdF9vZmZzZXQ7CkBAIC0yMjIsOCArMjIyLDggQEAKIAogICAgIC8qIGdldCB0aGUgQUMgY29lZmZpY2llbnRzIHVudGlsIGxhc3RfaW5kZXggaXMgcmVhY2hlZCAqLwogICAgIGZvciAoOzspIHsKLSAgICAgICAgZmZfZGxvZyhOVUxMLCAiJTJkOiBiaXRzPSUwNHggaW5kZXg9JWRcbiIsIHBvcywgU0hPV19VQklUUyhyZSwgZ2IsIDE2KSwKLSAgICAgICAgICAgICAgICByZV9pbmRleCk7CisgICAgICAgIGZmX2Rsb2coTlVMTCwgIiUyZDogYml0cz0lMDQiUFJJeDMyIiBpbmRleD0ldVxuIiwKKyAgICAgICAgICAgICAgICBwb3MsIFNIT1dfVUJJVFMocmUsIGdiLCAxNiksIHJlX2luZGV4KTsKICAgICAgICAgLyogb3VyIG93biBvcHRpbWl6ZWQgR0VUX1JMX1ZMQyAqLwogICAgICAgICBpbmRleCAgID0gTkVHX1VTUjMyKHJlX2NhY2hlLCBURVhfVkxDX0JJVFMpOwogICAgICAgICB2bGNfbGVuID0gZmZfZHZfcmxfdmxjW2luZGV4XS5sZW47CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2R2ZHN1Yl9wYXJzZXIuYyBiL2xpYmF2Y29kZWMvZHZkc3ViX3BhcnNlci5jCmluZGV4IDMyYTk0NWUuLjY5OGNjYjYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZHZkc3ViX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvZHZkc3ViX3BhcnNlci5jCkBAIC00NCw2ICs0NCw5IEBACiB7CiAgICAgRFZEU3ViUGFyc2VDb250ZXh0ICpwYyA9IHMtPnByaXZfZGF0YTsKIAorICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworCiAgICAgaWYgKHBjLT5wYWNrZXRfaW5kZXggPT0gMCkgewogICAgICAgICBpZiAoYnVmX3NpemUgPCAyIHx8IEFWX1JCMTYoYnVmKSAmJiBidWZfc2l6ZSA8IDYpIHsKICAgICAgICAgICAgIGlmIChidWZfc2l6ZSkKQEAgLTU0LDcgKzU3LDExIEBACiAgICAgICAgIGlmIChwYy0+cGFja2V0X2xlbiA9PSAwKSAvKiBIRC1EVkQgc3VicGljdHVyZSBwYWNrZXQgKi8KICAgICAgICAgICAgIHBjLT5wYWNrZXRfbGVuID0gQVZfUkIzMihidWYrMik7CiAgICAgICAgIGF2X2ZyZWVwKCZwYy0+cGFja2V0KTsKLSAgICAgICAgcGMtPnBhY2tldCA9IGF2X21hbGxvYyhwYy0+cGFja2V0X2xlbik7CisgICAgICAgIGlmICgodW5zaWduZWQpcGMtPnBhY2tldF9sZW4gPiBJTlRfTUFYIC0gQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWNrZXQgbGVuZ3RoICVkIGlzIGludmFsaWRcbiIsIHBjLT5wYWNrZXRfbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBwYy0+cGFja2V0ID0gYXZfbWFsbG9jKHBjLT5wYWNrZXRfbGVuICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CiAgICAgfQogICAgIGlmIChwYy0+cGFja2V0KSB7CiAgICAgICAgIGlmIChwYy0+cGFja2V0X2luZGV4ICsgYnVmX3NpemUgPD0gcGMtPnBhY2tldF9sZW4pIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHZkc3ViZGVjLmMgYi9saWJhdmNvZGVjL2R2ZHN1YmRlYy5jCmluZGV4IDE5ZjI1ZjAuLmNmMTA4NDQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZHZkc3ViZGVjLmMKKysrIGIvbGliYXZjb2RlYy9kdmRzdWJkZWMuYwpAQCAtNjAsNyArNjAsNyBAQAogICAgICAgICBjYiA9ICp5Y2JjcisrOwogICAgICAgICBZVVZfVE9fUkdCMV9DQ0lSKGNiLCBjcik7CiAgICAgICAgIFlVVl9UT19SR0IyX0NDSVIociwgZywgYiwgeSk7Ci0gICAgICAgICpyZ2JhKysgPSAoKmFscGhhKysgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworICAgICAgICAqcmdiYSsrID0gKCh1bnNpZ25lZCkqYWxwaGErKyA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7CiAgICAgfQogfQogCkBAIC04MiwxMCArODIsNyBAQAogewogICAgIGludCBsZW47CiAgICAgaW50IGhhc19ydW4gPSBnZXRfYml0czEoZ2IpOwotICAgIGlmIChnZXRfYml0czEoZ2IpKQotICAgICAgICAqY29sb3IgPSBnZXRfYml0cyhnYiwgOCk7Ci0gICAgZWxzZQotICAgICAgICAqY29sb3IgPSBnZXRfYml0cyhnYiwgMik7CisgICAgKmNvbG9yID0gZ2V0X2JpdHMoZ2IsIDIgKyA2KmdldF9iaXRzMShnYikpOwogICAgIGlmIChoYXNfcnVuKSB7CiAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CiAgICAgICAgICAgICBsZW4gPSBnZXRfYml0cyhnYiwgNyk7CkBAIC0xMjcsNiArMTI0LDggQEAKICAgICAgICAgICAgIGxlbiA9IGRlY29kZV9ydW5fOGJpdCgmZ2IsICZjb2xvcik7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGxlbiA9IGRlY29kZV9ydW5fMmJpdCgmZ2IsICZjb2xvcik7CisgICAgICAgIGlmIChsZW4gIT0gSU5UX01BWCAmJiBsZW4gPiB3IC0geCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBsZW4gPSBGRk1JTihsZW4sIHcgLSB4KTsKICAgICAgICAgbWVtc2V0KGQgKyB4LCBjb2xvciwgbGVuKTsKICAgICAgICAgeCArPSBsZW47CkBAIC0xODUsMTYgKzE4NCwxNiBAQAogICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICBpZiAoYWxwaGFbaV0gIT0gMCkgewogICAgICAgICAgICAgaWYgKCFjb2xvcl91c2VkW2NvbG9ybWFwW2ldXSkgIHsKLSAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsX21hcFtuYl9vcGFxdWVfY29sb3JzXVtqXTsKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsX21hcFtuYl9vcGFxdWVfY29sb3JzIC0gMV1bal07CiAgICAgICAgICAgICAgICAgciA9ICgoKHN1YnRpdGxlX2NvbG9yID4+IDE2KSAmIDB4ZmYpICogbGV2ZWwpID4+IDg7CiAgICAgICAgICAgICAgICAgZyA9ICgoKHN1YnRpdGxlX2NvbG9yID4+IDgpICYgMHhmZikgKiBsZXZlbCkgPj4gODsKICAgICAgICAgICAgICAgICBiID0gKCgoc3VidGl0bGVfY29sb3IgPj4gMCkgJiAweGZmKSAqIGxldmVsKSA+PiA4OwotICAgICAgICAgICAgICAgIHJnYmFfcGFsZXR0ZVtpXSA9IGIgfCAoZyA8PCA4KSB8IChyIDw8IDE2KSB8ICgoYWxwaGFbaV0gKiAxNykgPDwgMjQpOworICAgICAgICAgICAgICAgIHJnYmFfcGFsZXR0ZVtpXSA9IGIgfCAoZyA8PCA4KSB8IChyIDw8IDE2KSB8ICgoYWxwaGFbaV0gKiAxN1UpIDw8IDI0KTsKICAgICAgICAgICAgICAgICBjb2xvcl91c2VkW2NvbG9ybWFwW2ldXSA9IChpICsgMSk7CiAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZ2JhX3BhbGV0dGVbaV0gPSAocmdiYV9wYWxldHRlW2NvbG9yX3VzZWRbY29sb3JtYXBbaV1dIC0gMV0gJiAweDAwZmZmZmZmKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGFscGhhW2ldICogMTcpIDw8IDI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYWxwaGFbaV0gKiAxN1UpIDw8IDI0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM2OCw3ICszNjcsNyBAQAogICAgICAgICAgICAgaCA9IHkyIC0geTEgKyAxOwogICAgICAgICAgICAgaWYgKGggPCAwKQogICAgICAgICAgICAgICAgIGggPSAwOwotICAgICAgICAgICAgaWYgKHcgPiAwICYmIGggPiAwKSB7CisgICAgICAgICAgICBpZiAodyA+IDAgJiYgaCA+IDEpIHsKICAgICAgICAgICAgICAgICByZXNldF9yZWN0cyhzdWJfaGVhZGVyKTsKIAogICAgICAgICAgICAgICAgIHN1Yl9oZWFkZXItPnJlY3RzID0gYXZfbWFsbG9jeihzaXplb2YoKnN1Yl9oZWFkZXItPnJlY3RzKSk7CkBAIC01NDgsNyArNTQ3LDggQEAKIHsKICAgICBEVkRTdWJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogCi0gICAgaWYgKGN0eC0+YnVmX3NpemUgPj0gc2l6ZW9mKGN0eC0+YnVmKSAtIGJ1Zl9zaXplKSB7CisgICAgYXZfYXNzZXJ0MChidWZfc2l6ZSA+PSAwICYmIGN0eC0+YnVmX3NpemUgPD0gc2l6ZW9mKGN0eC0+YnVmKSk7CisgICAgaWYgKGJ1Zl9zaXplID49IHNpemVvZihjdHgtPmJ1ZikgLSBjdHgtPmJ1Zl9zaXplKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJBdHRlbXB0IHRvIHJlY29uc3RydWN0ICIKICAgICAgICAgICAgICAgICJ0b28gbGFyZ2UgU1BVIHBhY2tldHMgYWJvcnRlZC5cbiIpOwogICAgICAgICBjdHgtPmJ1Zl9zaXplID0gMDsKQEAgLTc0Niw3ICs3NDYsNyBAQAogICAgICAgICBpbnQgaTsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJwYWxldHRlOiIpOwogICAgICAgICBmb3IoaT0wO2k8MTY7aSsrKQotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgMHglMDZ4IiwgY3R4LT5wYWxldHRlW2ldKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiIDB4JTA2IlBSSXgzMiwgY3R4LT5wYWxldHRlW2ldKTsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9kdmRzdWJlbmMuYyBiL2xpYmF2Y29kZWMvZHZkc3ViZW5jLmMKaW5kZXggMjllMDMyMi4uMjZhZmRjNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kdmRzdWJlbmMuYworKysgYi9saWJhdmNvZGVjL2R2ZHN1YmVuYy5jCkBAIC0zNDMsNyArMzQzLDcgQEAKIAogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU2VsZWN0ZWQgcGFsZXR0ZToiKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAweCUwNnhAQCUwMnggKDB4JXgsMHgleCkiLAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAweCUwNiJQUkl4MzIiQEAlMDJ4ICgweCV4LDB4JXgpIiwKICAgICAgICAgICAgICAgIGR2ZGMtPmdsb2JhbF9wYWxldHRlW291dF9wYWxldHRlW2ldXSwgb3V0X2FscGhhW2ldLAogICAgICAgICAgICAgICAgb3V0X3BhbGV0dGVbaV0sIG91dF9hbHBoYVtpXSA+PiA0KTsKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2R2ZW5jLmMgYi9saWJhdmNvZGVjL2R2ZW5jLmMKaW5kZXggNWRlMTJjYy4uY2UyZmM3NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9kdmVuYy5jCisrKyBiL2xpYmF2Y29kZWMvZHZlbmMuYwpAQCAtMTcsNiArMTcsOCBAQAogICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqIHF1YW50X2RlYWR6b25lIGNvZGUgYW5kIGZpeGVzIHNwb25zb3JlZCBieSBOT0EgR21iSAogICovCiAKIC8qKgpAQCAtMjcsNiArMjksOCBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKQEAgLTM1LDYgKzM5LDcgQEAKICNpbmNsdWRlICJkdl90YWJsZWdlbi5oIgogI2luY2x1ZGUgImZkY3Rkc3AuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJtZV9jbXAuaCIKICNpbmNsdWRlICJwaXhibG9ja2RzcC5oIgogI2luY2x1ZGUgInB1dF9iaXRzLmgiCkBAIC0yMDIsNyArMjA3LDcgQEAKIH0KIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGR2X2d1ZXNzX2RjdF9tb2RlKERWVmlkZW9Db250ZXh0ICpzLCB1aW50OF90ICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemUpCiB7CiAgICAgaWYgKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfSU5URVJMQUNFRF9EQ1QpIHsKICAgICAgICAgaW50IHBzID0gcy0+aWxkY3RfY21wKE5VTEwsIGRhdGEsIE5VTEwsIGxpbmVzaXplLCA4KSAtIDQwMDsKQEAgLTIzOSw4ICsyNDQsOCBAQAogfTsKIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGR2X2luaXRfZW5jX2Jsb2NrKEVuY0Jsb2NrSW5mbyAqYmksIHVpbnQ4X3QgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBEVlZpZGVvQ29udGV4dCAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlhcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFZWaWRlb0NvbnRleHQgKnMsIGludCBiaWFzKQogewogICAgIGNvbnN0IGludCAqd2VpZ2h0OwogICAgIGNvbnN0IHVpbnQ4X3QgKnppZ3phZ19zY2FuOwpAQCAtMjYzLDYgKzI2OCw4IEBACiAjZW5kaWYKICAgICBpbnQgbWF4ICA9IGNsYXNzZXNbMF07CiAgICAgaW50IHByZXYgPSAwOworICAgIGNvbnN0IHVuc2lnbmVkIGRlYWR6b25lID0gcy0+cXVhbnRfZGVhZHpvbmU7CisgICAgY29uc3QgdW5zaWduZWQgdGhyZXNob2xkID0gMiAqIGRlYWR6b25lOwogCiAgICAgYXZfYXNzZXJ0MigoKChpbnQpIGJsaykgJiAxNSkgPT0gMCk7CiAKQEAgLTI5NSwxMyArMzAyLDE1IEBACiAgICAgICAgIGZvciAoaSA9IG1iX2FyZWFfc3RhcnRbYXJlYV07IGkgPCBtYl9hcmVhX3N0YXJ0W2FyZWEgKyAxXTsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBibGtbemlnemFnX3NjYW5baV1dOwogCi0gICAgICAgICAgICBpZiAobGV2ZWwgKyAxNSA+IDMwVSkgeworICAgICAgICAgICAgaWYgKGxldmVsICsgZGVhZHpvbmUgPiB0aHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgICBiaS0+c2lnbltpXSA9IChsZXZlbCA+PiAzMSkgJiAxOwogICAgICAgICAgICAgICAgIC8qIFdlaWdodCBpdCBhbmQgc2hpZnQgZG93biBpbnRvIHJhbmdlLCBhZGRpbmcgZm9yIHJvdW5kaW5nLgogICAgICAgICAgICAgICAgICAqIFRoZSBleHRyYSBkaXZpc2lvbiBieSBhIGZhY3RvciBvZiAyXjQgcmV2ZXJzZXMgdGhlIDh4CiAgICAgICAgICAgICAgICAgICogZXhwYW5zaW9uIG9mIHRoZSBEQ1QgQU5EIHRoZSAyeCBkb3VibGluZyBvZiB0aGUgd2VpZ2h0cy4gKi8KICAgICAgICAgICAgICAgICBsZXZlbCAgICAgPSAoRkZBQlMobGV2ZWwpICogd2VpZ2h0W2ldICsgKDEgPDwgKGR2X3dlaWdodF9iaXRzICsgMykpKSA+PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkdl93ZWlnaHRfYml0cyArIDQpOworICAgICAgICAgICAgICAgIGlmICghbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGJpLT5tYltpXSA9IGxldmVsOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heCkKICAgICAgICAgICAgICAgICAgICAgbWF4ID0gbGV2ZWw7CkBAIC00MTgsNyArNDI3LDggQEAKICAgICBEVlZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgRFZ3b3JrX2NodW5rICp3b3JrX2NodW5rID0gYXJnOwogICAgIGludCBtYl9pbmRleCwgaSwgajsKLSAgICBpbnQgbWJfeCwgbWJfeSwgY19vZmZzZXQsIGxpbmVzaXplLCB5X3N0cmlkZTsKKyAgICBpbnQgbWJfeCwgbWJfeSwgY19vZmZzZXQ7CisgICAgcHRyZGlmZl90IGxpbmVzaXplLCB5X3N0cmlkZTsKICAgICB1aW50OF90ICp5X3B0cjsKICAgICB1aW50OF90ICpkaWY7CiAgICAgTE9DQUxfQUxJR05FRF84KHVpbnQ4X3QsIHNjcmF0Y2gsIFsxMjhdKTsKQEAgLTc0Myw2ICs3NTMsMjAgQEAKICAgICByZXR1cm4gMDsKIH0KIAorI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihEVlZpZGVvQ29udGV4dCwgeCkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkdl9vcHRpb25zW10gPSB7CisgICAgeyAicXVhbnRfZGVhZHpvbmUiLCAgICAgICAgIlF1YW50aXplciBkZWFkIHpvbmUiLCAgICBPRkZTRVQocXVhbnRfZGVhZHpvbmUpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDcgfSwgMCwgMTAyNCwgVkUgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGR2dmlkZW9fZW5jb2RlX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImR2dmlkZW8gZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGR2X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCiBBVkNvZGVjIGZmX2R2dmlkZW9fZW5jb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAiZHZ2aWRlbyIsCiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRWIChEaWdpdGFsIFZpZGVvKSIpLApAQCAtNzU2LDQgKzc4MCw1IEBACiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfTk9ORQogICAgIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmR2dmlkZW9fZW5jb2RlX2NsYXNzLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHh0b3J5LmMgYi9saWJhdmNvZGVjL2R4dG9yeS5jCmluZGV4IGZjMTkzNjkuLjI4NWNhMzggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZHh0b3J5LmMKKysrIGIvbGliYXZjb2RlYy9keHRvcnkuYwpAQCAtMjIsMTQgKzIyLDE1IEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwogI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAidW5hcnkuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogCiBzdGF0aWMgaW50IGR4dG9yeV9kZWNvZGVfdjFfcmdiKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSwKQEAgLTIwMCwxMiArMjAxLDEyIEBACiAKICAgICBpZiAoc2xpY2Vfc2l6ZSA+IHNyY19zaXplIC0gb2ZmKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgImludmFsaWQgc2xpY2Ugc2l6ZSAlIlBSSXUzMiIgKG9ubHkgJSJQUkl1MzIiIGJ5dGVzIGxlZnQpXG4iLAorICAgICAgICAgICAgICAgImludmFsaWQgc2xpY2Ugc2l6ZSAlZCAob25seSAlZCBieXRlcyBsZWZ0KVxuIiwKICAgICAgICAgICAgICAgIHNsaWNlX3NpemUsIHNyY19zaXplIC0gb2ZmKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogICAgIGlmIChzbGljZV9zaXplIDw9IDE2KSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzbGljZSBzaXplICUiUFJJdTMyIlxuIiwKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHNsaWNlIHNpemUgJWRcbiIsCiAgICAgICAgICAgICAgICBzbGljZV9zaXplKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtMjEzLDcgKzIxNCw3IEBACiAgICAgY3VyX3NsaWNlX3NpemUgPSBBVl9STDMyKHNyYyArIG9mZik7CiAgICAgaWYgKGN1cl9zbGljZV9zaXplICE9IHNsaWNlX3NpemUgLSAxNikgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJTbGljZSBzaXplcyBtaXNtYXRjaDogZ290ICUiUFJJdTMyIiBpbnN0ZWFkIG9mICUiUFJJdTMyIlxuIiwKKyAgICAgICAgICAgICAgICJTbGljZSBzaXplcyBtaXNtYXRjaDogZ290ICVkIGluc3RlYWQgb2YgJWRcbiIsCiAgICAgICAgICAgICAgICBjdXJfc2xpY2Vfc2l6ZSwgc2xpY2Vfc2l6ZSAtIDE2KTsKICAgICB9CiAKQEAgLTMwNCwxMSArMzA1LDcgQEAKICAgICB9CiAKICAgICBpZiAoYXZjdHgtPmhlaWdodCAtIGxpbmUpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwKLSAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIHNsaWNlIGRhdGEgYXZhaWxhYmxlLCAiCi0gICAgICAgICAgICAgICAiY3JvcHBpbmcgdGhlIGZyYW1lIGJ5ICVkIHBpeGVsc1xuIiwKLSAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0IC0gbGluZSk7Ci0gICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBsaW5lOworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJOb3QgZW5vdWdoIHNsaWNlIGRhdGEgYXZhaWxhYmxlIik7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0zMjUsNyArMzIyLDcgQEAKICAgICBpbnQgc3RyaWRlICAgPSBmcmFtZS0+bGluZXNpemVbMF07CiAgICAgdWludDhfdCAqZHN0ID0gZnJhbWUtPmRhdGFbMF0gKyBzdHJpZGUgKiBsaW5lOwogCi0gICAgZm9yICh5ID0gMDsgeSA8IGxlZnQgJiYgZ2V0X2JpdHNfbGVmdChnYikgPiAxNjsgeSsrKSB7CisgICAgZm9yICh5ID0gMDsgeSA8IGxlZnQgJiYgZ2V0X2JpdHNfbGVmdChnYikgPiA2ICogd2lkdGg7IHkrKykgewogICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewogICAgICAgICAgICAgYiA9IGRlY29kZV9zeW1fNTY1KGdiLCBscnVbMF0sIDUpOwogICAgICAgICAgICAgZyA9IGRlY29kZV9zeW1fNTY1KGdiLCBscnVbMV0sIGlzXzU2NSA/IDYgOiA1KTsKQEAgLTM5MSw3ICszODgsNyBAQAogICAgIGludCBzdHJpZGUgICA9IGZyYW1lLT5saW5lc2l6ZVswXTsKICAgICB1aW50OF90ICpkc3QgPSBmcmFtZS0+ZGF0YVswXSArIHN0cmlkZSAqIGxpbmU7CiAKLSAgICBmb3IgKHkgPSAwOyB5IDwgbGVmdCAmJiBnZXRfYml0c19sZWZ0KGdiKSA+IDE2OyB5KyspIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgbGVmdCAmJiBnZXRfYml0c19sZWZ0KGdiKSA+IDYgKiB3aWR0aDsgeSsrKSB7CiAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICAgICBkc3RbeCAqIDMgKyAwXSA9IGRlY29kZV9zeW0oZ2IsIGxydVswXSk7CiAgICAgICAgICAgICBkc3RbeCAqIDMgKyAxXSA9IGRlY29kZV9zeW0oZ2IsIGxydVsxXSk7CkBAIC00MzYsNyArNDMzLDcgQEAKICAgICB1aW50OF90ICpVICA9IGZyYW1lLT5kYXRhWzFdICsgKHVzdHJpZGUgPj4gMikgKiBsaW5lOwogICAgIHVpbnQ4X3QgKlYgID0gZnJhbWUtPmRhdGFbMl0gKyAodnN0cmlkZSA+PiAyKSAqIGxpbmU7CiAKLSAgICBmb3IgKHkgPSAwOyB5IDwgbGVmdCAtIDMgJiYgZ2V0X2JpdHNfbGVmdChnYikgPiAxNjsgeSArPSA0KSB7CisgICAgZm9yICh5ID0gMDsgeSA8IGxlZnQgLSAzICYmIGdldF9iaXRzX2xlZnQoZ2IpID4gOSAqIHdpZHRoOyB5ICs9IDQpIHsKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDQpIHsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspCiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKQEAgLTQ4MCw3ICs0NzcsNyBAQAogICAgIHVpbnQ4X3QgKlYgID0gZnJhbWUtPmRhdGFbMl0gKyAodnN0cmlkZSA+PiAxKSAqIGxpbmU7CiAKIAotICAgIGZvciAoeSA9IDA7IHkgPCBsZWZ0IC0gMSAmJiBnZXRfYml0c19sZWZ0KGdiKSA+IDE2OyB5ICs9IDIpIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgbGVmdCAtIDEgJiYgZ2V0X2JpdHNfbGVmdChnYikgPiA2ICogd2lkdGg7IHkgKz0gMikgewogICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gMikgewogICAgICAgICAgICAgWVt4ICsgMCArIDAgKiB5c3RyaWRlXSA9IGRlY29kZV9zeW0oZ2IsIGxydVswXSk7CiAgICAgICAgICAgICBZW3ggKyAxICsgMCAqIHlzdHJpZGVdID0gZGVjb2RlX3N5bShnYiwgbHJ1WzBdKTsKQEAgLTUyMyw3ICs1MjAsNyBAQAogICAgIHVpbnQ4X3QgKlUgID0gZnJhbWUtPmRhdGFbMV0gKyB1c3RyaWRlICogbGluZTsKICAgICB1aW50OF90ICpWICA9IGZyYW1lLT5kYXRhWzJdICsgdnN0cmlkZSAqIGxpbmU7CiAKLSAgICBmb3IgKHkgPSAwOyB5IDwgbGVmdCAmJiBnZXRfYml0c19sZWZ0KGdiKSA+IDE2OyB5KyspIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgbGVmdCAmJiBnZXRfYml0c19sZWZ0KGdiKSA+IDYgKiB3aWR0aDsgeSsrKSB7CiAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CiAgICAgICAgICAgICBZW3hdID0gZGVjb2RlX3N5bShnYiwgbHJ1WzBdKTsKICAgICAgICAgICAgIFVbeF0gPSBkZWNvZGVfc3ltKGdiLCBscnVbMV0pIF4gMHg4MDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHh2LmMgYi9saWJhdmNvZGVjL2R4di5jCmluZGV4IDA1YTlhYWQuLmFlZjVlYzEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZHh2LmMKKysrIGIvbGliYXZjb2RlYy9keHYuYwpAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBSZXNvbHVtZSBEWFYgZGVjb2RlcgogICogQ29weXJpZ2h0IChDKSAyMDE1IFZpdHRvcmlvIEdpb3ZhcmEgPHZpdHRvcmlvLmdpb3ZhcmFAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDE4IFBhdWwgQiBNYWhvbAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0yMyw2ICsyNCw3IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKIAorI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC0zNCw1MCArMzYsMjExIEBACiAgICAgVGV4dHVyZURTUENvbnRleHQgdGV4ZHNwOwogICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKIAotICAgIHVpbnQ4X3QgKnRleF9kYXRhOyAgLy8gQ29tcHJlc3NlZCB0ZXh0dXJlCi0gICAgaW50IHRleF9yYXQ7ICAgICAgICAvLyBDb21wcmVzc2lvbiByYXRpbwotICAgIGludCB0ZXhfc3RlcDsgICAgICAgLy8gRGlzdGFuY2UgYmV0d2VlbiBibG9ja3MKLSAgICBpbnQ2NF90IHRleF9zaXplOyAgIC8vIFRleHR1cmUgc2l6ZQorICAgIHVpbnQ4X3QgKnRleF9kYXRhOyAgIC8vIENvbXByZXNzZWQgdGV4dHVyZQorICAgIHVpbnQ4X3QgKmN0ZXhfZGF0YTsgIC8vIENvbXByZXNzZWQgdGV4dHVyZQorICAgIGludCB0ZXhfcmF0OyAgICAgICAgIC8vIENvbXByZXNzaW9uIHJhdGlvCisgICAgaW50IHRleF9zdGVwOyAgICAgICAgLy8gRGlzdGFuY2UgYmV0d2VlbiBibG9ja3MKKyAgICBpbnQgY3RleF9zdGVwOyAgICAgICAvLyBEaXN0YW5jZSBiZXR3ZWVuIGJsb2NrcworICAgIGludDY0X3QgdGV4X3NpemU7ICAgIC8vIFRleHR1cmUgc2l6ZQorICAgIGludDY0X3QgY3RleF9zaXplOyAgIC8vIFRleHR1cmUgc2l6ZQogCiAgICAgLyogT3B0aW1hbCBudW1iZXIgb2Ygc2xpY2VzIGZvciBwYXJhbGxlbCBkZWNvZGluZyAqLwogICAgIGludCBzbGljZV9jb3VudDsKIAorICAgIHVpbnQ4X3QgKm9wX2RhdGFbNF07IC8vIE9wY29kZXMKKyAgICBpbnQ2NF90IG9wX3NpemVbNF07ICAvLyBPcGNvZGVzIHNpemUKKworICAgIGludCB0ZXh0dXJlX2Jsb2NrX3c7CisgICAgaW50IHRleHR1cmVfYmxvY2tfaDsKKworICAgIGludCBjdGV4dHVyZV9ibG9ja193OworICAgIGludCBjdGV4dHVyZV9ibG9ja19oOworCiAgICAgLyogUG9pbnRlciB0byB0aGUgc2VsZWN0ZWQgZGVjb21wcmVzc2lvbiBmdW5jdGlvbiAqLwogICAgIGludCAoKnRleF9mdW5jdCkodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7CisgICAgaW50ICgqdGV4X2Z1bmN0X3BsYW5hclsyXSkodWludDhfdCAqcGxhbmUwLCBwdHJkaWZmX3Qgc3RyaWRlMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwbGFuZTEsIHB0cmRpZmZfdCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKIH0gRFhWQ29udGV4dDsKIAorc3RhdGljIHZvaWQgZGVjb21wcmVzc19pbmRpY2VzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjKQoreworICAgIGludCBibG9jaywgaTsKKworICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IDI7IGJsb2NrKyspIHsKKyAgICAgICAgaW50IHRtcCA9IEFWX1JMMjQoc3JjKTsKKworICAgICAgICAvKiBVbnBhY2sgOHgzIGJpdCBmcm9tIGxhc3QgMyBieXRlIGJsb2NrICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBkc3RbaV0gPSAodG1wID4+IChpICogMykpICYgMHg3OworCisgICAgICAgIHNyYyArPSAzOworICAgICAgICBkc3QgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZXh0cmFjdF9jb21wb25lbnQoaW50IHlvMCwgaW50IHlvMSwgaW50IGNvZGUpCit7CisgICAgaW50IHlvOworCisgICAgaWYgKHlvMCA9PSB5bzEpIHsKKyAgICAgICAgeW8gPSB5bzA7CisgICAgfSBlbHNlIGlmIChjb2RlID09IDApIHsKKyAgICAgICAgeW8gPSB5bzA7CisgICAgfSBlbHNlIGlmIChjb2RlID09IDEpIHsKKyAgICAgICAgeW8gPSB5bzE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHlvMCA+IHlvMSkgeworICAgICAgICAgICAgeW8gPSAodWludDhfdCkgKCgoOCAtIGNvZGUpICogeW8wICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUgLSAxKSAqIHlvMSkgLyA3KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb2RlID09IDYpIHsKKyAgICAgICAgICAgICAgICB5byA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gNykgeworICAgICAgICAgICAgICAgIHlvID0gMjU1OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB5byA9ICh1aW50OF90KSAoKCg2IC0gY29kZSkgKiB5bzAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUgLSAxKSAqIHlvMSkgLyA1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB5bzsKK30KKworc3RhdGljIGludCBjb2NnX2Jsb2NrKHVpbnQ4X3QgKnBsYW5lMCwgcHRyZGlmZl90IHN0cmlkZTAsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGxhbmUxLCBwdHJkaWZmX3Qgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpibG9jaykKK3sKKyAgICB1aW50OF90IGNvX2luZGljZXNbMTZdOworICAgIHVpbnQ4X3QgY2dfaW5kaWNlc1sxNl07CisgICAgdWludDhfdCBjbzAgPSAqKGJsb2NrKTsKKyAgICB1aW50OF90IGNvMSA9ICooYmxvY2sgKyAxKTsKKyAgICB1aW50OF90IGNnMCA9ICooYmxvY2sgKyA4KTsKKyAgICB1aW50OF90IGNnMSA9ICooYmxvY2sgKyA5KTsKKyAgICBpbnQgeCwgeTsKKworICAgIGRlY29tcHJlc3NfaW5kaWNlcyhjb19pbmRpY2VzLCBibG9jayArIDIpOworICAgIGRlY29tcHJlc3NfaW5kaWNlcyhjZ19pbmRpY2VzLCBibG9jayArIDEwKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykgeworICAgICAgICAgICAgaW50IGNvX2NvZGUgPSBjb19pbmRpY2VzW3ggKyB5ICogNF07CisgICAgICAgICAgICBpbnQgY2dfY29kZSA9IGNnX2luZGljZXNbeCArIHkgKiA0XTsKKworICAgICAgICAgICAgcGxhbmUwW3hdID0gZXh0cmFjdF9jb21wb25lbnQoY2cwLCBjZzEsIGNnX2NvZGUpOworICAgICAgICAgICAgcGxhbmUxW3hdID0gZXh0cmFjdF9jb21wb25lbnQoY28wLCBjbzEsIGNvX2NvZGUpOworICAgICAgICB9CisgICAgICAgIHBsYW5lMCArPSBzdHJpZGUwOworICAgICAgICBwbGFuZTEgKz0gc3RyaWRlMTsKKyAgICB9CisKKyAgICByZXR1cm4gMTY7Cit9CisKK3N0YXRpYyB2b2lkIHlhb19zdWJibG9jayh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnlvX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jaykKK3sKKyAgICB1aW50OF90IHlvMCA9ICooYmxvY2spOworICAgIHVpbnQ4X3QgeW8xID0gKihibG9jayArIDEpOworICAgIGludCB4LCB5OworCisgICAgZGVjb21wcmVzc19pbmRpY2VzKHlvX2luZGljZXMsIGJsb2NrICsgMik7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKKyAgICAgICAgICAgIGludCB5b19jb2RlID0geW9faW5kaWNlc1t4ICsgeSAqIDRdOworCisgICAgICAgICAgICBkc3RbeF0gPSBleHRyYWN0X2NvbXBvbmVudCh5bzAsIHlvMSwgeW9fY29kZSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgeW9fYmxvY2sodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp1bnVzZWQwLCBwdHJkaWZmX3QgdW51c2VkMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmxvY2spCit7CisgICAgdWludDhfdCB5b19pbmRpY2VzWzE2XTsKKworICAgIHlhb19zdWJibG9jayhkc3QsICAgICAgeW9faW5kaWNlcywgc3RyaWRlLCBibG9jayk7CisgICAgeWFvX3N1YmJsb2NrKGRzdCArIDQsICB5b19pbmRpY2VzLCBzdHJpZGUsIGJsb2NrICsgOCk7CisgICAgeWFvX3N1YmJsb2NrKGRzdCArIDgsICB5b19pbmRpY2VzLCBzdHJpZGUsIGJsb2NrICsgMTYpOworICAgIHlhb19zdWJibG9jayhkc3QgKyAxMiwgeW9faW5kaWNlcywgc3RyaWRlLCBibG9jayArIDI0KTsKKworICAgIHJldHVybiAzMjsKK30KKworc3RhdGljIGludCB5YW9fYmxvY2sodWludDhfdCAqcGxhbmUwLCBwdHJkaWZmX3Qgc3RyaWRlMCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBsYW5lMywgcHRyZGlmZl90IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpibG9jaykKK3sKKyAgICB1aW50OF90IHlvX2luZGljZXNbMTZdOworICAgIHVpbnQ4X3QgYV9pbmRpY2VzWzE2XTsKKworICAgIHlhb19zdWJibG9jayhwbGFuZTAsICAgICAgeW9faW5kaWNlcywgc3RyaWRlMCwgYmxvY2spOworICAgIHlhb19zdWJibG9jayhwbGFuZTMsICAgICAgYV9pbmRpY2VzLCAgc3RyaWRlMSwgYmxvY2sgKyA4KTsKKyAgICB5YW9fc3ViYmxvY2socGxhbmUwICsgNCwgIHlvX2luZGljZXMsIHN0cmlkZTAsIGJsb2NrICsgMTYpOworICAgIHlhb19zdWJibG9jayhwbGFuZTMgKyA0LCAgYV9pbmRpY2VzLCAgc3RyaWRlMSwgYmxvY2sgKyAyNCk7CisgICAgeWFvX3N1YmJsb2NrKHBsYW5lMCArIDgsICB5b19pbmRpY2VzLCBzdHJpZGUwLCBibG9jayArIDMyKTsKKyAgICB5YW9fc3ViYmxvY2socGxhbmUzICsgOCwgIGFfaW5kaWNlcywgIHN0cmlkZTEsIGJsb2NrICsgNDApOworICAgIHlhb19zdWJibG9jayhwbGFuZTAgKyAxMiwgeW9faW5kaWNlcywgc3RyaWRlMCwgYmxvY2sgKyA0OCk7CisgICAgeWFvX3N1YmJsb2NrKHBsYW5lMyArIDEyLCBhX2luZGljZXMsICBzdHJpZGUxLCBibG9jayArIDU2KTsKKworICAgIHJldHVybiA2NDsKK30KKwogc3RhdGljIGludCBkZWNvbXByZXNzX3RleHR1cmVfdGhyZWFkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZSwgaW50IHRocmVhZF9uYikKIHsKICAgICBEWFZDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFWRnJhbWUgKmZyYW1lID0gYXJnOwogICAgIGNvbnN0IHVpbnQ4X3QgKmQgPSBjdHgtPnRleF9kYXRhOwotICAgIGludCB3X2Jsb2NrID0gYXZjdHgtPmNvZGVkX3dpZHRoIC8gVEVYVFVSRV9CTE9DS19XOwotICAgIGludCBoX2Jsb2NrID0gYXZjdHgtPmNvZGVkX2hlaWdodCAvIFRFWFRVUkVfQkxPQ0tfSDsKKyAgICBpbnQgd19ibG9jayA9IGF2Y3R4LT5jb2RlZF93aWR0aCAvIGN0eC0+dGV4dHVyZV9ibG9ja193OworICAgIGludCBoX2Jsb2NrID0gYXZjdHgtPmNvZGVkX2hlaWdodCAvIGN0eC0+dGV4dHVyZV9ibG9ja19oOwogICAgIGludCB4LCB5OwogICAgIGludCBzdGFydF9zbGljZSwgZW5kX3NsaWNlOwotICAgIGludCBiYXNlX2Jsb2Nrc19wZXJfc2xpY2UgPSBoX2Jsb2NrIC8gY3R4LT5zbGljZV9jb3VudDsKLSAgICBpbnQgcmVtYWluZGVyX2Jsb2NrcyA9IGhfYmxvY2sgJSBjdHgtPnNsaWNlX2NvdW50OwogCi0gICAgLyogV2hlbiB0aGUgZnJhbWUgaGVpZ2h0IChpbiBibG9ja3MpIGRvZXNuJ3QgZGl2aWRlIGV2ZW5seSBiZXR3ZWVuIHRoZQotICAgICAqIG51bWJlciBvZiBzbGljZXMsIHNwcmVhZCB0aGUgcmVtYWluaW5nIGJsb2NrcyBldmVubHkgYmV0d2VlbiB0aGUgZmlyc3QKLSAgICAgKiBvcGVyYXRpb25zICovCi0gICAgc3RhcnRfc2xpY2UgPSBzbGljZSAqIGJhc2VfYmxvY2tzX3Blcl9zbGljZTsKLSAgICAvKiBBZGQgYW55IGV4dHJhIGJsb2NrcyAob25lIHBlciBzbGljZSkgdGhhdCBoYXZlIGJlZW4gYWRkZWQKLSAgICAgKiBiZWZvcmUgdGhpcyBzbGljZSAqLwotICAgIHN0YXJ0X3NsaWNlICs9IEZGTUlOKHNsaWNlLCByZW1haW5kZXJfYmxvY2tzKTsKKyAgICBzdGFydF9zbGljZSA9IGhfYmxvY2sgKiBzbGljZSAvIGN0eC0+c2xpY2VfY291bnQ7CisgICAgZW5kX3NsaWNlID0gaF9ibG9jayAqIChzbGljZSArIDEpIC8gY3R4LT5zbGljZV9jb3VudDsKIAotICAgIGVuZF9zbGljZSA9IHN0YXJ0X3NsaWNlICsgYmFzZV9ibG9ja3NfcGVyX3NsaWNlOwotICAgIC8qIEFkZCBhbiBleHRyYSBibG9jayBpZiB0aGVyZSBhcmUgcmVtYWluZGVyIGJsb2NrcyB0byBiZSBhY2NvdW50ZWQgZm9yICovCi0gICAgaWYgKHNsaWNlIDwgcmVtYWluZGVyX2Jsb2NrcykKLSAgICAgICAgZW5kX3NsaWNlKys7CisgICAgaWYgKGN0eC0+dGV4X2Z1bmN0KSB7CisgICAgICAgIGZvciAoeSA9IHN0YXJ0X3NsaWNlOyB5IDwgZW5kX3NsaWNlOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnAgPSBmcmFtZS0+ZGF0YVswXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMF0gKiBjdHgtPnRleHR1cmVfYmxvY2tfaDsKKyAgICAgICAgICAgIGludCBvZmYgPSB5ICogd19ibG9jazsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3X2Jsb2NrOyB4KyspIHsKKyAgICAgICAgICAgICAgICBjdHgtPnRleF9mdW5jdChwICsgeCAqIDQgKiBjdHgtPnRleHR1cmVfYmxvY2tfdywgZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKyAob2ZmICsgeCkgKiBjdHgtPnRleF9zdGVwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMgPSBjdHgtPmN0ZXhfZGF0YTsKIAotICAgIGZvciAoeSA9IHN0YXJ0X3NsaWNlOyB5IDwgZW5kX3NsaWNlOyB5KyspIHsKLSAgICAgICAgdWludDhfdCAqcCA9IGZyYW1lLT5kYXRhWzBdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVswXSAqIFRFWFRVUkVfQkxPQ0tfSDsKLSAgICAgICAgaW50IG9mZiAgPSB5ICogd19ibG9jazsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdfYmxvY2s7IHgrKykgewotICAgICAgICAgICAgY3R4LT50ZXhfZnVuY3QocCArIHggKiAxNiwgZnJhbWUtPmxpbmVzaXplWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArIChvZmYgKyB4KSAqIGN0eC0+dGV4X3N0ZXApOworICAgICAgICBmb3IgKHkgPSBzdGFydF9zbGljZTsgeSA8IGVuZF9zbGljZTsgeSsrKSB7CisgICAgICAgICAgICB1aW50OF90ICpwMCA9IGZyYW1lLT5kYXRhWzBdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVswXSAqIGN0eC0+dGV4dHVyZV9ibG9ja19oOworICAgICAgICAgICAgdWludDhfdCAqcDMgPSBjdHgtPnRleF9zdGVwICE9IDY0ID8gTlVMTCA6IGZyYW1lLT5kYXRhWzNdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVszXSAqIGN0eC0+dGV4dHVyZV9ibG9ja19oOworICAgICAgICAgICAgaW50IG9mZiA9IHkgKiB3X2Jsb2NrOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdfYmxvY2s7IHgrKykgeworICAgICAgICAgICAgICAgIGN0eC0+dGV4X2Z1bmN0X3BsYW5hclswXShwMCArIHggKiBjdHgtPnRleHR1cmVfYmxvY2tfdywgZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMyAhPSBOVUxMID8gcDMgKyB4ICogY3R4LT50ZXh0dXJlX2Jsb2NrX3cgOiBOVUxMLCBmcmFtZS0+bGluZXNpemVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgKyAob2ZmICsgeCkgKiBjdHgtPnRleF9zdGVwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdfYmxvY2sgPSAoYXZjdHgtPmNvZGVkX3dpZHRoIC8gMikgLyBjdHgtPmN0ZXh0dXJlX2Jsb2NrX3c7CisgICAgICAgIGhfYmxvY2sgPSAoYXZjdHgtPmNvZGVkX2hlaWdodCAvIDIpIC8gY3R4LT5jdGV4dHVyZV9ibG9ja19oOworICAgICAgICBzdGFydF9zbGljZSA9IGhfYmxvY2sgKiBzbGljZSAvIGN0eC0+c2xpY2VfY291bnQ7CisgICAgICAgIGVuZF9zbGljZSA9IGhfYmxvY2sgKiAoc2xpY2UgKyAxKSAvIGN0eC0+c2xpY2VfY291bnQ7CisKKyAgICAgICAgZm9yICh5ID0gc3RhcnRfc2xpY2U7IHkgPCBlbmRfc2xpY2U7IHkrKykgeworICAgICAgICAgICAgdWludDhfdCAqcDAgPSBmcmFtZS0+ZGF0YVsxXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMV0gKiBjdHgtPmN0ZXh0dXJlX2Jsb2NrX2g7CisgICAgICAgICAgICB1aW50OF90ICpwMSA9IGZyYW1lLT5kYXRhWzJdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVsyXSAqIGN0eC0+Y3RleHR1cmVfYmxvY2tfaDsKKyAgICAgICAgICAgIGludCBvZmYgPSB5ICogd19ibG9jazsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3X2Jsb2NrOyB4KyspIHsKKyAgICAgICAgICAgICAgICBjdHgtPnRleF9mdW5jdF9wbGFuYXJbMV0ocDAgKyB4ICogY3R4LT5jdGV4dHVyZV9ibG9ja193LCBmcmFtZS0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAxICsgeCAqIGN0eC0+Y3RleHR1cmVfYmxvY2tfdywgZnJhbWUtPmxpbmVzaXplWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICsgKG9mZiArIHgpICogY3R4LT5jdGV4X3N0ZXApOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xMzMsNyArMjk2LDcgQEAKICAgICBBVl9XTDMyKGN0eC0+dGV4X2RhdGEgKyA0LCBieXRlc3RyZWFtMl9nZXRfbGUzMihnYmMpKTsKIAogICAgIC8qIFByb2Nlc3MgaW5wdXQgdW50aWwgdGhlIHdob2xlIHRleHR1cmUgaGFzIGJlZW4gZmlsbGVkICovCi0gICAgd2hpbGUgKHBvcyA8IGN0eC0+dGV4X3NpemUgLyA0KSB7CisgICAgd2hpbGUgKHBvcyArIDIgPD0gY3R4LT50ZXhfc2l6ZSAvIDQpIHsKICAgICAgICAgQ0hFQ0tQT0lOVCgyKTsKIAogICAgICAgICAvKiBDb3B5IHR3byBlbGVtZW50cyBmcm9tIGEgcHJldmlvdXMgb2Zmc2V0IG9yIGZyb20gdGhlIGlucHV0IGJ1ZmZlciAqLwpAQCAtMTY5LDYgKzMzMiw1MzAgQEAKICAgICByZXR1cm4gMDsKIH0KIAordHlwZWRlZiBzdHJ1Y3QgT3Bjb2RlVGFibGUgeworICAgIGludDE2X3QgbmV4dDsKKyAgICB1aW50OF90IHZhbDE7CisgICAgdWludDhfdCB2YWwyOworfSBPcGNvZGVUYWJsZTsKKworc3RhdGljIGludCBmaWxsX2x0YWJsZShHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQzMl90ICp0YWJsZSwgaW50ICpuYl9lbGVtZW50cykKK3sKKyAgICB1bnNpZ25lZCBoYWxmID0gNTEyLCBiaXRzID0gMTAyMywgbGVmdCA9IDEwMjQsIGlucHV0LCBtYXNrOworICAgIGludCB2YWx1ZSwgY291bnRlciA9IDAsIHJzaGlmdCA9IDEwLCBsc2hpZnQgPSAzMDsKKworICAgIG1hc2sgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYikgPj4gMjsKKyAgICB3aGlsZSAobGVmdCkgeworICAgICAgICBpZiAoY291bnRlciA+PSAyNTYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgdmFsdWUgPSBiaXRzICYgbWFzazsKKyAgICAgICAgbGVmdCAtPSBiaXRzICYgbWFzazsKKyAgICAgICAgbWFzayA+Pj0gcnNoaWZ0OworICAgICAgICBsc2hpZnQgLT0gcnNoaWZ0OworICAgICAgICB0YWJsZVtjb3VudGVyKytdID0gdmFsdWU7CisgICAgICAgIGlmIChsc2hpZnQgPCAxNikgeworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBpbnB1dCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKTsKKyAgICAgICAgICAgIG1hc2sgKz0gaW5wdXQgPDwgbHNoaWZ0OworICAgICAgICAgICAgbHNoaWZ0ICs9IDE2OworICAgICAgICB9CisgICAgICAgIGlmIChsZWZ0IDwgaGFsZikgeworICAgICAgICAgICAgaGFsZiA+Pj0gMTsKKyAgICAgICAgICAgIGJpdHMgPj49IDE7CisgICAgICAgICAgICByc2hpZnQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoOyAhdGFibGVbY291bnRlciAtIDFdOyBjb3VudGVyLS0pCisgICAgICAgIGlmIChjb3VudGVyIDw9IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICpuYl9lbGVtZW50cyA9IGNvdW50ZXI7CisKKyAgICBpZiAoY291bnRlciA8IDI1NikKKyAgICAgICAgbWVtc2V0KCZ0YWJsZVtjb3VudGVyXSwgMCwgNCAqICgyNTYgLSBjb3VudGVyKSk7CisKKyAgICBpZiAobHNoaWZ0ID49IDE2KQorICAgICAgICBieXRlc3RyZWFtMl9zZWVrKGdiLCAtMiwgU0VFS19DVVIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsbF9vcHRhYmxlKHVuc2lnbmVkICp0YWJsZTAsIE9wY29kZVRhYmxlICp0YWJsZTEsIGludCBuYl9lbGVtZW50cykKK3sKKyAgICB1bnNpZ25lZCB0YWJsZTJbMjU2XSA9IHsgMCB9OworICAgIHVuc2lnbmVkIHggPSAwOworICAgIGludCB2YWwwLCB2YWwxLCBpLCBqID0gMiwgayA9IDA7CisKKyAgICB0YWJsZTJbMF0gPSB0YWJsZTBbMF07CisgICAgZm9yIChpID0gMDsgaSA8IG5iX2VsZW1lbnRzIC0gMTsgaSsrLCB0YWJsZTJbaV0gPSB2YWwwKSB7CisgICAgICAgIHZhbDAgPSB0YWJsZTBbaSArIDFdICsgdGFibGUyW2ldOworICAgIH0KKworICAgIGlmICghdGFibGUyWzBdKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGsrKzsKKyAgICAgICAgfSB3aGlsZSAoIXRhYmxlMltrXSk7CisgICAgfQorCisgICAgaiA9IDI7CisgICAgZm9yIChpID0gMTAyNDsgaSA+IDA7IGktLSkgeworICAgICAgICBmb3IgKHRhYmxlMVt4XS52YWwxID0gazsgayA8IDI1NiAmJiBqID4gdGFibGUyW2tdOyBrKyspOworICAgICAgICB4ID0gKHggLSAzODMpICYgMHgzRkY7CisgICAgICAgIGorKzsKKyAgICB9CisKKyAgICBpZiAobmJfZWxlbWVudHMgPiAwKQorICAgICAgICBtZW1jcHkoJnRhYmxlMlswXSwgdGFibGUwLCA0ICogbmJfZWxlbWVudHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworICAgICAgICB2YWwwID0gdGFibGUxW2ldLnZhbDE7CisgICAgICAgIHZhbDEgPSB0YWJsZTJbdmFsMF07CisgICAgICAgIHRhYmxlMlt2YWwwXSsrOworICAgICAgICB4ID0gMzEgLSBmZl9jbHoodmFsMSk7CisgICAgICAgIGlmICh4ID4gMTApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgdGFibGUxW2ldLnZhbDIgPSAxMCAtIHg7CisgICAgICAgIHRhYmxlMVtpXS5uZXh0ID0gKHZhbDEgPDwgdGFibGUxW2ldLnZhbDIpIC0gMTAyNDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfb3Bjb2RlcyhHZXRCeXRlQ29udGV4dCAqZ2IsIHVpbnQzMl90ICp0YWJsZSwgdWludDhfdCAqZHN0LCBpbnQgb3Bfc2l6ZSwgaW50IG5iX2VsZW1lbnRzKQoreworICAgIE9wY29kZVRhYmxlIG9wdGFibGVbMTAyNF07CisgICAgaW50IHN1bSwgeCwgdmFsLCBsc2hpZnQsIHJzaGlmdCwgcmV0LCBpLCBpZHg7CisgICAgaW50NjRfdCBzaXplX2luX2JpdHM7CisgICAgdW5zaWduZWQgZW5kb2Zmc2V0LCBuZXdvZmZzZXQsIG9mZnNldDsKKyAgICB1bnNpZ25lZCBuZXh0OworICAgIHVpbnQ4X3QgKnNyYyA9ICh1aW50OF90ICopZ2ItPmJ1ZmZlcjsKKworICAgIHJldCA9IGZpbGxfb3B0YWJsZSh0YWJsZSwgb3B0YWJsZSwgbmJfZWxlbWVudHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc2l6ZV9pbl9iaXRzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgIGVuZG9mZnNldCA9ICgoc2l6ZV9pbl9iaXRzICsgNykgPj4gMykgLSA0OworICAgIGlmIChlbmRvZmZzZXQgPD0gMCB8fCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCBlbmRvZmZzZXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgb2Zmc2V0ID0gZW5kb2Zmc2V0OworICAgIG5leHQgPSBBVl9STDMyKHNyYyArIGVuZG9mZnNldCk7CisgICAgcnNoaWZ0ID0gKCgoc2l6ZV9pbl9iaXRzICYgMHhGRikgLSAxKSAmIDcpICsgMTU7CisgICAgbHNoaWZ0ID0gMzIgLSByc2hpZnQ7CisgICAgaWR4ID0gKG5leHQgPj4gcnNoaWZ0KSAmIDB4M0ZGOworICAgIGZvciAoaSA9IDA7IGkgPCBvcF9zaXplOyBpKyspIHsKKyAgICAgICAgZHN0W2ldID0gb3B0YWJsZVtpZHhdLnZhbDE7CisgICAgICAgIHZhbCA9IG9wdGFibGVbaWR4XS52YWwyOworICAgICAgICBzdW0gPSB2YWwgKyBsc2hpZnQ7CisgICAgICAgIHggPSAobmV4dCA8PCBsc2hpZnQpID4+IDEgPj4gKDMxIC0gdmFsKTsKKyAgICAgICAgbmV3b2Zmc2V0ID0gb2Zmc2V0IC0gKHN1bSA+PiAzKTsKKyAgICAgICAgbHNoaWZ0ID0gc3VtICYgNzsKKyAgICAgICAgaWR4ID0geCArIG9wdGFibGVbaWR4XS5uZXh0OworICAgICAgICBvZmZzZXQgPSBuZXdvZmZzZXQ7CisgICAgICAgIGlmIChvZmZzZXQgPiBlbmRvZmZzZXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgbmV4dCA9IEFWX1JMMzIoc3JjICsgb2Zmc2V0KTsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9za2lwKGdiLCAoc2l6ZV9pbl9iaXRzICsgNyA+PiAzKSAtIDQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHh2X2RlY29tcHJlc3Nfb3Bjb2RlcyhHZXRCeXRlQ29udGV4dCAqZ2IsIHZvaWQgKmRzdHAsIHNpemVfdCBvcF9zaXplKQoreworICAgIGludCBwb3MgPSBieXRlc3RyZWFtMl90ZWxsKGdiKTsKKyAgICBpbnQgZmxhZyA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZShnYik7CisKKyAgICBpZiAoKGZsYWcgJiAzKSA9PSAwKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDEpOworICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKGdiLCBkc3RwLCBvcF9zaXplKTsKKyAgICB9IGVsc2UgaWYgKChmbGFnICYgMykgPT0gMSkgeworICAgICAgICBieXRlc3RyZWFtMl9za2lwKGdiLCAxKTsKKyAgICAgICAgbWVtc2V0KGRzdHAsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSwgb3Bfc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgdGFibGVbMjU2XTsKKyAgICAgICAgaW50IHJldCwgZWxlbWVudHMgPSAwOworCisgICAgICAgIHJldCA9IGZpbGxfbHRhYmxlKGdiLCB0YWJsZSwgJmVsZW1lbnRzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSBnZXRfb3Bjb2RlcyhnYiwgdGFibGUsIGRzdHAsIG9wX3NpemUsIGVsZW1lbnRzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gYnl0ZXN0cmVhbTJfdGVsbChnYikgLSBwb3M7Cit9CisKK3N0YXRpYyBpbnQgZHh2X2RlY29tcHJlc3NfY2dvKERYVkNvbnRleHQgKmN0eCwgR2V0Qnl0ZUNvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdGV4X2RhdGEsIGludCB0ZXhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm9wX2RhdGEsIGludCAqb2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZHN0cCwgaW50ICpzdGF0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqdGFiMCwgdWludDhfdCAqKnRhYjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0KQoreworICAgIHVpbnQ4X3QgKmRzdCA9ICpkc3RwOworICAgIHVpbnQ4X3QgKnRwdHIwLCAqdHB0cjEsICp0cHRyMzsKKyAgICBpbnQgb2kgPSAqb2luZGV4OworICAgIGludCBzdGF0ZSA9ICpzdGF0ZXA7CisgICAgaW50IG9wY29kZSwgdiwgdnY7CisKKyAgICBpZiAoc3RhdGUgPD0gMCkgeworICAgICAgICBpZiAob2kgPj0gb3Bfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBvcGNvZGUgPSBvcF9kYXRhW29pKytdOworICAgICAgICBpZiAoIW9wY29kZSkgeworICAgICAgICAgICAgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgIGlmICh2ID09IDI1NSkgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKTsKKyAgICAgICAgICAgICAgICAgICAgdiArPSBvcGNvZGU7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAob3Bjb2RlID09IDB4RkZGRik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBVl9XTDMyKGRzdCwgQVZfUkwzMihkc3QgLSAoOCArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIEFWX1dMMzIoZHN0ICsgNCwgQVZfUkwzMihkc3QgLSAoNCArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIHN0YXRlID0gdiArIDQ7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKG9wY29kZSkgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBBVl9XTDMyKGRzdCwgQVZfUkwzMihkc3QgLSAoOCArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIEFWX1dMMzIoZHN0ICsgNCwgQVZfUkwzMihkc3QgLSAoNCArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICB2diA9ICg4ICsgb2Zmc2V0KSAqIChieXRlc3RyZWFtMl9nZXRfbGUxNihnYikgKyAxKTsKKyAgICAgICAgICAgIGlmICh2diA8IDAgfHwgdnYgPiBkc3QgLSB0ZXhfZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHRwdHIwID0gZHN0IC0gdnY7CisgICAgICAgICAgICB2ID0gQVZfUkwzMih0cHRyMCk7CisgICAgICAgICAgICBBVl9XTDMyKGRzdCwgQVZfUkwzMih0cHRyMCkpOworICAgICAgICAgICAgQVZfV0wzMihkc3QgKyA0LCBBVl9STDMyKHRwdHIwICsgNCkpOworICAgICAgICAgICAgdGFiMFsweDlFMzc3OUIxICogKHVpbnQxNl90KXYgPj4gMjRdID0gZHN0OworICAgICAgICAgICAgdGFiMVsweDlFMzc3OUIxICogKEFWX1JMMzIoZHN0ICsgMikgJiAweEZGRkZGRnUpID4+IDI0XSA9IGRzdCArIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgQVZfV0wzMihkc3QsIGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKSk7CisgICAgICAgICAgICBBVl9XTDMyKGRzdCArIDQsIGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKSk7CisgICAgICAgICAgICB0YWIwWzB4OUUzNzc5QjEgKiBBVl9STDE2KGRzdCkgPj4gMjRdID0gZHN0OworICAgICAgICAgICAgdGFiMVsweDlFMzc3OUIxICogKEFWX1JMMzIoZHN0ICsgMikgJiAweEZGRkZGRnUpID4+IDI0XSA9IGRzdCArIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdHB0cjMgPSB0YWIxW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgQVZfV0wxNihkc3QsIGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKSk7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCArIDIsIEFWX1JMMTYodHB0cjMpKTsKKyAgICAgICAgICAgIGRzdFs0XSA9IHRwdHIzWzJdOworICAgICAgICAgICAgQVZfV0wxNihkc3QgKyA1LCBieXRlc3RyZWFtMl9nZXRfbGUxNihnYikpOworICAgICAgICAgICAgZHN0WzddID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgdGFiMFsweDlFMzc3OUIxICogQVZfUkwxNihkc3QpID4+IDI0XSA9IGRzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICB0cHRyMyA9IHRhYjFbYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpXTsKKyAgICAgICAgICAgIGlmICghdHB0cjMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCwgYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpKTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgMiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpKTsKKyAgICAgICAgICAgIGRzdFs0XSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgNSwgQVZfUkwxNih0cHRyMykpOworICAgICAgICAgICAgZHN0WzddID0gdHB0cjNbMl07CisgICAgICAgICAgICB0YWIwWzB4OUUzNzc5QjEgKiBBVl9STDE2KGRzdCkgPj4gMjRdID0gZHN0OworICAgICAgICAgICAgdGFiMVsweDlFMzc3OUIxICogKEFWX1JMMzIoZHN0ICsgMikgJiAweEZGRkZGRnUpID4+IDI0XSA9IGRzdCArIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgdHB0cjAgPSB0YWIxW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgdHB0cjEgPSB0YWIxW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgQVZfV0wxNihkc3QsIGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKSk7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCArIDIsIEFWX1JMMTYodHB0cjApKTsKKyAgICAgICAgICAgIGRzdFs0XSA9IHRwdHIwWzJdOworICAgICAgICAgICAgQVZfV0wxNihkc3QgKyA1LCBBVl9STDE2KHRwdHIxKSk7CisgICAgICAgICAgICBkc3RbN10gPSB0cHRyMVsyXTsKKyAgICAgICAgICAgIHRhYjBbMHg5RTM3NzlCMSAqIEFWX1JMMTYoZHN0KSA+PiAyNF0gPSBkc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA3OgorICAgICAgICAgICAgdiA9ICg4ICsgb2Zmc2V0KSAqIChieXRlc3RyZWFtMl9nZXRfbGUxNihnYikgKyAxKTsKKyAgICAgICAgICAgIGlmICh2IDwgMCB8fCB2ID4gZHN0IC0gdGV4X2RhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB0cHRyMCA9IGRzdCAtIHY7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCwgYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpKTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgMiwgQVZfUkwxNih0cHRyMCArIDIpKTsKKyAgICAgICAgICAgIEFWX1dMMzIoZHN0ICsgNCwgQVZfUkwzMih0cHRyMCArIDQpKTsKKyAgICAgICAgICAgIHRhYjBbMHg5RTM3NzlCMSAqIEFWX1JMMTYoZHN0KSA+PiAyNF0gPSBkc3Q7CisgICAgICAgICAgICB0YWIxWzB4OUUzNzc5QjEgKiAoQVZfUkwzMihkc3QgKyAyKSAmIDB4RkZGRkZGdSkgPj4gMjRdID0gZHN0ICsgMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICB0cHRyMSA9IHRhYjBbYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpXTsKKyAgICAgICAgICAgIGlmICghdHB0cjEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCwgQVZfUkwxNih0cHRyMSkpOworICAgICAgICAgICAgQVZfV0wxNihkc3QgKyAyLCBieXRlc3RyZWFtMl9nZXRfbGUxNihnYikpOworICAgICAgICAgICAgQVZfV0wzMihkc3QgKyA0LCBieXRlc3RyZWFtMl9nZXRfbGUzMihnYikpOworICAgICAgICAgICAgdGFiMVsweDlFMzc3OUIxICogKEFWX1JMMzIoZHN0ICsgMikgJiAweEZGRkZGRnUpID4+IDI0XSA9IGRzdCArIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA5OgorICAgICAgICAgICAgdHB0cjEgPSB0YWIwW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgdHB0cjMgPSB0YWIxW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgQVZfV0wxNihkc3QsIEFWX1JMMTYodHB0cjEpKTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgMiwgQVZfUkwxNih0cHRyMykpOworICAgICAgICAgICAgZHN0WzRdID0gdHB0cjNbMl07CisgICAgICAgICAgICBBVl9XTDE2KGRzdCArIDUsIGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKSk7CisgICAgICAgICAgICBkc3RbN10gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICB0YWIxWzB4OUUzNzc5QjEgKiAoQVZfUkwzMihkc3QgKyAyKSAmIDB4RkZGRkZGdSkgPj4gMjRdID0gZHN0ICsgMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwOgorICAgICAgICAgICAgdHB0cjEgPSB0YWIwW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgdHB0cjMgPSB0YWIxW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgQVZfV0wxNihkc3QsIEFWX1JMMTYodHB0cjEpKTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgMiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpKTsKKyAgICAgICAgICAgIGRzdFs0XSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgNSwgQVZfUkwxNih0cHRyMykpOworICAgICAgICAgICAgZHN0WzddID0gdHB0cjNbMl07CisgICAgICAgICAgICB0YWIxWzB4OUUzNzc5QjEgKiAoQVZfUkwzMihkc3QgKyAyKSAmIDB4RkZGRkZGdSkgPj4gMjRdID0gZHN0ICsgMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgdHB0cjAgPSB0YWIwW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgdHB0cjMgPSB0YWIxW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgdHB0cjEgPSB0YWIxW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgQVZfV0wxNihkc3QsIEFWX1JMMTYodHB0cjApKTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgMiwgQVZfUkwxNih0cHRyMykpOworICAgICAgICAgICAgZHN0WzRdID0gdHB0cjNbMl07CisgICAgICAgICAgICBBVl9XTDE2KGRzdCArIDUsIEFWX1JMMTYodHB0cjEpKTsKKyAgICAgICAgICAgIGRzdFs3XSA9IHRwdHIxWzJdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTI6CisgICAgICAgICAgICB0cHRyMSA9IHRhYjBbYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpXTsKKyAgICAgICAgICAgIGlmICghdHB0cjEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB2ID0gKDggKyBvZmZzZXQpICogKGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKSArIDEpOworICAgICAgICAgICAgaWYgKHYgPCAwIHx8IHYgPiBkc3QgLSB0ZXhfZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHRwdHIwID0gZHN0IC0gdjsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0LCBBVl9STDE2KHRwdHIxKSk7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCArIDIsIEFWX1JMMTYodHB0cjAgKyAyKSk7CisgICAgICAgICAgICBBVl9XTDMyKGRzdCArIDQsIEFWX1JMMzIodHB0cjAgKyA0KSk7CisgICAgICAgICAgICB0YWIxWzB4OUUzNzc5QjEgKiAoQVZfUkwzMihkc3QgKyAyKSAmIDB4RkZGRkZGdSkgPj4gMjRdID0gZHN0ICsgMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgQVZfV0wxNihkc3QsIEFWX1JMMTYoZHN0IC0gKDggKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCArIDIsIGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKSk7CisgICAgICAgICAgICBBVl9XTDMyKGRzdCArIDQsIGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKSk7CisgICAgICAgICAgICB0YWIxWzB4OUUzNzc5QjEgKiAoQVZfUkwzMihkc3QgKyAyKSAmIDB4RkZGRkZGdSkgPj4gMjRdID0gZHN0ICsgMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgdHB0cjMgPSB0YWIxW2J5dGVzdHJlYW0yX2dldF9ieXRlKGdiKV07CisgICAgICAgICAgICBpZiAoIXRwdHIzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgQVZfV0wxNihkc3QsIEFWX1JMMTYoZHN0IC0gKDggKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCArIDIsIEFWX1JMMTYodHB0cjMpKTsKKyAgICAgICAgICAgIGRzdFs0XSA9IHRwdHIzWzJdOworICAgICAgICAgICAgQVZfV0wxNihkc3QgKyA1LCBieXRlc3RyZWFtMl9nZXRfbGUxNihnYikpOworICAgICAgICAgICAgZHN0WzddID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgdGFiMVsweDlFMzc3OUIxICogKEFWX1JMMzIoZHN0ICsgMikgJiAweEZGRkZGRnUpID4+IDI0XSA9IGRzdCArIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgIHRwdHIzID0gdGFiMVtieXRlc3RyZWFtMl9nZXRfYnl0ZShnYildOworICAgICAgICAgICAgaWYgKCF0cHRyMykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0LCBBVl9STDE2KGRzdCAtICg4ICsgb2Zmc2V0KSkpOworICAgICAgICAgICAgQVZfV0wxNihkc3QgKyAyLCBieXRlc3RyZWFtMl9nZXRfbGUxNihnYikpOworICAgICAgICAgICAgZHN0WzRdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgQVZfV0wxNihkc3QgKyA1LCBBVl9STDE2KHRwdHIzKSk7CisgICAgICAgICAgICBkc3RbN10gPSB0cHRyM1syXTsKKyAgICAgICAgICAgIHRhYjFbMHg5RTM3NzlCMSAqIChBVl9STDMyKGRzdCArIDIpICYgMHhGRkZGRkZ1KSA+PiAyNF0gPSBkc3QgKyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICB0cHRyMyA9IHRhYjFbYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpXTsKKyAgICAgICAgICAgIGlmICghdHB0cjMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB0cHRyMSA9IHRhYjFbYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpXTsKKyAgICAgICAgICAgIGlmICghdHB0cjEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBBVl9XTDE2KGRzdCwgQVZfUkwxNihkc3QgLSAoOCArIG9mZnNldCkpKTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0ICsgMiwgQVZfUkwxNih0cHRyMykpOworICAgICAgICAgICAgZHN0WzRdID0gdHB0cjNbMl07CisgICAgICAgICAgICBBVl9XTDE2KGRzdCArIDUsIEFWX1JMMTYodHB0cjEpKTsKKyAgICAgICAgICAgIGRzdFs3XSA9IHRwdHIxWzJdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICB2ID0gKDggKyBvZmZzZXQpICogKGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKSArIDEpOworICAgICAgICAgICAgaWYgKHYgPCAwIHx8IHYgPiBkc3QgLSB0ZXhfZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIEFWX1dMMTYoZHN0LCBBVl9STDE2KGRzdCAtICg4ICsgb2Zmc2V0KSkpOworICAgICAgICAgICAgQVZfV0wxNihkc3QgKyAyLCBBVl9STDE2KCZkc3RbLXYgKyAyXSkpOworICAgICAgICAgICAgQVZfV0wzMihkc3QgKyA0LCBBVl9STDMyKCZkc3RbLXYgKyA0XSkpOworICAgICAgICAgICAgdGFiMVsweDlFMzc3OUIxICogKEFWX1JMMzIoZHN0ICsgMikgJiAweEZGRkZGRnUpID4+IDI0XSA9IGRzdCArIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKK2RvbmU6CisgICAgICAgIEFWX1dMMzIoZHN0LCBBVl9STDMyKGRzdCAtICg4ICsgb2Zmc2V0KSkpOworICAgICAgICBBVl9XTDMyKGRzdCArIDQsIEFWX1JMMzIoZHN0IC0gKDQgKyBvZmZzZXQpKSk7CisgICAgICAgIHN0YXRlLS07CisgICAgfQorICAgIGlmIChkc3QgLSB0ZXhfZGF0YSArIDggPiB0ZXhfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgZHN0ICs9IDg7CisKKyAgICAqb2luZGV4ID0gb2k7CisgICAgKmRzdHAgPSBkc3Q7CisgICAgKnN0YXRlcCA9IHN0YXRlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHh2X2RlY29tcHJlc3NfY29jZyhEWFZDb250ZXh0ICpjdHgsIEdldEJ5dGVDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp0ZXhfZGF0YSwgaW50IHRleF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm9wX2RhdGEwLCB1aW50OF90ICpvcF9kYXRhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X29wX3NpemUwLCBpbnQgbWF4X29wX3NpemUxKQoreworICAgIHVpbnQ4X3QgKmRzdCwgKnRhYjJbMjU2XSA9IHsgMCB9LCAqdGFiMFsyNTZdID0geyAwIH0sICp0YWIzWzI1Nl0gPSB7IDAgfSwgKnRhYjFbMjU2XSA9IHsgMCB9OworICAgIGludCBvcF9vZmZzZXQgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgdW5zaWduZWQgb3Bfc2l6ZTAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgdW5zaWduZWQgb3Bfc2l6ZTEgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgaW50IGRhdGFfc3RhcnQgPSBieXRlc3RyZWFtMl90ZWxsKGdiKTsKKyAgICBpbnQgc2tpcDAsIHNraXAxLCBvaTAgPSAwLCBvaTEgPSAwOworICAgIGludCByZXQsIHN0YXRlMCA9IDAsIHN0YXRlMSA9IDA7CisKKyAgICBkc3QgPSB0ZXhfZGF0YTsKKyAgICBieXRlc3RyZWFtMl9za2lwKGdiLCBvcF9vZmZzZXQgLSAxMik7CisgICAgaWYgKG9wX3NpemUwID4gbWF4X29wX3NpemUwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBza2lwMCA9IGR4dl9kZWNvbXByZXNzX29wY29kZXMoZ2IsIG9wX2RhdGEwLCBvcF9zaXplMCk7CisgICAgaWYgKHNraXAwIDwgMCkKKyAgICAgICAgcmV0dXJuIHNraXAwOworICAgIGJ5dGVzdHJlYW0yX3NlZWsoZ2IsIGRhdGFfc3RhcnQgKyBvcF9vZmZzZXQgKyBza2lwMCAtIDEyLCBTRUVLX1NFVCk7CisgICAgaWYgKG9wX3NpemUxID4gbWF4X29wX3NpemUxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBza2lwMSA9IGR4dl9kZWNvbXByZXNzX29wY29kZXMoZ2IsIG9wX2RhdGExLCBvcF9zaXplMSk7CisgICAgaWYgKHNraXAxIDwgMCkKKyAgICAgICAgcmV0dXJuIHNraXAxOworICAgIGJ5dGVzdHJlYW0yX3NlZWsoZ2IsIGRhdGFfc3RhcnQsIFNFRUtfU0VUKTsKKworICAgIEFWX1dMMzIoZHN0LCBieXRlc3RyZWFtMl9nZXRfbGUzMihnYikpOworICAgIEFWX1dMMzIoZHN0ICsgNCwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpKTsKKyAgICBBVl9XTDMyKGRzdCArIDgsIGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKSk7CisgICAgQVZfV0wzMihkc3QgKyAxMiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpKTsKKworICAgIHRhYjBbMHg5RTM3NzlCMSAqIEFWX1JMMTYoZHN0KSA+PiAyNF0gPSBkc3Q7CisgICAgdGFiMVsweDlFMzc3OUIxICogKEFWX1JMMzIoZHN0ICsgMikgJiAweEZGRkZGRikgPj4gMjRdID0gZHN0ICsgMjsKKyAgICB0YWIyWzB4OUUzNzc5QjEgKiBBVl9STDE2KGRzdCArIDgpID4+IDI0XSA9IGRzdCArIDg7CisgICAgdGFiM1sweDlFMzc3OUIxICogKEFWX1JMMzIoZHN0ICsgMTApICYgMHhGRkZGRkYpID4+IDI0XSA9IGRzdCArIDEwOworICAgIGRzdCArPSAxNjsKKyAgICB3aGlsZSAoZHN0ICsgMTAgPCB0ZXhfZGF0YSArIHRleF9zaXplKSB7CisgICAgICAgIHJldCA9IGR4dl9kZWNvbXByZXNzX2NnbyhjdHgsIGdiLCB0ZXhfZGF0YSwgdGV4X3NpemUsIG9wX2RhdGEwLCAmb2kwLCBvcF9zaXplMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3QsICZzdGF0ZTAsIHRhYjAsIHRhYjEsIDgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IGR4dl9kZWNvbXByZXNzX2NnbyhjdHgsIGdiLCB0ZXhfZGF0YSwgdGV4X3NpemUsIG9wX2RhdGExLCAmb2kxLCBvcF9zaXplMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkc3QsICZzdGF0ZTEsIHRhYjIsIHRhYjMsIDgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2VlayhnYiwgZGF0YV9zdGFydCArIG9wX29mZnNldCArIHNraXAwICsgc2tpcDEgLSAxMiwgU0VFS19TRVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHh2X2RlY29tcHJlc3NfeW8oRFhWQ29udGV4dCAqY3R4LCBHZXRCeXRlQ29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRleF9kYXRhLCBpbnQgdGV4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm9wX2RhdGEsIGludCBtYXhfb3Bfc2l6ZSkKK3sKKyAgICBpbnQgb3Bfb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgIHVuc2lnbmVkIG9wX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgaW50IGRhdGFfc3RhcnQgPSBieXRlc3RyZWFtMl90ZWxsKGdiKTsKKyAgICB1aW50OF90ICpkc3QsICp0YWJsZTBbMjU2XSA9IHsgMCB9LCAqdGFibGUxWzI1Nl0gPSB7IDAgfTsKKyAgICBpbnQgcmV0LCBzdGF0ZSA9IDAsIHNraXAsIG9pID0gMCwgdiwgdnY7CisKKyAgICBkc3QgPSB0ZXhfZGF0YTsKKyAgICBieXRlc3RyZWFtMl9za2lwKGdiLCBvcF9vZmZzZXQgLSA4KTsKKyAgICBpZiAob3Bfc2l6ZSA+IG1heF9vcF9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBza2lwID0gZHh2X2RlY29tcHJlc3Nfb3Bjb2RlcyhnYiwgb3BfZGF0YSwgb3Bfc2l6ZSk7CisgICAgaWYgKHNraXAgPCAwKQorICAgICAgICByZXR1cm4gc2tpcDsKKyAgICBieXRlc3RyZWFtMl9zZWVrKGdiLCBkYXRhX3N0YXJ0LCBTRUVLX1NFVCk7CisKKyAgICB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgIEFWX1dMMzIoZHN0LCB2KTsKKyAgICB2diA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKTsKKyAgICB0YWJsZTBbMHg5RTM3NzlCMSAqICh1aW50MTZfdCl2ID4+IDI0XSA9IGRzdDsKKyAgICBBVl9XTDMyKGRzdCArIDQsIHZ2KTsKKyAgICB0YWJsZTFbMHg5RTM3NzlCMSAqIChBVl9STDMyKGRzdCArIDIpICYgMHhGRkZGRkYpID4+IDI0XSA9IGRzdCArIDI7CisgICAgZHN0ICs9IDg7CisKKyAgICB3aGlsZSAoZHN0IDwgdGV4X2RhdGEgKyB0ZXhfc2l6ZSkgeworICAgICAgICByZXQgPSBkeHZfZGVjb21wcmVzc19jZ28oY3R4LCBnYiwgdGV4X2RhdGEsIHRleF9zaXplLCBvcF9kYXRhLCAmb2ksIG9wX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0LCAmc3RhdGUsIHRhYmxlMCwgdGFibGUxLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NlZWsoZ2IsIGRhdGFfc3RhcnQgKyBvcF9vZmZzZXQgKyBza2lwIC0gOCwgU0VFS19TRVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHh2X2RlY29tcHJlc3NfeWNnNihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRFhWQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCAqZ2IgPSAmY3R4LT5nYmM7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGR4dl9kZWNvbXByZXNzX3lvKGN0eCwgZ2IsIGN0eC0+dGV4X2RhdGEsIGN0eC0+dGV4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vcF9kYXRhWzBdLCBjdHgtPm9wX3NpemVbMF0pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIGR4dl9kZWNvbXByZXNzX2NvY2coY3R4LCBnYiwgY3R4LT5jdGV4X2RhdGEsIGN0eC0+Y3RleF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b3BfZGF0YVsxXSwgY3R4LT5vcF9kYXRhWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b3Bfc2l6ZVsxXSwgY3R4LT5vcF9zaXplWzJdKTsKK30KKworc3RhdGljIGludCBkeHZfZGVjb21wcmVzc195ZzEwKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEWFZDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJ5dGVDb250ZXh0ICpnYiA9ICZjdHgtPmdiYzsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZHh2X2RlY29tcHJlc3NfY29jZyhjdHgsIGdiLCBjdHgtPnRleF9kYXRhLCBjdHgtPnRleF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vcF9kYXRhWzBdLCBjdHgtPm9wX2RhdGFbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm9wX3NpemVbMF0sIGN0eC0+b3Bfc2l6ZVszXSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gZHh2X2RlY29tcHJlc3NfY29jZyhjdHgsIGdiLCBjdHgtPmN0ZXhfZGF0YSwgY3R4LT5jdGV4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vcF9kYXRhWzFdLCBjdHgtPm9wX2RhdGFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5vcF9zaXplWzFdLCBjdHgtPm9wX3NpemVbMl0pOworfQorCiBzdGF0aWMgaW50IGR4dl9kZWNvbXByZXNzX2R4dDUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIERYVkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CkBAIC0xODYsNyArODczLDcgQEAKICAgICBBVl9XTDMyKGN0eC0+dGV4X2RhdGEgKyAxMiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2JjKSk7CiAKICAgICAvKiBQcm9jZXNzIGlucHV0IHVudGlsIHRoZSB3aG9sZSB0ZXh0dXJlIGhhcyBiZWVuIGZpbGxlZCAqLwotICAgIHdoaWxlIChwb3MgPCBjdHgtPnRleF9zaXplIC8gNCkgeworICAgIHdoaWxlIChwb3MgKyAyIDw9IGN0eC0+dGV4X3NpemUgLyA0KSB7CiAgICAgICAgIGlmIChydW4pIHsKICAgICAgICAgICAgIHJ1bi0tOwogCkBAIC0xOTcsNiArODg0LDggQEAKICAgICAgICAgICAgIEFWX1dMMzIoY3R4LT50ZXhfZGF0YSArIDQgKiBwb3MsIHByZXYpOwogICAgICAgICAgICAgcG9zKys7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2JjKSA8IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMCkgewogICAgICAgICAgICAgICAgIHZhbHVlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2JjKTsKICAgICAgICAgICAgICAgICBzdGF0ZSA9IDE2OwpAQCAtMjE1LDcgKzkwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayArPSBwcm9iZTsKICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAocHJvYmUgPT0gMHhGRkZGKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGNoZWNrICYmIHBvcyA8IGN0eC0+dGV4X3NpemUgLyA0KSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGNoZWNrICYmIHBvcyArIDQgPD0gY3R4LT50ZXhfc2l6ZSAvIDQpIHsKICAgICAgICAgICAgICAgICAgICAgcHJldiA9IEFWX1JMMzIoY3R4LT50ZXhfZGF0YSArIDQgKiAocG9zIC0gNCkpOwogICAgICAgICAgICAgICAgICAgICBBVl9XTDMyKGN0eC0+dGV4X2RhdGEgKyA0ICogcG9zLCBwcmV2KTsKICAgICAgICAgICAgICAgICAgICAgcG9zKys7CkBAIC0yNjAsMTAgKzk0OSw4IEBACiAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgLyogQ29weSB0d28gZHdvcmRzIGZyb20gYSBwcmV2aW91cyBpbmRleCAqLwogICAgICAgICAgICAgICAgIGlkeCA9IDggKyBieXRlc3RyZWFtMl9nZXRfbGUxNihnYmMpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPiBwb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpZHggJWQgPiAlZFxuIiwgaWR4LCBwb3MpOworICAgICAgICAgICAgICAgIGlmIChpZHggPiBwb3MgfHwgKHVuc2lnbmVkIGludCkocG9zIC0gaWR4KSArIDIgPiBjdHgtPnRleF9zaXplIC8gNCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHByZXYgPSBBVl9STDMyKGN0eC0+dGV4X2RhdGEgKyA0ICogKHBvcyAtIGlkeCkpOwogICAgICAgICAgICAgICAgIEFWX1dMMzIoY3R4LT50ZXhfZGF0YSArIDQgKiBwb3MsIHByZXYpOwogICAgICAgICAgICAgICAgIHBvcysrOwpAQCAtMjg2LDkgKzk3MywxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgQ0hFQ0tQT0lOVCg0KTsKKyAgICAgICAgaWYgKHBvcyArIDIgPiBjdHgtPnRleF9zaXplIC8gNCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgIC8qIENvcHkgdHdvIGVsZW1lbnRzIGZyb20gYSBwcmV2aW91cyBvZmZzZXQgb3IgZnJvbSB0aGUgaW5wdXQgYnVmZmVyICovCiAgICAgICAgIGlmIChvcCkgeworICAgICAgICAgICAgaWYgKGlkeCA+IHBvcyB8fCAodW5zaWduZWQgaW50KShwb3MgLSBpZHgpICsgMiA+IGN0eC0+dGV4X3NpemUgLyA0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgcHJldiA9IEFWX1JMMzIoY3R4LT50ZXhfZGF0YSArIDQgKiAocG9zIC0gaWR4KSk7CiAgICAgICAgICAgICBBVl9XTDMyKGN0eC0+dGV4X2RhdGEgKyA0ICogcG9zLCBwcmV2KTsKICAgICAgICAgICAgIHBvcysrOwpAQCAtMjk5LDYgKzk5MCw4IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBDSEVDS1BPSU5UKDQpOwogCisgICAgICAgICAgICBpZiAob3AgJiYgKGlkeCA+IHBvcyB8fCAodW5zaWduZWQgaW50KShwb3MgLSBpZHgpICsgMiA+IGN0eC0+dGV4X3NpemUgLyA0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGlmIChvcCkKICAgICAgICAgICAgICAgICBwcmV2ID0gQVZfUkwzMihjdHgtPnRleF9kYXRhICsgNCAqIChwb3MgLSBpZHgpKTsKICAgICAgICAgICAgIGVsc2UKQEAgLTMzMSw2ICsxMDI0LDkgQEAKICAgICBEWFZDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEdldEJ5dGVDb250ZXh0ICpnYmMgPSAmY3R4LT5nYmM7CiAKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2JjKSA8IGN0eC0+dGV4X3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcihnYmMsIGN0eC0+dGV4X2RhdGEsIGN0eC0+dGV4X3NpemUpOwogICAgIHJldHVybiAwOwogfQpAQCAtMzUwLDYgKzEwNDYsMTIgQEAKIAogICAgIGJ5dGVzdHJlYW0yX2luaXQoZ2JjLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwogCisgICAgY3R4LT50ZXh0dXJlX2Jsb2NrX2ggPSA0OworICAgIGN0eC0+dGV4dHVyZV9ibG9ja193ID0gNDsKKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0JBOworICAgIGF2Y3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX1JHQjsKKwogICAgIHRhZyA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiYyk7CiAgICAgc3dpdGNoICh0YWcpIHsKICAgICBjYXNlIE1LQkVUQUcoJ0QnLCAnWCcsICdUJywgJzEnKToKQEAgLTM2OSw5ICsxMDcxLDM5IEBACiAgICAgICAgIG1zZ3RleHQgPSAiRFhUNSI7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUtCRVRBRygnWScsICdDJywgJ0cnLCAnNicpOgorICAgICAgICBkZWNvbXByZXNzX3RleCA9IGR4dl9kZWNvbXByZXNzX3ljZzY7CisgICAgICAgIGN0eC0+dGV4X2Z1bmN0X3BsYW5hclswXSA9IHlvX2Jsb2NrOworICAgICAgICBjdHgtPnRleF9mdW5jdF9wbGFuYXJbMV0gPSBjb2NnX2Jsb2NrOworICAgICAgICBjdHgtPnRleF9yYXQgICA9IDg7CisgICAgICAgIGN0eC0+dGV4X3N0ZXAgID0gMzI7CisgICAgICAgIGN0eC0+Y3RleF9zdGVwID0gMTY7CisgICAgICAgIG1zZ2NvbXAgPSAiWU9DT0NHNiI7CisgICAgICAgIG1zZ3RleHQgPSAiWUNHNiI7CisgICAgICAgIGN0eC0+Y3RleF9zaXplID0gYXZjdHgtPmNvZGVkX3dpZHRoICogYXZjdHgtPmNvZGVkX2hlaWdodCAvIDQ7CisgICAgICAgIGN0eC0+dGV4dHVyZV9ibG9ja19oID0gNDsKKyAgICAgICAgY3R4LT50ZXh0dXJlX2Jsb2NrX3cgPSAxNjsKKyAgICAgICAgY3R4LT5jdGV4dHVyZV9ibG9ja19oID0gNDsKKyAgICAgICAgY3R4LT5jdGV4dHVyZV9ibG9ja193ID0gNDsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX1lDT0NHOworICAgICAgICBicmVhazsKICAgICBjYXNlIE1LQkVUQUcoJ1knLCAnRycsICcxJywgJzAnKToKLSAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJUYWcgMHglMDhYIiwgdGFnKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICBkZWNvbXByZXNzX3RleCA9IGR4dl9kZWNvbXByZXNzX3lnMTA7CisgICAgICAgIGN0eC0+dGV4X2Z1bmN0X3BsYW5hclswXSA9IHlhb19ibG9jazsKKyAgICAgICAgY3R4LT50ZXhfZnVuY3RfcGxhbmFyWzFdID0gY29jZ19ibG9jazsKKyAgICAgICAgY3R4LT50ZXhfcmF0ICAgPSA0OworICAgICAgICBjdHgtPnRleF9zdGVwICA9IDY0OworICAgICAgICBjdHgtPmN0ZXhfc3RlcCA9IDE2OworICAgICAgICBtc2djb21wID0gIllBT0NPQ0cxMCI7CisgICAgICAgIG1zZ3RleHQgPSAiWUcxMCI7CisgICAgICAgIGN0eC0+Y3RleF9zaXplID0gYXZjdHgtPmNvZGVkX3dpZHRoICogYXZjdHgtPmNvZGVkX2hlaWdodCAvIDQ7CisgICAgICAgIGN0eC0+dGV4dHVyZV9ibG9ja19oID0gNDsKKyAgICAgICAgY3R4LT50ZXh0dXJlX2Jsb2NrX3cgPSAxNjsKKyAgICAgICAgY3R4LT5jdGV4dHVyZV9ibG9ja19oID0gNDsKKyAgICAgICAgY3R4LT5jdGV4dHVyZV9ibG9ja193ID0gNDsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjBQOworICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19ZQ09DRzsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgLyogT2xkIHZlcnNpb24gZG9lcyBub3QgaGF2ZSBhIHJlYWwgaGVhZGVyLCBqdXN0IHNpemUgYW5kIHR5cGUuICovCiAgICAgICAgIHNpemUgPSB0YWcgJiAweDAwRkZGRkZGOwpAQCAtMzk3LDEzICsxMTI5LDE3IEBACiAgICAgICAgICAgICBjdHgtPnRleF9mdW5jdCA9IGN0eC0+dGV4ZHNwLmR4dDFfYmxvY2s7CiAgICAgICAgICAgICBjdHgtPnRleF9zdGVwICA9IDg7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGhlYWRlciAoMHglMDhYKVxuLiIsIHRhZyk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGhlYWRlciAoMHglMDgiUFJJWDMyIilcbi4iLCB0YWcpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KICAgICAgICAgY3R4LT50ZXhfcmF0ID0gMTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgY3R4LT5zbGljZV9jb3VudCA9IGF2X2NsaXAoYXZjdHgtPnRocmVhZF9jb3VudCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0IC8gRkZNQVgoY3R4LT50ZXh0dXJlX2Jsb2NrX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3RleHR1cmVfYmxvY2tfaCkpOworCiAgICAgLyogTmV3IGhlYWRlciBpcyAxMiBieXRlcyBsb25nLiAqLwogICAgIGlmICghb2xkX3R5cGUpIHsKICAgICAgICAgdmVyc2lvbl9tYWpvciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiYykgLSAxOwpAQCAtNDI1LDIwICsxMTYxLDQ0IEBACiAKICAgICBpZiAoc2l6ZSAhPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYmMpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkluY29tcGxldGUgb3IgaW52YWxpZCBmaWxlIChoZWFkZXIgJWQsIGxlZnQgJWQpLlxuIiwKKyAgICAgICAgICAgICAgICJJbmNvbXBsZXRlIG9yIGludmFsaWQgZmlsZSAoaGVhZGVyICVkLCBsZWZ0ICV1KS5cbiIsCiAgICAgICAgICAgICAgICBzaXplLCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYmMpKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgY3R4LT50ZXhfc2l6ZSA9IGF2Y3R4LT5jb2RlZF93aWR0aCAqIGF2Y3R4LT5jb2RlZF9oZWlnaHQgKiA0IC8gY3R4LT50ZXhfcmF0OwotICAgIHJldCA9IGF2X3JlYWxsb2NwKCZjdHgtPnRleF9kYXRhLCBjdHgtPnRleF9zaXplKTsKKyAgICByZXQgPSBhdl9yZWFsbG9jcCgmY3R4LT50ZXhfZGF0YSwgY3R4LT50ZXhfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCisgICAgaWYgKGN0eC0+Y3RleF9zaXplKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGN0eC0+b3Bfc2l6ZVswXSA9IGF2Y3R4LT5jb2RlZF93aWR0aCAqIGF2Y3R4LT5jb2RlZF9oZWlnaHQgLyAxNjsKKyAgICAgICAgY3R4LT5vcF9zaXplWzFdID0gYXZjdHgtPmNvZGVkX3dpZHRoICogYXZjdHgtPmNvZGVkX2hlaWdodCAvIDMyOworICAgICAgICBjdHgtPm9wX3NpemVbMl0gPSBhdmN0eC0+Y29kZWRfd2lkdGggKiBhdmN0eC0+Y29kZWRfaGVpZ2h0IC8gMzI7CisgICAgICAgIGN0eC0+b3Bfc2l6ZVszXSA9IGF2Y3R4LT5jb2RlZF93aWR0aCAqIGF2Y3R4LT5jb2RlZF9oZWlnaHQgLyAxNjsKKworICAgICAgICByZXQgPSBhdl9yZWFsbG9jcCgmY3R4LT5jdGV4X2RhdGEsIGN0eC0+Y3RleF9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gYXZfcmVhbGxvY3AoJmN0eC0+b3BfZGF0YVtpXSwgY3R4LT5vcF9zaXplW2ldKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiBEZWNvbXByZXNzIHRleHR1cmUgb3V0IG9mIHRoZSBpbnRlcm1lZGlhdGUgY29tcHJlc3Npb24uICovCiAgICAgcmV0ID0gZGVjb21wcmVzc190ZXgoYXZjdHgpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OworICAgIHsKKyAgICAgICAgaW50IHdfYmxvY2sgPSBhdmN0eC0+Y29kZWRfd2lkdGggLyBjdHgtPnRleHR1cmVfYmxvY2tfdzsKKyAgICAgICAgaW50IGhfYmxvY2sgPSBhdmN0eC0+Y29kZWRfaGVpZ2h0IC8gY3R4LT50ZXh0dXJlX2Jsb2NrX2g7CisgICAgICAgIGlmICh3X2Jsb2NrICogaF9ibG9jayAqIGN0eC0+dGV4X3N0ZXAgPiBjdHgtPnRleF9zaXplICogOExMKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQogCiAgICAgdGZyYW1lLmYgPSBkYXRhOwogICAgIHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmdGZyYW1lLCAwKTsKQEAgLTQ3MywxMCArMTIzMyw2IEBACiAgICAgYXZjdHgtPmNvZGVkX2hlaWdodCA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgMTYpOwogCiAgICAgZmZfdGV4dHVyZWRzcF9pbml0KCZjdHgtPnRleGRzcCk7Ci0gICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQkE7Ci0KLSAgICBjdHgtPnNsaWNlX2NvdW50ID0gYXZfY2xpcChhdmN0eC0+dGhyZWFkX2NvdW50LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQgLyBURVhUVVJFX0JMT0NLX0gpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC00ODYsNiArMTI0MiwxMSBAQAogICAgIERYVkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKICAgICBhdl9mcmVlcCgmY3R4LT50ZXhfZGF0YSk7CisgICAgYXZfZnJlZXAoJmN0eC0+Y3RleF9kYXRhKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5vcF9kYXRhWzBdKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5vcF9kYXRhWzFdKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5vcF9kYXRhWzJdKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5vcF9kYXRhWzNdKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9keHZhMi5jIGIvbGliYXZjb2RlYy9keHZhMi5jCmluZGV4IDJjZjU3YWQuLjMyNDE2MTEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZHh2YTIuYworKysgYi9saWJhdmNvZGVjL2R4dmEyLmMKQEAgLTIyLDE1ICsyMiw3NDIgQEAKIAogI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGluaXRndWlkLmg+CiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZGVjb2RlLmgiCiAjaW5jbHVkZSAiZHh2YTJfaW50ZXJuYWwuaCIKIAotdm9pZCAqZmZfZHh2YTJfZ2V0X3N1cmZhY2UoY29uc3QgQVZGcmFtZSAqZnJhbWUpCisvKiBkZWZpbmUgYWxsIHRoZSBHVUlEcyB1c2VkIGRpcmVjdGx5IGhlcmUsCisgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBpbmNvbnNpc3RlbnQgZHh2YTJhcGkuaCB2ZXJzaW9ucyBpbiBtaW5ndy13NjQgYW5kIGRpZmZlcmVudCBNU1ZDIHZlcnNpb24gKi8KK0RFRklORV9HVUlEKGZmX0RYVkEyX01vZGVNUEVHMl9WTEQsICAgICAgMHhlZTI3NDE3ZiwgMHg1ZTI4LDB4NGU2NSwweGJlLDB4ZWEsMHgxZCwweDI2LDB4YjUsMHgwOCwweGFkLDB4YzkpOworREVGSU5FX0dVSUQoZmZfRFhWQTJfTW9kZU1QRUcyYW5kMV9WTEQsICAweDg2Njk1ZjEyLCAweDM0MGUsMHg0ZjA0LDB4OWYsMHhkMywweDkyLDB4NTMsMHhkZCwweDMyLDB4NzQsMHg2MCk7CitERUZJTkVfR1VJRChmZl9EWFZBMl9Nb2RlSDI2NF9FLCAgICAgICAgIDB4MWI4MWJlNjgsIDB4YTBjNywweDExZDMsMHhiOSwweDg0LDB4MDAsMHhjMCwweDRmLDB4MmUsMHg3MywweGM1KTsKK0RFRklORV9HVUlEKGZmX0RYVkEyX01vZGVIMjY0X0YsICAgICAgICAgMHgxYjgxYmU2OSwgMHhhMGM3LDB4MTFkMywweGI5LDB4ODQsMHgwMCwweGMwLDB4NGYsMHgyZSwweDczLDB4YzUpOworREVGSU5FX0dVSUQoZmZfRFhWQURESV9JbnRlbF9Nb2RlSDI2NF9FLCAweDYwNEY4RTY4LCAweDQ5NTEsMHg0QzU0LDB4ODgsMHhGRSwweEFCLDB4RDIsMHg1QywweDE1LDB4QjMsMHhENik7CitERUZJTkVfR1VJRChmZl9EWFZBMl9Nb2RlVkMxX0QsICAgICAgICAgIDB4MWI4MWJlQTMsIDB4YTBjNywweDExZDMsMHhiOSwweDg0LDB4MDAsMHhjMCwweDRmLDB4MmUsMHg3MywweGM1KTsKK0RFRklORV9HVUlEKGZmX0RYVkEyX01vZGVWQzFfRDIwMTAsICAgICAgMHgxYjgxYmVBNCwgMHhhMGM3LDB4MTFkMywweGI5LDB4ODQsMHgwMCwweGMwLDB4NGYsMHgyZSwweDczLDB4YzUpOworREVGSU5FX0dVSUQoZmZfRFhWQTJfTW9kZUhFVkNfVkxEX01haW4sICAweDViMTFkNTFiLCAweDJmNGMsMHg0NDUyLDB4YmMsMHhjMywweDA5LDB4ZjIsMHhhMSwweDE2LDB4MGMsMHhjMCk7CitERUZJTkVfR1VJRChmZl9EWFZBMl9Nb2RlSEVWQ19WTERfTWFpbjEwLDB4MTA3YWYwZTAsIDB4ZWYxYSwweDRkMTksMHhhYiwweGE4LDB4NjcsMHhhMSwweDYzLDB4MDcsMHgzZCwweDEzKTsKK0RFRklORV9HVUlEKGZmX0RYVkEyX01vZGVWUDlfVkxEX1Byb2ZpbGUwLDB4NDYzNzA3ZjgsMHhhMWQwLDB4NDU4NSwweDg3LDB4NmQsMHg4MywweGFhLDB4NmQsMHg2MCwweGI4LDB4OWUpOworREVGSU5FX0dVSUQoZmZfRFhWQTJfTW9kZVZQOV9WTERfMTBiaXRfUHJvZmlsZTIsMHhhNGM3NDllZiwweDZlY2YsMHg0OGFhLDB4ODQsMHg0OCwweDUwLDB4YTcsMHhhMSwweDE2LDB4NWYsMHhmNyk7CitERUZJTkVfR1VJRChmZl9EWFZBMl9Ob0VuY3J5cHQsICAgICAgICAgIDB4MWI4MWJlRDAsIDB4YTBjNywweDExZDMsMHhiOSwweDg0LDB4MDAsMHhjMCwweDRmLDB4MmUsMHg3MywweGM1KTsKK0RFRklORV9HVUlEKGZmX0dVSURfTlVMTCwgICAgICAgICAgICAgICAgMHgwMDAwMDAwMCwgMHgwMDAwLDB4MDAwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDApOworREVGSU5FX0dVSUQoZmZfSUlEX0lEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZSwgMHhmYzUxYTU1MSwweGQ1ZTcsMHgxMWQ5LDB4YWYsMHg1NSwweDAwLDB4MDUsMHg0ZSwweDQzLDB4ZmYsMHgwMik7CisKK3R5cGVkZWYgc3RydWN0IGR4dmFfbW9kZSB7CisgICAgY29uc3QgR1VJRCAgICAgKmd1aWQ7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWM7CisgICAgLy8gTGlzdCBvZiBzdXBwb3J0ZWQgcHJvZmlsZXMsIHRlcm1pbmF0ZWQgYnkgYSBGRl9QUk9GSUxFX1VOS05PV04gZW50cnkuCisgICAgLy8gSWYgTlVMTCwgZG9uJ3QgY2hlY2sgcHJvZmlsZS4KKyAgICBjb25zdCBpbnQgICAgICAqcHJvZmlsZXM7Cit9IGR4dmFfbW9kZTsKKworc3RhdGljIGNvbnN0IGludCBwcm9mX21wZWcyX21haW5bXSAgID0ge0ZGX1BST0ZJTEVfTVBFRzJfU0lNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX1BST0ZJTEVfTVBFRzJfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9QUk9GSUxFX1VOS05PV059Oworc3RhdGljIGNvbnN0IGludCBwcm9mX2gyNjRfaGlnaFtdICAgID0ge0ZGX1BST0ZJTEVfSDI2NF9DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9QUk9GSUxFX0gyNjRfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9QUk9GSUxFX0gyNjRfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9QUk9GSUxFX1VOS05PV059Oworc3RhdGljIGNvbnN0IGludCBwcm9mX2hldmNfbWFpbltdICAgID0ge0ZGX1BST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX1BST0ZJTEVfVU5LTk9XTn07CitzdGF0aWMgY29uc3QgaW50IHByb2ZfaGV2Y19tYWluMTBbXSAgPSB7RkZfUFJPRklMRV9IRVZDX01BSU5fMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfUFJPRklMRV9VTktOT1dOfTsKK3N0YXRpYyBjb25zdCBpbnQgcHJvZl92cDlfcHJvZmlsZTBbXSA9IHtGRl9QUk9GSUxFX1ZQOV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX1BST0ZJTEVfVU5LTk9XTn07CitzdGF0aWMgY29uc3QgaW50IHByb2ZfdnA5X3Byb2ZpbGUyW10gPSB7RkZfUFJPRklMRV9WUDlfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9QUk9GSUxFX1VOS05PV059OworCitzdGF0aWMgY29uc3QgZHh2YV9tb2RlIGR4dmFfbW9kZXNbXSA9IHsKKyAgICAvKiBNUEVHLTIgKi8KKyAgICB7ICZmZl9EWFZBMl9Nb2RlTVBFRzJfVkxELCAgICAgICBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBwcm9mX21wZWcyX21haW4gfSwKKyAgICB7ICZmZl9EWFZBMl9Nb2RlTVBFRzJhbmQxX1ZMRCwgICBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBwcm9mX21wZWcyX21haW4gfSwKKworICAgIC8qIEguMjY0ICovCisgICAgeyAmZmZfRFhWQTJfTW9kZUgyNjRfRiwgICAgICAgICAgQVZfQ09ERUNfSURfSDI2NCwgcHJvZl9oMjY0X2hpZ2ggfSwKKyAgICB7ICZmZl9EWFZBMl9Nb2RlSDI2NF9FLCAgICAgICAgICBBVl9DT0RFQ19JRF9IMjY0LCBwcm9mX2gyNjRfaGlnaCB9LAorICAgIC8qIEludGVsIHNwZWNpZmljIEguMjY0IG1vZGUgKi8KKyAgICB7ICZmZl9EWFZBRERJX0ludGVsX01vZGVIMjY0X0UsICBBVl9DT0RFQ19JRF9IMjY0LCBwcm9mX2gyNjRfaGlnaCB9LAorCisgICAgLyogVkMtMSAvIFdNVjMgKi8KKyAgICB7ICZmZl9EWFZBMl9Nb2RlVkMxX0QyMDEwLCAgICAgICBBVl9DT0RFQ19JRF9WQzEgfSwKKyAgICB7ICZmZl9EWFZBMl9Nb2RlVkMxX0QyMDEwLCAgICAgICBBVl9DT0RFQ19JRF9XTVYzIH0sCisgICAgeyAmZmZfRFhWQTJfTW9kZVZDMV9ELCAgICAgICAgICAgQVZfQ09ERUNfSURfVkMxIH0sCisgICAgeyAmZmZfRFhWQTJfTW9kZVZDMV9ELCAgICAgICAgICAgQVZfQ09ERUNfSURfV01WMyB9LAorCisgICAgLyogSEVWQy9ILjI2NSAqLworICAgIHsgJmZmX0RYVkEyX01vZGVIRVZDX1ZMRF9NYWluMTAsIEFWX0NPREVDX0lEX0hFVkMsIHByb2ZfaGV2Y19tYWluMTAgfSwKKyAgICB7ICZmZl9EWFZBMl9Nb2RlSEVWQ19WTERfTWFpbiwgICBBVl9DT0RFQ19JRF9IRVZDLCBwcm9mX2hldmNfbWFpbiB9LAorCisgICAgLyogVlA4LzkgKi8KKyAgICB7ICZmZl9EWFZBMl9Nb2RlVlA5X1ZMRF9Qcm9maWxlMCwgICAgICAgQVZfQ09ERUNfSURfVlA5LCBwcm9mX3ZwOV9wcm9maWxlMCB9LAorICAgIHsgJmZmX0RYVkEyX01vZGVWUDlfVkxEXzEwYml0X1Byb2ZpbGUyLCBBVl9DT0RFQ19JRF9WUDksIHByb2ZfdnA5X3Byb2ZpbGUyIH0sCisKKyAgICB7IE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAwIH0sCit9OworCitzdGF0aWMgaW50IGR4dmFfZ2V0X2RlY29kZXJfY29uZmlndXJhdGlvbihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjZmdfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNmZ19jb3VudCkKIHsKKyAgICBGRkRYVkFTaGFyZWRDb250ZXh0ICpzY3R4ID0gRFhWQV9TSEFSRURfQ09OVEVYVChhdmN0eCk7CisgICAgdW5zaWduZWQgaSwgYmVzdF9zY29yZSA9IDA7CisgICAgaW50IGJlc3RfY2ZnID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2ZnX2NvdW50OyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgc2NvcmU7CisgICAgICAgIFVJTlQgQ29uZmlnQml0c3RyZWFtUmF3OworICAgICAgICBHVUlEIGd1aWRDb25maWdCaXRzdHJlYW1FbmNyeXB0aW9uOworCisjaWYgQ09ORklHX0QzRDExVkEKKyAgICAgICAgaWYgKHNjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkgeworICAgICAgICAgICAgRDNEMTFfVklERU9fREVDT0RFUl9DT05GSUcgKmNmZyA9ICYoKEQzRDExX1ZJREVPX0RFQ09ERVJfQ09ORklHICopY2ZnX2xpc3QpW2ldOworICAgICAgICAgICAgQ29uZmlnQml0c3RyZWFtUmF3ID0gY2ZnLT5Db25maWdCaXRzdHJlYW1SYXc7CisgICAgICAgICAgICBndWlkQ29uZmlnQml0c3RyZWFtRW5jcnlwdGlvbiA9IGNmZy0+Z3VpZENvbmZpZ0JpdHN0cmVhbUVuY3J5cHRpb247CisgICAgICAgIH0KKyNlbmRpZgorI2lmIENPTkZJR19EWFZBMgorICAgICAgICBpZiAoc2N0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0RYVkEyX1ZMRCkgeworICAgICAgICAgICAgRFhWQTJfQ29uZmlnUGljdHVyZURlY29kZSAqY2ZnID0gJigoRFhWQTJfQ29uZmlnUGljdHVyZURlY29kZSAqKWNmZ19saXN0KVtpXTsKKyAgICAgICAgICAgIENvbmZpZ0JpdHN0cmVhbVJhdyA9IGNmZy0+Q29uZmlnQml0c3RyZWFtUmF3OworICAgICAgICAgICAgZ3VpZENvbmZpZ0JpdHN0cmVhbUVuY3J5cHRpb24gPSBjZmctPmd1aWRDb25maWdCaXRzdHJlYW1FbmNyeXB0aW9uOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiAoQ29uZmlnQml0c3RyZWFtUmF3ID09IDEpCisgICAgICAgICAgICBzY29yZSA9IDE7CisgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmIENvbmZpZ0JpdHN0cmVhbVJhdyA9PSAyKQorICAgICAgICAgICAgc2NvcmUgPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKElzRXF1YWxHVUlEKCZndWlkQ29uZmlnQml0c3RyZWFtRW5jcnlwdGlvbiwgJmZmX0RYVkEyX05vRW5jcnlwdCkpCisgICAgICAgICAgICBzY29yZSArPSAxNjsKKyAgICAgICAgaWYgKHNjb3JlID4gYmVzdF9zY29yZSkgeworICAgICAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOworICAgICAgICAgICAgYmVzdF9jZmcgPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFiZXN0X3Njb3JlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJObyB2YWxpZCBkZWNvZGVyIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gYmVzdF9jZmc7Cit9CisKKyNpZiBDT05GSUdfRDNEMTFWQQorc3RhdGljIGludCBkM2QxMXZhX3ZhbGlkYXRlX291dHB1dCh2b2lkICpzZXJ2aWNlLCBHVUlEIGd1aWQsIGNvbnN0IHZvaWQgKnN1cmZhY2VfZm9ybWF0KQoreworICAgIEhSRVNVTFQgaHI7CisgICAgQk9PTCBpc19zdXBwb3J0ZWQgPSBGQUxTRTsKKyAgICBociA9IElEM0QxMVZpZGVvRGV2aWNlX0NoZWNrVmlkZW9EZWNvZGVyRm9ybWF0KChJRDNEMTFWaWRlb0RldmljZSAqKXNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooRFhHSV9GT1JNQVQgKilzdXJmYWNlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpc19zdXBwb3J0ZWQpOworICAgIHJldHVybiBTVUNDRUVERUQoaHIpICYmIGlzX3N1cHBvcnRlZDsKK30KKyNlbmRpZgorCisjaWYgQ09ORklHX0RYVkEyCitzdGF0aWMgaW50IGR4dmEyX3ZhbGlkYXRlX291dHB1dCh2b2lkICpkZWNvZGVyX3NlcnZpY2UsIEdVSUQgZ3VpZCwgY29uc3Qgdm9pZCAqc3VyZmFjZV9mb3JtYXQpCit7CisgICAgSFJFU1VMVCBocjsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1bnNpZ25lZCBqLCB0YXJnZXRfY291bnQ7CisgICAgRDNERk9STUFUICp0YXJnZXRfbGlzdDsKKyAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZV9HZXREZWNvZGVyUmVuZGVyVGFyZ2V0cygoSURpcmVjdFhWaWRlb0RlY29kZXJTZXJ2aWNlICopZGVjb2Rlcl9zZXJ2aWNlLCAmZ3VpZCwgJnRhcmdldF9jb3VudCwgJnRhcmdldF9saXN0KTsKKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGFyZ2V0X2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEQzREZPUk1BVCBmb3JtYXQgPSB0YXJnZXRfbGlzdFtqXTsKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gKihEM0RGT1JNQVQgKilzdXJmYWNlX2Zvcm1hdCkgeworICAgICAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ29UYXNrTWVtRnJlZSh0YXJnZXRfbGlzdCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkeHZhX2NoZWNrX2NvZGVjX2NvbXBhdGliaWxpdHkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBkeHZhX21vZGUgKm1vZGUpCit7CisgICAgaWYgKG1vZGUtPmNvZGVjICE9IGF2Y3R4LT5jb2RlY19pZCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKG1vZGUtPnByb2ZpbGVzICYmICEoYXZjdHgtPmh3YWNjZWxfZmxhZ3MgJiBBVl9IV0FDQ0VMX0ZMQUdfQUxMT1dfUFJPRklMRV9NSVNNQVRDSCkpIHsKKyAgICAgICAgaW50IGksIGZvdW5kID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgbW9kZS0+cHJvZmlsZXNbaV0gIT0gRkZfUFJPRklMRV9VTktOT1dOOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+cHJvZmlsZSA9PSBtb2RlLT5wcm9maWxlc1tpXSkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGR4dmFfbGlzdF9ndWlkc19kZWJ1ZyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBndWlkX2NvdW50LCBjb25zdCBHVUlEICpndWlkX2xpc3QpCit7CisgICAgRkZEWFZBU2hhcmVkQ29udGV4dCAqc2N0eCA9IERYVkFfU0hBUkVEX0NPTlRFWFQoYXZjdHgpOworICAgIGludCBpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkRlY29kZXIgR1VJRHMgcmVwb3J0ZWQgYXMgc3VwcG9ydGVkOlxuIik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3VpZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGNvbnN0IEdVSUQgKmd1aWQgPSAmZ3VpZF9saXN0W2ldOworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgInslOC44eC0lNC40eC0lNC40eC0lMi4yeCUyLjJ4LSUyLjJ4JTIuMnglMi4yeCUyLjJ4JTIuMnglMi4yeH0iLAorICAgICAgICAgICAgICh1bnNpZ25lZCkgZ3VpZC0+RGF0YTEsIGd1aWQtPkRhdGEyLCBndWlkLT5EYXRhMywKKyAgICAgICAgICAgICBndWlkLT5EYXRhNFswXSwgZ3VpZC0+RGF0YTRbMV0sCisgICAgICAgICAgICAgZ3VpZC0+RGF0YTRbMl0sIGd1aWQtPkRhdGE0WzNdLAorICAgICAgICAgICAgIGd1aWQtPkRhdGE0WzRdLCBndWlkLT5EYXRhNFs1XSwKKyAgICAgICAgICAgICBndWlkLT5EYXRhNFs2XSwgZ3VpZC0+RGF0YTRbN10pOworCisjaWYgQ09ORklHX0QzRDExVkEKKyAgICAgICAgaWYgKHNjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkgeworICAgICAgICAgICAgRFhHSV9GT1JNQVQgZm9ybWF0OworICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgbWF4aW11bSB2YWxpZCBEWEdJX0ZPUk1BVCwgc28gdXNlIDIwMCBhcworICAgICAgICAgICAgLy8gYXJiaXRyYXJ5IHVwcGVyIGJvdW5kICh0aGF0IGNvdWxkIGJlY29tZSBvdXRkYXRlZCkuCisgICAgICAgICAgICBmb3IgKGZvcm1hdCA9IDA7IGZvcm1hdCA8IDIwMDsgZm9ybWF0KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZDNkMTF2YV92YWxpZGF0ZV9vdXRwdXQoc2VydmljZSwgKmd1aWQsICZmb3JtYXQpKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiICVkIiwgKGludClmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICAgICAgaWYgKHNjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EWFZBMl9WTEQpIHsKKyAgICAgICAgICAgIGNvbnN0IEQzREZPUk1BVCBmb3JtYXRzW10gPSB7TUtUQUcoJ04nLCAnVicsICcxJywgJzInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUtUQUcoJ1AnLCAnMCcsICcxJywgJzAnKX07CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhmb3JtYXRzKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGR4dmEyX3ZhbGlkYXRlX291dHB1dChzZXJ2aWNlLCAqZ3VpZCwgJmZvcm1hdHNbaV0pKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiICVkIiwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiXG4iKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZHh2YV9nZXRfZGVjb2Rlcl9ndWlkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqc2VydmljZSwgdm9pZCAqc3VyZmFjZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBndWlkX2NvdW50LCBjb25zdCBHVUlEICpndWlkX2xpc3QsIEdVSUQgKmRlY29kZXJfZ3VpZCkKK3sKKyAgICBGRkRYVkFTaGFyZWRDb250ZXh0ICpzY3R4ID0gRFhWQV9TSEFSRURfQ09OVEVYVChhdmN0eCk7CisgICAgdW5zaWduZWQgaSwgajsKKworICAgIGR4dmFfbGlzdF9ndWlkc19kZWJ1ZyhhdmN0eCwgc2VydmljZSwgZ3VpZF9jb3VudCwgZ3VpZF9saXN0KTsKKworICAgICpkZWNvZGVyX2d1aWQgPSBmZl9HVUlEX05VTEw7CisgICAgZm9yIChpID0gMDsgZHh2YV9tb2Rlc1tpXS5ndWlkOyBpKyspIHsKKyAgICAgICAgY29uc3QgZHh2YV9tb2RlICptb2RlID0gJmR4dmFfbW9kZXNbaV07CisgICAgICAgIGludCB2YWxpZGF0ZTsKKyAgICAgICAgaWYgKCFkeHZhX2NoZWNrX2NvZGVjX2NvbXBhdGliaWxpdHkoYXZjdHgsIG1vZGUpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGd1aWRfY291bnQ7IGorKykgeworICAgICAgICAgICAgaWYgKElzRXF1YWxHVUlEKG1vZGUtPmd1aWQsICZndWlkX2xpc3Rbal0pKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChqID09IGd1aWRfY291bnQpCisgICAgICAgICAgICBjb250aW51ZTsKKworI2lmIENPTkZJR19EM0QxMVZBCisgICAgICAgIGlmIChzY3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTEpCisgICAgICAgICAgICB2YWxpZGF0ZSA9IGQzZDExdmFfdmFsaWRhdGVfb3V0cHV0KHNlcnZpY2UsICptb2RlLT5ndWlkLCBzdXJmYWNlX2Zvcm1hdCk7CisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICAgICAgaWYgKHNjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EWFZBMl9WTEQpCisgICAgICAgICAgICB2YWxpZGF0ZSA9IGR4dmEyX3ZhbGlkYXRlX291dHB1dChzZXJ2aWNlLCAqbW9kZS0+Z3VpZCwgc3VyZmFjZV9mb3JtYXQpOworI2VuZGlmCisgICAgICAgIGlmICh2YWxpZGF0ZSkgeworICAgICAgICAgICAgKmRlY29kZXJfZ3VpZCA9ICptb2RlLT5ndWlkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoSXNFcXVhbEdVSUQoZGVjb2Rlcl9ndWlkLCAmZmZfR1VJRF9OVUxMKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiTm8gZGVjb2RlciBkZXZpY2UgZm9yIGNvZGVjIGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoSXNFcXVhbEdVSUQoZGVjb2Rlcl9ndWlkLCAmZmZfRFhWQURESV9JbnRlbF9Nb2RlSDI2NF9FKSkKKyAgICAgICAgc2N0eC0+d29ya2Fyb3VuZCB8PSBGRl9EWFZBMl9XT1JLQVJPVU5EX0lOVEVMX0NMRUFSVklERU87CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYnVmcmVmX2ZyZWVfaW50ZXJmYWNlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBJVW5rbm93bl9SZWxlYXNlKChJVW5rbm93biAqKW9wYXF1ZSk7Cit9CisKK3N0YXRpYyBBVkJ1ZmZlclJlZiAqYnVmcmVmX3dyYXBfaW50ZXJmYWNlKElVbmtub3duICppZmFjZSkKK3sKKyAgICByZXR1cm4gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCopaWZhY2UsIDEsIGJ1ZnJlZl9mcmVlX2ludGVyZmFjZSwgaWZhY2UsIDApOworfQorCisjaWYgQ09ORklHX0RYVkEyCisKK3N0YXRpYyBpbnQgZHh2YTJfZ2V0X2RlY29kZXJfY29uZmlndXJhdGlvbihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEdVSUQgKmRldmljZV9ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERYVkEyX1ZpZGVvRGVzYyAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBMl9Db25maWdQaWN0dXJlRGVjb2RlICpjb25maWcpCit7CisgICAgRkZEWFZBU2hhcmVkQ29udGV4dCAqc2N0eCA9IERYVkFfU0hBUkVEX0NPTlRFWFQoYXZjdHgpOworICAgIHVuc2lnbmVkIGNmZ19jb3VudDsKKyAgICBEWFZBMl9Db25maWdQaWN0dXJlRGVjb2RlICpjZmdfbGlzdDsKKyAgICBIUkVTVUxUIGhyOworICAgIGludCByZXQ7CisKKyAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZV9HZXREZWNvZGVyQ29uZmlndXJhdGlvbnMoc2N0eC0+ZHh2YTJfc2VydmljZSwgZGV2aWNlX2d1aWQsIGRlc2MsIE5VTEwsICZjZmdfY291bnQsICZjZmdfbGlzdCk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmV0cmlldmUgZGVjb2RlciBjb25maWd1cmF0aW9uc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0ID0gZHh2YV9nZXRfZGVjb2Rlcl9jb25maWd1cmF0aW9uKGF2Y3R4LCBjZmdfbGlzdCwgY2ZnX2NvdW50KTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgICpjb25maWcgPSBjZmdfbGlzdFtyZXRdOworICAgIENvVGFza01lbUZyZWUoY2ZnX2xpc3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHh2YTJfY3JlYXRlX2RlY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEZGRFhWQVNoYXJlZENvbnRleHQgKnNjdHggPSBEWFZBX1NIQVJFRF9DT05URVhUKGF2Y3R4KTsKKyAgICBHVUlEICpndWlkX2xpc3Q7CisgICAgdW5zaWduZWQgZ3VpZF9jb3VudDsKKyAgICBHVUlEIGRldmljZV9ndWlkOworICAgIEQzREZPUk1BVCBzdXJmYWNlX2Zvcm1hdCA9IGF2Y3R4LT5zd19waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUDEwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNS1RBRygnUCcsICcwJywgJzEnLCAnMCcpIDogTUtUQUcoJ04nLCAnVicsICcxJywgJzInKTsKKyAgICBEWFZBMl9WaWRlb0Rlc2MgZGVzYyA9IHsgMCB9OworICAgIERYVkEyX0NvbmZpZ1BpY3R1cmVEZWNvZGUgY29uZmlnOworICAgIEhSRVNVTFQgaHI7CisgICAgaW50IHJldDsKKyAgICBIQU5ETEUgZGV2aWNlX2hhbmRsZTsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZEWFZBMkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGZyYW1lc19jdHgtPmh3Y3R4OworICAgIEFWRFhWQTJEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBmcmFtZXNfY3R4LT5kZXZpY2VfY3R4LT5od2N0eDsKKworICAgIGhyID0gSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfT3BlbkRldmljZUhhbmRsZShkZXZpY2VfaHdjdHgtPmRldm1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZV9oYW5kbGUpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gYSBkZXZpY2UgaGFuZGxlXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGhyID0gSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfR2V0VmlkZW9TZXJ2aWNlKGRldmljZV9od2N0eC0+ZGV2bWdyLCBkZXZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZl9JSURfSURpcmVjdFhWaWRlb0RlY29kZXJTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZzY3R4LT5keHZhMl9zZXJ2aWNlKTsKKyAgICBJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOV9DbG9zZURldmljZUhhbmRsZShkZXZpY2VfaHdjdHgtPmRldm1nciwgZGV2aWNlX2hhbmRsZSk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZV9HZXREZWNvZGVyRGV2aWNlR3VpZHMoc2N0eC0+ZHh2YTJfc2VydmljZSwgJmd1aWRfY291bnQsICZndWlkX2xpc3QpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJldHJpZXZlIGRlY29kZXIgZGV2aWNlIEdVSURzXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IGR4dmFfZ2V0X2RlY29kZXJfZ3VpZChhdmN0eCwgc2N0eC0+ZHh2YTJfc2VydmljZSwgJnN1cmZhY2VfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWlkX2NvdW50LCBndWlkX2xpc3QsICZkZXZpY2VfZ3VpZCk7CisgICAgQ29UYXNrTWVtRnJlZShndWlkX2xpc3QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBkZXNjLlNhbXBsZVdpZHRoICA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICBkZXNjLlNhbXBsZUhlaWdodCA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisgICAgZGVzYy5Gb3JtYXQgICAgICAgPSBzdXJmYWNlX2Zvcm1hdDsKKworICAgIHJldCA9IGR4dmEyX2dldF9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oYXZjdHgsICZkZXZpY2VfZ3VpZCwgJmRlc2MsICZjb25maWcpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZV9DcmVhdGVWaWRlb0RlY29kZXIoc2N0eC0+ZHh2YTJfc2VydmljZSwgJmRldmljZV9ndWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYywgJmNvbmZpZywgZnJhbWVzX2h3Y3R4LT5zdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlcywgJnNjdHgtPmR4dmEyX2RlY29kZXIpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBEWFZBMiB2aWRlbyBkZWNvZGVyXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHNjdHgtPmR4dmEyX2NvbmZpZyA9IGNvbmZpZzsKKworICAgIHNjdHgtPmRlY29kZXJfcmVmID0gYnVmcmVmX3dyYXBfaW50ZXJmYWNlKChJVW5rbm93biAqKXNjdHgtPmR4dmEyX2RlY29kZXIpOworICAgIGlmICghc2N0eC0+ZGVjb2Rlcl9yZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworI2VuZGlmCisKKyNpZiBDT05GSUdfRDNEMTFWQQorCitzdGF0aWMgaW50IGQzZDExdmFfZ2V0X2RlY29kZXJfY29uZmlndXJhdGlvbihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDNEMTFWaWRlb0RldmljZSAqdmlkZW9fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRDNEMTFfVklERU9fREVDT0RFUl9ERVNDICpkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEMTFfVklERU9fREVDT0RFUl9DT05GSUcgKmNvbmZpZykKK3sKKyAgICB1bnNpZ25lZCBjZmdfY291bnQgPSAwOworICAgIEQzRDExX1ZJREVPX0RFQ09ERVJfQ09ORklHICpjZmdfbGlzdCA9IE5VTEw7CisgICAgSFJFU1VMVCBocjsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaHIgPSBJRDNEMTFWaWRlb0RldmljZV9HZXRWaWRlb0RlY29kZXJDb25maWdDb3VudCh2aWRlb19kZXZpY2UsIGRlc2MsICZjZmdfY291bnQpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJldHJpZXZlIGRlY29kZXIgY29uZmlndXJhdGlvbnNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGNmZ19saXN0ID0gYXZfbWFsbG9jX2FycmF5KGNmZ19jb3VudCwgc2l6ZW9mKEQzRDExX1ZJREVPX0RFQ09ERVJfQ09ORklHKSk7CisgICAgaWYgKGNmZ19saXN0ID09IE5VTEwpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IGNmZ19jb3VudDsgaSsrKSB7CisgICAgICAgIGhyID0gSUQzRDExVmlkZW9EZXZpY2VfR2V0VmlkZW9EZWNvZGVyQ29uZmlnKHZpZGVvX2RldmljZSwgZGVzYywgaSwgJmNmZ19saXN0W2ldKTsKKyAgICAgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJldHJpZXZlIGRlY29kZXIgY29uZmlndXJhdGlvbnMuIChocj0weCVsWClcbiIsIGhyKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoY2ZnX2xpc3QpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IGR4dmFfZ2V0X2RlY29kZXJfY29uZmlndXJhdGlvbihhdmN0eCwgY2ZnX2xpc3QsIGNmZ19jb3VudCk7CisgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAqY29uZmlnID0gY2ZnX2xpc3RbcmV0XTsKKyAgICBhdl9mcmVlKGNmZ19saXN0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgRFhHSV9GT1JNQVQgZDNkMTF2YV9tYXBfc3dfdG9faHdfZm9ybWF0KGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIHN3aXRjaCAocGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOiAgICAgICByZXR1cm4gRFhHSV9GT1JNQVRfTlYxMjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUDAxMDogICAgICAgcmV0dXJuIERYR0lfRk9STUFUX1AwMTA7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6ICAgIHJldHVybiBEWEdJX0ZPUk1BVF80MjBfT1BBUVVFOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gRFhHSV9GT1JNQVRfVU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZDNkMTF2YV9jcmVhdGVfZGVjb2RlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRkZEWFZBU2hhcmVkQ29udGV4dCAqc2N0eCA9IERYVkFfU0hBUkVEX0NPTlRFWFQoYXZjdHgpOworICAgIEdVSUQgKmd1aWRfbGlzdDsKKyAgICB1bnNpZ25lZCBndWlkX2NvdW50LCBpOworICAgIEdVSUQgZGVjb2Rlcl9ndWlkOworICAgIEQzRDExX1ZJREVPX0RFQ09ERVJfREVTQyBkZXNjID0geyAwIH07CisgICAgRDNEMTFfVklERU9fREVDT0RFUl9DT05GSUcgY29uZmlnOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0ICopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZEM0QxMVZBRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4ID0gZnJhbWVzX2N0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgQVZEM0QxMVZBRnJhbWVzQ29udGV4dCAqZnJhbWVzX2h3Y3R4ID0gZnJhbWVzX2N0eC0+aHdjdHg7CisgICAgRFhHSV9GT1JNQVQgc3VyZmFjZV9mb3JtYXQgPSBkM2QxMXZhX21hcF9zd190b19od19mb3JtYXQoZnJhbWVzX2N0eC0+c3dfZm9ybWF0KTsKKyAgICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXhkZXNjOworICAgIEhSRVNVTFQgaHI7CisgICAgaW50IHJldDsKKworICAgIGlmICghZnJhbWVzX2h3Y3R4LT50ZXh0dXJlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQVZEM0QxMVZBRnJhbWVzQ29udGV4dC50ZXh0dXJlIG5vdCBzZXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgSUQzRDExVGV4dHVyZTJEX0dldERlc2MoZnJhbWVzX2h3Y3R4LT50ZXh0dXJlLCAmdGV4ZGVzYyk7CisKKyAgICBndWlkX2NvdW50ID0gSUQzRDExVmlkZW9EZXZpY2VfR2V0VmlkZW9EZWNvZGVyUHJvZmlsZUNvdW50KGRldmljZV9od2N0eC0+dmlkZW9fZGV2aWNlKTsKKyAgICBndWlkX2xpc3QgPSBhdl9tYWxsb2NfYXJyYXkoZ3VpZF9jb3VudCwgc2l6ZW9mKCpndWlkX2xpc3QpKTsKKyAgICBpZiAoZ3VpZF9saXN0ID09IE5VTEwgfHwgZ3VpZF9jb3VudCA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCB0aGUgZGVjb2RlciBHVUlEc1xuIik7CisgICAgICAgIGF2X2ZyZWUoZ3VpZF9saXN0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGd1aWRfY291bnQ7IGkrKykgeworICAgICAgICBociA9IElEM0QxMVZpZGVvRGV2aWNlX0dldFZpZGVvRGVjb2RlclByb2ZpbGUoZGV2aWNlX2h3Y3R4LT52aWRlb19kZXZpY2UsIGksICZndWlkX2xpc3RbaV0pOworICAgICAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmV0cmlldmUgZGVjb2RlciBHVUlEICVkXG4iLCBpKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoZ3VpZF9saXN0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBkeHZhX2dldF9kZWNvZGVyX2d1aWQoYXZjdHgsIGRldmljZV9od2N0eC0+dmlkZW9fZGV2aWNlLCAmc3VyZmFjZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWRfY291bnQsIGd1aWRfbGlzdCwgJmRlY29kZXJfZ3VpZCk7CisgICAgYXZfZnJlZShndWlkX2xpc3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgZGVzYy5TYW1wbGVXaWR0aCAgPSBhdmN0eC0+Y29kZWRfd2lkdGg7CisgICAgZGVzYy5TYW1wbGVIZWlnaHQgPSBhdmN0eC0+Y29kZWRfaGVpZ2h0OworICAgIGRlc2MuT3V0cHV0Rm9ybWF0ID0gc3VyZmFjZV9mb3JtYXQ7CisgICAgZGVzYy5HdWlkICAgICAgICAgPSBkZWNvZGVyX2d1aWQ7CisKKyAgICByZXQgPSBkM2QxMXZhX2dldF9kZWNvZGVyX2NvbmZpZ3VyYXRpb24oYXZjdHgsIGRldmljZV9od2N0eC0+dmlkZW9fZGV2aWNlLCAmZGVzYywgJmNvbmZpZyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBzY3R4LT5kM2QxMV92aWV3cyA9IGF2X21hbGxvY3pfYXJyYXkodGV4ZGVzYy5BcnJheVNpemUsIHNpemVvZihzY3R4LT5kM2QxMV92aWV3c1swXSkpOworICAgIGlmICghc2N0eC0+ZDNkMTFfdmlld3MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc2N0eC0+bmJfZDNkMTFfdmlld3MgPSB0ZXhkZXNjLkFycmF5U2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzY3R4LT5uYl9kM2QxMV92aWV3czsgaSsrKSB7CisgICAgICAgIEQzRDExX1ZJREVPX0RFQ09ERVJfT1VUUFVUX1ZJRVdfREVTQyB2aWV3RGVzYyA9IHsKKyAgICAgICAgICAgIC5EZWNvZGVQcm9maWxlID0gZGVjb2Rlcl9ndWlkLAorICAgICAgICAgICAgLlZpZXdEaW1lbnNpb24gPSBEM0QxMV9WRE9WX0RJTUVOU0lPTl9URVhUVVJFMkQsCisgICAgICAgICAgICAuVGV4dHVyZTJEID0geworICAgICAgICAgICAgICAgIC5BcnJheVNsaWNlID0gaSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgaHIgPSBJRDNEMTFWaWRlb0RldmljZV9DcmVhdGVWaWRlb0RlY29kZXJPdXRwdXRWaWV3KGRldmljZV9od2N0eC0+dmlkZW9fZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEM0QxMVJlc291cmNlKikgZnJhbWVzX2h3Y3R4LT50ZXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZpZXdEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElEM0QxMVZpZGVvRGVjb2Rlck91dHB1dFZpZXcqKikgJnNjdHgtPmQzZDExX3ZpZXdzW2ldKTsKKyAgICAgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSB0aGUgZGVjb2RlciBvdXRwdXQgdmlldyAlZFxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgaHIgPSBJRDNEMTFWaWRlb0RldmljZV9DcmVhdGVWaWRlb0RlY29kZXIoZGV2aWNlX2h3Y3R4LT52aWRlb19kZXZpY2UsICZkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25maWcsICZzY3R4LT5kM2QxMV9kZWNvZGVyKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgRDNEMTFWQSB2aWRlbyBkZWNvZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzY3R4LT5kM2QxMV9jb25maWcgPSBjb25maWc7CisgICAgc2N0eC0+ZDNkMTFfdGV4dHVyZSA9IGZyYW1lc19od2N0eC0+dGV4dHVyZTsKKworICAgIHNjdHgtPmRlY29kZXJfcmVmID0gYnVmcmVmX3dyYXBfaW50ZXJmYWNlKChJVW5rbm93biAqKXNjdHgtPmQzZDExX2RlY29kZXIpOworICAgIGlmICghc2N0eC0+ZGVjb2Rlcl9yZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZmX2R4dmEyX2xvY2soQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworI2lmIENPTkZJR19EM0QxMVZBCisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkgeworICAgICAgICBGRkRYVkFTaGFyZWRDb250ZXh0ICpzY3R4ID0gRFhWQV9TSEFSRURfQ09OVEVYVChhdmN0eCk7CisgICAgICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IERYVkFfQ09OVEVYVChhdmN0eCk7CisgICAgICAgIGlmIChEM0QxMVZBX0NPTlRFWFQoY3R4KS0+Y29udGV4dF9tdXRleCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgICAgIFdhaXRGb3JTaW5nbGVPYmplY3RFeChEM0QxMVZBX0NPTlRFWFQoY3R4KS0+Y29udGV4dF9tdXRleCwgSU5GSU5JVEUsIEZBTFNFKTsKKyAgICAgICAgaWYgKHNjdHgtPmRldmljZV9jdHgpIHsKKyAgICAgICAgICAgIEFWRDNEMTFWQURldmljZUNvbnRleHQgKmh3Y3R4ID0gc2N0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgICAgICAgICBod2N0eC0+bG9jayhod2N0eC0+bG9ja19jdHgpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIGZmX2R4dmEyX3VubG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisjaWYgQ09ORklHX0QzRDExVkEKKyAgICBpZiAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpKSB7CisgICAgICAgIEZGRFhWQVNoYXJlZENvbnRleHQgKnNjdHggPSBEWFZBX1NIQVJFRF9DT05URVhUKGF2Y3R4KTsKKyAgICAgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKKyAgICAgICAgaWYgKEQzRDExVkFfQ09OVEVYVChjdHgpLT5jb250ZXh0X211dGV4ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICAgICAgUmVsZWFzZU11dGV4KEQzRDExVkFfQ09OVEVYVChjdHgpLT5jb250ZXh0X211dGV4KTsKKyAgICAgICAgaWYgKHNjdHgtPmRldmljZV9jdHgpIHsKKyAgICAgICAgICAgIEFWRDNEMTFWQURldmljZUNvbnRleHQgKmh3Y3R4ID0gc2N0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgICAgICAgICBod2N0eC0+dW5sb2NrKGh3Y3R4LT5sb2NrX2N0eCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworaW50IGZmX2R4dmEyX2NvbW1vbl9mcmFtZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19jdHgpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQgKilod19mcmFtZXNfY3R4LT5kYXRhOworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpkZXZpY2VfY3R4ID0gZnJhbWVzX2N0eC0+ZGV2aWNlX2N0eDsKKyAgICBpbnQgc3VyZmFjZV9hbGlnbm1lbnQsIG51bV9zdXJmYWNlczsKKworICAgIGlmIChkZXZpY2VfY3R4LT50eXBlID09IEFWX0hXREVWSUNFX1RZUEVfRFhWQTIpIHsKKyAgICAgICAgZnJhbWVzX2N0eC0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9EWFZBMl9WTEQ7CisgICAgfSBlbHNlIGlmIChkZXZpY2VfY3R4LT50eXBlID09IEFWX0hXREVWSUNFX1RZUEVfRDNEMTFWQSkgeworICAgICAgICBmcmFtZXNfY3R4LT5mb3JtYXQgPSBBVl9QSVhfRk1UX0QzRDExOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogZGVjb2RpbmcgTVBFRy0yIHJlcXVpcmVzIGFkZGl0aW9uYWwgYWxpZ25tZW50IG9uIHNvbWUgSW50ZWwgR1BVcywKKyAgICBidXQgaXQgY2F1c2VzIGlzc3VlcyBmb3IgSC4yNjQgb24gY2VydGFpbiBBTUQgR1BVcy4uLi4uICovCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKQorICAgICAgICBzdXJmYWNlX2FsaWdubWVudCA9IDMyOworICAgIC8qIHRoZSBIRVZDIERYVkEyIHNwZWMgYXNrcyBmb3IgMTI4IHBpeGVsIGFsaWduZWQgc3VyZmFjZXMgdG8gZW5zdXJlCisgICAgYWxsIGNvZGluZyBmZWF0dXJlcyBoYXZlIGVub3VnaCByb29tIHRvIHdvcmsgd2l0aCAqLworICAgIGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDKQorICAgICAgICBzdXJmYWNlX2FsaWdubWVudCA9IDEyODsKKyAgICBlbHNlCisgICAgICAgIHN1cmZhY2VfYWxpZ25tZW50ID0gMTY7CisKKyAgICAvKiAxIGJhc2Ugd29yayBzdXJmYWNlICovCisgICAgbnVtX3N1cmZhY2VzID0gMTsKKworICAgIC8qIGFkZCBzdXJmYWNlcyBiYXNlZCBvbiBudW1iZXIgb2YgcG9zc2libGUgcmVmcyAqLworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQykKKyAgICAgICAgbnVtX3N1cmZhY2VzICs9IDE2OworICAgIGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpCisgICAgICAgIG51bV9zdXJmYWNlcyArPSA4OworICAgIGVsc2UKKyAgICAgICAgbnVtX3N1cmZhY2VzICs9IDI7CisKKyAgICBmcmFtZXNfY3R4LT5zd19mb3JtYXQgPSBhdmN0eC0+c3dfcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAxMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9QMDEwIDogQVZfUElYX0ZNVF9OVjEyOworICAgIGZyYW1lc19jdHgtPndpZHRoID0gRkZBTElHTihhdmN0eC0+Y29kZWRfd2lkdGgsIHN1cmZhY2VfYWxpZ25tZW50KTsKKyAgICBmcmFtZXNfY3R4LT5oZWlnaHQgPSBGRkFMSUdOKGF2Y3R4LT5jb2RlZF9oZWlnaHQsIHN1cmZhY2VfYWxpZ25tZW50KTsKKyAgICBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSA9IG51bV9zdXJmYWNlczsKKworCisjaWYgQ09ORklHX0RYVkEyCisgICAgaWYgKGZyYW1lc19jdHgtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX0RYVkEyX1ZMRCkgeworICAgICAgICBBVkRYVkEyRnJhbWVzQ29udGV4dCAqZnJhbWVzX2h3Y3R4ID0gZnJhbWVzX2N0eC0+aHdjdHg7CisKKyAgICAgICAgZnJhbWVzX2h3Y3R4LT5zdXJmYWNlX3R5cGUgPSBEWFZBMl9WaWRlb0RlY29kZXJSZW5kZXJUYXJnZXQ7CisgICAgfQorI2VuZGlmCisKKyNpZiBDT05GSUdfRDNEMTFWQQorICAgIGlmIChmcmFtZXNfY3R4LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkgeworICAgICAgICBBVkQzRDExVkFGcmFtZXNDb250ZXh0ICpmcmFtZXNfaHdjdHggPSBmcmFtZXNfY3R4LT5od2N0eDsKKworICAgICAgICBmcmFtZXNfaHdjdHgtPkJpbmRGbGFncyB8PSBEM0QxMV9CSU5EX0RFQ09ERVI7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2R4dmEyX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGRkRYVkFTaGFyZWRDb250ZXh0ICpzY3R4ID0gRFhWQV9TSEFSRURfQ09OVEVYVChhdmN0eCk7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHg7CisgICAgZW51bSBBVkhXRGV2aWNlVHlwZSBkZXZfdHlwZSA9IGF2Y3R4LT5od2FjY2VsLT5waXhfZm10ID09IEFWX1BJWF9GTVRfRFhWQTJfVkxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVl9IV0RFVklDRV9UWVBFX0RYVkEyIDogQVZfSFdERVZJQ0VfVFlQRV9EM0QxMVZBOworICAgIGludCByZXQgPSAwOworCisgICAgLy8gT2xkIEFQSS4KKyAgICBpZiAoYXZjdHgtPmh3YWNjZWxfY29udGV4dCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyAoYXZjdHgtPnBpeF9mbXQgaXMgbm90IHVwZGF0ZWQgeWV0IGF0IHRoaXMgcG9pbnQpCisgICAgc2N0eC0+cGl4X2ZtdCA9IGF2Y3R4LT5od2FjY2VsLT5waXhfZm10OworCisgICAgcmV0ID0gZmZfZGVjb2RlX2dldF9od19mcmFtZXNfY3R4KGF2Y3R4LCBkZXZfdHlwZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilhdmN0eC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICBzY3R4LT5kZXZpY2VfY3R4ID0gZnJhbWVzX2N0eC0+ZGV2aWNlX2N0eDsKKworICAgIGlmIChmcmFtZXNfY3R4LT5mb3JtYXQgIT0gc2N0eC0+cGl4X2ZtdCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGl4Zm10IGZvciBod2FjY2VsIVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworI2lmIENPTkZJR19EM0QxMVZBCisgICAgaWYgKHNjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkgeworICAgICAgICBBVkQzRDExVkFEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBmcmFtZXNfY3R4LT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICAgICAgQVZEM0QxMVZBQ29udGV4dCAqZDNkMTFfY3R4ID0gJnNjdHgtPmN0eC5kM2QxMXZhOworCisgICAgICAgIGZmX2R4dmEyX2xvY2soYXZjdHgpOworICAgICAgICByZXQgPSBkM2QxMXZhX2NyZWF0ZV9kZWNvZGVyKGF2Y3R4KTsKKyAgICAgICAgZmZfZHh2YTJfdW5sb2NrKGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgZDNkMTFfY3R4LT5kZWNvZGVyICAgICAgID0gc2N0eC0+ZDNkMTFfZGVjb2RlcjsKKyAgICAgICAgZDNkMTFfY3R4LT52aWRlb19jb250ZXh0ID0gZGV2aWNlX2h3Y3R4LT52aWRlb19jb250ZXh0OworICAgICAgICBkM2QxMV9jdHgtPmNmZyAgICAgICAgICAgPSAmc2N0eC0+ZDNkMTFfY29uZmlnOworICAgICAgICBkM2QxMV9jdHgtPnN1cmZhY2VfY291bnQgPSBzY3R4LT5uYl9kM2QxMV92aWV3czsKKyAgICAgICAgZDNkMTFfY3R4LT5zdXJmYWNlICAgICAgID0gc2N0eC0+ZDNkMTFfdmlld3M7CisgICAgICAgIGQzZDExX2N0eC0+d29ya2Fyb3VuZCAgICA9IHNjdHgtPndvcmthcm91bmQ7CisgICAgICAgIGQzZDExX2N0eC0+Y29udGV4dF9tdXRleCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KKyNlbmRpZgorCisjaWYgQ09ORklHX0RYVkEyCisgICAgaWYgKHNjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EWFZBMl9WTEQpIHsKKyAgICAgICAgQVZEWFZBMkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGZyYW1lc19jdHgtPmh3Y3R4OworICAgICAgICBzdHJ1Y3QgZHh2YV9jb250ZXh0ICpkeHZhX2N0eCA9ICZzY3R4LT5jdHguZHh2YTI7CisKKyAgICAgICAgZmZfZHh2YTJfbG9jayhhdmN0eCk7CisgICAgICAgIHJldCA9IGR4dmEyX2NyZWF0ZV9kZWNvZGVyKGF2Y3R4KTsKKyAgICAgICAgZmZfZHh2YTJfdW5sb2NrKGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgZHh2YV9jdHgtPmRlY29kZXIgICAgICAgPSBzY3R4LT5keHZhMl9kZWNvZGVyOworICAgICAgICBkeHZhX2N0eC0+Y2ZnICAgICAgICAgICA9ICZzY3R4LT5keHZhMl9jb25maWc7CisgICAgICAgIGR4dmFfY3R4LT5zdXJmYWNlICAgICAgID0gZnJhbWVzX2h3Y3R4LT5zdXJmYWNlczsKKyAgICAgICAgZHh2YV9jdHgtPnN1cmZhY2VfY291bnQgPSBmcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzOworICAgICAgICBkeHZhX2N0eC0+d29ya2Fyb3VuZCAgICA9IHNjdHgtPndvcmthcm91bmQ7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmZl9keHZhMl9kZWNvZGVfdW5pbml0KGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfZHh2YTJfZGVjb2RlX3VuaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgRkZEWFZBU2hhcmVkQ29udGV4dCAqc2N0eCA9IERYVkFfU0hBUkVEX0NPTlRFWFQoYXZjdHgpOworICAgIGludCBpOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZzY3R4LT5kZWNvZGVyX3JlZik7CisKKyNpZiBDT05GSUdfRDNEMTFWQQorICAgIGZvciAoaSA9IDA7IGkgPCBzY3R4LT5uYl9kM2QxMV92aWV3czsgaSsrKSB7CisgICAgICAgIGlmIChzY3R4LT5kM2QxMV92aWV3c1tpXSkKKyAgICAgICAgICAgIElEM0QxMVZpZGVvRGVjb2Rlck91dHB1dFZpZXdfUmVsZWFzZShzY3R4LT5kM2QxMV92aWV3c1tpXSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZzY3R4LT5kM2QxMV92aWV3cyk7CisjZW5kaWYKKworI2lmIENPTkZJR19EWFZBMgorICAgIGlmIChzY3R4LT5keHZhMl9zZXJ2aWNlKQorICAgICAgICBJRGlyZWN0WFZpZGVvRGVjb2RlclNlcnZpY2VfUmVsZWFzZShzY3R4LT5keHZhMl9zZXJ2aWNlKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkICpnZXRfc3VyZmFjZShjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworI2lmIENPTkZJR19EM0QxMVZBCisgICAgaWYgKGZyYW1lLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkgeworICAgICAgICBGRkRYVkFTaGFyZWRDb250ZXh0ICpzY3R4ID0gRFhWQV9TSEFSRURfQ09OVEVYVChhdmN0eCk7CisgICAgICAgIGludHB0cl90IGluZGV4ID0gKGludHB0cl90KWZyYW1lLT5kYXRhWzFdOworICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNjdHgtPm5iX2QzZDExX3ZpZXdzIHx8CisgICAgICAgICAgICBzY3R4LT5kM2QxMV90ZXh0dXJlICE9IChJRDNEMTFUZXh0dXJlMkQgKilmcmFtZS0+ZGF0YVswXSkgeworICAgICAgICAgICAgYXZfbG9nKCh2b2lkICopYXZjdHgsIEFWX0xPR19FUlJPUiwgImdldF9idWZmZXIgZnJhbWUgaXMgaW52YWxpZCFcbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNjdHgtPmQzZDExX3ZpZXdzW2luZGV4XTsKKyAgICB9CisjZW5kaWYKICAgICByZXR1cm4gZnJhbWUtPmRhdGFbM107CiB9CiAKQEAgLTM4LDEyICs3NjUsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRFhWQUNvbnRleHQgKmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQogewotICAgIHZvaWQgKnN1cmZhY2UgPSBmZl9keHZhMl9nZXRfc3VyZmFjZShmcmFtZSk7CisgICAgdm9pZCAqc3VyZmFjZSA9IGdldF9zdXJmYWNlKGF2Y3R4LCBmcmFtZSk7CiAgICAgdW5zaWduZWQgaTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBEWFZBX0NPTlRFWFRfQ09VTlQoYXZjdHgsIGN0eCk7IGkrKykKLSAgICAgICAgaWYgKERYVkFfQ09OVEVYVF9TVVJGQUNFKGF2Y3R4LCBjdHgsIGkpID09IHN1cmZhY2UpCisjaWYgQ09ORklHX0QzRDExVkEKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkKKyAgICAgICAgcmV0dXJuIChpbnRwdHJfdClmcmFtZS0+ZGF0YVsxXTsKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkgeworICAgICAgICBEM0QxMV9WSURFT19ERUNPREVSX09VVFBVVF9WSUVXX0RFU0Mgdmlld0Rlc2M7CisgICAgICAgIElEM0QxMVZpZGVvRGVjb2Rlck91dHB1dFZpZXdfR2V0RGVzYygoSUQzRDExVmlkZW9EZWNvZGVyT3V0cHV0VmlldyopIHN1cmZhY2UsICZ2aWV3RGVzYyk7CisgICAgICAgIHJldHVybiB2aWV3RGVzYy5UZXh0dXJlMkQuQXJyYXlTbGljZTsKKyAgICB9CisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICBmb3IgKGkgPSAwOyBpIDwgRFhWQV9DT05URVhUX0NPVU5UKGF2Y3R4LCBjdHgpOyBpKyspIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRFhWQTJfVkxEICYmIGN0eC0+ZHh2YTIuc3VyZmFjZVtpXSA9PSBzdXJmYWNlKQogICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorI2VuZGlmCiAKICAgICBhc3NlcnQoMCk7CiAgICAgcmV0dXJuIDA7CkBAIC02MSw3ICs4MDAsNyBAQAogICAgIEhSRVNVTFQgaHIgPSAwOwogCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkKKyAgICBpZiAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpKQogICAgICAgICBociA9IElEM0QxMVZpZGVvQ29udGV4dF9HZXREZWNvZGVyQnVmZmVyKEQzRDExVkFfQ09OVEVYVChjdHgpLT52aWRlb19jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRDExVkFfQ09OVEVYVChjdHgpLT5kZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsCkBAIC03MywxNSArODEyLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkeHZhX2RhdGEsICZkeHZhX3NpemUpOwogI2VuZGlmCiAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IGEgYnVmZmVyIGZvciAldTogMHglbHhcbiIsCi0gICAgICAgICAgICAgICB0eXBlLCBocik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBhIGJ1ZmZlciBmb3IgJXU6IDB4JXhcbiIsCisgICAgICAgICAgICAgICB0eXBlLCAodW5zaWduZWQpaHIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGlmIChzaXplIDw9IGR4dmFfc2l6ZSkgewogICAgICAgICBtZW1jcHkoZHh2YV9kYXRhLCBkYXRhLCBzaXplKTsKIAogI2lmIENPTkZJR19EM0QxMVZBCi0gICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKSB7CisgICAgICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpIHsKICAgICAgICAgICAgIEQzRDExX1ZJREVPX0RFQ09ERVJfQlVGRkVSX0RFU0MgKmRzYzExID0gZHNjOwogICAgICAgICAgICAgbWVtc2V0KGRzYzExLCAwLCBzaXplb2YoKmRzYzExKSk7CiAgICAgICAgICAgICBkc2MxMS0+QnVmZmVyVHlwZSAgICAgICAgICAgPSB0eXBlOwpAQCAtMTA2LDcgKzg0NSw3IEBACiAgICAgfQogCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkKKyAgICBpZiAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpKQogICAgICAgICBociA9IElEM0QxMVZpZGVvQ29udGV4dF9SZWxlYXNlRGVjb2RlckJ1ZmZlcihEM0QxMVZBX0NPTlRFWFQoY3R4KS0+dmlkZW9fY29udGV4dCwgRDNEMTFWQV9DT05URVhUKGN0eCktPmRlY29kZXIsIHR5cGUpOwogI2VuZGlmCiAjaWYgQ09ORklHX0RYVkEyCkBAIC0xMTUsMTMgKzg1NCwyOSBAQAogI2VuZGlmCiAgICAgaWYgKEZBSUxFRChocikpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlbGVhc2UgYnVmZmVyIHR5cGUgJXU6IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgdHlwZSwgaHIpOworICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWxlYXNlIGJ1ZmZlciB0eXBlICV1OiAweCV4XG4iLAorICAgICAgICAgICAgICAgdHlwZSwgKHVuc2lnbmVkKWhyKTsKICAgICAgICAgcmVzdWx0ID0gLTE7CiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0YXRpYyBpbnQgZnJhbWVfYWRkX2J1ZihBVkZyYW1lICpmcmFtZSwgQVZCdWZmZXJSZWYgKnJlZikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBBVl9OVU1fREFUQV9QT0lOVEVSUzsgaSsrKSB7CisgICAgICAgIGlmICghZnJhbWUtPmJ1ZltpXSkgeworICAgICAgICAgICAgZnJhbWUtPmJ1ZltpXSA9IGF2X2J1ZmZlcl9yZWYocmVmKTsKKyAgICAgICAgICAgIHJldHVybiBmcmFtZS0+YnVmW2ldID8gMCA6IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZvciBub3cgd2UgZXhwZWN0IHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdCB1c2UgbW9yZSB0aGFuCisgICAgLy8gQVZfTlVNX0RBVEFfUE9JTlRFUlMtMSBidWZmZXJzIGlmIHRoZSB1c2VyIHVzZXMgYSBjdXN0b20gcG9vbC4KKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCiBpbnQgZmZfZHh2YTJfY29tbW9uX2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcHAsIHVuc2lnbmVkIHBwX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpxbSwgdW5zaWduZWQgcW1fc2l6ZSwKQEAgLTEyOSw3ICs4ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPREVSX0JVRkZFUl9ERVNDICpicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT0RFUl9CVUZGRVJfREVTQyAqc2xpY2UpKQogewotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICB1bnNpZ25lZCAgICAgICAgICAgICAgIGJ1ZmZlcl9jb3VudCA9IDA7CiAjaWYgQ09ORklHX0QzRDExVkEKICAgICBEM0QxMV9WSURFT19ERUNPREVSX0JVRkZFUl9ERVNDIGJ1ZmZlcjExWzRdOwpAQCAtMTQxLDM5ICs4OTYsNDIgQEAKICAgICBpbnQgcmVzdWx0LCBydW5zID0gMDsKICAgICBIUkVTVUxUIGhyOwogICAgIHVuc2lnbmVkIHR5cGU7CisgICAgRkZEWFZBU2hhcmVkQ29udGV4dCAqc2N0eCA9IERYVkFfU0hBUkVEX0NPTlRFWFQoYXZjdHgpOworCisgICAgaWYgKHNjdHgtPmRlY29kZXJfcmVmKSB7CisgICAgICAgIHJlc3VsdCA9IGZyYW1lX2FkZF9idWYoZnJhbWUsIHNjdHgtPmRlY29kZXJfcmVmKTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KIAogICAgIGRvIHsKKyAgICAgICAgZmZfZHh2YTJfbG9jayhhdmN0eCk7CiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQpIHsKLSAgICAgICAgICAgIGlmIChEM0QxMVZBX0NPTlRFWFQoY3R4KS0+Y29udGV4dF9tdXRleCAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICAgICAgICAgICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0RXgoRDNEMTFWQV9DT05URVhUKGN0eCktPmNvbnRleHRfbXV0ZXgsIElORklOSVRFLCBGQUxTRSk7CisgICAgICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpCiAgICAgICAgICAgICBociA9IElEM0QxMVZpZGVvQ29udGV4dF9EZWNvZGVyQmVnaW5GcmFtZShEM0QxMVZBX0NPTlRFWFQoY3R4KS0+dmlkZW9fY29udGV4dCwgRDNEMTFWQV9DT05URVhUKGN0eCktPmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9keHZhMl9nZXRfc3VyZmFjZShmcmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3VyZmFjZShhdmN0eCwgZnJhbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCk7Ci0gICAgICAgIH0KICNlbmRpZgogI2lmIENPTkZJR19EWFZBMgogICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EWFZBMl9WTEQpCiAgICAgICAgICAgICBociA9IElEaXJlY3RYVmlkZW9EZWNvZGVyX0JlZ2luRnJhbWUoRFhWQTJfQ09OVEVYVChjdHgpLT5kZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2R4dmEyX2dldF9zdXJmYWNlKGZyYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfc3VyZmFjZShhdmN0eCwgZnJhbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogI2VuZGlmCi0gICAgICAgIGlmIChociA9PSBFX1BFTkRJTkcpCi0gICAgICAgICAgICBhdl91c2xlZXAoMjAwMCk7Ci0gICAgfSB3aGlsZSAoaHIgPT0gRV9QRU5ESU5HICYmICsrcnVucyA8IDUwKTsKKyAgICAgICAgaWYgKGhyICE9IEVfUEVORElORyB8fCArK3J1bnMgPiA1MCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmZl9keHZhMl91bmxvY2soYXZjdHgpOworICAgICAgICBhdl91c2xlZXAoMjAwMCk7CisgICAgfSB3aGlsZSgxKTsKIAogICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGJlZ2luIGZyYW1lOiAweCVseFxuIiwgaHIpOwotI2lmIENPTkZJR19EM0QxMVZBCi0gICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKQotICAgICAgICAgICAgaWYgKEQzRDExVkFfQ09OVEVYVChjdHgpLT5jb250ZXh0X211dGV4ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICAgICAgICAgIFJlbGVhc2VNdXRleChEM0QxMVZBX0NPTlRFWFQoY3R4KS0+Y29udGV4dF9tdXRleCk7Ci0jZW5kaWYKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYmVnaW4gZnJhbWU6IDB4JXhcbiIsICh1bnNpZ25lZClocik7CisgICAgICAgIGZmX2R4dmEyX3VubG9jayhhdmN0eCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICNpZiBDT05GSUdfRDNEMTFWQQotICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKSB7CisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkgewogICAgICAgICBidWZmZXIgPSAmYnVmZmVyMTFbYnVmZmVyX2NvdW50XTsKICAgICAgICAgdHlwZSA9IEQzRDExX1ZJREVPX0RFQ09ERVJfQlVGRkVSX1BJQ1RVUkVfUEFSQU1FVEVSUzsKICAgICB9CkBAIC0xOTYsNyArOTU0LDcgQEAKIAogICAgIGlmIChxbV9zaXplID4gMCkgewogI2lmIENPTkZJR19EM0QxMVZBCi0gICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKSB7CisgICAgICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpIHsKICAgICAgICAgICAgIGJ1ZmZlciA9ICZidWZmZXIxMVtidWZmZXJfY291bnRdOwogICAgICAgICAgICAgdHlwZSA9IEQzRDExX1ZJREVPX0RFQ09ERVJfQlVGRkVSX0lOVkVSU0VfUVVBTlRJWkFUSU9OX01BVFJJWDsKICAgICAgICAgfQpAQCAtMjE5LDcgKzk3Nyw3IEBACiAgICAgfQogCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkgeworICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpIHsKICAgICAgICAgYnVmZmVyICAgICAgID0gJmJ1ZmZlcjExW2J1ZmZlcl9jb3VudCArIDBdOwogICAgICAgICBidWZmZXJfc2xpY2UgPSAmYnVmZmVyMTFbYnVmZmVyX2NvdW50ICsgMV07CiAgICAgfQpAQCAtMjQ2LDcgKzEwMDQsNyBAQAogICAgIGFzc2VydChidWZmZXJfY291bnQgPT0gMSArIChxbV9zaXplID4gMCkgKyAyKTsKIAogI2lmIENPTkZJR19EM0QxMVZBCi0gICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQpCisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkKICAgICAgICAgaHIgPSBJRDNEMTFWaWRlb0NvbnRleHRfU3VibWl0RGVjb2RlckJ1ZmZlcnMoRDNEMTFWQV9DT05URVhUKGN0eCktPnZpZGVvX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRDExVkFfQ09OVEVYVChjdHgpLT5kZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfY291bnQsIGJ1ZmZlcjExKTsKQEAgLTI2MiwyNiArMTAyMCwzMyBAQAogICAgIH0KICNlbmRpZgogICAgIGlmIChGQUlMRUQoaHIpKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGV4ZWN1dGU6IDB4JWx4XG4iLCBocik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGV4ZWN1dGU6IDB4JXhcbiIsICh1bnNpZ25lZClocik7CiAgICAgICAgIHJlc3VsdCA9IC0xOwogICAgIH0KIAogZW5kOgogI2lmIENPTkZJR19EM0QxMVZBCi0gICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQpIHsKKyAgICBpZiAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpKQogICAgICAgICBociA9IElEM0QxMVZpZGVvQ29udGV4dF9EZWNvZGVyRW5kRnJhbWUoRDNEMTFWQV9DT05URVhUKGN0eCktPnZpZGVvX2NvbnRleHQsIEQzRDExVkFfQ09OVEVYVChjdHgpLT5kZWNvZGVyKTsKLSAgICAgICAgaWYgKEQzRDExVkFfQ09OVEVYVChjdHgpLT5jb250ZXh0X211dGV4ICE9IElOVkFMSURfSEFORExFX1ZBTFVFKQotICAgICAgICAgICAgUmVsZWFzZU11dGV4KEQzRDExVkFfQ09OVEVYVChjdHgpLT5jb250ZXh0X211dGV4KTsKLSAgICB9CiAjZW5kaWYKICNpZiBDT05GSUdfRFhWQTIKICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EWFZBMl9WTEQpCiAgICAgICAgIGhyID0gSURpcmVjdFhWaWRlb0RlY29kZXJfRW5kRnJhbWUoRFhWQTJfQ09OVEVYVChjdHgpLT5kZWNvZGVyLCBOVUxMKTsKICNlbmRpZgorICAgIGZmX2R4dmEyX3VubG9jayhhdmN0eCk7CiAgICAgaWYgKEZBSUxFRChocikpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZW5kIGZyYW1lOiAweCVseFxuIiwgaHIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBlbmQgZnJhbWU6IDB4JXhcbiIsICh1bnNpZ25lZClocik7CiAgICAgICAgIHJlc3VsdCA9IC0xOwogICAgIH0KIAogICAgIHJldHVybiByZXN1bHQ7CiB9CisKK2ludCBmZl9keHZhMl9pc19kM2QxMShjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKENPTkZJR19EM0QxMVZBKQorICAgICAgICByZXR1cm4gYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCB8fAorICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9keHZhMl9oMjY0LmMgYi9saWJhdmNvZGVjL2R4dmEyX2gyNjQuYwppbmRleCA2MWNjZTNhLi41YjIzYjI4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2R4dmEyX2gyNjQuYworKysgYi9saWJhdmNvZGVjL2R4dmEyX2gyNjQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBEWFZBMiBIMjY0IEhXIGFjY2VsZXJhdGlvbi4KKyAqIERYVkEyIEguMjY0IEhXIGFjY2VsZXJhdGlvbi4KICAqCiAgKiBjb3B5cmlnaHQgKGMpIDIwMDkgTGF1cmVudCBBaW1hcgogICoKQEAgLTIwLDE0ICsyMCwxMyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlICJoMjY0LmgiCi0jaW5jbHVkZSAiaDI2NGRhdGEuaCIKLSNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKIAotLy8gVGhlIGhlYWRlcnMgYWJvdmUgbWF5IGluY2x1ZGUgdzMydGhyZWFkcy5oLCB3aGljaCB1c2VzIHRoZSBvcmlnaW5hbAotLy8gX1dJTjMyX1dJTk5UIGRlZmluZSwgd2hpbGUgZHh2YTJfaW50ZXJuYWwuaCByZWRlZmluZXMgaXQgdG8gdGFyZ2V0IGEKLS8vIHBvdGVudGlhbGx5IG5ld2VyIHZlcnNpb24uCiAjaW5jbHVkZSAiZHh2YTJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJoMjY0ZGVjLmgiCisjaW5jbHVkZSAiaDI2NGRhdGEuaCIKKyNpbmNsdWRlICJoMjY0X3BzLmgiCisjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCiAKIHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgewogICAgIERYVkFfUGljUGFyYW1zX0gyNjQgICBwcDsKQEAgLTUwLDYgKzQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYVkFfUGljUGFyYW1zX0gyNjQgKnBwKQogewogICAgIGNvbnN0IEgyNjRQaWN0dXJlICpjdXJyZW50X3BpY3R1cmUgPSBoLT5jdXJfcGljX3B0cjsKKyAgICBjb25zdCBTUFMgKnNwcyA9IGgtPnBzLnNwczsKKyAgICBjb25zdCBQUFMgKnBwcyA9IGgtPnBzLnBwczsKICAgICBpbnQgaSwgajsKIAogICAgIG1lbXNldChwcCwgMCwgc2l6ZW9mKCpwcCkpOwpAQCAtOTQsMzAgKzk1LDMwIEBACiAKICAgICBwcC0+d0ZyYW1lV2lkdGhJbk1ic01pbnVzMSAgICAgICAgPSBoLT5tYl93aWR0aCAgLSAxOwogICAgIHBwLT53RnJhbWVIZWlnaHRJbk1ic01pbnVzMSAgICAgICA9IGgtPm1iX2hlaWdodCAtIDE7Ci0gICAgcHAtPm51bV9yZWZfZnJhbWVzICAgICAgICAgICAgICAgID0gaC0+c3BzLnJlZl9mcmFtZV9jb3VudDsKKyAgICBwcC0+bnVtX3JlZl9mcmFtZXMgICAgICAgICAgICAgICAgPSBzcHMtPnJlZl9mcmFtZV9jb3VudDsKIAogICAgIHBwLT53Qml0RmllbGRzICAgICAgICAgICAgICAgICAgICA9ICgoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSkgPDwgIDApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGgtPnNwcy5tYl9hZmYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNwcy0+bWJfYWZmICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpKSA8PCAgMSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5zcHMucmVzaWR1YWxfY29sb3JfdHJhbnNmb3JtX2ZsYWcgPDwgIDIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BzLT5yZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZyAgIDw8ICAyKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BfZm9yX3N3aXRjaF9mbGFnIChub3QgaW1wbGVtZW50ZWQgYnkgRkZtcGVnKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIDMpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjICAgICAgICAgICAgIDw8ICA0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgICAgICAgICAgICAgICA8PCAgNCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaC0+bmFsX3JlZl9pZGMgIT0gMCkgICAgICAgICAgICAgICAgPDwgIDYpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+cHBzLmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgICAgICAgIDw8ICA3KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnBwcy53ZWlnaHRlZF9wcmVkICAgICAgICAgICAgICAgICA8PCAgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5wcHMud2VpZ2h0ZWRfYmlwcmVkX2lkYyAgICAgICAgICAgPDwgIDkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkICAgICAgICAgIDw8ICA3KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBwcy0+d2VpZ2h0ZWRfcHJlZCAgICAgICAgICAgICAgICAgICA8PCAgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcHMtPndlaWdodGVkX2JpcHJlZF9pZGMgICAgICAgICAgICAgPDwgIDkpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYnNDb25zZWN1dGl2ZUZsYWcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDExKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPnNwcy5mcmFtZV9tYnNfb25seV9mbGFnICAgICAgICAgICA8PCAxMikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5wcHMudHJhbnNmb3JtXzh4OF9tb2RlICAgICAgICAgICAgPDwgMTMpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGgtPnNwcy5sZXZlbF9pZGMgPj0gMzEpICAgICAgICAgICAgIDw8IDE0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyAgICAgICAgICAgICA8PCAxMikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcHMtPnRyYW5zZm9ybV84eDhfbW9kZSAgICAgICAgICAgICAgPDwgMTMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHNwcy0+bGV2ZWxfaWRjID49IDMxKSAgICAgICAgICAgICAgIDw8IDE0KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW50cmFQaWNGbGFnIChNb2RpZmllZCBpZiB3ZSBkZXRlY3QgYSBub24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpbnRyYSBzbGljZSBpbiBkeHZhMl9oMjY0X2RlY29kZV9zbGljZSkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDE1KTsKIAotICAgIHBwLT5iaXRfZGVwdGhfbHVtYV9taW51czggICAgICAgICA9IGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAtIDg7Ci0gICAgcHAtPmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICAgICAgID0gaC0+c3BzLmJpdF9kZXB0aF9jaHJvbWEgLSA4OworICAgIHBwLT5iaXRfZGVwdGhfbHVtYV9taW51czggICAgICAgICA9IHNwcy0+Yml0X2RlcHRoX2x1bWEgLSA4OworICAgIHBwLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCAgICAgICA9IHNwcy0+Yml0X2RlcHRoX2Nocm9tYSAtIDg7CiAgICAgaWYgKERYVkFfQ09OVEVYVF9XT1JLQVJPVU5EKGF2Y3R4LCBjdHgpICYgRkZfRFhWQTJfV09SS0FST1VORF9TQ0FMSU5HX0xJU1RfWklHWkFHKQogICAgICAgICBwcC0+UmVzZXJ2ZWQxNkJpdHMgICAgICAgICAgICA9IDA7CiAgICAgZWxzZSBpZiAoRFhWQV9DT05URVhUX1dPUktBUk9VTkQoYXZjdHgsIGN0eCkgJiBGRl9EWFZBMl9XT1JLQVJPVU5EX0lOVEVMX0NMRUFSVklERU8pCkBAIC0xMzMsMjggKzEzNCwyOCBAQAogICAgIGlmICgoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgJiBQSUNUX0JPVFRPTV9GSUVMRCkgJiYKICAgICAgICAgY3VycmVudF9waWN0dXJlLT5maWVsZF9wb2NbMV0gIT0gSU5UX01BWCkKICAgICAgICAgcHAtPkN1cnJGaWVsZE9yZGVyQ250WzFdID0gY3VycmVudF9waWN0dXJlLT5maWVsZF9wb2NbMV07Ci0gICAgcHAtPnBpY19pbml0X3FzX21pbnVzMjYgICAgICAgICAgID0gaC0+cHBzLmluaXRfcXMgLSAyNjsKLSAgICBwcC0+Y2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgPSBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFswXTsKLSAgICBwcC0+c2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQgPSBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFsxXTsKKyAgICBwcC0+cGljX2luaXRfcXNfbWludXMyNiAgICAgICAgICAgPSBwcHMtPmluaXRfcXMgLSAyNjsKKyAgICBwcC0+Y2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgPSBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF07CisgICAgcHAtPnNlY29uZF9jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID0gcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdOwogICAgIHBwLT5Db250aW51YXRpb25GbGFnICAgICAgICAgICAgICA9IDE7Ci0gICAgcHAtPnBpY19pbml0X3FwX21pbnVzMjYgICAgICAgICAgID0gaC0+cHBzLmluaXRfcXAgLSAyNjsKLSAgICBwcC0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSAgPSBoLT5wcHMucmVmX2NvdW50WzBdIC0gMTsKLSAgICBwcC0+bnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSAgPSBoLT5wcHMucmVmX2NvdW50WzFdIC0gMTsKKyAgICBwcC0+cGljX2luaXRfcXBfbWludXMyNiAgICAgICAgICAgPSBwcHMtPmluaXRfcXAgLSAyNjsKKyAgICBwcC0+bnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSAgPSBwcHMtPnJlZl9jb3VudFswXSAtIDE7CisgICAgcHAtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgID0gcHBzLT5yZWZfY291bnRbMV0gLSAxOwogICAgIHBwLT5SZXNlcnZlZDhCaXRzQSAgICAgICAgICAgICAgICA9IDA7Ci0gICAgcHAtPmZyYW1lX251bSAgICAgICAgICAgICAgICAgICAgID0gaC0+ZnJhbWVfbnVtOwotICAgIHBwLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICAgICA9IGgtPnNwcy5sb2cyX21heF9mcmFtZV9udW0gLSA0OwotICAgIHBwLT5waWNfb3JkZXJfY250X3R5cGUgICAgICAgICAgICA9IGgtPnNwcy5wb2NfdHlwZTsKLSAgICBpZiAoaC0+c3BzLnBvY190eXBlID09IDApCi0gICAgICAgIHBwLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgPSBoLT5zcHMubG9nMl9tYXhfcG9jX2xzYiAtIDQ7Ci0gICAgZWxzZSBpZiAoaC0+c3BzLnBvY190eXBlID09IDEpCi0gICAgICAgIHBwLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9IGgtPnNwcy5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZzsKLSAgICBwcC0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAgICAgPSBoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKLSAgICBwcC0+ZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICAgICAgPSBoLT5wcHMuY2FiYWM7Ci0gICAgcHAtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgICAgICAgID0gaC0+cHBzLnBpY19vcmRlcl9wcmVzZW50OwotICAgIHBwLT5udW1fc2xpY2VfZ3JvdXBzX21pbnVzMSAgICAgICA9IGgtPnBwcy5zbGljZV9ncm91cF9jb3VudCAtIDE7Ci0gICAgcHAtPnNsaWNlX2dyb3VwX21hcF90eXBlICAgICAgICAgID0gaC0+cHBzLm1iX3NsaWNlX2dyb3VwX21hcF90eXBlOwotICAgIHBwLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IGgtPnBwcy5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQ7Ci0gICAgcHAtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZz0gaC0+cHBzLnJlZHVuZGFudF9waWNfY250X3ByZXNlbnQ7CisgICAgcHAtPmZyYW1lX251bSAgICAgICAgICAgICAgICAgICAgID0gaC0+cG9jLmZyYW1lX251bTsKKyAgICBwcC0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAgICAgPSBzcHMtPmxvZzJfbWF4X2ZyYW1lX251bSAtIDQ7CisgICAgcHAtPnBpY19vcmRlcl9jbnRfdHlwZSAgICAgICAgICAgID0gc3BzLT5wb2NfdHlwZTsKKyAgICBpZiAoc3BzLT5wb2NfdHlwZSA9PSAwKQorICAgICAgICBwcC0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0gc3BzLT5sb2cyX21heF9wb2NfbHNiIC0gNDsKKyAgICBlbHNlIGlmIChzcHMtPnBvY190eXBlID09IDEpCisgICAgICAgIHBwLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9IHNwcy0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7CisgICAgcHAtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgICAgID0gc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOworICAgIHBwLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgICAgICA9IHBwcy0+Y2FiYWM7CisgICAgcHAtPnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgICAgICAgID0gcHBzLT5waWNfb3JkZXJfcHJlc2VudDsKKyAgICBwcC0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgICAgICAgPSBwcHMtPnNsaWNlX2dyb3VwX2NvdW50IC0gMTsKKyAgICBwcC0+c2xpY2VfZ3JvdXBfbWFwX3R5cGUgICAgICAgICAgPSBwcHMtPm1iX3NsaWNlX2dyb3VwX21hcF90eXBlOworICAgIHBwLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IHBwcy0+ZGVibG9ja2luZ19maWx0ZXJfcGFyYW1ldGVyc19wcmVzZW50OworICAgIHBwLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWc9IHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudDsKICAgICBwcC0+UmVzZXJ2ZWQ4Qml0c0IgICAgICAgICAgICAgICAgPSAwOwogICAgIHBwLT5zbGljZV9ncm91cF9jaGFuZ2VfcmF0ZV9taW51czE9IDA7ICAvKiBYWFggbm90IGltcGxlbWVudGVkIGJ5IEZGbXBlZyAqLwogICAgIC8vcHAtPlNsaWNlR3JvdXBNYXBbODEwXTsgICAgICAgICAgICAgICAvKiBYWFggbm90IGltcGxlbWVudGVkIGJ5IEZGbXBlZyAqLwpAQCAtMTYyLDI1ICsxNjMsMjYgQEAKIAogc3RhdGljIHZvaWQgZmlsbF9zY2FsaW5nX2xpc3RzKGNvbnN0IEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZEWFZBQ29udGV4dCAqY3R4LCBjb25zdCBIMjY0Q29udGV4dCAqaCwgRFhWQV9RbWF0cml4X0gyNjQgKnFtKQogeworICAgIGNvbnN0IFBQUyAqcHBzID0gaC0+cHMucHBzOwogICAgIHVuc2lnbmVkIGksIGo7CiAgICAgbWVtc2V0KHFtLCAwLCBzaXplb2YoKnFtKSk7CiAgICAgaWYgKERYVkFfQ09OVEVYVF9XT1JLQVJPVU5EKGF2Y3R4LCBjdHgpICYgRkZfRFhWQTJfV09SS0FST1VORF9TQ0FMSU5HX0xJU1RfWklHWkFHKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLSAgICAgICAgICAgICAgICBxbS0+YlNjYWxpbmdMaXN0czR4NFtpXVtqXSA9IGgtPnBwcy5zY2FsaW5nX21hdHJpeDRbaV1bal07CisgICAgICAgICAgICAgICAgcW0tPmJTY2FsaW5nTGlzdHM0eDRbaV1bal0gPSBwcHMtPnNjYWxpbmdfbWF0cml4NFtpXVtqXTsKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotICAgICAgICAgICAgcW0tPmJTY2FsaW5nTGlzdHM4eDhbMF1baV0gPSBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzBdW2ldOwotICAgICAgICAgICAgcW0tPmJTY2FsaW5nTGlzdHM4eDhbMV1baV0gPSBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzNdW2ldOworICAgICAgICAgICAgcW0tPmJTY2FsaW5nTGlzdHM4eDhbMF1baV0gPSBwcHMtPnNjYWxpbmdfbWF0cml4OFswXVtpXTsKKyAgICAgICAgICAgIHFtLT5iU2NhbGluZ0xpc3RzOHg4WzFdW2ldID0gcHBzLT5zY2FsaW5nX21hdHJpeDhbM11baV07CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCi0gICAgICAgICAgICAgICAgcW0tPmJTY2FsaW5nTGlzdHM0eDRbaV1bal0gPSBoLT5wcHMuc2NhbGluZ19tYXRyaXg0W2ldW3ppZ3phZ19zY2FuW2pdXTsKKyAgICAgICAgICAgICAgICBxbS0+YlNjYWxpbmdMaXN0czR4NFtpXVtqXSA9IHBwcy0+c2NhbGluZ19tYXRyaXg0W2ldW2ZmX3ppZ3phZ19zY2FuW2pdXTsKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewotICAgICAgICAgICAgcW0tPmJTY2FsaW5nTGlzdHM4eDhbMF1baV0gPSBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzBdW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOwotICAgICAgICAgICAgcW0tPmJTY2FsaW5nTGlzdHM4eDhbMV1baV0gPSBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzNdW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworICAgICAgICAgICAgcW0tPmJTY2FsaW5nTGlzdHM4eDhbMF1baV0gPSBwcHMtPnNjYWxpbmdfbWF0cml4OFswXVtmZl96aWd6YWdfZGlyZWN0W2ldXTsKKyAgICAgICAgICAgIHFtLT5iU2NhbGluZ0xpc3RzOHg4WzFdW2ldID0gcHBzLT5zY2FsaW5nX21hdHJpeDhbM11bZmZfemlnemFnX2RpcmVjdFtpXV07CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yMTYsNyArMjE4LDcgQEAKIHsKICAgICBjb25zdCBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOwotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICB1bnNpZ25lZCBsaXN0OwogCiAgICAgbWVtc2V0KHNsaWNlLCAwLCBzaXplb2YoKnNsaWNlKSk7CkBAIC0yMjYsMTIgKzIyOCwxMiBAQAogCiAgICAgc2xpY2UtPmZpcnN0X21iX2luX3NsaWNlICAgICA9IChzbC0+bWJfeSA+PiBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpKSAqIGgtPm1iX3dpZHRoICsgc2wtPm1iX3g7CiAgICAgc2xpY2UtPk51bU1ic0ZvclNsaWNlICAgICAgICA9IDA7IC8qIFhYWCBpdCBpcyBzZXQgb25jZSB3ZSBoYXZlIGFsbCBzbGljZXMgKi8KLSAgICBzbGljZS0+Qml0T2Zmc2V0VG9TbGljZURhdGEgID0gZ2V0X2JpdHNfY291bnQoJnNsLT5nYik7CisgICAgc2xpY2UtPkJpdE9mZnNldFRvU2xpY2VEYXRhICA9IGdldF9iaXRzX2NvdW50KCZzbC0+Z2IpIC0gODsKICAgICBzbGljZS0+c2xpY2VfdHlwZSAgICAgICAgICAgID0gZmZfaDI2NF9nZXRfc2xpY2VfdHlwZShzbCk7CiAgICAgaWYgKHNsLT5zbGljZV90eXBlX2ZpeGVkKQogICAgICAgICBzbGljZS0+c2xpY2VfdHlwZSArPSA1OwotICAgIHNsaWNlLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tICAgICAgID0gc2wtPmx1bWFfbG9nMl93ZWlnaHRfZGVub207Ci0gICAgc2xpY2UtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSAgICAgPSBzbC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tOworICAgIHNsaWNlLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tICAgICAgID0gc2wtPnB3dC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tOworICAgIHNsaWNlLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gICAgID0gc2wtPnB3dC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub207CiAgICAgaWYgKHNsLT5saXN0X2NvdW50ID4gMCkKICAgICAgICAgc2xpY2UtPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgPSBzbC0+cmVmX2NvdW50WzBdIC0gMTsKICAgICBpZiAoc2wtPmxpc3RfY291bnQgPiAxKQpAQCAtMjU1LDE1ICsyNTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnJlZl9saXN0W2xpc3RdW2ldLnJlZmVyZW5jZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCk7CiAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgewogICAgICAgICAgICAgICAgICAgICBpbnQgdywgbzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBsYW5lID09IDAgJiYgc2wtPmx1bWFfd2VpZ2h0X2ZsYWdbbGlzdF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBzbC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBvID0gc2wtPmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzFdOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsYW5lID49IDEgJiYgc2wtPmNocm9tYV93ZWlnaHRfZmxhZ1tsaXN0XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHNsLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW3BsYW5lLTFdWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHNsLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW3BsYW5lLTFdWzFdOworICAgICAgICAgICAgICAgICAgICBpZiAocGxhbmUgPT0gMCAmJiBzbC0+cHd0Lmx1bWFfd2VpZ2h0X2ZsYWdbbGlzdF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBzbC0+cHd0Lmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgbyA9IHNsLT5wd3QubHVtYV93ZWlnaHRbaV1bbGlzdF1bMV07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGxhbmUgPj0gMSAmJiBzbC0+cHd0LmNocm9tYV93ZWlnaHRfZmxhZ1tsaXN0XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHNsLT5wd3QuY2hyb21hX3dlaWdodFtpXVtsaXN0XVtwbGFuZS0xXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSBzbC0+cHd0LmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bcGxhbmUtMV1bMV07CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB3ID0gMSA8PCAocGxhbmUgPT0gMCA/IHNsLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gMSA8PCAocGxhbmUgPT0gMCA/IHNsLT5wd3QubHVtYV9sb2cyX3dlaWdodF9kZW5vbSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QuY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNsaWNlLT5XZWlnaHRzW2xpc3RdW2ldW3BsYW5lXVswXSA9IHc7CkBAIC0yODAsMTEgKzI4MiwxMSBAQAogICAgICAgICB9CiAgICAgfQogICAgIHNsaWNlLT5zbGljZV9xc19kZWx0YSAgICA9IDA7IC8qIFhYWCBub3QgaW1wbGVtZW50ZWQgYnkgRkZtcGVnICovCi0gICAgc2xpY2UtPnNsaWNlX3FwX2RlbHRhICAgID0gc2wtPnFzY2FsZSAtIGgtPnBwcy5pbml0X3FwOworICAgIHNsaWNlLT5zbGljZV9xcF9kZWx0YSAgICA9IHNsLT5xc2NhbGUgLSBoLT5wcy5wcHMtPmluaXRfcXA7CiAgICAgc2xpY2UtPnJlZHVuZGFudF9waWNfY250ID0gc2wtPnJlZHVuZGFudF9waWNfY291bnQ7CiAgICAgaWYgKHNsLT5zbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKQogICAgICAgICBzbGljZS0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnID0gc2wtPmRpcmVjdF9zcGF0aWFsX212X3ByZWQ7Ci0gICAgc2xpY2UtPmNhYmFjX2luaXRfaWRjID0gaC0+cHBzLmNhYmFjID8gc2wtPmNhYmFjX2luaXRfaWRjIDogMDsKKyAgICBzbGljZS0+Y2FiYWNfaW5pdF9pZGMgPSBoLT5wcy5wcHMtPmNhYmFjID8gc2wtPmNhYmFjX2luaXRfaWRjIDogMDsKICAgICBpZiAoc2wtPmRlYmxvY2tpbmdfZmlsdGVyIDwgMikKICAgICAgICAgc2xpY2UtPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjID0gMSAtIHNsLT5kZWJsb2NraW5nX2ZpbHRlcjsKICAgICBlbHNlCkBAIC0yOTgsNyArMzAwLDcgQEAKIHsKICAgICBjb25zdCBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgY29uc3QgdW5zaWduZWQgbWJfY291bnQgPSBoLT5tYl93aWR0aCAqIGgtPm1iX2hlaWdodDsKLSAgICBBVkRYVkFDb250ZXh0ICpjdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IERYVkFfQ09OVEVYVChhdmN0eCk7CiAgICAgY29uc3QgSDI2NFBpY3R1cmUgKmN1cnJlbnRfcGljdHVyZSA9IGgtPmN1cl9waWNfcHRyOwogICAgIHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgKmN0eF9waWMgPSBjdXJyZW50X3BpY3R1cmUtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogICAgIERYVkFfU2xpY2VfSDI2NF9TaG9ydCAqc2xpY2UgPSBOVUxMOwpAQCAtMzEzLDcgKzMxNSw3IEBACiAKICAgICAvKiBDcmVhdGUgYW4gYW5uZXggQiBiaXRzdHJlYW0gYnVmZmVyIHdpdGggb25seSBzbGljZSBOQUwgYW5kIGZpbmFsaXplIHNsaWNlICovCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkgeworICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpIHsKICAgICAgICAgdHlwZSA9IEQzRDExX1ZJREVPX0RFQ09ERVJfQlVGRkVSX0JJVFNUUkVBTTsKICAgICAgICAgaWYgKEZBSUxFRChJRDNEMTFWaWRlb0NvbnRleHRfR2V0RGVjb2RlckJ1ZmZlcihEM0QxMVZBX0NPTlRFWFQoY3R4KS0+dmlkZW9fY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0QxMVZBX0NPTlRFWFQoY3R4KS0+ZGVjb2RlciwKQEAgLTM4NCw3ICszODYsNyBAQAogICAgICAgICBzbGljZS0+U2xpY2VCeXRlc0luQnVmZmVyICs9IHBhZGRpbmc7CiAgICAgfQogI2lmIENPTkZJR19EM0QxMVZBCi0gICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQpCisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkKICAgICAgICAgaWYgKEZBSUxFRChJRDNEMTFWaWRlb0NvbnRleHRfUmVsZWFzZURlY29kZXJCdWZmZXIoRDNEMTFWQV9DT05URVhUKGN0eCktPnZpZGVvX2NvbnRleHQsIEQzRDExVkFfQ09OVEVYVChjdHgpLT5kZWNvZGVyLCB0eXBlKSkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAjZW5kaWYKQEAgLTM5Nyw3ICszOTksNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAKICNpZiBDT05GSUdfRDNEMTFWQQotICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKSB7CisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkgewogICAgICAgICBEM0QxMV9WSURFT19ERUNPREVSX0JVRkZFUl9ERVNDICpkc2MxMSA9IGJzOwogICAgICAgICBtZW1zZXQoZHNjMTEsIDAsIHNpemVvZigqZHNjMTEpKTsKICAgICAgICAgZHNjMTEtPkJ1ZmZlclR5cGUgICAgICAgICAgID0gdHlwZTsKQEAgLTQwNSw2ICs0MDcsOCBAQAogICAgICAgICBkc2MxMS0+TnVtTUJzSW5CdWZmZXIgICAgICAgPSBtYl9jb3VudDsKIAogICAgICAgICB0eXBlID0gRDNEMTFfVklERU9fREVDT0RFUl9CVUZGRVJfU0xJQ0VfQ09OVFJPTDsKKworICAgICAgICBhdl9hc3NlcnQwKChkc2MxMS0+RGF0YVNpemUgJiAxMjcpID09IDApOwogICAgIH0KICNlbmRpZgogI2lmIENPTkZJR19EWFZBMgpAQCAtNDE2LDYgKzQyMCw4IEBACiAgICAgICAgIGRzYzItPk51bU1Cc0luQnVmZmVyICAgICAgID0gbWJfY291bnQ7CiAKICAgICAgICAgdHlwZSA9IERYVkEyX1NsaWNlQ29udHJvbEJ1ZmZlclR5cGU7CisKKyAgICAgICAgYXZfYXNzZXJ0MCgoZHNjMi0+RGF0YVNpemUgJiAxMjcpID09IDApOwogICAgIH0KICNlbmRpZgogCkBAIC00MjYsNyArNDMyLDYgQEAKICAgICAgICAgc2xpY2VfZGF0YSA9IGN0eF9waWMtPnNsaWNlX2xvbmc7CiAgICAgICAgIHNsaWNlX3NpemUgPSBjdHhfcGljLT5zbGljZV9jb3VudCAqIHNpemVvZigqY3R4X3BpYy0+c2xpY2VfbG9uZyk7CiAgICAgfQotICAgIGFzc2VydCgoYnMtPkRhdGFTaXplICYgMTI3KSA9PSAwKTsKICAgICByZXR1cm4gZmZfZHh2YTJfY29tbWl0X2J1ZmZlcihhdmN0eCwgY3R4LCBzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlX2RhdGEsIHNsaWNlX3NpemUsIG1iX2NvdW50KTsKQEAgLTQzOCwxMiArNDQzLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90IHNpemUpCiB7CiAgICAgY29uc3QgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0gaC0+Y3VyX3BpY19wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogCi0gICAgaWYgKERYVkFfQ09OVEVYVF9ERUNPREVSKGF2Y3R4LCBjdHgpID09IE5VTEwgfHwKLSAgICAgICAgRFhWQV9DT05URVhUX0NGRyhhdmN0eCwgY3R4KSA9PSBOVUxMIHx8Ci0gICAgICAgIERYVkFfQ09OVEVYVF9DT1VOVChhdmN0eCwgY3R4KSA8PSAwKQorICAgIGlmICghRFhWQV9DT05URVhUX1ZBTElEKGF2Y3R4LCBjdHgpKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgYXNzZXJ0KGN0eF9waWMpOwogCkBAIC00NjUsNyArNDY4LDcgQEAKIHsKICAgICBjb25zdCBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgY29uc3QgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOwotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICBjb25zdCBIMjY0UGljdHVyZSAqY3VycmVudF9waWN0dXJlID0gaC0+Y3VyX3BpY19wdHI7CiAgICAgc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCAqY3R4X3BpYyA9IGN1cnJlbnRfcGljdHVyZS0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CiAgICAgdW5zaWduZWQgcG9zaXRpb247CkBAIC01MTEsMjcgKzUxNCw1MiBAQAogfQogCiAjaWYgQ09ORklHX0gyNjRfRFhWQTJfSFdBQ0NFTAotQVZIV0FjY2VsIGZmX2gyNjRfZHh2YTJfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl9oMjY0X2R4dmEyX2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfZHh2YTIiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAogICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfRFhWQTJfVkxELAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV91bmluaXQsCiAgICAgLnN0YXJ0X2ZyYW1lICAgID0gZHh2YTJfaDI2NF9zdGFydF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl9oMjY0X2RlY29kZV9zbGljZSwKICAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl9oMjY0X2VuZF9mcmFtZSwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSBmZl9keHZhMl9jb21tb25fZnJhbWVfcGFyYW1zLAogICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZEWFZBU2hhcmVkQ29udGV4dCksCiB9OwogI2VuZGlmCiAKICNpZiBDT05GSUdfSDI2NF9EM0QxMVZBX0hXQUNDRUwKLUFWSFdBY2NlbCBmZl9oMjY0X2QzZDExdmFfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl9oMjY0X2QzZDExdmFfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF9kM2QxMXZhIiwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKICAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX0QzRDExVkFfVkxELAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV91bmluaXQsCiAgICAgLnN0YXJ0X2ZyYW1lICAgID0gZHh2YTJfaDI2NF9zdGFydF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl9oMjY0X2RlY29kZV9zbGljZSwKICAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl9oMjY0X2VuZF9mcmFtZSwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSBmZl9keHZhMl9jb21tb25fZnJhbWVfcGFyYW1zLAogICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZEWFZBU2hhcmVkQ29udGV4dCksCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfSDI2NF9EM0QxMVZBMl9IV0FDQ0VMCitjb25zdCBBVkhXQWNjZWwgZmZfaDI2NF9kM2QxMXZhMl9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjY0X2QzZDExdmEyIiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX0QzRDExLAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV91bmluaXQsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gZHh2YTJfaDI2NF9zdGFydF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl9oMjY0X2RlY29kZV9zbGljZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl9oMjY0X2VuZF9mcmFtZSwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSBmZl9keHZhMl9jb21tb25fZnJhbWVfcGFyYW1zLAorICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZEWFZBU2hhcmVkQ29udGV4dCksCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2R4dmEyX2hldmMuYyBiL2xpYmF2Y29kZWMvZHh2YTJfaGV2Yy5jCmluZGV4IDVhMzEyZWEuLmRiYjcwMWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZHh2YTJfaGV2Yy5jCisrKyBiL2xpYmF2Y29kZWMvZHh2YTJfaGV2Yy5jCkBAIC0yMiwxMiArMjIsOSBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAKLSNpbmNsdWRlICJoZXZjLmgiCi0KLS8vIFRoZSBoZWFkZXJzIGFib3ZlIG1heSBpbmNsdWRlIHczMnRocmVhZHMuaCwgd2hpY2ggdXNlcyB0aGUgb3JpZ2luYWwKLS8vIF9XSU4zMl9XSU5OVCBkZWZpbmUsIHdoaWxlIGR4dmEyX2ludGVybmFsLmggcmVkZWZpbmVzIGl0IHRvIHRhcmdldCBhCi0vLyBwb3RlbnRpYWxseSBuZXdlciB2ZXJzaW9uLgogI2luY2x1ZGUgImR4dmEyX2ludGVybmFsLmgiCisjaW5jbHVkZSAiaGV2Y19kYXRhLmgiCisjaW5jbHVkZSAiaGV2Y2RlYy5oIgogCiAjZGVmaW5lIE1BWF9TTElDRVMgMjU2CiAKQEAgLTI0Miw3ICsyMzksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT0RFUl9CVUZGRVJfREVTQyAqc2MpCiB7CiAgICAgY29uc3QgSEVWQ0NvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICBjb25zdCBIRVZDRnJhbWUgKmN1cnJlbnRfcGljdHVyZSA9IGgtPnJlZjsKICAgICBzdHJ1Y3QgaGV2Y19keHZhMl9waWN0dXJlX2NvbnRleHQgKmN0eF9waWMgPSBjdXJyZW50X3BpY3R1cmUtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogICAgIERYVkFfU2xpY2VfSEVWQ19TaG9ydCAqc2xpY2UgPSBOVUxMOwpAQCAtMjU3LDcgKzI1NCw3IEBACiAKICAgICAvKiBDcmVhdGUgYW4gYW5uZXggQiBiaXRzdHJlYW0gYnVmZmVyIHdpdGggb25seSBzbGljZSBOQUwgYW5kIGZpbmFsaXplIHNsaWNlICovCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkgeworICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpIHsKICAgICAgICAgdHlwZSA9IEQzRDExX1ZJREVPX0RFQ09ERVJfQlVGRkVSX0JJVFNUUkVBTTsKICAgICAgICAgaWYgKEZBSUxFRChJRDNEMTFWaWRlb0NvbnRleHRfR2V0RGVjb2RlckJ1ZmZlcihEM0QxMVZBX0NPTlRFWFQoY3R4KS0+dmlkZW9fY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0QxMVZBX0NPTlRFWFQoY3R4KS0+ZGVjb2RlciwKQEAgLTMxMSw3ICszMDgsNyBAQAogICAgICAgICBzbGljZS0+U2xpY2VCeXRlc0luQnVmZmVyICs9IHBhZGRpbmc7CiAgICAgfQogI2lmIENPTkZJR19EM0QxMVZBCi0gICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQpCisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkKICAgICAgICAgaWYgKEZBSUxFRChJRDNEMTFWaWRlb0NvbnRleHRfUmVsZWFzZURlY29kZXJCdWZmZXIoRDNEMTFWQV9DT05URVhUKGN0eCktPnZpZGVvX2NvbnRleHQsIEQzRDExVkFfQ09OVEVYVChjdHgpLT5kZWNvZGVyLCB0eXBlKSkpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAjZW5kaWYKQEAgLTMyNCw3ICszMjEsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAKICNpZiBDT05GSUdfRDNEMTFWQQotICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKSB7CisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkgewogICAgICAgICBEM0QxMV9WSURFT19ERUNPREVSX0JVRkZFUl9ERVNDICpkc2MxMSA9IGJzOwogICAgICAgICBtZW1zZXQoZHNjMTEsIDAsIHNpemVvZigqZHNjMTEpKTsKICAgICAgICAgZHNjMTEtPkJ1ZmZlclR5cGUgICAgICAgICAgID0gdHlwZTsKQEAgLTM2MSwxMiArMzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90IHNpemUpCiB7CiAgICAgY29uc3QgSEVWQ0NvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICBzdHJ1Y3QgaGV2Y19keHZhMl9waWN0dXJlX2NvbnRleHQgKmN0eF9waWMgPSBoLT5yZWYtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogCi0gICAgaWYgKERYVkFfQ09OVEVYVF9ERUNPREVSKGF2Y3R4LCBjdHgpID09IE5VTEwgfHwKLSAgICAgICAgRFhWQV9DT05URVhUX0NGRyhhdmN0eCwgY3R4KSA9PSBOVUxMIHx8Ci0gICAgICAgIERYVkFfQ09OVEVYVF9DT1VOVChhdmN0eCwgY3R4KSA8PSAwKQorICAgIGlmICghRFhWQV9DT05URVhUX1ZBTElEKGF2Y3R4LCBjdHgpKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgYXZfYXNzZXJ0MChjdHhfcGljKTsKIApAQCAtNDIzLDI3ICs0MTgsNTIgQEAKIH0KIAogI2lmIENPTkZJR19IRVZDX0RYVkEyX0hXQUNDRUwKLUFWSFdBY2NlbCBmZl9oZXZjX2R4dmEyX2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfaGV2Y19keHZhMl9od2FjY2VsID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJoZXZjX2R4dmEyIiwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSEVWQywKICAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX0RYVkEyX1ZMRCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAogICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX2hldmNfc3RhcnRfZnJhbWUsCiAgICAgLmRlY29kZV9zbGljZSAgID0gZHh2YTJfaGV2Y19kZWNvZGVfc2xpY2UsCiAgICAgLmVuZF9mcmFtZSAgICAgID0gZHh2YTJfaGV2Y19lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKICAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGhldmNfZHh2YTJfcGljdHVyZV9jb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZEWFZBU2hhcmVkQ29udGV4dCksCiB9OwogI2VuZGlmCiAKICNpZiBDT05GSUdfSEVWQ19EM0QxMVZBX0hXQUNDRUwKLUFWSFdBY2NlbCBmZl9oZXZjX2QzZDExdmFfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl9oZXZjX2QzZDExdmFfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAiaGV2Y19kM2QxMXZhIiwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSEVWQywKICAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX0QzRDExVkFfVkxELAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV91bmluaXQsCiAgICAgLnN0YXJ0X2ZyYW1lICAgID0gZHh2YTJfaGV2Y19zdGFydF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl9oZXZjX2RlY29kZV9zbGljZSwKICAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl9oZXZjX2VuZF9mcmFtZSwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSBmZl9keHZhMl9jb21tb25fZnJhbWVfcGFyYW1zLAogICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaGV2Y19keHZhMl9waWN0dXJlX2NvbnRleHQpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRkRYVkFTaGFyZWRDb250ZXh0KSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19IRVZDX0QzRDExVkEyX0hXQUNDRUwKK2NvbnN0IEFWSFdBY2NlbCBmZl9oZXZjX2QzZDExdmEyX2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImhldmNfZDNkMTF2YTIiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAorICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfRDNEMTEsCisgICAgLmluaXQgICAgICAgICAgID0gZmZfZHh2YTJfZGVjb2RlX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgID0gZmZfZHh2YTJfZGVjb2RlX3VuaW5pdCwKKyAgICAuc3RhcnRfZnJhbWUgICAgPSBkeHZhMl9oZXZjX3N0YXJ0X2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IGR4dmEyX2hldmNfZGVjb2RlX3NsaWNlLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX2hldmNfZW5kX2ZyYW1lLAorICAgIC5mcmFtZV9wYXJhbXMgICA9IGZmX2R4dmEyX2NvbW1vbl9mcmFtZV9wYXJhbXMsCisgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBoZXZjX2R4dmEyX3BpY3R1cmVfY29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGRFhWQVNoYXJlZENvbnRleHQpLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9keHZhMl9pbnRlcm5hbC5oIGIvbGliYXZjb2RlYy9keHZhMl9pbnRlcm5hbC5oCmluZGV4IGFkODlmODIuLjhiYjMzNDQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZHh2YTJfaW50ZXJuYWwuaAorKysgYi9saWJhdmNvZGVjL2R4dmEyX2ludGVybmFsLmgKQEAgLTMyLDExICszMiwxMiBAQAogCiAjaWYgQ09ORklHX0RYVkEyCiAjaW5jbHVkZSAiZHh2YTIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X2R4dmEyLmgiCiAjZW5kaWYKICNpZiBDT05GSUdfRDNEMTFWQQogI2luY2x1ZGUgImQzZDExdmEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X2QzZDExdmEuaCIKICNlbmRpZgotCiAjaWYgSEFWRV9EWFZBX0gKIC8qIFdoZW4gdGFyZ2V0aW5nIFdJTkFQSV9GQU1JTFlfUEhPTkVfQVBQIG9yIFdJTkFQSV9GQU1JTFlfQVBQLCBkeHZhLmgKICAqIGRlZmluZXMgbm90aGluZy4gRm9yY2UgdGhlIHN0cnVjdCBkZWZpbml0aW9ucyB0byBiZSB2aXNpYmxlLiAqLwpAQCAtNDcsNyArNDgsMTAgQEAKICNpbmNsdWRlIDxkeHZhLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKwogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiB0eXBlZGVmIHZvaWQgREVDT0RFUl9CVUZGRVJfREVTQzsKIApAQCAtNjAsNDcgKzY0LDc3IEBACiAjZW5kaWYKIH0gQVZEWFZBQ29udGV4dDsKIAordHlwZWRlZiBzdHJ1Y3QgRkZEWFZBU2hhcmVkQ29udGV4dCB7CisgICAgQVZCdWZmZXJSZWYgKmRlY29kZXJfcmVmOworCisgICAgLy8gRkZfRFhWQTJfV09SS0FST1VORF8qIGZsYWdzCisgICAgdWludDY0X3Qgd29ya2Fyb3VuZDsKKworICAgIC8vIEUuZy4gQVZfUElYX0ZNVF9EM0QxMSAoc2FtZSBhcyBBVkNvZGVjQ29udGV4dC5waXhfZm10LCBleGNlcHQgZHVyaW5nIGluaXQpCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqZGV2aWNlX2N0eDsKKwogI2lmIENPTkZJR19EM0QxMVZBCi0jZGVmaW5lIEQzRDExVkFfQ09OVEVYVChjdHgpICgmY3R4LT5kM2QxMXZhKQotI2VuZGlmCi0jaWYgQ09ORklHX0RYVkEyCi0jZGVmaW5lIERYVkEyX0NPTlRFWFQoY3R4KSAgICgmY3R4LT5keHZhMikKKyAgICBJRDNEMTFWaWRlb0RlY29kZXIgICAgICAgICAgICAgKmQzZDExX2RlY29kZXI7CisgICAgRDNEMTFfVklERU9fREVDT0RFUl9DT05GSUcgICAgICBkM2QxMV9jb25maWc7CisgICAgSUQzRDExVmlkZW9EZWNvZGVyT3V0cHV0VmlldyAgKipkM2QxMV92aWV3czsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2QzZDExX3ZpZXdzOworICAgIElEM0QxMVRleHR1cmUyRCAgICAgICAgICAgICAgICAqZDNkMTFfdGV4dHVyZTsKICNlbmRpZgogCisjaWYgQ09ORklHX0RYVkEyCisgICAgSURpcmVjdFhWaWRlb0RlY29kZXIgICAgICAgICAgICpkeHZhMl9kZWNvZGVyOworICAgIElEaXJlY3RYVmlkZW9EZWNvZGVyU2VydmljZSAgICAqZHh2YTJfc2VydmljZTsKKyAgICBEWFZBMl9Db25maWdQaWN0dXJlRGVjb2RlICAgICAgIGR4dmEyX2NvbmZpZzsKKyNlbmRpZgorCisgICAgLy8gTGVnYWN5IChidXQgdXNlZCBieSBjb2RlIG91dHNpZGUgb2Ygc2V0dXApCisgICAgLy8gSW4gZ2VuZXJpYyBtb2RlLCBEWFZBX0NPTlRFWFQoKSB3aWxsIHJldHVybiBhIHBvaW50ZXIgdG8gdGhpcy4KKyAgICBBVkRYVkFDb250ZXh0IGN0eDsKK30gRkZEWFZBU2hhcmVkQ29udGV4dDsKKworI2RlZmluZSBEWFZBX1NIQVJFRF9DT05URVhUKGF2Y3R4KSAoKEZGRFhWQVNoYXJlZENvbnRleHQgKikoKGF2Y3R4KS0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhKSkKKworI2RlZmluZSBEWFZBX0NPTlRFWFQoYXZjdHgpIChBVkRYVkFDb250ZXh0ICopKChhdmN0eCktPmh3YWNjZWxfY29udGV4dCA/IChhdmN0eCktPmh3YWNjZWxfY29udGV4dCA6ICgmKERYVkFfU0hBUkVEX0NPTlRFWFQoYXZjdHgpLT5jdHgpKSkKKworI2RlZmluZSBEM0QxMVZBX0NPTlRFWFQoY3R4KSAoJmN0eC0+ZDNkMTF2YSkKKyNkZWZpbmUgRFhWQTJfQ09OVEVYVChjdHgpICAgKCZjdHgtPmR4dmEyKQorCiAjaWYgQ09ORklHX0QzRDExVkEgJiYgQ09ORklHX0RYVkEyCi0jZGVmaW5lIERYVkFfQ09OVEVYVF9XT1JLQVJPVU5EKGF2Y3R4LCBjdHgpICAgICAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCA/IGN0eC0+ZDNkMTF2YS53b3JrYXJvdW5kIDogY3R4LT5keHZhMi53b3JrYXJvdW5kKQotI2RlZmluZSBEWFZBX0NPTlRFWFRfQ09VTlQoYXZjdHgsIGN0eCkgICAgICAgICAgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQgPyBjdHgtPmQzZDExdmEuc3VyZmFjZV9jb3VudCA6IGN0eC0+ZHh2YTIuc3VyZmFjZV9jb3VudCkKLSNkZWZpbmUgRFhWQV9DT05URVhUX1NVUkZBQ0UoYXZjdHgsIGN0eCwgaSkgICAgIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEID8gY3R4LT5kM2QxMXZhLnN1cmZhY2VbaV0gOiBjdHgtPmR4dmEyLnN1cmZhY2VbaV0pCi0jZGVmaW5lIERYVkFfQ09OVEVYVF9ERUNPREVSKGF2Y3R4LCBjdHgpICAgICAgICAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCA/IGN0eC0+ZDNkMTF2YS5kZWNvZGVyIDogY3R4LT5keHZhMi5kZWNvZGVyKQotI2RlZmluZSBEWFZBX0NPTlRFWFRfUkVQT1JUX0lEKGF2Y3R4LCBjdHgpICAgICAgKCooYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCA/ICZjdHgtPmQzZDExdmEucmVwb3J0X2lkIDogJmN0eC0+ZHh2YTIucmVwb3J0X2lkKSkKLSNkZWZpbmUgRFhWQV9DT05URVhUX0NGRyhhdmN0eCwgY3R4KSAgICAgICAgICAgIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEID8gY3R4LT5kM2QxMXZhLmNmZyA6IGN0eC0+ZHh2YTIuY2ZnKQotI2RlZmluZSBEWFZBX0NPTlRFWFRfQ0ZHX0JJVFNUUkVBTShhdmN0eCwgY3R4KSAgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQgPyBjdHgtPmQzZDExdmEuY2ZnLT5Db25maWdCaXRzdHJlYW1SYXcgOiBjdHgtPmR4dmEyLmNmZy0+Q29uZmlnQml0c3RyZWFtUmF3KQotI2RlZmluZSBEWFZBX0NPTlRFWFRfQ0ZHX0lOVFJBUkVTSUQoYXZjdHgsIGN0eCkgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQgPyBjdHgtPmQzZDExdmEuY2ZnLT5Db25maWdJbnRyYVJlc2lkVW5zaWduZWQgOiBjdHgtPmR4dmEyLmNmZy0+Q29uZmlnSW50cmFSZXNpZFVuc2lnbmVkKQotI2RlZmluZSBEWFZBX0NPTlRFWFRfQ0ZHX1JFU0lEQUNDRUwoYXZjdHgsIGN0eCkgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQgPyBjdHgtPmQzZDExdmEuY2ZnLT5Db25maWdSZXNpZERpZmZBY2NlbGVyYXRvciA6IGN0eC0+ZHh2YTIuY2ZnLT5Db25maWdSZXNpZERpZmZBY2NlbGVyYXRvcikKKyNkZWZpbmUgRFhWQV9DT05URVhUX1dPUktBUk9VTkQoYXZjdHgsIGN0eCkgICAgIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkgPyBjdHgtPmQzZDExdmEud29ya2Fyb3VuZCA6IGN0eC0+ZHh2YTIud29ya2Fyb3VuZCkKKyNkZWZpbmUgRFhWQV9DT05URVhUX0NPVU5UKGF2Y3R4LCBjdHgpICAgICAgICAgIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkgPyBjdHgtPmQzZDExdmEuc3VyZmFjZV9jb3VudCA6IGN0eC0+ZHh2YTIuc3VyZmFjZV9jb3VudCkKKyNkZWZpbmUgRFhWQV9DT05URVhUX0RFQ09ERVIoYXZjdHgsIGN0eCkgICAgICAgIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkgPyBjdHgtPmQzZDExdmEuZGVjb2RlciA6IGN0eC0+ZHh2YTIuZGVjb2RlcikKKyNkZWZpbmUgRFhWQV9DT05URVhUX1JFUE9SVF9JRChhdmN0eCwgY3R4KSAgICAgICgqKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSA/ICZjdHgtPmQzZDExdmEucmVwb3J0X2lkIDogJmN0eC0+ZHh2YTIucmVwb3J0X2lkKSkKKyNkZWZpbmUgRFhWQV9DT05URVhUX0NGRyhhdmN0eCwgY3R4KSAgICAgICAgICAgIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkgPyBjdHgtPmQzZDExdmEuY2ZnIDogY3R4LT5keHZhMi5jZmcpCisjZGVmaW5lIERYVkFfQ09OVEVYVF9DRkdfQklUU1RSRUFNKGF2Y3R4LCBjdHgpICAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpID8gY3R4LT5kM2QxMXZhLmNmZy0+Q29uZmlnQml0c3RyZWFtUmF3IDogY3R4LT5keHZhMi5jZmctPkNvbmZpZ0JpdHN0cmVhbVJhdykKKyNkZWZpbmUgRFhWQV9DT05URVhUX0NGR19JTlRSQVJFU0lEKGF2Y3R4LCBjdHgpIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkgPyBjdHgtPmQzZDExdmEuY2ZnLT5Db25maWdJbnRyYVJlc2lkVW5zaWduZWQgOiBjdHgtPmR4dmEyLmNmZy0+Q29uZmlnSW50cmFSZXNpZFVuc2lnbmVkKQorI2RlZmluZSBEWFZBX0NPTlRFWFRfQ0ZHX1JFU0lEQUNDRUwoYXZjdHgsIGN0eCkgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSA/IGN0eC0+ZDNkMTF2YS5jZmctPkNvbmZpZ1Jlc2lkRGlmZkFjY2VsZXJhdG9yIDogY3R4LT5keHZhMi5jZmctPkNvbmZpZ1Jlc2lkRGlmZkFjY2VsZXJhdG9yKQorI2RlZmluZSBEWFZBX0NPTlRFWFRfVkFMSUQoYXZjdHgsIGN0eCkgICAgICAgICAgKERYVkFfQ09OVEVYVF9ERUNPREVSKGF2Y3R4LCBjdHgpICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWFZBX0NPTlRFWFRfQ0ZHKGF2Y3R4LCBjdHgpICAgICAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSB8fCBjdHgtPmR4dmEyLnN1cmZhY2VfY291bnQpKQogI2VsaWYgQ09ORklHX0RYVkEyCiAjZGVmaW5lIERYVkFfQ09OVEVYVF9XT1JLQVJPVU5EKGF2Y3R4LCBjdHgpICAgICAoY3R4LT5keHZhMi53b3JrYXJvdW5kKQogI2RlZmluZSBEWFZBX0NPTlRFWFRfQ09VTlQoYXZjdHgsIGN0eCkgICAgICAgICAgKGN0eC0+ZHh2YTIuc3VyZmFjZV9jb3VudCkKLSNkZWZpbmUgRFhWQV9DT05URVhUX1NVUkZBQ0UoYXZjdHgsIGN0eCwgaSkgICAgIChjdHgtPmR4dmEyLnN1cmZhY2VbaV0pCiAjZGVmaW5lIERYVkFfQ09OVEVYVF9ERUNPREVSKGF2Y3R4LCBjdHgpICAgICAgICAoY3R4LT5keHZhMi5kZWNvZGVyKQogI2RlZmluZSBEWFZBX0NPTlRFWFRfUkVQT1JUX0lEKGF2Y3R4LCBjdHgpICAgICAgKCooJmN0eC0+ZHh2YTIucmVwb3J0X2lkKSkKICNkZWZpbmUgRFhWQV9DT05URVhUX0NGRyhhdmN0eCwgY3R4KSAgICAgICAgICAgIChjdHgtPmR4dmEyLmNmZykKICNkZWZpbmUgRFhWQV9DT05URVhUX0NGR19CSVRTVFJFQU0oYXZjdHgsIGN0eCkgIChjdHgtPmR4dmEyLmNmZy0+Q29uZmlnQml0c3RyZWFtUmF3KQogI2RlZmluZSBEWFZBX0NPTlRFWFRfQ0ZHX0lOVFJBUkVTSUQoYXZjdHgsIGN0eCkgKGN0eC0+ZHh2YTIuY2ZnLT5Db25maWdJbnRyYVJlc2lkVW5zaWduZWQpCiAjZGVmaW5lIERYVkFfQ09OVEVYVF9DRkdfUkVTSURBQ0NFTChhdmN0eCwgY3R4KSAoY3R4LT5keHZhMi5jZmctPkNvbmZpZ1Jlc2lkRGlmZkFjY2VsZXJhdG9yKQorI2RlZmluZSBEWFZBX0NPTlRFWFRfVkFMSUQoYXZjdHgsIGN0eCkgICAgICAgICAgKGN0eC0+ZHh2YTIuZGVjb2RlciAmJiBjdHgtPmR4dmEyLmNmZyAmJiBjdHgtPmR4dmEyLnN1cmZhY2VfY291bnQpCiAjZWxpZiBDT05GSUdfRDNEMTFWQQogI2RlZmluZSBEWFZBX0NPTlRFWFRfV09SS0FST1VORChhdmN0eCwgY3R4KSAgICAgKGN0eC0+ZDNkMTF2YS53b3JrYXJvdW5kKQogI2RlZmluZSBEWFZBX0NPTlRFWFRfQ09VTlQoYXZjdHgsIGN0eCkgICAgICAgICAgKGN0eC0+ZDNkMTF2YS5zdXJmYWNlX2NvdW50KQotI2RlZmluZSBEWFZBX0NPTlRFWFRfU1VSRkFDRShhdmN0eCwgY3R4LCBpKSAgICAgKGN0eC0+ZDNkMTF2YS5zdXJmYWNlW2ldKQogI2RlZmluZSBEWFZBX0NPTlRFWFRfREVDT0RFUihhdmN0eCwgY3R4KSAgICAgICAgKGN0eC0+ZDNkMTF2YS5kZWNvZGVyKQogI2RlZmluZSBEWFZBX0NPTlRFWFRfUkVQT1JUX0lEKGF2Y3R4LCBjdHgpICAgICAgKCooJmN0eC0+ZDNkMTF2YS5yZXBvcnRfaWQpKQogI2RlZmluZSBEWFZBX0NPTlRFWFRfQ0ZHKGF2Y3R4LCBjdHgpICAgICAgICAgICAgKGN0eC0+ZDNkMTF2YS5jZmcpCiAjZGVmaW5lIERYVkFfQ09OVEVYVF9DRkdfQklUU1RSRUFNKGF2Y3R4LCBjdHgpICAoY3R4LT5kM2QxMXZhLmNmZy0+Q29uZmlnQml0c3RyZWFtUmF3KQogI2RlZmluZSBEWFZBX0NPTlRFWFRfQ0ZHX0lOVFJBUkVTSUQoYXZjdHgsIGN0eCkgKGN0eC0+ZDNkMTF2YS5jZmctPkNvbmZpZ0ludHJhUmVzaWRVbnNpZ25lZCkKICNkZWZpbmUgRFhWQV9DT05URVhUX0NGR19SRVNJREFDQ0VMKGF2Y3R4LCBjdHgpIChjdHgtPmQzZDExdmEuY2ZnLT5Db25maWdSZXNpZERpZmZBY2NlbGVyYXRvcikKKyNkZWZpbmUgRFhWQV9DT05URVhUX1ZBTElEKGF2Y3R4LCBjdHgpICAgICAgICAgIChjdHgtPmQzZDExdmEuZGVjb2RlciAmJiBjdHgtPmQzZDExdmEuY2ZnKQogI2VuZGlmCiAKLXZvaWQgKmZmX2R4dmEyX2dldF9zdXJmYWNlKGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKLQogdW5zaWduZWQgZmZfZHh2YTJfZ2V0X3N1cmZhY2VfaW5kZXgoY29uc3QgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZEWFZBQ29udGV4dCAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUpOwpAQCAtMTE4LDQgKzE1MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUNPREVSX0JVRkZFUl9ERVNDICpicywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT0RFUl9CVUZGRVJfREVTQyAqc2xpY2UpKTsKIAoraW50IGZmX2R4dmEyX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl9keHZhMl9kZWNvZGVfdW5pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl9keHZhMl9jb21tb25fZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4KTsKKworaW50IGZmX2R4dmEyX2lzX2QzZDExKGNvbnN0IEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKICNlbmRpZiAvKiBBVkNPREVDX0RYVkEyX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZHh2YTJfbXBlZzIuYyBiL2xpYmF2Y29kZWMvZHh2YTJfbXBlZzIuYwppbmRleCBjMmYwYjU4Li44Y2MyMWJmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2R4dmEyX21wZWcyLmMKKysrIGIvbGliYXZjb2RlYy9keHZhMl9tcGVnMi5jCkBAIC0yMSwxNCArMjEsMTEgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCisjaW5jbHVkZSAiZHh2YTJfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKICNpbmNsdWRlICJtcGVndmlkZW8uaCIKIAotLy8gVGhlIGhlYWRlcnMgYWJvdmUgbWF5IGluY2x1ZGUgdzMydGhyZWFkcy5oLCB3aGljaCB1c2VzIHRoZSBvcmlnaW5hbAotLy8gX1dJTjMyX1dJTk5UIGRlZmluZSwgd2hpbGUgZHh2YTJfaW50ZXJuYWwuaCByZWRlZmluZXMgaXQgdG8gdGFyZ2V0IGEKLS8vIHBvdGVudGlhbGx5IG5ld2VyIHZlcnNpb24uCi0jaW5jbHVkZSAiZHh2YTJfaW50ZXJuYWwuaCIKLQogI2RlZmluZSBNQVhfU0xJQ0VTIDEwMjQKIHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgewogICAgIERYVkFfUGljdHVyZVBhcmFtZXRlcnMgcHA7CkBAIC0xNTUsNyArMTUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09ERVJfQlVGRkVSX0RFU0MgKnNjKQogewogICAgIGNvbnN0IHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBBVkRYVkFDb250ZXh0ICpjdHggPSBEWFZBX0NPTlRFWFQoYXZjdHgpOwogICAgIHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgKmN0eF9waWMgPQogICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKICAgICBjb25zdCBpbnQgaXNfZmllbGQgPSBzLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FOwpAQCAtMTY3LDcgKzE2NCw3IEBACiAgICAgdW5zaWduZWQgdHlwZTsKIAogI2lmIENPTkZJR19EM0QxMVZBCi0gICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQpIHsKKyAgICBpZiAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpKSB7CiAgICAgICAgIHR5cGUgPSBEM0QxMV9WSURFT19ERUNPREVSX0JVRkZFUl9CSVRTVFJFQU07CiAgICAgICAgIGlmIChGQUlMRUQoSUQzRDExVmlkZW9Db250ZXh0X0dldERlY29kZXJCdWZmZXIoRDNEMTFWQV9DT05URVhUKGN0eCktPnZpZGVvX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEMTFWQV9DT05URVhUKGN0eCktPmRlY29kZXIsCkBAIC0yMTEsNyArMjA4LDcgQEAKICAgICAgICAgY3VycmVudCArPSBzaXplOwogICAgIH0KICNpZiBDT05GSUdfRDNEMTFWQQotICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKQorICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpCiAgICAgICAgIGlmIChGQUlMRUQoSUQzRDExVmlkZW9Db250ZXh0X1JlbGVhc2VEZWNvZGVyQnVmZmVyKEQzRDExVkFfQ09OVEVYVChjdHgpLT52aWRlb19jb250ZXh0LCBEM0QxMVZBX0NPTlRFWFQoY3R4KS0+ZGVjb2RlciwgdHlwZSkpKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogI2VuZGlmCkBAIC0yMjQsNyArMjIxLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkgeworICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpIHsKICAgICAgICAgRDNEMTFfVklERU9fREVDT0RFUl9CVUZGRVJfREVTQyAqZHNjMTEgPSBiczsKICAgICAgICAgbWVtc2V0KGRzYzExLCAwLCBzaXplb2YoKmRzYzExKSk7CiAgICAgICAgIGRzYzExLT5CdWZmZXJUeXBlICAgICAgICAgICA9IHR5cGU7CkBAIC0yNTgsMTMgKzI1NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl91bnVzZWQgdWludDMyX3Qgc2l6ZSkKIHsKICAgICBjb25zdCBzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0KICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CiAKLSAgICBpZiAoRFhWQV9DT05URVhUX0RFQ09ERVIoYXZjdHgsIGN0eCkgPT0gTlVMTCB8fAotICAgICAgICBEWFZBX0NPTlRFWFRfQ0ZHKGF2Y3R4LCBjdHgpID09IE5VTEwgfHwKLSAgICAgICAgRFhWQV9DT05URVhUX0NPVU5UKGF2Y3R4LCBjdHgpIDw9IDApCisgICAgaWYgKCFEWFZBX0NPTlRFWFRfVkFMSUQoYXZjdHgsIGN0eCkpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBhc3NlcnQoY3R4X3BpYyk7CiAKQEAgLTMxOSwyNyArMzE0LDUyIEBACiB9CiAKICNpZiBDT05GSUdfTVBFRzJfRFhWQTJfSFdBQ0NFTAotQVZIV0FjY2VsIGZmX21wZWcyX2R4dmEyX2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzJfZHh2YTJfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzJfZHh2YTIiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAogICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfRFhWQTJfVkxELAorICAgIC5pbml0ICAgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IGZmX2R4dmEyX2RlY29kZV91bmluaXQsCiAgICAgLnN0YXJ0X2ZyYW1lICAgID0gZHh2YTJfbXBlZzJfc3RhcnRfZnJhbWUsCiAgICAgLmRlY29kZV9zbGljZSAgID0gZHh2YTJfbXBlZzJfZGVjb2RlX3NsaWNlLAogICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX21wZWcyX2VuZF9mcmFtZSwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSBmZl9keHZhMl9jb21tb25fZnJhbWVfcGFyYW1zLAogICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZEWFZBU2hhcmVkQ29udGV4dCksCiB9OwogI2VuZGlmCiAKICNpZiBDT05GSUdfTVBFRzJfRDNEMTFWQV9IV0FDQ0VMCi1BVkhXQWNjZWwgZmZfbXBlZzJfZDNkMTF2YV9od2FjY2VsID0geworY29uc3QgQVZIV0FjY2VsIGZmX21wZWcyX2QzZDExdmFfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzJfZDNkMTF2YSIsCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCiAgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAogICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX21wZWcyX3N0YXJ0X2ZyYW1lLAogICAgIC5kZWNvZGVfc2xpY2UgICA9IGR4dmEyX21wZWcyX2RlY29kZV9zbGljZSwKICAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl9tcGVnMl9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKICAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGRFhWQVNoYXJlZENvbnRleHQpLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcyX0QzRDExVkEyX0hXQUNDRUwKK2NvbnN0IEFWSFdBY2NlbCBmZl9tcGVnMl9kM2QxMXZhMl9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnMl9kM2QxMXZhMiIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EM0QxMSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAorICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX21wZWcyX3N0YXJ0X2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICA9IGR4dmEyX21wZWcyX2RlY29kZV9zbGljZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl9tcGVnMl9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGRFhWQVNoYXJlZENvbnRleHQpLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9keHZhMl92YzEuYyBiL2xpYmF2Y29kZWMvZHh2YTJfdmMxLmMKaW5kZXggN2NiYmM3ZS4uZjA4YWM4YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9keHZhMl92YzEuYworKysgYi9saWJhdmNvZGVjL2R4dmEyX3ZjMS5jCkBAIC0yMCwxOCArMjAsMTcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAiZHh2YTJfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKICNpbmNsdWRlICJ2YzEuaCIKICNpbmNsdWRlICJ2YzFkYXRhLmgiCiAKLS8vIFRoZSBoZWFkZXJzIGFib3ZlIG1heSBpbmNsdWRlIHczMnRocmVhZHMuaCwgd2hpY2ggdXNlcyB0aGUgb3JpZ2luYWwKLS8vIF9XSU4zMl9XSU5OVCBkZWZpbmUsIHdoaWxlIGR4dmEyX2ludGVybmFsLmggcmVkZWZpbmVzIGl0IHRvIHRhcmdldCBhCi0vLyBwb3RlbnRpYWxseSBuZXdlciB2ZXJzaW9uLgotI2luY2x1ZGUgImR4dmEyX2ludGVybmFsLmgiCisjZGVmaW5lIE1BWF9TTElDRVMgMTAyNAogCiBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0IHsKICAgICBEWFZBX1BpY3R1cmVQYXJhbWV0ZXJzIHBwOwotICAgIERYVkFfU2xpY2VJbmZvICAgICAgICAgc2k7CisgICAgdW5zaWduZWQgICAgICAgICAgICAgICBzbGljZV9jb3VudDsKKyAgICBEWFZBX1NsaWNlSW5mbyAgICAgICAgIHNsaWNlW01BWF9TTElDRVNdOwogCiAgICAgY29uc3QgdWludDhfdCAgICAgICAgICAqYml0c3RyZWFtOwogICAgIHVuc2lnbmVkICAgICAgICAgICAgICAgYml0c3RyZWFtX3NpemU7CkBAIC0xNzQsNyArMTczLDggQEAKICAgICBzbGljZS0+YlN0YXJ0Q29kZUJpdE9mZnNldCA9IDA7CiAgICAgc2xpY2UtPmJSZXNlcnZlZEJpdHMgICAgICAgPSAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmICF2LT5iaV90eXBlKSA/IHYtPmJmcmFjdGlvbl9sdXRfaW5kZXggKyA5IDogMDsKICAgICBzbGljZS0+d01CYml0T2Zmc2V0ICAgICAgICA9IHYtPnBfZnJhbWVfc2tpcHBlZCA/IDB4ZmZmZiA6IGdldF9iaXRzX2NvdW50KCZzLT5nYikgKyAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSA/IDMyIDogMCk7Ci0gICAgc2xpY2UtPndOdW1iZXJNQnNJblNsaWNlICAgPSBzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodDsgLyogWFhYIFdlIGFzc3VtZSAxIHNsaWNlICovCisgICAgLyogWFhYIFdlIHN0b3JlIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgTUIgYW5kIGl0IHdpbGwgYmUgZml4ZWQgbGF0ZXIgKi8KKyAgICBzbGljZS0+d051bWJlck1Cc0luU2xpY2UgICA9IChzLT5tYl95ID4+IHYtPmZpZWxkX21vZGUpICogcy0+bWJfd2lkdGggKyBzLT5tYl94OwogICAgIHNsaWNlLT53UXVhbnRpemVyU2NhbGVDb2RlID0gdi0+cHE7CiAgICAgc2xpY2UtPndCYWRTbGljZUNob3BwaW5nICAgPSAwOwogfQpAQCAtMTg0LDI2ICsxODQsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQ09ERVJfQlVGRkVSX0RFU0MgKnNjKQogewogICAgIGNvbnN0IFZDMUNvbnRleHQgKnYgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICBjb25zdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOwogICAgIHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgKmN0eF9waWMgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKIAotICAgIERYVkFfU2xpY2VJbmZvICpzbGljZSA9ICZjdHhfcGljLT5zaTsKLQogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHN0YXJ0X2NvZGVbXSA9IHsgMCwgMCwgMSwgMHgwZCB9OwogICAgIGNvbnN0IHVuc2lnbmVkIHN0YXJ0X2NvZGVfc2l6ZSA9IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEgPyBzaXplb2Yoc3RhcnRfY29kZSkgOiAwOwotICAgIGNvbnN0IHVuc2lnbmVkIHNsaWNlX3NpemUgPSBzbGljZS0+ZHdTbGljZUJpdHNJbkJ1ZmZlciAvIDg7Ci0gICAgY29uc3QgdW5zaWduZWQgcGFkZGluZyA9IDEyOCAtICgoc3RhcnRfY29kZV9zaXplICsgc2xpY2Vfc2l6ZSkgJiAxMjcpOwotICAgIGNvbnN0IHVuc2lnbmVkIGRhdGFfc2l6ZSA9IHN0YXJ0X2NvZGVfc2l6ZSArIHNsaWNlX3NpemUgKyBwYWRkaW5nOwotCisgICAgY29uc3QgdW5zaWduZWQgbWJfY291bnQgPSBzLT5tYl93aWR0aCAqIChzLT5tYl9oZWlnaHQgPj4gdi0+ZmllbGRfbW9kZSk7CisgICAgRFhWQV9TbGljZUluZm8gKnNsaWNlID0gTlVMTDsKICAgICB2b2lkICAgICAqZHh2YV9kYXRhX3B0cjsKLSAgICB1aW50OF90ICAqZHh2YV9kYXRhOworICAgIHVpbnQ4X3QgICpkeHZhX2RhdGEsICpjdXJyZW50LCAqZW5kOwogICAgIHVuc2lnbmVkIGR4dmFfc2l6ZTsKLSAgICBpbnQgcmVzdWx0OworICAgIHVuc2lnbmVkIHBhZGRpbmc7CisgICAgdW5zaWduZWQgaTsKICAgICB1bnNpZ25lZCB0eXBlOwogCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkgeworICAgIGlmIChmZl9keHZhMl9pc19kM2QxMShhdmN0eCkpIHsKICAgICAgICAgdHlwZSA9IEQzRDExX1ZJREVPX0RFQ09ERVJfQlVGRkVSX0JJVFNUUkVBTTsKICAgICAgICAgaWYgKEZBSUxFRChJRDNEMTFWaWRlb0NvbnRleHRfR2V0RGVjb2RlckJ1ZmZlcihEM0QxMVZBX0NPTlRFWFQoY3R4KS0+dmlkZW9fY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0QxMVZBX0NPTlRFWFQoY3R4KS0+ZGVjb2RlciwKQEAgLTIyMywyMSArMjIwLDUxIEBACiAjZW5kaWYKIAogICAgIGR4dmFfZGF0YSA9IGR4dmFfZGF0YV9wdHI7Ci0gICAgcmVzdWx0ID0gZGF0YV9zaXplIDw9IGR4dmFfc2l6ZSA/IDAgOiAtMTsKLSAgICBpZiAoIXJlc3VsdCkgewotICAgICAgICBpZiAoc3RhcnRfY29kZV9zaXplID4gMCkgewotICAgICAgICAgICAgbWVtY3B5KGR4dmFfZGF0YSwgc3RhcnRfY29kZSwgc3RhcnRfY29kZV9zaXplKTsKLSAgICAgICAgICAgIGlmICh2LT5zZWNvbmRfZmllbGQpCi0gICAgICAgICAgICAgICAgZHh2YV9kYXRhWzNdID0gMHgwYzsKKyAgICBjdXJyZW50ID0gZHh2YV9kYXRhOworICAgIGVuZCA9IGR4dmFfZGF0YSArIGR4dmFfc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHhfcGljLT5zbGljZV9jb3VudDsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIHBvc2l0aW9uLCBzaXplOworICAgICAgICBzbGljZSAgICA9ICZjdHhfcGljLT5zbGljZVtpXTsKKyAgICAgICAgcG9zaXRpb24gPSBzbGljZS0+ZHdTbGljZURhdGFMb2NhdGlvbjsKKyAgICAgICAgc2l6ZSAgICAgPSBzbGljZS0+ZHdTbGljZUJpdHNJbkJ1ZmZlciAvIDg7CisgICAgICAgIGlmIChzdGFydF9jb2RlX3NpemUgKyBzaXplID4gZW5kIC0gY3VycmVudCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYnVpbGQgYml0c3RyZWFtIik7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBtZW1jcHkoZHh2YV9kYXRhICsgc3RhcnRfY29kZV9zaXplLAotICAgICAgICAgICAgICAgY3R4X3BpYy0+Yml0c3RyZWFtICsgc2xpY2UtPmR3U2xpY2VEYXRhTG9jYXRpb24sIHNsaWNlX3NpemUpOwotICAgICAgICBpZiAocGFkZGluZyA+IDApCi0gICAgICAgICAgICBtZW1zZXQoZHh2YV9kYXRhICsgc3RhcnRfY29kZV9zaXplICsgc2xpY2Vfc2l6ZSwgMCwgcGFkZGluZyk7Ci0gICAgICAgIHNsaWNlLT5kd1NsaWNlQml0c0luQnVmZmVyID0gOCAqIGRhdGFfc2l6ZTsKKyAgICAgICAgc2xpY2UtPmR3U2xpY2VEYXRhTG9jYXRpb24gPSBjdXJyZW50IC0gZHh2YV9kYXRhOworCisgICAgICAgIGlmIChpIDwgY3R4X3BpYy0+c2xpY2VfY291bnQgLSAxKQorICAgICAgICAgICAgc2xpY2UtPndOdW1iZXJNQnNJblNsaWNlID0KKyAgICAgICAgICAgICAgICBzbGljZVsxXS53TnVtYmVyTUJzSW5TbGljZSAtIHNsaWNlWzBdLndOdW1iZXJNQnNJblNsaWNlOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzbGljZS0+d051bWJlck1Cc0luU2xpY2UgPQorICAgICAgICAgICAgICAgIG1iX2NvdW50IC0gc2xpY2VbMF0ud051bWJlck1Cc0luU2xpY2U7CisKKyAgICAgICAgLyogd3JpdGUgdGhlIGFwcHJvcHJpYXRlIGZyYW1lLCBmaWVsZCBvciBzbGljZSBzdGFydCBjb2RlICovCisgICAgICAgIGlmIChzdGFydF9jb2RlX3NpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShjdXJyZW50LCBzdGFydF9jb2RlLCBzdGFydF9jb2RlX3NpemUpOworICAgICAgICAgICAgaWYgKGkgPT0gMCAmJiB2LT5zZWNvbmRfZmllbGQpCisgICAgICAgICAgICAgICAgY3VycmVudFszXSA9IDB4MGM7CisgICAgICAgICAgICBlbHNlIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICBjdXJyZW50WzNdID0gMHgwYjsKKworICAgICAgICAgICAgY3VycmVudCArPSBzdGFydF9jb2RlX3NpemU7CisgICAgICAgICAgICBzbGljZS0+ZHdTbGljZUJpdHNJbkJ1ZmZlciArPSBzdGFydF9jb2RlX3NpemUgKiA4OworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KGN1cnJlbnQsICZjdHhfcGljLT5iaXRzdHJlYW1bcG9zaXRpb25dLCBzaXplKTsKKyAgICAgICAgY3VycmVudCArPSBzaXplOwogICAgIH0KKyAgICBwYWRkaW5nID0gRkZNSU4oMTI4IC0gKChjdXJyZW50IC0gZHh2YV9kYXRhKSAmIDEyNyksIGVuZCAtIGN1cnJlbnQpOworICAgIGlmIChzbGljZSAmJiBwYWRkaW5nID4gMCkgeworICAgICAgICBtZW1zZXQoY3VycmVudCwgMCwgcGFkZGluZyk7CisgICAgICAgIGN1cnJlbnQgKz0gcGFkZGluZzsKKyAgICAgICAgc2xpY2UtPmR3U2xpY2VCaXRzSW5CdWZmZXIgKz0gcGFkZGluZyAqIDg7CisgICAgfQorCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkKKyAgICBpZiAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpKQogICAgICAgICBpZiAoRkFJTEVEKElEM0QxMVZpZGVvQ29udGV4dF9SZWxlYXNlRGVjb2RlckJ1ZmZlcihEM0QxMVZBX0NPTlRFWFQoY3R4KS0+dmlkZW9fY29udGV4dCwgRDNEMTFWQV9DT05URVhUKGN0eCktPmRlY29kZXIsIHR5cGUpKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICNlbmRpZgpAQCAtMjQ2LDE2ICsyNzMsMTYgQEAKICAgICAgICAgaWYgKEZBSUxFRChJRGlyZWN0WFZpZGVvRGVjb2Rlcl9SZWxlYXNlQnVmZmVyKERYVkEyX0NPTlRFWFQoY3R4KS0+ZGVjb2RlciwgdHlwZSkpKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogI2VuZGlmCi0gICAgaWYgKHJlc3VsdCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICBpZiAoaSA8IGN0eF9waWMtPnNsaWNlX2NvdW50KQorICAgICAgICByZXR1cm4gLTE7CiAKICNpZiBDT05GSUdfRDNEMTFWQQotICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKSB7CisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkgewogICAgICAgICBEM0QxMV9WSURFT19ERUNPREVSX0JVRkZFUl9ERVNDICpkc2MxMSA9IGJzOwogICAgICAgICBtZW1zZXQoZHNjMTEsIDAsIHNpemVvZigqZHNjMTEpKTsKICAgICAgICAgZHNjMTEtPkJ1ZmZlclR5cGUgICAgICAgICAgID0gdHlwZTsKLSAgICAgICAgZHNjMTEtPkRhdGFTaXplICAgICAgICAgICAgID0gZGF0YV9zaXplOwotICAgICAgICBkc2MxMS0+TnVtTUJzSW5CdWZmZXIgICAgICAgPSBzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodDsKKyAgICAgICAgZHNjMTEtPkRhdGFTaXplICAgICAgICAgICAgID0gY3VycmVudCAtIGR4dmFfZGF0YTsKKyAgICAgICAgZHNjMTEtPk51bU1Cc0luQnVmZmVyICAgICAgID0gbWJfY291bnQ7CiAKICAgICAgICAgdHlwZSA9IEQzRDExX1ZJREVPX0RFQ09ERVJfQlVGRkVSX1NMSUNFX0NPTlRST0w7CiAgICAgfQpAQCAtMjY1LDE3ICsyOTIsMTggQEAKICAgICAgICAgRFhWQTJfRGVjb2RlQnVmZmVyRGVzYyAqZHNjMiA9IGJzOwogICAgICAgICBtZW1zZXQoZHNjMiwgMCwgc2l6ZW9mKCpkc2MyKSk7CiAgICAgICAgIGRzYzItPkNvbXByZXNzZWRCdWZmZXJUeXBlID0gdHlwZTsKLSAgICAgICAgZHNjMi0+RGF0YVNpemUgICAgICAgICAgICAgPSBkYXRhX3NpemU7Ci0gICAgICAgIGRzYzItPk51bU1Cc0luQnVmZmVyICAgICAgID0gcy0+bWJfd2lkdGggKiBzLT5tYl9oZWlnaHQ7CisgICAgICAgIGRzYzItPkRhdGFTaXplICAgICAgICAgICAgID0gY3VycmVudCAtIGR4dmFfZGF0YTsKKyAgICAgICAgZHNjMi0+TnVtTUJzSW5CdWZmZXIgICAgICAgPSBtYl9jb3VudDsKIAogICAgICAgICB0eXBlID0gRFhWQTJfU2xpY2VDb250cm9sQnVmZmVyVHlwZTsKICAgICB9CiAjZW5kaWYKLSAgICBhc3NlcnQoKGRhdGFfc2l6ZSAmIDEyNykgPT0gMCk7CiAKICAgICByZXR1cm4gZmZfZHh2YTJfY29tbWl0X2J1ZmZlcihhdmN0eCwgY3R4LCBzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLCBzaXplb2YoKnNsaWNlKSwgcy0+bWJfd2lkdGggKiBzLT5tYl9oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eF9waWMtPnNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eF9waWMtPnNsaWNlX2NvdW50ICogc2l6ZW9mKCpjdHhfcGljLT5zbGljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfY291bnQpOwogfQogCiBzdGF0aWMgaW50IGR4dmEyX3ZjMV9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCkBAIC0yODMsMTcgKzMxMSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90IHNpemUpCiB7CiAgICAgY29uc3QgVkMxQ29udGV4dCAqdiA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBBVkRYVkFDb250ZXh0ICpjdHggPSBEWFZBX0NPTlRFWFQoYXZjdHgpOwogICAgIHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgKmN0eF9waWMgPSB2LT5zLmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogCi0gICAgaWYgKERYVkFfQ09OVEVYVF9ERUNPREVSKGF2Y3R4LCBjdHgpID09IE5VTEwgfHwKLSAgICAgICAgRFhWQV9DT05URVhUX0NGRyhhdmN0eCwgY3R4KSA9PSBOVUxMIHx8Ci0gICAgICAgIERYVkFfQ09OVEVYVF9DT1VOVChhdmN0eCwgY3R4KSA8PSAwKQorICAgIGlmICghRFhWQV9DT05URVhUX1ZBTElEKGF2Y3R4LCBjdHgpKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgYXNzZXJ0KGN0eF9waWMpOwogCiAgICAgZmlsbF9waWN0dXJlX3BhcmFtZXRlcnMoYXZjdHgsIGN0eCwgdiwgJmN0eF9waWMtPnBwKTsKIAorICAgIGN0eF9waWMtPnNsaWNlX2NvdW50ICAgID0gMDsKICAgICBjdHhfcGljLT5iaXRzdHJlYW1fc2l6ZSA9IDA7CiAgICAgY3R4X3BpYy0+Yml0c3RyZWFtICAgICAgPSBOVUxMOwogICAgIHJldHVybiAwOwpAQCAtMzA2LDkgKzMzMywxMyBAQAogICAgIGNvbnN0IFZDMUNvbnRleHQgKnYgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGNvbnN0IFBpY3R1cmUgKmN1cnJlbnRfcGljdHVyZSA9IHYtPnMuY3VycmVudF9waWN0dXJlX3B0cjsKICAgICBzdHJ1Y3QgZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0gY3VycmVudF9waWN0dXJlLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICB1bnNpZ25lZCBwb3NpdGlvbjsKIAotICAgIGlmIChjdHhfcGljLT5iaXRzdHJlYW1fc2l6ZSA+IDApCisgICAgaWYgKGN0eF9waWMtPnNsaWNlX2NvdW50ID49IE1BWF9TTElDRVMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiJWQgc2xpY2VzIGluIGR4dmEyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eF9waWMtPnNsaWNlX2NvdW50KTsKICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KIAogICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxICYmCiAgICAgICAgIHNpemUgPj0gNCAmJiBJU19NQVJLRVIoQVZfUkIzMihidWZmZXIpKSkgewpAQCAtMzE2LDEwICszNDcsMTIgQEAKICAgICAgICAgc2l6ZSAgIC09IDQ7CiAgICAgfQogCi0gICAgY3R4X3BpYy0+Yml0c3RyZWFtX3NpemUgPSBzaXplOwotICAgIGN0eF9waWMtPmJpdHN0cmVhbSAgICAgID0gYnVmZmVyOworICAgIGlmICghY3R4X3BpYy0+Yml0c3RyZWFtKQorICAgICAgICBjdHhfcGljLT5iaXRzdHJlYW0gPSBidWZmZXI7CisgICAgY3R4X3BpYy0+Yml0c3RyZWFtX3NpemUgKz0gc2l6ZTsKIAotICAgIGZpbGxfc2xpY2UoYXZjdHgsICZjdHhfcGljLT5zaSwgMCwgc2l6ZSk7CisgICAgcG9zaXRpb24gPSBidWZmZXIgLSBjdHhfcGljLT5iaXRzdHJlYW07CisgICAgZmlsbF9zbGljZShhdmN0eCwgJmN0eF9waWMtPnNsaWNlW2N0eF9waWMtPnNsaWNlX2NvdW50KytdLCBwb3NpdGlvbiwgc2l6ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTMyOSw3ICszNjIsNyBAQAogICAgIHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQgKmN0eF9waWMgPSB2LT5zLmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogICAgIGludCByZXQ7CiAKLSAgICBpZiAoY3R4X3BpYy0+Yml0c3RyZWFtX3NpemUgPD0gMCkKKyAgICBpZiAoY3R4X3BpYy0+c2xpY2VfY291bnQgPD0gMCB8fCBjdHhfcGljLT5iaXRzdHJlYW1fc2l6ZSA8PSAwKQogICAgICAgICByZXR1cm4gLTE7CiAKICAgICByZXQgPSBmZl9keHZhMl9jb21tb25fZW5kX2ZyYW1lKGF2Y3R4LCB2LT5zLmN1cnJlbnRfcGljdHVyZV9wdHItPmYsCkBAIC0zNDIsNTMgKzM3NSwxMDMgQEAKIH0KIAogI2lmIENPTkZJR19XTVYzX0RYVkEyX0hXQUNDRUwKLUFWSFdBY2NlbCBmZl93bXYzX2R4dmEyX2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfd212M19keHZhMl9od2FjY2VsID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJ3bXYzX2R4dmEyIiwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01WMywKICAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX0RYVkEyX1ZMRCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAogICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX3ZjMV9zdGFydF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl92YzFfZGVjb2RlX3NsaWNlLAogICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX3ZjMV9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKICAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGRFhWQVNoYXJlZENvbnRleHQpLAogfTsKICNlbmRpZgogCiAjaWYgQ09ORklHX1ZDMV9EWFZBMl9IV0FDQ0VMCi1BVkhXQWNjZWwgZmZfdmMxX2R4dmEyX2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfdmMxX2R4dmEyX2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gInZjMV9keHZhMiIsCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKICAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX0RYVkEyX1ZMRCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAogICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX3ZjMV9zdGFydF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl92YzFfZGVjb2RlX3NsaWNlLAogICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX3ZjMV9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKICAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGRFhWQVNoYXJlZENvbnRleHQpLAogfTsKICNlbmRpZgogCiAjaWYgQ09ORklHX1dNVjNfRDNEMTFWQV9IV0FDQ0VMCi1BVkhXQWNjZWwgZmZfd212M19kM2QxMXZhX2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfd212M19kM2QxMXZhX2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gIndtdjNfZDNkMTF2YSIsCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjMsCiAgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAogICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX3ZjMV9zdGFydF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl92YzFfZGVjb2RlX3NsaWNlLAogICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX3ZjMV9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKICAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGRFhWQVNoYXJlZENvbnRleHQpLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1dNVjNfRDNEMTFWQTJfSFdBQ0NFTAorY29uc3QgQVZIV0FjY2VsIGZmX3dtdjNfZDNkMTF2YTJfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid212M19kM2QxMXZhMiIsCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjMsCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EM0QxMSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAorICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX3ZjMV9zdGFydF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl92YzFfZGVjb2RlX3NsaWNlLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX3ZjMV9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGRFhWQVNoYXJlZENvbnRleHQpLAogfTsKICNlbmRpZgogCiAjaWYgQ09ORklHX1ZDMV9EM0QxMVZBX0hXQUNDRUwKLUFWSFdBY2NlbCBmZl92YzFfZDNkMTF2YV9od2FjY2VsID0geworY29uc3QgQVZIV0FjY2VsIGZmX3ZjMV9kM2QxMXZhX2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gInZjMV9kM2QxMXZhIiwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVkMxLAogICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQsCisgICAgLmluaXQgICAgICAgICAgID0gZmZfZHh2YTJfZGVjb2RlX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgID0gZmZfZHh2YTJfZGVjb2RlX3VuaW5pdCwKICAgICAuc3RhcnRfZnJhbWUgICAgPSBkeHZhMl92YzFfc3RhcnRfZnJhbWUsCiAgICAgLmRlY29kZV9zbGljZSAgID0gZHh2YTJfdmMxX2RlY29kZV9zbGljZSwKICAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl92YzFfZW5kX2ZyYW1lLAorICAgIC5mcmFtZV9wYXJhbXMgICA9IGZmX2R4dmEyX2NvbW1vbl9mcmFtZV9wYXJhbXMsCiAgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBkeHZhMl9waWN0dXJlX2NvbnRleHQpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRkRYVkFTaGFyZWRDb250ZXh0KSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19WQzFfRDNEMTFWQTJfSFdBQ0NFTAorY29uc3QgQVZIV0FjY2VsIGZmX3ZjMV9kM2QxMXZhMl9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2YzFfZDNkMTF2YTIiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQzEsCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EM0QxMSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAorICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX3ZjMV9zdGFydF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl92YzFfZGVjb2RlX3NsaWNlLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX3ZjMV9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGR4dmEyX3BpY3R1cmVfY29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGRFhWQVNoYXJlZENvbnRleHQpLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9keHZhMl92cDkuYyBiL2xpYmF2Y29kZWMvZHh2YTJfdnA5LmMKaW5kZXggMGM0OTk2Yy4uZWFlYWIzYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9keHZhMl92cDkuYworKysgYi9saWJhdmNvZGVjL2R4dmEyX3ZwOS5jCkBAIC0yMywxMiArMjMsOCBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAKLSNpbmNsdWRlICJ2cDkuaCIKLQotLy8gVGhlIGhlYWRlcnMgYWJvdmUgbWF5IGluY2x1ZGUgdzMydGhyZWFkcy5oLCB3aGljaCB1c2VzIHRoZSBvcmlnaW5hbAotLy8gX1dJTjMyX1dJTk5UIGRlZmluZSwgd2hpbGUgZHh2YTJfaW50ZXJuYWwuaCByZWRlZmluZXMgaXQgdG8gdGFyZ2V0IGEKLS8vIHBvdGVudGlhbGx5IG5ld2VyIHZlcnNpb24uCiAjaW5jbHVkZSAiZHh2YTJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2cDlzaGFyZWQuaCIKIAogc3RydWN0IHZwOV9keHZhMl9waWN0dXJlX2NvbnRleHQgewogICAgIERYVkFfUGljUGFyYW1zX1ZQOSAgICBwcDsKQEAgLTE3MCw3ICsxNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVDT0RFUl9CVUZGRVJfREVTQyAqc2MpCiB7CiAgICAgY29uc3QgVlA5U2hhcmVkQ29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBBVkRYVkFDb250ZXh0ICpjdHggPSBEWFZBX0NPTlRFWFQoYXZjdHgpOwogICAgIHN0cnVjdCB2cDlfZHh2YTJfcGljdHVyZV9jb250ZXh0ICpjdHhfcGljID0gaC0+ZnJhbWVzW0NVUl9GUkFNRV0uaHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CiAgICAgdm9pZCAgICAgKmR4dmFfZGF0YV9wdHI7CiAgICAgdWludDhfdCAgKmR4dmFfZGF0YTsKQEAgLTE3OSw3ICsxNzUsNyBAQAogICAgIHVuc2lnbmVkIHR5cGU7CiAKICNpZiBDT05GSUdfRDNEMTFWQQotICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEKSB7CisgICAgaWYgKGZmX2R4dmEyX2lzX2QzZDExKGF2Y3R4KSkgewogICAgICAgICB0eXBlID0gRDNEMTFfVklERU9fREVDT0RFUl9CVUZGRVJfQklUU1RSRUFNOwogICAgICAgICBpZiAoRkFJTEVEKElEM0QxMVZpZGVvQ29udGV4dF9HZXREZWNvZGVyQnVmZmVyKEQzRDExVkFfQ09OVEVYVChjdHgpLT52aWRlb19jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRDExVkFfQ09OVEVYVChjdHgpLT5kZWNvZGVyLApAQCAtMjE0LDcgKzIxMCw3IEBACiAgICAgfQogCiAjaWYgQ09ORklHX0QzRDExVkEKLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCkKKyAgICBpZiAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpKQogICAgICAgICBpZiAoRkFJTEVEKElEM0QxMVZpZGVvQ29udGV4dF9SZWxlYXNlRGVjb2RlckJ1ZmZlcihEM0QxMVZBX0NPTlRFWFQoY3R4KS0+dmlkZW9fY29udGV4dCwgRDNEMTFWQV9DT05URVhUKGN0eCktPmRlY29kZXIsIHR5cGUpKSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICNlbmRpZgpAQCAtMjI1LDcgKzIyMSw3IEBACiAjZW5kaWYKIAogI2lmIENPTkZJR19EM0QxMVZBCi0gICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQpIHsKKyAgICBpZiAoZmZfZHh2YTJfaXNfZDNkMTEoYXZjdHgpKSB7CiAgICAgICAgIEQzRDExX1ZJREVPX0RFQ09ERVJfQlVGRkVSX0RFU0MgKmRzYzExID0gYnM7CiAgICAgICAgIG1lbXNldChkc2MxMSwgMCwgc2l6ZW9mKCpkc2MxMSkpOwogICAgICAgICBkc2MxMS0+QnVmZmVyVHlwZSAgICAgICAgICAgPSB0eXBlOwpAQCAtMjU4LDEyICsyNTQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCB1aW50MzJfdCBzaXplKQogewogICAgIGNvbnN0IFZQOVNoYXJlZENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRFhWQUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZEWFZBQ29udGV4dCAqY3R4ID0gRFhWQV9DT05URVhUKGF2Y3R4KTsKICAgICBzdHJ1Y3QgdnA5X2R4dmEyX3BpY3R1cmVfY29udGV4dCAqY3R4X3BpYyA9IGgtPmZyYW1lc1tDVVJfRlJBTUVdLmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogCi0gICAgaWYgKERYVkFfQ09OVEVYVF9ERUNPREVSKGF2Y3R4LCBjdHgpID09IE5VTEwgfHwKLSAgICAgICAgRFhWQV9DT05URVhUX0NGRyhhdmN0eCwgY3R4KSA9PSBOVUxMIHx8Ci0gICAgICAgIERYVkFfQ09OVEVYVF9DT1VOVChhdmN0eCwgY3R4KSA8PSAwKQorICAgIGlmICghRFhWQV9DT05URVhUX1ZBTElEKGF2Y3R4LCBjdHgpKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgYXZfYXNzZXJ0MChjdHhfcGljKTsKIApAQCAtMzExLDI3ICszMDUsNTIgQEAKIH0KIAogI2lmIENPTkZJR19WUDlfRFhWQTJfSFdBQ0NFTAotQVZIV0FjY2VsIGZmX3ZwOV9keHZhMl9od2FjY2VsID0geworY29uc3QgQVZIV0FjY2VsIGZmX3ZwOV9keHZhMl9od2FjY2VsID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJ2cDlfZHh2YTIiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDksCiAgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EWFZBMl9WTEQsCisgICAgLmluaXQgICAgICAgICAgID0gZmZfZHh2YTJfZGVjb2RlX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgID0gZmZfZHh2YTJfZGVjb2RlX3VuaW5pdCwKICAgICAuc3RhcnRfZnJhbWUgICAgPSBkeHZhMl92cDlfc3RhcnRfZnJhbWUsCiAgICAgLmRlY29kZV9zbGljZSAgID0gZHh2YTJfdnA5X2RlY29kZV9zbGljZSwKICAgICAuZW5kX2ZyYW1lICAgICAgPSBkeHZhMl92cDlfZW5kX2ZyYW1lLAorICAgIC5mcmFtZV9wYXJhbXMgICA9IGZmX2R4dmEyX2NvbW1vbl9mcmFtZV9wYXJhbXMsCiAgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2cDlfZHh2YTJfcGljdHVyZV9jb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZEWFZBU2hhcmVkQ29udGV4dCksCiB9OwogI2VuZGlmCiAKICNpZiBDT05GSUdfVlA5X0QzRDExVkFfSFdBQ0NFTAotQVZIV0FjY2VsIGZmX3ZwOV9kM2QxMXZhX2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfdnA5X2QzZDExdmFfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAidnA5X2QzZDExdmEiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDksCiAgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAogICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX3ZwOV9zdGFydF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl92cDlfZGVjb2RlX3NsaWNlLAogICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX3ZwOV9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKICAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZwOV9keHZhMl9waWN0dXJlX2NvbnRleHQpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRkRYVkFTaGFyZWRDb250ZXh0KSwKK307CisjZW5kaWYKKworI2lmIENPTkZJR19WUDlfRDNEMTFWQTJfSFdBQ0NFTAorY29uc3QgQVZIV0FjY2VsIGZmX3ZwOV9kM2QxMXZhMl9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2cDlfZDNkMTF2YTIiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDksCisgICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9EM0QxMSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSBmZl9keHZhMl9kZWNvZGVfdW5pbml0LAorICAgIC5zdGFydF9mcmFtZSAgICA9IGR4dmEyX3ZwOV9zdGFydF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgPSBkeHZhMl92cDlfZGVjb2RlX3NsaWNlLAorICAgIC5lbmRfZnJhbWUgICAgICA9IGR4dmEyX3ZwOV9lbmRfZnJhbWUsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfZHh2YTJfY29tbW9uX2ZyYW1lX3BhcmFtcywKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZwOV9keHZhMl9waWN0dXJlX2NvbnRleHQpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRkRYVkFTaGFyZWRDb250ZXh0KSwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZWFjM19jb3JlX2JzZi5jIGIvbGliYXZjb2RlYy9lYWMzX2NvcmVfYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0ZGMyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZWFjM19jb3JlX2JzZi5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJhYzNfcGFyc2VyX2ludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgZWFjM19jb3JlX2ZpbHRlcihBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBQzNIZWFkZXJJbmZvIGhkcjsKKyAgICBHZXRCaXRDb250ZXh0IGdiYzsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfYnNmX2dldF9wYWNrZXRfcmVmKGN0eCwgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICByZXQgPSBpbml0X2dldF9iaXRzOCgmZ2JjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldCA9IGZmX2FjM19wYXJzZV9oZWFkZXIoJmdiYywgJmhkcik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChoZHIuZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfSU5ERVBFTkRFTlQgfHwKKyAgICAgICAgaGRyLmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX0FDM19DT05WRVJUKSB7CisgICAgICAgIHBrdC0+c2l6ZSA9IEZGTUlOKGhkci5mcmFtZV9zaXplLCBwa3QtPnNpemUpOworICAgIH0gZWxzZSBpZiAoaGRyLmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX0RFUEVOREVOVCAmJiBwa3QtPnNpemUgPiBoZHIuZnJhbWVfc2l6ZSkgeworICAgICAgICBBQzNIZWFkZXJJbmZvIGhkcjI7CisKKyAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoJmdiYywgcGt0LT5kYXRhICsgaGRyLmZyYW1lX3NpemUsIHBrdC0+c2l6ZSAtIGhkci5mcmFtZV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgcmV0ID0gZmZfYWMzX3BhcnNlX2hlYWRlcigmZ2JjLCAmaGRyMik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhkcjIuZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfSU5ERVBFTkRFTlQgfHwKKyAgICAgICAgICAgIGhkcjIuZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfQUMzX0NPTlZFUlQpIHsKKyAgICAgICAgICAgIHBrdC0+c2l6ZSAtPSBoZHIuZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIHBrdC0+ZGF0YSArPSBoZHIuZnJhbWVfc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBrdC0+c2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwa3QtPnNpemUgPSAwOworICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgZW51bSBBVkNvZGVjSUQgY29kZWNfaWRzW10gPSB7CisgICAgQVZfQ09ERUNfSURfRUFDMywgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX2VhYzNfY29yZV9ic2YgPSB7CisgICAgLm5hbWUgICAgICA9ICJlYWMzX2NvcmUiLAorICAgIC5maWx0ZXIgICAgPSBlYWMzX2NvcmVfZmlsdGVyLAorICAgIC5jb2RlY19pZHMgPSBjb2RlY19pZHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9lYWMzZGVjLmMgYi9saWJhdmNvZGVjL2VhYzNkZWMuYwppbmRleCBlZjgxNWFmLi43MzA2N2RlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2VhYzNkZWMuYworKysgYi9saWJhdmNvZGVjL2VhYzNkZWMuYwpAQCAtNDgsNyArNDgsNiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYWFjX2FjM19wYXJzZXIuaCIKICNpbmNsdWRlICJhYzMuaCIKLSNpbmNsdWRlICJhYzNfcGFyc2VyLmgiCiAjaW5jbHVkZSAiYWMzZGVjLmgiCiAjaW5jbHVkZSAiYWMzZGVjX2RhdGEuaCIKICNpbmNsdWRlICJlYWMzX2RhdGEuaCIKQEAgLTI1Miw3ICsyNTEsNyBAQAogICAgICAgICAgICAgLyogVmVjdG9yIFF1YW50aXphdGlvbiAqLwogICAgICAgICAgICAgaW50IHYgPSBnZXRfYml0cyhnYmMsIGJpdHMpOwogICAgICAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCA2OyBibGsrKykgewotICAgICAgICAgICAgICAgIHMtPnByZV9tYW50aXNzYVtjaF1bYmluXVtibGtdID0gZmZfZWFjM19tYW50aXNzYV92cVtoZWJhcF1bdl1bYmxrXSA8PCA4OworICAgICAgICAgICAgICAgIHMtPnByZV9tYW50aXNzYVtjaF1bYmluXVtibGtdID0gZmZfZWFjM19tYW50aXNzYV92cVtoZWJhcF1bdl1bYmxrXSAqICgxIDw8IDgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogR2FpbiBBZGFwdGl2ZSBRdWFudGl6YXRpb24gKi8KQEAgLTI3MSwxNiArMjcwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIGludCBiOwogICAgICAgICAgICAgICAgICAgICBpbnQgbWJpdHMgPSBiaXRzIC0gKDIgLSBsb2dfZ2Fpbik7CiAgICAgICAgICAgICAgICAgICAgIG1hbnQgPSBnZXRfc2JpdHMoZ2JjLCBtYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIG1hbnQgPDw9ICgyMyAtIChtYml0cyAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgbWFudCA9ICgodW5zaWduZWQpbWFudCkgPDwgKDIzIC0gKG1iaXRzIC0gMSkpOwogICAgICAgICAgICAgICAgICAgICAvKiByZW1hcCBtYW50aXNzYSB2YWx1ZSB0byBjb3JyZWN0IGZvciBhc3ltbWV0cmljIHF1YW50aXphdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICBpZiAobWFudCA+PSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgYiA9IDEgPDwgKDIzIC0gbG9nX2dhaW4pOwogICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBiID0gZmZfZWFjM19nYXFfcmVtYXBfMl80X2JbaGViYXAtOF1bbG9nX2dhaW4tMV0gPDwgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBmZl9lYWMzX2dhcV9yZW1hcF8yXzRfYltoZWJhcC04XVtsb2dfZ2Fpbi0xXSAqICgxIDw8IDgpOwogICAgICAgICAgICAgICAgICAgICBtYW50ICs9ICgoZmZfZWFjM19nYXFfcmVtYXBfMl80X2FbaGViYXAtOF1bbG9nX2dhaW4tMV0gKiAoaW50NjRfdCltYW50KSA+PiAxNSkgKyBiOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIHNtYWxsIG1hbnRpc3NhLCBubyBHQVEsIG9yIEdrPTEgKi8KLSAgICAgICAgICAgICAgICAgICAgbWFudCA8PD0gMjQgLSBiaXRzOworICAgICAgICAgICAgICAgICAgICBtYW50ICo9ICgxIDw8IDI0IC0gYml0cyk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbG9nX2dhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbWFwIG1hbnRpc3NhIHZhbHVlIGZvciBubyBHQVEgb3IgR2s9MSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgbWFudCArPSAoZmZfZWFjM19nYXFfcmVtYXBfMVtoZWJhcC04XSAqIChpbnQ2NF90KW1hbnQpID4+IDE1OwpAQCAtMzA0LDEwICszMDMsNyBAQAogICAgIC8qIEFuIEUtQUMtMyBzdHJlYW0gY2FuIGhhdmUgbXVsdGlwbGUgaW5kZXBlbmRlbnQgc3RyZWFtcyB3aGljaCB0aGUKICAgICAgICBhcHBsaWNhdGlvbiBjYW4gc2VsZWN0IGZyb20uIGVhY2ggaW5kZXBlbmRlbnQgc3RyZWFtIGNhbiBhbHNvIGNvbnRhaW4KICAgICAgICBkZXBlbmRlbnQgc3RyZWFtcyB3aGljaCBhcmUgdXNlZCB0byBhZGQgb3IgcmVwbGFjZSBjaGFubmVscy4gKi8KLSAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBFQUMzX0ZSQU1FX1RZUEVfREVQRU5ERU5UKSB7Ci0gICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIkRlcGVuZGVudCBzdWJzdHJlYW0gZGVjb2RpbmciKTsKLSAgICAgICAgcmV0dXJuIEFBQ19BQzNfUEFSU0VfRVJST1JfRlJBTUVfVFlQRTsKLSAgICB9IGVsc2UgaWYgKHMtPmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX1JFU0VSVkVEKSB7CisgICAgaWYgKHMtPmZyYW1lX3R5cGUgPT0gRUFDM19GUkFNRV9UWVBFX1JFU0VSVkVEKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVzZXJ2ZWQgZnJhbWUgdHlwZVxuIik7CiAgICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX0ZSQU1FX1RZUEU7CiAgICAgfQpAQCAtMzE3LDcgKzMxMywxMCBAQAogICAgICAgIGFzc29jaWF0ZWQgdG8gYW4gaW5kZXBlbmRlbnQgc3RyZWFtIGhhdmUgbWF0Y2hpbmcgc3Vic3RyZWFtIGlkJ3MuICovCiAgICAgaWYgKHMtPnN1YnN0cmVhbWlkKSB7CiAgICAgICAgIC8qIG9ubHkgZGVjb2RlIHN1YnN0cmVhbSB3aXRoIGlkPTAuIHNraXAgYW55IGFkZGl0aW9uYWwgc3Vic3RyZWFtcy4gKi8KLSAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiQWRkaXRpb25hbCBzdWJzdHJlYW1zIik7CisgICAgICAgIGlmICghcy0+ZWFjM19zdWJzYnRyZWFtaWRfZm91bmQpIHsKKyAgICAgICAgICAgIHMtPmVhYzNfc3Vic2J0cmVhbWlkX2ZvdW5kID0gMTsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIkFkZGl0aW9uYWwgc3Vic3RyZWFtcyIpOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBBQUNfQUMzX1BBUlNFX0VSUk9SX0ZSQU1FX1RZUEU7CiAgICAgfQogCkBAIC0zMzMsMTYgKzMzMiwzNSBAQAogCiAgICAgLyogdm9sdW1lIGNvbnRyb2wgcGFyYW1zICovCiAgICAgZm9yIChpID0gMDsgaSA8IChzLT5jaGFubmVsX21vZGUgPyAxIDogMik7IGkrKykgewotICAgICAgICBza2lwX2JpdHMoZ2JjLCA1KTsgLy8gc2tpcCBkaWFsb2cgbm9ybWFsaXphdGlvbgotICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiYykpIHsKLSAgICAgICAgICAgIHNraXBfYml0cyhnYmMsIDgpOyAvLyBza2lwIGNvbXByZXNzaW9uIGdhaW4gd29yZAorICAgICAgICBzLT5kaWFsb2dfbm9ybWFsaXphdGlvbltpXSA9IC1nZXRfYml0cyhnYmMsIDUpOworICAgICAgICBpZiAocy0+ZGlhbG9nX25vcm1hbGl6YXRpb25baV0gPT0gMCkgeworICAgICAgICAgICAgcy0+ZGlhbG9nX25vcm1hbGl6YXRpb25baV0gPSAtMzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnRhcmdldF9sZXZlbCAhPSAwKSB7CisgICAgICAgICAgICBzLT5sZXZlbF9nYWluW2ldID0gcG93ZigyLjBmLAorICAgICAgICAgICAgICAgIChmbG9hdCkocy0+dGFyZ2V0X2xldmVsIC0gcy0+ZGlhbG9nX25vcm1hbGl6YXRpb25baV0pLzYuMGYpOworICAgICAgICB9CisgICAgICAgIHMtPmNvbXByZXNzaW9uX2V4aXN0c1tpXSA9IGdldF9iaXRzMShnYmMpOworICAgICAgICBpZiAocy0+Y29tcHJlc3Npb25fZXhpc3RzW2ldKSB7CisgICAgICAgICAgICBzLT5oZWF2eV9keW5hbWljX3JhbmdlW2ldID0gQUMzX0hFQVZZX1JBTkdFKGdldF9iaXRzKGdiYywgOCkpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLyogZGVwZW5kZW50IHN0cmVhbSBjaGFubmVsIG1hcCAqLwogICAgIGlmIChzLT5mcmFtZV90eXBlID09IEVBQzNfRlJBTUVfVFlQRV9ERVBFTkRFTlQpIHsKICAgICAgICAgaWYgKGdldF9iaXRzMShnYmMpKSB7Ci0gICAgICAgICAgICBza2lwX2JpdHMoZ2JjLCAxNik7IC8vIHNraXAgY3VzdG9tIGNoYW5uZWwgbWFwCisgICAgICAgICAgICBpbnQ2NF90IGNoYW5uZWxfbGF5b3V0ID0gMDsKKyAgICAgICAgICAgIGludCBjaGFubmVsX21hcCA9IGdldF9iaXRzKGdiYywgMTYpOworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJjaGFubmVsX21hcDogJTBYXG4iLCBjaGFubmVsX21hcCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChjaGFubmVsX21hcCAmICgxIDw8IChFQUMzX01BWF9DSEFOTkVMUyAtIGkgLSAxKSkpCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbGF5b3V0IHw9IGZmX2VhYzNfY3VzdG9tX2NoYW5uZWxfbWFwX2xvY2F0aW9uc1tpXVsxXTsKKworICAgICAgICAgICAgaWYgKGF2X3BvcGNvdW50NjQoY2hhbm5lbF9sYXlvdXQpID4gRUFDM19NQVhfQ0hBTk5FTFMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmNoYW5uZWxfbWFwID0gY2hhbm5lbF9tYXA7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZWFjbXYuYyBiL2xpYmF2Y29kZWMvZWFjbXYuYwppbmRleCAwNDdiZTgxLi5iZjQ0MDRjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2VhY212LmMKKysrIGIvbGliYXZjb2RlYy9lYWNtdi5jCkBAIC03Miw4ICs3Miw4IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjbXZfbW90Y29tcCh1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3N0cmlkZSwKK3N0YXRpYyB2b2lkIGNtdl9tb3Rjb21wKHVuc2lnbmVkIGNoYXIgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvZmZzZXQsIGludCB5b2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KXsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZWFpZGN0LmMgYi9saWJhdmNvZGVjL2VhaWRjdC5jCmluZGV4IGU0ODQwZjIuLjAzOGVlMmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZWFpZGN0LmMKKysrIGIvbGliYXZjb2RlYy9lYWlkY3QuYwpAQCAtNzcsNyArNzcsOCBAQAogICAgICAgICBJRENUX0NPTChkZXN0LCBzcmMpOwogfQogCi12b2lkIGZmX2VhX2lkY3RfcHV0X2ModWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykgewordm9pZCBmZl9lYV9pZGN0X3B1dF9jKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CiAgICAgaW50IGk7CiAgICAgaW50MTZfdCB0ZW1wWzY0XTsKICAgICBibG9ja1swXSArPSA0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9lYWlkY3QuaCBiL2xpYmF2Y29kZWMvZWFpZGN0LmgKaW5kZXggNmI5ZWMxYy4uYTQ2ZGFlOSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9lYWlkY3QuaAorKysgYi9saWJhdmNvZGVjL2VhaWRjdC5oCkBAIC0xOSw4ICsxOSw5IEBACiAjaWZuZGVmIEFWQ09ERUNfRUFJRENUX0gKICNkZWZpbmUgQVZDT0RFQ19FQUlEQ1RfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLXZvaWQgZmZfZWFfaWRjdF9wdXRfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfZWFfaWRjdF9wdXRfYyh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfRUFJRENUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZWFtYWQuYyBiL2xpYmF2Y29kZWMvZWFtYWQuYwppbmRleCA0ZTIwMmY5Li43ZjI4YWJiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2VhbWFkLmMKKysrIGIvbGliYXZjb2RlYy9lYW1hZC5jCkBAIC00MSw4ICs0MSw4IEBACiAjaW5jbHVkZSAibXBlZzEydmxjLmgiCiAKICNkZWZpbmUgRUFfUFJFQU1CTEVfU0laRSAgICA4Ci0jZGVmaW5lIE1BRGtfVEFHIE1LVEFHKCdNJywgJ0EnLCAnRCcsICdrJykgICAgLyogTUFEIGktZnJhbWUgKi8KLSNkZWZpbmUgTUFEbV9UQUcgTUtUQUcoJ00nLCAnQScsICdEJywgJ20nKSAgICAvKiBNQUQgcC1mcmFtZSAqLworI2RlZmluZSBNQURrX1RBRyBNS1RBRygnTScsICdBJywgJ0QnLCAnaycpICAgIC8qIE1BRCBJLWZyYW1lICovCisjZGVmaW5lIE1BRG1fVEFHIE1LVEFHKCdNJywgJ0EnLCAnRCcsICdtJykgICAgLyogTUFEIFAtZnJhbWUgKi8KICNkZWZpbmUgTUFEZV9UQUcgTUtUQUcoJ00nLCAnQScsICdEJywgJ2UnKSAgICAvKiBNQUQgbHFwLWZyYW1lICovCiAKIHR5cGVkZWYgc3RydWN0IE1hZENvbnRleHQgewpAQCAtNTQsNyArNTQsNyBAQAogICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgdm9pZCAqYml0c3RyZWFtX2J1ZjsKICAgICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX2J1Zl9zaXplOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2spWzY0XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGludDE2X3QsIGJsb2NrKVs2NF07CiAgICAgU2NhblRhYmxlIHNjYW50YWJsZTsKICAgICB1aW50MTZfdCBxdWFudF9tYXRyaXhbNjRdOwogICAgIGludCBtYl94OwpAQCAtODAsOCArODAsOCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgY29tcCh1bnNpZ25lZCBjaGFyICpkc3QsIGludCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgaW50IGFkZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb21wKHVuc2lnbmVkIGNoYXIgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzcmMsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBpbnQgYWRkKQogewogICAgIGludCBqLCBpOwogICAgIGZvciAoaj0wOyBqPDg7IGorKykKQEAgLTI4NCw3ICsyODQsNyBAQAogCiAgICAgaWYgKGF2Y3R4LT53aWR0aCAhPSB3aWR0aCB8fCBhdmN0eC0+aGVpZ2h0ICE9IGhlaWdodCkgewogICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5sYXN0X2ZyYW1lKTsKLSAgICAgICAgaWYoKHdpZHRoICogaGVpZ2h0KS8yMDQ4KjcgPiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpKQorICAgICAgICBpZigod2lkdGggKiAoaW50NjRfdCloZWlnaHQpLzIwNDgqNyA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgd2lkdGgsIGhlaWdodCkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2VhdGdxLmMgYi9saWJhdmNvZGVjL2VhdGdxLmMKaW5kZXggZjhhNDdjYi4uMTMwOGMwNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9lYXRncS5jCisrKyBiL2xpYmF2Y29kZWMvZWF0Z3EuYwpAQCAtMjgsMTMgKzI4LDEzIEBACiAgKiBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1FbGVjdHJvbmljX0FydHNfVEdRCiAgKi8KIAotI2luY2x1ZGUgImF2Y29kZWMuaCIKICNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQotI2luY2x1ZGUgImdldF9iaXRzLmgiCi0jaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgotI2luY2x1ZGUgImlkY3Rkc3AuaCIKICNpbmNsdWRlICJhYW5kY3R0YWIuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgImVhaWRjdC5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHR5cGVkZWYgc3RydWN0IFRncUNvbnRleHQgewpAQCAtMTA3LDcgKzEwNyw3IEBACiBzdGF0aWMgdm9pZCB0Z3FfaWRjdF9wdXRfbWIoVGdxQ29udGV4dCAqcywgaW50MTZfdCAoKmJsb2NrKVs2NF0sIEFWRnJhbWUgKmZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSkKIHsKLSAgICBpbnQgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgcHRyZGlmZl90IGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzBdOwogICAgIHVpbnQ4X3QgKmRlc3RfeSAgPSBmcmFtZS0+ZGF0YVswXSArIChtYl95ICogMTYgKiBsaW5lc2l6ZSkgICAgICAgICAgICsgbWJfeCAqIDE2OwogICAgIHVpbnQ4X3QgKmRlc3RfY2IgPSBmcmFtZS0+ZGF0YVsxXSArIChtYl95ICogOCAgKiBmcmFtZS0+bGluZXNpemVbMV0pICsgbWJfeCAqIDg7CiAgICAgdWludDhfdCAqZGVzdF9jciA9IGZyYW1lLT5kYXRhWzJdICsgKG1iX3kgKiA4ICAqIGZyYW1lLT5saW5lc2l6ZVsyXSkgKyBtYl94ICogODsKQEAgLTEyMyw3ICsxMjMsNyBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGdxX2Rjb25seShUZ3FDb250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZSwgaW50IGRjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRzdF9zdHJpZGUsIGludCBkYykKIHsKICAgICBpbnQgbGV2ZWwgPSBhdl9jbGlwX3VpbnQ4KChkYypzLT5xdGFibGVbMF0gKyAyMDU2KSA+PiA0KTsKICAgICBpbnQgajsKQEAgLTEzNCw3ICsxMzQsNyBAQAogc3RhdGljIHZvaWQgdGdxX2lkY3RfcHV0X21iX2Rjb25seShUZ3FDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3gsIGludCBtYl95LCBjb25zdCBpbnQ4X3QgKmRjKQogewotICAgIGludCBsaW5lc2l6ZSA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBwdHJkaWZmX3QgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbMF07CiAgICAgdWludDhfdCAqZGVzdF95ICA9IGZyYW1lLT5kYXRhWzBdICsgKG1iX3kgKiAxNiAqIGxpbmVzaXplKSAgICAgICAgICAgICArIG1iX3ggKiAxNjsKICAgICB1aW50OF90ICpkZXN0X2NiID0gZnJhbWUtPmRhdGFbMV0gKyAobWJfeSAqIDggICogZnJhbWUtPmxpbmVzaXplWzFdKSArIG1iX3ggKiA4OwogICAgIHVpbnQ4X3QgKmRlc3RfY3IgPSBmcmFtZS0+ZGF0YVsyXSArIChtYl95ICogOCAgKiBmcmFtZS0+bGluZXNpemVbMl0pICsgbWJfeCAqIDg7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2VhdGd2LmMgYi9saWJhdmNvZGVjL2VhdGd2LmMKaW5kZXggODgyYmYwNy4uOTNlMjkxZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9lYXRndi5jCisrKyBiL2xpYmF2Y29kZWMvZWF0Z3YuYwpAQCAtMjgsMTMgKzI4LDE0IEBACiAgKiBodHRwOi8vd2lraS5tdWx0aW1lZGlhLmN4L2luZGV4LnBocD90aXRsZT1FbGVjdHJvbmljX0FydHNfVEdWCiAgKi8KIAotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQotI2luY2x1ZGUgImdldF9iaXRzLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCiAKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKICNkZWZpbmUgRUFfUFJFQU1CTEVfU0laRSAgICA4CiAjZGVmaW5lIGtWR1RfVEFHIE1LVEFHKCdrJywgJ1YnLCAnRycsICdUJykKIApAQCAtMjI2LDcgKzIyNyw3IEBACiAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5hdmN0eC0+d2lkdGggLyA0OyB4KyspIHsKICAgICAgICAgICAgIHVuc2lnbmVkIGludCB2ZWN0b3IgPSBnZXRfYml0cygmZ2IsIHZlY3Rvcl9iaXRzKTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzsKLSAgICAgICAgICAgIGludCBzcmNfc3RyaWRlOworICAgICAgICAgICAgcHRyZGlmZl90IHNyY19zdHJpZGU7CiAKICAgICAgICAgICAgIGlmICh2ZWN0b3IgPCBudW1fbXZzKSB7CiAgICAgICAgICAgICAgICAgaW50IG14ID0geCAqIDQgKyBzLT5tdl9jb2RlYm9va1t2ZWN0b3JdWzBdOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9lYXRxaS5jIGIvbGliYXZjb2RlYy9lYXRxaS5jCmluZGV4IDI0MjNlMjEuLjFhODQ3YTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZWF0cWkuYworKysgYi9saWJhdmNvZGVjL2VhdHFpLmMKQEAgLTM1LDY5ICszNSw4OSBAQAogI2luY2x1ZGUgImlkY3Rkc3AuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1wZWcxMi5oIgotI2luY2x1ZGUgIm1wZWd2aWRlby5oIgogCiB0eXBlZGVmIHN0cnVjdCBUcWlDb250ZXh0IHsKLSAgICBNcGVnRW5jQ29udGV4dCBzOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOwogICAgIEJzd2FwRFNQQ29udGV4dCBic2RzcDsKKyAgICBJRENURFNQQ29udGV4dCBpZHNwOworICAgIFNjYW5UYWJsZSBpbnRyYV9zY2FudGFibGU7CisKICAgICB2b2lkICpiaXRzdHJlYW1fYnVmOwogICAgIHVuc2lnbmVkIGludCBiaXRzdHJlYW1fYnVmX3NpemU7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBibG9jaylbNl1bNjRdOworCisgICAgaW50IG1iX3gsIG1iX3k7CisgICAgdWludDE2X3QgaW50cmFfbWF0cml4WzY0XTsKKyAgICBpbnQgbGFzdF9kY1szXTsKKworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50MTZfdCwgYmxvY2spWzZdWzY0XTsKIH0gVHFpQ29udGV4dDsKIAogc3RhdGljIGF2X2NvbGQgaW50IHRxaV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgVHFpQ29udGV4dCAqdCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdC0+czsKLSAgICBzLT5hdmN0eCA9IGF2Y3R4OwotICAgIGZmX2Jsb2NrZHNwX2luaXQoJnMtPmJkc3AsIGF2Y3R4KTsKKworICAgIGZmX2Jsb2NrZHNwX2luaXQoJnQtPmJkc3AsIGF2Y3R4KTsKICAgICBmZl9ic3dhcGRzcF9pbml0KCZ0LT5ic2RzcCk7Ci0gICAgZmZfaWRjdGRzcF9pbml0KCZzLT5pZHNwLCBhdmN0eCk7Ci0gICAgZmZfaW5pdF9zY2FudGFibGVfcGVybXV0YXRpb24ocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCBGRl9JRENUX1BFUk1fTk9ORSk7Ci0gICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfc2NhbnRhYmxlLCBmZl96aWd6YWdfZGlyZWN0KTsKLSAgICBzLT5xc2NhbGUgPSAxOworICAgIGZmX2lkY3Rkc3BfaW5pdCgmdC0+aWRzcCwgYXZjdHgpOworICAgIGZmX2luaXRfc2NhbnRhYmxlX3Blcm11dGF0aW9uKHQtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgRkZfSURDVF9QRVJNX05PTkUpOworICAgIGZmX2luaXRfc2NhbnRhYmxlKHQtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnQtPmludHJhX3NjYW50YWJsZSwgZmZfemlnemFnX2RpcmVjdCk7CisKICAgICBhdmN0eC0+ZnJhbWVyYXRlID0gKEFWUmF0aW9uYWwpeyAxNSwgMSB9OwogICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOwogICAgIGZmX21wZWcxMl9pbml0X3ZsY3MoKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB0cWlfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICgqYmxvY2spWzY0XSkKK3N0YXRpYyBpbnQgdHFpX2RlY29kZV9tYihUcWlDb250ZXh0ICp0LCBpbnQxNl90ICgqYmxvY2spWzY0XSkKIHsKICAgICBpbnQgbjsKLSAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrcyhibG9ja1swXSk7Ci0gICAgZm9yIChuPTA7IG48NjsgbisrKQotICAgICAgICBpZiAoZmZfbXBlZzFfZGVjb2RlX2Jsb2NrX2ludHJhKHMsIGJsb2NrW25dLCBuKSA8IDApCisKKyAgICB0LT5iZHNwLmNsZWFyX2Jsb2NrcyhibG9ja1swXSk7CisgICAgZm9yIChuID0gMDsgbiA8IDY7IG4rKykgeworICAgICAgICBpbnQgcmV0ID0gZmZfbXBlZzFfZGVjb2RlX2Jsb2NrX2ludHJhKCZ0LT5nYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5pbnRyYV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bGFzdF9kYywgYmxvY2tbbl0sIG4sIDEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHQtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJhYy10ZXggZGFtYWdlZCBhdCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB0LT5tYl94LCB0LT5tYl95KTsKICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdHFpX2lkY3RfcHV0KFRxaUNvbnRleHQgKnQsIEFWRnJhbWUgKmZyYW1lLCBpbnQxNl90ICgqYmxvY2spWzY0XSkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cWlfaWRjdF9wdXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAoKmJsb2NrKVs2NF0pCiB7Ci0gICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdC0+czsKLSAgICBpbnQgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbMF07Ci0gICAgdWludDhfdCAqZGVzdF95ICA9IGZyYW1lLT5kYXRhWzBdICsgKHMtPm1iX3kgKiAxNiogbGluZXNpemUgICAgICAgICAgICApICsgcy0+bWJfeCAqIDE2OwotICAgIHVpbnQ4X3QgKmRlc3RfY2IgPSBmcmFtZS0+ZGF0YVsxXSArIChzLT5tYl95ICogOCAqIGZyYW1lLT5saW5lc2l6ZVsxXSkgKyBzLT5tYl94ICogODsKLSAgICB1aW50OF90ICpkZXN0X2NyID0gZnJhbWUtPmRhdGFbMl0gKyAocy0+bWJfeSAqIDggKiBmcmFtZS0+bGluZXNpemVbMl0pICsgcy0+bWJfeCAqIDg7CisgICAgVHFpQ29udGV4dCAqdCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcHRyZGlmZl90IGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIHVpbnQ4X3QgKmRlc3RfeSAgPSBmcmFtZS0+ZGF0YVswXSArIHQtPm1iX3kgKiAxNiAqIGxpbmVzaXplICAgICAgICAgICArIHQtPm1iX3ggKiAxNjsKKyAgICB1aW50OF90ICpkZXN0X2NiID0gZnJhbWUtPmRhdGFbMV0gKyB0LT5tYl95ICogIDggKiBmcmFtZS0+bGluZXNpemVbMV0gKyB0LT5tYl94ICogIDg7CisgICAgdWludDhfdCAqZGVzdF9jciA9IGZyYW1lLT5kYXRhWzJdICsgdC0+bWJfeSAqICA4ICogZnJhbWUtPmxpbmVzaXplWzJdICsgdC0+bWJfeCAqICA4OwogCiAgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X3kgICAgICAgICAgICAgICAgICwgbGluZXNpemUsIGJsb2NrWzBdKTsKICAgICBmZl9lYV9pZGN0X3B1dF9jKGRlc3RfeSAgICAgICAgICAgICAgKyA4LCBsaW5lc2l6ZSwgYmxvY2tbMV0pOwogICAgIGZmX2VhX2lkY3RfcHV0X2MoZGVzdF95ICsgOCpsaW5lc2l6ZSAgICAsIGxpbmVzaXplLCBibG9ja1syXSk7CiAgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X3kgKyA4KmxpbmVzaXplICsgOCwgbGluZXNpemUsIGJsb2NrWzNdKTsKLSAgICBpZighKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkpIHsKKworICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkpIHsKICAgICAgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X2NiLCBmcmFtZS0+bGluZXNpemVbMV0sIGJsb2NrWzRdKTsKICAgICAgICAgZmZfZWFfaWRjdF9wdXRfYyhkZXN0X2NyLCBmcmFtZS0+bGluZXNpemVbMl0sIGJsb2NrWzVdKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHRxaV9jYWxjdWxhdGVfcXRhYmxlKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgcXVhbnQpCitzdGF0aWMgdm9pZCB0cWlfY2FsY3VsYXRlX3F0YWJsZShUcWlDb250ZXh0ICp0LCBpbnQgcXVhbnQpCiB7Ci0gICAgY29uc3QgaW50IHFzY2FsZSA9ICgyMTUgLSAyKnF1YW50KSo1OworICAgIGNvbnN0IGludDY0X3QgcXNjYWxlID0gKDIxNSAtIDIqcXVhbnQpKjU7CiAgICAgaW50IGk7Ci0gICAgcy0+aW50cmFfbWF0cml4WzBdID0gKGZmX2ludl9hYW5zY2FsZXNbMF0qZmZfbXBlZzFfZGVmYXVsdF9pbnRyYV9tYXRyaXhbMF0pPj4xMTsKKworICAgIHQtPmludHJhX21hdHJpeFswXSA9IChmZl9pbnZfYWFuc2NhbGVzWzBdICogZmZfbXBlZzFfZGVmYXVsdF9pbnRyYV9tYXRyaXhbMF0pID4+IDExOwogICAgIGZvcihpPTE7IGk8NjQ7IGkrKykKLSAgICAgICAgcy0+aW50cmFfbWF0cml4W2ldID0gKGZmX2ludl9hYW5zY2FsZXNbaV0qZmZfbXBlZzFfZGVmYXVsdF9pbnRyYV9tYXRyaXhbaV0qcXNjYWxlICsgMzIpPj4xNDsKKyAgICAgICAgdC0+aW50cmFfbWF0cml4W2ldID0gKGZmX2ludl9hYW5zY2FsZXNbaV0gKiBmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeFtpXSAqIHFzY2FsZSArIDMyKSA+PiAxNDsKIH0KIAogc3RhdGljIGludCB0cWlfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKQEAgLTEwOCwxNiArMTI4LDE3IEBACiAgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CiAgICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCA9IGJ1ZitidWZfc2l6ZTsKICAgICBUcWlDb250ZXh0ICp0ID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ0LT5zOwogICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKLSAgICBpbnQgcmV0OworICAgIGludCByZXQsIHcsIGg7CiAKLSAgICBzLT53aWR0aCAgPSBBVl9STDE2KCZidWZbMF0pOwotICAgIHMtPmhlaWdodCA9IEFWX1JMMTYoJmJ1ZlsyXSk7Ci0gICAgdHFpX2NhbGN1bGF0ZV9xdGFibGUocywgYnVmWzRdKTsKKyAgICB0LT5hdmN0eCA9IGF2Y3R4OworCisgICAgdyA9IEFWX1JMMTYoJmJ1ZlswXSk7CisgICAgaCA9IEFWX1JMMTYoJmJ1ZlsyXSk7CisgICAgdHFpX2NhbGN1bGF0ZV9xdGFibGUodCwgYnVmWzRdKTsKICAgICBidWYgKz0gODsKIAotICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKHMtPmF2Y3R4LCBzLT53aWR0aCwgcy0+aGVpZ2h0KTsKKyAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTEzMCwxNSArMTUxLDE3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgdC0+YnNkc3AuYnN3YXBfYnVmKHQtPmJpdHN0cmVhbV9idWYsIChjb25zdCB1aW50MzJfdCAqKSBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgIChidWZfZW5kIC0gYnVmKSAvIDQpOwotICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCB0LT5iaXRzdHJlYW1fYnVmLCA4KihidWZfZW5kLWJ1ZikpOworICAgIGluaXRfZ2V0X2JpdHMoJnQtPmdiLCB0LT5iaXRzdHJlYW1fYnVmLCA4ICogKGJ1Zl9lbmQgLSBidWYpKTsKIAotICAgIHMtPmxhc3RfZGNbMF0gPSBzLT5sYXN0X2RjWzFdID0gcy0+bGFzdF9kY1syXSA9IDA7Ci0gICAgZm9yIChzLT5tYl95PTA7IHMtPm1iX3k8KGF2Y3R4LT5oZWlnaHQrMTUpLzE2OyBzLT5tYl95KyspCi0gICAgZm9yIChzLT5tYl94PTA7IHMtPm1iX3g8KGF2Y3R4LT53aWR0aCsxNSkvMTY7IHMtPm1iX3grKykKLSAgICB7Ci0gICAgICAgIGlmICh0cWlfZGVjb2RlX21iKHMsIHQtPmJsb2NrKSA8IDApCi0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgdHFpX2lkY3RfcHV0KHQsIGZyYW1lLCB0LT5ibG9jayk7CisgICAgdC0+bGFzdF9kY1swXSA9CisgICAgdC0+bGFzdF9kY1sxXSA9CisgICAgdC0+bGFzdF9kY1syXSA9IDA7CisgICAgZm9yICh0LT5tYl95ID0gMDsgdC0+bWJfeSA8IChoICsgMTUpIC8gMTY7IHQtPm1iX3krKykgeworICAgICAgICBmb3IgKHQtPm1iX3ggPSAwOyB0LT5tYl94IDwgKHcgKyAxNSkgLyAxNjsgdC0+bWJfeCsrKSB7CisgICAgICAgICAgICBpZiAodHFpX2RlY29kZV9tYih0LCB0LT5ibG9jaykgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgdHFpX2lkY3RfcHV0KGF2Y3R4LCBmcmFtZSwgdC0+YmxvY2spOworICAgICAgICB9CiAgICAgfQogICAgIGVuZDoKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9lbGJnLmMgYi9saWJhdmNvZGVjL2VsYmcuYwppbmRleCAyM2FlOTQ4Li5iNjA0OWM5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2VsYmcuYworKysgYi9saWJhdmNvZGVjL2VsYmcuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgImVsYmcuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAKLSNkZWZpbmUgREVMVEFfRVJSX01BWCAwLjEgIC8vLzwgUHJlY2lzaW9uIG9mIHRoZSBFTEJHIGFsZ29yaXRobSAoYXMgcGVyY2VudHVhbCBlcnJvcikKKyNkZWZpbmUgREVMVEFfRVJSX01BWCAwLjEgIC8vLzwgUHJlY2lzaW9uIG9mIHRoZSBFTEJHIGFsZ29yaXRobSAoYXMgcGVyY2VudGFnZSBlcnJvcikKIAogLyoqCiAgKiBJbiB0aGUgRUxCRyBqYXJnb24sIGEgY2VsbCBpcyB0aGUgc2V0IG9mIHBvaW50cyB0aGF0IGFyZSBjbG9zZXN0IHRvIGEKQEAgLTE5OSw3ICsxOTksNyBAQAogCiAvKioKICAqIEFkZCB0aGUgcG9pbnRzIGluIHRoZSBsb3cgdXRpbGl0eSBjZWxsIHRvIGl0cyBjbG9zZXN0IGNlbGwuIFNwbGl0IHRoZSBoaWdoCi0gKiB1dGlsaXR5IGNlbGwsIHB1dHRpbmcgdGhlIHNlcGFyYXRlIHBvaW50cyBpbiB0aGUgKG5vdyBlbXB0eSkgbG93IHV0aWxpdHkKKyAqIHV0aWxpdHkgY2VsbCwgcHV0dGluZyB0aGUgc2VwYXJhdGVkIHBvaW50cyBpbiB0aGUgKG5vdyBlbXB0eSkgbG93IHV0aWxpdHkKICAqIGNlbGwuCiAgKgogICogQHBhcmFtIGVsYmcgICAgICAgICBJbnRlcm5hbCBlbGJnIGRhdGEKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZWxzZGVjLmMgYi9saWJhdmNvZGVjL2Vsc2RlYy5jCmluZGV4IDQ3OTc5NjUuLmNiMGU5YzYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZWxzZGVjLmMKKysrIGIvbGliYXZjb2RlYy9lbHNkZWMuYwpAQCAtMjcxLDcgKzI3MSw3IEBACiAKIHZvaWQgZmZfZWxzX2RlY29kZXJfdW5pbml0KEVsc1Vuc2lnbmVkUnVuZyAqcnVuZykKIHsKLSAgICBhdl9mcmVlKHJ1bmctPnJlbV9ydW5nX2xpc3QpOworICAgIGF2X2ZyZWVwKCZydW5nLT5yZW1fcnVuZ19saXN0KTsKIH0KIAogc3RhdGljIGludCBlbHNfaW1wb3J0X2J5dGUoRWxzRGVjQ3R4ICpjdHgpCkBAIC0zOTEsMTIgKzM5MSwxMCBAQAogICAgICAgICAgICAgICAgIGlmICh1ci0+cnVuZ19saXN0X3NpemUgPD0gKHVyLT5hdmFpbF9pbmRleCArIDIpICogc2l6ZW9mKEVsc1J1bmdOb2RlKSkgewogICAgICAgICAgICAgICAgICAgICAvLyByZW1lbWJlciBydW5nX25vZGUgcG9zaXRpb24KICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHBvcyAgICAgPSBydW5nX25vZGUgLSB1ci0+cmVtX3J1bmdfbGlzdDsKLSAgICAgICAgICAgICAgICAgICAgdXItPnJlbV9ydW5nX2xpc3QgPSBhdl9yZWFsbG9jKHVyLT5yZW1fcnVuZ19saXN0LAorICAgICAgICAgICAgICAgICAgICBjdHgtPmVyciA9IGF2X3JlYWxsb2NwKCZ1ci0+cmVtX3J1bmdfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVyLT5ydW5nX2xpc3Rfc2l6ZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVU5HX1NQQUNFKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF1ci0+cmVtX3J1bmdfbGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJlZSh1ci0+cmVtX3J1bmdfbGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+ZXJyIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCh1aW50OF90ICopIHVyLT5yZW1fcnVuZ19saXN0ICsgdXItPnJ1bmdfbGlzdF9zaXplLCAwLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9lbmNvZGUuYyBiL2xpYmF2Y29kZWMvZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3NjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZW5jb2RlLmMKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKiBnZW5lcmljIGVuY29kaW5nLXJlbGF0ZWQgY29kZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZnJhbWVfdGhyZWFkX2VuY29kZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitpbnQgZmZfYWxsb2NfcGFja2V0MihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwgaW50NjRfdCBzaXplLCBpbnQ2NF90IG1pbl9zaXplKQoreworICAgIGlmIChhdnBrdC0+c2l6ZSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG5lZ2F0aXZlIHVzZXIgcGFja2V0IHNpemUgJWRcbiIsIGF2cGt0LT5zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPiBJTlRfTUFYIC0gQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWluaW11bSByZXF1aXJlZCBwYWNrZXQgc2l6ZSAlIlBSSWQ2NCIgKG1heCBhbGxvd2VkIGlzICVkKVxuIiwKKyAgICAgICAgICAgICAgIHNpemUsIElOVF9NQVggLSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHggJiYgMiptaW5fc2l6ZSA8IHNpemUpIHsgLy8gRklYTUUgVGhlIGZhY3RvciBuZWVkcyB0byBiZSBmaW5ldHVuZWQKKyAgICAgICAgYXZfYXNzZXJ0MCghYXZwa3QtPmRhdGEgfHwgYXZwa3QtPmRhdGEgIT0gYXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlcik7CisgICAgICAgIGlmICghYXZwa3QtPmRhdGEgfHwgYXZwa3QtPnNpemUgPCBzaXplKSB7CisgICAgICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXIsICZhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemUsIHNpemUpOworICAgICAgICAgICAgYXZwa3QtPmRhdGEgPSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyOworICAgICAgICAgICAgYXZwa3QtPnNpemUgPSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZwa3QtPmRhdGEpIHsKKyAgICAgICAgQVZCdWZmZXJSZWYgKmJ1ZiA9IGF2cGt0LT5idWY7CisKKyAgICAgICAgaWYgKGF2cGt0LT5zaXplIDwgc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVc2VyIHBhY2tldCBpcyB0b28gc21hbGwgKCVkIDwgJSJQUklkNjQiKVxuIiwgYXZwa3QtPnNpemUsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2luaXRfcGFja2V0KGF2cGt0KTsKKyAgICAgICAgYXZwa3QtPmJ1ZiAgICAgID0gYnVmOworICAgICAgICBhdnBrdC0+c2l6ZSAgICAgPSBzaXplOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcmV0ID0gYXZfbmV3X3BhY2tldChhdnBrdCwgc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgcGFja2V0IG9mIHNpemUgJSJQUklkNjQiXG4iLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cit9CisKK2ludCBmZl9hbGxvY19wYWNrZXQoQVZQYWNrZXQgKmF2cGt0LCBpbnQgc2l6ZSkKK3sKKyAgICByZXR1cm4gZmZfYWxsb2NfcGFja2V0MihOVUxMLCBhdnBrdCwgc2l6ZSwgMCk7Cit9CisKKy8qKgorICogUGFkIGxhc3QgZnJhbWUgd2l0aCBzaWxlbmNlLgorICovCitzdGF0aWMgaW50IHBhZF9sYXN0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICoqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIShmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWUtPmZvcm1hdCAgICAgICAgID0gc3JjLT5mb3JtYXQ7CisgICAgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ID0gc3JjLT5jaGFubmVsX2xheW91dDsKKyAgICBmcmFtZS0+Y2hhbm5lbHMgICAgICAgPSBzcmMtPmNoYW5uZWxzOworICAgIGZyYW1lLT5uYl9zYW1wbGVzICAgICA9IHMtPmZyYW1lX3NpemU7CisgICAgcmV0ID0gYXZfZnJhbWVfZ2V0X2J1ZmZlcihmcmFtZSwgMzIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKGZyYW1lLCBzcmMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKHJldCA9IGF2X3NhbXBsZXNfY29weShmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgc3JjLT5leHRlbmRlZF9kYXRhLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+bmJfc2FtcGxlcywgcy0+Y2hhbm5lbHMsIHMtPnNhbXBsZV9mbXQpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoKHJldCA9IGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UoZnJhbWUtPmV4dGVuZGVkX2RhdGEsIHNyYy0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgLSBzcmMtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxzLCBzLT5zYW1wbGVfZm10KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAqZHN0ID0gZnJhbWU7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZjb2RlY19lbmNvZGVfYXVkaW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBBVkZyYW1lICpleHRlbmRlZF9mcmFtZSA9IE5VTEw7CisgICAgQVZGcmFtZSAqcGFkZGVkX2ZyYW1lID0gTlVMTDsKKyAgICBpbnQgcmV0OworICAgIEFWUGFja2V0IHVzZXJfcGt0ID0gKmF2cGt0OworICAgIGludCBuZWVkc19yZWFsbG9jID0gIXVzZXJfcGt0LmRhdGE7CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAwOworCisgICAgaWYgKCFhdmN0eC0+Y29kZWMtPmVuY29kZTIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGlzIGVuY29kZXIgcmVxdWlyZXMgdXNpbmcgdGhlIGF2Y29kZWNfc2VuZF9mcmFtZSgpIEFQSS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RFTEFZKSAmJiAhZnJhbWUpIHsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKGF2cGt0KTsKKyAgICAgICAgYXZfaW5pdF9wYWNrZXQoYXZwa3QpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBlbnN1cmUgdGhhdCBleHRlbmRlZF9kYXRhIGlzIHByb3Blcmx5IHNldCAqLworICAgIGlmIChmcmFtZSAmJiAhZnJhbWUtPmV4dGVuZGVkX2RhdGEpIHsKKyAgICAgICAgaWYgKGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGF2Y3R4LT5zYW1wbGVfZm10KSAmJgorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzID4gQVZfTlVNX0RBVEFfUE9JTlRFUlMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRW5jb2RpbmcgdG8gYSBwbGFuYXIgc2FtcGxlIGZvcm1hdCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIG1vcmUgdGhhbiAlZCBjaGFubmVscywgYnV0IGV4dGVuZGVkX2RhdGEgaXMgbm90IHNldC5cbiIsCisgICAgICAgICAgICAgICAgICAgQVZfTlVNX0RBVEFfUE9JTlRFUlMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZXh0ZW5kZWRfZGF0YSBpcyBub3Qgc2V0LlxuIik7CisKKyAgICAgICAgZXh0ZW5kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIWV4dGVuZGVkX2ZyYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBtZW1jcHkoZXh0ZW5kZWRfZnJhbWUsIGZyYW1lLCBzaXplb2YoQVZGcmFtZSkpOworICAgICAgICBleHRlbmRlZF9mcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IGV4dGVuZGVkX2ZyYW1lLT5kYXRhOworICAgICAgICBmcmFtZSA9IGV4dGVuZGVkX2ZyYW1lOworICAgIH0KKworICAgIC8qIGV4dHJhY3QgYXVkaW8gc2VydmljZSB0eXBlIG1ldGFkYXRhICovCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIEFWRnJhbWVTaWRlRGF0YSAqc2QgPSBhdl9mcmFtZV9nZXRfc2lkZV9kYXRhKGZyYW1lLCBBVl9GUkFNRV9EQVRBX0FVRElPX1NFUlZJQ0VfVFlQRSk7CisgICAgICAgIGlmIChzZCAmJiBzZC0+c2l6ZSA+PSBzaXplb2YoZW51bSBBVkF1ZGlvU2VydmljZVR5cGUpKQorICAgICAgICAgICAgYXZjdHgtPmF1ZGlvX3NlcnZpY2VfdHlwZSA9ICooZW51bSBBVkF1ZGlvU2VydmljZVR5cGUqKXNkLT5kYXRhOworICAgIH0KKworICAgIC8qIGNoZWNrIGZvciB2YWxpZCBmcmFtZSBzaXplICovCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FKSB7CisgICAgICAgICAgICBpZiAoZnJhbWUtPm5iX3NhbXBsZXMgPiBhdmN0eC0+ZnJhbWVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibW9yZSBzYW1wbGVzIHRoYW4gZnJhbWUgc2l6ZSAoYXZjb2RlY19lbmNvZGVfYXVkaW8yKVxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfVkFSSUFCTEVfRlJBTUVfU0laRSkpIHsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+bmJfc2FtcGxlcyA8IGF2Y3R4LT5mcmFtZV9zaXplICYmCisgICAgICAgICAgICAgICAgIWF2Y3R4LT5pbnRlcm5hbC0+bGFzdF9hdWRpb19mcmFtZSkgeworICAgICAgICAgICAgICAgIHJldCA9IHBhZF9sYXN0X2ZyYW1lKGF2Y3R4LCAmcGFkZGVkX2ZyYW1lLCBmcmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworCisgICAgICAgICAgICAgICAgZnJhbWUgPSBwYWRkZWRfZnJhbWU7CisgICAgICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5sYXN0X2F1ZGlvX2ZyYW1lID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZyYW1lLT5uYl9zYW1wbGVzICE9IGF2Y3R4LT5mcmFtZV9zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJuYl9zYW1wbGVzICglZCkgIT0gZnJhbWVfc2l6ZSAoJWQpIChhdmNvZGVjX2VuY29kZV9hdWRpbzIpXG4iLCBmcmFtZS0+bmJfc2FtcGxlcywgYXZjdHgtPmZyYW1lX3NpemUpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2Fzc2VydDAoYXZjdHgtPmNvZGVjLT5lbmNvZGUyKTsKKworICAgIHJldCA9IGF2Y3R4LT5jb2RlYy0+ZW5jb2RlMihhdmN0eCwgYXZwa3QsIGZyYW1lLCBnb3RfcGFja2V0X3B0cik7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgaWYgKCpnb3RfcGFja2V0X3B0cikgeworICAgICAgICAgICAgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfREVMQVkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2cGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgIGF2cGt0LT5wdHMgPSBmcmFtZS0+cHRzOworICAgICAgICAgICAgICAgIGlmICghYXZwa3QtPmR1cmF0aW9uKQorICAgICAgICAgICAgICAgICAgICBhdnBrdC0+ZHVyYXRpb24gPSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZwa3QtPmR0cyA9IGF2cGt0LT5wdHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdnBrdC0+c2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGF2cGt0LT5kYXRhICYmIGF2cGt0LT5kYXRhID09IGF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXIpIHsKKyAgICAgICAgbmVlZHNfcmVhbGxvYyA9IDA7CisgICAgICAgIGlmICh1c2VyX3BrdC5kYXRhKSB7CisgICAgICAgICAgICBpZiAodXNlcl9wa3Quc2l6ZSA+PSBhdnBrdC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIG1lbWNweSh1c2VyX3BrdC5kYXRhLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlByb3ZpZGVkIHBhY2tldCBpcyB0b28gc21hbGwsIG5lZWRzIHRvIGJlICVkXG4iLCBhdnBrdC0+c2l6ZSk7CisgICAgICAgICAgICAgICAgYXZwa3QtPnNpemUgPSB1c2VyX3BrdC5zaXplOworICAgICAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZwa3QtPmJ1ZiAgICAgID0gdXNlcl9wa3QuYnVmOworICAgICAgICAgICAgYXZwa3QtPmRhdGEgICAgID0gdXNlcl9wa3QuZGF0YTsKKyAgICAgICAgfSBlbHNlIGlmICghYXZwa3QtPmJ1ZikgeworICAgICAgICAgICAgcmV0ID0gYXZfcGFja2V0X21ha2VfcmVmY291bnRlZChhdnBrdCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcmV0KSB7CisgICAgICAgIGlmIChuZWVkc19yZWFsbG9jICYmIGF2cGt0LT5kYXRhKSB7CisgICAgICAgICAgICByZXQgPSBhdl9idWZmZXJfcmVhbGxvYygmYXZwa3QtPmJ1ZiwgYXZwa3QtPnNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSA9IGF2cGt0LT5idWYtPmRhdGE7CisgICAgICAgIH0KKworICAgICAgICBhdmN0eC0+ZnJhbWVfbnVtYmVyKys7CisgICAgfQorCisgICAgaWYgKHJldCA8IDAgfHwgISpnb3RfcGFja2V0X3B0cikgeworICAgICAgICBhdl9wYWNrZXRfdW5yZWYoYXZwa3QpOworICAgICAgICBhdl9pbml0X3BhY2tldChhdnBrdCk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8qIE5PVEU6IGlmIHdlIGFkZCBhbnkgYXVkaW8gZW5jb2RlcnMgd2hpY2ggb3V0cHV0IG5vbi1rZXlmcmFtZSBwYWNrZXRzLAorICAgICAqICAgICAgIHRoaXMgbmVlZHMgdG8gYmUgbW92ZWQgdG8gdGhlIGVuY29kZXJzLCBidXQgZm9yIG5vdyB3ZSBjYW4gZG8gaXQKKyAgICAgKiAgICAgICBoZXJlIHRvIHNpbXBsaWZ5IHRoaW5ncyAqLworICAgIGF2cGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKK2VuZDoKKyAgICBhdl9mcmFtZV9mcmVlKCZwYWRkZWRfZnJhbWUpOworICAgIGF2X2ZyZWUoZXh0ZW5kZWRfZnJhbWUpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZjb2RlY19lbmNvZGVfdmlkZW8yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBpbnQgcmV0OworICAgIEFWUGFja2V0IHVzZXJfcGt0ID0gKmF2cGt0OworICAgIGludCBuZWVkc19yZWFsbG9jID0gIXVzZXJfcGt0LmRhdGE7CisKKyAgICAqZ290X3BhY2tldF9wdHIgPSAwOworCisgICAgaWYgKCFhdmN0eC0+Y29kZWMtPmVuY29kZTIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGlzIGVuY29kZXIgcmVxdWlyZXMgdXNpbmcgdGhlIGF2Y29kZWNfc2VuZF9mcmFtZSgpIEFQSS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGlmKENPTkZJR19GUkFNRV9USFJFQURfRU5DT0RFUiAmJgorICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+ZnJhbWVfdGhyZWFkX2VuY29kZXIgJiYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUmRkZfVEhSRUFEX0ZSQU1FKSkKKyAgICAgICAgcmV0dXJuIGZmX3RocmVhZF92aWRlb19lbmNvZGVfZnJhbWUoYXZjdHgsIGF2cGt0LCBmcmFtZSwgZ290X3BhY2tldF9wdHIpOworCisgICAgaWYgKChhdmN0eC0+ZmxhZ3MmQVZfQ09ERUNfRkxBR19QQVNTMSkgJiYgYXZjdHgtPnN0YXRzX291dCkKKyAgICAgICAgYXZjdHgtPnN0YXRzX291dFswXSA9ICdcMCc7CisKKyAgICBpZiAoIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9ERUxBWSkgJiYgIWZyYW1lKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihhdnBrdCk7CisgICAgICAgIGF2X2luaXRfcGFja2V0KGF2cGt0KTsKKyAgICAgICAgYXZwa3QtPnNpemUgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZTIoYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBhdmN0eC0+bWF4X3BpeGVscywgQVZfUElYX0ZNVF9OT05FLCAwLCBhdmN0eCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoZnJhbWUgJiYgZnJhbWUtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJBVkZyYW1lLmZvcm1hdCBpcyBub3Qgc2V0XG4iKTsKKyAgICBpZiAoZnJhbWUgJiYgKGZyYW1lLT53aWR0aCA9PSAwIHx8IGZyYW1lLT5oZWlnaHQgPT0gMCkpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJBVkZyYW1lLndpZHRoIG9yIGhlaWdodCBpcyBub3Qgc2V0XG4iKTsKKworICAgIGF2X2Fzc2VydDAoYXZjdHgtPmNvZGVjLT5lbmNvZGUyKTsKKworICAgIHJldCA9IGF2Y3R4LT5jb2RlYy0+ZW5jb2RlMihhdmN0eCwgYXZwa3QsIGZyYW1lLCBnb3RfcGFja2V0X3B0cik7CisgICAgYXZfYXNzZXJ0MChyZXQgPD0gMCk7CisKKyAgICBlbW1zX2MoKTsKKworICAgIGlmIChhdnBrdC0+ZGF0YSAmJiBhdnBrdC0+ZGF0YSA9PSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyKSB7CisgICAgICAgIG5lZWRzX3JlYWxsb2MgPSAwOworICAgICAgICBpZiAodXNlcl9wa3QuZGF0YSkgeworICAgICAgICAgICAgaWYgKHVzZXJfcGt0LnNpemUgPj0gYXZwa3QtPnNpemUpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkodXNlcl9wa3QuZGF0YSwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcm92aWRlZCBwYWNrZXQgaXMgdG9vIHNtYWxsLCBuZWVkcyB0byBiZSAlZFxuIiwgYXZwa3QtPnNpemUpOworICAgICAgICAgICAgICAgIGF2cGt0LT5zaXplID0gdXNlcl9wa3Quc2l6ZTsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2cGt0LT5idWYgICAgICA9IHVzZXJfcGt0LmJ1ZjsKKyAgICAgICAgICAgIGF2cGt0LT5kYXRhICAgICA9IHVzZXJfcGt0LmRhdGE7CisgICAgICAgIH0gZWxzZSBpZiAoIWF2cGt0LT5idWYpIHsKKyAgICAgICAgICAgIHJldCA9IGF2X3BhY2tldF9tYWtlX3JlZmNvdW50ZWQoYXZwa3QpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcmV0KSB7CisgICAgICAgIGlmICghKmdvdF9wYWNrZXRfcHRyKQorICAgICAgICAgICAgYXZwa3QtPnNpemUgPSAwOworICAgICAgICBlbHNlIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RFTEFZKSkKKyAgICAgICAgICAgIGF2cGt0LT5wdHMgPSBhdnBrdC0+ZHRzID0gZnJhbWUtPnB0czsKKworICAgICAgICBpZiAobmVlZHNfcmVhbGxvYyAmJiBhdnBrdC0+ZGF0YSkgeworICAgICAgICAgICAgcmV0ID0gYXZfYnVmZmVyX3JlYWxsb2MoJmF2cGt0LT5idWYsIGF2cGt0LT5zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEgPSBhdnBrdC0+YnVmLT5kYXRhOworICAgICAgICB9CisKKyAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOworICAgIH0KKworICAgIGlmIChyZXQgPCAwIHx8ICEqZ290X3BhY2tldF9wdHIpCisgICAgICAgIGF2X3BhY2tldF91bnJlZihhdnBrdCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZjb2RlY19lbmNvZGVfc3VidGl0bGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlN1YnRpdGxlICpzdWIpCit7CisgICAgaW50IHJldDsKKyAgICBpZiAoc3ViLT5zdGFydF9kaXNwbGF5X3RpbWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzdGFydF9kaXNwbGF5X3RpbWUgbXVzdCBiZSAwLlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXQgPSBhdmN0eC0+Y29kZWMtPmVuY29kZV9zdWIoYXZjdHgsIGJ1ZiwgYnVmX3NpemUsIHN1Yik7CisgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZG9fZW5jb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBpbnQgcmV0OworICAgICpnb3RfcGFja2V0ID0gMDsKKworICAgIGF2X3BhY2tldF91bnJlZihhdmN0eC0+aW50ZXJuYWwtPmJ1ZmZlcl9wa3QpOworICAgIGF2Y3R4LT5pbnRlcm5hbC0+YnVmZmVyX3BrdF92YWxpZCA9IDA7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfZW5jb2RlX3ZpZGVvMihhdmN0eCwgYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIGdvdF9wYWNrZXQpOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIHJldCA9IGF2Y29kZWNfZW5jb2RlX2F1ZGlvMihhdmN0eCwgYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUsIGdvdF9wYWNrZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocmV0ID49IDAgJiYgKmdvdF9wYWNrZXQpIHsKKyAgICAgICAgLy8gRW5jb2RlcnMgbXVzdCBhbHdheXMgcmV0dXJuIHJlZi1jb3VudGVkIGJ1ZmZlcnMuCisgICAgICAgIC8vIFNpZGUtZGF0YSBvbmx5IHBhY2tldHMgaGF2ZSBubyBkYXRhIGFuZCBjYW4gYmUgbm90IHJlZi1jb3VudGVkLgorICAgICAgICBhdl9hc3NlcnQwKCFhdmN0eC0+aW50ZXJuYWwtPmJ1ZmZlcl9wa3QtPmRhdGEgfHwgYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0LT5idWYpOworICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPmJ1ZmZlcl9wa3RfdmFsaWQgPSAxOworICAgICAgICByZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihhdmN0eC0+aW50ZXJuYWwtPmJ1ZmZlcl9wa3QpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2Y29kZWNfc2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIGlmICghYXZjb2RlY19pc19vcGVuKGF2Y3R4KSB8fCAhYXZfY29kZWNfaXNfZW5jb2RlcihhdmN0eC0+Y29kZWMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKGF2Y3R4LT5pbnRlcm5hbC0+ZHJhaW5pbmcpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmICghZnJhbWUpIHsKKyAgICAgICAgYXZjdHgtPmludGVybmFsLT5kcmFpbmluZyA9IDE7CisKKyAgICAgICAgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfREVMQVkpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+c2VuZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIGF2Y3R4LT5jb2RlYy0+c2VuZF9mcmFtZShhdmN0eCwgZnJhbWUpOworCisgICAgLy8gRW11bGF0aW9uIHZpYSBvbGQgQVBJLiBEbyBpdCBoZXJlIGluc3RlYWQgb2YgYXZjb2RlY19yZWNlaXZlX3BhY2tldCwgYmVjYXVzZToKKyAgICAvLyAxLiBpZiB0aGUgQVZGcmFtZSBpcyBub3QgcmVmY291bnRlZCwgdGhlIGNvcHlpbmcgd2lsbCBiZSBtdWNoIG1vcmUKKyAgICAvLyAgICBleHBlbnNpdmUgdGhhbiBjb3B5aW5nIHRoZSBwYWNrZXQgZGF0YQorICAgIC8vIDIuIGFzc3VtZSBmZXcgdXNlcnMgdXNlIG5vbi1yZWZjb3VudGVkIEFWUGFja2V0cywgc28gdXN1YWxseSBubyBjb3B5IGlzCisgICAgLy8gICAgbmVlZGVkCisKKyAgICBpZiAoYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0X3ZhbGlkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworCisgICAgcmV0dXJuIGRvX2VuY29kZShhdmN0eCwgZnJhbWUsICYoaW50KXswfSk7Cit9CisKK2ludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2Y29kZWNfcmVjZWl2ZV9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgYXZfcGFja2V0X3VucmVmKGF2cGt0KTsKKworICAgIGlmICghYXZjb2RlY19pc19vcGVuKGF2Y3R4KSB8fCAhYXZfY29kZWNfaXNfZW5jb2RlcihhdmN0eC0+Y29kZWMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+cmVjZWl2ZV9wYWNrZXQpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5pbnRlcm5hbC0+ZHJhaW5pbmcgJiYgIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9ERUxBWSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIHJldHVybiBhdmN0eC0+Y29kZWMtPnJlY2VpdmVfcGFja2V0KGF2Y3R4LCBhdnBrdCk7CisgICAgfQorCisgICAgLy8gRW11bGF0aW9uIHZpYSBvbGQgQVBJLgorCisgICAgaWYgKCFhdmN0eC0+aW50ZXJuYWwtPmJ1ZmZlcl9wa3RfdmFsaWQpIHsKKyAgICAgICAgaW50IGdvdF9wYWNrZXQ7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmICghYXZjdHgtPmludGVybmFsLT5kcmFpbmluZykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIHJldCA9IGRvX2VuY29kZShhdmN0eCwgTlVMTCwgJmdvdF9wYWNrZXQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmIChyZXQgPj0gMCAmJiAhZ290X3BhY2tldCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisKKyAgICBhdl9wYWNrZXRfbW92ZV9yZWYoYXZwa3QsIGF2Y3R4LT5pbnRlcm5hbC0+YnVmZmVyX3BrdCk7CisgICAgYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0X3ZhbGlkID0gMDsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZXJyb3JfcmVzaWxpZW5jZS5jIGIvbGliYXZjb2RlYy9lcnJvcl9yZXNpbGllbmNlLmMKaW5kZXggNWE3NWZhZC4uMzVkMGM2MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9lcnJvcl9yZXNpbGllbmNlLmMKKysrIGIvbGliYXZjb2RlYy9lcnJvcl9yZXNpbGllbmNlLmMKQEAgLTI3LDcgKzI3LDYgQEAKIAogI2luY2x1ZGUgPGxpbWl0cy5oPgogCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0b21pYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCkBAIC00Miw3ICs0MSw3IEBACiAgKiBAcGFyYW0gc3RyaWRlIHRoZSBudW1iZXIgb2YgTVZzIHRvIGdldCB0byB0aGUgbmV4dCByb3cKICAqIEBwYXJhbSBtdl9zdGVwIHRoZSBudW1iZXIgb2YgTVZzIHBlciByb3cgb3IgY29sdW1uIGluIGEgbWFjcm9ibG9jawogICovCi1zdGF0aWMgdm9pZCBzZXRfbXZfc3RyaWRlcyhFUkNvbnRleHQgKnMsIGludCAqbXZfc3RlcCwgaW50ICpzdHJpZGUpCitzdGF0aWMgdm9pZCBzZXRfbXZfc3RyaWRlcyhFUkNvbnRleHQgKnMsIHB0cmRpZmZfdCAqbXZfc3RlcCwgcHRyZGlmZl90ICpzdHJpZGUpCiB7CiAgICAgaWYgKHMtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CiAgICAgICAgIGF2X2Fzc2VydDAocy0+cXVhcnRlcl9zYW1wbGUpOwpAQCAtOTUsNyArOTQsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZmlsdGVyMTgxKGludDE2X3QgKmRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkKK3N0YXRpYyB2b2lkIGZpbHRlcjE4MShpbnQxNl90ICpkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHB0cmRpZmZfdCBzdHJpZGUpCiB7CiAgICAgaW50IHgsIHk7CiAKQEAgLTEwOCw3ICsxMDcsNyBAQAogICAgICAgICAgICAgZGMgPSAtcHJldl9kYyArCiAgICAgICAgICAgICAgICAgIGRhdGFbeCAgICAgKyB5ICogc3RyaWRlXSAqIDggLQogICAgICAgICAgICAgICAgICBkYXRhW3ggKyAxICsgeSAqIHN0cmlkZV07Ci0gICAgICAgICAgICBkYyA9IChkYyAqIDEwOTIzICsgMzI3NjgpID4+IDE2OworICAgICAgICAgICAgZGMgPSAoYXZfY2xpcChkYywgSU5UX01JTi8xMDkyMywgSU5UX01BWC8xMDkyMyAtIDMyNzY4KSAqIDEwOTIzICsgMzI3NjgpID4+IDE2OwogICAgICAgICAgICAgcHJldl9kYyA9IGRhdGFbeCArIHkgKiBzdHJpZGVdOwogICAgICAgICAgICAgZGF0YVt4ICsgeSAqIHN0cmlkZV0gPSBkYzsKICAgICAgICAgfQpAQCAtMTI0LDcgKzEyMyw3IEBACiAgICAgICAgICAgICBkYyA9IC1wcmV2X2RjICsKICAgICAgICAgICAgICAgICAgZGF0YVt4ICsgIHkgICAgICAqIHN0cmlkZV0gKiA4IC0KICAgICAgICAgICAgICAgICAgZGF0YVt4ICsgKHkgKyAxKSAqIHN0cmlkZV07Ci0gICAgICAgICAgICBkYyA9IChkYyAqIDEwOTIzICsgMzI3NjgpID4+IDE2OworICAgICAgICAgICAgZGMgPSAoYXZfY2xpcChkYywgSU5UX01JTi8xMDkyMywgSU5UX01BWC8xMDkyMyAtIDMyNzY4KSAqIDEwOTIzICsgMzI3NjgpID4+IDE2OwogICAgICAgICAgICAgcHJldl9kYyA9IGRhdGFbeCArIHkgKiBzdHJpZGVdOwogICAgICAgICAgICAgZGF0YVt4ICsgeSAqIHN0cmlkZV0gPSBkYzsKICAgICAgICAgfQpAQCAtMTM3LDcgKzEzNiw3IEBACiAgKiBAcGFyYW0gaCAgICAgaGVpZ2h0IGluIDggcGl4ZWwgYmxvY2tzCiAgKi8KIHN0YXRpYyB2b2lkIGd1ZXNzX2RjKEVSQ29udGV4dCAqcywgaW50MTZfdCAqZGMsIGludCB3LAotICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBzdHJpZGUsIGludCBpc19sdW1hKQorICAgICAgICAgICAgICAgICAgICAgaW50IGgsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBpc19sdW1hKQogewogICAgIGludCBiX3gsIGJfeTsKICAgICBpbnQxNl90ICAoKmNvbCApWzRdID0gYXZfbWFsbG9jX2FycmF5KHN0cmlkZSwgaCpzaXplb2YoIGludDE2X3QpKjQpOwpAQCAtMjQwLDkgKzIzOSwxMCBAQAogICogQHBhcmFtIGggICAgIGhlaWdodCBpbiA4IHBpeGVsIGJsb2NrcwogICovCiBzdGF0aWMgdm9pZCBoX2Jsb2NrX2ZpbHRlcihFUkNvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgaW50IHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IHN0cmlkZSwgaW50IGlzX2x1bWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGlzX2x1bWEpCiB7Ci0gICAgaW50IGJfeCwgYl95LCBtdnhfc3RyaWRlLCBtdnlfc3RyaWRlOworICAgIGludCBiX3gsIGJfeTsKKyAgICBwdHJkaWZmX3QgbXZ4X3N0cmlkZSwgbXZ5X3N0cmlkZTsKICAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOwogICAgIHNldF9tdl9zdHJpZGVzKHMsICZtdnhfc3RyaWRlLCAmbXZ5X3N0cmlkZSk7CiAgICAgbXZ4X3N0cmlkZSA+Pj0gaXNfbHVtYTsKQEAgLTMwOCw5ICszMDgsMTAgQEAKICAqIEBwYXJhbSBoICAgICBoZWlnaHQgaW4gOCBwaXhlbCBibG9ja3MKICAqLwogc3RhdGljIHZvaWQgdl9ibG9ja19maWx0ZXIoRVJDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsIGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBpc19sdW1hKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGlzX2x1bWEpCiB7Ci0gICAgaW50IGJfeCwgYl95LCBtdnhfc3RyaWRlLCBtdnlfc3RyaWRlOworICAgIGludCBiX3gsIGJfeTsKKyAgICBwdHJkaWZmX3QgbXZ4X3N0cmlkZSwgbXZ5X3N0cmlkZTsKICAgICBjb25zdCB1aW50OF90ICpjbSA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOwogICAgIHNldF9tdl9zdHJpZGVzKHMsICZtdnhfc3RyaWRlLCAmbXZ5X3N0cmlkZSk7CiAgICAgbXZ4X3N0cmlkZSA+Pj0gaXNfbHVtYTsKQEAgLTM3MywyNiArMzc0LDQ1IEBACiAgICAgfQogfQogCisjZGVmaW5lIE1WX0ZST1pFTiAgICA4CisjZGVmaW5lIE1WX0NIQU5HRUQgICA0CisjZGVmaW5lIE1WX1VOQ0hBTkdFRCAyCisjZGVmaW5lIE1WX0xJU1RFRCAgICAxCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGFkZF9ibG9ja2xpc3QoaW50ICgqYmxvY2tsaXN0KVsyXSwgaW50ICpibG9ja2xpc3RfbGVuZ3RoLCB1aW50OF90ICpmaXhlZCwgaW50IG1iX3gsIGludCBtYl95LCBpbnQgbWJfeHkpCit7CisgICAgaWYgKGZpeGVkW21iX3h5XSkKKyAgICAgICAgcmV0dXJuOworICAgIGZpeGVkW21iX3h5XSA9IE1WX0xJU1RFRDsKKyAgICBibG9ja2xpc3RbICpibG9ja2xpc3RfbGVuZ3RoICAgXVswXSA9IG1iX3g7CisgICAgYmxvY2tsaXN0WygqYmxvY2tsaXN0X2xlbmd0aCkrK11bMV0gPSBtYl95OworfQorCiBzdGF0aWMgdm9pZCBndWVzc19tdihFUkNvbnRleHQgKnMpCiB7Ci0gICAgdWludDhfdCAqZml4ZWQgPSBzLT5lcl90ZW1wX2J1ZmZlcjsKLSNkZWZpbmUgTVZfRlJPWkVOICAgIDMKLSNkZWZpbmUgTVZfQ0hBTkdFRCAgIDIKLSNkZWZpbmUgTVZfVU5DSEFOR0VEIDEKLSAgICBjb25zdCBpbnQgbWJfc3RyaWRlID0gcy0+bWJfc3RyaWRlOworICAgIGludCAoKmJsb2NrbGlzdClbMl0sICgqbmV4dF9ibG9ja2xpc3QpWzJdOworICAgIHVpbnQ4X3QgKmZpeGVkOworICAgIGNvbnN0IHB0cmRpZmZfdCBtYl9zdHJpZGUgPSBzLT5tYl9zdHJpZGU7CiAgICAgY29uc3QgaW50IG1iX3dpZHRoICA9IHMtPm1iX3dpZHRoOwogICAgIGludCBtYl9oZWlnaHQgPSBzLT5tYl9oZWlnaHQ7CiAgICAgaW50IGksIGRlcHRoLCBudW1fYXZhaWw7Ci0gICAgaW50IG1iX3gsIG1iX3ksIG1vdF9zdGVwLCBtb3Rfc3RyaWRlOworICAgIGludCBtYl94LCBtYl95OworICAgIHB0cmRpZmZfdCBtb3Rfc3RlcCwgbW90X3N0cmlkZTsKKyAgICBpbnQgYmxvY2tsaXN0X2xlbmd0aCwgbmV4dF9ibG9ja2xpc3RfbGVuZ3RoOwogCiAgICAgaWYgKHMtPmxhc3RfcGljLmYgJiYgcy0+bGFzdF9waWMuZi0+ZGF0YVswXSkKICAgICAgICAgbWJfaGVpZ2h0ID0gRkZNSU4obWJfaGVpZ2h0LCAocy0+bGFzdF9waWMuZi0+aGVpZ2h0KzE1KT4+NCk7CiAgICAgaWYgKHMtPm5leHRfcGljLmYgJiYgcy0+bmV4dF9waWMuZi0+ZGF0YVswXSkKICAgICAgICAgbWJfaGVpZ2h0ID0gRkZNSU4obWJfaGVpZ2h0LCAocy0+bmV4dF9waWMuZi0+aGVpZ2h0KzE1KT4+NCk7CiAKKyAgICBibG9ja2xpc3QgICAgICA9IChpbnQgKCopWzJdKXMtPmVyX3RlbXBfYnVmZmVyOworICAgIG5leHRfYmxvY2tsaXN0ID0gYmxvY2tsaXN0ICsgcy0+bWJfc3RyaWRlICogcy0+bWJfaGVpZ2h0OworICAgIGZpeGVkICAgICAgICAgID0gKHVpbnQ4X3QgKikobmV4dF9ibG9ja2xpc3QgKyBzLT5tYl9zdHJpZGUgKiBzLT5tYl9oZWlnaHQpOworCiAgICAgc2V0X212X3N0cmlkZXMocywgJm1vdF9zdGVwLCAmbW90X3N0cmlkZSk7CiAKICAgICBudW1fYXZhaWwgPSAwOworICAgIGlmIChzLT5sYXN0X3BpYy5tb3Rpb25fdmFsWzBdKQorICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3Mocy0+bGFzdF9waWMudGYsIG1iX2hlaWdodC0xLCAwKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbWJfd2lkdGggKiBtYl9oZWlnaHQ7IGkrKykgewogICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKICAgICAgICAgaW50IGYgPSAwOwpAQCAtNDE3LDcgKzQzNyw3IEBACiAgICAgfQogCiAgICAgaWYgKCghKHMtPmF2Y3R4LT5lcnJvcl9jb25jZWFsbWVudCZGRl9FQ19HVUVTU19NVlMpKSB8fAotICAgICAgICBudW1fYXZhaWwgPD0gbWJfd2lkdGggLyAyKSB7CisgICAgICAgIG51bV9hdmFpbCA8PSBGRk1BWChtYl93aWR0aCwgbWJfaGVpZ2h0KSAvIDIpIHsKICAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IG1iX2hlaWdodDsgbWJfeSsrKSB7CiAgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYl94eSA9IG1iX3ggKyBtYl95ICogcy0+bWJfc3RyaWRlOwpAQCAtNDM3LDI1NCArNDU3LDI2NSBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgYmxvY2tsaXN0X2xlbmd0aCA9IDA7CisgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IG1iX2hlaWdodDsgbWJfeSsrKSB7CisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBtYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBtYl94ICsgbWJfeSAqIG1iX3N0cmlkZTsKKyAgICAgICAgICAgIGlmIChmaXhlZFttYl94eV0gPT0gTVZfRlJPWkVOKSB7CisgICAgICAgICAgICAgICAgaWYgKG1iX3gpICAgICAgICAgICAgICAgYWRkX2Jsb2NrbGlzdChibG9ja2xpc3QsICZibG9ja2xpc3RfbGVuZ3RoLCBmaXhlZCwgbWJfeCAtIDEsIG1iX3ksIG1iX3h5IC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKG1iX3kpICAgICAgICAgICAgICAgYWRkX2Jsb2NrbGlzdChibG9ja2xpc3QsICZibG9ja2xpc3RfbGVuZ3RoLCBmaXhlZCwgbWJfeCwgbWJfeSAtIDEsIG1iX3h5IC0gbWJfc3RyaWRlKTsKKyAgICAgICAgICAgICAgICBpZiAobWJfeCsxIDwgbWJfd2lkdGgpICBhZGRfYmxvY2tsaXN0KGJsb2NrbGlzdCwgJmJsb2NrbGlzdF9sZW5ndGgsIGZpeGVkLCBtYl94ICsgMSwgbWJfeSwgbWJfeHkgKyAxKTsKKyAgICAgICAgICAgICAgICBpZiAobWJfeSsxIDwgbWJfaGVpZ2h0KSBhZGRfYmxvY2tsaXN0KGJsb2NrbGlzdCwgJmJsb2NrbGlzdF9sZW5ndGgsIGZpeGVkLCBtYl94LCBtYl95ICsgMSwgbWJfeHkgKyBtYl9zdHJpZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgZm9yIChkZXB0aCA9IDA7IDsgZGVwdGgrKykgewogICAgICAgICBpbnQgY2hhbmdlZCwgcGFzcywgbm9uZV9sZWZ0OworICAgICAgICBpbnQgYmxvY2tsaXN0X2luZGV4OwogCiAgICAgICAgIG5vbmVfbGVmdCA9IDE7CiAgICAgICAgIGNoYW5nZWQgICA9IDE7CiAgICAgICAgIGZvciAocGFzcyA9IDA7IChjaGFuZ2VkIHx8IHBhc3MgPCAyKSAmJiBwYXNzIDwgMTA7IHBhc3MrKykgewotICAgICAgICAgICAgaW50IG1iX3gsIG1iX3k7CiAgICAgICAgICAgICBpbnQgc2NvcmVfc3VtID0gMDsKIAogICAgICAgICAgICAgY2hhbmdlZCA9IDA7Ci0gICAgICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgbWJfaGVpZ2h0OyBtYl95KyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWJfeHkgICAgICAgID0gbWJfeCArIG1iX3kgKiBzLT5tYl9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtdl9wcmVkaWN0b3JbOF1bMl0gPSB7IHsgMCB9IH07Ci0gICAgICAgICAgICAgICAgICAgIGludCByZWZbOF0gICAgICAgICAgICAgPSB7IDAgfTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHByZWRfY291bnQgICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGludCBqOwotICAgICAgICAgICAgICAgICAgICBpbnQgYmVzdF9zY29yZSAgICAgICAgID0gMjU2ICogMjU2ICogMjU2ICogNjQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCBiZXN0X3ByZWQgICAgICAgICAgPSAwOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbW90X2luZGV4ICAgID0gKG1iX3ggKyBtYl95ICogbW90X3N0cmlkZSkgKiBtb3Rfc3RlcDsKLSAgICAgICAgICAgICAgICAgICAgaW50IHByZXZfeCA9IDAsIHByZXZfeSA9IDAsIHByZXZfcmVmID0gMDsKKyAgICAgICAgICAgIGZvciAoYmxvY2tsaXN0X2luZGV4ID0gMDsgYmxvY2tsaXN0X2luZGV4IDwgYmxvY2tsaXN0X2xlbmd0aDsgYmxvY2tsaXN0X2luZGV4KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWJfeCA9IGJsb2NrbGlzdFtibG9ja2xpc3RfaW5kZXhdWzBdOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYl95ID0gYmxvY2tsaXN0W2Jsb2NrbGlzdF9pbmRleF1bMV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gbWJfeCArIG1iX3kgKiBtYl9zdHJpZGU7CisgICAgICAgICAgICAgICAgaW50IG12X3ByZWRpY3Rvcls4XVsyXTsKKyAgICAgICAgICAgICAgICBpbnQgcmVmWzhdOworICAgICAgICAgICAgICAgIGludCBwcmVkX2NvdW50OworICAgICAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgICAgIGludCBiZXN0X3Njb3JlOworICAgICAgICAgICAgICAgIGludCBiZXN0X3ByZWQ7CisgICAgICAgICAgICAgICAgaW50IG1vdF9pbmRleDsKKyAgICAgICAgICAgICAgICBpbnQgcHJldl94LCBwcmV2X3ksIHByZXZfcmVmOwogCi0gICAgICAgICAgICAgICAgICAgIGlmICgobWJfeCBeIG1iX3kgXiBwYXNzKSAmIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoKG1iX3ggXiBtYl95IF4gcGFzcykgJiAxKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGZpeGVkW21iX3h5XSAhPSBNVl9GUk9aRU4pOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaXhlZFttYl94eV0gPT0gTVZfRlJPWkVOKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDEoIUlTX0lOVFJBKHMtPmN1cl9waWMubWJfdHlwZVttYl94eV0pKTsKLSAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MShzLT5sYXN0X3BpYy5mICYmIHMtPmxhc3RfcGljLmYtPmRhdGFbMF0pOwogCi0gICAgICAgICAgICAgICAgICAgIGogPSAwOwotICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCA+IDAgICAgICAgICAgICAgJiYgZml4ZWRbbWJfeHkgLSAxXSAgICAgICAgID09IE1WX0ZST1pFTikKLSAgICAgICAgICAgICAgICAgICAgICAgIGogPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCArIDEgPCBtYl93aWR0aCAgJiYgZml4ZWRbbWJfeHkgKyAxXSAgICAgICAgID09IE1WX0ZST1pFTikKLSAgICAgICAgICAgICAgICAgICAgICAgIGogPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSA+IDAgICAgICAgICAgICAgJiYgZml4ZWRbbWJfeHkgLSBtYl9zdHJpZGVdID09IE1WX0ZST1pFTikKLSAgICAgICAgICAgICAgICAgICAgICAgIGogPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSArIDEgPCBtYl9oZWlnaHQgJiYgZml4ZWRbbWJfeHkgKyBtYl9zdHJpZGVdID09IE1WX0ZST1pFTikKLSAgICAgICAgICAgICAgICAgICAgICAgIGogPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MSghSVNfSU5UUkEocy0+Y3VyX3BpYy5tYl90eXBlW21iX3h5XSkpOworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDEocy0+bGFzdF9waWMuZiAmJiBzLT5sYXN0X3BpYy5mLT5kYXRhWzBdKTsKIAotICAgICAgICAgICAgICAgICAgICBqID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggPiAwICAgICAgICAgICAgICYmIGZpeGVkW21iX3h5IC0gMSAgICAgICAgXSA9PSBNVl9DSEFOR0VEKQotICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYl94ICsgMSA8IG1iX3dpZHRoICAmJiBmaXhlZFttYl94eSArIDEgICAgICAgIF0gPT0gTVZfQ0hBTkdFRCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGogPSAxOwotICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSA+IDAgICAgICAgICAgICAgJiYgZml4ZWRbbWJfeHkgLSBtYl9zdHJpZGVdID09IE1WX0NIQU5HRUQpCi0gICAgICAgICAgICAgICAgICAgICAgICBqID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgKyAxIDwgbWJfaGVpZ2h0ICYmIGZpeGVkW21iX3h5ICsgbWJfc3RyaWRlXSA9PSBNVl9DSEFOR0VEKQotICAgICAgICAgICAgICAgICAgICAgICAgaiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChqID09IDAgJiYgcGFzcyA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgICAgICBpZiAobWJfeCA+IDApCisgICAgICAgICAgICAgICAgICAgIGogfD0gZml4ZWRbbWJfeHkgLSAxXTsKKyAgICAgICAgICAgICAgICBpZiAobWJfeCArIDEgPCBtYl93aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgaiB8PSBmaXhlZFttYl94eSArIDFdOworICAgICAgICAgICAgICAgIGlmIChtYl95ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgaiB8PSBmaXhlZFttYl94eSAtIG1iX3N0cmlkZV07CisgICAgICAgICAgICAgICAgaWYgKG1iX3kgKyAxIDwgbWJfaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICBqIHw9IGZpeGVkW21iX3h5ICsgbWJfc3RyaWRlXTsKIAotICAgICAgICAgICAgICAgICAgICBub25lX2xlZnQgPSAwOworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoaiAmIE1WX0ZST1pFTik7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggPiAwICYmIGZpeGVkW21iX3h5IC0gMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVswXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCAtIG1vdF9zdGVwXVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCAtIG1vdF9zdGVwXVsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5yZWZfaW5kZXhbMF1bNCAqIChtYl94eSAtIDEpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCArIDEgPCBtYl93aWR0aCAmJiBmaXhlZFttYl94eSArIDFdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggKyBtb3Rfc3RlcF1bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggKyBtb3Rfc3RlcF1bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiAobWJfeHkgKyAxKV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmVkX2NvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgPiAwICYmIGZpeGVkW21iX3h5IC0gbWJfc3RyaWRlXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4IC0gbW90X3N0cmlkZSAqIG1vdF9zdGVwXVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCAtIG1vdF9zdHJpZGUgKiBtb3Rfc3RlcF1bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiAobWJfeHkgLSBzLT5tYl9zdHJpZGUpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSArIDE8bWJfaGVpZ2h0ICYmIGZpeGVkW21iX3h5ICsgbWJfc3RyaWRlXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4ICsgbW90X3N0cmlkZSAqIG1vdF9zdGVwXVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVsxXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCArIG1vdF9zdHJpZGUgKiBtb3Rfc3RlcF1bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiAobWJfeHkgKyBzLT5tYl9zdHJpZGUpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocHJlZF9jb3VudCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKCEoaiAmIE1WX0NIQU5HRUQpICYmIHBhc3MgPiAxKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAocHJlZF9jb3VudCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdW1feCA9IDAsIHN1bV95ID0gMCwgc3VtX3IgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF94LCBtYXhfeSwgbWluX3gsIG1pbl95LCBtYXhfciwgbWluX3I7CisgICAgICAgICAgICAgICAgbm9uZV9sZWZ0ID0gMDsKKyAgICAgICAgICAgICAgICBwcmVkX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBtb3RfaW5kZXggID0gKG1iX3ggKyBtYl95ICogbW90X3N0cmlkZSkgKiBtb3Rfc3RlcDsKIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHByZWRfY291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV94ICs9IG12X3ByZWRpY3RvcltqXVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1feSArPSBtdl9wcmVkaWN0b3Jbal1bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtX3IgKz0gcmVmW2pdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICYmIHJlZltqXSAhPSByZWZbaiAtIDFdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBfbWVhbl9hbmRfbWVkaWFuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBtZWFuICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMF0gPSBzdW1feCAvIGo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMV0gPSBzdW1feSAvIGo7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gICAgPSBzdW1fciAvIGo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1lZGlhbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWRfY291bnQgPj0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl95ID0gbWluX3ggPSBtaW5fciA9ICA5OTk5OTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfeSA9IG1heF94ID0gbWF4X3IgPSAtOTk5OTk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl94ID0gbWluX3kgPSBtYXhfeCA9IG1heF95ID0gbWluX3IgPSBtYXhfciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHJlZF9jb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ggPSBGRk1BWChtYXhfeCwgbXZfcHJlZGljdG9yW2pdWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfeSA9IEZGTUFYKG1heF95LCBtdl9wcmVkaWN0b3Jbal1bMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9yID0gRkZNQVgobWF4X3IsIHJlZltqXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3ggPSBGRk1JTihtaW5feCwgbXZfcHJlZGljdG9yW2pdWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5feSA9IEZGTUlOKG1pbl95LCBtdl9wcmVkaWN0b3Jbal1bMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9yID0gRkZNSU4obWluX3IsIHJlZltqXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudCArIDFdWzBdID0gc3VtX3ggLSBtYXhfeCAtIG1pbl94OwotICAgICAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnQgKyAxXVsxXSA9IHN1bV95IC0gbWF4X3kgLSBtaW5feTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50ICsgMV0gICAgPSBzdW1fciAtIG1heF9yIC0gbWluX3I7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkX2NvdW50ID09IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudCArIDFdWzBdIC89IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnQgKyAxXVsxXSAvPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50ICsgMV0gICAgLz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi1za2lwX21lYW5fYW5kX21lZGlhbjoKLSAgICAgICAgICAgICAgICAgICAgLyogemVybyBNViAqLworICAgICAgICAgICAgICAgIGlmIChtYl94ID4gMCAmJiBmaXhlZFttYl94eSAtIDFdID4gMSkgeworICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCAtIG1vdF9zdGVwXVswXTsKKyAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggLSBtb3Rfc3RlcF1bMV07CisgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50XSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLnJlZl9pbmRleFswXVs0ICogKG1iX3h5IC0gMSldOwogICAgICAgICAgICAgICAgICAgICBwcmVkX2NvdW50Kys7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXhlZFttYl94eV0gJiYgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKHMtPmxhc3RfcGljLnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl95LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy0+bGFzdF9waWMubW90aW9uX3ZhbFswXSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzLT5sYXN0X3BpYy5yZWZfaW5kZXhbMF0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBza2lwX2xhc3RfbXY7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3ggICA9IHMtPmxhc3RfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4XVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfeSAgID0gcy0+bGFzdF9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXhdWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9yZWYgPSBzLT5sYXN0X3BpYy5yZWZfaW5kZXhbMF1bNCAqIG1iX3h5XTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfeCAgID0gcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleF1bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3kgICA9IHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXhdWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9yZWYgPSBzLT5jdXJfcGljLnJlZl9pbmRleFswXVs0ICogbWJfeHldOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogbGFzdCBNViAqLwotICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMF0gPSBwcmV2X3g7Ci0gICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVsxXSA9IHByZXZfeTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3ByZWRfY291bnRdICAgID0gcHJldl9yZWY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtYl94ICsgMSA8IG1iX3dpZHRoICYmIGZpeGVkW21iX3h5ICsgMV0gPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4ICsgbW90X3N0ZXBdWzBdOworICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCArIG1vdF9zdGVwXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgcmVmW3ByZWRfY291bnRdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiAobWJfeHkgKyAxKV07CiAgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1iX3kgPiAwICYmIGZpeGVkW21iX3h5IC0gbWJfc3RyaWRlXSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggLSBtb3Rfc3RyaWRlICogbW90X3N0ZXBdWzBdOworICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW21vdF9pbmRleCAtIG1vdF9zdHJpZGUgKiBtb3Rfc3RlcF1bMV07CisgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50XSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLnJlZl9pbmRleFswXVs0ICogKG1iX3h5IC0gcy0+bWJfc3RyaWRlKV07CisgICAgICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1iX3kgKyAxPG1iX2hlaWdodCAmJiBmaXhlZFttYl94eSArIG1iX3N0cmlkZV0gPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50XVswXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4ICsgbW90X3N0cmlkZSAqIG1vdF9zdGVwXVswXTsKKyAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggKyBtb3Rfc3RyaWRlICogbW90X3N0ZXBdWzFdOworICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy5yZWZfaW5kZXhbMF1bNCAqIChtYl94eSArIHMtPm1iX3N0cmlkZSldOworICAgICAgICAgICAgICAgICAgICBwcmVkX2NvdW50Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcmVkX2NvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi1za2lwX2xhc3RfbXY6CisgICAgICAgICAgICAgICAgaWYgKHByZWRfY291bnQgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdW1feCA9IDAsIHN1bV95ID0gMCwgc3VtX3IgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3gsIG1heF95LCBtaW5feCwgbWluX3ksIG1heF9yLCBtaW5fcjsKIAogICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHJlZF9jb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxpbmVzaXplID0gcy0+Y3VyX3BpYy5mLT5saW5lc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY29yZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMgPSBzLT5jdXJfcGljLmYtPmRhdGFbMF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfeCAqIDE2ICsgbWJfeSAqIDE2ICogbGluZXNpemVbMF07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXhdWzBdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IG12X3ByZWRpY3RvcltqXVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXhdWzFdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IG12X3ByZWRpY3RvcltqXVsxXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJlZGljdG9yIGludHJhIG9yIG90aGVyd2lzZSBub3QgYXZhaWxhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmW2pdIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb2RlX21iKHMtPm9wYXF1ZSwgcmVmW2pdLCBNVl9ESVJfRk9SV0FSRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVl9UWVBFXzE2WDE2LCAmcy0+bXYsIG1iX3gsIG1iX3ksIDAsIDApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCA+IDAgJiYgZml4ZWRbbWJfeHkgLSAxXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSArPSBGRkFCUyhzcmNbayAqIGxpbmVzaXplWzBdIC0gMV0gLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbayAqIGxpbmVzaXplWzBdXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCArIDEgPCBtYl93aWR0aCAmJiBmaXhlZFttYl94eSArIDFdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IEZGQUJTKHNyY1trICogbGluZXNpemVbMF0gKyAxNV0gLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbayAqIGxpbmVzaXplWzBdICsgMTZdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYl95ID4gMCAmJiBmaXhlZFttYl94eSAtIG1iX3N0cmlkZV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gRkZBQlMoc3JjW2sgLSBsaW5lc2l6ZVswXV0gLSBzcmNba10pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgKyAxIDwgbWJfaGVpZ2h0ICYmIGZpeGVkW21iX3h5ICsgbWJfc3RyaWRlXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSArPSBGRkFCUyhzcmNbayArIGxpbmVzaXplWzBdICogMTVdIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW2sgKyBsaW5lc2l6ZVswXSAqIDE2XSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY29yZSA8PSBiZXN0X3Njb3JlKSB7IC8vIDw9IHdpbGwgZmF2b3IgdGhlIGxhc3QgTVYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9wcmVkICA9IGo7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdW1feCArPSBtdl9wcmVkaWN0b3Jbal1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzdW1feSArPSBtdl9wcmVkaWN0b3Jbal1bMV07CisgICAgICAgICAgICAgICAgICAgICAgICBzdW1fciArPSByZWZbal07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAmJiByZWZbal0gIT0gcmVmW2ogLSAxXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBfbWVhbl9hbmRfbWVkaWFuOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNjb3JlX3N1bSArPSBiZXN0X3Njb3JlOwotICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IG12X3ByZWRpY3RvcltiZXN0X3ByZWRdWzBdOwotICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IG12X3ByZWRpY3RvcltiZXN0X3ByZWRdWzFdOwogCi0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3Rfc3RlcDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1vdF9zdGVwOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4ICsgaSArIGogKiBtb3Rfc3RyaWRlXVswXSA9IHMtPm12WzBdWzBdWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggKyBpICsgaiAqIG1vdF9zdHJpZGVdWzFdID0gcy0+bXZbMF1bMF1bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIG1lYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzBdID0gc3VtX3ggLyBqOworICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMV0gPSBzdW1feSAvIGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50XSAgICA9IHN1bV9yIC8gajsKIAotICAgICAgICAgICAgICAgICAgICBzLT5kZWNvZGVfbWIocy0+b3BhcXVlLCByZWZbYmVzdF9wcmVkXSwgTVZfRElSX0ZPUldBUkQsCisgICAgICAgICAgICAgICAgICAgIC8qIG1lZGlhbiAqLworICAgICAgICAgICAgICAgICAgICBpZiAocHJlZF9jb3VudCA+PSAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5feSA9IG1pbl94ID0gbWluX3IgPSAgOTk5OTk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfeSA9IG1heF94ID0gbWF4X3IgPSAtOTk5OTk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5feCA9IG1pbl95ID0gbWF4X3ggPSBtYXhfeSA9IG1pbl9yID0gbWF4X3IgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwcmVkX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF94ID0gRkZNQVgobWF4X3gsIG12X3ByZWRpY3RvcltqXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfeSA9IEZGTUFYKG1heF95LCBtdl9wcmVkaWN0b3Jbal1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3IgPSBGRk1BWChtYXhfciwgcmVmW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl94ID0gRkZNSU4obWluX3gsIG12X3ByZWRpY3RvcltqXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5feSA9IEZGTUlOKG1pbl95LCBtdl9wcmVkaWN0b3Jbal1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbWluX3IgPSBGRk1JTihtaW5fciwgcmVmW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudCArIDFdWzBdID0gc3VtX3ggLSBtYXhfeCAtIG1pbl94OworICAgICAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudCArIDFdWzFdID0gc3VtX3kgLSBtYXhfeSAtIG1pbl95OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJlZF9jb3VudCArIDFdICAgID0gc3VtX3IgLSBtYXhfciAtIG1pbl9yOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkX2NvdW50ID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50ICsgMV1bMF0gLz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12X3ByZWRpY3RvcltwcmVkX2NvdW50ICsgMV1bMV0gLz0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50ICsgMV0gICAgLz0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmVkX2NvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorCitza2lwX21lYW5fYW5kX21lZGlhbjoKKyAgICAgICAgICAgICAgICAvKiB6ZXJvIE1WICovCisgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzBdID0KKyAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50XSAgICA9IDA7CisgICAgICAgICAgICAgICAgcHJlZF9jb3VudCsrOworCisgICAgICAgICAgICAgICAgcHJldl94ICAgPSBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4XVswXTsKKyAgICAgICAgICAgICAgICBwcmV2X3kgICA9IHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXhdWzFdOworICAgICAgICAgICAgICAgIHByZXZfcmVmID0gcy0+Y3VyX3BpYy5yZWZfaW5kZXhbMF1bNCAqIG1iX3h5XTsKKworICAgICAgICAgICAgICAgIC8qIGxhc3QgTVYgKi8KKyAgICAgICAgICAgICAgICBtdl9wcmVkaWN0b3JbcHJlZF9jb3VudF1bMF0gPSBwcmV2X3g7CisgICAgICAgICAgICAgICAgbXZfcHJlZGljdG9yW3ByZWRfY291bnRdWzFdID0gcHJldl95OworICAgICAgICAgICAgICAgICAgICAgICAgIHJlZltwcmVkX2NvdW50XSAgICA9IHByZXZfcmVmOworICAgICAgICAgICAgICAgIHByZWRfY291bnQrKzsKKworICAgICAgICAgICAgICAgIGJlc3RfcHJlZCA9IDA7CisgICAgICAgICAgICAgICAgYmVzdF9zY29yZSA9IDI1NiAqIDI1NiAqIDI1NiAqIDY0OworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwcmVkX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ICpsaW5lc2l6ZSA9IHMtPmN1cl9waWMuZi0+bGluZXNpemU7CisgICAgICAgICAgICAgICAgICAgIGludCBzY29yZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyA9IHMtPmN1cl9waWMuZi0+ZGF0YVswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX3ggKiAxNiArIG1iX3kgKiAxNiAqIGxpbmVzaXplWzBdOworCisgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXhdWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0gbXZfcHJlZGljdG9yW2pdWzBdOworICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4XVsxXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IG12X3ByZWRpY3RvcltqXVsxXTsKKworICAgICAgICAgICAgICAgICAgICAvLyBwcmVkaWN0b3IgaW50cmEgb3Igb3RoZXJ3aXNlIG5vdCBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZltqXSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBzLT5kZWNvZGVfbWIocy0+b3BhcXVlLCByZWZbal0sIE1WX0RJUl9GT1JXQVJELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZfVFlQRV8xNlgxNiwgJnMtPm12LCBtYl94LCBtYl95LCAwLCAwKTsKIAorICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCA+IDAgJiYgZml4ZWRbbWJfeHkgLSAxXSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gRkZBQlMoc3JjW2sgKiBsaW5lc2l6ZVswXSAtIDFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbayAqIGxpbmVzaXplWzBdXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3ggKyAxIDwgbWJfd2lkdGggJiYgZml4ZWRbbWJfeHkgKyAxXSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gRkZBQlMoc3JjW2sgKiBsaW5lc2l6ZVswXSArIDE1XSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW2sgKiBsaW5lc2l6ZVswXSArIDE2XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgPiAwICYmIGZpeGVkW21iX3h5IC0gbWJfc3RyaWRlXSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmUgKz0gRkZBQlMoc3JjW2sgLSBsaW5lc2l6ZVswXV0gLSBzcmNba10pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtYl95ICsgMSA8IG1iX2hlaWdodCAmJiBmaXhlZFttYl94eSArIG1iX3N0cmlkZV0gPiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAxNjsgaysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlICs9IEZGQUJTKHNyY1trICsgbGluZXNpemVbMF0gKiAxNV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1trICsgbGluZXNpemVbMF0gKiAxNl0pOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPm12WzBdWzBdWzBdICE9IHByZXZfeCB8fCBzLT5tdlswXVswXVsxXSAhPSBwcmV2X3kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkW21iX3h5XSA9IE1WX0NIQU5HRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkKys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRbbWJfeHldID0gTVZfVU5DSEFOR0VEOworICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPD0gYmVzdF9zY29yZSkgeyAvLyA8PSB3aWxsIGZhdm9yIHRoZSBsYXN0IE1WCisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3ByZWQgID0gajsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzY29yZV9zdW0gKz0gYmVzdF9zY29yZTsKKyAgICAgICAgICAgICAgICBzLT5tdlswXVswXVswXSA9IG12X3ByZWRpY3RvcltiZXN0X3ByZWRdWzBdOworICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gbXZfcHJlZGljdG9yW2Jlc3RfcHJlZF1bMV07CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbW90X3N0ZXA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1vdF9zdGVwOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMubW90aW9uX3ZhbFswXVttb3RfaW5kZXggKyBpICsgaiAqIG1vdF9zdHJpZGVdWzBdID0gcy0+bXZbMF1bMF1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bbW90X2luZGV4ICsgaSArIGogKiBtb3Rfc3RyaWRlXVsxXSA9IHMtPm12WzBdWzBdWzFdOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzLT5kZWNvZGVfbWIocy0+b3BhcXVlLCByZWZbYmVzdF9wcmVkXSwgTVZfRElSX0ZPUldBUkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1WX1RZUEVfMTZYMTYsICZzLT5tdiwgbWJfeCwgbWJfeSwgMCwgMCk7CisKKworICAgICAgICAgICAgICAgIGlmIChzLT5tdlswXVswXVswXSAhPSBwcmV2X3ggfHwgcy0+bXZbMF1bMF1bMV0gIT0gcHJldl95KSB7CisgICAgICAgICAgICAgICAgICAgIGZpeGVkW21iX3h5XSA9IE1WX0NIQU5HRUQ7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZml4ZWRbbWJfeHldID0gTVZfVU5DSEFOR0VEOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKG5vbmVfbGVmdCkKICAgICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWJfd2lkdGggKiBtYl9oZWlnaHQ7IGkrKykgewotICAgICAgICAgICAgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07Ci0gICAgICAgICAgICBpZiAoZml4ZWRbbWJfeHldKQorICAgICAgICBuZXh0X2Jsb2NrbGlzdF9sZW5ndGggPSAwOworCisgICAgICAgIGZvciAoYmxvY2tsaXN0X2luZGV4ID0gMDsgYmxvY2tsaXN0X2luZGV4IDwgYmxvY2tsaXN0X2xlbmd0aDsgYmxvY2tsaXN0X2luZGV4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBtYl94ID0gYmxvY2tsaXN0W2Jsb2NrbGlzdF9pbmRleF1bMF07CisgICAgICAgICAgICBjb25zdCBpbnQgbWJfeSA9IGJsb2NrbGlzdFtibG9ja2xpc3RfaW5kZXhdWzFdOworICAgICAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gbWJfeCArIG1iX3kgKiBtYl9zdHJpZGU7CisKKyAgICAgICAgICAgIGlmIChmaXhlZFttYl94eV0gJiAoTVZfQ0hBTkdFRHxNVl9VTkNIQU5HRUR8TVZfRlJPWkVOKSkgewogICAgICAgICAgICAgICAgIGZpeGVkW21iX3h5XSA9IE1WX0ZST1pFTjsKKyAgICAgICAgICAgICAgICBpZiAobWJfeCA+IDApCisgICAgICAgICAgICAgICAgICAgIGFkZF9ibG9ja2xpc3QobmV4dF9ibG9ja2xpc3QsICZuZXh0X2Jsb2NrbGlzdF9sZW5ndGgsIGZpeGVkLCBtYl94IC0gMSwgbWJfeSwgbWJfeHkgLSAxKTsKKyAgICAgICAgICAgICAgICBpZiAobWJfeSA+IDApCisgICAgICAgICAgICAgICAgICAgIGFkZF9ibG9ja2xpc3QobmV4dF9ibG9ja2xpc3QsICZuZXh0X2Jsb2NrbGlzdF9sZW5ndGgsIGZpeGVkLCBtYl94LCBtYl95IC0gMSwgbWJfeHkgLSBtYl9zdHJpZGUpOworICAgICAgICAgICAgICAgIGlmIChtYl94ICsgMSA8IG1iX3dpZHRoKQorICAgICAgICAgICAgICAgICAgICBhZGRfYmxvY2tsaXN0KG5leHRfYmxvY2tsaXN0LCAmbmV4dF9ibG9ja2xpc3RfbGVuZ3RoLCBmaXhlZCwgbWJfeCArIDEsIG1iX3ksIG1iX3h5ICsgMSk7CisgICAgICAgICAgICAgICAgaWYgKG1iX3kgKyAxIDwgbWJfaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICBhZGRfYmxvY2tsaXN0KG5leHRfYmxvY2tsaXN0LCAmbmV4dF9ibG9ja2xpc3RfbGVuZ3RoLCBmaXhlZCwgbWJfeCwgbWJfeSArIDEsIG1iX3h5ICsgbWJfc3RyaWRlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQwKG5leHRfYmxvY2tsaXN0X2xlbmd0aCA8PSBtYl9oZWlnaHQgKiBtYl93aWR0aCk7CisgICAgICAgIEZGU1dBUChpbnQgLCBibG9ja2xpc3RfbGVuZ3RoLCBuZXh0X2Jsb2NrbGlzdF9sZW5ndGgpOworICAgICAgICBGRlNXQVAodm9pZCosIGJsb2NrbGlzdCwgbmV4dF9ibG9ja2xpc3QpOwogICAgIH0KIH0KIApAQCAtNzc1LDE2ICs4MDYsMTMgQEAKIAogICAgIG1lbXNldChzLT5lcnJvcl9zdGF0dXNfdGFibGUsIEVSX01CX0VSUk9SIHwgVlBfU1RBUlQgfCBFUl9NQl9FTkQsCiAgICAgICAgICAgIHMtPm1iX3N0cmlkZSAqIHMtPm1iX2hlaWdodCAqIHNpemVvZih1aW50OF90KSk7Ci0gICAgcy0+ZXJyb3JfY291bnQgICAgPSAzICogcy0+bWJfbnVtOworICAgIGF0b21pY19pbml0KCZzLT5lcnJvcl9jb3VudCwgMyAqIHMtPm1iX251bSk7CiAgICAgcy0+ZXJyb3Jfb2NjdXJyZWQgPSAwOwogfQogCiBzdGF0aWMgaW50IGVyX3N1cHBvcnRlZChFUkNvbnRleHQgKnMpCiB7CiAgICAgaWYocy0+YXZjdHgtPmh3YWNjZWwgJiYgcy0+YXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZSAgICAgICAgICAgfHwKLSNpZiBGRl9BUElfQ0FQX1ZEUEFVCi0gICAgICAgcy0+YXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMmQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUgICAgICAgICAgfHwKLSNlbmRpZgogICAgICAgICFzLT5jdXJfcGljLmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgcy0+Y3VyX3BpYy5maWVsZF9waWN0dXJlCiAgICAgKQpAQCAtODIzLDIwICs4NTEsMjAgQEAKICAgICBtYXNrICY9IH5WUF9TVEFSVDsKICAgICBpZiAoc3RhdHVzICYgKEVSX0FDX0VSUk9SIHwgRVJfQUNfRU5EKSkgewogICAgICAgICBtYXNrICAgICAgICAgICAmPSB+KEVSX0FDX0VSUk9SIHwgRVJfQUNfRU5EKTsKLSAgICAgICAgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCgmcy0+ZXJyb3JfY291bnQsIHN0YXJ0X2kgLSBlbmRfaSAtIDEpOworICAgICAgICBhdG9taWNfZmV0Y2hfYWRkKCZzLT5lcnJvcl9jb3VudCwgc3RhcnRfaSAtIGVuZF9pIC0gMSk7CiAgICAgfQogICAgIGlmIChzdGF0dXMgJiAoRVJfRENfRVJST1IgfCBFUl9EQ19FTkQpKSB7CiAgICAgICAgIG1hc2sgICAgICAgICAgICY9IH4oRVJfRENfRVJST1IgfCBFUl9EQ19FTkQpOwotICAgICAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZzLT5lcnJvcl9jb3VudCwgc3RhcnRfaSAtIGVuZF9pIC0gMSk7CisgICAgICAgIGF0b21pY19mZXRjaF9hZGQoJnMtPmVycm9yX2NvdW50LCBzdGFydF9pIC0gZW5kX2kgLSAxKTsKICAgICB9CiAgICAgaWYgKHN0YXR1cyAmIChFUl9NVl9FUlJPUiB8IEVSX01WX0VORCkpIHsKICAgICAgICAgbWFzayAgICAgICAgICAgJj0gfihFUl9NVl9FUlJPUiB8IEVSX01WX0VORCk7Ci0gICAgICAgIGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJnMtPmVycm9yX2NvdW50LCBzdGFydF9pIC0gZW5kX2kgLSAxKTsKKyAgICAgICAgYXRvbWljX2ZldGNoX2FkZCgmcy0+ZXJyb3JfY291bnQsIHN0YXJ0X2kgLSBlbmRfaSAtIDEpOwogICAgIH0KIAogICAgIGlmIChzdGF0dXMgJiBFUl9NQl9FUlJPUikgewogICAgICAgICBzLT5lcnJvcl9vY2N1cnJlZCA9IDE7Ci0gICAgICAgIGF2cHJpdl9hdG9taWNfaW50X3NldCgmcy0+ZXJyb3JfY291bnQsIElOVF9NQVgpOworICAgICAgICBhdG9taWNfc3RvcmUoJnMtPmVycm9yX2NvdW50LCBJTlRfTUFYKTsKICAgICB9CiAKICAgICBpZiAobWFzayA9PSB+MHg3RikgewpAQCAtODQ5LDcgKzg3Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKGVuZF9pID09IHMtPm1iX251bSkKLSAgICAgICAgYXZwcml2X2F0b21pY19pbnRfc2V0KCZzLT5lcnJvcl9jb3VudCwgSU5UX01BWCk7CisgICAgICAgIGF0b21pY19zdG9yZSgmcy0+ZXJyb3JfY291bnQsIElOVF9NQVgpOwogICAgIGVsc2UgewogICAgICAgICBzLT5lcnJvcl9zdGF0dXNfdGFibGVbZW5kX3h5XSAmPSBtYXNrOwogICAgICAgICBzLT5lcnJvcl9zdGF0dXNfdGFibGVbZW5kX3h5XSB8PSBzdGF0dXM7CkBAIC04NjQsNyArODkyLDcgQEAKICAgICAgICAgcHJldl9zdGF0dXMgJj0gfiBWUF9TVEFSVDsKICAgICAgICAgaWYgKHByZXZfc3RhdHVzICE9IChFUl9NVl9FTkQgfCBFUl9EQ19FTkQgfCBFUl9BQ19FTkQpKSB7CiAgICAgICAgICAgICBzLT5lcnJvcl9vY2N1cnJlZCA9IDE7Ci0gICAgICAgICAgICBhdnByaXZfYXRvbWljX2ludF9zZXQoJnMtPmVycm9yX2NvdW50LCBJTlRfTUFYKTsKKyAgICAgICAgICAgIGF0b21pY19zdG9yZSgmcy0+ZXJyb3JfY291bnQsIElOVF9NQVgpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtODgxLDEwICs5MDksMTAgQEAKIAogICAgIC8qIFdlIGRvIG5vdCBzdXBwb3J0IEVSIG9mIGZpZWxkIHBpY3R1cmVzIHlldCwKICAgICAgKiB0aG91Z2ggaXQgc2hvdWxkIG5vdCBjcmFzaCBpZiBlbmFibGVkLiAqLwotICAgIGlmICghcy0+YXZjdHgtPmVycm9yX2NvbmNlYWxtZW50IHx8IHMtPmVycm9yX2NvdW50ID09IDAgICAgICAgICAgICB8fAorICAgIGlmICghcy0+YXZjdHgtPmVycm9yX2NvbmNlYWxtZW50IHx8ICFhdG9taWNfbG9hZCgmcy0+ZXJyb3JfY291bnQpICB8fAogICAgICAgICBzLT5hdmN0eC0+bG93cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAhZXJfc3VwcG9ydGVkKHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICBzLT5lcnJvcl9jb3VudCA9PSAzICogcy0+bWJfd2lkdGggKgorICAgICAgICBhdG9taWNfbG9hZCgmcy0+ZXJyb3JfY291bnQpID09IDMgKiBzLT5tYl93aWR0aCAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5hdmN0eC0+c2tpcF90b3AgKyBzLT5hdmN0eC0+c2tpcF9ib3R0b20pKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04OTcsOCArOTI1LDggQEAKIAogICAgIGlmICggICBtYl94ID09IHMtPm1iX3dpZHRoCiAgICAgICAgICYmIHMtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPCi0gICAgICAgICYmIChzLT5hdmN0eC0+aGVpZ2h0JjE2KQotICAgICAgICAmJiBzLT5lcnJvcl9jb3VudCA9PSAzICogcy0+bWJfd2lkdGggKiAocy0+YXZjdHgtPnNraXBfdG9wICsgcy0+YXZjdHgtPnNraXBfYm90dG9tICsgMSkKKyAgICAgICAgJiYgKEZGQUxJR04ocy0+YXZjdHgtPmhlaWdodCwgMTYpJjE2KQorICAgICAgICAmJiBhdG9taWNfbG9hZCgmcy0+ZXJyb3JfY291bnQpID09IDMgKiBzLT5tYl93aWR0aCAqIChzLT5hdmN0eC0+c2tpcF90b3AgKyBzLT5hdmN0eC0+c2tpcF9ib3R0b20gKyAxKQogICAgICkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImlnbm9yaW5nIGxhc3QgbWlzc2luZyBzbGljZVxuIik7CiAgICAgICAgIHJldHVybjsKQEAgLTExNDksNyArMTE3Nyw3IEBACiAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBzLT5jdXJfcGljLm1vdGlvbl92YWxbZGlyXVttYl94ICogMiArIG1iX3kgKiAyICogcy0+Yjhfc3RyaWRlXVsxXTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcy0+ZGVjb2RlX21iKHMtPm9wYXF1ZSwgMCAvKiBGSVhNRSBoMjY0IHBhcnRpdGlvbmVkIHNsaWNlcyBuZWVkIHRoaXMgc2V0ICovLAorICAgICAgICAgICAgcy0+ZGVjb2RlX21iKHMtPm9wYXF1ZSwgMCAvKiBGSVhNRSBILjI2NCBwYXJ0aXRpb25lZCBzbGljZXMgbmVlZCB0aGlzIHNldCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICBtdl9kaXIsIG12X3R5cGUsICZzLT5tdiwgbWJfeCwgbWJfeSwgMCwgMCk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Vycm9yX3Jlc2lsaWVuY2UuaCBiL2xpYmF2Y29kZWMvZXJyb3JfcmVzaWxpZW5jZS5oCmluZGV4IDFmNTJmMjAuLjY2NGE3NjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZXJyb3JfcmVzaWxpZW5jZS5oCisrKyBiL2xpYmF2Y29kZWMvZXJyb3JfcmVzaWxpZW5jZS5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjEsNiArMjAsNyBAQAogI2RlZmluZSBBVkNPREVDX0VSUk9SX1JFU0lMSUVOQ0VfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAibWVfY21wLmgiCkBAIC00Miw3ICs0Miw3IEBACiAgICAgQVZGcmFtZSAqZjsKICAgICBUaHJlYWRGcmFtZSAqdGY7CiAKLSAgICAvLyBpdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBhbGxvY2F0ZSB0aGVzZSBidWZmZXJzCisgICAgLy8gaXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGFsbG9jYXRlIHRoZXNlIGJ1ZmZlcnMKICAgICBpbnQxNl90ICgqbW90aW9uX3ZhbFsyXSlbMl07CiAgICAgaW50OF90ICpyZWZfaW5kZXhbMl07CiAKQEAgLTU4LDEwICs1OCwxMCBAQAogICAgIGludCAqbWJfaW5kZXgyeHk7CiAgICAgaW50IG1iX251bTsKICAgICBpbnQgbWJfd2lkdGgsIG1iX2hlaWdodDsKLSAgICBpbnQgbWJfc3RyaWRlOwotICAgIGludCBiOF9zdHJpZGU7CisgICAgcHRyZGlmZl90IG1iX3N0cmlkZTsKKyAgICBwdHJkaWZmX3QgYjhfc3RyaWRlOwogCi0gICAgdm9sYXRpbGUgaW50IGVycm9yX2NvdW50OworICAgIGF0b21pY19pbnQgZXJyb3JfY291bnQ7CiAgICAgaW50IGVycm9yX29jY3VycmVkOwogICAgIHVpbnQ4X3QgKmVycm9yX3N0YXR1c190YWJsZTsKICAgICB1aW50OF90ICplcl90ZW1wX2J1ZmZlcjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZXNjYXBlMTI0LmMgYi9saWJhdmNvZGVjL2VzY2FwZTEyNC5jCmluZGV4IDUwYTg2YzguLmNmZmQzZTEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZXNjYXBlMTI0LmMKKysrIGIvbGliYXZjb2RlYy9lc2NhcGUxMjQuYwpAQCAtMTksMTEgKzE5LDEwIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCiAjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiB0eXBlZGVmIHVuaW9uIE1hY3JvQmxvY2sgewogICAgIHVpbnQxNl90IHBpeGVsc1s0XTsKQEAgLTE0NSw3ICsxNDQsNyBAQAogICAgIHVuc2lnbmVkIGJsb2NrX2luZGV4LCBkZXB0aDsKICAgICBpbnQgdmFsdWUgPSBnZXRfYml0czEoZ2IpOwogICAgIGlmICh2YWx1ZSkgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0cmFuc2l0aW9uc1szXVsyXSA9IHsgezIsIDF9LCB7MCwgMn0sIHsxLCAwfSB9OworICAgICAgICBzdGF0aWMgY29uc3QgaW50OF90IHRyYW5zaXRpb25zWzNdWzJdID0geyB7MiwgMX0sIHswLCAyfSwgezEsIDB9IH07CiAgICAgICAgIHZhbHVlID0gZ2V0X2JpdHMxKGdiKTsKICAgICAgICAgKmNvZGVib29rX2luZGV4ID0gdHJhbnNpdGlvbnNbKmNvZGVib29rX2luZGV4XVt2YWx1ZV07CiAgICAgfQpAQCAtMjIyLDcgKzIyMSwxMSBAQAogCiAgICAgLy8gVGhpcyBjYWxsIGFsc28gZ3VhcmRzIHRoZSBwb3RlbnRpYWwgZGVwdGggcmVhZHMgZm9yIHRoZQogICAgIC8vIGNvZGVib29rIHVucGFja2luZy4KLSAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpIDwgNjQpCisgICAgLy8gQ2hlY2sgaWYgdGhlIGFtb3VudCB3ZSB3aWxsIHJlYWQgbWluaW1hbGx5IGlzIGF2YWlsYWJsZSBvbiBpbnB1dC4KKyAgICAvLyBUaGUgNjQgcmVwcmVzZW50IHRoZSBpbW1lZGlhdGVseSBuZXh0IDIgZnJhbWVfKiBlbGVtZW50cyByZWFkLCB0aGUgMjMvNDMyMAorICAgIC8vIHJlcHJlc2VudCBhIGxvd2VyIGJvdW5kIG9mIHRoZSBzcGFjZSBuZWVkZWQgZm9yIHNraXBwZWQgc3VwZXJibG9ja3MuIE5vbgorICAgIC8vIHNraXBwZWQgU0JzIG5lZWQgbW9yZSBzcGFjZS4KKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpIDwgNjQgKyBzLT5udW1fc3VwZXJibG9ja3MgKiAyM0xMIC8gNDMyMCkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgZnJhbWVfZmxhZ3MgPSBnZXRfYml0c19sb25nKCZnYiwgMzIpOwpAQCAtMjUwLDYgKzI1MywxMCBAQAogICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZWJvb2sgY2FuIGJlIGN1dCBvZmYgYXQgcGxhY2VzIG90aGVyIHRoYW4KICAgICAgICAgICAgICAgICAvLyBwb3dlcnMgb2YgMiwgbGVhdmluZyBzb21lIG9mIHRoZSBlbnRyaWVzIHVuZGVmaW5lZC4KICAgICAgICAgICAgICAgICBjYl9zaXplID0gZ2V0X2JpdHNfbG9uZygmZ2IsIDIwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNiX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvZGVib29rIHNpemUgMC5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2JfZGVwdGggPSBhdl9sb2cyKGNiX3NpemUgLSAxKSArIDE7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNiX2RlcHRoID0gZ2V0X2JpdHMoJmdiLCA0KTsKQEAgLTI2NCw2ICsyNzEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZSA9IHMtPm51bV9zdXBlcmJsb2NrcyA8PCBjYl9kZXB0aDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bnVtX3N1cGVyYmxvY2tzID49IElOVF9NQVggPj4gY2JfZGVwdGgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlcHRoIG9yIG51bV9zdXBlcmJsb2NrcyBhcmUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmNvZGVib29rc1tpXS5ibG9ja3MpOwogICAgICAgICAgICAgcy0+Y29kZWJvb2tzW2ldID0gdW5wYWNrX2NvZGVib29rKCZnYiwgY2JfZGVwdGgsIGNiX3NpemUpOwogICAgICAgICAgICAgaWYgKCFzLT5jb2RlYm9va3NbaV0uYmxvY2tzKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9lc2NhcGUxMzAuYyBiL2xpYmF2Y29kZWMvZXNjYXBlMTMwLmMKaW5kZXggZjRmNjRkOC4uMWRkN2VlZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9lc2NhcGUxMzAuYworKysgYi9saWJhdmNvZGVjL2VzY2FwZTEzMC5jCkBAIC0yMSw4ICsyMSw5IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKLSNpbmNsdWRlICJhdmNvZGVjLmgiCisKICNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZXhpZi5jIGIvbGliYXZjb2RlYy9leGlmLmMKaW5kZXggZmEzMGYwNS4uMjg3NDc3MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9leGlmLmMKKysrIGIvbGliYXZjb2RlYy9leGlmLmMKQEAgLTQxLDE0ICs0MSwxNCBAQAogfQogCiAKLXN0YXRpYyBpbnQgZXhpZl9hZGRfbWV0YWRhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgY291bnQsIGludCB0eXBlLAorc3RhdGljIGludCBleGlmX2FkZF9tZXRhZGF0YSh2b2lkICpsb2djdHgsIGludCBjb3VudCwgaW50IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnNlcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiLCBpbnQgbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKQogewogICAgIHN3aXRjaCh0eXBlKSB7CiAgICAgY2FzZSAwOgotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICJJbnZhbGlkIFRJRkYgdGFnIHR5cGUgMCBmb3VuZCBmb3IgJXMgd2l0aCBzaXplICVkXG4iLAogICAgICAgICAgICAgICAgbmFtZSwgY291bnQpOwogICAgICAgICByZXR1cm4gMDsKQEAgLTY0LDEzICs2NCwxMyBAQAogICAgIGNhc2UgVElGRl9TTE9ORyAgICA6CiAgICAgY2FzZSBUSUZGX0xPTkcgICAgIDogcmV0dXJuIGZmX3RhZGRfbG9uZ19tZXRhZGF0YShjb3VudCwgbmFtZSwgc2VwLCBnYiwgbGUsIG1ldGFkYXRhKTsKICAgICBkZWZhdWx0OgotICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJUSUZGIHRhZyB0eXBlICgldSkiLCB0eXBlKTsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGxvZ2N0eCwgIlRJRkYgdGFnIHR5cGUgKCV1KSIsIHR5cGUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9OwogfQogCiAKLXN0YXRpYyBpbnQgZXhpZl9kZWNvZGVfdGFnKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgR2V0Qnl0ZUNvbnRleHQgKmdieXRlcywgaW50IGxlLAorc3RhdGljIGludCBleGlmX2RlY29kZV90YWcodm9pZCAqbG9nY3R4LCBHZXRCeXRlQ29udGV4dCAqZ2J5dGVzLCBpbnQgbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKQogewogICAgIGludCByZXQsIGN1cl9wb3M7CkBAIC05Miw3ICs5Miw3IEBACiAgICAgLy8gc3RvcmUgbWV0YWRhdGEgb3IgcHJvY2VlZCB3aXRoIG5leHQgSUZECiAgICAgcmV0ID0gZmZfdGlzX2lmZChpZCk7CiAgICAgaWYgKHJldCkgewotICAgICAgICByZXQgPSBhdnByaXZfZXhpZl9kZWNvZGVfaWZkKGF2Y3R4LCBnYnl0ZXMsIGxlLCBkZXB0aCArIDEsIG1ldGFkYXRhKTsKKyAgICAgICAgcmV0ID0gZmZfZXhpZl9kZWNvZGVfaWZkKGxvZ2N0eCwgZ2J5dGVzLCBsZSwgZGVwdGggKyAxLCBtZXRhZGF0YSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGV4aWZfZ2V0X3RhZ19uYW1lKGlkKTsKICAgICAgICAgY2hhciAqdXNlX25hbWUgICA9IChjaGFyKikgbmFtZTsKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAgICAgc25wcmludGYodXNlX25hbWUsIDcsICIweCUwNFgiLCBpZCk7CiAgICAgICAgIH0KIAotICAgICAgICByZXQgPSBleGlmX2FkZF9tZXRhZGF0YShhdmN0eCwgY291bnQsIHR5cGUsIHVzZV9uYW1lLCBOVUxMLAorICAgICAgICByZXQgPSBleGlmX2FkZF9tZXRhZGF0YShsb2djdHgsIGNvdW50LCB0eXBlLCB1c2VfbmFtZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2J5dGVzLCBsZSwgbWV0YWRhdGEpOwogCiAgICAgICAgIGlmICghbmFtZSkgewpAQCAtMTE5LDggKzExOSw4IEBACiB9CiAKIAotaW50IGF2cHJpdl9leGlmX2RlY29kZV9pZmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCeXRlQ29udGV4dCAqZ2J5dGVzLCBpbnQgbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKQoraW50IGZmX2V4aWZfZGVjb2RlX2lmZCh2b2lkICpsb2djdHgsIEdldEJ5dGVDb250ZXh0ICpnYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBsZSwgaW50IGRlcHRoLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSkKIHsKICAgICBpbnQgaSwgcmV0OwogICAgIGludCBlbnRyaWVzOwpAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgewotICAgICAgICBpZiAoKHJldCA9IGV4aWZfZGVjb2RlX3RhZyhhdmN0eCwgZ2J5dGVzLCBsZSwgZGVwdGgsIG1ldGFkYXRhKSkgPCAwKSB7CisgICAgICAgIGlmICgocmV0ID0gZXhpZl9kZWNvZGVfdGFnKGxvZ2N0eCwgZ2J5dGVzLCBsZSwgZGVwdGgsIG1ldGFkYXRhKSkgPCAwKSB7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfQpAQCAtMTQwLDMgKzE0MCwxMyBAQAogICAgIC8vIHJldHVybiBuZXh0IElERiBvZmZzZXQgb3IgMHgwMDAwMDAwMDAgb3IgYSB2YWx1ZSA8IDAgZm9yIGZhaWx1cmUKICAgICByZXR1cm4gZmZfdGdldF9sb25nKGdieXRlcywgbGUpOwogfQorCitpbnQgYXZwcml2X2V4aWZfZGVjb2RlX2lmZCh2b2lkICpsb2djdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGUsIGludCBkZXB0aCwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBzaXplKTsKKworICAgIHJldHVybiBmZl9leGlmX2RlY29kZV9pZmQobG9nY3R4LCAmZ2IsIGxlLCBkZXB0aCwgbWV0YWRhdGEpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9leGlmLmggYi9saWJhdmNvZGVjL2V4aWYuaAppbmRleCAyZjUwOWJhLi4wNWFmNzU2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2V4aWYuaAorKysgYi9saWJhdmNvZGVjL2V4aWYuaApAQCAtMTY0LDcgKzE2NCwxMCBAQAogCiAvKiogUmVjdXJzaXZlbHkgZGVjb2RlcyBhbGwgSUZEJ3MgYW5kCiAgKiAgYWRkcyBpbmNsdWRlZCBUQUdTIGludG8gdGhlIG1ldGFkYXRhIGRpY3Rpb25hcnkuICovCi1pbnQgYXZwcml2X2V4aWZfZGVjb2RlX2lmZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJ5dGVDb250ZXh0ICpnYnl0ZXMsIGludCBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXB0aCwgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEpOworaW50IGF2cHJpdl9leGlmX2RlY29kZV9pZmQodm9pZCAqbG9nY3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlLCBpbnQgZGVwdGgsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKTsKKworaW50IGZmX2V4aWZfZGVjb2RlX2lmZCh2b2lkICpsb2djdHgsIEdldEJ5dGVDb250ZXh0ICpnYnl0ZXMsIGludCBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSk7CiAKICNlbmRpZiAvKiBBVkNPREVDX0VYSUZfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9leHIuYyBiL2xpYmF2Y29kZWMvZXhyLmMKaW5kZXggOWVjOTlkNi4uMGY4YjBmZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9leHIuYworKysgYi9saWJhdmNvZGVjL2V4ci5jCkBAIC0xLDcgKzEsMTAgQEAKIC8qCiAgKiBPcGVuRVhSICguZXhyKSBpbWFnZSBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgSW5kdXN0cmlhbCBMaWdodCAmIE1hZ2ljLCBhIGRpdmlzaW9uIG9mIEx1Y2FzIERpZ2l0YWwgTHRkLiBMTEMKICAqIENvcHlyaWdodCAoYykgMjAwOSBKaW1teSBDaHJpc3RlbnNlbgogICoKKyAqIEI0NC9CNDRBLCBUaWxlLCBVSU5UMzIgYWRkZWQgYnkgSm9reW8gSW1hZ2VzIHN1cHBvcnQgYnkgQ05DIC0gRnJlbmNoIE5hdGlvbmFsIENlbnRlciBmb3IgQ2luZW1hCisgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKICAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTM0LDYgKzM3LDggQEAKICNpbmNsdWRlIDxmbG9hdC5oPgogI2luY2x1ZGUgPHpsaWIuaD4KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCkBAIC00MSw2ICs0NiwxMiBAQAogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKworI2lmIEhBVkVfQklHRU5ESUFOCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiZXhyZHNwLmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKQEAgLTU1LDYgKzY2LDggQEAKICAgICBFWFJfUFhSMjQsCiAgICAgRVhSX0I0NCwKICAgICBFWFJfQjQ0QSwKKyAgICBFWFJfRFdBLAorICAgIEVYUl9EV0IsCiAgICAgRVhSX1VOS04sCiB9OwogCkBAIC02NSwxMSArNzgsMzEgQEAKICAgICBFWFJfVU5LTk9XTiwKIH07CiAKK2VudW0gRXhyVGlsZUxldmVsTW9kZSB7CisgICAgRVhSX1RJTEVfTEVWRUxfT05FLAorICAgIEVYUl9USUxFX0xFVkVMX01JUE1BUCwKKyAgICBFWFJfVElMRV9MRVZFTF9SSVBNQVAsCisgICAgRVhSX1RJTEVfTEVWRUxfVU5LTk9XTiwKK307CisKK2VudW0gRXhyVGlsZUxldmVsUm91bmQgeworICAgIEVYUl9USUxFX1JPVU5EX1VQLAorICAgIEVYUl9USUxFX1JPVU5EX0RPV04sCisgICAgRVhSX1RJTEVfUk9VTkRfVU5LTk9XTiwKK307CisKIHR5cGVkZWYgc3RydWN0IEVYUkNoYW5uZWwgewogICAgIGludCB4c3ViLCB5c3ViOwogICAgIGVudW0gRXhyUGl4ZWxUeXBlIHBpeGVsX3R5cGU7CiB9IEVYUkNoYW5uZWw7CiAKK3R5cGVkZWYgc3RydWN0IEVYUlRpbGVBdHRyaWJ1dGUgeworICAgIGludDMyX3QgeFNpemU7CisgICAgaW50MzJfdCB5U2l6ZTsKKyAgICBlbnVtIEV4clRpbGVMZXZlbE1vZGUgbGV2ZWxfbW9kZTsKKyAgICBlbnVtIEV4clRpbGVMZXZlbFJvdW5kIGxldmVsX3JvdW5kOworfSBFWFJUaWxlQXR0cmlidXRlOworCiB0eXBlZGVmIHN0cnVjdCBFWFJUaHJlYWREYXRhIHsKICAgICB1aW50OF90ICp1bmNvbXByZXNzZWRfZGF0YTsKICAgICBpbnQgdW5jb21wcmVzc2VkX3NpemU7CkBAIC03OSwxMiArMTEyLDIxIEBACiAKICAgICB1aW50OF90ICpiaXRtYXA7CiAgICAgdWludDE2X3QgKmx1dDsKKworICAgIGludCB5c2l6ZSwgeHNpemU7CisKKyAgICBpbnQgY2hhbm5lbF9saW5lX3NpemU7CiB9IEVYUlRocmVhZERhdGE7CiAKIHR5cGVkZWYgc3RydWN0IEVYUkNvbnRleHQgewogICAgIEFWQ2xhc3MgKmNsYXNzOwogICAgIEFWRnJhbWUgKnBpY3R1cmU7CiAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEV4ckRTUENvbnRleHQgZHNwOworCisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICBCc3dhcERTUENvbnRleHQgYmJkc3A7CisjZW5kaWYKIAogICAgIGVudW0gRXhyQ29tcHIgY29tcHJlc3Npb247CiAgICAgZW51bSBFeHJQaXhlbFR5cGUgcGl4ZWxfdHlwZTsKQEAgLTk1LDE3ICsxMzcsMjEgQEAKICAgICB1aW50MzJfdCB4bWF4LCB4bWluOwogICAgIHVpbnQzMl90IHltYXgsIHltaW47CiAgICAgdWludDMyX3QgeGRlbHRhLCB5ZGVsdGE7Ci0gICAgaW50IHlzaXplOwogCi0gICAgdWludDY0X3Qgc2Nhbl9saW5lX3NpemU7CiAgICAgaW50IHNjYW5fbGluZXNfcGVyX2Jsb2NrOwogCisgICAgRVhSVGlsZUF0dHJpYnV0ZSB0aWxlX2F0dHI7IC8qIGhlYWRlciBkYXRhIGF0dHJpYnV0ZSBvZiB0aWxlICovCisgICAgaW50IGlzX3RpbGU7IC8qIDAgaWYgc2NhbmxpbmUsIDEgaWYgdGlsZSAqLworCisgICAgaW50IGlzX2x1bWE7LyogMSBpZiB0aGVyZSBpcyBhbiBZIHBsYW5lICovCisKICAgICBHZXRCeXRlQ29udGV4dCBnYjsKICAgICBjb25zdCB1aW50OF90ICpidWY7CiAgICAgaW50IGJ1Zl9zaXplOwogCiAgICAgRVhSQ2hhbm5lbCAqY2hhbm5lbHM7CiAgICAgaW50IG5iX2NoYW5uZWxzOworICAgIGludCBjdXJyZW50X2NoYW5uZWxfb2Zmc2V0OwogCiAgICAgRVhSVGhyZWFkRGF0YSAqdGhyZWFkX2RhdGE7CiAKQEAgLTE2MSwxMyArMjA3LDEzIEBACiAgICAgICAgICAgICAgICAgbWFudGlzc2EgPDw9IDE7CiAgICAgICAgICAgICAgICAgZXhwIC09ICgxIDw8IDIzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNsYW1wIHRoZSBtYW50aXNzYSB0byAxMC1iaXRzCisgICAgICAgICAgICAvLyBjbGFtcCB0aGUgbWFudGlzc2EgdG8gMTAgYml0cwogICAgICAgICAgICAgbWFudGlzc2EgJj0gKCgxIDw8IDEwKSAtIDEpOwotICAgICAgICAgICAgLy8gc2hpZnQgbGVmdCB0byBnZW5lcmF0ZSBzaW5nbGUtcHJlY2lzaW9uIG1hbnRpc3NhIG9mIDIzLWJpdHMKKyAgICAgICAgICAgIC8vIHNoaWZ0IGxlZnQgdG8gZ2VuZXJhdGUgc2luZ2xlLXByZWNpc2lvbiBtYW50aXNzYSBvZiAyMyBiaXRzCiAgICAgICAgICAgICBtYW50aXNzYSA8PD0gMTM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICAvLyBzaGlmdCBsZWZ0IHRvIGdlbmVyYXRlIHNpbmdsZS1wcmVjaXNpb24gbWFudGlzc2Egb2YgMjMtYml0cworICAgICAgICAvLyBzaGlmdCBsZWZ0IHRvIGdlbmVyYXRlIHNpbmdsZS1wcmVjaXNpb24gbWFudGlzc2Egb2YgMjMgYml0cwogICAgICAgICBtYW50aXNzYSA8PD0gMTM7CiAgICAgICAgIC8vIGdlbmVyYXRlIHNpbmdsZSBwcmVjaXNpb24gYmlhc2VkIGV4cG9uZW50IHZhbHVlCiAgICAgICAgIGV4cCA9IChleHAgPDwgMTMpICsgSEFMRl9GTE9BVF9NSU5fQklBU0VEX0VYUF9BU19TSU5HTEVfRlBfRVhQOwpAQCAtMTg2LDkgKzIzMiw5IEBACiAgKgogICogQHJldHVybiBub3JtYWxpemVkIDE2LWJpdCB1bnNpZ25lZCBpbnQKICAqLwotc3RhdGljIGlubGluZSB1aW50MTZfdCBleHJfZmx0MnVpbnQodWludDMyX3QgdikKK3N0YXRpYyBpbmxpbmUgdWludDE2X3QgZXhyX2ZsdDJ1aW50KGludDMyX3QgdikKIHsKLSAgICB1bnNpZ25lZCBpbnQgZXhwID0gdiA+PiAyMzsKKyAgICBpbnQzMl90IGV4cCA9IHYgPj4gMjM7CiAgICAgLy8gIkhBQ0siOiBuZWdhdGl2ZSB2YWx1ZXMgcmVzdWx0IGluIGV4cDwgIDAsIHNvIGNsaXBwaW5nIHRoZW0gdG8gMAogICAgIC8vIGlzIGFsc28gaGFuZGxlZCBieSB0aGlzIGNvbmRpdGlvbiwgYXZvaWRzIGV4cGxpY2l0IGNoZWNrIGZvciBzaWduIGJpdC4KICAgICBpZiAoZXhwIDw9IDEyNyArIDcgLSAyNCkgLy8gd2Ugd291bGQgc2hpZnQgb3V0IGFsbCBiaXRzIGFueXdheQpAQCAtMjE5LDM5ICsyNjUsNyBAQAogICAgIHJldHVybiAodiArICgxIDw8IDE2KSkgPj4gKGV4cCArIDEpOwogfQogCi1zdGF0aWMgdm9pZCBwcmVkaWN0b3IodWludDhfdCAqc3JjLCBpbnQgc2l6ZSkKLXsKLSAgICB1aW50OF90ICp0ICAgID0gc3JjICsgMTsKLSAgICB1aW50OF90ICpzdG9wID0gc3JjICsgc2l6ZTsKLQotICAgIHdoaWxlICh0IDwgc3RvcCkgewotICAgICAgICBpbnQgZCA9IChpbnQpIHRbLTFdICsgKGludCkgdFswXSAtIDEyODsKLSAgICAgICAgdFswXSA9IGQ7Ci0gICAgICAgICsrdDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlb3JkZXJfcGl4ZWxzKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc2l6ZSkKLXsKLSAgICBjb25zdCBpbnQ4X3QgKnQxID0gc3JjOwotICAgIGNvbnN0IGludDhfdCAqdDIgPSBzcmMgKyAoc2l6ZSArIDEpIC8gMjsKLSAgICBpbnQ4X3QgKnMgICAgICAgID0gZHN0OwotICAgIGludDhfdCAqc3RvcCAgICAgPSBzICsgc2l6ZTsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIGlmIChzIDwgc3RvcCkKLSAgICAgICAgICAgICoocysrKSA9ICoodDErKyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmIChzIDwgc3RvcCkKLSAgICAgICAgICAgICoocysrKSA9ICoodDIrKyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGludCB6aXBfdW5jb21wcmVzcyhjb25zdCB1aW50OF90ICpzcmMsIGludCBjb21wcmVzc2VkX3NpemUsCitzdGF0aWMgaW50IHppcF91bmNvbXByZXNzKEVYUkNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvbXByZXNzZWRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVuY29tcHJlc3NlZF9zaXplLCBFWFJUaHJlYWREYXRhICp0ZCkKIHsKICAgICB1bnNpZ25lZCBsb25nIGRlc3RfbGVuID0gdW5jb21wcmVzc2VkX3NpemU7CkBAIC0yNjAsMTMgKzI3NCwxNSBAQAogICAgICAgICBkZXN0X2xlbiAhPSB1bmNvbXByZXNzZWRfc2l6ZSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBwcmVkaWN0b3IodGQtPnRtcCwgdW5jb21wcmVzc2VkX3NpemUpOwotICAgIHJlb3JkZXJfcGl4ZWxzKHRkLT50bXAsIHRkLT51bmNvbXByZXNzZWRfZGF0YSwgdW5jb21wcmVzc2VkX3NpemUpOworICAgIGF2X2Fzc2VydDEodW5jb21wcmVzc2VkX3NpemUgJSAyID09IDApOworCisgICAgcy0+ZHNwLnByZWRpY3Rvcih0ZC0+dG1wLCB1bmNvbXByZXNzZWRfc2l6ZSk7CisgICAgcy0+ZHNwLnJlb3JkZXJfcGl4ZWxzKHRkLT51bmNvbXByZXNzZWRfZGF0YSwgdGQtPnRtcCwgdW5jb21wcmVzc2VkX3NpemUpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmxlX3VuY29tcHJlc3MoY29uc3QgdWludDhfdCAqc3JjLCBpbnQgY29tcHJlc3NlZF9zaXplLAorc3RhdGljIGludCBybGVfdW5jb21wcmVzcyhFWFJDb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvbXByZXNzZWRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVuY29tcHJlc3NlZF9zaXplLCBFWFJUaHJlYWREYXRhICp0ZCkKIHsKICAgICB1aW50OF90ICpkICAgICAgPSB0ZC0+dG1wOwpAQCAtMzA1LDggKzMyMSwxMCBAQAogICAgIGlmIChkZW5kICE9IGQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgcHJlZGljdG9yKHRkLT50bXAsIHVuY29tcHJlc3NlZF9zaXplKTsKLSAgICByZW9yZGVyX3BpeGVscyh0ZC0+dG1wLCB0ZC0+dW5jb21wcmVzc2VkX2RhdGEsIHVuY29tcHJlc3NlZF9zaXplKTsKKyAgICBhdl9hc3NlcnQxKHVuY29tcHJlc3NlZF9zaXplICUgMiA9PSAwKTsKKworICAgIGN0eC0+ZHNwLnByZWRpY3Rvcih0ZC0+dG1wLCB1bmNvbXByZXNzZWRfc2l6ZSk7CisgICAgY3R4LT5kc3AucmVvcmRlcl9waXhlbHModGQtPnVuY29tcHJlc3NlZF9kYXRhLCB0ZC0+dG1wLCB1bmNvbXByZXNzZWRfc2l6ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTQ5Miw3ICs1MTAsOCBAQAogICAgIHVpbnQxNl90ICpvdXRiICAgID0gb3V0OwogICAgIHVpbnQxNl90ICpvZSAgICAgID0gb3V0ICsgbm87CiAgICAgY29uc3QgdWludDhfdCAqaWUgPSBnYi0+YnVmZmVyICsgKG5iaXRzICsgNykgLyA4OyAvLyBpbnB1dCBieXRlIHNpemUKLSAgICB1aW50OF90IGNzLCBzOworICAgIHVpbnQ4X3QgY3M7CisgICAgdWludDE2X3QgczsKICAgICBpbnQgaSwgbGMgPSAwOwogCiAgICAgd2hpbGUgKGdiLT5idWZmZXIgPCBpZSkgewpAQCAtNTM5LDcgKzU1OCw3IEBACiAgICAgd2hpbGUgKGxjID4gMCkgewogICAgICAgICBjb25zdCBIdWZEZWMgcGwgPSBoZGVjb2RbKGMgPDwgKEhVRl9ERUNCSVRTIC0gbGMpKSAmIEhVRl9ERUNNQVNLXTsKIAotICAgICAgICBpZiAocGwubGVuKSB7CisgICAgICAgIGlmIChwbC5sZW4gJiYgbGMgPj0gcGwubGVuKSB7CiAgICAgICAgICAgICBsYyAtPSBwbC5sZW47CiAgICAgICAgICAgICBnZXRfY29kZShwbC5saXQsIHJsYywgYywgbGMsIGdiLCBvdXQsIG9lLCBvdXRiKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTcxNiw4ICs3MzUsMTIgQEAKICAgICB1aW50MTZfdCBtYXh2YWwsIG1pbl9ub25femVybywgbWF4X25vbl96ZXJvOwogICAgIHVpbnQxNl90ICpwdHI7CiAgICAgdWludDE2X3QgKnRtcCA9ICh1aW50MTZfdCAqKXRkLT50bXA7Ci0gICAgdWludDhfdCAqb3V0OworICAgIHVpbnQxNl90ICpvdXQ7CisgICAgdWludDE2X3QgKmluOwogICAgIGludCByZXQsIGksIGo7CisgICAgaW50IHBpeGVsX2hhbGZfc2l6ZTsvKiAxIGZvciBoYWxmLCAyIGZvciBmbG9hdCBhbmQgdWludDMyICovCisgICAgRVhSQ2hhbm5lbCAqY2hhbm5lbDsKKyAgICBpbnQgdG1wX29mZnNldDsKIAogICAgIGlmICghdGQtPmJpdG1hcCkKICAgICAgICAgdGQtPmJpdG1hcCA9IGF2X21hbGxvYyhCSVRNQVBfU0laRSk7CkBAIC03NDAsNyArNzYzLDcgQEAKICAgICBpZiAobWluX25vbl96ZXJvIDw9IG1heF9ub25femVybykKICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmZ2IsIHRkLT5iaXRtYXAgKyBtaW5fbm9uX3plcm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X25vbl96ZXJvIC0gbWluX25vbl96ZXJvICsgMSk7Ci0gICAgbWVtc2V0KHRkLT5iaXRtYXAgKyBtYXhfbm9uX3plcm8sIDAsIEJJVE1BUF9TSVpFIC0gbWF4X25vbl96ZXJvKTsKKyAgICBtZW1zZXQodGQtPmJpdG1hcCArIG1heF9ub25femVybyArIDEsIDAsIEJJVE1BUF9TSVpFIC0gbWF4X25vbl96ZXJvIC0gMSk7CiAKICAgICBtYXh2YWwgPSByZXZlcnNlX2x1dCh0ZC0+Yml0bWFwLCB0ZC0+bHV0KTsKIApAQCAtNzUwLDI0ICs3NzMsNDIgQEAKIAogICAgIHB0ciA9IHRtcDsKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhbm5lbHM7IGkrKykgewotICAgICAgICBFWFJDaGFubmVsICpjaGFubmVsID0gJnMtPmNoYW5uZWxzW2ldOwotICAgICAgICBpbnQgc2l6ZSA9IGNoYW5uZWwtPnBpeGVsX3R5cGU7CisgICAgICAgIGNoYW5uZWwgPSAmcy0+Y2hhbm5lbHNbaV07CiAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykKLSAgICAgICAgICAgIHdhdl9kZWNvZGUocHRyICsgaiwgcy0+eGRlbHRhLCBzaXplLCBzLT55c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcy0+eGRlbHRhICogc2l6ZSwgbWF4dmFsKTsKLSAgICAgICAgcHRyICs9IHMtPnhkZWx0YSAqIHMtPnlzaXplICogc2l6ZTsKKyAgICAgICAgaWYgKGNoYW5uZWwtPnBpeGVsX3R5cGUgPT0gRVhSX0hBTEYpCisgICAgICAgICAgICBwaXhlbF9oYWxmX3NpemUgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwaXhlbF9oYWxmX3NpemUgPSAyOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwaXhlbF9oYWxmX3NpemU7IGorKykKKyAgICAgICAgICAgIHdhdl9kZWNvZGUocHRyICsgaiwgdGQtPnhzaXplLCBwaXhlbF9oYWxmX3NpemUsIHRkLT55c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGQtPnhzaXplICogcGl4ZWxfaGFsZl9zaXplLCBtYXh2YWwpOworICAgICAgICBwdHIgKz0gdGQtPnhzaXplICogdGQtPnlzaXplICogcGl4ZWxfaGFsZl9zaXplOwogICAgIH0KIAogICAgIGFwcGx5X2x1dCh0ZC0+bHV0LCB0bXAsIGRzaXplIC8gc2l6ZW9mKHVpbnQxNl90KSk7CiAKLSAgICBvdXQgPSB0ZC0+dW5jb21wcmVzc2VkX2RhdGE7Ci0gICAgZm9yIChpID0gMDsgaSA8IHMtPnlzaXplOyBpKyspCisgICAgb3V0ID0gKHVpbnQxNl90ICopdGQtPnVuY29tcHJlc3NlZF9kYXRhOworICAgIGZvciAoaSA9IDA7IGkgPCB0ZC0+eXNpemU7IGkrKykgeworICAgICAgICB0bXBfb2Zmc2V0ID0gMDsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX2NoYW5uZWxzOyBqKyspIHsKLSAgICAgICAgICAgIHVpbnQxNl90ICppbiA9IHRtcCArIGogKiBzLT54ZGVsdGEgKiBzLT55c2l6ZSArIGkgKiBzLT54ZGVsdGE7Ci0gICAgICAgICAgICBtZW1jcHkob3V0LCBpbiwgcy0+eGRlbHRhICogMik7Ci0gICAgICAgICAgICBvdXQgKz0gcy0+eGRlbHRhICogMjsKKyAgICAgICAgICAgIGNoYW5uZWwgPSAmcy0+Y2hhbm5lbHNbal07CisgICAgICAgICAgICBpZiAoY2hhbm5lbC0+cGl4ZWxfdHlwZSA9PSBFWFJfSEFMRikKKyAgICAgICAgICAgICAgICBwaXhlbF9oYWxmX3NpemUgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBpeGVsX2hhbGZfc2l6ZSA9IDI7CisKKyAgICAgICAgICAgIGluID0gdG1wICsgdG1wX29mZnNldCAqIHRkLT54c2l6ZSAqIHRkLT55c2l6ZSArIGkgKiB0ZC0+eHNpemUgKiBwaXhlbF9oYWxmX3NpemU7CisgICAgICAgICAgICB0bXBfb2Zmc2V0ICs9IHBpeGVsX2hhbGZfc2l6ZTsKKworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgICAgICAgICBzLT5iYmRzcC5ic3dhcDE2X2J1ZihvdXQsIGluLCB0ZC0+eHNpemUgKiBwaXhlbF9oYWxmX3NpemUpOworI2Vsc2UKKyAgICAgICAgICAgIG1lbWNweShvdXQsIGluLCB0ZC0+eHNpemUgKiAyICogcGl4ZWxfaGFsZl9zaXplKTsKKyNlbmRpZgorICAgICAgICAgICAgb3V0ICs9IHRkLT54c2l6ZSAqIHBpeGVsX2hhbGZfc2l6ZTsKICAgICAgICAgfQorICAgIH0KIAogICAgIHJldHVybiAwOwogfQpAQCAtNzc2LDE3ICs4MTcsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcHJlc3NlZF9zaXplLCBpbnQgdW5jb21wcmVzc2VkX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhSVGhyZWFkRGF0YSAqdGQpCiB7Ci0gICAgdW5zaWduZWQgbG9uZyBkZXN0X2xlbiA9IHVuY29tcHJlc3NlZF9zaXplOworICAgIHVuc2lnbmVkIGxvbmcgZGVzdF9sZW4sIGV4cGVjdGVkX2xlbiA9IDA7CiAgICAgY29uc3QgdWludDhfdCAqaW4gPSB0ZC0+dG1wOwogICAgIHVpbnQ4X3QgKm91dDsKICAgICBpbnQgYywgaSwgajsKIAotICAgIGlmICh1bmNvbXByZXNzKHRkLT50bXAsICZkZXN0X2xlbiwgc3JjLCBjb21wcmVzc2VkX3NpemUpICE9IFpfT0sgfHwKLSAgICAgICAgZGVzdF9sZW4gIT0gdW5jb21wcmVzc2VkX3NpemUpCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxzW2ldLnBpeGVsX3R5cGUgPT0gRVhSX0ZMT0FUKSB7CisgICAgICAgICAgICBleHBlY3RlZF9sZW4gKz0gKHRkLT54c2l6ZSAqIHRkLT55c2l6ZSAqIDMpOy8qIFBSWCAyNCBzdG9yZSBmbG9hdCBpbiAyNCBiaXQgaW5zdGVhZCBvZiAzMiAqLworICAgICAgICB9IGVsc2UgaWYgKHMtPmNoYW5uZWxzW2ldLnBpeGVsX3R5cGUgPT0gRVhSX0hBTEYpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkX2xlbiArPSAodGQtPnhzaXplICogdGQtPnlzaXplICogMik7CisgICAgICAgIH0gZWxzZSB7Ly9VSU5UIDMyCisgICAgICAgICAgICBleHBlY3RlZF9sZW4gKz0gKHRkLT54c2l6ZSAqIHRkLT55c2l6ZSAqIDQpOworICAgICAgICB9CisgICAgfQorCisgICAgZGVzdF9sZW4gPSBleHBlY3RlZF9sZW47CisKKyAgICBpZiAodW5jb21wcmVzcyh0ZC0+dG1wLCAmZGVzdF9sZW4sIHNyYywgY29tcHJlc3NlZF9zaXplKSAhPSBaX09LKSB7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0gZWxzZSBpZiAoZGVzdF9sZW4gIT0gZXhwZWN0ZWRfbGVuKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KIAogICAgIG91dCA9IHRkLT51bmNvbXByZXNzZWRfZGF0YTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+eXNpemU7IGkrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGQtPnlzaXplOyBpKyspCiAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBzLT5uYl9jaGFubmVsczsgYysrKSB7CiAgICAgICAgICAgICBFWFJDaGFubmVsICpjaGFubmVsID0gJnMtPmNoYW5uZWxzW2NdOwogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyWzRdOwpAQCAtNzk1LDEyICs4NTAsMTIgQEAKICAgICAgICAgICAgIHN3aXRjaCAoY2hhbm5lbC0+cGl4ZWxfdHlwZSkgewogICAgICAgICAgICAgY2FzZSBFWFJfRkxPQVQ6CiAgICAgICAgICAgICAgICAgcHRyWzBdID0gaW47Ci0gICAgICAgICAgICAgICAgcHRyWzFdID0gcHRyWzBdICsgcy0+eGRlbHRhOwotICAgICAgICAgICAgICAgIHB0clsyXSA9IHB0clsxXSArIHMtPnhkZWx0YTsKLSAgICAgICAgICAgICAgICBpbiAgICAgPSBwdHJbMl0gKyBzLT54ZGVsdGE7CisgICAgICAgICAgICAgICAgcHRyWzFdID0gcHRyWzBdICsgdGQtPnhzaXplOworICAgICAgICAgICAgICAgIHB0clsyXSA9IHB0clsxXSArIHRkLT54c2l6ZTsKKyAgICAgICAgICAgICAgICBpbiAgICAgPSBwdHJbMl0gKyB0ZC0+eHNpemU7CiAKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+eGRlbHRhOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGlmZiA9ICgqKHB0clswXSsrKSA8PCAyNCkgfAorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0ZC0+eHNpemU7ICsraikgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gKCh1bnNpZ25lZCkqKHB0clswXSsrKSA8PCAyNCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCoocHRyWzFdKyspIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKihwdHJbMl0rKykgPDwgOCk7CiAgICAgICAgICAgICAgICAgICAgIHBpeGVsICs9IGRpZmY7CkBAIC04MDksMTUgKzg2NCwzMSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBFWFJfSEFMRjoKICAgICAgICAgICAgICAgICBwdHJbMF0gPSBpbjsKLSAgICAgICAgICAgICAgICBwdHJbMV0gPSBwdHJbMF0gKyBzLT54ZGVsdGE7Ci0gICAgICAgICAgICAgICAgaW4gICAgID0gcHRyWzFdICsgcy0+eGRlbHRhOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT54ZGVsdGE7IGorKykgeworICAgICAgICAgICAgICAgIHB0clsxXSA9IHB0clswXSArIHRkLT54c2l6ZTsKKyAgICAgICAgICAgICAgICBpbiAgICAgPSBwdHJbMV0gKyB0ZC0+eHNpemU7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRkLT54c2l6ZTsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpZmYgPSAoKihwdHJbMF0rKykgPDwgOCkgfCAqKHB0clsxXSsrKTsKIAogICAgICAgICAgICAgICAgICAgICBwaXhlbCArPSBkaWZmOwogICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZvdXQsIHBpeGVsKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEVYUl9VSU5UOgorICAgICAgICAgICAgICAgIHB0clswXSA9IGluOworICAgICAgICAgICAgICAgIHB0clsxXSA9IHB0clswXSArIHMtPnhkZWx0YTsKKyAgICAgICAgICAgICAgICBwdHJbMl0gPSBwdHJbMV0gKyBzLT54ZGVsdGE7CisgICAgICAgICAgICAgICAgcHRyWzNdID0gcHRyWzJdICsgcy0+eGRlbHRhOworICAgICAgICAgICAgICAgIGluICAgICA9IHB0clszXSArIHMtPnhkZWx0YTsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT54ZGVsdGE7ICsraikgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gKCoocHRyWzBdKyspIDw8IDI0KSB8CisgICAgICAgICAgICAgICAgICAgICgqKHB0clsxXSsrKSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAoKihwdHJbMl0rKykgPDwgOCApIHwKKyAgICAgICAgICAgICAgICAgICAgKCoocHRyWzNdKyspKTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWwgKz0gZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmb3V0LCBwaXhlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KQEAgLTgyNiw2ICs4OTcsMTM0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHVucGFja18xNChjb25zdCB1aW50OF90IGJbMTRdLCB1aW50MTZfdCBzWzE2XSkKK3sKKyAgICB1bnNpZ25lZCBzaG9ydCBzaGlmdCA9IChiWyAyXSA+PiAyKSAmIDE1OworICAgIHVuc2lnbmVkIHNob3J0IGJpYXMgPSAoMHgyMCA8PCBzaGlmdCk7CisgICAgaW50IGk7CisKKyAgICBzWyAwXSA9IChiWzBdIDw8IDgpIHwgYlsxXTsKKworICAgIHNbIDRdID0gc1sgMF0gKyAoKCgoYlsgMl0gPDwgNCkgfCAoYlsgM10gPj4gNCkpICYgMHgzZikgPDwgc2hpZnQpIC0gYmlhczsKKyAgICBzWyA4XSA9IHNbIDRdICsgKCgoKGJbIDNdIDw8IDIpIHwgKGJbIDRdID4+IDYpKSAmIDB4M2YpIDw8IHNoaWZ0KSAtIGJpYXM7CisgICAgc1sxMl0gPSBzWyA4XSArICAgKChiWyA0XSAgICAgICAgICAgICAgICAgICAgICAgJiAweDNmKSA8PCBzaGlmdCkgLSBiaWFzOworCisgICAgc1sgMV0gPSBzWyAwXSArICAgKChiWyA1XSA+PiAyKSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzaGlmdCkgLSBiaWFzOworICAgIHNbIDVdID0gc1sgNF0gKyAoKCgoYlsgNV0gPDwgNCkgfCAoYlsgNl0gPj4gNCkpICYgMHgzZikgPDwgc2hpZnQpIC0gYmlhczsKKyAgICBzWyA5XSA9IHNbIDhdICsgKCgoKGJbIDZdIDw8IDIpIHwgKGJbIDddID4+IDYpKSAmIDB4M2YpIDw8IHNoaWZ0KSAtIGJpYXM7CisgICAgc1sxM10gPSBzWzEyXSArICAgKChiWyA3XSAgICAgICAgICAgICAgICAgICAgICAgJiAweDNmKSA8PCBzaGlmdCkgLSBiaWFzOworCisgICAgc1sgMl0gPSBzWyAxXSArICAgKChiWyA4XSA+PiAyKSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzaGlmdCkgLSBiaWFzOworICAgIHNbIDZdID0gc1sgNV0gKyAoKCgoYlsgOF0gPDwgNCkgfCAoYlsgOV0gPj4gNCkpICYgMHgzZikgPDwgc2hpZnQpIC0gYmlhczsKKyAgICBzWzEwXSA9IHNbIDldICsgKCgoKGJbIDldIDw8IDIpIHwgKGJbMTBdID4+IDYpKSAmIDB4M2YpIDw8IHNoaWZ0KSAtIGJpYXM7CisgICAgc1sxNF0gPSBzWzEzXSArICAgKChiWzEwXSAgICAgICAgICAgICAgICAgICAgICAgJiAweDNmKSA8PCBzaGlmdCkgLSBiaWFzOworCisgICAgc1sgM10gPSBzWyAyXSArICAgKChiWzExXSA+PiAyKSAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzaGlmdCkgLSBiaWFzOworICAgIHNbIDddID0gc1sgNl0gKyAoKCgoYlsxMV0gPDwgNCkgfCAoYlsxMl0gPj4gNCkpICYgMHgzZikgPDwgc2hpZnQpIC0gYmlhczsKKyAgICBzWzExXSA9IHNbMTBdICsgKCgoKGJbMTJdIDw8IDIpIHwgKGJbMTNdID4+IDYpKSAmIDB4M2YpIDw8IHNoaWZ0KSAtIGJpYXM7CisgICAgc1sxNV0gPSBzWzE0XSArICAgKChiWzEzXSAgICAgICAgICAgICAgICAgICAgICAgJiAweDNmKSA8PCBzaGlmdCkgLSBiaWFzOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgICAgaWYgKHNbaV0gJiAweDgwMDApCisgICAgICAgICAgICBzW2ldICY9IDB4N2ZmZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc1tpXSA9IH5zW2ldOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdW5wYWNrXzMoY29uc3QgdWludDhfdCBiWzNdLCB1aW50MTZfdCBzWzE2XSkKK3sKKyAgICBpbnQgaTsKKworICAgIHNbMF0gPSAoYlswXSA8PCA4KSB8IGJbMV07CisKKyAgICBpZiAoc1swXSAmIDB4ODAwMCkKKyAgICAgICAgc1swXSAmPSAweDdmZmY7CisgICAgZWxzZQorICAgICAgICBzWzBdID0gfnNbMF07CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTY7IGkrKykKKyAgICAgICAgc1tpXSA9IHNbMF07Cit9CisKKworc3RhdGljIGludCBiNDRfdW5jb21wcmVzcyhFWFJDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBjb21wcmVzc2VkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bmNvbXByZXNzZWRfc2l6ZSwgRVhSVGhyZWFkRGF0YSAqdGQpIHsKKyAgICBjb25zdCBpbnQ4X3QgKnNyID0gc3JjOworICAgIGludCBzdGF5X3RvX3VuY29tcHJlc3MgPSBjb21wcmVzc2VkX3NpemU7CisgICAgaW50IG5iX2I0NF9ibG9ja193LCBuYl9iNDRfYmxvY2tfaDsKKyAgICBpbnQgaW5kZXhfdGxfeCwgaW5kZXhfdGxfeSwgaW5kZXhfb3V0LCBpbmRleF90bXA7CisgICAgdWludDE2X3QgdG1wX2J1ZmZlclsxNl07IC8qIEI0NCB1c2UgNHg0IGhhbGYgZmxvYXQgcGl4ZWwgKi8KKyAgICBpbnQgYywgaVksIGlYLCB5LCB4OworICAgIGludCB0YXJnZXRfY2hhbm5lbF9vZmZzZXQgPSAwOworCisgICAgLyogY2FsYyBCNDQgYmxvY2sgY291bnQgKi8KKyAgICBuYl9iNDRfYmxvY2tfdyA9IHRkLT54c2l6ZSAvIDQ7CisgICAgaWYgKCh0ZC0+eHNpemUgJSA0KSAhPSAwKQorICAgICAgICBuYl9iNDRfYmxvY2tfdysrOworCisgICAgbmJfYjQ0X2Jsb2NrX2ggPSB0ZC0+eXNpemUgLyA0OworICAgIGlmICgodGQtPnlzaXplICUgNCkgIT0gMCkKKyAgICAgICAgbmJfYjQ0X2Jsb2NrX2grKzsKKworICAgIGZvciAoYyA9IDA7IGMgPCBzLT5uYl9jaGFubmVsczsgYysrKSB7CisgICAgICAgIGlmIChzLT5jaGFubmVsc1tjXS5waXhlbF90eXBlID09IEVYUl9IQUxGKSB7LyogQjQ0IG9ubHkgY29tcHJlc3MgaGFsZiBmbG9hdCBkYXRhICovCisgICAgICAgICAgICBmb3IgKGlZID0gMDsgaVkgPCBuYl9iNDRfYmxvY2tfaDsgaVkrKykgeworICAgICAgICAgICAgICAgIGZvciAoaVggPSAwOyBpWCA8IG5iX2I0NF9ibG9ja193OyBpWCsrKSB7LyogRm9yIGVhY2ggQjQ0IGJsb2NrICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF5X3RvX3VuY29tcHJlc3MgPCAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBkYXRhIGZvciBCNDRBIGJsb2NrOiAlZCIsIHN0YXlfdG9fdW5jb21wcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNbY29tcHJlc3NlZF9zaXplIC0gc3RheV90b191bmNvbXByZXNzICsgMl0gPT0gMHhmYykgeyAvKiBCNDRBIGJsb2NrICovCisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tfMyhzciwgdG1wX2J1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBzciArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgc3RheV90b191bmNvbXByZXNzIC09IDM7CisgICAgICAgICAgICAgICAgICAgIH0gIGVsc2Ugey8qIEI0NCBCbG9jayAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXlfdG9fdW5jb21wcmVzcyA8IDE0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vdCBlbm91Z2ggZGF0YSBmb3IgQjQ0IGJsb2NrOiAlZCIsIHN0YXlfdG9fdW5jb21wcmVzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tfMTQoc3IsIHRtcF9idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgc3IgKz0gMTQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF5X3RvX3VuY29tcHJlc3MgLT0gMTQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGRhdGEgdG8gdW5jb21wcmVzcyBidWZmZXIgKEI0NCBibG9jayBjYW4gZXhjZWVkIHRhcmdldCByZXNvbHV0aW9uKSovCisgICAgICAgICAgICAgICAgICAgIGluZGV4X3RsX3ggPSBpWCAqIDQ7CisgICAgICAgICAgICAgICAgICAgIGluZGV4X3RsX3kgPSBpWSAqIDQ7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gaW5kZXhfdGxfeTsgeSA8IEZGTUlOKGluZGV4X3RsX3kgKyA0LCB0ZC0+eXNpemUpOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IGluZGV4X3RsX3g7IHggPCBGRk1JTihpbmRleF90bF94ICsgNCwgdGQtPnhzaXplKTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfb3V0ID0gdGFyZ2V0X2NoYW5uZWxfb2Zmc2V0ICogdGQtPnhzaXplICsgeSAqIHRkLT5jaGFubmVsX2xpbmVfc2l6ZSArIDIgKiB4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X3RtcCA9ICh5LWluZGV4X3RsX3kpICogNCArICh4LWluZGV4X3RsX3gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT51bmNvbXByZXNzZWRfZGF0YVtpbmRleF9vdXRdID0gdG1wX2J1ZmZlcltpbmRleF90bXBdICYgMHhmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+dW5jb21wcmVzc2VkX2RhdGFbaW5kZXhfb3V0ICsgMV0gPSB0bXBfYnVmZmVyW2luZGV4X3RtcF0gPj4gODsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldF9jaGFubmVsX29mZnNldCArPSAyOworICAgICAgICB9IGVsc2Ugey8qIEZsb2F0IG9yIFVJTlQgMzIgY2hhbm5lbCAqLworICAgICAgICAgICAgaWYgKHN0YXlfdG9fdW5jb21wcmVzcyA8IHRkLT55c2l6ZSAqIHRkLT54c2l6ZSAqIDQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBkYXRhIGZvciB1bmNvbXByZXNzIGNoYW5uZWw6ICVkIiwgc3RheV90b191bmNvbXByZXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHRkLT55c2l6ZTsgeSsrKSB7CisgICAgICAgICAgICAgICAgaW5kZXhfb3V0ID0gdGFyZ2V0X2NoYW5uZWxfb2Zmc2V0ICogdGQtPnhzaXplICsgeSAqIHRkLT5jaGFubmVsX2xpbmVfc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnRkLT51bmNvbXByZXNzZWRfZGF0YVtpbmRleF9vdXRdLCBzciwgdGQtPnhzaXplICogNCk7CisgICAgICAgICAgICAgICAgc3IgKz0gdGQtPnhzaXplICogNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhcmdldF9jaGFubmVsX29mZnNldCArPSA0OworCisgICAgICAgICAgICBzdGF5X3RvX3VuY29tcHJlc3MgLT0gdGQtPnlzaXplICogdGQtPnhzaXplICogNDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRlY29kZV9ibG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpCiB7CkBAIC04MzUsNTMgKzEwMzQsMTEyIEBACiAgICAgY29uc3QgdWludDhfdCAqY2hhbm5lbF9idWZmZXJbNF0gPSB7IDAgfTsKICAgICBjb25zdCB1aW50OF90ICpidWYgPSBzLT5idWY7CiAgICAgdWludDY0X3QgbGluZV9vZmZzZXQsIHVuY29tcHJlc3NlZF9zaXplOwotICAgIHVpbnQzMl90IHhkZWx0YSA9IHMtPnhkZWx0YTsKICAgICB1aW50MTZfdCAqcHRyX3g7CiAgICAgdWludDhfdCAqcHRyOwotICAgIHVpbnQzMl90IGRhdGFfc2l6ZSwgbGluZTsKKyAgICB1aW50MzJfdCBkYXRhX3NpemU7CisgICAgdWludDY0X3QgbGluZSwgY29sID0gMDsKKyAgICB1aW50NjRfdCB0aWxlX3gsIHRpbGVfeSwgdGlsZV9sZXZlbF94LCB0aWxlX2xldmVsX3k7CiAgICAgY29uc3QgdWludDhfdCAqc3JjOwotICAgIGludCBheG1heCA9IChhdmN0eC0+d2lkdGggLSAocy0+eG1heCArIDEpKSAqIDIgKiBzLT5kZXNjLT5uYl9jb21wb25lbnRzOwotICAgIGludCBieG1pbiA9IHMtPnhtaW4gKiAyICogcy0+ZGVzYy0+bmJfY29tcG9uZW50czsKKyAgICBpbnQgYXhtYXggPSAoYXZjdHgtPndpZHRoIC0gKHMtPnhtYXggKyAxKSkgKiAyICogcy0+ZGVzYy0+bmJfY29tcG9uZW50czsgLyogbmIgcGl4ZWwgdG8gYWRkIGF0IHRoZSByaWdodCBvZiB0aGUgZGF0YXdpbmRvdyAqLworICAgIGludCBieG1pbiA9IHMtPnhtaW4gKiAyICogcy0+ZGVzYy0+bmJfY29tcG9uZW50czsgLyogbmIgcGl4ZWwgdG8gYWRkIGF0IHRoZSBsZWZ0IG9mIHRoZSBkYXRhd2luZG93ICovCiAgICAgaW50IGksIHgsIGJ1Zl9zaXplID0gcy0+YnVmX3NpemU7CisgICAgaW50IGMsIHJnYl9jaGFubmVsX2NvdW50OwogICAgIGZsb2F0IG9uZV9nYW1tYSA9IDEuMGYgLyBzLT5nYW1tYTsKICAgICBhdnByaXZfdHJjX2Z1bmN0aW9uIHRyY19mdW5jID0gYXZwcml2X2dldF90cmNfZnVuY3Rpb25fZnJvbV90cmMocy0+YXBwbHlfdHJjX3R5cGUpOwogICAgIGludCByZXQ7CiAKICAgICBsaW5lX29mZnNldCA9IEFWX1JMNjQocy0+Z2IuYnVmZmVyICsgam9ibnIgKiA4KTsKLSAgICAvLyBDaGVjayBpZiB0aGUgYnVmZmVyIGhhcyB0aGUgcmVxdWlyZWQgYnl0ZXMgbmVlZGVkIGZyb20gdGhlIG9mZnNldAotICAgIGlmIChsaW5lX29mZnNldCA+IGJ1Zl9zaXplIC0gOCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBzcmMgID0gYnVmICsgbGluZV9vZmZzZXQgKyA4OwotICAgIGxpbmUgPSBBVl9STDMyKHNyYyAtIDgpOwotICAgIGlmIChsaW5lIDwgcy0+eW1pbiB8fCBsaW5lID4gcy0+eW1heCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKHMtPmlzX3RpbGUpIHsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgMjAgfHwgbGluZV9vZmZzZXQgPiBidWZfc2l6ZSAtIDIwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBkYXRhX3NpemUgPSBBVl9STDMyKHNyYyAtIDQpOwotICAgIGlmIChkYXRhX3NpemUgPD0gMCB8fCBkYXRhX3NpemUgPiBidWZfc2l6ZSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHNyYyAgPSBidWYgKyBsaW5lX29mZnNldCArIDIwOwogCi0gICAgcy0+eXNpemUgICAgICAgICAgPSBGRk1JTihzLT5zY2FuX2xpbmVzX3Blcl9ibG9jaywgcy0+eW1heCAtIGxpbmUgKyAxKTsKLSAgICB1bmNvbXByZXNzZWRfc2l6ZSA9IHMtPnNjYW5fbGluZV9zaXplICogcy0+eXNpemU7Ci0gICAgaWYgKChzLT5jb21wcmVzc2lvbiA9PSBFWFJfUkFXICYmIChkYXRhX3NpemUgIT0gdW5jb21wcmVzc2VkX3NpemUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfb2Zmc2V0ID4gYnVmX3NpemUgLSB1bmNvbXByZXNzZWRfc2l6ZSkpIHx8Ci0gICAgICAgIChzLT5jb21wcmVzc2lvbiAhPSBFWFJfUkFXICYmIChkYXRhX3NpemUgPiB1bmNvbXByZXNzZWRfc2l6ZSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9vZmZzZXQgPiBidWZfc2l6ZSAtIGRhdGFfc2l6ZSkpKSB7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB0aWxlX3ggPSBBVl9STDMyKHNyYyAtIDIwKTsKKyAgICAgICAgdGlsZV95ID0gQVZfUkwzMihzcmMgLSAxNik7CisgICAgICAgIHRpbGVfbGV2ZWxfeCA9IEFWX1JMMzIoc3JjIC0gMTIpOworICAgICAgICB0aWxlX2xldmVsX3kgPSBBVl9STDMyKHNyYyAtIDgpOworCisgICAgICAgIGRhdGFfc2l6ZSA9IEFWX1JMMzIoc3JjIC0gNCk7CisgICAgICAgIGlmIChkYXRhX3NpemUgPD0gMCB8fCBkYXRhX3NpemUgPiBidWZfc2l6ZSAtIGxpbmVfb2Zmc2V0IC0gMjApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBpZiAodGlsZV9sZXZlbF94IHx8IHRpbGVfbGV2ZWxfeSkgeyAvKiB0aWxlIGxldmVsLCBpcyBub3QgdGhlIGZ1bGwgcmVzIGxldmVsICovCisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIlN1YnJlcyB0aWxlIGJlZm9yZSBmdWxsIHJlcyB0aWxlIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+eG1pbiB8fCBzLT55bWluKSB7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIlRpbGVzIHdpdGggeG1pbi95bWluIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICBsaW5lID0gcy0+dGlsZV9hdHRyLnlTaXplICogdGlsZV95OworICAgICAgICBjb2wgPSBzLT50aWxlX2F0dHIueFNpemUgKiB0aWxlX3g7CisKKyAgICAgICAgaWYgKGxpbmUgPCBzLT55bWluIHx8IGxpbmUgPiBzLT55bWF4IHx8CisgICAgICAgICAgICBjb2wgIDwgcy0+eG1pbiB8fCBjb2wgID4gcy0+eG1heCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHRkLT55c2l6ZSA9IEZGTUlOKHMtPnRpbGVfYXR0ci55U2l6ZSwgcy0+eWRlbHRhIC0gdGlsZV95ICogcy0+dGlsZV9hdHRyLnlTaXplKTsKKyAgICAgICAgdGQtPnhzaXplID0gRkZNSU4ocy0+dGlsZV9hdHRyLnhTaXplLCBzLT54ZGVsdGEgLSB0aWxlX3ggKiBzLT50aWxlX2F0dHIueFNpemUpOworCisgICAgICAgIGlmIChjb2wpIHsgLyogbm90IHRoZSBmaXJzdCB0aWxlIG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICBieG1pbiA9IDA7IC8qIGRvZXNuJ3QgYWRkIHBpeGVsIGF0IHRoZSBsZWZ0IG9mIHRoZSBkYXRhd2luZG93ICovCisgICAgICAgIH0KKworICAgICAgICBpZiAoKGNvbCArIHRkLT54c2l6ZSkgIT0gcy0+eGRlbHRhKS8qIG5vdCB0aGUgbGFzdCB0aWxlIG9mIHRoZSBsaW5lICovCisgICAgICAgICAgICBheG1heCA9IDA7IC8qIGRvZXNuJ3QgYWRkIHBpeGVsIGF0IHRoZSByaWdodCBvZiB0aGUgZGF0YXdpbmRvdyAqLworCisgICAgICAgIHRkLT5jaGFubmVsX2xpbmVfc2l6ZSA9IHRkLT54c2l6ZSAqIHMtPmN1cnJlbnRfY2hhbm5lbF9vZmZzZXQ7LyogdW5jb21wcmVzcyBzaXplIG9mIG9uZSBsaW5lICovCisgICAgICAgIHVuY29tcHJlc3NlZF9zaXplID0gdGQtPmNoYW5uZWxfbGluZV9zaXplICogKHVpbnQ2NF90KXRkLT55c2l6ZTsvKiB1bmNvbXByZXNzIHNpemUgb2YgdGhlIGJsb2NrICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgOCB8fCBsaW5lX29mZnNldCA+IGJ1Zl9zaXplIC0gOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHNyYyAgPSBidWYgKyBsaW5lX29mZnNldCArIDg7CisgICAgICAgIGxpbmUgPSBBVl9STDMyKHNyYyAtIDgpOworCisgICAgICAgIGlmIChsaW5lIDwgcy0+eW1pbiB8fCBsaW5lID4gcy0+eW1heCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGRhdGFfc2l6ZSA9IEFWX1JMMzIoc3JjIC0gNCk7CisgICAgICAgIGlmIChkYXRhX3NpemUgPD0gMCB8fCBkYXRhX3NpemUgPiBidWZfc2l6ZSAtIGxpbmVfb2Zmc2V0IC0gOCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHRkLT55c2l6ZSAgICAgICAgICA9IEZGTUlOKHMtPnNjYW5fbGluZXNfcGVyX2Jsb2NrLCBzLT55bWF4IC0gbGluZSArIDEpOyAvKiBzLT55ZGVsdGEgLSBsaW5lID8/ICovCisgICAgICAgIHRkLT54c2l6ZSAgICAgICAgICA9IHMtPnhkZWx0YTsKKworICAgICAgICB0ZC0+Y2hhbm5lbF9saW5lX3NpemUgPSB0ZC0+eHNpemUgKiBzLT5jdXJyZW50X2NoYW5uZWxfb2Zmc2V0Oy8qIHVuY29tcHJlc3Mgc2l6ZSBvZiBvbmUgbGluZSAqLworICAgICAgICB1bmNvbXByZXNzZWRfc2l6ZSA9IHRkLT5jaGFubmVsX2xpbmVfc2l6ZSAqICh1aW50NjRfdCl0ZC0+eXNpemU7LyogdW5jb21wcmVzcyBzaXplIG9mIHRoZSBibG9jayAqLworCisgICAgICAgIGlmICgocy0+Y29tcHJlc3Npb24gPT0gRVhSX1JBVyAmJiAoZGF0YV9zaXplICE9IHVuY29tcHJlc3NlZF9zaXplIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9vZmZzZXQgPiBidWZfc2l6ZSAtIHVuY29tcHJlc3NlZF9zaXplKSkgfHwKKyAgICAgICAgICAgIChzLT5jb21wcmVzc2lvbiAhPSBFWFJfUkFXICYmIChkYXRhX3NpemUgPiB1bmNvbXByZXNzZWRfc2l6ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfb2Zmc2V0ID4gYnVmX3NpemUgLSBkYXRhX3NpemUpKSkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZGF0YV9zaXplIDwgdW5jb21wcmVzc2VkX3NpemUgfHwgcy0+aXNfdGlsZSkgeyAvKiB0ZC0+dG1wIGlzIHVzZSBmb3IgdGlsZSByZW9yZ2FuaXphdGlvbiAqLworICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnRkLT50bXAsICZ0ZC0+dG1wX3NpemUsIHVuY29tcHJlc3NlZF9zaXplKTsKKyAgICAgICAgaWYgKCF0ZC0+dG1wKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAKICAgICBpZiAoZGF0YV9zaXplIDwgdW5jb21wcmVzc2VkX3NpemUpIHsKICAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZ0ZC0+dW5jb21wcmVzc2VkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGQtPnVuY29tcHJlc3NlZF9zaXplLCB1bmNvbXByZXNzZWRfc2l6ZSk7Ci0gICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmdGQtPnRtcCwgJnRkLT50bXBfc2l6ZSwgdW5jb21wcmVzc2VkX3NpemUpOwotICAgICAgICBpZiAoIXRkLT51bmNvbXByZXNzZWRfZGF0YSB8fCAhdGQtPnRtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZC0+dW5jb21wcmVzc2VkX3NpemUsIHVuY29tcHJlc3NlZF9zaXplICsgNjQpOy8qIEZvcmNlIDY0IHBhZGRpbmcgZm9yIEFWWDIgcmVvcmRlcl9waXhlbHMgZHN0ICovCisKKyAgICAgICAgaWYgKCF0ZC0+dW5jb21wcmVzc2VkX2RhdGEpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIHN3aXRjaCAocy0+Y29tcHJlc3Npb24pIHsKICAgICAgICAgY2FzZSBFWFJfWklQMToKICAgICAgICAgY2FzZSBFWFJfWklQMTY6Ci0gICAgICAgICAgICByZXQgPSB6aXBfdW5jb21wcmVzcyhzcmMsIGRhdGFfc2l6ZSwgdW5jb21wcmVzc2VkX3NpemUsIHRkKTsKKyAgICAgICAgICAgIHJldCA9IHppcF91bmNvbXByZXNzKHMsIHNyYywgZGF0YV9zaXplLCB1bmNvbXByZXNzZWRfc2l6ZSwgdGQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRVhSX1BJWjoKICAgICAgICAgICAgIHJldCA9IHBpel91bmNvbXByZXNzKHMsIHNyYywgZGF0YV9zaXplLCB1bmNvbXByZXNzZWRfc2l6ZSwgdGQpOwpAQCAtODkwLDcgKzExNDgsMTIgQEAKICAgICAgICAgICAgIHJldCA9IHB4cjI0X3VuY29tcHJlc3Mocywgc3JjLCBkYXRhX3NpemUsIHVuY29tcHJlc3NlZF9zaXplLCB0ZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBFWFJfUkxFOgotICAgICAgICAgICAgcmV0ID0gcmxlX3VuY29tcHJlc3Moc3JjLCBkYXRhX3NpemUsIHVuY29tcHJlc3NlZF9zaXplLCB0ZCk7CisgICAgICAgICAgICByZXQgPSBybGVfdW5jb21wcmVzcyhzLCBzcmMsIGRhdGFfc2l6ZSwgdW5jb21wcmVzc2VkX3NpemUsIHRkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVYUl9CNDQ6CisgICAgICAgIGNhc2UgRVhSX0I0NEE6CisgICAgICAgICAgICByZXQgPSBiNDRfdW5jb21wcmVzcyhzLCBzcmMsIGRhdGFfc2l6ZSwgdW5jb21wcmVzc2VkX3NpemUsIHRkKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImRlY29kZV9ibG9jaygpIGZhaWxlZC5cbiIpOwpAQCAtODk5LDIxICsxMTYyLDMwIEBACiAgICAgICAgIHNyYyA9IHRkLT51bmNvbXByZXNzZWRfZGF0YTsKICAgICB9CiAKLSAgICBjaGFubmVsX2J1ZmZlclswXSA9IHNyYyArIHhkZWx0YSAqIHMtPmNoYW5uZWxfb2Zmc2V0c1swXTsKLSAgICBjaGFubmVsX2J1ZmZlclsxXSA9IHNyYyArIHhkZWx0YSAqIHMtPmNoYW5uZWxfb2Zmc2V0c1sxXTsKLSAgICBjaGFubmVsX2J1ZmZlclsyXSA9IHNyYyArIHhkZWx0YSAqIHMtPmNoYW5uZWxfb2Zmc2V0c1syXTsKKyAgICBpZiAoIXMtPmlzX2x1bWEpIHsKKyAgICAgICAgY2hhbm5lbF9idWZmZXJbMF0gPSBzcmMgKyB0ZC0+eHNpemUgKiBzLT5jaGFubmVsX29mZnNldHNbMF07CisgICAgICAgIGNoYW5uZWxfYnVmZmVyWzFdID0gc3JjICsgdGQtPnhzaXplICogcy0+Y2hhbm5lbF9vZmZzZXRzWzFdOworICAgICAgICBjaGFubmVsX2J1ZmZlclsyXSA9IHNyYyArIHRkLT54c2l6ZSAqIHMtPmNoYW5uZWxfb2Zmc2V0c1syXTsKKyAgICAgICAgcmdiX2NoYW5uZWxfY291bnQgPSAzOworICAgIH0gZWxzZSB7IC8qIHB1dCB5IGRhdGEgaW4gdGhlIGZpcnN0IGNoYW5uZWxfYnVmZmVyICovCisgICAgICAgIGNoYW5uZWxfYnVmZmVyWzBdID0gc3JjICsgdGQtPnhzaXplICogcy0+Y2hhbm5lbF9vZmZzZXRzWzFdOworICAgICAgICByZ2JfY2hhbm5lbF9jb3VudCA9IDE7CisgICAgfQogICAgIGlmIChzLT5jaGFubmVsX29mZnNldHNbM10gPj0gMCkKLSAgICAgICAgY2hhbm5lbF9idWZmZXJbM10gPSBzcmMgKyB4ZGVsdGEgKiBzLT5jaGFubmVsX29mZnNldHNbM107CisgICAgICAgIGNoYW5uZWxfYnVmZmVyWzNdID0gc3JjICsgdGQtPnhzaXplICogcy0+Y2hhbm5lbF9vZmZzZXRzWzNdOwogCi0gICAgcHRyID0gcC0+ZGF0YVswXSArIGxpbmUgKiBwLT5saW5lc2l6ZVswXTsKKyAgICBwdHIgPSBwLT5kYXRhWzBdICsgbGluZSAqIHAtPmxpbmVzaXplWzBdICsgKGNvbCAqIHMtPmRlc2MtPm5iX2NvbXBvbmVudHMgKiAyKTsKKwogICAgIGZvciAoaSA9IDA7Ci0gICAgICAgICBpIDwgcy0+c2Nhbl9saW5lc19wZXJfYmxvY2sgJiYgbGluZSArIGkgPD0gcy0+eW1heDsKLSAgICAgICAgIGkrKywgcHRyICs9IHAtPmxpbmVzaXplWzBdKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnIsICpnLCAqYiwgKmE7CisgICAgICAgICBpIDwgdGQtPnlzaXplOyBpKyssIHB0ciArPSBwLT5saW5lc2l6ZVswXSkgewogCi0gICAgICAgIHIgPSBjaGFubmVsX2J1ZmZlclswXTsKLSAgICAgICAgZyA9IGNoYW5uZWxfYnVmZmVyWzFdOwotICAgICAgICBiID0gY2hhbm5lbF9idWZmZXJbMl07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBhOworICAgICAgICBjb25zdCB1aW50OF90ICpyZ2JbM107CisKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IHJnYl9jaGFubmVsX2NvdW50OyBjKyspeworICAgICAgICAgICAgcmdiW2NdID0gY2hhbm5lbF9idWZmZXJbY107CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY2hhbm5lbF9idWZmZXJbM10pCiAgICAgICAgICAgICBhID0gY2hhbm5lbF9idWZmZXJbM107CiAKQEAgLTkyMiw2NSArMTE5NCw2NyBAQAogICAgICAgICAvLyBaZXJvIG91dCB0aGUgc3RhcnQgaWYgeG1pbiBpcyBub3QgMAogICAgICAgICBtZW1zZXQocHRyX3gsIDAsIGJ4bWluKTsKICAgICAgICAgcHRyX3ggKz0gcy0+eG1pbiAqIHMtPmRlc2MtPm5iX2NvbXBvbmVudHM7CisKICAgICAgICAgaWYgKHMtPnBpeGVsX3R5cGUgPT0gRVhSX0ZMT0FUKSB7CiAgICAgICAgICAgICAvLyAzMi1iaXQKICAgICAgICAgICAgIGlmICh0cmNfZnVuYykgewotICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB4ZGVsdGE7IHgrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB0ZC0+eHNpemU7IHgrKykgewogICAgICAgICAgICAgICAgICAgICB1bmlvbiBhdl9pbnRmbG9hdDMyIHQ7Ci0gICAgICAgICAgICAgICAgICAgIHQuaSA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJnIpOwotICAgICAgICAgICAgICAgICAgICB0LmYgPSB0cmNfZnVuYyh0LmYpOwotICAgICAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9mbHQydWludCh0LmkpOwogCi0gICAgICAgICAgICAgICAgICAgIHQuaSA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmcpOwotICAgICAgICAgICAgICAgICAgICB0LmYgPSB0cmNfZnVuYyh0LmYpOwotICAgICAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9mbHQydWludCh0LmkpOwotCi0gICAgICAgICAgICAgICAgICAgIHQuaSA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmIpOwotICAgICAgICAgICAgICAgICAgICB0LmYgPSB0cmNfZnVuYyh0LmYpOwotICAgICAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9mbHQydWludCh0LmkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcmdiX2NoYW5uZWxfY291bnQ7IGMrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdC5pID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcmdiW2NdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuZiA9IHRyY19mdW5jKHQuZik7CisgICAgICAgICAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9mbHQydWludCh0LmkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsX2J1ZmZlclszXSkKICAgICAgICAgICAgICAgICAgICAgICAgICpwdHJfeCsrID0gZXhyX2ZsdDJ1aW50KGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmEpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB4ZGVsdGE7IHgrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB0ZC0+eHNpemU7IHgrKykgewogICAgICAgICAgICAgICAgICAgICB1bmlvbiBhdl9pbnRmbG9hdDMyIHQ7Ci0gICAgICAgICAgICAgICAgICAgIHQuaSA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJnIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodC5mID4gMC4wZikgIC8qIGF2b2lkIG5lZ2F0aXZlIHZhbHVlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdC5mID0gcG93Zih0LmYsIG9uZV9nYW1tYSk7Ci0gICAgICAgICAgICAgICAgICAgICpwdHJfeCsrID0gZXhyX2ZsdDJ1aW50KHQuaSk7CisgICAgICAgICAgICAgICAgICAgIGludCBjOwogCi0gICAgICAgICAgICAgICAgICAgIHQuaSA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmcpOwotICAgICAgICAgICAgICAgICAgICBpZiAodC5mID4gMC4wZikKLSAgICAgICAgICAgICAgICAgICAgICAgIHQuZiA9IHBvd2YodC5mLCBvbmVfZ2FtbWEpOwotICAgICAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9mbHQydWludCh0LmkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcmdiX2NoYW5uZWxfY291bnQ7IGMrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdC5pID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcmdiW2NdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LmYgPiAwLjBmKSAgLyogYXZvaWQgbmVnYXRpdmUgdmFsdWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5mID0gcG93Zih0LmYsIG9uZV9nYW1tYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9mbHQydWludCh0LmkpOworICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgdC5pID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmYik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0LmYgPiAwLjBmKQotICAgICAgICAgICAgICAgICAgICAgICAgdC5mID0gcG93Zih0LmYsIG9uZV9nYW1tYSk7Ci0gICAgICAgICAgICAgICAgICAgICpwdHJfeCsrID0gZXhyX2ZsdDJ1aW50KHQuaSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsX2J1ZmZlclszXSkKICAgICAgICAgICAgICAgICAgICAgICAgICpwdHJfeCsrID0gZXhyX2ZsdDJ1aW50KGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmEpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0gZWxzZSBpZiAocy0+cGl4ZWxfdHlwZSA9PSBFWFJfSEFMRikgewogICAgICAgICAgICAgLy8gMTYtYml0Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgeGRlbHRhOyB4KyspIHsKLSAgICAgICAgICAgICAgICAqcHRyX3grKyA9IHMtPmdhbW1hX3RhYmxlW2J5dGVzdHJlYW1fZ2V0X2xlMTYoJnIpXTsKLSAgICAgICAgICAgICAgICAqcHRyX3grKyA9IHMtPmdhbW1hX3RhYmxlW2J5dGVzdHJlYW1fZ2V0X2xlMTYoJmcpXTsKLSAgICAgICAgICAgICAgICAqcHRyX3grKyA9IHMtPmdhbW1hX3RhYmxlW2J5dGVzdHJlYW1fZ2V0X2xlMTYoJmIpXTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB0ZC0+eHNpemU7IHgrKykgeworICAgICAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCByZ2JfY2hhbm5lbF9jb3VudDsgYysrKSB7CisgICAgICAgICAgICAgICAgICAgICpwdHJfeCsrID0gcy0+Z2FtbWFfdGFibGVbYnl0ZXN0cmVhbV9nZXRfbGUxNigmcmdiW2NdKV07CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxfYnVmZmVyWzNdKQogICAgICAgICAgICAgICAgICAgICAqcHRyX3grKyA9IGV4cl9oYWxmbHQydWludChieXRlc3RyZWFtX2dldF9sZTE2KCZhKSk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+cGl4ZWxfdHlwZSA9PSBFWFJfVUlOVCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHRkLT54c2l6ZTsgeCsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHJnYl9jaGFubmVsX2NvdW50OyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKnB0cl94KysgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZyZ2JbY10pID4+IDE2OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjaGFubmVsX2J1ZmZlclszXSkKKyAgICAgICAgICAgICAgICAgICAgKnB0cl94KysgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZhKSA+PiAxNjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIFplcm8gb3V0IHRoZSBlbmQgaWYgeG1heCsxIGlzIG5vdCB3CiAgICAgICAgIG1lbXNldChwdHJfeCwgMCwgYXhtYXgpOwogCi0gICAgICAgIGNoYW5uZWxfYnVmZmVyWzBdICs9IHMtPnNjYW5fbGluZV9zaXplOwotICAgICAgICBjaGFubmVsX2J1ZmZlclsxXSArPSBzLT5zY2FuX2xpbmVfc2l6ZTsKLSAgICAgICAgY2hhbm5lbF9idWZmZXJbMl0gKz0gcy0+c2Nhbl9saW5lX3NpemU7CisgICAgICAgIGNoYW5uZWxfYnVmZmVyWzBdICs9IHRkLT5jaGFubmVsX2xpbmVfc2l6ZTsKKyAgICAgICAgY2hhbm5lbF9idWZmZXJbMV0gKz0gdGQtPmNoYW5uZWxfbGluZV9zaXplOworICAgICAgICBjaGFubmVsX2J1ZmZlclsyXSArPSB0ZC0+Y2hhbm5lbF9saW5lX3NpemU7CiAgICAgICAgIGlmIChjaGFubmVsX2J1ZmZlclszXSkKLSAgICAgICAgICAgIGNoYW5uZWxfYnVmZmVyWzNdICs9IHMtPnNjYW5fbGluZV9zaXplOworICAgICAgICAgICAgY2hhbm5lbF9idWZmZXJbM10gKz0gdGQtPmNoYW5uZWxfbGluZV9zaXplOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMTAyNywxMSArMTMwMSwxNCBAQAogICAgIHJldHVybiB2YXJfc2l6ZTsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfaGVhZGVyKEVYUkNvbnRleHQgKnMpCitzdGF0aWMgaW50IGRlY29kZV9oZWFkZXIoRVhSQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCiB7Ci0gICAgaW50IGN1cnJlbnRfY2hhbm5lbF9vZmZzZXQgPSAwOwotICAgIGludCBtYWdpY19udW1iZXIsIHZlcnNpb24sIGZsYWdzLCBpLCBzYXIgPSAwOworICAgIEFWRGljdGlvbmFyeSAqbWV0YWRhdGEgPSBOVUxMOworICAgIGludCBtYWdpY19udW1iZXIsIHZlcnNpb24sIGksIGZsYWdzLCBzYXIgPSAwOworICAgIGludCBsYXllcl9tYXRjaCA9IDA7CisgICAgaW50IHJldDsKIAorICAgIHMtPmN1cnJlbnRfY2hhbm5lbF9vZmZzZXQgPSAwOwogICAgIHMtPnhtaW4gICAgICAgICAgICAgICA9IH4wOwogICAgIHMtPnhtYXggICAgICAgICAgICAgICA9IH4wOwogICAgIHMtPnltaW4gICAgICAgICAgICAgICA9IH4wOwpAQCAtMTA0Nyw2ICsxMzI0LDEwIEBACiAgICAgcy0+bmJfY2hhbm5lbHMgICAgICAgID0gMDsKICAgICBzLT53ICAgICAgICAgICAgICAgICAgPSAwOwogICAgIHMtPmggICAgICAgICAgICAgICAgICA9IDA7CisgICAgcy0+dGlsZV9hdHRyLnhTaXplICAgID0gLTE7CisgICAgcy0+dGlsZV9hdHRyLnlTaXplICAgID0gLTE7CisgICAgcy0+aXNfdGlsZSAgICAgICAgICAgID0gMDsKKyAgICBzLT5pc19sdW1hICAgICAgICAgICAgPSAwOwogCiAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAxMCkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkhlYWRlciB0b28gc2hvcnQgdG8gcGFyc2UuXG4iKTsKQEAgLTEwNjgsOCArMTM0OSwxNSBAQAogICAgIH0KIAogICAgIGZsYWdzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMjQoJnMtPmdiKTsKLSAgICBpZiAoZmxhZ3MgJiAweDAyKSB7Ci0gICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiVGlsZSBzdXBwb3J0Iik7CisKKyAgICBpZiAoZmxhZ3MgJiAweDAyKQorICAgICAgICBzLT5pc190aWxlID0gMTsKKyAgICBpZiAoZmxhZ3MgJiAweDA4KSB7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiZGVlcCBkYXRhIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgaWYgKGZsYWdzICYgMHgxMCkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIm11bHRpcGFydCIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCkBAIC0xMDc5LDggKzEzNjcsMTAgQEAKICAgICAgICAgaWYgKCh2YXJfc2l6ZSA9IGNoZWNrX2hlYWRlcl92YXJpYWJsZShzLCAiY2hhbm5lbHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGxpc3QiLCAzOCkpID49IDApIHsKICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0IGNoX2diOwotICAgICAgICAgICAgaWYgKCF2YXJfc2l6ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmICghdmFyX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmY2hfZ2IsIHMtPmdiLmJ1ZmZlciwgdmFyX3NpemUpOwogCkBAIC0xMDkyLDMxICsxMzgyLDQ2IEBACiAKICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKHMtPmxheWVyLCAiIikgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChjaF9nYi5idWZmZXIsIHMtPmxheWVyLCBzdHJsZW4ocy0+bGF5ZXIpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9tYXRjaCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGFubmVsIG1hdGNoIGxheWVyIDogJXMuXG4iLCBjaF9nYi5idWZmZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgY2hfZ2IuYnVmZmVyICs9IHN0cmxlbihzLT5sYXllcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmNoX2diLmJ1ZmZlciA9PSAnLicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hfZ2IuYnVmZmVyKys7ICAgICAgICAgLyogc2tpcCBkb3QgaWYgbm90IGdpdmVuICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9tYXRjaCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMYXllciAlcy4lcyBtYXRjaGVkLlxuIiwgcy0+bGF5ZXIsIGNoX2diLmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoYW5uZWwgZG9lc24ndCBtYXRjaCBsYXllciA6ICVzLlxuIiwgY2hfZ2IuYnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxheWVyX21hdGNoID0gMTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChjaF9nYi5idWZmZXIsICJSIikgfHwKLSAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjaF9nYi5idWZmZXIsICJYIikgfHwKLSAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjaF9nYi5idWZmZXIsICJVIikpCi0gICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiRyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjaF9nYi5idWZmZXIsICJZIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKGNoX2diLmJ1ZmZlciwgIlYiKSkKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9pbmRleCA9IDE7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXN0cmNtcChjaF9nYi5idWZmZXIsICJCIikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKGNoX2diLmJ1ZmZlciwgIloiKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiVyIpKQotICAgICAgICAgICAgICAgICAgICBjaGFubmVsX2luZGV4ID0gMjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGNoX2diLmJ1ZmZlciwgIkEiKSkKLSAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9pbmRleCA9IDM7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGNoYW5uZWwgJS4yNTZzLlxuIiwgY2hfZ2IuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAobGF5ZXJfbWF0Y2gpIHsgLyogb25seSBzZWFyY2ggY2hhbm5lbCBpZiB0aGUgbGF5ZXIgbWF0Y2ggaXMgdmFsaWQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiUiIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKGNoX2diLmJ1ZmZlciwgIlgiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjaF9nYi5idWZmZXIsICJVIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aXNfbHVtYSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjaF9nYi5idWZmZXIsICJHIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKGNoX2diLmJ1ZmZlciwgIlYiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9pbmRleCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pc19sdW1hID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGNoX2diLmJ1ZmZlciwgIlkiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9pbmRleCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5pc19sdW1hID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGNoX2diLmJ1ZmZlciwgIkIiKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoY2hfZ2IuYnVmZmVyLCAiWiIpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChjaF9nYi5idWZmZXIsICJXIikpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaW5kZXggPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aXNfbHVtYSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjaF9nYi5idWZmZXIsICJBIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfaW5kZXggPSAzOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgY2hhbm5lbCAlLjI1NnMuXG4iLCBjaF9nYi5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLyogc2tpcCB1bnRpbCB5b3UgZ2V0IGEgMCAqLwogICAgICAgICAgICAgICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY2hfZ2IpID4gMCAmJgpAQCAtMTEyNSw2MSArMTQzMCw4MCBAQAogCiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjaF9nYikgPCA0KSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb21wbGV0ZSBoZWFkZXIuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjdXJyZW50X3BpeGVsX3R5cGUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmY2hfZ2IpOwogICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3BpeGVsX3R5cGUgPj0gRVhSX1VOS05PV04pIHsKICAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICJQaXhlbCB0eXBlICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9waXhlbF90eXBlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmNoX2diLCA0KTsKICAgICAgICAgICAgICAgICB4c3ViID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmNoX2diKTsKICAgICAgICAgICAgICAgICB5c3ViID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmNoX2diKTsKKwogICAgICAgICAgICAgICAgIGlmICh4c3ViICE9IDEgfHwgeXN1YiAhPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3Vic2FtcGxpbmcgJWR4JWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c3ViLCB5c3ViKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChjaGFubmVsX2luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hhbm5lbF9pbmRleCA+PSAwICYmIHMtPmNoYW5uZWxfb2Zmc2V0c1tjaGFubmVsX2luZGV4XSA9PSAtMSkgeyAvKiBjaGFubmVsIGhhcyBub3QgYmVlbiBwcmV2aW91c2x5IGFzc2lnbmVkICovCiAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5waXhlbF90eXBlICE9IEVYUl9VTktOT1dOICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBzLT5waXhlbF90eXBlICE9IGN1cnJlbnRfcGl4ZWxfdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJHQiBjaGFubmVscyBub3Qgb2YgdGhlIHNhbWUgZGVwdGguXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzLT5waXhlbF90eXBlICAgICAgICAgICAgICAgICAgICAgPSBjdXJyZW50X3BpeGVsX3R5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfb2Zmc2V0c1tjaGFubmVsX2luZGV4XSA9IGN1cnJlbnRfY2hhbm5lbF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfb2Zmc2V0c1tjaGFubmVsX2luZGV4XSA9IHMtPmN1cnJlbnRfY2hhbm5lbF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGFubmVsX2luZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk11bHRpcGxlIGNoYW5uZWxzIHdpdGggaW5kZXggJWQuXG4iLCBjaGFubmVsX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxzID0gYXZfcmVhbGxvYyhzLT5jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytzLT5uYl9jaGFubmVscyAqIHNpemVvZihFWFJDaGFubmVsKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFzLT5jaGFubmVscykKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjaGFubmVsICAgICAgICAgICAgID0gJnMtPmNoYW5uZWxzW3MtPm5iX2NoYW5uZWxzIC0gMV07CiAgICAgICAgICAgICAgICAgY2hhbm5lbC0+cGl4ZWxfdHlwZSA9IGN1cnJlbnRfcGl4ZWxfdHlwZTsKICAgICAgICAgICAgICAgICBjaGFubmVsLT54c3ViICAgICAgID0geHN1YjsKICAgICAgICAgICAgICAgICBjaGFubmVsLT55c3ViICAgICAgID0geXN1YjsKIAotICAgICAgICAgICAgICAgIGN1cnJlbnRfY2hhbm5lbF9vZmZzZXQgKz0gMSA8PCBjdXJyZW50X3BpeGVsX3R5cGU7CisgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRfcGl4ZWxfdHlwZSA9PSBFWFJfSEFMRikgeworICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X2NoYW5uZWxfb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsvKiBGbG9hdCBvciBVSU5UMzIgKi8KKyAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9jaGFubmVsX29mZnNldCArPSA0OworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogQ2hlY2sgaWYgYWxsIGNoYW5uZWxzIGFyZSBzZXQgd2l0aCBhbiBvZmZzZXQgb3IgaWYgdGhlIGNoYW5uZWxzCiAgICAgICAgICAgICAgKiBhcmUgY2F1c2luZyBhbiBvdmVyZmxvdyAgKi8KLSAgICAgICAgICAgIGlmIChGRk1JTjMocy0+Y2hhbm5lbF9vZmZzZXRzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsX29mZnNldHNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfb2Zmc2V0c1syXSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfb2Zmc2V0c1swXSA8IDApCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyByZWQgY2hhbm5lbC5cbiIpOwotICAgICAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX29mZnNldHNbMV0gPCAwKQotICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgZ3JlZW4gY2hhbm5lbC5cbiIpOwotICAgICAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX29mZnNldHNbMl0gPCAwKQotICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgYmx1ZSBjaGFubmVsLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoIXMtPmlzX2x1bWEpey8qIGlmIHdlIGV4cGVjdGVkIHRvIGhhdmUgYXQgbGVhc3QgMyBjaGFubmVscyAqLworICAgICAgICAgICAgICAgIGlmIChGRk1JTjMocy0+Y2hhbm5lbF9vZmZzZXRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9vZmZzZXRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9vZmZzZXRzWzJdKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfb2Zmc2V0c1swXSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcmVkIGNoYW5uZWwuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfb2Zmc2V0c1sxXSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgZ3JlZW4gY2hhbm5lbC5cbiIpOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9vZmZzZXRzWzJdIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBibHVlIGNoYW5uZWwuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2tpcCBvbmUgbGFzdCBieXRlIGFuZCB1cGRhdGUgbWFpbiBnYgpAQCAtMTE4Nyw4ICsxNTExLDEwIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIGlmICgodmFyX3NpemUgPSBjaGVja19oZWFkZXJfdmFyaWFibGUocywgImRhdGFXaW5kb3ciLCAiYm94MmkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSkpID49IDApIHsKLSAgICAgICAgICAgIGlmICghdmFyX3NpemUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoIXZhcl9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHMtPnhtaW4gICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5nYik7CiAgICAgICAgICAgICBzLT55bWluICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpOwpAQCAtMTIwMCw4ICsxNTI2LDEwIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIGlmICgodmFyX3NpemUgPSBjaGVja19oZWFkZXJfdmFyaWFibGUocywgImRpc3BsYXlXaW5kb3ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm94MmkiLCAzNCkpID49IDApIHsKLSAgICAgICAgICAgIGlmICghdmFyX3NpemUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoIXZhcl9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCA4KTsKICAgICAgICAgICAgIHMtPncgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpICsgMTsKQEAgLTEyMTEsMjkgKzE1MzksMzYgQEAKICAgICAgICAgfSBlbHNlIGlmICgodmFyX3NpemUgPSBjaGVja19oZWFkZXJfdmFyaWFibGUocywgImxpbmVPcmRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lT3JkZXIiLCAyNSkpID49IDApIHsKICAgICAgICAgICAgIGludCBsaW5lX29yZGVyOwotICAgICAgICAgICAgaWYgKCF2YXJfc2l6ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmICghdmFyX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbGluZV9vcmRlciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CiAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImxpbmUgb3JkZXI6ICVkLlxuIiwgbGluZV9vcmRlcik7CiAgICAgICAgICAgICBpZiAobGluZV9vcmRlciA+IDIpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gbGluZSBvcmRlci5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIGlmICgodmFyX3NpemUgPSBjaGVja19oZWFkZXJfdmFyaWFibGUocywgInBpeGVsQXNwZWN0UmF0aW8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQiLCAzMSkpID49IDApIHsKLSAgICAgICAgICAgIGlmICghdmFyX3NpemUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoIXZhcl9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHNhciA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5nYik7CiAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgaWYgKCh2YXJfc2l6ZSA9IGNoZWNrX2hlYWRlcl92YXJpYWJsZShzLCAiY29tcHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3Npb24iLCAyOSkpID49IDApIHsKLSAgICAgICAgICAgIGlmICghdmFyX3NpemUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBpZiAoIXZhcl9zaXplKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzLT5jb21wcmVzc2lvbiA9PSBFWFJfVU5LTikKICAgICAgICAgICAgICAgICBzLT5jb21wcmVzc2lvbiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CkBAIC0xMjQyLDEyICsxNTc3LDUxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBtb3JlIHRoYW4gb25lIGNvbXByZXNzaW9uIGF0dHJpYnV0ZS5cbiIpOwogCiAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmICgodmFyX3NpemUgPSBjaGVja19oZWFkZXJfdmFyaWFibGUocywgInRpbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbGVkZXNjIiwgMjIpKSA+PSAwKSB7CisgICAgICAgICAgICBjaGFyIHRpbGVMZXZlbDsKKworICAgICAgICAgICAgaWYgKCFzLT5pc190aWxlKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCB0aWxlIGF0dHJpYnV0ZSBhbmQgc2NhbmxpbmUgZmxhZ3MuIEV4ciB3aWxsIGJlIGludGVycHJldGVkIGFzIHNjYW5saW5lLlxuIik7CisKKyAgICAgICAgICAgIHMtPnRpbGVfYXR0ci54U2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZzLT5nYik7CisgICAgICAgICAgICBzLT50aWxlX2F0dHIueVNpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpOworCisgICAgICAgICAgICB0aWxlTGV2ZWwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgICAgICAgICAgcy0+dGlsZV9hdHRyLmxldmVsX21vZGUgPSB0aWxlTGV2ZWwgJiAweDBmOworICAgICAgICAgICAgcy0+dGlsZV9hdHRyLmxldmVsX3JvdW5kID0gKHRpbGVMZXZlbCA+PiA0KSAmIDB4MGY7CisKKyAgICAgICAgICAgIGlmIChzLT50aWxlX2F0dHIubGV2ZWxfbW9kZSA+PSBFWFJfVElMRV9MRVZFTF9VTktOT1dOKXsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIlRpbGUgbGV2ZWwgbW9kZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dGlsZV9hdHRyLmxldmVsX21vZGUpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPnRpbGVfYXR0ci5sZXZlbF9yb3VuZCA+PSBFWFJfVElMRV9ST1VORF9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICJUaWxlIGxldmVsIHJvdW5kICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50aWxlX2F0dHIubGV2ZWxfcm91bmQpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoKHZhcl9zaXplID0gY2hlY2tfaGVhZGVyX3ZhcmlhYmxlKHMsICJ3cml0ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nIiwgMSkpID49IDApIHsKKyAgICAgICAgICAgIHVpbnQ4X3Qga2V5WzI1Nl0gPSB7IDAgfTsKKworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcy0+Z2IsIGtleSwgRkZNSU4oc2l6ZW9mKGtleSkgLSAxLCB2YXJfc2l6ZSkpOworICAgICAgICAgICAgYXZfZGljdF9zZXQoJm1ldGFkYXRhLCAid3JpdGVyIiwga2V5LCAwKTsKKworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgZW5vdWdoIGJ5dGVzIGZvciBhIGhlYWRlcgogICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8PSA5KSB7CiAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29tcGxldGUgaGVhZGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIFByb2Nlc3MgdW5rbm93biB2YXJpYWJsZXMKQEAgLTEyNjIsMTggKzE2MzYsMzIgQEAKIAogICAgIGlmIChzLT5jb21wcmVzc2lvbiA9PSBFWFJfVU5LTikgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgY29tcHJlc3Npb24gYXR0cmlidXRlLlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQotICAgIHMtPnNjYW5fbGluZV9zaXplID0gcy0+eGRlbHRhICogY3VycmVudF9jaGFubmVsX29mZnNldDsKKworICAgIGlmIChzLT5pc190aWxlKSB7CisgICAgICAgIGlmIChzLT50aWxlX2F0dHIueFNpemUgPCAxIHx8IHMtPnRpbGVfYXR0ci55U2l6ZSA8IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB0aWxlIGF0dHJpYnV0ZS5cbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDw9IDApIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvbXBsZXRlIGZyYW1lLlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCisgICAgZnJhbWUtPm1ldGFkYXRhID0gbWV0YWRhdGE7CisKICAgICAvLyBhYWFuZCB3ZSBhcmUgZG9uZQogICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCAxKTsKICAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfZGljdF9mcmVlKCZtZXRhZGF0YSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLApAQCAtMTI4NiwyNCArMTY3NCwzNCBAQAogCiAgICAgaW50IHksIHJldDsKICAgICBpbnQgb3V0X2xpbmVfc2l6ZTsKLSAgICBpbnQgc2Nhbl9saW5lX2Jsb2NrczsKKyAgICBpbnQgbmJfYmxvY2tzOyAgIC8qIG5iIHNjYW5saW5lIG9yIG5iIHRpbGUgKi8KKyAgICB1aW50NjRfdCBzdGFydF9vZmZzZXRfdGFibGU7CisgICAgdWludDY0X3Qgc3RhcnRfbmV4dF9zY2FubGluZTsKKyAgICBQdXRCeXRlQ29udGV4dCBvZmZzZXRfdGFibGVfd3JpdGVyOwogCiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CiAKLSAgICBpZiAoKHJldCA9IGRlY29kZV9oZWFkZXIocykpIDwgMCkKKyAgICBpZiAoKHJldCA9IGRlY29kZV9oZWFkZXIocywgcGljdHVyZSkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIHN3aXRjaCAocy0+cGl4ZWxfdHlwZSkgewogICAgIGNhc2UgRVhSX0ZMT0FUOgogICAgIGNhc2UgRVhSX0hBTEY6Ci0gICAgICAgIGlmIChzLT5jaGFubmVsX29mZnNldHNbM10gPj0gMCkKLSAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0JBNjQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I0ODsKLSAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBFWFJfVUlOVDoKLSAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiMzItYml0IHVuc2lnbmVkIGludCIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIGlmIChzLT5jaGFubmVsX29mZnNldHNbM10gPj0gMCkgeworICAgICAgICAgICAgaWYgKCFzLT5pc19sdW1hKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQkE2NDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lBMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXMtPmlzX2x1bWEpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIGNoYW5uZWwgbGlzdC5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTEzMjMsNiArMTcyMSw4IEBACiAgICAgICAgIHMtPnNjYW5fbGluZXNfcGVyX2Jsb2NrID0gMTY7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRVhSX1BJWjoKKyAgICBjYXNlIEVYUl9CNDQ6CisgICAgY2FzZSBFWFJfQjQ0QToKICAgICAgICAgcy0+c2Nhbl9saW5lc19wZXJfYmxvY2sgPSAzMjsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTEzNDgsMTUgKzE3NDgsNDAgQEAKICAgICBpZiAoIXMtPmRlc2MpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIG91dF9saW5lX3NpemUgICAgPSBhdmN0eC0+d2lkdGggKiAyICogcy0+ZGVzYy0+bmJfY29tcG9uZW50czsKLSAgICBzY2FuX2xpbmVfYmxvY2tzID0gKHMtPnlkZWx0YSArIHMtPnNjYW5fbGluZXNfcGVyX2Jsb2NrIC0gMSkgLwotICAgICAgICAgICAgICAgICAgICAgICBzLT5zY2FuX2xpbmVzX3Blcl9ibG9jazsKKworICAgIGlmIChzLT5pc190aWxlKSB7CisgICAgICAgIG5iX2Jsb2NrcyA9ICgocy0+eGRlbHRhICsgcy0+dGlsZV9hdHRyLnhTaXplIC0gMSkgLyBzLT50aWxlX2F0dHIueFNpemUpICoKKyAgICAgICAgKChzLT55ZGVsdGEgKyBzLT50aWxlX2F0dHIueVNpemUgLSAxKSAvIHMtPnRpbGVfYXR0ci55U2l6ZSk7CisgICAgfSBlbHNlIHsgLyogc2NhbmxpbmUgKi8KKyAgICAgICAgbmJfYmxvY2tzID0gKHMtPnlkZWx0YSArIHMtPnNjYW5fbGluZXNfcGVyX2Jsb2NrIC0gMSkgLworICAgICAgICBzLT5zY2FuX2xpbmVzX3Blcl9ibG9jazsKKyAgICB9CiAKICAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZnJhbWUsIDApKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IHNjYW5fbGluZV9ibG9ja3MgKiA4KQorICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDwgbmJfYmxvY2tzICogOCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKKyAgICAvLyBjaGVjayBvZmZzZXQgdGFibGUgYW5kIHJlY3JlYXRlIGl0IGlmIG5lZWQKKyAgICBpZiAoIXMtPmlzX3RpbGUgJiYgYnl0ZXN0cmVhbTJfcGVla19sZTY0KCZzLT5nYikgPT0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInJlY3JlYXRpbmcgaW52YWxpZCBzY2FubGluZSBvZmZzZXQgdGFibGVcbiIpOworCisgICAgICAgIHN0YXJ0X29mZnNldF90YWJsZSA9IGJ5dGVzdHJlYW0yX3RlbGwoJnMtPmdiKTsKKyAgICAgICAgc3RhcnRfbmV4dF9zY2FubGluZSA9IHN0YXJ0X29mZnNldF90YWJsZSArIG5iX2Jsb2NrcyAqIDg7CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZvZmZzZXRfdGFibGVfd3JpdGVyLCAmYXZwa3QtPmRhdGFbc3RhcnRfb2Zmc2V0X3RhYmxlXSwgbmJfYmxvY2tzICogOCk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IG5iX2Jsb2NrczsgeSsrKSB7CisgICAgICAgICAgICAvKiB3cml0ZSBvZmZzZXQgb2YgcHJldiBzY2FubGluZSBpbiBvZmZzZXQgdGFibGUgKi8KKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTY0KCZvZmZzZXRfdGFibGVfd3JpdGVyLCBzdGFydF9uZXh0X3NjYW5saW5lKTsKKworICAgICAgICAgICAgLyogZ2V0IGxlbiBvZiBuZXh0IHNjYW5saW5lICovCisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgc3RhcnRfbmV4dF9zY2FubGluZSArIDQsIFNFRUtfU0VUKTsvKiBza2lwIGxpbmUgbnVtYmVyICovCisgICAgICAgICAgICBzdGFydF9uZXh0X3NjYW5saW5lICs9IChieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpICsgOCk7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2Vlaygmcy0+Z2IsIHN0YXJ0X29mZnNldF90YWJsZSwgU0VFS19TRVQpOworICAgIH0KKwogICAgIC8vIHNhdmUgcG9pbnRlciB3ZSBhcmUgZ29pbmcgdG8gdXNlIGluIGRlY29kZV9ibG9jawogICAgIHMtPmJ1ZiAgICAgID0gYXZwa3QtPmRhdGE7CiAgICAgcy0+YnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKQEAgLTEzNjksOSArMTc5NCwxMSBAQAogICAgIH0KIAogICAgIHMtPnBpY3R1cmUgPSBwaWN0dXJlOwotICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgZGVjb2RlX2Jsb2NrLCBzLT50aHJlYWRfZGF0YSwgTlVMTCwgc2Nhbl9saW5lX2Jsb2Nrcyk7CisKKyAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIGRlY29kZV9ibG9jaywgcy0+dGhyZWFkX2RhdGEsIE5VTEwsIG5iX2Jsb2Nrcyk7CiAKICAgICAvLyBaZXJvIG91dCB0aGUgZW5kIGlmIHltYXgrMSBpcyBub3QgaAorICAgIHB0ciA9IHBpY3R1cmUtPmRhdGFbMF0gKyAoKHMtPnltYXgrMSkgKiBwaWN0dXJlLT5saW5lc2l6ZVswXSk7CiAgICAgZm9yICh5ID0gcy0+eW1heCArIDE7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKICAgICAgICAgbWVtc2V0KHB0ciwgMCwgb3V0X2xpbmVfc2l6ZSk7CiAgICAgICAgIHB0ciArPSBwaWN0dXJlLT5saW5lc2l6ZVswXTsKQEAgLTEzOTMsNiArMTgyMCwxMiBAQAogCiAgICAgcy0+YXZjdHggICAgICAgICAgICAgID0gYXZjdHg7CiAKKyAgICBmZl9leHJkc3BfaW5pdCgmcy0+ZHNwKTsKKworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgZmZfYnN3YXBkc3BfaW5pdCgmcy0+YmJkc3ApOworI2VuZGlmCisKICAgICB0cmNfZnVuYyA9IGF2cHJpdl9nZXRfdHJjX2Z1bmN0aW9uX2Zyb21fdHJjKHMtPmFwcGx5X3RyY190eXBlKTsKICAgICBpZiAodHJjX2Z1bmMpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY1NTM2OyArK2kpIHsKQEAgLTE0MTgsNyArMTg1MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBhbGxvY2F0ZSB0aHJlYWQgZGF0YSwgdXNlZCBmb3Igbm9uIEVYUl9SQVcgY29tcHJlZXNpb24gdHlwZXMKKyAgICAvLyBhbGxvY2F0ZSB0aHJlYWQgZGF0YSwgdXNlZCBmb3Igbm9uIEVYUl9SQVcgY29tcHJlc3Npb24gdHlwZXMKICAgICBzLT50aHJlYWRfZGF0YSA9IGF2X21hbGxvY3pfYXJyYXkoYXZjdHgtPnRocmVhZF9jb3VudCwgc2l6ZW9mKEVYUlRocmVhZERhdGEpKTsKICAgICBpZiAoIXMtPnRocmVhZF9kYXRhKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTE0MzAsNyArMTg2Myw3IEBACiBzdGF0aWMgaW50IGRlY29kZV9pbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsgICAgRVhSQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKLSAgICAvLyBhbGxvY2F0ZSB0aHJlYWQgZGF0YSwgdXNlZCBmb3Igbm9uIEVYUl9SQVcgY29tcHJlZXNpb24gdHlwZXMKKyAgICAvLyBhbGxvY2F0ZSB0aHJlYWQgZGF0YSwgdXNlZCBmb3Igbm9uIEVYUl9SQVcgY29tcHJlc3Npb24gdHlwZXMKICAgICBzLT50aHJlYWRfZGF0YSA9IGF2X21hbGxvY3pfYXJyYXkoYXZjdHgtPnRocmVhZF9jb3VudCwgc2l6ZW9mKEVYUlRocmVhZERhdGEpKTsKICAgICBpZiAoIXMtPnRocmVhZF9kYXRhKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZXhyZHNwLmMgYi9saWJhdmNvZGVjL2V4cmRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGJmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2V4cmRzcC5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA2IEluZHVzdHJpYWwgTGlnaHQgJiBNYWdpYywgYSBkaXZpc2lvbiBvZiBMdWNhcyBEaWdpdGFsIEx0ZC4gTExDCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJleHJkc3AuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworc3RhdGljIHZvaWQgcmVvcmRlcl9waXhlbHNfc2NhbGFyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc2l6ZSkKK3sKKyAgICBjb25zdCB1aW50OF90ICp0MSA9IHNyYzsKKyAgICBpbnQgaGFsZl9zaXplICAgICA9IHNpemUgLyAyOworICAgIGNvbnN0IHVpbnQ4X3QgKnQyID0gc3JjICsgaGFsZl9zaXplOworICAgIHVpbnQ4X3QgKnMgICAgICAgID0gZHN0OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGhhbGZfc2l6ZTsgaSsrKSB7CisgICAgICAgICoocysrKSA9ICoodDErKyk7CisgICAgICAgICoocysrKSA9ICoodDIrKyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVkaWN0b3Jfc2NhbGFyKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNpemUpCit7CisgICAgcHRyZGlmZl90IGk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgICBzcmNbaV0gKz0gc3JjW2ktMV0gLSAxMjg7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9leHJkc3BfaW5pdChFeHJEU1BDb250ZXh0ICpjKQoreworICAgIGMtPnJlb3JkZXJfcGl4ZWxzICAgPSByZW9yZGVyX3BpeGVsc19zY2FsYXI7CisgICAgYy0+cHJlZGljdG9yICAgICAgICA9IHByZWRpY3Rvcl9zY2FsYXI7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2V4cmRzcF9pbml0X3g4NihjKTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZXhyZHNwLmggYi9saWJhdmNvZGVjL2V4cmRzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNGRjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2V4cmRzcC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0VYUkRTUF9ICisjZGVmaW5lIEFWQ09ERUNfRVhSRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgRXhyRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKnJlb3JkZXJfcGl4ZWxzKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNpemUpOworICAgIHZvaWQgKCpwcmVkaWN0b3IpKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNpemUpOworfSBFeHJEU1BDb250ZXh0OworCit2b2lkIGZmX2V4cmRzcF9pbml0KEV4ckRTUENvbnRleHQgKmMpOwordm9pZCBmZl9leHJkc3BfaW5pdF94ODYoRXhyRFNQQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0VYUkRTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2V4dHJhY3RfZXh0cmFkYXRhX2JzZi5jIGIvbGliYXZjb2RlYy9leHRyYWN0X2V4dHJhZGF0YV9ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJiM2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9leHRyYWN0X2V4dHJhZGF0YV9ic2YuYwpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCisjaW5jbHVkZSAiaDI2NDVfcGFyc2UuaCIKKyNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiaGV2Yy5oIgorI2luY2x1ZGUgInZjMV9jb21tb24uaCIKKwordHlwZWRlZiBzdHJ1Y3QgRXh0cmFjdEV4dHJhZGF0YUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgaW50ICgqZXh0cmFjdCkoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKmRhdGEsIGludCAqc2l6ZSk7CisKKyAgICAvKiBIMjY0L0hFVkMgc3BlY2lmYyBmaWVsZHMgKi8KKyAgICBIMjY0NVBhY2tldCBoMjY0NV9wa3Q7CisKKyAgICAvKiBBVk9wdGlvbnMgKi8KKyAgICBpbnQgcmVtb3ZlOworfSBFeHRyYWN0RXh0cmFkYXRhQ29udGV4dDsKKworc3RhdGljIGludCB2YWxfaW5fYXJyYXkoY29uc3QgaW50ICphcnIsIGludCBsZW4sIGludCB2YWwpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBpZiAoYXJyW2ldID09IHZhbCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dHJhY3RfZXh0cmFkYXRhX2gyNjQ1KEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZGF0YSwgaW50ICpzaXplKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgZXh0cmFkYXRhX25hbF90eXBlc19oZXZjW10gPSB7CisgICAgICAgIEhFVkNfTkFMX1ZQUywgSEVWQ19OQUxfU1BTLCBIRVZDX05BTF9QUFMsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGV4dHJhZGF0YV9uYWxfdHlwZXNfaDI2NFtdID0geworICAgICAgICBIMjY0X05BTF9TUFMsIEgyNjRfTkFMX1BQUywKKyAgICB9OworCisgICAgRXh0cmFjdEV4dHJhZGF0YUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKworICAgIGludCBleHRyYWRhdGFfc2l6ZSA9IDAsIGZpbHRlcmVkX3NpemUgPSAwOworICAgIGNvbnN0IGludCAqZXh0cmFkYXRhX25hbF90eXBlczsKKyAgICBpbnQgbmJfZXh0cmFkYXRhX25hbF90eXBlczsKKyAgICBpbnQgaSwgaGFzX3NwcyA9IDAsIGhhc192cHMgPSAwLCByZXQgPSAwOworCisgICAgaWYgKGN0eC0+cGFyX2luLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDKSB7CisgICAgICAgIGV4dHJhZGF0YV9uYWxfdHlwZXMgICAgPSBleHRyYWRhdGFfbmFsX3R5cGVzX2hldmM7CisgICAgICAgIG5iX2V4dHJhZGF0YV9uYWxfdHlwZXMgPSBGRl9BUlJBWV9FTEVNUyhleHRyYWRhdGFfbmFsX3R5cGVzX2hldmMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGV4dHJhZGF0YV9uYWxfdHlwZXMgICAgPSBleHRyYWRhdGFfbmFsX3R5cGVzX2gyNjQ7CisgICAgICAgIG5iX2V4dHJhZGF0YV9uYWxfdHlwZXMgPSBGRl9BUlJBWV9FTEVNUyhleHRyYWRhdGFfbmFsX3R5cGVzX2gyNjQpOworICAgIH0KKworICAgIHJldCA9IGZmX2gyNjQ1X3BhY2tldF9zcGxpdCgmcy0+aDI2NDVfcGt0LCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LCAwLCAwLCBjdHgtPnBhcl9pbi0+Y29kZWNfaWQsIDEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmgyNjQ1X3BrdC5uYl9uYWxzOyBpKyspIHsKKyAgICAgICAgSDI2NDVOQUwgKm5hbCA9ICZzLT5oMjY0NV9wa3QubmFsc1tpXTsKKyAgICAgICAgaWYgKHZhbF9pbl9hcnJheShleHRyYWRhdGFfbmFsX3R5cGVzLCBuYl9leHRyYWRhdGFfbmFsX3R5cGVzLCBuYWwtPnR5cGUpKSB7CisgICAgICAgICAgICBleHRyYWRhdGFfc2l6ZSArPSBuYWwtPnJhd19zaXplICsgMzsKKyAgICAgICAgICAgIGlmIChjdHgtPnBhcl9pbi0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQykgeworICAgICAgICAgICAgICAgIGlmIChuYWwtPnR5cGUgPT0gSEVWQ19OQUxfU1BTKSBoYXNfc3BzID0gMTsKKyAgICAgICAgICAgICAgICBpZiAobmFsLT50eXBlID09IEhFVkNfTkFMX1ZQUykgaGFzX3ZwcyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChuYWwtPnR5cGUgPT0gSDI2NF9OQUxfU1BTKSBoYXNfc3BzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzLT5yZW1vdmUpIHsKKyAgICAgICAgICAgIGZpbHRlcmVkX3NpemUgKz0gbmFsLT5yYXdfc2l6ZSArIDM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZXh0cmFkYXRhX3NpemUgJiYKKyAgICAgICAgKChjdHgtPnBhcl9pbi0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQyAmJiBoYXNfc3BzICYmIGhhc192cHMpIHx8CisgICAgICAgICAoY3R4LT5wYXJfaW4tPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYgaGFzX3NwcykpKSB7CisgICAgICAgIEFWQnVmZmVyUmVmICpmaWx0ZXJlZF9idWY7CisgICAgICAgIHVpbnQ4X3QgKmV4dHJhZGF0YSwgKmZpbHRlcmVkX2RhdGE7CisKKyAgICAgICAgaWYgKHMtPnJlbW92ZSkgeworICAgICAgICAgICAgZmlsdGVyZWRfYnVmID0gYXZfYnVmZmVyX2FsbG9jKGZpbHRlcmVkX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghZmlsdGVyZWRfYnVmKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChmaWx0ZXJlZF9idWYtPmRhdGEgKyBmaWx0ZXJlZF9zaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSA9IGZpbHRlcmVkX2J1Zi0+ZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIGV4dHJhZGF0YSA9IGF2X21hbGxvYyhleHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWV4dHJhZGF0YSkgeworICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmaWx0ZXJlZF9idWYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQoZXh0cmFkYXRhICsgZXh0cmFkYXRhX3NpemUsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgICAgICpkYXRhID0gZXh0cmFkYXRhOworICAgICAgICAqc2l6ZSA9IGV4dHJhZGF0YV9zaXplOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oMjY0NV9wa3QubmJfbmFsczsgaSsrKSB7CisgICAgICAgICAgICBIMjY0NU5BTCAqbmFsID0gJnMtPmgyNjQ1X3BrdC5uYWxzW2ldOworICAgICAgICAgICAgaWYgKHZhbF9pbl9hcnJheShleHRyYWRhdGFfbmFsX3R5cGVzLCBuYl9leHRyYWRhdGFfbmFsX3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnR5cGUpKSB7CisgICAgICAgICAgICAgICAgQVZfV0IyNChleHRyYWRhdGEsIDEpOyAvLyBzdGFydGNvZGUKKyAgICAgICAgICAgICAgICBtZW1jcHkoZXh0cmFkYXRhICsgMywgbmFsLT5yYXdfZGF0YSwgbmFsLT5yYXdfc2l6ZSk7CisgICAgICAgICAgICAgICAgZXh0cmFkYXRhICs9IDMgKyBuYWwtPnJhd19zaXplOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5yZW1vdmUpIHsKKyAgICAgICAgICAgICAgICBBVl9XQjI0KGZpbHRlcmVkX2RhdGEsIDEpOyAvLyBzdGFydGNvZGUKKyAgICAgICAgICAgICAgICBtZW1jcHkoZmlsdGVyZWRfZGF0YSArIDMsIG5hbC0+cmF3X2RhdGEsIG5hbC0+cmF3X3NpemUpOworICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEgKz0gMyArIG5hbC0+cmF3X3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+cmVtb3ZlKSB7CisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnBrdC0+YnVmKTsKKyAgICAgICAgICAgIHBrdC0+YnVmICA9IGZpbHRlcmVkX2J1ZjsKKyAgICAgICAgICAgIHBrdC0+ZGF0YSA9IGZpbHRlcmVkX2J1Zi0+ZGF0YTsKKyAgICAgICAgICAgIHBrdC0+c2l6ZSA9IGZpbHRlcmVkX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHRyYWN0X2V4dHJhZGF0YV92YzEoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZGF0YSwgaW50ICpzaXplKQoreworICAgIEV4dHJhY3RFeHRyYWRhdGFDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gcGt0LT5kYXRhLCAqZW5kID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOworICAgIHVpbnQzMl90IHN0YXRlID0gVUlOVDMyX01BWDsKKyAgICBpbnQgaGFzX2V4dHJhZGF0YSA9IDAsIGV4dHJhZGF0YV9zaXplID0gMDsKKworICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKKyAgICAgICAgcHRyID0gYXZwcml2X2ZpbmRfc3RhcnRfY29kZShwdHIsIGVuZCwgJnN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlID09IFZDMV9DT0RFX1NFUUhEUiB8fCBzdGF0ZSA9PSBWQzFfQ09ERV9FTlRSWVBPSU5UKSB7CisgICAgICAgICAgICBoYXNfZXh0cmFkYXRhID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChoYXNfZXh0cmFkYXRhICYmIElTX01BUktFUihzdGF0ZSkpIHsKKyAgICAgICAgICAgIGV4dHJhZGF0YV9zaXplID0gcHRyIC0gNCAtIHBrdC0+ZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgICpkYXRhID0gYXZfbWFsbG9jKGV4dHJhZGF0YV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghKmRhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIG1lbWNweSgqZGF0YSwgcGt0LT5kYXRhLCBleHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIG1lbXNldCgqZGF0YSArIGV4dHJhZGF0YV9zaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgKnNpemUgPSBleHRyYWRhdGFfc2l6ZTsKKworICAgICAgICBpZiAocy0+cmVtb3ZlKSB7CisgICAgICAgICAgICBwa3QtPmRhdGEgKz0gZXh0cmFkYXRhX3NpemU7CisgICAgICAgICAgICBwa3QtPnNpemUgLT0gZXh0cmFkYXRhX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHRyYWN0X2V4dHJhZGF0YV9tcGVnMTIoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKmRhdGEsIGludCAqc2l6ZSkKK3sKKyAgICBFeHRyYWN0RXh0cmFkYXRhQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQzMl90IHN0YXRlID0gVUlOVDMyX01BWDsKKyAgICBpbnQgaSwgZm91bmQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHBrdC0+c2l6ZTsgaSsrKSB7CisgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgcGt0LT5kYXRhW2ldOworICAgICAgICBpZiAoc3RhdGUgPT0gMHgxQjMpCisgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgIGVsc2UgaWYgKGZvdW5kICYmIHN0YXRlICE9IDB4MUI1ICYmIHN0YXRlIDwgMHgyMDAgJiYgc3RhdGUgPj0gMHgxMDApIHsKKyAgICAgICAgICAgIGlmIChpID4gMykgeworICAgICAgICAgICAgICAgICpzaXplID0gaSAtIDM7CisgICAgICAgICAgICAgICAgKmRhdGEgPSBhdl9tYWxsb2MoKnNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoISpkYXRhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICAgICAgbWVtY3B5KCpkYXRhLCBwa3QtPmRhdGEsICpzaXplKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoKmRhdGEgKyAqc2l6ZSwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+cmVtb3ZlKSB7CisgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YSArPSAqc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5zaXplIC09ICpzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dHJhY3RfZXh0cmFkYXRhX21wZWc0KEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqZGF0YSwgaW50ICpzaXplKQoreworICAgIEV4dHJhY3RFeHRyYWRhdGFDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgdWludDhfdCAqcHRyID0gcGt0LT5kYXRhLCAqZW5kID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOworICAgIHVpbnQzMl90IHN0YXRlID0gVUlOVDMyX01BWDsKKworICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKKyAgICAgICAgcHRyID0gYXZwcml2X2ZpbmRfc3RhcnRfY29kZShwdHIsIGVuZCwgJnN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlID09IDB4MUIzIHx8IHN0YXRlID09IDB4MUI2KSB7CisgICAgICAgICAgICBpZiAocHRyIC0gcGt0LT5kYXRhID4gNCkgeworICAgICAgICAgICAgICAgICpzaXplID0gcHRyIC0gNCAtIHBrdC0+ZGF0YTsKKyAgICAgICAgICAgICAgICAqZGF0YSA9IGF2X21hbGxvYygqc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgIGlmICghKmRhdGEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoKmRhdGEsIHBrdC0+ZGF0YSwgKnNpemUpOworICAgICAgICAgICAgICAgIG1lbXNldCgqZGF0YSArICpzaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5yZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgcGt0LT5kYXRhICs9ICpzaXplOworICAgICAgICAgICAgICAgICAgICBwa3QtPnNpemUgLT0gKnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGVudW0gQVZDb2RlY0lEIGlkOworICAgIGludCAoKmV4dHJhY3QpKEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipkYXRhLCBpbnQgKnNpemUpOworfSBleHRyYWN0X3RhYltdID0geworICAgIHsgQVZfQ09ERUNfSURfQ0FWUywgICAgICAgZXh0cmFjdF9leHRyYWRhdGFfbXBlZzQgICB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgICAgZXh0cmFjdF9leHRyYWRhdGFfaDI2NDUgICB9LAorICAgIHsgQVZfQ09ERUNfSURfSEVWQywgICAgICAgZXh0cmFjdF9leHRyYWRhdGFfaDI2NDUgICB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgZXh0cmFjdF9leHRyYWRhdGFfbXBlZzEyICB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgZXh0cmFjdF9leHRyYWRhdGFfbXBlZzEyICB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgZXh0cmFjdF9leHRyYWRhdGFfbXBlZzQgICB9LAorICAgIHsgQVZfQ09ERUNfSURfVkMxLCAgICAgICAgZXh0cmFjdF9leHRyYWRhdGFfdmMxICAgICB9LAorfTsKKworc3RhdGljIGludCBleHRyYWN0X2V4dHJhZGF0YV9pbml0KEFWQlNGQ29udGV4dCAqY3R4KQoreworICAgIEV4dHJhY3RFeHRyYWRhdGFDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZXh0cmFjdF90YWIpOyBpKyspIHsKKyAgICAgICAgaWYgKGV4dHJhY3RfdGFiW2ldLmlkID09IGN0eC0+cGFyX2luLT5jb2RlY19pZCkgeworICAgICAgICAgICAgcy0+ZXh0cmFjdCA9IGV4dHJhY3RfdGFiW2ldLmV4dHJhY3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXMtPmV4dHJhY3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dHJhY3RfZXh0cmFkYXRhX2ZpbHRlcihBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBFeHRyYWN0RXh0cmFkYXRhQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmV4dHJhZGF0YSA9IE5VTEw7CisgICAgaW50IGV4dHJhZGF0YV9zaXplOworICAgIGludCByZXQgPSAwOworCisgICAgcmV0ID0gZmZfYnNmX2dldF9wYWNrZXRfcmVmKGN0eCwgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IHMtPmV4dHJhY3QoY3R4LCBwa3QsICZleHRyYWRhdGEsICZleHRyYWRhdGFfc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChleHRyYWRhdGEpIHsKKyAgICAgICAgcmV0ID0gYXZfcGFja2V0X2FkZF9zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9ORVdfRVhUUkFEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWRhdGEsIGV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZleHRyYWRhdGEpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZXh0cmFjdF9leHRyYWRhdGFfY2xvc2UoQVZCU0ZDb250ZXh0ICpjdHgpCit7CisgICAgRXh0cmFjdEV4dHJhZGF0YUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBmZl9oMjY0NV9wYWNrZXRfdW5pbml0KCZzLT5oMjY0NV9wa3QpOworfQorCitzdGF0aWMgY29uc3QgZW51bSBBVkNvZGVjSUQgY29kZWNfaWRzW10gPSB7CisgICAgQVZfQ09ERUNfSURfQ0FWUywKKyAgICBBVl9DT0RFQ19JRF9IMjY0LAorICAgIEFWX0NPREVDX0lEX0hFVkMsCisgICAgQVZfQ09ERUNfSURfTVBFRzFWSURFTywKKyAgICBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIEFWX0NPREVDX0lEX01QRUc0LAorICAgIEFWX0NPREVDX0lEX1ZDMSwKKyAgICBBVl9DT0RFQ19JRF9OT05FLAorfTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRXh0cmFjdEV4dHJhZGF0YUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19CU0ZfUEFSQU0pCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInJlbW92ZSIsICJyZW1vdmUgdGhlIGV4dHJhZGF0YSBmcm9tIHRoZSBiaXRzdHJlYW0iLCBPRkZTRVQocmVtb3ZlKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBleHRyYWN0X2V4dHJhZGF0YV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJleHRyYWN0X2V4dHJhZGF0YSIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9leHRyYWN0X2V4dHJhZGF0YV9ic2YgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImV4dHJhY3RfZXh0cmFkYXRhIiwKKyAgICAuY29kZWNfaWRzICAgICAgPSBjb2RlY19pZHMsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEV4dHJhY3RFeHRyYWRhdGFDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZXh0cmFjdF9leHRyYWRhdGFfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gZXh0cmFjdF9leHRyYWRhdGFfaW5pdCwKKyAgICAuZmlsdGVyICAgICAgICAgPSBleHRyYWN0X2V4dHJhZGF0YV9maWx0ZXIsCisgICAgLmNsb3NlICAgICAgICAgID0gZXh0cmFjdF9leHRyYWRhdGFfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mYWFuZGN0LmMgYi9saWJhdmNvZGVjL2ZhYW5kY3QuYwppbmRleCBiNjgzMDcyLi4zOGMzOTJiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZhYW5kY3QuYworKysgYi9saWJhdmNvZGVjL2ZhYW5kY3QuYwpAQCAtOTYsMTcgKzk2LDkgQEAKICAgICAgICAgdG1wNSArPSB0bXA2OwogICAgICAgICB0bXA2ICs9IHRtcDc7CiAKLSNpZiAwCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZMT0FUIHo1OwotICAgICAgICAgICAgejUgPSAodG1wNCAtIHRtcDYpICogQTU7Ci0gICAgICAgICAgICB6MiA9ICB0bXA0ICAgICAgICAgKiBBMiArIHo1OwotICAgICAgICAgICAgejQgPSAgdG1wNiAgICAgICAgICogQTQgKyB6NTsKLSAgICAgICAgfQotI2Vsc2UKICAgICAgICAgejI9IHRtcDQqKEEyK0E1KSAtIHRtcDYqQTU7CiAgICAgICAgIHo0PSB0bXA2KihBNC1BNSkgKyB0bXA0KkE1OwotI2VuZGlmCisKICAgICAgICAgdG1wNSo9QTE7CiAKICAgICAgICAgejExPSB0bXA3ICsgdG1wNTsKQEAgLTE1OCwxNyArMTUwLDkgQEAKICAgICAgICAgdG1wNSArPSB0bXA2OwogICAgICAgICB0bXA2ICs9IHRtcDc7CiAKLSNpZiAwCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZMT0FUIHo1OwotICAgICAgICAgICAgejUgPSAodG1wNCAtIHRtcDYpICogQTU7Ci0gICAgICAgICAgICB6MiA9ICB0bXA0ICAgICAgICAgKiBBMiArIHo1OwotICAgICAgICAgICAgejQgPSAgdG1wNiAgICAgICAgICogQTQgKyB6NTsKLSAgICAgICAgfQotI2Vsc2UKICAgICAgICAgejI9IHRtcDQqKEEyK0E1KSAtIHRtcDYqQTU7CiAgICAgICAgIHo0PSB0bXA2KihBNC1BNSkgKyB0bXA0KkE1OwotI2VuZGlmCisKICAgICAgICAgdG1wNSo9QTE7CiAKICAgICAgICAgejExPSB0bXA3ICsgdG1wNTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZmFhbmlkY3QuYyBiL2xpYmF2Y29kZWMvZmFhbmlkY3QuYwppbmRleCBiYmFhYTNmLi4zOTIxZjgyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZhYW5pZGN0LmMKKysrIGIvbGliYXZjb2RlYy9mYWFuaWRjdC5jCkBAIC00Nyw3ICs0Nyw5IEBACiBCNypCMC84LCBCNypCMS84LCBCNypCMi84LCBCNypCMy84LCBCNypCNC84LCBCNypCNS84LCBCNypCNi84LCBCNypCNy84LAogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIHA4aWRjdChpbnQxNl90IGRhdGFbNjRdLCBGTE9BVCB0ZW1wWzY0XSwgdWludDhfdCAqZGVzdCwgaW50IHN0cmlkZSwgaW50IHgsIGludCB5LCBpbnQgdHlwZSl7CitzdGF0aWMgaW5saW5lIHZvaWQgcDhpZGN0KGludDE2X3QgZGF0YVs2NF0sIEZMT0FUIHRlbXBbNjRdLCB1aW50OF90ICpkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgeCwgaW50IHksIGludCB0eXBlKQorewogICAgIGludCBpOwogICAgIEZMT0FUIHMwNCwgZDA0LCBzMTcsIGQxNywgczI2LCBkMjYsIHM1MywgZDUzOwogICAgIEZMT0FUIG9zMDcsIG9zMTYsIG9zMjUsIG9zMzQ7CkBAIC02MiwxNyArNjQsOCBAQAogICAgICAgICBvZDA3PSAgczE3ICsgczUzOwogICAgICAgICBvZDI1PSAoczE3IC0gczUzKSooMipBNCk7CiAKLSNpZiAwIC8vdGhlc2UgMiBhcmUgZXF1aXZhbGVudAotICAgICAgICB7Ci0gICAgICAgICAgICBGTE9BVCB0bXAwOwotICAgICAgICAgICAgdG1wMCA9IChkMTcgKyBkNTMpICogICgyICogQTIpOwotICAgICAgICAgICAgb2QzNCA9ICBkMTcgICAgICAgICogICgyICogQjYpIC0gdG1wMDsKLSAgICAgICAgICAgIG9kMTYgPSAgZDUzICAgICAgICAqICgtMiAqIEIyKSArIHRtcDA7Ci0gICAgICAgIH0KLSNlbHNlCiAgICAgICAgIG9kMzQ9ICBkMTcqKDIqKEI2LUEyKSkgLSBkNTMqKDIqQTIpOwogICAgICAgICBvZDE2PSAgZDUzKigyKihBMi1CMikpICsgZDE3KigyKkEyKTsKLSNlbmRpZgogCiAgICAgICAgIG9kMTYgLT0gb2QwNzsKICAgICAgICAgb2QyNSAtPSBvZDE2OwpAQCAtMTQ0LDcgKzEzNyw4IEBACiAgICAgcDhpZGN0KGJsb2NrLCB0ZW1wLCBOVUxMLCAwLCA4LCAxLCAxKTsKIH0KIAotdm9pZCBmZl9mYWFuaWRjdF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCBibG9ja1s2NF0pewordm9pZCBmZl9mYWFuaWRjdF9hZGQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCBibG9ja1s2NF0pCit7CiAgICAgRkxPQVQgdGVtcFs2NF07CiAgICAgaW50IGk7CiAKQEAgLTE1Nyw3ICsxNTEsOCBAQAogICAgIHA4aWRjdChOVUxMICwgdGVtcCwgZGVzdCwgbGluZV9zaXplLCA4LCAxLCAyKTsKIH0KIAotdm9pZCBmZl9mYWFuaWRjdF9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCBibG9ja1s2NF0pewordm9pZCBmZl9mYWFuaWRjdF9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCBibG9ja1s2NF0pCit7CiAgICAgRkxPQVQgdGVtcFs2NF07CiAgICAgaW50IGk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZmFhbmlkY3QuaCBiL2xpYmF2Y29kZWMvZmFhbmlkY3QuaAppbmRleCA0Y2QyYzc4Li42ZjRkYTY3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZhYW5pZGN0LmgKKysrIGIvbGliYXZjb2RlYy9mYWFuaWRjdC5oCkBAIC0yMiwxMCArMjIsMTEgQEAKICNpZm5kZWYgQVZDT0RFQ19GQUFOSURDVF9ICiAjZGVmaW5lIEFWQ09ERUNfRkFBTklEQ1RfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIHZvaWQgZmZfZmFhbmlkY3QoaW50MTZfdCBibG9ja1s2NF0pOwotdm9pZCBmZl9mYWFuaWRjdF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCBibG9ja1s2NF0pOwotdm9pZCBmZl9mYWFuaWRjdF9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCBibG9ja1s2NF0pOwordm9pZCBmZl9mYWFuaWRjdF9hZGQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCBibG9ja1s2NF0pOwordm9pZCBmZl9mYWFuaWRjdF9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCBibG9ja1s2NF0pOwogCiAjZW5kaWYgLyogQVZDT0RFQ19GQUFOSURDVF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ZheGNvbXByLmggYi9saWJhdmNvZGVjL2ZheGNvbXByLmgKaW5kZXggNTNkMTE2OC4uYWEyOWE3YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mYXhjb21wci5oCisrKyBiL2xpYmF2Y29kZWMvZmF4Y29tcHIuaApAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgInRpZmYuaCIKIAogLyoqCi0gKiBpbml0aWFsaXplIHVwYWNrZXIgY29kZQorICogaW5pdGlhbGl6ZSB1bnBhY2tlciBjb2RlCiAgKi8KIHZvaWQgZmZfY2NpdHRfdW5wYWNrX2luaXQodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZmZqbmkuYyBiL2xpYmF2Y29kZWMvZmZqbmkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWI1ODFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9mZmpuaS5jCkBAIC0wLDAgKzEsNDE4IEBACisvKgorICogSk5JIHV0aWxpdHkgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb24gc3R1cGVmbGl4LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJqbmkuaCIKKyNpbmNsdWRlICJmZmpuaS5oIgorCitzdGF0aWMgSmF2YVZNICpqYXZhX3ZtOworc3RhdGljIHB0aHJlYWRfa2V5X3QgY3VycmVudF9lbnY7CitzdGF0aWMgcHRocmVhZF9vbmNlX3Qgb25jZSA9IFBUSFJFQURfT05DRV9JTklUOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBsb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworc3RhdGljIHZvaWQgam5pX2RldGFjaF9lbnYodm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoamF2YV92bSkgeworICAgICAgICAoKmphdmFfdm0pLT5EZXRhY2hDdXJyZW50VGhyZWFkKGphdmFfdm0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgam5pX2NyZWF0ZV9wdGhyZWFkX2tleSh2b2lkKQoreworICAgIHB0aHJlYWRfa2V5X2NyZWF0ZSgmY3VycmVudF9lbnYsIGpuaV9kZXRhY2hfZW52KTsKK30KKworSk5JRW52ICpmZl9qbmlfZ2V0X2Vudih2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQgPSAwOworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbG9jayk7CisgICAgaWYgKGphdmFfdm0gPT0gTlVMTCkgeworICAgICAgICBqYXZhX3ZtID0gYXZfam5pX2dldF9qYXZhX3ZtKGxvZ19jdHgpOworICAgIH0KKworICAgIGlmICghamF2YV92bSkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiTm8gSmF2YSB2aXJ0dWFsIG1hY2hpbmUgaGFzIGJlZW4gcmVnaXN0ZXJlZFxuIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBwdGhyZWFkX29uY2UoJm9uY2UsIGpuaV9jcmVhdGVfcHRocmVhZF9rZXkpOworCisgICAgaWYgKChlbnYgPSBwdGhyZWFkX2dldHNwZWNpZmljKGN1cnJlbnRfZW52KSkgIT0gTlVMTCkgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgcmV0ID0gKCpqYXZhX3ZtKS0+R2V0RW52KGphdmFfdm0sICh2b2lkICoqKSZlbnYsIEpOSV9WRVJTSU9OXzFfNik7CisgICAgc3dpdGNoKHJldCkgeworICAgIGNhc2UgSk5JX0VERVRBQ0hFRDoKKyAgICAgICAgaWYgKCgqamF2YV92bSktPkF0dGFjaEN1cnJlbnRUaHJlYWQoamF2YV92bSwgJmVudiwgTlVMTCkgIT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhdHRhY2ggdGhlIEpOSSBlbnZpcm9ubWVudCB0byB0aGUgY3VycmVudCB0aHJlYWRcbiIpOworICAgICAgICAgICAgZW52ID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoY3VycmVudF9lbnYsIGVudik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBKTklfT0s6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSk5JX0VWRVJTSU9OOgorICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiVGhlIHNwZWNpZmllZCBKTkkgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgdGhlIEpOSSBlbnZpcm9ubWVudCBhdHRhY2hlZCB0byB0aGlzIHRocmVhZFxuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworZG9uZToKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmbG9jayk7CisgICAgcmV0dXJuIGVudjsKK30KKworY2hhciAqZmZfam5pX2pzdHJpbmdfdG9fdXRmX2NoYXJzKEpOSUVudiAqZW52LCBqc3RyaW5nIHN0cmluZywgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBjaGFyICpyZXQgPSBOVUxMOworICAgIGNvbnN0IGNoYXIgKnV0Zl9jaGFycyA9IE5VTEw7CisKKyAgICBqYm9vbGVhbiBjb3B5ID0gMDsKKworICAgIGlmICghc3RyaW5nKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHV0Zl9jaGFycyA9ICgqZW52KS0+R2V0U3RyaW5nVVRGQ2hhcnMoZW52LCBzdHJpbmcsICZjb3B5KTsKKyAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25DaGVjayhlbnYpKSB7CisgICAgICAgICgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlN0cmluZy5nZXRTdHJpbmdVVEZDaGFycygpIHRocmV3IGFuIGV4Y2VwdGlvblxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldCA9IGF2X3N0cmR1cCh1dGZfY2hhcnMpOworCisgICAgKCplbnYpLT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoZW52LCBzdHJpbmcsIHV0Zl9jaGFycyk7CisgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uQ2hlY2soZW52KSkgeworICAgICAgICAoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJTdHJpbmcucmVsZWFzZVN0cmluZ1VURkNoYXJzKCkgdGhyZXcgYW4gZXhjZXB0aW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworanN0cmluZyBmZl9qbmlfdXRmX2NoYXJzX3RvX2pzdHJpbmcoSk5JRW52ICplbnYsIGNvbnN0IGNoYXIgKnV0Zl9jaGFycywgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBqc3RyaW5nIHJldDsKKworICAgIHJldCA9ICgqZW52KS0+TmV3U3RyaW5nVVRGKGVudiwgdXRmX2NoYXJzKTsKKyAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25DaGVjayhlbnYpKSB7CisgICAgICAgICgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIk5ld1N0cmluZ1VURigpIHRocmV3IGFuIGV4Y2VwdGlvblxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9qbmlfZXhjZXB0aW9uX2dldF9zdW1tYXJ5KEpOSUVudiAqZW52LCBqdGhyb3dhYmxlIGV4Y2VwdGlvbiwgY2hhciAqKmVycm9yLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQgPSAwOworCisgICAgQVZCUHJpbnQgYnA7CisKKyAgICBjaGFyICpuYW1lID0gTlVMTDsKKyAgICBjaGFyICptZXNzYWdlID0gTlVMTDsKKworICAgIGpjbGFzcyBjbGFzc19jbGFzcyA9IE5VTEw7CisgICAgam1ldGhvZElEIGdldF9uYW1lX2lkID0gTlVMTDsKKworICAgIGpjbGFzcyBleGNlcHRpb25fY2xhc3MgPSBOVUxMOworICAgIGptZXRob2RJRCBnZXRfbWVzc2FnZV9pZCA9IE5VTEw7CisKKyAgICBqc3RyaW5nIHN0cmluZyA9IE5VTEw7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIEFWX0JQUklOVF9TSVpFX0FVVE9NQVRJQyk7CisKKyAgICBleGNlcHRpb25fY2xhc3MgPSAoKmVudiktPkdldE9iamVjdENsYXNzKGVudiwgZXhjZXB0aW9uKTsKKyAgICBpZiAoKCplbnYpLT5FeGNlcHRpb25DaGVjayhlbnYpKSB7CisgICAgICAgICgqZW52KS0+RXhjZXB0aW9uQ2xlYXIoZW52KTsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBmaW5kIFRocm93YWJsZSBjbGFzc1xuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBjbGFzc19jbGFzcyA9ICgqZW52KS0+R2V0T2JqZWN0Q2xhc3MoZW52LCBleGNlcHRpb25fY2xhc3MpOworICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbkNoZWNrKGVudikpIHsKKyAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgVGhyb3dhYmxlIGNsYXNzJ3MgY2xhc3NcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZ2V0X25hbWVfaWQgPSAoKmVudiktPkdldE1ldGhvZElEKGVudiwgY2xhc3NfY2xhc3MsICJnZXROYW1lIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uQ2hlY2soZW52KSkgeworICAgICAgICAoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZmluZCBtZXRob2QgQ2xhc3MuZ2V0TmFtZSgpXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIHN0cmluZyA9ICgqZW52KS0+Q2FsbE9iamVjdE1ldGhvZChlbnYsIGV4Y2VwdGlvbl9jbGFzcywgZ2V0X25hbWVfaWQpOworICAgIGlmICgoKmVudiktPkV4Y2VwdGlvbkNoZWNrKGVudikpIHsKKyAgICAgICAgKCplbnYpLT5FeGNlcHRpb25DbGVhcihlbnYpOworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiQ2xhc3MuZ2V0TmFtZSgpIHRocmV3IGFuIGV4Y2VwdGlvblxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAoc3RyaW5nKSB7CisgICAgICAgIG5hbWUgPSBmZl9qbmlfanN0cmluZ190b191dGZfY2hhcnMoZW52LCBzdHJpbmcsIGxvZ19jdHgpOworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgc3RyaW5nKTsKKyAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICB9CisKKyAgICBnZXRfbWVzc2FnZV9pZCA9ICgqZW52KS0+R2V0TWV0aG9kSUQoZW52LCBleGNlcHRpb25fY2xhc3MsICJnZXRNZXNzYWdlIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uQ2hlY2soZW52KSkgeworICAgICAgICAoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZmluZCBtZXRob2QgamF2YS9sYW5nL1Rocm93YWJsZS5nZXRNZXNzYWdlKClcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgc3RyaW5nID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgZXhjZXB0aW9uLCBnZXRfbWVzc2FnZV9pZCk7CisgICAgaWYgKCgqZW52KS0+RXhjZXB0aW9uQ2hlY2soZW52KSkgeworICAgICAgICAoKmVudiktPkV4Y2VwdGlvbkNsZWFyKGVudik7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJUaHJvd2FibGUuZ2V0TWVzc2FnZSgpIHRocmV3IGFuIGV4Y2VwdGlvblxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBpZiAoc3RyaW5nKSB7CisgICAgICAgIG1lc3NhZ2UgPSBmZl9qbmlfanN0cmluZ190b191dGZfY2hhcnMoZW52LCBzdHJpbmcsIGxvZ19jdHgpOworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgc3RyaW5nKTsKKyAgICAgICAgc3RyaW5nID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobmFtZSAmJiBtZXNzYWdlKSB7CisgICAgICAgIGF2X2JwcmludGYoJmJwLCAiJXM6ICVzIiwgbmFtZSwgbWVzc2FnZSk7CisgICAgfSBlbHNlIGlmIChuYW1lICYmICFtZXNzYWdlKSB7CisgICAgICAgIGF2X2JwcmludGYoJmJwLCAiJXMgb2NjdXJyZWQiLCBuYW1lKTsKKyAgICB9IGVsc2UgaWYgKCFuYW1lICYmIG1lc3NhZ2UpIHsKKyAgICAgICAgYXZfYnByaW50ZigmYnAsICJFeGNlcHRpb246ICVzIiwgbWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IHJldHJpZXZlIGV4Y2VwdGlvbiBuYW1lIGFuZCBtZXNzYWdlXG4iKTsKKyAgICAgICAgYXZfYnByaW50ZigmYnAsICJFeGNlcHRpb24gb2NjdXJyZWQiKTsKKyAgICB9CisKKyAgICByZXQgPSBhdl9icHJpbnRfZmluYWxpemUoJmJwLCBlcnJvcik7Citkb25lOgorCisgICAgYXZfZnJlZShuYW1lKTsKKyAgICBhdl9mcmVlKG1lc3NhZ2UpOworCisgICAgaWYgKGNsYXNzX2NsYXNzKSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBjbGFzc19jbGFzcyk7CisgICAgfQorCisgICAgaWYgKGV4Y2VwdGlvbl9jbGFzcykgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgZXhjZXB0aW9uX2NsYXNzKTsKKyAgICB9CisKKyAgICBpZiAoc3RyaW5nKSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBzdHJpbmcpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKEpOSUVudiAqZW52LCBpbnQgbG9nLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQ7CisKKyAgICBqdGhyb3dhYmxlIGV4Y2VwdGlvbjsKKworICAgIGNoYXIgKm1lc3NhZ2UgPSBOVUxMOworCisgICAgaWYgKCEoKihlbnYpKS0+RXhjZXB0aW9uQ2hlY2soKGVudikpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICghbG9nKSB7CisgICAgICAgICgqKGVudikpLT5FeGNlcHRpb25DbGVhcigoZW52KSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBleGNlcHRpb24gPSAoKmVudiktPkV4Y2VwdGlvbk9jY3VycmVkKGVudik7CisgICAgKCooZW52KSktPkV4Y2VwdGlvbkNsZWFyKChlbnYpKTsKKworICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9nZXRfc3VtbWFyeShlbnYsIGV4Y2VwdGlvbiwgJm1lc3NhZ2UsIGxvZ19jdHgpKSA8IDApIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGV4Y2VwdGlvbik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGV4Y2VwdGlvbik7CisKKyAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIG1lc3NhZ2UpOworICAgIGF2X2ZyZWUobWVzc2FnZSk7CisKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBmZl9qbmlfaW5pdF9qZmllbGRzKEpOSUVudiAqZW52LCB2b2lkICpqZmllbGRzLCBjb25zdCBzdHJ1Y3QgRkZKbmlGaWVsZCAqamZpZWxkc19tYXBwaW5nLCBpbnQgZ2xvYmFsLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCBpLCByZXQgPSAwOworICAgIGpjbGFzcyBsYXN0X2NsYXp6ID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGpmaWVsZHNfbWFwcGluZ1tpXS5uYW1lOyBpKyspIHsKKyAgICAgICAgaW50IG1hbmRhdG9yeSA9IGpmaWVsZHNfbWFwcGluZ1tpXS5tYW5kYXRvcnk7CisgICAgICAgIGVudW0gRkZKbmlGaWVsZFR5cGUgdHlwZSA9IGpmaWVsZHNfbWFwcGluZ1tpXS50eXBlOworCisgICAgICAgIGlmICh0eXBlID09IEZGX0pOSV9DTEFTUykgeworICAgICAgICAgICAgamNsYXNzIGNsYXp6OworCisgICAgICAgICAgICBsYXN0X2NsYXp6ID0gTlVMTDsKKworICAgICAgICAgICAgY2xhenogPSAoKmVudiktPkZpbmRDbGFzcyhlbnYsIGpmaWVsZHNfbWFwcGluZ1tpXS5uYW1lKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIG1hbmRhdG9yeSwgbG9nX2N0eCkpIDwgMCAmJiBtYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxhc3RfY2xhenogPSAqKGpjbGFzcyopKCh1aW50OF90KilqZmllbGRzICsgamZpZWxkc19tYXBwaW5nW2ldLm9mZnNldCkgPQorICAgICAgICAgICAgICAgICAgICBnbG9iYWwgPyAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIGNsYXp6KSA6IGNsYXp6OworCisgICAgICAgICAgICBpZiAoZ2xvYmFsKSB7CisgICAgICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGNsYXp6KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICBpZiAoIWxhc3RfY2xhenopIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2godHlwZSkgeworICAgICAgICAgICAgY2FzZSBGRl9KTklfRklFTEQ6IHsKKyAgICAgICAgICAgICAgICBqZmllbGRJRCBmaWVsZF9pZCA9ICgqZW52KS0+R2V0RmllbGRJRChlbnYsIGxhc3RfY2xhenosIGpmaWVsZHNfbWFwcGluZ1tpXS5tZXRob2QsIGpmaWVsZHNfbWFwcGluZ1tpXS5zaWduYXR1cmUpOworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIG1hbmRhdG9yeSwgbG9nX2N0eCkpIDwgMCAmJiBtYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICooamZpZWxkSUQqKSgodWludDhfdCopamZpZWxkcyArIGpmaWVsZHNfbWFwcGluZ1tpXS5vZmZzZXQpID0gZmllbGRfaWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZGX0pOSV9TVEFUSUNfRklFTEQ6IHsKKyAgICAgICAgICAgICAgICBqZmllbGRJRCBmaWVsZF9pZCA9ICgqZW52KS0+R2V0U3RhdGljRmllbGRJRChlbnYsIGxhc3RfY2xhenosIGpmaWVsZHNfbWFwcGluZ1tpXS5tZXRob2QsIGpmaWVsZHNfbWFwcGluZ1tpXS5zaWduYXR1cmUpOworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIG1hbmRhdG9yeSwgbG9nX2N0eCkpIDwgMCAmJiBtYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICooamZpZWxkSUQqKSgodWludDhfdCopamZpZWxkcyArIGpmaWVsZHNfbWFwcGluZ1tpXS5vZmZzZXQpID0gZmllbGRfaWQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZGX0pOSV9NRVRIT0Q6IHsKKyAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kX2lkID0gKCplbnYpLT5HZXRNZXRob2RJRChlbnYsIGxhc3RfY2xhenosIGpmaWVsZHNfbWFwcGluZ1tpXS5tZXRob2QsIGpmaWVsZHNfbWFwcGluZ1tpXS5zaWduYXR1cmUpOworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIG1hbmRhdG9yeSwgbG9nX2N0eCkpIDwgMCAmJiBtYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICooam1ldGhvZElEKikoKHVpbnQ4X3QqKWpmaWVsZHMgKyBqZmllbGRzX21hcHBpbmdbaV0ub2Zmc2V0KSA9IG1ldGhvZF9pZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgRkZfSk5JX1NUQVRJQ19NRVRIT0Q6IHsKKyAgICAgICAgICAgICAgICBqbWV0aG9kSUQgbWV0aG9kX2lkID0gKCplbnYpLT5HZXRTdGF0aWNNZXRob2RJRChlbnYsIGxhc3RfY2xhenosIGpmaWVsZHNfbWFwcGluZ1tpXS5tZXRob2QsIGpmaWVsZHNfbWFwcGluZ1tpXS5zaWduYXR1cmUpOworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIG1hbmRhdG9yeSwgbG9nX2N0eCkpIDwgMCAmJiBtYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICooam1ldGhvZElEKikoKHVpbnQ4X3QqKWpmaWVsZHMgKyBqZmllbGRzX21hcHBpbmdbaV0ub2Zmc2V0KSA9IG1ldGhvZF9pZDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gSk5JIGZpZWxkIHR5cGVcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKK2RvbmU6CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgLyogcmVzZXQgamZpZWxkcyBpbiBjYXNlIG9mIGZhaWx1cmUgc28gaXQgZG9lcyBub3QgbGVhayByZWZlcmVuY2VzICovCisgICAgICAgIGZmX2puaV9yZXNldF9qZmllbGRzKGVudiwgamZpZWxkcywgamZpZWxkc19tYXBwaW5nLCBnbG9iYWwsIGxvZ19jdHgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9qbmlfcmVzZXRfamZpZWxkcyhKTklFbnYgKmVudiwgdm9pZCAqamZpZWxkcywgY29uc3Qgc3RydWN0IEZGSm5pRmllbGQgKmpmaWVsZHNfbWFwcGluZywgaW50IGdsb2JhbCwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGpmaWVsZHNfbWFwcGluZ1tpXS5uYW1lOyBpKyspIHsKKyAgICAgICAgZW51bSBGRkpuaUZpZWxkVHlwZSB0eXBlID0gamZpZWxkc19tYXBwaW5nW2ldLnR5cGU7CisKKyAgICAgICAgc3dpdGNoKHR5cGUpIHsKKyAgICAgICAgY2FzZSBGRl9KTklfQ0xBU1M6IHsKKyAgICAgICAgICAgIGpjbGFzcyBjbGF6eiA9ICooamNsYXNzKikoKHVpbnQ4X3QqKWpmaWVsZHMgKyBqZmllbGRzX21hcHBpbmdbaV0ub2Zmc2V0KTsKKyAgICAgICAgICAgIGlmICghY2xhenopCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChnbG9iYWwpIHsKKyAgICAgICAgICAgICAgICAoKmVudiktPkRlbGV0ZUdsb2JhbFJlZihlbnYsIGNsYXp6KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGNsYXp6KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKihqY2xhc3MqKSgodWludDhfdCopamZpZWxkcyArIGpmaWVsZHNfbWFwcGluZ1tpXS5vZmZzZXQpID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRkZfSk5JX0ZJRUxEOiB7CisgICAgICAgICAgICAqKGpmaWVsZElEKikoKHVpbnQ4X3QqKWpmaWVsZHMgKyBqZmllbGRzX21hcHBpbmdbaV0ub2Zmc2V0KSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEZGX0pOSV9TVEFUSUNfRklFTEQ6IHsKKyAgICAgICAgICAgICooamZpZWxkSUQqKSgodWludDhfdCopamZpZWxkcyArIGpmaWVsZHNfbWFwcGluZ1tpXS5vZmZzZXQpID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRkZfSk5JX01FVEhPRDogeworICAgICAgICAgICAgKihqbWV0aG9kSUQqKSgodWludDhfdCopamZpZWxkcyArIGpmaWVsZHNfbWFwcGluZ1tpXS5vZmZzZXQpID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRkZfSk5JX1NUQVRJQ19NRVRIT0Q6IHsKKyAgICAgICAgICAgICooam1ldGhvZElEKikoKHVpbnQ4X3QqKWpmaWVsZHMgKyBqZmllbGRzX21hcHBpbmdbaV0ub2Zmc2V0KSA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gSk5JIGZpZWxkIHR5cGVcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2Zmam5pLmggYi9saWJhdmNvZGVjL2Zmam5pLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAyN2JhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZmZqbmkuaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIEpOSSB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uIHN0dXBlZmxpeC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19GRkpOSV9ICisjZGVmaW5lIEFWQ09ERUNfRkZKTklfSAorCisjaW5jbHVkZSA8am5pLmg+CisKKy8qCisgKiBBdHRhY2ggcGVybWFuZW50bHkgYSBKTkkgZW52aXJvbm1lbnQgdG8gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZCByZXRyaWV2ZSBpdC4KKyAqCisgKiBJZiBzdWNjZXNzZnVsbHkgYXR0YWNoZWQsIHRoZSBKTkkgZW52aXJvbm1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRldGFjaGVkCisgKiBhdCB0aHJlYWQgZGVzdHJ1Y3Rpb24uCisgKgorICogQHBhcmFtIGF0dGFjaGVkIHBvaW50ZXIgdG8gYW4gaW50ZWdlciB0aGF0IHdpbGwgYmUgc2V0IHRvIDEgaWYgdGhlCisgKiBlbnZpcm9ubWVudCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgY3VycmVudCB0aHJlYWQgb3IgMCBpZiBpdCBpcworICogYWxyZWFkeSBhdHRhY2hlZC4KKyAqIEBwYXJhbSBsb2dfY3R4IGNvbnRleHQgdXNlZCBmb3IgbG9nZ2luZywgY2FuIGJlIE5VTEwKKyAqIEByZXR1cm4gdGhlIEpOSSBlbnZpcm9ubWVudCBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZQorICovCitKTklFbnYgKmZmX2puaV9nZXRfZW52KHZvaWQgKmxvZ19jdHgpOworCisvKgorICogQ29udmVydCBhIGpzdHJpbmcgdG8gaXRzIHV0ZiBjaGFyYWN0ZXJzIGVxdWl2YWxlbnQuCisgKgorICogQHBhcmFtIGVudiBKTkkgZW52aXJvbm1lbnQKKyAqIEBwYXJhbSBzdHJpbmcgSmF2YSBzdHJpbmcgdG8gY29udmVydAorICogQHBhcmFtIGxvZ19jdHggY29udGV4dCB1c2VkIGZvciBsb2dnaW5nLCBjYW4gYmUgTlVMTAorICogQHJldHVybiBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdW5pY29kZSBjaGFyYWN0ZXJzIG9uIHN1Y2Nlc3MsIE5VTEwKKyAqIG90aGVyd2lzZQorICovCitjaGFyICpmZl9qbmlfanN0cmluZ190b191dGZfY2hhcnMoSk5JRW52ICplbnYsIGpzdHJpbmcgc3RyaW5nLCB2b2lkICpsb2dfY3R4KTsKKworLyoKKyAqIENvbnZlcnQgdXRmIGNoYXJzIHRvIGl0cyBqc3RyaW5nIGVxdWl2YWxlbnQuCisgKgorICogQHBhcmFtIGVudiBKTkkgZW52aXJvbm1lbnQKKyAqIEBwYXJhbSB1dGZfY2hhcnMgYSBwb2ludGVyIHRvIGFuIGFycmF5IG9mIHVuaWNvZGUgY2hhcmFjdGVycworICogQHBhcmFtIGxvZ19jdHggY29udGV4dCB1c2VkIGZvciBsb2dnaW5nLCBjYW4gYmUgTlVMTAorICogQHJldHVybiBhIEphdmEgc3RyaW5nIG9iamVjdCBvbiBzdWNjZXNzLCBOVUxMIG90aGVyd2lzZQorICovCitqc3RyaW5nIGZmX2puaV91dGZfY2hhcnNfdG9fanN0cmluZyhKTklFbnYgKmVudiwgY29uc3QgY2hhciAqdXRmX2NoYXJzLCB2b2lkICpsb2dfY3R4KTsKKworLyoKKyAqIEV4dHJhY3QgdGhlIGVycm9yIHN1bW1hcnkgZnJvbSBhIGp0aHJvd2FibGUgaW4gdGhlIGZvcm0gb2YgImNsYXNzTmFtZTogZXJyb3JNZXNzYWdlIgorICoKKyAqIEBwYXJhbSBlbnYgSk5JIGVudmlyb25tZW50CisgKiBAcGFyYW0gZXhjZXB0aW9uIGV4Y2VwdGlvbiB0byBnZXQgdGhlIHN1bW1hcnkgZnJvbQorICogQHBhcmFtIGVycm9yIGFkZHJlc3MgcG9pbnRpbmcgdG8gdGhlIGVycm9yLCB0aGUgdmFsdWUgaXMgdXBkYXRlZCBpZiBhCisgKiBzdW1tYXJ5IGNhbiBiZSBleHRyYWN0ZWQKKyAqIEBwYXJhbSBsb2dfY3R4IGNvbnRleHQgdXNlZCBmb3IgbG9nZ2luZywgY2FuIGJlIE5VTEwKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8IDAgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9qbmlfZXhjZXB0aW9uX2dldF9zdW1tYXJ5KEpOSUVudiAqZW52LCBqdGhyb3dhYmxlIGV4Y2VwdGlvbiwgY2hhciAqKmVycm9yLCB2b2lkICpsb2dfY3R4KTsKKworLyoKKyAqIENoZWNrIGlmIGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQsbG9nIGl0IHVzaW5nIGF2X2xvZyBhbmQgY2xlYXIgaXQuCisgKgorICogQHBhcmFtIGVudiBKTkkgZW52aXJvbm1lbnQKKyAqIEBwYXJhbSBsb2cgdmFsdWUgdXNlZCB0byBlbmFibGUgbG9nZ2luZyBpZiBhbiBleGNlcHRpb24gaGFzIG9jY3VycmVkLAorICogMCBkaXNhYmxlcyBsb2dnaW5nLCAhPSAwIGVuYWJsZXMgbG9nZ2luZworICogQHBhcmFtIGxvZ19jdHggY29udGV4dCB1c2VkIGZvciBsb2dnaW5nLCBjYW4gYmUgTlVMTAorICovCitpbnQgZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhKTklFbnYgKmVudiwgaW50IGxvZywgdm9pZCAqbG9nX2N0eCk7CisKKy8qCisgKiBKbmkgZmllbGQgdHlwZS4KKyAqLworZW51bSBGRkpuaUZpZWxkVHlwZSB7CisKKyAgICBGRl9KTklfQ0xBU1MsCisgICAgRkZfSk5JX0ZJRUxELAorICAgIEZGX0pOSV9TVEFUSUNfRklFTEQsCisgICAgRkZfSk5JX01FVEhPRCwKKyAgICBGRl9KTklfU1RBVElDX01FVEhPRAorCit9OworCisvKgorICogSm5pIGZpZWxkIGRlc2NyaWJpbmcgYSBjbGFzcywgYSBmaWVsZCBvciBhIG1ldGhvZCB0byBiZSByZXRyaWV2ZWQgdXNpbmcKKyAqIHRoZSBmZl9qbmlfaW5pdF9qZmllbGRzIG1ldGhvZC4KKyAqLworc3RydWN0IEZGSm5pRmllbGQgeworCisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICptZXRob2Q7CisgICAgY29uc3QgY2hhciAqc2lnbmF0dXJlOworICAgIGVudW0gRkZKbmlGaWVsZFR5cGUgdHlwZTsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBtYW5kYXRvcnk7CisKK307CisKKy8qCisgKiBSZXRyaWV2ZSBjbGFzcyByZWZlcmVuY2VzLCBmaWVsZCBpZHMgYW5kIG1ldGhvZCBpZHMgdG8gYW4gYXJiaXRyYXJ5IHN0cnVjdHVyZS4KKyAqCisgKiBAcGFyYW0gZW52IEpOSSBlbnZpcm9ubWVudAorICogQHBhcmFtIGpmaWVsZHMgYSBwb2ludGVyIHRvIGFuIGFyYml0cmFyeSBzdHJ1Y3R1cmUgd2hlcmUgdGhlIGRpZmZlcmVudAorICogZmllbGRzIGFyZSBkZWNsYXJlZCBhbmQgd2hlcmUgdGhlIEZGSk5JRmllbGQgbWFwcGluZyB0YWJsZSBvZmZzZXRzIGFyZQorICogcG9pbnRpbmcgdG8KKyAqIEBwYXJhbSBqZmllbGRzX21hcHBpbmcgbnVsbCB0ZXJtaW5hdGVkIGFycmF5IG9mIEZGSk5JRmllbGRzIGRlc2NyaWJpbmcKKyAqIHRoZSBjbGFzcy9maWVsZC9tZXRob2QgdG8gYmUgcmV0cmlldmVkCisgKiBAcGFyYW0gZ2xvYmFsIG1ha2UgdGhlIGNsYXNzZXMgcmVmZXJlbmNlcyBnbG9iYWwuIEl0IGlzIHRoZSBjYWxsZXIKKyAqIHJlc3BvbnNpYmlsaXR5IHRvIHByb3Blcmx5IHJlbGVhc2UgZ2xvYmFsIHJlZmVyZW5jZXMuCisgKiBAcGFyYW0gbG9nX2N0eCBjb250ZXh0IHVzZWQgZm9yIGxvZ2dpbmcsIGNhbiBiZSBOVUxMCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIG90aGVyd2lzZQorICovCitpbnQgZmZfam5pX2luaXRfamZpZWxkcyhKTklFbnYgKmVudiwgdm9pZCAqamZpZWxkcywgY29uc3Qgc3RydWN0IEZGSm5pRmllbGQgKmpmaWVsZHNfbWFwcGluZywgaW50IGdsb2JhbCwgdm9pZCAqbG9nX2N0eCk7CisKKy8qCisgKiBEZWxldGUgY2xhc3MgcmVmZXJlbmNlcywgZmllbGQgaWRzIGFuZCBtZXRob2QgaWRzIG9mIGFuIGFyYml0cmFyeSBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIGVudiBKTkkgZW52aXJvbm1lbnQKKyAqIEBwYXJhbSBqZmllbGRzIGEgcG9pbnRlciB0byBhbiBhcmJpdHJhcnkgc3RydWN0dXJlIHdoZXJlIHRoZSBkaWZmZXJlbnQKKyAqIGZpZWxkcyBhcmUgZGVjbGFyZWQgYW5kIHdoZXJlIHRoZSBGRkpOSUZpZWxkIG1hcHBpbmcgdGFibGUgb2Zmc2V0cyBhcmUKKyAqIHBvaW50aW5nIHRvCisgKiBAcGFyYW0gamZpZWxkc19tYXBwaW5nIG51bGwgdGVybWluYXRlZCBhcnJheSBvZiBGRkpOSUZpZWxkcyBkZXNjcmliaW5nCisgKiB0aGUgY2xhc3MvZmllbGQvbWV0aG9kIHRvIGJlIGRlbGV0ZWQKKyAqIEBwYXJhbSBnbG9iYWwgdGhyZWF0IHRoZSBjbGFzc2VzIHJlZmVyZW5jZXMgYXMgZ2xvYmFsIGFuZCBkZWxldGUgdGhlbQorICogYWNjb3JkaW5nbHkKKyAqIEBwYXJhbSBsb2dfY3R4IGNvbnRleHQgdXNlZCBmb3IgbG9nZ2luZywgY2FuIGJlIE5VTEwKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCA8IDAgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl9qbmlfcmVzZXRfamZpZWxkcyhKTklFbnYgKmVudiwgdm9pZCAqamZpZWxkcywgY29uc3Qgc3RydWN0IEZGSm5pRmllbGQgKmpmaWVsZHNfbWFwcGluZywgaW50IGdsb2JhbCwgdm9pZCAqbG9nX2N0eCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0ZGSk5JX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZmZ0LWZpeGVkLXRlc3QuYyBiL2xpYmF2Y29kZWMvZmZ0LWZpeGVkLXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMjExZS4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2ZmdC1maXhlZC10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNkZWZpbmUgRkZUX0ZMT0FUIDAKLSNpbmNsdWRlICJmZnQtdGVzdC5jIgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mZnQtZml4ZWQzMi10ZXN0LmMgYi9saWJhdmNvZGVjL2ZmdC1maXhlZDMyLXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJkMTFjZS4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2ZmdC1maXhlZDMyLXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2RlZmluZSBGRlRfRkxPQVQgMAotI2RlZmluZSBGRlRfRklYRURfMzIgMQotI2luY2x1ZGUgImZmdC10ZXN0LmMiCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ZmdC10ZXN0LmMgYi9saWJhdmNvZGVjL2ZmdC10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDdmZGUuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9mZnQtdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qCi0gKiAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogRkZUIGFuZCBNRENUIHRlc3RzLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKLQotI2luY2x1ZGUgImZmdC5oIgotI2lmIEZGVF9GTE9BVAotI2luY2x1ZGUgImRjdC5oIgotI2luY2x1ZGUgInJkZnQuaCIKLSNlbmRpZgotCi0vKiByZWZlcmVuY2UgZmZ0ICovCi0KLSNkZWZpbmUgTVVMMTYoYSwgYikgKChhKSAqIChiKSkKLQotI2RlZmluZSBDTUFDKHByZSwgcGltLCBhcmUsIGFpbSwgYnJlLCBiaW0pICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHByZSArPSAoTVVMMTYoYXJlLCBicmUpIC0gTVVMMTYoYWltLCBiaW0pKTsgXAotICAgICAgICBwaW0gKz0gKE1VTDE2KGFyZSwgYmltKSArIE1VTDE2KGJyZSwgYWltKSk7IFwKLSAgICB9Ci0KLSNpZiBGRlRfRkxPQVQKLSNkZWZpbmUgUkFOR0UgMS4wCi0jZGVmaW5lIFJFRl9TQ0FMRSh4LCBiaXRzKSAgKHgpCi0jZGVmaW5lIEZNVCAiJTEwLjZmIgotI2VsaWYgRkZUX0ZJWEVEXzMyCi0jZGVmaW5lIFJBTkdFIDgzODg2MDgKLSNkZWZpbmUgUkVGX1NDQUxFKHgsIGJpdHMpICh4KQotI2RlZmluZSBGTVQgIiU2ZCIKLSNlbHNlCi0jZGVmaW5lIFJBTkdFIDE2Mzg0Ci0jZGVmaW5lIFJFRl9TQ0FMRSh4LCBiaXRzKSAoKHgpIC8gKDEgPDwgKGJpdHMpKSkKLSNkZWZpbmUgRk1UICIlNmQiCi0jZW5kaWYKLQotc3RhdGljIHN0cnVjdCB7Ci0gICAgZmxvYXQgcmUsIGltOwotfSAqZXhwdGFiOwotCi1zdGF0aWMgaW50IGZmdF9yZWZfaW5pdChpbnQgbmJpdHMsIGludCBpbnZlcnNlKQotewotICAgIGludCBpLCBuID0gMSA8PCBuYml0czsKLQotICAgIGV4cHRhYiA9IGF2X21hbGxvY19hcnJheSgobiAvIDIpLCBzaXplb2YoKmV4cHRhYikpOwotICAgIGlmICghZXhwdGFiKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZm9yIChpID0gMDsgaSA8IChuIC8gMik7IGkrKykgewotICAgICAgICBkb3VibGUgYWxwaGEgPSAyICogTV9QSSAqIChmbG9hdCkgaSAvIChmbG9hdCkgbjsKLSAgICAgICAgZG91YmxlIGMxID0gY29zKGFscGhhKSwgczEgPSBzaW4oYWxwaGEpOwotICAgICAgICBpZiAoIWludmVyc2UpCi0gICAgICAgICAgICBzMSA9IC1zMTsKLSAgICAgICAgZXhwdGFiW2ldLnJlID0gYzE7Ci0gICAgICAgIGV4cHRhYltpXS5pbSA9IHMxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgZmZ0X3JlZihGRlRDb21wbGV4ICp0YWJyLCBGRlRDb21wbGV4ICp0YWIsIGludCBuYml0cykKLXsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgbiAgPSAxIDw8IG5iaXRzOwotICAgIGludCBuMiA9IG4gPj4gMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgZG91YmxlIHRtcF9yZSA9IDAsIHRtcF9pbSA9IDA7Ci0gICAgICAgIEZGVENvbXBsZXggKnEgPSB0YWI7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBzLCBjOwotICAgICAgICAgICAgaW50IGsgPSAoaSAqIGopICYgKG4gLSAxKTsKLSAgICAgICAgICAgIGlmIChrID49IG4yKSB7Ci0gICAgICAgICAgICAgICAgYyA9IC1leHB0YWJbayAtIG4yXS5yZTsKLSAgICAgICAgICAgICAgICBzID0gLWV4cHRhYltrIC0gbjJdLmltOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjID0gZXhwdGFiW2tdLnJlOwotICAgICAgICAgICAgICAgIHMgPSBleHB0YWJba10uaW07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDTUFDKHRtcF9yZSwgdG1wX2ltLCBjLCBzLCBxLT5yZSwgcS0+aW0pOwotICAgICAgICAgICAgcSsrOwotICAgICAgICB9Ci0gICAgICAgIHRhYnJbaV0ucmUgPSBSRUZfU0NBTEUodG1wX3JlLCBuYml0cyk7Ci0gICAgICAgIHRhYnJbaV0uaW0gPSBSRUZfU0NBTEUodG1wX2ltLCBuYml0cyk7Ci0gICAgfQotfQotCi0jaWYgQ09ORklHX01EQ1QKLXN0YXRpYyB2b2lkIGltZGN0X3JlZihGRlRTYW1wbGUgKm91dCwgRkZUU2FtcGxlICppbiwgaW50IG5iaXRzKQotewotICAgIGludCBpLCBrLCBuID0gMSA8PCBuYml0czsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgZG91YmxlIHN1bSA9IDA7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCBuIC8gMjsgaysrKSB7Ci0gICAgICAgICAgICBpbnQgYSA9ICgyICogaSArIDEgKyAobiAvIDIpKSAqICgyICogayArIDEpOwotICAgICAgICAgICAgZG91YmxlIGYgPSBjb3MoTV9QSSAqIGEgLyAoZG91YmxlKSAoMiAqIG4pKTsKLSAgICAgICAgICAgIHN1bSArPSBmICogaW5ba107Ci0gICAgICAgIH0KLSAgICAgICAgb3V0W2ldID0gUkVGX1NDQUxFKC1zdW0sIG5iaXRzIC0gMik7Ci0gICAgfQotfQotCi0vKiBOT1RFOiBubyBub3JtYWxpc2F0aW9uIGJ5IDEgLyBOIGlzIGRvbmUgKi8KLXN0YXRpYyB2b2lkIG1kY3RfcmVmKEZGVFNhbXBsZSAqb3V0cHV0LCBGRlRTYW1wbGUgKmlucHV0LCBpbnQgbmJpdHMpCi17Ci0gICAgaW50IGksIGssIG4gPSAxIDw8IG5iaXRzOwotCi0gICAgLyogZG8gaXQgYnkgaGFuZCAqLwotICAgIGZvciAoayA9IDA7IGsgPCBuIC8gMjsgaysrKSB7Ci0gICAgICAgIGRvdWJsZSBzID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICAgICAgZG91YmxlIGEgPSAoMiAqIE1fUEkgKiAoMiAqIGkgKyAxICsgbiAvIDIpICogKDIgKiBrICsgMSkgLyAoNCAqIG4pKTsKLSAgICAgICAgICAgIHMgKz0gaW5wdXRbaV0gKiBjb3MoYSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0cHV0W2tdID0gUkVGX1NDQUxFKHMsIG5iaXRzIC0gMSk7Ci0gICAgfQotfQotI2VuZGlmIC8qIENPTkZJR19NRENUICovCi0KLSNpZiBGRlRfRkxPQVQKLSNpZiBDT05GSUdfRENUCi1zdGF0aWMgdm9pZCBpZGN0X3JlZihGRlRTYW1wbGUgKm91dHB1dCwgRkZUU2FtcGxlICppbnB1dCwgaW50IG5iaXRzKQotewotICAgIGludCBpLCBrLCBuID0gMSA8PCBuYml0czsKLQotICAgIC8qIGRvIGl0IGJ5IGhhbmQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGRvdWJsZSBzID0gMC41ICogaW5wdXRbMF07Ci0gICAgICAgIGZvciAoayA9IDE7IGsgPCBuOyBrKyspIHsKLSAgICAgICAgICAgIGRvdWJsZSBhID0gTV9QSSAqIGsgKiAoaSArIDAuNSkgLyBuOwotICAgICAgICAgICAgcyArPSBpbnB1dFtrXSAqIGNvcyhhKTsKLSAgICAgICAgfQotICAgICAgICBvdXRwdXRbaV0gPSAyICogcyAvIG47Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBkY3RfcmVmKEZGVFNhbXBsZSAqb3V0cHV0LCBGRlRTYW1wbGUgKmlucHV0LCBpbnQgbmJpdHMpCi17Ci0gICAgaW50IGksIGssIG4gPSAxIDw8IG5iaXRzOwotCi0gICAgLyogZG8gaXQgYnkgaGFuZCAqLwotICAgIGZvciAoayA9IDA7IGsgPCBuOyBrKyspIHsKLSAgICAgICAgZG91YmxlIHMgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgYSA9IE1fUEkgKiBrICogKGkgKyAwLjUpIC8gbjsKLSAgICAgICAgICAgIHMgKz0gaW5wdXRbaV0gKiBjb3MoYSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0cHV0W2tdID0gczsKLSAgICB9Ci19Ci0jZW5kaWYgLyogQ09ORklHX0RDVCAqLwotI2VuZGlmIC8qIEZGVF9GTE9BVCAqLwotCi1zdGF0aWMgRkZUU2FtcGxlIGZyYW5kb20oQVZMRkcgKnBybmcpCi17Ci0gICAgcmV0dXJuIChpbnQxNl90KSBhdl9sZmdfZ2V0KHBybmcpIC8gMzI3NjguMCAqIFJBTkdFOwotfQotCi1zdGF0aWMgaW50IGNoZWNrX2RpZmYoRkZUU2FtcGxlICp0YWIxLCBGRlRTYW1wbGUgKnRhYjIsIGludCBuLCBkb3VibGUgc2NhbGUpCi17Ci0gICAgaW50IGksIGVyciA9IDA7Ci0gICAgZG91YmxlIGVycm9yID0gMCwgbWF4ID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgZG91YmxlIGUgPSBmYWJzKHRhYjFbaV0gLSAodGFiMltpXSAvIHNjYWxlKSkgLyBSQU5HRTsKLSAgICAgICAgaWYgKGUgPj0gMWUtMykgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVSUk9SICU1ZDogIkZNVCIgIkZNVCJcbiIsCi0gICAgICAgICAgICAgICAgICAgaSwgdGFiMVtpXSwgdGFiMltpXSk7Ci0gICAgICAgICAgICBlcnIgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVycm9yICs9IGUgKiBlOwotICAgICAgICBpZiAoZSA+IG1heCkKLSAgICAgICAgICAgIG1heCA9IGU7Ci0gICAgfQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIm1heDolZiBlOiVnXG4iLCBtYXgsIHNxcnQoZXJyb3IgLyBuKSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgaGVscCh2b2lkKQotewotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgInVzYWdlOiBmZnQtdGVzdCBbLWhdIFstc10gWy1pXSBbLW4gYl1cbiIKLSAgICAgICAgICAgIi1oICAgICBwcmludCB0aGlzIGhlbHBcbiIKLSAgICAgICAgICAgIi1zICAgICBzcGVlZCB0ZXN0XG4iCi0gICAgICAgICAgICItbSAgICAgKEkpTURDVCB0ZXN0XG4iCi0gICAgICAgICAgICItZCAgICAgKEkpRENUIHRlc3RcbiIKLSAgICAgICAgICAgIi1yICAgICAoSSlSREZUIHRlc3RcbiIKLSAgICAgICAgICAgIi1pICAgICBpbnZlcnNlIHRyYW5zZm9ybSB0ZXN0XG4iCi0gICAgICAgICAgICItbiBiICAgc2V0IHRoZSB0cmFuc2Zvcm0gc2l6ZSB0byAyXmJcbiIKLSAgICAgICAgICAgIi1mIHggICBzZXQgc2NhbGUgZmFjdG9yIGZvciBvdXRwdXQgZGF0YSBvZiAoSSlNRENUIHRvIHhcbiIpOwotfQotCi1lbnVtIHRmX3RyYW5zZm9ybSB7Ci0gICAgVFJBTlNGT1JNX0ZGVCwKLSAgICBUUkFOU0ZPUk1fTURDVCwKLSAgICBUUkFOU0ZPUk1fUkRGVCwKLSAgICBUUkFOU0ZPUk1fRENULAotfTsKLQotI2lmICFIQVZFX0dFVE9QVAotI2luY2x1ZGUgImNvbXBhdC9nZXRvcHQuYyIKLSNlbmRpZgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgRkZUQ29tcGxleCAqdGFiLCAqdGFiMSwgKnRhYl9yZWY7Ci0gICAgRkZUU2FtcGxlICp0YWIyOwotICAgIGVudW0gdGZfdHJhbnNmb3JtIHRyYW5zZm9ybSA9IFRSQU5TRk9STV9GRlQ7Ci0gICAgRkZUQ29udGV4dCBtLCBzOwotI2lmIEZGVF9GTE9BVAotICAgIFJERlRDb250ZXh0IHI7Ci0gICAgRENUQ29udGV4dCBkOwotI2VuZGlmIC8qIEZGVF9GTE9BVCAqLwotICAgIGludCBpdCwgaSwgZXJyID0gMTsKLSAgICBpbnQgZG9fc3BlZWQgPSAwLCBkb19pbnZlcnNlID0gMDsKLSAgICBpbnQgZmZ0X25iaXRzID0gOSwgZmZ0X3NpemU7Ci0gICAgZG91YmxlIHNjYWxlID0gMS4wOwotICAgIEFWTEZHIHBybmc7Ci0KLSAgICBhdl9sZmdfaW5pdCgmcHJuZywgMSk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGludCBjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJoc2ltcmRuOmY6YzoiKTsKLSAgICAgICAgaWYgKGMgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgaGVscCgpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgZG9fc3BlZWQgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2knOgotICAgICAgICAgICAgZG9faW52ZXJzZSA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICB0cmFuc2Zvcm0gPSBUUkFOU0ZPUk1fTURDVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgIHRyYW5zZm9ybSA9IFRSQU5TRk9STV9SREZUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgdHJhbnNmb3JtID0gVFJBTlNGT1JNX0RDVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICduJzoKLSAgICAgICAgICAgIGZmdF9uYml0cyA9IGF0b2kob3B0YXJnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgIHNjYWxlID0gYXRvZihvcHRhcmcpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2MnOgotICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjcHVmbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKLQotICAgICAgICAgICAgaWYgKGF2X3BhcnNlX2NwdV9jYXBzKCZjcHVmbGFncywgb3B0YXJnKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgICAgICAgIGF2X2ZvcmNlX2NwdV9mbGFncyhjcHVmbGFncyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmZ0X3NpemUgPSAxIDw8IGZmdF9uYml0czsKLSAgICB0YWIgICAgICA9IGF2X21hbGxvY19hcnJheShmZnRfc2l6ZSwgc2l6ZW9mKEZGVENvbXBsZXgpKTsKLSAgICB0YWIxICAgICA9IGF2X21hbGxvY19hcnJheShmZnRfc2l6ZSwgc2l6ZW9mKEZGVENvbXBsZXgpKTsKLSAgICB0YWJfcmVmICA9IGF2X21hbGxvY19hcnJheShmZnRfc2l6ZSwgc2l6ZW9mKEZGVENvbXBsZXgpKTsKLSAgICB0YWIyICAgICA9IGF2X21hbGxvY19hcnJheShmZnRfc2l6ZSwgc2l6ZW9mKEZGVFNhbXBsZSkpOwotCi0gICAgaWYgKCEodGFiICYmIHRhYjEgJiYgdGFiX3JlZiAmJiB0YWIyKSkKLSAgICAgICAgZ290byBjbGVhbnVwOwotCi0gICAgc3dpdGNoICh0cmFuc2Zvcm0pIHsKLSNpZiBDT05GSUdfTURDVAotICAgIGNhc2UgVFJBTlNGT1JNX01EQ1Q6Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlNjYWxlIGZhY3RvciBpcyBzZXQgdG8gJWZcbiIsIHNjYWxlKTsKLSAgICAgICAgaWYgKGRvX2ludmVyc2UpCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJJTURDVCIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJNRENUIik7Ci0gICAgICAgIGZmX21kY3RfaW5pdCgmbSwgZmZ0X25iaXRzLCBkb19pbnZlcnNlLCBzY2FsZSk7Ci0gICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIENPTkZJR19NRENUICovCi0gICAgY2FzZSBUUkFOU0ZPUk1fRkZUOgotICAgICAgICBpZiAoZG9faW52ZXJzZSkKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIklGRlQiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiRkZUIik7Ci0gICAgICAgIGZmX2ZmdF9pbml0KCZzLCBmZnRfbmJpdHMsIGRvX2ludmVyc2UpOwotICAgICAgICBpZiAoKGVyciA9IGZmdF9yZWZfaW5pdChmZnRfbmJpdHMsIGRvX2ludmVyc2UpKSA8IDApCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIGJyZWFrOwotI2lmIEZGVF9GTE9BVAotIyAgICBpZiBDT05GSUdfUkRGVAotICAgIGNhc2UgVFJBTlNGT1JNX1JERlQ6Ci0gICAgICAgIGlmIChkb19pbnZlcnNlKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiSURGVF9DMlIiKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiREZUX1IyQyIpOwotICAgICAgICBmZl9yZGZ0X2luaXQoJnIsIGZmdF9uYml0cywgZG9faW52ZXJzZSA/IElERlRfQzJSIDogREZUX1IyQyk7Ci0gICAgICAgIGlmICgoZXJyID0gZmZ0X3JlZl9pbml0KGZmdF9uYml0cywgZG9faW52ZXJzZSkpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKLSAgICAgICAgYnJlYWs7Ci0jICAgIGVuZGlmIC8qIENPTkZJR19SREZUICovCi0jICAgIGlmIENPTkZJR19EQ1QKLSAgICBjYXNlIFRSQU5TRk9STV9EQ1Q6Ci0gICAgICAgIGlmIChkb19pbnZlcnNlKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiRENUX0lJSSIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJEQ1RfSUkiKTsKLSAgICAgICAgZmZfZGN0X2luaXQoJmQsIGZmdF9uYml0cywgZG9faW52ZXJzZSA/IERDVF9JSUkgOiBEQ1RfSUkpOwotICAgICAgICBicmVhazsKLSMgICAgZW5kaWYgLyogQ09ORklHX0RDVCAqLwotI2VuZGlmIC8qIEZGVF9GTE9BVCAqLwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJSZXF1ZXN0ZWQgdHJhbnNmb3JtIG5vdCBzdXBwb3J0ZWRcbiIpOwotICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgfQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAlZCB0ZXN0XG4iLCBmZnRfc2l6ZSk7Ci0KLSAgICAvKiBnZW5lcmF0ZSByYW5kb20gZGF0YSAqLwotCi0gICAgZm9yIChpID0gMDsgaSA8IGZmdF9zaXplOyBpKyspIHsKLSAgICAgICAgdGFiMVtpXS5yZSA9IGZyYW5kb20oJnBybmcpOwotICAgICAgICB0YWIxW2ldLmltID0gZnJhbmRvbSgmcHJuZyk7Ci0gICAgfQotCi0gICAgLyogY2hlY2tpbmcgcmVzdWx0ICovCi0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiQ2hlY2tpbmcuLi5cbiIpOwotCi0gICAgc3dpdGNoICh0cmFuc2Zvcm0pIHsKLSNpZiBDT05GSUdfTURDVAotICAgIGNhc2UgVFJBTlNGT1JNX01EQ1Q6Ci0gICAgICAgIGlmIChkb19pbnZlcnNlKSB7Ci0gICAgICAgICAgICBpbWRjdF9yZWYoJnRhYl9yZWYtPnJlLCAmdGFiMS0+cmUsIGZmdF9uYml0cyk7Ci0gICAgICAgICAgICBtLmltZGN0X2NhbGMoJm0sIHRhYjIsICZ0YWIxLT5yZSk7Ci0gICAgICAgICAgICBlcnIgPSBjaGVja19kaWZmKCZ0YWJfcmVmLT5yZSwgdGFiMiwgZmZ0X3NpemUsIHNjYWxlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1kY3RfcmVmKCZ0YWJfcmVmLT5yZSwgJnRhYjEtPnJlLCBmZnRfbmJpdHMpOwotICAgICAgICAgICAgbS5tZGN0X2NhbGMoJm0sIHRhYjIsICZ0YWIxLT5yZSk7Ci0gICAgICAgICAgICBlcnIgPSBjaGVja19kaWZmKCZ0YWJfcmVmLT5yZSwgdGFiMiwgZmZ0X3NpemUgLyAyLCBzY2FsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHX01EQ1QgKi8KLSAgICBjYXNlIFRSQU5TRk9STV9GRlQ6Ci0gICAgICAgIG1lbWNweSh0YWIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVENvbXBsZXgpKTsKLSAgICAgICAgcy5mZnRfcGVybXV0ZSgmcywgdGFiKTsKLSAgICAgICAgcy5mZnRfY2FsYygmcywgdGFiKTsKLQotICAgICAgICBmZnRfcmVmKHRhYl9yZWYsIHRhYjEsIGZmdF9uYml0cyk7Ci0gICAgICAgIGVyciA9IGNoZWNrX2RpZmYoJnRhYl9yZWYtPnJlLCAmdGFiLT5yZSwgZmZ0X3NpemUgKiAyLCAxLjApOwotICAgICAgICBicmVhazsKLSNpZiBGRlRfRkxPQVQKLSNpZiBDT05GSUdfUkRGVAotICAgIGNhc2UgVFJBTlNGT1JNX1JERlQ6Ci0gICAgewotICAgICAgICBpbnQgZmZ0X3NpemVfMiA9IGZmdF9zaXplID4+IDE7Ci0gICAgICAgIGlmIChkb19pbnZlcnNlKSB7Ci0gICAgICAgICAgICB0YWIxWzBdLmltICAgICAgICAgID0gMDsKLSAgICAgICAgICAgIHRhYjFbZmZ0X3NpemVfMl0uaW0gPSAwOwotICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IGZmdF9zaXplXzI7IGkrKykgewotICAgICAgICAgICAgICAgIHRhYjFbZmZ0X3NpemVfMiArIGldLnJlID0gIHRhYjFbZmZ0X3NpemVfMiAtIGldLnJlOwotICAgICAgICAgICAgICAgIHRhYjFbZmZ0X3NpemVfMiArIGldLmltID0gLXRhYjFbZmZ0X3NpemVfMiAtIGldLmltOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkodGFiMiwgdGFiMSwgZmZ0X3NpemUgKiBzaXplb2YoRkZUU2FtcGxlKSk7Ci0gICAgICAgICAgICB0YWIyWzFdID0gdGFiMVtmZnRfc2l6ZV8yXS5yZTsKLQotICAgICAgICAgICAgci5yZGZ0X2NhbGMoJnIsIHRhYjIpOwotICAgICAgICAgICAgZmZ0X3JlZih0YWJfcmVmLCB0YWIxLCBmZnRfbmJpdHMpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZmdF9zaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICB0YWJbaV0ucmUgPSB0YWIyW2ldOwotICAgICAgICAgICAgICAgIHRhYltpXS5pbSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBjaGVja19kaWZmKCZ0YWJfcmVmLT5yZSwgJnRhYi0+cmUsIGZmdF9zaXplICogMiwgMC41KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmZnRfc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgdGFiMltpXSAgICA9IHRhYjFbaV0ucmU7Ci0gICAgICAgICAgICAgICAgdGFiMVtpXS5pbSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByLnJkZnRfY2FsYygmciwgdGFiMik7Ci0gICAgICAgICAgICBmZnRfcmVmKHRhYl9yZWYsIHRhYjEsIGZmdF9uYml0cyk7Ci0gICAgICAgICAgICB0YWJfcmVmWzBdLmltID0gdGFiX3JlZltmZnRfc2l6ZV8yXS5yZTsKLSAgICAgICAgICAgIGVyciA9IGNoZWNrX2RpZmYoJnRhYl9yZWYtPnJlLCB0YWIyLCBmZnRfc2l6ZSwgMS4wKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0jZW5kaWYgLyogQ09ORklHX1JERlQgKi8KLSNpZiBDT05GSUdfRENUCi0gICAgY2FzZSBUUkFOU0ZPUk1fRENUOgotICAgICAgICBtZW1jcHkodGFiLCB0YWIxLCBmZnRfc2l6ZSAqIHNpemVvZihGRlRDb21wbGV4KSk7Ci0gICAgICAgIGQuZGN0X2NhbGMoJmQsICZ0YWItPnJlKTsKLSAgICAgICAgaWYgKGRvX2ludmVyc2UpCi0gICAgICAgICAgICBpZGN0X3JlZigmdGFiX3JlZi0+cmUsICZ0YWIxLT5yZSwgZmZ0X25iaXRzKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZGN0X3JlZigmdGFiX3JlZi0+cmUsICZ0YWIxLT5yZSwgZmZ0X25iaXRzKTsKLSAgICAgICAgZXJyID0gY2hlY2tfZGlmZigmdGFiX3JlZi0+cmUsICZ0YWItPnJlLCBmZnRfc2l6ZSwgMS4wKTsKLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYgLyogQ09ORklHX0RDVCAqLwotI2VuZGlmIC8qIEZGVF9GTE9BVCAqLwotICAgIH0KLQotICAgIC8qIGRvIGEgc3BlZWQgdGVzdCAqLwotCi0gICAgaWYgKGRvX3NwZWVkKSB7Ci0gICAgICAgIGludDY0X3QgdGltZV9zdGFydCwgZHVyYXRpb247Ci0gICAgICAgIGludCBuYl9pdHM7Ci0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiU3BlZWQgdGVzdC4uLlxuIik7Ci0gICAgICAgIC8qIHdlIG1lYXN1cmUgZHVyaW5nIGFib3V0IDEgc2Vjb25kcyAqLwotICAgICAgICBuYl9pdHMgPSAxOwotICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICB0aW1lX3N0YXJ0ID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOwotICAgICAgICAgICAgZm9yIChpdCA9IDA7IGl0IDwgbmJfaXRzOyBpdCsrKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh0cmFuc2Zvcm0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRSQU5TRk9STV9NRENUOgotICAgICAgICAgICAgICAgICAgICBpZiAoZG9faW52ZXJzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG0uaW1kY3RfY2FsYygmbSwgJnRhYi0+cmUsICZ0YWIxLT5yZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIG0ubWRjdF9jYWxjKCZtLCAmdGFiLT5yZSwgJnRhYjEtPnJlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUUkFOU0ZPUk1fRkZUOgotICAgICAgICAgICAgICAgICAgICBtZW1jcHkodGFiLCB0YWIxLCBmZnRfc2l6ZSAqIHNpemVvZihGRlRDb21wbGV4KSk7Ci0gICAgICAgICAgICAgICAgICAgIHMuZmZ0X2NhbGMoJnMsIHRhYik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2lmIEZGVF9GTE9BVAotICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNGT1JNX1JERlQ6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSh0YWIyLCB0YWIxLCBmZnRfc2l6ZSAqIHNpemVvZihGRlRTYW1wbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgci5yZGZ0X2NhbGMoJnIsIHRhYjIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRSQU5TRk9STV9EQ1Q6Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSh0YWIyLCB0YWIxLCBmZnRfc2l6ZSAqIHNpemVvZihGRlRTYW1wbGUpKTsKLSAgICAgICAgICAgICAgICAgICAgZC5kY3RfY2FsYygmZCwgdGFiMik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmIC8qIEZGVF9GTE9BVCAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGR1cmF0aW9uID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gdGltZV9zdGFydDsKLSAgICAgICAgICAgIGlmIChkdXJhdGlvbiA+PSAxMDAwMDAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgbmJfaXRzICo9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAotICAgICAgICAgICAgICAgInRpbWU6ICUwLjFmIHVzL3RyYW5zZm9ybSBbdG90YWwgdGltZT0lMC4yZiBzIGl0cz0lZF1cbiIsCi0gICAgICAgICAgICAgICAoZG91YmxlKSBkdXJhdGlvbiAvIG5iX2l0cywKLSAgICAgICAgICAgICAgIChkb3VibGUpIGR1cmF0aW9uIC8gMTAwMDAwMC4wLAotICAgICAgICAgICAgICAgbmJfaXRzKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHRyYW5zZm9ybSkgewotI2lmIENPTkZJR19NRENUCi0gICAgY2FzZSBUUkFOU0ZPUk1fTURDVDoKLSAgICAgICAgZmZfbWRjdF9lbmQoJm0pOwotICAgICAgICBicmVhazsKLSNlbmRpZiAvKiBDT05GSUdfTURDVCAqLwotICAgIGNhc2UgVFJBTlNGT1JNX0ZGVDoKLSAgICAgICAgZmZfZmZ0X2VuZCgmcyk7Ci0gICAgICAgIGJyZWFrOwotI2lmIEZGVF9GTE9BVAotIyAgICBpZiBDT05GSUdfUkRGVAotICAgIGNhc2UgVFJBTlNGT1JNX1JERlQ6Ci0gICAgICAgIGZmX3JkZnRfZW5kKCZyKTsKLSAgICAgICAgYnJlYWs7Ci0jICAgIGVuZGlmIC8qIENPTkZJR19SREZUICovCi0jICAgIGlmIENPTkZJR19EQ1QKLSAgICBjYXNlIFRSQU5TRk9STV9EQ1Q6Ci0gICAgICAgIGZmX2RjdF9lbmQoJmQpOwotICAgICAgICBicmVhazsKLSMgICAgZW5kaWYgLyogQ09ORklHX0RDVCAqLwotI2VuZGlmIC8qIEZGVF9GTE9BVCAqLwotICAgIH0KLQotY2xlYW51cDoKLSAgICBhdl9mcmVlKHRhYik7Ci0gICAgYXZfZnJlZSh0YWIxKTsKLSAgICBhdl9mcmVlKHRhYjIpOwotICAgIGF2X2ZyZWUodGFiX3JlZik7Ci0gICAgYXZfZnJlZShleHB0YWIpOwotCi0gICAgaWYgKGVycikKLSAgICAgICAgcHJpbnRmKCJFcnJvcjogJWQuXG4iLCBlcnIpOwotCi0gICAgcmV0dXJuICEhZXJyOwotfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mZnQuaCBiL2xpYmF2Y29kZWMvZmZ0LmgKaW5kZXggNjRmMGY2My4uYzg1ODU3MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mZnQuaAorKysgYi9saWJhdmNvZGVjL2ZmdC5oCkBAIC0xMTAsNiArMTEwLDcgQEAKICAgICB2b2lkICgqbWRjdF9jYWxjdykoc3RydWN0IEZGVENvbnRleHQgKnMsIEZGVERvdWJsZSAqb3V0cHV0LCBjb25zdCBGRlRTYW1wbGUgKmlucHV0KTsKICAgICBlbnVtIGZmdF9wZXJtdXRhdGlvbl90eXBlIGZmdF9wZXJtdXRhdGlvbjsKICAgICBlbnVtIG1kY3RfcGVybXV0YXRpb25fdHlwZSBtZGN0X3Blcm11dGF0aW9uOworICAgIHVpbnQzMl90ICpyZXZ0YWIzMjsKIH07CiAKICNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUwpAQCAtMTM0LDcgKzEzNSw4IEBACiBleHRlcm4gQ09TVEFCTEUoMTYzODQpOwogZXh0ZXJuIENPU1RBQkxFKDMyNzY4KTsKIGV4dGVybiBDT1NUQUJMRSg2NTUzNik7Ci1leHRlcm4gQ09TVEFCTEVfQ09OU1QgRkZUU2FtcGxlKiBjb25zdCBGRlRfTkFNRShmZl9jb3NfdGFicylbMTddOworZXh0ZXJuIENPU1RBQkxFKDEzMTA3Mik7CitleHRlcm4gQ09TVEFCTEVfQ09OU1QgRkZUU2FtcGxlKiBjb25zdCBGRlRfTkFNRShmZl9jb3NfdGFicylbMThdOwogCiAjZGVmaW5lIGZmX2luaXRfZmZfY29zX3RhYnMgRkZUX05BTUUoZmZfaW5pdF9mZl9jb3NfdGFicykKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mZnRfaW5pdF90YWJsZS5jIGIvbGliYXZjb2RlYy9mZnRfaW5pdF90YWJsZS5jCmluZGV4IDRkNzRmOGEuLmM0ODgwMTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZmZ0X2luaXRfdGFibGUuYworKysgYi9saWJhdmNvZGVjL2ZmdF9pbml0X3RhYmxlLmMKQEAgLTU0LDEzNyArNTQsMjY1IEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy9mZnRfdGFibGUuaCIKIAogY29uc3QgaW50MzJfdCBmZl93X3RhYl9zcltNQVhfRkZUX1NJWkUvKDQqMTYpXSA9IHsKLSAgICAyMTQ3NDgzNjQ3LCAyMTQ3NDgxMTIxLCAyMTQ3NDczNTQyLCAyMTQ3NDYwOTA4LCAyMTQ3NDQzMjIyLCAyMTQ3NDIwNDgzLCAyMTQ3MzkyNjkwLCAyMTQ3MzU5ODQ1LAotICAgIDIxNDczMjE5NDYsIDIxNDcyNzg5OTUsIDIxNDcyMzA5OTEsIDIxNDcxNzc5MzQsIDIxNDcxMTk4MjUsIDIxNDcwNTY2NjQsIDIxNDY5ODg0NTAsIDIxNDY5MTUxODQsCi0gICAgMjE0NjgzNjg2NiwgMjE0Njc1MzQ5NywgMjE0NjY2NTA3NiwgMjE0NjU3MTYwMywgMjE0NjQ3MzA4MCwgMjE0NjM2OTUwNSwgMjE0NjI2MDg4MSwgMjE0NjE0NzIwNSwKLSAgICAyMTQ2MDI4NDgwLCAyMTQ1OTA0NzA1LCAyMTQ1Nzc1ODgwLCAyMTQ1NjQyMDA2LCAyMTQ1NTAzMDgzLCAyMTQ1MzU5MTEyLCAyMTQ1MjEwMDkyLCAyMTQ1MDU2MDI1LAotICAgIDIxNDQ4OTY5MTAsIDIxNDQ3MzI3NDgsIDIxNDQ1NjM1MzksIDIxNDQzODkyODMsIDIxNDQyMDk5ODIsIDIxNDQwMjU2MzUsIDIxNDM4MzYyNDQsIDIxNDM2NDE4MDcsCi0gICAgMjE0MzQ0MjMyNiwgMjE0MzIzNzgwMiwgMjE0MzAyODIzNCwgMjE0MjgxMzYyNCwgMjE0MjU5Mzk3MSwgMjE0MjM2OTI3NiwgMjE0MjEzOTU0MSwgMjE0MTkwNDc2NCwKLSAgICAyMTQxNjY0OTQ4LCAyMTQxNDIwMDkyLCAyMTQxMTcwMTk3LCAyMTQwOTE1MjY0LCAyMTQwNjU1MjkzLCAyMTQwMzkwMjg0LCAyMTQwMTIwMjQwLCAyMTM5ODQ1MTU5LAotICAgIDIxMzk1NjUwNDMsIDIxMzkyNzk4OTIsIDIxMzg5ODk3MDgsIDIxMzg2OTQ0OTAsIDIxMzgzOTQyNDAsIDIxMzgwODg5NTgsIDIxMzc3Nzg2NDQsIDIxMzc0NjMzMDEsCi0gICAgMjEzNzE0MjkyNywgMjEzNjgxNzUyNSwgMjEzNjQ4NzA5NSwgMjEzNjE1MTYzNywgMjEzNTgxMTE1MywgMjEzNTQ2NTY0MiwgMjEzNTExNTEwNywgMjEzNDc1OTU0OCwKLSAgICAyMTM0Mzk4OTY2LCAyMTM0MDMzMzYxLCAyMTMzNjYyNzM0LCAyMTMzMjg3MDg3LCAyMTMyOTA2NDIwLCAyMTMyNTIwNzM0LCAyMTMyMTMwMDMwLCAyMTMxNzM0MzA5LAotICAgIDIxMzEzMzM1NzIsIDIxMzA5Mjc4MTksIDIxMzA1MTcwNTIsIDIxMzAxMDEyNzIsIDIxMjk2ODA0ODAsIDIxMjkyNTQ2NzYsIDIxMjg4MjM4NjIsIDIxMjgzODgwMzgsCi0gICAgMjEyNzk0NzIwNiwgMjEyNzUwMTM2NywgMjEyNzA1MDUyMiwgMjEyNjU5NDY3MiwgMjEyNjEzMzgxNywgMjEyNTY2Nzk2MCwgMjEyNTE5NzEwMCwgMjEyNDcyMTI0MCwKLSAgICAyMTI0MjQwMzgwLCAyMTIzNzU0NTIyLCAyMTIzMjYzNjY2LCAyMTIyNzY3ODE0LCAyMTIyMjY2OTY3LCAyMTIxNzYxMTI2LCAyMTIxMjUwMjkyLCAyMTIwNzM0NDY3LAotICAgIDIxMjAyMTM2NTEsIDIxMTk2ODc4NDcsIDIxMTkxNTcwNTQsIDIxMTg2MjEyNzUsIDIxMTgwODA1MTEsIDIxMTc1MzQ3NjIsIDIxMTY5ODQwMzEsIDIxMTY0MjgzMTksCi0gICAgMjExNTg2NzYyNiwgMjExNTMwMTk1NCwgMjExNDczMTMwNSwgMjExNDE1NTY4MCwgMjExMzU3NTA4MCwgMjExMjk4OTUwNiwgMjExMjM5ODk2MCwgMjExMTgwMzQ0NCwKLSAgICAyMTExMjAyOTU5LCAyMTEwNTk3NTA1LCAyMTA5OTg3MDg1LCAyMTA5MzcxNzAwLCAyMTA4NzUxMzUyLCAyMTA4MTI2MDQxLCAyMTA3NDk1NzcwLCAyMTA2ODYwNTQwLAotICAgIDIxMDYyMjAzNTIsIDIxMDU1NzUyMDgsIDIxMDQ5MjUxMDksIDIxMDQyNzAwNTcsIDIxMDM2MTAwNTQsIDIxMDI5NDUxMDEsIDIxMDIyNzUxOTksIDIxMDE2MDAzNTAsCi0gICAgMjEwMDkyMDU1NiwgMjEwMDIzNTgxOSwgMjA5OTU0NjEzOSwgMjA5ODg1MTUxOSwgMjA5ODE1MTk2MCwgMjA5NzQ0NzQ2NCwgMjA5NjczODAzMiwgMjA5NjAyMzY2NywKLSAgICAyMDk1MzA0MzcwLCAyMDk0NTgwMTQyLCAyMDkzODUwOTg1LCAyMDkzMTE2OTAxLCAyMDkyMzc3ODkyLCAyMDkxNjMzOTYwLCAyMDkwODg1MTA1LCAyMDkwMTMxMzMxLAotICAgIDIwODkzNzI2MzgsIDIwODg2MDkwMjksIDIwODc4NDA1MDUsIDIwODcwNjcwNjgsIDIwODYyODg3MjAsIDIwODU1MDU0NjMsIDIwODQ3MTcyOTgsIDIwODM5MjQyMjgsCi0gICAgMjA4MzEyNjI1NCwgMjA4MjMyMzM3OSwgMjA4MTUxNTYwMywgMjA4MDcwMjkzMCwgMjA3OTg4NTM2MCwgMjA3OTA2Mjg5NiwgMjA3ODIzNTU0MCwgMjA3NzQwMzI5NCwKLSAgICAyMDc2NTY2MTYwLCAyMDc1NzI0MTM5LCAyMDc0ODc3MjMzLCAyMDc0MDI1NDQ2LCAyMDczMTY4Nzc3LCAyMDcyMzA3MjMxLCAyMDcxNDQwODA4LCAyMDcwNTY5NTExLAotICAgIDIwNjk2OTMzNDIsIDIwNjg4MTIzMDIsIDIwNjc5MjYzOTQsIDIwNjcwMzU2MjEsIDIwNjYxMzk5ODMsIDIwNjUyMzk0ODQsIDIwNjQzMzQxMjQsIDIwNjM0MjM5MDgsCi0gICAgMjA2MjUwODgzNSwgMjA2MTU4ODkxMCwgMjA2MDY2NDEzMywgMjA1OTczNDUwOCwgMjA1ODgwMDAzNiwgMjA1Nzg2MDcxOSwgMjA1NjkxNjU2MCwgMjA1NTk2NzU2MCwKLSAgICAyMDU1MDEzNzIzLCAyMDU0MDU1MDUwLCAyMDUzMDkxNTQ0LCAyMDUyMTIzMjA3LCAyMDUxMTUwMDQwLCAyMDUwMTcyMDQ4LCAyMDQ5MTg5MjMxLCAyMDQ4MjAxNTkyLAotICAgIDIwNDcyMDkxMzMsIDIwNDYyMTE4NTcsIDIwNDUyMDk3NjcsIDIwNDQyMDI4NjMsIDIwNDMxOTExNTAsIDIwNDIxNzQ2MjgsIDIwNDExNTMzMDEsIDIwNDAxMjcxNzIsCi0gICAgMjAzOTA5NjI0MSwgMjAzODA2MDUxMiwgMjAzNzAxOTk4OCwgMjAzNTk3NDY3MCwgMjAzNDkyNDU2MiwgMjAzMzg2OTY2NSwgMjAzMjgwOTk4MiwgMjAzMTc0NTUxNiwKLSAgICAyMDMwNjc2MjY5LCAyMDI5NjAyMjQzLCAyMDI4NTIzNDQyLCAyMDI3NDM5ODY3LCAyMDI2MzUxNTIyLCAyMDI1MjU4NDA4LCAyMDI0MTYwNTI5LCAyMDIzMDU3ODg3LAotICAgIDIwMjE5NTA0ODQsIDIwMjA4MzgzMjMsIDIwMTk3MjE0MDcsIDIwMTg1OTk3MzksIDIwMTc0NzMzMjEsIDIwMTYzNDIxNTUsIDIwMTUyMDYyNDUsIDIwMTQwNjU1OTIsCi0gICAgMjAxMjkyMDIwMSwgMjAxMTc3MDA3MywgMjAxMDYxNTIxMCwgMjAwOTQ1NTYxNywgMjAwODI5MTI5NSwgMjAwNzEyMjI0OCwgMjAwNTk0ODQ3OCwgMjAwNDc2OTk4NywKLSAgICAyMDAzNTg2Nzc5LCAyMDAyMzk4ODU3LCAyMDAxMjA2MjIyLCAyMDAwMDA4ODc5LCAxOTk4ODA2ODI5LCAxOTk3NjAwMDc2LCAxOTk2Mzg4NjIyLCAxOTk1MTcyNDcxLAotICAgIDE5OTM5NTE2MjUsIDE5OTI3MjYwODcsIDE5OTE0OTU4NjAsIDE5OTAyNjA5NDYsIDE5ODkwMjEzNTAsIDE5ODc3NzcwNzMsIDE5ODY1MjgxMTgsIDE5ODUyNzQ0ODksCi0gICAgMTk4NDAxNjE4OSwgMTk4Mjc1MzIyMCwgMTk4MTQ4NTU4NSwgMTk4MDIxMzI4OCwgMTk3ODkzNjMzMSwgMTk3NzY1NDcxNywgMTk3NjM2ODQ1MCwgMTk3NTA3NzUzMiwKLSAgICAxOTczNzgxOTY3LCAxOTcyNDgxNzU3LCAxOTcxMTc2OTA2LCAxOTY5ODY3NDE3LCAxOTY4NTUzMjkyLCAxOTY3MjM0NTM1LCAxOTY1OTExMTQ4LCAxOTY0NTgzMTM2LAotICAgIDE5NjMyNTA1MDEsIDE5NjE5MTMyNDYsIDE5NjA1NzEzNzUsIDE5NTkyMjQ4OTAsIDE5NTc4NzM3OTYsIDE5NTY1MTgwOTMsIDE5NTUxNTc3ODgsIDE5NTM3OTI4ODEsCi0gICAgMTk1MjQyMzM3NywgMTk1MTA0OTI3OSwgMTk0OTY3MDU4OSwgMTk0ODI4NzMxMiwgMTk0Njg5OTQ1MSwgMTk0NTUwNzAwOCwgMTk0NDEwOTk4NywgMTk0MjcwODM5MiwKLSAgICAxOTQxMzAyMjI1LCAxOTM5ODkxNDkwLCAxOTM4NDc2MTkwLCAxOTM3MDU2MzI5LCAxOTM1NjMxOTEwLCAxOTM0MjAyOTM2LCAxOTMyNzY5NDExLCAxOTMxMzMxMzM4LAotICAgIDE5Mjk4ODg3MjAsIDE5Mjg0NDE1NjEsIDE5MjY5ODk4NjQsIDE5MjU1MzM2MzMsIDE5MjQwNzI4NzEsIDE5MjI2MDc1ODEsIDE5MjExMzc3NjcsIDE5MTk2NjM0MzIsCi0gICAgMTkxODE4NDU4MSwgMTkxNjcwMTIxNiwgMTkxNTIxMzM0MCwgMTkxMzcyMDk1OCwgMTkxMjIyNDA3MywgMTkxMDcyMjY4OCwgMTkwOTIxNjgwNiwgMTkwNzcwNjQzMywKLSAgICAxOTA2MTkxNTcwLCAxOTA0NjcyMjIyLCAxOTAzMTQ4MzkyLCAxOTAxNjIwMDg0LCAxOTAwMDg3MzAxLCAxODk4NTUwMDQ3LCAxODk3MDA4MzI1LCAxODk1NDYyMTQwLAotICAgIDE4OTM5MTE0OTQsIDE4OTIzNTYzOTIsIDE4OTA3OTY4MzcsIDE4ODkyMzI4MzIsIDE4ODc2NjQzODMsIDE4ODYwOTE0OTEsIDE4ODQ1MTQxNjEsIDE4ODI5MzIzOTcsCi0gICAgMTg4MTM0NjIwMiwgMTg3OTc1NTU4MCwgMTg3ODE2MDUzNSwgMTg3NjU2MTA3MCwgMTg3NDk1NzE4OSwgMTg3MzM0ODg5NywgMTg3MTczNjE5NiwgMTg3MDExOTA5MSwKLSAgICAxODY4NDk3NTg2LCAxODY2ODcxNjgzLCAxODY1MjQxMzg4LCAxODYzNjA2NzA0LCAxODYxOTY3NjM0LCAxODYwMzI0MTgzLCAxODU4Njc2MzU1LCAxODU3MDI0MTUzLAotICAgIDE4NTUzNjc1ODEsIDE4NTM3MDY2NDMsIDE4NTIwNDEzNDMsIDE4NTAzNzE2ODYsIDE4NDg2OTc2NzQsIDE4NDcwMTkzMTIsIDE4NDUzMzY2MDQsIDE4NDM2NDk1NTMsCi0gICAgMTg0MTk1ODE2NCwgMTg0MDI2MjQ0MSwgMTgzODU2MjM4OCwgMTgzNjg1ODAwOCwgMTgzNTE0OTMwNiwgMTgzMzQzNjI4NiwgMTgzMTcxODk1MSwgMTgyOTk5NzMwNywKLSAgICAxODI4MjcxMzU2LCAxODI2NTQxMTAzLCAxODI0ODA2NTUyLCAxODIzMDY3NzA3LCAxODIxMzI0NTcyLCAxODE5NTc3MTUxLCAxODE3ODI1NDQ5LCAxODE2MDY5NDY5LAotICAgIDE4MTQzMDkyMTYsIDE4MTI1NDQ2OTQsIDE4MTA3NzU5MDYsIDE4MDkwMDI4NTgsIDE4MDcyMjU1NTMsIDE4MDU0NDM5OTUsIDE4MDM2NTgxODksIDE4MDE4NjgxMzksCi0gICAgMTgwMDA3Mzg0OSwgMTc5ODI3NTMyMywgMTc5NjQ3MjU2NSwgMTc5NDY2NTU4MCwgMTc5Mjg1NDM3MiwgMTc5MTAzODk0NiwgMTc4OTIxOTMwNSwgMTc4NzM5NTQ1MywKLSAgICAxNzg1NTY3Mzk2LCAxNzgzNzM1MTM3LCAxNzgxODk4NjgxLCAxNzgwMDU4MDMyLCAxNzc4MjEzMTk0LCAxNzc2MzY0MTcyLCAxNzc0NTEwOTcwLCAxNzcyNjUzNTkzLAotICAgIDE3NzA3OTIwNDQsIDE3Njg5MjYzMjgsIDE3NjcwNTY0NTAsIDE3NjUxODI0MTQsIDE3NjMzMDQyMjQsIDE3NjE0MjE4ODUsIDE3NTk1MzU0MDEsIDE3NTc2NDQ3NzcsCi0gICAgMTc1NTc1MDAxNywgMTc1Mzg1MTEyNiwgMTc1MTk0ODEwNywgMTc1MDA0MDk2NiwgMTc0ODEyOTcwNywgMTc0NjIxNDMzNCwgMTc0NDI5NDg1MywgMTc0MjM3MTI2NywKLSAgICAxNzQwNDQzNTgxLCAxNzM4NTExNzk5LCAxNzM2NTc1OTI3LCAxNzM0NjM1OTY4LCAxNzMyNjkxOTI4LCAxNzMwNzQzODEwLCAxNzI4NzkxNjIwLCAxNzI2ODM1MzYxLAotICAgIDE3MjQ4NzUwNDAsIDE3MjI5MTA2NTksIDE3MjA5NDIyMjUsIDE3MTg5Njk3NDAsIDE3MTY5OTMyMTEsIDE3MTUwMTI2NDIsIDE3MTMwMjgwMzcsIDE3MTEwMzk0MDEsCi0gICAgMTcwOTA0NjczOSwgMTcwNzA1MDA1NSwgMTcwNTA0OTM1NSwgMTcwMzA0NDY0MiwgMTcwMTAzNTkyMiwgMTY5OTAyMzE5OSwgMTY5NzAwNjQ3OSwgMTY5NDk4NTc2NSwKLSAgICAxNjkyOTYxMDYyLCAxNjkwOTMyMzc2LCAxNjg4ODk5NzExLCAxNjg2ODYzMDcyLCAxNjg0ODIyNDYzLCAxNjgyNzc3ODkwLCAxNjgwNzI5MzU3LCAxNjc4Njc2ODcwLAotICAgIDE2NzY2MjA0MzIsIDE2NzQ1NjAwNDksIDE2NzI0OTU3MjUsIDE2NzA0Mjc0NjYsIDE2NjgzNTUyNzYsIDE2NjYyNzkxNjEsIDE2NjQxOTkxMjQsIDE2NjIxMTUxNzIsCi0gICAgMTY2MDAyNzMwOCwgMTY1NzkzNTUzOSwgMTY1NTgzOTg2NywgMTY1Mzc0MDMwMCwgMTY1MTYzNjg0MSwgMTY0OTUyOTQ5NiwgMTY0NzQxODI2OSwgMTY0NTMwMzE2NiwKLSAgICAxNjQzMTg0MTkxLCAxNjQxMDYxMzQ5LCAxNjM4OTM0NjQ2LCAxNjM2ODA0MDg3LCAxNjM0NjY5Njc2LCAxNjMyNTMxNDE4LCAxNjMwMzg5MzE5LCAxNjI4MjQzMzgzLAotICAgIDE2MjYwOTM2MTYsIDE2MjM5NDAwMjMsIDE2MjE3ODI2MDgsIDE2MTk2MjEzNzcsIDE2MTc0NTYzMzUsIDE2MTUyODc0ODcsIDE2MTMxMTQ4MzgsIDE2MTA5MzgzOTMsCi0gICAgMTYwODc1ODE1NywgMTYwNjU3NDEzNiwgMTYwNDM4NjMzNSwgMTYwMjE5NDc1OCwgMTU5OTk5OTQxMSwgMTU5NzgwMDI5OSwgMTU5NTU5NzQyOCwgMTU5MzM5MDgwMSwKLSAgICAxNTkxMTgwNDI2LCAxNTg4OTY2MzA2LCAxNTg2NzQ4NDQ3LCAxNTg0NTI2ODU0LCAxNTgyMzAxNTMzLCAxNTgwMDcyNDg5LCAxNTc3ODM5NzI2LCAxNTc1NjAzMjUxLAotICAgIDE1NzMzNjMwNjgsIDE1NzExMTkxODMsIDE1Njg4NzE2MDEsIDE1NjY2MjAzMjcsIDE1NjQzNjUzNjcsIDE1NjIxMDY3MjUsIDE1NTk4NDQ0MDgsIDE1NTc1Nzg0MjEsCi0gICAgMTU1NTMwODc2OCwgMTU1MzAzNTQ1NSwgMTU1MDc1ODQ4OCwgMTU0ODQ3Nzg3MiwgMTU0NjE5MzYxMiwgMTU0MzkwNTcxNCwgMTU0MTYxNDE4MywgMTUzOTMxOTAyNCwKLSAgICAxNTM3MDIwMjQ0LCAxNTM0NzE3ODQ2LCAxNTMyNDExODM3LCAxNTMwMTAyMjIyLCAxNTI3Nzg5MDA3LCAxNTI1NDcyMTk3LCAxNTIzMTUxNzk3LCAxNTIwODI3ODEzLAotICAgIDE1MTg1MDAyNTAsIDE1MTYxNjkxMTQsIDE1MTM4MzQ0MTEsIDE1MTE0OTYxNDUsIDE1MDkxNTQzMjIsIDE1MDY4MDg5NDksIDE1MDQ0NjAwMjksIDE1MDIxMDc1NzAsCi0gICAgMTQ5OTc1MTU3NiwgMTQ5NzM5MjA1MywgMTQ5NTAyOTAwNiwgMTQ5MjY2MjQ0MSwgMTQ5MDI5MjM2NCwgMTQ4NzkxODc4MSwgMTQ4NTU0MTY5NiwgMTQ4MzE2MTExNSwKLSAgICAxNDgwNzc3MDQ0LCAxNDc4Mzg5NDg5LCAxNDc1OTk4NDU2LCAxNDczNjAzOTQ5LCAxNDcxMjA1OTc0LCAxNDY4ODA0NTM4LCAxNDY2Mzk5NjQ1LCAxNDYzOTkxMzAyLAotICAgIDE0NjE1Nzk1MTQsIDE0NTkxNjQyODYsIDE0NTY3NDU2MjUsIDE0NTQzMjM1MzYsIDE0NTE4OTgwMjUsIDE0NDk0NjkwOTgsIDE0NDcwMzY3NjAsIDE0NDQ2MDEwMTcsCi0gICAgMTQ0MjE2MTg3NCwgMTQzOTcxOTMzOCwgMTQzNzI3MzQxNCwgMTQzNDgyNDEwOSwgMTQzMjM3MTQyNiwgMTQyOTkxNTM3NCwgMTQyNzQ1NTk1NiwgMTQyNDk5MzE4MCwKLSAgICAxNDIyNTI3MDUxLCAxNDIwMDU3NTc0LCAxNDE3NTg0NzU1LCAxNDE1MTA4NjAxLCAxNDEyNjI5MTE3LCAxNDEwMTQ2MzA5LCAxNDA3NjYwMTgzLCAxNDA1MTcwNzQ1LAotICAgIDE0MDI2NzgwMDAsIDE0MDAxODE5NTQsIDEzOTc2ODI2MTMsIDEzOTUxNzk5ODQsIDEzOTI2NzQwNzIsIDEzOTAxNjQ4ODIsIDEzODc2NTI0MjIsIDEzODUxMzY2OTYsCi0gICAgMTM4MjYxNzcxMCwgMTM4MDA5NTQ3MiwgMTM3NzU2OTk4NiwgMTM3NTA0MTI1OCwgMTM3MjUwOTI5NCwgMTM2OTk3NDEwMSwgMTM2NzQzNTY4NSwgMTM2NDg5NDA1MCwKLSAgICAxMzYyMzQ5MjA0LCAxMzU5ODAxMTUyLCAxMzU3MjQ5OTAxLCAxMzU0Njk1NDU1LCAxMzUyMTM3ODIyLCAxMzQ5NTc3MDA3LCAxMzQ3MDEzMDE3LCAxMzQ0NDQ1ODU3LAotICAgIDEzNDE4NzU1MzMsIDEzMzkzMDIwNTIsIDEzMzY3MjU0MTksIDEzMzQxNDU2NDEsIDEzMzE1NjI3MjMsIDEzMjg5NzY2NzIsIDEzMjYzODc0OTQsIDEzMjM3OTUxOTUsCi0gICAgMTMyMTE5OTc4MSwgMTMxODYwMTI1NywgMTMxNTk5OTYzMSwgMTMxMzM5NDkwOSwgMTMxMDc4NzA5NSwgMTMwODE3NjE5OCwgMTMwNTU2MjIyMiwgMTMwMjk0NTE3NCwKLSAgICAxMzAwMzI1MDYwLCAxMjk3NzAxODg2LCAxMjk1MDc1NjU5LCAxMjkyNDQ2Mzg0LCAxMjg5ODE0MDY4LCAxMjg3MTc4NzE3LCAxMjg0NTQwMzM3LCAxMjgxODk4OTM1LAotICAgIDEyNzkyNTQ1MTYsIDEyNzY2MDcwODYsIDEyNzM5NTY2NTMsIDEyNzEzMDMyMjIsIDEyNjg2NDY4MDAsIDEyNjU5ODczOTIsIDEyNjMzMjUwMDUsIDEyNjA2NTk2NDYsCi0gICAgMTI1Nzk5MTMyMCwgMTI1NTMyMDAzNCwgMTI1MjY0NTc5NCwgMTI0OTk2ODYwNiwgMTI0NzI4ODQ3OCwgMTI0NDYwNTQxNCwgMTI0MTkxOTQyMSwgMTIzOTIzMDUwNiwKLSAgICAxMjM2NTM4Njc1LCAxMjMzODQzOTM1LCAxMjMxMTQ2MjkxLCAxMjI4NDQ1NzUwLCAxMjI1NzQyMzE4LCAxMjIzMDM2MDAyLCAxMjIwMzI2ODA5LCAxMjE3NjE0NzQzLAotICAgIDEyMTQ4OTk4MTMsIDEyMTIxODIwMjQsIDEyMDk0NjEzODIsIDEyMDY3Mzc4OTQsIDEyMDQwMTE1NjcsIDEyMDEyODI0MDcsIDExOTg1NTA0MTksIDExOTU4MTU2MTIsCi0gICAgMTE5MzA3Nzk5MSwgMTE5MDMzNzU2MiwgMTE4NzU5NDMzMiwgMTE4NDg0ODMwOCwgMTE4MjA5OTQ5NiwgMTE3OTM0NzkwMiwgMTE3NjU5MzUzMywgMTE3MzgzNjM5NSwKLSAgICAxMTcxMDc2NDk1LCAxMTY4MzEzODQwLCAxMTY1NTQ4NDM1LCAxMTYyNzgwMjg4LCAxMTYwMDA5NDA1LCAxMTU3MjM1NzkyLCAxMTU0NDU5NDU2LCAxMTUxNjgwNDAzLAotICAgIDExNDg4OTg2NDAsIDExNDYxMTQxNzQsIDExNDMzMjcwMTEsIDExNDA1MzcxNTgsIDExMzc3NDQ2MjEsIDExMzQ5NDk0MDYsIDExMzIxNTE1MjEsIDExMjkzNTA5NzIsCi0gICAgMTEyNjU0Nzc2NSwgMTEyMzc0MTkwOCwgMTEyMDkzMzQwNiwgMTExODEyMjI2NywgMTExNTMwODQ5NiwgMTExMjQ5MjEwMSwgMTEwOTY3MzA4OSwgMTEwNjg1MTQ2NSwKLSAgICAxMTA0MDI3MjM3LCAxMTAxMjAwNDEwLCAxMDk4MzcwOTkzLCAxMDk1NTM4OTkxLCAxMDkyNzA0NDExLCAxMDg5ODY3MjU5LCAxMDg3MDI3NTQ0LCAxMDg0MTg1MjcwLAotICAgIDEwODEzNDA0NDUsIDEwNzg0OTMwNzYsIDEwNzU2NDMxNjksIDEwNzI3OTA3MzAsIDEwNjk5MzU3NjgsIDEwNjcwNzgyODgsIDEwNjQyMTgyOTYsIDEwNjEzNTU4MDEsCi0gICAgMTA1ODQ5MDgwOCwgMTA1NTYyMzMyNCwgMTA1Mjc1MzM1NywgMTA0OTg4MDkxMiwgMTA0NzAwNTk5NiwgMTA0NDEyODYxNywgMTA0MTI0ODc4MSwgMTAzODM2NjQ5NSwKLSAgICAxMDM1NDgxNzY2LCAxMDMyNTk0NjAwLCAxMDI5NzA1MDA0LCAxMDI2ODEyOTg1LCAxMDIzOTE4NTUwLCAxMDIxMDIxNzA1LCAxMDE4MTIyNDU4LCAxMDE1MjIwODE2LAotICAgIDEwMTIzMTY3ODQsIDEwMDk0MTAzNzAsIDEwMDY1MDE1ODEsIDEwMDM1OTA0MjQsIDEwMDA2NzY5MDUsICA5OTc3NjEwMzEsICA5OTQ4NDI4MTAsICA5OTE5MjIyNDgsCi0gICAgIDk4ODk5OTM1MSwgIDk4NjA3NDEyNywgIDk4MzE0NjU4MywgIDk4MDIxNjcyNiwgIDk3NzI4NDU2MiwgIDk3NDM1MDA5OCwgIDk3MTQxMzM0MiwgIDk2ODQ3NDMwMCwKLSAgICAgOTY1NTMyOTc4LCAgOTYyNTg5Mzg1LCAgOTU5NjQzNTI3LCAgOTU2Njk1NDExLCAgOTUzNzQ1MDQzLCAgOTUwNzkyNDMxLCAgOTQ3ODM3NTgyLCAgOTQ0ODgwNTAzLAotICAgICA5NDE5MjEyMDAsICA5Mzg5NTk2ODEsICA5MzU5OTU5NTIsICA5MzMwMzAwMjEsICA5MzAwNjE4OTQsICA5MjcwOTE1NzksICA5MjQxMTkwODIsICA5MjExNDQ0MTEsCi0gICAgIDkxODE2NzU3MiwgIDkxNTE4ODU3MiwgIDkxMjIwNzQxOSwgIDkwOTIyNDEyMCwgIDkwNjIzODY4MSwgIDkwMzI1MTExMCwgIDkwMDI2MTQxMywgIDg5NzI2OTU5NywKLSAgICAgODk0Mjc1NjcxLCAgODkxMjc5NjQwLCAgODg4MjgxNTEyLCAgODg1MjgxMjkzLCAgODgyMjc4OTkyLCAgODc5Mjc0NjE0LCAgODc2MjY4MTY3LCAgODczMjU5NjU5LAotICAgICA4NzAyNDkwOTUsICA4NjcyMzY0ODQsICA4NjQyMjE4MzIsICA4NjEyMDUxNDcsICA4NTgxODY0MzUsICA4NTUxNjU3MDMsICA4NTIxNDI5NTksICA4NDkxMTgyMTAsCi0gICAgIDg0NjA5MTQ2MywgIDg0MzA2MjcyNiwgIDg0MDAzMjAwNCwgIDgzNjk5OTMwNSwgIDgzMzk2NDYzOCwgIDgzMDkyODAwNywgIDgyNzg4OTQyMiwgIDgyNDg0ODg4OCwKLSAgICAgODIxODA2NDEzLCAgODE4NzYyMDA1LCAgODE1NzE1NjcwLCAgODEyNjY3NDE1LCAgODA5NjE3MjQ5LCAgODA2NTY1MTc3LCAgODAzNTExMjA3LCAgODAwNDU1MzQ2LAotICAgICA3OTczOTc2MDIsICA3OTQzMzc5ODIsICA3OTEyNzY0OTIsICA3ODgyMTMxNDEsICA3ODUxNDc5MzQsICA3ODIwODA4ODAsICA3NzkwMTE5ODYsICA3NzU5NDEyNTksCi0gICAgIDc3Mjg2ODcwNiwgIDc2OTc5NDMzNCwgIDc2NjcxODE1MSwgIDc2MzY0MDE2NCwgIDc2MDU2MDM4MCwgIDc1NzQ3ODgwNiwgIDc1NDM5NTQ0OSwgIDc1MTMxMDMxOCwKLSAgICAgNzQ4MjIzNDE4LCAgNzQ1MTM0NzU4LCAgNzQyMDQ0MzQ1LCAgNzM4OTUyMTg2LCAgNzM1ODU4Mjg3LCAgNzMyNzYyNjU3LCAgNzI5NjY1MzAzLCAgNzI2NTY2MjMyLAotICAgICA3MjM0NjU0NTEsICA3MjAzNjI5NjgsICA3MTcyNTg3OTAsICA3MTQxNTI5MjQsICA3MTEwNDUzNzcsICA3MDc5MzYxNTgsICA3MDQ4MjUyNzIsICA3MDE3MTI3MjgsCi0gICAgIDY5ODU5ODUzMywgIDY5NTQ4MjY5NCwgIDY5MjM2NTIxOCwgIDY4OTI0NjExMywgIDY4NjEyNTM4NywgIDY4MzAwMzA0NSwgIDY3OTg3OTA5NywgIDY3Njc1MzU0OSwKLSAgICAgNjczNjI2NDA4LCAgNjcwNDk3NjgyLCAgNjY3MzY3Mzc5LCAgNjY0MjM1NTA1LCAgNjYxMTAyMDY4LCAgNjU3OTY3MDc1LCAgNjU0ODMwNTM1LCAgNjUxNjkyNDUzLAotICAgICA2NDg1NTI4MzgsICA2NDU0MTE2OTYsICA2NDIyNjkwMzYsICA2MzkxMjQ4NjUsICA2MzU5NzkxOTAsICA2MzI4MzIwMTgsICA2Mjk2ODMzNTcsICA2MjY1MzMyMTUsCi0gICAgIDYyMzM4MTU5OCwgIDYyMDIyODUxNCwgIDYxNzA3Mzk3MSwgIDYxMzkxNzk3NSwgIDYxMDc2MDUzNiwgIDYwNzYwMTY1OCwgIDYwNDQ0MTM1MiwgIDYwMTI3OTYyMywKLSAgICAgNTk4MTE2NDc5LCAgNTk0OTUxOTI3LCAgNTkxNzg1OTc2LCAgNTg4NjE4NjMyLCAgNTg1NDQ5OTAzLCAgNTgyMjc5Nzk2LCAgNTc5MTA4MzIwLCAgNTc1OTM1NDgwLAotICAgICA1NzI3NjEyODUsICA1Njk1ODU3NDMsICA1NjY0MDg4NjAsICA1NjMyMzA2NDUsICA1NjAwNTExMDQsICA1NTY4NzAyNDUsICA1NTM2ODgwNzYsICA1NTA1MDQ2MDQsCi0gICAgIDU0NzMxOTgzNiwgIDU0NDEzMzc4MSwgIDU0MDk0NjQ0NSwgIDUzNzc1NzgzNywgIDUzNDU2Nzk2MywgIDUzMTM3NjgzMSwgIDUyODE4NDQ0OSwgIDUyNDk5MDgyNCwKLSAgICAgNTIxNzk1OTYzLCAgNTE4NTk5ODc1LCAgNTE1NDAyNTY2LCAgNTEyMjA0MDQ1LCAgNTA5MDA0MzE4LCAgNTA1ODAzMzk0LCAgNTAyNjAxMjc5LCAgNDk5Mzk3OTgyLAotICAgICA0OTYxOTM1MDksICA0OTI5ODc4NjksICA0ODk3ODEwNjksICA0ODY1NzMxMTcsICA0ODMzNjQwMTksICA0ODAxNTM3ODQsICA0NzY5NDI0MTksICA0NzM3Mjk5MzIsCi0gICAgIDQ3MDUxNjMzMCwgIDQ2NzMwMTYyMiwgIDQ2NDA4NTgxMywgIDQ2MDg2ODkxMiwgIDQ1NzY1MDkyNywgIDQ1NDQzMTg2NSwgIDQ1MTIxMTczNCwgIDQ0Nzk5MDU0MSwKLSAgICAgNDQ0NzY4Mjk0LCAgNDQxNTQ1MDAwLCAgNDM4MzIwNjY3LCAgNDM1MDk1MzAzLCAgNDMxODY4OTE1LCAgNDI4NjQxNTExLCAgNDI1NDEzMDk4LCAgNDIyMTgzNjg0LAotICAgICA0MTg5NTMyNzYsICA0MTU3MjE4ODMsICA0MTI0ODk1MTIsICA0MDkyNTYxNzAsICA0MDYwMjE4NjUsICA0MDI3ODY2MDQsICAzOTk1NTAzOTYsICAzOTYzMTMyNDcsCi0gICAgIDM5MzA3NTE2NiwgIDM4OTgzNjE2MCwgIDM4NjU5NjIzNywgIDM4MzM1NTQwNCwgIDM4MDExMzY2OSwgIDM3Njg3MTAzOSwgIDM3MzYyNzUyMywgIDM3MDM4MzEyOCwKLSAgICAgMzY3MTM3ODYxLCAgMzYzODkxNzMwLCAgMzYwNjQ0NzQyLCAgMzU3Mzk2OTA2LCAgMzU0MTQ4MjMwLCAgMzUwODk4NzE5LCAgMzQ3NjQ4MzgzLCAgMzQ0Mzk3MjMwLAotICAgICAzNDExNDUyNjUsICAzMzc4OTI0OTgsICAzMzQ2Mzg5MzYsICAzMzEzODQ1ODYsICAzMjgxMjk0NTcsICAzMjQ4NzM1NTUsICAzMjE2MTY4ODksICAzMTgzNTk0NjYsCi0gICAgIDMxNTEwMTI5NSwgIDMxMTg0MjM4MSwgIDMwODU4MjczNCwgIDMwNTMyMjM2MSwgIDMwMjA2MTI2OSwgIDI5ODc5OTQ2NiwgIDI5NTUzNjk2MSwgIDI5MjI3Mzc2MCwKLSAgICAgMjg5MDA5ODcxLCAgMjg1NzQ1MzAyLCAgMjgyNDgwMDYxLCAgMjc5MjE0MTU1LCAgMjc1OTQ3NTkyLCAgMjcyNjgwMzc5LCAgMjY5NDEyNTI1LCAgMjY2MTQ0MDM4LAotICAgICAyNjI4NzQ5MjMsICAyNTk2MDUxOTEsICAyNTYzMzQ4NDcsICAyNTMwNjM5MDAsICAyNDk3OTIzNTgsICAyNDY1MjAyMjgsICAyNDMyNDc1MTgsICAyMzk5NzQyMzUsCi0gICAgIDIzNjcwMDM4OCwgIDIzMzQyNTk4NCwgIDIzMDE1MTAzMCwgIDIyNjg3NTUzNSwgIDIyMzU5OTUwNiwgIDIyMDMyMjk1MSwgIDIxNzA0NTg3OCwgIDIxMzc2ODI5MywKLSAgICAgMjEwNDkwMjA2LCAgMjA3MjExNjI0LCAgMjAzOTMyNTUzLCAgMjAwNjUzMDAzLCAgMTk3MzcyOTgxLCAgMTk0MDkyNDk1LCAgMTkwODExNTUxLCAgMTg3NTMwMTU5LAotICAgICAxODQyNDgzMjUsICAxODA5NjYwNTgsICAxNzc2ODMzNjUsICAxNzQ0MDAyNTQsICAxNzExMTY3MzMsICAxNjc4MzI4MDgsICAxNjQ1NDg0ODksICAxNjEyNjM3ODMsCi0gICAgIDE1Nzk3ODY5NywgIDE1NDY5MzI0MCwgIDE1MTQwNzQxOCwgIDE0ODEyMTI0MSwgIDE0NDgzNDcxNCwgIDE0MTU0Nzg0NywgIDEzODI2MDY0NywgIDEzNDk3MzEyMiwKLSAgICAgMTMxNjg1Mjc4LCAgMTI4Mzk3MTI1LCAgMTI1MTA4NjcwLCAgMTIxODE5OTIxLCAgMTE4NTMwODg1LCAgMTE1MjQxNTcwLCAgMTExOTUxOTgzLCAgMTA4NjYyMTM0LAotICAgICAxMDUzNzIwMjgsICAxMDIwODE2NzUsICAgOTg3OTEwODEsICAgOTU1MDAyNTUsICAgOTIyMDkyMDUsICAgODg5MTc5MzcsICAgODU2MjY0NjAsICAgODIzMzQ3ODIsCi0gICAgICA3OTA0MjkwOSwgICA3NTc1MDg1MSwgICA3MjQ1ODYxNSwgICA2OTE2NjIwOCwgICA2NTg3MzYzOCwgICA2MjU4MDkxNCwgICA1OTI4ODA0MiwgICA1NTk5NTAzMCwKLSAgICAgIDUyNzAxODg3LCAgIDQ5NDA4NjIwLCAgIDQ2MTE1MjM2LCAgIDQyODIxNzQ0LCAgIDM5NTI4MTUxLCAgIDM2MjM0NDY2LCAgIDMyOTQwNjk1LCAgIDI5NjQ2ODQ2LAotICAgICAgMjYzNTI5MjgsICAgMjMwNTg5NDcsICAgMTk3NjQ5MTMsICAgMTY0NzA4MzIsICAgMTMxNzY3MTIsICAgIDk4ODI1NjEsICAgIDY1ODgzODcsICAgIDMyOTQxOTcKKzIxNDc0ODM2NDcsIDIxNDc0ODMwMTYsIDIxNDc0ODExMjEsIDIxNDc0Nzc5NjMsIDIxNDc0NzM1NDIsIDIxNDc0Njc4NTcsIDIxNDc0NjA5MDgsIDIxNDc0NTI2OTcsCisyMTQ3NDQzMjIyLCAyMTQ3NDMyNDg0LCAyMTQ3NDIwNDgzLCAyMTQ3NDA3MjE4LCAyMTQ3MzkyNjkwLCAyMTQ3Mzc2ODk5LCAyMTQ3MzU5ODQ1LCAyMTQ3MzQxNTI3LAorMjE0NzMyMTk0NiwgMjE0NzMwMTEwMiwgMjE0NzI3ODk5NSwgMjE0NzI1NTYyNSwgMjE0NzIzMDk5MSwgMjE0NzIwNTA5NCwgMjE0NzE3NzkzNCwgMjE0NzE0OTUxMSwKKzIxNDcxMTk4MjUsIDIxNDcwODg4NzYsIDIxNDcwNTY2NjQsIDIxNDcwMjMxODgsIDIxNDY5ODg0NTAsIDIxNDY5NTI0NDgsIDIxNDY5MTUxODQsIDIxNDY4NzY2NTYsCisyMTQ2ODM2ODY2LCAyMTQ2Nzk1ODEzLCAyMTQ2NzUzNDk3LCAyMTQ2NzA5OTE3LCAyMTQ2NjY1MDc2LCAyMTQ2NjE4OTcxLCAyMTQ2NTcxNjAzLCAyMTQ2NTIyOTczLAorMjE0NjQ3MzA4MCwgMjE0NjQyMTkyNCwgMjE0NjM2OTUwNSwgMjE0NjMxNTgyNCwgMjE0NjI2MDg4MSwgMjE0NjIwNDY3NCwgMjE0NjE0NzIwNSwgMjE0NjA4ODQ3NCwKKzIxNDYwMjg0ODAsIDIxNDU5NjcyMjQsIDIxNDU5MDQ3MDUsIDIxNDU4NDA5MjQsIDIxNDU3NzU4ODAsIDIxNDU3MDk1NzQsIDIxNDU2NDIwMDYsIDIxNDU1NzMxNzYsCisyMTQ1NTAzMDgzLCAyMTQ1NDMxNzI5LCAyMTQ1MzU5MTEyLCAyMTQ1Mjg1MjMzLCAyMTQ1MjEwMDkyLCAyMTQ1MTMzNjkwLCAyMTQ1MDU2MDI1LCAyMTQ0OTc3MDk4LAorMjE0NDg5NjkxMCwgMjE0NDgxNTQ2MCwgMjE0NDczMjc0OCwgMjE0NDY0ODc3NCwgMjE0NDU2MzUzOSwgMjE0NDQ3NzA0MiwgMjE0NDM4OTI4MywgMjE0NDMwMDI2NCwKKzIxNDQyMDk5ODIsIDIxNDQxMTg0MzksIDIxNDQwMjU2MzUsIDIxNDM5MzE1NzAsIDIxNDM4MzYyNDQsIDIxNDM3Mzk2NTYsIDIxNDM2NDE4MDcsIDIxNDM1NDI2OTcsCisyMTQzNDQyMzI2LCAyMTQzMzQwNjk0LCAyMTQzMjM3ODAyLCAyMTQzMTMzNjQ4LCAyMTQzMDI4MjM0LCAyMTQyOTIxNTU5LCAyMTQyODEzNjI0LCAyMTQyNzA0NDI3LAorMjE0MjU5Mzk3MSwgMjE0MjQ4MjI1NCwgMjE0MjM2OTI3NiwgMjE0MjI1NTAzOSwgMjE0MjEzOTU0MSwgMjE0MjAyMjc4MywgMjE0MTkwNDc2NCwgMjE0MTc4NTQ4NiwKKzIxNDE2NjQ5NDgsIDIxNDE1NDMxNTAsIDIxNDE0MjAwOTIsIDIxNDEyOTU3NzQsIDIxNDExNzAxOTcsIDIxNDEwNDMzNjAsIDIxNDA5MTUyNjQsIDIxNDA3ODU5MDgsCisyMTQwNjU1MjkzLCAyMTQwNTIzNDE4LCAyMTQwMzkwMjg0LCAyMTQwMjU1ODkyLCAyMTQwMTIwMjQwLCAyMTM5OTgzMzI5LCAyMTM5ODQ1MTU5LCAyMTM5NzA1NzMwLAorMjEzOTU2NTA0MywgMjEzOTQyMzA5NywgMjEzOTI3OTg5MiwgMjEzOTEzNTQyOSwgMjEzODk4OTcwOCwgMjEzODg0MjcyOCwgMjEzODY5NDQ5MCwgMjEzODU0NDk5NCwKKzIxMzgzOTQyNDAsIDIxMzgyNDIyMjgsIDIxMzgwODg5NTgsIDIxMzc5MzQ0MzAsIDIxMzc3Nzg2NDQsIDIxMzc2MjE2MDEsIDIxMzc0NjMzMDEsIDIxMzczMDM3NDMsCisyMTM3MTQyOTI3LCAyMTM2OTgwODU1LCAyMTM2ODE3NTI1LCAyMTM2NjUyOTM4LCAyMTM2NDg3MDk1LCAyMTM2MzE5OTk0LCAyMTM2MTUxNjM3LCAyMTM1OTgyMDIzLAorMjEzNTgxMTE1MywgMjEzNTYzOTAyNiwgMjEzNTQ2NTY0MiwgMjEzNTI5MTAwMywgMjEzNTExNTEwNywgMjEzNDkzNzk1NiwgMjEzNDc1OTU0OCwgMjEzNDU3OTg4NSwKKzIxMzQzOTg5NjYsIDIxMzQyMTY3OTEsIDIxMzQwMzMzNjEsIDIxMzM4NDg2NzUsIDIxMzM2NjI3MzQsIDIxMzM0NzU1MzgsIDIxMzMyODcwODcsIDIxMzMwOTczODEsCisyMTMyOTA2NDIwLCAyMTMyNzE0MjA0LCAyMTMyNTIwNzM0LCAyMTMyMzI2MDA5LCAyMTMyMTMwMDMwLCAyMTMxOTMyNzk2LCAyMTMxNzM0MzA5LCAyMTMxNTM0NTY3LAorMjEzMTMzMzU3MiwgMjEzMTEzMTMyMiwgMjEzMDkyNzgxOSwgMjEzMDcyMzA2MiwgMjEzMDUxNzA1MiwgMjEzMDMwOTc4OSwgMjEzMDEwMTI3MiwgMjEyOTg5MTUwMiwKKzIxMjk2ODA0ODAsIDIxMjk0NjgyMDQsIDIxMjkyNTQ2NzYsIDIxMjkwMzk4OTUsIDIxMjg4MjM4NjIsIDIxMjg2MDY1NzYsIDIxMjgzODgwMzgsIDIxMjgxNjgyNDgsCisyMTI3OTQ3MjA2LCAyMTI3NzI0OTEzLCAyMTI3NTAxMzY3LCAyMTI3Mjc2NTcwLCAyMTI3MDUwNTIyLCAyMTI2ODIzMjIyLCAyMTI2NTk0NjcyLCAyMTI2MzY0ODcwLAorMjEyNjEzMzgxNywgMjEyNTkwMTUxNCwgMjEyNTY2Nzk2MCwgMjEyNTQzMzE1NSwgMjEyNTE5NzEwMCwgMjEyNDk1OTc5NSwgMjEyNDcyMTI0MCwgMjEyNDQ4MTQzNSwKKzIxMjQyNDAzODAsIDIxMjM5OTgwNzYsIDIxMjM3NTQ1MjIsIDIxMjM1MDk3MTgsIDIxMjMyNjM2NjYsIDIxMjMwMTYzNjQsIDIxMjI3Njc4MTQsIDIxMjI1MTgwMTUsCisyMTIyMjY2OTY3LCAyMTIyMDE0NjcwLCAyMTIxNzYxMTI2LCAyMTIxNTA2MzMzLCAyMTIxMjUwMjkyLCAyMTIwOTkzMDAzLCAyMTIwNzM0NDY3LCAyMTIwNDc0NjgzLAorMjEyMDIxMzY1MSwgMjExOTk1MTM3MiwgMjExOTY4Nzg0NywgMjExOTQyMzA3NCwgMjExOTE1NzA1NCwgMjExODg4OTc4OCwgMjExODYyMTI3NSwgMjExODM1MTUxNiwKKzIxMTgwODA1MTEsIDIxMTc4MDgyNTksIDIxMTc1MzQ3NjIsIDIxMTcyNjAwMjAsIDIxMTY5ODQwMzEsIDIxMTY3MDY3OTcsIDIxMTY0MjgzMTksIDIxMTYxNDg1OTUsCisyMTE1ODY3NjI2LCAyMTE1NTg1NDEyLCAyMTE1MzAxOTU0LCAyMTE1MDE3MjUyLCAyMTE0NzMxMzA1LCAyMTE0NDQ0MTE0LCAyMTE0MTU1NjgwLCAyMTEzODY2MDAxLAorMjExMzU3NTA4MCwgMjExMzI4MjkxNCwgMjExMjk4OTUwNiwgMjExMjY5NDg1NSwgMjExMjM5ODk2MCwgMjExMjEwMTgyNCwgMjExMTgwMzQ0NCwgMjExMTUwMzgyMiwKKzIxMTEyMDI5NTksIDIxMTA5MDA4NTMsIDIxMTA1OTc1MDUsIDIxMTAyOTI5MTYsIDIxMDk5ODcwODUsIDIxMDk2ODAwMTMsIDIxMDkzNzE3MDAsIDIxMDkwNjIxNDYsCisyMTA4NzUxMzUyLCAyMTA4NDM5MzE3LCAyMTA4MTI2MDQxLCAyMTA3ODExNTI2LCAyMTA3NDk1NzcwLCAyMTA3MTc4Nzc1LCAyMTA2ODYwNTQwLCAyMTA2NTQxMDY1LAorMjEwNjIyMDM1MiwgMjEwNTg5ODM5OSwgMjEwNTU3NTIwOCwgMjEwNTI1MDc3OCwgMjEwNDkyNTEwOSwgMjEwNDU5ODIwMiwgMjEwNDI3MDA1NywgMjEwMzk0MDY3NCwKKzIxMDM2MTAwNTQsIDIxMDMyNzgxOTYsIDIxMDI5NDUxMDEsIDIxMDI2MTA3NjgsIDIxMDIyNzUxOTksIDIxMDE5MzgzOTMsIDIxMDE2MDAzNTAsIDIxMDEyNjEwNzEsCisyMTAwOTIwNTU2LCAyMTAwNTc4ODA1LCAyMTAwMjM1ODE5LCAyMDk5ODkxNTk2LCAyMDk5NTQ2MTM5LCAyMDk5MTk5NDQ2LCAyMDk4ODUxNTE5LCAyMDk4NTAyMzU3LAorMjA5ODE1MTk2MCwgMjA5NzgwMDMyOSwgMjA5NzQ0NzQ2NCwgMjA5NzA5MzM2NSwgMjA5NjczODAzMiwgMjA5NjM4MTQ2NiwgMjA5NjAyMzY2NywgMjA5NTY2NDYzNSwKKzIwOTUzMDQzNzAsIDIwOTQ5NDI4NzIsIDIwOTQ1ODAxNDIsIDIwOTQyMTYxNzksIDIwOTM4NTA5ODUsIDIwOTM0ODQ1NTksIDIwOTMxMTY5MDEsIDIwOTI3NDgwMTIsCisyMDkyMzc3ODkyLCAyMDkyMDA2NTQxLCAyMDkxNjMzOTYwLCAyMDkxMjYwMTQ3LCAyMDkwODg1MTA1LCAyMDkwNTA4ODMzLCAyMDkwMTMxMzMxLCAyMDg5NzUyNTk5LAorMjA4OTM3MjYzOCwgMjA4ODk5MTQ0OCwgMjA4ODYwOTAyOSwgMjA4ODIyNTM4MSwgMjA4Nzg0MDUwNSwgMjA4NzQ1NDQwMCwgMjA4NzA2NzA2OCwgMjA4NjY3ODUwOCwKKzIwODYyODg3MjAsIDIwODU4OTc3MDUsIDIwODU1MDU0NjMsIDIwODUxMTE5OTQsIDIwODQ3MTcyOTgsIDIwODQzMjEzNzYsIDIwODM5MjQyMjgsIDIwODM1MjU4NTQsCisyMDgzMTI2MjU0LCAyMDgyNzI1NDI5LCAyMDgyMzIzMzc5LCAyMDgxOTIwMTAzLCAyMDgxNTE1NjAzLCAyMDgxMTA5ODc5LCAyMDgwNzAyOTMwLCAyMDgwMjk0NzU3LAorMjA3OTg4NTM2MCwgMjA3OTQ3NDc0MCwgMjA3OTA2Mjg5NiwgMjA3ODY0OTgzMCwgMjA3ODIzNTU0MCwgMjA3NzgyMDAyOCwgMjA3NzQwMzI5NCwgMjA3Njk4NTMzOCwKKzIwNzY1NjYxNjAsIDIwNzYxNDU3NjAsIDIwNzU3MjQxMzksIDIwNzUzMDEyOTYsIDIwNzQ4NzcyMzMsIDIwNzQ0NTE5NTAsIDIwNzQwMjU0NDYsIDIwNzM1OTc3MjEsCisyMDczMTY4Nzc3LCAyMDcyNzM4NjE0LCAyMDcyMzA3MjMxLCAyMDcxODc0NjI5LCAyMDcxNDQwODA4LCAyMDcxMDA1NzY5LCAyMDcwNTY5NTExLCAyMDcwMTMyMDM1LAorMjA2OTY5MzM0MiwgMjA2OTI1MzQzMCwgMjA2ODgxMjMwMiwgMjA2ODM2OTk1NywgMjA2NzkyNjM5NCwgMjA2NzQ4MTYxNiwgMjA2NzAzNTYyMSwgMjA2NjU4ODQxMCwKKzIwNjYxMzk5ODMsIDIwNjU2OTAzNDEsIDIwNjUyMzk0ODQsIDIwNjQ3ODc0MTEsIDIwNjQzMzQxMjQsIDIwNjM4Nzk2MjMsIDIwNjM0MjM5MDgsIDIwNjI5NjY5NzgsCisyMDYyNTA4ODM1LCAyMDYyMDQ5NDc5LCAyMDYxNTg4OTEwLCAyMDYxMTI3MTI4LCAyMDYwNjY0MTMzLCAyMDYwMTk5OTI3LCAyMDU5NzM0NTA4LCAyMDU5MjY3ODc3LAorMjA1ODgwMDAzNiwgMjA1ODMzMDk4MywgMjA1Nzg2MDcxOSwgMjA1NzM4OTI0NCwgMjA1NjkxNjU2MCwgMjA1NjQ0MjY2NSwgMjA1NTk2NzU2MCwgMjA1NTQ5MTI0NiwKKzIwNTUwMTM3MjMsIDIwNTQ1MzQ5OTEsIDIwNTQwNTUwNTAsIDIwNTM1NzM5MDEsIDIwNTMwOTE1NDQsIDIwNTI2MDc5NzksIDIwNTIxMjMyMDcsIDIwNTE2MzcyMjcsCisyMDUxMTUwMDQwLCAyMDUwNjYxNjQ3LCAyMDUwMTcyMDQ4LCAyMDQ5NjgxMjQyLCAyMDQ5MTg5MjMxLCAyMDQ4Njk2MDE0LCAyMDQ4MjAxNTkyLCAyMDQ3NzA1OTY1LAorMjA0NzIwOTEzMywgMjA0NjcxMTA5NywgMjA0NjIxMTg1NywgMjA0NTcxMTQxNCwgMjA0NTIwOTc2NywgMjA0NDcwNjkxNiwgMjA0NDIwMjg2MywgMjA0MzY5NzYwOCwKKzIwNDMxOTExNTAsIDIwNDI2ODM0OTAsIDIwNDIxNzQ2MjgsIDIwNDE2NjQ1NjUsIDIwNDExNTMzMDEsIDIwNDA2NDA4MzcsIDIwNDAxMjcxNzIsIDIwMzk2MTIzMDYsCisyMDM5MDk2MjQxLCAyMDM4NTc4OTc2LCAyMDM4MDYwNTEyLCAyMDM3NTQwODUwLCAyMDM3MDE5OTg4LCAyMDM2NDk3OTI4LCAyMDM1OTc0NjcwLCAyMDM1NDUwMjE1LAorMjAzNDkyNDU2MiwgMjAzNDM5NzcxMiwgMjAzMzg2OTY2NSwgMjAzMzM0MDQyMiwgMjAzMjgwOTk4MiwgMjAzMjI3ODM0NywgMjAzMTc0NTUxNiwgMjAzMTIxMTQ5MCwKKzIwMzA2NzYyNjksIDIwMzAxMzk4NTMsIDIwMjk2MDIyNDMsIDIwMjkwNjM0MzksIDIwMjg1MjM0NDIsIDIwMjc5ODIyNTEsIDIwMjc0Mzk4NjcsIDIwMjY4OTYyOTEsCisyMDI2MzUxNTIyLCAyMDI1ODA1NTYxLCAyMDI1MjU4NDA4LCAyMDI0NzEwMDY0LCAyMDI0MTYwNTI5LCAyMDIzNjA5ODAzLCAyMDIzMDU3ODg3LCAyMDIyNTA0NzgwLAorMjAyMTk1MDQ4NCwgMjAyMTM5NDk5OCwgMjAyMDgzODMyMywgMjAyMDI4MDQ2MCwgMjAxOTcyMTQwNywgMjAxOTE2MTE2NywgMjAxODU5OTczOSwgMjAxODAzNzEyMywKKzIwMTc0NzMzMjEsIDIwMTY5MDgzMzEsIDIwMTYzNDIxNTUsIDIwMTU3NzQ3OTMsIDIwMTUyMDYyNDUsIDIwMTQ2MzY1MTEsIDIwMTQwNjU1OTIsIDIwMTM0OTM0ODksCisyMDEyOTIwMjAxLCAyMDEyMzQ1NzI5LCAyMDExNzcwMDczLCAyMDExMTkzMjMzLCAyMDEwNjE1MjEwLCAyMDEwMDM2MDA1LCAyMDA5NDU1NjE3LCAyMDA4ODc0MDQ3LAorMjAwODI5MTI5NSwgMjAwNzcwNzM2MiwgMjAwNzEyMjI0OCwgMjAwNjUzNTk1MywgMjAwNTk0ODQ3OCwgMjAwNTM1OTgyMiwgMjAwNDc2OTk4NywgMjAwNDE3ODk3MywKKzIwMDM1ODY3NzksIDIwMDI5OTM0MDcsIDIwMDIzOTg4NTcsIDIwMDE4MDMxMjgsIDIwMDEyMDYyMjIsIDIwMDA2MDgxMzksIDIwMDAwMDg4NzksIDE5OTk0MDg0NDIsCisxOTk4ODA2ODI5LCAxOTk4MjA0MDQwLCAxOTk3NjAwMDc2LCAxOTk2OTk0OTM3LCAxOTk2Mzg4NjIyLCAxOTk1NzgxMTM0LCAxOTk1MTcyNDcxLCAxOTk0NTYyNjM1LAorMTk5Mzk1MTYyNSwgMTk5MzMzOTQ0MiwgMTk5MjcyNjA4NywgMTk5MjExMTU1OSwgMTk5MTQ5NTg2MCwgMTk5MDg3ODk4OSwgMTk5MDI2MDk0NiwgMTk4OTY0MTczMywKKzE5ODkwMjEzNTAsIDE5ODgzOTk3OTYsIDE5ODc3NzcwNzMsIDE5ODcxNTMxODAsIDE5ODY1MjgxMTgsIDE5ODU5MDE4ODgsIDE5ODUyNzQ0ODksIDE5ODQ2NDU5MjMsCisxOTg0MDE2MTg5LCAxOTgzMzg1Mjg4LCAxOTgyNzUzMjIwLCAxOTgyMTE5OTg1LCAxOTgxNDg1NTg1LCAxOTgwODUwMDE5LCAxOTgwMjEzMjg4LCAxOTc5NTc1MzkyLAorMTk3ODkzNjMzMSwgMTk3ODI5NjEwNiwgMTk3NzY1NDcxNywgMTk3NzAxMjE2NSwgMTk3NjM2ODQ1MCwgMTk3NTcyMzU3MiwgMTk3NTA3NzUzMiwgMTk3NDQzMDMzMSwKKzE5NzM3ODE5NjcsIDE5NzMxMzI0NDMsIDE5NzI0ODE3NTcsIDE5NzE4Mjk5MTIsIDE5NzExNzY5MDYsIDE5NzA1MjI3NDEsIDE5Njk4Njc0MTcsIDE5NjkyMTA5MzMsCisxOTY4NTUzMjkyLCAxOTY3ODk0NDkyLCAxOTY3MjM0NTM1LCAxOTY2NTczNDIwLCAxOTY1OTExMTQ4LCAxOTY1MjQ3NzIwLCAxOTY0NTgzMTM2LCAxOTYzOTE3Mzk2LAorMTk2MzI1MDUwMSwgMTk2MjU4MjQ1MSwgMTk2MTkxMzI0NiwgMTk2MTI0Mjg4OCwgMTk2MDU3MTM3NSwgMTk1OTg5ODcwOSwgMTk1OTIyNDg5MCwgMTk1ODU0OTkxOSwKKzE5NTc4NzM3OTYsIDE5NTcxOTY1MjAsIDE5NTY1MTgwOTMsIDE5NTU4Mzg1MTYsIDE5NTUxNTc3ODgsIDE5NTQ0NzU5MDksIDE5NTM3OTI4ODEsIDE5NTMxMDg3MDMsCisxOTUyNDIzMzc3LCAxOTUxNzM2OTAyLCAxOTUxMDQ5Mjc5LCAxOTUwMzYwNTA4LCAxOTQ5NjcwNTg5LCAxOTQ4OTc5NTI0LCAxOTQ4Mjg3MzEyLCAxOTQ3NTkzOTU0LAorMTk0Njg5OTQ1MSwgMTk0NjIwMzgwMiwgMTk0NTUwNzAwOCwgMTk0NDgwOTA3MCwgMTk0NDEwOTk4NywgMTk0MzQwOTc2MSwgMTk0MjcwODM5MiwgMTk0MjAwNTg4MCwKKzE5NDEzMDIyMjUsIDE5NDA1OTc0MjgsIDE5Mzk4OTE0OTAsIDE5MzkxODQ0MTEsIDE5Mzg0NzYxOTAsIDE5Mzc3NjY4MzAsIDE5MzcwNTYzMjksIDE5MzYzNDQ2ODksCisxOTM1NjMxOTEwLCAxOTM0OTE3OTkyLCAxOTM0MjAyOTM2LCAxOTMzNDg2NzQyLCAxOTMyNzY5NDExLCAxOTMyMDUwOTQzLCAxOTMxMzMxMzM4LCAxOTMwNjEwNTk3LAorMTkyOTg4ODcyMCwgMTkyOTE2NTcwOCwgMTkyODQ0MTU2MSwgMTkyNzcxNjI3OSwgMTkyNjk4OTg2NCwgMTkyNjI2MjMxNSwgMTkyNTUzMzYzMywgMTkyNDgwMzgxOCwKKzE5MjQwNzI4NzEsIDE5MjMzNDA3OTEsIDE5MjI2MDc1ODEsIDE5MjE4NzMyMzksIDE5MjExMzc3NjcsIDE5MjA0MDExNjUsIDE5MTk2NjM0MzIsIDE5MTg5MjQ1NzEsCisxOTE4MTg0NTgxLCAxOTE3NDQzNDYyLCAxOTE2NzAxMjE2LCAxOTE1OTU3ODQxLCAxOTE1MjEzMzQwLCAxOTE0NDY3NzEyLCAxOTEzNzIwOTU4LCAxOTEyOTczMDc4LAorMTkxMjIyNDA3MywgMTkxMTQ3Mzk0MiwgMTkxMDcyMjY4OCwgMTkwOTk3MDMwOSwgMTkwOTIxNjgwNiwgMTkwODQ2MjE4MSwgMTkwNzcwNjQzMywgMTkwNjk0OTU2MiwKKzE5MDYxOTE1NzAsIDE5MDU0MzI0NTcsIDE5MDQ2NzIyMjIsIDE5MDM5MTA4NjcsIDE5MDMxNDgzOTIsIDE5MDIzODQ3OTcsIDE5MDE2MjAwODQsIDE5MDA4NTQyNTEsCisxOTAwMDg3MzAxLCAxODk5MzE5MjMyLCAxODk4NTUwMDQ3LCAxODk3Nzc5NzQ0LCAxODk3MDA4MzI1LCAxODk2MjM1NzkwLCAxODk1NDYyMTQwLCAxODk0Njg3Mzc0LAorMTg5MzkxMTQ5NCwgMTg5MzEzNDUwMCwgMTg5MjM1NjM5MiwgMTg5MTU3NzE3MSwgMTg5MDc5NjgzNywgMTg5MDAxNTM5MSwgMTg4OTIzMjgzMiwgMTg4ODQ0OTE2MywKKzE4ODc2NjQzODMsIDE4ODY4Nzg0OTIsIDE4ODYwOTE0OTEsIDE4ODUzMDMzODEsIDE4ODQ1MTQxNjEsIDE4ODM3MjM4MzMsIDE4ODI5MzIzOTcsIDE4ODIxMzk4NTMsCisxODgxMzQ2MjAyLCAxODgwNTUxNDQ0LCAxODc5NzU1NTgwLCAxODc4OTU4NjEwLCAxODc4MTYwNTM1LCAxODc3MzYxMzU0LCAxODc2NTYxMDcwLCAxODc1NzU5NjgxLAorMTg3NDk1NzE4OSwgMTg3NDE1MzU5NCwgMTg3MzM0ODg5NywgMTg3MjU0MzA5NywgMTg3MTczNjE5NiwgMTg3MDkyODE5NCwgMTg3MDExOTA5MSwgMTg2OTMwODg4OCwKKzE4Njg0OTc1ODYsIDE4Njc2ODUxODQsIDE4NjY4NzE2ODMsIDE4NjYwNTcwODUsIDE4NjUyNDEzODgsIDE4NjQ0MjQ1OTQsIDE4NjM2MDY3MDQsIDE4NjI3ODc3MTcsCisxODYxOTY3NjM0LCAxODYxMTQ2NDU2LCAxODYwMzI0MTgzLCAxODU5NTAwODE2LCAxODU4Njc2MzU1LCAxODU3ODUwODAwLCAxODU3MDI0MTUzLCAxODU2MTk2NDEzLAorMTg1NTM2NzU4MSwgMTg1NDUzNzY1NywgMTg1MzcwNjY0MywgMTg1Mjg3NDUzOCwgMTg1MjA0MTM0MywgMTg1MTIwNzA1OSwgMTg1MDM3MTY4NiwgMTg0OTUzNTIyNCwKKzE4NDg2OTc2NzQsIDE4NDc4NTkwMzYsIDE4NDcwMTkzMTIsIDE4NDYxNzg1MDEsIDE4NDUzMzY2MDQsIDE4NDQ0OTM2MjEsIDE4NDM2NDk1NTMsIDE4NDI4MDQ0MDEsCisxODQxOTU4MTY0LCAxODQxMTEwODQ0LCAxODQwMjYyNDQxLCAxODM5NDEyOTU2LCAxODM4NTYyMzg4LCAxODM3NzEwNzM5LCAxODM2ODU4MDA4LCAxODM2MDA0MTk3LAorMTgzNTE0OTMwNiwgMTgzNDI5MzMzNiwgMTgzMzQzNjI4NiwgMTgzMjU3ODE1OCwgMTgzMTcxODk1MSwgMTgzMDg1ODY2OCwgMTgyOTk5NzMwNywgMTgyOTEzNDg2OSwKKzE4MjgyNzEzNTYsIDE4Mjc0MDY3NjcsIDE4MjY1NDExMDMsIDE4MjU2NzQzNjQsIDE4MjQ4MDY1NTIsIDE4MjM5Mzc2NjYsIDE4MjMwNjc3MDcsIDE4MjIxOTY2NzUsCisxODIxMzI0NTcyLCAxODIwNDUxMzk3LCAxODE5NTc3MTUxLCAxODE4NzAxODM1LCAxODE3ODI1NDQ5LCAxODE2OTQ3OTk0LCAxODE2MDY5NDY5LCAxODE1MTg5ODc3LAorMTgxNDMwOTIxNiwgMTgxMzQyNzQ4OSwgMTgxMjU0NDY5NCwgMTgxMTY2MDgzMywgMTgxMDc3NTkwNiwgMTgwOTg4OTkxNSwgMTgwOTAwMjg1OCwgMTgwODExNDczNywKKzE4MDcyMjU1NTMsIDE4MDYzMzUzMDUsIDE4MDU0NDM5OTUsIDE4MDQ1NTE2MjMsIDE4MDM2NTgxODksIDE4MDI3NjM2OTQsIDE4MDE4NjgxMzksIDE4MDA5NzE1MjMsCisxODAwMDczODQ5LCAxNzk5MTc1MTE1LCAxNzk4Mjc1MzIzLCAxNzk3Mzc0NDcyLCAxNzk2NDcyNTY1LCAxNzk1NTY5NjAxLCAxNzk0NjY1NTgwLCAxNzkzNzYwNTA0LAorMTc5Mjg1NDM3MiwgMTc5MTk0NzE4NiwgMTc5MTAzODk0NiwgMTc5MDEyOTY1MiwgMTc4OTIxOTMwNSwgMTc4ODMwNzkwNSwgMTc4NzM5NTQ1MywgMTc4NjQ4MTk1MCwKKzE3ODU1NjczOTYsIDE3ODQ2NTE3OTIsIDE3ODM3MzUxMzcsIDE3ODI4MTc0MzQsIDE3ODE4OTg2ODEsIDE3ODA5Nzg4ODEsIDE3ODAwNTgwMzIsIDE3NzkxMzYxMzcsCisxNzc4MjEzMTk0LCAxNzc3Mjg5MjA2LCAxNzc2MzY0MTcyLCAxNzc1NDM4MDk0LCAxNzc0NTEwOTcwLCAxNzczNTgyODAzLCAxNzcyNjUzNTkzLCAxNzcxNzIzMzQwLAorMTc3MDc5MjA0NCwgMTc2OTg1OTcwNywgMTc2ODkyNjMyOCwgMTc2Nzk5MTkwOSwgMTc2NzA1NjQ1MCwgMTc2NjExOTk1MiwgMTc2NTE4MjQxNCwgMTc2NDI0MzgzOCwKKzE3NjMzMDQyMjQsIDE3NjIzNjM1NzMsIDE3NjE0MjE4ODUsIDE3NjA0NzkxNjEsIDE3NTk1MzU0MDEsIDE3NTg1OTA2MDcsIDE3NTc2NDQ3NzcsIDE3NTY2OTc5MTQsCisxNzU1NzUwMDE3LCAxNzU0ODAxMDg3LCAxNzUzODUxMTI2LCAxNzUyOTAwMTMyLCAxNzUxOTQ4MTA3LCAxNzUwOTk1MDUyLCAxNzUwMDQwOTY2LCAxNzQ5MDg1ODUxLAorMTc0ODEyOTcwNywgMTc0NzE3MjUzNSwgMTc0NjIxNDMzNCwgMTc0NTI1NTEwNywgMTc0NDI5NDg1MywgMTc0MzMzMzU3MywgMTc0MjM3MTI2NywgMTc0MTQwNzkzNiwKKzE3NDA0NDM1ODEsIDE3Mzk0NzgyMDIsIDE3Mzg1MTE3OTksIDE3Mzc1NDQzNzQsIDE3MzY1NzU5MjcsIDE3MzU2MDY0NTgsIDE3MzQ2MzU5NjgsIDE3MzM2NjQ0NTgsCisxNzMyNjkxOTI4LCAxNzMxNzE4Mzc4LCAxNzMwNzQzODEwLCAxNzI5NzY4MjI0LCAxNzI4NzkxNjIwLCAxNzI3ODEzOTk5LCAxNzI2ODM1MzYxLCAxNzI1ODU1NzA4LAorMTcyNDg3NTA0MCwgMTcyMzg5MzM1NywgMTcyMjkxMDY1OSwgMTcyMTkyNjk0OCwgMTcyMDk0MjIyNSwgMTcxOTk1NjQ4OCwgMTcxODk2OTc0MCwgMTcxNzk4MTk4MSwKKzE3MTY5OTMyMTEsIDE3MTYwMDM0MzEsIDE3MTUwMTI2NDIsIDE3MTQwMjA4NDQsIDE3MTMwMjgwMzcsIDE3MTIwMzQyMjMsIDE3MTEwMzk0MDEsIDE3MTAwNDM1NzMsCisxNzA5MDQ2NzM5LCAxNzA4MDQ4OTAwLCAxNzA3MDUwMDU1LCAxNzA2MDUwMjA3LCAxNzA1MDQ5MzU1LCAxNzA0MDQ3NTAwLCAxNzAzMDQ0NjQyLCAxNzAyMDQwNzgzLAorMTcwMTAzNTkyMiwgMTcwMDAzMDA2MSwgMTY5OTAyMzE5OSwgMTY5ODAxNTMzOSwgMTY5NzAwNjQ3OSwgMTY5NTk5NjYyMSwgMTY5NDk4NTc2NSwgMTY5Mzk3MzkxMiwKKzE2OTI5NjEwNjIsIDE2OTE5NDcyMTcsIDE2OTA5MzIzNzYsIDE2ODk5MTY1NDEsIDE2ODg4OTk3MTEsIDE2ODc4ODE4ODgsIDE2ODY4NjMwNzIsIDE2ODU4NDMyNjMsCisxNjg0ODIyNDYzLCAxNjgzODAwNjcyLCAxNjgyNzc3ODkwLCAxNjgxNzU0MTE4LCAxNjgwNzI5MzU3LCAxNjc5NzAzNjA4LCAxNjc4Njc2ODcwLCAxNjc3NjQ5MTQ0LAorMTY3NjYyMDQzMiwgMTY3NTU5MDczMywgMTY3NDU2MDA0OSwgMTY3MzUyODM3OSwgMTY3MjQ5NTcyNSwgMTY3MTQ2MjA4NywgMTY3MDQyNzQ2NiwgMTY2OTM5MTg2MiwKKzE2NjgzNTUyNzYsIDE2NjczMTc3MDksIDE2NjYyNzkxNjEsIDE2NjUyMzk2MzIsIDE2NjQxOTkxMjQsIDE2NjMxNTc2MzcsIDE2NjIxMTUxNzIsIDE2NjEwNzE3MjksCisxNjYwMDI3MzA4LCAxNjU4OTgxOTExLCAxNjU3OTM1NTM5LCAxNjU2ODg4MTkwLCAxNjU1ODM5ODY3LCAxNjU0NzkwNTcwLCAxNjUzNzQwMzAwLCAxNjUyNjg5MDU3LAorMTY1MTYzNjg0MSwgMTY1MDU4MzY1NCwgMTY0OTUyOTQ5NiwgMTY0ODQ3NDM2NywgMTY0NzQxODI2OSwgMTY0NjM2MTIwMiwgMTY0NTMwMzE2NiwgMTY0NDI0NDE2MiwKKzE2NDMxODQxOTEsIDE2NDIxMjMyNTMsIDE2NDEwNjEzNDksIDE2Mzk5OTg0ODAsIDE2Mzg5MzQ2NDYsIDE2Mzc4Njk4NDgsIDE2MzY4MDQwODcsIDE2MzU3MzczNjIsCisxNjM0NjY5Njc2LCAxNjMzNjAxMDI3LCAxNjMyNTMxNDE4LCAxNjMxNDYwODQ4LCAxNjMwMzg5MzE5LCAxNjI5MzE2ODMwLCAxNjI4MjQzMzgzLCAxNjI3MTY4OTc4LAorMTYyNjA5MzYxNiwgMTYyNTAxNzI5NywgMTYyMzk0MDAyMywgMTYyMjg2MTc5MywgMTYyMTc4MjYwOCwgMTYyMDcwMjQ2OSwgMTYxOTYyMTM3NywgMTYxODUzOTMzMiwKKzE2MTc0NTYzMzUsIDE2MTYzNzIzODYsIDE2MTUyODc0ODcsIDE2MTQyMDE2MzcsIDE2MTMxMTQ4MzgsIDE2MTIwMjcwODksIDE2MTA5MzgzOTMsIDE2MDk4NDg3NDksCisxNjA4NzU4MTU3LCAxNjA3NjY2NjIwLCAxNjA2NTc0MTM2LCAxNjA1NDgwNzA4LCAxNjA0Mzg2MzM1LCAxNjAzMjkxMDE4LCAxNjAyMTk0NzU4LCAxNjAxMDk3NTU1LAorMTU5OTk5OTQxMSwgMTU5ODkwMDMyNSwgMTU5NzgwMDI5OSwgMTU5NjY5OTMzMywgMTU5NTU5NzQyOCwgMTU5NDQ5NDU4MywgMTU5MzM5MDgwMSwgMTU5MjI4NjA4MiwKKzE1OTExODA0MjYsIDE1OTAwNzM4MzMsIDE1ODg5NjYzMDYsIDE1ODc4NTc4NDMsIDE1ODY3NDg0NDcsIDE1ODU2MzgxMTcsIDE1ODQ1MjY4NTQsIDE1ODM0MTQ2NjAsCisxNTgyMzAxNTMzLCAxNTgxMTg3NDc2LCAxNTgwMDcyNDg5LCAxNTc4OTU2NTcyLCAxNTc3ODM5NzI2LCAxNTc2NzIxOTUyLCAxNTc1NjAzMjUxLCAxNTc0NDgzNjIzLAorMTU3MzM2MzA2OCwgMTU3MjI0MTU4OCwgMTU3MTExOTE4MywgMTU2OTk5NTg1NCwgMTU2ODg3MTYwMSwgMTU2Nzc0NjQyNSwgMTU2NjYyMDMyNywgMTU2NTQ5MzMwNywKKzE1NjQzNjUzNjcsIDE1NjMyMzY1MDYsIDE1NjIxMDY3MjUsIDE1NjA5NzYwMjYsIDE1NTk4NDQ0MDgsIDE1NTg3MTE4NzMsIDE1NTc1Nzg0MjEsIDE1NTY0NDQwNTIsCisxNTU1MzA4NzY4LCAxNTU0MTcyNTY5LCAxNTUzMDM1NDU1LCAxNTUxODk3NDI4LCAxNTUwNzU4NDg4LCAxNTQ5NjE4NjM2LCAxNTQ4NDc3ODcyLCAxNTQ3MzM2MTk3LAorMTU0NjE5MzYxMiwgMTU0NTA1MDExOCwgMTU0MzkwNTcxNCwgMTU0Mjc2MDQwMiwgMTU0MTYxNDE4MywgMTU0MDQ2NzA1NywgMTUzOTMxOTAyNCwgMTUzODE3MDA4NywKKzE1MzcwMjAyNDQsIDE1MzU4Njk0OTcsIDE1MzQ3MTc4NDYsIDE1MzM1NjUyOTMsIDE1MzI0MTE4MzcsIDE1MzEyNTc0ODAsIDE1MzAxMDIyMjIsIDE1Mjg5NDYwNjQsCisxNTI3Nzg5MDA3LCAxNTI2NjMxMDUxLCAxNTI1NDcyMTk3LCAxNTI0MzEyNDQ1LCAxNTIzMTUxNzk3LCAxNTIxOTkwMjUyLCAxNTIwODI3ODEzLCAxNTE5NjY0NDc4LAorMTUxODUwMDI1MCwgMTUxNzMzNTEyOCwgMTUxNjE2OTExNCwgMTUxNTAwMjIwOCwgMTUxMzgzNDQxMSwgMTUxMjY2NTcyMywgMTUxMTQ5NjE0NSwgMTUxMDMyNTY3OCwKKzE1MDkxNTQzMjIsIDE1MDc5ODIwNzksIDE1MDY4MDg5NDksIDE1MDU2MzQ5MzIsIDE1MDQ0NjAwMjksIDE1MDMyODQyNDIsIDE1MDIxMDc1NzAsIDE1MDA5MzAwMTQsCisxNDk5NzUxNTc2LCAxNDk4NTcyMjU1LCAxNDk3MzkyMDUzLCAxNDk2MjEwOTY5LCAxNDk1MDI5MDA2LCAxNDkzODQ2MTYzLCAxNDkyNjYyNDQxLCAxNDkxNDc3ODQyLAorMTQ5MDI5MjM2NCwgMTQ4OTEwNjAxMSwgMTQ4NzkxODc4MSwgMTQ4NjczMDY3NSwgMTQ4NTU0MTY5NiwgMTQ4NDM1MTg0MiwgMTQ4MzE2MTExNSwgMTQ4MTk2OTUxNiwKKzE0ODA3NzcwNDQsIDE0Nzk1ODM3MDIsIDE0NzgzODk0ODksIDE0NzcxOTQ0MDcsIDE0NzU5OTg0NTYsIDE0NzQ4MDE2MzYsIDE0NzM2MDM5NDksIDE0NzI0MDUzOTQsCisxNDcxMjA1OTc0LCAxNDcwMDA1Njg4LCAxNDY4ODA0NTM4LCAxNDY3NjAyNTIzLCAxNDY2Mzk5NjQ1LCAxNDY1MTk1OTA0LCAxNDYzOTkxMzAyLCAxNDYyNzg1ODM4LAorMTQ2MTU3OTUxNCwgMTQ2MDM3MjMyOSwgMTQ1OTE2NDI4NiwgMTQ1Nzk1NTM4NSwgMTQ1Njc0NTYyNSwgMTQ1NTUzNTAwOSwgMTQ1NDMyMzUzNiwgMTQ1MzExMTIwOCwKKzE0NTE4OTgwMjUsIDE0NTA2ODM5ODgsIDE0NDk0NjkwOTgsIDE0NDgyNTMzNTUsIDE0NDcwMzY3NjAsIDE0NDU4MTkzMTQsIDE0NDQ2MDEwMTcsIDE0NDMzODE4NzAsCisxNDQyMTYxODc0LCAxNDQwOTQxMDMwLCAxNDM5NzE5MzM4LCAxNDM4NDk2Nzk5LCAxNDM3MjczNDE0LCAxNDM2MDQ5MTg0LCAxNDM0ODI0MTA5LCAxNDMzNTk4MTg5LAorMTQzMjM3MTQyNiwgMTQzMTE0MzgyMSwgMTQyOTkxNTM3NCwgMTQyODY4NjA4NSwgMTQyNzQ1NTk1NiwgMTQyNjIyNDk4OCwgMTQyNDk5MzE4MCwgMTQyMzc2MDUzNCwKKzE0MjI1MjcwNTEsIDE0MjEyOTI3MzAsIDE0MjAwNTc1NzQsIDE0MTg4MjE1ODIsIDE0MTc1ODQ3NTUsIDE0MTYzNDcwOTUsIDE0MTUxMDg2MDEsIDE0MTM4NjkyNzUsCisxNDEyNjI5MTE3LCAxNDExMzg4MTI5LCAxNDEwMTQ2MzA5LCAxNDA4OTAzNjYxLCAxNDA3NjYwMTgzLCAxNDA2NDE1ODc4LCAxNDA1MTcwNzQ1LCAxNDAzOTI0Nzg1LAorMTQwMjY3ODAwMCwgMTQwMTQzMDM4OSwgMTQwMDE4MTk1NCwgMTM5ODkzMjY5NSwgMTM5NzY4MjYxMywgMTM5NjQzMTcwOSwgMTM5NTE3OTk4NCwgMTM5MzkyNzQzOCwKKzEzOTI2NzQwNzIsIDEzOTE0MTk4ODYsIDEzOTAxNjQ4ODIsIDEzODg5MDkwNjAsIDEzODc2NTI0MjIsIDEzODYzOTQ5NjYsIDEzODUxMzY2OTYsIDEzODM4Nzc2MTAsCisxMzgyNjE3NzEwLCAxMzgxMzU2OTk3LCAxMzgwMDk1NDcyLCAxMzc4ODMzMTM0LCAxMzc3NTY5OTg2LCAxMzc2MzA2MDI2LCAxMzc1MDQxMjU4LCAxMzczNzc1NjgwLAorMTM3MjUwOTI5NCwgMTM3MTI0MjEwMSwgMTM2OTk3NDEwMSwgMTM2ODcwNTI5NiwgMTM2NzQzNTY4NSwgMTM2NjE2NTI2OSwgMTM2NDg5NDA1MCwgMTM2MzYyMjAyOCwKKzEzNjIzNDkyMDQsIDEzNjEwNzU1NzksIDEzNTk4MDExNTIsIDEzNTg1MjU5MjYsIDEzNTcyNDk5MDEsIDEzNTU5NzMwNzcsIDEzNTQ2OTU0NTUsIDEzNTM0MTcwMzcsCisxMzUyMTM3ODIyLCAxMzUwODU3ODEyLCAxMzQ5NTc3MDA3LCAxMzQ4Mjk1NDA5LCAxMzQ3MDEzMDE3LCAxMzQ1NzI5ODMzLCAxMzQ0NDQ1ODU3LCAxMzQzMTYxMDkwLAorMTM0MTg3NTUzMywgMTM0MDU4OTE4NywgMTMzOTMwMjA1MiwgMTMzODAxNDEyOSwgMTMzNjcyNTQxOSwgMTMzNTQzNTkyMywgMTMzNDE0NTY0MSwgMTMzMjg1NDU3NCwKKzEzMzE1NjI3MjMsIDEzMzAyNzAwODksIDEzMjg5NzY2NzIsIDEzMjc2ODI0NzQsIDEzMjYzODc0OTQsIDEzMjUwOTE3MzQsIDEzMjM3OTUxOTUsIDEzMjI0OTc4NzcsCisxMzIxMTk5NzgxLCAxMzE5OTAwOTA3LCAxMzE4NjAxMjU3LCAxMzE3MzAwODMyLCAxMzE1OTk5NjMxLCAxMzE0Njk3NjU3LCAxMzEzMzk0OTA5LCAxMzEyMDkxMzg4LAorMTMxMDc4NzA5NSwgMTMwOTQ4MjAzMiwgMTMwODE3NjE5OCwgMTMwNjg2OTU5NCwgMTMwNTU2MjIyMiwgMTMwNDI1NDA4MiwgMTMwMjk0NTE3NCwgMTMwMTYzNTUwMCwKKzEzMDAzMjUwNjAsIDEyOTkwMTM4NTUsIDEyOTc3MDE4ODYsIDEyOTYzODkxNTQsIDEyOTUwNzU2NTksIDEyOTM3NjE0MDIsIDEyOTI0NDYzODQsIDEyOTExMzA2MDYsCisxMjg5ODE0MDY4LCAxMjg4NDk2NzcyLCAxMjg3MTc4NzE3LCAxMjg1ODU5OTA1LCAxMjg0NTQwMzM3LCAxMjgzMjIwMDEzLCAxMjgxODk4OTM1LCAxMjgwNTc3MTAyLAorMTI3OTI1NDUxNiwgMTI3NzkzMTE3NywgMTI3NjYwNzA4NiwgMTI3NTI4MjI0NSwgMTI3Mzk1NjY1MywgMTI3MjYzMDMxMiwgMTI3MTMwMzIyMiwgMTI2OTk3NTM4NCwKKzEyNjg2NDY4MDAsIDEyNjczMTc0NjksIDEyNjU5ODczOTIsIDEyNjQ2NTY1NzEsIDEyNjMzMjUwMDUsIDEyNjE5OTI2OTcsIDEyNjA2NTk2NDYsIDEyNTkzMjU4NTMsCisxMjU3OTkxMzIwLCAxMjU2NjU2MDQ3LCAxMjU1MzIwMDM0LCAxMjUzOTgzMjgzLCAxMjUyNjQ1Nzk0LCAxMjUxMzA3NTY4LCAxMjQ5OTY4NjA2LCAxMjQ4NjI4OTA5LAorMTI0NzI4ODQ3OCwgMTI0NTk0NzMxMiwgMTI0NDYwNTQxNCwgMTI0MzI2Mjc4MywgMTI0MTkxOTQyMSwgMTI0MDU3NTMyOSwgMTIzOTIzMDUwNiwgMTIzNzg4NDk1NSwKKzEyMzY1Mzg2NzUsIDEyMzUxOTE2NjgsIDEyMzM4NDM5MzUsIDEyMzI0OTU0NzUsIDEyMzExNDYyOTEsIDEyMjk3OTYzODIsIDEyMjg0NDU3NTAsIDEyMjcwOTQzOTUsCisxMjI1NzQyMzE4LCAxMjI0Mzg5NTIxLCAxMjIzMDM2MDAyLCAxMjIxNjgxNzY1LCAxMjIwMzI2ODA5LCAxMjE4OTcxMTM1LCAxMjE3NjE0NzQzLCAxMjE2MjU3NjM2LAorMTIxNDg5OTgxMywgMTIxMzU0MTI3NSwgMTIxMjE4MjAyNCwgMTIxMDgyMjA1OSwgMTIwOTQ2MTM4MiwgMTIwODA5OTk5MywgMTIwNjczNzg5NCwgMTIwNTM3NTA4NSwKKzEyMDQwMTE1NjcsIDEyMDI2NDczNDAsIDEyMDEyODI0MDcsIDExOTk5MTY3NjYsIDExOTg1NTA0MTksIDExOTcxODMzNjgsIDExOTU4MTU2MTIsIDExOTQ0NDcxNTMsCisxMTkzMDc3OTkxLCAxMTkxNzA4MTI3LCAxMTkwMzM3NTYyLCAxMTg4OTY2Mjk3LCAxMTg3NTk0MzMyLCAxMTg2MjIxNjY5LCAxMTg0ODQ4MzA4LCAxMTgzNDc0MjUwLAorMTE4MjA5OTQ5NiwgMTE4MDcyNDA0NiwgMTE3OTM0NzkwMiwgMTE3Nzk3MTA2NCwgMTE3NjU5MzUzMywgMTE3NTIxNTMxMCwgMTE3MzgzNjM5NSwgMTE3MjQ1Njc5MCwKKzExNzEwNzY0OTUsIDExNjk2OTU1MTIsIDExNjgzMTM4NDAsIDExNjY5MzE0ODEsIDExNjU1NDg0MzUsIDExNjQxNjQ3MDQsIDExNjI3ODAyODgsIDExNjEzOTUxODgsCisxMTYwMDA5NDA1LCAxMTU4NjIyOTM5LCAxMTU3MjM1NzkyLCAxMTU1ODQ3OTY0LCAxMTU0NDU5NDU2LCAxMTUzMDcwMjY5LCAxMTUxNjgwNDAzLCAxMTUwMjg5ODYwLAorMTE0ODg5ODY0MCwgMTE0NzUwNjc0NSwgMTE0NjExNDE3NCwgMTE0NDcyMDkyOSwgMTE0MzMyNzAxMSwgMTE0MTkzMjQyMCwgMTE0MDUzNzE1OCwgMTEzOTE0MTIyNCwKKzExMzc3NDQ2MjEsIDExMzYzNDczNDgsIDExMzQ5NDk0MDYsIDExMzM1NTA3OTcsIDExMzIxNTE1MjEsIDExMzA3NTE1NzksIDExMjkzNTA5NzIsIDExMjc5NDk3MDEsCisxMTI2NTQ3NzY1LCAxMTI1MTQ1MTY4LCAxMTIzNzQxOTA4LCAxMTIyMzM3OTg3LCAxMTIwOTMzNDA2LCAxMTE5NTI4MTY2LCAxMTE4MTIyMjY3LCAxMTE2NzE1NzEwLAorMTExNTMwODQ5NiwgMTExMzkwMDYyNywgMTExMjQ5MjEwMSwgMTExMTA4MjkyMiwgMTEwOTY3MzA4OSwgMTEwODI2MjYwMywgMTEwNjg1MTQ2NSwgMTEwNTQzOTY3NiwKKzExMDQwMjcyMzcsIDExMDI2MTQxNDgsIDExMDEyMDA0MTAsIDEwOTk3ODYwMjUsIDEwOTgzNzA5OTMsIDEwOTY5NTUzMTQsIDEwOTU1Mzg5OTEsIDEwOTQxMjIwMjMsCisxMDkyNzA0NDExLCAxMDkxMjg2MTU2LCAxMDg5ODY3MjU5LCAxMDg4NDQ3NzIyLCAxMDg3MDI3NTQ0LCAxMDg1NjA2NzI2LCAxMDg0MTg1MjcwLCAxMDgyNzYzMTc2LAorMTA4MTM0MDQ0NSwgMTA3OTkxNzA3OCwgMTA3ODQ5MzA3NiwgMTA3NzA2ODQzOSwgMTA3NTY0MzE2OSwgMTA3NDIxNzI2NiwgMTA3Mjc5MDczMCwgMTA3MTM2MzU2NCwKKzEwNjk5MzU3NjgsIDEwNjg1MDczNDIsIDEwNjcwNzgyODgsIDEwNjU2NDg2MDUsIDEwNjQyMTgyOTYsIDEwNjI3ODczNjEsIDEwNjEzNTU4MDEsIDEwNTk5MjM2MTYsCisxMDU4NDkwODA4LCAxMDU3MDU3Mzc3LCAxMDU1NjIzMzI0LCAxMDU0MTg4NjUxLCAxMDUyNzUzMzU3LCAxMDUxMzE3NDQzLCAxMDQ5ODgwOTEyLCAxMDQ4NDQzNzYzLAorMTA0NzAwNTk5NiwgMTA0NTU2NzYxNSwgMTA0NDEyODYxNywgMTA0MjY4OTAwNiwgMTA0MTI0ODc4MSwgMTAzOTgwNzk0NCwgMTAzODM2NjQ5NSwgMTAzNjkyNDQzNiwKKzEwMzU0ODE3NjYsIDEwMzQwMzg0ODcsIDEwMzI1OTQ2MDAsIDEwMzExNTAxMDUsIDEwMjk3MDUwMDQsIDEwMjgyNTkyOTcsIDEwMjY4MTI5ODUsIDEwMjUzNjYwNjksCisxMDIzOTE4NTUwLCAxMDIyNDcwNDI4LCAxMDIxMDIxNzA1LCAxMDE5NTcyMzgyLCAxMDE4MTIyNDU4LCAxMDE2NjcxOTM2LCAxMDE1MjIwODE2LCAxMDEzNzY5MDk4LAorMTAxMjMxNjc4NCwgMTAxMDg2Mzg3NSwgMTAwOTQxMDM3MCwgMTAwNzk1NjI3MiwgMTAwNjUwMTU4MSwgMTAwNTA0NjI5OCwgMTAwMzU5MDQyNCwgMTAwMjEzMzk1OSwKKzEwMDA2NzY5MDUsIDk5OTIxOTI2MiwgOTk3NzYxMDMxLCA5OTYzMDIyMTQsIDk5NDg0MjgxMCwgOTkzMzgyODIxLCA5OTE5MjIyNDgsIDk5MDQ2MTA5MSwKKzk4ODk5OTM1MSwgOTg3NTM3MDMwLCA5ODYwNzQxMjcsIDk4NDYxMDY0NSwgOTgzMTQ2NTgzLCA5ODE2ODE5NDMsIDk4MDIxNjcyNiwgOTc4NzUwOTMyLAorOTc3Mjg0NTYyLCA5NzU4MTc2MTcsIDk3NDM1MDA5OCwgOTcyODgyMDA2LCA5NzE0MTMzNDIsIDk2OTk0NDEwNiwgOTY4NDc0MzAwLCA5NjcwMDM5MjMsCis5NjU1MzI5NzgsIDk2NDA2MTQ2NSwgOTYyNTg5Mzg1LCA5NjExMTY3MzksIDk1OTY0MzUyNywgOTU4MTY5NzUxLCA5NTY2OTU0MTEsIDk1NTIyMDUwOCwKKzk1Mzc0NTA0MywgOTUyMjY5MDE3LCA5NTA3OTI0MzEsIDk0OTMxNTI4NiwgOTQ3ODM3NTgyLCA5NDYzNTkzMjEsIDk0NDg4MDUwMywgOTQzNDAxMTI5LAorOTQxOTIxMjAwLCA5NDA0NDA3MTcsIDkzODk1OTY4MSwgOTM3NDc4MDkyLCA5MzU5OTU5NTIsIDkzNDUxMzI2MSwgOTMzMDMwMDIxLCA5MzE1NDYyMzEsCis5MzAwNjE4OTQsIDkyODU3NzAxMCwgOTI3MDkxNTc5LCA5MjU2MDU2MDMsIDkyNDExOTA4MiwgOTIyNjMyMDE4LCA5MjExNDQ0MTEsIDkxOTY1NjI2MiwKKzkxODE2NzU3MiwgOTE2Njc4MzQyLCA5MTUxODg1NzIsIDkxMzY5ODI2NSwgOTEyMjA3NDE5LCA5MTA3MTYwMzgsIDkwOTIyNDEyMCwgOTA3NzMxNjY3LAorOTA2MjM4NjgxLCA5MDQ3NDUxNjEsIDkwMzI1MTExMCwgOTAxNzU2NTI2LCA5MDAyNjE0MTMsIDg5ODc2NTc2OSwgODk3MjY5NTk3LCA4OTU3NzI4OTgsCis4OTQyNzU2NzEsIDg5Mjc3NzkxOCwgODkxMjc5NjQwLCA4ODk3ODA4MzgsIDg4ODI4MTUxMiwgODg2NzgxNjYzLCA4ODUyODEyOTMsIDg4Mzc4MDQwMiwKKzg4MjI3ODk5MiwgODgwNzc3MDYyLCA4NzkyNzQ2MTQsIDg3Nzc3MTY0OSwgODc2MjY4MTY3LCA4NzQ3NjQxNzAsIDg3MzI1OTY1OSwgODcxNzU0NjMzLAorODcwMjQ5MDk1LCA4Njg3NDMwNDUsIDg2NzIzNjQ4NCwgODY1NzI5NDEzLCA4NjQyMjE4MzIsIDg2MjcxMzc0MywgODYxMjA1MTQ3LCA4NTk2OTYwNDMsCis4NTgxODY0MzUsIDg1NjY3NjMyMSwgODU1MTY1NzAzLCA4NTM2NTQ1ODIsIDg1MjE0Mjk1OSwgODUwNjMwODM1LCA4NDkxMTgyMTAsIDg0NzYwNTA4NiwKKzg0NjA5MTQ2MywgODQ0NTc3MzQzLCA4NDMwNjI3MjYsIDg0MTU0NzYxMiwgODQwMDMyMDA0LCA4Mzg1MTU5MDEsIDgzNjk5OTMwNSwgODM1NDgyMjE3LAorODMzOTY0NjM4LCA4MzI0NDY1NjcsIDgzMDkyODAwNywgODI5NDA4OTU4LCA4Mjc4ODk0MjIsIDgyNjM2OTM5OCwgODI0ODQ4ODg4LCA4MjMzMjc4OTMsCis4MjE4MDY0MTMsIDgyMDI4NDQ1MCwgODE4NzYyMDA1LCA4MTcyMzkwNzgsIDgxNTcxNTY3MCwgODE0MTkxNzgyLCA4MTI2Njc0MTUsIDgxMTE0MjU3MSwKKzgwOTYxNzI0OSwgODA4MDkxNDUwLCA4MDY1NjUxNzcsIDgwNTAzODQyOSwgODAzNTExMjA3LCA4MDE5ODM1MTMsIDgwMDQ1NTM0NiwgNzk4OTI2NzA5LAorNzk3Mzk3NjAyLCA3OTU4NjgwMjYsIDc5NDMzNzk4MiwgNzkyODA3NDcwLCA3OTEyNzY0OTIsIDc4OTc0NTA0OSwgNzg4MjEzMTQxLCA3ODY2ODA3NjksCis3ODUxNDc5MzQsIDc4MzYxNDYzOCwgNzgyMDgwODgwLCA3ODA1NDY2NjMsIDc3OTAxMTk4NiwgNzc3NDc2ODUxLCA3NzU5NDEyNTksIDc3NDQwNTIxMCwKKzc3Mjg2ODcwNiwgNzcxMzMxNzQ3LCA3Njk3OTQzMzQsIDc2ODI1NjQ2OSwgNzY2NzE4MTUxLCA3NjUxNzkzODIsIDc2MzY0MDE2NCwgNzYyMTAwNDk2LAorNzYwNTYwMzgwLCA3NTkwMTk4MTYsIDc1NzQ3ODgwNiwgNzU1OTM3MzUwLCA3NTQzOTU0NDksIDc1Mjg1MzEwNSwgNzUxMzEwMzE4LCA3NDk3NjcwODksCis3NDgyMjM0MTgsIDc0NjY3OTMwOCwgNzQ1MTM0NzU4LCA3NDM1ODk3NzAsIDc0MjA0NDM0NSwgNzQwNDk4NDgzLCA3Mzg5NTIxODYsIDczNzQwNTQ1MywKKzczNTg1ODI4NywgNzM0MzEwNjg4LCA3MzI3NjI2NTcsIDczMTIxNDE5NSwgNzI5NjY1MzAzLCA3MjgxMTU5ODIsIDcyNjU2NjIzMiwgNzI1MDE2MDU1LAorNzIzNDY1NDUxLCA3MjE5MTQ0MjIsIDcyMDM2Mjk2OCwgNzE4ODExMDkwLCA3MTcyNTg3OTAsIDcxNTcwNjA2NywgNzE0MTUyOTI0LCA3MTI1OTkzNjAsCis3MTEwNDUzNzcsIDcwOTQ5MDk3NiwgNzA3OTM2MTU4LCA3MDYzODA5MjMsIDcwNDgyNTI3MiwgNzAzMjY5MjA3LCA3MDE3MTI3MjgsIDcwMDE1NTgzNiwKKzY5ODU5ODUzMywgNjk3MDQwODE4LCA2OTU0ODI2OTQsIDY5MzkyNDE2MCwgNjkyMzY1MjE4LCA2OTA4MDU4NjksIDY4OTI0NjExMywgNjg3Njg1OTUyLAorNjg2MTI1Mzg3LCA2ODQ1NjQ0MTcsIDY4MzAwMzA0NSwgNjgxNDQxMjcyLCA2Nzk4NzkwOTcsIDY3ODMxNjUyMiwgNjc2NzUzNTQ5LCA2NzUxOTAxNzcsCis2NzM2MjY0MDgsIDY3MjA2MjI0MywgNjcwNDk3NjgyLCA2Njg5MzI3MjcsIDY2NzM2NzM3OSwgNjY1ODAxNjM4LCA2NjQyMzU1MDUsIDY2MjY2ODk4MSwKKzY2MTEwMjA2OCwgNjU5NTM0NzY2LCA2NTc5NjcwNzUsIDY1NjM5ODk5OCwgNjU0ODMwNTM1LCA2NTMyNjE2ODYsIDY1MTY5MjQ1MywgNjUwMTIyODM3LAorNjQ4NTUyODM4LCA2NDY5ODI0NTcsIDY0NTQxMTY5NiwgNjQzODQwNTU2LCA2NDIyNjkwMzYsIDY0MDY5NzEzOSwgNjM5MTI0ODY1LCA2Mzc1NTIyMTUsCis2MzU5NzkxOTAsIDYzNDQwNTc5MSwgNjMyODMyMDE4LCA2MzEyNTc4NzMsIDYyOTY4MzM1NywgNjI4MTA4NDcxLCA2MjY1MzMyMTUsIDYyNDk1NzU5MCwKKzYyMzM4MTU5OCwgNjIxODA1MjM5LCA2MjAyMjg1MTQsIDYxODY1MTQyNCwgNjE3MDczOTcxLCA2MTU0OTYxNTQsIDYxMzkxNzk3NSwgNjEyMzM5NDM2LAorNjEwNzYwNTM2LCA2MDkxODEyNzYsIDYwNzYwMTY1OCwgNjA2MDIxNjgzLCA2MDQ0NDEzNTIsIDYwMjg2MDY2NCwgNjAxMjc5NjIzLCA1OTk2OTgyMjcsCis1OTgxMTY0NzksIDU5NjUzNDM3OCwgNTk0OTUxOTI3LCA1OTMzNjkxMjYsIDU5MTc4NTk3NiwgNTkwMjAyNDc3LCA1ODg2MTg2MzIsIDU4NzAzNDQ0MCwKKzU4NTQ0OTkwMywgNTgzODY1MDIxLCA1ODIyNzk3OTYsIDU4MDY5NDIyOSwgNTc5MTA4MzIwLCA1Nzc1MjIwNzAsIDU3NTkzNTQ4MCwgNTc0MzQ4NTUyLAorNTcyNzYxMjg1LCA1NzExNzM2ODIsIDU2OTU4NTc0MywgNTY3OTk3NDY5LCA1NjY0MDg4NjAsIDU2NDgxOTkxOSwgNTYzMjMwNjQ1LCA1NjE2NDEwMzksCis1NjAwNTExMDQsIDU1ODQ2MDgzOSwgNTU2ODcwMjQ1LCA1NTUyNzkzMjQsIDU1MzY4ODA3NiwgNTUyMDk2NTAyLCA1NTA1MDQ2MDQsIDU0ODkxMjM4MiwKKzU0NzMxOTgzNiwgNTQ1NzI2OTY5LCA1NDQxMzM3ODEsIDU0MjU0MDI3MywgNTQwOTQ2NDQ1LCA1MzkzNTIzMDAsIDUzNzc1NzgzNywgNTM2MTYzMDU4LAorNTM0NTY3OTYzLCA1MzI5NzI1NTQsIDUzMTM3NjgzMSwgNTI5NzgwNzk2LCA1MjgxODQ0NDksIDUyNjU4Nzc5MSwgNTI0OTkwODI0LCA1MjMzOTM1NDcsCis1MjE3OTU5NjMsIDUyMDE5ODA3MiwgNTE4NTk5ODc1LCA1MTcwMDEzNzMsIDUxNTQwMjU2NiwgNTEzODAzNDU3LCA1MTIyMDQwNDUsIDUxMDYwNDMzMiwKKzUwOTAwNDMxOCwgNTA3NDA0MDA1LCA1MDU4MDMzOTQsIDUwNDIwMjQ4NSwgNTAyNjAxMjc5LCA1MDA5OTk3NzgsIDQ5OTM5Nzk4MiwgNDk3Nzk1ODkyLAorNDk2MTkzNTA5LCA0OTQ1OTA4MzUsIDQ5Mjk4Nzg2OSwgNDkxMzg0NjE0LCA0ODk3ODEwNjksIDQ4ODE3NzIzNiwgNDg2NTczMTE3LCA0ODQ5Njg3MTAsCis0ODMzNjQwMTksIDQ4MTc1OTA0MywgNDgwMTUzNzg0LCA0Nzg1NDgyNDMsIDQ3Njk0MjQxOSwgNDc1MzM2MzE2LCA0NzM3Mjk5MzIsIDQ3MjEyMzI3MCwKKzQ3MDUxNjMzMCwgNDY4OTA5MTE0LCA0NjczMDE2MjIsIDQ2NTY5Mzg1NCwgNDY0MDg1ODEzLCA0NjI0Nzc0OTksIDQ2MDg2ODkxMiwgNDU5MjYwMDU1LAorNDU3NjUwOTI3LCA0NTYwNDE1MzAsIDQ1NDQzMTg2NSwgNDUyODIxOTMzLCA0NTEyMTE3MzQsIDQ0OTYwMTI3MCwgNDQ3OTkwNTQxLCA0NDYzNzk1NDksCis0NDQ3NjgyOTQsIDQ0MzE1Njc3NywgNDQxNTQ1MDAwLCA0Mzk5MzI5NjMsIDQzODMyMDY2NywgNDM2NzA4MTEzLCA0MzUwOTUzMDMsIDQzMzQ4MjIzNiwKKzQzMTg2ODkxNSwgNDMwMjU1MzM5LCA0Mjg2NDE1MTEsIDQyNzAyNzQzMCwgNDI1NDEzMDk4LCA0MjM3OTg1MTUsIDQyMjE4MzY4NCwgNDIwNTY4NjA0LAorNDE4OTUzMjc2LCA0MTczMzc3MDMsIDQxNTcyMTg4MywgNDE0MTA1ODE5LCA0MTI0ODk1MTIsIDQxMDg3Mjk2MiwgNDA5MjU2MTcwLCA0MDc2MzkxMzcsCis0MDYwMjE4NjUsIDQwNDQwNDM1MywgNDAyNzg2NjA0LCA0MDExNjg2MTgsIDM5OTU1MDM5NiwgMzk3OTMxOTM5LCAzOTYzMTMyNDcsIDM5NDY5NDMyMywKKzM5MzA3NTE2NiwgMzkxNDU1Nzc4LCAzODk4MzYxNjAsIDM4ODIxNjMxMywgMzg2NTk2MjM3LCAzODQ5NzU5MzQsIDM4MzM1NTQwNCwgMzgxNzM0NjQ5LAorMzgwMTEzNjY5LCAzNzg0OTI0NjYsIDM3Njg3MTAzOSwgMzc1MjQ5MzkyLCAzNzM2Mjc1MjMsIDM3MjAwNTQzNSwgMzcwMzgzMTI4LCAzNjg3NjA2MDMsCiszNjcxMzc4NjEsIDM2NTUxNDkwMywgMzYzODkxNzMwLCAzNjIyNjgzNDMsIDM2MDY0NDc0MiwgMzU5MDIwOTMwLCAzNTczOTY5MDYsIDM1NTc3MjY3MywKKzM1NDE0ODIzMCwgMzUyNTIzNTc4LCAzNTA4OTg3MTksIDM0OTI3MzY1NCwgMzQ3NjQ4MzgzLCAzNDYwMjI5MDgsIDM0NDM5NzIzMCwgMzQyNzcxMzQ4LAorMzQxMTQ1MjY1LCAzMzk1MTg5ODEsIDMzNzg5MjQ5OCwgMzM2MjY1ODE2LCAzMzQ2Mzg5MzYsIDMzMzAxMTg1OSwgMzMxMzg0NTg2LCAzMjk3NTcxMTksCiszMjgxMjk0NTcsIDMyNjUwMTYwMiwgMzI0ODczNTU1LCAzMjMyNDUzMTcsIDMyMTYxNjg4OSwgMzE5OTg4MjcyLCAzMTgzNTk0NjYsIDMxNjczMDQ3NCwKKzMxNTEwMTI5NSwgMzEzNDcxOTMwLCAzMTE4NDIzODEsIDMxMDIxMjY0OSwgMzA4NTgyNzM0LCAzMDY5NTI2MzgsIDMwNTMyMjM2MSwgMzAzNjkxOTA0LAorMzAyMDYxMjY5LCAzMDA0MzA0NTYsIDI5ODc5OTQ2NiwgMjk3MTY4MzAxLCAyOTU1MzY5NjEsIDI5MzkwNTQ0NywgMjkyMjczNzYwLCAyOTA2NDE5MDEsCisyODkwMDk4NzEsIDI4NzM3NzY3MSwgMjg1NzQ1MzAyLCAyODQxMTI3NjUsIDI4MjQ4MDA2MSwgMjgwODQ3MTkwLCAyNzkyMTQxNTUsIDI3NzU4MDk1NSwKKzI3NTk0NzU5MiwgMjc0MzE0MDY2LCAyNzI2ODAzNzksIDI3MTA0NjUzMiwgMjY5NDEyNTI1LCAyNjc3NzgzNjAsIDI2NjE0NDAzOCwgMjY0NTA5NTU4LAorMjYyODc0OTIzLCAyNjEyNDAxMzQsIDI1OTYwNTE5MSwgMjU3OTcwMDk1LCAyNTYzMzQ4NDcsIDI1NDY5OTQ0OCwgMjUzMDYzOTAwLCAyNTE0MjgyMDMsCisyNDk3OTIzNTgsIDI0ODE1NjM2NiwgMjQ2NTIwMjI4LCAyNDQ4ODM5NDUsIDI0MzI0NzUxOCwgMjQxNjEwOTQ3LCAyMzk5NzQyMzUsIDIzODMzNzM4MiwKKzIzNjcwMDM4OCwgMjM1MDYzMjU1LCAyMzM0MjU5ODQsIDIzMTc4ODU3NSwgMjMwMTUxMDMwLCAyMjg1MTMzNTAsIDIyNjg3NTUzNSwgMjI1MjM3NTg3LAorMjIzNTk5NTA2LCAyMjE5NjEyOTQsIDIyMDMyMjk1MSwgMjE4Njg0NDc5LCAyMTcwNDU4NzgsIDIxNTQwNzE0OSwgMjEzNzY4MjkzLCAyMTIxMjkzMTIsCisyMTA0OTAyMDYsIDIwODg1MDk3NiwgMjA3MjExNjI0LCAyMDU1NzIxNDksIDIwMzkzMjU1MywgMjAyMjkyODM4LCAyMDA2NTMwMDMsIDE5OTAxMzA1MSwKKzE5NzM3Mjk4MSwgMTk1NzMyNzk1LCAxOTQwOTI0OTUsIDE5MjQ1MjA4MCwgMTkwODExNTUxLCAxODkxNzA5MTEsIDE4NzUzMDE1OSwgMTg1ODg5Mjk3LAorMTg0MjQ4MzI1LCAxODI2MDcyNDUsIDE4MDk2NjA1OCwgMTc5MzI0NzY0LCAxNzc2ODMzNjUsIDE3NjA0MTg2MSwgMTc0NDAwMjU0LCAxNzI3NTg1NDQsCisxNzExMTY3MzMsIDE2OTQ3NDgyMCwgMTY3ODMyODA4LCAxNjYxOTA2OTgsIDE2NDU0ODQ4OSwgMTYyOTA2MTg0LCAxNjEyNjM3ODMsIDE1OTYyMTI4NywKKzE1Nzk3ODY5NywgMTU2MzM2MDE1LCAxNTQ2OTMyNDAsIDE1MzA1MDM3NCwgMTUxNDA3NDE4LCAxNDk3NjQzNzQsIDE0ODEyMTI0MSwgMTQ2NDc4MDIxLAorMTQ0ODM0NzE0LCAxNDMxOTEzMjMsIDE0MTU0Nzg0NywgMTM5OTA0Mjg4LCAxMzgyNjA2NDcsIDEzNjYxNjkyNSwgMTM0OTczMTIyLCAxMzMzMjkyMzksCisxMzE2ODUyNzgsIDEzMDA0MTI0MCwgMTI4Mzk3MTI1LCAxMjY3NTI5MzUsIDEyNTEwODY3MCwgMTIzNDY0MzMyLCAxMjE4MTk5MjEsIDEyMDE3NTQzOCwKKzExODUzMDg4NSwgMTE2ODg2MjYyLCAxMTUyNDE1NzAsIDExMzU5NjgxMCwgMTExOTUxOTgzLCAxMTAzMDcwOTEsIDEwODY2MjEzNCwgMTA3MDE3MTEyLAorMTA1MzcyMDI4LCAxMDM3MjY4ODIsIDEwMjA4MTY3NSwgMTAwNDM2NDA4LCAgOTg3OTEwODEsICA5NzE0NTY5NywgIDk1NTAwMjU1LCAgOTM4NTQ3NTgsCisgOTIyMDkyMDUsICA5MDU2MzU5NywgIDg4OTE3OTM3LCAgODcyNzIyMjQsICA4NTYyNjQ2MCwgIDgzOTgwNjQ1LCAgODIzMzQ3ODIsICA4MDY4ODg2OSwKKyA3OTA0MjkwOSwgIDc3Mzk2OTAzLCAgNzU3NTA4NTEsICA3NDEwNDc1NSwgIDcyNDU4NjE1LCAgNzA4MTI0MzIsICA2OTE2NjIwOCwgIDY3NTE5OTQzLAorIDY1ODczNjM4LCAgNjQyMjcyOTUsICA2MjU4MDkxNCwgIDYwOTM0NDk2LCAgNTkyODgwNDIsICA1NzY0MTU1MywgIDU1OTk1MDMwLCAgNTQzNDg0NzUsCisgNTI3MDE4ODcsICA1MTA1NTI2OCwgIDQ5NDA4NjIwLCAgNDc3NjE5NDIsICA0NjExNTIzNiwgIDQ0NDY4NTAzLCAgNDI4MjE3NDQsICA0MTE3NDk2MCwKKyAzOTUyODE1MSwgIDM3ODgxMzIwLCAgMzYyMzQ0NjYsICAzNDU4NzU5MCwgIDMyOTQwNjk1LCAgMzEyOTM3ODAsICAyOTY0Njg0NiwgIDI3OTk5ODk1LAorIDI2MzUyOTI4LCAgMjQ3MDU5NDUsICAyMzA1ODk0NywgIDIxNDExOTM2LCAgMTk3NjQ5MTMsICAxODExNzg3OCwgIDE2NDcwODMyLCAgMTQ4MjM3NzYsCisgMTMxNzY3MTIsICAxMTUyOTY0MCwgICA5ODgyNTYxLCAgIDgyMzU0NzYsICAgNjU4ODM4NywgICA0OTQxMjk0LCAgIDMyOTQxOTcsICAgMTY0NzA5OQogfTsKIAotdWludDE2X3QgZmZfZmZ0X29mZnNldHNfbHV0WzB4MmFhYl07Cit1aW50MTZfdCBmZl9mZnRfb2Zmc2V0c19sdXRbMjE4NDVdOwogCiB2b2lkIGZmX2ZmdF9sdXRfaW5pdCh1aW50MTZfdCAqdGFibGUsIGludCBvZmYsIGludCBzaXplLCBpbnQgKmluZGV4KQogewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mZnRfdGFibGUuaCBiL2xpYmF2Y29kZWMvZmZ0X3RhYmxlLmgKaW5kZXggZTVlNTRiNi4uZWQwYTY1OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mZnRfdGFibGUuaAorKysgYi9saWJhdmNvZGVjL2ZmdF90YWJsZS5oCkBAIC01Niw3ICs1Niw3IEBACiAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2ZmdC5oIgogCi0jZGVmaW5lIE1BWF9MT0cyX05GRlQgMTYgLy8hPCBTcGVjaWZpZXMgbWF4aW11bSBhbGxvd2VkIGZmdCBzaXplCisjZGVmaW5lIE1BWF9MT0cyX05GRlQgMTcgLy8hPCBTcGVjaWZpZXMgbWF4aW11bSBhbGxvd2VkIGZmdCBzaXplCiAjZGVmaW5lIE1BWF9GRlRfU0laRSAoMSA8PCBNQVhfTE9HMl9ORkZUKQogCiBleHRlcm4gY29uc3QgaW50MzJfdCBmZl93X3RhYl9zcltdOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mZnRfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvZmZ0X3RlbXBsYXRlLmMKaW5kZXggMjNlYTQ1My4uNmM3Nzg1NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mZnRfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2ZmdF90ZW1wbGF0ZS5jCkBAIC0yOSwxMSArMjksMTkgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCiAjaW5jbHVkZSAiZmZ0LmgiCiAjaW5jbHVkZSAiZmZ0LWludGVybmFsLmgiCiAKICNpZiBGRlRfRklYRURfMzIKICNpbmNsdWRlICJmZnRfdGFibGUuaCIKKworc3RhdGljIHZvaWQgYXZfY29sZCBmZnRfbHV0X2luaXQodm9pZCkKK3sKKyAgICBpbnQgbiA9IDA7CisgICAgZmZfZmZ0X2x1dF9pbml0KGZmX2ZmdF9vZmZzZXRzX2x1dCwgMCwgMSA8PCAxNywgJm4pOworfQorCiAjZWxzZSAvKiBGRlRfRklYRURfMzIgKi8KIAogLyogY29zKDIqcGkqeC9uKSBmb3IgMDw9eDw9bi80LCBmb2xsb3dlZCBieSBpdHMgcmV2ZXJzZSAqLwpAQCAtNTEsNiArNTksNjcgQEAKIENPU1RBQkxFKDE2Mzg0KTsKIENPU1RBQkxFKDMyNzY4KTsKIENPU1RBQkxFKDY1NTM2KTsKK0NPU1RBQkxFKDEzMTA3Mik7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgaW5pdF9mZl9jb3NfdGFicyhpbnQgaW5kZXgpCit7CisgICAgaW50IGk7CisgICAgaW50IG0gPSAxPDxpbmRleDsKKyAgICBkb3VibGUgZnJlcSA9IDIqTV9QSS9tOworICAgIEZGVFNhbXBsZSAqdGFiID0gRkZUX05BTUUoZmZfY29zX3RhYnMpW2luZGV4XTsKKyAgICBmb3IoaT0wOyBpPD1tLzQ7IGkrKykKKyAgICAgICAgdGFiW2ldID0gRklYMTUoY29zKGkqZnJlcSkpOworICAgIGZvcihpPTE7IGk8bS80OyBpKyspCisgICAgICAgIHRhYlttLzItaV0gPSB0YWJbaV07Cit9CisKK3R5cGVkZWYgc3RydWN0IENvc1RhYnNJbml0T25jZSB7CisgICAgdm9pZCAoKmZ1bmMpKHZvaWQpOworICAgIEFWT25jZSBjb250cm9sOworfSBDb3NUYWJzSW5pdE9uY2U7CisKKyNkZWZpbmUgSU5JVF9GRl9DT1NfVEFCU19GVU5DKGluZGV4LCBzaXplKSAgICAgICAgICBcCitzdGF0aWMgYXZfY29sZCB2b2lkIGluaXRfZmZfY29zX3RhYnNfICMjIHNpemUgKHZvaWQpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbml0X2ZmX2Nvc190YWJzKGluZGV4KTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQyg0LCAxNikKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQyg1LCAzMikKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQyg2LCA2NCkKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQyg3LCAxMjgpCitJTklUX0ZGX0NPU19UQUJTX0ZVTkMoOCwgMjU2KQorSU5JVF9GRl9DT1NfVEFCU19GVU5DKDksIDUxMikKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQygxMCwgMTAyNCkKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQygxMSwgMjA0OCkKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQygxMiwgNDA5NikKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQygxMywgODE5MikKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQygxNCwgMTYzODQpCitJTklUX0ZGX0NPU19UQUJTX0ZVTkMoMTUsIDMyNzY4KQorSU5JVF9GRl9DT1NfVEFCU19GVU5DKDE2LCA2NTUzNikKK0lOSVRfRkZfQ09TX1RBQlNfRlVOQygxNywgMTMxMDcyKQorCitzdGF0aWMgQ29zVGFic0luaXRPbmNlIGNvc190YWJzX2luaXRfb25jZVtdID0geworICAgIHsgTlVMTCB9LAorICAgIHsgTlVMTCB9LAorICAgIHsgTlVMTCB9LAorICAgIHsgTlVMTCB9LAorICAgIHsgaW5pdF9mZl9jb3NfdGFic18xNiwgQVZfT05DRV9JTklUIH0sCisgICAgeyBpbml0X2ZmX2Nvc190YWJzXzMyLCBBVl9PTkNFX0lOSVQgfSwKKyAgICB7IGluaXRfZmZfY29zX3RhYnNfNjQsIEFWX09OQ0VfSU5JVCB9LAorICAgIHsgaW5pdF9mZl9jb3NfdGFic18xMjgsIEFWX09OQ0VfSU5JVCB9LAorICAgIHsgaW5pdF9mZl9jb3NfdGFic18yNTYsIEFWX09OQ0VfSU5JVCB9LAorICAgIHsgaW5pdF9mZl9jb3NfdGFic181MTIsIEFWX09OQ0VfSU5JVCB9LAorICAgIHsgaW5pdF9mZl9jb3NfdGFic18xMDI0LCBBVl9PTkNFX0lOSVQgfSwKKyAgICB7IGluaXRfZmZfY29zX3RhYnNfMjA0OCwgQVZfT05DRV9JTklUIH0sCisgICAgeyBpbml0X2ZmX2Nvc190YWJzXzQwOTYsIEFWX09OQ0VfSU5JVCB9LAorICAgIHsgaW5pdF9mZl9jb3NfdGFic184MTkyLCBBVl9PTkNFX0lOSVQgfSwKKyAgICB7IGluaXRfZmZfY29zX3RhYnNfMTYzODQsIEFWX09OQ0VfSU5JVCB9LAorICAgIHsgaW5pdF9mZl9jb3NfdGFic18zMjc2OCwgQVZfT05DRV9JTklUIH0sCisgICAgeyBpbml0X2ZmX2Nvc190YWJzXzY1NTM2LCBBVl9PTkNFX0lOSVQgfSwKKyAgICB7IGluaXRfZmZfY29zX3RhYnNfMTMxMDcyLCBBVl9PTkNFX0lOSVQgfSwKK307CisKICNlbmRpZgogQ09TVEFCTEVfQ09OU1QgRkZUU2FtcGxlICogY29uc3QgRkZUX05BTUUoZmZfY29zX3RhYnMpW10gPSB7CiAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKQEAgLTY3LDYgKzEzNiw3IEBACiAgICAgRkZUX05BTUUoZmZfY29zXzE2Mzg0KSwKICAgICBGRlRfTkFNRShmZl9jb3NfMzI3NjgpLAogICAgIEZGVF9OQU1FKGZmX2Nvc182NTUzNiksCisgICAgRkZUX05BTUUoZmZfY29zXzEzMTA3MiksCiB9OwogCiAjZW5kaWYgLyogRkZUX0ZJWEVEXzMyICovCkBAIC04OCwxNCArMTU4LDcgQEAKIGF2X2NvbGQgdm9pZCBmZl9pbml0X2ZmX2Nvc190YWJzKGludCBpbmRleCkKIHsKICNpZiAoIUNPTkZJR19IQVJEQ09ERURfVEFCTEVTKSAmJiAoIUZGVF9GSVhFRF8zMikKLSAgICBpbnQgaTsKLSAgICBpbnQgbSA9IDE8PGluZGV4OwotICAgIGRvdWJsZSBmcmVxID0gMipNX1BJL207Ci0gICAgRkZUU2FtcGxlICp0YWIgPSBGRlRfTkFNRShmZl9jb3NfdGFicylbaW5kZXhdOwotICAgIGZvcihpPTA7IGk8PW0vNDsgaSsrKQotICAgICAgICB0YWJbaV0gPSBGSVgxNShjb3MoaSpmcmVxKSk7Ci0gICAgZm9yKGk9MTsgaTxtLzQ7IGkrKykKLSAgICAgICAgdGFiW20vMi1pXSA9IHRhYltpXTsKKyAgICBmZl90aHJlYWRfb25jZSgmY29zX3RhYnNfaW5pdF9vbmNlW2luZGV4XS5jb250cm9sLCBjb3NfdGFic19pbml0X29uY2VbaW5kZXhdLmZ1bmMpOwogI2VuZGlmCiB9CiAKQEAgLTE0MSwxNCArMjA0LDIzIEBACiB7CiAgICAgaW50IGksIGosIG47CiAKLSAgICBpZiAobmJpdHMgPCAyIHx8IG5iaXRzID4gMTYpCisgICAgcy0+cmV2dGFiID0gTlVMTDsKKyAgICBzLT5yZXZ0YWIzMiA9IE5VTEw7CisKKyAgICBpZiAobmJpdHMgPCAyIHx8IG5iaXRzID4gMTcpCiAgICAgICAgIGdvdG8gZmFpbDsKICAgICBzLT5uYml0cyA9IG5iaXRzOwogICAgIG4gPSAxIDw8IG5iaXRzOwogCi0gICAgcy0+cmV2dGFiID0gYXZfbWFsbG9jKG4gKiBzaXplb2YodWludDE2X3QpKTsKLSAgICBpZiAoIXMtPnJldnRhYikKLSAgICAgICAgZ290byBmYWlsOworICAgIGlmIChuYml0cyA8PSAxNikgeworICAgICAgICBzLT5yZXZ0YWIgPSBhdl9tYWxsb2MobiAqIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICBpZiAoIXMtPnJldnRhYikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5yZXZ0YWIzMiA9IGF2X21hbGxvYyhuICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGlmICghcy0+cmV2dGFiMzIpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQogICAgIHMtPnRtcF9idWYgPSBhdl9tYWxsb2MobiAqIHNpemVvZihGRlRDb21wbGV4KSk7CiAgICAgaWYgKCFzLT50bXBfYnVmKQogICAgICAgICBnb3RvIGZhaWw7CkBAIC0xNjUsOCArMjM3LDggQEAKIAogI2lmIEZGVF9GSVhFRF8zMgogICAgIHsKLSAgICAgICAgaW50IG49MDsKLSAgICAgICAgZmZfZmZ0X2x1dF9pbml0KGZmX2ZmdF9vZmZzZXRzX2x1dCwgMCwgMSA8PCAxNiwgJm4pOworICAgICAgICBzdGF0aWMgQVZPbmNlIGNvbnRyb2wgPSBBVl9PTkNFX0lOSVQ7CisgICAgICAgIGZmX3RocmVhZF9vbmNlKCZjb250cm9sLCBmZnRfbHV0X2luaXQpOwogICAgIH0KICNlbHNlIC8qIEZGVF9GSVhFRF8zMiAqLwogI2lmIEZGVF9GTE9BVApAQCAtMTkwLDE2ICsyNjIsMjIgQEAKICAgICAgICAgZmZ0X3Blcm1fYXZ4KHMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvcihpPTA7IGk8bjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgazsKICAgICAgICAgICAgIGogPSBpOwogICAgICAgICAgICAgaWYgKHMtPmZmdF9wZXJtdXRhdGlvbiA9PSBGRl9GRlRfUEVSTV9TV0FQX0xTQlMpCiAgICAgICAgICAgICAgICAgaiA9IChqJn4zKSB8ICgoaj4+MSkmMSkgfCAoKGo8PDEpJjIpOwotICAgICAgICAgICAgcy0+cmV2dGFiWy1zcGxpdF9yYWRpeF9wZXJtdXRhdGlvbihpLCBuLCBzLT5pbnZlcnNlKSAmIChuLTEpXSA9IGo7CisgICAgICAgICAgICBrID0gLXNwbGl0X3JhZGl4X3Blcm11dGF0aW9uKGksIG4sIHMtPmludmVyc2UpICYgKG4tMSk7CisgICAgICAgICAgICBpZiAocy0+cmV2dGFiKQorICAgICAgICAgICAgICAgIHMtPnJldnRhYltrXSA9IGo7CisgICAgICAgICAgICBpZiAocy0+cmV2dGFiMzIpCisgICAgICAgICAgICAgICAgcy0+cmV2dGFiMzJba10gPSBqOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiAgZmFpbDoKICAgICBhdl9mcmVlcCgmcy0+cmV2dGFiKTsKKyAgICBhdl9mcmVlcCgmcy0+cmV2dGFiMzIpOwogICAgIGF2X2ZyZWVwKCZzLT50bXBfYnVmKTsKICAgICByZXR1cm4gLTE7CiB9CkBAIC0yMDgsMTUgKzI4NiwyMSBAQAogewogICAgIGludCBqLCBucDsKICAgICBjb25zdCB1aW50MTZfdCAqcmV2dGFiID0gcy0+cmV2dGFiOworICAgIGNvbnN0IHVpbnQzMl90ICpyZXZ0YWIzMiA9IHMtPnJldnRhYjMyOwogICAgIG5wID0gMSA8PCBzLT5uYml0czsKICAgICAvKiBUT0RPOiBoYW5kbGUgc3BsaXQtcmFkaXggcGVybXV0ZSBpbiBhIG1vcmUgb3B0aW1hbCB3YXksIHByb2JhYmx5IGluLXBsYWNlICovCi0gICAgZm9yKGo9MDtqPG5wO2orKykgcy0+dG1wX2J1ZltyZXZ0YWJbal1dID0geltqXTsKKyAgICBpZiAocmV2dGFiKSB7CisgICAgICAgIGZvcihqPTA7ajxucDtqKyspIHMtPnRtcF9idWZbcmV2dGFiW2pdXSA9IHpbal07CisgICAgfSBlbHNlCisgICAgICAgIGZvcihqPTA7ajxucDtqKyspIHMtPnRtcF9idWZbcmV2dGFiMzJbal1dID0geltqXTsKKwogICAgIG1lbWNweSh6LCBzLT50bXBfYnVmLCBucCAqIHNpemVvZihGRlRDb21wbGV4KSk7CiB9CiAKIGF2X2NvbGQgdm9pZCBmZl9mZnRfZW5kKEZGVENvbnRleHQgKnMpCiB7CiAgICAgYXZfZnJlZXAoJnMtPnJldnRhYik7CisgICAgYXZfZnJlZXAoJnMtPnJldnRhYjMyKTsKICAgICBhdl9mcmVlcCgmcy0+dG1wX2J1Zik7CiB9CiAKQEAgLTIyNiw3ICszMTAsNyBAQAogCiAgICAgaW50IG5iaXRzLCBpLCBuLCBudW1fdHJhbnNmb3Jtcywgb2Zmc2V0LCBzdGVwOwogICAgIGludCBuNCwgbjIsIG4zNDsKLSAgICBGRlRTYW1wbGUgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgdG1wODsKKyAgICB1bnNpZ25lZCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCB0bXA4OwogICAgIEZGVENvbXBsZXggKnRtcHo7CiAgICAgY29uc3QgaW50IGZmdF9zaXplID0gKDEgPDwgcy0+bmJpdHMpOwogICAgIGludDY0X3QgYWNjdTsKQEAgLTIzNywxNCArMzIxLDE0IEBACiAgICAgICAgIG9mZnNldCA9IGZmX2ZmdF9vZmZzZXRzX2x1dFtuXSA8PCAyOwogICAgICAgICB0bXB6ID0geiArIG9mZnNldDsKIAotICAgICAgICB0bXAxID0gdG1welswXS5yZSArIHRtcHpbMV0ucmU7Ci0gICAgICAgIHRtcDUgPSB0bXB6WzJdLnJlICsgdG1welszXS5yZTsKLSAgICAgICAgdG1wMiA9IHRtcHpbMF0uaW0gKyB0bXB6WzFdLmltOwotICAgICAgICB0bXA2ID0gdG1welsyXS5pbSArIHRtcHpbM10uaW07Ci0gICAgICAgIHRtcDMgPSB0bXB6WzBdLnJlIC0gdG1welsxXS5yZTsKLSAgICAgICAgdG1wOCA9IHRtcHpbMl0uaW0gLSB0bXB6WzNdLmltOwotICAgICAgICB0bXA0ID0gdG1welswXS5pbSAtIHRtcHpbMV0uaW07Ci0gICAgICAgIHRtcDcgPSB0bXB6WzJdLnJlIC0gdG1welszXS5yZTsKKyAgICAgICAgdG1wMSA9IHRtcHpbMF0ucmUgKyAodW5zaWduZWQpdG1welsxXS5yZTsKKyAgICAgICAgdG1wNSA9IHRtcHpbMl0ucmUgKyAodW5zaWduZWQpdG1welszXS5yZTsKKyAgICAgICAgdG1wMiA9IHRtcHpbMF0uaW0gKyAodW5zaWduZWQpdG1welsxXS5pbTsKKyAgICAgICAgdG1wNiA9IHRtcHpbMl0uaW0gKyAodW5zaWduZWQpdG1welszXS5pbTsKKyAgICAgICAgdG1wMyA9IHRtcHpbMF0ucmUgLSAodW5zaWduZWQpdG1welsxXS5yZTsKKyAgICAgICAgdG1wOCA9IHRtcHpbMl0uaW0gLSAodW5zaWduZWQpdG1welszXS5pbTsKKyAgICAgICAgdG1wNCA9IHRtcHpbMF0uaW0gLSAodW5zaWduZWQpdG1welsxXS5pbTsKKyAgICAgICAgdG1wNyA9IHRtcHpbMl0ucmUgLSAodW5zaWduZWQpdG1welszXS5yZTsKIAogICAgICAgICB0bXB6WzBdLnJlID0gdG1wMSArIHRtcDU7CiAgICAgICAgIHRtcHpbMl0ucmUgPSB0bXAxIC0gdG1wNTsKQEAgLTI2NSwxOSArMzQ5LDE5IEBACiAgICAgICAgIG9mZnNldCA9IGZmX2ZmdF9vZmZzZXRzX2x1dFtuXSA8PCAzOwogICAgICAgICB0bXB6ID0geiArIG9mZnNldDsKIAotICAgICAgICB0bXAxID0gdG1wels0XS5yZSArIHRtcHpbNV0ucmU7Ci0gICAgICAgIHRtcDMgPSB0bXB6WzZdLnJlICsgdG1wels3XS5yZTsKLSAgICAgICAgdG1wMiA9IHRtcHpbNF0uaW0gKyB0bXB6WzVdLmltOwotICAgICAgICB0bXA0ID0gdG1wels2XS5pbSArIHRtcHpbN10uaW07CisgICAgICAgIHRtcDEgPSB0bXB6WzRdLnJlICsgKHVuc2lnbmVkKXRtcHpbNV0ucmU7CisgICAgICAgIHRtcDMgPSB0bXB6WzZdLnJlICsgKHVuc2lnbmVkKXRtcHpbN10ucmU7CisgICAgICAgIHRtcDIgPSB0bXB6WzRdLmltICsgKHVuc2lnbmVkKXRtcHpbNV0uaW07CisgICAgICAgIHRtcDQgPSB0bXB6WzZdLmltICsgKHVuc2lnbmVkKXRtcHpbN10uaW07CiAgICAgICAgIHRtcDUgPSB0bXAxICsgdG1wMzsKICAgICAgICAgdG1wNyA9IHRtcDEgLSB0bXAzOwogICAgICAgICB0bXA2ID0gdG1wMiArIHRtcDQ7CiAgICAgICAgIHRtcDggPSB0bXAyIC0gdG1wNDsKIAotICAgICAgICB0bXAxID0gdG1wels0XS5yZSAtIHRtcHpbNV0ucmU7Ci0gICAgICAgIHRtcDIgPSB0bXB6WzRdLmltIC0gdG1wels1XS5pbTsKLSAgICAgICAgdG1wMyA9IHRtcHpbNl0ucmUgLSB0bXB6WzddLnJlOwotICAgICAgICB0bXA0ID0gdG1wels2XS5pbSAtIHRtcHpbN10uaW07CisgICAgICAgIHRtcDEgPSB0bXB6WzRdLnJlIC0gKHVuc2lnbmVkKXRtcHpbNV0ucmU7CisgICAgICAgIHRtcDIgPSB0bXB6WzRdLmltIC0gKHVuc2lnbmVkKXRtcHpbNV0uaW07CisgICAgICAgIHRtcDMgPSB0bXB6WzZdLnJlIC0gKHVuc2lnbmVkKXRtcHpbN10ucmU7CisgICAgICAgIHRtcDQgPSB0bXB6WzZdLmltIC0gKHVuc2lnbmVkKXRtcHpbN10uaW07CiAKICAgICAgICAgdG1wels0XS5yZSA9IHRtcHpbMF0ucmUgLSB0bXA1OwogICAgICAgICB0bXB6WzBdLnJlID0gdG1welswXS5yZSArIHRtcDU7CkBAIC0yODgsMTMgKzM3MiwxMyBAQAogICAgICAgICB0bXB6WzZdLmltID0gdG1welsyXS5pbSArIHRtcDc7CiAgICAgICAgIHRtcHpbMl0uaW0gPSB0bXB6WzJdLmltIC0gdG1wNzsKIAotICAgICAgICBhY2N1ID0gKGludDY0X3QpUTMxKE1fU1FSVDFfMikqKHRtcDEgKyB0bXAyKTsKKyAgICAgICAgYWNjdSA9IChpbnQ2NF90KVEzMShNX1NRUlQxXzIpKihpbnQpKHRtcDEgKyB0bXAyKTsKICAgICAgICAgdG1wNSA9IChpbnQzMl90KSgoYWNjdSArIDB4NDAwMDAwMDApID4+IDMxKTsKLSAgICAgICAgYWNjdSA9IChpbnQ2NF90KVEzMShNX1NRUlQxXzIpKih0bXAzIC0gdG1wNCk7CisgICAgICAgIGFjY3UgPSAoaW50NjRfdClRMzEoTV9TUVJUMV8yKSooaW50KSh0bXAzIC0gdG1wNCk7CiAgICAgICAgIHRtcDcgPSAoaW50MzJfdCkoKGFjY3UgKyAweDQwMDAwMDAwKSA+PiAzMSk7Ci0gICAgICAgIGFjY3UgPSAoaW50NjRfdClRMzEoTV9TUVJUMV8yKSoodG1wMiAtIHRtcDEpOworICAgICAgICBhY2N1ID0gKGludDY0X3QpUTMxKE1fU1FSVDFfMikqKGludCkodG1wMiAtIHRtcDEpOwogICAgICAgICB0bXA2ID0gKGludDMyX3QpKChhY2N1ICsgMHg0MDAwMDAwMCkgPj4gMzEpOwotICAgICAgICBhY2N1ID0gKGludDY0X3QpUTMxKE1fU1FSVDFfMikqKHRtcDMgKyB0bXA0KTsKKyAgICAgICAgYWNjdSA9IChpbnQ2NF90KVEzMShNX1NRUlQxXzIpKihpbnQpKHRtcDMgKyB0bXA0KTsKICAgICAgICAgdG1wOCA9IChpbnQzMl90KSgoYWNjdSArIDB4NDAwMDAwMDApID4+IDMxKTsKICAgICAgICAgdG1wMSA9IHRtcDUgKyB0bXA3OwogICAgICAgICB0bXAzID0gdG1wNSAtIHRtcDc7CkBAIC0zMjUsMTAgKzQwOSwxMCBAQAogICAgICAgICAgICAgb2Zmc2V0ID0gZmZfZmZ0X29mZnNldHNfbHV0W25dIDw8IG5iaXRzOwogICAgICAgICAgICAgdG1weiA9IHogKyBvZmZzZXQ7CiAKLSAgICAgICAgICAgIHRtcDUgPSB0bXB6WyBuMl0ucmUgKyB0bXB6W24zNF0ucmU7Ci0gICAgICAgICAgICB0bXAxID0gdG1welsgbjJdLnJlIC0gdG1weltuMzRdLnJlOwotICAgICAgICAgICAgdG1wNiA9IHRtcHpbIG4yXS5pbSArIHRtcHpbbjM0XS5pbTsKLSAgICAgICAgICAgIHRtcDIgPSB0bXB6WyBuMl0uaW0gLSB0bXB6W24zNF0uaW07CisgICAgICAgICAgICB0bXA1ID0gdG1welsgbjJdLnJlICsgKHVuc2lnbmVkKXRtcHpbbjM0XS5yZTsKKyAgICAgICAgICAgIHRtcDEgPSB0bXB6WyBuMl0ucmUgLSAodW5zaWduZWQpdG1weltuMzRdLnJlOworICAgICAgICAgICAgdG1wNiA9IHRtcHpbIG4yXS5pbSArICh1bnNpZ25lZCl0bXB6W24zNF0uaW07CisgICAgICAgICAgICB0bXAyID0gdG1welsgbjJdLmltIC0gKHVuc2lnbmVkKXRtcHpbbjM0XS5pbTsKIAogICAgICAgICAgICAgdG1welsgbjJdLnJlID0gdG1welsgMF0ucmUgLSB0bXA1OwogICAgICAgICAgICAgdG1welsgIDBdLnJlID0gdG1welsgMF0ucmUgKyB0bXA1OwpAQCAtNTE1LDEwICs1OTksMTEgQEAKIERFQ0xfRkZUKDE2Mzg0LDgxOTIsNDA5NikKIERFQ0xfRkZUKDMyNzY4LDE2Mzg0LDgxOTIpCiBERUNMX0ZGVCg2NTUzNiwzMjc2OCwxNjM4NCkKK0RFQ0xfRkZUKDEzMTA3Miw2NTUzNiwzMjc2OCkKIAogc3RhdGljIHZvaWQgKCogY29uc3QgZmZ0X2Rpc3BhdGNoW10pKEZGVENvbXBsZXgqKSA9IHsKICAgICBmZnQ0LCBmZnQ4LCBmZnQxNiwgZmZ0MzIsIGZmdDY0LCBmZnQxMjgsIGZmdDI1NiwgZmZ0NTEyLCBmZnQxMDI0LAotICAgIGZmdDIwNDgsIGZmdDQwOTYsIGZmdDgxOTIsIGZmdDE2Mzg0LCBmZnQzMjc2OCwgZmZ0NjU1MzYsCisgICAgZmZ0MjA0OCwgZmZ0NDA5NiwgZmZ0ODE5MiwgZmZ0MTYzODQsIGZmdDMyNzY4LCBmZnQ2NTUzNiwgZmZ0MTMxMDcyCiB9OwogCiBzdGF0aWMgdm9pZCBmZnRfY2FsY19jKEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ZmdjEuYyBiL2xpYmF2Y29kZWMvZmZ2MS5jCmluZGV4IDUzNzQwOWUuLmExNGRkMmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZmZ2MS5jCisrKyBiL2xpYmF2Y29kZWMvZmZ2MS5jCkBAIC0zMiwxMCArMzIsMTAgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAicmFuZ2Vjb2Rlci5oIgotI2luY2x1ZGUgImdvbG9tYi5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJmZnYxLmgiCiAKQEAgLTE0NCw3ICsxNDQsMTEgQEAKIAogICAgICAgICBmcy0+c2FtcGxlX2J1ZmZlciA9IGF2X21hbGxvY19hcnJheSgoZnMtPndpZHRoICsgNiksIDMgKiBNQVhfUExBTkVTICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmcy0+c2FtcGxlX2J1ZmZlcikpOwotICAgICAgICBpZiAoIWZzLT5zYW1wbGVfYnVmZmVyKSB7CisgICAgICAgIGZzLT5zYW1wbGVfYnVmZmVyMzIgPSBhdl9tYWxsb2NfYXJyYXkoKGZzLT53aWR0aCArIDYpLCAzICogTUFYX1BMQU5FUyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmcy0+c2FtcGxlX2J1ZmZlcjMyKSk7CisgICAgICAgIGlmICghZnMtPnNhbXBsZV9idWZmZXIgfHwgIWZzLT5zYW1wbGVfYnVmZmVyMzIpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZmcy0+c2FtcGxlX2J1ZmZlcik7CisgICAgICAgICAgICBhdl9mcmVlcCgmZnMtPnNhbXBsZV9idWZmZXIzMik7CiAgICAgICAgICAgICBhdl9mcmVlcCgmZi0+c2xpY2VfY29udGV4dFtpXSk7CiAgICAgICAgICAgICBnb3RvIG1lbWZhaWw7CiAgICAgICAgIH0KQEAgLTE1NCw2ICsxNTgsNyBAQAogbWVtZmFpbDoKICAgICB3aGlsZSgtLWkgPj0gMCkgewogICAgICAgICBhdl9mcmVlcCgmZi0+c2xpY2VfY29udGV4dFtpXS0+c2FtcGxlX2J1ZmZlcik7CisgICAgICAgIGF2X2ZyZWVwKCZmLT5zbGljZV9jb250ZXh0W2ldLT5zYW1wbGVfYnVmZmVyMzIpOwogICAgICAgICBhdl9mcmVlcCgmZi0+c2xpY2VfY29udGV4dFtpXSk7CiAgICAgfQogICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0yMjQsNiArMjI5LDcgQEAKICAgICAgICAgICAgIGF2X2ZyZWVwKCZwLT52bGNfc3RhdGUpOwogICAgICAgICB9CiAgICAgICAgIGF2X2ZyZWVwKCZmcy0+c2FtcGxlX2J1ZmZlcik7CisgICAgICAgIGF2X2ZyZWVwKCZmcy0+c2FtcGxlX2J1ZmZlcjMyKTsKICAgICB9CiAKICAgICBhdl9mcmVlcCgmYXZjdHgtPnN0YXRzX291dCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ZmdjEuaCBiL2xpYmF2Y29kZWMvZmZ2MS5oCmluZGV4IGQ5Mzk4ZTUuLjY1MzEzOGIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZmZ2MS5oCisrKyBiL2xpYmF2Y29kZWMvZmZ2MS5oCkBAIC03NCw3ICs3NCw3IEBACiAgICAgdWludDhfdCBpbnRlcmxhY2VfYml0X3N0YXRlWzJdOwogfSBQbGFuZUNvbnRleHQ7CiAKLSNkZWZpbmUgTUFYX1NMSUNFUyAyNTYKKyNkZWZpbmUgTUFYX1NMSUNFUyAxMDI0CiAKIHR5cGVkZWYgc3RydWN0IEZGVjFDb250ZXh0IHsKICAgICBBVkNsYXNzICpjbGFzczsKQEAgLTEwOSw2ICsxMDksOSBAQAogICAgIGludCBydW5faW5kZXg7CiAgICAgaW50IGNvbG9yc3BhY2U7CiAgICAgaW50MTZfdCAqc2FtcGxlX2J1ZmZlcjsKKyAgICBpbnQzMl90ICpzYW1wbGVfYnVmZmVyMzI7CisKKyAgICBpbnQgdXNlMzJiaXQ7CiAKICAgICBpbnQgZWM7CiAgICAgaW50IGludHJhOwpAQCAtMTU4LDM3ICsxNjEsNiBAQAogICAgIHJldHVybiBkaWZmOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBwcmVkaWN0KGludDE2X3QgKnNyYywgaW50MTZfdCAqbGFzdCkKLXsKLSAgICBjb25zdCBpbnQgTFQgPSBsYXN0Wy0xXTsKLSAgICBjb25zdCBpbnQgVCAgPSBsYXN0WzBdOwotICAgIGNvbnN0IGludCBMICA9IHNyY1stMV07Ci0KLSAgICByZXR1cm4gbWlkX3ByZWQoTCwgTCArIFQgLSBMVCwgVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdldF9jb250ZXh0KFBsYW5lQ29udGV4dCAqcCwgaW50MTZfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqbGFzdCwgaW50MTZfdCAqbGFzdDIpCi17Ci0gICAgY29uc3QgaW50IExUID0gbGFzdFstMV07Ci0gICAgY29uc3QgaW50IFQgID0gbGFzdFswXTsKLSAgICBjb25zdCBpbnQgUlQgPSBsYXN0WzFdOwotICAgIGNvbnN0IGludCBMICA9IHNyY1stMV07Ci0KLSAgICBpZiAocC0+cXVhbnRfdGFibGVbM11bMTI3XSkgewotICAgICAgICBjb25zdCBpbnQgVFQgPSBsYXN0MlswXTsKLSAgICAgICAgY29uc3QgaW50IExMID0gc3JjWy0yXTsKLSAgICAgICAgcmV0dXJuIHAtPnF1YW50X3RhYmxlWzBdWyhMIC0gTFQpICYgMHhGRl0gKwotICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbMV1bKExUIC0gVCkgJiAweEZGXSArCi0gICAgICAgICAgICAgICBwLT5xdWFudF90YWJsZVsyXVsoVCAtIFJUKSAmIDB4RkZdICsKLSAgICAgICAgICAgICAgIHAtPnF1YW50X3RhYmxlWzNdWyhMTCAtIEwpICYgMHhGRl0gKwotICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbNF1bKFRUIC0gVCkgJiAweEZGXTsKLSAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIHAtPnF1YW50X3RhYmxlWzBdWyhMIC0gTFQpICYgMHhGRl0gKwotICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbMV1bKExUIC0gVCkgJiAweEZGXSArCi0gICAgICAgICAgICAgICBwLT5xdWFudF90YWJsZVsyXVsoVCAtIFJUKSAmIDB4RkZdOwotfQotCiBzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3ZsY19zdGF0ZShWbGNTdGF0ZSAqY29uc3Qgc3RhdGUsIGNvbnN0IGludCB2KQogewogICAgIGludCBkcmlmdCA9IHN0YXRlLT5kcmlmdDsKQEAgLTIyMyw0ICsxOTUsMTYgQEAKICAgICBzdGF0ZS0+Y291bnQgPSBjb3VudDsKIH0KIAorI2RlZmluZSBUWVBFIGludDE2X3QKKyNkZWZpbmUgUkVOQU1FKG5hbWUpIG5hbWUKKyNpbmNsdWRlICJmZnYxX3RlbXBsYXRlLmMiCisjdW5kZWYgVFlQRQorI3VuZGVmIFJFTkFNRQorCisjZGVmaW5lIFRZUEUgaW50MzJfdAorI2RlZmluZSBSRU5BTUUobmFtZSkgbmFtZSAjIyAzMgorI2luY2x1ZGUgImZmdjFfdGVtcGxhdGUuYyIKKyN1bmRlZiBUWVBFCisjdW5kZWYgUkVOQU1FCisKICNlbmRpZiAvKiBBVkNPREVDX0ZGVjFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mZnYxX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2ZmdjFfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmFiOTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9mZnYxX3RlbXBsYXRlLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIEZGVjEgY29kZWMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCitzdGF0aWMgaW5saW5lIGludCBSRU5BTUUocHJlZGljdCkoVFlQRSAqc3JjLCBUWVBFICpsYXN0KQoreworICAgIGNvbnN0IGludCBMVCA9IGxhc3RbLTFdOworICAgIGNvbnN0IGludCBUICA9IGxhc3RbMF07CisgICAgY29uc3QgaW50IEwgID0gc3JjWy0xXTsKKworICAgIHJldHVybiBtaWRfcHJlZChMLCBMICsgVCAtIExULCBUKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgUkVOQU1FKGdldF9jb250ZXh0KShQbGFuZUNvbnRleHQgKnAsIFRZUEUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRSAqbGFzdCwgVFlQRSAqbGFzdDIpCit7CisgICAgY29uc3QgaW50IExUID0gbGFzdFstMV07CisgICAgY29uc3QgaW50IFQgID0gbGFzdFswXTsKKyAgICBjb25zdCBpbnQgUlQgPSBsYXN0WzFdOworICAgIGNvbnN0IGludCBMICA9IHNyY1stMV07CisKKyAgICBpZiAocC0+cXVhbnRfdGFibGVbM11bMTI3XSkgeworICAgICAgICBjb25zdCBpbnQgVFQgPSBsYXN0MlswXTsKKyAgICAgICAgY29uc3QgaW50IExMID0gc3JjWy0yXTsKKyAgICAgICAgcmV0dXJuIHAtPnF1YW50X3RhYmxlWzBdWyhMIC0gTFQpICYgMHhGRl0gKworICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbMV1bKExUIC0gVCkgJiAweEZGXSArCisgICAgICAgICAgICAgICBwLT5xdWFudF90YWJsZVsyXVsoVCAtIFJUKSAmIDB4RkZdICsKKyAgICAgICAgICAgICAgIHAtPnF1YW50X3RhYmxlWzNdWyhMTCAtIEwpICYgMHhGRl0gKworICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbNF1bKFRUIC0gVCkgJiAweEZGXTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIHAtPnF1YW50X3RhYmxlWzBdWyhMIC0gTFQpICYgMHhGRl0gKworICAgICAgICAgICAgICAgcC0+cXVhbnRfdGFibGVbMV1bKExUIC0gVCkgJiAweEZGXSArCisgICAgICAgICAgICAgICBwLT5xdWFudF90YWJsZVsyXVsoVCAtIFJUKSAmIDB4RkZdOworfQorCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ZmdjFkZWMuYyBiL2xpYmF2Y29kZWMvZmZ2MWRlYy5jCmluZGV4IGQyYmYzYTguLjc2NThhNTEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZmZ2MWRlYy5jCisrKyBiL2xpYmF2Y29kZWMvZmZ2MWRlYy5jCkBAIC00NSw3ICs0NSw4IEBACiAgICAgaWYgKGdldF9yYWMoYywgc3RhdGUgKyAwKSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgZWxzZSB7Ci0gICAgICAgIGludCBpLCBlLCBhOworICAgICAgICBpbnQgaSwgZTsKKyAgICAgICAgdW5zaWduZWQgYTsKICAgICAgICAgZSA9IDA7CiAgICAgICAgIHdoaWxlIChnZXRfcmFjKGMsIHN0YXRlICsgMSArIEZGTUlOKGUsIDkpKSkgeyAvLyAxLi4xMAogICAgICAgICAgICAgZSsrOwpAQCAtODMsMTIgKzg0LDcgQEAKICAgICBmZl9kbG9nKE5VTEwsICJ2OiVkIGJpYXM6JWQgZXJyb3I6JWQgZHJpZnQ6JWQgY291bnQ6JWQgazolZCIsCiAgICAgICAgICAgICB2LCBzdGF0ZS0+Ymlhcywgc3RhdGUtPmVycm9yX3N1bSwgc3RhdGUtPmRyaWZ0LCBzdGF0ZS0+Y291bnQsIGspOwogCi0jaWYgMCAvLyBKUEVHIExTCi0gICAgaWYgKGsgPT0gMCAmJiAyICogc3RhdGUtPmRyaWZ0IDw9IC1zdGF0ZS0+Y291bnQpCi0gICAgICAgIHYgXj0gKC0xKTsKLSNlbHNlCiAgICAgdiBePSAoKDIgKiBzdGF0ZS0+ZHJpZnQgKyBzdGF0ZS0+Y291bnQpID4+IDMxKTsKLSNlbmRpZgogCiAgICAgcmV0ID0gZm9sZCh2ICsgc3RhdGUtPmJpYXMsIGJpdHMpOwogCkBAIC05Nyw5MCArOTMsMzAgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGRlY29kZV9saW5lKEZGVjFDb250ZXh0ICpzLCBpbnQgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc2FtcGxlWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmVfaW5kZXgsIGludCBiaXRzKQorc3RhdGljIGludCBpc19pbnB1dF9lbmQoRkZWMUNvbnRleHQgKnMpCiB7Ci0gICAgUGxhbmVDb250ZXh0ICpjb25zdCBwID0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XTsKLSAgICBSYW5nZUNvZGVyICpjb25zdCBjICAgPSAmcy0+YzsKLSAgICBpbnQgeDsKLSAgICBpbnQgcnVuX2NvdW50ID0gMDsKLSAgICBpbnQgcnVuX21vZGUgID0gMDsKLSAgICBpbnQgcnVuX2luZGV4ID0gcy0+cnVuX2luZGV4OwotCi0gICAgaWYgKHMtPnNsaWNlX2NvZGluZ19tb2RlID09IDEpIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgICAgIGludCB2ID0gMDsKLSAgICAgICAgICAgIGZvciAoaT0wOyBpPGJpdHM7IGkrKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGUgPSAxMjg7Ci0gICAgICAgICAgICAgICAgdiArPSB2ICsgZ2V0X3JhYyhjLCAmc3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FtcGxlWzFdW3hdID0gdjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47CisgICAgaWYgKHMtPmFjICE9IEFDX0dPTE9NQl9SSUNFKSB7CisgICAgICAgIFJhbmdlQ29kZXIgKmNvbnN0IGMgPSAmcy0+YzsKKyAgICAgICAgaWYgKGMtPm92ZXJyZWFkID4gTUFYX09WRVJSRUFEKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8IDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgIGludCBkaWZmLCBjb250ZXh0LCBzaWduOwotCi0gICAgICAgIGNvbnRleHQgPSBnZXRfY29udGV4dChwLCBzYW1wbGVbMV0gKyB4LCBzYW1wbGVbMF0gKyB4LCBzYW1wbGVbMV0gKyB4KTsKLSAgICAgICAgaWYgKGNvbnRleHQgPCAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gLWNvbnRleHQ7Ci0gICAgICAgICAgICBzaWduICAgID0gMTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzaWduID0gMDsKLQotICAgICAgICBhdl9hc3NlcnQyKGNvbnRleHQgPCBwLT5jb250ZXh0X2NvdW50KTsKLQotICAgICAgICBpZiAocy0+YWMgIT0gQUNfR09MT01CX1JJQ0UpIHsKLSAgICAgICAgICAgIGRpZmYgPSBnZXRfc3ltYm9sX2lubGluZShjLCBwLT5zdGF0ZVtjb250ZXh0XSwgMSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCA9PSAwICYmIHJ1bl9tb2RlID09IDApCi0gICAgICAgICAgICAgICAgcnVuX21vZGUgPSAxOwotCi0gICAgICAgICAgICBpZiAocnVuX21vZGUpIHsKLSAgICAgICAgICAgICAgICBpZiAocnVuX2NvdW50ID09IDAgJiYgcnVuX21vZGUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCA9IDEgPDwgZmZfbG9nMl9ydW5bcnVuX2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ICsgcnVuX2NvdW50IDw9IHcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2luZGV4Kys7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmZfbG9nMl9ydW5bcnVuX2luZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fY291bnQgPSBnZXRfYml0cygmcy0+Z2IsIGZmX2xvZzJfcnVuW3J1bl9pbmRleF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuX2luZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9pbmRleC0tOwotICAgICAgICAgICAgICAgICAgICAgICAgcnVuX21vZGUgPSAyOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJ1bl9jb3VudC0tOwotICAgICAgICAgICAgICAgIGlmIChydW5fY291bnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bl9tb2RlICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGRpZmYgICAgICA9IGdldF92bGNfc3ltYm9sKCZzLT5nYiwgJnAtPnZsY19zdGF0ZVtjb250ZXh0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmKys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGRpZmYgPSAwOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgZGlmZiA9IGdldF92bGNfc3ltYm9sKCZzLT5nYiwgJnAtPnZsY19zdGF0ZVtjb250ZXh0XSwgYml0cyk7Ci0KLSAgICAgICAgICAgIGZmX2Rsb2cocy0+YXZjdHgsICJjb3VudDolZCBpbmRleDolZCwgbW9kZTolZCwgeDolZCBwb3M6JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCwgcnVuX2luZGV4LCBydW5fbW9kZSwgeCwgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc2lnbikKLSAgICAgICAgICAgIGRpZmYgPSAtZGlmZjsKLQotICAgICAgICBzYW1wbGVbMV1beF0gPSBhdl9tb2RfdWludHAyKHByZWRpY3Qoc2FtcGxlWzFdICsgeCwgc2FtcGxlWzBdICsgeCkgKyBkaWZmLCBiaXRzKTsKLSAgICB9Ci0gICAgcy0+cnVuX2luZGV4ID0gcnVuX2luZGV4OworICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkZWNvZGVfcGxhbmUoRkZWMUNvbnRleHQgKnMsIHVpbnQ4X3QgKnNyYywKKyNkZWZpbmUgVFlQRSBpbnQxNl90CisjZGVmaW5lIFJFTkFNRShuYW1lKSBuYW1lCisjaW5jbHVkZSAiZmZ2MWRlY190ZW1wbGF0ZS5jIgorI3VuZGVmIFRZUEUKKyN1bmRlZiBSRU5BTUUKKworI2RlZmluZSBUWVBFIGludDMyX3QKKyNkZWZpbmUgUkVOQU1FKG5hbWUpIG5hbWUgIyMgMzIKKyNpbmNsdWRlICJmZnYxZGVjX3RlbXBsYXRlLmMiCisKK3N0YXRpYyBpbnQgZGVjb2RlX3BsYW5lKEZGVjFDb250ZXh0ICpzLCB1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLCBpbnQgcGxhbmVfaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3N0cmlkZSkKIHsKQEAgLTIwNCw3OSArMTQwLDI4IEBACiAKIC8vIHsgU1RBUlRfVElNRVIKICAgICAgICAgaWYgKHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9IDgpIHsKLSAgICAgICAgICAgIGRlY29kZV9saW5lKHMsIHcsIHNhbXBsZSwgcGxhbmVfaW5kZXgsIDgpOworICAgICAgICAgICAgaW50IHJldCA9IGRlY29kZV9saW5lKHMsIHcsIHNhbXBsZSwgcGxhbmVfaW5kZXgsIDgpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCiAgICAgICAgICAgICAgICAgc3JjW3gqcGl4ZWxfc3RyaWRlICsgc3RyaWRlICogeV0gPSBzYW1wbGVbMV1beF07CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZWNvZGVfbGluZShzLCB3LCBzYW1wbGUsIHBsYW5lX2luZGV4LCBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgICAgICAgICBpbnQgcmV0ID0gZGVjb2RlX2xpbmUocywgdywgc2FtcGxlLCBwbGFuZV9pbmRleCwgcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIGlmIChzLT5wYWNrZWRfYXRfbHNiKSB7CiAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgewogICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90Kikoc3JjICsgc3RyaWRlKnkpKVt4KnBpeGVsX3N0cmlkZV0gPSBzYW1wbGVbMV1beF07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICgodWludDE2X3QqKShzcmMgKyBzdHJpZGUqeSkpW3gqcGl4ZWxfc3RyaWRlXSA9IHNhbXBsZVsxXVt4XSA8PCAoMTYgLSBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QqKShzcmMgKyBzdHJpZGUqeSkpW3gqcGl4ZWxfc3RyaWRlXSA9IHNhbXBsZVsxXVt4XSA8PCAoMTYgLSBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSkgfCAoKHVpbnQxNl90ICoqKXNhbXBsZSlbMV1beF0gPj4gKDIgKiBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSAtIDE2KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIC8vIFNUT1BfVElNRVIoImRlY29kZS1saW5lIikgfQogICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZGVjb2RlX3JnYl9mcmFtZShGRlYxQ29udGV4dCAqcywgdWludDhfdCAqc3JjWzNdLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGVbM10pCi17Ci0gICAgaW50IHgsIHksIHA7Ci0gICAgaW50MTZfdCAqc2FtcGxlWzRdWzJdOwotICAgIGludCBsYmQgICAgPSBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSA4OwotICAgIGludCBiaXRzICAgPSBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDAgPyBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA6IDg7Ci0gICAgaW50IG9mZnNldCA9IDEgPDwgYml0czsKLQotICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKLSAgICAgICAgc2FtcGxlW3hdWzBdID0gcy0+c2FtcGxlX2J1ZmZlciArICB4ICogMiAgICAgICogKHcgKyA2KSArIDM7Ci0gICAgICAgIHNhbXBsZVt4XVsxXSA9IHMtPnNhbXBsZV9idWZmZXIgKyAoeCAqIDIgKyAxKSAqICh3ICsgNikgKyAzOwotICAgIH0KLQotICAgIHMtPnJ1bl9pbmRleCA9IDA7Ci0KLSAgICBtZW1zZXQocy0+c2FtcGxlX2J1ZmZlciwgMCwgOCAqICh3ICsgNikgKiBzaXplb2YoKnMtPnNhbXBsZV9idWZmZXIpKTsKLQotICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgZm9yIChwID0gMDsgcCA8IDMgKyBzLT50cmFuc3BhcmVuY3k7IHArKykgewotICAgICAgICAgICAgaW50MTZfdCAqdGVtcCA9IHNhbXBsZVtwXVswXTsgLy8gRklYTUU6IHRyeSBhIG5vcm1hbCBidWZmZXIKLQotICAgICAgICAgICAgc2FtcGxlW3BdWzBdID0gc2FtcGxlW3BdWzFdOwotICAgICAgICAgICAgc2FtcGxlW3BdWzFdID0gdGVtcDsKLQotICAgICAgICAgICAgc2FtcGxlW3BdWzFdWy0xXT0gc2FtcGxlW3BdWzBdWzAgIF07Ci0gICAgICAgICAgICBzYW1wbGVbcF1bMF1bIHddPSBzYW1wbGVbcF1bMF1bdy0xXTsKLSAgICAgICAgICAgIGlmIChsYmQgJiYgcy0+c2xpY2VfY29kaW5nX21vZGUgPT0gMCkKLSAgICAgICAgICAgICAgICBkZWNvZGVfbGluZShzLCB3LCBzYW1wbGVbcF0sIChwICsgMSkvMiwgOSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGVjb2RlX2xpbmUocywgdywgc2FtcGxlW3BdLCAocCArIDEpLzIsIGJpdHMgKyAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgICAgIGludCBnID0gc2FtcGxlWzBdWzFdW3hdOwotICAgICAgICAgICAgaW50IGIgPSBzYW1wbGVbMV1bMV1beF07Ci0gICAgICAgICAgICBpbnQgciA9IHNhbXBsZVsyXVsxXVt4XTsKLSAgICAgICAgICAgIGludCBhID0gc2FtcGxlWzNdWzFdW3hdOwotCi0gICAgICAgICAgICBpZiAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkgewotICAgICAgICAgICAgICAgIGIgLT0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIHIgLT0gb2Zmc2V0OwotICAgICAgICAgICAgICAgIGcgLT0gKGIgKiBzLT5zbGljZV9yY3RfYnlfY29lZiArIHIgKiBzLT5zbGljZV9yY3RfcnlfY29lZikgPj4gMjsKLSAgICAgICAgICAgICAgICBiICs9IGc7Ci0gICAgICAgICAgICAgICAgciArPSBnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGJkKQotICAgICAgICAgICAgICAgICooKHVpbnQzMl90Kikoc3JjWzBdICsgeCo0ICsgc3RyaWRlWzBdKnkpKSA9IGIgKyAoZzw8OCkgKyAocjw8MTYpICsgKGE8PDI0KTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICooKHVpbnQxNl90Kikoc3JjWzBdICsgeCoyICsgc3RyaWRlWzBdKnkpKSA9IGI7Ci0gICAgICAgICAgICAgICAgKigodWludDE2X3QqKShzcmNbMV0gKyB4KjIgKyBzdHJpZGVbMV0qeSkpID0gZzsKLSAgICAgICAgICAgICAgICAqKCh1aW50MTZfdCopKHNyY1syXSArIHgqMiArIHN0cmlkZVsyXSp5KSkgPSByOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRlY29kZV9zbGljZV9oZWFkZXIoRkZWMUNvbnRleHQgKmYsIEZGVjFDb250ZXh0ICpmcykKQEAgLTQ1MCwxMCArMzM1LDE3IEBACiAgICAgfSBlbHNlIGlmIChmLT5jb2xvcnNwYWNlID09IDApIHsKICAgICAgICAgIGRlY29kZV9wbGFuZShmcywgcC0+ZGF0YVswXSArIHBzKnggKyB5KnAtPmxpbmVzaXplWzBdICAgICwgd2lkdGgsIGhlaWdodCwgcC0+bGluZXNpemVbMF0sIDAsIDIpOwogICAgICAgICAgZGVjb2RlX3BsYW5lKGZzLCBwLT5kYXRhWzBdICsgcHMqeCArIHkqcC0+bGluZXNpemVbMF0gKyAxLCB3aWR0aCwgaGVpZ2h0LCBwLT5saW5lc2l6ZVswXSwgMSwgMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCAqcGxhbmVzWzNdID0geyBwLT5kYXRhWzBdICsgcHMgKiB4ICsgeSAqIHAtPmxpbmVzaXplWzBdLAorICAgIH0gZWxzZSBpZiAoZi0+dXNlMzJiaXQpIHsKKyAgICAgICAgdWludDhfdCAqcGxhbmVzWzRdID0geyBwLT5kYXRhWzBdICsgcHMgKiB4ICsgeSAqIHAtPmxpbmVzaXplWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMV0gKyBwcyAqIHggKyB5ICogcC0+bGluZXNpemVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVsyXSArIHBzICogeCArIHkgKiBwLT5saW5lc2l6ZVsyXSB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMl0gKyBwcyAqIHggKyB5ICogcC0+bGluZXNpemVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVszXSArIHBzICogeCArIHkgKiBwLT5saW5lc2l6ZVszXSB9OworICAgICAgICBkZWNvZGVfcmdiX2ZyYW1lMzIoZnMsIHBsYW5lcywgd2lkdGgsIGhlaWdodCwgcC0+bGluZXNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ4X3QgKnBsYW5lc1s0XSA9IHsgcC0+ZGF0YVswXSArIHBzICogeCArIHkgKiBwLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzFdICsgcHMgKiB4ICsgeSAqIHAtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMl0gKyBwcyAqIHggKyB5ICogcC0+bGluZXNpemVbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVszXSArIHBzICogeCArIHkgKiBwLT5saW5lc2l6ZVszXSB9OwogICAgICAgICBkZWNvZGVfcmdiX2ZyYW1lKGZzLCBwbGFuZXMsIHdpZHRoLCBoZWlnaHQsIHAtPmxpbmVzaXplKTsKICAgICB9CiAgICAgaWYgKGZzLT5hYyAhPSBBQ19HT0xPTUJfUklDRSAmJiBmLT52ZXJzaW9uID4gMikgewpAQCAtNDgyLDcgKzM3NCw3IEBACiAgICAgbWVtc2V0KHN0YXRlLCAxMjgsIHNpemVvZihzdGF0ZSkpOwogCiAgICAgZm9yICh2ID0gMDsgaSA8IDEyODsgdisrKSB7Ci0gICAgICAgIHVuc2lnbmVkIGxlbiA9IGdldF9zeW1ib2woYywgc3RhdGUsIDApICsgMTsKKyAgICAgICAgdW5zaWduZWQgbGVuID0gZ2V0X3N5bWJvbChjLCBzdGF0ZSwgMCkgKyAxVTsKIAogICAgICAgICBpZiAobGVuID4gMTI4IC0gaSB8fCAhbGVuKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC02OTksOCArNTkxLDIyIEBACiAgICAgICAgIGlmICghZi0+dHJhbnNwYXJlbmN5ICYmICFmLT5jaHJvbWFfcGxhbmVzKSB7CiAgICAgICAgICAgICBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gOCkKICAgICAgICAgICAgICAgICBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7Ci0gICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSA5KSB7CisgICAgICAgICAgICAgICAgZi0+cGFja2VkX2F0X2xzYiA9IDE7CisgICAgICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk5OworICAgICAgICAgICAgfSBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMCkgeworICAgICAgICAgICAgICAgIGYtPnBhY2tlZF9hdF9sc2IgPSAxOworICAgICAgICAgICAgICAgIGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDEyKSB7CisgICAgICAgICAgICAgICAgZi0+cGFja2VkX2F0X2xzYiA9IDE7CisgICAgICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBmLT5wYWNrZWRfYXRfbHNiID0gMTsKICAgICAgICAgICAgICAgICBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTE2OworICAgICAgICAgICAgfSBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA8IDE2KSB7CisgICAgICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxNjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgICAgIH0gZWxzZSBpZiAoZi0+dHJhbnNwYXJlbmN5ICYmICFmLT5jaHJvbWFfcGxhbmVzKSB7CiAgICAgICAgICAgICBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gOCkKICAgICAgICAgICAgICAgICBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWUE4OwpAQCAtNzM5LDYgKzY0NSw3IEBACiAgICAgICAgICAgICBmLT5wYWNrZWRfYXRfbHNiID0gMTsKICAgICAgICAgICAgIHN3aXRjaCgxNiAqIGYtPmNocm9tYV9oX3NoaWZ0ICsgZi0+Y2hyb21hX3Zfc2hpZnQpIHsKICAgICAgICAgICAgIGNhc2UgMHgwMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDE6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDBQMTA7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSAweDEwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDEwOyBicmVhazsKICAgICAgICAgICAgIGNhc2UgMHgxMTogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMDsgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC03NDksMTMgKzY1NiwzMCBAQAogICAgICAgICAgICAgY2FzZSAweDEwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMlAxMDsgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDB4MTE6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIwUDEwOyBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMiAmJiAhZi0+dHJhbnNwYXJlbmN5KSB7CisgICAgICAgICAgICBmLT5wYWNrZWRfYXRfbHNiID0gMTsKKyAgICAgICAgICAgIHN3aXRjaCgxNiAqIGYtPmNocm9tYV9oX3NoaWZ0ICsgZi0+Y2hyb21hX3Zfc2hpZnQpIHsKKyAgICAgICAgICAgIGNhc2UgMHgwMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MDE6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDBQMTI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDEyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMTogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMjsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTQgJiYgIWYtPnRyYW5zcGFyZW5jeSkgeworICAgICAgICAgICAgZi0+cGFja2VkX2F0X2xzYiA9IDE7CisgICAgICAgICAgICBzd2l0Y2goMTYgKiBmLT5jaHJvbWFfaF9zaGlmdCArIGYtPmNocm9tYV92X3NoaWZ0KSB7CisgICAgICAgICAgICBjYXNlIDB4MDA6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDEwOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDE0OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgxMTogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxNDsgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTYgJiYgIWYtPnRyYW5zcGFyZW5jeSl7CisgICAgICAgICAgICBmLT5wYWNrZWRfYXRfbHNiID0gMTsKICAgICAgICAgICAgIHN3aXRjaCgxNiAqIGYtPmNocm9tYV9oX3NoaWZ0ICsgZi0+Y2hyb21hX3Zfc2hpZnQpIHsKICAgICAgICAgICAgIGNhc2UgMHgwMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjsgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIDB4MTA6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTY7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSAweDExOiBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDE2OyBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxNiAmJiBmLT50cmFuc3BhcmVuY3kpeworICAgICAgICAgICAgZi0+cGFja2VkX2F0X2xzYiA9IDE7CiAgICAgICAgICAgICBzd2l0Y2goMTYgKiBmLT5jaHJvbWFfaF9zaGlmdCArIGYtPmNocm9tYV92X3NoaWZ0KSB7CiAgICAgICAgICAgICBjYXNlIDB4MDA6IGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2OyBicmVhazsKICAgICAgICAgICAgIGNhc2UgMHgxMDogZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQMTY7IGJyZWFrOwpAQCAtNzY4LDE3ICs2OTIsMzAgQEAKICAgICAgICAgICAgICAgICAgICAiY2hyb21hIHN1YnNhbXBsaW5nIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBjb2xvcnNwYWNlXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCAgICAgZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gIDkpCisgICAgICAgIGlmICggICAgIGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlIDw9ICA4ICYmICFmLT50cmFuc3BhcmVuY3kpCisgICAgICAgICAgICBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfMFJHQjMyOworICAgICAgICBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSAgOCAmJiBmLT50cmFuc3BhcmVuY3kpCisgICAgICAgICAgICBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7CisgICAgICAgIGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09ICA5ICYmICFmLT50cmFuc3BhcmVuY3kpCiAgICAgICAgICAgICBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDk7Ci0gICAgICAgIGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDEwKQorICAgICAgICBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMCAmJiAhZi0+dHJhbnNwYXJlbmN5KQogICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMDsKLSAgICAgICAgZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTIpCisgICAgICAgIGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDEwICYmIGYtPnRyYW5zcGFyZW5jeSkKKyAgICAgICAgICAgIGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJBUDEwOworICAgICAgICBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMiAmJiAhZi0+dHJhbnNwYXJlbmN5KQogICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMjsKLSAgICAgICAgZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTQpCisgICAgICAgIGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDEyICYmIGYtPnRyYW5zcGFyZW5jeSkKKyAgICAgICAgICAgIGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJBUDEyOworICAgICAgICBlbHNlIGlmIChmLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxNCAmJiAhZi0+dHJhbnNwYXJlbmN5KQogICAgICAgICAgICAgZi0+YXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxNDsKLSAgICAgICAgZWxzZQotICAgICAgICBpZiAoZi0+dHJhbnNwYXJlbmN5KSBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgIGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF8wUkdCMzI7CisgICAgICAgIGVsc2UgaWYgKGYtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDE2ICYmICFmLT50cmFuc3BhcmVuY3kpIHsKKyAgICAgICAgICAgIGYtPmF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTY7CisgICAgICAgICAgICBmLT51c2UzMmJpdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZi0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTYgJiYgZi0+dHJhbnNwYXJlbmN5KSB7CisgICAgICAgICAgICBmLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSQVAxNjsKKyAgICAgICAgICAgIGYtPnVzZTMyYml0ID0gMTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2X2xvZyhmLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY29sb3JzcGFjZSBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKQEAgLTgwMiw3ICs3MzksNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBjLT5ieXRlc3RyZWFtX2VuZDsKICAgICAgICAgZm9yIChmLT5zbGljZV9jb3VudCA9IDA7Ci0gICAgICAgICAgICAgZi0+c2xpY2VfY291bnQgPCBNQVhfU0xJQ0VTICYmIDMgPCBwIC0gYy0+Ynl0ZXN0cmVhbV9zdGFydDsKKyAgICAgICAgICAgICBmLT5zbGljZV9jb3VudCA8IE1BWF9TTElDRVMgJiYgMyArIDUqISFmLT5lYyA8IHAgLSBjLT5ieXRlc3RyZWFtX3N0YXJ0OwogICAgICAgICAgICAgIGYtPnNsaWNlX2NvdW50KyspIHsKICAgICAgICAgICAgIGludCB0cmFpbGVyID0gMyArIDUqISFmLT5lYzsKICAgICAgICAgICAgIGludCBzaXplID0gQVZfUkIyNChwLXRyYWlsZXIpOwpAQCAtODgwLDcgKzgxNyw3IEBACiAgICAgaWYgKChyZXQgPSBmZl9mZnYxX2NvbW1vbl9pbml0KGF2Y3R4KSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEgJiYgKHJldCA9IHJlYWRfZXh0cmFfaGVhZGVyKGYpKSA8IDApCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYgKHJldCA9IHJlYWRfZXh0cmFfaGVhZGVyKGYpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBpZiAoKHJldCA9IGZmX2ZmdjFfaW5pdF9zbGljZV9jb250ZXh0cyhmKSkgPCAwKQpAQCAtOTc0LDcgKzkxMSw3IEBACiAgICAgICAgICAgICAgICAgZnMtPnNsaWNlX2RhbWFnZWQgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAic2xpY2UgJWQsIENSQzogMHglMDhYXG4iLCBpLCBBVl9SQjMyKGJ1Zl9wICsgdiAtIDQpKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNsaWNlICVkLCBDUkM6IDB4JTA4IlBSSVgzMiJcbiIsIGksIEFWX1JCMzIoYnVmX3AgKyB2IC0gNCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTEwMDIsNyArOTM5LDcgQEAKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1s0XTsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFs0XTsKICAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmZi0+bGFzdF9waWN0dXJlLCBJTlRfTUFYLCAwKTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZXNjLT5uYl9jb21wb25lbnRzOyBqKyspIHsKICAgICAgICAgICAgICAgICBpbnQgcGl4c2hpZnQgPSBkZXNjLT5jb21wW2pdLmRlcHRoID4gODsKICAgICAgICAgICAgICAgICBpbnQgc2ggPSAoaiA9PSAxIHx8IGogPT0gMikgPyBmLT5jaHJvbWFfaF9zaGlmdCA6IDA7CiAgICAgICAgICAgICAgICAgaW50IHN2ID0gKGogPT0gMSB8fCBqID09IDIpID8gZi0+Y2hyb21hX3Zfc2hpZnQgOiAwOwpAQCAtMTAxMCw2ICs5NDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAoZnMtPnNsaWNlX3kgPj4gc3YpICsgKChmcy0+c2xpY2VfeCA+PiBzaCkgPDwgcGl4c2hpZnQpOwogICAgICAgICAgICAgICAgIHNyY1tqXSA9IGYtPmxhc3RfcGljdHVyZS5mLT5kYXRhW2pdICsgZi0+bGFzdF9waWN0dXJlLmYtPmxpbmVzaXplW2pdICoKICAgICAgICAgICAgICAgICAgICAgICAgICAoZnMtPnNsaWNlX3kgPj4gc3YpICsgKChmcy0+c2xpY2VfeCA+PiBzaCkgPDwgcGl4c2hpZnQpOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8CisgICAgICAgICAgICAgICAgZGVzYy0+ZmxhZ3MgJiBGRl9QU0VVRE9QQUwpIHsKKyAgICAgICAgICAgICAgICBkc3RbMV0gPSBwLT5kYXRhWzFdOworICAgICAgICAgICAgICAgIHNyY1sxXSA9IGYtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzFdOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZfaW1hZ2VfY29weShkc3QsIHAtPmxpbmVzaXplLCBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmxhc3RfcGljdHVyZS5mLT5saW5lc2l6ZSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZmZ2MWRlY190ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9mZnYxZGVjX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhNDJhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZmZ2MWRlY190ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogRkZWMSBkZWNvZGVyIHRlbXBsYXRlCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTYgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IFJFTkFNRShkZWNvZGVfbGluZSkoRkZWMUNvbnRleHQgKnMsIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEUgKnNhbXBsZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmVfaW5kZXgsIGludCBiaXRzKQoreworICAgIFBsYW5lQ29udGV4dCAqY29uc3QgcCA9ICZzLT5wbGFuZVtwbGFuZV9pbmRleF07CisgICAgUmFuZ2VDb2RlciAqY29uc3QgYyAgID0gJnMtPmM7CisgICAgaW50IHg7CisgICAgaW50IHJ1bl9jb3VudCA9IDA7CisgICAgaW50IHJ1bl9tb2RlICA9IDA7CisgICAgaW50IHJ1bl9pbmRleCA9IHMtPnJ1bl9pbmRleDsKKworICAgIGlmIChpc19pbnB1dF9lbmQocykpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKHMtPnNsaWNlX2NvZGluZ19tb2RlID09IDEpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCB2ID0gMDsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPGJpdHM7IGkrKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RhdGUgPSAxMjg7CisgICAgICAgICAgICAgICAgdiArPSB2ICsgZ2V0X3JhYyhjLCAmc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FtcGxlWzFdW3hdID0gdjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGludCBkaWZmLCBjb250ZXh0LCBzaWduOworCisgICAgICAgIGNvbnRleHQgPSBSRU5BTUUoZ2V0X2NvbnRleHQpKHAsIHNhbXBsZVsxXSArIHgsIHNhbXBsZVswXSArIHgsIHNhbXBsZVsxXSArIHgpOworICAgICAgICBpZiAoY29udGV4dCA8IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSAtY29udGV4dDsKKyAgICAgICAgICAgIHNpZ24gICAgPSAxOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIHNpZ24gPSAwOworCisgICAgICAgIGF2X2Fzc2VydDIoY29udGV4dCA8IHAtPmNvbnRleHRfY291bnQpOworCisgICAgICAgIGlmIChzLT5hYyAhPSBBQ19HT0xPTUJfUklDRSkgeworICAgICAgICAgICAgZGlmZiA9IGdldF9zeW1ib2xfaW5saW5lKGMsIHAtPnN0YXRlW2NvbnRleHRdLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ID09IDAgJiYgcnVuX21vZGUgPT0gMCkKKyAgICAgICAgICAgICAgICBydW5fbW9kZSA9IDE7CisKKyAgICAgICAgICAgIGlmIChydW5fbW9kZSkgeworICAgICAgICAgICAgICAgIGlmIChydW5fY291bnQgPT0gMCAmJiBydW5fbW9kZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50ID0gMSA8PCBmZl9sb2cyX3J1bltydW5faW5kZXhdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggKyBydW5fY291bnQgPD0gdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5faW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZl9sb2cyX3J1bltydW5faW5kZXhdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCA9IGdldF9iaXRzKCZzLT5nYiwgZmZfbG9nMl9ydW5bcnVuX2luZGV4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydW5faW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2luZGV4LS07CisgICAgICAgICAgICAgICAgICAgICAgICBydW5fbW9kZSA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcnVuX2NvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKHJ1bl9jb3VudCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcnVuX21vZGUgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZGlmZiAgICAgID0gZ2V0X3ZsY19zeW1ib2woJnMtPmdiLCAmcC0+dmxjX3N0YXRlW2NvbnRleHRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZGlmZiA9IDA7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBkaWZmID0gZ2V0X3ZsY19zeW1ib2woJnMtPmdiLCAmcC0+dmxjX3N0YXRlW2NvbnRleHRdLCBiaXRzKTsKKworICAgICAgICAgICAgZmZfZGxvZyhzLT5hdmN0eCwgImNvdW50OiVkIGluZGV4OiVkLCBtb2RlOiVkLCB4OiVkIHBvczolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50LCBydW5faW5kZXgsIHJ1bl9tb2RlLCB4LCBnZXRfYml0c19jb3VudCgmcy0+Z2IpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaWduKQorICAgICAgICAgICAgZGlmZiA9IC0odW5zaWduZWQpZGlmZjsKKworICAgICAgICBzYW1wbGVbMV1beF0gPSBhdl9tb2RfdWludHAyKFJFTkFNRShwcmVkaWN0KShzYW1wbGVbMV0gKyB4LCBzYW1wbGVbMF0gKyB4KSArIChTVUlOVClkaWZmLCBiaXRzKTsKKyAgICB9CisgICAgcy0+cnVuX2luZGV4ID0gcnVuX2luZGV4OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBSRU5BTUUoZGVjb2RlX3JnYl9mcmFtZSkoRkZWMUNvbnRleHQgKnMsIHVpbnQ4X3QgKnNyY1s0XSwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlWzRdKQoreworICAgIGludCB4LCB5LCBwOworICAgIFRZUEUgKnNhbXBsZVs0XVsyXTsKKyAgICBpbnQgbGJkICAgID0gcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPD0gODsKKyAgICBpbnQgYml0cyAgID0gcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPiAwID8gcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgOiA4OworICAgIGludCBvZmZzZXQgPSAxIDw8IGJpdHM7CisgICAgaW50IHRyYW5zcGFyZW5jeSA9IHMtPnRyYW5zcGFyZW5jeTsKKworICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKKyAgICAgICAgc2FtcGxlW3hdWzBdID0gUkVOQU1FKHMtPnNhbXBsZV9idWZmZXIpICsgIHggKiAyICAgICAgKiAodyArIDYpICsgMzsKKyAgICAgICAgc2FtcGxlW3hdWzFdID0gUkVOQU1FKHMtPnNhbXBsZV9idWZmZXIpICsgKHggKiAyICsgMSkgKiAodyArIDYpICsgMzsKKyAgICB9CisKKyAgICBzLT5ydW5faW5kZXggPSAwOworCisgICAgbWVtc2V0KFJFTkFNRShzLT5zYW1wbGVfYnVmZmVyKSwgMCwgOCAqICh3ICsgNikgKiBzaXplb2YoKlJFTkFNRShzLT5zYW1wbGVfYnVmZmVyKSkpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgMyArIHRyYW5zcGFyZW5jeTsgcCsrKSB7CisgICAgICAgICAgICBUWVBFICp0ZW1wID0gc2FtcGxlW3BdWzBdOyAvLyBGSVhNRTogdHJ5IGEgbm9ybWFsIGJ1ZmZlcgorCisgICAgICAgICAgICBzYW1wbGVbcF1bMF0gPSBzYW1wbGVbcF1bMV07CisgICAgICAgICAgICBzYW1wbGVbcF1bMV0gPSB0ZW1wOworCisgICAgICAgICAgICBzYW1wbGVbcF1bMV1bLTFdPSBzYW1wbGVbcF1bMF1bMCAgXTsKKyAgICAgICAgICAgIHNhbXBsZVtwXVswXVsgd109IHNhbXBsZVtwXVswXVt3LTFdOworICAgICAgICAgICAgaWYgKGxiZCAmJiBzLT5zbGljZV9jb2RpbmdfbW9kZSA9PSAwKQorICAgICAgICAgICAgICAgIFJFTkFNRShkZWNvZGVfbGluZSkocywgdywgc2FtcGxlW3BdLCAocCArIDEpLzIsIDkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFJFTkFNRShkZWNvZGVfbGluZSkocywgdywgc2FtcGxlW3BdLCAocCArIDEpLzIsIGJpdHMgKyAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBnID0gc2FtcGxlWzBdWzFdW3hdOworICAgICAgICAgICAgaW50IGIgPSBzYW1wbGVbMV1bMV1beF07CisgICAgICAgICAgICBpbnQgciA9IHNhbXBsZVsyXVsxXVt4XTsKKyAgICAgICAgICAgIGludCBhID0gc2FtcGxlWzNdWzFdW3hdOworCisgICAgICAgICAgICBpZiAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkgeworICAgICAgICAgICAgICAgIGIgLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIHIgLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIGcgLT0gKGIgKiBzLT5zbGljZV9yY3RfYnlfY29lZiArIHIgKiBzLT5zbGljZV9yY3RfcnlfY29lZikgPj4gMjsKKyAgICAgICAgICAgICAgICBiICs9IGc7CisgICAgICAgICAgICAgICAgciArPSBnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGJkKQorICAgICAgICAgICAgICAgICooKHVpbnQzMl90Kikoc3JjWzBdICsgeCo0ICsgc3RyaWRlWzBdKnkpKSA9IGIgKyAoKHVuc2lnbmVkKWc8PDgpICsgKCh1bnNpZ25lZClyPDwxNikgKyAoKHVuc2lnbmVkKWE8PDI0KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNpemVvZihUWVBFKSA9PSA0IHx8IHRyYW5zcGFyZW5jeSkgeworICAgICAgICAgICAgICAgICooKHVpbnQxNl90Kikoc3JjWzBdICsgeCoyICsgc3RyaWRlWzBdKnkpKSA9IGc7CisgICAgICAgICAgICAgICAgKigodWludDE2X3QqKShzcmNbMV0gKyB4KjIgKyBzdHJpZGVbMV0qeSkpID0gYjsKKyAgICAgICAgICAgICAgICAqKCh1aW50MTZfdCopKHNyY1syXSArIHgqMiArIHN0cmlkZVsyXSp5KSkgPSByOworICAgICAgICAgICAgICAgIGlmICh0cmFuc3BhcmVuY3kpCisgICAgICAgICAgICAgICAgICAgICooKHVpbnQxNl90Kikoc3JjWzNdICsgeCoyICsgc3RyaWRlWzNdKnkpKSA9IGE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICooKHVpbnQxNl90Kikoc3JjWzBdICsgeCoyICsgc3RyaWRlWzBdKnkpKSA9IGI7CisgICAgICAgICAgICAgICAgKigodWludDE2X3QqKShzcmNbMV0gKyB4KjIgKyBzdHJpZGVbMV0qeSkpID0gZzsKKyAgICAgICAgICAgICAgICAqKCh1aW50MTZfdCopKHNyY1syXSArIHgqMiArIHN0cmlkZVsyXSp5KSkgPSByOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mZnYxZW5jLmMgYi9saWJhdmNvZGVjL2ZmdjFlbmMuYwppbmRleCA5ZWU5OTIxLi4yM2U4ZDNkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZmdjFlbmMuYworKysgYi9saWJhdmNvZGVjL2ZmdjFlbmMuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVyLmgiCisKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJwdXRfYml0cy5oIgpAQCAtMjUxLDE0ICsyNTIsNyBAQAogCiAgICAgYXZfYXNzZXJ0MihrIDw9IDEzKTsKIAotI2lmIDAgLy8gSlBFRyBMUwotICAgIGlmIChrID09IDAgJiYgMiAqIHN0YXRlLT5kcmlmdCA8PSAtc3RhdGUtPmNvdW50KQotICAgICAgICBjb2RlID0gdiBeICgtMSk7Ci0gICAgZWxzZQotICAgICAgICBjb2RlID0gdjsKLSNlbHNlCiAgICAgY29kZSA9IHYgXiAoKDIgKiBzdGF0ZS0+ZHJpZnQgKyBzdGF0ZS0+Y291bnQpID4+IDMxKTsKLSNlbmRpZgogCiAgICAgZmZfZGxvZyhOVUxMLCAidjolZC8lZCBiaWFzOiVkIGVycm9yOiVkIGRyaWZ0OiVkIGNvdW50OiVkIGs6JWRcbiIsIHYsIGNvZGUsCiAgICAgICAgICAgICBzdGF0ZS0+Ymlhcywgc3RhdGUtPmVycm9yX3N1bSwgc3RhdGUtPmRyaWZ0LCBzdGF0ZS0+Y291bnQsIGspOwpAQCAtMjY3LDEwNyArMjYxLDE1IEBACiAgICAgdXBkYXRlX3ZsY19zdGF0ZShzdGF0ZSwgdik7CiB9CiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBlbmNvZGVfbGluZShGRlYxQ29udGV4dCAqcywgaW50IHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc2FtcGxlWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGFuZV9pbmRleCwgaW50IGJpdHMpCi17Ci0gICAgUGxhbmVDb250ZXh0ICpjb25zdCBwID0gJnMtPnBsYW5lW3BsYW5lX2luZGV4XTsKLSAgICBSYW5nZUNvZGVyICpjb25zdCBjICAgPSAmcy0+YzsKLSAgICBpbnQgeDsKLSAgICBpbnQgcnVuX2luZGV4ID0gcy0+cnVuX2luZGV4OwotICAgIGludCBydW5fY291bnQgPSAwOwotICAgIGludCBydW5fbW9kZSAgPSAwOworI2RlZmluZSBUWVBFIGludDE2X3QKKyNkZWZpbmUgUkVOQU1FKG5hbWUpIG5hbWUKKyNpbmNsdWRlICJmZnYxZW5jX3RlbXBsYXRlLmMiCisjdW5kZWYgVFlQRQorI3VuZGVmIFJFTkFNRQogCi0gICAgaWYgKHMtPmFjICE9IEFDX0dPTE9NQl9SSUNFKSB7Ci0gICAgICAgIGlmIChjLT5ieXRlc3RyZWFtX2VuZCAtIGMtPmJ5dGVzdHJlYW0gPCB3ICogMzUpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RlZCBmcmFtZSB0b28gbGFyZ2VcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAocy0+cGIuYnVmX2VuZCAtIHMtPnBiLmJ1ZiAtIChwdXRfYml0c19jb3VudCgmcy0+cGIpID4+IDMpIDwgdyAqIDQpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RlZCBmcmFtZSB0b28gbGFyZ2VcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocy0+c2xpY2VfY29kaW5nX21vZGUgPT0gMSkgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGludCB2ID0gc2FtcGxlWzBdW3hdOwotICAgICAgICAgICAgZm9yIChpID0gYml0cy0xOyBpPj0wOyBpLS0pIHsKLSAgICAgICAgICAgICAgICB1aW50OF90IHN0YXRlID0gMTI4OwotICAgICAgICAgICAgICAgIHB1dF9yYWMoYywgJnN0YXRlLCAodj4+aSkgJiAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgIGludCBkaWZmLCBjb250ZXh0OwotCi0gICAgICAgIGNvbnRleHQgPSBnZXRfY29udGV4dChwLCBzYW1wbGVbMF0gKyB4LCBzYW1wbGVbMV0gKyB4LCBzYW1wbGVbMl0gKyB4KTsKLSAgICAgICAgZGlmZiAgICA9IHNhbXBsZVswXVt4XSAtIHByZWRpY3Qoc2FtcGxlWzBdICsgeCwgc2FtcGxlWzFdICsgeCk7Ci0KLSAgICAgICAgaWYgKGNvbnRleHQgPCAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gLWNvbnRleHQ7Ci0gICAgICAgICAgICBkaWZmICAgID0gLWRpZmY7Ci0gICAgICAgIH0KLQotICAgICAgICBkaWZmID0gZm9sZChkaWZmLCBiaXRzKTsKLQotICAgICAgICBpZiAocy0+YWMgIT0gQUNfR09MT01CX1JJQ0UpIHsKLSAgICAgICAgICAgIGlmIChzLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzEpIHsKLSAgICAgICAgICAgICAgICBwdXRfc3ltYm9sX2lubGluZShjLCBwLT5zdGF0ZVtjb250ZXh0XSwgZGlmZiwgMSwgcy0+cmNfc3RhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yY19zdGF0MltwLT5xdWFudF90YWJsZV9pbmRleF1bY29udGV4dF0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwdXRfc3ltYm9sX2lubGluZShjLCBwLT5zdGF0ZVtjb250ZXh0XSwgZGlmZiwgMSwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCA9PSAwKQotICAgICAgICAgICAgICAgIHJ1bl9tb2RlID0gMTsKLQotICAgICAgICAgICAgaWYgKHJ1bl9tb2RlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZmYpIHsKLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHJ1bl9jb3VudCA+PSAxIDw8IGZmX2xvZzJfcnVuW3J1bl9pbmRleF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCAtPSAxIDw8IGZmX2xvZzJfcnVuW3J1bl9pbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5faW5kZXgrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEgKyBmZl9sb2cyX3J1bltydW5faW5kZXhdLCBydW5fY291bnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAocnVuX2luZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2luZGV4LS07Ci0gICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJ1bl9tb2RlICA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkaWZmID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYtLTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBydW5fY291bnQrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZmX2Rsb2cocy0+YXZjdHgsICJjb3VudDolZCBpbmRleDolZCwgbW9kZTolZCwgeDolZCBwb3M6JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCwgcnVuX2luZGV4LCBydW5fbW9kZSwgeCwKLSAgICAgICAgICAgICAgICAgICAgKGludClwdXRfYml0c19jb3VudCgmcy0+cGIpKTsKLQotICAgICAgICAgICAgaWYgKHJ1bl9tb2RlID09IDApCi0gICAgICAgICAgICAgICAgcHV0X3ZsY19zeW1ib2woJnMtPnBiLCAmcC0+dmxjX3N0YXRlW2NvbnRleHRdLCBkaWZmLCBiaXRzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocnVuX21vZGUpIHsKLSAgICAgICAgd2hpbGUgKHJ1bl9jb3VudCA+PSAxIDw8IGZmX2xvZzJfcnVuW3J1bl9pbmRleF0pIHsKLSAgICAgICAgICAgIHJ1bl9jb3VudCAtPSAxIDw8IGZmX2xvZzJfcnVuW3J1bl9pbmRleF07Ci0gICAgICAgICAgICBydW5faW5kZXgrKzsKLSAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocnVuX2NvdW50KQotICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKLSAgICB9Ci0gICAgcy0+cnVuX2luZGV4ID0gcnVuX2luZGV4OwotCi0gICAgcmV0dXJuIDA7Ci19CisjZGVmaW5lIFRZUEUgaW50MzJfdAorI2RlZmluZSBSRU5BTUUobmFtZSkgbmFtZSAjIyAzMgorI2luY2x1ZGUgImZmdjFlbmNfdGVtcGxhdGUuYyIKIAogc3RhdGljIGludCBlbmNvZGVfcGxhbmUoRkZWMUNvbnRleHQgKnMsIHVpbnQ4X3QgKnNyYywgaW50IHcsIGludCBoLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBwbGFuZV9pbmRleCwgaW50IHBpeGVsX3N0cmlkZSkKQEAgLTQwOSw2OCArMzExLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfcmdiX2ZyYW1lKEZGVjFDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpzcmNbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgY29uc3QgaW50IHN0cmlkZVszXSkKLXsKLSAgICBpbnQgeCwgeSwgcCwgaTsKLSAgICBjb25zdCBpbnQgcmluZ19zaXplID0gcy0+Y29udGV4dF9tb2RlbCA/IDMgOiAyOwotICAgIGludDE2X3QgKnNhbXBsZVs0XVszXTsKLSAgICBpbnQgbGJkICAgID0gcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSA4OwotICAgIGludCBiaXRzICAgPSBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID4gMCA/IHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgOiA4OwotICAgIGludCBvZmZzZXQgPSAxIDw8IGJpdHM7Ci0KLSAgICBzLT5ydW5faW5kZXggPSAwOwotCi0gICAgbWVtc2V0KHMtPnNhbXBsZV9idWZmZXIsIDAsIHJpbmdfc2l6ZSAqIE1BWF9QTEFORVMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDYpICogc2l6ZW9mKCpzLT5zYW1wbGVfYnVmZmVyKSk7Ci0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCByaW5nX3NpemU7IGkrKykKLSAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBNQVhfUExBTkVTOyBwKyspCi0gICAgICAgICAgICAgICAgc2FtcGxlW3BdW2ldPSBzLT5zYW1wbGVfYnVmZmVyICsgcCpyaW5nX3NpemUqKHcrNikgKyAoKGgraS15KSVyaW5nX3NpemUpKih3KzYpICsgMzsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgICAgICBpbnQgYiwgZywgciwgYXZfdW5pbml0KGEpOwotICAgICAgICAgICAgaWYgKGxiZCkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHYgPSAqKChjb25zdCB1aW50MzJfdCopKHNyY1swXSArIHgqNCArIHN0cmlkZVswXSp5KSk7Ci0gICAgICAgICAgICAgICAgYiA9ICB2ICAgICAgICAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgZyA9ICh2ID4+ICA4KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgciA9ICh2ID4+IDE2KSAmIDB4RkY7Ci0gICAgICAgICAgICAgICAgYSA9ICB2ID4+IDI0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiID0gKigoY29uc3QgdWludDE2X3QgKikoc3JjWzBdICsgeCoyICsgc3RyaWRlWzBdKnkpKTsKLSAgICAgICAgICAgICAgICBnID0gKigoY29uc3QgdWludDE2X3QgKikoc3JjWzFdICsgeCoyICsgc3RyaWRlWzFdKnkpKTsKLSAgICAgICAgICAgICAgICByID0gKigoY29uc3QgdWludDE2X3QgKikoc3JjWzJdICsgeCoyICsgc3RyaWRlWzJdKnkpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHMtPnNsaWNlX2NvZGluZ19tb2RlICE9IDEpIHsKLSAgICAgICAgICAgICAgICBiIC09IGc7Ci0gICAgICAgICAgICAgICAgciAtPSBnOwotICAgICAgICAgICAgICAgIGcgKz0gKGIgKiBzLT5zbGljZV9yY3RfYnlfY29lZiArIHIgKiBzLT5zbGljZV9yY3RfcnlfY29lZikgPj4gMjsKLSAgICAgICAgICAgICAgICBiICs9IG9mZnNldDsKLSAgICAgICAgICAgICAgICByICs9IG9mZnNldDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2FtcGxlWzBdWzBdW3hdID0gZzsKLSAgICAgICAgICAgIHNhbXBsZVsxXVswXVt4XSA9IGI7Ci0gICAgICAgICAgICBzYW1wbGVbMl1bMF1beF0gPSByOwotICAgICAgICAgICAgc2FtcGxlWzNdWzBdW3hdID0gYTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHAgPSAwOyBwIDwgMyArIHMtPnRyYW5zcGFyZW5jeTsgcCsrKSB7Ci0gICAgICAgICAgICBpbnQgcmV0OwotICAgICAgICAgICAgc2FtcGxlW3BdWzBdWy0xXSA9IHNhbXBsZVtwXVsxXVswICBdOwotICAgICAgICAgICAgc2FtcGxlW3BdWzFdWyB3XSA9IHNhbXBsZVtwXVsxXVt3LTFdOwotICAgICAgICAgICAgaWYgKGxiZCAmJiBzLT5zbGljZV9jb2RpbmdfbW9kZSA9PSAwKQotICAgICAgICAgICAgICAgIHJldCA9IGVuY29kZV9saW5lKHMsIHcsIHNhbXBsZVtwXSwgKHAgKyAxKSAvIDIsIDkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHJldCA9IGVuY29kZV9saW5lKHMsIHcsIHNhbXBsZVtwXSwgKHAgKyAxKSAvIDIsIGJpdHMgKyAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgd3JpdGVfcXVhbnRfdGFibGUoUmFuZ2VDb2RlciAqYywgaW50MTZfdCAqcXVhbnRfdGFibGUpCiB7CiAgICAgaW50IGxhc3QgPSAwOwpAQCAtNjk5LDYgKzUzOSwxMCBAQAogICAgICAgICBzLT5lYyA9IChzLT52ZXJzaW9uID49IDMpOwogICAgIH0KIAorICAgIC8vIENSQyByZXF1aXJlcyB2ZXJzaW9uIDMrCisgICAgaWYgKHMtPmVjKQorICAgICAgICBzLT52ZXJzaW9uID0gRkZNQVgocy0+dmVyc2lvbiwgMyk7CisKICAgICBpZiAoKHMtPnZlcnNpb24gPT0gMiB8fCBzLT52ZXJzaW9uPjMpICYmIGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZlcnNpb24gMiBuZWVkZWQgZm9yIHJlcXVlc3RlZCBmZWF0dXJlcyBidXQgdmVyc2lvbiAyIGlzIGV4cGVyaW1lbnRhbCBhbmQgbm90IGVuYWJsZWRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTcxOCw2ICs1NjIsNyBAQAogCiAgICAgcy0+cGxhbmVfY291bnQgPSAzOwogICAgIHN3aXRjaChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZOToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDk6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA5OgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOToKQEAgLTcyNiwxNSArNTcxLDI5IEBACiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOToKICAgICAgICAgaWYgKCFhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSkKICAgICAgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA5OworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTA6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDEwOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTA6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxMDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFAxMDoKLSAgICAgICAgcy0+cGFja2VkX2F0X2xzYiA9IDE7CiAgICAgICAgIGlmICghYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgJiYgIXMtPmJpdHNfcGVyX3Jhd19zYW1wbGUpCiAgICAgICAgICAgICBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTA7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyOgorICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICYmICFzLT5iaXRzX3Blcl9yYXdfc2FtcGxlKQorICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDEyOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE0OgorICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICYmICFzLT5iaXRzX3Blcl9yYXdfc2FtcGxlKQorICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDE0OworICAgICAgICBzLT5wYWNrZWRfYXRfbHNiID0gMTsKICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTY6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNjoKQEAgLTc1MSwxMSArNjEwLDYgQEAKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0c19wZXJfcmF3X3NhbXBsZSBpbnZhbGlkXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzLT5hYyA9PSBBQ19HT0xPTUJfUklDRSkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAiYml0c19wZXJfcmF3X3NhbXBsZSA+IDgsIGZvcmNpbmcgcmFuZ2UgY29kZXJcbiIpOwotICAgICAgICAgICAgcy0+YWMgPSBBQ19SQU5HRV9DVVNUT01fVEFCOwotICAgICAgICB9CiAgICAgICAgIHMtPnZlcnNpb24gPSBGRk1BWChzLT52ZXJzaW9uLCAxKTsKICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lBODoKQEAgLTc4MCwzNyArNjM0LDU1IEBACiAgICAgICAgIHMtPmNvbG9yc3BhY2UgPSAxOwogICAgICAgICBzLT50cmFuc3BhcmVuY3kgPSAxOwogICAgICAgICBzLT5jaHJvbWFfcGxhbmVzID0gMTsKLSAgICAgICAgaWYgKCFhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSkKLSAgICAgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA4OworICAgICAgICBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NDoKKyAgICAgICAgcy0+Y29sb3JzcGFjZSA9IDE7CisgICAgICAgIHMtPnRyYW5zcGFyZW5jeSA9IDE7CisgICAgICAgIHMtPmNocm9tYV9wbGFuZXMgPSAxOworICAgICAgICBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTY7CisgICAgICAgIHMtPnVzZTMyYml0ID0gMTsKKyAgICAgICAgcy0+dmVyc2lvbiA9IEZGTUFYKHMtPnZlcnNpb24sIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNDg6CisgICAgICAgIHMtPmNvbG9yc3BhY2UgPSAxOworICAgICAgICBzLT5jaHJvbWFfcGxhbmVzID0gMTsKKyAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDE2OworICAgICAgICBzLT51c2UzMmJpdCA9IDE7CisgICAgICAgIHMtPnZlcnNpb24gPSBGRk1BWChzLT52ZXJzaW9uLCAxKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9QSVhfRk1UXzBSR0IzMjoKICAgICAgICAgcy0+Y29sb3JzcGFjZSA9IDE7CiAgICAgICAgIHMtPmNocm9tYV9wbGFuZXMgPSAxOwotICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKQotICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDg7CisgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA4OwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDk6CiAgICAgICAgIGlmICghYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpCiAgICAgICAgICAgICBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gOTsKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEwOgogICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICYmICFzLT5iaXRzX3Blcl9yYXdfc2FtcGxlKQogICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDEwOwogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTI6CiAgICAgICAgIGlmICghYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgJiYgIXMtPmJpdHNfcGVyX3Jhd19zYW1wbGUpCiAgICAgICAgICAgICBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMTI7CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNDoKICAgICAgICAgaWYgKCFhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSAmJiAhcy0+Yml0c19wZXJfcmF3X3NhbXBsZSkKICAgICAgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAxNDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDE2OgorICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICYmICFzLT5iaXRzX3Blcl9yYXdfc2FtcGxlKQorICAgICAgICAgICAgcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDE2OwogICAgICAgICBlbHNlIGlmICghcy0+Yml0c19wZXJfcmF3X3NhbXBsZSkKICAgICAgICAgICAgIHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZTsKKyAgICAgICAgcy0+dHJhbnNwYXJlbmN5ID0gZGVzYy0+bmJfY29tcG9uZW50cyA9PSA0IHx8IGRlc2MtPm5iX2NvbXBvbmVudHMgPT0gMjsKICAgICAgICAgcy0+Y29sb3JzcGFjZSA9IDE7CiAgICAgICAgIHMtPmNocm9tYV9wbGFuZXMgPSAxOwotICAgICAgICBzLT52ZXJzaW9uID0gRkZNQVgocy0+dmVyc2lvbiwgMSk7Ci0gICAgICAgIGlmIChzLT5hYyA9PSBBQ19HT0xPTUJfUklDRSkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAiYml0c19wZXJfcmF3X3NhbXBsZSA+IDgsIGZvcmNpbmcgY29kZXIgMVxuIik7Ci0gICAgICAgICAgICBzLT5hYyA9IEFDX1JBTkdFX0NVU1RPTV9UQUI7CisgICAgICAgIGlmIChzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID49IDE2KSB7CisgICAgICAgICAgICBzLT51c2UzMmJpdCA9IDE7CiAgICAgICAgIH0KKyAgICAgICAgcy0+dmVyc2lvbiA9IEZGTUFYKHMtPnZlcnNpb24sIDEpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZvcm1hdCBub3Qgc3VwcG9ydGVkXG4iKTsKQEAgLTgxOCw4ICs2OTAsMTIgQEAKICAgICB9CiAgICAgYXZfYXNzZXJ0MChzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID49IDgpOwogCi0gICAgaWYgKHMtPnRyYW5zcGFyZW5jeSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiU3RvcmluZyBhbHBoYSBwbGFuZSwgdGhpcyB3aWxsIHJlcXVpcmUgYSByZWNlbnQgRkZWMSBkZWNvZGVyIHRvIHBsYXliYWNrIVxuIik7CisgICAgaWYgKHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPiA4KSB7CisgICAgICAgIGlmIChzLT5hYyA9PSBBQ19HT0xPTUJfUklDRSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgImJpdHNfcGVyX3Jhd19zYW1wbGUgPiA4LCBmb3JjaW5nIHJhbmdlIGNvZGVyXG4iKTsKKyAgICAgICAgICAgIHMtPmFjID0gQUNfUkFOR0VfQ1VTVE9NX1RBQjsKKyAgICAgICAgfQogICAgIH0KICNpZiBGRl9BUElfUFJJVkFURV9PUFQKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKQEAgLTg5MSw3ICs3NjcsMTAgQEAKICAgICBpZiAoIXMtPmNocm9tYV9wbGFuZXMgJiYgcy0+dmVyc2lvbiA+IDMpCiAgICAgICAgIHMtPnBsYW5lX2NvdW50LS07CiAKLSAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJnMtPmNocm9tYV9oX3NoaWZ0LCAmcy0+Y2hyb21hX3Zfc2hpZnQpOworICAgIHJldCA9IGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlIChhdmN0eC0+cGl4X2ZtdCwgJnMtPmNocm9tYV9oX3NoaWZ0LCAmcy0+Y2hyb21hX3Zfc2hpZnQpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKICAgICBzLT5waWN0dXJlX251bWJlciA9IDA7CiAKICAgICBpZiAoYXZjdHgtPmZsYWdzICYgKEFWX0NPREVDX0ZMQUdfUEFTUzEgfCBBVl9DT0RFQ19GTEFHX1BBU1MyKSkgewpAQCAtOTg1LDEwICs4NjQsMjIgQEAKICAgICB9CiAKICAgICBpZiAocy0+dmVyc2lvbiA+IDEpIHsKKyAgICAgICAgaW50IHBsYW5lX2NvdW50ID0gMSArIDIqcy0+Y2hyb21hX3BsYW5lcyArIHMtPnRyYW5zcGFyZW5jeTsKKyAgICAgICAgaW50IG1heF9oX3NsaWNlcyA9IEFWX0NFSUxfUlNISUZUKGF2Y3R4LT53aWR0aCAsIHMtPmNocm9tYV9oX3NoaWZ0KTsKKyAgICAgICAgaW50IG1heF92X3NsaWNlcyA9IEFWX0NFSUxfUlNISUZUKGF2Y3R4LT5oZWlnaHQsIHMtPmNocm9tYV92X3NoaWZ0KTsKICAgICAgICAgcy0+bnVtX3Zfc2xpY2VzID0gKGF2Y3R4LT53aWR0aCA+IDM1MiB8fCBhdmN0eC0+aGVpZ2h0ID4gMjg4IHx8ICFhdmN0eC0+c2xpY2VzKSA/IDIgOiAxOwotICAgICAgICBmb3IgKDsgcy0+bnVtX3Zfc2xpY2VzIDwgOTsgcy0+bnVtX3Zfc2xpY2VzKyspIHsKKworICAgICAgICBzLT5udW1fdl9zbGljZXMgPSBGRk1JTihzLT5udW1fdl9zbGljZXMsIG1heF92X3NsaWNlcyk7CisKKyAgICAgICAgZm9yICg7IHMtPm51bV92X3NsaWNlcyA8IDMyOyBzLT5udW1fdl9zbGljZXMrKykgewogICAgICAgICAgICAgZm9yIChzLT5udW1faF9zbGljZXMgPSBzLT5udW1fdl9zbGljZXM7IHMtPm51bV9oX3NsaWNlcyA8IDIqcy0+bnVtX3Zfc2xpY2VzOyBzLT5udW1faF9zbGljZXMrKykgewotICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+c2xpY2VzID09IHMtPm51bV9oX3NsaWNlcyAqIHMtPm51bV92X3NsaWNlcyAmJiBhdmN0eC0+c2xpY2VzIDw9IDY0IHx8ICFhdmN0eC0+c2xpY2VzKQorICAgICAgICAgICAgICAgIGludCBtYXh3ID0gKGF2Y3R4LT53aWR0aCAgKyBzLT5udW1faF9zbGljZXMgLSAxKSAvIHMtPm51bV9oX3NsaWNlczsKKyAgICAgICAgICAgICAgICBpbnQgbWF4aCA9IChhdmN0eC0+aGVpZ2h0ICsgcy0+bnVtX3Zfc2xpY2VzIC0gMSkgLyBzLT5udW1fdl9zbGljZXM7CisgICAgICAgICAgICAgICAgaWYgKHMtPm51bV9oX3NsaWNlcyA+IG1heF9oX3NsaWNlcyB8fCBzLT5udW1fdl9zbGljZXMgPiBtYXhfdl9zbGljZXMpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChtYXh3ICogbWF4aCAqIChpbnQ2NF90KShzLT5iaXRzX3Blcl9yYXdfc2FtcGxlKzEpICogcGxhbmVfY291bnQgPiA4PDwyNCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5zbGljZXMgPT0gcy0+bnVtX2hfc2xpY2VzICogcy0+bnVtX3Zfc2xpY2VzICYmIGF2Y3R4LT5zbGljZXMgPD0gTUFYX1NMSUNFUyB8fCAhYXZjdHgtPnNsaWNlcykKICAgICAgICAgICAgICAgICAgICAgZ290byBzbGljZXNfb2s7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTExNTQsOSArMTA0NSwxMCBAQAogICAgIGNvbnN0IGludCBwcyAgICAgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGMtPnBpeF9mbXQpLT5jb21wWzBdLnN0ZXA7CiAgICAgaW50IHJldDsKICAgICBSYW5nZUNvZGVyIGNfYmFrID0gZnMtPmM7Ci0gICAgY29uc3QgdWludDhfdCAqcGxhbmVzWzNdID0ge3AtPmRhdGFbMF0gKyBwcyp4ICsgeSpwLT5saW5lc2l6ZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVsxXSArIHBzKnggKyB5KnAtPmxpbmVzaXplWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzJdICsgcHMqeCArIHkqcC0+bGluZXNpemVbMl19OworICAgIGNvbnN0IHVpbnQ4X3QgKnBsYW5lc1s0XSA9IHtwLT5kYXRhWzBdICsgcHMqeCArIHkqcC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMV0gPyBwLT5kYXRhWzFdICsgcHMqeCArIHkqcC0+bGluZXNpemVbMV0gOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzJdID8gcC0+ZGF0YVsyXSArIHBzKnggKyB5KnAtPmxpbmVzaXplWzJdIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVszXSA/IHAtPmRhdGFbM10gKyBwcyp4ICsgeSpwLT5saW5lc2l6ZVszXSA6IE5VTEx9OwogCiAgICAgZnMtPnNsaWNlX2NvZGluZ19tb2RlID0gMDsKICAgICBpZiAoZi0+dmVyc2lvbiA+IDMpIHsKQEAgLTExOTgsNiArMTA5MCw4IEBACiAgICAgfSBlbHNlIGlmIChjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWUE4KSB7CiAgICAgICAgIHJldCAgPSBlbmNvZGVfcGxhbmUoZnMsIHAtPmRhdGFbMF0gKyAgICAgcHMqeCArIHkqcC0+bGluZXNpemVbMF0sIHdpZHRoLCBoZWlnaHQsIHAtPmxpbmVzaXplWzBdLCAwLCAyKTsKICAgICAgICAgcmV0IHw9IGVuY29kZV9wbGFuZShmcywgcC0+ZGF0YVswXSArIDEgKyBwcyp4ICsgeSpwLT5saW5lc2l6ZVswXSwgd2lkdGgsIGhlaWdodCwgcC0+bGluZXNpemVbMF0sIDEsIDIpOworICAgIH0gZWxzZSBpZiAoZi0+dXNlMzJiaXQpIHsKKyAgICAgICAgcmV0ID0gZW5jb2RlX3JnYl9mcmFtZTMyKGZzLCBwbGFuZXMsIHdpZHRoLCBoZWlnaHQsIHAtPmxpbmVzaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXQgPSBlbmNvZGVfcmdiX2ZyYW1lKGZzLCBwbGFuZXMsIHdpZHRoLCBoZWlnaHQsIHAtPmxpbmVzaXplKTsKICAgICB9CkBAIC0xMjI0LDEyICsxMTE4LDExIEBACiAgICAgRkZWMUNvbnRleHQgKmYgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgUmFuZ2VDb2RlciAqY29uc3QgYyA9ICZmLT5zbGljZV9jb250ZXh0WzBdLT5jOwogICAgIEFWRnJhbWUgKmNvbnN0IHAgICAgPSBmLT5waWN0dXJlLmY7Ci0gICAgaW50IHVzZWRfY291bnQgICAgICA9IDA7CiAgICAgdWludDhfdCBrZXlzdGF0ZSAgICA9IDEyODsKICAgICB1aW50OF90ICpidWZfcDsKICAgICBpbnQgaSwgcmV0OwogICAgIGludDY0X3QgbWF4c2l6ZSA9ICAgQVZfSU5QVVRfQlVGRkVSX01JTl9TSVpFCi0gICAgICAgICAgICAgICAgICAgICAgKyBhdmN0eC0+d2lkdGgqYXZjdHgtPmhlaWdodCozNUxMKjQ7CisgICAgICAgICAgICAgICAgICAgICAgKyBhdmN0eC0+d2lkdGgqYXZjdHgtPmhlaWdodCozN0xMKjQ7CiAKICAgICBpZighcGljdCkgewogICAgICAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QQVNTMSkgewpAQCAtMTI4MCw2ICsxMTczLDExIEBACiAgICAgaWYgKGYtPnZlcnNpb24gPiAzKQogICAgICAgICBtYXhzaXplID0gQVZfSU5QVVRfQlVGRkVSX01JTl9TSVpFICsgYXZjdHgtPndpZHRoKmF2Y3R4LT5oZWlnaHQqM0xMKjQ7CiAKKyAgICBpZiAobWF4c2l6ZSA+IElOVF9NQVggLSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIC0gMzIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNhbm5vdCBhbGxvY2F0ZSB3b3JzdCBjYXNlIHBhY2tldCBzaXplLCB0aGUgZW5jb2RpbmcgY291bGQgZmFpbFxuIik7CisgICAgICAgIG1heHNpemUgPSBJTlRfTUFYIC0gQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSAtIDMyOworICAgIH0KKwogICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBtYXhzaXplLCAwKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCkBAIC0xMjg5LDcgKzExODcsMTEgQEAKICAgICBhdl9mcmFtZV91bnJlZihwKTsKICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihwLCBwaWN0KSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OworI2lmIEZGX0FQSV9DT0RFRF9GUkFNRQorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogCiAgICAgaWYgKGF2Y3R4LT5nb3Bfc2l6ZSA9PSAwIHx8IGYtPnBpY3R1cmVfbnVtYmVyICUgYXZjdHgtPmdvcF9zaXplID09IDApIHsKICAgICAgICAgcHV0X3JhYyhjLCAma2V5c3RhdGUsIDEpOwpAQCAtMTMwOSwxMSArMTIxMSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZm9yIChpID0gMTsgaSA8IGYtPnNsaWNlX2NvdW50OyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZi0+c2xpY2VfY291bnQ7IGkrKykgewogICAgICAgICBGRlYxQ29udGV4dCAqZnMgPSBmLT5zbGljZV9jb250ZXh0W2ldOwotICAgICAgICB1aW50OF90ICpzdGFydCAgPSBwa3QtPmRhdGEgKyAocGt0LT5zaXplIC0gdXNlZF9jb3VudCkgKiAoaW50NjRfdClpIC8gZi0+c2xpY2VfY291bnQ7CisgICAgICAgIHVpbnQ4X3QgKnN0YXJ0ICA9IHBrdC0+ZGF0YSArIHBrdC0+c2l6ZSAqIChpbnQ2NF90KWkgLyBmLT5zbGljZV9jb3VudDsKICAgICAgICAgaW50IGxlbiAgICAgICAgID0gcGt0LT5zaXplIC8gZi0+c2xpY2VfY291bnQ7Ci0gICAgICAgIGZmX2luaXRfcmFuZ2VfZW5jb2RlcigmZnMtPmMsIHN0YXJ0LCBsZW4pOworICAgICAgICBpZiAoaSkgeworICAgICAgICAgICAgZmZfaW5pdF9yYW5nZV9lbmNvZGVyKCZmcy0+Yywgc3RhcnQsIGxlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGZzLT5jLmJ5dGVzdHJlYW1fZW5kID49IGZzLT5jLmJ5dGVzdHJlYW1fc3RhcnQgKyBsZW4pOworICAgICAgICAgICAgYXZfYXNzZXJ0MChmcy0+Yy5ieXRlc3RyZWFtIDwgZnMtPmMuYnl0ZXN0cmVhbV9zdGFydCArIGxlbik7CisgICAgICAgICAgICBmcy0+Yy5ieXRlc3RyZWFtX2VuZCA9IGZzLT5jLmJ5dGVzdHJlYW1fc3RhcnQgKyBsZW47CisgICAgICAgIH0KICAgICB9CiAgICAgYXZjdHgtPmV4ZWN1dGUoYXZjdHgsIGVuY29kZV9zbGljZSwgJmYtPnNsaWNlX2NvbnRleHRbMF0sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgZi0+c2xpY2VfY291bnQsIHNpemVvZih2b2lkICopKTsKQEAgLTE0MjMsMTIgKzEzMzEsMjAgQEAKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCAgIEFWX1BJWF9GTVRfMFJHQjMyLCAgICBBVl9QSVhfRk1UX1JHQjMyLCAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwgIEFWX1BJWF9GTVRfWVVWNDIyUDksCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDksICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAogICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsIEFWX1BJWF9GTVRfWVVWQTQyMlAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LAogICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMlAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLAogICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQOSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDksIEFWX1BJWF9GTVRfWVVWQTQyMFA5LAogICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNiwgICAgQVZfUElYX0ZNVF9HUkFZOCwgICAgIEFWX1BJWF9GTVRfR0JSUDksICAgICBBVl9QSVhfRk1UX0dCUlAxMCwKICAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsICAgIEFWX1BJWF9GTVRfR0JSUDE0LAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQMTAsIEFWX1BJWF9GTVRfR0JSQVAxMiwKICAgICAgICAgQVZfUElYX0ZNVF9ZQTgsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTEwLCBBVl9QSVhfRk1UX0dSQVkxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTYsIEFWX1BJWF9GTVRfUkdCNDgsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAxNiwgQVZfUElYX0ZNVF9SR0JBNjQsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwLCBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAKICAgICB9LApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mZnYxZW5jX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2ZmdjFlbmNfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBhZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9mZnYxZW5jX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBGRlYxIGVuY29kZXIgdGVtcGxhdGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgUkVOQU1FKGVuY29kZV9saW5lKShGRlYxQ29udGV4dCAqcywgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFICpzYW1wbGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhbmVfaW5kZXgsIGludCBiaXRzKQoreworICAgIFBsYW5lQ29udGV4dCAqY29uc3QgcCA9ICZzLT5wbGFuZVtwbGFuZV9pbmRleF07CisgICAgUmFuZ2VDb2RlciAqY29uc3QgYyAgID0gJnMtPmM7CisgICAgaW50IHg7CisgICAgaW50IHJ1bl9pbmRleCA9IHMtPnJ1bl9pbmRleDsKKyAgICBpbnQgcnVuX2NvdW50ID0gMDsKKyAgICBpbnQgcnVuX21vZGUgID0gMDsKKworICAgIGlmIChzLT5hYyAhPSBBQ19HT0xPTUJfUklDRSkgeworICAgICAgICBpZiAoYy0+Ynl0ZXN0cmVhbV9lbmQgLSBjLT5ieXRlc3RyZWFtIDwgdyAqIDM1KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVuY29kZWQgZnJhbWUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPnBiLmJ1Zl9lbmQgLSBzLT5wYi5idWYgLSAocHV0X2JpdHNfY291bnQoJnMtPnBiKSA+PiAzKSA8IHcgKiA0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVuY29kZWQgZnJhbWUgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnNsaWNlX2NvZGluZ19tb2RlID09IDEpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpbnQgdiA9IHNhbXBsZVswXVt4XTsKKyAgICAgICAgICAgIGZvciAoaSA9IGJpdHMtMTsgaT49MDsgaS0tKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBzdGF0ZSA9IDEyODsKKyAgICAgICAgICAgICAgICBwdXRfcmFjKGMsICZzdGF0ZSwgKHY+PmkpICYgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBpbnQgZGlmZiwgY29udGV4dDsKKworICAgICAgICBjb250ZXh0ID0gUkVOQU1FKGdldF9jb250ZXh0KShwLCBzYW1wbGVbMF0gKyB4LCBzYW1wbGVbMV0gKyB4LCBzYW1wbGVbMl0gKyB4KTsKKyAgICAgICAgZGlmZiAgICA9IHNhbXBsZVswXVt4XSAtIFJFTkFNRShwcmVkaWN0KShzYW1wbGVbMF0gKyB4LCBzYW1wbGVbMV0gKyB4KTsKKworICAgICAgICBpZiAoY29udGV4dCA8IDApIHsKKyAgICAgICAgICAgIGNvbnRleHQgPSAtY29udGV4dDsKKyAgICAgICAgICAgIGRpZmYgICAgPSAtZGlmZjsKKyAgICAgICAgfQorCisgICAgICAgIGRpZmYgPSBmb2xkKGRpZmYsIGJpdHMpOworCisgICAgICAgIGlmIChzLT5hYyAhPSBBQ19HT0xPTUJfUklDRSkgeworICAgICAgICAgICAgaWYgKHMtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QQVNTMSkgeworICAgICAgICAgICAgICAgIHB1dF9zeW1ib2xfaW5saW5lKGMsIHAtPnN0YXRlW2NvbnRleHRdLCBkaWZmLCAxLCBzLT5yY19zdGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJjX3N0YXQyW3AtPnF1YW50X3RhYmxlX2luZGV4XVtjb250ZXh0XSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB1dF9zeW1ib2xfaW5saW5lKGMsIHAtPnN0YXRlW2NvbnRleHRdLCBkaWZmLCAxLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0ID09IDApCisgICAgICAgICAgICAgICAgcnVuX21vZGUgPSAxOworCisgICAgICAgICAgICBpZiAocnVuX21vZGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoZGlmZikgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVuX2NvdW50ID49IDEgPDwgZmZfbG9nMl9ydW5bcnVuX2luZGV4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50IC09IDEgPDwgZmZfbG9nMl9ydW5bcnVuX2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9pbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSArIGZmX2xvZzJfcnVuW3J1bl9pbmRleF0sIHJ1bl9jb3VudCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChydW5faW5kZXgpCisgICAgICAgICAgICAgICAgICAgICAgICBydW5faW5kZXgtLTsKKyAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcnVuX21vZGUgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZGlmZi0tOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bl9jb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmZfZGxvZyhzLT5hdmN0eCwgImNvdW50OiVkIGluZGV4OiVkLCBtb2RlOiVkLCB4OiVkIHBvczolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgcnVuX2NvdW50LCBydW5faW5kZXgsIHJ1bl9tb2RlLCB4LAorICAgICAgICAgICAgICAgICAgICAoaW50KXB1dF9iaXRzX2NvdW50KCZzLT5wYikpOworCisgICAgICAgICAgICBpZiAocnVuX21vZGUgPT0gMCkKKyAgICAgICAgICAgICAgICBwdXRfdmxjX3N5bWJvbCgmcy0+cGIsICZwLT52bGNfc3RhdGVbY29udGV4dF0sIGRpZmYsIGJpdHMpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChydW5fbW9kZSkgeworICAgICAgICB3aGlsZSAocnVuX2NvdW50ID49IDEgPDwgZmZfbG9nMl9ydW5bcnVuX2luZGV4XSkgeworICAgICAgICAgICAgcnVuX2NvdW50IC09IDEgPDwgZmZfbG9nMl9ydW5bcnVuX2luZGV4XTsKKyAgICAgICAgICAgIHJ1bl9pbmRleCsrOworICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChydW5fY291bnQpCisgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDEpOworICAgIH0KKyAgICBzLT5ydW5faW5kZXggPSBydW5faW5kZXg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBSRU5BTUUoZW5jb2RlX3JnYl9mcmFtZSkoRkZWMUNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKnNyY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgY29uc3QgaW50IHN0cmlkZVs0XSkKK3sKKyAgICBpbnQgeCwgeSwgcCwgaTsKKyAgICBjb25zdCBpbnQgcmluZ19zaXplID0gcy0+Y29udGV4dF9tb2RlbCA/IDMgOiAyOworICAgIFRZUEUgKnNhbXBsZVs0XVszXTsKKyAgICBpbnQgbGJkICAgID0gcy0+Yml0c19wZXJfcmF3X3NhbXBsZSA8PSA4OworICAgIGludCBwYWNrZWQgPSAhc3JjWzFdOworICAgIGludCBiaXRzICAgPSBzLT5iaXRzX3Blcl9yYXdfc2FtcGxlID4gMCA/IHMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgOiA4OworICAgIGludCBvZmZzZXQgPSAxIDw8IGJpdHM7CisgICAgaW50IHRyYW5zcGFyZW5jeSA9IHMtPnRyYW5zcGFyZW5jeTsKKyAgICBpbnQgcGFja2VkX3NpemUgPSAoMyArIHRyYW5zcGFyZW5jeSkqMjsKKworICAgIHMtPnJ1bl9pbmRleCA9IDA7CisKKyAgICBtZW1zZXQoUkVOQU1FKHMtPnNhbXBsZV9idWZmZXIpLCAwLCByaW5nX3NpemUgKiBNQVhfUExBTkVTICoKKyAgICAgICAgICAgKHcgKyA2KSAqIHNpemVvZigqUkVOQU1FKHMtPnNhbXBsZV9idWZmZXIpKSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByaW5nX3NpemU7IGkrKykKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBNQVhfUExBTkVTOyBwKyspCisgICAgICAgICAgICAgICAgc2FtcGxlW3BdW2ldPSBSRU5BTUUocy0+c2FtcGxlX2J1ZmZlcikgKyBwKnJpbmdfc2l6ZSoodys2KSArICgoaCtpLXkpJXJpbmdfc2l6ZSkqKHcrNikgKyAzOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBiLCBnLCByLCBhdl91bmluaXQoYSk7CisgICAgICAgICAgICBpZiAobGJkKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdiA9ICooKGNvbnN0IHVpbnQzMl90Kikoc3JjWzBdICsgeCo0ICsgc3RyaWRlWzBdKnkpKTsKKyAgICAgICAgICAgICAgICBiID0gIHYgICAgICAgICYgMHhGRjsKKyAgICAgICAgICAgICAgICBnID0gKHYgPj4gIDgpICYgMHhGRjsKKyAgICAgICAgICAgICAgICByID0gKHYgPj4gMTYpICYgMHhGRjsKKyAgICAgICAgICAgICAgICBhID0gIHYgPj4gMjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhY2tlZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpwID0gKChjb25zdCB1aW50MTZfdCopKHNyY1swXSArIHgqcGFja2VkX3NpemUgKyBzdHJpZGVbMF0qeSkpOworICAgICAgICAgICAgICAgIHIgPSBwWzBdOworICAgICAgICAgICAgICAgIGcgPSBwWzFdOworICAgICAgICAgICAgICAgIGIgPSBwWzJdOworICAgICAgICAgICAgICAgIGlmICh0cmFuc3BhcmVuY3kpCisgICAgICAgICAgICAgICAgICBhID0gcFszXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2l6ZW9mKFRZUEUpID09IDQgfHwgdHJhbnNwYXJlbmN5KSB7CisgICAgICAgICAgICAgICAgZyA9ICooKGNvbnN0IHVpbnQxNl90ICopKHNyY1swXSArIHgqMiArIHN0cmlkZVswXSp5KSk7CisgICAgICAgICAgICAgICAgYiA9ICooKGNvbnN0IHVpbnQxNl90ICopKHNyY1sxXSArIHgqMiArIHN0cmlkZVsxXSp5KSk7CisgICAgICAgICAgICAgICAgciA9ICooKGNvbnN0IHVpbnQxNl90ICopKHNyY1syXSArIHgqMiArIHN0cmlkZVsyXSp5KSk7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zcGFyZW5jeSkKKyAgICAgICAgICAgICAgICAgICAgYSA9ICooKGNvbnN0IHVpbnQxNl90ICopKHNyY1szXSArIHgqMiArIHN0cmlkZVszXSp5KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGIgPSAqKChjb25zdCB1aW50MTZfdCAqKShzcmNbMF0gKyB4KjIgKyBzdHJpZGVbMF0qeSkpOworICAgICAgICAgICAgICAgIGcgPSAqKChjb25zdCB1aW50MTZfdCAqKShzcmNbMV0gKyB4KjIgKyBzdHJpZGVbMV0qeSkpOworICAgICAgICAgICAgICAgIHIgPSAqKChjb25zdCB1aW50MTZfdCAqKShzcmNbMl0gKyB4KjIgKyBzdHJpZGVbMl0qeSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkgeworICAgICAgICAgICAgICAgIGIgLT0gZzsKKyAgICAgICAgICAgICAgICByIC09IGc7CisgICAgICAgICAgICAgICAgZyArPSAoYiAqIHMtPnNsaWNlX3JjdF9ieV9jb2VmICsgciAqIHMtPnNsaWNlX3JjdF9yeV9jb2VmKSA+PiAyOworICAgICAgICAgICAgICAgIGIgKz0gb2Zmc2V0OworICAgICAgICAgICAgICAgIHIgKz0gb2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYW1wbGVbMF1bMF1beF0gPSBnOworICAgICAgICAgICAgc2FtcGxlWzFdWzBdW3hdID0gYjsKKyAgICAgICAgICAgIHNhbXBsZVsyXVswXVt4XSA9IHI7CisgICAgICAgICAgICBzYW1wbGVbM11bMF1beF0gPSBhOworICAgICAgICB9CisgICAgICAgIGZvciAocCA9IDA7IHAgPCAzICsgdHJhbnNwYXJlbmN5OyBwKyspIHsKKyAgICAgICAgICAgIGludCByZXQ7CisgICAgICAgICAgICBzYW1wbGVbcF1bMF1bLTFdID0gc2FtcGxlW3BdWzFdWzAgIF07CisgICAgICAgICAgICBzYW1wbGVbcF1bMV1bIHddID0gc2FtcGxlW3BdWzFdW3ctMV07CisgICAgICAgICAgICBpZiAobGJkICYmIHMtPnNsaWNlX2NvZGluZ19tb2RlID09IDApCisgICAgICAgICAgICAgICAgcmV0ID0gUkVOQU1FKGVuY29kZV9saW5lKShzLCB3LCBzYW1wbGVbcF0sIChwICsgMSkgLyAyLCA5KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSBSRU5BTUUoZW5jb2RlX2xpbmUpKHMsIHcsIHNhbXBsZVtwXSwgKHAgKyAxKSAvIDIsIGJpdHMgKyAocy0+c2xpY2VfY29kaW5nX21vZGUgIT0gMSkpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9maWMuYyBiL2xpYmF2Y29kZWMvZmljLmMKaW5kZXggN2Q2OThmMC4uYjdiODM0NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9maWMuYworKysgYi9saWJhdmNvZGVjL2ZpYy5jCkBAIC0zNCw2ICszNCw3IEBACiAgICAgaW50IHNsaWNlX2g7CiAgICAgaW50IHNyY19zaXplOwogICAgIGludCB5X29mZjsKKyAgICBpbnQgcF9mcmFtZTsKIH0gRklDVGhyZWFkQ29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgRklDQ29udGV4dCB7CkBAIC04MSwyOSArODIsMzAgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90IGZpY19oZWFkZXJbN10gPSB7IDAsIDAsIDEsICdGJywgJ0knLCAnQycsICdWJyB9OwogCiAjZGVmaW5lIEZJQ19IRUFERVJfU0laRSAyNworI2RlZmluZSBDVVJTT1JfT0ZGU0VUIDU5CiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmljX2lkY3QoaW50MTZfdCAqYmxrLCBpbnQgc3RlcCwgaW50IHNoaWZ0LCBpbnQgcm5kKQogewotICAgIGNvbnN0IGludCB0MCA9ICAyNzI0NiAqIGJsa1szICogc3RlcF0gKyAxODQwNSAqIGJsa1s1ICogc3RlcF07Ci0gICAgY29uc3QgaW50IHQxID0gIDI3MjQ2ICogYmxrWzUgKiBzdGVwXSAtIDE4NDA1ICogYmxrWzMgKiBzdGVwXTsKLSAgICBjb25zdCBpbnQgdDIgPSAgIDYzOTMgKiBibGtbNyAqIHN0ZXBdICsgMzIxMzkgKiBibGtbMSAqIHN0ZXBdOwotICAgIGNvbnN0IGludCB0MyA9ICAgNjM5MyAqIGJsa1sxICogc3RlcF0gLSAzMjEzOSAqIGJsa1s3ICogc3RlcF07Ci0gICAgY29uc3QgaW50IHQ0ID0gNTc5MyAqICh0MiArIHQwICsgMHg4MDAgPj4gMTIpOwotICAgIGNvbnN0IGludCB0NSA9IDU3OTMgKiAodDMgKyB0MSArIDB4ODAwID4+IDEyKTsKLSAgICBjb25zdCBpbnQgdDYgPSB0MiAtIHQwOwotICAgIGNvbnN0IGludCB0NyA9IHQzIC0gdDE7Ci0gICAgY29uc3QgaW50IHQ4ID0gIDE3NzM0ICogYmxrWzIgKiBzdGVwXSAtIDQyODEzICogYmxrWzYgKiBzdGVwXTsKLSAgICBjb25zdCBpbnQgdDkgPSAgMTc3MzQgKiBibGtbNiAqIHN0ZXBdICsgNDI4MTQgKiBibGtbMiAqIHN0ZXBdOwotICAgIGNvbnN0IGludCB0QSA9IChibGtbMCAqIHN0ZXBdIC0gYmxrWzQgKiBzdGVwXSA8PCAxNSkgKyBybmQ7Ci0gICAgY29uc3QgaW50IHRCID0gKGJsa1swICogc3RlcF0gKyBibGtbNCAqIHN0ZXBdIDw8IDE1KSArIHJuZDsKLSAgICBibGtbMCAqIHN0ZXBdID0gKCAgdDQgICAgICAgKyB0OSArIHRCKSA+PiBzaGlmdDsKLSAgICBibGtbMSAqIHN0ZXBdID0gKCAgdDYgKyB0NyAgKyB0OCArIHRBKSA+PiBzaGlmdDsKLSAgICBibGtbMiAqIHN0ZXBdID0gKCAgdDYgLSB0NyAgLSB0OCArIHRBKSA+PiBzaGlmdDsKLSAgICBibGtbMyAqIHN0ZXBdID0gKCAgdDUgICAgICAgLSB0OSArIHRCKSA+PiBzaGlmdDsKLSAgICBibGtbNCAqIHN0ZXBdID0gKCAtdDUgICAgICAgLSB0OSArIHRCKSA+PiBzaGlmdDsKLSAgICBibGtbNSAqIHN0ZXBdID0gKC0odDYgLSB0NykgLSB0OCArIHRBKSA+PiBzaGlmdDsKLSAgICBibGtbNiAqIHN0ZXBdID0gKC0odDYgKyB0NykgKyB0OCArIHRBKSA+PiBzaGlmdDsKLSAgICBibGtbNyAqIHN0ZXBdID0gKCAtdDQgICAgICAgKyB0OSArIHRCKSA+PiBzaGlmdDsKKyAgICBjb25zdCB1bnNpZ25lZCB0MCA9ICAyNzI0NiAqIGJsa1szICogc3RlcF0gKyAxODQwNSAqIGJsa1s1ICogc3RlcF07CisgICAgY29uc3QgdW5zaWduZWQgdDEgPSAgMjcyNDYgKiBibGtbNSAqIHN0ZXBdIC0gMTg0MDUgKiBibGtbMyAqIHN0ZXBdOworICAgIGNvbnN0IHVuc2lnbmVkIHQyID0gICA2MzkzICogYmxrWzcgKiBzdGVwXSArIDMyMTM5ICogYmxrWzEgKiBzdGVwXTsKKyAgICBjb25zdCB1bnNpZ25lZCB0MyA9ICAgNjM5MyAqIGJsa1sxICogc3RlcF0gLSAzMjEzOSAqIGJsa1s3ICogc3RlcF07CisgICAgY29uc3QgdW5zaWduZWQgdDQgPSA1NzkzVSAqICgoaW50KSh0MiArIHQwICsgMHg4MDApID4+IDEyKTsKKyAgICBjb25zdCB1bnNpZ25lZCB0NSA9IDU3OTNVICogKChpbnQpKHQzICsgdDEgKyAweDgwMCkgPj4gMTIpOworICAgIGNvbnN0IHVuc2lnbmVkIHQ2ID0gdDIgLSB0MDsKKyAgICBjb25zdCB1bnNpZ25lZCB0NyA9IHQzIC0gdDE7CisgICAgY29uc3QgdW5zaWduZWQgdDggPSAgMTc3MzQgKiBibGtbMiAqIHN0ZXBdIC0gNDI4MTMgKiBibGtbNiAqIHN0ZXBdOworICAgIGNvbnN0IHVuc2lnbmVkIHQ5ID0gIDE3NzM0ICogYmxrWzYgKiBzdGVwXSArIDQyODE0ICogYmxrWzIgKiBzdGVwXTsKKyAgICBjb25zdCB1bnNpZ25lZCB0QSA9IChibGtbMCAqIHN0ZXBdIC0gYmxrWzQgKiBzdGVwXSkgKiAzMjc2OCArIHJuZDsKKyAgICBjb25zdCB1bnNpZ25lZCB0QiA9IChibGtbMCAqIHN0ZXBdICsgYmxrWzQgKiBzdGVwXSkgKiAzMjc2OCArIHJuZDsKKyAgICBibGtbMCAqIHN0ZXBdID0gKGludCkoICB0NCAgICAgICArIHQ5ICsgdEIpID4+IHNoaWZ0OworICAgIGJsa1sxICogc3RlcF0gPSAoaW50KSggIHQ2ICsgdDcgICsgdDggKyB0QSkgPj4gc2hpZnQ7CisgICAgYmxrWzIgKiBzdGVwXSA9IChpbnQpKCAgdDYgLSB0NyAgLSB0OCArIHRBKSA+PiBzaGlmdDsKKyAgICBibGtbMyAqIHN0ZXBdID0gKGludCkoICB0NSAgICAgICAtIHQ5ICsgdEIpID4+IHNoaWZ0OworICAgIGJsa1s0ICogc3RlcF0gPSAoaW50KSggLXQ1ICAgICAgIC0gdDkgKyB0QikgPj4gc2hpZnQ7CisgICAgYmxrWzUgKiBzdGVwXSA9IChpbnQpKC0odDYgLSB0NykgLSB0OCArIHRBKSA+PiBzaGlmdDsKKyAgICBibGtbNiAqIHN0ZXBdID0gKGludCkoLSh0NiArIHQ3KSArIHQ4ICsgdEEpID4+IHNoaWZ0OworICAgIGJsa1s3ICogc3RlcF0gPSAoaW50KSggLXQ0ICAgICAgICsgdDkgKyB0QikgPj4gc2hpZnQ7CiB9CiAKIHN0YXRpYyB2b2lkIGZpY19pZGN0X3B1dCh1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQpAQCAtMTMzLDE2ICsxMzUsMTYgQEAKICAgICB9CiB9CiBzdGF0aWMgaW50IGZpY19kZWNvZGVfYmxvY2soRklDQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50MTZfdCAqYmxvY2ssIGludCAqaXNfcCkKIHsKICAgICBpbnQgaSwgbnVtX2NvZWZmOwogCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKICAgICAvKiBJcyBpdCBhIHNraXAgYmxvY2s/ICovCiAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKLSAgICAgICAgLyogVGhpcyBpcyBhIFAtZnJhbWUuICovCi0gICAgICAgIGN0eC0+ZnJhbWUtPmtleV9mcmFtZSA9IDA7Ci0gICAgICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOwotCisgICAgICAgICppc19wID0gMTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCkBAIC0xNTIsOSArMTU0LDEzIEBACiAgICAgaWYgKG51bV9jb2VmZiA+IDY0KQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29lZmY7IGkrKykKLSAgICAgICAgYmxvY2tbZmZfemlnemFnX2RpcmVjdFtpXV0gPSBnZXRfc2VfZ29sb21iKGdiKSAqCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9jb2VmZjsgaSsrKSB7CisgICAgICAgIGludCB2ID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgIGlmICh2IDwgLTIwNDggfHwgdiA+IDIwNDgpCisgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJsb2NrW2ZmX3ppZ3phZ19kaXJlY3RbaV1dID0gdiAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5xbWF0W2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworICAgIH0KIAogICAgIGZpY19pZGN0X3B1dChkc3QsIHN0cmlkZSwgYmxvY2spOwogCkBAIC0xODIsNyArMTg4LDggQEAKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAoY3R4LT5hbGlnbmVkX3dpZHRoID4+ICEhcCk7IHggKz0gOCkgewogICAgICAgICAgICAgICAgIGludCByZXQ7CiAKLSAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZpY19kZWNvZGVfYmxvY2soY3R4LCAmZ2IsIGRzdCArIHgsIHN0cmlkZSwgdGN0eC0+YmxvY2spKSAhPSAwKQorICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmljX2RlY29kZV9ibG9jayhjdHgsICZnYiwgZHN0ICsgeCwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3R4LT5ibG9jaywgJnRjdHgtPnBfZnJhbWUpKSAhPSAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogCkBAIC0zMDksNyArMzE2LDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKCF0c2l6ZSkKKyAgICBpZiAoIXRzaXplIHx8ICFBVl9STDE2KHNyYyArIDM3KSB8fCAhQVZfUkwxNihzcmMgKyAzOSkpCiAgICAgICAgIHNraXBfY3Vyc29yID0gMTsKIAogICAgIGlmICghc2tpcF9jdXJzb3IgJiYgdHNpemUgPCAzMikgewpAQCAtMzIyLDggKzMyOSw4IEBACiAgICAgY3VyX3ggPSBBVl9STDE2KHNyYyArIDMzKTsKICAgICBjdXJfeSA9IEFWX1JMMTYoc3JjICsgMzUpOwogICAgIGlmICghc2tpcF9jdXJzb3IgJiYgKGN1cl94ID4gYXZjdHgtPndpZHRoIHx8IGN1cl95ID4gYXZjdHgtPmhlaWdodCkpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICJJbnZhbGlkIGN1cnNvciBwb3NpdGlvbjogKCVkLCVkKS4gU2tpcHBpbmcgY3Vzb3IuXG4iLAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGN1cnNvciBwb3NpdGlvbjogKCVkLCVkKS4gU2tpcHBpbmcgY3Vyc29yLlxuIiwKICAgICAgICAgICAgICAgIGN1cl94LCBjdXJfeSk7CiAgICAgICAgIHNraXBfY3Vyc29yID0gMTsKICAgICB9CkBAIC0zMzQsNiArMzQxLDEwIEBACiAgICAgICAgIHNraXBfY3Vyc29yID0gMTsKICAgICB9CiAKKyAgICBpZiAoIXNraXBfY3Vyc29yICYmIGF2cGt0LT5zaXplIDwgQ1VSU09SX09GRlNFVCArIHNpemVvZihjdHgtPmN1cnNvcl9idWYpKSB7CisgICAgICAgIHNraXBfY3Vyc29yID0gMTsKKyAgICB9CisKICAgICAvKiBTbGljZSBoZWlnaHQgZm9yIGFsbCBidXQgdGhlIGxhc3Qgc2xpY2UuICovCiAgICAgY3R4LT5zbGljZV9oID0gMTYgKiAoY3R4LT5hbGlnbmVkX2hlaWdodCA+PiA0KSAvIG5zbGljZXM7CiAgICAgaWYgKGN0eC0+c2xpY2VfaCAlIDE2KQpAQCAtMzQ4LDE1ICszNTksNiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICAvKgotICAgICAqIFNldCB0aGUgZnJhbWV0eXBlIHRvIEkgaW5pdGlhbGx5LiBJdCB3aWxsIGJlIHNldCB0byBQIGlmIHRoZSBmcmFtZQotICAgICAqIGhhcyBhbnkgZGVwZW5kZW5jaWVzIChza2lwIGJsb2NrcykuIFRoZXJlIHdpbGwgYmUgYSByYWNlIGNvbmRpdGlvbgotICAgICAqIGluc2lkZSB0aGUgc2xpY2UgZGVjb2RlIGZ1bmN0aW9uIHRvIHNldCB0aGVzZSwgYnV0IHdlIGRvIG5vdCBjYXJlLgotICAgICAqIHNpbmNlIHRoZXkgd2lsbCBvbmx5IGV2ZXIgYmUgc2V0IHRvIDAvUC4KLSAgICAgKi8KLSAgICBjdHgtPmZyYW1lLT5rZXlfZnJhbWUgPSAxOwotICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOwotCiAgICAgLyogQWxsb2NhdGUgc2xpY2UgZGF0YS4gKi8KICAgICBhdl9mYXN0X21hbGxvYygmY3R4LT5zbGljZV9kYXRhLCAmY3R4LT5zbGljZV9kYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgbnNsaWNlcyAqIHNpemVvZihjdHgtPnNsaWNlX2RhdGFbMF0pKTsKQEAgLTM4MSw2ICszODMsOCBAQAogICAgICAgICAgICAgc2xpY2VfaCAgICAgID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0IC0gY3R4LT5zbGljZV9oICogKG5zbGljZXMgLSAxKSwgMTYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2xpY2Vfc2l6ZSA9IEFWX1JCMzIoc3JjICsgdHNpemUgKyBGSUNfSEVBREVSX1NJWkUgKyBzbGljZSAqIDQgKyA0KTsKKyAgICAgICAgICAgIGlmIChzbGljZV9zaXplIDwgc2xpY2Vfb2ZmKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHNsaWNlX3NpemUgPCBzbGljZV9vZmYgfHwgc2xpY2Vfc2l6ZSA+IG1zaXplKQpAQCAtMzk4LDYgKzQwMiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgbnNsaWNlcywgc2l6ZW9mKGN0eC0+c2xpY2VfZGF0YVswXSkpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKKyAgICBjdHgtPmZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGZvciAoc2xpY2UgPSAwOyBzbGljZSA8IG5zbGljZXM7IHNsaWNlKyspIHsKKyAgICAgICAgaWYgKGN0eC0+c2xpY2VfZGF0YVtzbGljZV0ucF9mcmFtZSkgeworICAgICAgICAgICAgY3R4LT5mcmFtZS0+a2V5X2ZyYW1lID0gMDsKKyAgICAgICAgICAgIGN0eC0+ZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiAgICAgYXZfZnJhbWVfZnJlZSgmY3R4LT5maW5hbF9mcmFtZSk7CiAgICAgY3R4LT5maW5hbF9mcmFtZSA9IGF2X2ZyYW1lX2Nsb25lKGN0eC0+ZnJhbWUpOwogICAgIGlmICghY3R4LT5maW5hbF9mcmFtZSkgewpAQCAtNDEzLDcgKzQyNiw3IEBACiAKICAgICAvKiBEcmF3IGN1cnNvci4gKi8KICAgICBpZiAoIXNraXBfY3Vyc29yKSB7Ci0gICAgICAgIG1lbWNweShjdHgtPmN1cnNvcl9idWYsIHNyYyArIDU5LCAzMiAqIDMyICogNCk7CisgICAgICAgIG1lbWNweShjdHgtPmN1cnNvcl9idWYsIHNyYyArIENVUlNPUl9PRkZTRVQsIHNpemVvZihjdHgtPmN1cnNvcl9idWYpKTsKICAgICAgICAgZmljX2RyYXdfY3Vyc29yKGF2Y3R4LCBjdXJfeCwgY3VyX3kpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9maWx0ZXJfdW5pdHNfYnNmLmMgYi9saWJhdmNvZGVjL2ZpbHRlcl91bml0c19ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWUwYWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9maWx0ZXJfdW5pdHNfYnNmLmMKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImJzZi5oIgorI2luY2x1ZGUgImNicy5oIgorCisKK3R5cGVkZWYgc3RydWN0IEZpbHRlclVuaXRzQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmNiYzsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50IGZyYWdtZW50OworCisgICAgY29uc3QgY2hhciAqcGFzc190eXBlczsKKyAgICBjb25zdCBjaGFyICpyZW1vdmVfdHlwZXM7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9PUCwKKyAgICAgICAgUEFTUywKKyAgICAgICAgUkVNT1ZFLAorICAgIH0gbW9kZTsKKyAgICBDb2RlZEJpdHN0cmVhbVVuaXRUeXBlICp0eXBlX2xpc3Q7CisgICAgaW50IG5iX3R5cGVzOworfSBGaWx0ZXJVbml0c0NvbnRleHQ7CisKKworc3RhdGljIGludCBmaWx0ZXJfdW5pdHNfbWFrZV90eXBlX2xpc3QoY29uc3QgY2hhciAqbGlzdF9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbVVuaXRUeXBlICoqdHlwZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuYl90eXBlcykKK3sKKyAgICBDb2RlZEJpdHN0cmVhbVVuaXRUeXBlICpsaXN0ID0gTlVMTDsKKyAgICBpbnQgcGFzcywgY291bnQ7CisKKyAgICBmb3IgKHBhc3MgPSAxOyBwYXNzIDw9IDI7IHBhc3MrKykgeworICAgICAgICBsb25nIHZhbHVlLCByYW5nZV9zdGFydCwgcmFuZ2VfZW5kOworICAgICAgICBjb25zdCBjaGFyICpzdHI7CisgICAgICAgIGNoYXIgKnZhbHVlX2VuZDsKKworICAgICAgICBjb3VudCA9IDA7CisgICAgICAgIGZvciAoc3RyID0gbGlzdF9zdHJpbmc7ICpzdHI7KSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cnRvbChzdHIsICZ2YWx1ZV9lbmQsIDApOworICAgICAgICAgICAgaWYgKHN0ciA9PSB2YWx1ZV9lbmQpCisgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkOworICAgICAgICAgICAgc3RyID0gKGNvbnN0IGNoYXIgKil2YWx1ZV9lbmQ7CisgICAgICAgICAgICBpZiAoKnN0ciA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICArK3N0cjsKKyAgICAgICAgICAgICAgICByYW5nZV9zdGFydCA9IHZhbHVlOworICAgICAgICAgICAgICAgIHJhbmdlX2VuZCAgID0gc3RydG9sKHN0ciwgJnZhbHVlX2VuZCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHN0ciA9PSB2YWx1ZV9lbmQpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gaW52YWxpZDsKKworICAgICAgICAgICAgICAgIGZvciAodmFsdWUgPSByYW5nZV9zdGFydDsgdmFsdWUgPCByYW5nZV9lbmQ7IHZhbHVlKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3MgPT0gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RbY291bnRdID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocGFzcyA9PSAyKQorICAgICAgICAgICAgICAgICAgICBsaXN0W2NvdW50XSA9IHZhbHVlOworICAgICAgICAgICAgICAgICsrY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKnN0ciA9PSAnfCcpCisgICAgICAgICAgICAgICAgKytzdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhc3MgPT0gMSkgeworICAgICAgICAgICAgbGlzdCA9IGF2X21hbGxvY19hcnJheShjb3VudCwgc2l6ZW9mKCpsaXN0KSk7CisgICAgICAgICAgICBpZiAoIWxpc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICp0eXBlX2xpc3QgPSBsaXN0OworICAgICpuYl90eXBlcyAgPSBjb3VudDsKKyAgICByZXR1cm4gMDsKKworaW52YWxpZDoKKyAgICBhdl9mcmVlcCgmbGlzdCk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfdW5pdHNfZmlsdGVyKEFWQlNGQ29udGV4dCAqYnNmLCBBVlBhY2tldCAqb3V0KQoreworICAgIEZpbHRlclVuaXRzQ29udGV4dCAgICAgICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICpmcmFnID0gJmN0eC0+ZnJhZ21lbnQ7CisgICAgQVZQYWNrZXQgKmluID0gTlVMTDsKKyAgICBpbnQgZXJyLCBpLCBqOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgZXJyID0gZmZfYnNmX2dldF9wYWNrZXQoYnNmLCAmaW4pOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgaWYgKGN0eC0+bW9kZSA9PSBOT09QKSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfbW92ZV9yZWYob3V0LCBpbik7CisgICAgICAgICAgICBhdl9wYWNrZXRfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBmZl9jYnNfcmVhZF9wYWNrZXQoY3R4LT5jYmMsIGZyYWcsIGluKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWFkIHBhY2tldC5cbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYWctPm5iX3VuaXRzOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdHgtPm5iX3R5cGVzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJhZy0+dW5pdHNbaV0udHlwZSA9PSBjdHgtPnR5cGVfbGlzdFtqXSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3R4LT5tb2RlID09IFJFTU9WRSA/IGogPCAgY3R4LT5uYl90eXBlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBqID49IGN0eC0+bmJfdHlwZXMpIHsKKyAgICAgICAgICAgICAgICBmZl9jYnNfZGVsZXRlX3VuaXQoY3R4LT5jYmMsIGZyYWcsIGkpOworICAgICAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChmcmFnLT5uYl91bml0cyA+IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBEb24ndCByZXR1cm4gcGFja2V0cyB3aXRoIG5vdGhpbmcgaW4gdGhlbS4KKyAgICAgICAgYXZfcGFja2V0X2ZyZWUoJmluKTsKKyAgICAgICAgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChjdHgtPmNiYywgZnJhZyk7CisgICAgfQorCisgICAgZXJyID0gZmZfY2JzX3dyaXRlX3BhY2tldChjdHgtPmNiYywgb3V0LCBmcmFnKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgcGFja2V0LlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9wYWNrZXRfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCitmYWlsOgorICAgIGZmX2Nic19mcmFnbWVudF91bmluaXQoY3R4LT5jYmMsIGZyYWcpOworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGZpbHRlcl91bml0c19pbml0KEFWQlNGQ29udGV4dCAqYnNmKQoreworICAgIEZpbHRlclVuaXRzQ29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisgICAgaW50IGVycjsKKworICAgIGlmIChjdHgtPnBhc3NfdHlwZXMgJiYgY3R4LT5yZW1vdmVfdHlwZXMpIHsKKyAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRXhhY3RseSBvbmUgb2YgcGFzc190eXBlcyBvciAiCisgICAgICAgICAgICAgICAicmVtb3ZlX3R5cGVzIGlzIHJlcXVpcmVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGN0eC0+cGFzc190eXBlcykgeworICAgICAgICBjdHgtPm1vZGUgPSBQQVNTOworICAgICAgICBlcnIgPSBmaWx0ZXJfdW5pdHNfbWFrZV90eXBlX2xpc3QoY3R4LT5wYXNzX3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+dHlwZV9saXN0LCAmY3R4LT5uYl90eXBlcyk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcGFyc2UgcGFzc190eXBlcy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY3R4LT5yZW1vdmVfdHlwZXMpIHsKKyAgICAgICAgY3R4LT5tb2RlID0gUkVNT1ZFOworICAgICAgICBlcnIgPSBmaWx0ZXJfdW5pdHNfbWFrZV90eXBlX2xpc3QoY3R4LT5yZW1vdmVfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT50eXBlX2xpc3QsICZjdHgtPm5iX3R5cGVzKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBwYXJzZSByZW1vdmVfdHlwZXMuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBlcnIgPSBmZl9jYnNfaW5pdCgmY3R4LT5jYmMsIGJzZi0+cGFyX2luLT5jb2RlY19pZCwgYnNmKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIC8vIERvbid0IGFjdHVhbGx5IGRlY29tcG9zZSBhbnl0aGluZywgd2Ugb25seSB3YW50IHRoZSB1bml0IGRhdGEuCisgICAgY3R4LT5jYmMtPmRlY29tcG9zZV91bml0X3R5cGVzICAgID0gY3R4LT50eXBlX2xpc3Q7CisgICAgY3R4LT5jYmMtPm5iX2RlY29tcG9zZV91bml0X3R5cGVzID0gMDsKKworICAgIGlmIChic2YtPnBhcl9pbi0+ZXh0cmFkYXRhKSB7CisgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgcHM7CisKKyAgICAgICAgZXJyID0gZmZfY2JzX3JlYWRfZXh0cmFkYXRhKGN0eC0+Y2JjLCAmcHMsIGJzZi0+cGFyX2luKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWFkIGV4dHJhZGF0YS5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gZmZfY2JzX3dyaXRlX2V4dHJhZGF0YShjdHgtPmNiYywgYnNmLT5wYXJfb3V0LCAmcHMpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIGV4dHJhZGF0YS5cbiIpOworICAgICAgICB9CisKKyAgICAgICAgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChjdHgtPmNiYywgJnBzKTsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBmaWx0ZXJfdW5pdHNfY2xvc2UoQVZCU0ZDb250ZXh0ICpic2YpCit7CisgICAgRmlsdGVyVW5pdHNDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZjdHgtPnR5cGVfbGlzdCk7CisKKyAgICBmZl9jYnNfY2xvc2UoJmN0eC0+Y2JjKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRmlsdGVyVW5pdHNDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfQlNGX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZpbHRlcl91bml0c19vcHRpb25zW10gPSB7CisgICAgeyAicGFzc190eXBlcyIsICAgIkxpc3Qgb2YgdW5pdCB0eXBlcyB0byBwYXNzIHRocm91Z2ggdGhlIGZpbHRlci4iLAorICAgICAgICBPRkZTRVQocGFzc190eXBlcyksICAgQVZfT1BUX1RZUEVfU1RSSU5HLAorICAgICAgICB7IC5zdHIgPSBOVUxMIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAicmVtb3ZlX3R5cGVzIiwgIkxpc3Qgb2YgdW5pdCB0eXBlcyB0byByZW1vdmUgaW4gdGhlIGZpbHRlci4iLAorICAgICAgICBPRkZTRVQocmVtb3ZlX3R5cGVzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLAorICAgICAgICB7IC5zdHIgPSBOVUxMIH0sIC5mbGFncyA9IEZMQUdTIH0sCisKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmlsdGVyX3VuaXRzX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImZpbHRlcl91bml0cyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGZpbHRlcl91bml0c19vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfZmlsdGVyX3VuaXRzX2JzZiA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmlsdGVyX3VuaXRzIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRmlsdGVyVW5pdHNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZmlsdGVyX3VuaXRzX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgICA9ICZmaWx0ZXJfdW5pdHNfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSAmZmlsdGVyX3VuaXRzX2Nsb3NlLAorICAgIC5maWx0ZXIgICAgICAgICA9ICZmaWx0ZXJfdW5pdHNfZmlsdGVyLAorICAgIC5jb2RlY19pZHMgICAgICA9IGZmX2Nic19hbGxfY29kZWNfaWRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZml0cy5jIGIvbGliYXZjb2RlYy9maXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY1MzQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvZml0cy5jCkBAIC0wLDAgKzEsMjAzIEBACisvKgorICogRklUUyBpbXBsZW1lbnRhdGlvbiBvZiBjb21tb24gZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGFyYXMgQ2hhZGhhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJmaXRzLmgiCisKK2ludCBhdnByaXZfZml0c19oZWFkZXJfaW5pdChGSVRTSGVhZGVyICpoZWFkZXIsIEZJVFNIZWFkZXJTdGF0ZSBzdGF0ZSkKK3sKKyAgICBoZWFkZXItPnN0YXRlID0gc3RhdGU7CisgICAgaGVhZGVyLT5uYXhpc19pbmRleCA9IDA7CisgICAgaGVhZGVyLT5ibGFua19mb3VuZCA9IDA7CisgICAgaGVhZGVyLT5wY291bnQgPSAwOworICAgIGhlYWRlci0+Z2NvdW50ID0gMTsKKyAgICBoZWFkZXItPmdyb3VwcyA9IDA7CisgICAgaGVhZGVyLT5yZ2IgPSAwOworICAgIGhlYWRlci0+aW1hZ2VfZXh0ZW5zaW9uID0gMDsKKyAgICBoZWFkZXItPmJzY2FsZSA9IDEuMDsKKyAgICBoZWFkZXItPmJ6ZXJvID0gMDsKKyAgICBoZWFkZXItPmRhdGFfbWluX2ZvdW5kID0gMDsKKyAgICBoZWFkZXItPmRhdGFfbWF4X2ZvdW5kID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaWN0X3NldF9pZl9ub3RfbnVsbChBVkRpY3Rpb25hcnkgKioqbWV0YWRhdGEsIGNoYXIgKmtleXdvcmQsIGNoYXIgKnZhbHVlKQoreworICAgIGlmIChtZXRhZGF0YSkKKyAgICAgICAgYXZfZGljdF9zZXQoKm1ldGFkYXRhLCBrZXl3b3JkLCB2YWx1ZSwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRXh0cmFjdCBrZXl3b3JkIGFuZCB2YWx1ZSBmcm9tIGEgaGVhZGVyIGxpbmUgKDgwIGJ5dGVzKSBhbmQgc3RvcmUgdGhlbSBpbiBrZXl3b3JkIGFuZCB2YWx1ZSBzdHJpbmdzIHJlc3BlY3RpdmVseQorICogQHBhcmFtIHB0cjggcG9pbnRlciB0byB0aGUgZGF0YQorICogQHBhcmFtIGtleXdvcmQgcG9pbnRlciB0byB0aGUgY2hhciBhcnJheSBpbiB3aGljaCBrZXl3b3JkIGlzIHRvIGJlIHN0b3JlZAorICogQHBhcmFtIHZhbHVlIHBvaW50ZXIgdG8gdGhlIGNoYXIgYXJyYXkgaW4gd2hpY2ggdmFsdWUgaXMgdG8gYmUgc3RvcmVkCisgKiBAcmV0dXJuIDAgaWYgY2FsY3VsYXRlZCBzdWNjZXNzZnVsbHkgb3RoZXJ3aXNlIEFWRVJST1JfSU5WQUxJRERBVEEKKyAqLworc3RhdGljIGludCByZWFkX2tleXdvcmRfdmFsdWUoY29uc3QgdWludDhfdCAqcHRyOCwgY2hhciAqa2V5d29yZCwgY2hhciAqdmFsdWUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgOCAmJiBwdHI4W2ldICE9ICcgJzsgaSsrKSB7CisgICAgICAgIGtleXdvcmRbaV0gPSBwdHI4W2ldOworICAgIH0KKyAgICBrZXl3b3JkW2ldID0gJ1wwJzsKKworICAgIGlmIChwdHI4WzhdID09ICc9JykgeworICAgICAgICBpID0gMTA7CisgICAgICAgIHdoaWxlIChpIDwgODAgJiYgcHRyOFtpXSA9PSAnICcpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgODApIHsKKyAgICAgICAgICAgICp2YWx1ZSsrID0gcHRyOFtpXTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmIChwdHI4W2ktMV0gPT0gJ1wnJykgeworICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgODAgJiYgcHRyOFtpXSAhPSAnXCcnOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKnZhbHVlKysgPSBwdHI4W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdmFsdWUrKyA9ICdcJyc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHB0cjhbaS0xXSA9PSAnKCcpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IDgwICYmIHB0cjhbaV0gIT0gJyknOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgKnZhbHVlKysgPSBwdHI4W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqdmFsdWUrKyA9ICcpJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICg7IGkgPCA4MCAmJiBwdHI4W2ldICE9ICcgJyAmJiBwdHI4W2ldICE9ICcvJzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICp2YWx1ZSsrID0gcHRyOFtpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgKnZhbHVlID0gJ1wwJzsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBDSEVDS19LRVlXT1JEKGtleSkgXAorICAgIGlmIChzdHJjbXAoa2V5d29yZCwga2V5KSkgeyBcCisgICAgICAgIGF2X2xvZyhhdmNsLCBBVl9MT0dfRVJST1IsICJleHBlY3RlZCAlcyBrZXl3b3JkLCBmb3VuZCAlcyA9ICVzXG4iLCBrZXksIGtleXdvcmQsIHZhbHVlKTsgXAorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgXAorICAgIH0KKworI2RlZmluZSBDSEVDS19WQUxVRShrZXksIHZhbCkgXAorICAgIGlmIChzc2NhbmYodmFsdWUsICIlZCIsICZoZWFkZXItPnZhbCkgIT0gMSkgeyBcCisgICAgICAgIGF2X2xvZyhhdmNsLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHZhbHVlIG9mICVzIGtleXdvcmQsICVzID0gJXNcbiIsIGtleSwga2V5d29yZCwgdmFsdWUpOyBcCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyBcCisgICAgfQorCitpbnQgYXZwcml2X2ZpdHNfaGVhZGVyX3BhcnNlX2xpbmUodm9pZCAqYXZjbCwgRklUU0hlYWRlciAqaGVhZGVyLCBjb25zdCB1aW50OF90IGxpbmVbODBdLCBBVkRpY3Rpb25hcnkgKioqbWV0YWRhdGEpCit7CisgICAgaW50IGRpbV9ubywgcmV0OworICAgIGludDY0X3QgdDsKKyAgICBkb3VibGUgZDsKKyAgICBjaGFyIGtleXdvcmRbMTBdLCB2YWx1ZVs3Ml0sIGM7CisKKyAgICByZWFkX2tleXdvcmRfdmFsdWUobGluZSwga2V5d29yZCwgdmFsdWUpOworICAgIHN3aXRjaCAoaGVhZGVyLT5zdGF0ZSkgeworICAgIGNhc2UgU1RBVEVfU0lNUExFOgorICAgICAgICBDSEVDS19LRVlXT1JEKCJTSU1QTEUiKTsKKworICAgICAgICBpZiAodmFsdWVbMF0gPT0gJ0YnKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjbCwgQVZfTE9HX1dBUk5JTkcsICJub3QgYSBzdGFuZGFyZCBGSVRTIGZpbGVcbiIpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlWzBdICE9ICdUJykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y2wsIEFWX0xPR19FUlJPUiwgImludmFsaWQgdmFsdWUgb2YgU0lNUExFIGtleXdvcmQsIFNJTVBMRSA9ICVjXG4iLCB2YWx1ZVswXSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlci0+c3RhdGUgPSBTVEFURV9CSVRQSVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBVEVfWFRFTlNJT046CisgICAgICAgIENIRUNLX0tFWVdPUkQoIlhURU5TSU9OIik7CisKKyAgICAgICAgaWYgKCFzdHJjbXAodmFsdWUsICInSU1BR0UgICAnIikpIHsKKyAgICAgICAgICAgIGhlYWRlci0+aW1hZ2VfZXh0ZW5zaW9uID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlci0+c3RhdGUgPSBTVEFURV9CSVRQSVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1RBVEVfQklUUElYOgorICAgICAgICBDSEVDS19LRVlXT1JEKCJCSVRQSVgiKTsKKyAgICAgICAgQ0hFQ0tfVkFMVUUoIkJJVFBJWCIsIGJpdHBpeCk7CisgICAgICAgIGRpY3Rfc2V0X2lmX25vdF9udWxsKG1ldGFkYXRhLCBrZXl3b3JkLCB2YWx1ZSk7CisKKyAgICAgICAgaGVhZGVyLT5zdGF0ZSA9IFNUQVRFX05BWElTOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNUQVRFX05BWElTOgorICAgICAgICBDSEVDS19LRVlXT1JEKCJOQVhJUyIpOworICAgICAgICBDSEVDS19WQUxVRSgiTkFYSVMiLCBuYXhpcyk7CisgICAgICAgIGRpY3Rfc2V0X2lmX25vdF9udWxsKG1ldGFkYXRhLCBrZXl3b3JkLCB2YWx1ZSk7CisKKyAgICAgICAgaWYgKGhlYWRlci0+bmF4aXMpIHsKKyAgICAgICAgICAgIGhlYWRlci0+c3RhdGUgPSBTVEFURV9OQVhJU19OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaGVhZGVyLT5zdGF0ZSA9IFNUQVRFX1JFU1Q7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFURV9OQVhJU19OOgorICAgICAgICByZXQgPSBzc2NhbmYoa2V5d29yZCwgIk5BWElTJWQiLCAmZGltX25vKTsKKyAgICAgICAgaWYgKHJldCAhPSAxIHx8IGRpbV9ubyAhPSBoZWFkZXItPm5heGlzX2luZGV4ICsgMSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y2wsIEFWX0xPR19FUlJPUiwgImV4cGVjdGVkIE5BWElTJWQga2V5d29yZCwgZm91bmQgJXMgPSAlc1xuIiwgaGVhZGVyLT5uYXhpc19pbmRleCArIDEsIGtleXdvcmQsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiVkIiwgJmhlYWRlci0+bmF4aXNuW2hlYWRlci0+bmF4aXNfaW5kZXhdKSAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjbCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCB2YWx1ZSBvZiBOQVhJUyVkIGtleXdvcmQsICVzID0gJXNcbiIsIGhlYWRlci0+bmF4aXNfaW5kZXggKyAxLCBrZXl3b3JkLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGRpY3Rfc2V0X2lmX25vdF9udWxsKG1ldGFkYXRhLCBrZXl3b3JkLCB2YWx1ZSk7CisgICAgICAgIGhlYWRlci0+bmF4aXNfaW5kZXgrKzsKKyAgICAgICAgaWYgKGhlYWRlci0+bmF4aXNfaW5kZXggPT0gaGVhZGVyLT5uYXhpcykgeworICAgICAgICAgICAgaGVhZGVyLT5zdGF0ZSA9IFNUQVRFX1JFU1Q7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFURV9SRVNUOgorICAgICAgICBpZiAoIXN0cmNtcChrZXl3b3JkLCAiQkxBTksiKSAmJiBzc2NhbmYodmFsdWUsICIlIlNDTmQ2NCIiLCAmdCkgPT0gMSkgeworICAgICAgICAgICAgaGVhZGVyLT5ibGFuayA9IHQ7CisgICAgICAgICAgICBoZWFkZXItPmJsYW5rX2ZvdW5kID0gMTsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleXdvcmQsICJCU0NBTEUiKSAmJiBzc2NhbmYodmFsdWUsICIlbGYiLCAmZCkgPT0gMSkgeworICAgICAgICAgICAgaGVhZGVyLT5ic2NhbGUgPSBkOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5d29yZCwgIkJaRVJPIikgJiYgc3NjYW5mKHZhbHVlLCAiJWxmIiwgJmQpID09IDEpIHsKKyAgICAgICAgICAgIGhlYWRlci0+Ynplcm8gPSBkOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5d29yZCwgIkNUWVBFMyIpICYmICFzdHJuY21wKHZhbHVlLCAiJ1JHQiIsIDQpKSB7CisgICAgICAgICAgICBoZWFkZXItPnJnYiA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXl3b3JkLCAiREFUQU1BWCIpICYmIHNzY2FuZih2YWx1ZSwgIiVsZiIsICZkKSA9PSAxKSB7CisgICAgICAgICAgICBoZWFkZXItPmRhdGFfbWF4X2ZvdW5kID0gMTsKKyAgICAgICAgICAgIGhlYWRlci0+ZGF0YV9tYXggPSBkOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5d29yZCwgIkRBVEFNSU4iKSAmJiBzc2NhbmYodmFsdWUsICIlbGYiLCAmZCkgPT0gMSkgeworICAgICAgICAgICAgaGVhZGVyLT5kYXRhX21pbl9mb3VuZCA9IDE7CisgICAgICAgICAgICBoZWFkZXItPmRhdGFfbWluID0gZDsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleXdvcmQsICJFTkQiKSkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXl3b3JkLCAiR1JPVVBTIikgJiYgc3NjYW5mKHZhbHVlLCAiJWMiLCAmYykgPT0gMSkgeworICAgICAgICAgICAgaGVhZGVyLT5ncm91cHMgPSAoYyA9PSAnVCcpOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5d29yZCwgIkdDT1VOVCIpICYmIHNzY2FuZih2YWx1ZSwgIiUiU0NOZDY0IiIsICZ0KSA9PSAxKSB7CisgICAgICAgICAgICBoZWFkZXItPmdjb3VudCA9IHQ7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXl3b3JkLCAiUENPVU5UIikgJiYgc3NjYW5mKHZhbHVlLCAiJSJTQ05kNjQiIiwgJnQpID09IDEpIHsKKyAgICAgICAgICAgIGhlYWRlci0+cGNvdW50ID0gdDsKKyAgICAgICAgfQorICAgICAgICBkaWN0X3NldF9pZl9ub3RfbnVsbChtZXRhZGF0YSwga2V5d29yZCwgdmFsdWUpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ZpdHMuaCBiL2xpYmF2Y29kZWMvZml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWU4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2ZpdHMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogRklUUyBpbWFnZSBmb3JtYXQgY29tbW9uIHByb3RvdHlwZXMgYW5kIHN0cnVjdHVyZXMKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXJhcyBDaGFkaGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0ZJVFNfSAorI2RlZmluZSBBVkNPREVDX0ZJVFNfSAorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisKK3R5cGVkZWYgZW51bSBGSVRTSGVhZGVyU3RhdGUgeworICAgIFNUQVRFX1NJTVBMRSwKKyAgICBTVEFURV9YVEVOU0lPTiwKKyAgICBTVEFURV9CSVRQSVgsCisgICAgU1RBVEVfTkFYSVMsCisgICAgU1RBVEVfTkFYSVNfTiwKKyAgICBTVEFURV9QQ09VTlQsCisgICAgU1RBVEVfR0NPVU5ULAorICAgIFNUQVRFX1JFU1QsCit9IEZJVFNIZWFkZXJTdGF0ZTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGhlYWRlciBrZXl3b3JkcyBpbiBGSVRTIGZpbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgRklUU0hlYWRlciB7CisgICAgRklUU0hlYWRlclN0YXRlIHN0YXRlOworICAgIHVuc2lnbmVkIG5heGlzX2luZGV4OworICAgIGludCBiaXRwaXg7CisgICAgaW50NjRfdCBibGFuazsKKyAgICBpbnQgYmxhbmtfZm91bmQ7CisgICAgaW50IG5heGlzOworICAgIGludCBuYXhpc25bOTk5XTsKKyAgICBpbnQgcGNvdW50OworICAgIGludCBnY291bnQ7CisgICAgaW50IGdyb3VwczsKKyAgICBpbnQgcmdiOyAvKio8IDEgaWYgZmlsZSBjb250YWlucyBSR0IgaW1hZ2UsIDAgb3RoZXJ3aXNlICovCisgICAgaW50IGltYWdlX2V4dGVuc2lvbjsKKyAgICBkb3VibGUgYnNjYWxlOworICAgIGRvdWJsZSBiemVybzsKKyAgICBpbnQgZGF0YV9taW5fZm91bmQ7CisgICAgZG91YmxlIGRhdGFfbWluOworICAgIGludCBkYXRhX21heF9mb3VuZDsKKyAgICBkb3VibGUgZGF0YV9tYXg7Cit9IEZJVFNIZWFkZXI7CisKKworLyoqCisgKiBJbml0aWFsaXplIGEgc2luZ2xlIGhlYWRlciBsaW5lCisgKiBAcGFyYW0gaGVhZGVyIHBvaW50ZXIgdG8gdGhlIGhlYWRlcgorICogQHBhcmFtIHN0YXRlIGN1cnJlbnQgc3RhdGUgb2YgcGFyc2luZyB0aGUgaGVhZGVyCisgKiBAcmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bCBvdGhlcndpc2UgQVZFUlJPUl9JTlZBTElEREFUQQorICovCitpbnQgYXZwcml2X2ZpdHNfaGVhZGVyX2luaXQoRklUU0hlYWRlciAqaGVhZGVyLCBGSVRTSGVhZGVyU3RhdGUgc3RhdGUpOworCisvKioKKyAqIFBhcnNlIGEgc2luZ2xlIGhlYWRlciBsaW5lCisgKiBAcGFyYW0gYXZjbCB1c2VkIGluIGF2X2xvZworICogQHBhcmFtIGhlYWRlciBwb2ludGVyIHRvIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBsaW5lIG9uZSBoZWFkZXIgbGluZQorICogQHBhcmFtIG1ldGFkYXRhIHVzZWQgdG8gc3RvcmUgbWV0YWRhdGEgd2hpbGUgZGVjb2RpbmcKKyAqIEByZXR1cm4gMCBpZiBzdWNjZXNzZnVsIG90aGVyd2lzZSBBVkVSUk9SX0lOVkFMSUREQVRBCisgKi8KK2ludCBhdnByaXZfZml0c19oZWFkZXJfcGFyc2VfbGluZSh2b2lkICphdmNsLCBGSVRTSGVhZGVyICpoZWFkZXIsIGNvbnN0IHVpbnQ4X3QgbGluZVs4MF0sIEFWRGljdGlvbmFyeSAqKiptZXRhZGF0YSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0ZJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9maXRzZGVjLmMgYi9saWJhdmNvZGVjL2ZpdHNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDc1MzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9maXRzZGVjLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBGSVRTIGltYWdlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXJhcyBDaGFkaGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRklUUyBpbWFnZSBkZWNvZGVyCisgKgorICogU3BlY2lmaWNhdGlvbjogaHR0cHM6Ly9maXRzLmdzZmMubmFzYS5nb3YvZml0c19zdGFuZGFyZC5odG1sIFZlcnNpb24gMy4wCisgKgorICogU3VwcG9ydCBhbGwgMmQgaW1hZ2VzIGFsb25nd2l0aCwgYnplcm8sIGJzY2FsZSBhbmQgYmxhbmsga2V5d29yZHMuCisgKiBSR0JBIGltYWdlcyBhcmUgc3VwcG9ydGVkIGFzIE5BWElTMyA9IDMgb3IgNCBpLmUuIFBsYW5lcyBpbiBSR0JBIG9yZGVyLiBBbHNvIENUWVBFID0gJ1JHQiAnIHNob3VsZCBiZSBwcmVzZW50LgorICogQWxzbyB0byBpbnRlcnByZXQgZGF0YSwgdmFsdWVzIGFyZSBsaW5lYXJseSBzY2FsZWQgdXNpbmcgbWluLW1heCBzY2FsaW5nIGJ1dCBub3QgUkdCIGltYWdlcy4KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiZml0cy5oIgorCit0eXBlZGVmIHN0cnVjdCBGSVRTQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGJsYW5rX3ZhbDsKK30gRklUU0NvbnRleHQ7CisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBkYXRhX21pbiBhbmQgZGF0YV9tYXggdmFsdWVzIGZyb20gdGhlIGRhdGEuCisgKiBUaGlzIGlzIGNhbGxlZCBpZiB0aGUgdmFsdWVzIGFyZSBub3QgcHJlc2VudCBpbiB0aGUgaGVhZGVyLgorICogQHBhcmFtIHB0cjggcG9pbnRlciB0byB0aGUgZGF0YQorICogQHBhcmFtIGhlYWRlciBwb2ludGVyIHRvIHRoZSBoZWFkZXIKKyAqIEBwYXJhbSBlbmQgcG9pbnRlciB0byBlbmQgb2YgcGFja2V0CisgKiBAcmV0dXJuIDAgaWYgY2FsY3VsYXRlZCBzdWNjZXNzZnVsbHkgb3RoZXJ3aXNlIEFWRVJST1JfSU5WQUxJRERBVEEKKyAqLworc3RhdGljIGludCBmaWxsX2RhdGFfbWluX21heChjb25zdCB1aW50OF90ICpwdHI4LCBGSVRTSGVhZGVyICpoZWFkZXIsIGNvbnN0IHVpbnQ4X3QgKmVuZCkKK3sKKyAgICB1aW50OF90IHQ4OworICAgIGludDE2X3QgdDE2OworICAgIGludDMyX3QgdDMyOworICAgIGludDY0X3QgdDY0OworICAgIGZsb2F0IHRmbHQ7CisgICAgZG91YmxlIHRkYmw7CisgICAgaW50IGksIGo7CisKKyAgICBoZWFkZXItPmRhdGFfbWluID0gREJMX01BWDsKKyAgICBoZWFkZXItPmRhdGFfbWF4ID0gREJMX01JTjsKKyAgICBzd2l0Y2ggKGhlYWRlci0+Yml0cGl4KSB7CisjZGVmaW5lIENBU0VfTihhLCB0LCByZCkgXAorICAgIGNhc2UgYTogXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVhZGVyLT5uYXhpc25bMV07IGkrKykgeyBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVhZGVyLT5uYXhpc25bMF07IGorKykgeyBcCisgICAgICAgICAgICAgICAgdCA9IHJkOyBcCisgICAgICAgICAgICAgICAgaWYgKCFoZWFkZXItPmJsYW5rX2ZvdW5kIHx8IHQgIT0gaGVhZGVyLT5ibGFuaykgeyBcCisgICAgICAgICAgICAgICAgICAgIGlmICh0ID4gaGVhZGVyLT5kYXRhX21heCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLT5kYXRhX21heCA9IHQ7IFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQgPCBoZWFkZXItPmRhdGFfbWluKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPmRhdGFfbWluID0gdDsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIHB0cjggKz0gYWJzKGEpID4+IDM7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgYnJlYWsKKworICAgICAgICBDQVNFX04oLTY0LCB0ZGJsLCBhdl9pbnQyZG91YmxlKEFWX1JCNjQocHRyOCkpKTsKKyAgICAgICAgQ0FTRV9OKC0zMiwgdGZsdCwgYXZfaW50MmZsb2F0KEFWX1JCMzIocHRyOCkpKTsKKyAgICAgICAgQ0FTRV9OKDgsIHQ4LCBwdHI4WzBdKTsKKyAgICAgICAgQ0FTRV9OKDE2LCB0MTYsIEFWX1JCMTYocHRyOCkpOworICAgICAgICBDQVNFX04oMzIsIHQzMiwgQVZfUkIzMihwdHI4KSk7CisgICAgICAgIENBU0VfTig2NCwgdDY0LCBBVl9SQjY0KHB0cjgpKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZWFkIHRoZSBmaXRzIGhlYWRlciBhbmQgc3RvcmUgdGhlIHZhbHVlcyBpbiBGSVRTSGVhZGVyIHBvaW50ZWQgYnkgaGVhZGVyCisgKiBAcGFyYW0gYXZjdHggQVZDb2RlYyBjb250ZXh0CisgKiBAcGFyYW0gcHRyIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgZGF0YQorICogQHBhcmFtIGhlYWRlciBwb2ludGVyIHRvIHRoZSBGSVRTSGVhZGVyCisgKiBAcGFyYW0gZW5kIHBvaW50ZXIgdG8gZW5kIG9mIHBhY2tldAorICogQHBhcmFtIG1ldGFkYXRhIHBvaW50ZXIgdG8gcG9pbnRlciB0byBBVkRpY3Rpb25hcnkgdG8gc3RvcmUgbWV0YWRhdGEKKyAqIEByZXR1cm4gMCBpZiBjYWxjdWxhdGVkIHN1Y2Nlc3NmdWxseSBvdGhlcndpc2UgQVZFUlJPUl9JTlZBTElEREFUQQorICovCitzdGF0aWMgaW50IGZpdHNfcmVhZF9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICoqcHRyLCBGSVRTSGVhZGVyICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpwdHI4ID0gKnB0cjsKKyAgICBpbnQgbGluZXNfcmVhZCwgYnl0ZXNfbGVmdCwgaSwgcmV0OworICAgIHNpemVfdCBzaXplOworCisgICAgbGluZXNfcmVhZCA9IDE7IC8vIHRvIGFjY291bnQgZm9yIGZpcnN0IGhlYWRlciBsaW5lLCBTSU1QTEUgb3IgWFRFTlNJT04gd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluIHBhY2tldC4uLgorICAgIGF2cHJpdl9maXRzX2hlYWRlcl9pbml0KGhlYWRlciwgU1RBVEVfQklUUElYKTsKKyAgICBkbyB7CisgICAgICAgIGlmIChlbmQgLSBwdHI4IDwgODApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgcmV0ID0gYXZwcml2X2ZpdHNfaGVhZGVyX3BhcnNlX2xpbmUoYXZjdHgsIGhlYWRlciwgcHRyOCwgJm1ldGFkYXRhKTsKKyAgICAgICAgcHRyOCArPSA4MDsKKyAgICAgICAgbGluZXNfcmVhZCsrOworICAgIH0gd2hpbGUgKCFyZXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnl0ZXNfbGVmdCA9ICgoKGxpbmVzX3JlYWQgKyAzNSkgLyAzNikgKiAzNiAtIGxpbmVzX3JlYWQpICogODA7CisgICAgaWYgKGVuZCAtIHB0cjggPCBieXRlc19sZWZ0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBwdHI4ICs9IGJ5dGVzX2xlZnQ7CisKKyAgICBpZiAoaGVhZGVyLT5yZ2IgJiYgKGhlYWRlci0+bmF4aXMgIT0gMyB8fCAoaGVhZGVyLT5uYXhpc25bMl0gIT0gMyAmJiBoZWFkZXItPm5heGlzblsyXSAhPSA0KSkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaWxlIGNvbnRhaW5zIFJHQiBpbWFnZSBidXQgTkFYSVMgPSAlZCBhbmQgTkFYSVMzID0gJWRcbiIsIGhlYWRlci0+bmF4aXMsIGhlYWRlci0+bmF4aXNuWzJdKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKCFoZWFkZXItPnJnYiAmJiBoZWFkZXItPm5heGlzICE9IDIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBudW1iZXIgb2YgZGltZW5zaW9ucywgTkFYSVMgPSAlZFxuIiwgaGVhZGVyLT5uYXhpcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChoZWFkZXItPmJsYW5rX2ZvdW5kICYmIChoZWFkZXItPmJpdHBpeCA9PSAtMzIgfHwgaGVhZGVyLT5iaXRwaXggPT0gLTY0KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQkxBTksga2V5d29yZCBmb3VuZCBidXQgQklUUElYID0gJWRcbi4gSWdub3JpbmcgQkxBTksiLCBoZWFkZXItPmJpdHBpeCk7CisgICAgICAgIGhlYWRlci0+YmxhbmtfZm91bmQgPSAwOworICAgIH0KKworICAgIHNpemUgPSBhYnMoaGVhZGVyLT5iaXRwaXgpID4+IDM7CisgICAgZm9yIChpID0gMDsgaSA8IGhlYWRlci0+bmF4aXM7IGkrKykgeworICAgICAgICBpZiAoaGVhZGVyLT5uYXhpc25baV0gPiBTSVpFX01BWCAvIHNpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgc2l6ZSBvZiBGSVRTIGltYWdlIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBzaXplICo9IGhlYWRlci0+bmF4aXNuW2ldOworICAgIH0KKworICAgIGlmIChlbmQgLSBwdHI4IDwgc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgKnB0ciA9IHB0cjg7CisKKyAgICBpZiAoIWhlYWRlci0+cmdiICYmICghaGVhZGVyLT5kYXRhX21pbl9mb3VuZCB8fCAhaGVhZGVyLT5kYXRhX21heF9mb3VuZCkpIHsKKyAgICAgICAgcmV0ID0gZmlsbF9kYXRhX21pbl9tYXgocHRyOCwgaGVhZGVyLCBlbmQpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIEJJVFBJWCwgJWRcbiIsIGhlYWRlci0+Yml0cGl4KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKgorICAgICAgICAgKiBpbnN0ZWFkIG9mIGFwcGx5aW5nIGJzY2FsZSBhbmQgYnplcm8gdG8gZXZlcnkgZWxlbWVudCwKKyAgICAgICAgICogd2UgY2FuIGRvIGludmVyc2UgdHJhbnNmb3JtYXRpb24gb24gZGF0YV9taW4gYW5kIGRhdGFfbWF4CisgICAgICAgICAqLworICAgICAgICBoZWFkZXItPmRhdGFfbWluID0gKGhlYWRlci0+ZGF0YV9taW4gLSBoZWFkZXItPmJ6ZXJvKSAvIGhlYWRlci0+YnNjYWxlOworICAgICAgICBoZWFkZXItPmRhdGFfbWF4ID0gKGhlYWRlci0+ZGF0YV9tYXggLSBoZWFkZXItPmJ6ZXJvKSAvIGhlYWRlci0+YnNjYWxlOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpdHNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBBVkZyYW1lICpwPWRhdGE7CisgICAgY29uc3QgdWludDhfdCAqcHRyOCA9IGF2cGt0LT5kYXRhLCAqZW5kOworICAgIHVpbnQ4X3QgdDg7CisgICAgaW50MTZfdCB0MTY7CisgICAgaW50MzJfdCB0MzI7CisgICAgaW50NjRfdCB0NjQ7CisgICAgZmxvYXQgICB0Zmx0OworICAgIGRvdWJsZSAgdGRibDsKKyAgICBpbnQgcmV0LCBpLCBqLCBrOworICAgIGNvbnN0IGludCBtYXBbXSA9IHsyLCAwLCAxLCAzfTsgLy8gbWFwcGluZyBmcm9tIEdCUkEgLT4gUkdCQSBhcyBSR0JBIGlzIHRvIGJlIHN0b3JlZCBpbiBGSVRTIGZpbGUuLgorICAgIHVpbnQ4X3QgKmRzdDg7CisgICAgdWludDE2X3QgKmRzdDE2OworICAgIHVpbnQ2NF90IHQ7CisgICAgRklUU0hlYWRlciBoZWFkZXI7CisgICAgRklUU0NvbnRleHQgKiBmaXRzY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGVuZCA9IHB0cjggKyBhdnBrdC0+c2l6ZTsKKyAgICBwLT5tZXRhZGF0YSA9IE5VTEw7CisgICAgcmV0ID0gZml0c19yZWFkX2hlYWRlcihhdmN0eCwgJnB0cjgsICZoZWFkZXIsIGVuZCwgJnAtPm1ldGFkYXRhKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChoZWFkZXIucmdiKSB7CisgICAgICAgIGlmIChoZWFkZXIuYml0cGl4ID09IDgpIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXIubmF4aXNuWzJdID09IDMpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUkFQOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGhlYWRlci5iaXRwaXggPT0gMTYpIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXIubmF4aXNuWzJdID09IDMpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSQVAxNjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgQklUUElYID0gJWRcbiIsIGhlYWRlci5iaXRwaXgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaGVhZGVyLmJpdHBpeCA9PSA4KSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTE2OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgaGVhZGVyLm5heGlzblswXSwgaGVhZGVyLm5heGlzblsxXSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qCisgICAgICogRklUUyBzdG9yZXMgaW1hZ2VzIHdpdGggYm90dG9tIHJvdyBmaXJzdC4gVGhlcmVmb3JlIHdlIGhhdmUKKyAgICAgKiB0byBmaWxsIHRoZSBpbWFnZSBmcm9tIGJvdHRvbSB0byB0b3AuCisgICAgICovCisgICAgaWYgKGhlYWRlci5yZ2IpIHsKKyAgICAgICAgc3dpdGNoKGhlYWRlci5iaXRwaXgpIHsKKyNkZWZpbmUgQ0FTRV9SR0IoY2FzLCBkc3QsIHR5cGUsIGRyZWYpIFwKKyAgICBjYXNlIGNhczogXAorICAgICAgICBmb3IgKGsgPSAwOyBrIDwgaGVhZGVyLm5heGlzblsyXTsgaysrKSB7IFwKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsgXAorICAgICAgICAgICAgICAgIGRzdCA9ICh0eXBlICopIChwLT5kYXRhW21hcFtrXV0gKyAoYXZjdHgtPmhlaWdodCAtIGkgLSAxKSAqIHAtPmxpbmVzaXplW21hcFtrXV0pOyBcCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgdDMyID0gZHJlZihwdHI4KTsgXAorICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlci5ibGFua19mb3VuZCB8fCB0MzIgIT0gaGVhZGVyLmJsYW5rKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSB0MzIgKiBoZWFkZXIuYnNjYWxlICsgaGVhZGVyLmJ6ZXJvOyBcCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBmaXRzY3R4LT5ibGFua192YWw7IFwKKyAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9ICh0eXBlKSB0OyBcCisgICAgICAgICAgICAgICAgICAgIHB0cjggKz0gY2FzID4+IDM7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgQ0FTRV9SR0IoOCwgZHN0OCwgdWludDhfdCwgKik7CisgICAgICAgICAgICBDQVNFX1JHQigxNiwgZHN0MTYsIHVpbnQxNl90LCBBVl9SQjE2KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoaGVhZGVyLmJpdHBpeCkgeworI2RlZmluZSBDQVNFX0dSQVkoY2FzLCBkc3QsIHR5cGUsIHQsIHJkKSBcCisgICAgY2FzZSBjYXM6IFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeyBcCisgICAgICAgICAgICBkc3QgPSAodHlwZSAqKSAocC0+ZGF0YVswXSArIChhdmN0eC0+aGVpZ2h0LWktMSkqIHAtPmxpbmVzaXplWzBdKTsgXAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKSB7IFwKKyAgICAgICAgICAgICAgICB0ID0gcmQ7IFwKKyAgICAgICAgICAgICAgICBpZiAoIWhlYWRlci5ibGFua19mb3VuZCB8fCB0ICE9IGhlYWRlci5ibGFuaykgeyBcCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9ICgodCAtIGhlYWRlci5kYXRhX21pbikgKiAoKDEgPDwgKHNpemVvZih0eXBlKSAqIDgpKSAtIDEpKSAvIChoZWFkZXIuZGF0YV9tYXggLSBoZWFkZXIuZGF0YV9taW4pOyBcCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBmaXRzY3R4LT5ibGFua192YWw7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICBwdHI4ICs9IGFicyhjYXMpID4+IDM7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgQ0FTRV9HUkFZKC02NCwgZHN0MTYsIHVpbnQxNl90LCB0ZGJsLCBhdl9pbnQyZG91YmxlKEFWX1JCNjQocHRyOCkpKTsKKyAgICAgICAgICAgIENBU0VfR1JBWSgtMzIsIGRzdDE2LCB1aW50MTZfdCwgdGZsdCwgYXZfaW50MmZsb2F0KEFWX1JCMzIocHRyOCkpKTsKKyAgICAgICAgICAgIENBU0VfR1JBWSg4LCBkc3Q4LCB1aW50OF90LCB0OCwgcHRyOFswXSk7CisgICAgICAgICAgICBDQVNFX0dSQVkoMTYsIGRzdDE2LCB1aW50MTZfdCwgdDE2LCBBVl9SQjE2KHB0cjgpKTsKKyAgICAgICAgICAgIENBU0VfR1JBWSgzMiwgZHN0MTYsIHVpbnQxNl90LCB0MzIsIEFWX1JCMzIocHRyOCkpOworICAgICAgICAgICAgQ0FTRV9HUkFZKDY0LCBkc3QxNiwgdWludDE2X3QsIHQ2NCwgQVZfUkI2NChwdHI4KSk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBCSVRQSVgsICVkXG4iLCBoZWFkZXIuYml0cGl4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHAtPmtleV9mcmFtZSA9IDE7CisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZpdHNfb3B0aW9uc1tdID0geworICAgIHsgImJsYW5rX3ZhbHVlIiwgInZhbHVlIHRoYXQgaXMgdXNlZCB0byByZXBsYWNlIEJMQU5LIHBpeGVscyBpbiBkYXRhIGFycmF5Iiwgb2Zmc2V0b2YoRklUU0NvbnRleHQsIGJsYW5rX3ZhbCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCA2NTUzNSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19WSURFT19QQVJBTX0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmaXRzX2RlY29kZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiRklUUyBkZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZml0c19vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9maXRzX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZpdHMiLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9GSVRTLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGSVRTQ29udGV4dCksCisgICAgLmRlY29kZSAgICAgICAgID0gZml0c19kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmxleGlibGUgSW1hZ2UgVHJhbnNwb3J0IFN5c3RlbSIpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZmaXRzX2RlY29kZXJfY2xhc3MKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ZpdHNlbmMuYyBiL2xpYmF2Y29kZWMvZml0c2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDUwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2ZpdHNlbmMuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIEZJVFMgaW1hZ2UgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhcmFzIENoYWRoYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBGSVRTIGltYWdlIGVuY29kZXIKKyAqCisgKiBTcGVjaWZpY2F0aW9uOiBodHRwczovL2ZpdHMuZ3NmYy5uYXNhLmdvdi9maXRzX3N0YW5kYXJkLmh0bWwgVmVyc2lvbiAzLjAKKyAqCisgKiBSR0JBIGltYWdlcyBhcmUgZW5jb2RlZCBhcyBwbGFuZXMgaW4gUkdCQSBvcmRlci4gU28sIE5BWElTMyBpcyAzIG9yIDQgZm9yIHRoZW0uCisgKiBBbHNvIENUWVBFMyA9ICdSR0IgJyBpcyBhZGRlZCB0byB0aGUgaGVhZGVyIHRvIGRpc3Rpbmd1aXNoIHRoZW0gZnJvbSAzZCBpbWFnZXMuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgZml0c19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnBpY3QsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBBVkZyYW1lICogY29uc3QgcCA9IChBVkZyYW1lICopcGljdDsKKyAgICB1aW50OF90ICpieXRlc3RyZWFtLCAqYnl0ZXN0cmVhbV9zdGFydCwgKnB0cjsKKyAgICBjb25zdCB1aW50MTZfdCBmbGlwID0gKDEgPDwgMTUpOworICAgIHVpbnQ2NF90IGRhdGFfc2l6ZSA9IDAsIHBhZGRlZF9kYXRhX3NpemUgPSAwOworICAgIGludCByZXQsIGJpdHBpeCwgbmF4aXMzID0gMSwgaSwgaiwgaywgYnl0ZXNfbGVmdDsKKyAgICBpbnQgbWFwW10gPSB7MiwgMCwgMSwgM307IC8vIG1hcHBpbmcgZnJvbSBHQlJBIC0+IFJHQkEgYXMgUkdCQSBpcyB0byBiZSBzdG9yZWQgaW4gRklUUyBmaWxlLi4KKworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNkJFOgorICAgICAgICBtYXBbMF0gPSAwOyAvLyBncmF5c2NhbGUgaW1hZ2VzIHNob3VsZCBiZSBkaXJlY3RseSBtYXBwZWQKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTgpIHsKKyAgICAgICAgICAgIGJpdHBpeCA9IDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiaXRwaXggPSAxNjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CisgICAgICAgIGJpdHBpeCA9IDg7CisgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlApIHsKKyAgICAgICAgICAgIG5heGlzMyA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYXhpczMgPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNkJFOgorICAgICAgICBiaXRwaXggPSAxNjsKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSUDE2QkUpIHsKKyAgICAgICAgICAgIG5heGlzMyA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuYXhpczMgPSA0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBkYXRhX3NpemUgPSAoYml0cGl4ID4+IDMpICogYXZjdHgtPmhlaWdodCAqIGF2Y3R4LT53aWR0aCAqIG5heGlzMzsKKyAgICBwYWRkZWRfZGF0YV9zaXplID0gKChkYXRhX3NpemUgKyAyODc5KSAvIDI4ODAgKSAqIDI4ODA7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcGFkZGVkX2RhdGFfc2l6ZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGJ5dGVzdHJlYW1fc3RhcnQgPQorICAgIGJ5dGVzdHJlYW0gICAgICAgPSBwa3QtPmRhdGE7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgbmF4aXMzOyBrKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgcHRyID0gcC0+ZGF0YVttYXBba11dICsgKGF2Y3R4LT5oZWlnaHQgLSBpIC0gMSkgKiBwLT5saW5lc2l6ZVttYXBba11dOworICAgICAgICAgICAgaWYgKGJpdHBpeCA9PSAxNikgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+d2lkdGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICAvLyBzdWJ0cmFjdGluZyBiemVybyBpcyBlcXVpdmFsZW50IHRvIGZpcnN0IGJpdCBmbGlwCisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ5dGVzdHJlYW0sIEFWX1JCMTYocHRyKSBeIGZsaXApOworICAgICAgICAgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweShieXRlc3RyZWFtLCBwdHIsIGF2Y3R4LT53aWR0aCk7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbSArPSBhdmN0eC0+d2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBieXRlc19sZWZ0ID0gcGFkZGVkX2RhdGFfc2l6ZSAtIGRhdGFfc2l6ZTsKKyAgICBtZW1zZXQoYnl0ZXN0cmVhbSwgMCwgYnl0ZXNfbGVmdCk7CisgICAgYnl0ZXN0cmVhbSArPSBieXRlc19sZWZ0OworCisgICAgcGt0LT5zaXplICAgPSBieXRlc3RyZWFtIC0gYnl0ZXN0cmVhbV9zdGFydDsKKyAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9maXRzX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZpdHMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGbGV4aWJsZSBJbWFnZSBUcmFuc3BvcnQgU3lzdGVtIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0ZJVFMsCisgICAgLmVuY29kZTIgICAgICAgID0gZml0c19lbmNvZGVfZnJhbWUsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfR0JSQVAxNkJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0dCUlAxNkJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0dCUlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfR1JBWTE2QkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZmxhYy5jIGIvbGliYXZjb2RlYy9mbGFjLmMKaW5kZXggZjUxNTRiOS4uNWZmYmY5MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mbGFjLmMKKysrIGIvbGliYXZjb2RlYy9mbGFjLmMKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSAwOwogfQogCi12b2lkIGZmX2ZsYWNfcGFyc2Vfc3RyZWFtaW5mbyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHN0cnVjdCBGTEFDU3RyZWFtaW5mbyAqcywKK2ludCBmZl9mbGFjX3BhcnNlX3N0cmVhbWluZm8oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBzdHJ1Y3QgRkxBQ1N0cmVhbWluZm8gKnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIpCiB7CiAgICAgR2V0Qml0Q29udGV4dCBnYjsKQEAgLTIxMyw2ICsyMTMsNyBAQAogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiaW52YWxpZCBtYXggYmxvY2tzaXplOiAlZFxuIiwKICAgICAgICAgICAgICAgIHMtPm1heF9ibG9ja3NpemUpOwogICAgICAgICBzLT5tYXhfYmxvY2tzaXplID0gMTY7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAogICAgIHNraXBfYml0cygmZ2IsIDI0KTsgLyogc2tpcCBtaW4gZnJhbWUgc2l6ZSAqLwpAQCAtMjIyLDYgKzIyMywxMiBAQAogICAgIHMtPmNoYW5uZWxzID0gZ2V0X2JpdHMoJmdiLCAzKSArIDE7CiAgICAgcy0+YnBzID0gZ2V0X2JpdHMoJmdiLCA1KSArIDE7CiAKKyAgICBpZiAocy0+YnBzIDwgNCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgYnBzOiAlZFxuIiwgcy0+YnBzKTsKKyAgICAgICAgcy0+YnBzID0gMTY7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIGF2Y3R4LT5jaGFubmVscyA9IHMtPmNoYW5uZWxzOwogICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZXJhdGU7CiAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBzLT5icHM7CkBAIC0yMzQsNCArMjQxLDYgQEAKIAogICAgIHNraXBfYml0c19sb25nKCZnYiwgNjQpOyAvKiBtZDUgc3VtICovCiAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCA2NCk7IC8qIG1kNSBzdW0gKi8KKworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbGFjLmggYi9saWJhdmNvZGVjL2ZsYWMuaAppbmRleCA5NmQ5NzFjLi45OTFhYjQzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZsYWMuaAorKysgYi9saWJhdmNvZGVjL2ZsYWMuaApAQCAtOTUsOCArOTUsMTAgQEAKICAqIEBwYXJhbVtvdXRdIGF2Y3R4ICAgY29kZWMgY29udGV4dCB0byBzZXQgYmFzaWMgc3RyZWFtIHBhcmFtZXRlcnMKICAqIEBwYXJhbVtvdXRdIHMgICAgICAgd2hlcmUgcGFyc2VkIGluZm9ybWF0aW9uIGlzIHN0b3JlZAogICogQHBhcmFtW2luXSAgYnVmZmVyICBwb2ludGVyIHRvIHN0YXJ0IG9mIDM0LWJ5dGUgc3RyZWFtaW5mbyBkYXRhCisgKgorICogQHJldHVybiBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaXVyZSBvciA+PSAwIG9uIHN1Y2Nlc3MKICAqLwotdm9pZCBmZl9mbGFjX3BhcnNlX3N0cmVhbWluZm8oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBzdHJ1Y3QgRkxBQ1N0cmVhbWluZm8gKnMsCitpbnQgZmZfZmxhY19wYXJzZV9zdHJlYW1pbmZvKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgc3RydWN0IEZMQUNTdHJlYW1pbmZvICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyKTsKIAogLyoqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ZsYWNfcGFyc2VyLmMgYi9saWJhdmNvZGVjL2ZsYWNfcGFyc2VyLmMKaW5kZXggMzcyMzcxNi4uMjcyMTI4NiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mbGFjX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvZmxhY19wYXJzZXIuYwpAQCAtNDAsNyArNDAsNyBAQAogI2luY2x1ZGUgImZsYWMuaCIKIAogLyoqIG1heGltdW0gbnVtYmVyIG9mIGFkamFjZW50IGhlYWRlcnMgdGhhdCBjb21wYXJlIENSQ3MgYWdhaW5zdCBlYWNoIG90aGVyICAgKi8KLSNkZWZpbmUgRkxBQ19NQVhfU0VRVUVOVElBTF9IRUFERVJTIDMKKyNkZWZpbmUgRkxBQ19NQVhfU0VRVUVOVElBTF9IRUFERVJTIDQKIC8qKiBtaW5pbXVtIG51bWJlciBvZiBoZWFkZXJzIGJ1ZmZlcmVkIGFuZCBjaGVja2VkIGJlZm9yZSByZXR1cm5pbmcgZnJhbWVzICAgICovCiAjZGVmaW5lIEZMQUNfTUlOX0hFQURFUlMgMTAKIC8qKiBlc3RpbWF0ZSBmb3IgYXZlcmFnZSBzaXplIG9mIGEgRkxBQyBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01ODYsMTAgKzU4NiwxMiBAQAogICAgICAgICAgICAgdGVtcCA9IGN1cnItPm5leHQ7CiAgICAgICAgICAgICBhdl9mcmVlcCgmY3Vyci0+bGlua19wZW5hbHR5KTsKICAgICAgICAgICAgIGF2X2ZyZWUoY3Vycik7CisgICAgICAgICAgICBmcGMtPm5iX2hlYWRlcnNfYnVmZmVyZWQtLTsKICAgICAgICAgfQogICAgICAgICBmcGMtPmhlYWRlcnMgPSBmcGMtPmJlc3RfaGVhZGVyLT5uZXh0OwogICAgICAgICBhdl9mcmVlcCgmZnBjLT5iZXN0X2hlYWRlci0+bGlua19wZW5hbHR5KTsKICAgICAgICAgYXZfZnJlZXAoJmZwYy0+YmVzdF9oZWFkZXIpOworICAgICAgICBmcGMtPm5iX2hlYWRlcnNfYnVmZmVyZWQtLTsKICAgICB9CiAKICAgICAvKiBGaW5kIGFuZCBzY29yZSBuZXcgaGVhZGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTYxNyw4ICs2MTksOCBAQAogCiAgICAgICAgIGlmICghYXZfZmlmb19zcGFjZShmcGMtPmZpZm9fYnVmKSAmJgogICAgICAgICAgICAgYXZfZmlmb19zaXplKGZwYy0+Zmlmb19idWYpIC8gRkxBQ19BVkdfRlJBTUVfU0laRSA+Ci0gICAgICAgICAgICBmcGMtPm5iX2hlYWRlcnNfYnVmZmVyZWQgKiAxMCkgewotICAgICAgICAgICAgLyogVGhlcmUgaXMgbGVzcyB0aGFuIG9uZSB2YWxpZCBmbGFjIGhlYWRlciBidWZmZXJlZCBmb3IgMTAgaGVhZGVycworICAgICAgICAgICAgZnBjLT5uYl9oZWFkZXJzX2J1ZmZlcmVkICogMjApIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGlzIGxlc3MgdGhhbiBvbmUgdmFsaWQgZmxhYyBoZWFkZXIgYnVmZmVyZWQgZm9yIDIwIGhlYWRlcnMKICAgICAgICAgICAgICAqIGJ1ZmZlcmVkLiBUaGVyZWZvcmUgdGhlIGZpZm8gaXMgbW9zdCBsaWtlbHkgZmlsbGVkIHdpdGggaW52YWxpZAogICAgICAgICAgICAgICogZGF0YSBhbmQgdGhlIGlucHV0IGlzIG5vdCBhIGZsYWMgZmlsZS4gKi8KICAgICAgICAgICAgIGdvdG8gaGFuZGxlX2Vycm9yOwpAQCAtNjM4LDcgKzY0MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9lbmQgLSByZWFkX3N0YXJ0LCBOVUxMKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludDhfdCBwYWRbTUFYX0ZSQU1FX0hFQURFUl9TSVpFXSA9IHsgMCB9OwotICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGZwYy0+Zmlmb19idWYsICh2b2lkKikgcGFkLCBzaXplb2YocGFkKSwgTlVMTCk7CisgICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoZnBjLT5maWZvX2J1ZiwgcGFkLCBzaXplb2YocGFkKSwgTlVMTCk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBUYWcgaGVhZGVycyBhbmQgdXBkYXRlIHNlcXVlbmNlcy4gKi8KQEAgLTY4NCwxMiArNjg2LDE3IEBACiAgICAgfQogCiAgICAgZm9yIChjdXJyID0gZnBjLT5oZWFkZXJzOyBjdXJyOyBjdXJyID0gY3Vyci0+bmV4dCkgewotICAgICAgICBpZiAoY3Vyci0+bWF4X3Njb3JlID4gMCAmJgotICAgICAgICAgICAgKCFmcGMtPmJlc3RfaGVhZGVyIHx8IGN1cnItPm1heF9zY29yZSA+IGZwYy0+YmVzdF9oZWFkZXItPm1heF9zY29yZSkpIHsKKyAgICAgICAgaWYgKCFmcGMtPmJlc3RfaGVhZGVyIHx8IGN1cnItPm1heF9zY29yZSA+IGZwYy0+YmVzdF9oZWFkZXItPm1heF9zY29yZSkgewogICAgICAgICAgICAgZnBjLT5iZXN0X2hlYWRlciA9IGN1cnI7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAoZnBjLT5iZXN0X2hlYWRlciAmJiBmcGMtPmJlc3RfaGVhZGVyLT5tYXhfc2NvcmUgPD0gMCkgeworICAgICAgICAvLyBPbmx5IGFjY2VwdCBhIGJhZCBoZWFkZXIgaWYgdGhlcmUgaXMgbm8gb3RoZXIgb3B0aW9uIHRvIGNvbnRpbnVlCisgICAgICAgIGlmICghYnVmX3NpemUgfHwgIWJ1ZiB8fCByZWFkX2VuZCAhPSBidWYgfHwgZnBjLT5uYl9oZWFkZXJzX2J1ZmZlcmVkIDwgRkxBQ19NSU5fSEVBREVSUykKKyAgICAgICAgICAgIGZwYy0+YmVzdF9oZWFkZXIgPSBOVUxMOworICAgIH0KKwogICAgIGlmIChmcGMtPmJlc3RfaGVhZGVyKSB7CiAgICAgICAgIGZwYy0+YmVzdF9oZWFkZXJfdmFsaWQgPSAxOwogICAgICAgICBpZiAoZnBjLT5iZXN0X2hlYWRlci0+b2Zmc2V0ID4gMCkgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbGFjZGVjLmMgYi9saWJhdmNvZGVjL2ZsYWNkZWMuYwppbmRleCBiNzIzN2UxLi5jOGViNDU2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZsYWNkZWMuYworKysgYi9saWJhdmNvZGVjL2ZsYWNkZWMuYwpAQCAtMTA5LDcgKzEwOSw5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgLyogaW5pdGlhbGl6ZSBiYXNlZCBvbiB0aGUgZGVtdXhlci1zdXBwbGllZCBzdHJlYW1kYXRhIGhlYWRlciAqLwotICAgIGZmX2ZsYWNfcGFyc2Vfc3RyZWFtaW5mbyhhdmN0eCwgJnMtPmZsYWNfc3RyZWFtX2luZm8sIHN0cmVhbWluZm8pOworICAgIHJldCA9IGZmX2ZsYWNfcGFyc2Vfc3RyZWFtaW5mbyhhdmN0eCwgJnMtPmZsYWNfc3RyZWFtX2luZm8sIHN0cmVhbWluZm8pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogICAgIHJldCA9IGFsbG9jYXRlX2J1ZmZlcnMocyk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC0xNzUsNyArMTc3LDkgQEAKICAgICAgICAgbWV0YWRhdGFfc2l6ZSAhPSBGTEFDX1NUUkVBTUlORk9fU0laRSkgewogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9Ci0gICAgZmZfZmxhY19wYXJzZV9zdHJlYW1pbmZvKHMtPmF2Y3R4LCAmcy0+ZmxhY19zdHJlYW1faW5mbywgJmJ1Zls4XSk7CisgICAgcmV0ID0gZmZfZmxhY19wYXJzZV9zdHJlYW1pbmZvKHMtPmF2Y3R4LCAmcy0+ZmxhY19zdHJlYW1faW5mbywgJmJ1Zls4XSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAgICAgcmV0ID0gYWxsb2NhdGVfYnVmZmVycyhzKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTIwMSwxMiArMjA1LDEyIEBACiAgICAgYnVmICs9IDQ7CiAgICAgZG8gewogICAgICAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IDQpCi0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBmbGFjX3BhcnNlX2Jsb2NrX2hlYWRlcihidWYsICZtZXRhZGF0YV9sYXN0LCBOVUxMLCAmbWV0YWRhdGFfc2l6ZSk7CiAgICAgICAgIGJ1ZiArPSA0OwogICAgICAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IG1ldGFkYXRhX3NpemUpIHsKICAgICAgICAgICAgIC8qIG5lZWQgbW9yZSBkYXRhIGluIG9yZGVyIHRvIHJlYWQgdGhlIGNvbXBsZXRlIGhlYWRlciAqLwotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogICAgICAgICBidWYgKz0gbWV0YWRhdGFfc2l6ZTsKICAgICB9IHdoaWxlICghbWV0YWRhdGFfbGFzdCk7CkBAIC0yMTYsMjAgKzIyMCwyNyBAQAogCiBzdGF0aWMgaW50IGRlY29kZV9yZXNpZHVhbHMoRkxBQ0NvbnRleHQgKnMsIGludDMyX3QgKmRlY29kZWQsIGludCBwcmVkX29yZGVyKQogeworICAgIEdldEJpdENvbnRleHQgZ2IgPSBzLT5nYjsKICAgICBpbnQgaSwgdG1wLCBwYXJ0aXRpb24sIG1ldGhvZF90eXBlLCByaWNlX29yZGVyOwogICAgIGludCByaWNlX2JpdHMsIHJpY2VfZXNjOwogICAgIGludCBzYW1wbGVzOwogCi0gICAgbWV0aG9kX3R5cGUgPSBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgIG1ldGhvZF90eXBlID0gZ2V0X2JpdHMoJmdiLCAyKTsKKyAgICByaWNlX29yZGVyICA9IGdldF9iaXRzKCZnYiwgNCk7CisKKyAgICBzYW1wbGVzICAgPSBzLT5ibG9ja3NpemUgPj4gcmljZV9vcmRlcjsKKyAgICByaWNlX2JpdHMgPSA0ICsgbWV0aG9kX3R5cGU7CisgICAgcmljZV9lc2MgID0gKDEgPDwgcmljZV9iaXRzKSAtIDE7CisKKyAgICBkZWNvZGVkICs9IHByZWRfb3JkZXI7CisgICAgaSAgICAgICAgPSBwcmVkX29yZGVyOworCiAgICAgaWYgKG1ldGhvZF90eXBlID4gMSkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgcmVzaWR1YWwgY29kaW5nIG1ldGhvZCAlZFxuIiwKICAgICAgICAgICAgICAgIG1ldGhvZF90eXBlKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgcmljZV9vcmRlciA9IGdldF9iaXRzKCZzLT5nYiwgNCk7Ci0KLSAgICBzYW1wbGVzPSBzLT5ibG9ja3NpemUgPj4gcmljZV9vcmRlcjsKICAgICBpZiAoc2FtcGxlcyA8PCByaWNlX29yZGVyICE9IHMtPmJsb2Nrc2l6ZSkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcmljZSBvcmRlcjogJWkgYmxvY2tzaXplICVpXG4iLAogICAgICAgICAgICAgICAgcmljZV9vcmRlciwgcy0+YmxvY2tzaXplKTsKQEAgLTI0MiwyNSArMjUzLDI5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIHJpY2VfYml0cyA9IDQgKyBtZXRob2RfdHlwZTsKLSAgICByaWNlX2VzYyAgPSAoMSA8PCByaWNlX2JpdHMpIC0gMTsKLQotICAgIGRlY29kZWQgKz0gcHJlZF9vcmRlcjsKLSAgICBpPSBwcmVkX29yZGVyOwogICAgIGZvciAocGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgKDEgPDwgcmljZV9vcmRlcik7IHBhcnRpdGlvbisrKSB7Ci0gICAgICAgIHRtcCA9IGdldF9iaXRzKCZzLT5nYiwgcmljZV9iaXRzKTsKKyAgICAgICAgdG1wID0gZ2V0X2JpdHMoJmdiLCByaWNlX2JpdHMpOwogICAgICAgICBpZiAodG1wID09IHJpY2VfZXNjKSB7Ci0gICAgICAgICAgICB0bXAgPSBnZXRfYml0cygmcy0+Z2IsIDUpOworICAgICAgICAgICAgdG1wID0gZ2V0X2JpdHMoJmdiLCA1KTsKICAgICAgICAgICAgIGZvciAoOyBpIDwgc2FtcGxlczsgaSsrKQotICAgICAgICAgICAgICAgICpkZWNvZGVkKysgPSBnZXRfc2JpdHNfbG9uZygmcy0+Z2IsIHRtcCk7CisgICAgICAgICAgICAgICAgKmRlY29kZWQrKyA9IGdldF9zYml0c19sb25nKCZnYiwgdG1wKTsKICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCByZWFsX2xpbWl0ID0gdG1wID8gKElOVF9NQVggPj4gdG1wKSArIDIgOiBJTlRfTUFYOwogICAgICAgICAgICAgZm9yICg7IGkgPCBzYW1wbGVzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAqZGVjb2RlZCsrID0gZ2V0X3NyX2dvbG9tYl9mbGFjKCZzLT5nYiwgdG1wLCBJTlRfTUFYLCAwKTsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IGdldF9zcl9nb2xvbWJfZmxhYygmZ2IsIHRtcCwgcmVhbF9saW1pdCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHYgPT0gMHg4MDAwMDAwMCl7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCByZXNpZHVhbFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpkZWNvZGVkKysgPSB2OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGk9IDA7CiAgICAgfQogCisgICAgcy0+Z2IgPSBnYjsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNjgsNyArMjgzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVkX29yZGVyLCBpbnQgYnBzKQogewogICAgIGNvbnN0IGludCBibG9ja3NpemUgPSBzLT5ibG9ja3NpemU7Ci0gICAgaW50IGF2X3VuaW5pdChhKSwgYXZfdW5pbml0KGIpLCBhdl91bmluaXQoYyksIGF2X3VuaW5pdChkKSwgaTsKKyAgICB1bnNpZ25lZCBhdl91bmluaXQoYSksIGF2X3VuaW5pdChiKSwgYXZfdW5pbml0KGMpLCBhdl91bmluaXQoZCk7CisgICAgaW50IGk7CiAgICAgaW50IHJldDsKIAogICAgIC8qIHdhcm0gdXAgc2FtcGxlcyAqLwpAQCAtMjg2LDcgKzMwMiw3IEBACiAgICAgaWYgKHByZWRfb3JkZXIgPiAyKQogICAgICAgICBjID0gYiAtIGRlY29kZWRbcHJlZF9vcmRlci0yXSArIGRlY29kZWRbcHJlZF9vcmRlci0zXTsKICAgICBpZiAocHJlZF9vcmRlciA+IDMpCi0gICAgICAgIGQgPSBjIC0gZGVjb2RlZFtwcmVkX29yZGVyLTJdICsgMipkZWNvZGVkW3ByZWRfb3JkZXItM10gLSBkZWNvZGVkW3ByZWRfb3JkZXItNF07CisgICAgICAgIGQgPSBjIC0gZGVjb2RlZFtwcmVkX29yZGVyLTJdICsgMlUqZGVjb2RlZFtwcmVkX29yZGVyLTNdIC0gZGVjb2RlZFtwcmVkX29yZGVyLTRdOwogCiAgICAgc3dpdGNoIChwcmVkX29yZGVyKSB7CiAgICAgY2FzZSAwOgpAQCAtMzE1LDcgKzMzMSw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGxwY19hbmFseXplX3JlbW9kdWxhdGUoaW50MzJfdCAqZGVjb2RlZCwgY29uc3QgaW50IGNvZWZmc1szMl0sCitzdGF0aWMgdm9pZCBscGNfYW5hbHl6ZV9yZW1vZHVsYXRlKFNVSU5UMzIgKmRlY29kZWQsIGNvbnN0IGludCBjb2VmZnNbMzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGludCBxbGV2ZWwsIGludCBsZW4sIGludCBicHMpCiB7CiAgICAgaW50IGksIGo7CkBAIC0zMzEsNyArMzQ3LDcgQEAKICAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IG9yZGVyOyBpLS0pIHsKICAgICAgICAgaW50NjRfdCBwID0gMDsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9yZGVyOyBqKyspCi0gICAgICAgICAgICBwICs9IGNvZWZmc1tqXSAqIChpbnQ2NF90KWRlY29kZWRbaS1vcmRlcitqXTsKKyAgICAgICAgICAgIHAgKz0gY29lZmZzW2pdICogKGludDY0X3QpKGludDMyX3QpZGVjb2RlZFtpLW9yZGVyK2pdOwogICAgICAgICBkZWNvZGVkW2ldIC09IHAgPj4gcWxldmVsOwogICAgIH0KICAgICBmb3IgKGkgPSBvcmRlcjsgaSA8IGxlbjsgaSsrLCBkZWNvZGVkKyspIHsKQEAgLTQ0NCwxMCArNDYwLDEwIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGlmICh3YXN0ZWQpIHsKKyAgICBpZiAod2FzdGVkICYmIHdhc3RlZCA8IDMyKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YmxvY2tzaXplOyBpKyspCi0gICAgICAgICAgICBkZWNvZGVkW2ldIDw8PSB3YXN0ZWQ7CisgICAgICAgICAgICBkZWNvZGVkW2ldID0gKHVuc2lnbmVkKWRlY29kZWRbaV0gPDwgd2FzdGVkOwogICAgIH0KIAogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbGFjZHNwLmMgYi9saWJhdmNvZGVjL2ZsYWNkc3AuYwppbmRleCAzMGI2NjQ4Li5iYzlhNWRiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZsYWNkc3AuYworKysgYi9saWJhdmNvZGVjL2ZsYWNkc3AuYwpAQCAtNDksOCArNDksOCBAQAogICAgIGludCBpLCBqOwogCiAgICAgZm9yIChpID0gcHJlZF9vcmRlcjsgaSA8IGxlbiAtIDE7IGkgKz0gMiwgZGVjb2RlZCArPSAyKSB7Ci0gICAgICAgIGludCBjID0gY29lZmZzWzBdOwotICAgICAgICBpbnQgZCA9IGRlY29kZWRbMF07CisgICAgICAgIFNVSU5UIGMgPSBjb2VmZnNbMF07CisgICAgICAgIFNVSU5UIGQgPSBkZWNvZGVkWzBdOwogICAgICAgICBpbnQgczAgPSAwLCBzMSA9IDA7CiAgICAgICAgIGZvciAoaiA9IDE7IGogPCBwcmVkX29yZGVyOyBqKyspIHsKICAgICAgICAgICAgIHMwICs9IGMqZDsKQEAgLTU5LDE1ICs1OSwxNSBAQAogICAgICAgICAgICAgYyA9IGNvZWZmc1tqXTsKICAgICAgICAgfQogICAgICAgICBzMCArPSBjKmQ7Ci0gICAgICAgIGQgPSBkZWNvZGVkW2pdICs9IHMwID4+IHFsZXZlbDsKKyAgICAgICAgZCA9IGRlY29kZWRbal0gKz0gKFNVSU5UKShzMCA+PiBxbGV2ZWwpOwogICAgICAgICBzMSArPSBjKmQ7Ci0gICAgICAgIGRlY29kZWRbaiArIDFdICs9IHMxID4+IHFsZXZlbDsKKyAgICAgICAgZGVjb2RlZFtqICsgMV0gKz0gKFNVSU5UKShzMSA+PiBxbGV2ZWwpOwogICAgIH0KICAgICBpZiAoaSA8IGxlbikgewogICAgICAgICBpbnQgc3VtID0gMDsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IHByZWRfb3JkZXI7IGorKykKLSAgICAgICAgICAgIHN1bSArPSBjb2VmZnNbal0gKiBkZWNvZGVkW2pdOwotICAgICAgICBkZWNvZGVkW2pdICs9IHN1bSA+PiBxbGV2ZWw7CisgICAgICAgICAgICBzdW0gKz0gY29lZmZzW2pdICogKFNVSU5UKWRlY29kZWRbal07CisgICAgICAgIGRlY29kZWRbal0gPSBkZWNvZGVkW2pdICsgKHVuc2lnbmVkKShzdW0gPj4gcWxldmVsKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZmxhY2RzcC5oIGIvbGliYXZjb2RlYy9mbGFjZHNwLmgKaW5kZXggZjVjYmQ5NC4uN2JiMGRkMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mbGFjZHNwLmgKKysrIGIvbGliYXZjb2RlYy9mbGFjZHNwLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNkZWZpbmUgQVZDT0RFQ19GTEFDRFNQX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgRkxBQ0RTUENvbnRleHQgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbGFjZHNwX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2ZsYWNkc3BfdGVtcGxhdGUuYwppbmRleCA2MmMwYTE1Li43NzZjNzhkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZsYWNkc3BfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2ZsYWNkc3BfdGVtcGxhdGUuYwpAQCAtNTYsNyArNTYsNyBAQAogCiAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykKLSAgICAgICAgICAgIFMoc2FtcGxlcywgaSwgaikgPSBpbltpXVtqXSA8PCBzaGlmdDsKKyAgICAgICAgICAgIFMoc2FtcGxlcywgaSwgaikgPSAoaW50KSgodW5zaWduZWQpaW5baV1bal0gPDwgc2hpZnQpOwogfQogCiBzdGF0aWMgdm9pZCBGVU5DKGZsYWNfZGVjb3JyZWxhdGVfbHNfYykodWludDhfdCAqKm91dCwgaW50MzJfdCAqKmluLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbGFjZW5jLmMgYi9saWJhdmNvZGVjL2ZsYWNlbmMuYwppbmRleCBhOTFlZDE5Li4xNzBjM2NhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZsYWNlbmMuYworKysgYi9saWJhdmNvZGVjL2ZsYWNlbmMuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRtYXRoLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21kNS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKwogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJic3dhcGRzcC5oIgogI2luY2x1ZGUgInB1dF9iaXRzLmgiCkBAIC00Myw2ICs0NCw3IEBACiAjZGVmaW5lIE1BWF9QQVJUSVRJT05fT1JERVIgOAogI2RlZmluZSBNQVhfUEFSVElUSU9OUyAgICAgKDEgPDwgTUFYX1BBUlRJVElPTl9PUkRFUikKICNkZWZpbmUgTUFYX0xQQ19QUkVDSVNJT04gIDE1CisjZGVmaW5lIE1JTl9MUENfU0hJRlQgICAgICAgMAogI2RlZmluZSBNQVhfTFBDX1NISUZUICAgICAgMTUKIAogZW51bSBDb2RpbmdNb2RlIHsKQEAgLTI2Niw3ICsyNjgsNyBAQAogCiAgICAgLyogZmluZCBzYW1wbGVyYXRlIGluIHRhYmxlICovCiAgICAgaWYgKGZyZXEgPCAxKQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgZm9yIChpID0gNDsgaSA8IDEyOyBpKyspIHsKICAgICAgICAgaWYgKGZyZXEgPT0gZmZfZmxhY19zYW1wbGVfcmF0ZV90YWJsZVtpXSkgewogICAgICAgICAgICAgcy0+c2FtcGxlcmF0ZSA9IGZmX2ZsYWNfc2FtcGxlX3JhdGVfdGFibGVbaV07CkBAIC04ODMsNyArODg1LDcgQEAKICAgICBvcHRfb3JkZXIgPSBmZl9scGNfY2FsY19jb2Vmcygmcy0+bHBjX2N0eCwgc21wLCBuLCBtaW5fb3JkZXIsIG1heF9vcmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vcHRpb25zLmxwY19jb2VmZl9wcmVjaXNpb24sIGNvZWZzLCBzaGlmdCwgcy0+b3B0aW9ucy5scGNfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vcHRpb25zLmxwY19wYXNzZXMsIG9tZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0xQQ19TSElGVCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlOX0xQQ19TSElGVCwgTUFYX0xQQ19TSElGVCwgMCk7CiAKICAgICBpZiAob21ldGhvZCA9PSBPUkRFUl9NRVRIT0RfMkxFVkVMIHx8CiAgICAgICAgIG9tZXRob2QgPT0gT1JERVJfTUVUSE9EXzRMRVZFTCB8fApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbGljdmlkZW8uYyBiL2xpYmF2Y29kZWMvZmxpY3ZpZGVvLmMKaW5kZXggM2UwNTczYS4uYmE1YmRhNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mbGljdmlkZW8uYworKysgYi9saWJhdmNvZGVjL2ZsaWN2aWRlby5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIEZMSS9GTEMgQW5pbWF0aW9uIFZpZGVvIERlY29kZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMywgMjAwNCBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNCBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMjcsOCArMjcsNyBAQAogICogdmFyaWF0aW9ucywgdmlzaXQ6CiAgKiAgIGh0dHA6Ly93d3cuY29tcHVwaGFzZS5jb20vZmxpYy5odG0KICAqCi0gKiBUaGlzIGRlY29kZXIgb3V0cHV0cyBQQUw4L1JHQjU1NS9SR0I1NjUgYW5kIG1heWJlIG9uZSBkYXkgUkdCMjQKLSAqIGNvbG9yc3BhY2UgZGF0YSwgZGVwZW5kaW5nIG9uIHRoZSBGTEMuIFRvIHVzZSB0aGlzIGRlY29kZXIsIGJlCisgKiBUaGlzIGRlY29kZXIgb3V0cHV0cyBQQUw4L1JHQjU1NS9SR0I1NjUvQkdSMjQuIFRvIHVzZSB0aGlzIGRlY29kZXIsIGJlCiAgKiBzdXJlIHRoYXQgeW91ciBkZW11eGVyIHNlbmRzIHRoZSBGTEkgZmlsZSBoZWFkZXIgdG8gdGhlIGRlY29kZXIgdmlhCiAgKiB0aGUgZXh0cmFkYXRhIGNodW5rIGluIEFWQ29kZWNDb250ZXh0LiBUaGUgY2h1bmsgc2hvdWxkIGJlIDEyOCBieXRlcwogICogbGFyZ2UuIFRoZSBvbmx5IGV4Y2VwdGlvbiBpcyBmb3IgRkxJIGZpbGVzIGZyb20gdGhlIGdhbWUgIk1hZ2ljIENhcnBldCIsCkBAIC0xMzMsOSArMTMyLDcgQEAKICAgICAgICAgY2FzZSA4ICA6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OyBicmVhazsKICAgICAgICAgY2FzZSAxNSA6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7IGJyZWFrOwogICAgICAgICBjYXNlIDE2IDogYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU2NTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQgOiBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7IC8qIFN1cHBvc2VkbHkgQkdSLCBidXQgaGF2ZW50IGFueSBmaWxlcyB0byB0ZXN0IHdpdGggKi8KLSAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIjI0QnBwIEZMQy9GTFgiKTsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgY2FzZSAyNCA6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQgOgogICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIEZMQy9GTFggZGVwdGggb2YgJWQgQnBwIGlzIHVuc3VwcG9ydGVkLlxuIixkZXB0aCk7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTIwMiw2ICsxOTksOSBAQAogICAgIG51bV9jaHVua3MgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZzIpOwogICAgIGJ5dGVzdHJlYW0yX3NraXAoJmcyLCA4KTsgIC8qIHNraXAgcGFkZGluZyAqLwogCisgICAgaWYgKGZyYW1lX3NpemUgPCAxNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKICAgICBmcmFtZV9zaXplIC09IDE2OwogCiAgICAgLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSBjaHVua3MgKi8KQEAgLTI3MiwxMCArMjcyLDE0IEBACiAgICAgICAgICAgICB3aGlsZSAoY29tcHJlc3NlZF9saW5lcyA+IDApIHsKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgMiA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICh5X3B0ciA+IHBpeGVsX2xpbWl0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBsaW5lX3BhY2tldHMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZzIpOwogICAgICAgICAgICAgICAgIGlmICgobGluZV9wYWNrZXRzICYgMHhDMDAwKSA9PSAweEMwMDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbGluZSBza2lwIG9wY29kZQogICAgICAgICAgICAgICAgICAgICBsaW5lX3BhY2tldHMgPSAtbGluZV9wYWNrZXRzOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZV9wYWNrZXRzID4gcy0+YXZjdHgtPmhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICB5X3B0ciArPSBsaW5lX3BhY2tldHMgKiBzLT5mcmFtZS0+bGluZXNpemVbMF07CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgobGluZV9wYWNrZXRzICYgMHhDMDAwKSA9PSAweDQwMDApIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmRlZmluZWQgb3Bjb2RlICgleCkgaW4gREVMVEFfRkxJXG4iLCBsaW5lX3BhY2tldHMpOwpAQCAtMzI0LDYgKzMyOCw4IEBACiAgICAgICAgIGNhc2UgRkxJX0xDOgogICAgICAgICAgICAgLyogbGluZSBjb21wcmVzc2VkICovCiAgICAgICAgICAgICBzdGFydGluZ19saW5lID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICAgICAgICAgIGlmIChzdGFydGluZ19saW5lID49IHMtPmF2Y3R4LT5oZWlnaHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB5X3B0ciA9IDA7CiAgICAgICAgICAgICB5X3B0ciArPSBzdGFydGluZ19saW5lICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdOwogCkBAIC00MjMsNyArNDI5LDcgQEAKIAogICAgICAgICBjYXNlIEZMSV9DT1BZOgogICAgICAgICAgICAgLyogY29weSB0aGUgY2h1bmsgKHVuY29tcHJlc3NlZCBmcmFtZSkgKi8KLSAgICAgICAgICAgIGlmIChjaHVua19zaXplIC0gNiAhPSBzLT5hdmN0eC0+d2lkdGggKiBzLT5hdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSAtIDYgIT0gRkZBTElHTihzLT5hdmN0eC0+d2lkdGgsIDQpICogcy0+YXZjdHgtPmhlaWdodCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW4gY2h1bmsgRkxJX0NPUFkgOiBzb3VyY2UgZGF0YSAoJWQgYnl0ZXMpICIgXAogICAgICAgICAgICAgICAgICAgICAgICAiaGFzIGluY29ycmVjdCBzaXplLCBza2lwcGluZyBjaHVua1xuIiwgY2h1bmtfc2l6ZSAtIDYpOwogICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmcyLCBjaHVua19zaXplIC0gNik7CkBAIC00MzIsNiArNDM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgIHlfcHRyICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSkgewogICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnMiwgJnBpeGVsc1t5X3B0cl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT53aWR0aCAmIDMpCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgNCAtIChzLT5hdmN0eC0+d2lkdGggJiAzKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC00NDUsOCArNDUzLDEyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdHJlYW1fcHRyX2FmdGVyX2NodW5rIC0gYnl0ZXN0cmVhbTJfdGVsbCgmZzIpID4gMCkKKyAgICAgICAgaWYgKHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmsgLSBieXRlc3RyZWFtMl90ZWxsKCZnMikgPj0gMCkgewogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmsgLSBieXRlc3RyZWFtMl90ZWxsKCZnMikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDaHVuayBvdmVycmVhZFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogCiAgICAgICAgIGZyYW1lX3NpemUgLT0gY2h1bmtfc2l6ZTsKICAgICAgICAgbnVtX2NodW5rcy0tOwpAQCAtNTIwLDYgKzUzMiw4IEBACiAgICAgaWYgKGZyYW1lX3NpemUgPiBidWZfc2l6ZSkKICAgICAgICAgZnJhbWVfc2l6ZSA9IGJ1Zl9zaXplOwogCisgICAgaWYgKGZyYW1lX3NpemUgPCAxNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgZnJhbWVfc2l6ZSAtPSAxNjsKIAogICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCB0aGUgY2h1bmtzICovCkBAIC01NTYsOSArNTcwLDEzIEBACiAgICAgICAgICAgICB3aGlsZSAoY29tcHJlc3NlZF9saW5lcyA+IDApIHsKICAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmZzIpICsgMiA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmICh5X3B0ciA+IHBpeGVsX2xpbWl0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBsaW5lX3BhY2tldHMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZzIpOwogICAgICAgICAgICAgICAgIGlmIChsaW5lX3BhY2tldHMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGxpbmVfcGFja2V0cyA9IC1saW5lX3BhY2tldHM7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lX3BhY2tldHMgPiBzLT5hdmN0eC0+aGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgICAgIHlfcHRyICs9IGxpbmVfcGFja2V0cyAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkX2xpbmVzLS07CkBAIC03MTEsNyArNzI5LDcgQEAKICAgICAgICAgY2FzZSBGTElfQ09QWToKICAgICAgICAgY2FzZSBGTElfRFRBX0NPUFk6CiAgICAgICAgICAgICAvKiBjb3B5IHRoZSBjaHVuayAodW5jb21wcmVzc2VkIGZyYW1lKSAqLwotICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgLSA2ID4gKHVuc2lnbmVkIGludCkocy0+YXZjdHgtPndpZHRoICogcy0+YXZjdHgtPmhlaWdodCkqMikgeworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgLSA2ID4gKHVuc2lnbmVkIGludCkoRkZBTElHTihzLT5hdmN0eC0+d2lkdGgsIDIpICogcy0+YXZjdHgtPmhlaWdodCkqMikgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW4gY2h1bmsgRkxJX0NPUFkgOiBzb3VyY2UgZGF0YSAoJWQgYnl0ZXMpICIgXAogICAgICAgICAgICAgICAgICAgICAgICAiYmlnZ2VyIHRoYW4gaW1hZ2UsIHNraXBwaW5nIGNodW5rXG4iLCBjaHVua19zaXplIC0gNik7CiAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIGNodW5rX3NpemUgLSA2KTsKQEAgLTcyNyw2ICs3NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAyOwogICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93bi0tOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+d2lkdGggJiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIDIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzQxLDYgKzc2MSwxMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoc3RyZWFtX3B0cl9hZnRlcl9jaHVuayAtIGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSA+PSAwKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgc3RyZWFtX3B0cl9hZnRlcl9jaHVuayAtIGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNodW5rIG92ZXJyZWFkXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZnJhbWVfc2l6ZSAtPSBjaHVua19zaXplOwogICAgICAgICBudW1fY2h1bmtzLS07CiAgICAgfQpAQCAtNzYzLDggKzc5MCwyODcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQogewotICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIjI0QnBwIEZMQyBVbnN1cHBvcnRlZCBkdWUgdG8gbGFjayBvZiB0ZXN0IGZpbGVzLlxuIik7Ci0gIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICBGbGljRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBHZXRCeXRlQ29udGV4dCBnMjsKKyAgICBpbnQgcGl4ZWxfcHRyOworICAgIHVuc2lnbmVkIGNoYXIgcGFsZXR0ZV9pZHgxOworCisgICAgdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CisgICAgaW50IG51bV9jaHVua3M7CisKKyAgICB1bnNpZ25lZCBpbnQgY2h1bmtfc2l6ZTsKKyAgICBpbnQgY2h1bmtfdHlwZTsKKworICAgIGludCBpLCBqLCByZXQ7CisKKyAgICBpbnQgbGluZXM7CisgICAgaW50IGNvbXByZXNzZWRfbGluZXM7CisgICAgc2lnbmVkIHNob3J0IGxpbmVfcGFja2V0czsKKyAgICBpbnQgeV9wdHI7CisgICAgaW50IGJ5dGVfcnVuOworICAgIGludCBwaXhlbF9za2lwOworICAgIGludCBwaXhlbF9jb3VudGRvd247CisgICAgdW5zaWduZWQgY2hhciAqcGl4ZWxzOworICAgIGludCBwaXhlbDsKKyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfbGltaXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnMiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwaXhlbHMgPSBzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBwaXhlbF9saW1pdCA9IHMtPmF2Y3R4LT5oZWlnaHQgKiBzLT5mcmFtZS0+bGluZXNpemVbMF07CisKKyAgICBmcmFtZV9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmcyKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgMik7ICAvKiBza2lwIHRoZSBtYWdpYyBudW1iZXIgKi8KKyAgICBudW1fY2h1bmtzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgOCk7ICAvKiBza2lwIHBhZGRpbmcgKi8KKyAgICBpZiAoZnJhbWVfc2l6ZSA+IGJ1Zl9zaXplKQorICAgICAgICBmcmFtZV9zaXplID0gYnVmX3NpemU7CisKKyAgICBpZiAoZnJhbWVfc2l6ZSA8IDE2KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBmcmFtZV9zaXplIC09IDE2OworCisgICAgLyogaXRlcmF0ZSB0aHJvdWdoIHRoZSBjaHVua3MgKi8KKyAgICB3aGlsZSAoKGZyYW1lX3NpemUgPiAwKSAmJiAobnVtX2NodW5rcyA+IDApICYmCisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZzIpID49IDQpIHsKKyAgICAgICAgaW50IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bms7CisgICAgICAgIGNodW5rX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZzIpOworICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IGZyYW1lX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2h1bmtfc2l6ZSA9ICV1ID4gZnJhbWVfc2l6ZSA9ICV1XG4iLCBjaHVua19zaXplLCBmcmFtZV9zaXplKTsKKyAgICAgICAgICAgIGNodW5rX3NpemUgPSBmcmFtZV9zaXplOworICAgICAgICB9CisgICAgICAgIHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmsgPSBieXRlc3RyZWFtMl90ZWxsKCZnMikgLSA0ICsgY2h1bmtfc2l6ZTsKKworICAgICAgICBjaHVua190eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKworCisgICAgICAgIHN3aXRjaCAoY2h1bmtfdHlwZSkgeworICAgICAgICBjYXNlIEZMSV8yNTZfQ09MT1I6CisgICAgICAgIGNhc2UgRkxJX0NPTE9SOgorICAgICAgICAgICAgLyogRm9yIHNvbWUgcmVhc29uLCBpdCBzZWVtcyB0aGF0IG5vbi1wYWxldHRpemVkIGZsaWNzIGRvCisgICAgICAgICAgICAgKiBpbmNsdWRlIG9uZSBvZiB0aGVzZSBjaHVua3MgaW4gdGhlaXIgZmlyc3QgZnJhbWUuCisgICAgICAgICAgICAgKiBXaHkgSSBkbyBub3Qga25vdywgaXQgc2VlbXMgcmF0aGVyIGV4dHJhbmVvdXMuICovCisgICAgICAgICAgICBmZl9kbG9nKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBQYWxldHRlIGNodW5rICVkIGluIG5vbi1wYWxldHRpemVkIEZMQ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtfdHlwZSk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgY2h1bmtfc2l6ZSAtIDYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGTElfREVMVEE6CisgICAgICAgIGNhc2UgRkxJX0RUQV9MQzoKKyAgICAgICAgICAgIHlfcHRyID0gMDsKKyAgICAgICAgICAgIGNvbXByZXNzZWRfbGluZXMgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmZzIpOworICAgICAgICAgICAgd2hpbGUgKGNvbXByZXNzZWRfbGluZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSArIDIgPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoeV9wdHIgPiBwaXhlbF9saW1pdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgbGluZV9wYWNrZXRzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmcyKTsKKyAgICAgICAgICAgICAgICBpZiAobGluZV9wYWNrZXRzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBsaW5lX3BhY2tldHMgPSAtbGluZV9wYWNrZXRzOworICAgICAgICAgICAgICAgICAgICBpZiAobGluZV9wYWNrZXRzID4gcy0+YXZjdHgtPmhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICB5X3B0ciArPSBsaW5lX3BhY2tldHMgKiBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9saW5lcy0tOworICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgPSB5X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDApOworICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24gPSBzLT5hdmN0eC0+d2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lX3BhY2tldHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogYWNjb3VudCBmb3IgdGhlIHNraXAgYnl0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnMikgKyAyID4gc3RyZWFtX3B0cl9hZnRlcl9jaHVuaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NraXAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IChwaXhlbF9za2lwKjMpOyAvKiBQaXhlbCBpcyAzIGJ5dGVzIHdpZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biAtPSBwaXhlbF9za2lwOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9ydW4gPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlX3J1biA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IC1ieXRlX3J1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTI0KCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDMgKiBieXRlX3J1bik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJ5dGVfcnVuOyBqKyssIHBpeGVsX2NvdW50ZG93biAtPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dMMjQoJnBpeGVsc1twaXhlbF9wdHJdLCBwaXhlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSArIDIqYnl0ZV9ydW4gPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMiAqIGJ5dGVfcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnl0ZV9ydW47IGorKywgcGl4ZWxfY291bnRkb3duLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgPSBieXRlc3RyZWFtMl9nZXRfbGUyNCgmZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTDI0KCZwaXhlbHNbcGl4ZWxfcHRyXSwgcGl4ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB5X3B0ciArPSBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGTElfTEM6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuZXhwZWN0ZWQgRkxJX0xDIGNodW5rIGluIG5vbi1wYWxldHRpemVkIEZMQ1xuIik7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgY2h1bmtfc2l6ZSAtIDYpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGTElfQkxBQ0s6CisgICAgICAgICAgICAvKiBzZXQgdGhlIHdob2xlIGZyYW1lIHRvIDB4MDAgd2hpY2ggaXMgYmxhY2sgZm9yIDI0IGJpdCBtb2RlLiAqLworICAgICAgICAgICAgbWVtc2V0KHBpeGVscywgMHgwMCwKKyAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bGluZXNpemVbMF0gKiBzLT5hdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxJX0JSVU46CisgICAgICAgICAgICB5X3B0ciA9IDA7CisgICAgICAgICAgICBmb3IgKGxpbmVzID0gMDsgbGluZXMgPCBzLT5hdmN0eC0+aGVpZ2h0OyBsaW5lcysrKSB7CisgICAgICAgICAgICAgICAgcGl4ZWxfcHRyID0geV9wdHI7CisgICAgICAgICAgICAgICAgLyogZGlzcmVnYXJkIHRoZSBsaW5lIHBhY2tldHM7IGluc3RlYWQsIGl0ZXJhdGUgdGhyb3VnaCBhbGwKKyAgICAgICAgICAgICAgICAgKiBwaXhlbHMgb24gYSByb3cgKi8KKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgMSk7CisgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duID0gKHMtPmF2Y3R4LT53aWR0aCAqIDMpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKHBpeGVsX2NvdW50ZG93biA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSArIDEgPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVfcnVuID0gc2lnbl9leHRlbmQoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmcyKSwgOCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlX3J1biA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVfaWR4MSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoYnl0ZV9ydW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJ5dGVfcnVuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNbcGl4ZWxfcHRyKytdID0gcGFsZXR0ZV9pZHgxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93bi0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbF9jb3VudGRvd24gPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBpeGVsX2NvdW50ZG93biA8IDAgKCVkKSAobGluZWElZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24sIGxpbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8qIGNvcHkgYnl0ZXMgaWYgYnl0ZV9ydW4gPCAwICovCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IC1ieXRlX3J1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnMikgKyBieXRlX3J1biA+IHN0cmVhbV9wdHJfYWZ0ZXJfY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoYnl0ZV9ydW4pOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJ5dGVfcnVuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxldHRlX2lkeDEgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZzIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1twaXhlbF9wdHIrK10gPSBwYWxldHRlX2lkeDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBpeGVsX2NvdW50ZG93biA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGl4ZWxfY291bnRkb3duIDwgMCAoJWQpIGF0IGxpbmUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24sIGxpbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHlfcHRyICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkxJX0RUQV9CUlVOOgorICAgICAgICAgICAgeV9wdHIgPSAwOworICAgICAgICAgICAgZm9yIChsaW5lcyA9IDA7IGxpbmVzIDwgcy0+YXZjdHgtPmhlaWdodDsgbGluZXMrKykgeworICAgICAgICAgICAgICAgIHBpeGVsX3B0ciA9IHlfcHRyOworICAgICAgICAgICAgICAgIC8qIGRpc3JlZ2FyZCB0aGUgbGluZSBwYWNrZXRzOyBpbnN0ZWFkLCBpdGVyYXRlIHRocm91Z2ggYWxsCisgICAgICAgICAgICAgICAgICogcGl4ZWxzIG9uIGEgcm93ICovCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIDEpOworICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biA9IHMtPmF2Y3R4LT53aWR0aDsgLyogV2lkdGggaXMgaW4gcGl4ZWxzLCBub3QgYnl0ZXMgKi8KKworICAgICAgICAgICAgICAgIHdoaWxlIChwaXhlbF9jb3VudGRvd24gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnMikgKyAxID4gc3RyZWFtX3B0cl9hZnRlcl9jaHVuaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnMiksIDgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYnl0ZV9ydW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCA9IGJ5dGVzdHJlYW0yX2dldF9sZTI0KCZnMik7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19QSVhFTF9QVFIoMyAqIGJ5dGVfcnVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBieXRlX3J1bjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0wyNChwaXhlbHMgKyBwaXhlbF9wdHIsIHBpeGVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfY291bnRkb3duIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbF9jb3VudGRvd24gPCAwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgLyogY29weSBwaXhlbHMgaWYgYnl0ZV9ydW4gPCAwICovCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlX3J1biA9IC1ieXRlX3J1bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZnMikgKyAzICogYnl0ZV9ydW4gPiBzdHJlYW1fcHRyX2FmdGVyX2NodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDMgKiBieXRlX3J1bik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnl0ZV9ydW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMjQoJmcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTDI0KHBpeGVscyArIHBpeGVsX3B0ciwgcGl4ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciAgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24tLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfY291bnRkb3duIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbF9jb3VudGRvd24gPCAwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9jb3VudGRvd24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeV9wdHIgKz0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGTElfQ09QWToKKyAgICAgICAgY2FzZSBGTElfRFRBX0NPUFk6CisgICAgICAgICAgICAvKiBjb3B5IHRoZSBjaHVuayAodW5jb21wcmVzc2VkIGZyYW1lKSAqLworICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgLSA2ID4gKHVuc2lnbmVkIGludCkoRkZBTElHTihzLT5hdmN0eC0+d2lkdGgsIDIpICogcy0+YXZjdHgtPmhlaWdodCkqMykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW4gY2h1bmsgRkxJX0NPUFkgOiBzb3VyY2UgZGF0YSAoJWQgYnl0ZXMpICIgXAorICAgICAgICAgICAgICAgICAgICAgICAiYmlnZ2VyIHRoYW4gaW1hZ2UsIHNraXBwaW5nIGNodW5rXG4iLCBjaHVua19zaXplIC0gNik7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZzIsIGNodW5rX3NpemUgLSA2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh5X3B0ciA9IDA7IHlfcHRyIDwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdICogcy0+YXZjdHgtPmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgIHlfcHRyICs9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSkgeworCisgICAgICAgICAgICAgICAgICAgIHBpeGVsX2NvdW50ZG93biA9IHMtPmF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBpeGVsX2NvdW50ZG93biA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMjQoJmcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dMMjQoJnBpeGVsc1t5X3B0ciArIHBpeGVsX3B0cl0sIHBpeGVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfY291bnRkb3duLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT53aWR0aCAmIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGTElfTUlOSToKKyAgICAgICAgICAgIC8qIHNvbWUgc29ydCBvZiBhIHRodW1ibmFpbD8gZGlzcmVnYXJkIHRoaXMgY2h1bmsuLi4gKi8KKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmcyLCBjaHVua19zaXplIC0gNik7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnJlY29nbml6ZWQgY2h1bmsgdHlwZTogJWRcbiIsIGNodW5rX3R5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyZWFtX3B0cl9hZnRlcl9jaHVuayAtIGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSA+PSAwKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnMiwgc3RyZWFtX3B0cl9hZnRlcl9jaHVuayAtIGJ5dGVzdHJlYW0yX3RlbGwoJmcyKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNodW5rIG92ZXJyZWFkXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWVfc2l6ZSAtPSBjaHVua19zaXplOworICAgICAgICBudW1fY2h1bmtzLS07CisgICAgfQorCisgICAgLyogYnkgdGhlIGVuZCBvZiB0aGUgY2h1bmssIHRoZSBzdHJlYW0gcHRyIHNob3VsZCBlcXVhbCB0aGUgZnJhbWUKKyAgICAgKiBzaXplIChtaW51cyAxLCBwb3NzaWJseSk7IGlmIGl0IGRvZXNuJ3QsIGlzc3VlIGEgd2FybmluZyAqLworICAgIGlmICgoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmcyKSAhPSAwKSAmJiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmcyKSAhPSAxKSkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcm9jZXNzZWQgRkxJIGNodW5rIHdoZXJlIGNodW5rIHNpemUgPSAlZCAiIFwKKyAgICAgICAgICAgICAgICJhbmQgZmluYWwgY2h1bmsgcHRyID0gJWRcbiIsIGJ1Zl9zaXplLCBieXRlc3RyZWFtMl90ZWxsKCZnMikpOworCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+ZnJhbWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBidWZfc2l6ZTsKIH0KIAogc3RhdGljIGludCBmbGljX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCkBAIC03NzQsMjIgKzEwODAsMjAgQEAKICAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKICAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7Ci0gICAgICByZXR1cm4gZmxpY19kZWNvZGVfZnJhbWVfOEJQUChhdmN0eCwgZGF0YSwgZ290X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfc2l6ZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjU1NSkgfHwKLSAgICAgICAgICAgICAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I1NjUpKSB7Ci0gICAgICByZXR1cm4gZmxpY19kZWNvZGVfZnJhbWVfMTVfMTZCUFAoYXZjdHgsIGRhdGEsIGdvdF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1Zl9zaXplKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1IyNCkgewotICAgICAgcmV0dXJuIGZsaWNfZGVjb2RlX2ZyYW1lXzI0QlBQKGF2Y3R4LCBkYXRhLCBnb3RfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgIHJldHVybiBmbGljX2RlY29kZV9mcmFtZV84QlBQKGF2Y3R4LCBkYXRhLCBnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX3NpemUpOworICAgIH0gZWxzZSBpZiAoKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNTU1KSB8fAorICAgICAgICAgICAgICAgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNTY1KSkgeworICAgICAgICByZXR1cm4gZmxpY19kZWNvZGVfZnJhbWVfMTVfMTZCUFAoYXZjdHgsIGRhdGEsIGdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX3NpemUpOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1IyNCkgeworICAgICAgICByZXR1cm4gZmxpY19kZWNvZGVfZnJhbWVfMjRCUFAoYXZjdHgsIGRhdGEsIGdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmX3NpemUpOwogICAgIH0KIAogICAgIC8qIFNob3VsZCBub3QgZ2V0ICBoZXJlLCBldmVyIGFzIHRoZSBwaXhfZm10IGlzIHByb2Nlc3NlZCAqLwogICAgIC8qIGluIGZsaWNfZGVjb2RlX2luaXQgYW5kIHRoZSBhYm92ZSBpZiBzaG91bGQgZGVhbCB3aXRoICovCi0gICAgLyogdGhlIGZpbml0ZSBzZXQgb2YgcG9zc2liaWxpdGVzIGFsbG93YWJsZSBieSBoZXJlLiAqLworICAgIC8qIHRoZSBmaW5pdGUgc2V0IG9mIHBvc3NpYmlsaXRpZXMgYWxsb3dhYmxlIGJ5IGhlcmUuICovCiAgICAgLyogQnV0IGluIGNhc2Ugd2UgZG8sIGp1c3QgZXJyb3Igb3V0LiAqLwogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBGTEMgZm9ybWF0LCBteSBzY2llbmNlIGNhbm5vdCBleHBsYWluIGhvdyB0aGlzIGhhcHBlbmVkLlxuIik7CiAgICAgcmV0dXJuIEFWRVJST1JfQlVHOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbHZkZWMuYyBiL2xpYmF2Y29kZWMvZmx2ZGVjLmMKaW5kZXggZjc0YmEzZi4uZjliZWI0MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mbHZkZWMuYworKysgYi9saWJhdmNvZGVjL2ZsdmRlYy5jCkBAIC0xMjMsNiArMTIzLDcgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCiAgICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSwKICAgICAubWF4X2xvd3JlcyAgICAgPSAzLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1lVVjQyMFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbHZlbmMuYyBiL2xpYmF2Y29kZWMvZmx2ZW5jLmMKaW5kZXggYTJjZDM5OS4uMTVmNzk0ZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9mbHZlbmMuYworKysgYi9saWJhdmNvZGVjL2ZsdmVuYy5jCkBAIC0zMSw3ICszMSw3IEBACiAgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKCZzLT5wYik7CiAKICAgICBwdXRfYml0cygmcy0+cGIsIDE3LCAxKTsKLSAgICAvKiAwOiBoMjYzIGVzY2FwZSBjb2RlcyAxOiAxMS1iaXQgZXNjYXBlIGNvZGVzICovCisgICAgLyogMDogSC4yNjMgZXNjYXBlIGNvZGVzIDE6IDExLWJpdCBlc2NhcGUgY29kZXMgKi8KICAgICBwdXRfYml0cygmcy0+cGIsIDUsIChzLT5oMjYzX2ZsdiAtIDEpKTsKICAgICBwdXRfYml0cygmcy0+cGIsIDgsCiAgICAgICAgICAgICAgKCgoaW50NjRfdCkgcy0+cGljdHVyZV9udW1iZXIgKiAzMCAqIHMtPmF2Y3R4LT50aW1lX2Jhc2UubnVtKSAvICAgLy8gRklYTUUgdXNlIHRpbWVzdGFtcApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mbXZjLmMgYi9saWJhdmNvZGVjL2ZtdmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDZiOTBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9mbXZjLmMKQEAgLTAsMCArMSw2MzYgQEAKKy8qCisgKiBGTSBTY3JlZW4gQ2FwdHVyZSBDb2RlYyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBCTE9DS19IRUlHSFQgMTEydQorI2RlZmluZSBCTE9DS19XSURUSCAgODR1CisKK3R5cGVkZWYgc3RydWN0IEludGVyQmxvY2sgeworICAgIGludCAgICAgIHcsIGg7CisgICAgaW50ICAgICAgc2l6ZTsKKyAgICBpbnQgICAgICB4b3I7Cit9IEludGVyQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IEZNVkNDb250ZXh0IHsKKyAgICBHZXRCeXRlQ29udGV4dCAgZ2I7CisgICAgUHV0Qnl0ZUNvbnRleHQgIHBiOworICAgIHVpbnQ4X3QgICAgICAgICpidWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgIGJ1ZmZlcl9zaXplOworICAgIHVpbnQ4X3QgICAgICAgICpwYnVmZmVyOworICAgIHNpemVfdCAgICAgICAgICBwYnVmZmVyX3NpemU7CisgICAgcHRyZGlmZl90ICAgICAgIHN0cmlkZTsKKyAgICBpbnQgICAgICAgICAgICAgYnBwOworICAgIGludCAgICAgICAgICAgICB5YiwgeGI7CisgICAgSW50ZXJCbG9jayAgICAgKmJsb2NrczsKKyAgICB1bnNpZ25lZCAgICAgICAgbmJfYmxvY2tzOworfSBGTVZDQ29udGV4dDsKKworc3RhdGljIGludCBkZWNvZGVfdHlwZTIoR2V0Qnl0ZUNvbnRleHQgKmdiLCBQdXRCeXRlQ29udGV4dCAqcGIpCit7CisgICAgdW5zaWduZWQgcmVwZWF0ID0gMCwgZmlyc3QgPSAxLCBvcGNvZGUgPSAwOworICAgIGludCBpLCBsZW4sIHBvczsKKworICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPiAwKSB7CisgICAgICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKworICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpID4gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpIC0gMTc7CisgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPCA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gYnl0ZXN0cmVhbTJfcGVla19ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlIDwgMHgxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IC0gKG9wY29kZSA+PiAyKSAtIDQgKiBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgLSAyMDQ5OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBwYi0+YnVmZmVyX3N0YXJ0LCBwYi0+YnVmZmVyX2VuZCAtIHBiLT5idWZmZXJfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiYywgYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSArIHBvcywgU0VFS19TRVQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gb3Bjb2RlICYgMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcGVhdCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVwZWF0KSB7CisgICAgICAgICAgICAgICAgcmVwZWF0ID0gMDsKKyAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpOworICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPCAweDEwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoIW9wY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKGdiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlICs9IDI1NTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICghYnl0ZXN0cmVhbTJfcGVla19ieXRlKGdiKSAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgKyAxNTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUzMihwYiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gb3Bjb2RlIC0gMTsgaSA+IDA7IC0taSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpOworICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlIDwgMHgxMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSAtIChvcGNvZGUgPj4gMikgLSA0ICogYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpIC0gMjA0OTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBwYi0+YnVmZmVyX3N0YXJ0LCBwYi0+YnVmZmVyX2VuZCAtIHBiLT5idWZmZXJfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2VlaygmZ2JjLCBieXRlc3RyZWFtMl90ZWxsX3AocGIpICsgcG9zLCBTRUVLX1NFVCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IG9wY29kZSAmIDM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxlbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gYnl0ZXN0cmVhbTJfcGVla19ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3Bjb2RlID49IDB4NDApIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKGdiLCAxKTsKKyAgICAgICAgICAgICAgICBwb3MgPSAtICgob3Bjb2RlID4+IDIpICYgNykgLSAxIC0gOCAqIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICBsZW4gPSAgICAob3Bjb2RlID4+IDUpICAgICAgLSAxOworCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBwYi0+YnVmZmVyX3N0YXJ0LCBwYi0+YnVmZmVyX2VuZCAtIHBiLT5idWZmZXJfc3RhcnQpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiYywgYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSArIHBvcywgU0VFS19TRVQpOworCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuKTsKKworICAgICAgICAgICAgICAgIGxlbiA9IG9wY29kZSAmIDM7CisKKyAgICAgICAgICAgICAgICBpZiAoIWxlbikgeworICAgICAgICAgICAgICAgICAgICByZXBlYXQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgLS1sZW47CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbik7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPCAweDIwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gPSBvcGNvZGUgJiAweDFGOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMSk7CisgICAgICAgICAgICBpZiAoIWxlbikgeworICAgICAgICAgICAgICAgIGlmICghYnl0ZXN0cmVhbTJfcGVla19ieXRlKGdiKSkgeworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKGdiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiArPSAyNTU7CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA+IDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW4gKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpICsgMzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgICAgICAgICAgcG9zID0gLSAoaSA+PiAyKSAtIDE7CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiYywgcGItPmJ1ZmZlcl9zdGFydCwgcGItPmJ1ZmZlcl9lbmQgLSBwYi0+YnVmZmVyX3N0YXJ0KTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiYywgYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSArIHBvcywgU0VFS19TRVQpOworCisgICAgICAgICAgICBpZiAobGVuIDwgNiB8fCBieXRlc3RyZWFtMl90ZWxsX3AocGIpIC0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2JjKSA8IDQpIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUzMihwYiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiYykpOworICAgICAgICAgICAgICAgIGZvciAobGVuID0gbGVuIC0gMjsgbGVuOyAtLWxlbikKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiA9IGkgJiAzOworICAgICAgICAgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgICAgICAgICByZXBlYXQgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4pOworICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZShnYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMSk7CisgICAgICAgIGlmIChvcGNvZGUgPCAweDEwKSB7CisgICAgICAgICAgICBwb3MgPSAtKG9wY29kZSA+PiAyKSAtIDEgLSA0ICogYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworCisgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYmMsIHBiLT5idWZmZXJfc3RhcnQsIHBiLT5idWZmZXJfZW5kIC0gcGItPmJ1ZmZlcl9zdGFydCk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYmMsIGJ5dGVzdHJlYW0yX3RlbGxfcChwYikgKyBwb3MsIFNFRUtfU0VUKTsKKworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgICAgICBsZW4gPSBvcGNvZGUgJiAzOworICAgICAgICAgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgICAgICAgICByZXBlYXQgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4pOworICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZShnYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBsZW4gPSBvcGNvZGUgJiA3OworICAgICAgICBpZiAoIWxlbikgeworICAgICAgICAgICAgaWYgKCFieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpKSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKGdiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IDI1NTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlICghYnl0ZXN0cmVhbTJfcGVla19ieXRlKGdiKSAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPiAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlbiArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgKyA3OworICAgICAgICB9CisgICAgICAgIGkgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgIHBvcyA9IGJ5dGVzdHJlYW0yX3RlbGxfcChwYikgLSAyMDQ4ICogKG9wY29kZSAmIDgpOworICAgICAgICBwb3MgPSBwb3MgLSAoaSA+PiAyKTsKKyAgICAgICAgaWYgKHBvcyA9PSBieXRlc3RyZWFtMl90ZWxsX3AocGIpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcG9zID0gcG9zIC0gMHg0MDAwOworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYmMsIHBiLT5idWZmZXJfc3RhcnQsIHBiLT5idWZmZXJfZW5kIC0gcGItPmJ1ZmZlcl9zdGFydCk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiYywgcG9zLCBTRUVLX1NFVCk7CisKKyAgICAgICAgaWYgKGxlbiA8IDYgfHwgYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSAtIGJ5dGVzdHJlYW0yX3RlbGwoJmdiYykgPCA0KSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgICAgIC0tbGVuOworICAgICAgICAgICAgfSB3aGlsZSAobGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKHBiLCBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2JjKSk7CisgICAgICAgICAgICBmb3IgKGxlbiA9IGxlbiAtIDI7IGxlbjsgLS1sZW4pCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxlbiA9IGkgJiAzOworICAgICAgICBpZiAoIWxlbikgeworICAgICAgICAgICAgcmVwZWF0ID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpKTsKKyAgICAgICAgICAgICAgICAtLWxlbjsKKyAgICAgICAgICAgIH0gd2hpbGUgKGxlbik7CisgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX3R5cGUxKEdldEJ5dGVDb250ZXh0ICpnYiwgUHV0Qnl0ZUNvbnRleHQgKnBiKQoreworICAgIHVuc2lnbmVkIG9wY29kZSA9IDAsIGxlbjsKKyAgICBpbnQgaGlnaCA9IDA7CisgICAgaW50IGksIHBvczsKKworICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPiAwKSB7CisgICAgICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKworICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA+IDApIHsKKyAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgaGlnaCA9IG9wY29kZSA+PSAweDIwOworICAgICAgICAgICAgICAgIGlmIChoaWdoKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA8IDB4RjgpIHsKKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlICs9IDMyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSA9IG9wY29kZSAtIDB4Rjg7CisgICAgICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gMjU2OworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKj0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoaSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gMjgwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKHBiLCBieXRlc3RyZWFtMl9nZXRfbGUzMihnYikpOworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUzMihwYiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuIC09IDg7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobGVuICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA+IDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWhpZ2gpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgICAgICAtLW9wY29kZTsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChvcGNvZGUgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCBnYmM7CisKKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID49IDB4MjApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBwYi0+YnVmZmVyX3N0YXJ0LCBwYi0+YnVmZmVyX2VuZCAtIHBiLT5idWZmZXJfc3RhcnQpOworCisgICAgICAgICAgICAgICAgICAgIHBvcyA9IC0ob3Bjb2RlIHwgMzIgKiBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2VlaygmZ2JjLCBieXRlc3RyZWFtMl90ZWxsX3AocGIpICsgcG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhpZ2ggPSAwOworICAgICAgICAgICAgaWYgKG9wY29kZSA8IDB4NDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYmMsIHBiLT5idWZmZXJfc3RhcnQsIHBiLT5idWZmZXJfZW5kIC0gcGItPmJ1ZmZlcl9zdGFydCk7CisgICAgICAgICAgICBwb3MgPSAoLSgob3Bjb2RlICYgMHgxRikgfCAzMiAqIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSkgLSAxKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiYywgYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSArIHBvcywgU0VFS19TRVQpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgICAgICBsZW4gPSAob3Bjb2RlID4+IDUpIC0gMTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgICAgIC0tbGVuOworICAgICAgICAgICAgfSB3aGlsZSAobGVuICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpID4gMCk7CisgICAgICAgIH0KKyAgICAgICAgbGVuID0gb3Bjb2RlICYgMHgxRjsKKyAgICAgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgICAgIGlmICghYnl0ZXN0cmVhbTJfcGVla19ieXRlKGdiKSkgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMSk7CisgICAgICAgICAgICAgICAgICAgIGxlbiArPSAyNTU7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoIWJ5dGVzdHJlYW0yX3BlZWtfYnl0ZShnYikgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW4gKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpICsgMzE7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gLWJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBwYi0+YnVmZmVyX3N0YXJ0LCBwYi0+YnVmZmVyX2VuZCAtIHBiLT5idWZmZXJfc3RhcnQpOworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYmMsIGJ5dGVzdHJlYW0yX3RlbGxfcChwYikgKyBwb3MgLSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpIDw8IDgpLCBTRUVLX1NFVCk7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsX3AocGIpID09IGJ5dGVzdHJlYW0yX3RlbGwoJmdiYykpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGxlbiA8IDUgfHwgYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSAtIGJ5dGVzdHJlYW0yX3RlbGwoJmdiYykgPCA0KSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiYykpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUzMihwYiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiYykpOworICAgICAgICAgICAgbGVuLS07CisgICAgICAgIH0KKyAgICAgICAgZG8geworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYmMpKTsKKyAgICAgICAgICAgIGxlbi0tOworICAgICAgICB9IHdoaWxlIChsZW4gJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiYykgPiAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBGTVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qnl0ZUNvbnRleHQgKmdiID0gJnMtPmdiOworICAgIFB1dEJ5dGVDb250ZXh0ICpwYiA9ICZzLT5wYjsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisgICAgaW50IHJldCwgeSwgeDsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KGdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDIpOworCisgICAgZnJhbWUtPmtleV9mcmFtZSA9ICEhYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgIGZyYW1lLT5waWN0X3R5cGUgPSBmcmFtZS0+a2V5X2ZyYW1lID8gQVZfUElDVFVSRV9UWVBFX0kgOiBBVl9QSUNUVVJFX1RZUEVfUDsKKworICAgIGlmIChmcmFtZS0+a2V5X2ZyYW1lKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzsKKyAgICAgICAgdW5zaWduZWQgdHlwZSwgc2l6ZTsKKyAgICAgICAgdWludDhfdCAqZHN0OworCisgICAgICAgIHR5cGUgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgIHNpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgIGlmIChzaXplID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIocGIsIHMtPmJ1ZmZlciwgcy0+YnVmZmVyX3NpemUpOworICAgICAgICBpZiAodHlwZSA9PSAxKSB7CisgICAgICAgICAgICBkZWNvZGVfdHlwZTEoZ2IsIHBiKTsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpeworICAgICAgICAgICAgZGVjb2RlX3R5cGUyKGdiLCBwYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIkNvbXByZXNzaW9uIHR5cGUgJWQiLCB0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorCisgICAgICAgIHNyYyA9IHMtPmJ1ZmZlcjsKKyAgICAgICAgZHN0ID0gZnJhbWUtPmRhdGFbMF0gKyAoYXZjdHgtPmhlaWdodCAtIDEpICogZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGF2Y3R4LT53aWR0aCAqIHMtPmJwcCk7CisgICAgICAgICAgICBkc3QgLT0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgc3JjICs9IHMtPnN0cmlkZSAqIDQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB1bnNpZ25lZCBibG9jaywgbmJfYmxvY2tzOworICAgICAgICBpbnQgdHlwZSwgaywgbDsKKyAgICAgICAgdWludDhfdCAqc3NyYywgKmRkc3Q7CisgICAgICAgIGNvbnN0IHVpbnQzMl90ICpzcmM7CisgICAgICAgIHVpbnQzMl90ICpkc3Q7CisKKyAgICAgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgcy0+bmJfYmxvY2tzOyBibG9jaysrKQorICAgICAgICAgICAgcy0+YmxvY2tzW2Jsb2NrXS54b3IgPSAwOworCisgICAgICAgIG5iX2Jsb2NrcyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KGdiKTsKKyAgICAgICAgaWYgKG5iX2Jsb2NrcyA+IHMtPm5iX2Jsb2NrcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKHBiLCBzLT5wYnVmZmVyLCBzLT5wYnVmZmVyX3NpemUpOworCisgICAgICAgIHR5cGUgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IG5iX2Jsb2NrczsgYmxvY2srKykgeworICAgICAgICAgICAgdW5zaWduZWQgc2l6ZSwgb2Zmc2V0OworICAgICAgICAgICAgaW50IHN0YXJ0ID0gMDsKKworICAgICAgICAgICAgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBzLT5uYl9ibG9ja3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIHNpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgICAgICBpZiAoc2l6ZSA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgc3RhcnQgPSBieXRlc3RyZWFtMl90ZWxsX3AocGIpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gMSkgeworICAgICAgICAgICAgICAgIGRlY29kZV90eXBlMShnYiwgcGIpOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IDIpeworICAgICAgICAgICAgICAgIGRlY29kZV90eXBlMihnYiwgcGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIkNvbXByZXNzaW9uIHR5cGUgJWQiLCB0eXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5ibG9ja3Nbb2Zmc2V0XS5zaXplICogNCAhPSBieXRlc3RyZWFtMl90ZWxsX3AocGIpIC0gc3RhcnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIHMtPmJsb2Nrc1tvZmZzZXRdLnhvciA9IDE7CisgICAgICAgIH0KKworICAgICAgICBzcmMgPSAoY29uc3QgdWludDMyX3QgKilzLT5wYnVmZmVyOworICAgICAgICBkc3QgPSAodWludDMyX3QgKilzLT5idWZmZXI7CisKKyAgICAgICAgZm9yIChibG9jayA9IDAsIHkgPSAwOyB5IDwgcy0+eWI7IHkrKykgeworICAgICAgICAgICAgaW50IGJsb2NrX2ggPSBzLT5ibG9ja3NbYmxvY2tdLmg7CisgICAgICAgICAgICB1aW50MzJfdCAqcmVjdCA9IGRzdDsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPnhiOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYmxvY2tfdyA9IHMtPmJsb2Nrc1tibG9ja10udzsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAqcm93ID0gZHN0OworCisgICAgICAgICAgICAgICAgYmxvY2tfaCA9IHMtPmJsb2Nrc1tibG9ja10uaDsKKyAgICAgICAgICAgICAgICBpZiAocy0+YmxvY2tzW2Jsb2NrXS54b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGJsb2NrX2g7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvbHVtbiA9IGRzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBibG9ja193OyBsKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRzdCsrIF49ICpzcmMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCA9ICZjb2x1bW5bcy0+c3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkc3QgPSAmcm93W2Jsb2NrX3ddOworICAgICAgICAgICAgICAgICsrYmxvY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QgPSAmcmVjdFtibG9ja19oICogcy0+c3RyaWRlXTsKKyAgICAgICAgfQorCisgICAgICAgIHNzcmMgPSBzLT5idWZmZXI7CisgICAgICAgIGRkc3QgPSBmcmFtZS0+ZGF0YVswXSArIChhdmN0eC0+aGVpZ2h0IC0gMSkgKiBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIG1lbWNweShkZHN0LCBzc3JjLCBhdmN0eC0+d2lkdGggKiBzLT5icHApOworICAgICAgICAgICAgZGRzdCAtPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICBzc3JjICs9IHMtPnN0cmlkZSAqIDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGTVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGosIG0sIGJsb2NrID0gMCwgaCA9IEJMT0NLX0hFSUdIVCwgdyA9IEJMT0NLX1dJRFRIOworCisgICAgc3dpdGNoIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgY2FzZSAxNjoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDMyOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSQTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBiaXRkZXB0aCAlaVxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5zdHJpZGUgPSAoYXZjdHgtPndpZHRoICogYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSArIDMxKSAvIDMyOworICAgIHMtPnhiICAgICA9IHMtPnN0cmlkZSAvIEJMT0NLX1dJRFRIOworICAgIG0gICAgICAgICA9IHMtPnN0cmlkZSAlIEJMT0NLX1dJRFRIOworICAgIGlmIChtKSB7CisgICAgICAgIGlmIChtIDwgMzcpIHsKKyAgICAgICAgICAgIHcgPSBtICsgQkxPQ0tfV0lEVEg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3ID0gbTsKKyAgICAgICAgICAgIHMtPnhiKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT55YiA9IGF2Y3R4LT5oZWlnaHQgLyBCTE9DS19IRUlHSFQ7CisgICAgbSAgICAgPSBhdmN0eC0+aGVpZ2h0ICUgQkxPQ0tfSEVJR0hUOworICAgIGlmIChtKSB7CisgICAgICAgIGlmIChtIDwgNDkpIHsKKyAgICAgICAgICAgIGggPSBtICsgQkxPQ0tfSEVJR0hUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaCA9IG07CisgICAgICAgICAgICBzLT55YisrOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+bmJfYmxvY2tzID0gcy0+eGIgKiBzLT55YjsKKyAgICBpZiAoIXMtPm5iX2Jsb2NrcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgcy0+YmxvY2tzICAgID0gYXZfY2FsbG9jKHMtPm5iX2Jsb2Nrcywgc2l6ZW9mKCpzLT5ibG9ja3MpKTsKKyAgICBpZiAoIXMtPmJsb2NrcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT55YjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT54YjsgaisrKSB7CisgICAgICAgICAgICBpZiAoaSAhPSAocy0+eWIgLSAxKSB8fCBqICE9IChzLT54YiAtIDEpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gcy0+eWIgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmJsb2Nrc1tibG9ja10udyAgICA9IEJMT0NLX1dJRFRIOworICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja3NbYmxvY2tdLmggICAgPSBoOworICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja3NbYmxvY2tdLnNpemUgPSBCTE9DS19XSURUSCAqIGg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChqID09IHMtPnhiIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja3NbYmxvY2tdLncgICAgPSB3OworICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja3NbYmxvY2tdLmggICAgPSBCTE9DS19IRUlHSFQ7CisgICAgICAgICAgICAgICAgICAgIHMtPmJsb2Nrc1tibG9ja10uc2l6ZSA9IEJMT0NLX0hFSUdIVCAqIHc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tzW2Jsb2NrXS53ICAgID0gQkxPQ0tfV0lEVEg7CisgICAgICAgICAgICAgICAgICAgIHMtPmJsb2Nrc1tibG9ja10uaCAgICA9IEJMT0NLX0hFSUdIVDsKKyAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tzW2Jsb2NrXS5zaXplID0gQkxPQ0tfV0lEVEggKiBCTE9DS19IRUlHSFQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5ibG9ja3NbYmxvY2tdLncgICAgPSB3OworICAgICAgICAgICAgICAgIHMtPmJsb2Nrc1tibG9ja10uaCAgICA9IGg7CisgICAgICAgICAgICAgICAgcy0+YmxvY2tzW2Jsb2NrXS5zaXplID0gdyAqIGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBibG9jaysrOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+YnBwICAgICAgICAgID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA+PiAzOworICAgIHMtPmJ1ZmZlcl9zaXplICA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiA0OworICAgIHMtPnBidWZmZXJfc2l6ZSA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiA0OworICAgIHMtPmJ1ZmZlciAgICAgICA9IGF2X21hbGxvY3oocy0+YnVmZmVyX3NpemUpOworICAgIHMtPnBidWZmZXIgICAgICA9IGF2X21hbGxvY3oocy0+cGJ1ZmZlcl9zaXplKTsKKyAgICBpZiAoIXMtPmJ1ZmZlciB8fCAhcy0+cGJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBGTVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmcy0+YnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmcy0+cGJ1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPmJsb2Nrcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9mbXZjX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAiZm12YyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRk0gU2NyZWVuIENhcHR1cmUgQ29kZWMiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0ZNVkMsCisgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoRk1WQ0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICAgPSBkZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICAgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZnJhbWVfdGhyZWFkX2VuY29kZXIuYyBiL2xpYmF2Y29kZWMvZnJhbWVfdGhyZWFkX2VuY29kZXIuYwppbmRleCAwNGM5YTBlLi41ZmYzZjc4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ZyYW1lX3RocmVhZF9lbmNvZGVyLmMKKysrIGIvbGliYXZjb2RlYy9mcmFtZV90aHJlYWRfZW5jb2Rlci5jCkBAIC0xOCwxMSArMTgsMTQgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CisKICNpbmNsdWRlICJmcmFtZV90aHJlYWRfZW5jb2Rlci5oIgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtNTQsNyArNTcsNyBAQAogICAgIHVuc2lnbmVkIGZpbmlzaGVkX3Rhc2tfaW5kZXg7CiAKICAgICBwdGhyZWFkX3Qgd29ya2VyW01BWF9USFJFQURTXTsKLSAgICBpbnQgZXhpdDsKKyAgICBhdG9taWNfaW50IGV4aXQ7CiB9IFRocmVhZENvbnRleHQ7CiAKIHN0YXRpYyB2b2lkICogYXR0cmlidXRlX2FsaWduX2FyZyB3b3JrZXIodm9pZCAqdil7CkBAIC02MiwxOCArNjUsMTggQEAKICAgICBUaHJlYWRDb250ZXh0ICpjID0gYXZjdHgtPmludGVybmFsLT5mcmFtZV90aHJlYWRfZW5jb2RlcjsKICAgICBBVlBhY2tldCAqcGt0ID0gTlVMTDsKIAotICAgIHdoaWxlKCFjLT5leGl0KXsKKyAgICB3aGlsZSAoIWF0b21pY19sb2FkKCZjLT5leGl0KSkgewogICAgICAgICBpbnQgZ290X3BhY2tldCwgcmV0OwogICAgICAgICBBVkZyYW1lICpmcmFtZTsKICAgICAgICAgVGFzayB0YXNrOwogCi0gICAgICAgIGlmKCFwa3QpIHBrdD0gYXZfbWFsbG9jeihzaXplb2YoKnBrdCkpOworICAgICAgICBpZighcGt0KSBwa3QgPSBhdl9wYWNrZXRfYWxsb2MoKTsKICAgICAgICAgaWYoIXBrdCkgY29udGludWU7CiAgICAgICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CiAKICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjLT50YXNrX2ZpZm9fbXV0ZXgpOwotICAgICAgICB3aGlsZSAoYXZfZmlmb19zaXplKGMtPnRhc2tfZmlmbykgPD0gMCB8fCBjLT5leGl0KSB7Ci0gICAgICAgICAgICBpZihjLT5leGl0KXsKKyAgICAgICAgd2hpbGUgKGF2X2ZpZm9fc2l6ZShjLT50YXNrX2ZpZm8pIDw9IDAgfHwgYXRvbWljX2xvYWQoJmMtPmV4aXQpKSB7CisgICAgICAgICAgICBpZiAoYXRvbWljX2xvYWQoJmMtPmV4aXQpKSB7CiAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPnRhc2tfZmlmb19tdXRleCk7CiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICB9CkBAIC04OSw3ICs5Miw5IEBACiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5idWZmZXJfbXV0ZXgpOwogICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CiAgICAgICAgIGlmKGdvdF9wYWNrZXQpIHsKLSAgICAgICAgICAgIGF2X2R1cF9wYWNrZXQocGt0KTsKKyAgICAgICAgICAgIGludCByZXQyID0gYXZfcGFja2V0X21ha2VfcmVmY291bnRlZChwa3QpOworICAgICAgICAgICAgaWYgKHJldCA+PSAwICYmIHJldDIgPCAwKQorICAgICAgICAgICAgICAgIHJldCA9IHJldDI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwa3QtPmRhdGEgPSBOVUxMOwogICAgICAgICAgICAgcGt0LT5zaXplID0gMDsKQEAgLTE4NCwxOCArMTg5LDI4IEBACiAgICAgcHRocmVhZF9tdXRleF9pbml0KCZjLT5idWZmZXJfbXV0ZXgsIE5VTEwpOwogICAgIHB0aHJlYWRfY29uZF9pbml0KCZjLT50YXNrX2ZpZm9fY29uZCwgTlVMTCk7CiAgICAgcHRocmVhZF9jb25kX2luaXQoJmMtPmZpbmlzaGVkX3Rhc2tfY29uZCwgTlVMTCk7CisgICAgYXRvbWljX2luaXQoJmMtPmV4aXQsIDApOwogCiAgICAgZm9yKGk9MDsgaTxhdmN0eC0+dGhyZWFkX2NvdW50IDsgaSsrKXsKICAgICAgICAgQVZEaWN0aW9uYXJ5ICp0bXAgPSBOVUxMOworICAgICAgICBpbnQgcmV0OwogICAgICAgICB2b2lkICp0bXB2OwogICAgICAgICBBVkNvZGVjQ29udGV4dCAqdGhyZWFkX2F2Y3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhhdmN0eC0+Y29kZWMpOwogICAgICAgICBpZighdGhyZWFkX2F2Y3R4KQogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB0bXB2ID0gdGhyZWFkX2F2Y3R4LT5wcml2X2RhdGE7CiAgICAgICAgICp0aHJlYWRfYXZjdHggPSAqYXZjdHg7CisgICAgICAgIHJldCA9IGF2X29wdF9jb3B5KHRocmVhZF9hdmN0eCwgYXZjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgdGhyZWFkX2F2Y3R4LT5wcml2X2RhdGEgPSB0bXB2OwogICAgICAgICB0aHJlYWRfYXZjdHgtPmludGVybmFsID0gTlVMTDsKLSAgICAgICAgbWVtY3B5KHRocmVhZF9hdmN0eC0+cHJpdl9kYXRhLCBhdmN0eC0+cHJpdl9kYXRhLCBhdmN0eC0+Y29kZWMtPnByaXZfZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+cHJpdl9jbGFzcykgeworICAgICAgICAgICAgaW50IHJldCA9IGF2X29wdF9jb3B5KHRocmVhZF9hdmN0eC0+cHJpdl9kYXRhLCBhdmN0eC0+cHJpdl9kYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBtZW1jcHkodGhyZWFkX2F2Y3R4LT5wcml2X2RhdGEsIGF2Y3R4LT5wcml2X2RhdGEsIGF2Y3R4LT5jb2RlYy0+cHJpdl9kYXRhX3NpemUpOwogICAgICAgICB0aHJlYWRfYXZjdHgtPnRocmVhZF9jb3VudCA9IDE7CiAgICAgICAgIHRocmVhZF9hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICY9IH5GRl9USFJFQURfRlJBTUU7CiAKQEAgLTIyOCw3ICsyNDMsNyBAQAogICAgIFRocmVhZENvbnRleHQgKmM9IGF2Y3R4LT5pbnRlcm5hbC0+ZnJhbWVfdGhyZWFkX2VuY29kZXI7CiAKICAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPnRhc2tfZmlmb19tdXRleCk7Ci0gICAgYy0+ZXhpdCA9IDE7CisgICAgYXRvbWljX3N0b3JlKCZjLT5leGl0LCAxKTsKICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjLT50YXNrX2ZpZm9fY29uZCk7CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPnRhc2tfZmlmb19tdXRleCk7CiAKQEAgLTI3MCwxNSArMjg1LDE2IEBACiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT50YXNrX2ZpZm9fbXV0ZXgpOwogCiAgICAgICAgIGMtPnRhc2tfaW5kZXggPSAoYy0+dGFza19pbmRleCsxKSAlIEJVRkZFUl9TSVpFOwotCi0gICAgICAgIGlmKCFjLT5maW5pc2hlZF90YXNrc1tjLT5maW5pc2hlZF90YXNrX2luZGV4XS5vdXRkYXRhICYmIChjLT50YXNrX2luZGV4IC0gYy0+ZmluaXNoZWRfdGFza19pbmRleCkgJSBCVUZGRVJfU0laRSA8PSBhdmN0eC0+dGhyZWFkX2NvdW50KQotICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYoYy0+dGFza19pbmRleCA9PSBjLT5maW5pc2hlZF90YXNrX2luZGV4KQotICAgICAgICByZXR1cm4gMDsKLQogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+ZmluaXNoZWRfdGFza19tdXRleCk7CisgICAgaWYgKGMtPnRhc2tfaW5kZXggPT0gYy0+ZmluaXNoZWRfdGFza19pbmRleCB8fAorICAgICAgICAoZnJhbWUgJiYgIWMtPmZpbmlzaGVkX3Rhc2tzW2MtPmZpbmlzaGVkX3Rhc2tfaW5kZXhdLm91dGRhdGEgJiYKKyAgICAgICAgIChjLT50YXNrX2luZGV4IC0gYy0+ZmluaXNoZWRfdGFza19pbmRleCkgJSBCVUZGRVJfU0laRSA8PSBhdmN0eC0+dGhyZWFkX2NvdW50KSkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmZpbmlzaGVkX3Rhc2tfbXV0ZXgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKwogICAgIHdoaWxlICghYy0+ZmluaXNoZWRfdGFza3NbYy0+ZmluaXNoZWRfdGFza19pbmRleF0ub3V0ZGF0YSkgewogICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYy0+ZmluaXNoZWRfdGFza19jb25kLCAmYy0+ZmluaXNoZWRfdGFza19tdXRleCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9mcmFwcy5jIGIvbGliYXZjb2RlYy9mcmFwcy5jCmluZGV4IDU3ZTEzZjIuLjdhNzY3M2YgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZnJhcHMuYworKysgYi9saWJhdmNvZGVjL2ZyYXBzLmMKQEAgLTE0Niw2ICsxNDYsNyBAQAogICAgIHVpbnQzMl90IG9mZnNbNF07CiAgICAgaW50IGksIGosIHJldCwgaXNfY2hyb21hOwogICAgIGNvbnN0IGludCBwbGFuZXMgPSAzOworICAgIGludCBpc19wYWw7CiAgICAgdWludDhfdCAqb3V0OwogCiAgICAgaWYgKGJ1Zl9zaXplIDwgNCkgewpAQCAtMTU1LDE4ICsxNTYsMjYgQEAKIAogICAgIGhlYWRlciAgICAgID0gQVZfUkwzMihidWYpOwogICAgIHZlcnNpb24gICAgID0gaGVhZGVyICYgMHhmZjsKKyAgICBpc19wYWwgICAgICA9IGJ1ZlsxXSA9PSAyICYmIHZlcnNpb24gPT0gMTsKICAgICBoZWFkZXJfc2l6ZSA9IChoZWFkZXIgJiAoMTw8MzApKT8gOCA6IDQ7IC8qIGJpdCAzMCBtZWFucyBwYWQgdG8gOCBieXRlcyAqLwogCiAgICAgaWYgKHZlcnNpb24gPiA1KSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlRoaXMgZmlsZSBpcyBlbmNvZGVkIHdpdGggRnJhcHMgdmVyc2lvbiAlZC4gIiBcCi0gICAgICAgICAgICAgICAiVGhpcyBjb2RlYyBjYW4gb25seSBkZWNvZGUgdmVyc2lvbnMgPD0gNS5cbiIsIHZlcnNpb24pOworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIkZyYXBzIHZlcnNpb24gJXUiLCB2ZXJzaW9uKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KIAogICAgIGJ1ZiArPSBoZWFkZXJfc2l6ZTsKIAotICAgIGlmICh2ZXJzaW9uIDwgMikgeworICAgIGlmIChpc19wYWwpIHsKKyAgICAgICAgdW5zaWduZWQgbmVlZGVkX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICsgMTAyNDsKKyAgICAgICAgbmVlZGVkX3NpemUgKz0gaGVhZGVyX3NpemU7CisgICAgICAgIGlmIChidWZfc2l6ZSAhPSBuZWVkZWRfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZnJhbWUgbGVuZ3RoICVkIChzaG91bGQgYmUgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplLCBuZWVkZWRfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodmVyc2lvbiA8IDIpIHsKICAgICAgICAgdW5zaWduZWQgbmVlZGVkX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogMzsKICAgICAgICAgaWYgKHZlcnNpb24gPT0gMCkgbmVlZGVkX3NpemUgLz0gMjsKICAgICAgICAgbmVlZGVkX3NpemUgKz0gaGVhZGVyX3NpemU7CkBAIC0yMDksNyArMjE4LDcgQEAKICAgICBmLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKICAgICBmLT5rZXlfZnJhbWUgPSAxOwogCi0gICAgYXZjdHgtPnBpeF9mbXQgPSB2ZXJzaW9uICYgMSA/IEFWX1BJWF9GTVRfQkdSMjQgOiBBVl9QSVhfRk1UX1lVVko0MjBQOworICAgIGF2Y3R4LT5waXhfZm10ID0gdmVyc2lvbiAmIDEgPyBpc19wYWwgPyBBVl9QSVhfRk1UX1BBTDggOiBBVl9QSVhfRk1UX0JHUjI0IDogQVZfUElYX0ZNVF9ZVVZKNDIwUDsKICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPSB2ZXJzaW9uICYgMSA/IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVkNPTF9SQU5HRV9KUEVHOwogICAgIGF2Y3R4LT5jb2xvcnNwYWNlID0gdmVyc2lvbiAmIDEgPyBBVkNPTF9TUENfVU5TUEVDSUZJRUQgOiBBVkNPTF9TUENfQlQ3MDk7CkBAIC0yNDUsMTEgKzI1NCwyNSBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMToKKyAgICAgICAgaWYgKGlzX3BhbCkgeworICAgICAgICAgICAgdWludDMyX3QgKnBhbCA9ICh1aW50MzJfdCAqKWYtPmRhdGFbMV07CisKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAyNTY7IHkrKykgeworICAgICAgICAgICAgICAgIHBhbFt5XSA9IEFWX1JMMzIoYnVmKSB8IDB4RkYwMDAwMDA7CisgICAgICAgICAgICAgICAgYnVmICs9IDQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPGF2Y3R4LT5oZWlnaHQ7IHkrKykKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmYtPmRhdGFbMF1beSAqIGYtPmxpbmVzaXplWzBdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zlt5ICogYXZjdHgtPndpZHRoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogRnJhcHMgdjEgaXMgYW4gdXBzaWRlLWRvd24gQkdSMjQgKi8KICAgICAgICAgICAgIGZvciAoeSA9IDA7IHk8YXZjdHgtPmhlaWdodDsgeSsrKQogICAgICAgICAgICAgICAgIG1lbWNweSgmZi0+ZGF0YVswXVsoYXZjdHgtPmhlaWdodCAtIHkgLSAxKSAqIGYtPmxpbmVzaXplWzBdXSwKICAgICAgICAgICAgICAgICAgICAgICAgJmJ1Zlt5ICogYXZjdHgtPndpZHRoICogM10sCiAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBhdmN0eC0+d2lkdGgpOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAyOgpAQCAtMzI1LDQgKzM0OCw1IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKICAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9nMm1lZXQuYyBiL2xpYmF2Y29kZWMvZzJtZWV0LmMKaW5kZXggNTFlOGJiYy4uYTFkZWM4ZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9nMm1lZXQuYworKysgYi9saWJhdmNvZGVjL2cybWVldC5jCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDx6bGliLmg+CiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCkBAIC0xMjIsNyArMTIzLDcgQEAKIAogICAgIFZMQyAgICAgICAgZGNfdmxjWzJdLCBhY192bGNbMl07CiAgICAgaW50ICAgICAgICBwcmV2X2RjWzNdOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2spWzZdWzY0XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGludDE2X3QsIGJsb2NrKVs2XVs2NF07CiAKICAgICB1aW50OF90ICAgICpidWY7CiB9IEpQR0NvbnRleHQ7CkBAIC01NTUsOCArNTU2LDggQEAKICAgICAgICAgQiAgICAgPSAoKHByZWQgPj4gQl9zaGlmdCkgJiAweEZGKSAtIFRPU0lHTkVEKGRlbHRhKTsKICAgICB9CiAKLSAgICBpZiAoUjwwIHx8IEc8MCB8fCBCPDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlJHQiAlZCAlZCAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsIFIsIEcsIEIpOworICAgIGlmIChSPDAgfHwgRzwwIHx8IEI8MCB8fCBSID4gMjU1IHx8IEcgPiAyNTUgfHwgQiA+IDI1NSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoTlVMTCwgIlJHQiAlZCAlZCAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsIFIsIEcsIEIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTkwMCw3ICs5MDEsNyBAQAogICAgIH0KIAogICAgIGlmIChzcmNfc2l6ZSA8IGVsc19kc2l6ZSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVQSUM6IGRhdGEgdG9vIHNob3J0LCBuZWVkZWQgJXp1LCBnb3QgJXp1XG4iLAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVQSUM6IGRhdGEgdG9vIHNob3J0LCBuZWVkZWQgJSJTSVpFX1NQRUNJRklFUiIsIGdvdCAlIlNJWkVfU1BFQ0lGSUVSIlxuIiwKICAgICAgICAgICAgICAgIGVsc19kc2l6ZSwgc3JjX3NpemUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC05MjYsNiArOTI3LDcgQEAKICAgICAgICAgaWYgKGMtPmVjLmVsc19jdHguZXJyICE9IDApIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJlUElDOiBjb3VsZG4ndCBkZWNvZGUgdHJhbnNwYXJlbmN5IHBpeGVsIVxuIik7CisgICAgICAgICAgICBmZl9lbHNfZGVjb2Rlcl91bmluaXQoJmMtPmVjLnVuc2lnbmVkX3J1bmcpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KIApAQCAtMTM1NCwxNCArMTM1NiwxNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRzdCAgICArPSAgeCAqIDM7CiAgICAgfQotICAgIGlmICh5IDwgMCkgeworCisgICAgaWYgKHkgPCAwKQogICAgICAgICBoICAgICAgKz0gIHk7CisgICAgaWYgKHcgPCAwIHx8IGggPCAwKQorICAgICAgICByZXR1cm47CisgICAgaWYgKHkgPCAwKSB7CiAgICAgICAgIGN1cnNvciArPSAteSAqIGMtPmN1cnNvcl9zdHJpZGU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZHN0ICAgICs9ICB5ICogc3RyaWRlOwogICAgIH0KLSAgICBpZiAodyA8IDAgfHwgaCA8IDApCi0gICAgICAgIHJldHVybjsKIAogICAgIGZvciAoaiA9IDA7IGogPCBoOyBqKyspIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgewpAQCAtMTQ0Miw5ICsxNDQ2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGMtPmNvbXByZXNzaW9uID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmJjKTsKICAgICAgICAgICAgIGlmIChjLT5jb21wcmVzc2lvbiAhPSAyICYmIGMtPmNvbXByZXNzaW9uICE9IDMpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gY29tcHJlc3Npb24gbWV0aG9kICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBjLT5jb21wcmVzc2lvbik7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJDb21wcmVzc2lvbiBtZXRob2QgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNvbXByZXNzaW9uKTsKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgICAgICAgICBnb3RvIGhlYWRlcl9mYWlsOwogICAgICAgICAgICAgfQpAQCAtMTQ1Miw3ICsxNDU1LDggQEAKICAgICAgICAgICAgIGMtPnRpbGVfaGVpZ2h0ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmJjKTsKICAgICAgICAgICAgIGlmIChjLT50aWxlX3dpZHRoIDw9IDAgfHwgYy0+dGlsZV9oZWlnaHQgPD0gMCB8fAogICAgICAgICAgICAgICAgICgoYy0+dGlsZV93aWR0aCB8IGMtPnRpbGVfaGVpZ2h0KSAmIDB4RikgfHwKLSAgICAgICAgICAgICAgICBjLT50aWxlX3dpZHRoICogKHVpbnQ2NF90KWMtPnRpbGVfaGVpZ2h0ID49IElOVF9NQVggLyA0CisgICAgICAgICAgICAgICAgYy0+dGlsZV93aWR0aCAqICh1aW50NjRfdCljLT50aWxlX2hlaWdodCA+PSBJTlRfTUFYIC8gNCB8fAorICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NoZWNrX3NpemUyKGMtPnRpbGVfd2lkdGgsIGMtPnRpbGVfaGVpZ2h0LCBhdmN0eC0+bWF4X3BpeGVscywgYXZjdHgtPnBpeF9mbXQsIDAsIGF2Y3R4KSA8IDAKICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB0aWxlIGRpbWVuc2lvbnMgJWR4JWRcbiIsCkBAIC0xNDc1LDkgKzE0NzksOSBAQAogICAgICAgICAgICAgICAgIGdfbWFzayA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZiYyk7CiAgICAgICAgICAgICAgICAgYl9tYXNrID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmJjKTsKICAgICAgICAgICAgICAgICBpZiAocl9tYXNrICE9IDB4RkYwMDAwIHx8IGdfbWFzayAhPSAweEZGMDAgfHwgYl9tYXNrICE9IDB4RkYpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvciB1bnN1cHBvcnRlZCBiaXRtYXNrczogUj0lIlBSSVgzMiIsIEc9JSJQUklYMzIiLCBCPSUiUFJJWDMyIlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfbWFzaywgZ19tYXNrLCBiX21hc2spOworICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpdG1hc2tzOiBSPSUiUFJJWDMyIiwgRz0lIlBSSVgzMiIsIEI9JSJQUklYMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfbWFzaywgZ19tYXNrLCBiX21hc2spOwogICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBoZWFkZXJfZmFpbDsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2c3MjIuYyBiL2xpYmF2Y29kZWMvZzcyMi5jCmluZGV4IGVlM2I4NWYuLmVmN2NhNmQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZzcyMi5jCisrKyBiL2xpYmF2Y29kZWMvZzcyMi5jCkBAIC04OCwxNCArODgsMTQgQEAKICAgICAgICAgQUNDVU0oMywgYmFuZC0+ZGlmZl9tZW1bMl0sIDEpOwogICAgICAgICBBQ0NVTSgyLCBiYW5kLT5kaWZmX21lbVsxXSwgMSk7CiAgICAgICAgIEFDQ1VNKDEsIGJhbmQtPmRpZmZfbWVtWzBdLCAxKTsKLSAgICAgICAgQUNDVU0oMCwgY3VyX2RpZmYgPDwgMSwgMSk7CisgICAgICAgIEFDQ1VNKDAsIGN1cl9kaWZmICogMiwgMSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUNDVU0oNSwgYmFuZC0+ZGlmZl9tZW1bNF0sIDApOwogICAgICAgICBBQ0NVTSg0LCBiYW5kLT5kaWZmX21lbVszXSwgMCk7CiAgICAgICAgIEFDQ1VNKDMsIGJhbmQtPmRpZmZfbWVtWzJdLCAwKTsKICAgICAgICAgQUNDVU0oMiwgYmFuZC0+ZGlmZl9tZW1bMV0sIDApOwogICAgICAgICBBQ0NVTSgxLCBiYW5kLT5kaWZmX21lbVswXSwgMCk7Ci0gICAgICAgIEFDQ1VNKDAsIGN1cl9kaWZmIDw8IDEsIDApOworICAgICAgICBBQ0NVTSgwLCBjdXJfZGlmZiAqIDIsIDApOwogICAgIH0KICAgICAjdW5kZWYgQUNDVU0KICAgICBiYW5kLT5zX3plcm8gPSBzX3plcm87CkBAIC0xMTksMTQgKzExOSwxNCBAQAogICAgIGJhbmQtPnBhcnRfcmVjb25zdF9tZW1bMF0gPSBjdXJfcGFydF9yZWNvbnN0OwogCiAgICAgYmFuZC0+cG9sZV9tZW1bMV0gPSBhdl9jbGlwKChzZ1swXSAqIGF2X2NsaXAoYmFuZC0+cG9sZV9tZW1bMF0sIC04MTkxLCA4MTkxKSA+PiA1KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZ1sxXSA8PCA3KSArIChiYW5kLT5wb2xlX21lbVsxXSAqIDEyNyA+PiA3KSwgLTEyMjg4LCAxMjI4OCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZ1sxXSAqIDEyOCkgKyAoYmFuZC0+cG9sZV9tZW1bMV0gKiAxMjcgPj4gNyksIC0xMjI4OCwgMTIyODgpOwogCiAgICAgbGltaXQgPSAxNTM2MCAtIGJhbmQtPnBvbGVfbWVtWzFdOwogICAgIGJhbmQtPnBvbGVfbWVtWzBdID0gYXZfY2xpcCgtMTkyICogc2dbMF0gKyAoYmFuZC0+cG9sZV9tZW1bMF0gKiAyNTUgPj4gOCksIC1saW1pdCwgbGltaXQpOwogCiAgICAgc196ZXJvKGN1cl9kaWZmLCBiYW5kKTsKIAotICAgIGN1cl9xdHpkX3JlY29uc3QgPSBhdl9jbGlwX2ludDE2KChiYW5kLT5zX3ByZWRpY3RvciArIGN1cl9kaWZmKSA8PCAxKTsKKyAgICBjdXJfcXR6ZF9yZWNvbnN0ID0gYXZfY2xpcF9pbnQxNigoYmFuZC0+c19wcmVkaWN0b3IgKyBjdXJfZGlmZikgKiAyKTsKICAgICBiYW5kLT5zX3ByZWRpY3RvciA9IGF2X2NsaXBfaW50MTYoYmFuZC0+c196ZXJvICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhbmQtPnBvbGVfbWVtWzBdICogY3VyX3F0emRfcmVjb25zdCA+PiAxNSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFuZC0+cG9sZV9tZW1bMV0gKiBiYW5kLT5wcmV2X3F0emRfcmVjb25zdCA+PiAxNSkpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9nNzIyZGVjLmMgYi9saWJhdmNvZGVjL2c3MjJkZWMuYwppbmRleCAwYmZhODJhLi4wMDBiNTkxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2c3MjJkZWMuYworKysgYi9saWJhdmNvZGVjL2c3MjJkZWMuYwpAQCAtODAsOCArODAsOCBAQAogfTsKIAogc3RhdGljIGNvbnN0IGludDE2X3QgKiBjb25zdCBsb3dfaW52X3F1YW50c1szXSA9IHsgZmZfZzcyMl9sb3dfaW52X3F1YW50NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfaW52X3F1YW50NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfZzcyMl9sb3dfaW52X3F1YW50NCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfaW52X3F1YW50NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2c3MjJfbG93X2ludl9xdWFudDQgfTsKIAogc3RhdGljIGludCBnNzIyX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9nNzIyZW5jLmMgYi9saWJhdmNvZGVjL2c3MjJlbmMuYwppbmRleCAwMWEzZGIyLi4yNWI2MWRmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2c3MjJlbmMuYworKysgYi9saWJhdmNvZGVjL2c3MjJlbmMuYwpAQCAtNjEsMTEgKzYxLDYgQEAKICAgICBHNzIyQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IHJldDsKIAotICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgIT0gMSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgbW9ubyB0cmFja3MgYXJlIGFsbG93ZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotCiAgICAgYy0+YmFuZFswXS5zY2FsZV9mYWN0b3IgPSA4OwogICAgIGMtPmJhbmRbMV0uc2NhbGVfZmFjdG9yID0gMjsKICAgICBjLT5wcmV2X3NhbXBsZXNfcG9zID0gMjI7CkBAIC0zODEsMTUgKzM3NiwxNSBAQAogfQogCiBBVkNvZGVjIGZmX2FkcGNtX2c3MjJfZW5jb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAiZzcyMiIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzIyIEFEUENNIiksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjIsCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEc3MjJDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBnNzIyX2VuY29kZV9pbml0LAotICAgIC5jbG9zZSAgICAgICAgICA9IGc3MjJfZW5jb2RlX2Nsb3NlLAotICAgIC5lbmNvZGUyICAgICAgICA9IGc3MjJfZW5jb2RlX2ZyYW1lLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FLAotICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLm5hbWUgICAgICAgICAgICA9ICJnNzIyIiwKKyAgICAubG9uZ19uYW1lICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzIyIEFEUENNIiksCisgICAgLnR5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fRzcyMiwKKyAgICAucHJpdl9kYXRhX3NpemUgID0gc2l6ZW9mKEc3MjJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgID0gZzcyMl9lbmNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgID0gZzcyMl9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgICA9IGc3MjJfZW5jb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICAgPSBBVl9DT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAuY2hhbm5lbF9sYXlvdXRzID0gKGNvbnN0IHVpbnQ2NF90W10peyBBVl9DSF9MQVlPVVRfTU9OTywgMCB9LAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZzcyM18xLmMgYi9saWJhdmNvZGVjL2c3MjNfMS5jCmluZGV4IGExMWZlYzguLjFkZWZmNDkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZzcyM18xLmMKKysrIGIvbGliYXZjb2RlYy9nNzIzXzEuYwpAQCAtNDEsNyArNDEsNyBAQAogICAgIGJpdHM9IEZGTUFYKGJpdHMsIDApOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICBkc3RbaV0gPSB2ZWN0b3JbaV0gPDwgYml0cyA+PiAzOworICAgICAgICBkc3RbaV0gPSAodmVjdG9yW2ldICogKDEgPDwgYml0cykpID4+IDM7CiAKICAgICByZXR1cm4gYml0cyAtIDM7CiB9CkBAIC0xMjUsOSArMTI1LDkgQEAKICAgICBmb3IgKGogPSAwOyBqIDwgTFBDX09SREVSOyBqKyspIHsKICAgICAgICAgaW50IGluZGV4ICAgICA9IChscGNbal0gPj4gNykgJiAweDFGRjsKICAgICAgICAgaW50IG9mZnNldCAgICA9IGxwY1tqXSAmIDB4N2Y7Ci0gICAgICAgIGludCB0ZW1wMSAgICAgPSBjb3NfdGFiW2luZGV4XSA8PCAxNjsKKyAgICAgICAgaW50IHRlbXAxICAgICA9IGNvc190YWJbaW5kZXhdICogKDEgPDwgMTYpOwogICAgICAgICBpbnQgdGVtcDIgICAgID0gKGNvc190YWJbaW5kZXggKyAxXSAtIGNvc190YWJbaW5kZXhdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgob2Zmc2V0IDw8IDgpICsgMHg4MCkgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgob2Zmc2V0IDw8IDgpICsgMHg4MCkgPDwgMSk7CiAKICAgICAgICAgbHBjW2pdID0gLShhdl9zYXRfZGFkZDMyKDEgPDwgMTUsIHRlbXAxICsgdGVtcDIpID4+IDE2KTsKICAgICB9CkBAIC0xMzgsMTEgKzEzOCwxMSBAQAogICAgICAqLwogICAgIC8qIEluaXRpYWxpemUgd2l0aCB2YWx1ZXMgaW4gUTI4ICovCiAgICAgZjFbMF0gPSAxIDw8IDI4OwotICAgIGYxWzFdID0gKGxwY1swXSA8PCAxNCkgKyAobHBjWzJdIDw8IDE0KTsKKyAgICBmMVsxXSA9IChscGNbMF0gKyBscGNbMl0pICogKDEgPDwgMTQpOwogICAgIGYxWzJdID0gbHBjWzBdICogbHBjWzJdICsgKDIgPDwgMjgpOwogCiAgICAgZjJbMF0gPSAxIDw8IDI4OwotICAgIGYyWzFdID0gKGxwY1sxXSA8PCAxNCkgKyAobHBjWzNdIDw8IDE0KTsKKyAgICBmMlsxXSA9IChscGNbMV0gKyBscGNbM10pICogKDEgPDwgMTQpOwogICAgIGYyWzJdID0gbHBjWzFdICogbHBjWzNdICsgKDIgPDwgMjgpOwogCiAgICAgLyoKQEAgLTE1MCw4ICsxNTAsOCBAQAogICAgICAqIGVhY2ggaXRlcmF0aW9uIGZvciBhIGZpbmFsIHNjYWxpbmcgZmFjdG9yIG9mIFEyNQogICAgICAqLwogICAgIGZvciAoaSA9IDI7IGkgPCBMUENfT1JERVIgLyAyOyBpKyspIHsKLSAgICAgICAgZjFbaSArIDFdID0gZjFbaSAtIDFdICsgTVVMTDIoZjFbaV0sIGxwY1syICogaV0pOwotICAgICAgICBmMltpICsgMV0gPSBmMltpIC0gMV0gKyBNVUxMMihmMltpXSwgbHBjWzIgKiBpICsgMV0pOworICAgICAgICBmMVtpICsgMV0gPSBhdl9jbGlwbF9pbnQzMihmMVtpIC0gMV0gKyAoaW50NjRfdClNVUxMMihmMVtpXSwgbHBjWzIgKiBpXSkpOworICAgICAgICBmMltpICsgMV0gPSBhdl9jbGlwbF9pbnQzMihmMltpIC0gMV0gKyAoaW50NjRfdClNVUxMMihmMltpXSwgbHBjWzIgKiBpICsgMV0pKTsKIAogICAgICAgICBmb3IgKGogPSBpOyBqID49IDI7IGotLSkgewogICAgICAgICAgICAgZjFbal0gPSBNVUxMMihmMVtqIC0gMV0sIGxwY1syICogaV0pICsKQEAgLTE2Miw4ICsxNjIsOCBAQAogCiAgICAgICAgIGYxWzBdID4+PSAxOwogICAgICAgICBmMlswXSA+Pj0gMTsKLSAgICAgICAgZjFbMV0gPSAoKGxwY1syICogaV0gICAgIDw8IDE2ID4+IGkpICsgZjFbMV0pID4+IDE7Ci0gICAgICAgIGYyWzFdID0gKChscGNbMiAqIGkgKyAxXSA8PCAxNiA+PiBpKSArIGYyWzFdKSA+PiAxOworICAgICAgICBmMVsxXSA9ICgobHBjWzIgKiBpXSAgICAgKiA2NTUzNiA+PiBpKSArIGYxWzFdKSA+PiAxOworICAgICAgICBmMlsxXSA9ICgobHBjWzIgKiBpICsgMV0gKiA2NTUzNiA+PiBpKSArIGYyWzFdKSA+PiAxOwogICAgIH0KIAogICAgIC8qIENvbnZlcnQgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgdG8gTFBDIGNvZWZmaWNpZW50cyAqLwpAQCAtMTcxLDggKzE3MSw4IEBACiAgICAgICAgIGludDY0X3QgZmYxID0gZjFbaSArIDFdICsgZjFbaV07CiAgICAgICAgIGludDY0X3QgZmYyID0gZjJbaSArIDFdIC0gZjJbaV07CiAKLSAgICAgICAgbHBjW2ldID0gYXZfY2xpcGxfaW50MzIoKChmZjEgKyBmZjIpIDw8IDMpICsgKDEgPDwgMTUpKSA+PiAxNjsKLSAgICAgICAgbHBjW0xQQ19PUkRFUiAtIGkgLSAxXSA9IGF2X2NsaXBsX2ludDMyKCgoZmYxIC0gZmYyKSA8PCAzKSArCisgICAgICAgIGxwY1tpXSA9IGF2X2NsaXBsX2ludDMyKCgoZmYxICsgZmYyKSAqIDgpICsgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICAgICAgbHBjW0xQQ19PUkRFUiAtIGkgLSAxXSA9IGF2X2NsaXBsX2ludDMyKCgoZmYxIC0gZmYyKSAqIDgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE1KSkgPj4gMTY7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9nNzIzXzEuaCBiL2xpYmF2Y29kZWMvZzcyM18xLmgKaW5kZXggNDBkNmU3MC4uZjgzM2FmMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9nNzIzXzEuaAorKysgYi9saWJhdmNvZGVjL2c3MjNfMS5oCkBAIC01NSw3ICs1NSw3IEBACiAgKiBAcGFyYW0gYiAxNiBiaXQgbXVsdGlwbGllcgogICovCiAjZGVmaW5lIE1VTEwyKGEsIGIpIFwKLSAgICAgICAgKCgoKGEpID4+IDE2KSAqIChiKSA8PCAxKSArICgoKGEpICYgMHhmZmZmKSAqIChiKSA+PiAxNSkpCisgICAgICAgICgoKChhKSA+PiAxNikgKiAoYikgKiAyKSArICgoKGEpICYgMHhmZmZmKSAqIChiKSA+PiAxNSkpCiAKIC8qKgogICogRzcyMy4xIGZyYW1lIHR5cGVzCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2c3MjNfMWRlYy5jIGIvbGliYXZjb2RlYy9nNzIzXzFkZWMuYwppbmRleCAzZThjNDg5Li5hYjk1MmVjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2c3MjNfMWRlYy5jCisrKyBiL2xpYmF2Y29kZWMvZzcyM18xZGVjLmMKQEAgLTI1LDE3ICsyNSwxOCBAQAogICogRy43MjMuMSBjb21wYXRpYmxlIGRlY29kZXIKICAqLwogCi0jZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKICNpbmNsdWRlICJhY2VscF92ZWN0b3JzLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImNlbHBfZmlsdGVycy5oIgogI2luY2x1ZGUgImNlbHBfbWF0aC5oIgotI2luY2x1ZGUgImc3MjNfMS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJnNzIzXzEuaCIKIAogI2RlZmluZSBDTkdfUkFORE9NX1NFRUQgMTIzNDUKIApAQCAtNDY2LDcgKzQ2Nyw3IEBACiB9CiAKIC8qKgotICogUGVmb3JtIHJlc2lkdWFsIGludGVycG9sYXRpb24gYmFzZWQgb24gZnJhbWUgY2xhc3NpZmljYXRpb24uCisgKiBQZXJmb3JtIHJlc2lkdWFsIGludGVycG9sYXRpb24gYmFzZWQgb24gZnJhbWUgY2xhc3NpZmljYXRpb24uCiAgKgogICogQHBhcmFtIGJ1ZiAgIGRlY29kZWQgZXhjaXRhdGlvbiB2ZWN0b3IKICAqIEBwYXJhbSBvdXQgICBvdXRwdXQgdmVjdG9yCkBAIC00ODcsNyArNDg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZSQU1FX0xFTiAtIGxhZykgKiBzaXplb2YoKm91dCkpOwogICAgIH0gZWxzZSB7ICAvKiBVbnZvaWNlZCAqLwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRlJBTUVfTEVOOyBpKyspIHsKLSAgICAgICAgICAgICpyc2VlZCA9ICpyc2VlZCAqIDUyMSArIDI1OTsKKyAgICAgICAgICAgICpyc2VlZCA9IChpbnQxNl90KSgqcnNlZWQgKiA1MjEgKyAyNTkpOwogICAgICAgICAgICAgb3V0W2ldID0gZ2FpbiAqICpyc2VlZCA+PiAxNTsKICAgICAgICAgfQogICAgICAgICBtZW1zZXQoYnVmLCAwLCAoRlJBTUVfTEVOICsgUElUQ0hfTUFYKSAqIHNpemVvZigqYnVmKSk7CkBAIC01MTYsNyArNTE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAoaWlyX2NvZWYpW24gLSAxXSAqICgoZGVzdClbbSAtIG5dID4+IGluX3NoaWZ0KTtcCiAgICAgICAgIH1cCiBcCi0gICAgICAgIChkZXN0KVttXSA9IGF2X2NsaXBsX2ludDMyKCgoc3JjKVttXSA8PCAxNikgKyAoZmlsdGVyIDw8IDMpICtcCisgICAgICAgIChkZXN0KVttXSA9IGF2X2NsaXBsX2ludDMyKCgoc3JjKVttXSAqIDY1NTM2KSArIChmaWx0ZXIgKiA4KSArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAxNSkpID4+IHJlc19zaGlmdDtcCiAgICAgfVwKIH0KQEAgLTU0OCw3ICs1NDksNyBAQAogICAgICAgICBkZW5vbSA8PD0gYml0czI7CiAKICAgICAgICAgYml0czIgPSA1ICsgYml0czEgLSBiaXRzMjsKLSAgICAgICAgYml0czIgPSBGRk1BWCgwLCBiaXRzMik7CisgICAgICAgIGJpdHMyID0gYXZfY2xpcF91aW50cDIoYml0czIsIDUpOwogCiAgICAgICAgIGdhaW4gPSAobnVtID4+IDEpIC8gKGRlbm9tID4+IDE2KTsKICAgICAgICAgZ2FpbiA9IHNxdWFyZV9yb290KGdhaW4gPDwgMTYgPj4gYml0czIpOwpAQCAtNjU5LDExICs2NjAsMTcgQEAKICAgICBpbnQgaSwgc2hpZnQsIHNlZywgc2VnMiwgdCwgdmFsLCB2YWxfYWRkLCB4LCB5OwogCiAgICAgc2hpZnQgPSAxNiAtIHAtPmN1cl9nYWluICogMjsKLSAgICBpZiAoc2hpZnQgPiAwKQotICAgICAgICB0ID0gcC0+c2lkX2dhaW4gPDwgc2hpZnQ7Ci0gICAgZWxzZQorICAgIGlmIChzaGlmdCA+IDApIHsKKyAgICAgICAgaWYgKHAtPnNpZF9nYWluID09IDApIHsKKyAgICAgICAgICAgIHQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0ID49IDMxIHx8IChpbnQzMl90KSgodWludDMyX3QpcC0+c2lkX2dhaW4gPDwgc2hpZnQpID4+IHNoaWZ0ICE9IHAtPnNpZF9nYWluKSB7CisgICAgICAgICAgICBpZiAocC0+c2lkX2dhaW4gPCAwKSB0ID0gSU5UMzJfTUlOOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgdCA9IElOVDMyX01BWDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB0ID0gcC0+c2lkX2dhaW4gPDwgc2hpZnQ7CisgICAgfWVsc2UKICAgICAgICAgdCA9IHAtPnNpZF9nYWluID4+IC1zaGlmdDsKLSAgICB4ID0gdCAqIGNuZ19maWx0WzBdID4+IDE2OworICAgIHggPSBhdl9jbGlwbF9pbnQzMih0ICogKGludDY0X3QpY25nX2ZpbHRbMF0gPj4gMTYpOwogCiAgICAgaWYgKHggPj0gY25nX2JzZWdbMl0pCiAgICAgICAgIHJldHVybiAweDNGOwpAQCAtNjk0LDEzICs3MDEsMTMgQEAKICAgICBpZiAoeSA8PSAwKSB7CiAgICAgICAgIHQgPSBzZWcgKiAzMiArICh2YWwgKyAxIDw8IHNlZzIpOwogICAgICAgICB0ID0gdCAqIHQgLSB4OwotICAgICAgICB2YWwgPSAoc2VnMiAtIDEgPDwgNCkgKyB2YWw7CisgICAgICAgIHZhbCA9IChzZWcyIC0gMSkgKiAxNiArIHZhbDsKICAgICAgICAgaWYgKHQgPj0geSkKICAgICAgICAgICAgIHZhbCsrOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHQgPSBzZWcgKiAzMiArICh2YWwgLSAxIDw8IHNlZzIpOwogICAgICAgICB0ID0gdCAqIHQgLSB4OwotICAgICAgICB2YWwgPSAoc2VnMiAtIDEgPDwgNCkgKyB2YWw7CisgICAgICAgIHZhbCA9IChzZWcyIC0gMSkgKiAxNiArIHZhbDsKICAgICAgICAgaWYgKHQgPj0geSkKICAgICAgICAgICAgIHZhbC0tOwogICAgIH0KQEAgLTczMiw3ICs3MzksNyBAQAogICAgICAgICBvZmZbaSAqIDIgKyAxXSA9ICgodCA+PiAxKSAmIDEpICsgU1VCRlJBTUVfTEVOOwogICAgICAgICB0ID4+PSAyOwogICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTE7IGorKykgewotICAgICAgICAgICAgc2lnbnNbaSAqIDExICsgal0gPSAodCAmIDEpICogMiAtIDEgPDwgMTQ7CisgICAgICAgICAgICBzaWduc1tpICogMTEgKyBqXSA9ICgodCAmIDEpICogMiAtIDEpICAqICgxIDw8IDE0KTsKICAgICAgICAgICAgIHQgPj49IDE7CiAgICAgICAgIH0KICAgICB9CkBAIC03NzYsNyArNzgzLDcgQEAKICAgICAgICAgc3VtID0gMDsKICAgICAgICAgaWYgKHNoaWZ0IDwgMCkgewogICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgU1VCRlJBTUVfTEVOICogMjsgaisrKSB7Ci0gICAgICAgICAgICAgICB0ICAgICAgPSB2ZWN0b3JfcHRyW2pdIDw8IC1zaGlmdDsKKyAgICAgICAgICAgICAgIHQgICAgICA9IHZlY3Rvcl9wdHJbal0gKiAoMSA8PCAtc2hpZnQpOwogICAgICAgICAgICAgICAgc3VtICAgKz0gdCAqIHQ7CiAgICAgICAgICAgICAgICB0bXBbal0gPSB0OwogICAgICAgICAgICB9CkBAIC04MTQsNyArODIxLDcgQEAKICAgICAgICAgaWYgKHNoaWZ0IDwgMCkKICAgICAgICAgICAgeCA+Pj0gLXNoaWZ0OwogICAgICAgICBlbHNlCi0gICAgICAgICAgIHggPDw9IHNoaWZ0OworICAgICAgICAgICB4ICo9IDEgPDwgc2hpZnQ7CiAgICAgICAgIHggPSBhdl9jbGlwKHgsIC0xMDAwMCwgMTAwMDApOwogCiAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMTsgaisrKSB7CkBAIC05MDMsNyArOTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT5zdWJmcmFtZVtpXSwgcC0+Y3VyX3JhdGUpOwogICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgdG90YWwgZXhjaXRhdGlvbiAqLwogICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBTVUJGUkFNRV9MRU47IGorKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IGF2X2NsaXBfaW50MTYodmVjdG9yX3B0cltqXSA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHYgPSBhdl9jbGlwX2ludDE2KHZlY3Rvcl9wdHJbal0gKiAyKTsKICAgICAgICAgICAgICAgICAgICAgdmVjdG9yX3B0cltqXSA9IGF2X2NsaXBfaW50MTYodiArIGFjYl92ZWN0b3Jbal0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB2ZWN0b3JfcHRyICs9IFNVQkZSQU1FX0xFTjsKQEAgLTkxNCw3ICs5MjEsNyBAQAogICAgICAgICAgICAgcC0+aW50ZXJwX2luZGV4ID0gY29tcF9pbnRlcnBfaW5kZXgocCwgcC0+cGl0Y2hfbGFnWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnNpZF9nYWluLCAmcC0+Y3VyX2dhaW4pOwogCi0gICAgICAgICAgICAvKiBQZWZvcm0gcGl0Y2ggcG9zdGZpbHRlcmluZyAqLworICAgICAgICAgICAgLyogUGVyZm9ybSBwaXRjaCBwb3N0ZmlsdGVyaW5nICovCiAgICAgICAgICAgICBpZiAocC0+cG9zdGZpbHRlcikgewogICAgICAgICAgICAgICAgIGkgPSBQSVRDSF9NQVg7CiAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IFNVQkZSQU1FUzsgaSArPSBTVUJGUkFNRV9MRU4sIGorKykKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZzcyM18xZW5jLmMgYi9saWJhdmNvZGVjL2c3MjNfMWVuYy5jCmluZGV4IGU3YWZhNGQuLjRhNDUyNWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZzcyM18xZW5jLmMKKysrIGIvbGliYXZjb2RlYy9nNzIzXzFlbmMuYwpAQCAtNTcsNyArNTcsOCBAQAogICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPT0gNjMwMCkgewogICAgICAgICBwLT5jdXJfcmF0ZSA9IFJBVEVfNjMwMDsKICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA9PSA1MzAwKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQml0cmF0ZSBub3Qgc3VwcG9ydGVkIHlldCwgdXNlIDYzMDBcbiIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVzZSBiaXRyYXRlIDYzMDAgaW5zdGVhZCBvZiA1MzAwLlxuIik7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiQml0cmF0ZSA1MzAwIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJpdHJhdGUgbm90IHN1cHBvcnRlZCwgdXNlIDYzMDBcbiIpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9nNzI2LmMgYi9saWJhdmNvZGVjL2c3MjYuYwppbmRleCBjM2QwMThmLi44MGNiMDY0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2c3MjYuYworKysgYi9saWJhdmNvZGVjL2c3MjYuYwpAQCAtMzEsMTUgKzMxLDE1IEBACiAjaW5jbHVkZSAicHV0X2JpdHMuaCIKIAogLyoqCi0gKiBHLjcyNiAxMWJpdCBmbG9hdC4KLSAqIEcuNzI2IFN0YW5kYXJkIHVzZXMgcmF0aGVyIG9kZCAxMWJpdCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGZvcgorICogRy43MjYgMTEtYml0IGZsb2F0LgorICogRy43MjYgU3RhbmRhcmQgdXNlcyByYXRoZXIgb2RkIDExLWJpdCBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljIGZvcgogICogbnVtZXJvdXMgb2NjYXNpb25zLiBJdCdzIGEgbXlzdGVyeSB0byBtZSB3aHkgdGhleSBkaWQgaXQgdGhpcyB3YXkKLSAqIGluc3RlYWQgb2Ygc2ltcGx5IHVzaW5nIDMyYml0IGludGVnZXIgYXJpdGhtZXRpYy4KKyAqIGluc3RlYWQgb2Ygc2ltcGx5IHVzaW5nIDMyLWJpdCBpbnRlZ2VyIGFyaXRobWV0aWMuCiAgKi8KIHR5cGVkZWYgc3RydWN0IEZsb2F0MTEgewotICAgIHVpbnQ4X3Qgc2lnbjsgICAvKio8IDFiaXQgc2lnbiAqLwotICAgIHVpbnQ4X3QgZXhwOyAgICAvKio8IDRiaXQgZXhwb25lbnQgKi8KLSAgICB1aW50OF90IG1hbnQ7ICAgLyoqPCA2Yml0IG1hbnRpc3NhICovCisgICAgdWludDhfdCBzaWduOyAgIC8qKjwgMSBiaXQgc2lnbiAqLworICAgIHVpbnQ4X3QgZXhwOyAgICAvKio8IDQgYml0cyBleHBvbmVudCAqLworICAgIHVpbnQ4X3QgbWFudDsgICAvKio8IDYgYml0cyBtYW50aXNzYSAqLwogfSBGbG9hdDExOwogCiBzdGF0aWMgaW5saW5lIEZsb2F0MTEqIGkyZihpbnQgaSwgRmxvYXQxMSogZikKQEAgLTk4LDcgKzk4LDcgQEAKICAgICBpbnQgbGl0dGxlX2VuZGlhbjsgIC8qKjwgbGl0dGxlLWVuZGlhbiBiaXRzdHJlYW0gYXMgdXNlZCBpbiBhaWZmIGFuZCBTdW4gQVUgKi8KIH0gRzcyNkNvbnRleHQ7CiAKLXN0YXRpYyBjb25zdCBpbnQgcXVhbnRfdGJsMTZbXSA9ICAgICAgICAgICAgICAgICAgLyoqPCAxNmtiaXQvcyAyYml0cyBwZXIgc2FtcGxlICovCitzdGF0aWMgY29uc3QgaW50IHF1YW50X3RibDE2W10gPSAgICAgICAgICAgICAgICAgIC8qKjwgMTZrYml0L3MgMiBiaXRzIHBlciBzYW1wbGUgKi8KICAgICAgICAgICAgeyAyNjAsIElOVF9NQVggfTsKIHN0YXRpYyBjb25zdCBpbnQxNl90IGlxdWFudF90YmwxNltdID0KICAgICAgICAgICAgeyAxMTYsIDM2NSwgMzY1LCAxMTYgfTsKQEAgLTEwNyw3ICsxMDcsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3QgRl90YmwxNltdID0KICAgICAgICAgICAgeyAwLCA3LCA3LCAwIH07CiAKLXN0YXRpYyBjb25zdCBpbnQgcXVhbnRfdGJsMjRbXSA9ICAgICAgICAgICAgICAgICAgLyoqPCAyNGtiaXQvcyAzYml0cyBwZXIgc2FtcGxlICovCitzdGF0aWMgY29uc3QgaW50IHF1YW50X3RibDI0W10gPSAgICAgICAgICAgICAgICAgIC8qKjwgMjRrYml0L3MgMyBiaXRzIHBlciBzYW1wbGUgKi8KICAgICAgICAgICAgeyAgNywgMjE3LCAzMzAsIElOVF9NQVggfTsKIHN0YXRpYyBjb25zdCBpbnQxNl90IGlxdWFudF90YmwyNFtdID0KICAgICAgICAgICAgeyBJTlQxNl9NSU4sIDEzNSwgMjczLCAzNzMsIDM3MywgMjczLCAxMzUsIElOVDE2X01JTiB9OwpAQCAtMTE2LDcgKzExNiw3IEBACiBzdGF0aWMgY29uc3QgdWludDhfdCBGX3RibDI0W10gPQogICAgICAgICAgICB7IDAsIDEsIDIsIDcsIDcsIDIsIDEsIDAgfTsKIAotc3RhdGljIGNvbnN0IGludCBxdWFudF90YmwzMltdID0gICAgICAgICAgICAgICAgICAvKio8IDMya2JpdC9zIDRiaXRzIHBlciBzYW1wbGUgKi8KK3N0YXRpYyBjb25zdCBpbnQgcXVhbnRfdGJsMzJbXSA9ICAgICAgICAgICAgICAgICAgLyoqPCAzMmtiaXQvcyA0IGJpdHMgcGVyIHNhbXBsZSAqLwogICAgICAgICAgICB7IC0xMjUsICA3OSwgMTc3LCAyNDUsIDI5OSwgMzQ4LCAzOTksIElOVF9NQVggfTsKIHN0YXRpYyBjb25zdCBpbnQxNl90IGlxdWFudF90YmwzMltdID0KICAgICAgICAgIHsgSU5UMTZfTUlOLCAgIDQsIDEzNSwgMjEzLCAyNzMsIDMyMywgMzczLCA0MjUsCkBAIC0xMjcsNyArMTI3LDcgQEAKIHN0YXRpYyBjb25zdCB1aW50OF90IEZfdGJsMzJbXSA9CiAgICAgICAgICAgIHsgMCwgMCwgMCwgMSwgMSwgMSwgMywgNywgNywgMywgMSwgMSwgMSwgMCwgMCwgMCB9OwogCi1zdGF0aWMgY29uc3QgaW50IHF1YW50X3RibDQwW10gPSAgICAgICAgICAgICAgICAgIC8qKjwgNDBrYml0L3MgNWJpdHMgcGVyIHNhbXBsZSAqLworc3RhdGljIGNvbnN0IGludCBxdWFudF90Ymw0MFtdID0gICAgICAgICAgICAgICAgICAvKio8IDQwa2JpdC9zIDUgYml0cyBwZXIgc2FtcGxlICovCiAgICAgICAgICAgIHsgLTEyMiwgLTE2LCAgNjcsIDEzOCwgMTk3LCAyNDksIDI5NywgMzM4LAogICAgICAgICAgICAgICAzNzcsIDQxMiwgNDQ0LCA0NzQsIDUwMSwgNTI3LCA1NTIsIElOVF9NQVggfTsKIHN0YXRpYyBjb25zdCBpbnQxNl90IGlxdWFudF90Ymw0MFtdID0KQEAgLTE1Miw3ICsxNTIsNyBAQAogCiAKIC8qKgotICogUGFyYSA0LjIuMiBwYWdlIDE4OiBBZGFwdGl2ZSBxdWFudGl6ZXIuCisgKiBQYXJhZ3JhcGggNC4yLjIgcGFnZSAxODogQWRhcHRpdmUgcXVhbnRpemVyLgogICovCiBzdGF0aWMgaW5saW5lIHVpbnQ4X3QgcXVhbnQoRzcyNkNvbnRleHQqIGMsIGludCBkKQogewpAQCAtMTc4LDE0ICsxNzgsMTQgQEAKIH0KIAogLyoqCi0gKiBQYXJhIDQuMi4zIHBhZ2UgMjI6IEludmVyc2UgYWRhcHRpdmUgcXVhbnRpemVyLgorICogUGFyYWdyYXBoIDQuMi4zIHBhZ2UgMjI6IEludmVyc2UgYWRhcHRpdmUgcXVhbnRpemVyLgogICovCiBzdGF0aWMgaW5saW5lIGludDE2X3QgaW52ZXJzZV9xdWFudChHNzI2Q29udGV4dCogYywgaW50IGkpCiB7CiAgICAgaW50IGRxbCwgZGV4LCBkcXQ7CiAKICAgICBkcWwgPSBjLT50YmxzLmlxdWFudFtpXSArIChjLT55ID4+IDIpOwotICAgIGRleCA9IChkcWw+PjcpICYgMHhmOyAgICAgICAgLyogNGJpdCBleHBvbmVudCAqLworICAgIGRleCA9IChkcWw+PjcpICYgMHhmOyAgICAgICAgLyogNC1iaXQgZXhwb25lbnQgKi8KICAgICBkcXQgPSAoMTw8NykgKyAoZHFsICYgMHg3Zik7IC8qIGxvZzIgLT4gbGluZWFyICovCiAgICAgcmV0dXJuIChkcWwgPCAwKSA/IDAgOiAoKGRxdDw8ZGV4KSA+PiA3KTsKIH0KQEAgLTIwNiw3ICsyMDYsNyBAQAogCiAgICAgaWYgKElfc2lnKSAgLyogZ2V0IHRoZSBzaWduICovCiAgICAgICAgIGRxID0gLWRxOwotICAgIHJlX3NpZ25hbCA9IGMtPnNlICsgZHE7CisgICAgcmVfc2lnbmFsID0gKGludDE2X3QpKGMtPnNlICsgZHEpOwogCiAgICAgLyogVXBkYXRlIHNlY29uZCBvcmRlciBwcmVkaWN0b3IgY29lZmZpY2llbnQgQTIgYW5kIEExICovCiAgICAgcGswID0gKGMtPnNleiArIGRxKSA/IHNnbihjLT5zZXogKyBkcSkgOiAwOwpAQCAtMjY5LDcgKzI2OSw3IEBACiAgICAgICAgIGMtPnNlICs9IG11bHQoaTJmKGMtPmFbaV0gPj4gMiwgJmYpLCAmYy0+c3JbaV0pOwogICAgIGMtPnNlID4+PSAxOwogCi0gICAgcmV0dXJuIGF2X2NsaXAocmVfc2lnbmFsIDw8IDIsIC0weGZmZmYsIDB4ZmZmZik7CisgICAgcmV0dXJuIGF2X2NsaXAocmVfc2lnbmFsICogNCwgLTB4ZmZmZiwgMHhmZmZmKTsKIH0KIAogc3RhdGljIGF2X2NvbGQgaW50IGc3MjZfcmVzZXQoRzcyNkNvbnRleHQgKmMpCkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotI2lmIENPTkZJR19BRFBDTV9HNzI2X0VOQ09ERVIKKyNpZiBDT05GSUdfQURQQ01fRzcyNl9FTkNPREVSIHx8IENPTkZJR19BRFBDTV9HNzI2TEVfRU5DT0RFUgogc3RhdGljIGludDE2X3QgZzcyNl9lbmNvZGUoRzcyNkNvbnRleHQqIGMsIGludDE2X3Qgc2lnKQogewogICAgIHVpbnQ4X3QgaTsKQEAgLTMwOCw2ICszMDgsOCBAQAogewogICAgIEc3MjZDb250ZXh0KiBjID0gYXZjdHgtPnByaXZfZGF0YTsKIAorICAgIGMtPmxpdHRsZV9lbmRpYW4gPSAhc3RyY21wKGF2Y3R4LT5jb2RlYy0+bmFtZSwgImc3MjZsZSIpOworCiAgICAgaWYgKGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwgJiYKICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlICE9IDgwMDApIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTYW1wbGUgcmF0ZXMgb3RoZXIgdGhhbiA4a0h6IGFyZSBub3QgIgpAQCAtMzU2LDkgKzM1OCwxNyBAQAogICAgIGluaXRfcHV0X2JpdHMoJnBiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lLT5uYl9zYW1wbGVzOyBpKyspCi0gICAgICAgIHB1dF9iaXRzKCZwYiwgYy0+Y29kZV9zaXplLCBnNzI2X2VuY29kZShjLCAqc2FtcGxlcysrKSk7CisgICAgICAgIGlmIChjLT5saXR0bGVfZW5kaWFuKSB7CisgICAgICAgICAgICBwdXRfYml0c19sZSgmcGIsIGMtPmNvZGVfc2l6ZSwgZzcyNl9lbmNvZGUoYywgKnNhbXBsZXMrKykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCBjLT5jb2RlX3NpemUsIGc3MjZfZW5jb2RlKGMsICpzYW1wbGVzKyspKTsKKyAgICAgICAgfQogCi0gICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKyAgICBpZiAoYy0+bGl0dGxlX2VuZGlhbikgeworICAgICAgICBmbHVzaF9wdXRfYml0c19sZSgmcGIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisgICAgfQogCiAgICAgYXZwa3QtPnNpemUgPSBvdXRfc2l6ZTsKICAgICAqZ290X3BhY2tldF9wdHIgPSAxOwpAQCAtMzcyLDYgKzM4MiwxMyBAQAogICAgIHsgTlVMTCB9LAogfTsKIAorc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IGRlZmF1bHRzW10gPSB7CisgICAgeyAiYiIsICIwIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0FEUENNX0c3MjZfRU5DT0RFUgogc3RhdGljIGNvbnN0IEFWQ2xhc3MgZzcyNl9jbGFzcyA9IHsKICAgICAuY2xhc3NfbmFtZSA9ICJnNzI2IiwKICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLApAQCAtMzc5LDExICszOTYsNiBAQAogICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAotc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IGRlZmF1bHRzW10gPSB7Ci0gICAgeyAiYiIsICIwIiB9LAotICAgIHsgTlVMTCB9LAotfTsKLQogQVZDb2RlYyBmZl9hZHBjbV9nNzI2X2VuY29kZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImc3MjYiLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHLjcyNiBBRFBDTSIpLApAQCAtNDAwLDYgKzQxMiwzMCBAQAogfTsKICNlbmRpZgogCisjaWYgQ09ORklHX0FEUENNX0c3MjZMRV9FTkNPREVSCitzdGF0aWMgY29uc3QgQVZDbGFzcyBnNzI2bGVfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZzcyNmxlIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfYWRwY21fZzcyNmxlX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImc3MjZsZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkcuNzI2IGxpdHRsZSBlbmRpYW4gQURQQ00gKFwicmlnaHQtanVzdGlmaWVkXCIpIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjZMRSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRzcyNkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGc3MjZfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZzcyNl9lbmNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX1NNQUxMX0xBU1RfRlJBTUUsCisgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZzcyNmxlX2NsYXNzLAorICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorfTsKKyNlbmRpZgorCiAjaWYgQ09ORklHX0FEUENNX0c3MjZfREVDT0RFUiB8fCBDT05GSUdfQURQQ01fRzcyNkxFX0RFQ09ERVIKIHN0YXRpYyBhdl9jb2xkIGludCBnNzI2X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZ2R2LmMgYi9saWJhdmNvZGVjL2dkdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGQ1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2dkdi5jCkBAIC0wLDAgKzEsNTIwIEBACisvKgorICogR3JlbWxpbiBEaWdpdGFsIFZpZGVvIChHRFYpIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBLb25zdGFudGluIFNoaXNoa292CisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBHRFZDb250ZXh0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBHZXRCeXRlQ29udGV4dCBnMjsKKyAgICBQdXRCeXRlQ29udGV4dCBwYjsKKworICAgIHVpbnQzMl90IHBhbFsyNTZdOworICAgIHVpbnQ4X3QgKmZyYW1lOworICAgIHVuc2lnbmVkIGZyYW1lX3NpemU7CisgICAgdW5zaWduZWQgc2NhbGVfaCwgc2NhbGVfdjsKK30gR0RWQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgQml0czggeworICAgIHVpbnQ4X3QgcXVldWU7CisgICAgdWludDhfdCBmaWxsOworfSBCaXRzODsKKwordHlwZWRlZiBzdHJ1Y3QgQml0czMyIHsKKyAgICB1aW50MzJfdCBxdWV1ZTsKKyAgICB1aW50OF90ICBmaWxsOworfSBCaXRzMzI7CisKKyNkZWZpbmUgUFJFQU1CTEVfU0laRSA0MDk2CisKK3N0YXRpYyBhdl9jb2xkIGludCBnZHZfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEdEVkNvbnRleHQgKmdkdiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIGosIGs7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCAgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgZ2R2LT5mcmFtZV9zaXplID0gYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCArIFBSRUFNQkxFX1NJWkU7CisgICAgZ2R2LT5mcmFtZSA9IGF2X2NhbGxvYyhnZHYtPmZyYW1lX3NpemUsIDEpOworICAgIGlmICghZ2R2LT5mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisgICAgICAgICAgICAgICAgZ2R2LT5mcmFtZVtpICogMjA0OCArIGogKiA4ICsga10gPSBqOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2NhbGUoR0RWQ29udGV4dCAqZ2R2LCB1aW50OF90ICpkc3QsIGludCB3LCBpbnQgaCwgaW50IHNjYWxlX3YsIGludCBzY2FsZV9oKQoreworICAgIGludCBpLCBqLCB5LCB4OworCisgICAgaWYgKChnZHYtPnNjYWxlX3YgPT0gc2NhbGVfdikgJiYgKGdkdi0+c2NhbGVfaCA9PSBzY2FsZV9oKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGdkdi0+c2NhbGVfaCAmJiBnZHYtPnNjYWxlX3YpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgICAgICAgICAgaW50IHkgPSBoIC0gaiAtIDE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHggPSB3IC0gaSAtIDE7CisgICAgICAgICAgICAgICAgZHN0W1BSRUFNQkxFX1NJWkUgKyB4ICsgeSAqIHddID0gZHN0W1BSRUFNQkxFX1NJWkUgKyAoeD4+MSkgKyAoeT4+MSkgKiAodz4+MSldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChnZHYtPnNjYWxlX2gpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgICAgICAgICAgaW50IHkgPSBoIC0gaiAtIDE7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0W1BSRUFNQkxFX1NJWkUgKyB4ICsgeSAqIHddID0gZHN0W1BSRUFNQkxFX1NJWkUgKyB4ICsgKHk+PjEpICogd107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGdkdi0+c2NhbGVfdikgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBpbnQgeSA9IGggLSBqIC0gMTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IHcgLSBpIC0gMTsKKyAgICAgICAgICAgICAgICBkc3RbUFJFQU1CTEVfU0laRSArIHggKyB5ICogd10gPSBkc3RbUFJFQU1CTEVfU0laRSArICh4Pj4xKSArIHkgKiAodz4+MSldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNjYWxlX2ggJiYgc2NhbGVfdikgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgKGg+PjEpOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAodz4+MSk7IHgrKykgeworICAgICAgICAgICAgICAgIGRzdFtQUkVBTUJMRV9TSVpFICsgeCArIHkgKiAodz4+MSldID0gZHN0W1BSRUFNQkxFX1NJWkUgKyB4KjIgKyB5KjIgKiB3XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2NhbGVfaCkgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgKGg+PjEpOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RbUFJFQU1CTEVfU0laRSArIHggKyB5ICogd10gPSBkc3RbUFJFQU1CTEVfU0laRSArIHggKyB5KjIgKiB3XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2NhbGVfdikgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgKHc+PjEpOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RbUFJFQU1CTEVfU0laRSArIHggKyB5ICogd10gPSBkc3RbUFJFQU1CTEVfU0laRSArIHgqMiArIHkgKiB3XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGdkdi0+c2NhbGVfdiA9IHNjYWxlX3Y7CisgICAgZ2R2LT5zY2FsZV9oID0gc2NhbGVfaDsKK30KKworc3RhdGljIGludCByZWFkX2JpdHMyKEJpdHM4ICpiaXRzLCBHZXRCeXRlQ29udGV4dCAqZ2IpCit7CisgICAgaW50IHJlczsKKworICAgIGlmIChiaXRzLT5maWxsID09IDApIHsKKyAgICAgICAgYml0cy0+cXVldWUgfD0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICBiaXRzLT5maWxsICAgPSA4OworICAgIH0KKyAgICByZXMgPSBiaXRzLT5xdWV1ZSA+PiA2OworICAgIGJpdHMtPnF1ZXVlIDw8PSAyOworICAgIGJpdHMtPmZpbGwgICAtPSAyOworCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgZmlsbF9iaXRzMzIoQml0czMyICpiaXRzLCBHZXRCeXRlQ29udGV4dCAqZ2IpCit7CisgICAgYml0cy0+cXVldWUgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgYml0cy0+ZmlsbCAgPSAzMjsKK30KKworc3RhdGljIGludCByZWFkX2JpdHMzMihCaXRzMzIgKmJpdHMsIEdldEJ5dGVDb250ZXh0ICpnYiwgaW50IG5iaXRzKQoreworICAgIGludCByZXMgPSBiaXRzLT5xdWV1ZSAmICgoMSA8PCBuYml0cykgLSAxKTsKKworICAgIGJpdHMtPnF1ZXVlID4+PSBuYml0czsKKyAgICBiaXRzLT5maWxsICAgLT0gbmJpdHM7CisgICAgaWYgKGJpdHMtPmZpbGwgPD0gMTYpIHsKKyAgICAgICAgYml0cy0+cXVldWUgfD0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpIDw8IGJpdHMtPmZpbGw7CisgICAgICAgIGJpdHMtPmZpbGwgICs9IDE2OworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGx6X2NvcHkoUHV0Qnl0ZUNvbnRleHQgKnBiLCBHZXRCeXRlQ29udGV4dCAqZzIsIGludCBvZmZzZXQsIHVuc2lnbmVkIGxlbikKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChvZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgaW50IGM7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2VlayhnMiwgYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSAtIDEsIFNFRUtfU0VUKTsKKyAgICAgICAgYyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGcyKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDApIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSAtICgtb2Zmc2V0KTsKKworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKGcyLCBzdGFydCwgU0VFS19TRVQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnMikpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSArIG9mZnNldDsKKworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKGcyLCBzdGFydCwgU0VFS19TRVQpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnMikpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29tcHJlc3NfMihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgR0RWQ29udGV4dCAqZ2R2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCAqZ2IgPSAmZ2R2LT5nYjsKKyAgICBHZXRCeXRlQ29udGV4dCAqZzIgPSAmZ2R2LT5nMjsKKyAgICBQdXRCeXRlQ29udGV4dCAqcGIgPSAmZ2R2LT5wYjsKKyAgICBCaXRzOCBiaXRzID0geyAwIH07CisgICAgaW50IGMsIGk7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KGcyLCBnZHYtPmZyYW1lLCBnZHYtPmZyYW1lX3NpemUpOworICAgIGJ5dGVzdHJlYW0yX3NraXBfcChwYiwgUFJFQU1CTEVfU0laRSk7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgMjU2OyBjKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIGdkdi0+ZnJhbWVbYyAqIDE2ICsgaV0gPSBjOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0X3AocGIpID4gMCAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPiAwKSB7CisgICAgICAgIGludCB0YWcgPSByZWFkX2JpdHMyKCZiaXRzLCBnYik7CisgICAgICAgIGlmICh0YWcgPT0gMCkgeworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDEpIHsKKyAgICAgICAgICAgIGludCBiID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgaW50IGxlbiA9IChiICYgMHhGKSArIDM7CisgICAgICAgICAgICBpbnQgdG9wID0gKGIgPj4gNCkgJiAweEY7CisgICAgICAgICAgICBpbnQgb2ZmID0gKGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSA8PCA0KSArIHRvcCAtIDQwOTY7CisgICAgICAgICAgICBsel9jb3B5KHBiLCBnMiwgb2ZmLCBsZW4pOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAyKSB7CisgICAgICAgICAgICBpbnQgbGVuID0gKGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSkgKyAyOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcF9wKHBiLCBsZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb21wcmVzc181KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdW5zaWduZWQgc2tpcCkKK3sKKyAgICBHRFZDb250ZXh0ICpnZHYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJ5dGVDb250ZXh0ICpnYiA9ICZnZHYtPmdiOworICAgIEdldEJ5dGVDb250ZXh0ICpnMiA9ICZnZHYtPmcyOworICAgIFB1dEJ5dGVDb250ZXh0ICpwYiA9ICZnZHYtPnBiOworICAgIEJpdHM4IGJpdHMgPSB7IDAgfTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoZzIsIGdkdi0+ZnJhbWUsIGdkdi0+ZnJhbWVfc2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfc2tpcF9wKHBiLCBza2lwICsgUFJFQU1CTEVfU0laRSk7CisKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnRfcChwYikgPiAwICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA+IDApIHsKKyAgICAgICAgaW50IHRhZyA9IHJlYWRfYml0czIoJmJpdHMsIGdiKTsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8IDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMSkgeworICAgICAgICAgICAgaW50IGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICBpbnQgbGVuID0gKGIgJiAweEYpICsgMzsKKyAgICAgICAgICAgIGludCB0b3AgPSBiID4+IDQ7CisgICAgICAgICAgICBpbnQgb2ZmID0gKGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSA8PCA0KSArIHRvcCAtIDQwOTY7CisgICAgICAgICAgICBsel9jb3B5KHBiLCBnMiwgb2ZmLCBsZW4pOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAyKSB7CisgICAgICAgICAgICBpbnQgbGVuOworICAgICAgICAgICAgaW50IGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICBpZiAoYiA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYiAhPSAweEZGKSB7CisgICAgICAgICAgICAgICAgbGVuID0gYjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcF9wKHBiLCBsZW4gKyAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBiID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgaW50IGxlbiA9IChiICYgMHgzKSArIDI7CisgICAgICAgICAgICBpbnQgb2ZmID0gLShiID4+IDIpIC0gMTsKKyAgICAgICAgICAgIGx6X2NvcHkocGIsIGcyLCBvZmYsIGxlbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb21wcmVzc182OChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVuc2lnbmVkIHNraXAsIHVuc2lnbmVkIHVzZTgpCit7CisgICAgR0RWQ29udGV4dCAqZ2R2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCAqZ2IgPSAmZ2R2LT5nYjsKKyAgICBHZXRCeXRlQ29udGV4dCAqZzIgPSAmZ2R2LT5nMjsKKyAgICBQdXRCeXRlQ29udGV4dCAqcGIgPSAmZ2R2LT5wYjsKKyAgICBCaXRzMzIgYml0czsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoZzIsIGdkdi0+ZnJhbWUsIGdkdi0+ZnJhbWVfc2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfc2tpcF9wKHBiLCBza2lwICsgUFJFQU1CTEVfU0laRSk7CisgICAgZmlsbF9iaXRzMzIoJmJpdHMsIGdiKTsKKworICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdF9wKHBiKSA+IDAgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICBpbnQgdGFnID0gcmVhZF9iaXRzMzIoJmJpdHMsIGdiLCAyKTsKKyAgICAgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAgICAgICBpbnQgYiA9IHJlYWRfYml0czMyKCZiaXRzLCBnYiwgMSk7CisgICAgICAgICAgICBpZiAoYiA9PSAwKSB7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBpLCBsZW4gPSAyOworICAgICAgICAgICAgICAgIGludCBsYml0cyA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbDsKKworICAgICAgICAgICAgICAgICAgICBsYml0cyArPSAxOworICAgICAgICAgICAgICAgICAgICB2YWwgPSByZWFkX2JpdHMzMigmYml0cywgZ2IsIGxiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgbGVuICs9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCAhPSAoKDEgPDwgbGJpdHMpIC0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChsYml0cyA8IDE2KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMSkgeworICAgICAgICAgICAgaW50IGIgPSByZWFkX2JpdHMzMigmYml0cywgZ2IsIDEpOworICAgICAgICAgICAgaW50IGxlbjsKKworICAgICAgICAgICAgaWYgKGIgPT0gMCkgeworICAgICAgICAgICAgICAgIGxlbiA9IChyZWFkX2JpdHMzMigmYml0cywgZ2IsIDQpKSArIDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBiYiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICBpZiAoKGJiICYgMHg4MCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSBiYiArIDE4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludCB0b3AgPSAoYmIgJiAweDdGKSA8PCA4OworICAgICAgICAgICAgICAgICAgICBsZW4gPSB0b3AgKyBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgKyAxNDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcF9wKHBiLCBsZW4pOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSAyKSB7CisgICAgICAgICAgICBpbnQgaSwgc3VidGFnID0gcmVhZF9iaXRzMzIoJmJpdHMsIGdiLCAyKTsKKworICAgICAgICAgICAgaWYgKHN1YnRhZyAhPSAzKSB7CisgICAgICAgICAgICAgICAgaW50IHRvcCA9IChyZWFkX2JpdHMzMigmYml0cywgZ2IsIDQpKSA8PCA4OworICAgICAgICAgICAgICAgIGludCBvZmZzID0gdG9wICsgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgIGlmICgoc3VidGFnICE9IDApIHx8IChvZmZzIDw9IDB4RjgwKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gKHN1YnRhZykgKyAzOworICAgICAgICAgICAgICAgICAgICBsel9jb3B5KHBiLCBnMiwgKG9mZnMpIC0gNDA5NiwgbGVuKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmVhbF9vZmYsIGxlbiwgYzEsIGMyOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvZmZzID09IDB4RkZGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJlYWxfb2ZmID0gKChvZmZzID4+IDQpICYgMHg3KSArIDE7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9ICgob2ZmcyAmIDB4RikgKyAyKSAqIDI7CisgICAgICAgICAgICAgICAgICAgIGMxID0gZ2R2LT5mcmFtZVtieXRlc3RyZWFtMl90ZWxsX3AocGIpIC0gcmVhbF9vZmZdOworICAgICAgICAgICAgICAgICAgICBjMiA9IGdkdi0+ZnJhbWVbYnl0ZXN0cmVhbTJfdGVsbF9wKHBiKSAtIHJlYWxfb2ZmICsgMV07CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW4vMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZShwYiwgYzEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGMyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgaW50IG9mZiA9ICgoYiAmIDB4N0YpKSArIDE7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9ICgoYiAmIDB4ODApID09IDApID8gMiA6IDM7CisKKyAgICAgICAgICAgICAgICBsel9jb3B5KHBiLCBnMiwgLW9mZiwgbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICBpbnQgb2ZmOworICAgICAgICAgICAgaWYgKHVzZTgpIHsKKyAgICAgICAgICAgICAgICBpbnQgcSwgYiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICBpZiAoKGIgJiAweEMwKSA9PSAweEMwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbiA9ICgoYiAmIDB4M0YpKSArIDg7CisgICAgICAgICAgICAgICAgICAgIHEgPSByZWFkX2JpdHMzMigmYml0cywgZ2IsIDQpOworICAgICAgICAgICAgICAgICAgICBvZmYgPSAocSA8PCA4KSArIChieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgb2ZzMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKChiID4+IDQpKSArIDY7CisgICAgICAgICAgICAgICAgICAgICAgICBvZnMxID0gKGIgJiAweEYpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKChiICYgMHgzRikpICsgMTQ7CisgICAgICAgICAgICAgICAgICAgICAgICBvZnMxID0gcmVhZF9iaXRzMzIoJmJpdHMsIGdiLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvZmYgPSAob2ZzMSA8PCA4KSArIChieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpIC0gNDA5NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBvZnMxLCBiID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworCisgICAgICAgICAgICAgICAgaWYgKChiID4+IDQpID09IDB4RikgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgKyAyMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsZW4gPSAoYiA+PiA0KSArIDY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9mczEgPSAoYiAmIDB4Rik7CisgICAgICAgICAgICAgICAgb2ZmID0gKG9mczEgPDwgOCkgKyBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgLSA0MDk2OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbHpfY29weShwYiwgZzIsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdkdl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgR0RWQ29udGV4dCAqZ2R2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBHZXRCeXRlQ29udGV4dCAqZ2IgPSAmZ2R2LT5nYjsKKyAgICBQdXRCeXRlQ29udGV4dCAqcGIgPSAmZ2R2LT5wYjsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisgICAgaW50IHJldCwgaSwgcGFsX3NpemU7CisgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsICZwYWxfc2l6ZSk7CisgICAgaW50IGNvbXByZXNzaW9uOworICAgIHVuc2lnbmVkIGZsYWdzOworICAgIHVpbnQ4X3QgKmRzdDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoZ2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIocGIsIGdkdi0+ZnJhbWUsIGdkdi0+ZnJhbWVfc2l6ZSk7CisKKyAgICBmbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiKTsKKyAgICBjb21wcmVzc2lvbiA9IGZsYWdzICYgMHhGOworCisgICAgaWYgKGNvbXByZXNzaW9uID09IDQgfHwgY29tcHJlc3Npb24gPT0gNyB8fCBjb21wcmVzc2lvbiA+IDgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAocGFsICYmIHBhbF9zaXplID09IEFWUEFMRVRURV9TSVpFKQorICAgICAgICBtZW1jcHkoZ2R2LT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworCisgICAgcmVzY2FsZShnZHYsIGdkdi0+ZnJhbWUsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICEhKGZsYWdzICYgMHgxMCksICEhKGZsYWdzICYgMHgyMCkpOworCisgICAgc3dpdGNoIChjb21wcmVzc2lvbikgeworICAgIGNhc2UgMToKKyAgICAgICAgbWVtc2V0KGdkdi0+ZnJhbWUgKyBQUkVBTUJMRV9TSVpFLCAwLCBnZHYtPmZyYW1lX3NpemUgLSBQUkVBTUJMRV9TSVpFKTsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCAyNTYqMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICB1bnNpZ25lZCBnID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgdW5zaWduZWQgYiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgIGdkdi0+cGFsW2ldID0gMHhGRlUgPDwgMjQgfCByIDw8IDE4IHwgZyA8PCAxMCB8IGIgPDwgMjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHJldCA9IGRlY29tcHJlc3NfMihhdmN0eCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICByZXQgPSBkZWNvbXByZXNzXzUoYXZjdHgsIGZsYWdzID4+IDgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIHJldCA9IGRlY29tcHJlc3NfNjgoYXZjdHgsIGZsYWdzID4+IDgsIDApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIHJldCA9IGRlY29tcHJlc3NfNjgoYXZjdHgsIGZsYWdzID4+IDgsIDEpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgZ2R2LT5wYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICBkc3QgPSBmcmFtZS0+ZGF0YVswXTsKKworICAgIGlmICghZ2R2LT5zY2FsZV92ICYmICFnZHYtPnNjYWxlX2gpIHsKKyAgICAgICAgaW50IHNpZHggPSBQUkVBTUJMRV9TSVpFLCBkaWR4ID0gMDsKKyAgICAgICAgaW50IHksIHg7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0W3grZGlkeF0gPSBnZHYtPmZyYW1lW3grc2lkeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaWR4ICs9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgIGRpZHggKz0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHNpZHggPSBQUkVBTUJMRV9TSVpFLCBkaWR4ID0gMDsKKyAgICAgICAgaW50IHksIHg7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgaWYgKCFnZHYtPnNjYWxlX3YpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2RpZHggKyB4XSA9IGdkdi0+ZnJhbWVbc2lkeCArIHhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFtkaWR4ICsgeF0gPSBnZHYtPmZyYW1lW3NpZHggKyB4LzJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZ2R2LT5zY2FsZV9oIHx8ICgoeSAmIDEpID09IDEpKSB7CisgICAgICAgICAgICAgICAgc2lkeCArPSAhZ2R2LT5zY2FsZV92ID8gYXZjdHgtPndpZHRoIDogYXZjdHgtPndpZHRoLzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaWR4ICs9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGdkdl9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEdEVkNvbnRleHQgKmdkdiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXZfZnJlZXAoJmdkdi0+ZnJhbWUpOworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2dkdl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnZHYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHcmVtbGluIERpZ2l0YWwgVmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfR0RWLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihHRFZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBnZHZfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gZ2R2X2RlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSBnZHZfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2dldF9iaXRzLmggYi9saWJhdmNvZGVjL2dldF9iaXRzLmgKaW5kZXggNGNmNjFkNi4uNTZlZjVmMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9nZXRfYml0cy5oCisrKyBiL2xpYmF2Y29kZWMvZ2V0X2JpdHMuaApAQCAtMzIsNyArMzIsOSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJ2bGMuaCIKIAogLyoKICAqIFNhZmUgYml0c3RyZWFtIHJlYWRpbmc6CkBAIC01OCwyMCArNjAsNiBAQAogICAgIGludCBzaXplX2luX2JpdHNfcGx1czg7CiB9IEdldEJpdENvbnRleHQ7CiAKLSNkZWZpbmUgVkxDX1RZUEUgaW50MTZfdAotCi10eXBlZGVmIHN0cnVjdCBWTEMgewotICAgIGludCBiaXRzOwotICAgIFZMQ19UWVBFICgqdGFibGUpWzJdOyAvLy88IGNvZGUsIGJpdHMKLSAgICBpbnQgdGFibGVfc2l6ZSwgdGFibGVfYWxsb2NhdGVkOwotfSBWTEM7Ci0KLXR5cGVkZWYgc3RydWN0IFJMX1ZMQ19FTEVNIHsKLSAgICBpbnQxNl90IGxldmVsOwotICAgIGludDhfdCBsZW47Ci0gICAgdWludDhfdCBydW47Ci19IFJMX1ZMQ19FTEVNOwotCiAvKiBCaXRzdHJlYW0gcmVhZGVyIEFQSSBkb2NzOgogICogbmFtZQogICogICBhcmJpdHJhcnkgbmFtZSB3aGljaCBpcyB1c2VkIGFzIHByZWZpeCBmb3IgdGhlIGludGVybmFsIHZhcmlhYmxlcwpAQCAtOTEsNyArNzksNyBAQAogICoKICAqIEdFVF9DQUNIRShuYW1lLCBnYikKICAqICAgV2lsbCBvdXRwdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbnRlcm5hbCBjYWNoZSwKLSAqICAgbmV4dCBiaXQgaXMgTVNCIG9mIDMyIG9yIDY0IGJpdCAoRklYTUUgNjRiaXQpLgorICogICBuZXh0IGJpdCBpcyBNU0Igb2YgMzIgb3IgNjQgYml0cyAoRklYTUUgNjQgYml0cykuCiAgKgogICogU0hPV19VQklUUyhuYW1lLCBnYiwgbnVtKQogICogICBXaWxsIHJldHVybiB0aGUgbmV4dCBudW0gYml0cy4KQEAgLTIxNCw2ICsyMDIsMTMgQEAKICAgICByZXR1cm4gcy0+aW5kZXg7CiB9CiAKKy8qKgorICogU2tpcHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4KKyAqIEBwYXJhbSBuIHRoZSBudW1iZXIgb2YgYml0cyB0byBza2lwLAorICogICAgICAgICAgRm9yIHRoZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiB0aGlzIG11c3Qgbm90IGNhdXNlIHRoZSBkaXN0YW5jZQorICogICAgICAgICAgZnJvbSB0aGUgc3RhcnQgdG8gb3ZlcmZsb3cgaW50MzJfdC4gU3RheWluZyB3aXRoaW4gdGhlIGJpdHN0cmVhbSArIHBhZGRpbmcKKyAqICAgICAgICAgIGlzIHN1ZmZpY2llbnQsIHRvby4KKyAqLwogc3RhdGljIGlubGluZSB2b2lkIHNraXBfYml0c19sb25nKEdldEJpdENvbnRleHQgKnMsIGludCBuKQogewogI2lmIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSCkBAIC0yMjQsNyArMjE5LDcgQEAKIH0KIAogLyoqCi0gKiByZWFkIG1wZWcxIGRjIHN0eWxlIHZsYyAoc2lnbiBiaXQgKyBtYW50aXNzYSB3aXRoIG5vIE1TQikuCisgKiBSZWFkIE1QRUctMSBkYy1zdHlsZSBWTEMgKHNpZ24gYml0ICsgbWFudGlzc2Egd2l0aCBubyBNU0IpLgogICogaWYgTVNCIG5vdCBzZXQgaXQgaXMgbmVnYXRpdmUKICAqIEBwYXJhbSBuIGxlbmd0aCBpbiBiaXRzCiAgKi8KQEAgLTI0Miw2ICsyMzcsMjAgQEAKICAgICByZXR1cm4gKE5FR19VU1IzMihzaWduIF4gY2FjaGUsIG4pIF4gc2lnbikgLSBzaWduOwogfQogCitzdGF0aWMgaW5saW5lIGludCBnZXRfeGJpdHNfbGUoR2V0Qml0Q29udGV4dCAqcywgaW50IG4pCit7CisgICAgcmVnaXN0ZXIgaW50IHNpZ247CisgICAgcmVnaXN0ZXIgaW50MzJfdCBjYWNoZTsKKyAgICBPUEVOX1JFQURFUihyZSwgcyk7CisgICAgYXZfYXNzZXJ0MihuPjAgJiYgbjw9MjUpOworICAgIFVQREFURV9DQUNIRV9MRShyZSwgcyk7CisgICAgY2FjaGUgPSBHRVRfQ0FDSEUocmUsIHMpOworICAgIHNpZ24gID0gc2lnbl9leHRlbmQofmNhY2hlLCBuKSA+PiAzMTsKKyAgICBMQVNUX1NLSVBfQklUUyhyZSwgcywgbik7CisgICAgQ0xPU0VfUkVBREVSKHJlLCBzKTsKKyAgICByZXR1cm4gKHplcm9fZXh0ZW5kKHNpZ24gXiBjYWNoZSwgbikgXiBzaWduKSAtIHNpZ247Cit9CisKIHN0YXRpYyBpbmxpbmUgaW50IGdldF9zYml0cyhHZXRCaXRDb250ZXh0ICpzLCBpbnQgbikKIHsKICAgICByZWdpc3RlciBpbnQgdG1wOwpAQCAtMzQ0LDYgKzM1Myw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9iaXRzX2xvbmcoR2V0Qml0Q29udGV4dCAqcywgaW50IG4pCiB7CisgICAgYXZfYXNzZXJ0MihuPj0wICYmIG48PTMyKTsKICAgICBpZiAoIW4pIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIGlmIChuIDw9IE1JTl9DQUNIRV9CSVRTKSB7CkBAIC0zODIsNiArMzkyLDEwIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGdldF9zYml0c19sb25nKEdldEJpdENvbnRleHQgKnMsIGludCBuKQogeworICAgIC8vIHNpZ25fZXh0ZW5kKHgsIDApIGlzIHVuZGVmaW5lZAorICAgIGlmICghbikKKyAgICAgICAgcmV0dXJuIDA7CisKICAgICByZXR1cm4gc2lnbl9leHRlbmQoZ2V0X2JpdHNfbG9uZyhzLCBuKSwgbik7CiB9CiAKQEAgLTM5OCwxMSArNDEyLDEyIEBACiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIGludCBjaGVja19tYXJrZXIoR2V0Qml0Q29udGV4dCAqcywgY29uc3QgY2hhciAqbXNnKQorc3RhdGljIGlubGluZSBpbnQgY2hlY2tfbWFya2VyKHZvaWQgKmxvZ2N0eCwgR2V0Qml0Q29udGV4dCAqcywgY29uc3QgY2hhciAqbXNnKQogewogICAgIGludCBiaXQgPSBnZXRfYml0czEocyk7CiAgICAgaWYgKCFiaXQpCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIk1hcmtlciBiaXQgbWlzc2luZyBhdCAlZCBvZiAlZCAlc1xuIiwgZ2V0X2JpdHNfY291bnQocykgLSAxLCBzLT5zaXplX2luX2JpdHMsIG1zZyk7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19JTkZPLCAiTWFya2VyIGJpdCBtaXNzaW5nIGF0ICVkIG9mICVkICVzXG4iLAorICAgICAgICAgICAgICAgZ2V0X2JpdHNfY291bnQocykgLSAxLCBzLT5zaXplX2luX2JpdHMsIG1zZyk7CiAKICAgICByZXR1cm4gYml0OwogfQpAQCAtNDIxLDcgKzQzNiw3IEBACiAgICAgaW50IGJ1ZmZlcl9zaXplOwogICAgIGludCByZXQgPSAwOwogCi0gICAgaWYgKGJpdF9zaXplID49IElOVF9NQVggLSA3IHx8IGJpdF9zaXplIDwgMCB8fCAhYnVmZmVyKSB7CisgICAgaWYgKGJpdF9zaXplID49IElOVF9NQVggLSBGRk1BWCg3LCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKjgpIHx8IGJpdF9zaXplIDwgMCB8fCAhYnVmZmVyKSB7CiAgICAgICAgIGJpdF9zaXplICAgID0gMDsKICAgICAgICAgYnVmZmVyICAgICAgPSBOVUxMOwogICAgICAgICByZXQgICAgICAgICA9IEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC00NjIsMzMgKzQ3Nyw2IEBACiAgICAgcmV0dXJuIHMtPmJ1ZmZlciArIChzLT5pbmRleCA+PiAzKTsKIH0KIAotI2RlZmluZSBpbml0X3ZsYyh2bGMsIG5iX2JpdHMsIG5iX2NvZGVzLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgIGJpdHMsIGJpdHNfd3JhcCwgYml0c19zaXplLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgY29kZXMsIGNvZGVzX3dyYXAsIGNvZGVzX3NpemUsICAgICAgICAgXAotICAgICAgICAgICAgICAgICBmbGFncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgbmJfYml0cywgbmJfY29kZXMsICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgYml0cywgYml0c193cmFwLCBiaXRzX3NpemUsICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICBjb2RlcywgY29kZXNfd3JhcCwgY29kZXNfc2l6ZSwgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAsIGZsYWdzKQotCi1pbnQgZmZfaW5pdF92bGNfc3BhcnNlKFZMQyAqdmxjLCBpbnQgbmJfYml0cywgaW50IG5iX2NvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpiaXRzLCBpbnQgYml0c193cmFwLCBpbnQgYml0c19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjb2RlcywgaW50IGNvZGVzX3dyYXAsIGludCBjb2Rlc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzeW1ib2xzLCBpbnQgc3ltYm9sc193cmFwLCBpbnQgc3ltYm9sc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwotdm9pZCBmZl9mcmVlX3ZsYyhWTEMgKnZsYyk7Ci0KLSNkZWZpbmUgSU5JVF9WTENfTEUgICAgICAgICAgICAgMgotI2RlZmluZSBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyA0Ci0KLSNkZWZpbmUgSU5JVF9WTENfU1RBVElDKHZsYywgYml0cywgYSwgYiwgYywgZCwgZSwgZiwgZywgc3RhdGljX3NpemUpICAgICAgIFwKLSAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RhdGljIFZMQ19UWVBFIHRhYmxlW3N0YXRpY19zaXplXVsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKHZsYyktPnRhYmxlICAgICAgICAgICA9IHRhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKHZsYyktPnRhYmxlX2FsbG9jYXRlZCA9IHN0YXRpY19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaW5pdF92bGModmxjLCBiaXRzLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7IFwKLSAgICB9IHdoaWxlICgwKQotCiAvKioKICAqIElmIHRoZSB2bGMgY29kZSBpcyBpbnZhbGlkIGFuZCBtYXhfZGVwdGg9MSwgdGhlbiBubyBiaXRzIHdpbGwgYmUgcmVtb3ZlZC4KICAqIElmIHRoZSB2bGMgY29kZSBpcyBpbnZhbGlkIGFuZCBtYXhfZGVwdGg+MSwgdGhlbiB0aGUgbnVtYmVyIG9mIGJpdHMgcmVtb3ZlZApAQCAtNTI2LDcgKzUxNCw3IEBACiAgICAgICAgIFNLSVBfQklUUyhuYW1lLCBnYiwgbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgR0VUX1JMX1ZMQ19JTlRFUk5BTChsZXZlbCwgcnVuLCBuYW1lLCBnYiwgdGFibGUsIGJpdHMsICBcCisjZGVmaW5lIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgbmFtZSwgZ2IsIHRhYmxlLCBiaXRzLCAgXAogICAgICAgICAgICAgICAgICAgIG1heF9kZXB0aCwgbmVlZF91cGRhdGUpICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGludCBuLCBuYl9iaXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTcwLDYgKzU1OCw3IEBACiAgKiBAcGFyYW0gbWF4X2RlcHRoIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgYml0cyBiaXRzIG11c3QgYmUgcmVhZCB0byBjb21wbGV0ZWx5CiAgKiAgICAgICAgICAgICAgICAgIHJlYWQgdGhlIGxvbmdlc3QgdmxjIGNvZGUKICAqICAgICAgICAgICAgICAgICAgPSAobWF4X3ZsY19sZW5ndGggKyBiaXRzIC0gMSkgLyBiaXRzCisgKiBAcmV0dXJucyB0aGUgY29kZSBwYXJzZWQgb3IgLTEgaWYgbm8gdmxjIG1hdGNoZXMKICAqLwogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF92bGMyKEdldEJpdENvbnRleHQgKnMsIFZMQ19UWVBFICgqdGFibGUpWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLCBpbnQgbWF4X2RlcHRoKQpAQCAtNjIzLDg5ICs2MTIsNCBAQAogICAgIHJldHVybiAwOwogfQogCi0vLyNkZWZpbmUgVFJBQ0UKLQotI2lmZGVmIFRSQUNFCi1zdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfYmluKGludCBiaXRzLCBpbnQgbikKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IGktLSkKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiVkIiwgKGJpdHMgPj4gaSkgJiAxKTsKLSAgICBmb3IgKGkgPSBuOyBpIDwgMjQ7IGkrKykKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiAiKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZ2V0X2JpdHNfdHJhY2UoR2V0Qml0Q29udGV4dCAqcywgaW50IG4sIGNvbnN0IGNoYXIgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKLXsKLSAgICBpbnQgciA9IGdldF9iaXRzKHMsIG4pOwotCi0gICAgcHJpbnRfYmluKHIsIG4pOwotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIlNWQgJTJkICUzZCBiaXQgQCU1ZCBpbiAlcyAlczolZFxuIiwKLSAgICAgICAgICAgciwgbiwgciwgZ2V0X2JpdHNfY291bnQocykgLSBuLCBmaWxlLCBmdW5jLCBsaW5lKTsKLQotICAgIHJldHVybiByOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBnZXRfdmxjX3RyYWNlKEdldEJpdENvbnRleHQgKnMsIFZMQ19UWVBFICgqdGFibGUpWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywgaW50IG1heF9kZXB0aCwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCi17Ci0gICAgaW50IHNob3cgID0gc2hvd19iaXRzKHMsIDI0KTsKLSAgICBpbnQgcG9zICAgPSBnZXRfYml0c19jb3VudChzKTsKLSAgICBpbnQgciAgICAgPSBnZXRfdmxjMihzLCB0YWJsZSwgYml0cywgbWF4X2RlcHRoKTsKLSAgICBpbnQgbGVuICAgPSBnZXRfYml0c19jb3VudChzKSAtIHBvczsKLSAgICBpbnQgYml0czIgPSBzaG93ID4+ICgyNCAtIGxlbik7Ci0KLSAgICBwcmludF9iaW4oYml0czIsIGxlbik7Ci0KLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJTVkICUyZCAlM2QgdmxjIEAlNWQgaW4gJXMgJXM6JWRcbiIsCi0gICAgICAgICAgIGJpdHMyLCBsZW4sIHIsIHBvcywgZmlsZSwgZnVuYywgbGluZSk7Ci0KLSAgICByZXR1cm4gcjsKLX0KLQotI2RlZmluZSBHRVRfUkxfVkxDKGxldmVsLCBydW4sIG5hbWUsIGdiLCB0YWJsZSwgYml0cywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICBtYXhfZGVwdGgsIG5lZWRfdXBkYXRlKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgc2hvdyAgPSBTSE9XX1VCSVRTKG5hbWUsIGdiLCAyNCk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCBwb3MgPSBuYW1lICMjIF9pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgR0VUX1JMX1ZMQ19JTlRFUk5BTChsZXZlbCwgcnVuLCBuYW1lLCBnYiwgdGFibGUsIGJpdHMsbWF4X2RlcHRoLCBuZWVkX3VwZGF0ZSk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGxlbiA9IG5hbWUgIyMgX2luZGV4IC0gcG9zICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzaG93ID0gc2hvdyA+PiAoMjQgLSBsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHByaW50X2JpbihzaG93LCBsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiU1ZCAlMmQgJTNkLyUtM2Qgcmx2IEAlNWQgaW4gJXMgJXM6JWRcbiIsXAotICAgICAgICAgICAgICAgc2hvdywgbGVuLCBydW4tMSwgbGV2ZWwsIHBvcywgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKTtcCi0gICAgfSB3aGlsZSAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0KLXN0YXRpYyBpbmxpbmUgaW50IGdldF94Yml0c190cmFjZShHZXRCaXRDb250ZXh0ICpzLCBpbnQgbiwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKLXsKLSAgICBpbnQgc2hvdyA9IHNob3dfYml0cyhzLCBuKTsKLSAgICBpbnQgciAgICA9IGdldF94Yml0cyhzLCBuKTsKLQotICAgIHByaW50X2JpbihzaG93LCBuKTsKLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJTVkICUyZCAlM2QgeGJ0IEAlNWQgaW4gJXMgJXM6JWRcbiIsCi0gICAgICAgICAgIHNob3csIG4sIHIsIGdldF9iaXRzX2NvdW50KHMpIC0gbiwgZmlsZSwgZnVuYywgbGluZSk7Ci0KLSAgICByZXR1cm4gcjsKLX0KLQotI2RlZmluZSBnZXRfYml0cyhzLCBuKSAgZ2V0X2JpdHNfdHJhY2UocyAsIG4sIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKLSNkZWZpbmUgZ2V0X2JpdHMxKHMpICAgIGdldF9iaXRzX3RyYWNlKHMsICAxLCBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCi0jZGVmaW5lIGdldF94Yml0cyhzLCBuKSBnZXRfeGJpdHNfdHJhY2UocywgbiwgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQotCi0jZGVmaW5lIGdldF92bGMocywgdmxjKSAgICAgICAgICAgICBnZXRfdmxjX3RyYWNlKHMsICh2bGMpLT50YWJsZSwgKHZsYyktPmJpdHMsICAgMywgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQotI2RlZmluZSBnZXRfdmxjMihzLCB0YWIsIGJpdHMsIG1heCkgZ2V0X3ZsY190cmFjZShzLCAgICAgICAgICB0YWIsICAgICAgICBiaXRzLCBtYXgsIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKLSNlbHNlIC8vVFJBQ0UKLSNkZWZpbmUgR0VUX1JMX1ZMQyBHRVRfUkxfVkxDX0lOVEVSTkFMCi0jZW5kaWYKLQogI2VuZGlmIC8qIEFWQ09ERUNfR0VUX0JJVFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9naWYuYyBiL2xpYmF2Y29kZWMvZ2lmLmMKaW5kZXggNmFmMWY0YS4uZDljOTlkNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9naWYuYworKysgYi9saWJhdmNvZGVjL2dpZi5jCkBAIC04Myw3ICs4Myw3IEBACiAgICAgR0lGQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IGxlbiA9IDAsIGhlaWdodCA9IGF2Y3R4LT5oZWlnaHQsIHdpZHRoID0gYXZjdHgtPndpZHRoLCB4LCB5OwogICAgIGludCB4X3N0YXJ0ID0gMCwgeV9zdGFydCA9IDAsIHRyYW5zID0gcy0+dHJhbnNwYXJlbnRfaW5kZXg7Ci0gICAgaW50IGhvbm9yX3RyYW5zcGFyZW5jeSA9IChzLT5mbGFncyAmIEdGX1RSQU5TRElGRikgJiYgcy0+bGFzdF9mcmFtZTsKKyAgICBpbnQgaG9ub3JfdHJhbnNwYXJlbmN5ID0gKHMtPmZsYWdzICYgR0ZfVFJBTlNESUZGKSAmJiBzLT5sYXN0X2ZyYW1lICYmICFwYWxldHRlOwogICAgIGNvbnN0IHVpbnQ4X3QgKnB0cjsKIAogICAgIC8qIENyb3AgaW1hZ2UgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZ2lmZGVjLmMgYi9saWJhdmNvZGVjL2dpZmRlYy5jCmluZGV4IDIwYWU5MDMuLjJlZWVkNGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZ2lmZGVjLmMKKysrIGIvbGliYXZjb2RlYy9naWZkZWMuYwpAQCAtNDYyLDkgKzQ2MiwxMyBAQAogICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwogCiAgICAgcy0+ZnJhbWUtPnB0cyAgICAgPSBhdnBrdC0+cHRzOworI2lmIEZGX0FQSV9QS1RfUFRTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgcy0+ZnJhbWUtPnBrdF9wdHMgPSBhdnBrdC0+cHRzOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKICAgICBzLT5mcmFtZS0+cGt0X2R0cyA9IGF2cGt0LT5kdHM7Ci0gICAgYXZfZnJhbWVfc2V0X3BrdF9kdXJhdGlvbihzLT5mcmFtZSwgYXZwa3QtPmR1cmF0aW9uKTsKKyAgICBzLT5mcmFtZS0+cGt0X2R1cmF0aW9uID0gYXZwa3QtPmR1cmF0aW9uOwogCiAgICAgaWYgKGF2cGt0LT5zaXplID49IDYpIHsKICAgICAgICAgcy0+a2V5ZnJhbWUgPSBtZW1jbXAoYXZwa3QtPmRhdGEsIGdpZjg3YV9zaWcsIDYpID09IDAgfHwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZ29sb21iLXRlc3QuYyBiL2xpYmF2Y29kZWMvZ29sb21iLXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmZTkxNy4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2dvbG9tYi10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgotCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKLSNpbmNsdWRlICJnb2xvbWIuaCIKLSNpbmNsdWRlICJwdXRfYml0cy5oIgotCi0jZGVmaW5lIENPVU5UIDgxOTEKLSNkZWZpbmUgU0laRSAoQ09VTlQgKiA0KQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCBpLCByZXQgPSAwOwotICAgIHVpbnQ4X3QgKnRlbXA7Ci0gICAgUHV0Qml0Q29udGV4dCBwYjsKLSAgICBHZXRCaXRDb250ZXh0IGdiOwotCi0gICAgdGVtcCA9IGF2X21hbGxvYyhTSVpFKTsKLSAgICBpZiAoIXRlbXApCi0gICAgICAgIHJldHVybiAyOwotCi0gICAgaW5pdF9wdXRfYml0cygmcGIsIHRlbXAsIFNJWkUpOwotICAgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKQotICAgICAgICBzZXRfdWVfZ29sb21iKCZwYiwgaSk7Ci0gICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKLQotICAgIGluaXRfZ2V0X2JpdHMoJmdiLCB0ZW1wLCA4ICogU0laRSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspIHsKLSAgICAgICAgaW50IGosIHMgPSBzaG93X2JpdHMoJmdiLCAyNSk7Ci0KLSAgICAgICAgaiA9IGdldF91ZV9nb2xvbWIoJmdiKTsKLSAgICAgICAgaWYgKGogIT0gaSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRfdWVfZ29sb21iOiBleHBlY3RlZCAlZCwgZ290ICVkLiBiaXRzOiAlN3hcbiIsCi0gICAgICAgICAgICAgICAgICAgIGksIGosIHMpOwotICAgICAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotI2RlZmluZSBFWFRFTkQoaSkgKChpKSA8PCAzIHwgKGkpICYgNykKLSAgICBpbml0X3B1dF9iaXRzKCZwYiwgdGVtcCwgU0laRSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspCi0gICAgICAgIHNldF91ZV9nb2xvbWIoJnBiLCBFWFRFTkQoaSkpOwotICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7Ci0KLSAgICBpbml0X2dldF9iaXRzKCZnYiwgdGVtcCwgOCAqIFNJWkUpOwotICAgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKSB7Ci0gICAgICAgIGludCBqLCBzID0gc2hvd19iaXRzX2xvbmcoJmdiLCAzMik7Ci0KLSAgICAgICAgaiA9IGdldF91ZV9nb2xvbWJfbG9uZygmZ2IpOwotICAgICAgICBpZiAoaiAhPSBFWFRFTkQoaSkpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0X3VlX2dvbG9tYl9sb25nOiBleHBlY3RlZCAlZCwgZ290ICVkLiAiCi0gICAgICAgICAgICAgICAgICAgICJiaXRzOiAlOHhcbiIsIEVYVEVORChpKSwgaiwgcyk7Ci0gICAgICAgICAgICByZXQgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW5pdF9wdXRfYml0cygmcGIsIHRlbXAsIFNJWkUpOwotICAgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKQotICAgICAgICBzZXRfc2VfZ29sb21iKCZwYiwgaSAtIENPVU5UIC8gMik7Ci0gICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKLQotICAgIGluaXRfZ2V0X2JpdHMoJmdiLCB0ZW1wLCA4ICogU0laRSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspIHsKLSAgICAgICAgaW50IGosIHMgPSBzaG93X2JpdHMoJmdiLCAyNSk7Ci0KLSAgICAgICAgaiA9IGdldF9zZV9nb2xvbWIoJmdiKTsKLSAgICAgICAgaWYgKGogIT0gaSAtIENPVU5UIC8gMikgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRfc2VfZ29sb21iOiBleHBlY3RlZCAlZCwgZ290ICVkLiBiaXRzOiAlN3hcbiIsCi0gICAgICAgICAgICAgICAgICAgIGkgLSBDT1VOVCAvIDIsIGosIHMpOwotICAgICAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGF2X2ZyZWUodGVtcCk7Ci0KLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9nb2xvbWIuaCBiL2xpYmF2Y29kZWMvZ29sb21iLmgKaW5kZXggZDRkZjBiMy4uZWZiMWVmZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9nb2xvbWIuaAorKysgYi9saWJhdmNvZGVjL2dvbG9tYi5oCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICByZXR1cm4gZmZfdWVfZ29sb21iX3ZsY19jb2RlW2J1Zl07CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgc3ZxM19nZXRfdWVfZ29sb21iKEdldEJpdENvbnRleHQgKmdiKQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKEdldEJpdENvbnRleHQgKmdiKQogewogICAgIHVpbnQzMl90IGJ1ZjsKIApAQCAtMjE5LDcgKzIxOSw3IEBACiAgICAgcmV0dXJuICgoYnVmID4+IDEpIF4gc2lnbikgKyAxOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzdnEzX2dldF9zZV9nb2xvbWIoR2V0Qml0Q29udGV4dCAqZ2IpCitzdGF0aWMgaW5saW5lIGludCBnZXRfaW50ZXJsZWF2ZWRfc2VfZ29sb21iKEdldEJpdENvbnRleHQgKmdiKQogewogICAgIHVuc2lnbmVkIGludCBidWY7CiAKQEAgLTI1NCw3ICsyNTQsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBkaXJhY19nZXRfc2VfZ29sb21iKEdldEJpdENvbnRleHQgKmdiKQogewotICAgIHVpbnQzMl90IHJldCA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYik7CisgICAgdWludDMyX3QgcmV0ID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CiAKICAgICBpZiAocmV0KSB7CiAgICAgICAgIGludCBzaWduID0gLWdldF9iaXRzMShnYik7CkBAIC0zMTQsNiArMzE0LDggQEAKIAogICAgIGxvZyA9IGF2X2xvZzIoYnVmKTsKIAorICAgIGF2X2Fzc2VydDIoayA8PSAzMSk7CisKICAgICBpZiAobG9nIC0gayA+PSAzMiAtIE1JTl9DQUNIRV9CSVRTICsgKE1JTl9DQUNIRV9CSVRTID09IDMyKSAmJgogICAgICAgICAzMiAtIGxvZyA8IGxpbWl0KSB7CiAgICAgICAgIGJ1ZiA+Pj0gbG9nIC0gazsKQEAgLTMyNSw4ICszMjcsMTAgQEAKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0ICYmIFNIT1dfVUJJVFMocmUsIGdiLCAxKSA9PSAwOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChnYi0+c2l6ZV9pbl9iaXRzIDw9IHJlX2luZGV4KQorICAgICAgICAgICAgaWYgKGdiLT5zaXplX2luX2JpdHMgPD0gcmVfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBDTE9TRV9SRUFERVIocmUsIGdiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDEpOwogICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCBnYik7CiAgICAgICAgIH0KQEAgLTM0OCwxNiArMzUyLDE3IEBACiAgICAgICAgICAgICAgICAgYnVmID0gMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7Ci0gICAgICAgICAgICByZXR1cm4gYnVmICsgKGkgPDwgayk7CisgICAgICAgICAgICBidWYgKz0gKChTVUlOVClpIDw8IGspOwogICAgICAgICB9IGVsc2UgaWYgKGkgPT0gbGltaXQgLSAxKSB7CiAgICAgICAgICAgICBidWYgPSBTSE9XX1VCSVRTKHJlLCBnYiwgZXNjX2xlbik7CiAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGVzY19sZW4pOwotICAgICAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CiAKLSAgICAgICAgICAgIHJldHVybiBidWYgKyAxOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGJ1ZiArKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZiA9IC0xOworICAgICAgICB9CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworICAgICAgICByZXR1cm4gYnVmOwogICAgIH0KIH0KIApAQCAtNDA5LDggKzQxNCw2IEBACiAgICAgaW50IGxlbiAgPSBnZXRfYml0c19jb3VudChzKSAtIHBvczsKICAgICBpbnQgYml0cyA9IHNob3cgPj4gKDI0IC0gbGVuKTsKIAotICAgIHByaW50X2JpbihiaXRzLCBsZW4pOwotCiAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiU1ZCAlMmQgJTNkIHVlICBAJTVkIGluICVzICVzOiVkXG4iLAogICAgICAgICAgICBiaXRzLCBsZW4sIGksIHBvcywgZmlsZSwgZnVuYywgbGluZSk7CiAKQEAgLTQyNiw4ICs0MjksNiBAQAogICAgIGludCBsZW4gID0gZ2V0X2JpdHNfY291bnQocykgLSBwb3M7CiAgICAgaW50IGJpdHMgPSBzaG93ID4+ICgyNCAtIGxlbik7CiAKLSAgICBwcmludF9iaW4oYml0cywgbGVuKTsKLQogICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIlNWQgJTJkICUzZCBzZSAgQCU1ZCBpbiAlcyAlczolZFxuIiwKICAgICAgICAgICAgYml0cywgbGVuLCBpLCBwb3MsIGZpbGUsIGZ1bmMsIGxpbmUpOwogCkBAIC00NDMsMjcgKzQ0NCwyNiBAQAogICAgIGludCBsZW4gID0gZ2V0X2JpdHNfY291bnQocykgLSBwb3M7CiAgICAgaW50IGJpdHMgPSBzaG93ID4+ICgyNCAtIGxlbik7CiAKLSAgICBwcmludF9iaW4oYml0cywgbGVuKTsKLQogICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICIlNWQgJTJkICUzZCB0ZSAgQCU1ZCBpbiAlcyAlczolZFxuIiwKICAgICAgICAgICAgYml0cywgbGVuLCBpLCBwb3MsIGZpbGUsIGZ1bmMsIGxpbmUpOwogCiAgICAgcmV0dXJuIGk7CiB9CiAKLSNkZWZpbmUgZ2V0X3VlX2dvbG9tYihhKSBnZXRfdWUoYSwgX19GSUxFX18sIF9fUFJFVFRZX0ZVTkNUSU9OX18sIF9fTElORV9fKQotI2RlZmluZSBnZXRfc2VfZ29sb21iKGEpIGdldF9zZShhLCBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCi0jZGVmaW5lIGdldF90ZV9nb2xvbWIoYSwgcikgIGdldF90ZShhLCByLCBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCi0jZGVmaW5lIGdldF90ZTBfZ29sb21iKGEsIHIpIGdldF90ZShhLCByLCBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCisjZGVmaW5lIGdldF91ZV9nb2xvbWIoYSkgZ2V0X3VlKGEsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pCisjZGVmaW5lIGdldF9zZV9nb2xvbWIoYSkgZ2V0X3NlKGEsIF9fRklMRV9fLCBfX2Z1bmNfXywgX19MSU5FX18pCisjZGVmaW5lIGdldF90ZV9nb2xvbWIoYSwgcikgIGdldF90ZShhLCByLCBfX0ZJTEVfXywgX19mdW5jX18sIF9fTElORV9fKQorI2RlZmluZSBnZXRfdGUwX2dvbG9tYihhLCByKSBnZXRfdGUoYSwgciwgX19GSUxFX18sIF9fZnVuY19fLCBfX0xJTkVfXykKIAogI2VuZGlmIC8qIFRSQUNFICovCiAKIC8qKgotICogd3JpdGUgdW5zaWduZWQgZXhwIGdvbG9tYiBjb2RlLgorICogd3JpdGUgdW5zaWduZWQgZXhwIGdvbG9tYiBjb2RlLiAyXjE2IC0gMiBhdCBtb3N0CiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdWVfZ29sb21iKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgaSkKIHsKICAgICBhdl9hc3NlcnQyKGkgPj0gMCk7CisgICAgYXZfYXNzZXJ0MihpIDw9IDB4RkZGRSk7CiAKICAgICBpZiAoaSA8IDI1NikKICAgICAgICAgcHV0X2JpdHMocGIsIGZmX3VlX2dvbG9tYl9sZW5baV0sIGkgKyAxKTsKQEAgLTQ3NCw2ICs0NzQsMjEgQEAKIH0KIAogLyoqCisgKiB3cml0ZSB1bnNpZ25lZCBleHAgZ29sb21iIGNvZGUuIDJeMzItMiBhdCBtb3N0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3VlX2dvbG9tYl9sb25nKFB1dEJpdENvbnRleHQgKnBiLCB1aW50MzJfdCBpKQoreworICAgIGF2X2Fzc2VydDIoaSA8PSAoVUlOVDMyX01BWCAtIDEpKTsKKworICAgIGlmIChpIDwgMjU2KQorICAgICAgICBwdXRfYml0cyhwYiwgZmZfdWVfZ29sb21iX2xlbltpXSwgaSArIDEpOworICAgIGVsc2UgeworICAgICAgICBpbnQgZSA9IGF2X2xvZzIoaSArIDEpOworICAgICAgICBwdXRfYml0czY0KHBiLCAyICogZSArIDEsIGkgKyAxKTsKKyAgICB9Cit9CisKKy8qKgogICogd3JpdGUgdHJ1bmNhdGVkIHVuc2lnbmVkIGV4cCBnb2xvbWIgY29kZS4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIHNldF90ZV9nb2xvbWIoUHV0Qml0Q29udGV4dCAqcGIsIGludCBpLCBpbnQgcmFuZ2UpCkBAIC00OTIsMTkgKzUwNyw5IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc2VfZ29sb21iKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgaSkKIHsKLSNpZiAwCi0gICAgaWYgKGkgPD0gMCkKLSAgICAgICAgaSA9IC0yICogaTsKLSAgICBlbHNlCi0gICAgICAgIGkgPSAyICogaSAtIDE7Ci0jZWxpZiAxCiAgICAgaSA9IDIgKiBpIC0gMTsKICAgICBpZiAoaSA8IDApCiAgICAgICAgIGkgXj0gLTE7ICAgIC8vRklYTUUgY2hlY2sgaWYgZ2NjIGRvZXMgdGhlIHJpZ2h0IHRoaW5nCi0jZWxzZQotICAgIGkgID0gMiAqIGkgLSAxOwotICAgIGkgXj0gKGkgPj4gMzEpOwotI2VuZGlmCiAgICAgc2V0X3VlX2dvbG9tYihwYiwgaSk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvZ3NtZGVjX2RhdGEuYyBiL2xpYmF2Y29kZWMvZ3NtZGVjX2RhdGEuYwppbmRleCBkOTBjNjliLi42MDE1Zjc4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2dzbWRlY19kYXRhLmMKKysrIGIvbGliYXZjb2RlYy9nc21kZWNfZGF0YS5jCkBAIC0yNiw2ICsyNiwxMyBAQAogICAgIDMyNzcsIDExNDY5LCAyMTI5OSwgMzI3NjcKIH07CiAKK2NvbnN0IHVpbnQ4X3QgZmZfZ3NtX3JlcXVhbnRfdGFiWzRdWzhdID0geworICAgIHsgMCB9LAorICAgIHsgMCwgNyB9LAorICAgIHsgMCwgMiwgNSwgNyB9LAorICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNyB9Cit9OworCiBjb25zdCBpbnQxNl90IGZmX2dzbV9kZXF1YW50X3RhYls2NF1bOF0gPSB7CiAgICAgeyAgIC0yOCwgICAgLTIwLCAgICAtMTIsICAgICAtNCwgICAgICA0LCAgICAgMTIsICAgICAyMCwgICAgIDI4fSwKICAgICB7ICAgLTU2LCAgICAtNDAsICAgIC0yNCwgICAgIC04LCAgICAgIDgsICAgICAyNCwgICAgIDQwLCAgICAgNTZ9LApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9nc21kZWNfZGF0YS5oIGIvbGliYXZjb2RlYy9nc21kZWNfZGF0YS5oCmluZGV4IGI1NzE5NGIuLmYzNDk5ZTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvZ3NtZGVjX2RhdGEuaAorKysgYi9saWJhdmNvZGVjL2dzbWRlY19kYXRhLmgKQEAgLTM4LDYgKzM4LDcgQEAKIH0gR1NNQ29udGV4dDsKIAogZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2dzbV9sb25nX3Rlcm1fZ2Fpbl90YWJbNF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9nc21fcmVxdWFudF90YWJbNF1bOF07CiBleHRlcm4gY29uc3QgaW50MTZfdCBmZl9nc21fZGVxdWFudF90YWJbNjRdWzhdOwogCiBleHRlcm4gY29uc3QgaW50KiBjb25zdCBmZl9nc21fYXBjbV9iaXRzW11bNF07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2dzbWRlY190ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9nc21kZWNfdGVtcGxhdGUuYwppbmRleCA0Y2I3NzdjLi40ZTQwYTIwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2dzbWRlY190ZW1wbGF0ZS5jCisrKyBiL2xpYmF2Y29kZWMvZ3NtZGVjX3RlbXBsYXRlLmMKQEAgLTI4LDEzICsyOCw2IEBACiAjaW5jbHVkZSAiZ3NtLmgiCiAjaW5jbHVkZSAiZ3NtZGVjX2RhdGEuaCIKIAotc3RhdGljIGNvbnN0IGludCByZXF1YW50X3RhYls0XVs4XSA9IHsKLSAgICB7IDAgfSwKLSAgICB7IDAsIDcgfSwKLSAgICB7IDAsIDIsIDUsIDcgfSwKLSAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcgfQotfTsKLQogc3RhdGljIHZvaWQgYXBjbV9kZXF1YW50X2FkZChHZXRCaXRDb250ZXh0ICpnYiwgaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKmZyYW1lX2JpdHMpCiB7CiAgICAgaW50IGksIHZhbDsKQEAgLTQyLDEzICszNSwxMyBAQAogICAgIGNvbnN0IGludDE2X3QgKnRhYiA9IGZmX2dzbV9kZXF1YW50X3RhYlttYXhpZHhdOwogICAgIGZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKSB7CiAgICAgICAgIHZhbCA9IGdldF9iaXRzKGdiLCBmcmFtZV9iaXRzW2ldKTsKLSAgICAgICAgZHN0WzMqaV0gKz0gdGFiW3JlcXVhbnRfdGFiW2ZyYW1lX2JpdHNbaV1dW3ZhbF1dOworICAgICAgICBkc3RbMyAqIGldICs9IHRhYltmZl9nc21fcmVxdWFudF90YWJbZnJhbWVfYml0c1tpXV1bdmFsXV07CiAgICAgfQogfQogCiBzdGF0aWMgaW5saW5lIGludCBnc21fbXVsdChpbnQgYSwgaW50IGIpCiB7Ci0gICAgcmV0dXJuIChhICogYiArICgxIDw8IDE0KSkgPj4gMTU7CisgICAgcmV0dXJuIChpbnQpKGEgKiAoU1VJTlQpYiArICgxIDw8IDE0KSkgPj4gMTU7CiB9CiAKIHN0YXRpYyB2b2lkIGxvbmdfdGVybV9zeW50aChpbnQxNl90ICpkc3QsIGludCBsYWcsIGludCBnYWluX2lkeCkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2MS5jIGIvbGliYXZjb2RlYy9oMjYxLmMKaW5kZXggZjMzZDFhMS4uNDdiYWQ0ZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjYxLmMKKysrIGIvbGliYXZjb2RlYy9oMjYxLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogSDI2MSBjb21tb24gY29kZQorICogSC4yNjEgY29tbW9uIGNvZGUKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWFhcnRlbiBEYW5pZWxzCiAgKgpAQCAtMjIsNyArMjIsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBoMjYxY29kZWMuCisgKiBILjI2MSBjb2RlYwogICovCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjEuaCBiL2xpYmF2Y29kZWMvaDI2MS5oCmluZGV4IDU1ODY0NjIuLjM5OWE0MDQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2MS5oCisrKyBiL2xpYmF2Y29kZWMvaDI2MS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEgyNjEgZGVjb2RlcgorICogSC4yNjEgY29kZWMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWFhcnRlbiBEYW5pZWxzCiAgKgpAQCAtMjIsNyArMjIsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBoMjYxY29kZWMuCisgKiBILjI2MSBjb2RlYy4KICAqLwogCiAjaWZuZGVmIEFWQ09ERUNfSDI2MV9ICmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjFfcGFyc2VyLmMgYi9saWJhdmNvZGVjL2gyNjFfcGFyc2VyLmMKaW5kZXggOWMzMTU1Ny4uMjI5OWMxYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjYxX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvaDI2MV9wYXJzZXIuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBIMjYxIHBhcnNlcgorICogSC4yNjEgcGFyc2VyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICogQ29weXJpZ2h0IChjKSAyMDA0IE1hYXJ0ZW4gRGFuaWVscwogICoKQEAgLTIyLDcgKzIyLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogaDI2MWNvZGVjLgorICogSC4yNjEgcGFyc2VyCiAgKi8KIAogI2luY2x1ZGUgInBhcnNlci5oIgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjYxZGVjLmMgYi9saWJhdmNvZGVjL2gyNjFkZWMuYwppbmRleCBkZjYwYWM1Li4xNGE4NzRjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjFkZWMuYworKysgYi9saWJhdmNvZGVjL2gyNjFkZWMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBIMjYxIGRlY29kZXIKKyAqIEguMjYxIGRlY29kZXIKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgTWFhcnRlbiBEYW5pZWxzCiAgKgpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVtiX3h5XVsxXSA9IHMtPm12WzBdWzBdWzFdOwogICAgICAgICB9CiAKLSAgICAgICAgZmZfbXB2X2RlY29kZV9tYihzLCBzLT5ibG9jayk7CisgICAgICAgIGZmX21wdl9yZWNvbnN0cnVjdF9tYihzLCBzLT5ibG9jayk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC00NjYsNyArNDY2LDcgQEAKICAgICAgICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbaV0gPSAtMTsKICAgICB9CiAKLSAgICBmZl9tcHZfZGVjb2RlX21iKHMsIHMtPmJsb2NrKTsKKyAgICBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIocywgcy0+YmxvY2spOwogCiAgICAgcmV0dXJuIFNMSUNFX09LOwogfQpAQCAtNjAxLDcgKzYwMSw3IEBACiAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKIAogICAgIGlmICghcy0+Y29udGV4dF9pbml0aWFsaXplZCkKLSAgICAgICAgLy8gd2UgbmVlZCB0aGUgSURDVCBwZXJtdXRhdG9uIGZvciByZWFkaW5nIGEgY3VzdG9tIG1hdHJpeAorICAgICAgICAvLyB3ZSBuZWVkIHRoZSBJRENUIHBlcm11dGF0aW9uIGZvciByZWFkaW5nIGEgY3VzdG9tIG1hdHJpeAogICAgICAgICBmZl9tcHZfaWRjdF9pbml0KHMpOwogCiAgICAgcmV0ID0gaDI2MV9kZWNvZGVfcGljdHVyZV9oZWFkZXIoaCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjFlbmMuYyBiL2xpYmF2Y29kZWMvaDI2MWVuYy5jCmluZGV4IDI0ZWY1NzcuLjMxNTc2MmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2MWVuYy5jCisrKyBiL2xpYmF2Y29kZWMvaDI2MWVuYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEgyNjEgZW5jb2RlcgorICogSC4yNjEgZW5jb2RlcgogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqIENvcHlyaWdodCAoYykgMjAwNCBNYWFydGVuIERhbmllbHMKICAqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjMuYyBiL2xpYmF2Y29kZWMvaDI2My5jCmluZGV4IDgwMDM4N2QuLmJjNWMwZDUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2My5jCisrKyBiL2xpYmF2Y29kZWMvaDI2My5jCkBAIC0xLDcgKzEsNyBAQAogLyoKLSAqIEgyNjMvTVBFRzQgYmFja2VuZCBmb3IgZW5jb2RlciBhbmQgZGVjb2RlcgorICogSC4yNjMvTVBFRy00IGJhY2tlbmQgZm9yIGVuY29kZXIgYW5kIGRlY29kZXIKICAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAotICogSDI2Mysgc3VwcG9ydC4KKyAqIEguMjYzKyBzdXBwb3J0LgogICogQ29weXJpZ2h0IChjKSAyMDAxIEp1YW4gSi4gU2llcnJhbHRhIFAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKgpAQCAtMjQsNyArMjQsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBoMjYzL21wZWc0IGNvZGVjLgorICogSC4yNjMvTVBFRy00IGNvZGVjLgogICovCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4KQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlICJoMjYzZGF0YS5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKLSNpbmNsdWRlICJ1bmFyeS5oIgogI2luY2x1ZGUgImZsdi5oIgogI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKIApAQCAtMTQyLDggKzE0MSw2IEBACiAgICAgdWludDhfdCAqZGVzdF9jYj0gcy0+ZGVzdFsxXTsKICAgICB1aW50OF90ICpkZXN0X2NyPSBzLT5kZXN0WzJdOwogCi0vLyAgICBpZihzLT5waWN0X3R5cGU9PUFWX1BJQ1RVUkVfVFlQRV9CICYmICFzLT5yZWFkYWJsZSkgcmV0dXJuOwotCiAgICAgLyoKICAgICAgICBEaWFnIFRvcAogICAgICAgIExlZnQgQ2VudGVyCkBAIC0zMjAsNyArMzE3LDcgQEAKICAgICBBID0gbW90X3ZhbFsgLSAxXTsKICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGZpcnN0IChzbGljZSkgbGluZSAqLwogICAgIGlmIChzLT5maXJzdF9zbGljZV9saW5lICYmIGJsb2NrPDMpIHsKLSAgICAgICAgLy8gd2UgY2FuJ3QganVzdCBjaGFuZ2Ugc29tZSBNVnMgdG8gc2ltdWxhdGUgdGhhdCBhcyB3ZSBuZWVkIHRoZW0gZm9yIHRoZSBCIGZyYW1lcyAoYW5kIE1FKQorICAgICAgICAvLyB3ZSBjYW4ndCBqdXN0IGNoYW5nZSBzb21lIE1WcyB0byBzaW11bGF0ZSB0aGF0IGFzIHdlIG5lZWQgdGhlbSBmb3IgdGhlIEItZnJhbWVzIChhbmQgTUUpCiAgICAgICAgIC8vIGFuZCBpZiB3ZSBldmVyIHN1cHBvcnQgbm9uIHJlY3Rhbmd1bGFyIG9iamVjdHMgdGhhbiB3ZSBuZWVkIHRvIGRvIGEgZmV3IGlmcyBoZXJlIGFueXdheSA6KAogICAgICAgICBpZihibG9jaz09MCl7IC8vbW9zdCBjb21tb24gY2FzZQogICAgICAgICAgICAgaWYocy0+bWJfeCAgPT0gcy0+cmVzeW5jX21iX3gpeyAvL3JhcmUKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2My5oIGIvbGliYXZjb2RlYy9oMjYzLmgKaW5kZXggM2MzZjE2OS4uZjg5MWY3MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjYzLmgKKysrIGIvbGliYXZjb2RlYy9oMjYzLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogSDI2MyBpbnRlcm5hbCBoZWFkZXIKKyAqIEguMjYzIGludGVybmFsIGhlYWRlcgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0yNyw5ICsyNyw3IEBACiAjaW5jbHVkZSAiaDI2M2RhdGEuaCIKICNpbmNsdWRlICJybC5oIgogCi0jaWYgIUZGX0FQSV9BU1BFQ1RfRVhURU5ERUQKICNkZWZpbmUgRkZfQVNQRUNUX0VYVEVOREVEIDE1Ci0jZW5kaWYKICNkZWZpbmUgSU5UX0JJVCAoQ0hBUl9CSVQgKiBzaXplb2YoaW50KSkKIAogLy8gVGhlIGRlZmluZXMgYmVsb3cgZGVmaW5lIHRoZSBudW1iZXIgb2YgYml0cyB0aGF0IGFyZSByZWFkIGF0IG9uY2UgZm9yCkBAIC04Nyw3ICs4NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBibG9ja1s2XVs2NF0pOwogCiAvKioKLSAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIDNiaXQgInNvdXJjZSBmb3JtYXQiIHN5bnRheCBlbGVtZW50LgorICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgMy1iaXQgInNvdXJjZSBmb3JtYXQiIHN5bnRheCBlbGVtZW50LgogICogVGhpcyByZXByZXNlbnRzIHNvbWUgc3RhbmRhcmQgcGljdHVyZSBkaW1lbnNpb25zIG9yIGluZGljYXRlcyB0aGF0CiAgKiB3aWR0aCZoZWlnaHQgYXJlIGV4cGxpY2l0bHkgc3RvcmVkIGxhdGVyLgogICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjNkYXRhLmMgYi9saWJhdmNvZGVjL2gyNjNkYXRhLmMKaW5kZXggY2VkYTgwZi4uZjY0OWQ1OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjYzZGF0YS5jCisrKyBiL2xpYmF2Y29kZWMvaDI2M2RhdGEuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBIMjYzKyB0YWJsZXMKKyAqIEguMjYzKyB0YWJsZXMKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjYzZGF0YS5oIGIvbGliYXZjb2RlYy9oMjYzZGF0YS5oCmluZGV4IDBhZDJlZjQuLjNkYTBlMzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2M2RhdGEuaAorKysgYi9saWJhdmNvZGVjL2gyNjNkYXRhLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogY29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCi0gKiBIMjYzKyBzdXBwb3J0CisgKiBILjI2Mysgc3VwcG9ydAogICogY29weXJpZ2h0IChjKSAyMDAxIEp1YW4gSi4gU2llcnJhbHRhIFAKICAqIGNvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjYzZGVjLmMgYi9saWJhdmNvZGVjL2gyNjNkZWMuYwppbmRleCA2Mjg1NDZiLi5hMjMyNmFjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjNkZWMuYworKysgYi9saWJhdmNvZGVjL2gyNjNkZWMuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgImZsdi5oIgogI2luY2x1ZGUgImgyNjMuaCIKICNpbmNsdWRlICJoMjYzX3BhcnNlci5oIgorI2luY2x1ZGUgImh3YWNjZWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1wZWdfZXIuaCIKICNpbmNsdWRlICJtcGVnNHZpZGVvLmgiCkBAIC00MSwxMiArNDIsMTggQEAKICNpbmNsdWRlICJtcGVndmlkZW8uaCIKICNpbmNsdWRlICJtc21wZWc0LmgiCiAjaW5jbHVkZSAicXBlbGRzcC5oIgotI2luY2x1ZGUgInZkcGF1X2NvbXBhdC5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgIndtdjIuaCIKIAogc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBoMjYzX2dldF9mb3JtYXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogeworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICAvKiBNUEVHLTQgU3R1ZGlvIFByb2ZpbGUgb25seSwgbm90IHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLworICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDgpIHsKKyAgICAgICAgYXZfYXNzZXJ0MShzLT5zdHVkaW9fcHJvZmlsZSk7CisgICAgICAgIHJldHVybiBhdmN0eC0+cGl4X2ZtdDsKKyAgICB9CisKICAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9NU1MyKQogICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVY0MjBQOwogCkBAIC0xMjksNyArMTM2LDcgQEAKICAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9PSA1NiAmJiBhdmN0eC0+ZXh0cmFkYXRhWzBdID09IDEpCiAgICAgICAgICAgICBzLT5laGNfbW9kZSA9IDE7CiAKLSAgICAvKiBmb3IgaDI2Mywgd2UgYWxsb2NhdGUgdGhlIGltYWdlcyBhZnRlciBoYXZpbmcgcmVhZCB0aGUgaGVhZGVyICovCisgICAgLyogZm9yIEguMjYzLCB3ZSBhbGxvY2F0ZSB0aGUgaW1hZ2VzIGFmdGVyIGhhdmluZyByZWFkIHRoZSBoZWFkZXIgKi8KICAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCAhPSBBVl9DT0RFQ19JRF9IMjYzICYmCiAgICAgICAgIGF2Y3R4LT5jb2RlYy0+aWQgIT0gQVZfQ09ERUNfSURfSDI2M1AgJiYKICAgICAgICAgYXZjdHgtPmNvZGVjLT5pZCAhPSBBVl9DT0RFQ19JRF9NUEVHNCkgewpAQCAtMTk3LDYgKzIwNCwxMSBAQAogCiAgICAgZmZfc2V0X3FzY2FsZShzLCBzLT5xc2NhbGUpOwogCisgICAgaWYgKHMtPnN0dWRpb19wcm9maWxlKSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfbXBlZzRfZGVjb2RlX3N0dWRpb19zbGljZV9oZWFkZXIocy0+YXZjdHgtPnByaXZfZGF0YSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCiAgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsKSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnN0YXJ0ID0gcy0+Z2IuYnVmZmVyICsgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAvIDg7CiAgICAgICAgIHJldCA9IHMtPmF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2Uocy0+YXZjdHgsIHN0YXJ0LCBzLT5nYi5idWZmZXJfZW5kIC0gc3RhcnQpOwpAQCAtMjYxLDcgKzI3Myw3IEBACiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCB4eSA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOwogICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gU0xJQ0VfRU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZmX21wdl9kZWNvZGVfbWIocywgcy0+YmxvY2spOworICAgICAgICAgICAgICAgICAgICBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIocywgcy0+YmxvY2spOwogICAgICAgICAgICAgICAgICAgICBpZiAocy0+bG9vcF9maWx0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX2xvb3BfZmlsdGVyKHMpOwogCkBAIC0yOTQsNyArMzA2LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZmZfbXB2X2RlY29kZV9tYihzLCBzLT5ibG9jayk7CisgICAgICAgICAgICBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIocywgcy0+YmxvY2spOwogICAgICAgICAgICAgaWYgKHMtPmxvb3BfZmlsdGVyKQogICAgICAgICAgICAgICAgIGZmX2gyNjNfbG9vcF9maWx0ZXIocyk7CiAgICAgICAgIH0KQEAgLTQ3NSw3ICs0ODcsNyBAQAogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgaWYgKCFzLT5jb250ZXh0X2luaXRpYWxpemVkKQotICAgICAgICAvLyB3ZSBuZWVkIHRoZSBpZGN0IHBlcm11dGF0b24gZm9yIHJlYWRpbmcgYSBjdXN0b20gbWF0cml4CisgICAgICAgIC8vIHdlIG5lZWQgdGhlIGlkY3QgcGVybXV0YXRpb24gZm9yIHJlYWRpbmcgYSBjdXN0b20gbWF0cml4CiAgICAgICAgIGZmX21wdl9pZGN0X2luaXQocyk7CiAKICAgICAvKiBsZXQncyBnbyA6LSkgKi8KQEAgLTUzNCwxMSArNTQ2LDEzIEBACiAgICAgaWYgKENPTkZJR19NUEVHNF9ERUNPREVSICYmIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgewogICAgICAgICBpZiAoZmZfbXBlZzRfd29ya2Fyb3VuZF9idWdzKGF2Y3R4KSA9PSAxKQogICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgaWYgKHMtPnN0dWRpb19wcm9maWxlICE9IChzLT5pZHNwLmlkY3QgPT0gTlVMTCkpCisgICAgICAgICAgICBmZl9tcHZfaWRjdF9pbml0KHMpOwogICAgIH0KIAotICAgIC8qIEFmdGVyIEgyNjMgJiBtcGVnNCBoZWFkZXIgZGVjb2RlIHdlIGhhdmUgdGhlIGhlaWdodCwgd2lkdGgsCisgICAgLyogQWZ0ZXIgSC4yNjMgJiBNUEVHLTQgaGVhZGVyIGRlY29kZSB3ZSBoYXZlIHRoZSBoZWlnaHQsIHdpZHRoLAogICAgICAqIGFuZCBvdGhlciBwYXJhbWV0ZXJzLiBTbyB0aGVuIHdlIGNvdWxkIGluaXQgdGhlIHBpY3R1cmUuCi0gICAgICogRklYTUU6IEJ5IHRoZSB3YXkgSDI2MyBkZWNvZGVyIGlzIGV2b2x2aW5nIGl0IHNob3VsZCBoYXZlCisgICAgICogRklYTUU6IEJ5IHRoZSB3YXkgSC4yNjMgZGVjb2RlciBpcyBldm9sdmluZyBpdCBzaG91bGQgaGF2ZQogICAgICAqIGFuIEgyNjNFbmNDb250ZXh0ICovCiAgICAgaWYgKHMtPndpZHRoICAhPSBhdmN0eC0+Y29kZWRfd2lkdGggIHx8CiAgICAgICAgIHMtPmhlaWdodCAhPSBhdmN0eC0+Y29kZWRfaGVpZ2h0IHx8CkBAIC02MDAsMTYgKzYxNCw5IEBACiAgICAgaWYgKChyZXQgPSBmZl9tcHZfZnJhbWVfc3RhcnQocywgYXZjdHgpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICBpZiAoIXMtPmRpdnhfcGFja2VkICYmICFhdmN0eC0+aHdhY2NlbCkKKyAgICBpZiAoIXMtPmRpdnhfcGFja2VkKQogICAgICAgICBmZl90aHJlYWRfZmluaXNoX3NldHVwKGF2Y3R4KTsKIAotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICBpZiAoQ09ORklHX01QRUc0X1ZEUEFVX0RFQ09ERVIgJiYgKHMtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpKSB7Ci0gICAgICAgIGZmX3ZkcGF1X21wZWc0X2RlY29kZV9waWN0dXJlKGF2Y3R4LT5wcml2X2RhdGEsIHMtPmdiLmJ1ZmZlciwgcy0+Z2IuYnVmZmVyX2VuZCAtIHMtPmdiLmJ1ZmZlcik7Ci0gICAgICAgIGdvdG8gZnJhbWVfZW5kOwotICAgIH0KLSNlbmRpZgotCiAgICAgaWYgKGF2Y3R4LT5od2FjY2VsKSB7CiAgICAgICAgIHJldCA9IGF2Y3R4LT5od2FjY2VsLT5zdGFydF9mcmFtZShhdmN0eCwgcy0+Z2IuYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Z2IuYnVmZmVyX2VuZCAtIHMtPmdiLmJ1ZmZlcik7CkBAIC02MzcsNyArNjQ0LDcgQEAKICAgICBzbGljZV9yZXQgPSBkZWNvZGVfc2xpY2Uocyk7CiAgICAgd2hpbGUgKHMtPm1iX3kgPCBzLT5tYl9oZWlnaHQpIHsKICAgICAgICAgaWYgKHMtPm1zbXBlZzRfdmVyc2lvbikgewotICAgICAgICAgICAgaWYgKHMtPnNsaWNlX2hlaWdodCA9PSAwIHx8IHMtPm1iX3ggIT0gMCB8fAorICAgICAgICAgICAgaWYgKHMtPnNsaWNlX2hlaWdodCA9PSAwIHx8IHMtPm1iX3ggIT0gMCB8fCBzbGljZV9yZXQgPCAwIHx8CiAgICAgICAgICAgICAgICAgKHMtPm1iX3kgJSBzLT5zbGljZV9oZWlnaHQpICE9IDAgfHwgZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIHsKQEAgLTY2Myw3ICs2NzAsOCBAQAogCiAgICAgYXZfYXNzZXJ0MShzLT5iaXRzdHJlYW1fYnVmZmVyX3NpemUgPT0gMCk7CiBmcmFtZV9lbmQ6Ci0gICAgZmZfZXJfZnJhbWVfZW5kKCZzLT5lcik7CisgICAgaWYgKCFzLT5zdHVkaW9fcHJvZmlsZSkKKyAgICAgICAgZmZfZXJfZnJhbWVfZW5kKCZzLT5lcik7CiAKICAgICBpZiAoYXZjdHgtPmh3YWNjZWwpIHsKICAgICAgICAgcmV0ID0gYXZjdHgtPmh3YWNjZWwtPmVuZF9mcmFtZShhdmN0eCk7CkBAIC03MTMsNyArNzIxLDcgQEAKICAgICB9CiAKICAgICBpZiAoc2xpY2VfcmV0IDwgMCAmJiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQotICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXR1cm4gc2xpY2VfcmV0OwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuIGdldF9jb25zdW1lZF9ieXRlcyhzLCBidWZfc2l6ZSk7CiB9CkBAIC03MjIsNiArNzMwLDkgQEAKICNpZiBDT05GSUdfSDI2M19WQUFQSV9IV0FDQ0VMIHx8IENPTkZJR19NUEVHNF9WQUFQSV9IV0FDQ0VMCiAgICAgQVZfUElYX0ZNVF9WQUFQSSwKICNlbmRpZgorI2lmIENPTkZJR19NUEVHNF9OVkRFQ19IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9DVURBLAorI2VuZGlmCiAjaWYgQ09ORklHX01QRUc0X1ZEUEFVX0hXQUNDRUwKICAgICBBVl9QSVhfRk1UX1ZEUEFVLAogI2VuZGlmCkBAIC03NDMsNiArNzU0LDcgQEAKICAgICAuZGVjb2RlICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFJBV19IT1JJWl9CQU5EIHwgQVZfQ09ERUNfQ0FQX0RSMSB8CiAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX1RSVU5DQVRFRCB8IEFWX0NPREVDX0NBUF9ERUxBWSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfU0tJUF9GUkFNRV9GSUxMX1BBUkFNLAogICAgIC5mbHVzaCAgICAgICAgICA9IGZmX21wZWdfZmx1c2gsCiAgICAgLm1heF9sb3dyZXMgICAgID0gMywKICAgICAucGl4X2ZtdHMgICAgICAgPSBmZl9oMjYzX2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwLApAQCAtNzU5LDcgKzc3MSwyMCBAQAogICAgIC5kZWNvZGUgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBBVl9DT0RFQ19DQVBfRFIxIHwKICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfVFJVTkNBVEVEIHwgQVZfQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9TS0lQX0ZSQU1FX0ZJTExfUEFSQU0sCiAgICAgLmZsdXNoICAgICAgICAgID0gZmZfbXBlZ19mbHVzaCwKICAgICAubWF4X2xvd3JlcyAgICAgPSAzLAogICAgIC5waXhfZm10cyAgICAgICA9IGZmX2gyNjNfaHdhY2NlbF9waXhmbXRfbGlzdF80MjAsCisgICAgLmh3X2NvbmZpZ3MgICAgID0gKGNvbnN0IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsKltdKSB7CisjaWYgQ09ORklHX0gyNjNfVkFBUElfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9WQUFQSShoMjYzKSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHNF9WRFBBVV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZEUEFVKG1wZWc0KSwKKyNlbmRpZgorI2lmIENPTkZJR19IMjYzX1ZJREVPVE9PTEJPWF9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZJREVPVE9PTEJPWChoMjYzKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICB9LAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NC5jIGIvbGliYXZjb2RlYy9oMjY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOGQ0NGUuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9oMjY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDE1ICswLDAgQEAKLS8qCi0gKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBkZWNvZGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgY29kZWMuCi0gKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Ci0gKi8KLQotI2RlZmluZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiAxCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvc3RlcmVvM2QuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgImNhYmFjLmgiCi0jaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiZXJyb3JfcmVzaWxpZW5jZS5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJoMjY0LmgiCi0jaW5jbHVkZSAiaDI2NGRhdGEuaCIKLSNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCi0jaW5jbHVkZSAiaDI2NF9tdnByZWQuaCIKLSNpbmNsdWRlICJnb2xvbWIuaCIKLSNpbmNsdWRlICJtYXRob3BzLmgiCi0jaW5jbHVkZSAibWVfY21wLmgiCi0jaW5jbHVkZSAibXBlZ3V0aWxzLmgiCi0jaW5jbHVkZSAicHJvZmlsZXMuaCIKLSNpbmNsdWRlICJyZWN0YW5nbGUuaCIKLSNpbmNsdWRlICJzdnEzLmgiCi0jaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAidmRwYXVfY29tcGF0LmgiCi0KLXN0YXRpYyBpbnQgaDI2NF9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Ci0KLWNvbnN0IHVpbnQxNl90IGZmX2gyNjRfbWJfc2l6ZXNbNF0gPSB7IDI1NiwgMzg0LCA1MTIsIDc2OCB9OwotCi1pbnQgYXZwcml2X2gyNjRfaGFzX251bV9yZW9yZGVyX2ZyYW1lcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIHJldHVybiBoID8gaC0+c3BzLm51bV9yZW9yZGVyX2ZyYW1lcyA6IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGgyNjRfZXJfZGVjb2RlX21iKHZvaWQgKm9wYXF1ZSwgaW50IHJlZiwgaW50IG12X2RpciwgaW50IG12X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCptdilbMl1bNF1bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeCwgaW50IG1iX3ksIGludCBtYl9pbnRyYSwgaW50IG1iX3NraXBwZWQpCi17Ci0gICAgSDI2NENvbnRleHQgKmggPSBvcGFxdWU7Ci0gICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOwotCi0gICAgc2wtPm1iX3ggPSBtYl94OwotICAgIHNsLT5tYl95ID0gbWJfeTsKLSAgICBzbC0+bWJfeHkgPSBtYl94ICsgbWJfeSAqIGgtPm1iX3N0cmlkZTsKLSAgICBtZW1zZXQoc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlLCAwLCBzaXplb2Yoc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlKSk7Ci0gICAgYXZfYXNzZXJ0MShyZWYgPj0gMCk7Ci0gICAgLyogRklYTUU6IEl0IGlzIHBvc3NpYmxlIGFsYmVpdCB1bmNvbW1vbiB0aGF0IHNsaWNlIHJlZmVyZW5jZXMKLSAgICAgKiBkaWZmZXIgYmV0d2VlbiBzbGljZXMuIFdlIHRha2UgdGhlIGVhc3kgYXBwcm9hY2ggYW5kIGlnbm9yZQotICAgICAqIGl0IGZvciBub3cuIElmIHRoaXMgdHVybnMgb3V0IHRvIGhhdmUgYW55IHJlbGV2YW5jZSBpbgotICAgICAqIHByYWN0aWNlIHRoZW4gY29ycmVjdCByZW1hcHBpbmcgc2hvdWxkIGJlIGFkZGVkLiAqLwotICAgIGlmIChyZWYgPj0gc2wtPnJlZl9jb3VudFswXSkKLSAgICAgICAgcmVmID0gMDsKLSAgICBpZiAoIXNsLT5yZWZfbGlzdFswXVtyZWZdLmRhdGFbMF0pIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJSZWZlcmVuY2Ugbm90IGF2YWlsYWJsZSBmb3IgZXJyb3IgY29uY2VhbGluZ1xuIik7Ci0gICAgICAgIHJlZiA9IDA7Ci0gICAgfQotICAgIGlmICgoc2wtPnJlZl9saXN0WzBdW3JlZl0ucmVmZXJlbmNlJjMpICE9IDMpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJSZWZlcmVuY2UgaW52YWxpZFxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZmlsbF9yZWN0YW5nbGUoJmgtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiBzbC0+bWJfeHldLAotICAgICAgICAgICAgICAgICAgIDIsIDIsIDIsIHJlZiwgMSk7Ci0gICAgZmlsbF9yZWN0YW5nbGUoJnNsLT5yZWZfY2FjaGVbMF1bc2NhbjhbMF1dLCA0LCA0LCA4LCByZWYsIDEpOwotICAgIGZpbGxfcmVjdGFuZ2xlKHNsLT5tdl9jYWNoZVswXVtzY2FuOFswXV0sIDQsIDQsIDgsCi0gICAgICAgICAgICAgICAgICAgcGFjazE2dG8zMigoKm12KVswXVswXVswXSwgKCptdilbMF1bMF1bMV0pLCA0KTsKLSAgICBzbC0+bWJfbWJhZmYgPQotICAgIHNsLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnID0gMDsKLSAgICBmZl9oMjY0X2hsX2RlY29kZV9tYihoLCAmaC0+c2xpY2VfY3R4WzBdKTsKLX0KLQotdm9pZCBmZl9oMjY0X2RyYXdfaG9yaXpfYmFuZChjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCBpbnQgaGVpZ2h0KQotewotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IGgtPmF2Y3R4OwotICAgIGNvbnN0IEFWRnJhbWUgICAqc3JjICA9IGgtPmN1cl9waWMuZjsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKLSAgICBpbnQgdnNoaWZ0ID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKLSAgICBjb25zdCBpbnQgZmllbGRfcGljID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKLSAgICBpZiAoZmllbGRfcGljKSB7Ci0gICAgICAgIGhlaWdodCA8PD0gMTsKLSAgICAgICAgeSAgICAgIDw8PSAxOwotICAgIH0KLQotICAgIGhlaWdodCA9IEZGTUlOKGhlaWdodCwgYXZjdHgtPmhlaWdodCAtIHkpOwotCi0gICAgaWYgKGZpZWxkX3BpYyAmJiBoLT5maXJzdF9maWVsZCAmJiAhKGF2Y3R4LT5zbGljZV9mbGFncyAmIFNMSUNFX0ZMQUdfQUxMT1dfRklFTEQpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoYXZjdHgtPmRyYXdfaG9yaXpfYmFuZCkgewotICAgICAgICBpbnQgb2Zmc2V0W0FWX05VTV9EQVRBX1BPSU5URVJTXTsKLSAgICAgICAgaW50IGk7Ci0KLSAgICAgICAgb2Zmc2V0WzBdID0geSAqIHNyYy0+bGluZXNpemVbMF07Ci0gICAgICAgIG9mZnNldFsxXSA9Ci0gICAgICAgIG9mZnNldFsyXSA9ICh5ID4+IHZzaGlmdCkgKiBzcmMtPmxpbmVzaXplWzFdOwotICAgICAgICBmb3IgKGkgPSAzOyBpIDwgQVZfTlVNX0RBVEFfUE9JTlRFUlM7IGkrKykKLSAgICAgICAgICAgIG9mZnNldFtpXSA9IDA7Ci0KLSAgICAgICAgZW1tc19jKCk7Ci0KLSAgICAgICAgYXZjdHgtPmRyYXdfaG9yaXpfYmFuZChhdmN0eCwgc3JjLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUsIGhlaWdodCk7Ci0gICAgfQotfQotCi0vKioKLSAqIENoZWNrIGlmIHRoZSB0b3AgJiBsZWZ0IGJsb2NrcyBhcmUgYXZhaWxhYmxlIGlmIG5lZWRlZCBhbmQKLSAqIGNoYW5nZSB0aGUgZGMgbW9kZSBzbyBpdCBvbmx5IHVzZXMgdGhlIGF2YWlsYWJsZSBibG9ja3MuCi0gKi8KLWludCBmZl9oMjY0X2NoZWNrX2ludHJhNHg0X3ByZWRfbW9kZShjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpCi17Ci0gICAgc3RhdGljIGNvbnN0IGludDhfdCB0b3BbMTJdID0gewotICAgICAgICAtMSwgMCwgTEVGVF9EQ19QUkVELCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgbGVmdFsxMl0gPSB7Ci0gICAgICAgIDAsIC0xLCBUT1BfRENfUFJFRCwgMCwgLTEsIC0xLCAtMSwgMCwgLTEsIERDXzEyOF9QUkVECi0gICAgfTsKLSAgICBpbnQgaTsKLQotICAgIGlmICghKHNsLT50b3Bfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwMDApKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIGludCBzdGF0dXMgPSB0b3Bbc2wtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFswXSArIGldXTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJ0b3AgYmxvY2sgdW5hdmFpbGFibGUgZm9yIHJlcXVlc3RlZCBpbnRyYTR4NCBtb2RlICVkIGF0ICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHNsLT5tYl94LCBzbC0+bWJfeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cykgewotICAgICAgICAgICAgICAgIHNsLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyBpXSA9IHN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgoc2wtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgJiAweDg4ODgpICE9IDB4ODg4OCkgewotICAgICAgICBzdGF0aWMgY29uc3QgaW50IG1hc2tbNF0gPSB7IDB4ODAwMCwgMHgyMDAwLCAweDgwLCAweDIwIH07Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICBpZiAoIShzbC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAmIG1hc2tbaV0pKSB7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IGxlZnRbc2wtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFswXSArIDggKiBpXV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibGVmdCBibG9jayB1bmF2YWlsYWJsZSBmb3IgcmVxdWVzdGVkIGludHJhNHg0IG1vZGUgJWQgYXQgJWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIHNsLT5tYl94LCBzbC0+bWJfeSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNsLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyA4ICogaV0gPSBzdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfSAvLyBGSVhNRSBjbGVhbnVwIGxpa2UgZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUKLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgdG9wICYgbGVmdCBibG9ja3MgYXJlIGF2YWlsYWJsZSBpZiBuZWVkZWQgYW5kCi0gKiBjaGFuZ2UgdGhlIGRjIG1vZGUgc28gaXQgb25seSB1c2VzIHRoZSBhdmFpbGFibGUgYmxvY2tzLgotICovCi1pbnQgZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBpbnQgaXNfY2hyb21hKQotewotICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgdG9wWzRdICA9IHsgTEVGVF9EQ19QUkVEOHg4LCAxLCAtMSwgLTEgfTsKLSAgICBzdGF0aWMgY29uc3QgaW50OF90IGxlZnRbNV0gPSB7IFRPUF9EQ19QUkVEOHg4LCAtMSwgIDIsIC0xLCBEQ18xMjhfUFJFRDh4OCB9OwotCi0gICAgaWYgKG1vZGUgPiAzVSkgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJvdXQgb2YgcmFuZ2UgaW50cmEgY2hyb21hIHByZWQgbW9kZSBhdCAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgIHNsLT5tYl94LCBzbC0+bWJfeSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIH0KLQotICAgIGlmICghKHNsLT50b3Bfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwMDApKSB7Ci0gICAgICAgIG1vZGUgPSB0b3BbbW9kZV07Ci0gICAgICAgIGlmIChtb2RlIDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgInRvcCBibG9jayB1bmF2YWlsYWJsZSBmb3IgcmVxdWVzdGVkIGludHJhIG1vZGUgYXQgJWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgc2wtPm1iX3gsIHNsLT5tYl95KTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKChzbC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAmIDB4ODA4MCkgIT0gMHg4MDgwKSB7Ci0gICAgICAgIG1vZGUgPSBsZWZ0W21vZGVdOwotICAgICAgICBpZiAobW9kZSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJsZWZ0IGJsb2NrIHVuYXZhaWxhYmxlIGZvciByZXF1ZXN0ZWQgaW50cmEgbW9kZSBhdCAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBzbC0+bWJfeCwgc2wtPm1iX3kpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlzX2Nocm9tYSAmJiAoc2wtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwODApKSB7Ci0gICAgICAgICAgICAvLyBtYWQgY293IGRpc2Vhc2UgbW9kZSwgYWthIE1CQUZGICsgY29uc3RyYWluZWRfaW50cmFfcHJlZAotICAgICAgICAgICAgbW9kZSA9IEFMWkhFSU1FUl9EQ19MMFRfUFJFRDh4OCArCi0gICAgICAgICAgICAgICAgICAgKCEoc2wtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwMDApKSArCi0gICAgICAgICAgICAgICAgICAgMiAqIChtb2RlID09IERDXzEyOF9QUkVEOHg4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtb2RlOwotfQotCi1jb25zdCB1aW50OF90ICpmZl9oMjY0X2RlY29kZV9uYWwoSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRzdF9sZW5ndGgsIGludCAqY29uc3VtZWQsIGludCBsZW5ndGgpCi17Ci0gICAgaW50IGksIHNpLCBkaTsKLSAgICB1aW50OF90ICpkc3Q7Ci0KLSAgICAvLyBzcmNbMF0mMHg4MDsgLy8gZm9yYmlkZGVuIGJpdAotICAgIGgtPm5hbF9yZWZfaWRjICAgPSBzcmNbMF0gPj4gNTsKLSAgICBoLT5uYWxfdW5pdF90eXBlID0gc3JjWzBdICYgMHgxRjsKLQotICAgIHNyYysrOwotICAgIGxlbmd0aC0tOwotCi0jZGVmaW5lIFNUQVJUQ09ERV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGkgKyAyIDwgbGVuZ3RoICYmIHNyY1tpICsgMV0gPT0gMCAmJiBzcmNbaSArIDJdIDw9IDMpIHsgICAgICAgICBcCi0gICAgICAgIGlmIChzcmNbaSArIDJdICE9IDMgJiYgc3JjW2kgKyAyXSAhPSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAvKiBzdGFydGNvZGUsIHNvIHdlIG11c3QgYmUgcGFzdCB0aGUgZW5kICovICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBsZW5ndGggPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0jaWYgSEFWRV9GQVNUX1VOQUxJR05FRAotI2RlZmluZSBGSU5EX0ZJUlNUX1pFUk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChpID4gMCAmJiAhc3JjW2ldKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHdoaWxlIChzcmNbaV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpKysKLQotI2lmIEhBVkVfRkFTVF82NEJJVAotICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgbGVuZ3RoOyBpICs9IDkpIHsKLSAgICAgICAgaWYgKCEoKH5BVl9STjY0QShzcmMgKyBpKSAmCi0gICAgICAgICAgICAgICAoQVZfUk42NEEoc3JjICsgaSkgLSAweDAxMDAwMTAwMDEwMDAxMDFVTEwpKSAmCi0gICAgICAgICAgICAgIDB4ODAwMDgwMDA4MDAwODA4MFVMTCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgRklORF9GSVJTVF9aRVJPOwotICAgICAgICBTVEFSVENPREVfVEVTVDsKLSAgICAgICAgaSAtPSA3OwotICAgIH0KLSNlbHNlCi0gICAgZm9yIChpID0gMDsgaSArIDEgPCBsZW5ndGg7IGkgKz0gNSkgewotICAgICAgICBpZiAoISgofkFWX1JOMzJBKHNyYyArIGkpICYKLSAgICAgICAgICAgICAgIChBVl9STjMyQShzcmMgKyBpKSAtIDB4MDEwMDAxMDFVKSkgJgotICAgICAgICAgICAgICAweDgwMDA4MDgwVSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgRklORF9GSVJTVF9aRVJPOwotICAgICAgICBTVEFSVENPREVfVEVTVDsKLSAgICAgICAgaSAtPSAzOwotICAgIH0KLSNlbmRpZgotI2Vsc2UKLSAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGxlbmd0aDsgaSArPSAyKSB7Ci0gICAgICAgIGlmIChzcmNbaV0pCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGkgPiAwICYmIHNyY1tpIC0gMV0gPT0gMCkKLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgU1RBUlRDT0RFX1RFU1Q7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnNsLT5yYnNwX2J1ZmZlciwgJnNsLT5yYnNwX2J1ZmZlcl9zaXplLCBsZW5ndGgrTUFYX01CUEFJUl9TSVpFKTsKLSAgICBkc3QgPSBzbC0+cmJzcF9idWZmZXI7Ci0KLSAgICBpZiAoIWRzdCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZihpPj1sZW5ndGgtMSl7IC8vbm8gZXNjYXBlZCAwCi0gICAgICAgICpkc3RfbGVuZ3RoPSBsZW5ndGg7Ci0gICAgICAgICpjb25zdW1lZD0gbGVuZ3RoKzE7IC8vKzEgZm9yIHRoZSBoZWFkZXIKLSAgICAgICAgaWYoaC0+YXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX0ZBU1QpewotICAgICAgICAgICAgcmV0dXJuIHNyYzsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7Ci0gICAgICAgICAgICByZXR1cm4gZHN0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWVtY3B5KGRzdCwgc3JjLCBpKTsKLSAgICBzaSA9IGRpID0gaTsKLSAgICB3aGlsZSAoc2kgKyAyIDwgbGVuZ3RoKSB7Ci0gICAgICAgIC8vIHJlbW92ZSBlc2NhcGVzICh2ZXJ5IHJhcmUgMToyXjIyKQotICAgICAgICBpZiAoc3JjW3NpICsgMl0gPiAzKSB7Ci0gICAgICAgICAgICBkc3RbZGkrK10gPSBzcmNbc2krK107Ci0gICAgICAgICAgICBkc3RbZGkrK10gPSBzcmNbc2krK107Ci0gICAgICAgIH0gZWxzZSBpZiAoc3JjW3NpXSA9PSAwICYmIHNyY1tzaSArIDFdID09IDAgJiYgc3JjW3NpICsgMl0gIT0gMCkgewotICAgICAgICAgICAgaWYgKHNyY1tzaSArIDJdID09IDMpIHsgLy8gZXNjYXBlCi0gICAgICAgICAgICAgICAgZHN0W2RpKytdICA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0W2RpKytdICA9IDA7Ci0gICAgICAgICAgICAgICAgc2kgICAgICAgICs9IDM7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgLy8gbmV4dCBzdGFydCBjb2RlCi0gICAgICAgICAgICAgICAgZ290byBuc2M7Ci0gICAgICAgIH0KLQotICAgICAgICBkc3RbZGkrK10gPSBzcmNbc2krK107Ci0gICAgfQotICAgIHdoaWxlIChzaSA8IGxlbmd0aCkKLSAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOwotCi1uc2M6Ci0gICAgbWVtc2V0KGRzdCArIGRpLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLQotICAgICpkc3RfbGVuZ3RoID0gZGk7Ci0gICAgKmNvbnN1bWVkICAgPSBzaSArIDE7IC8vICsxIGZvciB0aGUgaGVhZGVyCi0gICAgLyogRklYTUUgc3RvcmUgZXhhY3QgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGdldGJpdGNvbnRleHQKLSAgICAgKiAoaXQgaXMgbmVlZGVkIGZvciBkZWNvZGluZykgKi8KLSAgICByZXR1cm4gZHN0OwotfQotCi0vKioKLSAqIElkZW50aWZ5IHRoZSBleGFjdCBlbmQgb2YgdGhlIGJpdHN0cmVhbQotICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFpbGluZywgb3IgMCBpZiBkYW1hZ2VkCi0gKi8KLXN0YXRpYyBpbnQgZGVjb2RlX3Jic3BfdHJhaWxpbmcoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKnNyYykKLXsKLSAgICBpbnQgdiA9ICpzcmM7Ci0gICAgaW50IHI7Ci0KLSAgICBmZl90bG9nKGgtPmF2Y3R4LCAicmJzcCB0cmFpbGluZyAlWFxuIiwgdik7Ci0KLSAgICBmb3IgKHIgPSAxOyByIDwgOTsgcisrKSB7Ci0gICAgICAgIGlmICh2ICYgMSkKLSAgICAgICAgICAgIHJldHVybiByOwotICAgICAgICB2ID4+PSAxOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBmZl9oMjY0X2ZyZWVfdGFibGVzKEgyNjRDb250ZXh0ICpoKQotewotICAgIGludCBpOwotCi0gICAgYXZfZnJlZXAoJmgtPmludHJhNHg0X3ByZWRfbW9kZSk7Ci0gICAgYXZfZnJlZXAoJmgtPmNocm9tYV9wcmVkX21vZGVfdGFibGUpOwotICAgIGF2X2ZyZWVwKCZoLT5jYnBfdGFibGUpOwotICAgIGF2X2ZyZWVwKCZoLT5tdmRfdGFibGVbMF0pOwotICAgIGF2X2ZyZWVwKCZoLT5tdmRfdGFibGVbMV0pOwotICAgIGF2X2ZyZWVwKCZoLT5kaXJlY3RfdGFibGUpOwotICAgIGF2X2ZyZWVwKCZoLT5ub25femVyb19jb3VudCk7Ci0gICAgYXZfZnJlZXAoJmgtPnNsaWNlX3RhYmxlX2Jhc2UpOwotICAgIGgtPnNsaWNlX3RhYmxlID0gTlVMTDsKLSAgICBhdl9mcmVlcCgmaC0+bGlzdF9jb3VudHMpOwotCi0gICAgYXZfZnJlZXAoJmgtPm1iMmJfeHkpOwotICAgIGF2X2ZyZWVwKCZoLT5tYjJicl94eSk7Ci0KLSAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJmgtPnFzY2FsZV90YWJsZV9wb29sKTsKLSAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJmgtPm1iX3R5cGVfcG9vbCk7Ci0gICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZoLT5tb3Rpb25fdmFsX3Bvb2wpOwotICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmaC0+cmVmX2luZGV4X3Bvb2wpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGgtPm5iX3NsaWNlX2N0eDsgaSsrKSB7Ci0gICAgICAgIEgyNjRTbGljZUNvbnRleHQgKnNsID0gJmgtPnNsaWNlX2N0eFtpXTsKLQotICAgICAgICBhdl9mcmVlcCgmc2wtPmRjX3ZhbF9iYXNlKTsKLSAgICAgICAgYXZfZnJlZXAoJnNsLT5lci5tYl9pbmRleDJ4eSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzbC0+ZXIuZXJyb3Jfc3RhdHVzX3RhYmxlKTsKLSAgICAgICAgYXZfZnJlZXAoJnNsLT5lci5lcl90ZW1wX2J1ZmZlcik7Ci0KLSAgICAgICAgYXZfZnJlZXAoJnNsLT5iaXByZWRfc2NyYXRjaHBhZCk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzbC0+ZWRnZV9lbXVfYnVmZmVyKTsKLSAgICAgICAgYXZfZnJlZXAoJnNsLT50b3BfYm9yZGVyc1swXSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzbC0+dG9wX2JvcmRlcnNbMV0pOwotCi0gICAgICAgIHNsLT5iaXByZWRfc2NyYXRjaHBhZF9hbGxvY2F0ZWQgPSAwOwotICAgICAgICBzbC0+ZWRnZV9lbXVfYnVmZmVyX2FsbG9jYXRlZCAgID0gMDsKLSAgICAgICAgc2wtPnRvcF9ib3JkZXJzX2FsbG9jYXRlZFswXSAgICA9IDA7Ci0gICAgICAgIHNsLT50b3BfYm9yZGVyc19hbGxvY2F0ZWRbMV0gICAgPSAwOwotICAgIH0KLX0KLQotaW50IGZmX2gyNjRfYWxsb2NfdGFibGVzKEgyNjRDb250ZXh0ICpoKQotewotICAgIGNvbnN0IGludCBiaWdfbWJfbnVtID0gaC0+bWJfc3RyaWRlICogKGgtPm1iX2hlaWdodCArIDEpOwotICAgIGNvbnN0IGludCByb3dfbWJfbnVtID0gMipoLT5tYl9zdHJpZGUqRkZNQVgoaC0+YXZjdHgtPnRocmVhZF9jb3VudCwgMSk7Ci0gICAgaW50IHgsIHk7Ci0KLSAgICBGRl9BTExPQ1pfQVJSQVlfT1JfR09UTyhoLT5hdmN0eCwgaC0+aW50cmE0eDRfcHJlZF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgIHJvd19tYl9udW0sIDggKiBzaXplb2YodWludDhfdCksIGZhaWwpCi0gICAgaC0+c2xpY2VfY3R4WzBdLmludHJhNHg0X3ByZWRfbW9kZSA9IGgtPmludHJhNHg0X3ByZWRfbW9kZTsKLQotICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5ub25femVyb19jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBiaWdfbWJfbnVtICogNDggKiBzaXplb2YodWludDhfdCksIGZhaWwpCi0gICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGgtPnNsaWNlX3RhYmxlX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgKGJpZ19tYl9udW0gKyBoLT5tYl9zdHJpZGUpICogc2l6ZW9mKCpoLT5zbGljZV90YWJsZV9iYXNlKSwgZmFpbCkKLSAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+Y2JwX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIGJpZ19tYl9udW0gKiBzaXplb2YodWludDE2X3QpLCBmYWlsKQotICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5jaHJvbWFfcHJlZF9tb2RlX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIGJpZ19tYl9udW0gKiBzaXplb2YodWludDhfdCksIGZhaWwpCi0gICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oaC0+YXZjdHgsIGgtPm12ZF90YWJsZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICByb3dfbWJfbnVtLCAxNiAqIHNpemVvZih1aW50OF90KSwgZmFpbCk7Ci0gICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oaC0+YXZjdHgsIGgtPm12ZF90YWJsZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICByb3dfbWJfbnVtLCAxNiAqIHNpemVvZih1aW50OF90KSwgZmFpbCk7Ci0gICAgaC0+c2xpY2VfY3R4WzBdLm12ZF90YWJsZVswXSA9IGgtPm12ZF90YWJsZVswXTsKLSAgICBoLT5zbGljZV9jdHhbMF0ubXZkX3RhYmxlWzFdID0gaC0+bXZkX3RhYmxlWzFdOwotCi0gICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGgtPmRpcmVjdF90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICA0ICogYmlnX21iX251bSAqIHNpemVvZih1aW50OF90KSwgZmFpbCk7Ci0gICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGgtPmxpc3RfY291bnRzLAotICAgICAgICAgICAgICAgICAgICAgIGJpZ19tYl9udW0gKiBzaXplb2YodWludDhfdCksIGZhaWwpCi0KLSAgICBtZW1zZXQoaC0+c2xpY2VfdGFibGVfYmFzZSwgLTEsCi0gICAgICAgICAgIChiaWdfbWJfbnVtICsgaC0+bWJfc3RyaWRlKSAqIHNpemVvZigqaC0+c2xpY2VfdGFibGVfYmFzZSkpOwotICAgIGgtPnNsaWNlX3RhYmxlID0gaC0+c2xpY2VfdGFibGVfYmFzZSArIGgtPm1iX3N0cmlkZSAqIDIgKyAxOwotCi0gICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGgtPm1iMmJfeHksCi0gICAgICAgICAgICAgICAgICAgICAgYmlnX21iX251bSAqIHNpemVvZih1aW50MzJfdCksIGZhaWwpOwotICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5tYjJicl94eSwKLSAgICAgICAgICAgICAgICAgICAgICBiaWdfbWJfbnVtICogc2l6ZW9mKHVpbnQzMl90KSwgZmFpbCk7Ci0gICAgZm9yICh5ID0gMDsgeSA8IGgtPm1iX2hlaWdodDsgeSsrKQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgaC0+bWJfd2lkdGg7IHgrKykgewotICAgICAgICAgICAgY29uc3QgaW50IG1iX3h5ID0geCArIHkgKiBoLT5tYl9zdHJpZGU7Ci0gICAgICAgICAgICBjb25zdCBpbnQgYl94eSAgPSA0ICogeCArIDQgKiB5ICogaC0+Yl9zdHJpZGU7Ci0KLSAgICAgICAgICAgIGgtPm1iMmJfeHlbbWJfeHldICA9IGJfeHk7Ci0gICAgICAgICAgICBoLT5tYjJicl94eVttYl94eV0gPSA4ICogKEZNTyA/IG1iX3h5IDogKG1iX3h5ICUgKDIgKiBoLT5tYl9zdHJpZGUpKSk7Ci0gICAgICAgIH0KLQotICAgIGlmICghaC0+ZGVxdWFudDRfY29lZmZbMF0pCi0gICAgICAgIGZmX2gyNjRfaW5pdF9kZXF1YW50X3RhYmxlcyhoKTsKLQotICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIGZmX2gyNjRfZnJlZV90YWJsZXMoaCk7Ci0gICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLX0KLQotLyoqCi0gKiBJbml0IGNvbnRleHQKLSAqIEFsbG9jYXRlIGJ1ZmZlcnMgd2hpY2ggYXJlIG5vdCBzaGFyZWQgYW1vbmdzdCBtdWx0aXBsZSB0aHJlYWRzLgotICovCi1pbnQgZmZfaDI2NF9zbGljZV9jb250ZXh0X2luaXQoSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsKQotewotICAgIEVSQ29udGV4dCAqZXIgPSAmc2wtPmVyOwotICAgIGludCBtYl9hcnJheV9zaXplID0gaC0+bWJfaGVpZ2h0ICogaC0+bWJfc3RyaWRlOwotICAgIGludCB5X3NpemUgID0gKDIgKiBoLT5tYl93aWR0aCArIDEpICogKDIgKiBoLT5tYl9oZWlnaHQgKyAxKTsKLSAgICBpbnQgY19zaXplICA9IGgtPm1iX3N0cmlkZSAqIChoLT5tYl9oZWlnaHQgKyAxKTsKLSAgICBpbnQgeWNfc2l6ZSA9IHlfc2l6ZSArIDIgICAqIGNfc2l6ZTsKLSAgICBpbnQgeCwgeSwgaTsKLQotICAgIHNsLT5yZWZfY2FjaGVbMF1bc2NhbjhbNV0gICsgMV0gPQotICAgIHNsLT5yZWZfY2FjaGVbMF1bc2NhbjhbN10gICsgMV0gPQotICAgIHNsLT5yZWZfY2FjaGVbMF1bc2NhbjhbMTNdICsgMV0gPQotICAgIHNsLT5yZWZfY2FjaGVbMV1bc2NhbjhbNV0gICsgMV0gPQotICAgIHNsLT5yZWZfY2FjaGVbMV1bc2NhbjhbN10gICsgMV0gPQotICAgIHNsLT5yZWZfY2FjaGVbMV1bc2NhbjhbMTNdICsgMV0gPSBQQVJUX05PVF9BVkFJTEFCTEU7Ci0KLSAgICBpZiAoc2wgIT0gaC0+c2xpY2VfY3R4KSB7Ci0gICAgICAgIG1lbXNldChlciwgMCwgc2l6ZW9mKCplcikpOwotICAgIH0gZWxzZQotICAgIGlmIChDT05GSUdfRVJST1JfUkVTSUxJRU5DRSkgewotCi0gICAgICAgIC8qIGluaXQgRVIgKi8KLSAgICAgICAgZXItPmF2Y3R4ICAgICAgICAgID0gaC0+YXZjdHg7Ci0gICAgICAgIGVyLT5kZWNvZGVfbWIgICAgICA9IGgyNjRfZXJfZGVjb2RlX21iOwotICAgICAgICBlci0+b3BhcXVlICAgICAgICAgPSBoOwotICAgICAgICBlci0+cXVhcnRlcl9zYW1wbGUgPSAxOwotCi0gICAgICAgIGVyLT5tYl9udW0gICAgICA9IGgtPm1iX251bTsKLSAgICAgICAgZXItPm1iX3dpZHRoICAgID0gaC0+bWJfd2lkdGg7Ci0gICAgICAgIGVyLT5tYl9oZWlnaHQgICA9IGgtPm1iX2hlaWdodDsKLSAgICAgICAgZXItPm1iX3N0cmlkZSAgID0gaC0+bWJfc3RyaWRlOwotICAgICAgICBlci0+Yjhfc3RyaWRlICAgPSBoLT5tYl93aWR0aCAqIDIgKyAxOwotCi0gICAgICAgIC8vIGVycm9yIHJlc2lsaWVuY2UgY29kZSBsb29rcyBjbGVhbmVyIHdpdGggdGhpcwotICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgZXItPm1iX2luZGV4Mnh5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+bWJfbnVtICsgMSkgKiBzaXplb2YoaW50KSwgZmFpbCk7Ci0KLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IGgtPm1iX2hlaWdodDsgeSsrKQotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGgtPm1iX3dpZHRoOyB4KyspCi0gICAgICAgICAgICAgICAgZXItPm1iX2luZGV4Mnh5W3ggKyB5ICogaC0+bWJfd2lkdGhdID0geCArIHkgKiBoLT5tYl9zdHJpZGU7Ci0KLSAgICAgICAgZXItPm1iX2luZGV4Mnh5W2gtPm1iX2hlaWdodCAqIGgtPm1iX3dpZHRoXSA9IChoLT5tYl9oZWlnaHQgLSAxKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYl9zdHJpZGUgKyBoLT5tYl93aWR0aDsKLQotICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgZXItPmVycm9yX3N0YXR1c190YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWJfYXJyYXlfc2l6ZSAqIHNpemVvZih1aW50OF90KSwgZmFpbCk7Ci0KLSAgICAgICAgRkZfQUxMT0NfT1JfR09UTyhoLT5hdmN0eCwgZXItPmVyX3RlbXBfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm1iX2hlaWdodCAqIGgtPm1iX3N0cmlkZSwgZmFpbCk7Ci0KLSAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIHNsLT5kY192YWxfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeWNfc2l6ZSAqIHNpemVvZihpbnQxNl90KSwgZmFpbCk7Ci0gICAgICAgIGVyLT5kY192YWxbMF0gPSBzbC0+ZGNfdmFsX2Jhc2UgKyBoLT5tYl93aWR0aCAqIDIgKyAyOwotICAgICAgICBlci0+ZGNfdmFsWzFdID0gc2wtPmRjX3ZhbF9iYXNlICsgeV9zaXplICsgaC0+bWJfc3RyaWRlICsgMTsKLSAgICAgICAgZXItPmRjX3ZhbFsyXSA9IGVyLT5kY192YWxbMV0gKyBjX3NpemU7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB5Y19zaXplOyBpKyspCi0gICAgICAgICAgICBzbC0+ZGNfdmFsX2Jhc2VbaV0gPSAxMDI0OwotICAgIH0KLQotICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7IC8vIGZmX2gyNjRfZnJlZV90YWJsZXMgd2lsbCBjbGVhbiB1cCBmb3IgdXMKLX0KLQotc3RhdGljIGludCBkZWNvZGVfbmFsX3VuaXRzKEgyNjRDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyc2VfZXh0cmFkYXRhKTsKLQotaW50IGZmX2gyNjRfZGVjb2RlX2V4dHJhZGF0YShIMjY0Q29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKLXsKLSAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBoLT5hdmN0eDsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKCFidWYgfHwgc2l6ZSA8PSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAoYnVmWzBdID09IDEpIHsKLSAgICAgICAgaW50IGksIGNudCwgbmFsc2l6ZTsKLSAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcCA9IGJ1ZjsKLQotICAgICAgICBoLT5pc19hdmMgPSAxOwotCi0gICAgICAgIGlmIChzaXplIDwgNykgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgImF2Y0MgJWQgdG9vIHNob3J0XG4iLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9Ci0gICAgICAgIC8qIHNwcyBhbmQgcHBzIGluIHRoZSBhdmNDIGFsd2F5cyBoYXZlIGxlbmd0aCBjb2RlZCB3aXRoIDIgYnl0ZXMsCi0gICAgICAgICAqIHNvIHB1dCBhIGZha2UgbmFsX2xlbmd0aF9zaXplID0gMiB3aGlsZSBwYXJzaW5nIHRoZW0gKi8KLSAgICAgICAgaC0+bmFsX2xlbmd0aF9zaXplID0gMjsKLSAgICAgICAgLy8gRGVjb2RlIHNwcyBmcm9tIGF2Y0MKLSAgICAgICAgY250ID0gKihwICsgNSkgJiAweDFmOyAvLyBOdW1iZXIgb2Ygc3BzCi0gICAgICAgIHAgICs9IDY7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgewotICAgICAgICAgICAgbmFsc2l6ZSA9IEFWX1JCMTYocCkgKyAyOwotICAgICAgICAgICAgaWYobmFsc2l6ZSA+IHNpemUgLSAocC1idWYpKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX25hbF91bml0cyhoLCBwLCBuYWxzaXplLCAxKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJEZWNvZGluZyBzcHMgJWQgZnJvbSBhdmNDIGZhaWxlZFxuIiwgaSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAgKz0gbmFsc2l6ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBEZWNvZGUgcHBzIGZyb20gYXZjQwotICAgICAgICBjbnQgPSAqKHArKyk7IC8vIE51bWJlciBvZiBwcHMKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Ci0gICAgICAgICAgICBuYWxzaXplID0gQVZfUkIxNihwKSArIDI7Ci0gICAgICAgICAgICBpZihuYWxzaXplID4gc2l6ZSAtIChwLWJ1ZikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICByZXQgPSBkZWNvZGVfbmFsX3VuaXRzKGgsIHAsIG5hbHNpemUsIDEpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkRlY29kaW5nIHBwcyAlZCBmcm9tIGF2Y0MgZmFpbGVkXG4iLCBpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCArPSBuYWxzaXplOwotICAgICAgICB9Ci0gICAgICAgIC8vIFN0b3JlIHJpZ2h0IG5hbCBsZW5ndGggc2l6ZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZSBhbGwgb3RoZXIgbmFscwotICAgICAgICBoLT5uYWxfbGVuZ3RoX3NpemUgPSAoYnVmWzRdICYgMHgwMykgKyAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGgtPmlzX2F2YyA9IDA7Ci0gICAgICAgIHJldCA9IGRlY29kZV9uYWxfdW5pdHMoaCwgYnVmLCBzaXplLCAxKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIGludCBoMjY0X2luaXRfY29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEgyNjRDb250ZXh0ICpoKQotewotICAgIGludCBpOwotCi0gICAgaC0+YXZjdHggICAgICAgICAgICAgICAgID0gYXZjdHg7Ci0gICAgaC0+YmFja3VwX3dpZHRoICAgICAgICAgID0gLTE7Ci0gICAgaC0+YmFja3VwX2hlaWdodCAgICAgICAgID0gLTE7Ci0gICAgaC0+YmFja3VwX3BpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9OT05FOwotICAgIGgtPmRlcXVhbnRfY29lZmZfcHBzICAgICA9IC0xOwotICAgIGgtPmN1cnJlbnRfc3BzX2lkICAgICAgICA9IC0xOwotICAgIGgtPmN1cl9jaHJvbWFfZm9ybWF0X2lkYyA9IC0xOwotCi0gICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgICAgID0gUElDVF9GUkFNRTsKLSAgICBoLT5zbGljZV9jb250ZXh0X2NvdW50ICAgPSAxOwotICAgIGgtPndvcmthcm91bmRfYnVncyAgICAgICA9IGF2Y3R4LT53b3JrYXJvdW5kX2J1Z3M7Ci0gICAgaC0+ZmxhZ3MgICAgICAgICAgICAgICAgID0gYXZjdHgtPmZsYWdzOwotICAgIGgtPnByZXZfcG9jX21zYiAgICAgICAgICA9IDEgPDwgMTY7Ci0gICAgaC0+eDI2NF9idWlsZCAgICAgICAgICAgID0gLTE7Ci0gICAgaC0+cmVjb3ZlcnlfZnJhbWUgICAgICAgID0gLTE7Ci0gICAgaC0+ZnJhbWVfcmVjb3ZlcmVkICAgICAgID0gMDsKLSAgICBoLT5wcmV2X2ZyYW1lX251bSAgICAgICAgPSAtMTsKLSAgICBoLT5zZWlfZnBhLmZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWcgPSAtMTsKLQotICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gSU5UX01JTjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RFTEFZRURfUElDX0NPVU5UOyBpKyspCi0gICAgICAgIGgtPmxhc3RfcG9jc1tpXSA9IElOVF9NSU47Ci0KLSAgICBmZl9oMjY0X3Jlc2V0X3NlaShoKTsKLQotICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX0xFRlQ7Ci0KLSAgICBoLT5uYl9zbGljZV9jdHggPSAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSkgPyAgSDI2NF9NQVhfVEhSRUFEUyA6IDE7Ci0gICAgaC0+c2xpY2VfY3R4ID0gYXZfbWFsbG9jel9hcnJheShoLT5uYl9zbGljZV9jdHgsIHNpemVvZigqaC0+c2xpY2VfY3R4KSk7Ci0gICAgaWYgKCFoLT5zbGljZV9jdHgpIHsKLSAgICAgICAgaC0+bmJfc2xpY2VfY3R4ID0gMDsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUElDVFVSRV9DT1VOVDsgaSsrKSB7Ci0gICAgICAgIGgtPkRQQltpXS5mID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICAgICAgaWYgKCFoLT5EUEJbaV0uZikKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgaC0+Y3VyX3BpYy5mID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIWgtPmN1cl9waWMuZikKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIGgtPmxhc3RfcGljX2Zvcl9lYy5mID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIWgtPmxhc3RfcGljX2Zvcl9lYy5mKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGgtPm5iX3NsaWNlX2N0eDsgaSsrKQotICAgICAgICBoLT5zbGljZV9jdHhbaV0uaDI2NCA9IGg7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIEFWT25jZSBoMjY0X3ZsY19pbml0ID0gQVZfT05DRV9JTklUOwotCi1hdl9jb2xkIGludCBmZl9oMjY0X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IHJldDsKLQotICAgIHJldCA9IGgyNjRfaW5pdF9jb250ZXh0KGF2Y3R4LCBoKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIC8qIHNldCBkZWZhdWx0cyAqLwotICAgIGlmICghYXZjdHgtPmhhc19iX2ZyYW1lcykKLSAgICAgICAgaC0+bG93X2RlbGF5ID0gMTsKLQotICAgIHJldCA9IGZmX3RocmVhZF9vbmNlKCZoMjY0X3ZsY19pbml0LCBmZl9oMjY0X2RlY29kZV9pbml0X3ZsYyk7Ci0gICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicHRocmVhZF9vbmNlIGhhcyBmYWlsZWQuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Ci0gICAgfQotCi0gICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7Ci0gICAgICAgIGlmIChhdmN0eC0+dGlja3NfcGVyX2ZyYW1lID09IDEpIHsKLSAgICAgICAgICAgIGlmKGgtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuIDwgSU5UX01BWC8yKSB7Ci0gICAgICAgICAgICAgICAgaC0+YXZjdHgtPnRpbWVfYmFzZS5kZW4gKj0gMjsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT50aW1lX2Jhc2UubnVtIC89IDI7Ci0gICAgICAgIH0KLSAgICAgICAgYXZjdHgtPnRpY2tzX3Blcl9mcmFtZSA9IDI7Ci0gICAgfQotCi0gICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYgYXZjdHgtPmV4dHJhZGF0YSkgewotICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9leHRyYWRhdGEoaCwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGgyNjRfZGVjb2RlX2VuZChhdmN0eCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGgtPnNwcy5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAmJgotICAgICAgICBoLT5hdmN0eC0+aGFzX2JfZnJhbWVzIDwgaC0+c3BzLm51bV9yZW9yZGVyX2ZyYW1lcykgewotICAgICAgICBoLT5hdmN0eC0+aGFzX2JfZnJhbWVzID0gaC0+c3BzLm51bV9yZW9yZGVyX2ZyYW1lczsKLSAgICAgICAgaC0+bG93X2RlbGF5ICAgICAgICAgICA9IDA7Ci0gICAgfQotCi0gICAgYXZjdHgtPmludGVybmFsLT5hbGxvY2F0ZV9wcm9ncmVzcyA9IDE7Ci0KLSAgICBmZl9oMjY0X2ZsdXNoX2NoYW5nZShoKTsKLQotICAgIGlmIChoLT5lbmFibGVfZXIgPCAwICYmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSkKLSAgICAgICAgaC0+ZW5hYmxlX2VyID0gMDsKLQotICAgIGlmIChoLT5lbmFibGVfZXIgJiYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAiRXJyb3IgcmVzaWxpZW5jZSB3aXRoIHNsaWNlIHRocmVhZHMgaXMgZW5hYmxlZC4gSXQgaXMgdW5zYWZlIGFuZCB1bnN1cHBvcnRlZCBhbmQgbWF5IGNyYXNoLiAiCi0gICAgICAgICAgICAgICAiVXNlIGl0IGF0IHlvdXIgb3duIHJpc2tcbiIpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0jaWYgSEFWRV9USFJFQURTCi1zdGF0aWMgaW50IGRlY29kZV9pbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IHJldDsKLQotICAgIGlmICghYXZjdHgtPmludGVybmFsLT5pc19jb3B5KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG1lbXNldChoLCAwLCBzaXplb2YoKmgpKTsKLQotICAgIHJldCA9IGgyNjRfaW5pdF9jb250ZXh0KGF2Y3R4LCBoKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGgtPmNvbnRleHRfaW5pdGlhbGl6ZWQgPSAwOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotLyoqCi0gKiBSdW4gc2V0dXAgb3BlcmF0aW9ucyB0aGF0IG11c3QgYmUgcnVuIGFmdGVyIHNsaWNlIGhlYWRlciBkZWNvZGluZy4KLSAqIFRoaXMgaW5jbHVkZXMgZmluZGluZyB0aGUgbmV4dCBkaXNwbGF5ZWQgZnJhbWUuCi0gKgotICogQHBhcmFtIGggaDI2NCBtYXN0ZXIgY29udGV4dAotICogQHBhcmFtIHNldHVwX2ZpbmlzaGVkIGVub3VnaCBOQUxzIGhhdmUgYmVlbiByZWFkIHRoYXQgd2UgY2FuIGNhbGwKLSAqIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKQotICovCi1zdGF0aWMgdm9pZCBkZWNvZGVfcG9zdGluaXQoSDI2NENvbnRleHQgKmgsIGludCBzZXR1cF9maW5pc2hlZCkKLXsKLSAgICBIMjY0UGljdHVyZSAqb3V0ID0gaC0+Y3VyX3BpY19wdHI7Ci0gICAgSDI2NFBpY3R1cmUgKmN1ciA9IGgtPmN1cl9waWNfcHRyOwotICAgIGludCBpLCBwaWNzLCBvdXRfb2Zfb3JkZXIsIG91dF9pZHg7Ci0KLSAgICBoLT5jdXJfcGljX3B0ci0+Zi0+cGljdF90eXBlID0gaC0+cGljdF90eXBlOwotCi0gICAgaWYgKGgtPm5leHRfb3V0cHV0X3BpYykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGN1ci0+ZmllbGRfcG9jWzBdID09IElOVF9NQVggfHwgY3VyLT5maWVsZF9wb2NbMV0gPT0gSU5UX01BWCkgewotICAgICAgICAvKiBGSVhNRTogaWYgd2UgaGF2ZSB0d28gUEFGRiBmaWVsZHMgaW4gb25lIHBhY2tldCwgd2UgY2FuJ3Qgc3RhcnQKLSAgICAgICAgICogdGhlIG5leHQgdGhyZWFkIGhlcmUuIElmIHdlIGhhdmUgb25lIGZpZWxkIHBlciBwYWNrZXQsIHdlIGNhbi4KLSAgICAgICAgICogVGhlIGNoZWNrIGluIGRlY29kZV9uYWxfdW5pdHMoKSBpcyBub3QgZ29vZCBlbm91Z2ggdG8gZmluZCB0aGlzCi0gICAgICAgICAqIHlldCwgc28gd2UgYXNzdW1lIHRoZSB3b3JzdCBmb3Igbm93LiAqLwotICAgICAgICAvLyBpZiAoc2V0dXBfZmluaXNoZWQpCi0gICAgICAgIC8vICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoaC0+YXZjdHgpOwotICAgICAgICBpZiAoY3VyLT5maWVsZF9wb2NbMF0gPT0gSU5UX01BWCAmJiBjdXItPmZpZWxkX3BvY1sxXSA9PSBJTlRfTUFYKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBpZiAoaC0+YXZjdHgtPmh3YWNjZWwgfHwgaC0+bWlzc2luZ19maWVsZHMgPD0xKQotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGN1ci0+Zi0+aW50ZXJsYWNlZF9mcmFtZSA9IDA7Ci0gICAgY3VyLT5mLT5yZXBlYXRfcGljdCAgICAgID0gMDsKLQotICAgIC8qIFNpZ25hbCBpbnRlcmxhY2luZyBpbmZvcm1hdGlvbiBleHRlcm5hbGx5LiAqLwotICAgIC8qIFByaW9yaXRpemUgcGljdHVyZSB0aW1pbmcgU0VJIGluZm9ybWF0aW9uIG92ZXIgdXNlZAotICAgICAqIGRlY29kaW5nIHByb2Nlc3MgaWYgaXQgZXhpc3RzLiAqLwotCi0gICAgaWYgKGgtPnNwcy5waWNfc3RydWN0X3ByZXNlbnRfZmxhZykgewotICAgICAgICBzd2l0Y2ggKGgtPnNlaV9waWNfc3RydWN0KSB7Ci0gICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfRlJBTUU6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9UT1BfRklFTEQ6Ci0gICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX0ZJRUxEOgotICAgICAgICAgICAgY3VyLT5mLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT006Ci0gICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUDoKLSAgICAgICAgICAgIGlmIChGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpKQotICAgICAgICAgICAgICAgIGN1ci0+Zi0+aW50ZXJsYWNlZF9mcmFtZSA9IDE7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZsYWcgc29mdCB0ZWxlY2luZSBwcm9ncmVzc2l2ZQotICAgICAgICAgICAgICAgIGN1ci0+Zi0+aW50ZXJsYWNlZF9mcmFtZSA9IGgtPnByZXZfaW50ZXJsYWNlZF9mcmFtZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT01fVE9QOgotICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1BfQk9UVE9NOgotICAgICAgICAgICAgLyogU2lnbmFsIHRoZSBwb3NzaWJpbGl0eSBvZiB0ZWxlY2luZWQgZmlsbSBleHRlcm5hbGx5Ci0gICAgICAgICAgICAgKiAocGljX3N0cnVjdCA1LDYpLiBGcm9tIHRoZXNlIGhpbnRzLCBsZXQgdGhlIGFwcGxpY2F0aW9ucwotICAgICAgICAgICAgICogZGVjaWRlIGlmIHRoZXkgYXBwbHkgZGVpbnRlcmxhY2luZy4gKi8KLSAgICAgICAgICAgIGN1ci0+Zi0+cmVwZWF0X3BpY3QgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfRlJBTUVfRE9VQkxJTkc6Ci0gICAgICAgICAgICBjdXItPmYtPnJlcGVhdF9waWN0ID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0ZSQU1FX1RSSVBMSU5HOgotICAgICAgICAgICAgY3VyLT5mLT5yZXBlYXRfcGljdCA9IDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoaC0+c2VpX2N0X3R5cGUgJiAzKSAmJgotICAgICAgICAgICAgaC0+c2VpX3BpY19zdHJ1Y3QgPD0gU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUCkKLSAgICAgICAgICAgIGN1ci0+Zi0+aW50ZXJsYWNlZF9mcmFtZSA9IChoLT5zZWlfY3RfdHlwZSAmICgxIDw8IDEpKSAhPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIERlcml2ZSBpbnRlcmxhY2luZyBmbGFnIGZyb20gdXNlZCBkZWNvZGluZyBwcm9jZXNzLiAqLwotICAgICAgICBjdXItPmYtPmludGVybGFjZWRfZnJhbWUgPSBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpOwotICAgIH0KLSAgICBoLT5wcmV2X2ludGVybGFjZWRfZnJhbWUgPSBjdXItPmYtPmludGVybGFjZWRfZnJhbWU7Ci0KLSAgICBpZiAoY3VyLT5maWVsZF9wb2NbMF0gIT0gY3VyLT5maWVsZF9wb2NbMV0pIHsKLSAgICAgICAgLyogRGVyaXZlIHRvcF9maWVsZF9maXJzdCBmcm9tIGZpZWxkIHBvY3MuICovCi0gICAgICAgIGN1ci0+Zi0+dG9wX2ZpZWxkX2ZpcnN0ID0gY3VyLT5maWVsZF9wb2NbMF0gPCBjdXItPmZpZWxkX3BvY1sxXTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoaC0+c3BzLnBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgICAgICAvKiBVc2UgcGljdHVyZSB0aW1pbmcgU0VJIGluZm9ybWF0aW9uLiBFdmVuIGlmIGl0IGlzIGEKLSAgICAgICAgICAgICAqIGluZm9ybWF0aW9uIG9mIGEgcGFzdCBmcmFtZSwgYmV0dGVyIHRoYW4gbm90aGluZy4gKi8KLSAgICAgICAgICAgIGlmIChoLT5zZWlfcGljX3N0cnVjdCA9PSBTRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NIHx8Ci0gICAgICAgICAgICAgICAgaC0+c2VpX3BpY19zdHJ1Y3QgPT0gU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTV9UT1ApCi0gICAgICAgICAgICAgICAgY3VyLT5mLT50b3BfZmllbGRfZmlyc3QgPSAxOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGN1ci0+Zi0+dG9wX2ZpZWxkX2ZpcnN0ID0gMDsKLSAgICAgICAgfSBlbHNlIGlmIChjdXItPmYtPmludGVybGFjZWRfZnJhbWUpIHsKLSAgICAgICAgICAgIC8qIERlZmF1bHQgdG8gdG9wIGZpZWxkIGZpcnN0IHdoZW4gcGljX3N0cnVjdF9wcmVzZW50X2ZsYWcKLSAgICAgICAgICAgICAqIGlzIG5vdCBzZXQgYnV0IGludGVybGFjZWQgZnJhbWUgZGV0ZWN0ZWQgKi8KLSAgICAgICAgICAgIGN1ci0+Zi0+dG9wX2ZpZWxkX2ZpcnN0ID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIE1vc3QgbGlrZWx5IHByb2dyZXNzaXZlICovCi0gICAgICAgICAgICBjdXItPmYtPnRvcF9maWVsZF9maXJzdCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaC0+c2VpX2ZyYW1lX3BhY2tpbmdfcHJlc2VudCAmJgotICAgICAgICBoLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgPj0gMCAmJgotICAgICAgICBoLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgPD0gNiAmJgotICAgICAgICBoLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPiAwICYmCi0gICAgICAgIGgtPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA8IDMpIHsKLSAgICAgICAgQVZTdGVyZW8zRCAqc3RlcmVvID0gYXZfc3RlcmVvM2RfY3JlYXRlX3NpZGVfZGF0YShjdXItPmYpOwotICAgICAgICBpZiAoc3RlcmVvKSB7Ci0gICAgICAgIHN3aXRjaCAoaC0+ZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0NIRUNLRVJCT0FSRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9DT0xVTU5TOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0xJTkVTOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGlmIChoLT5xdWluY3VueF9zdWJzYW1wbGluZykKLSAgICAgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9TSURFQllTSURFX1FVSU5DVU5YOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX1NJREVCWVNJREU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfVE9QQk9UVE9NOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0ZSQU1FU0VRVUVOQ0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfMkQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikKLSAgICAgICAgICAgIHN0ZXJlby0+ZmxhZ3MgPSBBVl9TVEVSRU8zRF9GTEFHX0lOVkVSVDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChoLT5zZWlfZGlzcGxheV9vcmllbnRhdGlvbl9wcmVzZW50ICYmCi0gICAgICAgIChoLT5zZWlfYW50aWNsb2Nrd2lzZV9yb3RhdGlvbiB8fCBoLT5zZWlfaGZsaXAgfHwgaC0+c2VpX3ZmbGlwKSkgewotICAgICAgICBkb3VibGUgYW5nbGUgPSBoLT5zZWlfYW50aWNsb2Nrd2lzZV9yb3RhdGlvbiAqIDM2MCAvIChkb3VibGUpICgxIDw8IDE2KTsKLSAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpyb3RhdGlvbiA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoY3VyLT5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX0RJU1BMQVlNQVRSSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQzMl90KSAqIDkpOwotICAgICAgICBpZiAocm90YXRpb24pIHsKLSAgICAgICAgICAgIGF2X2Rpc3BsYXlfcm90YXRpb25fc2V0KChpbnQzMl90ICopcm90YXRpb24tPmRhdGEsIGFuZ2xlKTsKLSAgICAgICAgICAgIGF2X2Rpc3BsYXlfbWF0cml4X2ZsaXAoKGludDMyX3QgKilyb3RhdGlvbi0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VpX2hmbGlwLCBoLT5zZWlfdmZsaXApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGgtPnNlaV9yZWd1c2VyZGF0YV9hZmRfcHJlc2VudCkgewotICAgICAgICBBVkZyYW1lU2lkZURhdGEgKnNkID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShjdXItPmYsIEFWX0ZSQU1FX0RBVEFfQUZELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDhfdCkpOwotCi0gICAgICAgIGlmIChzZCkgewotICAgICAgICAgICAgKnNkLT5kYXRhID0gaC0+YWN0aXZlX2Zvcm1hdF9kZXNjcmlwdGlvbjsKLSAgICAgICAgICAgIGgtPnNlaV9yZWd1c2VyZGF0YV9hZmRfcHJlc2VudCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaC0+YTUzX2NhcHRpb24pIHsKLSAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoY3VyLT5mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX0E1M19DQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+YTUzX2NhcHRpb25fc2l6ZSk7Ci0gICAgICAgIGlmIChzZCkKLSAgICAgICAgICAgIG1lbWNweShzZC0+ZGF0YSwgaC0+YTUzX2NhcHRpb24sIGgtPmE1M19jYXB0aW9uX3NpemUpOwotICAgICAgICBhdl9mcmVlcCgmaC0+YTUzX2NhcHRpb24pOwotICAgICAgICBoLT5hNTNfY2FwdGlvbl9zaXplID0gMDsKLSAgICAgICAgaC0+YXZjdHgtPnByb3BlcnRpZXMgfD0gRkZfQ09ERUNfUFJPUEVSVFlfQ0xPU0VEX0NBUFRJT05TOwotICAgIH0KLQotICAgIGN1ci0+bW1jb19yZXNldCA9IGgtPm1tY29fcmVzZXQ7Ci0gICAgaC0+bW1jb19yZXNldCA9IDA7Ci0KLSAgICAvLyBGSVhNRSBkbyBzb21ldGhpbmcgd2l0aCB1bmF2YWlsYWJsZSByZWZlcmVuY2UgZnJhbWVzCi0KLSAgICAvKiBTb3J0IEItZnJhbWVzIGludG8gZGlzcGxheSBvcmRlciAqLwotICAgIGlmIChoLT5zcHMuYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgfHwKLSAgICAgICAgaC0+YXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+PSBGRl9DT01QTElBTkNFX1NUUklDVCkgewotICAgICAgICBoLT5hdmN0eC0+aGFzX2JfZnJhbWVzID0gRkZNQVgoaC0+YXZjdHgtPmhhc19iX2ZyYW1lcywgaC0+c3BzLm51bV9yZW9yZGVyX2ZyYW1lcyk7Ci0gICAgfQotICAgIGgtPmxvd19kZWxheSA9ICFoLT5hdmN0eC0+aGFzX2JfZnJhbWVzOwotCi0gICAgZm9yIChpID0gMDsgMTsgaSsrKSB7Ci0gICAgICAgIGlmKGkgPT0gTUFYX0RFTEFZRURfUElDX0NPVU5UIHx8IGN1ci0+cG9jIDwgaC0+bGFzdF9wb2NzW2ldKXsKLSAgICAgICAgICAgIGlmKGkpCi0gICAgICAgICAgICAgICAgaC0+bGFzdF9wb2NzW2ktMV0gPSBjdXItPnBvYzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYoaSkgewotICAgICAgICAgICAgaC0+bGFzdF9wb2NzW2ktMV09IGgtPmxhc3RfcG9jc1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBvdXRfb2Zfb3JkZXIgPSBNQVhfREVMQVlFRF9QSUNfQ09VTlQgLSBpOwotICAgIGlmKCAgIGN1ci0+Zi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CCi0gICAgICAgfHwgKGgtPmxhc3RfcG9jc1tNQVhfREVMQVlFRF9QSUNfQ09VTlQtMl0gPiBJTlRfTUlOICYmIGgtPmxhc3RfcG9jc1tNQVhfREVMQVlFRF9QSUNfQ09VTlQtMV0gLSBoLT5sYXN0X3BvY3NbTUFYX0RFTEFZRURfUElDX0NPVU5ULTJdID4gMikpCi0gICAgICAgIG91dF9vZl9vcmRlciA9IEZGTUFYKG91dF9vZl9vcmRlciwgMSk7Ci0gICAgaWYgKG91dF9vZl9vcmRlciA9PSBNQVhfREVMQVlFRF9QSUNfQ09VTlQpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkludmFsaWQgUE9DICVkPCVkXG4iLCBjdXItPnBvYywgaC0+bGFzdF9wb2NzWzBdKTsKLSAgICAgICAgZm9yIChpID0gMTsgaSA8IE1BWF9ERUxBWUVEX1BJQ19DT1VOVDsgaSsrKQotICAgICAgICAgICAgaC0+bGFzdF9wb2NzW2ldID0gSU5UX01JTjsKLSAgICAgICAgaC0+bGFzdF9wb2NzWzBdID0gY3VyLT5wb2M7Ci0gICAgICAgIGN1ci0+bW1jb19yZXNldCA9IDE7Ci0gICAgfSBlbHNlIGlmKGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMgPCBvdXRfb2Zfb3JkZXIgJiYgIWgtPnNwcy5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyl7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0lORk8sICJJbmNyZWFzaW5nIHJlb3JkZXIgYnVmZmVyIHRvICVkXG4iLCBvdXRfb2Zfb3JkZXIpOwotICAgICAgICBoLT5hdmN0eC0+aGFzX2JfZnJhbWVzID0gb3V0X29mX29yZGVyOwotICAgICAgICBoLT5sb3dfZGVsYXkgPSAwOwotICAgIH0KLQotICAgIHBpY3MgPSAwOwotICAgIHdoaWxlIChoLT5kZWxheWVkX3BpY1twaWNzXSkKLSAgICAgICAgcGljcysrOwotCi0gICAgYXZfYXNzZXJ0MChwaWNzIDw9IE1BWF9ERUxBWUVEX1BJQ19DT1VOVCk7Ci0KLSAgICBoLT5kZWxheWVkX3BpY1twaWNzKytdID0gY3VyOwotICAgIGlmIChjdXItPnJlZmVyZW5jZSA9PSAwKQotICAgICAgICBjdXItPnJlZmVyZW5jZSA9IERFTEFZRURfUElDX1JFRjsKLQotICAgIG91dCAgICAgPSBoLT5kZWxheWVkX3BpY1swXTsKLSAgICBvdXRfaWR4ID0gMDsKLSAgICBmb3IgKGkgPSAxOyBoLT5kZWxheWVkX3BpY1tpXSAmJgotICAgICAgICAgICAgICAgICFoLT5kZWxheWVkX3BpY1tpXS0+Zi0+a2V5X2ZyYW1lICYmCi0gICAgICAgICAgICAgICAgIWgtPmRlbGF5ZWRfcGljW2ldLT5tbWNvX3Jlc2V0OwotICAgICAgICAgaSsrKQotICAgICAgICBpZiAoaC0+ZGVsYXllZF9waWNbaV0tPnBvYyA8IG91dC0+cG9jKSB7Ci0gICAgICAgICAgICBvdXQgICAgID0gaC0+ZGVsYXllZF9waWNbaV07Ci0gICAgICAgICAgICBvdXRfaWR4ID0gaTsKLSAgICAgICAgfQotICAgIGlmIChoLT5hdmN0eC0+aGFzX2JfZnJhbWVzID09IDAgJiYKLSAgICAgICAgKGgtPmRlbGF5ZWRfcGljWzBdLT5mLT5rZXlfZnJhbWUgfHwgaC0+ZGVsYXllZF9waWNbMF0tPm1tY29fcmVzZXQpKQotICAgICAgICBoLT5uZXh0X291dHB1dGVkX3BvYyA9IElOVF9NSU47Ci0gICAgb3V0X29mX29yZGVyID0gb3V0LT5wb2MgPCBoLT5uZXh0X291dHB1dGVkX3BvYzsKLQotICAgIGlmIChvdXRfb2Zfb3JkZXIgfHwgcGljcyA+IGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMpIHsKLSAgICAgICAgb3V0LT5yZWZlcmVuY2UgJj0gfkRFTEFZRURfUElDX1JFRjsKLSAgICAgICAgLy8gZm9yIGZyYW1lIHRocmVhZGluZywgdGhlIG93bmVyIG11c3QgYmUgdGhlIHNlY29uZCBmaWVsZCdzIHRocmVhZCBvcgotICAgICAgICAvLyBlbHNlIHRoZSBmaXJzdCB0aHJlYWQgY2FuIHJlbGVhc2UgdGhlIHBpY3R1cmUgYW5kIHJldXNlIGl0IHVuc2FmZWx5Ci0gICAgICAgIGZvciAoaSA9IG91dF9pZHg7IGgtPmRlbGF5ZWRfcGljW2ldOyBpKyspCi0gICAgICAgICAgICBoLT5kZWxheWVkX3BpY1tpXSA9IGgtPmRlbGF5ZWRfcGljW2kgKyAxXTsKLSAgICB9Ci0gICAgaWYgKCFvdXRfb2Zfb3JkZXIgJiYgcGljcyA+IGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMpIHsKLSAgICAgICAgaC0+bmV4dF9vdXRwdXRfcGljID0gb3V0OwotICAgICAgICBpZiAob3V0X2lkeCA9PSAwICYmIGgtPmRlbGF5ZWRfcGljWzBdICYmIChoLT5kZWxheWVkX3BpY1swXS0+Zi0+a2V5X2ZyYW1lIHx8IGgtPmRlbGF5ZWRfcGljWzBdLT5tbWNvX3Jlc2V0KSkgewotICAgICAgICAgICAgaC0+bmV4dF9vdXRwdXRlZF9wb2MgPSBJTlRfTUlOOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gb3V0LT5wb2M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJubyBwaWN0dXJlICVzXG4iLCBvdXRfb2Zfb3JkZXIgPyAib29vIiA6ICIiKTsKLSAgICB9Ci0KLSAgICBpZiAoaC0+bmV4dF9vdXRwdXRfcGljKSB7Ci0gICAgICAgIGlmIChoLT5uZXh0X291dHB1dF9waWMtPnJlY292ZXJlZCkgewotICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWFjaGVkIGFuIHJlY292ZXJ5IHBvaW50IGFuZCBhbGwgZnJhbWVzIGFmdGVyIGl0IGluCi0gICAgICAgICAgICAvLyBkaXNwbGF5IG9yZGVyIGFyZSAicmVjb3ZlcmVkIi4KLSAgICAgICAgICAgIGgtPmZyYW1lX3JlY292ZXJlZCB8PSBGUkFNRV9SRUNPVkVSRURfU0VJOwotICAgICAgICB9Ci0gICAgICAgIGgtPm5leHRfb3V0cHV0X3BpYy0+cmVjb3ZlcmVkIHw9ICEhKGgtPmZyYW1lX3JlY292ZXJlZCAmIEZSQU1FX1JFQ09WRVJFRF9TRUkpOwotICAgIH0KLQotICAgIGlmIChzZXR1cF9maW5pc2hlZCAmJiAhaC0+YXZjdHgtPmh3YWNjZWwpIHsKLSAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChoLT5hdmN0eCk7Ci0KLSAgICAgICAgaWYgKGgtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpCi0gICAgICAgICAgICBoLT5zZXR1cF9maW5pc2hlZCA9IDE7Ci0gICAgfQotfQotCi1pbnQgZmZfcHJlZF93ZWlnaHRfdGFibGUoSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsKQotewotICAgIGludCBsaXN0LCBpOwotICAgIGludCBsdW1hX2RlZiwgY2hyb21hX2RlZjsKLQotICAgIHNsLT51c2Vfd2VpZ2h0ICAgICAgICAgICAgID0gMDsKLSAgICBzbC0+dXNlX3dlaWdodF9jaHJvbWEgICAgICA9IDA7Ci0gICAgc2wtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gPSBnZXRfdWVfZ29sb21iKCZzbC0+Z2IpOwotICAgIGlmIChoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpCi0gICAgICAgIHNsLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gPSBnZXRfdWVfZ29sb21iKCZzbC0+Z2IpOwotCi0gICAgaWYgKHNsLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tID4gN1UpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJsdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tICVkIGlzIG91dCBvZiByYW5nZVxuIiwgc2wtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20pOwotICAgICAgICBzbC0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbSA9IDA7Ci0gICAgfQotICAgIGlmIChzbC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tID4gN1UpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCBzbC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKLSAgICAgICAgc2wtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSA9IDA7Ci0gICAgfQotCi0gICAgbHVtYV9kZWYgICA9IDEgPDwgc2wtPmx1bWFfbG9nMl93ZWlnaHRfZGVub207Ci0gICAgY2hyb21hX2RlZiA9IDEgPDwgc2wtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKLQotICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCAyOyBsaXN0KyspIHsKLSAgICAgICAgc2wtPmx1bWFfd2VpZ2h0X2ZsYWdbbGlzdF0gICA9IDA7Ci0gICAgICAgIHNsLT5jaHJvbWFfd2VpZ2h0X2ZsYWdbbGlzdF0gPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2wtPnJlZl9jb3VudFtsaXN0XTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgbHVtYV93ZWlnaHRfZmxhZywgY2hyb21hX3dlaWdodF9mbGFnOwotCi0gICAgICAgICAgICBsdW1hX3dlaWdodF9mbGFnID0gZ2V0X2JpdHMxKCZzbC0+Z2IpOwotICAgICAgICAgICAgaWYgKGx1bWFfd2VpZ2h0X2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBzbC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMF0gPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOwotICAgICAgICAgICAgICAgIHNsLT5sdW1hX3dlaWdodFtpXVtsaXN0XVsxXSA9IGdldF9zZV9nb2xvbWIoJnNsLT5nYik7Ci0gICAgICAgICAgICAgICAgaWYgKHNsLT5sdW1hX3dlaWdodFtpXVtsaXN0XVswXSAhPSBsdW1hX2RlZiB8fAotICAgICAgICAgICAgICAgICAgICBzbC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMV0gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBzbC0+dXNlX3dlaWdodCAgICAgICAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHNsLT5sdW1hX3dlaWdodF9mbGFnW2xpc3RdID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNsLT5sdW1hX3dlaWdodFtpXVtsaXN0XVswXSA9IGx1bWFfZGVmOwotICAgICAgICAgICAgICAgIHNsLT5sdW1hX3dlaWdodFtpXVtsaXN0XVsxXSA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpIHsKLSAgICAgICAgICAgICAgICBjaHJvbWFfd2VpZ2h0X2ZsYWcgPSBnZXRfYml0czEoJnNsLT5nYik7Ci0gICAgICAgICAgICAgICAgaWYgKGNocm9tYV93ZWlnaHRfZmxhZykgewotICAgICAgICAgICAgICAgICAgICBpbnQgajsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMF0gPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMV0gPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzBdICE9IGNocm9tYV9kZWYgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVsxXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnVzZV93ZWlnaHRfY2hyb21hICAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRfZmxhZ1tsaXN0XSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpbnQgajsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMF0gPSBjaHJvbWFfZGVmOwotICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMV0gPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0IpCi0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgc2wtPnVzZV93ZWlnaHQgPSBzbC0+dXNlX3dlaWdodCB8fCBzbC0+dXNlX3dlaWdodF9jaHJvbWE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaW5zdGFudGFuZW91cyBkZWNvZGVyIHJlZnJlc2guCi0gKi8KLXN0YXRpYyB2b2lkIGlkcihIMjY0Q29udGV4dCAqaCkKLXsKLSAgICBpbnQgaTsKLSAgICBmZl9oMjY0X3JlbW92ZV9hbGxfcmVmcyhoKTsKLSAgICBoLT5wcmV2X2ZyYW1lX251bSAgICAgICAgPQotICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCA9IDA7Ci0gICAgaC0+cHJldl9wb2NfbXNiICAgICAgICAgID0gMTw8MTY7Ci0gICAgaC0+cHJldl9wb2NfbHNiICAgICAgICAgID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RFTEFZRURfUElDX0NPVU5UOyBpKyspCi0gICAgICAgIGgtPmxhc3RfcG9jc1tpXSA9IElOVF9NSU47Ci19Ci0KLS8qIGZvcmdldCBvbGQgcGljcyBhZnRlciBhIHNlZWsgKi8KLXZvaWQgZmZfaDI2NF9mbHVzaF9jaGFuZ2UoSDI2NENvbnRleHQgKmgpCi17Ci0gICAgaW50IGksIGo7Ci0KLSAgICBoLT5uZXh0X291dHB1dGVkX3BvYyA9IElOVF9NSU47Ci0gICAgaC0+cHJldl9pbnRlcmxhY2VkX2ZyYW1lID0gMTsKLSAgICBpZHIoaCk7Ci0KLSAgICBoLT5wcmV2X2ZyYW1lX251bSA9IC0xOwotICAgIGlmIChoLT5jdXJfcGljX3B0cikgewotICAgICAgICBoLT5jdXJfcGljX3B0ci0+cmVmZXJlbmNlID0gMDsKLSAgICAgICAgZm9yIChqPWk9MDsgaC0+ZGVsYXllZF9waWNbaV07IGkrKykKLSAgICAgICAgICAgIGlmIChoLT5kZWxheWVkX3BpY1tpXSAhPSBoLT5jdXJfcGljX3B0cikKLSAgICAgICAgICAgICAgICBoLT5kZWxheWVkX3BpY1tqKytdID0gaC0+ZGVsYXllZF9waWNbaV07Ci0gICAgICAgIGgtPmRlbGF5ZWRfcGljW2pdID0gTlVMTDsKLSAgICB9Ci0gICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5sYXN0X3BpY19mb3JfZWMpOwotCi0gICAgaC0+Zmlyc3RfZmllbGQgPSAwOwotICAgIGZmX2gyNjRfcmVzZXRfc2VpKGgpOwotICAgIGgtPnJlY292ZXJ5X2ZyYW1lID0gLTE7Ci0gICAgaC0+ZnJhbWVfcmVjb3ZlcmVkID0gMDsKLSAgICBoLT5jdXJyZW50X3NsaWNlID0gMDsKLSAgICBoLT5tbWNvX3Jlc2V0ID0gMTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaC0+bmJfc2xpY2VfY3R4OyBpKyspCi0gICAgICAgIGgtPnNsaWNlX2N0eFtpXS5saXN0X2NvdW50ID0gMDsKLX0KLQotLyogZm9yZ2V0IG9sZCBwaWNzIGFmdGVyIGEgc2VlayAqLwotc3RhdGljIHZvaWQgZmx1c2hfZHBiKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IGk7Ci0KLSAgICBtZW1zZXQoaC0+ZGVsYXllZF9waWMsIDAsIHNpemVvZihoLT5kZWxheWVkX3BpYykpOwotCi0gICAgZmZfaDI2NF9mbHVzaF9jaGFuZ2UoaCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUElDVFVSRV9DT1VOVDsgaSsrKQotICAgICAgICBmZl9oMjY0X3VucmVmX3BpY3R1cmUoaCwgJmgtPkRQQltpXSk7Ci0gICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOwotICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+Y3VyX3BpYyk7Ci0KLSAgICBoLT5tYl95ID0gMDsKLQotICAgIGZmX2gyNjRfZnJlZV90YWJsZXMoaCk7Ci0gICAgaC0+Y29udGV4dF9pbml0aWFsaXplZCA9IDA7Ci19Ci0KLWludCBmZl9pbml0X3BvYyhIMjY0Q29udGV4dCAqaCwgaW50IHBpY19maWVsZF9wb2NbMl0sIGludCAqcGljX3BvYykKLXsKLSAgICBjb25zdCBpbnQgbWF4X2ZyYW1lX251bSA9IDEgPDwgaC0+c3BzLmxvZzJfbWF4X2ZyYW1lX251bTsKLSAgICBpbnQgZmllbGRfcG9jWzJdOwotCi0gICAgaC0+ZnJhbWVfbnVtX29mZnNldCA9IGgtPnByZXZfZnJhbWVfbnVtX29mZnNldDsKLSAgICBpZiAoaC0+ZnJhbWVfbnVtIDwgaC0+cHJldl9mcmFtZV9udW0pCi0gICAgICAgIGgtPmZyYW1lX251bV9vZmZzZXQgKz0gbWF4X2ZyYW1lX251bTsKLQotICAgIGlmIChoLT5zcHMucG9jX3R5cGUgPT0gMCkgewotICAgICAgICBjb25zdCBpbnQgbWF4X3BvY19sc2IgPSAxIDw8IGgtPnNwcy5sb2cyX21heF9wb2NfbHNiOwotCi0gICAgICAgIGlmIChoLT5wb2NfbHNiIDwgaC0+cHJldl9wb2NfbHNiICYmCi0gICAgICAgICAgICBoLT5wcmV2X3BvY19sc2IgLSBoLT5wb2NfbHNiID49IG1heF9wb2NfbHNiIC8gMikKLSAgICAgICAgICAgIGgtPnBvY19tc2IgPSBoLT5wcmV2X3BvY19tc2IgKyBtYXhfcG9jX2xzYjsKLSAgICAgICAgZWxzZSBpZiAoaC0+cG9jX2xzYiA+IGgtPnByZXZfcG9jX2xzYiAmJgotICAgICAgICAgICAgICAgICBoLT5wcmV2X3BvY19sc2IgLSBoLT5wb2NfbHNiIDwgLW1heF9wb2NfbHNiIC8gMikKLSAgICAgICAgICAgIGgtPnBvY19tc2IgPSBoLT5wcmV2X3BvY19tc2IgLSBtYXhfcG9jX2xzYjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaC0+cG9jX21zYiA9IGgtPnByZXZfcG9jX21zYjsKLSAgICAgICAgZmllbGRfcG9jWzBdID0KLSAgICAgICAgZmllbGRfcG9jWzFdID0gaC0+cG9jX21zYiArIGgtPnBvY19sc2I7Ci0gICAgICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKQotICAgICAgICAgICAgZmllbGRfcG9jWzFdICs9IGgtPmRlbHRhX3BvY19ib3R0b207Ci0gICAgfSBlbHNlIGlmIChoLT5zcHMucG9jX3R5cGUgPT0gMSkgewotICAgICAgICBpbnQgYWJzX2ZyYW1lX251bSwgZXhwZWN0ZWRfZGVsdGFfcGVyX3BvY19jeWNsZSwgZXhwZWN0ZWRwb2M7Ci0gICAgICAgIGludCBpOwotCi0gICAgICAgIGlmIChoLT5zcHMucG9jX2N5Y2xlX2xlbmd0aCAhPSAwKQotICAgICAgICAgICAgYWJzX2ZyYW1lX251bSA9IGgtPmZyYW1lX251bV9vZmZzZXQgKyBoLT5mcmFtZV9udW07Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGFic19mcmFtZV9udW0gPSAwOwotCi0gICAgICAgIGlmIChoLT5uYWxfcmVmX2lkYyA9PSAwICYmIGFic19mcmFtZV9udW0gPiAwKQotICAgICAgICAgICAgYWJzX2ZyYW1lX251bS0tOwotCi0gICAgICAgIGV4cGVjdGVkX2RlbHRhX3Blcl9wb2NfY3ljbGUgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+c3BzLnBvY19jeWNsZV9sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIC8vIEZJWE1FIGludGVncmF0ZSBkdXJpbmcgc3BzIHBhcnNlCi0gICAgICAgICAgICBleHBlY3RlZF9kZWx0YV9wZXJfcG9jX2N5Y2xlICs9IGgtPnNwcy5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXTsKLQotICAgICAgICBpZiAoYWJzX2ZyYW1lX251bSA+IDApIHsKLSAgICAgICAgICAgIGludCBwb2NfY3ljbGVfY250ICAgICAgICAgID0gKGFic19mcmFtZV9udW0gLSAxKSAvIGgtPnNwcy5wb2NfY3ljbGVfbGVuZ3RoOwotICAgICAgICAgICAgaW50IGZyYW1lX251bV9pbl9wb2NfY3ljbGUgPSAoYWJzX2ZyYW1lX251bSAtIDEpICUgaC0+c3BzLnBvY19jeWNsZV9sZW5ndGg7Ci0KLSAgICAgICAgICAgIGV4cGVjdGVkcG9jID0gcG9jX2N5Y2xlX2NudCAqIGV4cGVjdGVkX2RlbHRhX3Blcl9wb2NfY3ljbGU7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGZyYW1lX251bV9pbl9wb2NfY3ljbGU7IGkrKykKLSAgICAgICAgICAgICAgICBleHBlY3RlZHBvYyA9IGV4cGVjdGVkcG9jICsgaC0+c3BzLm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGV4cGVjdGVkcG9jID0gMDsKLQotICAgICAgICBpZiAoaC0+bmFsX3JlZl9pZGMgPT0gMCkKLSAgICAgICAgICAgIGV4cGVjdGVkcG9jID0gZXhwZWN0ZWRwb2MgKyBoLT5zcHMub2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKLQotICAgICAgICBmaWVsZF9wb2NbMF0gPSBleHBlY3RlZHBvYyArIGgtPmRlbHRhX3BvY1swXTsKLSAgICAgICAgZmllbGRfcG9jWzFdID0gZmllbGRfcG9jWzBdICsgaC0+c3BzLm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZDsKLQotICAgICAgICBpZiAoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkKLSAgICAgICAgICAgIGZpZWxkX3BvY1sxXSArPSBoLT5kZWx0YV9wb2NbMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHBvYyA9IDIgKiAoaC0+ZnJhbWVfbnVtX29mZnNldCArIGgtPmZyYW1lX251bSk7Ci0KLSAgICAgICAgaWYgKCFoLT5uYWxfcmVmX2lkYykKLSAgICAgICAgICAgIHBvYy0tOwotCi0gICAgICAgIGZpZWxkX3BvY1swXSA9IHBvYzsKLSAgICAgICAgZmllbGRfcG9jWzFdID0gcG9jOwotICAgIH0KLQotICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0JPVFRPTV9GSUVMRCkKLSAgICAgICAgcGljX2ZpZWxkX3BvY1swXSA9IGZpZWxkX3BvY1swXTsKLSAgICBpZiAoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9UT1BfRklFTEQpCi0gICAgICAgIHBpY19maWVsZF9wb2NbMV0gPSBmaWVsZF9wb2NbMV07Ci0gICAgKnBpY19wb2MgPSBGRk1JTihwaWNfZmllbGRfcG9jWzBdLCBwaWNfZmllbGRfcG9jWzFdKTsKLQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqIENvbXB1dGUgcHJvZmlsZSBmcm9tIHByb2ZpbGVfaWRjIGFuZCBjb25zdHJhaW50X3NldD9fZmxhZ3MuCi0gKgotICogQHBhcmFtIHNwcyBTUFMKLSAqCi0gKiBAcmV0dXJuIHByb2ZpbGUgYXMgZGVmaW5lZCBieSBGRl9QUk9GSUxFX0gyNjRfKgotICovCi1pbnQgZmZfaDI2NF9nZXRfcHJvZmlsZShTUFMgKnNwcykKLXsKLSAgICBpbnQgcHJvZmlsZSA9IHNwcy0+cHJvZmlsZV9pZGM7Ci0KLSAgICBzd2l0Y2ggKHNwcy0+cHJvZmlsZV9pZGMpIHsKLSAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9CQVNFTElORToKLSAgICAgICAgLy8gY29uc3RyYWludF9zZXQxX2ZsYWcgc2V0IHRvIDEKLSAgICAgICAgcHJvZmlsZSB8PSAoc3BzLT5jb25zdHJhaW50X3NldF9mbGFncyAmIDEgPDwgMSkgPyBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORUQgOiAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzEwOgotICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyOgotICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X1BSRURJQ1RJVkU6Ci0gICAgICAgIC8vIGNvbnN0cmFpbnRfc2V0M19mbGFnIHNldCB0byAxCi0gICAgICAgIHByb2ZpbGUgfD0gKHNwcy0+Y29uc3RyYWludF9zZXRfZmxhZ3MgJiAxIDw8IDMpID8gRkZfUFJPRklMRV9IMjY0X0lOVFJBIDogMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHByb2ZpbGU7Ci19Ci0KLWludCBmZl9zZXRfcmVmX2NvdW50KEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCkKLXsKLSAgICBpbnQgcmVmX2NvdW50WzJdLCBsaXN0X2NvdW50OwotICAgIGludCBudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZzsKLQotICAgIC8vIHNldCBkZWZhdWx0cywgbWlnaHQgYmUgb3ZlcnJpZGRlbiBhIGZldyBsaW5lcyBsYXRlcgotICAgIHJlZl9jb3VudFswXSA9IGgtPnBwcy5yZWZfY291bnRbMF07Ci0gICAgcmVmX2NvdW50WzFdID0gaC0+cHBzLnJlZl9jb3VudFsxXTsKLQotICAgIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKLSAgICAgICAgdW5zaWduZWQgbWF4WzJdOwotICAgICAgICBtYXhbMF0gPSBtYXhbMV0gPSBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FID8gMTUgOiAzMTsKLQotICAgICAgICBpZiAoc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKQotICAgICAgICAgICAgc2wtPmRpcmVjdF9zcGF0aWFsX212X3ByZWQgPSBnZXRfYml0czEoJnNsLT5nYik7Ci0gICAgICAgIG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnID0gZ2V0X2JpdHMxKCZzbC0+Z2IpOwotCi0gICAgICAgIGlmIChudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZykgewotICAgICAgICAgICAgcmVmX2NvdW50WzBdID0gZ2V0X3VlX2dvbG9tYigmc2wtPmdiKSArIDE7Ci0gICAgICAgICAgICBpZiAoc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7Ci0gICAgICAgICAgICAgICAgcmVmX2NvdW50WzFdID0gZ2V0X3VlX2dvbG9tYigmc2wtPmdiKSArIDE7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAvLyBmdWxsIHJhbmdlIGlzIHNwZWMtb2sgaW4gdGhpcyBjYXNlLCBldmVuIGZvciBmcmFtZXMKLSAgICAgICAgICAgICAgICByZWZfY291bnRbMV0gPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHJlZl9jb3VudFswXS0xID4gbWF4WzBdIHx8IHJlZl9jb3VudFsxXS0xID4gbWF4WzFdKXsKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicmVmZXJlbmNlIG92ZXJmbG93ICV1ID4gJXUgb3IgJXUgPiAldVxuIiwgcmVmX2NvdW50WzBdLTEsIG1heFswXSwgcmVmX2NvdW50WzFdLTEsIG1heFsxXSk7Ci0gICAgICAgICAgICBzbC0+cmVmX2NvdW50WzBdID0gc2wtPnJlZl9jb3VudFsxXSA9IDA7Ci0gICAgICAgICAgICBzbC0+bGlzdF9jb3VudCAgID0gMDsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNsLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikKLSAgICAgICAgICAgIGxpc3RfY291bnQgPSAyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsaXN0X2NvdW50ID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBsaXN0X2NvdW50ICAgPSAwOwotICAgICAgICByZWZfY291bnRbMF0gPSByZWZfY291bnRbMV0gPSAwOwotICAgIH0KLQotICAgIGlmIChsaXN0X2NvdW50ICAgIT0gc2wtPmxpc3RfY291bnQgICB8fAotICAgICAgICByZWZfY291bnRbMF0gIT0gc2wtPnJlZl9jb3VudFswXSB8fAotICAgICAgICByZWZfY291bnRbMV0gIT0gc2wtPnJlZl9jb3VudFsxXSkgewotICAgICAgICBzbC0+cmVmX2NvdW50WzBdID0gcmVmX2NvdW50WzBdOwotICAgICAgICBzbC0+cmVmX2NvdW50WzFdID0gcmVmX2NvdW50WzFdOwotICAgICAgICBzbC0+bGlzdF9jb3VudCAgID0gbGlzdF9jb3VudDsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHN0YXJ0X2NvZGVbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMSB9OwotCi1zdGF0aWMgaW50IGdldF9iaXRfbGVuZ3RoKEgyNjRDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciwgaW50IGRzdF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbmV4dF9hdmMpCi17Ci0gICAgaWYgKChoLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfQVVUT0RFVEVDVCkgJiYgaSArIDMgPCBuZXh0X2F2YyAmJgotICAgICAgICBidWZbaV0gICAgID09IDB4MDAgJiYgYnVmW2kgKyAxXSA9PSAweDAwICYmCi0gICAgICAgIGJ1ZltpICsgMl0gPT0gMHgwMSAmJiBidWZbaSArIDNdID09IDB4RTApCi0gICAgICAgIGgtPndvcmthcm91bmRfYnVncyB8PSBGRl9CVUdfVFJVTkNBVEVEOwotCi0gICAgaWYgKCEoaC0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX1RSVU5DQVRFRCkpCi0gICAgICAgIHdoaWxlIChkc3RfbGVuZ3RoID4gMCAmJiBwdHJbZHN0X2xlbmd0aCAtIDFdID09IDApCi0gICAgICAgICAgICBkc3RfbGVuZ3RoLS07Ci0KLSAgICBpZiAoIWRzdF9sZW5ndGgpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIDggKiBkc3RfbGVuZ3RoIC0gZGVjb2RlX3Jic3BfdHJhaWxpbmcoaCwgcHRyICsgZHN0X2xlbmd0aCAtIDEpOwotfQotCi1zdGF0aWMgaW50IGdldF9sYXN0X25lZWRlZF9uYWwoSDI2NENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQotewotICAgIGludCBuZXh0X2F2YyAgICA9IGgtPmlzX2F2YyA/IDAgOiBidWZfc2l6ZTsKLSAgICBpbnQgbmFsX2luZGV4ICAgPSAwOwotICAgIGludCBidWZfaW5kZXggICA9IDA7Ci0gICAgaW50IG5hbHNfbmVlZGVkID0gMDsKLSAgICBpbnQgZmlyc3Rfc2xpY2UgPSAwOwotCi0gICAgd2hpbGUoMSkgewotICAgICAgICBHZXRCaXRDb250ZXh0IGdiOwotICAgICAgICBpbnQgbmFsc2l6ZSA9IDA7Ci0gICAgICAgIGludCBkc3RfbGVuZ3RoLCBiaXRfbGVuZ3RoLCBjb25zdW1lZDsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcHRyOwotCi0gICAgICAgIGlmIChidWZfaW5kZXggPj0gbmV4dF9hdmMpIHsKLSAgICAgICAgICAgIG5hbHNpemUgPSBnZXRfYXZjX25hbHNpemUoaCwgYnVmLCBidWZfc2l6ZSwgJmJ1Zl9pbmRleCk7Ci0gICAgICAgICAgICBpZiAobmFsc2l6ZSA8IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBuZXh0X2F2YyA9IGJ1Zl9pbmRleCArIG5hbHNpemU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZfaW5kZXggPSBmaW5kX3N0YXJ0X2NvZGUoYnVmLCBidWZfc2l6ZSwgYnVmX2luZGV4LCBuZXh0X2F2Yyk7Ci0gICAgICAgICAgICBpZiAoYnVmX2luZGV4ID49IGJ1Zl9zaXplKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKGJ1Zl9pbmRleCA+PSBuZXh0X2F2YykKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB0ciA9IGZmX2gyNjRfZGVjb2RlX25hbChoLCAmaC0+c2xpY2VfY3R4WzBdLCBidWYgKyBidWZfaW5kZXgsICZkc3RfbGVuZ3RoLCAmY29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2F2YyAtIGJ1Zl9pbmRleCk7Ci0KLSAgICAgICAgaWYgKCFwdHIgfHwgZHN0X2xlbmd0aCA8IDApCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLQotICAgICAgICBidWZfaW5kZXggKz0gY29uc3VtZWQ7Ci0KLSAgICAgICAgYml0X2xlbmd0aCA9IGdldF9iaXRfbGVuZ3RoKGgsIGJ1ZiwgcHRyLCBkc3RfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX2luZGV4LCBuZXh0X2F2Yyk7Ci0gICAgICAgIG5hbF9pbmRleCsrOwotCi0gICAgICAgIC8qIHBhY2tldHMgY2FuIHNvbWV0aW1lcyBjb250YWluIG11bHRpcGxlIFBQUy9TUFMsCi0gICAgICAgICAqIGUuZy4gdHdvIFBBRkYgZmllbGQgcGljdHVyZXMgaW4gb25lIHBhY2tldCwgb3IgYSBkZW11eGVyCi0gICAgICAgICAqIHdoaWNoIHNwbGl0cyBOQUxzIHN0cmFuZ2VseSBpZiBzbywgd2hlbiBmcmFtZSB0aHJlYWRpbmcgd2UKLSAgICAgICAgICogY2FuJ3Qgc3RhcnQgdGhlIG5leHQgdGhyZWFkIHVudGlsIHdlJ3ZlIHJlYWQgYWxsIG9mIHRoZW0gKi8KLSAgICAgICAgc3dpdGNoIChoLT5uYWxfdW5pdF90eXBlKSB7Ci0gICAgICAgIGNhc2UgTkFMX1NQUzoKLSAgICAgICAgY2FzZSBOQUxfUFBTOgotICAgICAgICAgICAgbmFsc19uZWVkZWQgPSBuYWxfaW5kZXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOQUxfRFBBOgotICAgICAgICBjYXNlIE5BTF9JRFJfU0xJQ0U6Ci0gICAgICAgIGNhc2UgTkFMX1NMSUNFOgotICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIHB0ciwgYml0X2xlbmd0aCk7Ci0gICAgICAgICAgICBpZiAoIWdldF91ZV9nb2xvbWJfbG9uZygmZ2IpIHx8ICAvLyBmaXJzdF9tYl9pbl9zbGljZQotICAgICAgICAgICAgICAgICFmaXJzdF9zbGljZSB8fAotICAgICAgICAgICAgICAgIGZpcnN0X3NsaWNlICE9IGgtPm5hbF91bml0X3R5cGUpCi0gICAgICAgICAgICAgICAgbmFsc19uZWVkZWQgPSBuYWxfaW5kZXg7Ci0gICAgICAgICAgICBpZiAoIWZpcnN0X3NsaWNlKQotICAgICAgICAgICAgICAgIGZpcnN0X3NsaWNlID0gaC0+bmFsX3VuaXRfdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuYWxzX25lZWRlZDsKLX0KLQotc3RhdGljIGludCBkZWNvZGVfbmFsX3VuaXRzKEgyNjRDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyc2VfZXh0cmFkYXRhKQotewotICAgIEFWQ29kZWNDb250ZXh0ICpjb25zdCBhdmN0eCA9IGgtPmF2Y3R4OwotICAgIEgyNjRTbGljZUNvbnRleHQgKnNsOwotICAgIGludCBidWZfaW5kZXg7Ci0gICAgdW5zaWduZWQgY29udGV4dF9jb3VudDsKLSAgICBpbnQgbmV4dF9hdmM7Ci0gICAgaW50IG5hbHNfbmVlZGVkID0gMDsgLy8vPCBudW1iZXIgb2YgTkFMcyB0aGF0IG5lZWQgZGVjb2RpbmcgYmVmb3JlIHRoZSBuZXh0IGZyYW1lIHRocmVhZCBzdGFydHMKLSAgICBpbnQgbmFsX2luZGV4OwotICAgIGludCBpZHJfY2xlYXJlZD0wOwotICAgIGludCByZXQgPSAwOwotCi0gICAgaC0+bmFsX3VuaXRfdHlwZT0gMDsKLQotICAgIGlmKCFoLT5zbGljZV9jb250ZXh0X2NvdW50KQotICAgICAgICAgaC0+c2xpY2VfY29udGV4dF9jb3VudD0gMTsKLSAgICBoLT5tYXhfY29udGV4dHMgPSBoLT5zbGljZV9jb250ZXh0X2NvdW50OwotICAgIGlmICghKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9DSFVOS1MpKSB7Ci0gICAgICAgIGgtPmN1cnJlbnRfc2xpY2UgPSAwOwotICAgICAgICBpZiAoIWgtPmZpcnN0X2ZpZWxkKQotICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOwotICAgICAgICBmZl9oMjY0X3Jlc2V0X3NlaShoKTsKLSAgICB9Ci0KLSAgICBpZiAoaC0+bmFsX2xlbmd0aF9zaXplID09IDQpIHsKLSAgICAgICAgaWYgKGJ1Zl9zaXplID4gOCAmJiBBVl9SQjMyKGJ1ZikgPT0gMSAmJiBBVl9SQjMyKGJ1Zis1KSA+ICh1bnNpZ25lZClidWZfc2l6ZSkgewotICAgICAgICAgICAgaC0+aXNfYXZjID0gMDsKLSAgICAgICAgfWVsc2UgaWYoYnVmX3NpemUgPiAzICYmIEFWX1JCMzIoYnVmKSA+IDEgJiYgQVZfUkIzMihidWYpIDw9ICh1bnNpZ25lZClidWZfc2l6ZSkKLSAgICAgICAgICAgIGgtPmlzX2F2YyA9IDE7Ci0gICAgfQotCi0gICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpCi0gICAgICAgIG5hbHNfbmVlZGVkID0gZ2V0X2xhc3RfbmVlZGVkX25hbChoLCBidWYsIGJ1Zl9zaXplKTsKLQotICAgIHsKLSAgICAgICAgYnVmX2luZGV4ICAgICA9IDA7Ci0gICAgICAgIGNvbnRleHRfY291bnQgPSAwOwotICAgICAgICBuZXh0X2F2YyAgICAgID0gaC0+aXNfYXZjID8gMCA6IGJ1Zl9zaXplOwotICAgICAgICBuYWxfaW5kZXggICAgID0gMDsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgaW50IGNvbnN1bWVkOwotICAgICAgICAgICAgaW50IGRzdF9sZW5ndGg7Ci0gICAgICAgICAgICBpbnQgYml0X2xlbmd0aDsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0cjsKLSAgICAgICAgICAgIGludCBuYWxzaXplID0gMDsKLSAgICAgICAgICAgIGludCBlcnI7Ci0KLSAgICAgICAgICAgIGlmIChidWZfaW5kZXggPj0gbmV4dF9hdmMpIHsKLSAgICAgICAgICAgICAgICBuYWxzaXplID0gZ2V0X2F2Y19uYWxzaXplKGgsIGJ1ZiwgYnVmX3NpemUsICZidWZfaW5kZXgpOwotICAgICAgICAgICAgICAgIGlmIChuYWxzaXplIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgbmV4dF9hdmMgPSBidWZfaW5kZXggKyBuYWxzaXplOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZfaW5kZXggPSBmaW5kX3N0YXJ0X2NvZGUoYnVmLCBidWZfc2l6ZSwgYnVmX2luZGV4LCBuZXh0X2F2Yyk7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1Zl9pbmRleCA+PSBidWZfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKGJ1Zl9pbmRleCA+PSBuZXh0X2F2YykKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNsID0gJmgtPnNsaWNlX2N0eFtjb250ZXh0X2NvdW50XTsKLQotICAgICAgICAgICAgcHRyID0gZmZfaDI2NF9kZWNvZGVfbmFsKGgsIHNsLCBidWYgKyBidWZfaW5kZXgsICZkc3RfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25zdW1lZCwgbmV4dF9hdmMgLSBidWZfaW5kZXgpOwotICAgICAgICAgICAgaWYgKCFwdHIgfHwgZHN0X2xlbmd0aCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYml0X2xlbmd0aCA9IGdldF9iaXRfbGVuZ3RoKGgsIGJ1ZiwgcHRyLCBkc3RfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9pbmRleCArIGNvbnN1bWVkLCBuZXh0X2F2Yyk7Ci0KLSAgICAgICAgICAgIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19TVEFSVENPREUpCi0gICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgICAgICJOQUwgJWQvJWQgYXQgJWQvJWQgbGVuZ3RoICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlLCBoLT5uYWxfcmVmX2lkYywgYnVmX2luZGV4LCBidWZfc2l6ZSwgZHN0X2xlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChoLT5pc19hdmMgJiYgKG5hbHNpemUgIT0gY29uc3VtZWQpICYmIG5hbHNpemUpCi0gICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgICAgICJBVkM6IENvbnN1bWVkIG9ubHkgJWQgYnl0ZXMgaW5zdGVhZCBvZiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWQsIG5hbHNpemUpOwotCi0gICAgICAgICAgICBidWZfaW5kZXggKz0gY29uc3VtZWQ7Ci0gICAgICAgICAgICBuYWxfaW5kZXgrKzsKLQotICAgICAgICAgICAgaWYgKGF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05SRUYgJiYKLSAgICAgICAgICAgICAgICBoLT5uYWxfcmVmX2lkYyA9PSAwICYmCi0gICAgICAgICAgICAgICAgaC0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfU0VJKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi1hZ2FpbjoKLSAgICAgICAgICAgIC8qIElnbm9yZSBwZXIgZnJhbWUgTkFMIHVuaXQgdHlwZSBkdXJpbmcgZXh0cmFkYXRhCi0gICAgICAgICAgICAgKiBwYXJzaW5nLiBEZWNvZGluZyBzbGljZXMgaXMgbm90IHBvc3NpYmxlIGluIGNvZGVjIGluaXQKLSAgICAgICAgICAgICAqIHdpdGggZnJhbWUtbXQgKi8KLSAgICAgICAgICAgIGlmIChwYXJzZV9leHRyYWRhdGEpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGgtPm5hbF91bml0X3R5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE5BTF9JRFJfU0xJQ0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBOQUxfU0xJQ0U6Ci0gICAgICAgICAgICAgICAgY2FzZSBOQUxfRFBBOgotICAgICAgICAgICAgICAgIGNhc2UgTkFMX0RQQjoKLSAgICAgICAgICAgICAgICBjYXNlIE5BTF9EUEM6Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgTkFMICVkIGluIGdsb2JhbCBoZWFkZXIvZXh0cmFkYXRhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bmFsX3VuaXRfdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBuZXh0IGNhc2UKLSAgICAgICAgICAgICAgICBjYXNlIE5BTF9BVVhJTElBUllfU0xJQ0U6Ci0gICAgICAgICAgICAgICAgICAgIGgtPm5hbF91bml0X3R5cGUgPSBOQUxfRkZfSUdOT1JFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZXJyID0gMDsKLQotICAgICAgICAgICAgc3dpdGNoIChoLT5uYWxfdW5pdF90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIE5BTF9JRFJfU0xJQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKChwdHJbMF0gJiAweEZDKSA9PSAweDk4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBpbnRlciBJRFIgZnJhbWVcbiIpOwotICAgICAgICAgICAgICAgICAgICBoLT5uZXh0X291dHB1dGVkX3BvYyA9IElOVF9NSU47Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGgtPm5hbF91bml0X3R5cGUgIT0gTkFMX0lEUl9TTElDRSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG1peCBvZiBpZHIgYW5kIG5vbi1pZHIgc2xpY2VzXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZighaWRyX2NsZWFyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGgtPmN1cnJlbnRfc2xpY2UgJiYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBtaXhlZCBJRFIgLyBub24gSURSIGZyYW1lcyBjYW5ub3QgYmUgZGVjb2RlZCBpbiBzbGljZSBtdWx0aXRocmVhZGluZyBtb2RlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZHIoaCk7IC8vIEZJWE1FIGVuc3VyZSB3ZSBkb24ndCBsb3NlIHNvbWUgZnJhbWVzIGlmIHRoZXJlIGlzIHJlb3JkZXJpbmcKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWRyX2NsZWFyZWQgPSAxOwotICAgICAgICAgICAgICAgIGgtPmhhc19yZWNvdmVyeV9wb2ludCA9IDE7Ci0gICAgICAgICAgICBjYXNlIE5BTF9TTElDRToKLSAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZzbC0+Z2IsIHB0ciwgYml0X2xlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoICAgbmFsc19uZWVkZWQgPj0gbmFsX2luZGV4Ci0gICAgICAgICAgICAgICAgICAgIHx8ICghKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpICYmICFjb250ZXh0X2NvdW50KSkKLSAgICAgICAgICAgICAgICAgICAgaC0+YXVfcHBzX2lkID0gLTE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGVyciA9IGZmX2gyNjRfZGVjb2RlX3NsaWNlX2hlYWRlcihoLCBzbCkpKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGlmIChoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGgtPmZyYW1lX251bSAhPSBoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250IHx8IHNsLT5zbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfSSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGgtPnZhbGlkX3JlY292ZXJ5X3BvaW50ID0gMTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoICAgaC0+cmVjb3ZlcnlfZnJhbWUgPCAwCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBhdl9tb2RfdWludHAyKGgtPnJlY292ZXJ5X2ZyYW1lIC0gaC0+ZnJhbWVfbnVtLCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtKSA+IGgtPnNlaV9yZWNvdmVyeV9mcmFtZV9jbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgtPnJlY292ZXJ5X2ZyYW1lID0gYXZfbW9kX3VpbnRwMihoLT5mcmFtZV9udW0gKyBoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250LCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoLT52YWxpZF9yZWNvdmVyeV9wb2ludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5yZWNvdmVyeV9mcmFtZSA9IGgtPmZyYW1lX251bTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGgtPmN1cl9waWNfcHRyLT5mLT5rZXlfZnJhbWUgfD0KLSAgICAgICAgICAgICAgICAgICAgKGgtPm5hbF91bml0X3R5cGUgPT0gTkFMX0lEUl9TTElDRSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaC0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfSURSX1NMSUNFIHx8Ci0gICAgICAgICAgICAgICAgICAgIGgtPnJlY292ZXJ5X2ZyYW1lID09IGgtPmZyYW1lX251bSkgewotICAgICAgICAgICAgICAgICAgICBoLT5yZWNvdmVyeV9mcmFtZSAgICAgICAgID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIGgtPmN1cl9waWNfcHRyLT5yZWNvdmVyZWQgPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIElEUiwgYWxsIGZyYW1lcyBhZnRlciBpdCBpbiBkZWNvZGVkIG9yZGVyIGFyZQotICAgICAgICAgICAgICAgIC8vICJyZWNvdmVyZWQiLgotICAgICAgICAgICAgICAgIGlmIChoLT5uYWxfdW5pdF90eXBlID09IE5BTF9JRFJfU0xJQ0UpCi0gICAgICAgICAgICAgICAgICAgIGgtPmZyYW1lX3JlY292ZXJlZCB8PSBGUkFNRV9SRUNPVkVSRURfSURSOwotI2lmIDEKLSAgICAgICAgICAgICAgICBoLT5jdXJfcGljX3B0ci0+cmVjb3ZlcmVkIHw9IGgtPmZyYW1lX3JlY292ZXJlZDsKLSNlbHNlCi0gICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPnJlY292ZXJlZCB8PSAhIShoLT5mcmFtZV9yZWNvdmVyZWQgJiBGUkFNRV9SRUNPVkVSRURfSURSKTsKLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYgKGgtPmN1cnJlbnRfc2xpY2UgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIShhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfQ0hVTktTKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9wb3N0aW5pdChoLCBuYWxfaW5kZXggPj0gbmFsc19uZWVkZWQpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChoLT5hdmN0eC0+aHdhY2NlbCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKHJldCA9IGgtPmF2Y3R4LT5od2FjY2VsLT5zdGFydF9mcmFtZShoLT5hdmN0eCwgYnVmLCBidWZfc2l6ZSkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICAgICAgICAgICAgICAgICAgaWYgKENPTkZJR19IMjY0X1ZEUEFVX0RFQ09ERVIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCi0gICAgICAgICAgICAgICAgICAgICAgICBmZl92ZHBhdV9oMjY0X3BpY3R1cmVfc3RhcnQoaCk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2wtPnJlZHVuZGFudF9waWNfY291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZbYnVmX2luZGV4IC0gY29uc3VtZWRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSNpZiBGRl9BUElfQ0FQX1ZEUEFVCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09ORklHX0gyNjRfVkRQQVVfREVDT0RFUiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZkcGF1X2FkZF9kYXRhX2NodW5rKGgtPmN1cl9waWNfcHRyLT5mLT5kYXRhWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRfY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGFydF9jb2RlKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmZl92ZHBhdV9hZGRfZGF0YV9jaHVuayhoLT5jdXJfcGljX3B0ci0+Zi0+ZGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZidWZbYnVmX2luZGV4IC0gY29uc3VtZWRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWQpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF9jb3VudCsrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTkFMX0RQQToKLSAgICAgICAgICAgIGNhc2UgTkFMX0RQQjoKLSAgICAgICAgICAgIGNhc2UgTkFMX0RQQzoKLSAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJkYXRhIHBhcnRpdGlvbmluZyIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOQUxfU0VJOgotICAgICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmgtPmdiLCBwdHIsIGJpdF9sZW5ndGgpOwotICAgICAgICAgICAgICAgIHJldCA9IGZmX2gyNjRfZGVjb2RlX3NlaShoKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCAmJiAoaC0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTkFMX1NQUzoKLSAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoLT5nYiwgcHRyLCBiaXRfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmZfaDI2NF9kZWNvZGVfc2VxX3BhcmFtZXRlcl9zZXQoaCwgMCkgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgaWYgKGgtPmlzX2F2YyA/IG5hbHNpemUgOiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNQUyBkZWNvZGluZyBmYWlsdXJlLCB0cnlpbmcgYWdhaW4gd2l0aCB0aGUgY29tcGxldGUgTkFMXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGgtPmlzX2F2YykKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAobmV4dF9hdmMgLSBidWZfaW5kZXggKyBjb25zdW1lZCA9PSBuYWxzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChuZXh0X2F2YyAtIGJ1Zl9pbmRleCArIGNvbnN1bWVkIC0gMSkgPj0gSU5UX01BWC84KQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmgtPmdiLCAmYnVmW2J1Zl9pbmRleCArIDEgLSBjb25zdW1lZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCoobmV4dF9hdmMgLSBidWZfaW5kZXggKyBjb25zdW1lZCAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2gyNjRfZGVjb2RlX3NlcV9wYXJhbWV0ZXJfc2V0KGgsIDApID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmaC0+Z2IsIHB0ciwgYml0X2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfc2VxX3BhcmFtZXRlcl9zZXQoaCwgMSk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTkFMX1BQUzoKLSAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZoLT5nYiwgcHRyLCBiaXRfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9waWN0dXJlX3BhcmFtZXRlcl9zZXQoaCwgYml0X2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5BTF9BVUQ6Ci0gICAgICAgICAgICBjYXNlIE5BTF9FTkRfU0VRVUVOQ0U6Ci0gICAgICAgICAgICBjYXNlIE5BTF9FTkRfU1RSRUFNOgotICAgICAgICAgICAgY2FzZSBOQUxfRklMTEVSX0RBVEE6Ci0gICAgICAgICAgICBjYXNlIE5BTF9TUFNfRVhUOgotICAgICAgICAgICAgY2FzZSBOQUxfQVVYSUxJQVJZX1NMSUNFOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOQUxfRkZfSUdOT1JFOgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlVua25vd24gTkFMIGNvZGU6ICVkICglZCBiaXRzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaC0+bmFsX3VuaXRfdHlwZSwgYml0X2xlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb250ZXh0X2NvdW50ID09IGgtPm1heF9jb250ZXh0cykgewotICAgICAgICAgICAgICAgIHJldCA9IGZmX2gyNjRfZXhlY3V0ZV9kZWNvZGVfc2xpY2VzKGgsIGNvbnRleHRfY291bnQpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIChoLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgICAgIGNvbnRleHRfY291bnQgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoZXJyIDwgMCB8fCBlcnIgPT0gU0xJQ0VfU0tJUEVEKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGVyciA8IDApCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlX3NsaWNlX2hlYWRlciBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgc2wtPnJlZl9jb3VudFswXSA9IHNsLT5yZWZfY291bnRbMV0gPSBzbC0+bGlzdF9jb3VudCA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBTTElDRV9TSU5HTEVUSFJFQUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dF9jb3VudCA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9leGVjdXRlX2RlY29kZV9zbGljZXMoaCwgY29udGV4dF9jb3VudCAtIDEpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCAmJiAoaC0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRleHRfY291bnQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBTbGljZSBjb3VsZCBub3QgYmUgZGVjb2RlZCBpbiBwYXJhbGxlbCBtb2RlLCByZXN0YXJ0LiBOb3RlCi0gICAgICAgICAgICAgICAgICogdGhhdCByYnNwX2J1ZmZlciBpcyBub3QgdHJhbnNmZXJyZWQsIGJ1dCBzaW5jZSB3ZSBubyBsb25nZXIKLSAgICAgICAgICAgICAgICAgKiBydW4gaW4gcGFyYWxsZWwgbW9kZSB0aGlzIHNob3VsZCBub3QgYmUgYW4gaXNzdWUuICovCi0gICAgICAgICAgICAgICAgc2wgICAgICAgICAgICAgICA9ICZoLT5zbGljZV9jdHhbMF07Ci0gICAgICAgICAgICAgICAgZ290byBhZ2FpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoY29udGV4dF9jb3VudCkgewotICAgICAgICByZXQgPSBmZl9oMjY0X2V4ZWN1dGVfZGVjb2RlX3NsaWNlcyhoLCBjb250ZXh0X2NvdW50KTsKLSAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgIH0KLQotICAgIHJldCA9IDA7Ci1lbmQ6Ci0gICAgLyogY2xlYW4gdXAgKi8KLSAgICBpZiAoaC0+Y3VyX3BpY19wdHIgJiYgIWgtPmRyb3BwYWJsZSkgewotICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpOwotICAgIH0KLQotICAgIHJldHVybiAocmV0IDwgMCkgPyByZXQgOiBidWZfaW5kZXg7Ci19Ci0KLS8qKgotICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZm9yIGJ1aWxkaW5nIHRoZSBjdXJyZW50IGZyYW1lLgotICovCi1zdGF0aWMgaW50IGdldF9jb25zdW1lZF9ieXRlcyhpbnQgcG9zLCBpbnQgYnVmX3NpemUpCi17Ci0gICAgaWYgKHBvcyA9PSAwKQotICAgICAgICBwb3MgPSAxOyAgICAgICAgLy8gYXZvaWQgaW5maW5pdGUgbG9vcHMgKEkgZG91YnQgdGhhdCBpcyBuZWVkZWQgYnV0Li4uKQotICAgIGlmIChwb3MgKyAxMCA+IGJ1Zl9zaXplKQotICAgICAgICBwb3MgPSBidWZfc2l6ZTsgLy8gb29wcyA7KQotCi0gICAgcmV0dXJuIHBvczsKLX0KLQotc3RhdGljIGludCBvdXRwdXRfZnJhbWUoSDI2NENvbnRleHQgKmgsIEFWRnJhbWUgKmRzdCwgSDI2NFBpY3R1cmUgKnNyY3ApCi17Ci0gICAgQVZGcmFtZSAqc3JjID0gc3JjcC0+ZjsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHNyYy0+Zm9ybWF0KTsKLSAgICBpbnQgaTsKLSAgICBpbnQgcmV0ID0gYXZfZnJhbWVfcmVmKGRzdCwgc3JjKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGF2X2RpY3Rfc2V0KCZkc3QtPm1ldGFkYXRhLCAic3RlcmVvX21vZGUiLCBmZl9oMjY0X3NlaV9zdGVyZW9fbW9kZShoKSwgMCk7Ci0KLSAgICBoLT5iYWNrdXBfd2lkdGggICA9IGgtPmF2Y3R4LT53aWR0aDsKLSAgICBoLT5iYWNrdXBfaGVpZ2h0ICA9IGgtPmF2Y3R4LT5oZWlnaHQ7Ci0gICAgaC0+YmFja3VwX3BpeF9mbXQgPSBoLT5hdmN0eC0+cGl4X2ZtdDsKLQotICAgIGgtPmF2Y3R4LT53aWR0aCAgID0gZHN0LT53aWR0aDsKLSAgICBoLT5hdmN0eC0+aGVpZ2h0ICA9IGRzdC0+aGVpZ2h0OwotICAgIGgtPmF2Y3R4LT5waXhfZm10ID0gZHN0LT5mb3JtYXQ7Ci0KLSAgICBpZiAoc3JjcC0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudCA9PSAwKQotICAgICAgICBkc3QtPmtleV9mcmFtZSA9IDE7Ci0gICAgaWYgKCFzcmNwLT5jcm9wKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9jb21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgaW50IGhzaGlmdCA9IChpID4gMCkgPyBkZXNjLT5sb2cyX2Nocm9tYV93IDogMDsKLSAgICAgICAgaW50IHZzaGlmdCA9IChpID4gMCkgPyBkZXNjLT5sb2cyX2Nocm9tYV9oIDogMDsKLSAgICAgICAgaW50IG9mZiAgICA9ICgoc3JjcC0+Y3JvcF9sZWZ0ID4+IGhzaGlmdCkgPDwgaC0+cGl4ZWxfc2hpZnQpICsKLSAgICAgICAgICAgICAgICAgICAgICAoc3JjcC0+Y3JvcF90b3AgID4+IHZzaGlmdCkgKiBkc3QtPmxpbmVzaXplW2ldOwotICAgICAgICBkc3QtPmRhdGFbaV0gKz0gb2ZmOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpc19leHRyYShjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKLXsKLSAgICBpbnQgY250PSBidWZbNV0mMHgxZjsKLSAgICBjb25zdCB1aW50OF90ICpwPSBidWYrNjsKLSAgICB3aGlsZShjbnQtLSl7Ci0gICAgICAgIGludCBuYWxzaXplPSBBVl9SQjE2KHApICsgMjsKLSAgICAgICAgaWYobmFsc2l6ZSA+IGJ1Zl9zaXplIC0gKHAtYnVmKSB8fCBwWzJdIT0weDY3KQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHAgKz0gbmFsc2l6ZTsKLSAgICB9Ci0gICAgY250ID0gKihwKyspOwotICAgIGlmKCFjbnQpCi0gICAgICAgIHJldHVybiAwOwotICAgIHdoaWxlKGNudC0tKXsKLSAgICAgICAgaW50IG5hbHNpemU9IEFWX1JCMTYocCkgKyAyOwotICAgICAgICBpZihuYWxzaXplID4gYnVmX3NpemUgLSAocC1idWYpIHx8IHBbMl0hPTB4NjgpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgcCArPSBuYWxzaXplOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBoMjY0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7Ci0gICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7Ci0gICAgSDI2NENvbnRleHQgKmggICAgID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBBVkZyYW1lICpwaWN0ICAgICAgPSBkYXRhOwotICAgIGludCBidWZfaW5kZXggICAgICA9IDA7Ci0gICAgSDI2NFBpY3R1cmUgKm91dDsKLSAgICBpbnQgaSwgb3V0X2lkeDsKLSAgICBpbnQgcmV0OwotCi0gICAgaC0+ZmxhZ3MgPSBhdmN0eC0+ZmxhZ3M7Ci0gICAgaC0+c2V0dXBfZmluaXNoZWQgPSAwOwotCi0gICAgaWYgKGgtPmJhY2t1cF93aWR0aCAhPSAtMSkgewotICAgICAgICBhdmN0eC0+d2lkdGggICAgPSBoLT5iYWNrdXBfd2lkdGg7Ci0gICAgICAgIGgtPmJhY2t1cF93aWR0aCA9IC0xOwotICAgIH0KLSAgICBpZiAoaC0+YmFja3VwX2hlaWdodCAhPSAtMSkgewotICAgICAgICBhdmN0eC0+aGVpZ2h0ICAgID0gaC0+YmFja3VwX2hlaWdodDsKLSAgICAgICAgaC0+YmFja3VwX2hlaWdodCA9IC0xOwotICAgIH0KLSAgICBpZiAoaC0+YmFja3VwX3BpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FKSB7Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10ICAgID0gaC0+YmFja3VwX3BpeF9mbXQ7Ci0gICAgICAgIGgtPmJhY2t1cF9waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOwotICAgIH0KLQotICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+bGFzdF9waWNfZm9yX2VjKTsKLQotICAgIC8qIGVuZCBvZiBzdHJlYW0sIG91dHB1dCB3aGF0IGlzIHN0aWxsIGluIHRoZSBidWZmZXJzICovCi0gICAgaWYgKGJ1Zl9zaXplID09IDApIHsKLSBvdXQ6Ci0KLSAgICAgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOwotICAgICAgICBoLT5maXJzdF9maWVsZCA9IDA7Ci0KLSAgICAgICAgLy8gRklYTUUgZmFjdG9yaXplIHRoaXMgd2l0aCB0aGUgb3V0cHV0IGNvZGUgYmVsb3cKLSAgICAgICAgb3V0ICAgICA9IGgtPmRlbGF5ZWRfcGljWzBdOwotICAgICAgICBvdXRfaWR4ID0gMDsKLSAgICAgICAgZm9yIChpID0gMTsKLSAgICAgICAgICAgICBoLT5kZWxheWVkX3BpY1tpXSAmJgotICAgICAgICAgICAgICFoLT5kZWxheWVkX3BpY1tpXS0+Zi0+a2V5X2ZyYW1lICYmCi0gICAgICAgICAgICAgIWgtPmRlbGF5ZWRfcGljW2ldLT5tbWNvX3Jlc2V0OwotICAgICAgICAgICAgIGkrKykKLSAgICAgICAgICAgIGlmIChoLT5kZWxheWVkX3BpY1tpXS0+cG9jIDwgb3V0LT5wb2MpIHsKLSAgICAgICAgICAgICAgICBvdXQgICAgID0gaC0+ZGVsYXllZF9waWNbaV07Ci0gICAgICAgICAgICAgICAgb3V0X2lkeCA9IGk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpID0gb3V0X2lkeDsgaC0+ZGVsYXllZF9waWNbaV07IGkrKykKLSAgICAgICAgICAgIGgtPmRlbGF5ZWRfcGljW2ldID0gaC0+ZGVsYXllZF9waWNbaSArIDFdOwotCi0gICAgICAgIGlmIChvdXQpIHsKLSAgICAgICAgICAgIG91dC0+cmVmZXJlbmNlICY9IH5ERUxBWUVEX1BJQ19SRUY7Ci0gICAgICAgICAgICByZXQgPSBvdXRwdXRfZnJhbWUoaCwgcGljdCwgb3V0KTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBidWZfaW5kZXg7Ci0gICAgfQotICAgIGlmIChoLT5pc19hdmMgJiYgYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsIE5VTEwpKSB7Ci0gICAgICAgIGludCBzaWRlX3NpemU7Ci0gICAgICAgIHVpbnQ4X3QgKnNpZGUgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwgJnNpZGVfc2l6ZSk7Ci0gICAgICAgIGlmIChpc19leHRyYShzaWRlLCBzaWRlX3NpemUpKQotICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfZXh0cmFkYXRhKGgsIHNpZGUsIHNpZGVfc2l6ZSk7Ci0gICAgfQotICAgIGlmKGgtPmlzX2F2YyAmJiBidWZfc2l6ZSA+PSA5ICYmIGJ1ZlswXT09MSAmJiBidWZbMl09PTAgJiYgKGJ1Zls0XSYweEZDKT09MHhGQyAmJiAoYnVmWzVdJjB4MUYpICYmIGJ1Zls4XT09MHg2Nyl7Ci0gICAgICAgIGlmIChpc19leHRyYShidWYsIGJ1Zl9zaXplKSkKLSAgICAgICAgICAgIHJldHVybiBmZl9oMjY0X2RlY29kZV9leHRyYWRhdGEoaCwgYnVmLCBidWZfc2l6ZSk7Ci0gICAgfQotCi0gICAgYnVmX2luZGV4ID0gZGVjb2RlX25hbF91bml0cyhoLCBidWYsIGJ1Zl9zaXplLCAwKTsKLSAgICBpZiAoYnVmX2luZGV4IDwgMCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0KLSAgICBpZiAoIWgtPmN1cl9waWNfcHRyICYmIGgtPm5hbF91bml0X3R5cGUgPT0gTkFMX0VORF9TRVFVRU5DRSkgewotICAgICAgICBhdl9hc3NlcnQwKGJ1Zl9pbmRleCA8PSBidWZfc2l6ZSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLQotICAgIGlmICghKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9DSFVOS1MpICYmICFoLT5jdXJfcGljX3B0cikgewotICAgICAgICBpZiAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiB8fAotICAgICAgICAgICAgYnVmX3NpemUgPj0gNCAmJiAhbWVtY21wKCJRMjY0IiwgYnVmLCA0KSkKLSAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJubyBmcmFtZSFcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICBpZiAoIShhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfQ0hVTktTKSB8fAotICAgICAgICAoaC0+bWJfeSA+PSBoLT5tYl9oZWlnaHQgJiYgaC0+bWJfaGVpZ2h0KSkgewotICAgICAgICBpZiAoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX0NIVU5LUykKLSAgICAgICAgICAgIGRlY29kZV9wb3N0aW5pdChoLCAxKTsKLQotICAgICAgICBpZiAoKHJldCA9IGZmX2gyNjRfZmllbGRfZW5kKGgsICZoLT5zbGljZV9jdHhbMF0sIDApKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIC8qIFdhaXQgZm9yIHNlY29uZCBmaWVsZC4gKi8KLSAgICAgICAgKmdvdF9mcmFtZSA9IDA7Ci0gICAgICAgIGlmIChoLT5uZXh0X291dHB1dF9waWMgJiYgKChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX09VVFBVVF9DT1JSVVBUKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX1NIT1dfQUxMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5uZXh0X291dHB1dF9waWMtPnJlY292ZXJlZCkpIHsKLSAgICAgICAgICAgIGlmICghaC0+bmV4dF9vdXRwdXRfcGljLT5yZWNvdmVyZWQpCi0gICAgICAgICAgICAgICAgaC0+bmV4dF9vdXRwdXRfcGljLT5mLT5mbGFncyB8PSBBVl9GUkFNRV9GTEFHX0NPUlJVUFQ7Ci0KLSAgICAgICAgICAgIGlmICghaC0+YXZjdHgtPmh3YWNjZWwgJiYKLSAgICAgICAgICAgICAgICAgKGgtPm5leHRfb3V0cHV0X3BpYy0+ZmllbGRfcG9jWzBdID09IElOVF9NQVggfHwKLSAgICAgICAgICAgICAgICAgIGgtPm5leHRfb3V0cHV0X3BpYy0+ZmllbGRfcG9jWzFdID09IElOVF9NQVgpCi0gICAgICAgICAgICApIHsKLSAgICAgICAgICAgICAgICBpbnQgcDsKLSAgICAgICAgICAgICAgICBBVkZyYW1lICpmID0gaC0+bmV4dF9vdXRwdXRfcGljLT5mOwotICAgICAgICAgICAgICAgIGludCBmaWVsZCA9IGgtPm5leHRfb3V0cHV0X3BpYy0+ZmllbGRfcG9jWzBdID09IElOVF9NQVg7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqZHN0X2RhdGFbNF07Ci0gICAgICAgICAgICAgICAgaW50IGxpbmVzaXplc1s0XTsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfZGF0YVs0XTsKLQotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiRHVwbGljYXRpbmcgZmllbGQgJWQgdG8gZmlsbCBtaXNzaW5nXG4iLCBmaWVsZCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwPDQ7IHArKykgewotICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YVtwXSA9IGYtPmRhdGFbcF0gKyAoZmllbGReMSkqZi0+bGluZXNpemVbcF07Ci0gICAgICAgICAgICAgICAgICAgIHNyY19kYXRhW3BdID0gZi0+ZGF0YVtwXSArICBmaWVsZCAgICpmLT5saW5lc2l6ZVtwXTsKLSAgICAgICAgICAgICAgICAgICAgbGluZXNpemVzW3BdID0gMipmLT5saW5lc2l6ZVtwXTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5KGRzdF9kYXRhLCBsaW5lc2l6ZXMsIHNyY19kYXRhLCBsaW5lc2l6ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mb3JtYXQsIGYtPndpZHRoLCBmLT5oZWlnaHQ+PjEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXQgPSBvdXRwdXRfZnJhbWUoaCwgcGljdCwgaC0+bmV4dF9vdXRwdXRfcGljKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAqZ290X2ZyYW1lID0gMTsKLSAgICAgICAgICAgIGlmIChDT05GSUdfTVBFR1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgZmZfcHJpbnRfZGVidWdfaW5mbzIoaC0+YXZjdHgsIHBpY3QsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5uZXh0X291dHB1dF9waWMtPm1iX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5uZXh0X291dHB1dF9waWMtPnFzY2FsZV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm5leHRfb3V0cHV0X3BpYy0+bW90aW9uX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5sb3dfZGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYl93aWR0aCwgaC0+bWJfaGVpZ2h0LCBoLT5tYl9zdHJpZGUsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXZfYXNzZXJ0MChwaWN0LT5idWZbMF0gfHwgISpnb3RfZnJhbWUpOwotCi0gICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5sYXN0X3BpY19mb3JfZWMpOwotCi0gICAgcmV0dXJuIGdldF9jb25zdW1lZF9ieXRlcyhidWZfaW5kZXgsIGJ1Zl9zaXplKTsKLX0KLQotYXZfY29sZCB2b2lkIGZmX2gyNjRfZnJlZV9jb250ZXh0KEgyNjRDb250ZXh0ICpoKQotewotICAgIGludCBpOwotCi0gICAgZmZfaDI2NF9mcmVlX3RhYmxlcyhoKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBIMjY0X01BWF9QSUNUVVJFX0NPVU5UOyBpKyspIHsKLSAgICAgICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5EUEJbaV0pOwotICAgICAgICBhdl9mcmFtZV9mcmVlKCZoLT5EUEJbaV0uZik7Ci0gICAgfQotICAgIG1lbXNldChoLT5kZWxheWVkX3BpYywgMCwgc2l6ZW9mKGgtPmRlbGF5ZWRfcGljKSk7Ci0KLSAgICBoLT5jdXJfcGljX3B0ciA9IE5VTEw7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaC0+bmJfc2xpY2VfY3R4OyBpKyspCi0gICAgICAgIGF2X2ZyZWVwKCZoLT5zbGljZV9jdHhbaV0ucmJzcF9idWZmZXIpOwotICAgIGF2X2ZyZWVwKCZoLT5zbGljZV9jdHgpOwotICAgIGgtPm5iX3NsaWNlX2N0eCA9IDA7Ci0KLSAgICBoLT5hNTNfY2FwdGlvbl9zaXplID0gMDsKLSAgICBhdl9mcmVlcCgmaC0+YTUzX2NhcHRpb24pOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9TUFNfQ09VTlQ7IGkrKykKLSAgICAgICAgYXZfZnJlZXAoaC0+c3BzX2J1ZmZlcnMgKyBpKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUFBTX0NPVU5UOyBpKyspCi0gICAgICAgIGF2X2ZyZWVwKGgtPnBwc19idWZmZXJzICsgaSk7Ci19Ci0KLXN0YXRpYyBhdl9jb2xkIGludCBoMjY0X2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKLQotICAgIGZmX2gyNjRfcmVtb3ZlX2FsbF9yZWZzKGgpOwotICAgIGZmX2gyNjRfZnJlZV9jb250ZXh0KGgpOwotCi0gICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5jdXJfcGljKTsKLSAgICBhdl9mcmFtZV9mcmVlKCZoLT5jdXJfcGljLmYpOwotICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+bGFzdF9waWNfZm9yX2VjKTsKLSAgICBhdl9mcmFtZV9mcmVlKCZoLT5sYXN0X3BpY19mb3JfZWMuZik7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSDI2NENvbnRleHQsIHgpCi0jZGVmaW5lIFZEIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBoMjY0X29wdGlvbnNbXSA9IHsKLSAgICB7ImlzX2F2YyIsICJpcyBhdmMiLCBvZmZzZXRvZihIMjY0Q29udGV4dCwgaXNfYXZjKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgMH0sCi0gICAgeyJuYWxfbGVuZ3RoX3NpemUiLCAibmFsX2xlbmd0aF9zaXplIiwgb2Zmc2V0b2YoSDI2NENvbnRleHQsIG5hbF9sZW5ndGhfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgNCwgMH0sCi0gICAgeyAiZW5hYmxlX2VyIiwgIkVuYWJsZSBlcnJvciByZXNpbGllbmNlIG9uIGRhbWFnZWQgZnJhbWVzICh1bnNhZmUpIiwgT0ZGU0VUKGVuYWJsZV9lciksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBWRCB9LAotICAgIHsgTlVMTCB9LAotfTsKLQotc3RhdGljIGNvbnN0IEFWQ2xhc3MgaDI2NF9jbGFzcyA9IHsKLSAgICAuY2xhc3NfbmFtZSA9ICJIMjY0IERlY29kZXIiLAotICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgLm9wdGlvbiAgICAgPSBoMjY0X29wdGlvbnMsCi0gICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi19OwotCi1BVkNvZGVjIGZmX2gyNjRfZGVjb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gImgyNjQiLAotICAgIC5sb25nX25hbWUgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjQgLyBBVkMgLyBNUEVHLTQgQVZDIC8gTVBFRy00IHBhcnQgMTAiKSwKLSAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAotICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoSDI2NENvbnRleHQpLAotICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBmZl9oMjY0X2RlY29kZV9pbml0LAotICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBoMjY0X2RlY29kZV9lbmQsCi0gICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IGgyNjRfZGVjb2RlX2ZyYW1lLAotICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSAvKkFWX0NPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCovIEFWX0NPREVDX0NBUF9EUjEgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTLAotICAgIC5jYXBzX2ludGVybmFsICAgICAgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAotICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSBmbHVzaF9kcGIsCi0gICAgLmluaXRfdGhyZWFkX2NvcHkgICAgICA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKGRlY29kZV9pbml0X3RocmVhZF9jb3B5KSwKLSAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoZmZfaDI2NF91cGRhdGVfdGhyZWFkX2NvbnRleHQpLAotICAgIC5wcm9maWxlcyAgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl9oMjY0X3Byb2ZpbGVzKSwKLSAgICAucHJpdl9jbGFzcyAgICAgICAgICAgID0gJmgyNjRfY2xhc3MsCi19OwotCi0jaWYgQ09ORklHX0gyNjRfVkRQQVVfREVDT0RFUiAmJiBGRl9BUElfVkRQQVUKLXN0YXRpYyBjb25zdCBBVkNsYXNzIGgyNjRfdmRwYXVfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiSDI2NCBWRFBBVSBEZWNvZGVyIiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gaDI2NF9vcHRpb25zLAotICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAotfTsKLQotQVZDb2RlYyBmZl9oMjY0X3ZkcGF1X2RlY29kZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfdmRwYXUiLAotICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2NCAvIEFWQyAvIE1QRUctNCBBVkMgLyBNUEVHLTQgcGFydCAxMCAoVkRQQVUgYWNjZWxlcmF0aW9uKSIpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihIMjY0Q29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgID0gZmZfaDI2NF9kZWNvZGVfaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgPSBoMjY0X2RlY29kZV9lbmQsCi0gICAgLmRlY29kZSAgICAgICAgID0gaDI2NF9kZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVLAotICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoX2RwYiwKLSAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9WRFBBVV9IMjY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkV9LAotICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX2gyNjRfcHJvZmlsZXMpLAotICAgIC5wcml2X2NsYXNzICAgICA9ICZoMjY0X3ZkcGF1X2NsYXNzLAotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0LmggYi9saWJhdmNvZGVjL2gyNjQuaAppbmRleCBhNWZjM2EwLi42NTA1ODBiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjQuaAorKysgYi9saWJhdmNvZGVjL2gyNjQuaApAQCAtMSw3ICsxLDQgQEAKIC8qCi0gKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBlbmNvZGVyL2RlY29kZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgotICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCiAgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yMSwxMjEzICsxOCw3NSBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBjb2RlYy4KLSAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIEguMjY0IGNvbW1vbiBkZWZpbml0aW9ucwogICovCiAKICNpZm5kZWYgQVZDT0RFQ19IMjY0X0gKICNkZWZpbmUgQVZDT0RFQ19IMjY0X0gKIAotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCi0jaW5jbHVkZSAiY2FiYWMuaCIKLSNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKLSNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCi0jaW5jbHVkZSAiaDI2NGRzcC5oIgotI2luY2x1ZGUgImgyNjRwcmVkLmgiCi0jaW5jbHVkZSAiaDI2NHFwZWwuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgIm1wZWd1dGlscy5oIgotI2luY2x1ZGUgInBhcnNlci5oIgotI2luY2x1ZGUgInFwZWxkc3AuaCIKLSNpbmNsdWRlICJyZWN0YW5nbGUuaCIKLSNpbmNsdWRlICJ2aWRlb2RzcC5oIgotCi0jZGVmaW5lIEgyNjRfTUFYX1BJQ1RVUkVfQ09VTlQgMzYKLSNkZWZpbmUgSDI2NF9NQVhfVEhSRUFEUyAgICAgICAzMgotCi0jZGVmaW5lIE1BWF9TUFNfQ09VTlQgICAgICAgICAgMzIKLSNkZWZpbmUgTUFYX1BQU19DT1VOVCAgICAgICAgIDI1NgotCi0jZGVmaW5lIE1BWF9NTUNPX0NPVU5UICAgICAgICAgNjYKLQotI2RlZmluZSBNQVhfREVMQVlFRF9QSUNfQ09VTlQgIDE2Ci0KLSNkZWZpbmUgTUFYX01CUEFJUl9TSVpFICgyNTYqMTAyNCkgLy8gYSB0aWdodGVyIGJvdW5kIGNvdWxkIGJlIGNhbGN1bGF0ZWQgaWYgc29tZW9uZSBjYXJlcyBhYm91dCBhIGZldyBieXRlcwotCi0vKiBDb21waWxpbmcgaW4gaW50ZXJsYWNlZCBzdXBwb3J0IHJlZHVjZXMgdGhlIHNwZWVkCi0gKiBvZiBwcm9ncmVzc2l2ZSBkZWNvZGluZyBieSBhYm91dCAyJS4gKi8KLSNkZWZpbmUgQUxMT1dfSU5URVJMQUNFCi0KLSNkZWZpbmUgRk1PIDAKLQotLyoqCi0gKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2xpY2VzIHN1cHBvcnRlZCBieSB0aGUgZGVjb2Rlci4KLSAqIG11c3QgYmUgYSBwb3dlciBvZiAyCi0gKi8KLSNkZWZpbmUgTUFYX1NMSUNFUyAzMgotCi0jaWZkZWYgQUxMT1dfSU5URVJMQUNFCi0jZGVmaW5lIE1CX01CQUZGKGgpICAgIChoKS0+bWJfbWJhZmYKLSNkZWZpbmUgTUJfRklFTEQoc2wpICAoc2wpLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnCi0jZGVmaW5lIEZSQU1FX01CQUZGKGgpIChoKS0+bWJfYWZmX2ZyYW1lCi0jZGVmaW5lIEZJRUxEX1BJQ1RVUkUoaCkgKChoKS0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSkKLSNkZWZpbmUgTEVGVF9NQlMgMgotI2RlZmluZSBMVE9QICAgICAwCi0jZGVmaW5lIExCT1QgICAgIDEKLSNkZWZpbmUgTEVGVChpKSAgKGkpCi0jZWxzZQotI2RlZmluZSBNQl9NQkFGRihoKSAgICAgIDAKLSNkZWZpbmUgTUJfRklFTEQoc2wpICAgICAwCi0jZGVmaW5lIEZSQU1FX01CQUZGKGgpICAgMAotI2RlZmluZSBGSUVMRF9QSUNUVVJFKGgpIDAKLSN1bmRlZiAgSVNfSU5URVJMQUNFRAotI2RlZmluZSBJU19JTlRFUkxBQ0VEKG1iX3R5cGUpIDAKLSNkZWZpbmUgTEVGVF9NQlMgMQotI2RlZmluZSBMVE9QICAgICAwCi0jZGVmaW5lIExCT1QgICAgIDAKLSNkZWZpbmUgTEVGVChpKSAgMAotI2VuZGlmCi0jZGVmaW5lIEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCkgKEZSQU1FX01CQUZGKGgpIHx8IEZJRUxEX1BJQ1RVUkUoaCkpCi0KLSNpZm5kZWYgQ0FCQUMKLSNkZWZpbmUgQ0FCQUMoaCkgKGgpLT5wcHMuY2FiYWMKLSNlbmRpZgotCi0jZGVmaW5lIENIUk9NQShoKSAgICAoKGgpLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpCi0jZGVmaW5lIENIUk9NQTQyMihoKSAoKGgpLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMgPT0gMikKLSNkZWZpbmUgQ0hST01BNDQ0KGgpICgoaCktPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKQotCi0jZGVmaW5lIEVYVEVOREVEX1NBUiAgICAgICAyNTUKLQotI2RlZmluZSBNQl9UWVBFX1JFRjAgICAgICAgTUJfVFlQRV9BQ1BSRUQgLy8gZGlydHkgYnV0IGl0IGZpdHMgaW4gMTYgYml0Ci0jZGVmaW5lIE1CX1RZUEVfOHg4RENUICAgICAweDAxMDAwMDAwCi0jZGVmaW5lIElTX1JFRjAoYSkgICAgICAgICAoKGEpICYgTUJfVFlQRV9SRUYwKQotI2RlZmluZSBJU184eDhEQ1QoYSkgICAgICAgKChhKSAmIE1CX1RZUEVfOHg4RENUKQotCiAjZGVmaW5lIFFQX01BWF9OVU0gKDUxICsgNio2KSAgICAgICAgICAgLy8gVGhlIG1heGltdW0gc3VwcG9ydGVkIHFwCiAKIC8qIE5BTCB1bml0IHR5cGVzICovCiBlbnVtIHsKLSAgICBOQUxfU0xJQ0UgICAgICAgICAgID0gMSwKLSAgICBOQUxfRFBBICAgICAgICAgICAgID0gMiwKLSAgICBOQUxfRFBCICAgICAgICAgICAgID0gMywKLSAgICBOQUxfRFBDICAgICAgICAgICAgID0gNCwKLSAgICBOQUxfSURSX1NMSUNFICAgICAgID0gNSwKLSAgICBOQUxfU0VJICAgICAgICAgICAgID0gNiwKLSAgICBOQUxfU1BTICAgICAgICAgICAgID0gNywKLSAgICBOQUxfUFBTICAgICAgICAgICAgID0gOCwKLSAgICBOQUxfQVVEICAgICAgICAgICAgID0gOSwKLSAgICBOQUxfRU5EX1NFUVVFTkNFICAgID0gMTAsCi0gICAgTkFMX0VORF9TVFJFQU0gICAgICA9IDExLAotICAgIE5BTF9GSUxMRVJfREFUQSAgICAgPSAxMiwKLSAgICBOQUxfU1BTX0VYVCAgICAgICAgID0gMTMsCi0gICAgTkFMX0FVWElMSUFSWV9TTElDRSA9IDE5LAotICAgIE5BTF9GRl9JR05PUkUgICAgICAgPSAweGZmMGYwMDEsCisgICAgSDI2NF9OQUxfU0xJQ0UgICAgICAgICAgID0gMSwKKyAgICBIMjY0X05BTF9EUEEgICAgICAgICAgICAgPSAyLAorICAgIEgyNjRfTkFMX0RQQiAgICAgICAgICAgICA9IDMsCisgICAgSDI2NF9OQUxfRFBDICAgICAgICAgICAgID0gNCwKKyAgICBIMjY0X05BTF9JRFJfU0xJQ0UgICAgICAgPSA1LAorICAgIEgyNjRfTkFMX1NFSSAgICAgICAgICAgICA9IDYsCisgICAgSDI2NF9OQUxfU1BTICAgICAgICAgICAgID0gNywKKyAgICBIMjY0X05BTF9QUFMgICAgICAgICAgICAgPSA4LAorICAgIEgyNjRfTkFMX0FVRCAgICAgICAgICAgICA9IDksCisgICAgSDI2NF9OQUxfRU5EX1NFUVVFTkNFICAgID0gMTAsCisgICAgSDI2NF9OQUxfRU5EX1NUUkVBTSAgICAgID0gMTEsCisgICAgSDI2NF9OQUxfRklMTEVSX0RBVEEgICAgID0gMTIsCisgICAgSDI2NF9OQUxfU1BTX0VYVCAgICAgICAgID0gMTMsCisgICAgSDI2NF9OQUxfQVVYSUxJQVJZX1NMSUNFID0gMTksCiB9OwogCi0vKioKLSAqIFNFSSBtZXNzYWdlIHR5cGVzCi0gKi8KLXR5cGVkZWYgZW51bSB7Ci0gICAgU0VJX1RZUEVfQlVGRkVSSU5HX1BFUklPRCAgICAgICA9IDAsICAgLy8vPCBidWZmZXJpbmcgcGVyaW9kIChILjI2NCwgRC4xLjEpCi0gICAgU0VJX1RZUEVfUElDX1RJTUlORyAgICAgICAgICAgICA9IDEsICAgLy8vPCBwaWN0dXJlIHRpbWluZwotICAgIFNFSV9UWVBFX1VTRVJfREFUQV9SRUdJU1RFUkVEICAgPSA0LCAgIC8vLzwgcmVnaXN0ZXJlZCB1c2VyIGRhdGEgYXMgc3BlY2lmaWVkIGJ5IFJlYy4gSVRVLVQgVC4zNQotICAgIFNFSV9UWVBFX1VTRVJfREFUQV9VTlJFR0lTVEVSRUQgPSA1LCAgIC8vLzwgdW5yZWdpc3RlcmVkIHVzZXIgZGF0YQotICAgIFNFSV9UWVBFX1JFQ09WRVJZX1BPSU5UICAgICAgICAgPSA2LCAgIC8vLzwgcmVjb3ZlcnkgcG9pbnQgKGZyYW1lICMgdG8gZGVjb2RlciBzeW5jKQotICAgIFNFSV9UWVBFX0ZSQU1FX1BBQ0tJTkcgICAgICAgICAgPSA0NSwgIC8vLzwgZnJhbWUgcGFja2luZyBhcnJhbmdlbWVudAotICAgIFNFSV9UWVBFX0RJU1BMQVlfT1JJRU5UQVRJT04gICAgPSA0NywgIC8vLzwgZGlzcGxheSBvcmllbnRhdGlvbgotICAgIFNFSV9UWVBFX0dSRUVOX01FVEFEQVRBICAgICAgICAgPSA1NiAgIC8vLzwgR3JlZW5NUEVHIGluZm9ybWF0aW9uCi19IFNFSV9UeXBlOwogCi0vKioKLSAqIHBpY19zdHJ1Y3QgaW4gcGljdHVyZSB0aW1pbmcgU0VJIG1lc3NhZ2UKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBTRUlfUElDX1NUUlVDVF9GUkFNRSAgICAgICAgICAgICA9IDAsIC8vLzwgIDA6ICVmcmFtZQotICAgIFNFSV9QSUNfU1RSVUNUX1RPUF9GSUVMRCAgICAgICAgID0gMSwgLy8vPCAgMTogdG9wIGZpZWxkCi0gICAgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX0ZJRUxEICAgICAgPSAyLCAvLy88ICAyOiBib3R0b20gZmllbGQKLSAgICBTRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NICAgICAgICA9IDMsIC8vLzwgIDM6IHRvcCBmaWVsZCwgYm90dG9tIGZpZWxkLCBpbiB0aGF0IG9yZGVyCi0gICAgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUCAgICAgICAgPSA0LCAvLy88ICA0OiBib3R0b20gZmllbGQsIHRvcCBmaWVsZCwgaW4gdGhhdCBvcmRlcgotICAgIFNFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT01fVE9QICAgID0gNSwgLy8vPCAgNTogdG9wIGZpZWxkLCBib3R0b20gZmllbGQsIHRvcCBmaWVsZCByZXBlYXRlZCwgaW4gdGhhdCBvcmRlcgotICAgIFNFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1BfQk9UVE9NID0gNiwgLy8vPCAgNjogYm90dG9tIGZpZWxkLCB0b3AgZmllbGQsIGJvdHRvbSBmaWVsZCByZXBlYXRlZCwgaW4gdGhhdCBvcmRlcgotICAgIFNFSV9QSUNfU1RSVUNUX0ZSQU1FX0RPVUJMSU5HICAgID0gNywgLy8vPCAgNzogJWZyYW1lIGRvdWJsaW5nCi0gICAgU0VJX1BJQ19TVFJVQ1RfRlJBTUVfVFJJUExJTkcgICAgPSA4ICAvLy88ICA4OiAlZnJhbWUgdHJpcGxpbmcKLX0gU0VJX1BpY1N0cnVjdFR5cGU7CitlbnVtIHsKKyAgICAvLyA3LjQuMi4xLjE6IHNlcV9wYXJhbWV0ZXJfc2V0X2lkIGlzIGluIFswLCAzMV0uCisgICAgSDI2NF9NQVhfU1BTX0NPVU5UID0gMzIsCisgICAgLy8gNy40LjIuMjogcGljX3BhcmFtZXRlcl9zZXRfaWQgaXMgaW4gWzAsIDI1NV0uCisgICAgSDI2NF9NQVhfUFBTX0NPVU5UID0gMjU2LAogCi0vKioKLSAqIGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnQgdHlwZXMKLSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBTRUlfRlBBX1RZUEVfQ0hFQ0tFUkJPQVJEICAgICAgICA9IDAsCi0gICAgU0VJX0ZQQV9UWVBFX0lOVEVSTEVBVkVfQ09MVU1OICAgPSAxLAotICAgIFNFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1JPVyAgICAgID0gMiwKLSAgICBTRUlfRlBBX1RZUEVfU0lERV9CWV9TSURFICAgICAgICA9IDMsCi0gICAgU0VJX0ZQQV9UWVBFX1RPUF9CT1RUT00gICAgICAgICAgPSA0LAotICAgIFNFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1RFTVBPUkFMID0gNSwKLSAgICBTRUlfRlBBX1RZUEVfMkQgICAgICAgICAgICAgICAgICA9IDYsCi19IFNFSV9GcGFUeXBlOworICAgIC8vIEEuMzogTWF4RHBiRnJhbWVzIGlzIGJvdW5kZWQgYWJvdmUgYnkgMTYuCisgICAgSDI2NF9NQVhfRFBCX0ZSQU1FUyA9IDE2LAorICAgIC8vIDcuNC4yLjEuMTogbWF4X251bV9yZWZfZnJhbWVzIGlzIGluIFswLCBNYXhEcGJGcmFtZXNdLCBhbmQKKyAgICAvLyBlYWNoIHJlZmVyZW5jZSBmcmFtZSBjYW4gaGF2ZSB0d28gZmllbGRzLgorICAgIEgyNjRfTUFYX1JFRlMgICAgICAgPSAyICogSDI2NF9NQVhfRFBCX0ZSQU1FUywKIAotLyoqCi0gKiBTZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IFNQUyB7Ci0gICAgdW5zaWduZWQgaW50IHNwc19pZDsKLSAgICBpbnQgcHJvZmlsZV9pZGM7Ci0gICAgaW50IGxldmVsX2lkYzsKLSAgICBpbnQgY2hyb21hX2Zvcm1hdF9pZGM7Ci0gICAgaW50IHRyYW5zZm9ybV9ieXBhc3M7ICAgICAgICAgICAgICAvLy88IHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZwotICAgIGludCBsb2cyX21heF9mcmFtZV9udW07ICAgICAgICAgICAgLy8vPCBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNAotICAgIGludCBwb2NfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwaWNfb3JkZXJfY250X3R5cGUKLSAgICBpbnQgbG9nMl9tYXhfcG9jX2xzYjsgICAgICAgICAgICAgIC8vLzwgbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0Ci0gICAgaW50IGRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOwotICAgIGludCBvZmZzZXRfZm9yX25vbl9yZWZfcGljOwotICAgIGludCBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7Ci0gICAgaW50IHBvY19jeWNsZV9sZW5ndGg7ICAgICAgICAgICAgICAvLy88IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUKLSAgICBpbnQgcmVmX2ZyYW1lX2NvdW50OyAgICAgICAgICAgICAgIC8vLzwgbnVtX3JlZl9mcmFtZXMKLSAgICBpbnQgZ2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnOwotICAgIGludCBtYl93aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwaWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDEKLSAgICBpbnQgbWJfaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8vLzwgcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMQotICAgIGludCBmcmFtZV9tYnNfb25seV9mbGFnOwotICAgIGludCBtYl9hZmY7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnCi0gICAgaW50IGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWc7Ci0gICAgaW50IGNyb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZyYW1lX2Nyb3BwaW5nX2ZsYWcKKyAgICAvLyA3LjQuMy4xOiBtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjIGlzIG5vdCBlcXVhbCB0byAzIGF0IG1vc3QKKyAgICAvLyBudW1fcmVmX2lkeF9sTl9hY3RpdmVfbWludXMxICsgMSB0aW1lcyAodGhhdCBpcywgb25jZSBmb3IgZWFjaAorICAgIC8vIHBvc3NpYmxlIHJlZmVyZW5jZSksIHRoZW4gZXF1YWwgdG8gMyBvbmNlLgorICAgIEgyNjRfTUFYX1JQTE1fQ09VTlQgPSBIMjY0X01BWF9SRUZTICsgMSwKIAotICAgIC8qIHRob3NlIDQgYXJlIGFscmVhZHkgaW4gbHVtYSBzYW1wbGVzICovCi0gICAgdW5zaWduZWQgaW50IGNyb3BfbGVmdDsgICAgICAgICAgICAvLy88IGZyYW1lX2Nyb3BwaW5nX3JlY3RfbGVmdF9vZmZzZXQKLSAgICB1bnNpZ25lZCBpbnQgY3JvcF9yaWdodDsgICAgICAgICAgIC8vLzwgZnJhbWVfY3JvcHBpbmdfcmVjdF9yaWdodF9vZmZzZXQKLSAgICB1bnNpZ25lZCBpbnQgY3JvcF90b3A7ICAgICAgICAgICAgIC8vLzwgZnJhbWVfY3JvcHBpbmdfcmVjdF90b3Bfb2Zmc2V0Ci0gICAgdW5zaWduZWQgaW50IGNyb3BfYm90dG9tOyAgICAgICAgICAvLy88IGZyYW1lX2Nyb3BwaW5nX3JlY3RfYm90dG9tX29mZnNldAotICAgIGludCB2dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7Ci0gICAgQVZSYXRpb25hbCBzYXI7Ci0gICAgaW50IHZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZzsKLSAgICBpbnQgZnVsbF9yYW5nZTsKLSAgICBpbnQgY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZzsKLSAgICBlbnVtIEFWQ29sb3JQcmltYXJpZXMgY29sb3JfcHJpbWFyaWVzOwotICAgIGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgY29sb3JfdHJjOwotICAgIGVudW0gQVZDb2xvclNwYWNlIGNvbG9yc3BhY2U7Ci0gICAgaW50IHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKLSAgICB1aW50MzJfdCBudW1fdW5pdHNfaW5fdGljazsKLSAgICB1aW50MzJfdCB0aW1lX3NjYWxlOwotICAgIGludCBmaXhlZF9mcmFtZV9yYXRlX2ZsYWc7Ci0gICAgc2hvcnQgb2Zmc2V0X2Zvcl9yZWZfZnJhbWVbMjU2XTsgLy8gRklYTUUgZHluIGFsb2M/Ci0gICAgaW50IGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOwotICAgIGludCBudW1fcmVvcmRlcl9mcmFtZXM7Ci0gICAgaW50IHNjYWxpbmdfbWF0cml4X3ByZXNlbnQ7Ci0gICAgdWludDhfdCBzY2FsaW5nX21hdHJpeDRbNl1bMTZdOwotICAgIHVpbnQ4X3Qgc2NhbGluZ19tYXRyaXg4WzZdWzY0XTsKLSAgICBpbnQgbmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKLSAgICBpbnQgdmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKLSAgICBpbnQgcGljX3N0cnVjdF9wcmVzZW50X2ZsYWc7Ci0gICAgaW50IHRpbWVfb2Zmc2V0X2xlbmd0aDsKLSAgICBpbnQgY3BiX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU2VlIEguMjY0IEUuMS4yCi0gICAgaW50IGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoOyAvLy88IGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEKLSAgICBpbnQgY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoOyAgICAgICAgIC8vLzwgY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEKLSAgICBpbnQgZHBiX291dHB1dF9kZWxheV9sZW5ndGg7ICAgICAgICAgIC8vLzwgZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxICsgMQotICAgIGludCBiaXRfZGVwdGhfbHVtYTsgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRfZGVwdGhfbHVtYV9taW51czggKyA4Ci0gICAgaW50IGJpdF9kZXB0aF9jaHJvbWE7ICAgICAgICAgICAgICAgICAvLy88IGJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICsgOAotICAgIGludCByZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZzsgICAgLy8vPCByZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcKLSAgICBpbnQgY29uc3RyYWludF9zZXRfZmxhZ3M7ICAgICAgICAgICAgIC8vLzwgY29uc3RyYWludF9zZXRbMC0zXV9mbGFnCi0gICAgaW50IG5ldzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZsYWcgdG8ga2VlcCB0cmFjayBpZiB0aGUgZGVjb2RlciBjb250ZXh0IG5lZWRzIHJlLWluaXQgZHVlIHRvIGNoYW5nZWQgU1BTCi0gICAgdWludDhfdCBkYXRhWzQwOTZdOwotICAgIHNpemVfdCBkYXRhX3NpemU7Ci19IFNQUzsKKyAgICAvLyA3LjQuMy4zOiBpbiB0aGUgd29yc3QgY2FzZSwgd2UgYmVnaW4gd2l0aCBhIGZ1bGwgc2hvcnQtdGVybQorICAgIC8vIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QuICBFYWNoIHBpY3R1cmUgaW4gdHVybiBpcyBtb3ZlZCB0byB0aGUKKyAgICAvLyBsb25nLXRlcm0gbGlzdCAodHlwZSAzKSBhbmQgdGhlbiBkaXNjYXJkZWQgZnJvbSB0aGVyZSAodHlwZSAyKS4KKyAgICAvLyBUaGVuLCB3ZSBzZXQgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZy10ZXJtIGxpc3QgKHR5cGUgNCksIG1hcmsKKyAgICAvLyB0aGUgY3VycmVudCBwaWN0dXJlIGFzIGxvbmctdGVybSAodHlwZSA2KSBhbmQgdGVybWluYXRlIHRoZQorICAgIC8vIHByb2Nlc3MgKHR5cGUgMCkuCisgICAgSDI2NF9NQVhfTU1DT19DT1VOVCA9IEgyNjRfTUFYX1JFRlMgKiAyICsgMywKIAotLyoqCi0gKiBQaWN0dXJlIHBhcmFtZXRlciBzZXQKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgUFBTIHsKLSAgICB1bnNpZ25lZCBpbnQgc3BzX2lkOwotICAgIGludCBjYWJhYzsgICAgICAgICAgICAgICAgICAvLy88IGVudHJvcHlfY29kaW5nX21vZGVfZmxhZwotICAgIGludCBwaWNfb3JkZXJfcHJlc2VudDsgICAgICAvLy88IHBpY19vcmRlcl9wcmVzZW50X2ZsYWcKLSAgICBpbnQgc2xpY2VfZ3JvdXBfY291bnQ7ICAgICAgLy8vPCBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSArIDEKLSAgICBpbnQgbWJfc2xpY2VfZ3JvdXBfbWFwX3R5cGU7Ci0gICAgdW5zaWduZWQgaW50IHJlZl9jb3VudFsyXTsgIC8vLzwgbnVtX3JlZl9pZHhfbDAvMV9hY3RpdmVfbWludXMxICsgMQotICAgIGludCB3ZWlnaHRlZF9wcmVkOyAgICAgICAgICAvLy88IHdlaWdodGVkX3ByZWRfZmxhZwotICAgIGludCB3ZWlnaHRlZF9iaXByZWRfaWRjOwotICAgIGludCBpbml0X3FwOyAgICAgICAgICAgICAgICAvLy88IHBpY19pbml0X3FwX21pbnVzMjYgKyAyNgotICAgIGludCBpbml0X3FzOyAgICAgICAgICAgICAgICAvLy88IHBpY19pbml0X3FzX21pbnVzMjYgKyAyNgotICAgIGludCBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzJdOwotICAgIGludCBkZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQ7IC8vLzwgZGVibG9ja2luZ19maWx0ZXJfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcKLSAgICBpbnQgY29uc3RyYWluZWRfaW50cmFfcHJlZDsgICAgIC8vLzwgY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnCi0gICAgaW50IHJlZHVuZGFudF9waWNfY250X3ByZXNlbnQ7ICAvLy88IHJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZwotICAgIGludCB0cmFuc2Zvcm1fOHg4X21vZGU7ICAgICAgICAgLy8vPCB0cmFuc2Zvcm1fOHg4X21vZGVfZmxhZwotICAgIHVpbnQ4X3Qgc2NhbGluZ19tYXRyaXg0WzZdWzE2XTsKLSAgICB1aW50OF90IHNjYWxpbmdfbWF0cml4OFs2XVs2NF07Ci0gICAgdWludDhfdCBjaHJvbWFfcXBfdGFibGVbMl1bUVBfTUFYX05VTSsxXTsgIC8vLzwgcHJlLXNjYWxlZCAod2l0aCBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KSB2ZXJzaW9uIG9mIHFwX3RhYmxlCi0gICAgaW50IGNocm9tYV9xcF9kaWZmOwotICAgIHVpbnQ4X3QgZGF0YVs0MDk2XTsKLSAgICBzaXplX3QgZGF0YV9zaXplOwotfSBQUFM7CisgICAgLy8gQS4yLjEsIEEuMi4zOiBwcm9maWxlcyBzdXBwb3J0aW5nIEZNTyBjb25zdHJhaW4KKyAgICAvLyBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSB0byBiZSBpbiBbMCwgN10uCisgICAgSDI2NF9NQVhfU0xJQ0VfR1JPVVBTID0gOCwKIAotLyoqCi0gKiBGcmFtZSBQYWNraW5nIEFycmFuZ2VtZW50IFR5cGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgRlBBIHsKLSAgICBpbnQgICAgICAgICBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2lkOwotICAgIGludCAgICAgICAgIGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWc7IC8vLzwgaXMgcHJldmlvdXMgYXJyYW5nZW1lbnQgY2FuY2VsZWQsIC0xIGlmIG5ldmVyIHJlY2VpdmVkCi0gICAgU0VJX0ZwYVR5cGUgZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlOwotICAgIGludCAgICAgICAgIGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfcmVwZXRpdGlvbl9wZXJpb2Q7Ci0gICAgaW50ICAgICAgICAgY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlOwotICAgIGludCAgICAgICAgIHF1aW5jdW54X3NhbXBsaW5nX2ZsYWc7Ci19IEZQQTsKKyAgICAvLyBFLjIuMjogY3BiX2NudF9taW51czEgaXMgaW4gWzAsIDMxXS4KKyAgICBIMjY0X01BWF9DUEJfQ05UID0gMzIsCiAKLS8qKgotICogICAgIEdyZWVuIE1ldGFEYXRhIEluZm9ybWF0aW9uIFR5cGUKLSAqLwotdHlwZWRlZiBzdHJ1Y3QgR3JlZW5NZXRhRGF0YSB7Ci0gICAgdWludDhfdCAgZ3JlZW5fbWV0YWRhdGFfdHlwZTsKLSAgICB1aW50OF90ICBwZXJpb2RfdHlwZTsKLSAgICB1aW50MTZfdCAgbnVtX3NlY29uZHM7Ci0gICAgdWludDE2X3QgIG51bV9waWN0dXJlczsKLSAgICB1aW50OF90IHBlcmNlbnRfbm9uX3plcm9fbWFjcm9ibG9ja3M7Ci0gICAgdWludDhfdCBwZXJjZW50X2ludHJhX2NvZGVkX21hY3JvYmxvY2tzOwotICAgIHVpbnQ4X3QgcGVyY2VudF9zaXhfdGFwX2ZpbHRlcmluZzsKLSAgICB1aW50OF90IHBlcmNlbnRfYWxwaGFfcG9pbnRfZGVibG9ja2luZ19pbnN0YW5jZTsKLSAgICB1aW50OF90IHhzZF9tZXRyaWNfdHlwZTsKLSAgICB1aW50MTZfdCB4c2RfbWV0cmljX3ZhbHVlOwotfSBHcmVlbk1ldGFEYXRhOwotCi0vKioKLSAqIE1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9uIG9wY29kZS4KLSAqLwotdHlwZWRlZiBlbnVtIE1NQ09PcGNvZGUgewotICAgIE1NQ09fRU5EID0gMCwKLSAgICBNTUNPX1NIT1JUMlVOVVNFRCwKLSAgICBNTUNPX0xPTkcyVU5VU0VELAotICAgIE1NQ09fU0hPUlQyTE9ORywKLSAgICBNTUNPX1NFVF9NQVhfTE9ORywKLSAgICBNTUNPX1JFU0VULAotICAgIE1NQ09fTE9ORywKLX0gTU1DT09wY29kZTsKLQotLyoqCi0gKiBNZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbi4KLSAqLwotdHlwZWRlZiBzdHJ1Y3QgTU1DTyB7Ci0gICAgTU1DT09wY29kZSBvcGNvZGU7Ci0gICAgaW50IHNob3J0X3BpY19udW07ICAvLy88IHBpY19udW0gd2l0aG91dCB3cmFwcGluZyAocGljX251bSAmIG1heF9waWNfbnVtKQotICAgIGludCBsb25nX2FyZzsgICAgICAgLy8vPCBpbmRleCwgcGljX251bSwgb3IgbnVtIGxvbmcgcmVmcyBkZXBlbmRpbmcgb24gb3Bjb2RlCi19IE1NQ087Ci0KLXR5cGVkZWYgc3RydWN0IEgyNjRQaWN0dXJlIHsKLSAgICBBVkZyYW1lICpmOwotICAgIFRocmVhZEZyYW1lIHRmOwotCi0gICAgQVZCdWZmZXJSZWYgKnFzY2FsZV90YWJsZV9idWY7Ci0gICAgaW50OF90ICpxc2NhbGVfdGFibGU7Ci0KLSAgICBBVkJ1ZmZlclJlZiAqbW90aW9uX3ZhbF9idWZbMl07Ci0gICAgaW50MTZfdCAoKm1vdGlvbl92YWxbMl0pWzJdOwotCi0gICAgQVZCdWZmZXJSZWYgKm1iX3R5cGVfYnVmOwotICAgIHVpbnQzMl90ICptYl90eXBlOwotCi0gICAgQVZCdWZmZXJSZWYgKmh3YWNjZWxfcHJpdl9idWY7Ci0gICAgdm9pZCAqaHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7IC8vLzwgaGFyZHdhcmUgYWNjZWxlcmF0b3IgcHJpdmF0ZSBkYXRhCi0KLSAgICBBVkJ1ZmZlclJlZiAqcmVmX2luZGV4X2J1ZlsyXTsKLSAgICBpbnQ4X3QgKnJlZl9pbmRleFsyXTsKLQotICAgIGludCBmaWVsZF9wb2NbMl07ICAgICAgIC8vLzwgdG9wL2JvdHRvbSBQT0MKLSAgICBpbnQgcG9jOyAgICAgICAgICAgICAgICAvLy88IGZyYW1lIFBPQwotICAgIGludCBmcmFtZV9udW07ICAgICAgICAgIC8vLzwgZnJhbWVfbnVtIChyYXcgZnJhbWVfbnVtIGZyb20gc2xpY2UgaGVhZGVyKQotICAgIGludCBtbWNvX3Jlc2V0OyAgICAgICAgIC8qKjwgTU1DT19SRVNFVCBzZXQgdGhpcyAxLiBSZW9yZGVyaW5nIGNvZGUgbXVzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IG1peCBwaWN0dXJlcyBiZWZvcmUgYW5kIGFmdGVyIE1NQ09fUkVTRVQuICovCi0gICAgaW50IHBpY19pZDsgICAgICAgICAgICAgLyoqPCBwaWNfbnVtIChzaG9ydCAtPiBubyB3cmFwIHZlcnNpb24gb2YgcGljX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY19udW0gJiBtYXhfcGljX251bTsgbG9uZyAtPiBsb25nX3BpY19udW0pICovCi0gICAgaW50IGxvbmdfcmVmOyAgICAgICAgICAgLy8vPCAxLT5sb25nIHRlcm0gcmVmZXJlbmNlIDAtPnNob3J0IHRlcm0gcmVmZXJlbmNlCi0gICAgaW50IHJlZl9wb2NbMl1bMl1bMzJdOyAgLy8vPCBQT0NzIG9mIHRoZSBmcmFtZXMvZmllbGRzIHVzZWQgYXMgcmVmZXJlbmNlIChGSVhNRSBuZWVkIHBlciBzbGljZSkKLSAgICBpbnQgcmVmX2NvdW50WzJdWzJdOyAgICAvLy88IG51bWJlciBvZiBlbnRyaWVzIGluIHJlZl9wb2MgICAgICAgICAoRklYTUUgbmVlZCBwZXIgc2xpY2UpCi0gICAgaW50IG1iYWZmOyAgICAgICAgICAgICAgLy8vPCAxIC0+IE1CQUZGIGZyYW1lIDAtPiBub3QgTUJBRkYKLSAgICBpbnQgZmllbGRfcGljdHVyZTsgICAgICAvLy88IHdoZXRoZXIgb3Igbm90IHBpY3R1cmUgd2FzIGVuY29kZWQgaW4gc2VwYXJhdGUgZmllbGRzCi0KLSAgICBpbnQgcmVmZXJlbmNlOwotICAgIGludCByZWNvdmVyZWQ7ICAgICAgICAgIC8vLzwgcGljdHVyZSBhdCBJRFIgb3IgcmVjb3ZlcnkgcG9pbnQgKyByZWNvdmVyeSBjb3VudAotICAgIGludCBpbnZhbGlkX2dhcDsKLSAgICBpbnQgc2VpX3JlY292ZXJ5X2ZyYW1lX2NudDsKLQotICAgIGludCBjcm9wOwotICAgIGludCBjcm9wX2xlZnQ7Ci0gICAgaW50IGNyb3BfdG9wOwotfSBIMjY0UGljdHVyZTsKLQotdHlwZWRlZiBzdHJ1Y3QgSDI2NFJlZiB7Ci0gICAgdWludDhfdCAqZGF0YVszXTsKLSAgICBpbnQgbGluZXNpemVbM107Ci0KLSAgICBpbnQgcmVmZXJlbmNlOwotICAgIGludCBwb2M7Ci0gICAgaW50IHBpY19pZDsKLQotICAgIEgyNjRQaWN0dXJlICpwYXJlbnQ7Ci19IEgyNjRSZWY7Ci0KLXR5cGVkZWYgc3RydWN0IEgyNjRTbGljZUNvbnRleHQgewotICAgIHN0cnVjdCBIMjY0Q29udGV4dCAqaDI2NDsKLSAgICBHZXRCaXRDb250ZXh0IGdiOwotICAgIEVSQ29udGV4dCBlcjsKLQotICAgIGludCBzbGljZV9udW07Ci0gICAgaW50IHNsaWNlX3R5cGU7Ci0gICAgaW50IHNsaWNlX3R5cGVfbm9zOyAgICAgICAgIC8vLzwgUyBmcmVlIHNsaWNlIHR5cGUgKFNJL1NQIGFyZSByZW1hcHBlZCB0byBJL1ApCi0gICAgaW50IHNsaWNlX3R5cGVfZml4ZWQ7Ci0KLSAgICBpbnQgcXNjYWxlOwotICAgIGludCBjaHJvbWFfcXBbMl07ICAgLy8gUVBjCi0gICAgaW50IHFwX3RocmVzaDsgICAgICAvLy88IFFQIHRocmVzaG9sZCB0byBza2lwIGxvb3BmaWx0ZXIKLSAgICBpbnQgbGFzdF9xc2NhbGVfZGlmZjsKLQotICAgIC8vIGRlYmxvY2sKLSAgICBpbnQgZGVibG9ja2luZ19maWx0ZXI7ICAgICAgICAgIC8vLzwgZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgd2l0aCAxIDwtPiAwCi0gICAgaW50IHNsaWNlX2FscGhhX2MwX29mZnNldDsKLSAgICBpbnQgc2xpY2VfYmV0YV9vZmZzZXQ7Ci0KLSAgICAvLyBXZWlnaHRlZCBwcmVkIHN0dWZmCi0gICAgaW50IHVzZV93ZWlnaHQ7Ci0gICAgaW50IHVzZV93ZWlnaHRfY2hyb21hOwotICAgIGludCBsdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tOwotICAgIGludCBjaHJvbWFfbG9nMl93ZWlnaHRfZGVub207Ci0gICAgaW50IGx1bWFfd2VpZ2h0X2ZsYWdbMl07ICAgIC8vLzwgNy40LjMuMiBsdW1hX3dlaWdodF9sWF9mbGFnCi0gICAgaW50IGNocm9tYV93ZWlnaHRfZmxhZ1syXTsgIC8vLzwgNy40LjMuMiBjaHJvbWFfd2VpZ2h0X2xYX2ZsYWcKLSAgICAvLyBUaGUgZm9sbG93aW5nIDIgY2FuIGJlIGNoYW5nZWQgdG8gaW50OF90IGJ1dCB0aGF0IGNhdXNlcyAxMGNwdSBjeWNsZXMgc3BlZWRsb3NzCi0gICAgaW50IGx1bWFfd2VpZ2h0WzQ4XVsyXVsyXTsKLSAgICBpbnQgY2hyb21hX3dlaWdodFs0OF1bMl1bMl1bMl07Ci0gICAgaW50IGltcGxpY2l0X3dlaWdodFs0OF1bNDhdWzJdOwotCi0gICAgaW50IHByZXZfbWJfc2tpcHBlZDsKLSAgICBpbnQgbmV4dF9tYl9za2lwcGVkOwotCi0gICAgaW50IGNocm9tYV9wcmVkX21vZGU7Ci0gICAgaW50IGludHJhMTZ4MTZfcHJlZF9tb2RlOwotCi0gICAgaW50OF90IGludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs1ICogOF07Ci0gICAgaW50OF90KCppbnRyYTR4NF9wcmVkX21vZGUpOwotCi0gICAgaW50IHRvcGxlZnRfbWJfeHk7Ci0gICAgaW50IHRvcF9tYl94eTsKLSAgICBpbnQgdG9wcmlnaHRfbWJfeHk7Ci0gICAgaW50IGxlZnRfbWJfeHlbTEVGVF9NQlNdOwotCi0gICAgaW50IHRvcGxlZnRfdHlwZTsKLSAgICBpbnQgdG9wX3R5cGU7Ci0gICAgaW50IHRvcHJpZ2h0X3R5cGU7Ci0gICAgaW50IGxlZnRfdHlwZVtMRUZUX01CU107Ci0KLSAgICBjb25zdCB1aW50OF90ICpsZWZ0X2Jsb2NrOwotICAgIGludCB0b3BsZWZ0X3BhcnRpdGlvbjsKLQotICAgIHVuc2lnbmVkIGludCB0b3BsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlOwotICAgIHVuc2lnbmVkIGludCB0b3Bfc2FtcGxlc19hdmFpbGFibGU7Ci0gICAgdW5zaWduZWQgaW50IHRvcHJpZ2h0X3NhbXBsZXNfYXZhaWxhYmxlOwotICAgIHVuc2lnbmVkIGludCBsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlOwotCi0gICAgcHRyZGlmZl90IGxpbmVzaXplLCB1dmxpbmVzaXplOwotICAgIHB0cmRpZmZfdCBtYl9saW5lc2l6ZTsgIC8vLzwgbWF5IGJlIGVxdWFsIHRvIHMtPmxpbmVzaXplIG9yIHMtPmxpbmVzaXplICogMiwgZm9yIG1iYWZmCi0gICAgcHRyZGlmZl90IG1iX3V2bGluZXNpemU7Ci0KLSAgICBpbnQgbWJfeCwgbWJfeTsKLSAgICBpbnQgbWJfeHk7Ci0gICAgaW50IHJlc3luY19tYl94OwotICAgIGludCByZXN5bmNfbWJfeTsKLSAgICAvLyBpbmRleCBvZiB0aGUgZmlyc3QgTUIgb2YgdGhlIG5leHQgc2xpY2UKLSAgICBpbnQgbmV4dF9zbGljZV9pZHg7Ci0gICAgaW50IG1iX3NraXBfcnVuOwotICAgIGludCBpc19jb21wbGV4OwotCi0gICAgaW50IG1iX2ZpZWxkX2RlY29kaW5nX2ZsYWc7Ci0gICAgaW50IG1iX21iYWZmOyAgICAgICAgICAgICAgIC8vLzwgbWJfYWZmX2ZyYW1lICYmIG1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcKLQotICAgIGludCByZWR1bmRhbnRfcGljX2NvdW50OwotCi0gICAgLyoqCi0gICAgICogbnVtYmVyIG9mIG5laWdoYm9ycyAodG9wIGFuZC9vciBsZWZ0KSB0aGF0IHVzZWQgOHg4IGRjdAotICAgICAqLwotICAgIGludCBuZWlnaGJvcl90cmFuc2Zvcm1fc2l6ZTsKLQotICAgIGludCBkaXJlY3Rfc3BhdGlhbF9tdl9wcmVkOwotICAgIGludCBjb2xfcGFyaXR5OwotICAgIGludCBjb2xfZmllbGRvZmY7Ci0KLSAgICBpbnQgY2JwOwotICAgIGludCB0b3BfY2JwOwotICAgIGludCBsZWZ0X2NicDsKLQotICAgIGludCBkaXN0X3NjYWxlX2ZhY3RvclszMl07Ci0gICAgaW50IGRpc3Rfc2NhbGVfZmFjdG9yX2ZpZWxkWzJdWzMyXTsKLSAgICBpbnQgbWFwX2NvbF90b19saXN0MFsyXVsxNiArIDMyXTsKLSAgICBpbnQgbWFwX2NvbF90b19saXN0MF9maWVsZFsyXVsyXVsxNiArIDMyXTsKLQotICAgIC8qKgotICAgICAqIG51bV9yZWZfaWR4X2wwLzFfYWN0aXZlX21pbnVzMSArIDEKLSAgICAgKi8KLSAgICB1bnNpZ25lZCBpbnQgcmVmX2NvdW50WzJdOyAgICAgICAgICAvLy88IGNvdW50cyBmcmFtZXMgb3IgZmllbGRzLCBkZXBlbmRpbmcgb24gY3VycmVudCBtYiBtb2RlCi0gICAgdW5zaWduZWQgaW50IGxpc3RfY291bnQ7Ci0gICAgSDI2NFJlZiByZWZfbGlzdFsyXVs0OF07ICAgICAgICAvKio8IDAuLjE1OiBmcmFtZSByZWZzLCAxNi4uNDc6IG1iYWZmIGZpZWxkIHJlZnMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBSZW9yZGVyZWQgdmVyc2lvbiBvZiBkZWZhdWx0X3JlZl9saXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBhY2NvcmRpbmcgdG8gcGljdHVyZSByZW9yZGVyaW5nIGluIHNsaWNlIGhlYWRlciAqLwotICAgIGludCByZWYyZnJtW01BWF9TTElDRVNdWzJdWzY0XTsgICAgIC8vLzwgcmVmZXJlbmNlIHRvIGZyYW1lIG51bWJlciBsaXN0cywgdXNlZCBpbiB0aGUgbG9vcCBmaWx0ZXIsIHRoZSBmaXJzdCAyIGFyZSBmb3IgLTIsLTEKLQotICAgIGNvbnN0IHVpbnQ4X3QgKmludHJhX3BjbV9wdHI7Ci0gICAgaW50MTZfdCAqZGNfdmFsX2Jhc2U7Ci0KLSAgICB1aW50OF90ICpiaXByZWRfc2NyYXRjaHBhZDsKLSAgICB1aW50OF90ICplZGdlX2VtdV9idWZmZXI7Ci0gICAgdWludDhfdCAoKnRvcF9ib3JkZXJzWzJdKVsoMTYgKiAzKSAqIDJdOwotICAgIGludCBiaXByZWRfc2NyYXRjaHBhZF9hbGxvY2F0ZWQ7Ci0gICAgaW50IGVkZ2VfZW11X2J1ZmZlcl9hbGxvY2F0ZWQ7Ci0gICAgaW50IHRvcF9ib3JkZXJzX2FsbG9jYXRlZFsyXTsKLQotICAgIC8qKgotICAgICAqIG5vbiB6ZXJvIGNvZWZmIGNvdW50IGNhY2hlLgotICAgICAqIGlzIDY0IGlmIG5vdCBhdmFpbGFibGUuCi0gICAgICovCi0gICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIG5vbl96ZXJvX2NvdW50X2NhY2hlKVsxNSAqIDhdOwotCi0gICAgLyoqCi0gICAgICogTW90aW9uIHZlY3RvciBjYWNoZS4KLSAgICAgKi8KLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIG12X2NhY2hlKVsyXVs1ICogOF1bMl07Ci0gICAgREVDTEFSRV9BTElHTkVEKDgsICBpbnQ4X3QsIHJlZl9jYWNoZSlbMl1bNSAqIDhdOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgbXZkX2NhY2hlKVsyXVs1ICogOF1bMl07Ci0gICAgdWludDhfdCBkaXJlY3RfY2FjaGVbNSAqIDhdOwotCi0gICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQxNl90LCBzdWJfbWJfdHlwZSlbNF07Ci0KLSAgICAvLy88IGFzIGEgZGN0IGNvZWZmaWNpZW50IGlzIGludDMyX3QgaW4gaGlnaCBkZXB0aCwgd2UgbmVlZCB0byByZXNlcnZlIHR3aWNlIHRoZSBzcGFjZS4KLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIG1iKVsxNiAqIDQ4ICogMl07Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBtYl9sdW1hX2RjKVszXVsxNiAqIDJdOwotICAgIC8vLzwgYXMgbWIgaXMgYWRkcmVzc2VkIGJ5IHNjYW50YWJsZVtpXSBhbmQgc2NhbnRhYmxlIGlzIHVpbnQ4X3Qgd2UgY2FuIGVpdGhlcgotICAgIC8vLzwgY2hlY2sgdGhhdCBpIGlzIG5vdCB0b28gbGFyZ2Ugb3IgZW5zdXJlIHRoYXQgdGhlcmUgaXMgc29tZSB1bnVzZWQgc3R1ZmYgYWZ0ZXIgbWIKLSAgICBpbnQxNl90IG1iX3BhZGRpbmdbMjU2ICogMl07Ci0KLSAgICB1aW50OF90ICgqbXZkX3RhYmxlWzJdKVsyXTsKLQotICAgIC8qKgotICAgICAqIENhYmFjCi0gICAgICovCi0gICAgQ0FCQUNDb250ZXh0IGNhYmFjOwotICAgIHVpbnQ4X3QgY2FiYWNfc3RhdGVbMTAyNF07Ci0gICAgaW50IGNhYmFjX2luaXRfaWRjOwotCi0gICAgLy8gcmJzcCBidWZmZXIgdXNlZCBmb3IgdGhpcyBzbGljZQotICAgIHVpbnQ4X3QgKnJic3BfYnVmZmVyOwotICAgIHVuc2lnbmVkIGludCByYnNwX2J1ZmZlcl9zaXplOwotfSBIMjY0U2xpY2VDb250ZXh0OwotCi0vKioKLSAqIEgyNjRDb250ZXh0Ci0gKi8KLXR5cGVkZWYgc3RydWN0IEgyNjRDb250ZXh0IHsKLSAgICBBVkNsYXNzICphdl9jbGFzczsKLSAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7Ci0gICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7Ci0gICAgSDI2NERTUENvbnRleHQgaDI2NGRzcDsKLSAgICBIMjY0Q2hyb21hQ29udGV4dCBoMjY0Y2hyb21hOwotICAgIEgyNjRRcGVsQ29udGV4dCBoMjY0cXBlbDsKLSAgICBHZXRCaXRDb250ZXh0IGdiOwotCi0gICAgSDI2NFBpY3R1cmUgRFBCW0gyNjRfTUFYX1BJQ1RVUkVfQ09VTlRdOwotICAgIEgyNjRQaWN0dXJlICpjdXJfcGljX3B0cjsKLSAgICBIMjY0UGljdHVyZSBjdXJfcGljOwotICAgIEgyNjRQaWN0dXJlIGxhc3RfcGljX2Zvcl9lYzsKLQotICAgIEgyNjRTbGljZUNvbnRleHQgKnNsaWNlX2N0eDsKLSAgICBpbnQgICAgICAgICAgICBuYl9zbGljZV9jdHg7Ci0KLSAgICBpbnQgcGl4ZWxfc2hpZnQ7ICAgIC8vLzwgMCBmb3IgOC1iaXQgSDI2NCwgMSBmb3IgaGlnaC1iaXQtZGVwdGggSDI2NAotCi0gICAgLyogY29kZWQgZGltZW5zaW9ucyAtLSAxNiAqIG1iIHcvaCAqLwotICAgIGludCB3aWR0aCwgaGVpZ2h0OwotICAgIGludCBjaHJvbWFfeF9zaGlmdCwgY2hyb21hX3lfc2hpZnQ7Ci0KLSAgICAvKioKLSAgICAgKiBCYWNrdXAgZnJhbWUgcHJvcGVydGllczogbmVlZGVkLCBiZWNhdXNlIHRoZXkgY2FuIGJlIGRpZmZlcmVudAotICAgICAqIGJldHdlZW4gcmV0dXJuZWQgZnJhbWUgYW5kIGxhc3QgZGVjb2RlZCBmcmFtZS4KLSAgICAgKiovCi0gICAgaW50IGJhY2t1cF93aWR0aDsKLSAgICBpbnQgYmFja3VwX2hlaWdodDsKLSAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgYmFja3VwX3BpeF9mbXQ7Ci0KLSAgICBpbnQgZHJvcHBhYmxlOwotICAgIGludCBjb2RlZF9waWN0dXJlX251bWJlcjsKLSAgICBpbnQgbG93X2RlbGF5OwotCi0gICAgaW50IGNvbnRleHRfaW5pdGlhbGl6ZWQ7Ci0gICAgaW50IGZsYWdzOwotICAgIGludCB3b3JrYXJvdW5kX2J1Z3M7Ci0KLSAgICBpbnQ4X3QoKmludHJhNHg0X3ByZWRfbW9kZSk7Ci0gICAgSDI2NFByZWRDb250ZXh0IGhwYzsKLQotICAgIHVpbnQ4X3QgKCpub25femVyb19jb3VudClbNDhdOwotCi0jZGVmaW5lIExJU1RfTk9UX1VTRUQgLTEgLy8gRklYTUUgcmVuYW1lPwotI2RlZmluZSBQQVJUX05PVF9BVkFJTEFCTEUgLTIKLQotICAgIC8qKgotICAgICAqIGJsb2NrX29mZnNldFsgMC4uMjNdIGZvciBmcmFtZSBtYWNyb2Jsb2NrcwotICAgICAqIGJsb2NrX29mZnNldFsyNC4uNDddIGZvciBmaWVsZCBtYWNyb2Jsb2NrcwotICAgICAqLwotICAgIGludCBibG9ja19vZmZzZXRbMiAqICgxNiAqIDMpXTsKLQotICAgIHVpbnQzMl90ICptYjJiX3h5OyAgLy8gRklYTUUgYXJlIHRoZXNlIDQgYSBnb29kIGlkZWE/Ci0gICAgdWludDMyX3QgKm1iMmJyX3h5OwotICAgIGludCBiX3N0cmlkZTsgICAgICAgLy8gRklYTUUgdXNlIHMtPmI0X3N0cmlkZQotCi0KLSAgICB1bnNpZ25lZCBjdXJyZW50X3Nwc19pZDsgLy8vPCBpZCBvZiB0aGUgY3VycmVudCBTUFMKLSAgICBTUFMgc3BzOyAvLy88IGN1cnJlbnQgc3BzCi0gICAgUFBTIHBwczsgLy8vPCBjdXJyZW50IHBwcwotCi0gICAgaW50IGF1X3Bwc19pZDsgLy8vPCBwcHNfaWQgb2YgY3VycmVudCBhY2Nlc3MgdW5pdAotCi0gICAgdWludDMyX3QgZGVxdWFudDRfYnVmZmVyWzZdW1FQX01BWF9OVU0gKyAxXVsxNl07IC8vIEZJWE1FIHNob3VsZCB0aGVzZSBiZSBtb3ZlZCBkb3duPwotICAgIHVpbnQzMl90IGRlcXVhbnQ4X2J1ZmZlcls2XVtRUF9NQVhfTlVNICsgMV1bNjRdOwotICAgIHVpbnQzMl90KCpkZXF1YW50NF9jb2VmZls2XSlbMTZdOwotICAgIHVpbnQzMl90KCpkZXF1YW50OF9jb2VmZls2XSlbNjRdOwotCi0gICAgdWludDE2X3QgKnNsaWNlX3RhYmxlOyAgICAgIC8vLzwgc2xpY2VfdGFibGVfYmFzZSArIDIqbWJfc3RyaWRlICsgMQotCi0gICAgLy8gaW50ZXJsYWNpbmcgc3BlY2lmaWMgZmxhZ3MKLSAgICBpbnQgbWJfYWZmX2ZyYW1lOwotICAgIGludCBwaWN0dXJlX3N0cnVjdHVyZTsKLSAgICBpbnQgZmlyc3RfZmllbGQ7Ci0KLSAgICB1aW50OF90ICpsaXN0X2NvdW50czsgICAgICAgICAgICAgICAvLy88IEFycmF5IG9mIGxpc3RfY291bnQgcGVyIE1CIHNwZWNpZnlpbmcgdGhlIHNsaWNlIHR5cGUKLQotICAgIC8qIDB4MTAwIC0+IG5vbiBudWxsIGx1bWFfZGMsIDB4ODAvMHg0MCAtPiBub24gbnVsbCBjaHJvbWFfZGMgKGNiL2NyKSwgMHg/MCAtPiBjaHJvbWFfY2JwKDAsIDEsIDIpLCAweDA/IGx1bWFfY2JwICovCi0gICAgdWludDE2X3QgKmNicF90YWJsZTsKLQotICAgIC8qIGNocm9tYV9wcmVkX21vZGUgZm9yIGk0eDQgb3IgaTE2eDE2LCBlbHNlIDAgKi8KLSAgICB1aW50OF90ICpjaHJvbWFfcHJlZF9tb2RlX3RhYmxlOwotICAgIHVpbnQ4X3QgKCptdmRfdGFibGVbMl0pWzJdOwotICAgIHVpbnQ4X3QgKmRpcmVjdF90YWJsZTsKLQotICAgIHVpbnQ4X3QgemlnemFnX3NjYW5bMTZdOwotICAgIHVpbnQ4X3QgemlnemFnX3NjYW44eDhbNjRdOwotICAgIHVpbnQ4X3QgemlnemFnX3NjYW44eDhfY2F2bGNbNjRdOwotICAgIHVpbnQ4X3QgZmllbGRfc2NhblsxNl07Ci0gICAgdWludDhfdCBmaWVsZF9zY2FuOHg4WzY0XTsKLSAgICB1aW50OF90IGZpZWxkX3NjYW44eDhfY2F2bGNbNjRdOwotICAgIHVpbnQ4X3QgemlnemFnX3NjYW5fcTBbMTZdOwotICAgIHVpbnQ4X3QgemlnemFnX3NjYW44eDhfcTBbNjRdOwotICAgIHVpbnQ4X3QgemlnemFnX3NjYW44eDhfY2F2bGNfcTBbNjRdOwotICAgIHVpbnQ4X3QgZmllbGRfc2Nhbl9xMFsxNl07Ci0gICAgdWludDhfdCBmaWVsZF9zY2FuOHg4X3EwWzY0XTsKLSAgICB1aW50OF90IGZpZWxkX3NjYW44eDhfY2F2bGNfcTBbNjRdOwotCi0gICAgaW50IHgyNjRfYnVpbGQ7Ci0KLSAgICBpbnQgbWJfeTsKLSAgICBpbnQgbWJfaGVpZ2h0LCBtYl93aWR0aDsKLSAgICBpbnQgbWJfc3RyaWRlOwotICAgIGludCBtYl9udW07Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gVGhpbmdzIGJlbG93IGFyZSBub3QgdXNlZCBpbiB0aGUgTUIgb3IgbW9yZSBpbm5lciBjb2RlCi0KLSAgICBpbnQgbmFsX3JlZl9pZGM7Ci0gICAgaW50IG5hbF91bml0X3R5cGU7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIHRvIHBhcnNlIEFWQyB2YXJpYW50IG9mIGgyNjQKLSAgICAgKi8KLSAgICBpbnQgaXNfYXZjOyAgICAgICAgICAgLy8vPCB0aGlzIGZsYWcgaXMgIT0gMCBpZiBjb2RlYyBpcyBhdmMxCi0gICAgaW50IG5hbF9sZW5ndGhfc2l6ZTsgIC8vLzwgTnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIG5hbCBsZW5ndGggKDEsIDIgb3IgNCkKLQotICAgIGludCBiaXRfZGVwdGhfbHVtYTsgICAgICAgICAvLy88IGx1bWEgYml0IGRlcHRoIGZyb20gc3BzIHRvIGRldGVjdCBjaGFuZ2VzCi0gICAgaW50IGNocm9tYV9mb3JtYXRfaWRjOyAgICAgIC8vLzwgY2hyb21hIGZvcm1hdCBmcm9tIHNwcyB0byBkZXRlY3QgY2hhbmdlcwotCi0gICAgU1BTICpzcHNfYnVmZmVyc1tNQVhfU1BTX0NPVU5UXTsKLSAgICBQUFMgKnBwc19idWZmZXJzW01BWF9QUFNfQ09VTlRdOwotCi0gICAgaW50IGRlcXVhbnRfY29lZmZfcHBzOyAgICAgIC8vLzwgcmVpbml0IHRhYmxlcyB3aGVuIHBwcyBjaGFuZ2VzCi0KLSAgICB1aW50MTZfdCAqc2xpY2VfdGFibGVfYmFzZTsKLQotICAgIC8vIFBPQyBzdHVmZgotICAgIGludCBwb2NfbHNiOwotICAgIGludCBwb2NfbXNiOwotICAgIGludCBkZWx0YV9wb2NfYm90dG9tOwotICAgIGludCBkZWx0YV9wb2NbMl07Ci0gICAgaW50IGZyYW1lX251bTsKLSAgICBpbnQgcHJldl9wb2NfbXNiOyAgICAgICAgICAgLy8vPCBwb2NfbXNiIG9mIHRoZSBsYXN0IHJlZmVyZW5jZSBwaWMgZm9yIFBPQyB0eXBlIDAKLSAgICBpbnQgcHJldl9wb2NfbHNiOyAgICAgICAgICAgLy8vPCBwb2NfbHNiIG9mIHRoZSBsYXN0IHJlZmVyZW5jZSBwaWMgZm9yIFBPQyB0eXBlIDAKLSAgICBpbnQgZnJhbWVfbnVtX29mZnNldDsgICAgICAgLy8vPCBmb3IgUE9DIHR5cGUgMgotICAgIGludCBwcmV2X2ZyYW1lX251bV9vZmZzZXQ7ICAvLy88IGZvciBQT0MgdHlwZSAyCi0gICAgaW50IHByZXZfZnJhbWVfbnVtOyAgICAgICAgIC8vLzwgZnJhbWVfbnVtIG9mIHRoZSBsYXN0IHBpYyBmb3IgUE9DIHR5cGUgMS8yCi0KLSAgICAvKioKLSAgICAgKiBmcmFtZV9udW0gZm9yIGZyYW1lcyBvciAyICogZnJhbWVfbnVtICsgMSBmb3IgZmllbGQgcGljcy4KLSAgICAgKi8KLSAgICBpbnQgY3Vycl9waWNfbnVtOwotCi0gICAgLyoqCi0gICAgICogbWF4X2ZyYW1lX251bSBvciAyICogbWF4X2ZyYW1lX251bSBmb3IgZmllbGQgcGljcy4KLSAgICAgKi8KLSAgICBpbnQgbWF4X3BpY19udW07Ci0KLSAgICBIMjY0UmVmIGRlZmF1bHRfcmVmWzJdOwotICAgIEgyNjRQaWN0dXJlICpzaG9ydF9yZWZbMzJdOwotICAgIEgyNjRQaWN0dXJlICpsb25nX3JlZlszMl07Ci0gICAgSDI2NFBpY3R1cmUgKmRlbGF5ZWRfcGljW01BWF9ERUxBWUVEX1BJQ19DT1VOVCArIDJdOyAvLyBGSVhNRSBzaXplPwotICAgIGludCBsYXN0X3BvY3NbTUFYX0RFTEFZRURfUElDX0NPVU5UXTsKLSAgICBIMjY0UGljdHVyZSAqbmV4dF9vdXRwdXRfcGljOwotICAgIGludCBuZXh0X291dHB1dGVkX3BvYzsKLQotICAgIC8qKgotICAgICAqIG1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9ucyBidWZmZXIuCi0gICAgICovCi0gICAgTU1DTyBtbWNvW01BWF9NTUNPX0NPVU5UXTsKLSAgICBpbnQgbW1jb19pbmRleDsKLSAgICBpbnQgbW1jb19yZXNldDsKLQotICAgIGludCBsb25nX3JlZl9jb3VudDsgICAgIC8vLzwgbnVtYmVyIG9mIGFjdHVhbCBsb25nIHRlcm0gcmVmZXJlbmNlcwotICAgIGludCBzaG9ydF9yZWZfY291bnQ7ICAgIC8vLzwgbnVtYmVyIG9mIGFjdHVhbCBzaG9ydCB0ZXJtIHJlZmVyZW5jZXMKLQotICAgIC8qKgotICAgICAqIEBuYW1lIE1lbWJlcnMgZm9yIHNsaWNlIGJhc2VkIG11bHRpdGhyZWFkaW5nCi0gICAgICogQHsKLSAgICAgKi8KLSAgICAvKioKLSAgICAgKiBjdXJyZW50IHNsaWNlIG51bWJlciwgdXNlZCB0byBpbml0aWFsaXplIHNsaWNlX251bSBvZiBlYWNoIHRocmVhZC9jb250ZXh0Ci0gICAgICovCi0gICAgaW50IGN1cnJlbnRfc2xpY2U7Ci0KLSAgICAvKioKLSAgICAgKiBNYXggbnVtYmVyIG9mIHRocmVhZHMgLyBjb250ZXh0cy4KLSAgICAgKiBUaGlzIGlzIGVxdWFsIHRvIEFWQ29kZWNDb250ZXh0LnRocmVhZF9jb3VudCB1bmxlc3MKLSAgICAgKiBtdWx0aXRocmVhZGVkIGRlY29kaW5nIGlzIGltcG9zc2libGUsIGluIHdoaWNoIGNhc2UgaXQgaXMKLSAgICAgKiByZWR1Y2VkIHRvIDEuCi0gICAgICovCi0gICAgaW50IG1heF9jb250ZXh0czsKLQotICAgIGludCBzbGljZV9jb250ZXh0X2NvdW50OwotCi0gICAgLyoqCi0gICAgICogIDEgaWYgdGhlIHNpbmdsZSB0aHJlYWQgZmFsbGJhY2sgd2FybmluZyBoYXMgYWxyZWFkeSBiZWVuCi0gICAgICogIGRpc3BsYXllZCwgMCBvdGhlcndpc2UuCi0gICAgICovCi0gICAgaW50IHNpbmdsZV9kZWNvZGVfd2FybmluZzsKLQotICAgIGVudW0gQVZQaWN0dXJlVHlwZSBwaWN0X3R5cGU7Ci0KLSAgICAvKiogQH0gKi8KLQotICAgIC8qKgotICAgICAqIHBpY19zdHJ1Y3QgaW4gcGljdHVyZSB0aW1pbmcgU0VJIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBTRUlfUGljU3RydWN0VHlwZSBzZWlfcGljX3N0cnVjdDsKLQotICAgIC8qKgotICAgICAqIENvbXBsZW1lbnQgc2VpX3BpY19zdHJ1Y3QKLSAgICAgKiBTRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NIGFuZCBTRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QIGluZGljYXRlIGludGVybGFjZWQgZnJhbWVzLgotICAgICAqIEhvd2V2ZXIsIHNvZnQgdGVsZWNpbmVkIGZyYW1lcyBtYXkgaGF2ZSB0aGVzZSB2YWx1ZXMuCi0gICAgICogVGhpcyBpcyB1c2VkIGluIGFuIGF0dGVtcHQgdG8gZmxhZyBzb2Z0IHRlbGVjaW5lIHByb2dyZXNzaXZlLgotICAgICAqLwotICAgIGludCBwcmV2X2ludGVybGFjZWRfZnJhbWU7Ci0KLSAgICAvKioKLSAgICAgKiBmcmFtZV9wYWNraW5nX2FycmFuZ21lbnQgU0VJIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBpbnQgc2VpX2ZyYW1lX3BhY2tpbmdfcHJlc2VudDsKLSAgICBpbnQgZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlOwotICAgIGludCBjb250ZW50X2ludGVycHJldGF0aW9uX3R5cGU7Ci0gICAgaW50IHF1aW5jdW54X3N1YnNhbXBsaW5nOwotCi0gICAgLyoqCi0gICAgICogZGlzcGxheSBvcmllbnRhdGlvbiBTRUkgbWVzc2FnZQotICAgICAqLwotICAgIGludCBzZWlfZGlzcGxheV9vcmllbnRhdGlvbl9wcmVzZW50OwotICAgIGludCBzZWlfYW50aWNsb2Nrd2lzZV9yb3RhdGlvbjsKLSAgICBpbnQgc2VpX2hmbGlwLCBzZWlfdmZsaXA7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VyIGRhdGEgcmVnaXN0ZXJlZCBieSBSZWMuIElUVS1UIFQuMzUgU0VJCi0gICAgICovCi0gICAgaW50IHNlaV9yZWd1c2VyZGF0YV9hZmRfcHJlc2VudDsKLSAgICB1aW50OF90IGFjdGl2ZV9mb3JtYXRfZGVzY3JpcHRpb247Ci0gICAgaW50IGE1M19jYXB0aW9uX3NpemU7Ci0gICAgdWludDhfdCAqYTUzX2NhcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBCaXQgc2V0IG9mIGNsb2NrIHR5cGVzIGZvciBmaWVsZHMvZnJhbWVzIGluIHBpY3R1cmUgdGltaW5nIFNFSSBtZXNzYWdlLgotICAgICAqIEZvciBlYWNoIGZvdW5kIGN0X3R5cGUsIGFwcHJvcHJpYXRlIGJpdCBpcyBzZXQgKGUuZy4sIGJpdCAxIGZvcgotICAgICAqIGludGVybGFjZWQpLgotICAgICAqLwotICAgIGludCBzZWlfY3RfdHlwZTsKLQotICAgIC8qKgotICAgICAqIGRwYl9vdXRwdXRfZGVsYXkgaW4gcGljdHVyZSB0aW1pbmcgU0VJIG1lc3NhZ2UsIHNlZSBILjI2NCBDLjIuMgotICAgICAqLwotICAgIGludCBzZWlfZHBiX291dHB1dF9kZWxheTsKLQotICAgIC8qKgotICAgICAqIGNwYl9yZW1vdmFsX2RlbGF5IGluIHBpY3R1cmUgdGltaW5nIFNFSSBtZXNzYWdlLCBzZWUgSC4yNjQgQy4xLjIKLSAgICAgKi8KLSAgICBpbnQgc2VpX2NwYl9yZW1vdmFsX2RlbGF5OwotCi0gICAgLyoqCi0gICAgICogcmVjb3ZlcnlfZnJhbWVfY250IGZyb20gU0VJIG1lc3NhZ2UKLSAgICAgKgotICAgICAqIFNldCB0byAtMSBpZiBubyByZWNvdmVyeSBwb2ludCBTRUkgbWVzc2FnZSBmb3VuZCBvciB0byBudW1iZXIgb2YgZnJhbWVzCi0gICAgICogYmVmb3JlIHBsYXliYWNrIHN5bmNocm9uaXplcy4gRnJhbWVzIGhhdmluZyByZWNvdmVyeSBwb2ludCBhcmUga2V5Ci0gICAgICogZnJhbWVzLgotICAgICAqLwotICAgIGludCBzZWlfcmVjb3ZlcnlfZnJhbWVfY250OwotCi0gICAgLyoqCi0gICAgICogQXJlIHRoZSBTRUkgcmVjb3ZlcnkgcG9pbnRzIGxvb2tpbmcgdmFsaWQuCi0gICAgICovCi0gICAgaW50IHZhbGlkX3JlY292ZXJ5X3BvaW50OwotCi0gICAgRlBBIHNlaV9mcGE7Ci0KLSAgICAvKioKLSAgICAgKiByZWNvdmVyeV9mcmFtZSBpcyB0aGUgZnJhbWVfbnVtIGF0IHdoaWNoIHRoZSBuZXh0IGZyYW1lIHNob3VsZAotICAgICAqIGJlIGZ1bGx5IGNvbnN0cnVjdGVkLgotICAgICAqCi0gICAgICogU2V0IHRvIC0xIHdoZW4gbm90IGV4cGVjdGluZyBhIHJlY292ZXJ5IHBvaW50LgotICAgICAqLwotICAgIGludCByZWNvdmVyeV9mcmFtZTsKLQotLyoqCi0gKiBXZSBoYXZlIHNlZW4gYW4gSURSLCBzbyBhbGwgdGhlIGZvbGxvd2luZyBmcmFtZXMgaW4gY29kZWQgb3JkZXIgYXJlIGNvcnJlY3RseQotICogZGVjb2RhYmxlLgotICovCi0jZGVmaW5lIEZSQU1FX1JFQ09WRVJFRF9JRFIgICgxIDw8IDApCi0vKioKLSAqIFN1ZmZpY2llbnQgbnVtYmVyIG9mIGZyYW1lcyBoYXZlIGJlZW4gZGVjb2RlZCBzaW5jZSBhIFNFSSByZWNvdmVyeSBwb2ludCwKLSAqIHNvIGFsbCB0aGUgZm9sbG93aW5nIGZyYW1lcyBpbiBwcmVzZW50YXRpb24gb3JkZXIgYXJlIGNvcnJlY3QuCi0gKi8KLSNkZWZpbmUgRlJBTUVfUkVDT1ZFUkVEX1NFSSAgKDEgPDwgMSkKLQotICAgIGludCBmcmFtZV9yZWNvdmVyZWQ7ICAgIC8vLzwgSW5pdGlhbCBmcmFtZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlY292ZXJlZAotCi0gICAgaW50IGhhc19yZWNvdmVyeV9wb2ludDsKLQotICAgIGludCBtaXNzaW5nX2ZpZWxkczsKLQotLyogZm9yIGZyYW1lIHRocmVhZGluZywgdGhpcyBpcyBzZXQgdG8gMQotICAgICAqIGFmdGVyIGZpbmlzaF9zZXR1cCgpIGhhcyBiZWVuIGNhbGxlZCwgc28gd2UgY2Fubm90IG1vZGlmeQotICAgICAqIHNvbWUgY29udGV4dCBwcm9wZXJ0aWVzICh3aGljaCBhcmUgc3VwcG9zZWQgdG8gc3RheSBjb25zdGFudCBiZXR3ZWVuCi0gICAgICogc2xpY2VzKSBhbnltb3JlICovCi0gICAgaW50IHNldHVwX2ZpbmlzaGVkOwotCi0gICAgLy8gVGltZXN0YW1wIHN0dWZmCi0gICAgaW50IHNlaV9idWZmZXJpbmdfcGVyaW9kX3ByZXNlbnQ7ICAgLy8vPCBCdWZmZXJpbmcgcGVyaW9kIFNFSSBmbGFnCi0gICAgaW50IGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbMzJdOyAgLy8vPCBJbml0aWFsIHRpbWVzdGFtcHMgZm9yIENQQnMKLQotICAgIGludCBjdXJfY2hyb21hX2Zvcm1hdF9pZGM7Ci0gICAgaW50IGN1cl9iaXRfZGVwdGhfbHVtYTsKLSAgICBpbnQxNl90IHNsaWNlX3Jvd1tNQVhfU0xJQ0VTXTsgLy8vPCB0byBkZXRlY3Qgd2hlbiBNQVhfU0xJQ0VTIGlzIHRvbyBsb3cKLQotICAgIHVpbnQ4X3QgcGFyc2VfaGlzdG9yeVs2XTsKLSAgICBpbnQgcGFyc2VfaGlzdG9yeV9jb3VudDsKLSAgICBpbnQgcGFyc2VfbGFzdF9tYjsKLQotICAgIGludCBlbmFibGVfZXI7Ci0KLSAgICBBVkJ1ZmZlclBvb2wgKnFzY2FsZV90YWJsZV9wb29sOwotICAgIEFWQnVmZmVyUG9vbCAqbWJfdHlwZV9wb29sOwotICAgIEFWQnVmZmVyUG9vbCAqbW90aW9uX3ZhbF9wb29sOwotICAgIEFWQnVmZmVyUG9vbCAqcmVmX2luZGV4X3Bvb2w7Ci0KLSAgICAvKiBNb3Rpb24gRXN0aW1hdGlvbiAqLwotICAgIHFwZWxfbWNfZnVuYyAoKnFwZWxfcHV0KVsxNl07Ci0gICAgcXBlbF9tY19mdW5jICgqcXBlbF9hdmcpWzE2XTsKLQotICAgIC8qR3JlZW4gTWV0YWRhdGEgKi8KLSAgICBHcmVlbk1ldGFEYXRhIHNlaV9ncmVlbl9tZXRhZGF0YTsKLQotfSBIMjY0Q29udGV4dDsKLQotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2NF9jaHJvbWFfcXBbN11bUVBfTUFYX05VTSArIDFdOyAvLy88IE9uZSBjaHJvbWEgcXAgdGFibGUgZm9yIGVhY2ggcG9zc2libGUgYml0IGRlcHRoICg4LTE0KS4KLWV4dGVybiBjb25zdCB1aW50MTZfdCBmZl9oMjY0X21iX3NpemVzWzRdOwotCi0vKioKLSAqIERlY29kZSBTRUkKLSAqLwotaW50IGZmX2gyNjRfZGVjb2RlX3NlaShIMjY0Q29udGV4dCAqaCk7Ci0KLS8qKgotICogRGVjb2RlIFNQUwotICovCi1pbnQgZmZfaDI2NF9kZWNvZGVfc2VxX3BhcmFtZXRlcl9zZXQoSDI2NENvbnRleHQgKmgsIGludCBpZ25vcmVfdHJ1bmNhdGlvbik7Ci0KLS8qKgotICogY29tcHV0ZSBwcm9maWxlIGZyb20gc3BzCi0gKi8KLWludCBmZl9oMjY0X2dldF9wcm9maWxlKFNQUyAqc3BzKTsKLQotLyoqCi0gKiBEZWNvZGUgUFBTCi0gKi8KLWludCBmZl9oMjY0X2RlY29kZV9waWN0dXJlX3BhcmFtZXRlcl9zZXQoSDI2NENvbnRleHQgKmgsIGludCBiaXRfbGVuZ3RoKTsKLQotLyoqCi0gKiBEZWNvZGUgYSBuZXR3b3JrIGFic3RyYWN0aW9uIGxheWVyIHVuaXQuCi0gKiBAcGFyYW0gY29uc3VtZWQgaXMgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIGFzIGlucHV0Ci0gKiBAcGFyYW0gbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5Ci0gKiBAcGFyYW0gZHN0X2xlbmd0aCBpcyB0aGUgbnVtYmVyIG9mIGRlY29kZWQgYnl0ZXMgRklYTUUgaGVyZQotICogICAgICAgICAgICAgICAgICAgb3IgYSBkZWNvZGUgcmJzcCB0YWlsaW5nPwotICogQHJldHVybiBkZWNvZGVkIGJ5dGVzLCBtaWdodCBiZSBzcmMrMSBpZiBubyBlc2NhcGVzCi0gKi8KLWNvbnN0IHVpbnQ4X3QgKmZmX2gyNjRfZGVjb2RlX25hbChIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRzdF9sZW5ndGgsIGludCAqY29uc3VtZWQsIGludCBsZW5ndGgpOwotCi0vKioKLSAqIEZyZWUgYW55IGRhdGEgdGhhdCBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZCBpbiB0aGUgSDI2NCBjb250ZXh0Ci0gKiBsaWtlIFNQUywgUFBTIGV0Yy4KLSAqLwotdm9pZCBmZl9oMjY0X2ZyZWVfY29udGV4dChIMjY0Q29udGV4dCAqaCk7Ci0KLS8qKgotICogUmVjb25zdHJ1Y3QgYml0c3RyZWFtIHNsaWNlX3R5cGUuCi0gKi8KLWludCBmZl9oMjY0X2dldF9zbGljZV90eXBlKGNvbnN0IEgyNjRTbGljZUNvbnRleHQgKnNsKTsKLQotLyoqCi0gKiBBbGxvY2F0ZSB0YWJsZXMuCi0gKiBuZWVkcyB3aWR0aC9oZWlnaHQKLSAqLwotaW50IGZmX2gyNjRfYWxsb2NfdGFibGVzKEgyNjRDb250ZXh0ICpoKTsKLQotaW50IGZmX2gyNjRfZGVjb2RlX3JlZl9waWNfbGlzdF9yZW9yZGVyaW5nKEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Ci12b2lkIGZmX2gyNjRfZmlsbF9tYmFmZl9yZWZfbGlzdChIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpOwotdm9pZCBmZl9oMjY0X3JlbW92ZV9hbGxfcmVmcyhIMjY0Q29udGV4dCAqaCk7Ci0KLS8qKgotICogRXhlY3V0ZSB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgbWFya2luZyAobWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb25zKS4KLSAqLwotaW50IGZmX2gyNjRfZXhlY3V0ZV9yZWZfcGljX21hcmtpbmcoSDI2NENvbnRleHQgKmgsIE1NQ08gKm1tY28sIGludCBtbWNvX2NvdW50KTsKLQotaW50IGZmX2gyNjRfZGVjb2RlX3JlZl9waWNfbWFya2luZyhIMjY0Q29udGV4dCAqaCwgR2V0Qml0Q29udGV4dCAqZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF9zbGljZSk7Ci0KLWludCBmZl9nZW5lcmF0ZV9zbGlkaW5nX3dpbmRvd19tbWNvcyhIMjY0Q29udGV4dCAqaCwgaW50IGZpcnN0X3NsaWNlKTsKLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgdG9wICYgbGVmdCBibG9ja3MgYXJlIGF2YWlsYWJsZSBpZiBuZWVkZWQgJiBjaGFuZ2UgdGhlCi0gKiBkYyBtb2RlIHNvIGl0IG9ubHkgdXNlcyB0aGUgYXZhaWxhYmxlIGJsb2Nrcy4KLSAqLwotaW50IGZmX2gyNjRfY2hlY2tfaW50cmE0eDRfcHJlZF9tb2RlKGNvbnN0IEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Ci0KLS8qKgotICogQ2hlY2sgaWYgdGhlIHRvcCAmIGxlZnQgYmxvY2tzIGFyZSBhdmFpbGFibGUgaWYgbmVlZGVkICYgY2hhbmdlIHRoZQotICogZGMgbW9kZSBzbyBpdCBvbmx5IHVzZXMgdGhlIGF2YWlsYWJsZSBibG9ja3MuCi0gKi8KLWludCBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUsIGludCBpc19jaHJvbWEpOwotCi12b2lkIGZmX2gyNjRfaGxfZGVjb2RlX21iKGNvbnN0IEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Ci1pbnQgZmZfaDI2NF9kZWNvZGVfZXh0cmFkYXRhKEgyNjRDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKTsKLWludCBmZl9oMjY0X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Ci12b2lkIGZmX2gyNjRfZGVjb2RlX2luaXRfdmxjKHZvaWQpOwotCi0vKioKLSAqIERlY29kZSBhIG1hY3JvYmxvY2sKLSAqIEByZXR1cm4gMCBpZiBPSywgRVJfQUNfRVJST1IgLyBFUl9EQ19FUlJPUiAvIEVSX01WX0VSUk9SIG9uIGVycm9yCi0gKi8KLWludCBmZl9oMjY0X2RlY29kZV9tYl9jYXZsYyhjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpOwotCi0vKioKLSAqIERlY29kZSBhIENBQkFDIGNvZGVkIG1hY3JvYmxvY2sKLSAqIEByZXR1cm4gMCBpZiBPSywgRVJfQUNfRVJST1IgLyBFUl9EQ19FUlJPUiAvIEVSX01WX0VSUk9SIG9uIGVycm9yCi0gKi8KLWludCBmZl9oMjY0X2RlY29kZV9tYl9jYWJhYyhjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpOwotCi12b2lkIGZmX2gyNjRfaW5pdF9jYWJhY19zdGF0ZXMoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsKTsKLQotdm9pZCBmZl9oMjY0X2luaXRfZGVxdWFudF90YWJsZXMoSDI2NENvbnRleHQgKmgpOwotCi12b2lkIGZmX2gyNjRfZGlyZWN0X2Rpc3Rfc2NhbGVfZmFjdG9yKGNvbnN0IEgyNjRDb250ZXh0ICpjb25zdCBoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Ci12b2lkIGZmX2gyNjRfZGlyZWN0X3JlZl9saXN0X2luaXQoY29uc3QgSDI2NENvbnRleHQgKmNvbnN0IGgsIEgyNjRTbGljZUNvbnRleHQgKnNsKTsKLXZvaWQgZmZfaDI2NF9wcmVkX2RpcmVjdF9tb3Rpb24oY29uc3QgSDI2NENvbnRleHQgKmNvbnN0IGgsIEgyNjRTbGljZUNvbnRleHQgKnNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm1iX3R5cGUpOwotCi12b2lkIGZmX2gyNjRfZmlsdGVyX21iX2Zhc3QoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsLCBpbnQgbWJfeCwgaW50IG1iX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW1nX3ksIHVpbnQ4X3QgKmltZ19jYiwgdWludDhfdCAqaW1nX2NyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsaW5lc2l6ZSwgdW5zaWduZWQgaW50IHV2bGluZXNpemUpOwotdm9pZCBmZl9oMjY0X2ZpbHRlcl9tYihjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsIGludCBtYl94LCBpbnQgbWJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW1nX3ksIHVpbnQ4X3QgKmltZ19jYiwgdWludDhfdCAqaW1nX2NyLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGluZXNpemUsIHVuc2lnbmVkIGludCB1dmxpbmVzaXplKTsKLQotLyoqCi0gKiBSZXNldCBTRUkgdmFsdWVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lLgotICoKLSAqIEBwYXJhbSBoIEguMjY0IGNvbnRleHQuCi0gKi8KLXZvaWQgZmZfaDI2NF9yZXNldF9zZWkoSDI2NENvbnRleHQgKmgpOwotCi0vKioKLSAqIEdldCBzdGVyZW9fbW9kZSBzdHJpbmcgZnJvbSB0aGUgaDI2NCBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50Ci0gKiBAcGFyYW0gaCBILjI2NCBjb250ZXh0LgotICovCi1jb25zdCBjaGFyKiBmZl9oMjY0X3NlaV9zdGVyZW9fbW9kZShIMjY0Q29udGV4dCAqaCk7Ci0KLS8qCi0gKiBvLW8gby1vCi0gKiAgLyAvIC8KLSAqIG8tbyBvLW8KLSAqICAsLS0tJwotICogby1vIG8tbwotICogIC8gLyAvCi0gKiBvLW8gby1vCi0gKi8KLQotLyogU2Nhbjggb3JnYW5pemF0aW9uOgotICogICAgMCAxIDIgMyA0IDUgNiA3Ci0gKiAwICBEWSAgICB5IHkgeSB5IHkKLSAqIDEgICAgICAgIHkgWSBZIFkgWQotICogMiAgICAgICAgeSBZIFkgWSBZCi0gKiAzICAgICAgICB5IFkgWSBZIFkKLSAqIDQgICAgICAgIHkgWSBZIFkgWQotICogNSAgRFUgICAgdSB1IHUgdSB1Ci0gKiA2ICAgICAgICB1IFUgVSBVIFUKLSAqIDcgICAgICAgIHUgVSBVIFUgVQotICogOCAgICAgICAgdSBVIFUgVSBVCi0gKiA5ICAgICAgICB1IFUgVSBVIFUKLSAqIDEwIERWICAgIHYgdiB2IHYgdgotICogMTEgICAgICAgdiBWIFYgViBWCi0gKiAxMiAgICAgICB2IFYgViBWIFYKLSAqIDEzICAgICAgIHYgViBWIFYgVgotICogMTQgICAgICAgdiBWIFYgViBWCi0gKiBEWS9EVS9EViBhcmUgZm9yIGx1bWEvY2hyb21hIERDLgotICovCi0KLSNkZWZpbmUgTFVNQV9EQ19CTE9DS19JTkRFWCAgIDQ4Ci0jZGVmaW5lIENIUk9NQV9EQ19CTE9DS19JTkRFWCA0OQotCi0vLyBUaGlzIHRhYmxlIG11c3QgYmUgaGVyZSBiZWNhdXNlIHNjYW44W2NvbnN0YW50XSBtdXN0IGJlIGtub3duIGF0IGNvbXBpbGV0aW1lCi1zdGF0aWMgY29uc3QgdWludDhfdCBzY2FuOFsxNiAqIDMgKyAzXSA9IHsKLSAgICA0ICsgIDEgKiA4LCA1ICsgIDEgKiA4LCA0ICsgIDIgKiA4LCA1ICsgIDIgKiA4LAotICAgIDYgKyAgMSAqIDgsIDcgKyAgMSAqIDgsIDYgKyAgMiAqIDgsIDcgKyAgMiAqIDgsCi0gICAgNCArICAzICogOCwgNSArICAzICogOCwgNCArICA0ICogOCwgNSArICA0ICogOCwKLSAgICA2ICsgIDMgKiA4LCA3ICsgIDMgKiA4LCA2ICsgIDQgKiA4LCA3ICsgIDQgKiA4LAotICAgIDQgKyAgNiAqIDgsIDUgKyAgNiAqIDgsIDQgKyAgNyAqIDgsIDUgKyAgNyAqIDgsCi0gICAgNiArICA2ICogOCwgNyArICA2ICogOCwgNiArICA3ICogOCwgNyArICA3ICogOCwKLSAgICA0ICsgIDggKiA4LCA1ICsgIDggKiA4LCA0ICsgIDkgKiA4LCA1ICsgIDkgKiA4LAotICAgIDYgKyAgOCAqIDgsIDcgKyAgOCAqIDgsIDYgKyAgOSAqIDgsIDcgKyAgOSAqIDgsCi0gICAgNCArIDExICogOCwgNSArIDExICogOCwgNCArIDEyICogOCwgNSArIDEyICogOCwKLSAgICA2ICsgMTEgKiA4LCA3ICsgMTEgKiA4LCA2ICsgMTIgKiA4LCA3ICsgMTIgKiA4LAotICAgIDQgKyAxMyAqIDgsIDUgKyAxMyAqIDgsIDQgKyAxNCAqIDgsIDUgKyAxNCAqIDgsCi0gICAgNiArIDEzICogOCwgNyArIDEzICogOCwgNiArIDE0ICogOCwgNyArIDE0ICogOCwKLSAgICAwICsgIDAgKiA4LCAwICsgIDUgKiA4LCAwICsgMTAgKiA4CisgICAgLy8gQS4zOiBpbiB0YWJsZSBBLTEgdGhlIGhpZ2hlc3QgbGV2ZWwgYWxsb3dzIGEgTWF4RlMgb2YgMTM5MjY0LgorICAgIEgyNjRfTUFYX01CX1BJQ19TSVpFID0gMTM5MjY0LAorICAgIC8vIEEuMy4xLCBBLjMuMjogUGljV2lkdGhJbk1icyBhbmQgUGljSGVpZ2h0SW5NYnMgYXJlIGNvbnN0cmFpbmVkCisgICAgLy8gdG8gYmUgbm90IGdyZWF0ZXIgdGhhbiBzcXJ0KE1heEZTICogOCkuICBIZW5jZSBoZWlnaHQvd2lkdGggYXJlCisgICAgLy8gYm91bmRlZCBhYm92ZSBieSBzcXJ0KDEzOTI2NCAqIDgpID0gMTA1NS41IG1hY3JvYmxvY2tzLgorICAgIEgyNjRfTUFYX01CX1dJRFRIICAgID0gMTA1NSwKKyAgICBIMjY0X01BWF9NQl9IRUlHSFQgICA9IDEwNTUsCisgICAgSDI2NF9NQVhfV0lEVEggICAgICAgPSBIMjY0X01BWF9NQl9XSURUSCAgKiAxNiwKKyAgICBIMjY0X01BWF9IRUlHSFQgICAgICA9IEgyNjRfTUFYX01CX0hFSUdIVCAqIDE2LAogfTsKIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgcGFjazE2dG8zMih1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQotewotI2lmIEhBVkVfQklHRU5ESUFOCi0gICAgcmV0dXJuIChiICYgMHhGRkZGKSArIChhIDw8IDE2KTsKLSNlbHNlCi0gICAgcmV0dXJuIChhICYgMHhGRkZGKSArIChiIDw8IDE2KTsKLSNlbmRpZgotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50MTZfdCBwYWNrOHRvMTYodW5zaWduZWQgYSwgdW5zaWduZWQgYikKLXsKLSNpZiBIQVZFX0JJR0VORElBTgotICAgIHJldHVybiAoYiAmIDB4RkYpICsgKGEgPDwgOCk7Ci0jZWxzZQotICAgIHJldHVybiAoYSAmIDB4RkYpICsgKGIgPDwgOCk7Ci0jZW5kaWYKLX0KLQotLyoqCi0gKiBHZXQgdGhlIGNocm9tYSBxcC4KLSAqLwotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9jaHJvbWFfcXAoY29uc3QgSDI2NENvbnRleHQgKmgsIGludCB0LCBpbnQgcXNjYWxlKQotewotICAgIHJldHVybiBoLT5wcHMuY2hyb21hX3FwX3RhYmxlW3RdW3FzY2FsZV07Ci19Ci0KLS8qKgotICogR2V0IHRoZSBwcmVkaWN0ZWQgaW50cmE0eDQgcHJlZGljdGlvbiBtb2RlLgotICovCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgcHJlZF9pbnRyYV9tb2RlKGNvbnN0IEgyNjRDb250ZXh0ICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCwgaW50IG4pCi17Ci0gICAgY29uc3QgaW50IGluZGV4OCA9IHNjYW44W25dOwotICAgIGNvbnN0IGludCBsZWZ0ICAgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW2luZGV4OCAtIDFdOwotICAgIGNvbnN0IGludCB0b3AgICAgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW2luZGV4OCAtIDhdOwotICAgIGNvbnN0IGludCBtaW4gICAgPSBGRk1JTihsZWZ0LCB0b3ApOwotCi0gICAgZmZfdGxvZyhoLT5hdmN0eCwgIm1vZGU6JWQgJWQgbWluOiVkXG4iLCBsZWZ0LCB0b3AsIG1pbik7Ci0KLSAgICBpZiAobWluIDwgMCkKLSAgICAgICAgcmV0dXJuIERDX1BSRUQ7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gbWluOwotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHdyaXRlX2JhY2tfaW50cmFfcHJlZF9tb2RlKGNvbnN0IEgyNjRDb250ZXh0ICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCkKLXsKLSAgICBpbnQ4X3QgKmk0eDQgICAgICAgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlICsgaC0+bWIyYnJfeHlbc2wtPm1iX3h5XTsKLSAgICBpbnQ4X3QgKmk0eDRfY2FjaGUgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlOwotCi0gICAgQVZfQ09QWTMyKGk0eDQsIGk0eDRfY2FjaGUgKyA0ICsgOCAqIDQpOwotICAgIGk0eDRbNF0gPSBpNHg0X2NhY2hlWzcgKyA4ICogM107Ci0gICAgaTR4NFs1XSA9IGk0eDRfY2FjaGVbNyArIDggKiAyXTsKLSAgICBpNHg0WzZdID0gaTR4NF9jYWNoZVs3ICsgOCAqIDFdOwotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHdyaXRlX2JhY2tfbm9uX3plcm9fY291bnQoY29uc3QgSDI2NENvbnRleHQgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wpCi17Ci0gICAgY29uc3QgaW50IG1iX3h5ICAgID0gc2wtPm1iX3h5OwotICAgIHVpbnQ4X3QgKm5ueiAgICAgICA9IGgtPm5vbl96ZXJvX2NvdW50W21iX3h5XTsKLSAgICB1aW50OF90ICpubnpfY2FjaGUgPSBzbC0+bm9uX3plcm9fY291bnRfY2FjaGU7Ci0KLSAgICBBVl9DT1BZMzIoJm5uelsgMF0sICZubnpfY2FjaGVbNCArIDggKiAxXSk7Ci0gICAgQVZfQ09QWTMyKCZubnpbIDRdLCAmbm56X2NhY2hlWzQgKyA4ICogMl0pOwotICAgIEFWX0NPUFkzMigmbm56WyA4XSwgJm5uel9jYWNoZVs0ICsgOCAqIDNdKTsKLSAgICBBVl9DT1BZMzIoJm5uelsxMl0sICZubnpfY2FjaGVbNCArIDggKiA0XSk7Ci0gICAgQVZfQ09QWTMyKCZubnpbMTZdLCAmbm56X2NhY2hlWzQgKyA4ICogNl0pOwotICAgIEFWX0NPUFkzMigmbm56WzIwXSwgJm5uel9jYWNoZVs0ICsgOCAqIDddKTsKLSAgICBBVl9DT1BZMzIoJm5uelszMl0sICZubnpfY2FjaGVbNCArIDggKiAxMV0pOwotICAgIEFWX0NPUFkzMigmbm56WzM2XSwgJm5uel9jYWNoZVs0ICsgOCAqIDEyXSk7Ci0KLSAgICBpZiAoIWgtPmNocm9tYV95X3NoaWZ0KSB7Ci0gICAgICAgIEFWX0NPUFkzMigmbm56WzI0XSwgJm5uel9jYWNoZVs0ICsgOCAqIDhdKTsKLSAgICAgICAgQVZfQ09QWTMyKCZubnpbMjhdLCAmbm56X2NhY2hlWzQgKyA4ICogOV0pOwotICAgICAgICBBVl9DT1BZMzIoJm5uels0MF0sICZubnpfY2FjaGVbNCArIDggKiAxM10pOwotICAgICAgICBBVl9DT1BZMzIoJm5uels0NF0sICZubnpfY2FjaGVbNCArIDggKiAxNF0pOwotICAgIH0KLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB3cml0ZV9iYWNrX21vdGlvbl9saXN0KGNvbnN0IEgyNjRDb250ZXh0ICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTbGljZUNvbnRleHQgKnNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl94eSwgaW50IGI4X3h5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlLCBpbnQgbGlzdCkKLXsKLSAgICBpbnQxNl90KCptdl9kc3QpWzJdID0gJmgtPmN1cl9waWMubW90aW9uX3ZhbFtsaXN0XVtiX3h5XTsKLSAgICBpbnQxNl90KCptdl9zcmMpWzJdID0gJnNsLT5tdl9jYWNoZVtsaXN0XVtzY2FuOFswXV07Ci0gICAgQVZfQ09QWTEyOChtdl9kc3QgKyAwICogYl9zdHJpZGUsIG12X3NyYyArIDggKiAwKTsKLSAgICBBVl9DT1BZMTI4KG12X2RzdCArIDEgKiBiX3N0cmlkZSwgbXZfc3JjICsgOCAqIDEpOwotICAgIEFWX0NPUFkxMjgobXZfZHN0ICsgMiAqIGJfc3RyaWRlLCBtdl9zcmMgKyA4ICogMik7Ci0gICAgQVZfQ09QWTEyOChtdl9kc3QgKyAzICogYl9zdHJpZGUsIG12X3NyYyArIDggKiAzKTsKLSAgICBpZiAoQ0FCQUMoaCkpIHsKLSAgICAgICAgdWludDhfdCAoKm12ZF9kc3QpWzJdID0gJnNsLT5tdmRfdGFibGVbbGlzdF1bRk1PID8gOCAqIHNsLT5tYl94eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGgtPm1iMmJyX3h5W3NsLT5tYl94eV1dOwotICAgICAgICB1aW50OF90KCptdmRfc3JjKVsyXSAgPSAmc2wtPm12ZF9jYWNoZVtsaXN0XVtzY2FuOFswXV07Ci0gICAgICAgIGlmIChJU19TS0lQKG1iX3R5cGUpKSB7Ci0gICAgICAgICAgICBBVl9aRVJPMTI4KG12ZF9kc3QpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVZfQ09QWTY0KG12ZF9kc3QsIG12ZF9zcmMgKyA4ICogMyk7Ci0gICAgICAgICAgICBBVl9DT1BZMTYobXZkX2RzdCArIDMgKyAzLCBtdmRfc3JjICsgMyArIDggKiAwKTsKLSAgICAgICAgICAgIEFWX0NPUFkxNihtdmRfZHN0ICsgMyArIDIsIG12ZF9zcmMgKyAzICsgOCAqIDEpOwotICAgICAgICAgICAgQVZfQ09QWTE2KG12ZF9kc3QgKyAzICsgMSwgbXZkX3NyYyArIDMgKyA4ICogMik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIGludDhfdCAqcmVmX2luZGV4ID0gJmgtPmN1cl9waWMucmVmX2luZGV4W2xpc3RdW2I4X3h5XTsKLSAgICAgICAgaW50OF90ICpyZWZfY2FjaGUgPSBzbC0+cmVmX2NhY2hlW2xpc3RdOwotICAgICAgICByZWZfaW5kZXhbMCArIDAgKiAyXSA9IHJlZl9jYWNoZVtzY2FuOFswXV07Ci0gICAgICAgIHJlZl9pbmRleFsxICsgMCAqIDJdID0gcmVmX2NhY2hlW3NjYW44WzRdXTsKLSAgICAgICAgcmVmX2luZGV4WzAgKyAxICogMl0gPSByZWZfY2FjaGVbc2NhbjhbOF1dOwotICAgICAgICByZWZfaW5kZXhbMSArIDEgKiAyXSA9IHJlZl9jYWNoZVtzY2FuOFsxMl1dOwotICAgIH0KLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB3cml0ZV9iYWNrX21vdGlvbihjb25zdCBIMjY0Q29udGV4dCAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlKQotewotICAgIGNvbnN0IGludCBiX3N0cmlkZSAgICAgID0gaC0+Yl9zdHJpZGU7Ci0gICAgY29uc3QgaW50IGJfeHkgID0gNCAqIHNsLT5tYl94ICsgNCAqIHNsLT5tYl95ICogaC0+Yl9zdHJpZGU7IC8vIHRyeSBtYjJiKDgpX3h5Ci0gICAgY29uc3QgaW50IGI4X3h5ID0gNCAqIHNsLT5tYl94eTsKLQotICAgIGlmIChVU0VTX0xJU1QobWJfdHlwZSwgMCkpIHsKLSAgICAgICAgd3JpdGVfYmFja19tb3Rpb25fbGlzdChoLCBzbCwgYl9zdHJpZGUsIGJfeHksIGI4X3h5LCBtYl90eXBlLCAwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+Y3VyX3BpYy5yZWZfaW5kZXhbMF1bYjhfeHldLAotICAgICAgICAgICAgICAgICAgICAgICAyLCAyLCAyLCAodWludDhfdClMSVNUX05PVF9VU0VELCAxKTsKLSAgICB9Ci0gICAgaWYgKFVTRVNfTElTVChtYl90eXBlLCAxKSkKLSAgICAgICAgd3JpdGVfYmFja19tb3Rpb25fbGlzdChoLCBzbCwgYl9zdHJpZGUsIGJfeHksIGI4X3h5LCBtYl90eXBlLCAxKTsKLQotICAgIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgQ0FCQUMoaCkpIHsKLSAgICAgICAgaWYgKElTXzhYOChtYl90eXBlKSkgewotICAgICAgICAgICAgdWludDhfdCAqZGlyZWN0X3RhYmxlID0gJmgtPmRpcmVjdF90YWJsZVs0ICogc2wtPm1iX3h5XTsKLSAgICAgICAgICAgIGRpcmVjdF90YWJsZVsxXSA9IHNsLT5zdWJfbWJfdHlwZVsxXSA+PiAxOwotICAgICAgICAgICAgZGlyZWN0X3RhYmxlWzJdID0gc2wtPnN1Yl9tYl90eXBlWzJdID4+IDE7Ci0gICAgICAgICAgICBkaXJlY3RfdGFibGVbM10gPSBzbC0+c3ViX21iX3R5cGVbM10gPj4gMTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9kY3Q4eDhfYWxsb3dlZChjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpCi17Ci0gICAgaWYgKGgtPnNwcy5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKQotICAgICAgICByZXR1cm4gIShBVl9STjY0QShzbC0+c3ViX21iX3R5cGUpICYKLSAgICAgICAgICAgICAgICAgKChNQl9UWVBFXzE2eDggfCBNQl9UWVBFXzh4MTYgfCBNQl9UWVBFXzh4OCkgKgotICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMTAwMDEwMDAxVUxMKSk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gIShBVl9STjY0QShzbC0+c3ViX21iX3R5cGUpICYKLSAgICAgICAgICAgICAgICAgKChNQl9UWVBFXzE2eDggfCBNQl9UWVBFXzh4MTYgfCBNQl9UWVBFXzh4OCB8IE1CX1RZUEVfRElSRUNUMikgKgotICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMTAwMDEwMDAxVUxMKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGZpbmRfc3RhcnRfY29kZShjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfaW5kZXgsIGludCBuZXh0X2F2YykKLXsKLSAgICB1aW50MzJfdCBzdGF0ZSA9IC0xOwotCi0gICAgYnVmX2luZGV4ID0gYXZwcml2X2ZpbmRfc3RhcnRfY29kZShidWYgKyBidWZfaW5kZXgsIGJ1ZiArIG5leHRfYXZjICsgMSwgJnN0YXRlKSAtIGJ1ZiAtIDE7Ci0KLSAgICByZXR1cm4gRkZNSU4oYnVmX2luZGV4LCBidWZfc2l6ZSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGdldF9hdmNfbmFsc2l6ZShIMjY0Q29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBpbnQgKmJ1Zl9pbmRleCkKLXsKLSAgICBpbnQgaSwgbmFsc2l6ZSA9IDA7Ci0KLSAgICBpZiAoKmJ1Zl9pbmRleCA+PSBidWZfc2l6ZSAtIGgtPm5hbF9sZW5ndGhfc2l6ZSkgewotICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBidWZmZXIgaXMgcmVhY2hlZCwgcmVmaWxsIGl0LgotICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBoLT5uYWxfbGVuZ3RoX3NpemU7IGkrKykKLSAgICAgICAgbmFsc2l6ZSA9ICgodW5zaWduZWQpbmFsc2l6ZSA8PCA4KSB8IGJ1ZlsoKmJ1Zl9pbmRleCkrK107Ci0gICAgaWYgKG5hbHNpemUgPD0gMCB8fCBuYWxzaXplID4gYnVmX3NpemUgLSAqYnVmX2luZGV4KSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkFWQzogbmFsIHNpemUgJWRcbiIsIG5hbHNpemUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbHNpemU7Ci19Ci0KLWludCBmZl9oMjY0X2ZpZWxkX2VuZChIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsIGludCBpbl9zZXR1cCk7Ci0KLWludCBmZl9oMjY0X3JlZl9waWN0dXJlKEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqZHN0LCBIMjY0UGljdHVyZSAqc3JjKTsKLXZvaWQgZmZfaDI2NF91bnJlZl9waWN0dXJlKEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqcGljKTsKLQotaW50IGZmX2gyNjRfc2xpY2VfY29udGV4dF9pbml0KEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Ci0KLXZvaWQgZmZfaDI2NF9kcmF3X2hvcml6X2JhbmQoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsLCBpbnQgeSwgaW50IGhlaWdodCk7Ci1pbnQgZmZfaW5pdF9wb2MoSDI2NENvbnRleHQgKmgsIGludCBwaWNfZmllbGRfcG9jWzJdLCBpbnQgKnBpY19wb2MpOwotaW50IGZmX3ByZWRfd2VpZ2h0X3RhYmxlKEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Ci1pbnQgZmZfc2V0X3JlZl9jb3VudChIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpOwotCi1pbnQgZmZfaDI2NF9kZWNvZGVfc2xpY2VfaGVhZGVyKEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Ci0jZGVmaW5lIFNMSUNFX1NJTkdMRVRIUkVBRCAxCi0jZGVmaW5lIFNMSUNFX1NLSVBFRCAyCi0KLWludCBmZl9oMjY0X2V4ZWN1dGVfZGVjb2RlX3NsaWNlcyhIMjY0Q29udGV4dCAqaCwgdW5zaWduZWQgY29udGV4dF9jb3VudCk7Ci1pbnQgZmZfaDI2NF91cGRhdGVfdGhyZWFkX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkNvZGVjQ29udGV4dCAqc3JjKTsKLQotdm9pZCBmZl9oMjY0X2ZsdXNoX2NoYW5nZShIMjY0Q29udGV4dCAqaCk7Ci0KLXZvaWQgZmZfaDI2NF9mcmVlX3RhYmxlcyhIMjY0Q29udGV4dCAqaCk7Ci0KLXZvaWQgZmZfaDI2NF9zZXRfZXJwaWMoRVJQaWN0dXJlICpkc3QsIEgyNjRQaWN0dXJlICpzcmMpOwogCiAjZW5kaWYgLyogQVZDT0RFQ19IMjY0X0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NDVfcGFyc2UuYyBiL2xpYmF2Y29kZWMvaDI2NDVfcGFyc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzVjMDJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oMjY0NV9wYXJzZS5jCkBAIC0wLDAgKzEsMzk2IEBACisvKgorICogSC4yNjQvSEVWQyBjb21tb24gcGFyc2luZyBjb2RlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludG1hdGguaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJoMjY0NV9wYXJzZS5oIgorCitpbnQgZmZfaDI2NDVfZXh0cmFjdF9yYnNwKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NDVSQlNQICpyYnNwLCBIMjY0NU5BTCAqbmFsLCBpbnQgc21hbGxfcGFkZGluZykKK3sKKyAgICBpbnQgaSwgc2ksIGRpOworICAgIHVpbnQ4X3QgKmRzdDsKKworICAgIG5hbC0+c2tpcHBlZF9ieXRlcyA9IDA7CisjZGVmaW5lIFNUQVJUQ09ERV9URVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpICsgMiA8IGxlbmd0aCAmJiBzcmNbaSArIDFdID09IDAgJiYgc3JjW2kgKyAyXSA8PSAzKSB7ICAgICBcCisgICAgICAgICAgICBpZiAoc3JjW2kgKyAyXSAhPSAzICYmIHNyY1tpICsgMl0gIT0gMCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgLyogc3RhcnRjb2RlLCBzbyB3ZSBtdXN0IGJlIHBhc3QgdGhlIGVuZCAqLyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbGVuZ3RoID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKyNpZiBIQVZFX0ZBU1RfVU5BTElHTkVECisjZGVmaW5lIEZJTkRfRklSU1RfWkVSTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpID4gMCAmJiAhc3JjW2ldKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChzcmNbaV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpKysKKyNpZiBIQVZFX0ZBU1RfNjRCSVQKKyAgICBmb3IgKGkgPSAwOyBpICsgMSA8IGxlbmd0aDsgaSArPSA5KSB7CisgICAgICAgIGlmICghKCh+QVZfUk42NEEoc3JjICsgaSkgJgorICAgICAgICAgICAgICAgKEFWX1JONjRBKHNyYyArIGkpIC0gMHgwMTAwMDEwMDAxMDAwMTAxVUxMKSkgJgorICAgICAgICAgICAgICAweDgwMDA4MDAwODAwMDgwODBVTEwpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIEZJTkRfRklSU1RfWkVSTzsKKyAgICAgICAgU1RBUlRDT0RFX1RFU1Q7CisgICAgICAgIGkgLT0gNzsKKyAgICB9CisjZWxzZQorICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgbGVuZ3RoOyBpICs9IDUpIHsKKyAgICAgICAgaWYgKCEoKH5BVl9STjMyQShzcmMgKyBpKSAmCisgICAgICAgICAgICAgICAoQVZfUk4zMkEoc3JjICsgaSkgLSAweDAxMDAwMTAxVSkpICYKKyAgICAgICAgICAgICAgMHg4MDAwODA4MFUpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIEZJTkRfRklSU1RfWkVSTzsKKyAgICAgICAgU1RBUlRDT0RFX1RFU1Q7CisgICAgICAgIGkgLT0gMzsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9GQVNUXzY0QklUICovCisjZWxzZQorICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgbGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgaWYgKHNyY1tpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoaSA+IDAgJiYgc3JjW2kgLSAxXSA9PSAwKQorICAgICAgICAgICAgaS0tOworICAgICAgICBTVEFSVENPREVfVEVTVDsKKyAgICB9CisjZW5kaWYgLyogSEFWRV9GQVNUX1VOQUxJR05FRCAqLworCisgICAgaWYgKGkgPj0gbGVuZ3RoIC0gMSAmJiBzbWFsbF9wYWRkaW5nKSB7IC8vIG5vIGVzY2FwZWQgMAorICAgICAgICBuYWwtPmRhdGEgICAgID0KKyAgICAgICAgbmFsLT5yYXdfZGF0YSA9IHNyYzsKKyAgICAgICAgbmFsLT5zaXplICAgICA9CisgICAgICAgIG5hbC0+cmF3X3NpemUgPSBsZW5ndGg7CisgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfSBlbHNlIGlmIChpID4gbGVuZ3RoKQorICAgICAgICBpID0gbGVuZ3RoOworCisgICAgbmFsLT5yYnNwX2J1ZmZlciA9ICZyYnNwLT5yYnNwX2J1ZmZlcltyYnNwLT5yYnNwX2J1ZmZlcl9zaXplXTsKKyAgICBkc3QgPSBuYWwtPnJic3BfYnVmZmVyOworCisgICAgbWVtY3B5KGRzdCwgc3JjLCBpKTsKKyAgICBzaSA9IGRpID0gaTsKKyAgICB3aGlsZSAoc2kgKyAyIDwgbGVuZ3RoKSB7CisgICAgICAgIC8vIHJlbW92ZSBlc2NhcGVzICh2ZXJ5IHJhcmUgMToyXjIyKQorICAgICAgICBpZiAoc3JjW3NpICsgMl0gPiAzKSB7CisgICAgICAgICAgICBkc3RbZGkrK10gPSBzcmNbc2krK107CisgICAgICAgICAgICBkc3RbZGkrK10gPSBzcmNbc2krK107CisgICAgICAgIH0gZWxzZSBpZiAoc3JjW3NpXSA9PSAwICYmIHNyY1tzaSArIDFdID09IDAgJiYgc3JjW3NpICsgMl0gIT0gMCkgeworICAgICAgICAgICAgaWYgKHNyY1tzaSArIDJdID09IDMpIHsgLy8gZXNjYXBlCisgICAgICAgICAgICAgICAgZHN0W2RpKytdID0gMDsKKyAgICAgICAgICAgICAgICBkc3RbZGkrK10gPSAwOworICAgICAgICAgICAgICAgIHNpICAgICAgICs9IDM7CisKKyAgICAgICAgICAgICAgICBpZiAobmFsLT5za2lwcGVkX2J5dGVzX3BvcykgeworICAgICAgICAgICAgICAgICAgICBuYWwtPnNraXBwZWRfYnl0ZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbC0+c2tpcHBlZF9ieXRlc19wb3Nfc2l6ZSA8IG5hbC0+c2tpcHBlZF9ieXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5za2lwcGVkX2J5dGVzX3Bvc19zaXplICo9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKG5hbC0+c2tpcHBlZF9ieXRlc19wb3Nfc2l6ZSA+PSBuYWwtPnNraXBwZWRfYnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVhbGxvY3BfYXJyYXkoJm5hbC0+c2tpcHBlZF9ieXRlc19wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+c2tpcHBlZF9ieXRlc19wb3Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpuYWwtPnNraXBwZWRfYnl0ZXNfcG9zKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbC0+c2tpcHBlZF9ieXRlc19wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5hbC0+c2tpcHBlZF9ieXRlc19wb3MpCisgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zW25hbC0+c2tpcHBlZF9ieXRlcy0xXSA9IGRpIC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgLy8gbmV4dCBzdGFydCBjb2RlCisgICAgICAgICAgICAgICAgZ290byBuc2M7CisgICAgICAgIH0KKworICAgICAgICBkc3RbZGkrK10gPSBzcmNbc2krK107CisgICAgfQorICAgIHdoaWxlIChzaSA8IGxlbmd0aCkKKyAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOworCituc2M6CisgICAgbWVtc2V0KGRzdCArIGRpLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKworICAgIG5hbC0+ZGF0YSA9IGRzdDsKKyAgICBuYWwtPnNpemUgPSBkaTsKKyAgICBuYWwtPnJhd19kYXRhID0gc3JjOworICAgIG5hbC0+cmF3X3NpemUgPSBzaTsKKyAgICByYnNwLT5yYnNwX2J1ZmZlcl9zaXplICs9IHNpOworCisgICAgcmV0dXJuIHNpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbmFsX3VuaXRfbmFtZShpbnQgbmFsX3R5cGUpCit7CisgICAgc3dpdGNoKG5hbF90eXBlKSB7CisgICAgY2FzZSBIRVZDX05BTF9UUkFJTF9OICAgIDogcmV0dXJuICJUUkFJTF9OIjsKKyAgICBjYXNlIEhFVkNfTkFMX1RSQUlMX1IgICAgOiByZXR1cm4gIlRSQUlMX1IiOworICAgIGNhc2UgSEVWQ19OQUxfVFNBX04gICAgICA6IHJldHVybiAiVFNBX04iOworICAgIGNhc2UgSEVWQ19OQUxfVFNBX1IgICAgICA6IHJldHVybiAiVFNBX1IiOworICAgIGNhc2UgSEVWQ19OQUxfU1RTQV9OICAgICA6IHJldHVybiAiU1RTQV9OIjsKKyAgICBjYXNlIEhFVkNfTkFMX1NUU0FfUiAgICAgOiByZXR1cm4gIlNUU0FfUiI7CisgICAgY2FzZSBIRVZDX05BTF9SQURMX04gICAgIDogcmV0dXJuICJSQURMX04iOworICAgIGNhc2UgSEVWQ19OQUxfUkFETF9SICAgICA6IHJldHVybiAiUkFETF9SIjsKKyAgICBjYXNlIEhFVkNfTkFMX1JBU0xfTiAgICAgOiByZXR1cm4gIlJBU0xfTiI7CisgICAgY2FzZSBIRVZDX05BTF9SQVNMX1IgICAgIDogcmV0dXJuICJSQVNMX1IiOworICAgIGNhc2UgSEVWQ19OQUxfQkxBX1dfTFAgICA6IHJldHVybiAiQkxBX1dfTFAiOworICAgIGNhc2UgSEVWQ19OQUxfQkxBX1dfUkFETCA6IHJldHVybiAiQkxBX1dfUkFETCI7CisgICAgY2FzZSBIRVZDX05BTF9CTEFfTl9MUCAgIDogcmV0dXJuICJCTEFfTl9MUCI7CisgICAgY2FzZSBIRVZDX05BTF9JRFJfV19SQURMIDogcmV0dXJuICJJRFJfV19SQURMIjsKKyAgICBjYXNlIEhFVkNfTkFMX0lEUl9OX0xQICAgOiByZXR1cm4gIklEUl9OX0xQIjsKKyAgICBjYXNlIEhFVkNfTkFMX0NSQV9OVVQgICAgOiByZXR1cm4gIkNSQV9OVVQiOworICAgIGNhc2UgSEVWQ19OQUxfVlBTICAgICAgICA6IHJldHVybiAiVlBTIjsKKyAgICBjYXNlIEhFVkNfTkFMX1NQUyAgICAgICAgOiByZXR1cm4gIlNQUyI7CisgICAgY2FzZSBIRVZDX05BTF9QUFMgICAgICAgIDogcmV0dXJuICJQUFMiOworICAgIGNhc2UgSEVWQ19OQUxfQVVEICAgICAgICA6IHJldHVybiAiQVVEIjsKKyAgICBjYXNlIEhFVkNfTkFMX0VPU19OVVQgICAgOiByZXR1cm4gIkVPU19OVVQiOworICAgIGNhc2UgSEVWQ19OQUxfRU9CX05VVCAgICA6IHJldHVybiAiRU9CX05VVCI7CisgICAgY2FzZSBIRVZDX05BTF9GRF9OVVQgICAgIDogcmV0dXJuICJGRF9OVVQiOworICAgIGNhc2UgSEVWQ19OQUxfU0VJX1BSRUZJWCA6IHJldHVybiAiU0VJX1BSRUZJWCI7CisgICAgY2FzZSBIRVZDX05BTF9TRUlfU1VGRklYIDogcmV0dXJuICJTRUlfU1VGRklYIjsKKyAgICBkZWZhdWx0IDogcmV0dXJuICI/IjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2JpdF9sZW5ndGgoSDI2NDVOQUwgKm5hbCwgaW50IHNraXBfdHJhaWxpbmdfemVyb3MpCit7CisgICAgaW50IHNpemUgPSBuYWwtPnNpemU7CisgICAgaW50IHY7CisKKyAgICB3aGlsZSAoc2tpcF90cmFpbGluZ196ZXJvcyAmJiBzaXplID4gMCAmJiBuYWwtPmRhdGFbc2l6ZSAtIDFdID09IDApCisgICAgICAgIHNpemUtLTsKKworICAgIGlmICghc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB2ID0gbmFsLT5kYXRhW3NpemUgLSAxXTsKKworICAgIGlmIChzaXplID4gSU5UX01BWCAvIDgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVSQU5HRSk7CisgICAgc2l6ZSAqPSA4OworCisgICAgLyogcmVtb3ZlIHRoZSBzdG9wIGJpdCBhbmQgZm9sbG93aW5nIHRyYWlsaW5nIHplcm9zLAorICAgICAqIG9yIG5vdGhpbmcgZm9yIGRhbWFnZWQgYml0c3RyZWFtcyAqLworICAgIGlmICh2KQorICAgICAgICBzaXplIC09IGZmX2N0eih2KSArIDE7CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyoqCisgKiBAcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEEgaWYgdGhlIHBhY2tldCBpcyBub3QgYSB2YWxpZCBOQUwgdW5pdCwKKyAqIDAgaWYgdGhlIHVuaXQgc2hvdWxkIGJlIHNraXBwZWQsIDEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgaGV2Y19wYXJzZV9uYWxfaGVhZGVyKEgyNjQ1TkFMICpuYWwsIHZvaWQgKmxvZ2N0eCkKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZuYWwtPmdiOworICAgIGludCBudWhfbGF5ZXJfaWQ7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSAhPSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIG5hbC0+dHlwZSA9IGdldF9iaXRzKGdiLCA2KTsKKworICAgIG51aF9sYXllcl9pZCAgID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgIG5hbC0+dGVtcG9yYWxfaWQgPSBnZXRfYml0cyhnYiwgMykgLSAxOworICAgIGlmIChuYWwtPnRlbXBvcmFsX2lkIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICJuYWxfdW5pdF90eXBlOiAlZCglcyksIG51aF9sYXllcl9pZDogJWQsIHRlbXBvcmFsX2lkOiAlZFxuIiwKKyAgICAgICAgICAgbmFsLT50eXBlLCBuYWxfdW5pdF9uYW1lKG5hbC0+dHlwZSksIG51aF9sYXllcl9pZCwgbmFsLT50ZW1wb3JhbF9pZCk7CisKKyAgICByZXR1cm4gbnVoX2xheWVyX2lkID09IDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2NF9wYXJzZV9uYWxfaGVhZGVyKEgyNjQ1TkFMICpuYWwsIHZvaWQgKmxvZ2N0eCkKK3sKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZuYWwtPmdiOworCisgICAgaWYgKGdldF9iaXRzMShnYikgIT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBuYWwtPnJlZl9pZGMgPSBnZXRfYml0cyhnYiwgMik7CisgICAgbmFsLT50eXBlICAgID0gZ2V0X2JpdHMoZ2IsIDUpOworCisgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAibmFsX3VuaXRfdHlwZTogJWQsIG5hbF9yZWZfaWRjOiAlZFxuIiwKKyAgICAgICAgICAgbmFsLT50eXBlLCBuYWwtPnJlZl9pZGMpOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9uZXh0X3N0YXJ0X2NvZGUoY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpuZXh0X2F2YykKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICBpZiAoYnVmICsgMyA+PSBuZXh0X2F2YykKKyAgICAgICAgcmV0dXJuIG5leHRfYXZjIC0gYnVmOworCisgICAgd2hpbGUgKGJ1ZiArIGkgKyAzIDwgbmV4dF9hdmMpIHsKKyAgICAgICAgaWYgKGJ1ZltpXSA9PSAwICYmIGJ1ZltpICsgMV0gPT0gMCAmJiBidWZbaSArIDJdID09IDEpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaSsrOworICAgIH0KKyAgICByZXR1cm4gaSArIDM7Cit9CisKK2ludCBmZl9oMjY0NV9wYWNrZXRfc3BsaXQoSDI2NDVQYWNrZXQgKnBrdCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsb2djdHgsIGludCBpc19uYWxmZiwgaW50IG5hbF9sZW5ndGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQsIGludCBzbWFsbF9wYWRkaW5nKQoreworICAgIEdldEJ5dGVDb250ZXh0IGJjOworICAgIGludCBjb25zdW1lZCwgcmV0ID0gMDsKKyAgICBpbnQgbmV4dF9hdmMgPSBpc19uYWxmZiA/IDAgOiBsZW5ndGg7CisgICAgaW50NjRfdCBwYWRkaW5nID0gc21hbGxfcGFkZGluZyA/IDAgOiBNQVhfTUJQQUlSX1NJWkU7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZiYywgYnVmLCBsZW5ndGgpOworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcGt0LT5yYnNwLnJic3BfYnVmZmVyLCAmcGt0LT5yYnNwLnJic3BfYnVmZmVyX2FsbG9jX3NpemUsIGxlbmd0aCArIHBhZGRpbmcpOworICAgIGlmICghcGt0LT5yYnNwLnJic3BfYnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcGt0LT5yYnNwLnJic3BfYnVmZmVyX3NpemUgPSAwOworICAgIHBrdC0+bmJfbmFscyA9IDA7CisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZiYykgPj0gNCkgeworICAgICAgICBIMjY0NU5BTCAqbmFsOworICAgICAgICBpbnQgZXh0cmFjdF9sZW5ndGggPSAwOworICAgICAgICBpbnQgc2tpcF90cmFpbGluZ196ZXJvcyA9IDE7CisKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmJjKSA9PSBuZXh0X2F2YykgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZXh0cmFjdF9sZW5ndGggPSBnZXRfbmFsc2l6ZShuYWxfbGVuZ3RoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJjLmJ1ZmZlciwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmJjKSwgJmksIGxvZ2N0eCk7CisgICAgICAgICAgICBpZiAoZXh0cmFjdF9sZW5ndGggPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBleHRyYWN0X2xlbmd0aDsKKworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmYmMsIG5hbF9sZW5ndGhfc2l6ZSk7CisKKyAgICAgICAgICAgIG5leHRfYXZjID0gYnl0ZXN0cmVhbTJfdGVsbCgmYmMpICsgZXh0cmFjdF9sZW5ndGg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgYnVmX2luZGV4OworCisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfdGVsbCgmYmMpID4gbmV4dF9hdmMpCisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1dBUk5JTkcsICJFeGNlZWRlZCBuZXh0IE5BTEZGIHBvc2l0aW9uLCByZS1zeW5jaW5nLlxuIik7CisKKyAgICAgICAgICAgIC8qIHNlYXJjaCBzdGFydCBjb2RlICovCisgICAgICAgICAgICBidWZfaW5kZXggPSBmaW5kX25leHRfc3RhcnRfY29kZShiYy5idWZmZXIsIGJ1ZiArIG5leHRfYXZjKTsKKworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmYmMsIGJ1Zl9pbmRleCk7CisKKyAgICAgICAgICAgIGlmICghYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmJjKSkgeworICAgICAgICAgICAgICAgIGlmIChwa3QtPm5iX25hbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1vcmUgc3RhcnQgY29kZXM6IHdlIGRpc2NhcmRlZCBzb21lIGlycmVsZXZhbnQKKyAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgcGFja2V0LgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJObyBzdGFydCBjb2RlIGlzIGZvdW5kLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXh0cmFjdF9sZW5ndGggPSBGRk1JTihieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmYmMpLCBuZXh0X2F2YyAtIGJ5dGVzdHJlYW0yX3RlbGwoJmJjKSk7CisKKyAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl90ZWxsKCZiYykgPj0gbmV4dF9hdmMpIHsKKyAgICAgICAgICAgICAgICAvKiBza2lwIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBOQUwgKi8KKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZiYywgbmV4dF9hdmMgLSBieXRlc3RyZWFtMl90ZWxsKCZiYykpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBrdC0+bmFsc19hbGxvY2F0ZWQgPCBwa3QtPm5iX25hbHMgKyAxKSB7CisgICAgICAgICAgICBpbnQgbmV3X3NpemUgPSBwa3QtPm5hbHNfYWxsb2NhdGVkICsgMTsKKyAgICAgICAgICAgIHZvaWQgKnRtcCA9IGF2X3JlYWxsb2NfYXJyYXkocGt0LT5uYWxzLCBuZXdfc2l6ZSwgc2l6ZW9mKCpwa3QtPm5hbHMpKTsKKworICAgICAgICAgICAgaWYgKCF0bXApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgcGt0LT5uYWxzID0gdG1wOworICAgICAgICAgICAgbWVtc2V0KHBrdC0+bmFscyArIHBrdC0+bmFsc19hbGxvY2F0ZWQsIDAsCisgICAgICAgICAgICAgICAgICAgKG5ld19zaXplIC0gcGt0LT5uYWxzX2FsbG9jYXRlZCkgKiBzaXplb2YoKnBrdC0+bmFscykpOworCisgICAgICAgICAgICBuYWwgPSAmcGt0LT5uYWxzW3BrdC0+bmJfbmFsc107CisgICAgICAgICAgICBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUgPSAxMDI0OyAvLyBpbml0aWFsIGJ1ZmZlciBzaXplCisgICAgICAgICAgICBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zID0gYXZfbWFsbG9jX2FycmF5KG5hbC0+c2tpcHBlZF9ieXRlc19wb3Nfc2l6ZSwgc2l6ZW9mKCpuYWwtPnNraXBwZWRfYnl0ZXNfcG9zKSk7CisgICAgICAgICAgICBpZiAoIW5hbC0+c2tpcHBlZF9ieXRlc19wb3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgcGt0LT5uYWxzX2FsbG9jYXRlZCA9IG5ld19zaXplOworICAgICAgICB9CisgICAgICAgIG5hbCA9ICZwa3QtPm5hbHNbcGt0LT5uYl9uYWxzXTsKKworICAgICAgICBjb25zdW1lZCA9IGZmX2gyNjQ1X2V4dHJhY3RfcmJzcChiYy5idWZmZXIsIGV4dHJhY3RfbGVuZ3RoLCAmcGt0LT5yYnNwLCBuYWwsIHNtYWxsX3BhZGRpbmcpOworICAgICAgICBpZiAoY29uc3VtZWQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVkOworCisgICAgICAgIGlmIChpc19uYWxmZiAmJiAoZXh0cmFjdF9sZW5ndGggIT0gY29uc3VtZWQpICYmIGV4dHJhY3RfbGVuZ3RoKQorICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICJOQUxGRjogQ29uc3VtZWQgb25seSAlZCBieXRlcyBpbnN0ZWFkIG9mICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkLCBleHRyYWN0X2xlbmd0aCk7CisKKyAgICAgICAgcGt0LT5uYl9uYWxzKys7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmYmMsIGNvbnN1bWVkKTsKKworICAgICAgICAvKiBzZWUgY29tbWl0IDM1NjYwNDJhMCAqLworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmJjKSA+PSA0ICYmCisgICAgICAgICAgICBieXRlc3RyZWFtMl9wZWVrX2JlMzIoJmJjKSA9PSAweDAwMDAwMUUwKQorICAgICAgICAgICAgc2tpcF90cmFpbGluZ196ZXJvcyA9IDA7CisKKyAgICAgICAgbmFsLT5zaXplX2JpdHMgPSBnZXRfYml0X2xlbmd0aChuYWwsIHNraXBfdHJhaWxpbmdfemVyb3MpOworCisgICAgICAgIHJldCA9IGluaXRfZ2V0X2JpdHMoJm5hbC0+Z2IsIG5hbC0+ZGF0YSwgbmFsLT5zaXplX2JpdHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hFVkMpCisgICAgICAgICAgICByZXQgPSBoZXZjX3BhcnNlX25hbF9oZWFkZXIobmFsLCBsb2djdHgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXQgPSBoMjY0X3BhcnNlX25hbF9oZWFkZXIobmFsLCBsb2djdHgpOworICAgICAgICBpZiAocmV0IDw9IDAgfHwgbmFsLT5zaXplIDw9IDAgfHwgbmFsLT5zaXplX2JpdHMgPD0gMCkgeworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIE5BTCB1bml0ICVkLCBza2lwcGluZy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+dHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwa3QtPm5iX25hbHMtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX2gyNjQ1X3BhY2tldF91bmluaXQoSDI2NDVQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGt0LT5uYWxzX2FsbG9jYXRlZDsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZwa3QtPm5hbHNbaV0uc2tpcHBlZF9ieXRlc19wb3MpOworICAgIH0KKyAgICBhdl9mcmVlcCgmcGt0LT5uYWxzKTsKKyAgICBwa3QtPm5hbHNfYWxsb2NhdGVkID0gMDsKKyAgICBhdl9mcmVlcCgmcGt0LT5yYnNwLnJic3BfYnVmZmVyKTsKKyAgICBwa3QtPnJic3AucmJzcF9idWZmZXJfYWxsb2Nfc2l6ZSA9IHBrdC0+cmJzcC5yYnNwX2J1ZmZlcl9zaXplID0gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NDVfcGFyc2UuaCBiL2xpYmF2Y29kZWMvaDI2NDVfcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTI5YWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oMjY0NV9wYXJzZS5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogSC4yNjQvSEVWQyBjb21tb24gcGFyc2luZyBjb2RlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IMjY0NV9QQVJTRV9ICisjZGVmaW5lIEFWQ09ERUNfSDI2NDVfUEFSU0VfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworI2RlZmluZSBNQVhfTUJQQUlSX1NJWkUgKDI1NioxMDI0KSAvLyBhIHRpZ2h0ZXIgYm91bmQgY291bGQgYmUgY2FsY3VsYXRlZCBpZiBzb21lb25lIGNhcmVzIGFib3V0IGEgZmV3IGJ5dGVzCisKK3R5cGVkZWYgc3RydWN0IEgyNjQ1TkFMIHsKKyAgICB1aW50OF90ICpyYnNwX2J1ZmZlcjsKKworICAgIGludCBzaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisKKyAgICAvKioKKyAgICAgKiBTaXplLCBpbiBiaXRzLCBvZiBqdXN0IHRoZSBkYXRhLCBleGNsdWRpbmcgdGhlIHN0b3AgYml0IGFuZCBhbnkgdHJhaWxpbmcKKyAgICAgKiBwYWRkaW5nLiBJLmUuIHdoYXQgSEVWQyBjYWxscyBTT0RCLgorICAgICAqLworICAgIGludCBzaXplX2JpdHM7CisKKyAgICBpbnQgcmF3X3NpemU7CisgICAgY29uc3QgdWludDhfdCAqcmF3X2RhdGE7CisKKyAgICBHZXRCaXRDb250ZXh0IGdiOworCisgICAgLyoqCisgICAgICogTkFMIHVuaXQgdHlwZQorICAgICAqLworICAgIGludCB0eXBlOworCisgICAgLyoqCisgICAgICogSEVWQyBvbmx5LCBudWhfdGVtcG9yYWxfaWRfcGx1c18xIC0gMQorICAgICAqLworICAgIGludCB0ZW1wb3JhbF9pZDsKKworICAgIGludCBza2lwcGVkX2J5dGVzOworICAgIGludCBza2lwcGVkX2J5dGVzX3Bvc19zaXplOworICAgIGludCAqc2tpcHBlZF9ieXRlc19wb3M7CisgICAgLyoqCisgICAgICogSC4yNjQgb25seSwgbmFsX3JlZl9pZGMKKyAgICAgKi8KKyAgICBpbnQgcmVmX2lkYzsKK30gSDI2NDVOQUw7CisKK3R5cGVkZWYgc3RydWN0IEgyNjQ1UkJTUCB7CisgICAgdWludDhfdCAqcmJzcF9idWZmZXI7CisgICAgaW50IHJic3BfYnVmZmVyX2FsbG9jX3NpemU7CisgICAgaW50IHJic3BfYnVmZmVyX3NpemU7Cit9IEgyNjQ1UkJTUDsKKworLyogYW4gaW5wdXQgcGFja2V0IHNwbGl0IGludG8gdW5lc2NhcGVkIE5BTCB1bml0cyAqLwordHlwZWRlZiBzdHJ1Y3QgSDI2NDVQYWNrZXQgeworICAgIEgyNjQ1TkFMICpuYWxzOworICAgIEgyNjQ1UkJTUCByYnNwOworICAgIGludCBuYl9uYWxzOworICAgIGludCBuYWxzX2FsbG9jYXRlZDsKK30gSDI2NDVQYWNrZXQ7CisKKy8qKgorICogRXh0cmFjdCB0aGUgcmF3ICh1bmVzY2FwZWQpIGJpdHN0cmVhbS4KKyAqLworaW50IGZmX2gyNjQ1X2V4dHJhY3RfcmJzcChjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW5ndGgsIEgyNjQ1UkJTUCAqcmJzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NDVOQUwgKm5hbCwgaW50IHNtYWxsX3BhZGRpbmcpOworCisvKioKKyAqIFNwbGl0IGFuIGlucHV0IHBhY2tldCBpbnRvIE5BTCB1bml0cy4KKyAqLworaW50IGZmX2gyNjQ1X3BhY2tldF9zcGxpdChIMjY0NVBhY2tldCAqcGt0LCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvZ2N0eCwgaW50IGlzX25hbGZmLCBpbnQgbmFsX2xlbmd0aF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCwgaW50IHNtYWxsX3BhZGRpbmcpOworCisvKioKKyAqIEZyZWUgYWxsIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGluIHRoZSBwYWNrZXQuCisgKi8KK3ZvaWQgZmZfaDI2NDVfcGFja2V0X3VuaW5pdChIMjY0NVBhY2tldCAqcGt0KTsKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X25hbHNpemUoaW50IG5hbF9sZW5ndGhfc2l6ZSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBpbnQgKmJ1Zl9pbmRleCwgdm9pZCAqbG9nY3R4KQoreworICAgIGludCBpLCBuYWxzaXplID0gMDsKKworICAgIGlmICgqYnVmX2luZGV4ID49IGJ1Zl9zaXplIC0gbmFsX2xlbmd0aF9zaXplKSB7CisgICAgICAgIC8vIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBpcyByZWFjaGVkLCByZWZpbGwgaXQKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmFsX2xlbmd0aF9zaXplOyBpKyspCisgICAgICAgIG5hbHNpemUgPSAoKHVuc2lnbmVkKW5hbHNpemUgPDwgOCkgfCBidWZbKCpidWZfaW5kZXgpKytdOworICAgIGlmIChuYWxzaXplIDw9IDAgfHwgbmFsc2l6ZSA+IGJ1Zl9zaXplIC0gKmJ1Zl9pbmRleCkgeworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBOQUwgdW5pdCBzaXplICglZCA+ICVkKS5cbiIsIG5hbHNpemUsIGJ1Zl9zaXplIC0gKmJ1Zl9pbmRleCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICByZXR1cm4gbmFsc2l6ZTsKK30KKworI2VuZGlmIC8qIEFWQ09ERUNfSDI2NDVfUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X2NhYmFjLmMgYi9saWJhdmNvZGVjL2gyNjRfY2FiYWMuYwppbmRleCBkZWFiMzVhLi44MTUxNDlhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRfY2FiYWMuYworKysgYi9saWJhdmNvZGVjL2gyNjRfY2FiYWMuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBjYWJhYyBkZWNvZGluZy4KKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHBhcnQxMCBjYWJhYyBkZWNvZGluZy4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCkBAIC0zNywxNCArMzcsMTMgQEAKICNpbmNsdWRlICJjYWJhY19mdW5jdGlvbnMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiaDI2NGRlYy5oIgogI2luY2x1ZGUgImgyNjRkYXRhLmgiCiAjaW5jbHVkZSAiaDI2NF9tdnByZWQuaCIKLSNpbmNsdWRlICJnb2xvbWIuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKIAogI2lmIEFSQ0hfWDg2Ci0jaW5jbHVkZSAieDg2L2gyNjRfaTM4Ni5oIgorI2luY2x1ZGUgIng4Ni9oMjY0X2NhYmFjLmMiCiAjZW5kaWYKIAogLyogQ2FiYWMgcHJlIHN0YXRlIHRhYmxlICovCkBAIC01Niw3ICs1NSw3IEBACiAgICAgeyAgMiwgIDU0IH0sIHsgIDMsIDc0IH0sICB7IC0yOCwxMjcgfSwgeyAtMjMsIDEwNCB9LAogICAgIHsgLTYsICA1MyB9LCB7IC0xLCA1NCB9LCAgeyAgNywgIDUxIH0sCiAKLSAgICAvKiAxMSAtIDIzIHVuc3VzZWQgZm9yIEkgKi8KKyAgICAvKiAxMSAtIDIzIHVudXNlZCBmb3IgSSAqLwogICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgICAgeyAwLCAwIH0sCiAgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LCAgICB7IDAsIDAgfSwgICAgICB7IDAsIDAgfSwKICAgICB7IDAsIDAgfSwgICAgeyAwLCAwIH0sICAgIHsgMCwgMCB9LCAgICAgIHsgMCwgMCB9LApAQCAtMTI2NSw3ICsxMjY0LDcgQEAKIHsKICAgICBpbnQgaTsKICAgICBjb25zdCBpbnQ4X3QgKCp0YWIpWzJdOwotICAgIGNvbnN0IGludCBzbGljZV9xcCA9IGF2X2NsaXAoc2wtPnFzY2FsZSAtIDYqKGgtPnNwcy5iaXRfZGVwdGhfbHVtYS04KSwgMCwgNTEpOworICAgIGNvbnN0IGludCBzbGljZV9xcCA9IGF2X2NsaXAoc2wtPnFzY2FsZSAtIDYqKGgtPnBzLnNwcy0+Yml0X2RlcHRoX2x1bWEtOCksIDAsIDUxKTsKIAogICAgIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHRhYiA9IGNhYmFjX2NvbnRleHRfaW5pdF9JOwogICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWIgPSBjYWJhY19jb250ZXh0X2luaXRfUEJbc2wtPmNhYmFjX2luaXRfaWRjXTsKQEAgLTE3MjYsNyArMTcyNSw3IEBACiAgICAgICAgICAgICAgICAgKCh0eXBlKilibG9jaylbal0gPSAoZ2V0X2NhYmFjX2J5cGFzc19zaWduKCBDQywgLXFtdWxbal0pICsgMzIpID4+IDY7IFwKICAgICAgICAgICAgIH0gXAogICAgICAgICB9IGVsc2UgeyBcCi0gICAgICAgICAgICBpbnQgY29lZmZfYWJzID0gMjsgXAorICAgICAgICAgICAgdW5zaWduZWQgY29lZmZfYWJzID0gMjsgXAogICAgICAgICAgICAgY3R4ID0gY29lZmZfYWJzX2xldmVsZ3QxX2N0eFtpc19kYyAmJiBjaHJvbWE0MjJdW25vZGVfY3R4XSArIGFic19sZXZlbF9tMV9jdHhfYmFzZTsgXAogICAgICAgICAgICAgbm9kZV9jdHggPSBjb2VmZl9hYnNfbGV2ZWxfdHJhbnNpdGlvblsxXVtub2RlX2N0eF07IFwKIFwKQEAgLTE3MzYsNyArMTczNSw3IEBACiBcCiAgICAgICAgICAgICBpZiggY29lZmZfYWJzID49IDE1ICkgeyBcCiAgICAgICAgICAgICAgICAgaW50IGogPSAwOyBcCi0gICAgICAgICAgICAgICAgd2hpbGUgKGdldF9jYWJhY19ieXBhc3MoQ0MpICYmIGogPCAzMCkgeyBcCisgICAgICAgICAgICAgICAgd2hpbGUgKGdldF9jYWJhY19ieXBhc3MoQ0MpICYmIGogPCAxNis3KSB7IFwKICAgICAgICAgICAgICAgICAgICAgaisrOyBcCiAgICAgICAgICAgICAgICAgfSBcCiBcCkBAIC0xNzQ0LDcgKzE3NDMsNyBAQAogICAgICAgICAgICAgICAgIHdoaWxlKCBqLS0gKSB7IFwKICAgICAgICAgICAgICAgICAgICAgY29lZmZfYWJzICs9IGNvZWZmX2FicyArIGdldF9jYWJhY19ieXBhc3MoIENDICk7IFwKICAgICAgICAgICAgICAgICB9IFwKLSAgICAgICAgICAgICAgICBjb2VmZl9hYnMrPSAxNDsgXAorICAgICAgICAgICAgICAgIGNvZWZmX2Ficys9IDE0VTsgXAogICAgICAgICAgICAgfSBcCiBcCiAgICAgICAgICAgICBpZiggaXNfZGMgKSB7IFwKQEAgLTE4NzYsNyArMTg3NSw3IEBACiAgICAgICAgIGRlY29kZV9jYWJhY19yZXNpZHVhbF9kYyhoLCBzbCwgc2wtPm1iX2x1bWFfZGNbcF0sIGN0eF9jYXRbMF1bcF0sIExVTUFfRENfQkxPQ0tfSU5ERVgrcCwgc2NhbiwgMTYpOwogCiAgICAgICAgIGlmKCBjYnAmMTUgKSB7Ci0gICAgICAgICAgICBxbXVsID0gaC0+ZGVxdWFudDRfY29lZmZbcF1bcXNjYWxlXTsKKyAgICAgICAgICAgIHFtdWwgPSBoLT5wcy5wcHMtPmRlcXVhbnQ0X2NvZWZmW3BdW3FzY2FsZV07CiAgICAgICAgICAgICBmb3IoIGk0eDQgPSAwOyBpNHg0IDwgMTY7IGk0eDQrKyApIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSAxNipwICsgaTR4NDsKICAgICAgICAgICAgICAgICBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfbm9uZGMoaCwgc2wsIHNsLT5tYiArICgxNippbmRleCA8PCBwaXhlbF9zaGlmdCksIGN0eF9jYXRbMV1bcF0sIGluZGV4LCBzY2FuICsgMSwgcW11bCwgMTUpOwpAQCAtMTg5MSw5ICsxODkwLDkgQEAKICAgICAgICAgICAgICAgICBpZiggSVNfOHg4RENUKG1iX3R5cGUpICkgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSAxNipwICsgNCppOHg4OwogICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfbm9uZGMoaCwgc2wsIHNsLT5tYiArICgxNippbmRleCA8PCBwaXhlbF9zaGlmdCksIGN0eF9jYXRbM11bcF0sIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbjh4OCwgaC0+ZGVxdWFudDhfY29lZmZbY3FtXVtxc2NhbGVdLCA2NCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuOHg4LCBoLT5wcy5wcHMtPmRlcXVhbnQ4X2NvZWZmW2NxbV1bcXNjYWxlXSwgNjQpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHFtdWwgPSBoLT5kZXF1YW50NF9jb2VmZltjcW1dW3FzY2FsZV07CisgICAgICAgICAgICAgICAgICAgIHFtdWwgPSBoLT5wcy5wcHMtPmRlcXVhbnQ0X2NvZWZmW2NxbV1bcXNjYWxlXTsKICAgICAgICAgICAgICAgICAgICAgZm9yKCBpNHg0ID0gMDsgaTR4NCA8IDQ7IGk0eDQrKyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCA9IDE2KnAgKyA0Kmk4eDggKyBpNHg0OwogLy9TVEFSVF9USU1FUgpAQCAtMTkxNCwxNSArMTkxMywxNiBAQAogICovCiBpbnQgZmZfaDI2NF9kZWNvZGVfbWJfY2FiYWMoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsKQogeworICAgIGNvbnN0IFNQUyAqc3BzID0gaC0+cHMuc3BzOwogICAgIGludCBtYl94eTsKICAgICBpbnQgbWJfdHlwZSwgcGFydGl0aW9uX2NvdW50LCBjYnAgPSAwOwotICAgIGludCBkY3Q4eDhfYWxsb3dlZD0gaC0+cHBzLnRyYW5zZm9ybV84eDhfbW9kZTsKLSAgICBpbnQgZGVjb2RlX2Nocm9tYSA9IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxIHx8IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyOworICAgIGludCBkY3Q4eDhfYWxsb3dlZCA9IGgtPnBzLnBwcy0+dHJhbnNmb3JtXzh4OF9tb2RlOworICAgIGNvbnN0IGludCBkZWNvZGVfY2hyb21hID0gc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxIHx8IHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMjsKICAgICBjb25zdCBpbnQgcGl4ZWxfc2hpZnQgPSBoLT5waXhlbF9zaGlmdDsKIAogICAgIG1iX3h5ID0gc2wtPm1iX3h5ID0gc2wtPm1iX3ggKyBzbC0+bWJfeSpoLT5tYl9zdHJpZGU7CiAKLSAgICBmZl90bG9nKGgtPmF2Y3R4LCAicGljOiVkIG1iOiVkLyVkXG4iLCBoLT5mcmFtZV9udW0sIHNsLT5tYl94LCBzbC0+bWJfeSk7CisgICAgZmZfdGxvZyhoLT5hdmN0eCwgInBpYzolZCBtYjolZC8lZFxuIiwgaC0+cG9jLmZyYW1lX251bSwgc2wtPm1iX3gsIHNsLT5tYl95KTsKICAgICBpZiAoc2wtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CiAgICAgICAgIGludCBza2lwOwogICAgICAgICAvKiBhIHNraXBwZWQgbWIgbmVlZHMgdGhlIGFmZiBmbGFnIGZyb20gdGhlIGZvbGxvd2luZyBtYiAqLwpAQCAtMTk5Miw4ICsxOTkyLDggQEAKICAgICAgICAgICAgICAgICBtYl90eXBlPSBiaXRzIC0gNDsgLyogQl9MMF9CaV8qIHRocm91Z2ggQl9CaV9CaV8qICovCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgICAgIHBhcnRpdGlvbl9jb3VudD0gYl9tYl90eXBlX2luZm9bbWJfdHlwZV0ucGFydGl0aW9uX2NvdW50OwotICAgICAgICAgICAgbWJfdHlwZT0gICAgICAgICBiX21iX3R5cGVfaW5mb1ttYl90eXBlXS50eXBlOworICAgICAgICAgICAgcGFydGl0aW9uX2NvdW50ID0gZmZfaDI2NF9iX21iX3R5cGVfaW5mb1ttYl90eXBlXS5wYXJ0aXRpb25fY291bnQ7CisgICAgICAgICAgICBtYl90eXBlICAgICAgICAgPSBmZl9oMjY0X2JfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnR5cGU7CiAgICAgfSBlbHNlIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHsKICAgICAgICAgaWYoIGdldF9jYWJhY19ub2lubGluZSggJnNsLT5jYWJhYywgJnNsLT5jYWJhY19zdGF0ZVsxNF0gKSA9PSAwICkgewogICAgICAgICAgICAgLyogUC10eXBlICovCkBAIC0yMDA0LDggKzIwMDQsOCBAQAogICAgICAgICAgICAgICAgIC8qIFBfTDBfRDh4MTYsIFBfTDBfRDE2eDggKi8KICAgICAgICAgICAgICAgICBtYl90eXBlPSAyIC0gZ2V0X2NhYmFjX25vaW5saW5lKCAmc2wtPmNhYmFjLCAmc2wtPmNhYmFjX3N0YXRlWzE3XSApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFydGl0aW9uX2NvdW50PSBwX21iX3R5cGVfaW5mb1ttYl90eXBlXS5wYXJ0aXRpb25fY291bnQ7Ci0gICAgICAgICAgICBtYl90eXBlPSAgICAgICAgIHBfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnR5cGU7CisgICAgICAgICAgICBwYXJ0aXRpb25fY291bnQgPSBmZl9oMjY0X3BfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnBhcnRpdGlvbl9jb3VudDsKKyAgICAgICAgICAgIG1iX3R5cGUgICAgICAgICA9IGZmX2gyNjRfcF9tYl90eXBlX2luZm9bbWJfdHlwZV0udHlwZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1iX3R5cGUgPSBkZWNvZGVfY2FiYWNfaW50cmFfbWJfdHlwZShzbCwgMTcsIDApOwogICAgICAgICAgICAgZ290byBkZWNvZGVfaW50cmFfbWI7CkBAIC0yMDE3LDkgKzIwMTcsOSBAQAogICAgICAgICBhdl9hc3NlcnQyKHNsLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfSSk7CiBkZWNvZGVfaW50cmFfbWI6CiAgICAgICAgIHBhcnRpdGlvbl9jb3VudCA9IDA7Ci0gICAgICAgIGNicD0gaV9tYl90eXBlX2luZm9bbWJfdHlwZV0uY2JwOwotICAgICAgICBzbC0+aW50cmExNngxNl9wcmVkX21vZGUgPSBpX21iX3R5cGVfaW5mb1ttYl90eXBlXS5wcmVkX21vZGU7Ci0gICAgICAgIG1iX3R5cGU9IGlfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnR5cGU7CisgICAgICAgIGNicCAgICAgICAgICAgICAgICAgICAgICA9IGZmX2gyNjRfaV9tYl90eXBlX2luZm9bbWJfdHlwZV0uY2JwOworICAgICAgICBzbC0+aW50cmExNngxNl9wcmVkX21vZGUgPSBmZl9oMjY0X2lfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnByZWRfbW9kZTsKKyAgICAgICAgbWJfdHlwZSAgICAgICAgICAgICAgICAgID0gZmZfaDI2NF9pX21iX3R5cGVfaW5mb1ttYl90eXBlXS50eXBlOwogICAgIH0KICAgICBpZiAoTUJfRklFTEQoc2wpKQogICAgICAgICBtYl90eXBlIHw9IE1CX1RZUEVfSU5URVJMQUNFRDsKQEAgLTIwMjcsOCArMjAyNyw4IEBACiAgICAgaC0+c2xpY2VfdGFibGVbbWJfeHldID0gc2wtPnNsaWNlX251bTsKIAogICAgIGlmKElTX0lOVFJBX1BDTShtYl90eXBlKSkgewotICAgICAgICBjb25zdCBpbnQgbWJfc2l6ZSA9IGZmX2gyNjRfbWJfc2l6ZXNbaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjXSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c3BzLmJpdF9kZXB0aF9sdW1hID4+IDM7CisgICAgICAgIGNvbnN0IGludCBtYl9zaXplID0gZmZfaDI2NF9tYl9zaXplc1tzcHMtPmNocm9tYV9mb3JtYXRfaWRjXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT5iaXRfZGVwdGhfbHVtYSA+PiAzOwogICAgICAgICBjb25zdCB1aW50OF90ICpwdHI7CiAgICAgICAgIGludCByZXQ7CiAKQEAgLTIwODUsMTYgKzIwODUsMjAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB3cml0ZV9iYWNrX2ludHJhX3ByZWRfbW9kZShoLCBzbCk7Ci0gICAgICAgICAgICBpZiAoZmZfaDI2NF9jaGVja19pbnRyYTR4NF9wcmVkX21vZGUoaCwgc2wpIDwgMCApIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChmZl9oMjY0X2NoZWNrX2ludHJhNHg0X3ByZWRfbW9kZShzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlLCBoLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlLCBzbC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSkgPCAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbC0+aW50cmExNngxNl9wcmVkX21vZGUgPSBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShoLCBzbCwgc2wtPmludHJhMTZ4MTZfcHJlZF9tb2RlLCAwKTsKKyAgICAgICAgICAgIHNsLT5pbnRyYTE2eDE2X3ByZWRfbW9kZSA9IGZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlKGgtPmF2Y3R4LCBzbC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUsIHNsLT5pbnRyYTE2eDE2X3ByZWRfbW9kZSwgMCk7CiAgICAgICAgICAgICBpZiAoc2wtPmludHJhMTZ4MTZfcHJlZF9tb2RlIDwgMCkgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGlmKGRlY29kZV9jaHJvbWEpewogICAgICAgICAgICAgaC0+Y2hyb21hX3ByZWRfbW9kZV90YWJsZVttYl94eV0gPQogICAgICAgICAgICAgcHJlZF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgPSBkZWNvZGVfY2FiYWNfbWJfY2hyb21hX3ByZV9tb2RlKGgsIHNsKTsKIAotICAgICAgICAgICAgcHJlZF9tb2RlPSBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShoLCBzbCwgcHJlZF9tb2RlLCAxICk7CisgICAgICAgICAgICBwcmVkX21vZGU9IGZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlKGgtPmF2Y3R4LCBzbC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSwgcHJlZF9tb2RlLCAxICk7CiAgICAgICAgICAgICBpZiggcHJlZF9tb2RlIDwgMCApIHJldHVybiAtMTsKICAgICAgICAgICAgIHNsLT5jaHJvbWFfcHJlZF9tb2RlID0gcHJlZF9tb2RlOwogICAgICAgICB9IGVsc2UgewpAQCAtMjEwNiw4ICsyMTEwLDggQEAKICAgICAgICAgaWYgKHNsLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQiApIHsKICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKSB7CiAgICAgICAgICAgICAgICAgc2wtPnN1Yl9tYl90eXBlW2ldID0gZGVjb2RlX2NhYmFjX2JfbWJfc3ViX3R5cGUoc2wpOwotICAgICAgICAgICAgICAgIHN1Yl9wYXJ0aXRpb25fY291bnRbaV0gPSBiX3N1Yl9tYl90eXBlX2luZm9bc2wtPnN1Yl9tYl90eXBlW2ldXS5wYXJ0aXRpb25fY291bnQ7Ci0gICAgICAgICAgICAgICAgc2wtPnN1Yl9tYl90eXBlW2ldICAgICA9IGJfc3ViX21iX3R5cGVfaW5mb1tzbC0+c3ViX21iX3R5cGVbaV1dLnR5cGU7CisgICAgICAgICAgICAgICAgc3ViX3BhcnRpdGlvbl9jb3VudFtpXSA9IGZmX2gyNjRfYl9zdWJfbWJfdHlwZV9pbmZvW3NsLT5zdWJfbWJfdHlwZVtpXV0ucGFydGl0aW9uX2NvdW50OworICAgICAgICAgICAgICAgIHNsLT5zdWJfbWJfdHlwZVtpXSAgICAgPSBmZl9oMjY0X2Jfc3ViX21iX3R5cGVfaW5mb1tzbC0+c3ViX21iX3R5cGVbaV1dLnR5cGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoSVNfRElSRUNUKHNsLT5zdWJfbWJfdHlwZVswXSB8IHNsLT5zdWJfbWJfdHlwZVsxXSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5zdWJfbWJfdHlwZVsyXSB8IHNsLT5zdWJfbWJfdHlwZVszXSkpIHsKQEAgLTIxMjIsOCArMjEyNiw4IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkgewogICAgICAgICAgICAgICAgIHNsLT5zdWJfbWJfdHlwZVtpXSA9IGRlY29kZV9jYWJhY19wX21iX3N1Yl90eXBlKHNsKTsKLSAgICAgICAgICAgICAgICBzdWJfcGFydGl0aW9uX2NvdW50W2ldID0gcF9zdWJfbWJfdHlwZV9pbmZvW3NsLT5zdWJfbWJfdHlwZVtpXV0ucGFydGl0aW9uX2NvdW50OwotICAgICAgICAgICAgICAgIHNsLT5zdWJfbWJfdHlwZVtpXSAgICAgPSBwX3N1Yl9tYl90eXBlX2luZm9bc2wtPnN1Yl9tYl90eXBlW2ldXS50eXBlOworICAgICAgICAgICAgICAgIHN1Yl9wYXJ0aXRpb25fY291bnRbaV0gPSBmZl9oMjY0X3Bfc3ViX21iX3R5cGVfaW5mb1tzbC0+c3ViX21iX3R5cGVbaV1dLnBhcnRpdGlvbl9jb3VudDsKKyAgICAgICAgICAgICAgICBzbC0+c3ViX21iX3R5cGVbaV0gICAgID0gZmZfaDI2NF9wX3N1Yl9tYl90eXBlX2luZm9bc2wtPnN1Yl9tYl90eXBlW2ldXS50eXBlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTIyMTEsNyArMjIxNSw3IEBACiAgICAgICAgIGZmX2gyNjRfcHJlZF9kaXJlY3RfbW90aW9uKGgsIHNsLCAmbWJfdHlwZSk7CiAgICAgICAgIGZpbGxfcmVjdGFuZ2xlKHNsLT5tdmRfY2FjaGVbMF1bc2NhbjhbMF1dLCA0LCA0LCA4LCAwLCAyKTsKICAgICAgICAgZmlsbF9yZWN0YW5nbGUoc2wtPm12ZF9jYWNoZVsxXVtzY2FuOFswXV0sIDQsIDQsIDgsIDAsIDIpOwotICAgICAgICBkY3Q4eDhfYWxsb3dlZCAmPSBoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKKyAgICAgICAgZGN0OHg4X2FsbG93ZWQgJj0gc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBsaXN0LCBpOwogICAgICAgICBpZihJU18xNlgxNihtYl90eXBlKSl7CkBAIC0yMzQzLDIxICsyMzQ3LDQwIEBACiAgICAgaWYgKENIUk9NQTQ0NChoKSAmJiBJU184eDhEQ1QobWJfdHlwZSkpewogICAgICAgICBpbnQgaTsKICAgICAgICAgdWludDhfdCAqbm56X2NhY2hlID0gc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKXsKLSAgICAgICAgICAgIGlmIChzbC0+bGVmdF90eXBlW0xFRlQoaSldICYmICFJU184eDhEQ1Qoc2wtPmxlZnRfdHlwZVtMRUZUKGkpXSkpIHsKLSAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KiAxICsgMio4KmldPQotICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqIDIgKyAyKjgqaV09Ci0gICAgICAgICAgICAgICAgbm56X2NhY2hlWzMrOCogNiArIDIqOCppXT0KLSAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KiA3ICsgMio4KmldPQotICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqMTEgKyAyKjgqaV09Ci0gICAgICAgICAgICAgICAgbm56X2NhY2hlWzMrOCoxMiArIDIqOCppXT0gSVNfSU5UUkEobWJfdHlwZSkgPyA2NCA6IDA7CisgICAgICAgIGlmIChoLT54MjY0X2J1aWxkIDwgMTUxVSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKyl7CisgICAgICAgICAgICAgICAgaWYgKHNsLT5sZWZ0X3R5cGVbTEVGVChpKV0gJiYgIUlTXzh4OERDVChzbC0+bGVmdF90eXBlW0xFRlQoaSldKSkgeworICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KiAxICsgMio4KmldPQorICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KiAyICsgMio4KmldPQorICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KiA2ICsgMio4KmldPQorICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KiA3ICsgMio4KmldPQorICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KjExICsgMio4KmldPQorICAgICAgICAgICAgICAgICAgICBubnpfY2FjaGVbMys4KjEyICsgMio4KmldPSBJU19JTlRSQShtYl90eXBlKSA/IDY0IDogMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNsLT50b3BfdHlwZSAmJiAhSVNfOHg4RENUKHNsLT50b3BfdHlwZSkpewotICAgICAgICAgICAgdWludDMyX3QgdG9wX2VtcHR5ID0gQ0FCQUMoaCkgJiYgIUlTX0lOVFJBKG1iX3R5cGUpID8gMCA6IDB4NDA0MDQwNDA7Ci0gICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQrOCogMF0sIHRvcF9lbXB0eSk7Ci0gICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQrOCogNV0sIHRvcF9lbXB0eSk7Ci0gICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQrOCoxMF0sIHRvcF9lbXB0eSk7CisgICAgICAgICAgICBpZiAoc2wtPnRvcF90eXBlICYmICFJU184eDhEQ1Qoc2wtPnRvcF90eXBlKSl7CisgICAgICAgICAgICAgICAgdWludDMyX3QgdG9wX2VtcHR5ID0gIUlTX0lOVFJBKG1iX3R5cGUpID8gMCA6IDB4NDA0MDQwNDA7CisgICAgICAgICAgICAgICAgQVZfV04zMkEoJm5uel9jYWNoZVs0KzgqIDBdLCB0b3BfZW1wdHkpOworICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZubnpfY2FjaGVbNCs4KiA1XSwgdG9wX2VtcHR5KTsKKyAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQrOCoxMF0sIHRvcF9lbXB0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKXsKKyAgICAgICAgICAgICAgICBpZiAoc2wtPmxlZnRfdHlwZVtMRUZUKGkpXSAmJiAhSVNfOHg4RENUKHNsLT5sZWZ0X3R5cGVbTEVGVChpKV0pKSB7CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqIDEgKyAyKjgqaV09CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqIDIgKyAyKjgqaV09CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqIDYgKyAyKjgqaV09CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqIDcgKyAyKjgqaV09CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqMTEgKyAyKjgqaV09CisgICAgICAgICAgICAgICAgICAgIG5uel9jYWNoZVszKzgqMTIgKyAyKjgqaV09ICFJU19JTlRSQV9QQ00oc2wtPmxlZnRfdHlwZVtMRUZUKGkpXSkgPyAwIDogNjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNsLT50b3BfdHlwZSAmJiAhSVNfOHg4RENUKHNsLT50b3BfdHlwZSkpeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRvcF9lbXB0eSA9ICFJU19JTlRSQV9QQ00oc2wtPnRvcF90eXBlKSA/IDAgOiAweDQwNDA0MDQwOworICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZubnpfY2FjaGVbNCs4KiAwXSwgdG9wX2VtcHR5KTsKKyAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbm56X2NhY2hlWzQrOCogNV0sIHRvcF9lbXB0eSk7CisgICAgICAgICAgICAgICAgQVZfV04zMkEoJm5uel9jYWNoZVs0KzgqMTBdLCB0b3BfZW1wdHkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIGgtPmN1cl9waWMubWJfdHlwZVttYl94eV0gPSBtYl90eXBlOwpAQCAtMjM2NiwxOSArMjM4OSwxMSBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpzY2FuLCAqc2Nhbjh4ODsKICAgICAgICAgY29uc3QgdWludDMyX3QgKnFtdWw7CiAKLSAgICAgICAgaWYoSVNfSU5URVJMQUNFRChtYl90eXBlKSl7Ci0gICAgICAgICAgICBzY2FuOHg4ID0gc2wtPnFzY2FsZSA/IGgtPmZpZWxkX3NjYW44eDggOiBoLT5maWVsZF9zY2FuOHg4X3EwOwotICAgICAgICAgICAgc2NhbiAgICA9IHNsLT5xc2NhbGUgPyBoLT5maWVsZF9zY2FuIDogaC0+ZmllbGRfc2Nhbl9xMDsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBzY2FuOHg4ID0gc2wtPnFzY2FsZSA/IGgtPnppZ3phZ19zY2FuOHg4IDogaC0+emlnemFnX3NjYW44eDhfcTA7Ci0gICAgICAgICAgICBzY2FuICAgID0gc2wtPnFzY2FsZSA/IGgtPnppZ3phZ19zY2FuIDogaC0+emlnemFnX3NjYW5fcTA7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBkZWNvZGVfY2FiYWNfbWJfZHFwCiAgICAgICAgIGlmKGdldF9jYWJhY19ub2lubGluZSggJnNsLT5jYWJhYywgJnNsLT5jYWJhY19zdGF0ZVs2MCArIChzbC0+bGFzdF9xc2NhbGVfZGlmZiAhPSAwKV0pKXsKICAgICAgICAgICAgIGludCB2YWwgPSAxOwogICAgICAgICAgICAgaW50IGN0eD0gMjsKLSAgICAgICAgICAgIGNvbnN0IGludCBtYXhfcXAgPSA1MSArIDYqKGgtPnNwcy5iaXRfZGVwdGhfbHVtYS04KTsKKyAgICAgICAgICAgIGNvbnN0IGludCBtYXhfcXAgPSA1MSArIDYqKHNwcy0+Yml0X2RlcHRoX2x1bWEtOCk7CiAKICAgICAgICAgICAgIHdoaWxlKCBnZXRfY2FiYWNfbm9pbmxpbmUoICZzbC0+Y2FiYWMsICZzbC0+Y2FiYWNfc3RhdGVbNjAgKyBjdHhdICkgKSB7CiAgICAgICAgICAgICAgICAgY3R4PSAzOwpAQCAtMjM5OSwxMSArMjQxNCwxOSBAQAogICAgICAgICAgICAgICAgIGlmIChzbC0+cXNjYWxlIDwgMCkgc2wtPnFzY2FsZSArPSBtYXhfcXAgKyAxOwogICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgc2wtPnFzY2FsZSAtPSBtYXhfcXAgKyAxOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2wtPmNocm9tYV9xcFswXSA9IGdldF9jaHJvbWFfcXAoaCwgMCwgc2wtPnFzY2FsZSk7Ci0gICAgICAgICAgICBzbC0+Y2hyb21hX3FwWzFdID0gZ2V0X2Nocm9tYV9xcChoLCAxLCBzbC0+cXNjYWxlKTsKKyAgICAgICAgICAgIHNsLT5jaHJvbWFfcXBbMF0gPSBnZXRfY2hyb21hX3FwKGgtPnBzLnBwcywgMCwgc2wtPnFzY2FsZSk7CisgICAgICAgICAgICBzbC0+Y2hyb21hX3FwWzFdID0gZ2V0X2Nocm9tYV9xcChoLT5wcy5wcHMsIDEsIHNsLT5xc2NhbGUpOwogICAgICAgICB9ZWxzZQogICAgICAgICAgICAgc2wtPmxhc3RfcXNjYWxlX2RpZmY9MDsKIAorICAgICAgICBpZihJU19JTlRFUkxBQ0VEKG1iX3R5cGUpKXsKKyAgICAgICAgICAgIHNjYW44eDggPSBzbC0+cXNjYWxlID8gaC0+ZmllbGRfc2Nhbjh4OCA6IGgtPmZpZWxkX3NjYW44eDhfcTA7CisgICAgICAgICAgICBzY2FuICAgID0gc2wtPnFzY2FsZSA/IGgtPmZpZWxkX3NjYW4gOiBoLT5maWVsZF9zY2FuX3EwOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHNjYW44eDggPSBzbC0+cXNjYWxlID8gaC0+emlnemFnX3NjYW44eDggOiBoLT56aWd6YWdfc2Nhbjh4OF9xMDsKKyAgICAgICAgICAgIHNjYW4gICAgPSBzbC0+cXNjYWxlID8gaC0+emlnemFnX3NjYW4gOiBoLT56aWd6YWdfc2Nhbl9xMDsKKyAgICAgICAgfQorCiAgICAgICAgIGRlY29kZV9jYWJhY19sdW1hX3Jlc2lkdWFsKGgsIHNsLCBzY2FuLCBzY2FuOHg4LCBwaXhlbF9zaGlmdCwgbWJfdHlwZSwgY2JwLCAwKTsKICAgICAgICAgaWYgKENIUk9NQTQ0NChoKSkgewogICAgICAgICAgICAgZGVjb2RlX2NhYmFjX2x1bWFfcmVzaWR1YWwoaCwgc2wsIHNjYW4sIHNjYW44eDgsIHBpeGVsX3NoaWZ0LCBtYl90eXBlLCBjYnAsIDEpOwpAQCAtMjQxNCwxNCArMjQzNywxNCBAQAogICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAyOyBjKyspCiAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9jYWJhY19yZXNpZHVhbF9kY180MjIoaCwgc2wsIHNsLT5tYiArICgoMjU2ICsgMTYqMTYqYykgPDwgcGl4ZWxfc2hpZnQpLCAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIUk9NQV9EQ19CTE9DS19JTkRFWCArIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21hNDIyX2RjX3NjYW4sIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjRfY2hyb21hNDIyX2RjX3NjYW4sIDgpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiggY2JwJjB4MjAgKSB7CiAgICAgICAgICAgICAgICAgaW50IGMsIGksIGk4eDg7CiAgICAgICAgICAgICAgICAgZm9yKCBjID0gMDsgYyA8IDI7IGMrKyApIHsKICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqbWIgPSBzbC0+bWIgKyAoMTYqKDE2ICsgMTYqYykgPDwgcGl4ZWxfc2hpZnQpOwotICAgICAgICAgICAgICAgICAgICBxbXVsID0gaC0+ZGVxdWFudDRfY29lZmZbYysxKyhJU19JTlRSQSggbWJfdHlwZSApID8gMDozKV1bc2wtPmNocm9tYV9xcFtjXV07CisgICAgICAgICAgICAgICAgICAgIHFtdWwgPSBoLT5wcy5wcHMtPmRlcXVhbnQ0X2NvZWZmW2MrMSsoSVNfSU5UUkEoIG1iX3R5cGUgKSA/IDA6MyldW3NsLT5jaHJvbWFfcXBbY11dOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGk4eDggPSAwOyBpOHg4IDwgMjsgaTh4OCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gMTYgKyAxNiAqIGMgKyA4Kmk4eDggKyBpOwpAQCAtMjQzOCwxMyArMjQ2MSwxNCBAQAogICAgICAgICAgICAgaWYoIGNicCYweDMwICl7CiAgICAgICAgICAgICAgICAgaW50IGM7CiAgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IDI7IGMrKykKLSAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX2RjKGgsIHNsLCBzbC0+bWIgKyAoKDI1NiArIDE2KjE2KmMpIDw8IHBpeGVsX3NoaWZ0KSwgMywgQ0hST01BX0RDX0JMT0NLX0lOREVYK2MsIGNocm9tYV9kY19zY2FuLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2NhYmFjX3Jlc2lkdWFsX2RjKGgsIHNsLCBzbC0+bWIgKyAoKDI1NiArIDE2ICogMTYgKiBjKSA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCBDSFJPTUFfRENfQkxPQ0tfSU5ERVggKyBjLCBmZl9oMjY0X2Nocm9tYV9kY19zY2FuLCA0KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYoIGNicCYweDIwICkgewogICAgICAgICAgICAgICAgIGludCBjLCBpOwogICAgICAgICAgICAgICAgIGZvciggYyA9IDA7IGMgPCAyOyBjKysgKSB7Ci0gICAgICAgICAgICAgICAgICAgIHFtdWwgPSBoLT5kZXF1YW50NF9jb2VmZltjKzErKElTX0lOVFJBKCBtYl90eXBlICkgPyAwOjMpXVtzbC0+Y2hyb21hX3FwW2NdXTsKKyAgICAgICAgICAgICAgICAgICAgcW11bCA9IGgtPnBzLnBwcy0+ZGVxdWFudDRfY29lZmZbYysxKyhJU19JTlRSQSggbWJfdHlwZSApID8gMDozKV1bc2wtPmNocm9tYV9xcFtjXV07CiAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXggPSAxNiArIDE2ICogYyArIGk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfY2FiYWNfcmVzaWR1YWxfbm9uZGMoaCwgc2wsIHNsLT5tYiArICgxNippbmRleCA8PCBwaXhlbF9zaGlmdCksIDQsIGluZGV4LCBzY2FuICsgMSwgcW11bCwgMTUpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X2NhdmxjLmMgYi9saWJhdmNvZGVjL2gyNjRfY2F2bGMuYwppbmRleCBiMDI1MWY0Li5kODIxNDRlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRfY2F2bGMuYworKysgYi9saWJhdmNvZGVjL2gyNjRfY2F2bGMuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBjYXZsYyBiaXRzdHJlYW0gZGVjb2RpbmcuCisgKiBILjI2NCAvIEFWQyAvIE1QRUctNCBwYXJ0MTAgY2F2bGMgYml0c3RyZWFtIGRlY29kaW5nLgogICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICovCiAKQEAgLTMwLDkgKzMwLDkgQEAKIAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImgyNjQuaCIKLSNpbmNsdWRlICJoMjY0ZGF0YS5oIiAvLyBGSVhNRSBGSVhNRSBGSVhNRQorI2luY2x1ZGUgImgyNjRkZWMuaCIKICNpbmNsdWRlICJoMjY0X212cHJlZC5oIgorI2luY2x1ZGUgImgyNjRkYXRhLmgiCiAjaW5jbHVkZSAiZ29sb21iLmgiCiAjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCkBAIC0yNDgsMTkgKzI0OCwxOSBAQAogc3RhdGljIFZMQ19UWVBFIGNocm9tYTQyMl9kY19jb2VmZl90b2tlbl92bGNfdGFibGVbODE5Ml1bMl07CiBzdGF0aWMgY29uc3QgaW50IGNocm9tYTQyMl9kY19jb2VmZl90b2tlbl92bGNfdGFibGVfc2l6ZSA9IDgxOTI7CiAKLXN0YXRpYyBWTEMgdG90YWxfemVyb3NfdmxjWzE1XTsKK3N0YXRpYyBWTEMgdG90YWxfemVyb3NfdmxjWzE1KzFdOwogc3RhdGljIFZMQ19UWVBFIHRvdGFsX3plcm9zX3ZsY190YWJsZXNbMTVdWzUxMl1bMl07CiBzdGF0aWMgY29uc3QgaW50IHRvdGFsX3plcm9zX3ZsY190YWJsZXNfc2l6ZSA9IDUxMjsKIAotc3RhdGljIFZMQyBjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjWzNdOworc3RhdGljIFZMQyBjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjWzMrMV07CiBzdGF0aWMgVkxDX1RZUEUgY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNbM11bOF1bMl07CiBzdGF0aWMgY29uc3QgaW50IGNocm9tYV9kY190b3RhbF96ZXJvc192bGNfdGFibGVzX3NpemUgPSA4OwogCi1zdGF0aWMgVkxDIGNocm9tYTQyMl9kY190b3RhbF96ZXJvc192bGNbN107CitzdGF0aWMgVkxDIGNocm9tYTQyMl9kY190b3RhbF96ZXJvc192bGNbNysxXTsKIHN0YXRpYyBWTENfVFlQRSBjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjX3RhYmxlc1s3XVszMl1bMl07CiBzdGF0aWMgY29uc3QgaW50IGNocm9tYTQyMl9kY190b3RhbF96ZXJvc192bGNfdGFibGVzX3NpemUgPSAzMjsKIAotc3RhdGljIFZMQyBydW5fdmxjWzZdOworc3RhdGljIFZMQyBydW5fdmxjWzYrMV07CiBzdGF0aWMgVkxDX1RZUEUgcnVuX3ZsY190YWJsZXNbNl1bOF1bMl07CiBzdGF0aWMgY29uc3QgaW50IHJ1bl92bGNfdGFibGVzX3NpemUgPSA4OwogCkBAIC0zNjQsOSArMzY0LDkgQEAKICAgICAgICAgYXZfYXNzZXJ0MChvZmZzZXQgPT0gRkZfQVJSQVlfRUxFTVMoY29lZmZfdG9rZW5fdmxjX3RhYmxlcykpOwogCiAgICAgICAgIGZvcihpPTA7IGk8MzsgaSsrKXsKLSAgICAgICAgICAgIGNocm9tYV9kY190b3RhbF96ZXJvc192bGNbaV0udGFibGUgPSBjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjX3RhYmxlc1tpXTsKLSAgICAgICAgICAgIGNocm9tYV9kY190b3RhbF96ZXJvc192bGNbaV0udGFibGVfYWxsb2NhdGVkID0gY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNfc2l6ZTsKLSAgICAgICAgICAgIGluaXRfdmxjKCZjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjW2ldLAorICAgICAgICAgICAgY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY1tpKzFdLnRhYmxlID0gY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNbaV07CisgICAgICAgICAgICBjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjW2krMV0udGFibGVfYWxsb2NhdGVkID0gY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNfc2l6ZTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZjaHJvbWFfZGNfdG90YWxfemVyb3NfdmxjW2krMV0sCiAgICAgICAgICAgICAgICAgICAgICBDSFJPTUFfRENfVE9UQUxfWkVST1NfVkxDX0JJVFMsIDQsCiAgICAgICAgICAgICAgICAgICAgICAmY2hyb21hX2RjX3RvdGFsX3plcm9zX2xlbiBbaV1bMF0sIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgICAmY2hyb21hX2RjX3RvdGFsX3plcm9zX2JpdHNbaV1bMF0sIDEsIDEsCkBAIC0zNzQsOSArMzc0LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZvcihpPTA7IGk8NzsgaSsrKXsKLSAgICAgICAgICAgIGNocm9tYTQyMl9kY190b3RhbF96ZXJvc192bGNbaV0udGFibGUgPSBjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjX3RhYmxlc1tpXTsKLSAgICAgICAgICAgIGNocm9tYTQyMl9kY190b3RhbF96ZXJvc192bGNbaV0udGFibGVfYWxsb2NhdGVkID0gY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNfc2l6ZTsKLSAgICAgICAgICAgIGluaXRfdmxjKCZjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjW2ldLAorICAgICAgICAgICAgY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX3ZsY1tpKzFdLnRhYmxlID0gY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNbaV07CisgICAgICAgICAgICBjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjW2krMV0udGFibGVfYWxsb2NhdGVkID0gY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX3ZsY190YWJsZXNfc2l6ZTsKKyAgICAgICAgICAgIGluaXRfdmxjKCZjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjW2krMV0sCiAgICAgICAgICAgICAgICAgICAgICBDSFJPTUE0MjJfRENfVE9UQUxfWkVST1NfVkxDX0JJVFMsIDgsCiAgICAgICAgICAgICAgICAgICAgICAmY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX2xlbiBbaV1bMF0sIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgICAmY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX2JpdHNbaV1bMF0sIDEsIDEsCkBAIC0zODQsOSArMzg0LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGZvcihpPTA7IGk8MTU7IGkrKyl7Ci0gICAgICAgICAgICB0b3RhbF96ZXJvc192bGNbaV0udGFibGUgPSB0b3RhbF96ZXJvc192bGNfdGFibGVzW2ldOwotICAgICAgICAgICAgdG90YWxfemVyb3NfdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IHRvdGFsX3plcm9zX3ZsY190YWJsZXNfc2l6ZTsKLSAgICAgICAgICAgIGluaXRfdmxjKCZ0b3RhbF96ZXJvc192bGNbaV0sCisgICAgICAgICAgICB0b3RhbF96ZXJvc192bGNbaSsxXS50YWJsZSA9IHRvdGFsX3plcm9zX3ZsY190YWJsZXNbaV07CisgICAgICAgICAgICB0b3RhbF96ZXJvc192bGNbaSsxXS50YWJsZV9hbGxvY2F0ZWQgPSB0b3RhbF96ZXJvc192bGNfdGFibGVzX3NpemU7CisgICAgICAgICAgICBpbml0X3ZsYygmdG90YWxfemVyb3NfdmxjW2krMV0sCiAgICAgICAgICAgICAgICAgICAgICBUT1RBTF9aRVJPU19WTENfQklUUywgMTYsCiAgICAgICAgICAgICAgICAgICAgICAmdG90YWxfemVyb3NfbGVuIFtpXVswXSwgMSwgMSwKICAgICAgICAgICAgICAgICAgICAgICZ0b3RhbF96ZXJvc19iaXRzW2ldWzBdLCAxLCAxLApAQCAtMzk0LDkgKzM5NCw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBmb3IoaT0wOyBpPDY7IGkrKyl7Ci0gICAgICAgICAgICBydW5fdmxjW2ldLnRhYmxlID0gcnVuX3ZsY190YWJsZXNbaV07Ci0gICAgICAgICAgICBydW5fdmxjW2ldLnRhYmxlX2FsbG9jYXRlZCA9IHJ1bl92bGNfdGFibGVzX3NpemU7Ci0gICAgICAgICAgICBpbml0X3ZsYygmcnVuX3ZsY1tpXSwKKyAgICAgICAgICAgIHJ1bl92bGNbaSsxXS50YWJsZSA9IHJ1bl92bGNfdGFibGVzW2ldOworICAgICAgICAgICAgcnVuX3ZsY1tpKzFdLnRhYmxlX2FsbG9jYXRlZCA9IHJ1bl92bGNfdGFibGVzX3NpemU7CisgICAgICAgICAgICBpbml0X3ZsYygmcnVuX3ZsY1tpKzFdLAogICAgICAgICAgICAgICAgICAgICAgUlVOX1ZMQ19CSVRTLCA3LAogICAgICAgICAgICAgICAgICAgICAgJnJ1bl9sZW4gW2ldWzBdLCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAgJnJ1bl9iaXRzW2ldWzBdLCAxLCAxLApAQCAtNDEzLDkgKzQxMyw2IEBACiAgICAgfQogfQogCi0vKioKLSAqCi0gKi8KIHN0YXRpYyBpbmxpbmUgaW50IGdldF9sZXZlbF9wcmVmaXgoR2V0Qml0Q29udGV4dCAqZ2IpewogICAgIHVuc2lnbmVkIGludCBidWY7CiAgICAgaW50IGxvZzsKQEAgLTQyNSwxMCArNDIyLDYgQEAKICAgICBidWY9R0VUX0NBQ0hFKHJlLCBnYik7CiAKICAgICBsb2c9IDMyIC0gYXZfbG9nMihidWYpOwotI2lmZGVmIFRSQUNFCi0gICAgcHJpbnRfYmluKGJ1Zj4+KDMyLWxvZyksIGxvZyk7Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIiU1ZCAlMmQgJTNkIGxwciBAJTVkIGluICVzIGdldF9sZXZlbF9wcmVmaXhcbiIsIGJ1Zj4+KDMyLWxvZyksIGxvZywgbG9nLTEsIGdldF9iaXRzX2NvdW50KGdiKSwgX19GSUxFX18pOwotI2VuZGlmCiAKICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIGxvZyk7CiAgICAgQ0xPU0VfUkVBREVSKHJlLCBnYik7CkBAIC01NzcsMTMgKzU3MCwxMyBAQAogICAgIGVsc2V7CiAgICAgICAgIGlmIChtYXhfY29lZmYgPD0gOCkgewogICAgICAgICAgICAgaWYgKG1heF9jb2VmZiA9PSA0KQotICAgICAgICAgICAgICAgIHplcm9zX2xlZnQgPSBnZXRfdmxjMihnYiwgKGNocm9tYV9kY190b3RhbF96ZXJvc192bGMtMSlbdG90YWxfY29lZmZdLnRhYmxlLAorICAgICAgICAgICAgICAgIHplcm9zX2xlZnQgPSBnZXRfdmxjMihnYiwgY2hyb21hX2RjX3RvdGFsX3plcm9zX3ZsY1t0b3RhbF9jb2VmZl0udGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIUk9NQV9EQ19UT1RBTF9aRVJPU19WTENfQklUUywgMSk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgemVyb3NfbGVmdCA9IGdldF92bGMyKGdiLCAoY2hyb21hNDIyX2RjX3RvdGFsX3plcm9zX3ZsYy0xKVt0b3RhbF9jb2VmZl0udGFibGUsCisgICAgICAgICAgICAgICAgemVyb3NfbGVmdCA9IGdldF92bGMyKGdiLCBjaHJvbWE0MjJfZGNfdG90YWxfemVyb3NfdmxjW3RvdGFsX2NvZWZmXS50YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hST01BNDIyX0RDX1RPVEFMX1pFUk9TX1ZMQ19CSVRTLCAxKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHplcm9zX2xlZnQ9IGdldF92bGMyKGdiLCAodG90YWxfemVyb3NfdmxjLTEpWyB0b3RhbF9jb2VmZiBdLnRhYmxlLCBUT1RBTF9aRVJPU19WTENfQklUUywgMSk7CisgICAgICAgICAgICB6ZXJvc19sZWZ0PSBnZXRfdmxjMihnYiwgdG90YWxfemVyb3NfdmxjWyB0b3RhbF9jb2VmZiBdLnRhYmxlLCBUT1RBTF9aRVJPU19WTENfQklUUywgMSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU5Myw3ICs1ODYsNyBAQAogICAgICAgICAoKHR5cGUqKWJsb2NrKVsqc2NhbnRhYmxlXSA9IGxldmVsWzBdOyBcCiAgICAgICAgIGZvcihpPTE7aTx0b3RhbF9jb2VmZiAmJiB6ZXJvc19sZWZ0ID4gMDtpKyspIHsgXAogICAgICAgICAgICAgaWYoemVyb3NfbGVmdCA8IDcpIFwKLSAgICAgICAgICAgICAgICBydW5fYmVmb3JlPSBnZXRfdmxjMihnYiwgKHJ1bl92bGMtMSlbemVyb3NfbGVmdF0udGFibGUsIFJVTl9WTENfQklUUywgMSk7IFwKKyAgICAgICAgICAgICAgICBydW5fYmVmb3JlPSBnZXRfdmxjMihnYiwgcnVuX3ZsY1t6ZXJvc19sZWZ0XS50YWJsZSwgUlVOX1ZMQ19CSVRTLCAxKTsgXAogICAgICAgICAgICAgZWxzZSBcCiAgICAgICAgICAgICAgICAgcnVuX2JlZm9yZT0gZ2V0X3ZsYzIoZ2IsIHJ1bjdfdmxjLnRhYmxlLCBSVU43X1ZMQ19CSVRTLCAyKTsgXAogICAgICAgICAgICAgemVyb3NfbGVmdCAtPSBydW5fYmVmb3JlOyBcCkBAIC02MDgsNyArNjAxLDcgQEAKICAgICAgICAgKCh0eXBlKilibG9jaylbKnNjYW50YWJsZV0gPSAoKGludCkobGV2ZWxbMF0gKiBxbXVsWypzY2FudGFibGVdICsgMzIpKT4+NjsgXAogICAgICAgICBmb3IoaT0xO2k8dG90YWxfY29lZmYgJiYgemVyb3NfbGVmdCA+IDA7aSsrKSB7IFwKICAgICAgICAgICAgIGlmKHplcm9zX2xlZnQgPCA3KSBcCi0gICAgICAgICAgICAgICAgcnVuX2JlZm9yZT0gZ2V0X3ZsYzIoZ2IsIChydW5fdmxjLTEpW3plcm9zX2xlZnRdLnRhYmxlLCBSVU5fVkxDX0JJVFMsIDEpOyBcCisgICAgICAgICAgICAgICAgcnVuX2JlZm9yZT0gZ2V0X3ZsYzIoZ2IsIHJ1bl92bGNbemVyb3NfbGVmdF0udGFibGUsIFJVTl9WTENfQklUUywgMSk7IFwKICAgICAgICAgICAgIGVsc2UgXAogICAgICAgICAgICAgICAgIHJ1bl9iZWZvcmU9IGdldF92bGMyKGdiLCBydW43X3ZsYy50YWJsZSwgUlVON19WTENfQklUUywgMik7IFwKICAgICAgICAgICAgIHplcm9zX2xlZnQgLT0gcnVuX2JlZm9yZTsgXApAQCAtNjU5LDcgKzY1Miw3IEBACiAgICAgICAgICAgICAgICAgZm9yKGk0eDQ9MDsgaTR4NDw0OyBpNHg0KyspewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXg9IGk0eDQgKyA0Kmk4eDggKyBwKjE2OwogICAgICAgICAgICAgICAgICAgICBpZiggZGVjb2RlX3Jlc2lkdWFsKGgsIHNsLCBnYiwgc2wtPm1iICsgKDE2KmluZGV4IDw8IHBpeGVsX3NoaWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzY2FuICsgMSwgaC0+ZGVxdWFudDRfY29lZmZbcF1bcXNjYWxlXSwgMTUpIDwgMCApeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIHNjYW4gKyAxLCBoLT5wcy5wcHMtPmRlcXVhbnQ0X2NvZWZmW3BdW3FzY2FsZV0sIDE1KSA8IDAgKXsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTY4MSw3ICs2NzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBmb3IoaTR4ND0wOyBpNHg0PDQ7IGk0eDQrKyl7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaW5kZXg9IGk0eDQgKyA0Kmk4eDggKyBwKjE2OwogICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGRlY29kZV9yZXNpZHVhbChoLCBzbCwgZ2IsIGJ1ZiwgaW5kZXgsIHNjYW44eDgrMTYqaTR4NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZGVxdWFudDhfY29lZmZbY3FtXVtxc2NhbGVdLCAxNikgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHMucHBzLT5kZXF1YW50OF9jb2VmZltjcW1dW3FzY2FsZV0sIDE2KSA8IDAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBubnogPSAmc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44WzQgKiBpOHg4ICsgcCAqIDE2XV07CkBAIC02OTEsNyArNjg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZm9yKGk0eDQ9MDsgaTR4NDw0OyBpNHg0KyspewogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGluZGV4PSBpNHg0ICsgNCppOHg4ICsgcCoxNjsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBkZWNvZGVfcmVzaWR1YWwoaCwgc2wsIGdiLCBzbC0+bWIgKyAoMTYqaW5kZXggPDwgcGl4ZWxfc2hpZnQpLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbiwgaC0+ZGVxdWFudDRfY29lZmZbY3FtXVtxc2NhbGVdLCAxNikgPCAwICl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW4sIGgtPnBzLnBwcy0+ZGVxdWFudDRfY29lZmZbY3FtXVtxc2NhbGVdLCAxNikgPCAwICl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NicCB8PSBzbC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbaW5kZXhdXSA8PCBpOHg4OwpAQCAtNzExLDE4ICs3MDQsMjQgQEAKICAgICBpbnQgbWJfeHk7CiAgICAgaW50IHBhcnRpdGlvbl9jb3VudDsKICAgICB1bnNpZ25lZCBpbnQgbWJfdHlwZSwgY2JwOwotICAgIGludCBkY3Q4eDhfYWxsb3dlZD0gaC0+cHBzLnRyYW5zZm9ybV84eDhfbW9kZTsKLSAgICBpbnQgZGVjb2RlX2Nocm9tYSA9IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxIHx8IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyOworICAgIGludCBkY3Q4eDhfYWxsb3dlZCA9IGgtPnBzLnBwcy0+dHJhbnNmb3JtXzh4OF9tb2RlOworICAgIGNvbnN0IGludCBkZWNvZGVfY2hyb21hID0gaC0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxIHx8IGgtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMjsKICAgICBjb25zdCBpbnQgcGl4ZWxfc2hpZnQgPSBoLT5waXhlbF9zaGlmdDsKIAogICAgIG1iX3h5ID0gc2wtPm1iX3h5ID0gc2wtPm1iX3ggKyBzbC0+bWJfeSpoLT5tYl9zdHJpZGU7CiAKLSAgICBmZl90bG9nKGgtPmF2Y3R4LCAicGljOiVkIG1iOiVkLyVkXG4iLCBoLT5mcmFtZV9udW0sIHNsLT5tYl94LCBzbC0+bWJfeSk7CisgICAgZmZfdGxvZyhoLT5hdmN0eCwgInBpYzolZCBtYjolZC8lZFxuIiwgaC0+cG9jLmZyYW1lX251bSwgc2wtPm1iX3gsIHNsLT5tYl95KTsKICAgICBjYnAgPSAwOyAvKiBhdm9pZCB3YXJuaW5nLiBGSVhNRTogZmluZCBhIHNvbHV0aW9uIHdpdGhvdXQgc2xvd2luZwogICAgICAgICAgICAgICAgIGRvd24gdGhlIGNvZGUgKi8KICAgICBpZiAoc2wtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB7Ci0gICAgICAgIGlmIChzbC0+bWJfc2tpcF9ydW4gPT0gLTEpCi0gICAgICAgICAgICBzbC0+bWJfc2tpcF9ydW4gPSBnZXRfdWVfZ29sb21iX2xvbmcoJnNsLT5nYik7CisgICAgICAgIGlmIChzbC0+bWJfc2tpcF9ydW4gPT0gLTEpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1iX3NraXBfcnVuID0gZ2V0X3VlX2dvbG9tYl9sb25nKCZzbC0+Z2IpOworICAgICAgICAgICAgaWYgKG1iX3NraXBfcnVuID4gaC0+bWJfbnVtKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtYl9za2lwX3J1biAlZCBpcyBpbnZhbGlkXG4iLCBtYl9za2lwX3J1bik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzbC0+bWJfc2tpcF9ydW4gPSBtYl9za2lwX3J1bjsKKyAgICAgICAgfQogCiAgICAgICAgIGlmIChzbC0+bWJfc2tpcF9ydW4tLSkgewogICAgICAgICAgICAgaWYgKEZSQU1FX01CQUZGKGgpICYmIChzbC0+bWJfeSAmIDEpID09IDApIHsKQEAgLTc0MywxNiArNzQyLDE2IEBACiAgICAgbWJfdHlwZT0gZ2V0X3VlX2dvbG9tYigmc2wtPmdiKTsKICAgICBpZiAoc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CiAgICAgICAgIGlmKG1iX3R5cGUgPCAyMyl7Ci0gICAgICAgICAgICBwYXJ0aXRpb25fY291bnQ9IGJfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnBhcnRpdGlvbl9jb3VudDsKLSAgICAgICAgICAgIG1iX3R5cGU9ICAgICAgICAgYl9tYl90eXBlX2luZm9bbWJfdHlwZV0udHlwZTsKKyAgICAgICAgICAgIHBhcnRpdGlvbl9jb3VudCA9IGZmX2gyNjRfYl9tYl90eXBlX2luZm9bbWJfdHlwZV0ucGFydGl0aW9uX2NvdW50OworICAgICAgICAgICAgbWJfdHlwZSAgICAgICAgID0gZmZfaDI2NF9iX21iX3R5cGVfaW5mb1ttYl90eXBlXS50eXBlOwogICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgIG1iX3R5cGUgLT0gMjM7CiAgICAgICAgICAgICBnb3RvIGRlY29kZV9pbnRyYV9tYjsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CiAgICAgICAgIGlmKG1iX3R5cGUgPCA1KXsKLSAgICAgICAgICAgIHBhcnRpdGlvbl9jb3VudD0gcF9tYl90eXBlX2luZm9bbWJfdHlwZV0ucGFydGl0aW9uX2NvdW50OwotICAgICAgICAgICAgbWJfdHlwZT0gICAgICAgICBwX21iX3R5cGVfaW5mb1ttYl90eXBlXS50eXBlOworICAgICAgICAgICAgcGFydGl0aW9uX2NvdW50ID0gZmZfaDI2NF9wX21iX3R5cGVfaW5mb1ttYl90eXBlXS5wYXJ0aXRpb25fY291bnQ7CisgICAgICAgICAgICBtYl90eXBlICAgICAgICAgPSBmZl9oMjY0X3BfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnR5cGU7CiAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgbWJfdHlwZSAtPSA1OwogICAgICAgICAgICAgZ290byBkZWNvZGVfaW50cmFfbWI7CkBAIC03NjcsOSArNzY2LDkgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBwYXJ0aXRpb25fY291bnQ9MDsKLSAgICAgICAgY2JwPSBpX21iX3R5cGVfaW5mb1ttYl90eXBlXS5jYnA7Ci0gICAgICAgIHNsLT5pbnRyYTE2eDE2X3ByZWRfbW9kZSA9IGlfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnByZWRfbW9kZTsKLSAgICAgICAgbWJfdHlwZT0gaV9tYl90eXBlX2luZm9bbWJfdHlwZV0udHlwZTsKKyAgICAgICAgY2JwICAgICAgICAgICAgICAgICAgICAgID0gZmZfaDI2NF9pX21iX3R5cGVfaW5mb1ttYl90eXBlXS5jYnA7CisgICAgICAgIHNsLT5pbnRyYTE2eDE2X3ByZWRfbW9kZSA9IGZmX2gyNjRfaV9tYl90eXBlX2luZm9bbWJfdHlwZV0ucHJlZF9tb2RlOworICAgICAgICBtYl90eXBlICAgICAgICAgICAgICAgICAgPSBmZl9oMjY0X2lfbWJfdHlwZV9pbmZvW21iX3R5cGVdLnR5cGU7CiAgICAgfQogCiAgICAgaWYgKE1CX0ZJRUxEKHNsKSkKQEAgLTc3OCw4ICs3NzcsOCBAQAogICAgIGgtPnNsaWNlX3RhYmxlW21iX3h5XSA9IHNsLT5zbGljZV9udW07CiAKICAgICBpZihJU19JTlRSQV9QQ00obWJfdHlwZSkpewotICAgICAgICBjb25zdCBpbnQgbWJfc2l6ZSA9IGZmX2gyNjRfbWJfc2l6ZXNbaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjXSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c3BzLmJpdF9kZXB0aF9sdW1hOworICAgICAgICBjb25zdCBpbnQgbWJfc2l6ZSA9IGZmX2gyNjRfbWJfc2l6ZXNbaC0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkY10gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBzLnNwcy0+Yml0X2RlcHRoX2x1bWE7CiAKICAgICAgICAgLy8gV2UgYXNzdW1lIHRoZXNlIGJsb2NrcyBhcmUgdmVyeSByYXJlIHNvIHdlIGRvIG5vdCBvcHRpbWl6ZSBpdC4KICAgICAgICAgc2wtPmludHJhX3BjbV9wdHIgPSBhbGlnbl9nZXRfYml0cygmc2wtPmdiKTsKQEAgLTgyOCwxNSArODI3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIHNsLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbaV1dID0gbW9kZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHdyaXRlX2JhY2tfaW50cmFfcHJlZF9tb2RlKGgsIHNsKTsKLSAgICAgICAgICAgIGlmIChmZl9oMjY0X2NoZWNrX2ludHJhNHg0X3ByZWRfbW9kZShoLCBzbCkgPCAwKQorICAgICAgICAgICAgaWYgKGZmX2gyNjRfY2hlY2tfaW50cmE0eDRfcHJlZF9tb2RlKHNsLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGUsIGgtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT50b3Bfc2FtcGxlc19hdmFpbGFibGUsIHNsLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHNsLT5pbnRyYTE2eDE2X3ByZWRfbW9kZSA9IGZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlKGgsIHNsLCBzbC0+aW50cmExNngxNl9wcmVkX21vZGUsIDApOworICAgICAgICAgICAgc2wtPmludHJhMTZ4MTZfcHJlZF9tb2RlID0gZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUoaC0+YXZjdHgsIHNsLT50b3Bfc2FtcGxlc19hdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSwgc2wtPmludHJhMTZ4MTZfcHJlZF9tb2RlLCAwKTsKICAgICAgICAgICAgIGlmIChzbC0+aW50cmExNngxNl9wcmVkX21vZGUgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBpZihkZWNvZGVfY2hyb21hKXsKLSAgICAgICAgICAgIHByZWRfbW9kZT0gZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUoaCwgc2wsIGdldF91ZV9nb2xvbWJfMzEoJnNsLT5nYiksIDEpOworICAgICAgICAgICAgcHJlZF9tb2RlPSBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShoLT5hdmN0eCwgc2wtPnRvcF9zYW1wbGVzX2F2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUsIGdldF91ZV9nb2xvbWJfMzEoJnNsLT5nYiksIDEpOwogICAgICAgICAgICAgaWYocHJlZF9tb2RlIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICBzbC0+Y2hyb21hX3ByZWRfbW9kZSA9IHByZWRfbW9kZTsKQEAgLTg1Myw4ICs4NTUsOCBAQAogICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkIgc3ViX21iX3R5cGUgJXUgb3V0IG9mIHJhbmdlIGF0ICVkICVkXG4iLCBzbC0+c3ViX21iX3R5cGVbaV0sIHNsLT5tYl94LCBzbC0+bWJfeSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3ViX3BhcnRpdGlvbl9jb3VudFtpXT0gYl9zdWJfbWJfdHlwZV9pbmZvWyBzbC0+c3ViX21iX3R5cGVbaV0gXS5wYXJ0aXRpb25fY291bnQ7Ci0gICAgICAgICAgICAgICAgc2wtPnN1Yl9tYl90eXBlW2ldPSAgICAgIGJfc3ViX21iX3R5cGVfaW5mb1sgc2wtPnN1Yl9tYl90eXBlW2ldIF0udHlwZTsKKyAgICAgICAgICAgICAgICBzdWJfcGFydGl0aW9uX2NvdW50W2ldID0gZmZfaDI2NF9iX3N1Yl9tYl90eXBlX2luZm9bc2wtPnN1Yl9tYl90eXBlW2ldXS5wYXJ0aXRpb25fY291bnQ7CisgICAgICAgICAgICAgICAgc2wtPnN1Yl9tYl90eXBlW2ldICAgICA9IGZmX2gyNjRfYl9zdWJfbWJfdHlwZV9pbmZvW3NsLT5zdWJfbWJfdHlwZVtpXV0udHlwZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKCBJU19ESVJFQ1Qoc2wtPnN1Yl9tYl90eXBlWzBdfHNsLT5zdWJfbWJfdHlwZVsxXXxzbC0+c3ViX21iX3R5cGVbMl18c2wtPnN1Yl9tYl90eXBlWzNdKSkgewogICAgICAgICAgICAgICAgIGZmX2gyNjRfcHJlZF9kaXJlY3RfbW90aW9uKGgsIHNsLCAmbWJfdHlwZSk7CkBAIC04NzEsOCArODczLDggQEAKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQIHN1Yl9tYl90eXBlICV1IG91dCBvZiByYW5nZSBhdCAlZCAlZFxuIiwgc2wtPnN1Yl9tYl90eXBlW2ldLCBzbC0+bWJfeCwgc2wtPm1iX3kpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1Yl9wYXJ0aXRpb25fY291bnRbaV09IHBfc3ViX21iX3R5cGVfaW5mb1sgc2wtPnN1Yl9tYl90eXBlW2ldIF0ucGFydGl0aW9uX2NvdW50OwotICAgICAgICAgICAgICAgIHNsLT5zdWJfbWJfdHlwZVtpXT0gICAgICBwX3N1Yl9tYl90eXBlX2luZm9bIHNsLT5zdWJfbWJfdHlwZVtpXSBdLnR5cGU7CisgICAgICAgICAgICAgICAgc3ViX3BhcnRpdGlvbl9jb3VudFtpXSA9IGZmX2gyNjRfcF9zdWJfbWJfdHlwZV9pbmZvW3NsLT5zdWJfbWJfdHlwZVtpXV0ucGFydGl0aW9uX2NvdW50OworICAgICAgICAgICAgICAgIHNsLT5zdWJfbWJfdHlwZVtpXSAgICAgPSBmZl9oMjY0X3Bfc3ViX21iX3R5cGVfaW5mb1tzbC0+c3ViX21iX3R5cGVbaV1dLnR5cGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtOTQ5LDcgKzk1MSw3IEBACiAgICAgICAgIH0KICAgICB9ZWxzZSBpZihJU19ESVJFQ1QobWJfdHlwZSkpewogICAgICAgICBmZl9oMjY0X3ByZWRfZGlyZWN0X21vdGlvbihoLCBzbCwgJm1iX3R5cGUpOwotICAgICAgICBkY3Q4eDhfYWxsb3dlZCAmPSBoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKKyAgICAgICAgZGN0OHg4X2FsbG93ZWQgJj0gaC0+cHMuc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOwogICAgIH1lbHNlewogICAgICAgICBpbnQgbGlzdCwgbXgsIG15LCBpOwogICAgICAgICAgLy9GSVhNRSB3ZSBzaG91bGQgc2V0IHJlZl9pZHhfbD8gdG8gMCBpZiB3ZSB1c2UgdGhhdCBsYXRlciAuLi4KQEAgLTEwNzIsOCArMTA3NCwxMCBAQAogICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2JwIHRvbyBsYXJnZSAoJXUpIGF0ICVkICVkXG4iLCBjYnAsIHNsLT5tYl94LCBzbC0+bWJfeSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoSVNfSU5UUkE0eDQobWJfdHlwZSkpIGNicD0gZ29sb21iX3RvX2ludHJhNHg0X2NicFtjYnBdOwotICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgIGNicD0gZ29sb21iX3RvX2ludGVyX2NicCAgIFtjYnBdOworICAgICAgICAgICAgaWYgKElTX0lOVFJBNHg0KG1iX3R5cGUpKQorICAgICAgICAgICAgICAgIGNicCA9IGZmX2gyNjRfZ29sb21iX3RvX2ludHJhNHg0X2NicFtjYnBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNicCA9IGZmX2gyNjRfZ29sb21iX3RvX2ludGVyX2NicFtjYnBdOwogICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgIGlmKGNicCA+IDE1KXsKICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNicCB0b28gbGFyZ2UgKCV1KSBhdCAlZCAlZFxuIiwgY2JwLCBzbC0+bWJfeCwgc2wtPm1iX3kpOwpAQCAtMTEwMiw3ICsxMTA2LDI0IEBACiAgICAgICAgIGludCByZXQ7CiAgICAgICAgIEdldEJpdENvbnRleHQgKmdiID0gJnNsLT5nYjsKICAgICAgICAgY29uc3QgdWludDhfdCAqc2NhbiwgKnNjYW44eDg7Ci0gICAgICAgIGNvbnN0IGludCBtYXhfcXAgPSA1MSArIDYqKGgtPnNwcy5iaXRfZGVwdGhfbHVtYS04KTsKKyAgICAgICAgY29uc3QgaW50IG1heF9xcCA9IDUxICsgNiAqIChoLT5wcy5zcHMtPmJpdF9kZXB0aF9sdW1hIC0gOCk7CisKKyAgICAgICAgZHF1YW50PSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOworCisgICAgICAgIHNsLT5xc2NhbGUgKz0gKHVuc2lnbmVkKWRxdWFudDsKKworICAgICAgICBpZiAoKCh1bnNpZ25lZClzbC0+cXNjYWxlKSA+IG1heF9xcCl7CisgICAgICAgICAgICBpZiAoc2wtPnFzY2FsZSA8IDApIHNsLT5xc2NhbGUgKz0gbWF4X3FwICsgMTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgc2wtPnFzY2FsZSAtPSBtYXhfcXArMTsKKyAgICAgICAgICAgIGlmICgoKHVuc2lnbmVkKXNsLT5xc2NhbGUpID4gbWF4X3FwKXsKKyAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRxdWFudCBvdXQgb2YgcmFuZ2UgKCVkKSBhdCAlZCAlZFxuIiwgZHF1YW50LCBzbC0+bWJfeCwgc2wtPm1iX3kpOworICAgICAgICAgICAgICAgIHNsLT5xc2NhbGUgPSBtYXhfcXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2wtPmNocm9tYV9xcFswXSA9IGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAwLCBzbC0+cXNjYWxlKTsKKyAgICAgICAgc2wtPmNocm9tYV9xcFsxXSA9IGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAxLCBzbC0+cXNjYWxlKTsKIAogICAgICAgICBpZihJU19JTlRFUkxBQ0VEKG1iX3R5cGUpKXsKICAgICAgICAgICAgIHNjYW44eDggPSBzbC0+cXNjYWxlID8gaC0+ZmllbGRfc2Nhbjh4OF9jYXZsYyA6IGgtPmZpZWxkX3NjYW44eDhfY2F2bGNfcTA7CkBAIC0xMTEyLDIyICsxMTMzLDYgQEAKICAgICAgICAgICAgIHNjYW4gICAgPSBzbC0+cXNjYWxlID8gaC0+emlnemFnX3NjYW4gOiBoLT56aWd6YWdfc2Nhbl9xMDsKICAgICAgICAgfQogCi0gICAgICAgIGRxdWFudD0gZ2V0X3NlX2dvbG9tYigmc2wtPmdiKTsKLQotICAgICAgICBzbC0+cXNjYWxlICs9IGRxdWFudDsKLQotICAgICAgICBpZiAoKCh1bnNpZ25lZClzbC0+cXNjYWxlKSA+IG1heF9xcCl7Ci0gICAgICAgICAgICBpZiAoc2wtPnFzY2FsZSA8IDApIHNsLT5xc2NhbGUgKz0gbWF4X3FwICsgMTsKLSAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgc2wtPnFzY2FsZSAtPSBtYXhfcXArMTsKLSAgICAgICAgICAgIGlmICgoKHVuc2lnbmVkKXNsLT5xc2NhbGUpID4gbWF4X3FwKXsKLSAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRxdWFudCBvdXQgb2YgcmFuZ2UgKCVkKSBhdCAlZCAlZFxuIiwgZHF1YW50LCBzbC0+bWJfeCwgc2wtPm1iX3kpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHNsLT5jaHJvbWFfcXBbMF0gPSBnZXRfY2hyb21hX3FwKGgsIDAsIHNsLT5xc2NhbGUpOwotICAgICAgICBzbC0+Y2hyb21hX3FwWzFdID0gZ2V0X2Nocm9tYV9xcChoLCAxLCBzbC0+cXNjYWxlKTsKLQogICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9sdW1hX3Jlc2lkdWFsKGgsIHNsLCBnYiwgc2Nhbiwgc2Nhbjh4OCwgcGl4ZWxfc2hpZnQsIG1iX3R5cGUsIGNicCwgMCkpIDwgMCApIHsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpAQCAtMTE0MCwyMSArMTE0NSwyMSBAQAogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBudW1fYzh4OCA9IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYzsKKyAgICAgICAgICAgIGNvbnN0IGludCBudW1fYzh4OCA9IGgtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGM7CiAKICAgICAgICAgICAgIGlmKGNicCYweDMwKXsKICAgICAgICAgICAgICAgICBmb3IoY2hyb21hX2lkeD0wOyBjaHJvbWFfaWR4PDI7IGNocm9tYV9pZHgrKykKICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZV9yZXNpZHVhbChoLCBzbCwgZ2IsIHNsLT5tYiArICgoMjU2ICsgMTYqMTYqY2hyb21hX2lkeCkgPDwgcGl4ZWxfc2hpZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIUk9NQV9EQ19CTE9DS19JTkRFWCtjaHJvbWFfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIUk9NQTQyMihoKSA/IGNocm9tYTQyMl9kY19zY2FuIDogY2hyb21hX2RjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgNCpudW1fYzh4OCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hST01BX0RDX0JMT0NLX0lOREVYICsgY2hyb21hX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSFJPTUE0MjIoaCkgPyBmZl9oMjY0X2Nocm9tYTQyMl9kY19zY2FuIDogZmZfaDI2NF9jaHJvbWFfZGNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCA0ICogbnVtX2M4eDgpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmKGNicCYweDIwKXsKICAgICAgICAgICAgICAgICBmb3IoY2hyb21hX2lkeD0wOyBjaHJvbWFfaWR4PDI7IGNocm9tYV9pZHgrKyl7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpxbXVsID0gaC0+ZGVxdWFudDRfY29lZmZbY2hyb21hX2lkeCsxKyhJU19JTlRSQSggbWJfdHlwZSApID8gMDozKV1bc2wtPmNocm9tYV9xcFtjaHJvbWFfaWR4XV07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpxbXVsID0gaC0+cHMucHBzLT5kZXF1YW50NF9jb2VmZltjaHJvbWFfaWR4KzErKElTX0lOVFJBKCBtYl90eXBlICkgPyAwOjMpXVtzbC0+Y2hyb21hX3FwW2Nocm9tYV9pZHhdXTsKICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqbWIgPSBzbC0+bWIgKyAoMTYqKDE2ICsgMTYqY2hyb21hX2lkeCkgPDwgcGl4ZWxfc2hpZnQpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKGk4eDggPSAwOyBpOHg4PG51bV9jOHg4OyBpOHg4KyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTR4NCA9IDA7IGk0eDQgPCA0OyBpNHg0KyspIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NF9kaXJlY3QuYyBiL2xpYmF2Y29kZWMvaDI2NF9kaXJlY3QuYwppbmRleCA1ZjY2YTY3Li5hMDFkODIzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRfZGlyZWN0LmMKKysrIGIvbGliYXZjb2RlYy9oMjY0X2RpcmVjdC5jCkBAIC0yMSwxMyArMjEsMTQgQEAKIAogLyoqCiAgKiBAZmlsZQotICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgZGlyZWN0IG1iL2Jsb2NrIGRlY29kaW5nLgorICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwIGRpcmVjdCBtYi9ibG9jayBkZWNvZGluZy4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkZWMuaCIKKyNpbmNsdWRlICJoMjY0X3BzLmgiCiAjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCiAjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCkBAIC0zOCwxMiArMzksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9jLCBpbnQgcG9jMSwgaW50IGkpCiB7CiAgICAgaW50IHBvYzAgPSBzbC0+cmVmX2xpc3RbMF1baV0ucG9jOwotICAgIGludCB0ZCA9IGF2X2NsaXBfaW50OChwb2MxIC0gcG9jMCk7CisgICAgaW50NjRfdCBwb2NkaWZmID0gcG9jMSAtIChpbnQ2NF90KXBvYzA7CisgICAgaW50IHRkID0gYXZfY2xpcF9pbnQ4KHBvY2RpZmYpOworCisgICAgaWYgKHBvY2RpZmYgIT0gKGludClwb2NkaWZmKQorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoc2wtPmgyNjQtPmF2Y3R4LCAicG9jZGlmZiBvdmVyZmxvd1xuIik7CisKICAgICBpZiAodGQgPT0gMCB8fCBzbC0+cmVmX2xpc3RbMF1baV0ucGFyZW50LT5sb25nX3JlZikgewogICAgICAgICByZXR1cm4gMjU2OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCB0YiA9IGF2X2NsaXBfaW50OChwb2MgLSBwb2MwKTsKKyAgICAgICAgaW50NjRfdCBwb2NkaWZmMCA9IHBvYyAtIChpbnQ2NF90KXBvYzA7CisgICAgICAgIGludCB0YiA9IGF2X2NsaXBfaW50OChwb2NkaWZmMCk7CiAgICAgICAgIGludCB0eCA9ICgxNjM4NCArIChGRkFCUyh0ZCkgPj4gMSkpIC8gdGQ7CisKKyAgICAgICAgaWYgKHBvY2RpZmYwICE9IChpbnQpcG9jZGlmZjApCisgICAgICAgICAgICBhdl9sb2coc2wtPmgyNjQtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJwb2NkaWZmMCBvdmVyZmxvd1xuIik7CisKICAgICAgICAgcmV0dXJuIGF2X2NsaXBfaW50cDIoKHRiICogdHggKyAzMikgPj4gNiwgMTApOwogICAgIH0KIH0KQEAgLTEyNyw3ICsxMzgsMTEgQEAKICAgICAgICAgbWVtY3B5KGN1ci0+cmVmX3BvY1sxXSwgICBjdXItPnJlZl9wb2NbMF0sICAgc2l6ZW9mKGN1ci0+cmVmX3BvY1swXSkpOwogICAgIH0KIAotICAgIGN1ci0+bWJhZmYgPSBGUkFNRV9NQkFGRihoKTsKKyAgICBpZiAoaC0+Y3VycmVudF9zbGljZSA9PSAwKSB7CisgICAgICAgIGN1ci0+bWJhZmYgPSBGUkFNRV9NQkFGRihoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQwKGN1ci0+bWJhZmYgPT0gRlJBTUVfTUJBRkYoaCkpOworICAgIH0KIAogICAgIHNsLT5jb2xfZmllbGRvZmYgPSAwOwogCkBAIC0xNDEsOCArMTU2LDggQEAKICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY28gbG9jYXRlZCBQT0NzIHVuYXZhaWxhYmxlXG4iKTsKICAgICAgICAgICAgIHNsLT5jb2xfcGFyaXR5ID0gMTsKICAgICAgICAgfSBlbHNlCi0gICAgICAgIHNsLT5jb2xfcGFyaXR5ID0gKEZGQUJTKGNvbF9wb2NbMF0gLSBjdXJfcG9jKSA+PQotICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFCUyhjb2xfcG9jWzFdIC0gY3VyX3BvYykpOworICAgICAgICAgICAgc2wtPmNvbF9wYXJpdHkgPSAoRkZBQlMoY29sX3BvY1swXSAtIChpbnQ2NF90KWN1cl9wb2MpID49CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFCUyhjb2xfcG9jWzFdIC0gKGludDY0X3QpY3VyX3BvYykpOwogICAgICAgICByZWYxc2lkeCA9CiAgICAgICAgIHNpZHggICAgID0gc2wtPmNvbF9wYXJpdHk7CiAgICAgLy8gRkwgLT4gRkwgJiBkaWZmZXIgcGFyaXR5CkBAIC0zMTUsNyArMzMwLDcgQEAKICAgICAgICAgICAgICAgICAqbWJfdHlwZSB8PSBNQl9UWVBFX0RJUkVDVDIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYl90eXBlX2NvbFswXSAmIChNQl9UWVBFXzE2eDggfCBNQl9UWVBFXzh4MTYpKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZykgeworICAgICAgICAgICAgICAgIGlmICghaC0+cHMuc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBTYXZlIHN1YiBtYiB0eXBlcyBmcm9tIHByZXZpb3VzIGZyYW1lcyAob3IgZGVyaXZlCiAgICAgICAgICAgICAgICAgICAgICAqIGZyb20gTVZzKSBzbyB3ZSBrbm93IGV4YWN0bHkgd2hhdCBibG9jayBzaXplIHRvIHVzZS4gKi8KICAgICAgICAgICAgICAgICAgICAgc3ViX21iX3R5cGUgKz0gKE1CX1RZUEVfOHg4IC0gTUJfVFlQRV8xNngxNik7IC8qIEJfU1VCXzR4NCAqLwpAQCAtNTM4LDcgKzU1Myw3IEBACiAgICAgICAgICAgICAgICAgKm1iX3R5cGUgfD0gTUJfVFlQRV9MMEwxIHwgTUJfVFlQRV9ESVJFQ1QyIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWJfdHlwZV9jb2xbMF0gJiAoTUJfVFlQRV8xNng4IHwgTUJfVFlQRV84eDE2KSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghaC0+c3BzLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWgtPnBzLnNwcy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZykgewogICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogc2F2ZSBzdWIgbWIgdHlwZXMgZnJvbSBwcmV2aW91cyBmcmFtZXMgKG9yIGRlcml2ZQogICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIE1Wcykgc28gd2Uga25vdyBleGFjdGx5IHdoYXQgYmxvY2sgc2l6ZSB0byB1c2UgKi8KICAgICAgICAgICAgICAgICAgICAgc3ViX21iX3R5cGUgPSBNQl9UWVBFXzh4OCB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDBMMSB8CkBAIC01NzksNyArNTk0LDcgQEAKIAogICAgICAgICBpZiAoSVNfSU5URVJMQUNFRCgqbWJfdHlwZSkgIT0gSVNfSU5URVJMQUNFRChtYl90eXBlX2NvbFswXSkpIHsKICAgICAgICAgICAgIGludCB5X3NoaWZ0ID0gMiAqICFJU19JTlRFUkxBQ0VEKCptYl90eXBlKTsKLSAgICAgICAgICAgIGFzc2VydChoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyk7CisgICAgICAgICAgICBhc3NlcnQoaC0+cHMuc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnKTsKIAogICAgICAgICAgICAgZm9yIChpOCA9IDA7IGk4IDwgNDsgaTgrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCB4OCA9IGk4ICYgMTsKQEAgLTYxMyw3ICs2MjgsNyBAQAogCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICptdl9jb2wgPSBsMW12W3g4ICogMyArIHk4ICogYjRfc3RyaWRlXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG15X2NvbCAgICAgICAgICAgID0gKG12X2NvbFsxXSA8PCB5X3NoaWZ0KSAvIDI7CisgICAgICAgICAgICAgICAgICAgIGludCBteV9jb2wgICAgICAgICAgICA9IChtdl9jb2xbMV0gKiAoMSA8PCB5X3NoaWZ0KSkgLyAyOwogICAgICAgICAgICAgICAgICAgICBpbnQgbXggICAgICAgICAgICAgICAgPSAoc2NhbGUgKiBtdl9jb2xbMF0gKyAxMjgpID4+IDg7CiAgICAgICAgICAgICAgICAgICAgIGludCBteSAgICAgICAgICAgICAgICA9IChzY2FsZSAqIG15X2NvbCAgICArIDEyOCkgPj4gODsKICAgICAgICAgICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoJnNsLT5tdl9jYWNoZVswXVtzY2FuOFtpOCAqIDRdXSwgMiwgMiwgOCwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NF9sb29wZmlsdGVyLmMgYi9saWJhdmNvZGVjL2gyNjRfbG9vcGZpbHRlci5jCmluZGV4IDAwMTQ5MjcuLjA5MjRmMzIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NF9sb29wZmlsdGVyLmMKKysrIGIvbGliYXZjb2RlYy9oMjY0X2xvb3BmaWx0ZXIuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBsb29wIGZpbHRlci4KKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHBhcnQxMCBsb29wIGZpbHRlci4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCkBAIC0yOSw3ICsyOSw4IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0ZGVjLmgiCisjaW5jbHVkZSAiaDI2NF9wcy5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKICNpbmNsdWRlICJyZWN0YW5nbGUuaCIKQEAgLTI1MCw3ICsyNTEsNyBAQAogICAgIGludCBsZWZ0X3R5cGUgPSBzbC0+bGVmdF90eXBlW0xUT1BdOwogICAgIGludCB0b3BfdHlwZSAgPSBzbC0+dG9wX3R5cGU7CiAKLSAgICBpbnQgcXBfYmRfb2Zmc2V0ID0gNiAqIChoLT5zcHMuYml0X2RlcHRoX2x1bWEgLSA4KTsKKyAgICBpbnQgcXBfYmRfb2Zmc2V0ID0gNiAqIChoLT5wcy5zcHMtPmJpdF9kZXB0aF9sdW1hIC0gOCk7CiAgICAgaW50IGEgPSA1MiArIHNsLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgLSBxcF9iZF9vZmZzZXQ7CiAgICAgaW50IGIgPSA1MiArIHNsLT5zbGljZV9iZXRhX29mZnNldCAtIHFwX2JkX29mZnNldDsKIApAQCAtMjU4LDkgKzI1OSw5IEBACiAgICAgaW50IHFwICAgICAgPSBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYl94eV07CiAgICAgaW50IHFwMCAgICAgPSBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYl94eSAtIDFdOwogICAgIGludCBxcDEgICAgID0gaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbc2wtPnRvcF9tYl94eV07Ci0gICAgaW50IHFwYyA9IGdldF9jaHJvbWFfcXAoIGgsIDAsIHFwICk7Ci0gICAgaW50IHFwYzAgPSBnZXRfY2hyb21hX3FwKCBoLCAwLCBxcDAgKTsKLSAgICBpbnQgcXBjMSA9IGdldF9jaHJvbWFfcXAoIGgsIDAsIHFwMSApOworICAgIGludCBxcGMgID0gZ2V0X2Nocm9tYV9xcChoLT5wcy5wcHMsIDAsIHFwKTsKKyAgICBpbnQgcXBjMCA9IGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAwLCBxcDApOworICAgIGludCBxcGMxID0gZ2V0X2Nocm9tYV9xcChoLT5wcy5wcHMsIDAsIHFwMSk7CiAgICAgcXAwID0gKHFwICsgcXAwICsgMSkgPj4gMTsKICAgICBxcDEgPSAocXAgKyBxcDEgKyAxKSA+PiAxOwogICAgIHFwYzAgPSAocXBjICsgcXBjMCArIDEpID4+IDE7CkBAIC00MjAsNyArNDIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGluZXNpemUsIHVuc2lnbmVkIGludCB1dmxpbmVzaXplKQogewogICAgIGF2X2Fzc2VydDIoIUZSQU1FX01CQUZGKGgpKTsKLSAgICBpZighaC0+aDI2NGRzcC5oMjY0X2xvb3BfZmlsdGVyX3N0cmVuZ3RoIHx8IGgtPnBwcy5jaHJvbWFfcXBfZGlmZikgeworICAgIGlmKCFoLT5oMjY0ZHNwLmgyNjRfbG9vcF9maWx0ZXJfc3RyZW5ndGggfHwgaC0+cHMucHBzLT5jaHJvbWFfcXBfZGlmZikgewogICAgICAgICBmZl9oMjY0X2ZpbHRlcl9tYihoLCBzbCwgbWJfeCwgbWJfeSwgaW1nX3ksIGltZ19jYiwgaW1nX2NyLCBsaW5lc2l6ZSwgdXZsaW5lc2l6ZSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC01MjYsMTEgKzUyNywxMSBAQAogICAgICAgICAgICAgICAgIC8vIERvIG5vdCB1c2Ugcy0+cXNjYWxlIGFzIGx1bWEgcXVhbnRpemVyIGJlY2F1c2UgaXQgaGFzIG5vdCB0aGUgc2FtZQogICAgICAgICAgICAgICAgIC8vIHZhbHVlIGluIElQQ00gbWFjcm9ibG9ja3MuCiAgICAgICAgICAgICAgICAgcXAgPSAoaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldICsgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJuX3h5XSArIDEpID4+IDE7Ci0gICAgICAgICAgICAgICAgZmZfdGxvZyhoLT5hdmN0eCwgImZpbHRlciBtYjolZC8lZCBkaXI6JWQgZWRnZTolZCwgUVB5OiVkIGxzOiVkIHV2bHM6JWQiLCBtYl94LCBtYl95LCBkaXIsIGVkZ2UsIHFwLCB0bXBfbGluZXNpemUsIHRtcF91dmxpbmVzaXplKTsKKyAgICAgICAgICAgICAgICBmZl90bG9nKGgtPmF2Y3R4LCAiZmlsdGVyIG1iOiVkLyVkIGRpcjolZCwgUVB5OiVkIGxzOiVkIHV2bHM6JWQiLCBtYl94LCBtYl95LCBkaXIsIHFwLCB0bXBfbGluZXNpemUsIHRtcF91dmxpbmVzaXplKTsKICAgICAgICAgICAgICAgICB7IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBmZl90bG9nKGgtPmF2Y3R4LCAiIGJTWyVkXTolZCIsIGksIGJTW2ldKTsgZmZfdGxvZyhoLT5hdmN0eCwgIlxuIik7IH0KICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWgoICZpbWdfeVtqKmxpbmVzaXplXSwgdG1wX2xpbmVzaXplLCBiUywgcXAsIGEsIGIsIGgsIDAgKTsKLSAgICAgICAgICAgICAgICBjaHJvbWFfcXBfYXZnWzBdID0gKHNsLT5jaHJvbWFfcXBbMF0gKyBnZXRfY2hyb21hX3FwKGgsIDAsIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21ibl94eV0pICsgMSkgPj4gMTsKLSAgICAgICAgICAgICAgICBjaHJvbWFfcXBfYXZnWzFdID0gKHNsLT5jaHJvbWFfcXBbMV0gKyBnZXRfY2hyb21hX3FwKGgsIDEsIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21ibl94eV0pICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICBjaHJvbWFfcXBfYXZnWzBdID0gKHNsLT5jaHJvbWFfcXBbMF0gKyBnZXRfY2hyb21hX3FwKGgtPnBzLnBwcywgMCwgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJuX3h5XSkgKyAxKSA+PiAxOworICAgICAgICAgICAgICAgIGNocm9tYV9xcF9hdmdbMV0gPSAoc2wtPmNocm9tYV9xcFsxXSArIGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAxLCBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYm5feHldKSArIDEpID4+IDE7CiAgICAgICAgICAgICAgICAgaWYgKGNocm9tYSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoY2hyb21hNDQ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZWggKCZpbWdfY2Jbaip1dmxpbmVzaXplXSwgdG1wX3V2bGluZXNpemUsIGJTLCBjaHJvbWFfcXBfYXZnWzBdLCBhLCBiLCBoLCAwKTsKQEAgLTU5NCw4ICs1OTUsOCBAQAogICAgICAgICAgICAgICAgIC8vZmZfdGxvZyhoLT5hdmN0eCwgImZpbHRlciBtYjolZC8lZCBkaXI6JWQgZWRnZTolZCwgUVB5OiVkLCBRUGM6JWQsIFFQY246JWRcbiIsIG1iX3gsIG1iX3ksIGRpciwgZWRnZSwgcXAsIGgtPmNocm9tYV9xcFswXSwgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJuX3h5XSk7CiAgICAgICAgICAgICAgICAgZmZfdGxvZyhoLT5hdmN0eCwgImZpbHRlciBtYjolZC8lZCBkaXI6JWQgZWRnZTolZCwgUVB5OiVkIGxzOiVkIHV2bHM6JWQiLCBtYl94LCBtYl95LCBkaXIsIGVkZ2UsIHFwLCBsaW5lc2l6ZSwgdXZsaW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgLy97IGludCBpOyBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSBmZl90bG9nKGgtPmF2Y3R4LCAiIGJTWyVkXTolZCIsIGksIGJTW2ldKTsgZmZfdGxvZyhoLT5hdmN0eCwgIlxuIik7IH0KLSAgICAgICAgICAgICAgICBjaHJvbWFfcXBfYXZnWzBdID0gKHNsLT5jaHJvbWFfcXBbMF0gKyBnZXRfY2hyb21hX3FwKGgsIDAsIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21ibV94eV0pICsgMSkgPj4gMTsKLSAgICAgICAgICAgICAgICBjaHJvbWFfcXBfYXZnWzFdID0gKHNsLT5jaHJvbWFfcXBbMV0gKyBnZXRfY2hyb21hX3FwKGgsIDEsIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21ibV94eV0pICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICBjaHJvbWFfcXBfYXZnWzBdID0gKHNsLT5jaHJvbWFfcXBbMF0gKyBnZXRfY2hyb21hX3FwKGgtPnBzLnBwcywgMCwgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJtX3h5XSkgKyAxKSA+PiAxOworICAgICAgICAgICAgICAgIGNocm9tYV9xcF9hdmdbMV0gPSAoc2wtPmNocm9tYV9xcFsxXSArIGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAxLCBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYm1feHldKSArIDEpID4+IDE7CiAgICAgICAgICAgICAgICAgaWYoIGRpciA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbWJfZWRnZXYoICZpbWdfeVswXSwgbGluZXNpemUsIGJTLCBxcCwgYSwgYiwgaCwgMSApOwogICAgICAgICAgICAgICAgICAgICBpZiAoY2hyb21hKSB7CkBAIC03MjQsNyArNzI1LDcgQEAKICAgICBjb25zdCBpbnQgbXZ5X2xpbWl0ID0gSVNfSU5URVJMQUNFRChtYl90eXBlKSA/IDIgOiA0OwogICAgIGludCBmaXJzdF92ZXJ0aWNhbF9lZGdlX2RvbmUgPSAwOwogICAgIGludCBjaHJvbWEgPSBDSFJPTUEoaCkgJiYgIShDT05GSUdfR1JBWSAmJiAoaC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dSQVkpKTsKLSAgICBpbnQgcXBfYmRfb2Zmc2V0ID0gNiAqIChoLT5zcHMuYml0X2RlcHRoX2x1bWEgLSA4KTsKKyAgICBpbnQgcXBfYmRfb2Zmc2V0ID0gNiAqIChoLT5wcy5zcHMtPmJpdF9kZXB0aF9sdW1hIC0gOCk7CiAgICAgaW50IGEgPSA1MiArIHNsLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgLSBxcF9iZF9vZmZzZXQ7CiAgICAgaW50IGIgPSA1MiArIHNsLT5zbGljZV9iZXRhX29mZnNldCAtIHFwX2JkX29mZnNldDsKIApAQCAtNzY3LDcgKzc2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGJTW2ldID0gNDsKICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICBiU1tpXSA9IDEgKyAhIShzbC0+bm9uX3plcm9fY291bnRfY2FjaGVbMTIrOCooaT4+MSldIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKCFoLT5wcHMuY2FiYWMgJiYgSVNfOHg4RENUKG1ibl90eXBlKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICgoIWgtPnBzLnBwcy0+Y2FiYWMgJiYgSVNfOHg4RENUKG1ibl90eXBlKSkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoLT5jYnBfdGFibGVbbWJuX3h5XSAmICgoKE1CX0ZJRUxEKHNsKSA/IChpJjIpIDogKG1iX3kmMSkpID8gOCA6IDIpIDw8IDEyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPm5vbl96ZXJvX2NvdW50W21ibl94eV1bIG9mZltpXSBdKSk7CkBAIC03NzksMTUgKzc4MCwxNSBAQAogICAgICAgICBtYm4wX3FwID0gaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbc2wtPmxlZnRfbWJfeHlbMF1dOwogICAgICAgICBtYm4xX3FwID0gaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbc2wtPmxlZnRfbWJfeHlbMV1dOwogICAgICAgICBxcFswXSA9ICggbWJfcXAgKyBtYm4wX3FwICsgMSApID4+IDE7Ci0gICAgICAgIGJxcFswXSA9ICggZ2V0X2Nocm9tYV9xcCggaCwgMCwgbWJfcXAgKSArCi0gICAgICAgICAgICAgICAgICAgZ2V0X2Nocm9tYV9xcCggaCwgMCwgbWJuMF9xcCApICsgMSApID4+IDE7Ci0gICAgICAgIHJxcFswXSA9ICggZ2V0X2Nocm9tYV9xcCggaCwgMSwgbWJfcXAgKSArCi0gICAgICAgICAgICAgICAgICAgZ2V0X2Nocm9tYV9xcCggaCwgMSwgbWJuMF9xcCApICsgMSApID4+IDE7CisgICAgICAgIGJxcFswXSA9IChnZXRfY2hyb21hX3FwKGgtPnBzLnBwcywgMCwgbWJfcXApICsKKyAgICAgICAgICAgICAgICAgIGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAwLCBtYm4wX3FwKSArIDEpID4+IDE7CisgICAgICAgIHJxcFswXSA9IChnZXRfY2hyb21hX3FwKGgtPnBzLnBwcywgMSwgbWJfcXApICsKKyAgICAgICAgICAgICAgICAgIGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAxLCBtYm4wX3FwKSArIDEpID4+IDE7CiAgICAgICAgIHFwWzFdID0gKCBtYl9xcCArIG1ibjFfcXAgKyAxICkgPj4gMTsKLSAgICAgICAgYnFwWzFdID0gKCBnZXRfY2hyb21hX3FwKCBoLCAwLCBtYl9xcCApICsKLSAgICAgICAgICAgICAgICAgICBnZXRfY2hyb21hX3FwKCBoLCAwLCBtYm4xX3FwICkgKyAxICkgPj4gMTsKLSAgICAgICAgcnFwWzFdID0gKCBnZXRfY2hyb21hX3FwKCBoLCAxLCBtYl9xcCApICsKLSAgICAgICAgICAgICAgICAgICBnZXRfY2hyb21hX3FwKCBoLCAxLCBtYm4xX3FwICkgKyAxICkgPj4gMTsKKyAgICAgICAgYnFwWzFdID0gKGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAwLCBtYl9xcCkgKworICAgICAgICAgICAgICAgICAgZ2V0X2Nocm9tYV9xcChoLT5wcy5wcHMsIDAsIG1ibjFfcXApICsgMSApID4+IDE7CisgICAgICAgIHJxcFsxXSA9IChnZXRfY2hyb21hX3FwKGgtPnBzLnBwcywgMSwgbWJfcXApICsKKyAgICAgICAgICAgICAgICAgIGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAxLCBtYm4xX3FwKSArIDEgKSA+PiAxOwogCiAgICAgICAgIC8qIEZpbHRlciBlZGdlICovCiAgICAgICAgIGZmX3Rsb2coaC0+YXZjdHgsICJmaWx0ZXIgbWI6JWQvJWQgTUJBRkYsIFFQeTolZC8lZCwgUVBiOiVkLyVkIFFQcjolZC8lZCBsczolZCB1dmxzOiVkIiwgbWJfeCwgbWJfeSwgcXBbMF0sIHFwWzFdLCBicXBbMF0sIGJxcFsxXSwgcnFwWzBdLCBycXBbMV0sIGxpbmVzaXplLCB1dmxpbmVzaXplKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NF9tYi5jIGIvbGliYXZjb2RlYy9oMjY0X21iLmMKaW5kZXggODMwMmRlMC4uM2NkMTdiNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjY0X21iLmMKKysrIGIvbGliYXZjb2RlYy9oMjY0X21iLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgbWFjcm9ibG9jayBkZWNvZGluZworICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwIG1hY3JvYmxvY2sgZGVjb2RpbmcKICAqLwogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CkBAIC0zMSw5ICszMSw5IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkZWMuaCIKKyNpbmNsdWRlICJoMjY0X3BzLmgiCiAjaW5jbHVkZSAicXBlbGRzcC5oIgotI2luY2x1ZGUgInN2cTMuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKIAogc3RhdGljIGlubGluZSBpbnQgZ2V0X2xvd2VzdF9wYXJ0X2xpc3RfeShIMjY0U2xpY2VDb250ZXh0ICpzbCwKQEAgLTkxLDcgKzkxLDcgQEAKIC8qKgogICogV2FpdCB1bnRpbCBhbGwgcmVmZXJlbmNlIGZyYW1lcyBhcmUgYXZhaWxhYmxlIGZvciBNQyBvcGVyYXRpb25zLgogICoKLSAqIEBwYXJhbSBoIHRoZSBIMjY0IGNvbnRleHQKKyAqIEBwYXJhbSBoIHRoZSBILjI2NCBjb250ZXh0CiAgKi8KIHN0YXRpYyB2b2lkIGF3YWl0X3JlZmVyZW5jZXMoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsKQogewpAQCAtNDIwLDggKzQyMCw4IEBACiAgICAgICAgICAgICAgICAgICAgIHhfb2Zmc2V0LCB5X29mZnNldCwgcXBpeF9wdXQsIGNocm9tYV9wdXQsCiAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NoaWZ0LCBjaHJvbWFfaWRjKTsKIAotICAgICAgICBpZiAoc2wtPnVzZV93ZWlnaHQgPT0gMikgewotICAgICAgICAgICAgaW50IHdlaWdodDAgPSBzbC0+aW1wbGljaXRfd2VpZ2h0W3JlZm4wXVtyZWZuMV1bc2wtPm1iX3kgJiAxXTsKKyAgICAgICAgaWYgKHNsLT5wd3QudXNlX3dlaWdodCA9PSAyKSB7CisgICAgICAgICAgICBpbnQgd2VpZ2h0MCA9IHNsLT5wd3QuaW1wbGljaXRfd2VpZ2h0W3JlZm4wXVtyZWZuMV1bc2wtPm1iX3kgJiAxXTsKICAgICAgICAgICAgIGludCB3ZWlnaHQxID0gNjQgLSB3ZWlnaHQwOwogICAgICAgICAgICAgbHVtYV93ZWlnaHRfYXZnKGRlc3RfeSwgdG1wX3ksIHNsLT5tYl9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIDUsIHdlaWdodDAsIHdlaWdodDEsIDApOwpAQCAtNDMzLDI0ICs0MzMsMjQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGx1bWFfd2VpZ2h0X2F2ZyhkZXN0X3ksIHRtcF95LCBzbC0+bWJfbGluZXNpemUsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bHVtYV93ZWlnaHRbcmVmbjBdWzBdWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5sdW1hX3dlaWdodFtyZWZuMV1bMV1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmx1bWFfd2VpZ2h0W3JlZm4wXVswXVsxXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmx1bWFfd2VpZ2h0W3JlZm4xXVsxXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnB3dC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QubHVtYV93ZWlnaHRbcmVmbjBdWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QubHVtYV93ZWlnaHRbcmVmbjFdWzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QubHVtYV93ZWlnaHRbcmVmbjBdWzBdWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0Lmx1bWFfd2VpZ2h0W3JlZm4xXVsxXVsxXSk7CiAgICAgICAgICAgICBpZiAoIUNPTkZJR19HUkFZIHx8ICEoaC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dSQVkpKSB7CiAgICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodF9hdmcoZGVzdF9jYiwgdG1wX2NiLCBzbC0+bWJfdXZsaW5lc2l6ZSwgY2hyb21hX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5jaHJvbWFfd2VpZ2h0W3JlZm4wXVswXVswXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX3dlaWdodFtyZWZuMV1bMV1bMF1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRbcmVmbjBdWzBdWzBdWzFdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX3dlaWdodFtyZWZuMV1bMV1bMF1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QuY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QuY2hyb21hX3dlaWdodFtyZWZuMF1bMF1bMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnB3dC5jaHJvbWFfd2VpZ2h0W3JlZm4xXVsxXVswXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0LmNocm9tYV93ZWlnaHRbcmVmbjBdWzBdWzBdWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0LmNocm9tYV93ZWlnaHRbcmVmbjFdWzFdWzBdWzFdKTsKICAgICAgICAgICAgICAgICBjaHJvbWFfd2VpZ2h0X2F2ZyhkZXN0X2NyLCB0bXBfY3IsIHNsLT5tYl91dmxpbmVzaXplLCBjaHJvbWFfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRbcmVmbjBdWzBdWzFdWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5jaHJvbWFfd2VpZ2h0W3JlZm4xXVsxXVsxXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX3dlaWdodFtyZWZuMF1bMF1bMV1bMV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5jaHJvbWFfd2VpZ2h0W3JlZm4xXVsxXVsxXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnB3dC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnB3dC5jaHJvbWFfd2VpZ2h0W3JlZm4wXVswXVsxXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0LmNocm9tYV93ZWlnaHRbcmVmbjFdWzFdWzFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QuY2hyb21hX3dlaWdodFtyZWZuMF1bMF1bMV1bMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QuY2hyb21hX3dlaWdodFtyZWZuMV1bMV1bMV1bMV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTQ2MiwxOSArNDYyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgIHFwaXhfcHV0LCBjaHJvbWFfcHV0LCBwaXhlbF9zaGlmdCwgY2hyb21hX2lkYyk7CiAKICAgICAgICAgbHVtYV93ZWlnaHRfb3AoZGVzdF95LCBzbC0+bWJfbGluZXNpemUsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2wtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgIHNsLT5sdW1hX3dlaWdodFtyZWZuXVtsaXN0XVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2wtPmx1bWFfd2VpZ2h0W3JlZm5dW2xpc3RdWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc2wtPnB3dC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0Lmx1bWFfd2VpZ2h0W3JlZm5dW2xpc3RdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0Lmx1bWFfd2VpZ2h0W3JlZm5dW2xpc3RdWzFdKTsKICAgICAgICAgaWYgKCFDT05GSUdfR1JBWSB8fCAhKGgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSkgewotICAgICAgICAgICAgaWYgKHNsLT51c2Vfd2VpZ2h0X2Nocm9tYSkgeworICAgICAgICAgICAgaWYgKHNsLT5wd3QudXNlX3dlaWdodF9jaHJvbWEpIHsKICAgICAgICAgICAgICAgICBjaHJvbWFfd2VpZ2h0X29wKGRlc3RfY2IsIHNsLT5tYl91dmxpbmVzaXplLCBjaHJvbWFfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5jaHJvbWFfd2VpZ2h0W3JlZm5dW2xpc3RdWzBdWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRbcmVmbl1bbGlzdF1bMF1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnB3dC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0LmNocm9tYV93ZWlnaHRbcmVmbl1bbGlzdF1bMF1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0LmNocm9tYV93ZWlnaHRbcmVmbl1bbGlzdF1bMF1bMV0pOwogICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfb3AoZGVzdF9jciwgc2wtPm1iX3V2bGluZXNpemUsIGNocm9tYV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV93ZWlnaHRbcmVmbl1bbGlzdF1bMV1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX3dlaWdodFtyZWZuXVtsaXN0XVsxXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+cHd0LmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QuY2hyb21hX3dlaWdodFtyZWZuXVtsaXN0XVsxXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5wd3QuY2hyb21hX3dlaWdodFtyZWZuXVtsaXN0XVsxXVsxXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC02MTIsOCArNjEyLDcgQEAKIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBobF9kZWNvZGVfbWJfcHJlZGljdF9sdW1hKGNvbnN0IEgyNjRDb250ZXh0ICpoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTbGljZUNvbnRleHQgKnNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlLCBpbnQgaXNfaDI2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2ltcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlLCBpbnQgc2ltcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc2Zvcm1fYnlwYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9zaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKQEAgLTYzNyw4ICs2MzYsOCBAQAogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpICs9IDQpIHsKICAgICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBwdHIgPSBkZXN0X3kgKyBibG9ja19vZmZzZXRbaV07CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRpciAgICAgID0gc2wtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFtpXV07Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9ieXBhc3MgJiYgaC0+c3BzLnByb2ZpbGVfaWRjID09IDI0NCAmJiBkaXIgPD0gMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaC0+eDI2NF9idWlsZCAhPSAtMSkgeworICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1fYnlwYXNzICYmIGgtPnBzLnNwcy0+cHJvZmlsZV9pZGMgPT0gMjQ0ICYmIGRpciA8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoLT54MjY0X2J1aWxkIDwgMTUxVSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ4eDhsX2FkZFtkaXJdKHB0ciwgc2wtPm1iICsgKGkgKiAxNiArIHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLCBsaW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ4eDhsX2ZpbHRlcl9hZGRbZGlyXShwdHIsIHNsLT5tYiArIChpICogMTYgKyBwICogMjU2IDw8IHBpeGVsX3NoaWZ0KSwKQEAgLTY2OCw3ICs2NjcsNyBAQAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IHB0ciA9IGRlc3RfeSArIGJsb2NrX29mZnNldFtpXTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGlyICAgICAgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44W2ldXTsKIAotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1fYnlwYXNzICYmIGgtPnNwcy5wcm9maWxlX2lkYyA9PSAyNDQgJiYgZGlyIDw9IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2J5cGFzcyAmJiBoLT5wcy5zcHMtPnByb2ZpbGVfaWRjID09IDI0NCAmJiBkaXIgPD0gMSkgewogICAgICAgICAgICAgICAgICAgICBoLT5ocGMucHJlZDR4NF9hZGRbZGlyXShwdHIsIHNsLT5tYiArIChpICogMTYgKyBwICogMjU2IDw8IHBpeGVsX3NoaWZ0KSwgbGluZXNpemUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRvcHJpZ2h0OwpAQCAtNjkzLDQ4ICs2OTIsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ0eDRbZGlyXShwdHIsIHRvcHJpZ2h0LCBsaW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIG5ueiA9IHNsLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtpICsgcCAqIDE2XV07CiAgICAgICAgICAgICAgICAgICAgIGlmIChubnopIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc19oMjY0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ueiA9PSAxICYmIGRjdGNvZWZfZ2V0KHNsLT5tYiwgcGl4ZWxfc2hpZnQsIGkgKiAxNiArIHAgKiAyNTYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGN0X2RjX2FkZChwdHIsIHNsLT5tYiArIChpICogMTYgKyBwICogMjU2IDw8IHBpeGVsX3NoaWZ0KSwgbGluZXNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRjdF9hZGQocHRyLCBzbC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksIGxpbmVzaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQ09ORklHX1NWUTNfREVDT0RFUikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9zdnEzX2FkZF9pZGN0X2MocHRyLCBzbC0+bWIgKyBpICogMTYgKyBwICogMjU2LCBsaW5lc2l6ZSwgcXNjYWxlLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChubnogPT0gMSAmJiBkY3Rjb2VmX2dldChzbC0+bWIsIHBpeGVsX3NoaWZ0LCBpICogMTYgKyBwICogMjU2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGN0X2RjX2FkZChwdHIsIHNsLT5tYiArIChpICogMTYgKyBwICogMjU2IDw8IHBpeGVsX3NoaWZ0KSwgbGluZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkY3RfYWRkKHB0ciwgc2wtPm1iICsgKGkgKiAxNiArIHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLCBsaW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBoLT5ocGMucHJlZDE2eDE2W3NsLT5pbnRyYTE2eDE2X3ByZWRfbW9kZV0oZGVzdF95LCBsaW5lc2l6ZSk7Ci0gICAgICAgIGlmIChpc19oMjY0KSB7Ci0gICAgICAgICAgICBpZiAoc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W0xVTUFfRENfQkxPQ0tfSU5ERVggKyBwXV0pIHsKLSAgICAgICAgICAgICAgICBpZiAoIXRyYW5zZm9ybV9ieXBhc3MpCi0gICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdChzbC0+bWIgKyAocCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bWJfbHVtYV9kY1twXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ0X2NvZWZmW3BdW3FzY2FsZV1bMF0pOwotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkY19tYXBwaW5nWzE2XSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAwICogMTYsICAxICogMTYsICA0ICogMTYsICA1ICogMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgMiAqIDE2LCAgMyAqIDE2LCAgNiAqIDE2LCAgNyAqIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgIDggKiAxNiwgIDkgKiAxNiwgMTIgKiAxNiwgMTMgKiAxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIDEwICogMTYsIDExICogMTYsIDE0ICogMTYsIDE1ICogMTYKLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBkY3Rjb2VmX3NldChzbC0+bWIgKyAocCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9zaGlmdCwgZGNfbWFwcGluZ1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjdGNvZWZfZ2V0KHNsLT5tYl9sdW1hX2RjW3BdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfc2hpZnQsIGkpKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIGlmIChzbC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbTFVNQV9EQ19CTE9DS19JTkRFWCArIHBdXSkgeworICAgICAgICAgICAgaWYgKCF0cmFuc2Zvcm1fYnlwYXNzKQorICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdChzbC0+bWIgKyAocCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5tYl9sdW1hX2RjW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcy5wcHMtPmRlcXVhbnQ0X2NvZWZmW3BdW3FzY2FsZV1bMF0pOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGNfbWFwcGluZ1sxNl0gPSB7CisgICAgICAgICAgICAgICAgICAgICAwICogMTYsICAxICogMTYsICA0ICogMTYsICA1ICogMTYsCisgICAgICAgICAgICAgICAgICAgICAyICogMTYsICAzICogMTYsICA2ICogMTYsICA3ICogMTYsCisgICAgICAgICAgICAgICAgICAgICA4ICogMTYsICA5ICogMTYsIDEyICogMTYsIDEzICogMTYsCisgICAgICAgICAgICAgICAgICAgIDEwICogMTYsIDExICogMTYsIDE0ICogMTYsIDE1ICogMTYKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgICAgICAgICBkY3Rjb2VmX3NldChzbC0+bWIgKyAocCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NoaWZ0LCBkY19tYXBwaW5nW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY3Rjb2VmX2dldChzbC0+bWJfbHVtYV9kY1twXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfc2hpZnQsIGkpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChDT05GSUdfU1ZRM19ERUNPREVSKQotICAgICAgICAgICAgZmZfc3ZxM19sdW1hX2RjX2RlcXVhbnRfaWRjdF9jKHNsLT5tYiArIHAgKiAyNTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iX2x1bWFfZGNbcF0sIHFzY2FsZSk7CisgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaGxfZGVjb2RlX21iX2lkY3RfbHVtYShjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2gyNjQsIGludCBzaW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3R5cGUsIGludCBzaW1wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zZm9ybV9ieXBhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3NoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LApAQCAtNzQ1LDYwICs3MzYsNTAgQEAKICAgICBpbnQgaTsKICAgICBibG9ja19vZmZzZXQgKz0gMTYgKiBwOwogICAgIGlmICghSVNfSU5UUkE0eDQobWJfdHlwZSkpIHsKLSAgICAgICAgaWYgKGlzX2gyNjQpIHsKLSAgICAgICAgICAgIGlmIChJU19JTlRSQTE2eDE2KG1iX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9ieXBhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGgtPnNwcy5wcm9maWxlX2lkYyA9PSAyNDQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChzbC0+aW50cmExNngxNl9wcmVkX21vZGUgPT0gVkVSVF9QUkVEOHg4IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmludHJhMTZ4MTZfcHJlZF9tb2RlID09IEhPUl9QUkVEOHg4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQxNngxNl9hZGRbc2wtPmludHJhMTZ4MTZfcHJlZF9tb2RlXShkZXN0X3ksIGJsb2NrX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bWIgKyAocCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtpICsgcCAqIDE2XV0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0Y29lZl9nZXQoc2wtPm1iLCBwaXhlbF9zaGlmdCwgaSAqIDE2ICsgcCAqIDI1NikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9hZGRfcGl4ZWxzNF9jbGVhcihkZXN0X3kgKyBibG9ja19vZmZzZXRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKElTX0lOVFJBMTZ4MTYobWJfdHlwZSkpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1fYnlwYXNzKSB7CisgICAgICAgICAgICAgICAgaWYgKGgtPnBzLnNwcy0+cHJvZmlsZV9pZGMgPT0gMjQ0ICYmCisgICAgICAgICAgICAgICAgICAgIChzbC0+aW50cmExNngxNl9wcmVkX21vZGUgPT0gVkVSVF9QUkVEOHg4IHx8CisgICAgICAgICAgICAgICAgICAgICBzbC0+aW50cmExNngxNl9wcmVkX21vZGUgPT0gSE9SX1BSRUQ4eDgpKSB7CisgICAgICAgICAgICAgICAgICAgIGgtPmhwYy5wcmVkMTZ4MTZfYWRkW3NsLT5pbnRyYTE2eDE2X3ByZWRfbW9kZV0oZGVzdF95LCBibG9ja19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iICsgKHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaWRjdF9hZGQxNmludHJhKGRlc3RfeSwgYmxvY2tfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5tYiArIChwICogMjU2IDw8IHBpeGVsX3NoaWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bm9uX3plcm9fY291bnRfY2FjaGUgKyBwICogNSAqIDgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbaSArIHAgKiAxNl1dIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0Y29lZl9nZXQoc2wtPm1iLCBwaXhlbF9zaGlmdCwgaSAqIDE2ICsgcCAqIDI1NikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2FkZF9waXhlbHM0X2NsZWFyKGRlc3RfeSArIGJsb2NrX29mZnNldFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iICsgKGkgKiAxNiArIHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChzbC0+Y2JwICYgMTUpIHsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtX2J5cGFzcykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGkgPSBJU184eDhEQ1QobWJfdHlwZSkgPyA0IDogMTsKLSAgICAgICAgICAgICAgICAgICAgaWRjdF9hZGQgPSBJU184eDhEQ1QobWJfdHlwZSkgPyBoLT5oMjY0ZHNwLmgyNjRfYWRkX3BpeGVsczhfY2xlYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBoLT5oMjY0ZHNwLmgyNjRfYWRkX3BpeGVsczRfY2xlYXI7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSBkaSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbaSArIHAgKiAxNl1dKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkY3RfYWRkKGRlc3RfeSArIGJsb2NrX29mZnNldFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bWIgKyAoaSAqIDE2ICsgcCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJU184eDhEQ1QobWJfdHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaWRjdDhfYWRkNChkZXN0X3ksIGJsb2NrX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5tYiArIChwICogMjU2IDw8IHBpeGVsX3NoaWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlICsgcCAqIDUgKiA4KTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2lkY3RfYWRkMTYoZGVzdF95LCBibG9ja19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bWIgKyAocCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5ub25femVyb19jb3VudF9jYWNoZSArIHAgKiA1ICogOCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaWRjdF9hZGQxNmludHJhKGRlc3RfeSwgYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iICsgKHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bm9uX3plcm9fY291bnRfY2FjaGUgKyBwICogNSAqIDgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKENPTkZJR19TVlEzX0RFQ09ERVIpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChzbC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbaSArIHAgKiAxNl1dIHx8IHNsLT5tYltpICogMTYgKyBwICogMjU2XSkgewotICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBiZW5jaG1hcmsgd2VpcmQgcnVsZSwgJiBiZWxvdwotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBwdHIgPSBkZXN0X3kgKyBibG9ja19vZmZzZXRbaV07Ci0gICAgICAgICAgICAgICAgICAgIGZmX3N2cTNfYWRkX2lkY3RfYyhwdHIsIHNsLT5tYiArIGkgKiAxNiArIHAgKiAyNTYsIGxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnFzY2FsZSwgSVNfSU5UUkEobWJfdHlwZSkgPyAxIDogMCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNsLT5jYnAgJiAxNSkgeworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9ieXBhc3MpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgZGkgPSBJU184eDhEQ1QobWJfdHlwZSkgPyA0IDogMTsKKyAgICAgICAgICAgICAgICBpZGN0X2FkZCA9IElTXzh4OERDVChtYl90eXBlKSA/IGgtPmgyNjRkc3AuaDI2NF9hZGRfcGl4ZWxzOF9jbGVhcgorICAgICAgICAgICAgICAgICAgICA6IGgtPmgyNjRkc3AuaDI2NF9hZGRfcGl4ZWxzNF9jbGVhcjsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gZGkpCisgICAgICAgICAgICAgICAgICAgIGlmIChzbC0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbaSArIHAgKiAxNl1dKQorICAgICAgICAgICAgICAgICAgICAgICAgaWRjdF9hZGQoZGVzdF95ICsgYmxvY2tfb2Zmc2V0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iICsgKGkgKiAxNiArIHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoSVNfOHg4RENUKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfaWRjdDhfYWRkNChkZXN0X3ksIGJsb2NrX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iICsgKHAgKiAyNTYgPDwgcGl4ZWxfc2hpZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlICsgcCAqIDUgKiA4KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9pZGN0X2FkZDE2KGRlc3RfeSwgYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bWIgKyAocCAqIDI1NiA8PCBwaXhlbF9zaGlmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bm9uX3plcm9fY291bnRfY2FjaGUgKyBwICogNSAqIDgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X21iX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2gyNjRfbWJfdGVtcGxhdGUuYwppbmRleCA1NDQyMGI5Li5kNWVhMjZhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRfbWJfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2gyNjRfbWJfdGVtcGxhdGUuYwpAQCAtMTksOCArMTksNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlICJzdnEzLmgiCi0KICN1bmRlZiBGVU5DCiAjdW5kZWYgUElYRUxfU0hJRlQKIApAQCAtNTAsOSArNDgsNyBAQAogICAgIGludCBsaW5lc2l6ZSwgdXZsaW5lc2l6ZSAvKmRjdF9vZmZzZXQqLzsKICAgICBpbnQgaSwgajsKICAgICBjb25zdCBpbnQgKmJsb2NrX29mZnNldCA9ICZoLT5ibG9ja19vZmZzZXRbMF07Ci0gICAgY29uc3QgaW50IHRyYW5zZm9ybV9ieXBhc3MgPSAhU0lNUExFICYmIChzbC0+cXNjYWxlID09IDAgJiYgaC0+c3BzLnRyYW5zZm9ybV9ieXBhc3MpOwotICAgIC8qIGlzX2gyNjQgc2hvdWxkIGFsd2F5cyBiZSB0cnVlIGlmIFNWUTMgaXMgZGlzYWJsZWQuICovCi0gICAgY29uc3QgaW50IGlzX2gyNjQgPSAhQ09ORklHX1NWUTNfREVDT0RFUiB8fCBTSU1QTEUgfHwgaC0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQ7CisgICAgY29uc3QgaW50IHRyYW5zZm9ybV9ieXBhc3MgPSAhU0lNUExFICYmIChzbC0+cXNjYWxlID09IDAgJiYgaC0+cHMuc3BzLT50cmFuc2Zvcm1fYnlwYXNzKTsKICAgICB2b2lkICgqaWRjdF9hZGQpKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpOwogICAgIGNvbnN0IGludCBibG9ja19oICAgPSAxNiA+PiBoLT5jaHJvbWFfeV9zaGlmdDsKICAgICBjb25zdCBpbnQgY2hyb21hNDIyID0gQ0hST01BNDIyKGgpOwpAQCAtMTAwLDEyICs5NiwxMiBAQAogICAgIH0KIAogICAgIGlmICghU0lNUExFICYmIElTX0lOVFJBX1BDTShtYl90eXBlKSkgewotICAgICAgICBjb25zdCBpbnQgYml0X2RlcHRoID0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hOworICAgICAgICBjb25zdCBpbnQgYml0X2RlcHRoID0gaC0+cHMuc3BzLT5iaXRfZGVwdGhfbHVtYTsKICAgICAgICAgaWYgKFBJWEVMX1NISUZUKSB7CiAgICAgICAgICAgICBpbnQgajsKICAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgc2wtPmludHJhX3BjbV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjRfbWJfc2l6ZXNbaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjXSAqIGJpdF9kZXB0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjRfbWJfc2l6ZXNbaC0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkY10gKiBiaXRfZGVwdGgpOwogCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICAgICAgICAgIHVpbnQxNl90ICp0bXBfeSA9ICh1aW50MTZfdCAqKShkZXN0X3kgKyBpICogbGluZXNpemUpOwpAQCAtMTEzLDcgKzEwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHRtcF95W2pdID0gZ2V0X2JpdHMoJmdiLCBiaXRfZGVwdGgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKFNJTVBMRSB8fCAhQ09ORklHX0dSQVkgfHwgIShoLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYykgeworICAgICAgICAgICAgICAgIGlmICghaC0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYykgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmxvY2tfaDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqdG1wX2NiID0gKHVpbnQxNl90ICopKGRlc3RfY2IgKyBpICogdXZsaW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqdG1wX2NyID0gKHVpbnQxNl90ICopKGRlc3RfY3IgKyBpICogdXZsaW5lc2l6ZSk7CkBAIC0xMzgsNyArMTM0LDcgQEAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQogICAgICAgICAgICAgICAgIG1lbWNweShkZXN0X3kgKyBpICogbGluZXNpemUsIHNsLT5pbnRyYV9wY21fcHRyICsgaSAqIDE2LCAxNik7CiAgICAgICAgICAgICBpZiAoU0lNUExFIHx8ICFDT05GSUdfR1JBWSB8fCAhKGgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSkgewotICAgICAgICAgICAgICAgIGlmICghaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFoLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkZXN0X2NiICsgaSAqIHV2bGluZXNpemUsIDEgPDwgKGJpdF9kZXB0aCAtIDEpLCA4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkZXN0X2NyICsgaSAqIHV2bGluZXNpemUsIDEgPDwgKGJpdF9kZXB0aCAtIDEpLCA4KTsKQEAgLTE2NCwzNyArMTYwLDQxIEBACiAgICAgICAgICAgICAgICAgaC0+aHBjLnByZWQ4eDhbc2wtPmNocm9tYV9wcmVkX21vZGVdKGRlc3RfY3IsIHV2bGluZXNpemUpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBobF9kZWNvZGVfbWJfcHJlZGljdF9sdW1hKGgsIHNsLCBtYl90eXBlLCBpc19oMjY0LCBTSU1QTEUsCisgICAgICAgICAgICBobF9kZWNvZGVfbWJfcHJlZGljdF9sdW1hKGgsIHNsLCBtYl90eXBlLCBTSU1QTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9ieXBhc3MsIFBJWEVMX1NISUZULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19vZmZzZXQsIGxpbmVzaXplLCBkZXN0X3ksIDApOwogCiAgICAgICAgICAgICBpZiAoc2wtPmRlYmxvY2tpbmdfZmlsdGVyKQogICAgICAgICAgICAgICAgIHhjaGdfbWJfYm9yZGVyKGgsIHNsLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIGxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIDAsIDAsIFNJTVBMRSwgUElYRUxfU0hJRlQpOwotICAgICAgICB9IGVsc2UgaWYgKGlzX2gyNjQpIHsKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChjaHJvbWE0MjIpIHsKICAgICAgICAgICAgICAgICBGVU5DKGhsX21vdGlvbl80MjIpKGgsIHNsLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5xcGVsX3B1dCwgaC0+aDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnFwZWxfYXZnLCBoLT5oMjY0Y2hyb21hLmF2Z19oMjY0X2Nocm9tYV9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NHFwZWwucHV0X2gyNjRfcXBlbF9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRxcGVsLmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRjaHJvbWEuYXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLndlaWdodF9oMjY0X3BpeGVsc190YWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEZVTkMoaGxfbW90aW9uXzQyMCkoaCwgc2wsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnFwZWxfcHV0LCBoLT5oMjY0Y2hyb21hLnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cXBlbF9hdmcsIGgtPmgyNjRjaHJvbWEuYXZnX2gyNjRfY2hyb21hX3BpeGVsc190YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0cXBlbC5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0Y2hyb21hLnB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NHFwZWwuYXZnX2gyNjRfcXBlbF9waXhlbHNfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGNocm9tYS5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3Aud2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuYml3ZWlnaHRfaDI2NF9waXhlbHNfdGFiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGhsX2RlY29kZV9tYl9pZGN0X2x1bWEoaCwgc2wsIG1iX3R5cGUsIGlzX2gyNjQsIFNJTVBMRSwgdHJhbnNmb3JtX2J5cGFzcywKKyAgICAgICAgaGxfZGVjb2RlX21iX2lkY3RfbHVtYShoLCBzbCwgbWJfdHlwZSwgU0lNUExFLCB0cmFuc2Zvcm1fYnlwYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJWEVMX1NISUZULCBibG9ja19vZmZzZXQsIGxpbmVzaXplLCBkZXN0X3ksIDApOwogCiAgICAgICAgIGlmICgoU0lNUExFIHx8ICFDT05GSUdfR1JBWSB8fCAhKGgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSkgJiYKICAgICAgICAgICAgIChzbC0+Y2JwICYgMHgzMCkpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RbMl0gPSB7IGRlc3RfY2IsIGRlc3RfY3IgfTsKICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1fYnlwYXNzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKElTX0lOVFJBKG1iX3R5cGUpICYmIGgtPnNwcy5wcm9maWxlX2lkYyA9PSAyNDQgJiYKKyAgICAgICAgICAgICAgICBpZiAoSVNfSU5UUkEobWJfdHlwZSkgJiYgaC0+cHMuc3BzLT5wcm9maWxlX2lkYyA9PSAyNDQgJiYKICAgICAgICAgICAgICAgICAgICAgKHNsLT5jaHJvbWFfcHJlZF9tb2RlID09IFZFUlRfUFJFRDh4OCB8fAogICAgICAgICAgICAgICAgICAgICAgc2wtPmNocm9tYV9wcmVkX21vZGUgPT0gSE9SX1BSRUQ4eDgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGgtPmhwYy5wcmVkOHg4X2FkZFtzbC0+Y2hyb21hX3ByZWRfbW9kZV0oZGVzdFswXSwKQEAgLTIyNSwzOSArMjI1LDIzIEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChpc19oMjY0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBxcFsyXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNocm9tYTQyMikgewotICAgICAgICAgICAgICAgICAgICAgICAgcXBbMF0gPSBzbC0+Y2hyb21hX3FwWzBdICsgMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFwWzFdID0gc2wtPmNocm9tYV9xcFsxXSArIDM7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBxcFswXSA9IHNsLT5jaHJvbWFfcXBbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBxcFsxXSA9IHNsLT5jaHJvbWFfcXBbMV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHNsLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtDSFJPTUFfRENfQkxPQ0tfSU5ERVggKyAwXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfY2hyb21hX2RjX2RlcXVhbnRfaWRjdChzbC0+bWIgKyAoMTYgKiAxNiAqIDEgPDwgUElYRUxfU0hJRlQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbSVNfSU5UUkEobWJfdHlwZSkgPyAxIDogNF1bcXBbMF1dWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNsLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtDSFJPTUFfRENfQkxPQ0tfSU5ERVggKyAxXV0pCi0gICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLmgyNjRfY2hyb21hX2RjX2RlcXVhbnRfaWRjdChzbC0+bWIgKyAoMTYgKiAxNiAqIDIgPDwgUElYRUxfU0hJRlQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbSVNfSU5UUkEobWJfdHlwZSkgPyAyIDogNV1bcXBbMV1dWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2lkY3RfYWRkOChkZXN0LCBibG9ja19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iLCB1dmxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5ub25femVyb19jb3VudF9jYWNoZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDT05GSUdfU1ZRM19ERUNPREVSKSB7Ci0gICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0KHNsLT5tYiArIDE2ICogMTYgKiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5kZXF1YW50NF9jb2VmZltJU19JTlRSQShtYl90eXBlKSA/IDEgOiA0XVtzbC0+Y2hyb21hX3FwWzBdXVswXSk7Ci0gICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0KHNsLT5tYiArIDE2ICogMTYgKiAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5kZXF1YW50NF9jb2VmZltJU19JTlRSQShtYl90eXBlKSA/IDIgOiA1XVtzbC0+Y2hyb21hX3FwWzFdXVswXSk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCAzOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IGogKiAxNjsgaSA8IGogKiAxNiArIDQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2ldXSB8fCBzbC0+bWJbaSAqIDE2XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBwdHIgPSBkZXN0W2ogLSAxXSArIGJsb2NrX29mZnNldFtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfc3ZxM19hZGRfaWRjdF9jKHB0ciwgc2wtPm1iICsgaSAqIDE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2gyNjRfY2hyb21hX3FwWzBdW3NsLT5xc2NhbGUgKyAxMl0gLSAxMiwgMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW50IHFwWzJdOworICAgICAgICAgICAgICAgIGlmIChjaHJvbWE0MjIpIHsKKyAgICAgICAgICAgICAgICAgICAgcXBbMF0gPSBzbC0+Y2hyb21hX3FwWzBdICsgMzsKKyAgICAgICAgICAgICAgICAgICAgcXBbMV0gPSBzbC0+Y2hyb21hX3FwWzFdICsgMzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBxcFswXSA9IHNsLT5jaHJvbWFfcXBbMF07CisgICAgICAgICAgICAgICAgICAgIHFwWzFdID0gc2wtPmNocm9tYV9xcFsxXTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNsLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtDSFJPTUFfRENfQkxPQ0tfSU5ERVggKyAwXV0pCisgICAgICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0KHNsLT5tYiArICgxNiAqIDE2ICogMSA8PCBQSVhFTF9TSElGVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBzLnBwcy0+ZGVxdWFudDRfY29lZmZbSVNfSU5UUkEobWJfdHlwZSkgPyAxIDogNF1bcXBbMF1dWzBdKTsKKyAgICAgICAgICAgICAgICBpZiAoc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W0NIUk9NQV9EQ19CTE9DS19JTkRFWCArIDFdXSkKKyAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5oMjY0X2Nocm9tYV9kY19kZXF1YW50X2lkY3Qoc2wtPm1iICsgKDE2ICogMTYgKiAyIDw8IFBJWEVMX1NISUZUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHMucHBzLT5kZXF1YW50NF9jb2VmZltJU19JTlRSQShtYl90eXBlKSA/IDIgOiA1XVtxcFsxXV1bMF0pOworICAgICAgICAgICAgICAgIGgtPmgyNjRkc3AuaDI2NF9pZGN0X2FkZDgoZGVzdCwgYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iLCB1dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI3OSw3ICsyNjMsNyBAQAogICAgIGludCBsaW5lc2l6ZTsKICAgICBpbnQgaSwgaiwgcDsKICAgICBjb25zdCBpbnQgKmJsb2NrX29mZnNldCA9ICZoLT5ibG9ja19vZmZzZXRbMF07Ci0gICAgY29uc3QgaW50IHRyYW5zZm9ybV9ieXBhc3MgPSAhU0lNUExFICYmIChzbC0+cXNjYWxlID09IDAgJiYgaC0+c3BzLnRyYW5zZm9ybV9ieXBhc3MpOworICAgIGNvbnN0IGludCB0cmFuc2Zvcm1fYnlwYXNzID0gIVNJTVBMRSAmJiAoc2wtPnFzY2FsZSA9PSAwICYmIGgtPnBzLnNwcy0+dHJhbnNmb3JtX2J5cGFzcyk7CiAgICAgY29uc3QgaW50IHBsYW5lX2NvdW50ICAgICAgPSAoU0lNUExFIHx8ICFDT05GSUdfR1JBWSB8fCAhKGgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSkgPyAzIDogMTsKIAogICAgIGZvciAocCA9IDA7IHAgPCBwbGFuZV9jb3VudDsgcCsrKSB7CkBAIC0zMjEsNyArMzA1LDcgQEAKIAogICAgIGlmICghU0lNUExFICYmIElTX0lOVFJBX1BDTShtYl90eXBlKSkgewogICAgICAgICBpZiAoUElYRUxfU0hJRlQpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBiaXRfZGVwdGggPSBoLT5zcHMuYml0X2RlcHRoX2x1bWE7CisgICAgICAgICAgICBjb25zdCBpbnQgYml0X2RlcHRoID0gaC0+cHMuc3BzLT5iaXRfZGVwdGhfbHVtYTsKICAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgc2wtPmludHJhX3BjbV9wdHIsIDc2OCAqIGJpdF9kZXB0aCk7CiAKQEAgLTM0NCw3ICszMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLCAxLCAxLCBTSU1QTEUsIFBJWEVMX1NISUZUKTsKIAogICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lX2NvdW50OyBwKyspCi0gICAgICAgICAgICAgICAgaGxfZGVjb2RlX21iX3ByZWRpY3RfbHVtYShoLCBzbCwgbWJfdHlwZSwgMSwgU0lNUExFLAorICAgICAgICAgICAgICAgIGhsX2RlY29kZV9tYl9wcmVkaWN0X2x1bWEoaCwgc2wsIG1iX3R5cGUsIFNJTVBMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybV9ieXBhc3MsIFBJWEVMX1NISUZULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfb2Zmc2V0LCBsaW5lc2l6ZSwgZGVzdFtwXSwgcCk7CiAKQEAgLTM1MywxNCArMzM3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNpemUsIDAsIDEsIFNJTVBMRSwgUElYRUxfU0hJRlQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgRlVOQyhobF9tb3Rpb25fNDQ0KShoLCBzbCwgZGVzdFswXSwgZGVzdFsxXSwgZGVzdFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICBoLT5xcGVsX3B1dCwgaC0+aDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKLSAgICAgICAgICAgICAgICAgICAgICBoLT5xcGVsX2F2ZywgaC0+aDI2NGNocm9tYS5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0cXBlbC5wdXRfaDI2NF9xcGVsX3BpeGVsc190YWIsCisgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0cXBlbC5hdmdfaDI2NF9xcGVsX3BpeGVsc190YWIsCisgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGNocm9tYS5hdmdfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYiwKICAgICAgICAgICAgICAgICAgICAgICBoLT5oMjY0ZHNwLndlaWdodF9oMjY0X3BpeGVsc190YWIsCiAgICAgICAgICAgICAgICAgICAgICAgaC0+aDI2NGRzcC5iaXdlaWdodF9oMjY0X3BpeGVsc190YWIpOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lX2NvdW50OyBwKyspCi0gICAgICAgICAgICBobF9kZWNvZGVfbWJfaWRjdF9sdW1hKGgsIHNsLCBtYl90eXBlLCAxLCBTSU1QTEUsIHRyYW5zZm9ybV9ieXBhc3MsCisgICAgICAgICAgICBobF9kZWNvZGVfbWJfaWRjdF9sdW1hKGgsIHNsLCBtYl90eXBlLCBTSU1QTEUsIHRyYW5zZm9ybV9ieXBhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBJWEVMX1NISUZULCBibG9ja19vZmZzZXQsIGxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W3BdLCBwKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjRfbWNfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvaDI2NF9tY190ZW1wbGF0ZS5jCmluZGV4IGU0MzMzYTcuLmQwMmUyYmYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NF9tY190ZW1wbGF0ZS5jCisrKyBiL2xpYmF2Y29kZWMvaDI2NF9tY190ZW1wbGF0ZS5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0ZGVjLmgiCiAKICN1bmRlZiBNQ0ZVTkMKIApAQCAtNDgsOSArNDgsOSBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoMjY0X2Jpd2VpZ2h0X2Z1bmMgKndlaWdodF9hdmcsCiAgICAgICAgICAgICAgICAgICAgIGludCBsaXN0MCwgaW50IGxpc3QxKQogewotICAgIGlmICgoc2wtPnVzZV93ZWlnaHQgPT0gMiAmJiBsaXN0MCAmJiBsaXN0MSAmJgotICAgICAgICAgKHNsLT5pbXBsaWNpdF93ZWlnaHRbc2wtPnJlZl9jYWNoZVswXVtzY2FuOFtuXV1dW3NsLT5yZWZfY2FjaGVbMV1bc2Nhbjhbbl1dXVtzbC0+bWJfeSAmIDFdICE9IDMyKSkgfHwKLSAgICAgICAgc2wtPnVzZV93ZWlnaHQgPT0gMSkKKyAgICBpZiAoKHNsLT5wd3QudXNlX3dlaWdodCA9PSAyICYmIGxpc3QwICYmIGxpc3QxICYmCisgICAgICAgICAoc2wtPnB3dC5pbXBsaWNpdF93ZWlnaHRbc2wtPnJlZl9jYWNoZVswXVtzY2FuOFtuXV1dW3NsLT5yZWZfY2FjaGVbMV1bc2Nhbjhbbl1dXVtzbC0+bWJfeSAmIDFdICE9IDMyKSkgfHwKKyAgICAgICAgc2wtPnB3dC51c2Vfd2VpZ2h0ID09IDEpCiAgICAgICAgIG1jX3BhcnRfd2VpZ2h0ZWQoaCwgc2wsIG4sIHNxdWFyZSwgaGVpZ2h0LCBkZWx0YSwgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2Zmc2V0LCB5X29mZnNldCwgcXBpeF9wdXQsIGNocm9tYV9wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X29wWzBdLCB3ZWlnaHRfb3BbMV0sIHdlaWdodF9hdmdbMF0sCkBAIC02NCw5ICs2NCw5IEBACiBzdGF0aWMgdm9pZCBNQ0ZVTkMoaGxfbW90aW9uKShjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X2NiLCB1aW50OF90ICpkZXN0X2NyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXBlbF9tY19mdW5jKCpxcGl4X3B1dClbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXBlbF9tY19mdW5jKCpxcGl4X3B1dClbMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaDI2NF9jaHJvbWFfbWNfZnVuYygqY2hyb21hX3B1dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxcGVsX21jX2Z1bmMoKnFwaXhfYXZnKVsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxcGVsX21jX2Z1bmMoKnFwaXhfYXZnKVsxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoMjY0X2Nocm9tYV9tY19mdW5jKCpjaHJvbWFfYXZnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGgyNjRfd2VpZ2h0X2Z1bmMgKndlaWdodF9vcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGgyNjRfYml3ZWlnaHRfZnVuYyAqd2VpZ2h0X2F2ZykKQEAgLTc4LDcgKzc4LDggQEAKIAogICAgIGlmIChIQVZFX1RIUkVBRFMgJiYgKGgtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpKQogICAgICAgICBhd2FpdF9yZWZlcmVuY2VzKGgsIHNsKTsKLSAgICBwcmVmZXRjaF9tb3Rpb24oaCwgc2wsIDAsIFBJWEVMX1NISUZULCBDSFJPTUFfSURDKTsKKyAgICBpZiAoVVNFU19MSVNUKG1iX3R5cGUsIDApKQorICAgICAgICBwcmVmZXRjaF9tb3Rpb24oaCwgc2wsIDAsIFBJWEVMX1NISUZULCBDSFJPTUFfSURDKTsKIAogICAgIGlmIChJU18xNlgxNihtYl90eXBlKSkgewogICAgICAgICBtY19wYXJ0KGgsIHNsLCAwLCAxLCAxNiwgMCwgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLCAwLCAwLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X21ldGFkYXRhX2JzZi5jIGIvbGliYXZjb2RlYy9oMjY0X21ldGFkYXRhX2JzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MDUzZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2gyNjRfbWV0YWRhdGFfYnNmLmMKQEAgLTAsMCArMSw3MDkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaXNwbGF5LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImJzZi5oIgorI2luY2x1ZGUgImNicy5oIgorI2luY2x1ZGUgImNic19oMjY0LmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRfc2VpLmgiCisKK2VudW0geworICAgIFBBU1MsCisgICAgSU5TRVJULAorICAgIFJFTU9WRSwKKyAgICBFWFRSQUNULAorfTsKKworZW51bSB7CisgICAgRkxJUF9IT1JJWk9OVEFMID0gMSwKKyAgICBGTElQX1ZFUlRJQ0FMICAgPSAyLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NE1ldGFkYXRhQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmNiYzsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50IGFjY2Vzc191bml0OworCisgICAgaW50IGRvbmVfZmlyc3RfYXU7CisKKyAgICBpbnQgYXVkOworCisgICAgQVZSYXRpb25hbCBzYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgaW50IHZpZGVvX2Zvcm1hdDsKKyAgICBpbnQgdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworICAgIGludCBjb2xvdXJfcHJpbWFyaWVzOworICAgIGludCB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgaW50IG1hdHJpeF9jb2VmZmljaWVudHM7CisKKyAgICBpbnQgY2hyb21hX3NhbXBsZV9sb2NfdHlwZTsKKworICAgIEFWUmF0aW9uYWwgdGlja19yYXRlOworICAgIGludCBmaXhlZF9mcmFtZV9yYXRlX2ZsYWc7CisKKyAgICBpbnQgY3JvcF9sZWZ0OworICAgIGludCBjcm9wX3JpZ2h0OworICAgIGludCBjcm9wX3RvcDsKKyAgICBpbnQgY3JvcF9ib3R0b207CisKKyAgICBjb25zdCBjaGFyICpzZWlfdXNlcl9kYXRhOworCisgICAgaW50IGRlbGV0ZV9maWxsZXI7CisKKyAgICBpbnQgZGlzcGxheV9vcmllbnRhdGlvbjsKKyAgICBkb3VibGUgcm90YXRlOworICAgIGludCBmbGlwOworfSBIMjY0TWV0YWRhdGFDb250ZXh0OworCisKK3N0YXRpYyBpbnQgaDI2NF9tZXRhZGF0YV91cGRhdGVfc3BzKEFWQlNGQ29udGV4dCAqYnNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFJhd1NQUyAqc3BzKQoreworICAgIEgyNjRNZXRhZGF0YUNvbnRleHQgKmN0eCA9IGJzZi0+cHJpdl9kYXRhOworICAgIGludCBuZWVkX3Z1aSA9IDA7CisgICAgaW50IGNyb3BfdW5pdF94LCBjcm9wX3VuaXRfeTsKKworICAgIGlmIChjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmIGN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pIHsKKyAgICAgICAgLy8gVGFibGUgRS0xLgorICAgICAgICBzdGF0aWMgY29uc3QgQVZSYXRpb25hbCBzYXJfaWRjW10gPSB7CisgICAgICAgICAgICB7ICAgMCwgIDAgfSwgLy8gVW5zcGVjaWZpZWQgKG5ldmVyIHdyaXR0ZW4gaGVyZSkuCisgICAgICAgICAgICB7ICAgMSwgIDEgfSwgeyAgMTIsIDExIH0sIHsgIDEwLCAxMSB9LCB7ICAxNiwgMTEgfSwKKyAgICAgICAgICAgIHsgIDQwLCAzMyB9LCB7ICAyNCwgMTEgfSwgeyAgMjAsIDExIH0sIHsgIDMyLCAxMSB9LAorICAgICAgICAgICAgeyAgODAsIDMzIH0sIHsgIDE4LCAxMSB9LCB7ICAxNSwgMTEgfSwgeyAgNjQsIDMzIH0sCisgICAgICAgICAgICB7IDE2MCwgOTkgfSwgeyAgIDQsICAzIH0sIHsgICAzLCAgMiB9LCB7ICAgMiwgIDEgfSwKKyAgICAgICAgfTsKKyAgICAgICAgaW50IG51bSwgZGVuLCBpOworCisgICAgICAgIGF2X3JlZHVjZSgmbnVtLCAmZGVuLCBjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgY3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwgNjU1MzUpOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBGRl9BUlJBWV9FTEVNUyhzYXJfaWRjKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobnVtID09IHNhcl9pZGNbaV0ubnVtICYmCisgICAgICAgICAgICAgICAgZGVuID09IHNhcl9pZGNbaV0uZGVuKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IEZGX0FSUkFZX0VMRU1TKHNhcl9pZGMpKSB7CisgICAgICAgICAgICBzcHMtPnZ1aS5hc3BlY3RfcmF0aW9faWRjID0gMjU1OworICAgICAgICAgICAgc3BzLT52dWkuc2FyX3dpZHRoICA9IG51bTsKKyAgICAgICAgICAgIHNwcy0+dnVpLnNhcl9oZWlnaHQgPSBkZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcHMtPnZ1aS5hc3BlY3RfcmF0aW9faWRjID0gaTsKKyAgICAgICAgfQorICAgICAgICBzcHMtPnZ1aS5hc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcgPSAxOworICAgICAgICBuZWVkX3Z1aSA9IDE7CisgICAgfQorCisjZGVmaW5lIFNFVF9PUl9JTkZFUihmaWVsZCwgdmFsdWUsIHByZXNlbnRfZmxhZywgaW5mZXIpIGRvIHsgXAorICAgICAgICBpZiAodmFsdWUgPj0gMCkgeyBcCisgICAgICAgICAgICBmaWVsZCA9IHZhbHVlOyBcCisgICAgICAgICAgICBuZWVkX3Z1aSA9IDE7IFwKKyAgICAgICAgfSBlbHNlIGlmICghcHJlc2VudF9mbGFnKSBcCisgICAgICAgICAgICBmaWVsZCA9IGluZmVyOyBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGlmIChjdHgtPnZpZGVvX2Zvcm1hdCAgICAgICAgICAgICA+PSAwIHx8CisgICAgICAgIGN0eC0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnICAgID49IDAgfHwKKyAgICAgICAgY3R4LT5jb2xvdXJfcHJpbWFyaWVzICAgICAgICAgPj0gMCB8fAorICAgICAgICBjdHgtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA+PSAwIHx8CisgICAgICAgIGN0eC0+bWF0cml4X2NvZWZmaWNpZW50cyAgICAgID49IDApIHsKKworICAgICAgICBTRVRfT1JfSU5GRVIoc3BzLT52dWkudmlkZW9fZm9ybWF0LCBjdHgtPnZpZGVvX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIHNwcy0+dnVpLnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZywgNSk7CisKKyAgICAgICAgU0VUX09SX0lORkVSKHNwcy0+dnVpLnZpZGVvX2Z1bGxfcmFuZ2VfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIGN0eC0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgc3BzLT52dWkudmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnLCAwKTsKKworICAgICAgICBpZiAoY3R4LT5jb2xvdXJfcHJpbWFyaWVzICAgICAgICAgPj0gMCB8fAorICAgICAgICAgICAgY3R4LT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPj0gMCB8fAorICAgICAgICAgICAgY3R4LT5tYXRyaXhfY29lZmZpY2llbnRzICAgICAgPj0gMCkgeworCisgICAgICAgICAgICBTRVRfT1JfSU5GRVIoc3BzLT52dWkuY29sb3VyX3ByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmNvbG91cl9wcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT52dWkuY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZywgMik7CisKKyAgICAgICAgICAgIFNFVF9PUl9JTkZFUihzcHMtPnZ1aS50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT52dWkuY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZywgMik7CisKKyAgICAgICAgICAgIFNFVF9PUl9JTkZFUihzcHMtPnZ1aS5tYXRyaXhfY29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bWF0cml4X2NvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHMtPnZ1aS5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnLCAyKTsKKworICAgICAgICAgICAgc3BzLT52dWkuY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgc3BzLT52dWkudmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnID0gMTsKKyAgICAgICAgbmVlZF92dWkgPSAxOworICAgIH0KKworICAgIGlmIChjdHgtPmNocm9tYV9zYW1wbGVfbG9jX3R5cGUgPj0gMCkgeworICAgICAgICBzcHMtPnZ1aS5jaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZCA9CisgICAgICAgICAgICBjdHgtPmNocm9tYV9zYW1wbGVfbG9jX3R5cGU7CisgICAgICAgIHNwcy0+dnVpLmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkID0KKyAgICAgICAgICAgIGN0eC0+Y2hyb21hX3NhbXBsZV9sb2NfdHlwZTsKKyAgICAgICAgc3BzLT52dWkuY2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgICAgIG5lZWRfdnVpID0gMTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT50aWNrX3JhdGUubnVtICYmIGN0eC0+dGlja19yYXRlLmRlbikgeworICAgICAgICBpbnQgbnVtLCBkZW47CisKKyAgICAgICAgYXZfcmVkdWNlKCZudW0sICZkZW4sIGN0eC0+dGlja19yYXRlLm51bSwgY3R4LT50aWNrX3JhdGUuZGVuLAorICAgICAgICAgICAgICAgICAgVUlOVDMyX01BWCA+IElOVF9NQVggPyBVSU5UMzJfTUFYIDogSU5UX01BWCk7CisKKyAgICAgICAgc3BzLT52dWkudGltZV9zY2FsZSAgICAgICAgPSBudW07CisgICAgICAgIHNwcy0+dnVpLm51bV91bml0c19pbl90aWNrID0gZGVuOworCisgICAgICAgIHNwcy0+dnVpLnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgICAgIG5lZWRfdnVpID0gMTsKKyAgICB9CisgICAgU0VUX09SX0lORkVSKHNwcy0+dnVpLmZpeGVkX2ZyYW1lX3JhdGVfZmxhZywKKyAgICAgICAgICAgICAgICAgY3R4LT5maXhlZF9mcmFtZV9yYXRlX2ZsYWcsCisgICAgICAgICAgICAgICAgIHNwcy0+dnVpLnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZywgMCk7CisKKyAgICBpZiAoc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZyB8fCBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDApIHsKKyAgICAgICAgY3JvcF91bml0X3ggPSAxOworICAgICAgICBjcm9wX3VuaXRfeSA9IDIgLSBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3JvcF91bml0X3ggPSAxICsgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPCAzKTsKKyAgICAgICAgY3JvcF91bml0X3kgPSAoMSArIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjIDwgMikpICoKKyAgICAgICAgICAgICAgICAgICAgICAgKDIgLSBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcpOworICAgIH0KKyNkZWZpbmUgQ1JPUChib3JkZXIsIHVuaXQpIGRvIHsgXAorICAgICAgICBpZiAoY3R4LT5jcm9wXyAjIyBib3JkZXIgPj0gMCkgeyBcCisgICAgICAgICAgICBpZiAoY3R4LT5jcm9wXyAjIyBib3JkZXIgJSB1bml0ICE9IDApIHsgXAorICAgICAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdmFsdWUgZm9yIGNyb3BfJXM6ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIG11bHRpcGxlIG9mICVkLlxuIiwgI2JvcmRlciwgdW5pdCk7IFwKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIHNwcy0+ZnJhbWVfY3JvcF8gIyMgYm9yZGVyICMjIF9vZmZzZXQgPSBcCisgICAgICAgICAgICAgICAgICBjdHgtPmNyb3BfICMjIGJvcmRlciAvIHVuaXQ7IFwKKyAgICAgICAgICAgIHNwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9IDE7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKyAgICBDUk9QKGxlZnQsICAgY3JvcF91bml0X3gpOworICAgIENST1AocmlnaHQsICBjcm9wX3VuaXRfeCk7CisgICAgQ1JPUCh0b3AsICAgIGNyb3BfdW5pdF95KTsKKyAgICBDUk9QKGJvdHRvbSwgY3JvcF91bml0X3kpOworI3VuZGVmIENST1AKKworICAgIGlmIChuZWVkX3Z1aSkKKyAgICAgICAgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2NF9tZXRhZGF0YV9maWx0ZXIoQVZCU0ZDb250ZXh0ICpic2YsIEFWUGFja2V0ICpvdXQpCit7CisgICAgSDI2NE1ldGFkYXRhQ29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisgICAgQVZQYWNrZXQgKmluID0gTlVMTDsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICphdSA9ICZjdHgtPmFjY2Vzc191bml0OworICAgIGludCBlcnIsIGksIGosIGhhc19zcHM7CisgICAgdWludDhfdCAqZGlzcGxheW1hdHJpeF9zaWRlX2RhdGEgPSBOVUxMOworICAgIHNpemVfdCBkaXNwbGF5bWF0cml4X3NpZGVfZGF0YV9zaXplID0gMDsKKworICAgIGVyciA9IGZmX2JzZl9nZXRfcGFja2V0KGJzZiwgJmluKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGZmX2Nic19yZWFkX3BhY2tldChjdHgtPmNiYywgYXUsIGluKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBwYWNrZXQuXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChhdS0+bmJfdW5pdHMgPT0gMCkgeworICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJObyBOQUwgdW5pdHMgaW4gcGFja2V0LlxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvLyBJZiBhbiBBVUQgaXMgcHJlc2VudCwgaXQgbXVzdCBiZSB0aGUgZmlyc3QgTkFMIHVuaXQuCisgICAgaWYgKGF1LT51bml0c1swXS50eXBlID09IEgyNjRfTkFMX0FVRCkgeworICAgICAgICBpZiAoY3R4LT5hdWQgPT0gUkVNT1ZFKQorICAgICAgICAgICAgZmZfY2JzX2RlbGV0ZV91bml0KGN0eC0+Y2JjLCBhdSwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGN0eC0+YXVkID09IElOU0VSVCkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBwcmltYXJ5X3BpY190eXBlX3RhYmxlW10gPSB7CisgICAgICAgICAgICAgICAgMHgwODQsIC8vIDIsIDcKKyAgICAgICAgICAgICAgICAweDBhNSwgLy8gMCwgMiwgNSwgNworICAgICAgICAgICAgICAgIDB4MGU3LCAvLyAwLCAxLCAyLCA1LCA2LCA3CisgICAgICAgICAgICAgICAgMHgyMTAsIC8vIDQsIDkKKyAgICAgICAgICAgICAgICAweDMxOCwgLy8gMywgNCwgOCwgOQorICAgICAgICAgICAgICAgIDB4Mjk0LCAvLyAyLCA0LCA3LCA5CisgICAgICAgICAgICAgICAgMHgzYmQsIC8vIDAsIDIsIDMsIDQsIDUsIDcsIDgsIDkKKyAgICAgICAgICAgICAgICAweDNmZiwgLy8gMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGludCBwcmltYXJ5X3BpY190eXBlX21hc2sgPSAweGZmOworICAgICAgICAgICAgSDI2NFJhd0FVRCBhdWQgPSB7CisgICAgICAgICAgICAgICAgLm5hbF91bml0X2hlYWRlci5uYWxfdW5pdF90eXBlID0gSDI2NF9OQUxfQVVELAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF1LT5uYl91bml0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGF1LT51bml0c1tpXS50eXBlID09IEgyNjRfTkFMX1NMSUNFIHx8CisgICAgICAgICAgICAgICAgICAgIGF1LT51bml0c1tpXS50eXBlID09IEgyNjRfTkFMX0lEUl9TTElDRSkgeworICAgICAgICAgICAgICAgICAgICBIMjY0UmF3U2xpY2UgKnNsaWNlID0gYXUtPnVuaXRzW2ldLmNvbnRlbnQ7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBGRl9BUlJBWV9FTEVNUyhwcmltYXJ5X3BpY190eXBlX3RhYmxlKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEocHJpbWFyeV9waWNfdHlwZV90YWJsZVtqXSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgc2xpY2UtPmhlYWRlci5zbGljZV90eXBlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlfcGljX3R5cGVfbWFzayAmPSB+KDEgPDwgaik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgRkZfQVJSQVlfRUxFTVMocHJpbWFyeV9waWNfdHlwZV90YWJsZSk7IGorKykKKyAgICAgICAgICAgICAgICBpZiAocHJpbWFyeV9waWNfdHlwZV9tYXNrICYgKDEgPDwgaikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKGogPj0gRkZfQVJSQVlfRUxFTVMocHJpbWFyeV9waWNfdHlwZV90YWJsZSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJObyB1c2FibGUgcHJpbWFyeV9waWNfdHlwZTogIgorICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBzbGljZSB0eXBlcz9cbiIpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdWQucHJpbWFyeV9waWNfdHlwZSA9IGo7CisKKyAgICAgICAgICAgIGVyciA9IGZmX2Nic19pbnNlcnRfdW5pdF9jb250ZW50KGN0eC0+Y2JjLCBhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEgyNjRfTkFMX0FVRCwgJmF1ZCwgTlVMTCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbnNlcnQgQVVELlxuIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaGFzX3NwcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGF1LT5uYl91bml0czsgaSsrKSB7CisgICAgICAgIGlmIChhdS0+dW5pdHNbaV0udHlwZSA9PSBIMjY0X05BTF9TUFMpIHsKKyAgICAgICAgICAgIGVyciA9IGgyNjRfbWV0YWRhdGFfdXBkYXRlX3Nwcyhic2YsIGF1LT51bml0c1tpXS5jb250ZW50KTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGhhc19zcHMgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT25seSBpbnNlcnQgdGhlIFNFSSBpbiBhY2Nlc3MgdW5pdHMgY29udGFpbmluZyBTUFNzLCBhbmQgYWxzbworICAgIC8vIHVuY29uZGl0aW9uYWxseSBpbiB0aGUgZmlyc3QgYWNjZXNzIHVuaXQgd2UgZXZlciBzZWUuCisgICAgaWYgKGN0eC0+c2VpX3VzZXJfZGF0YSAmJiAoaGFzX3NwcyB8fCAhY3R4LT5kb25lX2ZpcnN0X2F1KSkgeworICAgICAgICBIMjY0UmF3U0VJUGF5bG9hZCBwYXlsb2FkID0geworICAgICAgICAgICAgLnBheWxvYWRfdHlwZSA9IEgyNjRfU0VJX1RZUEVfVVNFUl9EQVRBX1VOUkVHSVNURVJFRCwKKyAgICAgICAgfTsKKyAgICAgICAgSDI2NFJhd1NFSVVzZXJEYXRhVW5yZWdpc3RlcmVkICp1ZHUgPQorICAgICAgICAgICAgJnBheWxvYWQucGF5bG9hZC51c2VyX2RhdGFfdW5yZWdpc3RlcmVkOworCisgICAgICAgIGZvciAoaSA9IGogPSAwOyBqIDwgMzIgJiYgY3R4LT5zZWlfdXNlcl9kYXRhW2ldOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjLCB2OworICAgICAgICAgICAgYyA9IGN0eC0+c2VpX3VzZXJfZGF0YVtpXTsKKyAgICAgICAgICAgIGlmIChjID09ICctJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdl9pc3hkaWdpdChjKSkgeworICAgICAgICAgICAgICAgIGMgPSBhdl90b2xvd2VyKGMpOworICAgICAgICAgICAgICAgIHYgPSAoYyA8PSAnOScgPyBjIC0gJzAnIDogYyAtICdhJyArIDEwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ290byBpbnZhbGlkX3VzZXJfZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpICYgMSkKKyAgICAgICAgICAgICAgICB1ZHUtPnV1aWRfaXNvX2llY18xMTU3OFtqIC8gMl0gfD0gdjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB1ZHUtPnV1aWRfaXNvX2llY18xMTU3OFtqIC8gMl0gPSB2IDw8IDQ7CisgICAgICAgICAgICArK2o7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPT0gMzIgJiYgY3R4LT5zZWlfdXNlcl9kYXRhW2ldID09ICcrJykgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihjdHgtPnNlaV91c2VyX2RhdGEgKyBpICsgMSk7CisKKyAgICAgICAgICAgIHVkdS0+ZGF0YV9yZWYgPSBhdl9idWZmZXJfYWxsb2MobGVuICsgMSk7CisgICAgICAgICAgICBpZiAoIXVkdS0+ZGF0YV9yZWYpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1ZHUtPmRhdGEgICAgICAgID0gdWR1LT5kYXRhX3JlZi0+ZGF0YTsKKyAgICAgICAgICAgIHVkdS0+ZGF0YV9sZW5ndGggPSBsZW4gKyAxOworICAgICAgICAgICAgbWVtY3B5KHVkdS0+ZGF0YSwgY3R4LT5zZWlfdXNlcl9kYXRhICsgaSArIDEsIGxlbiArIDEpOworCisgICAgICAgICAgICBwYXlsb2FkLnBheWxvYWRfc2l6ZSA9IDE2ICsgdWR1LT5kYXRhX2xlbmd0aDsKKworICAgICAgICAgICAgZXJyID0gZmZfY2JzX2gyNjRfYWRkX3NlaV9tZXNzYWdlKGN0eC0+Y2JjLCBhdSwgJnBheWxvYWQpOworICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWRkIHVzZXIgZGF0YSBTRUkgIgorICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSB0byBhY2Nlc3MgdW5pdC5cbiIpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICBpbnZhbGlkX3VzZXJfZGF0YToKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdXNlciBkYXRhOiAiCisgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgXCJVVUlEK3N0cmluZ1wiLlxuIik7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3R4LT5kZWxldGVfZmlsbGVyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdS0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKGF1LT51bml0c1tpXS50eXBlID09IEgyNjRfTkFMX0ZJTExFUl9EQVRBKSB7CisgICAgICAgICAgICAgICAgLy8gRmlsbGVyIE5BTCB1bml0cy4KKyAgICAgICAgICAgICAgICBlcnIgPSBmZl9jYnNfZGVsZXRlX3VuaXQoY3R4LT5jYmMsIGF1LCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVsZXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxsZXIgTkFMLlxuIik7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLS1pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXUtPnVuaXRzW2ldLnR5cGUgPT0gSDI2NF9OQUxfU0VJKSB7CisgICAgICAgICAgICAgICAgLy8gRmlsbGVyIFNFSSBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICBIMjY0UmF3U0VJICpzZWkgPSBhdS0+dW5pdHNbaV0uY29udGVudDsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzZWktPnBheWxvYWRfY291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2VpLT5wYXlsb2FkW2pdLnBheWxvYWRfdHlwZSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgSDI2NF9TRUlfVFlQRV9GSUxMRVJfUEFZTE9BRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZmZfY2JzX2gyNjRfZGVsZXRlX3NlaV9tZXNzYWdlKGN0eC0+Y2JjLCBhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXUtPnVuaXRzW2ldLCBqKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlbGV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxsZXIgU0VJIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW51bWJlcmluZyBtaWdodCBoYXZlIGhhcHBlbmVkLCBzdGFydCBhZ2FpbiBhdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgTkFMIHVuaXQgcG9zaXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdHgtPmRpc3BsYXlfb3JpZW50YXRpb24gIT0gUEFTUykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXUtPm5iX3VuaXRzOyBpKyspIHsKKyAgICAgICAgICAgIEgyNjRSYXdTRUkgKnNlaTsKKyAgICAgICAgICAgIGlmIChhdS0+dW5pdHNbaV0udHlwZSAhPSBIMjY0X05BTF9TRUkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzZWkgPSBhdS0+dW5pdHNbaV0uY29udGVudDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNlaS0+cGF5bG9hZF9jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgSDI2NFJhd1NFSURpc3BsYXlPcmllbnRhdGlvbiAqZGlzcDsKKyAgICAgICAgICAgICAgICBpbnQzMl90ICptYXRyaXg7CisKKyAgICAgICAgICAgICAgICBpZiAoc2VpLT5wYXlsb2FkW2pdLnBheWxvYWRfdHlwZSAhPQorICAgICAgICAgICAgICAgICAgICBIMjY0X1NFSV9UWVBFX0RJU1BMQVlfT1JJRU5UQVRJT04pCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRpc3AgPSAmc2VpLT5wYXlsb2FkW2pdLnBheWxvYWQuZGlzcGxheV9vcmllbnRhdGlvbjsKKworICAgICAgICAgICAgICAgIGlmIChjdHgtPmRpc3BsYXlfb3JpZW50YXRpb24gPT0gUkVNT1ZFIHx8CisgICAgICAgICAgICAgICAgICAgIGN0eC0+ZGlzcGxheV9vcmllbnRhdGlvbiA9PSBJTlNFUlQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gZmZfY2JzX2gyNjRfZGVsZXRlX3NlaV9tZXNzYWdlKGN0eC0+Y2JjLCBhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdS0+dW5pdHNbaV0sIGopOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlbGV0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpc3BsYXkgb3JpZW50YXRpb24gU0VJIG1lc3NhZ2UuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAtLWk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hdHJpeCA9IGF2X21hbGxvY3ooOSAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFtYXRyaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXZfZGlzcGxheV9yb3RhdGlvbl9zZXQobWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3AtPmFudGljbG9ja3dpc2Vfcm90YXRpb24gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MC4wIC8gNjU1MzYuMCk7CisgICAgICAgICAgICAgICAgYXZfZGlzcGxheV9tYXRyaXhfZmxpcChtYXRyaXgsIGRpc3AtPmhvcl9mbGlwLCBkaXNwLT52ZXJfZmxpcCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZGlzcGxheSBvcmllbnRhdGlvbiBtZXNzYWdlcyBpbiBhbgorICAgICAgICAgICAgICAgIC8vIGFjY2VzcyB1bml0IHRoZW4gaWdub3JlIGFsbCBidXQgdGhlIGxhc3Qgb25lLgorICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZkaXNwbGF5bWF0cml4X3NpZGVfZGF0YSk7CisKKyAgICAgICAgICAgICAgICBkaXNwbGF5bWF0cml4X3NpZGVfZGF0YSAgICAgID0gKHVpbnQ4X3QqKW1hdHJpeDsKKyAgICAgICAgICAgICAgICBkaXNwbGF5bWF0cml4X3NpZGVfZGF0YV9zaXplID0gOSAqIHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY3R4LT5kaXNwbGF5X29yaWVudGF0aW9uID09IElOU0VSVCkgeworICAgICAgICBIMjY0UmF3U0VJUGF5bG9hZCBwYXlsb2FkID0geworICAgICAgICAgICAgLnBheWxvYWRfdHlwZSA9IEgyNjRfU0VJX1RZUEVfRElTUExBWV9PUklFTlRBVElPTiwKKyAgICAgICAgfTsKKyAgICAgICAgSDI2NFJhd1NFSURpc3BsYXlPcmllbnRhdGlvbiAqZGlzcCA9CisgICAgICAgICAgICAmcGF5bG9hZC5wYXlsb2FkLmRpc3BsYXlfb3JpZW50YXRpb247CisgICAgICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgICAgIGludCBzaXplOworICAgICAgICBpbnQgd3JpdGUgPSAwOworCisgICAgICAgIGRhdGEgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShpbiwgQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWCwgJnNpemUpOworICAgICAgICBpZiAoZGF0YSAmJiBzaXplID49IDkgKiBzaXplb2YoaW50MzJfdCkpIHsKKyAgICAgICAgICAgIGludDMyX3QgbWF0cml4WzldOworICAgICAgICAgICAgaW50IGhmbGlwLCB2ZmxpcDsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZTsKKworICAgICAgICAgICAgbWVtY3B5KG1hdHJpeCwgZGF0YSwgc2l6ZW9mKG1hdHJpeCkpOworCisgICAgICAgICAgICBoZmxpcCA9IHZmbGlwID0gMDsKKyAgICAgICAgICAgIGlmIChtYXRyaXhbMF0gPCAwICYmIG1hdHJpeFs0XSA+IDApCisgICAgICAgICAgICAgICAgaGZsaXAgPSAxOworICAgICAgICAgICAgZWxzZSBpZiAobWF0cml4WzBdID4gMCAmJiBtYXRyaXhbNF0gPCAwKQorICAgICAgICAgICAgICAgIHZmbGlwID0gMTsKKyAgICAgICAgICAgIGF2X2Rpc3BsYXlfbWF0cml4X2ZsaXAobWF0cml4LCBoZmxpcCwgdmZsaXApOworCisgICAgICAgICAgICBhbmdsZSA9IGF2X2Rpc3BsYXlfcm90YXRpb25fZ2V0KG1hdHJpeCk7CisKKyAgICAgICAgICAgIGlmICghKGFuZ2xlID49IC0xODAuMCAmJiBhbmdsZSA8PSAxODAuMCAvKiBhbHNvIGV4Y2x1ZGVzIE5hTiAqLykgfHwKKyAgICAgICAgICAgICAgICBtYXRyaXhbMl0gIT0gMCB8fCBtYXRyaXhbNV0gIT0gMCB8fAorICAgICAgICAgICAgICAgIG1hdHJpeFs2XSAhPSAwIHx8IG1hdHJpeFs3XSAhPSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX1dBUk5JTkcsICJJbnB1dCBkaXNwbGF5IG1hdHJpeCBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAicmVwcmVzZW50YWJsZSBpbiBILjI2NCBwYXJhbWV0ZXJzLlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRpc3AtPmhvcl9mbGlwID0gaGZsaXA7CisgICAgICAgICAgICAgICAgZGlzcC0+dmVyX2ZsaXAgPSB2ZmxpcDsKKyAgICAgICAgICAgICAgICBkaXNwLT5hbnRpY2xvY2t3aXNlX3JvdGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KXJpbnQoKGFuZ2xlID49IDAuMCA/IGFuZ2xlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhbmdsZSArIDM2MC4wKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM2LjAgLyAzNjAuMCk7CisgICAgICAgICAgICAgICAgd3JpdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc19zcHMgfHwgIWN0eC0+ZG9uZV9maXJzdF9hdSkgeworICAgICAgICAgICAgaWYgKCFpc25hbihjdHgtPnJvdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICBkaXNwLT5hbnRpY2xvY2t3aXNlX3JvdGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90KXJpbnQoKGN0eC0+cm90YXRlID49IDAuMCA/IGN0eC0+cm90YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjdHgtPnJvdGF0ZSArIDM2MC4wKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM2LjAgLyAzNjAuMCk7CisgICAgICAgICAgICAgICAgd3JpdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN0eC0+ZmxpcCkgeworICAgICAgICAgICAgICAgIGRpc3AtPmhvcl9mbGlwID0gISEoY3R4LT5mbGlwICYgRkxJUF9IT1JJWk9OVEFMKTsKKyAgICAgICAgICAgICAgICBkaXNwLT52ZXJfZmxpcCA9ICEhKGN0eC0+ZmxpcCAmIEZMSVBfVkVSVElDQUwpOworICAgICAgICAgICAgICAgIHdyaXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh3cml0ZSkgeworICAgICAgICAgICAgZGlzcC0+ZGlzcGxheV9vcmllbnRhdGlvbl9yZXBldGl0aW9uX3BlcmlvZCA9IDE7CisKKyAgICAgICAgICAgIGVyciA9IGZmX2Nic19oMjY0X2FkZF9zZWlfbWVzc2FnZShjdHgtPmNiYywgYXUsICZwYXlsb2FkKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFkZCBkaXNwbGF5IG9yaWVudGF0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlNFSSBtZXNzYWdlIHRvIGFjY2VzcyB1bml0LlxuIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZXJyID0gZmZfY2JzX3dyaXRlX3BhY2tldChjdHgtPmNiYywgb3V0LCBhdSk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIHBhY2tldC5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZXJyID0gYXZfcGFja2V0X2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChkaXNwbGF5bWF0cml4X3NpZGVfZGF0YSkgeworICAgICAgICBlcnIgPSBhdl9wYWNrZXRfYWRkX3NpZGVfZGF0YShvdXQsIEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXltYXRyaXhfc2lkZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5bWF0cml4X3NpZGVfZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGF0dGFjaCBleHRyYWN0ZWQgIgorICAgICAgICAgICAgICAgICAgICJkaXNwbGF5bWF0cml4IHNpZGUgZGF0YSB0byBwYWNrZXQuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBkaXNwbGF5bWF0cml4X3NpZGVfZGF0YSA9IE5VTEw7CisgICAgfQorCisgICAgY3R4LT5kb25lX2ZpcnN0X2F1ID0gMTsKKworICAgIGVyciA9IDA7CitmYWlsOgorICAgIGZmX2Nic19mcmFnbWVudF91bmluaXQoY3R4LT5jYmMsIGF1KTsKKyAgICBhdl9mcmVlcCgmZGlzcGxheW1hdHJpeF9zaWRlX2RhdGEpOworCisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGgyNjRfbWV0YWRhdGFfaW5pdChBVkJTRkNvbnRleHQgKmJzZikKK3sKKyAgICBIMjY0TWV0YWRhdGFDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICphdSA9ICZjdHgtPmFjY2Vzc191bml0OworICAgIGludCBlcnIsIGk7CisKKyAgICBlcnIgPSBmZl9jYnNfaW5pdCgmY3R4LT5jYmMsIEFWX0NPREVDX0lEX0gyNjQsIGJzZik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAoYnNmLT5wYXJfaW4tPmV4dHJhZGF0YSkgeworICAgICAgICBlcnIgPSBmZl9jYnNfcmVhZF9leHRyYWRhdGEoY3R4LT5jYmMsIGF1LCBic2YtPnBhcl9pbik7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdS0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKGF1LT51bml0c1tpXS50eXBlID09IEgyNjRfTkFMX1NQUykgeworICAgICAgICAgICAgICAgIGVyciA9IGgyNjRfbWV0YWRhdGFfdXBkYXRlX3Nwcyhic2YsIGF1LT51bml0c1tpXS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZmZfY2JzX3dyaXRlX2V4dHJhZGF0YShjdHgtPmNiYywgYnNmLT5wYXJfb3V0LCBhdSk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgZXh0cmFkYXRhLlxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSAwOworZmFpbDoKKyAgICBmZl9jYnNfZnJhZ21lbnRfdW5pbml0KGN0eC0+Y2JjLCBhdSk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaDI2NF9tZXRhZGF0YV9jbG9zZShBVkJTRkNvbnRleHQgKmJzZikKK3sKKyAgICBIMjY0TWV0YWRhdGFDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBmZl9jYnNfY2xvc2UoJmN0eC0+Y2JjKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSDI2NE1ldGFkYXRhQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0JTRl9QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBoMjY0X21ldGFkYXRhX29wdGlvbnNbXSA9IHsKKyAgICB7ICJhdWQiLCAiQWNjZXNzIFVuaXQgRGVsaW1pdGVyIE5BTCB1bml0cyIsCisgICAgICAgIE9GRlNFVChhdWQpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IFBBU1MgfSwgUEFTUywgUkVNT1ZFLCBGTEFHUywgImF1ZCIgfSwKKyAgICB7ICJwYXNzIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwKKyAgICAgICAgeyAuaTY0ID0gUEFTUyAgIH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJhdWQiIH0sCisgICAgeyAiaW5zZXJ0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsCisgICAgICAgIHsgLmk2NCA9IElOU0VSVCB9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiYXVkIiB9LAorICAgIHsgInJlbW92ZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULAorICAgICAgICB7IC5pNjQgPSBSRU1PVkUgfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImF1ZCIgfSwKKworICAgIHsgInNhbXBsZV9hc3BlY3RfcmF0aW8iLCAiU2V0IHNhbXBsZSBhc3BlY3QgcmF0aW8gKHRhYmxlIEUtMSkiLAorICAgICAgICBPRkZTRVQoc2FtcGxlX2FzcGVjdF9yYXRpbyksIEFWX09QVF9UWVBFX1JBVElPTkFMLAorICAgICAgICB7IC5kYmwgPSAwLjAgfSwgMCwgNjU1MzUsIEZMQUdTIH0sCisKKyAgICB7ICJ2aWRlb19mb3JtYXQiLCAiU2V0IHZpZGVvIGZvcm1hdCAodGFibGUgRS0yKSIsCisgICAgICAgIE9GRlNFVCh2aWRlb19mb3JtYXQpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCA3LCBGTEFHU30sCisgICAgeyAidmlkZW9fZnVsbF9yYW5nZV9mbGFnIiwgIlNldCB2aWRlbyBmdWxsIHJhbmdlIGZsYWciLAorICAgICAgICBPRkZTRVQodmlkZW9fZnVsbF9yYW5nZV9mbGFnKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMSwgRkxBR1MgfSwKKyAgICB7ICJjb2xvdXJfcHJpbWFyaWVzIiwgIlNldCBjb2xvdXIgcHJpbWFyaWVzICh0YWJsZSBFLTMpIiwKKyAgICAgICAgT0ZGU0VUKGNvbG91cl9wcmltYXJpZXMpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAyNTUsIEZMQUdTIH0sCisgICAgeyAidHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzIiwgIlNldCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MgKHRhYmxlIEUtNCkiLAorICAgICAgICBPRkZTRVQodHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMjU1LCBGTEFHUyB9LAorICAgIHsgIm1hdHJpeF9jb2VmZmljaWVudHMiLCAiU2V0IG1hdHJpeCBjb2VmZmljaWVudHMgKHRhYmxlIEUtNSkiLAorICAgICAgICBPRkZTRVQobWF0cml4X2NvZWZmaWNpZW50cyksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDI1NSwgRkxBR1MgfSwKKworICAgIHsgImNocm9tYV9zYW1wbGVfbG9jX3R5cGUiLCAiU2V0IGNocm9tYSBzYW1wbGUgbG9jYXRpb24gdHlwZSAoZmlndXJlIEUtMSkiLAorICAgICAgICBPRkZTRVQoY2hyb21hX3NhbXBsZV9sb2NfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDYsIEZMQUdTIH0sCisKKyAgICB7ICJ0aWNrX3JhdGUiLCAiU2V0IFZVSSB0aWNrIHJhdGUgKG51bV91bml0c19pbl90aWNrIC8gdGltZV9zY2FsZSkiLAorICAgICAgICBPRkZTRVQodGlja19yYXRlKSwgQVZfT1BUX1RZUEVfUkFUSU9OQUwsCisgICAgICAgIHsgLmRibCA9IDAuMCB9LCAwLCBVSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJmaXhlZF9mcmFtZV9yYXRlX2ZsYWciLCAiU2V0IFZVSSBmaXhlZCBmcmFtZSByYXRlIGZsYWciLAorICAgICAgICBPRkZTRVQoZml4ZWRfZnJhbWVfcmF0ZV9mbGFnKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMSwgRkxBR1MgfSwKKworICAgIHsgImNyb3BfbGVmdCIsICJTZXQgbGVmdCBib3JkZXIgY3JvcCBvZmZzZXQiLAorICAgICAgICBPRkZTRVQoY3JvcF9sZWZ0KSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgSDI2NF9NQVhfV0lEVEgsIEZMQUdTIH0sCisgICAgeyAiY3JvcF9yaWdodCIsICJTZXQgcmlnaHQgYm9yZGVyIGNyb3Agb2Zmc2V0IiwKKyAgICAgICAgT0ZGU0VUKGNyb3BfcmlnaHQpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBIMjY0X01BWF9XSURUSCwgRkxBR1MgfSwKKyAgICB7ICJjcm9wX3RvcCIsICJTZXQgdG9wIGJvcmRlciBjcm9wIG9mZnNldCIsCisgICAgICAgIE9GRlNFVChjcm9wX3RvcCksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIEgyNjRfTUFYX0hFSUdIVCwgRkxBR1MgfSwKKyAgICB7ICJjcm9wX2JvdHRvbSIsICJTZXQgYm90dG9tIGJvcmRlciBjcm9wIG9mZnNldCIsCisgICAgICAgIE9GRlNFVChjcm9wX2JvdHRvbSksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIEgyNjRfTUFYX0hFSUdIVCwgRkxBR1MgfSwKKworICAgIHsgInNlaV91c2VyX2RhdGEiLCAiSW5zZXJ0IFNFSSB1c2VyIGRhdGEgKFVVSUQrc3RyaW5nKSIsCisgICAgICAgIE9GRlNFVChzZWlfdXNlcl9kYXRhKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIC5mbGFncyA9IEZMQUdTIH0sCisKKyAgICB7ICJkZWxldGVfZmlsbGVyIiwgIkRlbGV0ZSBhbGwgZmlsbGVyIChib3RoIE5BTCBhbmQgU0VJKSIsCisgICAgICAgIE9GRlNFVChkZWxldGVfZmlsbGVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTfSwKKworICAgIHsgImRpc3BsYXlfb3JpZW50YXRpb24iLCAiRGlzcGxheSBvcmllbnRhdGlvbiBTRUkiLAorICAgICAgICBPRkZTRVQoZGlzcGxheV9vcmllbnRhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gUEFTUyB9LCBQQVNTLCBFWFRSQUNULCBGTEFHUywgImRpc3Bfb3IiIH0sCisgICAgeyAicGFzcyIsICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULAorICAgICAgICB7IC5pNjQgPSBQQVNTICAgIH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJkaXNwX29yIiB9LAorICAgIHsgImluc2VydCIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwKKyAgICAgICAgeyAuaTY0ID0gSU5TRVJUICB9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZGlzcF9vciIgfSwKKyAgICB7ICJyZW1vdmUiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsCisgICAgICAgIHsgLmk2NCA9IFJFTU9WRSAgfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImRpc3Bfb3IiIH0sCisgICAgeyAiZXh0cmFjdCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULAorICAgICAgICB7IC5pNjQgPSBFWFRSQUNUIH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJkaXNwX29yIiB9LAorCisgICAgeyAicm90YXRlIiwgIlNldCByb3RhdGlvbiBpbiBkaXNwbGF5IG9yaWVudGF0aW9uIFNFSSAoYW50aWNsb2Nrd2lzZSBhbmdsZSBpbiBkZWdyZWVzKSIsCisgICAgICAgIE9GRlNFVChyb3RhdGUpLCBBVl9PUFRfVFlQRV9ET1VCTEUsCisgICAgICAgIHsgLmRibCA9IE5BTiB9LCAtMzYwLjAsICszNjAuMCwgRkxBR1MgfSwKKyAgICB7ICJmbGlwIiwgIlNldCBmbGlwIGluIGRpc3BsYXkgb3JpZW50YXRpb24gU0VJIiwKKyAgICAgICAgT0ZGU0VUKGZsaXApLCBBVl9PUFRfVFlQRV9GTEFHUywKKyAgICAgICAgeyAuaTY0ID0gMCB9LCAwLCBGTElQX0hPUklaT05UQUwgfCBGTElQX1ZFUlRJQ0FMLCBGTEFHUywgImZsaXAiIH0sCisgICAgeyAiaG9yaXpvbnRhbCIsICJTZXQgaG9yX2ZsaXAiLAorICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwKKyAgICAgICAgeyAuaTY0ID0gRkxJUF9IT1JJWk9OVEFMIH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmbGlwIiB9LAorICAgIHsgInZlcnRpY2FsIiwgICAiU2V0IHZlcl9mbGlwIiwKKyAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsCisgICAgICAgIHsgLmk2NCA9IEZMSVBfVkVSVElDQUwgfSwgICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZmxpcCIgfSwKKworICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBoMjY0X21ldGFkYXRhX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImgyNjRfbWV0YWRhdGFfYnNmIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gaDI2NF9tZXRhZGF0YV9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZDb2RlY0lEIGgyNjRfbWV0YWRhdGFfY29kZWNfaWRzW10gPSB7CisgICAgQVZfQ09ERUNfSURfSDI2NCwgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX2gyNjRfbWV0YWRhdGFfYnNmID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjY0X21ldGFkYXRhIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSDI2NE1ldGFkYXRhQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgID0gJmgyNjRfbWV0YWRhdGFfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gJmgyNjRfbWV0YWRhdGFfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSAmaDI2NF9tZXRhZGF0YV9jbG9zZSwKKyAgICAuZmlsdGVyICAgICAgICAgPSAmaDI2NF9tZXRhZGF0YV9maWx0ZXIsCisgICAgLmNvZGVjX2lkcyAgICAgID0gaDI2NF9tZXRhZGF0YV9jb2RlY19pZHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X21wNHRvYW5uZXhiX2JzZi5jIGIvbGliYXZjb2RlYy9oMjY0X21wNHRvYW5uZXhiX2JzZi5jCmluZGV4IDJkNDQ3ZjcuLjI5MmQxMDYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NF9tcDR0b2FubmV4Yl9ic2YuYworKysgYi9saWJhdmNvZGVjL2gyNjRfbXA0dG9hbm5leGJfYnNmLmMKQEAgLTIzLDcgKzIzLDkgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAKIHR5cGVkZWYgc3RydWN0IEgyNjRCU0ZDb250ZXh0IHsKICAgICBpbnQzMl90ICBzcHNfb2Zmc2V0OwpAQCAtMzMsNjYgKzM1LDUzIEBACiAgICAgdWludDhfdCAgaWRyX3Nwc19zZWVuOwogICAgIHVpbnQ4X3QgIGlkcl9wcHNfc2VlbjsKICAgICBpbnQgICAgICBleHRyYWRhdGFfcGFyc2VkOwotCi0gICAgLyogV2hlbiBwcml2YXRlX3Nwc3BwcyBpcyB6ZXJvIHRoZW4gc3BzcHBzX2J1ZiBwb2ludHMgdG8gZ2xvYmFsIGV4dHJhZGF0YQotICAgICAgIGFuZCBic2YgZG9lcyByZXBsYWNlIGEgZ2xvYmFsIGV4dHJhZGF0YSB0byBvd24tYWxsb2NhdGVkIHZlcnNpb24gKGRlZmF1bHQKLSAgICAgICBiZWhhdmlvdXIpLgotICAgICAgIFdoZW4gcHJpdmF0ZV9zcHNwcHMgaXMgbm9uLXplcm8gdGhlIGJzZiB1c2VzIGEgcHJpdmF0ZSB2ZXJzaW9uIG9mIHNwc3BwcyBidWYuCi0gICAgICAgVGhpcyBtb2RlIG5lY2Vzc2FyeSB3aGVuIGJzZiB1c2VzIGluIGRlY29kZXIsIGVsc2UgYnNmIGhhcyBpc3N1ZXMgYWZ0ZXIKLSAgICAgICBkZWNvZGVyIHJlLWluaXRpYWxpemF0aW9uLiBVc2UgdGhlICJwcml2YXRlX3Nwc3Bwc19idWYiIGFyZ3VtZW50IHRvCi0gICAgICAgYWN0aXZhdGUgdGhpcyBtb2RlLgotICAgICAqLwotICAgIGludCAgICAgIHByaXZhdGVfc3BzcHBzOwotICAgIHVpbnQ4X3QgKnNwc3Bwc19idWY7Ci0gICAgdWludDMyX3Qgc3BzcHBzX3NpemU7CiB9IEgyNjRCU0ZDb250ZXh0OwogCi1zdGF0aWMgaW50IGFsbG9jX2FuZF9jb3B5KHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKK3N0YXRpYyBpbnQgYWxsb2NfYW5kX2NvcHkoQVZQYWNrZXQgKm91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3BzX3BwcywgdWludDMyX3Qgc3BzX3Bwc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbiwgdWludDMyX3QgaW5fc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4sIHVpbnQzMl90IGluX3NpemUsIGludCBwcykKIHsKLSAgICB1aW50MzJfdCBvZmZzZXQgICAgICAgICA9ICpwb3V0YnVmX3NpemU7Ci0gICAgdWludDhfdCBuYWxfaGVhZGVyX3NpemUgPSBvZmZzZXQgPyAzIDogNDsKKyAgICB1aW50MzJfdCBvZmZzZXQgICAgICAgICA9IG91dC0+c2l6ZTsKKyAgICB1aW50OF90IHN0YXJ0X2NvZGVfc2l6ZSA9IG9mZnNldCA9PSAwIHx8IHBzID8gNCA6IDM7CiAgICAgaW50IGVycjsKIAotICAgICpwb3V0YnVmX3NpemUgKz0gc3BzX3Bwc19zaXplICsgaW5fc2l6ZSArIG5hbF9oZWFkZXJfc2l6ZTsKLSAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKHBvdXRidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAqcG91dGJ1Zl9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpIDwgMCkgewotICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICBlcnIgPSBhdl9ncm93X3BhY2tldChvdXQsIHNwc19wcHNfc2l6ZSArIGluX3NpemUgKyBzdGFydF9jb2RlX3NpemUpOworICAgIGlmIChlcnIgPCAwKQogICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KKwogICAgIGlmIChzcHNfcHBzKQotICAgICAgICBtZW1jcHkoKnBvdXRidWYgKyBvZmZzZXQsIHNwc19wcHMsIHNwc19wcHNfc2l6ZSk7Ci0gICAgbWVtY3B5KCpwb3V0YnVmICsgc3BzX3Bwc19zaXplICsgbmFsX2hlYWRlcl9zaXplICsgb2Zmc2V0LCBpbiwgaW5fc2l6ZSk7Ci0gICAgaWYgKCFvZmZzZXQpIHsKLSAgICAgICAgQVZfV0IzMigqcG91dGJ1ZiArIHNwc19wcHNfc2l6ZSwgMSk7CisgICAgICAgIG1lbWNweShvdXQtPmRhdGEgKyBvZmZzZXQsIHNwc19wcHMsIHNwc19wcHNfc2l6ZSk7CisgICAgbWVtY3B5KG91dC0+ZGF0YSArIHNwc19wcHNfc2l6ZSArIHN0YXJ0X2NvZGVfc2l6ZSArIG9mZnNldCwgaW4sIGluX3NpemUpOworICAgIGlmIChzdGFydF9jb2RlX3NpemUgPT0gNCkgeworICAgICAgICBBVl9XQjMyKG91dC0+ZGF0YSArIG9mZnNldCArIHNwc19wcHNfc2l6ZSwgMSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgKCpwb3V0YnVmICsgb2Zmc2V0ICsgc3BzX3Bwc19zaXplKVswXSA9Ci0gICAgICAgICgqcG91dGJ1ZiArIG9mZnNldCArIHNwc19wcHNfc2l6ZSlbMV0gPSAwOwotICAgICAgICAoKnBvdXRidWYgKyBvZmZzZXQgKyBzcHNfcHBzX3NpemUpWzJdID0gMTsKKyAgICAgICAgKG91dC0+ZGF0YSArIG9mZnNldCArIHNwc19wcHNfc2l6ZSlbMF0gPQorICAgICAgICAob3V0LT5kYXRhICsgb2Zmc2V0ICsgc3BzX3Bwc19zaXplKVsxXSA9IDA7CisgICAgICAgIChvdXQtPmRhdGEgKyBvZmZzZXQgKyBzcHNfcHBzX3NpemUpWzJdID0gMTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoMjY0X2V4dHJhZGF0YV90b19hbm5leGIoSDI2NEJTRkNvbnRleHQgKmN0eCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBpbnQgcGFkZGluZykKK3N0YXRpYyBpbnQgaDI2NF9leHRyYWRhdGFfdG9fYW5uZXhiKEFWQlNGQ29udGV4dCAqY3R4LCBjb25zdCBpbnQgcGFkZGluZykKIHsKKyAgICBIMjY0QlNGQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOwogICAgIHVpbnQxNl90IHVuaXRfc2l6ZTsKICAgICB1aW50NjRfdCB0b3RhbF9zaXplICAgICAgICAgICAgICAgICA9IDA7CiAgICAgdWludDhfdCAqb3V0ICAgICAgICAgICAgICAgICAgICAgICAgPSBOVUxMLCB1bml0X25iLCBzcHNfZG9uZSA9IDAsCiAgICAgICAgICAgICAgc3BzX3NlZW4gICAgICAgICAgICAgICAgICAgPSAwLCBwcHNfc2VlbiA9IDA7Ci0gICAgY29uc3QgdWludDhfdCAqZXh0cmFkYXRhICAgICAgICAgICAgPSBhdmN0eC0+ZXh0cmFkYXRhICsgNDsKKyAgICBjb25zdCB1aW50OF90ICpleHRyYWRhdGEgICAgICAgICAgICA9IGN0eC0+cGFyX2luLT5leHRyYWRhdGEgKyA0OwogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG5hbHVfaGVhZGVyWzRdID0geyAwLCAwLCAwLCAxIH07CiAgICAgaW50IGxlbmd0aF9zaXplID0gKCpleHRyYWRhdGErKyAmIDB4MykgKyAxOyAvLyByZXRyaWV2ZSBsZW5ndGggY29kZWQgc2l6ZQogCi0gICAgY3R4LT5zcHNfb2Zmc2V0ID0gY3R4LT5wcHNfb2Zmc2V0ID0gLTE7CisgICAgcy0+c3BzX29mZnNldCA9IHMtPnBwc19vZmZzZXQgPSAtMTsKIAogICAgIC8qIHJldHJpZXZlIHNwcyBhbmQgcHBzIHVuaXQocykgKi8KICAgICB1bml0X25iID0gKmV4dHJhZGF0YSsrICYgMHgxZjsgLyogbnVtYmVyIG9mIHNwcyB1bml0KHMpICovCiAgICAgaWYgKCF1bml0X25iKSB7CiAgICAgICAgIGdvdG8gcHBzOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGN0eC0+c3BzX29mZnNldCA9IDA7CisgICAgICAgIHMtPnNwc19vZmZzZXQgPSAwOwogICAgICAgICBzcHNfc2VlbiA9IDE7CiAgICAgfQogCkBAIC0xMDIsMTMgKzkxLDEzIEBACiAgICAgICAgIHVuaXRfc2l6ZSAgID0gQVZfUkIxNihleHRyYWRhdGEpOwogICAgICAgICB0b3RhbF9zaXplICs9IHVuaXRfc2l6ZSArIDQ7CiAgICAgICAgIGlmICh0b3RhbF9zaXplID4gSU5UX01BWCAtIHBhZGRpbmcpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJUb28gYmlnIGV4dHJhZGF0YSBzaXplLCBjb3JydXB0ZWQgc3RyZWFtIG9yIGludmFsaWQgTVA0L0FWQ0MgYml0c3RyZWFtXG4iKTsKICAgICAgICAgICAgIGF2X2ZyZWUob3V0KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhZGF0YSArIDIgKyB1bml0X3NpemUgPiBhdmN0eC0+ZXh0cmFkYXRhICsgYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBoZWFkZXIgaXMgbm90IGNvbnRhaW5lZCBpbiBnbG9iYWwgZXh0cmFkYXRhLCAiCisgICAgICAgIGlmIChleHRyYWRhdGEgKyAyICsgdW5pdF9zaXplID4gY3R4LT5wYXJfaW4tPmV4dHJhZGF0YSArIGN0eC0+cGFyX2luLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGhlYWRlciBpcyBub3QgY29udGFpbmVkIGluIGdsb2JhbCBleHRyYWRhdGEsICIKICAgICAgICAgICAgICAgICAgICAiY29ycnVwdGVkIHN0cmVhbSBvciBpbnZhbGlkIE1QNC9BVkNDIGJpdHN0cmVhbVxuIik7CiAgICAgICAgICAgICBhdl9mcmVlKG91dCk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwpAQCAtMTIyLDcgKzExMSw3IEBACiAgICAgICAgIGlmICghdW5pdF9uYiAmJiAhc3BzX2RvbmUrKykgewogICAgICAgICAgICAgdW5pdF9uYiA9ICpleHRyYWRhdGErKzsgLyogbnVtYmVyIG9mIHBwcyB1bml0KHMpICovCiAgICAgICAgICAgICBpZiAodW5pdF9uYikgewotICAgICAgICAgICAgICAgIGN0eC0+cHBzX29mZnNldCA9IHRvdGFsX3NpemU7CisgICAgICAgICAgICAgICAgcy0+cHBzX29mZnNldCA9IHRvdGFsX3NpemU7CiAgICAgICAgICAgICAgICAgcHBzX3NlZW4gPSAxOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMzIsOTMgKzEyMSwxMDkgQEAKICAgICAgICAgbWVtc2V0KG91dCArIHRvdGFsX3NpemUsIDAsIHBhZGRpbmcpOwogCiAgICAgaWYgKCFzcHNfc2VlbikKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAiV2FybmluZzogU1BTIE5BTFUgbWlzc2luZyBvciBpbnZhbGlkLiAiCiAgICAgICAgICAgICAgICAiVGhlIHJlc3VsdGluZyBzdHJlYW0gbWF5IG5vdCBwbGF5LlxuIik7CiAKICAgICBpZiAoIXBwc19zZWVuKQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICJXYXJuaW5nOiBQUFMgTkFMVSBtaXNzaW5nIG9yIGludmFsaWQuICIKICAgICAgICAgICAgICAgICJUaGUgcmVzdWx0aW5nIHN0cmVhbSBtYXkgbm90IHBsYXkuXG4iKTsKIAotICAgIGlmICghY3R4LT5wcml2YXRlX3Nwc3BwcykgewotICAgICAgICBhdl9mcmVlKGF2Y3R4LT5leHRyYWRhdGEpOwotICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhICAgICAgPSBvdXQ7Ci0gICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHRvdGFsX3NpemU7Ci0gICAgfQotICAgIGN0eC0+c3BzcHBzX2J1ZiAgPSBvdXQ7Ci0gICAgY3R4LT5zcHNwcHNfc2l6ZSA9IHRvdGFsX3NpemU7CisgICAgYXZfZnJlZXAoJmN0eC0+cGFyX291dC0+ZXh0cmFkYXRhKTsKKyAgICBjdHgtPnBhcl9vdXQtPmV4dHJhZGF0YSAgICAgID0gb3V0OworICAgIGN0eC0+cGFyX291dC0+ZXh0cmFkYXRhX3NpemUgPSB0b3RhbF9zaXplOwogCiAgICAgcmV0dXJuIGxlbmd0aF9zaXplOwogfQogCi1zdGF0aWMgaW50IGgyNjRfbXA0dG9hbm5leGJfZmlsdGVyKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5ZnJhbWUpCitzdGF0aWMgaW50IGgyNjRfbXA0dG9hbm5leGJfaW5pdChBVkJTRkNvbnRleHQgKmN0eCkKIHsKLSAgICBIMjY0QlNGQ29udGV4dCAqY3R4ID0gYnNmYy0+cHJpdl9kYXRhOwotICAgIGludCBpOworICAgIEgyNjRCU0ZDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGV4dHJhX3NpemUgPSBjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhX3NpemU7CisgICAgaW50IHJldDsKKworICAgIC8qIHJldHJpZXZlIHNwcyBhbmQgcHBzIE5BTCB1bml0cyBmcm9tIGV4dHJhZGF0YSAqLworICAgIGlmICghZXh0cmFfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKGV4dHJhX3NpemUgPj0gMyAmJiBBVl9SQjI0KGN0eC0+cGFyX2luLT5leHRyYWRhdGEpID09IDEpIHx8CisgICAgICAgIChleHRyYV9zaXplID49IDQgJiYgQVZfUkIzMihjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhKSA9PSAxKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICJUaGUgaW5wdXQgbG9va3MgbGlrZSBpdCBpcyBBbm5leCBCIGFscmVhZHlcbiIpOworICAgIH0gZWxzZSBpZiAoZXh0cmFfc2l6ZSA+PSA2KSB7CisgICAgICAgIHJldCA9IGgyNjRfZXh0cmFkYXRhX3RvX2FubmV4YihjdHgsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcy0+bGVuZ3RoX3NpemUgICAgICA9IHJldDsKKyAgICAgICAgcy0+bmV3X2lkciAgICAgICAgICA9IDE7CisgICAgICAgIHMtPmlkcl9zcHNfc2VlbiAgICAgPSAwOworICAgICAgICBzLT5pZHJfcHBzX3NlZW4gICAgID0gMDsKKyAgICAgICAgcy0+ZXh0cmFkYXRhX3BhcnNlZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBleHRyYWRhdGEgc2l6ZTogJWRcbiIsIGV4dHJhX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoMjY0X21wNHRvYW5uZXhiX2ZpbHRlcihBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKm91dCkKK3sKKyAgICBIMjY0QlNGQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgQVZQYWNrZXQgKmluOwogICAgIHVpbnQ4X3QgdW5pdF90eXBlOwogICAgIGludDMyX3QgbmFsX3NpemU7CiAgICAgdWludDMyX3QgY3VtdWxfc2l6ZSAgICA9IDA7Ci0gICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOwotICAgIGludCByZXQgPSAwOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKyAgICBjb25zdCB1aW50OF90ICpidWZfZW5kOworICAgIGludCAgICAgICAgICAgIGJ1Zl9zaXplOworICAgIGludCByZXQgPSAwLCBpOworCisgICAgcmV0ID0gZmZfYnNmX2dldF9wYWNrZXQoY3R4LCAmaW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgLyogbm90aGluZyB0byBmaWx0ZXIgKi8KLSAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEgfHwgYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgNikgewotICAgICAgICAqcG91dGJ1ZiAgICAgID0gKHVpbnQ4X3QgKilidWY7Ci0gICAgICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICBpZiAoIXMtPmV4dHJhZGF0YV9wYXJzZWQpIHsKKyAgICAgICAgYXZfcGFja2V0X21vdmVfcmVmKG91dCwgaW4pOworICAgICAgICBhdl9wYWNrZXRfZnJlZSgmaW4pOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICAvKiByZXRyaWV2ZSBzcHMgYW5kIHBwcyBOQUwgdW5pdHMgZnJvbSBleHRyYWRhdGEgKi8KLSAgICBpZiAoIWN0eC0+ZXh0cmFkYXRhX3BhcnNlZCkgewotICAgICAgICBpZiAoYXJncyAmJiBzdHJzdHIoYXJncywgInByaXZhdGVfc3BzcHBzX2J1ZiIpKQotICAgICAgICAgICAgY3R4LT5wcml2YXRlX3Nwc3BwcyA9IDE7CisgICAgYnVmICAgICAgPSBpbi0+ZGF0YTsKKyAgICBidWZfc2l6ZSA9IGluLT5zaXplOworICAgIGJ1Zl9lbmQgID0gaW4tPmRhdGEgKyBpbi0+c2l6ZTsKIAotICAgICAgICByZXQgPSBoMjY0X2V4dHJhZGF0YV90b19hbm5leGIoY3R4LCBhdmN0eCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgY3R4LT5sZW5ndGhfc2l6ZSAgICAgID0gcmV0OwotICAgICAgICBjdHgtPm5ld19pZHIgICAgICAgICAgPSAxOwotICAgICAgICBjdHgtPmlkcl9zcHNfc2VlbiAgICAgPSAwOwotICAgICAgICBjdHgtPmlkcl9wcHNfc2VlbiAgICAgPSAwOwotICAgICAgICBjdHgtPmV4dHJhZGF0YV9wYXJzZWQgPSAxOwotICAgIH0KLQotICAgICpwb3V0YnVmX3NpemUgPSAwOwotICAgICpwb3V0YnVmICAgICAgPSBOVUxMOwogICAgIGRvIHsKICAgICAgICAgcmV0PSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIGlmIChidWYgKyBjdHgtPmxlbmd0aF9zaXplID4gYnVmX2VuZCkKKyAgICAgICAgaWYgKGJ1ZiArIHMtPmxlbmd0aF9zaXplID4gYnVmX2VuZCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKIAotICAgICAgICBmb3IgKG5hbF9zaXplID0gMCwgaSA9IDA7IGk8Y3R4LT5sZW5ndGhfc2l6ZTsgaSsrKQorICAgICAgICBmb3IgKG5hbF9zaXplID0gMCwgaSA9IDA7IGk8cy0+bGVuZ3RoX3NpemU7IGkrKykKICAgICAgICAgICAgIG5hbF9zaXplID0gKG5hbF9zaXplIDw8IDgpIHwgYnVmW2ldOwogCi0gICAgICAgIGJ1ZiAgICAgICs9IGN0eC0+bGVuZ3RoX3NpemU7CisgICAgICAgIGJ1ZiArPSBzLT5sZW5ndGhfc2l6ZTsKICAgICAgICAgdW5pdF90eXBlID0gKmJ1ZiAmIDB4MWY7CiAKICAgICAgICAgaWYgKG5hbF9zaXplID4gYnVmX2VuZCAtIGJ1ZiB8fCBuYWxfc2l6ZSA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAKICAgICAgICAgaWYgKHVuaXRfdHlwZSA9PSA3KQotICAgICAgICAgICAgY3R4LT5pZHJfc3BzX3NlZW4gPSBjdHgtPm5ld19pZHIgPSAxOworICAgICAgICAgICAgcy0+aWRyX3Nwc19zZWVuID0gcy0+bmV3X2lkciA9IDE7CiAgICAgICAgIGVsc2UgaWYgKHVuaXRfdHlwZSA9PSA4KSB7Ci0gICAgICAgICAgICBjdHgtPmlkcl9wcHNfc2VlbiA9IGN0eC0+bmV3X2lkciA9IDE7CisgICAgICAgICAgICBzLT5pZHJfcHBzX3NlZW4gPSBzLT5uZXdfaWRyID0gMTsKICAgICAgICAgICAgIC8qIGlmIFNQUyBoYXMgbm90IGJlZW4gc2VlbiB5ZXQsIHByZXBlbmQgdGhlIEFWQ0Mgb25lIHRvIFBQUyAqLwotICAgICAgICAgICAgaWYgKCFjdHgtPmlkcl9zcHNfc2VlbikgewotICAgICAgICAgICAgICAgIGlmIChjdHgtPnNwc19vZmZzZXQgPT0gLTEpCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJTUFMgbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgbm9yIGluIEFWQ0MsIHN0cmVhbSBtYXkgYmUgdW5yZWFkYWJsZVxuIik7CisgICAgICAgICAgICBpZiAoIXMtPmlkcl9zcHNfc2VlbikgeworICAgICAgICAgICAgICAgIGlmIChzLT5zcHNfb2Zmc2V0ID09IC0xKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlNQUyBub3QgcHJlc2VudCBpbiB0aGUgc3RyZWFtLCBub3IgaW4gQVZDQywgc3RyZWFtIG1heSBiZSB1bnJlYWRhYmxlXG4iKTsKICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBhbGxvY19hbmRfY29weShwb3V0YnVmLCBwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c3BzcHBzX2J1ZiArIGN0eC0+c3BzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wcHNfb2Zmc2V0ICE9IC0xID8gY3R4LT5wcHNfb2Zmc2V0IDogY3R4LT5zcHNwcHNfc2l6ZSAtIGN0eC0+c3BzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBuYWxfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBhbGxvY19hbmRfY29weShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGFyX291dC0+ZXh0cmFkYXRhICsgcy0+c3BzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHBzX29mZnNldCAhPSAtMSA/IHMtPnBwc19vZmZzZXQgOiBjdHgtPnBhcl9vdXQtPmV4dHJhZGF0YV9zaXplIC0gcy0+c3BzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBuYWxfc2l6ZSwgMSkpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5pZHJfc3BzX3NlZW4gPSAxOworICAgICAgICAgICAgICAgICAgICBzLT5pZHJfc3BzX3NlZW4gPSAxOwogICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHRfbmFsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIyNyw2MSArMjMyLDYxIEBACiAgICAgICAgIC8qIGlmIHRoaXMgaXMgYSBuZXcgSURSIHBpY3R1cmUgZm9sbG93aW5nIGFuIElEUiBwaWN0dXJlLCByZXNldCB0aGUgaWRyIGZsYWcuCiAgICAgICAgICAqIEp1c3QgY2hlY2sgZmlyc3RfbWJfaW5fc2xpY2UgdG8gYmUgMCBhcyB0aGlzIGlzIHRoZSBzaW1wbGVzdCBzb2x1dGlvbi4KICAgICAgICAgICogVGhpcyBjb3VsZCBiZSBjaGVja2luZyBpZHJfcGljX2lkIGluc3RlYWQsIGJ1dCB3b3VsZCBjb21wbGV4aWZ5IHRoZSBwYXJzaW5nLiAqLwotICAgICAgICBpZiAoIWN0eC0+bmV3X2lkciAmJiB1bml0X3R5cGUgPT0gNSAmJiAoYnVmWzFdICYgMHg4MCkpCi0gICAgICAgICAgICBjdHgtPm5ld19pZHIgPSAxOworICAgICAgICBpZiAoIXMtPm5ld19pZHIgJiYgdW5pdF90eXBlID09IDUgJiYgKGJ1ZlsxXSAmIDB4ODApKQorICAgICAgICAgICAgcy0+bmV3X2lkciA9IDE7CiAKICAgICAgICAgLyogcHJlcGVuZCBvbmx5IHRvIHRoZSBmaXJzdCB0eXBlIDUgTkFMIHVuaXQgb2YgYW4gSURSIHBpY3R1cmUsIGlmIG5vIHNwcy9wcHMgYXJlIGFscmVhZHkgcHJlc2VudCAqLwotICAgICAgICBpZiAoY3R4LT5uZXdfaWRyICYmIHVuaXRfdHlwZSA9PSA1ICYmICFjdHgtPmlkcl9zcHNfc2VlbiAmJiAhY3R4LT5pZHJfcHBzX3NlZW4pIHsKLSAgICAgICAgICAgIGlmICgocmV0PWFsbG9jX2FuZF9jb3B5KHBvdXRidWYsIHBvdXRidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnNwc3Bwc19idWYsIGN0eC0+c3BzcHBzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBuYWxfc2l6ZSkpIDwgMCkKKyAgICAgICAgaWYgKHMtPm5ld19pZHIgJiYgdW5pdF90eXBlID09IDUgJiYgIXMtPmlkcl9zcHNfc2VlbiAmJiAhcy0+aWRyX3Bwc19zZWVuKSB7CisgICAgICAgICAgICBpZiAoKHJldD1hbGxvY19hbmRfY29weShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wYXJfb3V0LT5leHRyYWRhdGEsIGN0eC0+cGFyX291dC0+ZXh0cmFkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBuYWxfc2l6ZSwgMSkpIDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICBjdHgtPm5ld19pZHIgPSAwOworICAgICAgICAgICAgcy0+bmV3X2lkciA9IDA7CiAgICAgICAgIC8qIGlmIG9ubHkgU1BTIGhhcyBiZWVuIHNlZW4sIGFsc28gaW5zZXJ0IFBQUyAqLwotICAgICAgICB9IGVsc2UgaWYgKGN0eC0+bmV3X2lkciAmJiB1bml0X3R5cGUgPT0gNSAmJiBjdHgtPmlkcl9zcHNfc2VlbiAmJiAhY3R4LT5pZHJfcHBzX3NlZW4pIHsKLSAgICAgICAgICAgIGlmIChjdHgtPnBwc19vZmZzZXQgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUFBTIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIG5vciBpbiBBVkNDLCBzdHJlYW0gbWF5IGJlIHVucmVhZGFibGVcbiIpOwotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYWxsb2NfYW5kX2NvcHkocG91dGJ1ZiwgcG91dGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIGJ1ZiwgbmFsX3NpemUpKSA8IDApCisgICAgICAgIH0gZWxzZSBpZiAocy0+bmV3X2lkciAmJiB1bml0X3R5cGUgPT0gNSAmJiBzLT5pZHJfc3BzX3NlZW4gJiYgIXMtPmlkcl9wcHNfc2VlbikgeworICAgICAgICAgICAgaWYgKHMtPnBwc19vZmZzZXQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlBQUyBub3QgcHJlc2VudCBpbiB0aGUgc3RyZWFtLCBub3IgaW4gQVZDQywgc3RyZWFtIG1heSBiZSB1bnJlYWRhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGFsbG9jX2FuZF9jb3B5KG91dCwgTlVMTCwgMCwgYnVmLCBuYWxfc2l6ZSwgMCkpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfSBlbHNlIGlmICgocmV0ID0gYWxsb2NfYW5kX2NvcHkocG91dGJ1ZiwgcG91dGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c3BzcHBzX2J1ZiArIGN0eC0+cHBzX29mZnNldCwgY3R4LT5zcHNwcHNfc2l6ZSAtIGN0eC0+cHBzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIG5hbF9zaXplKSkgPCAwKQorICAgICAgICAgICAgfSBlbHNlIGlmICgocmV0ID0gYWxsb2NfYW5kX2NvcHkob3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+cGFyX291dC0+ZXh0cmFkYXRhICsgcy0+cHBzX29mZnNldCwgY3R4LT5wYXJfb3V0LT5leHRyYWRhdGFfc2l6ZSAtIHMtPnBwc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBuYWxfc2l6ZSwgMSkpIDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKHJldD1hbGxvY19hbmRfY29weShwb3V0YnVmLCBwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgYnVmLCBuYWxfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIGlmICgocmV0PWFsbG9jX2FuZF9jb3B5KG91dCwgTlVMTCwgMCwgYnVmLCBuYWxfc2l6ZSwgdW5pdF90eXBlID09IDcgfHwgdW5pdF90eXBlID09IDgpKSA8IDApCiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgaWYgKCFjdHgtPm5ld19pZHIgJiYgdW5pdF90eXBlID09IDEpIHsKLSAgICAgICAgICAgICAgICBjdHgtPm5ld19pZHIgPSAxOwotICAgICAgICAgICAgICAgIGN0eC0+aWRyX3Nwc19zZWVuID0gMDsKLSAgICAgICAgICAgICAgICBjdHgtPmlkcl9wcHNfc2VlbiA9IDA7CisgICAgICAgICAgICBpZiAoIXMtPm5ld19pZHIgJiYgdW5pdF90eXBlID09IDEpIHsKKyAgICAgICAgICAgICAgICBzLT5uZXdfaWRyID0gMTsKKyAgICAgICAgICAgICAgICBzLT5pZHJfc3BzX3NlZW4gPSAwOworICAgICAgICAgICAgICAgIHMtPmlkcl9wcHNfc2VlbiA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogbmV4dF9uYWw6CiAgICAgICAgIGJ1ZiAgICAgICAgKz0gbmFsX3NpemU7Ci0gICAgICAgIGN1bXVsX3NpemUgKz0gbmFsX3NpemUgKyBjdHgtPmxlbmd0aF9zaXplOworICAgICAgICBjdW11bF9zaXplICs9IG5hbF9zaXplICsgcy0+bGVuZ3RoX3NpemU7CiAgICAgfSB3aGlsZSAoY3VtdWxfc2l6ZSA8IGJ1Zl9zaXplKTsKIAotICAgIHJldHVybiAxOworICAgIHJldCA9IGF2X3BhY2tldF9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CiAKIGZhaWw6Ci0gICAgYXZfZnJlZXAocG91dGJ1Zik7Ci0gICAgKnBvdXRidWZfc2l6ZSA9IDA7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBoMjY0X21wNHRvYW5uZXhiX2ZpbHRlcl9jbG9zZShBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMpCi17Ci0gICAgSDI2NEJTRkNvbnRleHQgKmN0eCA9IGJzZmMtPnByaXZfZGF0YTsKLSAgICBpZiAoY3R4LT5wcml2YXRlX3Nwc3BwcykKLSAgICAgICAgYXZfZnJlZXAoJmN0eC0+c3BzcHBzX2J1Zik7Ci19CitzdGF0aWMgY29uc3QgZW51bSBBVkNvZGVjSUQgY29kZWNfaWRzW10gPSB7CisgICAgQVZfQ09ERUNfSURfSDI2NCwgQVZfQ09ERUNfSURfTk9ORSwKK307CiAKLUFWQml0U3RyZWFtRmlsdGVyIGZmX2gyNjRfbXA0dG9hbm5leGJfYnNmID0geworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfaDI2NF9tcDR0b2FubmV4Yl9ic2YgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfbXA0dG9hbm5leGIiLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihIMjY0QlNGQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gaDI2NF9tcDR0b2FubmV4Yl9pbml0LAogICAgIC5maWx0ZXIgICAgICAgICA9IGgyNjRfbXA0dG9hbm5leGJfZmlsdGVyLAotICAgIC5jbG9zZSAgICAgICAgICA9IGgyNjRfbXA0dG9hbm5leGJfZmlsdGVyX2Nsb3NlLAorICAgIC5jb2RlY19pZHMgICAgICA9IGNvZGVjX2lkcywKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjRfbXZwcmVkLmggYi9saWJhdmNvZGVjL2gyNjRfbXZwcmVkLmgKaW5kZXggNzYzNzQ2Yy4uYmYzOTVlMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjY0X212cHJlZC5oCisrKyBiL2xpYmF2Y29kZWMvaDI2NF9tdnByZWQuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBtb3Rpb24gdmVjdG9yIHByZWRpY2lvbgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gbW90aW9uIHZlY3RvciBwcmVkaWN0aW9uCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCkBAIC0yMSw3ICsyMSw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIG1vdGlvbiB2ZWN0b3IgcHJlZGljaW9uLgorICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwIG1vdGlvbiB2ZWN0b3IgcHJlZGljdGlvbi4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCkBAIC0zMCw3ICszMCw3IEBACiAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiaDI2NGRlYy5oIgogI2luY2x1ZGUgIm1wZWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogCkBAIC02OCw3ICs2OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoTUJfRklFTEQoc2wpICYmICFJU19JTlRFUkxBQ0VEKHNsLT5sZWZ0X3R5cGVbMF0pKSB7CiAgICAgICAgICAgICAgICAgLy8gbGVmdCBzaGlmdCB3aWxsIHR1cm4gTElTVF9OT1RfVVNFRCBpbnRvIFBBUlRfTk9UX0FWQUlMQUJMRSwgYnV0IHRoYXQncyBPSy4KLSAgICAgICAgICAgICAgICBTRVRfRElBR19NVigvIDIsIDw8IDEsIHNsLT5sZWZ0X21iX3h5W2kgPj0gMzZdLCAoKGkgPj4gMikpICYgMyk7CisgICAgICAgICAgICAgICAgU0VUX0RJQUdfTVYoLyAyLCAqMiwgc2wtPmxlZnRfbWJfeHlbaSA+PSAzNl0sICgoaSA+PiAyKSkgJiAzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogI3VuZGVmIFNFVF9ESUFHX01WCkBAIC0yNDgsNyArMjQ4LDcgQEAKICAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKHR5cGUpKSB7ICAgICAgICAgIFwKICAgICAgICAgICAgICAgICByZWZuID4+PSAxOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBBVl9DT1BZMzIobXZidWZbaWR4XSwgbXZuKTsgICAgIFwKLSAgICAgICAgICAgICAgICBtdmJ1ZltpZHhdWzFdIDw8PSAxOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtdmJ1ZltpZHhdWzFdICo9IDI7ICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICBtdm4gPSBtdmJ1ZltpZHhdOyAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQ2NCw3ICs0NjQsNyBAQAogCiAgICAgaWYgKCFJU19TS0lQKG1iX3R5cGUpKSB7CiAgICAgICAgIGlmIChJU19JTlRSQShtYl90eXBlKSkgewotICAgICAgICAgICAgaW50IHR5cGVfbWFzayA9IGgtPnBwcy5jb25zdHJhaW5lZF9pbnRyYV9wcmVkID8gSVNfSU5UUkEoLTEpIDogLTE7CisgICAgICAgICAgICBpbnQgdHlwZV9tYXNrID0gaC0+cHMucHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkID8gSVNfSU5UUkEoLTEpIDogLTE7CiAgICAgICAgICAgICBzbC0+dG9wbGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAgICAgPQogICAgICAgICAgICAgICAgIHNsLT50b3Bfc2FtcGxlc19hdmFpbGFibGUgICAgID0KICAgICAgICAgICAgICAgICAgICAgc2wtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgPSAweEZGRkY7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjRfcGFyc2UuYyBiL2xpYmF2Y29kZWMvaDI2NF9wYXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZTViM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2gyNjRfcGFyc2UuYwpAQCAtMCwwICsxLDUyOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkZWMuaCIKKyNpbmNsdWRlICJoMjY0X3BhcnNlLmgiCisjaW5jbHVkZSAiaDI2NF9wcy5oIgorCitpbnQgZmZfaDI2NF9wcmVkX3dlaWdodF90YWJsZShHZXRCaXRDb250ZXh0ICpnYiwgY29uc3QgU1BTICpzcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKnJlZl9jb3VudCwgaW50IHNsaWNlX3R5cGVfbm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFByZWRXZWlnaHRUYWJsZSAqcHd0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlLCB2b2lkICpsb2djdHgpCit7CisgICAgaW50IGxpc3QsIGksIGo7CisgICAgaW50IGx1bWFfZGVmLCBjaHJvbWFfZGVmOworCisgICAgcHd0LT51c2Vfd2VpZ2h0ICAgICAgICAgICAgID0gMDsKKyAgICBwd3QtPnVzZV93ZWlnaHRfY2hyb21hICAgICAgPSAwOworCisgICAgcHd0LT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gZ2V0X3VlX2dvbG9tYihnYik7CisgICAgaWYgKHB3dC0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbSA+IDdVKSB7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgImx1bWFfbG9nMl93ZWlnaHRfZGVub20gJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCBwd3QtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20pOworICAgICAgICBwd3QtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gPSAwOworICAgIH0KKyAgICBsdW1hX2RlZiA9IDEgPDwgcHd0LT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tOworCisgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMpIHsKKyAgICAgICAgcHd0LT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gPSBnZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgaWYgKHB3dC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tID4gN1UpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgImNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSAlZCBpcyBvdXQgb2YgcmFuZ2VcbiIsIHB3dC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKKyAgICAgICAgICAgIHB3dC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gMDsKKyAgICAgICAgfQorICAgICAgICBjaHJvbWFfZGVmID0gMSA8PCBwd3QtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICB9CisKKyAgICBmb3IgKGxpc3QgPSAwOyBsaXN0IDwgMjsgbGlzdCsrKSB7CisgICAgICAgIHB3dC0+bHVtYV93ZWlnaHRfZmxhZ1tsaXN0XSAgID0gMDsKKyAgICAgICAgcHd0LT5jaHJvbWFfd2VpZ2h0X2ZsYWdbbGlzdF0gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmVmX2NvdW50W2xpc3RdOyBpKyspIHsKKyAgICAgICAgICAgIGludCBsdW1hX3dlaWdodF9mbGFnLCBjaHJvbWFfd2VpZ2h0X2ZsYWc7CisKKyAgICAgICAgICAgIGx1bWFfd2VpZ2h0X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgaWYgKGx1bWFfd2VpZ2h0X2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBwd3QtPmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzBdID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgcHd0LT5sdW1hX3dlaWdodFtpXVtsaXN0XVsxXSA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIGlmICgoaW50OF90KXB3dC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMF0gIT0gcHd0LT5sdW1hX3dlaWdodFtpXVtsaXN0XVswXSB8fAorICAgICAgICAgICAgICAgICAgICAoaW50OF90KXB3dC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMV0gIT0gcHd0LT5sdW1hX3dlaWdodFtpXVtsaXN0XVsxXSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBvdXRfcmFuZ2Vfd2VpZ2h0OworICAgICAgICAgICAgICAgIGlmIChwd3QtPmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzBdICE9IGx1bWFfZGVmIHx8CisgICAgICAgICAgICAgICAgICAgIHB3dC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMV0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBwd3QtPnVzZV93ZWlnaHQgICAgICAgICAgICAgPSAxOworICAgICAgICAgICAgICAgICAgICBwd3QtPmx1bWFfd2VpZ2h0X2ZsYWdbbGlzdF0gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHd0LT5sdW1hX3dlaWdodFtpXVtsaXN0XVswXSA9IGx1bWFfZGVmOworICAgICAgICAgICAgICAgIHB3dC0+bHVtYV93ZWlnaHRbaV1bbGlzdF1bMV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYykgeworICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgaWYgKGNocm9tYV93ZWlnaHRfZmxhZykgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHd0LT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzBdID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgICAgICAgICBwd3QtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMV0gPSBnZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaW50OF90KXB3dC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVswXSAhPSBwd3QtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMF0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50OF90KXB3dC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVsxXSAhPSBwd3QtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd3QtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMF0gPSBjaHJvbWFfZGVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3dC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBvdXRfcmFuZ2Vfd2VpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB3dC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVswXSAhPSBjaHJvbWFfZGVmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHd0LT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzFdICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwd3QtPnVzZV93ZWlnaHRfY2hyb21hICAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHd0LT5jaHJvbWFfd2VpZ2h0X2ZsYWdbbGlzdF0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3dC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVswXSA9IGNocm9tYV9kZWY7CisgICAgICAgICAgICAgICAgICAgICAgICBwd3QtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBmb3IgTUJBRkYKKyAgICAgICAgICAgIGlmIChwaWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7CisgICAgICAgICAgICAgICAgcHd0LT5sdW1hX3dlaWdodFsxNiArIDIgKiBpXVtsaXN0XVswXSA9IHB3dC0+bHVtYV93ZWlnaHRbMTYgKyAyICogaSArIDFdW2xpc3RdWzBdID0gcHd0LT5sdW1hX3dlaWdodFtpXVtsaXN0XVswXTsKKyAgICAgICAgICAgICAgICBwd3QtPmx1bWFfd2VpZ2h0WzE2ICsgMiAqIGldW2xpc3RdWzFdID0gcHd0LT5sdW1hX3dlaWdodFsxNiArIDIgKiBpICsgMV1bbGlzdF1bMV0gPSBwd3QtPmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzFdOworICAgICAgICAgICAgICAgIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB3dC0+Y2hyb21hX3dlaWdodFsxNiArIDIgKiBpXVtsaXN0XVtqXVswXSA9IHB3dC0+Y2hyb21hX3dlaWdodFsxNiArIDIgKiBpICsgMV1bbGlzdF1bal1bMF0gPSBwd3QtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBwd3QtPmNocm9tYV93ZWlnaHRbMTYgKyAyICogaV1bbGlzdF1bal1bMV0gPSBwd3QtPmNocm9tYV93ZWlnaHRbMTYgKyAyICogaSArIDFdW2xpc3RdW2pdWzFdID0gcHd0LT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwd3QtPnVzZV93ZWlnaHQgPSBwd3QtPnVzZV93ZWlnaHQgfHwgcHd0LT51c2Vfd2VpZ2h0X2Nocm9tYTsKKyAgICByZXR1cm4gMDsKK291dF9yYW5nZV93ZWlnaHQ6CisgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGxvZ2N0eCwgIk91dCBvZiByYW5nZSB3ZWlnaHRcbiIpOworICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworfQorCisvKioKKyAqIENoZWNrIGlmIHRoZSB0b3AgJiBsZWZ0IGJsb2NrcyBhcmUgYXZhaWxhYmxlIGlmIG5lZWRlZCBhbmQKKyAqIGNoYW5nZSB0aGUgZGMgbW9kZSBzbyBpdCBvbmx5IHVzZXMgdGhlIGF2YWlsYWJsZSBibG9ja3MuCisgKi8KK2ludCBmZl9oMjY0X2NoZWNrX2ludHJhNHg0X3ByZWRfbW9kZShpbnQ4X3QgKnByZWRfbW9kZV9jYWNoZSwgdm9pZCAqbG9nY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3Bfc2FtcGxlc19hdmFpbGFibGUsIGludCBsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgdG9wWzEyXSA9IHsKKyAgICAgICAgLTEsIDAsIExFRlRfRENfUFJFRCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAwCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50OF90IGxlZnRbMTJdID0geworICAgICAgICAwLCAtMSwgVE9QX0RDX1BSRUQsIDAsIC0xLCAtMSwgLTEsIDAsIC0xLCBEQ18xMjhfUFJFRAorICAgIH07CisgICAgaW50IGk7CisKKyAgICBpZiAoISh0b3Bfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwMDApKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIGludCBzdGF0dXMgPSB0b3BbcHJlZF9tb2RlX2NhY2hlW3NjYW44WzBdICsgaV1dOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJ0b3AgYmxvY2sgdW5hdmFpbGFibGUgZm9yIHJlcXVlc3RlZCBpbnRyYSBtb2RlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBwcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyBpXSA9IHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgobGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAmIDB4ODg4OCkgIT0gMHg4ODg4KSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgbWFza1s0XSA9IHsgMHg4MDAwLCAweDIwMDAsIDB4ODAsIDB4MjAgfTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIGlmICghKGxlZnRfc2FtcGxlc19hdmFpbGFibGUgJiBtYXNrW2ldKSkgeworICAgICAgICAgICAgICAgIGludCBzdGF0dXMgPSBsZWZ0W3ByZWRfbW9kZV9jYWNoZVtzY2FuOFswXSArIDggKiBpXV07CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxlZnQgYmxvY2sgdW5hdmFpbGFibGUgZm9yIHJlcXVlc3RlZCBpbnRyYTR4NCBtb2RlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZF9tb2RlX2NhY2hlW3NjYW44WzBdICsgOCAqIGldID0gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBDaGVjayBpZiB0aGUgdG9wICYgbGVmdCBibG9ja3MgYXJlIGF2YWlsYWJsZSBpZiBuZWVkZWQgYW5kCisgKiBjaGFuZ2UgdGhlIGRjIG1vZGUgc28gaXQgb25seSB1c2VzIHRoZSBhdmFpbGFibGUgYmxvY2tzLgorICovCitpbnQgZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUodm9pZCAqbG9nY3R4LCBpbnQgdG9wX3NhbXBsZXNfYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlLCBpbnQgaXNfY2hyb21hKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgdG9wWzRdICA9IHsgTEVGVF9EQ19QUkVEOHg4LCAxLCAtMSwgLTEgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50OF90IGxlZnRbNV0gPSB7IFRPUF9EQ19QUkVEOHg4LCAtMSwgIDIsIC0xLCBEQ18xMjhfUFJFRDh4OCB9OworCisgICAgaWYgKG1vZGUgPiAzVSkgeworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIGludHJhIGNocm9tYSBwcmVkIG1vZGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoISh0b3Bfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwMDApKSB7CisgICAgICAgIG1vZGUgPSB0b3BbbW9kZV07CisgICAgICAgIGlmIChtb2RlIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJ0b3AgYmxvY2sgdW5hdmFpbGFibGUgZm9yIHJlcXVlc3RlZCBpbnRyYSBtb2RlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICYgMHg4MDgwKSAhPSAweDgwODApIHsKKyAgICAgICAgbW9kZSA9IGxlZnRbbW9kZV07CisgICAgICAgIGlmIChtb2RlIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJsZWZ0IGJsb2NrIHVuYXZhaWxhYmxlIGZvciByZXF1ZXN0ZWQgaW50cmEgbW9kZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNfY2hyb21hICYmIChsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlICYgMHg4MDgwKSkgeworICAgICAgICAgICAgLy8gbWFkIGNvdyBkaXNlYXNlIG1vZGUsIGFrYSBNQkFGRiArIGNvbnN0cmFpbmVkX2ludHJhX3ByZWQKKyAgICAgICAgICAgIG1vZGUgPSBBTFpIRUlNRVJfRENfTDBUX1BSRUQ4eDggKworICAgICAgICAgICAgICAgICAgICghKGxlZnRfc2FtcGxlc19hdmFpbGFibGUgJiAweDgwMDApKSArCisgICAgICAgICAgICAgICAgICAgMiAqIChtb2RlID09IERDXzEyOF9QUkVEOHg4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtb2RlOworfQorCitpbnQgZmZfaDI2NF9wYXJzZV9yZWZfY291bnQoaW50ICpwbGlzdF9jb3VudCwgaW50IHJlZl9jb3VudFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwgY29uc3QgUFBTICpwcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsaWNlX3R5cGVfbm9zLCBpbnQgcGljdHVyZV9zdHJ1Y3R1cmUsIHZvaWQgKmxvZ2N0eCkKK3sKKyAgICBpbnQgbGlzdF9jb3VudDsKKyAgICBpbnQgbnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWc7CisKKyAgICAvLyBzZXQgZGVmYXVsdHMsIG1pZ2h0IGJlIG92ZXJyaWRkZW4gYSBmZXcgbGluZXMgbGF0ZXIKKyAgICByZWZfY291bnRbMF0gPSBwcHMtPnJlZl9jb3VudFswXTsKKyAgICByZWZfY291bnRbMV0gPSBwcHMtPnJlZl9jb3VudFsxXTsKKworICAgIGlmIChzbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICB1bnNpZ25lZCBtYXhbMl07CisgICAgICAgIG1heFswXSA9IG1heFsxXSA9IHBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUgPyAxNSA6IDMxOworCisgICAgICAgIG51bV9yZWZfaWR4X2FjdGl2ZV9vdmVycmlkZV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBpZiAobnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcpIHsKKyAgICAgICAgICAgIHJlZl9jb3VudFswXSA9IGdldF91ZV9nb2xvbWIoZ2IpICsgMTsKKyAgICAgICAgICAgIGlmIChzbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikgeworICAgICAgICAgICAgICAgIHJlZl9jb3VudFsxXSA9IGdldF91ZV9nb2xvbWIoZ2IpICsgMTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIC8vIGZ1bGwgcmFuZ2UgaXMgc3BlYy1vayBpbiB0aGlzIGNhc2UsIGV2ZW4gZm9yIGZyYW1lcworICAgICAgICAgICAgICAgIHJlZl9jb3VudFsxXSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVmX2NvdW50WzBdIC0gMSA+IG1heFswXSB8fCByZWZfY291bnRbMV0gLSAxID4gbWF4WzFdKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJyZWZlcmVuY2Ugb3ZlcmZsb3cgJXUgPiAldSBvciAldSA+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgIHJlZl9jb3VudFswXSAtIDEsIG1heFswXSwgcmVmX2NvdW50WzFdIC0gMSwgbWF4WzFdKTsKKyAgICAgICAgICAgIHJlZl9jb3VudFswXSA9IHJlZl9jb3VudFsxXSA9IDA7CisgICAgICAgICAgICAqcGxpc3RfY291bnQgPSAwOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgbGlzdF9jb3VudCA9IDI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpc3RfY291bnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGxpc3RfY291bnQgICA9IDA7CisgICAgICAgIHJlZl9jb3VudFswXSA9IHJlZl9jb3VudFsxXSA9IDA7CisgICAgfQorCisgICAgKnBsaXN0X2NvdW50ID0gbGlzdF9jb3VudDsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICAqcGxpc3RfY291bnQgPSAwOworICAgIHJlZl9jb3VudFswXSA9IDA7CisgICAgcmVmX2NvdW50WzFdID0gMDsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworaW50IGZmX2gyNjRfaW5pdF9wb2MoaW50IHBpY19maWVsZF9wb2NbMl0sIGludCAqcGljX3BvYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQUyAqc3BzLCBIMjY0UE9DQ29udGV4dCAqcGMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdHVyZV9zdHJ1Y3R1cmUsIGludCBuYWxfcmVmX2lkYykKK3sKKyAgICBjb25zdCBpbnQgbWF4X2ZyYW1lX251bSA9IDEgPDwgc3BzLT5sb2cyX21heF9mcmFtZV9udW07CisgICAgaW50NjRfdCBmaWVsZF9wb2NbMl07CisKKyAgICBwYy0+ZnJhbWVfbnVtX29mZnNldCA9IHBjLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQ7CisgICAgaWYgKHBjLT5mcmFtZV9udW0gPCBwYy0+cHJldl9mcmFtZV9udW0pCisgICAgICAgIHBjLT5mcmFtZV9udW1fb2Zmc2V0ICs9IG1heF9mcmFtZV9udW07CisKKyAgICBpZiAoc3BzLT5wb2NfdHlwZSA9PSAwKSB7CisgICAgICAgIGNvbnN0IGludCBtYXhfcG9jX2xzYiA9IDEgPDwgc3BzLT5sb2cyX21heF9wb2NfbHNiOworCisgICAgICAgIGlmIChwYy0+cG9jX2xzYiA8IHBjLT5wcmV2X3BvY19sc2IgJiYKKyAgICAgICAgICAgIHBjLT5wcmV2X3BvY19sc2IgLSBwYy0+cG9jX2xzYiA+PSBtYXhfcG9jX2xzYiAvIDIpCisgICAgICAgICAgICBwYy0+cG9jX21zYiA9IHBjLT5wcmV2X3BvY19tc2IgKyBtYXhfcG9jX2xzYjsKKyAgICAgICAgZWxzZSBpZiAocGMtPnBvY19sc2IgPiBwYy0+cHJldl9wb2NfbHNiICYmCisgICAgICAgICAgICAgICAgIHBjLT5wcmV2X3BvY19sc2IgLSBwYy0+cG9jX2xzYiA8IC1tYXhfcG9jX2xzYiAvIDIpCisgICAgICAgICAgICBwYy0+cG9jX21zYiA9IHBjLT5wcmV2X3BvY19tc2IgLSBtYXhfcG9jX2xzYjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGMtPnBvY19tc2IgPSBwYy0+cHJldl9wb2NfbXNiOworICAgICAgICBmaWVsZF9wb2NbMF0gPQorICAgICAgICBmaWVsZF9wb2NbMV0gPSBwYy0+cG9jX21zYiArIHBjLT5wb2NfbHNiOworICAgICAgICBpZiAocGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkKKyAgICAgICAgICAgIGZpZWxkX3BvY1sxXSArPSBwYy0+ZGVsdGFfcG9jX2JvdHRvbTsKKyAgICB9IGVsc2UgaWYgKHNwcy0+cG9jX3R5cGUgPT0gMSkgeworICAgICAgICBpbnQgYWJzX2ZyYW1lX251bSwgZXhwZWN0ZWRfZGVsdGFfcGVyX3BvY19jeWNsZSwgZXhwZWN0ZWRwb2M7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmIChzcHMtPnBvY19jeWNsZV9sZW5ndGggIT0gMCkKKyAgICAgICAgICAgIGFic19mcmFtZV9udW0gPSBwYy0+ZnJhbWVfbnVtX29mZnNldCArIHBjLT5mcmFtZV9udW07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGFic19mcmFtZV9udW0gPSAwOworCisgICAgICAgIGlmIChuYWxfcmVmX2lkYyA9PSAwICYmIGFic19mcmFtZV9udW0gPiAwKQorICAgICAgICAgICAgYWJzX2ZyYW1lX251bS0tOworCisgICAgICAgIGV4cGVjdGVkX2RlbHRhX3Blcl9wb2NfY3ljbGUgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BzLT5wb2NfY3ljbGVfbGVuZ3RoOyBpKyspCisgICAgICAgICAgICAvLyBGSVhNRSBpbnRlZ3JhdGUgZHVyaW5nIHNwcyBwYXJzZQorICAgICAgICAgICAgZXhwZWN0ZWRfZGVsdGFfcGVyX3BvY19jeWNsZSArPSBzcHMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldOworCisgICAgICAgIGlmIChhYnNfZnJhbWVfbnVtID4gMCkgeworICAgICAgICAgICAgaW50IHBvY19jeWNsZV9jbnQgICAgICAgICAgPSAoYWJzX2ZyYW1lX251bSAtIDEpIC8gc3BzLT5wb2NfY3ljbGVfbGVuZ3RoOworICAgICAgICAgICAgaW50IGZyYW1lX251bV9pbl9wb2NfY3ljbGUgPSAoYWJzX2ZyYW1lX251bSAtIDEpICUgc3BzLT5wb2NfY3ljbGVfbGVuZ3RoOworCisgICAgICAgICAgICBleHBlY3RlZHBvYyA9IHBvY19jeWNsZV9jbnQgKiBleHBlY3RlZF9kZWx0YV9wZXJfcG9jX2N5Y2xlOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBmcmFtZV9udW1faW5fcG9jX2N5Y2xlOyBpKyspCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRwb2MgPSBleHBlY3RlZHBvYyArIHNwcy0+b2Zmc2V0X2Zvcl9yZWZfZnJhbWVbaV07CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZXhwZWN0ZWRwb2MgPSAwOworCisgICAgICAgIGlmIChuYWxfcmVmX2lkYyA9PSAwKQorICAgICAgICAgICAgZXhwZWN0ZWRwb2MgPSBleHBlY3RlZHBvYyArIHNwcy0+b2Zmc2V0X2Zvcl9ub25fcmVmX3BpYzsKKworICAgICAgICBmaWVsZF9wb2NbMF0gPSBleHBlY3RlZHBvYyArIHBjLT5kZWx0YV9wb2NbMF07CisgICAgICAgIGZpZWxkX3BvY1sxXSA9IGZpZWxkX3BvY1swXSArIHNwcy0+b2Zmc2V0X2Zvcl90b3BfdG9fYm90dG9tX2ZpZWxkOworCisgICAgICAgIGlmIChwaWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKQorICAgICAgICAgICAgZmllbGRfcG9jWzFdICs9IHBjLT5kZWx0YV9wb2NbMV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHBvYyA9IDIgKiAocGMtPmZyYW1lX251bV9vZmZzZXQgKyBwYy0+ZnJhbWVfbnVtKTsKKworICAgICAgICBpZiAoIW5hbF9yZWZfaWRjKQorICAgICAgICAgICAgcG9jLS07CisKKyAgICAgICAgZmllbGRfcG9jWzBdID0gcG9jOworICAgICAgICBmaWVsZF9wb2NbMV0gPSBwb2M7CisgICAgfQorCisgICAgaWYgKCAgIGZpZWxkX3BvY1swXSAhPSAoaW50KWZpZWxkX3BvY1swXQorICAgICAgICB8fCBmaWVsZF9wb2NbMV0gIT0gKGludClmaWVsZF9wb2NbMV0pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKHBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfQk9UVE9NX0ZJRUxEKQorICAgICAgICBwaWNfZmllbGRfcG9jWzBdID0gZmllbGRfcG9jWzBdOworICAgIGlmIChwaWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX1RPUF9GSUVMRCkKKyAgICAgICAgcGljX2ZpZWxkX3BvY1sxXSA9IGZpZWxkX3BvY1sxXTsKKyAgICAqcGljX3BvYyA9IEZGTUlOKHBpY19maWVsZF9wb2NbMF0sIHBpY19maWVsZF9wb2NbMV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2V4dHJhZGF0YV9wcyhjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSwgSDI2NFBhcmFtU2V0cyAqcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2F2Yywgdm9pZCAqbG9nY3R4KQoreworICAgIEgyNjQ1UGFja2V0IHBrdCA9IHsgMCB9OworICAgIGludCBpLCByZXQgPSAwOworCisgICAgcmV0ID0gZmZfaDI2NDVfcGFja2V0X3NwbGl0KCZwa3QsIGRhdGEsIHNpemUsIGxvZ2N0eCwgaXNfYXZjLCAyLCBBVl9DT0RFQ19JRF9IMjY0LCAxKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBrdC5uYl9uYWxzOyBpKyspIHsKKyAgICAgICAgSDI2NDVOQUwgKm5hbCA9ICZwa3QubmFsc1tpXTsKKyAgICAgICAgc3dpdGNoIChuYWwtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBIMjY0X05BTF9TUFM6CisgICAgICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9zZXFfcGFyYW1ldGVyX3NldCgmbmFsLT5nYiwgbG9nY3R4LCBwcywgMCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjY0X05BTF9QUFM6CisgICAgICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9waWN0dXJlX3BhcmFtZXRlcl9zZXQoJm5hbC0+Z2IsIGxvZ2N0eCwgcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5zaXplX2JpdHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfVkVSQk9TRSwgIklnbm9yaW5nIE5BTCB0eXBlICVkIGluIGV4dHJhZGF0YVxuIiwKKyAgICAgICAgICAgICAgICAgICBuYWwtPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKK2ZhaWw6CisgICAgZmZfaDI2NDVfcGFja2V0X3VuaW5pdCgmcGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBUaGVyZSBhcmUgKGludmFsaWQpIHNhbXBsZXMgaW4gdGhlIHdpbGQgd2l0aCBtcDQtc3R5bGUgZXh0cmFkYXRhLCB3aGVyZSB0aGUKKyAqIHBhcmFtZXRlciBzZXRzIGFyZSBzdG9yZWQgdW5lc2NhcGVkIChpLmUuIGFzIFJCU1ApLgorICogVGhpcyBmdW5jdGlvbiBjYXRjaGVzIHRoZSBwYXJhbWV0ZXIgc2V0IGRlY29kaW5nIGZhaWx1cmUgYW5kIHRyaWVzIGFnYWluCisgKiBhZnRlciBlc2NhcGluZyBpdCAqLworc3RhdGljIGludCBkZWNvZGVfZXh0cmFkYXRhX3BzX21wNChjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgSDI2NFBhcmFtU2V0cyAqcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJfcmVjb2duaXRpb24sIHZvaWQgKmxvZ2N0eCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZGVjb2RlX2V4dHJhZGF0YV9wcyhidWYsIGJ1Zl9zaXplLCBwcywgMSwgbG9nY3R4KTsKKyAgICBpZiAocmV0IDwgMCAmJiAhKGVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKSB7CisgICAgICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKyAgICAgICAgUHV0Qnl0ZUNvbnRleHQgcGJjOworICAgICAgICB1aW50OF90ICplc2NhcGVkX2J1ZjsKKyAgICAgICAgaW50IGVzY2FwZWRfYnVmX3NpemU7CisKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiU1BTIGRlY29kaW5nIGZhaWx1cmUsIHRyeWluZyBhZ2FpbiBhZnRlciBlc2NhcGluZyB0aGUgTkFMXG4iKTsKKworICAgICAgICBpZiAoYnVmX3NpemUgLyAyID49IChJTlQxNl9NQVggLSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSAvIDMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworICAgICAgICBlc2NhcGVkX2J1Zl9zaXplID0gYnVmX3NpemUgKiAzIC8gMiArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkU7CisgICAgICAgIGVzY2FwZWRfYnVmID0gYXZfbWFsbG9jeihlc2NhcGVkX2J1Zl9zaXplKTsKKyAgICAgICAgaWYgKCFlc2NhcGVkX2J1ZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiYywgZXNjYXBlZF9idWYsIGVzY2FwZWRfYnVmX3NpemUpOworCisgICAgICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2JjKSkgeworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpID49IDMgJiYKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wZWVrX2JlMjQoJmdiYykgPD0gMykgeworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTI0KCZwYmMsIDMpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiYywgMik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2JjKSk7CisgICAgICAgIH0KKworICAgICAgICBlc2NhcGVkX2J1Zl9zaXplID0gYnl0ZXN0cmVhbTJfdGVsbF9wKCZwYmMpOworICAgICAgICBBVl9XQjE2KGVzY2FwZWRfYnVmLCBlc2NhcGVkX2J1Zl9zaXplIC0gMik7CisKKyAgICAgICAgKHZvaWQpZGVjb2RlX2V4dHJhZGF0YV9wcyhlc2NhcGVkX2J1ZiwgZXNjYXBlZF9idWZfc2l6ZSwgcHMsIDEsIGxvZ2N0eCk7CisgICAgICAgIC8vIGxvcmV4Lm1wNCBkZWNvZGVzIG9rIGV2ZW4gd2l0aCBleHRyYWRhdGEgZGVjb2RpbmcgZmFpbGluZworICAgICAgICBhdl9mcmVlcCgmZXNjYXBlZF9idWYpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfaDI2NF9kZWNvZGVfZXh0cmFkYXRhKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplLCBIMjY0UGFyYW1TZXRzICpwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppc19hdmMsIGludCAqbmFsX2xlbmd0aF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyX3JlY29nbml0aW9uLCB2b2lkICpsb2djdHgpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghZGF0YSB8fCBzaXplIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChkYXRhWzBdID09IDEpIHsKKyAgICAgICAgaW50IGksIGNudCwgbmFsc2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcCA9IGRhdGE7CisKKyAgICAgICAgKmlzX2F2YyA9IDE7CisKKyAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJhdmNDICVkIHRvbyBzaG9ydFxuIiwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlY29kZSBzcHMgZnJvbSBhdmNDCisgICAgICAgIGNudCA9ICoocCArIDUpICYgMHgxZjsgLy8gTnVtYmVyIG9mIHNwcworICAgICAgICBwICArPSA2OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKyAgICAgICAgICAgIG5hbHNpemUgPSBBVl9SQjE2KHApICsgMjsKKyAgICAgICAgICAgIGlmIChuYWxzaXplID4gc2l6ZSAtIChwIC0gZGF0YSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfZXh0cmFkYXRhX3BzX21wNChwLCBuYWxzaXplLCBwcywgZXJyX3JlY29nbml0aW9uLCBsb2djdHgpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJEZWNvZGluZyBzcHMgJWQgZnJvbSBhdmNDIGZhaWxlZFxuIiwgaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgKz0gbmFsc2l6ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBEZWNvZGUgcHBzIGZyb20gYXZjQworICAgICAgICBjbnQgPSAqKHArKyk7IC8vIE51bWJlciBvZiBwcHMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICBuYWxzaXplID0gQVZfUkIxNihwKSArIDI7CisgICAgICAgICAgICBpZiAobmFsc2l6ZSA+IHNpemUgLSAocCAtIGRhdGEpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2V4dHJhZGF0YV9wc19tcDQocCwgbmFsc2l6ZSwgcHMsIGVycl9yZWNvZ25pdGlvbiwgbG9nY3R4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRGVjb2RpbmcgcHBzICVkIGZyb20gYXZjQyBmYWlsZWRcbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwICs9IG5hbHNpemU7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3RvcmUgcmlnaHQgbmFsIGxlbmd0aCBzaXplIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIGFsbCBvdGhlciBuYWxzCisgICAgICAgICpuYWxfbGVuZ3RoX3NpemUgPSAoZGF0YVs0XSAmIDB4MDMpICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICAqaXNfYXZjID0gMDsKKyAgICAgICAgcmV0ID0gZGVjb2RlX2V4dHJhZGF0YV9wcyhkYXRhLCBzaXplLCBwcywgMCwgbG9nY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gc2l6ZTsKK30KKworLyoqCisgKiBDb21wdXRlIHByb2ZpbGUgZnJvbSBwcm9maWxlX2lkYyBhbmQgY29uc3RyYWludF9zZXQ/X2ZsYWdzLgorICoKKyAqIEBwYXJhbSBzcHMgU1BTCisgKgorICogQHJldHVybiBwcm9maWxlIGFzIGRlZmluZWQgYnkgRkZfUFJPRklMRV9IMjY0XyoKKyAqLworaW50IGZmX2gyNjRfZ2V0X3Byb2ZpbGUoY29uc3QgU1BTICpzcHMpCit7CisgICAgaW50IHByb2ZpbGUgPSBzcHMtPnByb2ZpbGVfaWRjOworCisgICAgc3dpdGNoIChzcHMtPnByb2ZpbGVfaWRjKSB7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfQkFTRUxJTkU6CisgICAgICAgIC8vIGNvbnN0cmFpbnRfc2V0MV9mbGFnIHNldCB0byAxCisgICAgICAgIHByb2ZpbGUgfD0gKHNwcy0+Y29uc3RyYWludF9zZXRfZmxhZ3MgJiAxIDw8IDEpID8gRkZfUFJPRklMRV9IMjY0X0NPTlNUUkFJTkVEIDogMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF8xMDoKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQyMjoKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFOgorICAgICAgICAvLyBjb25zdHJhaW50X3NldDNfZmxhZyBzZXQgdG8gMQorICAgICAgICBwcm9maWxlIHw9IChzcHMtPmNvbnN0cmFpbnRfc2V0X2ZsYWdzICYgMSA8PCAzKSA/IEZGX1BST0ZJTEVfSDI2NF9JTlRSQSA6IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBwcm9maWxlOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X3BhcnNlLmggYi9saWJhdmNvZGVjL2gyNjRfcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDAxNjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oMjY0X3BhcnNlLmgKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NCBkZWNvZGVyL3BhcnNlciBzaGFyZWQgY29kZQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IMjY0X1BBUlNFX0gKKyNkZWZpbmUgQVZDT0RFQ19IMjY0X1BBUlNFX0gKKworI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaDI2NF9wcy5oIgorCit0eXBlZGVmIHN0cnVjdCBIMjY0UHJlZFdlaWdodFRhYmxlIHsKKyAgICBpbnQgdXNlX3dlaWdodDsKKyAgICBpbnQgdXNlX3dlaWdodF9jaHJvbWE7CisgICAgaW50IGx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgaW50IGNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICBpbnQgbHVtYV93ZWlnaHRfZmxhZ1syXTsgICAgLy8vPCA3LjQuMy4yIGx1bWFfd2VpZ2h0X2xYX2ZsYWcKKyAgICBpbnQgY2hyb21hX3dlaWdodF9mbGFnWzJdOyAgLy8vPCA3LjQuMy4yIGNocm9tYV93ZWlnaHRfbFhfZmxhZworICAgIC8vIFRoZSBmb2xsb3dpbmcgMiBjYW4gYmUgY2hhbmdlZCB0byBpbnQ4X3QgYnV0IHRoYXQgY2F1c2VzIGEgMTAgQ1BVIGN5Y2xlcyBzcGVlZCBsb3NzCisgICAgaW50IGx1bWFfd2VpZ2h0WzQ4XVsyXVsyXTsKKyAgICBpbnQgY2hyb21hX3dlaWdodFs0OF1bMl1bMl1bMl07CisgICAgaW50IGltcGxpY2l0X3dlaWdodFs0OF1bNDhdWzJdOworfSBIMjY0UHJlZFdlaWdodFRhYmxlOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UE9DQ29udGV4dCB7CisgICAgaW50IHBvY19sc2I7CisgICAgaW50IHBvY19tc2I7CisgICAgaW50IGRlbHRhX3BvY19ib3R0b207CisgICAgaW50IGRlbHRhX3BvY1syXTsKKyAgICBpbnQgZnJhbWVfbnVtOworICAgIGludCBwcmV2X3BvY19tc2I7ICAgICAgICAgICAvLy88IHBvY19tc2Igb2YgdGhlIGxhc3QgcmVmZXJlbmNlIHBpYyBmb3IgUE9DIHR5cGUgMAorICAgIGludCBwcmV2X3BvY19sc2I7ICAgICAgICAgICAvLy88IHBvY19sc2Igb2YgdGhlIGxhc3QgcmVmZXJlbmNlIHBpYyBmb3IgUE9DIHR5cGUgMAorICAgIGludCBmcmFtZV9udW1fb2Zmc2V0OyAgICAgICAvLy88IGZvciBQT0MgdHlwZSAyCisgICAgaW50IHByZXZfZnJhbWVfbnVtX29mZnNldDsgIC8vLzwgZm9yIFBPQyB0eXBlIDIKKyAgICBpbnQgcHJldl9mcmFtZV9udW07ICAgICAgICAgLy8vPCBmcmFtZV9udW0gb2YgdGhlIGxhc3QgcGljIGZvciBQT0MgdHlwZSAxLzIKK30gSDI2NFBPQ0NvbnRleHQ7CisKK2ludCBmZl9oMjY0X3ByZWRfd2VpZ2h0X3RhYmxlKEdldEJpdENvbnRleHQgKmdiLCBjb25zdCBTUFMgKnNwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqcmVmX2NvdW50LCBpbnQgc2xpY2VfdHlwZV9ub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UHJlZFdlaWdodFRhYmxlICpwd3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdHVyZV9zdHJ1Y3R1cmUsIHZvaWQgKmxvZ2N0eCk7CisKKy8qKgorICogQ2hlY2sgaWYgdGhlIHRvcCAmIGxlZnQgYmxvY2tzIGFyZSBhdmFpbGFibGUgaWYgbmVlZGVkICYgY2hhbmdlIHRoZQorICogZGMgbW9kZSBzbyBpdCBvbmx5IHVzZXMgdGhlIGF2YWlsYWJsZSBibG9ja3MuCisgKi8KK2ludCBmZl9oMjY0X2NoZWNrX2ludHJhNHg0X3ByZWRfbW9kZShpbnQ4X3QgKnByZWRfbW9kZV9jYWNoZSwgdm9pZCAqbG9nY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3Bfc2FtcGxlc19hdmFpbGFibGUsIGludCBsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlKTsKKworLyoqCisgKiBDaGVjayBpZiB0aGUgdG9wICYgbGVmdCBibG9ja3MgYXJlIGF2YWlsYWJsZSBpZiBuZWVkZWQgJiBjaGFuZ2UgdGhlCisgKiBkYyBtb2RlIHNvIGl0IG9ubHkgdXNlcyB0aGUgYXZhaWxhYmxlIGJsb2Nrcy4KKyAqLworaW50IGZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlKHZvaWQgKmxvZ2N0eCwgaW50IHRvcF9zYW1wbGVzX2F2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdF9zYW1wbGVzX2F2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSwgaW50IGlzX2Nocm9tYSk7CisKK2ludCBmZl9oMjY0X3BhcnNlX3JlZl9jb3VudChpbnQgKnBsaXN0X2NvdW50LCBpbnQgcmVmX2NvdW50WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLCBjb25zdCBQUFMgKnBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xpY2VfdHlwZV9ub3MsIGludCBwaWN0dXJlX3N0cnVjdHVyZSwgdm9pZCAqbG9nY3R4KTsKKworaW50IGZmX2gyNjRfaW5pdF9wb2MoaW50IHBpY19maWVsZF9wb2NbMl0sIGludCAqcGljX3BvYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQUyAqc3BzLCBIMjY0UE9DQ29udGV4dCAqcG9jLAorICAgICAgICAgICAgICAgICAgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlLCBpbnQgbmFsX3JlZl9pZGMpOworCitpbnQgZmZfaDI2NF9kZWNvZGVfZXh0cmFkYXRhKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplLCBIMjY0UGFyYW1TZXRzICpwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppc19hdmMsIGludCAqbmFsX2xlbmd0aF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyX3JlY29nbml0aW9uLCB2b2lkICpsb2djdHgpOworCisvKioKKyAqIGNvbXB1dGUgcHJvZmlsZSBmcm9tIHNwcworICovCitpbnQgZmZfaDI2NF9nZXRfcHJvZmlsZShjb25zdCBTUFMgKnNwcyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0gyNjRfUEFSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X3BhcnNlci5jIGIvbGliYXZjb2RlYy9oMjY0X3BhcnNlci5jCmluZGV4IDEyZDYzOTcuLjVmOWE5YzQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NF9wYXJzZXIuYworKysgYi9saWJhdmNvZGVjL2gyNjRfcGFyc2VyLmMKQEAgLTIxLDUxICsyMSw3NCBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBwYXJzZXIuCisgKiBILjI2NCAvIEFWQyAvIE1QRUctNCBwYXJ0MTAgcGFyc2VyLgogICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICovCiAKICNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgMQogCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJwYXJzZXIuaCIKLSNpbmNsdWRlICJoMjY0ZGF0YS5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRfc2VpLmgiCisjaW5jbHVkZSAiaDI2NF9wcy5oIgorI2luY2x1ZGUgImgyNjRkYXRhLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgSDI2NFBhcnNlQ29udGV4dCB7Ci0gICAgSDI2NENvbnRleHQgaDsKICAgICBQYXJzZUNvbnRleHQgcGM7CisgICAgSDI2NFBhcmFtU2V0cyBwczsKKyAgICBIMjY0RFNQQ29udGV4dCBoMjY0ZHNwOworICAgIEgyNjRQT0NDb250ZXh0IHBvYzsKKyAgICBIMjY0U0VJQ29udGV4dCBzZWk7CisgICAgaW50IGlzX2F2YzsKKyAgICBpbnQgbmFsX2xlbmd0aF9zaXplOwogICAgIGludCBnb3RfZmlyc3Q7CisgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlOworICAgIHVpbnQ4X3QgcGFyc2VfaGlzdG9yeVs2XTsKKyAgICBpbnQgcGFyc2VfaGlzdG9yeV9jb3VudDsKKyAgICBpbnQgcGFyc2VfbGFzdF9tYjsKKyAgICBpbnQ2NF90IHJlZmVyZW5jZV9kdHM7CisgICAgaW50IGxhc3RfZnJhbWVfbnVtLCBsYXN0X3BpY3R1cmVfc3RydWN0dXJlOwogfSBIMjY0UGFyc2VDb250ZXh0OwogCiAKIHN0YXRpYyBpbnQgaDI2NF9maW5kX2ZyYW1lX2VuZChIMjY0UGFyc2VDb250ZXh0ICpwLCBjb25zdCB1aW50OF90ICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgdm9pZCAqbG9nY3R4KQogewotICAgIEgyNjRDb250ZXh0ICpoID0gJnAtPmg7CiAgICAgaW50IGksIGo7CiAgICAgdWludDMyX3Qgc3RhdGU7CiAgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZwLT5wYzsKIAotICAgIGludCBuZXh0X2F2Yz0gaC0+aXNfYXZjID8gMCA6IGJ1Zl9zaXplOworICAgIGludCBuZXh0X2F2YyA9IHAtPmlzX2F2YyA/IDAgOiBidWZfc2l6ZTsKIC8vICAgIG1iX2FkZHI9IHBjLT5tYl9hZGRyIC0gMTsKICAgICBzdGF0ZSA9IHBjLT5zdGF0ZTsKICAgICBpZiAoc3RhdGUgPiAxMykKICAgICAgICAgc3RhdGUgPSA3OwogCi0gICAgaWYgKGgtPmlzX2F2YyAmJiAhaC0+bmFsX2xlbmd0aF9zaXplKQotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkFWQy1wYXJzZXI6IG5hbCBsZW5ndGggc2l6ZSBpbnZhbGlkXG4iKTsKKyAgICBpZiAocC0+aXNfYXZjICYmICFwLT5uYWxfbGVuZ3RoX3NpemUpCisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgIkFWQy1wYXJzZXI6IG5hbCBsZW5ndGggc2l6ZSBpbnZhbGlkXG4iKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrKSB7CiAgICAgICAgIGlmIChpID49IG5leHRfYXZjKSB7CiAgICAgICAgICAgICBpbnQgbmFsc2l6ZSA9IDA7CiAgICAgICAgICAgICBpID0gbmV4dF9hdmM7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaC0+bmFsX2xlbmd0aF9zaXplOyBqKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcC0+bmFsX2xlbmd0aF9zaXplOyBqKyspCiAgICAgICAgICAgICAgICAgbmFsc2l6ZSA9IChuYWxzaXplIDw8IDgpIHwgYnVmW2krK107CiAgICAgICAgICAgICBpZiAobmFsc2l6ZSA8PSAwIHx8IG5hbHNpemUgPiBidWZfc2l6ZSAtIGkpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkFWQy1wYXJzZXI6IG5hbCBzaXplICVkIHJlbWFpbmluZyAlZFxuIiwgbmFsc2l6ZSwgYnVmX3NpemUgLSBpKTsKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJBVkMtcGFyc2VyOiBuYWwgc2l6ZSAlZCByZW1haW5pbmcgJWRcbiIsIG5hbHNpemUsIGJ1Zl9zaXplIC0gaSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV4dF9hdmMgPSBpICsgbmFsc2l6ZTsKQEAgLTczLDcgKzk2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGF0ZSA9PSA3KSB7Ci0gICAgICAgICAgICBpICs9IGgtPmgyNjRkc3Auc3RhcnRjb2RlX2ZpbmRfY2FuZGlkYXRlKGJ1ZiArIGksIG5leHRfYXZjIC0gaSk7CisgICAgICAgICAgICBpICs9IHAtPmgyNjRkc3Auc3RhcnRjb2RlX2ZpbmRfY2FuZGlkYXRlKGJ1ZiArIGksIG5leHRfYXZjIC0gaSk7CiAgICAgICAgICAgICBpZiAoaSA8IG5leHRfYXZjKQogICAgICAgICAgICAgICAgIHN0YXRlID0gMjsKICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA8PSAyKSB7CkBAIC04NSw4NCArMTA4LDkyIEBACiAgICAgICAgICAgICAgICAgc3RhdGUgPj49IDE7ICAgICAgICAgICAvLyAyLT4xLCAxLT4wLCAwLT4wCiAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPD0gNSkgewogICAgICAgICAgICAgaW50IG5hbHVfdHlwZSA9IGJ1ZltpXSAmIDB4MUY7Ci0gICAgICAgICAgICBpZiAobmFsdV90eXBlID09IE5BTF9TRUkgfHwgbmFsdV90eXBlID09IE5BTF9TUFMgfHwKLSAgICAgICAgICAgICAgICBuYWx1X3R5cGUgPT0gTkFMX1BQUyB8fCBuYWx1X3R5cGUgPT0gTkFMX0FVRCkgeworICAgICAgICAgICAgaWYgKG5hbHVfdHlwZSA9PSBIMjY0X05BTF9TRUkgfHwgbmFsdV90eXBlID09IEgyNjRfTkFMX1NQUyB8fAorICAgICAgICAgICAgICAgIG5hbHVfdHlwZSA9PSBIMjY0X05BTF9QUFMgfHwgbmFsdV90eXBlID09IEgyNjRfTkFMX0FVRCkgewogICAgICAgICAgICAgICAgIGlmIChwYy0+ZnJhbWVfc3RhcnRfZm91bmQpIHsKICAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGZvdW5kOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobmFsdV90eXBlID09IE5BTF9TTElDRSB8fCBuYWx1X3R5cGUgPT0gTkFMX0RQQSB8fAotICAgICAgICAgICAgICAgICAgICAgICBuYWx1X3R5cGUgPT0gTkFMX0lEUl9TTElDRSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChuYWx1X3R5cGUgPT0gSDI2NF9OQUxfU0xJQ0UgfHwgbmFsdV90eXBlID09IEgyNjRfTkFMX0RQQSB8fAorICAgICAgICAgICAgICAgICAgICAgICBuYWx1X3R5cGUgPT0gSDI2NF9OQUxfSURSX1NMSUNFKSB7CiAgICAgICAgICAgICAgICAgc3RhdGUgKz0gODsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0YXRlID0gNzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGgtPnBhcnNlX2hpc3RvcnlbaC0+cGFyc2VfaGlzdG9yeV9jb3VudCsrXT0gYnVmW2ldOwotICAgICAgICAgICAgaWYgKGgtPnBhcnNlX2hpc3RvcnlfY291bnQ+NSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYiwgbGFzdF9tYj0gaC0+cGFyc2VfbGFzdF9tYjsKLSAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0IGdiOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG1iLCBsYXN0X21iID0gcC0+cGFyc2VfbGFzdF9tYjsKKyAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgICAgICAgICBwLT5wYXJzZV9oaXN0b3J5W3AtPnBhcnNlX2hpc3RvcnlfY291bnQrK10gPSBidWZbaV07CiAKLSAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgaC0+cGFyc2VfaGlzdG9yeSwgOCpoLT5wYXJzZV9oaXN0b3J5X2NvdW50KTsKLSAgICAgICAgICAgICAgICBoLT5wYXJzZV9oaXN0b3J5X2NvdW50PTA7Ci0gICAgICAgICAgICAgICAgbWI9IGdldF91ZV9nb2xvbWJfbG9uZygmZ2IpOwotICAgICAgICAgICAgICAgIGgtPnBhcnNlX2xhc3RfbWI9IG1iOworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIHAtPnBhcnNlX2hpc3RvcnksIDgqcC0+cGFyc2VfaGlzdG9yeV9jb3VudCk7CisgICAgICAgICAgICBtYj0gZ2V0X3VlX2dvbG9tYl9sb25nKCZnYik7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpID4gMCB8fCBwLT5wYXJzZV9oaXN0b3J5X2NvdW50ID4gNSkgeworICAgICAgICAgICAgICAgIHAtPnBhcnNlX2xhc3RfbWIgPSBtYjsKICAgICAgICAgICAgICAgICBpZiAocGMtPmZyYW1lX3N0YXJ0X2ZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtYiA8PSBsYXN0X21iKQorICAgICAgICAgICAgICAgICAgICBpZiAobWIgPD0gbGFzdF9tYikgeworICAgICAgICAgICAgICAgICAgICAgICAgaSAtPSBwLT5wYXJzZV9oaXN0b3J5X2NvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBhcnNlX2hpc3RvcnlfY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSAxOworICAgICAgICAgICAgICAgIHAtPnBhcnNlX2hpc3RvcnlfY291bnQgPSAwOwogICAgICAgICAgICAgICAgIHN0YXRlID0gNzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBwYy0+c3RhdGUgPSBzdGF0ZTsKLSAgICBpZiAoaC0+aXNfYXZjKQorICAgIGlmIChwLT5pc19hdmMpCiAgICAgICAgIHJldHVybiBuZXh0X2F2YzsKICAgICByZXR1cm4gRU5EX05PVF9GT1VORDsKIAogZm91bmQ6CiAgICAgcGMtPnN0YXRlICAgICAgICAgICAgID0gNzsKICAgICBwYy0+ZnJhbWVfc3RhcnRfZm91bmQgPSAwOwotICAgIGlmIChoLT5pc19hdmMpCisgICAgaWYgKHAtPmlzX2F2YykKICAgICAgICAgcmV0dXJuIG5leHRfYXZjOwotICAgIHJldHVybiBpIC0gKHN0YXRlICYgNSkgLSA1ICogKHN0YXRlID4gNyk7CisgICAgcmV0dXJuIGkgLSAoc3RhdGUgJiA1KTsKIH0KIAotc3RhdGljIGludCBzY2FuX21tY29fcmVzZXQoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpCitzdGF0aWMgaW50IHNjYW5fbW1jb19yZXNldChBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpsb2djdHgpCiB7CisgICAgSDI2NFByZWRXZWlnaHRUYWJsZSBwd3Q7CisgICAgaW50IHNsaWNlX3R5cGVfbm9zID0gcy0+cGljdF90eXBlICYgMzsKICAgICBIMjY0UGFyc2VDb250ZXh0ICpwID0gcy0+cHJpdl9kYXRhOwotICAgIEgyNjRDb250ZXh0ICAgICAgKmggPSAmcC0+aDsKLSAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCA9ICZoLT5zbGljZV9jdHhbMF07CisgICAgaW50IGxpc3RfY291bnQsIHJlZl9jb3VudFsyXTsKIAotICAgIHNsLT5zbGljZV90eXBlX25vcyA9IHMtPnBpY3RfdHlwZSAmIDM7CiAKLSAgICBpZiAoaC0+cHBzLnJlZHVuZGFudF9waWNfY250X3ByZXNlbnQpCi0gICAgICAgIGdldF91ZV9nb2xvbWIoJnNsLT5nYik7IC8vIHJlZHVuZGFudF9waWNfY291bnQKKyAgICBpZiAocC0+cHMucHBzLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50KQorICAgICAgICBnZXRfdWVfZ29sb21iKGdiKTsgLy8gcmVkdW5kYW50X3BpY19jb3VudAogCi0gICAgaWYgKGZmX3NldF9yZWZfY291bnQoaCwgc2wpIDwgMCkKKyAgICBpZiAoc2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIGdldF9iaXRzMShnYik7IC8vIGRpcmVjdF9zcGF0aWFsX212X3ByZWQKKworICAgIGlmIChmZl9oMjY0X3BhcnNlX3JlZl9jb3VudCgmbGlzdF9jb3VudCwgcmVmX2NvdW50LCBnYiwgcC0+cHMucHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZV90eXBlX25vcywgcC0+cGljdHVyZV9zdHJ1Y3R1cmUsIGxvZ2N0eCkgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICBpZiAoc2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKICAgICAgICAgaW50IGxpc3Q7Ci0gICAgICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCBzbC0+bGlzdF9jb3VudDsgbGlzdCsrKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzbC0+Z2IpKSB7CisgICAgICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCBsaXN0X2NvdW50OyBsaXN0KyspIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CiAgICAgICAgICAgICAgICAgaW50IGluZGV4OwogICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyA7IGluZGV4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjID0gZ2V0X3VlX2dvbG9tYl8zMSgmc2wtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjID0gZ2V0X3VlX2dvbG9tYl8zMShnYik7CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjIDwgMykKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZygmc2wtPmdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlb3JkZXJpbmdfb2ZfcGljX251bXNfaWRjID4gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgcmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGMgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVvcmRlcmluZ19vZl9waWNfbnVtc19pZGMpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHNsLT5yZWZfY291bnRbbGlzdF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gcmVmX2NvdW50W2xpc3RdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSBjb3VudCAlZCBvdmVyZmxvd1xuIiwgaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE3MSwxNiArMjAyLDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKGgtPnBwcy53ZWlnaHRlZF9wcmVkICYmIHNsLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfUCkgfHwKLSAgICAgICAgKGgtPnBwcy53ZWlnaHRlZF9iaXByZWRfaWRjID09IDEgJiYgc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSkKLSAgICAgICAgZmZfcHJlZF93ZWlnaHRfdGFibGUoaCwgc2wpOworICAgIGlmICgocC0+cHMucHBzLT53ZWlnaHRlZF9wcmVkICYmIHNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB8fAorICAgICAgICAocC0+cHMucHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjID09IDEgJiYgc2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpKQorICAgICAgICBmZl9oMjY0X3ByZWRfd2VpZ2h0X3RhYmxlKGdiLCBwLT5wcy5zcHMsIHJlZl9jb3VudCwgc2xpY2VfdHlwZV9ub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB3dCwgcC0+cGljdHVyZV9zdHJ1Y3R1cmUsIGxvZ2N0eCk7CiAKLSAgICBpZiAoZ2V0X2JpdHMxKCZzbC0+Z2IpKSB7IC8vIGFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBhZGFwdGl2ZV9yZWZfcGljX21hcmtpbmdfbW9kZV9mbGFnCiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01NQ09fQ09VTlQ7IGkrKykgewotICAgICAgICAgICAgTU1DT09wY29kZSBvcGNvZGUgPSBnZXRfdWVfZ29sb21iXzMxKCZzbC0+Z2IpOworICAgICAgICAgICAgTU1DT09wY29kZSBvcGNvZGUgPSBnZXRfdWVfZ29sb21iXzMxKGdiKTsKICAgICAgICAgICAgIGlmIChvcGNvZGUgPiAodW5zaWduZWQpIE1NQ09fTE9ORykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC0xOTEsMTAgKzIyMywxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAxOwogCiAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE1NQ09fU0hPUlQyVU5VU0VEIHx8IG9wY29kZSA9PSBNTUNPX1NIT1JUMkxPTkcpCi0gICAgICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKCZzbC0+Z2IpOyAvLyBkaWZmZXJlbmNlX29mX3BpY19udW1zX21pbnVzMQorICAgICAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8vIGRpZmZlcmVuY2Vfb2ZfcGljX251bXNfbWludXMxCiAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE1NQ09fU0hPUlQyTE9ORyB8fCBvcGNvZGUgPT0gTU1DT19MT05HMlVOVVNFRCB8fAogICAgICAgICAgICAgICAgIG9wY29kZSA9PSBNTUNPX0xPTkcgfHwgb3Bjb2RlID09IE1NQ09fU0VUX01BWF9MT05HKQotICAgICAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfMzEoJnNsLT5nYik7CisgICAgICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYl8zMShnYik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxNCwzNSArMjQ2LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IGJ1ZiwgaW50IGJ1Zl9zaXplKQogewogICAgIEgyNjRQYXJzZUNvbnRleHQgKnAgPSBzLT5wcml2X2RhdGE7Ci0gICAgSDI2NENvbnRleHQgICAgICAqaCA9ICZwLT5oOwotICAgIEgyNjRTbGljZUNvbnRleHQgKnNsID0gJmgtPnNsaWNlX2N0eFswXTsKKyAgICBIMjY0NVJCU1AgcmJzcCA9IHsgTlVMTCB9OworICAgIEgyNjQ1TkFMIG5hbCA9IHsgTlVMTCB9OwogICAgIGludCBidWZfaW5kZXgsIG5leHRfYXZjOwogICAgIHVuc2lnbmVkIGludCBwcHNfaWQ7CiAgICAgdW5zaWduZWQgaW50IHNsaWNlX3R5cGU7CiAgICAgaW50IHN0YXRlID0gLTEsIGdvdF9yZXNldCA9IDA7Ci0gICAgY29uc3QgdWludDhfdCAqcHRyOwogICAgIGludCBxMjY0ID0gYnVmX3NpemUgPj00ICYmICFtZW1jbXAoIlEyNjQiLCBidWYsIDQpOwogICAgIGludCBmaWVsZF9wb2NbMl07CisgICAgaW50IHJldDsKIAogICAgIC8qIHNldCBzb21lIHNhbmUgZGVmYXVsdCB2YWx1ZXMgKi8KICAgICBzLT5waWN0X3R5cGUgICAgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOwogICAgIHMtPmtleV9mcmFtZSAgICAgICAgID0gMDsKICAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSA9IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX1VOS05PV047CiAKLSAgICBoLT5hdmN0eCA9IGF2Y3R4OwotICAgIGZmX2gyNjRfcmVzZXRfc2VpKGgpOwotICAgIGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9jYW5jZWxfZmxhZyA9IC0xOworICAgIGZmX2gyNjRfc2VpX3VuaW5pdCgmcC0+c2VpKTsKKyAgICBwLT5zZWkuZnJhbWVfcGFja2luZy5hcnJhbmdlbWVudF9jYW5jZWxfZmxhZyA9IC0xOwogCiAgICAgaWYgKCFidWZfc2l6ZSkKICAgICAgICAgcmV0dXJuIDA7CiAKKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJnJic3AucmJzcF9idWZmZXIsICZyYnNwLnJic3BfYnVmZmVyX2FsbG9jX3NpemUsIGJ1Zl9zaXplKTsKKyAgICBpZiAoIXJic3AucmJzcF9idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKICAgICBidWZfaW5kZXggICAgID0gMDsKLSAgICBuZXh0X2F2YyAgICAgID0gaC0+aXNfYXZjID8gMCA6IGJ1Zl9zaXplOworICAgIG5leHRfYXZjICAgICAgPSBwLT5pc19hdmMgPyAwIDogYnVmX3NpemU7CiAgICAgZm9yICg7OykgewotICAgICAgICBpbnQgc3JjX2xlbmd0aCwgZHN0X2xlbmd0aCwgY29uc3VtZWQsIG5hbHNpemUgPSAwOworICAgICAgICBjb25zdCBTUFMgKnNwczsKKyAgICAgICAgaW50IHNyY19sZW5ndGgsIGNvbnN1bWVkLCBuYWxzaXplID0gMDsKIAogICAgICAgICBpZiAoYnVmX2luZGV4ID49IG5leHRfYXZjKSB7Ci0gICAgICAgICAgICBuYWxzaXplID0gZ2V0X2F2Y19uYWxzaXplKGgsIGJ1ZiwgYnVmX3NpemUsICZidWZfaW5kZXgpOworICAgICAgICAgICAgbmFsc2l6ZSA9IGdldF9uYWxzaXplKHAtPm5hbF9sZW5ndGhfc2l6ZSwgYnVmLCBidWZfc2l6ZSwgJmJ1Zl9pbmRleCwgYXZjdHgpOwogICAgICAgICAgICAgaWYgKG5hbHNpemUgPCAwKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgbmV4dF9hdmMgPSBidWZfaW5kZXggKyBuYWxzaXplOwpAQCAtMjU3LDEwICsyOTMsMTAgQEAKIAogICAgICAgICBzdGF0ZSA9IGJ1ZltidWZfaW5kZXhdOwogICAgICAgICBzd2l0Y2ggKHN0YXRlICYgMHgxZikgewotICAgICAgICBjYXNlIE5BTF9TTElDRToKLSAgICAgICAgY2FzZSBOQUxfSURSX1NMSUNFOgorICAgICAgICBjYXNlIEgyNjRfTkFMX1NMSUNFOgorICAgICAgICBjYXNlIEgyNjRfTkFMX0lEUl9TTElDRToKICAgICAgICAgICAgIC8vIERvIG5vdCB3YWxrIHRoZSB3aG9sZSBidWZmZXIganVzdCB0byBkZWNvZGUgc2xpY2UgaGVhZGVyCi0gICAgICAgICAgICBpZiAoKHN0YXRlICYgMHgxZikgPT0gTkFMX0lEUl9TTElDRSB8fCAoKHN0YXRlID4+IDUpICYgMHgzKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoKHN0YXRlICYgMHgxZikgPT0gSDI2NF9OQUxfSURSX1NMSUNFIHx8ICgoc3RhdGUgPj4gNSkgJiAweDMpID09IDApIHsKICAgICAgICAgICAgICAgICAvKiBJRFIgb3IgZGlzcG9zYWJsZSBzbGljZQogICAgICAgICAgICAgICAgICAqIE5vIG5lZWQgdG8gZGVjb2RlIG1hbnkgYnl0ZXMgYmVjYXVzZSBNTUNPcyBzaGFsbCBub3QgYmUgcHJlc2VudC4gKi8KICAgICAgICAgICAgICAgICBpZiAoc3JjX2xlbmd0aCA+IDYwKQpAQCAtMjcyLDE5MyArMzA4LDIxOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgcHRyID0gZmZfaDI2NF9kZWNvZGVfbmFsKGgsIHNsLCBidWYgKyBidWZfaW5kZXgsICZkc3RfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnN1bWVkLCBzcmNfbGVuZ3RoKTsKLSAgICAgICAgaWYgKCFwdHIgfHwgZHN0X2xlbmd0aCA8IDApCisgICAgICAgIGNvbnN1bWVkID0gZmZfaDI2NDVfZXh0cmFjdF9yYnNwKGJ1ZiArIGJ1Zl9pbmRleCwgc3JjX2xlbmd0aCwgJnJic3AsICZuYWwsIDEpOworICAgICAgICBpZiAoY29uc3VtZWQgPCAwKQogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgYnVmX2luZGV4ICs9IGNvbnN1bWVkOwogCi0gICAgICAgIGluaXRfZ2V0X2JpdHMoJmgtPmdiLCBwdHIsIDggKiBkc3RfbGVuZ3RoKTsKLSAgICAgICAgc3dpdGNoIChoLT5uYWxfdW5pdF90eXBlKSB7Ci0gICAgICAgIGNhc2UgTkFMX1NQUzoKLSAgICAgICAgICAgIGZmX2gyNjRfZGVjb2RlX3NlcV9wYXJhbWV0ZXJfc2V0KGgsIDApOworICAgICAgICByZXQgPSBpbml0X2dldF9iaXRzOCgmbmFsLmdiLCBuYWwuZGF0YSwgbmFsLnNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgZ2V0X2JpdHMxKCZuYWwuZ2IpOworICAgICAgICBuYWwucmVmX2lkYyA9IGdldF9iaXRzKCZuYWwuZ2IsIDIpOworICAgICAgICBuYWwudHlwZSAgICA9IGdldF9iaXRzKCZuYWwuZ2IsIDUpOworCisgICAgICAgIHN3aXRjaCAobmFsLnR5cGUpIHsKKyAgICAgICAgY2FzZSBIMjY0X05BTF9TUFM6CisgICAgICAgICAgICBmZl9oMjY0X2RlY29kZV9zZXFfcGFyYW1ldGVyX3NldCgmbmFsLmdiLCBhdmN0eCwgJnAtPnBzLCAwKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5BTF9QUFM6Ci0gICAgICAgICAgICBmZl9oMjY0X2RlY29kZV9waWN0dXJlX3BhcmFtZXRlcl9zZXQoaCwgaC0+Z2Iuc2l6ZV9pbl9iaXRzKTsKKyAgICAgICAgY2FzZSBIMjY0X05BTF9QUFM6CisgICAgICAgICAgICBmZl9oMjY0X2RlY29kZV9waWN0dXJlX3BhcmFtZXRlcl9zZXQoJm5hbC5nYiwgYXZjdHgsICZwLT5wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwuc2l6ZV9iaXRzKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5BTF9TRUk6Ci0gICAgICAgICAgICBmZl9oMjY0X2RlY29kZV9zZWkoaCk7CisgICAgICAgIGNhc2UgSDI2NF9OQUxfU0VJOgorICAgICAgICAgICAgZmZfaDI2NF9zZWlfZGVjb2RlKCZwLT5zZWksICZuYWwuZ2IsICZwLT5wcywgYXZjdHgpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkFMX0lEUl9TTElDRToKKyAgICAgICAgY2FzZSBIMjY0X05BTF9JRFJfU0xJQ0U6CiAgICAgICAgICAgICBzLT5rZXlfZnJhbWUgPSAxOwogCi0gICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bSAgICAgICAgPSAwOwotICAgICAgICAgICAgaC0+cHJldl9mcmFtZV9udW1fb2Zmc2V0ID0gMDsKLSAgICAgICAgICAgIGgtPnByZXZfcG9jX21zYiAgICAgICAgICA9Ci0gICAgICAgICAgICBoLT5wcmV2X3BvY19sc2IgICAgICAgICAgPSAwOworICAgICAgICAgICAgcC0+cG9jLnByZXZfZnJhbWVfbnVtICAgICAgICA9IDA7CisgICAgICAgICAgICBwLT5wb2MucHJldl9mcmFtZV9udW1fb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHAtPnBvYy5wcmV2X3BvY19tc2IgICAgICAgICAgPQorICAgICAgICAgICAgcC0+cG9jLnByZXZfcG9jX2xzYiAgICAgICAgICA9IDA7CiAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICBjYXNlIE5BTF9TTElDRToKLSAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnNsLT5nYiwgcHRyLCA4ICogZHN0X2xlbmd0aCk7Ci0gICAgICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoJnNsLT5nYik7ICAvLyBza2lwIGZpcnN0X21iX2luX3NsaWNlCi0gICAgICAgICAgICBzbGljZV90eXBlICAgPSBnZXRfdWVfZ29sb21iXzMxKCZzbC0+Z2IpOwotICAgICAgICAgICAgcy0+cGljdF90eXBlID0gZ29sb21iX3RvX3BpY3RfdHlwZVtzbGljZV90eXBlICUgNV07Ci0gICAgICAgICAgICBpZiAoaC0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudCA+PSAwKSB7CisgICAgICAgIGNhc2UgSDI2NF9OQUxfU0xJQ0U6CisgICAgICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoJm5hbC5nYik7ICAvLyBza2lwIGZpcnN0X21iX2luX3NsaWNlCisgICAgICAgICAgICBzbGljZV90eXBlICAgPSBnZXRfdWVfZ29sb21iXzMxKCZuYWwuZ2IpOworICAgICAgICAgICAgcy0+cGljdF90eXBlID0gZmZfaDI2NF9nb2xvbWJfdG9fcGljdF90eXBlW3NsaWNlX3R5cGUgJSA1XTsKKyAgICAgICAgICAgIGlmIChwLT5zZWkucmVjb3ZlcnlfcG9pbnQucmVjb3ZlcnlfZnJhbWVfY250ID49IDApIHsKICAgICAgICAgICAgICAgICAvKiBrZXkgZnJhbWUsIHNpbmNlIHJlY292ZXJ5X2ZyYW1lX2NudCBpcyBzZXQgKi8KICAgICAgICAgICAgICAgICBzLT5rZXlfZnJhbWUgPSAxOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHBzX2lkID0gZ2V0X3VlX2dvbG9tYigmc2wtPmdiKTsKKyAgICAgICAgICAgIHBwc19pZCA9IGdldF91ZV9nb2xvbWIoJm5hbC5nYik7CiAgICAgICAgICAgICBpZiAocHBzX2lkID49IE1BWF9QUFNfQ09VTlQpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgInBwc19pZCAldSBvdXQgb2YgcmFuZ2VcbiIsIHBwc19pZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaC0+cHBzX2J1ZmZlcnNbcHBzX2lkXSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgaWYgKCFwLT5wcy5wcHNfbGlzdFtwcHNfaWRdKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJub24tZXhpc3RpbmcgUFBTICV1IHJlZmVyZW5jZWRcbiIsIHBwc19pZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGgtPnBwcyA9ICpoLT5wcHNfYnVmZmVyc1twcHNfaWRdOwotICAgICAgICAgICAgaWYgKCFoLT5zcHNfYnVmZmVyc1toLT5wcHMuc3BzX2lkXSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIFNQUyAldSByZWZlcmVuY2VkXG4iLCBoLT5wcHMuc3BzX2lkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoLT5zcHMgICAgICAgPSAqaC0+c3BzX2J1ZmZlcnNbaC0+cHBzLnNwc19pZF07Ci0gICAgICAgICAgICBoLT5mcmFtZV9udW0gPSBnZXRfYml0cygmc2wtPmdiLCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtKTsKIAotICAgICAgICAgICAgaWYoaC0+c3BzLnJlZl9mcmFtZV9jb3VudCA8PSAxICYmIGgtPnBwcy5yZWZfY291bnRbMF0gPD0gMSAmJiBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnAtPnBzLnBwc19yZWYpOworICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZwLT5wcy5zcHNfcmVmKTsKKyAgICAgICAgICAgIHAtPnBzLnBwcyA9IE5VTEw7CisgICAgICAgICAgICBwLT5wcy5zcHMgPSBOVUxMOworICAgICAgICAgICAgcC0+cHMucHBzX3JlZiA9IGF2X2J1ZmZlcl9yZWYocC0+cHMucHBzX2xpc3RbcHBzX2lkXSk7CisgICAgICAgICAgICBpZiAoIXAtPnBzLnBwc19yZWYpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgcC0+cHMucHBzID0gKGNvbnN0IFBQUyopcC0+cHMucHBzX3JlZi0+ZGF0YTsKKworICAgICAgICAgICAgaWYgKCFwLT5wcy5zcHNfbGlzdFtwLT5wcy5wcHMtPnNwc19pZF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vbi1leGlzdGluZyBTUFMgJXUgcmVmZXJlbmNlZFxuIiwgcC0+cHMucHBzLT5zcHNfaWQpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcC0+cHMuc3BzX3JlZiA9IGF2X2J1ZmZlcl9yZWYocC0+cHMuc3BzX2xpc3RbcC0+cHMucHBzLT5zcHNfaWRdKTsKKyAgICAgICAgICAgIGlmICghcC0+cHMuc3BzX3JlZikKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBwLT5wcy5zcHMgPSAoY29uc3QgU1BTKilwLT5wcy5zcHNfcmVmLT5kYXRhOworCisgICAgICAgICAgICBzcHMgPSBwLT5wcy5zcHM7CisKKyAgICAgICAgICAgIC8vIGhldXJpc3RpYyB0byBkZXRlY3Qgbm9uIG1hcmtlZCBrZXlmcmFtZXMKKyAgICAgICAgICAgIGlmIChwLT5wcy5zcHMtPnJlZl9mcmFtZV9jb3VudCA8PSAxICYmIHAtPnBzLnBwcy0+cmVmX2NvdW50WzBdIDw9IDEgJiYgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKQogICAgICAgICAgICAgICAgIHMtPmtleV9mcmFtZSA9IDE7CiAKLSAgICAgICAgICAgIHMtPmNvZGVkX3dpZHRoICA9IDE2ICogaC0+c3BzLm1iX3dpZHRoOwotICAgICAgICAgICAgcy0+Y29kZWRfaGVpZ2h0ID0gMTYgKiBoLT5zcHMubWJfaGVpZ2h0OwotICAgICAgICAgICAgcy0+d2lkdGggICAgICAgID0gcy0+Y29kZWRfd2lkdGggIC0gKGgtPnNwcy5jcm9wX3JpZ2h0ICsgaC0+c3BzLmNyb3BfbGVmdCk7Ci0gICAgICAgICAgICBzLT5oZWlnaHQgICAgICAgPSBzLT5jb2RlZF9oZWlnaHQgLSAoaC0+c3BzLmNyb3BfdG9wICAgKyBoLT5zcHMuY3JvcF9ib3R0b20pOworICAgICAgICAgICAgcC0+cG9jLmZyYW1lX251bSA9IGdldF9iaXRzKCZuYWwuZ2IsIHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtKTsKKworICAgICAgICAgICAgcy0+Y29kZWRfd2lkdGggID0gMTYgKiBzcHMtPm1iX3dpZHRoOworICAgICAgICAgICAgcy0+Y29kZWRfaGVpZ2h0ID0gMTYgKiBzcHMtPm1iX2hlaWdodDsKKyAgICAgICAgICAgIHMtPndpZHRoICAgICAgICA9IHMtPmNvZGVkX3dpZHRoICAtIChzcHMtPmNyb3BfcmlnaHQgKyBzcHMtPmNyb3BfbGVmdCk7CisgICAgICAgICAgICBzLT5oZWlnaHQgICAgICAgPSBzLT5jb2RlZF9oZWlnaHQgLSAoc3BzLT5jcm9wX3RvcCAgICsgc3BzLT5jcm9wX2JvdHRvbSk7CiAgICAgICAgICAgICBpZiAocy0+d2lkdGggPD0gMCB8fCBzLT5oZWlnaHQgPD0gMCkgewogICAgICAgICAgICAgICAgIHMtPndpZHRoICA9IHMtPmNvZGVkX3dpZHRoOwogICAgICAgICAgICAgICAgIHMtPmhlaWdodCA9IHMtPmNvZGVkX2hlaWdodDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3dpdGNoIChoLT5zcHMuYml0X2RlcHRoX2x1bWEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoc3BzLT5iaXRfZGVwdGhfbHVtYSkgewogICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgIGlmIChDSFJPTUE0NDQoaCkpICAgICAgcy0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChDSFJPTUE0MjIoaCkpIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDk7Ci0gICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICBzLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA5OworICAgICAgICAgICAgICAgIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpICAgICAgcy0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIpIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDk7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA5OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICBpZiAoQ0hST01BNDQ0KGgpKSAgICAgIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKENIUk9NQTQyMihoKSkgcy0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7Ci0gICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICBzLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMDsKKyAgICAgICAgICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSAgICAgIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgcy0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICBpZiAoQ0hST01BNDQ0KGgpKSAgICAgIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChDSFJPTUE0MjIoaCkpIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKLSAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSAgICAgIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIpIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcy0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9OT05FOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IGZmX2gyNjRfZ2V0X3Byb2ZpbGUoJmgtPnNwcyk7Ci0gICAgICAgICAgICBhdmN0eC0+bGV2ZWwgICA9IGgtPnNwcy5sZXZlbF9pZGM7CisgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IGZmX2gyNjRfZ2V0X3Byb2ZpbGUoc3BzKTsKKyAgICAgICAgICAgIGF2Y3R4LT5sZXZlbCAgID0gc3BzLT5sZXZlbF9pZGM7CiAKLSAgICAgICAgICAgIGlmIChoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZykgewotICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID0gUElDVF9GUkFNRTsKKyAgICAgICAgICAgIGlmIChzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBwLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnNsLT5nYikpIHsgLy8gZmllbGRfcGljX2ZsYWcKLSAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBQSUNUX1RPUF9GSUVMRCArIGdldF9iaXRzMSgmc2wtPmdiKTsgLy8gYm90dG9tX2ZpZWxkX2ZsYWcKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKCZuYWwuZ2IpKSB7IC8vIGZpZWxkX3BpY19mbGFnCisgICAgICAgICAgICAgICAgICAgIHAtPnBpY3R1cmVfc3RydWN0dXJlID0gUElDVF9UT1BfRklFTEQgKyBnZXRfYml0czEoJm5hbC5nYik7IC8vIGJvdHRvbV9maWVsZF9mbGFnCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBQSUNUX0ZSQU1FOworICAgICAgICAgICAgICAgICAgICBwLT5waWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaC0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfSURSX1NMSUNFKQotICAgICAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZygmc2wtPmdiKTsgLyogaWRyX3BpY19pZCAqLwotICAgICAgICAgICAgaWYgKGgtPnNwcy5wb2NfdHlwZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaC0+cG9jX2xzYiA9IGdldF9iaXRzKCZzbC0+Z2IsIGgtPnNwcy5sb2cyX21heF9wb2NfbHNiKTsKKyAgICAgICAgICAgIGlmIChuYWwudHlwZSA9PSBIMjY0X05BTF9JRFJfU0xJQ0UpCisgICAgICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKCZuYWwuZ2IpOyAvKiBpZHJfcGljX2lkICovCisgICAgICAgICAgICBpZiAoc3BzLT5wb2NfdHlwZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcC0+cG9jLnBvY19sc2IgPSBnZXRfYml0cygmbmFsLmdiLCBzcHMtPmxvZzJfbWF4X3BvY19sc2IpOwogCi0gICAgICAgICAgICAgICAgaWYgKGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudCA9PSAxICYmCi0gICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpCi0gICAgICAgICAgICAgICAgICAgIGgtPmRlbHRhX3BvY19ib3R0b20gPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOworICAgICAgICAgICAgICAgIGlmIChwLT5wcy5wcHMtPnBpY19vcmRlcl9wcmVzZW50ID09IDEgJiYKKyAgICAgICAgICAgICAgICAgICAgcC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgcC0+cG9jLmRlbHRhX3BvY19ib3R0b20gPSBnZXRfc2VfZ29sb21iKCZuYWwuZ2IpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaC0+c3BzLnBvY190eXBlID09IDEgJiYKLSAgICAgICAgICAgICAgICAhaC0+c3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSB7Ci0gICAgICAgICAgICAgICAgaC0+ZGVsdGFfcG9jWzBdID0gZ2V0X3NlX2dvbG9tYigmc2wtPmdiKTsKKyAgICAgICAgICAgIGlmIChzcHMtPnBvY190eXBlID09IDEgJiYKKyAgICAgICAgICAgICAgICAhc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykgeworICAgICAgICAgICAgICAgIHAtPnBvYy5kZWx0YV9wb2NbMF0gPSBnZXRfc2VfZ29sb21iKCZuYWwuZ2IpOwogCi0gICAgICAgICAgICAgICAgaWYgKGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudCA9PSAxICYmCi0gICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpCi0gICAgICAgICAgICAgICAgICAgIGgtPmRlbHRhX3BvY1sxXSA9IGdldF9zZV9nb2xvbWIoJnNsLT5nYik7CisgICAgICAgICAgICAgICAgaWYgKHAtPnBzLnBwcy0+cGljX29yZGVyX3ByZXNlbnQgPT0gMSAmJgorICAgICAgICAgICAgICAgICAgICBwLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICBwLT5wb2MuZGVsdGFfcG9jWzFdID0gZ2V0X3NlX2dvbG9tYigmbmFsLmdiKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogRGVjb2RlIFBPQyBvZiB0aGlzIHBpY3R1cmUuCiAgICAgICAgICAgICAgKiBUaGUgcHJldl8gdmFsdWVzIG5lZWRlZCBmb3IgZGVjb2RpbmcgUE9DIG9mIHRoZSBuZXh0IHBpY3R1cmUgYXJlIG5vdCBzZXQgaGVyZS4gKi8KICAgICAgICAgICAgIGZpZWxkX3BvY1swXSA9IGZpZWxkX3BvY1sxXSA9IElOVF9NQVg7Ci0gICAgICAgICAgICBmZl9pbml0X3BvYyhoLCBmaWVsZF9wb2MsICZzLT5vdXRwdXRfcGljdHVyZV9udW1iZXIpOworICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9pbml0X3BvYyhmaWVsZF9wb2MsICZzLT5vdXRwdXRfcGljdHVyZV9udW1iZXIsIHNwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnAtPnBvYywgcC0+cGljdHVyZV9zdHJ1Y3R1cmUsIG5hbC5yZWZfaWRjKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKIAogICAgICAgICAgICAgLyogQ29udGludWUgcGFyc2luZyB0byBjaGVjayBpZiBNTUNPX1JFU0VUIGlzIHByZXNlbnQuCiAgICAgICAgICAgICAgKiBGSVhNRTogTU1DT19SRVNFVCBjb3VsZCBhcHBlYXIgaW4gbm9uLWZpcnN0IHNsaWNlLgogICAgICAgICAgICAgICogICAgICAgIE1heWJlLCB3ZSBzaG91bGQgcGFyc2UgYWxsIHVuZGlzcG9zYWJsZSBub24tSURSIHNsaWNlIG9mIHRoaXMKICAgICAgICAgICAgICAqICAgICAgICBwaWN0dXJlIHVudGlsIGVuY291bnRlcmluZyBNTUNPX1JFU0VUIGluIGEgc2xpY2Ugb2YgaXQuICovCi0gICAgICAgICAgICBpZiAoaC0+bmFsX3JlZl9pZGMgJiYgaC0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfSURSX1NMSUNFKSB7Ci0gICAgICAgICAgICAgICAgZ290X3Jlc2V0ID0gc2Nhbl9tbWNvX3Jlc2V0KHMpOworICAgICAgICAgICAgaWYgKG5hbC5yZWZfaWRjICYmIG5hbC50eXBlICE9IEgyNjRfTkFMX0lEUl9TTElDRSkgeworICAgICAgICAgICAgICAgIGdvdF9yZXNldCA9IHNjYW5fbW1jb19yZXNldChzLCAmbmFsLmdiLCBhdmN0eCk7CiAgICAgICAgICAgICAgICAgaWYgKGdvdF9yZXNldCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnb3RfcmVzZXQ7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogU2V0IHVwIHRoZSBwcmV2XyB2YWx1ZXMgZm9yIGRlY29kaW5nIFBPQyBvZiB0aGUgbmV4dCBwaWN0dXJlLiAqLwotICAgICAgICAgICAgaC0+cHJldl9mcmFtZV9udW0gICAgICAgID0gZ290X3Jlc2V0ID8gMCA6IGgtPmZyYW1lX251bTsKLSAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCA9IGdvdF9yZXNldCA/IDAgOiBoLT5mcmFtZV9udW1fb2Zmc2V0OwotICAgICAgICAgICAgaWYgKGgtPm5hbF9yZWZfaWRjICE9IDApIHsKKyAgICAgICAgICAgIHAtPnBvYy5wcmV2X2ZyYW1lX251bSAgICAgICAgPSBnb3RfcmVzZXQgPyAwIDogcC0+cG9jLmZyYW1lX251bTsKKyAgICAgICAgICAgIHAtPnBvYy5wcmV2X2ZyYW1lX251bV9vZmZzZXQgPSBnb3RfcmVzZXQgPyAwIDogcC0+cG9jLmZyYW1lX251bV9vZmZzZXQ7CisgICAgICAgICAgICBpZiAobmFsLnJlZl9pZGMgIT0gMCkgewogICAgICAgICAgICAgICAgIGlmICghZ290X3Jlc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGgtPnByZXZfcG9jX21zYiA9IGgtPnBvY19tc2I7Ci0gICAgICAgICAgICAgICAgICAgIGgtPnByZXZfcG9jX2xzYiA9IGgtPnBvY19sc2I7CisgICAgICAgICAgICAgICAgICAgIHAtPnBvYy5wcmV2X3BvY19tc2IgPSBwLT5wb2MucG9jX21zYjsKKyAgICAgICAgICAgICAgICAgICAgcC0+cG9jLnByZXZfcG9jX2xzYiA9IHAtPnBvYy5wb2NfbHNiOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGgtPnByZXZfcG9jX21zYiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGgtPnByZXZfcG9jX2xzYiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCA/IDAgOiBmaWVsZF9wb2NbMF07CisgICAgICAgICAgICAgICAgICAgIHAtPnBvYy5wcmV2X3BvY19tc2IgPSAwOworICAgICAgICAgICAgICAgICAgICBwLT5wb2MucHJldl9wb2NfbHNiID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEID8gMCA6IGZpZWxkX3BvY1swXTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChoLT5zcHMucGljX3N0cnVjdF9wcmVzZW50X2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGgtPnNlaV9waWNfc3RydWN0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9UT1BfRklFTEQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9CT1RUT01fRklFTEQ6CisgICAgICAgICAgICBpZiAoc3BzLT5waWNfc3RydWN0X3ByZXNlbnRfZmxhZyAmJiBwLT5zZWkucGljdHVyZV90aW1pbmcucHJlc2VudCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocC0+c2VpLnBpY3R1cmVfdGltaW5nLnBpY19zdHJ1Y3QpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEgyNjRfU0VJX1BJQ19TVFJVQ1RfVE9QX0ZJRUxEOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9CT1RUT01fRklFTEQ6CiAgICAgICAgICAgICAgICAgICAgIHMtPnJlcGVhdF9waWN0ID0gMDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9GUkFNRToKLSAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT006Ci0gICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9GUkFNRToKKyAgICAgICAgICAgICAgICBjYXNlIEgyNjRfU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTToKKyAgICAgICAgICAgICAgICBjYXNlIEgyNjRfU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUDoKICAgICAgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSAxOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT01fVE9QOgotICAgICAgICAgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUF9CT1RUT006CisgICAgICAgICAgICAgICAgY2FzZSBIMjY0X1NFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT01fVE9QOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QX0JPVFRPTToKICAgICAgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSAyOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0ZSQU1FX0RPVUJMSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9GUkFNRV9ET1VCTElORzoKICAgICAgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSAzOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFSV9QSUNfU1RSVUNUX0ZSQU1FX1RSSVBMSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9GUkFNRV9UUklQTElORzoKICAgICAgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSA1OwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzLT5yZXBlYXRfcGljdCA9IGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSBwLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FID8gMSA6IDA7CisgICAgICAgICAgICAgICAgcy0+cmVwZWF0X3BpY3QgPSBwLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FID8gMSA6IDA7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7CisgICAgICAgICAgICBpZiAocC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkgewogICAgICAgICAgICAgICAgIHMtPnBpY3R1cmVfc3RydWN0dXJlID0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfRlJBTUU7Ci0gICAgICAgICAgICAgICAgaWYgKGgtPnNwcy5waWNfc3RydWN0X3ByZXNlbnRfZmxhZykgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGgtPnNlaV9waWNfc3RydWN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTToKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NX1RPUDoKKyAgICAgICAgICAgICAgICBpZiAoc3BzLT5waWNfc3RydWN0X3ByZXNlbnRfZmxhZyAmJiBwLT5zZWkucGljdHVyZV90aW1pbmcucHJlc2VudCkgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHAtPnNlaS5waWN0dXJlX3RpbWluZy5waWNfc3RydWN0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEgyNjRfU0VJX1BJQ19TVFJVQ1RfVE9QX0JPVFRPTV9UT1A6CiAgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1RUOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU0VJX1BJQ19TVFJVQ1RfQk9UVE9NX1RPUDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QX0JPVFRPTToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIMjY0X1NFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1A6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QX0JPVFRPTToKICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfQkI7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTQ3NCwyMCArNTM1LDM3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfVE9QX0ZJRUxEKQorICAgICAgICAgICAgICAgIGlmIChwLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX1RPUF9GSUVMRCkKICAgICAgICAgICAgICAgICAgICAgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9UT1BfRklFTEQ7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSA9IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX0JPVFRPTV9GSUVMRDsKLSAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1VOS05PV047CisgICAgICAgICAgICAgICAgaWYgKHAtPnBvYy5mcmFtZV9udW0gPT0gcC0+bGFzdF9mcmFtZV9udW0gJiYKKyAgICAgICAgICAgICAgICAgICAgcC0+bGFzdF9waWN0dXJlX3N0cnVjdHVyZSAhPSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9VTktOT1dOICYmCisgICAgICAgICAgICAgICAgICAgIHAtPmxhc3RfcGljdHVyZV9zdHJ1Y3R1cmUgIT0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfRlJBTUUgJiYKKyAgICAgICAgICAgICAgICAgICAgcC0+bGFzdF9waWN0dXJlX3N0cnVjdHVyZSAhPSBzLT5waWN0dXJlX3N0cnVjdHVyZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAocC0+bGFzdF9waWN0dXJlX3N0cnVjdHVyZSA9PSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9UT1BfRklFTEQpCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1RUOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX0JCOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcC0+bGFzdF9waWN0dXJlX3N0cnVjdHVyZSA9IHMtPnBpY3R1cmVfc3RydWN0dXJlOworICAgICAgICAgICAgICAgIHAtPmxhc3RfZnJhbWVfbnVtID0gcC0+cG9jLmZyYW1lX251bTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgYXZfZnJlZXAoJnJic3AucmJzcF9idWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuIDA7IC8qIG5vIG5lZWQgdG8gZXZhbHVhdGUgdGhlIHJlc3QgKi8KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocTI2NCkKKyAgICBpZiAocTI2NCkgeworICAgICAgICBhdl9mcmVlcCgmcmJzcC5yYnNwX2J1ZmZlcik7CiAgICAgICAgIHJldHVybiAwOworICAgIH0KICAgICAvKiBkaWRuJ3QgZmluZCBhIHBpY3R1cmUhICovCi0gICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIHBpY3R1cmUgaW4gYWNjZXNzIHVuaXQgd2l0aCBzaXplICVkXG4iLCBidWZfc2l6ZSk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIHBpY3R1cmUgaW4gYWNjZXNzIHVuaXQgd2l0aCBzaXplICVkXG4iLCBidWZfc2l6ZSk7CitmYWlsOgorICAgIGF2X2ZyZWVwKCZyYnNwLnJic3BfYnVmZmVyKTsKICAgICByZXR1cm4gLTE7CiB9CiAKQEAgLTQ5NywyOCArNTc1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCiB7CiAgICAgSDI2NFBhcnNlQ29udGV4dCAqcCA9IHMtPnByaXZfZGF0YTsKLSAgICBIMjY0Q29udGV4dCAgICAgICpoID0gJnAtPmg7CiAgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZwLT5wYzsKICAgICBpbnQgbmV4dDsKIAogICAgIGlmICghcC0+Z290X2ZpcnN0KSB7CiAgICAgICAgIHAtPmdvdF9maXJzdCA9IDE7CiAgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUpIHsKLSAgICAgICAgICAgIGgtPmF2Y3R4ID0gYXZjdHg7Ci0gICAgICAgICAgICAvLyBtdXN0IGJlIGRvbmUgbGlrZSBpbiBkZWNvZGVyLCBvdGhlcndpc2Ugb3BlbmluZyB0aGUgcGFyc2VyLAotICAgICAgICAgICAgLy8gbGV0dGluZyBpdCBjcmVhdGUgZXh0cmFkYXRhIGFuZCB0aGVuIGNsb3NpbmcgYW5kIG9wZW5pbmcgYWdhaW4KLSAgICAgICAgICAgIC8vIHdpbGwgY2F1c2UgaGFzX2JfZnJhbWVzIHRvIGJlIGFsd2F5cyBzZXQuCi0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgZXN0aW1hdGVfdGltaW5nc19mcm9tX3B0cyBkb2VzIGV4YWN0bHkgdGhpcy4KLSAgICAgICAgICAgIGlmICghYXZjdHgtPmhhc19iX2ZyYW1lcykKLSAgICAgICAgICAgICAgICBoLT5sb3dfZGVsYXkgPSAxOwotICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfZXh0cmFkYXRhKGgsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBmZl9oMjY0X2RlY29kZV9leHRyYWRhdGEoYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwLT5wcywgJnAtPmlzX2F2YywgJnAtPm5hbF9sZW5ndGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXJyX3JlY29nbml0aW9uLCBhdmN0eCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVMpIHsKICAgICAgICAgbmV4dCA9IGJ1Zl9zaXplOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG5leHQgPSBoMjY0X2ZpbmRfZnJhbWVfZW5kKHAsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBuZXh0ID0gaDI2NF9maW5kX2ZyYW1lX2VuZChwLCBidWYsIGJ1Zl9zaXplLCBhdmN0eCk7CiAKICAgICAgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUocGMsIG5leHQsICZidWYsICZidWZfc2l6ZSkgPCAwKSB7CiAgICAgICAgICAgICAqcG91dGJ1ZiAgICAgID0gTlVMTDsKQEAgLTUyOCw3ICs2MDAsNyBAQAogCiAgICAgICAgIGlmIChuZXh0IDwgMCAmJiBuZXh0ICE9IEVORF9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIGF2X2Fzc2VydDEocGMtPmxhc3RfaW5kZXggKyBuZXh0ID49IDApOwotICAgICAgICAgICAgaDI2NF9maW5kX2ZyYW1lX2VuZChwLCAmcGMtPmJ1ZmZlcltwYy0+bGFzdF9pbmRleCArIG5leHRdLCAtbmV4dCk7IC8vIHVwZGF0ZSBzdGF0ZQorICAgICAgICAgICAgaDI2NF9maW5kX2ZyYW1lX2VuZChwLCAmcGMtPmJ1ZmZlcltwYy0+bGFzdF9pbmRleCArIG5leHRdLCAtbmV4dCwgYXZjdHgpOyAvLyB1cGRhdGUgc3RhdGUKICAgICAgICAgfQogICAgIH0KIApAQCAtNTM2LDEwICs2MDgsMTAgQEAKIAogICAgIGlmIChhdmN0eC0+ZnJhbWVyYXRlLm51bSkKICAgICAgICAgYXZjdHgtPnRpbWVfYmFzZSA9IGF2X2ludl9xKGF2X211bF9xKGF2Y3R4LT5mcmFtZXJhdGUsIChBVlJhdGlvbmFsKXthdmN0eC0+dGlja3NfcGVyX2ZyYW1lLCAxfSkpOwotICAgIGlmIChoLT5zZWlfY3BiX3JlbW92YWxfZGVsYXkgPj0gMCkgewotICAgICAgICBzLT5kdHNfc3luY19wb2ludCAgICA9IGgtPnNlaV9idWZmZXJpbmdfcGVyaW9kX3ByZXNlbnQ7Ci0gICAgICAgIHMtPmR0c19yZWZfZHRzX2RlbHRhID0gaC0+c2VpX2NwYl9yZW1vdmFsX2RlbGF5OwotICAgICAgICBzLT5wdHNfZHRzX2RlbHRhICAgICA9IGgtPnNlaV9kcGJfb3V0cHV0X2RlbGF5OworICAgIGlmIChwLT5zZWkucGljdHVyZV90aW1pbmcuY3BiX3JlbW92YWxfZGVsYXkgPj0gMCkgeworICAgICAgICBzLT5kdHNfc3luY19wb2ludCAgICA9IHAtPnNlaS5idWZmZXJpbmdfcGVyaW9kLnByZXNlbnQ7CisgICAgICAgIHMtPmR0c19yZWZfZHRzX2RlbHRhID0gcC0+c2VpLnBpY3R1cmVfdGltaW5nLmNwYl9yZW1vdmFsX2RlbGF5OworICAgICAgICBzLT5wdHNfZHRzX2RlbHRhICAgICA9IHAtPnNlaS5waWN0dXJlX3RpbWluZy5kcGJfb3V0cHV0X2RlbGF5OwogICAgIH0gZWxzZSB7CiAgICAgICAgIHMtPmR0c19zeW5jX3BvaW50ICAgID0gSU5UX01JTjsKICAgICAgICAgcy0+ZHRzX3JlZl9kdHNfZGVsdGEgPSBJTlRfTUlOOwpAQCAtNTUwLDYgKzYyMiwyNiBAQAogICAgICAgICBzLT5mbGFncyAmPSBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVM7CiAgICAgfQogCisgICAgaWYgKHMtPmR0c19zeW5jX3BvaW50ID49IDApIHsKKyAgICAgICAgaW50NjRfdCBkZW4gPSBhdmN0eC0+dGltZV9iYXNlLmRlbiAqIChpbnQ2NF90KWF2Y3R4LT5wa3RfdGltZWJhc2UubnVtOworICAgICAgICBpZiAoZGVuID4gMCkgeworICAgICAgICAgICAgaW50NjRfdCBudW0gPSBhdmN0eC0+dGltZV9iYXNlLm51bSAqIChpbnQ2NF90KWF2Y3R4LT5wa3RfdGltZWJhc2UuZGVuOworICAgICAgICAgICAgaWYgKHMtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgICAgIC8vIGdvdCBEVFMgZnJvbSB0aGUgc3RyZWFtLCB1cGRhdGUgcmVmZXJlbmNlIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIHAtPnJlZmVyZW5jZV9kdHMgPSBzLT5kdHMgLSBhdl9yZXNjYWxlKHMtPmR0c19yZWZfZHRzX2RlbHRhLCBudW0sIGRlbik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHAtPnJlZmVyZW5jZV9kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAvLyBjb21wdXRlIERUUyBiYXNlZCBvbiByZWZlcmVuY2UgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgcy0+ZHRzID0gcC0+cmVmZXJlbmNlX2R0cyArIGF2X3Jlc2NhbGUocy0+ZHRzX3JlZl9kdHNfZGVsdGEsIG51bSwgZGVuKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHAtPnJlZmVyZW5jZV9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcy0+cHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgIHMtPnB0cyA9IHMtPmR0cyArIGF2X3Jlc2NhbGUocy0+cHRzX2R0c19kZWx0YSwgbnVtLCBkZW4pOworCisgICAgICAgICAgICBpZiAocy0+ZHRzX3N5bmNfcG9pbnQgPiAwKQorICAgICAgICAgICAgICAgIHAtPnJlZmVyZW5jZV9kdHMgPSBzLT5kdHM7IC8vIG5ldyByZWZlcmVuY2UKKyAgICAgICAgfQorICAgIH0KKwogICAgICpwb3V0YnVmICAgICAgPSBidWY7CiAgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOwogICAgIHJldHVybiBuZXh0OwpAQCAtNTY5LDE3ICs2NjEsMTcgQEAKICAgICAgICAgaWYgKChzdGF0ZSAmIDB4RkZGRkZGMDApICE9IDB4MTAwKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIG5hbHVfdHlwZSA9IHN0YXRlICYgMHgxRjsKLSAgICAgICAgaWYgKG5hbHVfdHlwZSA9PSBOQUxfU1BTKSB7CisgICAgICAgIGlmIChuYWx1X3R5cGUgPT0gSDI2NF9OQUxfU1BTKSB7CiAgICAgICAgICAgICBoYXNfc3BzID0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChuYWx1X3R5cGUgPT0gTkFMX1BQUykKKyAgICAgICAgfSBlbHNlIGlmIChuYWx1X3R5cGUgPT0gSDI2NF9OQUxfUFBTKQogICAgICAgICAgICAgaGFzX3BwcyA9IDE7CiAgICAgICAgIC8qIGVsc2UgaWYgKG5hbHVfdHlwZSA9PSAweDAxIHx8CiAgICAgICAgICAqICAgICBuYWx1X3R5cGUgPT0gMHgwMiB8fAogICAgICAgICAgKiAgICAgbmFsdV90eXBlID09IDB4MDUpIHsKICAgICAgICAgICogIH0KICAgICAgICAgICovCi0gICAgICAgIGVsc2UgaWYgKChuYWx1X3R5cGUgIT0gTkFMX1NFSSB8fCBoYXNfcHBzKSAmJgotICAgICAgICAgICAgICAgICAgbmFsdV90eXBlICE9IE5BTF9BVUQgJiYgbmFsdV90eXBlICE9IE5BTF9TUFNfRVhUICYmCisgICAgICAgIGVsc2UgaWYgKChuYWx1X3R5cGUgIT0gSDI2NF9OQUxfU0VJIHx8IGhhc19wcHMpICYmCisgICAgICAgICAgICAgICAgICBuYWx1X3R5cGUgIT0gSDI2NF9OQUxfQVVEICYmIG5hbHVfdHlwZSAhPSBIMjY0X05BTF9TUFNfRVhUICYmCiAgICAgICAgICAgICAgICAgICBuYWx1X3R5cGUgIT0gMHgwZikgewogICAgICAgICAgICAgaWYgKGhhc19zcHMpIHsKICAgICAgICAgICAgICAgICB3aGlsZSAocHRyIC0gNCA+IGJ1ZiAmJiBwdHJbLTVdID09IDApCkBAIC01OTUsMjUgKzY4NywyMSBAQAogc3RhdGljIHZvaWQgaDI2NF9jbG9zZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcykKIHsKICAgICBIMjY0UGFyc2VDb250ZXh0ICpwID0gcy0+cHJpdl9kYXRhOwotICAgIEgyNjRDb250ZXh0ICAgICAgKmggPSAmcC0+aDsKICAgICBQYXJzZUNvbnRleHQgKnBjID0gJnAtPnBjOwogCiAgICAgYXZfZnJlZXAoJnBjLT5idWZmZXIpOwotICAgIGZmX2gyNjRfZnJlZV9jb250ZXh0KGgpOworCisgICAgZmZfaDI2NF9zZWlfdW5pbml0KCZwLT5zZWkpOworICAgIGZmX2gyNjRfcHNfdW5pbml0KCZwLT5wcyk7CiB9CiAKIHN0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzKQogewogICAgIEgyNjRQYXJzZUNvbnRleHQgKnAgPSBzLT5wcml2X2RhdGE7Ci0gICAgSDI2NENvbnRleHQgICAgICAqaCA9ICZwLT5oOwogCi0gICAgaC0+c2xpY2VfY3R4ID0gYXZfbWFsbG9jeihzaXplb2YoKmgtPnNsaWNlX2N0eCkpOwotICAgIGlmICghaC0+c2xpY2VfY3R4KQotICAgICAgICByZXR1cm4gMDsKLSAgICBoLT5uYl9zbGljZV9jdHggPSAxOwotCi0gICAgaC0+c2xpY2VfY29udGV4dF9jb3VudCA9IDE7Ci0gICAgZmZfaDI2NGRzcF9pbml0KCZoLT5oMjY0ZHNwLCA4LCAxKTsKKyAgICBwLT5yZWZlcmVuY2VfZHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcC0+bGFzdF9mcmFtZV9udW0gPSBJTlRfTUFYOworICAgIGZmX2gyNjRkc3BfaW5pdCgmcC0+aDI2NGRzcCwgOCwgMSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NF9waWN0dXJlLmMgYi9saWJhdmNvZGVjL2gyNjRfcGljdHVyZS5jCmluZGV4IDczMWQ3ODAuLmU4MzM4MzUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NF9waWN0dXJlLmMKKysrIGIvbGliYXZjb2RlYy9oMjY0X3BpY3R1cmUuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBjb2RlYy4KKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHBhcnQxMCBjb2RlYy4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCkBAIC0zMywxNiArMzMsMTQgQEAKICNpbmNsdWRlICJjYWJhY19mdW5jdGlvbnMuaCIKICNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0ZGVjLmgiCiAjaW5jbHVkZSAiaDI2NGRhdGEuaCIKICNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCiAjaW5jbHVkZSAiaDI2NF9tdnByZWQuaCIKLSNpbmNsdWRlICJnb2xvbWIuaCIKICNpbmNsdWRlICJtYXRob3BzLmgiCiAjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCiAjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAidmRwYXVfY29tcGF0LmgiCiAKIHZvaWQgZmZfaDI2NF91bnJlZl9waWN0dXJlKEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqcGljKQogewpAQCAtNzEsOCArNjksOCBAQAogCiAgICAgYXZfYXNzZXJ0MCghZHN0LT5mLT5idWZbMF0pOwogICAgIGF2X2Fzc2VydDAoc3JjLT5mLT5idWZbMF0pOworICAgIGF2X2Fzc2VydDAoc3JjLT50Zi5mID09IHNyYy0+Zik7CiAKLSAgICBzcmMtPnRmLmYgPSBzcmMtPmY7CiAgICAgZHN0LT50Zi5mID0gZHN0LT5mOwogICAgIHJldCA9IGZmX3RocmVhZF9yZWZfZnJhbWUoJmRzdC0+dGYsICZzcmMtPnRmKTsKICAgICBpZiAocmV0IDwgMCkKQEAgLTgwLDI0ICs3OCwzMCBAQAogCiAgICAgZHN0LT5xc2NhbGVfdGFibGVfYnVmID0gYXZfYnVmZmVyX3JlZihzcmMtPnFzY2FsZV90YWJsZV9idWYpOwogICAgIGRzdC0+bWJfdHlwZV9idWYgICAgICA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5tYl90eXBlX2J1Zik7Ci0gICAgaWYgKCFkc3QtPnFzY2FsZV90YWJsZV9idWYgfHwgIWRzdC0+bWJfdHlwZV9idWYpCisgICAgaWYgKCFkc3QtPnFzY2FsZV90YWJsZV9idWYgfHwgIWRzdC0+bWJfdHlwZV9idWYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBnb3RvIGZhaWw7CisgICAgfQogICAgIGRzdC0+cXNjYWxlX3RhYmxlID0gc3JjLT5xc2NhbGVfdGFibGU7CiAgICAgZHN0LT5tYl90eXBlICAgICAgPSBzcmMtPm1iX3R5cGU7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgIGRzdC0+bW90aW9uX3ZhbF9idWZbaV0gPSBhdl9idWZmZXJfcmVmKHNyYy0+bW90aW9uX3ZhbF9idWZbaV0pOwogICAgICAgICBkc3QtPnJlZl9pbmRleF9idWZbaV0gID0gYXZfYnVmZmVyX3JlZihzcmMtPnJlZl9pbmRleF9idWZbaV0pOwotICAgICAgICBpZiAoIWRzdC0+bW90aW9uX3ZhbF9idWZbaV0gfHwgIWRzdC0+cmVmX2luZGV4X2J1ZltpXSkKKyAgICAgICAgaWYgKCFkc3QtPm1vdGlvbl92YWxfYnVmW2ldIHx8ICFkc3QtPnJlZl9pbmRleF9idWZbaV0pIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQogICAgICAgICBkc3QtPm1vdGlvbl92YWxbaV0gPSBzcmMtPm1vdGlvbl92YWxbaV07CiAgICAgICAgIGRzdC0+cmVmX2luZGV4W2ldICA9IHNyYy0+cmVmX2luZGV4W2ldOwogICAgIH0KIAogICAgIGlmIChzcmMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlKSB7CiAgICAgICAgIGRzdC0+aHdhY2NlbF9wcml2X2J1ZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5od2FjY2VsX3ByaXZfYnVmKTsKLSAgICAgICAgaWYgKCFkc3QtPmh3YWNjZWxfcHJpdl9idWYpCisgICAgICAgIGlmICghZHN0LT5od2FjY2VsX3ByaXZfYnVmKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KICAgICAgICAgZHN0LT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSA9IGRzdC0+aHdhY2NlbF9wcml2X2J1Zi0+ZGF0YTsKICAgICB9CiAKQEAgLTExMCwxNCArMTE0LDEwIEBACiAgICAgZHN0LT5wb2MgICAgICAgICAgID0gc3JjLT5wb2M7CiAgICAgZHN0LT5mcmFtZV9udW0gICAgID0gc3JjLT5mcmFtZV9udW07CiAgICAgZHN0LT5tbWNvX3Jlc2V0ICAgID0gc3JjLT5tbWNvX3Jlc2V0OwotICAgIGRzdC0+cGljX2lkICAgICAgICA9IHNyYy0+cGljX2lkOwogICAgIGRzdC0+bG9uZ19yZWYgICAgICA9IHNyYy0+bG9uZ19yZWY7CiAgICAgZHN0LT5tYmFmZiAgICAgICAgID0gc3JjLT5tYmFmZjsKICAgICBkc3QtPmZpZWxkX3BpY3R1cmUgPSBzcmMtPmZpZWxkX3BpY3R1cmU7CiAgICAgZHN0LT5yZWZlcmVuY2UgICAgID0gc3JjLT5yZWZlcmVuY2U7Ci0gICAgZHN0LT5jcm9wICAgICAgICAgID0gc3JjLT5jcm9wOwotICAgIGRzdC0+Y3JvcF9sZWZ0ICAgICA9IHNyYy0+Y3JvcF9sZWZ0OwotICAgIGRzdC0+Y3JvcF90b3AgICAgICA9IHNyYy0+Y3JvcF90b3A7CiAgICAgZHN0LT5yZWNvdmVyZWQgICAgID0gc3JjLT5yZWNvdmVyZWQ7CiAgICAgZHN0LT5pbnZhbGlkX2dhcCAgID0gc3JjLT5pbnZhbGlkX2dhcDsKICAgICBkc3QtPnNlaV9yZWNvdmVyeV9mcmFtZV9jbnQgPSBzcmMtPnNlaV9yZWNvdmVyeV9mcmFtZV9jbnQ7CkBAIC0xNTcsMjAgKzE1NywxNCBAQAogICAgIGludCBlcnIgPSAwOwogICAgIGgtPm1iX3kgPSAwOwogCi0jaWYgRkZfQVBJX0NBUF9WRFBBVQotICAgIGlmIChDT05GSUdfSDI2NF9WRFBBVV9ERUNPREVSICYmCi0gICAgICAgIGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCi0gICAgICAgIGZmX3ZkcGF1X2gyNjRfc2V0X3JlZmVyZW5jZV9mcmFtZXMoaCk7Ci0jZW5kaWYKLQogICAgIGlmIChpbl9zZXR1cCB8fCAhKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpKSB7CiAgICAgICAgIGlmICghaC0+ZHJvcHBhYmxlKSB7Ci0gICAgICAgICAgICBlcnIgPSBmZl9oMjY0X2V4ZWN1dGVfcmVmX3BpY19tYXJraW5nKGgsIGgtPm1tY28sIGgtPm1tY29faW5kZXgpOwotICAgICAgICAgICAgaC0+cHJldl9wb2NfbXNiID0gaC0+cG9jX21zYjsKLSAgICAgICAgICAgIGgtPnByZXZfcG9jX2xzYiA9IGgtPnBvY19sc2I7CisgICAgICAgICAgICBlcnIgPSBmZl9oMjY0X2V4ZWN1dGVfcmVmX3BpY19tYXJraW5nKGgpOworICAgICAgICAgICAgaC0+cG9jLnByZXZfcG9jX21zYiA9IGgtPnBvYy5wb2NfbXNiOworICAgICAgICAgICAgaC0+cG9jLnByZXZfcG9jX2xzYiA9IGgtPnBvYy5wb2NfbHNiOwogICAgICAgICB9Ci0gICAgICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCA9IGgtPmZyYW1lX251bV9vZmZzZXQ7Ci0gICAgICAgIGgtPnByZXZfZnJhbWVfbnVtICAgICAgICA9IGgtPmZyYW1lX251bTsKKyAgICAgICAgaC0+cG9jLnByZXZfZnJhbWVfbnVtX29mZnNldCA9IGgtPnBvYy5mcmFtZV9udW1fb2Zmc2V0OworICAgICAgICBoLT5wb2MucHJldl9mcmFtZV9udW0gICAgICAgID0gaC0+cG9jLmZyYW1lX251bTsKICAgICB9CiAKICAgICBpZiAoYXZjdHgtPmh3YWNjZWwpIHsKQEAgLTE4MCw1MyArMTc0LDYgQEAKICAgICAgICAgICAgICAgICAgICAiaGFyZHdhcmUgYWNjZWxlcmF0b3IgZmFpbGVkIHRvIGRlY29kZSBwaWN0dXJlXG4iKTsKICAgICB9CiAKLSNpZiBGRl9BUElfQ0FQX1ZEUEFVCi0gICAgaWYgKENPTkZJR19IMjY0X1ZEUEFVX0RFQ09ERVIgJiYKLSAgICAgICAgaC0+YXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSkKLSAgICAgICAgZmZfdmRwYXVfaDI2NF9waWN0dXJlX2NvbXBsZXRlKGgpOwotI2VuZGlmCi0KLSNpZiBDT05GSUdfRVJST1JfUkVTSUxJRU5DRQotICAgIGF2X2Fzc2VydDAoc2wgPT0gaC0+c2xpY2VfY3R4KTsKLSAgICAvKgotICAgICAqIEZJWE1FOiBFcnJvciBoYW5kbGluZyBjb2RlIGRvZXMgbm90IHNlZW0gdG8gc3VwcG9ydCBpbnRlcmxhY2VkCi0gICAgICogd2hlbiBzbGljZXMgc3BhbiBtdWx0aXBsZSByb3dzCi0gICAgICogVGhlIGZmX2VyX2FkZF9zbGljZSBjYWxscyBkb24ndCB3b3JrIHJpZ2h0IGZvciBib3R0b20KLSAgICAgKiBmaWVsZHM7IHRoZXkgY2F1c2UgbWFzc2l2ZSBlcnJvbmVvdXMgZXJyb3IgY29uY2VhbGluZwotICAgICAqIEVycm9yIG1hcmtpbmcgY292ZXJzIGJvdGggZmllbGRzICh0b3AgYW5kIGJvdHRvbSkuCi0gICAgICogVGhpcyBjYXVzZXMgYSBtaXNtYXRjaGVkIHMtPmVycm9yX2NvdW50Ci0gICAgICogYW5kIGEgYmFkIGVycm9yIHRhYmxlLiBGdXJ0aGVyLCB0aGUgZXJyb3IgY291bnQgZ29lcyB0bwotICAgICAqIElOVF9NQVggd2hlbiBjYWxsZWQgZm9yIGJvdHRvbSBmaWVsZCwgYmVjYXVzZSBtYl95IGlzCi0gICAgICogcGFzdCBlbmQgYnkgb25lIChjYWxsZXJzIGZhdWx0KSBhbmQgcmVzeW5jX21iX3kgIT0gMAotICAgICAqIGNhdXNlcyBwcm9ibGVtcyBmb3IgdGhlIGZpcnN0IE1CIGxpbmUsIHRvby4KLSAgICAgKi8KLSAgICBpZiAoIUZJRUxEX1BJQ1RVUkUoaCkgJiYgaC0+Y3VycmVudF9zbGljZSAmJiAhaC0+c3BzLm5ldyAmJiBoLT5lbmFibGVfZXIpIHsKLSAgICAgICAgaW50IHVzZV9sYXN0X3BpYyA9IGgtPmxhc3RfcGljX2Zvcl9lYy5mLT5idWZbMF0gJiYgIXNsLT5yZWZfY291bnRbMF07Ci0KLSAgICAgICAgZmZfaDI2NF9zZXRfZXJwaWMoJnNsLT5lci5jdXJfcGljLCBoLT5jdXJfcGljX3B0cik7Ci0KLSAgICAgICAgaWYgKHVzZV9sYXN0X3BpYykgewotICAgICAgICAgICAgZmZfaDI2NF9zZXRfZXJwaWMoJnNsLT5lci5sYXN0X3BpYywgJmgtPmxhc3RfcGljX2Zvcl9lYyk7Ci0gICAgICAgICAgICBzbC0+cmVmX2xpc3RbMF1bMF0ucGFyZW50ID0gJmgtPmxhc3RfcGljX2Zvcl9lYzsKLSAgICAgICAgICAgIG1lbWNweShzbC0+cmVmX2xpc3RbMF1bMF0uZGF0YSwgaC0+bGFzdF9waWNfZm9yX2VjLmYtPmRhdGEsIHNpemVvZihzbC0+cmVmX2xpc3RbMF1bMF0uZGF0YSkpOwotICAgICAgICAgICAgbWVtY3B5KHNsLT5yZWZfbGlzdFswXVswXS5saW5lc2l6ZSwgaC0+bGFzdF9waWNfZm9yX2VjLmYtPmxpbmVzaXplLCBzaXplb2Yoc2wtPnJlZl9saXN0WzBdWzBdLmxpbmVzaXplKSk7Ci0gICAgICAgICAgICBzbC0+cmVmX2xpc3RbMF1bMF0ucmVmZXJlbmNlID0gaC0+bGFzdF9waWNfZm9yX2VjLnJlZmVyZW5jZTsKLSAgICAgICAgfSBlbHNlIGlmIChzbC0+cmVmX2NvdW50WzBdKSB7Ci0gICAgICAgICAgICBmZl9oMjY0X3NldF9lcnBpYygmc2wtPmVyLmxhc3RfcGljLCBzbC0+cmVmX2xpc3RbMF1bMF0ucGFyZW50KTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBmZl9oMjY0X3NldF9lcnBpYygmc2wtPmVyLmxhc3RfcGljLCBOVUxMKTsKLQotICAgICAgICBpZiAoc2wtPnJlZl9jb3VudFsxXSkKLSAgICAgICAgICAgIGZmX2gyNjRfc2V0X2VycGljKCZzbC0+ZXIubmV4dF9waWMsIHNsLT5yZWZfbGlzdFsxXVswXS5wYXJlbnQpOwotCi0gICAgICAgIHNsLT5lci5yZWZfY291bnQgPSBzbC0+cmVmX2NvdW50WzBdOwotCi0gICAgICAgIGZmX2VyX2ZyYW1lX2VuZCgmc2wtPmVyKTsKLSAgICAgICAgaWYgKHVzZV9sYXN0X3BpYykKLSAgICAgICAgICAgIG1lbXNldCgmc2wtPnJlZl9saXN0WzBdWzBdLCAwLCBzaXplb2Yoc2wtPnJlZl9saXN0WzBdWzBdKSk7Ci0gICAgfQotI2VuZGlmIC8qIENPTkZJR19FUlJPUl9SRVNJTElFTkNFICovCi0KICAgICBpZiAoIWluX3NldHVwICYmICFoLT5kcm9wcGFibGUpCiAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmgtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjRfcHMuYyBiL2xpYmF2Y29kZWMvaDI2NF9wcy5jCmluZGV4IDBiY2E5YzEuLjE3YmZhNzggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NF9wcy5jCisrKyBiL2xpYmF2Y29kZWMvaDI2NF9wcy5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIHBhcmFtZXRlciBzZXQgZGVjb2RpbmcuCisgKiBILjI2NCAvIEFWQyAvIE1QRUctNCBwYXJ0MTAgcGFyYW1ldGVyIHNldCBkZWNvZGluZy4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCkBAIC0yOSw1NyArMjksMTUgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJoMjY0LmgiCiAjaW5jbHVkZSAiaDI2NGRhdGEuaCIKKyNpbmNsdWRlICJoMjY0X3BzLmgiCiAjaW5jbHVkZSAiZ29sb21iLmgiCiAKLSNkZWZpbmUgTUFYX0xPRzJfTUFYX0ZSQU1FX05VTSAgICAoMTIgKyA0KQogI2RlZmluZSBNSU5fTE9HMl9NQVhfRlJBTUVfTlVNICAgIDQKIAotI2RlZmluZSBRUChxUCwgZGVwdGgpICgocVApICsgNiAqICgoZGVwdGgpIC0gOCkpCi0KLSNkZWZpbmUgQ0hST01BX1FQX1RBQkxFX0VORChkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBRUCgwLCAgZCksIFFQKDEsICBkKSwgUVAoMiwgIGQpLCBRUCgzLCAgZCksIFFQKDQsICBkKSwgUVAoNSwgIGQpLCAgIFwKLSAgICBRUCg2LCAgZCksIFFQKDcsICBkKSwgUVAoOCwgIGQpLCBRUCg5LCAgZCksIFFQKDEwLCBkKSwgUVAoMTEsIGQpLCAgIFwKLSAgICBRUCgxMiwgZCksIFFQKDEzLCBkKSwgUVAoMTQsIGQpLCBRUCgxNSwgZCksIFFQKDE2LCBkKSwgUVAoMTcsIGQpLCAgIFwKLSAgICBRUCgxOCwgZCksIFFQKDE5LCBkKSwgUVAoMjAsIGQpLCBRUCgyMSwgZCksIFFQKDIyLCBkKSwgUVAoMjMsIGQpLCAgIFwKLSAgICBRUCgyNCwgZCksIFFQKDI1LCBkKSwgUVAoMjYsIGQpLCBRUCgyNywgZCksIFFQKDI4LCBkKSwgUVAoMjksIGQpLCAgIFwKLSAgICBRUCgyOSwgZCksIFFQKDMwLCBkKSwgUVAoMzEsIGQpLCBRUCgzMiwgZCksIFFQKDMyLCBkKSwgUVAoMzMsIGQpLCAgIFwKLSAgICBRUCgzNCwgZCksIFFQKDM0LCBkKSwgUVAoMzUsIGQpLCBRUCgzNSwgZCksIFFQKDM2LCBkKSwgUVAoMzYsIGQpLCAgIFwKLSAgICBRUCgzNywgZCksIFFQKDM3LCBkKSwgUVAoMzcsIGQpLCBRUCgzOCwgZCksIFFQKDM4LCBkKSwgUVAoMzgsIGQpLCAgIFwKLSAgICBRUCgzOSwgZCksIFFQKDM5LCBkKSwgUVAoMzksIGQpLCBRUCgzOSwgZCkKLQotY29uc3QgdWludDhfdCBmZl9oMjY0X2Nocm9tYV9xcFs3XVtRUF9NQVhfTlVNICsgMV0gPSB7Ci0gICAgeyBDSFJPTUFfUVBfVEFCTEVfRU5EKDgpIH0sCi0gICAgeyAwLCAxLCAyLCAzLCA0LCA1LAotICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCg5KSB9LAotICAgIHsgMCwgMSwgMiwgMywgIDQsICA1LAotICAgICAgNiwgNywgOCwgOSwgMTAsIDExLAotICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMCkgfSwKLSAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCi0gICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAotICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKLSAgICAgIENIUk9NQV9RUF9UQUJMRV9FTkQoMTEpIH0sCi0gICAgeyAwLCAgMSwgMiwgMywgIDQsICA1LAotICAgICAgNiwgIDcsIDgsIDksIDEwLCAxMSwKLSAgICAgIDEyLDEzLDE0LDE1LCAxNiwgMTcsCi0gICAgICAxOCwxOSwyMCwyMSwgMjIsIDIzLAotICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMikgfSwKLSAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCi0gICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAotICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKLSAgICAgIDE4LDE5LDIwLDIxLCAyMiwgMjMsCi0gICAgICAyNCwyNSwyNiwyNywgMjgsIDI5LAotICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMykgfSwKLSAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCi0gICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAotICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKLSAgICAgIDE4LDE5LDIwLDIxLCAyMiwgMjMsCi0gICAgICAyNCwyNSwyNiwyNywgMjgsIDI5LAotICAgICAgMzAsMzEsMzIsMzMsIDM0LCAzNSwKLSAgICAgIENIUk9NQV9RUF9UQUJMRV9FTkQoMTQpIH0sCi19OworI2RlZmluZSBFWFRFTkRFRF9TQVIgICAgICAgMjU1CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGRlZmF1bHRfc2NhbGluZzRbMl1bMTZdID0gewogICAgIHsgIDYsIDEzLCAyMCwgMjgsIDEzLCAyMCwgMjgsIDMyLApAQCAtMTI3LDQ3ICs4NSw2OCBAQAogICAgIHsgNTIsIDE4NDMyMCAgICB9LAogfTsKIAotc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX2hyZF9wYXJhbWV0ZXJzKEgyNjRDb250ZXh0ICpoLCBTUFMgKnNwcykKK3N0YXRpYyB2b2lkIHJlbW92ZV9wcHMoSDI2NFBhcmFtU2V0cyAqcywgaW50IGlkKQoreworICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+cHBzX2xpc3RbaWRdKTsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3NwcyhIMjY0UGFyYW1TZXRzICpzLCBpbnQgaWQpCit7CisjaWYgMAorICAgIGludCBpOworICAgIGlmIChzLT5zcHNfbGlzdFtpZF0pIHsKKyAgICAgICAgLyogZHJvcCBhbGwgUFBTIHRoYXQgZGVwZW5kIG9uIHRoaXMgU1BTICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5wcHNfbGlzdCk7IGkrKykKKyAgICAgICAgICAgIGlmIChzLT5wcHNfbGlzdFtpXSAmJiAoKFBQUyopcy0+cHBzX2xpc3RbaV0tPmRhdGEpLT5zcHNfaWQgPT0gaWQpCisgICAgICAgICAgICAgICAgcmVtb3ZlX3BwcyhzLCBpKTsKKyAgICB9CisjZW5kaWYKKyAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnNwc19saXN0W2lkXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9ocmRfcGFyYW1ldGVycyhHZXRCaXRDb250ZXh0ICpnYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQUyAqc3BzKQogewogICAgIGludCBjcGJfY291bnQsIGk7Ci0gICAgY3BiX2NvdW50ID0gZ2V0X3VlX2dvbG9tYl8zMSgmaC0+Z2IpICsgMTsKKyAgICBjcGJfY291bnQgPSBnZXRfdWVfZ29sb21iXzMxKGdiKSArIDE7CiAKICAgICBpZiAoY3BiX2NvdW50ID4gMzJVKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY3BiX2NvdW50ICVkIGludmFsaWRcbiIsIGNwYl9jb3VudCk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY3BiX2NvdW50ICVkIGludmFsaWRcbiIsIGNwYl9jb3VudCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGdldF9iaXRzKCZoLT5nYiwgNCk7IC8qIGJpdF9yYXRlX3NjYWxlICovCi0gICAgZ2V0X2JpdHMoJmgtPmdiLCA0KTsgLyogY3BiX3NpemVfc2NhbGUgKi8KKyAgICBnZXRfYml0cyhnYiwgNCk7IC8qIGJpdF9yYXRlX3NjYWxlICovCisgICAgZ2V0X2JpdHMoZ2IsIDQpOyAvKiBjcGJfc2l6ZV9zY2FsZSAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBjcGJfY291bnQ7IGkrKykgewotICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoJmgtPmdiKTsgLyogYml0X3JhdGVfdmFsdWVfbWludXMxICovCi0gICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZygmaC0+Z2IpOyAvKiBjcGJfc2l6ZV92YWx1ZV9taW51czEgKi8KLSAgICAgICAgZ2V0X2JpdHMxKCZoLT5nYik7ICAgICAgICAgIC8qIGNicl9mbGFnICovCisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7IC8qIGJpdF9yYXRlX3ZhbHVlX21pbnVzMSAqLworICAgICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAvKiBjcGJfc2l6ZV92YWx1ZV9taW51czEgKi8KKyAgICAgICAgZ2V0X2JpdHMxKGdiKTsgICAgICAgICAgLyogY2JyX2ZsYWcgKi8KICAgICB9Ci0gICAgc3BzLT5pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCA9IGdldF9iaXRzKCZoLT5nYiwgNSkgKyAxOwotICAgIHNwcy0+Y3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoICAgICAgICAgPSBnZXRfYml0cygmaC0+Z2IsIDUpICsgMTsKLSAgICBzcHMtPmRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoICAgICAgICAgID0gZ2V0X2JpdHMoJmgtPmdiLCA1KSArIDE7Ci0gICAgc3BzLT50aW1lX29mZnNldF9sZW5ndGggICAgICAgICAgICAgICA9IGdldF9iaXRzKCZoLT5nYiwgNSk7CisgICAgc3BzLT5pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCA9IGdldF9iaXRzKGdiLCA1KSArIDE7CisgICAgc3BzLT5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGggICAgICAgICA9IGdldF9iaXRzKGdiLCA1KSArIDE7CisgICAgc3BzLT5kcGJfb3V0cHV0X2RlbGF5X2xlbmd0aCAgICAgICAgICA9IGdldF9iaXRzKGdiLCA1KSArIDE7CisgICAgc3BzLT50aW1lX29mZnNldF9sZW5ndGggICAgICAgICAgICAgICA9IGdldF9iaXRzKGdiLCA1KTsKICAgICBzcHMtPmNwYl9jbnQgICAgICAgICAgICAgICAgICAgICAgICAgID0gY3BiX2NvdW50OwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBkZWNvZGVfdnVpX3BhcmFtZXRlcnMoSDI2NENvbnRleHQgKmgsIFNQUyAqc3BzKQorc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX3Z1aV9wYXJhbWV0ZXJzKEdldEJpdENvbnRleHQgKmdiLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1BTICpzcHMpCiB7CiAgICAgaW50IGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZzsKICAgICB1bnNpZ25lZCBpbnQgYXNwZWN0X3JhdGlvX2lkYzsKIAotICAgIGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CiAKICAgICBpZiAoYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgIGFzcGVjdF9yYXRpb19pZGMgPSBnZXRfYml0cygmaC0+Z2IsIDgpOworICAgICAgICBhc3BlY3RfcmF0aW9faWRjID0gZ2V0X2JpdHMoZ2IsIDgpOwogICAgICAgICBpZiAoYXNwZWN0X3JhdGlvX2lkYyA9PSBFWFRFTkRFRF9TQVIpIHsKLSAgICAgICAgICAgIHNwcy0+c2FyLm51bSA9IGdldF9iaXRzKCZoLT5nYiwgMTYpOwotICAgICAgICAgICAgc3BzLT5zYXIuZGVuID0gZ2V0X2JpdHMoJmgtPmdiLCAxNik7CisgICAgICAgICAgICBzcHMtPnNhci5udW0gPSBnZXRfYml0cyhnYiwgMTYpOworICAgICAgICAgICAgc3BzLT5zYXIuZGVuID0gZ2V0X2JpdHMoZ2IsIDE2KTsKICAgICAgICAgfSBlbHNlIGlmIChhc3BlY3RfcmF0aW9faWRjIDwgRkZfQVJSQVlfRUxFTVMoZmZfaDI2NF9waXhlbF9hc3BlY3QpKSB7CiAgICAgICAgICAgICBzcHMtPnNhciA9IGZmX2gyNjRfcGl4ZWxfYXNwZWN0W2FzcGVjdF9yYXRpb19pZGNdOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGFzcGVjdCByYXRpb1xuIik7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgYXNwZWN0IHJhdGlvXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE3NSw0NiArMTU0LDQ4IEBACiAgICAgICAgIHNwcy0+c2FyLmRlbiA9IDA7CiAgICAgfQogCi0gICAgaWYgKGdldF9iaXRzMSgmaC0+Z2IpKSAgICAgIC8qIG92ZXJzY2FuX2luZm9fcHJlc2VudF9mbGFnICovCi0gICAgICAgIGdldF9iaXRzMSgmaC0+Z2IpOyAgICAgIC8qIG92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWcgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgICAgICAvKiBvdmVyc2Nhbl9pbmZvX3ByZXNlbnRfZmxhZyAqLworICAgICAgICBnZXRfYml0czEoZ2IpOyAgICAgIC8qIG92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWcgKi8KIAotICAgIHNwcy0+dmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgc3BzLT52aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgIGlmIChzcHMtPnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZykgewotICAgICAgICBnZXRfYml0cygmaC0+Z2IsIDMpOyAgICAgICAgICAgICAgICAgLyogdmlkZW9fZm9ybWF0ICovCi0gICAgICAgIHNwcy0+ZnVsbF9yYW5nZSA9IGdldF9iaXRzMSgmaC0+Z2IpOyAvKiB2aWRlb19mdWxsX3JhbmdlX2ZsYWcgKi8KKyAgICAgICAgZ2V0X2JpdHMoZ2IsIDMpOyAgICAgICAgICAgICAgICAgLyogdmlkZW9fZm9ybWF0ICovCisgICAgICAgIHNwcy0+ZnVsbF9yYW5nZSA9IGdldF9iaXRzMShnYik7IC8qIHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyAqLwogCi0gICAgICAgIHNwcy0+Y29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICBzcHMtPmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgICAgICBpZiAoc3BzLT5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgICAgICBzcHMtPmNvbG9yX3ByaW1hcmllcyA9IGdldF9iaXRzKCZoLT5nYiwgOCk7IC8qIGNvbG91cl9wcmltYXJpZXMgKi8KLSAgICAgICAgICAgIHNwcy0+Y29sb3JfdHJjICAgICAgID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsgLyogdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzICovCi0gICAgICAgICAgICBzcHMtPmNvbG9yc3BhY2UgICAgICA9IGdldF9iaXRzKCZoLT5nYiwgOCk7IC8qIG1hdHJpeF9jb2VmZmljaWVudHMgKi8KLSAgICAgICAgICAgIGlmIChzcHMtPmNvbG9yX3ByaW1hcmllcyA+PSBBVkNPTF9QUklfTkIpCisgICAgICAgICAgICBzcHMtPmNvbG9yX3ByaW1hcmllcyA9IGdldF9iaXRzKGdiLCA4KTsgLyogY29sb3VyX3ByaW1hcmllcyAqLworICAgICAgICAgICAgc3BzLT5jb2xvcl90cmMgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7IC8qIHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyAqLworICAgICAgICAgICAgc3BzLT5jb2xvcnNwYWNlICAgICAgPSBnZXRfYml0cyhnYiwgOCk7IC8qIG1hdHJpeF9jb2VmZmljaWVudHMgKi8KKworICAgICAgICAgICAgLy8gU2V0IGludmFsaWQgdmFsdWVzIHRvICJ1bnNwZWNpZmllZCIKKyAgICAgICAgICAgIGlmICghYXZfY29sb3JfcHJpbWFyaWVzX25hbWUoc3BzLT5jb2xvcl9wcmltYXJpZXMpKQogICAgICAgICAgICAgICAgIHNwcy0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgaWYgKHNwcy0+Y29sb3JfdHJjID49IEFWQ09MX1RSQ19OQikKKyAgICAgICAgICAgIGlmICghYXZfY29sb3JfdHJhbnNmZXJfbmFtZShzcHMtPmNvbG9yX3RyYykpCiAgICAgICAgICAgICAgICAgc3BzLT5jb2xvcl90cmMgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICBpZiAoc3BzLT5jb2xvcnNwYWNlID49IEFWQ09MX1NQQ19OQikKKyAgICAgICAgICAgIGlmICghYXZfY29sb3Jfc3BhY2VfbmFtZShzcHMtPmNvbG9yc3BhY2UpKQogICAgICAgICAgICAgICAgIHNwcy0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19VTlNQRUNJRklFRDsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qIGNocm9tYV9sb2NhdGlvbl9pbmZvX3ByZXNlbnRfZmxhZyAqLwotICAgIGlmIChnZXRfYml0czEoJmgtPmdiKSkgeworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CiAgICAgICAgIC8qIGNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZV90b3BfZmllbGQgKi8KLSAgICAgICAgaC0+YXZjdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyAxOwotICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7ICAvKiBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uX3R5cGVfYm90dG9tX2ZpZWxkICovCisgICAgICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gZ2V0X3VlX2dvbG9tYihnYikgKyAxOworICAgICAgICBnZXRfdWVfZ29sb21iKGdiKTsgIC8qIGNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZV9ib3R0b21fZmllbGQgKi8KICAgICB9CiAKLSAgICBpZiAoc2hvd19iaXRzMSgmaC0+Z2IpICYmIGdldF9iaXRzX2xlZnQoJmgtPmdiKSA8IDEwKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUcnVuY2F0ZWQgVlVJXG4iKTsKKyAgICBpZiAoc2hvd19iaXRzMShnYikgJiYgZ2V0X2JpdHNfbGVmdChnYikgPCAxMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVHJ1bmNhdGVkIFZVSVxuIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHNwcy0+dGltaW5nX2luZm9fcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgc3BzLT50aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgIGlmIChzcHMtPnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgewotICAgICAgICB1bnNpZ25lZCBudW1fdW5pdHNfaW5fdGljayA9IGdldF9iaXRzX2xvbmcoJmgtPmdiLCAzMik7Ci0gICAgICAgIHVuc2lnbmVkIHRpbWVfc2NhbGUgICAgICAgID0gZ2V0X2JpdHNfbG9uZygmaC0+Z2IsIDMyKTsKKyAgICAgICAgdW5zaWduZWQgbnVtX3VuaXRzX2luX3RpY2sgPSBnZXRfYml0c19sb25nKGdiLCAzMik7CisgICAgICAgIHVuc2lnbmVkIHRpbWVfc2NhbGUgICAgICAgID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOwogICAgICAgICBpZiAoIW51bV91bml0c19pbl90aWNrIHx8ICF0aW1lX3NjYWxlKSB7Ci0gICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJ0aW1lX3NjYWxlL251bV91bml0c19pbl90aWNrIGludmFsaWQgb3IgdW5zdXBwb3J0ZWQgKCV1LyV1KVxuIiwKICAgICAgICAgICAgICAgICAgICB0aW1lX3NjYWxlLCBudW1fdW5pdHNfaW5fdGljayk7CiAgICAgICAgICAgICBzcHMtPnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IDA7CkBAIC0yMjIsNDEgKzIwMyw0MSBAQAogICAgICAgICAgICAgc3BzLT5udW1fdW5pdHNfaW5fdGljayA9IG51bV91bml0c19pbl90aWNrOwogICAgICAgICAgICAgc3BzLT50aW1lX3NjYWxlID0gdGltZV9zY2FsZTsKICAgICAgICAgfQotICAgICAgICBzcHMtPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICBzcHMtPmZpeGVkX2ZyYW1lX3JhdGVfZmxhZyA9IGdldF9iaXRzMShnYik7CiAgICAgfQogCi0gICAgc3BzLT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgc3BzLT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKICAgICBpZiAoc3BzLT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQotICAgICAgICBpZiAoZGVjb2RlX2hyZF9wYXJhbWV0ZXJzKGgsIHNwcykgPCAwKQorICAgICAgICBpZiAoZGVjb2RlX2hyZF9wYXJhbWV0ZXJzKGdiLCBhdmN0eCwgc3BzKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBzcHMtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICBzcHMtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgIGlmIChzcHMtPnZjbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcpCi0gICAgICAgIGlmIChkZWNvZGVfaHJkX3BhcmFtZXRlcnMoaCwgc3BzKSA8IDApCisgICAgICAgIGlmIChkZWNvZGVfaHJkX3BhcmFtZXRlcnMoZ2IsIGF2Y3R4LCBzcHMpIDwgMCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGlmIChzcHMtPm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgfHwKICAgICAgICAgc3BzLT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKQotICAgICAgICBnZXRfYml0czEoJmgtPmdiKTsgICAgIC8qIGxvd19kZWxheV9ocmRfZmxhZyAqLwotICAgIHNwcy0+cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKLSAgICBpZiAoIWdldF9iaXRzX2xlZnQoJmgtPmdiKSkKKyAgICAgICAgZ2V0X2JpdHMxKGdiKTsgICAgIC8qIGxvd19kZWxheV9ocmRfZmxhZyAqLworICAgIHNwcy0+cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIGlmICghZ2V0X2JpdHNfbGVmdChnYikpCiAgICAgICAgIHJldHVybiAwOwotICAgIHNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgPSBnZXRfYml0czEoJmgtPmdiKTsKKyAgICBzcHMtPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKICAgICBpZiAoc3BzLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZykgewotICAgICAgICBnZXRfYml0czEoJmgtPmdiKTsgICAgIC8qIG1vdGlvbl92ZWN0b3JzX292ZXJfcGljX2JvdW5kYXJpZXNfZmxhZyAqLwotICAgICAgICBnZXRfdWVfZ29sb21iKCZoLT5nYik7IC8qIG1heF9ieXRlc19wZXJfcGljX2Rlbm9tICovCi0gICAgICAgIGdldF91ZV9nb2xvbWIoJmgtPmdiKTsgLyogbWF4X2JpdHNfcGVyX21iX2Rlbm9tICovCi0gICAgICAgIGdldF91ZV9nb2xvbWIoJmgtPmdiKTsgLyogbG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWwgKi8KLSAgICAgICAgZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOyAvKiBsb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwgKi8KLSAgICAgICAgc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7Ci0gICAgICAgIGdldF91ZV9nb2xvbWIoJmgtPmdiKTsgLyptYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyovCisgICAgICAgIGdldF9iaXRzMShnYik7ICAgICAvKiBtb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcgKi8KKyAgICAgICAgZ2V0X3VlX2dvbG9tYihnYik7IC8qIG1heF9ieXRlc19wZXJfcGljX2Rlbm9tICovCisgICAgICAgIGdldF91ZV9nb2xvbWIoZ2IpOyAvKiBtYXhfYml0c19wZXJfbWJfZGVub20gKi8KKyAgICAgICAgZ2V0X3VlX2dvbG9tYihnYik7IC8qIGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsICovCisgICAgICAgIGdldF91ZV9nb2xvbWIoZ2IpOyAvKiBsb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwgKi8KKyAgICAgICAgc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgPSBnZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgZ2V0X3VlX2dvbG9tYihnYik7IC8qbWF4X2RlY19mcmFtZV9idWZmZXJpbmcqLwogCi0gICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZoLT5nYikgPCAwKSB7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDApIHsKICAgICAgICAgICAgIHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzICAgICAgICAgPSAwOwogICAgICAgICAgICAgc3BzLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyA9IDA7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgPiAxNlUKICAgICAgICAgICAgIC8qIG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nIHx8IG1heF9kZWNfZnJhbWVfYnVmZmVyaW5nID4gMTYgKi8pIHsKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIkNsaXBwaW5nIGlsbGVnYWwgbnVtX3Jlb3JkZXJfZnJhbWVzICVkXG4iLAogICAgICAgICAgICAgICAgICAgIHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzKTsKICAgICAgICAgICAgIHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0gMTY7CkBAIC0yNjcsMjggKzI0OCwzNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkZWNvZGVfc2NhbGluZ19saXN0KEgyNjRDb250ZXh0ICpoLCB1aW50OF90ICpmYWN0b3JzLCBpbnQgc2l6ZSwKK3N0YXRpYyBpbnQgZGVjb2RlX3NjYWxpbmdfbGlzdChHZXRCaXRDb250ZXh0ICpnYiwgdWludDhfdCAqZmFjdG9ycywgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmp2dF9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmYWxsYmFja19saXN0KQogewogICAgIGludCBpLCBsYXN0ID0gOCwgbmV4dCA9IDg7Ci0gICAgY29uc3QgdWludDhfdCAqc2NhbiA9IHNpemUgPT0gMTYgPyB6aWd6YWdfc2NhbiA6IGZmX3ppZ3phZ19kaXJlY3Q7Ci0gICAgaWYgKCFnZXRfYml0czEoJmgtPmdiKSkgLyogbWF0cml4IG5vdCB3cml0dGVuLCB3ZSB1c2UgdGhlIHByZWRpY3RlZCBvbmUgKi8KKyAgICBjb25zdCB1aW50OF90ICpzY2FuID0gc2l6ZSA9PSAxNiA/IGZmX3ppZ3phZ19zY2FuIDogZmZfemlnemFnX2RpcmVjdDsKKyAgICBpZiAoIWdldF9iaXRzMShnYikpIC8qIG1hdHJpeCBub3Qgd3JpdHRlbiwgd2UgdXNlIHRoZSBwcmVkaWN0ZWQgb25lICovCiAgICAgICAgIG1lbWNweShmYWN0b3JzLCBmYWxsYmFja19saXN0LCBzaXplICogc2l6ZW9mKHVpbnQ4X3QpKTsKICAgICBlbHNlCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChuZXh0KQotICAgICAgICAgICAgICAgIG5leHQgPSAobGFzdCArIGdldF9zZV9nb2xvbWIoJmgtPmdiKSkgJiAweGZmOworICAgICAgICAgICAgaWYgKG5leHQpIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgIGlmICh2IDwgLTEyOCB8fCB2ID4gMTI3KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJkZWx0YSBzY2FsZSAlZCBpcyBpbnZhbGlkXG4iLCB2KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5leHQgPSAobGFzdCArIHYpICYgMHhmZjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghaSAmJiAhbmV4dCkgeyAvKiBtYXRyaXggbm90IHdyaXR0ZW4sIHdlIHVzZSB0aGUgcHJlc2V0IG9uZSAqLwogICAgICAgICAgICAgICAgIG1lbWNweShmYWN0b3JzLCBqdnRfbGlzdCwgc2l6ZSAqIHNpemVvZih1aW50OF90KSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsYXN0ID0gZmFjdG9yc1tzY2FuW2ldXSA9IG5leHQgPyBuZXh0IDogbGFzdDsKICAgICAgICAgfQorICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBkZWNvZGVfc2NhbGluZ19tYXRyaWNlcyhIMjY0Q29udGV4dCAqaCwgU1BTICpzcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUFMgKnBwcywgaW50IGlzX3NwcywKKy8qIHJldHVybnMgbm9uIHplcm8gaWYgdGhlIHByb3ZpZGVkIFNQUyBzY2FsaW5nIG1hdHJpeCBoYXMgYmVlbiBmaWxsZWQgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX3NjYWxpbmdfbWF0cmljZXMoR2V0Qml0Q29udGV4dCAqZ2IsIGNvbnN0IFNQUyAqc3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUFBTICpwcHMsIGludCBpc19zcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KCpzY2FsaW5nX21hdHJpeDQpWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QoKnNjYWxpbmdfbWF0cml4OClbNjRdKQogewpAQCAtMjk5LDU4ICsyODgsODMgQEAKICAgICAgICAgZmFsbGJhY2tfc3BzID8gc3BzLT5zY2FsaW5nX21hdHJpeDhbMF0gOiBkZWZhdWx0X3NjYWxpbmc4WzBdLAogICAgICAgICBmYWxsYmFja19zcHMgPyBzcHMtPnNjYWxpbmdfbWF0cml4OFszXSA6IGRlZmF1bHRfc2NhbGluZzhbMV0KICAgICB9OwotICAgIGlmIChnZXRfYml0czEoJmgtPmdiKSkgewotICAgICAgICBzcHMtPnNjYWxpbmdfbWF0cml4X3ByZXNlbnQgfD0gaXNfc3BzOwotICAgICAgICBkZWNvZGVfc2NhbGluZ19saXN0KGgsIHNjYWxpbmdfbWF0cml4NFswXSwgMTYsIGRlZmF1bHRfc2NhbGluZzRbMF0sIGZhbGxiYWNrWzBdKTsgICAgICAgIC8vIEludHJhLCBZCi0gICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg0WzFdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFswXSwgc2NhbGluZ19tYXRyaXg0WzBdKTsgLy8gSW50cmEsIENyCi0gICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg0WzJdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFswXSwgc2NhbGluZ19tYXRyaXg0WzFdKTsgLy8gSW50cmEsIENiCi0gICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg0WzNdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFsxXSwgZmFsbGJhY2tbMV0pOyAgICAgICAgLy8gSW50ZXIsIFkKLSAgICAgICAgZGVjb2RlX3NjYWxpbmdfbGlzdChoLCBzY2FsaW5nX21hdHJpeDRbNF0sIDE2LCBkZWZhdWx0X3NjYWxpbmc0WzFdLCBzY2FsaW5nX21hdHJpeDRbM10pOyAvLyBJbnRlciwgQ3IKLSAgICAgICAgZGVjb2RlX3NjYWxpbmdfbGlzdChoLCBzY2FsaW5nX21hdHJpeDRbNV0sIDE2LCBkZWZhdWx0X3NjYWxpbmc0WzFdLCBzY2FsaW5nX21hdHJpeDRbNF0pOyAvLyBJbnRlciwgQ2IKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICByZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg0WzBdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFswXSwgZmFsbGJhY2tbMF0pOyAgICAgICAgLy8gSW50cmEsIFkKKyAgICAgICAgcmV0IHw9IGRlY29kZV9zY2FsaW5nX2xpc3QoZ2IsIHNjYWxpbmdfbWF0cml4NFsxXSwgMTYsIGRlZmF1bHRfc2NhbGluZzRbMF0sIHNjYWxpbmdfbWF0cml4NFswXSk7IC8vIEludHJhLCBDcgorICAgICAgICByZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg0WzJdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFswXSwgc2NhbGluZ19tYXRyaXg0WzFdKTsgLy8gSW50cmEsIENiCisgICAgICAgIHJldCB8PSBkZWNvZGVfc2NhbGluZ19saXN0KGdiLCBzY2FsaW5nX21hdHJpeDRbM10sIDE2LCBkZWZhdWx0X3NjYWxpbmc0WzFdLCBmYWxsYmFja1sxXSk7ICAgICAgICAvLyBJbnRlciwgWQorICAgICAgICByZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg0WzRdLCAxNiwgZGVmYXVsdF9zY2FsaW5nNFsxXSwgc2NhbGluZ19tYXRyaXg0WzNdKTsgLy8gSW50ZXIsIENyCisgICAgICAgIHJldCB8PSBkZWNvZGVfc2NhbGluZ19saXN0KGdiLCBzY2FsaW5nX21hdHJpeDRbNV0sIDE2LCBkZWZhdWx0X3NjYWxpbmc0WzFdLCBzY2FsaW5nX21hdHJpeDRbNF0pOyAvLyBJbnRlciwgQ2IKICAgICAgICAgaWYgKGlzX3NwcyB8fCBwcHMtPnRyYW5zZm9ybV84eDhfbW9kZSkgewotICAgICAgICAgICAgZGVjb2RlX3NjYWxpbmdfbGlzdChoLCBzY2FsaW5nX21hdHJpeDhbMF0sIDY0LCBkZWZhdWx0X3NjYWxpbmc4WzBdLCBmYWxsYmFja1syXSk7IC8vIEludHJhLCBZCi0gICAgICAgICAgICBkZWNvZGVfc2NhbGluZ19saXN0KGgsIHNjYWxpbmdfbWF0cml4OFszXSwgNjQsIGRlZmF1bHRfc2NhbGluZzhbMV0sIGZhbGxiYWNrWzNdKTsgLy8gSW50ZXIsIFkKKyAgICAgICAgICAgIHJldCB8PSBkZWNvZGVfc2NhbGluZ19saXN0KGdiLCBzY2FsaW5nX21hdHJpeDhbMF0sIDY0LCBkZWZhdWx0X3NjYWxpbmc4WzBdLCBmYWxsYmFja1syXSk7IC8vIEludHJhLCBZCisgICAgICAgICAgICByZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg4WzNdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFsxXSwgZmFsbGJhY2tbM10pOyAvLyBJbnRlciwgWQogICAgICAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgewotICAgICAgICAgICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg4WzFdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFswXSwgc2NhbGluZ19tYXRyaXg4WzBdKTsgLy8gSW50cmEsIENyCi0gICAgICAgICAgICAgICAgZGVjb2RlX3NjYWxpbmdfbGlzdChoLCBzY2FsaW5nX21hdHJpeDhbNF0sIDY0LCBkZWZhdWx0X3NjYWxpbmc4WzFdLCBzY2FsaW5nX21hdHJpeDhbM10pOyAvLyBJbnRlciwgQ3IKLSAgICAgICAgICAgICAgICBkZWNvZGVfc2NhbGluZ19saXN0KGgsIHNjYWxpbmdfbWF0cml4OFsyXSwgNjQsIGRlZmF1bHRfc2NhbGluZzhbMF0sIHNjYWxpbmdfbWF0cml4OFsxXSk7IC8vIEludHJhLCBDYgotICAgICAgICAgICAgICAgIGRlY29kZV9zY2FsaW5nX2xpc3QoaCwgc2NhbGluZ19tYXRyaXg4WzVdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFsxXSwgc2NhbGluZ19tYXRyaXg4WzRdKTsgLy8gSW50ZXIsIENiCisgICAgICAgICAgICAgICAgcmV0IHw9IGRlY29kZV9zY2FsaW5nX2xpc3QoZ2IsIHNjYWxpbmdfbWF0cml4OFsxXSwgNjQsIGRlZmF1bHRfc2NhbGluZzhbMF0sIHNjYWxpbmdfbWF0cml4OFswXSk7IC8vIEludHJhLCBDcgorICAgICAgICAgICAgICAgIHJldCB8PSBkZWNvZGVfc2NhbGluZ19saXN0KGdiLCBzY2FsaW5nX21hdHJpeDhbNF0sIDY0LCBkZWZhdWx0X3NjYWxpbmc4WzFdLCBzY2FsaW5nX21hdHJpeDhbM10pOyAvLyBJbnRlciwgQ3IKKyAgICAgICAgICAgICAgICByZXQgfD0gZGVjb2RlX3NjYWxpbmdfbGlzdChnYiwgc2NhbGluZ19tYXRyaXg4WzJdLCA2NCwgZGVmYXVsdF9zY2FsaW5nOFswXSwgc2NhbGluZ19tYXRyaXg4WzFdKTsgLy8gSW50cmEsIENiCisgICAgICAgICAgICAgICAgcmV0IHw9IGRlY29kZV9zY2FsaW5nX2xpc3QoZ2IsIHNjYWxpbmdfbWF0cml4OFs1XSwgNjQsIGRlZmF1bHRfc2NhbGluZzhbMV0sIHNjYWxpbmdfbWF0cml4OFs0XSk7IC8vIEludGVyLCBDYgogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgcmV0ID0gaXNfc3BzOwogICAgIH0KKworICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBmZl9oMjY0X2RlY29kZV9zZXFfcGFyYW1ldGVyX3NldChIMjY0Q29udGV4dCAqaCwgaW50IGlnbm9yZV90cnVuY2F0aW9uKQordm9pZCBmZl9oMjY0X3BzX3VuaW5pdChIMjY0UGFyYW1TZXRzICpwcykKIHsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU1BTX0NPVU5UOyBpKyspCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcHMtPnNwc19saXN0W2ldKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfUFBTX0NPVU5UOyBpKyspCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcHMtPnBwc19saXN0W2ldKTsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmcHMtPnNwc19yZWYpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcHMtPnBwc19yZWYpOworCisgICAgcHMtPnBwcyA9IE5VTEw7CisgICAgcHMtPnNwcyA9IE5VTEw7Cit9CisKK2ludCBmZl9oMjY0X2RlY29kZV9zZXFfcGFyYW1ldGVyX3NldChHZXRCaXRDb250ZXh0ICpnYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRQYXJhbVNldHMgKnBzLCBpbnQgaWdub3JlX3RydW5jYXRpb24pCit7CisgICAgQVZCdWZmZXJSZWYgKnNwc19idWY7CiAgICAgaW50IHByb2ZpbGVfaWRjLCBsZXZlbF9pZGMsIGNvbnN0cmFpbnRfc2V0X2ZsYWdzID0gMDsKICAgICB1bnNpZ25lZCBpbnQgc3BzX2lkOwogICAgIGludCBpLCBsb2cyX21heF9mcmFtZV9udW1fbWludXM0OwogICAgIFNQUyAqc3BzOworICAgIGludCByZXQ7CiAKLSAgICBzcHMgPSBhdl9tYWxsb2N6KHNpemVvZihTUFMpKTsKLSAgICBpZiAoIXNwcykKKyAgICBzcHNfYnVmID0gYXZfYnVmZmVyX2FsbG9jeihzaXplb2YoKnNwcykpOworICAgIGlmICghc3BzX2J1ZikKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzcHMgPSAoU1BTKilzcHNfYnVmLT5kYXRhOwogCi0gICAgc3BzLT5kYXRhX3NpemUgPSBoLT5nYi5idWZmZXJfZW5kIC0gaC0+Z2IuYnVmZmVyOworICAgIHNwcy0+ZGF0YV9zaXplID0gZ2ItPmJ1ZmZlcl9lbmQgLSBnYi0+YnVmZmVyOwogICAgIGlmIChzcHMtPmRhdGFfc2l6ZSA+IHNpemVvZihzcHMtPmRhdGEpKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUcnVuY2F0aW5nIGxpa2VseSBvdmVyc2l6ZWQgU1BTXG4iKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJUcnVuY2F0aW5nIGxpa2VseSBvdmVyc2l6ZWQgU1BTXG4iKTsKICAgICAgICAgc3BzLT5kYXRhX3NpemUgPSBzaXplb2Yoc3BzLT5kYXRhKTsKICAgICB9Ci0gICAgbWVtY3B5KHNwcy0+ZGF0YSwgaC0+Z2IuYnVmZmVyLCBzcHMtPmRhdGFfc2l6ZSk7CisgICAgbWVtY3B5KHNwcy0+ZGF0YSwgZ2ItPmJ1ZmZlciwgc3BzLT5kYXRhX3NpemUpOwogCi0gICAgcHJvZmlsZV9pZGMgICAgICAgICAgID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsKLSAgICBjb25zdHJhaW50X3NldF9mbGFncyB8PSBnZXRfYml0czEoJmgtPmdiKSA8PCAwOyAgIC8vIGNvbnN0cmFpbnRfc2V0MF9mbGFnCi0gICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKCZoLT5nYikgPDwgMTsgICAvLyBjb25zdHJhaW50X3NldDFfZmxhZwotICAgIGNvbnN0cmFpbnRfc2V0X2ZsYWdzIHw9IGdldF9iaXRzMSgmaC0+Z2IpIDw8IDI7ICAgLy8gY29uc3RyYWludF9zZXQyX2ZsYWcKLSAgICBjb25zdHJhaW50X3NldF9mbGFncyB8PSBnZXRfYml0czEoJmgtPmdiKSA8PCAzOyAgIC8vIGNvbnN0cmFpbnRfc2V0M19mbGFnCi0gICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKCZoLT5nYikgPDwgNDsgICAvLyBjb25zdHJhaW50X3NldDRfZmxhZwotICAgIGNvbnN0cmFpbnRfc2V0X2ZsYWdzIHw9IGdldF9iaXRzMSgmaC0+Z2IpIDw8IDU7ICAgLy8gY29uc3RyYWludF9zZXQ1X2ZsYWcKLSAgICBza2lwX2JpdHMoJmgtPmdiLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2VydmVkX3plcm9fMmJpdHMKLSAgICBsZXZlbF9pZGMgPSBnZXRfYml0cygmaC0+Z2IsIDgpOwotICAgIHNwc19pZCAgICA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKKyAgICBwcm9maWxlX2lkYyAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKGdiKSA8PCAwOyAgIC8vIGNvbnN0cmFpbnRfc2V0MF9mbGFnCisgICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKGdiKSA8PCAxOyAgIC8vIGNvbnN0cmFpbnRfc2V0MV9mbGFnCisgICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKGdiKSA8PCAyOyAgIC8vIGNvbnN0cmFpbnRfc2V0Ml9mbGFnCisgICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKGdiKSA8PCAzOyAgIC8vIGNvbnN0cmFpbnRfc2V0M19mbGFnCisgICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKGdiKSA8PCA0OyAgIC8vIGNvbnN0cmFpbnRfc2V0NF9mbGFnCisgICAgY29uc3RyYWludF9zZXRfZmxhZ3MgfD0gZ2V0X2JpdHMxKGdiKSA8PCA1OyAgIC8vIGNvbnN0cmFpbnRfc2V0NV9mbGFnCisgICAgc2tpcF9iaXRzKGdiLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2VydmVkX3plcm9fMmJpdHMKKyAgICBsZXZlbF9pZGMgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgc3BzX2lkICAgID0gZ2V0X3VlX2dvbG9tYl8zMShnYik7CiAKICAgICBpZiAoc3BzX2lkID49IE1BWF9TUFNfQ09VTlQpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJzcHNfaWQgJXUgb3V0IG9mIHJhbmdlXG4iLCBzcHNfaWQpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInNwc19pZCAldSBvdXQgb2YgcmFuZ2VcbiIsIHNwc19pZCk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKQEAgLTM3NywxMjMgKzM5MSwxMzMgQEAKICAgICAgICAgc3BzLT5wcm9maWxlX2lkYyA9PSAxMjggfHwgIC8vIE11bHRpdmlldyBIaWdoIHByb2ZpbGUgKE1WQykKICAgICAgICAgc3BzLT5wcm9maWxlX2lkYyA9PSAxMzggfHwgIC8vIE11bHRpdmlldyBEZXB0aCBIaWdoIHByb2ZpbGUgKE1WQ0QpCiAgICAgICAgIHNwcy0+cHJvZmlsZV9pZGMgPT0gMTQ0KSB7ICAvLyBvbGQgSGlnaDQ0NCBwcm9maWxlCi0gICAgICAgIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPSBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYik7CisgICAgICAgIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPSBnZXRfdWVfZ29sb21iXzMxKGdiKTsKICAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPiAzVSkgewotICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGgtPmF2Y3R4LCAiY2hyb21hX2Zvcm1hdF9pZGMgJXUiLAorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiY2hyb21hX2Zvcm1hdF9pZGMgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9IGVsc2UgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgewotICAgICAgICAgICAgc3BzLT5yZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgICAgICAgICAgc3BzLT5yZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZyA9IGdldF9iaXRzMShnYik7CiAgICAgICAgICAgICBpZiAoc3BzLT5yZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2VwYXJhdGUgY29sb3IgcGxhbmVzIGFyZSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInNlcGFyYXRlIGNvbG9yIHBsYW5lcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHNwcy0+Yml0X2RlcHRoX2x1bWEgICA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSArIDg7Ci0gICAgICAgIHNwcy0+Yml0X2RlcHRoX2Nocm9tYSA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSArIDg7CisgICAgICAgIHNwcy0+Yml0X2RlcHRoX2x1bWEgICA9IGdldF91ZV9nb2xvbWIoZ2IpICsgODsKKyAgICAgICAgc3BzLT5iaXRfZGVwdGhfY2hyb21hID0gZ2V0X3VlX2dvbG9tYihnYikgKyA4OwogICAgICAgICBpZiAoc3BzLT5iaXRfZGVwdGhfY2hyb21hICE9IHNwcy0+Yml0X2RlcHRoX2x1bWEpIHsKLSAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShoLT5hdmN0eCwKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlmZmVyZW50IGNocm9tYSBhbmQgbHVtYSBiaXQgZGVwdGgiKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogICAgICAgICBpZiAoc3BzLT5iaXRfZGVwdGhfbHVtYSAgIDwgOCB8fCBzcHMtPmJpdF9kZXB0aF9sdW1hICAgPiAxNCB8fAogICAgICAgICAgICAgc3BzLT5iaXRfZGVwdGhfY2hyb21hIDwgOCB8fCBzcHMtPmJpdF9kZXB0aF9jaHJvbWEgPiAxNCkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIGJpdCBkZXB0aCB2YWx1ZSAoJWQsICVkKVxuIiwKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBiaXQgZGVwdGggdmFsdWUgKCVkLCAlZClcbiIsCiAgICAgICAgICAgICAgICAgICAgc3BzLT5iaXRfZGVwdGhfbHVtYSwgc3BzLT5iaXRfZGVwdGhfY2hyb21hKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQotICAgICAgICBzcHMtPnRyYW5zZm9ybV9ieXBhc3MgPSBnZXRfYml0czEoJmgtPmdiKTsKLSAgICAgICAgZGVjb2RlX3NjYWxpbmdfbWF0cmljZXMoaCwgc3BzLCBOVUxMLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHMtPnNjYWxpbmdfbWF0cml4NCwgc3BzLT5zY2FsaW5nX21hdHJpeDgpOworICAgICAgICBzcHMtPnRyYW5zZm9ybV9ieXBhc3MgPSBnZXRfYml0czEoZ2IpOworICAgICAgICByZXQgPSBkZWNvZGVfc2NhbGluZ19tYXRyaWNlcyhnYiwgc3BzLCBOVUxMLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHMtPnNjYWxpbmdfbWF0cml4NCwgc3BzLT5zY2FsaW5nX21hdHJpeDgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgc3BzLT5zY2FsaW5nX21hdHJpeF9wcmVzZW50IHw9IHJldDsKICAgICB9IGVsc2UgewogICAgICAgICBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID0gMTsKICAgICAgICAgc3BzLT5iaXRfZGVwdGhfbHVtYSAgICA9IDg7CiAgICAgICAgIHNwcy0+Yml0X2RlcHRoX2Nocm9tYSAgPSA4OwogICAgIH0KIAotICAgIGxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisgICAgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA9IGdldF91ZV9nb2xvbWIoZ2IpOwogICAgIGlmIChsb2cyX21heF9mcmFtZV9udW1fbWludXM0IDwgTUlOX0xPRzJfTUFYX0ZSQU1FX05VTSAtIDQgfHwKICAgICAgICAgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCA+IE1BWF9MT0cyX01BWF9GUkFNRV9OVU0gLSA0KSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJsb2cyX21heF9mcmFtZV9udW1fbWludXM0IG91dCBvZiByYW5nZSAoMC0xMik6ICVkXG4iLAogICAgICAgICAgICAgICAgbG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAgICAgc3BzLT5sb2cyX21heF9mcmFtZV9udW0gPSBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNDsKIAotICAgIHNwcy0+cG9jX3R5cGUgPSBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYik7CisgICAgc3BzLT5wb2NfdHlwZSA9IGdldF91ZV9nb2xvbWJfMzEoZ2IpOwogCiAgICAgaWYgKHNwcy0+cG9jX3R5cGUgPT0gMCkgeyAvLyBGSVhNRSAjZGVmaW5lCi0gICAgICAgIHVuc2lnbmVkIHQgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisgICAgICAgIHVuc2lnbmVkIHQgPSBnZXRfdWVfZ29sb21iKGdiKTsKICAgICAgICAgaWYgKHQ+MTIpIHsKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibG9nMl9tYXhfcG9jX2xzYiAoJWQpIGlzIG91dCBvZiByYW5nZVxuIiwgdCk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImxvZzJfbWF4X3BvY19sc2IgKCVkKSBpcyBvdXQgb2YgcmFuZ2VcbiIsIHQpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgICAgIHNwcy0+bG9nMl9tYXhfcG9jX2xzYiA9IHQgKyA0OwogICAgIH0gZWxzZSBpZiAoc3BzLT5wb2NfdHlwZSA9PSAxKSB7IC8vIEZJWE1FICNkZWZpbmUKLSAgICAgICAgc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOwotICAgICAgICBzcHMtPm9mZnNldF9mb3Jfbm9uX3JlZl9waWMgICAgICAgICAgID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOwotICAgICAgICBzcHMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCAgID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOwotICAgICAgICBzcHMtPnBvY19jeWNsZV9sZW5ndGggICAgICAgICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICBzcHMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgc3BzLT5vZmZzZXRfZm9yX25vbl9yZWZfcGljICAgICAgICAgICA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICBzcHMtPm9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZCAgID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgIHNwcy0+cG9jX2N5Y2xlX2xlbmd0aCAgICAgICAgICAgICAgICAgPSBnZXRfdWVfZ29sb21iKGdiKTsKIAogICAgICAgICBpZiAoKHVuc2lnbmVkKXNwcy0+cG9jX2N5Y2xlX2xlbmd0aCA+PQogICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZSkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgInBvY19jeWNsZV9sZW5ndGggb3ZlcmZsb3cgJWRcbiIsIHNwcy0+cG9jX2N5Y2xlX2xlbmd0aCk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3BzLT5wb2NfY3ljbGVfbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICBzcHMtPm9mZnNldF9mb3JfcmVmX2ZyYW1lW2ldID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAgICAgc3BzLT5vZmZzZXRfZm9yX3JlZl9mcmFtZVtpXSA9IGdldF9zZV9nb2xvbWIoZ2IpOwogICAgIH0gZWxzZSBpZiAoc3BzLT5wb2NfdHlwZSAhPSAyKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBQT0MgdHlwZSAlZFxuIiwgc3BzLT5wb2NfdHlwZSk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBQT0MgdHlwZSAlZFxuIiwgc3BzLT5wb2NfdHlwZSk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBzcHMtPnJlZl9mcmFtZV9jb3VudCA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKLSAgICBpZiAoaC0+YXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUycsICdNJywgJ1YnLCAnMicpKQorICAgIHNwcy0+cmVmX2ZyYW1lX2NvdW50ID0gZ2V0X3VlX2dvbG9tYl8zMShnYik7CisgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ1MnLCAnTScsICdWJywgJzInKSkKICAgICAgICAgc3BzLT5yZWZfZnJhbWVfY291bnQgPSBGRk1BWCgyLCBzcHMtPnJlZl9mcmFtZV9jb3VudCk7Ci0gICAgaWYgKHNwcy0+cmVmX2ZyYW1lX2NvdW50ID4gSDI2NF9NQVhfUElDVFVSRV9DT1VOVCAtIDIgfHwKLSAgICAgICAgc3BzLT5yZWZfZnJhbWVfY291bnQgPiAxNlUpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgaWYgKHNwcy0+cmVmX2ZyYW1lX2NvdW50ID4gTUFYX0RFTEFZRURfUElDX0NPVU5UKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgInRvbyBtYW55IHJlZmVyZW5jZSBmcmFtZXMgJWRcbiIsIHNwcy0+cmVmX2ZyYW1lX2NvdW50KTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KLSAgICBzcHMtPmdhcHNfaW5fZnJhbWVfbnVtX2FsbG93ZWRfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOwotICAgIHNwcy0+bWJfd2lkdGggICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpICsgMTsKLSAgICBzcHMtPm1iX2hlaWdodCAgICAgICAgICAgICAgICAgICAgICA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSArIDE7Ci0gICAgaWYgKCh1bnNpZ25lZClzcHMtPm1iX3dpZHRoICA+PSBJTlRfTUFYIC8gMTYgfHwKLSAgICAgICAgKHVuc2lnbmVkKXNwcy0+bWJfaGVpZ2h0ID49IElOVF9NQVggLyAxNiB8fAotICAgICAgICBhdl9pbWFnZV9jaGVja19zaXplKDE2ICogc3BzLT5tYl93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAqIHNwcy0+bWJfaGVpZ2h0LCAwLCBoLT5hdmN0eCkpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtYl93aWR0aC9oZWlnaHQgb3ZlcmZsb3dcbiIpOworICAgIHNwcy0+Z2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBzcHMtPm1iX3dpZHRoICAgICAgICAgICAgICAgICAgICAgICA9IGdldF91ZV9nb2xvbWIoZ2IpICsgMTsKKyAgICBzcHMtPm1iX2hlaWdodCAgICAgICAgICAgICAgICAgICAgICA9IGdldF91ZV9nb2xvbWIoZ2IpICsgMTsKKworICAgIHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICBpZiAoc3BzLT5tYl9oZWlnaHQgPj0gSU5UX01BWCAvIDJVKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaGVpZ2h0IG92ZXJmbG93XG4iKTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KKyAgICBzcHMtPm1iX2hlaWdodCAqPSAyIC0gc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnOwogCi0gICAgc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CiAgICAgaWYgKCFzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcpCi0gICAgICAgIHNwcy0+bWJfYWZmID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgICAgIHNwcy0+bWJfYWZmID0gZ2V0X2JpdHMxKGdiKTsKICAgICBlbHNlCiAgICAgICAgIHNwcy0+bWJfYWZmID0gMDsKIAotICAgIHNwcy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIGlmICgodW5zaWduZWQpc3BzLT5tYl93aWR0aCAgPj0gSU5UX01BWCAvIDE2IHx8CisgICAgICAgICh1bnNpZ25lZClzcHMtPm1iX2hlaWdodCA+PSBJTlRfTUFYIC8gMTYgfHwKKyAgICAgICAgYXZfaW1hZ2VfY2hlY2tfc2l6ZSgxNiAqIHNwcy0+bWJfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKiBzcHMtPm1iX2hlaWdodCwgMCwgYXZjdHgpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibWJfd2lkdGgvaGVpZ2h0IG92ZXJmbG93XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHNwcy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyA9IGdldF9iaXRzMShnYik7CiAKICNpZm5kZWYgQUxMT1dfSU5URVJMQUNFCiAgICAgaWYgKHNwcy0+bWJfYWZmKQotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiTUJBRkYgc3VwcG9ydCBub3QgaW5jbHVkZWQ7IGVuYWJsZSBpdCBhdCBjb21waWxlLXRpbWUuXG4iKTsKICNlbmRpZgotICAgIHNwcy0+Y3JvcCA9IGdldF9iaXRzMSgmaC0+Z2IpOworICAgIHNwcy0+Y3JvcCA9IGdldF9iaXRzMShnYik7CiAgICAgaWYgKHNwcy0+Y3JvcCkgewotICAgICAgICB1bnNpZ25lZCBpbnQgY3JvcF9sZWZ0ICAgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7Ci0gICAgICAgIHVuc2lnbmVkIGludCBjcm9wX3JpZ2h0ICA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKTsKLSAgICAgICAgdW5zaWduZWQgaW50IGNyb3BfdG9wICAgID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOwotICAgICAgICB1bnNpZ25lZCBpbnQgY3JvcF9ib3R0b20gPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7CisgICAgICAgIHVuc2lnbmVkIGludCBjcm9wX2xlZnQgICA9IGdldF91ZV9nb2xvbWIoZ2IpOworICAgICAgICB1bnNpZ25lZCBpbnQgY3JvcF9yaWdodCAgPSBnZXRfdWVfZ29sb21iKGdiKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNyb3BfdG9wICAgID0gZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgIHVuc2lnbmVkIGludCBjcm9wX2JvdHRvbSA9IGdldF91ZV9nb2xvbWIoZ2IpOwogICAgICAgICBpbnQgd2lkdGggID0gMTYgKiBzcHMtPm1iX3dpZHRoOwotICAgICAgICBpbnQgaGVpZ2h0ID0gMTYgKiBzcHMtPm1iX2hlaWdodCAqICgyIC0gc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKTsKKyAgICAgICAgaW50IGhlaWdodCA9IDE2ICogc3BzLT5tYl9oZWlnaHQ7CiAKLSAgICAgICAgaWYgKGgtPmF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9JR05PUkVfQ1JPUCkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJkaXNjYXJkaW5nIHNwcyBjcm9wcGluZywgb3JpZ2luYWwgIgorICAgICAgICBpZiAoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX0lHTk9SRV9DUk9QKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImRpc2NhcmRpbmcgc3BzIGNyb3BwaW5nLCBvcmlnaW5hbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyBhcmUgbDolZCByOiVkIHQ6JWQgYjolZFxuIiwKICAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbSk7CiAKQEAgLTUwOCwxNSArNTMyLDYgQEAKICAgICAgICAgICAgIGludCBzdGVwX3ggPSAxIDw8IGhzdWI7CiAgICAgICAgICAgICBpbnQgc3RlcF95ID0gKDIgLSBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcpIDw8IHZzdWI7CiAKLSAgICAgICAgICAgIGlmIChjcm9wX2xlZnQgJiAoMHgxRiA+PiAoc3BzLT5iaXRfZGVwdGhfbHVtYSA+IDgpKSAmJgotICAgICAgICAgICAgICAgICEoaC0+YXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19VTkFMSUdORUQpKSB7Ci0gICAgICAgICAgICAgICAgY3JvcF9sZWZ0ICY9IH4oMHgxRiA+PiAoc3BzLT5iaXRfZGVwdGhfbHVtYSA+IDgpKTsKLSAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAiUmVkdWNpbmcgbGVmdCBjcm9wcGluZyB0byAlZCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJjaHJvbWEgc2FtcGxlcyB0byBwcmVzZXJ2ZSBhbGlnbm1lbnQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBjcm9wX2xlZnQpOwotICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBpZiAoY3JvcF9sZWZ0ICA+ICh1bnNpZ25lZClJTlRfTUFYIC8gNCAvIHN0ZXBfeCB8fAogICAgICAgICAgICAgICAgIGNyb3BfcmlnaHQgPiAodW5zaWduZWQpSU5UX01BWCAvIDQgLyBzdGVwX3ggfHwKICAgICAgICAgICAgICAgICBjcm9wX3RvcCAgID4gKHVuc2lnbmVkKUlOVF9NQVggLyA0IC8gc3RlcF95IHx8CkBAIC01MjQsNyArNTM5LDcgQEAKICAgICAgICAgICAgICAgICAoY3JvcF9sZWZ0ICsgY3JvcF9yaWdodCApICogc3RlcF94ID49IHdpZHRoIHx8CiAgICAgICAgICAgICAgICAgKGNyb3BfdG9wICArIGNyb3BfYm90dG9tKSAqIHN0ZXBfeSA+PSBoZWlnaHQKICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY3JvcCB2YWx1ZXMgaW52YWxpZCAlZCAlZCAlZCAlZCAvICVkICVkXG4iLCBjcm9wX2xlZnQsIGNyb3BfcmlnaHQsIGNyb3BfdG9wLCBjcm9wX2JvdHRvbSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjcm9wIHZhbHVlcyBpbnZhbGlkICVkICVkICVkICVkIC8gJWQgJWRcbiIsIGNyb3BfbGVmdCwgY3JvcF9yaWdodCwgY3JvcF90b3AsIGNyb3BfYm90dG9tLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICB9CiAKQEAgLTU0MSwyMyArNTU2LDI0IEBACiAgICAgICAgIHNwcy0+Y3JvcCAgICAgICAgPSAwOwogICAgIH0KIAotICAgIHNwcy0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgIGlmIChzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgewotICAgICAgICBpbnQgcmV0ID0gZGVjb2RlX3Z1aV9wYXJhbWV0ZXJzKGgsIHNwcyk7CisgICAgICAgIGludCByZXQgPSBkZWNvZGVfdnVpX3BhcmFtZXRlcnMoZ2IsIGF2Y3R4LCBzcHMpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpIDwgMCkgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIGlnbm9yZV90cnVuY2F0aW9uID8gQVZfTE9HX1dBUk5JTkcgOiBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiT3ZlcnJlYWQgJXMgYnkgJWQgYml0c1xuIiwgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPyAiVlVJIiA6ICJTUFMiLCAtZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpKTsKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgaWdub3JlX3RydW5jYXRpb24gPyBBVl9MT0dfV0FSTklORyA6IEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJPdmVycmVhZCAlcyBieSAlZCBiaXRzXG4iLCBzcHMtPnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA/ICJWVUkiIDogIlNQUyIsIC1nZXRfYml0c19sZWZ0KGdiKSk7CiAgICAgICAgIGlmICghaWdub3JlX3RydW5jYXRpb24pCiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCiAgICAgLyogaWYgdGhlIG1heGltdW0gZGVsYXkgaXMgbm90IHN0b3JlZCBpbiB0aGUgU1BTLCBkZXJpdmUgaXQgYmFzZWQgb24gdGhlCiAgICAgICogbGV2ZWwgKi8KLSAgICBpZiAoIXNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcpIHsKKyAgICBpZiAoIXNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgJiYKKyAgICAgICAgKHNwcy0+cmVmX2ZyYW1lX2NvdW50IHx8IGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPj0gRkZfQ09NUExJQU5DRV9TVFJJQ1QpKSB7CiAgICAgICAgIHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzID0gTUFYX0RFTEFZRURfUElDX0NPVU5UIC0gMTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGxldmVsX21heF9kcGJfbWJzKTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAobGV2ZWxfbWF4X2RwYl9tYnNbaV1bMF0gPT0gc3BzLT5sZXZlbF9pZGMpIHsKQEAgLTU3MSw5ICs1ODcsOSBAQAogICAgIGlmICghc3BzLT5zYXIuZGVuKQogICAgICAgICBzcHMtPnNhci5kZW4gPSAxOwogCi0gICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pIHsKICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY3NwWzRdWzVdID0geyAiR3JheSIsICI0MjAiLCAiNDIyIiwgIjQ0NCIgfTsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAogICAgICAgICAgICAgICAgInNwczoldSBwcm9maWxlOiVkLyVkIHBvYzolZCByZWY6JWQgJWR4JWQgJXMgJXMgY3JvcDoldS8ldS8ldS8ldSAlcyAlcyAlIlBSSWQzMiIvJSJQUklkMzIiIGIlZCByZW86JWRcbiIsCiAgICAgICAgICAgICAgICBzcHNfaWQsIHNwcy0+cHJvZmlsZV9pZGMsIHNwcy0+bGV2ZWxfaWRjLAogICAgICAgICAgICAgICAgc3BzLT5wb2NfdHlwZSwKQEAgLTU5MSwxOCArNjA3LDk3IEBACiAgICAgICAgICAgICAgICBzcHMtPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnID8gc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMgOiAtMQogICAgICAgICAgICAgICAgKTsKICAgICB9Ci0gICAgc3BzLT5uZXcgPSAxOwogCi0gICAgYXZfZnJlZShoLT5zcHNfYnVmZmVyc1tzcHNfaWRdKTsKLSAgICBoLT5zcHNfYnVmZmVyc1tzcHNfaWRdID0gc3BzOworICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgYSByZXBlYXQgb2YgYW4gYWxyZWFkeSBwYXJzZWQgU1BTLCB0aGVuIGtlZXAgdGhlCisgICAgICogb3JpZ2luYWwgb25lLgorICAgICAqIG90aGVyd2lzZSBkcm9wIGFsbCBQUFNlcyB0aGF0IGRlcGVuZCBvbiBpdCAqLworICAgIGlmIChwcy0+c3BzX2xpc3Rbc3BzX2lkXSAmJgorICAgICAgICAhbWVtY21wKHBzLT5zcHNfbGlzdFtzcHNfaWRdLT5kYXRhLCBzcHNfYnVmLT5kYXRhLCBzcHNfYnVmLT5zaXplKSkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnNwc19idWYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlbW92ZV9zcHMocHMsIHNwc19pZCk7CisgICAgICAgIHBzLT5zcHNfbGlzdFtzcHNfaWRdID0gc3BzX2J1ZjsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIAogZmFpbDoKLSAgICBhdl9mcmVlKHNwcyk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZzcHNfYnVmKTsKICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIH0KIAorc3RhdGljIHZvaWQgaW5pdF9kZXF1YW50OF9jb2VmZl90YWJsZShQUFMgKnBwcywgY29uc3QgU1BTICpzcHMpCit7CisgICAgaW50IGksIGosIHEsIHg7CisgICAgY29uc3QgaW50IG1heF9xcCA9IDUxICsgNiAqIChzcHMtPmJpdF9kZXB0aF9sdW1hIC0gOCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgICAgIHBwcy0+ZGVxdWFudDhfY29lZmZbaV0gPSBwcHMtPmRlcXVhbnQ4X2J1ZmZlcltpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykKKyAgICAgICAgICAgIGlmICghbWVtY21wKHBwcy0+c2NhbGluZ19tYXRyaXg4W2pdLCBwcHMtPnNjYWxpbmdfbWF0cml4OFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogc2l6ZW9mKHVpbnQ4X3QpKSkgeworICAgICAgICAgICAgICAgIHBwcy0+ZGVxdWFudDhfY29lZmZbaV0gPSBwcHMtPmRlcXVhbnQ4X2J1ZmZlcltqXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGogPCBpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChxID0gMDsgcSA8IG1heF9xcCArIDE7IHErKykgeworICAgICAgICAgICAgaW50IHNoaWZ0ID0gZmZfaDI2NF9xdWFudF9kaXY2W3FdOworICAgICAgICAgICAgaW50IGlkeCAgID0gZmZfaDI2NF9xdWFudF9yZW02W3FdOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDY0OyB4KyspCisgICAgICAgICAgICAgICAgcHBzLT5kZXF1YW50OF9jb2VmZltpXVtxXVsoeCA+PiAzKSB8ICgoeCAmIDcpIDw8IDMpXSA9CisgICAgICAgICAgICAgICAgICAgICgodWludDMyX3QpZmZfaDI2NF9kZXF1YW50OF9jb2VmZl9pbml0W2lkeF1bZmZfaDI2NF9kZXF1YW50OF9jb2VmZl9pbml0X3NjYW5bKCh4ID4+IDEpICYgMTIpIHwgKHggJiAzKV1dICoKKyAgICAgICAgICAgICAgICAgICAgIHBwcy0+c2NhbGluZ19tYXRyaXg4W2ldW3hdKSA8PCBzaGlmdDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaW5pdF9kZXF1YW50NF9jb2VmZl90YWJsZShQUFMgKnBwcywgY29uc3QgU1BTICpzcHMpCit7CisgICAgaW50IGksIGosIHEsIHg7CisgICAgY29uc3QgaW50IG1heF9xcCA9IDUxICsgNiAqIChzcHMtPmJpdF9kZXB0aF9sdW1hIC0gOCk7CisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBwcHMtPmRlcXVhbnQ0X2NvZWZmW2ldID0gcHBzLT5kZXF1YW50NF9idWZmZXJbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCisgICAgICAgICAgICBpZiAoIW1lbWNtcChwcHMtPnNjYWxpbmdfbWF0cml4NFtqXSwgcHBzLT5zY2FsaW5nX21hdHJpeDRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAxNiAqIHNpemVvZih1aW50OF90KSkpIHsKKyAgICAgICAgICAgICAgICBwcHMtPmRlcXVhbnQ0X2NvZWZmW2ldID0gcHBzLT5kZXF1YW50NF9idWZmZXJbal07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGlmIChqIDwgaSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvciAocSA9IDA7IHEgPCBtYXhfcXAgKyAxOyBxKyspIHsKKyAgICAgICAgICAgIGludCBzaGlmdCA9IGZmX2gyNjRfcXVhbnRfZGl2NltxXSArIDI7CisgICAgICAgICAgICBpbnQgaWR4ICAgPSBmZl9oMjY0X3F1YW50X3JlbTZbcV07CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKKyAgICAgICAgICAgICAgICBwcHMtPmRlcXVhbnQ0X2NvZWZmW2ldW3FdWyh4ID4+IDIpIHwgKCh4IDw8IDIpICYgMHhGKV0gPQorICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWZmX2gyNjRfZGVxdWFudDRfY29lZmZfaW5pdFtpZHhdWyh4ICYgMSkgKyAoKHggPj4gMikgJiAxKV0gKgorICAgICAgICAgICAgICAgICAgICAgcHBzLT5zY2FsaW5nX21hdHJpeDRbaV1beF0pIDw8IHNoaWZ0OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbml0X2RlcXVhbnRfdGFibGVzKFBQUyAqcHBzLCBjb25zdCBTUFMgKnNwcykKK3sKKyAgICBpbnQgaSwgeDsKKyAgICBpbml0X2RlcXVhbnQ0X2NvZWZmX3RhYmxlKHBwcywgc3BzKTsKKyAgICBtZW1zZXQocHBzLT5kZXF1YW50OF9jb2VmZiwgMCwgc2l6ZW9mKHBwcy0+ZGVxdWFudDhfY29lZmYpKTsKKworICAgIGlmIChwcHMtPnRyYW5zZm9ybV84eDhfbW9kZSkKKyAgICAgICAgaW5pdF9kZXF1YW50OF9jb2VmZl90YWJsZShwcHMsIHNwcyk7CisgICAgaWYgKHNwcy0+dHJhbnNmb3JtX2J5cGFzcykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCisgICAgICAgICAgICAgICAgcHBzLT5kZXF1YW50NF9jb2VmZltpXVswXVt4XSA9IDEgPDwgNjsKKyAgICAgICAgaWYgKHBwcy0+dHJhbnNmb3JtXzh4OF9tb2RlKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgNjQ7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgcHBzLT5kZXF1YW50OF9jb2VmZltpXVswXVt4XSA9IDEgPDwgNjsKKyAgICB9Cit9CisKIHN0YXRpYyB2b2lkIGJ1aWxkX3FwX3RhYmxlKFBQUyAqcHBzLCBpbnQgdCwgaW50IGluZGV4LCBjb25zdCBpbnQgZGVwdGgpCiB7CiAgICAgaW50IGk7CkBAIC02MTIsMTQgKzcwNywxMyBAQAogICAgICAgICAgICAgZmZfaDI2NF9jaHJvbWFfcXBbZGVwdGggLSA4XVthdl9jbGlwKGkgKyBpbmRleCwgMCwgbWF4X3FwKV07CiB9CiAKLXN0YXRpYyBpbnQgbW9yZV9yYnNwX2RhdGFfaW5fcHBzKEgyNjRDb250ZXh0ICpoLCBQUFMgKnBwcykKK3N0YXRpYyBpbnQgbW9yZV9yYnNwX2RhdGFfaW5fcHBzKGNvbnN0IFNQUyAqc3BzLCB2b2lkICpsb2djdHgpCiB7Ci0gICAgY29uc3QgU1BTICpzcHMgPSBoLT5zcHNfYnVmZmVyc1twcHMtPnNwc19pZF07CiAgICAgaW50IHByb2ZpbGVfaWRjID0gc3BzLT5wcm9maWxlX2lkYzsKIAogICAgIGlmICgocHJvZmlsZV9pZGMgPT0gNjYgfHwgcHJvZmlsZV9pZGMgPT0gNzcgfHwKICAgICAgICAgIHByb2ZpbGVfaWRjID09IDg4KSAmJiAoc3BzLT5jb25zdHJhaW50X3NldF9mbGFncyAmIDcpKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19WRVJCT1NFLAogICAgICAgICAgICAgICAgIkN1cnJlbnQgcHJvZmlsZSBkb2Vzbid0IHByb3ZpZGUgbW9yZSBSQlNQIGRhdGEgaW4gUFBTLCBza2lwcGluZ1xuIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTYyNywxMjMgKzcyMSwxMDggQEAKICAgICByZXR1cm4gMTsKIH0KIAotaW50IGZmX2gyNjRfZGVjb2RlX3BpY3R1cmVfcGFyYW1ldGVyX3NldChIMjY0Q29udGV4dCAqaCwgaW50IGJpdF9sZW5ndGgpCitpbnQgZmZfaDI2NF9kZWNvZGVfcGljdHVyZV9wYXJhbWV0ZXJfc2V0KEdldEJpdENvbnRleHQgKmdiLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRQYXJhbVNldHMgKnBzLCBpbnQgYml0X2xlbmd0aCkKIHsKKyAgICBBVkJ1ZmZlclJlZiAqcHBzX2J1ZjsKICAgICBjb25zdCBTUFMgKnNwczsKLSAgICB1bnNpZ25lZCBpbnQgcHBzX2lkID0gZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgIHVuc2lnbmVkIGludCBwcHNfaWQgPSBnZXRfdWVfZ29sb21iKGdiKTsKICAgICBQUFMgKnBwczsKICAgICBpbnQgcXBfYmRfb2Zmc2V0OwogICAgIGludCBiaXRzX2xlZnQ7CiAgICAgaW50IHJldDsKIAogICAgIGlmIChwcHNfaWQgPj0gTUFYX1BQU19DT1VOVCkgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInBwc19pZCAldSBvdXQgb2YgcmFuZ2VcbiIsIHBwc19pZCk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicHBzX2lkICV1IG91dCBvZiByYW5nZVxuIiwgcHBzX2lkKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgcHBzID0gYXZfbWFsbG9jeihzaXplb2YoUFBTKSk7Ci0gICAgaWYgKCFwcHMpCisgICAgcHBzX2J1ZiA9IGF2X2J1ZmZlcl9hbGxvY3ooc2l6ZW9mKCpwcHMpKTsKKyAgICBpZiAoIXBwc19idWYpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgcHBzLT5kYXRhX3NpemUgPSBoLT5nYi5idWZmZXJfZW5kIC0gaC0+Z2IuYnVmZmVyOworICAgIHBwcyA9IChQUFMqKXBwc19idWYtPmRhdGE7CisKKyAgICBwcHMtPmRhdGFfc2l6ZSA9IGdiLT5idWZmZXJfZW5kIC0gZ2ItPmJ1ZmZlcjsKICAgICBpZiAocHBzLT5kYXRhX3NpemUgPiBzaXplb2YocHBzLT5kYXRhKSkgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVHJ1bmNhdGluZyBsaWtlbHkgb3ZlcnNpemVkIFBQU1xuIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVHJ1bmNhdGluZyBsaWtlbHkgb3ZlcnNpemVkIFBQUyAiCisgICAgICAgICAgICAgICAiKCUiU0laRV9TUEVDSUZJRVIiID4gJSJTSVpFX1NQRUNJRklFUiIpXG4iLAorICAgICAgICAgICAgICAgcHBzLT5kYXRhX3NpemUsIHNpemVvZihwcHMtPmRhdGEpKTsKICAgICAgICAgcHBzLT5kYXRhX3NpemUgPSBzaXplb2YocHBzLT5kYXRhKTsKICAgICB9Ci0gICAgbWVtY3B5KHBwcy0+ZGF0YSwgaC0+Z2IuYnVmZmVyLCBwcHMtPmRhdGFfc2l6ZSk7Ci0gICAgcHBzLT5zcHNfaWQgPSBnZXRfdWVfZ29sb21iXzMxKCZoLT5nYik7CisgICAgbWVtY3B5KHBwcy0+ZGF0YSwgZ2ItPmJ1ZmZlciwgcHBzLT5kYXRhX3NpemUpOworCisgICAgcHBzLT5zcHNfaWQgPSBnZXRfdWVfZ29sb21iXzMxKGdiKTsKICAgICBpZiAoKHVuc2lnbmVkKXBwcy0+c3BzX2lkID49IE1BWF9TUFNfQ09VTlQgfHwKLSAgICAgICAgIWgtPnNwc19idWZmZXJzW3Bwcy0+c3BzX2lkXSkgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInNwc19pZCAldSBvdXQgb2YgcmFuZ2VcbiIsIHBwcy0+c3BzX2lkKTsKKyAgICAgICAgIXBzLT5zcHNfbGlzdFtwcHMtPnNwc19pZF0pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzcHNfaWQgJXUgb3V0IG9mIHJhbmdlXG4iLCBwcHMtPnNwc19pZCk7CiAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9Ci0gICAgc3BzID0gaC0+c3BzX2J1ZmZlcnNbcHBzLT5zcHNfaWRdOworICAgIHNwcyA9IChjb25zdCBTUFMqKXBzLT5zcHNfbGlzdFtwcHMtPnNwc19pZF0tPmRhdGE7CiAgICAgaWYgKHNwcy0+Yml0X2RlcHRoX2x1bWEgPiAxNCkgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiSW52YWxpZCBsdW1hIGJpdCBkZXB0aD0lZFxuIiwKICAgICAgICAgICAgICAgIHNwcy0+Yml0X2RlcHRoX2x1bWEpOwogICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfSBlbHNlIGlmIChzcHMtPmJpdF9kZXB0aF9sdW1hID09IDExIHx8IHNwcy0+Yml0X2RlcHRoX2x1bWEgPT0gMTMpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiVW5pbXBsZW1lbnRlZCBsdW1hIGJpdCBkZXB0aD0lZFxuIiwKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsCisgICAgICAgICAgICAgICAiVW5pbXBsZW1lbnRlZCBsdW1hIGJpdCBkZXB0aD0lZCIsCiAgICAgICAgICAgICAgICBzcHMtPmJpdF9kZXB0aF9sdW1hKTsKICAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBwcHMtPmNhYmFjICAgICAgICAgICAgID0gZ2V0X2JpdHMxKCZoLT5nYik7Ci0gICAgcHBzLT5waWNfb3JkZXJfcHJlc2VudCA9IGdldF9iaXRzMSgmaC0+Z2IpOwotICAgIHBwcy0+c2xpY2VfZ3JvdXBfY291bnQgPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyAxOworICAgIHBwcy0+Y2FiYWMgICAgICAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgIHBwcy0+cGljX29yZGVyX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgIHBwcy0+c2xpY2VfZ3JvdXBfY291bnQgPSBnZXRfdWVfZ29sb21iKGdiKSArIDE7CiAgICAgaWYgKHBwcy0+c2xpY2VfZ3JvdXBfY291bnQgPiAxKSB7Ci0gICAgICAgIHBwcy0+bWJfc2xpY2VfZ3JvdXBfbWFwX3R5cGUgPSBnZXRfdWVfZ29sb21iKCZoLT5nYik7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRk1PIG5vdCBzdXBwb3J0ZWRcbiIpOwotICAgICAgICBzd2l0Y2ggKHBwcy0+bWJfc2xpY2VfZ3JvdXBfbWFwX3R5cGUpIHsKLSAgICAgICAgY2FzZSAwOgotI2lmIDAKLSAgICB8ICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3NsaWNlX2dyb3Vwc19taW51czE7IGkrKykgIHwgICB8ICAgICAgfAotICAgIHwgICAgICAgICAgIHJ1bl9sZW5ndGhbaV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfDEgIHx1ZSh2KSB8Ci0jZW5kaWYKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0jaWYgMAotICAgIHwgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9zbGljZV9ncm91cHNfbWludXMxOyBpKyspIHsgfCAgIHwgICAgICB8Ci0gICAgfCAgICAgICAgICAgdG9wX2xlZnRfbWJbaV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8MSAgfHVlKHYpIHwKLSAgICB8ICAgICAgICAgICBib3R0b21fcmlnaHRfbWJbaV0gICAgICAgICAgICAgICAgICAgICAgICAgIHwxICB8dWUodikgfAotICAgIHwgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwgICAgICB8Ci0jZW5kaWYKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgIGNhc2UgNDoKLSAgICAgICAgY2FzZSA1OgotI2lmIDAKLSAgICB8ICAgICAgIHNsaWNlX2dyb3VwX2NoYW5nZV9kaXJlY3Rpb25fZmxhZyAgICAgICAgICAgICAgIHwxICB8dSgxKSAgfAotICAgIHwgICAgICAgc2xpY2VfZ3JvdXBfY2hhbmdlX3JhdGVfbWludXMxICAgICAgICAgICAgICAgICAgfDEgIHx1ZSh2KSB8Ci0jZW5kaWYKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0jaWYgMAotICAgIHwgICAgICAgc2xpY2VfZ3JvdXBfaWRfY250X21pbnVzMSAgICAgICAgICAgICAgICAgICAgICAgfDEgIHx1ZSh2KSB8Ci0gICAgfCAgICAgICBmb3IgKGkgPSAwOyBpIDw9IHNsaWNlX2dyb3VwX2lkX2NudF9taW51czE7IGkrKyl8ICAgfCAgICAgIHwKLSAgICB8ICAgICAgICAgICBzbGljZV9ncm91cF9pZFtpXSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwxICB8dSh2KSAgfAotI2VuZGlmCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgICAgICBwcHMtPm1iX3NsaWNlX2dyb3VwX21hcF90eXBlID0gZ2V0X3VlX2dvbG9tYihnYik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRk1PIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgIH0KLSAgICBwcHMtPnJlZl9jb3VudFswXSA9IGdldF91ZV9nb2xvbWIoJmgtPmdiKSArIDE7Ci0gICAgcHBzLT5yZWZfY291bnRbMV0gPSBnZXRfdWVfZ29sb21iKCZoLT5nYikgKyAxOworICAgIHBwcy0+cmVmX2NvdW50WzBdID0gZ2V0X3VlX2dvbG9tYihnYikgKyAxOworICAgIHBwcy0+cmVmX2NvdW50WzFdID0gZ2V0X3VlX2dvbG9tYihnYikgKyAxOwogICAgIGlmIChwcHMtPnJlZl9jb3VudFswXSAtIDEgPiAzMiAtIDEgfHwgcHBzLT5yZWZfY291bnRbMV0gLSAxID4gMzIgLSAxKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicmVmZXJlbmNlIG92ZXJmbG93IChwcHMpXG4iKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZWZlcmVuY2Ugb3ZlcmZsb3cgKHBwcylcbiIpOwogICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCiAgICAgcXBfYmRfb2Zmc2V0ID0gNiAqIChzcHMtPmJpdF9kZXB0aF9sdW1hIC0gOCk7CiAKLSAgICBwcHMtPndlaWdodGVkX3ByZWQgICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzMSgmaC0+Z2IpOwotICAgIHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoJmgtPmdiLCAyKTsKLSAgICBwcHMtPmluaXRfcXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9zZV9nb2xvbWIoJmgtPmdiKSArIDI2ICsgcXBfYmRfb2Zmc2V0OwotICAgIHBwcy0+aW5pdF9xcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X3NlX2dvbG9tYigmaC0+Z2IpICsgMjYgKyBxcF9iZF9vZmZzZXQ7Ci0gICAgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzBdICAgICAgICAgICAgPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7Ci0gICAgcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQgPSBnZXRfYml0czEoJmgtPmdiKTsKLSAgICBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgICAgICAgICAgICAgICA9IGdldF9iaXRzMSgmaC0+Z2IpOwotICAgIHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudCAgICAgICAgICAgID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgcHBzLT53ZWlnaHRlZF9wcmVkICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfYml0czEoZ2IpOworICAgIHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYyAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgIHBwcy0+aW5pdF9xcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X3NlX2dvbG9tYihnYikgKyAyNlUgKyBxcF9iZF9vZmZzZXQ7CisgICAgcHBzLT5pbml0X3FzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBnZXRfc2VfZ29sb21iKGdiKSArIDI2VSArIHFwX2JkX29mZnNldDsKKyAgICBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF0gICAgICAgICAgICA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgIGlmIChwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF0gPCAtMTIgfHwgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzBdID4gMTIpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHBwcy0+ZGVibG9ja2luZ19maWx0ZXJfcGFyYW1ldGVyc19wcmVzZW50ID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWQgICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CisgICAgcHBzLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50ICAgICAgICAgICAgPSBnZXRfYml0czEoZ2IpOwogCiAgICAgcHBzLT50cmFuc2Zvcm1fOHg4X21vZGUgPSAwOwotICAgIC8vIGNvbnRlbnRzIG9mIHNwcy9wcHMgY2FuIGNoYW5nZSBldmVuIGlmIGlkIGRvZXNuJ3QsIHNvIHJlaW5pdAotICAgIGgtPmRlcXVhbnRfY29lZmZfcHBzID0gLTE7Ci0gICAgbWVtY3B5KHBwcy0+c2NhbGluZ19tYXRyaXg0LCBoLT5zcHNfYnVmZmVyc1twcHMtPnNwc19pZF0tPnNjYWxpbmdfbWF0cml4NCwKKyAgICBtZW1jcHkocHBzLT5zY2FsaW5nX21hdHJpeDQsIHNwcy0+c2NhbGluZ19tYXRyaXg0LAogICAgICAgICAgICBzaXplb2YocHBzLT5zY2FsaW5nX21hdHJpeDQpKTsKLSAgICBtZW1jcHkocHBzLT5zY2FsaW5nX21hdHJpeDgsIGgtPnNwc19idWZmZXJzW3Bwcy0+c3BzX2lkXS0+c2NhbGluZ19tYXRyaXg4LAorICAgIG1lbWNweShwcHMtPnNjYWxpbmdfbWF0cml4OCwgc3BzLT5zY2FsaW5nX21hdHJpeDgsCiAgICAgICAgICAgIHNpemVvZihwcHMtPnNjYWxpbmdfbWF0cml4OCkpOwogCi0gICAgYml0c19sZWZ0ID0gYml0X2xlbmd0aCAtIGdldF9iaXRzX2NvdW50KCZoLT5nYik7Ci0gICAgaWYgKGJpdHNfbGVmdCA+IDAgJiYgbW9yZV9yYnNwX2RhdGFfaW5fcHBzKGgsIHBwcykpIHsKLSAgICAgICAgcHBzLT50cmFuc2Zvcm1fOHg4X21vZGUgPSBnZXRfYml0czEoJmgtPmdiKTsKLSAgICAgICAgZGVjb2RlX3NjYWxpbmdfbWF0cmljZXMoaCwgaC0+c3BzX2J1ZmZlcnNbcHBzLT5zcHNfaWRdLCBwcHMsIDAsCisgICAgYml0c19sZWZ0ID0gYml0X2xlbmd0aCAtIGdldF9iaXRzX2NvdW50KGdiKTsKKyAgICBpZiAoYml0c19sZWZ0ID4gMCAmJiBtb3JlX3Jic3BfZGF0YV9pbl9wcHMoc3BzLCBhdmN0eCkpIHsKKyAgICAgICAgcHBzLT50cmFuc2Zvcm1fOHg4X21vZGUgPSBnZXRfYml0czEoZ2IpOworICAgICAgICByZXQgPSBkZWNvZGVfc2NhbGluZ19tYXRyaWNlcyhnYiwgc3BzLCBwcHMsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcy0+c2NhbGluZ19tYXRyaXg0LCBwcHMtPnNjYWxpbmdfbWF0cml4OCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAvLyBzZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldAotICAgICAgICBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMV0gPSBnZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgICAgIHBwcy0+Y2hyb21hX3FwX2luZGV4X29mZnNldFsxXSA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICBpZiAocHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdIDwgLTEyIHx8IHBwcy0+Y2hyb21hX3FwX2luZGV4X29mZnNldFsxXSA+IDEyKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdID0gcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzBdOwogICAgIH0KQEAgLTc1MiwxMSArODMxLDE0IEBACiAgICAgICAgICAgICAgICAgICAgc3BzLT5iaXRfZGVwdGhfbHVtYSk7CiAgICAgYnVpbGRfcXBfdGFibGUocHBzLCAxLCBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMV0sCiAgICAgICAgICAgICAgICAgICAgc3BzLT5iaXRfZGVwdGhfbHVtYSk7CisKKyAgICBpbml0X2RlcXVhbnRfdGFibGVzKHBwcywgc3BzKTsKKwogICAgIGlmIChwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF0gIT0gcHBzLT5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdKQogICAgICAgICBwcHMtPmNocm9tYV9xcF9kaWZmID0gMTsKIAotICAgIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKICAgICAgICAgICAgICAgICJwcHM6JXUgc3BzOiV1ICVzIHNsaWNlX2dyb3VwczolZCByZWY6JXUvJXUgJXMgcXA6JWQvJWQvJWQvJWQgJXMgJXMgJXMgJXNcbiIsCiAgICAgICAgICAgICAgICBwcHNfaWQsIHBwcy0+c3BzX2lkLAogICAgICAgICAgICAgICAgcHBzLT5jYWJhYyA/ICJDQUJBQyIgOiAiQ0FWTEMiLApAQCAtNzcwLDExICs4NTIsMTIgQEAKICAgICAgICAgICAgICAgIHBwcy0+dHJhbnNmb3JtXzh4OF9tb2RlID8gIjh4OERDVCIgOiAiIik7CiAgICAgfQogCi0gICAgYXZfZnJlZShoLT5wcHNfYnVmZmVyc1twcHNfaWRdKTsKLSAgICBoLT5wcHNfYnVmZmVyc1twcHNfaWRdID0gcHBzOworICAgIHJlbW92ZV9wcHMocHMsIHBwc19pZCk7CisgICAgcHMtPnBwc19saXN0W3Bwc19pZF0gPSBwcHNfYnVmOworCiAgICAgcmV0dXJuIDA7CiAKIGZhaWw6Ci0gICAgYXZfZnJlZShwcHMpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcHBzX2J1Zik7CiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NF9wcy5oIGIvbGliYXZjb2RlYy9oMjY0X3BzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2N2I5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvaDI2NF9wcy5oCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IHBhcmFtZXRlciBzZXQgaGFuZGxpbmcKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSDI2NF9QU19ICisjZGVmaW5lIEFWQ09ERUNfSDI2NF9QU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJoMjY0LmgiCisKKyNkZWZpbmUgTUFYX1NQU19DT1VOVCAgICAgICAgICAzMgorI2RlZmluZSBNQVhfUFBTX0NPVU5UICAgICAgICAgMjU2CisjZGVmaW5lIE1BWF9MT0cyX01BWF9GUkFNRV9OVU0gICAgKDEyICsgNCkKKworLyoqCisgKiBTZXF1ZW5jZSBwYXJhbWV0ZXIgc2V0CisgKi8KK3R5cGVkZWYgc3RydWN0IFNQUyB7CisgICAgdW5zaWduZWQgaW50IHNwc19pZDsKKyAgICBpbnQgcHJvZmlsZV9pZGM7CisgICAgaW50IGxldmVsX2lkYzsKKyAgICBpbnQgY2hyb21hX2Zvcm1hdF9pZGM7CisgICAgaW50IHRyYW5zZm9ybV9ieXBhc3M7ICAgICAgICAgICAgICAvLy88IHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZworICAgIGludCBsb2cyX21heF9mcmFtZV9udW07ICAgICAgICAgICAgLy8vPCBsb2cyX21heF9mcmFtZV9udW1fbWludXM0ICsgNAorICAgIGludCBwb2NfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwaWNfb3JkZXJfY250X3R5cGUKKyAgICBpbnQgbG9nMl9tYXhfcG9jX2xzYjsgICAgICAgICAgICAgIC8vLzwgbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0CisgICAgaW50IGRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOworICAgIGludCBvZmZzZXRfZm9yX25vbl9yZWZfcGljOworICAgIGludCBvZmZzZXRfZm9yX3RvcF90b19ib3R0b21fZmllbGQ7CisgICAgaW50IHBvY19jeWNsZV9sZW5ndGg7ICAgICAgICAgICAgICAvLy88IG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUKKyAgICBpbnQgcmVmX2ZyYW1lX2NvdW50OyAgICAgICAgICAgICAgIC8vLzwgbnVtX3JlZl9mcmFtZXMKKyAgICBpbnQgZ2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnOworICAgIGludCBtYl93aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwaWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDEKKyAgICAvLy88IChwaWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgKyAxKSAqICgyIC0gZnJhbWVfbWJzX29ubHlfZmxhZykKKyAgICBpbnQgbWJfaGVpZ2h0OworICAgIGludCBmcmFtZV9tYnNfb25seV9mbGFnOworICAgIGludCBtYl9hZmY7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnCisgICAgaW50IGRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWc7CisgICAgaW50IGNyb3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGZyYW1lX2Nyb3BwaW5nX2ZsYWcKKworICAgIC8qIHRob3NlIDQgYXJlIGFscmVhZHkgaW4gbHVtYSBzYW1wbGVzICovCisgICAgdW5zaWduZWQgaW50IGNyb3BfbGVmdDsgICAgICAgICAgICAvLy88IGZyYW1lX2Nyb3BwaW5nX3JlY3RfbGVmdF9vZmZzZXQKKyAgICB1bnNpZ25lZCBpbnQgY3JvcF9yaWdodDsgICAgICAgICAgIC8vLzwgZnJhbWVfY3JvcHBpbmdfcmVjdF9yaWdodF9vZmZzZXQKKyAgICB1bnNpZ25lZCBpbnQgY3JvcF90b3A7ICAgICAgICAgICAgIC8vLzwgZnJhbWVfY3JvcHBpbmdfcmVjdF90b3Bfb2Zmc2V0CisgICAgdW5zaWduZWQgaW50IGNyb3BfYm90dG9tOyAgICAgICAgICAvLy88IGZyYW1lX2Nyb3BwaW5nX3JlY3RfYm90dG9tX29mZnNldAorICAgIGludCB2dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7CisgICAgQVZSYXRpb25hbCBzYXI7CisgICAgaW50IHZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZzsKKyAgICBpbnQgZnVsbF9yYW5nZTsKKyAgICBpbnQgY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZzsKKyAgICBlbnVtIEFWQ29sb3JQcmltYXJpZXMgY29sb3JfcHJpbWFyaWVzOworICAgIGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgY29sb3JfdHJjOworICAgIGVudW0gQVZDb2xvclNwYWNlIGNvbG9yc3BhY2U7CisgICAgaW50IHRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50MzJfdCBudW1fdW5pdHNfaW5fdGljazsKKyAgICB1aW50MzJfdCB0aW1lX3NjYWxlOworICAgIGludCBmaXhlZF9mcmFtZV9yYXRlX2ZsYWc7CisgICAgc2hvcnQgb2Zmc2V0X2Zvcl9yZWZfZnJhbWVbMjU2XTsgLy8gRklYTUUgZHluIGFsb2M/CisgICAgaW50IGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworICAgIGludCBudW1fcmVvcmRlcl9mcmFtZXM7CisgICAgaW50IHNjYWxpbmdfbWF0cml4X3ByZXNlbnQ7CisgICAgdWludDhfdCBzY2FsaW5nX21hdHJpeDRbNl1bMTZdOworICAgIHVpbnQ4X3Qgc2NhbGluZ19tYXRyaXg4WzZdWzY0XTsKKyAgICBpbnQgbmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICBpbnQgdmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKKyAgICBpbnQgcGljX3N0cnVjdF9wcmVzZW50X2ZsYWc7CisgICAgaW50IHRpbWVfb2Zmc2V0X2xlbmd0aDsKKyAgICBpbnQgY3BiX2NudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU2VlIEguMjY0IEUuMS4yCisgICAgaW50IGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoOyAvLy88IGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEKKyAgICBpbnQgY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoOyAgICAgICAgIC8vLzwgY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoX21pbnVzMSArIDEKKyAgICBpbnQgZHBiX291dHB1dF9kZWxheV9sZW5ndGg7ICAgICAgICAgIC8vLzwgZHBiX291dHB1dF9kZWxheV9sZW5ndGhfbWludXMxICsgMQorICAgIGludCBiaXRfZGVwdGhfbHVtYTsgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRfZGVwdGhfbHVtYV9taW51czggKyA4CisgICAgaW50IGJpdF9kZXB0aF9jaHJvbWE7ICAgICAgICAgICAgICAgICAvLy88IGJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICsgOAorICAgIGludCByZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZzsgICAgLy8vPCByZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcKKyAgICBpbnQgY29uc3RyYWludF9zZXRfZmxhZ3M7ICAgICAgICAgICAgIC8vLzwgY29uc3RyYWludF9zZXRbMC0zXV9mbGFnCisgICAgdWludDhfdCBkYXRhWzQwOTZdOworICAgIHNpemVfdCBkYXRhX3NpemU7Cit9IFNQUzsKKworLyoqCisgKiBQaWN0dXJlIHBhcmFtZXRlciBzZXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgUFBTIHsKKyAgICB1bnNpZ25lZCBpbnQgc3BzX2lkOworICAgIGludCBjYWJhYzsgICAgICAgICAgICAgICAgICAvLy88IGVudHJvcHlfY29kaW5nX21vZGVfZmxhZworICAgIGludCBwaWNfb3JkZXJfcHJlc2VudDsgICAgICAvLy88IHBpY19vcmRlcl9wcmVzZW50X2ZsYWcKKyAgICBpbnQgc2xpY2VfZ3JvdXBfY291bnQ7ICAgICAgLy8vPCBudW1fc2xpY2VfZ3JvdXBzX21pbnVzMSArIDEKKyAgICBpbnQgbWJfc2xpY2VfZ3JvdXBfbWFwX3R5cGU7CisgICAgdW5zaWduZWQgaW50IHJlZl9jb3VudFsyXTsgIC8vLzwgbnVtX3JlZl9pZHhfbDAvMV9hY3RpdmVfbWludXMxICsgMQorICAgIGludCB3ZWlnaHRlZF9wcmVkOyAgICAgICAgICAvLy88IHdlaWdodGVkX3ByZWRfZmxhZworICAgIGludCB3ZWlnaHRlZF9iaXByZWRfaWRjOworICAgIGludCBpbml0X3FwOyAgICAgICAgICAgICAgICAvLy88IHBpY19pbml0X3FwX21pbnVzMjYgKyAyNgorICAgIGludCBpbml0X3FzOyAgICAgICAgICAgICAgICAvLy88IHBpY19pbml0X3FzX21pbnVzMjYgKyAyNgorICAgIGludCBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzJdOworICAgIGludCBkZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQ7IC8vLzwgZGVibG9ja2luZ19maWx0ZXJfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcKKyAgICBpbnQgY29uc3RyYWluZWRfaW50cmFfcHJlZDsgICAgIC8vLzwgY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnCisgICAgaW50IHJlZHVuZGFudF9waWNfY250X3ByZXNlbnQ7ICAvLy88IHJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZworICAgIGludCB0cmFuc2Zvcm1fOHg4X21vZGU7ICAgICAgICAgLy8vPCB0cmFuc2Zvcm1fOHg4X21vZGVfZmxhZworICAgIHVpbnQ4X3Qgc2NhbGluZ19tYXRyaXg0WzZdWzE2XTsKKyAgICB1aW50OF90IHNjYWxpbmdfbWF0cml4OFs2XVs2NF07CisgICAgdWludDhfdCBjaHJvbWFfcXBfdGFibGVbMl1bUVBfTUFYX05VTSsxXTsgIC8vLzwgcHJlLXNjYWxlZCAod2l0aCBjaHJvbWFfcXBfaW5kZXhfb2Zmc2V0KSB2ZXJzaW9uIG9mIHFwX3RhYmxlCisgICAgaW50IGNocm9tYV9xcF9kaWZmOworICAgIHVpbnQ4X3QgZGF0YVs0MDk2XTsKKyAgICBzaXplX3QgZGF0YV9zaXplOworCisgICAgdWludDMyX3QgZGVxdWFudDRfYnVmZmVyWzZdW1FQX01BWF9OVU0gKyAxXVsxNl07CisgICAgdWludDMyX3QgZGVxdWFudDhfYnVmZmVyWzZdW1FQX01BWF9OVU0gKyAxXVs2NF07CisgICAgdWludDMyX3QoKmRlcXVhbnQ0X2NvZWZmWzZdKVsxNl07CisgICAgdWludDMyX3QoKmRlcXVhbnQ4X2NvZWZmWzZdKVs2NF07Cit9IFBQUzsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFBhcmFtU2V0cyB7CisgICAgQVZCdWZmZXJSZWYgKnNwc19saXN0W01BWF9TUFNfQ09VTlRdOworICAgIEFWQnVmZmVyUmVmICpwcHNfbGlzdFtNQVhfUFBTX0NPVU5UXTsKKworICAgIEFWQnVmZmVyUmVmICpwcHNfcmVmOworICAgIEFWQnVmZmVyUmVmICpzcHNfcmVmOworICAgIC8qIGN1cnJlbnRseSBhY3RpdmUgcGFyYW1ldGVycyBzZXRzICovCisgICAgY29uc3QgUFBTICpwcHM7CisgICAgY29uc3QgU1BTICpzcHM7Cit9IEgyNjRQYXJhbVNldHM7CisKKy8qKgorICogRGVjb2RlIFNQUworICovCitpbnQgZmZfaDI2NF9kZWNvZGVfc2VxX3BhcmFtZXRlcl9zZXQoR2V0Qml0Q29udGV4dCAqZ2IsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UGFyYW1TZXRzICpwcywgaW50IGlnbm9yZV90cnVuY2F0aW9uKTsKKworLyoqCisgKiBEZWNvZGUgUFBTCisgKi8KK2ludCBmZl9oMjY0X2RlY29kZV9waWN0dXJlX3BhcmFtZXRlcl9zZXQoR2V0Qml0Q29udGV4dCAqZ2IsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFBhcmFtU2V0cyAqcHMsIGludCBiaXRfbGVuZ3RoKTsKKworLyoqCisgKiBVbmluaXQgSDI2NCBwYXJhbSBzZXRzIHN0cnVjdHVyZS4KKyAqLwordm9pZCBmZl9oMjY0X3BzX3VuaW5pdChIMjY0UGFyYW1TZXRzICpwcyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0gyNjRfUFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X3JlZHVuZGFudF9wcHNfYnNmLmMgYi9saWJhdmNvZGVjL2gyNjRfcmVkdW5kYW50X3Bwc19ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmNkNzdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oMjY0X3JlZHVuZGFudF9wcHNfYnNmLmMKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImJzZi5oIgorI2luY2x1ZGUgImNicy5oIgorI2luY2x1ZGUgImNic19oMjY0LmgiCisjaW5jbHVkZSAiaDI2NC5oIgorCisKK3R5cGVkZWYgc3RydWN0IEgyNjRSZWR1bmRhbnRQUFNDb250ZXh0IHsKKyAgICBDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmlucHV0OworICAgIENvZGVkQml0c3RyZWFtQ29udGV4dCAqb3V0cHV0OworCisgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCBhY2Nlc3NfdW5pdDsKKworICAgIGludCBnbG9iYWxfcGljX2luaXRfcXA7CisgICAgaW50IGN1cnJlbnRfcGljX2luaXRfcXA7Cit9IEgyNjRSZWR1bmRhbnRQUFNDb250ZXh0OworCisKK3N0YXRpYyBpbnQgaDI2NF9yZWR1bmRhbnRfcHBzX2ZpeHVwX3BwcyhIMjY0UmVkdW5kYW50UFBTQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRSYXdQUFMgKnBwcykKK3sKKyAgICAvLyBSZWNvcmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgcGljX2luaXRfcXAgaW4gb3JkZXIgdG8gZml4IHVwCisgICAgLy8gZm9sbG93aW5nIHNsaWNlcywgdGhlbiBvdmVyd3JpdGUgd2l0aCB0aGUgZ2xvYmFsIHZhbHVlLgorICAgIGN0eC0+Y3VycmVudF9waWNfaW5pdF9xcCA9IHBwcy0+cGljX2luaXRfcXBfbWludXMyNiArIDI2OworICAgIHBwcy0+cGljX2luaXRfcXBfbWludXMyNiA9IGN0eC0+Z2xvYmFsX3BpY19pbml0X3FwIC0gMjY7CisKKyAgICAvLyBTb21lIFBQU3MgaGF2ZSB0aGlzIHNldCwgc28gaXQgbXVzdCBiZSBzZXQgaW4gYWxsIG9mIHRoZW0uCisgICAgLy8gKFNsaWNlcyB3aGljaCBkbyBub3QgdXNlIHN1Y2ggYSBQUFMgb24gaW5wdXQgd2lsbCBzdGlsbCBoYXZlCisgICAgLy8gKl93ZWlnaHRfbCpmbGFnIGFzIHplcm8gYW5kIHRoZXJlZm9yZSB3cml0ZSBlcXVpdmFsZW50bHkuKQorICAgIHBwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgyNjRfcmVkdW5kYW50X3Bwc19maXh1cF9zbGljZShIMjY0UmVkdW5kYW50UFBTQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFJhd1NsaWNlSGVhZGVyICpzbGljZSkKK3sKKyAgICBpbnQgcXA7CisKKyAgICBxcCA9IGN0eC0+Y3VycmVudF9waWNfaW5pdF9xcCArIHNsaWNlLT5zbGljZV9xcF9kZWx0YTsKKyAgICBzbGljZS0+c2xpY2VfcXBfZGVsdGEgPSBxcCAtIGN0eC0+Z2xvYmFsX3BpY19pbml0X3FwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2NF9yZWR1bmRhbnRfcHBzX2ZpbHRlcihBVkJTRkNvbnRleHQgKmJzZiwgQVZQYWNrZXQgKm91dCkKK3sKKyAgICBIMjY0UmVkdW5kYW50UFBTQ29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisgICAgQVZQYWNrZXQgKmluOworICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmF1ID0gJmN0eC0+YWNjZXNzX3VuaXQ7CisgICAgaW50IGF1X2hhc19zcHM7CisgICAgaW50IGVyciwgaTsKKworICAgIGVyciA9IGZmX2JzZl9nZXRfcGFja2V0KGJzZiwgJmluKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGZmX2Nic19yZWFkX3BhY2tldChjdHgtPmlucHV0LCBhdSwgaW4pOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgYXVfaGFzX3NwcyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGF1LT5uYl91bml0czsgaSsrKSB7CisgICAgICAgIENvZGVkQml0c3RyZWFtVW5pdCAqbmFsID0gJmF1LT51bml0c1tpXTsKKworICAgICAgICBpZiAobmFsLT50eXBlID09IEgyNjRfTkFMX1NQUykKKyAgICAgICAgICAgIGF1X2hhc19zcHMgPSAxOworICAgICAgICBpZiAobmFsLT50eXBlID09IEgyNjRfTkFMX1BQUykgeworICAgICAgICAgICAgaDI2NF9yZWR1bmRhbnRfcHBzX2ZpeHVwX3BwcyhjdHgsIG5hbC0+Y29udGVudCk7CisgICAgICAgICAgICBpZiAoIWF1X2hhc19zcHMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfVkVSQk9TRSwgIkRlbGV0aW5nIHJlZHVuZGFudCBQUFMgIgorICAgICAgICAgICAgICAgICAgICAgICAiYXQgJSJQUklkNjQiLlxuIiwgaW4tPnB0cyk7CisgICAgICAgICAgICAgICAgZmZfY2JzX2RlbGV0ZV91bml0KGN0eC0+aW5wdXQsIGF1LCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobmFsLT50eXBlID09IEgyNjRfTkFMX1NMSUNFIHx8CisgICAgICAgICAgICBuYWwtPnR5cGUgPT0gSDI2NF9OQUxfSURSX1NMSUNFKSB7CisgICAgICAgICAgICBIMjY0UmF3U2xpY2UgKnNsaWNlID0gbmFsLT5jb250ZW50OworICAgICAgICAgICAgaDI2NF9yZWR1bmRhbnRfcHBzX2ZpeHVwX3NsaWNlKGN0eCwgJnNsaWNlLT5oZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgZXJyID0gZmZfY2JzX3dyaXRlX3BhY2tldChjdHgtPm91dHB1dCwgb3V0LCBhdSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBmZl9jYnNfZnJhZ21lbnRfdW5pbml0KGN0eC0+b3V0cHV0LCBhdSk7CisKKyAgICBlcnIgPSBhdl9wYWNrZXRfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoMjY0X3JlZHVuZGFudF9wcHNfaW5pdChBVkJTRkNvbnRleHQgKmJzZikKK3sKKyAgICBIMjY0UmVkdW5kYW50UFBTQ29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqYXUgPSAmY3R4LT5hY2Nlc3NfdW5pdDsKKyAgICBpbnQgZXJyLCBpOworCisgICAgZXJyID0gZmZfY2JzX2luaXQoJmN0eC0+aW5wdXQsIEFWX0NPREVDX0lEX0gyNjQsIGJzZik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBmZl9jYnNfaW5pdCgmY3R4LT5vdXRwdXQsIEFWX0NPREVDX0lEX0gyNjQsIGJzZik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBjdHgtPmdsb2JhbF9waWNfaW5pdF9xcCA9IDI2OworCisgICAgaWYgKGJzZi0+cGFyX2luLT5leHRyYWRhdGEpIHsKKyAgICAgICAgZXJyID0gZmZfY2JzX3JlYWRfZXh0cmFkYXRhKGN0eC0+aW5wdXQsIGF1LCBic2YtPnBhcl9pbik7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXUtPm5iX3VuaXRzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdS0+dW5pdHNbaV0udHlwZSA9PSBIMjY0X05BTF9QUFMpCisgICAgICAgICAgICAgICAgaDI2NF9yZWR1bmRhbnRfcHBzX2ZpeHVwX3BwcyhjdHgsIGF1LT51bml0c1tpXS5jb250ZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGZmX2Nic193cml0ZV9leHRyYWRhdGEoY3R4LT5vdXRwdXQsIGJzZi0+cGFyX291dCwgYXUpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIGV4dHJhZGF0YS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGZmX2Nic19mcmFnbWVudF91bmluaXQoY3R4LT5vdXRwdXQsIGF1KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaDI2NF9yZWR1bmRhbnRfcHBzX2Nsb3NlKEFWQlNGQ29udGV4dCAqYnNmKQoreworICAgIEgyNjRSZWR1bmRhbnRQUFNDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBmZl9jYnNfY2xvc2UoJmN0eC0+aW5wdXQpOworICAgIGZmX2Nic19jbG9zZSgmY3R4LT5vdXRwdXQpOworfQorCitzdGF0aWMgY29uc3QgZW51bSBBVkNvZGVjSUQgaDI2NF9yZWR1bmRhbnRfcHBzX2NvZGVjX2lkc1tdID0geworICAgIEFWX0NPREVDX0lEX0gyNjQsIEFWX0NPREVDX0lEX05PTkUsCit9OworCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9oMjY0X3JlZHVuZGFudF9wcHNfYnNmID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJoMjY0X3JlZHVuZGFudF9wcHMiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihIMjY0UmVkdW5kYW50UFBTQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gJmgyNjRfcmVkdW5kYW50X3Bwc19pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9ICZoMjY0X3JlZHVuZGFudF9wcHNfY2xvc2UsCisgICAgLmZpbHRlciAgICAgICAgID0gJmgyNjRfcmVkdW5kYW50X3Bwc19maWx0ZXIsCisgICAgLmNvZGVjX2lkcyAgICAgID0gaDI2NF9yZWR1bmRhbnRfcHBzX2NvZGVjX2lkcywKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjRfcmVmcy5jIGIvbGliYXZjb2RlYy9oMjY0X3JlZnMuYwppbmRleCBkNDZkOTQwLi4zODhiZDc4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRfcmVmcy5jCisrKyBiL2xpYmF2Y29kZWMvaDI2NF9yZWZzLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgIHJlZmVyZW5jZSBwaWN0dXJlIGhhbmRsaW5nLgorICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwICByZWZlcmVuY2UgcGljdHVyZSBoYW5kbGluZy4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkZWMuaCIKICNpbmNsdWRlICJnb2xvbWIuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKIApAQCAtNzUsNyArNzYsNyBAQAogfQogCiBzdGF0aWMgaW50IGJ1aWxkX2RlZl9saXN0KEgyNjRSZWYgKmRlZiwgaW50IGRlZl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRQaWN0dXJlICoqaW4sIGludCBsZW4sIGludCBpc19sb25nLCBpbnQgc2VsKQorICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UGljdHVyZSAqIGNvbnN0ICppbiwgaW50IGxlbiwgaW50IGlzX2xvbmcsIGludCBzZWwpCiB7CiAgICAgaW50ICBpWzJdID0geyAwIH07CiAgICAgaW50IGluZGV4ID0gMDsKQEAgLTEwMCw3ICsxMDEsOCBAQAogICAgIHJldHVybiBpbmRleDsKIH0KIAotc3RhdGljIGludCBhZGRfc29ydGVkKEgyNjRQaWN0dXJlICoqc29ydGVkLCBIMjY0UGljdHVyZSAqKnNyYywgaW50IGxlbiwgaW50IGxpbWl0LCBpbnQgZGlyKQorc3RhdGljIGludCBhZGRfc29ydGVkKEgyNjRQaWN0dXJlICoqc29ydGVkLCBIMjY0UGljdHVyZSAqIGNvbnN0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGxpbWl0LCBpbnQgZGlyKQogewogICAgIGludCBpLCBiZXN0X3BvYzsKICAgICBpbnQgb3V0X2kgPSAwOwpAQCAtMTIyLDkgKzEyNCw5IEBACiAgICAgcmV0dXJuIG91dF9pOwogfQogCi1zdGF0aWMgaW50IG1pc21hdGNoZXNfcmVmKEgyNjRDb250ZXh0ICpoLCBIMjY0UGljdHVyZSAqcGljKQorc3RhdGljIGludCBtaXNtYXRjaGVzX3JlZihjb25zdCBIMjY0Q29udGV4dCAqaCwgY29uc3QgSDI2NFBpY3R1cmUgKnBpYykKIHsKLSAgICBBVkZyYW1lICpmID0gcGljLT5mOworICAgIGNvbnN0IEFWRnJhbWUgKmYgPSBwaWMtPmY7CiAgICAgcmV0dXJuIChoLT5jdXJfcGljX3B0ci0+Zi0+d2lkdGggICE9IGYtPndpZHRoIHx8CiAgICAgICAgICAgICBoLT5jdXJfcGljX3B0ci0+Zi0+aGVpZ2h0ICE9IGYtPmhlaWdodCB8fAogICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPmYtPmZvcm1hdCAhPSBmLT5mb3JtYXQpOwpAQCAtMjEyLDggKzIxNCwzOSBAQAogICAgICAgICBoLT5kZWZhdWx0X3JlZltpXSA9IHNsLT5yZWZfbGlzdFtpXVswXTsKIH0KIAotc3RhdGljIHZvaWQgcHJpbnRfc2hvcnRfdGVybShIMjY0Q29udGV4dCAqaCk7Ci1zdGF0aWMgdm9pZCBwcmludF9sb25nX3Rlcm0oSDI2NENvbnRleHQgKmgpOworLyoqCisgKiBwcmludCBzaG9ydCB0ZXJtIGxpc3QKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfc2hvcnRfdGVybShjb25zdCBIMjY0Q29udGV4dCAqaCkKK3sKKyAgICB1aW50MzJfdCBpOworICAgIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19NTUNPKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAic2hvcnQgdGVybSBsaXN0OlxuIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoLT5zaG9ydF9yZWZfY291bnQ7IGkrKykgeworICAgICAgICAgICAgSDI2NFBpY3R1cmUgKnBpYyA9IGgtPnNob3J0X3JlZltpXTsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiJSJQUkl1MzIiIGZuOiVkIHBvYzolZCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBpLCBwaWMtPmZyYW1lX251bSwgcGljLT5wb2MsIHBpYy0+Zi0+ZGF0YVswXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogcHJpbnQgbG9uZyB0ZXJtIGxpc3QKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfbG9uZ190ZXJtKGNvbnN0IEgyNjRDb250ZXh0ICpoKQoreworICAgIHVpbnQzMl90IGk7CisgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX01NQ08pIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJsb25nIHRlcm0gbGlzdDpcbiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgSDI2NFBpY3R1cmUgKnBpYyA9IGgtPmxvbmdfcmVmW2ldOworICAgICAgICAgICAgaWYgKHBpYykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiJSJQUkl1MzIiIGZuOiVkIHBvYzolZCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgcGljLT5mcmFtZV9udW0sIHBpYy0+cG9jLCBwaWMtPmYtPmRhdGFbMF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQogCiAvKioKICAqIEV4dHJhY3Qgc3RydWN0dXJlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwaWN0dXJlIGRlc2NyaWJlZCBieSBwaWNfbnVtIGluCkBAIC0yMjUsNyArMjU4LDcgQEAKICAqIEByZXR1cm4gZnJhbWUgbnVtYmVyIChzaG9ydCB0ZXJtKSBvciBsb25nIHRlcm0gaW5kZXggb2YgcGljdHVyZQogICogICAgICAgICBkZXNjcmliZWQgYnkgcGljX251bQogICovCi1zdGF0aWMgaW50IHBpY19udW1fZXh0cmFjdChIMjY0Q29udGV4dCAqaCwgaW50IHBpY19udW0sIGludCAqc3RydWN0dXJlKQorc3RhdGljIGludCBwaWNfbnVtX2V4dHJhY3QoY29uc3QgSDI2NENvbnRleHQgKmgsIGludCBwaWNfbnVtLCBpbnQgKnN0cnVjdHVyZSkKIHsKICAgICAqc3RydWN0dXJlID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmU7CiAgICAgaWYgKEZJRUxEX1BJQ1RVUkUoaCkpIHsKQEAgLTIzOCw3ICsyNzEsMzIgQEAKICAgICByZXR1cm4gcGljX251bTsKIH0KIAotaW50IGZmX2gyNjRfZGVjb2RlX3JlZl9waWNfbGlzdF9yZW9yZGVyaW5nKEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCkKK3N0YXRpYyB2b2lkIGgyNjRfZmlsbF9tYmFmZl9yZWZfbGlzdChIMjY0U2xpY2VDb250ZXh0ICpzbCkKK3sKKyAgICBpbnQgbGlzdCwgaSwgajsKKyAgICBmb3IgKGxpc3QgPSAwOyBsaXN0IDwgc2wtPmxpc3RfY291bnQ7IGxpc3QrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2wtPnJlZl9jb3VudFtsaXN0XTsgaSsrKSB7CisgICAgICAgICAgICBIMjY0UmVmICpmcmFtZSA9ICZzbC0+cmVmX2xpc3RbbGlzdF1baV07CisgICAgICAgICAgICBIMjY0UmVmICpmaWVsZCA9ICZzbC0+cmVmX2xpc3RbbGlzdF1bMTYgKyAyICogaV07CisKKyAgICAgICAgICAgIGZpZWxkWzBdID0gKmZyYW1lOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgICAgIGZpZWxkWzBdLmxpbmVzaXplW2pdIDw8PSAxOworICAgICAgICAgICAgZmllbGRbMF0ucmVmZXJlbmNlID0gUElDVF9UT1BfRklFTEQ7CisgICAgICAgICAgICBmaWVsZFswXS5wb2MgICAgICAgPSBmaWVsZFswXS5wYXJlbnQtPmZpZWxkX3BvY1swXTsKKworICAgICAgICAgICAgZmllbGRbMV0gPSBmaWVsZFswXTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgICAgICBmaWVsZFsxXS5kYXRhW2pdICs9IGZyYW1lLT5wYXJlbnQtPmYtPmxpbmVzaXplW2pdOworICAgICAgICAgICAgZmllbGRbMV0ucmVmZXJlbmNlID0gUElDVF9CT1RUT01fRklFTEQ7CisgICAgICAgICAgICBmaWVsZFsxXS5wb2MgICAgICAgPSBmaWVsZFsxXS5wYXJlbnQtPmZpZWxkX3BvY1sxXTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGZmX2gyNjRfYnVpbGRfcmVmX2xpc3QoSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsKQogewogICAgIGludCBsaXN0LCBpbmRleCwgcGljX3N0cnVjdHVyZTsKIApAQCAtMjQ4LDEwMiArMzA2LDkwIEBACiAgICAgaDI2NF9pbml0aWFsaXNlX3JlZl9saXN0KGgsIHNsKTsKIAogICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCBzbC0+bGlzdF9jb3VudDsgbGlzdCsrKSB7Ci0gICAgICAgIGlmIChnZXRfYml0czEoJnNsLT5nYikpIHsgICAgLy8gcmVmX3BpY19saXN0X21vZGlmaWNhdGlvbl9mbGFnX2xbMDFdCi0gICAgICAgICAgICBpbnQgcHJlZCA9IGgtPmN1cnJfcGljX251bTsKKyAgICAgICAgaW50IHByZWQgPSBzbC0+Y3Vycl9waWNfbnVtOwogCi0gICAgICAgICAgICBmb3IgKGluZGV4ID0gMDsgOyBpbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMgPSBnZXRfdWVfZ29sb21iXzMxKCZzbC0+Z2IpOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaWNfaWQ7Ci0gICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgSDI2NFBpY3R1cmUgKnJlZiA9IE5VTEw7CisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHNsLT5uYl9yZWZfbW9kaWZpY2F0aW9uc1tsaXN0XTsgaW5kZXgrKykgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMgPSBzbC0+cmVmX21vZGlmaWNhdGlvbnNbbGlzdF1baW5kZXhdLm9wOworICAgICAgICAgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBzbC0+cmVmX21vZGlmaWNhdGlvbnNbbGlzdF1baW5kZXhdLnZhbDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaWNfaWQ7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIEgyNjRQaWN0dXJlICpyZWYgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgaWYgKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMgPT0gMykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzd2l0Y2ggKG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBhYnNfZGlmZl9waWNfbnVtID0gdmFsICsgMTsKKyAgICAgICAgICAgICAgICBpbnQgZnJhbWVfbnVtOwogCi0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHNsLT5yZWZfY291bnRbbGlzdF0pIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZWZlcmVuY2UgY291bnQgb3ZlcmZsb3dcbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChtb2RpZmljYXRpb25fb2ZfcGljX251bXNfaWRjKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGNhc2UgMTogewotICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYWJzX2RpZmZfcGljX251bSA9IGdldF91ZV9nb2xvbWJfbG9uZygmc2wtPmdiKSArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9udW07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGFic19kaWZmX3BpY19udW0gPiBoLT5tYXhfcGljX251bSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic19kaWZmX3BpY19udW0gb3ZlcmZsb3dcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYyA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCAtPSBhYnNfZGlmZl9waWNfbnVtOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBwcmVkICs9IGFic19kaWZmX3BpY19udW07Ci0gICAgICAgICAgICAgICAgICAgIHByZWQgJj0gaC0+bWF4X3BpY19udW0gLSAxOwotCi0gICAgICAgICAgICAgICAgICAgIGZyYW1lX251bSA9IHBpY19udW1fZXh0cmFjdChoLCBwcmVkLCAmcGljX3N0cnVjdHVyZSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gaC0+c2hvcnRfcmVmX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA9IGgtPnNob3J0X3JlZltpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZWYtPnJlZmVyZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIXJlZi0+bG9uZ19yZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi0+ZnJhbWVfbnVtID09IGZyYW1lX251bSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWYtPnJlZmVyZW5jZSAmIHBpY19zdHJ1Y3R1cmUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZWYtPnBpY19pZCA9IHByZWQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGxvbmdfaWR4OwotICAgICAgICAgICAgICAgICAgICBwaWNfaWQgPSBnZXRfdWVfZ29sb21iKCZzbC0+Z2IpOyAvLyBsb25nX3Rlcm1fcGljX2lkeAotCi0gICAgICAgICAgICAgICAgICAgIGxvbmdfaWR4ID0gcGljX251bV9leHRyYWN0KGgsIHBpY19pZCwgJnBpY19zdHJ1Y3R1cmUpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChsb25nX2lkeCA+IDMxVSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmdfdGVybV9waWNfaWR4IG92ZXJmbG93XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlZiA9IGgtPmxvbmdfcmVmW2xvbmdfaWR4XTsKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCEocmVmICYmICFyZWYtPnJlZmVyZW5jZSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVmICYmIChyZWYtPnJlZmVyZW5jZSAmIHBpY19zdHJ1Y3R1cmUpICYmICFtaXNtYXRjaGVzX3JlZihoLCByZWYpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWYtPnBpY19pZCA9IHBpY19pZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZWYtPmxvbmdfcmVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChhYnNfZGlmZl9waWNfbnVtID4gc2wtPm1heF9waWNfbnVtKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgbW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYyAldVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWNhdGlvbl9vZl9waWNfbnVtc19pZGMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgImFic19kaWZmX3BpY19udW0gb3ZlcmZsb3dcbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoaSA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYyA9PSAwKQorICAgICAgICAgICAgICAgICAgICBwcmVkIC09IGFic19kaWZmX3BpY19udW07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwcmVkICs9IGFic19kaWZmX3BpY19udW07CisgICAgICAgICAgICAgICAgcHJlZCAmPSBzbC0+bWF4X3BpY19udW0gLSAxOworCisgICAgICAgICAgICAgICAgZnJhbWVfbnVtID0gcGljX251bV9leHRyYWN0KGgsIHByZWQsICZwaWNfc3RydWN0dXJlKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IGgtPnNob3J0X3JlZl9jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZiA9IGgtPnNob3J0X3JlZltpXTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KHJlZi0+cmVmZXJlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCFyZWYtPmxvbmdfcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZi0+ZnJhbWVfbnVtID09IGZyYW1lX251bSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHJlZi0+cmVmZXJlbmNlICYgcGljX3N0cnVjdHVyZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmVmLT5waWNfaWQgPSBwcmVkOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAgICAgaW50IGxvbmdfaWR4OworICAgICAgICAgICAgICAgIHBpY19pZCA9IHZhbDsgLy8gbG9uZ190ZXJtX3BpY19pZHgKKworICAgICAgICAgICAgICAgIGxvbmdfaWR4ID0gcGljX251bV9leHRyYWN0KGgsIHBpY19pZCwgJnBpY19zdHJ1Y3R1cmUpOworCisgICAgICAgICAgICAgICAgaWYgKGxvbmdfaWR4ID4gMzFVKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSBwaWN0dXJlIG1pc3NpbmcgZHVyaW5nIHJlb3JkZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJnNsLT5yZWZfbGlzdFtsaXN0XVtpbmRleF0sIDAsIHNpemVvZihzbC0+cmVmX2xpc3RbMF1bMF0pKTsgLy8gRklYTUUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nX3Rlcm1fcGljX2lkeCBvdmVyZmxvd1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWYgPSBoLT5sb25nX3JlZltsb25nX2lkeF07CisgICAgICAgICAgICAgICAgYXNzZXJ0KCEocmVmICYmICFyZWYtPnJlZmVyZW5jZSkpOworICAgICAgICAgICAgICAgIGlmIChyZWYgJiYgKHJlZi0+cmVmZXJlbmNlICYgcGljX3N0cnVjdHVyZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmLT5waWNfaWQgPSBwaWNfaWQ7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChyZWYtPmxvbmdfcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgaSA9IDA7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gaW5kZXg7IGkgKyAxIDwgc2wtPnJlZl9jb3VudFtsaXN0XTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2wtPnJlZl9saXN0W2xpc3RdW2ldLnBhcmVudCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+bG9uZ19yZWYgPT0gc2wtPnJlZl9saXN0W2xpc3RdW2ldLnBhcmVudC0+bG9uZ19yZWYgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnBpY19pZCAgID09IHNsLT5yZWZfbGlzdFtsaXN0XVtpXS5waWNfaWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPiBpbmRleDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzbC0+cmVmX2xpc3RbbGlzdF1baV0gPSBzbC0+cmVmX2xpc3RbbGlzdF1baSAtIDFdOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlZl9mcm9tX2gyNjRwaWMoJnNsLT5yZWZfbGlzdFtsaXN0XVtpbmRleF0sIHJlZik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChGSUVMRF9QSUNUVVJFKGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaWNfYXNfZmllbGQoJnNsLT5yZWZfbGlzdFtsaXN0XVtpbmRleF0sIHBpY19zdHJ1Y3R1cmUpOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGkgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIHBpY3R1cmUgbWlzc2luZyBkdXJpbmcgcmVvcmRlclxuIik7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZzbC0+cmVmX2xpc3RbbGlzdF1baW5kZXhdLCAwLCBzaXplb2Yoc2wtPnJlZl9saXN0WzBdWzBdKSk7IC8vIEZJWE1FCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IGluZGV4OyBpICsgMSA8IHNsLT5yZWZfY291bnRbbGlzdF07IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2wtPnJlZl9saXN0W2xpc3RdW2ldLnBhcmVudCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT5sb25nX3JlZiA9PSBzbC0+cmVmX2xpc3RbbGlzdF1baV0ucGFyZW50LT5sb25nX3JlZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT5waWNfaWQgICA9PSBzbC0+cmVmX2xpc3RbbGlzdF1baV0ucGljX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoOyBpID4gaW5kZXg7IGktLSkgeworICAgICAgICAgICAgICAgICAgICBzbC0+cmVmX2xpc3RbbGlzdF1baV0gPSBzbC0+cmVmX2xpc3RbbGlzdF1baSAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWZfZnJvbV9oMjY0cGljKCZzbC0+cmVmX2xpc3RbbGlzdF1baW5kZXhdLCByZWYpOworICAgICAgICAgICAgICAgIGlmIChGSUVMRF9QSUNUVVJFKGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBpY19hc19maWVsZCgmc2wtPnJlZl9saXN0W2xpc3RdW2luZGV4XSwgcGljX3N0cnVjdHVyZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNjYsMzkgKzQxMiw0NSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKEZSQU1FX01CQUZGKGgpKQorICAgICAgICBoMjY0X2ZpbGxfbWJhZmZfcmVmX2xpc3Qoc2wpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgZmZfaDI2NF9maWxsX21iYWZmX3JlZl9saXN0KEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCkKK2ludCBmZl9oMjY0X2RlY29kZV9yZWZfcGljX2xpc3RfcmVvcmRlcmluZyhIMjY0U2xpY2VDb250ZXh0ICpzbCwgdm9pZCAqbG9nY3R4KQogewotICAgIGludCBsaXN0LCBpLCBqOworICAgIGludCBsaXN0LCBpbmRleDsKKworICAgIHNsLT5uYl9yZWZfbW9kaWZpY2F0aW9uc1swXSA9IDA7CisgICAgc2wtPm5iX3JlZl9tb2RpZmljYXRpb25zWzFdID0gMDsKKwogICAgIGZvciAobGlzdCA9IDA7IGxpc3QgPCBzbC0+bGlzdF9jb3VudDsgbGlzdCsrKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbC0+cmVmX2NvdW50W2xpc3RdOyBpKyspIHsKLSAgICAgICAgICAgIEgyNjRSZWYgKmZyYW1lID0gJnNsLT5yZWZfbGlzdFtsaXN0XVtpXTsKLSAgICAgICAgICAgIEgyNjRSZWYgKmZpZWxkID0gJnNsLT5yZWZfbGlzdFtsaXN0XVsxNiArIDIgKiBpXTsKKyAgICAgICAgaWYgKCFnZXRfYml0czEoJnNsLT5nYikpICAgIC8vIHJlZl9waWNfbGlzdF9tb2RpZmljYXRpb25fZmxhZ19sWzAxXQorICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgIGZpZWxkWzBdID0gKmZyYW1lOworICAgICAgICBmb3IgKGluZGV4ID0gMDsgOyBpbmRleCsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgb3AgPSBnZXRfdWVfZ29sb21iXzMxKCZzbC0+Z2IpOwogCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgICAgIGZpZWxkWzBdLmxpbmVzaXplW2pdIDw8PSAxOwotICAgICAgICAgICAgZmllbGRbMF0ucmVmZXJlbmNlID0gUElDVF9UT1BfRklFTEQ7Ci0gICAgICAgICAgICBmaWVsZFswXS5wb2MgICAgICAgPSBmaWVsZFswXS5wYXJlbnQtPmZpZWxkX3BvY1swXTsKKyAgICAgICAgICAgIGlmIChvcCA9PSAzKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgICAgICBmaWVsZFsxXSA9IGZpZWxkWzBdOwotCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgICAgIGZpZWxkWzFdLmRhdGFbal0gKz0gZnJhbWUtPnBhcmVudC0+Zi0+bGluZXNpemVbal07Ci0gICAgICAgICAgICBmaWVsZFsxXS5yZWZlcmVuY2UgPSBQSUNUX0JPVFRPTV9GSUVMRDsKLSAgICAgICAgICAgIGZpZWxkWzFdLnBvYyAgICAgICA9IGZpZWxkWzFdLnBhcmVudC0+ZmllbGRfcG9jWzFdOwotCi0gICAgICAgICAgICBzbC0+bHVtYV93ZWlnaHRbMTYgKyAyICogaV1bbGlzdF1bMF0gPSBzbC0+bHVtYV93ZWlnaHRbMTYgKyAyICogaSArIDFdW2xpc3RdWzBdID0gc2wtPmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzBdOwotICAgICAgICAgICAgc2wtPmx1bWFfd2VpZ2h0WzE2ICsgMiAqIGldW2xpc3RdWzFdID0gc2wtPmx1bWFfd2VpZ2h0WzE2ICsgMiAqIGkgKyAxXVtsaXN0XVsxXSA9IHNsLT5sdW1hX3dlaWdodFtpXVtsaXN0XVsxXTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKLSAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX3dlaWdodFsxNiArIDIgKiBpXVtsaXN0XVtqXVswXSA9IHNsLT5jaHJvbWFfd2VpZ2h0WzE2ICsgMiAqIGkgKyAxXVtsaXN0XVtqXVswXSA9IHNsLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzBdOwotICAgICAgICAgICAgICAgIHNsLT5jaHJvbWFfd2VpZ2h0WzE2ICsgMiAqIGldW2xpc3RdW2pdWzFdID0gc2wtPmNocm9tYV93ZWlnaHRbMTYgKyAyICogaSArIDFdW2xpc3RdW2pdWzFdID0gc2wtPmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMV07CisgICAgICAgICAgICBpZiAoaW5kZXggPj0gc2wtPnJlZl9jb3VudFtsaXN0XSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgInJlZmVyZW5jZSBjb3VudCBvdmVyZmxvd1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wID4gMikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgbW9kaWZpY2F0aW9uX29mX3BpY19udW1zX2lkYyAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgb3ApOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc2wtPnJlZl9tb2RpZmljYXRpb25zW2xpc3RdW2luZGV4XS52YWwgPSBnZXRfdWVfZ29sb21iX2xvbmcoJnNsLT5nYik7CisgICAgICAgICAgICBzbC0+cmVmX21vZGlmaWNhdGlvbnNbbGlzdF1baW5kZXhdLm9wICA9IG9wOworICAgICAgICAgICAgc2wtPm5iX3JlZl9tb2RpZmljYXRpb25zW2xpc3RdKys7CiAgICAgICAgIH0KICAgICB9CisKKyAgICByZXR1cm4gMDsKIH0KIAogLyoqCkBAIC00NjcsNyArNTE5LDYgQEAKIH0KIAogLyoqCi0gKgogICogQHJldHVybiB0aGUgcmVtb3ZlZCBwaWN0dXJlIG9yIE5VTEwgaWYgYW4gZXJyb3Igb2NjdXJzCiAgKi8KIHN0YXRpYyBIMjY0UGljdHVyZSAqcmVtb3ZlX3Nob3J0KEgyNjRDb250ZXh0ICpoLCBpbnQgZnJhbWVfbnVtLCBpbnQgcmVmX21hc2spCkBAIC01MjAsOCArNTcxLDcgQEAKIAogICAgIGlmIChoLT5zaG9ydF9yZWZfY291bnQgJiYgIWgtPmxhc3RfcGljX2Zvcl9lYy5mLT5kYXRhWzBdKSB7CiAgICAgICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+bGFzdF9waWNfZm9yX2VjKTsKLSAgICAgICAgaWYgKGgtPnNob3J0X3JlZlswXS0+Zi0+YnVmWzBdKQotICAgICAgICAgICAgZmZfaDI2NF9yZWZfcGljdHVyZShoLCAmaC0+bGFzdF9waWNfZm9yX2VjLCBoLT5zaG9ydF9yZWZbMF0pOworICAgICAgICBmZl9oMjY0X3JlZl9waWN0dXJlKGgsICZoLT5sYXN0X3BpY19mb3JfZWMsIGgtPnNob3J0X3JlZlswXSk7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGgtPnNob3J0X3JlZl9jb3VudDsgaSsrKSB7CkBAIC01MzEsMTAyICs1ODEsNDkgQEAKICAgICBoLT5zaG9ydF9yZWZfY291bnQgPSAwOwogCiAgICAgbWVtc2V0KGgtPmRlZmF1bHRfcmVmLCAwLCBzaXplb2YoaC0+ZGVmYXVsdF9yZWYpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaC0+bmJfc2xpY2VfY3R4OyBpKyspIHsKLSAgICAgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4W2ldOwotICAgICAgICBzbC0+bGlzdF9jb3VudCA9IHNsLT5yZWZfY291bnRbMF0gPSBzbC0+cmVmX2NvdW50WzFdID0gMDsKLSAgICAgICAgbWVtc2V0KHNsLT5yZWZfbGlzdCwgMCwgc2l6ZW9mKHNsLT5yZWZfbGlzdCkpOwotICAgIH0KIH0KIAotLyoqCi0gKiBwcmludCBzaG9ydCB0ZXJtIGxpc3QKLSAqLwotc3RhdGljIHZvaWQgcHJpbnRfc2hvcnRfdGVybShIMjY0Q29udGV4dCAqaCkKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX3NsaWRpbmdfd2luZG93X21tY29zKEgyNjRDb250ZXh0ICpoKQogewotICAgIHVpbnQzMl90IGk7Ci0gICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX01NQ08pIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzaG9ydCB0ZXJtIGxpc3Q6XG4iKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPnNob3J0X3JlZl9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBIMjY0UGljdHVyZSAqcGljID0gaC0+c2hvcnRfcmVmW2ldOwotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIlIlBSSXUzMiIgZm46JWQgcG9jOiVkICVwXG4iLAotICAgICAgICAgICAgICAgICAgIGksIHBpYy0+ZnJhbWVfbnVtLCBwaWMtPnBvYywgcGljLT5mLT5kYXRhWzBdKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBwcmludCBsb25nIHRlcm0gbGlzdAotICovCi1zdGF0aWMgdm9pZCBwcmludF9sb25nX3Rlcm0oSDI2NENvbnRleHQgKmgpCi17Ci0gICAgdWludDMyX3QgaTsKLSAgICBpZiAoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfTU1DTykgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgImxvbmcgdGVybSBsaXN0OlxuIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICAgICAgICBIMjY0UGljdHVyZSAqcGljID0gaC0+bG9uZ19yZWZbaV07Ci0gICAgICAgICAgICBpZiAocGljKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICIlIlBSSXUzMiIgZm46JWQgcG9jOiVkICVwXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBpLCBwaWMtPmZyYW1lX251bSwgcGljLT5wb2MsIHBpYy0+Zi0+ZGF0YVswXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgY2hlY2tfb3Bjb2RlcyhNTUNPICptbWNvMSwgTU1DTyAqbW1jbzIsIGludCBuX21tY29zKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG5fbW1jb3M7IGkrKykgewotICAgICAgICBpZiAobW1jbzFbaV0ub3Bjb2RlICE9IG1tY28yW2ldLm9wY29kZSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk1NQ08gb3Bjb2RlIFslZCwgJWRdIGF0ICVkIG1pc21hdGNoZXMgYmV0d2VlbiBzbGljZXNcbiIsCi0gICAgICAgICAgICAgICAgICAgbW1jbzFbaV0ub3Bjb2RlLCBtbWNvMltpXS5vcGNvZGUsIGkpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBmZl9nZW5lcmF0ZV9zbGlkaW5nX3dpbmRvd19tbWNvcyhIMjY0Q29udGV4dCAqaCwgaW50IGZpcnN0X3NsaWNlKQotewotICAgIE1NQ08gbW1jb190ZW1wW01BWF9NTUNPX0NPVU5UXSwgKm1tY28gPSBmaXJzdF9zbGljZSA/IGgtPm1tY28gOiBtbWNvX3RlbXA7Ci0gICAgaW50IG1tY29faW5kZXggPSAwLCBpID0gMDsKKyAgICBNTUNPICptbWNvID0gaC0+bW1jbzsKKyAgICBpbnQgbmJfbW1jbyA9IDA7CiAKICAgICBpZiAoaC0+c2hvcnRfcmVmX2NvdW50ICYmCi0gICAgICAgIGgtPmxvbmdfcmVmX2NvdW50ICsgaC0+c2hvcnRfcmVmX2NvdW50ID49IGgtPnNwcy5yZWZfZnJhbWVfY291bnQgJiYKKyAgICAgICAgaC0+bG9uZ19yZWZfY291bnQgKyBoLT5zaG9ydF9yZWZfY291bnQgPj0gaC0+cHMuc3BzLT5yZWZfZnJhbWVfY291bnQgJiYKICAgICAgICAgIShGSUVMRF9QSUNUVVJFKGgpICYmICFoLT5maXJzdF9maWVsZCAmJiBoLT5jdXJfcGljX3B0ci0+cmVmZXJlbmNlKSkgewogICAgICAgICBtbWNvWzBdLm9wY29kZSAgICAgICAgPSBNTUNPX1NIT1JUMlVOVVNFRDsKICAgICAgICAgbW1jb1swXS5zaG9ydF9waWNfbnVtID0gaC0+c2hvcnRfcmVmW2gtPnNob3J0X3JlZl9jb3VudCAtIDFdLT5mcmFtZV9udW07Ci0gICAgICAgIG1tY29faW5kZXggICAgICAgICAgICA9IDE7CisgICAgICAgIG5iX21tY28gICAgICAgICAgICAgICA9IDE7CiAgICAgICAgIGlmIChGSUVMRF9QSUNUVVJFKGgpKSB7CiAgICAgICAgICAgICBtbWNvWzBdLnNob3J0X3BpY19udW0gKj0gMjsKICAgICAgICAgICAgIG1tY29bMV0ub3Bjb2RlICAgICAgICAgPSBNTUNPX1NIT1JUMlVOVVNFRDsKICAgICAgICAgICAgIG1tY29bMV0uc2hvcnRfcGljX251bSAgPSBtbWNvWzBdLnNob3J0X3BpY19udW0gKyAxOwotICAgICAgICAgICAgbW1jb19pbmRleCAgICAgICAgICAgICA9IDI7CisgICAgICAgICAgICBuYl9tbWNvICAgICAgICAgICAgICAgID0gMjsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChmaXJzdF9zbGljZSkgewotICAgICAgICBoLT5tbWNvX2luZGV4ID0gbW1jb19pbmRleDsKLSAgICB9IGVsc2UgaWYgKCFmaXJzdF9zbGljZSAmJiBtbWNvX2luZGV4ID49IDAgJiYKLSAgICAgICAgICAgICAgIChtbWNvX2luZGV4ICE9IGgtPm1tY29faW5kZXggfHwKLSAgICAgICAgICAgICAgICAoaSA9IGNoZWNrX29wY29kZXMoaC0+bW1jbywgbW1jb190ZW1wLCBtbWNvX2luZGV4KSkpKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkluY29uc2lzdGVudCBNTUNPIHN0YXRlIGJldHdlZW4gc2xpY2VzIFslZCwgJWRdXG4iLAotICAgICAgICAgICAgICAgbW1jb19pbmRleCwgaC0+bW1jb19pbmRleCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICBoLT5uYl9tbWNvID0gbmJfbW1jbzsKIH0KIAotaW50IGZmX2gyNjRfZXhlY3V0ZV9yZWZfcGljX21hcmtpbmcoSDI2NENvbnRleHQgKmgsIE1NQ08gKm1tY28sIGludCBtbWNvX2NvdW50KQoraW50IGZmX2gyNjRfZXhlY3V0ZV9yZWZfcGljX21hcmtpbmcoSDI2NENvbnRleHQgKmgpCiB7CisgICAgTU1DTyAqbW1jbyA9IGgtPm1tY287CisgICAgaW50IG1tY29fY291bnQ7CiAgICAgaW50IGksIGF2X3VuaW5pdChqKTsKLSAgICBpbnQgcHBzX2NvdW50OwogICAgIGludCBwcHNfcmVmX2NvdW50WzJdID0gezB9OwogICAgIGludCBjdXJyZW50X3JlZl9hc3NpZ25lZCA9IDAsIGVyciA9IDA7CiAgICAgSDI2NFBpY3R1cmUgKmF2X3VuaW5pdChwaWMpOwogCisgICAgaWYgKCFoLT5wcy5zcHMpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJTUFMgaXMgdW5zZXRcbiIpOworICAgICAgICBlcnIgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBpZiAoIWgtPmV4cGxpY2l0X3JlZl9tYXJraW5nKQorICAgICAgICBnZW5lcmF0ZV9zbGlkaW5nX3dpbmRvd19tbWNvcyhoKTsKKyAgICBtbWNvX2NvdW50ID0gaC0+bmJfbW1jbzsKKwogICAgIGlmICgoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfTU1DTykgJiYgbW1jb19jb3VudCA9PSAwKQogICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgIm5vIG1tY28gaGVyZVxuIik7CiAKQEAgLTY3OCw3ICs2NzUsNyBAQAogICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAibW1jbzogdW5yZWYgbG9uZyBmYWlsdXJlXG4iKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1NQ09fTE9ORzoKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29tbWVudCBiZWxvdyBsZWZ0IGZyb20gcHJldmlvdXMgY29kZSBhcyBpdCBpcyBhbiBpbnRlcnJlc3Rpbmcgbm90ZS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQ29tbWVudCBiZWxvdyBsZWZ0IGZyb20gcHJldmlvdXMgY29kZSBhcyBpdCBpcyBhbiBpbnRlcmVzdGluZyBub3RlLgogICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBmaWVsZCBpbiBwYWlyIGlzIGluIHNob3J0IHRlcm0gbGlzdCBvcgogICAgICAgICAgICAgICAgICAgICAgKiBhdCBhIGRpZmZlcmVudCBsb25nIHRlcm0gaW5kZXguCiAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgaXMgbm90IGFsbG93ZWQ7IHNlZSA3LjQuMy4zLCBub3RlcyAyIGFuZCAzLgpAQCAtNzI3LDcgKzcyNCw3IEBACiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgewogICAgICAgICAgICAgICAgIHJlbW92ZV9sb25nKGgsIGosIDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaC0+ZnJhbWVfbnVtICA9IGgtPmN1cl9waWNfcHRyLT5mcmFtZV9udW0gPSAwOworICAgICAgICAgICAgaC0+cG9jLmZyYW1lX251bSA9IGgtPmN1cl9waWNfcHRyLT5mcmFtZV9udW0gPSAwOwogICAgICAgICAgICAgaC0+bW1jb19yZXNldCA9IDE7CiAgICAgICAgICAgICBoLT5jdXJfcGljX3B0ci0+bW1jb19yZXNldCA9IDE7CiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTUFYX0RFTEFZRURfUElDX0NPVU5UOyBqKyspCkBAIC03NzAsNyArNzY3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChoLT5sb25nX3JlZl9jb3VudCArIGgtPnNob3J0X3JlZl9jb3VudCA+IEZGTUFYKGgtPnNwcy5yZWZfZnJhbWVfY291bnQsIDEpKSB7CisgICAgaWYgKGgtPmxvbmdfcmVmX2NvdW50ICsgaC0+c2hvcnRfcmVmX2NvdW50ID4gRkZNQVgoaC0+cHMuc3BzLT5yZWZfZnJhbWVfY291bnQsIDEpKSB7CiAKICAgICAgICAgLyogV2UgaGF2ZSB0b28gbWFueSByZWZlcmVuY2UgZnJhbWVzLCBwcm9iYWJseSBkdWUgdG8gY29ycnVwdGVkCiAgICAgICAgICAqIHN0cmVhbS4gTmVlZCB0byBkaXNjYXJkIG9uZSBmcmFtZS4gUHJldmVudHMgb3ZlcnJ1biBvZiB0aGUKQEAgLTc3OSw3ICs3NzYsNyBAQAogICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJudW1iZXIgb2YgcmVmZXJlbmNlIGZyYW1lcyAoJWQrJWQpIGV4Y2VlZHMgbWF4ICglZDsgcHJvYmFibHkgIgogICAgICAgICAgICAgICAgImNvcnJ1cHQgaW5wdXQpLCBkaXNjYXJkaW5nIG9uZVxuIiwKLSAgICAgICAgICAgICAgIGgtPmxvbmdfcmVmX2NvdW50LCBoLT5zaG9ydF9yZWZfY291bnQsIGgtPnNwcy5yZWZfZnJhbWVfY291bnQpOworICAgICAgICAgICAgICAgaC0+bG9uZ19yZWZfY291bnQsIGgtPnNob3J0X3JlZl9jb3VudCwgaC0+cHMuc3BzLT5yZWZfZnJhbWVfY291bnQpOwogICAgICAgICBlcnIgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgIGlmIChoLT5sb25nX3JlZl9jb3VudCAmJiAhaC0+c2hvcnRfcmVmX2NvdW50KSB7CkBAIC03OTgsOCArNzk1LDggQEAKICAgICBmb3IgKGkgPSAwOyBpPGgtPnNob3J0X3JlZl9jb3VudDsgaSsrKSB7CiAgICAgICAgIHBpYyA9IGgtPnNob3J0X3JlZltpXTsKICAgICAgICAgaWYgKHBpYy0+aW52YWxpZF9nYXApIHsKLSAgICAgICAgICAgIGludCBkID0gYXZfbW9kX3VpbnRwMihoLT5jdXJfcGljX3B0ci0+ZnJhbWVfbnVtIC0gcGljLT5mcmFtZV9udW0sIGgtPnNwcy5sb2cyX21heF9mcmFtZV9udW0pOwotICAgICAgICAgICAgaWYgKGQgPiBoLT5zcHMucmVmX2ZyYW1lX2NvdW50KQorICAgICAgICAgICAgaW50IGQgPSBhdl9tb2RfdWludHAyKGgtPmN1cl9waWNfcHRyLT5mcmFtZV9udW0gLSBwaWMtPmZyYW1lX251bSwgaC0+cHMuc3BzLT5sb2cyX21heF9mcmFtZV9udW0pOworICAgICAgICAgICAgaWYgKGQgPiBoLT5wcy5zcHMtPnJlZl9mcmFtZV9jb3VudCkKICAgICAgICAgICAgICAgICByZW1vdmVfc2hvcnQoaCwgcGljLT5mcmFtZV9udW0sIDApOwogICAgICAgICB9CiAgICAgfQpAQCAtODA3LDEzICs4MDQsMTUgQEAKICAgICBwcmludF9zaG9ydF90ZXJtKGgpOwogICAgIHByaW50X2xvbmdfdGVybShoKTsKIAotICAgIHBwc19jb3VudCA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGgtPnBwc19idWZmZXJzKTsgaSsrKSB7Ci0gICAgICAgIHBwc19jb3VudCArPSAhIWgtPnBwc19idWZmZXJzW2ldOwotICAgICAgICBwcHNfcmVmX2NvdW50WzBdID0gRkZNQVgocHBzX3JlZl9jb3VudFswXSwgaC0+cHBzLnJlZl9jb3VudFswXSk7Ci0gICAgICAgIHBwc19yZWZfY291bnRbMV0gPSBGRk1BWChwcHNfcmVmX2NvdW50WzFdLCBoLT5wcHMucmVmX2NvdW50WzFdKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaC0+cHMucHBzX2xpc3QpOyBpKyspIHsKKyAgICAgICAgaWYgKGgtPnBzLnBwc19saXN0W2ldKSB7CisgICAgICAgICAgICBjb25zdCBQUFMgKnBwcyA9IChjb25zdCBQUFMgKiloLT5wcy5wcHNfbGlzdFtpXS0+ZGF0YTsKKyAgICAgICAgICAgIHBwc19yZWZfY291bnRbMF0gPSBGRk1BWChwcHNfcmVmX2NvdW50WzBdLCBwcHMtPnJlZl9jb3VudFswXSk7CisgICAgICAgICAgICBwcHNfcmVmX2NvdW50WzFdID0gRkZNQVgocHBzX3JlZl9jb3VudFsxXSwgcHBzLT5yZWZfY291bnRbMV0pOworICAgICAgICB9CiAgICAgfQogCisgICAgLy8gRGV0ZWN0IHVubWFya2VkIHJhbmRvbSBhY2Nlc3MgcG9pbnRzCiAgICAgaWYgKCAgIGVyciA+PSAwCiAgICAgICAgICYmIGgtPmxvbmdfcmVmX2NvdW50PT0wCiAgICAgICAgICYmICggICBoLT5zaG9ydF9yZWZfY291bnQ8PTIKQEAgLTgyNSw0MiArODI0LDM2IEBACiAgICAgICAgICAgICBoLT5mcmFtZV9yZWNvdmVyZWQgfD0gRlJBTUVfUkVDT1ZFUkVEX1NFSTsKICAgICB9CiAKK291dDoKICAgICByZXR1cm4gKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSA/IGVyciA6IDA7CiB9CiAKLWludCBmZl9oMjY0X2RlY29kZV9yZWZfcGljX21hcmtpbmcoSDI2NENvbnRleHQgKmgsIEdldEJpdENvbnRleHQgKmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3Rfc2xpY2UpCitpbnQgZmZfaDI2NF9kZWNvZGVfcmVmX3BpY19tYXJraW5nKEgyNjRTbGljZUNvbnRleHQgKnNsLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NDVOQUwgKm5hbCwgdm9pZCAqbG9nY3R4KQogewotICAgIGludCBpLCByZXQ7Ci0gICAgTU1DTyBtbWNvX3RlbXBbTUFYX01NQ09fQ09VTlRdLCAqbW1jbyA9IG1tY29fdGVtcDsKLSAgICBpbnQgbW1jb19pbmRleCA9IDA7CisgICAgaW50IGk7CisgICAgTU1DTyAqbW1jbyA9IHNsLT5tbWNvOworICAgIGludCBuYl9tbWNvID0gMDsKIAotICAgIGlmIChoLT5uYWxfdW5pdF90eXBlID09IE5BTF9JRFJfU0xJQ0UpIHsgLy8gRklYTUUgZmllbGRzCisgICAgaWYgKG5hbC0+dHlwZSA9PSBIMjY0X05BTF9JRFJfU0xJQ0UpIHsgLy8gRklYTUUgZmllbGRzCiAgICAgICAgIHNraXBfYml0czEoZ2IpOyAvLyBicm9rZW5fbGluawogICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgewogICAgICAgICAgICAgbW1jb1swXS5vcGNvZGUgICA9IE1NQ09fTE9ORzsKICAgICAgICAgICAgIG1tY29bMF0ubG9uZ19hcmcgPSAwOwotICAgICAgICAgICAgbW1jb19pbmRleCAgICAgICA9IDE7CisgICAgICAgICAgICBuYl9tbWNvICAgICAgICAgID0gMTsKICAgICAgICAgfQorICAgICAgICBzbC0+ZXhwbGljaXRfcmVmX21hcmtpbmcgPSAxOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7IC8vIGFkYXB0aXZlX3JlZl9waWNfbWFya2luZ19tb2RlX2ZsYWcKKyAgICAgICAgc2wtPmV4cGxpY2l0X3JlZl9tYXJraW5nID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKHNsLT5leHBsaWNpdF9yZWZfbWFya2luZykgewogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9NTUNPX0NPVU5UOyBpKyspIHsKICAgICAgICAgICAgICAgICBNTUNPT3Bjb2RlIG9wY29kZSA9IGdldF91ZV9nb2xvbWJfMzEoZ2IpOwogCiAgICAgICAgICAgICAgICAgbW1jb1tpXS5vcGNvZGUgPSBvcGNvZGU7CiAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBNTUNPX1NIT1JUMlVOVVNFRCB8fCBvcGNvZGUgPT0gTU1DT19TSE9SVDJMT05HKSB7CiAgICAgICAgICAgICAgICAgICAgIG1tY29baV0uc2hvcnRfcGljX251bSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoaC0+Y3Vycl9waWNfbnVtIC0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAtIDEpICYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaC0+bWF4X3BpY19udW0gLSAxKTsKLSNpZiAwCi0gICAgICAgICAgICAgICAgICAgIGlmIChtbWNvW2ldLnNob3J0X3BpY19udW0gPj0gaC0+c2hvcnRfcmVmX2NvdW50IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAhaC0+c2hvcnRfcmVmW21tY29baV0uc2hvcnRfcGljX251bV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHNob3J0IHJlZiBpbiBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uICVkXG4iLCBtbWNvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAoc2wtPmN1cnJfcGljX251bSAtIGdldF91ZV9nb2xvbWJfbG9uZyhnYikgLSAxKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNsLT5tYXhfcGljX251bSAtIDEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE1NQ09fU0hPUlQyTE9ORyB8fCBvcGNvZGUgPT0gTU1DT19MT05HMlVOVVNFRCB8fAogICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPT0gTU1DT19MT05HIHx8IG9wY29kZSA9PSBNTUNPX1NFVF9NQVhfTE9ORykgewpAQCAtODY4LDggKzg2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChsb25nX2FyZyA+PSAzMiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmdfYXJnID49IDE2ICYmICEob3Bjb2RlID09IE1NQ09fU0VUX01BWF9MT05HICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nX2FyZyA9PSAxNikgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAhKG9wY29kZSA9PSBNTUNPX0xPTkcyVU5VU0VEICYmIEZJRUxEX1BJQ1RVUkUoaCkpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIShvcGNvZGUgPT0gTU1DT19MT05HMlVOVVNFRCAmJiBGSUVMRF9QSUNUVVJFKHNsKSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgbG9uZyByZWYgaW4gbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhdGlvbiAlZFxuIiwgb3Bjb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTg3OCw3ICs4NzEsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPiAodW5zaWduZWQpIE1NQ09fTE9ORykgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgbWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC04ODYsMjggKzg3OSwxMSBAQAogICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gTU1DT19FTkQpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbW1jb19pbmRleCA9IGk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmlyc3Rfc2xpY2UpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBmZl9nZW5lcmF0ZV9zbGlkaW5nX3dpbmRvd19tbWNvcyhoLCBmaXJzdF9zbGljZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgaC0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtbWNvX2luZGV4ID0gLTE7CisgICAgICAgICAgICBuYl9tbWNvID0gaTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChmaXJzdF9zbGljZSAmJiBtbWNvX2luZGV4ICE9IC0xKSB7Ci0gICAgICAgIG1lbWNweShoLT5tbWNvLCBtbWNvX3RlbXAsIHNpemVvZihoLT5tbWNvKSk7Ci0gICAgICAgIGgtPm1tY29faW5kZXggPSBtbWNvX2luZGV4OwotICAgIH0gZWxzZSBpZiAoIWZpcnN0X3NsaWNlICYmIG1tY29faW5kZXggPj0gMCAmJgotICAgICAgICAgICAgICAgKG1tY29faW5kZXggIT0gaC0+bW1jb19pbmRleCB8fAotICAgICAgICAgICAgICAgIGNoZWNrX29wY29kZXMoaC0+bW1jbywgbW1jb190ZW1wLCBtbWNvX2luZGV4KSkpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiSW5jb25zaXN0ZW50IE1NQ08gc3RhdGUgYmV0d2VlbiBzbGljZXMgWyVkLCAlZF1cbiIsCi0gICAgICAgICAgICAgICBtbWNvX2luZGV4LCBoLT5tbWNvX2luZGV4KTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQorICAgIHNsLT5uYl9tbWNvID0gbmJfbW1jbzsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X3NlaS5jIGIvbGliYXZjb2RlYy9oMjY0X3NlaS5jCmluZGV4IDc3ZGQ3YjIuLjY0OTkwODYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NF9zZWkuYworKysgYi9saWJhdmNvZGVjL2gyNjRfc2VpLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gc2VpIGRlY29kaW5nCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBTRUkgZGVjb2RpbmcKICAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KQEAgLTIxLDEyNCArMjEsMTM0IEBACiAKIC8qKgogICogQGZpbGUKLSAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIHNlaSBkZWNvZGluZy4KKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHBhcnQxMCBTRUkgZGVjb2RpbmcuCiAgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKi8KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImdvbG9tYi5oIgotI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0X3BzLmgiCisjaW5jbHVkZSAiaDI2NF9zZWkuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCisjZGVmaW5lIEFWRVJST1JfUFNfTk9UX0ZPVU5EICAgICAgRkZFUlJUQUcoMHhGOCwnPycsJ1AnLCdTJykKKwogc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2VpX251bV9jbG9ja190c190YWJsZVs5XSA9IHsKICAgICAxLCAxLCAxLCAyLCAyLCAzLCAzLCAyLCAzCiB9OwogCi12b2lkIGZmX2gyNjRfcmVzZXRfc2VpKEgyNjRDb250ZXh0ICpoKQordm9pZCBmZl9oMjY0X3NlaV91bmluaXQoSDI2NFNFSUNvbnRleHQgKmgpCiB7Ci0gICAgaC0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudCAgICAgICA9IC0xOwotICAgIGgtPnNlaV9kcGJfb3V0cHV0X2RlbGF5ICAgICAgICAgPSAgMDsKLSAgICBoLT5zZWlfY3BiX3JlbW92YWxfZGVsYXkgICAgICAgID0gLTE7Ci0gICAgaC0+c2VpX2J1ZmZlcmluZ19wZXJpb2RfcHJlc2VudCA9ICAwOwotICAgIGgtPnNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQgICAgPSAgMDsKLSAgICBoLT5zZWlfZGlzcGxheV9vcmllbnRhdGlvbl9wcmVzZW50ID0gMDsKLSAgICBoLT5zZWlfcmVndXNlcmRhdGFfYWZkX3ByZXNlbnQgID0gIDA7CisgICAgaC0+cmVjb3ZlcnlfcG9pbnQucmVjb3ZlcnlfZnJhbWVfY250ID0gLTE7CiAKLSAgICBoLT5hNTNfY2FwdGlvbl9zaXplID0gMDsKLSAgICBhdl9mcmVlcCgmaC0+YTUzX2NhcHRpb24pOworICAgIGgtPnBpY3R1cmVfdGltaW5nLmRwYl9vdXRwdXRfZGVsYXkgID0gMDsKKyAgICBoLT5waWN0dXJlX3RpbWluZy5jcGJfcmVtb3ZhbF9kZWxheSA9IC0xOworCisgICAgaC0+cGljdHVyZV90aW1pbmcucHJlc2VudCAgICAgID0gMDsKKyAgICBoLT5idWZmZXJpbmdfcGVyaW9kLnByZXNlbnQgICAgPSAwOworICAgIGgtPmZyYW1lX3BhY2tpbmcucHJlc2VudCAgICAgICA9IDA7CisgICAgaC0+ZGlzcGxheV9vcmllbnRhdGlvbi5wcmVzZW50ID0gMDsKKyAgICBoLT5hZmQucHJlc2VudCAgICAgICAgICAgICAgICAgPSAgMDsKKworICAgIGgtPmE1M19jYXB0aW9uLmE1M19jYXB0aW9uX3NpemUgPSAwOworICAgIGF2X2ZyZWVwKCZoLT5hNTNfY2FwdGlvbi5hNTNfY2FwdGlvbik7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX3BpY3R1cmVfdGltaW5nKEgyNjRDb250ZXh0ICpoKQorc3RhdGljIGludCBkZWNvZGVfcGljdHVyZV90aW1pbmcoSDI2NFNFSVBpY3R1cmVUaW1pbmcgKmgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NFBhcmFtU2V0cyAqcHMsIHZvaWQgKmxvZ2N0eCkKIHsKLSAgICBTUFMgKnNwcyA9ICZoLT5zcHM7CiAgICAgaW50IGk7CisgICAgY29uc3QgU1BTICpzcHMgPSBwcy0+c3BzOwogCiAgICAgZm9yIChpID0gMDsgaTxNQVhfU1BTX0NPVU5UOyBpKyspCi0gICAgICAgIGlmICghc3BzLT5sb2cyX21heF9mcmFtZV9udW0gJiYgaC0+c3BzX2J1ZmZlcnNbaV0pCi0gICAgICAgICAgICBzcHMgPSBoLT5zcHNfYnVmZmVyc1tpXTsKKyAgICAgICAgaWYgKCghc3BzIHx8ICFzcHMtPmxvZzJfbWF4X2ZyYW1lX251bSkgJiYgcHMtPnNwc19saXN0W2ldKQorICAgICAgICAgICAgc3BzID0gKGNvbnN0IFNQUyAqKXBzLT5zcHNfbGlzdFtpXS0+ZGF0YTsKIAotICAgIGlmIChzcHMtPm5hbF9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgfHwgc3BzLT52Y2xfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgIGgtPnNlaV9jcGJfcmVtb3ZhbF9kZWxheSA9IGdldF9iaXRzX2xvbmcoJmgtPmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcy0+Y3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKLSAgICAgICAgaC0+c2VpX2RwYl9vdXRwdXRfZGVsYXkgID0gZ2V0X2JpdHNfbG9uZygmaC0+Z2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT5kcGJfb3V0cHV0X2RlbGF5X2xlbmd0aCk7CisgICAgaWYgKCFzcHMpIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLCAiU1BTIHVuYXZhaWxhYmxlIGluIGRlY29kZV9waWN0dXJlX3RpbWluZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BTX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBpZiAoc3BzLT5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnIHx8CisgICAgICAgIHNwcy0+dmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgeworICAgICAgICBoLT5jcGJfcmVtb3ZhbF9kZWxheSA9IGdldF9iaXRzX2xvbmcoZ2IsIHNwcy0+Y3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKKyAgICAgICAgaC0+ZHBiX291dHB1dF9kZWxheSAgPSBnZXRfYml0c19sb25nKGdiLCBzcHMtPmRwYl9vdXRwdXRfZGVsYXlfbGVuZ3RoKTsKICAgICB9CiAgICAgaWYgKHNwcy0+cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcpIHsKICAgICAgICAgdW5zaWduZWQgaW50IGksIG51bV9jbG9ja190czsKIAotICAgICAgICBoLT5zZWlfcGljX3N0cnVjdCA9IGdldF9iaXRzKCZoLT5nYiwgNCk7Ci0gICAgICAgIGgtPnNlaV9jdF90eXBlICAgID0gMDsKKyAgICAgICAgaC0+cGljX3N0cnVjdCA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgaC0+Y3RfdHlwZSAgICA9IDA7CiAKLSAgICAgICAgaWYgKGgtPnNlaV9waWNfc3RydWN0ID4gU0VJX1BJQ19TVFJVQ1RfRlJBTUVfVFJJUExJTkcpCisgICAgICAgIGlmIChoLT5waWNfc3RydWN0ID4gSDI2NF9TRUlfUElDX1NUUlVDVF9GUkFNRV9UUklQTElORykKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgICAgIG51bV9jbG9ja190cyA9IHNlaV9udW1fY2xvY2tfdHNfdGFibGVbaC0+c2VpX3BpY19zdHJ1Y3RdOworICAgICAgICBudW1fY2xvY2tfdHMgPSBzZWlfbnVtX2Nsb2NrX3RzX3RhYmxlW2gtPnBpY19zdHJ1Y3RdOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY2xvY2tfdHM7IGkrKykgewotICAgICAgICAgICAgaWYgKGdldF9iaXRzKCZoLT5nYiwgMSkpIHsgICAgICAgICAgICAgICAgLyogY2xvY2tfdGltZXN0YW1wX2ZsYWcgKi8KKyAgICAgICAgICAgIGlmIChnZXRfYml0cyhnYiwgMSkpIHsgICAgICAgICAgICAgICAgLyogY2xvY2tfdGltZXN0YW1wX2ZsYWcgKi8KICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZnVsbF90aW1lc3RhbXBfZmxhZzsKIAotICAgICAgICAgICAgICAgIGgtPnNlaV9jdF90eXBlIHw9IDEgPDwgZ2V0X2JpdHMoJmgtPmdiLCAyKTsKLSAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCAxKTsgICAgICAgICAgICAgICAgIC8qIG51aXRfZmllbGRfYmFzZWRfZmxhZyAqLwotICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDUpOyAgICAgICAgICAgICAgICAgLyogY291bnRpbmdfdHlwZSAqLwotICAgICAgICAgICAgICAgIGZ1bGxfdGltZXN0YW1wX2ZsYWcgPSBnZXRfYml0cygmaC0+Z2IsIDEpOwotICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDEpOyAgICAgICAgICAgICAgICAgLyogZGlzY29udGludWl0eV9mbGFnICovCi0gICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgMSk7ICAgICAgICAgICAgICAgICAvKiBjbnRfZHJvcHBlZF9mbGFnICovCi0gICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgOCk7ICAgICAgICAgICAgICAgICAvKiBuX2ZyYW1lcyAqLworICAgICAgICAgICAgICAgIGgtPmN0X3R5cGUgfD0gMSA8PCBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgICAgICAgICAgICAgICAgIC8qIG51aXRfZmllbGRfYmFzZWRfZmxhZyAqLworICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNSk7ICAgICAgICAgICAgICAgICAvKiBjb3VudGluZ190eXBlICovCisgICAgICAgICAgICAgICAgZnVsbF90aW1lc3RhbXBfZmxhZyA9IGdldF9iaXRzKGdiLCAxKTsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDEpOyAgICAgICAgICAgICAgICAgLyogZGlzY29udGludWl0eV9mbGFnICovCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgICAgICAgICAgICAgICAgIC8qIGNudF9kcm9wcGVkX2ZsYWcgKi8KKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOyAgICAgICAgICAgICAgICAgLyogbl9mcmFtZXMgKi8KICAgICAgICAgICAgICAgICBpZiAoZnVsbF90aW1lc3RhbXBfZmxhZykgewotICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCA2KTsgICAgICAgICAgICAgLyogc2Vjb25kc192YWx1ZSAwLi41OSAqLwotICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCA2KTsgICAgICAgICAgICAgLyogbWludXRlc192YWx1ZSAwLi41OSAqLwotICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCA1KTsgICAgICAgICAgICAgLyogaG91cnNfdmFsdWUgMC4uMjMgKi8KKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA2KTsgICAgICAgICAgICAgLyogc2Vjb25kc192YWx1ZSAwLi41OSAqLworICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDYpOyAgICAgICAgICAgICAvKiBtaW51dGVzX3ZhbHVlIDAuLjU5ICovCisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNSk7ICAgICAgICAgICAgIC8qIGhvdXJzX3ZhbHVlIDAuLjIzICovCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzKCZoLT5nYiwgMSkpIHsgICAgICAgIC8qIHNlY29uZHNfZmxhZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgNik7ICAgICAgICAgLyogc2Vjb25kc192YWx1ZSByYW5nZSAwLi41OSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzKCZoLT5nYiwgMSkpIHsgICAgLyogbWludXRlc19mbGFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgNik7ICAgICAvKiBtaW51dGVzX3ZhbHVlIDAuLjU5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzKCZoLT5nYiwgMSkpICAvKiBob3Vyc19mbGFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDUpOyAvKiBob3Vyc192YWx1ZSAwLi4yMyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMoZ2IsIDEpKSB7ICAgICAgICAvKiBzZWNvbmRzX2ZsYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNik7ICAgICAgICAgLyogc2Vjb25kc192YWx1ZSByYW5nZSAwLi41OSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzKGdiLCAxKSkgeyAgICAvKiBtaW51dGVzX2ZsYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDYpOyAgICAgLyogbWludXRlc192YWx1ZSAwLi41OSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRfYml0cyhnYiwgMSkpICAvKiBob3Vyc19mbGFnICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNSk7IC8qIGhvdXJzX3ZhbHVlIDAuLjIzICovCiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKHNwcy0+dGltZV9vZmZzZXRfbGVuZ3RoID4gMCkKLSAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT50aW1lX29mZnNldF9sZW5ndGgpOyAvKiB0aW1lX29mZnNldCAqLwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiY3RfdHlwZTolWCBwaWNfc3RydWN0OiVkXG4iLAotICAgICAgICAgICAgICAgICAgIGgtPnNlaV9jdF90eXBlLCBoLT5zZWlfcGljX3N0cnVjdCk7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19ERUJVRywgImN0X3R5cGU6JVggcGljX3N0cnVjdDolZFxuIiwKKyAgICAgICAgICAgICAgIGgtPmN0X3R5cGUsIGgtPnBpY19zdHJ1Y3QpOwogICAgIH0KKworICAgIGgtPnByZXNlbnQgPSAxOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV9yZWdpc3RlcmVkX3VzZXJfZGF0YV9hZmQoSDI2NENvbnRleHQgKmgsIGludCBzaXplKQorc3RhdGljIGludCBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGFfYWZkKEgyNjRTRUlBRkQgKmgsIEdldEJpdENvbnRleHQgKmdiLCBpbnQgc2l6ZSkKIHsKICAgICBpbnQgZmxhZzsKIAogICAgIGlmIChzaXplLS0gPCAxKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBza2lwX2JpdHMoJmgtPmdiLCAxKTsgICAgICAgICAgICAgICAvLyAwCi0gICAgZmxhZyA9IGdldF9iaXRzKCZoLT5nYiwgMSk7ICAgICAgICAgLy8gYWN0aXZlX2Zvcm1hdF9mbGFnCi0gICAgc2tpcF9iaXRzKCZoLT5nYiwgNik7ICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICBza2lwX2JpdHMoZ2IsIDEpOyAgICAgICAgICAgICAgIC8vIDAKKyAgICBmbGFnID0gZ2V0X2JpdHMoZ2IsIDEpOyAgICAgICAgIC8vIGFjdGl2ZV9mb3JtYXRfZmxhZworICAgIHNraXBfYml0cyhnYiwgNik7ICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKIAogICAgIGlmIChmbGFnKSB7CiAgICAgICAgIGlmIChzaXplLS0gPCAxKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDQpOyAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICAgICAgaC0+YWN0aXZlX2Zvcm1hdF9kZXNjcmlwdGlvbiAgID0gZ2V0X2JpdHMoJmgtPmdiLCA0KTsKLSAgICAgICAgaC0+c2VpX3JlZ3VzZXJkYXRhX2FmZF9wcmVzZW50ID0gMTsKLSNpZiBGRl9BUElfQUZECi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgICAgIGgtPmF2Y3R4LT5kdGdfYWN0aXZlX2Zvcm1hdCA9IGgtPmFjdGl2ZV9mb3JtYXRfZGVzY3JpcHRpb247Ci1GRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZiAvKiBGRl9BUElfQUZEICovCisgICAgICAgIHNraXBfYml0cyhnYiwgNCk7ICAgICAgICAgICAvLyByZXNlcnZlZAorICAgICAgICBoLT5hY3RpdmVfZm9ybWF0X2Rlc2NyaXB0aW9uID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICBoLT5wcmVzZW50ICAgICAgICAgICAgICAgICAgID0gMTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGFfY2xvc2VkX2NhcHRpb24oSDI2NENvbnRleHQgKmgsIGludCBzaXplKQorc3RhdGljIGludCBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGFfY2xvc2VkX2NhcHRpb24oSDI2NFNFSUE1M0NhcHRpb24gKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLCB2b2lkICpsb2djdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQogewogICAgIGludCBmbGFnOwogICAgIGludCB1c2VyX2RhdGFfdHlwZV9jb2RlOwpAQCAtMTQ3LDE1ICsxNTcsMTUgQEAKICAgICBpZiAoc2l6ZSA8IDMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAKLSAgICB1c2VyX2RhdGFfdHlwZV9jb2RlID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsKKyAgICB1c2VyX2RhdGFfdHlwZV9jb2RlID0gZ2V0X2JpdHMoZ2IsIDgpOwogICAgIGlmICh1c2VyX2RhdGFfdHlwZV9jb2RlID09IDB4MykgewotICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCAxKTsgICAgICAgICAgIC8vIHJlc2VydmVkCisgICAgICAgIHNraXBfYml0cyhnYiwgMSk7ICAgICAgICAgICAvLyByZXNlcnZlZAogCi0gICAgICAgIGZsYWcgPSBnZXRfYml0cygmaC0+Z2IsIDEpOyAgICAgLy8gcHJvY2Vzc19jY19kYXRhX2ZsYWcKKyAgICAgICAgZmxhZyA9IGdldF9iaXRzKGdiLCAxKTsgICAgIC8vIHByb2Nlc3NfY2NfZGF0YV9mbGFnCiAgICAgICAgIGlmIChmbGFnKSB7Ci0gICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCAxKTsgICAgICAgLy8gemVybyBiaXQKLSAgICAgICAgICAgIGNjX2NvdW50ID0gZ2V0X2JpdHMoJmgtPmdiLCA1KTsKLSAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDgpOyAgICAgICAvLyByZXNlcnZlZAorICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgICAgICAgLy8gemVybyBiaXQKKyAgICAgICAgICAgIGNjX2NvdW50ID0gZ2V0X2JpdHMoZ2IsIDUpOworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsgICAgICAgLy8gcmVzZXJ2ZWQKICAgICAgICAgICAgIHNpemUgLT0gMjsKIAogICAgICAgICAgICAgaWYgKGNjX2NvdW50ICYmIHNpemUgPj0gY2NfY291bnQgKiAzKSB7CkBAIC0xNzIsMjQgKzE4MiwyNSBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNjX2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaC0+YTUzX2NhcHRpb25baC0+YTUzX2NhcHRpb25fc2l6ZSsrXSA9IGdldF9iaXRzKCZoLT5nYiwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIGgtPmE1M19jYXB0aW9uW2gtPmE1M19jYXB0aW9uX3NpemUrK10gPSBnZXRfYml0cygmaC0+Z2IsIDgpOwotICAgICAgICAgICAgICAgICAgICBoLT5hNTNfY2FwdGlvbltoLT5hNTNfY2FwdGlvbl9zaXplKytdID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgaC0+YTUzX2NhcHRpb25baC0+YTUzX2NhcHRpb25fc2l6ZSsrXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgaC0+YTUzX2NhcHRpb25baC0+YTUzX2NhcHRpb25fc2l6ZSsrXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgaC0+YTUzX2NhcHRpb25baC0+YTUzX2NhcHRpb25fc2l6ZSsrXSA9IGdldF9iaXRzKGdiLCA4KTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCA4KTsgICAvLyBtYXJrZXJfYml0cworICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgOCk7ICAgLy8gbWFya2VyX2JpdHMKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDE7IGkrKykKLSAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDgpOworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGEoSDI2NENvbnRleHQgKmgsIGludCBzaXplKQorc3RhdGljIGludCBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGEoSDI2NFNFSUNvbnRleHQgKmgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nY3R4LCBpbnQgc2l6ZSkKIHsKICAgICB1aW50MzJfdCBjb3VudHJ5X2NvZGU7CiAgICAgdWludDMyX3QgdXNlcl9pZGVudGlmaWVyOwpAQCAtMTk4LDMxICsyMDksMzMgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgc2l6ZSAtPSA3OwogCi0gICAgY291bnRyeV9jb2RlID0gZ2V0X2JpdHMoJmgtPmdiLCA4KTsgLy8gaXR1X3RfdDM1X2NvdW50cnlfY29kZQorICAgIGNvdW50cnlfY29kZSA9IGdldF9iaXRzKGdiLCA4KTsgLy8gaXR1X3RfdDM1X2NvdW50cnlfY29kZQogICAgIGlmIChjb3VudHJ5X2NvZGUgPT0gMHhGRikgewotICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCA4KTsgICAgICAgICAgIC8vIGl0dV90X3QzNV9jb3VudHJ5X2NvZGVfZXh0ZW5zaW9uX2J5dGUKKyAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsgICAgICAgICAgIC8vIGl0dV90X3QzNV9jb3VudHJ5X2NvZGVfZXh0ZW5zaW9uX2J5dGUKICAgICAgICAgc2l6ZS0tOwogICAgIH0KIAogICAgIC8qIGl0dV90X3QzNV9wYXlsb2FkX2J5dGUgZm9sbG93cyAqLwotICAgIHNraXBfYml0cygmaC0+Z2IsIDgpOyAgICAgICAgICAgICAgLy8gdGVybWluYWwgcHJvdmlkZXIgY29kZQotICAgIHNraXBfYml0cygmaC0+Z2IsIDgpOyAgICAgICAgICAgICAgLy8gdGVybWluYWwgcHJvdmlkZXIgb3JpZW50ZWQgY29kZQotICAgIHVzZXJfaWRlbnRpZmllciA9IGdldF9iaXRzX2xvbmcoJmgtPmdiLCAzMik7CisgICAgc2tpcF9iaXRzKGdiLCA4KTsgICAgICAgICAgICAgIC8vIHRlcm1pbmFsIHByb3ZpZGVyIGNvZGUKKyAgICBza2lwX2JpdHMoZ2IsIDgpOyAgICAgICAgICAgICAgLy8gdGVybWluYWwgcHJvdmlkZXIgb3JpZW50ZWQgY29kZQorICAgIHVzZXJfaWRlbnRpZmllciA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKIAogICAgIHN3aXRjaCAodXNlcl9pZGVudGlmaWVyKSB7CiAgICAgICAgIGNhc2UgTUtCRVRBRygnRCcsICdUJywgJ0cnLCAnMScpOiAgICAgICAvLyBhZmRfZGF0YQotICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9yZWdpc3RlcmVkX3VzZXJfZGF0YV9hZmQoaCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gZGVjb2RlX3JlZ2lzdGVyZWRfdXNlcl9kYXRhX2FmZCgmaC0+YWZkLCBnYiwgc2l6ZSk7CiAgICAgICAgIGNhc2UgTUtCRVRBRygnRycsICdBJywgJzknLCAnNCcpOiAgICAgICAvLyBjbG9zZWQgY2FwdGlvbnMKLSAgICAgICAgICAgIHJldHVybiBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGFfY2xvc2VkX2NhcHRpb24oaCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gZGVjb2RlX3JlZ2lzdGVyZWRfdXNlcl9kYXRhX2Nsb3NlZF9jYXB0aW9uKCZoLT5hNTNfY2FwdGlvbiwgZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2N0eCwgc2l6ZSk7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCBzaXplICogOCk7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIHNpemUgKiA4KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV91bnJlZ2lzdGVyZWRfdXNlcl9kYXRhKEgyNjRDb250ZXh0ICpoLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgZGVjb2RlX3VucmVnaXN0ZXJlZF91c2VyX2RhdGEoSDI2NFNFSVVucmVnaXN0ZXJlZCAqaCwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmxvZ2N0eCwgaW50IHNpemUpCiB7CiAgICAgdWludDhfdCAqdXNlcl9kYXRhOwogICAgIGludCBlLCBidWlsZCwgaTsKQEAgLTIzNSw3ICsyNDgsNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHNpemUgKyAxNjsgaSsrKQotICAgICAgICB1c2VyX2RhdGFbaV0gPSBnZXRfYml0cygmaC0+Z2IsIDgpOworICAgICAgICB1c2VyX2RhdGFbaV0gPSBnZXRfYml0cyhnYiwgOCk7CiAKICAgICB1c2VyX2RhdGFbaV0gPSAwOwogICAgIGUgPSBzc2NhbmYodXNlcl9kYXRhICsgMTYsICJ4MjY0IC0gY29yZSAlZCIsICZidWlsZCk7CkBAIC0yNDQsMjg5ICsyNTcsMjU3IEBACiAgICAgaWYgKGUgPT0gMSAmJiBidWlsZCA9PSAxICYmICFzdHJuY21wKHVzZXJfZGF0YSsxNiwgIngyNjQgLSBjb3JlIDAwMDAiLCAxNikpCiAgICAgICAgIGgtPngyNjRfYnVpbGQgPSA2NzsKIAotICAgIGlmIChzdHJsZW4odXNlcl9kYXRhICsgMTYpID4gMCkKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJ1c2VyIGRhdGE6XCIlc1wiXG4iLCB1c2VyX2RhdGEgKyAxNik7Ci0KICAgICBhdl9mcmVlKHVzZXJfZGF0YSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX3JlY292ZXJ5X3BvaW50KEgyNjRDb250ZXh0ICpoKQorc3RhdGljIGludCBkZWNvZGVfcmVjb3ZlcnlfcG9pbnQoSDI2NFNFSVJlY292ZXJ5UG9pbnQgKmgsIEdldEJpdENvbnRleHQgKmdiLCB2b2lkICpsb2djdHgpCiB7Ci0gICAgaC0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudCA9IGdldF91ZV9nb2xvbWJfbG9uZygmaC0+Z2IpOworICAgIHVuc2lnbmVkIHJlY292ZXJ5X2ZyYW1lX2NudCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CiAKKyAgICBpZiAocmVjb3ZlcnlfZnJhbWVfY250ID49ICgxPDxNQVhfTE9HMl9NQVhfRlJBTUVfTlVNKSkgeworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJyZWNvdmVyeV9mcmFtZV9jbnQgJXUgaXMgb3V0IG9mIHJhbmdlXG4iLCByZWNvdmVyeV9mcmFtZV9jbnQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBoLT5yZWNvdmVyeV9mcmFtZV9jbnQgPSByZWNvdmVyeV9mcmFtZV9jbnQ7CiAgICAgLyogMWIgZXhhY3RfbWF0Y2hfZmxhZywKICAgICAgKiAxYiBicm9rZW5fbGlua19mbGFnLAogICAgICAqIDJiIGNoYW5naW5nX3NsaWNlX2dyb3VwX2lkYyAqLwotICAgIHNraXBfYml0cygmaC0+Z2IsIDQpOwotCi0gICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzZWlfcmVjb3ZlcnlfZnJhbWVfY250OiAlZFxuIiwgaC0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudCk7Ci0KLSAgICBoLT5oYXNfcmVjb3ZlcnlfcG9pbnQgPSAxOworICAgIHNraXBfYml0cyhnYiwgNCk7CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfYnVmZmVyaW5nX3BlcmlvZChIMjY0Q29udGV4dCAqaCkKK3N0YXRpYyBpbnQgZGVjb2RlX2J1ZmZlcmluZ19wZXJpb2QoSDI2NFNFSUJ1ZmZlcmluZ1BlcmlvZCAqaCwgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEgyNjRQYXJhbVNldHMgKnBzLCB2b2lkICpsb2djdHgpCiB7CiAgICAgdW5zaWduZWQgaW50IHNwc19pZDsKICAgICBpbnQgc2NoZWRfc2VsX2lkeDsKLSAgICBTUFMgKnNwczsKKyAgICBjb25zdCBTUFMgKnNwczsKIAotICAgIHNwc19pZCA9IGdldF91ZV9nb2xvbWJfMzEoJmgtPmdiKTsKLSAgICBpZiAoc3BzX2lkID4gMzEgfHwgIWgtPnNwc19idWZmZXJzW3Nwc19pZF0pIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgc3BzX2lkID0gZ2V0X3VlX2dvbG9tYl8zMShnYik7CisgICAgaWYgKHNwc19pZCA+IDMxIHx8ICFwcy0+c3BzX2xpc3Rbc3BzX2lkXSkgeworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIFNQUyAlZCByZWZlcmVuY2VkIGluIGJ1ZmZlcmluZyBwZXJpb2RcbiIsIHNwc19pZCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICByZXR1cm4gc3BzX2lkID4gMzEgPyBBVkVSUk9SX0lOVkFMSUREQVRBIDogQVZFUlJPUl9QU19OT1RfRk9VTkQ7CiAgICAgfQotICAgIHNwcyA9IGgtPnNwc19idWZmZXJzW3Nwc19pZF07CisgICAgc3BzID0gKGNvbnN0IFNQUyopcHMtPnNwc19saXN0W3Nwc19pZF0tPmRhdGE7CiAKICAgICAvLyBOT1RFOiBUaGlzIGlzIHJlYWxseSBzbyBkdXBsaWNhdGVkIGluIHRoZSBzdGFuZGFyZC4uLiBTZWUgSC4yNjQsIEQuMS4xCiAgICAgaWYgKHNwcy0+bmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgewogICAgICAgICBmb3IgKHNjaGVkX3NlbF9pZHggPSAwOyBzY2hlZF9zZWxfaWR4IDwgc3BzLT5jcGJfY250OyBzY2hlZF9zZWxfaWR4KyspIHsKICAgICAgICAgICAgIGgtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbc2NoZWRfc2VsX2lkeF0gPQotICAgICAgICAgICAgICAgIGdldF9iaXRzX2xvbmcoJmgtPmdiLCBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnZXRfYml0c19sb25nKGdiLCBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKICAgICAgICAgICAgIC8vIGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0Ci0gICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgc3BzLT5pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHNwcy0+dmNsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZykgewogICAgICAgICBmb3IgKHNjaGVkX3NlbF9pZHggPSAwOyBzY2hlZF9zZWxfaWR4IDwgc3BzLT5jcGJfY250OyBzY2hlZF9zZWxfaWR4KyspIHsKICAgICAgICAgICAgIGgtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbc2NoZWRfc2VsX2lkeF0gPQotICAgICAgICAgICAgICAgIGdldF9iaXRzX2xvbmcoJmgtPmdiLCBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBnZXRfYml0c19sb25nKGdiLCBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKICAgICAgICAgICAgIC8vIGluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfb2Zmc2V0Ci0gICAgICAgICAgICBza2lwX2JpdHMoJmgtPmdiLCBzcHMtPmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlfbGVuZ3RoKTsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgc3BzLT5pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBoLT5zZWlfYnVmZmVyaW5nX3BlcmlvZF9wcmVzZW50ID0gMTsKKyAgICBoLT5wcmVzZW50ID0gMTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudChIMjY0Q29udGV4dCAqaCkKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnQoSDI2NFNFSUZyYW1lUGFja2luZyAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IpCiB7Ci0gICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2lkICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKCZoLT5nYik7Ci0gICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2NhbmNlbF9mbGFnID0gZ2V0X2JpdHMxKCZoLT5nYik7Ci0gICAgaC0+c2VpX2ZyYW1lX3BhY2tpbmdfcHJlc2VudCA9ICFoLT5zZWlfZnBhLmZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWc7CisgICAgaC0+YXJyYW5nZW1lbnRfaWQgICAgICAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgIGgtPmFycmFuZ2VtZW50X2NhbmNlbF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICBoLT5wcmVzZW50ID0gIWgtPmFycmFuZ2VtZW50X2NhbmNlbF9mbGFnOwogCi0gICAgaWYgKGgtPnNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQpIHsKLSAgICAgICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgPQotICAgICAgICBoLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgPSBnZXRfYml0cygmaC0+Z2IsIDcpOwotICAgICAgICBoLT5zZWlfZnBhLnF1aW5jdW54X3NhbXBsaW5nX2ZsYWcgICAgICAgICA9Ci0gICAgICAgIGgtPnF1aW5jdW54X3N1YnNhbXBsaW5nICAgICAgICAgICA9IGdldF9iaXRzMSgmaC0+Z2IpOwotICAgICAgICBoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSAgICA9Ci0gICAgICAgIGgtPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSAgICA9IGdldF9iaXRzKCZoLT5nYiwgNik7CisgICAgaWYgKGgtPnByZXNlbnQpIHsKKyAgICAgICAgaC0+YXJyYW5nZW1lbnRfdHlwZSA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICAgICAgaC0+cXVpbmN1bnhfc2FtcGxpbmdfZmxhZyAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaC0+Y29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlICAgID0gZ2V0X2JpdHMoZ2IsIDYpOwogCi0gICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgc2tpcHM6IHNwYXRpYWxfZmxpcHBpbmdfZmxhZywgZnJhbWUwX2ZsaXBwZWRfZmxhZywKLSAgICAgICAgLy8gZmllbGRfdmlld3NfZmxhZywgY3VycmVudF9mcmFtZV9pc19mcmFtZTBfZmxhZywKKyAgICAgICAgLy8gc3BhdGlhbF9mbGlwcGluZ19mbGFnLCBmcmFtZTBfZmxpcHBlZF9mbGFnLCBmaWVsZF92aWV3c19mbGFnCisgICAgICAgIHNraXBfYml0cyhnYiwgMyk7CisgICAgICAgIGgtPmN1cnJlbnRfZnJhbWVfaXNfZnJhbWUwX2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgICAgICAvLyBmcmFtZTBfc2VsZl9jb250YWluZWRfZmxhZywgZnJhbWUxX3NlbGZfY29udGFpbmVkX2ZsYWcKLSAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgNik7CisgICAgICAgIHNraXBfYml0cyhnYiwgMik7CiAKLSAgICAgICAgaWYgKCFoLT5xdWluY3VueF9zdWJzYW1wbGluZyAmJiBoLT5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUgIT0gNSkKLSAgICAgICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDE2KTsgICAgICAvLyBmcmFtZVswMV1fZ3JpZF9wb3NpdGlvbl9beHldCi0gICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDgpOyAgICAgICAgICAgLy8gZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9yZXNlcnZlZF9ieXRlCi0gICAgICAgIGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9yZXBldGl0aW9uX3BlcmlvZCA9IGdldF91ZV9nb2xvbWJfbG9uZygmaC0+Z2IpOworICAgICAgICBpZiAoIWgtPnF1aW5jdW54X3NhbXBsaW5nX2ZsYWcgJiYgaC0+YXJyYW5nZW1lbnRfdHlwZSAhPSA1KQorICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxNik7ICAgICAgLy8gZnJhbWVbMDFdX2dyaWRfcG9zaXRpb25fW3h5XQorICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOyAgICAgICAgICAgLy8gZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9yZXNlcnZlZF9ieXRlCisgICAgICAgIGgtPmFycmFuZ2VtZW50X3JlcGV0aXRpb25fcGVyaW9kID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKICAgICB9Ci0gICAgc2tpcF9iaXRzMSgmaC0+Z2IpOyAgICAgICAgICAgICAgICAgLy8gZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9leHRlbnNpb25fZmxhZwotCi0gICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJTRUkgRlBBICVkICVkICVkICVkICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2NhbmNlbF9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zZWlfZnBhLnF1aW5jdW54X3NhbXBsaW5nX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9yZXBldGl0aW9uX3BlcmlvZCk7CisgICAgc2tpcF9iaXRzMShnYik7ICAgICAgICAgICAgICAgICAvLyBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2V4dGVuc2lvbl9mbGFnCiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfZGlzcGxheV9vcmllbnRhdGlvbihIMjY0Q29udGV4dCAqaCkKK3N0YXRpYyBpbnQgZGVjb2RlX2Rpc3BsYXlfb3JpZW50YXRpb24oSDI2NFNFSURpc3BsYXlPcmllbnRhdGlvbiAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IpCiB7Ci0gICAgaC0+c2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudCA9ICFnZXRfYml0czEoJmgtPmdiKTsKKyAgICBoLT5wcmVzZW50ID0gIWdldF9iaXRzMShnYik7CiAKLSAgICBpZiAoaC0+c2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudCkgewotICAgICAgICBoLT5zZWlfaGZsaXAgPSBnZXRfYml0czEoJmgtPmdiKTsgICAgIC8vIGhvcl9mbGlwCi0gICAgICAgIGgtPnNlaV92ZmxpcCA9IGdldF9iaXRzMSgmaC0+Z2IpOyAgICAgLy8gdmVyX2ZsaXAKKyAgICBpZiAoaC0+cHJlc2VudCkgeworICAgICAgICBoLT5oZmxpcCA9IGdldF9iaXRzMShnYik7ICAgICAvLyBob3JfZmxpcAorICAgICAgICBoLT52ZmxpcCA9IGdldF9iaXRzMShnYik7ICAgICAvLyB2ZXJfZmxpcAogCi0gICAgICAgIGgtPnNlaV9hbnRpY2xvY2t3aXNlX3JvdGF0aW9uID0gZ2V0X2JpdHMoJmgtPmdiLCAxNik7Ci0gICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZygmaC0+Z2IpOyAgLy8gZGlzcGxheV9vcmllbnRhdGlvbl9yZXBldGl0aW9uX3BlcmlvZAotICAgICAgICBza2lwX2JpdHMxKCZoLT5nYik7ICAgICAgICAgIC8vIGRpc3BsYXlfb3JpZW50YXRpb25fZXh0ZW5zaW9uX2ZsYWcKKyAgICAgICAgaC0+YW50aWNsb2Nrd2lzZV9yb3RhdGlvbiA9IGdldF9iaXRzKGdiLCAxNik7CisgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZyhnYik7ICAgICAgIC8vIGRpc3BsYXlfb3JpZW50YXRpb25fcmVwZXRpdGlvbl9wZXJpb2QKKyAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAgICAgICAgICAgLy8gZGlzcGxheV9vcmllbnRhdGlvbl9leHRlbnNpb25fZmxhZwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV9HcmVlbk1ldGFkYXRhKEgyNjRDb250ZXh0ICpoKQorc3RhdGljIGludCBkZWNvZGVfZ3JlZW5fbWV0YWRhdGEoSDI2NFNFSUdyZWVuTWV0YURhdGEgKmgsIEdldEJpdENvbnRleHQgKmdiKQogewotICAgIGlmIChoLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19HUkVFTl9NRCkKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICAgICAgICAgICJHcmVlbiBNZXRhZGF0YSBJbmZvIFNFSSBtZXNzYWdlXG4iKTsKKyAgICBoLT5ncmVlbl9tZXRhZGF0YV90eXBlID0gZ2V0X2JpdHMoZ2IsIDgpOwogCi0gICAgaC0+c2VpX2dyZWVuX21ldGFkYXRhLmdyZWVuX21ldGFkYXRhX3R5cGU9Z2V0X2JpdHMoJmgtPmdiLCA4KTsKKyAgICBpZiAoaC0+Z3JlZW5fbWV0YWRhdGFfdHlwZSA9PSAwKSB7CisgICAgICAgIGgtPnBlcmlvZF90eXBlID0gZ2V0X2JpdHMoZ2IsIDgpOwogCi0gICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0dSRUVOX01EKQotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgICAgICAgICAgImdyZWVuX21ldGFkYXRhX3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlZFxuIiwKLSAgICAgICAgICAgICAgIGgtPnNlaV9ncmVlbl9tZXRhZGF0YS5ncmVlbl9tZXRhZGF0YV90eXBlKTsKKyAgICAgICAgaWYgKGgtPnBlcmlvZF90eXBlID09IDIpCisgICAgICAgICAgICBoLT5udW1fc2Vjb25kcyA9IGdldF9iaXRzKGdiLCAxNik7CisgICAgICAgIGVsc2UgaWYgKGgtPnBlcmlvZF90eXBlID09IDMpCisgICAgICAgICAgICBoLT5udW1fcGljdHVyZXMgPSBnZXRfYml0cyhnYiwgMTYpOwogCi0gICAgaWYgKGgtPnNlaV9ncmVlbl9tZXRhZGF0YS5ncmVlbl9tZXRhZGF0YV90eXBlPT0wKXsKLSAgICAgICAgaC0+c2VpX2dyZWVuX21ldGFkYXRhLnBlcmlvZF90eXBlPWdldF9iaXRzKCZoLT5nYiwgOCk7CisgICAgICAgIGgtPnBlcmNlbnRfbm9uX3plcm9fbWFjcm9ibG9ja3MgICAgICAgICAgICA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgaC0+cGVyY2VudF9pbnRyYV9jb2RlZF9tYWNyb2Jsb2NrcyAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBoLT5wZXJjZW50X3NpeF90YXBfZmlsdGVyaW5nICAgICAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIGgtPnBlcmNlbnRfYWxwaGFfcG9pbnRfZGVibG9ja2luZ19pbnN0YW5jZSA9IGdldF9iaXRzKGdiLCA4KTsKIAotICAgICAgICBpZiAoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfR1JFRU5fTUQpCi0gICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgICAgICAiZ3JlZW5fbWV0YWRhdGFfcGVyaW9kX3R5cGUgICAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGgtPnNlaV9ncmVlbl9tZXRhZGF0YS5wZXJpb2RfdHlwZSk7Ci0KLSAgICAgICAgaWYgKGgtPnNlaV9ncmVlbl9tZXRhZGF0YS5ncmVlbl9tZXRhZGF0YV90eXBlPT0yKXsKLSAgICAgICAgICAgIGgtPnNlaV9ncmVlbl9tZXRhZGF0YS5udW1fc2Vjb25kcyA9IGdldF9iaXRzKCZoLT5nYiwgMTYpOwotICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0dSRUVOX01EKQotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAgImdyZWVuX21ldGFkYXRhX251bV9zZWNvbmRzICAgICAgICAgICAgICAgICAgICAgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VpX2dyZWVuX21ldGFkYXRhLm51bV9zZWNvbmRzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChoLT5zZWlfZ3JlZW5fbWV0YWRhdGEucGVyaW9kX3R5cGU9PTMpewotICAgICAgICAgICAgaC0+c2VpX2dyZWVuX21ldGFkYXRhLm51bV9waWN0dXJlcyA9IGdldF9iaXRzKCZoLT5nYiwgMTYpOwotICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0dSRUVOX01EKQotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAgImdyZWVuX21ldGFkYXRhX251bV9waWN0dXJlcyAgICAgICAgICAgICAgICAgICAgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VpX2dyZWVuX21ldGFkYXRhLm51bV9waWN0dXJlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBoLT5zZWlfZ3JlZW5fbWV0YWRhdGEucGVyY2VudF9ub25femVyb19tYWNyb2Jsb2Nrcz1nZXRfYml0cygmaC0+Z2IsIDgpOwotICAgICAgICBoLT5zZWlfZ3JlZW5fbWV0YWRhdGEucGVyY2VudF9pbnRyYV9jb2RlZF9tYWNyb2Jsb2Nrcz1nZXRfYml0cygmaC0+Z2IsIDgpOwotICAgICAgICBoLT5zZWlfZ3JlZW5fbWV0YWRhdGEucGVyY2VudF9zaXhfdGFwX2ZpbHRlcmluZz1nZXRfYml0cygmaC0+Z2IsIDgpOwotICAgICAgICBoLT5zZWlfZ3JlZW5fbWV0YWRhdGEucGVyY2VudF9hbHBoYV9wb2ludF9kZWJsb2NraW5nX2luc3RhbmNlPWdldF9iaXRzKCZoLT5nYiwgOCk7Ci0KLSAgICAgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0dSRUVOX01EKQotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICAgICAgIlNFSSBHUkVFTiBDb21wbGV4aXR5IE1ldHJpY3MgICAgICAgICAgICAgICAgICAgPSAlZiAlZiAlZiAlZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpaC0+c2VpX2dyZWVuX21ldGFkYXRhLnBlcmNlbnRfbm9uX3plcm9fbWFjcm9ibG9ja3MvMjU1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCloLT5zZWlfZ3JlZW5fbWV0YWRhdGEucGVyY2VudF9pbnRyYV9jb2RlZF9tYWNyb2Jsb2Nrcy8yNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWgtPnNlaV9ncmVlbl9tZXRhZGF0YS5wZXJjZW50X3NpeF90YXBfZmlsdGVyaW5nLzI1NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpaC0+c2VpX2dyZWVuX21ldGFkYXRhLnBlcmNlbnRfYWxwaGFfcG9pbnRfZGVibG9ja2luZ19pbnN0YW5jZS8yNTUpOwotCi0gICAgfWVsc2UgaWYoIGgtPnNlaV9ncmVlbl9tZXRhZGF0YS5ncmVlbl9tZXRhZGF0YV90eXBlPT0xKXsKLSAgICAgICAgaC0+c2VpX2dyZWVuX21ldGFkYXRhLnhzZF9tZXRyaWNfdHlwZT1nZXRfYml0cygmaC0+Z2IsIDgpOwotICAgICAgICBoLT5zZWlfZ3JlZW5fbWV0YWRhdGEueHNkX21ldHJpY192YWx1ZT1nZXRfYml0cygmaC0+Z2IsIDE2KTsKLQotICAgICAgICBpZiAoaC0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfR1JFRU5fTUQpCi0gICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgICAgICAieHNkX21ldHJpY190eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGgtPnNlaV9ncmVlbl9tZXRhZGF0YS54c2RfbWV0cmljX3R5cGUpOwotICAgICAgICBpZiAoIGgtPnNlaV9ncmVlbl9tZXRhZGF0YS54c2RfbWV0cmljX3R5cGU9PTApewotICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX0dSRUVOX01EKQotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAgInhzZF9tZXRyaWNfdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAlZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWgtPnNlaV9ncmVlbl9tZXRhZGF0YS54c2RfbWV0cmljX3ZhbHVlLzEwMCk7Ci0gICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGgtPmdyZWVuX21ldGFkYXRhX3R5cGUgPT0gMSkgeworICAgICAgICBoLT54c2RfbWV0cmljX3R5cGUgID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICBoLT54c2RfbWV0cmljX3ZhbHVlID0gZ2V0X2JpdHMoZ2IsIDE2KTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGZmX2gyNjRfZGVjb2RlX3NlaShIMjY0Q29udGV4dCAqaCkKK3N0YXRpYyBpbnQgZGVjb2RlX2FsdGVybmF0aXZlX3RyYW5zZmVyKEgyNjRTRUlBbHRlcm5hdGl2ZVRyYW5zZmVyICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IpCiB7Ci0gICAgd2hpbGUgKGdldF9iaXRzX2xlZnQoJmgtPmdiKSA+IDE2ICYmIHNob3dfYml0cygmaC0+Z2IsIDE2KSkgeworICAgIGgtPnByZXNlbnQgPSAxOworICAgIGgtPnByZWZlcnJlZF90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9oMjY0X3NlaV9kZWNvZGUoSDI2NFNFSUNvbnRleHQgKmgsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIMjY0UGFyYW1TZXRzICpwcywgdm9pZCAqbG9nY3R4KQoreworICAgIGludCBtYXN0ZXJfcmV0ID0gMDsKKworICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KGdiKSA+IDE2ICYmIHNob3dfYml0cyhnYiwgMTYpKSB7CiAgICAgICAgIGludCB0eXBlID0gMDsKICAgICAgICAgdW5zaWduZWQgc2l6ZSA9IDA7CiAgICAgICAgIHVuc2lnbmVkIG5leHQ7CiAgICAgICAgIGludCByZXQgID0gMDsKIAogICAgICAgICBkbyB7Ci0gICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpIDwgOCkKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDgpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICB0eXBlICs9IHNob3dfYml0cygmaC0+Z2IsIDgpOwotICAgICAgICB9IHdoaWxlIChnZXRfYml0cygmaC0+Z2IsIDgpID09IDI1NSk7CisgICAgICAgICAgICB0eXBlICs9IHNob3dfYml0cyhnYiwgOCk7CisgICAgICAgIH0gd2hpbGUgKGdldF9iaXRzKGdiLCA4KSA9PSAyNTUpOwogCiAgICAgICAgIGRvIHsKLSAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZoLT5nYikgPCA4KQorICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgOCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIHNpemUgKz0gc2hvd19iaXRzKCZoLT5nYiwgOCk7Ci0gICAgICAgIH0gd2hpbGUgKGdldF9iaXRzKCZoLT5nYiwgOCkgPT0gMjU1KTsKKyAgICAgICAgICAgIHNpemUgKz0gc2hvd19iaXRzKGdiLCA4KTsKKyAgICAgICAgfSB3aGlsZSAoZ2V0X2JpdHMoZ2IsIDgpID09IDI1NSk7CiAKLSAgICAgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyZGRl9ERUJVR19TVEFSVENPREUpCi0gICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlNFSSAlZCBsZW46JWRcbiIsIHR5cGUsIHNpemUpOwotCi0gICAgICAgIGlmIChzaXplID4gZ2V0X2JpdHNfbGVmdCgmaC0+Z2IpIC8gOCkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJTRUkgdHlwZSAlZCBzaXplICVkIHRydW5jYXRlZCBhdCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICB0eXBlLCA4KnNpemUsIGdldF9iaXRzX2xlZnQoJmgtPmdiKSk7CisgICAgICAgIGlmIChzaXplID4gZ2V0X2JpdHNfbGVmdChnYikgLyA4KSB7CisgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJTRUkgdHlwZSAlZCBzaXplICVkIHRydW5jYXRlZCBhdCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICB0eXBlLCA4KnNpemUsIGdldF9iaXRzX2xlZnQoZ2IpKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9Ci0gICAgICAgIG5leHQgPSBnZXRfYml0c19jb3VudCgmaC0+Z2IpICsgOCAqIHNpemU7CisgICAgICAgIG5leHQgPSBnZXRfYml0c19jb3VudChnYikgKyA4ICogc2l6ZTsKIAogICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBTRUlfVFlQRV9QSUNfVElNSU5HOiAvLyBQaWN0dXJlIHRpbWluZyBTRUkKLSAgICAgICAgICAgIHJldCA9IGRlY29kZV9waWN0dXJlX3RpbWluZyhoKTsKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9UWVBFX1BJQ19USU1JTkc6IC8vIFBpY3R1cmUgdGltaW5nIFNFSQorICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BpY3R1cmVfdGltaW5nKCZoLT5waWN0dXJlX3RpbWluZywgZ2IsIHBzLCBsb2djdHgpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VJX1RZUEVfVVNFUl9EQVRBX1JFR0lTVEVSRUQ6Ci0gICAgICAgICAgICByZXQgPSBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGEoaCwgc2l6ZSk7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfVFlQRV9VU0VSX0RBVEFfUkVHSVNURVJFRDoKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9yZWdpc3RlcmVkX3VzZXJfZGF0YShoLCBnYiwgbG9nY3R4LCBzaXplKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFSV9UWVBFX1VTRVJfREFUQV9VTlJFR0lTVEVSRUQ6Ci0gICAgICAgICAgICByZXQgPSBkZWNvZGVfdW5yZWdpc3RlcmVkX3VzZXJfZGF0YShoLCBzaXplKTsKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9UWVBFX1VTRVJfREFUQV9VTlJFR0lTVEVSRUQ6CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfdW5yZWdpc3RlcmVkX3VzZXJfZGF0YSgmaC0+dW5yZWdpc3RlcmVkLCBnYiwgbG9nY3R4LCBzaXplKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFSV9UWVBFX1JFQ09WRVJZX1BPSU5UOgotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3JlY292ZXJ5X3BvaW50KGgpOworICAgICAgICBjYXNlIEgyNjRfU0VJX1RZUEVfUkVDT1ZFUllfUE9JTlQ6CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfcmVjb3ZlcnlfcG9pbnQoJmgtPnJlY292ZXJ5X3BvaW50LCBnYiwgbG9nY3R4KTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFSV9UWVBFX0JVRkZFUklOR19QRVJJT0Q6Ci0gICAgICAgICAgICByZXQgPSBkZWNvZGVfYnVmZmVyaW5nX3BlcmlvZChoKTsKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9UWVBFX0JVRkZFUklOR19QRVJJT0Q6CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfYnVmZmVyaW5nX3BlcmlvZCgmaC0+YnVmZmVyaW5nX3BlcmlvZCwgZ2IsIHBzLCBsb2djdHgpOwogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU0VJX1RZUEVfRlJBTUVfUEFDS0lORzoKLSAgICAgICAgICAgIHJldCA9IGRlY29kZV9mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50KGgpOworICAgICAgICBjYXNlIEgyNjRfU0VJX1RZUEVfRlJBTUVfUEFDS0lORzoKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50KCZoLT5mcmFtZV9wYWNraW5nLCBnYik7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTRUlfVFlQRV9ESVNQTEFZX09SSUVOVEFUSU9OOgotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2Rpc3BsYXlfb3JpZW50YXRpb24oaCk7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfVFlQRV9ESVNQTEFZX09SSUVOVEFUSU9OOgorICAgICAgICAgICAgcmV0ID0gZGVjb2RlX2Rpc3BsYXlfb3JpZW50YXRpb24oJmgtPmRpc3BsYXlfb3JpZW50YXRpb24sIGdiKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNFSV9UWVBFX0dSRUVOX01FVEFEQVRBOgotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX0dyZWVuTWV0YWRhdGEoaCk7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfVFlQRV9HUkVFTl9NRVRBREFUQToKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9ncmVlbl9tZXRhZGF0YSgmaC0+Z3JlZW5fbWV0YWRhdGEsIGdiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEgyNjRfU0VJX1RZUEVfQUxURVJOQVRJVkVfVFJBTlNGRVI6CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfYWx0ZXJuYXRpdmVfdHJhbnNmZXIoJmgtPmFsdGVybmF0aXZlX3RyYW5zZmVyLCBnYik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAidW5rbm93biBTRUkgdHlwZSAlZFxuIiwgdHlwZSk7CisgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfREVCVUcsICJ1bmtub3duIFNFSSB0eXBlICVkXG4iLCB0eXBlKTsKICAgICAgICAgfQotICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1JfUFNfTk9UX0ZPVU5EKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBtYXN0ZXJfcmV0ID0gcmV0OwogCi0gICAgICAgIHNraXBfYml0c19sb25nKCZoLT5nYiwgbmV4dCAtIGdldF9iaXRzX2NvdW50KCZoLT5nYikpOworICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgbmV4dCAtIGdldF9iaXRzX2NvdW50KGdiKSk7CiAKICAgICAgICAgLy8gRklYTUUgY2hlY2sgYml0cyBoZXJlCi0gICAgICAgIGFsaWduX2dldF9iaXRzKCZoLT5nYik7CisgICAgICAgIGFsaWduX2dldF9iaXRzKGdiKTsKICAgICB9CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gbWFzdGVyX3JldDsKIH0KIAotY29uc3QgY2hhciogZmZfaDI2NF9zZWlfc3RlcmVvX21vZGUoSDI2NENvbnRleHQgKmgpCitjb25zdCBjaGFyICpmZl9oMjY0X3NlaV9zdGVyZW9fbW9kZShjb25zdCBIMjY0U0VJRnJhbWVQYWNraW5nICpoKQogewotICAgIGlmIChoLT5zZWlfZnBhLmZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWcgPT0gMCkgewotICAgICAgICBzd2l0Y2ggKGgtPnNlaV9mcGEuZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNFSV9GUEFfVFlQRV9DSEVDS0VSQk9BUkQ6Ci0gICAgICAgICAgICAgICAgaWYgKGgtPnNlaV9mcGEuY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDIpCisgICAgaWYgKGgtPmFycmFuZ2VtZW50X2NhbmNlbF9mbGFnID09IDApIHsKKyAgICAgICAgc3dpdGNoIChoLT5hcnJhbmdlbWVudF90eXBlKSB7CisgICAgICAgICAgICBjYXNlIEgyNjRfU0VJX0ZQQV9UWVBFX0NIRUNLRVJCT0FSRDoKKyAgICAgICAgICAgICAgICBpZiAoaC0+Y29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDIpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY2hlY2tlcmJvYXJkX3JsIjsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY2hlY2tlcmJvYXJkX2xyIjsKLSAgICAgICAgICAgIGNhc2UgU0VJX0ZQQV9UWVBFX0lOVEVSTEVBVkVfQ09MVU1OOgotICAgICAgICAgICAgICAgIGlmIChoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgY2FzZSBIMjY0X1NFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX0NPTFVNTjoKKyAgICAgICAgICAgICAgICBpZiAoaC0+Y29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDIpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29sX2ludGVybGVhdmVkX3JsIjsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29sX2ludGVybGVhdmVkX2xyIjsKLSAgICAgICAgICAgIGNhc2UgU0VJX0ZQQV9UWVBFX0lOVEVSTEVBVkVfUk9XOgotICAgICAgICAgICAgICAgIGlmIChoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgY2FzZSBIMjY0X1NFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1JPVzoKKyAgICAgICAgICAgICAgICBpZiAoaC0+Y29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDIpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAicm93X2ludGVybGVhdmVkX3JsIjsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAicm93X2ludGVybGVhdmVkX2xyIjsKLSAgICAgICAgICAgIGNhc2UgU0VJX0ZQQV9UWVBFX1NJREVfQllfU0lERToKLSAgICAgICAgICAgICAgICBpZiAoaC0+c2VpX2ZwYS5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikKKyAgICAgICAgICAgIGNhc2UgSDI2NF9TRUlfRlBBX1RZUEVfU0lERV9CWV9TSURFOgorICAgICAgICAgICAgICAgIGlmIChoLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJyaWdodF9sZWZ0IjsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibGVmdF9yaWdodCI7Ci0gICAgICAgICAgICBjYXNlIFNFSV9GUEFfVFlQRV9UT1BfQk9UVE9NOgotICAgICAgICAgICAgICAgIGlmIChoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgY2FzZSBIMjY0X1NFSV9GUEFfVFlQRV9UT1BfQk9UVE9NOgorICAgICAgICAgICAgICAgIGlmIChoLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJib3R0b21fdG9wIjsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidG9wX2JvdHRvbSI7Ci0gICAgICAgICAgICBjYXNlIFNFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1RFTVBPUkFMOgotICAgICAgICAgICAgICAgIGlmIChoLT5zZWlfZnBhLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgY2FzZSBIMjY0X1NFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1RFTVBPUkFMOgorICAgICAgICAgICAgICAgIGlmIChoLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJibG9ja19ybCI7CiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gImJsb2NrX2xyIjsKLSAgICAgICAgICAgIGNhc2UgU0VJX0ZQQV9UWVBFXzJEOgorICAgICAgICAgICAgY2FzZSBIMjY0X1NFSV9GUEFfVFlQRV8yRDoKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuICJtb25vIjsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaC0+c2VpX2ZwYS5mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2NhbmNlbF9mbGFnID09IDEpIHsKKyAgICB9IGVsc2UgaWYgKGgtPmFycmFuZ2VtZW50X2NhbmNlbF9mbGFnID09IDEpIHsKICAgICAgICAgcmV0dXJuICJtb25vIjsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NF9zZWkuaCBiL2xpYmF2Y29kZWMvaDI2NF9zZWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDg4MzgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oMjY0X3NlaS5oCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IMjY0X1NFSV9ICisjZGVmaW5lIEFWQ09ERUNfSDI2NF9TRUlfSAorCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworLyoqCisgKiBTRUkgbWVzc2FnZSB0eXBlcworICovCit0eXBlZGVmIGVudW0geworICAgIEgyNjRfU0VJX1RZUEVfQlVGRkVSSU5HX1BFUklPRCAgICAgICA9IDAsICAgLy8vPCBidWZmZXJpbmcgcGVyaW9kIChILjI2NCwgRC4xLjEpCisgICAgSDI2NF9TRUlfVFlQRV9QSUNfVElNSU5HICAgICAgICAgICAgID0gMSwgICAvLy88IHBpY3R1cmUgdGltaW5nCisgICAgSDI2NF9TRUlfVFlQRV9GSUxMRVJfUEFZTE9BRCAgICAgICAgID0gMywgICAvLy88IGZpbGxlciBkYXRhCisgICAgSDI2NF9TRUlfVFlQRV9VU0VSX0RBVEFfUkVHSVNURVJFRCAgID0gNCwgICAvLy88IHJlZ2lzdGVyZWQgdXNlciBkYXRhIGFzIHNwZWNpZmllZCBieSBSZWMuIElUVS1UIFQuMzUKKyAgICBIMjY0X1NFSV9UWVBFX1VTRVJfREFUQV9VTlJFR0lTVEVSRUQgPSA1LCAgIC8vLzwgdW5yZWdpc3RlcmVkIHVzZXIgZGF0YQorICAgIEgyNjRfU0VJX1RZUEVfUkVDT1ZFUllfUE9JTlQgICAgICAgICA9IDYsICAgLy8vPCByZWNvdmVyeSBwb2ludCAoZnJhbWUgIyB0byBkZWNvZGVyIHN5bmMpCisgICAgSDI2NF9TRUlfVFlQRV9GUkFNRV9QQUNLSU5HICAgICAgICAgID0gNDUsICAvLy88IGZyYW1lIHBhY2tpbmcgYXJyYW5nZW1lbnQKKyAgICBIMjY0X1NFSV9UWVBFX0RJU1BMQVlfT1JJRU5UQVRJT04gICAgPSA0NywgIC8vLzwgZGlzcGxheSBvcmllbnRhdGlvbgorICAgIEgyNjRfU0VJX1RZUEVfR1JFRU5fTUVUQURBVEEgICAgICAgICA9IDU2LCAgLy8vPCBHcmVlbk1QRUcgaW5mb3JtYXRpb24KKyAgICBIMjY0X1NFSV9UWVBFX0FMVEVSTkFUSVZFX1RSQU5TRkVSICAgPSAxNDcsIC8vLzwgYWx0ZXJuYXRpdmUgdHJhbnNmZXIKK30gSDI2NF9TRUlfVHlwZTsKKworLyoqCisgKiBwaWNfc3RydWN0IGluIHBpY3R1cmUgdGltaW5nIFNFSSBtZXNzYWdlCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSDI2NF9TRUlfUElDX1NUUlVDVF9GUkFNRSAgICAgICAgICAgICA9IDAsIC8vLzwgIDA6ICVmcmFtZQorICAgIEgyNjRfU0VJX1BJQ19TVFJVQ1RfVE9QX0ZJRUxEICAgICAgICAgPSAxLCAvLy88ICAxOiB0b3AgZmllbGQKKyAgICBIMjY0X1NFSV9QSUNfU1RSVUNUX0JPVFRPTV9GSUVMRCAgICAgID0gMiwgLy8vPCAgMjogYm90dG9tIGZpZWxkCisgICAgSDI2NF9TRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NICAgICAgICA9IDMsIC8vLzwgIDM6IHRvcCBmaWVsZCwgYm90dG9tIGZpZWxkLCBpbiB0aGF0IG9yZGVyCisgICAgSDI2NF9TRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QICAgICAgICA9IDQsIC8vLzwgIDQ6IGJvdHRvbSBmaWVsZCwgdG9wIGZpZWxkLCBpbiB0aGF0IG9yZGVyCisgICAgSDI2NF9TRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NX1RPUCAgICA9IDUsIC8vLzwgIDU6IHRvcCBmaWVsZCwgYm90dG9tIGZpZWxkLCB0b3AgZmllbGQgcmVwZWF0ZWQsIGluIHRoYXQgb3JkZXIKKyAgICBIMjY0X1NFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1BfQk9UVE9NID0gNiwgLy8vPCAgNjogYm90dG9tIGZpZWxkLCB0b3AgZmllbGQsIGJvdHRvbSBmaWVsZCByZXBlYXRlZCwgaW4gdGhhdCBvcmRlcgorICAgIEgyNjRfU0VJX1BJQ19TVFJVQ1RfRlJBTUVfRE9VQkxJTkcgICAgPSA3LCAvLy88ICA3OiAlZnJhbWUgZG91YmxpbmcKKyAgICBIMjY0X1NFSV9QSUNfU1RSVUNUX0ZSQU1FX1RSSVBMSU5HICAgID0gOCAgLy8vPCAgODogJWZyYW1lIHRyaXBsaW5nCit9IEgyNjRfU0VJX1BpY1N0cnVjdFR5cGU7CisKKy8qKgorICogZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudCB0eXBlcworICovCit0eXBlZGVmIGVudW0geworICAgIEgyNjRfU0VJX0ZQQV9UWVBFX0NIRUNLRVJCT0FSRCAgICAgICAgPSAwLAorICAgIEgyNjRfU0VJX0ZQQV9UWVBFX0lOVEVSTEVBVkVfQ09MVU1OICAgPSAxLAorICAgIEgyNjRfU0VJX0ZQQV9UWVBFX0lOVEVSTEVBVkVfUk9XICAgICAgPSAyLAorICAgIEgyNjRfU0VJX0ZQQV9UWVBFX1NJREVfQllfU0lERSAgICAgICAgPSAzLAorICAgIEgyNjRfU0VJX0ZQQV9UWVBFX1RPUF9CT1RUT00gICAgICAgICAgPSA0LAorICAgIEgyNjRfU0VJX0ZQQV9UWVBFX0lOVEVSTEVBVkVfVEVNUE9SQUwgPSA1LAorICAgIEgyNjRfU0VJX0ZQQV9UWVBFXzJEICAgICAgICAgICAgICAgICAgPSA2LAorfSBIMjY0X1NFSV9GcGFUeXBlOworCit0eXBlZGVmIHN0cnVjdCBIMjY0U0VJUGljdHVyZVRpbWluZyB7CisgICAgaW50IHByZXNlbnQ7CisgICAgSDI2NF9TRUlfUGljU3RydWN0VHlwZSBwaWNfc3RydWN0OworCisgICAgLyoqCisgICAgICogQml0IHNldCBvZiBjbG9jayB0eXBlcyBmb3IgZmllbGRzL2ZyYW1lcyBpbiBwaWN0dXJlIHRpbWluZyBTRUkgbWVzc2FnZS4KKyAgICAgKiBGb3IgZWFjaCBmb3VuZCBjdF90eXBlLCBhcHByb3ByaWF0ZSBiaXQgaXMgc2V0IChlLmcuLCBiaXQgMSBmb3IKKyAgICAgKiBpbnRlcmxhY2VkKS4KKyAgICAgKi8KKyAgICBpbnQgY3RfdHlwZTsKKworICAgIC8qKgorICAgICAqIGRwYl9vdXRwdXRfZGVsYXkgaW4gcGljdHVyZSB0aW1pbmcgU0VJIG1lc3NhZ2UsIHNlZSBILjI2NCBDLjIuMgorICAgICAqLworICAgIGludCBkcGJfb3V0cHV0X2RlbGF5OworCisgICAgLyoqCisgICAgICogY3BiX3JlbW92YWxfZGVsYXkgaW4gcGljdHVyZSB0aW1pbmcgU0VJIG1lc3NhZ2UsIHNlZSBILjI2NCBDLjEuMgorICAgICAqLworICAgIGludCBjcGJfcmVtb3ZhbF9kZWxheTsKK30gSDI2NFNFSVBpY3R1cmVUaW1pbmc7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRTRUlBRkQgeworICAgIGludCBwcmVzZW50OworICAgIHVpbnQ4X3QgYWN0aXZlX2Zvcm1hdF9kZXNjcmlwdGlvbjsKK30gSDI2NFNFSUFGRDsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFNFSUE1M0NhcHRpb24geworICAgIGludCBhNTNfY2FwdGlvbl9zaXplOworICAgIHVpbnQ4X3QgKmE1M19jYXB0aW9uOworfSBIMjY0U0VJQTUzQ2FwdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFNFSVVucmVnaXN0ZXJlZCB7CisgICAgaW50IHgyNjRfYnVpbGQ7Cit9IEgyNjRTRUlVbnJlZ2lzdGVyZWQ7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRTRUlSZWNvdmVyeVBvaW50IHsKKyAgICAvKioKKyAgICAgKiByZWNvdmVyeV9mcmFtZV9jbnQKKyAgICAgKgorICAgICAqIFNldCB0byAtMSBpZiBubyByZWNvdmVyeSBwb2ludCBTRUkgbWVzc2FnZSBmb3VuZCBvciB0byBudW1iZXIgb2YgZnJhbWVzCisgICAgICogYmVmb3JlIHBsYXliYWNrIHN5bmNocm9uaXplcy4gRnJhbWVzIGhhdmluZyByZWNvdmVyeSBwb2ludCBhcmUga2V5CisgICAgICogZnJhbWVzLgorICAgICAqLworICAgIGludCByZWNvdmVyeV9mcmFtZV9jbnQ7Cit9IEgyNjRTRUlSZWNvdmVyeVBvaW50OworCit0eXBlZGVmIHN0cnVjdCBIMjY0U0VJQnVmZmVyaW5nUGVyaW9kIHsKKyAgICBpbnQgcHJlc2VudDsgICAvLy88IEJ1ZmZlcmluZyBwZXJpb2QgU0VJIGZsYWcKKyAgICBpbnQgaW5pdGlhbF9jcGJfcmVtb3ZhbF9kZWxheVszMl07ICAvLy88IEluaXRpYWwgdGltZXN0YW1wcyBmb3IgQ1BCcworfSBIMjY0U0VJQnVmZmVyaW5nUGVyaW9kOworCit0eXBlZGVmIHN0cnVjdCBIMjY0U0VJRnJhbWVQYWNraW5nIHsKKyAgICBpbnQgcHJlc2VudDsKKyAgICBpbnQgYXJyYW5nZW1lbnRfaWQ7CisgICAgaW50IGFycmFuZ2VtZW50X2NhbmNlbF9mbGFnOyAgLy8vPCBpcyBwcmV2aW91cyBhcnJhbmdlbWVudCBjYW5jZWxlZCwgLTEgaWYgbmV2ZXIgcmVjZWl2ZWQKKyAgICBIMjY0X1NFSV9GcGFUeXBlIGFycmFuZ2VtZW50X3R5cGU7CisgICAgaW50IGFycmFuZ2VtZW50X3JlcGV0aXRpb25fcGVyaW9kOworICAgIGludCBjb250ZW50X2ludGVycHJldGF0aW9uX3R5cGU7CisgICAgaW50IHF1aW5jdW54X3NhbXBsaW5nX2ZsYWc7CisgICAgaW50IGN1cnJlbnRfZnJhbWVfaXNfZnJhbWUwX2ZsYWc7Cit9IEgyNjRTRUlGcmFtZVBhY2tpbmc7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRTRUlEaXNwbGF5T3JpZW50YXRpb24geworICAgIGludCBwcmVzZW50OworICAgIGludCBhbnRpY2xvY2t3aXNlX3JvdGF0aW9uOworICAgIGludCBoZmxpcCwgdmZsaXA7Cit9IEgyNjRTRUlEaXNwbGF5T3JpZW50YXRpb247CisKK3R5cGVkZWYgc3RydWN0IEgyNjRTRUlHcmVlbk1ldGFEYXRhIHsKKyAgICB1aW50OF90IGdyZWVuX21ldGFkYXRhX3R5cGU7CisgICAgdWludDhfdCBwZXJpb2RfdHlwZTsKKyAgICB1aW50MTZfdCBudW1fc2Vjb25kczsKKyAgICB1aW50MTZfdCBudW1fcGljdHVyZXM7CisgICAgdWludDhfdCBwZXJjZW50X25vbl96ZXJvX21hY3JvYmxvY2tzOworICAgIHVpbnQ4X3QgcGVyY2VudF9pbnRyYV9jb2RlZF9tYWNyb2Jsb2NrczsKKyAgICB1aW50OF90IHBlcmNlbnRfc2l4X3RhcF9maWx0ZXJpbmc7CisgICAgdWludDhfdCBwZXJjZW50X2FscGhhX3BvaW50X2RlYmxvY2tpbmdfaW5zdGFuY2U7CisgICAgdWludDhfdCB4c2RfbWV0cmljX3R5cGU7CisgICAgdWludDE2X3QgeHNkX21ldHJpY192YWx1ZTsKK30gSDI2NFNFSUdyZWVuTWV0YURhdGE7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRTRUlBbHRlcm5hdGl2ZVRyYW5zZmVyIHsKKyAgICBpbnQgcHJlc2VudDsKKyAgICBpbnQgcHJlZmVycmVkX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKK30gSDI2NFNFSUFsdGVybmF0aXZlVHJhbnNmZXI7CisKK3R5cGVkZWYgc3RydWN0IEgyNjRTRUlDb250ZXh0IHsKKyAgICBIMjY0U0VJUGljdHVyZVRpbWluZyBwaWN0dXJlX3RpbWluZzsKKyAgICBIMjY0U0VJQUZEIGFmZDsKKyAgICBIMjY0U0VJQTUzQ2FwdGlvbiBhNTNfY2FwdGlvbjsKKyAgICBIMjY0U0VJVW5yZWdpc3RlcmVkIHVucmVnaXN0ZXJlZDsKKyAgICBIMjY0U0VJUmVjb3ZlcnlQb2ludCByZWNvdmVyeV9wb2ludDsKKyAgICBIMjY0U0VJQnVmZmVyaW5nUGVyaW9kIGJ1ZmZlcmluZ19wZXJpb2Q7CisgICAgSDI2NFNFSUZyYW1lUGFja2luZyBmcmFtZV9wYWNraW5nOworICAgIEgyNjRTRUlEaXNwbGF5T3JpZW50YXRpb24gZGlzcGxheV9vcmllbnRhdGlvbjsKKyAgICBIMjY0U0VJR3JlZW5NZXRhRGF0YSBncmVlbl9tZXRhZGF0YTsKKyAgICBIMjY0U0VJQWx0ZXJuYXRpdmVUcmFuc2ZlciBhbHRlcm5hdGl2ZV90cmFuc2ZlcjsKK30gSDI2NFNFSUNvbnRleHQ7CisKK3N0cnVjdCBIMjY0UGFyYW1TZXRzOworCitpbnQgZmZfaDI2NF9zZWlfZGVjb2RlKEgyNjRTRUlDb250ZXh0ICpoLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IEgyNjRQYXJhbVNldHMgKnBzLCB2b2lkICpsb2djdHgpOworCisvKioKKyAqIFJlc2V0IFNFSSB2YWx1ZXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnJhbWUuCisgKi8KK3ZvaWQgZmZfaDI2NF9zZWlfdW5pbml0KEgyNjRTRUlDb250ZXh0ICpoKTsKKworLyoqCisgKiBHZXQgc3RlcmVvX21vZGUgc3RyaW5nIGZyb20gdGhlIGgyNjQgZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudAorICovCitjb25zdCBjaGFyICpmZl9oMjY0X3NlaV9zdGVyZW9fbW9kZShjb25zdCBIMjY0U0VJRnJhbWVQYWNraW5nICpoKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSDI2NF9TRUlfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0X3NsaWNlLmMgYi9saWJhdmNvZGVjL2gyNjRfc2xpY2UuYwppbmRleCAyMTMxMzM4Li4wNzkwZjMyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRfc2xpY2UuYworKysgYi9saWJhdmNvZGVjL2gyNjRfc2xpY2UuYwpAQCAtMjEsMTIgKzIxLDE0IEBACiAKIC8qKgogICogQGZpbGUKLSAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIGNvZGVjLgorICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwIGNvZGVjLgogICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiY2FiYWMuaCIKQEAgLTM0LDMyICszNiwxOCBAQAogI2luY2x1ZGUgImVycm9yX3Jlc2lsaWVuY2UuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkZWMuaCIKICNpbmNsdWRlICJoMjY0ZGF0YS5oIgogI2luY2x1ZGUgImgyNjRjaHJvbWEuaCIKICNpbmNsdWRlICJoMjY0X212cHJlZC5oIgorI2luY2x1ZGUgImgyNjRfcHMuaCIKICNpbmNsdWRlICJnb2xvbWIuaCIKICNpbmNsdWRlICJtYXRob3BzLmgiCiAjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgcmVtNltRUF9NQVhfTlVNICsgMV0gPSB7Ci0gICAgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwKLSAgICAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LAotICAgIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsCi0gICAgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwKLSAgICAwLCAxLCAyLCAzLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGl2NltRUF9NQVhfTlVNICsgMV0gPSB7Ci0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMywgIDMsICAzLAotICAgIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDUsIDUsIDUsIDUsIDUsIDUsIDYsIDYsIDYsIDYsICA2LCAgNiwKLSAgICA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA5LCA5LCA5LCA5LCA5LCA5LCAxMCwgMTAsIDEwLAotICAgMTAsMTAsMTAsMTEsMTEsMTEsMTEsMTEsMTEsMTIsMTIsMTIsMTIsMTIsMTIsMTMsMTMsMTMsIDEzLCAxMywgMTMsCi0gICAxNCwxNCwxNCwxNCwKLX07Ci0KIHN0YXRpYyBjb25zdCB1aW50OF90IGZpZWxkX3NjYW5bMTYrMV0gPSB7CiAgICAgMCArIDAgKiA0LCAwICsgMSAqIDQsIDEgKyAwICogNCwgMCArIDIgKiA0LAogICAgIDAgKyAzICogNCwgMSArIDEgKiA0LCAxICsgMiAqIDQsIDEgKyAzICogNCwKQEAgLTEyNSwyOSArMTEzLDYgQEAKICAgICA1ICsgNSAqIDgsIDYgKyA1ICogOCwgNiArIDYgKiA4LCA3ICsgNyAqIDgsCiB9OwogCi1zdGF0aWMgY29uc3QgdWludDhfdCBkZXF1YW50NF9jb2VmZl9pbml0WzZdWzNdID0gewotICAgIHsgMTAsIDEzLCAxNiB9LAotICAgIHsgMTEsIDE0LCAxOCB9LAotICAgIHsgMTMsIDE2LCAyMCB9LAotICAgIHsgMTQsIDE4LCAyMyB9LAotICAgIHsgMTYsIDIwLCAyNSB9LAotICAgIHsgMTgsIDIzLCAyOSB9LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGVxdWFudDhfY29lZmZfaW5pdF9zY2FuWzE2XSA9IHsKLSAgICAwLCAzLCA0LCAzLCAzLCAxLCA1LCAxLCA0LCA1LCAyLCA1LCAzLCAxLCA1LCAxCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBkZXF1YW50OF9jb2VmZl9pbml0WzZdWzZdID0gewotICAgIHsgMjAsIDE4LCAzMiwgMTksIDI1LCAyNCB9LAotICAgIHsgMjIsIDE5LCAzNSwgMjEsIDI4LCAyNiB9LAotICAgIHsgMjYsIDIzLCA0MiwgMjQsIDMzLCAzMSB9LAotICAgIHsgMjgsIDI1LCA0NSwgMjYsIDM1LCAzMyB9LAotICAgIHsgMzIsIDI4LCA1MSwgMzAsIDQwLCAzOCB9LAotICAgIHsgMzYsIDMyLCA1OCwgMzQsIDQ2LCA0MyB9LAotfTsKLQotCiBzdGF0aWMgdm9pZCByZWxlYXNlX3VudXNlZF9waWN0dXJlcyhIMjY0Q29udGV4dCAqaCwgaW50IHJlbW92ZV9jdXJyZW50KQogewogICAgIGludCBpOwpAQCAtMTY4LDcgKzEzMyw3IEBACiAKICAgICBhdl9mYXN0X21hbGxvYygmc2wtPmJpcHJlZF9zY3JhdGNocGFkLCAmc2wtPmJpcHJlZF9zY3JhdGNocGFkX2FsbG9jYXRlZCwgMTYgKiA2ICogYWxsb2Nfc2l6ZSk7CiAgICAgLy8gZWRnZSBlbXUgbmVlZHMgYmxvY2tzaXplICsgZmlsdGVyIGxlbmd0aCAtIDEKLSAgICAvLyAoPSAyMXgyMSBmb3IgIGgyNjQpCisgICAgLy8gKD0gMjF4MjEgZm9yICBILjI2NCkKICAgICBhdl9mYXN0X21hbGxvYygmc2wtPmVkZ2VfZW11X2J1ZmZlciwgJnNsLT5lZGdlX2VtdV9idWZmZXJfYWxsb2NhdGVkLCBhbGxvY19zaXplICogMiAqIDIxKTsKIAogICAgIGF2X2Zhc3RfbWFsbG9jeigmc2wtPnRvcF9ib3JkZXJzWzBdLCAmc2wtPnRvcF9ib3JkZXJzX2FsbG9jYXRlZFswXSwKQEAgLTIzMiwxMCArMTk3LDYgQEAKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCi0gICAgcGljLT5jcm9wICAgICA9IGgtPnNwcy5jcm9wOwotICAgIHBpYy0+Y3JvcF90b3AgPSBoLT5zcHMuY3JvcF90b3A7Ci0gICAgcGljLT5jcm9wX2xlZnQ9IGgtPnNwcy5jcm9wX2xlZnQ7Ci0KICAgICBpZiAoaC0+YXZjdHgtPmh3YWNjZWwpIHsKICAgICAgICAgY29uc3QgQVZIV0FjY2VsICpod2FjY2VsID0gaC0+YXZjdHgtPmh3YWNjZWw7CiAgICAgICAgIGF2X2Fzc2VydDAoIXBpYy0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGUpOwpAQCAtMjg5LDEwMCArMjUwLDE4IEBACiAgICAgcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IEFWRVJST1IoRU5PTUVNKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcGljX2lzX3VudXNlZChIMjY0Q29udGV4dCAqaCwgSDI2NFBpY3R1cmUgKnBpYykKLXsKLSAgICBpZiAoIXBpYy0+Zi0+YnVmWzBdKQotICAgICAgICByZXR1cm4gMTsKLSAgICByZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBmaW5kX3VudXNlZF9waWN0dXJlKEgyNjRDb250ZXh0ICpoKQogewogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IEgyNjRfTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgewotICAgICAgICBpZiAocGljX2lzX3VudXNlZChoLCAmaC0+RFBCW2ldKSkKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoIWgtPkRQQltpXS5mLT5idWZbMF0pCisgICAgICAgICAgICByZXR1cm4gaTsKICAgICB9Ci0gICAgaWYgKGkgPT0gSDI2NF9NQVhfUElDVFVSRV9DT1VOVCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0KLSAgICByZXR1cm4gaTsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIH0KIAogCi1zdGF0aWMgdm9pZCBpbml0X2RlcXVhbnQ4X2NvZWZmX3RhYmxlKEgyNjRDb250ZXh0ICpoKQotewotICAgIGludCBpLCBqLCBxLCB4OwotICAgIGNvbnN0IGludCBtYXhfcXAgPSA1MSArIDYgKiAoaC0+c3BzLmJpdF9kZXB0aF9sdW1hIC0gOCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldID0gaC0+ZGVxdWFudDhfYnVmZmVyW2ldOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaTsgaisrKQotICAgICAgICAgICAgaWYgKCFtZW1jbXAoaC0+cHBzLnNjYWxpbmdfbWF0cml4OFtqXSwgaC0+cHBzLnNjYWxpbmdfbWF0cml4OFtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDY0ICogc2l6ZW9mKHVpbnQ4X3QpKSkgewotICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldID0gaC0+ZGVxdWFudDhfYnVmZmVyW2pdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICBpZiAoaiA8IGkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmb3IgKHEgPSAwOyBxIDwgbWF4X3FwICsgMTsgcSsrKSB7Ci0gICAgICAgICAgICBpbnQgc2hpZnQgPSBkaXY2W3FdOwotICAgICAgICAgICAgaW50IGlkeCAgID0gcmVtNltxXTsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCA2NDsgeCsrKQotICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldW3FdWyh4ID4+IDMpIHwgKCh4ICYgNykgPDwgMyldID0KLSAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClkZXF1YW50OF9jb2VmZl9pbml0W2lkeF1bZGVxdWFudDhfY29lZmZfaW5pdF9zY2FuWygoeCA+PiAxKSAmIDEyKSB8ICh4ICYgMyldXSAqCi0gICAgICAgICAgICAgICAgICAgICBoLT5wcHMuc2NhbGluZ19tYXRyaXg4W2ldW3hdKSA8PCBzaGlmdDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgaW5pdF9kZXF1YW50NF9jb2VmZl90YWJsZShIMjY0Q29udGV4dCAqaCkKLXsKLSAgICBpbnQgaSwgaiwgcSwgeDsKLSAgICBjb25zdCBpbnQgbWF4X3FwID0gNTEgKyA2ICogKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAtIDgpOwotICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbaV0gPSBoLT5kZXF1YW50NF9idWZmZXJbaV07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCi0gICAgICAgICAgICBpZiAoIW1lbWNtcChoLT5wcHMuc2NhbGluZ19tYXRyaXg0W2pdLCBoLT5wcHMuc2NhbGluZ19tYXRyaXg0W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgMTYgKiBzaXplb2YodWludDhfdCkpKSB7Ci0gICAgICAgICAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbaV0gPSBoLT5kZXF1YW50NF9idWZmZXJbal07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIGlmIChqIDwgaSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGZvciAocSA9IDA7IHEgPCBtYXhfcXAgKyAxOyBxKyspIHsKLSAgICAgICAgICAgIGludCBzaGlmdCA9IGRpdjZbcV0gKyAyOwotICAgICAgICAgICAgaW50IGlkeCAgID0gcmVtNltxXTsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQotICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ0X2NvZWZmW2ldW3FdWyh4ID4+IDIpIHwgKCh4IDw8IDIpICYgMHhGKV0gPQotICAgICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWRlcXVhbnQ0X2NvZWZmX2luaXRbaWR4XVsoeCAmIDEpICsgKCh4ID4+IDIpICYgMSldICoKLSAgICAgICAgICAgICAgICAgICAgIGgtPnBwcy5zY2FsaW5nX21hdHJpeDRbaV1beF0pIDw8IHNoaWZ0OwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIGZmX2gyNjRfaW5pdF9kZXF1YW50X3RhYmxlcyhIMjY0Q29udGV4dCAqaCkKLXsKLSAgICBpbnQgaSwgeDsKLSAgICBpbml0X2RlcXVhbnQ0X2NvZWZmX3RhYmxlKGgpOwotICAgIG1lbXNldChoLT5kZXF1YW50OF9jb2VmZiwgMCwgc2l6ZW9mKGgtPmRlcXVhbnQ4X2NvZWZmKSk7Ci0KLSAgICBpZiAoaC0+cHBzLnRyYW5zZm9ybV84eDhfbW9kZSkKLSAgICAgICAgaW5pdF9kZXF1YW50OF9jb2VmZl90YWJsZShoKTsKLSAgICBpZiAoaC0+c3BzLnRyYW5zZm9ybV9ieXBhc3MpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQotICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ0X2NvZWZmW2ldWzBdW3hdID0gMSA8PCA2OwotICAgICAgICBpZiAoaC0+cHBzLnRyYW5zZm9ybV84eDhfbW9kZSkKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDY0OyB4KyspCi0gICAgICAgICAgICAgICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldWzBdW3hdID0gMSA8PCA2OwotICAgIH0KLX0KLQogI2RlZmluZSBJTl9SQU5HRShhLCBiLCBzaXplKSAoKCh2b2lkKikoYSkgPj0gKHZvaWQqKShiKSkgJiYgKCh2b2lkKikoYSkgPCAodm9pZCopKChiKSArIChzaXplKSkpKQogCiAjZGVmaW5lIFJFQkFTRV9QSUNUVVJFKHBpYywgbmV3X2N0eCwgb2xkX2N0eCkgICAgICAgICAgICAgXApAQCAtNDA0LDMwICsyODMsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBjb3B5X3BhcmFtZXRlcl9zZXQodm9pZCAqKnRvLCB2b2lkICoqZnJvbSwgaW50IGNvdW50LCBpbnQgc2l6ZSkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmICh0b1tpXSAmJiAhZnJvbVtpXSkgewotICAgICAgICAgICAgYXZfZnJlZXAoJnRvW2ldKTsKLSAgICAgICAgfSBlbHNlIGlmIChmcm9tW2ldICYmICF0b1tpXSkgewotICAgICAgICAgICAgdG9baV0gPSBhdl9tYWxsb2Moc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoIXRvW2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZnJvbVtpXSkKLSAgICAgICAgICAgIG1lbWNweSh0b1tpXSwgZnJvbVtpXSwgc2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgY29weV9maWVsZHModG8sIGZyb20sIHN0YXJ0X2ZpZWxkLCBlbmRfZmllbGQpICAgICAgICAgICAgICAgICAgIFwKLSAgICBtZW1jcHkoJih0byktPnN0YXJ0X2ZpZWxkLCAmKGZyb20pLT5zdGFydF9maWVsZCwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIChjaGFyICopJih0byktPmVuZF9maWVsZCAtIChjaGFyICopJih0byktPnN0YXJ0X2ZpZWxkKQotCiBzdGF0aWMgaW50IGgyNjRfc2xpY2VfaGVhZGVyX2luaXQoSDI2NENvbnRleHQgKmgpOwogCiBpbnQgZmZfaDI2NF91cGRhdGVfdGhyZWFkX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRzdCwKQEAgLTQ0MSwxNSArMjk2LDE5IEBACiAgICAgaWYgKGRzdCA9PSBzcmMpCiAgICAgICAgIHJldHVybiAwOwogCisgICAgLy8gV2UgY2FuJ3QgZmFpbCBpZiBTUFMgaXNuJ3Qgc2V0IGF0IGl0IGJyZWFrcyBjdXJyZW50IHNraXBfZnJhbWUgY29kZQorICAgIC8vaWYgKCFoMS0+cHMuc3BzKQorICAgIC8vICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgaWYgKGluaXRlZCAmJgogICAgICAgICAoaC0+d2lkdGggICAgICAgICAgICAgICAgICE9IGgxLT53aWR0aCAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgIGgtPmhlaWdodCAgICAgICAgICAgICAgICAhPSBoMS0+aGVpZ2h0ICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICBoLT5tYl93aWR0aCAgICAgICAgICAgICAgIT0gaDEtPm1iX3dpZHRoICAgICAgICAgICAgICB8fAogICAgICAgICAgaC0+bWJfaGVpZ2h0ICAgICAgICAgICAgICE9IGgxLT5tYl9oZWlnaHQgICAgICAgICAgICAgfHwKLSAgICAgICAgIGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAgICAhPSBoMS0+c3BzLmJpdF9kZXB0aF9sdW1hICAgIHx8Ci0gICAgICAgICBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMgIT0gaDEtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyB8fAotICAgICAgICAgaC0+c3BzLmNvbG9yc3BhY2UgICAgICAgICE9IGgxLT5zcHMuY29sb3JzcGFjZSkpIHsKLQorICAgICAgICAgIWgtPnBzLnNwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgIGgtPnBzLnNwcy0+Yml0X2RlcHRoX2x1bWEgICAgIT0gaDEtPnBzLnNwcy0+Yml0X2RlcHRoX2x1bWEgICAgfHwKKyAgICAgICAgIGgtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gaDEtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgfHwKKyAgICAgICAgIGgtPnBzLnNwcy0+Y29sb3JzcGFjZSAgICAgICAgIT0gaDEtPnBzLnNwcy0+Y29sb3JzcGFjZSkpIHsKICAgICAgICAgbmVlZF9yZWluaXQgPSAxOwogICAgIH0KIApAQCAtNDU3LDE2ICszMTYsMzkgQEAKICAgICBtZW1jcHkoaC0+YmxvY2tfb2Zmc2V0LCBoMS0+YmxvY2tfb2Zmc2V0LCBzaXplb2YoaC0+YmxvY2tfb2Zmc2V0KSk7CiAKICAgICAvLyBTUFMvUFBTCi0gICAgaWYgKChyZXQgPSBjb3B5X3BhcmFtZXRlcl9zZXQoKHZvaWQgKiopaC0+c3BzX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopaDEtPnNwc19idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9TUFNfQ09VTlQsIHNpemVvZihTUFMpKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIGgtPnNwcyA9IGgxLT5zcHM7Ci0gICAgaWYgKChyZXQgPSBjb3B5X3BhcmFtZXRlcl9zZXQoKHZvaWQgKiopaC0+cHBzX2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopaDEtPnBwc19idWZmZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QUFNfQ09VTlQsIHNpemVvZihQUFMpKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIGgtPnBwcyA9IGgxLT5wcHM7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGgtPnBzLnNwc19saXN0KTsgaSsrKSB7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmaC0+cHMuc3BzX2xpc3RbaV0pOworICAgICAgICBpZiAoaDEtPnBzLnNwc19saXN0W2ldKSB7CisgICAgICAgICAgICBoLT5wcy5zcHNfbGlzdFtpXSA9IGF2X2J1ZmZlcl9yZWYoaDEtPnBzLnNwc19saXN0W2ldKTsKKyAgICAgICAgICAgIGlmICghaC0+cHMuc3BzX2xpc3RbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaC0+cHMucHBzX2xpc3QpOyBpKyspIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZoLT5wcy5wcHNfbGlzdFtpXSk7CisgICAgICAgIGlmIChoMS0+cHMucHBzX2xpc3RbaV0pIHsKKyAgICAgICAgICAgIGgtPnBzLnBwc19saXN0W2ldID0gYXZfYnVmZmVyX3JlZihoMS0+cHMucHBzX2xpc3RbaV0pOworICAgICAgICAgICAgaWYgKCFoLT5wcy5wcHNfbGlzdFtpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfYnVmZmVyX3VucmVmKCZoLT5wcy5wcHNfcmVmKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmgtPnBzLnNwc19yZWYpOworICAgIGgtPnBzLnBwcyA9IE5VTEw7CisgICAgaC0+cHMuc3BzID0gTlVMTDsKKyAgICBpZiAoaDEtPnBzLnBwc19yZWYpIHsKKyAgICAgICAgaC0+cHMucHBzX3JlZiA9IGF2X2J1ZmZlcl9yZWYoaDEtPnBzLnBwc19yZWYpOworICAgICAgICBpZiAoIWgtPnBzLnBwc19yZWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBoLT5wcy5wcHMgPSAoY29uc3QgUFBTKiloLT5wcy5wcHNfcmVmLT5kYXRhOworICAgIH0KKyAgICBpZiAoaDEtPnBzLnNwc19yZWYpIHsKKyAgICAgICAgaC0+cHMuc3BzX3JlZiA9IGF2X2J1ZmZlcl9yZWYoaDEtPnBzLnNwc19yZWYpOworICAgICAgICBpZiAoIWgtPnBzLnNwc19yZWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBoLT5wcy5zcHMgPSAoY29uc3QgU1BTKiloLT5wcy5zcHNfcmVmLT5kYXRhOworICAgIH0KIAogICAgIGlmIChuZWVkX3JlaW5pdCB8fCAhaW5pdGVkKSB7CiAgICAgICAgIGgtPndpZHRoICAgICA9IGgxLT53aWR0aDsKQEAgLTQ4Myw2ICszNjUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKwogICAgICAgICAvKiBjb3B5IGJsb2NrX29mZnNldCBzaW5jZSBmcmFtZV9zdGFydCBtYXkgbm90IGJlIGNhbGxlZCAqLwogICAgICAgICBtZW1jcHkoaC0+YmxvY2tfb2Zmc2V0LCBoMS0+YmxvY2tfb2Zmc2V0LCBzaXplb2YoaC0+YmxvY2tfb2Zmc2V0KSk7CiAgICAgfQpAQCAtNDkxLDE0ICszNzQsMTMgQEAKICAgICBoLT5hdmN0eC0+Y29kZWRfd2lkdGggICA9IGgxLT5hdmN0eC0+Y29kZWRfd2lkdGg7CiAgICAgaC0+YXZjdHgtPndpZHRoICAgICAgICAgPSBoMS0+YXZjdHgtPndpZHRoOwogICAgIGgtPmF2Y3R4LT5oZWlnaHQgICAgICAgID0gaDEtPmF2Y3R4LT5oZWlnaHQ7CisgICAgaC0+d2lkdGhfZnJvbV9jYWxsZXIgICAgPSBoMS0+d2lkdGhfZnJvbV9jYWxsZXI7CisgICAgaC0+aGVpZ2h0X2Zyb21fY2FsbGVyICAgPSBoMS0+aGVpZ2h0X2Zyb21fY2FsbGVyOwogICAgIGgtPmNvZGVkX3BpY3R1cmVfbnVtYmVyID0gaDEtPmNvZGVkX3BpY3R1cmVfbnVtYmVyOwogICAgIGgtPmZpcnN0X2ZpZWxkICAgICAgICAgID0gaDEtPmZpcnN0X2ZpZWxkOwogICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlICAgID0gaDEtPnBpY3R1cmVfc3RydWN0dXJlOworICAgIGgtPm1iX2FmZl9mcmFtZSAgICAgICAgID0gaDEtPm1iX2FmZl9mcmFtZTsKICAgICBoLT5kcm9wcGFibGUgICAgICAgICAgICA9IGgxLT5kcm9wcGFibGU7Ci0gICAgaC0+bG93X2RlbGF5ICAgICAgICAgICAgPSBoMS0+bG93X2RlbGF5OwotICAgIGgtPmJhY2t1cF93aWR0aCAgICAgICAgID0gaDEtPmJhY2t1cF93aWR0aDsKLSAgICBoLT5iYWNrdXBfaGVpZ2h0ICAgICAgICA9IGgxLT5iYWNrdXBfaGVpZ2h0OwotICAgIGgtPmJhY2t1cF9waXhfZm10ICAgICAgID0gaDEtPmJhY2t1cF9waXhfZm10OwogCiAgICAgZm9yIChpID0gMDsgaSA8IEgyNjRfTUFYX1BJQ1RVUkVfQ09VTlQ7IGkrKykgewogICAgICAgICBmZl9oMjY0X3VucmVmX3BpY3R1cmUoaCwgJmgtPkRQQltpXSk7CkBAIC01MTcsMzAgKzM5OSwyOSBAQAogCiAgICAgaC0+ZW5hYmxlX2VyICAgICAgID0gaDEtPmVuYWJsZV9lcjsKICAgICBoLT53b3JrYXJvdW5kX2J1Z3MgPSBoMS0+d29ya2Fyb3VuZF9idWdzOwotICAgIGgtPmxvd19kZWxheSAgICAgICA9IGgxLT5sb3dfZGVsYXk7CisgICAgaC0+eDI2NF9idWlsZCAgICAgID0gaDEtPngyNjRfYnVpbGQ7CiAgICAgaC0+ZHJvcHBhYmxlICAgICAgID0gaDEtPmRyb3BwYWJsZTsKIAogICAgIC8vIGV4dHJhZGF0YS9OQUwgaGFuZGxpbmcKICAgICBoLT5pc19hdmMgPSBoMS0+aXNfYXZjOwogICAgIGgtPm5hbF9sZW5ndGhfc2l6ZSA9IGgxLT5uYWxfbGVuZ3RoX3NpemU7Ci0gICAgaC0+eDI2NF9idWlsZCAgICAgID0gaDEtPngyNjRfYnVpbGQ7CiAKLSAgICAvLyBEZXF1YW50aXphdGlvbiBtYXRyaWNlcwotICAgIC8vIEZJWE1FIHRoZXNlIGFyZSBiaWcgLSBjYW4gdGhleSBiZSBvbmx5IGNvcGllZCB3aGVuIFBQUyBjaGFuZ2VzPwotICAgIGNvcHlfZmllbGRzKGgsIGgxLCBkZXF1YW50NF9idWZmZXIsIGRlcXVhbnQ0X2NvZWZmKTsKKyAgICBtZW1jcHkoJmgtPnBvYywgICAgICAgICZoMS0+cG9jLCAgICAgICAgc2l6ZW9mKGgtPnBvYykpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICAgICAgaC0+ZGVxdWFudDRfY29lZmZbaV0gPSBoLT5kZXF1YW50NF9idWZmZXJbMF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoMS0+ZGVxdWFudDRfY29lZmZbaV0gLSBoMS0+ZGVxdWFudDRfYnVmZmVyWzBdKTsKKyAgICBtZW1jcHkoaC0+c2hvcnRfcmVmLCAgIGgxLT5zaG9ydF9yZWYsICAgc2l6ZW9mKGgtPnNob3J0X3JlZikpOworICAgIG1lbWNweShoLT5sb25nX3JlZiwgICAgaDEtPmxvbmdfcmVmLCAgICBzaXplb2YoaC0+bG9uZ19yZWYpKTsKKyAgICBtZW1jcHkoaC0+ZGVsYXllZF9waWMsIGgxLT5kZWxheWVkX3BpYywgc2l6ZW9mKGgtPmRlbGF5ZWRfcGljKSk7CisgICAgbWVtY3B5KGgtPmxhc3RfcG9jcywgICBoMS0+bGFzdF9wb2NzLCAgIHNpemVvZihoLT5sYXN0X3BvY3MpKTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCi0gICAgICAgIGgtPmRlcXVhbnQ4X2NvZWZmW2ldID0gaC0+ZGVxdWFudDhfYnVmZmVyWzBdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaDEtPmRlcXVhbnQ4X2NvZWZmW2ldIC0gaDEtPmRlcXVhbnQ4X2J1ZmZlclswXSk7CisgICAgaC0+bmV4dF9vdXRwdXRfcGljICAgPSBoMS0+bmV4dF9vdXRwdXRfcGljOworICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gaDEtPm5leHRfb3V0cHV0ZWRfcG9jOwogCi0gICAgaC0+ZGVxdWFudF9jb2VmZl9wcHMgPSBoMS0+ZGVxdWFudF9jb2VmZl9wcHM7Ci0KLSAgICAvLyBQT0MgdGltaW5nCi0gICAgY29weV9maWVsZHMoaCwgaDEsIHBvY19sc2IsIGN1cnJlbnRfc2xpY2UpOworICAgIG1lbWNweShoLT5tbWNvLCBoMS0+bW1jbywgc2l6ZW9mKGgtPm1tY28pKTsKKyAgICBoLT5uYl9tbWNvICAgICAgICAgPSBoMS0+bmJfbW1jbzsKKyAgICBoLT5tbWNvX3Jlc2V0ICAgICAgPSBoMS0+bW1jb19yZXNldDsKKyAgICBoLT5leHBsaWNpdF9yZWZfbWFya2luZyA9IGgxLT5leHBsaWNpdF9yZWZfbWFya2luZzsKKyAgICBoLT5sb25nX3JlZl9jb3VudCAgPSBoMS0+bG9uZ19yZWZfY291bnQ7CisgICAgaC0+c2hvcnRfcmVmX2NvdW50ID0gaDEtPnNob3J0X3JlZl9jb3VudDsKIAogICAgIGNvcHlfcGljdHVyZV9yYW5nZShoLT5zaG9ydF9yZWYsIGgxLT5zaG9ydF9yZWYsIDMyLCBoLCBoMSk7CiAgICAgY29weV9waWN0dXJlX3JhbmdlKGgtPmxvbmdfcmVmLCBoMS0+bG9uZ19yZWYsIDMyLCBoLCBoMSk7CkBAIC01NTMsMTIgKzQzNCwxMiBAQAogICAgICAgICByZXR1cm4gMDsKIAogICAgIGlmICghaC0+ZHJvcHBhYmxlKSB7Ci0gICAgICAgIGVyciA9IGZmX2gyNjRfZXhlY3V0ZV9yZWZfcGljX21hcmtpbmcoaCwgaC0+bW1jbywgaC0+bW1jb19pbmRleCk7Ci0gICAgICAgIGgtPnByZXZfcG9jX21zYiA9IGgtPnBvY19tc2I7Ci0gICAgICAgIGgtPnByZXZfcG9jX2xzYiA9IGgtPnBvY19sc2I7CisgICAgICAgIGVyciA9IGZmX2gyNjRfZXhlY3V0ZV9yZWZfcGljX21hcmtpbmcoaCk7CisgICAgICAgIGgtPnBvYy5wcmV2X3BvY19tc2IgPSBoLT5wb2MucG9jX21zYjsKKyAgICAgICAgaC0+cG9jLnByZXZfcG9jX2xzYiA9IGgtPnBvYy5wb2NfbHNiOwogICAgIH0KLSAgICBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgPSBoLT5mcmFtZV9udW1fb2Zmc2V0OwotICAgIGgtPnByZXZfZnJhbWVfbnVtICAgICAgICA9IGgtPmZyYW1lX251bTsKKyAgICBoLT5wb2MucHJldl9mcmFtZV9udW1fb2Zmc2V0ID0gaC0+cG9jLmZyYW1lX251bV9vZmZzZXQ7CisgICAgaC0+cG9jLnByZXZfZnJhbWVfbnVtICAgICAgICA9IGgtPnBvYy5mcmFtZV9udW07CiAKICAgICBoLT5yZWNvdmVyeV9mcmFtZSAgICAgICAgPSBoMS0+cmVjb3ZlcnlfZnJhbWU7CiAKQEAgLTU3MSw5ICs0NTIsOSBAQAogICAgIGludCBpLCByZXQ7CiAgICAgY29uc3QgaW50IHBpeGVsX3NoaWZ0ID0gaC0+cGl4ZWxfc2hpZnQ7CiAgICAgaW50IGNbNF0gPSB7Ci0gICAgICAgIDE8PChoLT5zcHMuYml0X2RlcHRoX2x1bWEtMSksCi0gICAgICAgIDE8PChoLT5zcHMuYml0X2RlcHRoX2Nocm9tYS0xKSwKLSAgICAgICAgMTw8KGgtPnNwcy5iaXRfZGVwdGhfY2hyb21hLTEpLAorICAgICAgICAxPDwoaC0+cHMuc3BzLT5iaXRfZGVwdGhfbHVtYS0xKSwKKyAgICAgICAgMTw8KGgtPnBzLnNwcy0+Yml0X2RlcHRoX2Nocm9tYS0xKSwKKyAgICAgICAgMTw8KGgtPnBzLnNwcy0+Yml0X2RlcHRoX2Nocm9tYS0xKSwKICAgICAgICAgLTEKICAgICB9OwogCkBAIC01OTUsOCArNDc2LDcgQEAKICAgICBwaWMtPnJlZmVyZW5jZSAgICAgICAgICAgICAgPSBoLT5kcm9wcGFibGUgPyAwIDogaC0+cGljdHVyZV9zdHJ1Y3R1cmU7CiAgICAgcGljLT5mLT5jb2RlZF9waWN0dXJlX251bWJlciA9IGgtPmNvZGVkX3BpY3R1cmVfbnVtYmVyKys7CiAgICAgcGljLT5maWVsZF9waWN0dXJlICAgICAgICAgID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKLSAgICBwaWMtPmZyYW1lX251bSAgICAgICAgICAgICAgID0gaC0+ZnJhbWVfbnVtOwotCisgICAgcGljLT5mcmFtZV9udW0gICAgICAgICAgICAgICA9IGgtPnBvYy5mcmFtZV9udW07CiAgICAgLyoKICAgICAgKiBaZXJvIGtleV9mcmFtZSBoZXJlOyBJRFIgbWFya2luZ3MgcGVyIHNsaWNlIGluIGZyYW1lIG9yIGZpZWxkcyBhcmUgT1JlZAogICAgICAqIGluIGxhdGVyLgpAQCAtNjA2LDE1ICs0ODYsMTggQEAKICAgICBwaWMtPm1tY29fcmVzZXQgID0gMDsKICAgICBwaWMtPnJlY292ZXJlZCAgID0gMDsKICAgICBwaWMtPmludmFsaWRfZ2FwID0gMDsKLSAgICBwaWMtPnNlaV9yZWNvdmVyeV9mcmFtZV9jbnQgPSBoLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250OworICAgIHBpYy0+c2VpX3JlY292ZXJ5X2ZyYW1lX2NudCA9IGgtPnNlaS5yZWNvdmVyeV9wb2ludC5yZWNvdmVyeV9mcmFtZV9jbnQ7CisKKyAgICBwaWMtPmYtPnBpY3RfdHlwZSA9IGgtPnNsaWNlX2N0eFswXS5zbGljZV90eXBlOworCisgICAgcGljLT5mLT5jcm9wX2xlZnQgICA9IGgtPmNyb3BfbGVmdDsKKyAgICBwaWMtPmYtPmNyb3BfcmlnaHQgID0gaC0+Y3JvcF9yaWdodDsKKyAgICBwaWMtPmYtPmNyb3BfdG9wICAgID0gaC0+Y3JvcF90b3A7CisgICAgcGljLT5mLT5jcm9wX2JvdHRvbSA9IGgtPmNyb3BfYm90dG9tOwogCiAgICAgaWYgKChyZXQgPSBhbGxvY19waWN0dXJlKGgsIHBpYykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZighaC0+ZnJhbWVfcmVjb3ZlcmVkICYmICFoLT5hdmN0eC0+aHdhY2NlbAotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICAgICAmJiAhKGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCi0jZW5kaWYKLSAgICAgICApCisgICAgaWYoIWgtPmZyYW1lX3JlY292ZXJlZCAmJiAhaC0+YXZjdHgtPmh3YWNjZWwpCiAgICAgICAgIGZmX2NvbG9yX2ZyYW1lKHBpYy0+ZiwgYyk7CiAKICAgICBoLT5jdXJfcGljX3B0ciA9IHBpYzsKQEAgLTY1OCw2ICs1NDEsMTMgQEAKIAogICAgIGgtPm5leHRfb3V0cHV0X3BpYyA9IE5VTEw7CiAKKyAgICBoLT5wb3N0cG9uZV9maWx0ZXIgPSAwOworCisgICAgaC0+bWJfYWZmX2ZyYW1lID0gaC0+cHMuc3BzLT5tYl9hZmYgJiYgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpOworCisgICAgaWYgKGgtPnNlaS51bnJlZ2lzdGVyZWQueDI2NF9idWlsZCA+PSAwKQorICAgICAgICBoLT54MjY0X2J1aWxkID0gaC0+c2VpLnVucmVnaXN0ZXJlZC54MjY0X2J1aWxkOworCiAgICAgYXNzZXJ0KGgtPmN1cl9waWNfcHRyLT5sb25nX3JlZiA9PSAwKTsKIAogICAgIHJldHVybiAwOwpAQCAtNzcwLDggKzY2MCw4IEBACiAgICAgaW50IHJlZjAsIHJlZjEsIGksIGN1cl9wb2MsIHJlZl9zdGFydCwgcmVmX2NvdW50MCwgcmVmX2NvdW50MTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgc2wtPmx1bWFfd2VpZ2h0X2ZsYWdbaV0gICA9IDA7Ci0gICAgICAgIHNsLT5jaHJvbWFfd2VpZ2h0X2ZsYWdbaV0gPSAwOworICAgICAgICBzbC0+cHd0Lmx1bWFfd2VpZ2h0X2ZsYWdbaV0gICA9IDA7CisgICAgICAgIHNsLT5wd3QuY2hyb21hX3dlaWdodF9mbGFnW2ldID0gMDsKICAgICB9CiAKICAgICBpZiAoZmllbGQgPCAwKSB7CkBAIC03ODEsOSArNjcxLDkgQEAKICAgICAgICAgICAgIGN1cl9wb2MgPSBoLT5jdXJfcGljX3B0ci0+ZmllbGRfcG9jW2gtPnBpY3R1cmVfc3RydWN0dXJlIC0gMV07CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNsLT5yZWZfY291bnRbMF0gPT0gMSAmJiBzbC0+cmVmX2NvdW50WzFdID09IDEgJiYgIUZSQU1FX01CQUZGKGgpICYmCi0gICAgICAgICAgICBzbC0+cmVmX2xpc3RbMF1bMF0ucG9jICsgKGludDY0X3Qpc2wtPnJlZl9saXN0WzFdWzBdLnBvYyA9PSAyICogY3VyX3BvYykgewotICAgICAgICAgICAgc2wtPnVzZV93ZWlnaHQgICAgICAgID0gMDsKLSAgICAgICAgICAgIHNsLT51c2Vfd2VpZ2h0X2Nocm9tYSA9IDA7CisgICAgICAgICAgICBzbC0+cmVmX2xpc3RbMF1bMF0ucG9jICsgKGludDY0X3Qpc2wtPnJlZl9saXN0WzFdWzBdLnBvYyA9PSAyTEwgKiBjdXJfcG9jKSB7CisgICAgICAgICAgICBzbC0+cHd0LnVzZV93ZWlnaHQgICAgICAgID0gMDsKKyAgICAgICAgICAgIHNsLT5wd3QudXNlX3dlaWdodF9jaHJvbWEgPSAwOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHJlZl9zdGFydCAgPSAwOwpAQCAtNzk2LDEwICs2ODYsMTAgQEAKICAgICAgICAgcmVmX2NvdW50MSA9IDE2ICsgMiAqIHNsLT5yZWZfY291bnRbMV07CiAgICAgfQogCi0gICAgc2wtPnVzZV93ZWlnaHQgICAgICAgICAgICAgICA9IDI7Ci0gICAgc2wtPnVzZV93ZWlnaHRfY2hyb21hICAgICAgICA9IDI7Ci0gICAgc2wtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gICA9IDU7Ci0gICAgc2wtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSA9IDU7CisgICAgc2wtPnB3dC51c2Vfd2VpZ2h0ICAgICAgICAgICAgICAgPSAyOworICAgIHNsLT5wd3QudXNlX3dlaWdodF9jaHJvbWEgICAgICAgID0gMjsKKyAgICBzbC0+cHd0Lmx1bWFfbG9nMl93ZWlnaHRfZGVub20gICA9IDU7CisgICAgc2wtPnB3dC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gPSA1OwogCiAgICAgZm9yIChyZWYwID0gcmVmX3N0YXJ0OyByZWYwIDwgcmVmX2NvdW50MDsgcmVmMCsrKSB7CiAgICAgICAgIGludDY0X3QgcG9jMCA9IHNsLT5yZWZfbGlzdFswXVtyZWYwXS5wb2M7CkBAIC04MTcsMTAgKzcwNywxMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChmaWVsZCA8IDApIHsKLSAgICAgICAgICAgICAgICBzbC0+aW1wbGljaXRfd2VpZ2h0W3JlZjBdW3JlZjFdWzBdID0KLSAgICAgICAgICAgICAgICBzbC0+aW1wbGljaXRfd2VpZ2h0W3JlZjBdW3JlZjFdWzFdID0gdzsKKyAgICAgICAgICAgICAgICBzbC0+cHd0LmltcGxpY2l0X3dlaWdodFtyZWYwXVtyZWYxXVswXSA9CisgICAgICAgICAgICAgICAgc2wtPnB3dC5pbXBsaWNpdF93ZWlnaHRbcmVmMF1bcmVmMV1bMV0gPSB3OwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzbC0+aW1wbGljaXRfd2VpZ2h0W3JlZjBdW3JlZjFdW2ZpZWxkXSA9IHc7CisgICAgICAgICAgICAgICAgc2wtPnB3dC5pbXBsaWNpdF93ZWlnaHRbcmVmMF1bcmVmMV1bZmllbGRdID0gdzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTgzNCw3ICs3MjQsNyBAQAogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAjZGVmaW5lIFRSQU5TUE9TRSh4KSAoKHgpID4+IDIpIHwgKCgoeCkgPDwgMikgJiAweEYpCi0gICAgICAgIGgtPnppZ3phZ19zY2FuW2ldID0gVFJBTlNQT1NFKHppZ3phZ19zY2FuW2ldKTsKKyAgICAgICAgaC0+emlnemFnX3NjYW5baV0gPSBUUkFOU1BPU0UoZmZfemlnemFnX3NjYW5baV0pOwogICAgICAgICBoLT5maWVsZF9zY2FuW2ldICA9IFRSQU5TUE9TRShmaWVsZF9zY2FuW2ldKTsKICN1bmRlZiBUUkFOU1BPU0UKICAgICB9CkBAIC04NDYsOCArNzM2LDggQEAKICAgICAgICAgaC0+ZmllbGRfc2Nhbjh4OF9jYXZsY1tpXSAgPSBUUkFOU1BPU0UoZmllbGRfc2Nhbjh4OF9jYXZsY1tpXSk7CiAjdW5kZWYgVFJBTlNQT1NFCiAgICAgfQotICAgIGlmIChoLT5zcHMudHJhbnNmb3JtX2J5cGFzcykgeyAvLyBGSVhNRSBzYW1lIHVnbHkKLSAgICAgICAgbWVtY3B5KGgtPnppZ3phZ19zY2FuX3EwICAgICAgICAgICwgemlnemFnX3NjYW4gICAgICAgICAgICAgLCBzaXplb2YoaC0+emlnemFnX3NjYW5fcTAgICAgICAgICApKTsKKyAgICBpZiAoaC0+cHMuc3BzLT50cmFuc2Zvcm1fYnlwYXNzKSB7IC8vIEZJWE1FIHNhbWUgdWdseQorICAgICAgICBtZW1jcHkoaC0+emlnemFnX3NjYW5fcTAgICAgICAgICAgLCBmZl96aWd6YWdfc2NhbiAgICAgICAgICAsIHNpemVvZihoLT56aWd6YWdfc2Nhbl9xMCAgICAgICAgICkpOwogICAgICAgICBtZW1jcHkoaC0+emlnemFnX3NjYW44eDhfcTAgICAgICAgLCBmZl96aWd6YWdfZGlyZWN0ICAgICAgICAsIHNpemVvZihoLT56aWd6YWdfc2Nhbjh4OF9xMCAgICAgICkpOwogICAgICAgICBtZW1jcHkoaC0+emlnemFnX3NjYW44eDhfY2F2bGNfcTAgLCB6aWd6YWdfc2Nhbjh4OF9jYXZsYyAgICAsIHNpemVvZihoLT56aWd6YWdfc2Nhbjh4OF9jYXZsY19xMCkpOwogICAgICAgICBtZW1jcHkoaC0+ZmllbGRfc2Nhbl9xMCAgICAgICAgICAgLCBmaWVsZF9zY2FuICAgICAgICAgICAgICAsIHNpemVvZihoLT5maWVsZF9zY2FuX3EwICAgICAgICAgICkpOwpAQCAtODY2LDE2ICs3NTYsMTYgQEAKIHN0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgZ2V0X3BpeGVsX2Zvcm1hdChIMjY0Q29udGV4dCAqaCwgaW50IGZvcmNlX2NhbGxiYWNrKQogewogI2RlZmluZSBIV0FDQ0VMX01BWCAoQ09ORklHX0gyNjRfRFhWQTJfSFdBQ0NFTCArIFwKLSAgICAgICAgICAgICAgICAgICAgIENPTkZJR19IMjY0X0QzRDExVkFfSFdBQ0NFTCArIFwKKyAgICAgICAgICAgICAgICAgICAgIChDT05GSUdfSDI2NF9EM0QxMVZBX0hXQUNDRUwgKiAyKSArIFwKKyAgICAgICAgICAgICAgICAgICAgIENPTkZJR19IMjY0X05WREVDX0hXQUNDRUwgKyBcCiAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSDI2NF9WQUFQSV9IV0FDQ0VMICsgXAotICAgICAgICAgICAgICAgICAgICAgKENPTkZJR19IMjY0X1ZEQV9IV0FDQ0VMICogMikgKyBcCiAgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSDI2NF9WSURFT1RPT0xCT1hfSFdBQ0NFTCArIFwKICAgICAgICAgICAgICAgICAgICAgIENPTkZJR19IMjY0X1ZEUEFVX0hXQUNDRUwpCiAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW0hXQUNDRUxfTUFYICsgMl0sICpmbXQgPSBwaXhfZm10czsKICAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmNob2ljZXMgPSBwaXhfZm10czsKICAgICBpbnQgaTsKIAotICAgIHN3aXRjaCAoaC0+c3BzLmJpdF9kZXB0aF9sdW1hKSB7CisgICAgc3dpdGNoIChoLT5wcy5zcHMtPmJpdF9kZXB0aF9sdW1hKSB7CiAgICAgY2FzZSA5OgogICAgICAgICBpZiAoQ0hST01BNDQ0KGgpKSB7CiAgICAgICAgICAgICBpZiAoaC0+YXZjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX1JHQikgewpAQCAtOTI0LDYgKzgxNCw5IEBACiAjaWYgQ09ORklHX0gyNjRfVkRQQVVfSFdBQ0NFTAogICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX1ZEUEFVOwogI2VuZGlmCisjaWYgQ09ORklHX0gyNjRfTlZERUNfSFdBQ0NFTAorICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX0NVREE7CisjZW5kaWYKICAgICAgICAgaWYgKENIUk9NQTQ0NChoKSkgewogICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19SR0IpCiAgICAgICAgICAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9HQlJQOwpAQCAtOTQyLDE0ICs4MzUsMTEgQEAKICNlbmRpZgogI2lmIENPTkZJR19IMjY0X0QzRDExVkFfSFdBQ0NFTAogICAgICAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRDsKKyAgICAgICAgICAgICpmbXQrKyA9IEFWX1BJWF9GTVRfRDNEMTE7CiAjZW5kaWYKICNpZiBDT05GSUdfSDI2NF9WQUFQSV9IV0FDQ0VMCiAgICAgICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX1ZBQVBJOwogI2VuZGlmCi0jaWYgQ09ORklHX0gyNjRfVkRBX0hXQUNDRUwKLSAgICAgICAgICAgICpmbXQrKyA9IEFWX1BJWF9GTVRfVkRBX1ZMRDsKLSAgICAgICAgICAgICpmbXQrKyA9IEFWX1BJWF9GTVRfVkRBOwotI2VuZGlmCiAjaWYgQ09ORklHX0gyNjRfVklERU9UT09MQk9YX0hXQUNDRUwKICAgICAgICAgICAgICpmbXQrKyA9IEFWX1BJWF9GTVRfVklERU9UT09MQk9YOwogI2VuZGlmCkBAIC05NjMsNyArODUzLDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgYml0IGRlcHRoICVkXG4iLCBoLT5zcHMuYml0X2RlcHRoX2x1bWEpOworICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGJpdCBkZXB0aCAlZFxuIiwgaC0+cHMuc3BzLT5iaXRfZGVwdGhfbHVtYSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIApAQCAtOTc4LDYzICs4NjgsNjEgQEAKIC8qIGV4cG9ydCBjb2RlZCBhbmQgY3JvcHBlZCBmcmFtZSBkaW1lbnNpb25zIHRvIEFWQ29kZWNDb250ZXh0ICovCiBzdGF0aWMgaW50IGluaXRfZGltZW5zaW9ucyhIMjY0Q29udGV4dCAqaCkKIHsKLSAgICBpbnQgd2lkdGggID0gaC0+d2lkdGggIC0gKGgtPnNwcy5jcm9wX3JpZ2h0ICsgaC0+c3BzLmNyb3BfbGVmdCk7Ci0gICAgaW50IGhlaWdodCA9IGgtPmhlaWdodCAtIChoLT5zcHMuY3JvcF90b3AgICArIGgtPnNwcy5jcm9wX2JvdHRvbSk7Ci0gICAgYXZfYXNzZXJ0MChoLT5zcHMuY3JvcF9yaWdodCArIGgtPnNwcy5jcm9wX2xlZnQgPCAodW5zaWduZWQpaC0+d2lkdGgpOwotICAgIGF2X2Fzc2VydDAoaC0+c3BzLmNyb3BfdG9wICsgaC0+c3BzLmNyb3BfYm90dG9tIDwgKHVuc2lnbmVkKWgtPmhlaWdodCk7CisgICAgY29uc3QgU1BTICpzcHMgPSAoY29uc3QgU1BTKiloLT5wcy5zcHM7CisgICAgaW50IGNyID0gc3BzLT5jcm9wX3JpZ2h0OworICAgIGludCBjbCA9IHNwcy0+Y3JvcF9sZWZ0OworICAgIGludCBjdCA9IHNwcy0+Y3JvcF90b3A7CisgICAgaW50IGNiID0gc3BzLT5jcm9wX2JvdHRvbTsKKyAgICBpbnQgd2lkdGggID0gaC0+d2lkdGggIC0gKGNyICsgY2wpOworICAgIGludCBoZWlnaHQgPSBoLT5oZWlnaHQgLSAoY3QgKyBjYik7CisgICAgYXZfYXNzZXJ0MChzcHMtPmNyb3BfcmlnaHQgKyBzcHMtPmNyb3BfbGVmdCA8ICh1bnNpZ25lZCloLT53aWR0aCk7CisgICAgYXZfYXNzZXJ0MChzcHMtPmNyb3BfdG9wICsgc3BzLT5jcm9wX2JvdHRvbSA8ICh1bnNpZ25lZCloLT5oZWlnaHQpOwogCiAgICAgLyogaGFuZGxlIGNvbnRhaW5lciBjcm9wcGluZyAqLwotICAgIGlmIChGRkFMSUdOKGgtPmF2Y3R4LT53aWR0aCwgIDE2KSA9PSBGRkFMSUdOKHdpZHRoLCAgMTYpICYmCi0gICAgICAgIEZGQUxJR04oaC0+YXZjdHgtPmhlaWdodCwgMTYpID09IEZGQUxJR04oaGVpZ2h0LCAxNikgJiYKLSAgICAgICAgaC0+YXZjdHgtPndpZHRoICA8PSB3aWR0aCAmJgotICAgICAgICBoLT5hdmN0eC0+aGVpZ2h0IDw9IGhlaWdodAotICAgICkgewotICAgICAgICB3aWR0aCAgPSBoLT5hdmN0eC0+d2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IGgtPmF2Y3R4LT5oZWlnaHQ7Ci0gICAgfQotCi0gICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNyb3BwZWQgZGltZW5zaW9uczogJWR4JWQuXG4iLAotICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIGlmIChoLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotCi0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJZ25vcmluZyBjcm9wcGluZyBpbmZvcm1hdGlvbi5cbiIpOwotICAgICAgICBoLT5zcHMuY3JvcF9ib3R0b20gPQotICAgICAgICBoLT5zcHMuY3JvcF90b3AgICAgPQotICAgICAgICBoLT5zcHMuY3JvcF9yaWdodCAgPQotICAgICAgICBoLT5zcHMuY3JvcF9sZWZ0ICAgPQotICAgICAgICBoLT5zcHMuY3JvcCAgICAgICAgPSAwOwotCi0gICAgICAgIHdpZHRoICA9IGgtPndpZHRoOwotICAgICAgICBoZWlnaHQgPSBoLT5oZWlnaHQ7CisgICAgaWYgKGgtPndpZHRoX2Zyb21fY2FsbGVyID4gMCAmJiBoLT5oZWlnaHRfZnJvbV9jYWxsZXIgPiAwICAgICAmJgorICAgICAgICAhc3BzLT5jcm9wX3RvcCAmJiAhc3BzLT5jcm9wX2xlZnQgICAgICAgICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgRkZBTElHTihoLT53aWR0aF9mcm9tX2NhbGxlciwgIDE2KSA9PSBGRkFMSUdOKHdpZHRoLCAgMTYpICYmCisgICAgICAgIEZGQUxJR04oaC0+aGVpZ2h0X2Zyb21fY2FsbGVyLCAxNikgPT0gRkZBTElHTihoZWlnaHQsIDE2KSAmJgorICAgICAgICBoLT53aWR0aF9mcm9tX2NhbGxlciAgPD0gd2lkdGggJiYKKyAgICAgICAgaC0+aGVpZ2h0X2Zyb21fY2FsbGVyIDw9IGhlaWdodCkgeworICAgICAgICB3aWR0aCAgPSBoLT53aWR0aF9mcm9tX2NhbGxlcjsKKyAgICAgICAgaGVpZ2h0ID0gaC0+aGVpZ2h0X2Zyb21fY2FsbGVyOworICAgICAgICBjbCA9IDA7CisgICAgICAgIGN0ID0gMDsKKyAgICAgICAgY3IgPSBoLT53aWR0aCAtIHdpZHRoOworICAgICAgICBjYiA9IGgtPmhlaWdodCAtIGhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICBoLT53aWR0aF9mcm9tX2NhbGxlciAgPSAwOworICAgICAgICBoLT5oZWlnaHRfZnJvbV9jYWxsZXIgPSAwOwogICAgIH0KIAogICAgIGgtPmF2Y3R4LT5jb2RlZF93aWR0aCAgPSBoLT53aWR0aDsKICAgICBoLT5hdmN0eC0+Y29kZWRfaGVpZ2h0ID0gaC0+aGVpZ2h0OwogICAgIGgtPmF2Y3R4LT53aWR0aCAgICAgICAgPSB3aWR0aDsKICAgICBoLT5hdmN0eC0+aGVpZ2h0ICAgICAgID0gaGVpZ2h0OworICAgIGgtPmNyb3BfcmlnaHQgICAgICAgICAgPSBjcjsKKyAgICBoLT5jcm9wX2xlZnQgICAgICAgICAgID0gY2w7CisgICAgaC0+Y3JvcF90b3AgICAgICAgICAgICA9IGN0OworICAgIGgtPmNyb3BfYm90dG9tICAgICAgICAgPSBjYjsKIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGgyNjRfc2xpY2VfaGVhZGVyX2luaXQoSDI2NENvbnRleHQgKmgpCiB7Ci0gICAgaW50IG5iX3NsaWNlcyA9IChIQVZFX1RIUkVBRFMgJiYKLSAgICAgICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpID8KLSAgICAgICAgICAgICAgICAgICAgaC0+YXZjdHgtPnRocmVhZF9jb3VudCA6IDE7CisgICAgY29uc3QgU1BTICpzcHMgPSBoLT5wcy5zcHM7CiAgICAgaW50IGksIHJldDsKIAotICAgIGZmX3NldF9zYXIoaC0+YXZjdHgsIGgtPnNwcy5zYXIpOworICAgIGZmX3NldF9zYXIoaC0+YXZjdHgsIHNwcy0+c2FyKTsKICAgICBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShoLT5hdmN0eC0+cGl4X2ZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+Y2hyb21hX3hfc2hpZnQsICZoLT5jaHJvbWFfeV9zaGlmdCk7CiAKLSAgICBpZiAoaC0+c3BzLnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgewotICAgICAgICBpbnQ2NF90IGRlbiA9IGgtPnNwcy50aW1lX3NjYWxlOworICAgIGlmIChzcHMtPnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworICAgICAgICBpbnQ2NF90IGRlbiA9IHNwcy0+dGltZV9zY2FsZTsKICAgICAgICAgaWYgKGgtPngyNjRfYnVpbGQgPCA0NFUpCiAgICAgICAgICAgICBkZW4gKj0gMjsKICAgICAgICAgYXZfcmVkdWNlKCZoLT5hdmN0eC0+ZnJhbWVyYXRlLmRlbiwgJmgtPmF2Y3R4LT5mcmFtZXJhdGUubnVtLAotICAgICAgICAgICAgICAgICAgaC0+c3BzLm51bV91bml0c19pbl90aWNrICogaC0+YXZjdHgtPnRpY2tzX3Blcl9mcmFtZSwgZGVuLCAxIDw8IDMwKTsKKyAgICAgICAgICAgICAgICAgIHNwcy0+bnVtX3VuaXRzX2luX3RpY2sgKiBoLT5hdmN0eC0+dGlja3NfcGVyX2ZyYW1lLCBkZW4sIDEgPDwgMzApOwogICAgIH0KIAogICAgIGZmX2gyNjRfZnJlZV90YWJsZXMoaCk7CkBAIC0xMDQ5LDUzICs5MzcsMjkgQEAKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICBpZiAoaC0+YXZjdHgtPmNvZGVjICYmCi0gICAgICAgIGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUgJiYKLSAgICAgICAgKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAhPSA4IHx8IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA+IDEpKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICJWRFBBVSBkZWNvZGluZyBkb2VzIG5vdCBzdXBwb3J0IHZpZGVvIGNvbG9yc3BhY2UuXG4iKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSA8IDggfHwgaC0+c3BzLmJpdF9kZXB0aF9sdW1hID4gMTQgfHwKLSAgICAgICAgaC0+c3BzLmJpdF9kZXB0aF9sdW1hID09IDExIHx8IGgtPnNwcy5iaXRfZGVwdGhfbHVtYSA9PSAxMworICAgIGlmIChzcHMtPmJpdF9kZXB0aF9sdW1hIDwgOCB8fCBzcHMtPmJpdF9kZXB0aF9sdW1hID4gMTQgfHwKKyAgICAgICAgc3BzLT5iaXRfZGVwdGhfbHVtYSA9PSAxMSB8fCBzcHMtPmJpdF9kZXB0aF9sdW1hID09IDEzCiAgICAgKSB7CiAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgYml0IGRlcHRoICVkXG4iLAotICAgICAgICAgICAgICAgaC0+c3BzLmJpdF9kZXB0aF9sdW1hKTsKKyAgICAgICAgICAgICAgIHNwcy0+Yml0X2RlcHRoX2x1bWEpOwogICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCiAgICAgaC0+Y3VyX2JpdF9kZXB0aF9sdW1hICAgICAgICAgPQotICAgIGgtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hOwotICAgIGgtPmN1cl9jaHJvbWFfZm9ybWF0X2lkYyAgICAgID0gaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjOwotICAgIGgtPnBpeGVsX3NoaWZ0ICAgICAgICAgICAgICAgID0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hID4gODsKLSAgICBoLT5jaHJvbWFfZm9ybWF0X2lkYyAgICAgICAgICA9IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYzsKLSAgICBoLT5iaXRfZGVwdGhfbHVtYSAgICAgICAgICAgICA9IGgtPnNwcy5iaXRfZGVwdGhfbHVtYTsKKyAgICBoLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IHNwcy0+Yml0X2RlcHRoX2x1bWE7CisgICAgaC0+Y3VyX2Nocm9tYV9mb3JtYXRfaWRjICAgICAgPSBzcHMtPmNocm9tYV9mb3JtYXRfaWRjOworICAgIGgtPnBpeGVsX3NoaWZ0ICAgICAgICAgICAgICAgID0gc3BzLT5iaXRfZGVwdGhfbHVtYSA+IDg7CisgICAgaC0+Y2hyb21hX2Zvcm1hdF9pZGMgICAgICAgICAgPSBzcHMtPmNocm9tYV9mb3JtYXRfaWRjOworICAgIGgtPmJpdF9kZXB0aF9sdW1hICAgICAgICAgICAgID0gc3BzLT5iaXRfZGVwdGhfbHVtYTsKIAotICAgIGZmX2gyNjRkc3BfaW5pdCgmaC0+aDI2NGRzcCwgaC0+c3BzLmJpdF9kZXB0aF9sdW1hLAotICAgICAgICAgICAgICAgICAgICBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpOwotICAgIGZmX2gyNjRjaHJvbWFfaW5pdCgmaC0+aDI2NGNocm9tYSwgaC0+c3BzLmJpdF9kZXB0aF9jaHJvbWEpOwotICAgIGZmX2gyNjRxcGVsX2luaXQoJmgtPmgyNjRxcGVsLCBoLT5zcHMuYml0X2RlcHRoX2x1bWEpOwotICAgIGZmX2gyNjRfcHJlZF9pbml0KCZoLT5ocGMsIGgtPmF2Y3R4LT5jb2RlY19pZCwgaC0+c3BzLmJpdF9kZXB0aF9sdW1hLAotICAgICAgICAgICAgICAgICAgICAgIGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyk7Ci0gICAgZmZfdmlkZW9kc3BfaW5pdCgmaC0+dmRzcCwgaC0+c3BzLmJpdF9kZXB0aF9sdW1hKTsKLQotICAgIGlmIChuYl9zbGljZXMgPiBIMjY0X01BWF9USFJFQURTIHx8IChuYl9zbGljZXMgPiBoLT5tYl9oZWlnaHQgJiYgaC0+bWJfaGVpZ2h0KSkgewotICAgICAgICBpbnQgbWF4X3NsaWNlczsKLSAgICAgICAgaWYgKGgtPm1iX2hlaWdodCkKLSAgICAgICAgICAgIG1heF9zbGljZXMgPSBGRk1JTihIMjY0X01BWF9USFJFQURTLCBoLT5tYl9oZWlnaHQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBtYXhfc2xpY2VzID0gSDI2NF9NQVhfVEhSRUFEUzsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgInRvbyBtYW55IHRocmVhZHMvc2xpY2VzICVkLCIKLSAgICAgICAgICAgICAgICIgcmVkdWNpbmcgdG8gJWRcbiIsIG5iX3NsaWNlcywgbWF4X3NsaWNlcyk7Ci0gICAgICAgIG5iX3NsaWNlcyA9IG1heF9zbGljZXM7Ci0gICAgfQotICAgIGgtPnNsaWNlX2NvbnRleHRfY291bnQgPSBuYl9zbGljZXM7Ci0gICAgaC0+bWF4X2NvbnRleHRzID0gRkZNSU4oaC0+bWF4X2NvbnRleHRzLCBuYl9zbGljZXMpOworICAgIGZmX2gyNjRkc3BfaW5pdCgmaC0+aDI2NGRzcCwgc3BzLT5iaXRfZGVwdGhfbHVtYSwKKyAgICAgICAgICAgICAgICAgICAgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyk7CisgICAgZmZfaDI2NGNocm9tYV9pbml0KCZoLT5oMjY0Y2hyb21hLCBzcHMtPmJpdF9kZXB0aF9jaHJvbWEpOworICAgIGZmX2gyNjRxcGVsX2luaXQoJmgtPmgyNjRxcGVsLCBzcHMtPmJpdF9kZXB0aF9sdW1hKTsKKyAgICBmZl9oMjY0X3ByZWRfaW5pdCgmaC0+aHBjLCBoLT5hdmN0eC0+Y29kZWNfaWQsIHNwcy0+Yml0X2RlcHRoX2x1bWEsCisgICAgICAgICAgICAgICAgICAgICAgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyk7CisgICAgZmZfdmlkZW9kc3BfaW5pdCgmaC0+dmRzcCwgc3BzLT5iaXRfZGVwdGhfbHVtYSk7CiAKICAgICBpZiAoIUhBVkVfVEhSRUFEUyB8fCAhKGgtPmF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpKSB7CiAgICAgICAgIHJldCA9IGZmX2gyNjRfc2xpY2VfY29udGV4dF9pbml0KGgsICZoLT5zbGljZV9jdHhbMF0pOwpAQCAtMTEwNCw3ICs5NjgsNyBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPnNsaWNlX2NvbnRleHRfY291bnQ7IGkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+bmJfc2xpY2VfY3R4OyBpKyspIHsKICAgICAgICAgICAgIEgyNjRTbGljZUNvbnRleHQgKnNsID0gJmgtPnNsaWNlX2N0eFtpXTsKIAogICAgICAgICAgICAgc2wtPmgyNjQgICAgICAgICAgICAgICA9IGg7CkBAIC0xMTM5LDIyMCArMTAwMyw2OSBAQAogICAgIH0KIH0KIAotLyoqCi0gKiBEZWNvZGUgYSBzbGljZSBoZWFkZXIuCi0gKiBUaGlzIHdpbGwgKHJlKWludGlhbGl6ZSB0aGUgZGVjb2RlciBhbmQgY2FsbCBoMjY0X2ZyYW1lX3N0YXJ0KCkgYXMgbmVlZGVkLgotICoKLSAqIEBwYXJhbSBoIGgyNjRjb250ZXh0Ci0gKgotICogQHJldHVybiAwIGlmIG9rYXksIDwwIGlmIGFuIGVycm9yIG9jY3VycmVkLCAxIGlmIGRlY29kaW5nIG11c3Qgbm90IGJlIG11bHRpdGhyZWFkZWQKLSAqLwotaW50IGZmX2gyNjRfZGVjb2RlX3NsaWNlX2hlYWRlcihIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpCitzdGF0aWMgaW50IGgyNjRfaW5pdF9wcyhIMjY0Q29udGV4dCAqaCwgY29uc3QgSDI2NFNsaWNlQ29udGV4dCAqc2wsIGludCBmaXJzdF9zbGljZSkKIHsKLSAgICB1bnNpZ25lZCBpbnQgZmlyc3RfbWJfaW5fc2xpY2U7Ci0gICAgdW5zaWduZWQgaW50IHBwc19pZDsKLSAgICBpbnQgcmV0OwotICAgIHVuc2lnbmVkIGludCBzbGljZV90eXBlLCB0bXAsIGksIGo7Ci0gICAgaW50IGxhc3RfcGljX3N0cnVjdHVyZSwgbGFzdF9waWNfZHJvcHBhYmxlOwotICAgIGludCBtdXN0X3JlaW5pdDsKLSAgICBpbnQgbmVlZHNfcmVpbml0ID0gMDsKLSAgICBpbnQgZmllbGRfcGljX2ZsYWcsIGJvdHRvbV9maWVsZF9mbGFnOwotICAgIGludCBmaXJzdF9zbGljZSA9IHNsID09IGgtPnNsaWNlX2N0eCAmJiAhaC0+Y3VycmVudF9zbGljZTsKLSAgICBpbnQgZnJhbWVfbnVtLCBkcm9wcGFibGUsIHBpY3R1cmVfc3RydWN0dXJlOwotICAgIGludCBtYl9hZmZfZnJhbWUsIGxhc3RfbWJfYWZmX2ZyYW1lOwotICAgIFBQUyAqcHBzOwotCi0gICAgaWYgKGZpcnN0X3NsaWNlKQotICAgICAgICBhdl9hc3NlcnQwKCFoLT5zZXR1cF9maW5pc2hlZCk7Ci0KLSAgICBoLT5xcGVsX3B1dCA9IGgtPmgyNjRxcGVsLnB1dF9oMjY0X3FwZWxfcGl4ZWxzX3RhYjsKLSAgICBoLT5xcGVsX2F2ZyA9IGgtPmgyNjRxcGVsLmF2Z19oMjY0X3FwZWxfcGl4ZWxzX3RhYjsKLQotICAgIGZpcnN0X21iX2luX3NsaWNlID0gZ2V0X3VlX2dvbG9tYl9sb25nKCZzbC0+Z2IpOwotCi0gICAgaWYgKGZpcnN0X21iX2luX3NsaWNlID09IDApIHsgLy8gRklYTUUgYmV0dGVyIGZpZWxkIGJvdW5kYXJ5IGRldGVjdGlvbgotICAgICAgICBpZiAoaC0+Y3VycmVudF9zbGljZSkgewotICAgICAgICAgICAgaWYgKGgtPnNldHVwX2ZpbmlzaGVkKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBmaWVsZHNcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGgtPm1heF9jb250ZXh0cyA+IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWgtPnNpbmdsZV9kZWNvZGVfd2FybmluZykgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ2Fubm90IGRlY29kZSBtdWx0aXBsZSBhY2Nlc3MgdW5pdHMgYXMgc2xpY2UgdGhyZWFkc1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIGgtPnNpbmdsZV9kZWNvZGVfd2FybmluZyA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGgtPm1heF9jb250ZXh0cyA9IDE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNMSUNFX1NJTkdMRVRIUkVBRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGgtPmN1cl9waWNfcHRyICYmIEZJRUxEX1BJQ1RVUkUoaCkgJiYgaC0+Zmlyc3RfZmllbGQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBmZl9oMjY0X2ZpZWxkX2VuZChoLCBoLT5zbGljZV9jdHgsIDEpOwotICAgICAgICAgICAgICAgIGgtPmN1cnJlbnRfc2xpY2UgPSAwOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfSBlbHNlIGlmIChoLT5jdXJfcGljX3B0ciAmJiAhRklFTERfUElDVFVSRShoKSAmJiAhaC0+Zmlyc3RfZmllbGQgJiYgaC0+bmFsX3VuaXRfdHlwZSAgPT0gTkFMX0lEUl9TTElDRSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywgIkJyb2tlbiBmcmFtZSBwYWNrZXRpemluZ1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9maWVsZF9lbmQoaCwgaC0+c2xpY2VfY3R4LCAxKTsKLSAgICAgICAgICAgICAgICBoLT5jdXJyZW50X3NsaWNlID0gMDsKLSAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsIDApOwotICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmgtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwgMSk7Ci0gICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWgtPmZpcnN0X2ZpZWxkKSB7Ci0gICAgICAgICAgICBpZiAoaC0+Y3VyX3BpY19wdHIgJiYgIWgtPmRyb3BwYWJsZSkgewotICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmgtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGgtPmN1cl9waWNfcHRyID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghaC0+Y3VycmVudF9zbGljZSkKLSAgICAgICAgYXZfYXNzZXJ0MChzbCA9PSBoLT5zbGljZV9jdHgpOwotCi0gICAgc2xpY2VfdHlwZSA9IGdldF91ZV9nb2xvbWJfMzEoJnNsLT5nYik7Ci0gICAgaWYgKHNsaWNlX3R5cGUgPiA5KSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgInNsaWNlIHR5cGUgJWQgdG9vIGxhcmdlIGF0ICVkXG4iLAotICAgICAgICAgICAgICAgc2xpY2VfdHlwZSwgZmlyc3RfbWJfaW5fc2xpY2UpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0gICAgaWYgKHNsaWNlX3R5cGUgPiA0KSB7Ci0gICAgICAgIHNsaWNlX3R5cGUgLT0gNTsKLSAgICAgICAgc2wtPnNsaWNlX3R5cGVfZml4ZWQgPSAxOwotICAgIH0gZWxzZQotICAgICAgICBzbC0+c2xpY2VfdHlwZV9maXhlZCA9IDA7Ci0KLSAgICBzbGljZV90eXBlID0gZ29sb21iX3RvX3BpY3RfdHlwZVtzbGljZV90eXBlXTsKLSAgICBzbC0+c2xpY2VfdHlwZSAgICAgPSBzbGljZV90eXBlOwotICAgIHNsLT5zbGljZV90eXBlX25vcyA9IHNsaWNlX3R5cGUgJiAzOwotCi0gICAgaWYgKGgtPm5hbF91bml0X3R5cGUgID09IE5BTF9JRFJfU0xJQ0UgJiYKLSAgICAgICAgc2wtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQSBub24taW50cmEgc2xpY2UgaW4gYW4gSURSIE5BTCB1bml0LlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIH0KLQotICAgIGlmIChoLT5jdXJyZW50X3NsaWNlID09IDAgJiYgIWgtPmZpcnN0X2ZpZWxkKSB7Ci0gICAgICAgIGlmICgKLSAgICAgICAgICAgIChoLT5hdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfTk9OUkVGICYmICFoLT5uYWxfcmVmX2lkYykgfHwKLSAgICAgICAgICAgIChoLT5hdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfQklESVIgICYmIHNsLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikgfHwKLSAgICAgICAgICAgIChoLT5hdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfTk9OSU5UUkEgJiYgc2wtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB8fAotICAgICAgICAgICAgKGgtPmF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05LRVkgJiYgaC0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfSURSX1NMSUNFICYmIGgtPnNlaV9yZWNvdmVyeV9mcmFtZV9jbnQgPCAwKSB8fAotICAgICAgICAgICAgaC0+YXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX0FMTCkgewotICAgICAgICAgICAgcmV0dXJuIFNMSUNFX1NLSVBFRDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHRvIG1ha2UgYSBmZXcgb2xkIGZ1bmN0aW9ucyBoYXBweSwgaXQncyB3cm9uZyB0aG91Z2gKLSAgICBpZiAoIWgtPnNldHVwX2ZpbmlzaGVkKQotICAgICAgICBoLT5waWN0X3R5cGUgPSBzbC0+c2xpY2VfdHlwZTsKLQotICAgIHBwc19pZCA9IGdldF91ZV9nb2xvbWIoJnNsLT5nYik7Ci0gICAgaWYgKHBwc19pZCA+PSBNQVhfUFBTX0NPVU5UKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicHBzX2lkICV1IG91dCBvZiByYW5nZVxuIiwgcHBzX2lkKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotICAgIGlmICghaC0+cHBzX2J1ZmZlcnNbcHBzX2lkXSkgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJub24tZXhpc3RpbmcgUFBTICV1IHJlZmVyZW5jZWRcbiIsCi0gICAgICAgICAgICAgICBwcHNfaWQpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0gICAgaWYgKGgtPmF1X3Bwc19pZCA+PSAwICYmIHBwc19pZCAhPSBoLT5hdV9wcHNfaWQpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiUFBTIGNoYW5nZSBmcm9tICVkIHRvICVkIGZvcmJpZGRlblxuIiwKLSAgICAgICAgICAgICAgIGgtPmF1X3Bwc19pZCwgcHBzX2lkKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotCi0gICAgcHBzID0gaC0+cHBzX2J1ZmZlcnNbcHBzX2lkXTsKLQotICAgIGlmICghaC0+c3BzX2J1ZmZlcnNbcHBzLT5zcHNfaWRdKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIm5vbi1leGlzdGluZyBTUFMgJXUgcmVmZXJlbmNlZFxuIiwKLSAgICAgICAgICAgICAgIGgtPnBwcy5zcHNfaWQpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9CisgICAgY29uc3QgU1BTICpzcHM7CisgICAgaW50IG5lZWRzX3JlaW5pdCA9IDAsIG11c3RfcmVpbml0LCByZXQ7CiAKICAgICBpZiAoZmlyc3Rfc2xpY2UpIHsKLSAgICAgICAgaC0+cHBzID0gKmgtPnBwc19idWZmZXJzW3Bwc19pZF07Ci0gICAgfSBlbHNlIGlmIChoLT5zZXR1cF9maW5pc2hlZCAmJiBoLT5kZXF1YW50X2NvZWZmX3BwcyAhPSBwcHNfaWQpIHsKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQUFMgY2hhbmdlZCBiZXR3ZWVuIHNsaWNlc1xuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmgtPnBzLnBwc19yZWYpOworICAgICAgICBoLT5wcy5wcHMgPSBOVUxMOworICAgICAgICBoLT5wcy5wcHNfcmVmID0gYXZfYnVmZmVyX3JlZihoLT5wcy5wcHNfbGlzdFtzbC0+cHBzX2lkXSk7CisgICAgICAgIGlmICghaC0+cHMucHBzX3JlZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGgtPnBzLnBwcyA9IChjb25zdCBQUFMqKWgtPnBzLnBwc19yZWYtPmRhdGE7CiAgICAgfQogCi0gICAgaWYgKHBwcy0+c3BzX2lkICE9IGgtPnNwcy5zcHNfaWQgfHwKLSAgICAgICAgcHBzLT5zcHNfaWQgIT0gaC0+Y3VycmVudF9zcHNfaWQgfHwKLSAgICAgICAgaC0+c3BzX2J1ZmZlcnNbcHBzLT5zcHNfaWRdLT5uZXcpIHsKKyAgICBpZiAoaC0+cHMuc3BzICE9IChjb25zdCBTUFMqKWgtPnBzLnNwc19saXN0W2gtPnBzLnBwcy0+c3BzX2lkXS0+ZGF0YSkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmgtPnBzLnNwc19yZWYpOworICAgICAgICBoLT5wcy5zcHMgPSBOVUxMOworICAgICAgICBoLT5wcy5zcHNfcmVmID0gYXZfYnVmZmVyX3JlZihoLT5wcy5zcHNfbGlzdFtoLT5wcy5wcHMtPnNwc19pZF0pOworICAgICAgICBpZiAoIWgtPnBzLnNwc19yZWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBoLT5wcy5zcHMgPSAoY29uc3QgU1BTKiloLT5wcy5zcHNfcmVmLT5kYXRhOwogCi0gICAgICAgIGlmICghZmlyc3Rfc2xpY2UpIHsKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlNQUyBjaGFuZ2VkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZyYW1lXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9Ci0KLSAgICAgICAgaC0+c3BzID0gKmgtPnNwc19idWZmZXJzW2gtPnBwcy5zcHNfaWRdOwotCi0gICAgICAgIGlmIChoLT5tYl93aWR0aCAgIT0gaC0+c3BzLm1iX3dpZHRoIHx8Ci0gICAgICAgICAgICBoLT5tYl9oZWlnaHQgIT0gaC0+c3BzLm1iX2hlaWdodCAqICgyIC0gaC0+c3BzLmZyYW1lX21ic19vbmx5X2ZsYWcpIHx8Ci0gICAgICAgICAgICBoLT5jdXJfYml0X2RlcHRoX2x1bWEgICAgIT0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hIHx8Ci0gICAgICAgICAgICBoLT5jdXJfY2hyb21hX2Zvcm1hdF9pZGMgIT0gaC0+c3BzLmNocm9tYV9mb3JtYXRfaWRjCisgICAgICAgIGlmIChoLT5tYl93aWR0aCAgIT0gaC0+cHMuc3BzLT5tYl93aWR0aCB8fAorICAgICAgICAgICAgaC0+bWJfaGVpZ2h0ICE9IGgtPnBzLnNwcy0+bWJfaGVpZ2h0IHx8CisgICAgICAgICAgICBoLT5jdXJfYml0X2RlcHRoX2x1bWEgICAgIT0gaC0+cHMuc3BzLT5iaXRfZGVwdGhfbHVtYSB8fAorICAgICAgICAgICAgaC0+Y3VyX2Nocm9tYV9mb3JtYXRfaWRjICE9IGgtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMKICAgICAgICAgKQogICAgICAgICAgICAgbmVlZHNfcmVpbml0ID0gMTsKIAotICAgICAgICBpZiAoaC0+Yml0X2RlcHRoX2x1bWEgICAgIT0gaC0+c3BzLmJpdF9kZXB0aF9sdW1hIHx8Ci0gICAgICAgICAgICBoLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMpCisgICAgICAgIGlmIChoLT5iaXRfZGVwdGhfbHVtYSAgICAhPSBoLT5wcy5zcHMtPmJpdF9kZXB0aF9sdW1hIHx8CisgICAgICAgICAgICBoLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSBoLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjKQogICAgICAgICAgICAgbmVlZHNfcmVpbml0ICAgICAgICAgPSAxOwotCi0gICAgICAgIGlmIChoLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfTE9XX0RFTEFZIHx8Ci0gICAgICAgICAgICAoaC0+c3BzLmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnICYmCi0gICAgICAgICAgICAgIWgtPnNwcy5udW1fcmVvcmRlcl9mcmFtZXMpKSB7Ci0gICAgICAgICAgICBpZiAoaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA+IDEgfHwgaC0+ZGVsYXllZF9waWNbMF0pCi0gICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkRlbGF5ZWQgZnJhbWVzIHNlZW4uICIKLSAgICAgICAgICAgICAgICAgICAgICAgIlJlZW5hYmxpbmcgbG93IGRlbGF5IHJlcXVpcmVzIGEgY29kZWMgZmx1c2guXG4iKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBoLT5sb3dfZGVsYXkgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMgPCAyKQotICAgICAgICAgICAgaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA9ICFoLT5sb3dfZGVsYXk7Ci0KICAgICB9CisgICAgc3BzID0gaC0+cHMuc3BzOwogCiAgICAgbXVzdF9yZWluaXQgPSAoaC0+Y29udGV4dF9pbml0aWFsaXplZCAmJgotICAgICAgICAgICAgICAgICAgICAoICAgMTYqaC0+c3BzLm1iX3dpZHRoICE9IGgtPmF2Y3R4LT5jb2RlZF93aWR0aAotICAgICAgICAgICAgICAgICAgICAgfHwgMTYqaC0+c3BzLm1iX2hlaWdodCAqICgyIC0gaC0+c3BzLmZyYW1lX21ic19vbmx5X2ZsYWcpICE9IGgtPmF2Y3R4LT5jb2RlZF9oZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgIHx8IGgtPmN1cl9iaXRfZGVwdGhfbHVtYSAgICAhPSBoLT5zcHMuYml0X2RlcHRoX2x1bWEKLSAgICAgICAgICAgICAgICAgICAgIHx8IGgtPmN1cl9jaHJvbWFfZm9ybWF0X2lkYyAhPSBoLT5zcHMuY2hyb21hX2Zvcm1hdF9pZGMKLSAgICAgICAgICAgICAgICAgICAgIHx8IGgtPm1iX3dpZHRoICAhPSBoLT5zcHMubWJfd2lkdGgKLSAgICAgICAgICAgICAgICAgICAgIHx8IGgtPm1iX2hlaWdodCAhPSBoLT5zcHMubWJfaGVpZ2h0ICogKDIgLSBoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZykKKyAgICAgICAgICAgICAgICAgICAgKCAgIDE2KnNwcy0+bWJfd2lkdGggIT0gaC0+YXZjdHgtPmNvZGVkX3dpZHRoCisgICAgICAgICAgICAgICAgICAgICB8fCAxNipzcHMtPm1iX2hlaWdodCAhPSBoLT5hdmN0eC0+Y29kZWRfaGVpZ2h0CisgICAgICAgICAgICAgICAgICAgICB8fCBoLT5jdXJfYml0X2RlcHRoX2x1bWEgICAgIT0gc3BzLT5iaXRfZGVwdGhfbHVtYQorICAgICAgICAgICAgICAgICAgICAgfHwgaC0+Y3VyX2Nocm9tYV9mb3JtYXRfaWRjICE9IHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMKKyAgICAgICAgICAgICAgICAgICAgIHx8IGgtPm1iX3dpZHRoICAhPSBzcHMtPm1iX3dpZHRoCisgICAgICAgICAgICAgICAgICAgICB8fCBoLT5tYl9oZWlnaHQgIT0gc3BzLT5tYl9oZWlnaHQKICAgICAgICAgICAgICAgICAgICAgKSk7CiAgICAgaWYgKGgtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORQogICAgICAgICB8fCAobm9uX2pfcGl4Zm10KGgtPmF2Y3R4LT5waXhfZm10KSAhPSBub25fal9waXhmbXQoZ2V0X3BpeGVsX2Zvcm1hdChoLCAwKSkpKQogICAgICAgICBtdXN0X3JlaW5pdCA9IDE7CiAKLSAgICBpZiAoZmlyc3Rfc2xpY2UgJiYgYXZfY21wX3EoaC0+c3BzLnNhciwgaC0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8pKQorICAgIGlmIChmaXJzdF9zbGljZSAmJiBhdl9jbXBfcShzcHMtPnNhciwgaC0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8pKQogICAgICAgICBtdXN0X3JlaW5pdCA9IDE7CiAKICAgICBpZiAoIWgtPnNldHVwX2ZpbmlzaGVkKSB7Ci0gICAgICAgIGgtPmF2Y3R4LT5wcm9maWxlID0gZmZfaDI2NF9nZXRfcHJvZmlsZSgmaC0+c3BzKTsKLSAgICAgICAgaC0+YXZjdHgtPmxldmVsICAgPSBoLT5zcHMubGV2ZWxfaWRjOwotICAgICAgICBoLT5hdmN0eC0+cmVmcyAgICA9IGgtPnNwcy5yZWZfZnJhbWVfY291bnQ7CisgICAgICAgIGgtPmF2Y3R4LT5wcm9maWxlID0gZmZfaDI2NF9nZXRfcHJvZmlsZShzcHMpOworICAgICAgICBoLT5hdmN0eC0+bGV2ZWwgICA9IHNwcy0+bGV2ZWxfaWRjOworICAgICAgICBoLT5hdmN0eC0+cmVmcyAgICA9IHNwcy0+cmVmX2ZyYW1lX2NvdW50OwogCi0gICAgICAgIGgtPm1iX3dpZHRoICA9IGgtPnNwcy5tYl93aWR0aDsKLSAgICAgICAgaC0+bWJfaGVpZ2h0ID0gaC0+c3BzLm1iX2hlaWdodCAqICgyIC0gaC0+c3BzLmZyYW1lX21ic19vbmx5X2ZsYWcpOworICAgICAgICBoLT5tYl93aWR0aCAgPSBzcHMtPm1iX3dpZHRoOworICAgICAgICBoLT5tYl9oZWlnaHQgPSBzcHMtPm1iX2hlaWdodDsKICAgICAgICAgaC0+bWJfbnVtICAgID0gaC0+bWJfd2lkdGggKiBoLT5tYl9oZWlnaHQ7CiAgICAgICAgIGgtPm1iX3N0cmlkZSA9IGgtPm1iX3dpZHRoICsgMTsKIAogICAgICAgICBoLT5iX3N0cmlkZSA9IGgtPm1iX3dpZHRoICogNDsKIAotICAgICAgICBoLT5jaHJvbWFfeV9zaGlmdCA9IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA8PSAxOyAvLyA0MDAgdXNlcyB5dXY0MjBwCisgICAgICAgIGgtPmNocm9tYV95X3NoaWZ0ID0gc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA8PSAxOyAvLyA0MDAgdXNlcyB5dXY0MjBwCiAKICAgICAgICAgaC0+d2lkdGggID0gMTYgKiBoLT5tYl93aWR0aDsKICAgICAgICAgaC0+aGVpZ2h0ID0gMTYgKiBoLT5tYl9oZWlnaHQ7CkBAIC0xMzYxLDIxICsxMDc0LDIxIEBACiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICBpZiAoaC0+c3BzLnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZykgewotICAgICAgICAgICAgaC0+YXZjdHgtPmNvbG9yX3JhbmdlID0gaC0+c3BzLmZ1bGxfcmFuZ2U+MCA/IEFWQ09MX1JBTkdFX0pQRUcKKyAgICAgICAgaWYgKHNwcy0+dmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICBoLT5hdmN0eC0+Y29sb3JfcmFuZ2UgPSBzcHMtPmZ1bGxfcmFuZ2UgPiAwID8gQVZDT0xfUkFOR0VfSlBFRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWQ09MX1JBTkdFX01QRUc7Ci0gICAgICAgICAgICBpZiAoaC0+c3BzLmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBpZiAoaC0+YXZjdHgtPmNvbG9yc3BhY2UgIT0gaC0+c3BzLmNvbG9yc3BhY2UpCisgICAgICAgICAgICBpZiAoc3BzLT5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnKSB7CisgICAgICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5jb2xvcnNwYWNlICE9IHNwcy0+Y29sb3JzcGFjZSkKICAgICAgICAgICAgICAgICAgICAgbmVlZHNfcmVpbml0ID0gMTsKLSAgICAgICAgICAgICAgICBoLT5hdmN0eC0+Y29sb3JfcHJpbWFyaWVzID0gaC0+c3BzLmNvbG9yX3ByaW1hcmllczsKLSAgICAgICAgICAgICAgICBoLT5hdmN0eC0+Y29sb3JfdHJjICAgICAgID0gaC0+c3BzLmNvbG9yX3RyYzsKLSAgICAgICAgICAgICAgICBoLT5hdmN0eC0+Y29sb3JzcGFjZSAgICAgID0gaC0+c3BzLmNvbG9yc3BhY2U7CisgICAgICAgICAgICAgICAgaC0+YXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IHNwcy0+Y29sb3JfcHJpbWFyaWVzOworICAgICAgICAgICAgICAgIGgtPmF2Y3R4LT5jb2xvcl90cmMgICAgICAgPSBzcHMtPmNvbG9yX3RyYzsKKyAgICAgICAgICAgICAgICBoLT5hdmN0eC0+Y29sb3JzcGFjZSAgICAgID0gc3BzLT5jb2xvcnNwYWNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGgtPmNvbnRleHRfaW5pdGlhbGl6ZWQgJiYKLSAgICAgICAgKG11c3RfcmVpbml0IHx8IG5lZWRzX3JlaW5pdCkpIHsKKyAgICBpZiAoIWgtPmNvbnRleHRfaW5pdGlhbGl6ZWQgfHwgbXVzdF9yZWluaXQgfHwgbmVlZHNfcmVpbml0KSB7CisgICAgICAgIGludCBmbHVzaF9jaGFuZ2VzID0gaC0+Y29udGV4dF9pbml0aWFsaXplZDsKICAgICAgICAgaC0+Y29udGV4dF9pbml0aWFsaXplZCA9IDA7CiAgICAgICAgIGlmIChzbCAhPSBoLT5zbGljZV9jdHgpIHsKICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLApAQCAtMTM4OSwxMyArMTEwMiwxNCBAQAogCiAgICAgICAgIGF2X2Fzc2VydDEoZmlyc3Rfc2xpY2UpOwogCi0gICAgICAgIGZmX2gyNjRfZmx1c2hfY2hhbmdlKGgpOworICAgICAgICBpZiAoZmx1c2hfY2hhbmdlcykKKyAgICAgICAgICAgIGZmX2gyNjRfZmx1c2hfY2hhbmdlKGgpOwogCiAgICAgICAgIGlmICgocmV0ID0gZ2V0X3BpeGVsX2Zvcm1hdChoLCAxKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgaC0+YXZjdHgtPnBpeF9mbXQgPSByZXQ7CiAKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIlJlaW5pdCBjb250ZXh0IHRvICVkeCVkLCAiCisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJSZWluaXQgY29udGV4dCB0byAlZHglZCwgIgogICAgICAgICAgICAgICAgInBpeF9mbXQ6ICVzXG4iLCBoLT53aWR0aCwgaC0+aGVpZ2h0LCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGgtPmF2Y3R4LT5waXhfZm10KSk7CiAKICAgICAgICAgaWYgKChyZXQgPSBoMjY0X3NsaWNlX2hlYWRlcl9pbml0KGgpKSA8IDApIHsKQEAgLTE0MDQsMzgxICsxMTE4LDcxMSBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIWgtPmNvbnRleHRfaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgaWYgKHNsICE9IGgtPnNsaWNlX2N0eCkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIkNhbm5vdCAocmUtKWluaXRpYWxpemUgY29udGV4dCBkdXJpbmcgcGFyYWxsZWwgZGVjb2RpbmcuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgyNjRfZXhwb3J0X2ZyYW1lX3Byb3BzKEgyNjRDb250ZXh0ICpoKQoreworICAgIGNvbnN0IFNQUyAqc3BzID0gaC0+cHMuc3BzOworICAgIEgyNjRQaWN0dXJlICpjdXIgPSBoLT5jdXJfcGljX3B0cjsKKworICAgIGN1ci0+Zi0+aW50ZXJsYWNlZF9mcmFtZSA9IDA7CisgICAgY3VyLT5mLT5yZXBlYXRfcGljdCAgICAgID0gMDsKKworICAgIC8qIFNpZ25hbCBpbnRlcmxhY2luZyBpbmZvcm1hdGlvbiBleHRlcm5hbGx5LiAqLworICAgIC8qIFByaW9yaXRpemUgcGljdHVyZSB0aW1pbmcgU0VJIGluZm9ybWF0aW9uIG92ZXIgdXNlZAorICAgICAqIGRlY29kaW5nIHByb2Nlc3MgaWYgaXQgZXhpc3RzLiAqLworCisgICAgaWYgKHNwcy0+cGljX3N0cnVjdF9wcmVzZW50X2ZsYWcgJiYgaC0+c2VpLnBpY3R1cmVfdGltaW5nLnByZXNlbnQpIHsKKyAgICAgICAgSDI2NFNFSVBpY3R1cmVUaW1pbmcgKnB0ID0gJmgtPnNlaS5waWN0dXJlX3RpbWluZzsKKyAgICAgICAgc3dpdGNoIChwdC0+cGljX3N0cnVjdCkgeworICAgICAgICBjYXNlIEgyNjRfU0VJX1BJQ19TVFJVQ1RfRlJBTUU6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9QSUNfU1RSVUNUX1RPUF9GSUVMRDoKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9QSUNfU1RSVUNUX0JPVFRPTV9GSUVMRDoKKyAgICAgICAgICAgIGN1ci0+Zi0+aW50ZXJsYWNlZF9mcmFtZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT006CisgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QOgorICAgICAgICAgICAgaWYgKEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCkpCisgICAgICAgICAgICAgICAgY3VyLT5mLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZmxhZyBzb2Z0IHRlbGVjaW5lIHByb2dyZXNzaXZlCisgICAgICAgICAgICAgICAgY3VyLT5mLT5pbnRlcmxhY2VkX2ZyYW1lID0gaC0+cHJldl9pbnRlcmxhY2VkX2ZyYW1lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NX1RPUDoKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9QSUNfU1RSVUNUX0JPVFRPTV9UT1BfQk9UVE9NOgorICAgICAgICAgICAgLyogU2lnbmFsIHRoZSBwb3NzaWJpbGl0eSBvZiB0ZWxlY2luZWQgZmlsbSBleHRlcm5hbGx5CisgICAgICAgICAgICAgKiAocGljX3N0cnVjdCA1LDYpLiBGcm9tIHRoZXNlIGhpbnRzLCBsZXQgdGhlIGFwcGxpY2F0aW9ucworICAgICAgICAgICAgICogZGVjaWRlIGlmIHRoZXkgYXBwbHkgZGVpbnRlcmxhY2luZy4gKi8KKyAgICAgICAgICAgIGN1ci0+Zi0+cmVwZWF0X3BpY3QgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9GUkFNRV9ET1VCTElORzoKKyAgICAgICAgICAgIGN1ci0+Zi0+cmVwZWF0X3BpY3QgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfUElDX1NUUlVDVF9GUkFNRV9UUklQTElORzoKKyAgICAgICAgICAgIGN1ci0+Zi0+cmVwZWF0X3BpY3QgPSA0OworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKHJldCA9IGdldF9waXhlbF9mb3JtYXQoaCwgMSkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGgtPmF2Y3R4LT5waXhfZm10ID0gcmV0OwotCi0gICAgICAgIGlmICgocmV0ID0gaDI2NF9zbGljZV9oZWFkZXJfaW5pdChoKSkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiaDI2NF9zbGljZV9oZWFkZXJfaW5pdCgpIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFoLT5jdXJyZW50X3NsaWNlICYmIGgtPmRlcXVhbnRfY29lZmZfcHBzICE9IHBwc19pZCkgewotICAgICAgICBoLT5kZXF1YW50X2NvZWZmX3BwcyA9IHBwc19pZDsKLSAgICAgICAgZmZfaDI2NF9pbml0X2RlcXVhbnRfdGFibGVzKGgpOwotICAgIH0KLQotICAgIGZyYW1lX251bSA9IGdldF9iaXRzKCZzbC0+Z2IsIGgtPnNwcy5sb2cyX21heF9mcmFtZV9udW0pOwotICAgIGlmICghZmlyc3Rfc2xpY2UpIHsKLSAgICAgICAgaWYgKGgtPmZyYW1lX251bSAhPSBmcmFtZV9udW0pIHsKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgbnVtIGNoYW5nZSBmcm9tICVkIHRvICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGgtPmZyYW1lX251bSwgZnJhbWVfbnVtKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFoLT5zZXR1cF9maW5pc2hlZCkKLSAgICAgICAgaC0+ZnJhbWVfbnVtID0gZnJhbWVfbnVtOwotCi0gICAgc2wtPm1iX21iYWZmICAgICAgID0gMDsKLSAgICBtYl9hZmZfZnJhbWUgICAgICAgPSAwOwotICAgIGxhc3RfbWJfYWZmX2ZyYW1lICA9IGgtPm1iX2FmZl9mcmFtZTsKLSAgICBsYXN0X3BpY19zdHJ1Y3R1cmUgPSBoLT5waWN0dXJlX3N0cnVjdHVyZTsKLSAgICBsYXN0X3BpY19kcm9wcGFibGUgPSBoLT5kcm9wcGFibGU7Ci0KLSAgICBkcm9wcGFibGUgPSBoLT5uYWxfcmVmX2lkYyA9PSAwOwotICAgIGlmIChoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZykgewotICAgICAgICBwaWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7CisgICAgICAgIGlmICgocHQtPmN0X3R5cGUgJiAzKSAmJgorICAgICAgICAgICAgcHQtPnBpY19zdHJ1Y3QgPD0gSDI2NF9TRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QKQorICAgICAgICAgICAgY3VyLT5mLT5pbnRlcmxhY2VkX2ZyYW1lID0gKHB0LT5jdF90eXBlICYgKDEgPDwgMSkpICE9IDA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAmJiBzbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7Ci0gICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoaXMgc3RyZWFtIHdhcyBnZW5lcmF0ZWQgYnkgYSBicm9rZW4gZW5jb2RlciwgaW52YWxpZCA4eDggaW5mZXJlbmNlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBmaWVsZF9waWNfZmxhZyA9IGdldF9iaXRzMSgmc2wtPmdiKTsKKyAgICAgICAgLyogRGVyaXZlIGludGVybGFjaW5nIGZsYWcgZnJvbSB1c2VkIGRlY29kaW5nIHByb2Nlc3MuICovCisgICAgICAgIGN1ci0+Zi0+aW50ZXJsYWNlZF9mcmFtZSA9IEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCk7CisgICAgfQorICAgIGgtPnByZXZfaW50ZXJsYWNlZF9mcmFtZSA9IGN1ci0+Zi0+aW50ZXJsYWNlZF9mcmFtZTsKIAotICAgICAgICBpZiAoZmllbGRfcGljX2ZsYWcpIHsKLSAgICAgICAgICAgIGJvdHRvbV9maWVsZF9mbGFnID0gZ2V0X2JpdHMxKCZzbC0+Z2IpOwotICAgICAgICAgICAgcGljdHVyZV9zdHJ1Y3R1cmUgPSBQSUNUX1RPUF9GSUVMRCArIGJvdHRvbV9maWVsZF9mbGFnOworICAgIGlmIChjdXItPmZpZWxkX3BvY1swXSAhPSBjdXItPmZpZWxkX3BvY1sxXSkgeworICAgICAgICAvKiBEZXJpdmUgdG9wX2ZpZWxkX2ZpcnN0IGZyb20gZmllbGQgcG9jcy4gKi8KKyAgICAgICAgY3VyLT5mLT50b3BfZmllbGRfZmlyc3QgPSBjdXItPmZpZWxkX3BvY1swXSA8IGN1ci0+ZmllbGRfcG9jWzFdOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzcHMtPnBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnICYmIGgtPnNlaS5waWN0dXJlX3RpbWluZy5wcmVzZW50KSB7CisgICAgICAgICAgICAvKiBVc2UgcGljdHVyZSB0aW1pbmcgU0VJIGluZm9ybWF0aW9uLiBFdmVuIGlmIGl0IGlzIGEKKyAgICAgICAgICAgICAqIGluZm9ybWF0aW9uIG9mIGEgcGFzdCBmcmFtZSwgYmV0dGVyIHRoYW4gbm90aGluZy4gKi8KKyAgICAgICAgICAgIGlmIChoLT5zZWkucGljdHVyZV90aW1pbmcucGljX3N0cnVjdCA9PSBIMjY0X1NFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT00gfHwKKyAgICAgICAgICAgICAgICBoLT5zZWkucGljdHVyZV90aW1pbmcucGljX3N0cnVjdCA9PSBIMjY0X1NFSV9QSUNfU1RSVUNUX1RPUF9CT1RUT01fVE9QKQorICAgICAgICAgICAgICAgIGN1ci0+Zi0+dG9wX2ZpZWxkX2ZpcnN0ID0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjdXItPmYtPnRvcF9maWVsZF9maXJzdCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoY3VyLT5mLT5pbnRlcmxhY2VkX2ZyYW1lKSB7CisgICAgICAgICAgICAvKiBEZWZhdWx0IHRvIHRvcCBmaWVsZCBmaXJzdCB3aGVuIHBpY19zdHJ1Y3RfcHJlc2VudF9mbGFnCisgICAgICAgICAgICAgKiBpcyBub3Qgc2V0IGJ1dCBpbnRlcmxhY2VkIGZyYW1lIGRldGVjdGVkICovCisgICAgICAgICAgICBjdXItPmYtPnRvcF9maWVsZF9maXJzdCA9IDE7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwaWN0dXJlX3N0cnVjdHVyZSA9IFBJQ1RfRlJBTUU7Ci0gICAgICAgICAgICBtYl9hZmZfZnJhbWUgICAgICA9IGgtPnNwcy5tYl9hZmY7CisgICAgICAgICAgICAvKiBNb3N0IGxpa2VseSBwcm9ncmVzc2l2ZSAqLworICAgICAgICAgICAgY3VyLT5mLT50b3BfZmllbGRfZmlyc3QgPSAwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGgtPmN1cnJlbnRfc2xpY2UpIHsKLSAgICAgICAgaWYgKGxhc3RfcGljX3N0cnVjdHVyZSAhPSBwaWN0dXJlX3N0cnVjdHVyZSB8fAotICAgICAgICAgICAgbGFzdF9waWNfZHJvcHBhYmxlICE9IGRyb3BwYWJsZSB8fAotICAgICAgICAgICAgbGFzdF9tYl9hZmZfZnJhbWUgICE9IG1iX2FmZl9mcmFtZSkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIkNoYW5naW5nIGZpZWxkIG1vZGUgKCVkIC0+ICVkKSBiZXR3ZWVuIHNsaWNlcyBpcyBub3QgYWxsb3dlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBsYXN0X3BpY19zdHJ1Y3R1cmUsIGgtPnBpY3R1cmVfc3RydWN0dXJlKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9IGVsc2UgaWYgKCFoLT5jdXJfcGljX3B0cikgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgInVuc2V0IGN1cl9waWNfcHRyIG9uIHNsaWNlICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGgtPmN1cnJlbnRfc2xpY2UgKyAxKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChoLT5zZWkuZnJhbWVfcGFja2luZy5wcmVzZW50ICYmCisgICAgICAgIGgtPnNlaS5mcmFtZV9wYWNraW5nLmFycmFuZ2VtZW50X3R5cGUgPD0gNiAmJgorICAgICAgICBoLT5zZWkuZnJhbWVfcGFja2luZy5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPiAwICYmCisgICAgICAgIGgtPnNlaS5mcmFtZV9wYWNraW5nLmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA8IDMpIHsKKyAgICAgICAgSDI2NFNFSUZyYW1lUGFja2luZyAqZnAgPSAmaC0+c2VpLmZyYW1lX3BhY2tpbmc7CisgICAgICAgIEFWU3RlcmVvM0QgKnN0ZXJlbyA9IGF2X3N0ZXJlbzNkX2NyZWF0ZV9zaWRlX2RhdGEoY3VyLT5mKTsKKyAgICAgICAgaWYgKHN0ZXJlbykgeworICAgICAgICBzd2l0Y2ggKGZwLT5hcnJhbmdlbWVudF90eXBlKSB7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfRlBBX1RZUEVfQ0hFQ0tFUkJPQVJEOgorICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfQ0hFQ0tFUkJPQVJEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfRlBBX1RZUEVfSU5URVJMRUFWRV9DT0xVTU46CisgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9DT0xVTU5TOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfRlBBX1RZUEVfSU5URVJMRUFWRV9ST1c6CisgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9MSU5FUzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEgyNjRfU0VJX0ZQQV9UWVBFX1NJREVfQllfU0lERToKKyAgICAgICAgICAgIGlmIChmcC0+cXVpbmN1bnhfc2FtcGxpbmdfZmxhZykKKyAgICAgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9TSURFQllTSURFX1FVSU5DVU5YOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX1NJREVCWVNJREU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9GUEFfVFlQRV9UT1BfQk9UVE9NOgorICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfVE9QQk9UVE9NOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSDI2NF9TRUlfRlBBX1RZUEVfSU5URVJMRUFWRV9URU1QT1JBTDoKKyAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0ZSQU1FU0VRVUVOQ0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjY0X1NFSV9GUEFfVFlQRV8yRDoKKyAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEXzJEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnAtPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSA9PSAyKQorICAgICAgICAgICAgc3RlcmVvLT5mbGFncyA9IEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUOworCisgICAgICAgIGlmIChmcC0+YXJyYW5nZW1lbnRfdHlwZSA9PSBIMjY0X1NFSV9GUEFfVFlQRV9JTlRFUkxFQVZFX1RFTVBPUkFMKSB7CisgICAgICAgICAgICBpZiAoZnAtPmN1cnJlbnRfZnJhbWVfaXNfZnJhbWUwX2ZsYWcpCisgICAgICAgICAgICAgICAgc3RlcmVvLT52aWV3ID0gQVZfU1RFUkVPM0RfVklFV19MRUZUOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0ZXJlby0+dmlldyA9IEFWX1NURVJFTzNEX1ZJRVdfUklHSFQ7CisgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghaC0+c2V0dXBfZmluaXNoZWQpIHsKLSAgICAgICAgaC0+ZHJvcHBhYmxlICAgICAgICAgPSBkcm9wcGFibGU7Ci0gICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID0gcGljdHVyZV9zdHJ1Y3R1cmU7Ci0gICAgICAgIGgtPm1iX2FmZl9mcmFtZSAgICAgID0gbWJfYWZmX2ZyYW1lOworICAgIGlmIChoLT5zZWkuZGlzcGxheV9vcmllbnRhdGlvbi5wcmVzZW50ICYmCisgICAgICAgIChoLT5zZWkuZGlzcGxheV9vcmllbnRhdGlvbi5hbnRpY2xvY2t3aXNlX3JvdGF0aW9uIHx8CisgICAgICAgICBoLT5zZWkuZGlzcGxheV9vcmllbnRhdGlvbi5oZmxpcCB8fAorICAgICAgICAgaC0+c2VpLmRpc3BsYXlfb3JpZW50YXRpb24udmZsaXApKSB7CisgICAgICAgIEgyNjRTRUlEaXNwbGF5T3JpZW50YXRpb24gKm8gPSAmaC0+c2VpLmRpc3BsYXlfb3JpZW50YXRpb247CisgICAgICAgIGRvdWJsZSBhbmdsZSA9IG8tPmFudGljbG9ja3dpc2Vfcm90YXRpb24gKiAzNjAgLyAoZG91YmxlKSAoMSA8PCAxNik7CisgICAgICAgIEFWRnJhbWVTaWRlRGF0YSAqcm90YXRpb24gPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKGN1ci0+ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRlJBTUVfREFUQV9ESVNQTEFZTUFUUklYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MzJfdCkgKiA5KTsKKyAgICAgICAgaWYgKHJvdGF0aW9uKSB7CisgICAgICAgICAgICBhdl9kaXNwbGF5X3JvdGF0aW9uX3NldCgoaW50MzJfdCAqKXJvdGF0aW9uLT5kYXRhLCBhbmdsZSk7CisgICAgICAgICAgICBhdl9kaXNwbGF5X21hdHJpeF9mbGlwKChpbnQzMl90ICopcm90YXRpb24tPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8tPmhmbGlwLCBvLT52ZmxpcCk7CisgICAgICAgIH0KICAgICB9Ci0gICAgc2wtPm1iX2ZpZWxkX2RlY29kaW5nX2ZsYWcgPSBwaWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FOwogCi0gICAgaWYgKGgtPmN1cnJlbnRfc2xpY2UgPT0gMCkgewotICAgICAgICAvKiBTaG9ydGVuIGZyYW1lIG51bSBnYXBzIHNvIHdlIGRvbid0IGhhdmUgdG8gYWxsb2NhdGUgcmVmZXJlbmNlCi0gICAgICAgICAqIGZyYW1lcyBqdXN0IHRvIHRocm93IHRoZW0gYXdheSAqLwotICAgICAgICBpZiAoaC0+ZnJhbWVfbnVtICE9IGgtPnByZXZfZnJhbWVfbnVtKSB7Ci0gICAgICAgICAgICBpbnQgdW53cmFwX3ByZXZfZnJhbWVfbnVtID0gaC0+cHJldl9mcmFtZV9udW07Ci0gICAgICAgICAgICBpbnQgbWF4X2ZyYW1lX251bSAgICAgICAgID0gMSA8PCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtOworICAgIGlmIChoLT5zZWkuYWZkLnByZXNlbnQpIHsKKyAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoY3VyLT5mLCBBVl9GUkFNRV9EQVRBX0FGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpKTsKIAotICAgICAgICAgICAgaWYgKHVud3JhcF9wcmV2X2ZyYW1lX251bSA+IGgtPmZyYW1lX251bSkKLSAgICAgICAgICAgICAgICB1bndyYXBfcHJldl9mcmFtZV9udW0gLT0gbWF4X2ZyYW1lX251bTsKKyAgICAgICAgaWYgKHNkKSB7CisgICAgICAgICAgICAqc2QtPmRhdGEgPSBoLT5zZWkuYWZkLmFjdGl2ZV9mb3JtYXRfZGVzY3JpcHRpb247CisgICAgICAgICAgICBoLT5zZWkuYWZkLnByZXNlbnQgPSAwOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgICAgICBpZiAoKGgtPmZyYW1lX251bSAtIHVud3JhcF9wcmV2X2ZyYW1lX251bSkgPiBoLT5zcHMucmVmX2ZyYW1lX2NvdW50KSB7Ci0gICAgICAgICAgICAgICAgdW53cmFwX3ByZXZfZnJhbWVfbnVtID0gKGgtPmZyYW1lX251bSAtIGgtPnNwcy5yZWZfZnJhbWVfY291bnQpIC0gMTsKLSAgICAgICAgICAgICAgICBpZiAodW53cmFwX3ByZXZfZnJhbWVfbnVtIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgdW53cmFwX3ByZXZfZnJhbWVfbnVtICs9IG1heF9mcmFtZV9udW07CisgICAgaWYgKGgtPnNlaS5hNTNfY2FwdGlvbi5hNTNfY2FwdGlvbikgeworICAgICAgICBIMjY0U0VJQTUzQ2FwdGlvbiAqYTUzID0gJmgtPnNlaS5hNTNfY2FwdGlvbjsKKyAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoY3VyLT5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX0E1M19DQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTUzLT5hNTNfY2FwdGlvbl9zaXplKTsKKyAgICAgICAgaWYgKHNkKQorICAgICAgICAgICAgbWVtY3B5KHNkLT5kYXRhLCBhNTMtPmE1M19jYXB0aW9uLCBhNTMtPmE1M19jYXB0aW9uX3NpemUpOworICAgICAgICBhdl9mcmVlcCgmYTUzLT5hNTNfY2FwdGlvbik7CisgICAgICAgIGE1My0+YTUzX2NhcHRpb25fc2l6ZSA9IDA7CisgICAgICAgIGgtPmF2Y3R4LT5wcm9wZXJ0aWVzIHw9IEZGX0NPREVDX1BST1BFUlRZX0NMT1NFRF9DQVBUSU9OUzsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bSA9IHVud3JhcF9wcmV2X2ZyYW1lX251bTsKKyAgICBpZiAoaC0+c2VpLmFsdGVybmF0aXZlX3RyYW5zZmVyLnByZXNlbnQgJiYKKyAgICAgICAgYXZfY29sb3JfdHJhbnNmZXJfbmFtZShoLT5zZWkuYWx0ZXJuYXRpdmVfdHJhbnNmZXIucHJlZmVycmVkX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljcykgJiYKKyAgICAgICAgaC0+c2VpLmFsdGVybmF0aXZlX3RyYW5zZmVyLnByZWZlcnJlZF90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgIT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIGgtPmF2Y3R4LT5jb2xvcl90cmMgPSBjdXItPmYtPmNvbG9yX3RyYyA9IGgtPnNlaS5hbHRlcm5hdGl2ZV90cmFuc2Zlci5wcmVmZXJyZWRfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgyNjRfc2VsZWN0X291dHB1dF9mcmFtZShIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBjb25zdCBTUFMgKnNwcyA9IGgtPnBzLnNwczsKKyAgICBIMjY0UGljdHVyZSAqb3V0ID0gaC0+Y3VyX3BpY19wdHI7CisgICAgSDI2NFBpY3R1cmUgKmN1ciA9IGgtPmN1cl9waWNfcHRyOworICAgIGludCBpLCBwaWNzLCBvdXRfb2Zfb3JkZXIsIG91dF9pZHg7CisKKyAgICBjdXItPm1tY29fcmVzZXQgPSBoLT5tbWNvX3Jlc2V0OworICAgIGgtPm1tY29fcmVzZXQgPSAwOworCisgICAgaWYgKHNwcy0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgfHwKKyAgICAgICAgaC0+YXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+PSBGRl9DT01QTElBTkNFX1NUUklDVCkgeworICAgICAgICBoLT5hdmN0eC0+aGFzX2JfZnJhbWVzID0gRkZNQVgoaC0+YXZjdHgtPmhhc19iX2ZyYW1lcywgc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IDE7IGkrKykgeworICAgICAgICBpZihpID09IE1BWF9ERUxBWUVEX1BJQ19DT1VOVCB8fCBjdXItPnBvYyA8IGgtPmxhc3RfcG9jc1tpXSl7CisgICAgICAgICAgICBpZihpKQorICAgICAgICAgICAgICAgIGgtPmxhc3RfcG9jc1tpLTFdID0gY3VyLT5wb2M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmKGkpIHsKKyAgICAgICAgICAgIGgtPmxhc3RfcG9jc1tpLTFdPSBoLT5sYXN0X3BvY3NbaV07CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0X29mX29yZGVyID0gTUFYX0RFTEFZRURfUElDX0NPVU5UIC0gaTsKKyAgICBpZiggICBjdXItPmYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQgorICAgICAgIHx8IChoLT5sYXN0X3BvY3NbTUFYX0RFTEFZRURfUElDX0NPVU5ULTJdID4gSU5UX01JTiAmJiBoLT5sYXN0X3BvY3NbTUFYX0RFTEFZRURfUElDX0NPVU5ULTFdIC0gKGludDY0X3QpaC0+bGFzdF9wb2NzW01BWF9ERUxBWUVEX1BJQ19DT1VOVC0yXSA+IDIpKQorICAgICAgICBvdXRfb2Zfb3JkZXIgPSBGRk1BWChvdXRfb2Zfb3JkZXIsIDEpOworICAgIGlmIChvdXRfb2Zfb3JkZXIgPT0gTUFYX0RFTEFZRURfUElDX0NPVU5UKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJJbnZhbGlkIFBPQyAlZDwlZFxuIiwgY3VyLT5wb2MsIGgtPmxhc3RfcG9jc1swXSk7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfREVMQVlFRF9QSUNfQ09VTlQ7IGkrKykKKyAgICAgICAgICAgIGgtPmxhc3RfcG9jc1tpXSA9IElOVF9NSU47CisgICAgICAgIGgtPmxhc3RfcG9jc1swXSA9IGN1ci0+cG9jOworICAgICAgICBjdXItPm1tY29fcmVzZXQgPSAxOworICAgIH0gZWxzZSBpZihoLT5hdmN0eC0+aGFzX2JfZnJhbWVzIDwgb3V0X29mX29yZGVyICYmICFzcHMtPmJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnKXsKKyAgICAgICAgaW50IGxvZ2xldmVsID0gaC0+YXZjdHgtPmZyYW1lX251bWJlciA+IDEgPyBBVl9MT0dfV0FSTklORyA6IEFWX0xPR19WRVJCT1NFOworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIGxvZ2xldmVsLCAiSW5jcmVhc2luZyByZW9yZGVyIGJ1ZmZlciB0byAlZFxuIiwgb3V0X29mX29yZGVyKTsKKyAgICAgICAgaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA9IG91dF9vZl9vcmRlcjsKKyAgICB9CisKKyAgICBwaWNzID0gMDsKKyAgICB3aGlsZSAoaC0+ZGVsYXllZF9waWNbcGljc10pCisgICAgICAgIHBpY3MrKzsKKworICAgIGF2X2Fzc2VydDAocGljcyA8PSBNQVhfREVMQVlFRF9QSUNfQ09VTlQpOworCisgICAgaC0+ZGVsYXllZF9waWNbcGljcysrXSA9IGN1cjsKKyAgICBpZiAoY3VyLT5yZWZlcmVuY2UgPT0gMCkKKyAgICAgICAgY3VyLT5yZWZlcmVuY2UgPSBERUxBWUVEX1BJQ19SRUY7CisKKyAgICBvdXQgICAgID0gaC0+ZGVsYXllZF9waWNbMF07CisgICAgb3V0X2lkeCA9IDA7CisgICAgZm9yIChpID0gMTsgaC0+ZGVsYXllZF9waWNbaV0gJiYKKyAgICAgICAgICAgICAgICAhaC0+ZGVsYXllZF9waWNbaV0tPmYtPmtleV9mcmFtZSAmJgorICAgICAgICAgICAgICAgICFoLT5kZWxheWVkX3BpY1tpXS0+bW1jb19yZXNldDsKKyAgICAgICAgIGkrKykKKyAgICAgICAgaWYgKGgtPmRlbGF5ZWRfcGljW2ldLT5wb2MgPCBvdXQtPnBvYykgeworICAgICAgICAgICAgb3V0ICAgICA9IGgtPmRlbGF5ZWRfcGljW2ldOworICAgICAgICAgICAgb3V0X2lkeCA9IGk7CisgICAgICAgIH0KKyAgICBpZiAoaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA9PSAwICYmCisgICAgICAgIChoLT5kZWxheWVkX3BpY1swXS0+Zi0+a2V5X2ZyYW1lIHx8IGgtPmRlbGF5ZWRfcGljWzBdLT5tbWNvX3Jlc2V0KSkKKyAgICAgICAgaC0+bmV4dF9vdXRwdXRlZF9wb2MgPSBJTlRfTUlOOworICAgIG91dF9vZl9vcmRlciA9IG91dC0+cG9jIDwgaC0+bmV4dF9vdXRwdXRlZF9wb2M7CisKKyAgICBpZiAob3V0X29mX29yZGVyIHx8IHBpY3MgPiBoLT5hdmN0eC0+aGFzX2JfZnJhbWVzKSB7CisgICAgICAgIG91dC0+cmVmZXJlbmNlICY9IH5ERUxBWUVEX1BJQ19SRUY7CisgICAgICAgIGZvciAoaSA9IG91dF9pZHg7IGgtPmRlbGF5ZWRfcGljW2ldOyBpKyspCisgICAgICAgICAgICBoLT5kZWxheWVkX3BpY1tpXSA9IGgtPmRlbGF5ZWRfcGljW2kgKyAxXTsKKyAgICB9CisgICAgaWYgKCFvdXRfb2Zfb3JkZXIgJiYgcGljcyA+IGgtPmF2Y3R4LT5oYXNfYl9mcmFtZXMpIHsKKyAgICAgICAgaC0+bmV4dF9vdXRwdXRfcGljID0gb3V0OworICAgICAgICBpZiAob3V0X2lkeCA9PSAwICYmIGgtPmRlbGF5ZWRfcGljWzBdICYmIChoLT5kZWxheWVkX3BpY1swXS0+Zi0+a2V5X2ZyYW1lIHx8IGgtPmRlbGF5ZWRfcGljWzBdLT5tbWNvX3Jlc2V0KSkgeworICAgICAgICAgICAgaC0+bmV4dF9vdXRwdXRlZF9wb2MgPSBJTlRfTUlOOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gb3V0LT5wb2M7CisKKyAgICAgICAgaWYgKG91dC0+cmVjb3ZlcmVkKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIHJlYWNoZWQgYW4gcmVjb3ZlcnkgcG9pbnQgYW5kIGFsbCBmcmFtZXMgYWZ0ZXIgaXQgaW4KKyAgICAgICAgICAgIC8vIGRpc3BsYXkgb3JkZXIgYXJlICJyZWNvdmVyZWQiLgorICAgICAgICAgICAgaC0+ZnJhbWVfcmVjb3ZlcmVkIHw9IEZSQU1FX1JFQ09WRVJFRF9TRUk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LT5yZWNvdmVyZWQgfD0gISEoaC0+ZnJhbWVfcmVjb3ZlcmVkICYgRlJBTUVfUkVDT1ZFUkVEX1NFSSk7CisKKyAgICAgICAgaWYgKCFvdXQtPnJlY292ZXJlZCkgeworICAgICAgICAgICAgaWYgKCEoaC0+YXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19PVVRQVVRfQ09SUlVQVCkgJiYKKyAgICAgICAgICAgICAgICAhKGgtPmF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9TSE9XX0FMTCkpIHsKKyAgICAgICAgICAgICAgICBoLT5uZXh0X291dHB1dF9waWMgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvdXQtPmYtPmZsYWdzIHw9IEFWX0ZSQU1FX0ZMQUdfQ09SUlVQVDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAibm8gcGljdHVyZSAlc1xuIiwgb3V0X29mX29yZGVyID8gIm9vbyIgOiAiIik7CisgICAgfQogCi0gICAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGEgZGVjb2RlZCBmaXJzdCBmaWVsZCBsb29raW5nIGZvciBhIHBhaXIuLi4KLSAgICAgICAgICogSGVyZSwgd2UncmUgdXNpbmcgdGhhdCB0byBzZWUgaWYgd2Ugc2hvdWxkIG1hcmsgcHJldmlvdXNseQotICAgICAgICAgKiBkZWNvZGUgZnJhbWVzIGFzICJmaW5pc2hlZCIuCi0gICAgICAgICAqIFdlIGhhdmUgdG8gZG8gdGhhdCBiZWZvcmUgdGhlICJkdW1teSIgaW4tYmV0d2VlbiBmcmFtZSBhbGxvY2F0aW9uLAotICAgICAgICAgKiBzaW5jZSB0aGF0IGNhbiBtb2RpZnkgaC0+Y3VyX3BpY19wdHIuICovCi0gICAgICAgIGlmIChoLT5maXJzdF9maWVsZCkgewotICAgICAgICAgICAgYXZfYXNzZXJ0MChoLT5jdXJfcGljX3B0cik7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKGgtPmN1cl9waWNfcHRyLT5mLT5idWZbMF0pOwotICAgICAgICAgICAgYXNzZXJ0KGgtPmN1cl9waWNfcHRyLT5yZWZlcmVuY2UgIT0gREVMQVlFRF9QSUNfUkVGKTsKKyAgICByZXR1cm4gMDsKK30KIAotICAgICAgICAgICAgLyogTWFyayBvbGQgZmllbGQvZnJhbWUgYXMgY29tcGxldGVkICovCi0gICAgICAgICAgICBpZiAoaC0+Y3VyX3BpY19wdHItPnRmLm93bmVyID09IGgtPmF2Y3R4KSB7CisvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCByaWdodCBhZnRlciBkZWNvZGluZyB0aGUgc2xpY2UgaGVhZGVyIGZvciBhIGZpcnN0CisgKiBzbGljZSBpbiBhIGZpZWxkIChvciBhIGZyYW1lKS4gSXQgZGVjaWRlcyB3aGV0aGVyIHdlIGFyZSBkZWNvZGluZyBhIG5ldyBmcmFtZQorICogb3IgYSBzZWNvbmQgZmllbGQgaW4gYSBwYWlyIGFuZCBkb2VzIHRoZSBuZWNlc3Nhcnkgc2V0dXAuCisgKi8KK3N0YXRpYyBpbnQgaDI2NF9maWVsZF9zdGFydChIMjY0Q29udGV4dCAqaCwgY29uc3QgSDI2NFNsaWNlQ29udGV4dCAqc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NDVOQUwgKm5hbCwgaW50IGZpcnN0X3NsaWNlKQoreworICAgIGludCBpOworICAgIGNvbnN0IFNQUyAqc3BzOworCisgICAgaW50IGxhc3RfcGljX3N0cnVjdHVyZSwgbGFzdF9waWNfZHJvcHBhYmxlLCByZXQ7CisKKyAgICByZXQgPSBoMjY0X2luaXRfcHMoaCwgc2wsIGZpcnN0X3NsaWNlKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHNwcyA9IGgtPnBzLnNwczsKKworICAgIGxhc3RfcGljX2Ryb3BwYWJsZSAgID0gaC0+ZHJvcHBhYmxlOworICAgIGxhc3RfcGljX3N0cnVjdHVyZSAgID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmU7CisgICAgaC0+ZHJvcHBhYmxlICAgICAgICAgPSAobmFsLT5yZWZfaWRjID09IDApOworICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID0gc2wtPnBpY3R1cmVfc3RydWN0dXJlOworCisgICAgaC0+cG9jLmZyYW1lX251bSAgICAgICAgPSBzbC0+ZnJhbWVfbnVtOworICAgIGgtPnBvYy5wb2NfbHNiICAgICAgICAgID0gc2wtPnBvY19sc2I7CisgICAgaC0+cG9jLmRlbHRhX3BvY19ib3R0b20gPSBzbC0+ZGVsdGFfcG9jX2JvdHRvbTsKKyAgICBoLT5wb2MuZGVsdGFfcG9jWzBdICAgICA9IHNsLT5kZWx0YV9wb2NbMF07CisgICAgaC0+cG9jLmRlbHRhX3BvY1sxXSAgICAgPSBzbC0+ZGVsdGFfcG9jWzFdOworCisgICAgLyogU2hvcnRlbiBmcmFtZSBudW0gZ2FwcyBzbyB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlIHJlZmVyZW5jZQorICAgICAqIGZyYW1lcyBqdXN0IHRvIHRocm93IHRoZW0gYXdheSAqLworICAgIGlmIChoLT5wb2MuZnJhbWVfbnVtICE9IGgtPnBvYy5wcmV2X2ZyYW1lX251bSkgeworICAgICAgICBpbnQgdW53cmFwX3ByZXZfZnJhbWVfbnVtID0gaC0+cG9jLnByZXZfZnJhbWVfbnVtOworICAgICAgICBpbnQgbWF4X2ZyYW1lX251bSAgICAgICAgID0gMSA8PCBzcHMtPmxvZzJfbWF4X2ZyYW1lX251bTsKKworICAgICAgICBpZiAodW53cmFwX3ByZXZfZnJhbWVfbnVtID4gaC0+cG9jLmZyYW1lX251bSkKKyAgICAgICAgICAgIHVud3JhcF9wcmV2X2ZyYW1lX251bSAtPSBtYXhfZnJhbWVfbnVtOworCisgICAgICAgIGlmICgoaC0+cG9jLmZyYW1lX251bSAtIHVud3JhcF9wcmV2X2ZyYW1lX251bSkgPiBzcHMtPnJlZl9mcmFtZV9jb3VudCkgeworICAgICAgICAgICAgdW53cmFwX3ByZXZfZnJhbWVfbnVtID0gKGgtPnBvYy5mcmFtZV9udW0gLSBzcHMtPnJlZl9mcmFtZV9jb3VudCkgLSAxOworICAgICAgICAgICAgaWYgKHVud3JhcF9wcmV2X2ZyYW1lX251bSA8IDApCisgICAgICAgICAgICAgICAgdW53cmFwX3ByZXZfZnJhbWVfbnVtICs9IG1heF9mcmFtZV9udW07CisKKyAgICAgICAgICAgIGgtPnBvYy5wcmV2X2ZyYW1lX251bSA9IHVud3JhcF9wcmV2X2ZyYW1lX251bTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGEgZGVjb2RlZCBmaXJzdCBmaWVsZCBsb29raW5nIGZvciBhIHBhaXIuLi4KKyAgICAgKiBIZXJlLCB3ZSdyZSB1c2luZyB0aGF0IHRvIHNlZSBpZiB3ZSBzaG91bGQgbWFyayBwcmV2aW91c2x5CisgICAgICogZGVjb2RlIGZyYW1lcyBhcyAiZmluaXNoZWQiLgorICAgICAqIFdlIGhhdmUgdG8gZG8gdGhhdCBiZWZvcmUgdGhlICJkdW1teSIgaW4tYmV0d2VlbiBmcmFtZSBhbGxvY2F0aW9uLAorICAgICAqIHNpbmNlIHRoYXQgY2FuIG1vZGlmeSBoLT5jdXJfcGljX3B0ci4gKi8KKyAgICBpZiAoaC0+Zmlyc3RfZmllbGQpIHsKKyAgICAgICAgaW50IGxhc3RfZmllbGQgPSBsYXN0X3BpY19zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQ7CisgICAgICAgIGF2X2Fzc2VydDAoaC0+Y3VyX3BpY19wdHIpOworICAgICAgICBhdl9hc3NlcnQwKGgtPmN1cl9waWNfcHRyLT5mLT5idWZbMF0pOworICAgICAgICBhc3NlcnQoaC0+Y3VyX3BpY19wdHItPnJlZmVyZW5jZSAhPSBERUxBWUVEX1BJQ19SRUYpOworCisgICAgICAgIC8qIE1hcmsgb2xkIGZpZWxkL2ZyYW1lIGFzIGNvbXBsZXRlZCAqLworICAgICAgICBpZiAoaC0+Y3VyX3BpY19wdHItPnRmLm93bmVyW2xhc3RfZmllbGRdID09IGgtPmF2Y3R4KSB7CisgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsIGxhc3RfZmllbGQpOworICAgICAgICB9CisKKyAgICAgICAgLyogZmlndXJlIG91dCBpZiB3ZSBoYXZlIGEgY29tcGxlbWVudGFyeSBmaWVsZCBwYWlyICovCisgICAgICAgIGlmICghRklFTERfUElDVFVSRShoKSB8fCBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBsYXN0X3BpY19zdHJ1Y3R1cmUpIHsKKyAgICAgICAgICAgIC8qIFByZXZpb3VzIGZpZWxkIGlzIHVubWF0Y2hlZC4gRG9uJ3QgZGlzcGxheSBpdCwgYnV0IGxldCBpdAorICAgICAgICAgICAgICogcmVtYWluIGZvciByZWZlcmVuY2UgaWYgbWFya2VkIGFzIHN1Y2guICovCisgICAgICAgICAgICBpZiAobGFzdF9waWNfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpIHsKICAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BpY19zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9waWNfc3RydWN0dXJlID09IFBJQ1RfVE9QX0ZJRUxEKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogZmlndXJlIG91dCBpZiB3ZSBoYXZlIGEgY29tcGxlbWVudGFyeSBmaWVsZCBwYWlyICovCi0gICAgICAgICAgICBpZiAoIUZJRUxEX1BJQ1RVUkUoaCkgfHwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gbGFzdF9waWNfc3RydWN0dXJlKSB7Ci0gICAgICAgICAgICAgICAgLyogUHJldmlvdXMgZmllbGQgaXMgdW5tYXRjaGVkLiBEb24ndCBkaXNwbGF5IGl0LCBidXQgbGV0IGl0Ci0gICAgICAgICAgICAgICAgICogcmVtYWluIGZvciByZWZlcmVuY2UgaWYgbWFya2VkIGFzIHN1Y2guICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaC0+Y3VyX3BpY19wdHItPmZyYW1lX251bSAhPSBoLT5wb2MuZnJhbWVfbnVtKSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBhbmQgcHJldmlvdXMgZmllbGQgd2VyZSByZWZlcmVuY2UsIGJ1dCBoYWQKKyAgICAgICAgICAgICAgICAgKiBkaWZmZXJlbnQgZnJhbWVfbnVtcy4gQ29uc2lkZXIgdGhpcyBmaWVsZCBmaXJzdCBpbgorICAgICAgICAgICAgICAgICAqIHBhaXIuIFRocm93IGF3YXkgcHJldmlvdXMgZmllbGQgZXhjZXB0IGZvciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgKiBwdXJwb3Nlcy4gKi8KICAgICAgICAgICAgICAgICBpZiAobGFzdF9waWNfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpIHsKICAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaC0+Y3VyX3BpY19wdHItPnRmLCBJTlRfTUFYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcGljX3N0cnVjdHVyZSA9PSBQSUNUX1RPUF9GSUVMRCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaC0+Y3VyX3BpY19wdHItPmZyYW1lX251bSAhPSBoLT5mcmFtZV9udW0pIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBhbmQgcHJldmlvdXMgZmllbGQgd2VyZSByZWZlcmVuY2UsIGJ1dCBoYWQKLSAgICAgICAgICAgICAgICAgICAgICogZGlmZmVyZW50IGZyYW1lX251bXMuIENvbnNpZGVyIHRoaXMgZmllbGQgZmlyc3QgaW4KLSAgICAgICAgICAgICAgICAgICAgICogcGFpci4gVGhyb3cgYXdheSBwcmV2aW91cyBmaWVsZCBleGNlcHQgZm9yIHJlZmVyZW5jZQotICAgICAgICAgICAgICAgICAgICAgKiBwdXJwb3Nlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RfcGljX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfcGljX3N0cnVjdHVyZSA9PSBQSUNUX1RPUF9GSUVMRCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvKiBTZWNvbmQgZmllbGQgaW4gY29tcGxlbWVudGFyeSBwYWlyICovCi0gICAgICAgICAgICAgICAgICAgIGlmICghKChsYXN0X3BpY19zdHJ1Y3R1cmUgICA9PSBQSUNUX1RPUF9GSUVMRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0X3BpY19zdHJ1Y3R1cmUgICA9PSBQSUNUX0JPVFRPTV9GSUVMRCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9UT1BfRklFTEQpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZmllbGQgbW9kZSBjb21iaW5hdGlvbiAlZC8lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BpY19zdHJ1Y3R1cmUsIGgtPnBpY3R1cmVfc3RydWN0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID0gbGFzdF9waWNfc3RydWN0dXJlOwotICAgICAgICAgICAgICAgICAgICAgICAgaC0+ZHJvcHBhYmxlICAgICAgICAgPSBsYXN0X3BpY19kcm9wcGFibGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0X3BpY19kcm9wcGFibGUgIT0gaC0+ZHJvcHBhYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoaC0+YXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHJlZmVyZW5jZSBhbmQgbm9uLXJlZmVyZW5jZSBmaWVsZHMgaW4gdGhlIHNhbWUgZnJhbWUsIHdoaWNoIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9IGxhc3RfcGljX3N0cnVjdHVyZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGgtPmRyb3BwYWJsZSAgICAgICAgID0gbGFzdF9waWNfZHJvcHBhYmxlOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogU2Vjb25kIGZpZWxkIGluIGNvbXBsZW1lbnRhcnkgcGFpciAqLworICAgICAgICAgICAgICAgIGlmICghKChsYXN0X3BpY19zdHJ1Y3R1cmUgICA9PSBQSUNUX1RPUF9GSUVMRCAmJgorICAgICAgICAgICAgICAgICAgICAgICBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAobGFzdF9waWNfc3RydWN0dXJlICAgPT0gUElDVF9CT1RUT01fRklFTEQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9UT1BfRklFTEQpKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGZpZWxkIG1vZGUgY29tYmluYXRpb24gJWQvJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BpY19zdHJ1Y3R1cmUsIGgtPnBpY3R1cmVfc3RydWN0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBsYXN0X3BpY19zdHJ1Y3R1cmU7CisgICAgICAgICAgICAgICAgICAgIGgtPmRyb3BwYWJsZSAgICAgICAgID0gbGFzdF9waWNfZHJvcHBhYmxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RfcGljX2Ryb3BwYWJsZSAhPSBoLT5kcm9wcGFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGgtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZvdW5kIHJlZmVyZW5jZSBhbmQgbm9uLXJlZmVyZW5jZSBmaWVsZHMgaW4gdGhlIHNhbWUgZnJhbWUsIHdoaWNoIik7CisgICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID0gbGFzdF9waWNfc3RydWN0dXJlOworICAgICAgICAgICAgICAgICAgICBoLT5kcm9wcGFibGUgICAgICAgICA9IGxhc3RfcGljX2Ryb3BwYWJsZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIHdoaWxlIChoLT5mcmFtZV9udW0gIT0gaC0+cHJldl9mcmFtZV9udW0gJiYgIWgtPmZpcnN0X2ZpZWxkICYmCi0gICAgICAgICAgICAgICBoLT5mcmFtZV9udW0gIT0gKGgtPnByZXZfZnJhbWVfbnVtICsgMSkgJSAoMSA8PCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtKSkgewotICAgICAgICAgICAgSDI2NFBpY3R1cmUgKnByZXYgPSBoLT5zaG9ydF9yZWZfY291bnQgPyBoLT5zaG9ydF9yZWZbMF0gOiBOVUxMOwotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJGcmFtZSBudW0gZ2FwICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGgtPmZyYW1lX251bSwgaC0+cHJldl9mcmFtZV9udW0pOwotICAgICAgICAgICAgaWYgKCFoLT5zcHMuZ2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnKQotICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8RkZfQVJSQVlfRUxFTVMoaC0+bGFzdF9wb2NzKTsgaSsrKQotICAgICAgICAgICAgICAgICAgICBoLT5sYXN0X3BvY3NbaV0gPSBJTlRfTUlOOwotICAgICAgICAgICAgcmV0ID0gaDI2NF9mcmFtZV9zdGFydChoKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaC0+Zmlyc3RfZmllbGQgPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtKys7Ci0gICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bSAgICAgICAgJT0gMSA8PCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtOwotICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPmZyYW1lX251bSA9IGgtPnByZXZfZnJhbWVfbnVtOwotICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPmludmFsaWRfZ2FwID0gIWgtPnNwcy5nYXBzX2luX2ZyYW1lX251bV9hbGxvd2VkX2ZsYWc7Ci0gICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsIDApOwotICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaC0+Y3VyX3BpY19wdHItPnRmLCBJTlRfTUFYLCAxKTsKLSAgICAgICAgICAgIHJldCA9IGZmX2dlbmVyYXRlX3NsaWRpbmdfd2luZG93X21tY29zKGgsIDEpOwotICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9leGVjdXRlX3JlZl9waWNfbWFya2luZyhoLCBoLT5tbWNvLCBoLT5tbWNvX2luZGV4KTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIChoLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIC8qIEVycm9yIGNvbmNlYWxtZW50OiBJZiBhIHJlZiBpcyBtaXNzaW5nLCBjb3B5IHRoZSBwcmV2aW91cyByZWYKLSAgICAgICAgICAgICAqIGluIGl0cyBwbGFjZS4KLSAgICAgICAgICAgICAqIEZJWE1FOiBBdm9pZGluZyBhIG1lbWNweSB3b3VsZCBiZSBuaWNlLCBidXQgcmVmIGhhbmRsaW5nIG1ha2VzCi0gICAgICAgICAgICAgKiBtYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZXJlIGJlaW5nIG5vIGFjdHVhbCBkdXBsaWNhdGVzLgotICAgICAgICAgICAgICogRklYTUU6IFRoaXMgZG9lcyBub3QgY29weSBwYWRkaW5nIGZvciBvdXQtb2YtZnJhbWUgbW90aW9uCi0gICAgICAgICAgICAgKiB2ZWN0b3JzLiAgR2l2ZW4gd2UgYXJlIGNvbmNlYWxpbmcgYSBsb3N0IGZyYW1lLCB0aGlzIHByb2JhYmx5Ci0gICAgICAgICAgICAgKiBpcyBub3Qgbm90aWNlYWJsZSBieSBjb21wYXJpc29uLCBidXQgaXQgc2hvdWxkIGJlIGZpeGVkLiAqLwotICAgICAgICAgICAgaWYgKGgtPnNob3J0X3JlZl9jb3VudCkgewotICAgICAgICAgICAgICAgIGlmIChwcmV2ICYmCi0gICAgICAgICAgICAgICAgICAgIGgtPnNob3J0X3JlZlswXS0+Zi0+d2lkdGggPT0gcHJldi0+Zi0+d2lkdGggJiYKLSAgICAgICAgICAgICAgICAgICAgaC0+c2hvcnRfcmVmWzBdLT5mLT5oZWlnaHQgPT0gcHJldi0+Zi0+aGVpZ2h0ICYmCi0gICAgICAgICAgICAgICAgICAgIGgtPnNob3J0X3JlZlswXS0+Zi0+Zm9ybWF0ID09IHByZXYtPmYtPmZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5KGgtPnNob3J0X3JlZlswXS0+Zi0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zaG9ydF9yZWZbMF0tPmYtPmxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKXByZXYtPmYtPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+Zi0+bGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+Zi0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmYtPndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmYtPmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIGgtPnNob3J0X3JlZlswXS0+cG9jID0gcHJldi0+cG9jICsgMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaC0+c2hvcnRfcmVmWzBdLT5mcmFtZV9udW0gPSBoLT5wcmV2X2ZyYW1lX251bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNlZSBpZiB3ZSBoYXZlIGEgZGVjb2RlZCBmaXJzdCBmaWVsZCBsb29raW5nIGZvciBhIHBhaXIuLi4KLSAgICAgICAgICogV2UncmUgdXNpbmcgdGhhdCB0byBzZWUgd2hldGhlciB0byBjb250aW51ZSBkZWNvZGluZyBpbiB0aGF0Ci0gICAgICAgICAqIGZyYW1lLCBvciB0byBhbGxvY2F0ZSBhIG5ldyBvbmUuICovCi0gICAgICAgIGlmIChoLT5maXJzdF9maWVsZCkgewotICAgICAgICAgICAgYXZfYXNzZXJ0MChoLT5jdXJfcGljX3B0cik7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKGgtPmN1cl9waWNfcHRyLT5mLT5idWZbMF0pOwotICAgICAgICAgICAgYXNzZXJ0KGgtPmN1cl9waWNfcHRyLT5yZWZlcmVuY2UgIT0gREVMQVlFRF9QSUNfUkVGKTsKLQotICAgICAgICAgICAgLyogZmlndXJlIG91dCBpZiB3ZSBoYXZlIGEgY29tcGxlbWVudGFyeSBmaWVsZCBwYWlyICovCi0gICAgICAgICAgICBpZiAoIUZJRUxEX1BJQ1RVUkUoaCkgfHwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gbGFzdF9waWNfc3RydWN0dXJlKSB7Ci0gICAgICAgICAgICAgICAgLyogUHJldmlvdXMgZmllbGQgaXMgdW5tYXRjaGVkLiBEb24ndCBkaXNwbGF5IGl0LCBidXQgbGV0IGl0Ci0gICAgICAgICAgICAgICAgICogcmVtYWluIGZvciByZWZlcmVuY2UgaWYgbWFya2VkIGFzIHN1Y2guICovCi0gICAgICAgICAgICAgICAgaC0+bWlzc2luZ19maWVsZHMgKys7Ci0gICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOwotICAgICAgICAgICAgICAgIGgtPmZpcnN0X2ZpZWxkID0gRklFTERfUElDVFVSRShoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaC0+bWlzc2luZ19maWVsZHMgPSAwOwotICAgICAgICAgICAgICAgIGlmIChoLT5jdXJfcGljX3B0ci0+ZnJhbWVfbnVtICE9IGgtPmZyYW1lX251bSkgewotICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmU9PVBJQ1RfQk9UVE9NX0ZJRUxEKTsKLSAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBhbmQgdGhlIHByZXZpb3VzIGZpZWxkIGhhZCBkaWZmZXJlbnQgZnJhbWVfbnVtcy4KLSAgICAgICAgICAgICAgICAgICAgICogQ29uc2lkZXIgdGhpcyBmaWVsZCBmaXJzdCBpbiBwYWlyLiBUaHJvdyBhd2F5IHByZXZpb3VzCi0gICAgICAgICAgICAgICAgICAgICAqIG9uZSBleGNlcHQgZm9yIHJlZmVyZW5jZSBwdXJwb3Nlcy4gKi8KLSAgICAgICAgICAgICAgICAgICAgaC0+Zmlyc3RfZmllbGQgPSAxOwotICAgICAgICAgICAgICAgICAgICBoLT5jdXJfcGljX3B0ciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLyogU2Vjb25kIGZpZWxkIGluIGNvbXBsZW1lbnRhcnkgcGFpciAqLwotICAgICAgICAgICAgICAgICAgICBoLT5maXJzdF9maWVsZCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogRnJhbWUgb3IgZmlyc3QgZmllbGQgaW4gYSBwb3RlbnRpYWxseSBjb21wbGVtZW50YXJ5IHBhaXIgKi8KLSAgICAgICAgICAgIGgtPmZpcnN0X2ZpZWxkID0gRklFTERfUElDVFVSRShoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghRklFTERfUElDVFVSRShoKSB8fCBoLT5maXJzdF9maWVsZCkgewotICAgICAgICAgICAgaWYgKGgyNjRfZnJhbWVfc3RhcnQoaCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgaC0+Zmlyc3RfZmllbGQgPSAwOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVsZWFzZV91bnVzZWRfcGljdHVyZXMoaCwgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogU29tZSBtYWNyb2Jsb2NrcyBjYW4gYmUgYWNjZXNzZWQgYmVmb3JlIHRoZXkncmUgYXZhaWxhYmxlIGluIGNhc2UKLSAgICAgICAgKiBvZiBsb3N0IHNsaWNlcywgTUJBRkYgb3IgdGhyZWFkaW5nLiAqLwotICAgICAgICBpZiAoRklFTERfUElDVFVSRShoKSkgewotICAgICAgICAgICAgZm9yKGkgPSAoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpOyBpPGgtPm1iX2hlaWdodDsgaSsrKQotICAgICAgICAgICAgICAgIG1lbXNldChoLT5zbGljZV90YWJsZSArIGkqaC0+bWJfc3RyaWRlLCAtMSwgKGgtPm1iX3N0cmlkZSAtIChpKzE9PWgtPm1iX2hlaWdodCkpICogc2l6ZW9mKCpoLT5zbGljZV90YWJsZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVtc2V0KGgtPnNsaWNlX3RhYmxlLCAtMSwKLSAgICAgICAgICAgICAgICAoaC0+bWJfaGVpZ2h0ICogaC0+bWJfc3RyaWRlIC0gMSkgKiBzaXplb2YoKmgtPnNsaWNlX3RhYmxlKSk7Ci0gICAgICAgIH0KICAgICB9CiAKLSAgICBhdl9hc3NlcnQxKGgtPm1iX251bSA9PSBoLT5tYl93aWR0aCAqIGgtPm1iX2hlaWdodCk7Ci0gICAgaWYgKGZpcnN0X21iX2luX3NsaWNlIDw8IEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCkgPj0gaC0+bWJfbnVtIHx8Ci0gICAgICAgIGZpcnN0X21iX2luX3NsaWNlID49IGgtPm1iX251bSkgewotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImZpcnN0X21iX2luX3NsaWNlIG92ZXJmbG93XG4iKTsKKyAgICB3aGlsZSAoaC0+cG9jLmZyYW1lX251bSAhPSBoLT5wb2MucHJldl9mcmFtZV9udW0gJiYgIWgtPmZpcnN0X2ZpZWxkICYmCisgICAgICAgICAgIGgtPnBvYy5mcmFtZV9udW0gIT0gKGgtPnBvYy5wcmV2X2ZyYW1lX251bSArIDEpICUgKDEgPDwgc3BzLT5sb2cyX21heF9mcmFtZV9udW0pKSB7CisgICAgICAgIEgyNjRQaWN0dXJlICpwcmV2ID0gaC0+c2hvcnRfcmVmX2NvdW50ID8gaC0+c2hvcnRfcmVmWzBdIDogTlVMTDsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJGcmFtZSBudW0gZ2FwICVkICVkXG4iLAorICAgICAgICAgICAgICAgaC0+cG9jLmZyYW1lX251bSwgaC0+cG9jLnByZXZfZnJhbWVfbnVtKTsKKyAgICAgICAgaWYgKCFzcHMtPmdhcHNfaW5fZnJhbWVfbnVtX2FsbG93ZWRfZmxhZykKKyAgICAgICAgICAgIGZvcihpPTA7IGk8RkZfQVJSQVlfRUxFTVMoaC0+bGFzdF9wb2NzKTsgaSsrKQorICAgICAgICAgICAgICAgIGgtPmxhc3RfcG9jc1tpXSA9IElOVF9NSU47CisgICAgICAgIHJldCA9IGgyNjRfZnJhbWVfc3RhcnQoaCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBoLT5maXJzdF9maWVsZCA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaC0+cG9jLnByZXZfZnJhbWVfbnVtKys7CisgICAgICAgIGgtPnBvYy5wcmV2X2ZyYW1lX251bSAgICAgICAgJT0gMSA8PCBzcHMtPmxvZzJfbWF4X2ZyYW1lX251bTsKKyAgICAgICAgaC0+Y3VyX3BpY19wdHItPmZyYW1lX251bSA9IGgtPnBvYy5wcmV2X2ZyYW1lX251bTsKKyAgICAgICAgaC0+Y3VyX3BpY19wdHItPmludmFsaWRfZ2FwID0gIXNwcy0+Z2Fwc19pbl9mcmFtZV9udW1fYWxsb3dlZF9mbGFnOworICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsIDApOworICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsIDEpOworCisgICAgICAgIGgtPmV4cGxpY2l0X3JlZl9tYXJraW5nID0gMDsKKyAgICAgICAgcmV0ID0gZmZfaDI2NF9leGVjdXRlX3JlZl9waWNfbWFya2luZyhoKTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIC8qIEVycm9yIGNvbmNlYWxtZW50OiBJZiBhIHJlZiBpcyBtaXNzaW5nLCBjb3B5IHRoZSBwcmV2aW91cyByZWYKKyAgICAgICAgICogaW4gaXRzIHBsYWNlLgorICAgICAgICAgKiBGSVhNRTogQXZvaWRpbmcgYSBtZW1jcHkgd291bGQgYmUgbmljZSwgYnV0IHJlZiBoYW5kbGluZyBtYWtlcworICAgICAgICAgKiBtYW55IGFzc3VtcHRpb25zIGFib3V0IHRoZXJlIGJlaW5nIG5vIGFjdHVhbCBkdXBsaWNhdGVzLgorICAgICAgICAgKiBGSVhNRTogVGhpcyBkb2VzIG5vdCBjb3B5IHBhZGRpbmcgZm9yIG91dC1vZi1mcmFtZSBtb3Rpb24KKyAgICAgICAgICogdmVjdG9ycy4gIEdpdmVuIHdlIGFyZSBjb25jZWFsaW5nIGEgbG9zdCBmcmFtZSwgdGhpcyBwcm9iYWJseQorICAgICAgICAgKiBpcyBub3Qgbm90aWNlYWJsZSBieSBjb21wYXJpc29uLCBidXQgaXQgc2hvdWxkIGJlIGZpeGVkLiAqLworICAgICAgICBpZiAoaC0+c2hvcnRfcmVmX2NvdW50KSB7CisgICAgICAgICAgICBpZiAocHJldiAmJgorICAgICAgICAgICAgICAgIGgtPnNob3J0X3JlZlswXS0+Zi0+d2lkdGggPT0gcHJldi0+Zi0+d2lkdGggJiYKKyAgICAgICAgICAgICAgICBoLT5zaG9ydF9yZWZbMF0tPmYtPmhlaWdodCA9PSBwcmV2LT5mLT5oZWlnaHQgJiYKKyAgICAgICAgICAgICAgICBoLT5zaG9ydF9yZWZbMF0tPmYtPmZvcm1hdCA9PSBwcmV2LT5mLT5mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnByZXYtPnRmLCBJTlRfTUFYLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocHJldi0+ZmllbGRfcGljdHVyZSkKKyAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZwcmV2LT50ZiwgSU5UX01BWCwgMSk7CisgICAgICAgICAgICAgICAgYXZfaW1hZ2VfY29weShoLT5zaG9ydF9yZWZbMF0tPmYtPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5zaG9ydF9yZWZbMF0tPmYtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiopcHJldi0+Zi0+ZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYtPmYtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+Zi0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi0+Zi0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LT5mLT5oZWlnaHQpOworICAgICAgICAgICAgICAgIGgtPnNob3J0X3JlZlswXS0+cG9jID0gcHJldi0+cG9jICsgMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGgtPnNob3J0X3JlZlswXS0+ZnJhbWVfbnVtID0gaC0+cG9jLnByZXZfZnJhbWVfbnVtOworICAgICAgICB9CisgICAgfQorCisgICAgLyogU2VlIGlmIHdlIGhhdmUgYSBkZWNvZGVkIGZpcnN0IGZpZWxkIGxvb2tpbmcgZm9yIGEgcGFpci4uLgorICAgICAqIFdlJ3JlIHVzaW5nIHRoYXQgdG8gc2VlIHdoZXRoZXIgdG8gY29udGludWUgZGVjb2RpbmcgaW4gdGhhdAorICAgICAqIGZyYW1lLCBvciB0byBhbGxvY2F0ZSBhIG5ldyBvbmUuICovCisgICAgaWYgKGgtPmZpcnN0X2ZpZWxkKSB7CisgICAgICAgIGF2X2Fzc2VydDAoaC0+Y3VyX3BpY19wdHIpOworICAgICAgICBhdl9hc3NlcnQwKGgtPmN1cl9waWNfcHRyLT5mLT5idWZbMF0pOworICAgICAgICBhc3NlcnQoaC0+Y3VyX3BpY19wdHItPnJlZmVyZW5jZSAhPSBERUxBWUVEX1BJQ19SRUYpOworCisgICAgICAgIC8qIGZpZ3VyZSBvdXQgaWYgd2UgaGF2ZSBhIGNvbXBsZW1lbnRhcnkgZmllbGQgcGFpciAqLworICAgICAgICBpZiAoIUZJRUxEX1BJQ1RVUkUoaCkgfHwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gbGFzdF9waWNfc3RydWN0dXJlKSB7CisgICAgICAgICAgICAvKiBQcmV2aW91cyBmaWVsZCBpcyB1bm1hdGNoZWQuIERvbid0IGRpc3BsYXkgaXQsIGJ1dCBsZXQgaXQKKyAgICAgICAgICAgICAqIHJlbWFpbiBmb3IgcmVmZXJlbmNlIGlmIG1hcmtlZCBhcyBzdWNoLiAqLworICAgICAgICAgICAgaC0+bWlzc2luZ19maWVsZHMgKys7CisgICAgICAgICAgICBoLT5jdXJfcGljX3B0ciA9IE5VTEw7CisgICAgICAgICAgICBoLT5maXJzdF9maWVsZCA9IEZJRUxEX1BJQ1RVUkUoaCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoLT5taXNzaW5nX2ZpZWxkcyA9IDA7CisgICAgICAgICAgICBpZiAoaC0+Y3VyX3BpY19wdHItPmZyYW1lX251bSAhPSBoLT5wb2MuZnJhbWVfbnVtKSB7CisgICAgICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaC0+Y3VyX3BpY19wdHItPnRmLCBJTlRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmU9PVBJQ1RfQk9UVE9NX0ZJRUxEKTsKKyAgICAgICAgICAgICAgICAvKiBUaGlzIGFuZCB0aGUgcHJldmlvdXMgZmllbGQgaGFkIGRpZmZlcmVudCBmcmFtZV9udW1zLgorICAgICAgICAgICAgICAgICAqIENvbnNpZGVyIHRoaXMgZmllbGQgZmlyc3QgaW4gcGFpci4gVGhyb3cgYXdheSBwcmV2aW91cworICAgICAgICAgICAgICAgICAqIG9uZSBleGNlcHQgZm9yIHJlZmVyZW5jZSBwdXJwb3Nlcy4gKi8KKyAgICAgICAgICAgICAgICBoLT5maXJzdF9maWVsZCA9IDE7CisgICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIGlmIChoLT5jdXJfcGljX3B0ci0+cmVmZXJlbmNlICYgREVMQVlFRF9QSUNfUkVGKSB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBmcmFtZSB3YXMgYWxyZWFkeSBvdXRwdXQsIHdlIGNhbm5vdCBkcmF3IGludG8gaXQKKyAgICAgICAgICAgICAgICAgKiBhbnltb3JlLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGgtPmZpcnN0X2ZpZWxkID0gMTsKKyAgICAgICAgICAgICAgICBoLT5jdXJfcGljX3B0ciA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFNlY29uZCBmaWVsZCBpbiBjb21wbGVtZW50YXJ5IHBhaXIgKi8KKyAgICAgICAgICAgICAgICBoLT5maXJzdF9maWVsZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBGcmFtZSBvciBmaXJzdCBmaWVsZCBpbiBhIHBvdGVudGlhbGx5IGNvbXBsZW1lbnRhcnkgcGFpciAqLworICAgICAgICBoLT5maXJzdF9maWVsZCA9IEZJRUxEX1BJQ1RVUkUoaCk7CisgICAgfQorCisgICAgaWYgKCFGSUVMRF9QSUNUVVJFKGgpIHx8IGgtPmZpcnN0X2ZpZWxkKSB7CisgICAgICAgIGlmIChoMjY0X2ZyYW1lX3N0YXJ0KGgpIDwgMCkgeworICAgICAgICAgICAgaC0+Zmlyc3RfZmllbGQgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgZmllbGQgPSBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRDsKKyAgICAgICAgcmVsZWFzZV91bnVzZWRfcGljdHVyZXMoaCwgMCk7CisgICAgICAgIGgtPmN1cl9waWNfcHRyLT50Zi5vd25lcltmaWVsZF0gPSBoLT5hdmN0eDsKKyAgICB9CisgICAgLyogU29tZSBtYWNyb2Jsb2NrcyBjYW4gYmUgYWNjZXNzZWQgYmVmb3JlIHRoZXkncmUgYXZhaWxhYmxlIGluIGNhc2UKKyAgICAqIG9mIGxvc3Qgc2xpY2VzLCBNQkFGRiBvciB0aHJlYWRpbmcuICovCisgICAgaWYgKEZJRUxEX1BJQ1RVUkUoaCkpIHsKKyAgICAgICAgZm9yKGkgPSAoaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQpOyBpPGgtPm1iX2hlaWdodDsgaSsrKQorICAgICAgICAgICAgbWVtc2V0KGgtPnNsaWNlX3RhYmxlICsgaSpoLT5tYl9zdHJpZGUsIC0xLCAoaC0+bWJfc3RyaWRlIC0gKGkrMT09aC0+bWJfaGVpZ2h0KSkgKiBzaXplb2YoKmgtPnNsaWNlX3RhYmxlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWVtc2V0KGgtPnNsaWNlX3RhYmxlLCAtMSwKKyAgICAgICAgICAgIChoLT5tYl9oZWlnaHQgKiBoLT5tYl9zdHJpZGUgLSAxKSAqIHNpemVvZigqaC0+c2xpY2VfdGFibGUpKTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9oMjY0X2luaXRfcG9jKGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2MsICZoLT5jdXJfcGljX3B0ci0+cG9jLAorICAgICAgICAgICAgICAgICAgICAgaC0+cHMuc3BzLCAmaC0+cG9jLCBoLT5waWN0dXJlX3N0cnVjdHVyZSwgbmFsLT5yZWZfaWRjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG1lbWNweShoLT5tbWNvLCBzbC0+bW1jbywgc2wtPm5iX21tY28gKiBzaXplb2YoKmgtPm1tY28pKTsKKyAgICBoLT5uYl9tbWNvID0gc2wtPm5iX21tY287CisgICAgaC0+ZXhwbGljaXRfcmVmX21hcmtpbmcgPSBzbC0+ZXhwbGljaXRfcmVmX21hcmtpbmc7CisKKyAgICBoLT5waWN0dXJlX2lkciA9IG5hbC0+dHlwZSA9PSBIMjY0X05BTF9JRFJfU0xJQ0U7CisKKyAgICBpZiAoaC0+c2VpLnJlY292ZXJ5X3BvaW50LnJlY292ZXJ5X2ZyYW1lX2NudCA+PSAwKSB7CisgICAgICAgIGNvbnN0IGludCBzZWlfcmVjb3ZlcnlfZnJhbWVfY250ID0gaC0+c2VpLnJlY292ZXJ5X3BvaW50LnJlY292ZXJ5X2ZyYW1lX2NudDsKKworICAgICAgICBpZiAoaC0+cG9jLmZyYW1lX251bSAhPSBzZWlfcmVjb3ZlcnlfZnJhbWVfY250IHx8IHNsLT5zbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICAgICAgIGgtPnZhbGlkX3JlY292ZXJ5X3BvaW50ID0gMTsKKworICAgICAgICBpZiAoICAgaC0+cmVjb3ZlcnlfZnJhbWUgPCAwCisgICAgICAgICAgICB8fCBhdl9tb2RfdWludHAyKGgtPnJlY292ZXJ5X2ZyYW1lIC0gaC0+cG9jLmZyYW1lX251bSwgaC0+cHMuc3BzLT5sb2cyX21heF9mcmFtZV9udW0pID4gc2VpX3JlY292ZXJ5X2ZyYW1lX2NudCkgeworICAgICAgICAgICAgaC0+cmVjb3ZlcnlfZnJhbWUgPSBhdl9tb2RfdWludHAyKGgtPnBvYy5mcmFtZV9udW0gKyBzZWlfcmVjb3ZlcnlfZnJhbWVfY250LCBoLT5wcy5zcHMtPmxvZzJfbWF4X2ZyYW1lX251bSk7CisKKyAgICAgICAgICAgIGlmICghaC0+dmFsaWRfcmVjb3ZlcnlfcG9pbnQpCisgICAgICAgICAgICAgICAgaC0+cmVjb3ZlcnlfZnJhbWUgPSBoLT5wb2MuZnJhbWVfbnVtOworICAgICAgICB9CisgICAgfQorCisgICAgaC0+Y3VyX3BpY19wdHItPmYtPmtleV9mcmFtZSB8PSAobmFsLT50eXBlID09IEgyNjRfTkFMX0lEUl9TTElDRSk7CisKKyAgICBpZiAobmFsLT50eXBlID09IEgyNjRfTkFMX0lEUl9TTElDRSB8fAorICAgICAgICAoaC0+cmVjb3ZlcnlfZnJhbWUgPT0gaC0+cG9jLmZyYW1lX251bSAmJiBuYWwtPnJlZl9pZGMpKSB7CisgICAgICAgIGgtPnJlY292ZXJ5X2ZyYW1lICAgICAgICAgPSAtMTsKKyAgICAgICAgaC0+Y3VyX3BpY19wdHItPnJlY292ZXJlZCA9IDE7CisgICAgfQorICAgIC8vIElmIHdlIGhhdmUgYW4gSURSLCBhbGwgZnJhbWVzIGFmdGVyIGl0IGluIGRlY29kZWQgb3JkZXIgYXJlCisgICAgLy8gInJlY292ZXJlZCIuCisgICAgaWYgKG5hbC0+dHlwZSA9PSBIMjY0X05BTF9JRFJfU0xJQ0UpCisgICAgICAgIGgtPmZyYW1lX3JlY292ZXJlZCB8PSBGUkFNRV9SRUNPVkVSRURfSURSOworI2lmIDEKKyAgICBoLT5jdXJfcGljX3B0ci0+cmVjb3ZlcmVkIHw9IGgtPmZyYW1lX3JlY292ZXJlZDsKKyNlbHNlCisgICAgaC0+Y3VyX3BpY19wdHItPnJlY292ZXJlZCB8PSAhIShoLT5mcmFtZV9yZWNvdmVyZWQgJiBGUkFNRV9SRUNPVkVSRURfSURSKTsKKyNlbmRpZgorCisgICAgLyogU2V0IHRoZSBmcmFtZSBwcm9wZXJ0aWVzL3NpZGUgZGF0YS4gT25seSBkb25lIGZvciB0aGUgc2Vjb25kIGZpZWxkIGluCisgICAgICogZmllbGQgY29kZWQgZnJhbWVzLCBzaW5jZSBzb21lIFNFSSBpbmZvcm1hdGlvbiBpcyBwcmVzZW50IGZvciBlYWNoIGZpZWxkCisgICAgICogYW5kIGlzIG1lcmdlZCBieSB0aGUgU0VJIHBhcnNpbmcgY29kZS4gKi8KKyAgICBpZiAoIUZJRUxEX1BJQ1RVUkUoaCkgfHwgIWgtPmZpcnN0X2ZpZWxkIHx8IGgtPm1pc3NpbmdfZmllbGRzID4gMSkgeworICAgICAgICByZXQgPSBoMjY0X2V4cG9ydF9mcmFtZV9wcm9wcyhoKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGgyNjRfc2VsZWN0X291dHB1dF9mcmFtZShoKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgyNjRfc2xpY2VfaGVhZGVyX3BhcnNlKGNvbnN0IEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NDVOQUwgKm5hbCkKK3sKKyAgICBjb25zdCBTUFMgKnNwczsKKyAgICBjb25zdCBQUFMgKnBwczsKKyAgICBpbnQgcmV0OworICAgIHVuc2lnbmVkIGludCBzbGljZV90eXBlLCB0bXAsIGk7CisgICAgaW50IGZpZWxkX3BpY19mbGFnLCBib3R0b21fZmllbGRfZmxhZzsKKyAgICBpbnQgZmlyc3Rfc2xpY2UgPSBzbCA9PSBoLT5zbGljZV9jdHggJiYgIWgtPmN1cnJlbnRfc2xpY2U7CisgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlOworCisgICAgaWYgKGZpcnN0X3NsaWNlKQorICAgICAgICBhdl9hc3NlcnQwKCFoLT5zZXR1cF9maW5pc2hlZCk7CisKKyAgICBzbC0+Zmlyc3RfbWJfYWRkciA9IGdldF91ZV9nb2xvbWJfbG9uZygmc2wtPmdiKTsKKworICAgIHNsaWNlX3R5cGUgPSBnZXRfdWVfZ29sb21iXzMxKCZzbC0+Z2IpOworICAgIGlmIChzbGljZV90eXBlID4gOSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJzbGljZSB0eXBlICVkIHRvbyBsYXJnZSBhdCAlZFxuIiwKKyAgICAgICAgICAgICAgIHNsaWNlX3R5cGUsIHNsLT5maXJzdF9tYl9hZGRyKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIHNsLT5yZXN5bmNfbWJfeCA9IHNsLT5tYl94ID0gIGZpcnN0X21iX2luX3NsaWNlICUgaC0+bWJfd2lkdGg7Ci0gICAgc2wtPnJlc3luY19tYl95ID0gc2wtPm1iX3kgPSAoZmlyc3RfbWJfaW5fc2xpY2UgLyBoLT5tYl93aWR0aCkgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCk7Ci0gICAgaWYgKGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKQotICAgICAgICBzbC0+cmVzeW5jX21iX3kgPSBzbC0+bWJfeSA9IHNsLT5tYl95ICsgMTsKLSAgICBhdl9hc3NlcnQxKHNsLT5tYl95IDwgaC0+bWJfaGVpZ2h0KTsKKyAgICBpZiAoc2xpY2VfdHlwZSA+IDQpIHsKKyAgICAgICAgc2xpY2VfdHlwZSAtPSA1OworICAgICAgICBzbC0+c2xpY2VfdHlwZV9maXhlZCA9IDE7CisgICAgfSBlbHNlCisgICAgICAgIHNsLT5zbGljZV90eXBlX2ZpeGVkID0gMDsKIAotICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7Ci0gICAgICAgIGgtPmN1cnJfcGljX251bSA9IGgtPmZyYW1lX251bTsKLSAgICAgICAgaC0+bWF4X3BpY19udW0gID0gMSA8PCBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGgtPmN1cnJfcGljX251bSA9IDIgKiBoLT5mcmFtZV9udW0gKyAxOwotICAgICAgICBoLT5tYXhfcGljX251bSAgPSAxIDw8IChoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtICsgMSk7CisgICAgc2xpY2VfdHlwZSAgICAgICAgID0gZmZfaDI2NF9nb2xvbWJfdG9fcGljdF90eXBlW3NsaWNlX3R5cGVdOworICAgIHNsLT5zbGljZV90eXBlICAgICA9IHNsaWNlX3R5cGU7CisgICAgc2wtPnNsaWNlX3R5cGVfbm9zID0gc2xpY2VfdHlwZSAmIDM7CisKKyAgICBpZiAobmFsLT50eXBlICA9PSBIMjY0X05BTF9JRFJfU0xJQ0UgJiYKKyAgICAgICAgc2wtPnNsaWNlX3R5cGVfbm9zICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQSBub24taW50cmEgc2xpY2UgaW4gYW4gSURSIE5BTCB1bml0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGlmIChoLT5uYWxfdW5pdF90eXBlID09IE5BTF9JRFJfU0xJQ0UpCisgICAgc2wtPnBwc19pZCA9IGdldF91ZV9nb2xvbWIoJnNsLT5nYik7CisgICAgaWYgKHNsLT5wcHNfaWQgPj0gTUFYX1BQU19DT1VOVCkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInBwc19pZCAldSBvdXQgb2YgcmFuZ2VcbiIsIHNsLT5wcHNfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgaWYgKCFoLT5wcy5wcHNfbGlzdFtzbC0+cHBzX2lkXSkgeworICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJub24tZXhpc3RpbmcgUFBTICV1IHJlZmVyZW5jZWRcbiIsCisgICAgICAgICAgICAgICBzbC0+cHBzX2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHBwcyA9IChjb25zdCBQUFMqKWgtPnBzLnBwc19saXN0W3NsLT5wcHNfaWRdLT5kYXRhOworCisgICAgaWYgKCFoLT5wcy5zcHNfbGlzdFtwcHMtPnNwc19pZF0pIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIFNQUyAldSByZWZlcmVuY2VkXG4iLCBwcHMtPnNwc19pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzcHMgPSAoY29uc3QgU1BTKiloLT5wcy5zcHNfbGlzdFtwcHMtPnNwc19pZF0tPmRhdGE7CisKKyAgICBzbC0+ZnJhbWVfbnVtID0gZ2V0X2JpdHMoJnNsLT5nYiwgc3BzLT5sb2cyX21heF9mcmFtZV9udW0pOworICAgIGlmICghZmlyc3Rfc2xpY2UpIHsKKyAgICAgICAgaWYgKGgtPnBvYy5mcmFtZV9udW0gIT0gc2wtPmZyYW1lX251bSkgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGcmFtZSBudW0gY2hhbmdlIGZyb20gJWQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgaC0+cG9jLmZyYW1lX251bSwgc2wtPmZyYW1lX251bSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNsLT5tYl9tYmFmZiAgICAgICA9IDA7CisKKyAgICBpZiAoc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnKSB7CisgICAgICAgIHBpY3R1cmVfc3RydWN0dXJlID0gUElDVF9GUkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXNwcy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAmJiBzbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoaXMgc3RyZWFtIHdhcyBnZW5lcmF0ZWQgYnkgYSBicm9rZW4gZW5jb2RlciwgaW52YWxpZCA4eDggaW5mZXJlbmNlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBmaWVsZF9waWNfZmxhZyA9IGdldF9iaXRzMSgmc2wtPmdiKTsKKyAgICAgICAgaWYgKGZpZWxkX3BpY19mbGFnKSB7CisgICAgICAgICAgICBib3R0b21fZmllbGRfZmxhZyA9IGdldF9iaXRzMSgmc2wtPmdiKTsKKyAgICAgICAgICAgIHBpY3R1cmVfc3RydWN0dXJlID0gUElDVF9UT1BfRklFTEQgKyBib3R0b21fZmllbGRfZmxhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBpY3R1cmVfc3RydWN0dXJlID0gUElDVF9GUkFNRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzbC0+cGljdHVyZV9zdHJ1Y3R1cmUgICAgICA9IHBpY3R1cmVfc3RydWN0dXJlOworICAgIHNsLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnID0gcGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKKworICAgIGlmIChwaWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7CisgICAgICAgIHNsLT5jdXJyX3BpY19udW0gPSBzbC0+ZnJhbWVfbnVtOworICAgICAgICBzbC0+bWF4X3BpY19udW0gID0gMSA8PCBzcHMtPmxvZzJfbWF4X2ZyYW1lX251bTsKKyAgICB9IGVsc2UgeworICAgICAgICBzbC0+Y3Vycl9waWNfbnVtID0gMiAqIHNsLT5mcmFtZV9udW0gKyAxOworICAgICAgICBzbC0+bWF4X3BpY19udW0gID0gMSA8PCAoc3BzLT5sb2cyX21heF9mcmFtZV9udW0gKyAxKTsKKyAgICB9CisKKyAgICBpZiAobmFsLT50eXBlID09IEgyNjRfTkFMX0lEUl9TTElDRSkKICAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKCZzbC0+Z2IpOyAvKiBpZHJfcGljX2lkICovCiAKLSAgICBpZiAoaC0+c3BzLnBvY190eXBlID09IDApIHsKLSAgICAgICAgaW50IHBvY19sc2IgPSBnZXRfYml0cygmc2wtPmdiLCBoLT5zcHMubG9nMl9tYXhfcG9jX2xzYik7CisgICAgaWYgKHNwcy0+cG9jX3R5cGUgPT0gMCkgeworICAgICAgICBzbC0+cG9jX2xzYiA9IGdldF9iaXRzKCZzbC0+Z2IsIHNwcy0+bG9nMl9tYXhfcG9jX2xzYik7CiAKLSAgICAgICAgaWYgKCFoLT5zZXR1cF9maW5pc2hlZCkKLSAgICAgICAgICAgIGgtPnBvY19sc2IgPSBwb2NfbHNiOwotCi0gICAgICAgIGlmIChoLT5wcHMucGljX29yZGVyX3ByZXNlbnQgPT0gMSAmJiBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FKSB7Ci0gICAgICAgICAgICBpbnQgZGVsdGFfcG9jX2JvdHRvbSA9IGdldF9zZV9nb2xvbWIoJnNsLT5nYik7Ci0gICAgICAgICAgICBpZiAoIWgtPnNldHVwX2ZpbmlzaGVkKQotICAgICAgICAgICAgICAgIGgtPmRlbHRhX3BvY19ib3R0b20gPSBkZWx0YV9wb2NfYm90dG9tOwotICAgICAgICB9CisgICAgICAgIGlmIChwcHMtPnBpY19vcmRlcl9wcmVzZW50ID09IDEgJiYgcGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkKKyAgICAgICAgICAgIHNsLT5kZWx0YV9wb2NfYm90dG9tID0gZ2V0X3NlX2dvbG9tYigmc2wtPmdiKTsKICAgICB9CiAKLSAgICBpZiAoaC0+c3BzLnBvY190eXBlID09IDEgJiYgIWgtPnNwcy5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZykgewotICAgICAgICBpbnQgZGVsdGFfcG9jID0gZ2V0X3NlX2dvbG9tYigmc2wtPmdiKTsKKyAgICBpZiAoc3BzLT5wb2NfdHlwZSA9PSAxICYmICFzcHMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnKSB7CisgICAgICAgIHNsLT5kZWx0YV9wb2NbMF0gPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOwogCi0gICAgICAgIGlmICghaC0+c2V0dXBfZmluaXNoZWQpCi0gICAgICAgICAgICBoLT5kZWx0YV9wb2NbMF0gPSBkZWx0YV9wb2M7Ci0KLSAgICAgICAgaWYgKGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudCA9PSAxICYmIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfRlJBTUUpIHsKLSAgICAgICAgICAgIGRlbHRhX3BvYyA9IGdldF9zZV9nb2xvbWIoJnNsLT5nYik7Ci0KLSAgICAgICAgICAgIGlmICghaC0+c2V0dXBfZmluaXNoZWQpCi0gICAgICAgICAgICAgICAgaC0+ZGVsdGFfcG9jWzFdID0gZGVsdGFfcG9jOwotICAgICAgICB9CisgICAgICAgIGlmIChwcHMtPnBpY19vcmRlcl9wcmVzZW50ID09IDEgJiYgcGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9GUkFNRSkKKyAgICAgICAgICAgIHNsLT5kZWx0YV9wb2NbMV0gPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOwogICAgIH0KIAotICAgIGlmICghaC0+c2V0dXBfZmluaXNoZWQpCi0gICAgICAgIGZmX2luaXRfcG9jKGgsIGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2MsICZoLT5jdXJfcGljX3B0ci0+cG9jKTsKLQotICAgIGlmIChoLT5wcHMucmVkdW5kYW50X3BpY19jbnRfcHJlc2VudCkKKyAgICBzbC0+cmVkdW5kYW50X3BpY19jb3VudCA9IDA7CisgICAgaWYgKHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudCkKICAgICAgICAgc2wtPnJlZHVuZGFudF9waWNfY291bnQgPSBnZXRfdWVfZ29sb21iKCZzbC0+Z2IpOwogCi0gICAgcmV0ID0gZmZfc2V0X3JlZl9jb3VudChoLCBzbCk7CisgICAgaWYgKHNsLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgc2wtPmRpcmVjdF9zcGF0aWFsX212X3ByZWQgPSBnZXRfYml0czEoJnNsLT5nYik7CisKKyAgICByZXQgPSBmZl9oMjY0X3BhcnNlX3JlZl9jb3VudCgmc2wtPmxpc3RfY291bnQsIHNsLT5yZWZfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsLT5nYiwgcHBzLCBzbC0+c2xpY2VfdHlwZV9ub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZV9zdHJ1Y3R1cmUsIGgtPmF2Y3R4KTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKLSAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9yZWZfcGljX2xpc3RfcmVvcmRlcmluZyhoLCBzbCk7CisgICAgICAgcmV0ID0gZmZfaDI2NF9kZWNvZGVfcmVmX3BpY19saXN0X3Jlb3JkZXJpbmcoc2wsIGgtPmF2Y3R4KTsKICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICBzbC0+cmVmX2NvdW50WzFdID0gc2wtPnJlZl9jb3VudFswXSA9IDA7CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgoaC0+cHBzLndlaWdodGVkX3ByZWQgJiYgc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB8fAotICAgICAgICAoaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMSAmJgotICAgICAgICAgc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSkKLSAgICAgICAgZmZfcHJlZF93ZWlnaHRfdGFibGUoaCwgc2wpOwotICAgIGVsc2UgaWYgKGgtPnBwcy53ZWlnaHRlZF9iaXByZWRfaWRjID09IDIgJiYKLSAgICAgICAgICAgICBzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKLSAgICAgICAgaW1wbGljaXRfd2VpZ2h0X3RhYmxlKGgsIHNsLCAtMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2wtPnVzZV93ZWlnaHQgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICBzbC0+bHVtYV93ZWlnaHRfZmxhZ1tpXSAgID0gMDsKLSAgICAgICAgICAgIHNsLT5jaHJvbWFfd2VpZ2h0X2ZsYWdbaV0gPSAwOwotICAgICAgICB9CisgICAgc2wtPnB3dC51c2Vfd2VpZ2h0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIHNsLT5wd3QubHVtYV93ZWlnaHRfZmxhZ1tpXSAgID0gMDsKKyAgICAgICAgc2wtPnB3dC5jaHJvbWFfd2VpZ2h0X2ZsYWdbaV0gPSAwOworICAgIH0KKyAgICBpZiAoKHBwcy0+d2VpZ2h0ZWRfcHJlZCAmJiBzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHx8CisgICAgICAgIChwcHMtPndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMSAmJgorICAgICAgICAgc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSkgeworICAgICAgICByZXQgPSBmZl9oMjY0X3ByZWRfd2VpZ2h0X3RhYmxlKCZzbC0+Z2IsIHNwcywgc2wtPnJlZl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+c2xpY2VfdHlwZV9ub3MsICZzbC0+cHd0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVfc3RydWN0dXJlLCBoLT5hdmN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICAvLyBJZiBmcmFtZS1tdCBpcyBlbmFibGVkLCBvbmx5IHVwZGF0ZSBtbWNvIHRhYmxlcyBmb3IgdGhlIGZpcnN0IHNsaWNlCi0gICAgLy8gaW4gYSBmaWVsZC4gU3Vic2VxdWVudCBzbGljZXMgY2FuIHRlbXBvcmFyaWx5IGNsb2JiZXIgaC0+bW1jb19pbmRleAotICAgIC8vIG9yIGgtPm1tY28sIHdoaWNoIHdpbGwgY2F1c2UgcmVmIGxpc3QgbWl4LXVwcyBhbmQgZGVjb2RpbmcgZXJyb3JzCi0gICAgLy8gZnVydGhlciBkb3duIHRoZSBsaW5lLiBUaGlzIG1heSBicmVhayBkZWNvZGluZyBpZiB0aGUgZmlyc3Qgc2xpY2UgaXMKLSAgICAvLyBjb3JydXB0LCB0aHVzIHdlIG9ubHkgZG8gdGhpcyBpZiBmcmFtZS1tdCBpcyBlbmFibGVkLgotICAgIGlmIChoLT5uYWxfcmVmX2lkYykgewotICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9yZWZfcGljX21hcmtpbmcoaCwgJnNsLT5nYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoaC0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmN1cnJlbnRfc2xpY2UgPT0gMCk7CisgICAgc2wtPmV4cGxpY2l0X3JlZl9tYXJraW5nID0gMDsKKyAgICBpZiAobmFsLT5yZWZfaWRjKSB7CisgICAgICAgIHJldCA9IGZmX2gyNjRfZGVjb2RlX3JlZl9waWNfbWFya2luZyhzbCwgJnNsLT5nYiwgbmFsLCBoLT5hdmN0eCk7CiAgICAgICAgIGlmIChyZXQgPCAwICYmIChoLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBpZiAoRlJBTUVfTUJBRkYoaCkpIHsKLSAgICAgICAgZmZfaDI2NF9maWxsX21iYWZmX3JlZl9saXN0KGgsIHNsKTsKLQotICAgICAgICBpZiAoaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMiAmJiBzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKLSAgICAgICAgICAgIGltcGxpY2l0X3dlaWdodF90YWJsZShoLCBzbCwgMCk7Ci0gICAgICAgICAgICBpbXBsaWNpdF93ZWlnaHRfdGFibGUoaCwgc2wsIDEpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNsLT5zbGljZV90eXBlX25vcyA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhc2wtPmRpcmVjdF9zcGF0aWFsX212X3ByZWQpCi0gICAgICAgIGZmX2gyNjRfZGlyZWN0X2Rpc3Rfc2NhbGVfZmFjdG9yKGgsIHNsKTsKLSAgICBmZl9oMjY0X2RpcmVjdF9yZWZfbGlzdF9pbml0KGgsIHNsKTsKLQotICAgIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kgJiYgaC0+cHBzLmNhYmFjKSB7CisgICAgaWYgKHNsLT5zbGljZV90eXBlX25vcyAhPSBBVl9QSUNUVVJFX1RZUEVfSSAmJiBwcHMtPmNhYmFjKSB7CiAgICAgICAgIHRtcCA9IGdldF91ZV9nb2xvbWJfMzEoJnNsLT5nYik7CiAgICAgICAgIGlmICh0bXAgPiAyKSB7CiAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNhYmFjX2luaXRfaWRjICV1IG92ZXJmbG93XG4iLCB0bXApOwpAQCAtMTc4OCwxNCArMTgzMiwxNCBAQAogICAgIH0KIAogICAgIHNsLT5sYXN0X3FzY2FsZV9kaWZmID0gMDsKLSAgICB0bXAgPSBoLT5wcHMuaW5pdF9xcCArIGdldF9zZV9nb2xvbWIoJnNsLT5nYik7Ci0gICAgaWYgKHRtcCA+IDUxICsgNiAqIChoLT5zcHMuYml0X2RlcHRoX2x1bWEgLSA4KSkgeworICAgIHRtcCA9IHBwcy0+aW5pdF9xcCArICh1bnNpZ25lZClnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOworICAgIGlmICh0bXAgPiA1MSArIDYgKiAoc3BzLT5iaXRfZGVwdGhfbHVtYSAtIDgpKSB7CiAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUVAgJXUgb3V0IG9mIHJhbmdlXG4iLCB0bXApOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAgICAgc2wtPnFzY2FsZSAgICAgICA9IHRtcDsKLSAgICBzbC0+Y2hyb21hX3FwWzBdID0gZ2V0X2Nocm9tYV9xcChoLCAwLCBzbC0+cXNjYWxlKTsKLSAgICBzbC0+Y2hyb21hX3FwWzFdID0gZ2V0X2Nocm9tYV9xcChoLCAxLCBzbC0+cXNjYWxlKTsKKyAgICBzbC0+Y2hyb21hX3FwWzBdID0gZ2V0X2Nocm9tYV9xcChwcHMsIDAsIHNsLT5xc2NhbGUpOworICAgIHNsLT5jaHJvbWFfcXBbMV0gPSBnZXRfY2hyb21hX3FwKHBwcywgMSwgc2wtPnFzY2FsZSk7CiAgICAgLy8gRklYTUUgcXNjYWxlIC8gcXAgLi4uIHN0dWZmCiAgICAgaWYgKHNsLT5zbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TUCkKICAgICAgICAgZ2V0X2JpdHMxKCZzbC0+Z2IpOyAvKiBzcF9mb3Jfc3dpdGNoX2ZsYWcgKi8KQEAgLTE4MDYsNyArMTg1MCw3IEBACiAgICAgc2wtPmRlYmxvY2tpbmdfZmlsdGVyICAgICA9IDE7CiAgICAgc2wtPnNsaWNlX2FscGhhX2MwX29mZnNldCA9IDA7CiAgICAgc2wtPnNsaWNlX2JldGFfb2Zmc2V0ICAgICA9IDA7Ci0gICAgaWYgKGgtPnBwcy5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQpIHsKKyAgICBpZiAocHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQpIHsKICAgICAgICAgdG1wID0gZ2V0X3VlX2dvbG9tYl8zMSgmc2wtPmdiKTsKICAgICAgICAgaWYgKHRtcCA+IDIpIHsKICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLApAQCAtMTgxOCw1OSArMTg2Miw5NCBAQAogICAgICAgICAgICAgc2wtPmRlYmxvY2tpbmdfZmlsdGVyIF49IDE7ICAvLyAxPC0+MAogCiAgICAgICAgIGlmIChzbC0+ZGVibG9ja2luZ19maWx0ZXIpIHsKLSAgICAgICAgICAgIHNsLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpICogMjsKLSAgICAgICAgICAgIHNsLT5zbGljZV9iZXRhX29mZnNldCAgICAgPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpICogMjsKLSAgICAgICAgICAgIGlmIChzbC0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0ID4gIDEyIHx8Ci0gICAgICAgICAgICAgICAgc2wtPnNsaWNlX2FscGhhX2MwX29mZnNldCA8IC0xMiB8fAotICAgICAgICAgICAgICAgIHNsLT5zbGljZV9iZXRhX29mZnNldCA+ICAxMiAgICAgfHwKLSAgICAgICAgICAgICAgICBzbC0+c2xpY2VfYmV0YV9vZmZzZXQgPCAtMTIpIHsKKyAgICAgICAgICAgIGludCBzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiA9IGdldF9zZV9nb2xvbWIoJnNsLT5nYik7CisgICAgICAgICAgICBpbnQgc2xpY2VfYmV0YV9vZmZzZXRfZGl2MiAgICAgPSBnZXRfc2VfZ29sb21iKCZzbC0+Z2IpOworICAgICAgICAgICAgaWYgKHNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyID4gIDYgfHwKKyAgICAgICAgICAgICAgICBzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiA8IC02IHx8CisgICAgICAgICAgICAgICAgc2xpY2VfYmV0YV9vZmZzZXRfZGl2MiA+ICA2ICAgICB8fAorICAgICAgICAgICAgICAgIHNsaWNlX2JldGFfb2Zmc2V0X2RpdjIgPCAtNikgewogICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVibG9ja2luZyBmaWx0ZXIgcGFyYW1ldGVycyAlZCAlZCBvdXQgb2YgcmFuZ2VcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNsLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQsIHNsLT5zbGljZV9iZXRhX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlX2FscGhhX2MwX29mZnNldF9kaXYyLCBzbGljZV9iZXRhX29mZnNldF9kaXYyKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNsLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgPSBzbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiAqIDI7CisgICAgICAgICAgICBzbC0+c2xpY2VfYmV0YV9vZmZzZXQgICAgID0gc2xpY2VfYmV0YV9vZmZzZXRfZGl2MiAqIDI7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICByZXR1cm4gMDsKK30KKworLyogZG8gYWxsIHRoZSBwZXItc2xpY2UgaW5pdGlhbGl6YXRpb24gbmVlZGVkIGJlZm9yZSB3ZSBjYW4gc3RhcnQgZGVjb2RpbmcgdGhlCisgKiBhY3R1YWwgTUJzICovCitzdGF0aWMgaW50IGgyNjRfc2xpY2VfaW5pdChIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIMjY0NU5BTCAqbmFsKQoreworICAgIGludCBpLCBqLCByZXQgPSAwOworCisgICAgaWYgKGgtPnBpY3R1cmVfaWRyICYmIG5hbC0+dHlwZSAhPSBIMjY0X05BTF9JRFJfU0xJQ0UpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1peCBvZiBJRFIgYW5kIG5vbi1JRFIgc2xpY2VzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MShoLT5tYl9udW0gPT0gaC0+bWJfd2lkdGggKiBoLT5tYl9oZWlnaHQpOworICAgIGlmIChzbC0+Zmlyc3RfbWJfYWRkciA8PCBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpID49IGgtPm1iX251bSB8fAorICAgICAgICBzbC0+Zmlyc3RfbWJfYWRkciA+PSBoLT5tYl9udW0pIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJmaXJzdF9tYl9pbl9zbGljZSBvdmVyZmxvd1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBzbC0+cmVzeW5jX21iX3ggPSBzbC0+bWJfeCA9ICBzbC0+Zmlyc3RfbWJfYWRkciAlIGgtPm1iX3dpZHRoOworICAgIHNsLT5yZXN5bmNfbWJfeSA9IHNsLT5tYl95ID0gKHNsLT5maXJzdF9tYl9hZGRyIC8gaC0+bWJfd2lkdGgpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpOworICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0JPVFRPTV9GSUVMRCkKKyAgICAgICAgc2wtPnJlc3luY19tYl95ID0gc2wtPm1iX3kgPSBzbC0+bWJfeSArIDE7CisgICAgYXZfYXNzZXJ0MShzbC0+bWJfeSA8IGgtPm1iX2hlaWdodCk7CisKKyAgICByZXQgPSBmZl9oMjY0X2J1aWxkX3JlZl9saXN0KGgsIHNsKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChoLT5wcy5wcHMtPndlaWdodGVkX2JpcHJlZF9pZGMgPT0gMiAmJgorICAgICAgICBzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgaW1wbGljaXRfd2VpZ2h0X3RhYmxlKGgsIHNsLCAtMSk7CisgICAgICAgIGlmIChGUkFNRV9NQkFGRihoKSkgeworICAgICAgICAgICAgaW1wbGljaXRfd2VpZ2h0X3RhYmxlKGgsIHNsLCAwKTsKKyAgICAgICAgICAgIGltcGxpY2l0X3dlaWdodF90YWJsZShoLCBzbCwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmICFzbC0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZCkKKyAgICAgICAgZmZfaDI2NF9kaXJlY3RfZGlzdF9zY2FsZV9mYWN0b3IoaCwgc2wpOworICAgIGlmICghaC0+c2V0dXBfZmluaXNoZWQpCisgICAgICAgIGZmX2gyNjRfZGlyZWN0X3JlZl9saXN0X2luaXQoaCwgc2wpOworCiAgICAgaWYgKGgtPmF2Y3R4LT5za2lwX2xvb3BfZmlsdGVyID49IEFWRElTQ0FSRF9BTEwgfHwKICAgICAgICAgKGgtPmF2Y3R4LT5za2lwX2xvb3BfZmlsdGVyID49IEFWRElTQ0FSRF9OT05LRVkgJiYKLSAgICAgICAgIGgtPm5hbF91bml0X3R5cGUgIT0gTkFMX0lEUl9TTElDRSkgfHwKKyAgICAgICAgIGgtPm5hbF91bml0X3R5cGUgIT0gSDI2NF9OQUxfSURSX1NMSUNFKSB8fAogICAgICAgICAoaC0+YXZjdHgtPnNraXBfbG9vcF9maWx0ZXIgPj0gQVZESVNDQVJEX05PTklOVFJBICYmCiAgICAgICAgICBzbC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHx8CiAgICAgICAgIChoLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfQklESVIgICYmCiAgICAgICAgICBzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHx8CiAgICAgICAgIChoLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfTk9OUkVGICYmCi0gICAgICAgICBoLT5uYWxfcmVmX2lkYyA9PSAwKSkKKyAgICAgICAgIG5hbC0+cmVmX2lkYyA9PSAwKSkKICAgICAgICAgc2wtPmRlYmxvY2tpbmdfZmlsdGVyID0gMDsKIAotICAgIGlmIChzbC0+ZGVibG9ja2luZ19maWx0ZXIgPT0gMSAmJiBoLT5tYXhfY29udGV4dHMgPiAxKSB7CisgICAgaWYgKHNsLT5kZWJsb2NraW5nX2ZpbHRlciA9PSAxICYmIGgtPm5iX3NsaWNlX2N0eCA+IDEpIHsKICAgICAgICAgaWYgKGgtPmF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9GQVNUKSB7CiAgICAgICAgICAgICAvKiBDaGVhdCBzbGlnaHRseSBmb3Igc3BlZWQ6CiAgICAgICAgICAgICAgKiBEbyBub3QgYm90aGVyIHRvIGRlYmxvY2sgYWNyb3NzIHNsaWNlcy4gKi8KICAgICAgICAgICAgIHNsLT5kZWJsb2NraW5nX2ZpbHRlciA9IDI7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBoLT5tYXhfY29udGV4dHMgPSAxOwotICAgICAgICAgICAgaWYgKCFoLT5zaW5nbGVfZGVjb2RlX3dhcm5pbmcpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHBhcmFsbGVsaXplIHNsaWNlIGRlY29kaW5nIHdpdGggZGVibG9ja2luZyBmaWx0ZXIgdHlwZSAxLCBkZWNvZGluZyBzdWNoIGZyYW1lcyBpbiBzZXF1ZW50aWFsIG9yZGVyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICJUbyBwYXJhbGxlbGl6ZSBzbGljZSBkZWNvZGluZyB5b3UgbmVlZCB2aWRlbyBlbmNvZGVkIHdpdGggZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9pZGMgc2V0IHRvIDIgKGRlYmxvY2sgb25seSBlZGdlcyB0aGF0IGRvIG5vdCBjcm9zcyBzbGljZXMpLlxuIgotICAgICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyB0aGUgZmxhZ3MyIGxpYmF2Y29kZWMgb3B0aW9uIHRvICtmYXN0ICgtZmxhZ3MyICtmYXN0KSB3aWxsIGRpc2FibGUgZGVibG9ja2luZyBhY3Jvc3Mgc2xpY2VzIGFuZCBlbmFibGUgcGFyYWxsZWwgc2xpY2UgZGVjb2RpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAiYnV0IHdpbGwgZ2VuZXJhdGUgbm9uLXN0YW5kYXJkLWNvbXBsaWFudCBvdXRwdXQuXG4iKTsKLSAgICAgICAgICAgICAgICBoLT5zaW5nbGVfZGVjb2RlX3dhcm5pbmcgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNsICE9IGgtPnNsaWNlX2N0eCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiRGVibG9ja2luZyBzd2l0Y2hlZCBpbnNpZGUgZnJhbWUuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gU0xJQ0VfU0lOR0xFVEhSRUFEOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaC0+cG9zdHBvbmVfZmlsdGVyID0gMTsKICAgICAgICAgfQogICAgIH0KICAgICBzbC0+cXBfdGhyZXNoID0gMTUgLQogICAgICAgICAgICAgICAgICAgIEZGTUlOKHNsLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQsIHNsLT5zbGljZV9iZXRhX29mZnNldCkgLQogICAgICAgICAgICAgICAgICAgIEZGTUFYMygwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHBzLmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMV0pICsKLSAgICAgICAgICAgICAgICAgICA2ICogKGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAtIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcy5wcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBzLnBwcy0+Y2hyb21hX3FwX2luZGV4X29mZnNldFsxXSkgKworICAgICAgICAgICAgICAgICAgIDYgKiAoaC0+cHMuc3BzLT5iaXRfZGVwdGhfbHVtYSAtIDgpOwogCiAgICAgc2wtPnNsaWNlX251bSAgICAgICA9ICsraC0+Y3VycmVudF9zbGljZTsKIApAQCAtMTg4NSw3ICsxOTY0LDcgQEAKIAogICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKICAgICAgICAgaW50IGlkX2xpc3RbMTZdOwotICAgICAgICBpbnQgKnJlZjJmcm0gPSBzbC0+cmVmMmZybVtzbC0+c2xpY2VfbnVtICYgKE1BWF9TTElDRVMgLSAxKV1bal07CisgICAgICAgIGludCAqcmVmMmZybSA9IGgtPnJlZjJmcm1bc2wtPnNsaWNlX251bSAmIChNQVhfU0xJQ0VTIC0gMSldW2pdOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICAgICAgaWRfbGlzdFtpXSA9IDYwOwogICAgICAgICAgICAgaWYgKGogPCBzbC0+bGlzdF9jb3VudCAmJiBpIDwgc2wtPnJlZl9jb3VudFtqXSAmJgpAQCAtMTkxNiwzNSArMTk5NSwxNTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNsLT5yZWZfbGlzdFtqXVtpXS5yZWZlcmVuY2UgJiAzKTsKICAgICB9CiAKLSAgICBoLT5hdV9wcHNfaWQgPSBwcHNfaWQ7Ci0gICAgaC0+c3BzLm5ldyA9Ci0gICAgaC0+c3BzX2J1ZmZlcnNbaC0+cHBzLnNwc19pZF0tPm5ldyA9IDA7Ci0gICAgaC0+Y3VycmVudF9zcHNfaWQgPSBoLT5wcHMuc3BzX2lkOwotCiAgICAgaWYgKGgtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgewogICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywKLSAgICAgICAgICAgICAgICJzbGljZTolZCAlcyBtYjolZCAlYyVzJXMgcHBzOiV1IGZyYW1lOiVkIHBvYzolZC8lZCByZWY6JWQvJWQgcXA6JWQgbG9vcDolZDolZDolZCB3ZWlnaHQ6JWQlcyAlc1xuIiwKKyAgICAgICAgICAgICAgICJzbGljZTolZCAlcyBtYjolZCAlYyVzJXMgZnJhbWU6JWQgcG9jOiVkLyVkIHJlZjolZC8lZCBxcDolZCBsb29wOiVkOiVkOiVkIHdlaWdodDolZCVzICVzXG4iLAogICAgICAgICAgICAgICAgc2wtPnNsaWNlX251bSwKICAgICAgICAgICAgICAgIChoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FID8gIkYiIDogaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9UT1BfRklFTEQgPyAiVCIgOiAiQiIpLAotICAgICAgICAgICAgICAgZmlyc3RfbWJfaW5fc2xpY2UsCisgICAgICAgICAgICAgICBzbC0+bWJfeSAqIGgtPm1iX3dpZHRoICsgc2wtPm1iX3gsCiAgICAgICAgICAgICAgICBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIoc2wtPnNsaWNlX3R5cGUpLAogICAgICAgICAgICAgICAgc2wtPnNsaWNlX3R5cGVfZml4ZWQgPyAiIGZpeCIgOiAiIiwKLSAgICAgICAgICAgICAgIGgtPm5hbF91bml0X3R5cGUgPT0gTkFMX0lEUl9TTElDRSA/ICIgSURSIiA6ICIiLAotICAgICAgICAgICAgICAgcHBzX2lkLCBoLT5mcmFtZV9udW0sCisgICAgICAgICAgICAgICBuYWwtPnR5cGUgPT0gSDI2NF9OQUxfSURSX1NMSUNFID8gIiBJRFIiIDogIiIsCisgICAgICAgICAgICAgICBoLT5wb2MuZnJhbWVfbnVtLAogICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHItPmZpZWxkX3BvY1swXSwKICAgICAgICAgICAgICAgIGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2NbMV0sCiAgICAgICAgICAgICAgICBzbC0+cmVmX2NvdW50WzBdLCBzbC0+cmVmX2NvdW50WzFdLAogICAgICAgICAgICAgICAgc2wtPnFzY2FsZSwKICAgICAgICAgICAgICAgIHNsLT5kZWJsb2NraW5nX2ZpbHRlciwKICAgICAgICAgICAgICAgIHNsLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQsIHNsLT5zbGljZV9iZXRhX29mZnNldCwKLSAgICAgICAgICAgICAgIHNsLT51c2Vfd2VpZ2h0LAotICAgICAgICAgICAgICAgc2wtPnVzZV93ZWlnaHQgPT0gMSAmJiBzbC0+dXNlX3dlaWdodF9jaHJvbWEgPyAiYyIgOiAiIiwKKyAgICAgICAgICAgICAgIHNsLT5wd3QudXNlX3dlaWdodCwKKyAgICAgICAgICAgICAgIHNsLT5wd3QudXNlX3dlaWdodCA9PSAxICYmIHNsLT5wd3QudXNlX3dlaWdodF9jaHJvbWEgPyAiYyIgOiAiIiwKICAgICAgICAgICAgICAgIHNsLT5zbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CID8gKHNsLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkID8gIlNQQVQiIDogIlRFTVAiKSA6ICIiKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IGZmX2gyNjRfcXVldWVfZGVjb2RlX3NsaWNlKEgyNjRDb250ZXh0ICpoLCBjb25zdCBIMjY0NU5BTCAqbmFsKQoreworICAgIEgyNjRTbGljZUNvbnRleHQgKnNsID0gaC0+c2xpY2VfY3R4ICsgaC0+bmJfc2xpY2VfY3R4X3F1ZXVlZDsKKyAgICBpbnQgZmlyc3Rfc2xpY2UgPSBzbCA9PSBoLT5zbGljZV9jdHggJiYgIWgtPmN1cnJlbnRfc2xpY2U7CisgICAgaW50IHJldDsKKworICAgIHNsLT5nYiA9IG5hbC0+Z2I7CisKKyAgICByZXQgPSBoMjY0X3NsaWNlX2hlYWRlcl9wYXJzZShoLCBzbCwgbmFsKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIGRpc2NhcmQgcmVkdW5kYW50IHBpY3R1cmVzCisgICAgaWYgKHNsLT5yZWR1bmRhbnRfcGljX2NvdW50ID4gMCkgeworICAgICAgICBzbC0+cmVmX2NvdW50WzBdID0gc2wtPnJlZl9jb3VudFsxXSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChzbC0+Zmlyc3RfbWJfYWRkciA9PSAwIHx8ICFoLT5jdXJyZW50X3NsaWNlKSB7CisgICAgICAgIGlmIChoLT5zZXR1cF9maW5pc2hlZCkgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBmaWVsZHNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc2wtPmZpcnN0X21iX2FkZHIgPT0gMCkgeyAvLyBGSVhNRSBiZXR0ZXIgZmllbGQgYm91bmRhcnkgZGV0ZWN0aW9uCisgICAgICAgIGlmIChoLT5jdXJyZW50X3NsaWNlKSB7CisgICAgICAgICAgICAvLyB0aGlzIHNsaWNlIHN0YXJ0cyBhIG5ldyBmaWVsZAorICAgICAgICAgICAgLy8gZmlyc3QgZGVjb2RlIGFueSBwZW5kaW5nIHF1ZXVlZCBzbGljZXMKKyAgICAgICAgICAgIGlmIChoLT5uYl9zbGljZV9jdHhfcXVldWVkKSB7CisgICAgICAgICAgICAgICAgSDI2NFNsaWNlQ29udGV4dCB0bXBfY3R4OworCisgICAgICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9leGVjdXRlX2RlY29kZV9zbGljZXMoaCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIG1lbWNweSgmdG1wX2N0eCwgaC0+c2xpY2VfY3R4LCBzaXplb2YodG1wX2N0eCkpOworICAgICAgICAgICAgICAgIG1lbWNweShoLT5zbGljZV9jdHgsIHNsLCBzaXplb2YodG1wX2N0eCkpOworICAgICAgICAgICAgICAgIG1lbWNweShzbCwgJnRtcF9jdHgsIHNpemVvZih0bXBfY3R4KSk7CisgICAgICAgICAgICAgICAgc2wgPSBoLT5zbGljZV9jdHg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoLT5jdXJfcGljX3B0ciAmJiBGSUVMRF9QSUNUVVJFKGgpICYmIGgtPmZpcnN0X2ZpZWxkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9maWVsZF9lbmQoaCwgaC0+c2xpY2VfY3R4LCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaC0+Y3VyX3BpY19wdHIgJiYgIUZJRUxEX1BJQ1RVUkUoaCkgJiYgIWgtPmZpcnN0X2ZpZWxkICYmIGgtPm5hbF91bml0X3R5cGUgID09IEgyNjRfTkFMX0lEUl9TTElDRSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywgIkJyb2tlbiBmcmFtZSBwYWNrZXRpemluZ1xuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9maWVsZF9lbmQoaCwgaC0+c2xpY2VfY3R4LCAxKTsKKyAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZoLT5jdXJfcGljX3B0ci0+dGYsIElOVF9NQVgsIDApOworICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmgtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwgMSk7CisgICAgICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWgtPmZpcnN0X2ZpZWxkKSB7CisgICAgICAgICAgICBpZiAoaC0+Y3VyX3BpY19wdHIgJiYgIWgtPmRyb3BwYWJsZSkgeworICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmgtPmN1cl9waWNfcHRyLT50ZiwgSU5UX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGgtPmN1cl9waWNfcHRyID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghaC0+Y3VycmVudF9zbGljZSkKKyAgICAgICAgYXZfYXNzZXJ0MChzbCA9PSBoLT5zbGljZV9jdHgpOworCisgICAgaWYgKGgtPmN1cnJlbnRfc2xpY2UgPT0gMCAmJiAhaC0+Zmlyc3RfZmllbGQpIHsKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgKGgtPmF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05SRUYgJiYgIWgtPm5hbF9yZWZfaWRjKSB8fAorICAgICAgICAgICAgKGgtPmF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9CSURJUiAgJiYgc2wtPnNsaWNlX3R5cGVfbm9zID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB8fAorICAgICAgICAgICAgKGgtPmF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05JTlRSQSAmJiBzbC0+c2xpY2VfdHlwZV9ub3MgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHx8CisgICAgICAgICAgICAoaC0+YXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTktFWSAmJiBoLT5uYWxfdW5pdF90eXBlICE9IEgyNjRfTkFMX0lEUl9TTElDRSAmJiBoLT5zZWkucmVjb3ZlcnlfcG9pbnQucmVjb3ZlcnlfZnJhbWVfY250IDwgMCkgfHwKKyAgICAgICAgICAgIGgtPmF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9BTEwpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmaXJzdF9zbGljZSkgeworICAgICAgICBjb25zdCBQUFMgKnBwcyA9IChjb25zdCBQUFMqKWgtPnBzLnBwc19saXN0W3NsLT5wcHNfaWRdLT5kYXRhOworCisgICAgICAgIGlmIChoLT5wcy5wcHMtPnNwc19pZCAhPSBwcHMtPnNwc19pZCB8fAorICAgICAgICAgICAgaC0+cHMucHBzLT50cmFuc2Zvcm1fOHg4X21vZGUgIT0gcHBzLT50cmFuc2Zvcm1fOHg4X21vZGUgLyp8fAorICAgICAgICAgICAgKGgtPnNldHVwX2ZpbmlzaGVkICYmIGgtPnBzLnBwcyAhPSBwcHMpKi8pIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUFBTIGNoYW5nZWQgYmV0d2VlbiBzbGljZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGgtPnBzLnNwcyAhPSAoY29uc3QgU1BTKiloLT5wcy5zcHNfbGlzdFtoLT5wcy5wcHMtPnNwc19pZF0tPmRhdGEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlNQUyBjaGFuZ2VkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGgtPmN1cnJlbnRfc2xpY2UgPT0gMCkgeworICAgICAgICByZXQgPSBoMjY0X2ZpZWxkX3N0YXJ0KGgsIHNsLCBuYWwsIGZpcnN0X3NsaWNlKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBzbC0+cGljdHVyZV9zdHJ1Y3R1cmUgfHwKKyAgICAgICAgICAgIGgtPmRyb3BwYWJsZSAgICAgICAgICE9IChuYWwtPnJlZl9pZGMgPT0gMCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDaGFuZ2luZyBmaWVsZCBtb2RlICglZCAtPiAlZCkgYmV0d2VlbiBzbGljZXMgaXMgbm90IGFsbG93ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUsIHNsLT5waWN0dXJlX3N0cnVjdHVyZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfSBlbHNlIGlmICghaC0+Y3VyX3BpY19wdHIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJ1bnNldCBjdXJfcGljX3B0ciBvbiBzbGljZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBoLT5jdXJyZW50X3NsaWNlICsgMSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IGgyNjRfc2xpY2VfaW5pdChoLCBzbCwgbmFsKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGgtPm5iX3NsaWNlX2N0eF9xdWV1ZWQrKzsKKworICAgIHJldHVybiAwOworfQorCiBpbnQgZmZfaDI2NF9nZXRfc2xpY2VfdHlwZShjb25zdCBIMjY0U2xpY2VDb250ZXh0ICpzbCkKIHsKICAgICBzd2l0Y2ggKHNsLT5zbGljZV90eXBlKSB7CkBAIC0xOTc4LDcgKzIxNzcsNyBAQAogICAgICAgICBpZiAoVVNFU19MSVNUKHRvcF90eXBlLCBsaXN0KSkgewogICAgICAgICAgICAgY29uc3QgaW50IGJfeHkgID0gaC0+bWIyYl94eVt0b3BfeHldICsgMyAqIGJfc3RyaWRlOwogICAgICAgICAgICAgY29uc3QgaW50IGI4X3h5ID0gNCAqIHRvcF94eSArIDI7Ci0gICAgICAgICAgICBpbnQgKnJlZjJmcm0gPSBzbC0+cmVmMmZybVtoLT5zbGljZV90YWJsZVt0b3BfeHldICYgKE1BWF9TTElDRVMgLSAxKV1bbGlzdF0gKyAoTUJfTUJBRkYoc2wpID8gMjAgOiAyKTsKKyAgICAgICAgICAgIGNvbnN0IGludCAqcmVmMmZybSA9ICZoLT5yZWYyZnJtW2gtPnNsaWNlX3RhYmxlW3RvcF94eV0gJiAoTUFYX1NMSUNFUyAtIDEpXVtsaXN0XVsoTUJfTUJBRkYoc2wpID8gMjAgOiAyKV07CiAgICAgICAgICAgICBBVl9DT1BZMTI4KG12X2RzdCAtIDEgKiA4LCBoLT5jdXJfcGljLm1vdGlvbl92YWxbbGlzdF1bYl94eSArIDBdKTsKICAgICAgICAgICAgIHJlZl9jYWNoZVswIC0gMSAqIDhdID0KICAgICAgICAgICAgIHJlZl9jYWNoZVsxIC0gMSAqIDhdID0gcmVmMmZybVtoLT5jdXJfcGljLnJlZl9pbmRleFtsaXN0XVtiOF94eSArIDBdXTsKQEAgLTE5OTMsNyArMjE5Miw3IEBACiAgICAgICAgICAgICBpZiAoVVNFU19MSVNUKGxlZnRfdHlwZVtMVE9QXSwgbGlzdCkpIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYl94eSAgPSBoLT5tYjJiX3h5W2xlZnRfeHlbTFRPUF1dICsgMzsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYjhfeHkgPSA0ICogbGVmdF94eVtMVE9QXSArIDE7Ci0gICAgICAgICAgICAgICAgaW50ICpyZWYyZnJtID0gc2wtPnJlZjJmcm1baC0+c2xpY2VfdGFibGVbbGVmdF94eVtMVE9QXV0gJiAoTUFYX1NMSUNFUyAtIDEpXVtsaXN0XSArIChNQl9NQkFGRihzbCkgPyAyMCA6IDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCAqcmVmMmZybSA9ICZoLT5yZWYyZnJtW2gtPnNsaWNlX3RhYmxlW2xlZnRfeHlbTFRPUF1dICYgKE1BWF9TTElDRVMgLSAxKV1bbGlzdF1bKE1CX01CQUZGKHNsKSA/IDIwIDogMildOwogICAgICAgICAgICAgICAgIEFWX0NPUFkzMihtdl9kc3QgLSAxICsgIDAsIGgtPmN1cl9waWMubW90aW9uX3ZhbFtsaXN0XVtiX3h5ICsgYl9zdHJpZGUgKiAwXSk7CiAgICAgICAgICAgICAgICAgQVZfQ09QWTMyKG12X2RzdCAtIDEgKyAgOCwgaC0+Y3VyX3BpYy5tb3Rpb25fdmFsW2xpc3RdW2JfeHkgKyBiX3N0cmlkZSAqIDFdKTsKICAgICAgICAgICAgICAgICBBVl9DT1BZMzIobXZfZHN0IC0gMSArIDE2LCBoLT5jdXJfcGljLm1vdGlvbl92YWxbbGlzdF1bYl94eSArIGJfc3RyaWRlICogMl0pOwpAQCAtMjAyNiw3ICsyMjI1LDcgQEAKIAogICAgIHsKICAgICAgICAgaW50OF90ICpyZWYgPSAmaC0+Y3VyX3BpYy5yZWZfaW5kZXhbbGlzdF1bNCAqIG1iX3h5XTsKLSAgICAgICAgaW50ICpyZWYyZnJtID0gc2wtPnJlZjJmcm1bc2wtPnNsaWNlX251bSAmIChNQVhfU0xJQ0VTIC0gMSldW2xpc3RdICsgKE1CX01CQUZGKHNsKSA/IDIwIDogMik7CisgICAgICAgIGNvbnN0IGludCAqcmVmMmZybSA9ICZoLT5yZWYyZnJtW3NsLT5zbGljZV9udW0gJiAoTUFYX1NMSUNFUyAtIDEpXVtsaXN0XVsoTUJfTUJBRkYoc2wpID8gMjAgOiAyKV07CiAgICAgICAgIHVpbnQzMl90IHJlZjAxID0gKHBhY2sxNnRvMzIocmVmMmZybVtyZWZbMF1dLCByZWYyZnJtW3JlZlsxXV0pICYgMHgwMEZGMDBGRikgKiAweDAxMDE7CiAgICAgICAgIHVpbnQzMl90IHJlZjIzID0gKHBhY2sxNnRvMzIocmVmMmZybVtyZWZbMl1dLCByZWYyZnJtW3JlZlszXV0pICYgMHgwMEZGMDBGRikgKiAweDAxMDE7CiAgICAgICAgIEFWX1dOMzJBKCZyZWZfY2FjaGVbMCAqIDhdLCByZWYwMSk7CkBAIC0yMDQ1LDcgKzIyNDQsNiBAQAogfQogCiAvKioKLSAqCiAgKiBAcmV0dXJuIG5vbiB6ZXJvIGlmIHRoZSBsb29wIGZpbHRlciBjYW4gYmUgc2tpcHBlZAogICovCiBzdGF0aWMgaW50IGZpbGxfZmlsdGVyX2NhY2hlcyhjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsIGludCBtYl90eXBlKQpAQCAtMjA1OCw5ICsyMjU2LDYgQEAKIAogICAgIHRvcF94eSA9IG1iX3h5IC0gKGgtPm1iX3N0cmlkZSA8PCBNQl9GSUVMRChzbCkpOwogCi0gICAgLyogV293LCB3aGF0IGEgbWVzcywgd2h5IGRpZG4ndCB0aGV5IHNpbXBsaWZ5IHRoZSBpbnRlcmxhY2luZyAmIGludHJhCi0gICAgICogc3R1ZmYsIEkgY2FuJ3QgaW1hZ2luZSB0aGF0IHRoZXNlIGNvbXBsZXggcnVsZXMgYXJlIHdvcnRoIGl0LiAqLwotCiAgICAgbGVmdF94eVtMQk9UXSA9IGxlZnRfeHlbTFRPUF0gPSBtYl94eSAtIDE7CiAgICAgaWYgKEZSQU1FX01CQUZGKGgpKSB7CiAgICAgICAgIGNvbnN0IGludCBsZWZ0X21iX2ZpZWxkX2ZsYWcgPSBJU19JTlRFUkxBQ0VEKGgtPmN1cl9waWMubWJfdHlwZVttYl94eSAtIDFdKTsKQEAgLTIxNTEsNyArMjM0Niw3IEBACiAKICAgICAvKiBDQVZMQyA4eDhkY3QgcmVxdWlyZXMgTk5aIHZhbHVlcyBmb3IgcmVzaWR1YWwgZGVjb2RpbmcgdGhhdCBkaWZmZXIKICAgICAgKiBmcm9tIHdoYXQgdGhlIGxvb3AgZmlsdGVyIG5lZWRzICovCi0gICAgaWYgKCFDQUJBQyhoKSAmJiBoLT5wcHMudHJhbnNmb3JtXzh4OF9tb2RlKSB7CisgICAgaWYgKCFDQUJBQyhoKSAmJiBoLT5wcy5wcHMtPnRyYW5zZm9ybV84eDhfbW9kZSkgewogICAgICAgICBpZiAoSVNfOHg4RENUKHRvcF90eXBlKSkgewogICAgICAgICAgICAgbm56X2NhY2hlWzQgKyA4ICogMF0gPQogICAgICAgICAgICAgbm56X2NhY2hlWzUgKyA4ICogMF0gPSAoaC0+Y2JwX3RhYmxlW3RvcF94eV0gJiAweDQwMDApID4+IDEyOwpAQCAtMjIwMiwxNCArMjM5NywxNSBAQAogICAgIGNvbnN0IGludCBwaXhlbF9zaGlmdCAgICA9IGgtPnBpeGVsX3NoaWZ0OwogICAgIGNvbnN0IGludCBibG9ja19oICAgICAgICA9IDE2ID4+IGgtPmNocm9tYV95X3NoaWZ0OwogCisgICAgaWYgKGgtPnBvc3Rwb25lX2ZpbHRlcikKKyAgICAgICAgcmV0dXJuOworCiAgICAgaWYgKHNsLT5kZWJsb2NraW5nX2ZpbHRlcikgewogICAgICAgICBmb3IgKG1iX3ggPSBzdGFydF94OyBtYl94IDwgZW5kX3g7IG1iX3grKykKICAgICAgICAgICAgIGZvciAobWJfeSA9IGVuZF9tYl95IC0gRlJBTUVfTUJBRkYoaCk7IG1iX3kgPD0gZW5kX21iX3k7IG1iX3krKykgewogICAgICAgICAgICAgICAgIGludCBtYl94eSwgbWJfdHlwZTsKICAgICAgICAgICAgICAgICBtYl94eSAgICAgICAgID0gc2wtPm1iX3h5ID0gbWJfeCArIG1iX3kgKiBoLT5tYl9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgc2wtPnNsaWNlX251bSA9IGgtPnNsaWNlX3RhYmxlW21iX3h5XTsKICAgICAgICAgICAgICAgICBtYl90eXBlICAgICAgID0gaC0+Y3VyX3BpYy5tYl90eXBlW21iX3h5XTsKLSAgICAgICAgICAgICAgICBzbC0+bGlzdF9jb3VudCA9IGgtPmxpc3RfY291bnRzW21iX3h5XTsKIAogICAgICAgICAgICAgICAgIGlmIChGUkFNRV9NQkFGRihoKSkKICAgICAgICAgICAgICAgICAgICAgc2wtPm1iX21iYWZmICAgICAgICAgICAgICAgPQpAQCAtMjI0Myw4ICsyNDM5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIDApOwogICAgICAgICAgICAgICAgIGlmIChmaWxsX2ZpbHRlcl9jYWNoZXMoaCwgc2wsIG1iX3R5cGUpKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBzbC0+Y2hyb21hX3FwWzBdID0gZ2V0X2Nocm9tYV9xcChoLCAwLCBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYl94eV0pOwotICAgICAgICAgICAgICAgIHNsLT5jaHJvbWFfcXBbMV0gPSBnZXRfY2hyb21hX3FwKGgsIDEsIGgtPmN1cl9waWMucXNjYWxlX3RhYmxlW21iX3h5XSk7CisgICAgICAgICAgICAgICAgc2wtPmNocm9tYV9xcFswXSA9IGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAwLCBoLT5jdXJfcGljLnFzY2FsZV90YWJsZVttYl94eV0pOworICAgICAgICAgICAgICAgIHNsLT5jaHJvbWFfcXBbMV0gPSBnZXRfY2hyb21hX3FwKGgtPnBzLnBwcywgMSwgaC0+Y3VyX3BpYy5xc2NhbGVfdGFibGVbbWJfeHldKTsKIAogICAgICAgICAgICAgICAgIGlmIChGUkFNRV9NQkFGRihoKSkgewogICAgICAgICAgICAgICAgICAgICBmZl9oMjY0X2ZpbHRlcl9tYihoLCBzbCwgbWJfeCwgbWJfeSwgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyLApAQCAtMjI1OCw4ICsyNDU0LDggQEAKICAgICBzbC0+c2xpY2VfdHlwZSAgPSBvbGRfc2xpY2VfdHlwZTsKICAgICBzbC0+bWJfeCAgICAgICAgID0gZW5kX3g7CiAgICAgc2wtPm1iX3kgICAgICAgICA9IGVuZF9tYl95IC0gRlJBTUVfTUJBRkYoaCk7Ci0gICAgc2wtPmNocm9tYV9xcFswXSA9IGdldF9jaHJvbWFfcXAoaCwgMCwgc2wtPnFzY2FsZSk7Ci0gICAgc2wtPmNocm9tYV9xcFsxXSA9IGdldF9jaHJvbWFfcXAoaCwgMSwgc2wtPnFzY2FsZSk7CisgICAgc2wtPmNocm9tYV9xcFswXSA9IGdldF9jaHJvbWFfcXAoaC0+cHMucHBzLCAwLCBzbC0+cXNjYWxlKTsKKyAgICBzbC0+Y2hyb21hX3FwWzFdID0gZ2V0X2Nocm9tYV9xcChoLT5wcy5wcHMsIDEsIHNsLT5xc2NhbGUpOwogfQogCiBzdGF0aWMgdm9pZCBwcmVkaWN0X2ZpZWxkX2RlY29kaW5nX2ZsYWcoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsKQpAQCAtMjMyNSw2ICsyNTIxLDcgQEAKICAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCA9IGFyZzsKICAgICBjb25zdCBIMjY0Q29udGV4dCAqaCA9IHNsLT5oMjY0OwogICAgIGludCBsZl94X3N0YXJ0ID0gc2wtPm1iX3g7CisgICAgaW50IG9yaWdfZGVibG9jayA9IHNsLT5kZWJsb2NraW5nX2ZpbHRlcjsKICAgICBpbnQgcmV0OwogCiAgICAgc2wtPmxpbmVzaXplICAgPSBoLT5jdXJfcGljX3B0ci0+Zi0+bGluZXNpemVbMF07CkBAIC0yMzM4LDggKzI1MzUsMTAgQEAKIAogICAgIGF2X2Fzc2VydDAoaC0+YmxvY2tfb2Zmc2V0WzE1XSA9PSAoNCAqICgoc2NhbjhbMTVdIC0gc2NhbjhbMF0pICYgNykgPDwgaC0+cGl4ZWxfc2hpZnQpICsgNCAqIHNsLT5saW5lc2l6ZSAqICgoc2NhbjhbMTVdIC0gc2NhbjhbMF0pID4+IDMpKTsKIAorICAgIGlmIChoLT5wb3N0cG9uZV9maWx0ZXIpCisgICAgICAgIHNsLT5kZWJsb2NraW5nX2ZpbHRlciA9IDA7CisKICAgICBzbC0+aXNfY29tcGxleCA9IEZSQU1FX01CQUZGKGgpIHx8IGgtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUgfHwKLSAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjY0IHx8CiAgICAgICAgICAgICAgICAgICAgICAoQ09ORklHX0dSQVkgJiYgKGgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSk7CiAKICAgICBpZiAoIShoLT5hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSAmJiBoLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FICYmIGgtPnNsaWNlX2N0eFswXS5lci5lcnJvcl9zdGF0dXNfdGFibGUpIHsKQEAgLTIzNTIsNyArMjU1MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoaC0+cHBzLmNhYmFjKSB7CisgICAgaWYgKGgtPnBzLnBwcy0+Y2FiYWMpIHsKICAgICAgICAgLyogcmVhbGlnbiAqLwogICAgICAgICBhbGlnbl9nZXRfYml0cygmc2wtPmdiKTsKIApAQCAtMjQwMCw3ICsyNTk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm1iX3ksIEVSX01CX0VORCk7CiAgICAgICAgICAgICAgICAgaWYgKHNsLT5tYl94ID49IGxmX3hfc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgIGxvb3BfZmlsdGVyKGgsIHNsLCBsZl94X3N0YXJ0LCBzbC0+bWJfeCArIDEpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHNsLT5jYWJhYy5ieXRlc3RyZWFtID4gc2wtPmNhYmFjLmJ5dGVzdHJlYW1fZW5kICsgMiApCiAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJieXRlc3RyZWFtIG92ZXJyZWFkICUiUFRSRElGRl9TUEVDSUZJRVIiXG4iLCBzbC0+Y2FiYWMuYnl0ZXN0cmVhbV9lbmQgLSBzbC0+Y2FiYWMuYnl0ZXN0cmVhbSk7CkBAIC0yNDMzLDcgKzI2MzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+bWJfeSwgRVJfTUJfRU5EKTsKICAgICAgICAgICAgICAgICBpZiAoc2wtPm1iX3ggPiBsZl94X3N0YXJ0KQogICAgICAgICAgICAgICAgICAgICBsb29wX2ZpbHRlcihoLCBzbCwgbGZfeF9zdGFydCwgc2wtPm1iX3gpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTI0OTAsNyArMjY4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBlcl9hZGRfc2xpY2Uoc2wsIHNsLT5yZXN5bmNfbWJfeCwgc2wtPnJlc3luY19tYl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5tYl94IC0gMSwgc2wtPm1iX3ksIEVSX01CX0VORCk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBlcl9hZGRfc2xpY2Uoc2wsIHNsLT5yZXN5bmNfbWJfeCwgc2wtPnJlc3luY19tYl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5tYl94LCBzbC0+bWJfeSwgRVJfTUJfRU5EKTsKQEAgLTI1MTAsNyArMjcwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChzbC0+bWJfeCA+IGxmX3hfc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICBsb29wX2ZpbHRlcihoLCBzbCwgbGZfeF9zdGFydCwgc2wtPm1iX3gpOwogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBlcl9hZGRfc2xpY2Uoc2wsIHNsLT5yZXN5bmNfbWJfeCwgc2wtPnJlc3luY19tYl95LCBzbC0+bWJfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5tYl95LCBFUl9NQl9FUlJPUik7CkBAIC0yNTIwLDM4ICsyNzE5LDQxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKK2ZpbmlzaDoKKyAgICBzbC0+ZGVibG9ja2luZ19maWx0ZXIgPSBvcmlnX2RlYmxvY2s7CisgICAgcmV0dXJuIDA7CiB9CiAKIC8qKgogICogQ2FsbCBkZWNvZGVfc2xpY2UoKSBmb3IgZWFjaCBjb250ZXh0LgogICoKICAqIEBwYXJhbSBoIGgyNjQgbWFzdGVyIGNvbnRleHQKLSAqIEBwYXJhbSBjb250ZXh0X2NvdW50IG51bWJlciBvZiBjb250ZXh0cyB0byBleGVjdXRlCiAgKi8KLWludCBmZl9oMjY0X2V4ZWN1dGVfZGVjb2RlX3NsaWNlcyhIMjY0Q29udGV4dCAqaCwgdW5zaWduZWQgY29udGV4dF9jb3VudCkKK2ludCBmZl9oMjY0X2V4ZWN1dGVfZGVjb2RlX3NsaWNlcyhIMjY0Q29udGV4dCAqaCkKIHsKICAgICBBVkNvZGVjQ29udGV4dCAqY29uc3QgYXZjdHggPSBoLT5hdmN0eDsKICAgICBIMjY0U2xpY2VDb250ZXh0ICpzbDsKKyAgICBpbnQgY29udGV4dF9jb3VudCA9IGgtPm5iX3NsaWNlX2N0eF9xdWV1ZWQ7CisgICAgaW50IHJldCA9IDA7CiAgICAgaW50IGksIGo7CiAKLSAgICBhdl9hc3NlcnQwKGNvbnRleHRfY291bnQgJiYgaC0+c2xpY2VfY3R4W2NvbnRleHRfY291bnQgLSAxXS5tYl95IDwgaC0+bWJfaGVpZ2h0KTsKLQogICAgIGgtPnNsaWNlX2N0eFswXS5uZXh0X3NsaWNlX2lkeCA9IElOVF9NQVg7CiAKLSAgICBpZiAoaC0+YXZjdHgtPmh3YWNjZWwKLSNpZiBGRl9BUElfQ0FQX1ZEUEFVCi0gICAgICAgIHx8IGgtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUKLSNlbmRpZgotICAgICAgICApCisgICAgaWYgKGgtPmF2Y3R4LT5od2FjY2VsIHx8IGNvbnRleHRfY291bnQgPCAxKQogICAgICAgICByZXR1cm4gMDsKKworICAgIGF2X2Fzc2VydDAoY29udGV4dF9jb3VudCAmJiBoLT5zbGljZV9jdHhbY29udGV4dF9jb3VudCAtIDFdLm1iX3kgPCBoLT5tYl9oZWlnaHQpOworCiAgICAgaWYgKGNvbnRleHRfY291bnQgPT0gMSkgewotICAgICAgICBpbnQgcmV0OwogCiAgICAgICAgIGgtPnNsaWNlX2N0eFswXS5uZXh0X3NsaWNlX2lkeCA9IGgtPm1iX3dpZHRoICogaC0+bWJfaGVpZ2h0OworICAgICAgICBoLT5wb3N0cG9uZV9maWx0ZXIgPSAwOwogCiAgICAgICAgIHJldCA9IGRlY29kZV9zbGljZShhdmN0eCwgJmgtPnNsaWNlX2N0eFswXSk7CiAgICAgICAgIGgtPm1iX3kgPSBoLT5zbGljZV9jdHhbMF0ubWJfeTsKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9hc3NlcnQwKGNvbnRleHRfY291bnQgPiAwKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbnRleHRfY291bnQ7IGkrKykgewpAQCAtMjU4Niw3ICsyNzg4LDI3IEBACiAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgY29udGV4dF9jb3VudDsgaSsrKQogICAgICAgICAgICAgICAgIGgtPnNsaWNlX2N0eFswXS5lci5lcnJvcl9jb3VudCArPSBoLT5zbGljZV9jdHhbaV0uZXIuZXJyb3JfY291bnQ7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoaC0+cG9zdHBvbmVfZmlsdGVyKSB7CisgICAgICAgICAgICBoLT5wb3N0cG9uZV9maWx0ZXIgPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29udGV4dF9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHlfZW5kLCB4X2VuZDsKKworICAgICAgICAgICAgICAgIHNsID0gJmgtPnNsaWNlX2N0eFtpXTsKKyAgICAgICAgICAgICAgICB5X2VuZCA9IEZGTUlOKHNsLT5tYl95ICsgMSwgaC0+bWJfaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB4X2VuZCA9IChzbC0+bWJfeSA+PSBoLT5tYl9oZWlnaHQpID8gaC0+bWJfd2lkdGggOiBzbC0+bWJfeDsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IHNsLT5yZXN5bmNfbWJfeTsgaiA8IHlfZW5kOyBqICs9IDEgKyBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNsLT5tYl95ID0gajsKKyAgICAgICAgICAgICAgICAgICAgbG9vcF9maWx0ZXIoaCwgc2wsIGogPiBzbC0+cmVzeW5jX21iX3kgPyAwIDogc2wtPnJlc3luY19tYl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID09IHlfZW5kIC0gMSA/IHhfZW5kIDogaC0+bWJfd2lkdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiAwOworZmluaXNoOgorICAgIGgtPm5iX3NsaWNlX2N0eF9xdWV1ZWQgPSAwOworICAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjRhZGRweF90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9oMjY0YWRkcHhfdGVtcGxhdGUuYwppbmRleCAwNDZiNmMyLi45YTFlNmEyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRhZGRweF90ZW1wbGF0ZS5jCisrKyBiL2xpYmF2Y29kZWMvaDI2NGFkZHB4X3RlbXBsYXRlLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgRFNQIGZ1bmN0aW9ucy4KKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHBhcnQxMCBEU1AgZnVuY3Rpb25zLgogICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICovCiAKQEAgLTM1LDEwICszNSwxMCBAQAogICAgIHN0cmlkZSAvPSBzaXplb2YocGl4ZWwpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICBkc3RbMF0gKz0gc3JjWzBdOwotICAgICAgICBkc3RbMV0gKz0gc3JjWzFdOwotICAgICAgICBkc3RbMl0gKz0gc3JjWzJdOwotICAgICAgICBkc3RbM10gKz0gc3JjWzNdOworICAgICAgICBkc3RbMF0gKz0gKHVuc2lnbmVkKXNyY1swXTsKKyAgICAgICAgZHN0WzFdICs9ICh1bnNpZ25lZClzcmNbMV07CisgICAgICAgIGRzdFsyXSArPSAodW5zaWduZWQpc3JjWzJdOworICAgICAgICBkc3RbM10gKz0gKHVuc2lnbmVkKXNyY1szXTsKIAogICAgICAgICBkc3QgKz0gc3RyaWRlOwogICAgICAgICBzcmMgKz0gNDsKQEAgLTU1LDE0ICs1NSwxNCBAQAogICAgIHN0cmlkZSAvPSBzaXplb2YocGl4ZWwpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgICBkc3RbMF0gKz0gc3JjWzBdOwotICAgICAgICBkc3RbMV0gKz0gc3JjWzFdOwotICAgICAgICBkc3RbMl0gKz0gc3JjWzJdOwotICAgICAgICBkc3RbM10gKz0gc3JjWzNdOwotICAgICAgICBkc3RbNF0gKz0gc3JjWzRdOwotICAgICAgICBkc3RbNV0gKz0gc3JjWzVdOwotICAgICAgICBkc3RbNl0gKz0gc3JjWzZdOwotICAgICAgICBkc3RbN10gKz0gc3JjWzddOworICAgICAgICBkc3RbMF0gKz0gKHVuc2lnbmVkKXNyY1swXTsKKyAgICAgICAgZHN0WzFdICs9ICh1bnNpZ25lZClzcmNbMV07CisgICAgICAgIGRzdFsyXSArPSAodW5zaWduZWQpc3JjWzJdOworICAgICAgICBkc3RbM10gKz0gKHVuc2lnbmVkKXNyY1szXTsKKyAgICAgICAgZHN0WzRdICs9ICh1bnNpZ25lZClzcmNbNF07CisgICAgICAgIGRzdFs1XSArPSAodW5zaWduZWQpc3JjWzVdOworICAgICAgICBkc3RbNl0gKz0gKHVuc2lnbmVkKXNyY1s2XTsKKyAgICAgICAgZHN0WzddICs9ICh1bnNpZ25lZClzcmNbN107CiAKICAgICAgICAgZHN0ICs9IHN0cmlkZTsKICAgICAgICAgc3JjICs9IDg7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjRjaHJvbWEuaCBiL2xpYmF2Y29kZWMvaDI2NGNocm9tYS5oCmluZGV4IGUwZjQ1YWQuLjVjODlmZDEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NGNocm9tYS5oCisrKyBiL2xpYmF2Y29kZWMvaDI2NGNocm9tYS5oCkBAIC0xOSw5ICsxOSwxMCBAQAogI2lmbmRlZiBBVkNPREVDX0gyNjRDSFJPTUFfSAogI2RlZmluZSBBVkNPREVDX0gyNjRDSFJPTUFfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLXR5cGVkZWYgdm9pZCAoKmgyNjRfY2hyb21hX21jX2Z1bmMpKHVpbnQ4X3QgKmRzdC8qYWxpZ24gOCovLCB1aW50OF90ICpzcmMvKmFsaWduIDEqLywgaW50IHNyY1N0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7Cit0eXBlZGVmIHZvaWQgKCpoMjY0X2Nocm9tYV9tY19mdW5jKSh1aW50OF90ICpkc3QgLyphbGlnbiA4Ki8sIHVpbnQ4X3QgKnNyYyAvKmFsaWduIDEqLywgcHRyZGlmZl90IHNyY1N0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKIHR5cGVkZWYgc3RydWN0IEgyNjRDaHJvbWFDb250ZXh0IHsKICAgICBoMjY0X2Nocm9tYV9tY19mdW5jIHB1dF9oMjY0X2Nocm9tYV9waXhlbHNfdGFiWzRdOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0Y2hyb21hX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2gyNjRjaHJvbWFfdGVtcGxhdGUuYwppbmRleCAwNzJiNWUwLi5hM2NhMDdiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRjaHJvbWFfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2gyNjRjaHJvbWFfdGVtcGxhdGUuYwpAQCAtMTksMTIgKzE5LDE0IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJiaXRfZGVwdGhfdGVtcGxhdGUuYyIKIAogI2RlZmluZSBIMjY0X0NIUk9NQV9NQyhPUE5BTUUsIE9QKVwKLXN0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X2Nocm9tYV9tYzEpKHVpbnQ4X3QgKl9kc3QvKmFsaWduIDgqLywgdWludDhfdCAqX3NyYy8qYWxpZ24gMSovLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KXtcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9jaHJvbWFfbWMxKSh1aW50OF90ICpfZHN0IC8qYWxpZ24gOCovLCB1aW50OF90ICpfc3JjIC8qYWxpZ24gMSovLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KXtcCiAgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCopX2RzdDtcCiAgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYztcCiAgICAgY29uc3QgaW50IEE9KDgteCkqKDgteSk7XApAQCAtNTgsNyArNjAsOCBAQAogICAgICAgICB9XAogICAgIH1cCiB9XAotc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfY2hyb21hX21jMikodWludDhfdCAqX2RzdC8qYWxpZ24gOCovLCB1aW50OF90ICpfc3JjLyphbGlnbiAxKi8sIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpe1wKK3N0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X2Nocm9tYV9tYzIpKHVpbnQ4X3QgKl9kc3QgLyphbGlnbiA4Ki8sIHVpbnQ4X3QgKl9zcmMgLyphbGlnbiAxKi8sIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpXAore1wKICAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0O1wKICAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjO1wKICAgICBjb25zdCBpbnQgQT0oOC14KSooOC15KTtcCkBAIC03OSw3ICs4Miw3IEBACiAgICAgICAgIH1cCiAgICAgfSBlbHNlIGlmIChCICsgQykge1wKICAgICAgICAgY29uc3QgaW50IEU9IEIrQztcCi0gICAgICAgIGNvbnN0IGludCBzdGVwPSBDID8gc3RyaWRlIDogMTtcCisgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBzdGVwID0gQyA/IHN0cmlkZSA6IDE7XAogICAgICAgICBmb3IoaT0wOyBpPGg7IGkrKyl7XAogICAgICAgICAgICAgT1AoZHN0WzBdLCAoQSpzcmNbMF0gKyBFKnNyY1tzdGVwKzBdKSk7XAogICAgICAgICAgICAgT1AoZHN0WzFdLCAoQSpzcmNbMV0gKyBFKnNyY1tzdGVwKzFdKSk7XApAQCAtOTYsNyArOTksOCBAQAogICAgIH1cCiB9XAogXAotc3RhdGljIHZvaWQgRlVOQ0MoT1BOQU1FICMjIGgyNjRfY2hyb21hX21jNCkodWludDhfdCAqX2RzdC8qYWxpZ24gOCovLCB1aW50OF90ICpfc3JjLyphbGlnbiAxKi8sIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpe1wKK3N0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X2Nocm9tYV9tYzQpKHVpbnQ4X3QgKl9kc3QgLyphbGlnbiA4Ki8sIHVpbnQ4X3QgKl9zcmMgLyphbGlnbiAxKi8sIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpXAore1wKICAgICBwaXhlbCAqZHN0ID0gKHBpeGVsKilfZHN0O1wKICAgICBwaXhlbCAqc3JjID0gKHBpeGVsKilfc3JjO1wKICAgICBjb25zdCBpbnQgQT0oOC14KSooOC15KTtcCkBAIC0xMTksNyArMTIzLDcgQEAKICAgICAgICAgfVwKICAgICB9IGVsc2UgaWYgKEIgKyBDKSB7XAogICAgICAgICBjb25zdCBpbnQgRT0gQitDO1wKLSAgICAgICAgY29uc3QgaW50IHN0ZXA9IEMgPyBzdHJpZGUgOiAxO1wKKyAgICAgICAgY29uc3QgcHRyZGlmZl90IHN0ZXAgPSBDID8gc3RyaWRlIDogMTtcCiAgICAgICAgIGZvcihpPTA7IGk8aDsgaSsrKXtcCiAgICAgICAgICAgICBPUChkc3RbMF0sIChBKnNyY1swXSArIEUqc3JjW3N0ZXArMF0pKTtcCiAgICAgICAgICAgICBPUChkc3RbMV0sIChBKnNyY1sxXSArIEUqc3JjW3N0ZXArMV0pKTtcCkBAIC0xNDAsNyArMTQ0LDggQEAKICAgICB9XAogfVwKIFwKLXN0YXRpYyB2b2lkIEZVTkNDKE9QTkFNRSAjIyBoMjY0X2Nocm9tYV9tYzgpKHVpbnQ4X3QgKl9kc3QvKmFsaWduIDgqLywgdWludDhfdCAqX3NyYy8qYWxpZ24gMSovLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KXtcCitzdGF0aWMgdm9pZCBGVU5DQyhPUE5BTUUgIyMgaDI2NF9jaHJvbWFfbWM4KSh1aW50OF90ICpfZHN0IC8qYWxpZ24gOCovLCB1aW50OF90ICpfc3JjIC8qYWxpZ24gMSovLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KVwKK3tcCiAgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCopX2RzdDtcCiAgICAgcGl4ZWwgKnNyYyA9IChwaXhlbCopX3NyYztcCiAgICAgY29uc3QgaW50IEE9KDgteCkqKDgteSk7XApAQCAtMTY3LDcgKzE3Miw3IEBACiAgICAgICAgIH1cCiAgICAgfSBlbHNlIGlmIChCICsgQykge1wKICAgICAgICAgY29uc3QgaW50IEU9IEIrQztcCi0gICAgICAgIGNvbnN0IGludCBzdGVwPSBDID8gc3RyaWRlIDogMTtcCisgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBzdGVwID0gQyA/IHN0cmlkZSA6IDE7XAogICAgICAgICBmb3IoaT0wOyBpPGg7IGkrKyl7XAogICAgICAgICAgICAgT1AoZHN0WzBdLCAoQSpzcmNbMF0gKyBFKnNyY1tzdGVwKzBdKSk7XAogICAgICAgICAgICAgT1AoZHN0WzFdLCAoQSpzcmNbMV0gKyBFKnNyY1tzdGVwKzFdKSk7XApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0ZGF0YS5jIGIvbGliYXZjb2RlYy9oMjY0ZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzZkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2gyNjRkYXRhLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBILjI2TC9ILjI2NC9BVkMvSlZULzE0NDk2LTEwLy4uLiBlbmNvZGVyL2RlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBAYnJpZWYKKyAqICAgICBILjI2NCAvIEFWQyAvIE1QRUctNCBwYXJ0MTAgY29kZWMgZGF0YSB0YWJsZQorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJoMjY0ZGVjLmgiCisjaW5jbHVkZSAiaDI2NGRhdGEuaCIKKworY29uc3QgdWludDhfdCBmZl9oMjY0X2dvbG9tYl90b19waWN0X3R5cGVbNV0gPSB7CisgICAgQVZfUElDVFVSRV9UWVBFX1AsIEFWX1BJQ1RVUkVfVFlQRV9CLCBBVl9QSUNUVVJFX1RZUEVfSSwKKyAgICBBVl9QSUNUVVJFX1RZUEVfU1AsIEFWX1BJQ1RVUkVfVFlQRV9TSQorfTsKKworY29uc3QgdWludDhfdCBmZl9oMjY0X2dvbG9tYl90b19pbnRyYTR4NF9jYnBbNDhdID0geworICAgIDQ3LCAzMSwgMTUsIDAsICAyMywgMjcsIDI5LCAzMCwgNywgIDExLCAxMywgMTQsIDM5LCA0MywgNDUsIDQ2LAorICAgIDE2LCAzLCAgNSwgIDEwLCAxMiwgMTksIDIxLCAyNiwgMjgsIDM1LCAzNywgNDIsIDQ0LCAxLCAgMiwgIDQsCisgICAgOCwgIDE3LCAxOCwgMjAsIDI0LCA2LCAgOSwgIDIyLCAyNSwgMzIsIDMzLCAzNCwgMzYsIDQwLCAzOCwgNDEKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfaDI2NF9nb2xvbWJfdG9faW50ZXJfY2JwWzQ4XSA9IHsKKyAgICAwLCAgMTYsIDEsICAyLCAgNCwgIDgsICAzMiwgMywgIDUsICAxMCwgMTIsIDE1LCA0NywgNywgIDExLCAxMywKKyAgICAxNCwgNiwgIDksICAzMSwgMzUsIDM3LCA0MiwgNDQsIDMzLCAzNCwgMzYsIDQwLCAzOSwgNDMsIDQ1LCA0NiwKKyAgICAxNywgMTgsIDIwLCAyNCwgMTksIDIxLCAyNiwgMjgsIDIzLCAyNywgMjksIDMwLCAyMiwgMjUsIDM4LCA0MQorfTsKKworY29uc3QgdWludDhfdCBmZl9oMjY0X2Nocm9tYV9kY19zY2FuWzRdID0geworICAgICgwICsgMCAqIDIpICogMTYsICgxICsgMCAqIDIpICogMTYsCisgICAgKDAgKyAxICogMikgKiAxNiwgKDEgKyAxICogMikgKiAxNiwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfaDI2NF9jaHJvbWE0MjJfZGNfc2Nhbls4XSA9IHsKKyAgICAoMCArIDAgKiAyKSAqIDE2LCAoMCArIDEgKiAyKSAqIDE2LAorICAgICgxICsgMCAqIDIpICogMTYsICgwICsgMiAqIDIpICogMTYsCisgICAgKDAgKyAzICogMikgKiAxNiwgKDEgKyAxICogMikgKiAxNiwKKyAgICAoMSArIDIgKiAyKSAqIDE2LCAoMSArIDMgKiAyKSAqIDE2LAorfTsKKworY29uc3QgSU1iSW5mbyBmZl9oMjY0X2lfbWJfdHlwZV9pbmZvWzI2XSA9IHsKKyAgICB7IE1CX1RZUEVfSU5UUkE0eDQsICAtMSwgIC0xIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDIsICAgMCB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAxLCAgIDAgfSwKKyAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMCwgICAwIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDMsICAgMCB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAyLCAgMTYgfSwKKyAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMSwgIDE2IH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDAsICAxNiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAzLCAgMTYgfSwKKyAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMiwgIDMyIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDEsICAzMiB9LAorICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAwLCAgMzIgfSwKKyAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMywgIDMyIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDIsICAxNSArICAwIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDEsICAxNSArICAwIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDAsICAxNSArICAwIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDMsICAxNSArICAwIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDIsICAxNSArIDE2IH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDEsICAxNSArIDE2IH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDAsICAxNSArIDE2IH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDMsICAxNSArIDE2IH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDIsICAxNSArIDMyIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDEsICAxNSArIDMyIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDAsICAxNSArIDMyIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDMsICAxNSArIDMyIH0sCisgICAgeyBNQl9UWVBFX0lOVFJBX1BDTSwgIC0xLCAtMSB9LAorfTsKKworY29uc3QgUE1iSW5mbyBmZl9oMjY0X3BfbWJfdHlwZV9pbmZvWzVdID0geworICAgIHsgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSB9LAorICAgIHsgTUJfVFlQRV8xNng4ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgMiB9LAorICAgIHsgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgMiB9LAorICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgNCB9LAorICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfUkVGMCwgNCB9LAorfTsKKworY29uc3QgUE1iSW5mbyBmZl9oMjY0X3Bfc3ViX21iX3R5cGVfaW5mb1s0XSA9IHsKKyAgICB7IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX1AwTDAsIDEgfSwKKyAgICB7IE1CX1RZUEVfMTZ4OCAgfCBNQl9UWVBFX1AwTDAsIDIgfSwKKyAgICB7IE1CX1RZUEVfOHgxNiAgfCBNQl9UWVBFX1AwTDAsIDIgfSwKKyAgICB7IE1CX1RZUEVfOHg4ICAgfCBNQl9UWVBFX1AwTDAsIDQgfSwKK307CisKK2NvbnN0IFBNYkluZm8gZmZfaDI2NF9iX21iX3R5cGVfaW5mb1syM10gPSB7CisgICAgeyBNQl9UWVBFX0RJUkVDVDIgfCBNQl9UWVBFX0wwTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCisgICAgeyBNQl9UWVBFXzE2eDE2ICAgfCBNQl9UWVBFX1AwTDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCisgICAgeyBNQl9UWVBFXzE2eDE2ICAgfCBNQl9UWVBFX1AwTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCisgICAgeyBNQl9UWVBFXzE2eDE2ICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AxTDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AxTDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAsICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAsICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4OCAgICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDQsIH0sCit9OworCitjb25zdCBQTWJJbmZvIGZmX2gyNjRfYl9zdWJfbWJfdHlwZV9pbmZvWzEzXSA9IHsKKyAgICB7IE1CX1RZUEVfRElSRUNUMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCisgICAgeyBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9QMEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAorICAgIHsgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgfSwKKyAgICB7IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCisgICAgeyBNQl9UWVBFXzE2eDggIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgfSwKKyAgICB7IE1CX1RZUEVfMTZ4OCAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4MTYgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAorICAgIHsgTUJfVFlQRV8xNng4ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDBMMSB8IE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfUDFMMSwgMiwgfSwKKyAgICB7IE1CX1RZUEVfOHgxNiAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDIsIH0sCisgICAgeyBNQl9UWVBFXzh4OCAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCB9LAorICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMSB8IE1CX1RZUEVfUDFMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgfSwKKyAgICB7IE1CX1RZUEVfOHg4ICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDQsIH0sCit9OworCitjb25zdCB1aW50OF90IGZmX2gyNjRfZGVxdWFudDRfY29lZmZfaW5pdFs2XVszXSA9IHsKKyAgICB7IDEwLCAxMywgMTYgfSwKKyAgICB7IDExLCAxNCwgMTggfSwKKyAgICB7IDEzLCAxNiwgMjAgfSwKKyAgICB7IDE0LCAxOCwgMjMgfSwKKyAgICB7IDE2LCAyMCwgMjUgfSwKKyAgICB7IDE4LCAyMywgMjkgfSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfaDI2NF9kZXF1YW50OF9jb2VmZl9pbml0X3NjYW5bMTZdID0geworICAgIDAsIDMsIDQsIDMsIDMsIDEsIDUsIDEsIDQsIDUsIDIsIDUsIDMsIDEsIDUsIDEKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfaDI2NF9kZXF1YW50OF9jb2VmZl9pbml0WzZdWzZdID0geworICAgIHsgMjAsIDE4LCAzMiwgMTksIDI1LCAyNCB9LAorICAgIHsgMjIsIDE5LCAzNSwgMjEsIDI4LCAyNiB9LAorICAgIHsgMjYsIDIzLCA0MiwgMjQsIDMzLCAzMSB9LAorICAgIHsgMjgsIDI1LCA0NSwgMjYsIDM1LCAzMyB9LAorICAgIHsgMzIsIDI4LCA1MSwgMzAsIDQwLCAzOCB9LAorICAgIHsgMzYsIDMyLCA1OCwgMzQsIDQ2LCA0MyB9LAorfTsKKworY29uc3QgdWludDhfdCBmZl9oMjY0X3F1YW50X3JlbTZbUVBfTUFYX05VTSArIDFdID0geworICAgIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsCisgICAgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwgMCwgMSwgMiwgMywgNCwgNSwKKyAgICAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLCAzLCA0LCA1LCAwLCAxLCAyLAorICAgIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsIDAsIDEsIDIsIDMsIDQsIDUsCisgICAgMCwgMSwgMiwgMywKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfaDI2NF9xdWFudF9kaXY2W1FQX01BWF9OVU0gKyAxXSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAzLCAgMywgIDMsCisgICAgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNiwgNiwgNiwgNiwgIDYsICA2LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDksIDksIDksIDksIDksIDksIDEwLCAxMCwgMTAsCisgICAxMCwxMCwxMCwxMSwxMSwxMSwxMSwxMSwxMSwxMiwxMiwxMiwxMiwxMiwxMiwxMywxMywxMywgMTMsIDEzLCAxMywKKyAgIDE0LDE0LDE0LDE0LAorfTsKKworI2RlZmluZSBRUChxUCwgZGVwdGgpICgocVApICsgNiAqICgoZGVwdGgpIC0gOCkpCisKKyNkZWZpbmUgQ0hST01BX1FQX1RBQkxFX0VORChkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBRUCgwLCAgZCksIFFQKDEsICBkKSwgUVAoMiwgIGQpLCBRUCgzLCAgZCksIFFQKDQsICBkKSwgUVAoNSwgIGQpLCAgIFwKKyAgICBRUCg2LCAgZCksIFFQKDcsICBkKSwgUVAoOCwgIGQpLCBRUCg5LCAgZCksIFFQKDEwLCBkKSwgUVAoMTEsIGQpLCAgIFwKKyAgICBRUCgxMiwgZCksIFFQKDEzLCBkKSwgUVAoMTQsIGQpLCBRUCgxNSwgZCksIFFQKDE2LCBkKSwgUVAoMTcsIGQpLCAgIFwKKyAgICBRUCgxOCwgZCksIFFQKDE5LCBkKSwgUVAoMjAsIGQpLCBRUCgyMSwgZCksIFFQKDIyLCBkKSwgUVAoMjMsIGQpLCAgIFwKKyAgICBRUCgyNCwgZCksIFFQKDI1LCBkKSwgUVAoMjYsIGQpLCBRUCgyNywgZCksIFFQKDI4LCBkKSwgUVAoMjksIGQpLCAgIFwKKyAgICBRUCgyOSwgZCksIFFQKDMwLCBkKSwgUVAoMzEsIGQpLCBRUCgzMiwgZCksIFFQKDMyLCBkKSwgUVAoMzMsIGQpLCAgIFwKKyAgICBRUCgzNCwgZCksIFFQKDM0LCBkKSwgUVAoMzUsIGQpLCBRUCgzNSwgZCksIFFQKDM2LCBkKSwgUVAoMzYsIGQpLCAgIFwKKyAgICBRUCgzNywgZCksIFFQKDM3LCBkKSwgUVAoMzcsIGQpLCBRUCgzOCwgZCksIFFQKDM4LCBkKSwgUVAoMzgsIGQpLCAgIFwKKyAgICBRUCgzOSwgZCksIFFQKDM5LCBkKSwgUVAoMzksIGQpLCBRUCgzOSwgZCkKKworY29uc3QgdWludDhfdCBmZl9oMjY0X2Nocm9tYV9xcFs3XVtRUF9NQVhfTlVNICsgMV0gPSB7CisgICAgeyBDSFJPTUFfUVBfVEFCTEVfRU5EKDgpIH0sCisgICAgeyAwLCAxLCAyLCAzLCA0LCA1LAorICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCg5KSB9LAorICAgIHsgMCwgMSwgMiwgMywgIDQsICA1LAorICAgICAgNiwgNywgOCwgOSwgMTAsIDExLAorICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMCkgfSwKKyAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCisgICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAorICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKKyAgICAgIENIUk9NQV9RUF9UQUJMRV9FTkQoMTEpIH0sCisgICAgeyAwLCAgMSwgMiwgMywgIDQsICA1LAorICAgICAgNiwgIDcsIDgsIDksIDEwLCAxMSwKKyAgICAgIDEyLDEzLDE0LDE1LCAxNiwgMTcsCisgICAgICAxOCwxOSwyMCwyMSwgMjIsIDIzLAorICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMikgfSwKKyAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCisgICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAorICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKKyAgICAgIDE4LDE5LDIwLDIxLCAyMiwgMjMsCisgICAgICAyNCwyNSwyNiwyNywgMjgsIDI5LAorICAgICAgQ0hST01BX1FQX1RBQkxFX0VORCgxMykgfSwKKyAgICB7IDAsICAxLCAyLCAzLCAgNCwgIDUsCisgICAgICA2LCAgNywgOCwgOSwgMTAsIDExLAorICAgICAgMTIsMTMsMTQsMTUsIDE2LCAxNywKKyAgICAgIDE4LDE5LDIwLDIxLCAyMiwgMjMsCisgICAgICAyNCwyNSwyNiwyNywgMjgsIDI5LAorICAgICAgMzAsMzEsMzIsMzMsIDM0LCAzNSwKKyAgICAgIENIUk9NQV9RUF9UQUJMRV9FTkQoMTQpIH0sCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0ZGF0YS5oIGIvbGliYXZjb2RlYy9oMjY0ZGF0YS5oCmluZGV4IDk1ZWEzODUuLjI5NjhiMDggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NGRhdGEuaAorKysgYi9saWJhdmNvZGVjL2gyNjRkYXRhLmgKQEAgLTEsNyArMSw0IEBACiAvKgotICogSDI2TC9IMjY0L0FWQy9KVlQvMTQ0OTYtMTAvLi4uIGVuY29kZXIvZGVjb2RlcgotICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Ci0gKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKICAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE5LDU2ICsxNiwxOSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLS8qKgotICogQGZpbGUKLSAqIEBicmllZgotICogICAgIEgyNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgY29kZWMgZGF0YSB0YWJsZQotICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgotICovCi0KICNpZm5kZWYgQVZDT0RFQ19IMjY0REFUQV9ICiAjZGVmaW5lIEFWQ09ERUNfSDI2NERBVEFfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLSNpbmNsdWRlICJsaWJhdnV0aWwvcmF0aW9uYWwuaCIKLSNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiaDI2NGRlYy5oIgogCi1zdGF0aWMgY29uc3QgdWludDhfdCBnb2xvbWJfdG9fcGljdF90eXBlWzVdID0gewotICAgIEFWX1BJQ1RVUkVfVFlQRV9QLCBBVl9QSUNUVVJFX1RZUEVfQiwgQVZfUElDVFVSRV9UWVBFX0ksCi0gICAgQVZfUElDVFVSRV9UWVBFX1NQLCBBVl9QSUNUVVJFX1RZUEVfU0kKLX07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oMjY0X2dvbG9tYl90b19waWN0X3R5cGVbNV07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oMjY0X2dvbG9tYl90b19pbnRyYTR4NF9jYnBbNDhdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2NF9nb2xvbWJfdG9faW50ZXJfY2JwWzQ4XTsKIAotc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ29sb21iX3RvX2ludHJhNHg0X2NicFs0OF0gPSB7Ci0gICAgNDcsIDMxLCAxNSwgMCwgIDIzLCAyNywgMjksIDMwLCA3LCAgMTEsIDEzLCAxNCwgMzksIDQzLCA0NSwgNDYsCi0gICAgMTYsIDMsICA1LCAgMTAsIDEyLCAxOSwgMjEsIDI2LCAyOCwgMzUsIDM3LCA0MiwgNDQsIDEsICAyLCAgNCwKLSAgICA4LCAgMTcsIDE4LCAyMCwgMjQsIDYsICA5LCAgMjIsIDI1LCAzMiwgMzMsIDM0LCAzNiwgNDAsIDM4LCA0MQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgZ29sb21iX3RvX2ludGVyX2NicFs0OF0gPSB7Ci0gICAgMCwgIDE2LCAxLCAgMiwgIDQsICA4LCAgMzIsIDMsICA1LCAgMTAsIDEyLCAxNSwgNDcsIDcsICAxMSwgMTMsCi0gICAgMTQsIDYsICA5LCAgMzEsIDM1LCAzNywgNDIsIDQ0LCAzMywgMzQsIDM2LCA0MCwgMzksIDQzLCA0NSwgNDYsCi0gICAgMTcsIDE4LCAyMCwgMjQsIDE5LCAyMSwgMjYsIDI4LCAyMywgMjcsIDI5LCAzMCwgMjIsIDI1LCAzOCwgNDEKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHppZ3phZ19zY2FuWzE2KzFdID0gewotICAgIDAgKyAwICogNCwgMSArIDAgKiA0LCAwICsgMSAqIDQsIDAgKyAyICogNCwKLSAgICAxICsgMSAqIDQsIDIgKyAwICogNCwgMyArIDAgKiA0LCAyICsgMSAqIDQsCi0gICAgMSArIDIgKiA0LCAwICsgMyAqIDQsIDEgKyAzICogNCwgMiArIDIgKiA0LAotICAgIDMgKyAxICogNCwgMyArIDIgKiA0LCAyICsgMyAqIDQsIDMgKyAzICogNCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYV9kY19zY2FuWzRdID0gewotICAgICgwICsgMCAqIDIpICogMTYsICgxICsgMCAqIDIpICogMTYsCi0gICAgKDAgKyAxICogMikgKiAxNiwgKDEgKyAxICogMikgKiAxNiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGNocm9tYTQyMl9kY19zY2FuWzhdID0gewotICAgICgwICsgMCAqIDIpICogMTYsICgwICsgMSAqIDIpICogMTYsCi0gICAgKDEgKyAwICogMikgKiAxNiwgKDAgKyAyICogMikgKiAxNiwKLSAgICAoMCArIDMgKiAyKSAqIDE2LCAoMSArIDEgKiAyKSAqIDE2LAotICAgICgxICsgMiAqIDIpICogMTYsICgxICsgMyAqIDIpICogMTYsCi19OworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2NF9jaHJvbWFfZGNfc2Nhbls0XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjRfY2hyb21hNDIyX2RjX3NjYW5bOF07CiAKIHR5cGVkZWYgc3RydWN0IElNYkluZm8gewogICAgIHVpbnQxNl90IHR5cGU7CkBAIC03Niw5NiArMzYsMTcgQEAKICAgICB1aW50OF90IGNicDsKIH0gSU1iSW5mbzsKIAotc3RhdGljIGNvbnN0IElNYkluZm8gaV9tYl90eXBlX2luZm9bMjZdID0gewotICAgIHsgTUJfVFlQRV9JTlRSQTR4NCwgIC0xLCAgLTEgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMiwgICAwIH0sCi0gICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDEsICAgMCB9LAotICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAwLCAgIDAgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMywgICAwIH0sCi0gICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDIsICAxNiB9LAotICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAxLCAgMTYgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMCwgIDE2IH0sCi0gICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDMsICAxNiB9LAotICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAyLCAgMzIgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMSwgIDMyIH0sCi0gICAgeyBNQl9UWVBFX0lOVFJBMTZ4MTYsIDAsICAzMiB9LAotICAgIHsgTUJfVFlQRV9JTlRSQTE2eDE2LCAzLCAgMzIgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMiwgIDE1ICsgIDAgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMSwgIDE1ICsgIDAgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMCwgIDE1ICsgIDAgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMywgIDE1ICsgIDAgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMiwgIDE1ICsgMTYgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMSwgIDE1ICsgMTYgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMCwgIDE1ICsgMTYgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMywgIDE1ICsgMTYgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMiwgIDE1ICsgMzIgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMSwgIDE1ICsgMzIgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMCwgIDE1ICsgMzIgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkExNngxNiwgMywgIDE1ICsgMzIgfSwKLSAgICB7IE1CX1RZUEVfSU5UUkFfUENNLCAgLTEsIC0xIH0sCi19OworZXh0ZXJuIGNvbnN0IElNYkluZm8gZmZfaDI2NF9pX21iX3R5cGVfaW5mb1syNl07CiAKIHR5cGVkZWYgc3RydWN0IFBNYkluZm8gewogICAgIHVpbnQxNl90IHR5cGU7CiAgICAgdWludDhfdCBwYXJ0aXRpb25fY291bnQ7CiB9IFBNYkluZm87CiAKLXN0YXRpYyBjb25zdCBQTWJJbmZvIHBfbWJfdHlwZV9pbmZvWzVdID0gewotICAgIHsgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSB9LAotICAgIHsgTUJfVFlQRV8xNng4ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgMiB9LAotICAgIHsgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgMiB9LAotICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgNCB9LAotICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfUkVGMCwgNCB9LAotfTsKLQotc3RhdGljIGNvbnN0IFBNYkluZm8gcF9zdWJfbWJfdHlwZV9pbmZvWzRdID0gewotICAgIHsgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMCwgMSB9LAotICAgIHsgTUJfVFlQRV8xNng4ICB8IE1CX1RZUEVfUDBMMCwgMiB9LAotICAgIHsgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfUDBMMCwgMiB9LAotICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMCwgNCB9LAotfTsKLQotc3RhdGljIGNvbnN0IFBNYkluZm8gYl9tYl90eXBlX2luZm9bMjNdID0gewotICAgIHsgTUJfVFlQRV9ESVJFQ1QyIHwgTUJfVFlQRV9MMEwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAotICAgIHsgTUJfVFlQRV8xNngxNiAgIHwgTUJfVFlQRV9QMEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAotICAgIHsgTUJfVFlQRV8xNngxNiAgIHwgTUJfVFlQRV9QMEwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAotICAgIHsgTUJfVFlQRV8xNngxNiAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCAyLCB9LAotICAgIHsgTUJfVFlQRV84eDggICAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwwIHwgTUJfVFlQRV9QMUwxLCA0LCB9LAotfTsKLQotc3RhdGljIGNvbnN0IFBNYkluZm8gYl9zdWJfbWJfdHlwZV9pbmZvWzEzXSA9IHsKLSAgICB7IE1CX1RZUEVfRElSRUNUMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCi0gICAgeyBNQl9UWVBFXzE2eDE2IHwgTUJfVFlQRV9QMEwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB9LAotICAgIHsgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfUDBMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgfSwKLSAgICB7IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIH0sCi0gICAgeyBNQl9UWVBFXzE2eDggIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV84eDE2ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDFMMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgfSwKLSAgICB7IE1CX1RZUEVfMTZ4OCAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIH0sCi0gICAgeyBNQl9UWVBFXzh4MTYgIHwgTUJfVFlQRV9QMEwxIHwgTUJfVFlQRV9QMUwxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCB9LAotICAgIHsgTUJfVFlQRV8xNng4ICB8IE1CX1RZUEVfUDBMMCB8IE1CX1RZUEVfUDBMMSB8IE1CX1RZUEVfUDFMMCB8IE1CX1RZUEVfUDFMMSwgMiwgfSwKLSAgICB7IE1CX1RZUEVfOHgxNiAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDIsIH0sCi0gICAgeyBNQl9UWVBFXzh4OCAgIHwgTUJfVFlQRV9QMEwwIHwgTUJfVFlQRV9QMUwwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCB9LAotICAgIHsgTUJfVFlQRV84eDggICB8IE1CX1RZUEVfUDBMMSB8IE1CX1RZUEVfUDFMMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgfSwKLSAgICB7IE1CX1RZUEVfOHg4ICAgfCBNQl9UWVBFX1AwTDAgfCBNQl9UWVBFX1AwTDEgfCBNQl9UWVBFX1AxTDAgfCBNQl9UWVBFX1AxTDEsIDQsIH0sCi19OworZXh0ZXJuIGNvbnN0IFBNYkluZm8gZmZfaDI2NF9wX21iX3R5cGVfaW5mb1s1XTsKK2V4dGVybiBjb25zdCBQTWJJbmZvIGZmX2gyNjRfcF9zdWJfbWJfdHlwZV9pbmZvWzRdOworZXh0ZXJuIGNvbnN0IFBNYkluZm8gZmZfaDI2NF9iX21iX3R5cGVfaW5mb1syM107CitleHRlcm4gY29uc3QgUE1iSW5mbyBmZl9oMjY0X2Jfc3ViX21iX3R5cGVfaW5mb1sxM107CiAKIHN0YXRpYyBjb25zdCBBVlJhdGlvbmFsIGZmX2gyNjRfcGl4ZWxfYXNwZWN0WzE3XSA9IHsKICAgICB7ICAgMCwgIDEgfSwKQEAgLTE4Niw0ICs2NywxMyBAQAogICAgIHsgICAzLCAgMiB9LAogICAgIHsgICAyLCAgMSB9LAogfTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2NF9kZXF1YW50NF9jb2VmZl9pbml0WzZdWzNdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2NF9kZXF1YW50OF9jb2VmZl9pbml0X3NjYW5bMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2NF9kZXF1YW50OF9jb2VmZl9pbml0WzZdWzZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaDI2NF9xdWFudF9yZW02W1FQX01BWF9OVU0gKyAxXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjRfcXVhbnRfZGl2NltRUF9NQVhfTlVNICsgMV07CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2gyNjRfY2hyb21hX3FwWzddW1FQX01BWF9OVU0gKyAxXTsKKwogI2VuZGlmIC8qIEFWQ09ERUNfSDI2NERBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0ZGVjLmMgYi9saWJhdmNvZGVjL2gyNjRkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDk0YzdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oMjY0ZGVjLmMKQEAgLTAsMCArMSwxMDg5IEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHBhcnQxMCBjb2RlYy4KKyAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqLworCisjZGVmaW5lIFVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSIDEKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kaXNwbGF5LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImNhYmFjLmgiCisjaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCisjaW5jbHVkZSAiZXJyb3JfcmVzaWxpZW5jZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiaDI2NGRlYy5oIgorI2luY2x1ZGUgImgyNjQ1X3BhcnNlLmgiCisjaW5jbHVkZSAiaDI2NGRhdGEuaCIKKyNpbmNsdWRlICJoMjY0Y2hyb21hLmgiCisjaW5jbHVkZSAiaDI2NF9tdnByZWQuaCIKKyNpbmNsdWRlICJoMjY0X3BzLmgiCisjaW5jbHVkZSAiZ29sb21iLmgiCisjaW5jbHVkZSAiaHdhY2NlbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKKyNpbmNsdWRlICJtZV9jbXAuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJwcm9maWxlcy5oIgorI2luY2x1ZGUgInJlY3RhbmdsZS5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCitjb25zdCB1aW50MTZfdCBmZl9oMjY0X21iX3NpemVzWzRdID0geyAyNTYsIDM4NCwgNTEyLCA3NjggfTsKKworaW50IGF2cHJpdl9oMjY0X2hhc19udW1fcmVvcmRlcl9mcmFtZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gaCAmJiBoLT5wcy5zcHMgPyBoLT5wcy5zcHMtPm51bV9yZW9yZGVyX2ZyYW1lcyA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGgyNjRfZXJfZGVjb2RlX21iKHZvaWQgKm9wYXF1ZSwgaW50IHJlZiwgaW50IG12X2RpciwgaW50IG12X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCptdilbMl1bNF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfeCwgaW50IG1iX3ksIGludCBtYl9pbnRyYSwgaW50IG1iX3NraXBwZWQpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBvcGFxdWU7CisgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOworCisgICAgc2wtPm1iX3ggPSBtYl94OworICAgIHNsLT5tYl95ID0gbWJfeTsKKyAgICBzbC0+bWJfeHkgPSBtYl94ICsgbWJfeSAqIGgtPm1iX3N0cmlkZTsKKyAgICBtZW1zZXQoc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlLCAwLCBzaXplb2Yoc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlKSk7CisgICAgYXZfYXNzZXJ0MShyZWYgPj0gMCk7CisgICAgLyogRklYTUU6IEl0IGlzIHBvc3NpYmxlIGFsYmVpdCB1bmNvbW1vbiB0aGF0IHNsaWNlIHJlZmVyZW5jZXMKKyAgICAgKiBkaWZmZXIgYmV0d2VlbiBzbGljZXMuIFdlIHRha2UgdGhlIGVhc3kgYXBwcm9hY2ggYW5kIGlnbm9yZQorICAgICAqIGl0IGZvciBub3cuIElmIHRoaXMgdHVybnMgb3V0IHRvIGhhdmUgYW55IHJlbGV2YW5jZSBpbgorICAgICAqIHByYWN0aWNlIHRoZW4gY29ycmVjdCByZW1hcHBpbmcgc2hvdWxkIGJlIGFkZGVkLiAqLworICAgIGlmIChyZWYgPj0gc2wtPnJlZl9jb3VudFswXSkKKyAgICAgICAgcmVmID0gMDsKKyAgICBpZiAoIXNsLT5yZWZfbGlzdFswXVtyZWZdLmRhdGFbMF0pIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJSZWZlcmVuY2Ugbm90IGF2YWlsYWJsZSBmb3IgZXJyb3IgY29uY2VhbGluZ1xuIik7CisgICAgICAgIHJlZiA9IDA7CisgICAgfQorICAgIGlmICgoc2wtPnJlZl9saXN0WzBdW3JlZl0ucmVmZXJlbmNlJjMpICE9IDMpIHsKKyAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJSZWZlcmVuY2UgaW52YWxpZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbF9yZWN0YW5nbGUoJmgtPmN1cl9waWMucmVmX2luZGV4WzBdWzQgKiBzbC0+bWJfeHldLAorICAgICAgICAgICAgICAgICAgIDIsIDIsIDIsIHJlZiwgMSk7CisgICAgZmlsbF9yZWN0YW5nbGUoJnNsLT5yZWZfY2FjaGVbMF1bc2NhbjhbMF1dLCA0LCA0LCA4LCByZWYsIDEpOworICAgIGZpbGxfcmVjdGFuZ2xlKHNsLT5tdl9jYWNoZVswXVtzY2FuOFswXV0sIDQsIDQsIDgsCisgICAgICAgICAgICAgICAgICAgcGFjazE2dG8zMigoKm12KVswXVswXVswXSwgKCptdilbMF1bMF1bMV0pLCA0KTsKKyAgICBzbC0+bWJfbWJhZmYgPQorICAgIHNsLT5tYl9maWVsZF9kZWNvZGluZ19mbGFnID0gMDsKKyAgICBmZl9oMjY0X2hsX2RlY29kZV9tYihoLCAmaC0+c2xpY2VfY3R4WzBdKTsKK30KKwordm9pZCBmZl9oMjY0X2RyYXdfaG9yaXpfYmFuZChjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCBpbnQgaGVpZ2h0KQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IGgtPmF2Y3R4OworICAgIGNvbnN0IEFWRnJhbWUgICAqc3JjICA9IGgtPmN1cl9waWMuZjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBpbnQgdnNoaWZ0ID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBjb25zdCBpbnQgZmllbGRfcGljID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRTsKKyAgICBpZiAoZmllbGRfcGljKSB7CisgICAgICAgIGhlaWdodCA8PD0gMTsKKyAgICAgICAgeSAgICAgIDw8PSAxOworICAgIH0KKworICAgIGhlaWdodCA9IEZGTUlOKGhlaWdodCwgYXZjdHgtPmhlaWdodCAtIHkpOworCisgICAgaWYgKGZpZWxkX3BpYyAmJiBoLT5maXJzdF9maWVsZCAmJiAhKGF2Y3R4LT5zbGljZV9mbGFncyAmIFNMSUNFX0ZMQUdfQUxMT1dfRklFTEQpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoYXZjdHgtPmRyYXdfaG9yaXpfYmFuZCkgeworICAgICAgICBpbnQgb2Zmc2V0W0FWX05VTV9EQVRBX1BPSU5URVJTXTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgb2Zmc2V0WzBdID0geSAqIHNyYy0+bGluZXNpemVbMF07CisgICAgICAgIG9mZnNldFsxXSA9CisgICAgICAgIG9mZnNldFsyXSA9ICh5ID4+IHZzaGlmdCkgKiBzcmMtPmxpbmVzaXplWzFdOworICAgICAgICBmb3IgKGkgPSAzOyBpIDwgQVZfTlVNX0RBVEFfUE9JTlRFUlM7IGkrKykKKyAgICAgICAgICAgIG9mZnNldFtpXSA9IDA7CisKKyAgICAgICAgZW1tc19jKCk7CisKKyAgICAgICAgYXZjdHgtPmRyYXdfaG9yaXpfYmFuZChhdmN0eCwgc3JjLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUsIGhlaWdodCk7CisgICAgfQorfQorCit2b2lkIGZmX2gyNjRfZnJlZV90YWJsZXMoSDI2NENvbnRleHQgKmgpCit7CisgICAgaW50IGk7CisKKyAgICBhdl9mcmVlcCgmaC0+aW50cmE0eDRfcHJlZF9tb2RlKTsKKyAgICBhdl9mcmVlcCgmaC0+Y2hyb21hX3ByZWRfbW9kZV90YWJsZSk7CisgICAgYXZfZnJlZXAoJmgtPmNicF90YWJsZSk7CisgICAgYXZfZnJlZXAoJmgtPm12ZF90YWJsZVswXSk7CisgICAgYXZfZnJlZXAoJmgtPm12ZF90YWJsZVsxXSk7CisgICAgYXZfZnJlZXAoJmgtPmRpcmVjdF90YWJsZSk7CisgICAgYXZfZnJlZXAoJmgtPm5vbl96ZXJvX2NvdW50KTsKKyAgICBhdl9mcmVlcCgmaC0+c2xpY2VfdGFibGVfYmFzZSk7CisgICAgaC0+c2xpY2VfdGFibGUgPSBOVUxMOworICAgIGF2X2ZyZWVwKCZoLT5saXN0X2NvdW50cyk7CisKKyAgICBhdl9mcmVlcCgmaC0+bWIyYl94eSk7CisgICAgYXZfZnJlZXAoJmgtPm1iMmJyX3h5KTsKKworICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmaC0+cXNjYWxlX3RhYmxlX3Bvb2wpOworICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmaC0+bWJfdHlwZV9wb29sKTsKKyAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJmgtPm1vdGlvbl92YWxfcG9vbCk7CisgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZoLT5yZWZfaW5kZXhfcG9vbCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaC0+bmJfc2xpY2VfY3R4OyBpKyspIHsKKyAgICAgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4W2ldOworCisgICAgICAgIGF2X2ZyZWVwKCZzbC0+ZGNfdmFsX2Jhc2UpOworICAgICAgICBhdl9mcmVlcCgmc2wtPmVyLm1iX2luZGV4Mnh5KTsKKyAgICAgICAgYXZfZnJlZXAoJnNsLT5lci5lcnJvcl9zdGF0dXNfdGFibGUpOworICAgICAgICBhdl9mcmVlcCgmc2wtPmVyLmVyX3RlbXBfYnVmZmVyKTsKKworICAgICAgICBhdl9mcmVlcCgmc2wtPmJpcHJlZF9zY3JhdGNocGFkKTsKKyAgICAgICAgYXZfZnJlZXAoJnNsLT5lZGdlX2VtdV9idWZmZXIpOworICAgICAgICBhdl9mcmVlcCgmc2wtPnRvcF9ib3JkZXJzWzBdKTsKKyAgICAgICAgYXZfZnJlZXAoJnNsLT50b3BfYm9yZGVyc1sxXSk7CisKKyAgICAgICAgc2wtPmJpcHJlZF9zY3JhdGNocGFkX2FsbG9jYXRlZCA9IDA7CisgICAgICAgIHNsLT5lZGdlX2VtdV9idWZmZXJfYWxsb2NhdGVkICAgPSAwOworICAgICAgICBzbC0+dG9wX2JvcmRlcnNfYWxsb2NhdGVkWzBdICAgID0gMDsKKyAgICAgICAgc2wtPnRvcF9ib3JkZXJzX2FsbG9jYXRlZFsxXSAgICA9IDA7CisgICAgfQorfQorCitpbnQgZmZfaDI2NF9hbGxvY190YWJsZXMoSDI2NENvbnRleHQgKmgpCit7CisgICAgY29uc3QgaW50IGJpZ19tYl9udW0gPSBoLT5tYl9zdHJpZGUgKiAoaC0+bWJfaGVpZ2h0ICsgMSk7CisgICAgY29uc3QgaW50IHJvd19tYl9udW0gPSAyKmgtPm1iX3N0cmlkZSpGRk1BWChoLT5uYl9zbGljZV9jdHgsIDEpOworICAgIGludCB4LCB5OworCisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oaC0+YXZjdHgsIGgtPmludHJhNHg0X3ByZWRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICByb3dfbWJfbnVtLCA4ICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKQorICAgIGgtPnNsaWNlX2N0eFswXS5pbnRyYTR4NF9wcmVkX21vZGUgPSBoLT5pbnRyYTR4NF9wcmVkX21vZGU7CisKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+bm9uX3plcm9fY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgYmlnX21iX251bSAqIDQ4ICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKQorICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5zbGljZV90YWJsZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgIChiaWdfbWJfbnVtICsgaC0+bWJfc3RyaWRlKSAqIHNpemVvZigqaC0+c2xpY2VfdGFibGVfYmFzZSksIGZhaWwpCisgICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGgtPmNicF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBiaWdfbWJfbnVtICogc2l6ZW9mKHVpbnQxNl90KSwgZmFpbCkKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+Y2hyb21hX3ByZWRfbW9kZV90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICBiaWdfbWJfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKQorICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5tdmRfdGFibGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgcm93X21iX251bSwgMTYgKiBzaXplb2YodWludDhfdCksIGZhaWwpOworICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5tdmRfdGFibGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgcm93X21iX251bSwgMTYgKiBzaXplb2YodWludDhfdCksIGZhaWwpOworICAgIGgtPnNsaWNlX2N0eFswXS5tdmRfdGFibGVbMF0gPSBoLT5tdmRfdGFibGVbMF07CisgICAgaC0+c2xpY2VfY3R4WzBdLm12ZF90YWJsZVsxXSA9IGgtPm12ZF90YWJsZVsxXTsKKworICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5kaXJlY3RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgNCAqIGJpZ19tYl9udW0gKiBzaXplb2YodWludDhfdCksIGZhaWwpOworICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5saXN0X2NvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICBiaWdfbWJfbnVtICogc2l6ZW9mKHVpbnQ4X3QpLCBmYWlsKQorCisgICAgbWVtc2V0KGgtPnNsaWNlX3RhYmxlX2Jhc2UsIC0xLAorICAgICAgICAgICAoYmlnX21iX251bSArIGgtPm1iX3N0cmlkZSkgKiBzaXplb2YoKmgtPnNsaWNlX3RhYmxlX2Jhc2UpKTsKKyAgICBoLT5zbGljZV90YWJsZSA9IGgtPnNsaWNlX3RhYmxlX2Jhc2UgKyBoLT5tYl9zdHJpZGUgKiAyICsgMTsKKworICAgIEZGX0FMTE9DWl9PUl9HT1RPKGgtPmF2Y3R4LCBoLT5tYjJiX3h5LAorICAgICAgICAgICAgICAgICAgICAgIGJpZ19tYl9udW0gKiBzaXplb2YodWludDMyX3QpLCBmYWlsKTsKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgaC0+bWIyYnJfeHksCisgICAgICAgICAgICAgICAgICAgICAgYmlnX21iX251bSAqIHNpemVvZih1aW50MzJfdCksIGZhaWwpOworICAgIGZvciAoeSA9IDA7IHkgPCBoLT5tYl9oZWlnaHQ7IHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGgtPm1iX3dpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBtYl94eSA9IHggKyB5ICogaC0+bWJfc3RyaWRlOworICAgICAgICAgICAgY29uc3QgaW50IGJfeHkgID0gNCAqIHggKyA0ICogeSAqIGgtPmJfc3RyaWRlOworCisgICAgICAgICAgICBoLT5tYjJiX3h5W21iX3h5XSAgPSBiX3h5OworICAgICAgICAgICAgaC0+bWIyYnJfeHlbbWJfeHldID0gOCAqIChGTU8gPyBtYl94eSA6IChtYl94eSAlICgyICogaC0+bWJfc3RyaWRlKSkpOworICAgICAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmZl9oMjY0X2ZyZWVfdGFibGVzKGgpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKKy8qKgorICogSW5pdCBjb250ZXh0CisgKiBBbGxvY2F0ZSBidWZmZXJzIHdoaWNoIGFyZSBub3Qgc2hhcmVkIGFtb25nc3QgbXVsdGlwbGUgdGhyZWFkcy4KKyAqLworaW50IGZmX2gyNjRfc2xpY2VfY29udGV4dF9pbml0KEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCkKK3sKKyAgICBFUkNvbnRleHQgKmVyID0gJnNsLT5lcjsKKyAgICBpbnQgbWJfYXJyYXlfc2l6ZSA9IGgtPm1iX2hlaWdodCAqIGgtPm1iX3N0cmlkZTsKKyAgICBpbnQgeV9zaXplICA9ICgyICogaC0+bWJfd2lkdGggKyAxKSAqICgyICogaC0+bWJfaGVpZ2h0ICsgMSk7CisgICAgaW50IGNfc2l6ZSAgPSBoLT5tYl9zdHJpZGUgKiAoaC0+bWJfaGVpZ2h0ICsgMSk7CisgICAgaW50IHljX3NpemUgPSB5X3NpemUgKyAyICAgKiBjX3NpemU7CisgICAgaW50IHgsIHksIGk7CisKKyAgICBzbC0+cmVmX2NhY2hlWzBdW3NjYW44WzVdICArIDFdID0KKyAgICBzbC0+cmVmX2NhY2hlWzBdW3NjYW44WzddICArIDFdID0KKyAgICBzbC0+cmVmX2NhY2hlWzBdW3NjYW44WzEzXSArIDFdID0KKyAgICBzbC0+cmVmX2NhY2hlWzFdW3NjYW44WzVdICArIDFdID0KKyAgICBzbC0+cmVmX2NhY2hlWzFdW3NjYW44WzddICArIDFdID0KKyAgICBzbC0+cmVmX2NhY2hlWzFdW3NjYW44WzEzXSArIDFdID0gUEFSVF9OT1RfQVZBSUxBQkxFOworCisgICAgaWYgKHNsICE9IGgtPnNsaWNlX2N0eCkgeworICAgICAgICBtZW1zZXQoZXIsIDAsIHNpemVvZigqZXIpKTsKKyAgICB9IGVsc2UKKyAgICBpZiAoQ09ORklHX0VSUk9SX1JFU0lMSUVOQ0UpIHsKKworICAgICAgICAvKiBpbml0IEVSICovCisgICAgICAgIGVyLT5hdmN0eCAgICAgICAgICA9IGgtPmF2Y3R4OworICAgICAgICBlci0+ZGVjb2RlX21iICAgICAgPSBoMjY0X2VyX2RlY29kZV9tYjsKKyAgICAgICAgZXItPm9wYXF1ZSAgICAgICAgID0gaDsKKyAgICAgICAgZXItPnF1YXJ0ZXJfc2FtcGxlID0gMTsKKworICAgICAgICBlci0+bWJfbnVtICAgICAgPSBoLT5tYl9udW07CisgICAgICAgIGVyLT5tYl93aWR0aCAgICA9IGgtPm1iX3dpZHRoOworICAgICAgICBlci0+bWJfaGVpZ2h0ICAgPSBoLT5tYl9oZWlnaHQ7CisgICAgICAgIGVyLT5tYl9zdHJpZGUgICA9IGgtPm1iX3N0cmlkZTsKKyAgICAgICAgZXItPmI4X3N0cmlkZSAgID0gaC0+bWJfd2lkdGggKiAyICsgMTsKKworICAgICAgICAvLyBlcnJvciByZXNpbGllbmNlIGNvZGUgbG9va3MgY2xlYW5lciB3aXRoIHRoaXMKKyAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGVyLT5tYl9pbmRleDJ4eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGgtPm1iX251bSArIDEpICogc2l6ZW9mKGludCksIGZhaWwpOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoLT5tYl9oZWlnaHQ7IHkrKykKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBoLT5tYl93aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgIGVyLT5tYl9pbmRleDJ4eVt4ICsgeSAqIGgtPm1iX3dpZHRoXSA9IHggKyB5ICogaC0+bWJfc3RyaWRlOworCisgICAgICAgIGVyLT5tYl9pbmRleDJ4eVtoLT5tYl9oZWlnaHQgKiBoLT5tYl93aWR0aF0gPSAoaC0+bWJfaGVpZ2h0IC0gMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfc3RyaWRlICsgaC0+bWJfd2lkdGg7CisKKyAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8oaC0+YXZjdHgsIGVyLT5lcnJvcl9zdGF0dXNfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1iX2FycmF5X3NpemUgKiBzaXplb2YodWludDhfdCksIGZhaWwpOworCisgICAgICAgIEZGX0FMTE9DX09SX0dPVE8oaC0+YXZjdHgsIGVyLT5lcl90ZW1wX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBoLT5tYl9oZWlnaHQgKiBoLT5tYl9zdHJpZGUgKiAoNCpzaXplb2YoaW50KSArIDEpLCBmYWlsKTsKKworICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhoLT5hdmN0eCwgc2wtPmRjX3ZhbF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB5Y19zaXplICogc2l6ZW9mKGludDE2X3QpLCBmYWlsKTsKKyAgICAgICAgZXItPmRjX3ZhbFswXSA9IHNsLT5kY192YWxfYmFzZSArIGgtPm1iX3dpZHRoICogMiArIDI7CisgICAgICAgIGVyLT5kY192YWxbMV0gPSBzbC0+ZGNfdmFsX2Jhc2UgKyB5X3NpemUgKyBoLT5tYl9zdHJpZGUgKyAxOworICAgICAgICBlci0+ZGNfdmFsWzJdID0gZXItPmRjX3ZhbFsxXSArIGNfc2l6ZTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHljX3NpemU7IGkrKykKKyAgICAgICAgICAgIHNsLT5kY192YWxfYmFzZVtpXSA9IDEwMjQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsgLy8gZmZfaDI2NF9mcmVlX3RhYmxlcyB3aWxsIGNsZWFuIHVwIGZvciB1cworfQorCitzdGF0aWMgaW50IGgyNjRfaW5pdF9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgSDI2NENvbnRleHQgKmgpCit7CisgICAgaW50IGk7CisKKyAgICBoLT5hdmN0eCAgICAgICAgICAgICAgICAgPSBhdmN0eDsKKyAgICBoLT5jdXJfY2hyb21hX2Zvcm1hdF9pZGMgPSAtMTsKKworICAgIGgtPndpZHRoX2Zyb21fY2FsbGVyICAgICA9IGF2Y3R4LT53aWR0aDsKKyAgICBoLT5oZWlnaHRfZnJvbV9jYWxsZXIgICAgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgICAgID0gUElDVF9GUkFNRTsKKyAgICBoLT53b3JrYXJvdW5kX2J1Z3MgICAgICAgPSBhdmN0eC0+d29ya2Fyb3VuZF9idWdzOworICAgIGgtPmZsYWdzICAgICAgICAgICAgICAgICA9IGF2Y3R4LT5mbGFnczsKKyAgICBoLT5wb2MucHJldl9wb2NfbXNiICAgICAgPSAxIDw8IDE2OworICAgIGgtPnJlY292ZXJ5X2ZyYW1lICAgICAgICA9IC0xOworICAgIGgtPmZyYW1lX3JlY292ZXJlZCAgICAgICA9IDA7CisgICAgaC0+cG9jLnByZXZfZnJhbWVfbnVtICAgID0gLTE7CisgICAgaC0+c2VpLmZyYW1lX3BhY2tpbmcuYXJyYW5nZW1lbnRfY2FuY2VsX2ZsYWcgPSAtMTsKKyAgICBoLT5zZWkudW5yZWdpc3RlcmVkLngyNjRfYnVpbGQgPSAtMTsKKworICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gSU5UX01JTjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0RFTEFZRURfUElDX0NPVU5UOyBpKyspCisgICAgICAgIGgtPmxhc3RfcG9jc1tpXSA9IElOVF9NSU47CisKKyAgICBmZl9oMjY0X3NlaV91bmluaXQoJmgtPnNlaSk7CisKKyAgICBhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiA9IEFWQ0hST01BX0xPQ19MRUZUOworCisgICAgaC0+bmJfc2xpY2VfY3R4ID0gKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpID8gYXZjdHgtPnRocmVhZF9jb3VudCA6IDE7CisgICAgaC0+c2xpY2VfY3R4ID0gYXZfbWFsbG9jel9hcnJheShoLT5uYl9zbGljZV9jdHgsIHNpemVvZigqaC0+c2xpY2VfY3R4KSk7CisgICAgaWYgKCFoLT5zbGljZV9jdHgpIHsKKyAgICAgICAgaC0+bmJfc2xpY2VfY3R4ID0gMDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUElDVFVSRV9DT1VOVDsgaSsrKSB7CisgICAgICAgIGgtPkRQQltpXS5mID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFoLT5EUEJbaV0uZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaC0+Y3VyX3BpYy5mID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWgtPmN1cl9waWMuZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGgtPmxhc3RfcGljX2Zvcl9lYy5mID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWgtPmxhc3RfcGljX2Zvcl9lYy5mKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGgtPm5iX3NsaWNlX2N0eDsgaSsrKQorICAgICAgICBoLT5zbGljZV9jdHhbaV0uaDI2NCA9IGg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGgyNjRfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZmZfaDI2NF9yZW1vdmVfYWxsX3JlZnMoaCk7CisgICAgZmZfaDI2NF9mcmVlX3RhYmxlcyhoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBIMjY0X01BWF9QSUNUVVJFX0NPVU5UOyBpKyspIHsKKyAgICAgICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5EUEJbaV0pOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZoLT5EUEJbaV0uZik7CisgICAgfQorICAgIG1lbXNldChoLT5kZWxheWVkX3BpYywgMCwgc2l6ZW9mKGgtPmRlbGF5ZWRfcGljKSk7CisKKyAgICBoLT5jdXJfcGljX3B0ciA9IE5VTEw7CisKKyAgICBhdl9mcmVlcCgmaC0+c2xpY2VfY3R4KTsKKyAgICBoLT5uYl9zbGljZV9jdHggPSAwOworCisgICAgZmZfaDI2NF9zZWlfdW5pbml0KCZoLT5zZWkpOworICAgIGZmX2gyNjRfcHNfdW5pbml0KCZoLT5wcyk7CisKKyAgICBmZl9oMjY0NV9wYWNrZXRfdW5pbml0KCZoLT5wa3QpOworCisgICAgZmZfaDI2NF91bnJlZl9waWN0dXJlKGgsICZoLT5jdXJfcGljKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZoLT5jdXJfcGljLmYpOworICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+bGFzdF9waWNfZm9yX2VjKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZoLT5sYXN0X3BpY19mb3JfZWMuZik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIEFWT25jZSBoMjY0X3ZsY19pbml0ID0gQVZfT05DRV9JTklUOworCitzdGF0aWMgYXZfY29sZCBpbnQgaDI2NF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBoMjY0X2luaXRfY29udGV4dChhdmN0eCwgaCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmZl90aHJlYWRfb25jZSgmaDI2NF92bGNfaW5pdCwgZmZfaDI2NF9kZWNvZGVfaW5pdF92bGMpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInB0aHJlYWRfb25jZSBoYXMgZmFpbGVkLiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChhdmN0eC0+dGlja3NfcGVyX2ZyYW1lID09IDEpIHsKKyAgICAgICAgaWYoaC0+YXZjdHgtPnRpbWVfYmFzZS5kZW4gPCBJTlRfTUFYLzIpIHsKKyAgICAgICAgICAgIGgtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuICo9IDI7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaC0+YXZjdHgtPnRpbWVfYmFzZS5udW0gLz0gMjsKKyAgICB9CisgICAgYXZjdHgtPnRpY2tzX3Blcl9mcmFtZSA9IDI7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMCAmJiBhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgIHJldCA9IGZmX2gyNjRfZGVjb2RlX2V4dHJhZGF0YShhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+cHMsICZoLT5pc19hdmMsICZoLT5uYWxfbGVuZ3RoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXJyX3JlY29nbml0aW9uLCBhdmN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBoMjY0X2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChoLT5wcy5zcHMgJiYgaC0+cHMuc3BzLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAmJgorICAgICAgICBoLT5hdmN0eC0+aGFzX2JfZnJhbWVzIDwgaC0+cHMuc3BzLT5udW1fcmVvcmRlcl9mcmFtZXMpIHsKKyAgICAgICAgaC0+YXZjdHgtPmhhc19iX2ZyYW1lcyA9IGgtPnBzLnNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzOworICAgIH0KKworICAgIGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MgPSAxOworCisgICAgZmZfaDI2NF9mbHVzaF9jaGFuZ2UoaCk7CisKKyAgICBpZiAoaC0+ZW5hYmxlX2VyIDwgMCAmJiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSkpCisgICAgICAgIGgtPmVuYWJsZV9lciA9IDA7CisKKyAgICBpZiAoaC0+ZW5hYmxlX2VyICYmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIkVycm9yIHJlc2lsaWVuY2Ugd2l0aCBzbGljZSB0aHJlYWRzIGlzIGVuYWJsZWQuIEl0IGlzIHVuc2FmZSBhbmQgdW5zdXBwb3J0ZWQgYW5kIG1heSBjcmFzaC4gIgorICAgICAgICAgICAgICAgIlVzZSBpdCBhdCB5b3VyIG93biByaXNrXG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIEhBVkVfVEhSRUFEUworc3RhdGljIGludCBkZWNvZGVfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIWF2Y3R4LT5pbnRlcm5hbC0+aXNfY29weSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtZW1zZXQoaCwgMCwgc2l6ZW9mKCpoKSk7CisKKyAgICByZXQgPSBoMjY0X2luaXRfY29udGV4dChhdmN0eCwgaCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBoLT5jb250ZXh0X2luaXRpYWxpemVkID0gMDsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKy8qKgorICogaW5zdGFudGFuZW91cyBkZWNvZGVyIHJlZnJlc2guCisgKi8KK3N0YXRpYyB2b2lkIGlkcihIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgaTsKKyAgICBmZl9oMjY0X3JlbW92ZV9hbGxfcmVmcyhoKTsKKyAgICBoLT5wb2MucHJldl9mcmFtZV9udW0gICAgICAgID0KKyAgICBoLT5wb2MucHJldl9mcmFtZV9udW1fb2Zmc2V0ID0gMDsKKyAgICBoLT5wb2MucHJldl9wb2NfbXNiICAgICAgICAgID0gMTw8MTY7CisgICAgaC0+cG9jLnByZXZfcG9jX2xzYiAgICAgICAgICA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9ERUxBWUVEX1BJQ19DT1VOVDsgaSsrKQorICAgICAgICBoLT5sYXN0X3BvY3NbaV0gPSBJTlRfTUlOOworfQorCisvKiBmb3JnZXQgb2xkIHBpY3MgYWZ0ZXIgYSBzZWVrICovCit2b2lkIGZmX2gyNjRfZmx1c2hfY2hhbmdlKEgyNjRDb250ZXh0ICpoKQoreworICAgIGludCBpLCBqOworCisgICAgaC0+bmV4dF9vdXRwdXRlZF9wb2MgPSBJTlRfTUlOOworICAgIGgtPnByZXZfaW50ZXJsYWNlZF9mcmFtZSA9IDE7CisgICAgaWRyKGgpOworCisgICAgaC0+cG9jLnByZXZfZnJhbWVfbnVtID0gLTE7CisgICAgaWYgKGgtPmN1cl9waWNfcHRyKSB7CisgICAgICAgIGgtPmN1cl9waWNfcHRyLT5yZWZlcmVuY2UgPSAwOworICAgICAgICBmb3IgKGo9aT0wOyBoLT5kZWxheWVkX3BpY1tpXTsgaSsrKQorICAgICAgICAgICAgaWYgKGgtPmRlbGF5ZWRfcGljW2ldICE9IGgtPmN1cl9waWNfcHRyKQorICAgICAgICAgICAgICAgIGgtPmRlbGF5ZWRfcGljW2orK10gPSBoLT5kZWxheWVkX3BpY1tpXTsKKyAgICAgICAgaC0+ZGVsYXllZF9waWNbal0gPSBOVUxMOworICAgIH0KKyAgICBmZl9oMjY0X3VucmVmX3BpY3R1cmUoaCwgJmgtPmxhc3RfcGljX2Zvcl9lYyk7CisKKyAgICBoLT5maXJzdF9maWVsZCA9IDA7CisgICAgaC0+cmVjb3ZlcnlfZnJhbWUgPSAtMTsKKyAgICBoLT5mcmFtZV9yZWNvdmVyZWQgPSAwOworICAgIGgtPmN1cnJlbnRfc2xpY2UgPSAwOworICAgIGgtPm1tY29fcmVzZXQgPSAxOworfQorCisvKiBmb3JnZXQgb2xkIHBpY3MgYWZ0ZXIgYSBzZWVrICovCitzdGF0aWMgdm9pZCBmbHVzaF9kcGIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIG1lbXNldChoLT5kZWxheWVkX3BpYywgMCwgc2l6ZW9mKGgtPmRlbGF5ZWRfcGljKSk7CisKKyAgICBmZl9oMjY0X2ZsdXNoX2NoYW5nZShoKTsKKyAgICBmZl9oMjY0X3NlaV91bmluaXQoJmgtPnNlaSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSDI2NF9NQVhfUElDVFVSRV9DT1VOVDsgaSsrKQorICAgICAgICBmZl9oMjY0X3VucmVmX3BpY3R1cmUoaCwgJmgtPkRQQltpXSk7CisgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOworICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+Y3VyX3BpYyk7CisKKyAgICBoLT5tYl95ID0gMDsKKworICAgIGZmX2gyNjRfZnJlZV90YWJsZXMoaCk7CisgICAgaC0+Y29udGV4dF9pbml0aWFsaXplZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2xhc3RfbmVlZGVkX25hbChIMjY0Q29udGV4dCAqaCkKK3sKKyAgICBpbnQgbmFsc19uZWVkZWQgPSAwOworICAgIGludCBmaXJzdF9zbGljZSA9IDA7CisgICAgaW50IGksIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoLT5wa3QubmJfbmFsczsgaSsrKSB7CisgICAgICAgIEgyNjQ1TkFMICpuYWwgPSAmaC0+cGt0Lm5hbHNbaV07CisgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICAgICAgLyogcGFja2V0cyBjYW4gc29tZXRpbWVzIGNvbnRhaW4gbXVsdGlwbGUgUFBTL1NQUywKKyAgICAgICAgICogZS5nLiB0d28gUEFGRiBmaWVsZCBwaWN0dXJlcyBpbiBvbmUgcGFja2V0LCBvciBhIGRlbXV4ZXIKKyAgICAgICAgICogd2hpY2ggc3BsaXRzIE5BTHMgc3RyYW5nZWx5IGlmIHNvLCB3aGVuIGZyYW1lIHRocmVhZGluZyB3ZQorICAgICAgICAgKiBjYW4ndCBzdGFydCB0aGUgbmV4dCB0aHJlYWQgdW50aWwgd2UndmUgcmVhZCBhbGwgb2YgdGhlbSAqLworICAgICAgICBzd2l0Y2ggKG5hbC0+dHlwZSkgeworICAgICAgICBjYXNlIEgyNjRfTkFMX1NQUzoKKyAgICAgICAgY2FzZSBIMjY0X05BTF9QUFM6CisgICAgICAgICAgICBuYWxzX25lZWRlZCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjY0X05BTF9EUEE6CisgICAgICAgIGNhc2UgSDI2NF9OQUxfSURSX1NMSUNFOgorICAgICAgICBjYXNlIEgyNjRfTkFMX1NMSUNFOgorICAgICAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBuYWwtPmRhdGEgKyAxLCBuYWwtPnNpemUgLSAxKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHplcm8tc2l6ZWQgVkNMIE5BTCB1bml0XG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoaC0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZ2V0X3VlX2dvbG9tYl9sb25nKCZnYikgfHwgIC8vIGZpcnN0X21iX2luX3NsaWNlCisgICAgICAgICAgICAgICAgIWZpcnN0X3NsaWNlIHx8CisgICAgICAgICAgICAgICAgZmlyc3Rfc2xpY2UgIT0gbmFsLT50eXBlKQorICAgICAgICAgICAgICAgIG5hbHNfbmVlZGVkID0gaTsKKyAgICAgICAgICAgIGlmICghZmlyc3Rfc2xpY2UpCisgICAgICAgICAgICAgICAgZmlyc3Rfc2xpY2UgPSBuYWwtPnR5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmFsc19uZWVkZWQ7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX2dyZWVuX21ldGFkYXRhKGNvbnN0IEgyNjRTRUlHcmVlbk1ldGFEYXRhICpnbSwgdm9pZCAqbG9nY3R4KQoreworICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19ERUJVRywgIkdyZWVuIE1ldGFkYXRhIEluZm8gU0VJIG1lc3NhZ2VcbiIpOworICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19ERUJVRywgIiAgZ3JlZW5fbWV0YWRhdGFfdHlwZTogJWRcbiIsIGdtLT5ncmVlbl9tZXRhZGF0YV90eXBlKTsKKworICAgIGlmIChnbS0+Z3JlZW5fbWV0YWRhdGFfdHlwZSA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19ERUJVRywgIiAgZ3JlZW5fbWV0YWRhdGFfcGVyaW9kX3R5cGU6ICVkXG4iLCBnbS0+cGVyaW9kX3R5cGUpOworCisgICAgICAgIGlmIChnbS0+cGVyaW9kX3R5cGUgPT0gMikKKyAgICAgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19ERUJVRywgIiAgZ3JlZW5fbWV0YWRhdGFfbnVtX3NlY29uZHM6ICVkXG4iLCBnbS0+bnVtX3NlY29uZHMpOworICAgICAgICBlbHNlIGlmIChnbS0+cGVyaW9kX3R5cGUgPT0gMykKKyAgICAgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19ERUJVRywgIiAgZ3JlZW5fbWV0YWRhdGFfbnVtX3BpY3R1cmVzOiAlZFxuIiwgZ20tPm51bV9waWN0dXJlcyk7CisKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0RFQlVHLCAiICBTRUkgR1JFRU4gQ29tcGxleGl0eSBNZXRyaWNzOiAlZiAlZiAlZiAlZlxuIiwKKyAgICAgICAgICAgICAgIChmbG9hdClnbS0+cGVyY2VudF9ub25femVyb19tYWNyb2Jsb2Nrcy8yNTUsCisgICAgICAgICAgICAgICAoZmxvYXQpZ20tPnBlcmNlbnRfaW50cmFfY29kZWRfbWFjcm9ibG9ja3MvMjU1LAorICAgICAgICAgICAgICAgKGZsb2F0KWdtLT5wZXJjZW50X3NpeF90YXBfZmlsdGVyaW5nLzI1NSwKKyAgICAgICAgICAgICAgIChmbG9hdClnbS0+cGVyY2VudF9hbHBoYV9wb2ludF9kZWJsb2NraW5nX2luc3RhbmNlLzI1NSk7CisKKyAgICB9IGVsc2UgaWYgKGdtLT5ncmVlbl9tZXRhZGF0YV90eXBlID09IDEpIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0RFQlVHLCAiICB4c2RfbWV0cmljX3R5cGU6ICVkXG4iLCBnbS0+eHNkX21ldHJpY190eXBlKTsKKworICAgICAgICBpZiAoZ20tPnhzZF9tZXRyaWNfdHlwZSA9PSAwKQorICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0RFQlVHLCAiICB4c2RfbWV0cmljX3ZhbHVlOiAlZlxuIiwKKyAgICAgICAgICAgICAgICAgICAoZmxvYXQpZ20tPnhzZF9tZXRyaWNfdmFsdWUvMTAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF91bml0cyhIMjY0Q29udGV4dCAqaCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvbnN0IGF2Y3R4ID0gaC0+YXZjdHg7CisgICAgaW50IG5hbHNfbmVlZGVkID0gMDsgLy8vPCBudW1iZXIgb2YgTkFMcyB0aGF0IG5lZWQgZGVjb2RpbmcgYmVmb3JlIHRoZSBuZXh0IGZyYW1lIHRocmVhZCBzdGFydHMKKyAgICBpbnQgaWRyX2NsZWFyZWQ9MDsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIGgtPmhhc19zbGljZSA9IDA7CisgICAgaC0+bmFsX3VuaXRfdHlwZT0gMDsKKworICAgIGlmICghKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9DSFVOS1MpKSB7CisgICAgICAgIGgtPmN1cnJlbnRfc2xpY2UgPSAwOworICAgICAgICBpZiAoIWgtPmZpcnN0X2ZpZWxkKQorICAgICAgICAgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOworICAgICAgICBmZl9oMjY0X3NlaV91bmluaXQoJmgtPnNlaSk7CisgICAgfQorCisgICAgaWYgKGgtPm5hbF9sZW5ndGhfc2l6ZSA9PSA0KSB7CisgICAgICAgIGlmIChidWZfc2l6ZSA+IDggJiYgQVZfUkIzMihidWYpID09IDEgJiYgQVZfUkIzMihidWYrNSkgPiAodW5zaWduZWQpYnVmX3NpemUpIHsKKyAgICAgICAgICAgIGgtPmlzX2F2YyA9IDA7CisgICAgICAgIH1lbHNlIGlmKGJ1Zl9zaXplID4gMyAmJiBBVl9SQjMyKGJ1ZikgPiAxICYmIEFWX1JCMzIoYnVmKSA8PSAodW5zaWduZWQpYnVmX3NpemUpCisgICAgICAgICAgICBoLT5pc19hdmMgPSAxOworICAgIH0KKworICAgIHJldCA9IGZmX2gyNjQ1X3BhY2tldF9zcGxpdCgmaC0+cGt0LCBidWYsIGJ1Zl9zaXplLCBhdmN0eCwgaC0+aXNfYXZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5uYWxfbGVuZ3RoX3NpemUsIGF2Y3R4LT5jb2RlY19pZCwgYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX0ZBU1QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVycm9yIHNwbGl0dGluZyB0aGUgaW5wdXQgaW50byBOQUwgdW5pdHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkKKyAgICAgICAgbmFsc19uZWVkZWQgPSBnZXRfbGFzdF9uZWVkZWRfbmFsKGgpOworICAgIGlmIChuYWxzX25lZWRlZCA8IDApCisgICAgICAgIHJldHVybiBuYWxzX25lZWRlZDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoLT5wa3QubmJfbmFsczsgaSsrKSB7CisgICAgICAgIEgyNjQ1TkFMICpuYWwgPSAmaC0+cGt0Lm5hbHNbaV07CisgICAgICAgIGludCBtYXhfc2xpY2VfY3R4LCBlcnI7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05SRUYgJiYKKyAgICAgICAgICAgIG5hbC0+cmVmX2lkYyA9PSAwICYmIG5hbC0+dHlwZSAhPSBIMjY0X05BTF9TRUkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBGSVhNRSB0aGVzZSBzaG91bGQgc3RvcCBiZWluZyBjb250ZXh0LWdsb2JhbCB2YXJpYWJsZXMKKyAgICAgICAgaC0+bmFsX3JlZl9pZGMgICA9IG5hbC0+cmVmX2lkYzsKKyAgICAgICAgaC0+bmFsX3VuaXRfdHlwZSA9IG5hbC0+dHlwZTsKKworICAgICAgICBlcnIgPSAwOworICAgICAgICBzd2l0Y2ggKG5hbC0+dHlwZSkgeworICAgICAgICBjYXNlIEgyNjRfTkFMX0lEUl9TTElDRToKKyAgICAgICAgICAgIGlmICgobmFsLT5kYXRhWzFdICYgMHhGQykgPT0gMHg5OCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBpbnRlciBJRFIgZnJhbWVcbiIpOworICAgICAgICAgICAgICAgIGgtPm5leHRfb3V0cHV0ZWRfcG9jID0gSU5UX01JTjsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCFpZHJfY2xlYXJlZCkgeworICAgICAgICAgICAgICAgIGlmIChoLT5jdXJyZW50X3NsaWNlICYmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBtaXhlZCBJRFIgLyBub24gSURSIGZyYW1lcyBjYW5ub3QgYmUgZGVjb2RlZCBpbiBzbGljZSBtdWx0aXRocmVhZGluZyBtb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlkcihoKTsgLy8gRklYTUUgZW5zdXJlIHdlIGRvbid0IGxvc2Ugc29tZSBmcmFtZXMgaWYgdGhlcmUgaXMgcmVvcmRlcmluZworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWRyX2NsZWFyZWQgPSAxOworICAgICAgICAgICAgaC0+aGFzX3JlY292ZXJ5X3BvaW50ID0gMTsKKyAgICAgICAgY2FzZSBIMjY0X05BTF9TTElDRToKKyAgICAgICAgICAgIGgtPmhhc19zbGljZSA9IDE7CisKKyAgICAgICAgICAgIGlmICgoZXJyID0gZmZfaDI2NF9xdWV1ZV9kZWNvZGVfc2xpY2UoaCwgbmFsKSkpIHsKKyAgICAgICAgICAgICAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCA9IGgtPnNsaWNlX2N0eCArIGgtPm5iX3NsaWNlX2N0eF9xdWV1ZWQ7CisgICAgICAgICAgICAgICAgc2wtPnJlZl9jb3VudFswXSA9IHNsLT5yZWZfY291bnRbMV0gPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaC0+Y3VycmVudF9zbGljZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUgJiYKKyAgICAgICAgICAgICAgICAgICAgaSA+PSBuYWxzX25lZWRlZCAmJiAhaC0+c2V0dXBfZmluaXNoZWQgJiYgaC0+Y3VyX3BpY19wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CisgICAgICAgICAgICAgICAgICAgIGgtPnNldHVwX2ZpbmlzaGVkID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaC0+YXZjdHgtPmh3YWNjZWwgJiYKKyAgICAgICAgICAgICAgICAgICAgKHJldCA9IGgtPmF2Y3R4LT5od2FjY2VsLT5zdGFydF9mcmFtZShoLT5hdmN0eCwgYnVmLCBidWZfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1heF9zbGljZV9jdHggPSBhdmN0eC0+aHdhY2NlbCA/IDEgOiBoLT5uYl9zbGljZV9jdHg7CisgICAgICAgICAgICBpZiAoaC0+bmJfc2xpY2VfY3R4X3F1ZXVlZCA9PSBtYXhfc2xpY2VfY3R4KSB7CisgICAgICAgICAgICAgICAgaWYgKGgtPmF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoYXZjdHgsIG5hbC0+cmF3X2RhdGEsIG5hbC0+cmF3X3NpemUpOworICAgICAgICAgICAgICAgICAgICBoLT5uYl9zbGljZV9jdHhfcXVldWVkID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmZfaDI2NF9leGVjdXRlX2RlY29kZV9zbGljZXMoaCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjY0X05BTF9EUEE6CisgICAgICAgIGNhc2UgSDI2NF9OQUxfRFBCOgorICAgICAgICBjYXNlIEgyNjRfTkFMX0RQQzoKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgImRhdGEgcGFydGl0aW9uaW5nIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIMjY0X05BTF9TRUk6CisgICAgICAgICAgICByZXQgPSBmZl9oMjY0X3NlaV9kZWNvZGUoJmgtPnNlaSwgJm5hbC0+Z2IsICZoLT5wcywgYXZjdHgpOworICAgICAgICAgICAgaC0+aGFzX3JlY292ZXJ5X3BvaW50ID0gaC0+aGFzX3JlY292ZXJ5X3BvaW50IHx8IGgtPnNlaS5yZWNvdmVyeV9wb2ludC5yZWNvdmVyeV9mcmFtZV9jbnQgIT0gLTE7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfR1JFRU5fTUQpCisgICAgICAgICAgICAgICAgZGVidWdfZ3JlZW5fbWV0YWRhdGEoJmgtPnNlaS5ncmVlbl9tZXRhZGF0YSwgaC0+YXZjdHgpOworICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEgyNjRfTkFMX1NQUzogeworICAgICAgICAgICAgR2V0Qml0Q29udGV4dCB0bXBfZ2IgPSBuYWwtPmdiOworICAgICAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsICYmIGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfcGFyYW1zKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZjdHgtPmh3YWNjZWwtPmRlY29kZV9wYXJhbXMoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+cmF3X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5yYXdfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZmX2gyNjRfZGVjb2RlX3NlcV9wYXJhbWV0ZXJfc2V0KCZ0bXBfZ2IsIGF2Y3R4LCAmaC0+cHMsIDApID49IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiU1BTIGRlY29kaW5nIGZhaWx1cmUsIHRyeWluZyBhZ2FpbiB3aXRoIHRoZSBjb21wbGV0ZSBOQUxcbiIpOworICAgICAgICAgICAgaW5pdF9nZXRfYml0czgoJnRtcF9nYiwgbmFsLT5yYXdfZGF0YSArIDEsIG5hbC0+cmF3X3NpemUgLSAxKTsKKyAgICAgICAgICAgIGlmIChmZl9oMjY0X2RlY29kZV9zZXFfcGFyYW1ldGVyX3NldCgmdG1wX2diLCBhdmN0eCwgJmgtPnBzLCAwKSA+PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfc2VxX3BhcmFtZXRlcl9zZXQoJm5hbC0+Z2IsIGF2Y3R4LCAmaC0+cHMsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBIMjY0X05BTF9QUFM6CisgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwgJiYgYXZjdHgtPmh3YWNjZWwtPmRlY29kZV9wYXJhbXMpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBhdmN0eC0+aHdhY2NlbC0+ZGVjb2RlX3BhcmFtcyhhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5yYXdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnJhd19zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9waWN0dXJlX3BhcmFtZXRlcl9zZXQoJm5hbC0+Z2IsIGF2Y3R4LCAmaC0+cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5zaXplX2JpdHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgKGgtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEgyNjRfTkFMX0FVRDoKKyAgICAgICAgY2FzZSBIMjY0X05BTF9FTkRfU0VRVUVOQ0U6CisgICAgICAgIGNhc2UgSDI2NF9OQUxfRU5EX1NUUkVBTToKKyAgICAgICAgY2FzZSBIMjY0X05BTF9GSUxMRVJfREFUQToKKyAgICAgICAgY2FzZSBIMjY0X05BTF9TUFNfRVhUOgorICAgICAgICBjYXNlIEgyNjRfTkFMX0FVWElMSUFSWV9TTElDRToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVbmtub3duIE5BTCBjb2RlOiAlZCAoJWQgYml0cylcbiIsCisgICAgICAgICAgICAgICAgICAgbmFsLT50eXBlLCBuYWwtPnNpemVfYml0cyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJkZWNvZGVfc2xpY2VfaGVhZGVyIGVycm9yXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IGZmX2gyNjRfZXhlY3V0ZV9kZWNvZGVfc2xpY2VzKGgpOworICAgIGlmIChyZXQgPCAwICYmIChoLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCisgICAgICAgIGdvdG8gZW5kOworCisgICAgcmV0ID0gMDsKK2VuZDoKKworI2lmIENPTkZJR19FUlJPUl9SRVNJTElFTkNFCisgICAgLyoKKyAgICAgKiBGSVhNRTogRXJyb3IgaGFuZGxpbmcgY29kZSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgaW50ZXJsYWNlZAorICAgICAqIHdoZW4gc2xpY2VzIHNwYW4gbXVsdGlwbGUgcm93cworICAgICAqIFRoZSBmZl9lcl9hZGRfc2xpY2UgY2FsbHMgZG9uJ3Qgd29yayByaWdodCBmb3IgYm90dG9tCisgICAgICogZmllbGRzOyB0aGV5IGNhdXNlIG1hc3NpdmUgZXJyb25lb3VzIGVycm9yIGNvbmNlYWxpbmcKKyAgICAgKiBFcnJvciBtYXJraW5nIGNvdmVycyBib3RoIGZpZWxkcyAodG9wIGFuZCBib3R0b20pLgorICAgICAqIFRoaXMgY2F1c2VzIGEgbWlzbWF0Y2hlZCBzLT5lcnJvcl9jb3VudAorICAgICAqIGFuZCBhIGJhZCBlcnJvciB0YWJsZS4gRnVydGhlciwgdGhlIGVycm9yIGNvdW50IGdvZXMgdG8KKyAgICAgKiBJTlRfTUFYIHdoZW4gY2FsbGVkIGZvciBib3R0b20gZmllbGQsIGJlY2F1c2UgbWJfeSBpcworICAgICAqIHBhc3QgZW5kIGJ5IG9uZSAoY2FsbGVycyBmYXVsdCkgYW5kIHJlc3luY19tYl95ICE9IDAKKyAgICAgKiBjYXVzZXMgcHJvYmxlbXMgZm9yIHRoZSBmaXJzdCBNQiBsaW5lLCB0b28uCisgICAgICovCisgICAgaWYgKCFGSUVMRF9QSUNUVVJFKGgpICYmIGgtPmN1cnJlbnRfc2xpY2UgJiYKKyAgICAgICAgaC0+cHMuc3BzID09IChjb25zdCBTUFMqKWgtPnBzLnNwc19saXN0W2gtPnBzLnBwcy0+c3BzX2lkXS0+ZGF0YSAmJgorICAgICAgICBoLT5lbmFibGVfZXIpIHsKKworICAgICAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCA9IGgtPnNsaWNlX2N0eDsKKyAgICAgICAgaW50IHVzZV9sYXN0X3BpYyA9IGgtPmxhc3RfcGljX2Zvcl9lYy5mLT5idWZbMF0gJiYgIXNsLT5yZWZfY291bnRbMF07CisKKyAgICAgICAgZmZfaDI2NF9zZXRfZXJwaWMoJnNsLT5lci5jdXJfcGljLCBoLT5jdXJfcGljX3B0cik7CisKKyAgICAgICAgaWYgKHVzZV9sYXN0X3BpYykgeworICAgICAgICAgICAgZmZfaDI2NF9zZXRfZXJwaWMoJnNsLT5lci5sYXN0X3BpYywgJmgtPmxhc3RfcGljX2Zvcl9lYyk7CisgICAgICAgICAgICBzbC0+cmVmX2xpc3RbMF1bMF0ucGFyZW50ID0gJmgtPmxhc3RfcGljX2Zvcl9lYzsKKyAgICAgICAgICAgIG1lbWNweShzbC0+cmVmX2xpc3RbMF1bMF0uZGF0YSwgaC0+bGFzdF9waWNfZm9yX2VjLmYtPmRhdGEsIHNpemVvZihzbC0+cmVmX2xpc3RbMF1bMF0uZGF0YSkpOworICAgICAgICAgICAgbWVtY3B5KHNsLT5yZWZfbGlzdFswXVswXS5saW5lc2l6ZSwgaC0+bGFzdF9waWNfZm9yX2VjLmYtPmxpbmVzaXplLCBzaXplb2Yoc2wtPnJlZl9saXN0WzBdWzBdLmxpbmVzaXplKSk7CisgICAgICAgICAgICBzbC0+cmVmX2xpc3RbMF1bMF0ucmVmZXJlbmNlID0gaC0+bGFzdF9waWNfZm9yX2VjLnJlZmVyZW5jZTsKKyAgICAgICAgfSBlbHNlIGlmIChzbC0+cmVmX2NvdW50WzBdKSB7CisgICAgICAgICAgICBmZl9oMjY0X3NldF9lcnBpYygmc2wtPmVyLmxhc3RfcGljLCBzbC0+cmVmX2xpc3RbMF1bMF0ucGFyZW50KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBmZl9oMjY0X3NldF9lcnBpYygmc2wtPmVyLmxhc3RfcGljLCBOVUxMKTsKKworICAgICAgICBpZiAoc2wtPnJlZl9jb3VudFsxXSkKKyAgICAgICAgICAgIGZmX2gyNjRfc2V0X2VycGljKCZzbC0+ZXIubmV4dF9waWMsIHNsLT5yZWZfbGlzdFsxXVswXS5wYXJlbnQpOworCisgICAgICAgIHNsLT5lci5yZWZfY291bnQgPSBzbC0+cmVmX2NvdW50WzBdOworCisgICAgICAgIGZmX2VyX2ZyYW1lX2VuZCgmc2wtPmVyKTsKKyAgICAgICAgaWYgKHVzZV9sYXN0X3BpYykKKyAgICAgICAgICAgIG1lbXNldCgmc2wtPnJlZl9saXN0WzBdWzBdLCAwLCBzaXplb2Yoc2wtPnJlZl9saXN0WzBdWzBdKSk7CisgICAgfQorI2VuZGlmIC8qIENPTkZJR19FUlJPUl9SRVNJTElFTkNFICovCisgICAgLyogY2xlYW4gdXAgKi8KKyAgICBpZiAoaC0+Y3VyX3BpY19wdHIgJiYgIWgtPmRyb3BwYWJsZSAmJiBoLT5oYXNfc2xpY2UpIHsKKyAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmaC0+Y3VyX3BpY19wdHItPnRmLCBJTlRfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHJldCA8IDApID8gcmV0IDogYnVmX3NpemU7Cit9CisKKy8qKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQgZm9yIGJ1aWxkaW5nIHRoZSBjdXJyZW50IGZyYW1lLgorICovCitzdGF0aWMgaW50IGdldF9jb25zdW1lZF9ieXRlcyhpbnQgcG9zLCBpbnQgYnVmX3NpemUpCit7CisgICAgaWYgKHBvcyA9PSAwKQorICAgICAgICBwb3MgPSAxOyAgICAgICAgLy8gYXZvaWQgaW5maW5pdGUgbG9vcHMgKEkgZG91YnQgdGhhdCBpcyBuZWVkZWQgYnV0Li4uKQorICAgIGlmIChwb3MgKyAxMCA+IGJ1Zl9zaXplKQorICAgICAgICBwb3MgPSBidWZfc2l6ZTsgLy8gb29wcyA7KQorCisgICAgcmV0dXJuIHBvczsKK30KKworc3RhdGljIGludCBvdXRwdXRfZnJhbWUoSDI2NENvbnRleHQgKmgsIEFWRnJhbWUgKmRzdCwgSDI2NFBpY3R1cmUgKnNyY3ApCit7CisgICAgQVZGcmFtZSAqc3JjID0gc3JjcC0+ZjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGRzdCwgc3JjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2X2RpY3Rfc2V0KCZkc3QtPm1ldGFkYXRhLCAic3RlcmVvX21vZGUiLCBmZl9oMjY0X3NlaV9zdGVyZW9fbW9kZSgmaC0+c2VpLmZyYW1lX3BhY2tpbmcpLCAwKTsKKworICAgIGlmIChzcmNwLT5zZWlfcmVjb3ZlcnlfZnJhbWVfY250ID09IDApCisgICAgICAgIGRzdC0+a2V5X2ZyYW1lID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX2V4dHJhKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIGludCBjbnQ9IGJ1Zls1XSYweDFmOworICAgIGNvbnN0IHVpbnQ4X3QgKnA9IGJ1Zis2OworICAgIHdoaWxlKGNudC0tKXsKKyAgICAgICAgaW50IG5hbHNpemU9IEFWX1JCMTYocCkgKyAyOworICAgICAgICBpZihuYWxzaXplID4gYnVmX3NpemUgLSAocC1idWYpIHx8IChwWzJdICYgMHg5RikgIT0gNykKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwICs9IG5hbHNpemU7CisgICAgfQorICAgIGNudCA9ICoocCsrKTsKKyAgICBpZighY250KQorICAgICAgICByZXR1cm4gMDsKKyAgICB3aGlsZShjbnQtLSl7CisgICAgICAgIGludCBuYWxzaXplPSBBVl9SQjE2KHApICsgMjsKKyAgICAgICAgaWYobmFsc2l6ZSA+IGJ1Zl9zaXplIC0gKHAtYnVmKSB8fCAocFsyXSAmIDB4OUYpICE9IDgpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcCArPSBuYWxzaXplOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBmaW5hbGl6ZV9mcmFtZShIMjY0Q29udGV4dCAqaCwgQVZGcmFtZSAqZHN0LCBIMjY0UGljdHVyZSAqb3V0LCBpbnQgKmdvdF9mcmFtZSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCgoaC0+YXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19PVVRQVVRfQ09SUlVQVCkgfHwKKyAgICAgICAgIChoLT5hdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfU0hPV19BTEwpIHx8CisgICAgICAgICBvdXQtPnJlY292ZXJlZCkpIHsKKworICAgICAgICBpZiAoIWgtPmF2Y3R4LT5od2FjY2VsICYmCisgICAgICAgICAgICAob3V0LT5maWVsZF9wb2NbMF0gPT0gSU5UX01BWCB8fAorICAgICAgICAgICAgIG91dC0+ZmllbGRfcG9jWzFdID09IElOVF9NQVgpCisgICAgICAgICAgICkgeworICAgICAgICAgICAgaW50IHA7CisgICAgICAgICAgICBBVkZyYW1lICpmID0gb3V0LT5mOworICAgICAgICAgICAgaW50IGZpZWxkID0gb3V0LT5maWVsZF9wb2NbMF0gPT0gSU5UX01BWDsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9kYXRhWzRdOworICAgICAgICAgICAgaW50IGxpbmVzaXplc1s0XTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19kYXRhWzRdOworCisgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkR1cGxpY2F0aW5nIGZpZWxkICVkIHRvIGZpbGwgbWlzc2luZ1xuIiwgZmllbGQpOworCisgICAgICAgICAgICBmb3IgKHAgPSAwOyBwPDQ7IHArKykgeworICAgICAgICAgICAgICAgIGRzdF9kYXRhW3BdID0gZi0+ZGF0YVtwXSArIChmaWVsZF4xKSpmLT5saW5lc2l6ZVtwXTsKKyAgICAgICAgICAgICAgICBzcmNfZGF0YVtwXSA9IGYtPmRhdGFbcF0gKyAgZmllbGQgICAqZi0+bGluZXNpemVbcF07CisgICAgICAgICAgICAgICAgbGluZXNpemVzW3BdID0gMipmLT5saW5lc2l6ZVtwXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfaW1hZ2VfY29weShkc3RfZGF0YSwgbGluZXNpemVzLCBzcmNfZGF0YSwgbGluZXNpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5mb3JtYXQsIGYtPndpZHRoLCBmLT5oZWlnaHQ+PjEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gb3V0cHV0X2ZyYW1lKGgsIGRzdCwgb3V0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgICAgIGlmIChDT05GSUdfTVBFR1ZJREVPKSB7CisgICAgICAgICAgICBmZl9wcmludF9kZWJ1Z19pbmZvMihoLT5hdmN0eCwgZHN0LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5tYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5xc2NhbGVfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPm1vdGlvbl92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bWJfd2lkdGgsIGgtPm1iX2hlaWdodCwgaC0+bWJfc3RyaWRlLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNlbmRfbmV4dF9kZWxheWVkX2ZyYW1lKEgyNjRDb250ZXh0ICpoLCBBVkZyYW1lICpkc3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBpbnQgYnVmX2luZGV4KQoreworICAgIGludCByZXQsIGksIG91dF9pZHg7CisgICAgSDI2NFBpY3R1cmUgKm91dCA9IGgtPmRlbGF5ZWRfcGljWzBdOworCisgICAgaC0+Y3VyX3BpY19wdHIgPSBOVUxMOworICAgIGgtPmZpcnN0X2ZpZWxkID0gMDsKKworICAgIG91dF9pZHggPSAwOworICAgIGZvciAoaSA9IDE7CisgICAgICAgICBoLT5kZWxheWVkX3BpY1tpXSAmJgorICAgICAgICAgIWgtPmRlbGF5ZWRfcGljW2ldLT5mLT5rZXlfZnJhbWUgJiYKKyAgICAgICAgICFoLT5kZWxheWVkX3BpY1tpXS0+bW1jb19yZXNldDsKKyAgICAgICAgIGkrKykKKyAgICAgICAgaWYgKGgtPmRlbGF5ZWRfcGljW2ldLT5wb2MgPCBvdXQtPnBvYykgeworICAgICAgICAgICAgb3V0ICAgICA9IGgtPmRlbGF5ZWRfcGljW2ldOworICAgICAgICAgICAgb3V0X2lkeCA9IGk7CisgICAgICAgIH0KKworICAgIGZvciAoaSA9IG91dF9pZHg7IGgtPmRlbGF5ZWRfcGljW2ldOyBpKyspCisgICAgICAgIGgtPmRlbGF5ZWRfcGljW2ldID0gaC0+ZGVsYXllZF9waWNbaSArIDFdOworCisgICAgaWYgKG91dCkgeworICAgICAgICBvdXQtPnJlZmVyZW5jZSAmPSB+REVMQVlFRF9QSUNfUkVGOworICAgICAgICByZXQgPSBmaW5hbGl6ZV9mcmFtZShoLCBkc3RfZnJhbWUsIG91dCwgZ290X2ZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBidWZfaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgaDI2NF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICA9IGF2cGt0LT5zaXplOworICAgIEgyNjRDb250ZXh0ICpoICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcGljdCAgICAgID0gZGF0YTsKKyAgICBpbnQgYnVmX2luZGV4OworICAgIGludCByZXQ7CisKKyAgICBoLT5mbGFncyA9IGF2Y3R4LT5mbGFnczsKKyAgICBoLT5zZXR1cF9maW5pc2hlZCA9IDA7CisgICAgaC0+bmJfc2xpY2VfY3R4X3F1ZXVlZCA9IDA7CisKKyAgICBmZl9oMjY0X3VucmVmX3BpY3R1cmUoaCwgJmgtPmxhc3RfcGljX2Zvcl9lYyk7CisKKyAgICAvKiBlbmQgb2Ygc3RyZWFtLCBvdXRwdXQgd2hhdCBpcyBzdGlsbCBpbiB0aGUgYnVmZmVycyAqLworICAgIGlmIChidWZfc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gc2VuZF9uZXh0X2RlbGF5ZWRfZnJhbWUoaCwgcGljdCwgZ290X2ZyYW1lLCAwKTsKKworICAgIGlmIChoLT5pc19hdmMgJiYgYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsIE5VTEwpKSB7CisgICAgICAgIGludCBzaWRlX3NpemU7CisgICAgICAgIHVpbnQ4X3QgKnNpZGUgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwgJnNpZGVfc2l6ZSk7CisgICAgICAgIGlmIChpc19leHRyYShzaWRlLCBzaWRlX3NpemUpKQorICAgICAgICAgICAgZmZfaDI2NF9kZWNvZGVfZXh0cmFkYXRhKHNpZGUsIHNpZGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+cHMsICZoLT5pc19hdmMsICZoLT5uYWxfbGVuZ3RoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmVycl9yZWNvZ25pdGlvbiwgYXZjdHgpOworICAgIH0KKyAgICBpZihoLT5pc19hdmMgJiYgYnVmX3NpemUgPj0gOSAmJiBidWZbMF09PTEgJiYgYnVmWzJdPT0wICYmIChidWZbNF0mMHhGQyk9PTB4RkMgJiYgKGJ1Zls1XSYweDFGKSAmJiBidWZbOF09PTB4NjcpeworICAgICAgICBpZiAoaXNfZXh0cmEoYnVmLCBidWZfc2l6ZSkpCisgICAgICAgICAgICByZXR1cm4gZmZfaDI2NF9kZWNvZGVfZXh0cmFkYXRhKGJ1ZiwgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5wcywgJmgtPmlzX2F2YywgJmgtPm5hbF9sZW5ndGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmVycl9yZWNvZ25pdGlvbiwgYXZjdHgpOworICAgIH0KKworICAgIGJ1Zl9pbmRleCA9IGRlY29kZV9uYWxfdW5pdHMoaCwgYnVmLCBidWZfc2l6ZSk7CisgICAgaWYgKGJ1Zl9pbmRleCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKCFoLT5jdXJfcGljX3B0ciAmJiBoLT5uYWxfdW5pdF90eXBlID09IEgyNjRfTkFMX0VORF9TRVFVRU5DRSkgeworICAgICAgICBhdl9hc3NlcnQwKGJ1Zl9pbmRleCA8PSBidWZfc2l6ZSk7CisgICAgICAgIHJldHVybiBzZW5kX25leHRfZGVsYXllZF9mcmFtZShoLCBwaWN0LCBnb3RfZnJhbWUsIGJ1Zl9pbmRleCk7CisgICAgfQorCisgICAgaWYgKCEoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX0NIVU5LUykgJiYgKCFoLT5jdXJfcGljX3B0ciB8fCAhaC0+aGFzX3NsaWNlKSkgeworICAgICAgICBpZiAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiB8fAorICAgICAgICAgICAgYnVmX3NpemUgPj0gNCAmJiAhbWVtY21wKCJRMjY0IiwgYnVmLCA0KSkKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJubyBmcmFtZSFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoIShhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfQ0hVTktTKSB8fAorICAgICAgICAoaC0+bWJfeSA+PSBoLT5tYl9oZWlnaHQgJiYgaC0+bWJfaGVpZ2h0KSkgeworICAgICAgICBpZiAoKHJldCA9IGZmX2gyNjRfZmllbGRfZW5kKGgsICZoLT5zbGljZV9jdHhbMF0sIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIC8qIFdhaXQgZm9yIHNlY29uZCBmaWVsZC4gKi8KKyAgICAgICAgaWYgKGgtPm5leHRfb3V0cHV0X3BpYykgeworICAgICAgICAgICAgcmV0ID0gZmluYWxpemVfZnJhbWUoaCwgcGljdCwgaC0+bmV4dF9vdXRwdXRfcGljLCBnb3RfZnJhbWUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2Fzc2VydDAocGljdC0+YnVmWzBdIHx8ICEqZ290X2ZyYW1lKTsKKworICAgIGZmX2gyNjRfdW5yZWZfcGljdHVyZShoLCAmaC0+bGFzdF9waWNfZm9yX2VjKTsKKworICAgIHJldHVybiBnZXRfY29uc3VtZWRfYnl0ZXMoYnVmX2luZGV4LCBidWZfc2l6ZSk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEgyNjRDb250ZXh0LCB4KQorI2RlZmluZSBWRCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaDI2NF9vcHRpb25zW10gPSB7CisgICAgeyAiaXNfYXZjIiwgImlzIGF2YyIsIE9GRlNFVChpc19hdmMpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDB9LCAwLCAxLCAwIH0sCisgICAgeyAibmFsX2xlbmd0aF9zaXplIiwgIm5hbF9sZW5ndGhfc2l6ZSIsIE9GRlNFVChuYWxfbGVuZ3RoX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDQsIDAgfSwKKyAgICB7ICJlbmFibGVfZXIiLCAiRW5hYmxlIGVycm9yIHJlc2lsaWVuY2Ugb24gZGFtYWdlZCBmcmFtZXMgKHVuc2FmZSkiLCBPRkZTRVQoZW5hYmxlX2VyKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZEIH0sCisgICAgeyAieDI2NF9idWlsZCIsICJBc3N1bWUgdGhpcyB4MjY0IHZlcnNpb24gaWYgbm8geDI2NCB2ZXJzaW9uIGZvdW5kIGluIGFueSBTRUkiLCBPRkZTRVQoeDI2NF9idWlsZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBWRCB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaDI2NF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJIMjY0IERlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBoMjY0X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2gyNjRfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgID0gImgyNjQiLAorICAgIC5sb25nX25hbWUgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjQgLyBBVkMgLyBNUEVHLTQgQVZDIC8gTVBFRy00IHBhcnQgMTAiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoSDI2NENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBoMjY0X2RlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBoMjY0X2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IGgyNjRfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSAvKkFWX0NPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCovIEFWX0NPREVDX0NBUF9EUjEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5od19jb25maWdzICAgICAgICAgICAgPSAoY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwqW10pIHsKKyNpZiBDT05GSUdfSDI2NF9EWFZBMl9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9EWFZBMihoMjY0KSwKKyNlbmRpZgorI2lmIENPTkZJR19IMjY0X0QzRDExVkFfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfRDNEMTFWQShoMjY0KSwKKyNlbmRpZgorI2lmIENPTkZJR19IMjY0X0QzRDExVkEyX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX0QzRDExVkEyKGgyNjQpLAorI2VuZGlmCisjaWYgQ09ORklHX0gyNjRfTlZERUNfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfTlZERUMoaDI2NCksCisjZW5kaWYKKyNpZiBDT05GSUdfSDI2NF9WQUFQSV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9WQUFQSShoMjY0KSwKKyNlbmRpZgorI2lmIENPTkZJR19IMjY0X1ZEUEFVX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZEUEFVKGgyNjQpLAorI2VuZGlmCisjaWYgQ09ORklHX0gyNjRfVklERU9UT09MQk9YX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZJREVPVE9PTEJPWChoMjY0KSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfCBGRl9DT0RFQ19DQVBfRVhQT1JUU19DUk9QUElORywKKyAgICAuZmx1c2ggICAgICAgICAgICAgICAgID0gZmx1c2hfZHBiLAorICAgIC5pbml0X3RocmVhZF9jb3B5ICAgICAgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChkZWNvZGVfaW5pdF90aHJlYWRfY29weSksCisgICAgLnVwZGF0ZV90aHJlYWRfY29udGV4dCA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKGZmX2gyNjRfdXBkYXRlX3RocmVhZF9jb250ZXh0KSwKKyAgICAucHJvZmlsZXMgICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoZmZfaDI2NF9wcm9maWxlcyksCisgICAgLnByaXZfY2xhc3MgICAgICAgICAgICA9ICZoMjY0X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NGRlYy5oIGIvbGliYXZjb2RlYy9oMjY0ZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5NzIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvaDI2NGRlYy5oCkBAIC0wLDAgKzEsODU0IEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZW5jb2Rlci9kZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwIGNvZGVjLgorICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IMjY0REVDX0gKKyNkZWZpbmUgQVZDT0RFQ19IMjY0REVDX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgorCisjaW5jbHVkZSAiY2FiYWMuaCIKKyNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAiaDI2NF9wYXJzZS5oIgorI2luY2x1ZGUgImgyNjRfcHMuaCIKKyNpbmNsdWRlICJoMjY0X3NlaS5oIgorI2luY2x1ZGUgImgyNjQ1X3BhcnNlLmgiCisjaW5jbHVkZSAiaDI2NGNocm9tYS5oIgorI2luY2x1ZGUgImgyNjRkc3AuaCIKKyNpbmNsdWRlICJoMjY0cHJlZC5oIgorI2luY2x1ZGUgImgyNjRxcGVsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtcGVndXRpbHMuaCIKKyNpbmNsdWRlICJwYXJzZXIuaCIKKyNpbmNsdWRlICJxcGVsZHNwLmgiCisjaW5jbHVkZSAicmVjdGFuZ2xlLmgiCisjaW5jbHVkZSAidmlkZW9kc3AuaCIKKworI2RlZmluZSBIMjY0X01BWF9QSUNUVVJFX0NPVU5UIDM2CisKKyNkZWZpbmUgTUFYX01NQ09fQ09VTlQgICAgICAgICA2NgorCisjZGVmaW5lIE1BWF9ERUxBWUVEX1BJQ19DT1VOVCAgMTYKKworLyogQ29tcGlsaW5nIGluIGludGVybGFjZWQgc3VwcG9ydCByZWR1Y2VzIHRoZSBzcGVlZAorICogb2YgcHJvZ3Jlc3NpdmUgZGVjb2RpbmcgYnkgYWJvdXQgMiUuICovCisjZGVmaW5lIEFMTE9XX0lOVEVSTEFDRQorCisjZGVmaW5lIEZNTyAwCisKKy8qKgorICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNsaWNlcyBzdXBwb3J0ZWQgYnkgdGhlIGRlY29kZXIuCisgKiBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICovCisjZGVmaW5lIE1BWF9TTElDRVMgMzIKKworI2lmZGVmIEFMTE9XX0lOVEVSTEFDRQorI2RlZmluZSBNQl9NQkFGRihoKSAgICAoaCktPm1iX21iYWZmCisjZGVmaW5lIE1CX0ZJRUxEKHNsKSAgKHNsKS0+bWJfZmllbGRfZGVjb2RpbmdfZmxhZworI2RlZmluZSBGUkFNRV9NQkFGRihoKSAoaCktPm1iX2FmZl9mcmFtZQorI2RlZmluZSBGSUVMRF9QSUNUVVJFKGgpICgoaCktPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpCisjZGVmaW5lIExFRlRfTUJTIDIKKyNkZWZpbmUgTFRPUCAgICAgMAorI2RlZmluZSBMQk9UICAgICAxCisjZGVmaW5lIExFRlQoaSkgIChpKQorI2Vsc2UKKyNkZWZpbmUgTUJfTUJBRkYoaCkgICAgICAwCisjZGVmaW5lIE1CX0ZJRUxEKHNsKSAgICAgMAorI2RlZmluZSBGUkFNRV9NQkFGRihoKSAgIDAKKyNkZWZpbmUgRklFTERfUElDVFVSRShoKSAwCisjdW5kZWYgIElTX0lOVEVSTEFDRUQKKyNkZWZpbmUgSVNfSU5URVJMQUNFRChtYl90eXBlKSAwCisjZGVmaW5lIExFRlRfTUJTIDEKKyNkZWZpbmUgTFRPUCAgICAgMAorI2RlZmluZSBMQk9UICAgICAwCisjZGVmaW5lIExFRlQoaSkgIDAKKyNlbmRpZgorI2RlZmluZSBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpIChGUkFNRV9NQkFGRihoKSB8fCBGSUVMRF9QSUNUVVJFKGgpKQorCisjaWZuZGVmIENBQkFDCisjZGVmaW5lIENBQkFDKGgpIChoKS0+cHMucHBzLT5jYWJhYworI2VuZGlmCisKKyNkZWZpbmUgQ0hST01BKGgpICAgICgoaCktPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMpCisjZGVmaW5lIENIUk9NQTQyMihoKSAoKGgpLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIpCisjZGVmaW5lIENIUk9NQTQ0NChoKSAoKGgpLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpCisKKyNkZWZpbmUgTUJfVFlQRV9SRUYwICAgICAgIE1CX1RZUEVfQUNQUkVEIC8vIGRpcnR5IGJ1dCBpdCBmaXRzIGluIDE2IGJpdAorI2RlZmluZSBNQl9UWVBFXzh4OERDVCAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBJU19SRUYwKGEpICAgICAgICAgKChhKSAmIE1CX1RZUEVfUkVGMCkKKyNkZWZpbmUgSVNfOHg4RENUKGEpICAgICAgICgoYSkgJiBNQl9UWVBFXzh4OERDVCkKKworLyoqCisgKiBNZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbiBvcGNvZGUuCisgKi8KK3R5cGVkZWYgZW51bSBNTUNPT3Bjb2RlIHsKKyAgICBNTUNPX0VORCA9IDAsCisgICAgTU1DT19TSE9SVDJVTlVTRUQsCisgICAgTU1DT19MT05HMlVOVVNFRCwKKyAgICBNTUNPX1NIT1JUMkxPTkcsCisgICAgTU1DT19TRVRfTUFYX0xPTkcsCisgICAgTU1DT19SRVNFVCwKKyAgICBNTUNPX0xPTkcsCit9IE1NQ09PcGNvZGU7CisKKy8qKgorICogTWVtb3J5IG1hbmFnZW1lbnQgY29udHJvbCBvcGVyYXRpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IE1NQ08geworICAgIE1NQ09PcGNvZGUgb3Bjb2RlOworICAgIGludCBzaG9ydF9waWNfbnVtOyAgLy8vPCBwaWNfbnVtIHdpdGhvdXQgd3JhcHBpbmcgKHBpY19udW0gJiBtYXhfcGljX251bSkKKyAgICBpbnQgbG9uZ19hcmc7ICAgICAgIC8vLzwgaW5kZXgsIHBpY19udW0sIG9yIG51bSBsb25nIHJlZnMgZGVwZW5kaW5nIG9uIG9wY29kZQorfSBNTUNPOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UGljdHVyZSB7CisgICAgQVZGcmFtZSAqZjsKKyAgICBUaHJlYWRGcmFtZSB0ZjsKKworICAgIEFWQnVmZmVyUmVmICpxc2NhbGVfdGFibGVfYnVmOworICAgIGludDhfdCAqcXNjYWxlX3RhYmxlOworCisgICAgQVZCdWZmZXJSZWYgKm1vdGlvbl92YWxfYnVmWzJdOworICAgIGludDE2X3QgKCptb3Rpb25fdmFsWzJdKVsyXTsKKworICAgIEFWQnVmZmVyUmVmICptYl90eXBlX2J1ZjsKKyAgICB1aW50MzJfdCAqbWJfdHlwZTsKKworICAgIEFWQnVmZmVyUmVmICpod2FjY2VsX3ByaXZfYnVmOworICAgIHZvaWQgKmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOyAvLy88IGhhcmR3YXJlIGFjY2VsZXJhdG9yIHByaXZhdGUgZGF0YQorCisgICAgQVZCdWZmZXJSZWYgKnJlZl9pbmRleF9idWZbMl07CisgICAgaW50OF90ICpyZWZfaW5kZXhbMl07CisKKyAgICBpbnQgZmllbGRfcG9jWzJdOyAgICAgICAvLy88IHRvcC9ib3R0b20gUE9DCisgICAgaW50IHBvYzsgICAgICAgICAgICAgICAgLy8vPCBmcmFtZSBQT0MKKyAgICBpbnQgZnJhbWVfbnVtOyAgICAgICAgICAvLy88IGZyYW1lX251bSAocmF3IGZyYW1lX251bSBmcm9tIHNsaWNlIGhlYWRlcikKKyAgICBpbnQgbW1jb19yZXNldDsgICAgICAgICAvKio8IE1NQ09fUkVTRVQgc2V0IHRoaXMgMS4gUmVvcmRlcmluZyBjb2RlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBtaXggcGljdHVyZXMgYmVmb3JlIGFuZCBhZnRlciBNTUNPX1JFU0VULiAqLworICAgIGludCBwaWNfaWQ7ICAgICAgICAgICAgIC8qKjwgcGljX251bSAoc2hvcnQgLT4gbm8gd3JhcCB2ZXJzaW9uIG9mIHBpY19udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfbnVtICYgbWF4X3BpY19udW07IGxvbmcgLT4gbG9uZ19waWNfbnVtKSAqLworICAgIGludCBsb25nX3JlZjsgICAgICAgICAgIC8vLzwgMS0+bG9uZyB0ZXJtIHJlZmVyZW5jZSAwLT5zaG9ydCB0ZXJtIHJlZmVyZW5jZQorICAgIGludCByZWZfcG9jWzJdWzJdWzMyXTsgIC8vLzwgUE9DcyBvZiB0aGUgZnJhbWVzL2ZpZWxkcyB1c2VkIGFzIHJlZmVyZW5jZSAoRklYTUUgbmVlZCBwZXIgc2xpY2UpCisgICAgaW50IHJlZl9jb3VudFsyXVsyXTsgICAgLy8vPCBudW1iZXIgb2YgZW50cmllcyBpbiByZWZfcG9jICAgICAgICAgKEZJWE1FIG5lZWQgcGVyIHNsaWNlKQorICAgIGludCBtYmFmZjsgICAgICAgICAgICAgIC8vLzwgMSAtPiBNQkFGRiBmcmFtZSAwLT4gbm90IE1CQUZGCisgICAgaW50IGZpZWxkX3BpY3R1cmU7ICAgICAgLy8vPCB3aGV0aGVyIG9yIG5vdCBwaWN0dXJlIHdhcyBlbmNvZGVkIGluIHNlcGFyYXRlIGZpZWxkcworCisgICAgaW50IHJlZmVyZW5jZTsKKyAgICBpbnQgcmVjb3ZlcmVkOyAgICAgICAgICAvLy88IHBpY3R1cmUgYXQgSURSIG9yIHJlY292ZXJ5IHBvaW50ICsgcmVjb3ZlcnkgY291bnQKKyAgICBpbnQgaW52YWxpZF9nYXA7CisgICAgaW50IHNlaV9yZWNvdmVyeV9mcmFtZV9jbnQ7Cit9IEgyNjRQaWN0dXJlOworCit0eXBlZGVmIHN0cnVjdCBIMjY0UmVmIHsKKyAgICB1aW50OF90ICpkYXRhWzNdOworICAgIGludCBsaW5lc2l6ZVszXTsKKworICAgIGludCByZWZlcmVuY2U7CisgICAgaW50IHBvYzsKKyAgICBpbnQgcGljX2lkOworCisgICAgSDI2NFBpY3R1cmUgKnBhcmVudDsKK30gSDI2NFJlZjsKKwordHlwZWRlZiBzdHJ1Y3QgSDI2NFNsaWNlQ29udGV4dCB7CisgICAgc3RydWN0IEgyNjRDb250ZXh0ICpoMjY0OworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgRVJDb250ZXh0IGVyOworCisgICAgaW50IHNsaWNlX251bTsKKyAgICBpbnQgc2xpY2VfdHlwZTsKKyAgICBpbnQgc2xpY2VfdHlwZV9ub3M7ICAgICAgICAgLy8vPCBTIGZyZWUgc2xpY2UgdHlwZSAoU0kvU1AgYXJlIHJlbWFwcGVkIHRvIEkvUCkKKyAgICBpbnQgc2xpY2VfdHlwZV9maXhlZDsKKworICAgIGludCBxc2NhbGU7CisgICAgaW50IGNocm9tYV9xcFsyXTsgICAvLyBRUGMKKyAgICBpbnQgcXBfdGhyZXNoOyAgICAgIC8vLzwgUVAgdGhyZXNob2xkIHRvIHNraXAgbG9vcGZpbHRlcgorICAgIGludCBsYXN0X3FzY2FsZV9kaWZmOworCisgICAgLy8gZGVibG9jaworICAgIGludCBkZWJsb2NraW5nX2ZpbHRlcjsgICAgICAgICAgLy8vPCBkaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2lkYyB3aXRoIDEgPC0+IDAKKyAgICBpbnQgc2xpY2VfYWxwaGFfYzBfb2Zmc2V0OworICAgIGludCBzbGljZV9iZXRhX29mZnNldDsKKworICAgIEgyNjRQcmVkV2VpZ2h0VGFibGUgcHd0OworCisgICAgaW50IHByZXZfbWJfc2tpcHBlZDsKKyAgICBpbnQgbmV4dF9tYl9za2lwcGVkOworCisgICAgaW50IGNocm9tYV9wcmVkX21vZGU7CisgICAgaW50IGludHJhMTZ4MTZfcHJlZF9tb2RlOworCisgICAgaW50OF90IGludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs1ICogOF07CisgICAgaW50OF90KCppbnRyYTR4NF9wcmVkX21vZGUpOworCisgICAgaW50IHRvcGxlZnRfbWJfeHk7CisgICAgaW50IHRvcF9tYl94eTsKKyAgICBpbnQgdG9wcmlnaHRfbWJfeHk7CisgICAgaW50IGxlZnRfbWJfeHlbTEVGVF9NQlNdOworCisgICAgaW50IHRvcGxlZnRfdHlwZTsKKyAgICBpbnQgdG9wX3R5cGU7CisgICAgaW50IHRvcHJpZ2h0X3R5cGU7CisgICAgaW50IGxlZnRfdHlwZVtMRUZUX01CU107CisKKyAgICBjb25zdCB1aW50OF90ICpsZWZ0X2Jsb2NrOworICAgIGludCB0b3BsZWZ0X3BhcnRpdGlvbjsKKworICAgIHVuc2lnbmVkIGludCB0b3BsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlOworICAgIHVuc2lnbmVkIGludCB0b3Bfc2FtcGxlc19hdmFpbGFibGU7CisgICAgdW5zaWduZWQgaW50IHRvcHJpZ2h0X3NhbXBsZXNfYXZhaWxhYmxlOworICAgIHVuc2lnbmVkIGludCBsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlOworCisgICAgcHRyZGlmZl90IGxpbmVzaXplLCB1dmxpbmVzaXplOworICAgIHB0cmRpZmZfdCBtYl9saW5lc2l6ZTsgIC8vLzwgbWF5IGJlIGVxdWFsIHRvIHMtPmxpbmVzaXplIG9yIHMtPmxpbmVzaXplICogMiwgZm9yIG1iYWZmCisgICAgcHRyZGlmZl90IG1iX3V2bGluZXNpemU7CisKKyAgICBpbnQgbWJfeCwgbWJfeTsKKyAgICBpbnQgbWJfeHk7CisgICAgaW50IHJlc3luY19tYl94OworICAgIGludCByZXN5bmNfbWJfeTsKKyAgICB1bnNpZ25lZCBpbnQgZmlyc3RfbWJfYWRkcjsKKyAgICAvLyBpbmRleCBvZiB0aGUgZmlyc3QgTUIgb2YgdGhlIG5leHQgc2xpY2UKKyAgICBpbnQgbmV4dF9zbGljZV9pZHg7CisgICAgaW50IG1iX3NraXBfcnVuOworICAgIGludCBpc19jb21wbGV4OworCisgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlOworICAgIGludCBtYl9maWVsZF9kZWNvZGluZ19mbGFnOworICAgIGludCBtYl9tYmFmZjsgICAgICAgICAgICAgICAvLy88IG1iX2FmZl9mcmFtZSAmJiBtYl9maWVsZF9kZWNvZGluZ19mbGFnCisKKyAgICBpbnQgcmVkdW5kYW50X3BpY19jb3VudDsKKworICAgIC8qKgorICAgICAqIG51bWJlciBvZiBuZWlnaGJvcnMgKHRvcCBhbmQvb3IgbGVmdCkgdGhhdCB1c2VkIDh4OCBkY3QKKyAgICAgKi8KKyAgICBpbnQgbmVpZ2hib3JfdHJhbnNmb3JtX3NpemU7CisKKyAgICBpbnQgZGlyZWN0X3NwYXRpYWxfbXZfcHJlZDsKKyAgICBpbnQgY29sX3Bhcml0eTsKKyAgICBpbnQgY29sX2ZpZWxkb2ZmOworCisgICAgaW50IGNicDsKKyAgICBpbnQgdG9wX2NicDsKKyAgICBpbnQgbGVmdF9jYnA7CisKKyAgICBpbnQgZGlzdF9zY2FsZV9mYWN0b3JbMzJdOworICAgIGludCBkaXN0X3NjYWxlX2ZhY3Rvcl9maWVsZFsyXVszMl07CisgICAgaW50IG1hcF9jb2xfdG9fbGlzdDBbMl1bMTYgKyAzMl07CisgICAgaW50IG1hcF9jb2xfdG9fbGlzdDBfZmllbGRbMl1bMl1bMTYgKyAzMl07CisKKyAgICAvKioKKyAgICAgKiBudW1fcmVmX2lkeF9sMC8xX2FjdGl2ZV9taW51czEgKyAxCisgICAgICovCisgICAgdW5zaWduZWQgaW50IHJlZl9jb3VudFsyXTsgICAgICAgICAgLy8vPCBjb3VudHMgZnJhbWVzIG9yIGZpZWxkcywgZGVwZW5kaW5nIG9uIGN1cnJlbnQgbWIgbW9kZQorICAgIHVuc2lnbmVkIGludCBsaXN0X2NvdW50OworICAgIEgyNjRSZWYgcmVmX2xpc3RbMl1bNDhdOyAgICAgICAgLyoqPCAwLi4xNTogZnJhbWUgcmVmcywgMTYuLjQ3OiBtYmFmZiBmaWVsZCByZWZzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgUmVvcmRlcmVkIHZlcnNpb24gb2YgZGVmYXVsdF9yZWZfbGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgYWNjb3JkaW5nIHRvIHBpY3R1cmUgcmVvcmRlcmluZyBpbiBzbGljZSBoZWFkZXIgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50OF90IG9wOworICAgICAgICB1aW50MzJfdCB2YWw7CisgICAgfSByZWZfbW9kaWZpY2F0aW9uc1syXVszMl07CisgICAgaW50IG5iX3JlZl9tb2RpZmljYXRpb25zWzJdOworCisgICAgdW5zaWduZWQgaW50IHBwc19pZDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmludHJhX3BjbV9wdHI7CisgICAgaW50MTZfdCAqZGNfdmFsX2Jhc2U7CisKKyAgICB1aW50OF90ICpiaXByZWRfc2NyYXRjaHBhZDsKKyAgICB1aW50OF90ICplZGdlX2VtdV9idWZmZXI7CisgICAgdWludDhfdCAoKnRvcF9ib3JkZXJzWzJdKVsoMTYgKiAzKSAqIDJdOworICAgIGludCBiaXByZWRfc2NyYXRjaHBhZF9hbGxvY2F0ZWQ7CisgICAgaW50IGVkZ2VfZW11X2J1ZmZlcl9hbGxvY2F0ZWQ7CisgICAgaW50IHRvcF9ib3JkZXJzX2FsbG9jYXRlZFsyXTsKKworICAgIC8qKgorICAgICAqIG5vbiB6ZXJvIGNvZWZmIGNvdW50IGNhY2hlLgorICAgICAqIGlzIDY0IGlmIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIG5vbl96ZXJvX2NvdW50X2NhY2hlKVsxNSAqIDhdOworCisgICAgLyoqCisgICAgICogTW90aW9uIHZlY3RvciBjYWNoZS4KKyAgICAgKi8KKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIG12X2NhY2hlKVsyXVs1ICogOF1bMl07CisgICAgREVDTEFSRV9BTElHTkVEKDgsICBpbnQ4X3QsIHJlZl9jYWNoZSlbMl1bNSAqIDhdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgbXZkX2NhY2hlKVsyXVs1ICogOF1bMl07CisgICAgdWludDhfdCBkaXJlY3RfY2FjaGVbNSAqIDhdOworCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQxNl90LCBzdWJfbWJfdHlwZSlbNF07CisKKyAgICAvLy88IGFzIGEgRENUIGNvZWZmaWNpZW50IGlzIGludDMyX3QgaW4gaGlnaCBkZXB0aCwgd2UgbmVlZCB0byByZXNlcnZlIHR3aWNlIHRoZSBzcGFjZS4KKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIG1iKVsxNiAqIDQ4ICogMl07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBtYl9sdW1hX2RjKVszXVsxNiAqIDJdOworICAgIC8vLzwgYXMgbWIgaXMgYWRkcmVzc2VkIGJ5IHNjYW50YWJsZVtpXSBhbmQgc2NhbnRhYmxlIGlzIHVpbnQ4X3Qgd2UgY2FuIGVpdGhlcgorICAgIC8vLzwgY2hlY2sgdGhhdCBpIGlzIG5vdCB0b28gbGFyZ2Ugb3IgZW5zdXJlIHRoYXQgdGhlcmUgaXMgc29tZSB1bnVzZWQgc3R1ZmYgYWZ0ZXIgbWIKKyAgICBpbnQxNl90IG1iX3BhZGRpbmdbMjU2ICogMl07CisKKyAgICB1aW50OF90ICgqbXZkX3RhYmxlWzJdKVsyXTsKKworICAgIC8qKgorICAgICAqIENhYmFjCisgICAgICovCisgICAgQ0FCQUNDb250ZXh0IGNhYmFjOworICAgIHVpbnQ4X3QgY2FiYWNfc3RhdGVbMTAyNF07CisgICAgaW50IGNhYmFjX2luaXRfaWRjOworCisgICAgTU1DTyBtbWNvW01BWF9NTUNPX0NPVU5UXTsKKyAgICBpbnQgIG5iX21tY287CisgICAgaW50IGV4cGxpY2l0X3JlZl9tYXJraW5nOworCisgICAgaW50IGZyYW1lX251bTsKKyAgICBpbnQgcG9jX2xzYjsKKyAgICBpbnQgZGVsdGFfcG9jX2JvdHRvbTsKKyAgICBpbnQgZGVsdGFfcG9jWzJdOworICAgIGludCBjdXJyX3BpY19udW07CisgICAgaW50IG1heF9waWNfbnVtOworfSBIMjY0U2xpY2VDb250ZXh0OworCisvKioKKyAqIEgyNjRDb250ZXh0CisgKi8KK3R5cGVkZWYgc3RydWN0IEgyNjRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7CisgICAgSDI2NERTUENvbnRleHQgaDI2NGRzcDsKKyAgICBIMjY0Q2hyb21hQ29udGV4dCBoMjY0Y2hyb21hOworICAgIEgyNjRRcGVsQ29udGV4dCBoMjY0cXBlbDsKKworICAgIEgyNjRQaWN0dXJlIERQQltIMjY0X01BWF9QSUNUVVJFX0NPVU5UXTsKKyAgICBIMjY0UGljdHVyZSAqY3VyX3BpY19wdHI7CisgICAgSDI2NFBpY3R1cmUgY3VyX3BpYzsKKyAgICBIMjY0UGljdHVyZSBsYXN0X3BpY19mb3JfZWM7CisKKyAgICBIMjY0U2xpY2VDb250ZXh0ICpzbGljZV9jdHg7CisgICAgaW50ICAgICAgICAgICAgbmJfc2xpY2VfY3R4OworICAgIGludCAgICAgICAgICAgIG5iX3NsaWNlX2N0eF9xdWV1ZWQ7CisKKyAgICBIMjY0NVBhY2tldCBwa3Q7CisKKyAgICBpbnQgcGl4ZWxfc2hpZnQ7ICAgIC8vLzwgMCBmb3IgOC1iaXQgSC4yNjQsIDEgZm9yIGhpZ2gtYml0LWRlcHRoIEguMjY0CisKKyAgICAvKiBjb2RlZCBkaW1lbnNpb25zIC0tIDE2ICogbWIgdy9oICovCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IGNocm9tYV94X3NoaWZ0LCBjaHJvbWFfeV9zaGlmdDsKKworICAgIGludCBkcm9wcGFibGU7CisgICAgaW50IGNvZGVkX3BpY3R1cmVfbnVtYmVyOworCisgICAgaW50IGNvbnRleHRfaW5pdGlhbGl6ZWQ7CisgICAgaW50IGZsYWdzOworICAgIGludCB3b3JrYXJvdW5kX2J1Z3M7CisgICAgaW50IHgyNjRfYnVpbGQ7CisgICAgLyogU2V0IHdoZW4gc2xpY2UgdGhyZWFkaW5nIGlzIHVzZWQgYW5kIGF0IGxlYXN0IG9uZSBzbGljZSB1c2VzIGRlYmxvY2tpbmcKKyAgICAgKiBtb2RlIDEgKGkuZS4gYWNyb3NzIHNsaWNlIGJvdW5kYXJpZXMpLiBUaGVuIHdlIGRpc2FibGUgdGhlIGxvb3AgZmlsdGVyCisgICAgICogZHVyaW5nIG5vcm1hbCBNQiBkZWNvZGluZyBhbmQgZXhlY3V0ZSBpdCBzZXJpYWxseSBhdCB0aGUgZW5kLgorICAgICAqLworICAgIGludCBwb3N0cG9uZV9maWx0ZXI7CisKKyAgICAvKgorICAgICAqIFNldCB0byAxIHdoZW4gdGhlIGN1cnJlbnQgcGljdHVyZSBpcyBJRFIsIDAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGludCBwaWN0dXJlX2lkcjsKKworICAgIGludCBjcm9wX2xlZnQ7CisgICAgaW50IGNyb3BfcmlnaHQ7CisgICAgaW50IGNyb3BfdG9wOworICAgIGludCBjcm9wX2JvdHRvbTsKKworICAgIGludDhfdCgqaW50cmE0eDRfcHJlZF9tb2RlKTsKKyAgICBIMjY0UHJlZENvbnRleHQgaHBjOworCisgICAgdWludDhfdCAoKm5vbl96ZXJvX2NvdW50KVs0OF07CisKKyNkZWZpbmUgTElTVF9OT1RfVVNFRCAtMSAvLyBGSVhNRSByZW5hbWU/CisjZGVmaW5lIFBBUlRfTk9UX0FWQUlMQUJMRSAtMgorCisgICAgLyoqCisgICAgICogYmxvY2tfb2Zmc2V0WyAwLi4yM10gZm9yIGZyYW1lIG1hY3JvYmxvY2tzCisgICAgICogYmxvY2tfb2Zmc2V0WzI0Li40N10gZm9yIGZpZWxkIG1hY3JvYmxvY2tzCisgICAgICovCisgICAgaW50IGJsb2NrX29mZnNldFsyICogKDE2ICogMyldOworCisgICAgdWludDMyX3QgKm1iMmJfeHk7ICAvLyBGSVhNRSBhcmUgdGhlc2UgNCBhIGdvb2QgaWRlYT8KKyAgICB1aW50MzJfdCAqbWIyYnJfeHk7CisgICAgaW50IGJfc3RyaWRlOyAgICAgICAvLyBGSVhNRSB1c2Ugcy0+YjRfc3RyaWRlCisKKyAgICB1aW50MTZfdCAqc2xpY2VfdGFibGU7ICAgICAgLy8vPCBzbGljZV90YWJsZV9iYXNlICsgMiptYl9zdHJpZGUgKyAxCisKKyAgICAvLyBpbnRlcmxhY2luZyBzcGVjaWZpYyBmbGFncworICAgIGludCBtYl9hZmZfZnJhbWU7CisgICAgaW50IHBpY3R1cmVfc3RydWN0dXJlOworICAgIGludCBmaXJzdF9maWVsZDsKKworICAgIHVpbnQ4X3QgKmxpc3RfY291bnRzOyAgICAgICAgICAgICAgIC8vLzwgQXJyYXkgb2YgbGlzdF9jb3VudCBwZXIgTUIgc3BlY2lmeWluZyB0aGUgc2xpY2UgdHlwZQorCisgICAgLyogMHgxMDAgLT4gbm9uIG51bGwgbHVtYV9kYywgMHg4MC8weDQwIC0+IG5vbiBudWxsIGNocm9tYV9kYyAoY2IvY3IpLCAweD8wIC0+IGNocm9tYV9jYnAoMCwgMSwgMiksIDB4MD8gbHVtYV9jYnAgKi8KKyAgICB1aW50MTZfdCAqY2JwX3RhYmxlOworCisgICAgLyogY2hyb21hX3ByZWRfbW9kZSBmb3IgaTR4NCBvciBpMTZ4MTYsIGVsc2UgMCAqLworICAgIHVpbnQ4X3QgKmNocm9tYV9wcmVkX21vZGVfdGFibGU7CisgICAgdWludDhfdCAoKm12ZF90YWJsZVsyXSlbMl07CisgICAgdWludDhfdCAqZGlyZWN0X3RhYmxlOworCisgICAgdWludDhfdCBzY2FuX3BhZGRpbmdbMTZdOworICAgIHVpbnQ4X3QgemlnemFnX3NjYW5bMTZdOworICAgIHVpbnQ4X3QgemlnemFnX3NjYW44eDhbNjRdOworICAgIHVpbnQ4X3QgemlnemFnX3NjYW44eDhfY2F2bGNbNjRdOworICAgIHVpbnQ4X3QgZmllbGRfc2NhblsxNl07CisgICAgdWludDhfdCBmaWVsZF9zY2FuOHg4WzY0XTsKKyAgICB1aW50OF90IGZpZWxkX3NjYW44eDhfY2F2bGNbNjRdOworICAgIHVpbnQ4X3QgemlnemFnX3NjYW5fcTBbMTZdOworICAgIHVpbnQ4X3QgemlnemFnX3NjYW44eDhfcTBbNjRdOworICAgIHVpbnQ4X3QgemlnemFnX3NjYW44eDhfY2F2bGNfcTBbNjRdOworICAgIHVpbnQ4X3QgZmllbGRfc2Nhbl9xMFsxNl07CisgICAgdWludDhfdCBmaWVsZF9zY2FuOHg4X3EwWzY0XTsKKyAgICB1aW50OF90IGZpZWxkX3NjYW44eDhfY2F2bGNfcTBbNjRdOworCisgICAgaW50IG1iX3k7CisgICAgaW50IG1iX2hlaWdodCwgbWJfd2lkdGg7CisgICAgaW50IG1iX3N0cmlkZTsKKyAgICBpbnQgbWJfbnVtOworCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIC8vIFRoaW5ncyBiZWxvdyBhcmUgbm90IHVzZWQgaW4gdGhlIE1CIG9yIG1vcmUgaW5uZXIgY29kZQorCisgICAgaW50IG5hbF9yZWZfaWRjOworICAgIGludCBuYWxfdW5pdF90eXBlOworCisgICAgaW50IGhhc19zbGljZTsgICAgICAgICAgLy8vPCBzbGljZSBOQUwgaXMgZm91bmQgaW4gdGhlIHBhY2tldCwgc2V0IGJ5IGRlY29kZV9uYWxfdW5pdHMsIGl0cyBzdGF0ZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHByZXNlcnZlZCBvdXRzaWRlIGgyNjRfZGVjb2RlX2ZyYW1lKCkKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gcGFyc2UgQVZDIHZhcmlhbnQgb2YgSC4yNjQKKyAgICAgKi8KKyAgICBpbnQgaXNfYXZjOyAgICAgICAgICAgLy8vPCB0aGlzIGZsYWcgaXMgIT0gMCBpZiBjb2RlYyBpcyBhdmMxCisgICAgaW50IG5hbF9sZW5ndGhfc2l6ZTsgIC8vLzwgTnVtYmVyIG9mIGJ5dGVzIHVzZWQgZm9yIG5hbCBsZW5ndGggKDEsIDIgb3IgNCkKKworICAgIGludCBiaXRfZGVwdGhfbHVtYTsgICAgICAgICAvLy88IGx1bWEgYml0IGRlcHRoIGZyb20gc3BzIHRvIGRldGVjdCBjaGFuZ2VzCisgICAgaW50IGNocm9tYV9mb3JtYXRfaWRjOyAgICAgIC8vLzwgY2hyb21hIGZvcm1hdCBmcm9tIHNwcyB0byBkZXRlY3QgY2hhbmdlcworCisgICAgSDI2NFBhcmFtU2V0cyBwczsKKworICAgIHVpbnQxNl90ICpzbGljZV90YWJsZV9iYXNlOworCisgICAgSDI2NFBPQ0NvbnRleHQgcG9jOworCisgICAgSDI2NFJlZiBkZWZhdWx0X3JlZlsyXTsKKyAgICBIMjY0UGljdHVyZSAqc2hvcnRfcmVmWzMyXTsKKyAgICBIMjY0UGljdHVyZSAqbG9uZ19yZWZbMzJdOworICAgIEgyNjRQaWN0dXJlICpkZWxheWVkX3BpY1tNQVhfREVMQVlFRF9QSUNfQ09VTlQgKyAyXTsgLy8gRklYTUUgc2l6ZT8KKyAgICBpbnQgbGFzdF9wb2NzW01BWF9ERUxBWUVEX1BJQ19DT1VOVF07CisgICAgSDI2NFBpY3R1cmUgKm5leHRfb3V0cHV0X3BpYzsKKyAgICBpbnQgbmV4dF9vdXRwdXRlZF9wb2M7CisKKyAgICAvKioKKyAgICAgKiBtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbnMgYnVmZmVyLgorICAgICAqLworICAgIE1NQ08gbW1jb1tNQVhfTU1DT19DT1VOVF07CisgICAgaW50ICBuYl9tbWNvOworICAgIGludCBtbWNvX3Jlc2V0OworICAgIGludCBleHBsaWNpdF9yZWZfbWFya2luZzsKKworICAgIGludCBsb25nX3JlZl9jb3VudDsgICAgIC8vLzwgbnVtYmVyIG9mIGFjdHVhbCBsb25nIHRlcm0gcmVmZXJlbmNlcworICAgIGludCBzaG9ydF9yZWZfY291bnQ7ICAgIC8vLzwgbnVtYmVyIG9mIGFjdHVhbCBzaG9ydCB0ZXJtIHJlZmVyZW5jZXMKKworICAgIC8qKgorICAgICAqIEBuYW1lIE1lbWJlcnMgZm9yIHNsaWNlIGJhc2VkIG11bHRpdGhyZWFkaW5nCisgICAgICogQHsKKyAgICAgKi8KKyAgICAvKioKKyAgICAgKiBjdXJyZW50IHNsaWNlIG51bWJlciwgdXNlZCB0byBpbml0aWFsaXplIHNsaWNlX251bSBvZiBlYWNoIHRocmVhZC9jb250ZXh0CisgICAgICovCisgICAgaW50IGN1cnJlbnRfc2xpY2U7CisKKyAgICAvKiogQH0gKi8KKworICAgIC8qKgorICAgICAqIENvbXBsZW1lbnQgc2VpX3BpY19zdHJ1Y3QKKyAgICAgKiBTRUlfUElDX1NUUlVDVF9UT1BfQk9UVE9NIGFuZCBTRUlfUElDX1NUUlVDVF9CT1RUT01fVE9QIGluZGljYXRlIGludGVybGFjZWQgZnJhbWVzLgorICAgICAqIEhvd2V2ZXIsIHNvZnQgdGVsZWNpbmVkIGZyYW1lcyBtYXkgaGF2ZSB0aGVzZSB2YWx1ZXMuCisgICAgICogVGhpcyBpcyB1c2VkIGluIGFuIGF0dGVtcHQgdG8gZmxhZyBzb2Z0IHRlbGVjaW5lIHByb2dyZXNzaXZlLgorICAgICAqLworICAgIGludCBwcmV2X2ludGVybGFjZWRfZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiBBcmUgdGhlIFNFSSByZWNvdmVyeSBwb2ludHMgbG9va2luZyB2YWxpZC4KKyAgICAgKi8KKyAgICBpbnQgdmFsaWRfcmVjb3ZlcnlfcG9pbnQ7CisKKyAgICAvKioKKyAgICAgKiByZWNvdmVyeV9mcmFtZSBpcyB0aGUgZnJhbWVfbnVtIGF0IHdoaWNoIHRoZSBuZXh0IGZyYW1lIHNob3VsZAorICAgICAqIGJlIGZ1bGx5IGNvbnN0cnVjdGVkLgorICAgICAqCisgICAgICogU2V0IHRvIC0xIHdoZW4gbm90IGV4cGVjdGluZyBhIHJlY292ZXJ5IHBvaW50LgorICAgICAqLworICAgIGludCByZWNvdmVyeV9mcmFtZTsKKworLyoqCisgKiBXZSBoYXZlIHNlZW4gYW4gSURSLCBzbyBhbGwgdGhlIGZvbGxvd2luZyBmcmFtZXMgaW4gY29kZWQgb3JkZXIgYXJlIGNvcnJlY3RseQorICogZGVjb2RhYmxlLgorICovCisjZGVmaW5lIEZSQU1FX1JFQ09WRVJFRF9JRFIgICgxIDw8IDApCisvKioKKyAqIFN1ZmZpY2llbnQgbnVtYmVyIG9mIGZyYW1lcyBoYXZlIGJlZW4gZGVjb2RlZCBzaW5jZSBhIFNFSSByZWNvdmVyeSBwb2ludCwKKyAqIHNvIGFsbCB0aGUgZm9sbG93aW5nIGZyYW1lcyBpbiBwcmVzZW50YXRpb24gb3JkZXIgYXJlIGNvcnJlY3QuCisgKi8KKyNkZWZpbmUgRlJBTUVfUkVDT1ZFUkVEX1NFSSAgKDEgPDwgMSkKKworICAgIGludCBmcmFtZV9yZWNvdmVyZWQ7ICAgIC8vLzwgSW5pdGlhbCBmcmFtZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlY292ZXJlZAorCisgICAgaW50IGhhc19yZWNvdmVyeV9wb2ludDsKKworICAgIGludCBtaXNzaW5nX2ZpZWxkczsKKworICAgIC8qIGZvciBmcmFtZSB0aHJlYWRpbmcsIHRoaXMgaXMgc2V0IHRvIDEKKyAgICAgKiBhZnRlciBmaW5pc2hfc2V0dXAoKSBoYXMgYmVlbiBjYWxsZWQsIHNvIHdlIGNhbm5vdCBtb2RpZnkKKyAgICAgKiBzb21lIGNvbnRleHQgcHJvcGVydGllcyAod2hpY2ggYXJlIHN1cHBvc2VkIHRvIHN0YXkgY29uc3RhbnQgYmV0d2VlbgorICAgICAqIHNsaWNlcykgYW55bW9yZSAqLworICAgIGludCBzZXR1cF9maW5pc2hlZDsKKworICAgIGludCBjdXJfY2hyb21hX2Zvcm1hdF9pZGM7CisgICAgaW50IGN1cl9iaXRfZGVwdGhfbHVtYTsKKyAgICBpbnQxNl90IHNsaWNlX3Jvd1tNQVhfU0xJQ0VTXTsgLy8vPCB0byBkZXRlY3Qgd2hlbiBNQVhfU0xJQ0VTIGlzIHRvbyBsb3cKKworICAgIC8qIG9yaWdpbmFsIEFWQ29kZWNDb250ZXh0IGRpbWVuc2lvbnMsIHVzZWQgdG8gaGFuZGxlIGNvbnRhaW5lcgorICAgICAqIGNyb3BwaW5nICovCisgICAgaW50IHdpZHRoX2Zyb21fY2FsbGVyOworICAgIGludCBoZWlnaHRfZnJvbV9jYWxsZXI7CisKKyAgICBpbnQgZW5hYmxlX2VyOworCisgICAgSDI2NFNFSUNvbnRleHQgc2VpOworCisgICAgQVZCdWZmZXJQb29sICpxc2NhbGVfdGFibGVfcG9vbDsKKyAgICBBVkJ1ZmZlclBvb2wgKm1iX3R5cGVfcG9vbDsKKyAgICBBVkJ1ZmZlclBvb2wgKm1vdGlvbl92YWxfcG9vbDsKKyAgICBBVkJ1ZmZlclBvb2wgKnJlZl9pbmRleF9wb29sOworICAgIGludCByZWYyZnJtW01BWF9TTElDRVNdWzJdWzY0XTsgICAgIC8vLzwgcmVmZXJlbmNlIHRvIGZyYW1lIG51bWJlciBsaXN0cywgdXNlZCBpbiB0aGUgbG9vcCBmaWx0ZXIsIHRoZSBmaXJzdCAyIGFyZSBmb3IgLTIsLTEKK30gSDI2NENvbnRleHQ7CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9oMjY0X21iX3NpemVzWzRdOworCisvKioKKyAqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBzbGljZV90eXBlLgorICovCitpbnQgZmZfaDI2NF9nZXRfc2xpY2VfdHlwZShjb25zdCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7CisKKy8qKgorICogQWxsb2NhdGUgdGFibGVzLgorICogbmVlZHMgd2lkdGgvaGVpZ2h0CisgKi8KK2ludCBmZl9oMjY0X2FsbG9jX3RhYmxlcyhIMjY0Q29udGV4dCAqaCk7CisKK2ludCBmZl9oMjY0X2RlY29kZV9yZWZfcGljX2xpc3RfcmVvcmRlcmluZyhIMjY0U2xpY2VDb250ZXh0ICpzbCwgdm9pZCAqbG9nY3R4KTsKK2ludCBmZl9oMjY0X2J1aWxkX3JlZl9saXN0KEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Cit2b2lkIGZmX2gyNjRfcmVtb3ZlX2FsbF9yZWZzKEgyNjRDb250ZXh0ICpoKTsKKworLyoqCisgKiBFeGVjdXRlIHRoZSByZWZlcmVuY2UgcGljdHVyZSBtYXJraW5nIChtZW1vcnkgbWFuYWdlbWVudCBjb250cm9sIG9wZXJhdGlvbnMpLgorICovCitpbnQgZmZfaDI2NF9leGVjdXRlX3JlZl9waWNfbWFya2luZyhIMjY0Q29udGV4dCAqaCk7CisKK2ludCBmZl9oMjY0X2RlY29kZV9yZWZfcGljX21hcmtpbmcoSDI2NFNsaWNlQ29udGV4dCAqc2wsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIMjY0NU5BTCAqbmFsLCB2b2lkICpsb2djdHgpOworCit2b2lkIGZmX2gyNjRfaGxfZGVjb2RlX21iKGNvbnN0IEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Cit2b2lkIGZmX2gyNjRfZGVjb2RlX2luaXRfdmxjKHZvaWQpOworCisvKioKKyAqIERlY29kZSBhIG1hY3JvYmxvY2sKKyAqIEByZXR1cm4gMCBpZiBPSywgRVJfQUNfRVJST1IgLyBFUl9EQ19FUlJPUiAvIEVSX01WX0VSUk9SIG9uIGVycm9yCisgKi8KK2ludCBmZl9oMjY0X2RlY29kZV9tYl9jYXZsYyhjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpOworCisvKioKKyAqIERlY29kZSBhIENBQkFDIGNvZGVkIG1hY3JvYmxvY2sKKyAqIEByZXR1cm4gMCBpZiBPSywgRVJfQUNfRVJST1IgLyBFUl9EQ19FUlJPUiAvIEVSX01WX0VSUk9SIG9uIGVycm9yCisgKi8KK2ludCBmZl9oMjY0X2RlY29kZV9tYl9jYWJhYyhjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpOworCit2b2lkIGZmX2gyNjRfaW5pdF9jYWJhY19zdGF0ZXMoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsKTsKKwordm9pZCBmZl9oMjY0X2RpcmVjdF9kaXN0X3NjYWxlX2ZhY3Rvcihjb25zdCBIMjY0Q29udGV4dCAqY29uc3QgaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpOwordm9pZCBmZl9oMjY0X2RpcmVjdF9yZWZfbGlzdF9pbml0KGNvbnN0IEgyNjRDb250ZXh0ICpjb25zdCBoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCk7Cit2b2lkIGZmX2gyNjRfcHJlZF9kaXJlY3RfbW90aW9uKGNvbnN0IEgyNjRDb250ZXh0ICpjb25zdCBoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptYl90eXBlKTsKKwordm9pZCBmZl9oMjY0X2ZpbHRlcl9tYl9mYXN0KGNvbnN0IEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCwgaW50IG1iX3gsIGludCBtYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmltZ195LCB1aW50OF90ICppbWdfY2IsIHVpbnQ4X3QgKmltZ19jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGluZXNpemUsIHVuc2lnbmVkIGludCB1dmxpbmVzaXplKTsKK3ZvaWQgZmZfaDI2NF9maWx0ZXJfbWIoY29uc3QgSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsLCBpbnQgbWJfeCwgaW50IG1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmltZ195LCB1aW50OF90ICppbWdfY2IsIHVpbnQ4X3QgKmltZ19jciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxpbmVzaXplLCB1bnNpZ25lZCBpbnQgdXZsaW5lc2l6ZSk7CisKKy8qCisgKiBvLW8gby1vCisgKiAgLyAvIC8KKyAqIG8tbyBvLW8KKyAqICAsLS0tJworICogby1vIG8tbworICogIC8gLyAvCisgKiBvLW8gby1vCisgKi8KKworLyogU2Nhbjggb3JnYW5pemF0aW9uOgorICogICAgMCAxIDIgMyA0IDUgNiA3CisgKiAwICBEWSAgICB5IHkgeSB5IHkKKyAqIDEgICAgICAgIHkgWSBZIFkgWQorICogMiAgICAgICAgeSBZIFkgWSBZCisgKiAzICAgICAgICB5IFkgWSBZIFkKKyAqIDQgICAgICAgIHkgWSBZIFkgWQorICogNSAgRFUgICAgdSB1IHUgdSB1CisgKiA2ICAgICAgICB1IFUgVSBVIFUKKyAqIDcgICAgICAgIHUgVSBVIFUgVQorICogOCAgICAgICAgdSBVIFUgVSBVCisgKiA5ICAgICAgICB1IFUgVSBVIFUKKyAqIDEwIERWICAgIHYgdiB2IHYgdgorICogMTEgICAgICAgdiBWIFYgViBWCisgKiAxMiAgICAgICB2IFYgViBWIFYKKyAqIDEzICAgICAgIHYgViBWIFYgVgorICogMTQgICAgICAgdiBWIFYgViBWCisgKiBEWS9EVS9EViBhcmUgZm9yIGx1bWEvY2hyb21hIERDLgorICovCisKKyNkZWZpbmUgTFVNQV9EQ19CTE9DS19JTkRFWCAgIDQ4CisjZGVmaW5lIENIUk9NQV9EQ19CTE9DS19JTkRFWCA0OQorCisvLyBUaGlzIHRhYmxlIG11c3QgYmUgaGVyZSBiZWNhdXNlIHNjYW44W2NvbnN0YW50XSBtdXN0IGJlIGtub3duIGF0IGNvbXBpbGV0aW1lCitzdGF0aWMgY29uc3QgdWludDhfdCBzY2FuOFsxNiAqIDMgKyAzXSA9IHsKKyAgICA0ICsgIDEgKiA4LCA1ICsgIDEgKiA4LCA0ICsgIDIgKiA4LCA1ICsgIDIgKiA4LAorICAgIDYgKyAgMSAqIDgsIDcgKyAgMSAqIDgsIDYgKyAgMiAqIDgsIDcgKyAgMiAqIDgsCisgICAgNCArICAzICogOCwgNSArICAzICogOCwgNCArICA0ICogOCwgNSArICA0ICogOCwKKyAgICA2ICsgIDMgKiA4LCA3ICsgIDMgKiA4LCA2ICsgIDQgKiA4LCA3ICsgIDQgKiA4LAorICAgIDQgKyAgNiAqIDgsIDUgKyAgNiAqIDgsIDQgKyAgNyAqIDgsIDUgKyAgNyAqIDgsCisgICAgNiArICA2ICogOCwgNyArICA2ICogOCwgNiArICA3ICogOCwgNyArICA3ICogOCwKKyAgICA0ICsgIDggKiA4LCA1ICsgIDggKiA4LCA0ICsgIDkgKiA4LCA1ICsgIDkgKiA4LAorICAgIDYgKyAgOCAqIDgsIDcgKyAgOCAqIDgsIDYgKyAgOSAqIDgsIDcgKyAgOSAqIDgsCisgICAgNCArIDExICogOCwgNSArIDExICogOCwgNCArIDEyICogOCwgNSArIDEyICogOCwKKyAgICA2ICsgMTEgKiA4LCA3ICsgMTEgKiA4LCA2ICsgMTIgKiA4LCA3ICsgMTIgKiA4LAorICAgIDQgKyAxMyAqIDgsIDUgKyAxMyAqIDgsIDQgKyAxNCAqIDgsIDUgKyAxNCAqIDgsCisgICAgNiArIDEzICogOCwgNyArIDEzICogOCwgNiArIDE0ICogOCwgNyArIDE0ICogOCwKKyAgICAwICsgIDAgKiA4LCAwICsgIDUgKiA4LCAwICsgMTAgKiA4Cit9OworCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50MzJfdCBwYWNrMTZ0bzMyKHVuc2lnbmVkIGEsIHVuc2lnbmVkIGIpCit7CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICByZXR1cm4gKGIgJiAweEZGRkYpICsgKGEgPDwgMTYpOworI2Vsc2UKKyAgICByZXR1cm4gKGEgJiAweEZGRkYpICsgKGIgPDwgMTYpOworI2VuZGlmCit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQxNl90IHBhY2s4dG8xNih1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKQoreworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgcmV0dXJuIChiICYgMHhGRikgKyAoYSA8PCA4KTsKKyNlbHNlCisgICAgcmV0dXJuIChhICYgMHhGRikgKyAoYiA8PCA4KTsKKyNlbmRpZgorfQorCisvKioKKyAqIEdldCB0aGUgY2hyb21hIHFwLgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZ2V0X2Nocm9tYV9xcChjb25zdCBQUFMgKnBwcywgaW50IHQsIGludCBxc2NhbGUpCit7CisgICAgcmV0dXJuIHBwcy0+Y2hyb21hX3FwX3RhYmxlW3RdW3FzY2FsZV07Cit9CisKKy8qKgorICogR2V0IHRoZSBwcmVkaWN0ZWQgaW50cmE0eDQgcHJlZGljdGlvbiBtb2RlLgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgcHJlZF9pbnRyYV9tb2RlKGNvbnN0IEgyNjRDb250ZXh0ICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCwgaW50IG4pCit7CisgICAgY29uc3QgaW50IGluZGV4OCA9IHNjYW44W25dOworICAgIGNvbnN0IGludCBsZWZ0ICAgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW2luZGV4OCAtIDFdOworICAgIGNvbnN0IGludCB0b3AgICAgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW2luZGV4OCAtIDhdOworICAgIGNvbnN0IGludCBtaW4gICAgPSBGRk1JTihsZWZ0LCB0b3ApOworCisgICAgZmZfdGxvZyhoLT5hdmN0eCwgIm1vZGU6JWQgJWQgbWluOiVkXG4iLCBsZWZ0LCB0b3AsIG1pbik7CisKKyAgICBpZiAobWluIDwgMCkKKyAgICAgICAgcmV0dXJuIERDX1BSRUQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gbWluOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHdyaXRlX2JhY2tfaW50cmFfcHJlZF9tb2RlKGNvbnN0IEgyNjRDb250ZXh0ICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCkKK3sKKyAgICBpbnQ4X3QgKmk0eDQgICAgICAgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlICsgaC0+bWIyYnJfeHlbc2wtPm1iX3h5XTsKKyAgICBpbnQ4X3QgKmk0eDRfY2FjaGUgPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlOworCisgICAgQVZfQ09QWTMyKGk0eDQsIGk0eDRfY2FjaGUgKyA0ICsgOCAqIDQpOworICAgIGk0eDRbNF0gPSBpNHg0X2NhY2hlWzcgKyA4ICogM107CisgICAgaTR4NFs1XSA9IGk0eDRfY2FjaGVbNyArIDggKiAyXTsKKyAgICBpNHg0WzZdID0gaTR4NF9jYWNoZVs3ICsgOCAqIDFdOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHdyaXRlX2JhY2tfbm9uX3plcm9fY291bnQoY29uc3QgSDI2NENvbnRleHQgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wpCit7CisgICAgY29uc3QgaW50IG1iX3h5ICAgID0gc2wtPm1iX3h5OworICAgIHVpbnQ4X3QgKm5ueiAgICAgICA9IGgtPm5vbl96ZXJvX2NvdW50W21iX3h5XTsKKyAgICB1aW50OF90ICpubnpfY2FjaGUgPSBzbC0+bm9uX3plcm9fY291bnRfY2FjaGU7CisKKyAgICBBVl9DT1BZMzIoJm5uelsgMF0sICZubnpfY2FjaGVbNCArIDggKiAxXSk7CisgICAgQVZfQ09QWTMyKCZubnpbIDRdLCAmbm56X2NhY2hlWzQgKyA4ICogMl0pOworICAgIEFWX0NPUFkzMigmbm56WyA4XSwgJm5uel9jYWNoZVs0ICsgOCAqIDNdKTsKKyAgICBBVl9DT1BZMzIoJm5uelsxMl0sICZubnpfY2FjaGVbNCArIDggKiA0XSk7CisgICAgQVZfQ09QWTMyKCZubnpbMTZdLCAmbm56X2NhY2hlWzQgKyA4ICogNl0pOworICAgIEFWX0NPUFkzMigmbm56WzIwXSwgJm5uel9jYWNoZVs0ICsgOCAqIDddKTsKKyAgICBBVl9DT1BZMzIoJm5uelszMl0sICZubnpfY2FjaGVbNCArIDggKiAxMV0pOworICAgIEFWX0NPUFkzMigmbm56WzM2XSwgJm5uel9jYWNoZVs0ICsgOCAqIDEyXSk7CisKKyAgICBpZiAoIWgtPmNocm9tYV95X3NoaWZ0KSB7CisgICAgICAgIEFWX0NPUFkzMigmbm56WzI0XSwgJm5uel9jYWNoZVs0ICsgOCAqIDhdKTsKKyAgICAgICAgQVZfQ09QWTMyKCZubnpbMjhdLCAmbm56X2NhY2hlWzQgKyA4ICogOV0pOworICAgICAgICBBVl9DT1BZMzIoJm5uels0MF0sICZubnpfY2FjaGVbNCArIDggKiAxM10pOworICAgICAgICBBVl9DT1BZMzIoJm5uels0NF0sICZubnpfY2FjaGVbNCArIDggKiAxNF0pOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB3cml0ZV9iYWNrX21vdGlvbl9saXN0KGNvbnN0IEgyNjRDb250ZXh0ICpoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRTbGljZUNvbnRleHQgKnNsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl94eSwgaW50IGI4X3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlLCBpbnQgbGlzdCkKK3sKKyAgICBpbnQxNl90KCptdl9kc3QpWzJdID0gJmgtPmN1cl9waWMubW90aW9uX3ZhbFtsaXN0XVtiX3h5XTsKKyAgICBpbnQxNl90KCptdl9zcmMpWzJdID0gJnNsLT5tdl9jYWNoZVtsaXN0XVtzY2FuOFswXV07CisgICAgQVZfQ09QWTEyOChtdl9kc3QgKyAwICogYl9zdHJpZGUsIG12X3NyYyArIDggKiAwKTsKKyAgICBBVl9DT1BZMTI4KG12X2RzdCArIDEgKiBiX3N0cmlkZSwgbXZfc3JjICsgOCAqIDEpOworICAgIEFWX0NPUFkxMjgobXZfZHN0ICsgMiAqIGJfc3RyaWRlLCBtdl9zcmMgKyA4ICogMik7CisgICAgQVZfQ09QWTEyOChtdl9kc3QgKyAzICogYl9zdHJpZGUsIG12X3NyYyArIDggKiAzKTsKKyAgICBpZiAoQ0FCQUMoaCkpIHsKKyAgICAgICAgdWludDhfdCAoKm12ZF9kc3QpWzJdID0gJnNsLT5tdmRfdGFibGVbbGlzdF1bRk1PID8gOCAqIHNsLT5tYl94eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGgtPm1iMmJyX3h5W3NsLT5tYl94eV1dOworICAgICAgICB1aW50OF90KCptdmRfc3JjKVsyXSAgPSAmc2wtPm12ZF9jYWNoZVtsaXN0XVtzY2FuOFswXV07CisgICAgICAgIGlmIChJU19TS0lQKG1iX3R5cGUpKSB7CisgICAgICAgICAgICBBVl9aRVJPMTI4KG12ZF9kc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVZfQ09QWTY0KG12ZF9kc3QsIG12ZF9zcmMgKyA4ICogMyk7CisgICAgICAgICAgICBBVl9DT1BZMTYobXZkX2RzdCArIDMgKyAzLCBtdmRfc3JjICsgMyArIDggKiAwKTsKKyAgICAgICAgICAgIEFWX0NPUFkxNihtdmRfZHN0ICsgMyArIDIsIG12ZF9zcmMgKyAzICsgOCAqIDEpOworICAgICAgICAgICAgQVZfQ09QWTE2KG12ZF9kc3QgKyAzICsgMSwgbXZkX3NyYyArIDMgKyA4ICogMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIGludDhfdCAqcmVmX2luZGV4ID0gJmgtPmN1cl9waWMucmVmX2luZGV4W2xpc3RdW2I4X3h5XTsKKyAgICAgICAgaW50OF90ICpyZWZfY2FjaGUgPSBzbC0+cmVmX2NhY2hlW2xpc3RdOworICAgICAgICByZWZfaW5kZXhbMCArIDAgKiAyXSA9IHJlZl9jYWNoZVtzY2FuOFswXV07CisgICAgICAgIHJlZl9pbmRleFsxICsgMCAqIDJdID0gcmVmX2NhY2hlW3NjYW44WzRdXTsKKyAgICAgICAgcmVmX2luZGV4WzAgKyAxICogMl0gPSByZWZfY2FjaGVbc2NhbjhbOF1dOworICAgICAgICByZWZfaW5kZXhbMSArIDEgKiAyXSA9IHJlZl9jYWNoZVtzY2FuOFsxMl1dOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB3cml0ZV9iYWNrX21vdGlvbihjb25zdCBIMjY0Q29udGV4dCAqaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlKQoreworICAgIGNvbnN0IGludCBiX3N0cmlkZSAgICAgID0gaC0+Yl9zdHJpZGU7CisgICAgY29uc3QgaW50IGJfeHkgID0gNCAqIHNsLT5tYl94ICsgNCAqIHNsLT5tYl95ICogaC0+Yl9zdHJpZGU7IC8vIHRyeSBtYjJiKDgpX3h5CisgICAgY29uc3QgaW50IGI4X3h5ID0gNCAqIHNsLT5tYl94eTsKKworICAgIGlmIChVU0VTX0xJU1QobWJfdHlwZSwgMCkpIHsKKyAgICAgICAgd3JpdGVfYmFja19tb3Rpb25fbGlzdChoLCBzbCwgYl9zdHJpZGUsIGJfeHksIGI4X3h5LCBtYl90eXBlLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsX3JlY3RhbmdsZSgmaC0+Y3VyX3BpYy5yZWZfaW5kZXhbMF1bYjhfeHldLAorICAgICAgICAgICAgICAgICAgICAgICAyLCAyLCAyLCAodWludDhfdClMSVNUX05PVF9VU0VELCAxKTsKKyAgICB9CisgICAgaWYgKFVTRVNfTElTVChtYl90eXBlLCAxKSkKKyAgICAgICAgd3JpdGVfYmFja19tb3Rpb25fbGlzdChoLCBzbCwgYl9zdHJpZGUsIGJfeHksIGI4X3h5LCBtYl90eXBlLCAxKTsKKworICAgIGlmIChzbC0+c2xpY2VfdHlwZV9ub3MgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgQ0FCQUMoaCkpIHsKKyAgICAgICAgaWYgKElTXzhYOChtYl90eXBlKSkgeworICAgICAgICAgICAgdWludDhfdCAqZGlyZWN0X3RhYmxlID0gJmgtPmRpcmVjdF90YWJsZVs0ICogc2wtPm1iX3h5XTsKKyAgICAgICAgICAgIGRpcmVjdF90YWJsZVsxXSA9IHNsLT5zdWJfbWJfdHlwZVsxXSA+PiAxOworICAgICAgICAgICAgZGlyZWN0X3RhYmxlWzJdID0gc2wtPnN1Yl9tYl90eXBlWzJdID4+IDE7CisgICAgICAgICAgICBkaXJlY3RfdGFibGVbM10gPSBzbC0+c3ViX21iX3R5cGVbM10gPj4gMTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9kY3Q4eDhfYWxsb3dlZChjb25zdCBIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpCit7CisgICAgaWYgKGgtPnBzLnNwcy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZykKKyAgICAgICAgcmV0dXJuICEoQVZfUk42NEEoc2wtPnN1Yl9tYl90eXBlKSAmCisgICAgICAgICAgICAgICAgICgoTUJfVFlQRV8xNng4IHwgTUJfVFlQRV84eDE2IHwgTUJfVFlQRV84eDgpICoKKyAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDEwMDAxMDAwMVVMTCkpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuICEoQVZfUk42NEEoc2wtPnN1Yl9tYl90eXBlKSAmCisgICAgICAgICAgICAgICAgICgoTUJfVFlQRV8xNng4IHwgTUJfVFlQRV84eDE2IHwgTUJfVFlQRV84eDggfCBNQl9UWVBFX0RJUkVDVDIpICoKKyAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDEwMDAxMDAwMVVMTCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmaW5kX3N0YXJ0X2NvZGUoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX2luZGV4LCBpbnQgbmV4dF9hdmMpCit7CisgICAgdWludDMyX3Qgc3RhdGUgPSAtMTsKKworICAgIGJ1Zl9pbmRleCA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoYnVmICsgYnVmX2luZGV4LCBidWYgKyBuZXh0X2F2YyArIDEsICZzdGF0ZSkgLSBidWYgLSAxOworCisgICAgcmV0dXJuIEZGTUlOKGJ1Zl9pbmRleCwgYnVmX3NpemUpOworfQorCitpbnQgZmZfaDI2NF9maWVsZF9lbmQoSDI2NENvbnRleHQgKmgsIEgyNjRTbGljZUNvbnRleHQgKnNsLCBpbnQgaW5fc2V0dXApOworCitpbnQgZmZfaDI2NF9yZWZfcGljdHVyZShIMjY0Q29udGV4dCAqaCwgSDI2NFBpY3R1cmUgKmRzdCwgSDI2NFBpY3R1cmUgKnNyYyk7Cit2b2lkIGZmX2gyNjRfdW5yZWZfcGljdHVyZShIMjY0Q29udGV4dCAqaCwgSDI2NFBpY3R1cmUgKnBpYyk7CisKK2ludCBmZl9oMjY0X3NsaWNlX2NvbnRleHRfaW5pdChIMjY0Q29udGV4dCAqaCwgSDI2NFNsaWNlQ29udGV4dCAqc2wpOworCit2b2lkIGZmX2gyNjRfZHJhd19ob3Jpel9iYW5kKGNvbnN0IEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCwgaW50IHksIGludCBoZWlnaHQpOworCitpbnQgZmZfaDI2NF9kZWNvZGVfc2xpY2VfaGVhZGVyKEgyNjRDb250ZXh0ICpoLCBIMjY0U2xpY2VDb250ZXh0ICpzbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NDVOQUwgKm5hbCk7CisvKioKKyAqIFN1Ym1pdCBhIHNsaWNlIGZvciBkZWNvZGluZy4KKyAqCisgKiBQYXJzZSB0aGUgc2xpY2UgaGVhZGVyLCBzdGFydGluZyBhIG5ldyBmaWVsZC9mcmFtZSBpZiBuZWNlc3NhcnkuIElmIGFueQorICogc2xpY2VzIGFyZSBxdWV1ZWQgZm9yIHRoZSBwcmV2aW91cyBmaWVsZCwgdGhleSBhcmUgZGVjb2RlZC4KKyAqLworaW50IGZmX2gyNjRfcXVldWVfZGVjb2RlX3NsaWNlKEgyNjRDb250ZXh0ICpoLCBjb25zdCBIMjY0NU5BTCAqbmFsKTsKK2ludCBmZl9oMjY0X2V4ZWN1dGVfZGVjb2RlX3NsaWNlcyhIMjY0Q29udGV4dCAqaCk7CitpbnQgZmZfaDI2NF91cGRhdGVfdGhyZWFkX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkNvZGVjQ29udGV4dCAqc3JjKTsKKwordm9pZCBmZl9oMjY0X2ZsdXNoX2NoYW5nZShIMjY0Q29udGV4dCAqaCk7CisKK3ZvaWQgZmZfaDI2NF9mcmVlX3RhYmxlcyhIMjY0Q29udGV4dCAqaCk7CisKK3ZvaWQgZmZfaDI2NF9zZXRfZXJwaWMoRVJQaWN0dXJlICpkc3QsIEgyNjRQaWN0dXJlICpzcmMpOworCisjZW5kaWYgLyogQVZDT0RFQ19IMjY0REVDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NGRzcC5jIGIvbGliYXZjb2RlYy9oMjY0ZHNwLmMKaW5kZXggYmZiNmYxZS4uZDI2ZjU1MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjY0ZHNwLmMKKysrIGIvbGliYXZjb2RlYy9oMjY0ZHNwLmMKQEAgLTIxLDcgKzIxLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgRFNQIGZ1bmN0aW9ucy4KKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHBhcnQxMCBEU1AgZnVuY3Rpb25zLgogICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICovCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NGRzcC5oIGIvbGliYXZjb2RlYy9oMjY0ZHNwLmgKaW5kZXggYzIzMjE5My4uYmNkNzZhYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjY0ZHNwLmgKKysrIGIvbGliYXZjb2RlYy9oMjY0ZHNwLmgKQEAgLTI4LDExICsyOCwxMiBAQAogI2RlZmluZSBBVkNPREVDX0gyNjREU1BfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CiAKLXR5cGVkZWYgdm9pZCAoKmgyNjRfd2VpZ2h0X2Z1bmMpKHVpbnQ4X3QgKmJsb2NrLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAordHlwZWRlZiB2b2lkICgqaDI2NF93ZWlnaHRfZnVuYykodWludDhfdCAqYmxvY2ssIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodCwgaW50IG9mZnNldCk7CiB0eXBlZGVmIHZvaWQgKCpoMjY0X2Jpd2VpZ2h0X2Z1bmMpKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7CiAKIC8qKgpAQCAtNzAsNyArNzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhKTsKICAgICB2b2lkICgqaDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYV9tYmFmZl9pbnRyYSkodWludDhfdCAqcGl4IC8qYWxpZ24gOCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhKTsKLSAgICAvLyBoMjY0X2xvb3BfZmlsdGVyX3N0cmVuZ3RoOiBzaW1kIG9ubHkuIHRoZSBDIHZlcnNpb24gaXMgaW5saW5lZCBpbiBoMjY0LmMKKyAgICAvLyBoMjY0X2xvb3BfZmlsdGVyX3N0cmVuZ3RoOiBzaW1kIG9ubHkuIHRoZSBDIHZlcnNpb24gaXMgaW5saW5lZCBpbiBoMjY0X2xvb3BmaWx0ZXIuYwogICAgIHZvaWQgKCpoMjY0X2xvb3BfZmlsdGVyX3N0cmVuZ3RoKShpbnQxNl90IGJTWzJdWzRdWzRdLCB1aW50OF90IG5uels0MF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCByZWZbMl1bNDBdLCBpbnQxNl90IG12WzJdWzQwXVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZGlyLCBpbnQgZWRnZXMsIGludCBzdGVwLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0ZHNwX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2gyNjRkc3BfdGVtcGxhdGUuYwppbmRleCA5YjJjYzI0Li4wMjg4Y2M3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRkc3BfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2gyNjRkc3BfdGVtcGxhdGUuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBEU1AgZnVuY3Rpb25zLgorICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwIERTUCBmdW5jdGlvbnMuCiAgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKi8KIApAQCAtMzAsNyArMzAsNyBAQAogI2RlZmluZSBvcF9zY2FsZTEoeCkgIGJsb2NrW3hdID0gYXZfY2xpcF9waXhlbCggKGJsb2NrW3hdKndlaWdodCArIG9mZnNldCkgPj4gbG9nMl9kZW5vbSApCiAjZGVmaW5lIG9wX3NjYWxlMih4KSAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCggKHNyY1t4XSp3ZWlnaHRzICsgZHN0W3hdKndlaWdodGQgKyBvZmZzZXQpID4+IChsb2cyX2Rlbm9tKzEpKQogI2RlZmluZSBIMjY0X1dFSUdIVChXKSBcCi1zdGF0aWMgdm9pZCBGVU5DQyh3ZWlnaHRfaDI2NF9waXhlbHMgIyMgVykodWludDhfdCAqX2Jsb2NrLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBcCitzdGF0aWMgdm9pZCBGVU5DQyh3ZWlnaHRfaDI2NF9waXhlbHMgIyMgVykodWludDhfdCAqX2Jsb2NrLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpIFwKIHsgXAogICAgIGludCB5OyBcCkBAIC02MCw3ICs2MCw3IEBACiAgICAgICAgIG9wX3NjYWxlMSgxNSk7IFwKICAgICB9IFwKIH0gXAotc3RhdGljIHZvaWQgRlVOQ0MoYml3ZWlnaHRfaDI2NF9waXhlbHMgIyMgVykodWludDhfdCAqX2RzdCwgdWludDhfdCAqX3NyYywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgXAorc3RhdGljIHZvaWQgRlVOQ0MoYml3ZWlnaHRfaDI2NF9waXhlbHMgIyMgVykodWludDhfdCAqX2RzdCwgdWludDhfdCAqX3NyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCkgXAogeyBcCiAgICAgaW50IHk7IFwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NGlkY3RfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvaDI2NGlkY3RfdGVtcGxhdGUuYwppbmRleCBhYmY4ODhlLi41OTkzYWUyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRpZGN0X3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9oMjY0aWRjdF90ZW1wbGF0ZS5jCkBAIC0yNyw3ICsyNyw3IEBACiAKICNpbmNsdWRlICJiaXRfZGVwdGhfdGVtcGxhdGUuYyIKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCi0jaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkZWMuaCIKICNpbmNsdWRlICJoMjY0aWRjdC5oIgogCiB2b2lkIEZVTkNDKGZmX2gyNjRfaWRjdF9hZGQpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKl9ibG9jaywgaW50IHN0cmlkZSkKQEAgLTQwLDEwICs0MCwxMCBAQAogICAgIGJsb2NrWzBdICs9IDEgPDwgNTsKIAogICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKLSAgICAgICAgY29uc3QgaW50IHowPSAgYmxvY2tbaSArIDQqMF0gICAgICsgIGJsb2NrW2kgKyA0KjJdOwotICAgICAgICBjb25zdCBpbnQgejE9ICBibG9ja1tpICsgNCowXSAgICAgLSAgYmxvY2tbaSArIDQqMl07Ci0gICAgICAgIGNvbnN0IGludCB6Mj0gKGJsb2NrW2kgKyA0KjFdPj4xKSAtICBibG9ja1tpICsgNCozXTsKLSAgICAgICAgY29uc3QgaW50IHozPSAgYmxvY2tbaSArIDQqMV0gICAgICsgKGJsb2NrW2kgKyA0KjNdPj4xKTsKKyAgICAgICAgY29uc3QgU1VJTlQgejA9ICBibG9ja1tpICsgNCowXSAgICAgKyAgKHVuc2lnbmVkKWJsb2NrW2kgKyA0KjJdOworICAgICAgICBjb25zdCBTVUlOVCB6MT0gIGJsb2NrW2kgKyA0KjBdICAgICAtICAodW5zaWduZWQpYmxvY2tbaSArIDQqMl07CisgICAgICAgIGNvbnN0IFNVSU5UIHoyPSAoYmxvY2tbaSArIDQqMV0+PjEpIC0gICh1bnNpZ25lZClibG9ja1tpICsgNCozXTsKKyAgICAgICAgY29uc3QgU1VJTlQgejM9ICBibG9ja1tpICsgNCoxXSAgICAgKyAodW5zaWduZWQpKGJsb2NrW2kgKyA0KjNdPj4xKTsKIAogICAgICAgICBibG9ja1tpICsgNCowXT0gejAgKyB6MzsKICAgICAgICAgYmxvY2tbaSArIDQqMV09IHoxICsgejI7CkBAIC01MiwxNSArNTIsMTUgQEAKICAgICB9CiAKICAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7Ci0gICAgICAgIGNvbnN0IGludCB6MD0gIGJsb2NrWzAgKyA0KmldICAgICArICBibG9ja1syICsgNCppXTsKLSAgICAgICAgY29uc3QgaW50IHoxPSAgYmxvY2tbMCArIDQqaV0gICAgIC0gIGJsb2NrWzIgKyA0KmldOwotICAgICAgICBjb25zdCBpbnQgejI9IChibG9ja1sxICsgNCppXT4+MSkgLSAgYmxvY2tbMyArIDQqaV07Ci0gICAgICAgIGNvbnN0IGludCB6Mz0gIGJsb2NrWzEgKyA0KmldICAgICArIChibG9ja1szICsgNCppXT4+MSk7CisgICAgICAgIGNvbnN0IFNVSU5UIHowPSAgYmxvY2tbMCArIDQqaV0gICAgICsgIChTVUlOVClibG9ja1syICsgNCppXTsKKyAgICAgICAgY29uc3QgU1VJTlQgejE9ICBibG9ja1swICsgNCppXSAgICAgLSAgKFNVSU5UKWJsb2NrWzIgKyA0KmldOworICAgICAgICBjb25zdCBTVUlOVCB6Mj0gKGJsb2NrWzEgKyA0KmldPj4xKSAtICAoU1VJTlQpYmxvY2tbMyArIDQqaV07CisgICAgICAgIGNvbnN0IFNVSU5UIHozPSAgYmxvY2tbMSArIDQqaV0gICAgICsgKFNVSU5UKShibG9ja1szICsgNCppXT4+MSk7CiAKLSAgICAgICAgZHN0W2kgKyAwKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAwKnN0cmlkZV0gKyAoKHowICsgejMpID4+IDYpKTsKLSAgICAgICAgZHN0W2kgKyAxKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAxKnN0cmlkZV0gKyAoKHoxICsgejIpID4+IDYpKTsKLSAgICAgICAgZHN0W2kgKyAyKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAyKnN0cmlkZV0gKyAoKHoxIC0gejIpID4+IDYpKTsKLSAgICAgICAgZHN0W2kgKyAzKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAzKnN0cmlkZV0gKyAoKHowIC0gejMpID4+IDYpKTsKKyAgICAgICAgZHN0W2kgKyAwKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAwKnN0cmlkZV0gKyAoKGludCkoejAgKyB6MykgPj4gNikpOworICAgICAgICBkc3RbaSArIDEqc3RyaWRlXT0gYXZfY2xpcF9waXhlbChkc3RbaSArIDEqc3RyaWRlXSArICgoaW50KSh6MSArIHoyKSA+PiA2KSk7CisgICAgICAgIGRzdFtpICsgMipzdHJpZGVdPSBhdl9jbGlwX3BpeGVsKGRzdFtpICsgMipzdHJpZGVdICsgKChpbnQpKHoxIC0gejIpID4+IDYpKTsKKyAgICAgICAgZHN0W2kgKyAzKnN0cmlkZV09IGF2X2NsaXBfcGl4ZWwoZHN0W2kgKyAzKnN0cmlkZV0gKyAoKGludCkoejAgLSB6MykgPj4gNikpOwogICAgIH0KIAogICAgIG1lbXNldChibG9jaywgMCwgMTYgKiBzaXplb2YoZGN0Y29lZikpOwpAQCAtNzYsMjUgKzc2LDI1IEBACiAKICAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkKICAgICB7Ci0gICAgICAgIGNvbnN0IGludCBhMCA9ICBibG9ja1tpKzAqOF0gKyBibG9ja1tpKzQqOF07Ci0gICAgICAgIGNvbnN0IGludCBhMiA9ICBibG9ja1tpKzAqOF0gLSBibG9ja1tpKzQqOF07Ci0gICAgICAgIGNvbnN0IGludCBhNCA9IChibG9ja1tpKzIqOF0+PjEpIC0gYmxvY2tbaSs2KjhdOwotICAgICAgICBjb25zdCBpbnQgYTYgPSAoYmxvY2tbaSs2KjhdPj4xKSArIGJsb2NrW2krMio4XTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGEwID0gIGJsb2NrW2krMCo4XSArICh1bnNpZ25lZClibG9ja1tpKzQqOF07CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBhMiA9ICBibG9ja1tpKzAqOF0gLSAodW5zaWduZWQpYmxvY2tbaSs0KjhdOworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYTQgPSAoYmxvY2tbaSsyKjhdPj4xKSAtICh1bnNpZ25lZClibG9ja1tpKzYqOF07CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBhNiA9IChibG9ja1tpKzYqOF0+PjEpICsgKHVuc2lnbmVkKWJsb2NrW2krMio4XTsKIAotICAgICAgICBjb25zdCBpbnQgYjAgPSBhMCArIGE2OwotICAgICAgICBjb25zdCBpbnQgYjIgPSBhMiArIGE0OwotICAgICAgICBjb25zdCBpbnQgYjQgPSBhMiAtIGE0OwotICAgICAgICBjb25zdCBpbnQgYjYgPSBhMCAtIGE2OworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYjAgPSBhMCArIGE2OworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYjIgPSBhMiArIGE0OworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYjQgPSBhMiAtIGE0OworICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgYjYgPSBhMCAtIGE2OwogCi0gICAgICAgIGNvbnN0IGludCBhMSA9IC1ibG9ja1tpKzMqOF0gKyBibG9ja1tpKzUqOF0gLSBibG9ja1tpKzcqOF0gLSAoYmxvY2tbaSs3KjhdPj4xKTsKLSAgICAgICAgY29uc3QgaW50IGEzID0gIGJsb2NrW2krMSo4XSArIGJsb2NrW2krNyo4XSAtIGJsb2NrW2krMyo4XSAtIChibG9ja1tpKzMqOF0+PjEpOwotICAgICAgICBjb25zdCBpbnQgYTUgPSAtYmxvY2tbaSsxKjhdICsgYmxvY2tbaSs3KjhdICsgYmxvY2tbaSs1KjhdICsgKGJsb2NrW2krNSo4XT4+MSk7Ci0gICAgICAgIGNvbnN0IGludCBhNyA9ICBibG9ja1tpKzMqOF0gKyBibG9ja1tpKzUqOF0gKyBibG9ja1tpKzEqOF0gKyAoYmxvY2tbaSsxKjhdPj4xKTsKKyAgICAgICAgY29uc3QgaW50IGExID0gLWJsb2NrW2krMyo4XSArICh1bnNpZ25lZClibG9ja1tpKzUqOF0gLSBibG9ja1tpKzcqOF0gLSAoYmxvY2tbaSs3KjhdPj4xKTsKKyAgICAgICAgY29uc3QgaW50IGEzID0gIGJsb2NrW2krMSo4XSArICh1bnNpZ25lZClibG9ja1tpKzcqOF0gLSBibG9ja1tpKzMqOF0gLSAoYmxvY2tbaSszKjhdPj4xKTsKKyAgICAgICAgY29uc3QgaW50IGE1ID0gLWJsb2NrW2krMSo4XSArICh1bnNpZ25lZClibG9ja1tpKzcqOF0gKyBibG9ja1tpKzUqOF0gKyAoYmxvY2tbaSs1KjhdPj4xKTsKKyAgICAgICAgY29uc3QgaW50IGE3ID0gIGJsb2NrW2krMyo4XSArICh1bnNpZ25lZClibG9ja1tpKzUqOF0gKyBibG9ja1tpKzEqOF0gKyAoYmxvY2tbaSsxKjhdPj4xKTsKIAotICAgICAgICBjb25zdCBpbnQgYjEgPSAoYTc+PjIpICsgYTE7Ci0gICAgICAgIGNvbnN0IGludCBiMyA9ICBhMyArIChhNT4+Mik7Ci0gICAgICAgIGNvbnN0IGludCBiNSA9IChhMz4+MikgLSBhNTsKLSAgICAgICAgY29uc3QgaW50IGI3ID0gIGE3IC0gKGExPj4yKTsKKyAgICAgICAgY29uc3QgaW50IGIxID0gKGE3Pj4yKSArICh1bnNpZ25lZClhMTsKKyAgICAgICAgY29uc3QgaW50IGIzID0gICh1bnNpZ25lZClhMyArIChhNT4+Mik7CisgICAgICAgIGNvbnN0IGludCBiNSA9IChhMz4+MikgLSAodW5zaWduZWQpYTU7CisgICAgICAgIGNvbnN0IGludCBiNyA9ICAodW5zaWduZWQpYTcgLSAoYTE+PjIpOwogCiAgICAgICAgIGJsb2NrW2krMCo4XSA9IGIwICsgYjc7CiAgICAgICAgIGJsb2NrW2krNyo4XSA9IGIwIC0gYjc7CkBAIC0xMDcsMzQgKzEwNywzNCBAQAogICAgIH0KICAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkKICAgICB7Ci0gICAgICAgIGNvbnN0IGludCBhMCA9ICBibG9ja1swK2kqOF0gKyBibG9ja1s0K2kqOF07Ci0gICAgICAgIGNvbnN0IGludCBhMiA9ICBibG9ja1swK2kqOF0gLSBibG9ja1s0K2kqOF07Ci0gICAgICAgIGNvbnN0IGludCBhNCA9IChibG9ja1syK2kqOF0+PjEpIC0gYmxvY2tbNitpKjhdOwotICAgICAgICBjb25zdCBpbnQgYTYgPSAoYmxvY2tbNitpKjhdPj4xKSArIGJsb2NrWzIraSo4XTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgYTAgPSAgYmxvY2tbMCtpKjhdICsgKHVuc2lnbmVkKWJsb2NrWzQraSo4XTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgYTIgPSAgYmxvY2tbMCtpKjhdIC0gKHVuc2lnbmVkKWJsb2NrWzQraSo4XTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgYTQgPSAoYmxvY2tbMitpKjhdPj4xKSAtICh1bnNpZ25lZClibG9ja1s2K2kqOF07CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGE2ID0gKGJsb2NrWzYraSo4XT4+MSkgKyAodW5zaWduZWQpYmxvY2tbMitpKjhdOwogCi0gICAgICAgIGNvbnN0IGludCBiMCA9IGEwICsgYTY7Ci0gICAgICAgIGNvbnN0IGludCBiMiA9IGEyICsgYTQ7Ci0gICAgICAgIGNvbnN0IGludCBiNCA9IGEyIC0gYTQ7Ci0gICAgICAgIGNvbnN0IGludCBiNiA9IGEwIC0gYTY7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGIwID0gYTAgKyBhNjsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgYjIgPSBhMiArIGE0OworICAgICAgICBjb25zdCB1bnNpZ25lZCBiNCA9IGEyIC0gYTQ7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGI2ID0gYTAgLSBhNjsKIAotICAgICAgICBjb25zdCBpbnQgYTEgPSAtYmxvY2tbMytpKjhdICsgYmxvY2tbNStpKjhdIC0gYmxvY2tbNytpKjhdIC0gKGJsb2NrWzcraSo4XT4+MSk7Ci0gICAgICAgIGNvbnN0IGludCBhMyA9ICBibG9ja1sxK2kqOF0gKyBibG9ja1s3K2kqOF0gLSBibG9ja1szK2kqOF0gLSAoYmxvY2tbMytpKjhdPj4xKTsKLSAgICAgICAgY29uc3QgaW50IGE1ID0gLWJsb2NrWzEraSo4XSArIGJsb2NrWzcraSo4XSArIGJsb2NrWzUraSo4XSArIChibG9ja1s1K2kqOF0+PjEpOwotICAgICAgICBjb25zdCBpbnQgYTcgPSAgYmxvY2tbMytpKjhdICsgYmxvY2tbNStpKjhdICsgYmxvY2tbMStpKjhdICsgKGJsb2NrWzEraSo4XT4+MSk7CisgICAgICAgIGNvbnN0IGludCBhMSA9IC0odW5zaWduZWQpYmxvY2tbMytpKjhdICsgYmxvY2tbNStpKjhdIC0gYmxvY2tbNytpKjhdIC0gKGJsb2NrWzcraSo4XT4+MSk7CisgICAgICAgIGNvbnN0IGludCBhMyA9ICAodW5zaWduZWQpYmxvY2tbMStpKjhdICsgYmxvY2tbNytpKjhdIC0gYmxvY2tbMytpKjhdIC0gKGJsb2NrWzMraSo4XT4+MSk7CisgICAgICAgIGNvbnN0IGludCBhNSA9IC0odW5zaWduZWQpYmxvY2tbMStpKjhdICsgYmxvY2tbNytpKjhdICsgYmxvY2tbNStpKjhdICsgKGJsb2NrWzUraSo4XT4+MSk7CisgICAgICAgIGNvbnN0IGludCBhNyA9ICAodW5zaWduZWQpYmxvY2tbMytpKjhdICsgYmxvY2tbNStpKjhdICsgYmxvY2tbMStpKjhdICsgKGJsb2NrWzEraSo4XT4+MSk7CiAKLSAgICAgICAgY29uc3QgaW50IGIxID0gKGE3Pj4yKSArIGExOwotICAgICAgICBjb25zdCBpbnQgYjMgPSAgYTMgKyAoYTU+PjIpOwotICAgICAgICBjb25zdCBpbnQgYjUgPSAoYTM+PjIpIC0gYTU7Ci0gICAgICAgIGNvbnN0IGludCBiNyA9ICBhNyAtIChhMT4+Mik7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGIxID0gKGE3Pj4yKSArICh1bnNpZ25lZClhMTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgYjMgPSAgKHVuc2lnbmVkKWEzICsgKGE1Pj4yKTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgYjUgPSAoYTM+PjIpIC0gKHVuc2lnbmVkKWE1OworICAgICAgICBjb25zdCB1bnNpZ25lZCBiNyA9ICAodW5zaWduZWQpYTcgLSAoYTE+PjIpOwogCi0gICAgICAgIGRzdFtpICsgMCpzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyAwKnN0cmlkZV0gKyAoKGIwICsgYjcpID4+IDYpICk7Ci0gICAgICAgIGRzdFtpICsgMSpzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyAxKnN0cmlkZV0gKyAoKGIyICsgYjUpID4+IDYpICk7Ci0gICAgICAgIGRzdFtpICsgMipzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyAyKnN0cmlkZV0gKyAoKGI0ICsgYjMpID4+IDYpICk7Ci0gICAgICAgIGRzdFtpICsgMypzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyAzKnN0cmlkZV0gKyAoKGI2ICsgYjEpID4+IDYpICk7Ci0gICAgICAgIGRzdFtpICsgNCpzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyA0KnN0cmlkZV0gKyAoKGI2IC0gYjEpID4+IDYpICk7Ci0gICAgICAgIGRzdFtpICsgNSpzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyA1KnN0cmlkZV0gKyAoKGI0IC0gYjMpID4+IDYpICk7Ci0gICAgICAgIGRzdFtpICsgNipzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyA2KnN0cmlkZV0gKyAoKGIyIC0gYjUpID4+IDYpICk7Ci0gICAgICAgIGRzdFtpICsgNypzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyA3KnN0cmlkZV0gKyAoKGIwIC0gYjcpID4+IDYpICk7CisgICAgICAgIGRzdFtpICsgMCpzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyAwKnN0cmlkZV0gKyAoKGludCkoYjAgKyBiNykgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyAxKnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDEqc3RyaWRlXSArICgoaW50KShiMiArIGI1KSA+PiA2KSApOworICAgICAgICBkc3RbaSArIDIqc3RyaWRlXSA9IGF2X2NsaXBfcGl4ZWwoIGRzdFtpICsgMipzdHJpZGVdICsgKChpbnQpKGI0ICsgYjMpID4+IDYpICk7CisgICAgICAgIGRzdFtpICsgMypzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyAzKnN0cmlkZV0gKyAoKGludCkoYjYgKyBiMSkgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyA0KnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDQqc3RyaWRlXSArICgoaW50KShiNiAtIGIxKSA+PiA2KSApOworICAgICAgICBkc3RbaSArIDUqc3RyaWRlXSA9IGF2X2NsaXBfcGl4ZWwoIGRzdFtpICsgNSpzdHJpZGVdICsgKChpbnQpKGI0IC0gYjMpID4+IDYpICk7CisgICAgICAgIGRzdFtpICsgNipzdHJpZGVdID0gYXZfY2xpcF9waXhlbCggZHN0W2kgKyA2KnN0cmlkZV0gKyAoKGludCkoYjIgLSBiNSkgPj4gNikgKTsKKyAgICAgICAgZHN0W2kgKyA3KnN0cmlkZV0gPSBhdl9jbGlwX3BpeGVsKCBkc3RbaSArIDcqc3RyaWRlXSArICgoaW50KShiMCAtIGI3KSA+PiA2KSApOwogICAgIH0KIAogICAgIG1lbXNldChibG9jaywgMCwgNjQgKiBzaXplb2YoZGN0Y29lZikpOwpAQCAtMjYxLDE1ICsyNjEsMTUgQEAKIAogICAgIGZvcihpPTA7IGk8NDsgaSsrKXsKICAgICAgICAgY29uc3QgaW50IG9mZnNldD0geF9vZmZzZXRbaV07Ci0gICAgICAgIGNvbnN0IGludCB6MD0gdGVtcFs0KjAraV0gKyB0ZW1wWzQqMitpXTsKLSAgICAgICAgY29uc3QgaW50IHoxPSB0ZW1wWzQqMCtpXSAtIHRlbXBbNCoyK2ldOwotICAgICAgICBjb25zdCBpbnQgejI9IHRlbXBbNCoxK2ldIC0gdGVtcFs0KjMraV07Ci0gICAgICAgIGNvbnN0IGludCB6Mz0gdGVtcFs0KjEraV0gKyB0ZW1wWzQqMytpXTsKKyAgICAgICAgY29uc3QgU1VJTlQgejA9IHRlbXBbNCowK2ldICsgdGVtcFs0KjIraV07CisgICAgICAgIGNvbnN0IFNVSU5UIHoxPSB0ZW1wWzQqMCtpXSAtIHRlbXBbNCoyK2ldOworICAgICAgICBjb25zdCBTVUlOVCB6Mj0gdGVtcFs0KjEraV0gLSB0ZW1wWzQqMytpXTsKKyAgICAgICAgY29uc3QgU1VJTlQgejM9IHRlbXBbNCoxK2ldICsgdGVtcFs0KjMraV07CiAKLSAgICAgICAgb3V0cHV0W3N0cmlkZSogMCtvZmZzZXRdPSAoKCgoejAgKyB6MykqcW11bCArIDEyOCApID4+IDgpKTsKLSAgICAgICAgb3V0cHV0W3N0cmlkZSogMStvZmZzZXRdPSAoKCgoejEgKyB6MikqcW11bCArIDEyOCApID4+IDgpKTsKLSAgICAgICAgb3V0cHV0W3N0cmlkZSogNCtvZmZzZXRdPSAoKCgoejEgLSB6MikqcW11bCArIDEyOCApID4+IDgpKTsKLSAgICAgICAgb3V0cHV0W3N0cmlkZSogNStvZmZzZXRdPSAoKCgoejAgLSB6MykqcW11bCArIDEyOCApID4+IDgpKTsKKyAgICAgICAgb3V0cHV0W3N0cmlkZSogMCtvZmZzZXRdPSAoaW50KSgoejAgKyB6MykqcW11bCArIDEyOCApID4+IDg7CisgICAgICAgIG91dHB1dFtzdHJpZGUqIDErb2Zmc2V0XT0gKGludCkoKHoxICsgejIpKnFtdWwgKyAxMjggKSA+PiA4OworICAgICAgICBvdXRwdXRbc3RyaWRlKiA0K29mZnNldF09IChpbnQpKCh6MSAtIHoyKSpxbXVsICsgMTI4ICkgPj4gODsKKyAgICAgICAgb3V0cHV0W3N0cmlkZSogNStvZmZzZXRdPSAoaW50KSgoejAgLSB6MykqcW11bCArIDEyOCApID4+IDg7CiAgICAgfQogI3VuZGVmIHN0cmlkZQogfQpAQCAtMjg5LDIyICsyODksMjIgQEAKIAogICAgIGZvcihpPTA7IGk8MjsgaSsrKXsKICAgICAgICAgY29uc3QgaW50IG9mZnNldD0geF9vZmZzZXRbaV07Ci0gICAgICAgIGNvbnN0IGludCB6MD0gdGVtcFsyKjAraV0gKyB0ZW1wWzIqMitpXTsKLSAgICAgICAgY29uc3QgaW50IHoxPSB0ZW1wWzIqMCtpXSAtIHRlbXBbMioyK2ldOwotICAgICAgICBjb25zdCBpbnQgejI9IHRlbXBbMioxK2ldIC0gdGVtcFsyKjMraV07Ci0gICAgICAgIGNvbnN0IGludCB6Mz0gdGVtcFsyKjEraV0gKyB0ZW1wWzIqMytpXTsKKyAgICAgICAgY29uc3QgU1VJTlQgejA9IHRlbXBbMiowK2ldICsgdGVtcFsyKjIraV07CisgICAgICAgIGNvbnN0IFNVSU5UIHoxPSB0ZW1wWzIqMCtpXSAtIHRlbXBbMioyK2ldOworICAgICAgICBjb25zdCBTVUlOVCB6Mj0gdGVtcFsyKjEraV0gLSB0ZW1wWzIqMytpXTsKKyAgICAgICAgY29uc3QgU1VJTlQgejM9IHRlbXBbMioxK2ldICsgdGVtcFsyKjMraV07CiAKLSAgICAgICAgYmxvY2tbc3RyaWRlKjArb2Zmc2V0XT0gKCh6MCArIHozKSpxbXVsICsgMTI4KSA+PiA4OwotICAgICAgICBibG9ja1tzdHJpZGUqMStvZmZzZXRdPSAoKHoxICsgejIpKnFtdWwgKyAxMjgpID4+IDg7Ci0gICAgICAgIGJsb2NrW3N0cmlkZSoyK29mZnNldF09ICgoejEgLSB6MikqcW11bCArIDEyOCkgPj4gODsKLSAgICAgICAgYmxvY2tbc3RyaWRlKjMrb2Zmc2V0XT0gKCh6MCAtIHozKSpxbXVsICsgMTI4KSA+PiA4OworICAgICAgICBibG9ja1tzdHJpZGUqMCtvZmZzZXRdPSAoaW50KSgoejAgKyB6MykqcW11bCArIDEyOCkgPj4gODsKKyAgICAgICAgYmxvY2tbc3RyaWRlKjErb2Zmc2V0XT0gKGludCkoKHoxICsgejIpKnFtdWwgKyAxMjgpID4+IDg7CisgICAgICAgIGJsb2NrW3N0cmlkZSoyK29mZnNldF09IChpbnQpKCh6MSAtIHoyKSpxbXVsICsgMTI4KSA+PiA4OworICAgICAgICBibG9ja1tzdHJpZGUqMytvZmZzZXRdPSAoaW50KSgoejAgLSB6MykqcW11bCArIDEyOCkgPj4gODsKICAgICB9CiB9CiAKIHZvaWQgRlVOQ0MoZmZfaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0KShpbnQxNl90ICpfYmxvY2ssIGludCBxbXVsKXsKICAgICBjb25zdCBpbnQgc3RyaWRlPSAxNioyOwogICAgIGNvbnN0IGludCB4U3RyaWRlPSAxNjsKLSAgICBpbnQgYSxiLGMsZCxlOworICAgIFNVSU5UIGEsYixjLGQsZTsKICAgICBkY3Rjb2VmICpibG9jayA9IChkY3Rjb2VmKilfYmxvY2s7CiAKICAgICBhPSBibG9ja1tzdHJpZGUqMCArIHhTdHJpZGUqMF07CkBAIC0zMTcsOCArMzE3LDggQEAKICAgICBiPSBjLWQ7CiAgICAgYz0gYytkOwogCi0gICAgYmxvY2tbc3RyaWRlKjAgKyB4U3RyaWRlKjBdPSAoKGErYykqcW11bCkgPj4gNzsKLSAgICBibG9ja1tzdHJpZGUqMCArIHhTdHJpZGUqMV09ICgoZStiKSpxbXVsKSA+PiA3OwotICAgIGJsb2NrW3N0cmlkZSoxICsgeFN0cmlkZSowXT0gKChhLWMpKnFtdWwpID4+IDc7Ci0gICAgYmxvY2tbc3RyaWRlKjEgKyB4U3RyaWRlKjFdPSAoKGUtYikqcW11bCkgPj4gNzsKKyAgICBibG9ja1tzdHJpZGUqMCArIHhTdHJpZGUqMF09IChpbnQpKChhK2MpKnFtdWwpID4+IDc7CisgICAgYmxvY2tbc3RyaWRlKjAgKyB4U3RyaWRlKjFdPSAoaW50KSgoZStiKSpxbXVsKSA+PiA3OworICAgIGJsb2NrW3N0cmlkZSoxICsgeFN0cmlkZSowXT0gKGludCkoKGEtYykqcW11bCkgPj4gNzsKKyAgICBibG9ja1tzdHJpZGUqMSArIHhTdHJpZGUqMV09IChpbnQpKChlLWIpKnFtdWwpID4+IDc7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2gyNjRwcmVkLmMgYi9saWJhdmNvZGVjL2gyNjRwcmVkLmMKaW5kZXggOGYxNWY3MS4uNTYzMmE1OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oMjY0cHJlZC5jCisrKyBiL2xpYmF2Y29kZWMvaDI2NHByZWQuYwpAQCAtMjEsNyArMjEsNyBAQAogCiAvKioKICAqIEBmaWxlCi0gKiBILjI2NCAvIEFWQyAvIE1QRUc0IHBhcnQxMCBwcmVkaWN0aW9uIGZ1bmN0aW9ucy4KKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHBhcnQxMCBwcmVkaWN0aW9uIGZ1bmN0aW9ucy4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCkBAIC01NTYsNyArNTU2LDcgQEAKICAgICBoLT5wcmVkMTZ4MTZbVE9QX0RDX1BSRUQ4eDggXT0gRlVOQ0MocHJlZDE2eDE2X3RvcF9kYyAgICAgICAgICAgICAgICAgLCBkZXB0aCk7XAogICAgIGgtPnByZWQxNngxNltEQ18xMjhfUFJFRDh4OCBdPSBGVU5DQyhwcmVkMTZ4MTZfMTI4X2RjICAgICAgICAgICAgICAgICAsIGRlcHRoKTtcCiBcCi0gICAgLyogc3BlY2lhbCBsb3NzbGVzcyBoL3YgcHJlZGljdGlvbiBmb3IgaDI2NCAqLyBcCisgICAgLyogc3BlY2lhbCBsb3NzbGVzcyBoL3YgcHJlZGljdGlvbiBmb3IgSC4yNjQgKi8gXAogICAgIGgtPnByZWQ0eDRfYWRkICBbVkVSVF9QUkVEICAgXT0gRlVOQ0MocHJlZDR4NF92ZXJ0aWNhbF9hZGQgICAgICAgICAgICAsIGRlcHRoKTtcCiAgICAgaC0+cHJlZDR4NF9hZGQgIFsgSE9SX1BSRUQgICBdPSBGVU5DQyhwcmVkNHg0X2hvcml6b250YWxfYWRkICAgICAgICAgICwgZGVwdGgpO1wKICAgICBoLT5wcmVkOHg4bF9hZGQgW1ZFUlRfUFJFRCAgIF09IEZVTkNDKHByZWQ4eDhsX3ZlcnRpY2FsX2FkZCAgICAgICAgICAgLCBkZXB0aCk7XApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oMjY0cHJlZC5oIGIvbGliYXZjb2RlYy9oMjY0cHJlZC5oCmluZGV4IDA5MWRjYmIuLjI4NjNkYzkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaDI2NHByZWQuaAorKysgYi9saWJhdmNvZGVjL2gyNjRwcmVkLmgKQEAgLTIxLDcgKzIxLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwcmVkaWN0aW9uIGZ1bmN0aW9ucy4KKyAqIEguMjY0IC8gQVZDIC8gTVBFRy00IHByZWRpY3Rpb24gZnVuY3Rpb25zLgogICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICovCiAKQEAgLTc1LDcgKzc1LDcgQEAKICNkZWZpbmUgVE9QX0RDX1BSRUQ4eDggICAgICAgICA1CiAjZGVmaW5lIERDXzEyOF9QUkVEOHg4ICAgICAgICAgNgogCi0vLyBIMjY0L1NWUTMgKDh4OCkgc3BlY2lmaWMKKy8vIEguMjY0L1NWUTMgKDh4OCkgc3BlY2lmaWMKICNkZWZpbmUgQUxaSEVJTUVSX0RDX0wwVF9QUkVEOHg4ICA3CiAjZGVmaW5lIEFMWkhFSU1FUl9EQ18wTFRfUFJFRDh4OCAgOAogI2RlZmluZSBBTFpIRUlNRVJfRENfTDAwX1BSRUQ4eDggIDkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NHByZWRfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvaDI2NHByZWRfdGVtcGxhdGUuYwppbmRleCBmNjg0NDMzLi4yYjMwZmZmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2gyNjRwcmVkX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9oMjY0cHJlZF90ZW1wbGF0ZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIEguMjY0IC8gQVZDIC8gTVBFRzQgcGFydDEwIHByZWRpY3Rpb24gZnVuY3Rpb25zLgorICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwIHByZWRpY3Rpb24gZnVuY3Rpb25zLgogICogQGF1dGhvciBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICovCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaDI2NV9tZXRhZGF0YV9ic2YuYyBiL2xpYmF2Y29kZWMvaDI2NV9tZXRhZGF0YV9ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmViMmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oMjY1X21ldGFkYXRhX2JzZi5jCkBAIC0wLDAgKzEsNDY0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAiYnNmLmgiCisjaW5jbHVkZSAiY2JzLmgiCisjaW5jbHVkZSAiY2JzX2gyNjUuaCIKKyNpbmNsdWRlICJoZXZjLmgiCisKK2VudW0geworICAgIFBBU1MsCisgICAgSU5TRVJULAorICAgIFJFTU9WRSwKK307CisKK3R5cGVkZWYgc3RydWN0IEgyNjVNZXRhZGF0YUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjYmM7CisgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCBhY2Nlc3NfdW5pdDsKKworICAgIEgyNjVSYXdBVUQgYXVkX25hbDsKKworICAgIGludCBhdWQ7CisKKyAgICBBVlJhdGlvbmFsIHNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICBpbnQgdmlkZW9fZm9ybWF0OworICAgIGludCB2aWRlb19mdWxsX3JhbmdlX2ZsYWc7CisgICAgaW50IGNvbG91cl9wcmltYXJpZXM7CisgICAgaW50IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICBpbnQgbWF0cml4X2NvZWZmaWNpZW50czsKKworICAgIGludCBjaHJvbWFfc2FtcGxlX2xvY190eXBlOworCisgICAgQVZSYXRpb25hbCB0aWNrX3JhdGU7CisgICAgaW50IHBvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWc7CisgICAgaW50IG51bV90aWNrc19wb2NfZGlmZl9vbmU7CisKKyAgICBpbnQgY3JvcF9sZWZ0OworICAgIGludCBjcm9wX3JpZ2h0OworICAgIGludCBjcm9wX3RvcDsKKyAgICBpbnQgY3JvcF9ib3R0b207Cit9IEgyNjVNZXRhZGF0YUNvbnRleHQ7CisKKworc3RhdGljIGludCBoMjY1X21ldGFkYXRhX3VwZGF0ZV92cHMoQVZCU0ZDb250ZXh0ICpic2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY1UmF3VlBTICp2cHMpCit7CisgICAgSDI2NU1ldGFkYXRhQ29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisKKyAgICBpZiAoY3R4LT50aWNrX3JhdGUubnVtICYmIGN0eC0+dGlja19yYXRlLmRlbikgeworICAgICAgICBpbnQgbnVtLCBkZW47CisKKyAgICAgICAgYXZfcmVkdWNlKCZudW0sICZkZW4sIGN0eC0+dGlja19yYXRlLm51bSwgY3R4LT50aWNrX3JhdGUuZGVuLAorICAgICAgICAgICAgICAgICAgVUlOVDMyX01BWCA+IElOVF9NQVggPyBVSU5UMzJfTUFYIDogSU5UX01BWCk7CisKKyAgICAgICAgdnBzLT52cHNfdGltZV9zY2FsZSAgICAgICAgPSBudW07CisgICAgICAgIHZwcy0+dnBzX251bV91bml0c19pbl90aWNrID0gZGVuOworCisgICAgICAgIHZwcy0+dnBzX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisKKyAgICAgICAgaWYgKGN0eC0+bnVtX3RpY2tzX3BvY19kaWZmX29uZSA+IDApIHsKKyAgICAgICAgICAgIHZwcy0+dnBzX251bV90aWNrc19wb2NfZGlmZl9vbmVfbWludXMxID0KKyAgICAgICAgICAgICAgICBjdHgtPm51bV90aWNrc19wb2NfZGlmZl9vbmUgLSAxOworICAgICAgICAgICAgdnBzLT52cHNfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZyA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoY3R4LT5udW1fdGlja3NfcG9jX2RpZmZfb25lID09IDApIHsKKyAgICAgICAgICAgIHZwcy0+dnBzX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaDI2NV9tZXRhZGF0YV91cGRhdGVfc3BzKEFWQlNGQ29udGV4dCAqYnNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NVJhd1NQUyAqc3BzKQoreworICAgIEgyNjVNZXRhZGF0YUNvbnRleHQgKmN0eCA9IGJzZi0+cHJpdl9kYXRhOworICAgIGludCBuZWVkX3Z1aSA9IDA7CisgICAgaW50IGNyb3BfdW5pdF94LCBjcm9wX3VuaXRfeTsKKworICAgIGlmIChjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmIGN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pIHsKKyAgICAgICAgLy8gVGFibGUgRS0xLgorICAgICAgICBzdGF0aWMgY29uc3QgQVZSYXRpb25hbCBzYXJfaWRjW10gPSB7CisgICAgICAgICAgICB7ICAgMCwgIDAgfSwgLy8gVW5zcGVjaWZpZWQgKG5ldmVyIHdyaXR0ZW4gaGVyZSkuCisgICAgICAgICAgICB7ICAgMSwgIDEgfSwgeyAgMTIsIDExIH0sIHsgIDEwLCAxMSB9LCB7ICAxNiwgMTEgfSwKKyAgICAgICAgICAgIHsgIDQwLCAzMyB9LCB7ICAyNCwgMTEgfSwgeyAgMjAsIDExIH0sIHsgIDMyLCAxMSB9LAorICAgICAgICAgICAgeyAgODAsIDMzIH0sIHsgIDE4LCAxMSB9LCB7ICAxNSwgMTEgfSwgeyAgNjQsIDMzIH0sCisgICAgICAgICAgICB7IDE2MCwgOTkgfSwgeyAgIDQsICAzIH0sIHsgICAzLCAgMiB9LCB7ICAgMiwgIDEgfSwKKyAgICAgICAgfTsKKyAgICAgICAgaW50IG51bSwgZGVuLCBpOworCisgICAgICAgIGF2X3JlZHVjZSgmbnVtLCAmZGVuLCBjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgY3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwgNjU1MzUpOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBGRl9BUlJBWV9FTEVNUyhzYXJfaWRjKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobnVtID09IHNhcl9pZGNbaV0ubnVtICYmCisgICAgICAgICAgICAgICAgZGVuID09IHNhcl9pZGNbaV0uZGVuKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IEZGX0FSUkFZX0VMRU1TKHNhcl9pZGMpKSB7CisgICAgICAgICAgICBzcHMtPnZ1aS5hc3BlY3RfcmF0aW9faWRjID0gMjU1OworICAgICAgICAgICAgc3BzLT52dWkuc2FyX3dpZHRoICA9IG51bTsKKyAgICAgICAgICAgIHNwcy0+dnVpLnNhcl9oZWlnaHQgPSBkZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzcHMtPnZ1aS5hc3BlY3RfcmF0aW9faWRjID0gaTsKKyAgICAgICAgfQorICAgICAgICBzcHMtPnZ1aS5hc3BlY3RfcmF0aW9faW5mb19wcmVzZW50X2ZsYWcgPSAxOworICAgICAgICBuZWVkX3Z1aSA9IDE7CisgICAgfQorCisjZGVmaW5lIFNFVF9PUl9JTkZFUihmaWVsZCwgdmFsdWUsIHByZXNlbnRfZmxhZywgaW5mZXIpIGRvIHsgXAorICAgICAgICBpZiAodmFsdWUgPj0gMCkgeyBcCisgICAgICAgICAgICBmaWVsZCA9IHZhbHVlOyBcCisgICAgICAgICAgICBuZWVkX3Z1aSA9IDE7IFwKKyAgICAgICAgfSBlbHNlIGlmICghcHJlc2VudF9mbGFnKSBcCisgICAgICAgICAgICBmaWVsZCA9IGluZmVyOyBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIGlmIChjdHgtPnZpZGVvX2Zvcm1hdCAgICAgICAgICAgICA+PSAwIHx8CisgICAgICAgIGN0eC0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnICAgID49IDAgfHwKKyAgICAgICAgY3R4LT5jb2xvdXJfcHJpbWFyaWVzICAgICAgICAgPj0gMCB8fAorICAgICAgICBjdHgtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA+PSAwIHx8CisgICAgICAgIGN0eC0+bWF0cml4X2NvZWZmaWNpZW50cyAgICAgID49IDApIHsKKworICAgICAgICBTRVRfT1JfSU5GRVIoc3BzLT52dWkudmlkZW9fZm9ybWF0LCBjdHgtPnZpZGVvX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgIHNwcy0+dnVpLnZpZGVvX3NpZ25hbF90eXBlX3ByZXNlbnRfZmxhZywgNSk7CisKKyAgICAgICAgU0VUX09SX0lORkVSKHNwcy0+dnVpLnZpZGVvX2Z1bGxfcmFuZ2VfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgIGN0eC0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgc3BzLT52dWkudmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnLCAwKTsKKworICAgICAgICBpZiAoY3R4LT5jb2xvdXJfcHJpbWFyaWVzICAgICAgICAgPj0gMCB8fAorICAgICAgICAgICAgY3R4LT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPj0gMCB8fAorICAgICAgICAgICAgY3R4LT5tYXRyaXhfY29lZmZpY2llbnRzICAgICAgPj0gMCkgeworCisgICAgICAgICAgICBTRVRfT1JfSU5GRVIoc3BzLT52dWkuY29sb3VyX3ByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmNvbG91cl9wcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT52dWkuY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZywgMik7CisKKyAgICAgICAgICAgIFNFVF9PUl9JTkZFUihzcHMtPnZ1aS50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT52dWkuY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZywgMik7CisKKyAgICAgICAgICAgIFNFVF9PUl9JTkZFUihzcHMtPnZ1aS5tYXRyaXhfY29lZmZpY2llbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bWF0cml4X2NvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcHMtPnZ1aS5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnLCAyKTsKKworICAgICAgICAgICAgc3BzLT52dWkuY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgc3BzLT52dWkudmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnID0gMTsKKyAgICAgICAgbmVlZF92dWkgPSAxOworICAgIH0KKworICAgIGlmIChjdHgtPmNocm9tYV9zYW1wbGVfbG9jX3R5cGUgPj0gMCkgeworICAgICAgICBzcHMtPnZ1aS5jaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZCA9CisgICAgICAgICAgICBjdHgtPmNocm9tYV9zYW1wbGVfbG9jX3R5cGU7CisgICAgICAgIHNwcy0+dnVpLmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkID0KKyAgICAgICAgICAgIGN0eC0+Y2hyb21hX3NhbXBsZV9sb2NfdHlwZTsKKyAgICAgICAgc3BzLT52dWkuY2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgICAgIG5lZWRfdnVpID0gMTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT50aWNrX3JhdGUubnVtICYmIGN0eC0+dGlja19yYXRlLmRlbikgeworICAgICAgICBpbnQgbnVtLCBkZW47CisKKyAgICAgICAgYXZfcmVkdWNlKCZudW0sICZkZW4sIGN0eC0+dGlja19yYXRlLm51bSwgY3R4LT50aWNrX3JhdGUuZGVuLAorICAgICAgICAgICAgICAgICAgVUlOVDMyX01BWCA+IElOVF9NQVggPyBVSU5UMzJfTUFYIDogSU5UX01BWCk7CisKKyAgICAgICAgc3BzLT52dWkudnVpX3RpbWVfc2NhbGUgICAgICAgID0gbnVtOworICAgICAgICBzcHMtPnZ1aS52dWlfbnVtX3VuaXRzX2luX3RpY2sgPSBkZW47CisKKyAgICAgICAgc3BzLT52dWkudnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgICAgIG5lZWRfdnVpID0gMTsKKworICAgICAgICBpZiAoY3R4LT5udW1fdGlja3NfcG9jX2RpZmZfb25lID4gMCkgeworICAgICAgICAgICAgc3BzLT52dWkudnVpX251bV90aWNrc19wb2NfZGlmZl9vbmVfbWludXMxID0KKyAgICAgICAgICAgICAgICBjdHgtPm51bV90aWNrc19wb2NfZGlmZl9vbmUgLSAxOworICAgICAgICAgICAgc3BzLT52dWkudnVpX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGN0eC0+bnVtX3RpY2tzX3BvY19kaWZmX29uZSA9PSAwKSB7CisgICAgICAgICAgICBzcHMtPnZ1aS52dWlfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZyB8fCBzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDApIHsKKyAgICAgICAgY3JvcF91bml0X3ggPSAxOworICAgICAgICBjcm9wX3VuaXRfeSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3JvcF91bml0X3ggPSAxICsgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPCAzKTsKKyAgICAgICAgY3JvcF91bml0X3kgPSAxICsgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPCAyKTsKKyAgICB9CisjZGVmaW5lIENST1AoYm9yZGVyLCB1bml0KSBkbyB7IFwKKyAgICAgICAgaWYgKGN0eC0+Y3JvcF8gIyMgYm9yZGVyID49IDApIHsgXAorICAgICAgICAgICAgaWYgKGN0eC0+Y3JvcF8gIyMgYm9yZGVyICUgdW5pdCAhPSAwKSB7IFwKKyAgICAgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHZhbHVlIGZvciBjcm9wXyVzOiAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYSBtdWx0aXBsZSBvZiAlZC5cbiIsICNib3JkZXIsIHVuaXQpOyBcCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBzcHMtPmNvbmZfd2luXyAjIyBib3JkZXIgIyMgX29mZnNldCA9IFwKKyAgICAgICAgICAgICAgICBjdHgtPmNyb3BfICMjIGJvcmRlciAvIHVuaXQ7IFwKKyAgICAgICAgICAgIHNwcy0+Y29uZm9ybWFuY2Vfd2luZG93X2ZsYWcgPSAxOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisgICAgQ1JPUChsZWZ0LCAgIGNyb3BfdW5pdF94KTsKKyAgICBDUk9QKHJpZ2h0LCAgY3JvcF91bml0X3gpOworICAgIENST1AodG9wLCAgICBjcm9wX3VuaXRfeSk7CisgICAgQ1JPUChib3R0b20sIGNyb3BfdW5pdF95KTsKKyN1bmRlZiBDUk9QCisKKyAgICBpZiAobmVlZF92dWkpCisgICAgICAgIHNwcy0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGgyNjVfbWV0YWRhdGFfZmlsdGVyKEFWQlNGQ29udGV4dCAqYnNmLCBBVlBhY2tldCAqb3V0KQoreworICAgIEgyNjVNZXRhZGF0YUNvbnRleHQgKmN0eCA9IGJzZi0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0ICppbiA9IE5VTEw7CisgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqYXUgPSAmY3R4LT5hY2Nlc3NfdW5pdDsKKyAgICBpbnQgZXJyLCBpOworCisgICAgZXJyID0gZmZfYnNmX2dldF9wYWNrZXQoYnNmLCAmaW4pOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgZXJyID0gZmZfY2JzX3JlYWRfcGFja2V0KGN0eC0+Y2JjLCBhdSwgaW4pOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWFkIHBhY2tldC5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGF1LT5uYl91bml0cyA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIk5vIE5BTCB1bml0cyBpbiBwYWNrZXQuXG4iKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8vIElmIGFuIEFVRCBpcyBwcmVzZW50LCBpdCBtdXN0IGJlIHRoZSBmaXJzdCBOQUwgdW5pdC4KKyAgICBpZiAoYXUtPnVuaXRzWzBdLnR5cGUgPT0gSEVWQ19OQUxfQVVEKSB7CisgICAgICAgIGlmIChjdHgtPmF1ZCA9PSBSRU1PVkUpCisgICAgICAgICAgICBmZl9jYnNfZGVsZXRlX3VuaXQoY3R4LT5jYmMsIGF1LCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY3R4LT5hdWQgPT0gSU5TRVJUKSB7CisgICAgICAgICAgICBIMjY1UmF3QVVEICphdWQgPSAmY3R4LT5hdWRfbmFsOworICAgICAgICAgICAgaW50IHBpY190eXBlID0gMCwgdGVtcG9yYWxfaWQgPSA4LCBsYXllcl9pZCA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdS0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IEgyNjVSYXdOQUxVbml0SGVhZGVyICpuYWwgPSBhdS0+dW5pdHNbaV0uY29udGVudDsKKyAgICAgICAgICAgICAgICBpZiAoIW5hbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG5hbC0+bnVoX3RlbXBvcmFsX2lkX3BsdXMxIDwgdGVtcG9yYWxfaWQgKyAxKQorICAgICAgICAgICAgICAgICAgICB0ZW1wb3JhbF9pZCA9IG5hbC0+bnVoX3RlbXBvcmFsX2lkX3BsdXMxIC0gMTsKKworICAgICAgICAgICAgICAgIGlmIChhdS0+dW5pdHNbaV0udHlwZSA8PSBIRVZDX05BTF9SU1ZfVkNMMzEpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NVJhd1NsaWNlICpzbGljZSA9IGF1LT51bml0c1tpXS5jb250ZW50OworICAgICAgICAgICAgICAgICAgICBsYXllcl9pZCA9IG5hbC0+bnVoX2xheWVyX2lkOworICAgICAgICAgICAgICAgICAgICBpZiAoc2xpY2UtPmhlYWRlci5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGljX3R5cGUgPCAyKQorICAgICAgICAgICAgICAgICAgICAgICAgcGljX3R5cGUgPSAyOworICAgICAgICAgICAgICAgICAgICBpZiAoc2xpY2UtPmhlYWRlci5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfUCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcGljX3R5cGUgPCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgcGljX3R5cGUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXVkLT5uYWxfdW5pdF9oZWFkZXIgPSAoSDI2NVJhd05BTFVuaXRIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICAubmFsX3VuaXRfdHlwZSAgICAgICAgID0gSEVWQ19OQUxfQVVELAorICAgICAgICAgICAgICAgIC5udWhfbGF5ZXJfaWQgICAgICAgICAgPSBsYXllcl9pZCwKKyAgICAgICAgICAgICAgICAubnVoX3RlbXBvcmFsX2lkX3BsdXMxID0gdGVtcG9yYWxfaWQgKyAxLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGF1ZC0+cGljX3R5cGUgPSBwaWNfdHlwZTsKKworICAgICAgICAgICAgZXJyID0gZmZfY2JzX2luc2VydF91bml0X2NvbnRlbnQoY3R4LT5jYmMsIGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgSEVWQ19OQUxfQVVELCBhdWQsIE5VTEwpOworICAgICAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbnNlcnQgQVVELlxuIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGF1LT5uYl91bml0czsgaSsrKSB7CisgICAgICAgIGlmIChhdS0+dW5pdHNbaV0udHlwZSA9PSBIRVZDX05BTF9WUFMpIHsKKyAgICAgICAgICAgIGVyciA9IGgyNjVfbWV0YWRhdGFfdXBkYXRlX3Zwcyhic2YsIGF1LT51bml0c1tpXS5jb250ZW50KTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXUtPnVuaXRzW2ldLnR5cGUgPT0gSEVWQ19OQUxfU1BTKSB7CisgICAgICAgICAgICBlcnIgPSBoMjY1X21ldGFkYXRhX3VwZGF0ZV9zcHMoYnNmLCBhdS0+dW5pdHNbaV0uY29udGVudCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBmZl9jYnNfd3JpdGVfcGFja2V0KGN0eC0+Y2JjLCBvdXQsIGF1KTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgcGFja2V0LlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9wYWNrZXRfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXJyID0gMDsKK2ZhaWw6CisgICAgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChjdHgtPmNiYywgYXUpOworCisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGgyNjVfbWV0YWRhdGFfaW5pdChBVkJTRkNvbnRleHQgKmJzZikKK3sKKyAgICBIMjY1TWV0YWRhdGFDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICphdSA9ICZjdHgtPmFjY2Vzc191bml0OworICAgIGludCBlcnIsIGk7CisKKyAgICBlcnIgPSBmZl9jYnNfaW5pdCgmY3R4LT5jYmMsIEFWX0NPREVDX0lEX0hFVkMsIGJzZik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAoYnNmLT5wYXJfaW4tPmV4dHJhZGF0YSkgeworICAgICAgICBlcnIgPSBmZl9jYnNfcmVhZF9leHRyYWRhdGEoY3R4LT5jYmMsIGF1LCBic2YtPnBhcl9pbik7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdS0+bmJfdW5pdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKGF1LT51bml0c1tpXS50eXBlID09IEhFVkNfTkFMX1ZQUykgeworICAgICAgICAgICAgICAgIGVyciA9IGgyNjVfbWV0YWRhdGFfdXBkYXRlX3Zwcyhic2YsIGF1LT51bml0c1tpXS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF1LT51bml0c1tpXS50eXBlID09IEhFVkNfTkFMX1NQUykgeworICAgICAgICAgICAgICAgIGVyciA9IGgyNjVfbWV0YWRhdGFfdXBkYXRlX3Nwcyhic2YsIGF1LT51bml0c1tpXS5jb250ZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZmZfY2JzX3dyaXRlX2V4dHJhZGF0YShjdHgtPmNiYywgYnNmLT5wYXJfb3V0LCBhdSk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgZXh0cmFkYXRhLlxuIik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSAwOworZmFpbDoKKyAgICBmZl9jYnNfZnJhZ21lbnRfdW5pbml0KGN0eC0+Y2JjLCBhdSk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgaDI2NV9tZXRhZGF0YV9jbG9zZShBVkJTRkNvbnRleHQgKmJzZikKK3sKKyAgICBIMjY1TWV0YWRhdGFDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBmZl9jYnNfY2xvc2UoJmN0eC0+Y2JjKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSDI2NU1ldGFkYXRhQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0JTRl9QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBoMjY1X21ldGFkYXRhX29wdGlvbnNbXSA9IHsKKyAgICB7ICJhdWQiLCAiQWNjZXNzIFVuaXQgRGVsaW1pdGVyIE5BTCB1bml0cyIsCisgICAgICAgIE9GRlNFVChhdWQpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IFBBU1MgfSwgUEFTUywgUkVNT1ZFLCBGTEFHUywgImF1ZCIgfSwKKyAgICB7ICJwYXNzIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwKKyAgICAgICAgeyAuaTY0ID0gUEFTUyAgIH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJhdWQiIH0sCisgICAgeyAiaW5zZXJ0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsCisgICAgICAgIHsgLmk2NCA9IElOU0VSVCB9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiYXVkIiB9LAorICAgIHsgInJlbW92ZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULAorICAgICAgICB7IC5pNjQgPSBSRU1PVkUgfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImF1ZCIgfSwKKworICAgIHsgInNhbXBsZV9hc3BlY3RfcmF0aW8iLCAiU2V0IHNhbXBsZSBhc3BlY3QgcmF0aW8gKHRhYmxlIEUtMSkiLAorICAgICAgICBPRkZTRVQoc2FtcGxlX2FzcGVjdF9yYXRpbyksIEFWX09QVF9UWVBFX1JBVElPTkFMLAorICAgICAgICB7IC5kYmwgPSAwLjAgfSwgMCwgNjU1MzUsIEZMQUdTIH0sCisKKyAgICB7ICJ2aWRlb19mb3JtYXQiLCAiU2V0IHZpZGVvIGZvcm1hdCAodGFibGUgRS0yKSIsCisgICAgICAgIE9GRlNFVCh2aWRlb19mb3JtYXQpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCA3LCBGTEFHUyB9LAorICAgIHsgInZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyIsICJTZXQgdmlkZW8gZnVsbCByYW5nZSBmbGFnIiwKKyAgICAgICAgT0ZGU0VUKHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIEZMQUdTIH0sCisgICAgeyAiY29sb3VyX3ByaW1hcmllcyIsICJTZXQgY29sb3VyIHByaW1hcmllcyAodGFibGUgRS0zKSIsCisgICAgICAgIE9GRlNFVChjb2xvdXJfcHJpbWFyaWVzKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMjU1LCBGTEFHUyB9LAorICAgIHsgInRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyIsICJTZXQgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzICh0YWJsZSBFLTQpIiwKKyAgICAgICAgT0ZGU0VUKHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDI1NSwgRkxBR1MgfSwKKyAgICB7ICJtYXRyaXhfY29lZmZpY2llbnRzIiwgIlNldCBtYXRyaXggY29lZmZpY2llbnRzICh0YWJsZSBFLTUpIiwKKyAgICAgICAgT0ZGU0VUKG1hdHJpeF9jb2VmZmljaWVudHMpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAyNTUsIEZMQUdTIH0sCisKKyAgICB7ICJjaHJvbWFfc2FtcGxlX2xvY190eXBlIiwgIlNldCBjaHJvbWEgc2FtcGxlIGxvY2F0aW9uIHR5cGUgKGZpZ3VyZSBFLTEpIiwKKyAgICAgICAgT0ZGU0VUKGNocm9tYV9zYW1wbGVfbG9jX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCA2LCBGTEFHUyB9LAorCisgICAgeyAidGlja19yYXRlIiwKKyAgICAgICAgIlNldCBWUFMgYW5kIFZVSSB0aWNrIHJhdGUgKG51bV91bml0c19pbl90aWNrIC8gdGltZV9zY2FsZSkiLAorICAgICAgICBPRkZTRVQodGlja19yYXRlKSwgQVZfT1BUX1RZUEVfUkFUSU9OQUwsCisgICAgICAgIHsgLmRibCA9IDAuMCB9LCAwLCBVSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJudW1fdGlja3NfcG9jX2RpZmZfb25lIiwKKyAgICAgICAgIlNldCBWUFMgYW5kIFZVSSBudW1iZXIgb2YgdGlja3MgcGVyIFBPQyBpbmNyZW1lbnQiLAorICAgICAgICBPRkZTRVQobnVtX3RpY2tzX3BvY19kaWZmX29uZSksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIEZMQUdTIH0sCisKKyAgICB7ICJjcm9wX2xlZnQiLCAiU2V0IGxlZnQgYm9yZGVyIGNyb3Agb2Zmc2V0IiwKKyAgICAgICAgT0ZGU0VUKGNyb3BfbGVmdCksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIEhFVkNfTUFYX1dJRFRILCBGTEFHUyB9LAorICAgIHsgImNyb3BfcmlnaHQiLCAiU2V0IHJpZ2h0IGJvcmRlciBjcm9wIG9mZnNldCIsCisgICAgICAgIE9GRlNFVChjcm9wX3JpZ2h0KSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgSEVWQ19NQVhfV0lEVEgsIEZMQUdTIH0sCisgICAgeyAiY3JvcF90b3AiLCAiU2V0IHRvcCBib3JkZXIgY3JvcCBvZmZzZXQiLAorICAgICAgICBPRkZTRVQoY3JvcF90b3ApLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBIRVZDX01BWF9IRUlHSFQsIEZMQUdTIH0sCisgICAgeyAiY3JvcF9ib3R0b20iLCAiU2V0IGJvdHRvbSBib3JkZXIgY3JvcCBvZmZzZXQiLAorICAgICAgICBPRkZTRVQoY3JvcF9ib3R0b20pLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBIRVZDX01BWF9IRUlHSFQsIEZMQUdTIH0sCisKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaDI2NV9tZXRhZGF0YV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJoMjY1X21ldGFkYXRhX2JzZiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGgyNjVfbWV0YWRhdGFfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWQ29kZWNJRCBoMjY1X21ldGFkYXRhX2NvZGVjX2lkc1tdID0geworICAgIEFWX0NPREVDX0lEX0hFVkMsIEFWX0NPREVDX0lEX05PTkUsCit9OworCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9oZXZjX21ldGFkYXRhX2JzZiA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaGV2Y19tZXRhZGF0YSIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEgyNjVNZXRhZGF0YUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZoMjY1X21ldGFkYXRhX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgICA9ICZoMjY1X21ldGFkYXRhX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gJmgyNjVfbWV0YWRhdGFfY2xvc2UsCisgICAgLmZpbHRlciAgICAgICAgID0gJmgyNjVfbWV0YWRhdGFfZmlsdGVyLAorICAgIC5jb2RlY19pZHMgICAgICA9IGgyNjVfbWV0YWRhdGFfY29kZWNfaWRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGFwLmMgYi9saWJhdmNvZGVjL2hhcC5jCmluZGV4IDViM2FmNWUuLjFhMzMwYzkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaGFwLmMKKysrIGIvbGliYXZjb2RlYy9oYXAuYwpAQCAtNTMsMyArNTMsMjUgQEAKICAgICBhdl9mcmVlcCgmY3R4LT5jaHVua3MpOwogICAgIGF2X2ZyZWVwKCZjdHgtPmNodW5rX3Jlc3VsdHMpOwogfQorCitpbnQgZmZfaGFwX3BhcnNlX3NlY3Rpb25faGVhZGVyKEdldEJ5dGVDb250ZXh0ICpnYmMsIGludCAqc2VjdGlvbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEhhcFNlY3Rpb25UeXBlICpzZWN0aW9uX3R5cGUpCit7CisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiYykgPCA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICpzZWN0aW9uX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfbGUyNChnYmMpOworICAgICpzZWN0aW9uX3R5cGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYmMpOworCisgICAgaWYgKCpzZWN0aW9uX3NpemUgPT0gMCkgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2JjKSA8IDQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAqc2VjdGlvbl9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2JjKTsKKyAgICB9CisKKyAgICBpZiAoKnNlY3Rpb25fc2l6ZSA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiYykgfHwgKnNlY3Rpb25fc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hhcC5oIGIvbGliYXZjb2RlYy9oYXAuaAppbmRleCBlNDc2MmVlLi5iYmVlZDExIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hhcC5oCisrKyBiL2xpYmF2Y29kZWMvaGFwLmgKQEAgLTM0LDYgKzM0LDcgQEAKICAgICBIQVBfRk1UX1JHQkRYVDEgICA9IDB4MEIsCiAgICAgSEFQX0ZNVF9SR0JBRFhUNSAgPSAweDBFLAogICAgIEhBUF9GTVRfWUNPQ0dEWFQ1ID0gMHgwRiwKKyAgICBIQVBfRk1UX1JHVEMxICAgICA9IDB4MDEsCiB9OwogCiBlbnVtIEhhcENvbXByZXNzb3IgewpAQCAtNjUsMTIgKzY2LDE0IEBACiAKICAgICBlbnVtIEhhcFRleHR1cmVGb3JtYXQgb3B0X3RleF9mbXQ7IC8qIFRleHR1cmUgdHlwZSAoZW5jb2RlciBvbmx5KSAqLwogICAgIGludCBvcHRfY2h1bmtfY291bnQ7IC8qIFVzZXItcmVxdWVzdGVkIGNodW5rIGNvdW50IChlbmNvZGVyIG9ubHkpICovCisgICAgaW50IG9wdF9jb21wcmVzc29yOyAvKiBVc2VyLXJlcXVlc3RlZCBjb21wcmVzc29yIChlbmNvZGVyIG9ubHkpICovCiAKICAgICBpbnQgY2h1bmtfY291bnQ7CiAgICAgSGFwQ2h1bmsgKmNodW5rczsKICAgICBpbnQgKmNodW5rX3Jlc3VsdHM7ICAgICAgLyogUmVzdWx0cyBmcm9tIHRocmVhZGVkIG9wZXJhdGlvbnMgKi8KIAogICAgIGludCB0ZXhfcmF0OyAgICAgICAgICAgICAvKiBDb21wcmVzc2lvbiByYXRpbyAqLworICAgIGludCB0ZXhfcmF0MjsgICAgICAgICAgICAgLyogQ29tcHJlc3Npb24gcmF0aW8gb2YgdGhlIHNlY29uZCB0ZXh0dXJlICovCiAgICAgY29uc3QgdWludDhfdCAqdGV4X2RhdGE7IC8qIENvbXByZXNzZWQgdGV4dHVyZSAqLwogICAgIHVpbnQ4X3QgKnRleF9idWY7ICAgICAgICAvKiBCdWZmZXIgZm9yIGNvbXByZXNzZWQgdGV4dHVyZSAqLwogICAgIHNpemVfdCB0ZXhfc2l6ZTsgICAgICAgICAvKiBTaXplIG9mIHRoZSBjb21wcmVzc2VkIHRleHR1cmUgKi8KQEAgLTc5LDggKzgyLDEzIEBACiAKICAgICBpbnQgc2xpY2VfY291bnQ7ICAgICAgICAgLyogTnVtYmVyIG9mIHNsaWNlcyBmb3IgdGhyZWFkZWQgb3BlcmF0aW9ucyAqLwogCisgICAgaW50IHRleHR1cmVfY291bnQ7ICAgICAgLyogMiBmb3IgSEFRQSwgMSBmb3Igb3RoZXIgdmVyc2lvbiAqLworICAgIGludCB0ZXh0dXJlX3NlY3Rpb25fc2l6ZTsgLyogc2l6ZSBvZiB0aGUgcGFydCBvZiB0aGUgdGV4dHVyZSBzZWN0aW9uIChmb3IgSEFQUUEpICovCisgICAgaW50IHVuY29tcHJlc3NfcGl4X3NpemU7IC8qIG5iIG9mIGJ5dGUgLyBwaXhlbCBmb3IgdGhlIHRhcmdldCBwaWN0dXJlICovCisKICAgICAvKiBQb2ludGVyIHRvIHRoZSBzZWxlY3RlZCBjb21wcmVzcyBvciBkZWNvbXByZXNzIGZ1bmN0aW9uICovCiAgICAgaW50ICgqdGV4X2Z1bikodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7CisgICAgaW50ICgqdGV4X2Z1bjIpKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOwogfSBIYXBDb250ZXh0OwogCiAvKgpAQCAtOTUsNCArMTAzLDEwIEBACiAgKi8KIGF2X2NvbGQgdm9pZCBmZl9oYXBfZnJlZV9jb250ZXh0KEhhcENvbnRleHQgKmN0eCk7CiAKKy8qIFRoZSBmaXJzdCB0aHJlZSBieXRlcyBhcmUgdGhlIHNpemUgb2YgdGhlIHNlY3Rpb24gcGFzdCB0aGUgaGVhZGVyLCBvciB6ZXJvCisgKiBpZiB0aGUgbGVuZ3RoIGlzIHN0b3JlZCBpbiB0aGUgbmV4dCBsb25nIHdvcmQuIFRoZSBmb3VydGggYnl0ZSBpbiB0aGUgZmlyc3QKKyAqIGxvbmcgd29yZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgc2VjdGlvbi4gKi8KK2ludCBmZl9oYXBfcGFyc2Vfc2VjdGlvbl9oZWFkZXIoR2V0Qnl0ZUNvbnRleHQgKmdiYywgaW50ICpzZWN0aW9uX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gSGFwU2VjdGlvblR5cGUgKnNlY3Rpb25fdHlwZSk7CisKICNlbmRpZiAvKiBBVkNPREVDX0hBUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hhcGRlYy5jIGIvbGliYXZjb2RlYy9oYXBkZWMuYwppbmRleCA1YTM5OWRjLi44Yzg0NTc3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hhcGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvaGFwZGVjLmMKQEAgLTMsNiArMyw4IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVml0dG9yaW8gR2lvdmFyYSA8dml0dG9yaW8uZ2lvdmFyYUBnbWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVG9tIEJ1dHRlcndvcnRoIDxiYW5nbm9pc2VAZ21haWwuY29tPgogICoKKyAqIEhhcFFBIGFuZCBIQVBBbHBoYU9ubHkgYWRkZWQgYnkgSm9reW8gSW1hZ2VzCisgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKICAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTI0LDcgKzI2LDcgQEAKICAqIEBmaWxlCiAgKiBIYXAgZGVjb2RlcgogICoKLSAqIEZvdXJjYzogSGFwMSwgSGFwNSwgSGFwWQorICogRm91cmNjOiBIYXAxLCBIYXA1LCBIYXBZLCBIYXBBLCBIYXBNCiAgKgogICogaHR0cHM6Ly9naXRodWIuY29tL1ZpZHZveC9oYXAvYmxvYi9tYXN0ZXIvZG9jdW1lbnRhdGlvbi9IYXBWaWRlb0RSQUZULm1kCiAgKi8KQEAgLTM3LDM2ICszOSwxMCBAQAogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJoYXAuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgIm1lbW9yeS5oIgogI2luY2x1ZGUgInNuYXBweS5oIgogI2luY2x1ZGUgInRleHR1cmVkc3AuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKIAotLyogVGhlIGZpcnN0IHRocmVlIGJ5dGVzIGFyZSB0aGUgc2l6ZSBvZiB0aGUgc2VjdGlvbiBwYXN0IHRoZSBoZWFkZXIsIG9yIHplcm8KLSAqIGlmIHRoZSBsZW5ndGggaXMgc3RvcmVkIGluIHRoZSBuZXh0IGxvbmcgd29yZC4gVGhlIGZvdXJ0aCBieXRlIGluIHRoZSBmaXJzdAotICogbG9uZyB3b3JkIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUgY3VycmVudCBzZWN0aW9uLiAqLwotc3RhdGljIGludCBwYXJzZV9zZWN0aW9uX2hlYWRlcihHZXRCeXRlQ29udGV4dCAqZ2JjLCBpbnQgKnNlY3Rpb25fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBIYXBTZWN0aW9uVHlwZSAqc2VjdGlvbl90eXBlKQotewotICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYmMpIDwgNCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0KLSAgICAqc2VjdGlvbl9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMjQoZ2JjKTsKLSAgICAqc2VjdGlvbl90eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2JjKTsKLQotICAgIGlmICgqc2VjdGlvbl9zaXplID09IDApIHsKLSAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiYykgPCA0KQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0KLSAgICAgICAgKnNlY3Rpb25fc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKGdiYyk7Ci0gICAgfQotCi0gICAgaWYgKCpzZWN0aW9uX3NpemUgPiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYmMpIHx8ICpzZWN0aW9uX3NpemUgPCAwKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGhhcF9wYXJzZV9kZWNvZGVfaW5zdHJ1Y3Rpb25zKEhhcENvbnRleHQgKmN0eCwgaW50IHNpemUpCiB7CiAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiYyA9ICZjdHgtPmdiYzsKQEAgLTc3LDcgKzUzLDcgQEAKIAogICAgIHdoaWxlIChzaXplID4gMCkgewogICAgICAgICBpbnQgc3RyZWFtX3JlbWFpbmluZyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiYyk7Ci0gICAgICAgIHJldCA9IHBhcnNlX3NlY3Rpb25faGVhZGVyKGdiYywgJnNlY3Rpb25fc2l6ZSwgJnNlY3Rpb25fdHlwZSk7CisgICAgICAgIHJldCA9IGZmX2hhcF9wYXJzZV9zZWN0aW9uX2hlYWRlcihnYmMsICZzZWN0aW9uX3NpemUsICZzZWN0aW9uX3R5cGUpOwogICAgICAgICBpZiAocmV0ICE9IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCkBAIC0xNTgsMTMgKzEzNCwxNiBAQAogICAgIGNvbnN0IGNoYXIgKmNvbXByZXNzb3JzdHI7CiAgICAgaW50IGksIHJldDsKIAotICAgIHJldCA9IHBhcnNlX3NlY3Rpb25faGVhZGVyKGdiYywgJnNlY3Rpb25fc2l6ZSwgJnNlY3Rpb25fdHlwZSk7CisgICAgcmV0ID0gZmZfaGFwX3BhcnNlX3NlY3Rpb25faGVhZGVyKGdiYywgJmN0eC0+dGV4dHVyZV9zZWN0aW9uX3NpemUsICZzZWN0aW9uX3R5cGUpOwogICAgIGlmIChyZXQgIT0gMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmICgoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnSCcsJ2EnLCdwJywnMScpICYmIChzZWN0aW9uX3R5cGUgJiAweDBGKSAhPSBIQVBfRk1UX1JHQkRYVDEpIHx8CiAgICAgICAgIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdIJywnYScsJ3AnLCc1JykgJiYgKHNlY3Rpb25fdHlwZSAmIDB4MEYpICE9IEhBUF9GTVRfUkdCQURYVDUpIHx8Ci0gICAgICAgIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdIJywnYScsJ3AnLCdZJykgJiYgKHNlY3Rpb25fdHlwZSAmIDB4MEYpICE9IEhBUF9GTVRfWUNPQ0dEWFQ1KSkgeworICAgICAgICAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnSCcsJ2EnLCdwJywnWScpICYmIChzZWN0aW9uX3R5cGUgJiAweDBGKSAhPSBIQVBfRk1UX1lDT0NHRFhUNSkgfHwKKyAgICAgICAgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0gnLCdhJywncCcsJ0EnKSAmJiAoc2VjdGlvbl90eXBlICYgMHgwRikgIT0gSEFQX0ZNVF9SR1RDMSkgfHwKKyAgICAgICAgKChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdIJywnYScsJ3AnLCdNJykgJiYgKHNlY3Rpb25fdHlwZSAmIDB4MEYpICE9IEhBUF9GTVRfUkdUQzEpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWN0aW9uX3R5cGUgJiAweDBGKSAhPSBIQVBfRk1UX1lDT0NHRFhUNSkpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiSW52YWxpZCB0ZXh0dXJlIGZvcm1hdCAlIzA0eC5cbiIsIHNlY3Rpb25fdHlwZSAmIDB4MEYpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTE3Nyw3ICsxNTYsNyBAQAogICAgICAgICAgICAgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY3R4LT5jaHVua3NbMF0uY29tcHJlc3NvciA9IHNlY3Rpb25fdHlwZSAmIDB4RjA7CiAgICAgICAgICAgICAgICAgY3R4LT5jaHVua3NbMF0uY29tcHJlc3NlZF9vZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIGN0eC0+Y2h1bmtzWzBdLmNvbXByZXNzZWRfc2l6ZSA9IHNlY3Rpb25fc2l6ZTsKKyAgICAgICAgICAgICAgICBjdHgtPmNodW5rc1swXS5jb21wcmVzc2VkX3NpemUgPSBjdHgtPnRleHR1cmVfc2VjdGlvbl9zaXplOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGN0eC0+Y2h1bmtzWzBdLmNvbXByZXNzb3IgPT0gSEFQX0NPTVBfTk9ORSkgewogICAgICAgICAgICAgICAgIGNvbXByZXNzb3JzdHIgPSAibm9uZSI7CkBAIC0xODYsNyArMTY1LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEhBUF9DT01QX0NPTVBMRVg6Ci0gICAgICAgICAgICByZXQgPSBwYXJzZV9zZWN0aW9uX2hlYWRlcihnYmMsICZzZWN0aW9uX3NpemUsICZzZWN0aW9uX3R5cGUpOworICAgICAgICAgICAgcmV0ID0gZmZfaGFwX3BhcnNlX3NlY3Rpb25faGVhZGVyKGdiYywgJnNlY3Rpb25fc2l6ZSwgJnNlY3Rpb25fdHlwZSk7CiAgICAgICAgICAgICBpZiAocmV0ID09IDAgJiYgc2VjdGlvbl90eXBlICE9IEhBUF9TVF9ERUNPREVfSU5TVFJVQ1RJT05TKQogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBpZiAocmV0ID09IDApCkBAIC0yNjYsOCArMjQ1LDggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvbXByZXNzX3RleHR1cmVfdGhyZWFkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZSwgaW50IHRocmVhZF9uYikKK3N0YXRpYyBpbnQgZGVjb21wcmVzc190ZXh0dXJlX3RocmVhZF9pbnRlcm5hbChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xpY2UsIGludCB0aHJlYWRfbmIsIGludCB0ZXh0dXJlX251bSkKIHsKICAgICBIYXBDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFWRnJhbWUgKmZyYW1lID0gYXJnOwpAQCAtMjk1LDcwICsyNzQsMTE4IEBACiAgICAgICAgIHVpbnQ4X3QgKnAgPSBmcmFtZS0+ZGF0YVswXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMF0gKiBURVhUVVJFX0JMT0NLX0g7CiAgICAgICAgIGludCBvZmYgID0geSAqIHdfYmxvY2s7CiAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3X2Jsb2NrOyB4KyspIHsKLSAgICAgICAgICAgIGN0eC0+dGV4X2Z1bihwICsgeCAqIDE2LCBmcmFtZS0+bGluZXNpemVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZCArIChvZmYgKyB4KSAqIGN0eC0+dGV4X3JhdCk7CisgICAgICAgICAgICBpZiAodGV4dHVyZV9udW0gPT0gMCkgeworICAgICAgICAgICAgICAgIGN0eC0+dGV4X2Z1bihwICsgeCAqIDQgKiBjdHgtPnVuY29tcHJlc3NfcGl4X3NpemUsIGZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArIChvZmYgKyB4KSAqIGN0eC0+dGV4X3JhdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN0eC0+dGV4X2Z1bjIocCArIHggKiA0ICogY3R4LT51bmNvbXByZXNzX3BpeF9zaXplLCBmcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICsgKG9mZiArIHgpICogY3R4LT50ZXhfcmF0Mik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkZWNvbXByZXNzX3RleHR1cmVfdGhyZWFkKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZSwgaW50IHRocmVhZF9uYikKK3sKKyAgICByZXR1cm4gZGVjb21wcmVzc190ZXh0dXJlX3RocmVhZF9pbnRlcm5hbChhdmN0eCwgYXJnLCBzbGljZSwgdGhyZWFkX25iLCAwKTsKK30KKworc3RhdGljIGludCBkZWNvbXByZXNzX3RleHR1cmUyX3RocmVhZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNsaWNlLCBpbnQgdGhyZWFkX25iKQoreworICAgIHJldHVybiBkZWNvbXByZXNzX3RleHR1cmVfdGhyZWFkX2ludGVybmFsKGF2Y3R4LCBhcmcsIHNsaWNlLCB0aHJlYWRfbmIsIDEpOworfQorCiBzdGF0aWMgaW50IGhhcF9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCiB7CiAgICAgSGFwQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBUaHJlYWRGcmFtZSB0ZnJhbWU7Ci0gICAgaW50IHJldCwgaTsKKyAgICBpbnQgcmV0LCBpLCB0OwogICAgIGludCB0ZXhfc2l6ZTsKKyAgICBpbnQgc2VjdGlvbl9zaXplOworICAgIGVudW0gSGFwU2VjdGlvblR5cGUgc2VjdGlvbl90eXBlOworICAgIGludCBzdGFydF90ZXh0dXJlX3NlY3Rpb24gPSAwOworICAgIGludCB0ZXhfcmF0WzJdID0gezAsIDB9OwogCiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmY3R4LT5nYmMsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CiAKLSAgICAvKiBDaGVjayBmb3Igc2VjdGlvbiBoZWFkZXIgKi8KLSAgICByZXQgPSBoYXBfcGFyc2VfZnJhbWVfaGVhZGVyKGF2Y3R4KTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICB0ZXhfcmF0WzBdID0gY3R4LT50ZXhfcmF0OworCisgICAgLyogY2hlY2sgZm9yIG11bHRpIHRleHR1cmUgaGVhZGVyICovCisgICAgaWYgKGN0eC0+dGV4dHVyZV9jb3VudCA9PSAyKSB7CisgICAgICAgIHJldCA9IGZmX2hhcF9wYXJzZV9zZWN0aW9uX2hlYWRlcigmY3R4LT5nYmMsICZzZWN0aW9uX3NpemUsICZzZWN0aW9uX3R5cGUpOworICAgICAgICBpZiAocmV0ICE9IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHNlY3Rpb25fdHlwZSAmIDB4MEYpICE9IDB4MEQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzZWN0aW9uIHR5cGUgaW4gMiB0ZXh0dXJlcyBtb2RlICUjMDR4LlxuIiwgc2VjdGlvbl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHN0YXJ0X3RleHR1cmVfc2VjdGlvbiA9IDQ7CisgICAgICAgIHRleF9yYXRbMV0gPSBjdHgtPnRleF9yYXQyOworICAgIH0KIAogICAgIC8qIEdldCB0aGUgb3V0cHV0IGZyYW1lIHJlYWR5IHRvIHJlY2VpdmUgZGF0YSAqLwogICAgIHRmcmFtZS5mID0gZGF0YTsKICAgICByZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJnRmcmFtZSwgMCk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgaWYgKGF2Y3R4LT5jb2RlYy0+dXBkYXRlX3RocmVhZF9jb250ZXh0KQotICAgICAgICBmZl90aHJlYWRfZmluaXNoX3NldHVwKGF2Y3R4KTsKIAotICAgIC8qIFVucGFjayB0aGUgRFhUIHRleHR1cmUgKi8KLSAgICBpZiAoaGFwX2Nhbl91c2VfdGV4X2luX3BsYWNlKGN0eCkpIHsKLSAgICAgICAgLyogT25seSBEWFRDIHRleHR1cmUgY29tcHJlc3Npb24gaW4gYSBjb250aWd1b3VzIGJsb2NrICovCi0gICAgICAgIGN0eC0+dGV4X2RhdGEgPSBjdHgtPmdiYy5idWZmZXI7Ci0gICAgICAgIHRleF9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmN0eC0+Z2JjKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvKiBQZXJmb3JtIHRoZSBzZWNvbmQtc3RhZ2UgZGVjb21wcmVzc2lvbiAqLwotICAgICAgICByZXQgPSBhdl9yZWFsbG9jcCgmY3R4LT50ZXhfYnVmLCBjdHgtPnRleF9zaXplKTsKKyAgICBmb3IgKHQgPSAwOyB0IDwgY3R4LT50ZXh0dXJlX2NvdW50OyB0KyspIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2VlaygmY3R4LT5nYmMsIHN0YXJ0X3RleHR1cmVfc2VjdGlvbiwgU0VFS19TRVQpOworCisgICAgICAgIC8qIENoZWNrIGZvciBzZWN0aW9uIGhlYWRlciAqLworICAgICAgICByZXQgPSBoYXBfcGFyc2VfZnJhbWVfaGVhZGVyKGF2Y3R4KTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgZGVjb21wcmVzc19jaHVua3NfdGhyZWFkLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jaHVua19yZXN1bHRzLCBjdHgtPmNodW5rX2NvdW50KTsKKyAgICAgICAgc3RhcnRfdGV4dHVyZV9zZWN0aW9uICs9IGN0eC0+dGV4dHVyZV9zZWN0aW9uX3NpemUgKyA0OwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmNodW5rX2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChjdHgtPmNodW5rX3Jlc3VsdHNbaV0gPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBjdHgtPmNodW5rX3Jlc3VsdHNbaV07CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPnVwZGF0ZV90aHJlYWRfY29udGV4dCkKKyAgICAgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOworCisgICAgICAgIC8qIFVucGFjayB0aGUgRFhUIHRleHR1cmUgKi8KKyAgICAgICAgaWYgKGhhcF9jYW5fdXNlX3RleF9pbl9wbGFjZShjdHgpKSB7CisgICAgICAgICAgICAvKiBPbmx5IERYVEMgdGV4dHVyZSBjb21wcmVzc2lvbiBpbiBhIGNvbnRpZ3VvdXMgYmxvY2sgKi8KKyAgICAgICAgICAgIGN0eC0+dGV4X2RhdGEgPSBjdHgtPmdiYy5idWZmZXI7CisgICAgICAgICAgICB0ZXhfc2l6ZSA9IEZGTUlOKGN0eC0+dGV4dHVyZV9zZWN0aW9uX3NpemUsIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiYykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogUGVyZm9ybSB0aGUgc2Vjb25kLXN0YWdlIGRlY29tcHJlc3Npb24gKi8KKyAgICAgICAgICAgIHJldCA9IGF2X3JlYWxsb2NwKCZjdHgtPnRleF9idWYsIGN0eC0+dGV4X3NpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgYXZjdHgtPmV4ZWN1dGUyKGF2Y3R4LCBkZWNvbXByZXNzX2NodW5rc190aHJlYWQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jaHVua19yZXN1bHRzLCBjdHgtPmNodW5rX2NvdW50KTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+Y2h1bmtfY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChjdHgtPmNodW5rX3Jlc3VsdHNbaV0gPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3R4LT5jaHVua19yZXN1bHRzW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdHgtPnRleF9kYXRhID0gY3R4LT50ZXhfYnVmOworICAgICAgICAgICAgdGV4X3NpemUgPSBjdHgtPnRleF9zaXplOwogICAgICAgICB9CiAKLSAgICAgICAgY3R4LT50ZXhfZGF0YSA9IGN0eC0+dGV4X2J1ZjsKLSAgICAgICAgdGV4X3NpemUgPSBjdHgtPnRleF9zaXplOwotICAgIH0KKyAgICAgICAgaWYgKHRleF9zaXplIDwgKGF2Y3R4LT5jb2RlZF93aWR0aCAgLyBURVhUVVJFX0JMT0NLX1cpCisgICAgICAgICAgICAqKGF2Y3R4LT5jb2RlZF9oZWlnaHQgLyBURVhUVVJFX0JMT0NLX0gpCisgICAgICAgICAgICAqdGV4X3JhdFt0XSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgZGF0YVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogCi0gICAgaWYgKHRleF9zaXplIDwgKGF2Y3R4LT5jb2RlZF93aWR0aCAgLyBURVhUVVJFX0JMT0NLX1cpCi0gICAgICAgICAgICAgICAgICAqKGF2Y3R4LT5jb2RlZF9oZWlnaHQgLyBURVhUVVJFX0JMT0NLX0gpCi0gICAgICAgICAgICAgICAgICAqY3R4LT50ZXhfcmF0KSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGRhdGFcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgLyogVXNlIHRoZSBkZWNvbXByZXNzIGZ1bmN0aW9uIG9uIHRoZSB0ZXh0dXJlLCBvbmUgYmxvY2sgcGVyIHRocmVhZCAqLworICAgICAgICBpZiAodCA9PSAwKXsKKyAgICAgICAgICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgZGVjb21wcmVzc190ZXh0dXJlX3RocmVhZCwgdGZyYW1lLmYsIE5VTEwsIGN0eC0+c2xpY2VfY291bnQpOworICAgICAgICB9IGVsc2V7CisgICAgICAgICAgICB0ZnJhbWUuZiA9IGRhdGE7CisgICAgICAgICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIGRlY29tcHJlc3NfdGV4dHVyZTJfdGhyZWFkLCB0ZnJhbWUuZiwgTlVMTCwgY3R4LT5zbGljZV9jb3VudCk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICAvKiBVc2UgdGhlIGRlY29tcHJlc3MgZnVuY3Rpb24gb24gdGhlIHRleHR1cmUsIG9uZSBibG9jayBwZXIgdGhyZWFkICovCi0gICAgYXZjdHgtPmV4ZWN1dGUyKGF2Y3R4LCBkZWNvbXByZXNzX3RleHR1cmVfdGhyZWFkLCB0ZnJhbWUuZiwgTlVMTCwgY3R4LT5zbGljZV9jb3VudCk7Ci0KICAgICAvKiBGcmFtZSBpcyByZWFkeSB0byBiZSBvdXRwdXQgKi8KICAgICB0ZnJhbWUuZi0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CiAgICAgdGZyYW1lLmYtPmtleV9mcmFtZSA9IDE7CkBAIC0zODUsNiArNDEyLDkgQEAKIAogICAgIGZmX3RleHR1cmVkc3BfaW5pdCgmY3R4LT5keHRjKTsKIAorICAgIGN0eC0+dGV4dHVyZV9jb3VudCAgPSAxOworICAgIGN0eC0+dW5jb21wcmVzc19waXhfc2l6ZSA9IDQ7CisKICAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY190YWcpIHsKICAgICBjYXNlIE1LVEFHKCdIJywnYScsJ3AnLCcxJyk6CiAgICAgICAgIHRleHR1cmVfbmFtZSA9ICJEWFQxIjsKQEAgLTQwNCw2ICs0MzQsMjIgQEAKICAgICAgICAgY3R4LT50ZXhfZnVuID0gY3R4LT5keHRjLmR4dDV5c19ibG9jazsKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjA7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ0gnLCdhJywncCcsJ0EnKToKKyAgICAgICAgdGV4dHVyZV9uYW1lID0gIlJHVEMxIjsKKyAgICAgICAgY3R4LT50ZXhfcmF0ID0gODsKKyAgICAgICAgY3R4LT50ZXhfZnVuID0gY3R4LT5keHRjLnJndGMxdV9ncmF5X2Jsb2NrOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CisgICAgICAgIGN0eC0+dW5jb21wcmVzc19waXhfc2l6ZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ0gnLCdhJywncCcsJ00nKToKKyAgICAgICAgdGV4dHVyZV9uYW1lICA9ICJEWFQ1LVlDb0NnLXNjYWxlZCAvIFJHVEMxIjsKKyAgICAgICAgY3R4LT50ZXhfcmF0ICA9IDE2OworICAgICAgICBjdHgtPnRleF9yYXQyID0gODsKKyAgICAgICAgY3R4LT50ZXhfZnVuICA9IGN0eC0+ZHh0Yy5keHQ1eXNfYmxvY2s7CisgICAgICAgIGN0eC0+dGV4X2Z1bjIgPSBjdHgtPmR4dGMucmd0YzF1X2FscGhhX2Jsb2NrOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCQTsKKyAgICAgICAgY3R4LT50ZXh0dXJlX2NvdW50ID0gMjsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEFWRVJST1JfREVDT0RFUl9OT1RfRk9VTkQ7CiAgICAgfQpAQCAtNDI3LDcgKzQ3Myw3IEBACiAKIEFWQ29kZWMgZmZfaGFwX2RlY29kZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImhhcCIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZpZHZveCBIYXAgZGVjb2RlciIpLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWaWR2b3ggSGFwIiksCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0hBUCwKICAgICAuaW5pdCAgICAgICAgICAgPSBoYXBfaW5pdCwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGFwZW5jLmMgYi9saWJhdmNvZGVjL2hhcGVuYy5jCmluZGV4IGNiNWRjZmEuLjNhMWJjODcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaGFwZW5jLmMKKysrIGIvbGliYXZjb2RlYy9oYXBlbmMuYwpAQCAtNTIsMTIgKzUyLDE0IEBACiAgICAgSEFQX0hEUl9MT05HID0gOCwKIH07CiAKLXN0YXRpYyB2b2lkIGNvbXByZXNzX3RleHR1cmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpmKQorc3RhdGljIGludCBjb21wcmVzc190ZXh0dXJlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDhfdCAqb3V0LCBpbnQgb3V0X2xlbmd0aCwgY29uc3QgQVZGcmFtZSAqZikKIHsKICAgICBIYXBDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIHVpbnQ4X3QgKm91dCA9IGN0eC0+dGV4X2J1ZjsKICAgICBpbnQgaSwgajsKIAorICAgIGlmIChjdHgtPnRleF9zaXplID4gb3V0X2xlbmd0aCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKwogICAgIGZvciAoaiA9IDA7IGogPCBhdmN0eC0+aGVpZ2h0OyBqICs9IDQpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT53aWR0aDsgaSArPSA0KSB7CiAgICAgICAgICAgICB1aW50OF90ICpwID0gZi0+ZGF0YVswXSArIGkgKiA0ICsgaiAqIGYtPmxpbmVzaXplWzBdOwpAQCAtNjUsNiArNjcsOCBAQAogICAgICAgICAgICAgb3V0ICs9IHN0ZXA7CiAgICAgICAgIH0KICAgICB9CisKKyAgICByZXR1cm4gMDsKIH0KIAogLyogc2VjdGlvbl9sZW5ndGggZG9lcyBub3QgaW5jbHVkZSB0aGUgaGVhZGVyICovCkBAIC0xMTgsNyArMTIyLDcgQEAKICAgICAgICAgLyogSWYgdGhlcmUgaXMgbm8gZ2FpbiBmcm9tIHNuYXBweSwganVzdCB1c2UgdGhlIHJhdyB0ZXh0dXJlLiAqLwogICAgICAgICBpZiAoY2h1bmstPmNvbXByZXNzZWRfc2l6ZSA+PSBjaHVuay0+dW5jb21wcmVzc2VkX3NpemUpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCi0gICAgICAgICAgICAgICAgICAgIlNuYXBweSBidWZmZXIgYmlnZ2VyIHRoYW4gdW5jb21wcmVzc2VkICglbHUgPj0gJWx1IGJ5dGVzKS5cbiIsCisgICAgICAgICAgICAgICAgICAgIlNuYXBweSBidWZmZXIgYmlnZ2VyIHRoYW4gdW5jb21wcmVzc2VkICglIlNJWkVfU1BFQ0lGSUVSIiA+PSAlIlNJWkVfU1BFQ0lGSUVSIiBieXRlcykuXG4iLAogICAgICAgICAgICAgICAgICAgIGNodW5rLT5jb21wcmVzc2VkX3NpemUsIGNodW5rLT51bmNvbXByZXNzZWRfc2l6ZSk7CiAgICAgICAgICAgICBtZW1jcHkoY2h1bmtfZHN0LCBjaHVua19zcmMsIGNodW5rLT51bmNvbXByZXNzZWRfc2l6ZSk7CiAgICAgICAgICAgICBjaHVuay0+Y29tcHJlc3NvciA9IEhBUF9DT01QX05PTkU7CkBAIC0yMDAsMTMgKzIwNCwyNSBAQAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgLyogRFhUQyBjb21wcmVzc2lvbi4gKi8KLSAgICBjb21wcmVzc190ZXh0dXJlKGF2Y3R4LCBmcmFtZSk7CisgICAgaWYgKGN0eC0+b3B0X2NvbXByZXNzb3IgPT0gSEFQX0NPTVBfTk9ORSkgeworICAgICAgICAvKiBEWFRDIGNvbXByZXNzaW9uIGRpcmVjdGx5IHRvIHRoZSBwYWNrZXQgYnVmZmVyLiAqLworICAgICAgICByZXQgPSBjb21wcmVzc190ZXh0dXJlKGF2Y3R4LCBwa3QtPmRhdGEgKyBoZWFkZXJfbGVuZ3RoLCBwa3QtPnNpemUgLSBoZWFkZXJfbGVuZ3RoLCBmcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIC8qIENvbXByZXNzICh1c2luZyBTbmFwcHkpIHRoZSBmcmFtZSAqLwotICAgIGZpbmFsX2RhdGFfc2l6ZSA9IGhhcF9jb21wcmVzc19mcmFtZShhdmN0eCwgcGt0LT5kYXRhICsgaGVhZGVyX2xlbmd0aCk7Ci0gICAgaWYgKGZpbmFsX2RhdGFfc2l6ZSA8IDApCi0gICAgICAgIHJldHVybiBmaW5hbF9kYXRhX3NpemU7CisgICAgICAgIGN0eC0+Y2h1bmtzWzBdLmNvbXByZXNzb3IgPSBIQVBfQ09NUF9OT05FOworICAgICAgICBmaW5hbF9kYXRhX3NpemUgPSBjdHgtPnRleF9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIERYVEMgY29tcHJlc3Npb24uICovCisgICAgICAgIHJldCA9IGNvbXByZXNzX3RleHR1cmUoYXZjdHgsIGN0eC0+dGV4X2J1ZiwgY3R4LT50ZXhfc2l6ZSwgZnJhbWUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLyogQ29tcHJlc3MgKHVzaW5nIFNuYXBweSkgdGhlIGZyYW1lICovCisgICAgICAgIGZpbmFsX2RhdGFfc2l6ZSA9IGhhcF9jb21wcmVzc19mcmFtZShhdmN0eCwgcGt0LT5kYXRhICsgaGVhZGVyX2xlbmd0aCk7CisgICAgICAgIGlmIChmaW5hbF9kYXRhX3NpemUgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGZpbmFsX2RhdGFfc2l6ZTsKKyAgICB9CiAKICAgICAvKiBXcml0ZSBoZWFkZXIgYXQgdGhlIHN0YXJ0LiAqLwogICAgIGhhcF93cml0ZV9mcmFtZV9oZWFkZXIoY3R4LCBwa3QtPmRhdGEsIGZpbmFsX2RhdGFfc2l6ZSArIGhlYWRlcl9sZW5ndGgpOwpAQCAtMjY3LDEwICsyODMsMzAgQEAKICAgICBjdHgtPnRleF9zaXplICAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgIFRFWFRVUkVfQkxPQ0tfVykgKgogICAgICAgICAgICAgICAgICAgICAgIEZGQUxJR04oYXZjdHgtPmhlaWdodCwgVEVYVFVSRV9CTE9DS19IKSAqIDQgLyByYXRpbzsKIAotICAgIC8qIFJvdW5kIHRoZSBjaHVuayBjb3VudCB0byBkaXZpZGUgZXZlbmx5IG9uIERYVCBibG9jayBlZGdlcyAqLwotICAgIGNvcnJlY3RlZF9jaHVua19jb3VudCA9IGF2X2NsaXAoY3R4LT5vcHRfY2h1bmtfY291bnQsIDEsIEhBUF9NQVhfQ0hVTktTKTsKLSAgICB3aGlsZSAoKGN0eC0+dGV4X3NpemUgLyAoNjQgLyByYXRpbykpICUgY29ycmVjdGVkX2NodW5rX2NvdW50ICE9IDApIHsKLSAgICAgICAgY29ycmVjdGVkX2NodW5rX2NvdW50LS07CisgICAgc3dpdGNoIChjdHgtPm9wdF9jb21wcmVzc29yKSB7CisgICAgY2FzZSBIQVBfQ09NUF9OT05FOgorICAgICAgICAvKiBObyBiZW5lZml0IGNodW5raW5nIHVuY29tcHJlc3NlZCBkYXRhICovCisgICAgICAgIGNvcnJlY3RlZF9jaHVua19jb3VudCA9IDE7CisKKyAgICAgICAgY3R4LT5tYXhfc25hcHB5ID0gY3R4LT50ZXhfc2l6ZTsKKyAgICAgICAgY3R4LT50ZXhfYnVmID0gTlVMTDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIQVBfQ09NUF9TTkFQUFk6CisgICAgICAgIC8qIFJvdW5kIHRoZSBjaHVuayBjb3VudCB0byBkaXZpZGUgZXZlbmx5IG9uIERYVCBibG9jayBlZGdlcyAqLworICAgICAgICBjb3JyZWN0ZWRfY2h1bmtfY291bnQgPSBhdl9jbGlwKGN0eC0+b3B0X2NodW5rX2NvdW50LCAxLCBIQVBfTUFYX0NIVU5LUyk7CisgICAgICAgIHdoaWxlICgoY3R4LT50ZXhfc2l6ZSAvICg2NCAvIHJhdGlvKSkgJSBjb3JyZWN0ZWRfY2h1bmtfY291bnQgIT0gMCkgeworICAgICAgICAgICAgY29ycmVjdGVkX2NodW5rX2NvdW50LS07CisgICAgICAgIH0KKworICAgICAgICBjdHgtPm1heF9zbmFwcHkgPSBzbmFwcHlfbWF4X2NvbXByZXNzZWRfbGVuZ3RoKGN0eC0+dGV4X3NpemUgLyBjb3JyZWN0ZWRfY2h1bmtfY291bnQpOworICAgICAgICBjdHgtPnRleF9idWYgPSBhdl9tYWxsb2MoY3R4LT50ZXhfc2l6ZSk7CisgICAgICAgIGlmICghY3R4LT50ZXhfYnVmKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb21wcmVzb3IgJTAyWFxuIiwgY3R4LT5vcHRfY29tcHJlc3Nvcik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBpZiAoY29ycmVjdGVkX2NodW5rX2NvdW50ICE9IGN0eC0+b3B0X2NodW5rX2NvdW50KSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIlZCBjaHVua3MgcmVxdWVzdGVkIGJ1dCAlZCB1c2VkLlxuIiwKQEAgLTI4MCwxMiArMzE2LDYgQEAKICAgICBpZiAocmV0ICE9IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICBjdHgtPm1heF9zbmFwcHkgPSBzbmFwcHlfbWF4X2NvbXByZXNzZWRfbGVuZ3RoKGN0eC0+dGV4X3NpemUgLyBjb3JyZWN0ZWRfY2h1bmtfY291bnQpOwotCi0gICAgY3R4LT50ZXhfYnVmICA9IGF2X21hbGxvYyhjdHgtPnRleF9zaXplKTsKLSAgICBpZiAoIWN0eC0+dGV4X2J1ZikKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQogICAgIHJldHVybiAwOwogfQogCkBAIC0zMDYsNiArMzM2LDkgQEAKICAgICAgICAgeyAiaGFwX2FscGhhIiwgIkhhcCBBbHBoYSAoRFhUNSB0ZXh0dXJlcykiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gSEFQX0ZNVF9SR0JBRFhUNSAgfSwgMCwgMCwgRkxBR1MsICJmb3JtYXQiIH0sCiAgICAgICAgIHsgImhhcF9xIiwgICAgICJIYXAgUSAoRFhUNS1ZQ29DZyB0ZXh0dXJlcykiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gSEFQX0ZNVF9ZQ09DR0RYVDUgfSwgMCwgMCwgRkxBR1MsICJmb3JtYXQiIH0sCiAgICAgeyAiY2h1bmtzIiwgImNodW5rIGNvdW50IiwgT0ZGU0VUKG9wdF9jaHVua19jb3VudCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxIH0sIDEsIEhBUF9NQVhfQ0hVTktTLCBGTEFHUywgfSwKKyAgICB7ICJjb21wcmVzc29yIiwgInNlY29uZC1zdGFnZSBjb21wcmVzc29yIiwgT0ZGU0VUKG9wdF9jb21wcmVzc29yKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBIQVBfQ09NUF9TTkFQUFkgfSwgSEFQX0NPTVBfTk9ORSwgSEFQX0NPTVBfU05BUFBZLCBGTEFHUywgImNvbXByZXNzb3IiIH0sCisgICAgICAgIHsgIm5vbmUiLCAgICAgICAiTm9uZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBIQVBfQ09NUF9OT05FIH0sIDAsIDAsIEZMQUdTLCAiY29tcHJlc3NvciIgfSwKKyAgICAgICAgeyAic25hcHB5IiwgICAgICJTbmFwcHkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gSEFQX0NPTVBfU05BUFBZIH0sIDAsIDAsIEZMQUdTLCAiY29tcHJlc3NvciIgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKQEAgLTMxOCw3ICszNTEsNyBAQAogCiBBVkNvZGVjIGZmX2hhcF9lbmNvZGVyID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJoYXAiLAotICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWaWR2b3ggSGFwIGVuY29kZXIiKSwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVmlkdm94IEhhcCIpLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IQVAsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEhhcENvbnRleHQpLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oYXBxYV9leHRyYWN0X2JzZi5jIGIvbGliYXZjb2RlYy9oYXBxYV9leHRyYWN0X2JzZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjIxODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2hhcHFhX2V4dHJhY3RfYnNmLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBIQVBRQSBleHRyYWN0IGJpdHN0cmVhbSBmaWx0ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBKb2t5byBJbWFnZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSEFQUUEgZXh0cmFjdCBiaXRzdHJlYW0gZmlsdGVyCisgKiBleHRyYWN0IG9uZSBvZiB0aGUgdHdvIHRleHR1cmVzIG9mIHRoZSBIQVFBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic2YuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaGFwLmgiCisKK3R5cGVkZWYgc3RydWN0IEhhcHFhRXh0cmFjdENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCB0ZXh0dXJlOy8qIGluZGV4IG9mIHRoZSB0ZXh0dXJlIHRvIGtlZXAgKDAgZm9yIHJnYiBvciAxIGZvciBhbHBoYSkgKi8KK30gSGFwcWFFeHRyYWN0Q29udGV4dDsKKworc3RhdGljIGludCBjaGVja190ZXh0dXJlKEhhcHFhRXh0cmFjdENvbnRleHQgKmN0eCwgaW50IHNlY3Rpb25fdHlwZSkgeworICAgIGlmICgoKGN0eC0+dGV4dHVyZSA9PSAwKSYmKChzZWN0aW9uX3R5cGUgJiAweDBGKSA9PSAweDBGKSkgfHwgLyogSGFwUSB0ZXh0dXJlIGFuZCByZ2IgZXh0cmFjdCAqLworICAgICAgICAoKGN0eC0+dGV4dHVyZSA9PSAxKSYmKChzZWN0aW9uX3R5cGUgJiAweDBGKSA9PSAweDAxKSkpIC8qIEhhcEFscGhhT25seSB0ZXh0dXJlIGFuZCBhbHBoYSBleHRyYWN0ICovCisgICAgeworICAgICAgICByZXR1cm4gMTsgLyogdGhlIHRleHR1cmUgaXMgdGhlIG9uZSB0byBrZWVwICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitzdGF0aWMgaW50IGhhcHFhX2V4dHJhY3QoQVZCU0ZDb250ZXh0ICpic2YsIEFWUGFja2V0ICpwa3QpCit7CisgICAgSGFwcWFFeHRyYWN0Q29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2JjOworICAgIGludCBzZWN0aW9uX3NpemU7CisgICAgZW51bSBIYXBTZWN0aW9uVHlwZSBzZWN0aW9uX3R5cGU7CisgICAgaW50IHN0YXJ0X3NlY3Rpb25fc2l6ZTsKKyAgICBpbnQgdGFyZ2V0X3BhY2tldF9zaXplID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHJldCA9IGZmX2JzZl9nZXRfcGFja2V0X3JlZihic2YsIHBrdCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYmMsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICByZXQgPSBmZl9oYXBfcGFyc2Vfc2VjdGlvbl9oZWFkZXIoJmdiYywgJnNlY3Rpb25fc2l6ZSwgJnNlY3Rpb25fdHlwZSk7CisgICAgaWYgKHJldCAhPSAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKHNlY3Rpb25fdHlwZSAmIDB4MEYpICE9IDB4MEQpIHsKKyAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzZWN0aW9uIHR5cGUgZm9yIEhBUFFBICUjMDR4LlxuIiwgc2VjdGlvbl90eXBlICYgMHgwRik7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzdGFydF9zZWN0aW9uX3NpemUgPSA0OworCisgICAgYnl0ZXN0cmVhbTJfc2VlaygmZ2JjLCBzdGFydF9zZWN0aW9uX3NpemUsIFNFRUtfU0VUKTsvKiBnbyB0byBzdGFydCBvZiB0aGUgZmlyc3QgdGV4dHVyZSAqLworCisgICAgcmV0ID0gZmZfaGFwX3BhcnNlX3NlY3Rpb25faGVhZGVyKCZnYmMsICZzZWN0aW9uX3NpemUsICZzZWN0aW9uX3R5cGUpOworICAgIGlmIChyZXQgIT0gMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgdGFyZ2V0X3BhY2tldF9zaXplID0gc2VjdGlvbl9zaXplICsgNDsKKworICAgIGlmIChjaGVja190ZXh0dXJlKGN0eCwgc2VjdGlvbl90eXBlKSA9PSAwKSB7IC8qIHRoZSB0ZXh0dXJlIGlzIG5vdCB0aGUgb25lIHRvIGtlZXAgKi8KKyAgICAgICAgc3RhcnRfc2VjdGlvbl9zaXplICs9IDQgKyBzZWN0aW9uX3NpemU7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiYywgc3RhcnRfc2VjdGlvbl9zaXplLCBTRUVLX1NFVCk7LyogZ28gdG8gc3RhcnQgb2YgdGhlIHNlY29uZCB0ZXh0dXJlICovCisgICAgICAgIHJldCA9IGZmX2hhcF9wYXJzZV9zZWN0aW9uX2hlYWRlcigmZ2JjLCAmc2VjdGlvbl9zaXplLCAmc2VjdGlvbl90eXBlKTsKKyAgICAgICAgaWYgKHJldCAhPSAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIHRhcmdldF9wYWNrZXRfc2l6ZSA9IHNlY3Rpb25fc2l6ZSArIDQ7CisKKyAgICAgICAgaWYgKGNoZWNrX3RleHR1cmUoY3R4LCBzZWN0aW9uX3R5cGUpID09IDApeyAvKiB0aGUgc2Vjb25kIHRleHR1cmUgaXMgbm90IHRoZSBvbmUgdG8ga2VlcCAqLworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiTm8gdmFsaWQgdGV4dHVyZSBmb3VuZC5cbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdC0+ZGF0YSArPSBzdGFydF9zZWN0aW9uX3NpemU7CisgICAgcGt0LT5zaXplID0gdGFyZ2V0X3BhY2tldF9zaXplOworCitmYWlsOgorICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgZW51bSBBVkNvZGVjSUQgY29kZWNfaWRzW10gPSB7CisgICAgQVZfQ09ERUNfSURfSEFQLCBBVl9DT0RFQ19JRF9OT05FLAorfTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSGFwcWFFeHRyYWN0Q29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfQlNGX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ0ZXh0dXJlIiwgInRleHR1cmUgdG8ga2VlcCIsIE9GRlNFVCh0ZXh0dXJlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTLCAidGV4dHVyZSIgfSwKKyAgICAgICAgeyAiY29sb3IiLCAia2VlcCBIYXBRIHRleHR1cmUiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAwIH0sIDAsIDAsIEZMQUdTLCAidGV4dHVyZSIgfSwKKyAgICAgICAgeyAiYWxwaGEiLCAia2VlcCBIYXBBbHBoYU9ubHkgdGV4dHVyZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAxIH0sIDAsIDAsIEZMQUdTLCAidGV4dHVyZSIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGhhcHFhX2V4dHJhY3RfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiaGFwcWFfZXh0cmFjdF9ic2YiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfaGFwcWFfZXh0cmFjdF9ic2YgPSB7CisgICAgLm5hbWUgICAgICAgPSAiaGFwcWFfZXh0cmFjdCIsCisgICAgLmZpbHRlciAgICAgPSBoYXBxYV9leHRyYWN0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihIYXBxYUV4dHJhY3RDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyA9ICZoYXBxYV9leHRyYWN0X2NsYXNzLAorICAgIC5jb2RlY19pZHMgID0gY29kZWNfaWRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Yy5jIGIvbGliYXZjb2RlYy9oZXZjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2Y5MGEuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9oZXZjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAxICswLDAgQEAKLS8qCi0gKiBIRVZDIHZpZGVvIERlY29kZXIKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEd1aWxsYXVtZSBNYXJ0cmVzCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIE1pY2thZWwgUmF1bGV0Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEdpbGRhcyBDb2NoZXJlbAotICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBXYXNzaW0gSGFtaWRvdWNoZQotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0b21pYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9kaXNwbGF5LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21kNS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgotCi0jaW5jbHVkZSAiYnN3YXBkc3AuaCIKLSNpbmNsdWRlICJieXRlc3RyZWFtLmgiCi0jaW5jbHVkZSAiY2FiYWNfZnVuY3Rpb25zLmgiCi0jaW5jbHVkZSAiZ29sb21iLmgiCi0jaW5jbHVkZSAiaGV2Yy5oIgotI2luY2x1ZGUgInByb2ZpbGVzLmgiCi0KLWNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19wZWxfd2VpZ2h0WzY1XSA9IHsgWzJdID0gMCwgWzRdID0gMSwgWzZdID0gMiwgWzhdID0gMywgWzEyXSA9IDQsIFsxNl0gPSA1LCBbMjRdID0gNiwgWzMyXSA9IDcsIFs0OF0gPSA4LCBbNjRdID0gOSB9OwotCi0vKioKLSAqIE5PVEU6IEVhY2ggZnVuY3Rpb24gaGxzX2ZvbyBjb3JyZXNwb25kIHRvIHRoZSBmdW5jdGlvbiBmb28gaW4gdGhlCi0gKiBzcGVjaWZpY2F0aW9uIChITFMgc3RhbmRzIGZvciBIaWdoIExldmVsIFN5bnRheCkuCi0gKi8KLQotLyoqCi0gKiBTZWN0aW9uIDUuNwotICovCi0KLS8qIGZyZWUgZXZlcnl0aGluZyBhbGxvY2F0ZWQgIGJ5IHBpY19hcnJheXNfaW5pdCgpICovCi1zdGF0aWMgdm9pZCBwaWNfYXJyYXlzX2ZyZWUoSEVWQ0NvbnRleHQgKnMpCi17Ci0gICAgYXZfZnJlZXAoJnMtPnNhbyk7Ci0gICAgYXZfZnJlZXAoJnMtPmRlYmxvY2spOwotCi0gICAgYXZfZnJlZXAoJnMtPnNraXBfZmxhZyk7Ci0gICAgYXZfZnJlZXAoJnMtPnRhYl9jdF9kZXB0aCk7Ci0KLSAgICBhdl9mcmVlcCgmcy0+dGFiX2lwbSk7Ci0gICAgYXZfZnJlZXAoJnMtPmNiZl9sdW1hKTsKLSAgICBhdl9mcmVlcCgmcy0+aXNfcGNtKTsKLQotICAgIGF2X2ZyZWVwKCZzLT5xcF95X3RhYik7Ci0gICAgYXZfZnJlZXAoJnMtPnRhYl9zbGljZV9hZGRyZXNzKTsKLSAgICBhdl9mcmVlcCgmcy0+ZmlsdGVyX3NsaWNlX2VkZ2VzKTsKLQotICAgIGF2X2ZyZWVwKCZzLT5ob3Jpem9udGFsX2JzKTsKLSAgICBhdl9mcmVlcCgmcy0+dmVydGljYWxfYnMpOwotCi0gICAgYXZfZnJlZXAoJnMtPnNoLmVudHJ5X3BvaW50X29mZnNldCk7Ci0gICAgYXZfZnJlZXAoJnMtPnNoLnNpemUpOwotICAgIGF2X2ZyZWVwKCZzLT5zaC5vZmZzZXQpOwotCi0gICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZzLT50YWJfbXZmX3Bvb2wpOwotICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmcy0+cnBsX3RhYl9wb29sKTsKLX0KLQotLyogYWxsb2NhdGUgYXJyYXlzIHRoYXQgZGVwZW5kIG9uIGZyYW1lIGRpbWVuc2lvbnMgKi8KLXN0YXRpYyBpbnQgcGljX2FycmF5c19pbml0KEhFVkNDb250ZXh0ICpzLCBjb25zdCBIRVZDU1BTICpzcHMpCi17Ci0gICAgaW50IGxvZzJfbWluX2NiX3NpemUgPSBzcHMtPmxvZzJfbWluX2NiX3NpemU7Ci0gICAgaW50IHdpZHRoICAgICAgICAgICAgPSBzcHMtPndpZHRoOwotICAgIGludCBoZWlnaHQgICAgICAgICAgID0gc3BzLT5oZWlnaHQ7Ci0gICAgaW50IHBpY19zaXplX2luX2N0YiAgPSAoKHdpZHRoICA+PiBsb2cyX21pbl9jYl9zaXplKSArIDEpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaGVpZ2h0ID4+IGxvZzJfbWluX2NiX3NpemUpICsgMSk7Ci0gICAgaW50IGN0Yl9jb3VudCAgICAgICAgPSBzcHMtPmN0Yl93aWR0aCAqIHNwcy0+Y3RiX2hlaWdodDsKLSAgICBpbnQgbWluX3B1X3NpemUgICAgICA9IHNwcy0+bWluX3B1X3dpZHRoICogc3BzLT5taW5fcHVfaGVpZ2h0OwotCi0gICAgcy0+YnNfd2lkdGggID0gKHdpZHRoICA+PiAyKSArIDE7Ci0gICAgcy0+YnNfaGVpZ2h0ID0gKGhlaWdodCA+PiAyKSArIDE7Ci0KLSAgICBzLT5zYW8gICAgICAgICAgID0gYXZfbWFsbG9jel9hcnJheShjdGJfY291bnQsIHNpemVvZigqcy0+c2FvKSk7Ci0gICAgcy0+ZGVibG9jayAgICAgICA9IGF2X21hbGxvY3pfYXJyYXkoY3RiX2NvdW50LCBzaXplb2YoKnMtPmRlYmxvY2spKTsKLSAgICBpZiAoIXMtPnNhbyB8fCAhcy0+ZGVibG9jaykKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgcy0+c2tpcF9mbGFnICAgID0gYXZfbWFsbG9jX2FycmF5KHNwcy0+bWluX2NiX2hlaWdodCwgc3BzLT5taW5fY2Jfd2lkdGgpOwotICAgIHMtPnRhYl9jdF9kZXB0aCA9IGF2X21hbGxvY19hcnJheShzcHMtPm1pbl9jYl9oZWlnaHQsIHNwcy0+bWluX2NiX3dpZHRoKTsKLSAgICBpZiAoIXMtPnNraXBfZmxhZyB8fCAhcy0+dGFiX2N0X2RlcHRoKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBzLT5jYmZfbHVtYSA9IGF2X21hbGxvY19hcnJheShzcHMtPm1pbl90Yl93aWR0aCwgc3BzLT5taW5fdGJfaGVpZ2h0KTsKLSAgICBzLT50YWJfaXBtICA9IGF2X21hbGxvY3oobWluX3B1X3NpemUpOwotICAgIHMtPmlzX3BjbSAgID0gYXZfbWFsbG9jX2FycmF5KHNwcy0+bWluX3B1X3dpZHRoICsgMSwgc3BzLT5taW5fcHVfaGVpZ2h0ICsgMSk7Ci0gICAgaWYgKCFzLT50YWJfaXBtIHx8ICFzLT5jYmZfbHVtYSB8fCAhcy0+aXNfcGNtKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBzLT5maWx0ZXJfc2xpY2VfZWRnZXMgPSBhdl9tYWxsb2N6KGN0Yl9jb3VudCk7Ci0gICAgcy0+dGFiX3NsaWNlX2FkZHJlc3MgID0gYXZfbWFsbG9jX2FycmF5KHBpY19zaXplX2luX2N0YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT50YWJfc2xpY2VfYWRkcmVzcykpOwotICAgIHMtPnFwX3lfdGFiICAgICAgICAgICA9IGF2X21hbGxvY19hcnJheShwaWNfc2l6ZV9pbl9jdGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+cXBfeV90YWIpKTsKLSAgICBpZiAoIXMtPnFwX3lfdGFiIHx8ICFzLT5maWx0ZXJfc2xpY2VfZWRnZXMgfHwgIXMtPnRhYl9zbGljZV9hZGRyZXNzKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBzLT5ob3Jpem9udGFsX2JzID0gYXZfbWFsbG9jel9hcnJheShzLT5ic193aWR0aCwgcy0+YnNfaGVpZ2h0KTsKLSAgICBzLT52ZXJ0aWNhbF9icyAgID0gYXZfbWFsbG9jel9hcnJheShzLT5ic193aWR0aCwgcy0+YnNfaGVpZ2h0KTsKLSAgICBpZiAoIXMtPmhvcml6b250YWxfYnMgfHwgIXMtPnZlcnRpY2FsX2JzKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBzLT50YWJfbXZmX3Bvb2wgPSBhdl9idWZmZXJfcG9vbF9pbml0KG1pbl9wdV9zaXplICogc2l6ZW9mKE12RmllbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnVmZmVyX2FsbG9jeik7Ci0gICAgcy0+cnBsX3RhYl9wb29sID0gYXZfYnVmZmVyX3Bvb2xfaW5pdChjdGJfY291bnQgKiBzaXplb2YoUmVmUGljTGlzdFRhYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9idWZmZXJfYWxsb2N6KTsKLSAgICBpZiAoIXMtPnRhYl9tdmZfcG9vbCB8fCAhcy0+cnBsX3RhYl9wb29sKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICByZXR1cm4gMDsKLQotZmFpbDoKLSAgICBwaWNfYXJyYXlzX2ZyZWUocyk7Ci0gICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLX0KLQotc3RhdGljIHZvaWQgcHJlZF93ZWlnaHRfdGFibGUoSEVWQ0NvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQotewotICAgIGludCBpID0gMDsKLSAgICBpbnQgaiA9IDA7Ci0gICAgdWludDhfdCBsdW1hX3dlaWdodF9sMF9mbGFnWzE2XTsKLSAgICB1aW50OF90IGNocm9tYV93ZWlnaHRfbDBfZmxhZ1sxNl07Ci0gICAgdWludDhfdCBsdW1hX3dlaWdodF9sMV9mbGFnWzE2XTsKLSAgICB1aW50OF90IGNocm9tYV93ZWlnaHRfbDFfZmxhZ1sxNl07Ci0gICAgaW50IGx1bWFfbG9nMl93ZWlnaHRfZGVub207Ci0KLSAgICBsdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKLSAgICBpZiAobHVtYV9sb2cyX3dlaWdodF9kZW5vbSA8IDAgfHwgbHVtYV9sb2cyX3dlaWdodF9kZW5vbSA+IDcpCi0gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibHVtYV9sb2cyX3dlaWdodF9kZW5vbSAlZCBpcyBpbnZhbGlkXG4iLCBsdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKLSAgICBzLT5zaC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gYXZfY2xpcF91aW50cDIobHVtYV9sb2cyX3dlaWdodF9kZW5vbSwgMyk7Ci0gICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gMCkgewotICAgICAgICBpbnQgZGVsdGEgPSBnZXRfc2VfZ29sb21iKGdiKTsKLSAgICAgICAgcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gYXZfY2xpcF91aW50cDIocy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbSArIGRlbHRhLCAzKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMF07IGkrKykgewotICAgICAgICBsdW1hX3dlaWdodF9sMF9mbGFnW2ldID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgaWYgKCFsdW1hX3dlaWdodF9sMF9mbGFnW2ldKSB7Ci0gICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMFtpXSA9IDEgPDwgcy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKLSAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wwW2ldID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zaC5uYl9yZWZzW0wwXTsgaSsrKQotICAgICAgICAgICAgY2hyb21hX3dlaWdodF9sMF9mbGFnW2ldID0gZ2V0X2JpdHMxKGdiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMF07IGkrKykKLSAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSA9IDA7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zaC5uYl9yZWZzW0wwXTsgaSsrKSB7Ci0gICAgICAgIGlmIChsdW1hX3dlaWdodF9sMF9mbGFnW2ldKSB7Ci0gICAgICAgICAgICBpbnQgZGVsdGFfbHVtYV93ZWlnaHRfbDAgPSBnZXRfc2VfZ29sb21iKGdiKTsKLSAgICAgICAgICAgIHMtPnNoLmx1bWFfd2VpZ2h0X2wwW2ldID0gKDEgPDwgcy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbSkgKyBkZWx0YV9sdW1hX3dlaWdodF9sMDsKLSAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wwW2ldID0gZ2V0X3NlX2dvbG9tYihnYik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSkgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotICAgICAgICAgICAgICAgIGludCBkZWx0YV9jaHJvbWFfd2VpZ2h0X2wwID0gZ2V0X3NlX2dvbG9tYihnYik7Ci0gICAgICAgICAgICAgICAgaW50IGRlbHRhX2Nocm9tYV9vZmZzZXRfbDAgPSBnZXRfc2VfZ29sb21iKGdiKTsKLSAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2ldW2pdID0gKDEgPDwgcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIGRlbHRhX2Nocm9tYV93ZWlnaHRfbDA7Ci0gICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX29mZnNldF9sMFtpXVtqXSA9IGF2X2NsaXAoKGRlbHRhX2Nocm9tYV9vZmZzZXRfbDAgLSAoKDEyOCAqIHMtPnNoLmNocm9tYV93ZWlnaHRfbDBbaV1bal0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PiBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pICsgMTI4KSwgLTEyOCwgMTI3KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDBbaV1bMF0gPSAxIDw8IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKLSAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbaV1bMF0gPSAwOwotICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMFtpXVsxXSA9IDEgPDwgcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tOwotICAgICAgICAgICAgcy0+c2guY2hyb21hX29mZnNldF9sMFtpXVsxXSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMV07IGkrKykgewotICAgICAgICAgICAgbHVtYV93ZWlnaHRfbDFfZmxhZ1tpXSA9IGdldF9iaXRzMShnYik7Ci0gICAgICAgICAgICBpZiAoIWx1bWFfd2VpZ2h0X2wxX2ZsYWdbaV0pIHsKLSAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMVtpXSA9IDEgPDwgcy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKLSAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX29mZnNldF9sMVtpXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gMCkgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNoLm5iX3JlZnNbTDFdOyBpKyspCi0gICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodF9sMV9mbGFnW2ldID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zaC5uYl9yZWZzW0wxXTsgaSsrKQotICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfbDFfZmxhZ1tpXSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNoLm5iX3JlZnNbTDFdOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChsdW1hX3dlaWdodF9sMV9mbGFnW2ldKSB7Ci0gICAgICAgICAgICAgICAgaW50IGRlbHRhX2x1bWFfd2VpZ2h0X2wxID0gZ2V0X3NlX2dvbG9tYihnYik7Ci0gICAgICAgICAgICAgICAgcy0+c2gubHVtYV93ZWlnaHRfbDFbaV0gPSAoMSA8PCBzLT5zaC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIGRlbHRhX2x1bWFfd2VpZ2h0X2wxOwotICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wxW2ldID0gZ2V0X3NlX2dvbG9tYihnYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2hyb21hX3dlaWdodF9sMV9mbGFnW2ldKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFfY2hyb21hX3dlaWdodF9sMSA9IGdldF9zZV9nb2xvbWIoZ2IpOwotICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFfY2hyb21hX29mZnNldF9sMSA9IGdldF9zZV9nb2xvbWIoZ2IpOwotICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wxW2ldW2pdID0gKDEgPDwgcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIGRlbHRhX2Nocm9tYV93ZWlnaHRfbDE7Ci0gICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDFbaV1bal0gPSBhdl9jbGlwKChkZWx0YV9jaHJvbWFfb2Zmc2V0X2wxIC0gKCgxMjggKiBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wxW2ldW2pdKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSkgKyAxMjgpLCAtMTI4LCAxMjcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMVtpXVswXSA9IDEgPDwgcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tOwotICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDFbaV1bMF0gPSAwOwotICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDFbaV1bMV0gPSAxIDw8IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKLSAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wxW2ldWzFdID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGludCBkZWNvZGVfbHRfcnBzKEhFVkNDb250ZXh0ICpzLCBMb25nVGVybVJQUyAqcnBzLCBHZXRCaXRDb250ZXh0ICpnYikKLXsKLSAgICBjb25zdCBIRVZDU1BTICpzcHMgPSBzLT5wcy5zcHM7Ci0gICAgaW50IG1heF9wb2NfbHNiICAgID0gMSA8PCBzcHMtPmxvZzJfbWF4X3BvY19sc2I7Ci0gICAgaW50IHByZXZfZGVsdGFfbXNiID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgbmJfc3BzID0gMCwgbmJfc2g7Ci0gICAgaW50IGk7Ci0KLSAgICBycHMtPm5iX3JlZnMgPSAwOwotICAgIGlmICghc3BzLT5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChzcHMtPm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzID4gMCkKLSAgICAgICAgbmJfc3BzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKLSAgICBuYl9zaCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7Ci0KLSAgICBpZiAobmJfc2ggKyAodWludDY0X3QpbmJfc3BzID4gRkZfQVJSQVlfRUxFTVMocnBzLT5wb2MpKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLQotICAgIHJwcy0+bmJfcmVmcyA9IG5iX3NoICsgbmJfc3BzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHJwcy0+bmJfcmVmczsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgZGVsdGFfcG9jX21zYl9wcmVzZW50OwotCi0gICAgICAgIGlmIChpIDwgbmJfc3BzKSB7Ci0gICAgICAgICAgICB1aW50OF90IGx0X2lkeF9zcHMgPSAwOwotCi0gICAgICAgICAgICBpZiAoc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcyA+IDEpCi0gICAgICAgICAgICAgICAgbHRfaWR4X3NwcyA9IGdldF9iaXRzKGdiLCBhdl9jZWlsX2xvZzIoc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcykpOwotCi0gICAgICAgICAgICBycHMtPnBvY1tpXSAgPSBzcHMtPmx0X3JlZl9waWNfcG9jX2xzYl9zcHNbbHRfaWR4X3Nwc107Ci0gICAgICAgICAgICBycHMtPnVzZWRbaV0gPSBzcHMtPnVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbbHRfaWR4X3Nwc107Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBycHMtPnBvY1tpXSAgPSBnZXRfYml0cyhnYiwgc3BzLT5sb2cyX21heF9wb2NfbHNiKTsKLSAgICAgICAgICAgIHJwcy0+dXNlZFtpXSA9IGdldF9iaXRzMShnYik7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWx0YV9wb2NfbXNiX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOwotICAgICAgICBpZiAoZGVsdGFfcG9jX21zYl9wcmVzZW50KSB7Ci0gICAgICAgICAgICBpbnQgZGVsdGEgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOwotCi0gICAgICAgICAgICBpZiAoaSAmJiBpICE9IG5iX3NwcykKLSAgICAgICAgICAgICAgICBkZWx0YSArPSBwcmV2X2RlbHRhX21zYjsKLQotICAgICAgICAgICAgcnBzLT5wb2NbaV0gKz0gcy0+cG9jIC0gZGVsdGEgKiBtYXhfcG9jX2xzYiAtIHMtPnNoLnBpY19vcmRlcl9jbnRfbHNiOwotICAgICAgICAgICAgcHJldl9kZWx0YV9tc2IgPSBkZWx0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBleHBvcnRfc3RyZWFtX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEhFVkNQYXJhbVNldHMgKnBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEVWQ1NQUyAqc3BzKQotewotICAgIGNvbnN0IEhFVkNWUFMgKnZwcyA9IChjb25zdCBIRVZDVlBTKilwcy0+dnBzX2xpc3Rbc3BzLT52cHNfaWRdLT5kYXRhOwotICAgIHVuc2lnbmVkIGludCBudW0gPSAwLCBkZW4gPSAwOwotCi0gICAgYXZjdHgtPnBpeF9mbXQgICAgICAgICAgICAgPSBzcHMtPnBpeF9mbXQ7Ci0gICAgYXZjdHgtPmNvZGVkX3dpZHRoICAgICAgICAgPSBzcHMtPndpZHRoOwotICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQgICAgICAgID0gc3BzLT5oZWlnaHQ7Ci0gICAgYXZjdHgtPndpZHRoICAgICAgICAgICAgICAgPSBzcHMtPm91dHB1dF93aWR0aDsKLSAgICBhdmN0eC0+aGVpZ2h0ICAgICAgICAgICAgICA9IHNwcy0+b3V0cHV0X2hlaWdodDsKLSAgICBhdmN0eC0+aGFzX2JfZnJhbWVzICAgICAgICA9IHNwcy0+dGVtcG9yYWxfbGF5ZXJbc3BzLT5tYXhfc3ViX2xheWVycyAtIDFdLm51bV9yZW9yZGVyX3BpY3M7Ci0gICAgYXZjdHgtPnByb2ZpbGUgICAgICAgICAgICAgPSBzcHMtPnB0bC5nZW5lcmFsX3B0bC5wcm9maWxlX2lkYzsKLSAgICBhdmN0eC0+bGV2ZWwgICAgICAgICAgICAgICA9IHNwcy0+cHRsLmdlbmVyYWxfcHRsLmxldmVsX2lkYzsKLQotICAgIGZmX3NldF9zYXIoYXZjdHgsIHNwcy0+dnVpLnNhcik7Ci0KLSAgICBpZiAoc3BzLT52dWkudmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnKQotICAgICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPSBzcHMtPnZ1aS52aWRlb19mdWxsX3JhbmdlX2ZsYWcgPyBBVkNPTF9SQU5HRV9KUEVHCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWQ09MX1JBTkdFX01QRUc7Ci0gICAgZWxzZQotICAgICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9NUEVHOwotCi0gICAgaWYgKHNwcy0+dnVpLmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcpIHsKLSAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IHNwcy0+dnVpLmNvbG91cl9wcmltYXJpZXM7Ci0gICAgICAgIGF2Y3R4LT5jb2xvcl90cmMgICAgICAgPSBzcHMtPnZ1aS50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpYzsKLSAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgICAgICA9IHNwcy0+dnVpLm1hdHJpeF9jb2VmZnM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRDsKLSAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICA9IEFWQ09MX1RSQ19VTlNQRUNJRklFRDsKLSAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgICAgICA9IEFWQ09MX1NQQ19VTlNQRUNJRklFRDsKLSAgICB9Ci0KLSAgICBpZiAodnBzLT52cHNfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgIG51bSA9IHZwcy0+dnBzX251bV91bml0c19pbl90aWNrOwotICAgICAgICBkZW4gPSB2cHMtPnZwc190aW1lX3NjYWxlOwotICAgIH0gZWxzZSBpZiAoc3BzLT52dWkudnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgewotICAgICAgICBudW0gPSBzcHMtPnZ1aS52dWlfbnVtX3VuaXRzX2luX3RpY2s7Ci0gICAgICAgIGRlbiA9IHNwcy0+dnVpLnZ1aV90aW1lX3NjYWxlOwotICAgIH0KLQotICAgIGlmIChudW0gIT0gMCAmJiBkZW4gIT0gMCkKLSAgICAgICAgYXZfcmVkdWNlKCZhdmN0eC0+ZnJhbWVyYXRlLmRlbiwgJmF2Y3R4LT5mcmFtZXJhdGUubnVtLAotICAgICAgICAgICAgICAgICAgbnVtLCBkZW4sIDEgPDwgMzApOwotfQotCi1zdGF0aWMgaW50IHNldF9zcHMoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IEhFVkNTUFMgKnNwcywgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCi17Ci0gICAgI2RlZmluZSBIV0FDQ0VMX01BWCAoQ09ORklHX0hFVkNfRFhWQTJfSFdBQ0NFTCArIENPTkZJR19IRVZDX0QzRDExVkFfSFdBQ0NFTCArIENPTkZJR19IRVZDX1ZBQVBJX0hXQUNDRUwgKyBDT05GSUdfSEVWQ19WRFBBVV9IV0FDQ0VMKQotICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tIV0FDQ0VMX01BWCArIDJdLCAqZm10ID0gcGl4X2ZtdHM7Ci0gICAgaW50IHJldCwgaTsKLQotICAgIHBpY19hcnJheXNfZnJlZShzKTsKLSAgICBzLT5wcy5zcHMgPSBOVUxMOwotICAgIHMtPnBzLnZwcyA9IE5VTEw7Ci0KLSAgICBpZiAoIXNwcykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXQgPSBwaWNfYXJyYXlzX2luaXQocywgc3BzKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgZXhwb3J0X3N0cmVhbV9wYXJhbXMocy0+YXZjdHgsICZzLT5wcywgc3BzKTsKLQotICAgIGlmIChzcHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQIHx8IHNwcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0MjBQKSB7Ci0jaWYgQ09ORklHX0hFVkNfRFhWQTJfSFdBQ0NFTAotICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX0RYVkEyX1ZMRDsKLSNlbmRpZgotI2lmIENPTkZJR19IRVZDX0QzRDExVkFfSFdBQ0NFTAotICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX0QzRDExVkFfVkxEOwotI2VuZGlmCi0jaWYgQ09ORklHX0hFVkNfVkFBUElfSFdBQ0NFTAotICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX1ZBQVBJOwotI2VuZGlmCi0jaWYgQ09ORklHX0hFVkNfVkRQQVVfSFdBQ0NFTAotICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX1ZEUEFVOwotI2VuZGlmCi0gICAgfQotCi0gICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7Ci0gICAgICAgICpmbXQrKyA9IHNwcy0+cGl4X2ZtdDsKLSAgICAgICAgKmZtdCA9IEFWX1BJWF9GTVRfTk9ORTsKLQotICAgICAgICByZXQgPSBmZl90aHJlYWRfZ2V0X2Zvcm1hdChzLT5hdmN0eCwgcGl4X2ZtdHMpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSByZXQ7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IHBpeF9mbXQ7Ci0gICAgfQotCi0gICAgZmZfaGV2Y19wcmVkX2luaXQoJnMtPmhwYywgICAgIHNwcy0+Yml0X2RlcHRoKTsKLSAgICBmZl9oZXZjX2RzcF9pbml0ICgmcy0+aGV2Y2RzcCwgc3BzLT5iaXRfZGVwdGgpOwotICAgIGZmX3ZpZGVvZHNwX2luaXQgKCZzLT52ZHNwLCAgICBzcHMtPmJpdF9kZXB0aCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZzLT5zYW9fcGl4ZWxfYnVmZmVyX2hbaV0pOwotICAgICAgICBhdl9mcmVlcCgmcy0+c2FvX3BpeGVsX2J1ZmZlcl92W2ldKTsKLSAgICB9Ci0KLSAgICBpZiAoc3BzLT5zYW9fZW5hYmxlZCAmJiAhcy0+YXZjdHgtPmh3YWNjZWwpIHsKLSAgICAgICAgaW50IGNfY291bnQgPSAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwKSA/IDMgOiAxOwotICAgICAgICBpbnQgY19pZHg7Ci0KLSAgICAgICAgZm9yKGNfaWR4ID0gMDsgY19pZHggPCBjX2NvdW50OyBjX2lkeCsrKSB7Ci0gICAgICAgICAgICBpbnQgdyA9IHNwcy0+d2lkdGggPj4gc3BzLT5oc2hpZnRbY19pZHhdOwotICAgICAgICAgICAgaW50IGggPSBzcHMtPmhlaWdodCA+PiBzcHMtPnZzaGlmdFtjX2lkeF07Ci0gICAgICAgICAgICBzLT5zYW9fcGl4ZWxfYnVmZmVyX2hbY19pZHhdID0KLSAgICAgICAgICAgICAgICBhdl9tYWxsb2MoKHcgKiAyICogc3BzLT5jdGJfaGVpZ2h0KSA8PAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcHMtPnBpeGVsX3NoaWZ0KTsKLSAgICAgICAgICAgIHMtPnNhb19waXhlbF9idWZmZXJfdltjX2lkeF0gPQotICAgICAgICAgICAgICAgIGF2X21hbGxvYygoaCAqIDIgKiBzcHMtPmN0Yl93aWR0aCkgPDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT5waXhlbF9zaGlmdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzLT5wcy5zcHMgPSBzcHM7Ci0gICAgcy0+cHMudnBzID0gKEhFVkNWUFMqKSBzLT5wcy52cHNfbGlzdFtzLT5wcy5zcHMtPnZwc19pZF0tPmRhdGE7Ci0KLSAgICByZXR1cm4gMDsKLQotZmFpbDoKLSAgICBwaWNfYXJyYXlzX2ZyZWUocyk7Ci0gICAgcy0+cHMuc3BzID0gTlVMTDsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGhsc19zbGljZV9oZWFkZXIoSEVWQ0NvbnRleHQgKnMpCi17Ci0gICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKLSAgICBTbGljZUhlYWRlciAqc2ggICA9ICZzLT5zaDsKLSAgICBpbnQgaSwgcmV0OwotCi0gICAgLy8gQ29kZWQgcGFyYW1ldGVycwotICAgIHNoLT5maXJzdF9zbGljZV9pbl9waWNfZmxhZyA9IGdldF9iaXRzMShnYik7Ci0gICAgaWYgKChJU19JRFIocykgfHwgSVNfQkxBKHMpKSAmJiBzaC0+Zmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcpIHsKLSAgICAgICAgcy0+c2VxX2RlY29kZSA9IChzLT5zZXFfZGVjb2RlICsgMSkgJiAweGZmOwotICAgICAgICBzLT5tYXhfcmEgICAgID0gSU5UX01BWDsKLSAgICAgICAgaWYgKElTX0lEUihzKSkKLSAgICAgICAgICAgIGZmX2hldmNfY2xlYXJfcmVmcyhzKTsKLSAgICB9Ci0gICAgc2gtPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPSAwOwotICAgIGlmIChJU19JUkFQKHMpKQotICAgICAgICBzaC0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyA9IGdldF9iaXRzMShnYik7Ci0KLSAgICBzaC0+cHBzX2lkID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKLSAgICBpZiAoc2gtPnBwc19pZCA+PSBNQVhfUFBTX0NPVU5UIHx8ICFzLT5wcy5wcHNfbGlzdFtzaC0+cHBzX2lkXSkgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlBQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCBzaC0+cHBzX2lkKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnICYmCi0gICAgICAgIHMtPnBzLnBwcyAhPSAoSEVWQ1BQUyopcy0+cHMucHBzX2xpc3Rbc2gtPnBwc19pZF0tPmRhdGEpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQUFMgY2hhbmdlZCBiZXR3ZWVuIHNsaWNlcy5cbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0gICAgcy0+cHMucHBzID0gKEhFVkNQUFMqKXMtPnBzLnBwc19saXN0W3NoLT5wcHNfaWRdLT5kYXRhOwotICAgIGlmIChzLT5uYWxfdW5pdF90eXBlID09IE5BTF9DUkFfTlVUICYmIHMtPmxhc3RfZW9zID09IDEpCi0gICAgICAgIHNoLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnID0gMTsKLQotICAgIGlmIChzLT5wcy5zcHMgIT0gKEhFVkNTUFMqKXMtPnBzLnNwc19saXN0W3MtPnBzLnBwcy0+c3BzX2lkXS0+ZGF0YSkgewotICAgICAgICBjb25zdCBIRVZDU1BTKiBsYXN0X3NwcyA9IHMtPnBzLnNwczsKLSAgICAgICAgcy0+cHMuc3BzID0gKEhFVkNTUFMqKXMtPnBzLnNwc19saXN0W3MtPnBzLnBwcy0+c3BzX2lkXS0+ZGF0YTsKLSAgICAgICAgaWYgKGxhc3Rfc3BzICYmIElTX0lSQVAocykgJiYgcy0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfQ1JBX05VVCkgewotICAgICAgICAgICAgaWYgKHMtPnBzLnNwcy0+d2lkdGggIT0gIGxhc3Rfc3BzLT53aWR0aCB8fCBzLT5wcy5zcHMtPmhlaWdodCAhPSBsYXN0X3Nwcy0+aGVpZ2h0IHx8Ci0gICAgICAgICAgICAgICAgcy0+cHMuc3BzLT50ZW1wb3JhbF9sYXllcltzLT5wcy5zcHMtPm1heF9zdWJfbGF5ZXJzIC0gMV0ubWF4X2RlY19waWNfYnVmZmVyaW5nICE9Ci0gICAgICAgICAgICAgICAgbGFzdF9zcHMtPnRlbXBvcmFsX2xheWVyW2xhc3Rfc3BzLT5tYXhfc3ViX2xheWVycyAtIDFdLm1heF9kZWNfcGljX2J1ZmZlcmluZykKLSAgICAgICAgICAgICAgICBzaC0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZmZfaGV2Y19jbGVhcl9yZWZzKHMpOwotICAgICAgICByZXQgPSBzZXRfc3BzKHMsIHMtPnBzLnNwcywgQVZfUElYX0ZNVF9OT05FKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIHMtPnNlcV9kZWNvZGUgPSAocy0+c2VxX2RlY29kZSArIDEpICYgMHhmZjsKLSAgICAgICAgcy0+bWF4X3JhICAgICA9IElOVF9NQVg7Ci0gICAgfQotCi0gICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSAwOwotICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7Ci0gICAgICAgIGludCBzbGljZV9hZGRyZXNzX2xlbmd0aDsKLQotICAgICAgICBpZiAocy0+cHMucHBzLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudHNfZW5hYmxlZF9mbGFnKQotICAgICAgICAgICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotCi0gICAgICAgIHNsaWNlX2FkZHJlc3NfbGVuZ3RoID0gYXZfY2VpbF9sb2cyKHMtPnBzLnNwcy0+Y3RiX3dpZHRoICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHMuc3BzLT5jdGJfaGVpZ2h0KTsKLSAgICAgICAgc2gtPnNsaWNlX3NlZ21lbnRfYWRkciA9IGdldF9iaXRzeihnYiwgc2xpY2VfYWRkcmVzc19sZW5ndGgpOwotICAgICAgICBpZiAoc2gtPnNsaWNlX3NlZ21lbnRfYWRkciA+PSBzLT5wcy5zcHMtPmN0Yl93aWR0aCAqIHMtPnBzLnNwcy0+Y3RiX2hlaWdodCkgewotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIkludmFsaWQgc2xpY2Ugc2VnbWVudCBhZGRyZXNzOiAldS5cbiIsCi0gICAgICAgICAgICAgICAgICAgc2gtPnNsaWNlX3NlZ21lbnRfYWRkcik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcpIHsKLSAgICAgICAgICAgIHNoLT5zbGljZV9hZGRyID0gc2gtPnNsaWNlX3NlZ21lbnRfYWRkcjsKLSAgICAgICAgICAgIHMtPnNsaWNlX2lkeCsrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2gtPnNsaWNlX3NlZ21lbnRfYWRkciA9IHNoLT5zbGljZV9hZGRyID0gMDsKLSAgICAgICAgcy0+c2xpY2VfaWR4ICAgICAgICAgICA9IDA7Ci0gICAgICAgIHMtPnNsaWNlX2luaXRpYWxpemVkICAgPSAwOwotICAgIH0KLQotICAgIGlmICghc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcpIHsKLSAgICAgICAgcy0+c2xpY2VfaW5pdGlhbGl6ZWQgPSAwOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wcy5wcHMtPm51bV9leHRyYV9zbGljZV9oZWFkZXJfYml0czsgaSsrKQotICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgIC8vIHNsaWNlX3Jlc2VydmVkX3VuZGV0ZXJtaW5lZF9mbGFnW10KLQotICAgICAgICBzaC0+c2xpY2VfdHlwZSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7Ci0gICAgICAgIGlmICghKHNoLT5zbGljZV90eXBlID09IElfU0xJQ0UgfHwKLSAgICAgICAgICAgICAgc2gtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSB8fAotICAgICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSkgewotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIHNsaWNlIHR5cGU6ICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotICAgICAgICBpZiAoSVNfSVJBUChzKSAmJiBzaC0+c2xpY2VfdHlwZSAhPSBJX1NMSUNFKSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludGVyIHNsaWNlcyBpbiBhbiBJUkFQIGZyYW1lLlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHdoZW4gZmxhZyBpcyBub3QgcHJlc2VudCwgcGljdHVyZSBpcyBpbmZlcnJlZCB0byBiZSBvdXRwdXQKLSAgICAgICAgc2gtPnBpY19vdXRwdXRfZmxhZyA9IDE7Ci0gICAgICAgIGlmIChzLT5wcy5wcHMtPm91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZykKLSAgICAgICAgICAgIHNoLT5waWNfb3V0cHV0X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotCi0gICAgICAgIGlmIChzLT5wcy5zcHMtPnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnKQotICAgICAgICAgICAgc2gtPmNvbG91cl9wbGFuZV9pZCA9IGdldF9iaXRzKGdiLCAyKTsKLQotICAgICAgICBpZiAoIUlTX0lEUihzKSkgewotICAgICAgICAgICAgaW50IHBvYywgcG9zOwotCi0gICAgICAgICAgICBzaC0+cGljX29yZGVyX2NudF9sc2IgPSBnZXRfYml0cyhnYiwgcy0+cHMuc3BzLT5sb2cyX21heF9wb2NfbHNiKTsKLSAgICAgICAgICAgIHBvYyA9IGZmX2hldmNfY29tcHV0ZV9wb2Mocywgc2gtPnBpY19vcmRlcl9jbnRfbHNiKTsKLSAgICAgICAgICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnICYmIHBvYyAhPSBzLT5wb2MpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgUE9DIGNoYW5nZSBiZXR3ZWVuIHNsaWNlczogJWQgLT4gJWRcbiIsIHMtPnBvYywgcG9jKTsKLSAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgIHBvYyA9IHMtPnBvYzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPnBvYyA9IHBvYzsKLQotICAgICAgICAgICAgc2gtPnNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotICAgICAgICAgICAgcG9zID0gZ2V0X2JpdHNfbGVmdChnYik7Ci0gICAgICAgICAgICBpZiAoIXNoLT5zaG9ydF90ZXJtX3JlZl9waWNfc2V0X3Nwc19mbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gZmZfaGV2Y19kZWNvZGVfc2hvcnRfdGVybV9ycHMoZ2IsIHMtPmF2Y3R4LCAmc2gtPnNsaWNlX3Jwcywgcy0+cHMuc3BzLCAxKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLQotICAgICAgICAgICAgICAgIHNoLT5zaG9ydF90ZXJtX3JwcyA9ICZzaC0+c2xpY2VfcnBzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgbnVtYml0cywgcnBzX2lkeDsKLQotICAgICAgICAgICAgICAgIGlmICghcy0+cHMuc3BzLT5uYl9zdF9ycHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyByZWYgbGlzdHMgaW4gdGhlIFNQUy5cbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBudW1iaXRzID0gYXZfY2VpbF9sb2cyKHMtPnBzLnNwcy0+bmJfc3RfcnBzKTsKLSAgICAgICAgICAgICAgICBycHNfaWR4ID0gbnVtYml0cyA+IDAgPyBnZXRfYml0cyhnYiwgbnVtYml0cykgOiAwOwotICAgICAgICAgICAgICAgIHNoLT5zaG9ydF90ZXJtX3JwcyA9ICZzLT5wcy5zcHMtPnN0X3Jwc1tycHNfaWR4XTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNoLT5zaG9ydF90ZXJtX3JlZl9waWNfc2V0X3NpemUgPSBwb3MgLSBnZXRfYml0c19sZWZ0KGdiKTsKLQotICAgICAgICAgICAgcG9zID0gZ2V0X2JpdHNfbGVmdChnYik7Ci0gICAgICAgICAgICByZXQgPSBkZWNvZGVfbHRfcnBzKHMsICZzaC0+bG9uZ190ZXJtX3JwcywgZ2IpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBsb25nIHRlcm0gUlBTLlxuIik7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNoLT5sb25nX3Rlcm1fcmVmX3BpY19zZXRfc2l6ZSA9IHBvcyAtIGdldF9iaXRzX2xlZnQoZ2IpOwotCi0gICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5zcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZykKLSAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyA9IGdldF9iaXRzMShnYik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc2gtPnNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcy0+c2guc2hvcnRfdGVybV9ycHMgPSBOVUxMOwotICAgICAgICAgICAgcy0+cG9jICAgICAgICAgICAgICAgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogOC4zLjEgKi8KLSAgICAgICAgaWYgKHMtPnRlbXBvcmFsX2lkID09IDAgJiYKLSAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gTkFMX1RSQUlMX04gJiYKLSAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gTkFMX1RTQV9OICAgJiYKLSAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gTkFMX1NUU0FfTiAgJiYKLSAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gTkFMX1JBRExfTiAgJiYKLSAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gTkFMX1JBRExfUiAgJiYKLSAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gTkFMX1JBU0xfTiAgJiYKLSAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gTkFMX1JBU0xfUikKLSAgICAgICAgICAgIHMtPnBvY1RpZDAgPSBzLT5wb2M7Ci0KLSAgICAgICAgaWYgKHMtPnBzLnNwcy0+c2FvX2VuYWJsZWQpIHsKLSAgICAgICAgICAgIHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMF0gPSBnZXRfYml0czEoZ2IpOwotICAgICAgICAgICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMpIHsKLSAgICAgICAgICAgICAgICBzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzFdID0KLSAgICAgICAgICAgICAgICBzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzJdID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMF0gPSAwOwotICAgICAgICAgICAgc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1sxXSA9IDA7Ci0gICAgICAgICAgICBzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzJdID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHNoLT5uYl9yZWZzW0wwXSA9IHNoLT5uYl9yZWZzW0wxXSA9IDA7Ci0gICAgICAgIGlmIChzaC0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFIHx8IHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKLSAgICAgICAgICAgIGludCBuYl9yZWZzOwotCi0gICAgICAgICAgICBzaC0+bmJfcmVmc1tMMF0gPSBzLT5wcy5wcHMtPm51bV9yZWZfaWR4X2wwX2RlZmF1bHRfYWN0aXZlOwotICAgICAgICAgICAgaWYgKHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UpCi0gICAgICAgICAgICAgICAgc2gtPm5iX3JlZnNbTDFdID0gcy0+cHMucHBzLT5udW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZTsKLQotICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsgLy8gbnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcKLSAgICAgICAgICAgICAgICBzaC0+bmJfcmVmc1tMMF0gPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMTsKLSAgICAgICAgICAgICAgICBpZiAoc2gtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkKLSAgICAgICAgICAgICAgICAgICAgc2gtPm5iX3JlZnNbTDFdID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2gtPm5iX3JlZnNbTDBdID4gTUFYX1JFRlMgfHwgc2gtPm5iX3JlZnNbTDFdID4gTUFYX1JFRlMpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IHJlZnM6ICVkLyVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgc2gtPm5iX3JlZnNbTDBdLCBzaC0+bmJfcmVmc1tMMV0pOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaC0+cnBsX21vZGlmaWNhdGlvbl9mbGFnWzBdID0gMDsKLSAgICAgICAgICAgIHNoLT5ycGxfbW9kaWZpY2F0aW9uX2ZsYWdbMV0gPSAwOwotICAgICAgICAgICAgbmJfcmVmcyA9IGZmX2hldmNfZnJhbWVfbmJfcmVmcyhzKTsKLSAgICAgICAgICAgIGlmICghbmJfcmVmcykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiWmVybyByZWZzIGZvciBhIGZyYW1lIHdpdGggUCBvciBCIHNsaWNlcy5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocy0+cHMucHBzLT5saXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnICYmIG5iX3JlZnMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgc2gtPnJwbF9tb2RpZmljYXRpb25fZmxhZ1swXSA9IGdldF9iaXRzMShnYik7Ci0gICAgICAgICAgICAgICAgaWYgKHNoLT5ycGxfbW9kaWZpY2F0aW9uX2ZsYWdbMF0pIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNoLT5uYl9yZWZzW0wwXTsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgc2gtPmxpc3RfZW50cnlfbHhbMF1baV0gPSBnZXRfYml0cyhnYiwgYXZfY2VpbF9sb2cyKG5iX3JlZnMpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2gtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSkgewotICAgICAgICAgICAgICAgICAgICBzaC0+cnBsX21vZGlmaWNhdGlvbl9mbGFnWzFdID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNoLT5ycGxfbW9kaWZpY2F0aW9uX2ZsYWdbMV0gPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaC0+bmJfcmVmc1tMMV07IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaC0+bGlzdF9lbnRyeV9seFsxXVtpXSA9IGdldF9iaXRzKGdiLCBhdl9jZWlsX2xvZzIobmJfcmVmcykpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UpCi0gICAgICAgICAgICAgICAgc2gtPm12ZF9sMV96ZXJvX2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotCi0gICAgICAgICAgICBpZiAocy0+cHMucHBzLT5jYWJhY19pbml0X3ByZXNlbnRfZmxhZykKLSAgICAgICAgICAgICAgICBzaC0+Y2FiYWNfaW5pdF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzaC0+Y2FiYWNfaW5pdF9mbGFnID0gMDsKLQotICAgICAgICAgICAgc2gtPmNvbGxvY2F0ZWRfcmVmX2lkeCA9IDA7Ci0gICAgICAgICAgICBpZiAoc2gtPnNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBzaC0+Y29sbG9jYXRlZF9saXN0ID0gTDA7Ci0gICAgICAgICAgICAgICAgaWYgKHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UpCi0gICAgICAgICAgICAgICAgICAgIHNoLT5jb2xsb2NhdGVkX2xpc3QgPSAhZ2V0X2JpdHMxKGdiKTsKLQotICAgICAgICAgICAgICAgIGlmIChzaC0+bmJfcmVmc1tzaC0+Y29sbG9jYXRlZF9saXN0XSA+IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgc2gtPmNvbGxvY2F0ZWRfcmVmX2lkeCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzaC0+Y29sbG9jYXRlZF9yZWZfaWR4ID49IHNoLT5uYl9yZWZzW3NoLT5jb2xsb2NhdGVkX2xpc3RdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb2xsb2NhdGVkX3JlZl9pZHg6ICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaC0+Y29sbG9jYXRlZF9yZWZfaWR4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoKHMtPnBzLnBwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnICAgJiYgc2gtPnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgfHwKLSAgICAgICAgICAgICAgICAocy0+cHMucHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZyAmJiBzaC0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSkgewotICAgICAgICAgICAgICAgIHByZWRfd2VpZ2h0X3RhYmxlKHMsIGdiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2gtPm1heF9udW1fbWVyZ2VfY2FuZCA9IDUgLSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOwotICAgICAgICAgICAgaWYgKHNoLT5tYXhfbnVtX21lcmdlX2NhbmQgPCAxIHx8IHNoLT5tYXhfbnVtX21lcmdlX2NhbmQgPiA1KSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBtZXJnaW5nIE1WUCBjYW5kaWRhdGVzOiAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNoLT5tYXhfbnVtX21lcmdlX2NhbmQpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc2gtPnNsaWNlX3FwX2RlbHRhID0gZ2V0X3NlX2dvbG9tYihnYik7Ci0KLSAgICAgICAgaWYgKHMtPnBzLnBwcy0+cGljX3NsaWNlX2xldmVsX2Nocm9tYV9xcF9vZmZzZXRzX3ByZXNlbnRfZmxhZykgewotICAgICAgICAgICAgc2gtPnNsaWNlX2NiX3FwX29mZnNldCA9IGdldF9zZV9nb2xvbWIoZ2IpOwotICAgICAgICAgICAgc2gtPnNsaWNlX2NyX3FwX29mZnNldCA9IGdldF9zZV9nb2xvbWIoZ2IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2gtPnNsaWNlX2NiX3FwX29mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaC0+c2xpY2VfY3JfcXBfb2Zmc2V0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5wcy5wcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9lbmFibGVkX2ZsYWcpCi0gICAgICAgICAgICBzaC0+Y3VfY2hyb21hX3FwX29mZnNldF9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzaC0+Y3VfY2hyb21hX3FwX29mZnNldF9lbmFibGVkX2ZsYWcgPSAwOwotCi0gICAgICAgIGlmIChzLT5wcy5wcHMtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgICAgICBpbnQgZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZmxhZyA9IDA7Ci0KLSAgICAgICAgICAgIGlmIChzLT5wcy5wcHMtPmRlYmxvY2tpbmdfZmlsdGVyX292ZXJyaWRlX2VuYWJsZWRfZmxhZykKLSAgICAgICAgICAgICAgICBkZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKLQotICAgICAgICAgICAgaWYgKGRlYmxvY2tpbmdfZmlsdGVyX292ZXJyaWRlX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBzaC0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgICAgICAgICBpZiAoIXNoLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICAgICAgc2gtPmJldGFfb2Zmc2V0ID0gZ2V0X3NlX2dvbG9tYihnYikgKiAyOwotICAgICAgICAgICAgICAgICAgICBzaC0+dGNfb2Zmc2V0ICAgPSBnZXRfc2VfZ29sb21iKGdiKSAqIDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzaC0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnID0gcy0+cHMucHBzLT5kaXNhYmxlX2RiZjsKLSAgICAgICAgICAgICAgICBzaC0+YmV0YV9vZmZzZXQgICAgICAgICAgICAgICAgICAgID0gcy0+cHMucHBzLT5iZXRhX29mZnNldDsKLSAgICAgICAgICAgICAgICBzaC0+dGNfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgID0gcy0+cHMucHBzLT50Y19vZmZzZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaC0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnID0gMDsKLSAgICAgICAgICAgIHNoLT5iZXRhX29mZnNldCAgICAgICAgICAgICAgICAgICAgPSAwOwotICAgICAgICAgICAgc2gtPnRjX29mZnNldCAgICAgICAgICAgICAgICAgICAgICA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocy0+cHMucHBzLT5zZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgJiYKLSAgICAgICAgICAgIChzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzBdIHx8Ci0gICAgICAgICAgICAgc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1sxXSB8fAotICAgICAgICAgICAgICFzaC0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKSkgewotICAgICAgICAgICAgc2gtPnNsaWNlX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNoLT5zbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZyA9IHMtPnBzLnBwcy0+c2VxX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghcy0+c2xpY2VfaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmRlcGVuZGVudCBzbGljZSBzZWdtZW50IG1pc3NpbmcuXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotCi0gICAgc2gtPm51bV9lbnRyeV9wb2ludF9vZmZzZXRzID0gMDsKLSAgICBpZiAocy0+cHMucHBzLT50aWxlc19lbmFibGVkX2ZsYWcgfHwgcy0+cHMucHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykgewotICAgICAgICB1bnNpZ25lZCBudW1fZW50cnlfcG9pbnRfb2Zmc2V0cyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7Ci0gICAgICAgIC8vIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGJvdW5kIHRoaXMgdGlnaHRlciBidXQgdGhpcyBoZXJlIGlzIHNpbXBsZXIKLSAgICAgICAgaWYgKG51bV9lbnRyeV9wb2ludF9vZmZzZXRzID4gZ2V0X2JpdHNfbGVmdChnYikpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibnVtX2VudHJ5X3BvaW50X29mZnNldHMgJWQgaXMgaW52YWxpZFxuIiwgbnVtX2VudHJ5X3BvaW50X29mZnNldHMpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLQotICAgICAgICBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMgPSBudW1fZW50cnlfcG9pbnRfb2Zmc2V0czsKLSAgICAgICAgaWYgKHNoLT5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyA+IDApIHsKLSAgICAgICAgICAgIGludCBvZmZzZXRfbGVuID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7Ci0KLSAgICAgICAgICAgIGlmIChvZmZzZXRfbGVuIDwgMSB8fCBvZmZzZXRfbGVuID4gMzIpIHsKLSAgICAgICAgICAgICAgICBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMgPSAwOwotICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAib2Zmc2V0X2xlbiAlZCBpcyBpbnZhbGlkXG4iLCBvZmZzZXRfbGVuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXZfZnJlZXAoJnNoLT5lbnRyeV9wb2ludF9vZmZzZXQpOwotICAgICAgICAgICAgYXZfZnJlZXAoJnNoLT5vZmZzZXQpOwotICAgICAgICAgICAgYXZfZnJlZXAoJnNoLT5zaXplKTsKLSAgICAgICAgICAgIHNoLT5lbnRyeV9wb2ludF9vZmZzZXQgPSBhdl9tYWxsb2NfYXJyYXkoc2gtPm51bV9lbnRyeV9wb2ludF9vZmZzZXRzLCBzaXplb2YodW5zaWduZWQpKTsKLSAgICAgICAgICAgIHNoLT5vZmZzZXQgPSBhdl9tYWxsb2NfYXJyYXkoc2gtPm51bV9lbnRyeV9wb2ludF9vZmZzZXRzLCBzaXplb2YoaW50KSk7Ci0gICAgICAgICAgICBzaC0+c2l6ZSA9IGF2X21hbGxvY19hcnJheShzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMsIHNpemVvZihpbnQpKTsKLSAgICAgICAgICAgIGlmICghc2gtPmVudHJ5X3BvaW50X29mZnNldCB8fCAhc2gtPm9mZnNldCB8fCAhc2gtPnNpemUpIHsKLSAgICAgICAgICAgICAgICBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMgPSAwOwotICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHM7IGkrKykgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbCA9IGdldF9iaXRzX2xvbmcoZ2IsIG9mZnNldF9sZW4pOwotICAgICAgICAgICAgICAgIHNoLT5lbnRyeV9wb2ludF9vZmZzZXRbaV0gPSB2YWwgKyAxOyAvLyArMTsgLy8gKzEgdG8gZ2V0IHRoZSBzaXplCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy0+dGhyZWFkc19udW1iZXIgPiAxICYmIChzLT5wcy5wcHMtPm51bV90aWxlX3Jvd3MgPiAxIHx8IHMtPnBzLnBwcy0+bnVtX3RpbGVfY29sdW1ucyA+IDEpKSB7Ci0gICAgICAgICAgICAgICAgcy0+ZW5hYmxlX3BhcmFsbGVsX3RpbGVzID0gMDsgLy8gVE9ETzogeW91IGNhbiBlbmFibGUgdGlsZXMgaW4gcGFyYWxsZWwgaGVyZQotICAgICAgICAgICAgICAgIHMtPnRocmVhZHNfbnVtYmVyID0gMTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHMtPmVuYWJsZV9wYXJhbGxlbF90aWxlcyA9IDA7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgcy0+ZW5hYmxlX3BhcmFsbGVsX3RpbGVzID0gMDsKLSAgICB9Ci0KLSAgICBpZiAocy0+cHMucHBzLT5zbGljZV9oZWFkZXJfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZykgewotICAgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKLSAgICAgICAgaWYgKGxlbmd0aCo4TEwgPiBnZXRfYml0c19sZWZ0KGdiKSkgewotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0b28gbWFueSBzbGljZV9oZWFkZXJfZXh0ZW5zaW9uX2RhdGFfYnl0ZXNcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQotICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsgIC8vIHNsaWNlX2hlYWRlcl9leHRlbnNpb25fZGF0YV9ieXRlCi0gICAgfQotCi0gICAgLy8gSW5mZXJyZWQgcGFyYW1ldGVycwotICAgIHNoLT5zbGljZV9xcCA9IDI2VSArIHMtPnBzLnBwcy0+cGljX2luaXRfcXBfbWludXMyNiArIHNoLT5zbGljZV9xcF9kZWx0YTsKLSAgICBpZiAoc2gtPnNsaWNlX3FwID4gNTEgfHwKLSAgICAgICAgc2gtPnNsaWNlX3FwIDwgLXMtPnBzLnNwcy0+cXBfYmRfb2Zmc2V0KSB7Ci0gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlRoZSBzbGljZV9xcCAlZCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSAiCi0gICAgICAgICAgICAgICAiWyVkLCA1MV0uXG4iLAotICAgICAgICAgICAgICAgc2gtPnNsaWNlX3FwLAotICAgICAgICAgICAgICAgLXMtPnBzLnNwcy0+cXBfYmRfb2Zmc2V0KTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotCi0gICAgc2gtPnNsaWNlX2N0Yl9hZGRyX3JzID0gc2gtPnNsaWNlX3NlZ21lbnRfYWRkcjsKLQotICAgIGlmICghcy0+c2guc2xpY2VfY3RiX2FkZHJfcnMgJiYgcy0+c2guZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZykgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkltcG9zc2libGUgc2xpY2Ugc2VnbWVudC5cbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIk92ZXJyZWFkIHNsaWNlIGhlYWRlciBieSAlZCBiaXRzXG4iLCAtZ2V0X2JpdHNfbGVmdChnYikpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICBzLT5IRVZDbGMtPmZpcnN0X3FwX2dyb3VwID0gIXMtPnNoLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWc7Ci0KLSAgICBpZiAoIXMtPnBzLnBwcy0+Y3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnKQotICAgICAgICBzLT5IRVZDbGMtPnFwX3kgPSBzLT5zaC5zbGljZV9xcDsKLQotICAgIHMtPnNsaWNlX2luaXRpYWxpemVkID0gMTsKLSAgICBzLT5IRVZDbGMtPnR1LmN1X3FwX29mZnNldF9jYiA9IDA7Ci0gICAgcy0+SEVWQ2xjLT50dS5jdV9xcF9vZmZzZXRfY3IgPSAwOwotCi0gICAgcy0+bm9fcmFzbF9vdXRwdXRfZmxhZyA9IElTX0lEUihzKSB8fCBJU19CTEEocykgfHwgKHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX0NSQV9OVVQgJiYgcy0+bGFzdF9lb3MpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgQ1RCKHRhYiwgeCwgeSkgKCh0YWIpWyh5KSAqIHMtPnBzLnNwcy0+Y3RiX3dpZHRoICsgKHgpXSkKLQotI2RlZmluZSBTRVRfU0FPKGVsZW0sIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1kbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIXNhb19tZXJnZV91cF9mbGFnICYmICFzYW9fbWVyZ2VfbGVmdF9mbGFnKSAgICAgXAotICAgICAgICBzYW8tPmVsZW0gPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSBpZiAoc2FvX21lcmdlX2xlZnRfZmxhZykgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc2FvLT5lbGVtID0gQ1RCKHMtPnNhbywgcngtMSwgcnkpLmVsZW07ICAgICAgICAgXAotICAgIGVsc2UgaWYgKHNhb19tZXJnZV91cF9mbGFnKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHNhby0+ZWxlbSA9IENUQihzLT5zYW8sIHJ4LCByeS0xKS5lbGVtOyAgICAgICAgIFwKLSAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzYW8tPmVsZW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi1zdGF0aWMgdm9pZCBobHNfc2FvX3BhcmFtKEhFVkNDb250ZXh0ICpzLCBpbnQgcngsIGludCByeSkKLXsKLSAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyAgICA9IHMtPkhFVkNsYzsKLSAgICBpbnQgc2FvX21lcmdlX2xlZnRfZmxhZyA9IDA7Ci0gICAgaW50IHNhb19tZXJnZV91cF9mbGFnICAgPSAwOwotICAgIFNBT1BhcmFtcyAqc2FvICAgICAgICAgID0gJkNUQihzLT5zYW8sIHJ4LCByeSk7Ci0gICAgaW50IGNfaWR4LCBpOwotCi0gICAgaWYgKHMtPnNoLnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1swXSB8fAotICAgICAgICBzLT5zaC5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMV0pIHsKLSAgICAgICAgaWYgKHJ4ID4gMCkgewotICAgICAgICAgICAgaWYgKGxjLT5jdGJfbGVmdF9mbGFnKQotICAgICAgICAgICAgICAgIHNhb19tZXJnZV9sZWZ0X2ZsYWcgPSBmZl9oZXZjX3Nhb19tZXJnZV9mbGFnX2RlY29kZShzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocnkgPiAwICYmICFzYW9fbWVyZ2VfbGVmdF9mbGFnKSB7Ci0gICAgICAgICAgICBpZiAobGMtPmN0Yl91cF9mbGFnKQotICAgICAgICAgICAgICAgIHNhb19tZXJnZV91cF9mbGFnID0gZmZfaGV2Y19zYW9fbWVyZ2VfZmxhZ19kZWNvZGUocyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGNfaWR4ID0gMDsgY19pZHggPCAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA/IDMgOiAxKTsgY19pZHgrKykgewotICAgICAgICBpbnQgbG9nMl9zYW9fb2Zmc2V0X3NjYWxlID0gY19pZHggPT0gMCA/IHMtPnBzLnBwcy0+bG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2x1bWEgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBzLnBwcy0+bG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2Nocm9tYTsKLQotICAgICAgICBpZiAoIXMtPnNoLnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1tjX2lkeF0pIHsKLSAgICAgICAgICAgIHNhby0+dHlwZV9pZHhbY19pZHhdID0gU0FPX05PVF9BUFBMSUVEOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY19pZHggPT0gMikgewotICAgICAgICAgICAgc2FvLT50eXBlX2lkeFsyXSA9IHNhby0+dHlwZV9pZHhbMV07Ci0gICAgICAgICAgICBzYW8tPmVvX2NsYXNzWzJdID0gc2FvLT5lb19jbGFzc1sxXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNFVF9TQU8odHlwZV9pZHhbY19pZHhdLCBmZl9oZXZjX3Nhb190eXBlX2lkeF9kZWNvZGUocykpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNhby0+dHlwZV9pZHhbY19pZHhdID09IFNBT19OT1RfQVBQTElFRCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICBTRVRfU0FPKG9mZnNldF9hYnNbY19pZHhdW2ldLCBmZl9oZXZjX3Nhb19vZmZzZXRfYWJzX2RlY29kZShzKSk7Ci0KLSAgICAgICAgaWYgKHNhby0+dHlwZV9pZHhbY19pZHhdID09IFNBT19CQU5EKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNhby0+b2Zmc2V0X2Fic1tjX2lkeF1baV0pIHsKLSAgICAgICAgICAgICAgICAgICAgU0VUX1NBTyhvZmZzZXRfc2lnbltjX2lkeF1baV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19zYW9fb2Zmc2V0X3NpZ25fZGVjb2RlKHMpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzYW8tPm9mZnNldF9zaWduW2NfaWR4XVtpXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgU0VUX1NBTyhiYW5kX3Bvc2l0aW9uW2NfaWR4XSwgZmZfaGV2Y19zYW9fYmFuZF9wb3NpdGlvbl9kZWNvZGUocykpOwotICAgICAgICB9IGVsc2UgaWYgKGNfaWR4ICE9IDIpIHsKLSAgICAgICAgICAgIFNFVF9TQU8oZW9fY2xhc3NbY19pZHhdLCBmZl9oZXZjX3Nhb19lb19jbGFzc19kZWNvZGUocykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSW5mZXJyZWQgcGFyYW1ldGVycwotICAgICAgICBzYW8tPm9mZnNldF92YWxbY19pZHhdWzBdID0gMDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgc2FvLT5vZmZzZXRfdmFsW2NfaWR4XVtpICsgMV0gPSBzYW8tPm9mZnNldF9hYnNbY19pZHhdW2ldOwotICAgICAgICAgICAgaWYgKHNhby0+dHlwZV9pZHhbY19pZHhdID09IFNBT19FREdFKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGkgPiAxKQotICAgICAgICAgICAgICAgICAgICBzYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXSA9IC1zYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc2FvLT5vZmZzZXRfc2lnbltjX2lkeF1baV0pIHsKLSAgICAgICAgICAgICAgICBzYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXSA9IC1zYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhby0+b2Zmc2V0X3ZhbFtjX2lkeF1baSArIDFdICo9IDEgPDwgbG9nMl9zYW9fb2Zmc2V0X3NjYWxlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0jdW5kZWYgU0VUX1NBTwotI3VuZGVmIENUQgotCi1zdGF0aWMgaW50IGhsc19jcm9zc19jb21wb25lbnRfcHJlZChIRVZDQ29udGV4dCAqcywgaW50IGlkeCkgewotICAgIEhFVkNMb2NhbENvbnRleHQgKmxjICAgID0gcy0+SEVWQ2xjOwotICAgIGludCBsb2cyX3Jlc19zY2FsZV9hYnNfcGx1czEgPSBmZl9oZXZjX2xvZzJfcmVzX3NjYWxlX2FicyhzLCBpZHgpOwotCi0gICAgaWYgKGxvZzJfcmVzX3NjYWxlX2Fic19wbHVzMSAhPSAgMCkgewotICAgICAgICBpbnQgcmVzX3NjYWxlX3NpZ25fZmxhZyA9IGZmX2hldmNfcmVzX3NjYWxlX3NpZ25fZmxhZyhzLCBpZHgpOwotICAgICAgICBsYy0+dHUucmVzX3NjYWxlX3ZhbCA9ICgxIDw8IChsb2cyX3Jlc19zY2FsZV9hYnNfcGx1czEgLSAxKSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIC0gMiAqIHJlc19zY2FsZV9zaWduX2ZsYWcpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGxjLT50dS5yZXNfc2NhbGVfdmFsID0gMDsKLSAgICB9Ci0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhsc190cmFuc2Zvcm1fdW5pdChIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeEJhc2UsIGludCB5QmFzZSwgaW50IGNiX3hCYXNlLCBpbnQgY2JfeUJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgbG9nMl90cmFmb19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa19pZHgsIGludCBjYmZfbHVtYSwgaW50ICpjYmZfY2IsIGludCAqY2JmX2NyKQotewotICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOwotICAgIGNvbnN0IGludCBsb2cyX3RyYWZvX3NpemVfYyA9IGxvZzJfdHJhZm9fc2l6ZSAtIHMtPnBzLnNwcy0+aHNoaWZ0WzFdOwotICAgIGludCBpOwotCi0gICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgewotICAgICAgICBpbnQgdHJhZm9fc2l6ZSA9IDEgPDwgbG9nMl90cmFmb19zaXplOwotICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHgwLCB5MCwgdHJhZm9fc2l6ZSwgdHJhZm9fc2l6ZSk7Ci0KLSAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplIC0gMl0ocywgeDAsIHkwLCAwKTsKLSAgICB9Ci0KLSAgICBpZiAoY2JmX2x1bWEgfHwgY2JmX2NiWzBdIHx8IGNiZl9jclswXSB8fAotICAgICAgICAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmIChjYmZfY2JbMV0gfHwgY2JmX2NyWzFdKSkpIHsKLSAgICAgICAgaW50IHNjYW5faWR4ICAgPSBTQ0FOX0RJQUc7Ci0gICAgICAgIGludCBzY2FuX2lkeF9jID0gU0NBTl9ESUFHOwotICAgICAgICBpbnQgY2JmX2Nocm9tYSA9IGNiZl9jYlswXSB8fCBjYmZfY3JbMF0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGNiZl9jYlsxXSB8fCBjYmZfY3JbMV0pKTsKLQotICAgICAgICBpZiAocy0+cHMucHBzLT5jdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWcgJiYgIWxjLT50dS5pc19jdV9xcF9kZWx0YV9jb2RlZCkgewotICAgICAgICAgICAgbGMtPnR1LmN1X3FwX2RlbHRhID0gZmZfaGV2Y19jdV9xcF9kZWx0YV9hYnMocyk7Ci0gICAgICAgICAgICBpZiAobGMtPnR1LmN1X3FwX2RlbHRhICE9IDApCi0gICAgICAgICAgICAgICAgaWYgKGZmX2hldmNfY3VfcXBfZGVsdGFfc2lnbl9mbGFnKHMpID09IDEpCi0gICAgICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9kZWx0YSA9IC1sYy0+dHUuY3VfcXBfZGVsdGE7Ci0gICAgICAgICAgICBsYy0+dHUuaXNfY3VfcXBfZGVsdGFfY29kZWQgPSAxOwotCi0gICAgICAgICAgICBpZiAobGMtPnR1LmN1X3FwX2RlbHRhIDwgLSgyNiArIHMtPnBzLnNwcy0+cXBfYmRfb2Zmc2V0IC8gMikgfHwKLSAgICAgICAgICAgICAgICBsYy0+dHUuY3VfcXBfZGVsdGEgPiAgKDI1ICsgcy0+cHMuc3BzLT5xcF9iZF9vZmZzZXQgLyAyKSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGN1X3FwX2RlbHRhICVkIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlICIKLSAgICAgICAgICAgICAgICAgICAgICAgIlslZCwgJWRdLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgbGMtPnR1LmN1X3FwX2RlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAtKDI2ICsgcy0+cHMuc3BzLT5xcF9iZF9vZmZzZXQgLyAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICgyNSArIHMtPnBzLnNwcy0+cXBfYmRfb2Zmc2V0IC8gMikpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmZl9oZXZjX3NldF9xUHkocywgY2JfeEJhc2UsIGNiX3lCYXNlLCBsb2cyX2NiX3NpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHMtPnNoLmN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnICYmIGNiZl9jaHJvbWEgJiYKLSAgICAgICAgICAgICFsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZyAgJiYgICFsYy0+dHUuaXNfY3VfY2hyb21hX3FwX29mZnNldF9jb2RlZCkgewotICAgICAgICAgICAgaW50IGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZyA9IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9mbGFnKHMpOwotICAgICAgICAgICAgaWYgKGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZykgewotICAgICAgICAgICAgICAgIGludCBjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeCAgPSAwOwotICAgICAgICAgICAgICAgIGlmIChzLT5wcy5wcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9sZW5fbWludXMxID4gMCkgewotICAgICAgICAgICAgICAgICAgICBjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeCA9IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9pZHgocyk7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgImN1X2Nocm9tYV9xcF9vZmZzZXRfaWR4IG5vdCB5ZXQgdGVzdGVkLlxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY2IgPSBzLT5wcy5wcHMtPmNiX3FwX29mZnNldF9saXN0W2N1X2Nocm9tYV9xcF9vZmZzZXRfaWR4XTsKLSAgICAgICAgICAgICAgICBsYy0+dHUuY3VfcXBfb2Zmc2V0X2NyID0gcy0+cHMucHBzLT5jcl9xcF9vZmZzZXRfbGlzdFtjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeF07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY2IgPSAwOwotICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY3IgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGMtPnR1LmlzX2N1X2Nocm9tYV9xcF9vZmZzZXRfY29kZWQgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSAmJiBsb2cyX3RyYWZvX3NpemUgPCA0KSB7Ci0gICAgICAgICAgICBpZiAobGMtPnR1LmludHJhX3ByZWRfbW9kZSA+PSA2ICYmCi0gICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZSA8PSAxNCkgewotICAgICAgICAgICAgICAgIHNjYW5faWR4ID0gU0NBTl9WRVJUOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlID49IDIyICYmCi0gICAgICAgICAgICAgICAgICAgICAgIGxjLT50dS5pbnRyYV9wcmVkX21vZGUgPD0gMzApIHsKLSAgICAgICAgICAgICAgICBzY2FuX2lkeCA9IFNDQU5fSE9SSVo7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPj0gIDYgJiYKLSAgICAgICAgICAgICAgICBsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPD0gMTQpIHsKLSAgICAgICAgICAgICAgICBzY2FuX2lkeF9jID0gU0NBTl9WRVJUOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPj0gMjIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jIDw9IDMwKSB7Ci0gICAgICAgICAgICAgICAgc2Nhbl9pZHhfYyA9IFNDQU5fSE9SSVo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBsYy0+dHUuY3Jvc3NfcGYgPSAwOwotCi0gICAgICAgIGlmIChjYmZfbHVtYSkKLSAgICAgICAgICAgIGZmX2hldmNfaGxzX3Jlc2lkdWFsX2NvZGluZyhzLCB4MCwgeTAsIGxvZzJfdHJhZm9fc2l6ZSwgc2Nhbl9pZHgsIDApOwotICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAmJiAobG9nMl90cmFmb19zaXplID4gMiB8fCBzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpKSB7Ci0gICAgICAgICAgICBpbnQgdHJhZm9fc2l6ZV9oID0gMSA8PCAobG9nMl90cmFmb19zaXplX2MgKyBzLT5wcy5zcHMtPmhzaGlmdFsxXSk7Ci0gICAgICAgICAgICBpbnQgdHJhZm9fc2l6ZV92ID0gMSA8PCAobG9nMl90cmFmb19zaXplX2MgKyBzLT5wcy5zcHMtPnZzaGlmdFsxXSk7Ci0gICAgICAgICAgICBsYy0+dHUuY3Jvc3NfcGYgID0gKHMtPnBzLnBwcy0+Y3Jvc3NfY29tcG9uZW50X3ByZWRpY3Rpb25fZW5hYmxlZF9mbGFnICYmIGNiZl9sdW1hICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5URVIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYy0+dHUuY2hyb21hX21vZGVfYyA9PSAgNCkpKTsKLQotICAgICAgICAgICAgaWYgKGxjLT50dS5jcm9zc19wZikgewotICAgICAgICAgICAgICAgIGhsc19jcm9zc19jb21wb25lbnRfcHJlZChzLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyID8gMiA6IDEpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUocywgeDAsIHkwICsgKGkgPDwgbG9nMl90cmFmb19zaXplX2MpLCB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZV9jIC0gMl0ocywgeDAsIHkwICsgKGkgPDwgbG9nMl90cmFmb19zaXplX2MpLCAxKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNiZl9jYltpXSkKLSAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19obHNfcmVzaWR1YWxfY29kaW5nKHMsIHgwLCB5MCArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZV9jKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfdHJhZm9fc2l6ZV9jLCBzY2FuX2lkeF9jLCAxKTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChsYy0+dHUuY3Jvc3NfcGYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUgPSBzLT5mcmFtZS0+bGluZXNpemVbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHNoaWZ0ID0gcy0+cHMuc3BzLT5oc2hpZnRbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnNoaWZ0ID0gcy0+cHMuc3BzLT52c2hpZnRbMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpjb2VmZnNfeSA9IChpbnQxNl90KilsYy0+ZWRnZV9lbXVfYnVmZmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqY29lZmZzICAgPSAoaW50MTZfdCopbGMtPmVkZ2VfZW11X2J1ZmZlcjI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDEgPDwgbG9nMl90cmFmb19zaXplX2M7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9ICZzLT5mcmFtZS0+ZGF0YVsxXVsoeTAgPj4gdnNoaWZ0KSAqIHN0cmlkZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeDAgPj4gaHNoaWZ0KSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemUgKiBzaXplKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzW2ldID0gKChsYy0+dHUucmVzX3NjYWxlX3ZhbCAqIGNvZWZmc195W2ldKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhldmNkc3AudHJhbnNmb3JtX2FkZFtsb2cyX3RyYWZvX3NpemVfYy0yXShkc3QsIGNvZWZmcywgc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobGMtPnR1LmNyb3NzX3BmKSB7Ci0gICAgICAgICAgICAgICAgaGxzX2Nyb3NzX2NvbXBvbmVudF9wcmVkKHMsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIgPyAyIDogMSk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5UUkEpIHsKLSAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4MCwgeTAgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemVfYyksIHRyYWZvX3NpemVfaCwgdHJhZm9fc2l6ZV92KTsKLSAgICAgICAgICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplX2MgLSAyXShzLCB4MCwgeTAgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemVfYyksIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2JmX2NyW2ldKQotICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2hsc19yZXNpZHVhbF9jb2RpbmcocywgeDAsIHkwICsgKGkgPDwgbG9nMl90cmFmb19zaXplX2MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMl90cmFmb19zaXplX2MsIHNjYW5faWR4X2MsIDIpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxjLT50dS5jcm9zc19wZikgewotICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSA9IHMtPmZyYW1lLT5saW5lc2l6ZVsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc2hpZnQgPSBzLT5wcy5zcHMtPmhzaGlmdFsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2c2hpZnQgPSBzLT5wcy5zcHMtPnZzaGlmdFsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvZWZmc195ID0gKGludDE2X3QqKWxjLT5lZGdlX2VtdV9idWZmZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpjb2VmZnMgICA9IChpbnQxNl90KilsYy0+ZWRnZV9lbXVfYnVmZmVyMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplID0gMSA8PCBsb2cyX3RyYWZvX3NpemVfYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gJnMtPmZyYW1lLT5kYXRhWzJdWyh5MCA+PiB2c2hpZnQpICogc3RyaWRlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgwID4+IGhzaGlmdCkgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCldOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChzaXplICogc2l6ZSk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmc1tpXSA9ICgobGMtPnR1LnJlc19zY2FsZV92YWwgKiBjb2VmZnNfeVtpXSkgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLnRyYW5zZm9ybV9hZGRbbG9nMl90cmFmb19zaXplX2MtMl0oZHN0LCBjb2VmZnMsIHN0cmlkZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjICYmIGJsa19pZHggPT0gMykgewotICAgICAgICAgICAgaW50IHRyYWZvX3NpemVfaCA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSArIDEpOwotICAgICAgICAgICAgaW50IHRyYWZvX3NpemVfdiA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSArIHMtPnBzLnNwcy0+dnNoaWZ0WzFdKTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyID8gMiA6IDEpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUocywgeEJhc2UsIHlCYXNlICsgKGkgPDwgbG9nMl90cmFmb19zaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZSAtIDJdKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksIDEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2JmX2NiW2ldKQotICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2hsc19yZXNpZHVhbF9jb2RpbmcocywgeEJhc2UsIHlCYXNlICsgKGkgPDwgbG9nMl90cmFmb19zaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfdHJhZm9fc2l6ZSwgc2Nhbl9pZHhfYywgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMiA/IDIgOiAxKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgewotICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZSAtIDJdKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksIDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY2JmX2NyW2ldKQotICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2hsc19yZXNpZHVhbF9jb2RpbmcocywgeEJhc2UsIHlCYXNlICsgKGkgPDwgbG9nMl90cmFmb19zaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfdHJhZm9fc2l6ZSwgc2Nhbl9pZHhfYywgMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgJiYgbGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBKSB7Ci0gICAgICAgIGlmIChsb2cyX3RyYWZvX3NpemUgPiAyIHx8IHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgewotICAgICAgICAgICAgaW50IHRyYWZvX3NpemVfaCA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZV9jICsgcy0+cHMuc3BzLT5oc2hpZnRbMV0pOwotICAgICAgICAgICAgaW50IHRyYWZvX3NpemVfdiA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZV9jICsgcy0+cHMuc3BzLT52c2hpZnRbMV0pOwotICAgICAgICAgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4MCwgeTAsIHRyYWZvX3NpemVfaCwgdHJhZm9fc2l6ZV92KTsKLSAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZV9jIC0gMl0ocywgeDAsIHkwLCAxKTsKLSAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZV9jIC0gMl0ocywgeDAsIHkwLCAyKTsKLSAgICAgICAgICAgIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIpIHsKLSAgICAgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHgwLCB5MCArICgxIDw8IGxvZzJfdHJhZm9fc2l6ZV9jKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWZvX3NpemVfaCwgdHJhZm9fc2l6ZV92KTsKLSAgICAgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemVfYyAtIDJdKHMsIHgwLCB5MCArICgxIDw8IGxvZzJfdHJhZm9fc2l6ZV9jKSwgMSk7Ci0gICAgICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplX2MgLSAyXShzLCB4MCwgeTAgKyAoMSA8PCBsb2cyX3RyYWZvX3NpemVfYyksIDIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGJsa19pZHggPT0gMykgewotICAgICAgICAgICAgaW50IHRyYWZvX3NpemVfaCA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSArIDEpOwotICAgICAgICAgICAgaW50IHRyYWZvX3NpemVfdiA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSArIHMtPnBzLnNwcy0+dnNoaWZ0WzFdKTsKLSAgICAgICAgICAgIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUocywgeEJhc2UsIHlCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7Ci0gICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemUgLSAyXShzLCB4QmFzZSwgeUJhc2UsIDEpOwotICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplIC0gMl0ocywgeEJhc2UsIHlCYXNlLCAyKTsKLSAgICAgICAgICAgIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIpIHsKLSAgICAgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHhCYXNlLCB5QmFzZSArICgxIDw8IChsb2cyX3RyYWZvX3NpemUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWZvX3NpemVfaCwgdHJhZm9fc2l6ZV92KTsKLSAgICAgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemUgLSAyXShzLCB4QmFzZSwgeUJhc2UgKyAoMSA8PCAobG9nMl90cmFmb19zaXplKSksIDEpOwotICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZSAtIDJdKHMsIHhCYXNlLCB5QmFzZSArICgxIDw8IChsb2cyX3RyYWZvX3NpemUpKSwgMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2RlYmxvY2tpbmdfYnlwYXNzKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwgaW50IGxvZzJfY2Jfc2l6ZSkKLXsKLSAgICBpbnQgY2Jfc2l6ZSAgICAgICAgICA9IDEgPDwgbG9nMl9jYl9zaXplOwotICAgIGludCBsb2cyX21pbl9wdV9zaXplID0gcy0+cHMuc3BzLT5sb2cyX21pbl9wdV9zaXplOwotCi0gICAgaW50IG1pbl9wdV93aWR0aCAgICAgPSBzLT5wcy5zcHMtPm1pbl9wdV93aWR0aDsKLSAgICBpbnQgeF9lbmQgPSBGRk1JTih4MCArIGNiX3NpemUsIHMtPnBzLnNwcy0+d2lkdGgpOwotICAgIGludCB5X2VuZCA9IEZGTUlOKHkwICsgY2Jfc2l6ZSwgcy0+cHMuc3BzLT5oZWlnaHQpOwotICAgIGludCBpLCBqOwotCi0gICAgZm9yIChqID0gKHkwID4+IGxvZzJfbWluX3B1X3NpemUpOyBqIDwgKHlfZW5kID4+IGxvZzJfbWluX3B1X3NpemUpOyBqKyspCi0gICAgICAgIGZvciAoaSA9ICh4MCA+PiBsb2cyX21pbl9wdV9zaXplKTsgaSA8ICh4X2VuZCA+PiBsb2cyX21pbl9wdV9zaXplKTsgaSsrKQotICAgICAgICAgICAgcy0+aXNfcGNtW2kgKyBqICogbWluX3B1X3dpZHRoXSA9IDI7Ci19Ci0KLXN0YXRpYyBpbnQgaGxzX3RyYW5zZm9ybV90cmVlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4QmFzZSwgaW50IHlCYXNlLCBpbnQgY2JfeEJhc2UsIGludCBjYl95QmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2NiX3NpemUsIGludCBsb2cyX3RyYWZvX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhZm9fZGVwdGgsIGludCBibGtfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpiYXNlX2NiZl9jYiwgY29uc3QgaW50ICpiYXNlX2NiZl9jcikKLXsKLSAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKLSAgICB1aW50OF90IHNwbGl0X3RyYW5zZm9ybV9mbGFnOwotICAgIGludCBjYmZfY2JbMl07Ci0gICAgaW50IGNiZl9jclsyXTsKLSAgICBpbnQgcmV0OwotCi0gICAgY2JmX2NiWzBdID0gYmFzZV9jYmZfY2JbMF07Ci0gICAgY2JmX2NiWzFdID0gYmFzZV9jYmZfY2JbMV07Ci0gICAgY2JmX2NyWzBdID0gYmFzZV9jYmZfY3JbMF07Ci0gICAgY2JmX2NyWzFdID0gYmFzZV9jYmZfY3JbMV07Ci0KLSAgICBpZiAobGMtPmN1LmludHJhX3NwbGl0X2ZsYWcpIHsKLSAgICAgICAgaWYgKHRyYWZvX2RlcHRoID09IDEpIHsKLSAgICAgICAgICAgIGxjLT50dS5pbnRyYV9wcmVkX21vZGUgICA9IGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbYmxrX2lkeF07Ci0gICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jW2Jsa19pZHhdOwotICAgICAgICAgICAgICAgIGxjLT50dS5jaHJvbWFfbW9kZV9jICAgICA9IGxjLT5wdS5jaHJvbWFfbW9kZV9jW2Jsa19pZHhdOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPSBsYy0+cHUuaW50cmFfcHJlZF9tb2RlX2NbMF07Ci0gICAgICAgICAgICAgICAgbGMtPnR1LmNocm9tYV9tb2RlX2MgICAgID0gbGMtPnB1LmNocm9tYV9tb2RlX2NbMF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBsYy0+dHUuaW50cmFfcHJlZF9tb2RlICAgPSBsYy0+cHUuaW50cmFfcHJlZF9tb2RlWzBdOwotICAgICAgICBsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPSBsYy0+cHUuaW50cmFfcHJlZF9tb2RlX2NbMF07Ci0gICAgICAgIGxjLT50dS5jaHJvbWFfbW9kZV9jICAgICA9IGxjLT5wdS5jaHJvbWFfbW9kZV9jWzBdOwotICAgIH0KLQotICAgIGlmIChsb2cyX3RyYWZvX3NpemUgPD0gcy0+cHMuc3BzLT5sb2cyX21heF90cmFmb19zaXplICYmCi0gICAgICAgIGxvZzJfdHJhZm9fc2l6ZSA+ICBzLT5wcy5zcHMtPmxvZzJfbWluX3RiX3NpemUgICAgJiYKLSAgICAgICAgdHJhZm9fZGVwdGggICAgIDwgbGMtPmN1Lm1heF90cmFmb19kZXB0aCAgICAgICAmJgotICAgICAgICAhKGxjLT5jdS5pbnRyYV9zcGxpdF9mbGFnICYmIHRyYWZvX2RlcHRoID09IDApKSB7Ci0gICAgICAgIHNwbGl0X3RyYW5zZm9ybV9mbGFnID0gZmZfaGV2Y19zcGxpdF90cmFuc2Zvcm1fZmxhZ19kZWNvZGUocywgbG9nMl90cmFmb19zaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgaW50ZXJfc3BsaXQgPSBzLT5wcy5zcHMtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVEVSICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5jdS5wYXJ0X21vZGUgIT0gUEFSVF8yTngyTiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19kZXB0aCA9PSAwOwotCi0gICAgICAgIHNwbGl0X3RyYW5zZm9ybV9mbGFnID0gbG9nMl90cmFmb19zaXplID4gcy0+cHMuc3BzLT5sb2cyX21heF90cmFmb19zaXplIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxjLT5jdS5pbnRyYV9zcGxpdF9mbGFnICYmIHRyYWZvX2RlcHRoID09IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfc3BsaXQ7Ci0gICAgfQotCi0gICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgJiYgKGxvZzJfdHJhZm9fc2l6ZSA+IDIgfHwgcy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSkgewotICAgICAgICBpZiAodHJhZm9fZGVwdGggPT0gMCB8fCBjYmZfY2JbMF0pIHsKLSAgICAgICAgICAgIGNiZl9jYlswXSA9IGZmX2hldmNfY2JmX2NiX2NyX2RlY29kZShzLCB0cmFmb19kZXB0aCk7Ci0gICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmICghc3BsaXRfdHJhbnNmb3JtX2ZsYWcgfHwgbG9nMl90cmFmb19zaXplID09IDMpKSB7Ci0gICAgICAgICAgICAgICAgY2JmX2NiWzFdID0gZmZfaGV2Y19jYmZfY2JfY3JfZGVjb2RlKHMsIHRyYWZvX2RlcHRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh0cmFmb19kZXB0aCA9PSAwIHx8IGNiZl9jclswXSkgewotICAgICAgICAgICAgY2JmX2NyWzBdID0gZmZfaGV2Y19jYmZfY2JfY3JfZGVjb2RlKHMsIHRyYWZvX2RlcHRoKTsKLSAgICAgICAgICAgIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIgJiYgKCFzcGxpdF90cmFuc2Zvcm1fZmxhZyB8fCBsb2cyX3RyYWZvX3NpemUgPT0gMykpIHsKLSAgICAgICAgICAgICAgICBjYmZfY3JbMV0gPSBmZl9oZXZjX2NiZl9jYl9jcl9kZWNvZGUocywgdHJhZm9fZGVwdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHNwbGl0X3RyYW5zZm9ybV9mbGFnKSB7Ci0gICAgICAgIGNvbnN0IGludCB0cmFmb19zaXplX3NwbGl0ID0gMSA8PCAobG9nMl90cmFmb19zaXplIC0gMSk7Ci0gICAgICAgIGNvbnN0IGludCB4MSA9IHgwICsgdHJhZm9fc2l6ZV9zcGxpdDsKLSAgICAgICAgY29uc3QgaW50IHkxID0geTAgKyB0cmFmb19zaXplX3NwbGl0OwotCi0jZGVmaW5lIFNVQkRJVklERSh4LCB5LCBpZHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldCA9IGhsc190cmFuc2Zvcm1fdHJlZShzLCB4LCB5LCB4MCwgeTAsIGNiX3hCYXNlLCBjYl95QmFzZSwgbG9nMl9jYl9zaXplLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfdHJhZm9fc2l6ZSAtIDEsIHRyYWZvX2RlcHRoICsgMSwgaWR4LCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2JmX2NiLCBjYmZfY3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChyZXQgPCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJldHVybiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLSAgICAgICAgU1VCRElWSURFKHgwLCB5MCwgMCk7Ci0gICAgICAgIFNVQkRJVklERSh4MSwgeTAsIDEpOwotICAgICAgICBTVUJESVZJREUoeDAsIHkxLCAyKTsKLSAgICAgICAgU1VCRElWSURFKHgxLCB5MSwgMyk7Ci0KLSN1bmRlZiBTVUJESVZJREUKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgbWluX3R1X3NpemUgICAgICA9IDEgPDwgcy0+cHMuc3BzLT5sb2cyX21pbl90Yl9zaXplOwotICAgICAgICBpbnQgbG9nMl9taW5fdHVfc2l6ZSA9IHMtPnBzLnNwcy0+bG9nMl9taW5fdGJfc2l6ZTsKLSAgICAgICAgaW50IG1pbl90dV93aWR0aCAgICAgPSBzLT5wcy5zcHMtPm1pbl90Yl93aWR0aDsKLSAgICAgICAgaW50IGNiZl9sdW1hICAgICAgICAgPSAxOwotCi0gICAgICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5UUkEgfHwgdHJhZm9fZGVwdGggIT0gMCB8fAotICAgICAgICAgICAgY2JmX2NiWzBdIHx8IGNiZl9jclswXSB8fAotICAgICAgICAgICAgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMiAmJiAoY2JmX2NiWzFdIHx8IGNiZl9jclsxXSkpKSB7Ci0gICAgICAgICAgICBjYmZfbHVtYSA9IGZmX2hldmNfY2JmX2x1bWFfZGVjb2RlKHMsIHRyYWZvX2RlcHRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldCA9IGhsc190cmFuc2Zvcm1fdW5pdChzLCB4MCwgeTAsIHhCYXNlLCB5QmFzZSwgY2JfeEJhc2UsIGNiX3lCYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMl9jYl9zaXplLCBsb2cyX3RyYWZvX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGtfaWR4LCBjYmZfbHVtYSwgY2JmX2NiLCBjYmZfY3IpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIC8vIFRPRE86IHN0b3JlIGNiZl9sdW1hIHNvbWV3aGVyZSBlbHNlCi0gICAgICAgIGlmIChjYmZfbHVtYSkgewotICAgICAgICAgICAgaW50IGksIGo7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKDEgPDwgbG9nMl90cmFmb19zaXplKTsgaSArPSBtaW5fdHVfc2l6ZSkKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKDEgPDwgbG9nMl90cmFmb19zaXplKTsgaiArPSBtaW5fdHVfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgeF90dSA9ICh4MCArIGopID4+IGxvZzJfbWluX3R1X3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGludCB5X3R1ID0gKHkwICsgaSkgPj4gbG9nMl9taW5fdHVfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgcy0+Y2JmX2x1bWFbeV90dSAqIG1pbl90dV93aWR0aCArIHhfdHVdID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzLT5zaC5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcpIHsKLSAgICAgICAgICAgIGZmX2hldmNfZGVibG9ja2luZ19ib3VuZGFyeV9zdHJlbmd0aHMocywgeDAsIHkwLCBsb2cyX3RyYWZvX3NpemUpOwotICAgICAgICAgICAgaWYgKHMtPnBzLnBwcy0+dHJhbnNxdWFudF9ieXBhc3NfZW5hYmxlX2ZsYWcgJiYKLSAgICAgICAgICAgICAgICBsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZykKLSAgICAgICAgICAgICAgICBzZXRfZGVibG9ja2luZ19ieXBhc3MocywgeDAsIHkwLCBsb2cyX3RyYWZvX3NpemUpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhsc19wY21fc2FtcGxlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwgaW50IGxvZzJfY2Jfc2l6ZSkKLXsKLSAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKLSAgICBHZXRCaXRDb250ZXh0IGdiOwotICAgIGludCBjYl9zaXplICAgPSAxIDw8IGxvZzJfY2Jfc2l6ZTsKLSAgICBpbnQgc3RyaWRlMCAgID0gcy0+ZnJhbWUtPmxpbmVzaXplWzBdOwotICAgIHVpbnQ4X3QgKmRzdDAgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beTAgKiBzdHJpZGUwICsgKHgwIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpXTsKLSAgICBpbnQgICBzdHJpZGUxID0gcy0+ZnJhbWUtPmxpbmVzaXplWzFdOwotICAgIHVpbnQ4X3QgKmRzdDEgPSAmcy0+ZnJhbWUtPmRhdGFbMV1bKHkwID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdKSAqIHN0cmlkZTEgKyAoKHgwID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzFdKSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KV07Ci0gICAgaW50ICAgc3RyaWRlMiA9IHMtPmZyYW1lLT5saW5lc2l6ZVsyXTsKLSAgICB1aW50OF90ICpkc3QyID0gJnMtPmZyYW1lLT5kYXRhWzJdWyh5MCA+PiBzLT5wcy5zcHMtPnZzaGlmdFsyXSkgKiBzdHJpZGUyICsgKCh4MCA+PiBzLT5wcy5zcHMtPmhzaGlmdFsyXSkgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCldOwotCi0gICAgaW50IGxlbmd0aCAgICAgICAgID0gY2Jfc2l6ZSAqIGNiX3NpemUgKiBzLT5wcy5zcHMtPnBjbS5iaXRfZGVwdGggKwotICAgICAgICAgICAgICAgICAgICAgICAgICgoKGNiX3NpemUgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV0pICogKGNiX3NpemUgPj4gcy0+cHMuc3BzLT52c2hpZnRbMV0pKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoY2Jfc2l6ZSA+PiBzLT5wcy5zcHMtPmhzaGlmdFsyXSkgKiAoY2Jfc2l6ZSA+PiBzLT5wcy5zcHMtPnZzaGlmdFsyXSkpKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBzLnNwcy0+cGNtLmJpdF9kZXB0aF9jaHJvbWE7Ci0gICAgY29uc3QgdWludDhfdCAqcGNtID0gc2tpcF9ieXRlcygmbGMtPmNjLCAobGVuZ3RoICsgNykgPj4gMyk7Ci0gICAgaW50IHJldDsKLQotICAgIGlmICghcy0+c2guZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKQotICAgICAgICBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKLQotICAgIHJldCA9IGluaXRfZ2V0X2JpdHMoJmdiLCBwY20sIGxlbmd0aCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBzLT5oZXZjZHNwLnB1dF9wY20oZHN0MCwgc3RyaWRlMCwgY2Jfc2l6ZSwgY2Jfc2l6ZSwgICAgICZnYiwgcy0+cHMuc3BzLT5wY20uYml0X2RlcHRoKTsKLSAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYykgewotICAgICAgICBzLT5oZXZjZHNwLnB1dF9wY20oZHN0MSwgc3RyaWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX3NpemUgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9zaXplID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdiLCBzLT5wcy5zcHMtPnBjbS5iaXRfZGVwdGhfY2hyb21hKTsKLSAgICAgICAgcy0+aGV2Y2RzcC5wdXRfcGNtKGRzdDIsIHN0cmlkZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9zaXplID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZSA+PiBzLT5wcy5zcHMtPnZzaGlmdFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZnYiwgcy0+cHMuc3BzLT5wY20uYml0X2RlcHRoX2Nocm9tYSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogOC41LjMuMi4yLjEgTHVtYSBzYW1wbGUgdW5pZGlyZWN0aW9uYWwgaW50ZXJwb2xhdGlvbiBwcm9jZXNzCi0gKgotICogQHBhcmFtIHMgSEVWQyBkZWNvZGluZyBjb250ZXh0Ci0gKiBAcGFyYW0gZHN0IHRhcmdldCBidWZmZXIgZm9yIGJsb2NrIGRhdGEgYXQgYmxvY2sgcG9zaXRpb24KLSAqIEBwYXJhbSBkc3RzdHJpZGUgc3RyaWRlIG9mIHRoZSBkc3QgYnVmZmVyCi0gKiBAcGFyYW0gcmVmIHJlZmVyZW5jZSBwaWN0dXJlIGJ1ZmZlciBhdCBvcmlnaW4gKDAsIDApCi0gKiBAcGFyYW0gbXYgbW90aW9uIHZlY3RvciAocmVsYXRpdmUgdG8gYmxvY2sgcG9zaXRpb24pIHRvIGdldCBwaXhlbCBkYXRhIGZyb20KLSAqIEBwYXJhbSB4X29mZiBob3Jpem9udGFsIHBvc2l0aW9uIG9mIGJsb2NrIGZyb20gb3JpZ2luICgwLCAwKQotICogQHBhcmFtIHlfb2ZmIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGJsb2NrIGZyb20gb3JpZ2luICgwLCAwKQotICogQHBhcmFtIGJsb2NrX3cgd2lkdGggb2YgYmxvY2sKLSAqIEBwYXJhbSBibG9ja19oIGhlaWdodCBvZiBibG9jawotICogQHBhcmFtIGx1bWFfd2VpZ2h0IHdlaWdodGluZyBmYWN0b3IgYXBwbGllZCB0byB0aGUgbHVtYSBwcmVkaWN0aW9uCi0gKiBAcGFyYW0gbHVtYV9vZmZzZXQgYWRkaXRpdmUgb2Zmc2V0IGFwcGxpZWQgdG8gdGhlIGx1bWEgcHJlZGljdGlvbiB2YWx1ZQotICovCi0KLXN0YXRpYyB2b2lkIGx1bWFfbWNfdW5pKEhFVkNDb250ZXh0ICpzLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpyZWYsIGNvbnN0IE12ICptdiwgaW50IHhfb2ZmLCBpbnQgeV9vZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfdywgaW50IGJsb2NrX2gsIGludCBsdW1hX3dlaWdodCwgaW50IGx1bWFfb2Zmc2V0KQotewotICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOwotICAgIHVpbnQ4X3QgKnNyYyAgICAgICAgID0gcmVmLT5kYXRhWzBdOwotICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUgID0gcmVmLT5saW5lc2l6ZVswXTsKLSAgICBpbnQgcGljX3dpZHRoICAgICAgICA9IHMtPnBzLnNwcy0+d2lkdGg7Ci0gICAgaW50IHBpY19oZWlnaHQgICAgICAgPSBzLT5wcy5zcHMtPmhlaWdodDsKLSAgICBpbnQgbXggICAgICAgICAgICAgICA9IG12LT54ICYgMzsKLSAgICBpbnQgbXkgICAgICAgICAgICAgICA9IG12LT55ICYgMzsKLSAgICBpbnQgd2VpZ2h0X2ZsYWcgICAgICA9IChzLT5zaC5zbGljZV90eXBlID09IFBfU0xJQ0UgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c2guc2xpY2VfdHlwZSA9PSBCX1NMSUNFICYmIHMtPnBzLnBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2ZsYWcpOwotICAgIGludCBpZHggICAgICAgICAgICAgID0gZmZfaGV2Y19wZWxfd2VpZ2h0W2Jsb2NrX3ddOwotCi0gICAgeF9vZmYgKz0gbXYtPnggPj4gMjsKLSAgICB5X29mZiArPSBtdi0+eSA+PiAyOwotICAgIHNyYyAgICs9IHlfb2ZmICogc3Jjc3RyaWRlICsgKHhfb2ZmICogKDEgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCkpOwotCi0gICAgaWYgKHhfb2ZmIDwgUVBFTF9FWFRSQV9CRUZPUkUgfHwgeV9vZmYgPCBRUEVMX0VYVFJBX0FGVEVSIHx8Ci0gICAgICAgIHhfb2ZmID49IHBpY193aWR0aCAtIGJsb2NrX3cgLSBRUEVMX0VYVFJBX0FGVEVSIHx8Ci0gICAgICAgIHlfb2ZmID49IHBpY19oZWlnaHQgLSBibG9ja19oIC0gUVBFTF9FWFRSQV9BRlRFUikgewotICAgICAgICBjb25zdCBpbnQgZWRnZV9lbXVfc3RyaWRlID0gRURHRV9FTVVfQlVGRkVSX1NUUklERSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0OwotICAgICAgICBpbnQgb2Zmc2V0ICAgICA9IFFQRUxfRVhUUkFfQkVGT1JFICogc3Jjc3RyaWRlICAgICAgICsgKFFQRUxfRVhUUkFfQkVGT1JFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpOwotICAgICAgICBpbnQgYnVmX29mZnNldCA9IFFQRUxfRVhUUkFfQkVGT1JFICogZWRnZV9lbXVfc3RyaWRlICsgKFFQRUxfRVhUUkFfQkVGT1JFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpOwotCi0gICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhsYy0+ZWRnZV9lbXVfYnVmZmVyLCBzcmMgLSBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlX2VtdV9zdHJpZGUsIHNyY3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3cgKyBRUEVMX0VYVFJBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCArIFFQRUxfRVhUUkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X29mZiAtIFFQRUxfRVhUUkFfQkVGT1JFLCB5X29mZiAtIFFQRUxfRVhUUkFfQkVGT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKLSAgICAgICAgc3JjID0gbGMtPmVkZ2VfZW11X2J1ZmZlciArIGJ1Zl9vZmZzZXQ7Ci0gICAgICAgIHNyY3N0cmlkZSA9IGVkZ2VfZW11X3N0cmlkZTsKLSAgICB9Ci0KLSAgICBpZiAoIXdlaWdodF9mbGFnKQotICAgICAgICBzLT5oZXZjZHNwLnB1dF9oZXZjX3FwZWxfdW5pW2lkeF1bISFteV1bISFteF0oZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCwgbXgsIG15LCBibG9ja193KTsKLSAgICBlbHNlCi0gICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfcXBlbF91bmlfd1tpZHhdWyEhbXldWyEhbXhdKGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCwgcy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVtYV93ZWlnaHQsIGx1bWFfb2Zmc2V0LCBteCwgbXksIGJsb2NrX3cpOwotfQotCi0vKioKLSAqIDguNS4zLjIuMi4xIEx1bWEgc2FtcGxlIGJpZGlyZWN0aW9uYWwgaW50ZXJwb2xhdGlvbiBwcm9jZXNzCi0gKgotICogQHBhcmFtIHMgSEVWQyBkZWNvZGluZyBjb250ZXh0Ci0gKiBAcGFyYW0gZHN0IHRhcmdldCBidWZmZXIgZm9yIGJsb2NrIGRhdGEgYXQgYmxvY2sgcG9zaXRpb24KLSAqIEBwYXJhbSBkc3RzdHJpZGUgc3RyaWRlIG9mIHRoZSBkc3QgYnVmZmVyCi0gKiBAcGFyYW0gcmVmMCByZWZlcmVuY2UgcGljdHVyZTAgYnVmZmVyIGF0IG9yaWdpbiAoMCwgMCkKLSAqIEBwYXJhbSBtdjAgbW90aW9uIHZlY3RvcjAgKHJlbGF0aXZlIHRvIGJsb2NrIHBvc2l0aW9uKSB0byBnZXQgcGl4ZWwgZGF0YSBmcm9tCi0gKiBAcGFyYW0geF9vZmYgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKLSAqIEBwYXJhbSB5X29mZiB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKLSAqIEBwYXJhbSBibG9ja193IHdpZHRoIG9mIGJsb2NrCi0gKiBAcGFyYW0gYmxvY2tfaCBoZWlnaHQgb2YgYmxvY2sKLSAqIEBwYXJhbSByZWYxIHJlZmVyZW5jZSBwaWN0dXJlMSBidWZmZXIgYXQgb3JpZ2luICgwLCAwKQotICogQHBhcmFtIG12MSBtb3Rpb24gdmVjdG9yMSAocmVsYXRpdmUgdG8gYmxvY2sgcG9zaXRpb24pIHRvIGdldCBwaXhlbCBkYXRhIGZyb20KLSAqIEBwYXJhbSBjdXJyZW50X212IGN1cnJlbnQgbW90aW9uIHZlY3RvciBzdHJ1Y3R1cmUKLSAqLwotIHN0YXRpYyB2b2lkIGx1bWFfbWNfYmkoSEVWQ0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqcmVmMCwgY29uc3QgTXYgKm12MCwgaW50IHhfb2ZmLCBpbnQgeV9vZmYsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja193LCBpbnQgYmxvY2tfaCwgQVZGcmFtZSAqcmVmMSwgY29uc3QgTXYgKm12MSwgc3RydWN0IE12RmllbGQgKmN1cnJlbnRfbXYpCi17Ci0gICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7Ci0gICAgcHRyZGlmZl90IHNyYzBzdHJpZGUgID0gcmVmMC0+bGluZXNpemVbMF07Ci0gICAgcHRyZGlmZl90IHNyYzFzdHJpZGUgID0gcmVmMS0+bGluZXNpemVbMF07Ci0gICAgaW50IHBpY193aWR0aCAgICAgICAgPSBzLT5wcy5zcHMtPndpZHRoOwotICAgIGludCBwaWNfaGVpZ2h0ICAgICAgID0gcy0+cHMuc3BzLT5oZWlnaHQ7Ci0gICAgaW50IG14MCAgICAgICAgICAgICAgPSBtdjAtPnggJiAzOwotICAgIGludCBteTAgICAgICAgICAgICAgID0gbXYwLT55ICYgMzsKLSAgICBpbnQgbXgxICAgICAgICAgICAgICA9IG12MS0+eCAmIDM7Ci0gICAgaW50IG15MSAgICAgICAgICAgICAgPSBtdjEtPnkgJiAzOwotICAgIGludCB3ZWlnaHRfZmxhZyAgICAgID0gKHMtPnNoLnNsaWNlX3R5cGUgPT0gUF9TTElDRSAmJiBzLT5wcy5wcHMtPndlaWdodGVkX3ByZWRfZmxhZykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zaC5zbGljZV90eXBlID09IEJfU0xJQ0UgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZyk7Ci0gICAgaW50IHhfb2ZmMCAgICAgICAgICAgPSB4X29mZiArIChtdjAtPnggPj4gMik7Ci0gICAgaW50IHlfb2ZmMCAgICAgICAgICAgPSB5X29mZiArIChtdjAtPnkgPj4gMik7Ci0gICAgaW50IHhfb2ZmMSAgICAgICAgICAgPSB4X29mZiArIChtdjEtPnggPj4gMik7Ci0gICAgaW50IHlfb2ZmMSAgICAgICAgICAgPSB5X29mZiArIChtdjEtPnkgPj4gMik7Ci0gICAgaW50IGlkeCAgICAgICAgICAgICAgPSBmZl9oZXZjX3BlbF93ZWlnaHRbYmxvY2tfd107Ci0KLSAgICB1aW50OF90ICpzcmMwICA9IHJlZjAtPmRhdGFbMF0gKyB5X29mZjAgKiBzcmMwc3RyaWRlICsgKGludCkoKHVuc2lnbmVkKXhfb2ZmMCA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKLSAgICB1aW50OF90ICpzcmMxICA9IHJlZjEtPmRhdGFbMF0gKyB5X29mZjEgKiBzcmMxc3RyaWRlICsgKGludCkoKHVuc2lnbmVkKXhfb2ZmMSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKLQotICAgIGlmICh4X29mZjAgPCBRUEVMX0VYVFJBX0JFRk9SRSB8fCB5X29mZjAgPCBRUEVMX0VYVFJBX0FGVEVSIHx8Ci0gICAgICAgIHhfb2ZmMCA+PSBwaWNfd2lkdGggLSBibG9ja193IC0gUVBFTF9FWFRSQV9BRlRFUiB8fAotICAgICAgICB5X29mZjAgPj0gcGljX2hlaWdodCAtIGJsb2NrX2ggLSBRUEVMX0VYVFJBX0FGVEVSKSB7Ci0gICAgICAgIGNvbnN0IGludCBlZGdlX2VtdV9zdHJpZGUgPSBFREdFX0VNVV9CVUZGRVJfU1RSSURFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQ7Ci0gICAgICAgIGludCBvZmZzZXQgICAgID0gUVBFTF9FWFRSQV9CRUZPUkUgKiBzcmMwc3RyaWRlICAgICAgICsgKFFQRUxfRVhUUkFfQkVGT1JFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpOwotICAgICAgICBpbnQgYnVmX29mZnNldCA9IFFQRUxfRVhUUkFfQkVGT1JFICogZWRnZV9lbXVfc3RyaWRlICsgKFFQRUxfRVhUUkFfQkVGT1JFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpOwotCi0gICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhsYy0+ZWRnZV9lbXVfYnVmZmVyLCBzcmMwIC0gb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV9lbXVfc3RyaWRlLCBzcmMwc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIFFQRUxfRVhUUkEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oICsgUVBFTF9FWFRSQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmMCAtIFFQRUxfRVhUUkFfQkVGT1JFLCB5X29mZjAgLSBRUEVMX0VYVFJBX0JFRk9SRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7Ci0gICAgICAgIHNyYzAgPSBsYy0+ZWRnZV9lbXVfYnVmZmVyICsgYnVmX29mZnNldDsKLSAgICAgICAgc3JjMHN0cmlkZSA9IGVkZ2VfZW11X3N0cmlkZTsKLSAgICB9Ci0KLSAgICBpZiAoeF9vZmYxIDwgUVBFTF9FWFRSQV9CRUZPUkUgfHwgeV9vZmYxIDwgUVBFTF9FWFRSQV9BRlRFUiB8fAotICAgICAgICB4X29mZjEgPj0gcGljX3dpZHRoIC0gYmxvY2tfdyAtIFFQRUxfRVhUUkFfQUZURVIgfHwKLSAgICAgICAgeV9vZmYxID49IHBpY19oZWlnaHQgLSBibG9ja19oIC0gUVBFTF9FWFRSQV9BRlRFUikgewotICAgICAgICBjb25zdCBpbnQgZWRnZV9lbXVfc3RyaWRlID0gRURHRV9FTVVfQlVGRkVSX1NUUklERSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0OwotICAgICAgICBpbnQgb2Zmc2V0ICAgICA9IFFQRUxfRVhUUkFfQkVGT1JFICogc3JjMXN0cmlkZSAgICAgICArIChRUEVMX0VYVFJBX0JFRk9SRSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKLSAgICAgICAgaW50IGJ1Zl9vZmZzZXQgPSBRUEVMX0VYVFJBX0JFRk9SRSAqIGVkZ2VfZW11X3N0cmlkZSArIChRUEVMX0VYVFJBX0JFRk9SRSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKLQotICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMobGMtPmVkZ2VfZW11X2J1ZmZlcjIsIHNyYzEgLSBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlX2VtdV9zdHJpZGUsIHNyYzFzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja193ICsgUVBFTF9FWFRSQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2ggKyBRUEVMX0VYVFJBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYxIC0gUVBFTF9FWFRSQV9CRUZPUkUsIHlfb2ZmMSAtIFFQRUxfRVhUUkFfQkVGT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKLSAgICAgICAgc3JjMSA9IGxjLT5lZGdlX2VtdV9idWZmZXIyICsgYnVmX29mZnNldDsKLSAgICAgICAgc3JjMXN0cmlkZSA9IGVkZ2VfZW11X3N0cmlkZTsKLSAgICB9Ci0KLSAgICBzLT5oZXZjZHNwLnB1dF9oZXZjX3FwZWxbaWR4XVshIW15MF1bISFteDBdKGxjLT50bXAsIHNyYzAsIHNyYzBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBteDAsIG15MCwgYmxvY2tfdyk7Ci0gICAgaWYgKCF3ZWlnaHRfZmxhZykKLSAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19xcGVsX2JpW2lkeF1bISFteTFdWyEhbXgxXShkc3QsIGRzdHN0cmlkZSwgc3JjMSwgc3JjMXN0cmlkZSwgbGMtPnRtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBteDEsIG15MSwgYmxvY2tfdyk7Ci0gICAgZWxzZQotICAgICAgICBzLT5oZXZjZHNwLnB1dF9oZXZjX3FwZWxfYmlfd1tpZHhdWyEhbXkxXVshIW14MV0oZHN0LCBkc3RzdHJpZGUsIHNyYzEsIHNyYzFzdHJpZGUsIGxjLT50bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBzLT5zaC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV93ZWlnaHRfbDBbY3VycmVudF9tdi0+cmVmX2lkeFswXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMVtjdXJyZW50X212LT5yZWZfaWR4WzFdXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wwW2N1cnJlbnRfbXYtPnJlZl9pZHhbMF1dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV9vZmZzZXRfbDFbY3VycmVudF9tdi0+cmVmX2lkeFsxXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteDEsIG15MSwgYmxvY2tfdyk7Ci0KLX0KLQotLyoqCi0gKiA4LjUuMy4yLjIuMiBDaHJvbWEgc2FtcGxlIHVuaXByZWRpY3Rpb24gaW50ZXJwb2xhdGlvbiBwcm9jZXNzCi0gKgotICogQHBhcmFtIHMgSEVWQyBkZWNvZGluZyBjb250ZXh0Ci0gKiBAcGFyYW0gZHN0MSB0YXJnZXQgYnVmZmVyIGZvciBibG9jayBkYXRhIGF0IGJsb2NrIHBvc2l0aW9uIChVIHBsYW5lKQotICogQHBhcmFtIGRzdDIgdGFyZ2V0IGJ1ZmZlciBmb3IgYmxvY2sgZGF0YSBhdCBibG9jayBwb3NpdGlvbiAoViBwbGFuZSkKLSAqIEBwYXJhbSBkc3RzdHJpZGUgc3RyaWRlIG9mIHRoZSBkc3QxIGFuZCBkc3QyIGJ1ZmZlcnMKLSAqIEBwYXJhbSByZWYgcmVmZXJlbmNlIHBpY3R1cmUgYnVmZmVyIGF0IG9yaWdpbiAoMCwgMCkKLSAqIEBwYXJhbSBtdiBtb3Rpb24gdmVjdG9yIChyZWxhdGl2ZSB0byBibG9jayBwb3NpdGlvbikgdG8gZ2V0IHBpeGVsIGRhdGEgZnJvbQotICogQHBhcmFtIHhfb2ZmIGhvcml6b250YWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCi0gKiBAcGFyYW0geV9vZmYgdmVydGljYWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCi0gKiBAcGFyYW0gYmxvY2tfdyB3aWR0aCBvZiBibG9jawotICogQHBhcmFtIGJsb2NrX2ggaGVpZ2h0IG9mIGJsb2NrCi0gKiBAcGFyYW0gY2hyb21hX3dlaWdodCB3ZWlnaHRpbmcgZmFjdG9yIGFwcGxpZWQgdG8gdGhlIGNocm9tYSBwcmVkaWN0aW9uCi0gKiBAcGFyYW0gY2hyb21hX29mZnNldCBhZGRpdGl2ZSBvZmZzZXQgYXBwbGllZCB0byB0aGUgY2hyb21hIHByZWRpY3Rpb24gdmFsdWUKLSAqLwotCi1zdGF0aWMgdm9pZCBjaHJvbWFfbWNfdW5pKEhFVkNDb250ZXh0ICpzLCB1aW50OF90ICpkc3QwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMwLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgcmVmbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfb2ZmLCBpbnQgeV9vZmYsIGludCBibG9ja193LCBpbnQgYmxvY2tfaCwgc3RydWN0IE12RmllbGQgKmN1cnJlbnRfbXYsIGludCBjaHJvbWFfd2VpZ2h0LCBpbnQgY2hyb21hX29mZnNldCkKLXsKLSAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKLSAgICBpbnQgcGljX3dpZHRoICAgICAgICA9IHMtPnBzLnNwcy0+d2lkdGggPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV07Ci0gICAgaW50IHBpY19oZWlnaHQgICAgICAgPSBzLT5wcy5zcHMtPmhlaWdodCA+PiBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKLSAgICBjb25zdCBNdiAqbXYgICAgICAgICA9ICZjdXJyZW50X212LT5tdltyZWZsaXN0XTsKLSAgICBpbnQgd2VpZ2h0X2ZsYWcgICAgICA9IChzLT5zaC5zbGljZV90eXBlID09IFBfU0xJQ0UgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c2guc2xpY2VfdHlwZSA9PSBCX1NMSUNFICYmIHMtPnBzLnBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2ZsYWcpOwotICAgIGludCBpZHggICAgICAgICAgICAgID0gZmZfaGV2Y19wZWxfd2VpZ2h0W2Jsb2NrX3ddOwotICAgIGludCBoc2hpZnQgICAgICAgICAgID0gcy0+cHMuc3BzLT5oc2hpZnRbMV07Ci0gICAgaW50IHZzaGlmdCAgICAgICAgICAgPSBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKLSAgICBpbnRwdHJfdCBteCAgICAgICAgICA9IGF2X21vZF91aW50cDIobXYtPngsIDIgKyBoc2hpZnQpOwotICAgIGludHB0cl90IG15ICAgICAgICAgID0gYXZfbW9kX3VpbnRwMihtdi0+eSwgMiArIHZzaGlmdCk7Ci0gICAgaW50cHRyX3QgX214ICAgICAgICAgPSBteCA8PCAoMSAtIGhzaGlmdCk7Ci0gICAgaW50cHRyX3QgX215ICAgICAgICAgPSBteSA8PCAoMSAtIHZzaGlmdCk7Ci0KLSAgICB4X29mZiArPSBtdi0+eCA+PiAoMiArIGhzaGlmdCk7Ci0gICAgeV9vZmYgKz0gbXYtPnkgPj4gKDIgKyB2c2hpZnQpOwotICAgIHNyYzAgICs9IHlfb2ZmICogc3Jjc3RyaWRlICsgKHhfb2ZmICogKDEgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCkpOwotCi0gICAgaWYgKHhfb2ZmIDwgRVBFTF9FWFRSQV9CRUZPUkUgfHwgeV9vZmYgPCBFUEVMX0VYVFJBX0FGVEVSIHx8Ci0gICAgICAgIHhfb2ZmID49IHBpY193aWR0aCAtIGJsb2NrX3cgLSBFUEVMX0VYVFJBX0FGVEVSIHx8Ci0gICAgICAgIHlfb2ZmID49IHBpY19oZWlnaHQgLSBibG9ja19oIC0gRVBFTF9FWFRSQV9BRlRFUikgewotICAgICAgICBjb25zdCBpbnQgZWRnZV9lbXVfc3RyaWRlID0gRURHRV9FTVVfQlVGRkVSX1NUUklERSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0OwotICAgICAgICBpbnQgb2Zmc2V0MCA9IEVQRUxfRVhUUkFfQkVGT1JFICogKHNyY3N0cmlkZSArICgxIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpKTsKLSAgICAgICAgaW50IGJ1Zl9vZmZzZXQwID0gRVBFTF9FWFRSQV9CRUZPUkUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAoZWRnZV9lbXVfc3RyaWRlICsgKDEgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCkpOwotICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMobGMtPmVkZ2VfZW11X2J1ZmZlciwgc3JjMCAtIG9mZnNldDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlX2VtdV9zdHJpZGUsIHNyY3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3cgKyBFUEVMX0VYVFJBLCBibG9ja19oICsgRVBFTF9FWFRSQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmIC0gRVBFTF9FWFRSQV9CRUZPUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X29mZiAtIEVQRUxfRVhUUkFfQkVGT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKLQotICAgICAgICBzcmMwID0gbGMtPmVkZ2VfZW11X2J1ZmZlciArIGJ1Zl9vZmZzZXQwOwotICAgICAgICBzcmNzdHJpZGUgPSBlZGdlX2VtdV9zdHJpZGU7Ci0gICAgfQotICAgIGlmICghd2VpZ2h0X2ZsYWcpCi0gICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfZXBlbF91bmlbaWR4XVshIW15XVshIW14XShkc3QwLCBkc3RzdHJpZGUsIHNyYzAsIHNyY3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCwgX214LCBfbXksIGJsb2NrX3cpOwotICAgIGVsc2UKLSAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19lcGVsX3VuaV93W2lkeF1bISFteV1bISFteF0oZHN0MCwgZHN0c3RyaWRlLCBzcmMwLCBzcmNzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodCwgY2hyb21hX29mZnNldCwgX214LCBfbXksIGJsb2NrX3cpOwotfQotCi0vKioKLSAqIDguNS4zLjIuMi4yIENocm9tYSBzYW1wbGUgYmlkaXJlY3Rpb25hbCBpbnRlcnBvbGF0aW9uIHByb2Nlc3MKLSAqCi0gKiBAcGFyYW0gcyBIRVZDIGRlY29kaW5nIGNvbnRleHQKLSAqIEBwYXJhbSBkc3QgdGFyZ2V0IGJ1ZmZlciBmb3IgYmxvY2sgZGF0YSBhdCBibG9jayBwb3NpdGlvbgotICogQHBhcmFtIGRzdHN0cmlkZSBzdHJpZGUgb2YgdGhlIGRzdCBidWZmZXIKLSAqIEBwYXJhbSByZWYwIHJlZmVyZW5jZSBwaWN0dXJlMCBidWZmZXIgYXQgb3JpZ2luICgwLCAwKQotICogQHBhcmFtIG12MCBtb3Rpb24gdmVjdG9yMCAocmVsYXRpdmUgdG8gYmxvY2sgcG9zaXRpb24pIHRvIGdldCBwaXhlbCBkYXRhIGZyb20KLSAqIEBwYXJhbSB4X29mZiBob3Jpem9udGFsIHBvc2l0aW9uIG9mIGJsb2NrIGZyb20gb3JpZ2luICgwLCAwKQotICogQHBhcmFtIHlfb2ZmIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGJsb2NrIGZyb20gb3JpZ2luICgwLCAwKQotICogQHBhcmFtIGJsb2NrX3cgd2lkdGggb2YgYmxvY2sKLSAqIEBwYXJhbSBibG9ja19oIGhlaWdodCBvZiBibG9jawotICogQHBhcmFtIHJlZjEgcmVmZXJlbmNlIHBpY3R1cmUxIGJ1ZmZlciBhdCBvcmlnaW4gKDAsIDApCi0gKiBAcGFyYW0gbXYxIG1vdGlvbiB2ZWN0b3IxIChyZWxhdGl2ZSB0byBibG9jayBwb3NpdGlvbikgdG8gZ2V0IHBpeGVsIGRhdGEgZnJvbQotICogQHBhcmFtIGN1cnJlbnRfbXYgY3VycmVudCBtb3Rpb24gdmVjdG9yIHN0cnVjdHVyZQotICogQHBhcmFtIGNpZHggY2hyb21hIGNvbXBvbmVudChjYiwgY3IpCi0gKi8KLXN0YXRpYyB2b2lkIGNocm9tYV9tY19iaShIRVZDQ29udGV4dCAqcywgdWludDhfdCAqZHN0MCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgQVZGcmFtZSAqcmVmMCwgQVZGcmFtZSAqcmVmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9vZmYsIGludCB5X29mZiwgaW50IGJsb2NrX3csIGludCBibG9ja19oLCBzdHJ1Y3QgTXZGaWVsZCAqY3VycmVudF9tdiwgaW50IGNpZHgpCi17Ci0gICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7Ci0gICAgdWludDhfdCAqc3JjMSAgICAgICAgPSByZWYwLT5kYXRhW2NpZHgrMV07Ci0gICAgdWludDhfdCAqc3JjMiAgICAgICAgPSByZWYxLT5kYXRhW2NpZHgrMV07Ci0gICAgcHRyZGlmZl90IHNyYzFzdHJpZGUgPSByZWYwLT5saW5lc2l6ZVtjaWR4KzFdOwotICAgIHB0cmRpZmZfdCBzcmMyc3RyaWRlID0gcmVmMS0+bGluZXNpemVbY2lkeCsxXTsKLSAgICBpbnQgd2VpZ2h0X2ZsYWcgICAgICA9IChzLT5zaC5zbGljZV90eXBlID09IFBfU0xJQ0UgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c2guc2xpY2VfdHlwZSA9PSBCX1NMSUNFICYmIHMtPnBzLnBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2ZsYWcpOwotICAgIGludCBwaWNfd2lkdGggICAgICAgID0gcy0+cHMuc3BzLT53aWR0aCA+PiBzLT5wcy5zcHMtPmhzaGlmdFsxXTsKLSAgICBpbnQgcGljX2hlaWdodCAgICAgICA9IHMtPnBzLnNwcy0+aGVpZ2h0ID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdOwotICAgIE12ICptdjAgICAgICAgICAgICAgID0gJmN1cnJlbnRfbXYtPm12WzBdOwotICAgIE12ICptdjEgICAgICAgICAgICAgID0gJmN1cnJlbnRfbXYtPm12WzFdOwotICAgIGludCBoc2hpZnQgPSBzLT5wcy5zcHMtPmhzaGlmdFsxXTsKLSAgICBpbnQgdnNoaWZ0ID0gcy0+cHMuc3BzLT52c2hpZnRbMV07Ci0KLSAgICBpbnRwdHJfdCBteDAgPSBhdl9tb2RfdWludHAyKG12MC0+eCwgMiArIGhzaGlmdCk7Ci0gICAgaW50cHRyX3QgbXkwID0gYXZfbW9kX3VpbnRwMihtdjAtPnksIDIgKyB2c2hpZnQpOwotICAgIGludHB0cl90IG14MSA9IGF2X21vZF91aW50cDIobXYxLT54LCAyICsgaHNoaWZ0KTsKLSAgICBpbnRwdHJfdCBteTEgPSBhdl9tb2RfdWludHAyKG12MS0+eSwgMiArIHZzaGlmdCk7Ci0gICAgaW50cHRyX3QgX214MCA9IG14MCA8PCAoMSAtIGhzaGlmdCk7Ci0gICAgaW50cHRyX3QgX215MCA9IG15MCA8PCAoMSAtIHZzaGlmdCk7Ci0gICAgaW50cHRyX3QgX214MSA9IG14MSA8PCAoMSAtIGhzaGlmdCk7Ci0gICAgaW50cHRyX3QgX215MSA9IG15MSA8PCAoMSAtIHZzaGlmdCk7Ci0KLSAgICBpbnQgeF9vZmYwID0geF9vZmYgKyAobXYwLT54ID4+ICgyICsgaHNoaWZ0KSk7Ci0gICAgaW50IHlfb2ZmMCA9IHlfb2ZmICsgKG12MC0+eSA+PiAoMiArIHZzaGlmdCkpOwotICAgIGludCB4X29mZjEgPSB4X29mZiArIChtdjEtPnggPj4gKDIgKyBoc2hpZnQpKTsKLSAgICBpbnQgeV9vZmYxID0geV9vZmYgKyAobXYxLT55ID4+ICgyICsgdnNoaWZ0KSk7Ci0gICAgaW50IGlkeCA9IGZmX2hldmNfcGVsX3dlaWdodFtibG9ja193XTsKLSAgICBzcmMxICArPSB5X29mZjAgKiBzcmMxc3RyaWRlICsgKGludCkoKHVuc2lnbmVkKXhfb2ZmMCA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKLSAgICBzcmMyICArPSB5X29mZjEgKiBzcmMyc3RyaWRlICsgKGludCkoKHVuc2lnbmVkKXhfb2ZmMSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKLQotICAgIGlmICh4X29mZjAgPCBFUEVMX0VYVFJBX0JFRk9SRSB8fCB5X29mZjAgPCBFUEVMX0VYVFJBX0FGVEVSIHx8Ci0gICAgICAgIHhfb2ZmMCA+PSBwaWNfd2lkdGggLSBibG9ja193IC0gRVBFTF9FWFRSQV9BRlRFUiB8fAotICAgICAgICB5X29mZjAgPj0gcGljX2hlaWdodCAtIGJsb2NrX2ggLSBFUEVMX0VYVFJBX0FGVEVSKSB7Ci0gICAgICAgIGNvbnN0IGludCBlZGdlX2VtdV9zdHJpZGUgPSBFREdFX0VNVV9CVUZGRVJfU1RSSURFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQ7Ci0gICAgICAgIGludCBvZmZzZXQxID0gRVBFTF9FWFRSQV9CRUZPUkUgKiAoc3JjMXN0cmlkZSArICgxIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpKTsKLSAgICAgICAgaW50IGJ1Zl9vZmZzZXQxID0gRVBFTF9FWFRSQV9CRUZPUkUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAoZWRnZV9lbXVfc3RyaWRlICsgKDEgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCkpOwotCi0gICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhsYy0+ZWRnZV9lbXVfYnVmZmVyLCBzcmMxIC0gb2Zmc2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfZW11X3N0cmlkZSwgc3JjMXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3cgKyBFUEVMX0VYVFJBLCBibG9ja19oICsgRVBFTF9FWFRSQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmMCAtIEVQRUxfRVhUUkFfQkVGT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9vZmYwIC0gRVBFTF9FWFRSQV9CRUZPUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOwotCi0gICAgICAgIHNyYzEgPSBsYy0+ZWRnZV9lbXVfYnVmZmVyICsgYnVmX29mZnNldDE7Ci0gICAgICAgIHNyYzFzdHJpZGUgPSBlZGdlX2VtdV9zdHJpZGU7Ci0gICAgfQotCi0gICAgaWYgKHhfb2ZmMSA8IEVQRUxfRVhUUkFfQkVGT1JFIHx8IHlfb2ZmMSA8IEVQRUxfRVhUUkFfQUZURVIgfHwKLSAgICAgICAgeF9vZmYxID49IHBpY193aWR0aCAtIGJsb2NrX3cgLSBFUEVMX0VYVFJBX0FGVEVSIHx8Ci0gICAgICAgIHlfb2ZmMSA+PSBwaWNfaGVpZ2h0IC0gYmxvY2tfaCAtIEVQRUxfRVhUUkFfQUZURVIpIHsKLSAgICAgICAgY29uc3QgaW50IGVkZ2VfZW11X3N0cmlkZSA9IEVER0VfRU1VX0JVRkZFUl9TVFJJREUgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdDsKLSAgICAgICAgaW50IG9mZnNldDEgPSBFUEVMX0VYVFJBX0JFRk9SRSAqIChzcmMyc3RyaWRlICsgKDEgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCkpOwotICAgICAgICBpbnQgYnVmX29mZnNldDEgPSBFUEVMX0VYVFJBX0JFRk9SRSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChlZGdlX2VtdV9zdHJpZGUgKyAoMSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KSk7Ci0KLSAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGxjLT5lZGdlX2VtdV9idWZmZXIyLCBzcmMyIC0gb2Zmc2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfZW11X3N0cmlkZSwgc3JjMnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3cgKyBFUEVMX0VYVFJBLCBibG9ja19oICsgRVBFTF9FWFRSQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmMSAtIEVQRUxfRVhUUkFfQkVGT1JFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9vZmYxIC0gRVBFTF9FWFRSQV9CRUZPUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOwotCi0gICAgICAgIHNyYzIgPSBsYy0+ZWRnZV9lbXVfYnVmZmVyMiArIGJ1Zl9vZmZzZXQxOwotICAgICAgICBzcmMyc3RyaWRlID0gZWRnZV9lbXVfc3RyaWRlOwotICAgIH0KLQotICAgIHMtPmhldmNkc3AucHV0X2hldmNfZXBlbFtpZHhdWyEhbXkwXVshIW14MF0obGMtPnRtcCwgc3JjMSwgc3JjMXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIF9teDAsIF9teTAsIGJsb2NrX3cpOwotICAgIGlmICghd2VpZ2h0X2ZsYWcpCi0gICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfZXBlbF9iaVtpZHhdWyEhbXkxXVshIW14MV0oZHN0MCwgcy0+ZnJhbWUtPmxpbmVzaXplW2NpZHgrMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgc3JjMnN0cmlkZSwgbGMtPnRtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBfbXgxLCBfbXkxLCBibG9ja193KTsKLSAgICBlbHNlCi0gICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfZXBlbF9iaV93W2lkeF1bISFteTFdWyEhbXgxXShkc3QwLCBzLT5mcmFtZS0+bGluZXNpemVbY2lkeCsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIHNyYzJzdHJpZGUsIGxjLT50bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMFtjdXJyZW50X212LT5yZWZfaWR4WzBdXVtjaWR4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDFbY3VycmVudF9tdi0+cmVmX2lkeFsxXV1bY2lkeF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wwW2N1cnJlbnRfbXYtPnJlZl9pZHhbMF1dW2NpZHhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX29mZnNldF9sMVtjdXJyZW50X212LT5yZWZfaWR4WzFdXVtjaWR4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9teDEsIF9teTEsIGJsb2NrX3cpOwotfQotCi1zdGF0aWMgdm9pZCBoZXZjX2F3YWl0X3Byb2dyZXNzKEhFVkNDb250ZXh0ICpzLCBIRVZDRnJhbWUgKnJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTXYgKm12LCBpbnQgeTAsIGludCBoZWlnaHQpCi17Ci0gICAgaW50IHkgPSBGRk1BWCgwLCAobXYtPnkgPj4gMikgKyB5MCArIGhlaWdodCArIDkpOwotCi0gICAgaWYgKHMtPnRocmVhZHNfdHlwZSA9PSBGRl9USFJFQURfRlJBTUUgKQotICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnJlZi0+dGYsIHksIDApOwotfQotCi1zdGF0aWMgdm9pZCBoZXZjX2x1bWFfbXZfbXZwX21vZGUoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgblBiVywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBiSCwgaW50IGxvZzJfY2Jfc2l6ZSwgaW50IHBhcnRfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXJnZV9pZHgsIE12RmllbGQgKm12KQotewotICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOwotICAgIGVudW0gSW50ZXJQcmVkSWRjIGludGVyX3ByZWRfaWRjID0gUFJFRF9MMDsKLSAgICBpbnQgbXZwX2ZsYWc7Ci0KLSAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHgwLCB5MCwgblBiVywgblBiSCk7Ci0gICAgbXYtPnByZWRfZmxhZyA9IDA7Ci0gICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgPT0gQl9TTElDRSkKLSAgICAgICAgaW50ZXJfcHJlZF9pZGMgPSBmZl9oZXZjX2ludGVyX3ByZWRfaWRjX2RlY29kZShzLCBuUGJXLCBuUGJIKTsKLQotICAgIGlmIChpbnRlcl9wcmVkX2lkYyAhPSBQUkVEX0wxKSB7Ci0gICAgICAgIGlmIChzLT5zaC5uYl9yZWZzW0wwXSkKLSAgICAgICAgICAgIG12LT5yZWZfaWR4WzBdPSBmZl9oZXZjX3JlZl9pZHhfbHhfZGVjb2RlKHMsIHMtPnNoLm5iX3JlZnNbTDBdKTsKLQotICAgICAgICBtdi0+cHJlZF9mbGFnID0gUEZfTDA7Ci0gICAgICAgIGZmX2hldmNfaGxzX212ZF9jb2RpbmcocywgeDAsIHkwLCAwKTsKLSAgICAgICAgbXZwX2ZsYWcgPSBmZl9oZXZjX212cF9seF9mbGFnX2RlY29kZShzKTsKLSAgICAgICAgZmZfaGV2Y19sdW1hX212X212cF9tb2RlKHMsIHgwLCB5MCwgblBiVywgblBiSCwgbG9nMl9jYl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9pZHgsIG1lcmdlX2lkeCwgbXYsIG12cF9mbGFnLCAwKTsKLSAgICAgICAgbXYtPm12WzBdLnggKz0gbGMtPnB1Lm12ZC54OwotICAgICAgICBtdi0+bXZbMF0ueSArPSBsYy0+cHUubXZkLnk7Ci0gICAgfQotCi0gICAgaWYgKGludGVyX3ByZWRfaWRjICE9IFBSRURfTDApIHsKLSAgICAgICAgaWYgKHMtPnNoLm5iX3JlZnNbTDFdKQotICAgICAgICAgICAgbXYtPnJlZl9pZHhbMV09IGZmX2hldmNfcmVmX2lkeF9seF9kZWNvZGUocywgcy0+c2gubmJfcmVmc1tMMV0pOwotCi0gICAgICAgIGlmIChzLT5zaC5tdmRfbDFfemVyb19mbGFnID09IDEgJiYgaW50ZXJfcHJlZF9pZGMgPT0gUFJFRF9CSSkgewotICAgICAgICAgICAgQVZfWkVSTzMyKCZsYy0+cHUubXZkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZmX2hldmNfaGxzX212ZF9jb2RpbmcocywgeDAsIHkwLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIG12LT5wcmVkX2ZsYWcgKz0gUEZfTDE7Ci0gICAgICAgIG12cF9mbGFnID0gZmZfaGV2Y19tdnBfbHhfZmxhZ19kZWNvZGUocyk7Ci0gICAgICAgIGZmX2hldmNfbHVtYV9tdl9tdnBfbW9kZShzLCB4MCwgeTAsIG5QYlcsIG5QYkgsIGxvZzJfY2Jfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRfaWR4LCBtZXJnZV9pZHgsIG12LCBtdnBfZmxhZywgMSk7Ci0gICAgICAgIG12LT5tdlsxXS54ICs9IGxjLT5wdS5tdmQueDsKLSAgICAgICAgbXYtPm12WzFdLnkgKz0gbGMtPnB1Lm12ZC55OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgaGxzX3ByZWRpY3Rpb25fdW5pdChIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGJXLCBpbnQgblBiSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfY2Jfc2l6ZSwgaW50IHBhcnRJZHgsIGludCBpZHgpCi17Ci0jZGVmaW5lIFBPUyhjX2lkeCwgeCwgeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAmcy0+ZnJhbWUtPmRhdGFbY19pZHhdWygoeSkgPj4gcy0+cHMuc3BzLT52c2hpZnRbY19pZHhdKSAqIHMtPmZyYW1lLT5saW5lc2l6ZVtjX2lkeF0gKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSA+PiBzLT5wcy5zcHMtPmhzaGlmdFtjX2lkeF0pIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpXQotICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOwotICAgIGludCBtZXJnZV9pZHggPSAwOwotICAgIHN0cnVjdCBNdkZpZWxkIGN1cnJlbnRfbXYgPSB7e3sgMCB9fX07Ci0KLSAgICBpbnQgbWluX3B1X3dpZHRoID0gcy0+cHMuc3BzLT5taW5fcHVfd2lkdGg7Ci0KLSAgICBNdkZpZWxkICp0YWJfbXZmID0gcy0+cmVmLT50YWJfbXZmOwotICAgIFJlZlBpY0xpc3QgICpyZWZQaWNMaXN0ID0gcy0+cmVmLT5yZWZQaWNMaXN0OwotICAgIEhFVkNGcmFtZSAqcmVmMCA9IE5VTEwsICpyZWYxID0gTlVMTDsKLSAgICB1aW50OF90ICpkc3QwID0gUE9TKDAsIHgwLCB5MCk7Ci0gICAgdWludDhfdCAqZHN0MSA9IFBPUygxLCB4MCwgeTApOwotICAgIHVpbnQ4X3QgKmRzdDIgPSBQT1MoMiwgeDAsIHkwKTsKLSAgICBpbnQgbG9nMl9taW5fY2Jfc2l6ZSA9IHMtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKLSAgICBpbnQgbWluX2NiX3dpZHRoICAgICA9IHMtPnBzLnNwcy0+bWluX2NiX3dpZHRoOwotICAgIGludCB4X2NiICAgICAgICAgICAgID0geDAgPj4gbG9nMl9taW5fY2Jfc2l6ZTsKLSAgICBpbnQgeV9jYiAgICAgICAgICAgICA9IHkwID4+IGxvZzJfbWluX2NiX3NpemU7Ci0gICAgaW50IHhfcHUsIHlfcHU7Ci0gICAgaW50IGksIGo7Ci0KLSAgICBpbnQgc2tpcF9mbGFnID0gU0FNUExFX0NUQihzLT5za2lwX2ZsYWcsIHhfY2IsIHlfY2IpOwotCi0gICAgaWYgKCFza2lwX2ZsYWcpCi0gICAgICAgIGxjLT5wdS5tZXJnZV9mbGFnID0gZmZfaGV2Y19tZXJnZV9mbGFnX2RlY29kZShzKTsKLQotICAgIGlmIChza2lwX2ZsYWcgfHwgbGMtPnB1Lm1lcmdlX2ZsYWcpIHsKLSAgICAgICAgaWYgKHMtPnNoLm1heF9udW1fbWVyZ2VfY2FuZCA+IDEpCi0gICAgICAgICAgICBtZXJnZV9pZHggPSBmZl9oZXZjX21lcmdlX2lkeF9kZWNvZGUocyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIG1lcmdlX2lkeCA9IDA7Ci0KLSAgICAgICAgZmZfaGV2Y19sdW1hX212X21lcmdlX21vZGUocywgeDAsIHkwLCBuUGJXLCBuUGJILCBsb2cyX2NiX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRJZHgsIG1lcmdlX2lkeCwgJmN1cnJlbnRfbXYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGhldmNfbHVtYV9tdl9tdnBfbW9kZShzLCB4MCwgeTAsIG5QYlcsIG5QYkgsIGxvZzJfY2Jfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRJZHgsIG1lcmdlX2lkeCwgJmN1cnJlbnRfbXYpOwotICAgIH0KLQotICAgIHhfcHUgPSB4MCA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX3B1X3NpemU7Ci0gICAgeV9wdSA9IHkwID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKLQotICAgIGZvciAoaiA9IDA7IGogPCBuUGJIID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsgaisrKQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgblBiVyA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX3B1X3NpemU7IGkrKykKLSAgICAgICAgICAgIHRhYl9tdmZbKHlfcHUgKyBqKSAqIG1pbl9wdV93aWR0aCArIHhfcHUgKyBpXSA9IGN1cnJlbnRfbXY7Ci0KLSAgICBpZiAoY3VycmVudF9tdi5wcmVkX2ZsYWcgJiBQRl9MMCkgewotICAgICAgICByZWYwID0gcmVmUGljTGlzdFswXS5yZWZbY3VycmVudF9tdi5yZWZfaWR4WzBdXTsKLSAgICAgICAgaWYgKCFyZWYwKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICBoZXZjX2F3YWl0X3Byb2dyZXNzKHMsIHJlZjAsICZjdXJyZW50X212Lm12WzBdLCB5MCwgblBiSCk7Ci0gICAgfQotICAgIGlmIChjdXJyZW50X212LnByZWRfZmxhZyAmIFBGX0wxKSB7Ci0gICAgICAgIHJlZjEgPSByZWZQaWNMaXN0WzFdLnJlZltjdXJyZW50X212LnJlZl9pZHhbMV1dOwotICAgICAgICBpZiAoIXJlZjEpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGhldmNfYXdhaXRfcHJvZ3Jlc3MocywgcmVmMSwgJmN1cnJlbnRfbXYubXZbMV0sIHkwLCBuUGJIKTsKLSAgICB9Ci0KLSAgICBpZiAoY3VycmVudF9tdi5wcmVkX2ZsYWcgPT0gUEZfTDApIHsKLSAgICAgICAgaW50IHgwX2MgPSB4MCA+PiBzLT5wcy5zcHMtPmhzaGlmdFsxXTsKLSAgICAgICAgaW50IHkwX2MgPSB5MCA+PiBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKLSAgICAgICAgaW50IG5QYldfYyA9IG5QYlcgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV07Ci0gICAgICAgIGludCBuUGJIX2MgPSBuUGJIID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdOwotCi0gICAgICAgIGx1bWFfbWNfdW5pKHMsIGRzdDAsIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwgcmVmMC0+ZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICZjdXJyZW50X212Lm12WzBdLCB4MCwgeTAsIG5QYlcsIG5QYkgsCi0gICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfd2VpZ2h0X2wwW2N1cnJlbnRfbXYucmVmX2lkeFswXV0sCi0gICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wwW2N1cnJlbnRfbXYucmVmX2lkeFswXV0pOwotCi0gICAgICAgIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjKSB7Ci0gICAgICAgICAgICBjaHJvbWFfbWNfdW5pKHMsIGRzdDEsIHMtPmZyYW1lLT5saW5lc2l6ZVsxXSwgcmVmMC0+ZnJhbWUtPmRhdGFbMV0sIHJlZjAtPmZyYW1lLT5saW5lc2l6ZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgeDBfYywgeTBfYywgblBiV19jLCBuUGJIX2MsICZjdXJyZW50X212LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2N1cnJlbnRfbXYucmVmX2lkeFswXV1bMF0sIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbY3VycmVudF9tdi5yZWZfaWR4WzBdXVswXSk7Ci0gICAgICAgICAgICBjaHJvbWFfbWNfdW5pKHMsIGRzdDIsIHMtPmZyYW1lLT5saW5lc2l6ZVsyXSwgcmVmMC0+ZnJhbWUtPmRhdGFbMl0sIHJlZjAtPmZyYW1lLT5saW5lc2l6ZVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgeDBfYywgeTBfYywgblBiV19jLCBuUGJIX2MsICZjdXJyZW50X212LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2N1cnJlbnRfbXYucmVmX2lkeFswXV1bMV0sIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbY3VycmVudF9tdi5yZWZfaWR4WzBdXVsxXSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGN1cnJlbnRfbXYucHJlZF9mbGFnID09IFBGX0wxKSB7Ci0gICAgICAgIGludCB4MF9jID0geDAgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV07Ci0gICAgICAgIGludCB5MF9jID0geTAgPj4gcy0+cHMuc3BzLT52c2hpZnRbMV07Ci0gICAgICAgIGludCBuUGJXX2MgPSBuUGJXID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzFdOwotICAgICAgICBpbnQgblBiSF9jID0gblBiSCA+PiBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKLQotICAgICAgICBsdW1hX21jX3VuaShzLCBkc3QwLCBzLT5mcmFtZS0+bGluZXNpemVbMF0sIHJlZjEtPmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9tdi5tdlsxXSwgeDAsIHkwLCBuUGJXLCBuUGJILAotICAgICAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMVtjdXJyZW50X212LnJlZl9pZHhbMV1dLAotICAgICAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX29mZnNldF9sMVtjdXJyZW50X212LnJlZl9pZHhbMV1dKTsKLQotICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYykgewotICAgICAgICAgICAgY2hyb21hX21jX3VuaShzLCBkc3QxLCBzLT5mcmFtZS0+bGluZXNpemVbMV0sIHJlZjEtPmZyYW1lLT5kYXRhWzFdLCByZWYxLT5mcmFtZS0+bGluZXNpemVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHgwX2MsIHkwX2MsIG5QYldfYywgblBiSF9jLCAmY3VycmVudF9tdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMVtjdXJyZW50X212LnJlZl9pZHhbMV1dWzBdLCBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wxW2N1cnJlbnRfbXYucmVmX2lkeFsxXV1bMF0pOwotCi0gICAgICAgICAgICBjaHJvbWFfbWNfdW5pKHMsIGRzdDIsIHMtPmZyYW1lLT5saW5lc2l6ZVsyXSwgcmVmMS0+ZnJhbWUtPmRhdGFbMl0sIHJlZjEtPmZyYW1lLT5saW5lc2l6ZVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgeDBfYywgeTBfYywgblBiV19jLCBuUGJIX2MsICZjdXJyZW50X212LAotICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wxW2N1cnJlbnRfbXYucmVmX2lkeFsxXV1bMV0sIHMtPnNoLmNocm9tYV9vZmZzZXRfbDFbY3VycmVudF9tdi5yZWZfaWR4WzFdXVsxXSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGN1cnJlbnRfbXYucHJlZF9mbGFnID09IFBGX0JJKSB7Ci0gICAgICAgIGludCB4MF9jID0geDAgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV07Ci0gICAgICAgIGludCB5MF9jID0geTAgPj4gcy0+cHMuc3BzLT52c2hpZnRbMV07Ci0gICAgICAgIGludCBuUGJXX2MgPSBuUGJXID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzFdOwotICAgICAgICBpbnQgblBiSF9jID0gblBiSCA+PiBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKLQotICAgICAgICBsdW1hX21jX2JpKHMsIGRzdDAsIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwgcmVmMC0+ZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfbXYubXZbMF0sIHgwLCB5MCwgblBiVywgblBiSCwKLSAgICAgICAgICAgICAgICAgICByZWYxLT5mcmFtZSwgJmN1cnJlbnRfbXYubXZbMV0sICZjdXJyZW50X212KTsKLQotICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYykgewotICAgICAgICAgICAgY2hyb21hX21jX2JpKHMsIGRzdDEsIHMtPmZyYW1lLT5saW5lc2l6ZVsxXSwgcmVmMC0+ZnJhbWUsIHJlZjEtPmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHgwX2MsIHkwX2MsIG5QYldfYywgblBiSF9jLCAmY3VycmVudF9tdiwgMCk7Ci0KLSAgICAgICAgICAgIGNocm9tYV9tY19iaShzLCBkc3QyLCBzLT5mcmFtZS0+bGluZXNpemVbMl0sIHJlZjAtPmZyYW1lLCByZWYxLT5mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4MF9jLCB5MF9jLCBuUGJXX2MsIG5QYkhfYywgJmN1cnJlbnRfbXYsIDEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIDguNC4xCi0gKi8KLXN0YXRpYyBpbnQgbHVtYV9pbnRyYV9wcmVkX21vZGUoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgcHVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWcpCi17Ci0gICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7Ci0gICAgaW50IHhfcHUgICAgICAgICAgICAgPSB4MCA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX3B1X3NpemU7Ci0gICAgaW50IHlfcHUgICAgICAgICAgICAgPSB5MCA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX3B1X3NpemU7Ci0gICAgaW50IG1pbl9wdV93aWR0aCAgICAgPSBzLT5wcy5zcHMtPm1pbl9wdV93aWR0aDsKLSAgICBpbnQgc2l6ZV9pbl9wdXMgICAgICA9IHB1X3NpemUgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9wdV9zaXplOwotICAgIGludCB4MGIgICAgICAgICAgICAgID0gYXZfbW9kX3VpbnRwMih4MCwgcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKTsKLSAgICBpbnQgeTBiICAgICAgICAgICAgICA9IGF2X21vZF91aW50cDIoeTAsIHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSk7Ci0KLSAgICBpbnQgY2FuZF91cCAgID0gKGxjLT5jdGJfdXBfZmxhZyB8fCB5MGIpID8KLSAgICAgICAgICAgICAgICAgICAgcy0+dGFiX2lwbVsoeV9wdSAtIDEpICogbWluX3B1X3dpZHRoICsgeF9wdV0gOiBJTlRSQV9EQzsKLSAgICBpbnQgY2FuZF9sZWZ0ID0gKGxjLT5jdGJfbGVmdF9mbGFnIHx8IHgwYikgPwotICAgICAgICAgICAgICAgICAgICBzLT50YWJfaXBtW3lfcHUgKiBtaW5fcHVfd2lkdGggKyB4X3B1IC0gMV0gICA6IElOVFJBX0RDOwotCi0gICAgaW50IHlfY3RiID0gKHkwID4+IChzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUpKSA8PCAocy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKTsKLQotICAgIE12RmllbGQgKnRhYl9tdmYgPSBzLT5yZWYtPnRhYl9tdmY7Ci0gICAgaW50IGludHJhX3ByZWRfbW9kZTsKLSAgICBpbnQgY2FuZGlkYXRlWzNdOwotICAgIGludCBpLCBqOwotCi0gICAgLy8gaW50cmFfcHJlZF9tb2RlIHByZWRpY3Rpb24gZG9lcyBub3QgY3Jvc3MgdmVydGljYWwgQ1RCIGJvdW5kYXJpZXMKLSAgICBpZiAoKHkwIC0gMSkgPCB5X2N0YikKLSAgICAgICAgY2FuZF91cCA9IElOVFJBX0RDOwotCi0gICAgaWYgKGNhbmRfbGVmdCA9PSBjYW5kX3VwKSB7Ci0gICAgICAgIGlmIChjYW5kX2xlZnQgPCAyKSB7Ci0gICAgICAgICAgICBjYW5kaWRhdGVbMF0gPSBJTlRSQV9QTEFOQVI7Ci0gICAgICAgICAgICBjYW5kaWRhdGVbMV0gPSBJTlRSQV9EQzsKLSAgICAgICAgICAgIGNhbmRpZGF0ZVsyXSA9IElOVFJBX0FOR1VMQVJfMjY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYW5kaWRhdGVbMF0gPSBjYW5kX2xlZnQ7Ci0gICAgICAgICAgICBjYW5kaWRhdGVbMV0gPSAyICsgKChjYW5kX2xlZnQgLSAyIC0gMSArIDMyKSAmIDMxKTsKLSAgICAgICAgICAgIGNhbmRpZGF0ZVsyXSA9IDIgKyAoKGNhbmRfbGVmdCAtIDIgKyAxKSAmIDMxKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNhbmRpZGF0ZVswXSA9IGNhbmRfbGVmdDsKLSAgICAgICAgY2FuZGlkYXRlWzFdID0gY2FuZF91cDsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZVswXSAhPSBJTlRSQV9QTEFOQVIgJiYgY2FuZGlkYXRlWzFdICE9IElOVFJBX1BMQU5BUikgewotICAgICAgICAgICAgY2FuZGlkYXRlWzJdID0gSU5UUkFfUExBTkFSOwotICAgICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZVswXSAhPSBJTlRSQV9EQyAmJiBjYW5kaWRhdGVbMV0gIT0gSU5UUkFfREMpIHsKLSAgICAgICAgICAgIGNhbmRpZGF0ZVsyXSA9IElOVFJBX0RDOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FuZGlkYXRlWzJdID0gSU5UUkFfQU5HVUxBUl8yNjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChwcmV2X2ludHJhX2x1bWFfcHJlZF9mbGFnKSB7Ci0gICAgICAgIGludHJhX3ByZWRfbW9kZSA9IGNhbmRpZGF0ZVtsYy0+cHUubXBtX2lkeF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZVswXSA+IGNhbmRpZGF0ZVsxXSkKLSAgICAgICAgICAgIEZGU1dBUCh1aW50OF90LCBjYW5kaWRhdGVbMF0sIGNhbmRpZGF0ZVsxXSk7Ci0gICAgICAgIGlmIChjYW5kaWRhdGVbMF0gPiBjYW5kaWRhdGVbMl0pCi0gICAgICAgICAgICBGRlNXQVAodWludDhfdCwgY2FuZGlkYXRlWzBdLCBjYW5kaWRhdGVbMl0pOwotICAgICAgICBpZiAoY2FuZGlkYXRlWzFdID4gY2FuZGlkYXRlWzJdKQotICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QsIGNhbmRpZGF0ZVsxXSwgY2FuZGlkYXRlWzJdKTsKLQotICAgICAgICBpbnRyYV9wcmVkX21vZGUgPSBsYy0+cHUucmVtX2ludHJhX2x1bWFfcHJlZF9tb2RlOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQotICAgICAgICAgICAgaWYgKGludHJhX3ByZWRfbW9kZSA+PSBjYW5kaWRhdGVbaV0pCi0gICAgICAgICAgICAgICAgaW50cmFfcHJlZF9tb2RlKys7Ci0gICAgfQotCi0gICAgLyogd3JpdGUgdGhlIGludHJhIHByZWRpY3Rpb24gdW5pdHMgaW50byB0aGUgbXYgYXJyYXkgKi8KLSAgICBpZiAoIXNpemVfaW5fcHVzKQotICAgICAgICBzaXplX2luX3B1cyA9IDE7Ci0gICAgZm9yIChpID0gMDsgaSA8IHNpemVfaW5fcHVzOyBpKyspIHsKLSAgICAgICAgbWVtc2V0KCZzLT50YWJfaXBtWyh5X3B1ICsgaSkgKiBtaW5fcHVfd2lkdGggKyB4X3B1XSwKLSAgICAgICAgICAgICAgIGludHJhX3ByZWRfbW9kZSwgc2l6ZV9pbl9wdXMpOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplX2luX3B1czsgaisrKSB7Ci0gICAgICAgICAgICB0YWJfbXZmWyh5X3B1ICsgaikgKiBtaW5fcHVfd2lkdGggKyB4X3B1ICsgaV0ucHJlZF9mbGFnID0gUEZfSU5UUkE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gaW50cmFfcHJlZF9tb2RlOwotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHNldF9jdF9kZXB0aChIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgY3RfZGVwdGgpCi17Ci0gICAgaW50IGxlbmd0aCA9ICgxIDw8IGxvZzJfY2Jfc2l6ZSkgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9jYl9zaXplOwotICAgIGludCB4X2NiICAgPSB4MCA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX2NiX3NpemU7Ci0gICAgaW50IHlfY2IgICA9IHkwID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKLSAgICBpbnQgeTsKLQotICAgIGZvciAoeSA9IDA7IHkgPCBsZW5ndGg7IHkrKykKLSAgICAgICAgbWVtc2V0KCZzLT50YWJfY3RfZGVwdGhbKHlfY2IgKyB5KSAqIHMtPnBzLnNwcy0+bWluX2NiX3dpZHRoICsgeF9jYl0sCi0gICAgICAgICAgICAgICBjdF9kZXB0aCwgbGVuZ3RoKTsKLX0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFiX21vZGVfaWR4W10gPSB7Ci0gICAgIDAsICAxLCAgMiwgIDIsICAyLCAgMiwgIDMsICA1LCAgNywgIDgsIDEwLCAxMiwgMTMsIDE1LCAxNywgMTgsIDE5LCAyMCwKLSAgICAyMSwgMjIsIDIzLCAyMywgMjQsIDI0LCAyNSwgMjUsIDI2LCAyNywgMjcsIDI4LCAyOCwgMjksIDI5LCAzMCwgMzF9OwotCi1zdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0aW9uX3VuaXQoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2NiX3NpemUpCi17Ci0gICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW50cmFfY2hyb21hX3RhYmxlWzRdID0geyAwLCAyNiwgMTAsIDEgfTsKLSAgICB1aW50OF90IHByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdbNF07Ci0gICAgaW50IHNwbGl0ICAgPSBsYy0+Y3UucGFydF9tb2RlID09IFBBUlRfTnhOOwotICAgIGludCBwYl9zaXplID0gKDEgPDwgbG9nMl9jYl9zaXplKSA+PiBzcGxpdDsKLSAgICBpbnQgc2lkZSAgICA9IHNwbGl0ICsgMTsKLSAgICBpbnQgY2hyb21hX21vZGU7Ci0gICAgaW50IGksIGo7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2lkZTsgaSsrKQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2lkZTsgaisrKQotICAgICAgICAgICAgcHJldl9pbnRyYV9sdW1hX3ByZWRfZmxhZ1syICogaSArIGpdID0gZmZfaGV2Y19wcmV2X2ludHJhX2x1bWFfcHJlZF9mbGFnX2RlY29kZShzKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzaWRlOyBpKyspIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpZGU7IGorKykgewotICAgICAgICAgICAgaWYgKHByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdbMiAqIGkgKyBqXSkKLSAgICAgICAgICAgICAgICBsYy0+cHUubXBtX2lkeCA9IGZmX2hldmNfbXBtX2lkeF9kZWNvZGUocyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGMtPnB1LnJlbV9pbnRyYV9sdW1hX3ByZWRfbW9kZSA9IGZmX2hldmNfcmVtX2ludHJhX2x1bWFfcHJlZF9tb2RlX2RlY29kZShzKTsKLQotICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZVsyICogaSArIGpdID0KLSAgICAgICAgICAgICAgICBsdW1hX2ludHJhX3ByZWRfbW9kZShzLCB4MCArIHBiX3NpemUgKiBqLCB5MCArIHBiX3NpemUgKiBpLCBwYl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdbMiAqIGkgKyBqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaWRlOyBpKyspIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaWRlOyBqKyspIHsKLSAgICAgICAgICAgICAgICBsYy0+cHUuY2hyb21hX21vZGVfY1syICogaSArIGpdID0gY2hyb21hX21vZGUgPSBmZl9oZXZjX2ludHJhX2Nocm9tYV9wcmVkX21vZGVfZGVjb2RlKHMpOwotICAgICAgICAgICAgICAgIGlmIChjaHJvbWFfbW9kZSAhPSA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsYy0+cHUuaW50cmFfcHJlZF9tb2RlWzIgKiBpICsgal0gPT0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1syICogaSArIGpdID0gMzQ7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1syICogaSArIGpdID0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsYy0+cHUuaW50cmFfcHJlZF9tb2RlX2NbMiAqIGkgKyBqXSA9IGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbMiAqIGkgKyBqXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgewotICAgICAgICBpbnQgbW9kZV9pZHg7Ci0gICAgICAgIGxjLT5wdS5jaHJvbWFfbW9kZV9jWzBdID0gY2hyb21hX21vZGUgPSBmZl9oZXZjX2ludHJhX2Nocm9tYV9wcmVkX21vZGVfZGVjb2RlKHMpOwotICAgICAgICBpZiAoY2hyb21hX21vZGUgIT0gNCkgewotICAgICAgICAgICAgaWYgKGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbMF0gPT0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXSkKLSAgICAgICAgICAgICAgICBtb2RlX2lkeCA9IDM0OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1vZGVfaWR4ID0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1vZGVfaWR4ID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZVswXTsKLSAgICAgICAgfQotICAgICAgICBsYy0+cHUuaW50cmFfcHJlZF9tb2RlX2NbMF0gPSB0YWJfbW9kZV9pZHhbbW9kZV9pZHhdOwotICAgIH0gZWxzZSBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwKSB7Ci0gICAgICAgIGNocm9tYV9tb2RlID0gZmZfaGV2Y19pbnRyYV9jaHJvbWFfcHJlZF9tb2RlX2RlY29kZShzKTsKLSAgICAgICAgaWYgKGNocm9tYV9tb2RlICE9IDQpIHsKLSAgICAgICAgICAgIGlmIChsYy0+cHUuaW50cmFfcHJlZF9tb2RlWzBdID09IGludHJhX2Nocm9tYV90YWJsZVtjaHJvbWFfbW9kZV0pCi0gICAgICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdID0gMzQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdID0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1swXSA9IGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbMF07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGludHJhX3ByZWRpY3Rpb25fdW5pdF9kZWZhdWx0X3ZhbHVlKEhFVkNDb250ZXh0ICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgwLCBpbnQgeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplKQotewotICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOwotICAgIGludCBwYl9zaXplICAgICAgICAgID0gMSA8PCBsb2cyX2NiX3NpemU7Ci0gICAgaW50IHNpemVfaW5fcHVzICAgICAgPSBwYl9zaXplID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKLSAgICBpbnQgbWluX3B1X3dpZHRoICAgICA9IHMtPnBzLnNwcy0+bWluX3B1X3dpZHRoOwotICAgIE12RmllbGQgKnRhYl9tdmYgICAgID0gcy0+cmVmLT50YWJfbXZmOwotICAgIGludCB4X3B1ICAgICAgICAgICAgID0geDAgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9wdV9zaXplOwotICAgIGludCB5X3B1ICAgICAgICAgICAgID0geTAgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9wdV9zaXplOwotICAgIGludCBqLCBrOwotCi0gICAgaWYgKHNpemVfaW5fcHVzID09IDApCi0gICAgICAgIHNpemVfaW5fcHVzID0gMTsKLSAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZV9pbl9wdXM7IGorKykKLSAgICAgICAgbWVtc2V0KCZzLT50YWJfaXBtWyh5X3B1ICsgaikgKiBtaW5fcHVfd2lkdGggKyB4X3B1XSwgSU5UUkFfREMsIHNpemVfaW5fcHVzKTsKLSAgICBpZiAobGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBKQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZV9pbl9wdXM7IGorKykKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzaXplX2luX3B1czsgaysrKQotICAgICAgICAgICAgICAgIHRhYl9tdmZbKHlfcHUgKyBqKSAqIG1pbl9wdV93aWR0aCArIHhfcHUgKyBrXS5wcmVkX2ZsYWcgPSBQRl9JTlRSQTsKLX0KLQotc3RhdGljIGludCBobHNfY29kaW5nX3VuaXQoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgbG9nMl9jYl9zaXplKQotewotICAgIGludCBjYl9zaXplICAgICAgICAgID0gMSA8PCBsb2cyX2NiX3NpemU7Ci0gICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7Ci0gICAgaW50IGxvZzJfbWluX2NiX3NpemUgPSBzLT5wcy5zcHMtPmxvZzJfbWluX2NiX3NpemU7Ci0gICAgaW50IGxlbmd0aCAgICAgICAgICAgPSBjYl9zaXplID4+IGxvZzJfbWluX2NiX3NpemU7Ci0gICAgaW50IG1pbl9jYl93aWR0aCAgICAgPSBzLT5wcy5zcHMtPm1pbl9jYl93aWR0aDsKLSAgICBpbnQgeF9jYiAgICAgICAgICAgICA9IHgwID4+IGxvZzJfbWluX2NiX3NpemU7Ci0gICAgaW50IHlfY2IgICAgICAgICAgICAgPSB5MCA+PiBsb2cyX21pbl9jYl9zaXplOwotICAgIGludCBpZHggICAgICAgICAgICAgID0gbG9nMl9jYl9zaXplIC0gMjsKLSAgICBpbnQgcXBfYmxvY2tfbWFzayAgICA9ICgxPDwocy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplIC0gcy0+cHMucHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoKSkgLSAxOwotICAgIGludCB4LCB5LCByZXQ7Ci0KLSAgICBsYy0+Y3UueCAgICAgICAgICAgICAgICA9IHgwOwotICAgIGxjLT5jdS55ICAgICAgICAgICAgICAgID0geTA7Ci0gICAgbGMtPmN1LnByZWRfbW9kZSAgICAgICAgPSBNT0RFX0lOVFJBOwotICAgIGxjLT5jdS5wYXJ0X21vZGUgICAgICAgID0gUEFSVF8yTngyTjsKLSAgICBsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyA9IDA7Ci0KLSAgICBTQU1QTEVfQ1RCKHMtPnNraXBfZmxhZywgeF9jYiwgeV9jYikgPSAwOwotICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCi0gICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbeF0gPSAxOwotICAgIGlmIChzLT5wcy5wcHMtPnRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZV9mbGFnKSB7Ci0gICAgICAgIGxjLT5jdS5jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnID0gZmZfaGV2Y19jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnX2RlY29kZShzKTsKLSAgICAgICAgaWYgKGxjLT5jdS5jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnKQotICAgICAgICAgICAgc2V0X2RlYmxvY2tpbmdfYnlwYXNzKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbGMtPmN1LmN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcgPSAwOwotCi0gICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgIT0gSV9TTElDRSkgewotICAgICAgICB1aW50OF90IHNraXBfZmxhZyA9IGZmX2hldmNfc2tpcF9mbGFnX2RlY29kZShzLCB4MCwgeTAsIHhfY2IsIHlfY2IpOwotCi0gICAgICAgIHggPSB5X2NiICogbWluX2NiX3dpZHRoICsgeF9jYjsKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IGxlbmd0aDsgeSsrKSB7Ci0gICAgICAgICAgICBtZW1zZXQoJnMtPnNraXBfZmxhZ1t4XSwgc2tpcF9mbGFnLCBsZW5ndGgpOwotICAgICAgICAgICAgeCArPSBtaW5fY2Jfd2lkdGg7Ci0gICAgICAgIH0KLSAgICAgICAgbGMtPmN1LnByZWRfbW9kZSA9IHNraXBfZmxhZyA/IE1PREVfU0tJUCA6IE1PREVfSU5URVI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeCA9IHlfY2IgKiBtaW5fY2Jfd2lkdGggKyB4X2NiOwotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgbGVuZ3RoOyB5KyspIHsKLSAgICAgICAgICAgIG1lbXNldCgmcy0+c2tpcF9mbGFnW3hdLCAwLCBsZW5ndGgpOwotICAgICAgICAgICAgeCArPSBtaW5fY2Jfd2lkdGg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoU0FNUExFX0NUQihzLT5za2lwX2ZsYWcsIHhfY2IsIHlfY2IpKSB7Ci0gICAgICAgIGhsc19wcmVkaWN0aW9uX3VuaXQocywgeDAsIHkwLCBjYl9zaXplLCBjYl9zaXplLCBsb2cyX2NiX3NpemUsIDAsIGlkeCk7Ci0gICAgICAgIGludHJhX3ByZWRpY3Rpb25fdW5pdF9kZWZhdWx0X3ZhbHVlKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKLQotICAgICAgICBpZiAoIXMtPnNoLmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfZmxhZykKLSAgICAgICAgICAgIGZmX2hldmNfZGVibG9ja2luZ19ib3VuZGFyeV9zdHJlbmd0aHMocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBwY21fZmxhZyA9IDA7Ci0KLSAgICAgICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgIT0gSV9TTElDRSkKLSAgICAgICAgICAgIGxjLT5jdS5wcmVkX21vZGUgPSBmZl9oZXZjX3ByZWRfbW9kZV9kZWNvZGUocyk7Ci0gICAgICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlICE9IE1PREVfSU5UUkEgfHwKLSAgICAgICAgICAgIGxvZzJfY2Jfc2l6ZSA9PSBzLT5wcy5zcHMtPmxvZzJfbWluX2NiX3NpemUpIHsKLSAgICAgICAgICAgIGxjLT5jdS5wYXJ0X21vZGUgICAgICAgID0gZmZfaGV2Y19wYXJ0X21vZGVfZGVjb2RlKHMsIGxvZzJfY2Jfc2l6ZSk7Ci0gICAgICAgICAgICBsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyA9IGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF9OeE4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgewotICAgICAgICAgICAgaWYgKGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF8yTngyTiAmJiBzLT5wcy5zcHMtPnBjbV9lbmFibGVkX2ZsYWcgJiYKLSAgICAgICAgICAgICAgICBsb2cyX2NiX3NpemUgPj0gcy0+cHMuc3BzLT5wY20ubG9nMl9taW5fcGNtX2NiX3NpemUgJiYKLSAgICAgICAgICAgICAgICBsb2cyX2NiX3NpemUgPD0gcy0+cHMuc3BzLT5wY20ubG9nMl9tYXhfcGNtX2NiX3NpemUpIHsKLSAgICAgICAgICAgICAgICBwY21fZmxhZyA9IGZmX2hldmNfcGNtX2ZsYWdfZGVjb2RlKHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBjbV9mbGFnKSB7Ci0gICAgICAgICAgICAgICAgaW50cmFfcHJlZGljdGlvbl91bml0X2RlZmF1bHRfdmFsdWUocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOwotICAgICAgICAgICAgICAgIHJldCA9IGhsc19wY21fc2FtcGxlKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5wY20ubG9vcF9maWx0ZXJfZGlzYWJsZV9mbGFnKQotICAgICAgICAgICAgICAgICAgICBzZXRfZGVibG9ja2luZ19ieXBhc3MocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOwotCi0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludHJhX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsIGxvZzJfY2Jfc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnRyYV9wcmVkaWN0aW9uX3VuaXRfZGVmYXVsdF92YWx1ZShzLCB4MCwgeTAsIGxvZzJfY2Jfc2l6ZSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKGxjLT5jdS5wYXJ0X21vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgUEFSVF8yTngyTjoKLSAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCB5MCwgY2Jfc2l6ZSwgY2Jfc2l6ZSwgbG9nMl9jYl9zaXplLCAwLCBpZHgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVJUXzJOeE46Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgY2Jfc2l6ZSwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4KTsKLSAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplLCBjYl9zaXplIC8gMiwgbG9nMl9jYl9zaXplLCAxLCBpZHgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVJUX054Mk46Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCwgY2Jfc2l6ZSAvIDIsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMSk7Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCwgY2Jfc2l6ZSAvIDIsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4IC0gMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBUlRfMk54blU6Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgY2Jfc2l6ZSwgY2Jfc2l6ZSAgICAgLyA0LCBsb2cyX2NiX3NpemUsIDAsIGlkeCk7Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAgKyBjYl9zaXplIC8gNCwgY2Jfc2l6ZSwgY2Jfc2l6ZSAqIDMgLyA0LCBsb2cyX2NiX3NpemUsIDEsIGlkeCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFBBUlRfMk54bkQ6Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgICAgIGNiX3NpemUsIGNiX3NpemUgKiAzIC8gNCwgbG9nMl9jYl9zaXplLCAwLCBpZHgpOwotICAgICAgICAgICAgICAgIGhsc19wcmVkaWN0aW9uX3VuaXQocywgeDAsIHkwICsgY2Jfc2l6ZSAqIDMgLyA0LCBjYl9zaXplLCBjYl9zaXplICAgICAvIDQsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFSVF9uTHgyTjoKLSAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCAgICAgICAgICAgICAgIHkwLCBjYl9zaXplICAgICAvIDQsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMik7Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyA0LCB5MCwgY2Jfc2l6ZSAqIDMgLyA0LCBjYl9zaXplLCBsb2cyX2NiX3NpemUsIDEsIGlkeCAtIDIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBQQVJUX25SeDJOOgotICAgICAgICAgICAgICAgIGhsc19wcmVkaWN0aW9uX3VuaXQocywgeDAsICAgICAgICAgICAgICAgICAgIHkwLCBjYl9zaXplICogMyAvIDQsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMik7Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgKiAzIC8gNCwgeTAsIGNiX3NpemUgICAgIC8gNCwgY2Jfc2l6ZSwgbG9nMl9jYl9zaXplLCAxLCBpZHggLSAyKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUEFSVF9OeE46Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCwgICAgICAgICAgICAgICBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMSk7Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCwgICAgICAgICAgICAgICBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4IC0gMSk7Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMiwgaWR4IC0gMSk7Ci0gICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMywgaWR4IC0gMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIXBjbV9mbGFnKSB7Ci0gICAgICAgICAgICBpbnQgcnF0X3Jvb3RfY2JmID0gMTsKLQotICAgICAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgIT0gTU9ERV9JTlRSQSAmJgotICAgICAgICAgICAgICAgICEobGMtPmN1LnBhcnRfbW9kZSA9PSBQQVJUXzJOeDJOICYmIGxjLT5wdS5tZXJnZV9mbGFnKSkgewotICAgICAgICAgICAgICAgIHJxdF9yb290X2NiZiA9IGZmX2hldmNfbm9fcmVzaWR1YWxfc3ludGF4X2ZsYWdfZGVjb2RlKHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJxdF9yb290X2NiZikgewotICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgY2JmWzJdID0geyAwIH07Ci0gICAgICAgICAgICAgICAgbGMtPmN1Lm1heF90cmFmb19kZXB0aCA9IGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBzLnNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEgKyBsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBzLnNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXI7Ci0gICAgICAgICAgICAgICAgcmV0ID0gaGxzX3RyYW5zZm9ybV90cmVlKHMsIHgwLCB5MCwgeDAsIHkwLCB4MCwgeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfY2Jfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMl9jYl9zaXplLCAwLCAwLCBjYmYsIGNiZik7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghcy0+c2guZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKQotICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzLT5wcy5wcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZyAmJiBsYy0+dHUuaXNfY3VfcXBfZGVsdGFfY29kZWQgPT0gMCkKLSAgICAgICAgZmZfaGV2Y19zZXRfcVB5KHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKLQotICAgIHggPSB5X2NiICogbWluX2NiX3dpZHRoICsgeF9jYjsKLSAgICBmb3IgKHkgPSAwOyB5IDwgbGVuZ3RoOyB5KyspIHsKLSAgICAgICAgbWVtc2V0KCZzLT5xcF95X3RhYlt4XSwgbGMtPnFwX3ksIGxlbmd0aCk7Ci0gICAgICAgIHggKz0gbWluX2NiX3dpZHRoOwotICAgIH0KLQotICAgIGlmKCgoeDAgKyAoMTw8bG9nMl9jYl9zaXplKSkgJiBxcF9ibG9ja19tYXNrKSA9PSAwICYmCi0gICAgICAgKCh5MCArICgxPDxsb2cyX2NiX3NpemUpKSAmIHFwX2Jsb2NrX21hc2spID09IDApIHsKLSAgICAgICAgbGMtPnFQeV9wcmVkID0gbGMtPnFwX3k7Ci0gICAgfQotCi0gICAgc2V0X2N0X2RlcHRoKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplLCBsYy0+Y3RfZGVwdGgpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGxzX2NvZGluZ19xdWFkdHJlZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfY2Jfc2l6ZSwgaW50IGNiX2RlcHRoKQotewotICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOwotICAgIGNvbnN0IGludCBjYl9zaXplICAgID0gMSA8PCBsb2cyX2NiX3NpemU7Ci0gICAgaW50IHJldDsKLSAgICBpbnQgc3BsaXRfY3U7Ci0KLSAgICBsYy0+Y3RfZGVwdGggPSBjYl9kZXB0aDsKLSAgICBpZiAoeDAgKyBjYl9zaXplIDw9IHMtPnBzLnNwcy0+d2lkdGggICYmCi0gICAgICAgIHkwICsgY2Jfc2l6ZSA8PSBzLT5wcy5zcHMtPmhlaWdodCAmJgotICAgICAgICBsb2cyX2NiX3NpemUgPiBzLT5wcy5zcHMtPmxvZzJfbWluX2NiX3NpemUpIHsKLSAgICAgICAgc3BsaXRfY3UgPSBmZl9oZXZjX3NwbGl0X2NvZGluZ191bml0X2ZsYWdfZGVjb2RlKHMsIGNiX2RlcHRoLCB4MCwgeTApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwbGl0X2N1ID0gKGxvZzJfY2Jfc2l6ZSA+IHMtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZSk7Ci0gICAgfQotICAgIGlmIChzLT5wcy5wcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZyAmJgotICAgICAgICBsb2cyX2NiX3NpemUgPj0gcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplIC0gcy0+cHMucHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoKSB7Ci0gICAgICAgIGxjLT50dS5pc19jdV9xcF9kZWx0YV9jb2RlZCA9IDA7Ci0gICAgICAgIGxjLT50dS5jdV9xcF9kZWx0YSAgICAgICAgICA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHMtPnNoLmN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnICYmCi0gICAgICAgIGxvZzJfY2Jfc2l6ZSA+PSBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUgLSBzLT5wcy5wcHMtPmRpZmZfY3VfY2hyb21hX3FwX29mZnNldF9kZXB0aCkgewotICAgICAgICBsYy0+dHUuaXNfY3VfY2hyb21hX3FwX29mZnNldF9jb2RlZCA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHNwbGl0X2N1KSB7Ci0gICAgICAgIGludCBxcF9ibG9ja19tYXNrID0gKDE8PChzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUgLSBzLT5wcy5wcHMtPmRpZmZfY3VfcXBfZGVsdGFfZGVwdGgpKSAtIDE7Ci0gICAgICAgIGNvbnN0IGludCBjYl9zaXplX3NwbGl0ID0gY2Jfc2l6ZSA+PiAxOwotICAgICAgICBjb25zdCBpbnQgeDEgPSB4MCArIGNiX3NpemVfc3BsaXQ7Ci0gICAgICAgIGNvbnN0IGludCB5MSA9IHkwICsgY2Jfc2l6ZV9zcGxpdDsKLQotICAgICAgICBpbnQgbW9yZV9kYXRhID0gMDsKLQotICAgICAgICBtb3JlX2RhdGEgPSBobHNfY29kaW5nX3F1YWR0cmVlKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplIC0gMSwgY2JfZGVwdGggKyAxKTsKLSAgICAgICAgaWYgKG1vcmVfZGF0YSA8IDApCi0gICAgICAgICAgICByZXR1cm4gbW9yZV9kYXRhOwotCi0gICAgICAgIGlmIChtb3JlX2RhdGEgJiYgeDEgPCBzLT5wcy5zcHMtPndpZHRoKSB7Ci0gICAgICAgICAgICBtb3JlX2RhdGEgPSBobHNfY29kaW5nX3F1YWR0cmVlKHMsIHgxLCB5MCwgbG9nMl9jYl9zaXplIC0gMSwgY2JfZGVwdGggKyAxKTsKLSAgICAgICAgICAgIGlmIChtb3JlX2RhdGEgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBtb3JlX2RhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vcmVfZGF0YSAmJiB5MSA8IHMtPnBzLnNwcy0+aGVpZ2h0KSB7Ci0gICAgICAgICAgICBtb3JlX2RhdGEgPSBobHNfY29kaW5nX3F1YWR0cmVlKHMsIHgwLCB5MSwgbG9nMl9jYl9zaXplIC0gMSwgY2JfZGVwdGggKyAxKTsKLSAgICAgICAgICAgIGlmIChtb3JlX2RhdGEgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiBtb3JlX2RhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1vcmVfZGF0YSAmJiB4MSA8IHMtPnBzLnNwcy0+d2lkdGggJiYKLSAgICAgICAgICAgIHkxIDwgcy0+cHMuc3BzLT5oZWlnaHQpIHsKLSAgICAgICAgICAgIG1vcmVfZGF0YSA9IGhsc19jb2RpbmdfcXVhZHRyZWUocywgeDEsIHkxLCBsb2cyX2NiX3NpemUgLSAxLCBjYl9kZXB0aCArIDEpOwotICAgICAgICAgICAgaWYgKG1vcmVfZGF0YSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1vcmVfZGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKCgoeDAgKyAoMTw8bG9nMl9jYl9zaXplKSkgJiBxcF9ibG9ja19tYXNrKSA9PSAwICYmCi0gICAgICAgICAgICAoKHkwICsgKDE8PGxvZzJfY2Jfc2l6ZSkpICYgcXBfYmxvY2tfbWFzaykgPT0gMCkKLSAgICAgICAgICAgIGxjLT5xUHlfcHJlZCA9IGxjLT5xcF95OwotCi0gICAgICAgIGlmIChtb3JlX2RhdGEpCi0gICAgICAgICAgICByZXR1cm4gKCh4MSArIGNiX3NpemVfc3BsaXQpIDwgcy0+cHMuc3BzLT53aWR0aCB8fAotICAgICAgICAgICAgICAgICAgICAoeTEgKyBjYl9zaXplX3NwbGl0KSA8IHMtPnBzLnNwcy0+aGVpZ2h0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0ID0gaGxzX2NvZGluZ191bml0KHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICBpZiAoKCEoKHgwICsgY2Jfc2l6ZSkgJQotICAgICAgICAgICAgICAgKDEgPDwgKHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSkpKSB8fAotICAgICAgICAgICAgICh4MCArIGNiX3NpemUgPj0gcy0+cHMuc3BzLT53aWR0aCkpICYmCi0gICAgICAgICAgICAoISgoeTAgKyBjYl9zaXplKSAlCi0gICAgICAgICAgICAgICAoMSA8PCAocy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKSkpIHx8Ci0gICAgICAgICAgICAgKHkwICsgY2Jfc2l6ZSA+PSBzLT5wcy5zcHMtPmhlaWdodCkpKSB7Ci0gICAgICAgICAgICBpbnQgZW5kX29mX3NsaWNlX2ZsYWcgPSBmZl9oZXZjX2VuZF9vZl9zbGljZV9mbGFnX2RlY29kZShzKTsKLSAgICAgICAgICAgIHJldHVybiAhZW5kX29mX3NsaWNlX2ZsYWc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBobHNfZGVjb2RlX25laWdoYm91cihIRVZDQ29udGV4dCAqcywgaW50IHhfY3RiLCBpbnQgeV9jdGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3RiX2FkZHJfdHMpCi17Ci0gICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgID0gcy0+SEVWQ2xjOwotICAgIGludCBjdGJfc2l6ZSAgICAgICAgICA9IDEgPDwgcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplOwotICAgIGludCBjdGJfYWRkcl9ycyAgICAgICA9IHMtPnBzLnBwcy0+Y3RiX2FkZHJfdHNfdG9fcnNbY3RiX2FkZHJfdHNdOwotICAgIGludCBjdGJfYWRkcl9pbl9zbGljZSA9IGN0Yl9hZGRyX3JzIC0gcy0+c2guc2xpY2VfYWRkcjsKLQotICAgIHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzXSA9IHMtPnNoLnNsaWNlX2FkZHI7Ci0KLSAgICBpZiAocy0+cHMucHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykgewotICAgICAgICBpZiAoeF9jdGIgPT0gMCAmJiAoeV9jdGIgJiAoY3RiX3NpemUgLSAxKSkgPT0gMCkKLSAgICAgICAgICAgIGxjLT5maXJzdF9xcF9ncm91cCA9IDE7Ci0gICAgICAgIGxjLT5lbmRfb2ZfdGlsZXNfeCA9IHMtPnBzLnNwcy0+d2lkdGg7Ci0gICAgfSBlbHNlIGlmIChzLT5wcy5wcHMtPnRpbGVzX2VuYWJsZWRfZmxhZykgewotICAgICAgICBpZiAoY3RiX2FkZHJfdHMgJiYgcy0+cHMucHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcy5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHMgLSAxXSkgewotICAgICAgICAgICAgaW50IGlkeFggPSBzLT5wcy5wcHMtPmNvbF9pZHhYW3hfY3RiID4+IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZV07Ci0gICAgICAgICAgICBsYy0+ZW5kX29mX3RpbGVzX3ggICA9IHhfY3RiICsgKHMtPnBzLnBwcy0+Y29sdW1uX3dpZHRoW2lkeFhdIDw8IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSk7Ci0gICAgICAgICAgICBsYy0+Zmlyc3RfcXBfZ3JvdXAgICA9IDE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBsYy0+ZW5kX29mX3RpbGVzX3ggPSBzLT5wcy5zcHMtPndpZHRoOwotICAgIH0KLQotICAgIGxjLT5lbmRfb2ZfdGlsZXNfeSA9IEZGTUlOKHlfY3RiICsgY3RiX3NpemUsIHMtPnBzLnNwcy0+aGVpZ2h0KTsKLQotICAgIGxjLT5ib3VuZGFyeV9mbGFncyA9IDA7Ci0gICAgaWYgKHMtPnBzLnBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnKSB7Ci0gICAgICAgIGlmICh4X2N0YiA+IDAgJiYgcy0+cHMucHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcy5wcHMtPnRpbGVfaWRbcy0+cHMucHBzLT5jdGJfYWRkcl9yc190b190c1tjdGJfYWRkcl9ycyAtIDFdXSkKLSAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9MRUZUX1RJTEU7Ci0gICAgICAgIGlmICh4X2N0YiA+IDAgJiYgcy0+dGFiX3NsaWNlX2FkZHJlc3NbY3RiX2FkZHJfcnNdICE9IHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzIC0gMV0pCi0gICAgICAgICAgICBsYy0+Ym91bmRhcnlfZmxhZ3MgfD0gQk9VTkRBUllfTEVGVF9TTElDRTsKLSAgICAgICAgaWYgKHlfY3RiID4gMCAmJiBzLT5wcy5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHNdICE9IHMtPnBzLnBwcy0+dGlsZV9pZFtzLT5wcy5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW2N0Yl9hZGRyX3JzIC0gcy0+cHMuc3BzLT5jdGJfd2lkdGhdXSkKLSAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9VUFBFUl9USUxFOwotICAgICAgICBpZiAoeV9jdGIgPiAwICYmIHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzXSAhPSBzLT50YWJfc2xpY2VfYWRkcmVzc1tjdGJfYWRkcl9ycyAtIHMtPnBzLnNwcy0+Y3RiX3dpZHRoXSkKLSAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9VUFBFUl9TTElDRTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoY3RiX2FkZHJfaW5fc2xpY2UgPD0gMCkKLSAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9MRUZUX1NMSUNFOwotICAgICAgICBpZiAoY3RiX2FkZHJfaW5fc2xpY2UgPCBzLT5wcy5zcHMtPmN0Yl93aWR0aCkKLSAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9VUFBFUl9TTElDRTsKLSAgICB9Ci0KLSAgICBsYy0+Y3RiX2xlZnRfZmxhZyA9ICgoeF9jdGIgPiAwKSAmJiAoY3RiX2FkZHJfaW5fc2xpY2UgPiAwKSAmJiAhKGxjLT5ib3VuZGFyeV9mbGFncyAmIEJPVU5EQVJZX0xFRlRfVElMRSkpOwotICAgIGxjLT5jdGJfdXBfZmxhZyAgID0gKCh5X2N0YiA+IDApICYmIChjdGJfYWRkcl9pbl9zbGljZSA+PSBzLT5wcy5zcHMtPmN0Yl93aWR0aCkgJiYgIShsYy0+Ym91bmRhcnlfZmxhZ3MgJiBCT1VOREFSWV9VUFBFUl9USUxFKSk7Ci0gICAgbGMtPmN0Yl91cF9yaWdodF9mbGFnID0gKCh5X2N0YiA+IDApICAmJiAoY3RiX2FkZHJfaW5fc2xpY2UrMSA+PSBzLT5wcy5zcHMtPmN0Yl93aWR0aCkgJiYgKHMtPnBzLnBwcy0+dGlsZV9pZFtjdGJfYWRkcl90c10gPT0gcy0+cHMucHBzLT50aWxlX2lkW3MtPnBzLnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnMrMSAtIHMtPnBzLnNwcy0+Y3RiX3dpZHRoXV0pKTsKLSAgICBsYy0+Y3RiX3VwX2xlZnRfZmxhZyA9ICgoeF9jdGIgPiAwKSAmJiAoeV9jdGIgPiAwKSAgJiYgKGN0Yl9hZGRyX2luX3NsaWNlLTEgPj0gcy0+cHMuc3BzLT5jdGJfd2lkdGgpICYmIChzLT5wcy5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHNdID09IHMtPnBzLnBwcy0+dGlsZV9pZFtzLT5wcy5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW2N0Yl9hZGRyX3JzLTEgLSBzLT5wcy5zcHMtPmN0Yl93aWR0aF1dKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaGxzX2RlY29kZV9lbnRyeShBVkNvZGVjQ29udGV4dCAqYXZjdHh0LCB2b2lkICppc0ZpbHRlclRocmVhZCkKLXsKLSAgICBIRVZDQ29udGV4dCAqcyAgPSBhdmN0eHQtPnByaXZfZGF0YTsKLSAgICBpbnQgY3RiX3NpemUgICAgPSAxIDw8IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZTsKLSAgICBpbnQgbW9yZV9kYXRhICAgPSAxOwotICAgIGludCB4X2N0YiAgICAgICA9IDA7Ci0gICAgaW50IHlfY3RiICAgICAgID0gMDsKLSAgICBpbnQgY3RiX2FkZHJfdHMgPSBzLT5wcy5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW3MtPnNoLnNsaWNlX2N0Yl9hZGRyX3JzXTsKLQotICAgIGlmICghY3RiX2FkZHJfdHMgJiYgcy0+c2guZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZykgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkltcG9zc2libGUgaW5pdGlhbCB0aWxlLlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIH0KLQotICAgIGlmIChzLT5zaC5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnKSB7Ci0gICAgICAgIGludCBwcmV2X3JzID0gcy0+cHMucHBzLT5jdGJfYWRkcl90c190b19yc1tjdGJfYWRkcl90cyAtIDFdOwotICAgICAgICBpZiAocy0+dGFiX3NsaWNlX2FkZHJlc3NbcHJldl9yc10gIT0gcy0+c2guc2xpY2VfYWRkcikgewotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcmV2aW91cyBzbGljZSBzZWdtZW50IG1pc3NpbmdcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAobW9yZV9kYXRhICYmIGN0Yl9hZGRyX3RzIDwgcy0+cHMuc3BzLT5jdGJfc2l6ZSkgewotICAgICAgICBpbnQgY3RiX2FkZHJfcnMgPSBzLT5wcy5wcHMtPmN0Yl9hZGRyX3RzX3RvX3JzW2N0Yl9hZGRyX3RzXTsKLQotICAgICAgICB4X2N0YiA9IChjdGJfYWRkcl9ycyAlICgocy0+cHMuc3BzLT53aWR0aCArIGN0Yl9zaXplIC0gMSkgPj4gcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKSkgPDwgcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplOwotICAgICAgICB5X2N0YiA9IChjdGJfYWRkcl9ycyAvICgocy0+cHMuc3BzLT53aWR0aCArIGN0Yl9zaXplIC0gMSkgPj4gcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKSkgPDwgcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplOwotICAgICAgICBobHNfZGVjb2RlX25laWdoYm91cihzLCB4X2N0YiwgeV9jdGIsIGN0Yl9hZGRyX3RzKTsKLQotICAgICAgICBmZl9oZXZjX2NhYmFjX2luaXQocywgY3RiX2FkZHJfdHMpOwotCi0gICAgICAgIGhsc19zYW9fcGFyYW0ocywgeF9jdGIgPj4gcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplLCB5X2N0YiA+PiBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUpOwotCi0gICAgICAgIHMtPmRlYmxvY2tbY3RiX2FkZHJfcnNdLmJldGFfb2Zmc2V0ID0gcy0+c2guYmV0YV9vZmZzZXQ7Ci0gICAgICAgIHMtPmRlYmxvY2tbY3RiX2FkZHJfcnNdLnRjX29mZnNldCAgID0gcy0+c2gudGNfb2Zmc2V0OwotICAgICAgICBzLT5maWx0ZXJfc2xpY2VfZWRnZXNbY3RiX2FkZHJfcnNdICA9IHMtPnNoLnNsaWNlX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnOwotCi0gICAgICAgIG1vcmVfZGF0YSA9IGhsc19jb2RpbmdfcXVhZHRyZWUocywgeF9jdGIsIHlfY3RiLCBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUsIDApOwotICAgICAgICBpZiAobW9yZV9kYXRhIDwgMCkgewotICAgICAgICAgICAgcy0+dGFiX3NsaWNlX2FkZHJlc3NbY3RiX2FkZHJfcnNdID0gLTE7Ci0gICAgICAgICAgICByZXR1cm4gbW9yZV9kYXRhOwotICAgICAgICB9Ci0KLQotICAgICAgICBjdGJfYWRkcl90cysrOwotICAgICAgICBmZl9oZXZjX3NhdmVfc3RhdGVzKHMsIGN0Yl9hZGRyX3RzKTsKLSAgICAgICAgZmZfaGV2Y19obHNfZmlsdGVycyhzLCB4X2N0YiwgeV9jdGIsIGN0Yl9zaXplKTsKLSAgICB9Ci0KLSAgICBpZiAoeF9jdGIgKyBjdGJfc2l6ZSA+PSBzLT5wcy5zcHMtPndpZHRoICYmCi0gICAgICAgIHlfY3RiICsgY3RiX3NpemUgPj0gcy0+cHMuc3BzLT5oZWlnaHQpCi0gICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcihzLCB4X2N0YiwgeV9jdGIsIGN0Yl9zaXplKTsKLQotICAgIHJldHVybiBjdGJfYWRkcl90czsKLX0KLQotc3RhdGljIGludCBobHNfc2xpY2VfZGF0YShIRVZDQ29udGV4dCAqcykKLXsKLSAgICBpbnQgYXJnWzJdOwotICAgIGludCByZXRbMl07Ci0KLSAgICBhcmdbMF0gPSAwOwotICAgIGFyZ1sxXSA9IDE7Ci0KLSAgICBzLT5hdmN0eC0+ZXhlY3V0ZShzLT5hdmN0eCwgaGxzX2RlY29kZV9lbnRyeSwgYXJnLCByZXQgLCAxLCBzaXplb2YoaW50KSk7Ci0gICAgcmV0dXJuIHJldFswXTsKLX0KLXN0YXRpYyBpbnQgaGxzX2RlY29kZV9lbnRyeV93cHAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4dCwgdm9pZCAqaW5wdXRfY3RiX3JvdywgaW50IGpvYiwgaW50IHNlbGZfaWQpCi17Ci0gICAgSEVWQ0NvbnRleHQgKnMxICA9IGF2Y3R4dC0+cHJpdl9kYXRhLCAqczsKLSAgICBIRVZDTG9jYWxDb250ZXh0ICpsYzsKLSAgICBpbnQgY3RiX3NpemUgICAgPSAxPDwgczEtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZTsKLSAgICBpbnQgbW9yZV9kYXRhICAgPSAxOwotICAgIGludCAqY3RiX3Jvd19wICAgID0gaW5wdXRfY3RiX3JvdzsKLSAgICBpbnQgY3RiX3JvdyA9IGN0Yl9yb3dfcFtqb2JdOwotICAgIGludCBjdGJfYWRkcl9ycyA9IHMxLT5zaC5zbGljZV9jdGJfYWRkcl9ycyArIGN0Yl9yb3cgKiAoKHMxLT5wcy5zcHMtPndpZHRoICsgY3RiX3NpemUgLSAxKSA+PiBzMS0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKTsKLSAgICBpbnQgY3RiX2FkZHJfdHMgPSBzMS0+cHMucHBzLT5jdGJfYWRkcl9yc190b190c1tjdGJfYWRkcl9yc107Ci0gICAgaW50IHRocmVhZCA9IGN0Yl9yb3cgJSBzMS0+dGhyZWFkc19udW1iZXI7Ci0gICAgaW50IHJldDsKLQotICAgIHMgPSBzMS0+c0xpc3Rbc2VsZl9pZF07Ci0gICAgbGMgPSBzLT5IRVZDbGM7Ci0KLSAgICBpZihjdGJfcm93KSB7Ci0gICAgICAgIHJldCA9IGluaXRfZ2V0X2JpdHM4KCZsYy0+Z2IsIHMtPmRhdGEgKyBzLT5zaC5vZmZzZXRbY3RiX3JvdyAtIDFdLCBzLT5zaC5zaXplW2N0Yl9yb3cgLSAxXSk7Ci0KLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICBmZl9pbml0X2NhYmFjX2RlY29kZXIoJmxjLT5jYywgcy0+ZGF0YSArIHMtPnNoLm9mZnNldFsoY3RiX3JvdyktMV0sIHMtPnNoLnNpemVbY3RiX3JvdyAtIDFdKTsKLSAgICB9Ci0KLSAgICB3aGlsZShtb3JlX2RhdGEgJiYgY3RiX2FkZHJfdHMgPCBzLT5wcy5zcHMtPmN0Yl9zaXplKSB7Ci0gICAgICAgIGludCB4X2N0YiA9IChjdGJfYWRkcl9ycyAlIHMtPnBzLnNwcy0+Y3RiX3dpZHRoKSA8PCBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemU7Ci0gICAgICAgIGludCB5X2N0YiA9IChjdGJfYWRkcl9ycyAvIHMtPnBzLnNwcy0+Y3RiX3dpZHRoKSA8PCBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemU7Ci0KLSAgICAgICAgaGxzX2RlY29kZV9uZWlnaGJvdXIocywgeF9jdGIsIHlfY3RiLCBjdGJfYWRkcl90cyk7Ci0KLSAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzMihzLT5hdmN0eCwgY3RiX3JvdywgdGhyZWFkLCBTSElGVF9DVEJfV1BQKTsKLQotICAgICAgICBpZiAoYXZwcml2X2F0b21pY19pbnRfZ2V0KCZzMS0+d3BwX2VycikpewotICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3cgLCB0aHJlYWQsIFNISUZUX0NUQl9XUFApOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBmZl9oZXZjX2NhYmFjX2luaXQocywgY3RiX2FkZHJfdHMpOwotICAgICAgICBobHNfc2FvX3BhcmFtKHMsIHhfY3RiID4+IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSwgeV9jdGIgPj4gcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKTsKLSAgICAgICAgbW9yZV9kYXRhID0gaGxzX2NvZGluZ19xdWFkdHJlZShzLCB4X2N0YiwgeV9jdGIsIHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSwgMCk7Ci0KLSAgICAgICAgaWYgKG1vcmVfZGF0YSA8IDApIHsKLSAgICAgICAgICAgIHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzXSA9IC0xOwotICAgICAgICAgICAgYXZwcml2X2F0b21pY19pbnRfc2V0KCZzMS0+d3BwX2VyciwgIDEpOwotICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3cgLHRocmVhZCwgU0hJRlRfQ1RCX1dQUCk7Ci0gICAgICAgICAgICByZXR1cm4gbW9yZV9kYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgY3RiX2FkZHJfdHMrKzsKLQotICAgICAgICBmZl9oZXZjX3NhdmVfc3RhdGVzKHMsIGN0Yl9hZGRyX3RzKTsKLSAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3csIHRocmVhZCwgMSk7Ci0gICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcnMocywgeF9jdGIsIHlfY3RiLCBjdGJfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKCFtb3JlX2RhdGEgJiYgKHhfY3RiK2N0Yl9zaXplKSA8IHMtPnBzLnNwcy0+d2lkdGggJiYgY3RiX3JvdyAhPSBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cykgewotICAgICAgICAgICAgYXZwcml2X2F0b21pY19pbnRfc2V0KCZzMS0+d3BwX2VyciwgIDEpOwotICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3cgLHRocmVhZCwgU0hJRlRfQ1RCX1dQUCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoeF9jdGIrY3RiX3NpemUpID49IHMtPnBzLnNwcy0+d2lkdGggJiYgKHlfY3RiK2N0Yl9zaXplKSA+PSBzLT5wcy5zcHMtPmhlaWdodCApIHsKLSAgICAgICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcihzLCB4X2N0YiwgeV9jdGIsIGN0Yl9zaXplKTsKLSAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MyKHMtPmF2Y3R4LCBjdGJfcm93ICwgdGhyZWFkLCBTSElGVF9DVEJfV1BQKTsKLSAgICAgICAgICAgIHJldHVybiBjdGJfYWRkcl90czsKLSAgICAgICAgfQotICAgICAgICBjdGJfYWRkcl9ycyAgICAgICA9IHMtPnBzLnBwcy0+Y3RiX2FkZHJfdHNfdG9fcnNbY3RiX2FkZHJfdHNdOwotICAgICAgICB4X2N0Yis9Y3RiX3NpemU7Ci0KLSAgICAgICAgaWYoeF9jdGIgPj0gcy0+cHMuc3BzLT53aWR0aCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3cgLHRocmVhZCwgU0hJRlRfQ1RCX1dQUCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBobHNfc2xpY2VfZGF0YV93cHAoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IEhFVkNOQUwgKm5hbCkKLXsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbmFsLT5kYXRhOwotICAgIGludCBsZW5ndGggICAgICAgICAgPSBuYWwtPnNpemU7Ci0gICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7Ci0gICAgaW50ICpyZXQgPSBhdl9tYWxsb2NfYXJyYXkocy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgKyAxLCBzaXplb2YoaW50KSk7Ci0gICAgaW50ICphcmcgPSBhdl9tYWxsb2NfYXJyYXkocy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgKyAxLCBzaXplb2YoaW50KSk7Ci0gICAgaW50NjRfdCBvZmZzZXQ7Ci0gICAgaW50NjRfdCBzdGFydGhlYWRlciwgY21wdCA9IDA7Ci0gICAgaW50IGksIGosIHJlcyA9IDA7Ci0KLSAgICBpZiAoIXJldCB8fCAhYXJnKSB7Ci0gICAgICAgIGF2X2ZyZWUocmV0KTsKLSAgICAgICAgYXZfZnJlZShhcmcpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIGlmIChzLT5zaC5zbGljZV9jdGJfYWRkcl9ycyArIHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzICogcy0+cHMuc3BzLT5jdGJfd2lkdGggPj0gcy0+cHMuc3BzLT5jdGJfd2lkdGggKiBzLT5wcy5zcHMtPmN0Yl9oZWlnaHQpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJXUFAgY3RiIGFkZHJlc3NlcyBhcmUgd3JvbmcgKCVkICVkICVkICVkKVxuIiwKLSAgICAgICAgICAgIHMtPnNoLnNsaWNlX2N0Yl9hZGRyX3JzLCBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cywKLSAgICAgICAgICAgIHMtPnBzLnNwcy0+Y3RiX3dpZHRoLCBzLT5wcy5zcHMtPmN0Yl9oZWlnaHQKLSAgICAgICAgKTsKLSAgICAgICAgcmVzID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBmZl9hbGxvY19lbnRyaWVzKHMtPmF2Y3R4LCBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyArIDEpOwotCi0gICAgaWYgKCFzLT5zTGlzdFsxXSkgewotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcy0+dGhyZWFkc19udW1iZXI7IGkrKykgewotICAgICAgICAgICAgcy0+c0xpc3RbaV0gPSBhdl9tYWxsb2Moc2l6ZW9mKEhFVkNDb250ZXh0KSk7Ci0gICAgICAgICAgICBtZW1jcHkocy0+c0xpc3RbaV0sIHMsIHNpemVvZihIRVZDQ29udGV4dCkpOwotICAgICAgICAgICAgcy0+SEVWQ2xjTGlzdFtpXSA9IGF2X21hbGxvY3ooc2l6ZW9mKEhFVkNMb2NhbENvbnRleHQpKTsKLSAgICAgICAgICAgIHMtPnNMaXN0W2ldLT5IRVZDbGMgPSBzLT5IRVZDbGNMaXN0W2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgb2Zmc2V0ID0gKGxjLT5nYi5pbmRleCA+PiAzKTsKLQotICAgIGZvciAoaiA9IDAsIGNtcHQgPSAwLCBzdGFydGhlYWRlciA9IG9mZnNldCArIHMtPnNoLmVudHJ5X3BvaW50X29mZnNldFswXTsgaiA8IG5hbC0+c2tpcHBlZF9ieXRlczsgaisrKSB7Ci0gICAgICAgIGlmIChuYWwtPnNraXBwZWRfYnl0ZXNfcG9zW2pdID49IG9mZnNldCAmJiBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zW2pdIDwgc3RhcnRoZWFkZXIpIHsKLSAgICAgICAgICAgIHN0YXJ0aGVhZGVyLS07Ci0gICAgICAgICAgICBjbXB0Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHM7IGkrKykgewotICAgICAgICBvZmZzZXQgKz0gKHMtPnNoLmVudHJ5X3BvaW50X29mZnNldFtpIC0gMV0gLSBjbXB0KTsKLSAgICAgICAgZm9yIChqID0gMCwgY21wdCA9IDAsIHN0YXJ0aGVhZGVyID0gb2Zmc2V0Ci0gICAgICAgICAgICAgKyBzLT5zaC5lbnRyeV9wb2ludF9vZmZzZXRbaV07IGogPCBuYWwtPnNraXBwZWRfYnl0ZXM7IGorKykgewotICAgICAgICAgICAgaWYgKG5hbC0+c2tpcHBlZF9ieXRlc19wb3Nbal0gPj0gb2Zmc2V0ICYmIG5hbC0+c2tpcHBlZF9ieXRlc19wb3Nbal0gPCBzdGFydGhlYWRlcikgewotICAgICAgICAgICAgICAgIHN0YXJ0aGVhZGVyLS07Ci0gICAgICAgICAgICAgICAgY21wdCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHMtPnNoLnNpemVbaSAtIDFdID0gcy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0W2ldIC0gY21wdDsKLSAgICAgICAgcy0+c2gub2Zmc2V0W2kgLSAxXSA9IG9mZnNldDsKLQotICAgIH0KLSAgICBpZiAocy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgIT0gMCkgewotICAgICAgICBvZmZzZXQgKz0gcy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0W3MtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzIC0gMV0gLSBjbXB0OwotICAgICAgICBpZiAobGVuZ3RoIDwgb2Zmc2V0KSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVudHJ5X3BvaW50X29mZnNldCB0YWJsZSBpcyBjb3JydXB0ZWRcbiIpOwotICAgICAgICAgICAgcmVzID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgcy0+c2guc2l6ZVtzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyAtIDFdID0gbGVuZ3RoIC0gb2Zmc2V0OwotICAgICAgICBzLT5zaC5vZmZzZXRbcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgLSAxXSA9IG9mZnNldDsKLQotICAgIH0KLSAgICBzLT5kYXRhID0gZGF0YTsKLQotICAgIGZvciAoaSA9IDE7IGkgPCBzLT50aHJlYWRzX251bWJlcjsgaSsrKSB7Ci0gICAgICAgIHMtPnNMaXN0W2ldLT5IRVZDbGMtPmZpcnN0X3FwX2dyb3VwID0gMTsKLSAgICAgICAgcy0+c0xpc3RbaV0tPkhFVkNsYy0+cXBfeSA9IHMtPnNMaXN0WzBdLT5IRVZDbGMtPnFwX3k7Ci0gICAgICAgIG1lbWNweShzLT5zTGlzdFtpXSwgcywgc2l6ZW9mKEhFVkNDb250ZXh0KSk7Ci0gICAgICAgIHMtPnNMaXN0W2ldLT5IRVZDbGMgPSBzLT5IRVZDbGNMaXN0W2ldOwotICAgIH0KLQotICAgIGF2cHJpdl9hdG9taWNfaW50X3NldCgmcy0+d3BwX2VyciwgMCk7Ci0gICAgZmZfcmVzZXRfZW50cmllcyhzLT5hdmN0eCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDw9IHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzOyBpKyspIHsKLSAgICAgICAgYXJnW2ldID0gaTsKLSAgICAgICAgcmV0W2ldID0gMDsKLSAgICB9Ci0KLSAgICBpZiAocy0+cHMucHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykKLSAgICAgICAgcy0+YXZjdHgtPmV4ZWN1dGUyKHMtPmF2Y3R4LCBobHNfZGVjb2RlX2VudHJ5X3dwcCwgYXJnLCByZXQsIHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzICsgMSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDw9IHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzOyBpKyspCi0gICAgICAgIHJlcyArPSByZXRbaV07Ci1lcnJvcjoKLSAgICBhdl9mcmVlKHJldCk7Ci0gICAgYXZfZnJlZShhcmcpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3NpZGVfZGF0YShIRVZDQ29udGV4dCAqcykKLXsKLSAgICBBVkZyYW1lICpvdXQgPSBzLT5yZWYtPmZyYW1lOwotCi0gICAgaWYgKHMtPnNlaV9mcmFtZV9wYWNraW5nX3ByZXNlbnQgJiYKLSAgICAgICAgcy0+ZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlID49IDMgJiYKLSAgICAgICAgcy0+ZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlIDw9IDUgJiYKLSAgICAgICAgcy0+Y29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID4gMCAmJgotICAgICAgICBzLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPCAzKSB7Ci0gICAgICAgIEFWU3RlcmVvM0QgKnN0ZXJlbyA9IGF2X3N0ZXJlbzNkX2NyZWF0ZV9zaWRlX2RhdGEob3V0KTsKLSAgICAgICAgaWYgKCFzdGVyZW8pCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgICAgIHN3aXRjaCAocy0+ZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlKSB7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGlmIChzLT5xdWluY3VueF9zdWJzYW1wbGluZykKLSAgICAgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9TSURFQllTSURFX1FVSU5DVU5YOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX1NJREVCWVNJREU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfVE9QQk9UVE9NOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX0ZSQU1FU0VRVUVOQ0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPT0gMikKLSAgICAgICAgICAgIHN0ZXJlby0+ZmxhZ3MgPSBBVl9TVEVSRU8zRF9GTEFHX0lOVkVSVDsKLSAgICB9Ci0KLSAgICBpZiAocy0+c2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudCAmJgotICAgICAgICAocy0+c2VpX2FudGljbG9ja3dpc2Vfcm90YXRpb24gfHwgcy0+c2VpX2hmbGlwIHx8IHMtPnNlaV92ZmxpcCkpIHsKLSAgICAgICAgZG91YmxlIGFuZ2xlID0gcy0+c2VpX2FudGljbG9ja3dpc2Vfcm90YXRpb24gKiAzNjAgLyAoZG91YmxlKSAoMSA8PCAxNik7Ci0gICAgICAgIEFWRnJhbWVTaWRlRGF0YSAqcm90YXRpb24gPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRlJBTUVfREFUQV9ESVNQTEFZTUFUUklYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MzJfdCkgKiA5KTsKLSAgICAgICAgaWYgKCFyb3RhdGlvbikKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgYXZfZGlzcGxheV9yb3RhdGlvbl9zZXQoKGludDMyX3QgKilyb3RhdGlvbi0+ZGF0YSwgYW5nbGUpOwotICAgICAgICBhdl9kaXNwbGF5X21hdHJpeF9mbGlwKChpbnQzMl90ICopcm90YXRpb24tPmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2VpX2hmbGlwLCBzLT5zZWlfdmZsaXApOwotICAgIH0KLQotICAgIC8vIERlY3JlbWVudCB0aGUgbWFzdGVyaW5nIGRpc3BsYXkgZmxhZyB3aGVuIElSQVAgZnJhbWUgaGFzIG5vX3Jhc2xfb3V0cHV0X2ZsYWc9MQotICAgIC8vIHNvIHRoZSBzaWRlIGRhdGEgcGVyc2lzdHMgZm9yIHRoZSBlbnRpcmUgY29kZWQgdmlkZW8gc2VxdWVuY2UuCi0gICAgaWYgKHMtPnNlaV9tYXN0ZXJpbmdfZGlzcGxheV9pbmZvX3ByZXNlbnQgPiAwICYmCi0gICAgICAgIElTX0lSQVAocykgJiYgcy0+bm9fcmFzbF9vdXRwdXRfZmxhZykgewotICAgICAgICBzLT5zZWlfbWFzdGVyaW5nX2Rpc3BsYXlfaW5mb19wcmVzZW50LS07Ci0gICAgfQotICAgIGlmIChzLT5zZWlfbWFzdGVyaW5nX2Rpc3BsYXlfaW5mb19wcmVzZW50KSB7Ci0gICAgICAgIC8vIEhFVkMgdXNlcyBhIGcsYixyIG9yZGVyaW5nLCB3aGljaCB3ZSBjb252ZXJ0IHRvIGEgbW9yZSBuYXR1cmFsIHIsZyxiCi0gICAgICAgIGNvbnN0IGludCBtYXBwaW5nWzNdID0gezIsIDAsIDF9OwotICAgICAgICBjb25zdCBpbnQgY2hyb21hX2RlbiA9IDUwMDAwOwotICAgICAgICBjb25zdCBpbnQgbHVtYV9kZW4gPSAxMDAwMDsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhICptZXRhZGF0YSA9Ci0gICAgICAgICAgICBhdl9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YV9jcmVhdGVfc2lkZV9kYXRhKG91dCk7Ci0gICAgICAgIGlmICghbWV0YWRhdGEpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBqID0gbWFwcGluZ1tpXTsKLSAgICAgICAgICAgIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1tpXVswXS5udW0gPSBzLT5kaXNwbGF5X3ByaW1hcmllc1tqXVswXTsKLSAgICAgICAgICAgIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1tpXVswXS5kZW4gPSBjaHJvbWFfZGVuOwotICAgICAgICAgICAgbWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzW2ldWzFdLm51bSA9IHMtPmRpc3BsYXlfcHJpbWFyaWVzW2pdWzFdOwotICAgICAgICAgICAgbWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzW2ldWzFdLmRlbiA9IGNocm9tYV9kZW47Ci0gICAgICAgIH0KLSAgICAgICAgbWV0YWRhdGEtPndoaXRlX3BvaW50WzBdLm51bSA9IHMtPndoaXRlX3BvaW50WzBdOwotICAgICAgICBtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMF0uZGVuID0gY2hyb21hX2RlbjsKLSAgICAgICAgbWV0YWRhdGEtPndoaXRlX3BvaW50WzFdLm51bSA9IHMtPndoaXRlX3BvaW50WzFdOwotICAgICAgICBtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMV0uZGVuID0gY2hyb21hX2RlbjsKLQotICAgICAgICBtZXRhZGF0YS0+bWF4X2x1bWluYW5jZS5udW0gPSBzLT5tYXhfbWFzdGVyaW5nX2x1bWluYW5jZTsKLSAgICAgICAgbWV0YWRhdGEtPm1heF9sdW1pbmFuY2UuZGVuID0gbHVtYV9kZW47Ci0gICAgICAgIG1ldGFkYXRhLT5taW5fbHVtaW5hbmNlLm51bSA9IHMtPm1pbl9tYXN0ZXJpbmdfbHVtaW5hbmNlOwotICAgICAgICBtZXRhZGF0YS0+bWluX2x1bWluYW5jZS5kZW4gPSBsdW1hX2RlbjsKLSAgICAgICAgbWV0YWRhdGEtPmhhc19sdW1pbmFuY2UgPSAxOwotICAgICAgICBtZXRhZGF0YS0+aGFzX3ByaW1hcmllcyA9IDE7Ci0KLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNYXN0ZXJpbmcgRGlzcGxheSBNZXRhZGF0YTpcbiIpOwotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKLSAgICAgICAgICAgICAgICJyKCU1LjRmLCU1LjRmKSBnKCU1LjRmLCU1LjRmKSBiKCU1LjRmICU1LjRmKSB3cCglNS40ZiwgJTUuNGYpXG4iLAotICAgICAgICAgICAgICAgYXZfcTJkKG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1swXVswXSksCi0gICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzBdWzFdKSwKLSAgICAgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMV1bMF0pLAotICAgICAgICAgICAgICAgYXZfcTJkKG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1sxXVsxXSksCi0gICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzJdWzBdKSwKLSAgICAgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMl1bMV0pLAotICAgICAgICAgICAgICAgYXZfcTJkKG1ldGFkYXRhLT53aGl0ZV9wb2ludFswXSksIGF2X3EyZChtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMV0pKTsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAibWluX2x1bWluYW5jZT0lZiwgbWF4X2x1bWluYW5jZT0lZlxuIiwKLSAgICAgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+bWluX2x1bWluYW5jZSksIGF2X3EyZChtZXRhZGF0YS0+bWF4X2x1bWluYW5jZSkpOwotICAgIH0KLQotICAgIGlmIChzLT5hNTNfY2FwdGlvbikgewotICAgICAgICBBVkZyYW1lU2lkZURhdGEqIHNkID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0ZSQU1FX0RBVEFfQTUzX0NDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hNTNfY2FwdGlvbl9zaXplKTsKLSAgICAgICAgaWYgKHNkKQotICAgICAgICAgICAgbWVtY3B5KHNkLT5kYXRhLCBzLT5hNTNfY2FwdGlvbiwgcy0+YTUzX2NhcHRpb25fc2l6ZSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzLT5hNTNfY2FwdGlvbik7Ci0gICAgICAgIHMtPmE1M19jYXB0aW9uX3NpemUgPSAwOwotICAgICAgICBzLT5hdmN0eC0+cHJvcGVydGllcyB8PSBGRl9DT0RFQ19QUk9QRVJUWV9DTE9TRURfQ0FQVElPTlM7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaGV2Y19mcmFtZV9zdGFydChIRVZDQ29udGV4dCAqcykKLXsKLSAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKLSAgICBpbnQgcGljX3NpemVfaW5fY3RiICA9ICgocy0+cHMuc3BzLT53aWR0aCAgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9jYl9zaXplKSArIDEpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgocy0+cHMuc3BzLT5oZWlnaHQgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9jYl9zaXplKSArIDEpOwotICAgIGludCByZXQ7Ci0KLSAgICBtZW1zZXQocy0+aG9yaXpvbnRhbF9icywgMCwgcy0+YnNfd2lkdGggKiBzLT5ic19oZWlnaHQpOwotICAgIG1lbXNldChzLT52ZXJ0aWNhbF9icywgICAwLCBzLT5ic193aWR0aCAqIHMtPmJzX2hlaWdodCk7Ci0gICAgbWVtc2V0KHMtPmNiZl9sdW1hLCAgICAgIDAsIHMtPnBzLnNwcy0+bWluX3RiX3dpZHRoICogcy0+cHMuc3BzLT5taW5fdGJfaGVpZ2h0KTsKLSAgICBtZW1zZXQocy0+aXNfcGNtLCAgICAgICAgMCwgKHMtPnBzLnNwcy0+bWluX3B1X3dpZHRoICsgMSkgKiAocy0+cHMuc3BzLT5taW5fcHVfaGVpZ2h0ICsgMSkpOwotICAgIG1lbXNldChzLT50YWJfc2xpY2VfYWRkcmVzcywgLTEsIHBpY19zaXplX2luX2N0YiAqIHNpemVvZigqcy0+dGFiX3NsaWNlX2FkZHJlc3MpKTsKLQotICAgIHMtPmlzX2RlY29kZWQgICAgICAgID0gMDsKLSAgICBzLT5maXJzdF9uYWxfdHlwZSAgICA9IHMtPm5hbF91bml0X3R5cGU7Ci0KLSAgICBpZiAocy0+cHMucHBzLT50aWxlc19lbmFibGVkX2ZsYWcpCi0gICAgICAgIGxjLT5lbmRfb2ZfdGlsZXNfeCA9IHMtPnBzLnBwcy0+Y29sdW1uX3dpZHRoWzBdIDw8IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZTsKLQotICAgIHJldCA9IGZmX2hldmNfc2V0X25ld19yZWYocywgJnMtPmZyYW1lLCBzLT5wb2MpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICByZXQgPSBmZl9oZXZjX2ZyYW1lX3JwcyhzKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGNvbnN0cnVjdGluZyB0aGUgZnJhbWUgUlBTLlxuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBzLT5yZWYtPmZyYW1lLT5rZXlfZnJhbWUgPSBJU19JUkFQKHMpOwotCi0gICAgcmV0ID0gc2V0X3NpZGVfZGF0YShzKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgcy0+ZnJhbWUtPnBpY3RfdHlwZSA9IDMgLSBzLT5zaC5zbGljZV90eXBlOwotCi0gICAgaWYgKCFJU19JUkFQKHMpKQotICAgICAgICBmZl9oZXZjX2J1bXBfZnJhbWUocyk7Ci0KLSAgICBhdl9mcmFtZV91bnJlZihzLT5vdXRwdXRfZnJhbWUpOwotICAgIHJldCA9IGZmX2hldmNfb3V0cHV0X2ZyYW1lKHMsIHMtPm91dHB1dF9mcmFtZSwgMCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGlmICghcy0+YXZjdHgtPmh3YWNjZWwpCi0gICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAocy0+YXZjdHgpOwotCi0gICAgcmV0dXJuIDA7Ci0KLWZhaWw6Ci0gICAgaWYgKHMtPnJlZikKLSAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBzLT5yZWYsIH4wKTsKLSAgICBzLT5yZWYgPSBOVUxMOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZGVjb2RlX25hbF91bml0KEhFVkNDb250ZXh0ICpzLCBjb25zdCBIRVZDTkFMICpuYWwpCi17Ci0gICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7Ci0gICAgR2V0Qml0Q29udGV4dCAqZ2IgICAgPSAmbGMtPmdiOwotICAgIGludCBjdGJfYWRkcl90cywgcmV0OwotCi0gICAgKmdiICAgICAgICAgICAgICA9IG5hbC0+Z2I7Ci0gICAgcy0+bmFsX3VuaXRfdHlwZSA9IG5hbC0+dHlwZTsKLSAgICBzLT50ZW1wb3JhbF9pZCAgID0gbmFsLT50ZW1wb3JhbF9pZDsKLQotICAgIHN3aXRjaCAocy0+bmFsX3VuaXRfdHlwZSkgewotICAgIGNhc2UgTkFMX1ZQUzoKLSAgICAgICAgcmV0ID0gZmZfaGV2Y19kZWNvZGVfbmFsX3ZwcyhnYiwgcy0+YXZjdHgsICZzLT5wcyk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BTF9TUFM6Ci0gICAgICAgIHJldCA9IGZmX2hldmNfZGVjb2RlX25hbF9zcHMoZ2IsIHMtPmF2Y3R4LCAmcy0+cHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXBwbHlfZGVmZGlzcHdpbik7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE5BTF9QUFM6Ci0gICAgICAgIHJldCA9IGZmX2hldmNfZGVjb2RlX25hbF9wcHMoZ2IsIHMtPmF2Y3R4LCAmcy0+cHMpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQUxfU0VJX1BSRUZJWDoKLSAgICBjYXNlIE5BTF9TRUlfU1VGRklYOgotICAgICAgICByZXQgPSBmZl9oZXZjX2RlY29kZV9uYWxfc2VpKHMpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQUxfVFJBSUxfUjoKLSAgICBjYXNlIE5BTF9UUkFJTF9OOgotICAgIGNhc2UgTkFMX1RTQV9OOgotICAgIGNhc2UgTkFMX1RTQV9SOgotICAgIGNhc2UgTkFMX1NUU0FfTjoKLSAgICBjYXNlIE5BTF9TVFNBX1I6Ci0gICAgY2FzZSBOQUxfQkxBX1dfTFA6Ci0gICAgY2FzZSBOQUxfQkxBX1dfUkFETDoKLSAgICBjYXNlIE5BTF9CTEFfTl9MUDoKLSAgICBjYXNlIE5BTF9JRFJfV19SQURMOgotICAgIGNhc2UgTkFMX0lEUl9OX0xQOgotICAgIGNhc2UgTkFMX0NSQV9OVVQ6Ci0gICAgY2FzZSBOQUxfUkFETF9OOgotICAgIGNhc2UgTkFMX1JBRExfUjoKLSAgICBjYXNlIE5BTF9SQVNMX046Ci0gICAgY2FzZSBOQUxfUkFTTF9SOgotICAgICAgICByZXQgPSBobHNfc2xpY2VfaGVhZGVyKHMpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgaWYgKHMtPm1heF9yYSA9PSBJTlRfTUFYKSB7Ci0gICAgICAgICAgICBpZiAocy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfQ1JBX05VVCB8fCBJU19CTEEocykpIHsKLSAgICAgICAgICAgICAgICBzLT5tYXhfcmEgPSBzLT5wb2M7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChJU19JRFIocykpCi0gICAgICAgICAgICAgICAgICAgIHMtPm1heF9yYSA9IElOVF9NSU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX1JBU0xfUiB8fCBzLT5uYWxfdW5pdF90eXBlID09IE5BTF9SQVNMX04pICYmCi0gICAgICAgICAgICBzLT5wb2MgPD0gcy0+bWF4X3JhKSB7Ci0gICAgICAgICAgICBzLT5pc19kZWNvZGVkID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX1JBU0xfUiAmJiBzLT5wb2MgPiBzLT5tYXhfcmEpCi0gICAgICAgICAgICAgICAgcy0+bWF4X3JhID0gSU5UX01JTjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5zaC5maXJzdF9zbGljZV9pbl9waWNfZmxhZykgewotICAgICAgICAgICAgcmV0ID0gaGV2Y19mcmFtZV9zdGFydChzKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXMtPnJlZikgewotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaXJzdCBzbGljZSBpbiBhIGZyYW1lIG1pc3NpbmcuXG4iKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5uYWxfdW5pdF90eXBlICE9IHMtPmZpcnN0X25hbF90eXBlKSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiTm9uLW1hdGNoaW5nIE5BTCB0eXBlcyBvZiB0aGUgVkNMIE5BTFVzOiAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBzLT5maXJzdF9uYWxfdHlwZSwgcy0+bmFsX3VuaXRfdHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghcy0+c2guZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZyAmJgotICAgICAgICAgICAgcy0+c2guc2xpY2VfdHlwZSAhPSBJX1NMSUNFKSB7Ci0gICAgICAgICAgICByZXQgPSBmZl9oZXZjX3NsaWNlX3JwbChzKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNvbnN0cnVjdGluZyB0aGUgcmVmZXJlbmNlIGxpc3RzIGZvciB0aGUgY3VycmVudCBzbGljZS5cbiIpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5zaC5maXJzdF9zbGljZV9pbl9waWNfZmxhZyAmJiBzLT5hdmN0eC0+aHdhY2NlbCkgewotICAgICAgICAgICAgcmV0ID0gcy0+YXZjdHgtPmh3YWNjZWwtPnN0YXJ0X2ZyYW1lKHMtPmF2Y3R4LCBOVUxMLCAwKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5hdmN0eC0+aHdhY2NlbCkgewotICAgICAgICAgICAgcmV0ID0gcy0+YXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZShzLT5hdmN0eCwgbmFsLT5yYXdfZGF0YSwgbmFsLT5yYXdfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAocy0+dGhyZWFkc19udW1iZXIgPiAxICYmIHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzID4gMCkKLSAgICAgICAgICAgICAgICBjdGJfYWRkcl90cyA9IGhsc19zbGljZV9kYXRhX3dwcChzLCBuYWwpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGN0Yl9hZGRyX3RzID0gaGxzX3NsaWNlX2RhdGEocyk7Ci0gICAgICAgICAgICBpZiAoY3RiX2FkZHJfdHMgPj0gKHMtPnBzLnNwcy0+Y3RiX3dpZHRoICogcy0+cHMuc3BzLT5jdGJfaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIHMtPmlzX2RlY29kZWQgPSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY3RiX2FkZHJfdHMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gY3RiX2FkZHJfdHM7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTkFMX0VPU19OVVQ6Ci0gICAgY2FzZSBOQUxfRU9CX05VVDoKLSAgICAgICAgcy0+c2VxX2RlY29kZSA9IChzLT5zZXFfZGVjb2RlICsgMSkgJiAweGZmOwotICAgICAgICBzLT5tYXhfcmEgICAgID0gSU5UX01BWDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOQUxfQVVEOgotICAgIGNhc2UgTkFMX0ZEX05VVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICJTa2lwcGluZyBOQUwgdW5pdCAlZFxuIiwgcy0+bmFsX3VuaXRfdHlwZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci1mYWlsOgotICAgIGlmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBkZWNvZGVfbmFsX3VuaXRzKEhFVkNDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW5ndGgpCi17Ci0gICAgaW50IGksIHJldCA9IDA7Ci0KLSAgICBzLT5yZWYgPSBOVUxMOwotICAgIHMtPmxhc3RfZW9zID0gcy0+ZW9zOwotICAgIHMtPmVvcyA9IDA7Ci0KLSAgICAvKiBzcGxpdCB0aGUgaW5wdXQgcGFja2V0IGludG8gTkFMIHVuaXRzLCBzbyB3ZSBrbm93IHRoZSB1cHBlciBib3VuZCBvbiB0aGUKLSAgICAgKiBudW1iZXIgb2Ygc2xpY2VzIGluIHRoZSBmcmFtZSAqLwotICAgIHJldCA9IGZmX2hldmNfc3BsaXRfcGFja2V0KHMsICZzLT5wa3QsIGJ1ZiwgbGVuZ3RoLCBzLT5hdmN0eCwgcy0+aXNfbmFsZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmFsX2xlbmd0aF9zaXplKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJFcnJvciBzcGxpdHRpbmcgdGhlIGlucHV0IGludG8gTkFMIHVuaXRzLlxuIik7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IHMtPnBrdC5uYl9uYWxzOyBpKyspIHsKLSAgICAgICAgaWYgKHMtPnBrdC5uYWxzW2ldLnR5cGUgPT0gTkFMX0VPQl9OVVQgfHwKLSAgICAgICAgICAgIHMtPnBrdC5uYWxzW2ldLnR5cGUgPT0gTkFMX0VPU19OVVQpCi0gICAgICAgICAgICBzLT5lb3MgPSAxOwotICAgIH0KLQotICAgIC8qIGRlY29kZSB0aGUgTkFMIHVuaXRzICovCi0gICAgZm9yIChpID0gMDsgaSA8IHMtPnBrdC5uYl9uYWxzOyBpKyspIHsKLSAgICAgICAgcmV0ID0gZGVjb2RlX25hbF91bml0KHMsICZzLT5wa3QubmFsc1tpXSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIE5BTCB1bml0ICMlZC5cbiIsIGkpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfQotCi1mYWlsOgotICAgIGlmIChzLT5yZWYgJiYgcy0+dGhyZWFkc190eXBlID09IEZGX1RIUkVBRF9GUkFNRSkKLSAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+cmVmLT50ZiwgSU5UX01BWCwgMCk7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBwcmludF9tZDUodm9pZCAqbG9nX2N0eCwgaW50IGxldmVsLCB1aW50OF90IG1kNVsxNl0pCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIGF2X2xvZyhsb2dfY3R4LCBsZXZlbCwgIiUwMiJQUkl4OCwgbWQ1W2ldKTsKLX0KLQotc3RhdGljIGludCB2ZXJpZnlfbWQ1KEhFVkNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKLXsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZyYW1lLT5mb3JtYXQpOwotICAgIGludCBwaXhlbF9zaGlmdDsKLSAgICBpbnQgaSwgajsKLQotICAgIGlmICghZGVzYykKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLQotICAgIHBpeGVsX3NoaWZ0ID0gZGVzYy0+Y29tcFswXS5kZXB0aCA+IDg7Ci0KLSAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlZlcmlmeWluZyBjaGVja3N1bSBmb3IgZnJhbWUgd2l0aCBQT0MgJWQ6ICIsCi0gICAgICAgICAgIHMtPnBvYyk7Ci0KLSAgICAvKiB0aGUgY2hlY2tzdW1zIGFyZSBMRSwgc28gd2UgaGF2ZSB0byBieXRlc3dhcCBmb3IgPjhicHAgZm9ybWF0cwotICAgICAqIG9uIEJFIGFyY2hlcyAqLwotI2lmIEhBVkVfQklHRU5ESUFOCi0gICAgaWYgKHBpeGVsX3NoaWZ0ICYmICFzLT5jaGVja3N1bV9idWYpIHsKLSAgICAgICAgYXZfZmFzdF9tYWxsb2MoJnMtPmNoZWNrc3VtX2J1ZiwgJnMtPmNoZWNrc3VtX2J1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBGRk1BWDMoZnJhbWUtPmxpbmVzaXplWzBdLCBmcmFtZS0+bGluZXNpemVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMl0pKTsKLSAgICAgICAgaWYgKCFzLT5jaGVja3N1bV9idWYpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLSNlbmRpZgotCi0gICAgZm9yIChpID0gMDsgZnJhbWUtPmRhdGFbaV07IGkrKykgewotICAgICAgICBpbnQgd2lkdGggID0gcy0+YXZjdHgtPmNvZGVkX3dpZHRoOwotICAgICAgICBpbnQgaGVpZ2h0ID0gcy0+YXZjdHgtPmNvZGVkX2hlaWdodDsKLSAgICAgICAgaW50IHcgPSAoaSA9PSAxIHx8IGkgPT0gMikgPyAod2lkdGggID4+IGRlc2MtPmxvZzJfY2hyb21hX3cpIDogd2lkdGg7Ci0gICAgICAgIGludCBoID0gKGkgPT0gMSB8fCBpID09IDIpID8gKGhlaWdodCA+PiBkZXNjLT5sb2cyX2Nocm9tYV9oKSA6IGhlaWdodDsKLSAgICAgICAgdWludDhfdCBtZDVbMTZdOwotCi0gICAgICAgIGF2X21kNV9pbml0KHMtPm1kNV9jdHgpOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSBmcmFtZS0+ZGF0YVtpXSArIGogKiBmcmFtZS0+bGluZXNpemVbaV07Ci0jaWYgSEFWRV9CSUdFTkRJQU4KLSAgICAgICAgICAgIGlmIChwaXhlbF9zaGlmdCkgewotICAgICAgICAgICAgICAgIHMtPmJkc3AuYnN3YXAxNl9idWYoKHVpbnQxNl90ICopIHMtPmNoZWNrc3VtX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50MTZfdCAqKSBzcmMsIHcpOwotICAgICAgICAgICAgICAgIHNyYyA9IHMtPmNoZWNrc3VtX2J1ZjsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgYXZfbWQ1X3VwZGF0ZShzLT5tZDVfY3R4LCBzcmMsIHcgPDwgcGl4ZWxfc2hpZnQpOwotICAgICAgICB9Ci0gICAgICAgIGF2X21kNV9maW5hbChzLT5tZDVfY3R4LCBtZDUpOwotCi0gICAgICAgIGlmICghbWVtY21wKG1kNSwgcy0+bWQ1W2ldLCAxNikpIHsKLSAgICAgICAgICAgIGF2X2xvZyAgIChzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicGxhbmUgJWQgLSBjb3JyZWN0ICIsIGkpOwotICAgICAgICAgICAgcHJpbnRfbWQ1KHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsIG1kNSk7Ci0gICAgICAgICAgICBhdl9sb2cgICAocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIjsgIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9sb2cgICAocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1pc21hdGNoaW5nIGNoZWNrc3VtIG9mIHBsYW5lICVkIC0gIiwgaSk7Ci0gICAgICAgICAgICBwcmludF9tZDUocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgbWQ1KTsKLSAgICAgICAgICAgIGF2X2xvZyAgIChzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiICE9ICIpOwotICAgICAgICAgICAgcHJpbnRfbWQ1KHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsIHMtPm1kNVtpXSk7Ci0gICAgICAgICAgICBhdl9sb2cgICAocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhldmNfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3Rfb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgaW50IHJldDsKLSAgICBIRVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0KLSAgICBpZiAoIWF2cGt0LT5zaXplKSB7Ci0gICAgICAgIHJldCA9IGZmX2hldmNfb3V0cHV0X2ZyYW1lKHMsIGRhdGEsIDEpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgKmdvdF9vdXRwdXQgPSByZXQ7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHMtPnJlZiA9IE5VTEw7Ci0gICAgcmV0ICAgID0gZGVjb2RlX25hbF91bml0cyhzLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgaWYgKGF2Y3R4LT5od2FjY2VsKSB7Ci0gICAgICAgIGlmIChzLT5yZWYgJiYgKHJldCA9IGF2Y3R4LT5od2FjY2VsLT5lbmRfZnJhbWUoYXZjdHgpKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJoYXJkd2FyZSBhY2NlbGVyYXRvciBmYWlsZWQgdG8gZGVjb2RlIHBpY3R1cmVcbiIpOwotICAgICAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBzLT5yZWYsIH4wKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICAvKiB2ZXJpZnkgdGhlIFNFSSBjaGVja3N1bSAqLwotICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0NSQ0NIRUNLICYmIHMtPmlzX2RlY29kZWQgJiYKLSAgICAgICAgICAgIHMtPmlzX21kNSkgewotICAgICAgICAgICAgcmV0ID0gdmVyaWZ5X21kNShzLCBzLT5yZWYtPmZyYW1lKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwICYmIGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSB7Ci0gICAgICAgICAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBzLT5yZWYsIH4wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHMtPmlzX21kNSA9IDA7Ci0KLSAgICBpZiAocy0+aXNfZGVjb2RlZCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkRlY29kZWQgZnJhbWUgd2l0aCBQT0MgJWQuXG4iLCBzLT5wb2MpOwotICAgICAgICBzLT5pc19kZWNvZGVkID0gMDsKLSAgICB9Ci0KLSAgICBpZiAocy0+b3V0cHV0X2ZyYW1lLT5idWZbMF0pIHsKLSAgICAgICAgYXZfZnJhbWVfbW92ZV9yZWYoZGF0YSwgcy0+b3V0cHV0X2ZyYW1lKTsKLSAgICAgICAgKmdvdF9vdXRwdXQgPSAxOwotICAgIH0KLQotICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKLX0KLQotc3RhdGljIGludCBoZXZjX3JlZl9mcmFtZShIRVZDQ29udGV4dCAqcywgSEVWQ0ZyYW1lICpkc3QsIEhFVkNGcmFtZSAqc3JjKQotewotICAgIGludCByZXQ7Ci0KLSAgICByZXQgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZkc3QtPnRmLCAmc3JjLT50Zik7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBkc3QtPnRhYl9tdmZfYnVmID0gYXZfYnVmZmVyX3JlZihzcmMtPnRhYl9tdmZfYnVmKTsKLSAgICBpZiAoIWRzdC0+dGFiX212Zl9idWYpCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBkc3QtPnRhYl9tdmYgPSBzcmMtPnRhYl9tdmY7Ci0KLSAgICBkc3QtPnJwbF90YWJfYnVmID0gYXZfYnVmZmVyX3JlZihzcmMtPnJwbF90YWJfYnVmKTsKLSAgICBpZiAoIWRzdC0+cnBsX3RhYl9idWYpCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBkc3QtPnJwbF90YWIgPSBzcmMtPnJwbF90YWI7Ci0KLSAgICBkc3QtPnJwbF9idWYgPSBhdl9idWZmZXJfcmVmKHNyYy0+cnBsX2J1Zik7Ci0gICAgaWYgKCFkc3QtPnJwbF9idWYpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGRzdC0+cG9jICAgICAgICA9IHNyYy0+cG9jOwotICAgIGRzdC0+Y3RiX2NvdW50ICA9IHNyYy0+Y3RiX2NvdW50OwotICAgIGRzdC0+d2luZG93ICAgICA9IHNyYy0+d2luZG93OwotICAgIGRzdC0+ZmxhZ3MgICAgICA9IHNyYy0+ZmxhZ3M7Ci0gICAgZHN0LT5zZXF1ZW5jZSAgID0gc3JjLT5zZXF1ZW5jZTsKLQotICAgIGlmIChzcmMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlKSB7Ci0gICAgICAgIGRzdC0+aHdhY2NlbF9wcml2X2J1ZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5od2FjY2VsX3ByaXZfYnVmKTsKLSAgICAgICAgaWYgKCFkc3QtPmh3YWNjZWxfcHJpdl9idWYpCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGRzdC0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGUgPSBkc3QtPmh3YWNjZWxfcHJpdl9idWYtPmRhdGE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci1mYWlsOgotICAgIGZmX2hldmNfdW5yZWZfZnJhbWUocywgZHN0LCB+MCk7Ci0gICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLX0KLQotc3RhdGljIGF2X2NvbGQgaW50IGhldmNfZGVjb2RlX2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIEhFVkNDb250ZXh0ICAgICAgICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBpbnQgaTsKLQotICAgIHBpY19hcnJheXNfZnJlZShzKTsKLQotICAgIGF2X2ZyZWVwKCZzLT5tZDVfY3R4KTsKLQotICAgIGF2X2ZyZWVwKCZzLT5jYWJhY19zdGF0ZSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZzLT5zYW9fcGl4ZWxfYnVmZmVyX2hbaV0pOwotICAgICAgICBhdl9mcmVlcCgmcy0+c2FvX3BpeGVsX2J1ZmZlcl92W2ldKTsKLSAgICB9Ci0gICAgYXZfZnJhbWVfZnJlZSgmcy0+b3V0cHV0X2ZyYW1lKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5EUEIpOyBpKyspIHsKLSAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCAmcy0+RFBCW2ldLCB+MCk7Ci0gICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPkRQQltpXS5mcmFtZSk7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnBzLnZwc19saXN0KTsgaSsrKQotICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnBzLnZwc19saXN0W2ldKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+cHMuc3BzX2xpc3QpOyBpKyspCi0gICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+cHMuc3BzX2xpc3RbaV0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5wcy5wcHNfbGlzdCk7IGkrKykKLSAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5wcy5wcHNfbGlzdFtpXSk7Ci0gICAgcy0+cHMuc3BzID0gTlVMTDsKLSAgICBzLT5wcy5wcHMgPSBOVUxMOwotICAgIHMtPnBzLnZwcyA9IE5VTEw7Ci0KLSAgICBhdl9mcmVlcCgmcy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0KTsKLSAgICBhdl9mcmVlcCgmcy0+c2gub2Zmc2V0KTsKLSAgICBhdl9mcmVlcCgmcy0+c2guc2l6ZSk7Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgcy0+dGhyZWFkc19udW1iZXI7IGkrKykgewotICAgICAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsY0xpc3RbaV07Ci0gICAgICAgIGlmIChsYykgewotICAgICAgICAgICAgYXZfZnJlZXAoJnMtPkhFVkNsY0xpc3RbaV0pOwotICAgICAgICAgICAgYXZfZnJlZXAoJnMtPnNMaXN0W2ldKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocy0+SEVWQ2xjID09IHMtPkhFVkNsY0xpc3RbMF0pCi0gICAgICAgIHMtPkhFVkNsYyA9IE5VTEw7Ci0gICAgYXZfZnJlZXAoJnMtPkhFVkNsY0xpc3RbMF0pOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHMtPnBrdC5uYWxzX2FsbG9jYXRlZDsgaSsrKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZzLT5wa3QubmFsc1tpXS5yYnNwX2J1ZmZlcik7Ci0gICAgICAgIGF2X2ZyZWVwKCZzLT5wa3QubmFsc1tpXS5za2lwcGVkX2J5dGVzX3Bvcyk7Ci0gICAgfQotICAgIGF2X2ZyZWVwKCZzLT5wa3QubmFscyk7Ci0gICAgcy0+cGt0Lm5hbHNfYWxsb2NhdGVkID0gMDsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXZfY29sZCBpbnQgaGV2Y19pbml0X2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIEhFVkNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBpbnQgaTsKLQotICAgIHMtPmF2Y3R4ID0gYXZjdHg7Ci0KLSAgICBzLT5IRVZDbGMgPSBhdl9tYWxsb2N6KHNpemVvZihIRVZDTG9jYWxDb250ZXh0KSk7Ci0gICAgaWYgKCFzLT5IRVZDbGMpCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBzLT5IRVZDbGNMaXN0WzBdID0gcy0+SEVWQ2xjOwotICAgIHMtPnNMaXN0WzBdID0gczsKLQotICAgIHMtPmNhYmFjX3N0YXRlID0gYXZfbWFsbG9jKEhFVkNfQ09OVEVYVFMpOwotICAgIGlmICghcy0+Y2FiYWNfc3RhdGUpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIHMtPm91dHB1dF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7Ci0gICAgaWYgKCFzLT5vdXRwdXRfZnJhbWUpCi0gICAgICAgIGdvdG8gZmFpbDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5EUEIpOyBpKyspIHsKLSAgICAgICAgcy0+RFBCW2ldLmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICAgICAgaWYgKCFzLT5EUEJbaV0uZnJhbWUpCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIHMtPkRQQltpXS50Zi5mID0gcy0+RFBCW2ldLmZyYW1lOwotICAgIH0KLQotICAgIHMtPm1heF9yYSA9IElOVF9NQVg7Ci0KLSAgICBzLT5tZDVfY3R4ID0gYXZfbWQ1X2FsbG9jKCk7Ci0gICAgaWYgKCFzLT5tZDVfY3R4KQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBmZl9ic3dhcGRzcF9pbml0KCZzLT5iZHNwKTsKLQotICAgIHMtPmNvbnRleHRfaW5pdGlhbGl6ZWQgPSAxOwotICAgIHMtPmVvcyA9IDA7Ci0KLSAgICByZXR1cm4gMDsKLQotZmFpbDoKLSAgICBoZXZjX2RlY29kZV9mcmVlKGF2Y3R4KTsKLSAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotfQotCi1zdGF0aWMgaW50IGhldmNfdXBkYXRlX3RocmVhZF9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpzcmMpCi17Ci0gICAgSEVWQ0NvbnRleHQgKnMgID0gZHN0LT5wcml2X2RhdGE7Ci0gICAgSEVWQ0NvbnRleHQgKnMwID0gc3JjLT5wcml2X2RhdGE7Ci0gICAgaW50IGksIHJldDsKLQotICAgIGlmICghcy0+Y29udGV4dF9pbml0aWFsaXplZCkgewotICAgICAgICByZXQgPSBoZXZjX2luaXRfY29udGV4dChkc3QpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgewotICAgICAgICBmZl9oZXZjX3VucmVmX2ZyYW1lKHMsICZzLT5EUEJbaV0sIH4wKTsKLSAgICAgICAgaWYgKHMwLT5EUEJbaV0uZnJhbWUtPmJ1ZlswXSkgewotICAgICAgICAgICAgcmV0ID0gaGV2Y19yZWZfZnJhbWUocywgJnMtPkRQQltpXSwgJnMwLT5EUEJbaV0pOwotICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzLT5wcy5zcHMgIT0gczAtPnBzLnNwcykKLSAgICAgICAgcy0+cHMuc3BzID0gTlVMTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+cHMudnBzX2xpc3QpOyBpKyspIHsKLSAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5wcy52cHNfbGlzdFtpXSk7Ci0gICAgICAgIGlmIChzMC0+cHMudnBzX2xpc3RbaV0pIHsKLSAgICAgICAgICAgIHMtPnBzLnZwc19saXN0W2ldID0gYXZfYnVmZmVyX3JlZihzMC0+cHMudnBzX2xpc3RbaV0pOwotICAgICAgICAgICAgaWYgKCFzLT5wcy52cHNfbGlzdFtpXSkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnBzLnNwc19saXN0KTsgaSsrKSB7Ci0gICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+cHMuc3BzX2xpc3RbaV0pOwotICAgICAgICBpZiAoczAtPnBzLnNwc19saXN0W2ldKSB7Ci0gICAgICAgICAgICBzLT5wcy5zcHNfbGlzdFtpXSA9IGF2X2J1ZmZlcl9yZWYoczAtPnBzLnNwc19saXN0W2ldKTsKLSAgICAgICAgICAgIGlmICghcy0+cHMuc3BzX2xpc3RbaV0pCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5wcy5wcHNfbGlzdCk7IGkrKykgewotICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnBzLnBwc19saXN0W2ldKTsKLSAgICAgICAgaWYgKHMwLT5wcy5wcHNfbGlzdFtpXSkgewotICAgICAgICAgICAgcy0+cHMucHBzX2xpc3RbaV0gPSBhdl9idWZmZXJfcmVmKHMwLT5wcy5wcHNfbGlzdFtpXSk7Ci0gICAgICAgICAgICBpZiAoIXMtPnBzLnBwc19saXN0W2ldKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocy0+cHMuc3BzICE9IHMwLT5wcy5zcHMpCi0gICAgICAgIGlmICgocmV0ID0gc2V0X3NwcyhzLCBzMC0+cHMuc3BzLCBzcmMtPnBpeF9mbXQpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgcy0+c2VxX2RlY29kZSA9IHMwLT5zZXFfZGVjb2RlOwotICAgIHMtPnNlcV9vdXRwdXQgPSBzMC0+c2VxX291dHB1dDsKLSAgICBzLT5wb2NUaWQwICAgID0gczAtPnBvY1RpZDA7Ci0gICAgcy0+bWF4X3JhICAgICA9IHMwLT5tYXhfcmE7Ci0gICAgcy0+ZW9zICAgICAgICA9IHMwLT5lb3M7Ci0gICAgcy0+bm9fcmFzbF9vdXRwdXRfZmxhZyA9IHMwLT5ub19yYXNsX291dHB1dF9mbGFnOwotCi0gICAgcy0+aXNfbmFsZmYgICAgICAgID0gczAtPmlzX25hbGZmOwotICAgIHMtPm5hbF9sZW5ndGhfc2l6ZSA9IHMwLT5uYWxfbGVuZ3RoX3NpemU7Ci0KLSAgICBzLT50aHJlYWRzX251bWJlciAgICAgID0gczAtPnRocmVhZHNfbnVtYmVyOwotICAgIHMtPnRocmVhZHNfdHlwZSAgICAgICAgPSBzMC0+dGhyZWFkc190eXBlOwotCi0gICAgaWYgKHMwLT5lb3MpIHsKLSAgICAgICAgcy0+c2VxX2RlY29kZSA9IChzLT5zZXFfZGVjb2RlICsgMSkgJiAweGZmOwotICAgICAgICBzLT5tYXhfcmEgPSBJTlRfTUFYOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhldmNfZGVjb2RlX2V4dHJhZGF0YShIRVZDQ29udGV4dCAqcykKLXsKLSAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5hdmN0eDsKLSAgICBHZXRCeXRlQ29udGV4dCBnYjsKLSAgICBpbnQgcmV0LCBpOwotCi0gICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7Ci0KLSAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMyAmJgotICAgICAgICAoYXZjdHgtPmV4dHJhZGF0YVswXSB8fCBhdmN0eC0+ZXh0cmFkYXRhWzFdIHx8Ci0gICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhWzJdID4gMSkpIHsKLSAgICAgICAgLyogSXQgc2VlbXMgdGhlIGV4dHJhZGF0YSBpcyBlbmNvZGVkIGFzIGh2Y0MgZm9ybWF0LgotICAgICAgICAgKiBUZW1wb3JhcmlseSwgd2Ugc3VwcG9ydCBjb25maWd1cmF0aW9uVmVyc2lvbj09MCB1bnRpbCAxNDQ5Ni0xNSAzcmQKLSAgICAgICAgICogaXMgZmluYWxpemVkLiBXaGVuIGZpbmFsaXplZCwgY29uZmlndXJhdGlvblZlcnNpb24gd2lsbCBiZSAxIGFuZCB3ZQotICAgICAgICAgKiBjYW4gcmVjb2duaXplIGh2Y0MgYnkgY2hlY2tpbmcgaWYgYXZjdHgtPmV4dHJhZGF0YVswXT09MSBvciBub3QuICovCi0gICAgICAgIGludCBpLCBqLCBudW1fYXJyYXlzLCBuYWxfbGVuX3NpemU7Ci0KLSAgICAgICAgcy0+aXNfbmFsZmYgPSAxOwotCi0gICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyMSk7Ci0gICAgICAgIG5hbF9sZW5fc2l6ZSA9IChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpICYgMykgKyAxOwotICAgICAgICBudW1fYXJyYXlzICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOwotCi0gICAgICAgIC8qIG5hbCB1bml0cyBpbiB0aGUgaHZjQyBhbHdheXMgaGF2ZSBsZW5ndGggY29kZWQgd2l0aCAyIGJ5dGVzLAotICAgICAgICAgKiBzbyBwdXQgYSBmYWtlIG5hbF9sZW5ndGhfc2l6ZSA9IDIgd2hpbGUgcGFyc2luZyB0aGVtICovCi0gICAgICAgIHMtPm5hbF9sZW5ndGhfc2l6ZSA9IDI7Ci0KLSAgICAgICAgLyogRGVjb2RlIG5hbCB1bml0cyBmcm9tIGh2Y0MuICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fYXJyYXlzOyBpKyspIHsKLSAgICAgICAgICAgIGludCB0eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAmIDB4M2Y7Ci0gICAgICAgICAgICBpbnQgY250ICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7Ci0KLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjbnQ7IGorKykgewotICAgICAgICAgICAgICAgIC8vICsyIGZvciB0aGUgbmFsIHNpemUgZmllbGQKLSAgICAgICAgICAgICAgICBpbnQgbmFsc2l6ZSA9IGJ5dGVzdHJlYW0yX3BlZWtfYmUxNigmZ2IpICsgMjsKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IG5hbHNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBOQUwgdW5pdCBzaXplIGluIGV4dHJhZGF0YS5cbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfbmFsX3VuaXRzKHMsIGdiLmJ1ZmZlciwgbmFsc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVjb2RpbmcgbmFsIHVuaXQgJWQgJWQgZnJvbSBodmNDIGZhaWxlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgbmFsc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBOb3cgc3RvcmUgcmlnaHQgbmFsIGxlbmd0aCBzaXplLCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZQotICAgICAgICAgKiBhbGwgb3RoZXIgbmFscyAqLwotICAgICAgICBzLT5uYWxfbGVuZ3RoX3NpemUgPSBuYWxfbGVuX3NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy0+aXNfbmFsZmYgPSAwOwotICAgICAgICByZXQgPSBkZWNvZGVfbmFsX3VuaXRzKHMsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICAvKiBleHBvcnQgc3RyZWFtIHBhcmFtZXRlcnMgZnJvbSB0aGUgZmlyc3QgU1BTICovCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnBzLnNwc19saXN0KTsgaSsrKSB7Ci0gICAgICAgIGlmIChzLT5wcy5zcHNfbGlzdFtpXSkgewotICAgICAgICAgICAgY29uc3QgSEVWQ1NQUyAqc3BzID0gKGNvbnN0IEhFVkNTUFMqKXMtPnBzLnNwc19saXN0W2ldLT5kYXRhOwotICAgICAgICAgICAgZXhwb3J0X3N0cmVhbV9wYXJhbXMocy0+YXZjdHgsICZzLT5wcywgc3BzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBhdl9jb2xkIGludCBoZXZjX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBIRVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IHJldDsKLQotICAgIGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MgPSAxOwotCi0gICAgcmV0ID0gaGV2Y19pbml0X2NvbnRleHQoYXZjdHgpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgcy0+ZW5hYmxlX3BhcmFsbGVsX3RpbGVzID0gMDsKLSAgICBzLT5waWN0dXJlX3N0cnVjdCA9IDA7Ci0gICAgcy0+ZW9zID0gMTsKLQotICAgIGlmKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpCi0gICAgICAgIHMtPnRocmVhZHNfbnVtYmVyID0gYXZjdHgtPnRocmVhZF9jb3VudDsKLSAgICBlbHNlCi0gICAgICAgIHMtPnRocmVhZHNfbnVtYmVyID0gMTsKLQotICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPiAwICYmIGF2Y3R4LT5leHRyYWRhdGEpIHsKLSAgICAgICAgcmV0ID0gaGV2Y19kZWNvZGVfZXh0cmFkYXRhKHMpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgaGV2Y19kZWNvZGVfZnJlZShhdmN0eCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpICYmIGF2Y3R4LT50aHJlYWRfY291bnQgPiAxKQotICAgICAgICAgICAgcy0+dGhyZWFkc190eXBlID0gRkZfVEhSRUFEX0ZSQU1FOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzLT50aHJlYWRzX3R5cGUgPSBGRl9USFJFQURfU0xJQ0U7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGF2X2NvbGQgaW50IGhldmNfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgSEVWQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGludCByZXQ7Ci0KLSAgICBtZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7Ci0KLSAgICByZXQgPSBoZXZjX2luaXRfY29udGV4dChhdmN0eCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaGV2Y19kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIEhFVkNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBmZl9oZXZjX2ZsdXNoX2RwYihzKTsKLSAgICBzLT5tYXhfcmEgPSBJTlRfTUFYOwotICAgIHMtPmVvcyA9IDE7Ci19Ci0KLSNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEhFVkNDb250ZXh0LCB4KQotI2RlZmluZSBQQVIgKEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0pCi0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7Ci0gICAgeyAiYXBwbHlfZGVmZGlzcHdpbiIsICJBcHBseSBkZWZhdWx0IGRpc3BsYXkgd2luZG93IGZyb20gVlVJIiwgT0ZGU0VUKGFwcGx5X2RlZmRpc3B3aW4pLAotICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDB9LCAwLCAxLCBQQVIgfSwKLSAgICB7ICJzdHJpY3QtZGlzcGxheXdpbiIsICJzdHJpY2x5IGFwcGx5IGRlZmF1bHQgZGlzcGxheSB3aW5kb3cgc2l6ZSIsIE9GRlNFVChhcHBseV9kZWZkaXNwd2luKSwKLSAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgUEFSIH0sCi0gICAgeyBOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyBoZXZjX2RlY29kZXJfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiSEVWQyBkZWNvZGVyIiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKLSAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLX07Ci0KLUFWQ29kZWMgZmZfaGV2Y19kZWNvZGVyID0gewotICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAiaGV2YyIsCi0gICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIRVZDIChIaWdoIEVmZmljaWVuY3kgVmlkZW8gQ29kaW5nKSIpLAotICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCi0gICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihIRVZDQ29udGV4dCksCi0gICAgLnByaXZfY2xhc3MgICAgICAgICAgICA9ICZoZXZjX2RlY29kZXJfY2xhc3MsCi0gICAgLmluaXQgICAgICAgICAgICAgICAgICA9IGhldmNfZGVjb2RlX2luaXQsCi0gICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IGhldmNfZGVjb2RlX2ZyZWUsCi0gICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IGhldmNfZGVjb2RlX2ZyYW1lLAotICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSBoZXZjX2RlY29kZV9mbHVzaCwKLSAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gaGV2Y191cGRhdGVfdGhyZWFkX2NvbnRleHQsCi0gICAgLmluaXRfdGhyZWFkX2NvcHkgICAgICA9IGhldmNfaW5pdF90aHJlYWRfY29weSwKLSAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9ERUxBWSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCi0gICAgLnByb2ZpbGVzICAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX2hldmNfcHJvZmlsZXMpLAotfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Yy5oIGIvbGliYXZjb2RlYy9oZXZjLmgKaW5kZXggYzkxZjgxNS4uMmYyMGRiOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oZXZjLmgKKysrIGIvbGliYXZjb2RlYy9oZXZjLmgKQEAgLTEsNyArMSw1IEBACiAvKgotICogSEVWQyB2aWRlbyBkZWNvZGVyCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBHdWlsbGF1bWUgTWFydHJlcworICogSEVWQyBzaGFyZWQgY29kZQogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0yMywxMDgyICsyMSwxMTMgQEAKICNpZm5kZWYgQVZDT0RFQ19IRVZDX0gKICNkZWZpbmUgQVZDT0RFQ19IRVZDX0gKIAotI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWQ1LmgiCi0KLSNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiYnN3YXBkc3AuaCIKLSNpbmNsdWRlICJjYWJhYy5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCi0jaW5jbHVkZSAiaGV2Y3ByZWQuaCIKLSNpbmNsdWRlICJoZXZjZHNwLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJ0aHJlYWQuaCIKLSNpbmNsdWRlICJ2aWRlb2RzcC5oIgotCi0jZGVmaW5lIE1BWF9EUEJfU0laRSAxNiAvLyBBLjQuMQotI2RlZmluZSBNQVhfUkVGUyAxNgotCi0jZGVmaW5lIE1BWF9OQl9USFJFQURTIDE2Ci0jZGVmaW5lIFNISUZUX0NUQl9XUFAgMgotCi0vKioKLSAqIDcuNC4yLjEKLSAqLwotI2RlZmluZSBNQVhfU1VCX0xBWUVSUyA3Ci0jZGVmaW5lIE1BWF9WUFNfQ09VTlQgMTYKLSNkZWZpbmUgTUFYX1NQU19DT1VOVCAzMgotI2RlZmluZSBNQVhfUFBTX0NPVU5UIDI1NgotI2RlZmluZSBNQVhfU0hPUlRfVEVSTV9SUFNfQ09VTlQgNjQKLSNkZWZpbmUgTUFYX0NVX1NJWkUgMTI4Ci0KLS8vVE9ETzogY2hlY2sgaWYgdGhpcyBpcyByZWFsbHkgdGhlIG1heGltdW0KLSNkZWZpbmUgTUFYX1RSQU5TRk9STV9ERVBUSCA1Ci0KLSNkZWZpbmUgTUFYX1RCX1NJWkUgMzIKLSNkZWZpbmUgTUFYX0xPRzJfQ1RCX1NJWkUgNgotI2RlZmluZSBNQVhfUVAgNTEKLSNkZWZpbmUgREVGQVVMVF9JTlRSQV9UQ19PRkZTRVQgMgotCi0jZGVmaW5lIEhFVkNfQ09OVEVYVFMgMTk5Ci0KLSNkZWZpbmUgTVJHX01BWF9OVU1fQ0FORFMgICAgIDUKLQotI2RlZmluZSBMMCAwCi0jZGVmaW5lIEwxIDEKLQotI2RlZmluZSBFUEVMX0VYVFJBX0JFRk9SRSAxCi0jZGVmaW5lIEVQRUxfRVhUUkFfQUZURVIgIDIKLSNkZWZpbmUgRVBFTF9FWFRSQSAgICAgICAgMwotI2RlZmluZSBRUEVMX0VYVFJBX0JFRk9SRSAzCi0jZGVmaW5lIFFQRUxfRVhUUkFfQUZURVIgIDQKLSNkZWZpbmUgUVBFTF9FWFRSQSAgICAgICAgNwotCi0jZGVmaW5lIEVER0VfRU1VX0JVRkZFUl9TVFJJREUgODAKLQotLyoqCi0gKiBWYWx1ZSBvZiB0aGUgbHVtYSBzYW1wbGUgYXQgcG9zaXRpb24gKHgsIHkpIGluIHRoZSAyRCBhcnJheSB0YWIuCi0gKi8KLSNkZWZpbmUgU0FNUExFKHRhYiwgeCwgeSkgKCh0YWIpWyh5KSAqIHMtPnNwcy0+d2lkdGggKyAoeCldKQotI2RlZmluZSBTQU1QTEVfQ1RCKHRhYiwgeCwgeSkgKCh0YWIpWyh5KSAqIG1pbl9jYl93aWR0aCArICh4KV0pCi0KLSNkZWZpbmUgSVNfSURSKHMpICgocyktPm5hbF91bml0X3R5cGUgPT0gTkFMX0lEUl9XX1JBREwgfHwgKHMpLT5uYWxfdW5pdF90eXBlID09IE5BTF9JRFJfTl9MUCkKLSNkZWZpbmUgSVNfQkxBKHMpICgocyktPm5hbF91bml0X3R5cGUgPT0gTkFMX0JMQV9XX1JBREwgfHwgKHMpLT5uYWxfdW5pdF90eXBlID09IE5BTF9CTEFfV19MUCB8fCBcCi0gICAgICAgICAgICAgICAgICAgKHMpLT5uYWxfdW5pdF90eXBlID09IE5BTF9CTEFfTl9MUCkKLSNkZWZpbmUgSVNfSVJBUChzKSAoKHMpLT5uYWxfdW5pdF90eXBlID49IDE2ICYmIChzKS0+bmFsX3VuaXRfdHlwZSA8PSAyMykKLQogLyoqCiAgKiBUYWJsZSA3LTM6IE5BTCB1bml0IHR5cGUgY29kZXMKICAqLwotZW51bSBOQUxVbml0VHlwZSB7Ci0gICAgTkFMX1RSQUlMX04gICAgPSAwLAotICAgIE5BTF9UUkFJTF9SICAgID0gMSwKLSAgICBOQUxfVFNBX04gICAgICA9IDIsCi0gICAgTkFMX1RTQV9SICAgICAgPSAzLAotICAgIE5BTF9TVFNBX04gICAgID0gNCwKLSAgICBOQUxfU1RTQV9SICAgICA9IDUsCi0gICAgTkFMX1JBRExfTiAgICAgPSA2LAotICAgIE5BTF9SQURMX1IgICAgID0gNywKLSAgICBOQUxfUkFTTF9OICAgICA9IDgsCi0gICAgTkFMX1JBU0xfUiAgICAgPSA5LAotICAgIE5BTF9CTEFfV19MUCAgID0gMTYsCi0gICAgTkFMX0JMQV9XX1JBREwgPSAxNywKLSAgICBOQUxfQkxBX05fTFAgICA9IDE4LAotICAgIE5BTF9JRFJfV19SQURMID0gMTksCi0gICAgTkFMX0lEUl9OX0xQICAgPSAyMCwKLSAgICBOQUxfQ1JBX05VVCAgICA9IDIxLAotICAgIE5BTF9WUFMgICAgICAgID0gMzIsCi0gICAgTkFMX1NQUyAgICAgICAgPSAzMywKLSAgICBOQUxfUFBTICAgICAgICA9IDM0LAotICAgIE5BTF9BVUQgICAgICAgID0gMzUsCi0gICAgTkFMX0VPU19OVVQgICAgPSAzNiwKLSAgICBOQUxfRU9CX05VVCAgICA9IDM3LAotICAgIE5BTF9GRF9OVVQgICAgID0gMzgsCi0gICAgTkFMX1NFSV9QUkVGSVggPSAzOSwKLSAgICBOQUxfU0VJX1NVRkZJWCA9IDQwLAorZW51bSBIRVZDTkFMVW5pdFR5cGUgeworICAgIEhFVkNfTkFMX1RSQUlMX04gICAgPSAwLAorICAgIEhFVkNfTkFMX1RSQUlMX1IgICAgPSAxLAorICAgIEhFVkNfTkFMX1RTQV9OICAgICAgPSAyLAorICAgIEhFVkNfTkFMX1RTQV9SICAgICAgPSAzLAorICAgIEhFVkNfTkFMX1NUU0FfTiAgICAgPSA0LAorICAgIEhFVkNfTkFMX1NUU0FfUiAgICAgPSA1LAorICAgIEhFVkNfTkFMX1JBRExfTiAgICAgPSA2LAorICAgIEhFVkNfTkFMX1JBRExfUiAgICAgPSA3LAorICAgIEhFVkNfTkFMX1JBU0xfTiAgICAgPSA4LAorICAgIEhFVkNfTkFMX1JBU0xfUiAgICAgPSA5LAorICAgIEhFVkNfTkFMX1ZDTF9OMTAgICAgPSAxMCwKKyAgICBIRVZDX05BTF9WQ0xfUjExICAgID0gMTEsCisgICAgSEVWQ19OQUxfVkNMX04xMiAgICA9IDEyLAorICAgIEhFVkNfTkFMX1ZDTF9SMTMgICAgPSAxMywKKyAgICBIRVZDX05BTF9WQ0xfTjE0ICAgID0gMTQsCisgICAgSEVWQ19OQUxfVkNMX1IxNSAgICA9IDE1LAorICAgIEhFVkNfTkFMX0JMQV9XX0xQICAgPSAxNiwKKyAgICBIRVZDX05BTF9CTEFfV19SQURMID0gMTcsCisgICAgSEVWQ19OQUxfQkxBX05fTFAgICA9IDE4LAorICAgIEhFVkNfTkFMX0lEUl9XX1JBREwgPSAxOSwKKyAgICBIRVZDX05BTF9JRFJfTl9MUCAgID0gMjAsCisgICAgSEVWQ19OQUxfQ1JBX05VVCAgICA9IDIxLAorICAgIEhFVkNfTkFMX0lSQVBfVkNMMjIgPSAyMiwKKyAgICBIRVZDX05BTF9JUkFQX1ZDTDIzID0gMjMsCisgICAgSEVWQ19OQUxfUlNWX1ZDTDI0ICA9IDI0LAorICAgIEhFVkNfTkFMX1JTVl9WQ0wyNSAgPSAyNSwKKyAgICBIRVZDX05BTF9SU1ZfVkNMMjYgID0gMjYsCisgICAgSEVWQ19OQUxfUlNWX1ZDTDI3ICA9IDI3LAorICAgIEhFVkNfTkFMX1JTVl9WQ0wyOCAgPSAyOCwKKyAgICBIRVZDX05BTF9SU1ZfVkNMMjkgID0gMjksCisgICAgSEVWQ19OQUxfUlNWX1ZDTDMwICA9IDMwLAorICAgIEhFVkNfTkFMX1JTVl9WQ0wzMSAgPSAzMSwKKyAgICBIRVZDX05BTF9WUFMgICAgICAgID0gMzIsCisgICAgSEVWQ19OQUxfU1BTICAgICAgICA9IDMzLAorICAgIEhFVkNfTkFMX1BQUyAgICAgICAgPSAzNCwKKyAgICBIRVZDX05BTF9BVUQgICAgICAgID0gMzUsCisgICAgSEVWQ19OQUxfRU9TX05VVCAgICA9IDM2LAorICAgIEhFVkNfTkFMX0VPQl9OVVQgICAgPSAzNywKKyAgICBIRVZDX05BTF9GRF9OVVQgICAgID0gMzgsCisgICAgSEVWQ19OQUxfU0VJX1BSRUZJWCA9IDM5LAorICAgIEhFVkNfTkFMX1NFSV9TVUZGSVggPSA0MCwKIH07CiAKLWVudW0gUlBTVHlwZSB7Ci0gICAgU1RfQ1VSUl9CRUYgPSAwLAotICAgIFNUX0NVUlJfQUZULAotICAgIFNUX0ZPTEwsCi0gICAgTFRfQ1VSUiwKLSAgICBMVF9GT0xMLAotICAgIE5CX1JQU19UWVBFLAorZW51bSBIRVZDU2xpY2VUeXBlIHsKKyAgICBIRVZDX1NMSUNFX0IgPSAwLAorICAgIEhFVkNfU0xJQ0VfUCA9IDEsCisgICAgSEVWQ19TTElDRV9JID0gMiwKIH07CiAKLWVudW0gU2xpY2VUeXBlIHsKLSAgICBCX1NMSUNFID0gMCwKLSAgICBQX1NMSUNFID0gMSwKLSAgICBJX1NMSUNFID0gMiwKK2VudW0geworICAgIC8vIDcuNC4zLjE6IHZwc19tYXhfbGF5ZXJzX21pbnVzMSBpcyBpbiBbMCwgNjJdLgorICAgIEhFVkNfTUFYX0xBWUVSUyAgICAgPSA2MywKKyAgICAvLyA3LjQuMy4xOiB2cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxIGlzIGluIFswLCA2XS4KKyAgICBIRVZDX01BWF9TVUJfTEFZRVJTID0gNywKKyAgICAvLyA3LjQuMy4xOiB2cHNfbnVtX2xheWVyX3NldHNfbWludXMxIGlzIGluIFswLCAxMDIzXS4KKyAgICBIRVZDX01BWF9MQVlFUl9TRVRTID0gMTAyNCwKKworICAgIC8vIDcuNC4yLjE6IHZwc192aWRlb19wYXJhbWV0ZXJfc2V0X2lkIGlzIHUoNCkuCisgICAgSEVWQ19NQVhfVlBTX0NPVU5UID0gMTYsCisgICAgLy8gNy40LjMuMi4xOiBzcHNfc2VxX3BhcmFtZXRlcl9zZXRfaWQgaXMgaW4gWzAsIDE1XS4KKyAgICBIRVZDX01BWF9TUFNfQ09VTlQgPSAxNiwKKyAgICAvLyA3LjQuMy4zLjE6IHBwc19waWNfcGFyYW1ldGVyX3NldF9pZCBpcyBpbiBbMCwgNjNdLgorICAgIEhFVkNfTUFYX1BQU19DT1VOVCA9IDY0LAorCisgICAgLy8gQS40LjI6IE1heERwYlNpemUgaXMgYm91bmRlZCBhYm92ZSBieSAxNi4KKyAgICBIRVZDX01BWF9EUEJfU0laRSA9IDE2LAorICAgIC8vIDcuNC4zLjE6IHZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxW2ldIGlzIGluIFswLCBNYXhEcGJTaXplIC0gMV0uCisgICAgSEVWQ19NQVhfUkVGUyAgICAgPSBIRVZDX01BWF9EUEJfU0laRSwKKworICAgIC8vIDcuNC4zLjIuMTogbnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzIGlzIGluIFswLCA2NF0uCisgICAgSEVWQ19NQVhfU0hPUlRfVEVSTV9SRUZfUElDX1NFVFMgPSA2NCwKKyAgICAvLyA3LjQuMy4yLjE6IG51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzIGlzIGluIFswLCAzMl0uCisgICAgSEVWQ19NQVhfTE9OR19URVJNX1JFRl9QSUNTICAgICAgPSAzMiwKKworICAgIC8vIEEuMzogYWxsIHByb2ZpbGVzIHJlcXVpcmUgdGhhdCBDdGJMb2cyU2l6ZVkgaXMgaW4gWzQsIDZdLgorICAgIEhFVkNfTUlOX0xPRzJfQ1RCX1NJWkUgPSA0LAorICAgIEhFVkNfTUFYX0xPRzJfQ1RCX1NJWkUgPSA2LAorCisgICAgLy8gRS4zLjI6IGNwYl9jbnRfbWludXMxW2ldIGlzIGluIFswLCAzMV0uCisgICAgSEVWQ19NQVhfQ1BCX0NOVCA9IDMyLAorCisgICAgLy8gQS40LjE6IGluIHRhYmxlIEEuNiB0aGUgaGlnaGVzdCBsZXZlbCBhbGxvd3MgYSBNYXhMdW1hUHMgb2YgMzUgNjUxIDU4NC4KKyAgICBIRVZDX01BWF9MVU1BX1BTID0gMzU2NTE1ODQsCisgICAgLy8gQS40LjE6IHBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXMgYW5kIHBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzIGFyZQorICAgIC8vIGNvbnN0cmFpbmVkIHRvIGJlIG5vdCBncmVhdGVyIHRoYW4gc3FydChNYXhMdW1hUHMgKiA4KS4gIEhlbmNlIGhlaWdodC8KKyAgICAvLyB3aWR0aCBhcmUgYm91bmRlZCBhYm92ZSBieSBzcXJ0KDggKiAzNTY1MTU4NCkgPSAxNjg4OC4yIHNhbXBsZXMuCisgICAgSEVWQ19NQVhfV0lEVEggID0gMTY4ODgsCisgICAgSEVWQ19NQVhfSEVJR0hUID0gMTY4ODgsCisKKyAgICAvLyBBLjQuMTogdGFibGUgQS42IGFsbG93cyBhdCBtb3N0IDIyIHRpbGUgcm93cyBmb3IgYW55IGxldmVsLgorICAgIEhFVkNfTUFYX1RJTEVfUk9XUyAgICA9IDIyLAorICAgIC8vIEEuNC4xOiB0YWJsZSBBLjYgYWxsb3dzIGF0IG1vc3QgMjAgdGlsZSBjb2x1bW5zIGZvciBhbnkgbGV2ZWwuCisgICAgSEVWQ19NQVhfVElMRV9DT0xVTU5TID0gMjAsCisKKyAgICAvLyA3LjQuNy4xOiBpbiB0aGUgd29yc3QgY2FzZSAodGlsZXNfZW5hYmxlZF9mbGFnIGFuZAorICAgIC8vIGVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnIGFyZSBib3RoIHNldCksIGVudHJ5IHBvaW50cyBjYW4gYmUKKyAgICAvLyBwbGFjZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBldmVyeSBDdGIgcm93IGluIGV2ZXJ5IHRpbGUsIGdpdmluZyBhbgorICAgIC8vIHVwcGVyIGJvdW5kIG9mIChudW1fdGlsZV9jb2x1bW5zX21pbnVzMSArIDEpICogUGljSGVpZ2h0SW5DdGJzWSAtIDEuCisgICAgLy8gT25seSBhIHN0cmVhbSB3aXRoIHZlcnkgaGlnaCByZXNvbHV0aW9uIGFuZCBwZXJ2ZXJzZSBwYXJhbWV0ZXJzIGNvdWxkCisgICAgLy8gZ2V0IG5lYXIgdGhhdCwgdGhvdWdoLCBzbyBzZXQgYSBsb3dlciBsaW1pdCBoZXJlIHdpdGggdGhlIG1heGltdW0KKyAgICAvLyBwb3NzaWJsZSB2YWx1ZSBmb3IgNEsgdmlkZW8gKGF0IG1vc3QgMTM1IDE2eDE2IEN0YiByb3dzKS4KKyAgICBIRVZDX01BWF9FTlRSWV9QT0lOVF9PRkZTRVRTID0gSEVWQ19NQVhfVElMRV9DT0xVTU5TICogMTM1LAogfTsKIAotZW51bSBTeW50YXhFbGVtZW50IHsKLSAgICBTQU9fTUVSR0VfRkxBRyA9IDAsCi0gICAgU0FPX1RZUEVfSURYLAotICAgIFNBT19FT19DTEFTUywKLSAgICBTQU9fQkFORF9QT1NJVElPTiwKLSAgICBTQU9fT0ZGU0VUX0FCUywKLSAgICBTQU9fT0ZGU0VUX1NJR04sCi0gICAgRU5EX09GX1NMSUNFX0ZMQUcsCi0gICAgU1BMSVRfQ09ESU5HX1VOSVRfRkxBRywKLSAgICBDVV9UUkFOU1FVQU5UX0JZUEFTU19GTEFHLAotICAgIFNLSVBfRkxBRywKLSAgICBDVV9RUF9ERUxUQSwKLSAgICBQUkVEX01PREVfRkxBRywKLSAgICBQQVJUX01PREUsCi0gICAgUENNX0ZMQUcsCi0gICAgUFJFVl9JTlRSQV9MVU1BX1BSRURfRkxBRywKLSAgICBNUE1fSURYLAotICAgIFJFTV9JTlRSQV9MVU1BX1BSRURfTU9ERSwKLSAgICBJTlRSQV9DSFJPTUFfUFJFRF9NT0RFLAotICAgIE1FUkdFX0ZMQUcsCi0gICAgTUVSR0VfSURYLAotICAgIElOVEVSX1BSRURfSURDLAotICAgIFJFRl9JRFhfTDAsCi0gICAgUkVGX0lEWF9MMSwKLSAgICBBQlNfTVZEX0dSRUFURVIwX0ZMQUcsCi0gICAgQUJTX01WRF9HUkVBVEVSMV9GTEFHLAotICAgIEFCU19NVkRfTUlOVVMyLAotICAgIE1WRF9TSUdOX0ZMQUcsCi0gICAgTVZQX0xYX0ZMQUcsCi0gICAgTk9fUkVTSURVQUxfREFUQV9GTEFHLAotICAgIFNQTElUX1RSQU5TRk9STV9GTEFHLAotICAgIENCRl9MVU1BLAotICAgIENCRl9DQl9DUiwKLSAgICBUUkFOU0ZPUk1fU0tJUF9GTEFHLAotICAgIEVYUExJQ0lUX1JEUENNX0ZMQUcsCi0gICAgRVhQTElDSVRfUkRQQ01fRElSX0ZMQUcsCi0gICAgTEFTVF9TSUdOSUZJQ0FOVF9DT0VGRl9YX1BSRUZJWCwKLSAgICBMQVNUX1NJR05JRklDQU5UX0NPRUZGX1lfUFJFRklYLAotICAgIExBU1RfU0lHTklGSUNBTlRfQ09FRkZfWF9TVUZGSVgsCi0gICAgTEFTVF9TSUdOSUZJQ0FOVF9DT0VGRl9ZX1NVRkZJWCwKLSAgICBTSUdOSUZJQ0FOVF9DT0VGRl9HUk9VUF9GTEFHLAotICAgIFNJR05JRklDQU5UX0NPRUZGX0ZMQUcsCi0gICAgQ09FRkZfQUJTX0xFVkVMX0dSRUFURVIxX0ZMQUcsCi0gICAgQ09FRkZfQUJTX0xFVkVMX0dSRUFURVIyX0ZMQUcsCi0gICAgQ09FRkZfQUJTX0xFVkVMX1JFTUFJTklORywKLSAgICBDT0VGRl9TSUdOX0ZMQUcsCi0gICAgTE9HMl9SRVNfU0NBTEVfQUJTLAotICAgIFJFU19TQ0FMRV9TSUdOX0ZMQUcsCi0gICAgQ1VfQ0hST01BX1FQX09GRlNFVF9GTEFHLAotICAgIENVX0NIUk9NQV9RUF9PRkZTRVRfSURYLAotfTsKLQotZW51bSBQYXJ0TW9kZSB7Ci0gICAgUEFSVF8yTngyTiA9IDAsCi0gICAgUEFSVF8yTnhOICA9IDEsCi0gICAgUEFSVF9OeDJOICA9IDIsCi0gICAgUEFSVF9OeE4gICA9IDMsCi0gICAgUEFSVF8yTnhuVSA9IDQsCi0gICAgUEFSVF8yTnhuRCA9IDUsCi0gICAgUEFSVF9uTHgyTiA9IDYsCi0gICAgUEFSVF9uUngyTiA9IDcsCi19OwotCi1lbnVtIFByZWRNb2RlIHsKLSAgICBNT0RFX0lOVEVSID0gMCwKLSAgICBNT0RFX0lOVFJBLAotICAgIE1PREVfU0tJUCwKLX07Ci0KLWVudW0gSW50ZXJQcmVkSWRjIHsKLSAgICBQUkVEX0wwID0gMCwKLSAgICBQUkVEX0wxLAotICAgIFBSRURfQkksCi19OwotCi1lbnVtIFByZWRGbGFnIHsKLSAgICBQRl9JTlRSQSA9IDAsCi0gICAgUEZfTDAsCi0gICAgUEZfTDEsCi0gICAgUEZfQkksCi19OwotCi1lbnVtIEludHJhUHJlZE1vZGUgewotICAgIElOVFJBX1BMQU5BUiA9IDAsCi0gICAgSU5UUkFfREMsCi0gICAgSU5UUkFfQU5HVUxBUl8yLAotICAgIElOVFJBX0FOR1VMQVJfMywKLSAgICBJTlRSQV9BTkdVTEFSXzQsCi0gICAgSU5UUkFfQU5HVUxBUl81LAotICAgIElOVFJBX0FOR1VMQVJfNiwKLSAgICBJTlRSQV9BTkdVTEFSXzcsCi0gICAgSU5UUkFfQU5HVUxBUl84LAotICAgIElOVFJBX0FOR1VMQVJfOSwKLSAgICBJTlRSQV9BTkdVTEFSXzEwLAotICAgIElOVFJBX0FOR1VMQVJfMTEsCi0gICAgSU5UUkFfQU5HVUxBUl8xMiwKLSAgICBJTlRSQV9BTkdVTEFSXzEzLAotICAgIElOVFJBX0FOR1VMQVJfMTQsCi0gICAgSU5UUkFfQU5HVUxBUl8xNSwKLSAgICBJTlRSQV9BTkdVTEFSXzE2LAotICAgIElOVFJBX0FOR1VMQVJfMTcsCi0gICAgSU5UUkFfQU5HVUxBUl8xOCwKLSAgICBJTlRSQV9BTkdVTEFSXzE5LAotICAgIElOVFJBX0FOR1VMQVJfMjAsCi0gICAgSU5UUkFfQU5HVUxBUl8yMSwKLSAgICBJTlRSQV9BTkdVTEFSXzIyLAotICAgIElOVFJBX0FOR1VMQVJfMjMsCi0gICAgSU5UUkFfQU5HVUxBUl8yNCwKLSAgICBJTlRSQV9BTkdVTEFSXzI1LAotICAgIElOVFJBX0FOR1VMQVJfMjYsCi0gICAgSU5UUkFfQU5HVUxBUl8yNywKLSAgICBJTlRSQV9BTkdVTEFSXzI4LAotICAgIElOVFJBX0FOR1VMQVJfMjksCi0gICAgSU5UUkFfQU5HVUxBUl8zMCwKLSAgICBJTlRSQV9BTkdVTEFSXzMxLAotICAgIElOVFJBX0FOR1VMQVJfMzIsCi0gICAgSU5UUkFfQU5HVUxBUl8zMywKLSAgICBJTlRSQV9BTkdVTEFSXzM0LAotfTsKLQotZW51bSBTQU9UeXBlIHsKLSAgICBTQU9fTk9UX0FQUExJRUQgPSAwLAotICAgIFNBT19CQU5ELAotICAgIFNBT19FREdFLAotICAgIFNBT19BUFBMSUVECi19OwotCi1lbnVtIFNBT0VPQ2xhc3MgewotICAgIFNBT19FT19IT1JJWiA9IDAsCi0gICAgU0FPX0VPX1ZFUlQsCi0gICAgU0FPX0VPXzEzNUQsCi0gICAgU0FPX0VPXzQ1RCwKLX07Ci0KLWVudW0gU2NhblR5cGUgewotICAgIFNDQU5fRElBRyA9IDAsCi0gICAgU0NBTl9IT1JJWiwKLSAgICBTQ0FOX1ZFUlQsCi19OwotCi10eXBlZGVmIHN0cnVjdCBTaG9ydFRlcm1SUFMgewotICAgIHVuc2lnbmVkIGludCBudW1fbmVnYXRpdmVfcGljczsKLSAgICBpbnQgbnVtX2RlbHRhX3BvY3M7Ci0gICAgaW50IHJwc19pZHhfbnVtX2RlbHRhX3BvY3M7Ci0gICAgaW50MzJfdCBkZWx0YV9wb2NbMzJdOwotICAgIHVpbnQ4X3QgdXNlZFszMl07Ci19IFNob3J0VGVybVJQUzsKLQotdHlwZWRlZiBzdHJ1Y3QgTG9uZ1Rlcm1SUFMgewotICAgIGludCAgICAgcG9jWzMyXTsKLSAgICB1aW50OF90IHVzZWRbMzJdOwotICAgIHVpbnQ4X3QgbmJfcmVmczsKLX0gTG9uZ1Rlcm1SUFM7Ci0KLXR5cGVkZWYgc3RydWN0IFJlZlBpY0xpc3QgewotICAgIHN0cnVjdCBIRVZDRnJhbWUgKnJlZltNQVhfUkVGU107Ci0gICAgaW50IGxpc3RbTUFYX1JFRlNdOwotICAgIGludCBpc0xvbmdUZXJtW01BWF9SRUZTXTsKLSAgICBpbnQgbmJfcmVmczsKLX0gUmVmUGljTGlzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgUmVmUGljTGlzdFRhYiB7Ci0gICAgUmVmUGljTGlzdCByZWZQaWNMaXN0WzJdOwotfSBSZWZQaWNMaXN0VGFiOwotCi10eXBlZGVmIHN0cnVjdCBIRVZDV2luZG93IHsKLSAgICB1bnNpZ25lZCBpbnQgbGVmdF9vZmZzZXQ7Ci0gICAgdW5zaWduZWQgaW50IHJpZ2h0X29mZnNldDsKLSAgICB1bnNpZ25lZCBpbnQgdG9wX29mZnNldDsKLSAgICB1bnNpZ25lZCBpbnQgYm90dG9tX29mZnNldDsKLX0gSEVWQ1dpbmRvdzsKLQotdHlwZWRlZiBzdHJ1Y3QgVlVJIHsKLSAgICBBVlJhdGlvbmFsIHNhcjsKLQotICAgIGludCBvdmVyc2Nhbl9pbmZvX3ByZXNlbnRfZmxhZzsKLSAgICBpbnQgb3ZlcnNjYW5fYXBwcm9wcmlhdGVfZmxhZzsKLQotICAgIGludCB2aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWc7Ci0gICAgaW50IHZpZGVvX2Zvcm1hdDsKLSAgICBpbnQgdmlkZW9fZnVsbF9yYW5nZV9mbGFnOwotICAgIGludCBjb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnOwotICAgIHVpbnQ4X3QgY29sb3VyX3ByaW1hcmllczsKLSAgICB1aW50OF90IHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljOwotICAgIHVpbnQ4X3QgbWF0cml4X2NvZWZmczsKLQotICAgIGludCBjaHJvbWFfbG9jX2luZm9fcHJlc2VudF9mbGFnOwotICAgIGludCBjaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZDsKLSAgICBpbnQgY2hyb21hX3NhbXBsZV9sb2NfdHlwZV9ib3R0b21fZmllbGQ7Ci0gICAgaW50IG5ldXRyYV9jaHJvbWFfaW5kaWNhdGlvbl9mbGFnOwotCi0gICAgaW50IGZpZWxkX3NlcV9mbGFnOwotICAgIGludCBmcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZzsKLQotICAgIGludCBkZWZhdWx0X2Rpc3BsYXlfd2luZG93X2ZsYWc7Ci0gICAgSEVWQ1dpbmRvdyBkZWZfZGlzcF93aW47Ci0KLSAgICBpbnQgdnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKLSAgICB1aW50MzJfdCB2dWlfbnVtX3VuaXRzX2luX3RpY2s7Ci0gICAgdWludDMyX3QgdnVpX3RpbWVfc2NhbGU7Ci0gICAgaW50IHZ1aV9wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnOwotICAgIGludCB2dWlfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czE7Ci0gICAgaW50IHZ1aV9ocmRfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWc7Ci0KLSAgICBpbnQgYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWc7Ci0gICAgaW50IHRpbGVzX2ZpeGVkX3N0cnVjdHVyZV9mbGFnOwotICAgIGludCBtb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWc7Ci0gICAgaW50IHJlc3RyaWN0ZWRfcmVmX3BpY19saXN0c19mbGFnOwotICAgIGludCBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjOwotICAgIGludCBtYXhfYnl0ZXNfcGVyX3BpY19kZW5vbTsKLSAgICBpbnQgbWF4X2JpdHNfcGVyX21pbl9jdV9kZW5vbTsKLSAgICBpbnQgbG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWw7Ci0gICAgaW50IGxvZzJfbWF4X212X2xlbmd0aF92ZXJ0aWNhbDsKLX0gVlVJOwotCi10eXBlZGVmIHN0cnVjdCBQVExDb21tb24gewotICAgIHVpbnQ4X3QgcHJvZmlsZV9zcGFjZTsKLSAgICB1aW50OF90IHRpZXJfZmxhZzsKLSAgICB1aW50OF90IHByb2ZpbGVfaWRjOwotICAgIHVpbnQ4X3QgcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdbMzJdOwotICAgIHVpbnQ4X3QgbGV2ZWxfaWRjOwotICAgIHVpbnQ4X3QgcHJvZ3Jlc3NpdmVfc291cmNlX2ZsYWc7Ci0gICAgdWludDhfdCBpbnRlcmxhY2VkX3NvdXJjZV9mbGFnOwotICAgIHVpbnQ4X3Qgbm9uX3BhY2tlZF9jb25zdHJhaW50X2ZsYWc7Ci0gICAgdWludDhfdCBmcmFtZV9vbmx5X2NvbnN0cmFpbnRfZmxhZzsKLX0gUFRMQ29tbW9uOwotCi10eXBlZGVmIHN0cnVjdCBQVEwgewotICAgIFBUTENvbW1vbiBnZW5lcmFsX3B0bDsKLSAgICBQVExDb21tb24gc3ViX2xheWVyX3B0bFtNQVhfU1VCX0xBWUVSU107Ci0KLSAgICB1aW50OF90IHN1Yl9sYXllcl9wcm9maWxlX3ByZXNlbnRfZmxhZ1tNQVhfU1VCX0xBWUVSU107Ci0gICAgdWludDhfdCBzdWJfbGF5ZXJfbGV2ZWxfcHJlc2VudF9mbGFnW01BWF9TVUJfTEFZRVJTXTsKLX0gUFRMOwotCi10eXBlZGVmIHN0cnVjdCBIRVZDVlBTIHsKLSAgICB1aW50OF90IHZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWc7Ci0gICAgaW50IHZwc19tYXhfbGF5ZXJzOwotICAgIGludCB2cHNfbWF4X3N1Yl9sYXllcnM7IC8vLzwgdnBzX21heF90ZW1wb3JhbF9sYXllcnNfbWludXMxICsgMQotCi0gICAgUFRMIHB0bDsKLSAgICBpbnQgdnBzX3N1Yl9sYXllcl9vcmRlcmluZ19pbmZvX3ByZXNlbnRfZmxhZzsKLSAgICB1bnNpZ25lZCBpbnQgdnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tNQVhfU1VCX0xBWUVSU107Ci0gICAgdW5zaWduZWQgaW50IHZwc19udW1fcmVvcmRlcl9waWNzW01BWF9TVUJfTEFZRVJTXTsKLSAgICB1bnNpZ25lZCBpbnQgdnBzX21heF9sYXRlbmN5X2luY3JlYXNlW01BWF9TVUJfTEFZRVJTXTsKLSAgICBpbnQgdnBzX21heF9sYXllcl9pZDsKLSAgICBpbnQgdnBzX251bV9sYXllcl9zZXRzOyAvLy88IHZwc19udW1fbGF5ZXJfc2V0c19taW51czEgKyAxCi0gICAgdWludDhfdCB2cHNfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnOwotICAgIHVpbnQzMl90IHZwc19udW1fdW5pdHNfaW5fdGljazsKLSAgICB1aW50MzJfdCB2cHNfdGltZV9zY2FsZTsKLSAgICB1aW50OF90IHZwc19wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnOwotICAgIGludCB2cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZTsgLy8vPCB2cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czEgKyAxCi0gICAgaW50IHZwc19udW1faHJkX3BhcmFtZXRlcnM7Ci19IEhFVkNWUFM7Ci0KLXR5cGVkZWYgc3RydWN0IFNjYWxpbmdMaXN0IHsKLSAgICAvKiBUaGlzIGlzIGEgbGl0dGxlIHdhc3RlZnVsLCBzaW5jZSBzaXplSUQgMCBvbmx5IG5lZWRzIDggY29lZmZzLAotICAgICAqIGFuZCBzaXplIElEIDMgb25seSBoYXMgMiBhcnJheXMsIG5vdCA2LiAqLwotICAgIHVpbnQ4X3Qgc2xbNF1bNl1bNjRdOwotICAgIHVpbnQ4X3Qgc2xfZGNbMl1bNl07Ci19IFNjYWxpbmdMaXN0OwotCi10eXBlZGVmIHN0cnVjdCBIRVZDU1BTIHsKLSAgICB1bnNpZ25lZCB2cHNfaWQ7Ci0gICAgaW50IGNocm9tYV9mb3JtYXRfaWRjOwotICAgIHVpbnQ4X3Qgc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWc7Ci0KLSAgICAvLy88IG91dHB1dCAoaS5lLiBjcm9wcGVkKSB2YWx1ZXMKLSAgICBpbnQgb3V0cHV0X3dpZHRoLCBvdXRwdXRfaGVpZ2h0OwotICAgIEhFVkNXaW5kb3cgb3V0cHV0X3dpbmRvdzsKLQotICAgIEhFVkNXaW5kb3cgcGljX2NvbmZfd2luOwotCi0gICAgaW50IGJpdF9kZXB0aDsKLSAgICBpbnQgcGl4ZWxfc2hpZnQ7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7Ci0KLSAgICB1bnNpZ25lZCBpbnQgbG9nMl9tYXhfcG9jX2xzYjsKLSAgICBpbnQgcGNtX2VuYWJsZWRfZmxhZzsKLQotICAgIGludCBtYXhfc3ViX2xheWVyczsKLSAgICBzdHJ1Y3QgewotICAgICAgICBpbnQgbWF4X2RlY19waWNfYnVmZmVyaW5nOwotICAgICAgICBpbnQgbnVtX3Jlb3JkZXJfcGljczsKLSAgICAgICAgaW50IG1heF9sYXRlbmN5X2luY3JlYXNlOwotICAgIH0gdGVtcG9yYWxfbGF5ZXJbTUFYX1NVQl9MQVlFUlNdOwotCi0gICAgVlVJIHZ1aTsKLSAgICBQVEwgcHRsOwotCi0gICAgdWludDhfdCBzY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWc7Ci0gICAgU2NhbGluZ0xpc3Qgc2NhbGluZ19saXN0OwotCi0gICAgdW5zaWduZWQgaW50IG5iX3N0X3JwczsKLSAgICBTaG9ydFRlcm1SUFMgc3RfcnBzW01BWF9TSE9SVF9URVJNX1JQU19DT1VOVF07Ci0KLSAgICB1aW50OF90IGFtcF9lbmFibGVkX2ZsYWc7Ci0gICAgdWludDhfdCBzYW9fZW5hYmxlZDsKLQotICAgIHVpbnQ4X3QgbG9uZ190ZXJtX3JlZl9waWNzX3ByZXNlbnRfZmxhZzsKLSAgICB1aW50MTZfdCBsdF9yZWZfcGljX3BvY19sc2Jfc3BzWzMyXTsKLSAgICB1aW50OF90IHVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbMzJdOwotICAgIHVpbnQ4X3QgbnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHM7Ci0KLSAgICBzdHJ1Y3QgewotICAgICAgICB1aW50OF90IGJpdF9kZXB0aDsKLSAgICAgICAgdWludDhfdCBiaXRfZGVwdGhfY2hyb21hOwotICAgICAgICB1bnNpZ25lZCBpbnQgbG9nMl9taW5fcGNtX2NiX3NpemU7Ci0gICAgICAgIHVuc2lnbmVkIGludCBsb2cyX21heF9wY21fY2Jfc2l6ZTsKLSAgICAgICAgdWludDhfdCBsb29wX2ZpbHRlcl9kaXNhYmxlX2ZsYWc7Ci0gICAgfSBwY207Ci0gICAgdWludDhfdCBzcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZzsKLSAgICB1aW50OF90IHNwc19zdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZV9mbGFnOwotCi0gICAgdW5zaWduZWQgaW50IGxvZzJfbWluX2NiX3NpemU7Ci0gICAgdW5zaWduZWQgaW50IGxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplOwotICAgIHVuc2lnbmVkIGludCBsb2cyX21pbl90Yl9zaXplOwotICAgIHVuc2lnbmVkIGludCBsb2cyX21heF90cmFmb19zaXplOwotICAgIHVuc2lnbmVkIGludCBsb2cyX2N0Yl9zaXplOwotICAgIHVuc2lnbmVkIGludCBsb2cyX21pbl9wdV9zaXplOwotCi0gICAgaW50IG1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyOwotICAgIGludCBtYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYTsKLQotICAgIGludCB0cmFuc2Zvcm1fc2tpcF9yb3RhdGlvbl9lbmFibGVkX2ZsYWc7Ci0gICAgaW50IHRyYW5zZm9ybV9za2lwX2NvbnRleHRfZW5hYmxlZF9mbGFnOwotICAgIGludCBpbXBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWc7Ci0gICAgaW50IGV4cGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZzsKLSAgICBpbnQgaW50cmFfc21vb3RoaW5nX2Rpc2FibGVkX2ZsYWc7Ci0gICAgaW50IHBlcnNpc3RlbnRfcmljZV9hZGFwdGF0aW9uX2VuYWJsZWRfZmxhZzsKLQotICAgIC8vLzwgY29kZWQgZnJhbWUgZGltZW5zaW9uIGluIHZhcmlvdXMgdW5pdHMKLSAgICBpbnQgd2lkdGg7Ci0gICAgaW50IGhlaWdodDsKLSAgICBpbnQgY3RiX3dpZHRoOwotICAgIGludCBjdGJfaGVpZ2h0OwotICAgIGludCBjdGJfc2l6ZTsKLSAgICBpbnQgbWluX2NiX3dpZHRoOwotICAgIGludCBtaW5fY2JfaGVpZ2h0OwotICAgIGludCBtaW5fdGJfd2lkdGg7Ci0gICAgaW50IG1pbl90Yl9oZWlnaHQ7Ci0gICAgaW50IG1pbl9wdV93aWR0aDsKLSAgICBpbnQgbWluX3B1X2hlaWdodDsKLSAgICBpbnQgdGJfbWFzazsKLQotICAgIGludCBoc2hpZnRbM107Ci0gICAgaW50IHZzaGlmdFszXTsKLQotICAgIGludCBxcF9iZF9vZmZzZXQ7Ci19IEhFVkNTUFM7Ci0KLXR5cGVkZWYgc3RydWN0IEhFVkNQUFMgewotICAgIHVuc2lnbmVkIGludCBzcHNfaWQ7IC8vLzwgc2VxX3BhcmFtZXRlcl9zZXRfaWQKLQotICAgIHVpbnQ4X3Qgc2lnbl9kYXRhX2hpZGluZ19mbGFnOwotCi0gICAgdWludDhfdCBjYWJhY19pbml0X3ByZXNlbnRfZmxhZzsKLQotICAgIGludCBudW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZTsgLy8vPCBudW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZV9taW51czEgKyAxCi0gICAgaW50IG51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlOyAvLy88IG51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlX21pbnVzMSArIDEKLSAgICBpbnQgcGljX2luaXRfcXBfbWludXMyNjsKLQotICAgIHVpbnQ4X3QgY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnOwotICAgIHVpbnQ4X3QgdHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnOwotCi0gICAgdWludDhfdCBjdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWc7Ci0gICAgaW50IGRpZmZfY3VfcXBfZGVsdGFfZGVwdGg7Ci0KLSAgICBpbnQgY2JfcXBfb2Zmc2V0OwotICAgIGludCBjcl9xcF9vZmZzZXQ7Ci0gICAgdWludDhfdCBwaWNfc2xpY2VfbGV2ZWxfY2hyb21hX3FwX29mZnNldHNfcHJlc2VudF9mbGFnOwotICAgIHVpbnQ4X3Qgd2VpZ2h0ZWRfcHJlZF9mbGFnOwotICAgIHVpbnQ4X3Qgd2VpZ2h0ZWRfYmlwcmVkX2ZsYWc7Ci0gICAgdWludDhfdCBvdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWc7Ci0gICAgdWludDhfdCB0cmFuc3F1YW50X2J5cGFzc19lbmFibGVfZmxhZzsKLQotICAgIHVpbnQ4X3QgZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZzsKLSAgICB1aW50OF90IHRpbGVzX2VuYWJsZWRfZmxhZzsKLSAgICB1aW50OF90IGVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnOwotCi0gICAgaW50IG51bV90aWxlX2NvbHVtbnM7ICAgLy8vPCBudW1fdGlsZV9jb2x1bW5zX21pbnVzMSArIDEKLSAgICBpbnQgbnVtX3RpbGVfcm93czsgICAgICAvLy88IG51bV90aWxlX3Jvd3NfbWludXMxICsgMQotICAgIHVpbnQ4X3QgdW5pZm9ybV9zcGFjaW5nX2ZsYWc7Ci0gICAgdWludDhfdCBsb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnOwotCi0gICAgdWludDhfdCBzZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWc7Ci0KLSAgICB1aW50OF90IGRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnOwotICAgIHVpbnQ4X3QgZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnOwotICAgIHVpbnQ4X3QgZGlzYWJsZV9kYmY7Ci0gICAgaW50IGJldGFfb2Zmc2V0OyAgICAvLy88IGJldGFfb2Zmc2V0X2RpdjIgKiAyCi0gICAgaW50IHRjX29mZnNldDsgICAgICAvLy88IHRjX29mZnNldF9kaXYyICogMgotCi0gICAgdWludDhfdCBzY2FsaW5nX2xpc3RfZGF0YV9wcmVzZW50X2ZsYWc7Ci0gICAgU2NhbGluZ0xpc3Qgc2NhbGluZ19saXN0OwotCi0gICAgdWludDhfdCBsaXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnOwotICAgIGludCBsb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsOyAvLy88IGxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyICsgMgotICAgIGludCBudW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHM7Ci0gICAgdWludDhfdCBzbGljZV9oZWFkZXJfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZzsKLSAgICB1aW50OF90IGxvZzJfbWF4X3RyYW5zZm9ybV9za2lwX2Jsb2NrX3NpemU7Ci0gICAgdWludDhfdCBjcm9zc19jb21wb25lbnRfcHJlZGljdGlvbl9lbmFibGVkX2ZsYWc7Ci0gICAgdWludDhfdCBjaHJvbWFfcXBfb2Zmc2V0X2xpc3RfZW5hYmxlZF9mbGFnOwotICAgIHVpbnQ4X3QgZGlmZl9jdV9jaHJvbWFfcXBfb2Zmc2V0X2RlcHRoOwotICAgIHVpbnQ4X3QgY2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czE7Ci0gICAgaW50OF90ICBjYl9xcF9vZmZzZXRfbGlzdFs1XTsKLSAgICBpbnQ4X3QgIGNyX3FwX29mZnNldF9saXN0WzVdOwotICAgIHVpbnQ4X3QgbG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2x1bWE7Ci0gICAgdWludDhfdCBsb2cyX3Nhb19vZmZzZXRfc2NhbGVfY2hyb21hOwotCi0gICAgLy8gSW5mZXJyZWQgcGFyYW1ldGVycwotICAgIHVuc2lnbmVkIGludCAqY29sdW1uX3dpZHRoOyAgLy8vPCBDb2x1bW5XaWR0aAotICAgIHVuc2lnbmVkIGludCAqcm93X2hlaWdodDsgICAgLy8vPCBSb3dIZWlnaHQKLSAgICB1bnNpZ25lZCBpbnQgKmNvbF9iZDsgICAgICAgIC8vLzwgQ29sQmQKLSAgICB1bnNpZ25lZCBpbnQgKnJvd19iZDsgICAgICAgIC8vLzwgUm93QmQKLSAgICBpbnQgKmNvbF9pZHhYOwotCi0gICAgaW50ICpjdGJfYWRkcl9yc190b190czsgLy8vPCBDdGJBZGRyUlNUb1RTCi0gICAgaW50ICpjdGJfYWRkcl90c190b19yczsgLy8vPCBDdGJBZGRyVFNUb1JTCi0gICAgaW50ICp0aWxlX2lkOyAgICAgICAgICAgLy8vPCBUaWxlSWQKLSAgICBpbnQgKnRpbGVfcG9zX3JzOyAgICAgICAvLy88IFRpbGVQb3NSUwotICAgIGludCAqbWluX3RiX2FkZHJfenM7ICAgIC8vLzwgTWluVGJBZGRyWlMKLSAgICBpbnQgKm1pbl90Yl9hZGRyX3pzX3RhYjsvLy88IE1pblRiQWRkclpTCi19IEhFVkNQUFM7Ci0KLXR5cGVkZWYgc3RydWN0IEhFVkNQYXJhbVNldHMgewotICAgIEFWQnVmZmVyUmVmICp2cHNfbGlzdFtNQVhfVlBTX0NPVU5UXTsKLSAgICBBVkJ1ZmZlclJlZiAqc3BzX2xpc3RbTUFYX1NQU19DT1VOVF07Ci0gICAgQVZCdWZmZXJSZWYgKnBwc19saXN0W01BWF9QUFNfQ09VTlRdOwotCi0gICAgLyogY3VycmVudGx5IGFjdGl2ZSBwYXJhbWV0ZXIgc2V0cyAqLwotICAgIGNvbnN0IEhFVkNWUFMgKnZwczsKLSAgICBjb25zdCBIRVZDU1BTICpzcHM7Ci0gICAgY29uc3QgSEVWQ1BQUyAqcHBzOwotfSBIRVZDUGFyYW1TZXRzOwotCi10eXBlZGVmIHN0cnVjdCBTbGljZUhlYWRlciB7Ci0gICAgdW5zaWduZWQgaW50IHBwc19pZDsKLQotICAgIC8vLzwgYWRkcmVzcyAoaW4gcmFzdGVyIG9yZGVyKSBvZiB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGN1cnJlbnQgc2xpY2Ugc2VnbWVudAotICAgIHVuc2lnbmVkIGludCAgIHNsaWNlX3NlZ21lbnRfYWRkcjsKLSAgICAvLy88IGFkZHJlc3MgKGluIHJhc3RlciBvcmRlcikgb2YgdGhlIGZpcnN0IGJsb2NrIGluIHRoZSBjdXJyZW50IHNsaWNlCi0gICAgdW5zaWduZWQgaW50ICAgc2xpY2VfYWRkcjsKLQotICAgIGVudW0gU2xpY2VUeXBlIHNsaWNlX3R5cGU7Ci0KLSAgICBpbnQgcGljX29yZGVyX2NudF9sc2I7Ci0KLSAgICB1aW50OF90IGZpcnN0X3NsaWNlX2luX3BpY19mbGFnOwotICAgIHVpbnQ4X3QgZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZzsKLSAgICB1aW50OF90IHBpY19vdXRwdXRfZmxhZzsKLSAgICB1aW50OF90IGNvbG91cl9wbGFuZV9pZDsKLQotICAgIC8vLzwgUlBTIGNvZGVkIGluIHRoZSBzbGljZSBoZWFkZXIgaXRzZWxmIGlzIHN0b3JlZCBoZXJlCi0gICAgaW50IHNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWc7Ci0gICAgaW50IHNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc2l6ZTsKLSAgICBTaG9ydFRlcm1SUFMgc2xpY2VfcnBzOwotICAgIGNvbnN0IFNob3J0VGVybVJQUyAqc2hvcnRfdGVybV9ycHM7Ci0gICAgaW50IGxvbmdfdGVybV9yZWZfcGljX3NldF9zaXplOwotICAgIExvbmdUZXJtUlBTIGxvbmdfdGVybV9ycHM7Ci0gICAgdW5zaWduZWQgaW50IGxpc3RfZW50cnlfbHhbMl1bMzJdOwotCi0gICAgdWludDhfdCBycGxfbW9kaWZpY2F0aW9uX2ZsYWdbMl07Ci0gICAgdWludDhfdCBub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnOwotICAgIHVpbnQ4X3Qgc2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZzsKLQotICAgIHVuc2lnbmVkIGludCBuYl9yZWZzWzJdOwotCi0gICAgdWludDhfdCBzbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbM107Ci0gICAgdWludDhfdCBtdmRfbDFfemVyb19mbGFnOwotCi0gICAgdWludDhfdCBjYWJhY19pbml0X2ZsYWc7Ci0gICAgdWludDhfdCBkaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWc7IC8vLzwgc2xpY2VfaGVhZGVyX2Rpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfZmxhZwotICAgIHVpbnQ4X3Qgc2xpY2VfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWc7Ci0gICAgdWludDhfdCBjb2xsb2NhdGVkX2xpc3Q7Ci0KLSAgICB1bnNpZ25lZCBpbnQgY29sbG9jYXRlZF9yZWZfaWR4OwotCi0gICAgaW50IHNsaWNlX3FwX2RlbHRhOwotICAgIGludCBzbGljZV9jYl9xcF9vZmZzZXQ7Ci0gICAgaW50IHNsaWNlX2NyX3FwX29mZnNldDsKLQotICAgIHVpbnQ4X3QgY3VfY2hyb21hX3FwX29mZnNldF9lbmFibGVkX2ZsYWc7Ci0KLSAgICBpbnQgYmV0YV9vZmZzZXQ7ICAgIC8vLzwgYmV0YV9vZmZzZXRfZGl2MiAqIDIKLSAgICBpbnQgdGNfb2Zmc2V0OyAgICAgIC8vLzwgdGNfb2Zmc2V0X2RpdjIgKiAyCi0KLSAgICB1bnNpZ25lZCBpbnQgbWF4X251bV9tZXJnZV9jYW5kOyAvLy88IDUgLSA1X21pbnVzX21heF9udW1fbWVyZ2VfY2FuZAotCi0gICAgdW5zaWduZWQgKmVudHJ5X3BvaW50X29mZnNldDsKLSAgICBpbnQgKiBvZmZzZXQ7Ci0gICAgaW50ICogc2l6ZTsKLSAgICBpbnQgbnVtX2VudHJ5X3BvaW50X29mZnNldHM7Ci0KLSAgICBpbnQ4X3Qgc2xpY2VfcXA7Ci0KLSAgICB1aW50OF90IGx1bWFfbG9nMl93ZWlnaHRfZGVub207Ci0gICAgaW50MTZfdCBjaHJvbWFfbG9nMl93ZWlnaHRfZGVub207Ci0KLSAgICBpbnQxNl90IGx1bWFfd2VpZ2h0X2wwWzE2XTsKLSAgICBpbnQxNl90IGNocm9tYV93ZWlnaHRfbDBbMTZdWzJdOwotICAgIGludDE2X3QgY2hyb21hX3dlaWdodF9sMVsxNl1bMl07Ci0gICAgaW50MTZfdCBsdW1hX3dlaWdodF9sMVsxNl07Ci0KLSAgICBpbnQxNl90IGx1bWFfb2Zmc2V0X2wwWzE2XTsKLSAgICBpbnQxNl90IGNocm9tYV9vZmZzZXRfbDBbMTZdWzJdOwotCi0gICAgaW50MTZfdCBsdW1hX29mZnNldF9sMVsxNl07Ci0gICAgaW50MTZfdCBjaHJvbWFfb2Zmc2V0X2wxWzE2XVsyXTsKLQotICAgIGludCBzbGljZV9jdGJfYWRkcl9yczsKLX0gU2xpY2VIZWFkZXI7Ci0KLXR5cGVkZWYgc3RydWN0IENvZGluZ1VuaXQgewotICAgIGludCB4OwotICAgIGludCB5OwotCi0gICAgZW51bSBQcmVkTW9kZSBwcmVkX21vZGU7ICAgIC8vLzwgUHJlZE1vZGUKLSAgICBlbnVtIFBhcnRNb2RlIHBhcnRfbW9kZTsgICAgLy8vPCBQYXJ0TW9kZQotCi0gICAgLy8gSW5mZXJyZWQgcGFyYW1ldGVycwotICAgIHVpbnQ4X3QgaW50cmFfc3BsaXRfZmxhZzsgICAvLy88IEludHJhU3BsaXRGbGFnCi0gICAgdWludDhfdCBtYXhfdHJhZm9fZGVwdGg7ICAgIC8vLzwgTWF4VHJhZm9EZXB0aAotICAgIHVpbnQ4X3QgY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZzsKLX0gQ29kaW5nVW5pdDsKLQotdHlwZWRlZiBzdHJ1Y3QgTXYgewotICAgIGludDE2X3QgeDsgIC8vLzwgaG9yaXpvbnRhbCBjb21wb25lbnQgb2YgbW90aW9uIHZlY3RvcgotICAgIGludDE2X3QgeTsgIC8vLzwgdmVydGljYWwgY29tcG9uZW50IG9mIG1vdGlvbiB2ZWN0b3IKLX0gTXY7Ci0KLXR5cGVkZWYgc3RydWN0IE12RmllbGQgewotICAgIERFQ0xBUkVfQUxJR05FRCg0LCBNdiwgbXYpWzJdOwotICAgIGludDhfdCByZWZfaWR4WzJdOwotICAgIGludDhfdCBwcmVkX2ZsYWc7Ci19IE12RmllbGQ7Ci0KLXR5cGVkZWYgc3RydWN0IE5laWdoYm91ckF2YWlsYWJsZSB7Ci0gICAgaW50IGNhbmRfYm90dG9tX2xlZnQ7Ci0gICAgaW50IGNhbmRfbGVmdDsKLSAgICBpbnQgY2FuZF91cDsKLSAgICBpbnQgY2FuZF91cF9sZWZ0OwotICAgIGludCBjYW5kX3VwX3JpZ2h0OwotICAgIGludCBjYW5kX3VwX3JpZ2h0X3NhcDsKLX0gTmVpZ2hib3VyQXZhaWxhYmxlOwotCi10eXBlZGVmIHN0cnVjdCBQcmVkaWN0aW9uVW5pdCB7Ci0gICAgaW50IG1wbV9pZHg7Ci0gICAgaW50IHJlbV9pbnRyYV9sdW1hX3ByZWRfbW9kZTsKLSAgICB1aW50OF90IGludHJhX3ByZWRfbW9kZVs0XTsKLSAgICBNdiBtdmQ7Ci0gICAgdWludDhfdCBtZXJnZV9mbGFnOwotICAgIHVpbnQ4X3QgaW50cmFfcHJlZF9tb2RlX2NbNF07Ci0gICAgdWludDhfdCBjaHJvbWFfbW9kZV9jWzRdOwotfSBQcmVkaWN0aW9uVW5pdDsKLQotdHlwZWRlZiBzdHJ1Y3QgVHJhbnNmb3JtVW5pdCB7Ci0gICAgaW50IGN1X3FwX2RlbHRhOwotCi0gICAgaW50IHJlc19zY2FsZV92YWw7Ci0KLSAgICAvLyBJbmZlcnJlZCBwYXJhbWV0ZXJzOwotICAgIGludCBpbnRyYV9wcmVkX21vZGU7Ci0gICAgaW50IGludHJhX3ByZWRfbW9kZV9jOwotICAgIGludCBjaHJvbWFfbW9kZV9jOwotICAgIHVpbnQ4X3QgaXNfY3VfcXBfZGVsdGFfY29kZWQ7Ci0gICAgdWludDhfdCBpc19jdV9jaHJvbWFfcXBfb2Zmc2V0X2NvZGVkOwotICAgIGludDhfdCAgY3VfcXBfb2Zmc2V0X2NiOwotICAgIGludDhfdCAgY3VfcXBfb2Zmc2V0X2NyOwotICAgIHVpbnQ4X3QgY3Jvc3NfcGY7Ci19IFRyYW5zZm9ybVVuaXQ7Ci0KLXR5cGVkZWYgc3RydWN0IERCUGFyYW1zIHsKLSAgICBpbnQgYmV0YV9vZmZzZXQ7Ci0gICAgaW50IHRjX29mZnNldDsKLX0gREJQYXJhbXM7Ci0KLSNkZWZpbmUgSEVWQ19GUkFNRV9GTEFHX09VVFBVVCAgICAoMSA8PCAwKQotI2RlZmluZSBIRVZDX0ZSQU1FX0ZMQUdfU0hPUlRfUkVGICgxIDw8IDEpCi0jZGVmaW5lIEhFVkNfRlJBTUVfRkxBR19MT05HX1JFRiAgKDEgPDwgMikKLSNkZWZpbmUgSEVWQ19GUkFNRV9GTEFHX0JVTVBJTkcgICAoMSA8PCAzKQotCi10eXBlZGVmIHN0cnVjdCBIRVZDRnJhbWUgewotICAgIEFWRnJhbWUgKmZyYW1lOwotICAgIFRocmVhZEZyYW1lIHRmOwotICAgIE12RmllbGQgKnRhYl9tdmY7Ci0gICAgUmVmUGljTGlzdCAqcmVmUGljTGlzdDsKLSAgICBSZWZQaWNMaXN0VGFiICoqcnBsX3RhYjsKLSAgICBpbnQgY3RiX2NvdW50OwotICAgIGludCBwb2M7Ci0gICAgc3RydWN0IEhFVkNGcmFtZSAqY29sbG9jYXRlZF9yZWY7Ci0KLSAgICBIRVZDV2luZG93IHdpbmRvdzsKLQotICAgIEFWQnVmZmVyUmVmICp0YWJfbXZmX2J1ZjsKLSAgICBBVkJ1ZmZlclJlZiAqcnBsX3RhYl9idWY7Ci0gICAgQVZCdWZmZXJSZWYgKnJwbF9idWY7Ci0KLSAgICBBVkJ1ZmZlclJlZiAqaHdhY2NlbF9wcml2X2J1ZjsKLSAgICB2b2lkICpod2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKLQotICAgIC8qKgotICAgICAqIEEgc2VxdWVuY2UgY291bnRlciwgc28gdGhhdCBvbGQgZnJhbWVzIGFyZSBvdXRwdXQgZmlyc3QKLSAgICAgKiBhZnRlciBhIFBPQyByZXNldAotICAgICAqLwotICAgIHVpbnQxNl90IHNlcXVlbmNlOwotCi0gICAgLyoqCi0gICAgICogQSBjb21iaW5hdGlvbiBvZiBIRVZDX0ZSQU1FX0ZMQUdfKgotICAgICAqLwotICAgIHVpbnQ4X3QgZmxhZ3M7Ci19IEhFVkNGcmFtZTsKLQotdHlwZWRlZiBzdHJ1Y3QgSEVWQ05BTCB7Ci0gICAgdWludDhfdCAqcmJzcF9idWZmZXI7Ci0gICAgaW50IHJic3BfYnVmZmVyX3NpemU7Ci0KLSAgICBpbnQgc2l6ZTsKLSAgICBjb25zdCB1aW50OF90ICpkYXRhOwotCi0gICAgaW50IHJhd19zaXplOwotICAgIGNvbnN0IHVpbnQ4X3QgKnJhd19kYXRhOwotCi0gICAgR2V0Qml0Q29udGV4dCBnYjsKLQotICAgIGVudW0gTkFMVW5pdFR5cGUgdHlwZTsKLSAgICBpbnQgdGVtcG9yYWxfaWQ7Ci0KLSAgICBpbnQgc2tpcHBlZF9ieXRlczsKLSAgICBpbnQgc2tpcHBlZF9ieXRlc19wb3Nfc2l6ZTsKLSAgICBpbnQgKnNraXBwZWRfYnl0ZXNfcG9zOwotfSBIRVZDTkFMOwotCi0vKiBhbiBpbnB1dCBwYWNrZXQgc3BsaXQgaW50byB1bmVzY2FwZWQgTkFMIHVuaXRzICovCi10eXBlZGVmIHN0cnVjdCBIRVZDUGFja2V0IHsKLSAgICBIRVZDTkFMICpuYWxzOwotICAgIGludCBuYl9uYWxzOwotICAgIGludCBuYWxzX2FsbG9jYXRlZDsKLX0gSEVWQ1BhY2tldDsKLQotdHlwZWRlZiBzdHJ1Y3QgSEVWQ0xvY2FsQ29udGV4dCB7Ci0gICAgdWludDhfdCBjYWJhY19zdGF0ZVtIRVZDX0NPTlRFWFRTXTsKLQotICAgIHVpbnQ4X3Qgc3RhdF9jb2VmZls0XTsKLQotICAgIHVpbnQ4X3QgZmlyc3RfcXBfZ3JvdXA7Ci0KLSAgICBHZXRCaXRDb250ZXh0IGdiOwotICAgIENBQkFDQ29udGV4dCBjYzsKLQotICAgIGludDhfdCBxcF95OwotICAgIGludDhfdCBjdXJyX3FwX3k7Ci0KLSAgICBpbnQgcVB5X3ByZWQ7Ci0KLSAgICBUcmFuc2Zvcm1Vbml0IHR1OwotCi0gICAgdWludDhfdCBjdGJfbGVmdF9mbGFnOwotICAgIHVpbnQ4X3QgY3RiX3VwX2ZsYWc7Ci0gICAgdWludDhfdCBjdGJfdXBfcmlnaHRfZmxhZzsKLSAgICB1aW50OF90IGN0Yl91cF9sZWZ0X2ZsYWc7Ci0gICAgaW50ICAgICBlbmRfb2ZfdGlsZXNfeDsKLSAgICBpbnQgICAgIGVuZF9vZl90aWxlc195OwotICAgIC8qICs3IGlzIGZvciBzdWJwaXhlbCBpbnRlcnBvbGF0aW9uLCAqMiBmb3IgaGlnaCBiaXQgZGVwdGhzICovCi0gICAgREVDTEFSRV9BTElHTkVEKDMyLCB1aW50OF90LCBlZGdlX2VtdV9idWZmZXIpWyhNQVhfUEJfU0laRSArIDcpICogRURHRV9FTVVfQlVGRkVSX1NUUklERSAqIDJdOwotICAgIC8qIFRoZSBleHRlbmRlZCBzaXplIGJldHdlZW4gdGhlIG5ldyBlZGdlIGVtdSBidWZmZXIgaXMgYWJ1c2VkIGJ5IFNBTyAqLwotICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgdWludDhfdCwgZWRnZV9lbXVfYnVmZmVyMilbKE1BWF9QQl9TSVpFICsgNykgKiBFREdFX0VNVV9CVUZGRVJfU1RSSURFICogMl07Ci0gICAgREVDTEFSRV9BTElHTkVEKDMyLCBpbnQxNl90LCB0bXAgW01BWF9QQl9TSVpFICogTUFYX1BCX1NJWkVdKTsKLQotICAgIGludCBjdF9kZXB0aDsKLSAgICBDb2RpbmdVbml0IGN1OwotICAgIFByZWRpY3Rpb25Vbml0IHB1OwotICAgIE5laWdoYm91ckF2YWlsYWJsZSBuYTsKLQotI2RlZmluZSBCT1VOREFSWV9MRUZUX1NMSUNFICAgICAoMSA8PCAwKQotI2RlZmluZSBCT1VOREFSWV9MRUZUX1RJTEUgICAgICAoMSA8PCAxKQotI2RlZmluZSBCT1VOREFSWV9VUFBFUl9TTElDRSAgICAoMSA8PCAyKQotI2RlZmluZSBCT1VOREFSWV9VUFBFUl9USUxFICAgICAoMSA8PCAzKQotICAgIC8qIHByb3BlcnRpZXMgb2YgdGhlIGJvdW5kYXJ5IG9mIHRoZSBjdXJyZW50IENUQiBmb3IgdGhlIHB1cnBvc2VzCi0gICAgICogb2YgdGhlIGRlYmxvY2tpbmcgZmlsdGVyICovCi0gICAgaW50IGJvdW5kYXJ5X2ZsYWdzOwotfSBIRVZDTG9jYWxDb250ZXh0OwotCi10eXBlZGVmIHN0cnVjdCBIRVZDQ29udGV4dCB7Ci0gICAgY29uc3QgQVZDbGFzcyAqYzsgIC8vIG5lZWRlZCBieSBwcml2YXRlIGF2b3B0aW9ucwotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKLQotICAgIHN0cnVjdCBIRVZDQ29udGV4dCAgKnNMaXN0W01BWF9OQl9USFJFQURTXTsKLQotICAgIEhFVkNMb2NhbENvbnRleHQgICAgKkhFVkNsY0xpc3RbTUFYX05CX1RIUkVBRFNdOwotICAgIEhFVkNMb2NhbENvbnRleHQgICAgKkhFVkNsYzsKLQotICAgIHVpbnQ4X3QgICAgICAgICAgICAgdGhyZWFkc190eXBlOwotICAgIHVpbnQ4X3QgICAgICAgICAgICAgdGhyZWFkc19udW1iZXI7Ci0KLSAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoOwotICAgIGludCAgICAgICAgICAgICAgICAgaGVpZ2h0OwotCi0gICAgdWludDhfdCAqY2FiYWNfc3RhdGU7Ci0KLSAgICAvKiogMSBpZiB0aGUgaW5kZXBlbmRlbnQgc2xpY2Ugc2VnbWVudCBoZWFkZXIgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgKi8KLSAgICB1aW50OF90IHNsaWNlX2luaXRpYWxpemVkOwotCi0gICAgQVZGcmFtZSAqZnJhbWU7Ci0gICAgQVZGcmFtZSAqb3V0cHV0X2ZyYW1lOwotICAgIHVpbnQ4X3QgKnNhb19waXhlbF9idWZmZXJfaFszXTsKLSAgICB1aW50OF90ICpzYW9fcGl4ZWxfYnVmZmVyX3ZbM107Ci0KLSAgICBIRVZDUGFyYW1TZXRzIHBzOwotCi0gICAgQVZCdWZmZXJQb29sICp0YWJfbXZmX3Bvb2w7Ci0gICAgQVZCdWZmZXJQb29sICpycGxfdGFiX3Bvb2w7Ci0KLSAgICAvLy88IGNhbmRpZGF0ZSByZWZlcmVuY2VzIGZvciB0aGUgY3VycmVudCBmcmFtZQotICAgIFJlZlBpY0xpc3QgcnBzWzVdOwotCi0gICAgU2xpY2VIZWFkZXIgc2g7Ci0gICAgU0FPUGFyYW1zICpzYW87Ci0gICAgREJQYXJhbXMgKmRlYmxvY2s7Ci0gICAgZW51bSBOQUxVbml0VHlwZSBuYWxfdW5pdF90eXBlOwotICAgIGludCB0ZW1wb3JhbF9pZDsgIC8vLzwgdGVtcG9yYWxfaWRfcGx1czEgLSAxCi0gICAgSEVWQ0ZyYW1lICpyZWY7Ci0gICAgSEVWQ0ZyYW1lIERQQlszMl07Ci0gICAgaW50IHBvYzsKLSAgICBpbnQgcG9jVGlkMDsKLSAgICBpbnQgc2xpY2VfaWR4OyAvLy88IG51bWJlciBvZiB0aGUgc2xpY2UgYmVpbmcgY3VycmVudGx5IGRlY29kZWQKLSAgICBpbnQgZW9zOyAgICAgICAvLy88IGN1cnJlbnQgcGFja2V0IGNvbnRhaW5zIGFuIEVPUy9FT0IgTkFMCi0gICAgaW50IGxhc3RfZW9zOyAgLy8vPCBsYXN0IHBhY2tldCBjb250YWlucyBhbiBFT1MvRU9CIE5BTAotICAgIGludCBtYXhfcmE7Ci0gICAgaW50IGJzX3dpZHRoOwotICAgIGludCBic19oZWlnaHQ7Ci0KLSAgICBpbnQgaXNfZGVjb2RlZDsKLSAgICBpbnQgbm9fcmFzbF9vdXRwdXRfZmxhZzsKLQotICAgIEhFVkNQcmVkQ29udGV4dCBocGM7Ci0gICAgSEVWQ0RTUENvbnRleHQgaGV2Y2RzcDsKLSAgICBWaWRlb0RTUENvbnRleHQgdmRzcDsKLSAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKLSAgICBpbnQ4X3QgKnFwX3lfdGFiOwotICAgIHVpbnQ4X3QgKmhvcml6b250YWxfYnM7Ci0gICAgdWludDhfdCAqdmVydGljYWxfYnM7Ci0KLSAgICBpbnQzMl90ICp0YWJfc2xpY2VfYWRkcmVzczsKLQotICAgIC8vICBDVQotICAgIHVpbnQ4X3QgKnNraXBfZmxhZzsKLSAgICB1aW50OF90ICp0YWJfY3RfZGVwdGg7Ci0gICAgLy8gUFUKLSAgICB1aW50OF90ICp0YWJfaXBtOwotCi0gICAgdWludDhfdCAqY2JmX2x1bWE7IC8vIGNiZl9sdW1hIG9mIGNvbG9jYXRlZCBUVQotICAgIHVpbnQ4X3QgKmlzX3BjbTsKLQotICAgIC8vIENUQi1sZXZlbCBmbGFncyBhZmZlY3RpbmcgbG9vcCBmaWx0ZXIgb3BlcmF0aW9uCi0gICAgdWludDhfdCAqZmlsdGVyX3NsaWNlX2VkZ2VzOwotCi0gICAgLyoqIHVzZWQgb24gQkUgdG8gYnl0ZXN3YXAgdGhlIGxpbmVzIGZvciBjaGVja3N1bW1pbmcgKi8KLSAgICB1aW50OF90ICpjaGVja3N1bV9idWY7Ci0gICAgaW50ICAgICAgY2hlY2tzdW1fYnVmX3NpemU7Ci0KLSAgICAvKioKLSAgICAgKiBTZXF1ZW5jZSBjb3VudGVycyBmb3IgZGVjb2RlZCBhbmQgb3V0cHV0IGZyYW1lcywgc28gdGhhdCBvbGQKLSAgICAgKiBmcmFtZXMgYXJlIG91dHB1dCBmaXJzdCBhZnRlciBhIFBPQyByZXNldAotICAgICAqLwotICAgIHVpbnQxNl90IHNlcV9kZWNvZGU7Ci0gICAgdWludDE2X3Qgc2VxX291dHB1dDsKLQotICAgIGludCBlbmFibGVfcGFyYWxsZWxfdGlsZXM7Ci0gICAgaW50IHdwcF9lcnI7Ci0KLSAgICBjb25zdCB1aW50OF90ICpkYXRhOwotCi0gICAgSEVWQ1BhY2tldCBwa3Q7Ci0gICAgLy8gdHlwZSBvZiB0aGUgZmlyc3QgVkNMIE5BTCBvZiB0aGUgY3VycmVudCBmcmFtZQotICAgIGVudW0gTkFMVW5pdFR5cGUgZmlyc3RfbmFsX3R5cGU7Ci0KLSAgICAvLyBmb3IgY2hlY2tpbmcgdGhlIGZyYW1lIGNoZWNrc3VtcwotICAgIHN0cnVjdCBBVk1ENSAqbWQ1X2N0eDsKLSAgICB1aW50OF90ICAgICAgIG1kNVszXVsxNl07Ci0gICAgdWludDhfdCBpc19tZDU7Ci0KLSAgICB1aW50OF90IGNvbnRleHRfaW5pdGlhbGl6ZWQ7Ci0gICAgdWludDhfdCBpc19uYWxmZjsgICAgICAgLy8vPCB0aGlzIGZsYWcgaXMgIT0gMCBpZiBiaXRzdHJlYW0gaXMgZW5jYXBzdWxhdGVkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhcyBhIGZvcm1hdCBkZWZpbmVkIGluIDE0NDk2LTE1Ci0gICAgaW50IGFwcGx5X2RlZmRpc3B3aW47Ci0KLSAgICBpbnQgYWN0aXZlX3NlcV9wYXJhbWV0ZXJfc2V0X2lkOwotCi0gICAgaW50IG5hbF9sZW5ndGhfc2l6ZTsgICAgLy8vPCBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgbmFsIGxlbmd0aCAoMSwgMiBvciA0KQotICAgIGludCBudWhfbGF5ZXJfaWQ7Ci0KLSAgICAvKiogZnJhbWUgcGFja2luZyBhcnJhbmdlbWVudCB2YXJpYWJsZXMgKi8KLSAgICBpbnQgc2VpX2ZyYW1lX3BhY2tpbmdfcHJlc2VudDsKLSAgICBpbnQgZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlOwotICAgIGludCBjb250ZW50X2ludGVycHJldGF0aW9uX3R5cGU7Ci0gICAgaW50IHF1aW5jdW54X3N1YnNhbXBsaW5nOwotCi0gICAgLyoqIGRpc3BsYXkgb3JpZW50YXRpb24gKi8KLSAgICBpbnQgc2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudDsKLSAgICBpbnQgc2VpX2FudGljbG9ja3dpc2Vfcm90YXRpb247Ci0gICAgaW50IHNlaV9oZmxpcCwgc2VpX3ZmbGlwOwotCi0gICAgaW50IHBpY3R1cmVfc3RydWN0OwotCi0gICAgdWludDhfdCogYTUzX2NhcHRpb247Ci0gICAgaW50IGE1M19jYXB0aW9uX3NpemU7Ci0KLSAgICAvKiogbWFzdGVyaW5nIGRpc3BsYXkgKi8KLSAgICBpbnQgc2VpX21hc3RlcmluZ19kaXNwbGF5X2luZm9fcHJlc2VudDsKLSAgICB1aW50MTZfdCBkaXNwbGF5X3ByaW1hcmllc1szXVsyXTsKLSAgICB1aW50MTZfdCB3aGl0ZV9wb2ludFsyXTsKLSAgICB1aW50MzJfdCBtYXhfbWFzdGVyaW5nX2x1bWluYW5jZTsKLSAgICB1aW50MzJfdCBtaW5fbWFzdGVyaW5nX2x1bWluYW5jZTsKLQotfSBIRVZDQ29udGV4dDsKLQotaW50IGZmX2hldmNfZGVjb2RlX3Nob3J0X3Rlcm1fcnBzKEdldEJpdENvbnRleHQgKmdiLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvcnRUZXJtUlBTICpycHMsIGNvbnN0IEhFVkNTUFMgKnNwcywgaW50IGlzX3NsaWNlX2hlYWRlcik7Ci0KLS8qKgotICogUGFyc2UgdGhlIFNQUyBmcm9tIHRoZSBiaXRzdHJlYW0gaW50byB0aGUgcHJvdmlkZWQgSEVWQ1NQUyBzdHJ1Y3QuCi0gKgotICogQHBhcmFtIHNwc19pZCB0aGUgU1BTIGlkIHdpbGwgYmUgd3JpdHRlbiBoZXJlCi0gKiBAcGFyYW0gYXBwbHlfZGVmZGlzcHdpbiBpZiBzZXQgMSwgdGhlIGRlZmF1bHQgZGlzcGxheSB3aW5kb3cgZnJvbSB0aGUgVlVJCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHZpZGVvIGRpbWVuc2lvbnMKLSAqIEBwYXJhbSB2cHNfbGlzdCBpZiBub24tTlVMTCwgdGhpcyBmdW5jdGlvbiB3aWxsIHZhbGlkYXRlIHRoYXQgdGhlIFNQUyByZWZlcnMKLSAqICAgICAgICAgICAgICAgICB0byBhbiBleGlzdGluZyBWUFMKLSAqLwotaW50IGZmX2hldmNfcGFyc2Vfc3BzKEhFVkNTUFMgKnNwcywgR2V0Qml0Q29udGV4dCAqZ2IsIHVuc2lnbmVkIGludCAqc3BzX2lkLAotICAgICAgICAgICAgICAgICAgICAgIGludCBhcHBseV9kZWZkaXNwd2luLCBBVkJ1ZmZlclJlZiAqKnZwc19saXN0LCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwotCi1pbnQgZmZfaGV2Y19kZWNvZGVfbmFsX3ZwcyhHZXRCaXRDb250ZXh0ICpnYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVWQ1BhcmFtU2V0cyAqcHMpOwotaW50IGZmX2hldmNfZGVjb2RlX25hbF9zcHMoR2V0Qml0Q29udGV4dCAqZ2IsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNQYXJhbVNldHMgKnBzLCBpbnQgYXBwbHlfZGVmZGlzcHdpbik7Ci1pbnQgZmZfaGV2Y19kZWNvZGVfbmFsX3BwcyhHZXRCaXRDb250ZXh0ICpnYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVWQ1BhcmFtU2V0cyAqcHMpOwotaW50IGZmX2hldmNfZGVjb2RlX25hbF9zZWkoSEVWQ0NvbnRleHQgKnMpOwotCi0vKioKLSAqIE1hcmsgYWxsIGZyYW1lcyBpbiBEUEIgYXMgdW51c2VkIGZvciByZWZlcmVuY2UuCi0gKi8KLXZvaWQgZmZfaGV2Y19jbGVhcl9yZWZzKEhFVkNDb250ZXh0ICpzKTsKLQotLyoqCi0gKiBEcm9wIGFsbCBmcmFtZXMgY3VycmVudGx5IGluIERQQi4KLSAqLwotdm9pZCBmZl9oZXZjX2ZsdXNoX2RwYihIRVZDQ29udGV4dCAqcyk7Ci0KLS8qKgotICogQ29tcHV0ZSBQT0Mgb2YgdGhlIGN1cnJlbnQgZnJhbWUgYW5kIHJldHVybiBpdC4KLSAqLwotaW50IGZmX2hldmNfY29tcHV0ZV9wb2MoSEVWQ0NvbnRleHQgKnMsIGludCBwb2NfbHNiKTsKLQotUmVmUGljTGlzdCAqZmZfaGV2Y19nZXRfcmVmX2xpc3QoSEVWQ0NvbnRleHQgKnMsIEhFVkNGcmFtZSAqZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeDAsIGludCB5MCk7Ci0KLS8qKgotICogQ29uc3RydWN0IHRoZSByZWZlcmVuY2UgcGljdHVyZSBzZXRzIGZvciB0aGUgY3VycmVudCBmcmFtZS4KLSAqLwotaW50IGZmX2hldmNfZnJhbWVfcnBzKEhFVkNDb250ZXh0ICpzKTsKLQotLyoqCi0gKiBDb25zdHJ1Y3QgdGhlIHJlZmVyZW5jZSBwaWN0dXJlIGxpc3QocykgZm9yIHRoZSBjdXJyZW50IHNsaWNlLgotICovCi1pbnQgZmZfaGV2Y19zbGljZV9ycGwoSEVWQ0NvbnRleHQgKnMpOwotCi12b2lkIGZmX2hldmNfc2F2ZV9zdGF0ZXMoSEVWQ0NvbnRleHQgKnMsIGludCBjdGJfYWRkcl90cyk7Ci12b2lkIGZmX2hldmNfY2FiYWNfaW5pdChIRVZDQ29udGV4dCAqcywgaW50IGN0Yl9hZGRyX3RzKTsKLWludCBmZl9oZXZjX3Nhb19tZXJnZV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19zYW9fdHlwZV9pZHhfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKLWludCBmZl9oZXZjX3Nhb19iYW5kX3Bvc2l0aW9uX2RlY29kZShIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19zYW9fb2Zmc2V0X2Fic19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOwotaW50IGZmX2hldmNfc2FvX29mZnNldF9zaWduX2RlY29kZShIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19zYW9fZW9fY2xhc3NfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKLWludCBmZl9oZXZjX2VuZF9vZl9zbGljZV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19za2lwX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfY2IsIGludCB5X2NiKTsKLWludCBmZl9oZXZjX3ByZWRfbW9kZV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOwotaW50IGZmX2hldmNfc3BsaXRfY29kaW5nX3VuaXRfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBjdF9kZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4MCwgaW50IHkwKTsKLWludCBmZl9oZXZjX3BhcnRfbW9kZV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBsb2cyX2NiX3NpemUpOwotaW50IGZmX2hldmNfcGNtX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKLWludCBmZl9oZXZjX3ByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKLWludCBmZl9oZXZjX21wbV9pZHhfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKLWludCBmZl9oZXZjX3JlbV9pbnRyYV9sdW1hX3ByZWRfbW9kZV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOwotaW50IGZmX2hldmNfaW50cmFfY2hyb21hX3ByZWRfbW9kZV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOwotaW50IGZmX2hldmNfbWVyZ2VfaWR4X2RlY29kZShIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19tZXJnZV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19pbnRlcl9wcmVkX2lkY19kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBuUGJXLCBpbnQgblBiSCk7Ci1pbnQgZmZfaGV2Y19yZWZfaWR4X2x4X2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IG51bV9yZWZfaWR4X2x4KTsKLWludCBmZl9oZXZjX212cF9seF9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19ub19yZXNpZHVhbF9zeW50YXhfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOwotaW50IGZmX2hldmNfc3BsaXRfdHJhbnNmb3JtX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgbG9nMl90cmFmb19zaXplKTsKLWludCBmZl9oZXZjX2NiZl9jYl9jcl9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCB0cmFmb19kZXB0aCk7Ci1pbnQgZmZfaGV2Y19jYmZfbHVtYV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCB0cmFmb19kZXB0aCk7Ci1pbnQgZmZfaGV2Y19sb2cyX3Jlc19zY2FsZV9hYnMoSEVWQ0NvbnRleHQgKnMsIGludCBpZHgpOwotaW50IGZmX2hldmNfcmVzX3NjYWxlX3NpZ25fZmxhZyhIRVZDQ29udGV4dCAqcywgaW50IGlkeCk7Ci0KLS8qKgotICogR2V0IHRoZSBudW1iZXIgb2YgY2FuZGlkYXRlIHJlZmVyZW5jZXMgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgotICovCi1pbnQgZmZfaGV2Y19mcmFtZV9uYl9yZWZzKEhFVkNDb250ZXh0ICpzKTsKLQotaW50IGZmX2hldmNfc2V0X25ld19yZWYoSEVWQ0NvbnRleHQgKnMsIEFWRnJhbWUgKipmcmFtZSwgaW50IHBvYyk7Ci0KLS8qKgotICogRmluZCBuZXh0IGZyYW1lIGluIG91dHB1dCBvcmRlciBhbmQgcHV0IGEgcmVmZXJlbmNlIHRvIGl0IGluIGZyYW1lLgotICogQHJldHVybiAxIGlmIGEgZnJhbWUgd2FzIG91dHB1dCwgMCBvdGhlcndpc2UKLSAqLwotaW50IGZmX2hldmNfb3V0cHV0X2ZyYW1lKEhFVkNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50IGZsdXNoKTsKLQotdm9pZCBmZl9oZXZjX2J1bXBfZnJhbWUoSEVWQ0NvbnRleHQgKnMpOwotCi12b2lkIGZmX2hldmNfdW5yZWZfZnJhbWUoSEVWQ0NvbnRleHQgKnMsIEhFVkNGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7Ci0KLXZvaWQgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYlcsIGludCBuUGJIKTsKLXZvaWQgZmZfaGV2Y19sdW1hX212X21lcmdlX21vZGUoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBiVywgaW50IG5QYkgsIGludCBsb2cyX2NiX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJ0X2lkeCwgaW50IG1lcmdlX2lkeCwgTXZGaWVsZCAqbXYpOwotdm9pZCBmZl9oZXZjX2x1bWFfbXZfbXZwX21vZGUoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYlcsIGludCBuUGJILCBpbnQgbG9nMl9jYl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcnRfaWR4LCBpbnQgbWVyZ2VfaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXZGaWVsZCAqbXYsIGludCBtdnBfbHhfZmxhZywgaW50IExYKTsKLXZvaWQgZmZfaGV2Y19zZXRfcVB5KEhFVkNDb250ZXh0ICpzLCBpbnQgeEJhc2UsIGludCB5QmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2NiX3NpemUpOwotdm9pZCBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl90cmFmb19zaXplKTsKLWludCBmZl9oZXZjX2N1X3FwX2RlbHRhX3NpZ25fZmxhZyhIRVZDQ29udGV4dCAqcyk7Ci1pbnQgZmZfaGV2Y19jdV9xcF9kZWx0YV9hYnMoSEVWQ0NvbnRleHQgKnMpOwotaW50IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9mbGFnKEhFVkNDb250ZXh0ICpzKTsKLWludCBmZl9oZXZjX2N1X2Nocm9tYV9xcF9vZmZzZXRfaWR4KEhFVkNDb250ZXh0ICpzKTsKLXZvaWQgZmZfaGV2Y19obHNfZmlsdGVyKEhFVkNDb250ZXh0ICpzLCBpbnQgeCwgaW50IHksIGludCBjdGJfc2l6ZSk7Ci12b2lkIGZmX2hldmNfaGxzX2ZpbHRlcnMoSEVWQ0NvbnRleHQgKnMsIGludCB4X2N0YiwgaW50IHlfY3RiLCBpbnQgY3RiX3NpemUpOwotdm9pZCBmZl9oZXZjX2hsc19yZXNpZHVhbF9jb2RpbmcoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfdHJhZm9fc2l6ZSwgZW51bSBTY2FuVHlwZSBzY2FuX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjX2lkeCk7Ci0KLXZvaWQgZmZfaGV2Y19obHNfbXZkX2NvZGluZyhIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBsb2cyX2NiX3NpemUpOwotCi0KLS8qKgotICogRXh0cmFjdCB0aGUgcmF3ICh1bmVzY2FwZWQpIEhFVkMgYml0c3RyZWFtLgotICovCi1pbnQgZmZfaGV2Y19leHRyYWN0X3Jic3AoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDTkFMICpuYWwpOwotCi0vKioKLSAqIFNwbGl0IGFuIGlucHV0IHBhY2tldCBpbnRvIE5BTCB1bml0cy4KLSAqLwotaW50IGZmX2hldmNfc3BsaXRfcGFja2V0KEhFVkNDb250ZXh0ICpzLCBIRVZDUGFja2V0ICpwa3QsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBpc19uYWxmZiwgaW50IG5hbF9sZW5ndGhfc2l6ZSk7Ci0KLWludCBmZl9oZXZjX2VuY29kZV9uYWxfdnBzKEhFVkNWUFMgKnZwcywgdW5zaWduZWQgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpOwotCi1leHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX3FwZWxfZXh0cmFfYmVmb3JlWzRdOwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19xcGVsX2V4dHJhX2FmdGVyWzRdOwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19xcGVsX2V4dHJhWzRdOwotCi1leHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX2RpYWdfc2NhbjR4NF94WzE2XTsKLWV4dGVybiBjb25zdCB1aW50OF90IGZmX2hldmNfZGlhZ19zY2FuNHg0X3lbMTZdOwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19kaWFnX3NjYW44eDhfeFs2NF07Ci1leHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX2RpYWdfc2Nhbjh4OF95WzY0XTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfSEVWQ19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hldmNfY2FiYWMuYyBiL2xpYmF2Y29kZWMvaGV2Y19jYWJhYy5jCmluZGV4IGQxYmVmODMuLmZhYTM2ZDUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaGV2Y19jYWJhYy5jCisrKyBiL2xpYmF2Y29kZWMvaGV2Y19jYWJhYy5jCkBAIC0yNSwxNCArMjUsMTYgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCiAKICNpbmNsdWRlICJjYWJhY19mdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJoZXZjX2RhdGEuaCIKICNpbmNsdWRlICJoZXZjLmgiCisjaW5jbHVkZSAiaGV2Y2RlYy5oIgogCiAjZGVmaW5lIENBQkFDX01BWF9CSU4gMzEKIAogLyoqCiAgKiBudW1iZXIgb2YgYmluIGJ5IFN5bnRheEVsZW1lbnQuCiAgKi8KLWF2X3VudXNlZCBzdGF0aWMgY29uc3QgaW50OF90IG51bV9iaW5zX2luX3NlW10gPSB7CitzdGF0aWMgY29uc3QgaW50OF90IG51bV9iaW5zX2luX3NlW10gPSB7CiAgICAgIDEsIC8vIHNhb19tZXJnZV9mbGFnCiAgICAgIDEsIC8vIHNhb190eXBlX2lkeAogICAgICAwLCAvLyBzYW9fZW9fY2xhc3MKQEAgLTQ2MCwxNyArNDYyLDE3IEBACiAgICAgbWVtY3B5KHMtPkhFVkNsYy0+Y2FiYWNfc3RhdGUsIHMtPmNhYmFjX3N0YXRlLCBIRVZDX0NPTlRFWFRTKTsKIH0KIAotc3RhdGljIHZvaWQgY2FiYWNfcmVpbml0KEhFVkNMb2NhbENvbnRleHQgKmxjKQorc3RhdGljIGludCBjYWJhY19yZWluaXQoSEVWQ0xvY2FsQ29udGV4dCAqbGMpCiB7Ci0gICAgc2tpcF9ieXRlcygmbGMtPmNjLCAwKTsKKyAgICByZXR1cm4gc2tpcF9ieXRlcygmbGMtPmNjLCAwKSA9PSBOVUxMID8gQVZFUlJPUl9JTlZBTElEREFUQSA6IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNhYmFjX2luaXRfZGVjb2RlcihIRVZDQ29udGV4dCAqcykKK3N0YXRpYyBpbnQgY2FiYWNfaW5pdF9kZWNvZGVyKEhFVkNDb250ZXh0ICpzKQogewogICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CiAgICAgc2tpcF9iaXRzKGdiLCAxKTsKICAgICBhbGlnbl9nZXRfYml0cyhnYik7Ci0gICAgZmZfaW5pdF9jYWJhY19kZWNvZGVyKCZzLT5IRVZDbGMtPmNjLAorICAgIHJldHVybiBmZl9pbml0X2NhYmFjX2RlY29kZXIoJnMtPkhFVkNsYy0+Y2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdiLT5idWZmZXIgKyBnZXRfYml0c19jb3VudChnYikgLyA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0X2JpdHNfbGVmdChnYikgKyA3KSAvIDgpOwogfQpAQCAtNDgwLDcgKzQ4Miw3IEBACiAgICAgaW50IGluaXRfdHlwZSA9IDIgLSBzLT5zaC5zbGljZV90eXBlOwogICAgIGludCBpOwogCi0gICAgaWYgKHMtPnNoLmNhYmFjX2luaXRfZmxhZyAmJiBzLT5zaC5zbGljZV90eXBlICE9IElfU0xJQ0UpCisgICAgaWYgKHMtPnNoLmNhYmFjX2luaXRfZmxhZyAmJiBzLT5zaC5zbGljZV90eXBlICE9IEhFVkNfU0xJQ0VfSSkKICAgICAgICAgaW5pdF90eXBlIF49IDM7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgSEVWQ19DT05URVhUUzsgaSsrKSB7CkBAIC00OTksMTAgKzUwMSwxMiBAQAogICAgICAgICBzLT5IRVZDbGMtPnN0YXRfY29lZmZbaV0gPSAwOwogfQogCi12b2lkIGZmX2hldmNfY2FiYWNfaW5pdChIRVZDQ29udGV4dCAqcywgaW50IGN0Yl9hZGRyX3RzKQoraW50IGZmX2hldmNfY2FiYWNfaW5pdChIRVZDQ29udGV4dCAqcywgaW50IGN0Yl9hZGRyX3RzKQogewogICAgIGlmIChjdGJfYWRkcl90cyA9PSBzLT5wcy5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW3MtPnNoLnNsaWNlX2N0Yl9hZGRyX3JzXSkgewotICAgICAgICBjYWJhY19pbml0X2RlY29kZXIocyk7CisgICAgICAgIGludCByZXQgPSBjYWJhY19pbml0X2RlY29kZXIocyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgaWYgKHMtPnNoLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPT0gMCB8fAogICAgICAgICAgICAgKHMtPnBzLnBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnICYmCiAgICAgICAgICAgICAgcy0+cHMucHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcy5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHMgLSAxXSkpCkBAIC01MjAsMTkgKzUyNCwyNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChzLT5wcy5wcHMtPnRpbGVzX2VuYWJsZWRfZmxhZyAmJgogICAgICAgICAgICAgcy0+cHMucHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcy5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHMgLSAxXSkgeworICAgICAgICAgICAgaW50IHJldDsKICAgICAgICAgICAgIGlmIChzLT50aHJlYWRzX251bWJlciA9PSAxKQotICAgICAgICAgICAgICAgIGNhYmFjX3JlaW5pdChzLT5IRVZDbGMpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGNhYmFjX2luaXRfZGVjb2RlcihzKTsKKyAgICAgICAgICAgICAgICByZXQgPSBjYWJhY19yZWluaXQocy0+SEVWQ2xjKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IGNhYmFjX2luaXRfZGVjb2RlcihzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICBjYWJhY19pbml0X3N0YXRlKHMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChzLT5wcy5wcHMtPmVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnKSB7CiAgICAgICAgICAgICBpZiAoY3RiX2FkZHJfdHMgJSBzLT5wcy5zcHMtPmN0Yl93aWR0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IHJldDsKICAgICAgICAgICAgICAgICBnZXRfY2FiYWNfdGVybWluYXRlKCZzLT5IRVZDbGMtPmNjKTsKICAgICAgICAgICAgICAgICBpZiAocy0+dGhyZWFkc19udW1iZXIgPT0gMSkKLSAgICAgICAgICAgICAgICAgICAgY2FiYWNfcmVpbml0KHMtPkhFVkNsYyk7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBjYWJhY19pbml0X2RlY29kZXIocyk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGNhYmFjX3JlaW5pdChzLT5IRVZDbGMpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBjYWJhY19pbml0X2RlY29kZXIocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgICAgICAgICAgaWYgKHMtPnBzLnNwcy0+Y3RiX3dpZHRoID09IDEpCiAgICAgICAgICAgICAgICAgICAgIGNhYmFjX2luaXRfc3RhdGUocyk7CkBAIC01NDEsNiArNTUzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogI2RlZmluZSBHRVRfQ0FCQUMoY3R4KSBnZXRfY2FiYWMoJnMtPkhFVkNsYy0+Y2MsICZzLT5IRVZDbGMtPmNhYmFjX3N0YXRlW2N0eF0pCkBAIC02MzMsOCArNjQ2LDEwIEBACiAgICAgICAgICAgICBzdWZmaXhfdmFsICs9IDEgPDwgazsKICAgICAgICAgICAgIGsrKzsKICAgICAgICAgfQotICAgICAgICBpZiAoayA9PSBDQUJBQ19NQVhfQklOKQorICAgICAgICBpZiAoayA9PSBDQUJBQ19NQVhfQklOKSB7CiAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNBQkFDX01BWF9CSU4gOiAlZFxuIiwgayk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogCiAgICAgICAgIHdoaWxlIChrLS0pCiAgICAgICAgICAgICBzdWZmaXhfdmFsICs9IGdldF9jYWJhY19ieXBhc3MoJnMtPkhFVkNsYy0+Y2MpIDw8IGs7CkBAIC05NzUsMTYgKzk5MCwxOSBAQAogCiAgICAgd2hpbGUgKHByZWZpeCA8IENBQkFDX01BWF9CSU4gJiYgZ2V0X2NhYmFjX2J5cGFzcygmcy0+SEVWQ2xjLT5jYykpCiAgICAgICAgIHByZWZpeCsrOwotICAgIGlmIChwcmVmaXggPT0gQ0FCQUNfTUFYX0JJTikgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNBQkFDX01BWF9CSU4gOiAlZFxuIiwgcHJlZml4KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorCiAgICAgaWYgKHByZWZpeCA8IDMpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJjX3JpY2VfcGFyYW07IGkrKykKICAgICAgICAgICAgIHN1ZmZpeCA9IChzdWZmaXggPDwgMSkgfCBnZXRfY2FiYWNfYnlwYXNzKCZzLT5IRVZDbGMtPmNjKTsKICAgICAgICAgbGFzdF9jb2VmZl9hYnNfbGV2ZWxfcmVtYWluaW5nID0gKHByZWZpeCA8PCByY19yaWNlX3BhcmFtKSArIHN1ZmZpeDsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgcHJlZml4X21pbnVzMyA9IHByZWZpeCAtIDM7CisKKyAgICAgICAgaWYgKHByZWZpeCA9PSBDQUJBQ19NQVhfQklOIHx8IHByZWZpeF9taW51czMgKyByY19yaWNlX3BhcmFtID49IDMxKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNBQkFDX01BWF9CSU4gOiAlZFxuIiwgcHJlZml4KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHByZWZpeF9taW51czMgKyByY19yaWNlX3BhcmFtOyBpKyspCiAgICAgICAgICAgICBzdWZmaXggPSAoc3VmZml4IDw8IDEpIHwgZ2V0X2NhYmFjX2J5cGFzcygmcy0+SEVWQ2xjLT5jYyk7CiAgICAgICAgIGxhc3RfY29lZmZfYWJzX2xldmVsX3JlbWFpbmluZyA9ICgoKDEgPDwgcHJlZml4X21pbnVzMykgKyAzIC0gMSkKQEAgLTEwMzksNyArMTA1Nyw3IEBACiAgICAgaW50IHRyYWZvX3NpemUgPSAxIDw8IGxvZzJfdHJhZm9fc2l6ZTsKICAgICBpbnQgaTsKICAgICBpbnQgcXAsc2hpZnQsYWRkLHNjYWxlLHNjYWxlX207Ci0gICAgY29uc3QgdWludDhfdCBsZXZlbF9zY2FsZVtdID0geyA0MCwgNDUsIDUxLCA1NywgNjQsIDcyIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbGV2ZWxfc2NhbGVbXSA9IHsgNDAsIDQ1LCA1MSwgNTcsIDY0LCA3MiB9OwogICAgIGNvbnN0IHVpbnQ4X3QgKnNjYWxlX21hdHJpeCA9IE5VTEw7CiAgICAgdWludDhfdCBkY19zY2FsZTsKICAgICBpbnQgcHJlZF9tb2RlX2ludHJhID0gKGNfaWR4ID09IDApID8gbGMtPnR1LmludHJhX3ByZWRfbW9kZSA6CkBAIC0xNDc2LDcgKzE0OTQsNyBAQAogICAgICAgICAgICAgICAgICAgICBGRlNXQVAoaW50MTZfdCwgY29lZmZzW2ldLCBjb2VmZnNbMTYgLSBpIC0gMV0pOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzLT5oZXZjZHNwLnRyYW5zZm9ybV9za2lwKGNvZWZmcywgbG9nMl90cmFmb19zaXplKTsKKyAgICAgICAgICAgIHMtPmhldmNkc3AuZGVxdWFudChjb2VmZnMsIGxvZzJfdHJhZm9fc2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChleHBsaWNpdF9yZHBjbV9mbGFnIHx8IChzLT5wcy5zcHMtPmltcGxpY2l0X3JkcGNtX2VuYWJsZWRfZmxhZyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSAmJgpAQCAtMTQ4NiwxMSArMTUwNCwxMSBAQAogICAgICAgICAgICAgICAgIHMtPmhldmNkc3AudHJhbnNmb3JtX3JkcGNtKGNvZWZmcywgbG9nMl90cmFmb19zaXplLCBtb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5UUkEgJiYgY19pZHggPT0gMCAmJiBsb2cyX3RyYWZvX3NpemUgPT0gMikgewotICAgICAgICAgICAgcy0+aGV2Y2RzcC5pZGN0XzR4NF9sdW1hKGNvZWZmcyk7CisgICAgICAgICAgICBzLT5oZXZjZHNwLnRyYW5zZm9ybV80eDRfbHVtYShjb2VmZnMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaW50IG1heF94eSA9IEZGTUFYKGxhc3Rfc2lnbmlmaWNhbnRfY29lZmZfeCwgbGFzdF9zaWduaWZpY2FudF9jb2VmZl95KTsKICAgICAgICAgICAgIGlmIChtYXhfeHkgPT0gMCkKLSAgICAgICAgICAgICAgICBzLT5oZXZjZHNwLmlkY3RfZGNbbG9nMl90cmFmb19zaXplLTJdKGNvZWZmcyk7CisgICAgICAgICAgICAgICAgcy0+aGV2Y2RzcC5pZGN0X2RjW2xvZzJfdHJhZm9fc2l6ZSAtIDJdKGNvZWZmcyk7CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpbnQgY29sX2xpbWl0ID0gbGFzdF9zaWduaWZpY2FudF9jb2VmZl94ICsgbGFzdF9zaWduaWZpY2FudF9jb2VmZl95ICsgNDsKICAgICAgICAgICAgICAgICBpZiAobWF4X3h5IDwgNCkKQEAgLTE0OTksNyArMTUxNyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbF9saW1pdCA9IEZGTUlOKDgsIGNvbF9saW1pdCk7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWF4X3h5IDwgMTIpCiAgICAgICAgICAgICAgICAgICAgIGNvbF9saW1pdCA9IEZGTUlOKDI0LCBjb2xfbGltaXQpOwotICAgICAgICAgICAgICAgIHMtPmhldmNkc3AuaWRjdFtsb2cyX3RyYWZvX3NpemUtMl0oY29lZmZzLCBjb2xfbGltaXQpOworICAgICAgICAgICAgICAgIHMtPmhldmNkc3AuaWRjdFtsb2cyX3RyYWZvX3NpemUgLSAyXShjb2VmZnMsIGNvbF9saW1pdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTEwLDcgKzE1MjgsNyBAQAogICAgICAgICAgICAgY29lZmZzW2ldID0gY29lZmZzW2ldICsgKChsYy0+dHUucmVzX3NjYWxlX3ZhbCAqIGNvZWZmc195W2ldKSA+PiAzKTsKICAgICAgICAgfQogICAgIH0KLSAgICBzLT5oZXZjZHNwLnRyYW5zZm9ybV9hZGRbbG9nMl90cmFmb19zaXplLTJdKGRzdCwgY29lZmZzLCBzdHJpZGUpOworICAgIHMtPmhldmNkc3AuYWRkX3Jlc2lkdWFsW2xvZzJfdHJhZm9fc2l6ZS0yXShkc3QsIGNvZWZmcywgc3RyaWRlKTsKIH0KIAogdm9pZCBmZl9oZXZjX2hsc19tdmRfY29kaW5nKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwgaW50IGxvZzJfY2Jfc2l6ZSkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y19kYXRhLmMgYi9saWJhdmNvZGVjL2hldmNfZGF0YS5jCmluZGV4IGY3NGYyNzIuLjE2MzNhNDEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaGV2Y19kYXRhLmMKKysrIGIvbGliYXZjb2RlYy9oZXZjX2RhdGEuYwpAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLSNpbmNsdWRlICJoZXZjLmgiCisjaW5jbHVkZSAiaGV2Y19kYXRhLmgiCiAKIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19kaWFnX3NjYW40eDRfeFsxNl0gPSB7CiAgICAgMCwgMCwgMSwgMCwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y19kYXRhLmggYi9saWJhdmNvZGVjL2hldmNfZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTU4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2hldmNfZGF0YS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBIRVZDIHNoYXJlZCBkYXRhIHRhYmxlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSEVWQ19EQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19IRVZDX0RBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2hldmNfZGlhZ19zY2FuNHg0X3hbMTZdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19kaWFnX3NjYW40eDRfeVsxNl07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX2RpYWdfc2Nhbjh4OF94WzY0XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2hldmNfZGlhZ19zY2FuOHg4X3lbNjRdOworCisjZW5kaWYgLyogQVZDT0RFQ19IRVZDX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oZXZjX2ZpbHRlci5jIGIvbGliYXZjb2RlYy9oZXZjX2ZpbHRlci5jCmluZGV4IDFmMzNiMGMuLjZiOTgyNDAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaGV2Y19maWx0ZXIuYworKysgYi9saWJhdmNvZGVjL2hldmNfZmlsdGVyLmMKQEAgLTI2LDggKzI2LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKIAogI2luY2x1ZGUgImNhYmFjX2Z1bmN0aW9ucy5oIgotI2luY2x1ZGUgImdvbG9tYi5oIgotI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJoZXZjZGVjLmgiCiAKICNpbmNsdWRlICJiaXRfZGVwdGhfdGVtcGxhdGUuYyIKIApAQCAtMTQwLDcgKzEzOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGNvcHlfQ1RCKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBzdHJpZGVfZHN0LCBpbnRwdHJfdCBzdHJpZGVfc3JjKQorICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZV9kc3QsIHB0cmRpZmZfdCBzdHJpZGVfc3JjKQogewogaW50IGksIGo7CiAKQEAgLTE3MSw3ICsxNzAsNyBAQAogCiBzdGF0aWMgdm9pZCBjb3B5X3ZlcnQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3NoaWZ0LCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGVfZHN0LCBpbnQgc3RyaWRlX3NyYykKKyAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlX2RzdCwgcHRyZGlmZl90IHN0cmlkZV9zcmMpCiB7CiAgICAgaW50IGk7CiAgICAgaWYgKHBpeGVsX3NoaWZ0ID09IDApIHsKQEAgLTE5MCw3ICsxODksNyBAQAogfQogCiBzdGF0aWMgdm9pZCBjb3B5X0NUQl90b19odihIRVZDQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZV9zcmMsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZV9zcmMsIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNfaWR4LCBpbnQgeF9jdGIsIGludCB5X2N0YikKIHsKICAgICBpbnQgc2ggPSBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0OwpAQCAtMzA3LDE0ICszMDYsMTQgQEAKICAgICBmb3IgKGNfaWR4ID0gMDsgY19pZHggPCAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA/IDMgOiAxKTsgY19pZHgrKykgewogICAgICAgICBpbnQgeDAgICAgICAgPSB4ID4+IHMtPnBzLnNwcy0+aHNoaWZ0W2NfaWR4XTsKICAgICAgICAgaW50IHkwICAgICAgID0geSA+PiBzLT5wcy5zcHMtPnZzaGlmdFtjX2lkeF07Ci0gICAgICAgIGludCBzdHJpZGVfc3JjID0gcy0+ZnJhbWUtPmxpbmVzaXplW2NfaWR4XTsKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZV9zcmMgPSBzLT5mcmFtZS0+bGluZXNpemVbY19pZHhdOwogICAgICAgICBpbnQgY3RiX3NpemVfaCA9ICgxIDw8IChzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUpKSA+PiBzLT5wcy5zcHMtPmhzaGlmdFtjX2lkeF07CiAgICAgICAgIGludCBjdGJfc2l6ZV92ID0gKDEgPDwgKHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSkpID4+IHMtPnBzLnNwcy0+dnNoaWZ0W2NfaWR4XTsKICAgICAgICAgaW50IHdpZHRoICAgID0gRkZNSU4oY3RiX3NpemVfaCwgKHMtPnBzLnNwcy0+d2lkdGggID4+IHMtPnBzLnNwcy0+aHNoaWZ0W2NfaWR4XSkgLSB4MCk7CiAgICAgICAgIGludCBoZWlnaHQgICA9IEZGTUlOKGN0Yl9zaXplX3YsIChzLT5wcy5zcHMtPmhlaWdodCA+PiBzLT5wcy5zcHMtPnZzaGlmdFtjX2lkeF0pIC0geTApOwogICAgICAgICBpbnQgdGFiICAgICAgPSBzYW9fdGFiWyhGRkFMSUdOKHdpZHRoLCA4KSA+PiAzKSAtIDFdOwogICAgICAgICB1aW50OF90ICpzcmMgPSAmcy0+ZnJhbWUtPmRhdGFbY19pZHhdW3kwICogc3RyaWRlX3NyYyArICh4MCA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KV07Ci0gICAgICAgIGludCBzdHJpZGVfZHN0OworICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlX2RzdDsKICAgICAgICAgdWludDhfdCAqZHN0OwogCiAgICAgICAgIHN3aXRjaCAoc2FvLT50eXBlX2lkeFtjX2lkeF0pIHsKQEAgLTQ3MSw3ICs0NzAsNyBAQAogCiAjZGVmaW5lIFRDX0NBTEMocXAsIGJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgdGN0YWJsZVthdl9jbGlwKChxcCkgKyBERUZBVUxUX0lOVFJBX1RDX09GRlNFVCAqICgoYnMpIC0gMSkgKyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICh0Y19vZmZzZXQgPj4gMSA8PCAxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICh0Y19vZmZzZXQgJiAtMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgIDAsIE1BWF9RUCArIERFRkFVTFRfSU5UUkFfVENfT0ZGU0VUKV0KIAogc3RhdGljIHZvaWQgZGVibG9ja2luZ19maWx0ZXJfQ1RCKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCkKQEAgLTg0Myw5ICs4NDIsMjAgQEAKIHZvaWQgZmZfaGV2Y19obHNfZmlsdGVyKEhFVkNDb250ZXh0ICpzLCBpbnQgeCwgaW50IHksIGludCBjdGJfc2l6ZSkKIHsKICAgICBpbnQgeF9lbmQgPSB4ID49IHMtPnBzLnNwcy0+d2lkdGggIC0gY3RiX3NpemU7Ci0gICAgaWYgKHMtPmF2Y3R4LT5za2lwX2xvb3BfZmlsdGVyIDwgQVZESVNDQVJEX0FMTCkKKyAgICBpbnQgc2tpcCA9IDA7CisgICAgaWYgKHMtPmF2Y3R4LT5za2lwX2xvb3BfZmlsdGVyID49IEFWRElTQ0FSRF9BTEwgfHwKKyAgICAgICAgKHMtPmF2Y3R4LT5za2lwX2xvb3BfZmlsdGVyID49IEFWRElTQ0FSRF9OT05LRVkgJiYgIUlTX0lEUihzKSkgfHwKKyAgICAgICAgKHMtPmF2Y3R4LT5za2lwX2xvb3BfZmlsdGVyID49IEFWRElTQ0FSRF9OT05JTlRSQSAmJgorICAgICAgICAgcy0+c2guc2xpY2VfdHlwZSAhPSBIRVZDX1NMSUNFX0kpIHx8CisgICAgICAgIChzLT5hdmN0eC0+c2tpcF9sb29wX2ZpbHRlciA+PSBBVkRJU0NBUkRfQklESVIgJiYKKyAgICAgICAgIHMtPnNoLnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CKSB8fAorICAgICAgICAocy0+YXZjdHgtPnNraXBfbG9vcF9maWx0ZXIgPj0gQVZESVNDQVJEX05PTlJFRiAmJgorICAgICAgICBmZl9oZXZjX25hbF9pc19ub25yZWYocy0+bmFsX3VuaXRfdHlwZSkpKQorICAgICAgICBza2lwID0gMTsKKworICAgIGlmICghc2tpcCkKICAgICAgICAgZGVibG9ja2luZ19maWx0ZXJfQ1RCKHMsIHgsIHkpOwotICAgIGlmIChzLT5wcy5zcHMtPnNhb19lbmFibGVkKSB7CisgICAgaWYgKHMtPnBzLnNwcy0+c2FvX2VuYWJsZWQgJiYgIXNraXApIHsKICAgICAgICAgaW50IHlfZW5kID0geSA+PSBzLT5wcy5zcHMtPmhlaWdodCAtIGN0Yl9zaXplOwogICAgICAgICBpZiAoeSAmJiB4KQogICAgICAgICAgICAgc2FvX2ZpbHRlcl9DVEIocywgeCAtIGN0Yl9zaXplLCB5IC0gY3RiX3NpemUpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oZXZjX21wNHRvYW5uZXhiX2JzZi5jIGIvbGliYXZjb2RlYy9oZXZjX21wNHRvYW5uZXhiX2JzZi5jCmluZGV4IGQ2ZmViOTkuLjA5YmNlNWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaGV2Y19tcDR0b2FubmV4Yl9ic2YuYworKysgYi9saWJhdmNvZGVjL2hldmNfbXA0dG9hbm5leGJfYnNmLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgImhldmMuaCIKIApAQCAtMzMsMjMgKzM0LDkgQEAKIHR5cGVkZWYgc3RydWN0IEhFVkNCU0ZDb250ZXh0IHsKICAgICB1aW50OF90ICBsZW5ndGhfc2l6ZTsKICAgICBpbnQgICAgICBleHRyYWRhdGFfcGFyc2VkOwotCi0gICAgaW50IGxvZ2dlZF9ub25tcDRfd2FybmluZzsKLQotICAgIC8qIFdoZW4gcHJpdmF0ZV9zcHNwcHMgaXMgemVybyB0aGVuIHNwc3Bwc19idWYgcG9pbnRzIHRvIGdsb2JhbCBleHRyYWRhdGEKLSAgICAgICBhbmQgYnNmIGRvZXMgcmVwbGFjZSBhIGdsb2JhbCBleHRyYWRhdGEgdG8gb3duLWFsbG9jYXRlZCB2ZXJzaW9uIChkZWZhdWx0Ci0gICAgICAgYmVoYXZpb3VyKS4KLSAgICAgICBXaGVuIHByaXZhdGVfc3BzcHBzIGlzIG5vbi16ZXJvIHRoZSBic2YgdXNlcyBhIHByaXZhdGUgdmVyc2lvbiBvZiBzcHNwcHMgYnVmLgotICAgICAgIFRoaXMgbW9kZSBuZWNlc3Nhcnkgd2hlbiBic2YgdXNlcyBpbiBkZWNvZGVyLCBlbHNlIGJzZiBoYXMgaXNzdWVzIGFmdGVyCi0gICAgICAgZGVjb2RlciByZS1pbml0aWFsaXphdGlvbi4gVXNlIHRoZSAicHJpdmF0ZV9zcHNwcHNfYnVmIiBhcmd1bWVudCB0bwotICAgICAgIGFjdGl2YXRlIHRoaXMgbW9kZS4KLSAgICAgKi8KLSAgICBpbnQgICAgICBwcml2YXRlX3Nwc3BwczsKLSAgICB1aW50OF90ICpzcHNwcHNfYnVmOwotICAgIHVpbnQzMl90IHNwc3Bwc19zaXplOwogfSBIRVZDQlNGQ29udGV4dDsKIAotc3RhdGljIGludCBoZXZjX2V4dHJhZGF0YV90b19hbm5leGIoSEVWQ0JTRkNvbnRleHQqIGN0eCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQorc3RhdGljIGludCBoZXZjX2V4dHJhZGF0YV90b19hbm5leGIoQVZCU0ZDb250ZXh0ICpjdHgpCiB7CiAgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CiAgICAgaW50IGxlbmd0aF9zaXplLCBudW1fYXJyYXlzLCBpLCBqOwpAQCAtNTgsNyArNDUsNyBAQAogICAgIHVpbnQ4X3QgKm5ld19leHRyYWRhdGEgPSBOVUxMOwogICAgIHNpemVfdCAgIG5ld19leHRyYWRhdGFfc2l6ZSA9IDA7CiAKLSAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgY3R4LT5wYXJfaW4tPmV4dHJhZGF0YSwgY3R4LT5wYXJfaW4tPmV4dHJhZGF0YV9zaXplKTsKIAogICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAyMSk7CiAgICAgbGVuZ3RoX3NpemUgPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAmIDMpICsgMTsKQEAgLTY4LDkgKzU1LDkgQEAKICAgICAgICAgaW50IHR5cGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpICYgMHgzZjsKICAgICAgICAgaW50IGNudCAgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOwogCi0gICAgICAgIGlmICghKHR5cGUgPT0gTkFMX1ZQUyB8fCB0eXBlID09IE5BTF9TUFMgfHwgdHlwZSA9PSBOQUxfUFBTIHx8Ci0gICAgICAgICAgICAgIHR5cGUgPT0gTkFMX1NFSV9QUkVGSVggfHwgdHlwZSA9PSBOQUxfU0VJX1NVRkZJWCkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBOQUwgdW5pdCB0eXBlIGluIGV4dHJhZGF0YTogJWRcbiIsCisgICAgICAgIGlmICghKHR5cGUgPT0gSEVWQ19OQUxfVlBTIHx8IHR5cGUgPT0gSEVWQ19OQUxfU1BTIHx8IHR5cGUgPT0gSEVWQ19OQUxfUFBTIHx8CisgICAgICAgICAgICAgIHR5cGUgPT0gSEVWQ19OQUxfU0VJX1BSRUZJWCB8fCB0eXBlID09IEhFVkNfTkFMX1NFSV9TVUZGSVgpKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIE5BTCB1bml0IHR5cGUgaW4gZXh0cmFkYXRhOiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICB0eXBlKTsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CkBAIC05NCwxNiArODEsMTIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghY3R4LT5wcml2YXRlX3Nwc3BwcykgewotICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7Ci0gICAgICAgIGF2Y3R4LT5leHRyYWRhdGEgICAgICA9IG5ld19leHRyYWRhdGE7Ci0gICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IG5ld19leHRyYWRhdGFfc2l6ZTsKLSAgICB9Ci0gICAgY3R4LT5zcHNwcHNfYnVmICA9IG5ld19leHRyYWRhdGE7Ci0gICAgY3R4LT5zcHNwcHNfc2l6ZSA9IG5ld19leHRyYWRhdGFfc2l6ZTsKKyAgICBhdl9mcmVlcCgmY3R4LT5wYXJfb3V0LT5leHRyYWRhdGEpOworICAgIGN0eC0+cGFyX291dC0+ZXh0cmFkYXRhICAgICAgPSBuZXdfZXh0cmFkYXRhOworICAgIGN0eC0+cGFyX291dC0+ZXh0cmFkYXRhX3NpemUgPSBuZXdfZXh0cmFkYXRhX3NpemU7CiAKICAgICBpZiAoIW5ld19leHRyYWRhdGFfc2l6ZSkKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIk5vIHBhcmFtZXRlciBzZXRzIGluIHRoZSBleHRyYWRhdGFcbiIpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIk5vIHBhcmFtZXRlciBzZXRzIGluIHRoZSBleHRyYWRhdGFcbiIpOwogCiAgICAgcmV0dXJuIGxlbmd0aF9zaXplOwogZmFpbDoKQEAgLTExMSw1NCArOTQsNTQgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGhldmNfbXA0dG9hbm5leGJfZmlsdGVyKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5ZnJhbWUpCitzdGF0aWMgaW50IGhldmNfbXA0dG9hbm5leGJfaW5pdChBVkJTRkNvbnRleHQgKmN0eCkKIHsKLSAgICBIRVZDQlNGQ29udGV4dCAqY3R4ID0gYnNmYy0+cHJpdl9kYXRhOworICAgIEhFVkNCU0ZDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhX3NpemUgPCBNSU5fSEVWQ0NfTEVOR1RIIHx8CisgICAgICAgIEFWX1JCMjQoY3R4LT5wYXJfaW4tPmV4dHJhZGF0YSkgPT0gMSAgICAgICAgICAgfHwKKyAgICAgICAgQVZfUkIzMihjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhKSA9PSAxKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgIlRoZSBpbnB1dCBsb29rcyBsaWtlIGl0IGlzIEFubmV4IEIgYWxyZWFkeVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gaGV2Y19leHRyYWRhdGFfdG9fYW5uZXhiKGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcy0+bGVuZ3RoX3NpemUgICAgICA9IHJldDsKKyAgICAgICAgcy0+ZXh0cmFkYXRhX3BhcnNlZCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19tcDR0b2FubmV4Yl9maWx0ZXIoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpvdXQpCit7CisgICAgSEVWQ0JTRkNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBBVlBhY2tldCAqaW47CiAgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CiAKLSAgICB1aW50OF90ICpvdXQgPSBOVUxMOwotICAgIHNpemVfdCAgIG91dF9zaXplID0gMDsKICAgICBpbnQgZ290X2lyYXAgPSAwOwogICAgIGludCBpLCByZXQgPSAwOwogCi0gICAgaWYgKCFjdHgtPmV4dHJhZGF0YV9wYXJzZWQpIHsKLSAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IE1JTl9IRVZDQ19MRU5HVEggfHwKLSAgICAgICAgICAgIEFWX1JCMjQoYXZjdHgtPmV4dHJhZGF0YSkgPT0gMSAgICAgICAgICAgfHwKLSAgICAgICAgICAgIEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSkgPT0gMSkgewotICAgICAgICAgICAgaWYgKCFjdHgtPmxvZ2dlZF9ub25tcDRfd2FybmluZykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICJUaGUgaW5wdXQgbG9va3MgbGlrZSBpdCBpcyBBbm5leCBCIGFscmVhZHlcbiIpOwotICAgICAgICAgICAgICAgIGN0eC0+bG9nZ2VkX25vbm1wNF93YXJuaW5nID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpwb3V0YnVmICAgICAgPSAodWludDhfdCAqKWJ1ZjsKLSAgICAgICAgICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhcmdzICYmIHN0cnN0cihhcmdzLCAicHJpdmF0ZV9zcHNwcHNfYnVmIikpCi0gICAgICAgICAgICBjdHgtPnByaXZhdGVfc3BzcHBzID0gMTsKKyAgICByZXQgPSBmZl9ic2ZfZ2V0X3BhY2tldChjdHgsICZpbik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICAgICAgcmV0ID0gaGV2Y19leHRyYWRhdGFfdG9fYW5uZXhiKGN0eCwgYXZjdHgpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGN0eC0+bGVuZ3RoX3NpemUgICAgICA9IHJldDsKLSAgICAgICAgY3R4LT5leHRyYWRhdGFfcGFyc2VkID0gMTsKKyAgICBpZiAoIXMtPmV4dHJhZGF0YV9wYXJzZWQpIHsKKyAgICAgICAgYXZfcGFja2V0X21vdmVfcmVmKG91dCwgaW4pOworICAgICAgICBhdl9wYWNrZXRfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICAqcG91dGJ1Zl9zaXplID0gMDsKLSAgICAqcG91dGJ1ZiAgICAgID0gTlVMTDsKLQotICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgaW4tPmRhdGEsIGluLT5zaXplKTsKIAogICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpKSB7CiAgICAgICAgIHVpbnQzMl90IG5hbHVfc2l6ZSA9IDA7CiAgICAgICAgIGludCAgICAgIG5hbHVfdHlwZTsKLSAgICAgICAgaW50IGlzX2lyYXAsIGFkZF9leHRyYWRhdGEsIGV4dHJhX3NpemU7CisgICAgICAgIGludCBpc19pcmFwLCBhZGRfZXh0cmFkYXRhLCBleHRyYV9zaXplLCBwcmV2X3NpemU7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bGVuZ3RoX3NpemU7IGkrKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmxlbmd0aF9zaXplOyBpKyspCiAgICAgICAgICAgICBuYWx1X3NpemUgPSAobmFsdV9zaXplIDw8IDgpIHwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKIAogICAgICAgICBuYWx1X3R5cGUgPSAoYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZnYikgPj4gMSkgJiAweDNmOwpAQCAtMTY2LDQ3ICsxNDksNDcgQEAKICAgICAgICAgLyogcHJlcGVuZCBleHRyYWRhdGEgdG8gSVJBUCBmcmFtZXMgKi8KICAgICAgICAgaXNfaXJhcCAgICAgICA9IG5hbHVfdHlwZSA+PSAxNiAmJiBuYWx1X3R5cGUgPD0gMjM7CiAgICAgICAgIGFkZF9leHRyYWRhdGEgPSBpc19pcmFwICYmICFnb3RfaXJhcDsKLSAgICAgICAgZXh0cmFfc2l6ZSAgICA9IGFkZF9leHRyYWRhdGEgKiBjdHgtPnNwc3Bwc19zaXplOworICAgICAgICBleHRyYV9zaXplICAgID0gYWRkX2V4dHJhZGF0YSAqIGN0eC0+cGFyX291dC0+ZXh0cmFkYXRhX3NpemU7CiAgICAgICAgIGdvdF9pcmFwICAgICB8PSBpc19pcmFwOwogCi0gICAgICAgIGlmIChTSVpFX01BWCAtIG91dF9zaXplIDwgNCAgICAgICAgICAgICB8fAotICAgICAgICAgICAgU0laRV9NQVggLSBvdXRfc2l6ZSAtIDQgPCBuYWx1X3NpemUgfHwKLSAgICAgICAgICAgIFNJWkVfTUFYIC0gb3V0X3NpemUgLSA0IC0gbmFsdV9zaXplIDwgZXh0cmFfc2l6ZSkgeworICAgICAgICBpZiAoU0laRV9NQVggLSBuYWx1X3NpemUgPCA0IHx8CisgICAgICAgICAgICBTSVpFX01BWCAtIDQgLSBuYWx1X3NpemUgPCBleHRyYV9zaXplKSB7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0ID0gYXZfcmVhbGxvY3AoJm91dCwgb3V0X3NpemUgKyA0ICsgbmFsdV9zaXplICsgZXh0cmFfc2l6ZSk7CisgICAgICAgIHByZXZfc2l6ZSA9IG91dC0+c2l6ZTsKKworICAgICAgICByZXQgPSBhdl9ncm93X3BhY2tldChvdXQsIDQgKyBuYWx1X3NpemUgKyBleHRyYV9zaXplKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAKICAgICAgICAgaWYgKGFkZF9leHRyYWRhdGEpCi0gICAgICAgICAgICBtZW1jcHkob3V0ICsgb3V0X3NpemUsIGN0eC0+c3BzcHBzX2J1ZiwgZXh0cmFfc2l6ZSk7Ci0gICAgICAgIEFWX1dCMzIob3V0ICsgb3V0X3NpemUgKyBleHRyYV9zaXplLCAxKTsKLSAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmZ2IsIG91dCArIG91dF9zaXplICsgNCArIGV4dHJhX3NpemUsIG5hbHVfc2l6ZSk7Ci0gICAgICAgIG91dF9zaXplICs9IDQgKyBuYWx1X3NpemUgKyBleHRyYV9zaXplOworICAgICAgICAgICAgbWVtY3B5KG91dC0+ZGF0YSArIHByZXZfc2l6ZSwgY3R4LT5wYXJfb3V0LT5leHRyYWRhdGEsIGV4dHJhX3NpemUpOworICAgICAgICBBVl9XQjMyKG91dC0+ZGF0YSArIHByZXZfc2l6ZSArIGV4dHJhX3NpemUsIDEpOworICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgb3V0LT5kYXRhICsgcHJldl9zaXplICsgNCArIGV4dHJhX3NpemUsIG5hbHVfc2l6ZSk7CiAgICAgfQogCi0gICAgKnBvdXRidWYgICAgICA9IG91dDsKLSAgICAqcG91dGJ1Zl9zaXplID0gb3V0X3NpemU7Ci0KLSAgICByZXR1cm4gMTsKKyAgICByZXQgPSBhdl9wYWNrZXRfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOwogCiBmYWlsOgotICAgIGF2X2ZyZWVwKCZvdXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYob3V0KTsKKyAgICBhdl9wYWNrZXRfZnJlZSgmaW4pOworCiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgaGV2Y19tcDR0b2FubmV4Yl9jbG9zZShBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMpCi17Ci0gICAgSEVWQ0JTRkNvbnRleHQgKmN0eCA9IGJzZmMtPnByaXZfZGF0YTsKLSAgICBpZiAoY3R4LT5wcml2YXRlX3Nwc3BwcykKLSAgICAgICAgYXZfZnJlZXAoJmN0eC0+c3BzcHBzX2J1Zik7Ci19CitzdGF0aWMgY29uc3QgZW51bSBBVkNvZGVjSUQgY29kZWNfaWRzW10gPSB7CisgICAgQVZfQ09ERUNfSURfSEVWQywgQVZfQ09ERUNfSURfTk9ORSwKK307CiAKLUFWQml0U3RyZWFtRmlsdGVyIGZmX2hldmNfbXA0dG9hbm5leGJfYnNmID0gewotICAgICJoZXZjX21wNHRvYW5uZXhiIiwKLSAgICBzaXplb2YoSEVWQ0JTRkNvbnRleHQpLAotICAgIGhldmNfbXA0dG9hbm5leGJfZmlsdGVyLAotICAgIGhldmNfbXA0dG9hbm5leGJfY2xvc2UsCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9oZXZjX21wNHRvYW5uZXhiX2JzZiA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaGV2Y19tcDR0b2FubmV4YiIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEhFVkNCU0ZDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBoZXZjX21wNHRvYW5uZXhiX2luaXQsCisgICAgLmZpbHRlciAgICAgICAgID0gaGV2Y19tcDR0b2FubmV4Yl9maWx0ZXIsCisgICAgLmNvZGVjX2lkcyAgICAgID0gY29kZWNfaWRzLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y19tdnMuYyBiL2xpYmF2Y29kZWMvaGV2Y19tdnMuYwppbmRleCAwMGRhNTc1Li5mZDBkYmQ5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hldmNfbXZzLmMKKysrIGIvbGliYXZjb2RlYy9oZXZjX212cy5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KIAogI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJoZXZjZGVjLmgiCiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGwwX2wxX2NhbmRfaWR4WzEyXVsyXSA9IHsKICAgICB7IDAsIDEsIH0sCkBAIC04MSw3ICs4Miw3IEBACiAgICAgfQogfQogCi0vL2NoZWNrIGlmIHRoZSB0d28gbHVtYSBsb2NhdGlvbnMgYmVsb25nIHRvIHRoZSBzYW1lIG1vc3Rpb24gZXN0aW1hdGlvbiByZWdpb24KKy8vY2hlY2sgaWYgdGhlIHR3byBsdW1hIGxvY2F0aW9ucyBiZWxvbmcgdG8gdGhlIHNhbWUgbW90aW9uIGVzdGltYXRpb24gcmVnaW9uCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNfZGlmZl9tZXIoSEVWQ0NvbnRleHQgKnMsIGludCB4TiwgaW50IHlOLCBpbnQgeFAsIGludCB5UCkKIHsKICAgICB1aW50OF90IHBsZXZlbCA9IHMtPnBzLnBwcy0+bG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbDsKQEAgLTMxNSw3ICszMTYsNyBAQAogICAgIGNvbnN0IGludCB4QjIgICAgPSB4MCAtIDE7CiAgICAgY29uc3QgaW50IHlCMiAgICA9IHkwIC0gMTsKIAotICAgIGNvbnN0IGludCBuYl9yZWZzID0gKHMtPnNoLnNsaWNlX3R5cGUgPT0gUF9TTElDRSkgPworICAgIGNvbnN0IGludCBuYl9yZWZzID0gKHMtPnNoLnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9QKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5uYl9yZWZzWzBdIDogRkZNSU4ocy0+c2gubmJfcmVmc1swXSwgcy0+c2gubmJfcmVmc1sxXSk7CiAKICAgICBpbnQgemVyb19pZHggPSAwOwpAQCAtNDExLDcgKzQxMiw3IEBACiAgICAgICAgIE12IG12X2wwX2NvbCA9IHsgMCB9LCBtdl9sMV9jb2wgPSB7IDAgfTsKICAgICAgICAgaW50IGF2YWlsYWJsZV9sMCA9IHRlbXBvcmFsX2x1bWFfbW90aW9uX3ZlY3RvcihzLCB4MCwgeTAsIG5QYlcsIG5QYkgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJm12X2wwX2NvbCwgMCk7Ci0gICAgICAgIGludCBhdmFpbGFibGVfbDEgPSAocy0+c2guc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSA/CisgICAgICAgIGludCBhdmFpbGFibGVfbDEgPSAocy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFsX2x1bWFfbW90aW9uX3ZlY3RvcihzLCB4MCwgeTAsIG5QYlcsIG5QYkgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJm12X2wxX2NvbCwgMSkgOiAwOwogCkBAIC00MzAsNyArNDMxLDcgQEAKICAgICBuYl9vcmlnX21lcmdlX2NhbmQgPSBuYl9tZXJnZV9jYW5kOwogCiAgICAgLy8gY29tYmluZWQgYmktcHJlZGljdGl2ZSBtZXJnZSBjYW5kaWRhdGVzICAoYXBwbGllcyBmb3IgQiBzbGljZXMpCi0gICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgPT0gQl9TTElDRSAmJiBuYl9vcmlnX21lcmdlX2NhbmQgPiAxICYmCisgICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CICYmIG5iX29yaWdfbWVyZ2VfY2FuZCA+IDEgJiYKICAgICAgICAgbmJfb3JpZ19tZXJnZV9jYW5kIDwgcy0+c2gubWF4X251bV9tZXJnZV9jYW5kKSB7CiAgICAgICAgIGludCBjb21iX2lkeCA9IDA7CiAKQEAgLTQ1OSw3ICs0NjAsNyBAQAogCiAgICAgLy8gYXBwZW5kIFplcm8gbW90aW9uIHZlY3RvciBjYW5kaWRhdGVzCiAgICAgd2hpbGUgKG5iX21lcmdlX2NhbmQgPCBzLT5zaC5tYXhfbnVtX21lcmdlX2NhbmQpIHsKLSAgICAgICAgbWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXS5wcmVkX2ZsYWcgICAgPSBQRl9MMCArICgocy0+c2guc2xpY2VfdHlwZSA9PSBCX1NMSUNFKSA8PCAxKTsKKyAgICAgICAgbWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXS5wcmVkX2ZsYWcgICAgPSBQRl9MMCArICgocy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpIDw8IDEpOwogICAgICAgICBBVl9aRVJPMzIobWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXS5tdiArIDApOwogICAgICAgICBBVl9aRVJPMzIobWVyZ2VjYW5kbGlzdFtuYl9tZXJnZV9jYW5kXS5tdiArIDEpOwogICAgICAgICBtZXJnZWNhbmRsaXN0W25iX21lcmdlX2NhbmRdLnJlZl9pZHhbMF0gICA9IHplcm9faWR4IDwgbmJfcmVmcyA/IHplcm9faWR4IDogMDsKQEAgLTQ4MSw3ICs0ODIsNyBAQAogewogICAgIGludCBzaW5nbGVNQ0xGbGFnID0gMDsKICAgICBpbnQgbkNTID0gMSA8PCBsb2cyX2NiX3NpemU7Ci0gICAgTE9DQUxfQUxJR05FRCg0LCBNdkZpZWxkLCBtZXJnZWNhbmRfbGlzdCwgW01SR19NQVhfTlVNX0NBTkRTXSk7CisgICAgTXZGaWVsZCBtZXJnZWNhbmRfbGlzdFtNUkdfTUFYX05VTV9DQU5EU107CiAgICAgaW50IG5QYlcyID0gblBiVzsKICAgICBpbnQgblBiSDIgPSBuUGJIOwogICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oZXZjX3BhcnNlLmMgYi9saWJhdmNvZGVjL2hldmNfcGFyc2UuYwppbmRleCA2M2VkODRhLi5iMWIyN2VlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hldmNfcGFyc2UuYworKysgYi9saWJhdmNvZGVjL2hldmNfcGFyc2UuYwpAQCAtMSw2ICsxLDQgQEAKIC8qCi0gKiBIRVZDIGNvbW1vbiBjb2RlCi0gKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKICAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTE4LDI3NCArMTYsMTI3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgotCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImgyNjQ1X3BhcnNlLmgiCiAjaW5jbHVkZSAiaGV2Yy5oIgorI2luY2x1ZGUgImhldmNfcGFyc2UuaCIKIAotLyogRklYTUU6IFRoaXMgaXMgYWRhcHRlZCBmcm9tIGZmX2gyNjRfZGVjb2RlX25hbCwgYXZvaWRpbmcgZHVwbGljYXRpb24KLSAqIGJldHdlZW4gdGhlc2UgZnVuY3Rpb25zIHdvdWxkIGJlIG5pY2UuICovCi1pbnQgZmZfaGV2Y19leHRyYWN0X3Jic3AoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDTkFMICpuYWwpCitzdGF0aWMgaW50IGhldmNfZGVjb2RlX25hbF91bml0cyhjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgSEVWQ1BhcmFtU2V0cyAqcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDU0VJICpzZWksIGludCBpc19uYWxmZiwgaW50IG5hbF9sZW5ndGhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJfcmVjb2duaXRpb24sIGludCBhcHBseV9kZWZkaXNwd2luLCB2b2lkICpsb2djdHgpCiB7Ci0gICAgaW50IGksIHNpLCBkaTsKLSAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IGk7CisgICAgaW50IHJldCA9IDA7CisgICAgSDI2NDVQYWNrZXQgcGt0ID0geyAwIH07CiAKLSAgICBpZiAocykKLSAgICAgICAgbmFsLT5za2lwcGVkX2J5dGVzID0gMDsKLSNkZWZpbmUgU1RBUlRDT0RFX1RFU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGkgKyAyIDwgbGVuZ3RoICYmIHNyY1tpICsgMV0gPT0gMCAmJiBzcmNbaSArIDJdIDw9IDMpIHsgICAgIFwKLSAgICAgICAgICAgIGlmIChzcmNbaSArIDJdICE9IDMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAvKiBzdGFydGNvZGUsIHNvIHdlIG11c3QgYmUgcGFzdCB0aGUgZW5kICovICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBsZW5ndGggPSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBmZl9oMjY0NV9wYWNrZXRfc3BsaXQoJnBrdCwgYnVmLCBidWZfc2l6ZSwgbG9nY3R4LCBpc19uYWxmZiwgbmFsX2xlbmd0aF9zaXplLCBBVl9DT0RFQ19JRF9IRVZDLCAxKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBrdC5uYl9uYWxzOyBpKyspIHsKKyAgICAgICAgSDI2NDVOQUwgKm5hbCA9ICZwa3QubmFsc1tpXTsKKworICAgICAgICAvKiBpZ25vcmUgZXZlcnl0aGluZyBleGNlcHQgcGFyYW1ldGVyIHNldHMgYW5kIFZDTCBOQUxVcyAqLworICAgICAgICBzd2l0Y2ggKG5hbC0+dHlwZSkgeworICAgICAgICBjYXNlIEhFVkNfTkFMX1ZQUzoKKyAgICAgICAgICAgIHJldCA9IGZmX2hldmNfZGVjb2RlX25hbF92cHMoJm5hbC0+Z2IsIGxvZ2N0eCwgcHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEVWQ19OQUxfU1BTOgorICAgICAgICAgICAgcmV0ID0gZmZfaGV2Y19kZWNvZGVfbmFsX3NwcygmbmFsLT5nYiwgbG9nY3R4LCBwcywgYXBwbHlfZGVmZGlzcHdpbik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIRVZDX05BTF9QUFM6CisgICAgICAgICAgICByZXQgPSBmZl9oZXZjX2RlY29kZV9uYWxfcHBzKCZuYWwtPmdiLCBsb2djdHgsIHBzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhFVkNfTkFMX1NFSV9QUkVGSVg6CisgICAgICAgIGNhc2UgSEVWQ19OQUxfU0VJX1NVRkZJWDoKKyAgICAgICAgICAgIHJldCA9IGZmX2hldmNfZGVjb2RlX25hbF9zZWkoJm5hbC0+Z2IsIGxvZ2N0eCwgc2VpLCBwcywgbmFsLT50eXBlKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1ZFUkJPU0UsICJJZ25vcmluZyBOQUwgdHlwZSAlZCBpbiBleHRyYWRhdGFcbiIsIG5hbC0+dHlwZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotI2lmIEhBVkVfRkFTVF9VTkFMSUdORUQKLSNkZWZpbmUgRklORF9GSVJTVF9aRVJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGkgPiAwICYmICFzcmNbaV0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGktLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgd2hpbGUgKHNyY1tpXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGkrKwotI2lmIEhBVkVfRkFTVF82NEJJVAotICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgbGVuZ3RoOyBpICs9IDkpIHsKLSAgICAgICAgaWYgKCEoKH5BVl9STjY0QShzcmMgKyBpKSAmCi0gICAgICAgICAgICAgICAoQVZfUk42NEEoc3JjICsgaSkgLSAweDAxMDAwMTAwMDEwMDAxMDFVTEwpKSAmCi0gICAgICAgICAgICAgIDB4ODAwMDgwMDA4MDAwODA4MFVMTCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgRklORF9GSVJTVF9aRVJPOwotICAgICAgICBTVEFSVENPREVfVEVTVDsKLSAgICAgICAgaSAtPSA3OwotICAgIH0KLSNlbHNlCi0gICAgZm9yIChpID0gMDsgaSArIDEgPCBsZW5ndGg7IGkgKz0gNSkgewotICAgICAgICBpZiAoISgofkFWX1JOMzJBKHNyYyArIGkpICYKLSAgICAgICAgICAgICAgIChBVl9STjMyQShzcmMgKyBpKSAtIDB4MDEwMDAxMDFVKSkgJgotICAgICAgICAgICAgICAweDgwMDA4MDgwVSkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgRklORF9GSVJTVF9aRVJPOwotICAgICAgICBTVEFSVENPREVfVEVTVDsKLSAgICAgICAgaSAtPSAzOwotICAgIH0KLSNlbmRpZiAvKiBIQVZFX0ZBU1RfNjRCSVQgKi8KLSNlbHNlCi0gICAgZm9yIChpID0gMDsgaSArIDEgPCBsZW5ndGg7IGkgKz0gMikgewotICAgICAgICBpZiAoc3JjW2ldKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChpID4gMCAmJiBzcmNbaSAtIDFdID09IDApCi0gICAgICAgICAgICBpLS07Ci0gICAgICAgIFNUQVJUQ09ERV9URVNUOwotICAgIH0KLSNlbmRpZiAvKiBIQVZFX0ZBU1RfVU5BTElHTkVEICovCi0KLSAgICBpZiAoaSA+PSBsZW5ndGggLSAxKSB7IC8vIG5vIGVzY2FwZWQgMAotICAgICAgICBuYWwtPmRhdGEgICAgID0KLSAgICAgICAgbmFsLT5yYXdfZGF0YSA9IHNyYzsKLSAgICAgICAgbmFsLT5zaXplICAgICA9Ci0gICAgICAgIG5hbC0+cmF3X3NpemUgPSBsZW5ndGg7Ci0gICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgfQogCi0gICAgYXZfZmFzdF9tYWxsb2MoJm5hbC0+cmJzcF9idWZmZXIsICZuYWwtPnJic3BfYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgbGVuZ3RoICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgaWYgKCFuYWwtPnJic3BfYnVmZmVyKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZHN0ID0gbmFsLT5yYnNwX2J1ZmZlcjsKLQotICAgIG1lbWNweShkc3QsIHNyYywgaSk7Ci0gICAgc2kgPSBkaSA9IGk7Ci0gICAgd2hpbGUgKHNpICsgMiA8IGxlbmd0aCkgewotICAgICAgICAvLyByZW1vdmUgZXNjYXBlcyAodmVyeSByYXJlIDE6Ml4yMikKLSAgICAgICAgaWYgKHNyY1tzaSArIDJdID4gMykgewotICAgICAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOwotICAgICAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOwotICAgICAgICB9IGVsc2UgaWYgKHNyY1tzaV0gPT0gMCAmJiBzcmNbc2kgKyAxXSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoc3JjW3NpICsgMl0gPT0gMykgeyAvLyBlc2NhcGUKLSAgICAgICAgICAgICAgICBkc3RbZGkrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdFtkaSsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgc2kgICAgICAgKz0gMzsKLQotICAgICAgICAgICAgICAgIGlmIChzICYmIG5hbC0+c2tpcHBlZF9ieXRlc19wb3MpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsLT5za2lwcGVkX2J5dGVzKys7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYWwtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUgPCBuYWwtPnNraXBwZWRfYnl0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+c2tpcHBlZF9ieXRlc19wb3Nfc2l6ZSAqPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChuYWwtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUgPj0gbmFsLT5za2lwcGVkX2J5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X3JlYWxsb2NwX2FycmF5KCZuYWwtPnNraXBwZWRfYnl0ZXNfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbmFsLT5za2lwcGVkX2J5dGVzX3BvcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuYWwtPnNraXBwZWRfYnl0ZXNfcG9zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5za2lwcGVkX2J5dGVzX3Bvc19zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuYWwtPnNraXBwZWRfYnl0ZXNfcG9zKQotICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5za2lwcGVkX2J5dGVzX3Bvc1tuYWwtPnNraXBwZWRfYnl0ZXMtMV0gPSBkaSAtIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIC8vIG5leHQgc3RhcnQgY29kZQotICAgICAgICAgICAgICAgIGdvdG8gbnNjOwotICAgICAgICB9Ci0KLSAgICAgICAgZHN0W2RpKytdID0gc3JjW3NpKytdOwotICAgIH0KLSAgICB3aGlsZSAoc2kgPCBsZW5ndGgpCi0gICAgICAgIGRzdFtkaSsrXSA9IHNyY1tzaSsrXTsKLQotbnNjOgotICAgIG1lbXNldChkc3QgKyBkaSwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0KLSAgICBuYWwtPmRhdGEgPSBkc3Q7Ci0gICAgbmFsLT5zaXplID0gZGk7Ci0gICAgbmFsLT5yYXdfZGF0YSA9IHNyYzsKLSAgICBuYWwtPnJhd19zaXplID0gc2k7Ci0gICAgcmV0dXJuIHNpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqbmFsX3VuaXRfbmFtZShpbnQgbmFsX3R5cGUpCi17Ci0gICAgc3dpdGNoKG5hbF90eXBlKSB7Ci0gICAgY2FzZSBOQUxfVFJBSUxfTiAgICA6IHJldHVybiAiVFJBSUxfTiI7Ci0gICAgY2FzZSBOQUxfVFJBSUxfUiAgICA6IHJldHVybiAiVFJBSUxfUiI7Ci0gICAgY2FzZSBOQUxfVFNBX04gICAgICA6IHJldHVybiAiVFNBX04iOwotICAgIGNhc2UgTkFMX1RTQV9SICAgICAgOiByZXR1cm4gIlRTQV9SIjsKLSAgICBjYXNlIE5BTF9TVFNBX04gICAgIDogcmV0dXJuICJTVFNBX04iOwotICAgIGNhc2UgTkFMX1NUU0FfUiAgICAgOiByZXR1cm4gIlNUU0FfUiI7Ci0gICAgY2FzZSBOQUxfUkFETF9OICAgICA6IHJldHVybiAiUkFETF9OIjsKLSAgICBjYXNlIE5BTF9SQURMX1IgICAgIDogcmV0dXJuICJSQURMX1IiOwotICAgIGNhc2UgTkFMX1JBU0xfTiAgICAgOiByZXR1cm4gIlJBU0xfTiI7Ci0gICAgY2FzZSBOQUxfUkFTTF9SICAgICA6IHJldHVybiAiUkFTTF9SIjsKLSAgICBjYXNlIE5BTF9CTEFfV19MUCAgIDogcmV0dXJuICJCTEFfV19MUCI7Ci0gICAgY2FzZSBOQUxfQkxBX1dfUkFETCA6IHJldHVybiAiQkxBX1dfUkFETCI7Ci0gICAgY2FzZSBOQUxfQkxBX05fTFAgICA6IHJldHVybiAiQkxBX05fTFAiOwotICAgIGNhc2UgTkFMX0lEUl9XX1JBREwgOiByZXR1cm4gIklEUl9XX1JBREwiOwotICAgIGNhc2UgTkFMX0lEUl9OX0xQICAgOiByZXR1cm4gIklEUl9OX0xQIjsKLSAgICBjYXNlIE5BTF9DUkFfTlVUICAgIDogcmV0dXJuICJDUkFfTlVUIjsKLSAgICBjYXNlIE5BTF9WUFMgICAgICAgIDogcmV0dXJuICJWUFMiOwotICAgIGNhc2UgTkFMX1NQUyAgICAgICAgOiByZXR1cm4gIlNQUyI7Ci0gICAgY2FzZSBOQUxfUFBTICAgICAgICA6IHJldHVybiAiUFBTIjsKLSAgICBjYXNlIE5BTF9BVUQgICAgICAgIDogcmV0dXJuICJBVUQiOwotICAgIGNhc2UgTkFMX0VPU19OVVQgICAgOiByZXR1cm4gIkVPU19OVVQiOwotICAgIGNhc2UgTkFMX0VPQl9OVVQgICAgOiByZXR1cm4gIkVPQl9OVVQiOwotICAgIGNhc2UgTkFMX0ZEX05VVCAgICAgOiByZXR1cm4gIkZEX05VVCI7Ci0gICAgY2FzZSBOQUxfU0VJX1BSRUZJWCA6IHJldHVybiAiU0VJX1BSRUZJWCI7Ci0gICAgY2FzZSBOQUxfU0VJX1NVRkZJWCA6IHJldHVybiAiU0VJX1NVRkZJWCI7Ci0gICAgZGVmYXVsdCA6IHJldHVybiAiPyI7Ci0gICAgfQotfQotCi0vKioKLSAqIEByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQSBpZiB0aGUgcGFja2V0IGlzIG5vdCBhIHZhbGlkIE5BTCB1bml0LAotICogMCBpZiB0aGUgdW5pdCBzaG91bGQgYmUgc2tpcHBlZCwgMSBvdGhlcndpc2UKLSAqLwotc3RhdGljIGludCBobHNfbmFsX3VuaXQoSEVWQ05BTCAqbmFsLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmbmFsLT5nYjsKLSAgICBpbnQgbnVoX2xheWVyX2lkOwotCi0gICAgaWYgKGdldF9iaXRzMShnYikgIT0gMCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0KLSAgICBuYWwtPnR5cGUgPSBnZXRfYml0cyhnYiwgNik7Ci0KLSAgICBudWhfbGF5ZXJfaWQgICA9IGdldF9iaXRzKGdiLCA2KTsKLSAgICBuYWwtPnRlbXBvcmFsX2lkID0gZ2V0X2JpdHMoZ2IsIDMpIC0gMTsKLSAgICBpZiAobmFsLT50ZW1wb3JhbF9pZCA8IDApCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotCi0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICJuYWxfdW5pdF90eXBlOiAlZCglcyksIG51aF9sYXllcl9pZDogJWQsIHRlbXBvcmFsX2lkOiAlZFxuIiwKLSAgICAgICAgICAgbmFsLT50eXBlLCBuYWxfdW5pdF9uYW1lKG5hbC0+dHlwZSksIG51aF9sYXllcl9pZCwgbmFsLT50ZW1wb3JhbF9pZCk7Ci0KLSAgICByZXR1cm4gbnVoX2xheWVyX2lkID09IDA7Ci19Ci0KLQotaW50IGZmX2hldmNfc3BsaXRfcGFja2V0KEhFVkNDb250ZXh0ICpzLCBIRVZDUGFja2V0ICpwa3QsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBpc19uYWxmZiwgaW50IG5hbF9sZW5ndGhfc2l6ZSkKLXsKLSAgICBpbnQgY29uc3VtZWQsIHJldCA9IDA7Ci0KLSAgICBwa3QtPm5iX25hbHMgPSAwOwotICAgIHdoaWxlIChsZW5ndGggPj0gNCkgewotICAgICAgICBIRVZDTkFMICpuYWw7Ci0gICAgICAgIGludCBleHRyYWN0X2xlbmd0aCA9IDA7Ci0KLSAgICAgICAgaWYgKGlzX25hbGZmKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYWxfbGVuZ3RoX3NpemU7IGkrKykKLSAgICAgICAgICAgICAgICBleHRyYWN0X2xlbmd0aCA9IChleHRyYWN0X2xlbmd0aCA8PCA4KSB8IGJ1ZltpXTsKLSAgICAgICAgICAgIGJ1ZiAgICArPSBuYWxfbGVuZ3RoX3NpemU7Ci0gICAgICAgICAgICBsZW5ndGggLT0gbmFsX2xlbmd0aF9zaXplOwotCi0gICAgICAgICAgICBpZiAoZXh0cmFjdF9sZW5ndGggPiBsZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgTkFMIHVuaXQgc2l6ZS5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogc2VhcmNoIHN0YXJ0IGNvZGUgKi8KLSAgICAgICAgICAgIHdoaWxlIChidWZbMF0gIT0gMCB8fCBidWZbMV0gIT0gMCB8fCBidWZbMl0gIT0gMSkgewotICAgICAgICAgICAgICAgICsrYnVmOwotICAgICAgICAgICAgICAgIC0tbGVuZ3RoOwotICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPCA0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gc3RhcnQgY29kZSBpcyBmb3VuZC5cbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1ZiAgICAgICAgICAgKz0gMzsKLSAgICAgICAgICAgIGxlbmd0aCAgICAgICAgLT0gMzsKLSAgICAgICAgICAgIGV4dHJhY3RfbGVuZ3RoID0gbGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBrdC0+bmFsc19hbGxvY2F0ZWQgPCBwa3QtPm5iX25hbHMgKyAxKSB7Ci0gICAgICAgICAgICBpbnQgbmV3X3NpemUgPSBwa3QtPm5hbHNfYWxsb2NhdGVkICsgMTsKLSAgICAgICAgICAgIHZvaWQgKnRtcCA9IGF2X3JlYWxsb2NfYXJyYXkocGt0LT5uYWxzLCBuZXdfc2l6ZSwgc2l6ZW9mKCpwa3QtPm5hbHMpKTsKLQotICAgICAgICAgICAgaWYgKCF0bXApCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgICAgICAgICAgcGt0LT5uYWxzID0gdG1wOwotICAgICAgICAgICAgbWVtc2V0KHBrdC0+bmFscyArIHBrdC0+bmFsc19hbGxvY2F0ZWQsIDAsCi0gICAgICAgICAgICAgICAgICAgKG5ld19zaXplIC0gcGt0LT5uYWxzX2FsbG9jYXRlZCkgKiBzaXplb2YoKnBrdC0+bmFscykpOwotCi0gICAgICAgICAgICBuYWwgPSAmcGt0LT5uYWxzW3BrdC0+bmJfbmFsc107Ci0gICAgICAgICAgICBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zX3NpemUgPSAxMDI0OyAvLyBpbml0aWFsIGJ1ZmZlciBzaXplCi0gICAgICAgICAgICBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zID0gYXZfbWFsbG9jX2FycmF5KG5hbC0+c2tpcHBlZF9ieXRlc19wb3Nfc2l6ZSwgc2l6ZW9mKCpuYWwtPnNraXBwZWRfYnl0ZXNfcG9zKSk7Ci0gICAgICAgICAgICBpZiAoIW5hbC0+c2tpcHBlZF9ieXRlc19wb3MpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgICAgICAgICAgcGt0LT5uYWxzX2FsbG9jYXRlZCA9IG5ld19zaXplOwotICAgICAgICB9Ci0gICAgICAgIG5hbCA9ICZwa3QtPm5hbHNbcGt0LT5uYl9uYWxzXTsKLQotICAgICAgICBjb25zdW1lZCA9IGZmX2hldmNfZXh0cmFjdF9yYnNwKHMsIGJ1ZiwgZXh0cmFjdF9sZW5ndGgsIG5hbCk7Ci0gICAgICAgIGlmIChjb25zdW1lZCA8IDApCi0gICAgICAgICAgICByZXR1cm4gY29uc3VtZWQ7Ci0KLSAgICAgICAgcGt0LT5uYl9uYWxzKys7Ci0KLSAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoJm5hbC0+Z2IsIG5hbC0+ZGF0YSwgbmFsLT5zaXplKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIHJldCA9IGhsc19uYWxfdW5pdChuYWwsIGF2Y3R4KTsKLSAgICAgICAgaWYgKHJldCA8PSAwKSB7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBOQUwgdW5pdCAlZCwgc2tpcHBpbmcuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGt0LT5uYl9uYWxzLS07Ci0gICAgICAgIH0KLQotICAgICAgICBidWYgICAgKz0gY29uc3VtZWQ7Ci0gICAgICAgIGxlbmd0aCAtPSBjb25zdW1lZDsKLSAgICB9Citkb25lOgorICAgIGZmX2gyNjQ1X3BhY2tldF91bmluaXQoJnBrdCk7CisgICAgaWYgKGVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgIHJldHVybiByZXQ7CiAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IGZmX2hldmNfZGVjb2RlX2V4dHJhZGF0YShjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSwgSEVWQ1BhcmFtU2V0cyAqcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNTRUkgKnNlaSwgaW50ICppc19uYWxmZiwgaW50ICpuYWxfbGVuZ3RoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJfcmVjb2duaXRpb24sIGludCBhcHBseV9kZWZkaXNwd2luLCB2b2lkICpsb2djdHgpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgZGF0YSwgc2l6ZSk7CisKKyAgICBpZiAoc2l6ZSA+IDMgJiYgKGRhdGFbMF0gfHwgZGF0YVsxXSB8fCBkYXRhWzJdID4gMSkpIHsKKyAgICAgICAgLyogSXQgc2VlbXMgdGhlIGV4dHJhZGF0YSBpcyBlbmNvZGVkIGFzIGh2Y0MgZm9ybWF0LgorICAgICAgICAgKiBUZW1wb3JhcmlseSwgd2Ugc3VwcG9ydCBjb25maWd1cmF0aW9uVmVyc2lvbj09MCB1bnRpbCAxNDQ5Ni0xNSAzcmQKKyAgICAgICAgICogaXMgZmluYWxpemVkLiBXaGVuIGZpbmFsaXplZCwgY29uZmlndXJhdGlvblZlcnNpb24gd2lsbCBiZSAxIGFuZCB3ZQorICAgICAgICAgKiBjYW4gcmVjb2duaXplIGh2Y0MgYnkgY2hlY2tpbmcgaWYgYXZjdHgtPmV4dHJhZGF0YVswXT09MSBvciBub3QuICovCisgICAgICAgIGludCBpLCBqLCBudW1fYXJyYXlzLCBuYWxfbGVuX3NpemU7CisKKyAgICAgICAgKmlzX25hbGZmID0gMTsKKworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMjEpOworICAgICAgICBuYWxfbGVuX3NpemUgPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAmIDMpICsgMTsKKyAgICAgICAgbnVtX2FycmF5cyAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKworICAgICAgICAvKiBuYWwgdW5pdHMgaW4gdGhlIGh2Y0MgYWx3YXlzIGhhdmUgbGVuZ3RoIGNvZGVkIHdpdGggMiBieXRlcywKKyAgICAgICAgICogc28gcHV0IGEgZmFrZSBuYWxfbGVuZ3RoX3NpemUgPSAyIHdoaWxlIHBhcnNpbmcgdGhlbSAqLworICAgICAgICAqbmFsX2xlbmd0aF9zaXplID0gMjsKKworICAgICAgICAvKiBEZWNvZGUgbmFsIHVuaXRzIGZyb20gaHZjQy4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9hcnJheXM7IGkrKykgeworICAgICAgICAgICAgaW50IHR5cGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpICYgMHgzZjsKKyAgICAgICAgICAgIGludCBjbnQgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNudDsgaisrKSB7CisgICAgICAgICAgICAgICAgLy8gKzIgZm9yIHRoZSBuYWwgc2l6ZSBmaWVsZAorICAgICAgICAgICAgICAgIGludCBuYWxzaXplID0gYnl0ZXN0cmVhbTJfcGVla19iZTE2KCZnYikgKyAyOworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgbmFsc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBOQUwgdW5pdCBzaXplIGluIGV4dHJhZGF0YS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXQgPSBoZXZjX2RlY29kZV9uYWxfdW5pdHMoZ2IuYnVmZmVyLCBuYWxzaXplLCBwcywgc2VpLCAqaXNfbmFsZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuYWxfbGVuZ3RoX3NpemUsIGVycl9yZWNvZ25pdGlvbiwgYXBwbHlfZGVmZGlzcHdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nY3R4KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVjb2RpbmcgbmFsIHVuaXQgJWQgJWQgZnJvbSBodmNDIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIGkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgbmFsc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3cgc3RvcmUgcmlnaHQgbmFsIGxlbmd0aCBzaXplLCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZQorICAgICAgICAgKiBhbGwgb3RoZXIgbmFscyAqLworICAgICAgICAqbmFsX2xlbmd0aF9zaXplID0gbmFsX2xlbl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgICppc19uYWxmZiA9IDA7CisgICAgICAgIHJldCA9IGhldmNfZGVjb2RlX25hbF91bml0cyhkYXRhLCBzaXplLCBwcywgc2VpLCAqaXNfbmFsZmYsICpuYWxfbGVuZ3RoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJfcmVjb2duaXRpb24sIGFwcGx5X2RlZmRpc3B3aW4sIGxvZ2N0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oZXZjX3BhcnNlLmggYi9saWJhdmNvZGVjL2hldmNfcGFyc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWI5NmFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oZXZjX3BhcnNlLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBILjI2NSBwYXJzZXIgY29kZQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IRVZDX1BBUlNFX0gKKyNkZWZpbmUgQVZDT0RFQ19IRVZDX1BBUlNFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiaGV2Y19wcy5oIgorI2luY2x1ZGUgImhldmNfc2VpLmgiCisKK2ludCBmZl9oZXZjX2RlY29kZV9leHRyYWRhdGEoY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUsIEhFVkNQYXJhbVNldHMgKnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDU0VJICpzZWksIGludCAqaXNfbmFsZmYsIGludCAqbmFsX2xlbmd0aF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyX3JlY29nbml0aW9uLCBpbnQgYXBwbHlfZGVmZGlzcHdpbiwgdm9pZCAqbG9nY3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfSEVWQ19QQVJTRV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hldmNfcGFyc2VyLmMgYi9saWJhdmNvZGVjL2hldmNfcGFyc2VyLmMKaW5kZXggNDYyNWU2MS4uYTQ2ODY4MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oZXZjX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvaGV2Y19wYXJzZXIuYwpAQCAtMjQsMTEwICsyNCwyMjQgQEAKIAogI2luY2x1ZGUgImdvbG9tYi5oIgogI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJoZXZjX3BhcnNlLmgiCisjaW5jbHVkZSAiaGV2Y19wcy5oIgorI2luY2x1ZGUgImhldmNfc2VpLmgiCisjaW5jbHVkZSAiaDI2NDVfcGFyc2UuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInBhcnNlci5oIgogCiAjZGVmaW5lIFNUQVJUX0NPREUgMHgwMDAwMDEgLy8vPCBzdGFydF9jb2RlX3ByZWZpeF9vbmVfM2J5dGVzCiAKICNkZWZpbmUgSVNfSVJBUF9OQUwobmFsKSAobmFsLT50eXBlID49IDE2ICYmIG5hbC0+dHlwZSA8PSAyMykKLQotI2RlZmluZSBBRFZBTkNFRF9QQVJTRVIgQ09ORklHX0hFVkNfREVDT0RFUgorI2RlZmluZSBJU19JRFJfTkFMKG5hbCkgKG5hbC0+dHlwZSA9PSBIRVZDX05BTF9JRFJfV19SQURMIHx8IG5hbC0+dHlwZSA9PSBIRVZDX05BTF9JRFJfTl9MUCkKIAogdHlwZWRlZiBzdHJ1Y3QgSEVWQ1BhcnNlckNvbnRleHQgewogICAgIFBhcnNlQ29udGV4dCBwYzsKIAotICAgIEhFVkNQYWNrZXQgcGt0OworICAgIEgyNjQ1UGFja2V0IHBrdDsKICAgICBIRVZDUGFyYW1TZXRzIHBzOworICAgIEhFVkNTRUkgc2VpOworICAgIFNsaWNlSGVhZGVyIHNoOwogCisgICAgaW50IGlzX2F2YzsKKyAgICBpbnQgbmFsX2xlbmd0aF9zaXplOwogICAgIGludCBwYXJzZWRfZXh0cmFkYXRhOwogCi0jaWYgQURWQU5DRURfUEFSU0VSCi0gICAgSEVWQ0NvbnRleHQgaDsKLSNlbmRpZgorICAgIGludCBwb2M7CisgICAgaW50IHBvY1RpZDA7CiB9IEhFVkNQYXJzZXJDb250ZXh0OwogCi0jaWYgIUFEVkFOQ0VEX1BBUlNFUgotc3RhdGljIGludCBoZXZjX3BhcnNlX3NsaWNlX2hlYWRlcihBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgSEVWQ05BTCAqbmFsLAorc3RhdGljIGludCBoZXZjX3BhcnNlX3NsaWNlX2hlYWRlcihBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgSDI2NDVOQUwgKm5hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIEhFVkNQYXJzZXJDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CisgICAgSEVWQ1BhcmFtU2V0cyAqcHMgPSAmY3R4LT5wczsKKyAgICBIRVZDU0VJICpzZWkgPSAmY3R4LT5zZWk7CisgICAgU2xpY2VIZWFkZXIgKnNoID0gJmN0eC0+c2g7CiAgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmbmFsLT5nYjsKKyAgICBjb25zdCBIRVZDV2luZG93ICpvdzsKKyAgICBpbnQgaSwgbnVtID0gMCwgZGVuID0gMDsKIAotICAgIEhFVkNQUFMgKnBwczsKLSAgICBIRVZDU1BTICpzcHM7Ci0gICAgdW5zaWduZWQgaW50IHBwc19pZDsKKyAgICBzaC0+Zmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIHMtPnBpY3R1cmVfc3RydWN0dXJlID0gc2VpLT5waWN0dXJlX3RpbWluZy5waWN0dXJlX3N0cnVjdDsKKyAgICBzLT5maWVsZF9vcmRlciA9IHNlaS0+cGljdHVyZV90aW1pbmcucGljdHVyZV9zdHJ1Y3Q7CiAKLSAgICBnZXRfYml0czEoZ2IpOyAgICAgICAgICAvLyBmaXJzdCBzbGljZSBpbiBwaWMKLSAgICBpZiAoSVNfSVJBUF9OQUwobmFsKSkKLSAgICAgICAgZ2V0X2JpdHMxKGdiKTsgICAgICAvLyBubyBvdXRwdXQgb2YgcHJpb3IgcGljcworICAgIGlmIChJU19JUkFQX05BTChuYWwpKSB7CisgICAgICAgIHMtPmtleV9mcmFtZSA9IDE7CisgICAgICAgIHNoLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB9CiAKLSAgICBwcHNfaWQgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOwotICAgIGlmIChwcHNfaWQgPj0gTUFYX1BQU19DT1VOVCB8fCAhY3R4LT5wcy5wcHNfbGlzdFtwcHNfaWRdKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUFBTIGlkIG91dCBvZiByYW5nZTogJWRcbiIsIHBwc19pZCk7CisgICAgc2gtPnBwc19pZCA9IGdldF91ZV9nb2xvbWIoZ2IpOworICAgIGlmIChzaC0+cHBzX2lkID49IEhFVkNfTUFYX1BQU19DT1VOVCB8fCAhcHMtPnBwc19saXN0W3NoLT5wcHNfaWRdKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUFBTIGlkIG91dCBvZiByYW5nZTogJWRcbiIsIHNoLT5wcHNfaWQpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9Ci0gICAgcHBzID0gKEhFVkNQUFMqKWN0eC0+cHMucHBzX2xpc3RbcHBzX2lkXS0+ZGF0YTsKLSAgICBzcHMgPSAoSEVWQ1NQUyopY3R4LT5wcy5zcHNfbGlzdFtwcHMtPnNwc19pZF0tPmRhdGE7CisgICAgcHMtPnBwcyA9IChIRVZDUFBTKilwcy0+cHBzX2xpc3Rbc2gtPnBwc19pZF0tPmRhdGE7CiAKLSAgICAvKiBleHBvcnQgdGhlIHN0cmVhbSBwYXJhbWV0ZXJzICovCi0gICAgcy0+Y29kZWRfd2lkdGggID0gc3BzLT53aWR0aDsKLSAgICBzLT5jb2RlZF9oZWlnaHQgPSBzcHMtPmhlaWdodDsKLSAgICBzLT53aWR0aCAgICAgICAgPSBzcHMtPm91dHB1dF93aWR0aDsKLSAgICBzLT5oZWlnaHQgICAgICAgPSBzcHMtPm91dHB1dF9oZWlnaHQ7Ci0gICAgcy0+Zm9ybWF0ICAgICAgID0gc3BzLT5waXhfZm10OwotICAgIGF2Y3R4LT5wcm9maWxlICA9IHNwcy0+cHRsLmdlbmVyYWxfcHRsLnByb2ZpbGVfaWRjOwotICAgIGF2Y3R4LT5sZXZlbCAgICA9IHNwcy0+cHRsLmdlbmVyYWxfcHRsLmxldmVsX2lkYzsKKyAgICBpZiAocHMtPnBwcy0+c3BzX2lkID49IEhFVkNfTUFYX1NQU19DT1VOVCB8fCAhcHMtPnNwc19saXN0W3BzLT5wcHMtPnNwc19pZF0pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTUFMgaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgcHMtPnBwcy0+c3BzX2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChwcy0+c3BzICE9IChIRVZDU1BTKilwcy0+c3BzX2xpc3RbcHMtPnBwcy0+c3BzX2lkXS0+ZGF0YSkgeworICAgICAgICBwcy0+c3BzID0gKEhFVkNTUFMqKXBzLT5zcHNfbGlzdFtwcy0+cHBzLT5zcHNfaWRdLT5kYXRhOworICAgICAgICBwcy0+dnBzID0gKEhFVkNWUFMqKXBzLT52cHNfbGlzdFtwcy0+c3BzLT52cHNfaWRdLT5kYXRhOworICAgIH0KKyAgICBvdyAgPSAmcHMtPnNwcy0+b3V0cHV0X3dpbmRvdzsKIAotICAgIC8qIGlnbm9yZSB0aGUgcmVzdCBmb3Igbm93Ki8KKyAgICBzLT5jb2RlZF93aWR0aCAgPSBwcy0+c3BzLT53aWR0aDsKKyAgICBzLT5jb2RlZF9oZWlnaHQgPSBwcy0+c3BzLT5oZWlnaHQ7CisgICAgcy0+d2lkdGggICAgICAgID0gcHMtPnNwcy0+d2lkdGggIC0gb3ctPmxlZnRfb2Zmc2V0IC0gb3ctPnJpZ2h0X29mZnNldDsKKyAgICBzLT5oZWlnaHQgICAgICAgPSBwcy0+c3BzLT5oZWlnaHQgLSBvdy0+dG9wX29mZnNldCAgLSBvdy0+Ym90dG9tX29mZnNldDsKKyAgICBzLT5mb3JtYXQgICAgICAgPSBwcy0+c3BzLT5waXhfZm10OworICAgIGF2Y3R4LT5wcm9maWxlICA9IHBzLT5zcHMtPnB0bC5nZW5lcmFsX3B0bC5wcm9maWxlX2lkYzsKKyAgICBhdmN0eC0+bGV2ZWwgICAgPSBwcy0+c3BzLT5wdGwuZ2VuZXJhbF9wdGwubGV2ZWxfaWRjOwogCi0gICAgcmV0dXJuIDA7CisgICAgaWYgKHBzLT52cHMtPnZwc190aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgbnVtID0gcHMtPnZwcy0+dnBzX251bV91bml0c19pbl90aWNrOworICAgICAgICBkZW4gPSBwcy0+dnBzLT52cHNfdGltZV9zY2FsZTsKKyAgICB9IGVsc2UgaWYgKHBzLT5zcHMtPnZ1aS52dWlfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIG51bSA9IHBzLT5zcHMtPnZ1aS52dWlfbnVtX3VuaXRzX2luX3RpY2s7CisgICAgICAgIGRlbiA9IHBzLT5zcHMtPnZ1aS52dWlfdGltZV9zY2FsZTsKKyAgICB9CisKKyAgICBpZiAobnVtICE9IDAgJiYgZGVuICE9IDApCisgICAgICAgIGF2X3JlZHVjZSgmYXZjdHgtPmZyYW1lcmF0ZS5kZW4sICZhdmN0eC0+ZnJhbWVyYXRlLm51bSwKKyAgICAgICAgICAgICAgICAgIG51bSwgZGVuLCAxIDw8IDMwKTsKKworICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7CisgICAgICAgIGludCBzbGljZV9hZGRyZXNzX2xlbmd0aDsKKworICAgICAgICBpZiAocHMtPnBwcy0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgIHNoLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSAwOworCisgICAgICAgIHNsaWNlX2FkZHJlc3NfbGVuZ3RoID0gYXZfY2VpbF9sb2cyX2MocHMtPnNwcy0+Y3RiX3dpZHRoICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcy0+c3BzLT5jdGJfaGVpZ2h0KTsKKyAgICAgICAgc2gtPnNsaWNlX3NlZ21lbnRfYWRkciA9IGdldF9iaXRzeihnYiwgc2xpY2VfYWRkcmVzc19sZW5ndGgpOworICAgICAgICBpZiAoc2gtPnNsaWNlX3NlZ21lbnRfYWRkciA+PSBwcy0+c3BzLT5jdGJfd2lkdGggKiBwcy0+c3BzLT5jdGJfaGVpZ2h0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2xpY2Ugc2VnbWVudCBhZGRyZXNzOiAldS5cbiIsCisgICAgICAgICAgICAgICAgICAgc2gtPnNsaWNlX3NlZ21lbnRfYWRkcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBzaC0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZyA9IDA7CisKKyAgICBpZiAoc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcpCisgICAgICAgIHJldHVybiAwOyAvKiBicmVhazsgKi8KKworICAgIGZvciAoaSA9IDA7IGkgPCBwcy0+cHBzLT5udW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHM7IGkrKykKKyAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgLy8gc2xpY2VfcmVzZXJ2ZWRfdW5kZXRlcm1pbmVkX2ZsYWdbXQorCisgICAgc2gtPnNsaWNlX3R5cGUgPSBnZXRfdWVfZ29sb21iKGdiKTsKKyAgICBpZiAoIShzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0kgfHwgc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9QIHx8CisgICAgICAgICAgc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gc2xpY2UgdHlwZTogJWQuXG4iLAorICAgICAgICAgICAgICAgc2gtPnNsaWNlX3R5cGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcy0+cGljdF90eXBlID0gc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CID8gQVZfUElDVFVSRV9UWVBFX0IgOgorICAgICAgICAgICAgICAgICAgIHNoLT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfUCA/IEFWX1BJQ1RVUkVfVFlQRV9QIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElDVFVSRV9UWVBFX0k7CisKKyAgICBpZiAocHMtPnBwcy0+b3V0cHV0X2ZsYWdfcHJlc2VudF9mbGFnKQorICAgICAgICBzaC0+cGljX291dHB1dF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgIGlmIChwcy0+c3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZykKKyAgICAgICAgc2gtPmNvbG91cl9wbGFuZV9pZCA9IGdldF9iaXRzKGdiLCAyKTsKKworICAgIGlmICghSVNfSURSX05BTChuYWwpKSB7CisgICAgICAgIHNoLT5waWNfb3JkZXJfY250X2xzYiA9IGdldF9iaXRzKGdiLCBwcy0+c3BzLT5sb2cyX21heF9wb2NfbHNiKTsKKyAgICAgICAgcy0+b3V0cHV0X3BpY3R1cmVfbnVtYmVyID0gY3R4LT5wb2MgPSBmZl9oZXZjX2NvbXB1dGVfcG9jKHBzLT5zcHMsIGN0eC0+cG9jVGlkMCwgc2gtPnBpY19vcmRlcl9jbnRfbHNiLCBuYWwtPnR5cGUpOworICAgIH0gZWxzZQorICAgICAgICBzLT5vdXRwdXRfcGljdHVyZV9udW1iZXIgPSBjdHgtPnBvYyA9IDA7CisKKyAgICBpZiAobmFsLT50ZW1wb3JhbF9pZCA9PSAwICYmCisgICAgICAgIG5hbC0+dHlwZSAhPSBIRVZDX05BTF9UUkFJTF9OICYmCisgICAgICAgIG5hbC0+dHlwZSAhPSBIRVZDX05BTF9UU0FfTiAmJgorICAgICAgICBuYWwtPnR5cGUgIT0gSEVWQ19OQUxfU1RTQV9OICYmCisgICAgICAgIG5hbC0+dHlwZSAhPSBIRVZDX05BTF9SQURMX04gJiYKKyAgICAgICAgbmFsLT50eXBlICE9IEhFVkNfTkFMX1JBU0xfTiAmJgorICAgICAgICBuYWwtPnR5cGUgIT0gSEVWQ19OQUxfUkFETF9SICYmCisgICAgICAgIG5hbC0+dHlwZSAhPSBIRVZDX05BTF9SQVNMX1IpCisgICAgICAgIGN0eC0+cG9jVGlkMCA9IGN0eC0+cG9jOworCisgICAgcmV0dXJuIDE7IC8qIG5vIG5lZWQgdG8gZXZhbHVhdGUgdGhlIHJlc3QgKi8KIH0KIAorLyoqCisgKiBQYXJzZSBOQUwgdW5pdHMgb2YgZm91bmQgcGljdHVyZSBhbmQgZGVjb2RlIHNvbWUgYmFzaWMgaW5mb3JtYXRpb24uCisgKgorICogQHBhcmFtIHMgcGFyc2VyIGNvbnRleHQuCisgKiBAcGFyYW0gYXZjdHggY29kZWMgY29udGV4dC4KKyAqIEBwYXJhbSBidWYgYnVmZmVyIHdpdGggZmllbGQvZnJhbWUgZGF0YS4KKyAqIEBwYXJhbSBidWZfc2l6ZSBzaXplIG9mIHRoZSBidWZmZXIuCisgKi8KIHN0YXRpYyBpbnQgcGFyc2VfbmFsX3VuaXRzKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBIRVZDUGFyc2VyQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEhFVkNQYXJhbVNldHMgKnBzID0gJmN0eC0+cHM7CisgICAgSEVWQ1NFSSAqc2VpID0gJmN0eC0+c2VpOwogICAgIGludCByZXQsIGk7CiAKLSAgICByZXQgPSBmZl9oZXZjX3NwbGl0X3BhY2tldChOVUxMLCAmY3R4LT5wa3QsIGJ1ZiwgYnVmX3NpemUsIGF2Y3R4LCAwLCAwKTsKKyAgICAvKiBzZXQgc29tZSBzYW5lIGRlZmF1bHQgdmFsdWVzICovCisgICAgcy0+cGljdF90eXBlICAgICAgICAgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBzLT5rZXlfZnJhbWUgICAgICAgICA9IDA7CisgICAgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9VTktOT1dOOworCisgICAgZmZfaGV2Y19yZXNldF9zZWkoc2VpKTsKKworICAgIHJldCA9IGZmX2gyNjQ1X3BhY2tldF9zcGxpdCgmY3R4LT5wa3QsIGJ1ZiwgYnVmX3NpemUsIGF2Y3R4LCBjdHgtPmlzX2F2YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5uYWxfbGVuZ3RoX3NpemUsIEFWX0NPREVDX0lEX0hFVkMsIDEpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+cGt0Lm5iX25hbHM7IGkrKykgewotICAgICAgICBIRVZDTkFMICpuYWwgPSAmY3R4LT5wa3QubmFsc1tpXTsKKyAgICAgICAgSDI2NDVOQUwgKm5hbCA9ICZjdHgtPnBrdC5uYWxzW2ldOworICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZuYWwtPmdiOwogCi0gICAgICAgIC8qIGlnbm9yZSBldmVyeXRoaW5nIGV4Y2VwdCBwYXJhbWV0ZXIgc2V0cyBhbmQgVkNMIE5BTFVzICovCiAgICAgICAgIHN3aXRjaCAobmFsLT50eXBlKSB7Ci0gICAgICAgIGNhc2UgTkFMX1ZQUzogZmZfaGV2Y19kZWNvZGVfbmFsX3ZwcygmbmFsLT5nYiwgYXZjdHgsICZjdHgtPnBzKTsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkFMX1NQUzogZmZfaGV2Y19kZWNvZGVfbmFsX3NwcygmbmFsLT5nYiwgYXZjdHgsICZjdHgtPnBzLCAxKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkFMX1BQUzogZmZfaGV2Y19kZWNvZGVfbmFsX3BwcygmbmFsLT5nYiwgYXZjdHgsICZjdHgtPnBzKTsgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkFMX1RSQUlMX1I6Ci0gICAgICAgIGNhc2UgTkFMX1RSQUlMX046Ci0gICAgICAgIGNhc2UgTkFMX1RTQV9OOgotICAgICAgICBjYXNlIE5BTF9UU0FfUjoKLSAgICAgICAgY2FzZSBOQUxfU1RTQV9OOgotICAgICAgICBjYXNlIE5BTF9TVFNBX1I6Ci0gICAgICAgIGNhc2UgTkFMX0JMQV9XX0xQOgotICAgICAgICBjYXNlIE5BTF9CTEFfV19SQURMOgotICAgICAgICBjYXNlIE5BTF9CTEFfTl9MUDoKLSAgICAgICAgY2FzZSBOQUxfSURSX1dfUkFETDoKLSAgICAgICAgY2FzZSBOQUxfSURSX05fTFA6Ci0gICAgICAgIGNhc2UgTkFMX0NSQV9OVVQ6Ci0gICAgICAgIGNhc2UgTkFMX1JBRExfTjoKLSAgICAgICAgY2FzZSBOQUxfUkFETF9SOgotICAgICAgICBjYXNlIE5BTF9SQVNMX046Ci0gICAgICAgIGNhc2UgTkFMX1JBU0xfUjoKLSAgICAgICAgICAgIGlmIChidWYgPT0gYXZjdHgtPmV4dHJhZGF0YSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBOQUwgdW5pdDogJWRcbiIsIG5hbC0+dHlwZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoZXZjX3BhcnNlX3NsaWNlX2hlYWRlcihzLCBuYWwsIGF2Y3R4KTsKKyAgICAgICAgY2FzZSBIRVZDX05BTF9WUFM6CisgICAgICAgICAgICBmZl9oZXZjX2RlY29kZV9uYWxfdnBzKGdiLCBhdmN0eCwgcHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgSEVWQ19OQUxfU1BTOgorICAgICAgICAgICAgZmZfaGV2Y19kZWNvZGVfbmFsX3NwcyhnYiwgYXZjdHgsIHBzLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhFVkNfTkFMX1BQUzoKKyAgICAgICAgICAgIGZmX2hldmNfZGVjb2RlX25hbF9wcHMoZ2IsIGF2Y3R4LCBwcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIRVZDX05BTF9TRUlfUFJFRklYOgorICAgICAgICBjYXNlIEhFVkNfTkFMX1NFSV9TVUZGSVg6CisgICAgICAgICAgICBmZl9oZXZjX2RlY29kZV9uYWxfc2VpKGdiLCBhdmN0eCwgc2VpLCBwcywgbmFsLT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEhFVkNfTkFMX1RSQUlMX046CisgICAgICAgIGNhc2UgSEVWQ19OQUxfVFJBSUxfUjoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9UU0FfTjoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9UU0FfUjoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9TVFNBX046CisgICAgICAgIGNhc2UgSEVWQ19OQUxfU1RTQV9SOgorICAgICAgICBjYXNlIEhFVkNfTkFMX0JMQV9XX0xQOgorICAgICAgICBjYXNlIEhFVkNfTkFMX0JMQV9XX1JBREw6CisgICAgICAgIGNhc2UgSEVWQ19OQUxfQkxBX05fTFA6CisgICAgICAgIGNhc2UgSEVWQ19OQUxfSURSX1dfUkFETDoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9JRFJfTl9MUDoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9DUkFfTlVUOgorICAgICAgICBjYXNlIEhFVkNfTkFMX1JBRExfTjoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9SQURMX1I6CisgICAgICAgIGNhc2UgSEVWQ19OQUxfUkFTTF9OOgorICAgICAgICBjYXNlIEhFVkNfTkFMX1JBU0xfUjoKKyAgICAgICAgICAgIHJldCA9IGhldmNfcGFyc2Vfc2xpY2VfaGVhZGVyKHMsIG5hbCwgYXZjdHgpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICByZXR1cm4gMDsKKyAgICAvKiBkaWRuJ3QgZmluZCBhIHBpY3R1cmUhICovCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIHBpY3R1cmUgaW4gYWNjZXNzIHVuaXRcbiIpOworICAgIHJldHVybiAtMTsKIH0KLSNlbmRpZgogCiAvKioKICAqIEZpbmQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZSBpbiB0aGUgYml0c3RyZWFtLgpAQCAtMTM2LDggKzI1MCw5IEBACiBzdGF0aWMgaW50IGhldmNfZmluZF9mcmFtZV9lbmQoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpCiB7CisgICAgSEVWQ1BhcnNlckNvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKKyAgICBQYXJzZUNvbnRleHQgICAgICAgKnBjID0gJmN0eC0+cGM7CiAgICAgaW50IGk7Ci0gICAgUGFyc2VDb250ZXh0ICpwYyA9IHMtPnByaXZfZGF0YTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBidWZfc2l6ZTsgaSsrKSB7CiAgICAgICAgIGludCBudXQ7CkBAIC0xNDksMTQgKzI2NCwxNCBAQAogCiAgICAgICAgIG51dCA9IChwYy0+c3RhdGU2NCA+PiAyICogOCArIDEpICYgMHgzRjsKICAgICAgICAgLy8gQmVnaW5uaW5nIG9mIGFjY2VzcyB1bml0Ci0gICAgICAgIGlmICgobnV0ID49IE5BTF9WUFMgJiYgbnV0IDw9IE5BTF9BVUQpIHx8IG51dCA9PSBOQUxfU0VJX1BSRUZJWCB8fAorICAgICAgICBpZiAoKG51dCA+PSBIRVZDX05BTF9WUFMgJiYgbnV0IDw9IEhFVkNfTkFMX0VPQl9OVVQpIHx8IG51dCA9PSBIRVZDX05BTF9TRUlfUFJFRklYIHx8CiAgICAgICAgICAgICAobnV0ID49IDQxICYmIG51dCA8PSA0NCkgfHwgKG51dCA+PSA0OCAmJiBudXQgPD0gNTUpKSB7CiAgICAgICAgICAgICBpZiAocGMtPmZyYW1lX3N0YXJ0X2ZvdW5kKSB7CiAgICAgICAgICAgICAgICAgcGMtPmZyYW1lX3N0YXJ0X2ZvdW5kID0gMDsKICAgICAgICAgICAgICAgICByZXR1cm4gaSAtIDU7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobnV0IDw9IE5BTF9SQVNMX1IgfHwKLSAgICAgICAgICAgICAgICAgICAobnV0ID49IE5BTF9CTEFfV19MUCAmJiBudXQgPD0gTkFMX0NSQV9OVVQpKSB7CisgICAgICAgIH0gZWxzZSBpZiAobnV0IDw9IEhFVkNfTkFMX1JBU0xfUiB8fAorICAgICAgICAgICAgICAgICAgIChudXQgPj0gSEVWQ19OQUxfQkxBX1dfTFAgJiYgbnV0IDw9IEhFVkNfTkFMX0NSQV9OVVQpKSB7CiAgICAgICAgICAgICBpbnQgZmlyc3Rfc2xpY2Vfc2VnbWVudF9pbl9waWNfZmxhZyA9IGJ1ZltpXSA+PiA3OwogICAgICAgICAgICAgaWYgKGZpcnN0X3NsaWNlX3NlZ21lbnRfaW5fcGljX2ZsYWcpIHsKICAgICAgICAgICAgICAgICBpZiAoIXBjLT5mcmFtZV9zdGFydF9mb3VuZCkgewpAQCAtMTcyLDIxMyArMjg3LDcgQEAKICAgICByZXR1cm4gRU5EX05PVF9GT1VORDsKIH0KIAotI2lmIEFEVkFOQ0VEX1BBUlNFUgotLyoqCi0gKiBQYXJzZSBOQUwgdW5pdHMgb2YgZm91bmQgcGljdHVyZSBhbmQgZGVjb2RlIHNvbWUgYmFzaWMgaW5mb3JtYXRpb24uCi0gKgotICogQHBhcmFtIHMgcGFyc2VyIGNvbnRleHQuCi0gKiBAcGFyYW0gYXZjdHggY29kZWMgY29udGV4dC4KLSAqIEBwYXJhbSBidWYgYnVmZmVyIHdpdGggZmllbGQvZnJhbWUgZGF0YS4KLSAqIEBwYXJhbSBidWZfc2l6ZSBzaXplIG9mIHRoZSBidWZmZXIuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IHBhcnNlX25hbF91bml0cyhBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgSEVWQ1BhcnNlckNvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKLSAgICBIRVZDQ29udGV4dCAgICAgICAqaCAgID0gJmN0eC0+aDsKLSAgICBHZXRCaXRDb250ZXh0ICAgICAgKmdiOwotICAgIFNsaWNlSGVhZGVyICAgICAgICAqc2ggPSAmaC0+c2g7Ci0gICAgSEVWQ1BhcmFtU2V0cyAqcHMgPSAmaC0+cHM7Ci0gICAgSEVWQ1BhY2tldCAgICpwa3QgPSAmY3R4LT5wa3Q7Ci0gICAgY29uc3QgdWludDhfdCAqYnVmX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOwotICAgIGludCBzdGF0ZSA9IC0xLCBpOwotICAgIEhFVkNOQUwgKm5hbDsKLSAgICBpbnQgaXNfZ2xvYmFsID0gYnVmID09IGF2Y3R4LT5leHRyYWRhdGE7Ci0KLSAgICBpZiAoIWgtPkhFVkNsYykKLSAgICAgICAgaC0+SEVWQ2xjID0gYXZfbWFsbG9jeihzaXplb2YoSEVWQ0xvY2FsQ29udGV4dCkpOwotICAgIGlmICghaC0+SEVWQ2xjKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZ2IgPSAmaC0+SEVWQ2xjLT5nYjsKLQotICAgIC8qIHNldCBzb21lIHNhbmUgZGVmYXVsdCB2YWx1ZXMgKi8KLSAgICBzLT5waWN0X3R5cGUgICAgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOwotICAgIHMtPmtleV9mcmFtZSAgICAgICAgID0gMDsKLSAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSA9IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX1VOS05PV047Ci0KLSAgICBoLT5hdmN0eCA9IGF2Y3R4OwotCi0gICAgaWYgKCFidWZfc2l6ZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAocGt0LT5uYWxzX2FsbG9jYXRlZCA8IDEpIHsKLSAgICAgICAgSEVWQ05BTCAqdG1wID0gYXZfcmVhbGxvY19hcnJheShwa3QtPm5hbHMsIDEsIHNpemVvZigqdG1wKSk7Ci0gICAgICAgIGlmICghdG1wKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgcGt0LT5uYWxzID0gdG1wOwotICAgICAgICBtZW1zZXQocGt0LT5uYWxzLCAwLCBzaXplb2YoKnRtcCkpOwotICAgICAgICBwa3QtPm5hbHNfYWxsb2NhdGVkID0gMTsKLSAgICB9Ci0KLSAgICBuYWwgPSAmcGt0LT5uYWxzWzBdOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBpbnQgc3JjX2xlbmd0aCwgY29uc3VtZWQ7Ci0gICAgICAgIGludCByZXQ7Ci0gICAgICAgIGJ1ZiA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUoYnVmLCBidWZfZW5kLCAmc3RhdGUpOwotICAgICAgICBpZiAoLS1idWYgKyAyID49IGJ1Zl9lbmQpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3JjX2xlbmd0aCA9IGJ1Zl9lbmQgLSBidWY7Ci0KLSAgICAgICAgaC0+bmFsX3VuaXRfdHlwZSA9ICgqYnVmID4+IDEpICYgMHgzZjsKLSAgICAgICAgaC0+dGVtcG9yYWxfaWQgICA9ICgqKGJ1ZiArIDEpICYgMHgwNykgLSAxOwotICAgICAgICBpZiAoaC0+bmFsX3VuaXRfdHlwZSA8PSBOQUxfQ1JBX05VVCkgewotICAgICAgICAgICAgLy8gRG8gbm90IHdhbGsgdGhlIHdob2xlIGJ1ZmZlciBqdXN0IHRvIGRlY29kZSBzbGljZSBzZWdtZW50IGhlYWRlcgotICAgICAgICAgICAgaWYgKHNyY19sZW5ndGggPiAyMCkKLSAgICAgICAgICAgICAgICBzcmNfbGVuZ3RoID0gMjA7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdW1lZCA9IGZmX2hldmNfZXh0cmFjdF9yYnNwKE5VTEwsIGJ1Ziwgc3JjX2xlbmd0aCwgbmFsKTsKLSAgICAgICAgaWYgKGNvbnN1bWVkIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBjb25zdW1lZDsKLQotICAgICAgICByZXQgPSBpbml0X2dldF9iaXRzOChnYiwgbmFsLT5kYXRhICsgMiwgbmFsLT5zaXplKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIHN3aXRjaCAoaC0+bmFsX3VuaXRfdHlwZSkgewotICAgICAgICBjYXNlIE5BTF9WUFM6Ci0gICAgICAgICAgICBmZl9oZXZjX2RlY29kZV9uYWxfdnBzKGdiLCBhdmN0eCwgcHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkFMX1NQUzoKLSAgICAgICAgICAgIGZmX2hldmNfZGVjb2RlX25hbF9zcHMoZ2IsIGF2Y3R4LCBwcywgMSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOQUxfUFBTOgotICAgICAgICAgICAgZmZfaGV2Y19kZWNvZGVfbmFsX3BwcyhnYiwgYXZjdHgsIHBzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5BTF9TRUlfUFJFRklYOgotICAgICAgICBjYXNlIE5BTF9TRUlfU1VGRklYOgotICAgICAgICAgICAgZmZfaGV2Y19kZWNvZGVfbmFsX3NlaShoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5BTF9UUkFJTF9OOgotICAgICAgICBjYXNlIE5BTF9UUkFJTF9SOgotICAgICAgICBjYXNlIE5BTF9UU0FfTjoKLSAgICAgICAgY2FzZSBOQUxfVFNBX1I6Ci0gICAgICAgIGNhc2UgTkFMX1NUU0FfTjoKLSAgICAgICAgY2FzZSBOQUxfU1RTQV9SOgotICAgICAgICBjYXNlIE5BTF9SQURMX046Ci0gICAgICAgIGNhc2UgTkFMX1JBRExfUjoKLSAgICAgICAgY2FzZSBOQUxfUkFTTF9OOgotICAgICAgICBjYXNlIE5BTF9SQVNMX1I6Ci0gICAgICAgIGNhc2UgTkFMX0JMQV9XX0xQOgotICAgICAgICBjYXNlIE5BTF9CTEFfV19SQURMOgotICAgICAgICBjYXNlIE5BTF9CTEFfTl9MUDoKLSAgICAgICAgY2FzZSBOQUxfSURSX1dfUkFETDoKLSAgICAgICAgY2FzZSBOQUxfSURSX05fTFA6Ci0gICAgICAgIGNhc2UgTkFMX0NSQV9OVVQ6Ci0KLSAgICAgICAgICAgIGlmIChpc19nbG9iYWwpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgTkFMIHVuaXQ6ICVkXG4iLCBoLT5uYWxfdW5pdF90eXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgICAgIHMtPnBpY3R1cmVfc3RydWN0dXJlID0gaC0+cGljdHVyZV9zdHJ1Y3Q7Ci0gICAgICAgICAgICBzLT5maWVsZF9vcmRlciA9IGgtPnBpY3R1cmVfc3RydWN0OwotCi0gICAgICAgICAgICBpZiAoSVNfSVJBUChoKSkgewotICAgICAgICAgICAgICAgIHMtPmtleV9mcmFtZSA9IDE7Ci0gICAgICAgICAgICAgICAgc2gtPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaC0+cHBzX2lkID0gZ2V0X3VlX2dvbG9tYihnYik7Ci0gICAgICAgICAgICBpZiAoc2gtPnBwc19pZCA+PSBNQVhfUFBTX0NPVU5UIHx8ICFwcy0+cHBzX2xpc3Rbc2gtPnBwc19pZF0pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCBzaC0+cHBzX2lkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBzLT5wcHMgPSAoSEVWQ1BQUyopcHMtPnBwc19saXN0W3NoLT5wcHNfaWRdLT5kYXRhOwotCi0gICAgICAgICAgICBpZiAocHMtPnBwcy0+c3BzX2lkID49IE1BWF9TUFNfQ09VTlQgfHwgIXBzLT5zcHNfbGlzdFtwcy0+cHBzLT5zcHNfaWRdKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTUFMgaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgcHMtPnBwcy0+c3BzX2lkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwcy0+c3BzICE9IChIRVZDU1BTKilwcy0+c3BzX2xpc3RbcHMtPnBwcy0+c3BzX2lkXS0+ZGF0YSkgewotICAgICAgICAgICAgICAgIHBzLT5zcHMgPSAoSEVWQ1NQUyopcHMtPnNwc19saXN0W3BzLT5wcHMtPnNwc19pZF0tPmRhdGE7Ci0gICAgICAgICAgICAgICAgcHMtPnZwcyA9IChIRVZDVlBTKilwcy0+dnBzX2xpc3RbcHMtPnNwcy0+dnBzX2lkXS0+ZGF0YTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFzaC0+Zmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2xpY2VfYWRkcmVzc19sZW5ndGg7Ci0KLSAgICAgICAgICAgICAgICBpZiAocHMtPnBwcy0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZykKLSAgICAgICAgICAgICAgICAgICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSAwOwotCi0gICAgICAgICAgICAgICAgc2xpY2VfYWRkcmVzc19sZW5ndGggPSBhdl9jZWlsX2xvZzJfYyhwcy0+c3BzLT5jdGJfd2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHMtPnNwcy0+Y3RiX2hlaWdodCk7Ci0gICAgICAgICAgICAgICAgc2gtPnNsaWNlX3NlZ21lbnRfYWRkciA9IGdldF9iaXRzeihnYiwgc2xpY2VfYWRkcmVzc19sZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmIChzaC0+c2xpY2Vfc2VnbWVudF9hZGRyID49IHBzLT5zcHMtPmN0Yl93aWR0aCAqIHBzLT5zcHMtPmN0Yl9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNsaWNlIHNlZ21lbnQgYWRkcmVzczogJXUuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2gtPnNsaWNlX3NlZ21lbnRfYWRkcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHNoLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnID0gMDsKLQotICAgICAgICAgICAgaWYgKHNoLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnKQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHMtPnBwcy0+bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzOyBpKyspCi0gICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgLy8gc2xpY2VfcmVzZXJ2ZWRfdW5kZXRlcm1pbmVkX2ZsYWdbXQotCi0gICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSA9IGdldF91ZV9nb2xvbWIoZ2IpOwotICAgICAgICAgICAgaWYgKCEoc2gtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSB8fCBzaC0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFIHx8Ci0gICAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFKSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBzbGljZSB0eXBlOiAlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHNoLT5zbGljZV90eXBlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9IHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UgPyBBVl9QSUNUVVJFX1RZUEVfQiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdHlwZSA9PSBQX1NMSUNFID8gQVZfUElDVFVSRV9UWVBFX1AgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJQ1RVUkVfVFlQRV9JOwotCi0gICAgICAgICAgICBpZiAocHMtPnBwcy0+b3V0cHV0X2ZsYWdfcHJlc2VudF9mbGFnKQotICAgICAgICAgICAgICAgIHNoLT5waWNfb3V0cHV0X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotCi0gICAgICAgICAgICBpZiAocHMtPnNwcy0+c2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcpCi0gICAgICAgICAgICAgICAgc2gtPmNvbG91cl9wbGFuZV9pZCA9IGdldF9iaXRzKGdiLCAyKTsKLQotICAgICAgICAgICAgaWYgKCFJU19JRFIoaCkpIHsKLSAgICAgICAgICAgICAgICBzaC0+cGljX29yZGVyX2NudF9sc2IgPSBnZXRfYml0cyhnYiwgcHMtPnNwcy0+bG9nMl9tYXhfcG9jX2xzYik7Ci0gICAgICAgICAgICAgICAgcy0+b3V0cHV0X3BpY3R1cmVfbnVtYmVyID0gaC0+cG9jID0gZmZfaGV2Y19jb21wdXRlX3BvYyhoLCBzaC0+cGljX29yZGVyX2NudF9sc2IpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcy0+b3V0cHV0X3BpY3R1cmVfbnVtYmVyID0gaC0+cG9jID0gMDsKLQotICAgICAgICAgICAgaWYgKGgtPnRlbXBvcmFsX2lkID09IDAgJiYKLSAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9UUkFJTF9OICYmCi0gICAgICAgICAgICAgICAgaC0+bmFsX3VuaXRfdHlwZSAhPSBOQUxfVFNBX04gJiYKLSAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9TVFNBX04gJiYKLSAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9SQURMX04gJiYKLSAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9SQVNMX04gJiYKLSAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9SQURMX1IgJiYKLSAgICAgICAgICAgICAgICBoLT5uYWxfdW5pdF90eXBlICE9IE5BTF9SQVNMX1IpCi0gICAgICAgICAgICAgICAgaC0+cG9jVGlkMCA9IGgtPnBvYzsKLQotICAgICAgICAgICAgcmV0dXJuIDA7IC8qIG5vIG5lZWQgdG8gZXZhbHVhdGUgdGhlIHJlc3QgKi8KLSAgICAgICAgfQotICAgICAgICBidWYgKz0gY29uc3VtZWQ7Ci0gICAgfQotICAgIC8qIGRpZG4ndCBmaW5kIGEgcGljdHVyZSEgKi8KLSAgICBpZiAoIWlzX2dsb2JhbCkKLSAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIHBpY3R1cmUgaW4gYWNjZXNzIHVuaXRcbiIpOwotICAgIHJldHVybiAtMTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGhldmNfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorc3RhdGljIGludCBoZXZjX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQogewpAQCAtMzg3LDcgKzI5Niw5IEBACiAgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZjdHgtPnBjOwogCiAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEgJiYgIWN0eC0+cGFyc2VkX2V4dHJhZGF0YSkgewotICAgICAgICBwYXJzZV9uYWxfdW5pdHMocywgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplLCBhdmN0eCk7CisgICAgICAgIGZmX2hldmNfZGVjb2RlX2V4dHJhZGF0YShhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUsICZjdHgtPnBzLCAmY3R4LT5zZWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5pc19hdmMsICZjdHgtPm5hbF9sZW5ndGhfc2l6ZSwgYXZjdHgtPmVycl9yZWNvZ25pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGF2Y3R4KTsKICAgICAgICAgY3R4LT5wYXJzZWRfZXh0cmFkYXRhID0gMTsKICAgICB9CiAKQEAgLTQyNCwxNCArMzM1LDE0IEBACiAgICAgICAgIGlmICgoc3RhdGUgPj4gOCkgIT0gU1RBUlRfQ09ERSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBudXQgPSAoc3RhdGUgPj4gMSkgJiAweDNGOwotICAgICAgICBpZiAobnV0ID09IE5BTF9WUFMpCisgICAgICAgIGlmIChudXQgPT0gSEVWQ19OQUxfVlBTKQogICAgICAgICAgICAgaGFzX3ZwcyA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKG51dCA9PSBOQUxfU1BTKQorICAgICAgICBlbHNlIGlmIChudXQgPT0gSEVWQ19OQUxfU1BTKQogICAgICAgICAgICAgaGFzX3NwcyA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKG51dCA9PSBOQUxfUFBTKQorICAgICAgICBlbHNlIGlmIChudXQgPT0gSEVWQ19OQUxfUFBTKQogICAgICAgICAgICAgaGFzX3BwcyA9IDE7Ci0gICAgICAgIGVsc2UgaWYgKChudXQgIT0gTkFMX1NFSV9QUkVGSVggfHwgaGFzX3BwcykgJiYKLSAgICAgICAgICAgICAgICAgIG51dCAhPSBOQUxfQVVEKSB7CisgICAgICAgIGVsc2UgaWYgKChudXQgIT0gSEVWQ19OQUxfU0VJX1BSRUZJWCB8fCBoYXNfcHBzKSAmJgorICAgICAgICAgICAgICAgICAgbnV0ICE9IEhFVkNfTkFMX0FVRCkgewogICAgICAgICAgICAgaWYgKGhhc192cHMgJiYgaGFzX3NwcykgewogICAgICAgICAgICAgICAgIHdoaWxlIChwdHIgLSA0ID4gYnVmICYmIHB0clstNV0gPT0gMCkKICAgICAgICAgICAgICAgICAgICAgcHRyLS07CkBAIC00NDUsMzggKzM1NiwxMCBAQAogc3RhdGljIHZvaWQgaGV2Y19wYXJzZXJfY2xvc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpCiB7CiAgICAgSEVWQ1BhcnNlckNvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKLSAgICBpbnQgaTsKIAotI2lmIEFEVkFOQ0VEX1BBUlNFUgotICAgIEhFVkNDb250ZXh0ICAqaCAgPSAmY3R4LT5oOwotCi0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGgtPnBzLnZwc19saXN0KTsgaSsrKQotICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmgtPnBzLnZwc19saXN0W2ldKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoaC0+cHMuc3BzX2xpc3QpOyBpKyspCi0gICAgICAgIGF2X2J1ZmZlcl91bnJlZigmaC0+cHMuc3BzX2xpc3RbaV0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhoLT5wcy5wcHNfbGlzdCk7IGkrKykKLSAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZoLT5wcy5wcHNfbGlzdFtpXSk7Ci0KLSAgICBoLT5wcy5zcHMgPSBOVUxMOwotCi0gICAgYXZfZnJlZXAoJmgtPkhFVkNsYyk7Ci0jZW5kaWYKLQotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjdHgtPnBzLnZwc19saXN0KTsgaSsrKQotICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+cHMudnBzX2xpc3RbaV0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjdHgtPnBzLnNwc19saXN0KTsgaSsrKQotICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+cHMuc3BzX2xpc3RbaV0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjdHgtPnBzLnBwc19saXN0KTsgaSsrKQotICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+cHMucHBzX2xpc3RbaV0pOwotCi0gICAgY3R4LT5wcy5zcHMgPSBOVUxMOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGN0eC0+cGt0Lm5hbHNfYWxsb2NhdGVkOyBpKyspIHsKLSAgICAgICAgYXZfZnJlZXAoJmN0eC0+cGt0Lm5hbHNbaV0ucmJzcF9idWZmZXIpOwotICAgICAgICBhdl9mcmVlcCgmY3R4LT5wa3QubmFsc1tpXS5za2lwcGVkX2J5dGVzX3Bvcyk7Ci0gICAgfQotICAgIGF2X2ZyZWVwKCZjdHgtPnBrdC5uYWxzKTsKLSAgICBjdHgtPnBrdC5uYWxzX2FsbG9jYXRlZCA9IDA7CisgICAgZmZfaGV2Y19wc191bmluaXQoJmN0eC0+cHMpOworICAgIGZmX2gyNjQ1X3BhY2tldF91bmluaXQoJmN0eC0+cGt0KTsKKyAgICBmZl9oZXZjX3Jlc2V0X3NlaSgmY3R4LT5zZWkpOwogCiAgICAgYXZfZnJlZXAoJmN0eC0+cGMuYnVmZmVyKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y19wcy5jIGIvbGliYXZjb2RlYy9oZXZjX3BzLmMKaW5kZXggNjRkNmUyZi4uZjg3N2ZhNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oZXZjX3BzLmMKKysrIGIvbGliYXZjb2RlYy9oZXZjX3BzLmMKQEAgLTI1LDcgKzI1LDggQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImdvbG9tYi5oIgotI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJoZXZjX2RhdGEuaCIKKyNpbmNsdWRlICJoZXZjX3BzLmgiCiAKIHN0YXRpYyBjb25zdCB1aW50OF90IGRlZmF1bHRfc2NhbGluZ19saXN0X2ludHJhW10gPSB7CiAgICAgMTYsIDE2LCAxNiwgMTYsIDE3LCAxOCwgMjEsIDI0LApAQCAtMTY5LDYgKzE3MCwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGsgPj0gRkZfQVJSQVlfRUxFTVMocnBzLT51c2VkKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtX2RlbHRhX3BvY3M6ICVkXG4iLCBrKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKICAgICAgICAgcnBzLT5udW1fZGVsdGFfcG9jcyAgICA9IGs7CiAgICAgICAgIHJwcy0+bnVtX25lZ2F0aXZlX3BpY3MgPSBrMDsKICAgICAgICAgLy8gc29ydCBpbiBpbmNyZWFzaW5nIG9yZGVyIChzbWFsbGVzdCBmaXJzdCkKQEAgLTIwNyw4ICsyMTQsOCBAQAogICAgICAgICBycHMtPm51bV9uZWdhdGl2ZV9waWNzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKICAgICAgICAgbmJfcG9zaXRpdmVfcGljcyAgICAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CiAKLSAgICAgICAgaWYgKHJwcy0+bnVtX25lZ2F0aXZlX3BpY3MgPj0gTUFYX1JFRlMgfHwKLSAgICAgICAgICAgIG5iX3Bvc2l0aXZlX3BpY3MgPj0gTUFYX1JFRlMpIHsKKyAgICAgICAgaWYgKHJwcy0+bnVtX25lZ2F0aXZlX3BpY3MgPj0gSEVWQ19NQVhfUkVGUyB8fAorICAgICAgICAgICAgbmJfcG9zaXRpdmVfcGljcyA+PSBIRVZDX01BWF9SRUZTKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IHJlZnMgaW4gYSBzaG9ydCB0ZXJtIFJQUy5cbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KQEAgLTIxOCw2ICsyMjUsMTIgQEAKICAgICAgICAgICAgIHByZXYgPSAwOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJwcy0+bnVtX25lZ2F0aXZlX3BpY3M7IGkrKykgewogICAgICAgICAgICAgICAgIGRlbHRhX3BvYyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICAgICAgICAgIGlmIChkZWx0YV9wb2MgPCAxIHx8IGRlbHRhX3BvYyA+IDMyNzY4KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgb2YgZGVsdGFfcG9jOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhX3BvYyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwcmV2IC09IGRlbHRhX3BvYzsKICAgICAgICAgICAgICAgICBycHMtPmRlbHRhX3BvY1tpXSA9IHByZXY7CiAgICAgICAgICAgICAgICAgcnBzLT51c2VkW2ldICAgICAgPSBnZXRfYml0czEoZ2IpOwpAQCAtMjI1LDYgKzIzOCwxMiBAQAogICAgICAgICAgICAgcHJldiA9IDA7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfcG9zaXRpdmVfcGljczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZGVsdGFfcG9jID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisgICAgICAgICAgICAgICAgaWYgKGRlbHRhX3BvYyA8IDEgfHwgZGVsdGFfcG9jID4gMzI3NjgpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBvZiBkZWx0YV9wb2M6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfcG9jKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHByZXYgKz0gZGVsdGFfcG9jOwogICAgICAgICAgICAgICAgIHJwcy0+ZGVsdGFfcG9jW3Jwcy0+bnVtX25lZ2F0aXZlX3BpY3MgKyBpXSA9IHByZXY7CiAgICAgICAgICAgICAgICAgcnBzLT51c2VkW3Jwcy0+bnVtX25lZ2F0aXZlX3BpY3MgKyBpXSAgICAgID0gZ2V0X2JpdHMxKGdiKTsKQEAgLTI4MCw3ICsyOTksNyBAQAogewogICAgIGludCBpOwogICAgIGlmIChkZWNvZGVfcHJvZmlsZV90aWVyX2xldmVsKGdiLCBhdmN0eCwgJnB0bC0+Z2VuZXJhbF9wdGwpIDwgMCB8fAotICAgICAgICBnZXRfYml0c19sZWZ0KGdiKSA8IDggKyA4KjIpIHsKKyAgICAgICAgZ2V0X2JpdHNfbGVmdChnYikgPCA4ICsgKDgqMiAqIChtYXhfbnVtX3N1Yl9sYXllcnMgLSAxID4gMCkpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUFRMIGluZm9ybWF0aW9uIHRvbyBzaG9ydFxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0zOTksNiArNDE4LDcgQEAKIHsKICAgICBpbnQgaSxqOwogICAgIGludCB2cHNfaWQgPSAwOworICAgIHB0cmRpZmZfdCBuYWxfc2l6ZTsKICAgICBIRVZDVlBTICp2cHM7CiAgICAgQVZCdWZmZXJSZWYgKnZwc19idWYgPSBhdl9idWZmZXJfYWxsb2N6KHNpemVvZigqdnBzKSk7CiAKQEAgLTQwOCw4ICs0MjgsMTkgQEAKIAogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRGVjb2RpbmcgVlBTXG4iKTsKIAorICAgIG5hbF9zaXplID0gZ2ItPmJ1ZmZlcl9lbmQgLSBnYi0+YnVmZmVyOworICAgIGlmIChuYWxfc2l6ZSA+IHNpemVvZih2cHMtPmRhdGEpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUcnVuY2F0aW5nIGxpa2VseSBvdmVyc2l6ZWQgVlBTICIKKyAgICAgICAgICAgICAgICIoJSJQVFJESUZGX1NQRUNJRklFUiIgPiAlIlNJWkVfU1BFQ0lGSUVSIilcbiIsCisgICAgICAgICAgICAgICBuYWxfc2l6ZSwgc2l6ZW9mKHZwcy0+ZGF0YSkpOworICAgICAgICB2cHMtPmRhdGFfc2l6ZSA9IHNpemVvZih2cHMtPmRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZwcy0+ZGF0YV9zaXplID0gbmFsX3NpemU7CisgICAgfQorICAgIG1lbWNweSh2cHMtPmRhdGEsIGdiLT5idWZmZXIsIHZwcy0+ZGF0YV9zaXplKTsKKwogICAgIHZwc19pZCA9IGdldF9iaXRzKGdiLCA0KTsKLSAgICBpZiAodnBzX2lkID49IE1BWF9WUFNfQ09VTlQpIHsKKyAgICBpZiAodnBzX2lkID49IEhFVkNfTUFYX1ZQU19DT1VOVCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCB2cHNfaWQpOwogICAgICAgICBnb3RvIGVycjsKICAgICB9CkBAIC00MjgsNyArNDU5LDcgQEAKICAgICAgICAgZ290byBlcnI7CiAgICAgfQogCi0gICAgaWYgKHZwcy0+dnBzX21heF9zdWJfbGF5ZXJzID4gTUFYX1NVQl9MQVlFUlMpIHsKKyAgICBpZiAodnBzLT52cHNfbWF4X3N1Yl9sYXllcnMgPiBIRVZDX01BWF9TVUJfTEFZRVJTKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidnBzX21heF9zdWJfbGF5ZXJzIG91dCBvZiByYW5nZTogJWRcbiIsCiAgICAgICAgICAgICAgICB2cHMtPnZwc19tYXhfc3ViX2xheWVycyk7CiAgICAgICAgIGdvdG8gZXJyOwpAQCAtNDQ1LDcgKzQ3Niw3IEBACiAgICAgICAgIHZwcy0+dnBzX251bV9yZW9yZGVyX3BpY3NbaV0gICAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CiAgICAgICAgIHZwcy0+dnBzX21heF9sYXRlbmN5X2luY3JlYXNlW2ldICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgLSAxOwogCi0gICAgICAgIGlmICh2cHMtPnZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdbaV0gPiBNQVhfRFBCX1NJWkUgfHwgIXZwcy0+dnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tpXSkgeworICAgICAgICBpZiAodnBzLT52cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nW2ldID4gSEVWQ19NQVhfRFBCX1NJWkUgfHwgIXZwcy0+dnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tpXSkgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2cHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMSBvdXQgb2YgcmFuZ2U6ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIHZwcy0+dnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tpXSAtIDEpOwogICAgICAgICAgICAgZ290byBlcnI7CkBAIC01MTksNyArNTUwLDcgQEAKIHN0YXRpYyB2b2lkIGRlY29kZV92dWkoR2V0Qml0Q29udGV4dCAqZ2IsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcGx5X2RlZmRpc3B3aW4sIEhFVkNTUFMgKnNwcykKIHsKLSAgICBWVUkgKnZ1aSAgICAgICAgICA9ICZzcHMtPnZ1aTsKKyAgICBWVUkgYmFja3VwX3Z1aSwgKnZ1aSA9ICZzcHMtPnZ1aTsKICAgICBHZXRCaXRDb250ZXh0IGJhY2t1cDsKICAgICBpbnQgc2FyX3ByZXNlbnQsIGFsdCA9IDA7CiAKQEAgLTU1NSwxMiArNTg2LDI1IEBACiAgICAgICAgICAgICB2dWktPm1hdHJpeF9jb2VmZnMgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDgpOwogCiAgICAgICAgICAgICAvLyBTZXQgaW52YWxpZCB2YWx1ZXMgdG8gInVuc3BlY2lmaWVkIgotICAgICAgICAgICAgaWYgKHZ1aS0+Y29sb3VyX3ByaW1hcmllcyA+PSBBVkNPTF9QUklfTkIpCisgICAgICAgICAgICBpZiAoIWF2X2NvbG9yX3ByaW1hcmllc19uYW1lKHZ1aS0+Y29sb3VyX3ByaW1hcmllcykpCiAgICAgICAgICAgICAgICAgdnVpLT5jb2xvdXJfcHJpbWFyaWVzID0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEOwotICAgICAgICAgICAgaWYgKHZ1aS0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWMgPj0gQVZDT0xfVFJDX05CKQorICAgICAgICAgICAgaWYgKCFhdl9jb2xvcl90cmFuc2Zlcl9uYW1lKHZ1aS0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWMpKQogICAgICAgICAgICAgICAgIHZ1aS0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWMgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQ7Ci0gICAgICAgICAgICBpZiAodnVpLT5tYXRyaXhfY29lZmZzID49IEFWQ09MX1NQQ19OQikKKyAgICAgICAgICAgIGlmICghYXZfY29sb3Jfc3BhY2VfbmFtZSh2dWktPm1hdHJpeF9jb2VmZnMpKQogICAgICAgICAgICAgICAgIHZ1aS0+bWF0cml4X2NvZWZmcyA9IEFWQ09MX1NQQ19VTlNQRUNJRklFRDsKKyAgICAgICAgICAgIGlmICh2dWktPm1hdHJpeF9jb2VmZnMgPT0gQVZDT0xfU1BDX1JHQikgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoc3BzLT5waXhfZm10KSB7CisgICAgICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgICAgICAgICAgICAgICAgIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICAgICAgICAgICAgICAgICAgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTI6CisgICAgICAgICAgICAgICAgICAgIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDEyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU3NCwyMCArNjE4LDIyIEBACiAgICAgdnVpLT5maWVsZF9zZXFfZmxhZyAgICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CiAgICAgdnVpLT5mcmFtZV9maWVsZF9pbmZvX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CiAKKyAgICAvLyBCYWNrdXAgY29udGV4dCBpbiBjYXNlIGFuIGFsdGVybmF0ZSBoZWFkZXIgaXMgZGV0ZWN0ZWQKKyAgICBtZW1jcHkoJmJhY2t1cCwgZ2IsIHNpemVvZihiYWNrdXApKTsKKyAgICBtZW1jcHkoJmJhY2t1cF92dWksIHZ1aSwgc2l6ZW9mKGJhY2t1cF92dWkpKTsKICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPj0gNjggJiYgc2hvd19iaXRzX2xvbmcoZ2IsIDIxKSA9PSAweDEwMDAwMCkgewogICAgICAgICB2dWktPmRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZyA9IDA7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGRlZmF1bHQgZGlzcGxheSB3aW5kb3dcbiIpOwogICAgIH0gZWxzZQogICAgICAgICB2dWktPmRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZyA9IGdldF9iaXRzMShnYik7Ci0gICAgLy8gQmFja3VwIGNvbnRleHQgaW4gY2FzZSBhbiBhbHRlcm5hdGUgaGVhZGVyIGlzIGRldGVjdGVkCi0gICAgbWVtY3B5KCZiYWNrdXAsIGdiLCBzaXplb2YoYmFja3VwKSk7CiAKICAgICBpZiAodnVpLT5kZWZhdWx0X2Rpc3BsYXlfd2luZG93X2ZsYWcpIHsKLSAgICAgICAgLy9UT0RPOiAqIDIgaXMgb25seSB2YWxpZCBmb3IgNDIwCi0gICAgICAgIHZ1aS0+ZGVmX2Rpc3Bfd2luLmxlZnRfb2Zmc2V0ICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogMjsKLSAgICAgICAgdnVpLT5kZWZfZGlzcF93aW4ucmlnaHRfb2Zmc2V0ICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAyOwotICAgICAgICB2dWktPmRlZl9kaXNwX3dpbi50b3Bfb2Zmc2V0ICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqIDI7Ci0gICAgICAgIHZ1aS0+ZGVmX2Rpc3Bfd2luLmJvdHRvbV9vZmZzZXQgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogMjsKKyAgICAgICAgaW50IHZlcnRfbXVsdCAgPSAxICsgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPCAyKTsKKyAgICAgICAgaW50IGhvcml6X211bHQgPSAxICsgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPCAzKTsKKyAgICAgICAgdnVpLT5kZWZfZGlzcF93aW4ubGVmdF9vZmZzZXQgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiBob3Jpel9tdWx0OworICAgICAgICB2dWktPmRlZl9kaXNwX3dpbi5yaWdodF9vZmZzZXQgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqIGhvcml6X211bHQ7CisgICAgICAgIHZ1aS0+ZGVmX2Rpc3Bfd2luLnRvcF9vZmZzZXQgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogIHZlcnRfbXVsdDsKKyAgICAgICAgdnVpLT5kZWZfZGlzcF93aW4uYm90dG9tX29mZnNldCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAgdmVydF9tdWx0OwogCiAgICAgICAgIGlmIChhcHBseV9kZWZkaXNwd2luICYmCiAgICAgICAgICAgICBhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfSUdOT1JFX0NST1ApIHsKQEAgLTYwNiwyMyArNjUyLDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKK3RpbWluZ19pbmZvOgogICAgIHZ1aS0+dnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IGdldF9iaXRzMShnYik7CiAKICAgICBpZiAodnVpLT52dWlfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7Ci0gICAgICAgIGlmKCBnZXRfYml0c19sZWZ0KGdiKSA8IDY2KSB7CisgICAgICAgIGlmKCBnZXRfYml0c19sZWZ0KGdiKSA8IDY2ICYmICFhbHQpIHsKICAgICAgICAgICAgIC8vIFRoZSBhbHRlcm5hdGUgc3ludGF4IHNlZW0gdG8gaGF2ZSB0aW1pbmcgaW5mbyBsb2NhdGVkCiAgICAgICAgICAgICAvLyBhdCB3aGVyZSBkZWZfZGlzcF93aW4gaXMgbm9ybWFsbHkgbG9jYXRlZAogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAiU3RyYW5nZSBWVUkgdGltaW5nIGluZm9ybWF0aW9uLCByZXRyeWluZy4uLlxuIik7Ci0gICAgICAgICAgICB2dWktPmRlZmF1bHRfZGlzcGxheV93aW5kb3dfZmxhZyA9IDA7Ci0gICAgICAgICAgICBtZW1zZXQoJnZ1aS0+ZGVmX2Rpc3Bfd2luLCAwLCBzaXplb2YodnVpLT5kZWZfZGlzcF93aW4pKTsKKyAgICAgICAgICAgIG1lbWNweSh2dWksICZiYWNrdXBfdnVpLCBzaXplb2YoYmFja3VwX3Z1aSkpOwogICAgICAgICAgICAgbWVtY3B5KGdiLCAmYmFja3VwLCBzaXplb2YoYmFja3VwKSk7CiAgICAgICAgICAgICBhbHQgPSAxOworICAgICAgICAgICAgZ290byB0aW1pbmdfaW5mbzsKICAgICAgICAgfQogICAgICAgICB2dWktPnZ1aV9udW1fdW5pdHNfaW5fdGljayAgICAgICAgICAgICAgID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOwogICAgICAgICB2dWktPnZ1aV90aW1lX3NjYWxlICAgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOwogICAgICAgICBpZiAoYWx0KSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiUmV0cnkgZ290ICVpLyVpIGZwc1xuIiwKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJSZXRyeSBnb3QgJSJQUkl1MzIiLyUiUFJJdTMyIiBmcHNcbiIsCiAgICAgICAgICAgICAgICAgICAgdnVpLT52dWlfdGltZV9zY2FsZSwgdnVpLT52dWlfbnVtX3VuaXRzX2luX3RpY2spOwogICAgICAgICB9CiAgICAgICAgIHZ1aS0+dnVpX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcgPSBnZXRfYml0czEoZ2IpOwpAQCAtNjM1LDYgKzY4MiwxNSBAQAogCiAgICAgdnVpLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyA9IGdldF9iaXRzMShnYik7CiAgICAgaWYgKHZ1aS0+Yml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcpIHsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgOCAmJiAhYWx0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJTdHJhbmdlIFZVSSBiaXRzdHJlYW0gcmVzdHJpY3Rpb24gaW5mb3JtYXRpb24sIHJldHJ5aW5nIgorICAgICAgICAgICAgICAgICAgICIgZnJvbSB0aW1pbmcgaW5mb3JtYXRpb24uLi5cbiIpOworICAgICAgICAgICAgbWVtY3B5KHZ1aSwgJmJhY2t1cF92dWksIHNpemVvZihiYWNrdXBfdnVpKSk7CisgICAgICAgICAgICBtZW1jcHkoZ2IsICZiYWNrdXAsIHNpemVvZihiYWNrdXApKTsKKyAgICAgICAgICAgIGFsdCA9IDE7CisgICAgICAgICAgICBnb3RvIHRpbWluZ19pbmZvOworICAgICAgICB9CiAgICAgICAgIHZ1aS0+dGlsZXNfZml4ZWRfc3RydWN0dXJlX2ZsYWcgICAgICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKTsKICAgICAgICAgdnVpLT5tb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgICAgICB2dWktPnJlc3RyaWN0ZWRfcmVmX3BpY19saXN0c19mbGFnICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CkBAIC02NDQsNiArNzAwLDE2IEBACiAgICAgICAgIHZ1aS0+bG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWwgICAgICAgICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKICAgICAgICAgdnVpLT5sb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwgICAgICAgICAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOwogICAgIH0KKworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDEgJiYgIWFsdCkgeworICAgICAgICAvLyBYWFg6IEFsdGVybmF0ZSBzeW50YXggd2hlbiBzcHNfcmFuZ2VfZXh0ZW5zaW9uX2ZsYWcgIT0gMD8KKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJPdmVycmVhZCBpbiBWVUksIHJldHJ5aW5nIGZyb20gdGltaW5nIGluZm9ybWF0aW9uLi4uXG4iKTsKKyAgICAgICAgbWVtY3B5KHZ1aSwgJmJhY2t1cF92dWksIHNpemVvZihiYWNrdXBfdnVpKSk7CisgICAgICAgIG1lbWNweShnYiwgJmJhY2t1cCwgc2l6ZW9mKGJhY2t1cCkpOworICAgICAgICBhbHQgPSAxOworICAgICAgICBnb3RvIHRpbWluZ19pbmZvOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgc2V0X2RlZmF1bHRfc2NhbGluZ19saXN0X2RhdGEoU2NhbGluZ0xpc3QgKnNsKQpAQCAtNjkyLDYgKzc1OCw3IEBACiAgICAgICAgICAgICAgICAgICogd2hpY2ggc2hvdWxkIGFscmVhZHkgYmUgaW4gdGhlIGFycmF5cy4gKi8KICAgICAgICAgICAgICAgICBpZiAoZGVsdGEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQ29weSBmcm9tIHByZXZpb3VzIGFycmF5LgorICAgICAgICAgICAgICAgICAgICBkZWx0YSAqPSAoc2l6ZV9pZCA9PSAzKSA/IDMgOiAxOwogICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4X2lkIDwgZGVsdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGRlbHRhIGluIHNjYWxpbmcgbGlzdCBkYXRhOiAlZC5cbiIsIGRlbHRhKTsKQEAgLTcyNCw3ICs3OTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2hldmNfZGlhZ19zY2FuOHg4X3hbaV07CiAKICAgICAgICAgICAgICAgICAgICAgc2NhbGluZ19saXN0X2RlbHRhX2NvZWYgPSBnZXRfc2VfZ29sb21iKGdiKTsKLSAgICAgICAgICAgICAgICAgICAgbmV4dF9jb2VmID0gKG5leHRfY29lZiArIHNjYWxpbmdfbGlzdF9kZWx0YV9jb2VmICsgMjU2KSAlIDI1NjsKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9jb2VmID0gKG5leHRfY29lZiArIDI1NlUgKyBzY2FsaW5nX2xpc3RfZGVsdGFfY29lZikgJSAyNTY7CiAgICAgICAgICAgICAgICAgICAgIHNsLT5zbFtzaXplX2lkXVttYXRyaXhfaWRdW3Bvc10gPSBuZXh0X2NvZWY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNzY0LDIyICs4MzEsMjEgQEAKICAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxMDoKLSAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMCkgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTY7CisgICAgICAgIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDApIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTEwOwogICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAxKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFAxMDsKICAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMikgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CiAgICAgICAgIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDEyOgotICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAwKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxNjsKKyAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMCkgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTI7CiAgICAgICAgIGlmIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDEpIHNwcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEyOwogICAgICAgICBpZiAoc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyKSBzcHMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMjsKICAgICAgICAgaWYgKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgc3BzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTI7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIjQ6MjowLCA0OjI6MiwgNDo0OjQgc3VwcG9ydHMgYXJlIGN1cnJlbnRseSBzcGVjaWZpZWQgZm9yIDgsIDEwIGFuZCAxMiBiaXRzLlxuIik7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgImNocm9tYV9mb3JtYXRfaWRjIGlzICVkLCBkZXB0aCBpcyAlZCIsCisgICAgICAgICAgICAgICAiVGhlIGZvbGxvd2luZyBiaXQtZGVwdGhzIGFyZSBjdXJyZW50bHkgc3BlY2lmaWVkOiA4LCA5LCAxMCBhbmQgMTIgYml0cywgIgorICAgICAgICAgICAgICAgImNocm9tYV9mb3JtYXRfaWRjIGlzICVkLCBkZXB0aCBpcyAlZFxuIiwKICAgICAgICAgICAgICAgIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMsIHNwcy0+Yml0X2RlcHRoKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtODAwLDYgKzg2Niw3IEBACiBpbnQgZmZfaGV2Y19wYXJzZV9zcHMoSEVWQ1NQUyAqc3BzLCBHZXRCaXRDb250ZXh0ICpnYiwgdW5zaWduZWQgaW50ICpzcHNfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwcGx5X2RlZmRpc3B3aW4sIEFWQnVmZmVyUmVmICoqdnBzX2xpc3QsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKKyAgICBIRVZDV2luZG93ICpvdzsKICAgICBpbnQgcmV0ID0gMDsKICAgICBpbnQgbG9nMl9kaWZmX21heF9taW5fdHJhbnNmb3JtX2Jsb2NrX3NpemU7CiAgICAgaW50IGJpdF9kZXB0aF9jaHJvbWEsIHN0YXJ0LCB2dWlfcHJlc2VudCwgc3VibGF5ZXJfb3JkZXJpbmdfaW5mbzsKQEAgLTgwOCw3ICs4NzUsNyBAQAogICAgIC8vIENvZGVkIHBhcmFtZXRlcnMKIAogICAgIHNwcy0+dnBzX2lkID0gZ2V0X2JpdHMoZ2IsIDQpOwotICAgIGlmIChzcHMtPnZwc19pZCA+PSBNQVhfVlBTX0NPVU5UKSB7CisgICAgaWYgKHNwcy0+dnBzX2lkID49IEhFVkNfTUFYX1ZQU19DT1VOVCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCBzcHMtPnZwc19pZCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KQEAgLTgyMCwxOSArODg3LDE5IEBACiAgICAgfQogCiAgICAgc3BzLT5tYXhfc3ViX2xheWVycyA9IGdldF9iaXRzKGdiLCAzKSArIDE7Ci0gICAgaWYgKHNwcy0+bWF4X3N1Yl9sYXllcnMgPiBNQVhfU1VCX0xBWUVSUykgeworICAgIGlmIChzcHMtPm1heF9zdWJfbGF5ZXJzID4gSEVWQ19NQVhfU1VCX0xBWUVSUykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInNwc19tYXhfc3ViX2xheWVycyBvdXQgb2YgcmFuZ2U6ICVkXG4iLAogICAgICAgICAgICAgICAgc3BzLT5tYXhfc3ViX2xheWVycyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIHNraXBfYml0czEoZ2IpOyAvLyB0ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcKKyAgICBzcHMtPnRlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyA9IGdldF9iaXRzKGdiLCAxKTsKIAogICAgIGlmICgocmV0ID0gcGFyc2VfcHRsKGdiLCBhdmN0eCwgJnNwcy0+cHRsLCBzcHMtPm1heF9zdWJfbGF5ZXJzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgKnNwc19pZCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7Ci0gICAgaWYgKCpzcHNfaWQgPj0gTUFYX1NQU19DT1VOVCkgeworICAgIGlmICgqc3BzX2lkID49IEhFVkNfTUFYX1NQU19DT1VOVCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCAqc3BzX2lkKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtODU2LDExICs5MjMsMTIgQEAKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmIChnZXRfYml0czEoZ2IpKSB7IC8vIHBpY19jb25mb3JtYW5jZV9mbGFnCi0gICAgICAgIC8vVE9ETzogKiAyIGlzIG9ubHkgdmFsaWQgZm9yIDQyMAotICAgICAgICBzcHMtPnBpY19jb25mX3dpbi5sZWZ0X29mZnNldCAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqIDI7Ci0gICAgICAgIHNwcy0+cGljX2NvbmZfd2luLnJpZ2h0X29mZnNldCAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogMjsKLSAgICAgICAgc3BzLT5waWNfY29uZl93aW4udG9wX29mZnNldCAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiAyOwotICAgICAgICBzcHMtPnBpY19jb25mX3dpbi5ib3R0b21fb2Zmc2V0ID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqIDI7CisgICAgICAgIGludCB2ZXJ0X211bHQgID0gMSArIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjIDwgMik7CisgICAgICAgIGludCBob3Jpel9tdWx0ID0gMSArIChzcHMtPmNocm9tYV9mb3JtYXRfaWRjIDwgMyk7CisgICAgICAgIHNwcy0+cGljX2NvbmZfd2luLmxlZnRfb2Zmc2V0ICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogaG9yaXpfbXVsdDsKKyAgICAgICAgc3BzLT5waWNfY29uZl93aW4ucmlnaHRfb2Zmc2V0ICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKiBob3Jpel9tdWx0OworICAgICAgICBzcHMtPnBpY19jb25mX3dpbi50b3Bfb2Zmc2V0ICAgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAqICB2ZXJ0X211bHQ7CisgICAgICAgIHNwcy0+cGljX2NvbmZfd2luLmJvdHRvbV9vZmZzZXQgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICogIHZlcnRfbXVsdDsKIAogICAgICAgICBpZiAoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX0lHTk9SRV9DUk9QKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKQEAgLTg4OCw2ICs5NTYsNyBAQAogICAgICAgICAgICAgICAgc3BzLT5iaXRfZGVwdGgsIGJpdF9kZXB0aF9jaHJvbWEpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CisgICAgc3BzLT5iaXRfZGVwdGhfY2hyb21hID0gYml0X2RlcHRoX2Nocm9tYTsKIAogICAgIHJldCA9IG1hcF9waXhlbF9mb3JtYXQoYXZjdHgsIHNwcyk7CiAgICAgaWYgKHJldCA8IDApCkBAIC05MDYsMTYgKzk3NSwxNiBAQAogICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOwogICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm51bV9yZW9yZGVyX3BpY3MgICAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CiAgICAgICAgIHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubWF4X2xhdGVuY3lfaW5jcmVhc2UgID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSAtIDE7Ci0gICAgICAgIGlmIChzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyA+IE1BWF9EUEJfU0laRSkgeworICAgICAgICBpZiAoc3BzLT50ZW1wb3JhbF9sYXllcltpXS5tYXhfZGVjX3BpY19idWZmZXJpbmcgPiAodW5zaWduZWQpSEVWQ19NQVhfRFBCX1NJWkUpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAic3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czEgb3V0IG9mIHJhbmdlOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyAtIDEpOworICAgICAgICAgICAgICAgICAgIHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubWF4X2RlY19waWNfYnVmZmVyaW5nIC0gMVUpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubnVtX3Jlb3JkZXJfcGljcyA+IHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubWF4X2RlY19waWNfYnVmZmVyaW5nIC0gMSkgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgInNwc19tYXhfbnVtX3Jlb3JkZXJfcGljcyBvdXQgb2YgcmFuZ2U6ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubnVtX3Jlb3JkZXJfcGljcyk7CiAgICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUgfHwKLSAgICAgICAgICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm51bV9yZW9yZGVyX3BpY3MgPiBNQVhfRFBCX1NJWkUgLSAxKSB7CisgICAgICAgICAgICAgICAgc3BzLT50ZW1wb3JhbF9sYXllcltpXS5udW1fcmVvcmRlcl9waWNzID4gSEVWQ19NQVhfRFBCX1NJWkUgLSAxKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcHMtPnRlbXBvcmFsX2xheWVyW2ldLm1heF9kZWNfcGljX2J1ZmZlcmluZyA9IHNwcy0+dGVtcG9yYWxfbGF5ZXJbaV0ubnVtX3Jlb3JkZXJfcGljcyArIDE7CkBAIC05ODEsMTAgKzEwNTAsMTAgQEAKICAgICAgICAgc3BzLT5wY20ubG9nMl9taW5fcGNtX2NiX3NpemUgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpICsgMzsKICAgICAgICAgc3BzLT5wY20ubG9nMl9tYXhfcGNtX2NiX3NpemUgPSBzcHMtPnBjbS5sb2cyX21pbl9wY21fY2Jfc2l6ZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKLSAgICAgICAgaWYgKHNwcy0+cGNtLmJpdF9kZXB0aCA+IHNwcy0+Yml0X2RlcHRoKSB7CisgICAgICAgIGlmIChGRk1BWChzcHMtPnBjbS5iaXRfZGVwdGgsIHNwcy0+cGNtLmJpdF9kZXB0aF9jaHJvbWEpID4gc3BzLT5iaXRfZGVwdGgpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJQQ00gYml0IGRlcHRoICglZCkgaXMgZ3JlYXRlciB0aGFuIG5vcm1hbCBiaXQgZGVwdGggKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICBzcHMtPnBjbS5iaXRfZGVwdGgsIHNwcy0+Yml0X2RlcHRoKTsKKyAgICAgICAgICAgICAgICAgICAiUENNIGJpdCBkZXB0aCAoJWQsICVkKSBpcyBncmVhdGVyIHRoYW4gbm9ybWFsIGJpdCBkZXB0aCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIHNwcy0+cGNtLmJpdF9kZXB0aCwgc3BzLT5wY20uYml0X2RlcHRoX2Nocm9tYSwgc3BzLT5iaXRfZGVwdGgpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KIApAQCAtOTkyLDcgKzEwNjEsNyBAQAogICAgIH0KIAogICAgIHNwcy0+bmJfc3RfcnBzID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKLSAgICBpZiAoc3BzLT5uYl9zdF9ycHMgPiBNQVhfU0hPUlRfVEVSTV9SUFNfQ09VTlQpIHsKKyAgICBpZiAoc3BzLT5uYl9zdF9ycHMgPiBIRVZDX01BWF9TSE9SVF9URVJNX1JFRl9QSUNfU0VUUykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IHNob3J0IHRlcm0gUlBTOiAlZC5cbiIsCiAgICAgICAgICAgICAgICBzcHMtPm5iX3N0X3Jwcyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtMTAwNiw4ICsxMDc1LDggQEAKICAgICBzcHMtPmxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgIGlmIChzcHMtPmxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcpIHsKICAgICAgICAgc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7Ci0gICAgICAgIGlmIChzcHMtPm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzID4gMzFVKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzICVkIGlzIG91dCBvZiByYW5nZS5cbiIsCisgICAgICAgIGlmIChzcHMtPm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzID4gSEVWQ19NQVhfTE9OR19URVJNX1JFRl9QSUNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGxvbmcgdGVybSByZWYgcGljczogJWQuXG4iLAogICAgICAgICAgICAgICAgICAgIHNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KQEAgLTEwMzEsNyArMTEwMCw2IEBACiAgICAgICAgIHNraXBfYml0cyhnYiwgNyk7IC8vc3BzX2V4dGVuc2lvbl83Yml0cyA9IGdldF9iaXRzKGdiLCA3KTsKICAgICAgICAgaWYgKHNwc19leHRlbnNpb25fZmxhZ1swXSkgewogICAgICAgICAgICAgaW50IGV4dGVuZGVkX3ByZWNpc2lvbl9wcm9jZXNzaW5nX2ZsYWc7Ci0gICAgICAgICAgICBpbnQgaGlnaF9wcmVjaXNpb25fb2Zmc2V0c19lbmFibGVkX2ZsYWc7CiAgICAgICAgICAgICBpbnQgY2FiYWNfYnlwYXNzX2FsaWdubWVudF9lbmFibGVkX2ZsYWc7CiAKICAgICAgICAgICAgIHNwcy0+dHJhbnNmb3JtX3NraXBfcm90YXRpb25fZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKQEAgLTEwNDYsOCArMTExNCw4IEBACiAgICAgICAgICAgICAgICAgICAgImV4dGVuZGVkX3ByZWNpc2lvbl9wcm9jZXNzaW5nX2ZsYWcgbm90IHlldCBpbXBsZW1lbnRlZFxuIik7CiAKICAgICAgICAgICAgIHNwcy0+aW50cmFfc21vb3RoaW5nX2Rpc2FibGVkX2ZsYWcgICAgICAgPSBnZXRfYml0czEoZ2IpOwotICAgICAgICAgICAgaGlnaF9wcmVjaXNpb25fb2Zmc2V0c19lbmFibGVkX2ZsYWcgID0gZ2V0X2JpdHMxKGdiKTsKLSAgICAgICAgICAgIGlmIChoaWdoX3ByZWNpc2lvbl9vZmZzZXRzX2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgIHNwcy0+aGlnaF9wcmVjaXNpb25fb2Zmc2V0c19lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgaWYgKHNwcy0+aGlnaF9wcmVjaXNpb25fb2Zmc2V0c19lbmFibGVkX2ZsYWcpCiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAiaGlnaF9wcmVjaXNpb25fb2Zmc2V0c19lbmFibGVkX2ZsYWcgbm90IHlldCBpbXBsZW1lbnRlZFxuIik7CiAKQEAgLTEwNjUsMzAgKzExMzMsMjEgQEAKICAgICAgICAgc3BzLT5vdXRwdXRfd2luZG93LnRvcF9vZmZzZXQgICAgKz0gc3BzLT52dWkuZGVmX2Rpc3Bfd2luLnRvcF9vZmZzZXQ7CiAgICAgICAgIHNwcy0+b3V0cHV0X3dpbmRvdy5ib3R0b21fb2Zmc2V0ICs9IHNwcy0+dnVpLmRlZl9kaXNwX3dpbi5ib3R0b21fb2Zmc2V0OwogICAgIH0KLSAgICBpZiAoc3BzLT5vdXRwdXRfd2luZG93LmxlZnRfb2Zmc2V0ICYgKDB4MUYgPj4gKHNwcy0+cGl4ZWxfc2hpZnQpKSAmJgotICAgICAgICAhKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfVU5BTElHTkVEKSkgewotICAgICAgICBzcHMtPm91dHB1dF93aW5kb3cubGVmdF9vZmZzZXQgJj0gfigweDFGID4+IChzcHMtPnBpeGVsX3NoaWZ0KSk7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJSZWR1Y2luZyBsZWZ0IG91dHB1dCB3aW5kb3cgdG8gJWQgIgotICAgICAgICAgICAgICAgImNocm9tYSBzYW1wbGVzIHRvIHByZXNlcnZlIGFsaWdubWVudC5cbiIsCi0gICAgICAgICAgICAgICBzcHMtPm91dHB1dF93aW5kb3cubGVmdF9vZmZzZXQpOwotICAgIH0KLSAgICBzcHMtPm91dHB1dF93aWR0aCAgPSBzcHMtPndpZHRoIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoc3BzLT5vdXRwdXRfd2luZG93LmxlZnRfb2Zmc2V0ICsgc3BzLT5vdXRwdXRfd2luZG93LnJpZ2h0X29mZnNldCk7Ci0gICAgc3BzLT5vdXRwdXRfaGVpZ2h0ID0gc3BzLT5oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgICAgIChzcHMtPm91dHB1dF93aW5kb3cudG9wX29mZnNldCArIHNwcy0+b3V0cHV0X3dpbmRvdy5ib3R0b21fb2Zmc2V0KTsKLSAgICBpZiAoc3BzLT53aWR0aCAgPD0gc3BzLT5vdXRwdXRfd2luZG93LmxlZnRfb2Zmc2V0ICsgKGludDY0X3Qpc3BzLT5vdXRwdXRfd2luZG93LnJpZ2h0X29mZnNldCAgfHwKLSAgICAgICAgc3BzLT5oZWlnaHQgPD0gc3BzLT5vdXRwdXRfd2luZG93LnRvcF9vZmZzZXQgICsgKGludDY0X3Qpc3BzLT5vdXRwdXRfd2luZG93LmJvdHRvbV9vZmZzZXQpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgdmlzaWJsZSBmcmFtZSBkaW1lbnNpb25zOiAlZHglZC5cbiIsCi0gICAgICAgICAgICAgICBzcHMtPm91dHB1dF93aWR0aCwgc3BzLT5vdXRwdXRfaGVpZ2h0KTsKKworICAgIG93ID0gJnNwcy0+b3V0cHV0X3dpbmRvdzsKKyAgICBpZiAob3ctPmxlZnRfb2Zmc2V0ID49IElOVF9NQVggLSBvdy0+cmlnaHRfb2Zmc2V0ICAgICB8fAorICAgICAgICBvdy0+dG9wX29mZnNldCAgPj0gSU5UX01BWCAtIG93LT5ib3R0b21fb2Zmc2V0ICAgIHx8CisgICAgICAgIG93LT5sZWZ0X29mZnNldCArIG93LT5yaWdodF9vZmZzZXQgID49IHNwcy0+d2lkdGggfHwKKyAgICAgICAgb3ctPnRvcF9vZmZzZXQgICsgb3ctPmJvdHRvbV9vZmZzZXQgPj0gc3BzLT5oZWlnaHQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgY3JvcHBpbmcgb2Zmc2V0czogJXUvJXUvJXUvJXVcbiIsCisgICAgICAgICAgICAgICBvdy0+bGVmdF9vZmZzZXQsIG93LT5yaWdodF9vZmZzZXQsIG93LT50b3Bfb2Zmc2V0LCBvdy0+Ym90dG9tX29mZnNldCk7CiAgICAgICAgIGlmIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkgewogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICJEaXNwbGF5aW5nIHRoZSB3aG9sZSB2aWRlbyBzdXJmYWNlLlxuIik7CisgICAgICAgIG1lbXNldChvdywgMCwgc2l6ZW9mKCpvdykpOwogICAgICAgICBtZW1zZXQoJnNwcy0+cGljX2NvbmZfd2luLCAwLCBzaXplb2Yoc3BzLT5waWNfY29uZl93aW4pKTsKLSAgICAgICAgbWVtc2V0KCZzcHMtPm91dHB1dF93aW5kb3csIDAsIHNpemVvZihzcHMtPm91dHB1dF93aW5kb3cpKTsKLSAgICAgICAgc3BzLT5vdXRwdXRfd2lkdGggICAgICAgICAgICAgICA9IHNwcy0+d2lkdGg7Ci0gICAgICAgIHNwcy0+b3V0cHV0X2hlaWdodCAgICAgICAgICAgICAgPSBzcHMtPmhlaWdodDsKICAgICB9CiAKICAgICAvLyBJbmZlcnJlZCBwYXJhbWV0ZXJzCkBAIC0xMDk2LDcgKzExNTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHNwcy0+bG9nMl9kaWZmX21heF9taW5fY29kaW5nX2Jsb2NrX3NpemU7CiAgICAgc3BzLT5sb2cyX21pbl9wdV9zaXplID0gc3BzLT5sb2cyX21pbl9jYl9zaXplIC0gMTsKIAotICAgIGlmIChzcHMtPmxvZzJfY3RiX3NpemUgPiBNQVhfTE9HMl9DVEJfU0laRSkgeworICAgIGlmIChzcHMtPmxvZzJfY3RiX3NpemUgPiBIRVZDX01BWF9MT0cyX0NUQl9TSVpFKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ1RCIHNpemUgb3V0IG9mIHJhbmdlOiAyXiVkXG4iLCBzcHMtPmxvZzJfY3RiX3NpemUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC0xMTYyLDYgKzEyMjEsNyBAQAogICAgIEFWQnVmZmVyUmVmICpzcHNfYnVmID0gYXZfYnVmZmVyX2FsbG9jeihzaXplb2YoKnNwcykpOwogICAgIHVuc2lnbmVkIGludCBzcHNfaWQ7CiAgICAgaW50IHJldDsKKyAgICBwdHJkaWZmX3QgbmFsX3NpemU7CiAKICAgICBpZiAoIXNwc19idWYpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0xMTY5LDYgKzEyMjksMTcgQEAKIAogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRGVjb2RpbmcgU1BTXG4iKTsKIAorICAgIG5hbF9zaXplID0gZ2ItPmJ1ZmZlcl9lbmQgLSBnYi0+YnVmZmVyOworICAgIGlmIChuYWxfc2l6ZSA+IHNpemVvZihzcHMtPmRhdGEpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUcnVuY2F0aW5nIGxpa2VseSBvdmVyc2l6ZWQgU1BTICIKKyAgICAgICAgICAgICAgICIoJSJQVFJESUZGX1NQRUNJRklFUiIgPiAlIlNJWkVfU1BFQ0lGSUVSIilcbiIsCisgICAgICAgICAgICAgICBuYWxfc2l6ZSwgc2l6ZW9mKHNwcy0+ZGF0YSkpOworICAgICAgICBzcHMtPmRhdGFfc2l6ZSA9IHNpemVvZihzcHMtPmRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwcy0+ZGF0YV9zaXplID0gbmFsX3NpemU7CisgICAgfQorICAgIG1lbWNweShzcHMtPmRhdGEsIGdiLT5idWZmZXIsIHNwcy0+ZGF0YV9zaXplKTsKKwogICAgIHJldCA9IGZmX2hldmNfcGFyc2Vfc3BzKHNwcywgZ2IsICZzcHNfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlfZGVmZGlzcHdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcy0+dnBzX2xpc3QsIGF2Y3R4KTsKQEAgLTExODIsNyArMTI1Myw4IEBACiAgICAgICAgICAgICAgICAiUGFyc2VkIFNQUzogaWQgJWQ7IGNvZGVkIHd4aDogJWR4JWQ7ICIKICAgICAgICAgICAgICAgICJjcm9wcGVkIHd4aDogJWR4JWQ7IHBpeF9mbXQ6ICVzLlxuIiwKICAgICAgICAgICAgICAgIHNwc19pZCwgc3BzLT53aWR0aCwgc3BzLT5oZWlnaHQsCi0gICAgICAgICAgICAgICBzcHMtPm91dHB1dF93aWR0aCwgc3BzLT5vdXRwdXRfaGVpZ2h0LAorICAgICAgICAgICAgICAgc3BzLT53aWR0aCAtIChzcHMtPm91dHB1dF93aW5kb3cubGVmdF9vZmZzZXQgKyBzcHMtPm91dHB1dF93aW5kb3cucmlnaHRfb2Zmc2V0KSwKKyAgICAgICAgICAgICAgIHNwcy0+aGVpZ2h0IC0gKHNwcy0+b3V0cHV0X3dpbmRvdy50b3Bfb2Zmc2V0ICsgc3BzLT5vdXRwdXRfd2luZG93LmJvdHRvbV9vZmZzZXQpLAogICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShzcHMtPnBpeF9mbXQpKTsKICAgICB9CiAKQEAgLTEyMzAsNyArMTMwMiw3IEBACiAgICAgaWYgKHBwcy0+Y2hyb21hX3FwX29mZnNldF9saXN0X2VuYWJsZWRfZmxhZykgewogICAgICAgICBwcHMtPmRpZmZfY3VfY2hyb21hX3FwX29mZnNldF9kZXB0aCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CiAgICAgICAgIHBwcy0+Y2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czEgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOwotICAgICAgICBpZiAocHBzLT5jaHJvbWFfcXBfb2Zmc2V0X2xpc3RfbGVuX21pbnVzMSAmJiBwcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9sZW5fbWludXMxID49IDUpIHsKKyAgICAgICAgaWYgKHBwcy0+Y2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czEgPiA1KSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiY2hyb21hX3FwX29mZnNldF9saXN0X2xlbl9taW51czEgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIFswLCA1XS5cbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC0xMjUxLDYgKzEzMjMsMTEgQEAKICAgICBwcHMtPmxvZzJfc2FvX29mZnNldF9zY2FsZV9sdW1hID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKICAgICBwcHMtPmxvZzJfc2FvX29mZnNldF9zY2FsZV9jaHJvbWEgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOwogCisgICAgaWYgKCAgIHBwcy0+bG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2x1bWEgICA+IEZGTUFYKHNwcy0+Yml0X2RlcHRoICAgICAgICAtIDEwLCAwKQorICAgICAgICB8fCBwcHMtPmxvZzJfc2FvX29mZnNldF9zY2FsZV9jaHJvbWEgPiBGRk1BWChzcHMtPmJpdF9kZXB0aF9jaHJvbWEgLSAxMCwgMCkKKyAgICApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgcmV0dXJuKDApOwogfQogCkBAIC0xMzkyLDYgKzE0NjksOCBAQAogICAgIEhFVkNTUFMgICAgICAqc3BzID0gTlVMTDsKICAgICBpbnQgaSwgcmV0ID0gMDsKICAgICB1bnNpZ25lZCBpbnQgcHBzX2lkID0gMDsKKyAgICBwdHJkaWZmX3QgbmFsX3NpemU7CisgICAgdW5zaWduZWQgbG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbF9taW51czI7CiAKICAgICBBVkJ1ZmZlclJlZiAqcHBzX2J1ZjsKICAgICBIRVZDUFBTICpwcHMgPSBhdl9tYWxsb2N6KHNpemVvZigqcHBzKSk7CkBAIC0xNDA4LDYgKzE0ODcsMTcgQEAKIAogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRGVjb2RpbmcgUFBTXG4iKTsKIAorICAgIG5hbF9zaXplID0gZ2ItPmJ1ZmZlcl9lbmQgLSBnYi0+YnVmZmVyOworICAgIGlmIChuYWxfc2l6ZSA+IHNpemVvZihwcHMtPmRhdGEpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUcnVuY2F0aW5nIGxpa2VseSBvdmVyc2l6ZWQgUFBTICIKKyAgICAgICAgICAgICAgICIoJSJQVFJESUZGX1NQRUNJRklFUiIgPiAlIlNJWkVfU1BFQ0lGSUVSIilcbiIsCisgICAgICAgICAgICAgICBuYWxfc2l6ZSwgc2l6ZW9mKHBwcy0+ZGF0YSkpOworICAgICAgICBwcHMtPmRhdGFfc2l6ZSA9IHNpemVvZihwcHMtPmRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBwcy0+ZGF0YV9zaXplID0gbmFsX3NpemU7CisgICAgfQorICAgIG1lbWNweShwcHMtPmRhdGEsIGdiLT5idWZmZXIsIHBwcy0+ZGF0YV9zaXplKTsKKwogICAgIC8vIERlZmF1bHQgdmFsdWVzCiAgICAgcHBzLT5sb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnID0gMTsKICAgICBwcHMtPm51bV90aWxlX2NvbHVtbnMgICAgICAgICAgICAgICAgICAgICAgPSAxOwpAQCAtMTQyMCwxMyArMTUxMCwxMyBAQAogCiAgICAgLy8gQ29kZWQgcGFyYW1ldGVycwogICAgIHBwc19pZCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7Ci0gICAgaWYgKHBwc19pZCA+PSBNQVhfUFBTX0NPVU5UKSB7CisgICAgaWYgKHBwc19pZCA+PSBIRVZDX01BWF9QUFNfQ09VTlQpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQUFMgaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgcHBzX2lkKTsKICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgZ290byBlcnI7CiAgICAgfQogICAgIHBwcy0+c3BzX2lkID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKLSAgICBpZiAocHBzLT5zcHNfaWQgPj0gTUFYX1NQU19DT1VOVCkgeworICAgIGlmIChwcHMtPnNwc19pZCA+PSBIRVZDX01BWF9TUFNfQ09VTlQpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTUFMgaWQgb3V0IG9mIHJhbmdlOiAlZFxuIiwgcHBzLT5zcHNfaWQpOwogICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBnb3RvIGVycjsKQEAgLTE1NTEsMjAgKzE2NDEsMjIgQEAKICAgICAgICAgcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9lbmFibGVkX2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogICAgICAgICBwcHMtPmRpc2FibGVfZGJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CiAgICAgICAgIGlmICghcHBzLT5kaXNhYmxlX2RiZikgewotICAgICAgICAgICAgcHBzLT5iZXRhX29mZnNldCA9IGdldF9zZV9nb2xvbWIoZ2IpICogMjsKLSAgICAgICAgICAgIHBwcy0+dGNfb2Zmc2V0ID0gZ2V0X3NlX2dvbG9tYihnYikgKiAyOwotICAgICAgICAgICAgaWYgKHBwcy0+YmV0YV9vZmZzZXQvMiA8IC02IHx8IHBwcy0+YmV0YV9vZmZzZXQvMiA+IDYpIHsKKyAgICAgICAgICAgIGludCBiZXRhX29mZnNldF9kaXYyID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICBpbnQgdGNfb2Zmc2V0X2RpdjIgICA9IGdldF9zZV9nb2xvbWIoZ2IpIDsKKyAgICAgICAgICAgIGlmIChiZXRhX29mZnNldF9kaXYyIDwgLTYgfHwgYmV0YV9vZmZzZXRfZGl2MiA+IDYpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBwc19iZXRhX29mZnNldF9kaXYyIG91dCBvZiByYW5nZTogJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHBwcy0+YmV0YV9vZmZzZXQvMik7CisgICAgICAgICAgICAgICAgICAgICAgIGJldGFfb2Zmc2V0X2RpdjIpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocHBzLT50Y19vZmZzZXQvMiA8IC02IHx8IHBwcy0+dGNfb2Zmc2V0LzIgPiA2KSB7CisgICAgICAgICAgICBpZiAodGNfb2Zmc2V0X2RpdjIgPCAtNiB8fCB0Y19vZmZzZXRfZGl2MiA+IDYpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBwc190Y19vZmZzZXRfZGl2MiBvdXQgb2YgcmFuZ2U6ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBwcHMtPnRjX29mZnNldC8yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgdGNfb2Zmc2V0X2RpdjIpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBwcHMtPmJldGFfb2Zmc2V0ID0gMiAqIGJldGFfb2Zmc2V0X2RpdjI7CisgICAgICAgICAgICBwcHMtPnRjX29mZnNldCAgID0gMiAqICAgdGNfb2Zmc2V0X2RpdjI7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE1NzYsMTMgKzE2NjgsMTQgQEAKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KICAgICBwcHMtPmxpc3RzX21vZGlmaWNhdGlvbl9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwotICAgIHBwcy0+bG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbCAgICAgICA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAyOwotICAgIGlmIChwcHMtPmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWwgPiBzcHMtPmxvZzJfY3RiX3NpemUpIHsKKyAgICBsb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsX21pbnVzMiAgICAgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgIGlmIChsb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsX21pbnVzMiA+IHNwcy0+bG9nMl9jdGJfc2l6ZSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyIG91dCBvZiByYW5nZTogJWRcbiIsCi0gICAgICAgICAgICAgICBwcHMtPmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWwgLSAyKTsKKyAgICAgICAgICAgICAgIGxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyKTsKICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgZ290byBlcnI7CiAgICAgfQorICAgIHBwcy0+bG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbCAgICAgICA9IGxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyICsgMjsKIAogICAgIHBwcy0+c2xpY2VfaGVhZGVyX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWcgPSBnZXRfYml0czEoZ2IpOwogCkBAIC0xNjE0LDMgKzE3MDcsNDIgQEAKICAgICBhdl9idWZmZXJfdW5yZWYoJnBwc19idWYpOwogICAgIHJldHVybiByZXQ7CiB9CisKK3ZvaWQgZmZfaGV2Y19wc191bmluaXQoSEVWQ1BhcmFtU2V0cyAqcHMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocHMtPnZwc19saXN0KTsgaSsrKQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnBzLT52cHNfbGlzdFtpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHBzLT5zcHNfbGlzdCk7IGkrKykKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZwcy0+c3BzX2xpc3RbaV0pOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhwcy0+cHBzX2xpc3QpOyBpKyspCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcHMtPnBwc19saXN0W2ldKTsKKworICAgIHBzLT5zcHMgPSBOVUxMOworICAgIHBzLT5wcHMgPSBOVUxMOworICAgIHBzLT52cHMgPSBOVUxMOworfQorCitpbnQgZmZfaGV2Y19jb21wdXRlX3BvYyhjb25zdCBIRVZDU1BTICpzcHMsIGludCBwb2NUaWQwLCBpbnQgcG9jX2xzYiwgaW50IG5hbF91bml0X3R5cGUpCit7CisgICAgaW50IG1heF9wb2NfbHNiICA9IDEgPDwgc3BzLT5sb2cyX21heF9wb2NfbHNiOworICAgIGludCBwcmV2X3BvY19sc2IgPSBwb2NUaWQwICUgbWF4X3BvY19sc2I7CisgICAgaW50IHByZXZfcG9jX21zYiA9IHBvY1RpZDAgLSBwcmV2X3BvY19sc2I7CisgICAgaW50IHBvY19tc2I7CisKKyAgICBpZiAocG9jX2xzYiA8IHByZXZfcG9jX2xzYiAmJiBwcmV2X3BvY19sc2IgLSBwb2NfbHNiID49IG1heF9wb2NfbHNiIC8gMikKKyAgICAgICAgcG9jX21zYiA9IHByZXZfcG9jX21zYiArIG1heF9wb2NfbHNiOworICAgIGVsc2UgaWYgKHBvY19sc2IgPiBwcmV2X3BvY19sc2IgJiYgcG9jX2xzYiAtIHByZXZfcG9jX2xzYiA+IG1heF9wb2NfbHNiIC8gMikKKyAgICAgICAgcG9jX21zYiA9IHByZXZfcG9jX21zYiAtIG1heF9wb2NfbHNiOworICAgIGVsc2UKKyAgICAgICAgcG9jX21zYiA9IHByZXZfcG9jX21zYjsKKworICAgIC8vIEZvciBCTEEgcGljdHVyZSB0eXBlcywgUE9DbXNiIGlzIHNldCB0byAwLgorICAgIGlmIChuYWxfdW5pdF90eXBlID09IEhFVkNfTkFMX0JMQV9XX0xQICAgfHwKKyAgICAgICAgbmFsX3VuaXRfdHlwZSA9PSBIRVZDX05BTF9CTEFfV19SQURMIHx8CisgICAgICAgIG5hbF91bml0X3R5cGUgPT0gSEVWQ19OQUxfQkxBX05fTFApCisgICAgICAgIHBvY19tc2IgPSAwOworCisgICAgcmV0dXJuIHBvY19tc2IgKyBwb2NfbHNiOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oZXZjX3BzLmggYi9saWJhdmNvZGVjL2hldmNfcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJkYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9oZXZjX3BzLmgKQEAgLTAsMCArMSw0MzggQEAKKy8qCisgKiBIRVZDIHBhcmFtZXRlciBzZXQgcGFyc2luZworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSEVWQ19QU19ICisjZGVmaW5lIEFWQ09ERUNfSEVWQ19QU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJoZXZjLmgiCisKK3R5cGVkZWYgc3RydWN0IFNob3J0VGVybVJQUyB7CisgICAgdW5zaWduZWQgaW50IG51bV9uZWdhdGl2ZV9waWNzOworICAgIGludCBudW1fZGVsdGFfcG9jczsKKyAgICBpbnQgcnBzX2lkeF9udW1fZGVsdGFfcG9jczsKKyAgICBpbnQzMl90IGRlbHRhX3BvY1szMl07CisgICAgdWludDhfdCB1c2VkWzMyXTsKK30gU2hvcnRUZXJtUlBTOworCit0eXBlZGVmIHN0cnVjdCBMb25nVGVybVJQUyB7CisgICAgaW50ICAgICBwb2NbMzJdOworICAgIHVpbnQ4X3QgdXNlZFszMl07CisgICAgdWludDhfdCBuYl9yZWZzOworfSBMb25nVGVybVJQUzsKKwordHlwZWRlZiBzdHJ1Y3QgU2xpY2VIZWFkZXIgeworICAgIHVuc2lnbmVkIGludCBwcHNfaWQ7CisKKyAgICAvLy88IGFkZHJlc3MgKGluIHJhc3RlciBvcmRlcikgb2YgdGhlIGZpcnN0IGJsb2NrIGluIHRoZSBjdXJyZW50IHNsaWNlIHNlZ21lbnQKKyAgICB1bnNpZ25lZCBpbnQgICBzbGljZV9zZWdtZW50X2FkZHI7CisgICAgLy8vPCBhZGRyZXNzIChpbiByYXN0ZXIgb3JkZXIpIG9mIHRoZSBmaXJzdCBibG9jayBpbiB0aGUgY3VycmVudCBzbGljZQorICAgIHVuc2lnbmVkIGludCAgIHNsaWNlX2FkZHI7CisKKyAgICBlbnVtIEhFVkNTbGljZVR5cGUgc2xpY2VfdHlwZTsKKworICAgIGludCBwaWNfb3JkZXJfY250X2xzYjsKKworICAgIHVpbnQ4X3QgZmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWc7CisgICAgdWludDhfdCBkZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnOworICAgIHVpbnQ4X3QgcGljX291dHB1dF9mbGFnOworICAgIHVpbnQ4X3QgY29sb3VyX3BsYW5lX2lkOworCisgICAgLy8vPCBSUFMgY29kZWQgaW4gdGhlIHNsaWNlIGhlYWRlciBpdHNlbGYgaXMgc3RvcmVkIGhlcmUKKyAgICBpbnQgc2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZzsKKyAgICBpbnQgc2hvcnRfdGVybV9yZWZfcGljX3NldF9zaXplOworICAgIFNob3J0VGVybVJQUyBzbGljZV9ycHM7CisgICAgY29uc3QgU2hvcnRUZXJtUlBTICpzaG9ydF90ZXJtX3JwczsKKyAgICBpbnQgbG9uZ190ZXJtX3JlZl9waWNfc2V0X3NpemU7CisgICAgTG9uZ1Rlcm1SUFMgbG9uZ190ZXJtX3JwczsKKyAgICB1bnNpZ25lZCBpbnQgbGlzdF9lbnRyeV9seFsyXVszMl07CisKKyAgICB1aW50OF90IHJwbF9tb2RpZmljYXRpb25fZmxhZ1syXTsKKyAgICB1aW50OF90IG5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWc7CisgICAgdWludDhfdCBzbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnOworCisgICAgdW5zaWduZWQgaW50IG5iX3JlZnNbMl07CisKKyAgICB1aW50OF90IHNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1szXTsKKyAgICB1aW50OF90IG12ZF9sMV96ZXJvX2ZsYWc7CisKKyAgICB1aW50OF90IGNhYmFjX2luaXRfZmxhZzsKKyAgICB1aW50OF90IGRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfZmxhZzsgLy8vPCBzbGljZV9oZWFkZXJfZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnCisgICAgdWludDhfdCBzbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGNvbGxvY2F0ZWRfbGlzdDsKKworICAgIHVuc2lnbmVkIGludCBjb2xsb2NhdGVkX3JlZl9pZHg7CisKKyAgICBpbnQgc2xpY2VfcXBfZGVsdGE7CisgICAgaW50IHNsaWNlX2NiX3FwX29mZnNldDsKKyAgICBpbnQgc2xpY2VfY3JfcXBfb2Zmc2V0OworCisgICAgdWludDhfdCBjdV9jaHJvbWFfcXBfb2Zmc2V0X2VuYWJsZWRfZmxhZzsKKworICAgIGludCBiZXRhX29mZnNldDsgICAgLy8vPCBiZXRhX29mZnNldF9kaXYyICogMgorICAgIGludCB0Y19vZmZzZXQ7ICAgICAgLy8vPCB0Y19vZmZzZXRfZGl2MiAqIDIKKworICAgIHVuc2lnbmVkIGludCBtYXhfbnVtX21lcmdlX2NhbmQ7IC8vLzwgNSAtIDVfbWludXNfbWF4X251bV9tZXJnZV9jYW5kCisKKyAgICB1bnNpZ25lZCAqZW50cnlfcG9pbnRfb2Zmc2V0OworICAgIGludCAqIG9mZnNldDsKKyAgICBpbnQgKiBzaXplOworICAgIGludCBudW1fZW50cnlfcG9pbnRfb2Zmc2V0czsKKworICAgIGludDhfdCBzbGljZV9xcDsKKworICAgIHVpbnQ4X3QgbHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICBpbnQxNl90IGNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKworICAgIGludDE2X3QgbHVtYV93ZWlnaHRfbDBbMTZdOworICAgIGludDE2X3QgY2hyb21hX3dlaWdodF9sMFsxNl1bMl07CisgICAgaW50MTZfdCBjaHJvbWFfd2VpZ2h0X2wxWzE2XVsyXTsKKyAgICBpbnQxNl90IGx1bWFfd2VpZ2h0X2wxWzE2XTsKKworICAgIGludDE2X3QgbHVtYV9vZmZzZXRfbDBbMTZdOworICAgIGludDE2X3QgY2hyb21hX29mZnNldF9sMFsxNl1bMl07CisKKyAgICBpbnQxNl90IGx1bWFfb2Zmc2V0X2wxWzE2XTsKKyAgICBpbnQxNl90IGNocm9tYV9vZmZzZXRfbDFbMTZdWzJdOworCisgICAgaW50IHNsaWNlX2N0Yl9hZGRyX3JzOworfSBTbGljZUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgSEVWQ1dpbmRvdyB7CisgICAgdW5zaWduZWQgaW50IGxlZnRfb2Zmc2V0OworICAgIHVuc2lnbmVkIGludCByaWdodF9vZmZzZXQ7CisgICAgdW5zaWduZWQgaW50IHRvcF9vZmZzZXQ7CisgICAgdW5zaWduZWQgaW50IGJvdHRvbV9vZmZzZXQ7Cit9IEhFVkNXaW5kb3c7CisKK3R5cGVkZWYgc3RydWN0IFZVSSB7CisgICAgQVZSYXRpb25hbCBzYXI7CisKKyAgICBpbnQgb3ZlcnNjYW5faW5mb19wcmVzZW50X2ZsYWc7CisgICAgaW50IG92ZXJzY2FuX2FwcHJvcHJpYXRlX2ZsYWc7CisKKyAgICBpbnQgdmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnOworICAgIGludCB2aWRlb19mb3JtYXQ7CisgICAgaW50IHZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKyAgICBpbnQgY29sb3VyX2Rlc2NyaXB0aW9uX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IGNvbG91cl9wcmltYXJpZXM7CisgICAgdWludDhfdCB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpYzsKKyAgICB1aW50OF90IG1hdHJpeF9jb2VmZnM7CisKKyAgICBpbnQgY2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICBpbnQgY2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQ7CisgICAgaW50IGNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkOworICAgIGludCBuZXV0cmFfY2hyb21hX2luZGljYXRpb25fZmxhZzsKKworICAgIGludCBmaWVsZF9zZXFfZmxhZzsKKyAgICBpbnQgZnJhbWVfZmllbGRfaW5mb19wcmVzZW50X2ZsYWc7CisKKyAgICBpbnQgZGVmYXVsdF9kaXNwbGF5X3dpbmRvd19mbGFnOworICAgIEhFVkNXaW5kb3cgZGVmX2Rpc3Bfd2luOworCisgICAgaW50IHZ1aV90aW1pbmdfaW5mb19wcmVzZW50X2ZsYWc7CisgICAgdWludDMyX3QgdnVpX251bV91bml0c19pbl90aWNrOworICAgIHVpbnQzMl90IHZ1aV90aW1lX3NjYWxlOworICAgIGludCB2dWlfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZzsKKyAgICBpbnQgdnVpX251bV90aWNrc19wb2NfZGlmZl9vbmVfbWludXMxOworICAgIGludCB2dWlfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnOworCisgICAgaW50IGJpdHN0cmVhbV9yZXN0cmljdGlvbl9mbGFnOworICAgIGludCB0aWxlc19maXhlZF9zdHJ1Y3R1cmVfZmxhZzsKKyAgICBpbnQgbW90aW9uX3ZlY3RvcnNfb3Zlcl9waWNfYm91bmRhcmllc19mbGFnOworICAgIGludCByZXN0cmljdGVkX3JlZl9waWNfbGlzdHNfZmxhZzsKKyAgICBpbnQgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYzsKKyAgICBpbnQgbWF4X2J5dGVzX3Blcl9waWNfZGVub207CisgICAgaW50IG1heF9iaXRzX3Blcl9taW5fY3VfZGVub207CisgICAgaW50IGxvZzJfbWF4X212X2xlbmd0aF9ob3Jpem9udGFsOworICAgIGludCBsb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWw7Cit9IFZVSTsKKwordHlwZWRlZiBzdHJ1Y3QgUFRMQ29tbW9uIHsKKyAgICB1aW50OF90IHByb2ZpbGVfc3BhY2U7CisgICAgdWludDhfdCB0aWVyX2ZsYWc7CisgICAgdWludDhfdCBwcm9maWxlX2lkYzsKKyAgICB1aW50OF90IHByb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFnWzMyXTsKKyAgICB1aW50OF90IGxldmVsX2lkYzsKKyAgICB1aW50OF90IHByb2dyZXNzaXZlX3NvdXJjZV9mbGFnOworICAgIHVpbnQ4X3QgaW50ZXJsYWNlZF9zb3VyY2VfZmxhZzsKKyAgICB1aW50OF90IG5vbl9wYWNrZWRfY29uc3RyYWludF9mbGFnOworICAgIHVpbnQ4X3QgZnJhbWVfb25seV9jb25zdHJhaW50X2ZsYWc7Cit9IFBUTENvbW1vbjsKKwordHlwZWRlZiBzdHJ1Y3QgUFRMIHsKKyAgICBQVExDb21tb24gZ2VuZXJhbF9wdGw7CisgICAgUFRMQ29tbW9uIHN1Yl9sYXllcl9wdGxbSEVWQ19NQVhfU1VCX0xBWUVSU107CisKKyAgICB1aW50OF90IHN1Yl9sYXllcl9wcm9maWxlX3ByZXNlbnRfZmxhZ1tIRVZDX01BWF9TVUJfTEFZRVJTXTsKKyAgICB1aW50OF90IHN1Yl9sYXllcl9sZXZlbF9wcmVzZW50X2ZsYWdbSEVWQ19NQVhfU1VCX0xBWUVSU107Cit9IFBUTDsKKwordHlwZWRlZiBzdHJ1Y3QgSEVWQ1ZQUyB7CisgICAgdWludDhfdCB2cHNfdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnOworICAgIGludCB2cHNfbWF4X2xheWVyczsKKyAgICBpbnQgdnBzX21heF9zdWJfbGF5ZXJzOyAvLy88IHZwc19tYXhfdGVtcG9yYWxfbGF5ZXJzX21pbnVzMSArIDEKKworICAgIFBUTCBwdGw7CisgICAgaW50IHZwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWc7CisgICAgdW5zaWduZWQgaW50IHZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdbSEVWQ19NQVhfU1VCX0xBWUVSU107CisgICAgdW5zaWduZWQgaW50IHZwc19udW1fcmVvcmRlcl9waWNzW0hFVkNfTUFYX1NVQl9MQVlFUlNdOworICAgIHVuc2lnbmVkIGludCB2cHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VbSEVWQ19NQVhfU1VCX0xBWUVSU107CisgICAgaW50IHZwc19tYXhfbGF5ZXJfaWQ7CisgICAgaW50IHZwc19udW1fbGF5ZXJfc2V0czsgLy8vPCB2cHNfbnVtX2xheWVyX3NldHNfbWludXMxICsgMQorICAgIHVpbnQ4X3QgdnBzX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50MzJfdCB2cHNfbnVtX3VuaXRzX2luX3RpY2s7CisgICAgdWludDMyX3QgdnBzX3RpbWVfc2NhbGU7CisgICAgdWludDhfdCB2cHNfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZzsKKyAgICBpbnQgdnBzX251bV90aWNrc19wb2NfZGlmZl9vbmU7IC8vLzwgdnBzX251bV90aWNrc19wb2NfZGlmZl9vbmVfbWludXMxICsgMQorICAgIGludCB2cHNfbnVtX2hyZF9wYXJhbWV0ZXJzOworCisgICAgdWludDhfdCBkYXRhWzQwOTZdOworICAgIGludCBkYXRhX3NpemU7Cit9IEhFVkNWUFM7CisKK3R5cGVkZWYgc3RydWN0IFNjYWxpbmdMaXN0IHsKKyAgICAvKiBUaGlzIGlzIGEgbGl0dGxlIHdhc3RlZnVsLCBzaW5jZSBzaXplSUQgMCBvbmx5IG5lZWRzIDggY29lZmZzLAorICAgICAqIGFuZCBzaXplIElEIDMgb25seSBoYXMgMiBhcnJheXMsIG5vdCA2LiAqLworICAgIHVpbnQ4X3Qgc2xbNF1bNl1bNjRdOworICAgIHVpbnQ4X3Qgc2xfZGNbMl1bNl07Cit9IFNjYWxpbmdMaXN0OworCit0eXBlZGVmIHN0cnVjdCBIRVZDU1BTIHsKKyAgICB1bnNpZ25lZCB2cHNfaWQ7CisgICAgaW50IGNocm9tYV9mb3JtYXRfaWRjOworICAgIHVpbnQ4X3Qgc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWc7CisKKyAgICBIRVZDV2luZG93IG91dHB1dF93aW5kb3c7CisKKyAgICBIRVZDV2luZG93IHBpY19jb25mX3dpbjsKKworICAgIGludCBiaXRfZGVwdGg7CisgICAgaW50IGJpdF9kZXB0aF9jaHJvbWE7CisgICAgaW50IHBpeGVsX3NoaWZ0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworCisgICAgdW5zaWduZWQgaW50IGxvZzJfbWF4X3BvY19sc2I7CisgICAgaW50IHBjbV9lbmFibGVkX2ZsYWc7CisKKyAgICBpbnQgbWF4X3N1Yl9sYXllcnM7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1heF9kZWNfcGljX2J1ZmZlcmluZzsKKyAgICAgICAgaW50IG51bV9yZW9yZGVyX3BpY3M7CisgICAgICAgIGludCBtYXhfbGF0ZW5jeV9pbmNyZWFzZTsKKyAgICB9IHRlbXBvcmFsX2xheWVyW0hFVkNfTUFYX1NVQl9MQVlFUlNdOworICAgIHVpbnQ4X3QgdGVtcG9yYWxfaWRfbmVzdGluZ19mbGFnOworCisgICAgVlVJIHZ1aTsKKyAgICBQVEwgcHRsOworCisgICAgdWludDhfdCBzY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWc7CisgICAgU2NhbGluZ0xpc3Qgc2NhbGluZ19saXN0OworCisgICAgdW5zaWduZWQgaW50IG5iX3N0X3JwczsKKyAgICBTaG9ydFRlcm1SUFMgc3RfcnBzW0hFVkNfTUFYX1NIT1JUX1RFUk1fUkVGX1BJQ19TRVRTXTsKKworICAgIHVpbnQ4X3QgYW1wX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IHNhb19lbmFibGVkOworCisgICAgdWludDhfdCBsb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnOworICAgIHVpbnQxNl90IGx0X3JlZl9waWNfcG9jX2xzYl9zcHNbSEVWQ19NQVhfTE9OR19URVJNX1JFRl9QSUNTXTsKKyAgICB1aW50OF90IHVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbSEVWQ19NQVhfTE9OR19URVJNX1JFRl9QSUNTXTsKKyAgICB1aW50OF90IG51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzOworCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBiaXRfZGVwdGg7CisgICAgICAgIHVpbnQ4X3QgYml0X2RlcHRoX2Nocm9tYTsKKyAgICAgICAgdW5zaWduZWQgaW50IGxvZzJfbWluX3BjbV9jYl9zaXplOworICAgICAgICB1bnNpZ25lZCBpbnQgbG9nMl9tYXhfcGNtX2NiX3NpemU7CisgICAgICAgIHVpbnQ4X3QgbG9vcF9maWx0ZXJfZGlzYWJsZV9mbGFnOworICAgIH0gcGNtOworICAgIHVpbnQ4X3Qgc3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBzcHNfc3Ryb25nX2ludHJhX3Ntb290aGluZ19lbmFibGVfZmxhZzsKKworICAgIHVuc2lnbmVkIGludCBsb2cyX21pbl9jYl9zaXplOworICAgIHVuc2lnbmVkIGludCBsb2cyX2RpZmZfbWF4X21pbl9jb2RpbmdfYmxvY2tfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgbG9nMl9taW5fdGJfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgbG9nMl9tYXhfdHJhZm9fc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgbG9nMl9jdGJfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgbG9nMl9taW5fcHVfc2l6ZTsKKworICAgIGludCBtYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlcjsKKyAgICBpbnQgbWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmE7CisKKyAgICBpbnQgdHJhbnNmb3JtX3NraXBfcm90YXRpb25fZW5hYmxlZF9mbGFnOworICAgIGludCB0cmFuc2Zvcm1fc2tpcF9jb250ZXh0X2VuYWJsZWRfZmxhZzsKKyAgICBpbnQgaW1wbGljaXRfcmRwY21fZW5hYmxlZF9mbGFnOworICAgIGludCBleHBsaWNpdF9yZHBjbV9lbmFibGVkX2ZsYWc7CisgICAgaW50IGludHJhX3Ntb290aGluZ19kaXNhYmxlZF9mbGFnOworICAgIGludCBoaWdoX3ByZWNpc2lvbl9vZmZzZXRzX2VuYWJsZWRfZmxhZzsKKyAgICBpbnQgcGVyc2lzdGVudF9yaWNlX2FkYXB0YXRpb25fZW5hYmxlZF9mbGFnOworCisgICAgLy8vPCBjb2RlZCBmcmFtZSBkaW1lbnNpb24gaW4gdmFyaW91cyB1bml0cworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCBjdGJfd2lkdGg7CisgICAgaW50IGN0Yl9oZWlnaHQ7CisgICAgaW50IGN0Yl9zaXplOworICAgIGludCBtaW5fY2Jfd2lkdGg7CisgICAgaW50IG1pbl9jYl9oZWlnaHQ7CisgICAgaW50IG1pbl90Yl93aWR0aDsKKyAgICBpbnQgbWluX3RiX2hlaWdodDsKKyAgICBpbnQgbWluX3B1X3dpZHRoOworICAgIGludCBtaW5fcHVfaGVpZ2h0OworICAgIGludCB0Yl9tYXNrOworCisgICAgaW50IGhzaGlmdFszXTsKKyAgICBpbnQgdnNoaWZ0WzNdOworCisgICAgaW50IHFwX2JkX29mZnNldDsKKworICAgIHVpbnQ4X3QgZGF0YVs0MDk2XTsKKyAgICBpbnQgZGF0YV9zaXplOworfSBIRVZDU1BTOworCit0eXBlZGVmIHN0cnVjdCBIRVZDUFBTIHsKKyAgICB1bnNpZ25lZCBpbnQgc3BzX2lkOyAvLy88IHNlcV9wYXJhbWV0ZXJfc2V0X2lkCisKKyAgICB1aW50OF90IHNpZ25fZGF0YV9oaWRpbmdfZmxhZzsKKworICAgIHVpbnQ4X3QgY2FiYWNfaW5pdF9wcmVzZW50X2ZsYWc7CisKKyAgICBpbnQgbnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmU7IC8vLzwgbnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxICsgMQorICAgIGludCBudW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZTsgLy8vPCBudW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZV9taW51czEgKyAxCisgICAgaW50IHBpY19pbml0X3FwX21pbnVzMjY7CisKKyAgICB1aW50OF90IGNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZzsKKyAgICB1aW50OF90IHRyYW5zZm9ybV9za2lwX2VuYWJsZWRfZmxhZzsKKworICAgIHVpbnQ4X3QgY3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnOworICAgIGludCBkaWZmX2N1X3FwX2RlbHRhX2RlcHRoOworCisgICAgaW50IGNiX3FwX29mZnNldDsKKyAgICBpbnQgY3JfcXBfb2Zmc2V0OworICAgIHVpbnQ4X3QgcGljX3NsaWNlX2xldmVsX2Nocm9tYV9xcF9vZmZzZXRzX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IHdlaWdodGVkX3ByZWRfZmxhZzsKKyAgICB1aW50OF90IHdlaWdodGVkX2JpcHJlZF9mbGFnOworICAgIHVpbnQ4X3Qgb3V0cHV0X2ZsYWdfcHJlc2VudF9mbGFnOworICAgIHVpbnQ4X3QgdHJhbnNxdWFudF9ieXBhc3NfZW5hYmxlX2ZsYWc7CisKKyAgICB1aW50OF90IGRlcGVuZGVudF9zbGljZV9zZWdtZW50c19lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCB0aWxlc19lbmFibGVkX2ZsYWc7CisgICAgdWludDhfdCBlbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZzsKKworICAgIGludCBudW1fdGlsZV9jb2x1bW5zOyAgIC8vLzwgbnVtX3RpbGVfY29sdW1uc19taW51czEgKyAxCisgICAgaW50IG51bV90aWxlX3Jvd3M7ICAgICAgLy8vPCBudW1fdGlsZV9yb3dzX21pbnVzMSArIDEKKyAgICB1aW50OF90IHVuaWZvcm1fc3BhY2luZ19mbGFnOworICAgIHVpbnQ4X3QgbG9vcF9maWx0ZXJfYWNyb3NzX3RpbGVzX2VuYWJsZWRfZmxhZzsKKworICAgIHVpbnQ4X3Qgc2VxX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnOworCisgICAgdWludDhfdCBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZzsKKyAgICB1aW50OF90IGRlYmxvY2tpbmdfZmlsdGVyX292ZXJyaWRlX2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGRpc2FibGVfZGJmOworICAgIGludCBiZXRhX29mZnNldDsgICAgLy8vPCBiZXRhX29mZnNldF9kaXYyICogMgorICAgIGludCB0Y19vZmZzZXQ7ICAgICAgLy8vPCB0Y19vZmZzZXRfZGl2MiAqIDIKKworICAgIHVpbnQ4X3Qgc2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnOworICAgIFNjYWxpbmdMaXN0IHNjYWxpbmdfbGlzdDsKKworICAgIHVpbnQ4X3QgbGlzdHNfbW9kaWZpY2F0aW9uX3ByZXNlbnRfZmxhZzsKKyAgICBpbnQgbG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbDsgLy8vPCBsb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsX21pbnVzMiArIDIKKyAgICBpbnQgbnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzOworICAgIHVpbnQ4X3Qgc2xpY2VfaGVhZGVyX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWc7CisgICAgdWludDhfdCBsb2cyX21heF90cmFuc2Zvcm1fc2tpcF9ibG9ja19zaXplOworICAgIHVpbnQ4X3QgY3Jvc3NfY29tcG9uZW50X3ByZWRpY3Rpb25fZW5hYmxlZF9mbGFnOworICAgIHVpbnQ4X3QgY2hyb21hX3FwX29mZnNldF9saXN0X2VuYWJsZWRfZmxhZzsKKyAgICB1aW50OF90IGRpZmZfY3VfY2hyb21hX3FwX29mZnNldF9kZXB0aDsKKyAgICB1aW50OF90IGNocm9tYV9xcF9vZmZzZXRfbGlzdF9sZW5fbWludXMxOworICAgIGludDhfdCAgY2JfcXBfb2Zmc2V0X2xpc3RbNl07CisgICAgaW50OF90ICBjcl9xcF9vZmZzZXRfbGlzdFs2XTsKKyAgICB1aW50OF90IGxvZzJfc2FvX29mZnNldF9zY2FsZV9sdW1hOworICAgIHVpbnQ4X3QgbG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2Nocm9tYTsKKworICAgIC8vIEluZmVycmVkIHBhcmFtZXRlcnMKKyAgICB1bnNpZ25lZCBpbnQgKmNvbHVtbl93aWR0aDsgIC8vLzwgQ29sdW1uV2lkdGgKKyAgICB1bnNpZ25lZCBpbnQgKnJvd19oZWlnaHQ7ICAgIC8vLzwgUm93SGVpZ2h0CisgICAgdW5zaWduZWQgaW50ICpjb2xfYmQ7ICAgICAgICAvLy88IENvbEJkCisgICAgdW5zaWduZWQgaW50ICpyb3dfYmQ7ICAgICAgICAvLy88IFJvd0JkCisgICAgaW50ICpjb2xfaWR4WDsKKworICAgIGludCAqY3RiX2FkZHJfcnNfdG9fdHM7IC8vLzwgQ3RiQWRkclJTVG9UUworICAgIGludCAqY3RiX2FkZHJfdHNfdG9fcnM7IC8vLzwgQ3RiQWRkclRTVG9SUworICAgIGludCAqdGlsZV9pZDsgICAgICAgICAgIC8vLzwgVGlsZUlkCisgICAgaW50ICp0aWxlX3Bvc19yczsgICAgICAgLy8vPCBUaWxlUG9zUlMKKyAgICBpbnQgKm1pbl90Yl9hZGRyX3pzOyAgICAvLy88IE1pblRiQWRkclpTCisgICAgaW50ICptaW5fdGJfYWRkcl96c190YWI7Ly8vPCBNaW5UYkFkZHJaUworCisgICAgdWludDhfdCBkYXRhWzQwOTZdOworICAgIGludCBkYXRhX3NpemU7Cit9IEhFVkNQUFM7CisKK3R5cGVkZWYgc3RydWN0IEhFVkNQYXJhbVNldHMgeworICAgIEFWQnVmZmVyUmVmICp2cHNfbGlzdFtIRVZDX01BWF9WUFNfQ09VTlRdOworICAgIEFWQnVmZmVyUmVmICpzcHNfbGlzdFtIRVZDX01BWF9TUFNfQ09VTlRdOworICAgIEFWQnVmZmVyUmVmICpwcHNfbGlzdFtIRVZDX01BWF9QUFNfQ09VTlRdOworCisgICAgLyogY3VycmVudGx5IGFjdGl2ZSBwYXJhbWV0ZXIgc2V0cyAqLworICAgIGNvbnN0IEhFVkNWUFMgKnZwczsKKyAgICBjb25zdCBIRVZDU1BTICpzcHM7CisgICAgY29uc3QgSEVWQ1BQUyAqcHBzOworfSBIRVZDUGFyYW1TZXRzOworCisvKioKKyAqIFBhcnNlIHRoZSBTUFMgZnJvbSB0aGUgYml0c3RyZWFtIGludG8gdGhlIHByb3ZpZGVkIEhFVkNTUFMgc3RydWN0LgorICoKKyAqIEBwYXJhbSBzcHNfaWQgdGhlIFNQUyBpZCB3aWxsIGJlIHdyaXR0ZW4gaGVyZQorICogQHBhcmFtIGFwcGx5X2RlZmRpc3B3aW4gaWYgc2V0IDEsIHRoZSBkZWZhdWx0IGRpc3BsYXkgd2luZG93IGZyb20gdGhlIFZVSQorICogICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSB2aWRlbyBkaW1lbnNpb25zCisgKiBAcGFyYW0gdnBzX2xpc3QgaWYgbm9uLU5VTEwsIHRoaXMgZnVuY3Rpb24gd2lsbCB2YWxpZGF0ZSB0aGF0IHRoZSBTUFMgcmVmZXJzCisgKiAgICAgICAgICAgICAgICAgdG8gYW4gZXhpc3RpbmcgVlBTCisgKi8KK2ludCBmZl9oZXZjX3BhcnNlX3NwcyhIRVZDU1BTICpzcHMsIEdldEJpdENvbnRleHQgKmdiLCB1bnNpZ25lZCBpbnQgKnNwc19pZCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBwbHlfZGVmZGlzcHdpbiwgQVZCdWZmZXJSZWYgKip2cHNfbGlzdCwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworaW50IGZmX2hldmNfZGVjb2RlX25hbF92cHMoR2V0Qml0Q29udGV4dCAqZ2IsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNQYXJhbVNldHMgKnBzKTsKK2ludCBmZl9oZXZjX2RlY29kZV9uYWxfc3BzKEdldEJpdENvbnRleHQgKmdiLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDUGFyYW1TZXRzICpwcywgaW50IGFwcGx5X2RlZmRpc3B3aW4pOworaW50IGZmX2hldmNfZGVjb2RlX25hbF9wcHMoR2V0Qml0Q29udGV4dCAqZ2IsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhFVkNQYXJhbVNldHMgKnBzKTsKKwordm9pZCBmZl9oZXZjX3BzX3VuaW5pdChIRVZDUGFyYW1TZXRzICpwcyk7CisKK2ludCBmZl9oZXZjX2RlY29kZV9zaG9ydF90ZXJtX3JwcyhHZXRCaXRDb250ZXh0ICpnYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0VGVybVJQUyAqcnBzLCBjb25zdCBIRVZDU1BTICpzcHMsIGludCBpc19zbGljZV9oZWFkZXIpOworCitpbnQgZmZfaGV2Y19lbmNvZGVfbmFsX3ZwcyhIRVZDVlBTICp2cHMsIHVuc2lnbmVkIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKTsKKworLyoqCisgKiBDb21wdXRlIFBPQyBvZiB0aGUgY3VycmVudCBmcmFtZSBhbmQgcmV0dXJuIGl0LgorICovCitpbnQgZmZfaGV2Y19jb21wdXRlX3BvYyhjb25zdCBIRVZDU1BTICpzcHMsIGludCBwb2NUaWQwLCBpbnQgcG9jX2xzYiwgaW50IG5hbF91bml0X3R5cGUpOworCisjZW5kaWYgLyogQVZDT0RFQ19IRVZDX1BTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y19wc19lbmMuYyBiL2xpYmF2Y29kZWMvaGV2Y19wc19lbmMuYwppbmRleCBjMDViZjYzLi40YzcxY2Y0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hldmNfcHNfZW5jLmMKKysrIGIvbGliYXZjb2RlYy9oZXZjX3BzX2VuYy5jCkBAIC0xOSw3ICsxOSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImdvbG9tYi5oIgotI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJoZXZjX3BzLmgiCiAjaW5jbHVkZSAicHV0X2JpdHMuaCIKIAogc3RhdGljIHZvaWQgd3JpdGVfcHRsX2xheWVyKFB1dEJpdENvbnRleHQgKnBiLCBQVExDb21tb24gKnB0bCkKQEAgLTkwLDkgKzkwLDEwIEBACiAgICAgcHV0X2JpdHMoJnBiLCA2LCB2cHMtPnZwc19tYXhfbGF5ZXJfaWQpOwogICAgIHNldF91ZV9nb2xvbWIoJnBiLCB2cHMtPnZwc19udW1fbGF5ZXJfc2V0cyAtIDEpOwogCi0gICAgLy8gd3JpdGluZyBsYXllcl9pZF9pbmNsdWRlZF9mbGFnIG5vdCBzdXBwb3J0ZWQKLSAgICBpZiAodnBzLT52cHNfbnVtX2xheWVyX3NldHMgPiAxKQorICAgIGlmICh2cHMtPnZwc19udW1fbGF5ZXJfc2V0cyA+IDEpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoTlVMTCwgIldyaXRpbmcgbGF5ZXJfaWRfaW5jbHVkZWRfZmxhZyIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQogCiAgICAgcHV0X2JpdHMoJnBiLCAxLCB2cHMtPnZwc190aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpOwogICAgIGlmICh2cHMtPnZwc190aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcpIHsKQEAgLTEwMiw5ICsxMDMsMTAgQEAKICAgICAgICAgaWYgKHZwcy0+dnBzX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWcpCiAgICAgICAgICAgICBzZXRfdWVfZ29sb21iKCZwYiwgdnBzLT52cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZSAtIDEpOwogCi0gICAgICAgIC8vIHdyaXRpbmcgSFJEIHBhcmFtZXRlcnMgbm90IHN1cHBvcnRlZAotICAgICAgICBpZiAodnBzLT52cHNfbnVtX2hyZF9wYXJhbWV0ZXJzKQorICAgICAgICBpZiAodnBzLT52cHNfbnVtX2hyZF9wYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShOVUxMLCAiV3JpdGluZyBIUkQgcGFyYW1ldGVycyIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgICAgLy8gZXh0ZW5zaW9uIGZsYWcKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y19yZWZzLmMgYi9saWJhdmNvZGVjL2hldmNfcmVmcy5jCmluZGV4IDYxMWFkNDUuLjdjZjNhNTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaGV2Y19yZWZzLmMKKysrIGIvbGliYXZjb2RlYy9oZXZjX3JlZnMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAiaGV2Yy5oIgorI2luY2x1ZGUgImhldmNkZWMuaCIKIAogdm9pZCBmZl9oZXZjX3VucmVmX2ZyYW1lKEhFVkNDb250ZXh0ICpzLCBIRVZDRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCiB7CkBAIC0xMDgsOCArMTA5LDggQEAKICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZyYW1lLT5jdGJfY291bnQ7IGorKykKICAgICAgICAgICAgIGZyYW1lLT5ycGxfdGFiW2pdID0gKFJlZlBpY0xpc3RUYWIgKilmcmFtZS0+cnBsX2J1Zi0+ZGF0YTsKIAotICAgICAgICBmcmFtZS0+ZnJhbWUtPnRvcF9maWVsZF9maXJzdCAgPSBzLT5waWN0dXJlX3N0cnVjdCA9PSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9UT1BfRklFTEQ7Ci0gICAgICAgIGZyYW1lLT5mcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9IChzLT5waWN0dXJlX3N0cnVjdCA9PSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9UT1BfRklFTEQpIHx8IChzLT5waWN0dXJlX3N0cnVjdCA9PSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9CT1RUT01fRklFTEQpOworICAgICAgICBmcmFtZS0+ZnJhbWUtPnRvcF9maWVsZF9maXJzdCAgPSBzLT5zZWkucGljdHVyZV90aW1pbmcucGljdHVyZV9zdHJ1Y3QgPT0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfVE9QX0ZJRUxEOworICAgICAgICBmcmFtZS0+ZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSAocy0+c2VpLnBpY3R1cmVfdGltaW5nLnBpY3R1cmVfc3RydWN0ID09IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX1RPUF9GSUVMRCkgfHwgKHMtPnNlaS5waWN0dXJlX3RpbWluZy5waWN0dXJlX3N0cnVjdCA9PSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9CT1RUT01fRklFTEQpOwogCiAgICAgICAgIGlmIChzLT5hdmN0eC0+aHdhY2NlbCkgewogICAgICAgICAgICAgY29uc3QgQVZIV0FjY2VsICpod2FjY2VsID0gcy0+YXZjdHgtPmh3YWNjZWw7CkBAIC0xNjIsNyArMTYzLDEwIEBACiAKICAgICByZWYtPnBvYyAgICAgID0gcG9jOwogICAgIHJlZi0+c2VxdWVuY2UgPSBzLT5zZXFfZGVjb2RlOwotICAgIHJlZi0+d2luZG93ICAgPSBzLT5wcy5zcHMtPm91dHB1dF93aW5kb3c7CisgICAgcmVmLT5mcmFtZS0+Y3JvcF9sZWZ0ICAgPSBzLT5wcy5zcHMtPm91dHB1dF93aW5kb3cubGVmdF9vZmZzZXQ7CisgICAgcmVmLT5mcmFtZS0+Y3JvcF9yaWdodCAgPSBzLT5wcy5zcHMtPm91dHB1dF93aW5kb3cucmlnaHRfb2Zmc2V0OworICAgIHJlZi0+ZnJhbWUtPmNyb3BfdG9wICAgID0gcy0+cHMuc3BzLT5vdXRwdXRfd2luZG93LnRvcF9vZmZzZXQ7CisgICAgcmVmLT5mcmFtZS0+Y3JvcF9ib3R0b20gPSBzLT5wcy5zcHMtPm91dHB1dF93aW5kb3cuYm90dG9tX29mZnNldDsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjAzLDEyICsyMDcsOCBAQAogCiAgICAgICAgIGlmIChuYl9vdXRwdXQpIHsKICAgICAgICAgICAgIEhFVkNGcmFtZSAqZnJhbWUgPSAmcy0+RFBCW21pbl9pZHhdOwotICAgICAgICAgICAgQVZGcmFtZSAqZHN0ID0gb3V0OwotICAgICAgICAgICAgQVZGcmFtZSAqc3JjID0gZnJhbWUtPmZyYW1lOwotICAgICAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzcmMtPmZvcm1hdCk7Ci0gICAgICAgICAgICBpbnQgcGl4ZWxfc2hpZnQgPSAhIShkZXNjLT5jb21wWzBdLmRlcHRoID4gOCk7CiAKLSAgICAgICAgICAgIHJldCA9IGF2X2ZyYW1lX3JlZihvdXQsIHNyYyk7CisgICAgICAgICAgICByZXQgPSBhdl9mcmFtZV9yZWYob3V0LCBmcmFtZS0+ZnJhbWUpOwogICAgICAgICAgICAgaWYgKGZyYW1lLT5mbGFncyAmIEhFVkNfRlJBTUVfRkxBR19CVU1QSU5HKQogICAgICAgICAgICAgICAgIGZmX2hldmNfdW5yZWZfZnJhbWUocywgZnJhbWUsIEhFVkNfRlJBTUVfRkxBR19PVVRQVVQgfCBIRVZDX0ZSQU1FX0ZMQUdfQlVNUElORyk7CiAgICAgICAgICAgICBlbHNlCkBAIC0yMTYsMTMgKzIxNiw2IEBACiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGhzaGlmdCA9IChpID4gMCkgPyBkZXNjLT5sb2cyX2Nocm9tYV93IDogMDsKLSAgICAgICAgICAgICAgICBpbnQgdnNoaWZ0ID0gKGkgPiAwKSA/IGRlc2MtPmxvZzJfY2hyb21hX2ggOiAwOwotICAgICAgICAgICAgICAgIGludCBvZmYgPSAoKGZyYW1lLT53aW5kb3cubGVmdF9vZmZzZXQgPj4gaHNoaWZ0KSA8PCBwaXhlbF9zaGlmdCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWUtPndpbmRvdy50b3Bfb2Zmc2V0ICAgPj4gdnNoaWZ0KSAqIGRzdC0+bGluZXNpemVbaV07Ci0gICAgICAgICAgICAgICAgZHN0LT5kYXRhW2ldICs9IG9mZjsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAogICAgICAgICAgICAgICAgICAgICJPdXRwdXQgZnJhbWUgd2l0aCBQT0MgJWQuXG4iLCBmcmFtZS0+cG9jKTsKICAgICAgICAgICAgIHJldHVybiAxOwpAQCAtMjk5LDcgKzI5Miw3IEBACiB7CiAgICAgU2xpY2VIZWFkZXIgKnNoID0gJnMtPnNoOwogCi0gICAgdWludDhfdCBuYl9saXN0ID0gc2gtPnNsaWNlX3R5cGUgPT0gQl9TTElDRSA/IDIgOiAxOworICAgIHVpbnQ4X3QgbmJfbGlzdCA9IHNoLT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQiA/IDIgOiAxOwogICAgIHVpbnQ4X3QgbGlzdF9pZHg7CiAgICAgaW50IGksIGosIHJldDsKIApAQCAtMzI4LDcgKzMyMSw3IEBACiAgICAgICAgIHdoaWxlIChycGxfdG1wLm5iX3JlZnMgPCBzaC0+bmJfcmVmc1tsaXN0X2lkeF0pIHsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjYW5kX2xpc3RzKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgUmVmUGljTGlzdCAqcnBzID0gJnMtPnJwc1tjYW5kX2xpc3RzW2ldXTsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcnBzLT5uYl9yZWZzICYmIHJwbF90bXAubmJfcmVmcyA8IE1BWF9SRUZTOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcnBzLT5uYl9yZWZzICYmIHJwbF90bXAubmJfcmVmcyA8IEhFVkNfTUFYX1JFRlM7IGorKykgewogICAgICAgICAgICAgICAgICAgICBycGxfdG1wLmxpc3RbcnBsX3RtcC5uYl9yZWZzXSAgICAgICA9IHJwcy0+bGlzdFtqXTsKICAgICAgICAgICAgICAgICAgICAgcnBsX3RtcC5yZWZbcnBsX3RtcC5uYl9yZWZzXSAgICAgICAgPSBycHMtPnJlZltqXTsKICAgICAgICAgICAgICAgICAgICAgcnBsX3RtcC5pc0xvbmdUZXJtW3JwbF90bXAubmJfcmVmc10gPSBpID09IDI7CkBAIC0zODYsNyArMzc5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChzLT5uYWxfdW5pdF90eXBlICE9IE5BTF9DUkFfTlVUICYmICFJU19CTEEocykpCisgICAgaWYgKHMtPm5hbF91bml0X3R5cGUgIT0gSEVWQ19OQUxfQ1JBX05VVCAmJiAhSVNfQkxBKHMpKQogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCByZWYgd2l0aCBQT0MgJWRcbiIsIHBvYyk7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC00MzgsNyArNDMxLDcgQEAKIHsKICAgICBIRVZDRnJhbWUgKnJlZiA9IGZpbmRfcmVmX2lkeChzLCBwb2MpOwogCi0gICAgaWYgKHJlZiA9PSBzLT5yZWYpCisgICAgaWYgKHJlZiA9PSBzLT5yZWYgfHwgbGlzdC0+bmJfcmVmcyA+PSBIRVZDX01BWF9SRUZTKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIGlmICghcmVmKSB7CkBAIC01MTUsMzUgKzUwOCwxMiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCBmZl9oZXZjX2NvbXB1dGVfcG9jKEhFVkNDb250ZXh0ICpzLCBpbnQgcG9jX2xzYikKLXsKLSAgICBpbnQgbWF4X3BvY19sc2IgID0gMSA8PCBzLT5wcy5zcHMtPmxvZzJfbWF4X3BvY19sc2I7Ci0gICAgaW50IHByZXZfcG9jX2xzYiA9IHMtPnBvY1RpZDAgJSBtYXhfcG9jX2xzYjsKLSAgICBpbnQgcHJldl9wb2NfbXNiID0gcy0+cG9jVGlkMCAtIHByZXZfcG9jX2xzYjsKLSAgICBpbnQgcG9jX21zYjsKLQotICAgIGlmIChwb2NfbHNiIDwgcHJldl9wb2NfbHNiICYmIHByZXZfcG9jX2xzYiAtIHBvY19sc2IgPj0gbWF4X3BvY19sc2IgLyAyKQotICAgICAgICBwb2NfbXNiID0gcHJldl9wb2NfbXNiICsgbWF4X3BvY19sc2I7Ci0gICAgZWxzZSBpZiAocG9jX2xzYiA+IHByZXZfcG9jX2xzYiAmJiBwb2NfbHNiIC0gcHJldl9wb2NfbHNiID4gbWF4X3BvY19sc2IgLyAyKQotICAgICAgICBwb2NfbXNiID0gcHJldl9wb2NfbXNiIC0gbWF4X3BvY19sc2I7Ci0gICAgZWxzZQotICAgICAgICBwb2NfbXNiID0gcHJldl9wb2NfbXNiOwotCi0gICAgLy8gRm9yIEJMQSBwaWN0dXJlIHR5cGVzLCBQT0Ntc2IgaXMgc2V0IHRvIDAuCi0gICAgaWYgKHMtPm5hbF91bml0X3R5cGUgPT0gTkFMX0JMQV9XX0xQICAgfHwKLSAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfQkxBX1dfUkFETCB8fAotICAgICAgICBzLT5uYWxfdW5pdF90eXBlID09IE5BTF9CTEFfTl9MUCkKLSAgICAgICAgcG9jX21zYiA9IDA7Ci0KLSAgICByZXR1cm4gcG9jX21zYiArIHBvY19sc2I7Ci19Ci0KLWludCBmZl9oZXZjX2ZyYW1lX25iX3JlZnMoSEVWQ0NvbnRleHQgKnMpCitpbnQgZmZfaGV2Y19mcmFtZV9uYl9yZWZzKGNvbnN0IEhFVkNDb250ZXh0ICpzKQogewogICAgIGludCByZXQgPSAwOwogICAgIGludCBpOwogICAgIGNvbnN0IFNob3J0VGVybVJQUyAqcnBzID0gcy0+c2guc2hvcnRfdGVybV9ycHM7Ci0gICAgTG9uZ1Rlcm1SUFMgKmxvbmdfcnBzICAgPSAmcy0+c2gubG9uZ190ZXJtX3JwczsKKyAgICBjb25zdCBMb25nVGVybVJQUyAqbG9uZ19ycHMgPSAmcy0+c2gubG9uZ190ZXJtX3JwczsKIAogICAgIGlmIChycHMpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJwcy0+bnVtX25lZ2F0aXZlX3BpY3M7IGkrKykKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y19zZWkuYyBiL2xpYmF2Y29kZWMvaGV2Y19zZWkuYwppbmRleCA0MDY4NWZlLi5jNTliZDQzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hldmNfc2VpLmMKKysrIGIvbGliYXZjb2RlYy9oZXZjX3NlaS5jCkBAIC0yMyw0MyArMjMsMTUgQEAKICAqLwogCiAjaW5jbHVkZSAiZ29sb21iLmgiCi0jaW5jbHVkZSAiaGV2Yy5oIgorI2luY2x1ZGUgImhldmNfcHMuaCIKKyNpbmNsdWRlICJoZXZjX3NlaS5oIgogCi1lbnVtIEhFVkNfU0VJX1RZUEUgewotICAgIFNFSV9UWVBFX0JVRkZFUklOR19QRVJJT0QgICAgICAgICAgICAgICAgICAgICA9IDAsCi0gICAgU0VJX1RZUEVfUElDVFVSRV9USU1JTkcgICAgICAgICAgICAgICAgICAgICAgID0gMSwKLSAgICBTRUlfVFlQRV9QQU5fU0NBTl9SRUNUICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAotICAgIFNFSV9UWVBFX0ZJTExFUl9QQVlMT0FEICAgICAgICAgICAgICAgICAgICAgICA9IDMsCi0gICAgU0VJX1RZUEVfVVNFUl9EQVRBX1JFR0lTVEVSRURfSVRVX1RfVDM1ICAgICAgID0gNCwKLSAgICBTRUlfVFlQRV9VU0VSX0RBVEFfVU5SRUdJU1RFUkVEICAgICAgICAgICAgICAgPSA1LAotICAgIFNFSV9UWVBFX1JFQ09WRVJZX1BPSU5UICAgICAgICAgICAgICAgICAgICAgICA9IDYsCi0gICAgU0VJX1RZUEVfU0NFTkVfSU5GTyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOSwKLSAgICBTRUlfVFlQRV9GVUxMX0ZSQU1FX1NOQVBTSE9UICAgICAgICAgICAgICAgICAgPSAxNSwKLSAgICBTRUlfVFlQRV9QUk9HUkVTU0lWRV9SRUZJTkVNRU5UX1NFR01FTlRfU1RBUlQgPSAxNiwKLSAgICBTRUlfVFlQRV9QUk9HUkVTU0lWRV9SRUZJTkVNRU5UX1NFR01FTlRfRU5EICAgPSAxNywKLSAgICBTRUlfVFlQRV9GSUxNX0dSQUlOX0NIQVJBQ1RFUklTVElDUyAgICAgICAgICAgPSAxOSwKLSAgICBTRUlfVFlQRV9QT1NUX0ZJTFRFUl9ISU5UICAgICAgICAgICAgICAgICAgICAgPSAyMiwKLSAgICBTRUlfVFlQRV9UT05FX01BUFBJTkdfSU5GTyAgICAgICAgICAgICAgICAgICAgPSAyMywKLSAgICBTRUlfVFlQRV9GUkFNRV9QQUNLSU5HICAgICAgICAgICAgICAgICAgICAgICAgPSA0NSwKLSAgICBTRUlfVFlQRV9ESVNQTEFZX09SSUVOVEFUSU9OICAgICAgICAgICAgICAgICAgPSA0NywKLSAgICBTRUlfVFlQRV9TT1BfREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgPSAxMjgsCi0gICAgU0VJX1RZUEVfQUNUSVZFX1BBUkFNRVRFUl9TRVRTICAgICAgICAgICAgICAgID0gMTI5LAotICAgIFNFSV9UWVBFX0RFQ09ESU5HX1VOSVRfSU5GTyAgICAgICAgICAgICAgICAgICA9IDEzMCwKLSAgICBTRUlfVFlQRV9URU1QT1JBTF9MRVZFTDBfSU5ERVggICAgICAgICAgICAgICAgPSAxMzEsCi0gICAgU0VJX1RZUEVfREVDT0RFRF9QSUNUVVJFX0hBU0ggICAgICAgICAgICAgICAgID0gMTMyLAotICAgIFNFSV9UWVBFX1NDQUxBQkxFX05FU1RJTkcgICAgICAgICAgICAgICAgICAgICA9IDEzMywKLSAgICBTRUlfVFlQRV9SRUdJT05fUkVGUkVTSF9JTkZPICAgICAgICAgICAgICAgICAgPSAxMzQsCi0gICAgU0VJX1RZUEVfTUFTVEVSSU5HX0RJU1BMQVlfSU5GTyAgICAgICAgICAgICAgID0gMTM3LAotICAgIFNFSV9UWVBFX0NPTlRFTlRfTElHSFRfTEVWRUxfSU5GTyAgICAgICAgICAgICA9IDE0NCwKLX07Ci0KLXN0YXRpYyBpbnQgZGVjb2RlX25hbF9zZWlfZGVjb2RlZF9waWN0dXJlX2hhc2goSEVWQ0NvbnRleHQgKnMpCitzdGF0aWMgaW50IGRlY29kZV9uYWxfc2VpX2RlY29kZWRfcGljdHVyZV9oYXNoKEhFVkNTRUlQaWN0dXJlSGFzaCAqcywgR2V0Qml0Q29udGV4dCAqZ2IpCiB7CiAgICAgaW50IGNJZHgsIGk7CiAgICAgdWludDhfdCBoYXNoX3R5cGU7CiAgICAgLy91aW50MTZfdCBwaWN0dXJlX2NyYzsKICAgICAvL3VpbnQzMl90IHBpY3R1cmVfY2hlY2tzdW07Ci0gICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKICAgICBoYXNoX3R5cGUgPSBnZXRfYml0cyhnYiwgOCk7CiAKICAgICBmb3IgKGNJZHggPSAwOyBjSWR4IDwgMy8qKChzLT5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDApID8gMSA6IDMpKi87IGNJZHgrKykgewpAQCAtNzgsOSArNTAsOCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV9uYWxfc2VpX21hc3RlcmluZ19kaXNwbGF5X2luZm8oSEVWQ0NvbnRleHQgKnMpCitzdGF0aWMgaW50IGRlY29kZV9uYWxfc2VpX21hc3RlcmluZ19kaXNwbGF5X2luZm8oSEVWQ1NFSU1hc3RlcmluZ0Rpc3BsYXkgKnMsIEdldEJpdENvbnRleHQgKmdiKQogewotICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CiAgICAgaW50IGk7CiAgICAgLy8gTWFzdGVyaW5nIHByaW1hcmllcwogICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTkyLDkyICs2MywxMDUgQEAKICAgICBzLT53aGl0ZV9wb2ludFsxXSA9IGdldF9iaXRzKGdiLCAxNik7CiAKICAgICAvLyBNYXggYW5kIG1pbiBsdW1pbmFuY2Ugb2YgbWFzdGVyaW5nIGRpc3BsYXkKLSAgICBzLT5tYXhfbWFzdGVyaW5nX2x1bWluYW5jZSA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKLSAgICBzLT5taW5fbWFzdGVyaW5nX2x1bWluYW5jZSA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKKyAgICBzLT5tYXhfbHVtaW5hbmNlID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOworICAgIHMtPm1pbl9sdW1pbmFuY2UgPSBnZXRfYml0c19sb25nKGdiLCAzMik7CiAKICAgICAvLyBBcyB0aGlzIFNFSSBtZXNzYWdlIGNvbWVzIGJlZm9yZSB0aGUgZmlyc3QgZnJhbWUgdGhhdCByZWZlcmVuY2VzIGl0LAogICAgIC8vIGluaXRpYWxpemUgdGhlIGZsYWcgdG8gMiBhbmQgZGVjcmVtZW50IG9uIElSQVAgYWNjZXNzIHVuaXQgc28gaXQKICAgICAvLyBwZXJzaXN0cyBmb3IgdGhlIGNvZGVkIHZpZGVvIHNlcXVlbmNlIChlLmcuLCBiZXR3ZWVuIHR3byBJUkFQcykKLSAgICBzLT5zZWlfbWFzdGVyaW5nX2Rpc3BsYXlfaW5mb19wcmVzZW50ID0gMjsKKyAgICBzLT5wcmVzZW50ID0gMjsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfbmFsX3NlaV9mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50KEhFVkNDb250ZXh0ICpzKQorc3RhdGljIGludCBkZWNvZGVfbmFsX3NlaV9jb250ZW50X2xpZ2h0X2luZm8oSEVWQ1NFSUNvbnRlbnRMaWdodCAqcywgR2V0Qml0Q29udGV4dCAqZ2IpCiB7Ci0gICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKyAgICAvLyBNYXggYW5kIGF2ZXJhZ2UgbGlnaHQgbGV2ZWxzCisgICAgcy0+bWF4X2NvbnRlbnRfbGlnaHRfbGV2ZWwgICAgID0gZ2V0X2JpdHNfbG9uZyhnYiwgMTYpOworICAgIHMtPm1heF9waWNfYXZlcmFnZV9saWdodF9sZXZlbCA9IGdldF9iaXRzX2xvbmcoZ2IsIDE2KTsKKyAgICAvLyBBcyB0aGlzIFNFSSBtZXNzYWdlIGNvbWVzIGJlZm9yZSB0aGUgZmlyc3QgZnJhbWUgdGhhdCByZWZlcmVuY2VzIGl0LAorICAgIC8vIGluaXRpYWxpemUgdGhlIGZsYWcgdG8gMiBhbmQgZGVjcmVtZW50IG9uIElSQVAgYWNjZXNzIHVuaXQgc28gaXQKKyAgICAvLyBwZXJzaXN0cyBmb3IgdGhlIGNvZGVkIHZpZGVvIHNlcXVlbmNlIChlLmcuLCBiZXR3ZWVuIHR3byBJUkFQcykKKyAgICBzLT5wcmVzZW50ID0gMjsKKyAgICByZXR1cm4gIDA7Cit9CiAKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF9zZWlfZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudChIRVZDU0VJRnJhbWVQYWNraW5nICpzLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKICAgICBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOyAgICAgICAgICAgICAvLyBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X2lkCi0gICAgcy0+c2VpX2ZyYW1lX3BhY2tpbmdfcHJlc2VudCA9ICFnZXRfYml0czEoZ2IpOworICAgIHMtPnByZXNlbnQgPSAhZ2V0X2JpdHMxKGdiKTsKIAotICAgIGlmIChzLT5zZWlfZnJhbWVfcGFja2luZ19wcmVzZW50KSB7Ci0gICAgICAgIHMtPmZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfdHlwZSA9IGdldF9iaXRzKGdiLCA3KTsKKyAgICBpZiAocy0+cHJlc2VudCkgeworICAgICAgICBzLT5hcnJhbmdlbWVudF90eXBlICAgICAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgNyk7CiAgICAgICAgIHMtPnF1aW5jdW54X3N1YnNhbXBsaW5nICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CiAgICAgICAgIHMtPmNvbnRlbnRfaW50ZXJwcmV0YXRpb25fdHlwZSAgICA9IGdldF9iaXRzKGdiLCA2KTsKIAotICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHNraXBzIHNwYXRpYWxfZmxpcHBpbmdfZmxhZyBmcmFtZTBfZmxpcHBlZF9mbGFnCi0gICAgICAgIC8vIGZpZWxkX3ZpZXdzX2ZsYWcgY3VycmVudF9mcmFtZV9pc19mcmFtZTBfZmxhZwotICAgICAgICAvLyBmcmFtZTBfc2VsZl9jb250YWluZWRfZmxhZyBmcmFtZTFfc2VsZl9jb250YWluZWRfZmxhZwotICAgICAgICBza2lwX2JpdHMoZ2IsIDYpOworICAgICAgICAvLyBzcGF0aWFsX2ZsaXBwaW5nX2ZsYWcsIGZyYW1lMF9mbGlwcGVkX2ZsYWcsIGZpZWxkX3ZpZXdzX2ZsYWcKKyAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsKKyAgICAgICAgcy0+Y3VycmVudF9mcmFtZV9pc19mcmFtZTBfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgIC8vIGZyYW1lMF9zZWxmX2NvbnRhaW5lZF9mbGFnLCBmcmFtZTFfc2VsZl9jb250YWluZWRfZmxhZworICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOwogCi0gICAgICAgIGlmICghcy0+cXVpbmN1bnhfc3Vic2FtcGxpbmcgJiYgcy0+ZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF90eXBlICE9IDUpCisgICAgICAgIGlmICghcy0+cXVpbmN1bnhfc3Vic2FtcGxpbmcgJiYgcy0+YXJyYW5nZW1lbnRfdHlwZSAhPSA1KQogICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxNik7ICAvLyBmcmFtZVswMV1fZ3JpZF9wb3NpdGlvbl9beHldCiAgICAgICAgIHNraXBfYml0cyhnYiwgOCk7ICAgICAgIC8vIGZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnRfcmVzZXJ2ZWRfYnl0ZQotICAgICAgICBza2lwX2JpdHMxKGdiKTsgICAgICAgICAvLyBmcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50X3BlcnNpc3RhbmNlX2ZsYWcKKyAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAgICAgLy8gZnJhbWVfcGFja2luZ19hcnJhbmdlbWVudF9wZXJzaXN0ZW5jZV9mbGFnCiAgICAgfQogICAgIHNraXBfYml0czEoZ2IpOyAgICAgICAgICAgICAvLyB1cHNhbXBsZWRfYXNwZWN0X3JhdGlvX2ZsYWcKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfbmFsX3NlaV9kaXNwbGF5X29yaWVudGF0aW9uKEhFVkNDb250ZXh0ICpzKQorc3RhdGljIGludCBkZWNvZGVfbmFsX3NlaV9kaXNwbGF5X29yaWVudGF0aW9uKEhFVkNTRUlEaXNwbGF5T3JpZW50YXRpb24gKnMsIEdldEJpdENvbnRleHQgKmdiKQogewotICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CisgICAgcy0+cHJlc2VudCA9ICFnZXRfYml0czEoZ2IpOwogCi0gICAgcy0+c2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudCA9ICFnZXRfYml0czEoZ2IpOworICAgIGlmIChzLT5wcmVzZW50KSB7CisgICAgICAgIHMtPmhmbGlwID0gZ2V0X2JpdHMxKGdiKTsgICAgIC8vIGhvcl9mbGlwCisgICAgICAgIHMtPnZmbGlwID0gZ2V0X2JpdHMxKGdiKTsgICAgIC8vIHZlcl9mbGlwCiAKLSAgICBpZiAocy0+c2VpX2Rpc3BsYXlfb3JpZW50YXRpb25fcHJlc2VudCkgewotICAgICAgICBzLT5zZWlfaGZsaXAgPSBnZXRfYml0czEoZ2IpOyAgICAgLy8gaG9yX2ZsaXAKLSAgICAgICAgcy0+c2VpX3ZmbGlwID0gZ2V0X2JpdHMxKGdiKTsgICAgIC8vIHZlcl9mbGlwCi0KLSAgICAgICAgcy0+c2VpX2FudGljbG9ja3dpc2Vfcm90YXRpb24gPSBnZXRfYml0cyhnYiwgMTYpOworICAgICAgICBzLT5hbnRpY2xvY2t3aXNlX3JvdGF0aW9uID0gZ2V0X2JpdHMoZ2IsIDE2KTsKICAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAvLyBkaXNwbGF5X29yaWVudGF0aW9uX3BlcnNpc3RlbmNlX2ZsYWcKICAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfcGljX3RpbWluZyhIRVZDQ29udGV4dCAqcykKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF9zZWlfcGljX3RpbWluZyhIRVZDU0VJICpzLCBHZXRCaXRDb250ZXh0ICpnYiwgY29uc3QgSEVWQ1BhcmFtU2V0cyAqcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nY3R4LCBpbnQgc2l6ZSkKIHsKLSAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5IRVZDbGMtPmdiOworICAgIEhFVkNTRUlQaWN0dXJlVGltaW5nICpoID0gJnMtPnBpY3R1cmVfdGltaW5nOwogICAgIEhFVkNTUFMgKnNwczsKIAotICAgIGlmICghcy0+cHMuc3BzX2xpc3Rbcy0+YWN0aXZlX3NlcV9wYXJhbWV0ZXJfc2V0X2lkXSkKKyAgICBpZiAoIXBzLT5zcHNfbGlzdFtzLT5hY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWRdKQogICAgICAgICByZXR1cm4oQVZFUlJPUihFTk9NRU0pKTsKLSAgICBzcHMgPSAoSEVWQ1NQUyopcy0+cHMuc3BzX2xpc3Rbcy0+YWN0aXZlX3NlcV9wYXJhbWV0ZXJfc2V0X2lkXS0+ZGF0YTsKKyAgICBzcHMgPSAoSEVWQ1NQUyopcHMtPnNwc19saXN0W3MtPmFjdGl2ZV9zZXFfcGFyYW1ldGVyX3NldF9pZF0tPmRhdGE7CiAKICAgICBpZiAoc3BzLT52dWkuZnJhbWVfZmllbGRfaW5mb19wcmVzZW50X2ZsYWcpIHsKICAgICAgICAgaW50IHBpY19zdHJ1Y3QgPSBnZXRfYml0cyhnYiwgNCk7Ci0gICAgICAgIHMtPnBpY3R1cmVfc3RydWN0ID0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfVU5LTk9XTjsKLSAgICAgICAgaWYgKHBpY19zdHJ1Y3QgPT0gMikgewotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJCT1RUT00gRmllbGRcbiIpOwotICAgICAgICAgICAgcy0+cGljdHVyZV9zdHJ1Y3QgPSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9CT1RUT01fRklFTEQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocGljX3N0cnVjdCA9PSAxKSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlRPUCBGaWVsZFxuIik7Ci0gICAgICAgICAgICBzLT5waWN0dXJlX3N0cnVjdCA9IEFWX1BJQ1RVUkVfU1RSVUNUVVJFX1RPUF9GSUVMRDsKKyAgICAgICAgaC0+cGljdHVyZV9zdHJ1Y3QgPSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9VTktOT1dOOworICAgICAgICBpZiAocGljX3N0cnVjdCA9PSAyIHx8IHBpY19zdHJ1Y3QgPT0gMTAgfHwgcGljX3N0cnVjdCA9PSAxMikgeworICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0RFQlVHLCAiQk9UVE9NIEZpZWxkXG4iKTsKKyAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0ID0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfQk9UVE9NX0ZJRUxEOworICAgICAgICB9IGVsc2UgaWYgKHBpY19zdHJ1Y3QgPT0gMSB8fCBwaWNfc3RydWN0ID09IDkgfHwgcGljX3N0cnVjdCA9PSAxMSkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0RFQlVHLCAiVE9QIEZpZWxkXG4iKTsKKyAgICAgICAgICAgIGgtPnBpY3R1cmVfc3RydWN0ID0gQVZfUElDVFVSRV9TVFJVQ1RVUkVfVE9QX0ZJRUxEOwogICAgICAgICB9CiAgICAgICAgIGdldF9iaXRzKGdiLCAyKTsgICAgICAgICAgICAgICAgICAgLy8gc291cmNlX3NjYW5fdHlwZQogICAgICAgICBnZXRfYml0cyhnYiwgMSk7ICAgICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZV9mbGFnCisgICAgICAgIHNraXBfYml0czEoZ2IpOworICAgICAgICBzaXplLS07CiAgICAgfQotICAgIHJldHVybiAxOworICAgIHNraXBfYml0c19sb25nKGdiLCA4ICogc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGFfY2xvc2VkX2NhcHRpb24oSEVWQ0NvbnRleHQgKnMsIGludCBzaXplKQorc3RhdGljIGludCBkZWNvZGVfcmVnaXN0ZXJlZF91c2VyX2RhdGFfY2xvc2VkX2NhcHRpb24oSEVWQ1NFSUE1M0NhcHRpb24gKnMsIEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCiB7CiAgICAgaW50IGZsYWc7CiAgICAgaW50IHVzZXJfZGF0YV90eXBlX2NvZGU7CiAgICAgaW50IGNjX2NvdW50OwogCi0gICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKLQogICAgIGlmIChzaXplIDwgMykKICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCkBAIC0yMjIsMTMgKzIwNiwxMiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV9uYWxfc2VpX3VzZXJfZGF0YV9yZWdpc3RlcmVkX2l0dV90X3QzNShIRVZDQ29udGV4dCAqcywgaW50IHNpemUpCitzdGF0aWMgaW50IGRlY29kZV9uYWxfc2VpX3VzZXJfZGF0YV9yZWdpc3RlcmVkX2l0dV90X3QzNShIRVZDU0VJICpzLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQogewogICAgIHVpbnQzMl90IGNvdW50cnlfY29kZTsKICAgICB1aW50MzJfdCB1c2VyX2lkZW50aWZpZXI7CiAKLSAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5IRVZDbGMtPmdiOwotCiAgICAgaWYgKHNpemUgPCA3KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIHNpemUgLT0gNzsKQEAgLTI0Niw3ICsyMjksNyBAQAogCiAgICAgc3dpdGNoICh1c2VyX2lkZW50aWZpZXIpIHsKICAgICAgICAgY2FzZSBNS0JFVEFHKCdHJywgJ0EnLCAnOScsICc0Jyk6Ci0gICAgICAgICAgICByZXR1cm4gZGVjb2RlX3JlZ2lzdGVyZWRfdXNlcl9kYXRhX2Nsb3NlZF9jYXB0aW9uKHMsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIGRlY29kZV9yZWdpc3RlcmVkX3VzZXJfZGF0YV9jbG9zZWRfY2FwdGlvbigmcy0+YTUzX2NhcHRpb24sIGdiLCBzaXplKTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCBzaXplICogOCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTI1NCw5ICsyMzcsOCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFjdGl2ZV9wYXJhbWV0ZXJfc2V0cyhIRVZDQ29udGV4dCAqcykKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF9zZWlfYWN0aXZlX3BhcmFtZXRlcl9zZXRzKEhFVkNTRUkgKnMsIEdldEJpdENvbnRleHQgKmdiLCB2b2lkICpsb2djdHgpCiB7Ci0gICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKICAgICBpbnQgbnVtX3Nwc19pZHNfbWludXMxOwogICAgIGludCBpOwogICAgIHVuc2lnbmVkIGFjdGl2ZV9zZXFfcGFyYW1ldGVyX3NldF9pZDsKQEAgLTI2NywxMyArMjQ5LDEzIEBACiAgICAgbnVtX3Nwc19pZHNfbWludXMxID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsgLy8gbnVtX3Nwc19pZHNfbWludXMxCiAKICAgICBpZiAobnVtX3Nwc19pZHNfbWludXMxIDwgMCB8fCBudW1fc3BzX2lkc19taW51czEgPiAxNSkgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm51bV9zcHNfaWRzX21pbnVzMSAlZCBpbnZhbGlkXG4iLCBudW1fc3BzX2lkc19taW51czEpOworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJudW1fc3BzX2lkc19taW51czEgJWQgaW52YWxpZFxuIiwgbnVtX3Nwc19pZHNfbWludXMxKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgYWN0aXZlX3NlcV9wYXJhbWV0ZXJfc2V0X2lkID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKLSAgICBpZiAoYWN0aXZlX3NlcV9wYXJhbWV0ZXJfc2V0X2lkID49IE1BWF9TUFNfQ09VTlQpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJhY3RpdmVfcGFyYW1ldGVyX3NldF9pZCAlZCBpbnZhbGlkXG4iLCBhY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQpOworICAgIGlmIChhY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQgPj0gSEVWQ19NQVhfU1BTX0NPVU5UKSB7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgImFjdGl2ZV9wYXJhbWV0ZXJfc2V0X2lkICVkIGludmFsaWRcbiIsIGFjdGl2ZV9zZXFfcGFyYW1ldGVyX3NldF9pZCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBzLT5hY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQgPSBhY3RpdmVfc2VxX3BhcmFtZXRlcl9zZXRfaWQ7CkBAIC0yODQsNzcgKzI2Niw4MSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV9uYWxfc2VpX3ByZWZpeChIRVZDQ29udGV4dCAqcywgaW50IHR5cGUsIGludCBzaXplKQorc3RhdGljIGludCBkZWNvZGVfbmFsX3NlaV9hbHRlcm5hdGl2ZV90cmFuc2ZlcihIRVZDU0VJQWx0ZXJuYXRpdmVUcmFuc2ZlciAqcywgR2V0Qml0Q29udGV4dCAqZ2IpCiB7Ci0gICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKKyAgICBzLT5wcmVzZW50ID0gMTsKKyAgICBzLT5wcmVmZXJyZWRfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgIHJldHVybiAwOworfQogCitzdGF0aWMgaW50IGRlY29kZV9uYWxfc2VpX3ByZWZpeChHZXRCaXRDb250ZXh0ICpnYiwgdm9pZCAqbG9nY3R4LCBIRVZDU0VJICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEVWQ1BhcmFtU2V0cyAqcHMsIGludCB0eXBlLCBpbnQgc2l6ZSkKK3sKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIDI1NjogIC8vIE1pc21hdGNoZWQgdmFsdWUgZnJvbSBITSA4LjEKLSAgICAgICAgcmV0dXJuIGRlY29kZV9uYWxfc2VpX2RlY29kZWRfcGljdHVyZV9oYXNoKHMpOwotICAgIGNhc2UgU0VJX1RZUEVfRlJBTUVfUEFDS0lORzoKLSAgICAgICAgcmV0dXJuIGRlY29kZV9uYWxfc2VpX2ZyYW1lX3BhY2tpbmdfYXJyYW5nZW1lbnQocyk7Ci0gICAgY2FzZSBTRUlfVFlQRV9ESVNQTEFZX09SSUVOVEFUSU9OOgotICAgICAgICByZXR1cm4gZGVjb2RlX25hbF9zZWlfZGlzcGxheV9vcmllbnRhdGlvbihzKTsKLSAgICBjYXNlIFNFSV9UWVBFX1BJQ1RVUkVfVElNSU5HOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gZGVjb2RlX3BpY190aW1pbmcocyk7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlNraXBwZWQgUFJFRklYIFNFSSAlZFxuIiwgdHlwZSk7Ci0gICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDggKiBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICBjYXNlIFNFSV9UWVBFX01BU1RFUklOR19ESVNQTEFZX0lORk86Ci0gICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9tYXN0ZXJpbmdfZGlzcGxheV9pbmZvKHMpOwotICAgIGNhc2UgU0VJX1RZUEVfQUNUSVZFX1BBUkFNRVRFUl9TRVRTOgotICAgICAgICBhY3RpdmVfcGFyYW1ldGVyX3NldHMocyk7Ci0gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiU2tpcHBlZCBQUkVGSVggU0VJICVkXG4iLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBTRUlfVFlQRV9VU0VSX0RBVEFfUkVHSVNURVJFRF9JVFVfVF9UMzU6Ci0gICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV91c2VyX2RhdGFfcmVnaXN0ZXJlZF9pdHVfdF90MzUocywgc2l6ZSk7CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9kZWNvZGVkX3BpY3R1cmVfaGFzaCgmcy0+cGljdHVyZV9oYXNoLCBnYik7CisgICAgY2FzZSBIRVZDX1NFSV9UWVBFX0ZSQU1FX1BBQ0tJTkc6CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9mcmFtZV9wYWNraW5nX2FycmFuZ2VtZW50KCZzLT5mcmFtZV9wYWNraW5nLCBnYik7CisgICAgY2FzZSBIRVZDX1NFSV9UWVBFX0RJU1BMQVlfT1JJRU5UQVRJT046CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9kaXNwbGF5X29yaWVudGF0aW9uKCZzLT5kaXNwbGF5X29yaWVudGF0aW9uLCBnYik7CisgICAgY2FzZSBIRVZDX1NFSV9UWVBFX1BJQ1RVUkVfVElNSU5HOgorICAgICAgICByZXR1cm4gZGVjb2RlX25hbF9zZWlfcGljX3RpbWluZyhzLCBnYiwgcHMsIGxvZ2N0eCwgc2l6ZSk7CisgICAgY2FzZSBIRVZDX1NFSV9UWVBFX01BU1RFUklOR19ESVNQTEFZX0lORk86CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9tYXN0ZXJpbmdfZGlzcGxheV9pbmZvKCZzLT5tYXN0ZXJpbmdfZGlzcGxheSwgZ2IpOworICAgIGNhc2UgSEVWQ19TRUlfVFlQRV9DT05URU5UX0xJR0hUX0xFVkVMX0lORk86CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9jb250ZW50X2xpZ2h0X2luZm8oJnMtPmNvbnRlbnRfbGlnaHQsIGdiKTsKKyAgICBjYXNlIEhFVkNfU0VJX1RZUEVfQUNUSVZFX1BBUkFNRVRFUl9TRVRTOgorICAgICAgICByZXR1cm4gZGVjb2RlX25hbF9zZWlfYWN0aXZlX3BhcmFtZXRlcl9zZXRzKHMsIGdiLCBsb2djdHgpOworICAgIGNhc2UgSEVWQ19TRUlfVFlQRV9VU0VSX0RBVEFfUkVHSVNURVJFRF9JVFVfVF9UMzU6CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV91c2VyX2RhdGFfcmVnaXN0ZXJlZF9pdHVfdF90MzUocywgZ2IsIHNpemUpOworICAgIGNhc2UgSEVWQ19TRUlfVFlQRV9BTFRFUk5BVElWRV9UUkFOU0ZFUl9DSEFSQUNURVJJU1RJQ1M6CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9hbHRlcm5hdGl2ZV90cmFuc2Zlcigmcy0+YWx0ZXJuYXRpdmVfdHJhbnNmZXIsIGdiKTsKICAgICBkZWZhdWx0OgotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlNraXBwZWQgUFJFRklYIFNFSSAlZFxuIiwgdHlwZSk7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19ERUJVRywgIlNraXBwZWQgUFJFRklYIFNFSSAlZFxuIiwgdHlwZSk7CiAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCA4ICogc2l6ZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIH0KIAotc3RhdGljIGludCBkZWNvZGVfbmFsX3NlaV9zdWZmaXgoSEVWQ0NvbnRleHQgKnMsIGludCB0eXBlLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF9zZWlfc3VmZml4KEdldEJpdENvbnRleHQgKmdiLCB2b2lkICpsb2djdHgsIEhFVkNTRUkgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgaW50IHNpemUpCiB7Ci0gICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+SEVWQ2xjLT5nYjsKLQogICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgU0VJX1RZUEVfREVDT0RFRF9QSUNUVVJFX0hBU0g6Ci0gICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9kZWNvZGVkX3BpY3R1cmVfaGFzaChzKTsKKyAgICBjYXNlIEhFVkNfU0VJX1RZUEVfREVDT0RFRF9QSUNUVVJFX0hBU0g6CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9kZWNvZGVkX3BpY3R1cmVfaGFzaCgmcy0+cGljdHVyZV9oYXNoLCBnYik7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJTa2lwcGVkIFNVRkZJWCBTRUkgJWRcbiIsIHR5cGUpOworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfREVCVUcsICJTa2lwcGVkIFNVRkZJWCBTRUkgJWRcbiIsIHR5cGUpOwogICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgOCAqIHNpemUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgZGVjb2RlX25hbF9zZWlfbWVzc2FnZShIRVZDQ29udGV4dCAqcykKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF9zZWlfbWVzc2FnZShHZXRCaXRDb250ZXh0ICpnYiwgdm9pZCAqbG9nY3R4LCBIRVZDU0VJICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEhFVkNQYXJhbVNldHMgKnBzLCBpbnQgbmFsX3VuaXRfdHlwZSkKIHsKLSAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5IRVZDbGMtPmdiOwotCiAgICAgaW50IHBheWxvYWRfdHlwZSA9IDA7CiAgICAgaW50IHBheWxvYWRfc2l6ZSA9IDA7CiAgICAgaW50IGJ5dGUgPSAweEZGOwotICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiRGVjb2RpbmcgU0VJXG4iKTsKKyAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfREVCVUcsICJEZWNvZGluZyBTRUlcbiIpOwogCiAgICAgd2hpbGUgKGJ5dGUgPT0gMHhGRikgeworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAxNiB8fCBwYXlsb2FkX3R5cGUgPiBJTlRfTUFYIC0gMjU1KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGJ5dGUgICAgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7CiAgICAgICAgIHBheWxvYWRfdHlwZSArPSBieXRlOwogICAgIH0KICAgICBieXRlID0gMHhGRjsKICAgICB3aGlsZSAoYnl0ZSA9PSAweEZGKSB7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDggKyA4TEwqcGF5bG9hZF9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGJ5dGUgICAgICAgICAgPSBnZXRfYml0cyhnYiwgOCk7CiAgICAgICAgIHBheWxvYWRfc2l6ZSArPSBieXRlOwogICAgIH0KLSAgICBpZiAocy0+bmFsX3VuaXRfdHlwZSA9PSBOQUxfU0VJX1BSRUZJWCkgewotICAgICAgICByZXR1cm4gZGVjb2RlX25hbF9zZWlfcHJlZml4KHMsIHBheWxvYWRfdHlwZSwgcGF5bG9hZF9zaXplKTsKKyAgICBpZiAobmFsX3VuaXRfdHlwZSA9PSBIRVZDX05BTF9TRUlfUFJFRklYKSB7CisgICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9wcmVmaXgoZ2IsIGxvZ2N0eCwgcywgcHMsIHBheWxvYWRfdHlwZSwgcGF5bG9hZF9zaXplKTsKICAgICB9IGVsc2UgeyAvKiBuYWxfdW5pdF90eXBlID09IE5BTF9TRUlfU1VGRklYICovCi0gICAgICAgIHJldHVybiBkZWNvZGVfbmFsX3NlaV9zdWZmaXgocywgcGF5bG9hZF90eXBlLCBwYXlsb2FkX3NpemUpOworICAgICAgICByZXR1cm4gZGVjb2RlX25hbF9zZWlfc3VmZml4KGdiLCBsb2djdHgsIHMsIHBheWxvYWRfdHlwZSwgcGF5bG9hZF9zaXplKTsKICAgICB9Ci0gICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQgbW9yZV9yYnNwX2RhdGEoR2V0Qml0Q29udGV4dCAqZ2IpCkBAIC0zNjIsMTQgKzM0OCwyMSBAQAogICAgIHJldHVybiBnZXRfYml0c19sZWZ0KGdiKSA+IDAgJiYgc2hvd19iaXRzKGdiLCA4KSAhPSAweDgwOwogfQogCi1pbnQgZmZfaGV2Y19kZWNvZGVfbmFsX3NlaShIRVZDQ29udGV4dCAqcykKK2ludCBmZl9oZXZjX2RlY29kZV9uYWxfc2VpKEdldEJpdENvbnRleHQgKmdiLCB2b2lkICpsb2djdHgsIEhFVkNTRUkgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIRVZDUGFyYW1TZXRzICpwcywgaW50IHR5cGUpCiB7CiAgICAgaW50IHJldDsKIAogICAgIGRvIHsKLSAgICAgICAgcmV0ID0gZGVjb2RlX25hbF9zZWlfbWVzc2FnZShzKTsKKyAgICAgICAgcmV0ID0gZGVjb2RlX25hbF9zZWlfbWVzc2FnZShnYiwgbG9nY3R4LCBzLCBwcywgdHlwZSk7CiAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuKEFWRVJST1IoRU5PTUVNKSk7Ci0gICAgfSB3aGlsZSAobW9yZV9yYnNwX2RhdGEoJnMtPkhFVkNsYy0+Z2IpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSB3aGlsZSAobW9yZV9yYnNwX2RhdGEoZ2IpKTsKICAgICByZXR1cm4gMTsKIH0KKwordm9pZCBmZl9oZXZjX3Jlc2V0X3NlaShIRVZDU0VJICpzKQoreworICAgIHMtPmE1M19jYXB0aW9uLmE1M19jYXB0aW9uX3NpemUgPSAwOworICAgIGF2X2ZyZWVwKCZzLT5hNTNfY2FwdGlvbi5hNTNfY2FwdGlvbik7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hldmNfc2VpLmggYi9saWJhdmNvZGVjL2hldmNfc2VpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyZGEyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvaGV2Y19zZWkuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIEhFVkMgU3VwcGxlbWVudGFyeSBFbmhhbmNlbWVudCBJbmZvcm1hdGlvbiBtZXNzYWdlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSEVWQ19TRUlfSAorI2RlZmluZSBBVkNPREVDX0hFVkNfU0VJX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworLyoqCisgKiBTRUkgbWVzc2FnZSB0eXBlcworICovCit0eXBlZGVmIGVudW0geworICAgIEhFVkNfU0VJX1RZUEVfQlVGRkVSSU5HX1BFUklPRCAgICAgICAgICAgICAgICAgICAgID0gMCwKKyAgICBIRVZDX1NFSV9UWVBFX1BJQ1RVUkVfVElNSU5HICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisgICAgSEVWQ19TRUlfVFlQRV9QQU5fU0NBTl9SRUNUICAgICAgICAgICAgICAgICAgICAgICAgPSAyLAorICAgIEhFVkNfU0VJX1RZUEVfRklMTEVSX1BBWUxPQUQgICAgICAgICAgICAgICAgICAgICAgID0gMywKKyAgICBIRVZDX1NFSV9UWVBFX1VTRVJfREFUQV9SRUdJU1RFUkVEX0lUVV9UX1QzNSAgICAgICA9IDQsCisgICAgSEVWQ19TRUlfVFlQRV9VU0VSX0RBVEFfVU5SRUdJU1RFUkVEICAgICAgICAgICAgICAgPSA1LAorICAgIEhFVkNfU0VJX1RZUEVfUkVDT1ZFUllfUE9JTlQgICAgICAgICAgICAgICAgICAgICAgID0gNiwKKyAgICBIRVZDX1NFSV9UWVBFX1NDRU5FX0lORk8gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDksCisgICAgSEVWQ19TRUlfVFlQRV9GVUxMX0ZSQU1FX1NOQVBTSE9UICAgICAgICAgICAgICAgICAgPSAxNSwKKyAgICBIRVZDX1NFSV9UWVBFX1BST0dSRVNTSVZFX1JFRklORU1FTlRfU0VHTUVOVF9TVEFSVCA9IDE2LAorICAgIEhFVkNfU0VJX1RZUEVfUFJPR1JFU1NJVkVfUkVGSU5FTUVOVF9TRUdNRU5UX0VORCAgID0gMTcsCisgICAgSEVWQ19TRUlfVFlQRV9GSUxNX0dSQUlOX0NIQVJBQ1RFUklTVElDUyAgICAgICAgICAgPSAxOSwKKyAgICBIRVZDX1NFSV9UWVBFX1BPU1RfRklMVEVSX0hJTlQgICAgICAgICAgICAgICAgICAgICA9IDIyLAorICAgIEhFVkNfU0VJX1RZUEVfVE9ORV9NQVBQSU5HX0lORk8gICAgICAgICAgICAgICAgICAgID0gMjMsCisgICAgSEVWQ19TRUlfVFlQRV9GUkFNRV9QQUNLSU5HICAgICAgICAgICAgICAgICAgICAgICAgPSA0NSwKKyAgICBIRVZDX1NFSV9UWVBFX0RJU1BMQVlfT1JJRU5UQVRJT04gICAgICAgICAgICAgICAgICA9IDQ3LAorICAgIEhFVkNfU0VJX1RZUEVfU09QX0RFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgID0gMTI4LAorICAgIEhFVkNfU0VJX1RZUEVfQUNUSVZFX1BBUkFNRVRFUl9TRVRTICAgICAgICAgICAgICAgID0gMTI5LAorICAgIEhFVkNfU0VJX1RZUEVfREVDT0RJTkdfVU5JVF9JTkZPICAgICAgICAgICAgICAgICAgID0gMTMwLAorICAgIEhFVkNfU0VJX1RZUEVfVEVNUE9SQUxfTEVWRUwwX0lOREVYICAgICAgICAgICAgICAgID0gMTMxLAorICAgIEhFVkNfU0VJX1RZUEVfREVDT0RFRF9QSUNUVVJFX0hBU0ggICAgICAgICAgICAgICAgID0gMTMyLAorICAgIEhFVkNfU0VJX1RZUEVfU0NBTEFCTEVfTkVTVElORyAgICAgICAgICAgICAgICAgICAgID0gMTMzLAorICAgIEhFVkNfU0VJX1RZUEVfUkVHSU9OX1JFRlJFU0hfSU5GTyAgICAgICAgICAgICAgICAgID0gMTM0LAorICAgIEhFVkNfU0VJX1RZUEVfTUFTVEVSSU5HX0RJU1BMQVlfSU5GTyAgICAgICAgICAgICAgID0gMTM3LAorICAgIEhFVkNfU0VJX1RZUEVfQ09OVEVOVF9MSUdIVF9MRVZFTF9JTkZPICAgICAgICAgICAgID0gMTQ0LAorICAgIEhFVkNfU0VJX1RZUEVfQUxURVJOQVRJVkVfVFJBTlNGRVJfQ0hBUkFDVEVSSVNUSUNTID0gMTQ3LAorfSBIRVZDX1NFSV9UeXBlOworCit0eXBlZGVmIHN0cnVjdCBIRVZDU0VJUGljdHVyZUhhc2ggeworICAgIHVpbnQ4X3QgICAgICAgbWQ1WzNdWzE2XTsKKyAgICB1aW50OF90IGlzX21kNTsKK30gSEVWQ1NFSVBpY3R1cmVIYXNoOworCit0eXBlZGVmIHN0cnVjdCBIRVZDU0VJRnJhbWVQYWNraW5nIHsKKyAgICBpbnQgcHJlc2VudDsKKyAgICBpbnQgYXJyYW5nZW1lbnRfdHlwZTsKKyAgICBpbnQgY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlOworICAgIGludCBxdWluY3VueF9zdWJzYW1wbGluZzsKKyAgICBpbnQgY3VycmVudF9mcmFtZV9pc19mcmFtZTBfZmxhZzsKK30gSEVWQ1NFSUZyYW1lUGFja2luZzsKKwordHlwZWRlZiBzdHJ1Y3QgSEVWQ1NFSURpc3BsYXlPcmllbnRhdGlvbiB7CisgICAgaW50IHByZXNlbnQ7CisgICAgaW50IGFudGljbG9ja3dpc2Vfcm90YXRpb247CisgICAgaW50IGhmbGlwLCB2ZmxpcDsKK30gSEVWQ1NFSURpc3BsYXlPcmllbnRhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgSEVWQ1NFSVBpY3R1cmVUaW1pbmcgeworICAgIGludCBwaWN0dXJlX3N0cnVjdDsKK30gSEVWQ1NFSVBpY3R1cmVUaW1pbmc7CisKK3R5cGVkZWYgc3RydWN0IEhFVkNTRUlBNTNDYXB0aW9uIHsKKyAgICBpbnQgYTUzX2NhcHRpb25fc2l6ZTsKKyAgICB1aW50OF90ICphNTNfY2FwdGlvbjsKK30gSEVWQ1NFSUE1M0NhcHRpb247CisKK3R5cGVkZWYgc3RydWN0IEhFVkNTRUlNYXN0ZXJpbmdEaXNwbGF5IHsKKyAgICBpbnQgcHJlc2VudDsKKyAgICB1aW50MTZfdCBkaXNwbGF5X3ByaW1hcmllc1szXVsyXTsKKyAgICB1aW50MTZfdCB3aGl0ZV9wb2ludFsyXTsKKyAgICB1aW50MzJfdCBtYXhfbHVtaW5hbmNlOworICAgIHVpbnQzMl90IG1pbl9sdW1pbmFuY2U7Cit9IEhFVkNTRUlNYXN0ZXJpbmdEaXNwbGF5OworCit0eXBlZGVmIHN0cnVjdCBIRVZDU0VJQ29udGVudExpZ2h0IHsKKyAgICBpbnQgcHJlc2VudDsKKyAgICB1aW50MTZfdCBtYXhfY29udGVudF9saWdodF9sZXZlbDsKKyAgICB1aW50MTZfdCBtYXhfcGljX2F2ZXJhZ2VfbGlnaHRfbGV2ZWw7Cit9IEhFVkNTRUlDb250ZW50TGlnaHQ7CisKK3R5cGVkZWYgc3RydWN0IEhFVkNTRUlBbHRlcm5hdGl2ZVRyYW5zZmVyIHsKKyAgICBpbnQgcHJlc2VudDsKKyAgICBpbnQgcHJlZmVycmVkX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKK30gSEVWQ1NFSUFsdGVybmF0aXZlVHJhbnNmZXI7CisKK3R5cGVkZWYgc3RydWN0IEhFVkNTRUkgeworICAgIEhFVkNTRUlQaWN0dXJlSGFzaCBwaWN0dXJlX2hhc2g7CisgICAgSEVWQ1NFSUZyYW1lUGFja2luZyBmcmFtZV9wYWNraW5nOworICAgIEhFVkNTRUlEaXNwbGF5T3JpZW50YXRpb24gZGlzcGxheV9vcmllbnRhdGlvbjsKKyAgICBIRVZDU0VJUGljdHVyZVRpbWluZyBwaWN0dXJlX3RpbWluZzsKKyAgICBIRVZDU0VJQTUzQ2FwdGlvbiBhNTNfY2FwdGlvbjsKKyAgICBIRVZDU0VJTWFzdGVyaW5nRGlzcGxheSBtYXN0ZXJpbmdfZGlzcGxheTsKKyAgICBIRVZDU0VJQ29udGVudExpZ2h0IGNvbnRlbnRfbGlnaHQ7CisgICAgaW50IGFjdGl2ZV9zZXFfcGFyYW1ldGVyX3NldF9pZDsKKyAgICBIRVZDU0VJQWx0ZXJuYXRpdmVUcmFuc2ZlciBhbHRlcm5hdGl2ZV90cmFuc2ZlcjsKK30gSEVWQ1NFSTsKKworc3RydWN0IEhFVkNQYXJhbVNldHM7CisKK2ludCBmZl9oZXZjX2RlY29kZV9uYWxfc2VpKEdldEJpdENvbnRleHQgKmdiLCB2b2lkICpsb2djdHgsIEhFVkNTRUkgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgSEVWQ1BhcmFtU2V0cyAqcHMsIGludCB0eXBlKTsKKworLyoqCisgKiBSZXNldCBTRUkgdmFsdWVzIHRoYXQgYXJlIHN0b3JlZCBvbiB0aGUgQ29udGV4dC4KKyAqIGUuZy4gQ2FwdGlvbiBkYXRhIHRoYXQgd2FzIGV4dHJhY3RlZCBkdXJpbmcgTkFMCisgKiBwYXJzaW5nLgorICoKKyAqIEBwYXJhbSBzIEhFVkNDb250ZXh0LgorICovCit2b2lkIGZmX2hldmNfcmVzZXRfc2VpKEhFVkNTRUkgKnMpOworCisjZW5kaWYgLyogQVZDT0RFQ19IRVZDX1NFSV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hldmNkZWMuYyBiL2xpYmF2Y29kZWMvaGV2Y2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMzNhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2hldmNkZWMuYwpAQCAtMCwwICsxLDM1NzIgQEAKKy8qCisgKiBIRVZDIHZpZGVvIERlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEd1aWxsYXVtZSBNYXJ0cmVzCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIE1pY2thZWwgUmF1bGV0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDEzIEdpbGRhcyBDb2NoZXJlbAorICogQ29weXJpZ2h0IChDKSAyMDEyIC0gMjAxMyBXYXNzaW0gSGFtaWRvdWNoZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Rpc3BsYXkuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWFzdGVyaW5nX2Rpc3BsYXlfbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWQ1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3N0ZXJlbzNkLmgiCisKKyNpbmNsdWRlICJic3dhcGRzcC5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJjYWJhY19mdW5jdGlvbnMuaCIKKyNpbmNsdWRlICJnb2xvbWIuaCIKKyNpbmNsdWRlICJoZXZjLmgiCisjaW5jbHVkZSAiaGV2Y19kYXRhLmgiCisjaW5jbHVkZSAiaGV2Y19wYXJzZS5oIgorI2luY2x1ZGUgImhldmNkZWMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCisjaW5jbHVkZSAicHJvZmlsZXMuaCIKKworY29uc3QgdWludDhfdCBmZl9oZXZjX3BlbF93ZWlnaHRbNjVdID0geyBbMl0gPSAwLCBbNF0gPSAxLCBbNl0gPSAyLCBbOF0gPSAzLCBbMTJdID0gNCwgWzE2XSA9IDUsIFsyNF0gPSA2LCBbMzJdID0gNywgWzQ4XSA9IDgsIFs2NF0gPSA5IH07CisKKy8qKgorICogTk9URTogRWFjaCBmdW5jdGlvbiBobHNfZm9vIGNvcnJlc3BvbmQgdG8gdGhlIGZ1bmN0aW9uIGZvbyBpbiB0aGUKKyAqIHNwZWNpZmljYXRpb24gKEhMUyBzdGFuZHMgZm9yIEhpZ2ggTGV2ZWwgU3ludGF4KS4KKyAqLworCisvKioKKyAqIFNlY3Rpb24gNS43CisgKi8KKworLyogZnJlZSBldmVyeXRoaW5nIGFsbG9jYXRlZCAgYnkgcGljX2FycmF5c19pbml0KCkgKi8KK3N0YXRpYyB2b2lkIHBpY19hcnJheXNfZnJlZShIRVZDQ29udGV4dCAqcykKK3sKKyAgICBhdl9mcmVlcCgmcy0+c2FvKTsKKyAgICBhdl9mcmVlcCgmcy0+ZGVibG9jayk7CisKKyAgICBhdl9mcmVlcCgmcy0+c2tpcF9mbGFnKTsKKyAgICBhdl9mcmVlcCgmcy0+dGFiX2N0X2RlcHRoKTsKKworICAgIGF2X2ZyZWVwKCZzLT50YWJfaXBtKTsKKyAgICBhdl9mcmVlcCgmcy0+Y2JmX2x1bWEpOworICAgIGF2X2ZyZWVwKCZzLT5pc19wY20pOworCisgICAgYXZfZnJlZXAoJnMtPnFwX3lfdGFiKTsKKyAgICBhdl9mcmVlcCgmcy0+dGFiX3NsaWNlX2FkZHJlc3MpOworICAgIGF2X2ZyZWVwKCZzLT5maWx0ZXJfc2xpY2VfZWRnZXMpOworCisgICAgYXZfZnJlZXAoJnMtPmhvcml6b250YWxfYnMpOworICAgIGF2X2ZyZWVwKCZzLT52ZXJ0aWNhbF9icyk7CisKKyAgICBhdl9mcmVlcCgmcy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0KTsKKyAgICBhdl9mcmVlcCgmcy0+c2guc2l6ZSk7CisgICAgYXZfZnJlZXAoJnMtPnNoLm9mZnNldCk7CisKKyAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJnMtPnRhYl9tdmZfcG9vbCk7CisgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZzLT5ycGxfdGFiX3Bvb2wpOworfQorCisvKiBhbGxvY2F0ZSBhcnJheXMgdGhhdCBkZXBlbmQgb24gZnJhbWUgZGltZW5zaW9ucyAqLworc3RhdGljIGludCBwaWNfYXJyYXlzX2luaXQoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IEhFVkNTUFMgKnNwcykKK3sKKyAgICBpbnQgbG9nMl9taW5fY2Jfc2l6ZSA9IHNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgd2lkdGggICAgICAgICAgICA9IHNwcy0+d2lkdGg7CisgICAgaW50IGhlaWdodCAgICAgICAgICAgPSBzcHMtPmhlaWdodDsKKyAgICBpbnQgcGljX3NpemVfaW5fY3RiICA9ICgod2lkdGggID4+IGxvZzJfbWluX2NiX3NpemUpICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKChoZWlnaHQgPj4gbG9nMl9taW5fY2Jfc2l6ZSkgKyAxKTsKKyAgICBpbnQgY3RiX2NvdW50ICAgICAgICA9IHNwcy0+Y3RiX3dpZHRoICogc3BzLT5jdGJfaGVpZ2h0OworICAgIGludCBtaW5fcHVfc2l6ZSAgICAgID0gc3BzLT5taW5fcHVfd2lkdGggKiBzcHMtPm1pbl9wdV9oZWlnaHQ7CisKKyAgICBzLT5ic193aWR0aCAgPSAod2lkdGggID4+IDIpICsgMTsKKyAgICBzLT5ic19oZWlnaHQgPSAoaGVpZ2h0ID4+IDIpICsgMTsKKworICAgIHMtPnNhbyAgICAgICAgICAgPSBhdl9tYWxsb2N6X2FycmF5KGN0Yl9jb3VudCwgc2l6ZW9mKCpzLT5zYW8pKTsKKyAgICBzLT5kZWJsb2NrICAgICAgID0gYXZfbWFsbG9jel9hcnJheShjdGJfY291bnQsIHNpemVvZigqcy0+ZGVibG9jaykpOworICAgIGlmICghcy0+c2FvIHx8ICFzLT5kZWJsb2NrKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzLT5za2lwX2ZsYWcgICAgPSBhdl9tYWxsb2NfYXJyYXkoc3BzLT5taW5fY2JfaGVpZ2h0LCBzcHMtPm1pbl9jYl93aWR0aCk7CisgICAgcy0+dGFiX2N0X2RlcHRoID0gYXZfbWFsbG9jX2FycmF5KHNwcy0+bWluX2NiX2hlaWdodCwgc3BzLT5taW5fY2Jfd2lkdGgpOworICAgIGlmICghcy0+c2tpcF9mbGFnIHx8ICFzLT50YWJfY3RfZGVwdGgpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPmNiZl9sdW1hID0gYXZfbWFsbG9jX2FycmF5KHNwcy0+bWluX3RiX3dpZHRoLCBzcHMtPm1pbl90Yl9oZWlnaHQpOworICAgIHMtPnRhYl9pcG0gID0gYXZfbWFsbG9jeihtaW5fcHVfc2l6ZSk7CisgICAgcy0+aXNfcGNtICAgPSBhdl9tYWxsb2NfYXJyYXkoc3BzLT5taW5fcHVfd2lkdGggKyAxLCBzcHMtPm1pbl9wdV9oZWlnaHQgKyAxKTsKKyAgICBpZiAoIXMtPnRhYl9pcG0gfHwgIXMtPmNiZl9sdW1hIHx8ICFzLT5pc19wY20pCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPmZpbHRlcl9zbGljZV9lZGdlcyA9IGF2X21hbGxvY3ooY3RiX2NvdW50KTsKKyAgICBzLT50YWJfc2xpY2VfYWRkcmVzcyAgPSBhdl9tYWxsb2NfYXJyYXkocGljX3NpemVfaW5fY3RiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPnRhYl9zbGljZV9hZGRyZXNzKSk7CisgICAgcy0+cXBfeV90YWIgICAgICAgICAgID0gYXZfbWFsbG9jX2FycmF5KHBpY19zaXplX2luX2N0YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5xcF95X3RhYikpOworICAgIGlmICghcy0+cXBfeV90YWIgfHwgIXMtPmZpbHRlcl9zbGljZV9lZGdlcyB8fCAhcy0+dGFiX3NsaWNlX2FkZHJlc3MpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPmhvcml6b250YWxfYnMgPSBhdl9tYWxsb2N6X2FycmF5KHMtPmJzX3dpZHRoLCBzLT5ic19oZWlnaHQpOworICAgIHMtPnZlcnRpY2FsX2JzICAgPSBhdl9tYWxsb2N6X2FycmF5KHMtPmJzX3dpZHRoLCBzLT5ic19oZWlnaHQpOworICAgIGlmICghcy0+aG9yaXpvbnRhbF9icyB8fCAhcy0+dmVydGljYWxfYnMpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPnRhYl9tdmZfcG9vbCA9IGF2X2J1ZmZlcl9wb29sX2luaXQobWluX3B1X3NpemUgKiBzaXplb2YoTXZGaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9idWZmZXJfYWxsb2N6KTsKKyAgICBzLT5ycGxfdGFiX3Bvb2wgPSBhdl9idWZmZXJfcG9vbF9pbml0KGN0Yl9jb3VudCAqIHNpemVvZihSZWZQaWNMaXN0VGFiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2J1ZmZlcl9hbGxvY3opOworICAgIGlmICghcy0+dGFiX212Zl9wb29sIHx8ICFzLT5ycGxfdGFiX3Bvb2wpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHBpY19hcnJheXNfZnJlZShzKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQorCitzdGF0aWMgaW50IHByZWRfd2VpZ2h0X3RhYmxlKEhFVkNDb250ZXh0ICpzLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGogPSAwOworICAgIHVpbnQ4X3QgbHVtYV93ZWlnaHRfbDBfZmxhZ1sxNl07CisgICAgdWludDhfdCBjaHJvbWFfd2VpZ2h0X2wwX2ZsYWdbMTZdOworICAgIHVpbnQ4X3QgbHVtYV93ZWlnaHRfbDFfZmxhZ1sxNl07CisgICAgdWludDhfdCBjaHJvbWFfd2VpZ2h0X2wxX2ZsYWdbMTZdOworICAgIGludCBsdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tOworCisgICAgbHVtYV9sb2cyX3dlaWdodF9kZW5vbSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgaWYgKGx1bWFfbG9nMl93ZWlnaHRfZGVub20gPCAwIHx8IGx1bWFfbG9nMl93ZWlnaHRfZGVub20gPiA3KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibHVtYV9sb2cyX3dlaWdodF9kZW5vbSAlZCBpcyBpbnZhbGlkXG4iLCBsdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIHMtPnNoLmx1bWFfbG9nMl93ZWlnaHRfZGVub20gPSBhdl9jbGlwX3VpbnRwMihsdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLCAzKTsKKyAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwKSB7CisgICAgICAgIGludDY0X3QgY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gbHVtYV9sb2cyX3dlaWdodF9kZW5vbSArIChpbnQ2NF90KWdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICBpZiAoY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tIDwgMCB8fCBjaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gPiA3KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSAlIlBSSWQ2NCIgaXMgaW52YWxpZFxuIiwgY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSA9IGNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMF07IGkrKykgeworICAgICAgICBsdW1hX3dlaWdodF9sMF9mbGFnW2ldID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgaWYgKCFsdW1hX3dlaWdodF9sMF9mbGFnW2ldKSB7CisgICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMFtpXSA9IDEgPDwgcy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wwW2ldID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAhPSAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zaC5uYl9yZWZzW0wwXTsgaSsrKQorICAgICAgICAgICAgY2hyb21hX3dlaWdodF9sMF9mbGFnW2ldID0gZ2V0X2JpdHMxKGdiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMF07IGkrKykKKyAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSA9IDA7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zaC5uYl9yZWZzW0wwXTsgaSsrKSB7CisgICAgICAgIGlmIChsdW1hX3dlaWdodF9sMF9mbGFnW2ldKSB7CisgICAgICAgICAgICBpbnQgZGVsdGFfbHVtYV93ZWlnaHRfbDAgPSBnZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgICAgIHMtPnNoLmx1bWFfd2VpZ2h0X2wwW2ldID0gKDEgPDwgcy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbSkgKyBkZWx0YV9sdW1hX3dlaWdodF9sMDsKKyAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wwW2ldID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNocm9tYV93ZWlnaHRfbDBfZmxhZ1tpXSkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgIGludCBkZWx0YV9jaHJvbWFfd2VpZ2h0X2wwID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgaW50IGRlbHRhX2Nocm9tYV9vZmZzZXRfbDAgPSBnZXRfc2VfZ29sb21iKGdiKTsKKworICAgICAgICAgICAgICAgIGlmICggICAoaW50OF90KWRlbHRhX2Nocm9tYV93ZWlnaHRfbDAgIT0gZGVsdGFfY2hyb21hX3dlaWdodF9sMAorICAgICAgICAgICAgICAgICAgICB8fCBkZWx0YV9jaHJvbWFfb2Zmc2V0X2wwIDwgLSgxPDwxNykgfHwgZGVsdGFfY2hyb21hX29mZnNldF9sMCA+ICgxPDwxNykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMFtpXVtqXSA9ICgxIDw8IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSkgKyBkZWx0YV9jaHJvbWFfd2VpZ2h0X2wwOworICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbaV1bal0gPSBhdl9jbGlwKChkZWx0YV9jaHJvbWFfb2Zmc2V0X2wwIC0gKCgxMjggKiBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2ldW2pdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIDEyOCksIC0xMjgsIDEyNyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2ldWzBdID0gMSA8PCBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgICAgICAgICBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wwW2ldWzBdID0gMDsKKyAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDBbaV1bMV0gPSAxIDw8IHMtPnNoLmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbaV1bMV0gPSAwOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzLT5zaC5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c2gubmJfcmVmc1tMMV07IGkrKykgeworICAgICAgICAgICAgbHVtYV93ZWlnaHRfbDFfZmxhZ1tpXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAoIWx1bWFfd2VpZ2h0X2wxX2ZsYWdbaV0pIHsKKyAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMVtpXSA9IDEgPDwgcy0+c2gubHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX29mZnNldF9sMVtpXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNoLm5iX3JlZnNbTDFdOyBpKyspCisgICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodF9sMV9mbGFnW2ldID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zaC5uYl9yZWZzW0wxXTsgaSsrKQorICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRfbDFfZmxhZ1tpXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNoLm5iX3JlZnNbTDFdOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChsdW1hX3dlaWdodF9sMV9mbGFnW2ldKSB7CisgICAgICAgICAgICAgICAgaW50IGRlbHRhX2x1bWFfd2VpZ2h0X2wxID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgcy0+c2gubHVtYV93ZWlnaHRfbDFbaV0gPSAoMSA8PCBzLT5zaC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIGRlbHRhX2x1bWFfd2VpZ2h0X2wxOworICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wxW2ldID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hyb21hX3dlaWdodF9sMV9mbGFnW2ldKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFfY2hyb21hX3dlaWdodF9sMSA9IGdldF9zZV9nb2xvbWIoZ2IpOworICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGFfY2hyb21hX29mZnNldF9sMSA9IGdldF9zZV9nb2xvbWIoZ2IpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggICAoaW50OF90KWRlbHRhX2Nocm9tYV93ZWlnaHRfbDEgIT0gZGVsdGFfY2hyb21hX3dlaWdodF9sMQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVsdGFfY2hyb21hX29mZnNldF9sMSA8IC0oMTw8MTcpIHx8IGRlbHRhX2Nocm9tYV9vZmZzZXRfbDEgPiAoMTw8MTcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDFbaV1bal0gPSAoMSA8PCBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pICsgZGVsdGFfY2hyb21hX3dlaWdodF9sMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX29mZnNldF9sMVtpXVtqXSA9IGF2X2NsaXAoKGRlbHRhX2Nocm9tYV9vZmZzZXRfbDEgLSAoKDEyOCAqIHMtPnNoLmNocm9tYV93ZWlnaHRfbDFbaV1bal0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4gcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKSArIDEyOCksIC0xMjgsIDEyNyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wxW2ldWzBdID0gMSA8PCBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX29mZnNldF9sMVtpXVswXSA9IDA7CisgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMVtpXVsxXSA9IDEgPDwgcy0+c2guY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tOworICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDFbaV1bMV0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9sdF9ycHMoSEVWQ0NvbnRleHQgKnMsIExvbmdUZXJtUlBTICpycHMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGNvbnN0IEhFVkNTUFMgKnNwcyA9IHMtPnBzLnNwczsKKyAgICBpbnQgbWF4X3BvY19sc2IgICAgPSAxIDw8IHNwcy0+bG9nMl9tYXhfcG9jX2xzYjsKKyAgICBpbnQgcHJldl9kZWx0YV9tc2IgPSAwOworICAgIHVuc2lnbmVkIGludCBuYl9zcHMgPSAwLCBuYl9zaDsKKyAgICBpbnQgaTsKKworICAgIHJwcy0+bmJfcmVmcyA9IDA7CisgICAgaWYgKCFzcHMtPmxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKHNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMgPiAwKQorICAgICAgICBuYl9zcHMgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgIG5iX3NoID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKworICAgIGlmIChuYl9zcHMgPiBzcHMtPm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAobmJfc2ggKyAodWludDY0X3QpbmJfc3BzID4gRkZfQVJSQVlfRUxFTVMocnBzLT5wb2MpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJwcy0+bmJfcmVmcyA9IG5iX3NoICsgbmJfc3BzOworCisgICAgZm9yIChpID0gMDsgaSA8IHJwcy0+bmJfcmVmczsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgZGVsdGFfcG9jX21zYl9wcmVzZW50OworCisgICAgICAgIGlmIChpIDwgbmJfc3BzKSB7CisgICAgICAgICAgICB1aW50OF90IGx0X2lkeF9zcHMgPSAwOworCisgICAgICAgICAgICBpZiAoc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcyA+IDEpCisgICAgICAgICAgICAgICAgbHRfaWR4X3NwcyA9IGdldF9iaXRzKGdiLCBhdl9jZWlsX2xvZzIoc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcykpOworCisgICAgICAgICAgICBycHMtPnBvY1tpXSAgPSBzcHMtPmx0X3JlZl9waWNfcG9jX2xzYl9zcHNbbHRfaWR4X3Nwc107CisgICAgICAgICAgICBycHMtPnVzZWRbaV0gPSBzcHMtPnVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbbHRfaWR4X3Nwc107CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBycHMtPnBvY1tpXSAgPSBnZXRfYml0cyhnYiwgc3BzLT5sb2cyX21heF9wb2NfbHNiKTsKKyAgICAgICAgICAgIHJwcy0+dXNlZFtpXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgIH0KKworICAgICAgICBkZWx0YV9wb2NfbXNiX3ByZXNlbnQgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBpZiAoZGVsdGFfcG9jX21zYl9wcmVzZW50KSB7CisgICAgICAgICAgICBpbnQ2NF90IGRlbHRhID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgICAgIGludDY0X3QgcG9jOworCisgICAgICAgICAgICBpZiAoaSAmJiBpICE9IG5iX3NwcykKKyAgICAgICAgICAgICAgICBkZWx0YSArPSBwcmV2X2RlbHRhX21zYjsKKworICAgICAgICAgICAgcG9jID0gcnBzLT5wb2NbaV0gKyBzLT5wb2MgLSBkZWx0YSAqIG1heF9wb2NfbHNiIC0gcy0+c2gucGljX29yZGVyX2NudF9sc2I7CisgICAgICAgICAgICBpZiAocG9jICE9IChpbnQzMl90KXBvYykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHJwcy0+cG9jW2ldID0gcG9jOworICAgICAgICAgICAgcHJldl9kZWx0YV9tc2IgPSBkZWx0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBleHBvcnRfc3RyZWFtX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEhFVkNQYXJhbVNldHMgKnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSEVWQ1NQUyAqc3BzKQoreworICAgIGNvbnN0IEhFVkNWUFMgKnZwcyA9IChjb25zdCBIRVZDVlBTKilwcy0+dnBzX2xpc3Rbc3BzLT52cHNfaWRdLT5kYXRhOworICAgIGNvbnN0IEhFVkNXaW5kb3cgKm93ID0gJnNwcy0+b3V0cHV0X3dpbmRvdzsKKyAgICB1bnNpZ25lZCBpbnQgbnVtID0gMCwgZGVuID0gMDsKKworICAgIGF2Y3R4LT5waXhfZm10ICAgICAgICAgICAgID0gc3BzLT5waXhfZm10OworICAgIGF2Y3R4LT5jb2RlZF93aWR0aCAgICAgICAgID0gc3BzLT53aWR0aDsKKyAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0ICAgICAgICA9IHNwcy0+aGVpZ2h0OworICAgIGF2Y3R4LT53aWR0aCAgICAgICAgICAgICAgID0gc3BzLT53aWR0aCAgLSBvdy0+bGVmdF9vZmZzZXQgLSBvdy0+cmlnaHRfb2Zmc2V0OworICAgIGF2Y3R4LT5oZWlnaHQgICAgICAgICAgICAgID0gc3BzLT5oZWlnaHQgLSBvdy0+dG9wX29mZnNldCAgLSBvdy0+Ym90dG9tX29mZnNldDsKKyAgICBhdmN0eC0+aGFzX2JfZnJhbWVzICAgICAgICA9IHNwcy0+dGVtcG9yYWxfbGF5ZXJbc3BzLT5tYXhfc3ViX2xheWVycyAtIDFdLm51bV9yZW9yZGVyX3BpY3M7CisgICAgYXZjdHgtPnByb2ZpbGUgICAgICAgICAgICAgPSBzcHMtPnB0bC5nZW5lcmFsX3B0bC5wcm9maWxlX2lkYzsKKyAgICBhdmN0eC0+bGV2ZWwgICAgICAgICAgICAgICA9IHNwcy0+cHRsLmdlbmVyYWxfcHRsLmxldmVsX2lkYzsKKworICAgIGZmX3NldF9zYXIoYXZjdHgsIHNwcy0+dnVpLnNhcik7CisKKyAgICBpZiAoc3BzLT52dWkudmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnKQorICAgICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPSBzcHMtPnZ1aS52aWRlb19mdWxsX3JhbmdlX2ZsYWcgPyBBVkNPTF9SQU5HRV9KUEVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWQ09MX1JBTkdFX01QRUc7CisgICAgZWxzZQorICAgICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9NUEVHOworCisgICAgaWYgKHNwcy0+dnVpLmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IHNwcy0+dnVpLmNvbG91cl9wcmltYXJpZXM7CisgICAgICAgIGF2Y3R4LT5jb2xvcl90cmMgICAgICAgPSBzcHMtPnZ1aS50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpYzsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgICAgICA9IHNwcy0+dnVpLm1hdHJpeF9jb2VmZnM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRDsKKyAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICA9IEFWQ09MX1RSQ19VTlNQRUNJRklFRDsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgICAgICA9IEFWQ09MX1NQQ19VTlNQRUNJRklFRDsKKyAgICB9CisKKyAgICBpZiAodnBzLT52cHNfdGltaW5nX2luZm9fcHJlc2VudF9mbGFnKSB7CisgICAgICAgIG51bSA9IHZwcy0+dnBzX251bV91bml0c19pbl90aWNrOworICAgICAgICBkZW4gPSB2cHMtPnZwc190aW1lX3NjYWxlOworICAgIH0gZWxzZSBpZiAoc3BzLT52dWkudnVpX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZykgeworICAgICAgICBudW0gPSBzcHMtPnZ1aS52dWlfbnVtX3VuaXRzX2luX3RpY2s7CisgICAgICAgIGRlbiA9IHNwcy0+dnVpLnZ1aV90aW1lX3NjYWxlOworICAgIH0KKworICAgIGlmIChudW0gIT0gMCAmJiBkZW4gIT0gMCkKKyAgICAgICAgYXZfcmVkdWNlKCZhdmN0eC0+ZnJhbWVyYXRlLmRlbiwgJmF2Y3R4LT5mcmFtZXJhdGUubnVtLAorICAgICAgICAgICAgICAgICAgbnVtLCBkZW4sIDEgPDwgMzApOworfQorCitzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGdldF9mb3JtYXQoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IEhFVkNTUFMgKnNwcykKK3sKKyNkZWZpbmUgSFdBQ0NFTF9NQVggKENPTkZJR19IRVZDX0RYVkEyX0hXQUNDRUwgKyBcCisgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSEVWQ19EM0QxMVZBX0hXQUNDRUwgKiAyICsgXAorICAgICAgICAgICAgICAgICAgICAgQ09ORklHX0hFVkNfTlZERUNfSFdBQ0NFTCArIFwKKyAgICAgICAgICAgICAgICAgICAgIENPTkZJR19IRVZDX1ZBQVBJX0hXQUNDRUwgKyBcCisgICAgICAgICAgICAgICAgICAgICBDT05GSUdfSEVWQ19WSURFT1RPT0xCT1hfSFdBQ0NFTCArIFwKKyAgICAgICAgICAgICAgICAgICAgIENPTkZJR19IRVZDX1ZEUEFVX0hXQUNDRUwpCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW0hXQUNDRUxfTUFYICsgMl0sICpmbXQgPSBwaXhfZm10czsKKworICAgIHN3aXRjaCAoc3BzLT5waXhfZm10KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjBQOgorI2lmIENPTkZJR19IRVZDX0RYVkEyX0hXQUNDRUwKKyAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9EWFZBMl9WTEQ7CisjZW5kaWYKKyNpZiBDT05GSUdfSEVWQ19EM0QxMVZBX0hXQUNDRUwKKyAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRDsKKyAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9EM0QxMTsKKyNlbmRpZgorI2lmIENPTkZJR19IRVZDX1ZBQVBJX0hXQUNDRUwKKyAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9WQUFQSTsKKyNlbmRpZgorI2lmIENPTkZJR19IRVZDX1ZEUEFVX0hXQUNDRUwKKyAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9WRFBBVTsKKyNlbmRpZgorI2lmIENPTkZJR19IRVZDX05WREVDX0hXQUNDRUwKKyAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9DVURBOworI2VuZGlmCisjaWYgQ09ORklHX0hFVkNfVklERU9UT09MQk9YX0hXQUNDRUwKKyAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9WSURFT1RPT0xCT1g7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMDoKKyNpZiBDT05GSUdfSEVWQ19EWFZBMl9IV0FDQ0VMCisgICAgICAgICpmbXQrKyA9IEFWX1BJWF9GTVRfRFhWQTJfVkxEOworI2VuZGlmCisjaWYgQ09ORklHX0hFVkNfRDNEMTFWQV9IV0FDQ0VMCisgICAgICAgICpmbXQrKyA9IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQ7CisgICAgICAgICpmbXQrKyA9IEFWX1BJWF9GTVRfRDNEMTE7CisjZW5kaWYKKyNpZiBDT05GSUdfSEVWQ19WQUFQSV9IV0FDQ0VMCisgICAgICAgICpmbXQrKyA9IEFWX1BJWF9GTVRfVkFBUEk7CisjZW5kaWYKKyNpZiBDT05GSUdfSEVWQ19WSURFT1RPT0xCT1hfSFdBQ0NFTAorICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX1ZJREVPVE9PTEJPWDsKKyNlbmRpZgorI2lmIENPTkZJR19IRVZDX05WREVDX0hXQUNDRUwKKyAgICAgICAgKmZtdCsrID0gQVZfUElYX0ZNVF9DVURBOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTI6CisjaWYgQ09ORklHX0hFVkNfTlZERUNfSFdBQ0NFTAorICAgICAgICAqZm10KysgPSBBVl9QSVhfRk1UX0NVREE7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgKmZtdCsrID0gc3BzLT5waXhfZm10OworICAgICpmbXQgPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICByZXR1cm4gZmZfdGhyZWFkX2dldF9mb3JtYXQocy0+YXZjdHgsIHBpeF9mbXRzKTsKK30KKworc3RhdGljIGludCBzZXRfc3BzKEhFVkNDb250ZXh0ICpzLCBjb25zdCBIRVZDU1BTICpzcHMsCisgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgaW50IHJldCwgaTsKKworICAgIHBpY19hcnJheXNfZnJlZShzKTsKKyAgICBzLT5wcy5zcHMgPSBOVUxMOworICAgIHMtPnBzLnZwcyA9IE5VTEw7CisKKyAgICBpZiAoIXNwcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXQgPSBwaWNfYXJyYXlzX2luaXQocywgc3BzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXhwb3J0X3N0cmVhbV9wYXJhbXMocy0+YXZjdHgsICZzLT5wcywgc3BzKTsKKworICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gcGl4X2ZtdDsKKworICAgIGZmX2hldmNfcHJlZF9pbml0KCZzLT5ocGMsICAgICBzcHMtPmJpdF9kZXB0aCk7CisgICAgZmZfaGV2Y19kc3BfaW5pdCAoJnMtPmhldmNkc3AsIHNwcy0+Yml0X2RlcHRoKTsKKyAgICBmZl92aWRlb2RzcF9pbml0ICgmcy0+dmRzcCwgICAgc3BzLT5iaXRfZGVwdGgpOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmcy0+c2FvX3BpeGVsX2J1ZmZlcl9oW2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnNhb19waXhlbF9idWZmZXJfdltpXSk7CisgICAgfQorCisgICAgaWYgKHNwcy0+c2FvX2VuYWJsZWQgJiYgIXMtPmF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgIGludCBjX2NvdW50ID0gKHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgIT0gMCkgPyAzIDogMTsKKyAgICAgICAgaW50IGNfaWR4OworCisgICAgICAgIGZvcihjX2lkeCA9IDA7IGNfaWR4IDwgY19jb3VudDsgY19pZHgrKykgeworICAgICAgICAgICAgaW50IHcgPSBzcHMtPndpZHRoID4+IHNwcy0+aHNoaWZ0W2NfaWR4XTsKKyAgICAgICAgICAgIGludCBoID0gc3BzLT5oZWlnaHQgPj4gc3BzLT52c2hpZnRbY19pZHhdOworICAgICAgICAgICAgcy0+c2FvX3BpeGVsX2J1ZmZlcl9oW2NfaWR4XSA9CisgICAgICAgICAgICAgICAgYXZfbWFsbG9jKCh3ICogMiAqIHNwcy0+Y3RiX2hlaWdodCkgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BzLT5waXhlbF9zaGlmdCk7CisgICAgICAgICAgICBzLT5zYW9fcGl4ZWxfYnVmZmVyX3ZbY19pZHhdID0KKyAgICAgICAgICAgICAgICBhdl9tYWxsb2MoKGggKiAyICogc3BzLT5jdGJfd2lkdGgpIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcy0+cGl4ZWxfc2hpZnQpOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+cHMuc3BzID0gc3BzOworICAgIHMtPnBzLnZwcyA9IChIRVZDVlBTKikgcy0+cHMudnBzX2xpc3Rbcy0+cHMuc3BzLT52cHNfaWRdLT5kYXRhOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgcGljX2FycmF5c19mcmVlKHMpOworICAgIHMtPnBzLnNwcyA9IE5VTEw7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBobHNfc2xpY2VfaGVhZGVyKEhFVkNDb250ZXh0ICpzKQoreworICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPkhFVkNsYy0+Z2I7CisgICAgU2xpY2VIZWFkZXIgKnNoICAgPSAmcy0+c2g7CisgICAgaW50IGksIHJldDsKKworICAgIC8vIENvZGVkIHBhcmFtZXRlcnMKKyAgICBzaC0+Zmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworICAgIGlmIChzLT5yZWYgJiYgc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVHdvIHNsaWNlcyByZXBvcnRpbmcgYmVpbmcgdGhlIGZpcnN0IGluIHRoZSBzYW1lIGZyYW1lLlxuIik7CisgICAgICAgIHJldHVybiAxOyAvLyBUaGlzIHNsaWNlIHdpbGwgYmUgc2tpcGVkIGxhdGVyLCBkbyBub3QgY29ycnVwdCBzdGF0ZQorICAgIH0KKworICAgIGlmICgoSVNfSURSKHMpIHx8IElTX0JMQShzKSkgJiYgc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7CisgICAgICAgIHMtPnNlcV9kZWNvZGUgPSAocy0+c2VxX2RlY29kZSArIDEpICYgMHhmZjsKKyAgICAgICAgcy0+bWF4X3JhICAgICA9IElOVF9NQVg7CisgICAgICAgIGlmIChJU19JRFIocykpCisgICAgICAgICAgICBmZl9oZXZjX2NsZWFyX3JlZnMocyk7CisgICAgfQorICAgIHNoLT5ub19vdXRwdXRfb2ZfcHJpb3JfcGljc19mbGFnID0gMDsKKyAgICBpZiAoSVNfSVJBUChzKSkKKyAgICAgICAgc2gtPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgc2gtPnBwc19pZCA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgaWYgKHNoLT5wcHNfaWQgPj0gSEVWQ19NQVhfUFBTX0NPVU5UIHx8ICFzLT5wcy5wcHNfbGlzdFtzaC0+cHBzX2lkXSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlBQUyBpZCBvdXQgb2YgcmFuZ2U6ICVkXG4iLCBzaC0+cHBzX2lkKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnICYmCisgICAgICAgIHMtPnBzLnBwcyAhPSAoSEVWQ1BQUyopcy0+cHMucHBzX2xpc3Rbc2gtPnBwc19pZF0tPmRhdGEpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQUFMgY2hhbmdlZCBiZXR3ZWVuIHNsaWNlcy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgcy0+cHMucHBzID0gKEhFVkNQUFMqKXMtPnBzLnBwc19saXN0W3NoLT5wcHNfaWRdLT5kYXRhOworICAgIGlmIChzLT5uYWxfdW5pdF90eXBlID09IEhFVkNfTkFMX0NSQV9OVVQgJiYgcy0+bGFzdF9lb3MgPT0gMSkKKyAgICAgICAgc2gtPm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgPSAxOworCisgICAgaWYgKHMtPnBzLnNwcyAhPSAoSEVWQ1NQUyopcy0+cHMuc3BzX2xpc3Rbcy0+cHMucHBzLT5zcHNfaWRdLT5kYXRhKSB7CisgICAgICAgIGNvbnN0IEhFVkNTUFMgKnNwcyA9IChIRVZDU1BTKilzLT5wcy5zcHNfbGlzdFtzLT5wcy5wcHMtPnNwc19pZF0tPmRhdGE7CisgICAgICAgIGNvbnN0IEhFVkNTUFMgKmxhc3Rfc3BzID0gcy0+cHMuc3BzOworICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKworICAgICAgICBpZiAobGFzdF9zcHMgJiYgSVNfSVJBUChzKSAmJiBzLT5uYWxfdW5pdF90eXBlICE9IEhFVkNfTkFMX0NSQV9OVVQpIHsKKyAgICAgICAgICAgIGlmIChzcHMtPndpZHRoICE9IGxhc3Rfc3BzLT53aWR0aCB8fCBzcHMtPmhlaWdodCAhPSBsYXN0X3Nwcy0+aGVpZ2h0IHx8CisgICAgICAgICAgICAgICAgc3BzLT50ZW1wb3JhbF9sYXllcltzcHMtPm1heF9zdWJfbGF5ZXJzIC0gMV0ubWF4X2RlY19waWNfYnVmZmVyaW5nICE9CisgICAgICAgICAgICAgICAgbGFzdF9zcHMtPnRlbXBvcmFsX2xheWVyW2xhc3Rfc3BzLT5tYXhfc3ViX2xheWVycyAtIDFdLm1heF9kZWNfcGljX2J1ZmZlcmluZykKKyAgICAgICAgICAgICAgICBzaC0+bm9fb3V0cHV0X29mX3ByaW9yX3BpY3NfZmxhZyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZmZfaGV2Y19jbGVhcl9yZWZzKHMpOworCisgICAgICAgIHJldCA9IHNldF9zcHMocywgc3BzLCBzcHMtPnBpeF9mbXQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcGl4X2ZtdCA9IGdldF9mb3JtYXQocywgc3BzKTsKKyAgICAgICAgaWYgKHBpeF9mbXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHBpeF9mbXQ7CisgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ID0gcGl4X2ZtdDsKKworICAgICAgICBzLT5zZXFfZGVjb2RlID0gKHMtPnNlcV9kZWNvZGUgKyAxKSAmIDB4ZmY7CisgICAgICAgIHMtPm1heF9yYSAgICAgPSBJTlRfTUFYOworICAgIH0KKworICAgIHNoLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnID0gMDsKKyAgICBpZiAoIXNoLT5maXJzdF9zbGljZV9pbl9waWNfZmxhZykgeworICAgICAgICBpbnQgc2xpY2VfYWRkcmVzc19sZW5ndGg7CisKKyAgICAgICAgaWYgKHMtPnBzLnBwcy0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZykKKyAgICAgICAgICAgIHNoLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICBzbGljZV9hZGRyZXNzX2xlbmd0aCA9IGF2X2NlaWxfbG9nMihzLT5wcy5zcHMtPmN0Yl93aWR0aCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBzLnNwcy0+Y3RiX2hlaWdodCk7CisgICAgICAgIHNoLT5zbGljZV9zZWdtZW50X2FkZHIgPSBnZXRfYml0c3ooZ2IsIHNsaWNlX2FkZHJlc3NfbGVuZ3RoKTsKKyAgICAgICAgaWYgKHNoLT5zbGljZV9zZWdtZW50X2FkZHIgPj0gcy0+cHMuc3BzLT5jdGJfd2lkdGggKiBzLT5wcy5zcHMtPmN0Yl9oZWlnaHQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHNsaWNlIHNlZ21lbnQgYWRkcmVzczogJXUuXG4iLAorICAgICAgICAgICAgICAgICAgIHNoLT5zbGljZV9zZWdtZW50X2FkZHIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNoLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnKSB7CisgICAgICAgICAgICBzaC0+c2xpY2VfYWRkciA9IHNoLT5zbGljZV9zZWdtZW50X2FkZHI7CisgICAgICAgICAgICBzLT5zbGljZV9pZHgrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHNoLT5zbGljZV9zZWdtZW50X2FkZHIgPSBzaC0+c2xpY2VfYWRkciA9IDA7CisgICAgICAgIHMtPnNsaWNlX2lkeCAgICAgICAgICAgPSAwOworICAgICAgICBzLT5zbGljZV9pbml0aWFsaXplZCAgID0gMDsKKyAgICB9CisKKyAgICBpZiAoIXNoLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnKSB7CisgICAgICAgIHMtPnNsaWNlX2luaXRpYWxpemVkID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cHMucHBzLT5udW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHM7IGkrKykKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMSk7ICAvLyBzbGljZV9yZXNlcnZlZF91bmRldGVybWluZWRfZmxhZ1tdCisKKyAgICAgICAgc2gtPnNsaWNlX3R5cGUgPSBnZXRfdWVfZ29sb21iX2xvbmcoZ2IpOworICAgICAgICBpZiAoIShzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0kgfHwKKyAgICAgICAgICAgICAgc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9QIHx8CisgICAgICAgICAgICAgIHNoLT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBzbGljZSB0eXBlOiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgc2gtPnNsaWNlX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKElTX0lSQVAocykgJiYgc2gtPnNsaWNlX3R5cGUgIT0gSEVWQ19TTElDRV9JKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludGVyIHNsaWNlcyBpbiBhbiBJUkFQIGZyYW1lLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdoZW4gZmxhZyBpcyBub3QgcHJlc2VudCwgcGljdHVyZSBpcyBpbmZlcnJlZCB0byBiZSBvdXRwdXQKKyAgICAgICAgc2gtPnBpY19vdXRwdXRfZmxhZyA9IDE7CisgICAgICAgIGlmIChzLT5wcy5wcHMtPm91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZykKKyAgICAgICAgICAgIHNoLT5waWNfb3V0cHV0X2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgIGlmIChzLT5wcy5zcHMtPnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnKQorICAgICAgICAgICAgc2gtPmNvbG91cl9wbGFuZV9pZCA9IGdldF9iaXRzKGdiLCAyKTsKKworICAgICAgICBpZiAoIUlTX0lEUihzKSkgeworICAgICAgICAgICAgaW50IHBvYywgcG9zOworCisgICAgICAgICAgICBzaC0+cGljX29yZGVyX2NudF9sc2IgPSBnZXRfYml0cyhnYiwgcy0+cHMuc3BzLT5sb2cyX21heF9wb2NfbHNiKTsKKyAgICAgICAgICAgIHBvYyA9IGZmX2hldmNfY29tcHV0ZV9wb2Mocy0+cHMuc3BzLCBzLT5wb2NUaWQwLCBzaC0+cGljX29yZGVyX2NudF9sc2IsIHMtPm5hbF91bml0X3R5cGUpOworICAgICAgICAgICAgaWYgKCFzaC0+Zmlyc3Rfc2xpY2VfaW5fcGljX2ZsYWcgJiYgcG9jICE9IHMtPnBvYykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBQT0MgY2hhbmdlIGJldHdlZW4gc2xpY2VzOiAlZCAtPiAlZFxuIiwgcy0+cG9jLCBwb2MpOworICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgcG9jID0gcy0+cG9jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+cG9jID0gcG9jOworCisgICAgICAgICAgICBzaC0+c2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBwb3MgPSBnZXRfYml0c19sZWZ0KGdiKTsKKyAgICAgICAgICAgIGlmICghc2gtPnNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9oZXZjX2RlY29kZV9zaG9ydF90ZXJtX3JwcyhnYiwgcy0+YXZjdHgsICZzaC0+c2xpY2VfcnBzLCBzLT5wcy5zcHMsIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgc2gtPnNob3J0X3Rlcm1fcnBzID0gJnNoLT5zbGljZV9ycHM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBudW1iaXRzLCBycHNfaWR4OworCisgICAgICAgICAgICAgICAgaWYgKCFzLT5wcy5zcHMtPm5iX3N0X3JwcykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIHJlZiBsaXN0cyBpbiB0aGUgU1BTLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG51bWJpdHMgPSBhdl9jZWlsX2xvZzIocy0+cHMuc3BzLT5uYl9zdF9ycHMpOworICAgICAgICAgICAgICAgIHJwc19pZHggPSBudW1iaXRzID4gMCA/IGdldF9iaXRzKGdiLCBudW1iaXRzKSA6IDA7CisgICAgICAgICAgICAgICAgc2gtPnNob3J0X3Rlcm1fcnBzID0gJnMtPnBzLnNwcy0+c3RfcnBzW3Jwc19pZHhdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2gtPnNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc2l6ZSA9IHBvcyAtIGdldF9iaXRzX2xlZnQoZ2IpOworCisgICAgICAgICAgICBwb3MgPSBnZXRfYml0c19sZWZ0KGdiKTsKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9sdF9ycHMocywgJnNoLT5sb25nX3Rlcm1fcnBzLCBnYik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGxvbmcgdGVybSBSUFMuXG4iKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2gtPmxvbmdfdGVybV9yZWZfcGljX3NldF9zaXplID0gcG9zIC0gZ2V0X2JpdHNfbGVmdChnYik7CisKKyAgICAgICAgICAgIGlmIChzLT5wcy5zcHMtPnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnKQorICAgICAgICAgICAgICAgIHNoLT5zbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5zaC5zaG9ydF90ZXJtX3JwcyA9IE5VTEw7CisgICAgICAgICAgICBzLT5wb2MgICAgICAgICAgICAgICA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKiA4LjMuMSAqLworICAgICAgICBpZiAoc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnICYmIHMtPnRlbXBvcmFsX2lkID09IDAgJiYKKyAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gSEVWQ19OQUxfVFJBSUxfTiAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBIRVZDX05BTF9UU0FfTiAgICYmCisgICAgICAgICAgICBzLT5uYWxfdW5pdF90eXBlICE9IEhFVkNfTkFMX1NUU0FfTiAgJiYKKyAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gSEVWQ19OQUxfUkFETF9OICAmJgorICAgICAgICAgICAgcy0+bmFsX3VuaXRfdHlwZSAhPSBIRVZDX05BTF9SQURMX1IgICYmCisgICAgICAgICAgICBzLT5uYWxfdW5pdF90eXBlICE9IEhFVkNfTkFMX1JBU0xfTiAgJiYKKyAgICAgICAgICAgIHMtPm5hbF91bml0X3R5cGUgIT0gSEVWQ19OQUxfUkFTTF9SKQorICAgICAgICAgICAgcy0+cG9jVGlkMCA9IHMtPnBvYzsKKworICAgICAgICBpZiAocy0+cHMuc3BzLT5zYW9fZW5hYmxlZCkgeworICAgICAgICAgICAgc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1swXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYykgeworICAgICAgICAgICAgICAgIHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMV0gPQorICAgICAgICAgICAgICAgIHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMl0gPSBnZXRfYml0czEoZ2IpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1swXSA9IDA7CisgICAgICAgICAgICBzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzFdID0gMDsKKyAgICAgICAgICAgIHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMl0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgc2gtPm5iX3JlZnNbTDBdID0gc2gtPm5iX3JlZnNbTDFdID0gMDsKKyAgICAgICAgaWYgKHNoLT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfUCB8fCBzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpIHsKKyAgICAgICAgICAgIGludCBuYl9yZWZzOworCisgICAgICAgICAgICBzaC0+bmJfcmVmc1tMMF0gPSBzLT5wcy5wcHMtPm51bV9yZWZfaWR4X2wwX2RlZmF1bHRfYWN0aXZlOworICAgICAgICAgICAgaWYgKHNoLT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQikKKyAgICAgICAgICAgICAgICBzaC0+bmJfcmVmc1tMMV0gPSBzLT5wcy5wcHMtPm51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlOworCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvLyBudW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZworICAgICAgICAgICAgICAgIHNoLT5uYl9yZWZzW0wwXSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICAgICAgICAgIGlmIChzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpCisgICAgICAgICAgICAgICAgICAgIHNoLT5uYl9yZWZzW0wxXSA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYikgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNoLT5uYl9yZWZzW0wwXSA+IEhFVkNfTUFYX1JFRlMgfHwgc2gtPm5iX3JlZnNbTDFdID4gSEVWQ19NQVhfUkVGUykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgcmVmczogJWQvJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzaC0+bmJfcmVmc1tMMF0sIHNoLT5uYl9yZWZzW0wxXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNoLT5ycGxfbW9kaWZpY2F0aW9uX2ZsYWdbMF0gPSAwOworICAgICAgICAgICAgc2gtPnJwbF9tb2RpZmljYXRpb25fZmxhZ1sxXSA9IDA7CisgICAgICAgICAgICBuYl9yZWZzID0gZmZfaGV2Y19mcmFtZV9uYl9yZWZzKHMpOworICAgICAgICAgICAgaWYgKCFuYl9yZWZzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJaZXJvIHJlZnMgZm9yIGEgZnJhbWUgd2l0aCBQIG9yIEIgc2xpY2VzLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5wcy5wcHMtPmxpc3RzX21vZGlmaWNhdGlvbl9wcmVzZW50X2ZsYWcgJiYgbmJfcmVmcyA+IDEpIHsKKyAgICAgICAgICAgICAgICBzaC0+cnBsX21vZGlmaWNhdGlvbl9mbGFnWzBdID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgICAgICBpZiAoc2gtPnJwbF9tb2RpZmljYXRpb25fZmxhZ1swXSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2gtPm5iX3JlZnNbTDBdOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzaC0+bGlzdF9lbnRyeV9seFswXVtpXSA9IGdldF9iaXRzKGdiLCBhdl9jZWlsX2xvZzIobmJfcmVmcykpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpIHsKKyAgICAgICAgICAgICAgICAgICAgc2gtPnJwbF9tb2RpZmljYXRpb25fZmxhZ1sxXSA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaC0+cnBsX21vZGlmaWNhdGlvbl9mbGFnWzFdID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2gtPm5iX3JlZnNbTDFdOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2gtPmxpc3RfZW50cnlfbHhbMV1baV0gPSBnZXRfYml0cyhnYiwgYXZfY2VpbF9sb2cyKG5iX3JlZnMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpCisgICAgICAgICAgICAgICAgc2gtPm12ZF9sMV96ZXJvX2ZsYWcgPSBnZXRfYml0czEoZ2IpOworCisgICAgICAgICAgICBpZiAocy0+cHMucHBzLT5jYWJhY19pbml0X3ByZXNlbnRfZmxhZykKKyAgICAgICAgICAgICAgICBzaC0+Y2FiYWNfaW5pdF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzaC0+Y2FiYWNfaW5pdF9mbGFnID0gMDsKKworICAgICAgICAgICAgc2gtPmNvbGxvY2F0ZWRfcmVmX2lkeCA9IDA7CisgICAgICAgICAgICBpZiAoc2gtPnNsaWNlX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcpIHsKKyAgICAgICAgICAgICAgICBzaC0+Y29sbG9jYXRlZF9saXN0ID0gTDA7CisgICAgICAgICAgICAgICAgaWYgKHNoLT5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQikKKyAgICAgICAgICAgICAgICAgICAgc2gtPmNvbGxvY2F0ZWRfbGlzdCA9ICFnZXRfYml0czEoZ2IpOworCisgICAgICAgICAgICAgICAgaWYgKHNoLT5uYl9yZWZzW3NoLT5jb2xsb2NhdGVkX2xpc3RdID4gMSkgeworICAgICAgICAgICAgICAgICAgICBzaC0+Y29sbG9jYXRlZF9yZWZfaWR4ID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNoLT5jb2xsb2NhdGVkX3JlZl9pZHggPj0gc2gtPm5iX3JlZnNbc2gtPmNvbGxvY2F0ZWRfbGlzdF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbGxvY2F0ZWRfcmVmX2lkeDogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoLT5jb2xsb2NhdGVkX3JlZl9pZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocy0+cHMucHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcgICAmJiBzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX1ApIHx8CisgICAgICAgICAgICAgICAgKHMtPnBzLnBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2ZsYWcgJiYgc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CKSkgeworICAgICAgICAgICAgICAgIGludCByZXQgPSBwcmVkX3dlaWdodF90YWJsZShzLCBnYik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNoLT5tYXhfbnVtX21lcmdlX2NhbmQgPSA1IC0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgICAgIGlmIChzaC0+bWF4X251bV9tZXJnZV9jYW5kIDwgMSB8fCBzaC0+bWF4X251bV9tZXJnZV9jYW5kID4gNSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBudW1iZXIgb2YgbWVyZ2luZyBNVlAgY2FuZGlkYXRlczogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzaC0+bWF4X251bV9tZXJnZV9jYW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNoLT5zbGljZV9xcF9kZWx0YSA9IGdldF9zZV9nb2xvbWIoZ2IpOworCisgICAgICAgIGlmIChzLT5wcy5wcHMtPnBpY19zbGljZV9sZXZlbF9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWcpIHsKKyAgICAgICAgICAgIHNoLT5zbGljZV9jYl9xcF9vZmZzZXQgPSBnZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgICAgIHNoLT5zbGljZV9jcl9xcF9vZmZzZXQgPSBnZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNoLT5zbGljZV9jYl9xcF9vZmZzZXQgPSAwOworICAgICAgICAgICAgc2gtPnNsaWNlX2NyX3FwX29mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+cHMucHBzLT5jaHJvbWFfcXBfb2Zmc2V0X2xpc3RfZW5hYmxlZF9mbGFnKQorICAgICAgICAgICAgc2gtPmN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2gtPmN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnID0gMDsKKworICAgICAgICBpZiAocy0+cHMucHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZykgeworICAgICAgICAgICAgaW50IGRlYmxvY2tpbmdfZmlsdGVyX292ZXJyaWRlX2ZsYWcgPSAwOworCisgICAgICAgICAgICBpZiAocy0+cHMucHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9lbmFibGVkX2ZsYWcpCisgICAgICAgICAgICAgICAgZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZmxhZyA9IGdldF9iaXRzMShnYik7CisKKyAgICAgICAgICAgIGlmIChkZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9mbGFnKSB7CisgICAgICAgICAgICAgICAgc2gtPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfZmxhZyA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICAgICAgaWYgKCFzaC0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBiZXRhX29mZnNldF9kaXYyID0gZ2V0X3NlX2dvbG9tYihnYik7CisgICAgICAgICAgICAgICAgICAgIGludCB0Y19vZmZzZXRfZGl2MiAgID0gZ2V0X3NlX2dvbG9tYihnYikgOworICAgICAgICAgICAgICAgICAgICBpZiAoYmV0YV9vZmZzZXRfZGl2MiA8IC02IHx8IGJldGFfb2Zmc2V0X2RpdjIgPiA2IHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0Y19vZmZzZXRfZGl2MiAgIDwgLTYgfHwgdGNfb2Zmc2V0X2RpdjIgICA+IDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGRlYmxvY2sgZmlsdGVyIG9mZnNldHM6ICVkLCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXRhX29mZnNldF9kaXYyLCB0Y19vZmZzZXRfZGl2Mik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzaC0+YmV0YV9vZmZzZXQgPSBiZXRhX29mZnNldF9kaXYyICogMjsKKyAgICAgICAgICAgICAgICAgICAgc2gtPnRjX29mZnNldCAgID0gICB0Y19vZmZzZXRfZGl2MiAqIDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaC0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnID0gcy0+cHMucHBzLT5kaXNhYmxlX2RiZjsKKyAgICAgICAgICAgICAgICBzaC0+YmV0YV9vZmZzZXQgICAgICAgICAgICAgICAgICAgID0gcy0+cHMucHBzLT5iZXRhX29mZnNldDsKKyAgICAgICAgICAgICAgICBzaC0+dGNfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgID0gcy0+cHMucHBzLT50Y19vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaC0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnID0gMDsKKyAgICAgICAgICAgIHNoLT5iZXRhX29mZnNldCAgICAgICAgICAgICAgICAgICAgPSAwOworICAgICAgICAgICAgc2gtPnRjX29mZnNldCAgICAgICAgICAgICAgICAgICAgICA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+cHMucHBzLT5zZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgICAgIChzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzBdIHx8CisgICAgICAgICAgICAgc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1sxXSB8fAorICAgICAgICAgICAgICFzaC0+ZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKSkgeworICAgICAgICAgICAgc2gtPnNsaWNlX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNoLT5zbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZyA9IHMtPnBzLnBwcy0+c2VxX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghcy0+c2xpY2VfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmRlcGVuZGVudCBzbGljZSBzZWdtZW50IG1pc3NpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc2gtPm51bV9lbnRyeV9wb2ludF9vZmZzZXRzID0gMDsKKyAgICBpZiAocy0+cHMucHBzLT50aWxlc19lbmFibGVkX2ZsYWcgfHwgcy0+cHMucHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykgeworICAgICAgICB1bnNpZ25lZCBudW1fZW50cnlfcG9pbnRfb2Zmc2V0cyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7CisgICAgICAgIC8vIEl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIGJvdW5kIHRoaXMgdGlnaHRlciBidXQgdGhpcyBoZXJlIGlzIHNpbXBsZXIKKyAgICAgICAgaWYgKG51bV9lbnRyeV9wb2ludF9vZmZzZXRzID4gZ2V0X2JpdHNfbGVmdChnYikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibnVtX2VudHJ5X3BvaW50X29mZnNldHMgJWQgaXMgaW52YWxpZFxuIiwgbnVtX2VudHJ5X3BvaW50X29mZnNldHMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMgPSBudW1fZW50cnlfcG9pbnRfb2Zmc2V0czsKKyAgICAgICAgaWYgKHNoLT5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyA+IDApIHsKKyAgICAgICAgICAgIGludCBvZmZzZXRfbGVuID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKSArIDE7CisKKyAgICAgICAgICAgIGlmIChvZmZzZXRfbGVuIDwgMSB8fCBvZmZzZXRfbGVuID4gMzIpIHsKKyAgICAgICAgICAgICAgICBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMgPSAwOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAib2Zmc2V0X2xlbiAlZCBpcyBpbnZhbGlkXG4iLCBvZmZzZXRfbGVuKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfZnJlZXAoJnNoLT5lbnRyeV9wb2ludF9vZmZzZXQpOworICAgICAgICAgICAgYXZfZnJlZXAoJnNoLT5vZmZzZXQpOworICAgICAgICAgICAgYXZfZnJlZXAoJnNoLT5zaXplKTsKKyAgICAgICAgICAgIHNoLT5lbnRyeV9wb2ludF9vZmZzZXQgPSBhdl9tYWxsb2NfYXJyYXkoc2gtPm51bV9lbnRyeV9wb2ludF9vZmZzZXRzLCBzaXplb2YodW5zaWduZWQpKTsKKyAgICAgICAgICAgIHNoLT5vZmZzZXQgPSBhdl9tYWxsb2NfYXJyYXkoc2gtPm51bV9lbnRyeV9wb2ludF9vZmZzZXRzLCBzaXplb2YoaW50KSk7CisgICAgICAgICAgICBzaC0+c2l6ZSA9IGF2X21hbGxvY19hcnJheShzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMsIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIGlmICghc2gtPmVudHJ5X3BvaW50X29mZnNldCB8fCAhc2gtPm9mZnNldCB8fCAhc2gtPnNpemUpIHsKKyAgICAgICAgICAgICAgICBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHMgPSAwOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaC0+bnVtX2VudHJ5X3BvaW50X29mZnNldHM7IGkrKykgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbCA9IGdldF9iaXRzX2xvbmcoZ2IsIG9mZnNldF9sZW4pOworICAgICAgICAgICAgICAgIHNoLT5lbnRyeV9wb2ludF9vZmZzZXRbaV0gPSB2YWwgKyAxOyAvLyArMTsgLy8gKzEgdG8gZ2V0IHRoZSBzaXplCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+dGhyZWFkc19udW1iZXIgPiAxICYmIChzLT5wcy5wcHMtPm51bV90aWxlX3Jvd3MgPiAxIHx8IHMtPnBzLnBwcy0+bnVtX3RpbGVfY29sdW1ucyA+IDEpKSB7CisgICAgICAgICAgICAgICAgcy0+ZW5hYmxlX3BhcmFsbGVsX3RpbGVzID0gMDsgLy8gVE9ETzogeW91IGNhbiBlbmFibGUgdGlsZXMgaW4gcGFyYWxsZWwgaGVyZQorICAgICAgICAgICAgICAgIHMtPnRocmVhZHNfbnVtYmVyID0gMTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHMtPmVuYWJsZV9wYXJhbGxlbF90aWxlcyA9IDA7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+ZW5hYmxlX3BhcmFsbGVsX3RpbGVzID0gMDsKKyAgICB9CisKKyAgICBpZiAocy0+cHMucHBzLT5zbGljZV9oZWFkZXJfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZykgeworICAgICAgICB1bnNpZ25lZCBpbnQgbGVuZ3RoID0gZ2V0X3VlX2dvbG9tYl9sb25nKGdiKTsKKyAgICAgICAgaWYgKGxlbmd0aCo4TEwgPiBnZXRfYml0c19sZWZ0KGdiKSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0b28gbWFueSBzbGljZV9oZWFkZXJfZXh0ZW5zaW9uX2RhdGFfYnl0ZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKQorICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsgIC8vIHNsaWNlX2hlYWRlcl9leHRlbnNpb25fZGF0YV9ieXRlCisgICAgfQorCisgICAgLy8gSW5mZXJyZWQgcGFyYW1ldGVycworICAgIHNoLT5zbGljZV9xcCA9IDI2VSArIHMtPnBzLnBwcy0+cGljX2luaXRfcXBfbWludXMyNiArIHNoLT5zbGljZV9xcF9kZWx0YTsKKyAgICBpZiAoc2gtPnNsaWNlX3FwID4gNTEgfHwKKyAgICAgICAgc2gtPnNsaWNlX3FwIDwgLXMtPnBzLnNwcy0+cXBfYmRfb2Zmc2V0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSBzbGljZV9xcCAlZCBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSAiCisgICAgICAgICAgICAgICAiWyVkLCA1MV0uXG4iLAorICAgICAgICAgICAgICAgc2gtPnNsaWNlX3FwLAorICAgICAgICAgICAgICAgLXMtPnBzLnNwcy0+cXBfYmRfb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc2gtPnNsaWNlX2N0Yl9hZGRyX3JzID0gc2gtPnNsaWNlX3NlZ21lbnRfYWRkcjsKKworICAgIGlmICghcy0+c2guc2xpY2VfY3RiX2FkZHJfcnMgJiYgcy0+c2guZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZykgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkltcG9zc2libGUgc2xpY2Ugc2VnbWVudC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk92ZXJyZWFkIHNsaWNlIGhlYWRlciBieSAlZCBiaXRzXG4iLCAtZ2V0X2JpdHNfbGVmdChnYikpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzLT5IRVZDbGMtPmZpcnN0X3FwX2dyb3VwID0gIXMtPnNoLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWc7CisKKyAgICBpZiAoIXMtPnBzLnBwcy0+Y3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnKQorICAgICAgICBzLT5IRVZDbGMtPnFwX3kgPSBzLT5zaC5zbGljZV9xcDsKKworICAgIHMtPnNsaWNlX2luaXRpYWxpemVkID0gMTsKKyAgICBzLT5IRVZDbGMtPnR1LmN1X3FwX29mZnNldF9jYiA9IDA7CisgICAgcy0+SEVWQ2xjLT50dS5jdV9xcF9vZmZzZXRfY3IgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ1RCKHRhYiwgeCwgeSkgKCh0YWIpWyh5KSAqIHMtPnBzLnNwcy0+Y3RiX3dpZHRoICsgKHgpXSkKKworI2RlZmluZSBTRVRfU0FPKGVsZW0sIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXNhb19tZXJnZV91cF9mbGFnICYmICFzYW9fbWVyZ2VfbGVmdF9mbGFnKSAgICAgXAorICAgICAgICBzYW8tPmVsZW0gPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiAoc2FvX21lcmdlX2xlZnRfZmxhZykgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2FvLT5lbGVtID0gQ1RCKHMtPnNhbywgcngtMSwgcnkpLmVsZW07ICAgICAgICAgXAorICAgIGVsc2UgaWYgKHNhb19tZXJnZV91cF9mbGFnKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNhby0+ZWxlbSA9IENUQihzLT5zYW8sIHJ4LCByeS0xKS5lbGVtOyAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzYW8tPmVsZW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBobHNfc2FvX3BhcmFtKEhFVkNDb250ZXh0ICpzLCBpbnQgcngsIGludCByeSkKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyAgICA9IHMtPkhFVkNsYzsKKyAgICBpbnQgc2FvX21lcmdlX2xlZnRfZmxhZyA9IDA7CisgICAgaW50IHNhb19tZXJnZV91cF9mbGFnICAgPSAwOworICAgIFNBT1BhcmFtcyAqc2FvICAgICAgICAgID0gJkNUQihzLT5zYW8sIHJ4LCByeSk7CisgICAgaW50IGNfaWR4LCBpOworCisgICAgaWYgKHMtPnNoLnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1swXSB8fAorICAgICAgICBzLT5zaC5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMV0pIHsKKyAgICAgICAgaWYgKHJ4ID4gMCkgeworICAgICAgICAgICAgaWYgKGxjLT5jdGJfbGVmdF9mbGFnKQorICAgICAgICAgICAgICAgIHNhb19tZXJnZV9sZWZ0X2ZsYWcgPSBmZl9oZXZjX3Nhb19tZXJnZV9mbGFnX2RlY29kZShzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnkgPiAwICYmICFzYW9fbWVyZ2VfbGVmdF9mbGFnKSB7CisgICAgICAgICAgICBpZiAobGMtPmN0Yl91cF9mbGFnKQorICAgICAgICAgICAgICAgIHNhb19tZXJnZV91cF9mbGFnID0gZmZfaGV2Y19zYW9fbWVyZ2VfZmxhZ19kZWNvZGUocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNfaWR4ID0gMDsgY19pZHggPCAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA/IDMgOiAxKTsgY19pZHgrKykgeworICAgICAgICBpbnQgbG9nMl9zYW9fb2Zmc2V0X3NjYWxlID0gY19pZHggPT0gMCA/IHMtPnBzLnBwcy0+bG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2x1bWEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBzLnBwcy0+bG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2Nocm9tYTsKKworICAgICAgICBpZiAoIXMtPnNoLnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1tjX2lkeF0pIHsKKyAgICAgICAgICAgIHNhby0+dHlwZV9pZHhbY19pZHhdID0gU0FPX05PVF9BUFBMSUVEOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY19pZHggPT0gMikgeworICAgICAgICAgICAgc2FvLT50eXBlX2lkeFsyXSA9IHNhby0+dHlwZV9pZHhbMV07CisgICAgICAgICAgICBzYW8tPmVvX2NsYXNzWzJdID0gc2FvLT5lb19jbGFzc1sxXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFVF9TQU8odHlwZV9pZHhbY19pZHhdLCBmZl9oZXZjX3Nhb190eXBlX2lkeF9kZWNvZGUocykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNhby0+dHlwZV9pZHhbY19pZHhdID09IFNBT19OT1RfQVBQTElFRCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBTRVRfU0FPKG9mZnNldF9hYnNbY19pZHhdW2ldLCBmZl9oZXZjX3Nhb19vZmZzZXRfYWJzX2RlY29kZShzKSk7CisKKyAgICAgICAgaWYgKHNhby0+dHlwZV9pZHhbY19pZHhdID09IFNBT19CQU5EKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHNhby0+b2Zmc2V0X2Fic1tjX2lkeF1baV0pIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX1NBTyhvZmZzZXRfc2lnbltjX2lkeF1baV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19zYW9fb2Zmc2V0X3NpZ25fZGVjb2RlKHMpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzYW8tPm9mZnNldF9zaWduW2NfaWR4XVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgU0VUX1NBTyhiYW5kX3Bvc2l0aW9uW2NfaWR4XSwgZmZfaGV2Y19zYW9fYmFuZF9wb3NpdGlvbl9kZWNvZGUocykpOworICAgICAgICB9IGVsc2UgaWYgKGNfaWR4ICE9IDIpIHsKKyAgICAgICAgICAgIFNFVF9TQU8oZW9fY2xhc3NbY19pZHhdLCBmZl9oZXZjX3Nhb19lb19jbGFzc19kZWNvZGUocykpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5mZXJyZWQgcGFyYW1ldGVycworICAgICAgICBzYW8tPm9mZnNldF92YWxbY19pZHhdWzBdID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgc2FvLT5vZmZzZXRfdmFsW2NfaWR4XVtpICsgMV0gPSBzYW8tPm9mZnNldF9hYnNbY19pZHhdW2ldOworICAgICAgICAgICAgaWYgKHNhby0+dHlwZV9pZHhbY19pZHhdID09IFNBT19FREdFKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAxKQorICAgICAgICAgICAgICAgICAgICBzYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXSA9IC1zYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2FvLT5vZmZzZXRfc2lnbltjX2lkeF1baV0pIHsKKyAgICAgICAgICAgICAgICBzYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXSA9IC1zYW8tPm9mZnNldF92YWxbY19pZHhdW2kgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNhby0+b2Zmc2V0X3ZhbFtjX2lkeF1baSArIDFdICo9IDEgPDwgbG9nMl9zYW9fb2Zmc2V0X3NjYWxlOworICAgICAgICB9CisgICAgfQorfQorCisjdW5kZWYgU0VUX1NBTworI3VuZGVmIENUQgorCitzdGF0aWMgaW50IGhsc19jcm9zc19jb21wb25lbnRfcHJlZChIRVZDQ29udGV4dCAqcywgaW50IGlkeCkgeworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjICAgID0gcy0+SEVWQ2xjOworICAgIGludCBsb2cyX3Jlc19zY2FsZV9hYnNfcGx1czEgPSBmZl9oZXZjX2xvZzJfcmVzX3NjYWxlX2FicyhzLCBpZHgpOworCisgICAgaWYgKGxvZzJfcmVzX3NjYWxlX2Fic19wbHVzMSAhPSAgMCkgeworICAgICAgICBpbnQgcmVzX3NjYWxlX3NpZ25fZmxhZyA9IGZmX2hldmNfcmVzX3NjYWxlX3NpZ25fZmxhZyhzLCBpZHgpOworICAgICAgICBsYy0+dHUucmVzX3NjYWxlX3ZhbCA9ICgxIDw8IChsb2cyX3Jlc19zY2FsZV9hYnNfcGx1czEgLSAxKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIC0gMiAqIHJlc19zY2FsZV9zaWduX2ZsYWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjLT50dS5yZXNfc2NhbGVfdmFsID0gMDsKKyAgICB9CisKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhsc190cmFuc2Zvcm1fdW5pdChIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeEJhc2UsIGludCB5QmFzZSwgaW50IGNiX3hCYXNlLCBpbnQgY2JfeUJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgbG9nMl90cmFmb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsa19pZHgsIGludCBjYmZfbHVtYSwgaW50ICpjYmZfY2IsIGludCAqY2JmX2NyKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGNvbnN0IGludCBsb2cyX3RyYWZvX3NpemVfYyA9IGxvZzJfdHJhZm9fc2l6ZSAtIHMtPnBzLnNwcy0+aHNoaWZ0WzFdOworICAgIGludCBpOworCisgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICBpbnQgdHJhZm9fc2l6ZSA9IDEgPDwgbG9nMl90cmFmb19zaXplOworICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHgwLCB5MCwgdHJhZm9fc2l6ZSwgdHJhZm9fc2l6ZSk7CisKKyAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplIC0gMl0ocywgeDAsIHkwLCAwKTsKKyAgICB9CisKKyAgICBpZiAoY2JmX2x1bWEgfHwgY2JmX2NiWzBdIHx8IGNiZl9jclswXSB8fAorICAgICAgICAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmIChjYmZfY2JbMV0gfHwgY2JmX2NyWzFdKSkpIHsKKyAgICAgICAgaW50IHNjYW5faWR4ICAgPSBTQ0FOX0RJQUc7CisgICAgICAgIGludCBzY2FuX2lkeF9jID0gU0NBTl9ESUFHOworICAgICAgICBpbnQgY2JmX2Nocm9tYSA9IGNiZl9jYlswXSB8fCBjYmZfY3JbMF0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNiZl9jYlsxXSB8fCBjYmZfY3JbMV0pKTsKKworICAgICAgICBpZiAocy0+cHMucHBzLT5jdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWcgJiYgIWxjLT50dS5pc19jdV9xcF9kZWx0YV9jb2RlZCkgeworICAgICAgICAgICAgbGMtPnR1LmN1X3FwX2RlbHRhID0gZmZfaGV2Y19jdV9xcF9kZWx0YV9hYnMocyk7CisgICAgICAgICAgICBpZiAobGMtPnR1LmN1X3FwX2RlbHRhICE9IDApCisgICAgICAgICAgICAgICAgaWYgKGZmX2hldmNfY3VfcXBfZGVsdGFfc2lnbl9mbGFnKHMpID09IDEpCisgICAgICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9kZWx0YSA9IC1sYy0+dHUuY3VfcXBfZGVsdGE7CisgICAgICAgICAgICBsYy0+dHUuaXNfY3VfcXBfZGVsdGFfY29kZWQgPSAxOworCisgICAgICAgICAgICBpZiAobGMtPnR1LmN1X3FwX2RlbHRhIDwgLSgyNiArIHMtPnBzLnNwcy0+cXBfYmRfb2Zmc2V0IC8gMikgfHwKKyAgICAgICAgICAgICAgICBsYy0+dHUuY3VfcXBfZGVsdGEgPiAgKDI1ICsgcy0+cHMuc3BzLT5xcF9iZF9vZmZzZXQgLyAyKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGN1X3FwX2RlbHRhICVkIGlzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlslZCwgJWRdLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbGMtPnR1LmN1X3FwX2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAtKDI2ICsgcy0+cHMuc3BzLT5xcF9iZF9vZmZzZXQgLyAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgyNSArIHMtPnBzLnNwcy0+cXBfYmRfb2Zmc2V0IC8gMikpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmZl9oZXZjX3NldF9xUHkocywgY2JfeEJhc2UsIGNiX3lCYXNlLCBsb2cyX2NiX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnNoLmN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnICYmIGNiZl9jaHJvbWEgJiYKKyAgICAgICAgICAgICFsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZyAgJiYgICFsYy0+dHUuaXNfY3VfY2hyb21hX3FwX29mZnNldF9jb2RlZCkgeworICAgICAgICAgICAgaW50IGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZyA9IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9mbGFnKHMpOworICAgICAgICAgICAgaWYgKGN1X2Nocm9tYV9xcF9vZmZzZXRfZmxhZykgeworICAgICAgICAgICAgICAgIGludCBjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeCAgPSAwOworICAgICAgICAgICAgICAgIGlmIChzLT5wcy5wcHMtPmNocm9tYV9xcF9vZmZzZXRfbGlzdF9sZW5fbWludXMxID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeCA9IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9pZHgocyk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgImN1X2Nocm9tYV9xcF9vZmZzZXRfaWR4IG5vdCB5ZXQgdGVzdGVkLlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY2IgPSBzLT5wcy5wcHMtPmNiX3FwX29mZnNldF9saXN0W2N1X2Nocm9tYV9xcF9vZmZzZXRfaWR4XTsKKyAgICAgICAgICAgICAgICBsYy0+dHUuY3VfcXBfb2Zmc2V0X2NyID0gcy0+cHMucHBzLT5jcl9xcF9vZmZzZXRfbGlzdFtjdV9jaHJvbWFfcXBfb2Zmc2V0X2lkeF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY2IgPSAwOworICAgICAgICAgICAgICAgIGxjLT50dS5jdV9xcF9vZmZzZXRfY3IgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGMtPnR1LmlzX2N1X2Nocm9tYV9xcF9vZmZzZXRfY29kZWQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSAmJiBsb2cyX3RyYWZvX3NpemUgPCA0KSB7CisgICAgICAgICAgICBpZiAobGMtPnR1LmludHJhX3ByZWRfbW9kZSA+PSA2ICYmCisgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZSA8PSAxNCkgeworICAgICAgICAgICAgICAgIHNjYW5faWR4ID0gU0NBTl9WRVJUOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlID49IDIyICYmCisgICAgICAgICAgICAgICAgICAgICAgIGxjLT50dS5pbnRyYV9wcmVkX21vZGUgPD0gMzApIHsKKyAgICAgICAgICAgICAgICBzY2FuX2lkeCA9IFNDQU5fSE9SSVo7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPj0gIDYgJiYKKyAgICAgICAgICAgICAgICBsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPD0gMTQpIHsKKyAgICAgICAgICAgICAgICBzY2FuX2lkeF9jID0gU0NBTl9WRVJUOworICAgICAgICAgICAgfSBlbHNlIGlmIChsYy0+dHUuaW50cmFfcHJlZF9tb2RlX2MgPj0gMjIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jIDw9IDMwKSB7CisgICAgICAgICAgICAgICAgc2Nhbl9pZHhfYyA9IFNDQU5fSE9SSVo7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsYy0+dHUuY3Jvc3NfcGYgPSAwOworCisgICAgICAgIGlmIChjYmZfbHVtYSkKKyAgICAgICAgICAgIGZmX2hldmNfaGxzX3Jlc2lkdWFsX2NvZGluZyhzLCB4MCwgeTAsIGxvZzJfdHJhZm9fc2l6ZSwgc2Nhbl9pZHgsIDApOworICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAmJiAobG9nMl90cmFmb19zaXplID4gMiB8fCBzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpKSB7CisgICAgICAgICAgICBpbnQgdHJhZm9fc2l6ZV9oID0gMSA8PCAobG9nMl90cmFmb19zaXplX2MgKyBzLT5wcy5zcHMtPmhzaGlmdFsxXSk7CisgICAgICAgICAgICBpbnQgdHJhZm9fc2l6ZV92ID0gMSA8PCAobG9nMl90cmFmb19zaXplX2MgKyBzLT5wcy5zcHMtPnZzaGlmdFsxXSk7CisgICAgICAgICAgICBsYy0+dHUuY3Jvc3NfcGYgID0gKHMtPnBzLnBwcy0+Y3Jvc3NfY29tcG9uZW50X3ByZWRpY3Rpb25fZW5hYmxlZF9mbGFnICYmIGNiZl9sdW1hICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5URVIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYy0+dHUuY2hyb21hX21vZGVfYyA9PSAgNCkpKTsKKworICAgICAgICAgICAgaWYgKGxjLT50dS5jcm9zc19wZikgeworICAgICAgICAgICAgICAgIGhsc19jcm9zc19jb21wb25lbnRfcHJlZChzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyID8gMiA6IDEpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBKSB7CisgICAgICAgICAgICAgICAgICAgIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUocywgeDAsIHkwICsgKGkgPDwgbG9nMl90cmFmb19zaXplX2MpLCB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZV9jIC0gMl0ocywgeDAsIHkwICsgKGkgPDwgbG9nMl90cmFmb19zaXplX2MpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNiZl9jYltpXSkKKyAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19obHNfcmVzaWR1YWxfY29kaW5nKHMsIHgwLCB5MCArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZV9jKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfdHJhZm9fc2l6ZV9jLCBzY2FuX2lkeF9jLCAxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIChsYy0+dHUuY3Jvc3NfcGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUgPSBzLT5mcmFtZS0+bGluZXNpemVbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHNoaWZ0ID0gcy0+cHMuc3BzLT5oc2hpZnRbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnNoaWZ0ID0gcy0+cHMuc3BzLT52c2hpZnRbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpjb2VmZnNfeSA9IChpbnQxNl90KilsYy0+ZWRnZV9lbXVfYnVmZmVyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqY29lZmZzICAgPSAoaW50MTZfdCopbGMtPmVkZ2VfZW11X2J1ZmZlcjI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDEgPDwgbG9nMl90cmFmb19zaXplX2M7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9ICZzLT5mcmFtZS0+ZGF0YVsxXVsoeTAgPj4gdnNoaWZ0KSAqIHN0cmlkZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeDAgPj4gaHNoaWZ0KSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemUgKiBzaXplKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzW2ldID0gKChsYy0+dHUucmVzX3NjYWxlX3ZhbCAqIGNvZWZmc195W2ldKSA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhldmNkc3AuYWRkX3Jlc2lkdWFsW2xvZzJfdHJhZm9fc2l6ZV9jLTJdKGRzdCwgY29lZmZzLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYy0+dHUuY3Jvc3NfcGYpIHsKKyAgICAgICAgICAgICAgICBobHNfY3Jvc3NfY29tcG9uZW50X3ByZWQocywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMiA/IDIgOiAxKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHgwLCB5MCArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZV9jKSwgdHJhZm9fc2l6ZV9oLCB0cmFmb19zaXplX3YpOworICAgICAgICAgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemVfYyAtIDJdKHMsIHgwLCB5MCArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZV9jKSwgMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjYmZfY3JbaV0pCisgICAgICAgICAgICAgICAgICAgIGZmX2hldmNfaGxzX3Jlc2lkdWFsX2NvZGluZyhzLCB4MCwgeTAgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemVfYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cyX3RyYWZvX3NpemVfYywgc2Nhbl9pZHhfYywgMik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAobGMtPnR1LmNyb3NzX3BmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlID0gcy0+ZnJhbWUtPmxpbmVzaXplWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzaGlmdCA9IHMtPnBzLnNwcy0+aHNoaWZ0WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZzaGlmdCA9IHMtPnBzLnNwcy0+dnNoaWZ0WzJdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqY29lZmZzX3kgPSAoaW50MTZfdCopbGMtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvZWZmcyAgID0gKGludDE2X3QqKWxjLT5lZGdlX2VtdV9idWZmZXIyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUgPSAxIDw8IGxvZzJfdHJhZm9fc2l6ZV9jOworCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSAmcy0+ZnJhbWUtPmRhdGFbMl1bKHkwID4+IHZzaGlmdCkgKiBzdHJpZGUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeDAgPj4gaHNoaWZ0KSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemUgKiBzaXplKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzW2ldID0gKChsYy0+dHUucmVzX3NjYWxlX3ZhbCAqIGNvZWZmc195W2ldKSA+PiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhldmNkc3AuYWRkX3Jlc2lkdWFsW2xvZzJfdHJhZm9fc2l6ZV9jLTJdKGRzdCwgY29lZmZzLCBzdHJpZGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyAmJiBibGtfaWR4ID09IDMpIHsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX2ggPSAxIDw8IChsb2cyX3RyYWZvX3NpemUgKyAxKTsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX3YgPSAxIDw8IChsb2cyX3RyYWZvX3NpemUgKyBzLT5wcy5zcHMtPnZzaGlmdFsxXSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMiA/IDIgOiAxKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhZm9fc2l6ZV9oLCB0cmFmb19zaXplX3YpOworICAgICAgICAgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemUgLSAyXShzLCB4QmFzZSwgeUJhc2UgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemUpLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNiZl9jYltpXSkKKyAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19obHNfcmVzaWR1YWxfY29kaW5nKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cyX3RyYWZvX3NpemUsIHNjYW5faWR4X2MsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIgPyAyIDogMSk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5UUkEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4QmFzZSwgeUJhc2UgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhZm9fc2l6ZV9oLCB0cmFmb19zaXplX3YpOworICAgICAgICAgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemUgLSAyXShzLCB4QmFzZSwgeUJhc2UgKyAoaSA8PCBsb2cyX3RyYWZvX3NpemUpLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNiZl9jcltpXSkKKyAgICAgICAgICAgICAgICAgICAgZmZfaGV2Y19obHNfcmVzaWR1YWxfY29kaW5nKHMsIHhCYXNlLCB5QmFzZSArIChpIDw8IGxvZzJfdHJhZm9fc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cyX3RyYWZvX3NpemUsIHNjYW5faWR4X2MsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjICYmIGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICBpZiAobG9nMl90cmFmb19zaXplID4gMiB8fCBzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX2ggPSAxIDw8IChsb2cyX3RyYWZvX3NpemVfYyArIHMtPnBzLnNwcy0+aHNoaWZ0WzFdKTsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX3YgPSAxIDw8IChsb2cyX3RyYWZvX3NpemVfYyArIHMtPnBzLnNwcy0+dnNoaWZ0WzFdKTsKKyAgICAgICAgICAgIGZmX2hldmNfc2V0X25laWdoYm91cl9hdmFpbGFibGUocywgeDAsIHkwLCB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemVfYyAtIDJdKHMsIHgwLCB5MCwgMSk7CisgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemVfYyAtIDJdKHMsIHgwLCB5MCwgMik7CisgICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyKSB7CisgICAgICAgICAgICAgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4MCwgeTAgKyAoMSA8PCBsb2cyX3RyYWZvX3NpemVfYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplX2MgLSAyXShzLCB4MCwgeTAgKyAoMSA8PCBsb2cyX3RyYWZvX3NpemVfYyksIDEpOworICAgICAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZV9jIC0gMl0ocywgeDAsIHkwICsgKDEgPDwgbG9nMl90cmFmb19zaXplX2MpLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChibGtfaWR4ID09IDMpIHsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX2ggPSAxIDw8IChsb2cyX3RyYWZvX3NpemUgKyAxKTsKKyAgICAgICAgICAgIGludCB0cmFmb19zaXplX3YgPSAxIDw8IChsb2cyX3RyYWZvX3NpemUgKyBzLT5wcy5zcHMtPnZzaGlmdFsxXSk7CisgICAgICAgICAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHhCYXNlLCB5QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhZm9fc2l6ZV9oLCB0cmFmb19zaXplX3YpOworICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplIC0gMl0ocywgeEJhc2UsIHlCYXNlLCAxKTsKKyAgICAgICAgICAgIHMtPmhwYy5pbnRyYV9wcmVkW2xvZzJfdHJhZm9fc2l6ZSAtIDJdKHMsIHhCYXNlLCB5QmFzZSwgMik7CisgICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyKSB7CisgICAgICAgICAgICAgICAgZmZfaGV2Y19zZXRfbmVpZ2hib3VyX2F2YWlsYWJsZShzLCB4QmFzZSwgeUJhc2UgKyAoMSA8PCAobG9nMl90cmFmb19zaXplKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFmb19zaXplX2gsIHRyYWZvX3NpemVfdik7CisgICAgICAgICAgICAgICAgcy0+aHBjLmludHJhX3ByZWRbbG9nMl90cmFmb19zaXplIC0gMl0ocywgeEJhc2UsIHlCYXNlICsgKDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSkpLCAxKTsKKyAgICAgICAgICAgICAgICBzLT5ocGMuaW50cmFfcHJlZFtsb2cyX3RyYWZvX3NpemUgLSAyXShzLCB4QmFzZSwgeUJhc2UgKyAoMSA8PCAobG9nMl90cmFmb19zaXplKSksIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWJsb2NraW5nX2J5cGFzcyhIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBsb2cyX2NiX3NpemUpCit7CisgICAgaW50IGNiX3NpemUgICAgICAgICAgPSAxIDw8IGxvZzJfY2Jfc2l6ZTsKKyAgICBpbnQgbG9nMl9taW5fcHVfc2l6ZSA9IHMtPnBzLnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKworICAgIGludCBtaW5fcHVfd2lkdGggICAgID0gcy0+cHMuc3BzLT5taW5fcHVfd2lkdGg7CisgICAgaW50IHhfZW5kID0gRkZNSU4oeDAgKyBjYl9zaXplLCBzLT5wcy5zcHMtPndpZHRoKTsKKyAgICBpbnQgeV9lbmQgPSBGRk1JTih5MCArIGNiX3NpemUsIHMtPnBzLnNwcy0+aGVpZ2h0KTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaiA9ICh5MCA+PiBsb2cyX21pbl9wdV9zaXplKTsgaiA8ICh5X2VuZCA+PiBsb2cyX21pbl9wdV9zaXplKTsgaisrKQorICAgICAgICBmb3IgKGkgPSAoeDAgPj4gbG9nMl9taW5fcHVfc2l6ZSk7IGkgPCAoeF9lbmQgPj4gbG9nMl9taW5fcHVfc2l6ZSk7IGkrKykKKyAgICAgICAgICAgIHMtPmlzX3BjbVtpICsgaiAqIG1pbl9wdV93aWR0aF0gPSAyOworfQorCitzdGF0aWMgaW50IGhsc190cmFuc2Zvcm1fdHJlZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeEJhc2UsIGludCB5QmFzZSwgaW50IGNiX3hCYXNlLCBpbnQgY2JfeUJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgbG9nMl90cmFmb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYWZvX2RlcHRoLCBpbnQgYmxrX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqYmFzZV9jYmZfY2IsIGNvbnN0IGludCAqYmFzZV9jYmZfY3IpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgdWludDhfdCBzcGxpdF90cmFuc2Zvcm1fZmxhZzsKKyAgICBpbnQgY2JmX2NiWzJdOworICAgIGludCBjYmZfY3JbMl07CisgICAgaW50IHJldDsKKworICAgIGNiZl9jYlswXSA9IGJhc2VfY2JmX2NiWzBdOworICAgIGNiZl9jYlsxXSA9IGJhc2VfY2JmX2NiWzFdOworICAgIGNiZl9jclswXSA9IGJhc2VfY2JmX2NyWzBdOworICAgIGNiZl9jclsxXSA9IGJhc2VfY2JmX2NyWzFdOworCisgICAgaWYgKGxjLT5jdS5pbnRyYV9zcGxpdF9mbGFnKSB7CisgICAgICAgIGlmICh0cmFmb19kZXB0aCA9PSAxKSB7CisgICAgICAgICAgICBsYy0+dHUuaW50cmFfcHJlZF9tb2RlICAgPSBsYy0+cHUuaW50cmFfcHJlZF9tb2RlW2Jsa19pZHhdOworICAgICAgICAgICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykgeworICAgICAgICAgICAgICAgIGxjLT50dS5pbnRyYV9wcmVkX21vZGVfYyA9IGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1tibGtfaWR4XTsKKyAgICAgICAgICAgICAgICBsYy0+dHUuY2hyb21hX21vZGVfYyAgICAgPSBsYy0+cHUuY2hyb21hX21vZGVfY1tibGtfaWR4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdOworICAgICAgICAgICAgICAgIGxjLT50dS5jaHJvbWFfbW9kZV9jICAgICA9IGxjLT5wdS5jaHJvbWFfbW9kZV9jWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZSAgID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZVswXTsKKyAgICAgICAgbGMtPnR1LmludHJhX3ByZWRfbW9kZV9jID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdOworICAgICAgICBsYy0+dHUuY2hyb21hX21vZGVfYyAgICAgPSBsYy0+cHUuY2hyb21hX21vZGVfY1swXTsKKyAgICB9CisKKyAgICBpZiAobG9nMl90cmFmb19zaXplIDw9IHMtPnBzLnNwcy0+bG9nMl9tYXhfdHJhZm9fc2l6ZSAmJgorICAgICAgICBsb2cyX3RyYWZvX3NpemUgPiAgcy0+cHMuc3BzLT5sb2cyX21pbl90Yl9zaXplICAgICYmCisgICAgICAgIHRyYWZvX2RlcHRoICAgICA8IGxjLT5jdS5tYXhfdHJhZm9fZGVwdGggICAgICAgJiYKKyAgICAgICAgIShsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyAmJiB0cmFmb19kZXB0aCA9PSAwKSkgeworICAgICAgICBzcGxpdF90cmFuc2Zvcm1fZmxhZyA9IGZmX2hldmNfc3BsaXRfdHJhbnNmb3JtX2ZsYWdfZGVjb2RlKHMsIGxvZzJfdHJhZm9fc2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGludGVyX3NwbGl0ID0gcy0+cHMuc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlciA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRFUiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICBsYy0+Y3UucGFydF9tb2RlICE9IFBBUlRfMk54Mk4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhZm9fZGVwdGggPT0gMDsKKworICAgICAgICBzcGxpdF90cmFuc2Zvcm1fZmxhZyA9IGxvZzJfdHJhZm9fc2l6ZSA+IHMtPnBzLnNwcy0+bG9nMl9tYXhfdHJhZm9fc2l6ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyAmJiB0cmFmb19kZXB0aCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX3NwbGl0OworICAgIH0KKworICAgIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjICYmIChsb2cyX3RyYWZvX3NpemUgPiAyIHx8IHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMykpIHsKKyAgICAgICAgaWYgKHRyYWZvX2RlcHRoID09IDAgfHwgY2JmX2NiWzBdKSB7CisgICAgICAgICAgICBjYmZfY2JbMF0gPSBmZl9oZXZjX2NiZl9jYl9jcl9kZWNvZGUocywgdHJhZm9fZGVwdGgpOworICAgICAgICAgICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgPT0gMiAmJiAoIXNwbGl0X3RyYW5zZm9ybV9mbGFnIHx8IGxvZzJfdHJhZm9fc2l6ZSA9PSAzKSkgeworICAgICAgICAgICAgICAgIGNiZl9jYlsxXSA9IGZmX2hldmNfY2JmX2NiX2NyX2RlY29kZShzLCB0cmFmb19kZXB0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhZm9fZGVwdGggPT0gMCB8fCBjYmZfY3JbMF0pIHsKKyAgICAgICAgICAgIGNiZl9jclswXSA9IGZmX2hldmNfY2JmX2NiX2NyX2RlY29kZShzLCB0cmFmb19kZXB0aCk7CisgICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyICYmICghc3BsaXRfdHJhbnNmb3JtX2ZsYWcgfHwgbG9nMl90cmFmb19zaXplID09IDMpKSB7CisgICAgICAgICAgICAgICAgY2JmX2NyWzFdID0gZmZfaGV2Y19jYmZfY2JfY3JfZGVjb2RlKHMsIHRyYWZvX2RlcHRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzcGxpdF90cmFuc2Zvcm1fZmxhZykgeworICAgICAgICBjb25zdCBpbnQgdHJhZm9fc2l6ZV9zcGxpdCA9IDEgPDwgKGxvZzJfdHJhZm9fc2l6ZSAtIDEpOworICAgICAgICBjb25zdCBpbnQgeDEgPSB4MCArIHRyYWZvX3NpemVfc3BsaXQ7CisgICAgICAgIGNvbnN0IGludCB5MSA9IHkwICsgdHJhZm9fc2l6ZV9zcGxpdDsKKworI2RlZmluZSBTVUJESVZJREUoeCwgeSwgaWR4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXQgPSBobHNfdHJhbnNmb3JtX3RyZWUocywgeCwgeSwgeDAsIHkwLCBjYl94QmFzZSwgY2JfeUJhc2UsIGxvZzJfY2Jfc2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cyX3RyYWZvX3NpemUgLSAxLCB0cmFmb19kZXB0aCArIDEsIGlkeCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiZl9jYiwgY2JmX2NyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmV0IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgICAgIFNVQkRJVklERSh4MCwgeTAsIDApOworICAgICAgICBTVUJESVZJREUoeDEsIHkwLCAxKTsKKyAgICAgICAgU1VCRElWSURFKHgwLCB5MSwgMik7CisgICAgICAgIFNVQkRJVklERSh4MSwgeTEsIDMpOworCisjdW5kZWYgU1VCRElWSURFCisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IG1pbl90dV9zaXplICAgICAgPSAxIDw8IHMtPnBzLnNwcy0+bG9nMl9taW5fdGJfc2l6ZTsKKyAgICAgICAgaW50IGxvZzJfbWluX3R1X3NpemUgPSBzLT5wcy5zcHMtPmxvZzJfbWluX3RiX3NpemU7CisgICAgICAgIGludCBtaW5fdHVfd2lkdGggICAgID0gcy0+cHMuc3BzLT5taW5fdGJfd2lkdGg7CisgICAgICAgIGludCBjYmZfbHVtYSAgICAgICAgID0gMTsKKworICAgICAgICBpZiAobGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBIHx8IHRyYWZvX2RlcHRoICE9IDAgfHwKKyAgICAgICAgICAgIGNiZl9jYlswXSB8fCBjYmZfY3JbMF0gfHwKKyAgICAgICAgICAgIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDIgJiYgKGNiZl9jYlsxXSB8fCBjYmZfY3JbMV0pKSkgeworICAgICAgICAgICAgY2JmX2x1bWEgPSBmZl9oZXZjX2NiZl9sdW1hX2RlY29kZShzLCB0cmFmb19kZXB0aCk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBobHNfdHJhbnNmb3JtX3VuaXQocywgeDAsIHkwLCB4QmFzZSwgeUJhc2UsIGNiX3hCYXNlLCBjYl95QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfY2Jfc2l6ZSwgbG9nMl90cmFmb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrX2lkeCwgY2JmX2x1bWEsIGNiZl9jYiwgY2JmX2NyKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAvLyBUT0RPOiBzdG9yZSBjYmZfbHVtYSBzb21ld2hlcmUgZWxzZQorICAgICAgICBpZiAoY2JmX2x1bWEpIHsKKyAgICAgICAgICAgIGludCBpLCBqOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8ICgxIDw8IGxvZzJfdHJhZm9fc2l6ZSk7IGkgKz0gbWluX3R1X3NpemUpCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8ICgxIDw8IGxvZzJfdHJhZm9fc2l6ZSk7IGogKz0gbWluX3R1X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHhfdHUgPSAoeDAgKyBqKSA+PiBsb2cyX21pbl90dV9zaXplOworICAgICAgICAgICAgICAgICAgICBpbnQgeV90dSA9ICh5MCArIGkpID4+IGxvZzJfbWluX3R1X3NpemU7CisgICAgICAgICAgICAgICAgICAgIHMtPmNiZl9sdW1hW3lfdHUgKiBtaW5fdHVfd2lkdGggKyB4X3R1XSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghcy0+c2guZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKSB7CisgICAgICAgICAgICBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKHMsIHgwLCB5MCwgbG9nMl90cmFmb19zaXplKTsKKyAgICAgICAgICAgIGlmIChzLT5wcy5wcHMtPnRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZV9mbGFnICYmCisgICAgICAgICAgICAgICAgbGMtPmN1LmN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcpCisgICAgICAgICAgICAgICAgc2V0X2RlYmxvY2tpbmdfYnlwYXNzKHMsIHgwLCB5MCwgbG9nMl90cmFmb19zaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBobHNfcGNtX3NhbXBsZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBsb2cyX2NiX3NpemUpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgY2Jfc2l6ZSAgID0gMSA8PCBsb2cyX2NiX3NpemU7CisgICAgcHRyZGlmZl90IHN0cmlkZTAgPSBzLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgcHRyZGlmZl90IHN0cmlkZTEgPSBzLT5mcmFtZS0+bGluZXNpemVbMV07CisgICAgcHRyZGlmZl90IHN0cmlkZTIgPSBzLT5mcmFtZS0+bGluZXNpemVbMl07CisgICAgdWludDhfdCAqZHN0MCA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5MCAqIHN0cmlkZTAgKyAoeDAgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCldOworICAgIHVpbnQ4X3QgKmRzdDEgPSAmcy0+ZnJhbWUtPmRhdGFbMV1bKHkwID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdKSAqIHN0cmlkZTEgKyAoKHgwID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzFdKSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KV07CisgICAgdWludDhfdCAqZHN0MiA9ICZzLT5mcmFtZS0+ZGF0YVsyXVsoeTAgPj4gcy0+cHMuc3BzLT52c2hpZnRbMl0pICogc3RyaWRlMiArICgoeDAgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMl0pIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpXTsKKworICAgIGludCBsZW5ndGggICAgICAgICA9IGNiX3NpemUgKiBjYl9zaXplICogcy0+cHMuc3BzLT5wY20uYml0X2RlcHRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKChjYl9zaXplID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzFdKSAqIChjYl9zaXplID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNiX3NpemUgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMl0pICogKGNiX3NpemUgPj4gcy0+cHMuc3BzLT52c2hpZnRbMl0pKSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcy5zcHMtPnBjbS5iaXRfZGVwdGhfY2hyb21hOworICAgIGNvbnN0IHVpbnQ4X3QgKnBjbSA9IHNraXBfYnl0ZXMoJmxjLT5jYywgKGxlbmd0aCArIDcpID4+IDMpOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXMtPnNoLmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfZmxhZykKKyAgICAgICAgZmZfaGV2Y19kZWJsb2NraW5nX2JvdW5kYXJ5X3N0cmVuZ3RocyhzLCB4MCwgeTAsIGxvZzJfY2Jfc2l6ZSk7CisKKyAgICByZXQgPSBpbml0X2dldF9iaXRzKCZnYiwgcGNtLCBsZW5ndGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+aGV2Y2RzcC5wdXRfcGNtKGRzdDAsIHN0cmlkZTAsIGNiX3NpemUsIGNiX3NpemUsICAgICAmZ2IsIHMtPnBzLnNwcy0+cGNtLmJpdF9kZXB0aCk7CisgICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMpIHsKKyAgICAgICAgcy0+aGV2Y2RzcC5wdXRfcGNtKGRzdDEsIHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYl9zaXplID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZSA+PiBzLT5wcy5zcHMtPnZzaGlmdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZnYiwgcy0+cHMuc3BzLT5wY20uYml0X2RlcHRoX2Nocm9tYSk7CisgICAgICAgIHMtPmhldmNkc3AucHV0X3BjbShkc3QyLCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jfc2l6ZSA+PiBzLT5wcy5zcHMtPmhzaGlmdFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNiX3NpemUgPj4gcy0+cHMuc3BzLT52c2hpZnRbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2IsIHMtPnBzLnNwcy0+cGNtLmJpdF9kZXB0aF9jaHJvbWEpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIDguNS4zLjIuMi4xIEx1bWEgc2FtcGxlIHVuaWRpcmVjdGlvbmFsIGludGVycG9sYXRpb24gcHJvY2VzcworICoKKyAqIEBwYXJhbSBzIEhFVkMgZGVjb2RpbmcgY29udGV4dAorICogQHBhcmFtIGRzdCB0YXJnZXQgYnVmZmVyIGZvciBibG9jayBkYXRhIGF0IGJsb2NrIHBvc2l0aW9uCisgKiBAcGFyYW0gZHN0c3RyaWRlIHN0cmlkZSBvZiB0aGUgZHN0IGJ1ZmZlcgorICogQHBhcmFtIHJlZiByZWZlcmVuY2UgcGljdHVyZSBidWZmZXIgYXQgb3JpZ2luICgwLCAwKQorICogQHBhcmFtIG12IG1vdGlvbiB2ZWN0b3IgKHJlbGF0aXZlIHRvIGJsb2NrIHBvc2l0aW9uKSB0byBnZXQgcGl4ZWwgZGF0YSBmcm9tCisgKiBAcGFyYW0geF9vZmYgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSB5X29mZiB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBibG9ja193IHdpZHRoIG9mIGJsb2NrCisgKiBAcGFyYW0gYmxvY2tfaCBoZWlnaHQgb2YgYmxvY2sKKyAqIEBwYXJhbSBsdW1hX3dlaWdodCB3ZWlnaHRpbmcgZmFjdG9yIGFwcGxpZWQgdG8gdGhlIGx1bWEgcHJlZGljdGlvbgorICogQHBhcmFtIGx1bWFfb2Zmc2V0IGFkZGl0aXZlIG9mZnNldCBhcHBsaWVkIHRvIHRoZSBsdW1hIHByZWRpY3Rpb24gdmFsdWUKKyAqLworCitzdGF0aWMgdm9pZCBsdW1hX21jX3VuaShIRVZDQ29udGV4dCAqcywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqcmVmLCBjb25zdCBNdiAqbXYsIGludCB4X29mZiwgaW50IHlfb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3csIGludCBibG9ja19oLCBpbnQgbHVtYV93ZWlnaHQsIGludCBsdW1hX29mZnNldCkKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICB1aW50OF90ICpzcmMgICAgICAgICA9IHJlZi0+ZGF0YVswXTsKKyAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlICA9IHJlZi0+bGluZXNpemVbMF07CisgICAgaW50IHBpY193aWR0aCAgICAgICAgPSBzLT5wcy5zcHMtPndpZHRoOworICAgIGludCBwaWNfaGVpZ2h0ICAgICAgID0gcy0+cHMuc3BzLT5oZWlnaHQ7CisgICAgaW50IG14ICAgICAgICAgICAgICAgPSBtdi0+eCAmIDM7CisgICAgaW50IG15ICAgICAgICAgICAgICAgPSBtdi0+eSAmIDM7CisgICAgaW50IHdlaWdodF9mbGFnICAgICAgPSAocy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX1AgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZyk7CisgICAgaW50IGlkeCAgICAgICAgICAgICAgPSBmZl9oZXZjX3BlbF93ZWlnaHRbYmxvY2tfd107CisKKyAgICB4X29mZiArPSBtdi0+eCA+PiAyOworICAgIHlfb2ZmICs9IG12LT55ID4+IDI7CisgICAgc3JjICAgKz0geV9vZmYgKiBzcmNzdHJpZGUgKyAoeF9vZmYgKiAoMSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KSk7CisKKyAgICBpZiAoeF9vZmYgPCBRUEVMX0VYVFJBX0JFRk9SRSB8fCB5X29mZiA8IFFQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeF9vZmYgPj0gcGljX3dpZHRoIC0gYmxvY2tfdyAtIFFQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeV9vZmYgPj0gcGljX2hlaWdodCAtIGJsb2NrX2ggLSBRUEVMX0VYVFJBX0FGVEVSKSB7CisgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBlZGdlX2VtdV9zdHJpZGUgPSBFREdFX0VNVV9CVUZGRVJfU1RSSURFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQ7CisgICAgICAgIGludCBvZmZzZXQgICAgID0gUVBFTF9FWFRSQV9CRUZPUkUgKiBzcmNzdHJpZGUgICAgICAgKyAoUVBFTF9FWFRSQV9CRUZPUkUgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCk7CisgICAgICAgIGludCBidWZfb2Zmc2V0ID0gUVBFTF9FWFRSQV9CRUZPUkUgKiBlZGdlX2VtdV9zdHJpZGUgKyAoUVBFTF9FWFRSQV9CRUZPUkUgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCk7CisKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGxjLT5lZGdlX2VtdV9idWZmZXIsIHNyYyAtIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VfZW11X3N0cmlkZSwgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIFFQRUxfRVhUUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oICsgUVBFTF9FWFRSQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmIC0gUVBFTF9FWFRSQV9CRUZPUkUsIHlfb2ZmIC0gUVBFTF9FWFRSQV9CRUZPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfd2lkdGgsIHBpY19oZWlnaHQpOworICAgICAgICBzcmMgPSBsYy0+ZWRnZV9lbXVfYnVmZmVyICsgYnVmX29mZnNldDsKKyAgICAgICAgc3Jjc3RyaWRlID0gZWRnZV9lbXVfc3RyaWRlOworICAgIH0KKworICAgIGlmICghd2VpZ2h0X2ZsYWcpCisgICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfcXBlbF91bmlbaWR4XVshIW15XVshIW14XShkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBteCwgbXksIGJsb2NrX3cpOworICAgIGVsc2UKKyAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19xcGVsX3VuaV93W2lkeF1bISFteV1bISFteF0oZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBzLT5zaC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdW1hX3dlaWdodCwgbHVtYV9vZmZzZXQsIG14LCBteSwgYmxvY2tfdyk7Cit9CisKKy8qKgorICogOC41LjMuMi4yLjEgTHVtYSBzYW1wbGUgYmlkaXJlY3Rpb25hbCBpbnRlcnBvbGF0aW9uIHByb2Nlc3MKKyAqCisgKiBAcGFyYW0gcyBIRVZDIGRlY29kaW5nIGNvbnRleHQKKyAqIEBwYXJhbSBkc3QgdGFyZ2V0IGJ1ZmZlciBmb3IgYmxvY2sgZGF0YSBhdCBibG9jayBwb3NpdGlvbgorICogQHBhcmFtIGRzdHN0cmlkZSBzdHJpZGUgb2YgdGhlIGRzdCBidWZmZXIKKyAqIEBwYXJhbSByZWYwIHJlZmVyZW5jZSBwaWN0dXJlMCBidWZmZXIgYXQgb3JpZ2luICgwLCAwKQorICogQHBhcmFtIG12MCBtb3Rpb24gdmVjdG9yMCAocmVsYXRpdmUgdG8gYmxvY2sgcG9zaXRpb24pIHRvIGdldCBwaXhlbCBkYXRhIGZyb20KKyAqIEBwYXJhbSB4X29mZiBob3Jpem9udGFsIHBvc2l0aW9uIG9mIGJsb2NrIGZyb20gb3JpZ2luICgwLCAwKQorICogQHBhcmFtIHlfb2ZmIHZlcnRpY2FsIHBvc2l0aW9uIG9mIGJsb2NrIGZyb20gb3JpZ2luICgwLCAwKQorICogQHBhcmFtIGJsb2NrX3cgd2lkdGggb2YgYmxvY2sKKyAqIEBwYXJhbSBibG9ja19oIGhlaWdodCBvZiBibG9jaworICogQHBhcmFtIHJlZjEgcmVmZXJlbmNlIHBpY3R1cmUxIGJ1ZmZlciBhdCBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0gbXYxIG1vdGlvbiB2ZWN0b3IxIChyZWxhdGl2ZSB0byBibG9jayBwb3NpdGlvbikgdG8gZ2V0IHBpeGVsIGRhdGEgZnJvbQorICogQHBhcmFtIGN1cnJlbnRfbXYgY3VycmVudCBtb3Rpb24gdmVjdG9yIHN0cnVjdHVyZQorICovCisgc3RhdGljIHZvaWQgbHVtYV9tY19iaShIRVZDQ29udGV4dCAqcywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpyZWYwLCBjb25zdCBNdiAqbXYwLCBpbnQgeF9vZmYsIGludCB5X29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3csIGludCBibG9ja19oLCBBVkZyYW1lICpyZWYxLCBjb25zdCBNdiAqbXYxLCBzdHJ1Y3QgTXZGaWVsZCAqY3VycmVudF9tdikKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBwdHJkaWZmX3Qgc3JjMHN0cmlkZSAgPSByZWYwLT5saW5lc2l6ZVswXTsKKyAgICBwdHJkaWZmX3Qgc3JjMXN0cmlkZSAgPSByZWYxLT5saW5lc2l6ZVswXTsKKyAgICBpbnQgcGljX3dpZHRoICAgICAgICA9IHMtPnBzLnNwcy0+d2lkdGg7CisgICAgaW50IHBpY19oZWlnaHQgICAgICAgPSBzLT5wcy5zcHMtPmhlaWdodDsKKyAgICBpbnQgbXgwICAgICAgICAgICAgICA9IG12MC0+eCAmIDM7CisgICAgaW50IG15MCAgICAgICAgICAgICAgPSBtdjAtPnkgJiAzOworICAgIGludCBteDEgICAgICAgICAgICAgID0gbXYxLT54ICYgMzsKKyAgICBpbnQgbXkxICAgICAgICAgICAgICA9IG12MS0+eSAmIDM7CisgICAgaW50IHdlaWdodF9mbGFnICAgICAgPSAocy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX1AgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZyk7CisgICAgaW50IHhfb2ZmMCAgICAgICAgICAgPSB4X29mZiArIChtdjAtPnggPj4gMik7CisgICAgaW50IHlfb2ZmMCAgICAgICAgICAgPSB5X29mZiArIChtdjAtPnkgPj4gMik7CisgICAgaW50IHhfb2ZmMSAgICAgICAgICAgPSB4X29mZiArIChtdjEtPnggPj4gMik7CisgICAgaW50IHlfb2ZmMSAgICAgICAgICAgPSB5X29mZiArIChtdjEtPnkgPj4gMik7CisgICAgaW50IGlkeCAgICAgICAgICAgICAgPSBmZl9oZXZjX3BlbF93ZWlnaHRbYmxvY2tfd107CisKKyAgICB1aW50OF90ICpzcmMwICA9IHJlZjAtPmRhdGFbMF0gKyB5X29mZjAgKiBzcmMwc3RyaWRlICsgKGludCkoKHVuc2lnbmVkKXhfb2ZmMCA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKKyAgICB1aW50OF90ICpzcmMxICA9IHJlZjEtPmRhdGFbMF0gKyB5X29mZjEgKiBzcmMxc3RyaWRlICsgKGludCkoKHVuc2lnbmVkKXhfb2ZmMSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKKworICAgIGlmICh4X29mZjAgPCBRUEVMX0VYVFJBX0JFRk9SRSB8fCB5X29mZjAgPCBRUEVMX0VYVFJBX0FGVEVSIHx8CisgICAgICAgIHhfb2ZmMCA+PSBwaWNfd2lkdGggLSBibG9ja193IC0gUVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB5X29mZjAgPj0gcGljX2hlaWdodCAtIGJsb2NrX2ggLSBRUEVMX0VYVFJBX0FGVEVSKSB7CisgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBlZGdlX2VtdV9zdHJpZGUgPSBFREdFX0VNVV9CVUZGRVJfU1RSSURFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQ7CisgICAgICAgIGludCBvZmZzZXQgICAgID0gUVBFTF9FWFRSQV9CRUZPUkUgKiBzcmMwc3RyaWRlICAgICAgICsgKFFQRUxfRVhUUkFfQkVGT1JFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpOworICAgICAgICBpbnQgYnVmX29mZnNldCA9IFFQRUxfRVhUUkFfQkVGT1JFICogZWRnZV9lbXVfc3RyaWRlICsgKFFQRUxfRVhUUkFfQkVGT1JFIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpOworCisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhsYy0+ZWRnZV9lbXVfYnVmZmVyLCBzcmMwIC0gb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV9lbXVfc3RyaWRlLCBzcmMwc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIFFQRUxfRVhUUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oICsgUVBFTF9FWFRSQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfb2ZmMCAtIFFQRUxfRVhUUkFfQkVGT1JFLCB5X29mZjAgLSBRUEVMX0VYVFJBX0JFRk9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisgICAgICAgIHNyYzAgPSBsYy0+ZWRnZV9lbXVfYnVmZmVyICsgYnVmX29mZnNldDsKKyAgICAgICAgc3JjMHN0cmlkZSA9IGVkZ2VfZW11X3N0cmlkZTsKKyAgICB9CisKKyAgICBpZiAoeF9vZmYxIDwgUVBFTF9FWFRSQV9CRUZPUkUgfHwgeV9vZmYxIDwgUVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB4X29mZjEgPj0gcGljX3dpZHRoIC0gYmxvY2tfdyAtIFFQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeV9vZmYxID49IHBpY19oZWlnaHQgLSBibG9ja19oIC0gUVBFTF9FWFRSQV9BRlRFUikgeworICAgICAgICBjb25zdCBwdHJkaWZmX3QgZWRnZV9lbXVfc3RyaWRlID0gRURHRV9FTVVfQlVGRkVSX1NUUklERSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0OworICAgICAgICBpbnQgb2Zmc2V0ICAgICA9IFFQRUxfRVhUUkFfQkVGT1JFICogc3JjMXN0cmlkZSAgICAgICArIChRUEVMX0VYVFJBX0JFRk9SRSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKKyAgICAgICAgaW50IGJ1Zl9vZmZzZXQgPSBRUEVMX0VYVFJBX0JFRk9SRSAqIGVkZ2VfZW11X3N0cmlkZSArIChRUEVMX0VYVFJBX0JFRk9SRSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KTsKKworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMobGMtPmVkZ2VfZW11X2J1ZmZlcjIsIHNyYzEgLSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlX2VtdV9zdHJpZGUsIHNyYzFzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja193ICsgUVBFTF9FWFRSQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2ggKyBRUEVMX0VYVFJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYxIC0gUVBFTF9FWFRSQV9CRUZPUkUsIHlfb2ZmMSAtIFFQRUxfRVhUUkFfQkVGT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljX3dpZHRoLCBwaWNfaGVpZ2h0KTsKKyAgICAgICAgc3JjMSA9IGxjLT5lZGdlX2VtdV9idWZmZXIyICsgYnVmX29mZnNldDsKKyAgICAgICAgc3JjMXN0cmlkZSA9IGVkZ2VfZW11X3N0cmlkZTsKKyAgICB9CisKKyAgICBzLT5oZXZjZHNwLnB1dF9oZXZjX3FwZWxbaWR4XVshIW15MF1bISFteDBdKGxjLT50bXAsIHNyYzAsIHNyYzBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBteDAsIG15MCwgYmxvY2tfdyk7CisgICAgaWYgKCF3ZWlnaHRfZmxhZykKKyAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19xcGVsX2JpW2lkeF1bISFteTFdWyEhbXgxXShkc3QsIGRzdHN0cmlkZSwgc3JjMSwgc3JjMXN0cmlkZSwgbGMtPnRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBteDEsIG15MSwgYmxvY2tfdyk7CisgICAgZWxzZQorICAgICAgICBzLT5oZXZjZHNwLnB1dF9oZXZjX3FwZWxfYmlfd1tpZHhdWyEhbXkxXVshIW14MV0oZHN0LCBkc3RzdHJpZGUsIHNyYzEsIHNyYzFzdHJpZGUsIGxjLT50bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBzLT5zaC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV93ZWlnaHRfbDBbY3VycmVudF9tdi0+cmVmX2lkeFswXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5sdW1hX3dlaWdodF9sMVtjdXJyZW50X212LT5yZWZfaWR4WzFdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wwW2N1cnJlbnRfbXYtPnJlZl9pZHhbMF1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV9vZmZzZXRfbDFbY3VycmVudF9tdi0+cmVmX2lkeFsxXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteDEsIG15MSwgYmxvY2tfdyk7CisKK30KKworLyoqCisgKiA4LjUuMy4yLjIuMiBDaHJvbWEgc2FtcGxlIHVuaXByZWRpY3Rpb24gaW50ZXJwb2xhdGlvbiBwcm9jZXNzCisgKgorICogQHBhcmFtIHMgSEVWQyBkZWNvZGluZyBjb250ZXh0CisgKiBAcGFyYW0gZHN0MSB0YXJnZXQgYnVmZmVyIGZvciBibG9jayBkYXRhIGF0IGJsb2NrIHBvc2l0aW9uIChVIHBsYW5lKQorICogQHBhcmFtIGRzdDIgdGFyZ2V0IGJ1ZmZlciBmb3IgYmxvY2sgZGF0YSBhdCBibG9jayBwb3NpdGlvbiAoViBwbGFuZSkKKyAqIEBwYXJhbSBkc3RzdHJpZGUgc3RyaWRlIG9mIHRoZSBkc3QxIGFuZCBkc3QyIGJ1ZmZlcnMKKyAqIEBwYXJhbSByZWYgcmVmZXJlbmNlIHBpY3R1cmUgYnVmZmVyIGF0IG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBtdiBtb3Rpb24gdmVjdG9yIChyZWxhdGl2ZSB0byBibG9jayBwb3NpdGlvbikgdG8gZ2V0IHBpeGVsIGRhdGEgZnJvbQorICogQHBhcmFtIHhfb2ZmIGhvcml6b250YWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0geV9vZmYgdmVydGljYWwgcG9zaXRpb24gb2YgYmxvY2sgZnJvbSBvcmlnaW4gKDAsIDApCisgKiBAcGFyYW0gYmxvY2tfdyB3aWR0aCBvZiBibG9jaworICogQHBhcmFtIGJsb2NrX2ggaGVpZ2h0IG9mIGJsb2NrCisgKiBAcGFyYW0gY2hyb21hX3dlaWdodCB3ZWlnaHRpbmcgZmFjdG9yIGFwcGxpZWQgdG8gdGhlIGNocm9tYSBwcmVkaWN0aW9uCisgKiBAcGFyYW0gY2hyb21hX29mZnNldCBhZGRpdGl2ZSBvZmZzZXQgYXBwbGllZCB0byB0aGUgY2hyb21hIHByZWRpY3Rpb24gdmFsdWUKKyAqLworCitzdGF0aWMgdm9pZCBjaHJvbWFfbWNfdW5pKEhFVkNDb250ZXh0ICpzLCB1aW50OF90ICpkc3QwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMwLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgcmVmbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfb2ZmLCBpbnQgeV9vZmYsIGludCBibG9ja193LCBpbnQgYmxvY2tfaCwgc3RydWN0IE12RmllbGQgKmN1cnJlbnRfbXYsIGludCBjaHJvbWFfd2VpZ2h0LCBpbnQgY2hyb21hX29mZnNldCkKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBpbnQgcGljX3dpZHRoICAgICAgICA9IHMtPnBzLnNwcy0+d2lkdGggPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV07CisgICAgaW50IHBpY19oZWlnaHQgICAgICAgPSBzLT5wcy5zcHMtPmhlaWdodCA+PiBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKKyAgICBjb25zdCBNdiAqbXYgICAgICAgICA9ICZjdXJyZW50X212LT5tdltyZWZsaXN0XTsKKyAgICBpbnQgd2VpZ2h0X2ZsYWcgICAgICA9IChzLT5zaC5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfUCAmJiBzLT5wcy5wcHMtPndlaWdodGVkX3ByZWRfZmxhZykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zaC5zbGljZV90eXBlID09IEhFVkNfU0xJQ0VfQiAmJiBzLT5wcy5wcHMtPndlaWdodGVkX2JpcHJlZF9mbGFnKTsKKyAgICBpbnQgaWR4ICAgICAgICAgICAgICA9IGZmX2hldmNfcGVsX3dlaWdodFtibG9ja193XTsKKyAgICBpbnQgaHNoaWZ0ICAgICAgICAgICA9IHMtPnBzLnNwcy0+aHNoaWZ0WzFdOworICAgIGludCB2c2hpZnQgICAgICAgICAgID0gcy0+cHMuc3BzLT52c2hpZnRbMV07CisgICAgaW50cHRyX3QgbXggICAgICAgICAgPSBhdl9tb2RfdWludHAyKG12LT54LCAyICsgaHNoaWZ0KTsKKyAgICBpbnRwdHJfdCBteSAgICAgICAgICA9IGF2X21vZF91aW50cDIobXYtPnksIDIgKyB2c2hpZnQpOworICAgIGludHB0cl90IF9teCAgICAgICAgID0gbXggPDwgKDEgLSBoc2hpZnQpOworICAgIGludHB0cl90IF9teSAgICAgICAgID0gbXkgPDwgKDEgLSB2c2hpZnQpOworCisgICAgeF9vZmYgKz0gbXYtPnggPj4gKDIgKyBoc2hpZnQpOworICAgIHlfb2ZmICs9IG12LT55ID4+ICgyICsgdnNoaWZ0KTsKKyAgICBzcmMwICArPSB5X29mZiAqIHNyY3N0cmlkZSArICh4X29mZiAqICgxIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpKTsKKworICAgIGlmICh4X29mZiA8IEVQRUxfRVhUUkFfQkVGT1JFIHx8IHlfb2ZmIDwgRVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB4X29mZiA+PSBwaWNfd2lkdGggLSBibG9ja193IC0gRVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB5X29mZiA+PSBwaWNfaGVpZ2h0IC0gYmxvY2tfaCAtIEVQRUxfRVhUUkFfQUZURVIpIHsKKyAgICAgICAgY29uc3QgaW50IGVkZ2VfZW11X3N0cmlkZSA9IEVER0VfRU1VX0JVRkZFUl9TVFJJREUgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdDsKKyAgICAgICAgaW50IG9mZnNldDAgPSBFUEVMX0VYVFJBX0JFRk9SRSAqIChzcmNzdHJpZGUgKyAoMSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KSk7CisgICAgICAgIGludCBidWZfb2Zmc2V0MCA9IEVQRUxfRVhUUkFfQkVGT1JFICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVkZ2VfZW11X3N0cmlkZSArICgxIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpKTsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGxjLT5lZGdlX2VtdV9idWZmZXIsIHNyYzAgLSBvZmZzZXQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV9lbXVfc3RyaWRlLCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja193ICsgRVBFTF9FWFRSQSwgYmxvY2tfaCArIEVQRUxfRVhUUkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X29mZiAtIEVQRUxfRVhUUkFfQkVGT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9vZmYgLSBFUEVMX0VYVFJBX0JFRk9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisKKyAgICAgICAgc3JjMCA9IGxjLT5lZGdlX2VtdV9idWZmZXIgKyBidWZfb2Zmc2V0MDsKKyAgICAgICAgc3Jjc3RyaWRlID0gZWRnZV9lbXVfc3RyaWRlOworICAgIH0KKyAgICBpZiAoIXdlaWdodF9mbGFnKQorICAgICAgICBzLT5oZXZjZHNwLnB1dF9oZXZjX2VwZWxfdW5pW2lkeF1bISFteV1bISFteF0oZHN0MCwgZHN0c3RyaWRlLCBzcmMwLCBzcmNzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIF9teCwgX215LCBibG9ja193KTsKKyAgICBlbHNlCisgICAgICAgIHMtPmhldmNkc3AucHV0X2hldmNfZXBlbF91bmlfd1tpZHhdWyEhbXldWyEhbXhdKGRzdDAsIGRzdHN0cmlkZSwgc3JjMCwgc3Jjc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja19oLCBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHQsIGNocm9tYV9vZmZzZXQsIF9teCwgX215LCBibG9ja193KTsKK30KKworLyoqCisgKiA4LjUuMy4yLjIuMiBDaHJvbWEgc2FtcGxlIGJpZGlyZWN0aW9uYWwgaW50ZXJwb2xhdGlvbiBwcm9jZXNzCisgKgorICogQHBhcmFtIHMgSEVWQyBkZWNvZGluZyBjb250ZXh0CisgKiBAcGFyYW0gZHN0IHRhcmdldCBidWZmZXIgZm9yIGJsb2NrIGRhdGEgYXQgYmxvY2sgcG9zaXRpb24KKyAqIEBwYXJhbSBkc3RzdHJpZGUgc3RyaWRlIG9mIHRoZSBkc3QgYnVmZmVyCisgKiBAcGFyYW0gcmVmMCByZWZlcmVuY2UgcGljdHVyZTAgYnVmZmVyIGF0IG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBtdjAgbW90aW9uIHZlY3RvcjAgKHJlbGF0aXZlIHRvIGJsb2NrIHBvc2l0aW9uKSB0byBnZXQgcGl4ZWwgZGF0YSBmcm9tCisgKiBAcGFyYW0geF9vZmYgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSB5X29mZiB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiBibG9jayBmcm9tIG9yaWdpbiAoMCwgMCkKKyAqIEBwYXJhbSBibG9ja193IHdpZHRoIG9mIGJsb2NrCisgKiBAcGFyYW0gYmxvY2tfaCBoZWlnaHQgb2YgYmxvY2sKKyAqIEBwYXJhbSByZWYxIHJlZmVyZW5jZSBwaWN0dXJlMSBidWZmZXIgYXQgb3JpZ2luICgwLCAwKQorICogQHBhcmFtIG12MSBtb3Rpb24gdmVjdG9yMSAocmVsYXRpdmUgdG8gYmxvY2sgcG9zaXRpb24pIHRvIGdldCBwaXhlbCBkYXRhIGZyb20KKyAqIEBwYXJhbSBjdXJyZW50X212IGN1cnJlbnQgbW90aW9uIHZlY3RvciBzdHJ1Y3R1cmUKKyAqIEBwYXJhbSBjaWR4IGNocm9tYSBjb21wb25lbnQoY2IsIGNyKQorICovCitzdGF0aWMgdm9pZCBjaHJvbWFfbWNfYmkoSEVWQ0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdDAsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIEFWRnJhbWUgKnJlZjAsIEFWRnJhbWUgKnJlZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfb2ZmLCBpbnQgeV9vZmYsIGludCBibG9ja193LCBpbnQgYmxvY2tfaCwgc3RydWN0IE12RmllbGQgKmN1cnJlbnRfbXYsIGludCBjaWR4KQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIHVpbnQ4X3QgKnNyYzEgICAgICAgID0gcmVmMC0+ZGF0YVtjaWR4KzFdOworICAgIHVpbnQ4X3QgKnNyYzIgICAgICAgID0gcmVmMS0+ZGF0YVtjaWR4KzFdOworICAgIHB0cmRpZmZfdCBzcmMxc3RyaWRlID0gcmVmMC0+bGluZXNpemVbY2lkeCsxXTsKKyAgICBwdHJkaWZmX3Qgc3JjMnN0cmlkZSA9IHJlZjEtPmxpbmVzaXplW2NpZHgrMV07CisgICAgaW50IHdlaWdodF9mbGFnICAgICAgPSAocy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX1AgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IgJiYgcy0+cHMucHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZyk7CisgICAgaW50IHBpY193aWR0aCAgICAgICAgPSBzLT5wcy5zcHMtPndpZHRoID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzFdOworICAgIGludCBwaWNfaGVpZ2h0ICAgICAgID0gcy0+cHMuc3BzLT5oZWlnaHQgPj4gcy0+cHMuc3BzLT52c2hpZnRbMV07CisgICAgTXYgKm12MCAgICAgICAgICAgICAgPSAmY3VycmVudF9tdi0+bXZbMF07CisgICAgTXYgKm12MSAgICAgICAgICAgICAgPSAmY3VycmVudF9tdi0+bXZbMV07CisgICAgaW50IGhzaGlmdCA9IHMtPnBzLnNwcy0+aHNoaWZ0WzFdOworICAgIGludCB2c2hpZnQgPSBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKKworICAgIGludHB0cl90IG14MCA9IGF2X21vZF91aW50cDIobXYwLT54LCAyICsgaHNoaWZ0KTsKKyAgICBpbnRwdHJfdCBteTAgPSBhdl9tb2RfdWludHAyKG12MC0+eSwgMiArIHZzaGlmdCk7CisgICAgaW50cHRyX3QgbXgxID0gYXZfbW9kX3VpbnRwMihtdjEtPngsIDIgKyBoc2hpZnQpOworICAgIGludHB0cl90IG15MSA9IGF2X21vZF91aW50cDIobXYxLT55LCAyICsgdnNoaWZ0KTsKKyAgICBpbnRwdHJfdCBfbXgwID0gbXgwIDw8ICgxIC0gaHNoaWZ0KTsKKyAgICBpbnRwdHJfdCBfbXkwID0gbXkwIDw8ICgxIC0gdnNoaWZ0KTsKKyAgICBpbnRwdHJfdCBfbXgxID0gbXgxIDw8ICgxIC0gaHNoaWZ0KTsKKyAgICBpbnRwdHJfdCBfbXkxID0gbXkxIDw8ICgxIC0gdnNoaWZ0KTsKKworICAgIGludCB4X29mZjAgPSB4X29mZiArIChtdjAtPnggPj4gKDIgKyBoc2hpZnQpKTsKKyAgICBpbnQgeV9vZmYwID0geV9vZmYgKyAobXYwLT55ID4+ICgyICsgdnNoaWZ0KSk7CisgICAgaW50IHhfb2ZmMSA9IHhfb2ZmICsgKG12MS0+eCA+PiAoMiArIGhzaGlmdCkpOworICAgIGludCB5X29mZjEgPSB5X29mZiArIChtdjEtPnkgPj4gKDIgKyB2c2hpZnQpKTsKKyAgICBpbnQgaWR4ID0gZmZfaGV2Y19wZWxfd2VpZ2h0W2Jsb2NrX3ddOworICAgIHNyYzEgICs9IHlfb2ZmMCAqIHNyYzFzdHJpZGUgKyAoaW50KSgodW5zaWduZWQpeF9vZmYwIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpOworICAgIHNyYzIgICs9IHlfb2ZmMSAqIHNyYzJzdHJpZGUgKyAoaW50KSgodW5zaWduZWQpeF9vZmYxIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpOworCisgICAgaWYgKHhfb2ZmMCA8IEVQRUxfRVhUUkFfQkVGT1JFIHx8IHlfb2ZmMCA8IEVQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeF9vZmYwID49IHBpY193aWR0aCAtIGJsb2NrX3cgLSBFUEVMX0VYVFJBX0FGVEVSIHx8CisgICAgICAgIHlfb2ZmMCA+PSBwaWNfaGVpZ2h0IC0gYmxvY2tfaCAtIEVQRUxfRVhUUkFfQUZURVIpIHsKKyAgICAgICAgY29uc3QgaW50IGVkZ2VfZW11X3N0cmlkZSA9IEVER0VfRU1VX0JVRkZFUl9TVFJJREUgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdDsKKyAgICAgICAgaW50IG9mZnNldDEgPSBFUEVMX0VYVFJBX0JFRk9SRSAqIChzcmMxc3RyaWRlICsgKDEgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCkpOworICAgICAgICBpbnQgYnVmX29mZnNldDEgPSBFUEVMX0VYVFJBX0JFRk9SRSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIChlZGdlX2VtdV9zdHJpZGUgKyAoMSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KSk7CisKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKGxjLT5lZGdlX2VtdV9idWZmZXIsIHNyYzEgLSBvZmZzZXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV9lbXVfc3RyaWRlLCBzcmMxc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIEVQRUxfRVhUUkEsIGJsb2NrX2ggKyBFUEVMX0VYVFJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYwIC0gRVBFTF9FWFRSQV9CRUZPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X29mZjAgLSBFUEVMX0VYVFJBX0JFRk9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisKKyAgICAgICAgc3JjMSA9IGxjLT5lZGdlX2VtdV9idWZmZXIgKyBidWZfb2Zmc2V0MTsKKyAgICAgICAgc3JjMXN0cmlkZSA9IGVkZ2VfZW11X3N0cmlkZTsKKyAgICB9CisKKyAgICBpZiAoeF9vZmYxIDwgRVBFTF9FWFRSQV9CRUZPUkUgfHwgeV9vZmYxIDwgRVBFTF9FWFRSQV9BRlRFUiB8fAorICAgICAgICB4X29mZjEgPj0gcGljX3dpZHRoIC0gYmxvY2tfdyAtIEVQRUxfRVhUUkFfQUZURVIgfHwKKyAgICAgICAgeV9vZmYxID49IHBpY19oZWlnaHQgLSBibG9ja19oIC0gRVBFTF9FWFRSQV9BRlRFUikgeworICAgICAgICBjb25zdCBpbnQgZWRnZV9lbXVfc3RyaWRlID0gRURHRV9FTVVfQlVGRkVSX1NUUklERSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0OworICAgICAgICBpbnQgb2Zmc2V0MSA9IEVQRUxfRVhUUkFfQkVGT1JFICogKHNyYzJzdHJpZGUgKyAoMSA8PCBzLT5wcy5zcHMtPnBpeGVsX3NoaWZ0KSk7CisgICAgICAgIGludCBidWZfb2Zmc2V0MSA9IEVQRUxfRVhUUkFfQkVGT1JFICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGVkZ2VfZW11X3N0cmlkZSArICgxIDw8IHMtPnBzLnNwcy0+cGl4ZWxfc2hpZnQpKTsKKworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMobGMtPmVkZ2VfZW11X2J1ZmZlcjIsIHNyYzIgLSBvZmZzZXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZV9lbXVfc3RyaWRlLCBzcmMyc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfdyArIEVQRUxfRVhUUkEsIGJsb2NrX2ggKyBFUEVMX0VYVFJBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYxIC0gRVBFTF9FWFRSQV9CRUZPUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X29mZjEgLSBFUEVMX0VYVFJBX0JFRk9SRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY193aWR0aCwgcGljX2hlaWdodCk7CisKKyAgICAgICAgc3JjMiA9IGxjLT5lZGdlX2VtdV9idWZmZXIyICsgYnVmX29mZnNldDE7CisgICAgICAgIHNyYzJzdHJpZGUgPSBlZGdlX2VtdV9zdHJpZGU7CisgICAgfQorCisgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19lcGVsW2lkeF1bISFteTBdWyEhbXgwXShsYy0+dG1wLCBzcmMxLCBzcmMxc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfaCwgX214MCwgX215MCwgYmxvY2tfdyk7CisgICAgaWYgKCF3ZWlnaHRfZmxhZykKKyAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19lcGVsX2JpW2lkeF1bISFteTFdWyEhbXgxXShkc3QwLCBzLT5mcmFtZS0+bGluZXNpemVbY2lkeCsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBzcmMyc3RyaWRlLCBsYy0+dG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsIF9teDEsIF9teTEsIGJsb2NrX3cpOworICAgIGVsc2UKKyAgICAgICAgcy0+aGV2Y2RzcC5wdXRfaGV2Y19lcGVsX2JpX3dbaWR4XVshIW15MV1bISFteDFdKGRzdDAsIHMtPmZyYW1lLT5saW5lc2l6ZVtjaWR4KzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgc3JjMnN0cmlkZSwgbGMtPnRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wwW2N1cnJlbnRfbXYtPnJlZl9pZHhbMF1dW2NpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2guY2hyb21hX3dlaWdodF9sMVtjdXJyZW50X212LT5yZWZfaWR4WzFdXVtjaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV9vZmZzZXRfbDBbY3VycmVudF9tdi0+cmVmX2lkeFswXV1bY2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfb2Zmc2V0X2wxW2N1cnJlbnRfbXYtPnJlZl9pZHhbMV1dW2NpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX214MSwgX215MSwgYmxvY2tfdyk7Cit9CisKK3N0YXRpYyB2b2lkIGhldmNfYXdhaXRfcHJvZ3Jlc3MoSEVWQ0NvbnRleHQgKnMsIEhFVkNGcmFtZSAqcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdiAqbXYsIGludCB5MCwgaW50IGhlaWdodCkKK3sKKyAgICBpZiAocy0+dGhyZWFkc190eXBlID09IEZGX1RIUkVBRF9GUkFNRSApIHsKKyAgICAgICAgaW50IHkgPSBGRk1BWCgwLCAobXYtPnkgPj4gMikgKyB5MCArIGhlaWdodCArIDkpOworCisgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcmVmLT50ZiwgeSwgMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoZXZjX2x1bWFfbXZfbXZwX21vZGUoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgblBiVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBiSCwgaW50IGxvZzJfY2Jfc2l6ZSwgaW50IHBhcnRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXJnZV9pZHgsIE12RmllbGQgKm12KQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGVudW0gSW50ZXJQcmVkSWRjIGludGVyX3ByZWRfaWRjID0gUFJFRF9MMDsKKyAgICBpbnQgbXZwX2ZsYWc7CisKKyAgICBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKHMsIHgwLCB5MCwgblBiVywgblBiSCk7CisgICAgbXYtPnByZWRfZmxhZyA9IDA7CisgICAgaWYgKHMtPnNoLnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CKQorICAgICAgICBpbnRlcl9wcmVkX2lkYyA9IGZmX2hldmNfaW50ZXJfcHJlZF9pZGNfZGVjb2RlKHMsIG5QYlcsIG5QYkgpOworCisgICAgaWYgKGludGVyX3ByZWRfaWRjICE9IFBSRURfTDEpIHsKKyAgICAgICAgaWYgKHMtPnNoLm5iX3JlZnNbTDBdKQorICAgICAgICAgICAgbXYtPnJlZl9pZHhbMF09IGZmX2hldmNfcmVmX2lkeF9seF9kZWNvZGUocywgcy0+c2gubmJfcmVmc1tMMF0pOworCisgICAgICAgIG12LT5wcmVkX2ZsYWcgPSBQRl9MMDsKKyAgICAgICAgZmZfaGV2Y19obHNfbXZkX2NvZGluZyhzLCB4MCwgeTAsIDApOworICAgICAgICBtdnBfZmxhZyA9IGZmX2hldmNfbXZwX2x4X2ZsYWdfZGVjb2RlKHMpOworICAgICAgICBmZl9oZXZjX2x1bWFfbXZfbXZwX21vZGUocywgeDAsIHkwLCBuUGJXLCBuUGJILCBsb2cyX2NiX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X2lkeCwgbWVyZ2VfaWR4LCBtdiwgbXZwX2ZsYWcsIDApOworICAgICAgICBtdi0+bXZbMF0ueCArPSBsYy0+cHUubXZkLng7CisgICAgICAgIG12LT5tdlswXS55ICs9IGxjLT5wdS5tdmQueTsKKyAgICB9CisKKyAgICBpZiAoaW50ZXJfcHJlZF9pZGMgIT0gUFJFRF9MMCkgeworICAgICAgICBpZiAocy0+c2gubmJfcmVmc1tMMV0pCisgICAgICAgICAgICBtdi0+cmVmX2lkeFsxXT0gZmZfaGV2Y19yZWZfaWR4X2x4X2RlY29kZShzLCBzLT5zaC5uYl9yZWZzW0wxXSk7CisKKyAgICAgICAgaWYgKHMtPnNoLm12ZF9sMV96ZXJvX2ZsYWcgPT0gMSAmJiBpbnRlcl9wcmVkX2lkYyA9PSBQUkVEX0JJKSB7CisgICAgICAgICAgICBBVl9aRVJPMzIoJmxjLT5wdS5tdmQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmZfaGV2Y19obHNfbXZkX2NvZGluZyhzLCB4MCwgeTAsIDEpOworICAgICAgICB9CisKKyAgICAgICAgbXYtPnByZWRfZmxhZyArPSBQRl9MMTsKKyAgICAgICAgbXZwX2ZsYWcgPSBmZl9oZXZjX212cF9seF9mbGFnX2RlY29kZShzKTsKKyAgICAgICAgZmZfaGV2Y19sdW1hX212X212cF9tb2RlKHMsIHgwLCB5MCwgblBiVywgblBiSCwgbG9nMl9jYl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF9pZHgsIG1lcmdlX2lkeCwgbXYsIG12cF9mbGFnLCAxKTsKKyAgICAgICAgbXYtPm12WzFdLnggKz0gbGMtPnB1Lm12ZC54OworICAgICAgICBtdi0+bXZbMV0ueSArPSBsYy0+cHUubXZkLnk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBobHNfcHJlZGljdGlvbl91bml0KEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYlcsIGludCBuUGJILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9jYl9zaXplLCBpbnQgcGFydElkeCwgaW50IGlkeCkKK3sKKyNkZWZpbmUgUE9TKGNfaWR4LCB4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICZzLT5mcmFtZS0+ZGF0YVtjX2lkeF1bKCh5KSA+PiBzLT5wcy5zcHMtPnZzaGlmdFtjX2lkeF0pICogcy0+ZnJhbWUtPmxpbmVzaXplW2NfaWR4XSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpID4+IHMtPnBzLnNwcy0+aHNoaWZ0W2NfaWR4XSkgPDwgcy0+cHMuc3BzLT5waXhlbF9zaGlmdCldCisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgaW50IG1lcmdlX2lkeCA9IDA7CisgICAgc3RydWN0IE12RmllbGQgY3VycmVudF9tdiA9IHt7eyAwIH19fTsKKworICAgIGludCBtaW5fcHVfd2lkdGggPSBzLT5wcy5zcHMtPm1pbl9wdV93aWR0aDsKKworICAgIE12RmllbGQgKnRhYl9tdmYgPSBzLT5yZWYtPnRhYl9tdmY7CisgICAgUmVmUGljTGlzdCAgKnJlZlBpY0xpc3QgPSBzLT5yZWYtPnJlZlBpY0xpc3Q7CisgICAgSEVWQ0ZyYW1lICpyZWYwID0gTlVMTCwgKnJlZjEgPSBOVUxMOworICAgIHVpbnQ4X3QgKmRzdDAgPSBQT1MoMCwgeDAsIHkwKTsKKyAgICB1aW50OF90ICpkc3QxID0gUE9TKDEsIHgwLCB5MCk7CisgICAgdWludDhfdCAqZHN0MiA9IFBPUygyLCB4MCwgeTApOworICAgIGludCBsb2cyX21pbl9jYl9zaXplID0gcy0+cHMuc3BzLT5sb2cyX21pbl9jYl9zaXplOworICAgIGludCBtaW5fY2Jfd2lkdGggICAgID0gcy0+cHMuc3BzLT5taW5fY2Jfd2lkdGg7CisgICAgaW50IHhfY2IgICAgICAgICAgICAgPSB4MCA+PiBsb2cyX21pbl9jYl9zaXplOworICAgIGludCB5X2NiICAgICAgICAgICAgID0geTAgPj4gbG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgeF9wdSwgeV9wdTsKKyAgICBpbnQgaSwgajsKKworICAgIGludCBza2lwX2ZsYWcgPSBTQU1QTEVfQ1RCKHMtPnNraXBfZmxhZywgeF9jYiwgeV9jYik7CisKKyAgICBpZiAoIXNraXBfZmxhZykKKyAgICAgICAgbGMtPnB1Lm1lcmdlX2ZsYWcgPSBmZl9oZXZjX21lcmdlX2ZsYWdfZGVjb2RlKHMpOworCisgICAgaWYgKHNraXBfZmxhZyB8fCBsYy0+cHUubWVyZ2VfZmxhZykgeworICAgICAgICBpZiAocy0+c2gubWF4X251bV9tZXJnZV9jYW5kID4gMSkKKyAgICAgICAgICAgIG1lcmdlX2lkeCA9IGZmX2hldmNfbWVyZ2VfaWR4X2RlY29kZShzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWVyZ2VfaWR4ID0gMDsKKworICAgICAgICBmZl9oZXZjX2x1bWFfbXZfbWVyZ2VfbW9kZShzLCB4MCwgeTAsIG5QYlcsIG5QYkgsIGxvZzJfY2Jfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydElkeCwgbWVyZ2VfaWR4LCAmY3VycmVudF9tdik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGV2Y19sdW1hX212X212cF9tb2RlKHMsIHgwLCB5MCwgblBiVywgblBiSCwgbG9nMl9jYl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydElkeCwgbWVyZ2VfaWR4LCAmY3VycmVudF9tdik7CisgICAgfQorCisgICAgeF9wdSA9IHgwID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKyAgICB5X3B1ID0geTAgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9wdV9zaXplOworCisgICAgZm9yIChqID0gMDsgaiA8IG5QYkggPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9wdV9zaXplOyBqKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuUGJXID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsgaSsrKQorICAgICAgICAgICAgdGFiX212ZlsoeV9wdSArIGopICogbWluX3B1X3dpZHRoICsgeF9wdSArIGldID0gY3VycmVudF9tdjsKKworICAgIGlmIChjdXJyZW50X212LnByZWRfZmxhZyAmIFBGX0wwKSB7CisgICAgICAgIHJlZjAgPSByZWZQaWNMaXN0WzBdLnJlZltjdXJyZW50X212LnJlZl9pZHhbMF1dOworICAgICAgICBpZiAoIXJlZjApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGhldmNfYXdhaXRfcHJvZ3Jlc3MocywgcmVmMCwgJmN1cnJlbnRfbXYubXZbMF0sIHkwLCBuUGJIKTsKKyAgICB9CisgICAgaWYgKGN1cnJlbnRfbXYucHJlZF9mbGFnICYgUEZfTDEpIHsKKyAgICAgICAgcmVmMSA9IHJlZlBpY0xpc3RbMV0ucmVmW2N1cnJlbnRfbXYucmVmX2lkeFsxXV07CisgICAgICAgIGlmICghcmVmMSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaGV2Y19hd2FpdF9wcm9ncmVzcyhzLCByZWYxLCAmY3VycmVudF9tdi5tdlsxXSwgeTAsIG5QYkgpOworICAgIH0KKworICAgIGlmIChjdXJyZW50X212LnByZWRfZmxhZyA9PSBQRl9MMCkgeworICAgICAgICBpbnQgeDBfYyA9IHgwID4+IHMtPnBzLnNwcy0+aHNoaWZ0WzFdOworICAgICAgICBpbnQgeTBfYyA9IHkwID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdOworICAgICAgICBpbnQgblBiV19jID0gblBiVyA+PiBzLT5wcy5zcHMtPmhzaGlmdFsxXTsKKyAgICAgICAgaW50IG5QYkhfYyA9IG5QYkggPj4gcy0+cHMuc3BzLT52c2hpZnRbMV07CisKKyAgICAgICAgbHVtYV9tY191bmkocywgZHN0MCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdLCByZWYwLT5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgJmN1cnJlbnRfbXYubXZbMF0sIHgwLCB5MCwgblBiVywgblBiSCwKKyAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV93ZWlnaHRfbDBbY3VycmVudF9tdi5yZWZfaWR4WzBdXSwKKyAgICAgICAgICAgICAgICAgICAgcy0+c2gubHVtYV9vZmZzZXRfbDBbY3VycmVudF9tdi5yZWZfaWR4WzBdXSk7CisKKyAgICAgICAgaWYgKHMtPnBzLnNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMpIHsKKyAgICAgICAgICAgIGNocm9tYV9tY191bmkocywgZHN0MSwgcy0+ZnJhbWUtPmxpbmVzaXplWzFdLCByZWYwLT5mcmFtZS0+ZGF0YVsxXSwgcmVmMC0+ZnJhbWUtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB4MF9jLCB5MF9jLCBuUGJXX2MsIG5QYkhfYywgJmN1cnJlbnRfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDBbY3VycmVudF9tdi5yZWZfaWR4WzBdXVswXSwgcy0+c2guY2hyb21hX29mZnNldF9sMFtjdXJyZW50X212LnJlZl9pZHhbMF1dWzBdKTsKKyAgICAgICAgICAgIGNocm9tYV9tY191bmkocywgZHN0Miwgcy0+ZnJhbWUtPmxpbmVzaXplWzJdLCByZWYwLT5mcmFtZS0+ZGF0YVsyXSwgcmVmMC0+ZnJhbWUtPmxpbmVzaXplWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB4MF9jLCB5MF9jLCBuUGJXX2MsIG5QYkhfYywgJmN1cnJlbnRfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDBbY3VycmVudF9tdi5yZWZfaWR4WzBdXVsxXSwgcy0+c2guY2hyb21hX29mZnNldF9sMFtjdXJyZW50X212LnJlZl9pZHhbMF1dWzFdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY3VycmVudF9tdi5wcmVkX2ZsYWcgPT0gUEZfTDEpIHsKKyAgICAgICAgaW50IHgwX2MgPSB4MCA+PiBzLT5wcy5zcHMtPmhzaGlmdFsxXTsKKyAgICAgICAgaW50IHkwX2MgPSB5MCA+PiBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKKyAgICAgICAgaW50IG5QYldfYyA9IG5QYlcgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV07CisgICAgICAgIGludCBuUGJIX2MgPSBuUGJIID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdOworCisgICAgICAgIGx1bWFfbWNfdW5pKHMsIGRzdDAsIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwgcmVmMS0+ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICZjdXJyZW50X212Lm12WzFdLCB4MCwgeTAsIG5QYlcsIG5QYkgsCisgICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfd2VpZ2h0X2wxW2N1cnJlbnRfbXYucmVmX2lkeFsxXV0sCisgICAgICAgICAgICAgICAgICAgIHMtPnNoLmx1bWFfb2Zmc2V0X2wxW2N1cnJlbnRfbXYucmVmX2lkeFsxXV0pOworCisgICAgICAgIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjKSB7CisgICAgICAgICAgICBjaHJvbWFfbWNfdW5pKHMsIGRzdDEsIHMtPmZyYW1lLT5saW5lc2l6ZVsxXSwgcmVmMS0+ZnJhbWUtPmRhdGFbMV0sIHJlZjEtPmZyYW1lLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgeDBfYywgeTBfYywgblBiV19jLCBuUGJIX2MsICZjdXJyZW50X212LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zaC5jaHJvbWFfd2VpZ2h0X2wxW2N1cnJlbnRfbXYucmVmX2lkeFsxXV1bMF0sIHMtPnNoLmNocm9tYV9vZmZzZXRfbDFbY3VycmVudF9tdi5yZWZfaWR4WzFdXVswXSk7CisKKyAgICAgICAgICAgIGNocm9tYV9tY191bmkocywgZHN0Miwgcy0+ZnJhbWUtPmxpbmVzaXplWzJdLCByZWYxLT5mcmFtZS0+ZGF0YVsyXSwgcmVmMS0+ZnJhbWUtPmxpbmVzaXplWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB4MF9jLCB5MF9jLCBuUGJXX2MsIG5QYkhfYywgJmN1cnJlbnRfbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNoLmNocm9tYV93ZWlnaHRfbDFbY3VycmVudF9tdi5yZWZfaWR4WzFdXVsxXSwgcy0+c2guY2hyb21hX29mZnNldF9sMVtjdXJyZW50X212LnJlZl9pZHhbMV1dWzFdKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoY3VycmVudF9tdi5wcmVkX2ZsYWcgPT0gUEZfQkkpIHsKKyAgICAgICAgaW50IHgwX2MgPSB4MCA+PiBzLT5wcy5zcHMtPmhzaGlmdFsxXTsKKyAgICAgICAgaW50IHkwX2MgPSB5MCA+PiBzLT5wcy5zcHMtPnZzaGlmdFsxXTsKKyAgICAgICAgaW50IG5QYldfYyA9IG5QYlcgPj4gcy0+cHMuc3BzLT5oc2hpZnRbMV07CisgICAgICAgIGludCBuUGJIX2MgPSBuUGJIID4+IHMtPnBzLnNwcy0+dnNoaWZ0WzFdOworCisgICAgICAgIGx1bWFfbWNfYmkocywgZHN0MCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdLCByZWYwLT5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAmY3VycmVudF9tdi5tdlswXSwgeDAsIHkwLCBuUGJXLCBuUGJILAorICAgICAgICAgICAgICAgICAgIHJlZjEtPmZyYW1lLCAmY3VycmVudF9tdi5tdlsxXSwgJmN1cnJlbnRfbXYpOworCisgICAgICAgIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjKSB7CisgICAgICAgICAgICBjaHJvbWFfbWNfYmkocywgZHN0MSwgcy0+ZnJhbWUtPmxpbmVzaXplWzFdLCByZWYwLT5mcmFtZSwgcmVmMS0+ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgeDBfYywgeTBfYywgblBiV19jLCBuUGJIX2MsICZjdXJyZW50X212LCAwKTsKKworICAgICAgICAgICAgY2hyb21hX21jX2JpKHMsIGRzdDIsIHMtPmZyYW1lLT5saW5lc2l6ZVsyXSwgcmVmMC0+ZnJhbWUsIHJlZjEtPmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHgwX2MsIHkwX2MsIG5QYldfYywgblBiSF9jLCAmY3VycmVudF9tdiwgMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogOC40LjEKKyAqLworc3RhdGljIGludCBsdW1hX2ludHJhX3ByZWRfbW9kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBwdV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldl9pbnRyYV9sdW1hX3ByZWRfZmxhZykKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBpbnQgeF9wdSAgICAgICAgICAgICA9IHgwID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKyAgICBpbnQgeV9wdSAgICAgICAgICAgICA9IHkwID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fcHVfc2l6ZTsKKyAgICBpbnQgbWluX3B1X3dpZHRoICAgICA9IHMtPnBzLnNwcy0+bWluX3B1X3dpZHRoOworICAgIGludCBzaXplX2luX3B1cyAgICAgID0gcHVfc2l6ZSA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX3B1X3NpemU7CisgICAgaW50IHgwYiAgICAgICAgICAgICAgPSBhdl9tb2RfdWludHAyKHgwLCBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUpOworICAgIGludCB5MGIgICAgICAgICAgICAgID0gYXZfbW9kX3VpbnRwMih5MCwgcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKTsKKworICAgIGludCBjYW5kX3VwICAgPSAobGMtPmN0Yl91cF9mbGFnIHx8IHkwYikgPworICAgICAgICAgICAgICAgICAgICBzLT50YWJfaXBtWyh5X3B1IC0gMSkgKiBtaW5fcHVfd2lkdGggKyB4X3B1XSA6IElOVFJBX0RDOworICAgIGludCBjYW5kX2xlZnQgPSAobGMtPmN0Yl9sZWZ0X2ZsYWcgfHwgeDBiKSA/CisgICAgICAgICAgICAgICAgICAgIHMtPnRhYl9pcG1beV9wdSAqIG1pbl9wdV93aWR0aCArIHhfcHUgLSAxXSAgIDogSU5UUkFfREM7CisKKyAgICBpbnQgeV9jdGIgPSAoeTAgPj4gKHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSkpIDw8IChzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUpOworCisgICAgTXZGaWVsZCAqdGFiX212ZiA9IHMtPnJlZi0+dGFiX212ZjsKKyAgICBpbnQgaW50cmFfcHJlZF9tb2RlOworICAgIGludCBjYW5kaWRhdGVbM107CisgICAgaW50IGksIGo7CisKKyAgICAvLyBpbnRyYV9wcmVkX21vZGUgcHJlZGljdGlvbiBkb2VzIG5vdCBjcm9zcyB2ZXJ0aWNhbCBDVEIgYm91bmRhcmllcworICAgIGlmICgoeTAgLSAxKSA8IHlfY3RiKQorICAgICAgICBjYW5kX3VwID0gSU5UUkFfREM7CisKKyAgICBpZiAoY2FuZF9sZWZ0ID09IGNhbmRfdXApIHsKKyAgICAgICAgaWYgKGNhbmRfbGVmdCA8IDIpIHsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVswXSA9IElOVFJBX1BMQU5BUjsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVsxXSA9IElOVFJBX0RDOworICAgICAgICAgICAgY2FuZGlkYXRlWzJdID0gSU5UUkFfQU5HVUxBUl8yNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVswXSA9IGNhbmRfbGVmdDsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVsxXSA9IDIgKyAoKGNhbmRfbGVmdCAtIDIgLSAxICsgMzIpICYgMzEpOworICAgICAgICAgICAgY2FuZGlkYXRlWzJdID0gMiArICgoY2FuZF9sZWZ0IC0gMiArIDEpICYgMzEpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2FuZGlkYXRlWzBdID0gY2FuZF9sZWZ0OworICAgICAgICBjYW5kaWRhdGVbMV0gPSBjYW5kX3VwOworICAgICAgICBpZiAoY2FuZGlkYXRlWzBdICE9IElOVFJBX1BMQU5BUiAmJiBjYW5kaWRhdGVbMV0gIT0gSU5UUkFfUExBTkFSKSB7CisgICAgICAgICAgICBjYW5kaWRhdGVbMl0gPSBJTlRSQV9QTEFOQVI7CisgICAgICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlWzBdICE9IElOVFJBX0RDICYmIGNhbmRpZGF0ZVsxXSAhPSBJTlRSQV9EQykgeworICAgICAgICAgICAgY2FuZGlkYXRlWzJdID0gSU5UUkFfREM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYW5kaWRhdGVbMl0gPSBJTlRSQV9BTkdVTEFSXzI2OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWcpIHsKKyAgICAgICAgaW50cmFfcHJlZF9tb2RlID0gY2FuZGlkYXRlW2xjLT5wdS5tcG1faWR4XTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2FuZGlkYXRlWzBdID4gY2FuZGlkYXRlWzFdKQorICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QsIGNhbmRpZGF0ZVswXSwgY2FuZGlkYXRlWzFdKTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZVswXSA+IGNhbmRpZGF0ZVsyXSkKKyAgICAgICAgICAgIEZGU1dBUCh1aW50OF90LCBjYW5kaWRhdGVbMF0sIGNhbmRpZGF0ZVsyXSk7CisgICAgICAgIGlmIChjYW5kaWRhdGVbMV0gPiBjYW5kaWRhdGVbMl0pCisgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgY2FuZGlkYXRlWzFdLCBjYW5kaWRhdGVbMl0pOworCisgICAgICAgIGludHJhX3ByZWRfbW9kZSA9IGxjLT5wdS5yZW1faW50cmFfbHVtYV9wcmVkX21vZGU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgICAgICAgICAgICBpZiAoaW50cmFfcHJlZF9tb2RlID49IGNhbmRpZGF0ZVtpXSkKKyAgICAgICAgICAgICAgICBpbnRyYV9wcmVkX21vZGUrKzsKKyAgICB9CisKKyAgICAvKiB3cml0ZSB0aGUgaW50cmEgcHJlZGljdGlvbiB1bml0cyBpbnRvIHRoZSBtdiBhcnJheSAqLworICAgIGlmICghc2l6ZV9pbl9wdXMpCisgICAgICAgIHNpemVfaW5fcHVzID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZV9pbl9wdXM7IGkrKykgeworICAgICAgICBtZW1zZXQoJnMtPnRhYl9pcG1bKHlfcHUgKyBpKSAqIG1pbl9wdV93aWR0aCArIHhfcHVdLAorICAgICAgICAgICAgICAgaW50cmFfcHJlZF9tb2RlLCBzaXplX2luX3B1cyk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemVfaW5fcHVzOyBqKyspIHsKKyAgICAgICAgICAgIHRhYl9tdmZbKHlfcHUgKyBqKSAqIG1pbl9wdV93aWR0aCArIHhfcHUgKyBpXS5wcmVkX2ZsYWcgPSBQRl9JTlRSQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBpbnRyYV9wcmVkX21vZGU7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgc2V0X2N0X2RlcHRoKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2NiX3NpemUsIGludCBjdF9kZXB0aCkKK3sKKyAgICBpbnQgbGVuZ3RoID0gKDEgPDwgbG9nMl9jYl9zaXplKSA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX2NiX3NpemU7CisgICAgaW50IHhfY2IgICA9IHgwID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgeV9jYiAgID0geTAgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9jYl9zaXplOworICAgIGludCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGxlbmd0aDsgeSsrKQorICAgICAgICBtZW1zZXQoJnMtPnRhYl9jdF9kZXB0aFsoeV9jYiArIHkpICogcy0+cHMuc3BzLT5taW5fY2Jfd2lkdGggKyB4X2NiXSwKKyAgICAgICAgICAgICAgIGN0X2RlcHRoLCBsZW5ndGgpOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCB0YWJfbW9kZV9pZHhbXSA9IHsKKyAgICAgMCwgIDEsICAyLCAgMiwgIDIsICAyLCAgMywgIDUsICA3LCAgOCwgMTAsIDEyLCAxMywgMTUsIDE3LCAxOCwgMTksIDIwLAorICAgIDIxLCAyMiwgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI3LCAyNywgMjgsIDI4LCAyOSwgMjksIDMwLCAzMX07CisKK3N0YXRpYyB2b2lkIGludHJhX3ByZWRpY3Rpb25fdW5pdChIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfY2Jfc2l6ZSkKK3sKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBpbnRyYV9jaHJvbWFfdGFibGVbNF0gPSB7IDAsIDI2LCAxMCwgMSB9OworICAgIHVpbnQ4X3QgcHJldl9pbnRyYV9sdW1hX3ByZWRfZmxhZ1s0XTsKKyAgICBpbnQgc3BsaXQgICA9IGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF9OeE47CisgICAgaW50IHBiX3NpemUgPSAoMSA8PCBsb2cyX2NiX3NpemUpID4+IHNwbGl0OworICAgIGludCBzaWRlICAgID0gc3BsaXQgKyAxOworICAgIGludCBjaHJvbWFfbW9kZTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaWRlOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaWRlOyBqKyspCisgICAgICAgICAgICBwcmV2X2ludHJhX2x1bWFfcHJlZF9mbGFnWzIgKiBpICsgal0gPSBmZl9oZXZjX3ByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdfZGVjb2RlKHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpZGU7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2lkZTsgaisrKSB7CisgICAgICAgICAgICBpZiAocHJldl9pbnRyYV9sdW1hX3ByZWRfZmxhZ1syICogaSArIGpdKQorICAgICAgICAgICAgICAgIGxjLT5wdS5tcG1faWR4ID0gZmZfaGV2Y19tcG1faWR4X2RlY29kZShzKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYy0+cHUucmVtX2ludHJhX2x1bWFfcHJlZF9tb2RlID0gZmZfaGV2Y19yZW1faW50cmFfbHVtYV9wcmVkX21vZGVfZGVjb2RlKHMpOworCisgICAgICAgICAgICBsYy0+cHUuaW50cmFfcHJlZF9tb2RlWzIgKiBpICsgal0gPQorICAgICAgICAgICAgICAgIGx1bWFfaW50cmFfcHJlZF9tb2RlKHMsIHgwICsgcGJfc2l6ZSAqIGosIHkwICsgcGJfc2l6ZSAqIGksIHBiX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9pbnRyYV9sdW1hX3ByZWRfZmxhZ1syICogaSArIGpdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjID09IDMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpZGU7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpZGU7IGorKykgeworICAgICAgICAgICAgICAgIGxjLT5wdS5jaHJvbWFfbW9kZV9jWzIgKiBpICsgal0gPSBjaHJvbWFfbW9kZSA9IGZmX2hldmNfaW50cmFfY2hyb21hX3ByZWRfbW9kZV9kZWNvZGUocyk7CisgICAgICAgICAgICAgICAgaWYgKGNocm9tYV9tb2RlICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbMiAqIGkgKyBqXSA9PSBpbnRyYV9jaHJvbWFfdGFibGVbY2hyb21hX21vZGVdKQorICAgICAgICAgICAgICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzIgKiBpICsgal0gPSAzNDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzIgKiBpICsgal0gPSBpbnRyYV9jaHJvbWFfdGFibGVbY2hyb21hX21vZGVdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1syICogaSArIGpdID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZVsyICogaSArIGpdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyKSB7CisgICAgICAgIGludCBtb2RlX2lkeDsKKyAgICAgICAgbGMtPnB1LmNocm9tYV9tb2RlX2NbMF0gPSBjaHJvbWFfbW9kZSA9IGZmX2hldmNfaW50cmFfY2hyb21hX3ByZWRfbW9kZV9kZWNvZGUocyk7CisgICAgICAgIGlmIChjaHJvbWFfbW9kZSAhPSA0KSB7CisgICAgICAgICAgICBpZiAobGMtPnB1LmludHJhX3ByZWRfbW9kZVswXSA9PSBpbnRyYV9jaHJvbWFfdGFibGVbY2hyb21hX21vZGVdKQorICAgICAgICAgICAgICAgIG1vZGVfaWR4ID0gMzQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbW9kZV9pZHggPSBpbnRyYV9jaHJvbWFfdGFibGVbY2hyb21hX21vZGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbW9kZV9pZHggPSBsYy0+cHUuaW50cmFfcHJlZF9tb2RlWzBdOworICAgICAgICB9CisgICAgICAgIGxjLT5wdS5pbnRyYV9wcmVkX21vZGVfY1swXSA9IHRhYl9tb2RlX2lkeFttb2RlX2lkeF07CisgICAgfSBlbHNlIGlmIChzLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjICE9IDApIHsKKyAgICAgICAgY2hyb21hX21vZGUgPSBmZl9oZXZjX2ludHJhX2Nocm9tYV9wcmVkX21vZGVfZGVjb2RlKHMpOworICAgICAgICBpZiAoY2hyb21hX21vZGUgIT0gNCkgeworICAgICAgICAgICAgaWYgKGxjLT5wdS5pbnRyYV9wcmVkX21vZGVbMF0gPT0gaW50cmFfY2hyb21hX3RhYmxlW2Nocm9tYV9tb2RlXSkKKyAgICAgICAgICAgICAgICBsYy0+cHUuaW50cmFfcHJlZF9tb2RlX2NbMF0gPSAzNDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYy0+cHUuaW50cmFfcHJlZF9tb2RlX2NbMF0gPSBpbnRyYV9jaHJvbWFfdGFibGVbY2hyb21hX21vZGVdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZV9jWzBdID0gbGMtPnB1LmludHJhX3ByZWRfbW9kZVswXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaW50cmFfcHJlZGljdGlvbl91bml0X2RlZmF1bHRfdmFsdWUoSEVWQ0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2NiX3NpemUpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgaW50IHBiX3NpemUgICAgICAgICAgPSAxIDw8IGxvZzJfY2Jfc2l6ZTsKKyAgICBpbnQgc2l6ZV9pbl9wdXMgICAgICA9IHBiX3NpemUgPj4gcy0+cHMuc3BzLT5sb2cyX21pbl9wdV9zaXplOworICAgIGludCBtaW5fcHVfd2lkdGggICAgID0gcy0+cHMuc3BzLT5taW5fcHVfd2lkdGg7CisgICAgTXZGaWVsZCAqdGFiX212ZiAgICAgPSBzLT5yZWYtPnRhYl9tdmY7CisgICAgaW50IHhfcHUgICAgICAgICAgICAgPSB4MCA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX3B1X3NpemU7CisgICAgaW50IHlfcHUgICAgICAgICAgICAgPSB5MCA+PiBzLT5wcy5zcHMtPmxvZzJfbWluX3B1X3NpemU7CisgICAgaW50IGosIGs7CisKKyAgICBpZiAoc2l6ZV9pbl9wdXMgPT0gMCkKKyAgICAgICAgc2l6ZV9pbl9wdXMgPSAxOworICAgIGZvciAoaiA9IDA7IGogPCBzaXplX2luX3B1czsgaisrKQorICAgICAgICBtZW1zZXQoJnMtPnRhYl9pcG1bKHlfcHUgKyBqKSAqIG1pbl9wdV93aWR0aCArIHhfcHVdLCBJTlRSQV9EQywgc2l6ZV9pbl9wdXMpOworICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlID09IE1PREVfSU5UUkEpCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplX2luX3B1czsgaisrKQorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNpemVfaW5fcHVzOyBrKyspCisgICAgICAgICAgICAgICAgdGFiX212ZlsoeV9wdSArIGopICogbWluX3B1X3dpZHRoICsgeF9wdSArIGtdLnByZWRfZmxhZyA9IFBGX0lOVFJBOworfQorCitzdGF0aWMgaW50IGhsc19jb2RpbmdfdW5pdChIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBsb2cyX2NiX3NpemUpCit7CisgICAgaW50IGNiX3NpemUgICAgICAgICAgPSAxIDw8IGxvZzJfY2Jfc2l6ZTsKKyAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsYzsKKyAgICBpbnQgbG9nMl9taW5fY2Jfc2l6ZSA9IHMtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgbGVuZ3RoICAgICAgICAgICA9IGNiX3NpemUgPj4gbG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgbWluX2NiX3dpZHRoICAgICA9IHMtPnBzLnNwcy0+bWluX2NiX3dpZHRoOworICAgIGludCB4X2NiICAgICAgICAgICAgID0geDAgPj4gbG9nMl9taW5fY2Jfc2l6ZTsKKyAgICBpbnQgeV9jYiAgICAgICAgICAgICA9IHkwID4+IGxvZzJfbWluX2NiX3NpemU7CisgICAgaW50IGlkeCAgICAgICAgICAgICAgPSBsb2cyX2NiX3NpemUgLSAyOworICAgIGludCBxcF9ibG9ja19tYXNrICAgID0gKDE8PChzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUgLSBzLT5wcy5wcHMtPmRpZmZfY3VfcXBfZGVsdGFfZGVwdGgpKSAtIDE7CisgICAgaW50IHgsIHksIHJldDsKKworICAgIGxjLT5jdS54ICAgICAgICAgICAgICAgID0geDA7CisgICAgbGMtPmN1LnkgICAgICAgICAgICAgICAgPSB5MDsKKyAgICBsYy0+Y3UucHJlZF9tb2RlICAgICAgICA9IE1PREVfSU5UUkE7CisgICAgbGMtPmN1LnBhcnRfbW9kZSAgICAgICAgPSBQQVJUXzJOeDJOOworICAgIGxjLT5jdS5pbnRyYV9zcGxpdF9mbGFnID0gMDsKKworICAgIFNBTVBMRV9DVEIocy0+c2tpcF9mbGFnLCB4X2NiLCB5X2NiKSA9IDA7CisgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgbGMtPnB1LmludHJhX3ByZWRfbW9kZVt4XSA9IDE7CisgICAgaWYgKHMtPnBzLnBwcy0+dHJhbnNxdWFudF9ieXBhc3NfZW5hYmxlX2ZsYWcpIHsKKyAgICAgICAgbGMtPmN1LmN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcgPSBmZl9oZXZjX2N1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWdfZGVjb2RlKHMpOworICAgICAgICBpZiAobGMtPmN1LmN1X3RyYW5zcXVhbnRfYnlwYXNzX2ZsYWcpCisgICAgICAgICAgICBzZXRfZGVibG9ja2luZ19ieXBhc3MocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOworICAgIH0gZWxzZQorICAgICAgICBsYy0+Y3UuY3VfdHJhbnNxdWFudF9ieXBhc3NfZmxhZyA9IDA7CisKKyAgICBpZiAocy0+c2guc2xpY2VfdHlwZSAhPSBIRVZDX1NMSUNFX0kpIHsKKyAgICAgICAgdWludDhfdCBza2lwX2ZsYWcgPSBmZl9oZXZjX3NraXBfZmxhZ19kZWNvZGUocywgeDAsIHkwLCB4X2NiLCB5X2NiKTsKKworICAgICAgICB4ID0geV9jYiAqIG1pbl9jYl93aWR0aCArIHhfY2I7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBsZW5ndGg7IHkrKykgeworICAgICAgICAgICAgbWVtc2V0KCZzLT5za2lwX2ZsYWdbeF0sIHNraXBfZmxhZywgbGVuZ3RoKTsKKyAgICAgICAgICAgIHggKz0gbWluX2NiX3dpZHRoOworICAgICAgICB9CisgICAgICAgIGxjLT5jdS5wcmVkX21vZGUgPSBza2lwX2ZsYWcgPyBNT0RFX1NLSVAgOiBNT0RFX0lOVEVSOworICAgIH0gZWxzZSB7CisgICAgICAgIHggPSB5X2NiICogbWluX2NiX3dpZHRoICsgeF9jYjsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGxlbmd0aDsgeSsrKSB7CisgICAgICAgICAgICBtZW1zZXQoJnMtPnNraXBfZmxhZ1t4XSwgMCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIHggKz0gbWluX2NiX3dpZHRoOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKFNBTVBMRV9DVEIocy0+c2tpcF9mbGFnLCB4X2NiLCB5X2NiKSkgeworICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCB5MCwgY2Jfc2l6ZSwgY2Jfc2l6ZSwgbG9nMl9jYl9zaXplLCAwLCBpZHgpOworICAgICAgICBpbnRyYV9wcmVkaWN0aW9uX3VuaXRfZGVmYXVsdF92YWx1ZShzLCB4MCwgeTAsIGxvZzJfY2Jfc2l6ZSk7CisKKyAgICAgICAgaWYgKCFzLT5zaC5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcpCisgICAgICAgICAgICBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcGNtX2ZsYWcgPSAwOworCisgICAgICAgIGlmIChzLT5zaC5zbGljZV90eXBlICE9IEhFVkNfU0xJQ0VfSSkKKyAgICAgICAgICAgIGxjLT5jdS5wcmVkX21vZGUgPSBmZl9oZXZjX3ByZWRfbW9kZV9kZWNvZGUocyk7CisgICAgICAgIGlmIChsYy0+Y3UucHJlZF9tb2RlICE9IE1PREVfSU5UUkEgfHwKKyAgICAgICAgICAgIGxvZzJfY2Jfc2l6ZSA9PSBzLT5wcy5zcHMtPmxvZzJfbWluX2NiX3NpemUpIHsKKyAgICAgICAgICAgIGxjLT5jdS5wYXJ0X21vZGUgICAgICAgID0gZmZfaGV2Y19wYXJ0X21vZGVfZGVjb2RlKHMsIGxvZzJfY2Jfc2l6ZSk7CisgICAgICAgICAgICBsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyA9IGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF9OeE4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMtPmN1LnByZWRfbW9kZSA9PSBNT0RFX0lOVFJBOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSkgeworICAgICAgICAgICAgaWYgKGxjLT5jdS5wYXJ0X21vZGUgPT0gUEFSVF8yTngyTiAmJiBzLT5wcy5zcHMtPnBjbV9lbmFibGVkX2ZsYWcgJiYKKyAgICAgICAgICAgICAgICBsb2cyX2NiX3NpemUgPj0gcy0+cHMuc3BzLT5wY20ubG9nMl9taW5fcGNtX2NiX3NpemUgJiYKKyAgICAgICAgICAgICAgICBsb2cyX2NiX3NpemUgPD0gcy0+cHMuc3BzLT5wY20ubG9nMl9tYXhfcGNtX2NiX3NpemUpIHsKKyAgICAgICAgICAgICAgICBwY21fZmxhZyA9IGZmX2hldmNfcGNtX2ZsYWdfZGVjb2RlKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBjbV9mbGFnKSB7CisgICAgICAgICAgICAgICAgaW50cmFfcHJlZGljdGlvbl91bml0X2RlZmF1bHRfdmFsdWUocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOworICAgICAgICAgICAgICAgIHJldCA9IGhsc19wY21fc2FtcGxlKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+cHMuc3BzLT5wY20ubG9vcF9maWx0ZXJfZGlzYWJsZV9mbGFnKQorICAgICAgICAgICAgICAgICAgICBzZXRfZGVibG9ja2luZ19ieXBhc3MocywgeDAsIHkwLCBsb2cyX2NiX3NpemUpOworCisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludHJhX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsIGxvZzJfY2Jfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRyYV9wcmVkaWN0aW9uX3VuaXRfZGVmYXVsdF92YWx1ZShzLCB4MCwgeTAsIGxvZzJfY2Jfc2l6ZSk7CisgICAgICAgICAgICBzd2l0Y2ggKGxjLT5jdS5wYXJ0X21vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgUEFSVF8yTngyTjoKKyAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCB5MCwgY2Jfc2l6ZSwgY2Jfc2l6ZSwgbG9nMl9jYl9zaXplLCAwLCBpZHgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQVJUXzJOeE46CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgY2Jfc2l6ZSwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4KTsKKyAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplLCBjYl9zaXplIC8gMiwgbG9nMl9jYl9zaXplLCAxLCBpZHgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQVJUX054Mk46CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCwgY2Jfc2l6ZSAvIDIsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCwgY2Jfc2l6ZSAvIDIsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBBUlRfMk54blU6CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgY2Jfc2l6ZSwgY2Jfc2l6ZSAgICAgLyA0LCBsb2cyX2NiX3NpemUsIDAsIGlkeCk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAgKyBjYl9zaXplIC8gNCwgY2Jfc2l6ZSwgY2Jfc2l6ZSAqIDMgLyA0LCBsb2cyX2NiX3NpemUsIDEsIGlkeCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFBBUlRfMk54bkQ6CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgeTAsICAgICAgICAgICAgICAgICAgIGNiX3NpemUsIGNiX3NpemUgKiAzIC8gNCwgbG9nMl9jYl9zaXplLCAwLCBpZHgpOworICAgICAgICAgICAgICAgIGhsc19wcmVkaWN0aW9uX3VuaXQocywgeDAsIHkwICsgY2Jfc2l6ZSAqIDMgLyA0LCBjYl9zaXplLCBjYl9zaXplICAgICAvIDQsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUEFSVF9uTHgyTjoKKyAgICAgICAgICAgICAgICBobHNfcHJlZGljdGlvbl91bml0KHMsIHgwLCAgICAgICAgICAgICAgIHkwLCBjYl9zaXplICAgICAvIDQsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMik7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyA0LCB5MCwgY2Jfc2l6ZSAqIDMgLyA0LCBjYl9zaXplLCBsb2cyX2NiX3NpemUsIDEsIGlkeCAtIDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQVJUX25SeDJOOgorICAgICAgICAgICAgICAgIGhsc19wcmVkaWN0aW9uX3VuaXQocywgeDAsICAgICAgICAgICAgICAgICAgIHkwLCBjYl9zaXplICogMyAvIDQsIGNiX3NpemUsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMik7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgKiAzIC8gNCwgeTAsIGNiX3NpemUgICAgIC8gNCwgY2Jfc2l6ZSwgbG9nMl9jYl9zaXplLCAxLCBpZHggLSAyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUEFSVF9OeE46CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCwgICAgICAgICAgICAgICBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMCwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCwgICAgICAgICAgICAgICBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMSwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCwgICAgICAgICAgICAgICB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMiwgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgaGxzX3ByZWRpY3Rpb25fdW5pdChzLCB4MCArIGNiX3NpemUgLyAyLCB5MCArIGNiX3NpemUgLyAyLCBjYl9zaXplIC8gMiwgY2Jfc2l6ZSAvIDIsIGxvZzJfY2Jfc2l6ZSwgMywgaWR4IC0gMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBjbV9mbGFnKSB7CisgICAgICAgICAgICBpbnQgcnF0X3Jvb3RfY2JmID0gMTsKKworICAgICAgICAgICAgaWYgKGxjLT5jdS5wcmVkX21vZGUgIT0gTU9ERV9JTlRSQSAmJgorICAgICAgICAgICAgICAgICEobGMtPmN1LnBhcnRfbW9kZSA9PSBQQVJUXzJOeDJOICYmIGxjLT5wdS5tZXJnZV9mbGFnKSkgeworICAgICAgICAgICAgICAgIHJxdF9yb290X2NiZiA9IGZmX2hldmNfbm9fcmVzaWR1YWxfc3ludGF4X2ZsYWdfZGVjb2RlKHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJxdF9yb290X2NiZikgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBpbnQgY2JmWzJdID0geyAwIH07CisgICAgICAgICAgICAgICAgbGMtPmN1Lm1heF90cmFmb19kZXB0aCA9IGxjLT5jdS5wcmVkX21vZGUgPT0gTU9ERV9JTlRSQSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBzLnNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEgKyBsYy0+Y3UuaW50cmFfc3BsaXRfZmxhZyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBzLnNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXI7CisgICAgICAgICAgICAgICAgcmV0ID0gaGxzX3RyYW5zZm9ybV90cmVlKHMsIHgwLCB5MCwgeDAsIHkwLCB4MCwgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzJfY2Jfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMl9jYl9zaXplLCAwLCAwLCBjYmYsIGNiZik7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghcy0+c2guZGlzYWJsZV9kZWJsb2NraW5nX2ZpbHRlcl9mbGFnKQorICAgICAgICAgICAgICAgICAgICBmZl9oZXZjX2RlYmxvY2tpbmdfYm91bmRhcnlfc3RyZW5ndGhzKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5wcy5wcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZyAmJiBsYy0+dHUuaXNfY3VfcXBfZGVsdGFfY29kZWQgPT0gMCkKKyAgICAgICAgZmZfaGV2Y19zZXRfcVB5KHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKworICAgIHggPSB5X2NiICogbWluX2NiX3dpZHRoICsgeF9jYjsKKyAgICBmb3IgKHkgPSAwOyB5IDwgbGVuZ3RoOyB5KyspIHsKKyAgICAgICAgbWVtc2V0KCZzLT5xcF95X3RhYlt4XSwgbGMtPnFwX3ksIGxlbmd0aCk7CisgICAgICAgIHggKz0gbWluX2NiX3dpZHRoOworICAgIH0KKworICAgIGlmKCgoeDAgKyAoMTw8bG9nMl9jYl9zaXplKSkgJiBxcF9ibG9ja19tYXNrKSA9PSAwICYmCisgICAgICAgKCh5MCArICgxPDxsb2cyX2NiX3NpemUpKSAmIHFwX2Jsb2NrX21hc2spID09IDApIHsKKyAgICAgICAgbGMtPnFQeV9wcmVkID0gbGMtPnFwX3k7CisgICAgfQorCisgICAgc2V0X2N0X2RlcHRoKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplLCBsYy0+Y3RfZGVwdGgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGxzX2NvZGluZ19xdWFkdHJlZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfY2Jfc2l6ZSwgaW50IGNiX2RlcHRoKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGNvbnN0IGludCBjYl9zaXplICAgID0gMSA8PCBsb2cyX2NiX3NpemU7CisgICAgaW50IHJldDsKKyAgICBpbnQgc3BsaXRfY3U7CisKKyAgICBsYy0+Y3RfZGVwdGggPSBjYl9kZXB0aDsKKyAgICBpZiAoeDAgKyBjYl9zaXplIDw9IHMtPnBzLnNwcy0+d2lkdGggICYmCisgICAgICAgIHkwICsgY2Jfc2l6ZSA8PSBzLT5wcy5zcHMtPmhlaWdodCAmJgorICAgICAgICBsb2cyX2NiX3NpemUgPiBzLT5wcy5zcHMtPmxvZzJfbWluX2NiX3NpemUpIHsKKyAgICAgICAgc3BsaXRfY3UgPSBmZl9oZXZjX3NwbGl0X2NvZGluZ191bml0X2ZsYWdfZGVjb2RlKHMsIGNiX2RlcHRoLCB4MCwgeTApOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwbGl0X2N1ID0gKGxvZzJfY2Jfc2l6ZSA+IHMtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZSk7CisgICAgfQorICAgIGlmIChzLT5wcy5wcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZyAmJgorICAgICAgICBsb2cyX2NiX3NpemUgPj0gcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplIC0gcy0+cHMucHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoKSB7CisgICAgICAgIGxjLT50dS5pc19jdV9xcF9kZWx0YV9jb2RlZCA9IDA7CisgICAgICAgIGxjLT50dS5jdV9xcF9kZWx0YSAgICAgICAgICA9IDA7CisgICAgfQorCisgICAgaWYgKHMtPnNoLmN1X2Nocm9tYV9xcF9vZmZzZXRfZW5hYmxlZF9mbGFnICYmCisgICAgICAgIGxvZzJfY2Jfc2l6ZSA+PSBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUgLSBzLT5wcy5wcHMtPmRpZmZfY3VfY2hyb21hX3FwX29mZnNldF9kZXB0aCkgeworICAgICAgICBsYy0+dHUuaXNfY3VfY2hyb21hX3FwX29mZnNldF9jb2RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKHNwbGl0X2N1KSB7CisgICAgICAgIGludCBxcF9ibG9ja19tYXNrID0gKDE8PChzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUgLSBzLT5wcy5wcHMtPmRpZmZfY3VfcXBfZGVsdGFfZGVwdGgpKSAtIDE7CisgICAgICAgIGNvbnN0IGludCBjYl9zaXplX3NwbGl0ID0gY2Jfc2l6ZSA+PiAxOworICAgICAgICBjb25zdCBpbnQgeDEgPSB4MCArIGNiX3NpemVfc3BsaXQ7CisgICAgICAgIGNvbnN0IGludCB5MSA9IHkwICsgY2Jfc2l6ZV9zcGxpdDsKKworICAgICAgICBpbnQgbW9yZV9kYXRhID0gMDsKKworICAgICAgICBtb3JlX2RhdGEgPSBobHNfY29kaW5nX3F1YWR0cmVlKHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplIC0gMSwgY2JfZGVwdGggKyAxKTsKKyAgICAgICAgaWYgKG1vcmVfZGF0YSA8IDApCisgICAgICAgICAgICByZXR1cm4gbW9yZV9kYXRhOworCisgICAgICAgIGlmIChtb3JlX2RhdGEgJiYgeDEgPCBzLT5wcy5zcHMtPndpZHRoKSB7CisgICAgICAgICAgICBtb3JlX2RhdGEgPSBobHNfY29kaW5nX3F1YWR0cmVlKHMsIHgxLCB5MCwgbG9nMl9jYl9zaXplIC0gMSwgY2JfZGVwdGggKyAxKTsKKyAgICAgICAgICAgIGlmIChtb3JlX2RhdGEgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBtb3JlX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vcmVfZGF0YSAmJiB5MSA8IHMtPnBzLnNwcy0+aGVpZ2h0KSB7CisgICAgICAgICAgICBtb3JlX2RhdGEgPSBobHNfY29kaW5nX3F1YWR0cmVlKHMsIHgwLCB5MSwgbG9nMl9jYl9zaXplIC0gMSwgY2JfZGVwdGggKyAxKTsKKyAgICAgICAgICAgIGlmIChtb3JlX2RhdGEgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBtb3JlX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vcmVfZGF0YSAmJiB4MSA8IHMtPnBzLnNwcy0+d2lkdGggJiYKKyAgICAgICAgICAgIHkxIDwgcy0+cHMuc3BzLT5oZWlnaHQpIHsKKyAgICAgICAgICAgIG1vcmVfZGF0YSA9IGhsc19jb2RpbmdfcXVhZHRyZWUocywgeDEsIHkxLCBsb2cyX2NiX3NpemUgLSAxLCBjYl9kZXB0aCArIDEpOworICAgICAgICAgICAgaWYgKG1vcmVfZGF0YSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vcmVfZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCgoeDAgKyAoMTw8bG9nMl9jYl9zaXplKSkgJiBxcF9ibG9ja19tYXNrKSA9PSAwICYmCisgICAgICAgICAgICAoKHkwICsgKDE8PGxvZzJfY2Jfc2l6ZSkpICYgcXBfYmxvY2tfbWFzaykgPT0gMCkKKyAgICAgICAgICAgIGxjLT5xUHlfcHJlZCA9IGxjLT5xcF95OworCisgICAgICAgIGlmIChtb3JlX2RhdGEpCisgICAgICAgICAgICByZXR1cm4gKCh4MSArIGNiX3NpemVfc3BsaXQpIDwgcy0+cHMuc3BzLT53aWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAoeTEgKyBjYl9zaXplX3NwbGl0KSA8IHMtPnBzLnNwcy0+aGVpZ2h0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gaGxzX2NvZGluZ191bml0KHMsIHgwLCB5MCwgbG9nMl9jYl9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKCEoKHgwICsgY2Jfc2l6ZSkgJQorICAgICAgICAgICAgICAgKDEgPDwgKHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSkpKSB8fAorICAgICAgICAgICAgICh4MCArIGNiX3NpemUgPj0gcy0+cHMuc3BzLT53aWR0aCkpICYmCisgICAgICAgICAgICAoISgoeTAgKyBjYl9zaXplKSAlCisgICAgICAgICAgICAgICAoMSA8PCAocy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKSkpIHx8CisgICAgICAgICAgICAgKHkwICsgY2Jfc2l6ZSA+PSBzLT5wcy5zcHMtPmhlaWdodCkpKSB7CisgICAgICAgICAgICBpbnQgZW5kX29mX3NsaWNlX2ZsYWcgPSBmZl9oZXZjX2VuZF9vZl9zbGljZV9mbGFnX2RlY29kZShzKTsKKyAgICAgICAgICAgIHJldHVybiAhZW5kX29mX3NsaWNlX2ZsYWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBobHNfZGVjb2RlX25laWdoYm91cihIRVZDQ29udGV4dCAqcywgaW50IHhfY3RiLCBpbnQgeV9jdGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3RiX2FkZHJfdHMpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgID0gcy0+SEVWQ2xjOworICAgIGludCBjdGJfc2l6ZSAgICAgICAgICA9IDEgPDwgcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplOworICAgIGludCBjdGJfYWRkcl9ycyAgICAgICA9IHMtPnBzLnBwcy0+Y3RiX2FkZHJfdHNfdG9fcnNbY3RiX2FkZHJfdHNdOworICAgIGludCBjdGJfYWRkcl9pbl9zbGljZSA9IGN0Yl9hZGRyX3JzIC0gcy0+c2guc2xpY2VfYWRkcjsKKworICAgIHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzXSA9IHMtPnNoLnNsaWNlX2FkZHI7CisKKyAgICBpZiAocy0+cHMucHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZykgeworICAgICAgICBpZiAoeF9jdGIgPT0gMCAmJiAoeV9jdGIgJiAoY3RiX3NpemUgLSAxKSkgPT0gMCkKKyAgICAgICAgICAgIGxjLT5maXJzdF9xcF9ncm91cCA9IDE7CisgICAgICAgIGxjLT5lbmRfb2ZfdGlsZXNfeCA9IHMtPnBzLnNwcy0+d2lkdGg7CisgICAgfSBlbHNlIGlmIChzLT5wcy5wcHMtPnRpbGVzX2VuYWJsZWRfZmxhZykgeworICAgICAgICBpZiAoY3RiX2FkZHJfdHMgJiYgcy0+cHMucHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcy5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHMgLSAxXSkgeworICAgICAgICAgICAgaW50IGlkeFggPSBzLT5wcy5wcHMtPmNvbF9pZHhYW3hfY3RiID4+IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZV07CisgICAgICAgICAgICBsYy0+ZW5kX29mX3RpbGVzX3ggICA9IHhfY3RiICsgKHMtPnBzLnBwcy0+Y29sdW1uX3dpZHRoW2lkeFhdIDw8IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSk7CisgICAgICAgICAgICBsYy0+Zmlyc3RfcXBfZ3JvdXAgICA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBsYy0+ZW5kX29mX3RpbGVzX3ggPSBzLT5wcy5zcHMtPndpZHRoOworICAgIH0KKworICAgIGxjLT5lbmRfb2ZfdGlsZXNfeSA9IEZGTUlOKHlfY3RiICsgY3RiX3NpemUsIHMtPnBzLnNwcy0+aGVpZ2h0KTsKKworICAgIGxjLT5ib3VuZGFyeV9mbGFncyA9IDA7CisgICAgaWYgKHMtPnBzLnBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIGlmICh4X2N0YiA+IDAgJiYgcy0+cHMucHBzLT50aWxlX2lkW2N0Yl9hZGRyX3RzXSAhPSBzLT5wcy5wcHMtPnRpbGVfaWRbcy0+cHMucHBzLT5jdGJfYWRkcl9yc190b190c1tjdGJfYWRkcl9ycyAtIDFdXSkKKyAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9MRUZUX1RJTEU7CisgICAgICAgIGlmICh4X2N0YiA+IDAgJiYgcy0+dGFiX3NsaWNlX2FkZHJlc3NbY3RiX2FkZHJfcnNdICE9IHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzIC0gMV0pCisgICAgICAgICAgICBsYy0+Ym91bmRhcnlfZmxhZ3MgfD0gQk9VTkRBUllfTEVGVF9TTElDRTsKKyAgICAgICAgaWYgKHlfY3RiID4gMCAmJiBzLT5wcy5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHNdICE9IHMtPnBzLnBwcy0+dGlsZV9pZFtzLT5wcy5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW2N0Yl9hZGRyX3JzIC0gcy0+cHMuc3BzLT5jdGJfd2lkdGhdXSkKKyAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9VUFBFUl9USUxFOworICAgICAgICBpZiAoeV9jdGIgPiAwICYmIHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzXSAhPSBzLT50YWJfc2xpY2VfYWRkcmVzc1tjdGJfYWRkcl9ycyAtIHMtPnBzLnNwcy0+Y3RiX3dpZHRoXSkKKyAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9VUFBFUl9TTElDRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY3RiX2FkZHJfaW5fc2xpY2UgPD0gMCkKKyAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9MRUZUX1NMSUNFOworICAgICAgICBpZiAoY3RiX2FkZHJfaW5fc2xpY2UgPCBzLT5wcy5zcHMtPmN0Yl93aWR0aCkKKyAgICAgICAgICAgIGxjLT5ib3VuZGFyeV9mbGFncyB8PSBCT1VOREFSWV9VUFBFUl9TTElDRTsKKyAgICB9CisKKyAgICBsYy0+Y3RiX2xlZnRfZmxhZyA9ICgoeF9jdGIgPiAwKSAmJiAoY3RiX2FkZHJfaW5fc2xpY2UgPiAwKSAmJiAhKGxjLT5ib3VuZGFyeV9mbGFncyAmIEJPVU5EQVJZX0xFRlRfVElMRSkpOworICAgIGxjLT5jdGJfdXBfZmxhZyAgID0gKCh5X2N0YiA+IDApICYmIChjdGJfYWRkcl9pbl9zbGljZSA+PSBzLT5wcy5zcHMtPmN0Yl93aWR0aCkgJiYgIShsYy0+Ym91bmRhcnlfZmxhZ3MgJiBCT1VOREFSWV9VUFBFUl9USUxFKSk7CisgICAgbGMtPmN0Yl91cF9yaWdodF9mbGFnID0gKCh5X2N0YiA+IDApICAmJiAoY3RiX2FkZHJfaW5fc2xpY2UrMSA+PSBzLT5wcy5zcHMtPmN0Yl93aWR0aCkgJiYgKHMtPnBzLnBwcy0+dGlsZV9pZFtjdGJfYWRkcl90c10gPT0gcy0+cHMucHBzLT50aWxlX2lkW3MtPnBzLnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnMrMSAtIHMtPnBzLnNwcy0+Y3RiX3dpZHRoXV0pKTsKKyAgICBsYy0+Y3RiX3VwX2xlZnRfZmxhZyA9ICgoeF9jdGIgPiAwKSAmJiAoeV9jdGIgPiAwKSAgJiYgKGN0Yl9hZGRyX2luX3NsaWNlLTEgPj0gcy0+cHMuc3BzLT5jdGJfd2lkdGgpICYmIChzLT5wcy5wcHMtPnRpbGVfaWRbY3RiX2FkZHJfdHNdID09IHMtPnBzLnBwcy0+dGlsZV9pZFtzLT5wcy5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW2N0Yl9hZGRyX3JzLTEgLSBzLT5wcy5zcHMtPmN0Yl93aWR0aF1dKSk7Cit9CisKK3N0YXRpYyBpbnQgaGxzX2RlY29kZV9lbnRyeShBVkNvZGVjQ29udGV4dCAqYXZjdHh0LCB2b2lkICppc0ZpbHRlclRocmVhZCkKK3sKKyAgICBIRVZDQ29udGV4dCAqcyAgPSBhdmN0eHQtPnByaXZfZGF0YTsKKyAgICBpbnQgY3RiX3NpemUgICAgPSAxIDw8IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZTsKKyAgICBpbnQgbW9yZV9kYXRhICAgPSAxOworICAgIGludCB4X2N0YiAgICAgICA9IDA7CisgICAgaW50IHlfY3RiICAgICAgID0gMDsKKyAgICBpbnQgY3RiX2FkZHJfdHMgPSBzLT5wcy5wcHMtPmN0Yl9hZGRyX3JzX3RvX3RzW3MtPnNoLnNsaWNlX2N0Yl9hZGRyX3JzXTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFjdGJfYWRkcl90cyAmJiBzLT5zaC5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW1wb3NzaWJsZSBpbml0aWFsIHRpbGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHMtPnNoLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcpIHsKKyAgICAgICAgaW50IHByZXZfcnMgPSBzLT5wcy5wcHMtPmN0Yl9hZGRyX3RzX3RvX3JzW2N0Yl9hZGRyX3RzIC0gMV07CisgICAgICAgIGlmIChzLT50YWJfc2xpY2VfYWRkcmVzc1twcmV2X3JzXSAhPSBzLT5zaC5zbGljZV9hZGRyKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlByZXZpb3VzIHNsaWNlIHNlZ21lbnQgbWlzc2luZ1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChtb3JlX2RhdGEgJiYgY3RiX2FkZHJfdHMgPCBzLT5wcy5zcHMtPmN0Yl9zaXplKSB7CisgICAgICAgIGludCBjdGJfYWRkcl9ycyA9IHMtPnBzLnBwcy0+Y3RiX2FkZHJfdHNfdG9fcnNbY3RiX2FkZHJfdHNdOworCisgICAgICAgIHhfY3RiID0gKGN0Yl9hZGRyX3JzICUgKChzLT5wcy5zcHMtPndpZHRoICsgY3RiX3NpemUgLSAxKSA+PiBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUpKSA8PCBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgICAgIHlfY3RiID0gKGN0Yl9hZGRyX3JzIC8gKChzLT5wcy5zcHMtPndpZHRoICsgY3RiX3NpemUgLSAxKSA+PiBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUpKSA8PCBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgICAgIGhsc19kZWNvZGVfbmVpZ2hib3VyKHMsIHhfY3RiLCB5X2N0YiwgY3RiX2FkZHJfdHMpOworCisgICAgICAgIHJldCA9IGZmX2hldmNfY2FiYWNfaW5pdChzLCBjdGJfYWRkcl90cyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBzLT50YWJfc2xpY2VfYWRkcmVzc1tjdGJfYWRkcl9yc10gPSAtMTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBobHNfc2FvX3BhcmFtKHMsIHhfY3RiID4+IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSwgeV9jdGIgPj4gcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplKTsKKworICAgICAgICBzLT5kZWJsb2NrW2N0Yl9hZGRyX3JzXS5iZXRhX29mZnNldCA9IHMtPnNoLmJldGFfb2Zmc2V0OworICAgICAgICBzLT5kZWJsb2NrW2N0Yl9hZGRyX3JzXS50Y19vZmZzZXQgICA9IHMtPnNoLnRjX29mZnNldDsKKyAgICAgICAgcy0+ZmlsdGVyX3NsaWNlX2VkZ2VzW2N0Yl9hZGRyX3JzXSAgPSBzLT5zaC5zbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZzsKKworICAgICAgICBtb3JlX2RhdGEgPSBobHNfY29kaW5nX3F1YWR0cmVlKHMsIHhfY3RiLCB5X2N0Yiwgcy0+cHMuc3BzLT5sb2cyX2N0Yl9zaXplLCAwKTsKKyAgICAgICAgaWYgKG1vcmVfZGF0YSA8IDApIHsKKyAgICAgICAgICAgIHMtPnRhYl9zbGljZV9hZGRyZXNzW2N0Yl9hZGRyX3JzXSA9IC0xOworICAgICAgICAgICAgcmV0dXJuIG1vcmVfZGF0YTsKKyAgICAgICAgfQorCisKKyAgICAgICAgY3RiX2FkZHJfdHMrKzsKKyAgICAgICAgZmZfaGV2Y19zYXZlX3N0YXRlcyhzLCBjdGJfYWRkcl90cyk7CisgICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcnMocywgeF9jdGIsIHlfY3RiLCBjdGJfc2l6ZSk7CisgICAgfQorCisgICAgaWYgKHhfY3RiICsgY3RiX3NpemUgPj0gcy0+cHMuc3BzLT53aWR0aCAmJgorICAgICAgICB5X2N0YiArIGN0Yl9zaXplID49IHMtPnBzLnNwcy0+aGVpZ2h0KQorICAgICAgICBmZl9oZXZjX2hsc19maWx0ZXIocywgeF9jdGIsIHlfY3RiLCBjdGJfc2l6ZSk7CisKKyAgICByZXR1cm4gY3RiX2FkZHJfdHM7Cit9CisKK3N0YXRpYyBpbnQgaGxzX3NsaWNlX2RhdGEoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgaW50IGFyZ1syXTsKKyAgICBpbnQgcmV0WzJdOworCisgICAgYXJnWzBdID0gMDsKKyAgICBhcmdbMV0gPSAxOworCisgICAgcy0+YXZjdHgtPmV4ZWN1dGUocy0+YXZjdHgsIGhsc19kZWNvZGVfZW50cnksIGFyZywgcmV0ICwgMSwgc2l6ZW9mKGludCkpOworICAgIHJldHVybiByZXRbMF07Cit9CitzdGF0aWMgaW50IGhsc19kZWNvZGVfZW50cnlfd3BwKEFWQ29kZWNDb250ZXh0ICphdmN0eHQsIHZvaWQgKmlucHV0X2N0Yl9yb3csIGludCBqb2IsIGludCBzZWxmX2lkKQoreworICAgIEhFVkNDb250ZXh0ICpzMSAgPSBhdmN0eHQtPnByaXZfZGF0YSwgKnM7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGM7CisgICAgaW50IGN0Yl9zaXplICAgID0gMTw8IHMxLT5wcy5zcHMtPmxvZzJfY3RiX3NpemU7CisgICAgaW50IG1vcmVfZGF0YSAgID0gMTsKKyAgICBpbnQgKmN0Yl9yb3dfcCAgICA9IGlucHV0X2N0Yl9yb3c7CisgICAgaW50IGN0Yl9yb3cgPSBjdGJfcm93X3Bbam9iXTsKKyAgICBpbnQgY3RiX2FkZHJfcnMgPSBzMS0+c2guc2xpY2VfY3RiX2FkZHJfcnMgKyBjdGJfcm93ICogKChzMS0+cHMuc3BzLT53aWR0aCArIGN0Yl9zaXplIC0gMSkgPj4gczEtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSk7CisgICAgaW50IGN0Yl9hZGRyX3RzID0gczEtPnBzLnBwcy0+Y3RiX2FkZHJfcnNfdG9fdHNbY3RiX2FkZHJfcnNdOworICAgIGludCB0aHJlYWQgPSBjdGJfcm93ICUgczEtPnRocmVhZHNfbnVtYmVyOworICAgIGludCByZXQ7CisKKyAgICBzID0gczEtPnNMaXN0W3NlbGZfaWRdOworICAgIGxjID0gcy0+SEVWQ2xjOworCisgICAgaWYoY3RiX3JvdykgeworICAgICAgICByZXQgPSBpbml0X2dldF9iaXRzOCgmbGMtPmdiLCBzLT5kYXRhICsgcy0+c2gub2Zmc2V0W2N0Yl9yb3cgLSAxXSwgcy0+c2guc2l6ZVtjdGJfcm93IC0gMV0pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIGZmX2luaXRfY2FiYWNfZGVjb2RlcigmbGMtPmNjLCBzLT5kYXRhICsgcy0+c2gub2Zmc2V0WyhjdGJfcm93KS0xXSwgcy0+c2guc2l6ZVtjdGJfcm93IC0gMV0pOworICAgIH0KKworICAgIHdoaWxlKG1vcmVfZGF0YSAmJiBjdGJfYWRkcl90cyA8IHMtPnBzLnNwcy0+Y3RiX3NpemUpIHsKKyAgICAgICAgaW50IHhfY3RiID0gKGN0Yl9hZGRyX3JzICUgcy0+cHMuc3BzLT5jdGJfd2lkdGgpIDw8IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZTsKKyAgICAgICAgaW50IHlfY3RiID0gKGN0Yl9hZGRyX3JzIC8gcy0+cHMuc3BzLT5jdGJfd2lkdGgpIDw8IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZTsKKworICAgICAgICBobHNfZGVjb2RlX25laWdoYm91cihzLCB4X2N0YiwgeV9jdGIsIGN0Yl9hZGRyX3RzKTsKKworICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MyKHMtPmF2Y3R4LCBjdGJfcm93LCB0aHJlYWQsIFNISUZUX0NUQl9XUFApOworCisgICAgICAgIGlmIChhdG9taWNfbG9hZCgmczEtPndwcF9lcnIpKSB7CisgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzMihzLT5hdmN0eCwgY3RiX3JvdyAsIHRocmVhZCwgU0hJRlRfQ1RCX1dQUCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGZmX2hldmNfY2FiYWNfaW5pdChzLCBjdGJfYWRkcl90cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgaGxzX3Nhb19wYXJhbShzLCB4X2N0YiA+PiBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUsIHlfY3RiID4+IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZSk7CisgICAgICAgIG1vcmVfZGF0YSA9IGhsc19jb2RpbmdfcXVhZHRyZWUocywgeF9jdGIsIHlfY3RiLCBzLT5wcy5zcHMtPmxvZzJfY3RiX3NpemUsIDApOworCisgICAgICAgIGlmIChtb3JlX2RhdGEgPCAwKSB7CisgICAgICAgICAgICByZXQgPSBtb3JlX2RhdGE7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgY3RiX2FkZHJfdHMrKzsKKworICAgICAgICBmZl9oZXZjX3NhdmVfc3RhdGVzKHMsIGN0Yl9hZGRyX3RzKTsKKyAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3csIHRocmVhZCwgMSk7CisgICAgICAgIGZmX2hldmNfaGxzX2ZpbHRlcnMocywgeF9jdGIsIHlfY3RiLCBjdGJfc2l6ZSk7CisKKyAgICAgICAgaWYgKCFtb3JlX2RhdGEgJiYgKHhfY3RiK2N0Yl9zaXplKSA8IHMtPnBzLnNwcy0+d2lkdGggJiYgY3RiX3JvdyAhPSBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cykgeworICAgICAgICAgICAgYXRvbWljX3N0b3JlKCZzMS0+d3BwX2VyciwgMSk7CisgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzMihzLT5hdmN0eCwgY3RiX3JvdyAsdGhyZWFkLCBTSElGVF9DVEJfV1BQKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCh4X2N0YitjdGJfc2l6ZSkgPj0gcy0+cHMuc3BzLT53aWR0aCAmJiAoeV9jdGIrY3RiX3NpemUpID49IHMtPnBzLnNwcy0+aGVpZ2h0ICkgeworICAgICAgICAgICAgZmZfaGV2Y19obHNfZmlsdGVyKHMsIHhfY3RiLCB5X2N0YiwgY3RiX3NpemUpOworICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3cgLCB0aHJlYWQsIFNISUZUX0NUQl9XUFApOworICAgICAgICAgICAgcmV0dXJuIGN0Yl9hZGRyX3RzOworICAgICAgICB9CisgICAgICAgIGN0Yl9hZGRyX3JzICAgICAgID0gcy0+cHMucHBzLT5jdGJfYWRkcl90c190b19yc1tjdGJfYWRkcl90c107CisgICAgICAgIHhfY3RiKz1jdGJfc2l6ZTsKKworICAgICAgICBpZih4X2N0YiA+PSBzLT5wcy5zcHMtPndpZHRoKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzMihzLT5hdmN0eCwgY3RiX3JvdyAsdGhyZWFkLCBTSElGVF9DVEJfV1BQKTsKKworICAgIHJldHVybiAwOworZXJyb3I6CisgICAgcy0+dGFiX3NsaWNlX2FkZHJlc3NbY3RiX2FkZHJfcnNdID0gLTE7CisgICAgYXRvbWljX3N0b3JlKCZzMS0+d3BwX2VyciwgMSk7CisgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzczIocy0+YXZjdHgsIGN0Yl9yb3cgLHRocmVhZCwgU0hJRlRfQ1RCX1dQUCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBobHNfc2xpY2VfZGF0YV93cHAoSEVWQ0NvbnRleHQgKnMsIGNvbnN0IEgyNjQ1TkFMICpuYWwpCit7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG5hbC0+ZGF0YTsKKyAgICBpbnQgbGVuZ3RoICAgICAgICAgID0gbmFsLT5zaXplOworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIGludCAqcmV0ID0gYXZfbWFsbG9jX2FycmF5KHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzICsgMSwgc2l6ZW9mKGludCkpOworICAgIGludCAqYXJnID0gYXZfbWFsbG9jX2FycmF5KHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzICsgMSwgc2l6ZW9mKGludCkpOworICAgIGludDY0X3Qgb2Zmc2V0OworICAgIGludDY0X3Qgc3RhcnRoZWFkZXIsIGNtcHQgPSAwOworICAgIGludCBpLCBqLCByZXMgPSAwOworCisgICAgaWYgKCFyZXQgfHwgIWFyZykgeworICAgICAgICBhdl9mcmVlKHJldCk7CisgICAgICAgIGF2X2ZyZWUoYXJnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAocy0+c2guc2xpY2VfY3RiX2FkZHJfcnMgKyBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyAqIHMtPnBzLnNwcy0+Y3RiX3dpZHRoID49IHMtPnBzLnNwcy0+Y3RiX3dpZHRoICogcy0+cHMuc3BzLT5jdGJfaGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiV1BQIGN0YiBhZGRyZXNzZXMgYXJlIHdyb25nICglZCAlZCAlZCAlZClcbiIsCisgICAgICAgICAgICBzLT5zaC5zbGljZV9jdGJfYWRkcl9ycywgcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMsCisgICAgICAgICAgICBzLT5wcy5zcHMtPmN0Yl93aWR0aCwgcy0+cHMuc3BzLT5jdGJfaGVpZ2h0CisgICAgICAgICk7CisgICAgICAgIHJlcyA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZmZfYWxsb2NfZW50cmllcyhzLT5hdmN0eCwgcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgKyAxKTsKKworICAgIGlmICghcy0+c0xpc3RbMV0pIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHMtPnRocmVhZHNfbnVtYmVyOyBpKyspIHsKKyAgICAgICAgICAgIHMtPnNMaXN0W2ldID0gYXZfbWFsbG9jKHNpemVvZihIRVZDQ29udGV4dCkpOworICAgICAgICAgICAgbWVtY3B5KHMtPnNMaXN0W2ldLCBzLCBzaXplb2YoSEVWQ0NvbnRleHQpKTsKKyAgICAgICAgICAgIHMtPkhFVkNsY0xpc3RbaV0gPSBhdl9tYWxsb2N6KHNpemVvZihIRVZDTG9jYWxDb250ZXh0KSk7CisgICAgICAgICAgICBzLT5zTGlzdFtpXS0+SEVWQ2xjID0gcy0+SEVWQ2xjTGlzdFtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9mZnNldCA9IChsYy0+Z2IuaW5kZXggPj4gMyk7CisKKyAgICBmb3IgKGogPSAwLCBjbXB0ID0gMCwgc3RhcnRoZWFkZXIgPSBvZmZzZXQgKyBzLT5zaC5lbnRyeV9wb2ludF9vZmZzZXRbMF07IGogPCBuYWwtPnNraXBwZWRfYnl0ZXM7IGorKykgeworICAgICAgICBpZiAobmFsLT5za2lwcGVkX2J5dGVzX3Bvc1tqXSA+PSBvZmZzZXQgJiYgbmFsLT5za2lwcGVkX2J5dGVzX3Bvc1tqXSA8IHN0YXJ0aGVhZGVyKSB7CisgICAgICAgICAgICBzdGFydGhlYWRlci0tOworICAgICAgICAgICAgY21wdCsrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8IHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzOyBpKyspIHsKKyAgICAgICAgb2Zmc2V0ICs9IChzLT5zaC5lbnRyeV9wb2ludF9vZmZzZXRbaSAtIDFdIC0gY21wdCk7CisgICAgICAgIGZvciAoaiA9IDAsIGNtcHQgPSAwLCBzdGFydGhlYWRlciA9IG9mZnNldAorICAgICAgICAgICAgICsgcy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0W2ldOyBqIDwgbmFsLT5za2lwcGVkX2J5dGVzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChuYWwtPnNraXBwZWRfYnl0ZXNfcG9zW2pdID49IG9mZnNldCAmJiBuYWwtPnNraXBwZWRfYnl0ZXNfcG9zW2pdIDwgc3RhcnRoZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBzdGFydGhlYWRlci0tOworICAgICAgICAgICAgICAgIGNtcHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzLT5zaC5zaXplW2kgLSAxXSA9IHMtPnNoLmVudHJ5X3BvaW50X29mZnNldFtpXSAtIGNtcHQ7CisgICAgICAgIHMtPnNoLm9mZnNldFtpIC0gMV0gPSBvZmZzZXQ7CisKKyAgICB9CisgICAgaWYgKHMtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzICE9IDApIHsKKyAgICAgICAgb2Zmc2V0ICs9IHMtPnNoLmVudHJ5X3BvaW50X29mZnNldFtzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyAtIDFdIC0gY21wdDsKKyAgICAgICAgaWYgKGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlbnRyeV9wb2ludF9vZmZzZXQgdGFibGUgaXMgY29ycnVwdGVkXG4iKTsKKyAgICAgICAgICAgIHJlcyA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIHMtPnNoLnNpemVbcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgLSAxXSA9IGxlbmd0aCAtIG9mZnNldDsKKyAgICAgICAgcy0+c2gub2Zmc2V0W3MtPnNoLm51bV9lbnRyeV9wb2ludF9vZmZzZXRzIC0gMV0gPSBvZmZzZXQ7CisKKyAgICB9CisgICAgcy0+ZGF0YSA9IGRhdGE7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcy0+dGhyZWFkc19udW1iZXI7IGkrKykgeworICAgICAgICBzLT5zTGlzdFtpXS0+SEVWQ2xjLT5maXJzdF9xcF9ncm91cCA9IDE7CisgICAgICAgIHMtPnNMaXN0W2ldLT5IRVZDbGMtPnFwX3kgPSBzLT5zTGlzdFswXS0+SEVWQ2xjLT5xcF95OworICAgICAgICBtZW1jcHkocy0+c0xpc3RbaV0sIHMsIHNpemVvZihIRVZDQ29udGV4dCkpOworICAgICAgICBzLT5zTGlzdFtpXS0+SEVWQ2xjID0gcy0+SEVWQ2xjTGlzdFtpXTsKKyAgICB9CisKKyAgICBhdG9taWNfc3RvcmUoJnMtPndwcF9lcnIsIDApOworICAgIGZmX3Jlc2V0X2VudHJpZXMocy0+YXZjdHgpOworCisgICAgZm9yIChpID0gMDsgaSA8PSBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0czsgaSsrKSB7CisgICAgICAgIGFyZ1tpXSA9IGk7CisgICAgICAgIHJldFtpXSA9IDA7CisgICAgfQorCisgICAgaWYgKHMtPnBzLnBwcy0+ZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcpCisgICAgICAgIHMtPmF2Y3R4LT5leGVjdXRlMihzLT5hdmN0eCwgaGxzX2RlY29kZV9lbnRyeV93cHAsIGFyZywgcmV0LCBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0cyArIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8PSBzLT5zaC5udW1fZW50cnlfcG9pbnRfb2Zmc2V0czsgaSsrKQorICAgICAgICByZXMgKz0gcmV0W2ldOworZXJyb3I6CisgICAgYXZfZnJlZShyZXQpOworICAgIGF2X2ZyZWUoYXJnKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHNldF9zaWRlX2RhdGEoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgQVZGcmFtZSAqb3V0ID0gcy0+cmVmLT5mcmFtZTsKKworICAgIGlmIChzLT5zZWkuZnJhbWVfcGFja2luZy5wcmVzZW50ICYmCisgICAgICAgIHMtPnNlaS5mcmFtZV9wYWNraW5nLmFycmFuZ2VtZW50X3R5cGUgPj0gMyAmJgorICAgICAgICBzLT5zZWkuZnJhbWVfcGFja2luZy5hcnJhbmdlbWVudF90eXBlIDw9IDUgJiYKKyAgICAgICAgcy0+c2VpLmZyYW1lX3BhY2tpbmcuY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID4gMCAmJgorICAgICAgICBzLT5zZWkuZnJhbWVfcGFja2luZy5jb250ZW50X2ludGVycHJldGF0aW9uX3R5cGUgPCAzKSB7CisgICAgICAgIEFWU3RlcmVvM0QgKnN0ZXJlbyA9IGF2X3N0ZXJlbzNkX2NyZWF0ZV9zaWRlX2RhdGEob3V0KTsKKyAgICAgICAgaWYgKCFzdGVyZW8pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHN3aXRjaCAocy0+c2VpLmZyYW1lX3BhY2tpbmcuYXJyYW5nZW1lbnRfdHlwZSkgeworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBpZiAocy0+c2VpLmZyYW1lX3BhY2tpbmcucXVpbmN1bnhfc3Vic2FtcGxpbmcpCisgICAgICAgICAgICAgICAgc3RlcmVvLT50eXBlID0gQVZfU1RFUkVPM0RfU0lERUJZU0lERV9RVUlOQ1VOWDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9TSURFQllTSURFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHN0ZXJlby0+dHlwZSA9IEFWX1NURVJFTzNEX1RPUEJPVFRPTTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBBVl9TVEVSRU8zRF9GUkFNRVNFUVVFTkNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+c2VpLmZyYW1lX3BhY2tpbmcuY29udGVudF9pbnRlcnByZXRhdGlvbl90eXBlID09IDIpCisgICAgICAgICAgICBzdGVyZW8tPmZsYWdzID0gQVZfU1RFUkVPM0RfRkxBR19JTlZFUlQ7CisKKyAgICAgICAgaWYgKHMtPnNlaS5mcmFtZV9wYWNraW5nLmFycmFuZ2VtZW50X3R5cGUgPT0gNSkgeworICAgICAgICAgICAgaWYgKHMtPnNlaS5mcmFtZV9wYWNraW5nLmN1cnJlbnRfZnJhbWVfaXNfZnJhbWUwX2ZsYWcpCisgICAgICAgICAgICAgICAgc3RlcmVvLT52aWV3ID0gQVZfU1RFUkVPM0RfVklFV19MRUZUOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHN0ZXJlby0+dmlldyA9IEFWX1NURVJFTzNEX1ZJRVdfUklHSFQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+c2VpLmRpc3BsYXlfb3JpZW50YXRpb24ucHJlc2VudCAmJgorICAgICAgICAocy0+c2VpLmRpc3BsYXlfb3JpZW50YXRpb24uYW50aWNsb2Nrd2lzZV9yb3RhdGlvbiB8fAorICAgICAgICAgcy0+c2VpLmRpc3BsYXlfb3JpZW50YXRpb24uaGZsaXAgfHwgcy0+c2VpLmRpc3BsYXlfb3JpZW50YXRpb24udmZsaXApKSB7CisgICAgICAgIGRvdWJsZSBhbmdsZSA9IHMtPnNlaS5kaXNwbGF5X29yaWVudGF0aW9uLmFudGljbG9ja3dpc2Vfcm90YXRpb24gKiAzNjAgLyAoZG91YmxlKSAoMSA8PCAxNik7CisgICAgICAgIEFWRnJhbWVTaWRlRGF0YSAqcm90YXRpb24gPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRlJBTUVfREFUQV9ESVNQTEFZTUFUUklYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MzJfdCkgKiA5KTsKKyAgICAgICAgaWYgKCFyb3RhdGlvbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgYXZfZGlzcGxheV9yb3RhdGlvbl9zZXQoKGludDMyX3QgKilyb3RhdGlvbi0+ZGF0YSwgYW5nbGUpOworICAgICAgICBhdl9kaXNwbGF5X21hdHJpeF9mbGlwKChpbnQzMl90ICopcm90YXRpb24tPmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2VpLmRpc3BsYXlfb3JpZW50YXRpb24uaGZsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2VpLmRpc3BsYXlfb3JpZW50YXRpb24udmZsaXApOworICAgIH0KKworICAgIC8vIERlY3JlbWVudCB0aGUgbWFzdGVyaW5nIGRpc3BsYXkgZmxhZyB3aGVuIElSQVAgZnJhbWUgaGFzIG5vX3Jhc2xfb3V0cHV0X2ZsYWc9MQorICAgIC8vIHNvIHRoZSBzaWRlIGRhdGEgcGVyc2lzdHMgZm9yIHRoZSBlbnRpcmUgY29kZWQgdmlkZW8gc2VxdWVuY2UuCisgICAgaWYgKHMtPnNlaS5tYXN0ZXJpbmdfZGlzcGxheS5wcmVzZW50ID4gMCAmJgorICAgICAgICBJU19JUkFQKHMpICYmIHMtPm5vX3Jhc2xfb3V0cHV0X2ZsYWcpIHsKKyAgICAgICAgcy0+c2VpLm1hc3RlcmluZ19kaXNwbGF5LnByZXNlbnQtLTsKKyAgICB9CisgICAgaWYgKHMtPnNlaS5tYXN0ZXJpbmdfZGlzcGxheS5wcmVzZW50KSB7CisgICAgICAgIC8vIEhFVkMgdXNlcyBhIGcsYixyIG9yZGVyaW5nLCB3aGljaCB3ZSBjb252ZXJ0IHRvIGEgbW9yZSBuYXR1cmFsIHIsZyxiCisgICAgICAgIGNvbnN0IGludCBtYXBwaW5nWzNdID0gezIsIDAsIDF9OworICAgICAgICBjb25zdCBpbnQgY2hyb21hX2RlbiA9IDUwMDAwOworICAgICAgICBjb25zdCBpbnQgbHVtYV9kZW4gPSAxMDAwMDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhICptZXRhZGF0YSA9CisgICAgICAgICAgICBhdl9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YV9jcmVhdGVfc2lkZV9kYXRhKG91dCk7CisgICAgICAgIGlmICghbWV0YWRhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBqID0gbWFwcGluZ1tpXTsKKyAgICAgICAgICAgIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1tpXVswXS5udW0gPSBzLT5zZWkubWFzdGVyaW5nX2Rpc3BsYXkuZGlzcGxheV9wcmltYXJpZXNbal1bMF07CisgICAgICAgICAgICBtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbaV1bMF0uZGVuID0gY2hyb21hX2RlbjsKKyAgICAgICAgICAgIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1tpXVsxXS5udW0gPSBzLT5zZWkubWFzdGVyaW5nX2Rpc3BsYXkuZGlzcGxheV9wcmltYXJpZXNbal1bMV07CisgICAgICAgICAgICBtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbaV1bMV0uZGVuID0gY2hyb21hX2RlbjsKKyAgICAgICAgfQorICAgICAgICBtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMF0ubnVtID0gcy0+c2VpLm1hc3RlcmluZ19kaXNwbGF5LndoaXRlX3BvaW50WzBdOworICAgICAgICBtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMF0uZGVuID0gY2hyb21hX2RlbjsKKyAgICAgICAgbWV0YWRhdGEtPndoaXRlX3BvaW50WzFdLm51bSA9IHMtPnNlaS5tYXN0ZXJpbmdfZGlzcGxheS53aGl0ZV9wb2ludFsxXTsKKyAgICAgICAgbWV0YWRhdGEtPndoaXRlX3BvaW50WzFdLmRlbiA9IGNocm9tYV9kZW47CisKKyAgICAgICAgbWV0YWRhdGEtPm1heF9sdW1pbmFuY2UubnVtID0gcy0+c2VpLm1hc3RlcmluZ19kaXNwbGF5Lm1heF9sdW1pbmFuY2U7CisgICAgICAgIG1ldGFkYXRhLT5tYXhfbHVtaW5hbmNlLmRlbiA9IGx1bWFfZGVuOworICAgICAgICBtZXRhZGF0YS0+bWluX2x1bWluYW5jZS5udW0gPSBzLT5zZWkubWFzdGVyaW5nX2Rpc3BsYXkubWluX2x1bWluYW5jZTsKKyAgICAgICAgbWV0YWRhdGEtPm1pbl9sdW1pbmFuY2UuZGVuID0gbHVtYV9kZW47CisgICAgICAgIG1ldGFkYXRhLT5oYXNfbHVtaW5hbmNlID0gMTsKKyAgICAgICAgbWV0YWRhdGEtPmhhc19wcmltYXJpZXMgPSAxOworCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTWFzdGVyaW5nIERpc3BsYXkgTWV0YWRhdGE6XG4iKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiciglNS40ZiwlNS40ZikgZyglNS40ZiwlNS40ZikgYiglNS40ZiAlNS40Zikgd3AoJTUuNGYsICU1LjRmKVxuIiwKKyAgICAgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMF1bMF0pLAorICAgICAgICAgICAgICAgYXZfcTJkKG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1swXVsxXSksCisgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzFdWzBdKSwKKyAgICAgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMV1bMV0pLAorICAgICAgICAgICAgICAgYXZfcTJkKG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1syXVswXSksCisgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzJdWzFdKSwKKyAgICAgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMF0pLCBhdl9xMmQobWV0YWRhdGEtPndoaXRlX3BvaW50WzFdKSk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIm1pbl9sdW1pbmFuY2U9JWYsIG1heF9sdW1pbmFuY2U9JWZcbiIsCisgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPm1pbl9sdW1pbmFuY2UpLCBhdl9xMmQobWV0YWRhdGEtPm1heF9sdW1pbmFuY2UpKTsKKyAgICB9CisgICAgLy8gRGVjcmVtZW50IHRoZSBtYXN0ZXJpbmcgZGlzcGxheSBmbGFnIHdoZW4gSVJBUCBmcmFtZSBoYXMgbm9fcmFzbF9vdXRwdXRfZmxhZz0xCisgICAgLy8gc28gdGhlIHNpZGUgZGF0YSBwZXJzaXN0cyBmb3IgdGhlIGVudGlyZSBjb2RlZCB2aWRlbyBzZXF1ZW5jZS4KKyAgICBpZiAocy0+c2VpLmNvbnRlbnRfbGlnaHQucHJlc2VudCA+IDAgJiYKKyAgICAgICAgSVNfSVJBUChzKSAmJiBzLT5ub19yYXNsX291dHB1dF9mbGFnKSB7CisgICAgICAgIHMtPnNlaS5jb250ZW50X2xpZ2h0LnByZXNlbnQtLTsKKyAgICB9CisgICAgaWYgKHMtPnNlaS5jb250ZW50X2xpZ2h0LnByZXNlbnQpIHsKKyAgICAgICAgQVZDb250ZW50TGlnaHRNZXRhZGF0YSAqbWV0YWRhdGEgPQorICAgICAgICAgICAgYXZfY29udGVudF9saWdodF9tZXRhZGF0YV9jcmVhdGVfc2lkZV9kYXRhKG91dCk7CisgICAgICAgIGlmICghbWV0YWRhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBtZXRhZGF0YS0+TWF4Q0xMICA9IHMtPnNlaS5jb250ZW50X2xpZ2h0Lm1heF9jb250ZW50X2xpZ2h0X2xldmVsOworICAgICAgICBtZXRhZGF0YS0+TWF4RkFMTCA9IHMtPnNlaS5jb250ZW50X2xpZ2h0Lm1heF9waWNfYXZlcmFnZV9saWdodF9sZXZlbDsKKworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkNvbnRlbnQgTGlnaHQgTGV2ZWwgTWV0YWRhdGE6XG4iKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNYXhDTEw9JWQsIE1heEZBTEw9JWRcbiIsCisgICAgICAgICAgICAgICBtZXRhZGF0YS0+TWF4Q0xMLCBtZXRhZGF0YS0+TWF4RkFMTCk7CisgICAgfQorCisgICAgaWYgKHMtPnNlaS5hNTNfY2FwdGlvbi5hNTNfY2FwdGlvbikgeworICAgICAgICBBVkZyYW1lU2lkZURhdGEqIHNkID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0ZSQU1FX0RBVEFfQTUzX0NDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zZWkuYTUzX2NhcHRpb24uYTUzX2NhcHRpb25fc2l6ZSk7CisgICAgICAgIGlmIChzZCkKKyAgICAgICAgICAgIG1lbWNweShzZC0+ZGF0YSwgcy0+c2VpLmE1M19jYXB0aW9uLmE1M19jYXB0aW9uLCBzLT5zZWkuYTUzX2NhcHRpb24uYTUzX2NhcHRpb25fc2l6ZSk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5zZWkuYTUzX2NhcHRpb24uYTUzX2NhcHRpb24pOworICAgICAgICBzLT5zZWkuYTUzX2NhcHRpb24uYTUzX2NhcHRpb25fc2l6ZSA9IDA7CisgICAgICAgIHMtPmF2Y3R4LT5wcm9wZXJ0aWVzIHw9IEZGX0NPREVDX1BST1BFUlRZX0NMT1NFRF9DQVBUSU9OUzsKKyAgICB9CisKKyAgICBpZiAocy0+c2VpLmFsdGVybmF0aXZlX3RyYW5zZmVyLnByZXNlbnQgJiYKKyAgICAgICAgYXZfY29sb3JfdHJhbnNmZXJfbmFtZShzLT5zZWkuYWx0ZXJuYXRpdmVfdHJhbnNmZXIucHJlZmVycmVkX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljcykgJiYKKyAgICAgICAgcy0+c2VpLmFsdGVybmF0aXZlX3RyYW5zZmVyLnByZWZlcnJlZF90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgIT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHMtPmF2Y3R4LT5jb2xvcl90cmMgPSBvdXQtPmNvbG9yX3RyYyA9IHMtPnNlaS5hbHRlcm5hdGl2ZV90cmFuc2Zlci5wcmVmZXJyZWRfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhldmNfZnJhbWVfc3RhcnQoSEVWQ0NvbnRleHQgKnMpCit7CisgICAgSEVWQ0xvY2FsQ29udGV4dCAqbGMgPSBzLT5IRVZDbGM7CisgICAgaW50IHBpY19zaXplX2luX2N0YiAgPSAoKHMtPnBzLnNwcy0+d2lkdGggID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZSkgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHMtPnBzLnNwcy0+aGVpZ2h0ID4+IHMtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZSkgKyAxKTsKKyAgICBpbnQgcmV0OworCisgICAgbWVtc2V0KHMtPmhvcml6b250YWxfYnMsIDAsIHMtPmJzX3dpZHRoICogcy0+YnNfaGVpZ2h0KTsKKyAgICBtZW1zZXQocy0+dmVydGljYWxfYnMsICAgMCwgcy0+YnNfd2lkdGggKiBzLT5ic19oZWlnaHQpOworICAgIG1lbXNldChzLT5jYmZfbHVtYSwgICAgICAwLCBzLT5wcy5zcHMtPm1pbl90Yl93aWR0aCAqIHMtPnBzLnNwcy0+bWluX3RiX2hlaWdodCk7CisgICAgbWVtc2V0KHMtPmlzX3BjbSwgICAgICAgIDAsIChzLT5wcy5zcHMtPm1pbl9wdV93aWR0aCArIDEpICogKHMtPnBzLnNwcy0+bWluX3B1X2hlaWdodCArIDEpKTsKKyAgICBtZW1zZXQocy0+dGFiX3NsaWNlX2FkZHJlc3MsIC0xLCBwaWNfc2l6ZV9pbl9jdGIgKiBzaXplb2YoKnMtPnRhYl9zbGljZV9hZGRyZXNzKSk7CisKKyAgICBzLT5pc19kZWNvZGVkICAgICAgICA9IDA7CisgICAgcy0+Zmlyc3RfbmFsX3R5cGUgICAgPSBzLT5uYWxfdW5pdF90eXBlOworCisgICAgcy0+bm9fcmFzbF9vdXRwdXRfZmxhZyA9IElTX0lEUihzKSB8fCBJU19CTEEocykgfHwgKHMtPm5hbF91bml0X3R5cGUgPT0gSEVWQ19OQUxfQ1JBX05VVCAmJiBzLT5sYXN0X2Vvcyk7CisKKyAgICBpZiAocy0+cHMucHBzLT50aWxlc19lbmFibGVkX2ZsYWcpCisgICAgICAgIGxjLT5lbmRfb2ZfdGlsZXNfeCA9IHMtPnBzLnBwcy0+Y29sdW1uX3dpZHRoWzBdIDw8IHMtPnBzLnNwcy0+bG9nMl9jdGJfc2l6ZTsKKworICAgIHJldCA9IGZmX2hldmNfc2V0X25ld19yZWYocywgJnMtPmZyYW1lLCBzLT5wb2MpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSBmZl9oZXZjX2ZyYW1lX3JwcyhzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGNvbnN0cnVjdGluZyB0aGUgZnJhbWUgUlBTLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzLT5yZWYtPmZyYW1lLT5rZXlfZnJhbWUgPSBJU19JUkFQKHMpOworCisgICAgcmV0ID0gc2V0X3NpZGVfZGF0YShzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+ZnJhbWUtPnBpY3RfdHlwZSA9IDMgLSBzLT5zaC5zbGljZV90eXBlOworCisgICAgaWYgKCFJU19JUkFQKHMpKQorICAgICAgICBmZl9oZXZjX2J1bXBfZnJhbWUocyk7CisKKyAgICBhdl9mcmFtZV91bnJlZihzLT5vdXRwdXRfZnJhbWUpOworICAgIHJldCA9IGZmX2hldmNfb3V0cHV0X2ZyYW1lKHMsIHMtPm91dHB1dF9mcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmICghcy0+YXZjdHgtPmh3YWNjZWwpCisgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAocy0+YXZjdHgpOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaWYgKHMtPnJlZikKKyAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBzLT5yZWYsIH4wKTsKKyAgICBzLT5yZWYgPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF91bml0KEhFVkNDb250ZXh0ICpzLCBjb25zdCBIMjY0NU5BTCAqbmFsKQoreworICAgIEhFVkNMb2NhbENvbnRleHQgKmxjID0gcy0+SEVWQ2xjOworICAgIEdldEJpdENvbnRleHQgKmdiICAgID0gJmxjLT5nYjsKKyAgICBpbnQgY3RiX2FkZHJfdHMsIHJldDsKKworICAgICpnYiAgICAgICAgICAgICAgPSBuYWwtPmdiOworICAgIHMtPm5hbF91bml0X3R5cGUgPSBuYWwtPnR5cGU7CisgICAgcy0+dGVtcG9yYWxfaWQgICA9IG5hbC0+dGVtcG9yYWxfaWQ7CisKKyAgICBzd2l0Y2ggKHMtPm5hbF91bml0X3R5cGUpIHsKKyAgICBjYXNlIEhFVkNfTkFMX1ZQUzoKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsICYmIHMtPmF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfcGFyYW1zKSB7CisgICAgICAgICAgICByZXQgPSBzLT5hdmN0eC0+aHdhY2NlbC0+ZGVjb2RlX3BhcmFtcyhzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+cmF3X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnJhd19zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBmZl9oZXZjX2RlY29kZV9uYWxfdnBzKGdiLCBzLT5hdmN0eCwgJnMtPnBzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSEVWQ19OQUxfU1BTOgorICAgICAgICBpZiAocy0+YXZjdHgtPmh3YWNjZWwgJiYgcy0+YXZjdHgtPmh3YWNjZWwtPmRlY29kZV9wYXJhbXMpIHsKKyAgICAgICAgICAgIHJldCA9IHMtPmF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfcGFyYW1zKHMtPmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5yYXdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+cmF3X3NpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHJldCA9IGZmX2hldmNfZGVjb2RlX25hbF9zcHMoZ2IsIHMtPmF2Y3R4LCAmcy0+cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXBwbHlfZGVmZGlzcHdpbik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhFVkNfTkFMX1BQUzoKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsICYmIHMtPmF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfcGFyYW1zKSB7CisgICAgICAgICAgICByZXQgPSBzLT5hdmN0eC0+aHdhY2NlbC0+ZGVjb2RlX3BhcmFtcyhzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbC0+cmF3X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnJhd19zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBmZl9oZXZjX2RlY29kZV9uYWxfcHBzKGdiLCBzLT5hdmN0eCwgJnMtPnBzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSEVWQ19OQUxfU0VJX1BSRUZJWDoKKyAgICBjYXNlIEhFVkNfTkFMX1NFSV9TVUZGSVg6CisgICAgICAgIGlmIChzLT5hdmN0eC0+aHdhY2NlbCAmJiBzLT5hdmN0eC0+aHdhY2NlbC0+ZGVjb2RlX3BhcmFtcykgeworICAgICAgICAgICAgcmV0ID0gcy0+YXZjdHgtPmh3YWNjZWwtPmRlY29kZV9wYXJhbXMocy0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWwtPnJhd19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsLT5yYXdfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gZmZfaGV2Y19kZWNvZGVfbmFsX3NlaShnYiwgcy0+YXZjdHgsICZzLT5zZWksICZzLT5wcywgcy0+bmFsX3VuaXRfdHlwZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhFVkNfTkFMX1RSQUlMX1I6CisgICAgY2FzZSBIRVZDX05BTF9UUkFJTF9OOgorICAgIGNhc2UgSEVWQ19OQUxfVFNBX046CisgICAgY2FzZSBIRVZDX05BTF9UU0FfUjoKKyAgICBjYXNlIEhFVkNfTkFMX1NUU0FfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1NUU0FfUjoKKyAgICBjYXNlIEhFVkNfTkFMX0JMQV9XX0xQOgorICAgIGNhc2UgSEVWQ19OQUxfQkxBX1dfUkFETDoKKyAgICBjYXNlIEhFVkNfTkFMX0JMQV9OX0xQOgorICAgIGNhc2UgSEVWQ19OQUxfSURSX1dfUkFETDoKKyAgICBjYXNlIEhFVkNfTkFMX0lEUl9OX0xQOgorICAgIGNhc2UgSEVWQ19OQUxfQ1JBX05VVDoKKyAgICBjYXNlIEhFVkNfTkFMX1JBRExfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBRExfUjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBU0xfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBU0xfUjoKKyAgICAgICAgcmV0ID0gaGxzX3NsaWNlX2hlYWRlcihzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworCisgICAgICAgIGlmICgKKyAgICAgICAgICAgIChzLT5hdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfQklESVIgJiYgcy0+c2guc2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpIHx8CisgICAgICAgICAgICAocy0+YXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTklOVFJBICYmIHMtPnNoLnNsaWNlX3R5cGUgIT0gSEVWQ19TTElDRV9JKSB8fAorICAgICAgICAgICAgKHMtPmF2Y3R4LT5za2lwX2ZyYW1lID49IEFWRElTQ0FSRF9OT05LRVkgJiYgIUlTX0lEUihzKSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnNoLmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7CisgICAgICAgICAgICBpZiAocy0+bWF4X3JhID09IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+bmFsX3VuaXRfdHlwZSA9PSBIRVZDX05BTF9DUkFfTlVUIHx8IElTX0JMQShzKSkgeworICAgICAgICAgICAgICAgICAgICBzLT5tYXhfcmEgPSBzLT5wb2M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElTX0lEUihzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1heF9yYSA9IElOVF9NSU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHMtPm5hbF91bml0X3R5cGUgPT0gSEVWQ19OQUxfUkFTTF9SIHx8IHMtPm5hbF91bml0X3R5cGUgPT0gSEVWQ19OQUxfUkFTTF9OKSAmJgorICAgICAgICAgICAgICAgIHMtPnBvYyA8PSBzLT5tYXhfcmEpIHsKKyAgICAgICAgICAgICAgICBzLT5pc19kZWNvZGVkID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPm5hbF91bml0X3R5cGUgPT0gSEVWQ19OQUxfUkFTTF9SICYmIHMtPnBvYyA+IHMtPm1heF9yYSkKKyAgICAgICAgICAgICAgICAgICAgcy0+bWF4X3JhID0gSU5UX01JTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gaGV2Y19mcmFtZV9zdGFydChzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoIXMtPnJlZikgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaXJzdCBzbGljZSBpbiBhIGZyYW1lIG1pc3NpbmcuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5uYWxfdW5pdF90eXBlICE9IHMtPmZpcnN0X25hbF90eXBlKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiTm9uLW1hdGNoaW5nIE5BTCB0eXBlcyBvZiB0aGUgVkNMIE5BTFVzOiAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5maXJzdF9uYWxfdHlwZSwgcy0+bmFsX3VuaXRfdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcy0+c2guZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZyAmJgorICAgICAgICAgICAgcy0+c2guc2xpY2VfdHlwZSAhPSBIRVZDX1NMSUNFX0kpIHsKKyAgICAgICAgICAgIHJldCA9IGZmX2hldmNfc2xpY2VfcnBsKHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY29uc3RydWN0aW5nIHRoZSByZWZlcmVuY2UgbGlzdHMgZm9yIHRoZSBjdXJyZW50IHNsaWNlLlxuIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnNoLmZpcnN0X3NsaWNlX2luX3BpY19mbGFnICYmIHMtPmF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgICAgICByZXQgPSBzLT5hdmN0eC0+aHdhY2NlbC0+c3RhcnRfZnJhbWUocy0+YXZjdHgsIE5VTEwsIDApOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgICAgICByZXQgPSBzLT5hdmN0eC0+aHdhY2NlbC0+ZGVjb2RlX3NsaWNlKHMtPmF2Y3R4LCBuYWwtPnJhd19kYXRhLCBuYWwtPnJhd19zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT50aHJlYWRzX251bWJlciA+IDEgJiYgcy0+c2gubnVtX2VudHJ5X3BvaW50X29mZnNldHMgPiAwKQorICAgICAgICAgICAgICAgIGN0Yl9hZGRyX3RzID0gaGxzX3NsaWNlX2RhdGFfd3BwKHMsIG5hbCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3RiX2FkZHJfdHMgPSBobHNfc2xpY2VfZGF0YShzKTsKKyAgICAgICAgICAgIGlmIChjdGJfYWRkcl90cyA+PSAocy0+cHMuc3BzLT5jdGJfd2lkdGggKiBzLT5wcy5zcHMtPmN0Yl9oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgcy0+aXNfZGVjb2RlZCA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjdGJfYWRkcl90cyA8IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBjdGJfYWRkcl90czsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIRVZDX05BTF9FT1NfTlVUOgorICAgIGNhc2UgSEVWQ19OQUxfRU9CX05VVDoKKyAgICAgICAgcy0+c2VxX2RlY29kZSA9IChzLT5zZXFfZGVjb2RlICsgMSkgJiAweGZmOworICAgICAgICBzLT5tYXhfcmEgICAgID0gSU5UX01BWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIRVZDX05BTF9BVUQ6CisgICAgY2FzZSBIRVZDX05BTF9GRF9OVVQ6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAiU2tpcHBpbmcgTkFMIHVuaXQgJWRcbiIsIHMtPm5hbF91bml0X3R5cGUpOworICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBpZiAocy0+YXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX25hbF91bml0cyhIRVZDQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuZ3RoKQoreworICAgIGludCBpLCByZXQgPSAwOworICAgIGludCBlb3NfYXRfc3RhcnQgPSAxOworCisgICAgcy0+cmVmID0gTlVMTDsKKyAgICBzLT5sYXN0X2VvcyA9IHMtPmVvczsKKyAgICBzLT5lb3MgPSAwOworCisgICAgLyogc3BsaXQgdGhlIGlucHV0IHBhY2tldCBpbnRvIE5BTCB1bml0cywgc28gd2Uga25vdyB0aGUgdXBwZXIgYm91bmQgb24gdGhlCisgICAgICogbnVtYmVyIG9mIHNsaWNlcyBpbiB0aGUgZnJhbWUgKi8KKyAgICByZXQgPSBmZl9oMjY0NV9wYWNrZXRfc3BsaXQoJnMtPnBrdCwgYnVmLCBsZW5ndGgsIHMtPmF2Y3R4LCBzLT5pc19uYWxmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmFsX2xlbmd0aF9zaXplLCBzLT5hdmN0eC0+Y29kZWNfaWQsIDEpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkVycm9yIHNwbGl0dGluZyB0aGUgaW5wdXQgaW50byBOQUwgdW5pdHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGt0Lm5iX25hbHM7IGkrKykgeworICAgICAgICBpZiAocy0+cGt0Lm5hbHNbaV0udHlwZSA9PSBIRVZDX05BTF9FT0JfTlVUIHx8CisgICAgICAgICAgICBzLT5wa3QubmFsc1tpXS50eXBlID09IEhFVkNfTkFMX0VPU19OVVQpIHsKKyAgICAgICAgICAgIGlmIChlb3NfYXRfc3RhcnQpIHsKKyAgICAgICAgICAgICAgICBzLT5sYXN0X2VvcyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPmVvcyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlb3NfYXRfc3RhcnQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZGVjb2RlIHRoZSBOQUwgdW5pdHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGt0Lm5iX25hbHM7IGkrKykgeworICAgICAgICBIMjY0NU5BTCAqbmFsID0gJnMtPnBrdC5uYWxzW2ldOworCisgICAgICAgIGlmIChzLT5hdmN0eC0+c2tpcF9mcmFtZSA+PSBBVkRJU0NBUkRfQUxMIHx8CisgICAgICAgICAgICAocy0+YXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRgorICAgICAgICAgICAgJiYgZmZfaGV2Y19uYWxfaXNfbm9ucmVmKG5hbC0+dHlwZSkpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcmV0ID0gZGVjb2RlX25hbF91bml0KHMsIG5hbCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIE5BTCB1bml0ICMlZC5cbiIsIGkpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCitmYWlsOgorICAgIGlmIChzLT5yZWYgJiYgcy0+dGhyZWFkc190eXBlID09IEZGX1RIUkVBRF9GUkFNRSkKKyAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+cmVmLT50ZiwgSU5UX01BWCwgMCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBwcmludF9tZDUodm9pZCAqbG9nX2N0eCwgaW50IGxldmVsLCB1aW50OF90IG1kNVsxNl0pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBsZXZlbCwgIiUwMiJQUkl4OCwgbWQ1W2ldKTsKK30KKworc3RhdGljIGludCB2ZXJpZnlfbWQ1KEhFVkNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZyYW1lLT5mb3JtYXQpOworICAgIGludCBwaXhlbF9zaGlmdDsKKyAgICBpbnQgaSwgajsKKworICAgIGlmICghZGVzYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHBpeGVsX3NoaWZ0ID0gZGVzYy0+Y29tcFswXS5kZXB0aCA+IDg7CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlZlcmlmeWluZyBjaGVja3N1bSBmb3IgZnJhbWUgd2l0aCBQT0MgJWQ6ICIsCisgICAgICAgICAgIHMtPnBvYyk7CisKKyAgICAvKiB0aGUgY2hlY2tzdW1zIGFyZSBMRSwgc28gd2UgaGF2ZSB0byBieXRlc3dhcCBmb3IgPjhicHAgZm9ybWF0cworICAgICAqIG9uIEJFIGFyY2hlcyAqLworI2lmIEhBVkVfQklHRU5ESUFOCisgICAgaWYgKHBpeGVsX3NoaWZ0ICYmICFzLT5jaGVja3N1bV9idWYpIHsKKyAgICAgICAgYXZfZmFzdF9tYWxsb2MoJnMtPmNoZWNrc3VtX2J1ZiwgJnMtPmNoZWNrc3VtX2J1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBGRk1BWDMoZnJhbWUtPmxpbmVzaXplWzBdLCBmcmFtZS0+bGluZXNpemVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMl0pKTsKKyAgICAgICAgaWYgKCFzLT5jaGVja3N1bV9idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyNlbmRpZgorCisgICAgZm9yIChpID0gMDsgZnJhbWUtPmRhdGFbaV07IGkrKykgeworICAgICAgICBpbnQgd2lkdGggID0gcy0+YXZjdHgtPmNvZGVkX3dpZHRoOworICAgICAgICBpbnQgaGVpZ2h0ID0gcy0+YXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICAgICAgaW50IHcgPSAoaSA9PSAxIHx8IGkgPT0gMikgPyAod2lkdGggID4+IGRlc2MtPmxvZzJfY2hyb21hX3cpIDogd2lkdGg7CisgICAgICAgIGludCBoID0gKGkgPT0gMSB8fCBpID09IDIpID8gKGhlaWdodCA+PiBkZXNjLT5sb2cyX2Nocm9tYV9oKSA6IGhlaWdodDsKKyAgICAgICAgdWludDhfdCBtZDVbMTZdOworCisgICAgICAgIGF2X21kNV9pbml0KHMtPm1kNV9jdHgpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSBmcmFtZS0+ZGF0YVtpXSArIGogKiBmcmFtZS0+bGluZXNpemVbaV07CisjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICAgICAgICAgIGlmIChwaXhlbF9zaGlmdCkgeworICAgICAgICAgICAgICAgIHMtPmJkc3AuYnN3YXAxNl9idWYoKHVpbnQxNl90ICopIHMtPmNoZWNrc3VtX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50MTZfdCAqKSBzcmMsIHcpOworICAgICAgICAgICAgICAgIHNyYyA9IHMtPmNoZWNrc3VtX2J1ZjsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgYXZfbWQ1X3VwZGF0ZShzLT5tZDVfY3R4LCBzcmMsIHcgPDwgcGl4ZWxfc2hpZnQpOworICAgICAgICB9CisgICAgICAgIGF2X21kNV9maW5hbChzLT5tZDVfY3R4LCBtZDUpOworCisgICAgICAgIGlmICghbWVtY21wKG1kNSwgcy0+c2VpLnBpY3R1cmVfaGFzaC5tZDVbaV0sIDE2KSkgeworICAgICAgICAgICAgYXZfbG9nICAgKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJwbGFuZSAlZCAtIGNvcnJlY3QgIiwgaSk7CisgICAgICAgICAgICBwcmludF9tZDUocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgbWQ1KTsKKyAgICAgICAgICAgIGF2X2xvZyAgIChzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiOyAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyAgIChzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWlzbWF0Y2hpbmcgY2hlY2tzdW0gb2YgcGxhbmUgJWQgLSAiLCBpKTsKKyAgICAgICAgICAgIHByaW50X21kNShzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCBtZDUpOworICAgICAgICAgICAgYXZfbG9nICAgKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICIgIT0gIik7CisgICAgICAgICAgICBwcmludF9tZDUocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgcy0+c2VpLnBpY3R1cmVfaGFzaC5tZDVbaV0pOworICAgICAgICAgICAgYXZfbG9nICAgKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZXZjX2RlY29kZV9leHRyYWRhdGEoSEVWQ0NvbnRleHQgKnMsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbmd0aCwgaW50IGZpcnN0KQoreworICAgIGludCByZXQsIGk7CisKKyAgICByZXQgPSBmZl9oZXZjX2RlY29kZV9leHRyYWRhdGEoYnVmLCBsZW5ndGgsICZzLT5wcywgJnMtPnNlaSwgJnMtPmlzX25hbGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bmFsX2xlbmd0aF9zaXplLCBzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hcHBseV9kZWZkaXNwd2luLCBzLT5hdmN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBleHBvcnQgc3RyZWFtIHBhcmFtZXRlcnMgZnJvbSB0aGUgZmlyc3QgU1BTICovCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnBzLnNwc19saXN0KTsgaSsrKSB7CisgICAgICAgIGlmIChmaXJzdCAmJiBzLT5wcy5zcHNfbGlzdFtpXSkgeworICAgICAgICAgICAgY29uc3QgSEVWQ1NQUyAqc3BzID0gKGNvbnN0IEhFVkNTUFMqKXMtPnBzLnNwc19saXN0W2ldLT5kYXRhOworICAgICAgICAgICAgZXhwb3J0X3N0cmVhbV9wYXJhbXMocy0+YXZjdHgsICZzLT5wcywgc3BzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgcmV0OworICAgIGludCBuZXdfZXh0cmFkYXRhX3NpemU7CisgICAgdWludDhfdCAqbmV3X2V4dHJhZGF0YTsKKyAgICBIRVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAoIWF2cGt0LT5zaXplKSB7CisgICAgICAgIHJldCA9IGZmX2hldmNfb3V0cHV0X2ZyYW1lKHMsIGRhdGEsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgKmdvdF9vdXRwdXQgPSByZXQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5ld19leHRyYWRhdGEgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19leHRyYWRhdGFfc2l6ZSk7CisgICAgaWYgKG5ld19leHRyYWRhdGEgJiYgbmV3X2V4dHJhZGF0YV9zaXplID4gMCkgeworICAgICAgICByZXQgPSBoZXZjX2RlY29kZV9leHRyYWRhdGEocywgbmV3X2V4dHJhZGF0YSwgbmV3X2V4dHJhZGF0YV9zaXplLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHMtPnJlZiA9IE5VTEw7CisgICAgcmV0ICAgID0gZGVjb2RlX25hbF91bml0cyhzLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgIGlmIChzLT5yZWYgJiYgKHJldCA9IGF2Y3R4LT5od2FjY2VsLT5lbmRfZnJhbWUoYXZjdHgpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJoYXJkd2FyZSBhY2NlbGVyYXRvciBmYWlsZWQgdG8gZGVjb2RlIHBpY3R1cmVcbiIpOworICAgICAgICAgICAgZmZfaGV2Y191bnJlZl9mcmFtZShzLCBzLT5yZWYsIH4wKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiB2ZXJpZnkgdGhlIFNFSSBjaGVja3N1bSAqLworICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0NSQ0NIRUNLICYmIHMtPmlzX2RlY29kZWQgJiYKKyAgICAgICAgICAgIHMtPnNlaS5waWN0dXJlX2hhc2guaXNfbWQ1KSB7CisgICAgICAgICAgICByZXQgPSB2ZXJpZnlfbWQ1KHMsIHMtPnJlZi0+ZnJhbWUpOworICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgICAgICAgICBmZl9oZXZjX3VucmVmX2ZyYW1lKHMsIHMtPnJlZiwgfjApOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+c2VpLnBpY3R1cmVfaGFzaC5pc19tZDUgPSAwOworCisgICAgaWYgKHMtPmlzX2RlY29kZWQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJEZWNvZGVkIGZyYW1lIHdpdGggUE9DICVkLlxuIiwgcy0+cG9jKTsKKyAgICAgICAgcy0+aXNfZGVjb2RlZCA9IDA7CisgICAgfQorCisgICAgaWYgKHMtPm91dHB1dF9mcmFtZS0+YnVmWzBdKSB7CisgICAgICAgIGF2X2ZyYW1lX21vdmVfcmVmKGRhdGEsIHMtPm91dHB1dF9mcmFtZSk7CisgICAgICAgICpnb3Rfb3V0cHV0ID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y19yZWZfZnJhbWUoSEVWQ0NvbnRleHQgKnMsIEhFVkNGcmFtZSAqZHN0LCBIRVZDRnJhbWUgKnNyYykKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmZHN0LT50ZiwgJnNyYy0+dGYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZHN0LT50YWJfbXZmX2J1ZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT50YWJfbXZmX2J1Zik7CisgICAgaWYgKCFkc3QtPnRhYl9tdmZfYnVmKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZHN0LT50YWJfbXZmID0gc3JjLT50YWJfbXZmOworCisgICAgZHN0LT5ycGxfdGFiX2J1ZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5ycGxfdGFiX2J1Zik7CisgICAgaWYgKCFkc3QtPnJwbF90YWJfYnVmKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZHN0LT5ycGxfdGFiID0gc3JjLT5ycGxfdGFiOworCisgICAgZHN0LT5ycGxfYnVmID0gYXZfYnVmZmVyX3JlZihzcmMtPnJwbF9idWYpOworICAgIGlmICghZHN0LT5ycGxfYnVmKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBkc3QtPnBvYyAgICAgICAgPSBzcmMtPnBvYzsKKyAgICBkc3QtPmN0Yl9jb3VudCAgPSBzcmMtPmN0Yl9jb3VudDsKKyAgICBkc3QtPmZsYWdzICAgICAgPSBzcmMtPmZsYWdzOworICAgIGRzdC0+c2VxdWVuY2UgICA9IHNyYy0+c2VxdWVuY2U7CisKKyAgICBpZiAoc3JjLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSkgeworICAgICAgICBkc3QtPmh3YWNjZWxfcHJpdl9idWYgPSBhdl9idWZmZXJfcmVmKHNyYy0+aHdhY2NlbF9wcml2X2J1Zik7CisgICAgICAgIGlmICghZHN0LT5od2FjY2VsX3ByaXZfYnVmKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBkc3QtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlID0gZHN0LT5od2FjY2VsX3ByaXZfYnVmLT5kYXRhOworICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmZl9oZXZjX3VucmVmX2ZyYW1lKHMsIGRzdCwgfjApOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBoZXZjX2RlY29kZV9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIRVZDQ29udGV4dCAgICAgICAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBwaWNfYXJyYXlzX2ZyZWUocyk7CisKKyAgICBhdl9mcmVlcCgmcy0+bWQ1X2N0eCk7CisKKyAgICBhdl9mcmVlcCgmcy0+Y2FiYWNfc3RhdGUpOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmcy0+c2FvX3BpeGVsX2J1ZmZlcl9oW2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnNhb19waXhlbF9idWZmZXJfdltpXSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm91dHB1dF9mcmFtZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+RFBCKTsgaSsrKSB7CisgICAgICAgIGZmX2hldmNfdW5yZWZfZnJhbWUocywgJnMtPkRQQltpXSwgfjApOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5EUEJbaV0uZnJhbWUpOworICAgIH0KKworICAgIGZmX2hldmNfcHNfdW5pbml0KCZzLT5wcyk7CisKKyAgICBhdl9mcmVlcCgmcy0+c2guZW50cnlfcG9pbnRfb2Zmc2V0KTsKKyAgICBhdl9mcmVlcCgmcy0+c2gub2Zmc2V0KTsKKyAgICBhdl9mcmVlcCgmcy0+c2guc2l6ZSk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcy0+dGhyZWFkc19udW1iZXI7IGkrKykgeworICAgICAgICBIRVZDTG9jYWxDb250ZXh0ICpsYyA9IHMtPkhFVkNsY0xpc3RbaV07CisgICAgICAgIGlmIChsYykgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPkhFVkNsY0xpc3RbaV0pOworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPnNMaXN0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+SEVWQ2xjID09IHMtPkhFVkNsY0xpc3RbMF0pCisgICAgICAgIHMtPkhFVkNsYyA9IE5VTEw7CisgICAgYXZfZnJlZXAoJnMtPkhFVkNsY0xpc3RbMF0pOworCisgICAgZmZfaDI2NDVfcGFja2V0X3VuaW5pdCgmcy0+cGt0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaGV2Y19pbml0X2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEhFVkNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICBzLT5IRVZDbGMgPSBhdl9tYWxsb2N6KHNpemVvZihIRVZDTG9jYWxDb250ZXh0KSk7CisgICAgaWYgKCFzLT5IRVZDbGMpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzLT5IRVZDbGNMaXN0WzBdID0gcy0+SEVWQ2xjOworICAgIHMtPnNMaXN0WzBdID0gczsKKworICAgIHMtPmNhYmFjX3N0YXRlID0gYXZfbWFsbG9jKEhFVkNfQ09OVEVYVFMpOworICAgIGlmICghcy0+Y2FiYWNfc3RhdGUpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPm91dHB1dF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5vdXRwdXRfZnJhbWUpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5EUEIpOyBpKyspIHsKKyAgICAgICAgcy0+RFBCW2ldLmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFzLT5EUEJbaV0uZnJhbWUpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHMtPkRQQltpXS50Zi5mID0gcy0+RFBCW2ldLmZyYW1lOworICAgIH0KKworICAgIHMtPm1heF9yYSA9IElOVF9NQVg7CisKKyAgICBzLT5tZDVfY3R4ID0gYXZfbWQ1X2FsbG9jKCk7CisgICAgaWYgKCFzLT5tZDVfY3R4KQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmZl9ic3dhcGRzcF9pbml0KCZzLT5iZHNwKTsKKworICAgIHMtPmNvbnRleHRfaW5pdGlhbGl6ZWQgPSAxOworICAgIHMtPmVvcyA9IDA7CisKKyAgICBmZl9oZXZjX3Jlc2V0X3NlaSgmcy0+c2VpKTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGhldmNfZGVjb2RlX2ZyZWUoYXZjdHgpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBpbnQgaGV2Y191cGRhdGVfdGhyZWFkX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZDb2RlY0NvbnRleHQgKnNyYykKK3sKKyAgICBIRVZDQ29udGV4dCAqcyAgPSBkc3QtPnByaXZfZGF0YTsKKyAgICBIRVZDQ29udGV4dCAqczAgPSBzcmMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgaWYgKCFzLT5jb250ZXh0X2luaXRpYWxpemVkKSB7CisgICAgICAgIHJldCA9IGhldmNfaW5pdF9jb250ZXh0KGRzdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+RFBCKTsgaSsrKSB7CisgICAgICAgIGZmX2hldmNfdW5yZWZfZnJhbWUocywgJnMtPkRQQltpXSwgfjApOworICAgICAgICBpZiAoczAtPkRQQltpXS5mcmFtZS0+YnVmWzBdKSB7CisgICAgICAgICAgICByZXQgPSBoZXZjX3JlZl9mcmFtZShzLCAmcy0+RFBCW2ldLCAmczAtPkRQQltpXSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnBzLnNwcyAhPSBzMC0+cHMuc3BzKQorICAgICAgICBzLT5wcy5zcHMgPSBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5wcy52cHNfbGlzdCk7IGkrKykgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnMtPnBzLnZwc19saXN0W2ldKTsKKyAgICAgICAgaWYgKHMwLT5wcy52cHNfbGlzdFtpXSkgeworICAgICAgICAgICAgcy0+cHMudnBzX2xpc3RbaV0gPSBhdl9idWZmZXJfcmVmKHMwLT5wcy52cHNfbGlzdFtpXSk7CisgICAgICAgICAgICBpZiAoIXMtPnBzLnZwc19saXN0W2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+cHMuc3BzX2xpc3QpOyBpKyspIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5wcy5zcHNfbGlzdFtpXSk7CisgICAgICAgIGlmIChzMC0+cHMuc3BzX2xpc3RbaV0pIHsKKyAgICAgICAgICAgIHMtPnBzLnNwc19saXN0W2ldID0gYXZfYnVmZmVyX3JlZihzMC0+cHMuc3BzX2xpc3RbaV0pOworICAgICAgICAgICAgaWYgKCFzLT5wcy5zcHNfbGlzdFtpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnBzLnBwc19saXN0KTsgaSsrKSB7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+cHMucHBzX2xpc3RbaV0pOworICAgICAgICBpZiAoczAtPnBzLnBwc19saXN0W2ldKSB7CisgICAgICAgICAgICBzLT5wcy5wcHNfbGlzdFtpXSA9IGF2X2J1ZmZlcl9yZWYoczAtPnBzLnBwc19saXN0W2ldKTsKKyAgICAgICAgICAgIGlmICghcy0+cHMucHBzX2xpc3RbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5wcy5zcHMgIT0gczAtPnBzLnNwcykKKyAgICAgICAgaWYgKChyZXQgPSBzZXRfc3BzKHMsIHMwLT5wcy5zcHMsIHNyYy0+cGl4X2ZtdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5zZXFfZGVjb2RlID0gczAtPnNlcV9kZWNvZGU7CisgICAgcy0+c2VxX291dHB1dCA9IHMwLT5zZXFfb3V0cHV0OworICAgIHMtPnBvY1RpZDAgICAgPSBzMC0+cG9jVGlkMDsKKyAgICBzLT5tYXhfcmEgICAgID0gczAtPm1heF9yYTsKKyAgICBzLT5lb3MgICAgICAgID0gczAtPmVvczsKKyAgICBzLT5ub19yYXNsX291dHB1dF9mbGFnID0gczAtPm5vX3Jhc2xfb3V0cHV0X2ZsYWc7CisKKyAgICBzLT5pc19uYWxmZiAgICAgICAgPSBzMC0+aXNfbmFsZmY7CisgICAgcy0+bmFsX2xlbmd0aF9zaXplID0gczAtPm5hbF9sZW5ndGhfc2l6ZTsKKworICAgIHMtPnRocmVhZHNfbnVtYmVyICAgICAgPSBzMC0+dGhyZWFkc19udW1iZXI7CisgICAgcy0+dGhyZWFkc190eXBlICAgICAgICA9IHMwLT50aHJlYWRzX3R5cGU7CisKKyAgICBpZiAoczAtPmVvcykgeworICAgICAgICBzLT5zZXFfZGVjb2RlID0gKHMtPnNlcV9kZWNvZGUgKyAxKSAmIDB4ZmY7CisgICAgICAgIHMtPm1heF9yYSA9IElOVF9NQVg7CisgICAgfQorCisgICAgcy0+c2VpLmZyYW1lX3BhY2tpbmcgICAgICAgID0gczAtPnNlaS5mcmFtZV9wYWNraW5nOworICAgIHMtPnNlaS5kaXNwbGF5X29yaWVudGF0aW9uICA9IHMwLT5zZWkuZGlzcGxheV9vcmllbnRhdGlvbjsKKyAgICBzLT5zZWkubWFzdGVyaW5nX2Rpc3BsYXkgICAgPSBzMC0+c2VpLm1hc3RlcmluZ19kaXNwbGF5OworICAgIHMtPnNlaS5jb250ZW50X2xpZ2h0ICAgICAgICA9IHMwLT5zZWkuY29udGVudF9saWdodDsKKyAgICBzLT5zZWkuYWx0ZXJuYXRpdmVfdHJhbnNmZXIgPSBzMC0+c2VpLmFsdGVybmF0aXZlX3RyYW5zZmVyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBoZXZjX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIRVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MgPSAxOworCisgICAgcmV0ID0gaGV2Y19pbml0X2NvbnRleHQoYXZjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+ZW5hYmxlX3BhcmFsbGVsX3RpbGVzID0gMDsKKyAgICBzLT5zZWkucGljdHVyZV90aW1pbmcucGljdHVyZV9zdHJ1Y3QgPSAwOworICAgIHMtPmVvcyA9IDE7CisKKyAgICBhdG9taWNfaW5pdCgmcy0+d3BwX2VyciwgMCk7CisKKyAgICBpZihhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKQorICAgICAgICBzLT50aHJlYWRzX251bWJlciA9IGF2Y3R4LT50aHJlYWRfY291bnQ7CisgICAgZWxzZQorICAgICAgICBzLT50aHJlYWRzX251bWJlciA9IDE7CisKKyAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMCAmJiBhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgIHJldCA9IGhldmNfZGVjb2RlX2V4dHJhZGF0YShzLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaGV2Y19kZWNvZGVfZnJlZShhdmN0eCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYoKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpICYmIGF2Y3R4LT50aHJlYWRfY291bnQgPiAxKQorICAgICAgICAgICAgcy0+dGhyZWFkc190eXBlID0gRkZfVEhSRUFEX0ZSQU1FOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzLT50aHJlYWRzX3R5cGUgPSBGRl9USFJFQURfU0xJQ0U7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGhldmNfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSEVWQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBtZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisKKyAgICByZXQgPSBoZXZjX2luaXRfY29udGV4dChhdmN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGV2Y19kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIEhFVkNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBmZl9oZXZjX2ZsdXNoX2RwYihzKTsKKyAgICBzLT5tYXhfcmEgPSBJTlRfTUFYOworICAgIHMtPmVvcyA9IDE7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEhFVkNDb250ZXh0LCB4KQorI2RlZmluZSBQQVIgKEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0pCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiYXBwbHlfZGVmZGlzcHdpbiIsICJBcHBseSBkZWZhdWx0IGRpc3BsYXkgd2luZG93IGZyb20gVlVJIiwgT0ZGU0VUKGFwcGx5X2RlZmRpc3B3aW4pLAorICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDB9LCAwLCAxLCBQQVIgfSwKKyAgICB7ICJzdHJpY3QtZGlzcGxheXdpbiIsICJzdHJpY2x5IGFwcGx5IGRlZmF1bHQgZGlzcGxheSB3aW5kb3cgc2l6ZSIsIE9GRlNFVChhcHBseV9kZWZkaXNwd2luKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgUEFSIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBoZXZjX2RlY29kZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiSEVWQyBkZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfaGV2Y19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAiaGV2YyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJIRVZDIChIaWdoIEVmZmljaWVuY3kgVmlkZW8gQ29kaW5nKSIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihIRVZDQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgICAgICAgICA9ICZoZXZjX2RlY29kZXJfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgICAgICAgICA9IGhldmNfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICA9IGhldmNfZGVjb2RlX2ZyZWUsCisgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IGhldmNfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSBoZXZjX2RlY29kZV9mbHVzaCwKKyAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gaGV2Y191cGRhdGVfdGhyZWFkX2NvbnRleHQsCisgICAgLmluaXRfdGhyZWFkX2NvcHkgICAgICA9IGhldmNfaW5pdF90aHJlYWRfY29weSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9ERUxBWSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfCBGRl9DT0RFQ19DQVBfRVhQT1JUU19DUk9QUElORywKKyAgICAucHJvZmlsZXMgICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoZmZfaGV2Y19wcm9maWxlcyksCisgICAgLmh3X2NvbmZpZ3MgICAgICAgICAgICA9IChjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCpbXSkgeworI2lmIENPTkZJR19IRVZDX0RYVkEyX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX0RYVkEyKGhldmMpLAorI2VuZGlmCisjaWYgQ09ORklHX0hFVkNfRDNEMTFWQV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9EM0QxMVZBKGhldmMpLAorI2VuZGlmCisjaWYgQ09ORklHX0hFVkNfRDNEMTFWQTJfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfRDNEMTFWQTIoaGV2YyksCisjZW5kaWYKKyNpZiBDT05GSUdfSEVWQ19OVkRFQ19IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9OVkRFQyhoZXZjKSwKKyNlbmRpZgorI2lmIENPTkZJR19IRVZDX1ZBQVBJX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZBQVBJKGhldmMpLAorI2VuZGlmCisjaWYgQ09ORklHX0hFVkNfVkRQQVVfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfVkRQQVUoaGV2YyksCisjZW5kaWYKKyNpZiBDT05GSUdfSEVWQ19WSURFT1RPT0xCT1hfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfVklERU9UT09MQk9YKGhldmMpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hldmNkZWMuaCBiL2xpYmF2Y29kZWMvaGV2Y2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTUxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2hldmNkZWMuaApAQCAtMCwwICsxLDYwOCBAQAorLyoKKyAqIEhFVkMgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiAtIDIwMTMgR3VpbGxhdW1lIE1hcnRyZXMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0hFVkNERUNfSAorI2RlZmluZSBBVkNPREVDX0hFVkNERUNfSAorCisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21kNS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzd2FwZHNwLmgiCisjaW5jbHVkZSAiY2FiYWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImhldmNwcmVkLmgiCisjaW5jbHVkZSAiaDI2NDVfcGFyc2UuaCIKKyNpbmNsdWRlICJoZXZjLmgiCisjaW5jbHVkZSAiaGV2Y19wcy5oIgorI2luY2x1ZGUgImhldmNfc2VpLmgiCisjaW5jbHVkZSAiaGV2Y2RzcC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAidmlkZW9kc3AuaCIKKworI2RlZmluZSBNQVhfTkJfVEhSRUFEUyAxNgorI2RlZmluZSBTSElGVF9DVEJfV1BQIDIKKworLy9UT0RPOiBjaGVjayBpZiB0aGlzIGlzIHJlYWxseSB0aGUgbWF4aW11bQorI2RlZmluZSBNQVhfVFJBTlNGT1JNX0RFUFRIIDUKKworI2RlZmluZSBNQVhfVEJfU0laRSAzMgorI2RlZmluZSBNQVhfUVAgNTEKKyNkZWZpbmUgREVGQVVMVF9JTlRSQV9UQ19PRkZTRVQgMgorCisjZGVmaW5lIEhFVkNfQ09OVEVYVFMgMTk5CisKKyNkZWZpbmUgTVJHX01BWF9OVU1fQ0FORFMgICAgIDUKKworI2RlZmluZSBMMCAwCisjZGVmaW5lIEwxIDEKKworI2RlZmluZSBFUEVMX0VYVFJBX0JFRk9SRSAxCisjZGVmaW5lIEVQRUxfRVhUUkFfQUZURVIgIDIKKyNkZWZpbmUgRVBFTF9FWFRSQSAgICAgICAgMworI2RlZmluZSBRUEVMX0VYVFJBX0JFRk9SRSAzCisjZGVmaW5lIFFQRUxfRVhUUkFfQUZURVIgIDQKKyNkZWZpbmUgUVBFTF9FWFRSQSAgICAgICAgNworCisjZGVmaW5lIEVER0VfRU1VX0JVRkZFUl9TVFJJREUgODAKKworLyoqCisgKiBWYWx1ZSBvZiB0aGUgbHVtYSBzYW1wbGUgYXQgcG9zaXRpb24gKHgsIHkpIGluIHRoZSAyRCBhcnJheSB0YWIuCisgKi8KKyNkZWZpbmUgU0FNUExFKHRhYiwgeCwgeSkgKCh0YWIpWyh5KSAqIHMtPnNwcy0+d2lkdGggKyAoeCldKQorI2RlZmluZSBTQU1QTEVfQ1RCKHRhYiwgeCwgeSkgKCh0YWIpWyh5KSAqIG1pbl9jYl93aWR0aCArICh4KV0pCisKKyNkZWZpbmUgSVNfSURSKHMpICgocyktPm5hbF91bml0X3R5cGUgPT0gSEVWQ19OQUxfSURSX1dfUkFETCB8fCAocyktPm5hbF91bml0X3R5cGUgPT0gSEVWQ19OQUxfSURSX05fTFApCisjZGVmaW5lIElTX0JMQShzKSAoKHMpLT5uYWxfdW5pdF90eXBlID09IEhFVkNfTkFMX0JMQV9XX1JBREwgfHwgKHMpLT5uYWxfdW5pdF90eXBlID09IEhFVkNfTkFMX0JMQV9XX0xQIHx8IFwKKyAgICAgICAgICAgICAgICAgICAocyktPm5hbF91bml0X3R5cGUgPT0gSEVWQ19OQUxfQkxBX05fTFApCisjZGVmaW5lIElTX0lSQVAocykgKChzKS0+bmFsX3VuaXRfdHlwZSA+PSAxNiAmJiAocyktPm5hbF91bml0X3R5cGUgPD0gMjMpCisKK2VudW0gUlBTVHlwZSB7CisgICAgU1RfQ1VSUl9CRUYgPSAwLAorICAgIFNUX0NVUlJfQUZULAorICAgIFNUX0ZPTEwsCisgICAgTFRfQ1VSUiwKKyAgICBMVF9GT0xMLAorICAgIE5CX1JQU19UWVBFLAorfTsKKworZW51bSBTeW50YXhFbGVtZW50IHsKKyAgICBTQU9fTUVSR0VfRkxBRyA9IDAsCisgICAgU0FPX1RZUEVfSURYLAorICAgIFNBT19FT19DTEFTUywKKyAgICBTQU9fQkFORF9QT1NJVElPTiwKKyAgICBTQU9fT0ZGU0VUX0FCUywKKyAgICBTQU9fT0ZGU0VUX1NJR04sCisgICAgRU5EX09GX1NMSUNFX0ZMQUcsCisgICAgU1BMSVRfQ09ESU5HX1VOSVRfRkxBRywKKyAgICBDVV9UUkFOU1FVQU5UX0JZUEFTU19GTEFHLAorICAgIFNLSVBfRkxBRywKKyAgICBDVV9RUF9ERUxUQSwKKyAgICBQUkVEX01PREVfRkxBRywKKyAgICBQQVJUX01PREUsCisgICAgUENNX0ZMQUcsCisgICAgUFJFVl9JTlRSQV9MVU1BX1BSRURfRkxBRywKKyAgICBNUE1fSURYLAorICAgIFJFTV9JTlRSQV9MVU1BX1BSRURfTU9ERSwKKyAgICBJTlRSQV9DSFJPTUFfUFJFRF9NT0RFLAorICAgIE1FUkdFX0ZMQUcsCisgICAgTUVSR0VfSURYLAorICAgIElOVEVSX1BSRURfSURDLAorICAgIFJFRl9JRFhfTDAsCisgICAgUkVGX0lEWF9MMSwKKyAgICBBQlNfTVZEX0dSRUFURVIwX0ZMQUcsCisgICAgQUJTX01WRF9HUkVBVEVSMV9GTEFHLAorICAgIEFCU19NVkRfTUlOVVMyLAorICAgIE1WRF9TSUdOX0ZMQUcsCisgICAgTVZQX0xYX0ZMQUcsCisgICAgTk9fUkVTSURVQUxfREFUQV9GTEFHLAorICAgIFNQTElUX1RSQU5TRk9STV9GTEFHLAorICAgIENCRl9MVU1BLAorICAgIENCRl9DQl9DUiwKKyAgICBUUkFOU0ZPUk1fU0tJUF9GTEFHLAorICAgIEVYUExJQ0lUX1JEUENNX0ZMQUcsCisgICAgRVhQTElDSVRfUkRQQ01fRElSX0ZMQUcsCisgICAgTEFTVF9TSUdOSUZJQ0FOVF9DT0VGRl9YX1BSRUZJWCwKKyAgICBMQVNUX1NJR05JRklDQU5UX0NPRUZGX1lfUFJFRklYLAorICAgIExBU1RfU0lHTklGSUNBTlRfQ09FRkZfWF9TVUZGSVgsCisgICAgTEFTVF9TSUdOSUZJQ0FOVF9DT0VGRl9ZX1NVRkZJWCwKKyAgICBTSUdOSUZJQ0FOVF9DT0VGRl9HUk9VUF9GTEFHLAorICAgIFNJR05JRklDQU5UX0NPRUZGX0ZMQUcsCisgICAgQ09FRkZfQUJTX0xFVkVMX0dSRUFURVIxX0ZMQUcsCisgICAgQ09FRkZfQUJTX0xFVkVMX0dSRUFURVIyX0ZMQUcsCisgICAgQ09FRkZfQUJTX0xFVkVMX1JFTUFJTklORywKKyAgICBDT0VGRl9TSUdOX0ZMQUcsCisgICAgTE9HMl9SRVNfU0NBTEVfQUJTLAorICAgIFJFU19TQ0FMRV9TSUdOX0ZMQUcsCisgICAgQ1VfQ0hST01BX1FQX09GRlNFVF9GTEFHLAorICAgIENVX0NIUk9NQV9RUF9PRkZTRVRfSURYLAorfTsKKworZW51bSBQYXJ0TW9kZSB7CisgICAgUEFSVF8yTngyTiA9IDAsCisgICAgUEFSVF8yTnhOICA9IDEsCisgICAgUEFSVF9OeDJOICA9IDIsCisgICAgUEFSVF9OeE4gICA9IDMsCisgICAgUEFSVF8yTnhuVSA9IDQsCisgICAgUEFSVF8yTnhuRCA9IDUsCisgICAgUEFSVF9uTHgyTiA9IDYsCisgICAgUEFSVF9uUngyTiA9IDcsCit9OworCitlbnVtIFByZWRNb2RlIHsKKyAgICBNT0RFX0lOVEVSID0gMCwKKyAgICBNT0RFX0lOVFJBLAorICAgIE1PREVfU0tJUCwKK307CisKK2VudW0gSW50ZXJQcmVkSWRjIHsKKyAgICBQUkVEX0wwID0gMCwKKyAgICBQUkVEX0wxLAorICAgIFBSRURfQkksCit9OworCitlbnVtIFByZWRGbGFnIHsKKyAgICBQRl9JTlRSQSA9IDAsCisgICAgUEZfTDAsCisgICAgUEZfTDEsCisgICAgUEZfQkksCit9OworCitlbnVtIEludHJhUHJlZE1vZGUgeworICAgIElOVFJBX1BMQU5BUiA9IDAsCisgICAgSU5UUkFfREMsCisgICAgSU5UUkFfQU5HVUxBUl8yLAorICAgIElOVFJBX0FOR1VMQVJfMywKKyAgICBJTlRSQV9BTkdVTEFSXzQsCisgICAgSU5UUkFfQU5HVUxBUl81LAorICAgIElOVFJBX0FOR1VMQVJfNiwKKyAgICBJTlRSQV9BTkdVTEFSXzcsCisgICAgSU5UUkFfQU5HVUxBUl84LAorICAgIElOVFJBX0FOR1VMQVJfOSwKKyAgICBJTlRSQV9BTkdVTEFSXzEwLAorICAgIElOVFJBX0FOR1VMQVJfMTEsCisgICAgSU5UUkFfQU5HVUxBUl8xMiwKKyAgICBJTlRSQV9BTkdVTEFSXzEzLAorICAgIElOVFJBX0FOR1VMQVJfMTQsCisgICAgSU5UUkFfQU5HVUxBUl8xNSwKKyAgICBJTlRSQV9BTkdVTEFSXzE2LAorICAgIElOVFJBX0FOR1VMQVJfMTcsCisgICAgSU5UUkFfQU5HVUxBUl8xOCwKKyAgICBJTlRSQV9BTkdVTEFSXzE5LAorICAgIElOVFJBX0FOR1VMQVJfMjAsCisgICAgSU5UUkFfQU5HVUxBUl8yMSwKKyAgICBJTlRSQV9BTkdVTEFSXzIyLAorICAgIElOVFJBX0FOR1VMQVJfMjMsCisgICAgSU5UUkFfQU5HVUxBUl8yNCwKKyAgICBJTlRSQV9BTkdVTEFSXzI1LAorICAgIElOVFJBX0FOR1VMQVJfMjYsCisgICAgSU5UUkFfQU5HVUxBUl8yNywKKyAgICBJTlRSQV9BTkdVTEFSXzI4LAorICAgIElOVFJBX0FOR1VMQVJfMjksCisgICAgSU5UUkFfQU5HVUxBUl8zMCwKKyAgICBJTlRSQV9BTkdVTEFSXzMxLAorICAgIElOVFJBX0FOR1VMQVJfMzIsCisgICAgSU5UUkFfQU5HVUxBUl8zMywKKyAgICBJTlRSQV9BTkdVTEFSXzM0LAorfTsKKworZW51bSBTQU9UeXBlIHsKKyAgICBTQU9fTk9UX0FQUExJRUQgPSAwLAorICAgIFNBT19CQU5ELAorICAgIFNBT19FREdFLAorICAgIFNBT19BUFBMSUVECit9OworCitlbnVtIFNBT0VPQ2xhc3MgeworICAgIFNBT19FT19IT1JJWiA9IDAsCisgICAgU0FPX0VPX1ZFUlQsCisgICAgU0FPX0VPXzEzNUQsCisgICAgU0FPX0VPXzQ1RCwKK307CisKK2VudW0gU2NhblR5cGUgeworICAgIFNDQU5fRElBRyA9IDAsCisgICAgU0NBTl9IT1JJWiwKKyAgICBTQ0FOX1ZFUlQsCit9OworCit0eXBlZGVmIHN0cnVjdCBSZWZQaWNMaXN0IHsKKyAgICBzdHJ1Y3QgSEVWQ0ZyYW1lICpyZWZbSEVWQ19NQVhfUkVGU107CisgICAgaW50IGxpc3RbSEVWQ19NQVhfUkVGU107CisgICAgaW50IGlzTG9uZ1Rlcm1bSEVWQ19NQVhfUkVGU107CisgICAgaW50IG5iX3JlZnM7Cit9IFJlZlBpY0xpc3Q7CisKK3R5cGVkZWYgc3RydWN0IFJlZlBpY0xpc3RUYWIgeworICAgIFJlZlBpY0xpc3QgcmVmUGljTGlzdFsyXTsKK30gUmVmUGljTGlzdFRhYjsKKwordHlwZWRlZiBzdHJ1Y3QgQ29kaW5nVW5pdCB7CisgICAgaW50IHg7CisgICAgaW50IHk7CisKKyAgICBlbnVtIFByZWRNb2RlIHByZWRfbW9kZTsgICAgLy8vPCBQcmVkTW9kZQorICAgIGVudW0gUGFydE1vZGUgcGFydF9tb2RlOyAgICAvLy88IFBhcnRNb2RlCisKKyAgICAvLyBJbmZlcnJlZCBwYXJhbWV0ZXJzCisgICAgdWludDhfdCBpbnRyYV9zcGxpdF9mbGFnOyAgIC8vLzwgSW50cmFTcGxpdEZsYWcKKyAgICB1aW50OF90IG1heF90cmFmb19kZXB0aDsgICAgLy8vPCBNYXhUcmFmb0RlcHRoCisgICAgdWludDhfdCBjdV90cmFuc3F1YW50X2J5cGFzc19mbGFnOworfSBDb2RpbmdVbml0OworCit0eXBlZGVmIHN0cnVjdCBNdiB7CisgICAgaW50MTZfdCB4OyAgLy8vPCBob3Jpem9udGFsIGNvbXBvbmVudCBvZiBtb3Rpb24gdmVjdG9yCisgICAgaW50MTZfdCB5OyAgLy8vPCB2ZXJ0aWNhbCBjb21wb25lbnQgb2YgbW90aW9uIHZlY3RvcgorfSBNdjsKKwordHlwZWRlZiBzdHJ1Y3QgTXZGaWVsZCB7CisgICAgREVDTEFSRV9BTElHTkVEKDQsIE12LCBtdilbMl07CisgICAgaW50OF90IHJlZl9pZHhbMl07CisgICAgaW50OF90IHByZWRfZmxhZzsKK30gTXZGaWVsZDsKKwordHlwZWRlZiBzdHJ1Y3QgTmVpZ2hib3VyQXZhaWxhYmxlIHsKKyAgICBpbnQgY2FuZF9ib3R0b21fbGVmdDsKKyAgICBpbnQgY2FuZF9sZWZ0OworICAgIGludCBjYW5kX3VwOworICAgIGludCBjYW5kX3VwX2xlZnQ7CisgICAgaW50IGNhbmRfdXBfcmlnaHQ7CisgICAgaW50IGNhbmRfdXBfcmlnaHRfc2FwOworfSBOZWlnaGJvdXJBdmFpbGFibGU7CisKK3R5cGVkZWYgc3RydWN0IFByZWRpY3Rpb25Vbml0IHsKKyAgICBpbnQgbXBtX2lkeDsKKyAgICBpbnQgcmVtX2ludHJhX2x1bWFfcHJlZF9tb2RlOworICAgIHVpbnQ4X3QgaW50cmFfcHJlZF9tb2RlWzRdOworICAgIE12IG12ZDsKKyAgICB1aW50OF90IG1lcmdlX2ZsYWc7CisgICAgdWludDhfdCBpbnRyYV9wcmVkX21vZGVfY1s0XTsKKyAgICB1aW50OF90IGNocm9tYV9tb2RlX2NbNF07Cit9IFByZWRpY3Rpb25Vbml0OworCit0eXBlZGVmIHN0cnVjdCBUcmFuc2Zvcm1Vbml0IHsKKyAgICBpbnQgY3VfcXBfZGVsdGE7CisKKyAgICBpbnQgcmVzX3NjYWxlX3ZhbDsKKworICAgIC8vIEluZmVycmVkIHBhcmFtZXRlcnM7CisgICAgaW50IGludHJhX3ByZWRfbW9kZTsKKyAgICBpbnQgaW50cmFfcHJlZF9tb2RlX2M7CisgICAgaW50IGNocm9tYV9tb2RlX2M7CisgICAgdWludDhfdCBpc19jdV9xcF9kZWx0YV9jb2RlZDsKKyAgICB1aW50OF90IGlzX2N1X2Nocm9tYV9xcF9vZmZzZXRfY29kZWQ7CisgICAgaW50OF90ICBjdV9xcF9vZmZzZXRfY2I7CisgICAgaW50OF90ICBjdV9xcF9vZmZzZXRfY3I7CisgICAgdWludDhfdCBjcm9zc19wZjsKK30gVHJhbnNmb3JtVW5pdDsKKwordHlwZWRlZiBzdHJ1Y3QgREJQYXJhbXMgeworICAgIGludCBiZXRhX29mZnNldDsKKyAgICBpbnQgdGNfb2Zmc2V0OworfSBEQlBhcmFtczsKKworI2RlZmluZSBIRVZDX0ZSQU1FX0ZMQUdfT1VUUFVUICAgICgxIDw8IDApCisjZGVmaW5lIEhFVkNfRlJBTUVfRkxBR19TSE9SVF9SRUYgKDEgPDwgMSkKKyNkZWZpbmUgSEVWQ19GUkFNRV9GTEFHX0xPTkdfUkVGICAoMSA8PCAyKQorI2RlZmluZSBIRVZDX0ZSQU1FX0ZMQUdfQlVNUElORyAgICgxIDw8IDMpCisKK3R5cGVkZWYgc3RydWN0IEhFVkNGcmFtZSB7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgVGhyZWFkRnJhbWUgdGY7CisgICAgTXZGaWVsZCAqdGFiX212ZjsKKyAgICBSZWZQaWNMaXN0ICpyZWZQaWNMaXN0OworICAgIFJlZlBpY0xpc3RUYWIgKipycGxfdGFiOworICAgIGludCBjdGJfY291bnQ7CisgICAgaW50IHBvYzsKKyAgICBzdHJ1Y3QgSEVWQ0ZyYW1lICpjb2xsb2NhdGVkX3JlZjsKKworICAgIEFWQnVmZmVyUmVmICp0YWJfbXZmX2J1ZjsKKyAgICBBVkJ1ZmZlclJlZiAqcnBsX3RhYl9idWY7CisgICAgQVZCdWZmZXJSZWYgKnJwbF9idWY7CisKKyAgICBBVkJ1ZmZlclJlZiAqaHdhY2NlbF9wcml2X2J1ZjsKKyAgICB2b2lkICpod2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKworICAgIC8qKgorICAgICAqIEEgc2VxdWVuY2UgY291bnRlciwgc28gdGhhdCBvbGQgZnJhbWVzIGFyZSBvdXRwdXQgZmlyc3QKKyAgICAgKiBhZnRlciBhIFBPQyByZXNldAorICAgICAqLworICAgIHVpbnQxNl90IHNlcXVlbmNlOworCisgICAgLyoqCisgICAgICogQSBjb21iaW5hdGlvbiBvZiBIRVZDX0ZSQU1FX0ZMQUdfKgorICAgICAqLworICAgIHVpbnQ4X3QgZmxhZ3M7Cit9IEhFVkNGcmFtZTsKKwordHlwZWRlZiBzdHJ1Y3QgSEVWQ0xvY2FsQ29udGV4dCB7CisgICAgdWludDhfdCBjYWJhY19zdGF0ZVtIRVZDX0NPTlRFWFRTXTsKKworICAgIHVpbnQ4X3Qgc3RhdF9jb2VmZls0XTsKKworICAgIHVpbnQ4X3QgZmlyc3RfcXBfZ3JvdXA7CisKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIENBQkFDQ29udGV4dCBjYzsKKworICAgIGludDhfdCBxcF95OworICAgIGludDhfdCBjdXJyX3FwX3k7CisKKyAgICBpbnQgcVB5X3ByZWQ7CisKKyAgICBUcmFuc2Zvcm1Vbml0IHR1OworCisgICAgdWludDhfdCBjdGJfbGVmdF9mbGFnOworICAgIHVpbnQ4X3QgY3RiX3VwX2ZsYWc7CisgICAgdWludDhfdCBjdGJfdXBfcmlnaHRfZmxhZzsKKyAgICB1aW50OF90IGN0Yl91cF9sZWZ0X2ZsYWc7CisgICAgaW50ICAgICBlbmRfb2ZfdGlsZXNfeDsKKyAgICBpbnQgICAgIGVuZF9vZl90aWxlc195OworICAgIC8qICs3IGlzIGZvciBzdWJwaXhlbCBpbnRlcnBvbGF0aW9uLCAqMiBmb3IgaGlnaCBiaXQgZGVwdGhzICovCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCB1aW50OF90LCBlZGdlX2VtdV9idWZmZXIpWyhNQVhfUEJfU0laRSArIDcpICogRURHRV9FTVVfQlVGRkVSX1NUUklERSAqIDJdOworICAgIC8qIFRoZSBleHRlbmRlZCBzaXplIGJldHdlZW4gdGhlIG5ldyBlZGdlIGVtdSBidWZmZXIgaXMgYWJ1c2VkIGJ5IFNBTyAqLworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgdWludDhfdCwgZWRnZV9lbXVfYnVmZmVyMilbKE1BWF9QQl9TSVpFICsgNykgKiBFREdFX0VNVV9CVUZGRVJfU1RSSURFICogMl07CisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBpbnQxNl90LCB0bXApW01BWF9QQl9TSVpFICogTUFYX1BCX1NJWkVdOworCisgICAgaW50IGN0X2RlcHRoOworICAgIENvZGluZ1VuaXQgY3U7CisgICAgUHJlZGljdGlvblVuaXQgcHU7CisgICAgTmVpZ2hib3VyQXZhaWxhYmxlIG5hOworCisjZGVmaW5lIEJPVU5EQVJZX0xFRlRfU0xJQ0UgICAgICgxIDw8IDApCisjZGVmaW5lIEJPVU5EQVJZX0xFRlRfVElMRSAgICAgICgxIDw8IDEpCisjZGVmaW5lIEJPVU5EQVJZX1VQUEVSX1NMSUNFICAgICgxIDw8IDIpCisjZGVmaW5lIEJPVU5EQVJZX1VQUEVSX1RJTEUgICAgICgxIDw8IDMpCisgICAgLyogcHJvcGVydGllcyBvZiB0aGUgYm91bmRhcnkgb2YgdGhlIGN1cnJlbnQgQ1RCIGZvciB0aGUgcHVycG9zZXMKKyAgICAgKiBvZiB0aGUgZGVibG9ja2luZyBmaWx0ZXIgKi8KKyAgICBpbnQgYm91bmRhcnlfZmxhZ3M7Cit9IEhFVkNMb2NhbENvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IEhFVkNDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjOyAgLy8gbmVlZGVkIGJ5IHByaXZhdGUgYXZvcHRpb25zCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworCisgICAgc3RydWN0IEhFVkNDb250ZXh0ICAqc0xpc3RbTUFYX05CX1RIUkVBRFNdOworCisgICAgSEVWQ0xvY2FsQ29udGV4dCAgICAqSEVWQ2xjTGlzdFtNQVhfTkJfVEhSRUFEU107CisgICAgSEVWQ0xvY2FsQ29udGV4dCAgICAqSEVWQ2xjOworCisgICAgdWludDhfdCAgICAgICAgICAgICB0aHJlYWRzX3R5cGU7CisgICAgdWludDhfdCAgICAgICAgICAgICB0aHJlYWRzX251bWJlcjsKKworICAgIGludCAgICAgICAgICAgICAgICAgd2lkdGg7CisgICAgaW50ICAgICAgICAgICAgICAgICBoZWlnaHQ7CisKKyAgICB1aW50OF90ICpjYWJhY19zdGF0ZTsKKworICAgIC8qKiAxIGlmIHRoZSBpbmRlcGVuZGVudCBzbGljZSBzZWdtZW50IGhlYWRlciB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCAqLworICAgIHVpbnQ4X3Qgc2xpY2VfaW5pdGlhbGl6ZWQ7CisKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBBVkZyYW1lICpvdXRwdXRfZnJhbWU7CisgICAgdWludDhfdCAqc2FvX3BpeGVsX2J1ZmZlcl9oWzNdOworICAgIHVpbnQ4X3QgKnNhb19waXhlbF9idWZmZXJfdlszXTsKKworICAgIEhFVkNQYXJhbVNldHMgcHM7CisgICAgSEVWQ1NFSSBzZWk7CisgICAgc3RydWN0IEFWTUQ1ICptZDVfY3R4OworCisgICAgQVZCdWZmZXJQb29sICp0YWJfbXZmX3Bvb2w7CisgICAgQVZCdWZmZXJQb29sICpycGxfdGFiX3Bvb2w7CisKKyAgICAvLy88IGNhbmRpZGF0ZSByZWZlcmVuY2VzIGZvciB0aGUgY3VycmVudCBmcmFtZQorICAgIFJlZlBpY0xpc3QgcnBzWzVdOworCisgICAgU2xpY2VIZWFkZXIgc2g7CisgICAgU0FPUGFyYW1zICpzYW87CisgICAgREJQYXJhbXMgKmRlYmxvY2s7CisgICAgZW51bSBIRVZDTkFMVW5pdFR5cGUgbmFsX3VuaXRfdHlwZTsKKyAgICBpbnQgdGVtcG9yYWxfaWQ7ICAvLy88IHRlbXBvcmFsX2lkX3BsdXMxIC0gMQorICAgIEhFVkNGcmFtZSAqcmVmOworICAgIEhFVkNGcmFtZSBEUEJbMzJdOworICAgIGludCBwb2M7CisgICAgaW50IHBvY1RpZDA7CisgICAgaW50IHNsaWNlX2lkeDsgLy8vPCBudW1iZXIgb2YgdGhlIHNsaWNlIGJlaW5nIGN1cnJlbnRseSBkZWNvZGVkCisgICAgaW50IGVvczsgICAgICAgLy8vPCBjdXJyZW50IHBhY2tldCBjb250YWlucyBhbiBFT1MvRU9CIE5BTAorICAgIGludCBsYXN0X2VvczsgIC8vLzwgbGFzdCBwYWNrZXQgY29udGFpbnMgYW4gRU9TL0VPQiBOQUwKKyAgICBpbnQgbWF4X3JhOworICAgIGludCBic193aWR0aDsKKyAgICBpbnQgYnNfaGVpZ2h0OworCisgICAgaW50IGlzX2RlY29kZWQ7CisgICAgaW50IG5vX3Jhc2xfb3V0cHV0X2ZsYWc7CisKKyAgICBIRVZDUHJlZENvbnRleHQgaHBjOworICAgIEhFVkNEU1BDb250ZXh0IGhldmNkc3A7CisgICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7CisgICAgQnN3YXBEU1BDb250ZXh0IGJkc3A7CisgICAgaW50OF90ICpxcF95X3RhYjsKKyAgICB1aW50OF90ICpob3Jpem9udGFsX2JzOworICAgIHVpbnQ4X3QgKnZlcnRpY2FsX2JzOworCisgICAgaW50MzJfdCAqdGFiX3NsaWNlX2FkZHJlc3M7CisKKyAgICAvLyAgQ1UKKyAgICB1aW50OF90ICpza2lwX2ZsYWc7CisgICAgdWludDhfdCAqdGFiX2N0X2RlcHRoOworICAgIC8vIFBVCisgICAgdWludDhfdCAqdGFiX2lwbTsKKworICAgIHVpbnQ4X3QgKmNiZl9sdW1hOyAvLyBjYmZfbHVtYSBvZiBjb2xvY2F0ZWQgVFUKKyAgICB1aW50OF90ICppc19wY207CisKKyAgICAvLyBDVEItbGV2ZWwgZmxhZ3MgYWZmZWN0aW5nIGxvb3AgZmlsdGVyIG9wZXJhdGlvbgorICAgIHVpbnQ4X3QgKmZpbHRlcl9zbGljZV9lZGdlczsKKworICAgIC8qKiB1c2VkIG9uIEJFIHRvIGJ5dGVzd2FwIHRoZSBsaW5lcyBmb3IgY2hlY2tzdW1taW5nICovCisgICAgdWludDhfdCAqY2hlY2tzdW1fYnVmOworICAgIGludCAgICAgIGNoZWNrc3VtX2J1Zl9zaXplOworCisgICAgLyoqCisgICAgICogU2VxdWVuY2UgY291bnRlcnMgZm9yIGRlY29kZWQgYW5kIG91dHB1dCBmcmFtZXMsIHNvIHRoYXQgb2xkCisgICAgICogZnJhbWVzIGFyZSBvdXRwdXQgZmlyc3QgYWZ0ZXIgYSBQT0MgcmVzZXQKKyAgICAgKi8KKyAgICB1aW50MTZfdCBzZXFfZGVjb2RlOworICAgIHVpbnQxNl90IHNlcV9vdXRwdXQ7CisKKyAgICBpbnQgZW5hYmxlX3BhcmFsbGVsX3RpbGVzOworICAgIGF0b21pY19pbnQgd3BwX2VycjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisKKyAgICBIMjY0NVBhY2tldCBwa3Q7CisgICAgLy8gdHlwZSBvZiB0aGUgZmlyc3QgVkNMIE5BTCBvZiB0aGUgY3VycmVudCBmcmFtZQorICAgIGVudW0gSEVWQ05BTFVuaXRUeXBlIGZpcnN0X25hbF90eXBlOworCisgICAgdWludDhfdCBjb250ZXh0X2luaXRpYWxpemVkOworICAgIGludCBpc19uYWxmZjsgICAgICAgICAgIC8vLzwgdGhpcyBmbGFnIGlzICE9IDAgaWYgYml0c3RyZWFtIGlzIGVuY2Fwc3VsYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYXMgYSBmb3JtYXQgZGVmaW5lZCBpbiAxNDQ5Ni0xNQorICAgIGludCBhcHBseV9kZWZkaXNwd2luOworCisgICAgaW50IG5hbF9sZW5ndGhfc2l6ZTsgICAgLy8vPCBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgbmFsIGxlbmd0aCAoMSwgMiBvciA0KQorICAgIGludCBudWhfbGF5ZXJfaWQ7Cit9IEhFVkNDb250ZXh0OworCisvKioKKyAqIE1hcmsgYWxsIGZyYW1lcyBpbiBEUEIgYXMgdW51c2VkIGZvciByZWZlcmVuY2UuCisgKi8KK3ZvaWQgZmZfaGV2Y19jbGVhcl9yZWZzKEhFVkNDb250ZXh0ICpzKTsKKworLyoqCisgKiBEcm9wIGFsbCBmcmFtZXMgY3VycmVudGx5IGluIERQQi4KKyAqLwordm9pZCBmZl9oZXZjX2ZsdXNoX2RwYihIRVZDQ29udGV4dCAqcyk7CisKK1JlZlBpY0xpc3QgKmZmX2hldmNfZ2V0X3JlZl9saXN0KEhFVkNDb250ZXh0ICpzLCBIRVZDRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgwLCBpbnQgeTApOworCisvKioKKyAqIENvbnN0cnVjdCB0aGUgcmVmZXJlbmNlIHBpY3R1cmUgc2V0cyBmb3IgdGhlIGN1cnJlbnQgZnJhbWUuCisgKi8KK2ludCBmZl9oZXZjX2ZyYW1lX3JwcyhIRVZDQ29udGV4dCAqcyk7CisKKy8qKgorICogQ29uc3RydWN0IHRoZSByZWZlcmVuY2UgcGljdHVyZSBsaXN0KHMpIGZvciB0aGUgY3VycmVudCBzbGljZS4KKyAqLworaW50IGZmX2hldmNfc2xpY2VfcnBsKEhFVkNDb250ZXh0ICpzKTsKKwordm9pZCBmZl9oZXZjX3NhdmVfc3RhdGVzKEhFVkNDb250ZXh0ICpzLCBpbnQgY3RiX2FkZHJfdHMpOworaW50IGZmX2hldmNfY2FiYWNfaW5pdChIRVZDQ29udGV4dCAqcywgaW50IGN0Yl9hZGRyX3RzKTsKK2ludCBmZl9oZXZjX3Nhb19tZXJnZV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19zYW9fdHlwZV9pZHhfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX3Nhb19iYW5kX3Bvc2l0aW9uX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19zYW9fb2Zmc2V0X2Fic19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfc2FvX29mZnNldF9zaWduX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19zYW9fZW9fY2xhc3NfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX2VuZF9vZl9zbGljZV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19jdV90cmFuc3F1YW50X2J5cGFzc19mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19za2lwX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfY2IsIGludCB5X2NiKTsKK2ludCBmZl9oZXZjX3ByZWRfbW9kZV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfc3BsaXRfY29kaW5nX3VuaXRfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBjdF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4MCwgaW50IHkwKTsKK2ludCBmZl9oZXZjX3BhcnRfbW9kZV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBsb2cyX2NiX3NpemUpOworaW50IGZmX2hldmNfcGNtX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX3ByZXZfaW50cmFfbHVtYV9wcmVkX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX21wbV9pZHhfZGVjb2RlKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX3JlbV9pbnRyYV9sdW1hX3ByZWRfbW9kZV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfaW50cmFfY2hyb21hX3ByZWRfbW9kZV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfbWVyZ2VfaWR4X2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19tZXJnZV9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19pbnRlcl9wcmVkX2lkY19kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCBuUGJXLCBpbnQgblBiSCk7CitpbnQgZmZfaGV2Y19yZWZfaWR4X2x4X2RlY29kZShIRVZDQ29udGV4dCAqcywgaW50IG51bV9yZWZfaWR4X2x4KTsKK2ludCBmZl9oZXZjX212cF9seF9mbGFnX2RlY29kZShIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19ub19yZXNpZHVhbF9zeW50YXhfZmxhZ19kZWNvZGUoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfc3BsaXRfdHJhbnNmb3JtX2ZsYWdfZGVjb2RlKEhFVkNDb250ZXh0ICpzLCBpbnQgbG9nMl90cmFmb19zaXplKTsKK2ludCBmZl9oZXZjX2NiZl9jYl9jcl9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCB0cmFmb19kZXB0aCk7CitpbnQgZmZfaGV2Y19jYmZfbHVtYV9kZWNvZGUoSEVWQ0NvbnRleHQgKnMsIGludCB0cmFmb19kZXB0aCk7CitpbnQgZmZfaGV2Y19sb2cyX3Jlc19zY2FsZV9hYnMoSEVWQ0NvbnRleHQgKnMsIGludCBpZHgpOworaW50IGZmX2hldmNfcmVzX3NjYWxlX3NpZ25fZmxhZyhIRVZDQ29udGV4dCAqcywgaW50IGlkeCk7CisKKy8qKgorICogR2V0IHRoZSBudW1iZXIgb2YgY2FuZGlkYXRlIHJlZmVyZW5jZXMgZm9yIHRoZSBjdXJyZW50IGZyYW1lLgorICovCitpbnQgZmZfaGV2Y19mcmFtZV9uYl9yZWZzKGNvbnN0IEhFVkNDb250ZXh0ICpzKTsKKworaW50IGZmX2hldmNfc2V0X25ld19yZWYoSEVWQ0NvbnRleHQgKnMsIEFWRnJhbWUgKipmcmFtZSwgaW50IHBvYyk7CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBmZl9oZXZjX25hbF9pc19ub25yZWYoZW51bSBIRVZDTkFMVW5pdFR5cGUgdHlwZSkKK3sKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEhFVkNfTkFMX1RSQUlMX046CisgICAgY2FzZSBIRVZDX05BTF9UU0FfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1NUU0FfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBRExfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1JBU0xfTjoKKyAgICBjYXNlIEhFVkNfTkFMX1ZDTF9OMTA6CisgICAgY2FzZSBIRVZDX05BTF9WQ0xfTjEyOgorICAgIGNhc2UgSEVWQ19OQUxfVkNMX04xNDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBGaW5kIG5leHQgZnJhbWUgaW4gb3V0cHV0IG9yZGVyIGFuZCBwdXQgYSByZWZlcmVuY2UgdG8gaXQgaW4gZnJhbWUuCisgKiBAcmV0dXJuIDEgaWYgYSBmcmFtZSB3YXMgb3V0cHV0LCAwIG90aGVyd2lzZQorICovCitpbnQgZmZfaGV2Y19vdXRwdXRfZnJhbWUoSEVWQ0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmx1c2gpOworCit2b2lkIGZmX2hldmNfYnVtcF9mcmFtZShIRVZDQ29udGV4dCAqcyk7CisKK3ZvaWQgZmZfaGV2Y191bnJlZl9mcmFtZShIRVZDQ29udGV4dCAqcywgSEVWQ0ZyYW1lICpmcmFtZSwgaW50IGZsYWdzKTsKKwordm9pZCBmZl9oZXZjX3NldF9uZWlnaGJvdXJfYXZhaWxhYmxlKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBiVywgaW50IG5QYkgpOwordm9pZCBmZl9oZXZjX2x1bWFfbXZfbWVyZ2VfbW9kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGJXLCBpbnQgblBiSCwgaW50IGxvZzJfY2Jfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcnRfaWR4LCBpbnQgbWVyZ2VfaWR4LCBNdkZpZWxkICptdik7Cit2b2lkIGZmX2hldmNfbHVtYV9tdl9tdnBfbW9kZShIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBiVywgaW50IG5QYkgsIGludCBsb2cyX2NiX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFydF9pZHgsIGludCBtZXJnZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdkZpZWxkICptdiwgaW50IG12cF9seF9mbGFnLCBpbnQgTFgpOwordm9pZCBmZl9oZXZjX3NldF9xUHkoSEVWQ0NvbnRleHQgKnMsIGludCB4QmFzZSwgaW50IHlCYXNlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfY2Jfc2l6ZSk7Cit2b2lkIGZmX2hldmNfZGVibG9ja2luZ19ib3VuZGFyeV9zdHJlbmd0aHMoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX3RyYWZvX3NpemUpOworaW50IGZmX2hldmNfY3VfcXBfZGVsdGFfc2lnbl9mbGFnKEhFVkNDb250ZXh0ICpzKTsKK2ludCBmZl9oZXZjX2N1X3FwX2RlbHRhX2FicyhIRVZDQ29udGV4dCAqcyk7CitpbnQgZmZfaGV2Y19jdV9jaHJvbWFfcXBfb2Zmc2V0X2ZsYWcoSEVWQ0NvbnRleHQgKnMpOworaW50IGZmX2hldmNfY3VfY2hyb21hX3FwX29mZnNldF9pZHgoSEVWQ0NvbnRleHQgKnMpOwordm9pZCBmZl9oZXZjX2hsc19maWx0ZXIoSEVWQ0NvbnRleHQgKnMsIGludCB4LCBpbnQgeSwgaW50IGN0Yl9zaXplKTsKK3ZvaWQgZmZfaGV2Y19obHNfZmlsdGVycyhIRVZDQ29udGV4dCAqcywgaW50IHhfY3RiLCBpbnQgeV9jdGIsIGludCBjdGJfc2l6ZSk7Cit2b2lkIGZmX2hldmNfaGxzX3Jlc2lkdWFsX2NvZGluZyhIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl90cmFmb19zaXplLCBlbnVtIFNjYW5UeXBlIHNjYW5faWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNfaWR4KTsKKwordm9pZCBmZl9oZXZjX2hsc19tdmRfY29kaW5nKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwgaW50IGxvZzJfY2Jfc2l6ZSk7CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX2hldmNfcXBlbF9leHRyYV9iZWZvcmVbNF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX3FwZWxfZXh0cmFfYWZ0ZXJbNF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl9oZXZjX3FwZWxfZXh0cmFbNF07CisKKyNlbmRpZiAvKiBBVkNPREVDX0hFVkNERUNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oZXZjZHNwLmMgYi9saWJhdmNvZGVjL2hldmNkc3AuYwppbmRleCA5ZDc3M2Q5Li45NTdlNDBkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hldmNkc3AuYworKysgYi9saWJhdmNvZGVjL2hldmNkc3AuYwpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgOTAsIC05MCwgIDg4LCAtODUsICA4MiwgLTc4LCAgNzMsIC02NywgIDYxLCAtNTQsICA0NiwgLTM4LCAgMzEsIC0yMiwgIDEzLCAgLTQgfSwKIH07CiAKLURFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgaW50OF90LCBmZl9oZXZjX2VwZWxfZmlsdGVyc1s3XVs0XSkgPSB7CitERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IGludDhfdCwgZmZfaGV2Y19lcGVsX2ZpbHRlcnMpWzddWzRdID0gewogICAgIHsgLTIsIDU4LCAxMCwgLTJ9LAogICAgIHsgLTQsIDU0LCAxNiwgLTJ9LAogICAgIHsgLTYsIDQ2LCAyOCwgLTR9LApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgeyAtMiwgMTAsIDU4LCAtMn0sCiB9OwogCi1ERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IGludDhfdCwgZmZfaGV2Y19xcGVsX2ZpbHRlcnNbM11bMTZdKSA9IHsKK0RFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgaW50OF90LCBmZl9oZXZjX3FwZWxfZmlsdGVycylbM11bMTZdID0gewogICAgIHsgLTEsICA0LC0xMCwgNTgsIDE3LCAtNSwgIDEsICAwLCAtMSwgIDQsLTEwLCA1OCwgMTcsIC01LCAgMSwgIDB9LAogICAgIHsgLTEsICA0LC0xMSwgNDAsIDQwLC0xMSwgIDQsIC0xLCAtMSwgIDQsLTExLCA0MCwgNDAsLTExLCAgNCwgLTF9LAogICAgIHsgIDAsICAxLCAtNSwgMTcsIDU4LC0xMCwgIDQsIC0xLCAgMCwgIDEsIC01LCAxNywgNTgsLTEwLCAgNCwgLTF9CkBAIC0xOTUsMTMgKzE5NSwxMyBAQAogCiAjZGVmaW5lIEhFVkNfRFNQKGRlcHRoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGhldmNkc3AtPnB1dF9wY20gICAgICAgICAgICAgICAgPSBGVU5DKHB1dF9wY20sIGRlcHRoKTsgICAgICAgICAgICAgICAgIFwKLSAgICBoZXZjZHNwLT50cmFuc2Zvcm1fYWRkWzBdICAgICAgID0gRlVOQyh0cmFuc2Zvcm1fYWRkNHg0LCBkZXB0aCk7ICAgICAgICBcCi0gICAgaGV2Y2RzcC0+dHJhbnNmb3JtX2FkZFsxXSAgICAgICA9IEZVTkModHJhbnNmb3JtX2FkZDh4OCwgZGVwdGgpOyAgICAgICAgXAotICAgIGhldmNkc3AtPnRyYW5zZm9ybV9hZGRbMl0gICAgICAgPSBGVU5DKHRyYW5zZm9ybV9hZGQxNngxNiwgZGVwdGgpOyAgICAgIFwKLSAgICBoZXZjZHNwLT50cmFuc2Zvcm1fYWRkWzNdICAgICAgID0gRlVOQyh0cmFuc2Zvcm1fYWRkMzJ4MzIsIGRlcHRoKTsgICAgICBcCi0gICAgaGV2Y2RzcC0+dHJhbnNmb3JtX3NraXAgICAgICAgICA9IEZVTkModHJhbnNmb3JtX3NraXAsIGRlcHRoKTsgICAgICAgICAgXAorICAgIGhldmNkc3AtPmFkZF9yZXNpZHVhbFswXSAgICAgICAgPSBGVU5DKGFkZF9yZXNpZHVhbDR4NCwgZGVwdGgpOyAgICAgICAgIFwKKyAgICBoZXZjZHNwLT5hZGRfcmVzaWR1YWxbMV0gICAgICAgID0gRlVOQyhhZGRfcmVzaWR1YWw4eDgsIGRlcHRoKTsgICAgICAgICBcCisgICAgaGV2Y2RzcC0+YWRkX3Jlc2lkdWFsWzJdICAgICAgICA9IEZVTkMoYWRkX3Jlc2lkdWFsMTZ4MTYsIGRlcHRoKTsgICAgICAgXAorICAgIGhldmNkc3AtPmFkZF9yZXNpZHVhbFszXSAgICAgICAgPSBGVU5DKGFkZF9yZXNpZHVhbDMyeDMyLCBkZXB0aCk7ICAgICAgIFwKKyAgICBoZXZjZHNwLT5kZXF1YW50ICAgICAgICAgICAgICAgID0gRlVOQyhkZXF1YW50LCBkZXB0aCk7ICAgICAgICAgICAgICAgICBcCiAgICAgaGV2Y2RzcC0+dHJhbnNmb3JtX3JkcGNtICAgICAgICA9IEZVTkModHJhbnNmb3JtX3JkcGNtLCBkZXB0aCk7ICAgICAgICAgXAotICAgIGhldmNkc3AtPmlkY3RfNHg0X2x1bWEgICAgICAgICAgPSBGVU5DKHRyYW5zZm9ybV80eDRfbHVtYSwgZGVwdGgpOyAgICAgIFwKKyAgICBoZXZjZHNwLT50cmFuc2Zvcm1fNHg0X2x1bWEgICAgID0gRlVOQyh0cmFuc2Zvcm1fNHg0X2x1bWEsIGRlcHRoKTsgICAgICBcCiAgICAgaGV2Y2RzcC0+aWRjdFswXSAgICAgICAgICAgICAgICA9IEZVTkMoaWRjdF80eDQsIGRlcHRoKTsgICAgICAgICAgICAgICAgXAogICAgIGhldmNkc3AtPmlkY3RbMV0gICAgICAgICAgICAgICAgPSBGVU5DKGlkY3RfOHg4LCBkZXB0aCk7ICAgICAgICAgICAgICAgIFwKICAgICBoZXZjZHNwLT5pZGN0WzJdICAgICAgICAgICAgICAgID0gRlVOQyhpZGN0XzE2eDE2LCBkZXB0aCk7ICAgICAgICAgICAgICBcCkBAIC0yNTcsMTAgKzI1NywxMiBAQAogICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX2hldmNfZHNwX2luaXRfYXJtKGhldmNkc3AsIGJpdF9kZXB0aCk7CisgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICBmZl9oZXZjX2RzcF9pbml0X3BwYyhoZXZjZHNwLCBiaXRfZGVwdGgpOwogICAgIGlmIChBUkNIX1g4NikKICAgICAgICAgZmZfaGV2Y19kc3BfaW5pdF94ODYoaGV2Y2RzcCwgYml0X2RlcHRoKTsKLSAgICBpZiAoQVJDSF9BUk0pCi0gICAgICAgIGZmX2hldmNkc3BfaW5pdF9hcm0oaGV2Y2RzcCwgYml0X2RlcHRoKTsKICAgICBpZiAoQVJDSF9NSVBTKQogICAgICAgICBmZl9oZXZjX2RzcF9pbml0X21pcHMoaGV2Y2RzcCwgYml0X2RlcHRoKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y2RzcC5oIGIvbGliYXZjb2RlYy9oZXZjZHNwLmgKaW5kZXggOWYxZjZkZC4uMGFlNjdjYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9oZXZjZHNwLmgKKysrIGIvbGliYXZjb2RlYy9oZXZjZHNwLmgKQEAgLTQ2LDEzICs0NiwxMyBAQAogICAgIHZvaWQgKCpwdXRfcGNtKSh1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgX3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBwY21fYml0X2RlcHRoKTsKIAotICAgIHZvaWQgKCp0cmFuc2Zvcm1fYWRkWzRdKSh1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBfc3RyaWRlKTsKKyAgICB2b2lkICgqYWRkX3Jlc2lkdWFsWzRdKSh1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSk7CiAKLSAgICB2b2lkICgqdHJhbnNmb3JtX3NraXApKGludDE2X3QgKmNvZWZmcywgaW50MTZfdCBsb2cyX3NpemUpOworICAgIHZvaWQgKCpkZXF1YW50KShpbnQxNl90ICpjb2VmZnMsIGludDE2X3QgbG9nMl9zaXplKTsKIAogICAgIHZvaWQgKCp0cmFuc2Zvcm1fcmRwY20pKGludDE2X3QgKmNvZWZmcywgaW50MTZfdCBsb2cyX3NpemUsIGludCBtb2RlKTsKIAotICAgIHZvaWQgKCppZGN0XzR4NF9sdW1hKShpbnQxNl90ICpjb2VmZnMpOworICAgIHZvaWQgKCp0cmFuc2Zvcm1fNHg0X2x1bWEpKGludDE2X3QgKmNvZWZmcyk7CiAKICAgICB2b2lkICgqaWRjdFs0XSkoaW50MTZfdCAqY29lZmZzLCBpbnQgY29sX2xpbWl0KTsKIApAQCAtMTI3LDcgKzEyNyw5IEBACiBleHRlcm4gY29uc3QgaW50OF90IGZmX2hldmNfZXBlbF9maWx0ZXJzWzddWzRdOwogZXh0ZXJuIGNvbnN0IGludDhfdCBmZl9oZXZjX3FwZWxfZmlsdGVyc1szXVsxNl07CiAKK3ZvaWQgZmZfaGV2Y19kc3BfaW5pdF9hcm0oSEVWQ0RTUENvbnRleHQgKmMsIGNvbnN0IGludCBiaXRfZGVwdGgpOwordm9pZCBmZl9oZXZjX2RzcF9pbml0X3BwYyhIRVZDRFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCk7CiB2b2lkIGZmX2hldmNfZHNwX2luaXRfeDg2KEhFVkNEU1BDb250ZXh0ICpjLCBjb25zdCBpbnQgYml0X2RlcHRoKTsKLXZvaWQgZmZfaGV2Y2RzcF9pbml0X2FybShIRVZDRFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCk7CiB2b2lkIGZmX2hldmNfZHNwX2luaXRfbWlwcyhIRVZDRFNQQ29udGV4dCAqYywgY29uc3QgaW50IGJpdF9kZXB0aCk7CisKICNlbmRpZiAvKiBBVkNPREVDX0hFVkNEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oZXZjZHNwX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL2hldmNkc3BfdGVtcGxhdGUuYwppbmRleCBiODQwZDE3Li41NmNkOWU2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hldmNkc3BfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2hldmNkc3BfdGVtcGxhdGUuYwpAQCAtMjEsMTIgKzIxLDExIEBACiAgKi8KIAogI2luY2x1ZGUgImdldF9iaXRzLmgiCi0jaW5jbHVkZSAiaGV2Yy5oIgorI2luY2x1ZGUgImhldmNkZWMuaCIKIAogI2luY2x1ZGUgImJpdF9kZXB0aF90ZW1wbGF0ZS5jIgogI2luY2x1ZGUgImhldmNkc3AuaCIKIAotCiBzdGF0aWMgdm9pZCBGVU5DKHB1dF9wY20pKHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBwY21fYml0X2RlcHRoKQogewpAQCAtNDIsOCArNDEsOCBAQAogICAgIH0KIH0KIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKHRyYW5zcXVhbnRfYnlwYXNzKSh1aW50OF90ICpfZHN0LCBpbnQxNl90ICpjb2VmZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBzaXplKQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBGVU5DKGFkZF9yZXNpZHVhbCkodWludDhfdCAqX2RzdCwgaW50MTZfdCAqcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IHNpemUpCiB7CiAgICAgaW50IHgsIHk7CiAgICAgcGl4ZWwgKmRzdCA9IChwaXhlbCAqKV9kc3Q7CkBAIC01MiwzOCArNTEsMzcgQEAKIAogICAgIGZvciAoeSA9IDA7IHkgPCBzaXplOyB5KyspIHsKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7IHgrKykgewotICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbChkc3RbeF0gKyAqY29lZmZzKTsKLSAgICAgICAgICAgIGNvZWZmcysrOworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbChkc3RbeF0gKyAqcmVzKTsKKyAgICAgICAgICAgIHJlcysrOwogICAgICAgICB9CiAgICAgICAgIGRzdCArPSBzdHJpZGU7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBGVU5DKHRyYW5zZm9ybV9hZGQ0eDQpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCitzdGF0aWMgdm9pZCBGVU5DKGFkZF9yZXNpZHVhbDR4NCkodWludDhfdCAqX2RzdCwgaW50MTZfdCAqcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgRlVOQyh0cmFuc3F1YW50X2J5cGFzcykoX2RzdCwgY29lZmZzLCBzdHJpZGUsIDQpOworICAgIEZVTkMoYWRkX3Jlc2lkdWFsKShfZHN0LCByZXMsIHN0cmlkZSwgNCk7CiB9CiAKLXN0YXRpYyB2b2lkIEZVTkModHJhbnNmb3JtX2FkZDh4OCkodWludDhfdCAqX2RzdCwgaW50MTZfdCAqY29lZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3N0YXRpYyB2b2lkIEZVTkMoYWRkX3Jlc2lkdWFsOHg4KSh1aW50OF90ICpfZHN0LCBpbnQxNl90ICpyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICBGVU5DKHRyYW5zcXVhbnRfYnlwYXNzKShfZHN0LCBjb2VmZnMsIHN0cmlkZSwgOCk7CisgICAgRlVOQyhhZGRfcmVzaWR1YWwpKF9kc3QsIHJlcywgc3RyaWRlLCA4KTsKIH0KIAotc3RhdGljIHZvaWQgRlVOQyh0cmFuc2Zvcm1fYWRkMTZ4MTYpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3N0YXRpYyB2b2lkIEZVTkMoYWRkX3Jlc2lkdWFsMTZ4MTYpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgRlVOQyh0cmFuc3F1YW50X2J5cGFzcykoX2RzdCwgY29lZmZzLCBzdHJpZGUsIDE2KTsKKyAgICBGVU5DKGFkZF9yZXNpZHVhbCkoX2RzdCwgcmVzLCBzdHJpZGUsIDE2KTsKIH0KIAotc3RhdGljIHZvaWQgRlVOQyh0cmFuc2Zvcm1fYWRkMzJ4MzIpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKmNvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3N0YXRpYyB2b2lkIEZVTkMoYWRkX3Jlc2lkdWFsMzJ4MzIpKHVpbnQ4X3QgKl9kc3QsIGludDE2X3QgKnJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgRlVOQyh0cmFuc3F1YW50X2J5cGFzcykoX2RzdCwgY29lZmZzLCBzdHJpZGUsIDMyKTsKKyAgICBGVU5DKGFkZF9yZXNpZHVhbCkoX2RzdCwgcmVzLCBzdHJpZGUsIDMyKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBGVU5DKHRyYW5zZm9ybV9yZHBjbSkoaW50MTZfdCAqX2NvZWZmcywgaW50MTZfdCBsb2cyX3NpemUsIGludCBtb2RlKQogewogICAgIGludDE2X3QgKmNvZWZmcyA9IChpbnQxNl90ICopIF9jb2VmZnM7CkBAIC0xMDYsMTMgKzEwNCwxMSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgRlVOQyh0cmFuc2Zvcm1fc2tpcCkoaW50MTZfdCAqX2NvZWZmcywgaW50MTZfdCBsb2cyX3NpemUpCitzdGF0aWMgdm9pZCBGVU5DKGRlcXVhbnQpKGludDE2X3QgKmNvZWZmcywgaW50MTZfdCBsb2cyX3NpemUpCiB7CiAgICAgaW50IHNoaWZ0ICA9IDE1IC0gQklUX0RFUFRIIC0gbG9nMl9zaXplOwogICAgIGludCB4LCB5OwogICAgIGludCBzaXplID0gMSA8PCBsb2cyX3NpemU7Ci0gICAgaW50MTZfdCAqY29lZmZzID0gX2NvZWZmczsKLQogCiAgICAgaWYgKHNoaWZ0ID4gMCkgewogICAgICAgICBpbnQgb2Zmc2V0ID0gMSA8PCAoc2hpZnQgLSAxKTsKQEAgLTEyNSw3ICsxMjEsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzaXplOyB5KyspIHsKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyB4KyspIHsKLSAgICAgICAgICAgICAgICAqY29lZmZzID0gKmNvZWZmcyA8PCAtc2hpZnQ7CisgICAgICAgICAgICAgICAgKmNvZWZmcyA9ICoodWludDE2X3QqKWNvZWZmcyA8PCAtc2hpZnQ7CiAgICAgICAgICAgICAgICAgY29lZmZzKys7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTEzNCw4ICsxMzAsNiBAQAogCiAjZGVmaW5lIFNFVChkc3QsIHgpICAgKGRzdCkgPSAoeCkKICNkZWZpbmUgU0NBTEUoZHN0LCB4KSAoZHN0KSA9IGF2X2NsaXBfaW50MTYoKCh4KSArIGFkZCkgPj4gc2hpZnQpCi0jZGVmaW5lIEFERF9BTkRfU0NBTEUoZHN0LCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGRzdCkgPSBhdl9jbGlwX3BpeGVsKChkc3QpICsgYXZfY2xpcF9pbnQxNigoKHgpICsgYWRkKSA+PiBzaGlmdCkpCiAKICNkZWZpbmUgVFJfNHg0X0xVTUEoZHN0LCBzcmMsIHN0ZXAsIGFzc2lnbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE3NCwxMTIgKzE2OCwxMTMgQEAKIAogI3VuZGVmIFRSXzR4NF9MVU1BCiAKLSNkZWZpbmUgVFJfNChkc3QsIHNyYywgZHN0ZXAsIHNzdGVwLCBhc3NpZ24sIGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjb25zdCBpbnQgZTAgPSA2NCAqIHNyY1swICogc3N0ZXBdICsgNjQgKiBzcmNbMiAqIHNzdGVwXTsgICAgICAgICAgICAgIFwKLSAgICAgICAgY29uc3QgaW50IGUxID0gNjQgKiBzcmNbMCAqIHNzdGVwXSAtIDY0ICogc3JjWzIgKiBzc3RlcF07ICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbnN0IGludCBvMCA9IDgzICogc3JjWzEgKiBzc3RlcF0gKyAzNiAqIHNyY1szICogc3N0ZXBdOyAgICAgICAgICAgICAgXAotICAgICAgICBjb25zdCBpbnQgbzEgPSAzNiAqIHNyY1sxICogc3N0ZXBdIC0gODMgKiBzcmNbMyAqIHNzdGVwXTsgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGFzc2lnbihkc3RbMCAqIGRzdGVwXSwgZTAgKyBvMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhc3NpZ24oZHN0WzEgKiBkc3RlcF0sIGUxICsgbzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXNzaWduKGRzdFsyICogZHN0ZXBdLCBlMSAtIG8xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGFzc2lnbihkc3RbMyAqIGRzdGVwXSwgZTAgLSBvMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBUUl80KGRzdCwgc3JjLCBkc3RlcCwgc3N0ZXAsIGFzc2lnbiwgZW5kKSAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgZTAgPSA2NCAqIHNyY1swICogc3N0ZXBdICsgNjQgKiBzcmNbMiAqIHNzdGVwXTsgXAorICAgICAgICBjb25zdCBpbnQgZTEgPSA2NCAqIHNyY1swICogc3N0ZXBdIC0gNjQgKiBzcmNbMiAqIHNzdGVwXTsgXAorICAgICAgICBjb25zdCBpbnQgbzAgPSA4MyAqIHNyY1sxICogc3N0ZXBdICsgMzYgKiBzcmNbMyAqIHNzdGVwXTsgXAorICAgICAgICBjb25zdCBpbnQgbzEgPSAzNiAqIHNyY1sxICogc3N0ZXBdIC0gODMgKiBzcmNbMyAqIHNzdGVwXTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzAgKiBkc3RlcF0sIGUwICsgbzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzEgKiBkc3RlcF0sIGUxICsgbzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzIgKiBkc3RlcF0sIGUxIC0gbzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NpZ24oZHN0WzMgKiBkc3RlcF0sIGUwIC0gbzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgVFJfOChkc3QsIHNyYywgZHN0ZXAsIHNzdGVwLCBhc3NpZ24sIGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaW50IGVfOFs0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCBvXzhbNF0gPSB7IDAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCBlbmQ7IGogKz0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgb184W2ldICs9IHRyYW5zZm9ybVs0ICogal1baV0gKiBzcmNbaiAqIHNzdGVwXTsgICAgICAgICAgICAgICAgXAotICAgICAgICBUUl80KGVfOCwgc3JjLCAxLCAyICogc3N0ZXAsIFNFVCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXNzaWduKGRzdFtpICogZHN0ZXBdLCBlXzhbaV0gKyBvXzhbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGFzc2lnbihkc3RbKDcgLSBpKSAqIGRzdGVwXSwgZV84W2ldIC0gb184W2ldKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBUUl84KGRzdCwgc3JjLCBkc3RlcCwgc3N0ZXAsIGFzc2lnbiwgZW5kKSAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZV84WzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgb184WzRdID0geyAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IGVuZDsgaiArPSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9fOFtpXSArPSB0cmFuc2Zvcm1bNCAqIGpdW2ldICogc3JjW2ogKiBzc3RlcF07ICAgXAorICAgICAgICBUUl80KGVfOCwgc3JjLCAxLCAyICogc3N0ZXAsIFNFVCwgNCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXNzaWduKGRzdFtpICogZHN0ZXBdLCBlXzhbaV0gKyBvXzhbaV0pOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXNzaWduKGRzdFsoNyAtIGkpICogZHN0ZXBdLCBlXzhbaV0gLSBvXzhbaV0pOyAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgVFJfMTYoZHN0LCBzcmMsIGRzdGVwLCBzc3RlcCwgYXNzaWduLCBlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaW50IGVfMTZbOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCBvXzE2WzhdID0geyAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCBlbmQ7IGogKz0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgb18xNltpXSArPSB0cmFuc2Zvcm1bMiAqIGpdW2ldICogc3JjW2ogKiBzc3RlcF07ICAgICAgICAgICAgICAgXAotICAgICAgICBUUl84KGVfMTYsIHNyYywgMSwgMiAqIHNzdGVwLCBTRVQsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXNzaWduKGRzdFtpICogZHN0ZXBdLCBlXzE2W2ldICsgb18xNltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGFzc2lnbihkc3RbKDE1IC0gaSkgKiBkc3RlcF0sIGVfMTZbaV0gLSBvXzE2W2ldKTsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBUUl8xNihkc3QsIHNyYywgZHN0ZXAsIHNzdGVwLCBhc3NpZ24sIGVuZCkgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZV8xNls4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgb18xNls4XSA9IHsgMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IGVuZDsgaiArPSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9fMTZbaV0gKz0gdHJhbnNmb3JtWzIgKiBqXVtpXSAqIHNyY1tqICogc3N0ZXBdOyAgXAorICAgICAgICBUUl84KGVfMTYsIHNyYywgMSwgMiAqIHNzdGVwLCBTRVQsIDgpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXNzaWduKGRzdFtpICogZHN0ZXBdLCBlXzE2W2ldICsgb18xNltpXSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgYXNzaWduKGRzdFsoMTUgLSBpKSAqIGRzdGVwXSwgZV8xNltpXSAtIG9fMTZbaV0pOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgVFJfMzIoZHN0LCBzcmMsIGRzdGVwLCBzc3RlcCwgYXNzaWduLCBlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaW50IGVfMzJbMTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCBvXzMyWzE2XSA9IHsgMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCBlbmQ7IGogKz0gMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgb18zMltpXSArPSB0cmFuc2Zvcm1bal1baV0gKiBzcmNbaiAqIHNzdGVwXTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBUUl8xNihlXzMyLCBzcmMsIDEsIDIgKiBzc3RlcCwgU0VULCBlbmQvMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXNzaWduKGRzdFtpICogZHN0ZXBdLCBlXzMyW2ldICsgb18zMltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGFzc2lnbihkc3RbKDMxIC0gaSkgKiBkc3RlcF0sIGVfMzJbaV0gLSBvXzMyW2ldKTsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBUUl8zMihkc3QsIHNyYywgZHN0ZXAsIHNzdGVwLCBhc3NpZ24sIGVuZCkgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZV8zMlsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgb18zMlsxNl0gPSB7IDAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IGVuZDsgaiArPSAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG9fMzJbaV0gKz0gdHJhbnNmb3JtW2pdW2ldICogc3JjW2ogKiBzc3RlcF07ICAgICAgXAorICAgICAgICBUUl8xNihlXzMyLCBzcmMsIDEsIDIgKiBzc3RlcCwgU0VULCBlbmQgLyAyKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXNzaWduKGRzdFtpICogZHN0ZXBdLCBlXzMyW2ldICsgb18zMltpXSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgYXNzaWduKGRzdFsoMzEgLSBpKSAqIGRzdGVwXSwgZV8zMltpXSAtIG9fMzJbaV0pOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgSURDVF9WQVI0KEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICBsaW1pdDIgICA9IEZGTUlOKGNvbF9saW1pdCArIDQsIEgpCi0jZGVmaW5lIElEQ1RfVkFSOChIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCAgICAgIGxpbWl0ICAgPSBGRk1JTihjb2xfbGltaXQsIEgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCAgICAgIGxpbWl0MiAgID0gRkZNSU4oY29sX2xpbWl0ICsgNCwgSCkKKyNkZWZpbmUgSURDVF9WQVI0KEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbGltaXQyID0gRkZNSU4oY29sX2xpbWl0ICsgNCwgSCkKKyNkZWZpbmUgSURDVF9WQVI4KEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbGltaXQgID0gRkZNSU4oY29sX2xpbWl0LCBIKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbGltaXQyID0gRkZNSU4oY29sX2xpbWl0ICsgNCwgSCkKICNkZWZpbmUgSURDVF9WQVIxNihIKSAgIElEQ1RfVkFSOChIKQogI2RlZmluZSBJRENUX1ZBUjMyKEgpICAgSURDVF9WQVI4KEgpCiAKLSNkZWZpbmUgSURDVChIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgRlVOQyhpZGN0XyMjSCAjI3ggIyNIICkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgaW50MTZfdCAqY29lZmZzLCBpbnQgY29sX2xpbWl0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgIHNoaWZ0ICAgPSA3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgYWRkICAgICA9IDEgPDwgKHNoaWZ0IC0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQxNl90ICpzcmMgICAgID0gY29lZmZzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIElEQ1RfVkFSICMjSChIKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGkgPSAwOyBpIDwgSDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBUUl8gIyMgSChzcmMsIHNyYywgSCwgSCwgU0NBTEUsIGxpbWl0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChsaW1pdDIgPCBIICYmIGklNCA9PSAwICYmICEhaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGxpbWl0MiAtPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNoaWZ0ICAgPSAyMCAtIEJJVF9ERVBUSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYWRkICAgICA9IDEgPDwgKHNoaWZ0IC0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGkgPSAwOyBpIDwgSDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBUUl8gIyMgSChjb2VmZnMsIGNvZWZmcywgMSwgMSwgU0NBTEUsIGxpbWl0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvZWZmcyArPSBIOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBJRENUKEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQyhpZGN0XyAjIyBIICMjIHggIyMgSCApKGludDE2X3QgKmNvZWZmcywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2xfbGltaXQpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgIHNoaWZ0ID0gNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgIGFkZCAgID0gMSA8PCAoc2hpZnQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDE2X3QgKnNyYyAgID0gY29lZmZzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElEQ1RfVkFSICMjIEgoSCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBIOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUUl8gIyMgSChzcmMsIHNyYywgSCwgSCwgU0NBTEUsIGxpbWl0Mik7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobGltaXQyIDwgSCAmJiBpJTQgPT0gMCAmJiAhIWkpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbGltaXQyIC09IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNoaWZ0ID0gMjAgLSBCSVRfREVQVEg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFkZCAgID0gMSA8PCAoc2hpZnQgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBIOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUUl8gIyMgSChjb2VmZnMsIGNvZWZmcywgMSwgMSwgU0NBTEUsIGxpbWl0KTsgICAgICAgICAgICAgXAorICAgICAgICBjb2VmZnMgKz0gSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCi0jZGVmaW5lIElEQ1RfREMoSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkIEZVTkMoaWRjdF8jI0ggIyN4ICMjSCAjI19kYykoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvZWZmcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgICAgICBzaGlmdCAgID0gMTQgLSBCSVRfREVQVEg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCAgICAgIGFkZCAgICAgPSAxIDw8IChzaGlmdCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50ICAgICAgY29lZmYgICA9ICgoKGNvZWZmc1swXSArIDEpID4+IDEpICsgYWRkKSA+PiBzaGlmdDsgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoaiA9IDA7IGogPCBIOyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBIOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvZWZmc1tpK2oqSF0gPSBjb2VmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgSURDVF9EQyhIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkMoaWRjdF8gIyMgSCAjIyB4ICMjIEggIyMgX2RjKShpbnQxNl90ICpjb2VmZnMpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgc2hpZnQgPSAxNCAtIEJJVF9ERVBUSDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYWRkICAgPSAxIDw8IChzaGlmdCAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY29lZmYgPSAoKChjb2VmZnNbMF0gKyAxKSA+PiAxKSArIGFkZCkgPj4gc2hpZnQ7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGogPSAwOyBqIDwgSDsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvZWZmc1tpICsgaiAqIEhdID0gY29lZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogSURDVCggNCkKQEAgLTI5OSw3ICsyOTQsNiBAQAogCiAjdW5kZWYgU0VUCiAjdW5kZWYgU0NBTEUKLSN1bmRlZiBBRERfQU5EX1NDQUxFCiAKIHN0YXRpYyB2b2lkIEZVTkMoc2FvX2JhbmRfZmlsdGVyKSh1aW50OF90ICpfZHN0LCB1aW50OF90ICpfc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBwdHJkaWZmX3Qgc3RyaWRlX3NyYywKQEAgLTM5OSw4ICszOTMsOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChib3JkZXJzWzNdKSB7CiAgICAgICAgICAgICBpbnQgb2Zmc2V0X3ZhbCAgID0gc2FvX29mZnNldF92YWxbMF07Ci0gICAgICAgICAgICBpbnQgeV9zdHJpZGVfZHN0ID0gc3RyaWRlX2RzdCAqIChoZWlnaHQgLSAxKTsKLSAgICAgICAgICAgIGludCB5X3N0cmlkZV9zcmMgPSBzdHJpZGVfc3JjICogKGhlaWdodCAtIDEpOworICAgICAgICAgICAgcHRyZGlmZl90IHlfc3RyaWRlX2RzdCA9IHN0cmlkZV9kc3QgKiAoaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICBwdHJkaWZmX3QgeV9zdHJpZGVfc3JjID0gc3RyaWRlX3NyYyAqIChoZWlnaHQgLSAxKTsKICAgICAgICAgICAgIGZvciAoeCA9IGluaXRfeDsgeCA8IHdpZHRoOyB4KyspCiAgICAgICAgICAgICAgICAgZHN0W3ggKyB5X3N0cmlkZV9kc3RdID0gYXZfY2xpcF9waXhlbChzcmNbeCArIHlfc3RyaWRlX3NyY10gKyBvZmZzZXRfdmFsKTsKICAgICAgICAgICAgIGhlaWdodC0tOwpAQCAtNDUwLDggKzQ0NCw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGJvcmRlcnNbM10pIHsKICAgICAgICAgICAgIGludCBvZmZzZXRfdmFsICAgPSBzYW9fb2Zmc2V0X3ZhbFswXTsKLSAgICAgICAgICAgIGludCB5X3N0cmlkZV9kc3QgPSBzdHJpZGVfZHN0ICogKGhlaWdodCAtIDEpOwotICAgICAgICAgICAgaW50IHlfc3RyaWRlX3NyYyA9IHN0cmlkZV9zcmMgKiAoaGVpZ2h0IC0gMSk7CisgICAgICAgICAgICBwdHJkaWZmX3QgeV9zdHJpZGVfZHN0ID0gc3RyaWRlX2RzdCAqIChoZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIHB0cmRpZmZfdCB5X3N0cmlkZV9zcmMgPSBzdHJpZGVfc3JjICogKGhlaWdodCAtIDEpOwogICAgICAgICAgICAgZm9yICh4ID0gaW5pdF94OyB4IDwgd2lkdGg7IHgrKykKICAgICAgICAgICAgICAgICBkc3RbeCArIHlfc3RyaWRlX2RzdF0gPSBhdl9jbGlwX3BpeGVsKHNyY1t4ICsgeV9zdHJpZGVfc3JjXSArIG9mZnNldF92YWwpOwogICAgICAgICAgICAgaGVpZ2h0LS07CkBAIC01OTksNyArNTkzLDcgQEAKICAgICBveDEgICAgID0gb3gxICogKDEgPDwgKEJJVF9ERVBUSCAtIDgpKTsKICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKLSAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKCAoc3JjW3hdIDw8ICgxNCAtIEJJVF9ERVBUSCkpICogd3gxICsgc3JjMlt4XSAqIHd4MCArICgob3gwICsgb3gxICsgMSkgPDwgbG9nMldkKSkgPj4gKGxvZzJXZCArIDEpKTsKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKCAoc3JjW3hdIDw8ICgxNCAtIEJJVF9ERVBUSCkpICogd3gxICsgc3JjMlt4XSAqIHd4MCArIChveDAgKyBveDEgKyAxKSAqICgxIDw8IGxvZzJXZCkpID4+IChsb2cyV2QgKyAxKSk7CiAgICAgICAgIH0KICAgICAgICAgc3JjICArPSBzcmNzdHJpZGU7CiAgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOwpAQCAtOTIxLDcgKzkxNSw3IEBACiAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQogICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF9waXhlbCgoKFFQRUxfRklMVEVSKHNyYywgMSkgPj4gKEJJVF9ERVBUSCAtIDgpKSAqIHd4MSArIHNyYzJbeF0gKiB3eDAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChveDAgKyBveDEgKyAxKSA8PCBsb2cyV2QpKSA+PiAobG9nMldkICsgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChveDAgKyBveDEgKyAxKSAqICgxIDw8IGxvZzJXZCkpKSA+PiAobG9nMldkICsgMSkpOwogICAgICAgICBzcmMgICs9IHNyY3N0cmlkZTsKICAgICAgICAgZHN0ICArPSBkc3RzdHJpZGU7CiAgICAgICAgIHNyYzIgKz0gTUFYX1BCX1NJWkU7CkBAIC05NzYsNyArOTcwLDcgQEAKICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCiAgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoUVBFTF9GSUxURVIoc3JjLCBzcmNzdHJpZGUpID4+IChCSVRfREVQVEggLSA4KSkgKiB3eDEgKyBzcmMyW3hdICogd3gwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgPDwgbG9nMldkKSkgPj4gKGxvZzJXZCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgKiAoMSA8PCBsb2cyV2QpKSkgPj4gKGxvZzJXZCArIDEpKTsKICAgICAgICAgc3JjICArPSBzcmNzdHJpZGU7CiAgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOwogICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOwpAQCAtMTA1Nyw3ICsxMDUxLDcgQEAKICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCiAgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoUVBFTF9GSUxURVIodG1wLCBNQVhfUEJfU0laRSkgPj4gNikgKiB3eDEgKyBzcmMyW3hdICogd3gwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgPDwgbG9nMldkKSkgPj4gKGxvZzJXZCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgKiAoMSA8PCBsb2cyV2QpKSkgPj4gKGxvZzJXZCArIDEpKTsKICAgICAgICAgdG1wICArPSBNQVhfUEJfU0laRTsKICAgICAgICAgZHN0ICArPSBkc3RzdHJpZGU7CiAgICAgICAgIHNyYzIgKz0gTUFYX1BCX1NJWkU7CkBAIC0xMzYxLDcgKzEzNTUsNyBAQAogICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKICAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChFUEVMX0ZJTFRFUihzcmMsIDEpID4+IChCSVRfREVQVEggLSA4KSkgKiB3eDEgKyBzcmMyW3hdICogd3gwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgPDwgbG9nMldkKSkgPj4gKGxvZzJXZCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgKiAoMSA8PCBsb2cyV2QpKSkgPj4gKGxvZzJXZCArIDEpKTsKICAgICAgICAgc3JjICArPSBzcmNzdHJpZGU7CiAgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOwogICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOwpAQCAtMTQxMyw3ICsxNDA3LDcgQEAKICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCiAgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3BpeGVsKCgoRVBFTF9GSUxURVIoc3JjLCBzcmNzdHJpZGUpID4+IChCSVRfREVQVEggLSA4KSkgKiB3eDEgKyBzcmMyW3hdICogd3gwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgPDwgbG9nMldkKSkgPj4gKGxvZzJXZCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgob3gwICsgb3gxICsgMSkgKiAoMSA8PCBsb2cyV2QpKSkgPj4gKGxvZzJXZCArIDEpKTsKICAgICAgICAgc3JjICArPSBzcmNzdHJpZGU7CiAgICAgICAgIGRzdCAgKz0gZHN0c3RyaWRlOwogICAgICAgICBzcmMyICs9IE1BWF9QQl9TSVpFOwpAQCAtMTQ5MiwxMiArMTQ4NiwxNCBAQAogICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewogICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKICAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfcGl4ZWwoKChFUEVMX0ZJTFRFUih0bXAsIE1BWF9QQl9TSVpFKSA+PiA2KSAqIHd4MSArIHNyYzJbeF0gKiB3eDAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChveDAgKyBveDEgKyAxKSA8PCBsb2cyV2QpKSA+PiAobG9nMldkICsgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChveDAgKyBveDEgKyAxKSAqICgxIDw8IGxvZzJXZCkpKSA+PiAobG9nMldkICsgMSkpOwogICAgICAgICB0bXAgICs9IE1BWF9QQl9TSVpFOwogICAgICAgICBkc3QgICs9IGRzdHN0cmlkZTsKICAgICAgICAgc3JjMiArPSBNQVhfUEJfU0laRTsKICAgICB9Ci19Ly8gbGluZSB6ZXJvCit9CisKKy8vIGxpbmUgemVybwogI2RlZmluZSBQMyBwaXhbLTQgKiB4c3RyaWRlXQogI2RlZmluZSBQMiBwaXhbLTMgKiB4c3RyaWRlXQogI2RlZmluZSBQMSBwaXhbLTIgKiB4c3RyaWRlXQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9oZXZjcHJlZC5jIGIvbGliYXZjb2RlYy9oZXZjcHJlZC5jCmluZGV4IDAyYzE3NjYuLjdhODZlZDMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaGV2Y3ByZWQuYworKysgYi9saWJhdmNvZGVjL2hldmNwcmVkLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSAiaGV2Yy5oIgorI2luY2x1ZGUgImhldmNkZWMuaCIKIAogI2luY2x1ZGUgImhldmNwcmVkLmgiCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaGV2Y3ByZWRfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvaGV2Y3ByZWRfdGVtcGxhdGUuYwppbmRleCA2YWU4N2NjLi42ZmUzMzU0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hldmNwcmVkX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9oZXZjcHJlZF90ZW1wbGF0ZS5jCkBAIC0zNSw3ICszNSw3IEBACiAjZGVmaW5lIE1WRih4LCB5KSBcCiAgICAgKHMtPnJlZi0+dGFiX212ZlsoeCkgKyAoeSkgKiBtaW5fcHVfd2lkdGhdKQogI2RlZmluZSBNVkZfUFUoeCwgeSkgXAotICAgIE1WRihQVSh4MCArICgoeCkgPDwgaHNoaWZ0KSksIFBVKHkwICsgKCh5KSA8PCB2c2hpZnQpKSkKKyAgICBNVkYoUFUoeDAgKyAoKHgpICogKDEgPDwgaHNoaWZ0KSkpLCBQVSh5MCArICgoeSkgKiAoMSA8PCB2c2hpZnQpKSkpCiAjZGVmaW5lIElTX0lOVFJBKHgsIHkpIFwKICAgICAoTVZGX1BVKHgsIHkpLnByZWRfZmxhZyA9PSBQRl9JTlRSQSkKICNkZWZpbmUgTUlOX1RCX0FERFJfWlMoeCwgeSkgXApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9obm00dmlkZW8uYyBiL2xpYmF2Y29kZWMvaG5tNHZpZGVvLmMKaW5kZXggYTY0ZGJiMS4uOWUxYWM0OSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9obm00dmlkZW8uYworKysgYi9saWJhdmNvZGVjL2hubTR2aWRlby5jCkBAIC0zNzUsNiArMzc1LDcgQEAKICAgICAgICAgICAgIGhubS0+cGFsZXR0ZVt3cml0ZW9mZnNldF0gPSBieXRlc3RyZWFtMl9nZXRfYmUyNCgmZ2IpOwogICAgICAgICAgICAgaWYgKCFlaWdodF9iaXRfY29sb3JzKQogICAgICAgICAgICAgICAgIGhubS0+cGFsZXR0ZVt3cml0ZW9mZnNldF0gPDw9IDI7CisgICAgICAgICAgICBobm0tPnBhbGV0dGVbd3JpdGVvZmZzZXRdIHw9ICgweEZGVSA8PCAyNCk7CiAgICAgICAgICAgICBjb3VudC0tOwogICAgICAgICAgICAgd3JpdGVvZmZzZXQrKzsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ocGVsZHNwLmggYi9saWJhdmNvZGVjL2hwZWxkc3AuaAppbmRleCAxYTNjZWE1Li43NjgxMzliIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hwZWxkc3AuaAorKysgYi9saWJhdmNvZGVjL2hwZWxkc3AuaApAQCAtNzYsNiArNzYsOCBAQAogICAgICAqIEBwYXJhbSBwaXhlbHMgc291cmNlCiAgICAgICogQHBhcmFtIGxpbmVfc2l6ZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBob3Jpem9udGFsIGxpbmUgb2YgYmxvY2sKICAgICAgKiBAcGFyYW0gaCBoZWlnaHQKKyAgICAgKiBAbm90ZSBUaGUgc2l6ZSBpcyBrZXB0IGF0IFs0XVs0XSB0byBtYXRjaCB0aGUgYWJvdmUgcGl4ZWxfdGFicyBhbmQgYXZvaWQKKyAgICAgKiAgICAgICBvdXQgb2YgYm91bmRzIHJlYWRzIGluIHRoZSBtb3Rpb24gZXN0aW1hdGlvbiBjb2RlLgogICAgICAqLwogICAgIG9wX3BpeGVsc19mdW5jIHB1dF9ub19ybmRfcGl4ZWxzX3RhYls0XVs0XTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ocV9ocWEuYyBiL2xpYmF2Y29kZWMvaHFfaHFhLmMKaW5kZXggM2VmODNkNC4uZWM5ZGEzZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9ocV9ocWEuYworKysgYi9saWJhdmNvZGVjL2hxX2hxYS5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiY2Fub3B1cy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2luY2x1ZGUgImhxX2hxYS5oIgpAQCAtNjcsMTEgKzY4LDExIEBACiAgICAgbWVtc2V0KGJsb2NrLCAwLCA2NCAqIHNpemVvZigqYmxvY2spKTsKIAogICAgIGlmICghaXNfaHFhKSB7Ci0gICAgICAgIGJsb2NrWzBdID0gZ2V0X3NiaXRzKGdiLCA5KSA8PCA2OworICAgICAgICBibG9ja1swXSA9IGdldF9zYml0cyhnYiwgOSkgKiA2NDsKICAgICAgICAgcSA9IGZmX2hxX3F1YW50c1txc2VsXVtpc19jaHJvbWFdW2dldF9iaXRzKGdiLCAyKV07CiAgICAgfSBlbHNlIHsKICAgICAgICAgcSA9IGZmX2hxX3F1YW50c1txc2VsXVtpc19jaHJvbWFdW2dldF9iaXRzKGdiLCAyKV07Ci0gICAgICAgIGJsb2NrWzBdID0gZ2V0X3NiaXRzKGdiLCA5KSA8PCA2OworICAgICAgICBibG9ja1swXSA9IGdldF9zYml0cyhnYiwgOSkgKiA2NDsKICAgICB9CiAKICAgICBmb3IgKDs7KSB7CkBAIC04Miw3ICs4Myw3IEBACiAgICAgICAgIHBvcyArPSBmZl9ocV9hY19za2lwc1t2YWxdOwogICAgICAgICBpZiAocG9zID49IDY0KQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGJsb2NrW2ZmX3ppZ3phZ19kaXJlY3RbcG9zXV0gPSAoZmZfaHFfYWNfc3ltc1t2YWxdICogcVtwb3NdKSA+PiAxMjsKKyAgICAgICAgYmxvY2tbZmZfemlnemFnX2RpcmVjdFtwb3NdXSA9IChpbnQpKGZmX2hxX2FjX3N5bXNbdmFsXSAqICh1bnNpZ25lZClxW3Bvc10pID4+IDEyOwogICAgICAgICBwb3MrKzsKICAgICB9CiAKQEAgLTE1NCw3ICsxNTUsNyBAQAogICAgICAgICAgICAgc2xpY2Vfb2ZmW3NsaWNlXSA+PSBzbGljZV9vZmZbc2xpY2UgKyAxXSB8fAogICAgICAgICAgICAgc2xpY2Vfb2ZmW3NsaWNlICsgMV0gPiBkYXRhX3NpemUpIHsKICAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIkludmFsaWQgc2xpY2Ugc2l6ZSAlenUuXG4iLCBkYXRhX3NpemUpOworICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHNsaWNlIHNpemUgJSJTSVpFX1NQRUNJRklFUiIuXG4iLCBkYXRhX3NpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIHNyYyArIHNsaWNlX29mZltzbGljZV0sCkBAIC0xODAsNiArMTgxLDkgQEAKICAgICBpbnQgZmxhZyA9IDA7CiAgICAgaW50IGksIHJldCwgY2JwOwogCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKICAgICBjYnAgPSBnZXRfdmxjMihnYiwgYy0+aHFhX2NicF92bGMudGFibGUsIDUsIDEpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCkBAIC0yNzcsNyArMjgxLDcgQEAKICAgICAgICAgICAgIHNsaWNlX29mZltzbGljZV0gPj0gc2xpY2Vfb2ZmW3NsaWNlICsgMV0gfHwKICAgICAgICAgICAgIHNsaWNlX29mZltzbGljZSArIDFdID4gZGF0YV9zaXplKSB7CiAgICAgICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHNsaWNlIHNpemUgJXp1LlxuIiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzbGljZSBzaXplICUiU0laRV9TUEVDSUZJRVIiLlxuIiwgZGF0YV9zaXplKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzcmMgKyBzbGljZV9vZmZbc2xpY2VdLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ocV9ocWEuaCBiL2xpYmF2Y29kZWMvaHFfaHFhLmgKaW5kZXggNDI4NmRkMC4uNjA4ZTJjYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9ocV9ocWEuaAorKysgYi9saWJhdmNvZGVjL2hxX2hxYS5oCkBAIC0yNCw5ICsyNCw5IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAiaHFfaHFhZHNwLmgiCisjaW5jbHVkZSAidmxjLmgiCiAKICNkZWZpbmUgTlVNX0hRX0FDX0VOVFJJRVMgNzQ2CiAjZGVmaW5lIE5VTV9IUV9QUk9GSUxFUyAgIDIyCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hxX2hxYWRzcC5jIGIvbGliYXZjb2RlYy9ocV9ocWFkc3AuYwppbmRleCBkYjFlYTJlLi4xYjlmMTM4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hxX2hxYWRzcC5jCisrKyBiL2xpYmF2Y29kZWMvaHFfaHFhZHNwLmMKQEAgLTMwLDcgKzMwLDcgQEAKICNkZWZpbmUgRklYXzFfNDE0IDIzMTcwCiAjZGVmaW5lIEZJWF8yXzYxMyAyMTQwNyAvLyBkaXZpZGVkIGJ5IHR3byB0byBmaXQgdGhlIHJhbmdlCiAKLSNkZWZpbmUgSURDVE1VTChhLCBiKSAoKGEpICogKGIpID4+IDE2KQorI2RlZmluZSBJRENUTVVMKGEsIGIpICgoaW50KSgoYSkgKiAodW5zaWduZWQpKGIpKSA+PiAxNikKIAogc3RhdGljIGlubGluZSB2b2lkIGlkY3Rfcm93KGludDE2X3QgKmJsaykKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaHF4LmMgYi9saWJhdmNvZGVjL2hxeC5jCmluZGV4IDEzOGQ5NjAuLmJjMjRiYTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaHF4LmMKKysrIGIvbGliYXZjb2RlYy9ocXguYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgImNhbm9wdXMuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCiAKICNpbmNsdWRlICJocXguaCIKICNpbmNsdWRlICJocXhkc3AuaCIKQEAgLTQwNSw2ICs0MDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BpY3R1cmVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCiB7CiAgICAgSFFYQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBUaHJlYWRGcmFtZSBmcmFtZSA9IHsgLmYgPSBkYXRhIH07CiAgICAgdWludDhfdCAqc3JjID0gYXZwa3QtPmRhdGE7CiAgICAgdWludDMyX3QgaW5mb190YWc7CiAgICAgaW50IGRhdGFfc3RhcnQ7CkBAIC00MTcsNyArNDE5LDcgQEAKIAogICAgIGluZm9fdGFnICAgID0gQVZfUkwzMihzcmMpOwogICAgIGlmIChpbmZvX3RhZyA9PSBNS1RBRygnSScsICdOJywgJ0YnLCAnTycpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGluZm9fb2Zmc2V0ID0gQVZfUkwzMihzcmMgKyA0KTsKKyAgICAgICAgdWludDMyX3QgaW5mb19vZmZzZXQgPSBBVl9STDMyKHNyYyArIDQpOwogICAgICAgICBpZiAoaW5mb19vZmZzZXQgPiBJTlRfTUFYIHx8IGluZm9fb2Zmc2V0ICsgOCA+IGF2cGt0LT5zaXplKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBJTkZPIGhlYWRlciBvZmZzZXQ6IDB4JTA4IlBSSVgzMiIgaXMgdG9vIGxhcmdlLlxuIiwKQEAgLTQ5MSw3ICs0OTMsNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBjdHgtPnBpYywgMCk7CisgICAgcmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmcmFtZSwgMCk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTUxMCw2ICs1MTIsOSBAQAogICAgIGludCBpOwogICAgIEhRWENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKKyAgICBpZiAoYXZjdHgtPmludGVybmFsLT5pc19jb3B5KQorICAgICAgICByZXR1cm4gMDsKKwogICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmNicF92bGMpOwogICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgZmZfZnJlZV92bGMoJmN0eC0+ZGNfdmxjW2ldKTsKQEAgLTUzNiw3ICs1NDEsOCBAQAogICAgIC5pbml0ICAgICAgICAgICA9IGhxeF9kZWNvZGVfaW5pdCwKICAgICAuZGVjb2RlICAgICAgICAgPSBocXhfZGVjb2RlX2ZyYW1lLAogICAgIC5jbG9zZSAgICAgICAgICA9IGhxeF9kZWNvZGVfY2xvc2UsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfU0xJQ0VfVEhSRUFEUyB8CisgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCiAgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8CiAgICAgICAgICAgICAgICAgICAgICAgRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2hxeGRzcC5jIGIvbGliYXZjb2RlYy9ocXhkc3AuYwppbmRleCBmZWZmOWMwLi43ZjgwNDRlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2hxeGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvaHF4ZHNwLmMKQEAgLTM5LDE4ICszOSwxOCBAQAogICAgIHM2ID0gKGludCkgYmxrWzYgKiA4XSAqIHF1YW50WzYgKiA4XTsKICAgICBzNyA9IChpbnQpIGJsa1s3ICogOF0gKiBxdWFudFs3ICogOF07CiAKLSAgICB0MCAgPSAgKHMzICogMTkyNjYgKyBzNSAqIDEyODczKSA+PiAxNTsKLSAgICB0MSAgPSAgKHM1ICogMTkyNjYgLSBzMyAqIDEyODczKSA+PiAxNTsKLSAgICB0MiAgPSAoKHM3ICogNDUyMCAgKyBzMSAqIDIyNzI1KSA+PiAxNSkgLSB0MDsKLSAgICB0MyAgPSAoKHMxICogNDUyMCAgLSBzNyAqIDIyNzI1KSA+PiAxNSkgLSB0MTsKKyAgICB0MCAgPSAgKGludCkoczMgKiAxOTI2NlUgKyBzNSAqIDEyODczVSkgPj4gMTU7CisgICAgdDEgID0gIChpbnQpKHM1ICogMTkyNjZVIC0gczMgKiAxMjg3M1UpID4+IDE1OworICAgIHQyICA9ICgoaW50KShzNyAqIDQ1MjBVICArIHMxICogMjI3MjVVKSA+PiAxNSkgLSB0MDsKKyAgICB0MyAgPSAoKGludCkoczEgKiA0NTIwVSAgLSBzNyAqIDIyNzI1VSkgPj4gMTUpIC0gdDE7CiAgICAgdDQgID0gdDAgKiAyICsgdDI7CiAgICAgdDUgID0gdDEgKiAyICsgdDM7CiAgICAgdDYgID0gdDIgLSB0MzsKICAgICB0NyAgPSB0MyAqIDIgKyB0NjsKLSAgICB0OCAgPSAodDYgKiAxMTU4NSkgPj4gMTQ7Ci0gICAgdDkgID0gKHQ3ICogMTE1ODUpID4+IDE0OwotICAgIHRBICA9IChzMiAqIDg4NjcgLSBzNiAqIDIxNDA3KSA+PiAxNDsKLSAgICB0QiAgPSAoczYgKiA4ODY3ICsgczIgKiAyMTQwNykgPj4gMTQ7CisgICAgdDggID0gKGludCkodDYgKiAxMTU4NVUpID4+IDE0OworICAgIHQ5ICA9IChpbnQpKHQ3ICogMTE1ODVVKSA+PiAxNDsKKyAgICB0QSAgPSAoaW50KShzMiAqIDg4NjdVIC0gczYgKiAyMTQwN1UpID4+IDE0OworICAgIHRCICA9IChpbnQpKHM2ICogODg2N1UgKyBzMiAqIDIxNDA3VSkgPj4gMTQ7CiAgICAgdEMgID0gKHMwID4+IDEpIC0gKHM0ID4+IDEpOwogICAgIHREICA9IChzNCA+PiAxKSAqIDIgKyB0QzsKICAgICB0RSAgPSB0QyAtICh0QSA+PiAxKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaHRtbHN1YnRpdGxlcy5jIGIvbGliYXZjb2RlYy9odG1sc3VidGl0bGVzLmMKaW5kZXggYTJjZDQwZi4uZDkyMjFiYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9odG1sc3VidGl0bGVzLmMKKysrIGIvbGliYXZjb2RlYy9odG1sc3VidGl0bGVzLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDEwICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgIENsw6ltZW50IELFk3NjaCA8dUBwa2gubWU+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTE4LDQ4ICsxOSwxNDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAiaHRtbHN1YnRpdGxlcy5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CiAKIHN0YXRpYyBpbnQgaHRtbF9jb2xvcl9wYXJzZSh2b2lkICpsb2dfY3R4LCBjb25zdCBjaGFyICpzdHIpCiB7CiAgICAgdWludDhfdCByZ2JhWzRdOworICAgIGludCBuYl9zaGFycHMgPSAwOworICAgIHdoaWxlIChzdHJbbmJfc2hhcnBzXSA9PSAnIycpCisgICAgICAgIG5iX3NoYXJwcysrOworICAgIHN0ciArPSBGRk1BWCgwLCBuYl9zaGFycHMgLSAxKTsKICAgICBpZiAoYXZfcGFyc2VfY29sb3IocmdiYSwgc3RyLCBzdHJjc3BuKHN0ciwgIlwiID4iKSwgbG9nX2N0eCkgPCAwKQogICAgICAgICByZXR1cm4gLTE7CiAgICAgcmV0dXJuIHJnYmFbMF0gfCByZ2JhWzFdIDw8IDggfCByZ2JhWzJdIDw8IDE2OwogfQogCi1lbnVtIHsKLSAgICBQQVJBTV9VTktOT1dOID0gLTEsCi0gICAgUEFSQU1fU0laRSwKLSAgICBQQVJBTV9DT0xPUiwKLSAgICBQQVJBTV9GQUNFLAotICAgIFBBUkFNX05VTUJFUgotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgU3J0U3RhY2sgewotICAgIGNoYXIgdGFnWzEyOF07Ci0gICAgY2hhciBwYXJhbVtQQVJBTV9OVU1CRVJdWzEyOF07Ci19IFNydFN0YWNrOwotCiBzdGF0aWMgdm9pZCByc3RyaXBfc3BhY2VzX2J1ZihBVkJQcmludCAqYnVmKQogewotICAgIHdoaWxlIChidWYtPmxlbiA+IDAgJiYgYnVmLT5zdHJbYnVmLT5sZW4gLSAxXSA9PSAnICcpCi0gICAgICAgIGJ1Zi0+c3RyWy0tYnVmLT5sZW5dID0gMDsKKyAgICBpZiAoYXZfYnByaW50X2lzX2NvbXBsZXRlKGJ1ZikpCisgICAgICAgIHdoaWxlIChidWYtPmxlbiA+IDAgJiYgYnVmLT5zdHJbYnVmLT5sZW4gLSAxXSA9PSAnICcpCisgICAgICAgICAgICBidWYtPnN0clstLWJ1Zi0+bGVuXSA9IDA7CiB9CiAKLXZvaWQgZmZfaHRtbG1hcmt1cF90b19hc3Modm9pZCAqbG9nX2N0eCwgQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqaW4pCi17Ci0gICAgY2hhciAqcGFyYW0sIGJ1ZmZlclsxMjhdLCB0bXBbMTI4XTsKLSAgICBpbnQgbGVuLCB0YWdfY2xvc2UsIHNwdHIgPSAxLCBsaW5lX3N0YXJ0ID0gMSwgYW4gPSAwLCBlbmQgPSAwOwotICAgIFNydFN0YWNrIHN0YWNrWzE2XTsKKy8qCisgKiBGYXN0IGNvZGUgZm9yIHNjYW5uaW5nIHRleHQgZW5jbG9zZWQgaW4gYnJhY2VzLiBGdW5jdGlvbmFsbHkKKyAqIGVxdWl2YWxlbnQgdG8gdGhpcyBzc2NhbmYgY2FsbDoKKyAqCisgKiBzc2NhbmYoaW4sICJ7XFxhbiUqMXV9JW4iLCAmbGVuKSA+PSAwICYmIGxlbiA+IDAKKyAqLworc3RhdGljIGludCBzY2FuYnJhY2VzKGNvbnN0IGNoYXIqIGluKSB7CisgICAgaWYgKHN0cm5jbXAoaW4sICJ7XFxhbiIsIDQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghaXNkaWdpdChpbls0XSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChpbls1XSAhPSAnfScpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQogCi0gICAgc3RhY2tbMF0udGFnWzBdID0gMDsKLSAgICBzdHJjcHkoc3RhY2tbMF0ucGFyYW1bUEFSQU1fU0laRV0sICAie1xcZnN9Iik7Ci0gICAgc3RyY3B5KHN0YWNrWzBdLnBhcmFtW1BBUkFNX0NPTE9SXSwgIntcXGN9Iik7Ci0gICAgc3RyY3B5KHN0YWNrWzBdLnBhcmFtW1BBUkFNX0ZBQ0VdLCAgIntcXGZufSIpOworLyogc2tpcCBhbGwge1x4eHh9IHN1YnN0cmluZ3MgZXhjZXB0IGZvciB7XGFuJWR9CisgICBhbmQgYWxsIG1pY3JvZHZkIGxpa2Ugc3R5bGVzIHN1Y2ggYXMge1k6eHh4fSAqLworc3RhdGljIHZvaWQgaGFuZGxlX29wZW5fYnJhY2UoQVZCUHJpbnQgKmRzdCwgY29uc3QgY2hhciAqKmlucCwgaW50ICphbiwgaW50ICpjbG9zaW5nX2JyYWNlX21pc3NpbmcpCit7CisgICAgY29uc3QgY2hhciAqaW4gPSAqaW5wOworCisgICAgKmFuICs9IHNjYW5icmFjZXMoaW4pOworCisgICAgaWYgKCEqY2xvc2luZ19icmFjZV9taXNzaW5nKSB7CisgICAgICAgIGlmICggICAoKmFuICE9IDEgJiYgaW5bMV0gPT0gJ1xcJykKKyAgICAgICAgICAgIHx8IChpblsxXSAmJiBzdHJjaHIoIkNjRmZvUFNzWXkiLCBpblsxXSkgJiYgaW5bMl0gPT0gJzonKSkgeworICAgICAgICAgICAgY2hhciAqYnJhY2VwID0gc3RyY2hyKGluKzIsICd9Jyk7CisgICAgICAgICAgICBpZiAoYnJhY2VwKSB7CisgICAgICAgICAgICAgICAgKmlucCA9IGJyYWNlcDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAqY2xvc2luZ19icmFjZV9taXNzaW5nID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2JwcmludF9jaGFycyhkc3QsICppbiwgMSk7Cit9CisKK3N0cnVjdCBmb250X3RhZyB7CisgICAgY2hhciBmYWNlWzEyOF07CisgICAgaW50IHNpemU7CisgICAgdWludDMyX3QgY29sb3I7Cit9OworCisvKgorICogRmFzdCBjb2RlIGZvciBzY2FubmluZyB0aGUgcmVzdCBvZiBhIHRhZy4gRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8KKyAqIHRoaXMgc3NjYW5mIGNhbGw6CisgKgorICogc3NjYW5mKGluLCAiJTEyN1tePD5dPiVuIiwgYnVmZmVyLCBsZW5wKSA9PSAyCisgKi8KK3N0YXRpYyBpbnQgc2NhbnRhZyhjb25zdCBjaGFyKiBpbiwgY2hhciogYnVmZmVyLCBpbnQqIGxlbnApIHsKKyAgICBpbnQgbGVuOworCisgICAgZm9yIChsZW4gPSAwOyBsZW4gPCAxMjg7IGxlbisrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgYyA9ICppbisrOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnXDAnOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgJz4nOgorICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnXDAnOworICAgICAgICAgICAgKmxlbnAgPSBsZW4rMTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyW2xlbl0gPSBjOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFRoZSBnZW5lcmFsIHBvbGl0aWMgb2YgdGhlIGNvbnZlcnQgaXMgdG8gbWFzayB1bnN1cHBvcnRlZCB0YWdzIG9yIGZvcm1hdHRpbmcKKyAqIGVycm9ycyAoYnV0IHN0aWxsIGFsZXJ0IHRoZSB1c2VyL3N1YnRpdGxlcyB3cml0ZXIgd2l0aCBhbiBlcnJvci93YXJuaW5nKQorICogd2l0aG91dCBkcm9wcGluZyBhbnkgYWN0dWFsIHRleHQgY29udGVudCBmb3IgdGhlIGZpbmFsIHVzZXIuCisgKi8KK2ludCBmZl9odG1sbWFya3VwX3RvX2Fzcyh2b2lkICpsb2dfY3R4LCBBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICppbikKK3sKKyAgICBjaGFyICpwYXJhbSwgYnVmZmVyWzEyOF07CisgICAgaW50IGxlbiwgdGFnX2Nsb3NlLCBzcHRyID0gMCwgbGluZV9zdGFydCA9IDEsIGFuID0gMCwgZW5kID0gMDsKKyAgICBpbnQgY2xvc2luZ19icmFjZV9taXNzaW5nID0gMDsKKyAgICBpbnQgaSwgbGlrZWx5X2FfdGFnOworCisgICAgLyoKKyAgICAgKiBzdGF0ZSBzdGFjayBpcyBvbmx5IHByZXNlbnQgZm9yIGZvbnRzIHNpbmNlIHRoZXkgYXJlIHRoZSBvbmx5IHRhZ3Mgd2hlcmUKKyAgICAgKiB0aGUgc3RhdGUgaXMgbm90IGJpbmFyeS4gSGVyZSBpcyBhIHR5cGljYWwgdXNlIGNhc2U6CisgICAgICoKKyAgICAgKiAgIDxmb250IGNvbG9yPSJyZWQiIHNpemU9MTA+CisgICAgICogICAgIHJlZCAxMAorICAgICAqICAgICA8Zm9udCBzaXplPTUwPiBSRUQgQU5EIEJJRyA8L2ZvbnQ+CisgICAgICogICAgIHJlZCAxMCBhZ2FpbgorICAgICAqICAgPC9mb250PgorICAgICAqCisgICAgICogT24gdGhlIG90aGVyIGhhbmQsIHVzaW5nIHRoZSBzdGF0ZSBzeXN0ZW0gZm9yIGFsbCB0aGUgdGFncyBzaG91bGQgYmUKKyAgICAgKiBhdm9pZGVkIGJlY2F1c2UgaXQgYnJlYWtzIHdyb25nbHkgbmVzdGVkIHRhZ3Mgc3VjaCBhczoKKyAgICAgKgorICAgICAqICAgPGI+IGZvbyA8aT4gYmFyIDwvYj4gYmxhIDwvaT4KKyAgICAgKgorICAgICAqIFdlIGRvbid0IHdhbnQgdG8gYnJlYWsgaGVyZTsgaW5zdGVhZCwgd2Ugd2lsbCB0cmVhdCBhbGwgdGhlc2UgdGFncyBhcworICAgICAqIGJpbmFyeSBzdGF0ZSBtYXJrZXJzLiBCYXNpY2FsbHksICI8Yj4iIHdpbGwgYWN0aXZhdGUgYm9sZCwgYW5kICI8L2I+IgorICAgICAqIHdpbGwgZGVhY3RpdmF0ZSBpdCwgd2hhdGV2ZXIgdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgYWxzbyBwcmV2ZW50cyBjYXNlcyB3aGVyZSB3ZSBoYXZlIGEgcmFuZG9tIGNsb3NpbmcgdGFnCisgICAgICogcmVtYWluaW5nIGFmdGVyIHRoZSBvcGVuaW5nIG9uZSB3YXMgZHJvcHBlZC4gWWVzLCB0aGlzIGhhcHBlbnMgYW5kIHdlCisgICAgICogc3RpbGwgZG9uJ3Qgd2FudCB0byBwcmludCBhICI8L2I+IiBhdCB0aGUgZW5kIG9mIHRoZSBkaWFsb2cgZXZlbnQuCisgICAgICovCisgICAgc3RydWN0IGZvbnRfdGFnIHN0YWNrWzE2XTsKKworICAgIG1lbXNldCgmc3RhY2tbMF0sIDAsIHNpemVvZihzdGFja1swXSkpOwogCiAgICAgZm9yICg7ICFlbmQgJiYgKmluOyBpbisrKSB7CiAgICAgICAgIHN3aXRjaCAoKmluKSB7CkBAIC03OCw5MSArMTc3LDEyOCBAQAogICAgICAgICAgICAgaWYgKCFsaW5lX3N0YXJ0KQogICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICppbiwgMSk7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAneyc6ICAgIC8qIHNraXAgYWxsIHtceHh4fSBzdWJzdHJpbmdzIGV4Y2VwdCBmb3Ige1xhbiVkfQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFsbCBtaWNyb2R2ZCBsaWtlIHN0eWxlcyBzdWNoIGFzIHtZOnh4eH0gKi8KLSAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICBhbiArPSBzc2NhbmYoaW4sICJ7XFxhbiUqMXV9JW4iLCAmbGVuKSA+PSAwICYmIGxlbiA+IDA7Ci0gICAgICAgICAgICBpZiAoKGFuICE9IDEgJiYgKGxlbiA9IDAsIHNzY2FuZihpbiwgIntcXCUqW159XX0lbiIsICZsZW4pID49IDAgJiYgbGVuID4gMCkpIHx8Ci0gICAgICAgICAgICAgICAgKGxlbiA9IDAsIHNzY2FuZihpbiwgInslKjFbQ2NGZm9QU3NZeV06JSpbXn1dfSVuIiwgJmxlbikgPj0gMCAmJiBsZW4gPiAwKSkgewotICAgICAgICAgICAgICAgIGluICs9IGxlbiAtIDE7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoZHN0LCAqaW4sIDEpOworICAgICAgICBjYXNlICd7JzoKKyAgICAgICAgICAgIGhhbmRsZV9vcGVuX2JyYWNlKGRzdCwgJmluLCAmYW4sICZjbG9zaW5nX2JyYWNlX21pc3NpbmcpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJzwnOgorICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqICI8PCIgYXJlIGxpa2VseSBsYXRpbiBndWlsbGVtZXRzIGluIEFTQ0lJIG9yIHNvbWUga2luZCBvZiByYW5kb20KKyAgICAgICAgICAgICAqIHN0eWxlIGVmZmVjdDsgc2VlIHN1Yi9iYWRzeW50YXguc3J0IGluIHRoZSBGQVRFIHNhbXBsZXMKKyAgICAgICAgICAgICAqIGRpcmVjdG9yeSBmb3IgcmVhbCB0ZXN0IGNhc2VzLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGxpa2VseV9hX3RhZyA9IDE7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpblsxXSA9PSAnPCc7IGkrKykgeworICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICc8JywgMSk7CisgICAgICAgICAgICAgICAgbGlrZWx5X2FfdGFnID0gMDsKKyAgICAgICAgICAgICAgICBpbisrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICB0YWdfY2xvc2UgPSBpblsxXSA9PSAnLyc7CisgICAgICAgICAgICBpZiAodGFnX2Nsb3NlKQorICAgICAgICAgICAgICAgIGxpa2VseV9hX3RhZyA9IDE7CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoaW5bMF0gPT0gJzwnKTsKKwogICAgICAgICAgICAgbGVuID0gMDsKLSAgICAgICAgICAgIGlmIChzc2NhbmYoaW4rdGFnX2Nsb3NlKzEsICIlMTI3W14+XT4lbiIsIGJ1ZmZlciwgJmxlbikgPj0gMSAmJiBsZW4gPiAwKSB7CisKKyAgICAgICAgICAgIGlmIChzY2FudGFnKGluK3RhZ19jbG9zZSsxLCBidWZmZXIsICZsZW4pICYmIGxlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgc2tpcCA9IGxlbiArIHRhZ19jbG9zZTsKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWduYW1lID0gYnVmZmVyOwotICAgICAgICAgICAgICAgIHdoaWxlICgqdGFnbmFtZSA9PSAnICcpCisgICAgICAgICAgICAgICAgd2hpbGUgKCp0YWduYW1lID09ICcgJykgeworICAgICAgICAgICAgICAgICAgICBsaWtlbHlfYV90YWcgPSAwOwogICAgICAgICAgICAgICAgICAgICB0YWduYW1lKys7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICgocGFyYW0gPSBzdHJjaHIodGFnbmFtZSwgJyAnKSkpCiAgICAgICAgICAgICAgICAgICAgICpwYXJhbSsrID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoKCF0YWdfY2xvc2UgJiYgc3B0ciA8IEZGX0FSUkFZX0VMRU1TKHN0YWNrKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCB0YWdfY2xvc2UgJiYgc3B0ciA+IDAgJiYgIXN0cmNtcChzdGFja1tzcHRyLTFdLnRhZywgdGFnbmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBpLCBqLCB1bmtub3duID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaW4gKz0gbGVuICsgdGFnX2Nsb3NlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ19jbG9zZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzdGFjaytzcHRyLCAwLCBzaXplb2YoKnN0YWNrKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHRhZ25hbWUsICJmb250IikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdfY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9UEFSQU1fTlVNQkVSLTE7IGk+PTA7IGktLSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW3NwdHItMV0ucGFyYW1baV1bMF0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9c3B0ci0yOyBqPj0wOyBqLS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrW2pdLnBhcmFtW2ldWzBdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoZHN0LCAiJXMiLCBzdGFja1tqXS5wYXJhbVtpXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChwYXJhbSwgInNpemU9IiwgNSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZvbnRfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtICs9IDUgKyAocGFyYW1bNV0gPT0gJyInKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzc2NhbmYocGFyYW0sICIldSIsICZmb250X3NpemUpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihzdGFja1tzcHRyXS5wYXJhbVtQQVJBTV9TSVpFXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdGFja1swXS5wYXJhbVtQQVJBTV9TSVpFXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAie1xcZnMldX0iLCBmb250X3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHBhcmFtLCAiY29sb3I9IiwgNikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtICs9IDYgKyAocGFyYW1bNl0gPT0gJyInKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0YWNrW3NwdHJdLnBhcmFtW1BBUkFNX0NPTE9SXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0YWNrWzBdLnBhcmFtW1BBUkFNX0NPTE9SXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7XFxjJkglWCZ9IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbF9jb2xvcl9wYXJzZShsb2dfY3R4LCBwYXJhbSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKHBhcmFtLCAiZmFjZT0iLCA1KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gKz0gNSArIChwYXJhbVs1XSA9PSAnIicpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RyY3NwbihwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1bLTFdID09ICciJyA/ICJcIiIgOiIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9zdHJsY3B5KHRtcCwgcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKHNpemVvZih0bXApLCBsZW4rMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gKz0gbGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoc3RhY2tbc3B0cl0ucGFyYW1bUEFSQU1fRkFDRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc3RhY2tbMF0ucGFyYW1bUEFSQU1fRkFDRV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIntcXGZuJXN9IiwgdG1wKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBhcmFtID0gc3RyY2hyKHBhcmFtLCAnICcpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPFBBUkFNX05VTUJFUjsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2tbc3B0cl0ucGFyYW1baV1bMF0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIiVzIiwgc3RhY2tbc3B0cl0ucGFyYW1baV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0YWduYW1lWzFdICYmIHN0cnNwbih0YWduYW1lLCAiYmlzdSIpID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoZHN0LCAie1xcJWMlZH0iLCB0YWduYW1lWzBdLCAhdGFnX2Nsb3NlKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd24gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIjwvJXM+IiwgdGFnbmFtZSk7CisKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGlzIGlzIGxpa2VseSBhIHRhZyAqLworI2RlZmluZSBMSUtFTFlfQV9UQUdfQ0hBUih4KSAoKCh4KSA+PSAnMCcgJiYgKHgpIDw9ICc5JykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA+PSAnYScgJiYgKHgpIDw9ICd6JykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh4KSA+PSAnQScgJiYgKHgpIDw9ICdaJykgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4KSA9PSAnXycgfHwgKHgpID09ICcvJykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyB0YWduYW1lW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFMSUtFTFlfQV9UQUdfQ0hBUih0YWduYW1lW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlrZWx5X2FfdGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0YWdfY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwdHItLTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1bmtub3duICYmICFzdHJzdHIoaW4sIHRtcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluIC09IGxlbiArIHRhZ19jbG9zZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICppbiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNweShzdGFja1tzcHRyKytdLnRhZywgdGFnbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0YWNrWzBdLnRhZykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAodGFnbmFtZSwgImZvbnQiKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFnX2Nsb3NlICYmIHNwdHIgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZm9udF90YWcgKmN1cl90YWcgID0gJnN0YWNrW3NwdHItLV07CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZm9udF90YWcgKmxhc3RfdGFnID0gJnN0YWNrW3NwdHJdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyX3RhZy0+c2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdF90YWctPnNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoZHN0LCAie1xcZnN9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFzdF90YWctPnNpemUgIT0gY3VyX3RhZy0+c2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJ7XFxmcyVkfSIsIGxhc3RfdGFnLT5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cl90YWctPmNvbG9yICYgMHhmZjAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGxhc3RfdGFnLT5jb2xvciAmIDB4ZmYwMDAwMDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIntcXGN9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobGFzdF90YWctPmNvbG9yICE9IGN1cl90YWctPmNvbG9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIntcXGMmSCUiUFJJWDMyIiZ9IiwgbGFzdF90YWctPmNvbG9yICYgMHhmZmZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyX3RhZy0+ZmFjZVswXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGFzdF90YWctPmZhY2VbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludGYoZHN0LCAie1xcZm59Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RyY21wKGxhc3RfdGFnLT5mYWNlLCBjdXJfdGFnLT5mYWNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJ7XFxmbiVzfSIsIGxhc3RfdGFnLT5mYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGFnX2Nsb3NlICYmIHNwdHIgPCBGRl9BUlJBWV9FTEVNUyhzdGFjaykgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZm9udF90YWcgKm5ld190YWcgPSAmc3RhY2tbc3B0ciArIDFdOworCisgICAgICAgICAgICAgICAgICAgICAgICAqbmV3X3RhZyA9IHN0YWNrW3NwdHIrK107CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXZfc3RybmNhc2VjbXAocGFyYW0sICJzaXplPSIsIDUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtICs9IDUgKyAocGFyYW1bNV0gPT0gJyInKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihwYXJhbSwgIiV1IiwgJm5ld190YWctPnNpemUpID09IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIntcXGZzJXV9IiwgbmV3X3RhZy0+c2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RybmNhc2VjbXAocGFyYW0sICJjb2xvcj0iLCA2KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtICs9IDYgKyAocGFyYW1bNl0gPT0gJyInKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBodG1sX2NvbG9yX3BhcnNlKGxvZ19jdHgsIHBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld190YWctPmNvbG9yID0gMHhmZjAwMDAwMCB8IGNvbG9yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJ7XFxjJkglIlBSSVgzMiImfSIsIG5ld190YWctPmNvbG9yICYgMHhmZmZmZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RybmNhc2VjbXAocGFyYW0sICJmYWNlPSIsIDUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtICs9IDUgKyAocGFyYW1bNV0gPT0gJyInKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc3RyY3NwbihwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVstMV0gPT0gJyInID8gIlwiIiA6IiAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNweShuZXdfdGFnLT5mYWNlLCBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihzaXplb2YobmV3X3RhZy0+ZmFjZSksIGxlbisxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtICs9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJ7XFxmbiVzfSIsIG5ld190YWctPmZhY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBhcmFtID0gc3RyY2hyKHBhcmFtLCAnICcpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbiArPSBza2lwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnbmFtZVswXSAmJiAhdGFnbmFtZVsxXSAmJiBzdHJjaHIoImJpc3UiLCBhdl90b2xvd2VyKHRhZ25hbWVbMF0pKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIntcXCVjJWR9IiwgKGNoYXIpYXZfdG9sb3dlcih0YWduYW1lWzBdKSwgIXRhZ19jbG9zZSk7CisgICAgICAgICAgICAgICAgICAgIGluICs9IHNraXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RybmNhc2VjbXAodGFnbmFtZSwgImJyIiwgMikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICghdGFnbmFtZVsyXSB8fCAodGFnbmFtZVsyXSA9PSAnLycgJiYgIXRhZ25hbWVbM10pKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKGRzdCwgIlxcTiIpOworICAgICAgICAgICAgICAgICAgICBpbiArPSBza2lwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGlrZWx5X2FfdGFnKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFnX2Nsb3NlKSAvLyB3YXJuIG9ubHkgb25jZQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5yZWNvZ25pemVkIHRhZyAlc1xuIiwgdGFnbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGluICs9IHNraXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGRzdCwgJzwnLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICppbiwgMSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycyhkc3QsICppbiwgMSk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTE3MSw4ICszMDcsMTMgQEAKICAgICAgICAgICAgIGxpbmVfc3RhcnQgPSAwOwogICAgIH0KIAorICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKGRzdCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKICAgICB3aGlsZSAoZHN0LT5sZW4gPj0gMiAmJiAhc3RybmNtcCgmZHN0LT5zdHJbZHN0LT5sZW4gLSAyXSwgIlxcTiIsIDIpKQogICAgICAgICBkc3QtPmxlbiAtPSAyOwogICAgIGRzdC0+c3RyW2RzdC0+bGVuXSA9IDA7CiAgICAgcnN0cmlwX3NwYWNlc19idWYoZHN0KTsKKworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9odG1sc3VidGl0bGVzLmggYi9saWJhdmNvZGVjL2h0bWxzdWJ0aXRsZXMuaAppbmRleCBlMTBjZGRhLi5mM2E4ZWY1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2h0bWxzdWJ0aXRsZXMuaAorKysgYi9saWJhdmNvZGVjL2h0bWxzdWJ0aXRsZXMuaApAQCAtMjMsNiArMjMsNiBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgogCi12b2lkIGZmX2h0bWxtYXJrdXBfdG9fYXNzKHZvaWQgKmxvZ19jdHgsIEFWQlByaW50ICpkc3QsIGNvbnN0IGNoYXIgKmluKTsKK2ludCBmZl9odG1sbWFya3VwX3RvX2Fzcyh2b2lkICpsb2dfY3R4LCBBVkJQcmludCAqZHN0LCBjb25zdCBjaGFyICppbik7CiAKICNlbmRpZiAvKiBBVkNPREVDX0hUTUxTVUJUSVRMRVNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9odWZmbWFuLmMgYi9saWJhdmNvZGVjL2h1ZmZtYW4uYwppbmRleCBkNzQwM2I4Li5kZjExNDFiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2h1ZmZtYW4uYworKysgYi9saWJhdmNvZGVjL2h1ZmZtYW4uYwpAQCAtMjcsOSArMjcsMTEgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9xc29ydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKwogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImh1ZmZtYW4uaCIKKyNpbmNsdWRlICJ2bGMuaCIKIAogLyogc3ltYm9sIGZvciBIdWZmbWFuIHRyZWUgbm9kZSAqLwogI2RlZmluZSBITk9ERSAtMQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9odWZmbWFuLmggYi9saWJhdmNvZGVjL2h1ZmZtYW4uaAppbmRleCA2YWIyM2FlLi40Zjg3OWU2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2h1ZmZtYW4uaAorKysgYi9saWJhdmNvZGVjL2h1ZmZtYW4uaApAQCAtMjcsNyArMjcsNyBAQAogI2RlZmluZSBBVkNPREVDX0hVRkZNQU5fSAogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAidmxjLmgiCiAKIHR5cGVkZWYgc3RydWN0IE5vZGUgewogICAgIGludDE2X3QgIHN5bTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaHVmZnl1di5jIGIvbGliYXZjb2RlYy9odWZmeXV2LmMKaW5kZXggNDkyMTU1NS4uZTU4MjA2MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9odWZmeXV2LmMKKysrIGIvbGliYXZjb2RlYy9odWZmeXV2LmMKQEAgLTc2LDcgKzc2LDYgQEAKICAgICBzLT5mbGFncyA9IGF2Y3R4LT5mbGFnczsKIAogICAgIGZmX2Jzd2FwZHNwX2luaXQoJnMtPmJkc3ApOwotICAgIGZmX2xsdmlkZHNwX2luaXQoJnMtPmxsdmlkZHNwLCBhdmN0eCk7CiAKICAgICBzLT53aWR0aCA9IGF2Y3R4LT53aWR0aDsKICAgICBzLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9odWZmeXV2LmggYi9saWJhdmNvZGVjL2h1ZmZ5dXYuaAppbmRleCBjMTgyNDdlLi44MzMwOWQ0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2h1ZmZ5dXYuaAorKysgYi9saWJhdmNvZGVjL2h1ZmZ5dXYuaApAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgImh1ZmZ5dXZlbmNkc3AuaCIKICNpbmNsdWRlICJwdXRfYml0cy5oIgogI2luY2x1ZGUgImxvc3NsZXNzX3ZpZGVvZHNwLmgiCisjaW5jbHVkZSAibG9zc2xlc3NfdmlkZW9lbmNkc3AuaCIKIAogI2RlZmluZSBWTENfQklUUyAxMgogCkBAIC04OSw2ICs5MCw3IEBACiAgICAgSHVmZllVVkRTUENvbnRleHQgaGRzcDsKICAgICBIdWZmWVVWRW5jRFNQQ29udGV4dCBoZW5jZHNwOwogICAgIExMVmlkRFNQQ29udGV4dCBsbHZpZGRzcDsKKyAgICBMTFZpZEVuY0RTUENvbnRleHQgbGx2aWRlbmNkc3A7CiAgICAgaW50IG5vbl9kZXRlcm07IC8vIG5vbi1kZXRlcm1pbmlzdGljLCBtdWx0aS10aHJlYWRlZCBlbmNvZGVyIGFsbG93ZWQKIH0gSFl1dkNvbnRleHQ7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaHVmZnl1dmRlYy5jIGIvbGliYXZjb2RlYy9odWZmeXV2ZGVjLmMKaW5kZXggNzMxNDUxOS4uNjYzNTdiZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9odWZmeXV2ZGVjLmMKKysrIGIvbGliYXZjb2RlYy9odWZmeXV2ZGVjLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImh1ZmZ5dXYuaCIKICNpbmNsdWRlICJodWZmeXV2ZHNwLmgiCisjaW5jbHVkZSAibG9zc2xlc3NfdmlkZW9kc3AuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgpAQCAtMjk2LDcgKzI5Nyw4IEBACiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICBmZl9odWZmeXV2ZHNwX2luaXQoJnMtPmhkc3ApOworICAgIGZmX2h1ZmZ5dXZkc3BfaW5pdCgmcy0+aGRzcCwgYXZjdHgtPnBpeF9mbXQpOworICAgIGZmX2xsdmlkZHNwX2luaXQoJnMtPmxsdmlkZHNwKTsKICAgICBtZW1zZXQocy0+dmxjLCAwLCA0ICogc2l6ZW9mKFZMQykpOwogCiAgICAgcy0+aW50ZXJsYWNlZCA9IGF2Y3R4LT5oZWlnaHQgPiAyODg7CkBAIC01NzcsNiArNTc5LDggQEAKICAgICBIWXV2Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IGksIHJldDsKIAorICAgIHMtPmF2Y3R4ID0gYXZjdHg7CisKICAgICBpZiAoKHJldCA9IGZmX2h1ZmZ5dXZfYWxsb2NfdGVtcChzKSkgPCAwKSB7CiAgICAgICAgIGZmX2h1ZmZ5dXZfY29tbW9uX2VuZChzKTsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTg3OCwyNyArODgyLDI3IEBACiBzdGF0aWMgaW50IGxlZnRfcHJlZGljdGlvbihIWXV2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCB3LCBpbnQgYWNjKQogewogICAgIGlmIChzLT5icHMgPD0gOCkgewotICAgICAgICByZXR1cm4gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQoZHN0LCBzcmMsIHcsIGFjYyk7CisgICAgICAgIHJldHVybiBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKGRzdCwgc3JjLCB3LCBhY2MpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzLT5sbHZpZGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTYoKCAgICAgIHVpbnQxNl90ICopZHN0LCAoY29uc3QgdWludDE2X3QgKilzcmMsIHMtPm4tMSwgdywgYWNjKTsKKyAgICAgICAgcmV0dXJuIHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWRfaW50MTYoKCAgICAgIHVpbnQxNl90ICopZHN0LCAoY29uc3QgdWludDE2X3QgKilzcmMsIHMtPm4tMSwgdywgYWNjKTsKICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGFkZF9ieXRlcyhIWXV2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCB3KQogewogICAgIGlmIChzLT5icHMgPD0gOCkgewotICAgICAgICBzLT5oZHNwLmFkZF9ieXRlcyhkc3QsIHNyYywgdyk7CisgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9ieXRlcyhkc3QsIHNyYywgdyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2ludDE2KCh1aW50MTZfdCopZHN0LCAoY29uc3QgdWludDE2X3QqKXNyYywgcy0+biAtIDEsIHcpOworICAgICAgICBzLT5oZHNwLmFkZF9pbnQxNigodWludDE2X3QqKWRzdCwgKGNvbnN0IHVpbnQxNl90KilzcmMsIHMtPm4gLSAxLCB3KTsKICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGFkZF9tZWRpYW5fcHJlZGljdGlvbihIWXV2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKmRpZmYsIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCiB7CiAgICAgaWYgKHMtPmJwcyA8PSA4KSB7Ci0gICAgICAgIHMtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQoZHN0LCBzcmMsIGRpZmYsIHcsIGxlZnQsIGxlZnRfdG9wKTsKKyAgICAgICAgcy0+bGx2aWRkc3AuYWRkX21lZGlhbl9wcmVkKGRzdCwgc3JjLCBkaWZmLCB3LCBsZWZ0LCBsZWZ0X3RvcCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYoKHVpbnQxNl90ICopZHN0LCAoY29uc3QgdWludDE2X3QgKilzcmMsIChjb25zdCB1aW50MTZfdCAqKWRpZmYsIHMtPm4tMSwgdywgbGVmdCwgbGVmdF90b3ApOworICAgICAgICBzLT5oZHNwLmFkZF9oZnl1X21lZGlhbl9wcmVkX2ludDE2KCh1aW50MTZfdCAqKWRzdCwgKGNvbnN0IHVpbnQxNl90ICopc3JjLCAoY29uc3QgdWludDE2X3QgKilkaWZmLCBzLT5uLTEsIHcsIGxlZnQsIGxlZnRfdG9wKTsKICAgICB9CiB9CiBzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLApAQCAtOTE1LDYgKzkxOSw5IEBACiAgICAgQVZGcmFtZSAqY29uc3QgcCA9IGRhdGE7CiAgICAgaW50IHRhYmxlX3NpemUgPSAwLCByZXQ7CiAKKyAgICBpZiAoYnVmX3NpemUgPCAod2lkdGggKiBoZWlnaHQgKyA3KS84KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+Yml0c3RyZWFtX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAmcy0+Yml0c3RyZWFtX2J1ZmZlcl9zaXplLAogICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplKTsKQEAgLTEwMzgsMTEgKzEwNDUsMTEgQEAKICAgICAgICAgICAgIGNhc2UgTEVGVDoKICAgICAgICAgICAgIGNhc2UgUExBTkU6CiAgICAgICAgICAgICAgICAgZGVjb2RlXzQyMl9iaXRzdHJlYW0ocywgd2lkdGggLSAyKTsKLSAgICAgICAgICAgICAgICBsZWZ0eSA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHAtPmRhdGFbMF0gKyAyLCBzLT50ZW1wWzBdLAorICAgICAgICAgICAgICAgIGxlZnR5ID0gcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChwLT5kYXRhWzBdICsgMiwgcy0+dGVtcFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gMiwgbGVmdHkpOwogICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSkgewotICAgICAgICAgICAgICAgICAgICBsZWZ0dSA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHAtPmRhdGFbMV0gKyAxLCBzLT50ZW1wWzFdLCB3aWR0aDIgLSAxLCBsZWZ0dSk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnR2ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVsyXSArIDEsIHMtPnRlbXBbMl0sIHdpZHRoMiAtIDEsIGxlZnR2KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHUgPSBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKHAtPmRhdGFbMV0gKyAxLCBzLT50ZW1wWzFdLCB3aWR0aDIgLSAxLCBsZWZ0dSk7CisgICAgICAgICAgICAgICAgICAgIGxlZnR2ID0gcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChwLT5kYXRhWzJdICsgMSwgcy0+dGVtcFsyXSwgd2lkdGgyIC0gMSwgbGVmdHYpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoY3kgPSB5ID0gMTsgeSA8IHMtPmhlaWdodDsgeSsrLCBjeSsrKSB7CkBAIC0xMDUzLDExICsxMDYwLDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHlkc3QgPSBwLT5kYXRhWzBdICsgcC0+bGluZXNpemVbMF0gKiB5OwogCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0eSA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHlkc3QsIHMtPnRlbXBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0eSA9IHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWQoeWRzdCwgcy0+dGVtcFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGxlZnR5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wcmVkaWN0b3IgPT0gUExBTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeSA+IHMtPmludGVybGFjZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2J5dGVzKHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2J5dGVzKHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIHkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5ID49IHMtPmhlaWdodCkKQEAgLTEwNzEsMTggKzEwNzgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgdmRzdCA9IHAtPmRhdGFbMl0gKyBwLT5saW5lc2l6ZVsyXSAqIGN5OwogCiAgICAgICAgICAgICAgICAgICAgIGRlY29kZV80MjJfYml0c3RyZWFtKHMsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdHkgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZCh5ZHN0LCBzLT50ZW1wWzBdLAorICAgICAgICAgICAgICAgICAgICBsZWZ0eSA9IHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWQoeWRzdCwgcy0+dGVtcFswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgbGVmdHkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR1ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQodWRzdCwgcy0+dGVtcFsxXSwgd2lkdGgyLCBsZWZ0dSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0diA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHZkc3QsIHMtPnRlbXBbMl0sIHdpZHRoMiwgbGVmdHYpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHUgPSBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKHVkc3QsIHMtPnRlbXBbMV0sIHdpZHRoMiwgbGVmdHUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHYgPSBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKHZkc3QsIHMtPnRlbXBbMl0sIHdpZHRoMiwgbGVmdHYpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5wcmVkaWN0b3IgPT0gUExBTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IHMtPmludGVybGFjZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLmFkZF9ieXRlcyh5ZHN0LCB5ZHN0IC0gZmFrZV95c3RyaWRlLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2J5dGVzKHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5hZGRfYnl0ZXModWRzdCwgdWRzdCAtIGZha2VfdXN0cmlkZSwgd2lkdGgyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5hZGRfYnl0ZXModmRzdCwgdmRzdCAtIGZha2VfdnN0cmlkZSwgd2lkdGgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2J5dGVzKHVkc3QsIHVkc3QgLSBmYWtlX3VzdHJpZGUsIHdpZHRoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9ieXRlcyh2ZHN0LCB2ZHN0IC0gZmFrZV92c3RyaWRlLCB3aWR0aDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTA5MywxMSArMTEwMCwxMSBAQAogICAgICAgICAgICAgY2FzZSBNRURJQU46CiAgICAgICAgICAgICAgICAgLyogZmlyc3QgbGluZSBleGNlcHQgZmlyc3QgMiBwaXhlbHMgaXMgbGVmdCBwcmVkaWN0ZWQgKi8KICAgICAgICAgICAgICAgICBkZWNvZGVfNDIyX2JpdHN0cmVhbShzLCB3aWR0aCAtIDIpOwotICAgICAgICAgICAgICAgIGxlZnR5ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVswXSArIDIsIHMtPnRlbXBbMF0sCisgICAgICAgICAgICAgICAgbGVmdHkgPSBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKHAtPmRhdGFbMF0gKyAyLCBzLT50ZW1wWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLSAyLCBsZWZ0eSk7CiAgICAgICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dSQVkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnR1ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVsxXSArIDEsIHMtPnRlbXBbMV0sIHdpZHRoMiAtIDEsIGxlZnR1KTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdHYgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZChwLT5kYXRhWzJdICsgMSwgcy0+dGVtcFsyXSwgd2lkdGgyIC0gMSwgbGVmdHYpOworICAgICAgICAgICAgICAgICAgICBsZWZ0dSA9IHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWQocC0+ZGF0YVsxXSArIDEsIHMtPnRlbXBbMV0sIHdpZHRoMiAtIDEsIGxlZnR1KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdHYgPSBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKHAtPmRhdGFbMl0gKyAxLCBzLT50ZW1wWzJdLCB3aWR0aDIgLSAxLCBsZWZ0dik7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgY3kgPSB5ID0gMTsKQEAgLTExMDUsMTEgKzExMTIsMTEgQEAKICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgbGluZSBpcyBsZWZ0IHByZWRpY3RlZCBmb3IgaW50ZXJsYWNlZCBjYXNlICovCiAgICAgICAgICAgICAgICAgaWYgKHMtPmludGVybGFjZWQpIHsKICAgICAgICAgICAgICAgICAgICAgZGVjb2RlXzQyMl9iaXRzdHJlYW0ocywgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0eSA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgbGVmdHkgPSBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50ZW1wWzBdLCB3aWR0aCwgbGVmdHkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR1ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVsxXSArIHAtPmxpbmVzaXplWzJdLCBzLT50ZW1wWzFdLCB3aWR0aDIsIGxlZnR1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR2ID0gcy0+aGRzcC5hZGRfaGZ5dV9sZWZ0X3ByZWQocC0+ZGF0YVsyXSArIHAtPmxpbmVzaXplWzFdLCBzLT50ZW1wWzJdLCB3aWR0aDIsIGxlZnR2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR1ID0gcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChwLT5kYXRhWzFdICsgcC0+bGluZXNpemVbMl0sIHMtPnRlbXBbMV0sIHdpZHRoMiwgbGVmdHUpOworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHYgPSBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKHAtPmRhdGFbMl0gKyBwLT5saW5lc2l6ZVsxXSwgcy0+dGVtcFsyXSwgd2lkdGgyLCBsZWZ0dik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgeSsrOwogICAgICAgICAgICAgICAgICAgICBjeSsrOwpAQCAtMTExNywyNCArMTEyNCwyNCBAQAogCiAgICAgICAgICAgICAgICAgLyogbmV4dCA0IHBpeGVscyBhcmUgbGVmdCBwcmVkaWN0ZWQgdG9vICovCiAgICAgICAgICAgICAgICAgZGVjb2RlXzQyMl9iaXRzdHJlYW0ocywgNCk7Ci0gICAgICAgICAgICAgICAgbGVmdHkgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZChwLT5kYXRhWzBdICsgZmFrZV95c3RyaWRlLAorICAgICAgICAgICAgICAgIGxlZnR5ID0gcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChwLT5kYXRhWzBdICsgZmFrZV95c3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dGVtcFswXSwgNCwgbGVmdHkpOwogICAgICAgICAgICAgICAgIGlmICghKHMtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSkgewotICAgICAgICAgICAgICAgICAgICBsZWZ0dSA9IHMtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKHAtPmRhdGFbMV0gKyBmYWtlX3VzdHJpZGUsIHMtPnRlbXBbMV0sIDIsIGxlZnR1KTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdHYgPSBzLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZChwLT5kYXRhWzJdICsgZmFrZV92c3RyaWRlLCBzLT50ZW1wWzJdLCAyLCBsZWZ0dik7CisgICAgICAgICAgICAgICAgICAgIGxlZnR1ID0gcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChwLT5kYXRhWzFdICsgZmFrZV91c3RyaWRlLCBzLT50ZW1wWzFdLCAyLCBsZWZ0dSk7CisgICAgICAgICAgICAgICAgICAgIGxlZnR2ID0gcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChwLT5kYXRhWzJdICsgZmFrZV92c3RyaWRlLCBzLT50ZW1wWzJdLCAyLCBsZWZ0dik7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgLyogbmV4dCBsaW5lIGV4Y2VwdCB0aGUgZmlyc3QgNCBwaXhlbHMgaXMgbWVkaWFuIHByZWRpY3RlZCAqLwogICAgICAgICAgICAgICAgIGxlZnR0b3B5ID0gcC0+ZGF0YVswXVszXTsKICAgICAgICAgICAgICAgICBkZWNvZGVfNDIyX2JpdHN0cmVhbShzLCB3aWR0aCAtIDQpOwotICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQocC0+ZGF0YVswXSArIGZha2VfeXN0cmlkZSArIDQsCisgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX21lZGlhbl9wcmVkKHAtPmRhdGFbMF0gKyBmYWtlX3lzdHJpZGUgKyA0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVswXSArIDQsIHMtPnRlbXBbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIDQsICZsZWZ0eSwgJmxlZnR0b3B5KTsKICAgICAgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkpIHsKICAgICAgICAgICAgICAgICAgICAgbGVmdHRvcHUgPSBwLT5kYXRhWzFdWzFdOwogICAgICAgICAgICAgICAgICAgICBsZWZ0dG9wdiA9IHAtPmRhdGFbMl1bMV07Ci0gICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQocC0+ZGF0YVsxXSArIGZha2VfdXN0cmlkZSArIDIsIHAtPmRhdGFbMV0gKyAyLCBzLT50ZW1wWzFdLCB3aWR0aDIgLSAyLCAmbGVmdHUsICZsZWZ0dG9wdSk7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2hmeXVfbWVkaWFuX3ByZWQocC0+ZGF0YVsyXSArIGZha2VfdnN0cmlkZSArIDIsIHAtPmRhdGFbMl0gKyAyLCBzLT50ZW1wWzJdLCB3aWR0aDIgLSAyLCAmbGVmdHYsICZsZWZ0dG9wdik7CisgICAgICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9tZWRpYW5fcHJlZChwLT5kYXRhWzFdICsgZmFrZV91c3RyaWRlICsgMiwgcC0+ZGF0YVsxXSArIDIsIHMtPnRlbXBbMV0sIHdpZHRoMiAtIDIsICZsZWZ0dSwgJmxlZnR0b3B1KTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX21lZGlhbl9wcmVkKHAtPmRhdGFbMl0gKyBmYWtlX3ZzdHJpZGUgKyAyLCBwLT5kYXRhWzJdICsgMiwgcy0+dGVtcFsyXSwgd2lkdGgyIC0gMiwgJmxlZnR2LCAmbGVmdHRvcHYpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB5Kys7CiAgICAgICAgICAgICAgICAgY3krKzsKQEAgLTExNDYsNyArMTE1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMiAqIGN5ID4geSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9ncmF5X2JpdHN0cmVhbShzLCB3aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWRzdCA9IHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5hZGRfaGZ5dV9tZWRpYW5fcHJlZCh5ZHN0LCB5ZHN0IC0gZmFrZV95c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9tZWRpYW5fcHJlZCh5ZHN0LCB5ZHN0IC0gZmFrZV95c3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dGVtcFswXSwgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdHksICZsZWZ0dG9weSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSsrOwpAQCAtMTE2MiwxMiArMTE2OSwxMiBAQAogICAgICAgICAgICAgICAgICAgICB1ZHN0ID0gcC0+ZGF0YVsxXSArIHAtPmxpbmVzaXplWzFdICogY3k7CiAgICAgICAgICAgICAgICAgICAgIHZkc3QgPSBwLT5kYXRhWzJdICsgcC0+bGluZXNpemVbMl0gKiBjeTsKIAotICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLmFkZF9oZnl1X21lZGlhbl9wcmVkKHlkc3QsIHlkc3QgLSBmYWtlX3lzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9tZWRpYW5fcHJlZCh5ZHN0LCB5ZHN0IC0gZmFrZV95c3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRlbXBbMF0sIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0eSwgJmxlZnR0b3B5KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dSQVkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5oZHNwLmFkZF9oZnl1X21lZGlhbl9wcmVkKHVkc3QsIHVkc3QgLSBmYWtlX3VzdHJpZGUsIHMtPnRlbXBbMV0sIHdpZHRoMiwgJmxlZnR1LCAmbGVmdHRvcHUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGRzcC5hZGRfaGZ5dV9tZWRpYW5fcHJlZCh2ZHN0LCB2ZHN0IC0gZmFrZV92c3RyaWRlLCBzLT50ZW1wWzJdLCB3aWR0aDIsICZsZWZ0diwgJmxlZnR0b3B2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9tZWRpYW5fcHJlZCh1ZHN0LCB1ZHN0IC0gZmFrZV91c3RyaWRlLCBzLT50ZW1wWzFdLCB3aWR0aDIsICZsZWZ0dSwgJmxlZnR0b3B1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9tZWRpYW5fcHJlZCh2ZHN0LCB2ZHN0IC0gZmFrZV92c3RyaWRlLCBzLT50ZW1wWzJdLCB3aWR0aDIsICZsZWZ0diwgJmxlZnR0b3B2KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtMTIxMCw3ICsxMjE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5iaXRzdHJlYW1fYnBwICE9IDMyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRbQV0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHkgPCBzLT5oZWlnaHQgLSAxIC0gcy0+aW50ZXJsYWNlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AuYWRkX2J5dGVzKHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2J5dGVzKHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdICogeSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZV95c3RyaWRlLCA0ICogd2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9odWZmeXV2ZHNwLmMgYi9saWJhdmNvZGVjL2h1ZmZ5dXZkc3AuYwppbmRleCBlOGEwNWY2Li43Yjg2NWZlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2h1ZmZ5dXZkc3AuYworKysgYi9saWJhdmNvZGVjL2h1ZmZ5dXZkc3AuYwpAQCAtMjMsMzYgKzIzLDMyIEBACiAjaW5jbHVkZSAibWF0aG9wcy5oIgogI2luY2x1ZGUgImh1ZmZ5dXZkc3AuaCIKIAotLy8gMHg3ZjdmN2Y3ZiBvciAweDdmN2Y3ZjdmN2Y3ZjdmN2Ygb3Igd2hhdGV2ZXIsIGRlcGVuZGluZyBvbiB0aGUgY3B1J3MgbmF0aXZlIGFyaXRobWV0aWMgc2l6ZQotI2RlZmluZSBwYl83ZiAofjBVTCAvIDI1NSAqIDB4N2YpCi0jZGVmaW5lIHBiXzgwICh+MFVMIC8gMjU1ICogMHg4MCkKKy8vIDB4MDAwMTAwMDEgb3IgMHgwMDAxMDAwMTAwMDEwMDAxIG9yIHdoYXRldmVyLCBkZXBlbmRpbmcgb24gdGhlIGNwdSdzIG5hdGl2ZSBhcml0aG1ldGljIHNpemUKKyNkZWZpbmUgcHdfMSAoVUxPTkdfTUFYIC8gVUlOVDE2X01BWCkKIAotc3RhdGljIHZvaWQgYWRkX2J5dGVzX2ModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludHB0cl90IHcpCi17CitzdGF0aWMgdm9pZCBhZGRfaW50MTZfYyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdyl7CiAgICAgbG9uZyBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8PSB3IC0gKGludCkgc2l6ZW9mKGxvbmcpOyBpICs9IHNpemVvZihsb25nKSkgewotICAgICAgICBsb25nIGEgPSAqKGxvbmcgKikgKHNyYyArIGkpOwotICAgICAgICBsb25nIGIgPSAqKGxvbmcgKikgKGRzdCArIGkpOwotICAgICAgICAqKGxvbmcgKikgKGRzdCArIGkpID0gKChhICYgcGJfN2YpICsgKGIgJiBwYl83ZikpIF4gKChhIF4gYikgJiBwYl84MCk7CisgICAgdW5zaWduZWQgbG9uZyBwd19sc2IgPSAobWFzayA+PiAxKSAqIHB3XzE7CisgICAgdW5zaWduZWQgbG9uZyBwd19tc2IgPSBwd19sc2IgKyAgcHdfMTsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IHcgLSAoaW50KXNpemVvZihsb25nKS8yOyBpICs9IHNpemVvZihsb25nKS8yKSB7CisgICAgICAgIGxvbmcgYSA9ICoobG9uZyopKHNyYytpKTsKKyAgICAgICAgbG9uZyBiID0gKihsb25nKikoZHN0K2kpOworICAgICAgICAqKGxvbmcqKShkc3QraSkgPSAoKGEmcHdfbHNiKSArIChiJnB3X2xzYikpIF4gKChhXmIpJnB3X21zYik7CiAgICAgfQotICAgIGZvciAoOyBpIDwgdzsgaSsrKQotICAgICAgICBkc3RbaSArIDBdICs9IHNyY1tpICsgMF07CisgICAgZm9yKDsgaTx3OyBpKyspCisgICAgICAgIGRzdFtpXSA9IChkc3RbaV0gKyBzcmNbaV0pICYgbWFzazsKIH0KIAotc3RhdGljIHZvaWQgYWRkX2hmeXVfbWVkaWFuX3ByZWRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpZmYsIGludHB0cl90IHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCkKLXsKK3N0YXRpYyB2b2lkIGFkZF9oZnl1X21lZGlhbl9wcmVkX2ludDE2X2ModWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgY29uc3QgdWludDE2X3QgKmRpZmYsIHVuc2lnbmVkIG1hc2ssIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApewogICAgIGludCBpOwotICAgIHVpbnQ4X3QgbCwgbHQ7CisgICAgdWludDE2X3QgbCwgbHQ7CiAKICAgICBsICA9ICpsZWZ0OwogICAgIGx0ID0gKmxlZnRfdG9wOwogCi0gICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgewotICAgICAgICBsICAgICAgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkgJiAweEZGKSArIGRpZmZbaV07Ci0gICAgICAgIGx0ICAgICA9IHNyYzFbaV07CisgICAgZm9yKGk9MDsgaTx3OyBpKyspeworICAgICAgICBsICA9IChtaWRfcHJlZChsLCBzcmNbaV0sIChsICsgc3JjW2ldIC0gbHQpICYgbWFzaykgKyBkaWZmW2ldKSAmIG1hc2s7CisgICAgICAgIGx0ID0gc3JjW2ldOwogICAgICAgICBkc3RbaV0gPSBsOwogICAgIH0KIApAQCAtNjAsMjcgKzU2LDYgQEAKICAgICAqbGVmdF90b3AgPSBsdDsKIH0KIAotc3RhdGljIGludCBhZGRfaGZ5dV9sZWZ0X3ByZWRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50cHRyX3QgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjYykKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCB3IC0gMTsgaSsrKSB7Ci0gICAgICAgIGFjYyAgICs9IHNyY1tpXTsKLSAgICAgICAgZHN0W2ldID0gYWNjOwotICAgICAgICBpKys7Ci0gICAgICAgIGFjYyAgICs9IHNyY1tpXTsKLSAgICAgICAgZHN0W2ldID0gYWNjOwotICAgIH0KLQotICAgIGZvciAoOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgIGFjYyAgICs9IHNyY1tpXTsKLSAgICAgICAgZHN0W2ldID0gYWNjOwotICAgIH0KLQotICAgIHJldHVybiBhY2M7Ci19Ci0KIHN0YXRpYyB2b2lkIGFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMl9jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgdywgdWludDhfdCAqbGVmdCkKIHsKQEAgLTEwNSwxMyArODAsMTIgQEAKICAgICBsZWZ0W0FdID0gYTsKIH0KIAotYXZfY29sZCB2b2lkIGZmX2h1ZmZ5dXZkc3BfaW5pdChIdWZmWVVWRFNQQ29udGV4dCAqYykKK2F2X2NvbGQgdm9pZCBmZl9odWZmeXV2ZHNwX2luaXQoSHVmZllVVkRTUENvbnRleHQgKmMsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQogewotICAgIGMtPmFkZF9ieXRlcyAgICAgICAgICAgICAgICA9IGFkZF9ieXRlc19jOwotICAgIGMtPmFkZF9oZnl1X21lZGlhbl9wcmVkICAgICA9IGFkZF9oZnl1X21lZGlhbl9wcmVkX2M7Ci0gICAgYy0+YWRkX2hmeXVfbGVmdF9wcmVkICAgICAgID0gYWRkX2hmeXVfbGVmdF9wcmVkX2M7CisgICAgYy0+YWRkX2ludDE2ID0gYWRkX2ludDE2X2M7CisgICAgYy0+YWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYgPSBhZGRfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNl9jOwogICAgIGMtPmFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMiA9IGFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMl9jOwogCiAgICAgaWYgKEFSQ0hfWDg2KQotICAgICAgICBmZl9odWZmeXV2ZHNwX2luaXRfeDg2KGMpOworICAgICAgICBmZl9odWZmeXV2ZHNwX2luaXRfeDg2KGMsIHBpeF9mbXQpOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9odWZmeXV2ZHNwLmggYi9saWJhdmNvZGVjL2h1ZmZ5dXZkc3AuaAppbmRleCBkYjM3NzI4Li5lNWY1YjA1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2h1ZmZ5dXZkc3AuaAorKysgYi9saWJhdmNvZGVjL2h1ZmZ5dXZkc3AuaApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBBVkNPREVDX0hVRkZZVVZEU1BfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgogI2luY2x1ZGUgImNvbmZpZy5oIgogCiAjaWYgSEFWRV9CSUdFTkRJQU4KQEAgLTM1LDE5ICszNiwxNyBAQAogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IEh1ZmZZVVZEU1BDb250ZXh0IHsKLSAgICB2b2lkICgqYWRkX2J5dGVzKSh1aW50OF90ICpkc3QgLyogYWxpZ24gMTYgKi8sIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxNiAqLywKLSAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3KTsKLSAgICB2b2lkICgqYWRkX2hmeXVfbWVkaWFuX3ByZWQpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgaW50cHRyX3QgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7Ci0gICAgaW50ICgqYWRkX2hmeXVfbGVmdF9wcmVkKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcsIGludCBsZWZ0KTsKKyAgICB2b2lkICgqYWRkX2ludDE2KSh1aW50MTZfdCAqZHN0LyphbGlnbiAxNiovLCBjb25zdCB1aW50MTZfdCAqc3JjLyphbGlnbiAxNiovLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKKworICAgIHZvaWQgKCphZGRfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNikodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpkaWZmLCB1bnNpZ25lZCBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7CiAgICAgdm9pZCAoKmFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMikodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgdywgdWludDhfdCAqbGVmdCk7CiB9IEh1ZmZZVVZEU1BDb250ZXh0OwogCi12b2lkIGZmX2h1ZmZ5dXZkc3BfaW5pdChIdWZmWVVWRFNQQ29udGV4dCAqYyk7Ci12b2lkIGZmX2h1ZmZ5dXZkc3BfaW5pdF9wcGMoSHVmZllVVkRTUENvbnRleHQgKmMpOwotdm9pZCBmZl9odWZmeXV2ZHNwX2luaXRfeDg2KEh1ZmZZVVZEU1BDb250ZXh0ICpjKTsKK3ZvaWQgZmZfaHVmZnl1dmRzcF9pbml0KEh1ZmZZVVZEU1BDb250ZXh0ICpjLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCk7Cit2b2lkIGZmX2h1ZmZ5dXZkc3BfaW5pdF94ODYoSHVmZllVVkRTUENvbnRleHQgKmMsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfSFVGRllVVkRTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2h1ZmZ5dXZlbmMuYyBiL2xpYmF2Y29kZWMvaHVmZnl1dmVuYy5jCmluZGV4IDU3MmRlMTYuLjhiZTc1MjggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaHVmZnl1dmVuYy5jCisrKyBiL2xpYmF2Y29kZWMvaHVmZnl1dmVuYy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiaHVmZm1hbi5oIgogI2luY2x1ZGUgImh1ZmZ5dXZlbmNkc3AuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvc3NsZXNzX3ZpZGVvZW5jZHNwLmgiCiAjaW5jbHVkZSAicHV0X2JpdHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKQEAgLTQxLDkgKzQyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzAsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGludCB3KQogewogICAgIGlmIChzLT5icHMgPD0gOCkgewotICAgICAgICBzLT5oZW5jZHNwLmRpZmZfYnl0ZXMoZHN0LCBzcmMwLCBzcmMxLCB3KTsKKyAgICAgICAgcy0+bGx2aWRlbmNkc3AuZGlmZl9ieXRlcyhkc3QsIHNyYzAsIHNyYzEsIHcpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHMtPmxsdmlkZHNwLmRpZmZfaW50MTYoKHVpbnQxNl90ICopZHN0LCAoY29uc3QgdWludDE2X3QgKilzcmMwLCAoY29uc3QgdWludDE2X3QgKilzcmMxLCBzLT5uIC0gMSwgdyk7CisgICAgICAgIHMtPmhlbmNkc3AuZGlmZl9pbnQxNigodWludDE2X3QgKilkc3QsIChjb25zdCB1aW50MTZfdCAqKXNyYzAsIChjb25zdCB1aW50MTZfdCAqKXNyYzEsIHMtPm4gLSAxLCB3KTsKICAgICB9CiB9CiAKQEAgLTUxLDQyICs1MiwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCB3LCBpbnQgbGVmdCkKIHsKICAgICBpbnQgaTsKKyAgICBpbnQgbWluX3dpZHRoID0gRkZNSU4odywgMzIpOworCiAgICAgaWYgKHMtPmJwcyA8PSA4KSB7Ci0gICAgICAgIGlmICh3IDwgMzIpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGVtcCA9IHNyY1tpXTsKLSAgICAgICAgICAgICAgICBkc3RbaV0gPSB0ZW1wIC0gbGVmdDsKLSAgICAgICAgICAgICAgICBsZWZ0ICAgPSB0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCB0ZW1wID0gc3JjW2ldOwotICAgICAgICAgICAgICAgIGRzdFtpXSA9IHRlbXAgLSBsZWZ0OwotICAgICAgICAgICAgICAgIGxlZnQgICA9IHRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzLT5oZW5jZHNwLmRpZmZfYnl0ZXMoZHN0ICsgMzIsIHNyYyArIDMyLCBzcmMgKyAzMSwgdyAtIDMyKTsKLSAgICAgICAgICAgIHJldHVybiBzcmNbdy0xXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1pbl93aWR0aDsgaSsrKSB7IC8qIHNjYWxhciBsb29wIGJlZm9yZSBkc3AgY2FsbCAqLworICAgICAgICAgICAgY29uc3QgaW50IHRlbXAgPSBzcmNbaV07CisgICAgICAgICAgICBkc3RbaV0gPSB0ZW1wIC0gbGVmdDsKKyAgICAgICAgICAgIGxlZnQgICA9IHRlbXA7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHcgPCAzMikKKyAgICAgICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICBzLT5sbHZpZGVuY2RzcC5kaWZmX2J5dGVzKGRzdCArIDMyLCBzcmMgKyAzMiwgc3JjICsgMzEsIHcgLSAzMik7CisgICAgICAgIHJldHVybiBzcmNbdy0xXTsKICAgICB9IGVsc2UgewogICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjMTYgPSAoY29uc3QgdWludDE2X3QgKilzcmM7CiAgICAgICAgIHVpbnQxNl90ICAgICAgICpkc3QxNiA9ICggICAgICB1aW50MTZfdCAqKWRzdDsKLSAgICAgICAgaWYgKHcgPCAzMikgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCB0ZW1wID0gc3JjMTZbaV07Ci0gICAgICAgICAgICAgICAgZHN0MTZbaV0gPSB0ZW1wIC0gbGVmdDsKLSAgICAgICAgICAgICAgICBsZWZ0ICAgPSB0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCB0ZW1wID0gc3JjMTZbaV07Ci0gICAgICAgICAgICAgICAgZHN0MTZbaV0gPSB0ZW1wIC0gbGVmdDsKLSAgICAgICAgICAgICAgICBsZWZ0ICAgPSB0ZW1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+bGx2aWRkc3AuZGlmZl9pbnQxNihkc3QxNiArIDE2LCBzcmMxNiArIDE2LCBzcmMxNiArIDE1LCBzLT5uIC0gMSwgdyAtIDE2KTsKLSAgICAgICAgICAgIHJldHVybiBzcmMxNlt3LTFdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWluX3dpZHRoOyBpKyspIHsgLyogc2NhbGFyIGxvb3AgYmVmb3JlIGRzcCBjYWxsICovCisgICAgICAgICAgICBjb25zdCBpbnQgdGVtcCA9IHNyYzE2W2ldOworICAgICAgICAgICAgZHN0MTZbaV0gPSB0ZW1wIC0gbGVmdDsKKyAgICAgICAgICAgIGxlZnQgICA9IHRlbXA7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHcgPCAzMikKKyAgICAgICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICBzLT5oZW5jZHNwLmRpZmZfaW50MTYoZHN0MTYgKyAzMiwgc3JjMTYgKyAzMiwgc3JjMTYgKyAzMSwgcy0+biAtIDEsIHcgLSAzMik7CisgICAgICAgIHJldHVybiBzcmMxNlt3LTFdOwogICAgIH0KIH0KIApAQCAtOTcsMTIgKzg2LDEzIEBACiB7CiAgICAgaW50IGk7CiAgICAgaW50IHIsIGcsIGIsIGE7CisgICAgaW50IG1pbl93aWR0aCA9IEZGTUlOKHcsIDgpOwogICAgIHIgPSAqcmVkOwogICAgIGcgPSAqZ3JlZW47CiAgICAgYiA9ICpibHVlOwogICAgIGEgPSAqYWxwaGE7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZNSU4odywgNCk7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBtaW5fd2lkdGg7IGkrKykgewogICAgICAgICBjb25zdCBpbnQgcnQgPSBzcmNbaSAqIDQgKyBSXTsKICAgICAgICAgY29uc3QgaW50IGd0ID0gc3JjW2kgKiA0ICsgR107CiAgICAgICAgIGNvbnN0IGludCBidCA9IHNyY1tpICogNCArIEJdOwpAQCAtMTE3LDcgKzEwNyw3IEBACiAgICAgICAgIGEgPSBhdDsKICAgICB9CiAKLSAgICBzLT5oZW5jZHNwLmRpZmZfYnl0ZXMoZHN0ICsgMTYsIHNyYyArIDE2LCBzcmMgKyAxMiwgdyAqIDQgLSAxNik7CisgICAgcy0+bGx2aWRlbmNkc3AuZGlmZl9ieXRlcyhkc3QgKyAzMiwgc3JjICsgMzIsIHNyYyArIDMyIC0gNCwgdyAqIDQgLSAzMik7CiAKICAgICAqcmVkICAgPSBzcmNbKHcgLSAxKSAqIDQgKyBSXTsKICAgICAqZ3JlZW4gPSBzcmNbKHcgLSAxKSAqIDQgKyBHXTsKQEAgLTE0Niw3ICsxMzYsNyBAQAogICAgICAgICBiID0gYnQ7CiAgICAgfQogCi0gICAgcy0+aGVuY2RzcC5kaWZmX2J5dGVzKGRzdCArIDQ4LCBzcmMgKyA0OCwgc3JjICsgNDggLSAzLCB3ICogMyAtIDQ4KTsKKyAgICBzLT5sbHZpZGVuY2RzcC5kaWZmX2J5dGVzKGRzdCArIDQ4LCBzcmMgKyA0OCwgc3JjICsgNDggLSAzLCB3ICogMyAtIDQ4KTsKIAogICAgICpyZWQgICA9IHNyY1sodyAtIDEpICogMyArIDBdOwogICAgICpncmVlbiA9IHNyY1sodyAtIDEpICogMyArIDFdOwpAQCAtMTU2LDkgKzE0Niw5IEBACiBzdGF0aWMgdm9pZCBzdWJfbWVkaWFuX3ByZWRpY3Rpb24oSFl1dkNvbnRleHQgKnMsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHcsIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCkKIHsKICAgICBpZiAocy0+YnBzIDw9IDgpIHsKLSAgICAgICAgcy0+aGVuY2RzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZChkc3QsIHNyYzEsIHNyYzIsIHcgLCBsZWZ0LCBsZWZ0X3RvcCk7CisgICAgICAgIHMtPmxsdmlkZW5jZHNwLnN1Yl9tZWRpYW5fcHJlZChkc3QsIHNyYzEsIHNyYzIsIHcgLCBsZWZ0LCBsZWZ0X3RvcCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcy0+bGx2aWRkc3Auc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYoKHVpbnQxNl90ICopZHN0LCAoY29uc3QgdWludDE2X3QgKilzcmMxLCAoY29uc3QgdWludDE2X3QgKilzcmMyLCBzLT5uIC0gMSwgdyAsIGxlZnQsIGxlZnRfdG9wKTsKKyAgICAgICAgcy0+aGVuY2RzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNigodWludDE2X3QgKilkc3QsIChjb25zdCB1aW50MTZfdCAqKXNyYzEsIChjb25zdCB1aW50MTZfdCAqKXNyYzIsIHMtPm4gLSAxLCB3ICwgbGVmdCwgbGVmdF90b3ApOwogICAgIH0KIH0KIApAQCAtMjE3LDcgKzIwNyw4IEBACiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CiAKICAgICBmZl9odWZmeXV2X2NvbW1vbl9pbml0KGF2Y3R4KTsKLSAgICBmZl9odWZmeXV2ZW5jZHNwX2luaXQoJnMtPmhlbmNkc3ApOworICAgIGZmX2h1ZmZ5dXZlbmNkc3BfaW5pdCgmcy0+aGVuY2RzcCwgYXZjdHgpOworICAgIGZmX2xsdmlkZW5jZHNwX2luaXQoJnMtPmxsdmlkZW5jZHNwKTsKIAogICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KDMqTUFYX04gKyA0KTsKICAgICBpZiAocy0+ZmxhZ3MmQVZfQ09ERUNfRkxBR19QQVNTMSkgewpAQCAtODIzLDkgKzgxNCw5IEBACiAgICAgICAgICAgICBsZWZ0dG9weSA9IHAtPmRhdGFbMF1bM107CiAgICAgICAgICAgICBsZWZ0dG9wdSA9IHAtPmRhdGFbMV1bMV07CiAgICAgICAgICAgICBsZWZ0dG9wdiA9IHAtPmRhdGFbMl1bMV07Ci0gICAgICAgICAgICBzLT5oZW5jZHNwLnN1Yl9oZnl1X21lZGlhbl9wcmVkKHMtPnRlbXBbMF0sIHAtPmRhdGFbMF0gKyA0LCBwLT5kYXRhWzBdICsgZmFrZV95c3RyaWRlICsgNCwgd2lkdGggIC0gNCwgJmxlZnR5LCAmbGVmdHRvcHkpOwotICAgICAgICAgICAgcy0+aGVuY2RzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZChzLT50ZW1wWzFdLCBwLT5kYXRhWzFdICsgMiwgcC0+ZGF0YVsxXSArIGZha2VfdXN0cmlkZSArIDIsIHdpZHRoMiAtIDIsICZsZWZ0dSwgJmxlZnR0b3B1KTsKLSAgICAgICAgICAgIHMtPmhlbmNkc3Auc3ViX2hmeXVfbWVkaWFuX3ByZWQocy0+dGVtcFsyXSwgcC0+ZGF0YVsyXSArIDIsIHAtPmRhdGFbMl0gKyBmYWtlX3ZzdHJpZGUgKyAyLCB3aWR0aDIgLSAyLCAmbGVmdHYsICZsZWZ0dG9wdik7CisgICAgICAgICAgICBzLT5sbHZpZGVuY2RzcC5zdWJfbWVkaWFuX3ByZWQocy0+dGVtcFswXSwgcC0+ZGF0YVswXSArIDQsIHAtPmRhdGFbMF0gKyBmYWtlX3lzdHJpZGUgKyA0LCB3aWR0aCAgLSA0LCAmbGVmdHksICZsZWZ0dG9weSk7CisgICAgICAgICAgICBzLT5sbHZpZGVuY2RzcC5zdWJfbWVkaWFuX3ByZWQocy0+dGVtcFsxXSwgcC0+ZGF0YVsxXSArIDIsIHAtPmRhdGFbMV0gKyBmYWtlX3VzdHJpZGUgKyAyLCB3aWR0aDIgLSAyLCAmbGVmdHUsICZsZWZ0dG9wdSk7CisgICAgICAgICAgICBzLT5sbHZpZGVuY2RzcC5zdWJfbWVkaWFuX3ByZWQocy0+dGVtcFsyXSwgcC0+ZGF0YVsyXSArIDIsIHAtPmRhdGFbMl0gKyBmYWtlX3ZzdHJpZGUgKyAyLCB3aWR0aDIgLSAyLCAmbGVmdHYsICZsZWZ0dG9wdik7CiAgICAgICAgICAgICBlbmNvZGVfNDIyX2JpdHN0cmVhbShzLCAwLCB3aWR0aCAtIDQpOwogICAgICAgICAgICAgeSsrOyBjeSsrOwogCkBAIC04MzUsNyArODI2LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocy0+Yml0c3RyZWFtX2JwcCA9PSAxMikgewogICAgICAgICAgICAgICAgICAgICB3aGlsZSAoMiAqIGN5ID4geSkgewogICAgICAgICAgICAgICAgICAgICAgICAgeWRzdCA9IHAtPmRhdGFbMF0gKyBwLT5saW5lc2l6ZVswXSAqIHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5oZW5jZHNwLnN1Yl9oZnl1X21lZGlhbl9wcmVkKHMtPnRlbXBbMF0sIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHlkc3QsIHdpZHRoLCAmbGVmdHksICZsZWZ0dG9weSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5sbHZpZGVuY2RzcC5zdWJfbWVkaWFuX3ByZWQocy0+dGVtcFswXSwgeWRzdCAtIGZha2VfeXN0cmlkZSwgeWRzdCwgd2lkdGgsICZsZWZ0eSwgJmxlZnR0b3B5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9ncmF5X2JpdHN0cmVhbShzLCB3aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB5Kys7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTg0NSw5ICs4MzYsOSBAQAogICAgICAgICAgICAgICAgIHVkc3QgPSBwLT5kYXRhWzFdICsgcC0+bGluZXNpemVbMV0gKiBjeTsKICAgICAgICAgICAgICAgICB2ZHN0ID0gcC0+ZGF0YVsyXSArIHAtPmxpbmVzaXplWzJdICogY3k7CiAKLSAgICAgICAgICAgICAgICBzLT5oZW5jZHNwLnN1Yl9oZnl1X21lZGlhbl9wcmVkKHMtPnRlbXBbMF0sIHlkc3QgLSBmYWtlX3lzdHJpZGUsIHlkc3QsIHdpZHRoLCAgJmxlZnR5LCAmbGVmdHRvcHkpOwotICAgICAgICAgICAgICAgIHMtPmhlbmNkc3Auc3ViX2hmeXVfbWVkaWFuX3ByZWQocy0+dGVtcFsxXSwgdWRzdCAtIGZha2VfdXN0cmlkZSwgdWRzdCwgd2lkdGgyLCAmbGVmdHUsICZsZWZ0dG9wdSk7Ci0gICAgICAgICAgICAgICAgcy0+aGVuY2RzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZChzLT50ZW1wWzJdLCB2ZHN0IC0gZmFrZV92c3RyaWRlLCB2ZHN0LCB3aWR0aDIsICZsZWZ0diwgJmxlZnR0b3B2KTsKKyAgICAgICAgICAgICAgICBzLT5sbHZpZGVuY2RzcC5zdWJfbWVkaWFuX3ByZWQocy0+dGVtcFswXSwgeWRzdCAtIGZha2VfeXN0cmlkZSwgeWRzdCwgd2lkdGgsICAmbGVmdHksICZsZWZ0dG9weSk7CisgICAgICAgICAgICAgICAgcy0+bGx2aWRlbmNkc3Auc3ViX21lZGlhbl9wcmVkKHMtPnRlbXBbMV0sIHVkc3QgLSBmYWtlX3VzdHJpZGUsIHVkc3QsIHdpZHRoMiwgJmxlZnR1LCAmbGVmdHRvcHUpOworICAgICAgICAgICAgICAgIHMtPmxsdmlkZW5jZHNwLnN1Yl9tZWRpYW5fcHJlZChzLT50ZW1wWzJdLCB2ZHN0IC0gZmFrZV92c3RyaWRlLCB2ZHN0LCB3aWR0aDIsICZsZWZ0diwgJmxlZnR0b3B2KTsKIAogICAgICAgICAgICAgICAgIGVuY29kZV80MjJfYml0c3RyZWFtKHMsIDAsIHdpZHRoKTsKICAgICAgICAgICAgIH0KQEAgLTg2MCw3ICs4NTEsNyBAQAogICAgICAgICAgICAgICAgICAgICB5ZHN0ID0gcC0+ZGF0YVswXSArIHAtPmxpbmVzaXplWzBdICogeTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAocy0+cHJlZGljdG9yID09IFBMQU5FICYmIHMtPmludGVybGFjZWQgPCB5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5oZW5jZHNwLmRpZmZfYnl0ZXMocy0+dGVtcFsxXSwgeWRzdCwgeWRzdCAtIGZha2VfeXN0cmlkZSwgd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGx2aWRlbmNkc3AuZGlmZl9ieXRlcyhzLT50ZW1wWzFdLCB5ZHN0LCB5ZHN0IC0gZmFrZV95c3RyaWRlLCB3aWR0aCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnR5ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzBdLCBzLT50ZW1wWzFdLCB3aWR0aCAsIGxlZnR5KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTg3Niw5ICs4NjcsOSBAQAogICAgICAgICAgICAgICAgIHZkc3QgPSBwLT5kYXRhWzJdICsgcC0+bGluZXNpemVbMl0gKiBjeTsKIAogICAgICAgICAgICAgICAgIGlmIChzLT5wcmVkaWN0b3IgPT0gUExBTkUgJiYgcy0+aW50ZXJsYWNlZCA8IGN5KSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmhlbmNkc3AuZGlmZl9ieXRlcyhzLT50ZW1wWzFdLCAgICAgICAgICB5ZHN0LCB5ZHN0IC0gZmFrZV95c3RyaWRlLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmhlbmNkc3AuZGlmZl9ieXRlcyhzLT50ZW1wWzJdLCAgICAgICAgICB1ZHN0LCB1ZHN0IC0gZmFrZV91c3RyaWRlLCB3aWR0aDIpOwotICAgICAgICAgICAgICAgICAgICBzLT5oZW5jZHNwLmRpZmZfYnl0ZXMocy0+dGVtcFsyXSArIHdpZHRoMiwgdmRzdCwgdmRzdCAtIGZha2VfdnN0cmlkZSwgd2lkdGgyKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bGx2aWRlbmNkc3AuZGlmZl9ieXRlcyhzLT50ZW1wWzFdLCAgICAgICAgICB5ZHN0LCB5ZHN0IC0gZmFrZV95c3RyaWRlLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIHMtPmxsdmlkZW5jZHNwLmRpZmZfYnl0ZXMocy0+dGVtcFsyXSwgICAgICAgICAgdWRzdCwgdWRzdCAtIGZha2VfdXN0cmlkZSwgd2lkdGgyKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+bGx2aWRlbmNkc3AuZGlmZl9ieXRlcyhzLT50ZW1wWzJdICsgd2lkdGgyLCB2ZHN0LCB2ZHN0IC0gZmFrZV92c3RyaWRlLCB3aWR0aDIpOwogCiAgICAgICAgICAgICAgICAgICAgIGxlZnR5ID0gc3ViX2xlZnRfcHJlZGljdGlvbihzLCBzLT50ZW1wWzBdLCBzLT50ZW1wWzFdLCB3aWR0aCAsIGxlZnR5KTsKICAgICAgICAgICAgICAgICAgICAgbGVmdHUgPSBzdWJfbGVmdF9wcmVkaWN0aW9uKHMsIHMtPnRlbXBbMV0sIHMtPnRlbXBbMl0sIHdpZHRoMiwgbGVmdHUpOwpAQCAtOTExLDcgKzkwMiw3IEBACiAgICAgICAgIGZvciAoeSA9IDE7IHkgPCBzLT5oZWlnaHQ7IHkrKykgewogICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gZGF0YSArIHkqc3RyaWRlOwogICAgICAgICAgICAgaWYgKHMtPnByZWRpY3RvciA9PSBQTEFORSAmJiBzLT5pbnRlcmxhY2VkIDwgeSkgewotICAgICAgICAgICAgICAgIHMtPmhlbmNkc3AuZGlmZl9ieXRlcyhzLT50ZW1wWzFdLCBkc3QsIGRzdCAtIGZha2Vfc3RyaWRlLCB3aWR0aCAqIDQpOworICAgICAgICAgICAgICAgIHMtPmxsdmlkZW5jZHNwLmRpZmZfYnl0ZXMocy0+dGVtcFsxXSwgZHN0LCBkc3QgLSBmYWtlX3N0cmlkZSwgd2lkdGggKiA0KTsKICAgICAgICAgICAgICAgICBzdWJfbGVmdF9wcmVkaWN0aW9uX2JncjMyKHMsIHMtPnRlbXBbMF0sIHMtPnRlbXBbMV0sIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlZnRyLCAmbGVmdGcsICZsZWZ0YiwgJmxlZnRhKTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC05MzksNyArOTMwLDcgQEAKICAgICAgICAgZm9yICh5ID0gMTsgeSA8IHMtPmhlaWdodDsgeSsrKSB7CiAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBkYXRhICsgeSAqIHN0cmlkZTsKICAgICAgICAgICAgIGlmIChzLT5wcmVkaWN0b3IgPT0gUExBTkUgJiYgcy0+aW50ZXJsYWNlZCA8IHkpIHsKLSAgICAgICAgICAgICAgICBzLT5oZW5jZHNwLmRpZmZfYnl0ZXMocy0+dGVtcFsxXSwgZHN0LCBkc3QgLSBmYWtlX3N0cmlkZSwKKyAgICAgICAgICAgICAgICBzLT5sbHZpZGVuY2RzcC5kaWZmX2J5dGVzKHMtPnRlbXBbMV0sIGRzdCwgZHN0IC0gZmFrZV9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICogMyk7CiAgICAgICAgICAgICAgICAgc3ViX2xlZnRfcHJlZGljdGlvbl9yZ2IyNChzLCBzLT50ZW1wWzBdLCBzLT50ZW1wWzFdLCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZWZ0ciwgJmxlZnRnLCAmbGVmdGIpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9odWZmeXV2ZW5jZHNwLmMgYi9saWJhdmNvZGVjL2h1ZmZ5dXZlbmNkc3AuYwppbmRleCBmZGNkMGIwLi40MjdkMTE4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2h1ZmZ5dXZlbmNkc3AuYworKysgYi9saWJhdmNvZGVjL2h1ZmZ5dXZlbmNkc3AuYwpAQCAtMjEsNjQgKzIxLDU4IEBACiAjaW5jbHVkZSAiaHVmZnl1dmVuY2RzcC5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKIAotLy8gMHg3ZjdmN2Y3ZiBvciAweDdmN2Y3ZjdmN2Y3ZjdmN2Ygb3Igd2hhdGV2ZXIsIGRlcGVuZGluZyBvbiB0aGUgY3B1J3MgbmF0aXZlIGFyaXRobWV0aWMgc2l6ZQotI2RlZmluZSBwYl83ZiAofjBVTCAvIDI1NSAqIDB4N2YpCi0jZGVmaW5lIHBiXzgwICh+MFVMIC8gMjU1ICogMHg4MCkKKy8vIDB4MDAwMTAwMDEgb3IgMHgwMDAxMDAwMTAwMDEwMDAxIG9yIHdoYXRldmVyLCBkZXBlbmRpbmcgb24gdGhlIGNwdSdzIG5hdGl2ZSBhcml0aG1ldGljIHNpemUKKyNkZWZpbmUgcHdfMSAoVUxPTkdfTUFYIC8gVUlOVDE2X01BWCkKIAotc3RhdGljIHZvaWQgZGlmZl9ieXRlc19jKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwgaW50cHRyX3QgdykKLXsKK3N0YXRpYyB2b2lkIGRpZmZfaW50MTZfYyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsIHVuc2lnbmVkIG1hc2ssIGludCB3KXsKICAgICBsb25nIGk7Ci0KICNpZiAhSEFWRV9GQVNUX1VOQUxJR05FRAotICAgIGlmICgoKGxvbmcpc3JjMSB8IChsb25nKXNyYzIpICYgKHNpemVvZihsb25nKSAtIDEpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgKyA3IDwgdzsgaSArPSA4KSB7Ci0gICAgICAgICAgICBkc3RbaSArIDBdID0gc3JjMVtpICsgMF0gLSBzcmMyW2kgKyAwXTsKLSAgICAgICAgICAgIGRzdFtpICsgMV0gPSBzcmMxW2kgKyAxXSAtIHNyYzJbaSArIDFdOwotICAgICAgICAgICAgZHN0W2kgKyAyXSA9IHNyYzFbaSArIDJdIC0gc3JjMltpICsgMl07Ci0gICAgICAgICAgICBkc3RbaSArIDNdID0gc3JjMVtpICsgM10gLSBzcmMyW2kgKyAzXTsKLSAgICAgICAgICAgIGRzdFtpICsgNF0gPSBzcmMxW2kgKyA0XSAtIHNyYzJbaSArIDRdOwotICAgICAgICAgICAgZHN0W2kgKyA1XSA9IHNyYzFbaSArIDVdIC0gc3JjMltpICsgNV07Ci0gICAgICAgICAgICBkc3RbaSArIDZdID0gc3JjMVtpICsgNl0gLSBzcmMyW2kgKyA2XTsKLSAgICAgICAgICAgIGRzdFtpICsgN10gPSBzcmMxW2kgKyA3XSAtIHNyYzJbaSArIDddOworICAgIGlmKChsb25nKXNyYzIgJiAoc2l6ZW9mKGxvbmcpLTEpKXsKKyAgICAgICAgZm9yKGk9MDsgaSszPHc7IGkrPTQpeworICAgICAgICAgICAgZHN0W2krMF0gPSAoc3JjMVtpKzBdLXNyYzJbaSswXSkgJiBtYXNrOworICAgICAgICAgICAgZHN0W2krMV0gPSAoc3JjMVtpKzFdLXNyYzJbaSsxXSkgJiBtYXNrOworICAgICAgICAgICAgZHN0W2krMl0gPSAoc3JjMVtpKzJdLXNyYzJbaSsyXSkgJiBtYXNrOworICAgICAgICAgICAgZHN0W2krM10gPSAoc3JjMVtpKzNdLXNyYzJbaSszXSkgJiBtYXNrOwogICAgICAgICB9Ci0gICAgfSBlbHNlCisgICAgfWVsc2UKICNlbmRpZgotICAgIGZvciAoaSA9IDA7IGkgPD0gdyAtIChpbnQpIHNpemVvZihsb25nKTsgaSArPSBzaXplb2YobG9uZykpIHsKLSAgICAgICAgbG9uZyBhID0gKihsb25nICopIChzcmMxICsgaSk7Ci0gICAgICAgIGxvbmcgYiA9ICoobG9uZyAqKSAoc3JjMiArIGkpOwotICAgICAgICAqKGxvbmcgKikgKGRzdCArIGkpID0gKChhIHwgcGJfODApIC0gKGIgJiBwYl83ZikpIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYSBeIGIgXiBwYl84MCkgJiBwYl84MCk7CisgICAgeworICAgICAgICB1bnNpZ25lZCBsb25nIHB3X2xzYiA9IChtYXNrID4+IDEpICogcHdfMTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBwd19tc2IgPSBwd19sc2IgKyAgcHdfMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IHcgLSAoaW50KXNpemVvZihsb25nKS8yOyBpICs9IHNpemVvZihsb25nKS8yKSB7CisgICAgICAgICAgICBsb25nIGEgPSAqKGxvbmcqKShzcmMxK2kpOworICAgICAgICAgICAgbG9uZyBiID0gKihsb25nKikoc3JjMitpKTsKKyAgICAgICAgICAgICoobG9uZyopKGRzdCtpKSA9ICgoYXxwd19tc2IpIC0gKGImcHdfbHNiKSkgXiAoKGFeYl5wd19tc2IpJnB3X21zYik7CisgICAgICAgIH0KICAgICB9Ci0gICAgZm9yICg7IGkgPCB3OyBpKyspCi0gICAgICAgIGRzdFtpICsgMF0gPSBzcmMxW2kgKyAwXSAtIHNyYzJbaSArIDBdOworICAgIGZvciAoOyBpPHc7IGkrKykKKyAgICAgICAgZHN0W2ldID0gKHNyYzFbaV0gLSBzcmMyW2ldKSAmIG1hc2s7CiB9CiAKLXN0YXRpYyB2b2lkIHN1Yl9oZnl1X21lZGlhbl9wcmVkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnRwdHJfdCB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCi17CitzdGF0aWMgdm9pZCBzdWJfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNl9jKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMxLCBjb25zdCB1aW50MTZfdCAqc3JjMiwgdW5zaWduZWQgbWFzaywgaW50IHcsIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCl7CiAgICAgaW50IGk7Ci0gICAgdWludDhfdCBsLCBsdDsKKyAgICB1aW50MTZfdCBsLCBsdDsKIAogICAgIGwgID0gKmxlZnQ7CiAgICAgbHQgPSAqbGVmdF90b3A7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGludCBwcmVkID0gbWlkX3ByZWQobCwgc3JjMVtpXSwgKGwgKyBzcmMxW2ldIC0gbHQpICYgMHhGRik7Ci0gICAgICAgIGx0ICAgICA9IHNyYzFbaV07Ci0gICAgICAgIGwgICAgICA9IHNyYzJbaV07Ci0gICAgICAgIGRzdFtpXSA9IGwgLSBwcmVkOworICAgIGZvcihpPTA7IGk8dzsgaSsrKXsKKyAgICAgICAgY29uc3QgaW50IHByZWQgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkgJiBtYXNrKTsKKyAgICAgICAgbHQgPSBzcmMxW2ldOworICAgICAgICBsICA9IHNyYzJbaV07CisgICAgICAgIGRzdFtpXSA9IChsIC0gcHJlZCkgJiBtYXNrOwogICAgIH0KIAogICAgICpsZWZ0ICAgICA9IGw7CiAgICAgKmxlZnRfdG9wID0gbHQ7CiB9CiAKLWF2X2NvbGQgdm9pZCBmZl9odWZmeXV2ZW5jZHNwX2luaXQoSHVmZllVVkVuY0RTUENvbnRleHQgKmMpCithdl9jb2xkIHZvaWQgZmZfaHVmZnl1dmVuY2RzcF9pbml0KEh1ZmZZVVZFbmNEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgYy0+ZGlmZl9ieXRlcyAgICAgICAgICAgPSBkaWZmX2J5dGVzX2M7Ci0gICAgYy0+c3ViX2hmeXVfbWVkaWFuX3ByZWQgPSBzdWJfaGZ5dV9tZWRpYW5fcHJlZF9jOworICAgIGMtPmRpZmZfaW50MTYgICAgICAgICAgID0gZGlmZl9pbnQxNl9jOworICAgIGMtPnN1Yl9oZnl1X21lZGlhbl9wcmVkX2ludDE2ID0gc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfYzsKIAogICAgIGlmIChBUkNIX1g4NikKLSAgICAgICAgZmZfaHVmZnl1dmVuY2RzcF9pbml0X3g4NihjKTsKKyAgICAgICAgZmZfaHVmZnl1dmVuY2RzcF9pbml0X3g4NihjLCBhdmN0eCk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2h1ZmZ5dXZlbmNkc3AuaCBiL2xpYmF2Y29kZWMvaHVmZnl1dmVuY2RzcC5oCmluZGV4IDlkMDkwOTUuLjYwM2Y5YzggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaHVmZnl1dmVuY2RzcC5oCisrKyBiL2xpYmF2Y29kZWMvaHVmZnl1dmVuY2RzcC5oCkBAIC0yMSwyMSArMjEsMjAgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCiB0eXBlZGVmIHN0cnVjdCBIdWZmWVVWRW5jRFNQQ29udGV4dCB7Ci0gICAgdm9pZCAoKmRpZmZfYnl0ZXMpKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiAxNiAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMSAvKiBhbGlnbiAxNiAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiAvKiBhbGlnbiAxICovLAotICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3KTsKLSAgICAvKioKLSAgICAgKiBTdWJ0cmFjdCBIdWZmWVVWJ3MgdmFyaWFudCBvZiBtZWRpYW4gcHJlZGljdGlvbi4KLSAgICAgKiBOb3RlLCB0aGlzIG1pZ2h0IHJlYWQgZnJvbSBzcmMxWy0xXSwgc3JjMlstMV0uCi0gICAgICovCi0gICAgdm9pZCAoKnN1Yl9oZnl1X21lZGlhbl9wcmVkKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnRwdHJfdCB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKKyAgICB2b2lkICgqZGlmZl9pbnQxNikodWludDE2X3QgKmRzdCAvKiBhbGlnbiAxNiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYzEgLyogYWxpZ24gMTYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMyIC8qIGFsaWduIDEgKi8sCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKKworICAgIHZvaWQgKCpzdWJfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNikodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjMiwgdW5zaWduZWQgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApOwogfSBIdWZmWVVWRW5jRFNQQ29udGV4dDsKIAotdm9pZCBmZl9odWZmeXV2ZW5jZHNwX2luaXQoSHVmZllVVkVuY0RTUENvbnRleHQgKmMpOwotdm9pZCBmZl9odWZmeXV2ZW5jZHNwX2luaXRfeDg2KEh1ZmZZVVZFbmNEU1BDb250ZXh0ICpjKTsKK3ZvaWQgZmZfaHVmZnl1dmVuY2RzcF9pbml0KEh1ZmZZVVZFbmNEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwordm9pZCBmZl9odWZmeXV2ZW5jZHNwX2luaXRfeDg2KEh1ZmZZVVZFbmNEU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwogCiAjZW5kaWYgLyogQVZDT0RFQ19IVUZGWVVWRU5DRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaHdhY2NlbC5oIGIvbGliYXZjb2RlYy9od2FjY2VsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhYTkyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvaHdhY2NlbC5oCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX0hXQUNDRUxfSAorI2RlZmluZSBBVkNPREVDX0hXQUNDRUxfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImh3YWNjZWxzLmgiCisKKworI2RlZmluZSBIV0FDQ0VMX0NBUF9BU1lOQ19TQUZFICAgICAgKDEgPDwgMCkKKworCit0eXBlZGVmIHN0cnVjdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCB7CisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIHVzZXIgYnkKKyAgICAgKiBhdmNvZGVjX2dldF9od19jb25maWcoKS4KKyAgICAgKi8KKyAgICBBVkNvZGVjSFdDb25maWcgcHVibGljOworICAgIC8qKgorICAgICAqIElmIHRoaXMgY29uZmlndXJhdGlvbiB1c2VzIGEgaHdhY2NlbCwgYSBwb2ludGVyIHRvIGl0LgorICAgICAqIElmIG5vdCwgTlVMTC4KKyAgICAgKi8KKyAgICBjb25zdCBBVkhXQWNjZWwgKmh3YWNjZWw7Cit9IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsOworCisKKy8vIFRoZXNlIG1hY3JvcyBhcmUgdXNlZCB0byBzaW1wbGlmeSBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCBkZWZpbml0aW9ucy4KKworI2RlZmluZSBIV19DT05GSUdfSFdBQ0NFTChkZXZpY2UsIGZyYW1lcywgYWRfaG9jLCBmb3JtYXQsIGRldmljZV90eXBlXywgbmFtZSkgXAorICAgICYoY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwpIHsgXAorICAgICAgICAucHVibGljICAgICAgICAgID0geyBcCisgICAgICAgICAgICAucGl4X2ZtdCAgICAgPSBBVl9QSVhfRk1UXyAjIyBmb3JtYXQsIFwKKyAgICAgICAgICAgIC5tZXRob2RzICAgICA9IChkZXZpY2UgPyBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0hXX0RFVklDRV9DVFggOiAwKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZXMgPyBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0hXX0ZSQU1FU19DVFggOiAwKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZF9ob2MgPyBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0FEX0hPQyAgICAgICAgOiAwKSwgIFwKKyAgICAgICAgICAgIC5kZXZpY2VfdHlwZSA9IEFWX0hXREVWSUNFX1RZUEVfICMjIGRldmljZV90eXBlXywgXAorICAgICAgICB9LCBcCisgICAgICAgIC5od2FjY2VsICAgICAgICAgPSAmbmFtZSwgXAorICAgIH0KKworI2RlZmluZSBIV19DT05GSUdfSU5URVJOQUwoZm9ybWF0KSBcCisgICAgJihjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCkgeyBcCisgICAgICAgIC5wdWJsaWMgICAgICAgICAgPSB7IFwKKyAgICAgICAgICAgIC5waXhfZm10ICAgICA9IEFWX1BJWF9GTVRfICMjIGZvcm1hdCwgXAorICAgICAgICAgICAgLm1ldGhvZHMgICAgID0gQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9JTlRFUk5BTCwgXAorICAgICAgICAgICAgLmRldmljZV90eXBlID0gQVZfSFdERVZJQ0VfVFlQRV9OT05FLCBcCisgICAgICAgIH0sIFwKKyAgICAgICAgLmh3YWNjZWwgICAgICAgICA9IE5VTEwsIFwKKyAgICB9CisKKyNkZWZpbmUgSFdBQ0NFTF9EWFZBMihjb2RlYykgXAorICAgIEhXX0NPTkZJR19IV0FDQ0VMKDEsIDEsIDEsIERYVkEyX1ZMRCwgICAgRFhWQTIsICAgICAgICBmZl8gIyMgY29kZWMgIyMgX2R4dmEyX2h3YWNjZWwpCisjZGVmaW5lIEhXQUNDRUxfRDNEMTFWQTIoY29kZWMpIFwKKyAgICBIV19DT05GSUdfSFdBQ0NFTCgxLCAxLCAwLCBEM0QxMSwgICAgICAgIEQzRDExVkEsICAgICAgZmZfICMjIGNvZGVjICMjIF9kM2QxMXZhMl9od2FjY2VsKQorI2RlZmluZSBIV0FDQ0VMX05WREVDKGNvZGVjKSBcCisgICAgSFdfQ09ORklHX0hXQUNDRUwoMSwgMSwgMCwgQ1VEQSwgICAgICAgICBDVURBLCAgICAgICAgIGZmXyAjIyBjb2RlYyAjIyBfbnZkZWNfaHdhY2NlbCkKKyNkZWZpbmUgSFdBQ0NFTF9WQUFQSShjb2RlYykgXAorICAgIEhXX0NPTkZJR19IV0FDQ0VMKDEsIDEsIDEsIFZBQVBJLCAgICAgICAgVkFBUEksICAgICAgICBmZl8gIyMgY29kZWMgIyMgX3ZhYXBpX2h3YWNjZWwpCisjZGVmaW5lIEhXQUNDRUxfVkRQQVUoY29kZWMpIFwKKyAgICBIV19DT05GSUdfSFdBQ0NFTCgxLCAxLCAxLCBWRFBBVSwgICAgICAgIFZEUEFVLCAgICAgICAgZmZfICMjIGNvZGVjICMjIF92ZHBhdV9od2FjY2VsKQorI2RlZmluZSBIV0FDQ0VMX1ZJREVPVE9PTEJPWChjb2RlYykgXAorICAgIEhXX0NPTkZJR19IV0FDQ0VMKDEsIDEsIDEsIFZJREVPVE9PTEJPWCwgVklERU9UT09MQk9YLCBmZl8gIyMgY29kZWMgIyMgX3ZpZGVvdG9vbGJveF9od2FjY2VsKQorI2RlZmluZSBIV0FDQ0VMX0QzRDExVkEoY29kZWMpIFwKKyAgICBIV19DT05GSUdfSFdBQ0NFTCgwLCAwLCAxLCBEM0QxMVZBX1ZMRCwgIE5PTkUsICAgICAgICAgZmZfICMjIGNvZGVjICMjIF9kM2QxMXZhX2h3YWNjZWwpCisjZGVmaW5lIEhXQUNDRUxfWFZNQyhjb2RlYykgXAorICAgIEhXX0NPTkZJR19IV0FDQ0VMKDAsIDAsIDEsIFhWTUMsICAgICAgICAgTk9ORSwgICAgICAgICBmZl8gIyMgY29kZWMgIyMgX3h2bWNfaHdhY2NlbCkKKworI2VuZGlmIC8qIEFWQ09ERUNfSFdBQ0NFTF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2h3YWNjZWxzLmggYi9saWJhdmNvZGVjL2h3YWNjZWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q3M2RhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvaHdhY2NlbHMuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19IV0FDQ0VMU19ICisjZGVmaW5lIEFWQ09ERUNfSFdBQ0NFTFNfSAorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX2gyNjNfdmFhcGlfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfaDI2M192aWRlb3Rvb2xib3hfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfaDI2NF9kM2QxMXZhX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX2gyNjRfZDNkMTF2YTJfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfaDI2NF9keHZhMl9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl9oMjY0X252ZGVjX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX2gyNjRfdmFhcGlfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfaDI2NF92ZHBhdV9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl9oMjY0X3ZpZGVvdG9vbGJveF9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl9oZXZjX2QzZDExdmFfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfaGV2Y19kM2QxMXZhMl9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl9oZXZjX2R4dmEyX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX2hldmNfbnZkZWNfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfaGV2Y192YWFwaV9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl9oZXZjX3ZkcGF1X2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX2hldmNfdmlkZW90b29sYm94X2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX21qcGVnX252ZGVjX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX21qcGVnX3ZhYXBpX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX21wZWcxX252ZGVjX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX21wZWcxX3ZkcGF1X2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX21wZWcxX3ZpZGVvdG9vbGJveF9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl9tcGVnMV94dm1jX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX21wZWcyX2QzZDExdmFfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzJfZDNkMTF2YTJfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzJfbnZkZWNfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzJfZHh2YTJfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzJfdmFhcGlfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzJfdmRwYXVfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzJfdmlkZW90b29sYm94X2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX21wZWcyX3h2bWNfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzRfbnZkZWNfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzRfdmFhcGlfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzRfdmRwYXVfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzRfdmlkZW90b29sYm94X2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX3ZjMV9kM2QxMXZhX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX3ZjMV9kM2QxMXZhMl9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl92YzFfZHh2YTJfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfdmMxX252ZGVjX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX3ZjMV92YWFwaV9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl92YzFfdmRwYXVfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfdnA4X252ZGVjX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX3ZwOF92YWFwaV9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl92cDlfZDNkMTF2YV9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl92cDlfZDNkMTF2YTJfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfdnA5X2R4dmEyX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX3ZwOV9udmRlY19od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl92cDlfdmFhcGlfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfd212M19kM2QxMXZhX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX3dtdjNfZDNkMTF2YTJfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfd212M19keHZhMl9od2FjY2VsOworZXh0ZXJuIGNvbnN0IEFWSFdBY2NlbCBmZl93bXYzX252ZGVjX2h3YWNjZWw7CitleHRlcm4gY29uc3QgQVZIV0FjY2VsIGZmX3dtdjNfdmFhcGlfaHdhY2NlbDsKK2V4dGVybiBjb25zdCBBVkhXQWNjZWwgZmZfd212M192ZHBhdV9od2FjY2VsOworCisjZW5kaWYgLyogQVZDT0RFQ19IV0FDQ0VMU19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2lkY2ludmlkZW8uYyBiL2xpYmF2Y29kZWMvaWRjaW52aWRlby5jCmluZGV4IDRhMGE2ZmIuLmNmZjlhZDMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaWRjaW52aWRlby5jCisrKyBiL2xpYmF2Y29kZWMvaWRjaW52aWRlby5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIGlkIFF1YWtlIElJIENJTiBWaWRlbyBEZWNvZGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIxNCw3ICsyMTQsOCBAQAogICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOwogICAgIGludCBidWZfc2l6ZSA9IGF2cGt0LT5zaXplOwogICAgIElkY2luQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOworICAgIGludCBwYWxfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgJnBhbF9zaXplKTsKICAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CiAgICAgaW50IHJldDsKIApAQCAtMjI3LDkgKzIyOCwxMSBAQAogICAgIGlmIChpZGNpbl9kZWNvZGVfdmxjcyhzLCBmcmFtZSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgaWYgKHBhbCkgeworICAgIGlmIChwYWwgJiYgcGFsX3NpemUgPT0gQVZQQUxFVFRFX1NJWkUpIHsKICAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOwogICAgICAgICBtZW1jcHkocy0+cGFsLCBwYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICB9IGVsc2UgaWYgKHBhbCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhbGV0dGUgc2l6ZSAlZCBpcyB3cm9uZ1xuIiwgcGFsX3NpemUpOwogICAgIH0KICAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSBvbiB0aGUgd2F5IG91dCAqLwogICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgcy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2lkY3Rkc3AuYyBiL2xpYmF2Y29kZWMvaWRjdGRzcC5jCmluZGV4IDYzZTliNTIuLjg0NmVkMGIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaWRjdGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvaWRjdGRzcC5jCkBAIC04MCwxMSArODAsOCBAQAogICAgIH0KIH0KIAotdm9pZCAoKmZmX3B1dF9waXhlbHNfY2xhbXBlZCkoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSk7Ci12b2lkICgqZmZfYWRkX3BpeGVsc19jbGFtcGVkKShjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplKTsKLQotc3RhdGljIHZvaWQgcHV0X3BpeGVsc19jbGFtcGVkX2MoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCit2b2lkIGZmX3B1dF9waXhlbHNfY2xhbXBlZF9jKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCiB7CiAgICAgaW50IGk7CiAKQEAgLTE1Nyw4ICsxNTQsOCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYWRkX3BpeGVsc19jbGFtcGVkX2MoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCit2b2lkIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9jKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCiB7CiAgICAgaW50IGk7CiAKQEAgLTIwNywzMyArMjA0LDMzIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBmZl9qcmVmX2lkY3Q0X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3N0YXRpYyB2b2lkIGZmX2pyZWZfaWRjdDRfcHV0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGZmX2pfcmV2X2RjdDQgKGJsb2NrKTsKICAgICBwdXRfcGl4ZWxzX2NsYW1wZWQ0X2MoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7CiB9Ci1zdGF0aWMgdm9pZCBmZl9qcmVmX2lkY3Q0X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3N0YXRpYyB2b2lkIGZmX2pyZWZfaWRjdDRfYWRkKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGZmX2pfcmV2X2RjdDQgKGJsb2NrKTsKICAgICBhZGRfcGl4ZWxzX2NsYW1wZWQ0X2MoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZmX2pyZWZfaWRjdDJfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQorc3RhdGljIHZvaWQgZmZfanJlZl9pZGN0Ml9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgZmZfal9yZXZfZGN0MiAoYmxvY2spOwogICAgIHB1dF9waXhlbHNfY2xhbXBlZDJfYyhibG9jaywgZGVzdCwgbGluZV9zaXplKTsKIH0KLXN0YXRpYyB2b2lkIGZmX2pyZWZfaWRjdDJfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQorc3RhdGljIHZvaWQgZmZfanJlZl9pZGN0Ml9hZGQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgZmZfal9yZXZfZGN0MiAoYmxvY2spOwogICAgIGFkZF9waXhlbHNfY2xhbXBlZDJfYyhibG9jaywgZGVzdCwgbGluZV9zaXplKTsKIH0KIAotc3RhdGljIHZvaWQgZmZfanJlZl9pZGN0MV9wdXQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCBmZl9qcmVmX2lkY3QxX3B1dCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKIHsKICAgICBkZXN0WzBdID0gYXZfY2xpcF91aW50OCgoYmxvY2tbMF0gKyA0KT4+Myk7CiB9Ci1zdGF0aWMgdm9pZCBmZl9qcmVmX2lkY3QxX2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3N0YXRpYyB2b2lkIGZmX2pyZWZfaWRjdDFfYWRkKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGRlc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMF0gKyAoKGJsb2NrWzBdICsgNCk+PjMpKTsKIH0KQEAgLTI1OSwxNCArMjU2LDIyIEBACiAgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9OT05FOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMCB8fCBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSA5KSB7Ci0gICAgICAgICAgICBjLT5pZGN0X3B1dCAgICAgICAgICAgICAgPSBmZl9zaW1wbGVfaWRjdF9wdXRfMTA7Ci0gICAgICAgICAgICBjLT5pZGN0X2FkZCAgICAgICAgICAgICAgPSBmZl9zaW1wbGVfaWRjdF9hZGRfMTA7Ci0gICAgICAgICAgICBjLT5pZGN0ICAgICAgICAgICAgICAgICAgPSBmZl9zaW1wbGVfaWRjdF8xMDsKKyAgICAgICAgICAgIC8qIDEwLWJpdCBNUEVHLTQgU2ltcGxlIFN0dWRpbyBQcm9maWxlIHJlcXVpcmVzIGEgaGlnaGVyIHByZWNpc2lvbiBJRENUCisgICAgICAgICAgICAgICBIb3dldmVyLCBpdCBvbmx5IHVzZXMgaWRjdF9wdXQgKi8KKyAgICAgICAgICAgIGlmIChjLT5tcGVnNF9zdHVkaW9fcHJvZmlsZSkgeworICAgICAgICAgICAgICAgIGMtPmlkY3RfcHV0ICAgICAgICAgICAgICA9IGZmX3NpbXBsZV9pZGN0X3B1dF9pbnQzMl8xMGJpdDsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X2FkZCAgICAgICAgICAgICAgPSBOVUxMOworICAgICAgICAgICAgICAgIGMtPmlkY3QgICAgICAgICAgICAgICAgICA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMtPmlkY3RfcHV0ICAgICAgICAgICAgICA9IGZmX3NpbXBsZV9pZGN0X3B1dF9pbnQxNl8xMGJpdDsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X2FkZCAgICAgICAgICAgICAgPSBmZl9zaW1wbGVfaWRjdF9hZGRfaW50MTZfMTBiaXQ7CisgICAgICAgICAgICAgICAgYy0+aWRjdCAgICAgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfaW50MTZfMTBiaXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjLT5wZXJtX3R5cGUgICAgICAgICAgICAgPSBGRl9JRENUX1BFUk1fTk9ORTsKICAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMikgewotICAgICAgICAgICAgYy0+aWRjdF9wdXQgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfcHV0XzEyOwotICAgICAgICAgICAgYy0+aWRjdF9hZGQgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfYWRkXzEyOwotICAgICAgICAgICAgYy0+aWRjdCAgICAgICAgICAgICAgICAgID0gZmZfc2ltcGxlX2lkY3RfMTI7CisgICAgICAgICAgICBjLT5pZGN0X3B1dCAgICAgICAgICAgICAgPSBmZl9zaW1wbGVfaWRjdF9wdXRfaW50MTZfMTJiaXQ7CisgICAgICAgICAgICBjLT5pZGN0X2FkZCAgICAgICAgICAgICAgPSBmZl9zaW1wbGVfaWRjdF9hZGRfaW50MTZfMTJiaXQ7CisgICAgICAgICAgICBjLT5pZGN0ICAgICAgICAgICAgICAgICAgPSBmZl9zaW1wbGVfaWRjdF9pbnQxNl8xMmJpdDsKICAgICAgICAgICAgIGMtPnBlcm1fdHlwZSAgICAgICAgICAgICA9IEZGX0lEQ1RfUEVSTV9OT05FOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9JTlQpIHsKQEAgLTI4MiwyMSArMjg3LDI0IEBACiAgICAgICAgICAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX05PTkU7CiAjZW5kaWYgLyogQ09ORklHX0ZBQU5JRENUICovCiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhY2N1cmF0ZS9kZWZhdWx0Ci0gICAgICAgICAgICAgICAgYy0+aWRjdF9wdXQgID0gZmZfc2ltcGxlX2lkY3RfcHV0Xzg7Ci0gICAgICAgICAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfc2ltcGxlX2lkY3RfYWRkXzg7Ci0gICAgICAgICAgICAgICAgYy0+aWRjdCAgICAgID0gZmZfc2ltcGxlX2lkY3RfODsKKyAgICAgICAgICAgICAgICAvKiBCZSBzdXJlIEZGX0lEQ1RfTk9ORSB3aWxsIHNlbGVjdCB0aGlzIG9uZSwgc2luY2UgaXQgdXNlcyBGRl9JRENUX1BFUk1fTk9ORSAqLworICAgICAgICAgICAgICAgIGMtPmlkY3RfcHV0ICA9IGZmX3NpbXBsZV9pZGN0X3B1dF9pbnQxNl84Yml0OworICAgICAgICAgICAgICAgIGMtPmlkY3RfYWRkICA9IGZmX3NpbXBsZV9pZGN0X2FkZF9pbnQxNl84Yml0OworICAgICAgICAgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX3NpbXBsZV9pZGN0X2ludDE2XzhiaXQ7CiAgICAgICAgICAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX05PTkU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBjLT5wdXRfcGl4ZWxzX2NsYW1wZWQgICAgICAgID0gcHV0X3BpeGVsc19jbGFtcGVkX2M7CisgICAgYy0+cHV0X3BpeGVsc19jbGFtcGVkICAgICAgICA9IGZmX3B1dF9waXhlbHNfY2xhbXBlZF9jOwogICAgIGMtPnB1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWQgPSBwdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkX2M7Ci0gICAgYy0+YWRkX3BpeGVsc19jbGFtcGVkICAgICAgICA9IGFkZF9waXhlbHNfY2xhbXBlZF9jOworICAgIGMtPmFkZF9waXhlbHNfY2xhbXBlZCAgICAgICAgPSBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfYzsKIAogICAgIGlmIChDT05GSUdfTVBFRzRfREVDT0RFUiAmJiBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfWFZJRCkKICAgICAgICAgZmZfeHZpZF9pZGN0X2luaXQoYywgYXZjdHgpOwogCisgICAgaWYgKEFSQ0hfQUFSQ0g2NCkKKyAgICAgICAgZmZfaWRjdGRzcF9pbml0X2FhcmNoNjQoYywgYXZjdHgsIGhpZ2hfYml0X2RlcHRoKTsKICAgICBpZiAoQVJDSF9BTFBIQSkKICAgICAgICAgZmZfaWRjdGRzcF9pbml0X2FscGhhKGMsIGF2Y3R4LCBoaWdoX2JpdF9kZXB0aCk7CiAgICAgaWYgKEFSQ0hfQVJNKQpAQCAtMzA4LDkgKzMxNiw2IEBACiAgICAgaWYgKEFSQ0hfTUlQUykKICAgICAgICAgZmZfaWRjdGRzcF9pbml0X21pcHMoYywgYXZjdHgsIGhpZ2hfYml0X2RlcHRoKTsKIAotICAgIGZmX3B1dF9waXhlbHNfY2xhbXBlZCA9IGMtPnB1dF9waXhlbHNfY2xhbXBlZDsKLSAgICBmZl9hZGRfcGl4ZWxzX2NsYW1wZWQgPSBjLT5hZGRfcGl4ZWxzX2NsYW1wZWQ7Ci0KICAgICBmZl9pbml0X3NjYW50YWJsZV9wZXJtdXRhdGlvbihjLT5pZGN0X3Blcm11dGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBlcm1fdHlwZSk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2lkY3Rkc3AuaCBiL2xpYmF2Y29kZWMvaWRjdGRzcC5oCmluZGV4IGIxODBhNjcuLmNhMjFhMzEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaWRjdGRzcC5oCisrKyBiL2xpYmF2Y29kZWMvaWRjdGRzcC5oCkBAIC0yMSw2ICsyMSw4IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogCiAvKioKQEAgLTUxLDEzICs1MywxMyBAQAogdHlwZWRlZiBzdHJ1Y3QgSURDVERTUENvbnRleHQgewogICAgIC8qIHBpeGVsIG9wcyA6IGludGVyZmFjZSB3aXRoIERDVCAqLwogICAgIHZvaWQgKCpwdXRfcGl4ZWxzX2NsYW1wZWQpKGNvbnN0IGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBpeGVscyAvKiBhbGlnbiA4ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscyAvKiBhbGlnbiA4ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpOwogICAgIHZvaWQgKCpwdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkKShjb25zdCBpbnQxNl90ICpibG9jayAvKiBhbGlnbiAxNiAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcGl4ZWxzIC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscyAvKiBhbGlnbiA4ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKICAgICB2b2lkICgqYWRkX3BpeGVsc19jbGFtcGVkKShjb25zdCBpbnQxNl90ICpibG9jayAvKiBhbGlnbiAxNiAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwaXhlbHMgLyogYWxpZ24gOCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMgLyogYWxpZ24gOCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKIAogICAgIHZvaWQgKCppZGN0KShpbnQxNl90ICpibG9jayAvKiBhbGlnbiAxNiAqLyk7CkBAIC02OCwxNCArNzAsMTQgQEAKICAgICAgKiBAcGFyYW0gbGluZV9zaXplIHNpemUgaW4gYnl0ZXMgb2YgYSBob3Jpem9udGFsIGxpbmUgb2YgZGVzdAogICAgICAqLwogICAgIHZvaWQgKCppZGN0X3B1dCkodWludDhfdCAqZGVzdCAvKiBhbGlnbiA4ICovLAotICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8pOworICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8pOwogCiAgICAgLyoqCiAgICAgICogYmxvY2sgLT4gaWRjdCAtPiBhZGQgZGVzdCAtPiBjbGlwIHRvIHVuc2lnbmVkIDggYml0IC0+IGRlc3QuCiAgICAgICogQHBhcmFtIGxpbmVfc2l6ZSBzaXplIGluIGJ5dGVzIG9mIGEgaG9yaXpvbnRhbCBsaW5lIG9mIGRlc3QKICAgICAgKi8KICAgICB2b2lkICgqaWRjdF9hZGQpKHVpbnQ4X3QgKmRlc3QgLyogYWxpZ24gOCAqLywKLSAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKTsKKyAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKTsKIAogICAgIC8qKgogICAgICAqIElEQ1QgaW5wdXQgcGVybXV0YXRpb24uCkBAIC05MywxMyArOTUsMTkgQEAKICAgICAgKi8KICAgICB1aW50OF90IGlkY3RfcGVybXV0YXRpb25bNjRdOwogICAgIGVudW0gaWRjdF9wZXJtdXRhdGlvbl90eXBlIHBlcm1fdHlwZTsKKworICAgIGludCBtcGVnNF9zdHVkaW9fcHJvZmlsZTsKIH0gSURDVERTUENvbnRleHQ7CiAKLWV4dGVybiB2b2lkICgqZmZfcHV0X3BpeGVsc19jbGFtcGVkKShjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplKTsKLWV4dGVybiB2b2lkICgqZmZfYWRkX3BpeGVsc19jbGFtcGVkKShjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplKTsKK3ZvaWQgZmZfcHV0X3BpeGVsc19jbGFtcGVkX2MoY29uc3QgaW50MTZfdCAqYmxvY2ssIHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7Cit2b2lkIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9jKGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpOwogCiB2b2lkIGZmX2lkY3Rkc3BfaW5pdChJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKIAordm9pZCBmZl9pZGN0ZHNwX2luaXRfYWFyY2g2NChJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoaWdoX2JpdF9kZXB0aCk7CiB2b2lkIGZmX2lkY3Rkc3BfaW5pdF9hbHBoYShJRENURFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpOwogdm9pZCBmZl9pZGN0ZHNwX2luaXRfYXJtKElEQ1REU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2lmZi5jIGIvbGliYXZjb2RlYy9pZmYuYwppbmRleCA0OWRmMTdjLi4zM2NmMmUzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2lmZi5jCisrKyBiL2xpYmF2Y29kZWMvaWZmLmMKQEAgLTEsNyArMSw4IEBACiAvKgotICogSUZGIEFDQk0vREVFUC9JTEJNL1BCTSBiaXRtYXAgZGVjb2RlcgorICogSUZGIEFDQk0vQU5JTS9ERUVQL0lMQk0vUEJNL1JHQjgvUkdCTiBiaXRtYXAgZGVjb2RlcgogICogQ29weXJpZ2h0IChjKSAyMDEwIFBldGVyIFJvc3MgPHByb3NzQHh2aWQub3JnPgogICogQ29weXJpZ2h0IChjKSAyMDEwIFNlYmFzdGlhbiBWYXRlciA8Y2Rncy5iYXN0eUBnb29nbGVtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMjIsMTYgKzIzLDE3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIElGRiBBQ0JNL0RFRVAvSUxCTS9QQk0gYml0bWFwIGRlY29kZXIKKyAqIElGRiBBQ0JNL0FOSU0vREVFUC9JTEJNL1BCTS9SR0I4L1JHQk4gYml0bWFwIGRlY29kZXIKICAqLwogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKwogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKIAogLy8gVE9ETzogbWFza2luZyBiaXRzCiB0eXBlZGVmIGVudW0gewpAQCAtNTAsNiArNTIsOSBAQAogICAgIHVpbnQzMl90ICptYXNrX2J1ZjsgICAgIC8vLzwgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgcGFsZXR0ZSBpbmRpY2VzCiAgICAgdWludDMyX3QgKm1hc2tfcGFsYnVmOyAgLy8vPCBtYXNraW5nIHBhbGV0dGUgdGFibGUKICAgICB1bnNpZ25lZCAgY29tcHJlc3Npb247ICAvLy88IGRlbHRhIGNvbXByZXNzaW9uIG1ldGhvZCB1c2VkCisgICAgdW5zaWduZWQgIGlzX3Nob3J0OyAgICAgLy8vPCBzaG9ydCBjb21wcmVzc2lvbiBtZXRob2QgdXNlZAorICAgIHVuc2lnbmVkICBpc19pbnRlcmxhY2VkOy8vLzwgdmlkZW8gaXMgaW50ZXJsYWNlZAorICAgIHVuc2lnbmVkICBpc19icnVzaDsgICAgIC8vLzwgdmlkZW8gaXMgaW4gQU5CUiBmb3JtYXQKICAgICB1bnNpZ25lZCAgYnBwOyAgICAgICAgICAvLy88IGJpdHMgcGVyIHBsYW5lIHRvIGRlY29kZSAoZGlmZmVycyBmcm9tIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSBpZiBIQU0pCiAgICAgdW5zaWduZWQgIGhhbTsgICAgICAgICAgLy8vPCAwIGlmIG5vbi1IQU0gb3IgbnVtYmVyIG9mIGhvbGQgYml0cyAoNiBmb3IgYnBwID4gNiwgNCBvdGhlcndpc2UpCiAgICAgdW5zaWduZWQgIGZsYWdzOyAgICAgICAgLy8vPCAxIGZvciBFSEIsIDAgaXMgbm8gZXh0cmEgaGFsZiBkYXJrZW5pbmcKQEAgLTU3LDYgKzYyLDEwIEBACiAgICAgdW5zaWduZWQgIG1hc2tpbmc7ICAgICAgLy8vPCBUT0RPOiBtYXNraW5nIG1ldGhvZCB1c2VkCiAgICAgaW50IGluaXQ7IC8vIDEgaWYgYnVmZmVyIGFuZCBwYWxldHRlIGRhdGEgYWxyZWFkeSBpbml0aWFsaXplZCwgMCBvdGhlcndpc2UKICAgICBpbnQxNl90ICAgdHZkY1sxNl07ICAgICAvLy88IFRWREMgbG9va3VwIHRhYmxlCisgICAgR2V0Qnl0ZUNvbnRleHQgZ2I7CisgICAgdWludDhfdCAqdmlkZW9bMl07CisgICAgdW5zaWduZWQgdmlkZW9fc2l6ZTsKKyAgICB1aW50MzJfdCAqcGFsOwogfSBJZmZDb250ZXh0OwogCiAjZGVmaW5lIExVVDhfUEFSVChwbGFuZSwgdikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE4OSwxMCArMTk4LDExIEBACiAgKiBAcmV0dXJuID49IDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlCiAgKi8KIHN0YXRpYyBpbnQgZXh0cmFjdF9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmNvbnN0IGF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldCAqY29uc3QgYXZwa3QpIHsKLSAgICBjb25zdCB1aW50OF90ICpidWY7Ci0gICAgdW5zaWduZWQgYnVmX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWUGFja2V0ICpjb25zdCBhdnBrdCkKK3sKICAgICBJZmZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWY7CisgICAgdW5zaWduZWQgYnVmX3NpemUgPSAwOwogICAgIGludCBpLCBwYWxldHRlX3NpemU7CiAKICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMikgewpAQCAtMjAxLDIwICsyMTEsNTUgQEAKICAgICB9CiAgICAgcGFsZXR0ZV9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplIC0gQVZfUkIxNihhdmN0eC0+ZXh0cmFkYXRhKTsKIAotICAgIGlmIChhdnBrdCkgewotICAgICAgICBpbnQgaW1hZ2Vfc2l6ZTsKLSAgICAgICAgaWYgKGF2cGt0LT5zaXplIDwgMikKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICBpbWFnZV9zaXplID0gYXZwa3QtPnNpemUgLSBBVl9SQjE2KGF2cGt0LT5kYXRhKTsKLSAgICAgICAgYnVmID0gYXZwa3QtPmRhdGE7Ci0gICAgICAgIGJ1Zl9zaXplID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmYnVmKTsKLSAgICAgICAgaWYgKGJ1Zl9zaXplIDw9IDEgfHwgaW1hZ2Vfc2l6ZSA8PSAxKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbWFnZSBzaXplIHJlY2VpdmVkOiAldSAtPiBpbWFnZSBkYXRhIG9mZnNldDogJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgYnVmX3NpemUsIGltYWdlX3NpemUpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKGF2cGt0ICYmIGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnTicsICdJJywgJ00nKSkgeworICAgICAgICB1aW50MzJfdCBjaHVua19pZDsKKyAgICAgICAgdWludDY0X3QgZGF0YV9zaXplOworICAgICAgICBHZXRCeXRlQ29udGV4dCAqZ2IgPSAmcy0+Z2I7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgNCk7CisgICAgICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPj0gMSkgeworICAgICAgICAgICAgY2h1bmtfaWQgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoZ2IpOworICAgICAgICAgICAgZGF0YV9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoZ2IpOworCisgICAgICAgICAgICBpZiAoY2h1bmtfaWQgPT0gTUtUQUcoJ0InLCAnTScsICdIJywgJ0QnKSkgeworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIGRhdGFfc2l6ZSArIChkYXRhX3NpemUgJiAxKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX2lkID09IE1LVEFHKCdBJywgJ04nLCAnSCcsICdEJykpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBleHRyYTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgNDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgcy0+Y29tcHJlc3Npb24gPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpIDw8IDgpIHwgKHMtPmNvbXByZXNzaW9uICYgMHhGRik7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMTkpOworICAgICAgICAgICAgICAgIGV4dHJhID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoZ2IpOworICAgICAgICAgICAgICAgIHMtPmlzX3Nob3J0ID0gIShleHRyYSAmIDEpOworICAgICAgICAgICAgICAgIHMtPmlzX2JydXNoID0gZXh0cmEgPT0gMjsKKyAgICAgICAgICAgICAgICBzLT5pc19pbnRlcmxhY2VkID0gISEoZXh0cmEgJiAweDQwKTsKKyAgICAgICAgICAgICAgICBkYXRhX3NpemUgLT0gMjQ7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgZGF0YV9zaXplICsgKGRhdGFfc2l6ZSAmIDEpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2h1bmtfaWQgPT0gTUtUQUcoJ0QnLCAnTCcsICdUJywgJ0EnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICBjaHVua19pZCA9PSBNS1RBRygnQicsICdPJywgJ0QnLCAnWScpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rX2lkID09IE1LVEFHKCdCJywnTycsJ0QnLCdZJykpCisgICAgICAgICAgICAgICAgICAgIHMtPmNvbXByZXNzaW9uICY9IDB4RkY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX2lkID09IE1LVEFHKCdDJywgJ00nLCAnQScsICdQJykpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBkYXRhX3NpemUgLyAzOworICAgICAgICAgICAgICAgIHVpbnQzMl90ICpwYWwgPSBzLT5wYWw7CisKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPiAyNTYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGlmIChzLT5oYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBwYWxbaV0gPSAweEZGMDAwMDAwIHwgYnl0ZXN0cmVhbTJfZ2V0X2xlMjQoZ2IpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgcGFsW2ldID0gMHhGRjAwMDAwMCB8IGJ5dGVzdHJlYW0yX2dldF9iZTI0KGdiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgZGF0YV9zaXplICYgMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIGRhdGFfc2l6ZSArIChkYXRhX3NpemUmMSkpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKCFhdnBrdCkgewogICAgICAgICBidWYgPSBhdmN0eC0+ZXh0cmFkYXRhOwogICAgICAgICBidWZfc2l6ZSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmJ1Zik7CiAgICAgICAgIGlmIChidWZfc2l6ZSA8PSAxIHx8IHBhbGV0dGVfc2l6ZSA8IDApIHsKQEAgLTMyMywxMCArMzY4LDEyIEBACiBzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgSWZmQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOwogICAgIGF2X2ZyZWVwKCZzLT5wbGFuZWJ1Zik7CiAgICAgYXZfZnJlZXAoJnMtPmhhbV9idWYpOwogICAgIGF2X2ZyZWVwKCZzLT5oYW1fcGFsYnVmKTsKKyAgICBhdl9mcmVlcCgmcy0+dmlkZW9bMF0pOworICAgIGF2X2ZyZWVwKCZzLT52aWRlb1sxXSk7CisgICAgYXZfZnJlZXAoJnMtPnBhbCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM2NiwxNSArNDEzLDE5IEBACiAgICAgaWYgKChlcnIgPSBhdl9pbWFnZV9jaGVja19zaXplKGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMCwgYXZjdHgpKSkKICAgICAgICAgcmV0dXJuIGVycjsKICAgICBzLT5wbGFuZXNpemUgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMTYpID4+IDM7IC8vIEFsaWduIHBsYW5lIHNpemUgaW4gYml0cyB0byB3b3JkLWJvdW5kYXJ5Ci0gICAgcy0+cGxhbmVidWYgID0gYXZfbWFsbG9jKHMtPnBsYW5lc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIHMtPnBsYW5lYnVmICA9IGF2X21hbGxvYyhzLT5wbGFuZXNpemUgKiBhdmN0eC0+aGVpZ2h0ICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CiAgICAgaWYgKCFzLT5wbGFuZWJ1ZikKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIHMtPmJwcCA9IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7Ci0gICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGlmICghcy0+ZnJhbWUpIHsKLSAgICAgICAgZGVjb2RlX2VuZChhdmN0eCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnQScsICdOJywgJ0knLCAnTScpKSB7CisgICAgICAgIHMtPnZpZGVvX3NpemUgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMikgKiBhdmN0eC0+aGVpZ2h0ICogcy0+YnBwOworICAgICAgICBzLT52aWRlb1swXSA9IGF2X2NhbGxvYyhGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMikgKiBhdmN0eC0+aGVpZ2h0LCBzLT5icHApOworICAgICAgICBzLT52aWRlb1sxXSA9IGF2X2NhbGxvYyhGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMikgKiBhdmN0eC0+aGVpZ2h0LCBzLT5icHApOworICAgICAgICBzLT5wYWwgPSBhdl9jYWxsb2MoMjU2LCBzaXplb2YoKnMtPnBhbCkpOworICAgICAgICBpZiAoIXMtPnZpZGVvWzBdIHx8ICFzLT52aWRlb1sxXSB8fCAhcy0+cGFsKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAKICAgICBpZiAoKGVyciA9IGV4dHJhY3RfaGVhZGVyKGF2Y3R4LCBOVUxMKSkgPCAwKQpAQCAtNDgwLDIwICs1MzEsMjAgQEAKICAqIEByZXR1cm4gbnVtYmVyIG9mIGNvbnN1bWVkIGJ5dGVzIGluIGJ5dGVydW4xIGNvbXByZXNzZWQgYml0c3RyZWFtCiAgKi8KIHN0YXRpYyBpbnQgZGVjb2RlX2J5dGVydW4odWludDhfdCAqZHN0LCBpbnQgZHN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgY29uc3QgdWludDhfdCAqY29uc3QgYnVmX2VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qnl0ZUNvbnRleHQgKmdiKQogewotICAgIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJ1Zl9zdGFydCA9IGJ1ZjsKICAgICB1bnNpZ25lZCB4OwotICAgIGZvciAoeCA9IDA7IHggPCBkc3Rfc2l6ZSAmJiBidWYgPCBidWZfZW5kOykgeworICAgIGZvciAoeCA9IDA7IHggPCBkc3Rfc2l6ZSAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPiAwOykgewogICAgICAgICB1bnNpZ25lZCBsZW5ndGg7Ci0gICAgICAgIGNvbnN0IGludDhfdCB2YWx1ZSA9ICpidWYrKzsKKyAgICAgICAgY29uc3QgaW50OF90IHZhbHVlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOwogICAgICAgICBpZiAodmFsdWUgPj0gMCkgewotICAgICAgICAgICAgbGVuZ3RoID0gRkZNSU4zKHZhbHVlICsgMSwgZHN0X3NpemUgLSB4LCBidWZfZW5kIC0gYnVmKTsKLSAgICAgICAgICAgIG1lbWNweShkc3QgKyB4LCBidWYsIGxlbmd0aCk7Ci0gICAgICAgICAgICBidWYgKz0gbGVuZ3RoOworICAgICAgICAgICAgbGVuZ3RoID0gRkZNSU4zKHZhbHVlICsgMSwgZHN0X3NpemUgLSB4LCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikpOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcihnYiwgZHN0ICsgeCwgbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChsZW5ndGggPCB2YWx1ZSArIDEpCisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgdmFsdWUgKyAxIC0gbGVuZ3RoKTsKICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IC0xMjgpIHsKICAgICAgICAgICAgIGxlbmd0aCA9IEZGTUlOKC12YWx1ZSArIDEsIGRzdF9zaXplIC0geCk7Ci0gICAgICAgICAgICBtZW1zZXQoZHN0ICsgeCwgKmJ1ZisrLCBsZW5ndGgpOworICAgICAgICAgICAgbWVtc2V0KGRzdCArIHgsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSwgbGVuZ3RoKTsKICAgICAgICAgfSBlbHNlIHsgLy8gbm9vcAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTUwMyw3ICs1NTQsNzcgQEAKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiZGVjb2RlX2J5dGVydW4gZW5kZWQgYmVmb3JlIHBsYW5lIHNpemVcbiIpOwogICAgICAgICBtZW1zZXQoZHN0K3gsIDAsIGRzdF9zaXplIC0geCk7CiAgICAgfQotICAgIHJldHVybiBidWYgLSBidWZfc3RhcnQ7CisgICAgcmV0dXJuIGJ5dGVzdHJlYW0yX3RlbGwoZ2IpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9ieXRlcnVuMih1aW50OF90ICpkc3QsIGludCBoZWlnaHQsIGludCBsaW5lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCeXRlQ29udGV4dCAqZ2IpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgY21kczsKKyAgICB1bnNpZ25lZCBjb3VudDsKKyAgICBpbnQgaSwgeV9wb3MgPSAwLCB4X3BvcyA9IDA7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoZ2IpICE9IE1LQkVUQUcoJ1YnLCAnRCcsICdBJywgJ1QnKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBieXRlc3RyZWFtMl9za2lwKGdiLCA0KTsKKyAgICBjb3VudCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiKSAtIDI7CisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8IGNvdW50KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmNtZHMsIGdiLT5idWZmZXIsIGNvdW50KTsKKyAgICBieXRlc3RyZWFtMl9za2lwKGdiLCBjb3VudCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgJiYgeF9wb3MgPCBsaW5lX3NpemU7IGkrKykgeworICAgICAgICBpbnQ4X3QgY21kID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmNtZHMpOworICAgICAgICBpbnQgbCwgcjsKKworICAgICAgICBpZiAoY21kID09IDApIHsKKyAgICAgICAgICAgIGwgPSBieXRlc3RyZWFtMl9nZXRfYmUxNihnYik7CisgICAgICAgICAgICB3aGlsZSAobC0tID4gMCAmJiB4X3BvcyA8IGxpbmVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGRzdFt4X3BvcyArIHlfcG9zICAgKiBsaW5lX3NpemUgICAgXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICBkc3RbeF9wb3MgKyB5X3BvcysrICogbGluZV9zaXplICsgMV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgaWYgKHlfcG9zID49IGhlaWdodCkgeworICAgICAgICAgICAgICAgICAgICB5X3BvcyAgPSAwOworICAgICAgICAgICAgICAgICAgICB4X3BvcyArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjbWQgPCAwKSB7CisgICAgICAgICAgICBsID0gLWNtZDsKKyAgICAgICAgICAgIHdoaWxlIChsLS0gPiAwICYmIHhfcG9zIDwgbGluZV9zaXplKSB7CisgICAgICAgICAgICAgICAgZHN0W3hfcG9zICsgeV9wb3MgICAqIGxpbmVfc2l6ZSAgICBdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgIGRzdFt4X3BvcyArIHlfcG9zKysgKiBsaW5lX3NpemUgKyAxXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgICAgICAgICBpZiAoeV9wb3MgPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIHlfcG9zICA9IDA7CisgICAgICAgICAgICAgICAgICAgIHhfcG9zICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PSAxKSB7CisgICAgICAgICAgICBsID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpOworICAgICAgICAgICAgciA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiKTsKKyAgICAgICAgICAgIHdoaWxlIChsLS0gPiAwICYmIHhfcG9zIDwgbGluZV9zaXplKSB7CisgICAgICAgICAgICAgICAgZHN0W3hfcG9zICsgeV9wb3MgICAqIGxpbmVfc2l6ZSAgICBdID0gciA+PiA4OworICAgICAgICAgICAgICAgIGRzdFt4X3BvcyArIHlfcG9zKysgKiBsaW5lX3NpemUgKyAxXSA9IHIgJiAweEZGOworICAgICAgICAgICAgICAgIGlmICh5X3BvcyA+PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgeV9wb3MgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeF9wb3MgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsID0gY21kOworICAgICAgICAgICAgciA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiKTsKKyAgICAgICAgICAgIHdoaWxlIChsLS0gPiAwICYmIHhfcG9zIDwgbGluZV9zaXplKSB7CisgICAgICAgICAgICAgICAgZHN0W3hfcG9zICsgeV9wb3MgICAqIGxpbmVfc2l6ZSAgICBdID0gciA+PiA4OworICAgICAgICAgICAgICAgIGRzdFt4X3BvcyArIHlfcG9zKysgKiBsaW5lX3NpemUgKyAxXSA9IHIgJiAweEZGOworICAgICAgICAgICAgICAgIGlmICh5X3BvcyA+PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgeV9wb3MgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeF9wb3MgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYnl0ZXN0cmVhbTJfdGVsbChnYik7CiB9CiAKICNkZWZpbmUgREVDT0RFX1JHQlhfQ09NTU9OKHR5cGUpIFwKQEAgLTY2MCwxMCArNzgxLDcwOCBAQAogICAgIH0KIH0KIAorc3RhdGljIHZvaWQgZGVjb2RlX3Nob3J0X2hvcml6b250YWxfZGVsdGEodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpidWZfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBicHAsIGludCBkc3Rfc2l6ZSkKK3sKKyAgICBpbnQgcGxhbmVwaXRjaCA9IEZGQUxJR04odywgMTYpID4+IDM7CisgICAgaW50IHBpdGNoID0gcGxhbmVwaXRjaCAqIGJwcDsKKyAgICBHZXRCeXRlQ29udGV4dCBwdHJzLCBnYjsKKyAgICBQdXRCeXRlQ29udGV4dCBwYjsKKyAgICB1bnNpZ25lZCBvZnNzcmMsIHBvczsKKyAgICBpbnQgaSwgazsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnB0cnMsIGJ1ZiwgYnVmX2VuZCAtIGJ1Zik7CisgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiLCBkc3QsIGRzdF9zaXplKTsKKworICAgIGZvciAoayA9IDA7IGsgPCBicHA7IGsrKykgeworICAgICAgICBvZnNzcmMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcHRycyk7CisgICAgICAgIHBvcyA9IDA7CisKKyAgICAgICAgaWYgKCFvZnNzcmMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAob2Zzc3JjID49IGJ1Zl9lbmQgLSBidWYpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmICsgb2Zzc3JjLCBidWZfZW5kIC0gKGJ1ZiArIG9mc3NyYykpOworICAgICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfcGVla19iZTE2KCZnYikgIT0gMHhGRkZGICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPiAzKSB7CisgICAgICAgICAgICBpbnQxNl90IG9mZnNldCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisgICAgICAgICAgICB1bnNpZ25lZCBub2Zmc2V0OworCisgICAgICAgICAgICBpZiAob2Zmc2V0ID49IDApIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBkYXRhID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKworICAgICAgICAgICAgICAgIHBvcyArPSBvZmZzZXQgKiAyOworICAgICAgICAgICAgICAgIG5vZmZzZXQgPSAocG9zIC8gcGxhbmVwaXRjaCkgKiBwaXRjaCArIChwb3MgJSBwbGFuZXBpdGNoKSArIGsgKiBwbGFuZXBpdGNoOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWtfcCgmcGIsIG5vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYmUxNigmcGIsIGRhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisKKyAgICAgICAgICAgICAgICBwb3MgKz0gMiAqIC0ob2Zmc2V0ICsgMik7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgZGF0YSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisKKyAgICAgICAgICAgICAgICAgICAgcG9zICs9IDI7CisgICAgICAgICAgICAgICAgICAgIG5vZmZzZXQgPSAocG9zIC8gcGxhbmVwaXRjaCkgKiBwaXRjaCArIChwb3MgJSBwbGFuZXBpdGNoKSArIGsgKiBwbGFuZXBpdGNoOworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrX3AoJnBiLCBub2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYiwgZGF0YSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfYnl0ZV92ZXJ0aWNhbF9kZWx0YSh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHhvciwgaW50IGJwcCwgaW50IGRzdF9zaXplKQoreworICAgIGludCBuY29sdW1ucyA9ICgodyArIDE1KSAvIDE2KSAqIDI7CisgICAgaW50IGRzdHBpdGNoID0gbmNvbHVtbnMgKiBicHA7CisgICAgdW5zaWduZWQgb2ZzZHN0LCBvZnNzcmMsIG9wY29kZSwgeDsKKyAgICBHZXRCeXRlQ29udGV4dCBwdHJzLCBnYjsKKyAgICBQdXRCeXRlQ29udGV4dCBwYjsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnB0cnMsIGJ1ZiwgYnVmX2VuZCAtIGJ1Zik7CisgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiLCBkc3QsIGRzdF9zaXplKTsKKworICAgIGZvciAoayA9IDA7IGsgPCBicHA7IGsrKykgeworICAgICAgICBvZnNzcmMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcHRycyk7CisKKyAgICAgICAgaWYgKCFvZnNzcmMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAob2Zzc3JjID49IGJ1Zl9lbmQgLSBidWYpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmICsgb2Zzc3JjLCBidWZfZW5kIC0gKGJ1ZiArIG9mc3NyYykpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmNvbHVtbnM7IGorKykgeworICAgICAgICAgICAgb2ZzZHN0ID0gaiArIGsgKiBuY29sdW1uczsKKworICAgICAgICAgICAgaSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgICAgICB3aGlsZSAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworCisgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICAgICAgICAgICAgICB4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3Bjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrX3AoJnBiLCBvZnNkc3QsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4b3IgJiYgb2ZzZHN0IDwgZHN0X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIGRzdFtvZnNkc3RdIF4geCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgeCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvZnNkc3QgKz0gZHN0cGl0Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlIDwgMHg4MCkgeworICAgICAgICAgICAgICAgICAgICBvZnNkc3QgKz0gb3Bjb2RlICogZHN0cGl0Y2g7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlICY9IDB4N2Y7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9wY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2Vla19wKCZwYiwgb2ZzZHN0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeG9yICYmIG9mc2RzdCA8IGRzdF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBkc3Rbb2ZzZHN0XSBeIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb2ZzZHN0ICs9IGRzdHBpdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfZGVsdGFfaih1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBicHAsIGludCBkc3Rfc2l6ZSkKK3sKKyAgICBpbnQzMl90IHBpdGNoOworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICB1aW50MzJfdCB0eXBlLCBmbGFnLCBjb2xzLCBncm91cHMsIHJvd3MsIGJ5dGVzOworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICBpbnQgcGxhbmVwaXRjaF9ieXRlID0gKHcgKyA3KSAvIDg7CisgICAgaW50IHBsYW5lcGl0Y2ggPSAoKHcgKyAxNSkgLyAxNikgKiAyOworICAgIGludCBrbHVkZ2VfaiwgYiwgZywgciwgZDsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgIHBpdGNoID0gcGxhbmVwaXRjaCAqIGJwcDsKKyAgICBrbHVkZ2VfaiA9IHcgPCAzMjAgPyAoMzIwIC0gdykgLyA4IC8gMiA6IDA7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfZW5kIC0gYnVmKTsKKworICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpID49IDIpIHsKKyAgICAgICAgdHlwZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZmxhZyAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKyAgICAgICAgICAgIGNvbHMgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisgICAgICAgICAgICBncm91cHMgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworCisgICAgICAgICAgICBmb3IgKGcgPSAwOyBnIDwgZ3JvdXBzOyBnKyspIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworCisgICAgICAgICAgICAgICAgaWYgKGNvbHMgKiBicHAgPT0gMCB8fCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgY29scyAqIGJwcCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiY29scypicHAgaXMgaW52YWxpZCAoJSJQUklkMzIiKiVkKSIsIGNvbHMsIGJwcCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoa2x1ZGdlX2opCisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9ICgob2Zmc2V0IC8gKDMyMCAvIDgpKSAqIHBpdGNoKSArIChvZmZzZXQgJSAoMzIwIC8gOCkpIC0ga2x1ZGdlX2o7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoKG9mZnNldCAvIHBsYW5lcGl0Y2hfYnl0ZSkgKiBwaXRjaCkgKyAob2Zmc2V0ICUgcGxhbmVwaXRjaF9ieXRlKTsKKworICAgICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCBjb2xzOyBiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChkID0gMDsgZCA8IGJwcDsgZCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZhbHVlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBkc3Rfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBkc3QgKyBvZmZzZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0clswXSBePSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJbMF0gID0gdmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBwbGFuZXBpdGNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoY29scyAqIGJwcCkgJiAxKQorICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgZmxhZyAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKyAgICAgICAgICAgIHJvd3MgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisgICAgICAgICAgICBieXRlcyAgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworICAgICAgICAgICAgZ3JvdXBzID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKworICAgICAgICAgICAgZm9yIChnID0gMDsgZyA8IGdyb3VwczsgZysrKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKworICAgICAgICAgICAgICAgIGlmIChrbHVkZ2VfaikKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKChvZmZzZXQgLyAoMzIwIC8gOCkpICogcGl0Y2gpICsgKG9mZnNldCAlICgzMjAvIDgpKSAtIGtsdWRnZV9qOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKChvZmZzZXQgLyBwbGFuZXBpdGNoX2J5dGUpICogcGl0Y2gpICsgKG9mZnNldCAlIHBsYW5lcGl0Y2hfYnl0ZSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHIgPSAwOyByIDwgcm93czsgcisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZCA9IDA7IGQgPCBicHA7IGQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbm9mZnNldCA9IG9mZnNldCArIChyICogcGl0Y2gpICsgZCAqIHBsYW5lcGl0Y2g7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYnl0ZXMgfHwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IGJ5dGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImJ5dGVzICUiUFJJZDMyIiBpcyBpbnZhbGlkIiwgYnl0ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChiID0gMDsgYiA8IGJ5dGVzOyBiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZhbHVlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2Zmc2V0ID49IGRzdF9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gZHN0ICsgbm9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbGFnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJbMF0gXj0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJbMF0gID0gdmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Zmc2V0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChyb3dzICogYnl0ZXMgKiBicHApICYgMSkKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9zaG9ydF92ZXJ0aWNhbF9kZWx0YSh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpidWZfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgYnBwLCBpbnQgZHN0X3NpemUpCit7CisgICAgaW50IG5jb2x1bW5zID0gKHcgKyAxNSkgPj4gNDsKKyAgICBpbnQgZHN0cGl0Y2ggPSBuY29sdW1ucyAqIGJwcCAqIDI7CisgICAgdW5zaWduZWQgb2ZzZHN0LCBvZnNzcmMsIG9mc2RhdGEsIG9wY29kZSwgeDsKKyAgICBHZXRCeXRlQ29udGV4dCBwdHJzLCBnYiwgZHB0cnMsIGRnYjsKKyAgICBQdXRCeXRlQ29udGV4dCBwYjsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGlmIChidWZfZW5kIC0gYnVmIDw9IDY0KQorICAgICAgICByZXR1cm47CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZwdHJzLCBidWYsIGJ1Zl9lbmQgLSBidWYpOworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmRwdHJzLCBidWYgKyAzMiwgKGJ1Zl9lbmQgLSBidWYpIC0gMzIpOworICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZwYiwgZHN0LCBkc3Rfc2l6ZSk7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgYnBwOyBrKyspIHsKKyAgICAgICAgb2Zzc3JjID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnB0cnMpOworICAgICAgICBvZnNkYXRhID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmRwdHJzKTsKKworICAgICAgICBpZiAoIW9mc3NyYykKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChvZnNzcmMgPj0gYnVmX2VuZCAtIGJ1ZikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAob2ZzZGF0YSA+PSBidWZfZW5kIC0gYnVmKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYgKyBvZnNzcmMsIGJ1Zl9lbmQgLSAoYnVmICsgb2Zzc3JjKSk7CisgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJmRnYiwgYnVmICsgb2ZzZGF0YSwgYnVmX2VuZCAtIChidWYgKyBvZnNkYXRhKSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBuY29sdW1uczsgaisrKSB7CisgICAgICAgICAgICBvZnNkc3QgPSAoaiArIGsgKiBuY29sdW1ucykgKiAyOworCisgICAgICAgICAgICBpID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgIHdoaWxlIChpID4gMCkgeworICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZkZ2IpOworCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvcGNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWtfcCgmcGIsIG9mc2RzdCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mc2RzdCArPSBkc3RwaXRjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPCAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIG9mc2RzdCArPSBvcGNvZGUgKiBkc3RwaXRjaDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcGNvZGUgJj0gMHg3ZjsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3Bjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrX3AoJnBiLCBvZnNkc3QsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYiwgYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmRnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgb2ZzZHN0ICs9IGRzdHBpdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfbG9uZ192ZXJ0aWNhbF9kZWx0YSh1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGJwcCwgaW50IGRzdF9zaXplKQoreworICAgIGludCBuY29sdW1ucyA9ICh3ICsgMzEpID4+IDU7CisgICAgaW50IGRzdHBpdGNoID0gKCh3ICsgMTUpIC8gMTYgKiAyKSAqIGJwcDsKKyAgICB1bnNpZ25lZCBvZnNkc3QsIG9mc3NyYywgb2ZzZGF0YSwgb3Bjb2RlLCB4OworICAgIEdldEJ5dGVDb250ZXh0IHB0cnMsIGdiLCBkcHRycywgZGdiOworICAgIFB1dEJ5dGVDb250ZXh0IHBiOworICAgIGludCBpLCBqLCBrLCBoOworCisgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPD0gNjQpCisgICAgICAgIHJldHVybjsKKworICAgIGggPSAoKCh3ICsgMTUpIC8gMTYgKiAyKSAhPSAoKHcgKyAzMSkgLyAzMiAqIDQpKSA/IDEgOiAwOworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnB0cnMsIGJ1ZiwgYnVmX2VuZCAtIGJ1Zik7CisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZHB0cnMsIGJ1ZiArIDMyLCAoYnVmX2VuZCAtIGJ1ZikgLSAzMik7CisgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiLCBkc3QsIGRzdF9zaXplKTsKKworICAgIGZvciAoayA9IDA7IGsgPCBicHA7IGsrKykgeworICAgICAgICBvZnNzcmMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcHRycyk7CisgICAgICAgIG9mc2RhdGEgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZHB0cnMpOworCisgICAgICAgIGlmICghb2Zzc3JjKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG9mc3NyYyA+PSBidWZfZW5kIC0gYnVmKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmIChvZnNkYXRhID49IGJ1Zl9lbmQgLSBidWYpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiArIG9mc3NyYywgYnVmX2VuZCAtIChidWYgKyBvZnNzcmMpKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZGdiLCBidWYgKyBvZnNkYXRhLCBidWZfZW5kIC0gKGJ1ZiArIG9mc2RhdGEpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5jb2x1bW5zOyBqKyspIHsKKyAgICAgICAgICAgIG9mc2RzdCA9IChqICsgayAqIG5jb2x1bW5zKSAqIDQgLSBoICogKDIgKiBrKTsKKworICAgICAgICAgICAgaSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgICAgICB3aGlsZSAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworCisgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChoICYmIChqID09IChuY29sdW1ucyAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZkZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZGdiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZGdiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvcGNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWtfcCgmcGIsIG9mc2RzdCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggJiYgKGogPT0gKG5jb2x1bW5zIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMzIoJnBiLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9mc2RzdCArPSBkc3RwaXRjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPCAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIG9mc2RzdCArPSBvcGNvZGUgKiBkc3RwaXRjaDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcGNvZGUgJj0gMHg3ZjsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3Bjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrX3AoJnBiLCBvZnNkc3QsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoICYmIChqID09IChuY29sdW1ucyAtIDEpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYiwgYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmRnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmRnYiwgMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTMyKCZwYiwgYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmRnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb2ZzZHN0ICs9IGRzdHBpdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfc2hvcnRfdmVydGljYWxfZGVsdGEyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpidWZfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGJwcCwgaW50IGRzdF9zaXplKQoreworICAgIGludCBuY29sdW1ucyA9ICh3ICsgMTUpID4+IDQ7CisgICAgaW50IGRzdHBpdGNoID0gbmNvbHVtbnMgKiBicHAgKiAyOworICAgIHVuc2lnbmVkIG9mc2RzdCwgb2Zzc3JjLCBvcGNvZGUsIHg7CisgICAgR2V0Qnl0ZUNvbnRleHQgcHRycywgZ2I7CisgICAgUHV0Qnl0ZUNvbnRleHQgcGI7CisgICAgaW50IGksIGosIGs7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZwdHJzLCBidWYsIGJ1Zl9lbmQgLSBidWYpOworICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZwYiwgZHN0LCBkc3Rfc2l6ZSk7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgYnBwOyBrKyspIHsKKyAgICAgICAgb2Zzc3JjID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnB0cnMpOworCisgICAgICAgIGlmICghb2Zzc3JjKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG9mc3NyYyA+PSBidWZfZW5kIC0gYnVmKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiArIG9mc3NyYywgYnVmX2VuZCAtIChidWYgKyBvZnNzcmMpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5jb2x1bW5zOyBqKyspIHsKKyAgICAgICAgICAgIG9mc2RzdCA9IChqICsgayAqIG5jb2x1bW5zKSAqIDI7CisKKyAgICAgICAgICAgIGkgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworICAgICAgICAgICAgd2hpbGUgKGkgPiAwICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPiA0KSB7CisgICAgICAgICAgICAgICAgb3Bjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKworICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworICAgICAgICAgICAgICAgICAgICB4ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKTsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3Bjb2RlICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0X3AoJnBiKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWtfcCgmcGIsIG9mc2RzdCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiLCB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mc2RzdCArPSBkc3RwaXRjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcGNvZGUgPCAweDgwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgb2ZzZHN0ICs9IG9wY29kZSAqIGRzdHBpdGNoOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSAmPSAweDdmZmY7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9wY29kZSAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpID4gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnRfcCgmcGIpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2Vla19wKCZwYiwgb2ZzZHN0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYmUxNigmcGIsIGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgb2ZzZHN0ICs9IGRzdHBpdGNoOworICAgICAgICAgICAgICAgICAgICAgICAgb3Bjb2RlLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfbG9uZ192ZXJ0aWNhbF9kZWx0YTIodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgY29uc3QgdWludDhfdCAqYnVmX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGJwcCwgaW50IGRzdF9zaXplKQoreworICAgIGludCBuY29sdW1ucyA9ICh3ICsgMzEpID4+IDU7CisgICAgaW50IGRzdHBpdGNoID0gKCh3ICsgMTUpIC8gMTYgKiAyKSAqIGJwcDsKKyAgICB1bnNpZ25lZCBvZnNkc3QsIG9mc3NyYywgb3Bjb2RlLCB4OworICAgIHVuc2lnbmVkIHNraXAgPSAweDgwMDAwMDAwLCBtYXNrID0gc2tpcCAtIDE7CisgICAgR2V0Qnl0ZUNvbnRleHQgcHRycywgZ2I7CisgICAgUHV0Qnl0ZUNvbnRleHQgcGI7CisgICAgaW50IGksIGosIGssIGg7CisKKyAgICBoID0gKCgodyArIDE1KSAvIDE2ICogMikgIT0gKCh3ICsgMzEpIC8gMzIgKiA0KSkgPyAxIDogMDsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZwdHJzLCBidWYsIGJ1Zl9lbmQgLSBidWYpOworICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZwYiwgZHN0LCBkc3Rfc2l6ZSk7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgYnBwOyBrKyspIHsKKyAgICAgICAgb2Zzc3JjID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnB0cnMpOworCisgICAgICAgIGlmICghb2Zzc3JjKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKG9mc3NyYyA+PSBidWZfZW5kIC0gYnVmKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiArIG9mc3NyYywgYnVmX2VuZCAtIChidWYgKyBvZnNzcmMpKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG5jb2x1bW5zOyBqKyspIHsKKyAgICAgICAgICAgIG9mc2RzdCA9IChqICsgayAqIG5jb2x1bW5zKSAqIDQgLSBoICogKDIgKiBrKTsKKworICAgICAgICAgICAgaWYgKGggJiYgKGogPT0gKG5jb2x1bW5zIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgc2tpcCA9IDB4ODAwMDsKKyAgICAgICAgICAgICAgICBtYXNrID0gc2tpcCAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGkgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICAgICAgd2hpbGUgKGkgPiAwICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPiA0KSB7CisgICAgICAgICAgICAgICAgb3Bjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKworICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaCAmJiAoaiA9PSBuY29sdW1ucyAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3Bjb2RlICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0X3AoJnBiKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWtfcCgmcGIsIG9mc2RzdCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggJiYgKGogPT0gbmNvbHVtbnMgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYmUxNigmcGIsIHgpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTMyKCZwYiwgeCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvZnNkc3QgKz0gZHN0cGl0Y2g7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUtLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlIDwgc2tpcCkgeworICAgICAgICAgICAgICAgICAgICBvZnNkc3QgKz0gb3Bjb2RlICogZHN0cGl0Y2g7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3Bjb2RlICY9IG1hc2s7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9wY29kZSAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpID4gMSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnRfcCgmcGIpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2Vla19wKCZwYiwgb2ZzZHN0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaCAmJiAoaiA9PSBuY29sdW1ucyAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMTYoJnBiLCBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2JlMzIoJnBiLCBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG9mc2RzdCArPSBkc3RwaXRjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZS0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2RlbHRhX2QodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpidWZfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBmbGFnLCBpbnQgYnBwLCBpbnQgZHN0X3NpemUpCit7CisgICAgaW50IHBsYW5lcGl0Y2ggPSBGRkFMSUdOKHcsIDE2KSA+PiAzOworICAgIGludCBwaXRjaCA9IHBsYW5lcGl0Y2ggKiBicHA7CisgICAgaW50IHBsYW5lcGl0Y2hfYnl0ZSA9ICh3ICsgNykgLyA4OworICAgIHVuc2lnbmVkIGVudHJpZXMsIG9mc3NyYzsKKyAgICBHZXRCeXRlQ29udGV4dCBnYiwgcHRyczsKKyAgICBQdXRCeXRlQ29udGV4dCBwYjsKKyAgICBpbnQgazsKKworICAgIGlmIChidWZfZW5kIC0gYnVmIDw9IDQgKiBicHApCisgICAgICAgIHJldHVybjsKKworICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZwYiwgZHN0LCBkc3Rfc2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcHRycywgYnVmLCBicHAgKiA0KTsKKworICAgIGZvciAoayA9IDA7IGsgPCBicHA7IGsrKykgeworICAgICAgICBvZnNzcmMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcHRycyk7CisKKyAgICAgICAgaWYgKCFvZnNzcmMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAob2Zzc3JjID49IGJ1Zl9lbmQgLSBidWYpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmICsgb2Zzc3JjLCBidWZfZW5kIC0gKGJ1ZiArIG9mc3NyYykpOworCisgICAgICAgIGVudHJpZXMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICB3aGlsZSAoZW50cmllcyAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpID49IDgpIHsKKyAgICAgICAgICAgIGludDMyX3Qgb3Bjb2RlICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworCisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrX3AoJnBiLCAob2Zmc2V0IC8gcGxhbmVwaXRjaF9ieXRlKSAqIHBpdGNoICsgKG9mZnNldCAlIHBsYW5lcGl0Y2hfYnl0ZSkgKyBrICogcGxhbmVwaXRjaCwgU0VFS19TRVQpOworICAgICAgICAgICAgaWYgKG9wY29kZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wY29kZSAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdF9wKCZwYikgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTMyKCZwYiwgeCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXBfcCgmcGIsIHBpdGNoIC0gNCk7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3Bjb2RlID0gLW9wY29kZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAob3Bjb2RlICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTMyKCZwYiwgYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXBfcCgmcGIsIHBpdGNoIC0gNCk7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudHJpZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2RlbHRhX2UodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpidWZfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBmbGFnLCBpbnQgYnBwLCBpbnQgZHN0X3NpemUpCit7CisgICAgaW50IHBsYW5lcGl0Y2ggPSBGRkFMSUdOKHcsIDE2KSA+PiAzOworICAgIGludCBwaXRjaCA9IHBsYW5lcGl0Y2ggKiBicHA7CisgICAgaW50IHBsYW5lcGl0Y2hfYnl0ZSA9ICh3ICsgNykgLyA4OworICAgIHVuc2lnbmVkIGVudHJpZXMsIG9mc3NyYzsKKyAgICBHZXRCeXRlQ29udGV4dCBnYiwgcHRyczsKKyAgICBQdXRCeXRlQ29udGV4dCBwYjsKKyAgICBpbnQgazsKKworICAgIGlmIChidWZfZW5kIC0gYnVmIDw9IDQgKiBicHApCisgICAgICAgIHJldHVybjsKKworICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZwYiwgZHN0LCBkc3Rfc2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcHRycywgYnVmLCBicHAgKiA0KTsKKworICAgIGZvciAoayA9IDA7IGsgPCBicHA7IGsrKykgeworICAgICAgICBvZnNzcmMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcHRycyk7CisKKyAgICAgICAgaWYgKCFvZnNzcmMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAob2Zzc3JjID49IGJ1Zl9lbmQgLSBidWYpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmICsgb2Zzc3JjLCBidWZfZW5kIC0gKGJ1ZiArIG9mc3NyYykpOworCisgICAgICAgIGVudHJpZXMgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworICAgICAgICB3aGlsZSAoZW50cmllcyAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpID49IDYpIHsKKyAgICAgICAgICAgIGludDE2X3Qgb3Bjb2RlICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisgICAgICAgICAgICB1bnNpZ25lZCBvZmZzZXQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworCisgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrX3AoJnBiLCAob2Zmc2V0IC8gcGxhbmVwaXRjaF9ieXRlKSAqIHBpdGNoICsgKG9mZnNldCAlIHBsYW5lcGl0Y2hfYnl0ZSkgKyBrICogcGxhbmVwaXRjaCwgU0VFS19TRVQpOworICAgICAgICAgICAgaWYgKG9wY29kZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgdWludDE2X3QgeCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZnYik7CisgICAgICAgICAgICAgICAgd2hpbGUgKG9wY29kZSAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdF9wKCZwYikgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYiwgeCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXBfcCgmcGIsIHBpdGNoIC0gMik7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3Bjb2RlID0gLW9wY29kZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAob3Bjb2RlICYmIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYiwgYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXBfcCgmcGIsIHBpdGNoIC0gMik7CisgICAgICAgICAgICAgICAgICAgIG9wY29kZS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVudHJpZXMtLTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2RlbHRhX2wodWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBjb25zdCB1aW50OF90ICpidWZfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBmbGFnLCBpbnQgYnBwLCBpbnQgZHN0X3NpemUpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgb2ZmMCwgb2ZmMSwgZGdiLCBvZ2I7CisgICAgUHV0Qnl0ZUNvbnRleHQgcGI7CisgICAgdW5zaWduZWQgcG9mZjAsIHBvZmYxOworICAgIGludCBpLCBrLCBkc3RwaXRjaDsKKyAgICBpbnQgcGxhbmVwaXRjaF9ieXRlID0gKHcgKyA3KSAvIDg7CisgICAgaW50IHBsYW5lcGl0Y2ggPSAoKHcgKyAxNSkgLyAxNikgKiAyOworICAgIGludCBwaXRjaCA9IHBsYW5lcGl0Y2ggKiBicHA7CisKKyAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8PSA2NCkKKyAgICAgICAgcmV0dXJuOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmb2ZmMCwgYnVmLCBidWZfZW5kIC0gYnVmKTsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZvZmYxLCBidWYgKyAzMiwgYnVmX2VuZCAtIChidWYgKyAzMikpOworICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZwYiwgZHN0LCBkc3Rfc2l6ZSk7CisKKyAgICBkc3RwaXRjaCA9IGZsYWcgPyAoKCh3ICsgNykgLyA4KSAqIGJwcCk6IDI7CisKKyAgICBmb3IgKGsgPSAwOyBrIDwgYnBwOyBrKyspIHsKKyAgICAgICAgcG9mZjAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmb2ZmMCk7CisgICAgICAgIHBvZmYxID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJm9mZjEpOworCisgICAgICAgIGlmICghcG9mZjApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoMkxMICogcG9mZjAgPj0gYnVmX2VuZCAtIGJ1ZikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAoMkxMICogcG9mZjEgPj0gYnVmX2VuZCAtIGJ1ZikKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZkZ2IsIGJ1ZiArIDIgKiBwb2ZmMCwgYnVmX2VuZCAtIChidWYgKyAyICogcG9mZjApKTsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmb2diLCBidWYgKyAyICogcG9mZjEsIGJ1Zl9lbmQgLSAoYnVmICsgMiAqIHBvZmYxKSk7CisKKyAgICAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX3BlZWtfYmUxNigmb2diKSAhPSAweEZGRkYgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJm9nYikgPj0gNCkgeworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJm9nYik7CisgICAgICAgICAgICBpbnQxNl90IGNudCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZvZ2IpOworICAgICAgICAgICAgdWludDE2X3QgZGF0YTsKKworICAgICAgICAgICAgb2Zmc2V0ID0gKCgyICogb2Zmc2V0KSAvIHBsYW5lcGl0Y2hfYnl0ZSkgKiBwaXRjaCArICgoMiAqIG9mZnNldCkgJSBwbGFuZXBpdGNoX2J5dGUpICsgayAqIHBsYW5lcGl0Y2g7CisgICAgICAgICAgICBpZiAoY250IDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZGdiKSA8IDIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWtfcCgmcGIsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgIGNudCA9IC1jbnQ7CisgICAgICAgICAgICAgICAgZGF0YSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZkZ2IpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfYmUxNigmcGIsIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwX3AoJnBiLCBkc3RwaXRjaCAtIDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZkZ2IpIDwgMipjbnQpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWtfcCgmcGIsIG9mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkYXRhID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmRnYik7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTE2KCZwYiwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXBfcCgmcGIsIGRzdHBpdGNoIC0gMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiBzdGF0aWMgaW50IHVuc3VwcG9ydGVkKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBJZmZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJiaXRtYXAgKGNvbXByZXNzaW9uICVpLCBicHAgJWksIGhhbSAlaSkiLCBzLT5jb21wcmVzc2lvbiwgcy0+YnBwLCBzLT5oYW0pOworICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgImJpdG1hcCAoY29tcHJlc3Npb24gMHglMHgsIGJwcCAlaSwgaGFtICVpLCBpbnRlcmxhY2VkICVpKSIsIHMtPmNvbXByZXNzaW9uLCBzLT5icHAsIHMtPmhhbSwgcy0+aXNfaW50ZXJsYWNlZCk7CiAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiB9CiAKQEAgLTY3MiwyMyArMTQ5MSwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQogewogICAgIElmZkNvbnRleHQgKnMgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiAgICAgPSBhdnBrdC0+c2l6ZSA+PSAyID8gYXZwa3QtPmRhdGEgKyBBVl9SQjE2KGF2cGt0LT5kYXRhKSA6IE5VTEw7Ci0gICAgY29uc3QgaW50IGJ1Zl9zaXplICAgICA9IGF2cGt0LT5zaXplID49IDIgPyBhdnBrdC0+c2l6ZSAtIEFWX1JCMTYoYXZwa3QtPmRhdGEpIDogMDsKKyAgICBBVkZyYW1lICpmcmFtZSAgICAgICAgID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgICAgID0gYXZwa3QtPmRhdGE7CisgICAgaW50IGJ1Zl9zaXplICAgICAgICAgICA9IGF2cGt0LT5zaXplOwogICAgIGNvbnN0IHVpbnQ4X3QgKmJ1Zl9lbmQgPSBidWYgKyBidWZfc2l6ZTsKICAgICBpbnQgeSwgcGxhbmUsIHJlczsKLSAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBHZXRCeXRlQ29udGV4dCAqZ2IgPSAmcy0+Z2I7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOwogCisgICAgYnl0ZXN0cmVhbTJfaW5pdChnYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKwogICAgIGlmICgocmVzID0gZXh0cmFjdF9oZWFkZXIoYXZjdHgsIGF2cGt0KSkgPCAwKQogICAgICAgICByZXR1cm4gcmVzOwotICAgIGlmICgocmVzID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJlczsKIAorICAgIGlmICgocmVzID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisgICAgcy0+ZnJhbWUgPSBmcmFtZTsKKworICAgIGJ1ZiAgICAgICs9IGJ5dGVzdHJlYW0yX3RlbGwoZ2IpOworICAgIGJ1Zl9zaXplIC09IGJ5dGVzdHJlYW0yX3RlbGwoZ2IpOwogICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKIAogICAgIGlmICghcy0+aW5pdCAmJiBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDw9IDggJiYKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7Ci0gICAgICAgIGlmICgocmVzID0gY21hcF9yZWFkX3BhbGV0dGUoYXZjdHgsICh1aW50MzJfdCAqKXMtPmZyYW1lLT5kYXRhWzFdKSkgPCAwKQorICAgICAgICBpZiAoKHJlcyA9IGNtYXBfcmVhZF9wYWxldHRlKGF2Y3R4LCAodWludDMyX3QgKilmcmFtZS0+ZGF0YVsxXSkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgfSBlbHNlIGlmICghcy0+aW5pdCAmJiBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDw9IDggJiYKICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMzIpIHsKQEAgLTY5NywyMiArMTUyMywyNyBAQAogICAgIH0KICAgICBzLT5pbml0ID0gMTsKIAorICAgIGlmIChzLT5jb21wcmVzc2lvbiA8PSAweGZmICYmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdBJywgJ04nLCAnSScsICdNJykpKSB7CisgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpCisgICAgICAgICAgICBtZW1jcHkocy0+cGFsLCBzLT5mcmFtZS0+ZGF0YVsxXSwgMjU2ICogNCk7CisgICAgfQorCiAgICAgc3dpdGNoIChzLT5jb21wcmVzc2lvbikgewotICAgIGNhc2UgMDoKKyAgICBjYXNlIDB4MDoKICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnQycsICdCJywgJ00nKSkgewogICAgICAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCB8fCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dSQVk4KSB7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KHMtPmZyYW1lLT5kYXRhWzBdLCAwLCBhdmN0eC0+aGVpZ2h0ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoZnJhbWUtPmRhdGFbMF0sIDAsIGF2Y3R4LT5oZWlnaHQgKiBmcmFtZS0+bGluZXNpemVbMF0pOwogICAgICAgICAgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPmJwcDsgcGxhbmUrKykgewogICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodCAmJiBidWYgPCBidWZfZW5kOyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChyb3csIGJ1ZiwgRkZNSU4ocy0+cGxhbmVzaXplLCBidWZfZW5kIC0gYnVmKSwgcGxhbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IHMtPnBsYW5lc2l6ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+aGFtKSB7IC8vIEhBTSB0byBBVl9QSVhfRk1UX0JHUjMyCi0gICAgICAgICAgICAgICAgbWVtc2V0KHMtPmZyYW1lLT5kYXRhWzBdLCAwLCBhdmN0eC0+aGVpZ2h0ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoZnJhbWUtPmRhdGFbMF0sIDAsIGF2Y3R4LT5oZWlnaHQgKiBmcmFtZS0+bGluZXNpemVbMF0pOwogICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJnMtPmZyYW1lLT5kYXRhWzBdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmZnJhbWUtPmRhdGFbMF1beSAqIGZyYW1lLT5saW5lc2l6ZVswXV07CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5oYW1fYnVmLCAwLCBzLT5wbGFuZXNpemUgKiA4KTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwOyBwbGFuZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICogc3RhcnQgPSBidWYgKyAocGxhbmUgKiBhdmN0eC0+aGVpZ2h0ICsgeSkgKiBzLT5wbGFuZXNpemU7CkBAIC03MjgsNyArMTU1OSw3IEBACiAgICAgICAgICAgICBpbnQgcmF3X3dpZHRoID0gYXZjdHgtPndpZHRoICogKGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKSA+PiAzKTsKICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQgJiYgYnVmIDwgYnVmX2VuZDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJnMtPmZyYW1lLT5kYXRhWzBdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICBtZW1jcHkocm93LCBidWYsIEZGTUlOKHJhd193aWR0aCwgYnVmX2VuZCAtIGJ1ZikpOwogICAgICAgICAgICAgICAgIGJ1ZiArPSByYXdfd2lkdGg7CiAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMzIpIHsKQEAgLTczNiwxMCArMTU2NywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcm93WzQgKiB4ICsgM10gPSByb3dbNCAqIHggKyAzXSAmIDB4RjAgfCAocm93WzQgKiB4ICsgM10gPj4gNCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0knLCAnTCcsICdCJywgJ00nKSkgeyAvLyBpbnRlcmxlYXZlZAorICAgICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0knLCAnTCcsICdCJywgJ00nKSB8fCAvLyBpbnRlcmxlYXZlZAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnTicsICdJJywgJ00nKSkgeworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnTicsICdJJywgJ00nKSkKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+dmlkZW9bMF0sIGJ1ZiwgRkZNSU4oYnVmX2VuZCAtIGJ1Ziwgcy0+dmlkZW9fc2l6ZSkpOwogICAgICAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCB8fCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dSQVk4KSB7CiAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHJvdywgMCwgYXZjdHgtPndpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwICYmIGJ1ZiA8IGJ1Zl9lbmQ7IHBsYW5lKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChyb3csIGJ1ZiwgRkZNSU4ocy0+cGxhbmVzaXplLCBidWZfZW5kIC0gYnVmKSwgcGxhbmUpOwpAQCAtNzQ4LDcgKzE1ODIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+aGFtKSB7IC8vIEhBTSB0byBBVl9QSVhfRk1UX0JHUjMyCiAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmhhbV9idWYsIDAsIHMtPnBsYW5lc2l6ZSAqIDgpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5icHAgJiYgYnVmIDwgYnVmX2VuZDsgcGxhbmUrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcGxhbmU4KHMtPmhhbV9idWYsIGJ1ZiwgRkZNSU4ocy0+cGxhbmVzaXplLCBidWZfZW5kIC0gYnVmKSwgcGxhbmUpOwpAQCAtNzU4LDcgKzE1OTIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7IC8vIEFWX1BJWF9GTVRfQkdSMzIKICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJmZyYW1lLT5kYXRhWzBdW3kgKiBmcmFtZS0+bGluZXNpemVbMF1dOwogICAgICAgICAgICAgICAgICAgICBtZW1zZXQocm93LCAwLCBhdmN0eC0+d2lkdGggPDwgMik7CiAgICAgICAgICAgICAgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPmJwcCAmJiBidWYgPCBidWZfZW5kOyBwbGFuZSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVwbGFuZTMyKCh1aW50MzJfdCAqKXJvdywgYnVmLApAQCAtNzcwLDU4ICsxNjA0LDcyIEBACiAgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUCcsICdCJywgJ00nLCAnICcpKSB7IC8vIElGRi1QQk0KICAgICAgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZOCkgewogICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0ICYmIGJ1Zl9lbmQgPiBidWY7IHkrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHJvdywgYnVmLCBGRk1JTihhdmN0eC0+d2lkdGgsIGJ1Zl9lbmQgLSBidWYpKTsKICAgICAgICAgICAgICAgICAgICAgYnVmICs9IGF2Y3R4LT53aWR0aCArIChhdmN0eC0+d2lkdGggJSAyKTsgLy8gcGFkZGluZyBpZiBvZGQKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmhhbSkgeyAvLyBJRkYtUEJNOiBIQU0gdG8gQVZfUElYX0ZNVF9CR1IzMgogICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0ICYmIGJ1Zl9lbmQgPiBidWY7IHkrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHMtPmhhbV9idWYsIGJ1ZiwgRkZNSU4oYXZjdHgtPndpZHRoLCBidWZfZW5kIC0gYnVmKSk7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBhdmN0eC0+d2lkdGggKyAoYXZjdHgtPndpZHRoICYgMSk7IC8vIHBhZGRpbmcgaWYgb2RkCiAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9oYW1fcGxhbmUzMigodWludDMyX3QgKilyb3csIHMtPmhhbV9idWYsIHMtPmhhbV9wYWxidWYsIHMtPnBsYW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChhdmN0eCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnSScsICdMJywgJ0InLCAnTScpKSB7IC8vIGludGVybGVhdmVkCisgICAgY2FzZSAweDE6CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdJJywgJ0wnLCAnQicsICdNJykgfHwgLy8gaW50ZXJsZWF2ZWQKKyAgICAgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnTicsICdJJywgJ00nKSkgewogICAgICAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCB8fCBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dSQVk4KSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqdmlkZW8gPSBzLT52aWRlb1swXTsKKwogICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJnMtPmZyYW1lLT5kYXRhWzBdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmZnJhbWUtPmRhdGFbMF1beSAqIGZyYW1lLT5saW5lc2l6ZVswXV07CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChyb3csIDAsIGF2Y3R4LT53aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPmJwcDsgcGxhbmUrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IGRlY29kZV9ieXRlcnVuKHMtPnBsYW5lYnVmLCBzLT5wbGFuZXNpemUsIGJ1ZiwgYnVmX2VuZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gZGVjb2RlX2J5dGVydW4ocy0+cGxhbmVidWYsIHMtPnBsYW5lc2l6ZSwgZ2IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnTicsICdJJywgJ00nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSh2aWRlbywgcy0+cGxhbmVidWYsIHMtPnBsYW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gKz0gcy0+cGxhbmVzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcGxhbmU4KHJvdywgcy0+cGxhbmVidWYsIHMtPnBsYW5lc2l6ZSwgcGxhbmUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDw9IDgpIHsgLy84LWJpdCAoKyBtYXNrKSB0byBBVl9QSVhfRk1UX0JHUjMyCiAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPm1hc2tfYnVmLCAwLCBhdmN0eC0+d2lkdGggKiBzaXplb2YodWludDMyX3QpKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwOyBwbGFuZSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWYgKz0gZGVjb2RlX2J5dGVydW4ocy0+cGxhbmVidWYsIHMtPnBsYW5lc2l6ZSwgYnVmLCBidWZfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBkZWNvZGVfYnl0ZXJ1bihzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBnYik7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVwbGFuZTMyKHMtPm1hc2tfYnVmLCBzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBwbGFuZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbG9va3VwX3BhbF9pbmRpY2llcygodWludDMyX3QgKilyb3csIHMtPm1hc2tfYnVmLCBzLT5tYXNrX3BhbGJ1ZiwgYXZjdHgtPndpZHRoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmhhbSkgeyAvLyBIQU0gdG8gQVZfUElYX0ZNVF9CR1IzMgorICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnZpZGVvID0gcy0+dmlkZW9bMF07CiAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmhhbV9idWYsIDAsIHMtPnBsYW5lc2l6ZSAqIDgpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5icHA7IHBsYW5lKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBkZWNvZGVfYnl0ZXJ1bihzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBidWYsIGJ1Zl9lbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IGRlY29kZV9ieXRlcnVuKHMtPnBsYW5lYnVmLCBzLT5wbGFuZXNpemUsIGdiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdBJywgJ04nLCAnSScsICdNJykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkodmlkZW8sIHMtPnBsYW5lYnVmLCBzLT5wbGFuZXNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvICs9IHMtPnBsYW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChzLT5oYW1fYnVmLCBzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBwbGFuZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2hhbV9wbGFuZTMyKCh1aW50MzJfdCAqKXJvdywgcy0+aGFtX2J1Ziwgcy0+aGFtX3BhbGJ1Ziwgcy0+cGxhbmVzaXplKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBBVl9QSVhfRk1UX0JHUjMyCiAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyb3cgPSAmcy0+ZnJhbWUtPmRhdGFbMF1beSAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHJvdywgMCwgYXZjdHgtPndpZHRoIDw8IDIpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5icHA7IHBsYW5lKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBkZWNvZGVfYnl0ZXJ1bihzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBidWYsIGJ1Zl9lbmQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IGRlY29kZV9ieXRlcnVuKHMtPnBsYW5lYnVmLCBzLT5wbGFuZXNpemUsIGdiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lMzIoKHVpbnQzMl90ICopcm93LCBzLT5wbGFuZWJ1Ziwgcy0+cGxhbmVzaXplLCBwbGFuZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC04MjksNDggKzE2NzcsMTkxIEBACiAgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUCcsICdCJywgJ00nLCAnICcpKSB7IC8vIElGRi1QQk0KICAgICAgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZOCkgewogICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJnMtPmZyYW1lLT5kYXRhWzBdW3kgKiBzLT5mcmFtZS0+bGluZXNpemVbMF1dOwotICAgICAgICAgICAgICAgICAgICBidWYgKz0gZGVjb2RlX2J5dGVydW4ocm93LCBhdmN0eC0+d2lkdGgsIGJ1ZiwgYnVmX2VuZCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgYnVmICs9IGRlY29kZV9ieXRlcnVuKHJvdywgYXZjdHgtPndpZHRoLCBnYik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5oYW0pIHsgLy8gSUZGLVBCTTogSEFNIHRvIEFWX1BJWF9GTVRfQkdSMzIKICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZzLT5mcmFtZS0+ZGF0YVswXVt5ICogcy0+ZnJhbWUtPmxpbmVzaXplWzBdXTsKLSAgICAgICAgICAgICAgICAgICAgYnVmICs9IGRlY29kZV9ieXRlcnVuKHMtPmhhbV9idWYsIGF2Y3R4LT53aWR0aCwgYnVmLCBidWZfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJmZyYW1lLT5kYXRhWzBdW3kgKiBmcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgICAgICBidWYgKz0gZGVjb2RlX2J5dGVydW4ocy0+aGFtX2J1ZiwgYXZjdHgtPndpZHRoLCBnYik7CiAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9oYW1fcGxhbmUzMigodWludDMyX3QgKilyb3csIHMtPmhhbV9idWYsIHMtPmhhbV9wYWxidWYsIHMtPnBsYW5lc2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKICAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdEJywgJ0UnLCAnRScsICdQJykpIHsgLy8gSUZGLURFRVAKICAgICAgICAgICAgIGlmIChhdl9nZXRfYml0c19wZXJfcGl4ZWwoZGVzYykgPT0gMzIpCi0gICAgICAgICAgICAgICAgZGVjb2RlX2RlZXBfcmxlMzIocy0+ZnJhbWUtPmRhdGFbMF0sIGJ1ZiwgYnVmX3NpemUsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVfZGVlcF9ybGUzMihmcmFtZS0+ZGF0YVswXSwgYnVmLCBidWZfc2l6ZSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBmcmFtZS0+bGluZXNpemVbMF0pOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChhdmN0eCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnQScsICdDJywgJ0InLCAnTScpKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4IHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTgpIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoZnJhbWUtPmRhdGFbMF0sIDAsIGF2Y3R4LT5oZWlnaHQgKiBmcmFtZS0+bGluZXNpemVbMF0pOworICAgICAgICAgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPmJwcDsgcGxhbmUrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodCAmJiBidWYgPCBidWZfZW5kOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChyb3csIGJ1ZiwgRkZNSU4ocy0+cGxhbmVzaXplLCBidWZfZW5kIC0gYnVmKSwgcGxhbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmICs9IHMtPnBsYW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+aGFtKSB7IC8vIEhBTSB0byBBVl9QSVhfRk1UX0JHUjMyCisgICAgICAgICAgICAgICAgbWVtc2V0KGZyYW1lLT5kYXRhWzBdLCAwLCBhdmN0eC0+aGVpZ2h0ICogZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmhhbV9idWYsIDAsIHMtPnBsYW5lc2l6ZSAqIDgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5icHA7IHBsYW5lKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBzdGFydCA9IGJ1ZiArIChwbGFuZSAqIGF2Y3R4LT5oZWlnaHQgKyB5KSAqIHMtPnBsYW5lc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA+PSBidWZfZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlcGxhbmU4KHMtPmhhbV9idWYsIHN0YXJ0LCBGRk1JTihzLT5wbGFuZXNpemUsIGJ1Zl9lbmQgLSBzdGFydCksIHBsYW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVfaGFtX3BsYW5lMzIoKHVpbnQzMl90ICopcm93LCBzLT5oYW1fYnVmLCBzLT5oYW1fcGFsYnVmLCBzLT5wbGFuZXNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChhdmN0eCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgY2FzZSAweDI6CisgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdJJywgJ0wnLCAnQicsICdNJykgJiYgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5icHA7IHBsYW5lKyspIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVfYnl0ZXJ1bjIocy0+cGxhbmVidWYsIGF2Y3R4LT5oZWlnaHQsIHMtPnBsYW5lc2l6ZSwgZ2IpOworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJmZyYW1lLT5kYXRhWzBdW3kgKiBmcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgICAgICBkZWNvZGVwbGFuZTgocm93LCBzLT5wbGFuZWJ1ZiArIHMtPnBsYW5lc2l6ZSAqIHksIHMtPnBsYW5lc2l6ZSwgcGxhbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChhdmN0eCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDQ6CiAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdSJywgJ0cnLCAnQicsICc4JykgJiYgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IzMikKLSAgICAgICAgICAgIGRlY29kZV9yZ2I4KCZnYiwgcy0+ZnJhbWUtPmRhdGFbMF0sIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgIGRlY29kZV9yZ2I4KGdiLCBmcmFtZS0+ZGF0YVswXSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBmcmFtZS0+bGluZXNpemVbMF0pOwogICAgICAgICBlbHNlIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdSJywgJ0cnLCAnQicsICdOJykgJiYgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I0NDQpCi0gICAgICAgICAgICBkZWNvZGVfcmdibigmZ2IsIHMtPmZyYW1lLT5kYXRhWzBdLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIHMtPmZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgICAgICAgICBkZWNvZGVfcmdibihnYiwgZnJhbWUtPmRhdGFbMF0sIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgZnJhbWUtPmxpbmVzaXplWzBdKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgorICAgIGNhc2UgMHg1OgogICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnRCcsICdFJywgJ0UnLCAnUCcpKSB7CiAgICAgICAgICAgICBpZiAoYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpID09IDMyKQotICAgICAgICAgICAgICAgIGRlY29kZV9kZWVwX3R2ZGMzMihzLT5mcmFtZS0+ZGF0YVswXSwgYnVmLCBidWZfc2l6ZSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBzLT5mcmFtZS0+bGluZXNpemVbMF0sIHMtPnR2ZGMpOworICAgICAgICAgICAgICAgIGRlY29kZV9kZWVwX3R2ZGMzMihmcmFtZS0+ZGF0YVswXSwgYnVmLCBidWZfc2l6ZSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBmcmFtZS0+bGluZXNpemVbMF0sIHMtPnR2ZGMpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChhdmN0eCk7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDMwMDoKKyAgICBjYXNlIDB4MzAxOgorICAgICAgICBkZWNvZGVfc2hvcnRfaG9yaXpvbnRhbF9kZWx0YShzLT52aWRlb1swXSwgYnVmLCBidWZfZW5kLCBhdmN0eC0+d2lkdGgsIHMtPmJwcCwgcy0+dmlkZW9fc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg1MDA6CisgICAgY2FzZSAweDUwMToKKyAgICAgICAgZGVjb2RlX2J5dGVfdmVydGljYWxfZGVsdGEocy0+dmlkZW9bMF0sIGJ1ZiwgYnVmX2VuZCwgYXZjdHgtPndpZHRoLCBzLT5pc19icnVzaCwgcy0+YnBwLCBzLT52aWRlb19zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDcwMDoKKyAgICBjYXNlIDB4NzAxOgorICAgICAgICBpZiAocy0+aXNfc2hvcnQpCisgICAgICAgICAgICBkZWNvZGVfc2hvcnRfdmVydGljYWxfZGVsdGEocy0+dmlkZW9bMF0sIGJ1ZiwgYnVmX2VuZCwgYXZjdHgtPndpZHRoLCBzLT5icHAsIHMtPnZpZGVvX3NpemUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkZWNvZGVfbG9uZ192ZXJ0aWNhbF9kZWx0YShzLT52aWRlb1swXSwgYnVmLCBidWZfZW5kLCBhdmN0eC0+d2lkdGgsIHMtPmJwcCwgcy0+dmlkZW9fc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg4MDA6CisgICAgY2FzZSAweDgwMToKKyAgICAgICAgaWYgKHMtPmlzX3Nob3J0KQorICAgICAgICAgICAgZGVjb2RlX3Nob3J0X3ZlcnRpY2FsX2RlbHRhMihzLT52aWRlb1swXSwgYnVmLCBidWZfZW5kLCBhdmN0eC0+d2lkdGgsIHMtPmJwcCwgcy0+dmlkZW9fc2l6ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlY29kZV9sb25nX3ZlcnRpY2FsX2RlbHRhMihzLT52aWRlb1swXSwgYnVmLCBidWZfZW5kLCBhdmN0eC0+d2lkdGgsIHMtPmJwcCwgcy0+dmlkZW9fc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg0YTAwOgorICAgIGNhc2UgMHg0YTAxOgorICAgICAgICBkZWNvZGVfZGVsdGFfaihzLT52aWRlb1swXSwgYnVmLCBidWZfZW5kLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIHMtPmJwcCwgcy0+dmlkZW9fc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2NDAwOgorICAgIGNhc2UgMHg2NDAxOgorICAgICAgICBpZiAocy0+aXNfaW50ZXJsYWNlZCkKKyAgICAgICAgICAgIHJldHVybiB1bnN1cHBvcnRlZChhdmN0eCk7CisgICAgICAgIGRlY29kZV9kZWx0YV9kKHMtPnZpZGVvWzBdLCBidWYsIGJ1Zl9lbmQsIGF2Y3R4LT53aWR0aCwgcy0+aXNfaW50ZXJsYWNlZCwgcy0+YnBwLCBzLT52aWRlb19zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDY1MDA6CisgICAgY2FzZSAweDY1MDE6CisgICAgICAgIGlmIChzLT5pc19pbnRlcmxhY2VkKQorICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKKyAgICAgICAgZGVjb2RlX2RlbHRhX2Uocy0+dmlkZW9bMF0sIGJ1ZiwgYnVmX2VuZCwgYXZjdHgtPndpZHRoLCBzLT5pc19pbnRlcmxhY2VkLCBzLT5icHAsIHMtPnZpZGVvX3NpemUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NmMwMDoKKyAgICBjYXNlIDB4NmMwMToKKyAgICAgICAgZGVjb2RlX2RlbHRhX2wocy0+dmlkZW9bMF0sIGJ1ZiwgYnVmX2VuZCwgYXZjdHgtPndpZHRoLCBzLT5pc19zaG9ydCwgcy0+YnBwLCBzLT52aWRlb19zaXplKTsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKICAgICB9CiAKLSAgICBpZiAoKHJlcyA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5mcmFtZSkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAocy0+Y29tcHJlc3Npb24gPD0gMHhmZiAmJiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnQScsICdOJywgJ0knLCAnTScpKSkgeworICAgICAgICBtZW1jcHkocy0+dmlkZW9bMV0sIHMtPnZpZGVvWzBdLCBzLT52aWRlb19zaXplKTsKKyAgICB9CisKKyAgICBpZiAocy0+Y29tcHJlc3Npb24gPiAweGZmKSB7CisgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HUkFZOCkgeworICAgICAgICAgICAgYnVmID0gcy0+dmlkZW9bMF07CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJmZyYW1lLT5kYXRhWzBdW3kgKiBmcmFtZS0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgICAgIG1lbXNldChyb3csIDAsIGF2Y3R4LT53aWR0aCk7CisgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwOyBwbGFuZSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChyb3csIGJ1Ziwgcy0+cGxhbmVzaXplLCBwbGFuZSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZiArPSBzLT5wbGFuZXNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBzLT5wYWwsIDI1NiAqIDQpOworICAgICAgICB9IGVsc2UgaWYgKHMtPmhhbSkgeworICAgICAgICAgICAgaW50IGksIGNvdW50ID0gMSA8PCBzLT5oYW07CisKKyAgICAgICAgICAgIGJ1ZiA9IHMtPnZpZGVvWzBdOworICAgICAgICAgICAgbWVtc2V0KHMtPmhhbV9wYWxidWYsIDAsICgxIDw8IHMtPmhhbSkgKiAyICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbaSoyKzFdID0gcy0+cGFsW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB0bXAgPSBpIDw8ICg4IC0gcy0+aGFtKTsKKyAgICAgICAgICAgICAgICB0bXAgfD0gdG1wID4+IHMtPmhhbTsKKyAgICAgICAgICAgICAgICBzLT5oYW1fcGFsYnVmWyhpK2NvdW50KSoyXSAgICAgPSAweEZGMDBGRkZGOworICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbKGkrY291bnQqMikqMl0gICA9IDB4RkZGRkZGMDA7CisgICAgICAgICAgICAgICAgcy0+aGFtX3BhbGJ1ZlsoaStjb3VudCozKSoyXSAgID0gMHhGRkZGMDBGRjsKKyAgICAgICAgICAgICAgICBzLT5oYW1fcGFsYnVmWyhpK2NvdW50KSoyKzFdICAgPSAweEZGMDAwMDAwIHwgdG1wIDw8IDE2OworICAgICAgICAgICAgICAgIHMtPmhhbV9wYWxidWZbKGkrY291bnQqMikqMisxXSA9IDB4RkYwMDAwMDAgfCB0bXA7CisgICAgICAgICAgICAgICAgcy0+aGFtX3BhbGJ1ZlsoaStjb3VudCozKSoyKzFdID0gMHhGRjAwMDAwMCB8IHRtcCA8PCA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPm1hc2tpbmcgPT0gTUFTS19IQVNfTUFTSykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4ICogKDEgPDwgcy0+aGFtKTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBzLT5oYW1fcGFsYnVmWygxIDw8IHMtPmJwcCkgKyBpXSA9IHMtPmhhbV9wYWxidWZbaV0gfCAweEZGMDAwMDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJvdyA9ICZmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICBtZW1zZXQocy0+aGFtX2J1ZiwgMCwgcy0+cGxhbmVzaXplICogOCk7CisgICAgICAgICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+YnBwOyBwbGFuZSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRlY29kZXBsYW5lOChzLT5oYW1fYnVmLCBidWYsIHMtPnBsYW5lc2l6ZSwgcGxhbmUpOworICAgICAgICAgICAgICAgICAgICBidWYgKz0gcy0+cGxhbmVzaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWNvZGVfaGFtX3BsYW5lMzIoKHVpbnQzMl90ICopcm93LCBzLT5oYW1fYnVmLCBzLT5oYW1fcGFsYnVmLCBzLT5wbGFuZXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkKGF2Y3R4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcy0+aXNfYnJ1c2gpIHsKKyAgICAgICAgICAgIEZGU1dBUCh1aW50OF90ICosIHMtPnZpZGVvWzBdLCBzLT52aWRlb1sxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSB7CisgICAgICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgICAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDA7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICB9CiAKICAgICAqZ290X2ZyYW1lID0gMTsKIApAQCAtODgwLDEzICsxODcxLDE0IEBACiAjaWYgQ09ORklHX0lGRl9JTEJNX0RFQ09ERVIKIEFWQ29kZWMgZmZfaWZmX2lsYm1fZGVjb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAiaWZmIiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSUZGIiksCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIklGRiBBQ0JNL0FOSU0vREVFUC9JTEJNL1BCTS9SR0I4L1JHQk4iKSwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSUZGX0lMQk0sCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKElmZkNvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAogICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCiAgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX0NMRUFOVVAsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaWlyZmlsdGVyLmMgYi9saWJhdmNvZGVjL2lpcmZpbHRlci5jCmluZGV4IGNiNTg3MWMuLmIyMDI1MTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaWlyZmlsdGVyLmMKKysrIGIvbGliYXZjb2RlYy9paXJmaWx0ZXIuYwpAQCAtMjQsMjcgKzI0LDI5IEBACiAgKiBkaWZmZXJlbnQgSUlSIGZpbHRlcnMgaW1wbGVtZW50YXRpb24KICAqLwogCi0jaW5jbHVkZSAiaWlyZmlsdGVyLmgiCiAjaW5jbHVkZSA8bWF0aC5oPgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCiAKKyNpbmNsdWRlICJpaXJmaWx0ZXIuaCIKKwogLyoqCiAgKiBJSVIgZmlsdGVyIGdsb2JhbCBwYXJhbWV0ZXJzCiAgKi8KLXR5cGVkZWYgc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzewordHlwZWRlZiBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgewogICAgIGludCAgIG9yZGVyOwogICAgIGZsb2F0IGdhaW47CiAgICAgaW50ICAgKmN4OwogICAgIGZsb2F0ICpjeTsKLX1GRklJUkZpbHRlckNvZWZmczsKK30gRkZJSVJGaWx0ZXJDb2VmZnM7CiAKIC8qKgogICogSUlSIGZpbHRlciBzdGF0ZQogICovCi10eXBlZGVmIHN0cnVjdCBGRklJUkZpbHRlclN0YXRlewordHlwZWRlZiBzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSB7CiAgICAgZmxvYXQgeFsxXTsKLX1GRklJUkZpbHRlclN0YXRlOworfSBGRklJUkZpbHRlclN0YXRlOwogCiAvLy8gbWF4aW11bSBzdXBwb3J0ZWQgZmlsdGVyIG9yZGVyCiAjZGVmaW5lIE1BWE9SREVSIDMwCkBAIC02MSw1MSArNjMsNTAgQEAKIAogICAgIGlmIChmaWx0X21vZGUgIT0gRkZfRklMVEVSX01PREVfTE9XUEFTUykgewogICAgICAgICBhdl9sb2coYXZjLCBBVl9MT0dfRVJST1IsICJCdXR0ZXJ3b3J0aCBmaWx0ZXIgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgIgotICAgICAgICAgICAgICAgImxvdy1wYXNzIGZpbHRlciBtb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG93LXBhc3MgZmlsdGVyIG1vZGVcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGlmIChvcmRlciAmIDEpIHsKICAgICAgICAgYXZfbG9nKGF2YywgQVZfTE9HX0VSUk9SLCAiQnV0dGVyd29ydGggZmlsdGVyIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzICIKLSAgICAgICAgICAgICAgICJldmVuIGZpbHRlciBvcmRlcnNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVuIGZpbHRlciBvcmRlcnNcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgd2EgPSAyICogdGFuKE1fUEkgKiAwLjUgKiBjdXRvZmZfcmF0aW8pOwogCiAgICAgYy0+Y3hbMF0gPSAxOwotICAgIGZvcihpID0gMTsgaSA8IChvcmRlciA+PiAxKSArIDE7IGkrKykKKyAgICBmb3IgKGkgPSAxOyBpIDwgKG9yZGVyID4+IDEpICsgMTsgaSsrKQogICAgICAgICBjLT5jeFtpXSA9IGMtPmN4W2kgLSAxXSAqIChvcmRlciAtIGkgKyAxTEwpIC8gaTsKIAogICAgIHBbMF1bMF0gPSAxLjA7CiAgICAgcFswXVsxXSA9IDAuMDsKLSAgICBmb3IoaSA9IDE7IGkgPD0gb3JkZXI7IGkrKykKKyAgICBmb3IgKGkgPSAxOyBpIDw9IG9yZGVyOyBpKyspCiAgICAgICAgIHBbaV1bMF0gPSBwW2ldWzFdID0gMC4wOwotICAgIGZvcihpID0gMDsgaSA8IG9yZGVyOyBpKyspeworICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKSB7CiAgICAgICAgIGRvdWJsZSB6cFsyXTsKICAgICAgICAgZG91YmxlIHRoID0gKGkgKyAob3JkZXIgPj4gMSkgKyAwLjUpICogTV9QSSAvIG9yZGVyOwogICAgICAgICBkb3VibGUgYV9yZSwgYV9pbSwgY19yZSwgY19pbTsKICAgICAgICAgenBbMF0gPSBjb3ModGgpICogd2E7CiAgICAgICAgIHpwWzFdID0gc2luKHRoKSAqIHdhOwotICAgICAgICBhX3JlID0genBbMF0gKyAyLjA7Ci0gICAgICAgIGNfcmUgPSB6cFswXSAtIDIuMDsKLSAgICAgICAgYV9pbSA9Ci0gICAgICAgIGNfaW0gPSB6cFsxXTsKKyAgICAgICAgYV9yZSAgPSB6cFswXSArIDIuMDsKKyAgICAgICAgY19yZSAgPSB6cFswXSAtIDIuMDsKKyAgICAgICAgYV9pbSAgPQorICAgICAgICBjX2ltICA9IHpwWzFdOwogICAgICAgICB6cFswXSA9IChhX3JlICogY19yZSArIGFfaW0gKiBjX2ltKSAvIChjX3JlICogY19yZSArIGNfaW0gKiBjX2ltKTsKICAgICAgICAgenBbMV0gPSAoYV9pbSAqIGNfcmUgLSBhX3JlICogY19pbSkgLyAoY19yZSAqIGNfcmUgKyBjX2ltICogY19pbSk7CiAKLSAgICAgICAgZm9yKGogPSBvcmRlcjsgaiA+PSAxOyBqLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFfcmUgPSBwW2pdWzBdOwotICAgICAgICAgICAgYV9pbSA9IHBbal1bMV07Ci0gICAgICAgICAgICBwW2pdWzBdID0gYV9yZSp6cFswXSAtIGFfaW0qenBbMV0gKyBwW2otMV1bMF07Ci0gICAgICAgICAgICBwW2pdWzFdID0gYV9yZSp6cFsxXSArIGFfaW0qenBbMF0gKyBwW2otMV1bMV07CisgICAgICAgIGZvciAoaiA9IG9yZGVyOyBqID49IDE7IGotLSkgeworICAgICAgICAgICAgYV9yZSAgICA9IHBbal1bMF07CisgICAgICAgICAgICBhX2ltICAgID0gcFtqXVsxXTsKKyAgICAgICAgICAgIHBbal1bMF0gPSBhX3JlICogenBbMF0gLSBhX2ltICogenBbMV0gKyBwW2ogLSAxXVswXTsKKyAgICAgICAgICAgIHBbal1bMV0gPSBhX3JlICogenBbMV0gKyBhX2ltICogenBbMF0gKyBwW2ogLSAxXVsxXTsKICAgICAgICAgfQotICAgICAgICBhX3JlICAgID0gcFswXVswXSp6cFswXSAtIHBbMF1bMV0qenBbMV07Ci0gICAgICAgIHBbMF1bMV0gPSBwWzBdWzBdKnpwWzFdICsgcFswXVsxXSp6cFswXTsKKyAgICAgICAgYV9yZSAgICA9IHBbMF1bMF0gKiB6cFswXSAtIHBbMF1bMV0gKiB6cFsxXTsKKyAgICAgICAgcFswXVsxXSA9IHBbMF1bMF0gKiB6cFsxXSArIHBbMF1bMV0gKiB6cFswXTsKICAgICAgICAgcFswXVswXSA9IGFfcmU7CiAgICAgfQogICAgIGMtPmdhaW4gPSBwW29yZGVyXVswXTsKLSAgICBmb3IoaSA9IDA7IGkgPCBvcmRlcjsgaSsrKXsKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXI7IGkrKykgewogICAgICAgICBjLT5nYWluICs9IHBbaV1bMF07CiAgICAgICAgIGMtPmN5W2ldID0gKC1wW2ldWzBdICogcFtvcmRlcl1bMF0gKyAtcFtpXVsxXSAqIHBbb3JkZXJdWzFdKSAvCiAgICAgICAgICAgICAgICAgICAgKHBbb3JkZXJdWzBdICogcFtvcmRlcl1bMF0gKyBwW29yZGVyXVsxXSAqIHBbb3JkZXJdWzFdKTsKQEAgLTEyNSw3ICsxMjYsNyBAQAogICAgIGlmIChmaWx0X21vZGUgIT0gRkZfRklMVEVSX01PREVfSElHSFBBU1MgJiYKICAgICAgICAgZmlsdF9tb2RlICE9IEZGX0ZJTFRFUl9NT0RFX0xPV1BBU1MpIHsKICAgICAgICAgYXZfbG9nKGF2YywgQVZfTE9HX0VSUk9SLCAiQmlxdWFkIGZpbHRlciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyAiCi0gICAgICAgICAgICAgICAiaGlnaC1wYXNzIGFuZCBsb3ctcGFzcyBmaWx0ZXIgbW9kZXNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWdoLXBhc3MgYW5kIGxvdy1wYXNzIGZpbHRlciBtb2Rlc1xuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKG9yZGVyICE9IDIpIHsKQEAgLTE1OCwxMSArMTU5LDExIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWF2X2NvbGQgc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzKiBmZl9paXJfZmlsdGVyX2luaXRfY29lZmZzKHZvaWQgKmF2YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gSUlSRmlsdGVyVHlwZSBmaWx0X3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIElJUkZpbHRlck1vZGUgZmlsdF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBmbG9hdCBjdXRvZmZfcmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzdG9wYmFuZCwgZmxvYXQgcmlwcGxlKQorYXZfY29sZCBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKmZmX2lpcl9maWx0ZXJfaW5pdF9jb2VmZnModm9pZCAqYXZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBJSVJGaWx0ZXJUeXBlIGZpbHRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gSUlSRmlsdGVyTW9kZSBmaWx0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGZsb2F0IGN1dG9mZl9yYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN0b3BiYW5kLCBmbG9hdCByaXBwbGUpCiB7CiAgICAgRkZJSVJGaWx0ZXJDb2VmZnMgKmM7CiAgICAgaW50IHJldCA9IDA7CkBAIC0xNzAsMTIgKzE3MSwxMiBAQAogICAgIGlmIChvcmRlciA8PSAwIHx8IG9yZGVyID4gTUFYT1JERVIgfHwgY3V0b2ZmX3JhdGlvID49IDEuMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBGRl9BTExPQ1pfT1JfR09UTyhhdmMsIGMsICAgICBzaXplb2YoRkZJSVJGaWx0ZXJDb2VmZnMpLAorICAgIEZGX0FMTE9DWl9PUl9HT1RPKGF2YywgYywgc2l6ZW9mKEZGSUlSRmlsdGVyQ29lZmZzKSwKICAgICAgICAgICAgICAgICAgICAgICBpbml0X2ZhaWwpOwotICAgIEZGX0FMTE9DX09SX0dPVE8gKGF2YywgYy0+Y3gsIHNpemVvZihjLT5jeFswXSkgKiAoKG9yZGVyID4+IDEpICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgaW5pdF9mYWlsKTsKLSAgICBGRl9BTExPQ19PUl9HT1RPIChhdmMsIGMtPmN5LCBzaXplb2YoYy0+Y3lbMF0pICogb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgaW5pdF9mYWlsKTsKKyAgICBGRl9BTExPQ19PUl9HT1RPKGF2YywgYy0+Y3gsIHNpemVvZihjLT5jeFswXSkgKiAoKG9yZGVyID4+IDEpICsgMSksCisgICAgICAgICAgICAgICAgICAgICBpbml0X2ZhaWwpOworICAgIEZGX0FMTE9DX09SX0dPVE8oYXZjLCBjLT5jeSwgc2l6ZW9mKGMtPmN5WzBdKSAqIG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgaW5pdF9mYWlsKTsKICAgICBjLT5vcmRlciA9IG9yZGVyOwogCiAgICAgc3dpdGNoIChmaWx0X3R5cGUpIHsKQEAgLTIwMCw5ICsyMDEsOSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1hdl9jb2xkIHN0cnVjdCBGRklJUkZpbHRlclN0YXRlKiBmZl9paXJfZmlsdGVyX2luaXRfc3RhdGUoaW50IG9yZGVyKQorYXZfY29sZCBzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSAqZmZfaWlyX2ZpbHRlcl9pbml0X3N0YXRlKGludCBvcmRlcikKIHsKLSAgICBGRklJUkZpbHRlclN0YXRlKiBzID0gYXZfbWFsbG9jeihzaXplb2YoRkZJSVJGaWx0ZXJTdGF0ZSkgKyBzaXplb2Yocy0+eFswXSkgKiAob3JkZXIgLSAxKSk7CisgICAgRkZJSVJGaWx0ZXJTdGF0ZSAqcyA9IGF2X21hbGxvY3ooc2l6ZW9mKEZGSUlSRmlsdGVyU3RhdGUpICsgc2l6ZW9mKHMtPnhbMF0pICogKG9yZGVyIC0gMSkpOwogICAgIHJldHVybiBzOwogfQogCkBAIC0yMTAsMTcgKzIxMSwxOSBAQAogCiAjZGVmaW5lIENPTlZfRkxUKGRlc3QsIHNvdXJjZSkgZGVzdCA9IHNvdXJjZTsKIAotI2RlZmluZSBGSUxURVJfQldfTzRfMShpMCwgaTEsIGkyLCBpMywgZm10KSAgICAgICAgIFwKLSAgICBpbiA9ICpzcmMwICogYy0+Z2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICArIGMtPmN5WzBdKnMtPnhbaTBdICsgYy0+Y3lbMV0qcy0+eFtpMV0gICAgXAotICAgICAgICAgKyBjLT5jeVsyXSpzLT54W2kyXSArIGMtPmN5WzNdKnMtPnhbaTNdOyAgIFwKLSAgICByZXMgPSAgKHMtPnhbaTBdICsgaW4gICAgICApKjEgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICArIChzLT54W2kxXSArIHMtPnhbaTNdKSo0ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgKyAgcy0+eFtpMl0gICAgICAgICAgICAqNjsgICAgICAgICAgICAgICAgIFwKLSAgICBDT05WXyMjZm10KCpkc3QwLCByZXMpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcy0+eFtpMF0gPSBpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNyYzAgKz0gc3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkc3QwICs9IGRzdGVwOworI2RlZmluZSBGSUxURVJfQldfTzRfMShpMCwgaTEsIGkyLCBpMywgZm10KSAgICAgICAgICAgICBcCisgICAgaW4gPSAqc3JjMCAgICAqIGMtPmdhaW4gICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGMtPmN5WzBdICogcy0+eFtpMF0gKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgYy0+Y3lbMV0gKiBzLT54W2kxXSArICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBjLT5jeVsyXSAqIHMtPnhbaTJdICsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIGMtPmN5WzNdICogcy0+eFtpM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlcyA9IChzLT54W2kwXSArIGluKSAgICAgICAqIDEgKyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHMtPnhbaTFdICsgcy0+eFtpM10pICogNCArICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcy0+eFtpMl0gICAgICAgICAgICAgKiA2OyAgICAgICAgICAgICAgICAgICAgXAorICAgIENPTlZfICMjIGZtdCgqZHN0MCwgcmVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcy0+eFtpMF0gPSBpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMwICAgICs9IHNzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdDAgICAgKz0gZHN0ZXA7CiAKICNkZWZpbmUgRklMVEVSX0JXX080KHR5cGUsIGZtdCkgeyAgICAgICAgICAgXAogICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNDMsMTcgKzI0NiwxNyBAQAogICAgICAgICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZmxvYXQgaW4sIHJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGluID0gKnNyYzAgKiBjLT5nYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IoaiA9IDA7IGogPCBjLT5vcmRlcjsgaisrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGMtPm9yZGVyOyBqKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBpbiArPSBjLT5jeVtqXSAqIHMtPnhbal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICByZXMgPSBzLT54WzBdICsgaW4gKyBzLT54W2MtPm9yZGVyID4+IDFdICogYy0+Y3hbYy0+b3JkZXIgPj4gMV07ICAgIFwKLSAgICAgICAgZm9yKGogPSAxOyBqIDwgYy0+b3JkZXIgPj4gMTsgaisrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaiA9IDE7IGogPCBjLT5vcmRlciA+PiAxOyBqKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgcmVzICs9IChzLT54W2pdICsgcy0+eFtjLT5vcmRlciAtIGpdKSAqIGMtPmN4W2pdOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgZm9yKGogPSAwOyBqIDwgYy0+b3JkZXIgLSAxOyBqKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT5vcmRlciAtIDE7IGorKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgcy0+eFtqXSA9IHMtPnhbaiArIDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ09OVl8jI2ZtdCgqZHN0MCwgcmVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENPTlZfICMjIGZtdCgqZHN0MCwgcmVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBzLT54W2MtPm9yZGVyIC0gMV0gPSBpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3JjMCArPSBzc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRzdDAgKz0gZHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMwICAgICAgICAgICAgICArPSBzc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0MCAgICAgICAgICAgICAgKz0gZHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCkBAIC0yNjUsMTcgKzI2OCwxOCBAQAogICAgICAgICBmbG9hdCBpbiA9ICpzcmMwICAgKiBjLT5nYWluICArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICBzLT54WzBdICogYy0+Y3lbMF0gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgcy0+eFsxXSAqIGMtPmN5WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDT05WXyMjZm10KCpkc3QwLCBzLT54WzBdICsgaW4gKyBzLT54WzFdICogYy0+Y3hbMV0pICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ09OVl8gIyMgZm10KCpkc3QwLCBzLT54WzBdICsgaW4gKyBzLT54WzFdICogYy0+Y3hbMV0pICAgICAgICAgICAgICBcCiAgICAgICAgIHMtPnhbMF0gPSBzLT54WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBzLT54WzFdID0gaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3JjMCArPSBzc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRzdDAgKz0gZHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMwICAgKz0gc3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0MCAgICs9IGRzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCiB2b2lkIGZmX2lpcl9maWx0ZXIoY29uc3Qgc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzICpjLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGRklJUkZpbHRlclN0YXRlICpzLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpzcmMsIGludCBzc3RlcCwgaW50MTZfdCAqZHN0LCBpbnQgZHN0ZXApCisgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqc3JjLCBwdHJkaWZmX3Qgc3N0ZXAsCisgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LCBwdHJkaWZmX3QgZHN0ZXApCiB7CiAgICAgaWYgKGMtPm9yZGVyID09IDIpIHsKICAgICAgICAgRklMVEVSX08yKGludDE2X3QsIFMxNikKQEAgLTI4OCw3ICsyOTIsOCBAQAogCiB2b2lkIGZmX2lpcl9maWx0ZXJfZmx0KGNvbnN0IHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqYywKICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZGSUlSRmlsdGVyU3RhdGUgKnMsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjLCBpbnQgc3N0ZXAsIGZsb2F0ICpkc3QsIGludCBkc3RlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYywgcHRyZGlmZl90IHNzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZHN0LCBwdHJkaWZmX3QgZHN0ZXApCiB7CiAgICAgaWYgKGMtPm9yZGVyID09IDIpIHsKICAgICAgICAgRklMVEVSX08yKGZsb2F0LCBGTFQpCkBAIC0zMDcsNyArMzEyLDcgQEAKIGF2X2NvbGQgdm9pZCBmZl9paXJfZmlsdGVyX2ZyZWVfY29lZmZzcChzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKipjb2VmZnNwKQogewogICAgIHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqY29lZmZzID0gKmNvZWZmc3A7Ci0gICAgaWYoY29lZmZzKXsKKyAgICBpZiAoY29lZmZzKSB7CiAgICAgICAgIGF2X2ZyZWVwKCZjb2VmZnMtPmN4KTsKICAgICAgICAgYXZfZnJlZXAoJmNvZWZmcy0+Y3kpOwogICAgIH0KQEAgLTMyMCwzNiArMzI1LDMgQEAKICAgICBpZiAoSEFWRV9NSVBTRlBVKQogICAgICAgICBmZl9paXJfZmlsdGVyX2luaXRfbWlwcyhmKTsKIH0KLQotI2lmZGVmIFRFU1QKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIEZJTFRfT1JERVIgNAotI2RlZmluZSBTSVpFIDEwMjQKLWludCBtYWluKHZvaWQpCi17Ci0gICAgc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzICpmY29lZmZzID0gTlVMTDsKLSAgICBzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSAgKmZzdGF0ZSAgPSBOVUxMOwotICAgIGZsb2F0IGN1dG9mZl9jb2VmZiA9IDAuNDsKLSAgICBpbnQxNl90IHhbU0laRV0sIHlbU0laRV07Ci0gICAgaW50IGk7Ci0KLSAgICBmY29lZmZzID0gZmZfaWlyX2ZpbHRlcl9pbml0X2NvZWZmcyhOVUxMLCBGRl9GSUxURVJfVFlQRV9CVVRURVJXT1JUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9GSUxURVJfTU9ERV9MT1dQQVNTLCBGSUxUX09SREVSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1dG9mZl9jb2VmZiwgMC4wLCAwLjApOwotICAgIGZzdGF0ZSAgPSBmZl9paXJfZmlsdGVyX2luaXRfc3RhdGUoRklMVF9PUkRFUik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7Ci0gICAgICAgIHhbaV0gPSBscmludCgwLjc1ICogSU5UMTZfTUFYICogc2luKDAuNSpNX1BJKmkqaS9TSVpFKSk7Ci0gICAgfQotCi0gICAgZmZfaWlyX2ZpbHRlcihmY29lZmZzLCBmc3RhdGUsIFNJWkUsIHgsIDEsIHksIDEpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKLSAgICAgICAgcHJpbnRmKCIlNmQgJTZkXG4iLCB4W2ldLCB5W2ldKTsKLQotICAgIGZmX2lpcl9maWx0ZXJfZnJlZV9jb2VmZnNwKCZmY29lZmZzKTsKLSAgICBmZl9paXJfZmlsdGVyX2ZyZWVfc3RhdGVwKCZmc3RhdGUpOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaWlyZmlsdGVyLmggYi9saWJhdmNvZGVjL2lpcmZpbHRlci5oCmluZGV4IDZmN2JiYTYuLjVmZmExY2UgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaWlyZmlsdGVyLmgKKysrIGIvbGliYXZjb2RlYy9paXJmaWx0ZXIuaApAQCAtMjcsNyArMjcsOCBAQAogI2lmbmRlZiBBVkNPREVDX0lJUkZJTFRFUl9ICiAjZGVmaW5lIEFWQ09ERUNfSUlSRklMVEVSX0gKIAotI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzOwogc3RydWN0IEZGSUlSRmlsdGVyU3RhdGU7CkBAIC02MSw3ICs2Miw3IEBACiAgICAgKi8KICAgICB2b2lkICgqZmlsdGVyX2ZsdCkoY29uc3Qgc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzICpjb2VmZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSAqc3RhdGUsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYywgaW50IHNzdGVwLCBmbG9hdCAqZHN0LCBpbnQgZHN0ZXApOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYywgcHRyZGlmZl90IHNzdGVwLCBmbG9hdCAqZHN0LCBwdHJkaWZmX3QgZHN0ZXApOwogfSBGRklJUkZpbHRlckNvbnRleHQ7CiAKIC8qKgpAQCAtMTI1LDcgKzEyNiw3IEBACiAgKiBAcGFyYW0gZHN0ZXAgIGRlc3RpbmF0aW9uIHN0cmlkZQogICovCiB2b2lkIGZmX2lpcl9maWx0ZXIoY29uc3Qgc3RydWN0IEZGSUlSRmlsdGVyQ29lZmZzICpjb2VmZnMsIHN0cnVjdCBGRklJUkZpbHRlclN0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgc3N0ZXAsIGludDE2X3QgKmRzdCwgaW50IGRzdGVwKTsKKyAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgY29uc3QgaW50MTZfdCAqc3JjLCBwdHJkaWZmX3Qgc3N0ZXAsIGludDE2X3QgKmRzdCwgcHRyZGlmZl90IGRzdGVwKTsKIAogLyoqCiAgKiBQZXJmb3JtIElJUiBmaWx0ZXJpbmcgb24gZmxvYXRpbmctcG9pbnQgaW5wdXQgc2FtcGxlcy4KQEAgLTE0MCw2ICsxNDEsNyBAQAogICovCiB2b2lkIGZmX2lpcl9maWx0ZXJfZmx0KGNvbnN0IHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqY29lZmZzLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRkZJSVJGaWx0ZXJTdGF0ZSAqc3RhdGUsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjLCBpbnQgc3N0ZXAsIGZsb2F0ICpkc3QsIGludCBkc3RlcCk7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMsIHB0cmRpZmZfdCBzc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRzdCwgcHRyZGlmZl90IGRzdGVwKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfSUlSRklMVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaW1jLmMgYi9saWJhdmNvZGVjL2ltYy5jCmluZGV4IGY3ZWZmNjMuLjdjZDZkYjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaW1jLmMKKysrIGIvbGliYXZjb2RlYy9pbWMuYwpAQCAtMjcsNyArMjcsNiBAQAogICogIEEgbWRjdCBiYXNlZCBjb2RlYyB1c2luZyBhIDI1NiBwb2ludHMgbGFyZ2UgdHJhbnNmb3JtCiAgKiAgZGl2aWRlZCBpbnRvIDMyIGJhbmRzIHdpdGggc29tZSBtaXggb2Ygc2NhbGUgZmFjdG9ycy4KICAqICBPbmx5IG1vbm8gaXMgc3VwcG9ydGVkLgotICoKICAqLwogCiAKQEAgLTM2LDkgKzM1LDkgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmbWF0aC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJic3dhcGRzcC5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCkBAIC03MSw3ICs3MCw3IEBACiAgICAgaW50IHN1bUxlbkFycltCQU5EU107ICAgICAgLy8vPCBiaXRzIGZvciBhbGwgY29lZmZzIGluIGJhbmQKICAgICBpbnQgc2tpcEZsYWdSYXdbQkFORFNdOyAgICAvLy88IHNraXAgZmxhZ3MgYXJlIHN0b3JlZCBpbiByYXcgZm9ybSBvciBub3QKICAgICBpbnQgc2tpcEZsYWdCaXRzW0JBTkRTXTsgICAvLy88IGJpdHMgdXNlZCB0byBjb2RlIHNraXAgZmxhZ3MKLSAgICBpbnQgc2tpcEZsYWdDb3VudFtCQU5EU107ICAvLy88IHNraXBwZWQgY29lZmZpZW50cyBwZXIgYmFuZAorICAgIGludCBza2lwRmxhZ0NvdW50W0JBTkRTXTsgIC8vLzwgc2tpcHBlZCBjb2VmZmljaWVudHMgcGVyIGJhbmQKICAgICBpbnQgc2tpcEZsYWdzW0NPRUZGU107ICAgICAvLy88IHNraXAgY29lZmZpY2llbnQgZGVjb2Rpbmcgb3Igbm90CiAgICAgaW50IGNvZGV3b3Jkc1tDT0VGRlNdOyAgICAgLy8vPCByYXcgY29kZXdvcmRzIHJlYWQgZnJvbSBiaXRzdHJlYW0KIApAQCAtODI5LDcgKzgyOCw3IEBACiAgICAgICAgIGZvciAoaiA9IGJhbmRfdGFiW2ldOyBqIDwgYmFuZF90YWJbaSArIDFdOyBqKyspCiAgICAgICAgICAgICBjaGN0eC0+c3VtTGVuQXJyW2ldICs9IGNoY3R4LT5DV2xlbmd0aFRbal07CiAgICAgICAgIGlmIChjaGN0eC0+YmFuZEZsYWdzQnVmW2ldKQotICAgICAgICAgICAgaWYgKCgoKGJhbmRfdGFiW2kgKyAxXSAtIGJhbmRfdGFiW2ldKSAqIDEuNSkgPiBjaGN0eC0+c3VtTGVuQXJyW2ldKSAmJiAoY2hjdHgtPnN1bUxlbkFycltpXSA+IDApKQorICAgICAgICAgICAgaWYgKCgoaW50KSgoYmFuZF90YWJbaSArIDFdIC0gYmFuZF90YWJbaV0pICogMS41KSA+IGNoY3R4LT5zdW1MZW5BcnJbaV0pICYmIChjaGN0eC0+c3VtTGVuQXJyW2ldID4gMCkpCiAgICAgICAgICAgICAgICAgY2hjdHgtPnNraXBGbGFnUmF3W2ldID0gMTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaW1kY3QxNS5jIGIvbGliYXZjb2RlYy9pbWRjdDE1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MWFhMTEuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9pbWRjdDE1LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogQ2VsdCBub24tcG93ZXIgb2YgMiBpTURDVAotICovCi0KLSNpbmNsdWRlIDxmbG9hdC5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCi0KLSNpbmNsdWRlICJhdmZmdC5oIgotI2luY2x1ZGUgImltZGN0MTUuaCIKLSNpbmNsdWRlICJvcHVzLmgiCi0KLS8vIG1pbmltYWwgaU1EQ1Qgc2l6ZSB0byBtYWtlIFNJTUQgb3B0cyBlYXNpZXIKLSNkZWZpbmUgQ0VMVF9NSU5fSU1EQ1RfU0laRSAxMjAKLQotLy8gY29tcGxleCBjID0gYSAqIGIKLSNkZWZpbmUgQ01VTDMoY3JlLCBjaW0sIGFyZSwgYWltLCBicmUsIGJpbSkgICAgICAgICAgXAotZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3JlID0gYXJlICogYnJlIC0gYWltICogYmltOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaW0gPSBhcmUgKiBiaW0gKyBhaW0gKiBicmU7ICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotI2RlZmluZSBDTVVMKGMsIGEsIGIpIENNVUwzKChjKS5yZSwgKGMpLmltLCAoYSkucmUsIChhKS5pbSwgKGIpLnJlLCAoYikuaW0pCi0KLS8vIGNvbXBsZXggYyA9IGEgKiBiCi0vLyAgICAgICAgIGQgPSBhICogY29uanVnYXRlKGIpCi0jZGVmaW5lIENNVUwyKGMsIGQsIGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZsb2F0IGFyZSA9IChhKS5yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmxvYXQgYWltID0gKGEpLmltOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmbG9hdCBicmUgPSAoYikucmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZsb2F0IGJpbSA9IChiKS5pbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmxvYXQgcnIgID0gYXJlICogYnJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmbG9hdCByaSAgPSBhcmUgKiBiaW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZsb2F0IGlyICA9IGFpbSAqIGJyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmxvYXQgaWkgID0gYWltICogYmltOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYykucmUgPSAgcnIgLSBpaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChjKS5pbSA9ICByaSArIGlyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGQpLnJlID0gIHJyICsgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoZCkuaW0gPSAtcmkgKyBpcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSB3aGlsZSAoMCkKLQotYXZfY29sZCB2b2lkIGZmX2ltZGN0MTVfdW5pbml0KElNRENUMTVDb250ZXh0ICoqcHMpCi17Ci0gICAgSU1EQ1QxNUNvbnRleHQgKnMgPSAqcHM7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5leHB0YWIpOyBpKyspCi0gICAgICAgIGF2X2ZyZWVwKCZzLT5leHB0YWJbaV0pOwotCi0gICAgYXZfZnJlZXAoJnMtPnR3aWRkbGVfZXhwdGFiKTsKLQotICAgIGF2X2ZyZWVwKCZzLT50bXApOwotCi0gICAgYXZfZnJlZXAocHMpOwotfQotCi1zdGF0aWMgdm9pZCBpbWRjdDE1X2hhbGYoSU1EQ1QxNUNvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgZmxvYXQgc2NhbGUpOwotCi1hdl9jb2xkIGludCBmZl9pbWRjdDE1X2luaXQoSU1EQ1QxNUNvbnRleHQgKipwcywgaW50IE4pCi17Ci0gICAgSU1EQ1QxNUNvbnRleHQgKnM7Ci0gICAgaW50IGxlbjIgPSAxNSAqICgxIDw8IE4pOwotICAgIGludCBsZW4gID0gMiAqIGxlbjI7Ci0gICAgaW50IGksIGo7Ci0KLSAgICBpZiAobGVuMiA+IENFTFRfTUFYX0ZSQU1FX1NJWkUgfHwgbGVuMiA8IENFTFRfTUlOX0lNRENUX1NJWkUpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0KLSAgICBzID0gYXZfbWFsbG9jeihzaXplb2YoKnMpKTsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICBzLT5mZnRfbiA9IE4gLSAxOwotICAgIHMtPmxlbjQgPSBsZW4yIC8gMjsKLSAgICBzLT5sZW4yID0gbGVuMjsKLQotICAgIHMtPnRtcCAgPSBhdl9tYWxsb2NfYXJyYXkobGVuLCAyICogc2l6ZW9mKCpzLT50bXApKTsKLSAgICBpZiAoIXMtPnRtcCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgcy0+dHdpZGRsZV9leHB0YWIgID0gYXZfbWFsbG9jX2FycmF5KHMtPmxlbjQsIHNpemVvZigqcy0+dHdpZGRsZV9leHB0YWIpKTsKLSAgICBpZiAoIXMtPnR3aWRkbGVfZXhwdGFiKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bGVuNDsgaSsrKSB7Ci0gICAgICAgIHMtPnR3aWRkbGVfZXhwdGFiW2ldLnJlID0gY29zKDIgKiBNX1BJICogKGkgKyAwLjEyNSArIHMtPmxlbjQpIC8gbGVuKTsKLSAgICAgICAgcy0+dHdpZGRsZV9leHB0YWJbaV0uaW0gPSBzaW4oMiAqIE1fUEkgKiAoaSArIDAuMTI1ICsgcy0+bGVuNCkgLyBsZW4pOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5leHB0YWIpOyBpKyspIHsKLSAgICAgICAgaW50IE4gPSAxNSAqICgxIDw8IGkpOwotICAgICAgICBzLT5leHB0YWJbaV0gPSBhdl9tYWxsb2Moc2l6ZW9mKCpzLT5leHB0YWJbaV0pICogRkZNQVgoTiwgMTkpKTsKLSAgICAgICAgaWYgKCFzLT5leHB0YWJbaV0pCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykgewotICAgICAgICAgICAgcy0+ZXhwdGFiW2ldW2pdLnJlID0gY29zKDIgKiBNX1BJICogaiAvIE4pOwotICAgICAgICAgICAgcy0+ZXhwdGFiW2ldW2pdLmltID0gc2luKDIgKiBNX1BJICogaiAvIE4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gd3JhcCBhcm91bmQgdG8gc2ltcGxpZnkgZmZ0MTUKLSAgICBmb3IgKGogPSAxNTsgaiA8IDE5OyBqKyspCi0gICAgICAgIHMtPmV4cHRhYlswXVtqXSA9IHMtPmV4cHRhYlswXVtqIC0gMTVdOwotCi0gICAgcy0+aW1kY3RfaGFsZiA9IGltZGN0MTVfaGFsZjsKLQotICAgIGlmIChBUkNIX0FBUkNINjQpCi0gICAgICAgIGZmX2ltZGN0MTVfaW5pdF9hYXJjaDY0KHMpOwotCi0gICAgKnBzID0gczsKLQotICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIGZmX2ltZGN0MTVfdW5pbml0KCZzKTsKLSAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotfQotCi1zdGF0aWMgdm9pZCBmZnQ1KEZGVENvbXBsZXggKm91dCwgY29uc3QgRkZUQ29tcGxleCAqaW4sIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgLy8gWzBdID0gZXhwKDIgKiBpICogcGkgLyA1KSwgWzFdID0gZXhwKDIgKiBpICogcGkgKiAyIC8gNSkKLSAgICBzdGF0aWMgY29uc3QgRkZUQ29tcGxleCBmYWN0W10gPSB7IHsgMC4zMDkwMTY5OTQzNzQ5NDc0NSwgIDAuOTUxMDU2NTE2Mjk1MTUzNTMgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLTAuODA5MDE2OTk0Mzc0OTQ3MzQsIDAuNTg3Nzg1MjUyMjkyNDczMjUgfSB9OwotCi0gICAgRkZUQ29tcGxleCB6WzRdWzRdOwotCi0gICAgQ01VTDIoelswXVswXSwgelswXVszXSwgaW5bMSAqIHN0cmlkZV0sIGZhY3RbMF0pOwotICAgIENNVUwyKHpbMF1bMV0sIHpbMF1bMl0sIGluWzEgKiBzdHJpZGVdLCBmYWN0WzFdKTsKLSAgICBDTVVMMih6WzFdWzBdLCB6WzFdWzNdLCBpblsyICogc3RyaWRlXSwgZmFjdFswXSk7Ci0gICAgQ01VTDIoelsxXVsxXSwgelsxXVsyXSwgaW5bMiAqIHN0cmlkZV0sIGZhY3RbMV0pOwotICAgIENNVUwyKHpbMl1bMF0sIHpbMl1bM10sIGluWzMgKiBzdHJpZGVdLCBmYWN0WzBdKTsKLSAgICBDTVVMMih6WzJdWzFdLCB6WzJdWzJdLCBpblszICogc3RyaWRlXSwgZmFjdFsxXSk7Ci0gICAgQ01VTDIoelszXVswXSwgelszXVszXSwgaW5bNCAqIHN0cmlkZV0sIGZhY3RbMF0pOwotICAgIENNVUwyKHpbM11bMV0sIHpbM11bMl0sIGluWzQgKiBzdHJpZGVdLCBmYWN0WzFdKTsKLQotICAgIG91dFswXS5yZSA9IGluWzBdLnJlICsgaW5bc3RyaWRlXS5yZSArIGluWzIgKiBzdHJpZGVdLnJlICsgaW5bMyAqIHN0cmlkZV0ucmUgKyBpbls0ICogc3RyaWRlXS5yZTsKLSAgICBvdXRbMF0uaW0gPSBpblswXS5pbSArIGluW3N0cmlkZV0uaW0gKyBpblsyICogc3RyaWRlXS5pbSArIGluWzMgKiBzdHJpZGVdLmltICsgaW5bNCAqIHN0cmlkZV0uaW07Ci0KLSAgICBvdXRbMV0ucmUgPSBpblswXS5yZSArIHpbMF1bMF0ucmUgKyB6WzFdWzFdLnJlICsgelsyXVsyXS5yZSArIHpbM11bM10ucmU7Ci0gICAgb3V0WzFdLmltID0gaW5bMF0uaW0gKyB6WzBdWzBdLmltICsgelsxXVsxXS5pbSArIHpbMl1bMl0uaW0gKyB6WzNdWzNdLmltOwotCi0gICAgb3V0WzJdLnJlID0gaW5bMF0ucmUgKyB6WzBdWzFdLnJlICsgelsxXVszXS5yZSArIHpbMl1bMF0ucmUgKyB6WzNdWzJdLnJlOwotICAgIG91dFsyXS5pbSA9IGluWzBdLmltICsgelswXVsxXS5pbSArIHpbMV1bM10uaW0gKyB6WzJdWzBdLmltICsgelszXVsyXS5pbTsKLQotICAgIG91dFszXS5yZSA9IGluWzBdLnJlICsgelswXVsyXS5yZSArIHpbMV1bMF0ucmUgKyB6WzJdWzNdLnJlICsgelszXVsxXS5yZTsKLSAgICBvdXRbM10uaW0gPSBpblswXS5pbSArIHpbMF1bMl0uaW0gKyB6WzFdWzBdLmltICsgelsyXVszXS5pbSArIHpbM11bMV0uaW07Ci0KLSAgICBvdXRbNF0ucmUgPSBpblswXS5yZSArIHpbMF1bM10ucmUgKyB6WzFdWzJdLnJlICsgelsyXVsxXS5yZSArIHpbM11bMF0ucmU7Ci0gICAgb3V0WzRdLmltID0gaW5bMF0uaW0gKyB6WzBdWzNdLmltICsgelsxXVsyXS5pbSArIHpbMl1bMV0uaW0gKyB6WzNdWzBdLmltOwotfQotCi1zdGF0aWMgdm9pZCBmZnQxNShJTURDVDE1Q29udGV4dCAqcywgRkZUQ29tcGxleCAqb3V0LCBjb25zdCBGRlRDb21wbGV4ICppbiwKLSAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgY29uc3QgRkZUQ29tcGxleCAqZXhwdGFiID0gcy0+ZXhwdGFiWzBdOwotICAgIEZGVENvbXBsZXggdG1wWzVdOwotICAgIEZGVENvbXBsZXggdG1wMVs1XTsKLSAgICBGRlRDb21wbGV4IHRtcDJbNV07Ci0gICAgaW50IGs7Ci0KLSAgICBmZnQ1KHRtcCwgIGluLCAgICAgICAgICAgICAgc3RyaWRlICogMyk7Ci0gICAgZmZ0NSh0bXAxLCBpbiArICAgICBzdHJpZGUsIHN0cmlkZSAqIDMpOwotICAgIGZmdDUodG1wMiwgaW4gKyAyICogc3RyaWRlLCBzdHJpZGUgKiAzKTsKLQotICAgIGZvciAoayA9IDA7IGsgPCA1OyBrKyspIHsKLSAgICAgICAgRkZUQ29tcGxleCB0MSwgdDI7Ci0KLSAgICAgICAgQ01VTCh0MSwgdG1wMVtrXSwgZXhwdGFiW2tdKTsKLSAgICAgICAgQ01VTCh0MiwgdG1wMltrXSwgZXhwdGFiWzIgKiBrXSk7Ci0gICAgICAgIG91dFtrXS5yZSA9IHRtcFtrXS5yZSArIHQxLnJlICsgdDIucmU7Ci0gICAgICAgIG91dFtrXS5pbSA9IHRtcFtrXS5pbSArIHQxLmltICsgdDIuaW07Ci0KLSAgICAgICAgQ01VTCh0MSwgdG1wMVtrXSwgZXhwdGFiW2sgKyA1XSk7Ci0gICAgICAgIENNVUwodDIsIHRtcDJba10sIGV4cHRhYlsyICogKGsgKyA1KV0pOwotICAgICAgICBvdXRbayArIDVdLnJlID0gdG1wW2tdLnJlICsgdDEucmUgKyB0Mi5yZTsKLSAgICAgICAgb3V0W2sgKyA1XS5pbSA9IHRtcFtrXS5pbSArIHQxLmltICsgdDIuaW07Ci0KLSAgICAgICAgQ01VTCh0MSwgdG1wMVtrXSwgZXhwdGFiW2sgKyAxMF0pOwotICAgICAgICBDTVVMKHQyLCB0bXAyW2tdLCBleHB0YWJbMiAqIGsgKyA1XSk7Ci0gICAgICAgIG91dFtrICsgMTBdLnJlID0gdG1wW2tdLnJlICsgdDEucmUgKyB0Mi5yZTsKLSAgICAgICAgb3V0W2sgKyAxMF0uaW0gPSB0bXBba10uaW0gKyB0MS5pbSArIHQyLmltOwotICAgIH0KLX0KLQotLyoKLSAqIEZGVCBvZiB0aGUgbGVuZ3RoIDE1ICogKDJeTikKLSAqLwotc3RhdGljIHZvaWQgZmZ0X2NhbGMoSU1EQ1QxNUNvbnRleHQgKnMsIEZGVENvbXBsZXggKm91dCwgY29uc3QgRkZUQ29tcGxleCAqaW4sCi0gICAgICAgICAgICAgICAgICAgICBpbnQgTiwgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBpZiAoTikgewotICAgICAgICBjb25zdCBGRlRDb21wbGV4ICpleHB0YWIgPSBzLT5leHB0YWJbTl07Ci0gICAgICAgIGNvbnN0IGludCBsZW4yID0gMTUgKiAoMSA8PCAoTiAtIDEpKTsKLSAgICAgICAgaW50IGs7Ci0KLSAgICAgICAgZmZ0X2NhbGMocywgb3V0LCAgICAgICAgaW4sICAgICAgICAgIE4gLSAxLCBzdHJpZGUgKiAyKTsKLSAgICAgICAgZmZ0X2NhbGMocywgb3V0ICsgbGVuMiwgaW4gKyBzdHJpZGUsIE4gLSAxLCBzdHJpZGUgKiAyKTsKLQotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbGVuMjsgaysrKSB7Ci0gICAgICAgICAgICBGRlRDb21wbGV4IHQ7Ci0KLSAgICAgICAgICAgIENNVUwodCwgb3V0W2xlbjIgKyBrXSwgZXhwdGFiW2tdKTsKLQotICAgICAgICAgICAgb3V0W2xlbjIgKyBrXS5yZSA9IG91dFtrXS5yZSAtIHQucmU7Ci0gICAgICAgICAgICBvdXRbbGVuMiArIGtdLmltID0gb3V0W2tdLmltIC0gdC5pbTsKLQotICAgICAgICAgICAgb3V0W2tdLnJlICs9IHQucmU7Ci0gICAgICAgICAgICBvdXRba10uaW0gKz0gdC5pbTsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBmZnQxNShzLCBvdXQsIGluLCBzdHJpZGUpOwotfQotCi1zdGF0aWMgdm9pZCBpbWRjdDE1X2hhbGYoSU1EQ1QxNUNvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgZmxvYXQgc2NhbGUpCi17Ci0gICAgRkZUQ29tcGxleCAqeiA9IChGRlRDb21wbGV4ICopZHN0OwotICAgIGNvbnN0IGludCBsZW44ID0gcy0+bGVuNCAvIDI7Ci0gICAgY29uc3QgZmxvYXQgKmluMSA9IHNyYzsKLSAgICBjb25zdCBmbG9hdCAqaW4yID0gc3JjICsgKHMtPmxlbjIgLSAxKSAqIHN0cmlkZTsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5sZW40OyBpKyspIHsKLSAgICAgICAgRkZUQ29tcGxleCB0bXAgPSB7ICppbjIsICppbjEgfTsKLSAgICAgICAgQ01VTChzLT50bXBbaV0sIHRtcCwgcy0+dHdpZGRsZV9leHB0YWJbaV0pOwotICAgICAgICBpbjEgKz0gMiAqIHN0cmlkZTsKLSAgICAgICAgaW4yIC09IDIgKiBzdHJpZGU7Ci0gICAgfQotCi0gICAgZmZ0X2NhbGMocywgeiwgcy0+dG1wLCBzLT5mZnRfbiwgMSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuODsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHIwLCBpMCwgcjEsIGkxOwotCi0gICAgICAgIENNVUwzKHIwLCBpMSwgeltsZW44IC0gaSAtIDFdLmltLCB6W2xlbjggLSBpIC0gMV0ucmUsICBzLT50d2lkZGxlX2V4cHRhYltsZW44IC0gaSAtIDFdLmltLCBzLT50d2lkZGxlX2V4cHRhYltsZW44IC0gaSAtIDFdLnJlKTsKLSAgICAgICAgQ01VTDMocjEsIGkwLCB6W2xlbjggKyBpXS5pbSwgICAgIHpbbGVuOCArIGldLnJlLCAgICAgIHMtPnR3aWRkbGVfZXhwdGFiW2xlbjggKyBpXS5pbSwgICAgIHMtPnR3aWRkbGVfZXhwdGFiW2xlbjggKyBpXS5yZSk7Ci0gICAgICAgIHpbbGVuOCAtIGkgLSAxXS5yZSA9IHNjYWxlICogcjA7Ci0gICAgICAgIHpbbGVuOCAtIGkgLSAxXS5pbSA9IHNjYWxlICogaTA7Ci0gICAgICAgIHpbbGVuOCArIGldLnJlICAgICA9IHNjYWxlICogcjE7Ci0gICAgICAgIHpbbGVuOCArIGldLmltICAgICA9IHNjYWxlICogaTE7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pbWRjdDE1LmggYi9saWJhdmNvZGVjL2ltZGN0MTUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk3OWFhNy4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2ltZGN0MTUuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2lmbmRlZiBBVkNPREVDX0lNRENUMTVfSAotI2RlZmluZSBBVkNPREVDX0lNRENUMTVfSAotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlICJhdmZmdC5oIgotCi10eXBlZGVmIHN0cnVjdCBJTURDVDE1Q29udGV4dCB7Ci0gICAgaW50IGZmdF9uOwotICAgIGludCBsZW4yOwotICAgIGludCBsZW40OwotCi0gICAgRkZUQ29tcGxleCAqdG1wOwotCi0gICAgRkZUQ29tcGxleCAqdHdpZGRsZV9leHB0YWI7Ci0KLSAgICBGRlRDb21wbGV4ICpleHB0YWJbNl07Ci0KLSAgICAvKioKLSAgICAgKiBDYWxjdWxhdGUgdGhlIG1pZGRsZSBoYWxmIG9mIHRoZSBpTURDVAotICAgICAqLwotICAgIHZvaWQgKCppbWRjdF9oYWxmKShzdHJ1Y3QgSU1EQ1QxNUNvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCBmbG9hdCBzY2FsZSk7Ci19IElNRENUMTVDb250ZXh0OwotCi0vKioKLSAqIEluaXQgYW4gaU1EQ1Qgb2YgdGhlIGxlbmd0aCAyICogMTUgKiAoMl5OKQotICovCi1pbnQgZmZfaW1kY3QxNV9pbml0KElNRENUMTVDb250ZXh0ICoqcywgaW50IE4pOwotCi0vKioKLSAqIEZyZWUgYW4gaU1EQ1QuCi0gKi8KLXZvaWQgZmZfaW1kY3QxNV91bmluaXQoSU1EQ1QxNUNvbnRleHQgKipzKTsKLQotCi12b2lkIGZmX2ltZGN0MTVfaW5pdF9hYXJjaDY0KElNRENUMTVDb250ZXh0ICpzKTsKLQotI2VuZGlmIC8qIEFWQ09ERUNfSU1EQ1QxNV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ltZ2NvbnZlcnQuYyBiL2xpYmF2Y29kZWMvaW1nY29udmVydC5jCmluZGV4IDAwMzVkYzYuLjFmZDYzNmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaW1nY29udmVydC5jCisrKyBiL2xpYmF2Y29kZWMvaW1nY29udmVydC5jCkBAIC01NywxOSArNTcsMTEgQEAKICAgICByZXR1cm4gYXZfZmluZF9iZXN0X3BpeF9mbXRfb2ZfMihkc3RfcGl4X2ZtdDEsIGRzdF9waXhfZm10Miwgc3JjX3BpeF9mbXQsIGhhc19hbHBoYSwgbG9zc19wdHIpOwogfQogCi0jaWYgQVZfSEFWRV9JTkNPTVBBVElCTEVfTElCQVZfQUJJCi1lbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdDIoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10X2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNfcGl4X2ZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19hbHBoYSwgaW50ICpsb3NzX3B0cil7Ci0gICAgcmV0dXJuIGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXRfb2ZfbGlzdChwaXhfZm10X2xpc3QsIHNyY19waXhfZm10LCBoYXNfYWxwaGEsIGxvc3NfcHRyKTsKLX0KLSNlbHNlCiBlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdDIoZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MSwgZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY19waXhfZm10LCBpbnQgaGFzX2FscGhhLCBpbnQgKmxvc3NfcHRyKQogewogICAgIHJldHVybiBhdmNvZGVjX2ZpbmRfYmVzdF9waXhfZm10X29mXzIoZHN0X3BpeF9mbXQxLCBkc3RfcGl4X2ZtdDIsIHNyY19waXhfZm10LCBoYXNfYWxwaGEsIGxvc3NfcHRyKTsKIH0KLSNlbmRpZgogCiBlbnVtIEFWUGl4ZWxGb3JtYXQgYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdF9vZl9saXN0KGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdF9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjX3BpeF9mbXQsCkBAIC03NywxMCArNjksMTUgQEAKICAgICBpbnQgaTsKIAogICAgIGVudW0gQVZQaXhlbEZvcm1hdCBiZXN0ID0gQVZfUElYX0ZNVF9OT05FOworICAgIGludCBsb3NzOwogCi0gICAgZm9yKGk9MDsgcGl4X2ZtdF9saXN0W2ldICE9IEFWX1BJWF9GTVRfTk9ORTsgaSsrKQotICAgICAgICBiZXN0ID0gYXZjb2RlY19maW5kX2Jlc3RfcGl4X2ZtdF9vZl8yKGJlc3QsIHBpeF9mbXRfbGlzdFtpXSwgc3JjX3BpeF9mbXQsIGhhc19hbHBoYSwgbG9zc19wdHIpOworICAgIGZvciAoaT0wOyBwaXhfZm10X2xpc3RbaV0gIT0gQVZfUElYX0ZNVF9OT05FOyBpKyspIHsKKyAgICAgICAgbG9zcyA9IGxvc3NfcHRyID8gKmxvc3NfcHRyIDogMDsKKyAgICAgICAgYmVzdCA9IGF2Y29kZWNfZmluZF9iZXN0X3BpeF9mbXRfb2ZfMihiZXN0LCBwaXhfZm10X2xpc3RbaV0sIHNyY19waXhfZm10LCBoYXNfYWxwaGEsICZsb3NzKTsKKyAgICB9CiAKKyAgICBpZiAobG9zc19wdHIpCisgICAgICAgICpsb3NzX3B0ciA9IGxvc3M7CiAgICAgcmV0dXJuIGJlc3Q7CiB9CiAKQEAgLTIzMSwzMyArMjI4LDUgQEAKIAogICAgIHJldHVybiAwOwogfQotCi0jaWZkZWYgVEVTVAotCi1pbnQgbWFpbih2b2lkKXsKLSAgICBpbnQgaTsKLSAgICBpbnQgZXJyPTA7Ci0gICAgaW50IHNraXAgPSAwOwotCi0gICAgZm9yIChpPTA7IGk8QVZfUElYX0ZNVF9OQioyOyBpKyspIHsKLSAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsKLSAgICAgICAgaWYoIWRlc2MgfHwgIWRlc2MtPm5hbWUpIHsKLSAgICAgICAgICAgIHNraXAgKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2tpcCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJTNkIHVudXNlZCBwaXhlbCBmb3JtYXQgdmFsdWVzXG4iLCBza2lwKTsKLSAgICAgICAgICAgIHNraXAgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInBpeCBmbXQgJXMgeXV2X3BsYW46JWQgYXZnX2JwcDolZFxuIiwgZGVzYy0+bmFtZSwgaXNfeXV2X3BsYW5hcihkZXNjKSwgYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChkZXNjKSk7Ci0gICAgICAgIGlmICgoIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkpICE9IChkZXNjLT5uYl9jb21wb25lbnRzICE9IDIgJiYgZGVzYy0+bmJfY29tcG9uZW50cyAhPSA0KSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkFscGhhIGZsYWcgbWlzbWF0Y2hcbiIpOwotICAgICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi0jZW5kaWYKIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogI2VuZGlmIC8qIEZGX0FQSV9BVlBJQ1RVUkUgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaW14X2R1bXBfaGVhZGVyX2JzZi5jIGIvbGliYXZjb2RlYy9pbXhfZHVtcF9oZWFkZXJfYnNmLmMKaW5kZXggM2E2OWU5OC4uOWE5ZGUwNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pbXhfZHVtcF9oZWFkZXJfYnNmLmMKKysrIGIvbGliYXZjb2RlYy9pbXhfZHVtcF9oZWFkZXJfYnNmLmMKQEAgLTI2LDM1ICsyNiw1MSBAQAogICovCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogCiAKLXN0YXRpYyBpbnQgaW14X2R1bXBfaGVhZGVyKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSkKK3N0YXRpYyBpbnQgaW14X2R1bXBfaGVhZGVyKEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqb3V0KQogewogICAgIC8qIE1YRiBlc3NlbmNlIGVsZW1lbnQga2V5ICovCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaW14X2hlYWRlclsxNl0gPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDUsMHgwMSwweDAxLDB4MDAgfTsKLSAgICB1aW50OF90ICpwb3V0YnVmcDsKIAotICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImlteCBiaXRzdHJlYW0gZmlsdGVyIG9ubHkgYXBwbGllcyB0byBtcGVnMnZpZGVvIGNvZGVjXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIEFWUGFja2V0ICppbjsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1aW50OF90ICpvdXRfYnVmOwogCi0gICAgKnBvdXRidWYgPSBhdl9tYWxsb2MoYnVmX3NpemUgKyAyMCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGlmICghKnBvdXRidWYpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgcG91dGJ1ZnAgPSAqcG91dGJ1ZjsKLSAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnBvdXRidWZwLCBpbXhfaGVhZGVyLCAxNik7Ci0gICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcG91dGJ1ZnAsIDB4ODMpOyAvKiBLTFYgQkVSIGxvbmcgZm9ybSAqLwotICAgIGJ5dGVzdHJlYW1fcHV0X2JlMjQoJnBvdXRidWZwLCBidWZfc2l6ZSk7Ci0gICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwb3V0YnVmcCwgYnVmLCBidWZfc2l6ZSk7Ci0gICAgKnBvdXRidWZfc2l6ZSA9IHBvdXRidWZwIC0gKnBvdXRidWY7Ci0gICAgcmV0dXJuIDE7CisgICAgcmV0ID0gZmZfYnNmX2dldF9wYWNrZXQoY3R4LCAmaW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gYXZfbmV3X3BhY2tldChvdXQsIGluLT5zaXplICsgMjApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBvdXRfYnVmID0gb3V0LT5kYXRhOworCisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZvdXRfYnVmLCBpbXhfaGVhZGVyLCAxNik7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmb3V0X2J1ZiwgMHg4Myk7IC8qIEtMViBCRVIgbG9uZyBmb3JtICovCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUyNCgmb3V0X2J1ZiwgaW4tPnNpemUpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmb3V0X2J1ZiwgaW4tPmRhdGEsIGluLT5zaXplKTsKKworICAgIHJldCA9IGF2X3BhY2tldF9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKK2ZhaWw6CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisgICAgcmV0dXJuIHJldDsKIH0KIAotQVZCaXRTdHJlYW1GaWx0ZXIgZmZfaW14X2R1bXBfaGVhZGVyX2JzZiA9IHsKLSAgICAubmFtZSAgID0gImlteGR1bXAiLAotICAgIC5maWx0ZXIgPSBpbXhfZHVtcF9oZWFkZXIsCitzdGF0aWMgY29uc3QgZW51bSBBVkNvZGVjSUQgY29kZWNfaWRzW10gPSB7CisgICAgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX2lteF9kdW1wX2hlYWRlcl9ic2YgPSB7CisgICAgLm5hbWUgICAgICA9ICJpbXhkdW1wIiwKKyAgICAuZmlsdGVyICAgID0gaW14X2R1bXBfaGVhZGVyLAorICAgIC5jb2RlY19pZHMgPSBjb2RlY19pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pbmRlbzIuYyBiL2xpYmF2Y29kZWMvaW5kZW8yLmMKaW5kZXggMzQyNGUwMC4uNDk3MWI4NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pbmRlbzIuYworKysgYi9saWJhdmNvZGVjL2luZGVvMi5jCkBAIC0yNCw4ICsyNCw5IEBACiAgKiBJbnRlbCBJbmRlbyAyIGRlY29kZXIuCiAgKi8KIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW5kZW8yZGF0YS5oIgpAQCAtNjgsNiArNjksOCBAQAogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGMgKiAyOyBpKyspCiAgICAgICAgICAgICAgICAgZHN0W291dCsrXSA9IDB4ODA7CiAgICAgICAgIH0gZWxzZSB7IC8qIGNvcHkgdHdvIHZhbHVlcyBmcm9tIHRhYmxlICovCisgICAgICAgICAgICBpZiAoYyA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgZHN0W291dCsrXSA9IHRhYmxlW2MgKiAyXTsKICAgICAgICAgICAgIGRzdFtvdXQrK10gPSB0YWJsZVsoYyAqIDIpICsgMV07CiAgICAgICAgIH0KQEAgLTc2LDYgKzc5LDggQEAKIAogICAgIGZvciAoaiA9IDE7IGogPCBoZWlnaHQ7IGorKykgewogICAgICAgICBvdXQgPSAwOworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmY3R4LT5nYikgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB3aGlsZSAob3V0IDwgd2lkdGgpIHsKICAgICAgICAgICAgIGludCBjID0gaXIyX2dldF9jb2RlKCZjdHgtPmdiKTsKICAgICAgICAgICAgIGlmIChjID49IDB4ODApIHsgLyogd2UgaGF2ZSBhIHNraXAgKi8KQEAgLTg3LDcgKzkyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgIG91dCsrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7IC8qIGFkZCB0d28gZGVsdGFzIGZyb20gdGFibGUgKi8KLSAgICAgICAgICAgICAgICBpbnQgdCAgICA9IGRzdFtvdXQgLSBwaXRjaF0gKyAodGFibGVbYyAqIDJdIC0gMTI4KTsKKyAgICAgICAgICAgICAgICBpbnQgdDsKKyAgICAgICAgICAgICAgICBpZiAoYyA8PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB0ICAgICAgICA9IGRzdFtvdXQgLSBwaXRjaF0gKyAodGFibGVbYyAqIDJdIC0gMTI4KTsKICAgICAgICAgICAgICAgICB0ICAgICAgICA9IGF2X2NsaXBfdWludDgodCk7CiAgICAgICAgICAgICAgICAgZHN0W291dF0gPSB0OwogICAgICAgICAgICAgICAgIG91dCsrOwpAQCAtMTE1LDEyICsxMjMsMTYgQEAKIAogICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgewogICAgICAgICBvdXQgPSAwOworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmY3R4LT5nYikgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB3aGlsZSAob3V0IDwgd2lkdGgpIHsKICAgICAgICAgICAgIGMgPSBpcjJfZ2V0X2NvZGUoJmN0eC0+Z2IpOwogICAgICAgICAgICAgaWYgKGMgPj0gMHg4MCkgeyAvKiB3ZSBoYXZlIGEgc2tpcCAqLwogICAgICAgICAgICAgICAgIGMgICAtPSAweDdGOwogICAgICAgICAgICAgICAgIG91dCArPSBjICogMjsKICAgICAgICAgICAgIH0gZWxzZSB7IC8qIGFkZCB0d28gZGVsdGFzIGZyb20gdGFibGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoYyA8PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICB0ICAgICAgICA9IGRzdFtvdXRdICsgKCgodGFibGVbYyAqIDJdIC0gMTI4KSozKSA+PiAyKTsKICAgICAgICAgICAgICAgICB0ICAgICAgICA9IGF2X2NsaXBfdWludDgodCk7CiAgICAgICAgICAgICAgICAgZHN0W291dF0gPSB0OwpAQCAtMTQ2LDYgKzE1OCw3IEBACiAgICAgQVZGcmFtZSAqcGljdHVyZSAgICAgPSBkYXRhOwogICAgIEFWRnJhbWUgKiBjb25zdCBwICAgID0gcy0+cGljdHVyZTsKICAgICBpbnQgc3RhcnQsIHJldDsKKyAgICBpbnQgbHRhYiwgY3RhYjsKIAogICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBwKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMTY4LDM0ICsxODEsNDIgQEAKICAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHM4KCZzLT5nYiwgYnVmICsgc3RhcnQsIGJ1Zl9zaXplIC0gc3RhcnQpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKKyAgICBsdGFiID0gYnVmWzB4MjJdICYgMzsKKyAgICBjdGFiID0gYnVmWzB4MjJdID4+IDI7CisKKyAgICBpZiAoY3RhYiA+IDMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjdGFiICVkIGlzIGludmFsaWRcbiIsIGN0YWIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKICAgICBpZiAocy0+ZGVjb2RlX2RlbHRhKSB7IC8qIGludHJhZnJhbWUgKi8KICAgICAgICAgaWYgKChyZXQgPSBpcjJfZGVjb2RlX3BsYW5lKHMsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMF0sIHAtPmxpbmVzaXplWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXIyX2x1bWFfdGFibGUpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcjJfZGVsdGFfdGFibGVbbHRhYl0pKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgIC8qIHN3YXBwZWQgVSBhbmQgViAqLwogICAgICAgICBpZiAoKHJldCA9IGlyMl9kZWNvZGVfcGxhbmUocywgYXZjdHgtPndpZHRoID4+IDIsIGF2Y3R4LT5oZWlnaHQgPj4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMl0sIHAtPmxpbmVzaXplWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXIyX2x1bWFfdGFibGUpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcjJfZGVsdGFfdGFibGVbY3RhYl0pKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBpZiAoKHJldCA9IGlyMl9kZWNvZGVfcGxhbmUocywgYXZjdHgtPndpZHRoID4+IDIsIGF2Y3R4LT5oZWlnaHQgPj4gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMV0sIHAtPmxpbmVzaXplWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXIyX2x1bWFfdGFibGUpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcjJfZGVsdGFfdGFibGVbY3RhYl0pKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0gZWxzZSB7IC8qIGludGVyZnJhbWUgKi8KICAgICAgICAgaWYgKChyZXQgPSBpcjJfZGVjb2RlX3BsYW5lX2ludGVyKHMsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmRhdGFbMF0sIHAtPmxpbmVzaXplWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXIyX2x1bWFfdGFibGUpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcjJfZGVsdGFfdGFibGVbbHRhYl0pKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAvKiBzd2FwcGVkIFUgYW5kIFYgKi8KICAgICAgICAgaWYgKChyZXQgPSBpcjJfZGVjb2RlX3BsYW5lX2ludGVyKHMsIGF2Y3R4LT53aWR0aCA+PiAyLCBhdmN0eC0+aGVpZ2h0ID4+IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzJdLCBwLT5saW5lc2l6ZVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyMl9sdW1hX3RhYmxlKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXIyX2RlbHRhX3RhYmxlW2N0YWJdKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgaWYgKChyZXQgPSBpcjJfZGVjb2RlX3BsYW5lX2ludGVyKHMsIGF2Y3R4LT53aWR0aCA+PiAyLCBhdmN0eC0+aGVpZ2h0ID4+IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kYXRhWzFdLCBwLT5saW5lc2l6ZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyMl9sdW1hX3RhYmxlKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXIyX2RlbHRhX3RhYmxlW2N0YWJdKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaW5kZW8yZGF0YS5oIGIvbGliYXZjb2RlYy9pbmRlbzJkYXRhLmgKaW5kZXggMGQ2ZDgyZi4uYmZkYjBhNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pbmRlbzJkYXRhLmgKKysrIGIvbGliYXZjb2RlYy9pbmRlbzJkYXRhLmgKQEAgLTI2LDExNiArMjYsMTczIEBACiAKICNkZWZpbmUgSVIyX0NPREVTIDE0Mwogc3RhdGljIGNvbnN0IHVpbnQxNl90IGlyMl9jb2Rlc1tJUjJfQ09ERVNdWzJdID0gewotI2lmZGVmIEJJVFNUUkVBTV9SRUFERVJfTEUKLXsweDAwMDAsICAzfSwgezB4MDAwNCwgIDN9LCB7MHgwMDA2LCAgM30sIHsweDAwMDEsICA1fSwKLXsweDAwMDksICA1fSwgezB4MDAxOSwgIDV9LCB7MHgwMDBELCAgNX0sIHsweDAwMUQsICA1fSwKLXsweDAwMjMsICA2fSwgezB4MDAxMywgIDZ9LCB7MHgwMDMzLCAgNn0sIHsweDAwMEIsICA2fSwKLXsweDAwMkIsICA2fSwgezB4MDAxQiwgIDZ9LCB7MHgwMDA3LCAgOH0sIHsweDAwODcsICA4fSwKLXsweDAwMjcsICA4fSwgezB4MDBBNywgIDh9LCB7MHgwMDY3LCAgOH0sIHsweDAwRTcsICA4fSwKLXsweDAwOTcsICA4fSwgezB4MDA1NywgIDh9LCB7MHgwMDM3LCAgOH0sIHsweDAwQjcsICA4fSwKLXsweDAwRjcsICA4fSwgezB4MDAwRiwgIDl9LCB7MHgwMDhGLCAgOX0sIHsweDAxOEYsICA5fSwKLXsweDAxNEYsICA5fSwgezB4MDBDRiwgIDl9LCB7MHgwMDJGLCAgOX0sIHsweDAxMkYsICA5fSwKLXsweDAxQUYsICA5fSwgezB4MDA2RiwgIDl9LCB7MHgwMEVGLCAgOX0sIHsweDAxRUYsICA5fSwKLXsweDAwMUYsIDEwfSwgezB4MDIxRiwgMTB9LCB7MHgwMTFGLCAxMH0sIHsweDAzMUYsIDEwfSwKLXsweDAwOUYsIDEwfSwgezB4MDI5RiwgMTB9LCB7MHgwMTlGLCAxMH0sIHsweDAzOUYsIDEwfSwKLXsweDAwNUYsIDEwfSwgezB4MDI1RiwgMTB9LCB7MHgwMTVGLCAxMH0sIHsweDAzNUYsIDEwfSwKLXsweDAwREYsIDEwfSwgezB4MDJERiwgMTB9LCB7MHgwMURGLCAxMH0sIHsweDAzREYsIDEwfSwKLXsweDAwM0YsIDEzfSwgezB4MTAzRiwgMTN9LCB7MHgwODNGLCAxM30sIHsweDE4M0YsIDEzfSwKLXsweDA0M0YsIDEzfSwgezB4MTQzRiwgMTN9LCB7MHgwQzNGLCAxM30sIHsweDFDM0YsIDEzfSwKLXsweDAyM0YsIDEzfSwgezB4MTIzRiwgMTN9LCB7MHgwQTNGLCAxM30sIHsweDFBM0YsIDEzfSwKLXsweDA2M0YsIDEzfSwgezB4MTYzRiwgMTN9LCB7MHgwRTNGLCAxM30sIHsweDFFM0YsIDEzfSwKLXsweDAxM0YsIDEzfSwgezB4MTEzRiwgMTN9LCB7MHgwOTNGLCAxM30sIHsweDE5M0YsIDEzfSwKLXsweDA1M0YsIDEzfSwgezB4MTUzRiwgMTN9LCB7MHgwRDNGLCAxM30sIHsweDFEM0YsIDEzfSwKLXsweDAzM0YsIDEzfSwgezB4MTMzRiwgMTN9LCB7MHgwQjNGLCAxM30sIHsweDFCM0YsIDEzfSwKLXsweDA3M0YsIDEzfSwgezB4MTczRiwgMTN9LCB7MHgwRjNGLCAxM30sIHsweDFGM0YsIDEzfSwKLXsweDAwQkYsIDEzfSwgezB4MTBCRiwgMTN9LCB7MHgwOEJGLCAxM30sIHsweDE4QkYsIDEzfSwKLXsweDA0QkYsIDEzfSwgezB4MTRCRiwgMTN9LCB7MHgwQ0JGLCAxM30sIHsweDFDQkYsIDEzfSwKLXsweDAyQkYsIDEzfSwgezB4MTJCRiwgMTN9LCB7MHgwQUJGLCAxM30sIHsweDFBQkYsIDEzfSwKLXsweDA2QkYsIDEzfSwgezB4MTZCRiwgMTN9LCB7MHgwRUJGLCAxM30sIHsweDFFQkYsIDEzfSwKLXsweDAxQkYsIDEzfSwgezB4MTFCRiwgMTN9LCB7MHgwOUJGLCAxM30sIHsweDE5QkYsIDEzfSwKLXsweDA1QkYsIDEzfSwgezB4MTVCRiwgMTN9LCB7MHgwREJGLCAxM30sIHsweDFEQkYsIDEzfSwKLXsweDAzQkYsIDEzfSwgezB4MTNCRiwgMTN9LCB7MHgwQkJGLCAxM30sIHsweDFCQkYsIDEzfSwKLXsweDA3QkYsIDEzfSwgezB4MTdCRiwgMTN9LCB7MHgwRkJGLCAxM30sIHsweDFGQkYsIDEzfSwKLXsweDAwN0YsIDE0fSwgezB4MjA3RiwgMTR9LCB7MHgxMDdGLCAxNH0sIHsweDMwN0YsIDE0fSwKLXsweDA4N0YsIDE0fSwgezB4Mjg3RiwgMTR9LCB7MHgxODdGLCAxNH0sIHsweDM4N0YsIDE0fSwKLXsweDA0N0YsIDE0fSwgezB4MjQ3RiwgMTR9LCB7MHgxNDdGLCAxNH0sIHsweDAwMDIsICAzfSwKLXsweDAwMTEsICA1fSwgezB4MDAwNSwgIDV9LCB7MHgwMDE1LCAgNX0sIHsweDAwMDMsICA2fSwKLXsweDAwM0IsICA2fSwgezB4MDA0NywgIDh9LCB7MHgwMEM3LCAgOH0sIHsweDAwMTcsICA4fSwKLXsweDAwRDcsICA4fSwgezB4MDA3NywgIDh9LCB7MHgwMTBGLCAgOX0sIHsweDAwNEYsICA5fSwKLXsweDAxQ0YsICA5fSwgezB4MDBBRiwgIDl9LCB7MHgwMTZGLCAgOX0sCi0jZWxzZQotICAgIHsweDAwMDAsICAzfSwgezB4MDAwMSwgIDN9LCB7MHgwMDAzLCAgM30sIHsweDAwMTAsICA1fSwKLSAgICB7MHgwMDEyLCAgNX0sIHsweDAwMTMsICA1fSwgezB4MDAxNiwgIDV9LCB7MHgwMDE3LCAgNX0sCi0gICAgezB4MDAzMSwgIDZ9LCB7MHgwMDMyLCAgNn0sIHsweDAwMzMsICA2fSwgezB4MDAzNCwgIDZ9LAotICAgIHsweDAwMzUsICA2fSwgezB4MDAzNiwgIDZ9LCB7MHgwMEUwLCAgOH0sIHsweDAwRTEsICA4fSwKLSAgICB7MHgwMEU0LCAgOH0sIHsweDAwRTUsICA4fSwgezB4MDBFNiwgIDh9LCB7MHgwMEU3LCAgOH0sCi0gICAgezB4MDBFOSwgIDh9LCB7MHgwMEVBLCAgOH0sIHsweDAwRUMsICA4fSwgezB4MDBFRCwgIDh9LAotICAgIHsweDAwRUYsICA4fSwgezB4MDFFMCwgIDl9LCB7MHgwMUUyLCAgOX0sIHsweDAxRTMsICA5fSwKLSAgICB7MHgwMUU1LCAgOX0sIHsweDAxRTYsICA5fSwgezB4MDFFOCwgIDl9LCB7MHgwMUU5LCAgOX0sCi0gICAgezB4MDFFQiwgIDl9LCB7MHgwMUVDLCAgOX0sIHsweDAxRUUsICA5fSwgezB4MDFFRiwgIDl9LAotICAgIHsweDAzRTAsIDEwfSwgezB4MDNFMSwgMTB9LCB7MHgwM0UyLCAxMH0sIHsweDAzRTMsIDEwfSwKLSAgICB7MHgwM0U0LCAxMH0sIHsweDAzRTUsIDEwfSwgezB4MDNFNiwgMTB9LCB7MHgwM0U3LCAxMH0sCi0gICAgezB4MDNFOCwgMTB9LCB7MHgwM0U5LCAxMH0sIHsweDAzRUEsIDEwfSwgezB4MDNFQiwgMTB9LAotICAgIHsweDAzRUMsIDEwfSwgezB4MDNFRCwgMTB9LCB7MHgwM0VFLCAxMH0sIHsweDAzRUYsIDEwfSwKLSAgICB7MHgxRjgwLCAxM30sIHsweDFGODEsIDEzfSwgezB4MUY4MiwgMTN9LCB7MHgxRjgzLCAxM30sCi0gICAgezB4MUY4NCwgMTN9LCB7MHgxRjg1LCAxM30sIHsweDFGODYsIDEzfSwgezB4MUY4NywgMTN9LAotICAgIHsweDFGODgsIDEzfSwgezB4MUY4OSwgMTN9LCB7MHgxRjhBLCAxM30sIHsweDFGOEIsIDEzfSwKLSAgICB7MHgxRjhDLCAxM30sIHsweDFGOEQsIDEzfSwgezB4MUY4RSwgMTN9LCB7MHgxRjhGLCAxM30sCi0gICAgezB4MUY5MCwgMTN9LCB7MHgxRjkxLCAxM30sIHsweDFGOTIsIDEzfSwgezB4MUY5MywgMTN9LAotICAgIHsweDFGOTQsIDEzfSwgezB4MUY5NSwgMTN9LCB7MHgxRjk2LCAxM30sIHsweDFGOTcsIDEzfSwKLSAgICB7MHgxRjk4LCAxM30sIHsweDFGOTksIDEzfSwgezB4MUY5QSwgMTN9LCB7MHgxRjlCLCAxM30sCi0gICAgezB4MUY5QywgMTN9LCB7MHgxRjlELCAxM30sIHsweDFGOUUsIDEzfSwgezB4MUY5RiwgMTN9LAotICAgIHsweDFGQTAsIDEzfSwgezB4MUZBMSwgMTN9LCB7MHgxRkEyLCAxM30sIHsweDFGQTMsIDEzfSwKLSAgICB7MHgxRkE0LCAxM30sIHsweDFGQTUsIDEzfSwgezB4MUZBNiwgMTN9LCB7MHgxRkE3LCAxM30sCi0gICAgezB4MUZBOCwgMTN9LCB7MHgxRkE5LCAxM30sIHsweDFGQUEsIDEzfSwgezB4MUZBQiwgMTN9LAotICAgIHsweDFGQUMsIDEzfSwgezB4MUZBRCwgMTN9LCB7MHgxRkFFLCAxM30sIHsweDFGQUYsIDEzfSwKLSAgICB7MHgxRkIwLCAxM30sIHsweDFGQjEsIDEzfSwgezB4MUZCMiwgMTN9LCB7MHgxRkIzLCAxM30sCi0gICAgezB4MUZCNCwgMTN9LCB7MHgxRkI1LCAxM30sIHsweDFGQjYsIDEzfSwgezB4MUZCNywgMTN9LAotICAgIHsweDFGQjgsIDEzfSwgezB4MUZCOSwgMTN9LCB7MHgxRkJBLCAxM30sIHsweDFGQkIsIDEzfSwKLSAgICB7MHgxRkJDLCAxM30sIHsweDFGQkQsIDEzfSwgezB4MUZCRSwgMTN9LCB7MHgxRkJGLCAxM30sCi0gICAgezB4M0Y4MCwgMTR9LCB7MHgzRjgxLCAxNH0sIHsweDNGODIsIDE0fSwgezB4M0Y4MywgMTR9LAotICAgIHsweDNGODQsIDE0fSwgezB4M0Y4NSwgMTR9LCB7MHgzRjg2LCAxNH0sIHsweDNGODcsIDE0fSwKLSAgICB7MHgzRjg4LCAxNH0sIHsweDNGODksIDE0fSwgezB4M0Y4QSwgMTR9LCB7MHgwMDAyLCAgM30sCi0gICAgezB4MDAxMSwgIDV9LCB7MHgwMDE0LCAgNX0sIHsweDAwMTUsICA1fSwgezB4MDAzMCwgIDZ9LAotICAgIHsweDAwMzcsICA2fSwgezB4MDBFMiwgIDh9LCB7MHgwMEUzLCAgOH0sIHsweDAwRTgsICA4fSwKLSAgICB7MHgwMEVCLCAgOH0sIHsweDAwRUUsICA4fSwgezB4MDFFMSwgIDl9LCB7MHgwMUU0LCAgOX0sCi0gICAgezB4MDFFNywgIDl9LCB7MHgwMUVBLCAgOX0sIHsweDAxRUQsICA5fQotI2VuZGlmCisgICAgeyAweDAwMDAsICAzIH0sIHsgMHgwMDA0LCAgMyB9LCB7IDB4MDAwNiwgIDMgfSwgeyAweDAwMDEsICA1IH0sCisgICAgeyAweDAwMDksICA1IH0sIHsgMHgwMDE5LCAgNSB9LCB7IDB4MDAwRCwgIDUgfSwgeyAweDAwMUQsICA1IH0sCisgICAgeyAweDAwMjMsICA2IH0sIHsgMHgwMDEzLCAgNiB9LCB7IDB4MDAzMywgIDYgfSwgeyAweDAwMEIsICA2IH0sCisgICAgeyAweDAwMkIsICA2IH0sIHsgMHgwMDFCLCAgNiB9LCB7IDB4MDAwNywgIDggfSwgeyAweDAwODcsICA4IH0sCisgICAgeyAweDAwMjcsICA4IH0sIHsgMHgwMEE3LCAgOCB9LCB7IDB4MDA2NywgIDggfSwgeyAweDAwRTcsICA4IH0sCisgICAgeyAweDAwOTcsICA4IH0sIHsgMHgwMDU3LCAgOCB9LCB7IDB4MDAzNywgIDggfSwgeyAweDAwQjcsICA4IH0sCisgICAgeyAweDAwRjcsICA4IH0sIHsgMHgwMDBGLCAgOSB9LCB7IDB4MDA4RiwgIDkgfSwgeyAweDAxOEYsICA5IH0sCisgICAgeyAweDAxNEYsICA5IH0sIHsgMHgwMENGLCAgOSB9LCB7IDB4MDAyRiwgIDkgfSwgeyAweDAxMkYsICA5IH0sCisgICAgeyAweDAxQUYsICA5IH0sIHsgMHgwMDZGLCAgOSB9LCB7IDB4MDBFRiwgIDkgfSwgeyAweDAxRUYsICA5IH0sCisgICAgeyAweDAwMUYsIDEwIH0sIHsgMHgwMjFGLCAxMCB9LCB7IDB4MDExRiwgMTAgfSwgeyAweDAzMUYsIDEwIH0sCisgICAgeyAweDAwOUYsIDEwIH0sIHsgMHgwMjlGLCAxMCB9LCB7IDB4MDE5RiwgMTAgfSwgeyAweDAzOUYsIDEwIH0sCisgICAgeyAweDAwNUYsIDEwIH0sIHsgMHgwMjVGLCAxMCB9LCB7IDB4MDE1RiwgMTAgfSwgeyAweDAzNUYsIDEwIH0sCisgICAgeyAweDAwREYsIDEwIH0sIHsgMHgwMkRGLCAxMCB9LCB7IDB4MDFERiwgMTAgfSwgeyAweDAzREYsIDEwIH0sCisgICAgeyAweDAwM0YsIDEzIH0sIHsgMHgxMDNGLCAxMyB9LCB7IDB4MDgzRiwgMTMgfSwgeyAweDE4M0YsIDEzIH0sCisgICAgeyAweDA0M0YsIDEzIH0sIHsgMHgxNDNGLCAxMyB9LCB7IDB4MEMzRiwgMTMgfSwgeyAweDFDM0YsIDEzIH0sCisgICAgeyAweDAyM0YsIDEzIH0sIHsgMHgxMjNGLCAxMyB9LCB7IDB4MEEzRiwgMTMgfSwgeyAweDFBM0YsIDEzIH0sCisgICAgeyAweDA2M0YsIDEzIH0sIHsgMHgxNjNGLCAxMyB9LCB7IDB4MEUzRiwgMTMgfSwgeyAweDFFM0YsIDEzIH0sCisgICAgeyAweDAxM0YsIDEzIH0sIHsgMHgxMTNGLCAxMyB9LCB7IDB4MDkzRiwgMTMgfSwgeyAweDE5M0YsIDEzIH0sCisgICAgeyAweDA1M0YsIDEzIH0sIHsgMHgxNTNGLCAxMyB9LCB7IDB4MEQzRiwgMTMgfSwgeyAweDFEM0YsIDEzIH0sCisgICAgeyAweDAzM0YsIDEzIH0sIHsgMHgxMzNGLCAxMyB9LCB7IDB4MEIzRiwgMTMgfSwgeyAweDFCM0YsIDEzIH0sCisgICAgeyAweDA3M0YsIDEzIH0sIHsgMHgxNzNGLCAxMyB9LCB7IDB4MEYzRiwgMTMgfSwgeyAweDFGM0YsIDEzIH0sCisgICAgeyAweDAwQkYsIDEzIH0sIHsgMHgxMEJGLCAxMyB9LCB7IDB4MDhCRiwgMTMgfSwgeyAweDE4QkYsIDEzIH0sCisgICAgeyAweDA0QkYsIDEzIH0sIHsgMHgxNEJGLCAxMyB9LCB7IDB4MENCRiwgMTMgfSwgeyAweDFDQkYsIDEzIH0sCisgICAgeyAweDAyQkYsIDEzIH0sIHsgMHgxMkJGLCAxMyB9LCB7IDB4MEFCRiwgMTMgfSwgeyAweDFBQkYsIDEzIH0sCisgICAgeyAweDA2QkYsIDEzIH0sIHsgMHgxNkJGLCAxMyB9LCB7IDB4MEVCRiwgMTMgfSwgeyAweDFFQkYsIDEzIH0sCisgICAgeyAweDAxQkYsIDEzIH0sIHsgMHgxMUJGLCAxMyB9LCB7IDB4MDlCRiwgMTMgfSwgeyAweDE5QkYsIDEzIH0sCisgICAgeyAweDA1QkYsIDEzIH0sIHsgMHgxNUJGLCAxMyB9LCB7IDB4MERCRiwgMTMgfSwgeyAweDFEQkYsIDEzIH0sCisgICAgeyAweDAzQkYsIDEzIH0sIHsgMHgxM0JGLCAxMyB9LCB7IDB4MEJCRiwgMTMgfSwgeyAweDFCQkYsIDEzIH0sCisgICAgeyAweDA3QkYsIDEzIH0sIHsgMHgxN0JGLCAxMyB9LCB7IDB4MEZCRiwgMTMgfSwgeyAweDFGQkYsIDEzIH0sCisgICAgeyAweDAwN0YsIDE0IH0sIHsgMHgyMDdGLCAxNCB9LCB7IDB4MTA3RiwgMTQgfSwgeyAweDMwN0YsIDE0IH0sCisgICAgeyAweDA4N0YsIDE0IH0sIHsgMHgyODdGLCAxNCB9LCB7IDB4MTg3RiwgMTQgfSwgeyAweDM4N0YsIDE0IH0sCisgICAgeyAweDA0N0YsIDE0IH0sIHsgMHgyNDdGLCAxNCB9LCB7IDB4MTQ3RiwgMTQgfSwgeyAweDAwMDIsICAzIH0sCisgICAgeyAweDAwMTEsICA1IH0sIHsgMHgwMDA1LCAgNSB9LCB7IDB4MDAxNSwgIDUgfSwgeyAweDAwMDMsICA2IH0sCisgICAgeyAweDAwM0IsICA2IH0sIHsgMHgwMDQ3LCAgOCB9LCB7IDB4MDBDNywgIDggfSwgeyAweDAwMTcsICA4IH0sCisgICAgeyAweDAwRDcsICA4IH0sIHsgMHgwMDc3LCAgOCB9LCB7IDB4MDEwRiwgIDkgfSwgeyAweDAwNEYsICA5IH0sCisgICAgeyAweDAxQ0YsICA5IH0sIHsgMHgwMEFGLCAgOSB9LCB7IDB4MDE2RiwgIDkgfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1aW50OF90IGlyMl9sdW1hX3RhYmxlWzI1Nl0gPSB7Ci0gMHg4MCwgMHg4MCwgMHg4NCwgMHg4NCwgMHg3QywgMHg3QywgMHg3RiwgMHg4NSwKLSAweDgxLCAweDdCLCAweDg1LCAweDdGLCAweDdCLCAweDgxLCAweDhDLCAweDhDLAotIDB4NzQsIDB4NzQsIDB4ODMsIDB4OEQsIDB4N0QsIDB4NzMsIDB4OEQsIDB4ODMsCi0gMHg3MywgMHg3RCwgMHg3NywgMHg4OSwgMHg4OSwgMHg3NywgMHg4OSwgMHg3NywKLSAweDc3LCAweDg5LCAweDhDLCAweDk1LCAweDc0LCAweDZCLCAweDk1LCAweDhDLAotIDB4NkIsIDB4NzQsIDB4N0MsIDB4OTAsIDB4ODQsIDB4NzAsIDB4OTAsIDB4N0MsCi0gMHg3MCwgMHg4NCwgMHg5NiwgMHg5NiwgMHg2QSwgMHg2QSwgMHg4MiwgMHg5OCwKLSAweDdFLCAweDY4LCAweDk4LCAweDgyLCAweDY4LCAweDdFLCAweDk3LCAweEEyLAotIDB4NjksIDB4NUUsIDB4QTIsIDB4OTcsIDB4NUUsIDB4NjksIDB4QTIsIDB4QTIsCi0gMHg1RSwgMHg1RSwgMHg4QiwgMHhBMywgMHg3NSwgMHg1RCwgMHhBMywgMHg4QiwKLSAweDVELCAweDc1LCAweDcxLCAweDk1LCAweDhGLCAweDZCLCAweDk1LCAweDcxLAotIDB4NkIsIDB4OEYsIDB4NzgsIDB4OUQsIDB4ODgsIDB4NjMsIDB4OUQsIDB4NzgsCi0gMHg2MywgMHg4OCwgMHg3RiwgMHhBNywgMHg4MSwgMHg1OSwgMHhBNywgMHg3RiwKLSAweDU5LCAweDgxLCAweEE0LCAweEIxLCAweDVDLCAweDRGLCAweEIxLCAweEE0LAotIDB4NEYsIDB4NUMsIDB4OTYsIDB4QjEsIDB4NkEsIDB4NEYsIDB4QjEsIDB4OTYsCi0gMHg0RiwgMHg2QSwgMHhCMiwgMHhCMiwgMHg0RSwgMHg0RSwgMHg2NSwgMHg5QiwKLSAweDlCLCAweDY1LCAweDlCLCAweDY1LCAweDY1LCAweDlCLCAweDg5LCAweEI0LAotIDB4NzcsIDB4NEMsIDB4QjQsIDB4ODksIDB4NEMsIDB4NzcsIDB4NkEsIDB4QTMsCi0gMHg5NiwgMHg1RCwgMHhBMywgMHg2QSwgMHg1RCwgMHg5NiwgMHg3MywgMHhBQywKLSAweDhELCAweDU0LCAweEFDLCAweDczLCAweDU0LCAweDhELCAweEI0LCAweEMzLAotIDB4NEMsIDB4M0QsIDB4QzMsIDB4QjQsIDB4M0QsIDB4NEMsIDB4QTQsIDB4QzMsCi0gMHg1QywgMHgzRCwgMHhDMywgMHhBNCwgMHgzRCwgMHg1QywgMHhDNCwgMHhDNCwKLSAweDNDLCAweDNDLCAweDk2LCAweEM2LCAweDZBLCAweDNBLCAweEM2LCAweDk2LAotIDB4M0EsIDB4NkEsIDB4N0MsIDB4QkEsIDB4ODQsIDB4NDYsIDB4QkEsIDB4N0MsCi0gMHg0NiwgMHg4NCwgMHg1QiwgMHhBQiwgMHhBNSwgMHg1NSwgMHhBQiwgMHg1QiwKLSAweDU1LCAweEE1LCAweDYzLCAweEI0LCAweDlELCAweDRDLCAweEI0LCAweDYzLAotIDB4NEMsIDB4OUQsIDB4ODYsIDB4Q0EsIDB4N0EsIDB4MzYsIDB4Q0EsIDB4ODYsCi0gMHgzNiwgMHg3QSwgMHhCNiwgMHhENywgMHg0QSwgMHgyOSwgMHhENywgMHhCNiwKLSAweDI5LCAweDRBLCAweEM4LCAweEQ3LCAweDM4LCAweDI5LCAweEQ3LCAweEM4LAotIDB4MjksIDB4MzgsIDB4QTQsIDB4RDgsIDB4NUMsIDB4MjgsIDB4RDgsIDB4QTQsCi0gMHgyOCwgMHg1QywgMHg2QywgMHhDMSwgMHg5NCwgMHgzRiwgMHhDMSwgMHg2QywKLSAweDNGLCAweDk0LCAweEQ5LCAweEQ5LCAweDI3LCAweDI3LCAweDgwLCAweDgwCitzdGF0aWMgY29uc3QgdWludDhfdCBpcjJfZGVsdGFfdGFibGVbNF1bMjU2XSA9IHsKKyAgICB7IDB4ODAsIDB4ODAsIDB4ODQsIDB4ODQsIDB4N0MsIDB4N0MsIDB4N0YsIDB4ODUsCisgICAgICAweDgxLCAweDdCLCAweDg1LCAweDdGLCAweDdCLCAweDgxLCAweDhDLCAweDhDLAorICAgICAgMHg3NCwgMHg3NCwgMHg4MywgMHg4RCwgMHg3RCwgMHg3MywgMHg4RCwgMHg4MywKKyAgICAgIDB4NzMsIDB4N0QsIDB4NzcsIDB4ODksIDB4ODksIDB4NzcsIDB4ODksIDB4NzcsCisgICAgICAweDc3LCAweDg5LCAweDhDLCAweDk1LCAweDc0LCAweDZCLCAweDk1LCAweDhDLAorICAgICAgMHg2QiwgMHg3NCwgMHg3QywgMHg5MCwgMHg4NCwgMHg3MCwgMHg5MCwgMHg3QywKKyAgICAgIDB4NzAsIDB4ODQsIDB4OTYsIDB4OTYsIDB4NkEsIDB4NkEsIDB4ODIsIDB4OTgsCisgICAgICAweDdFLCAweDY4LCAweDk4LCAweDgyLCAweDY4LCAweDdFLCAweDk3LCAweEEyLAorICAgICAgMHg2OSwgMHg1RSwgMHhBMiwgMHg5NywgMHg1RSwgMHg2OSwgMHhBMiwgMHhBMiwKKyAgICAgIDB4NUUsIDB4NUUsIDB4OEIsIDB4QTMsIDB4NzUsIDB4NUQsIDB4QTMsIDB4OEIsCisgICAgICAweDVELCAweDc1LCAweDcxLCAweDk1LCAweDhGLCAweDZCLCAweDk1LCAweDcxLAorICAgICAgMHg2QiwgMHg4RiwgMHg3OCwgMHg5RCwgMHg4OCwgMHg2MywgMHg5RCwgMHg3OCwKKyAgICAgIDB4NjMsIDB4ODgsIDB4N0YsIDB4QTcsIDB4ODEsIDB4NTksIDB4QTcsIDB4N0YsCisgICAgICAweDU5LCAweDgxLCAweEE0LCAweEIxLCAweDVDLCAweDRGLCAweEIxLCAweEE0LAorICAgICAgMHg0RiwgMHg1QywgMHg5NiwgMHhCMSwgMHg2QSwgMHg0RiwgMHhCMSwgMHg5NiwKKyAgICAgIDB4NEYsIDB4NkEsIDB4QjIsIDB4QjIsIDB4NEUsIDB4NEUsIDB4NjUsIDB4OUIsCisgICAgICAweDlCLCAweDY1LCAweDlCLCAweDY1LCAweDY1LCAweDlCLCAweDg5LCAweEI0LAorICAgICAgMHg3NywgMHg0QywgMHhCNCwgMHg4OSwgMHg0QywgMHg3NywgMHg2QSwgMHhBMywKKyAgICAgIDB4OTYsIDB4NUQsIDB4QTMsIDB4NkEsIDB4NUQsIDB4OTYsIDB4NzMsIDB4QUMsCisgICAgICAweDhELCAweDU0LCAweEFDLCAweDczLCAweDU0LCAweDhELCAweEI0LCAweEMzLAorICAgICAgMHg0QywgMHgzRCwgMHhDMywgMHhCNCwgMHgzRCwgMHg0QywgMHhBNCwgMHhDMywKKyAgICAgIDB4NUMsIDB4M0QsIDB4QzMsIDB4QTQsIDB4M0QsIDB4NUMsIDB4QzQsIDB4QzQsCisgICAgICAweDNDLCAweDNDLCAweDk2LCAweEM2LCAweDZBLCAweDNBLCAweEM2LCAweDk2LAorICAgICAgMHgzQSwgMHg2QSwgMHg3QywgMHhCQSwgMHg4NCwgMHg0NiwgMHhCQSwgMHg3QywKKyAgICAgIDB4NDYsIDB4ODQsIDB4NUIsIDB4QUIsIDB4QTUsIDB4NTUsIDB4QUIsIDB4NUIsCisgICAgICAweDU1LCAweEE1LCAweDYzLCAweEI0LCAweDlELCAweDRDLCAweEI0LCAweDYzLAorICAgICAgMHg0QywgMHg5RCwgMHg4NiwgMHhDQSwgMHg3QSwgMHgzNiwgMHhDQSwgMHg4NiwKKyAgICAgIDB4MzYsIDB4N0EsIDB4QjYsIDB4RDcsIDB4NEEsIDB4MjksIDB4RDcsIDB4QjYsCisgICAgICAweDI5LCAweDRBLCAweEM4LCAweEQ3LCAweDM4LCAweDI5LCAweEQ3LCAweEM4LAorICAgICAgMHgyOSwgMHgzOCwgMHhBNCwgMHhEOCwgMHg1QywgMHgyOCwgMHhEOCwgMHhBNCwKKyAgICAgIDB4MjgsIDB4NUMsIDB4NkMsIDB4QzEsIDB4OTQsIDB4M0YsIDB4QzEsIDB4NkMsCisgICAgICAweDNGLCAweDk0LCAweEQ5LCAweEQ5LCAweDI3LCAweDI3LCAweDgwLCAweDgwLCB9LAorICAgIHsgMHg4MCwgMHg4MCwgMHg4NSwgMHg4NSwgMHg3QiwgMHg3QiwgMHg3RSwgMHg4NywKKyAgICAgIDB4ODIsIDB4NzksIDB4ODcsIDB4N0UsIDB4NzksIDB4ODIsIDB4OEYsIDB4OEYsCisgICAgICAweDcxLCAweDcxLCAweDg0LCAweDhGLCAweDdDLCAweDcxLCAweDhGLCAweDg0LAorICAgICAgMHg3MSwgMHg3QywgMHg3NSwgMHg4QiwgMHg4QiwgMHg3NSwgMHg4QiwgMHg3NSwKKyAgICAgIDB4NzUsIDB4OEIsIDB4OEUsIDB4OUEsIDB4NzIsIDB4NjYsIDB4OUEsIDB4OEUsCisgICAgICAweDY2LCAweDcyLCAweDdCLCAweDkzLCAweDg1LCAweDZELCAweDkzLCAweDdCLAorICAgICAgMHg2RCwgMHg4NSwgMHg5QiwgMHg5QiwgMHg2NSwgMHg2NSwgMHg4MiwgMHg5RCwKKyAgICAgIDB4N0UsIDB4NjMsIDB4OUQsIDB4ODIsIDB4NjMsIDB4N0UsIDB4OUIsIDB4QTgsCisgICAgICAweDY1LCAweDU4LCAweEE4LCAweDlCLCAweDU4LCAweDY1LCAweEE5LCAweEE5LAorICAgICAgMHg1NywgMHg1NywgMHg4RCwgMHhBQSwgMHg3MywgMHg1NiwgMHhBQSwgMHg4RCwKKyAgICAgIDB4NTYsIDB4NzMsIDB4NkUsIDB4OTksIDB4OTIsIDB4NjcsIDB4OTksIDB4NkUsCisgICAgICAweDY3LCAweDkyLCAweDc2LCAweEEyLCAweDhBLCAweDVFLCAweEEyLCAweDc2LAorICAgICAgMHg1RSwgMHg4QSwgMHg3RiwgMHhBRiwgMHg4MSwgMHg1MSwgMHhBRiwgMHg3RiwKKyAgICAgIDB4NTEsIDB4ODEsIDB4QUIsIDB4QkEsIDB4NTUsIDB4NDYsIDB4QkEsIDB4QUIsCisgICAgICAweDQ2LCAweDU1LCAweDlBLCAweEJCLCAweDY2LCAweDQ1LCAweEJCLCAweDlBLAorICAgICAgMHg0NSwgMHg2NiwgMHhCQiwgMHhCQiwgMHg0NSwgMHg0NSwgMHg2MCwgMHhBMCwKKyAgICAgIDB4QTAsIDB4NjAsIDB4QTAsIDB4NjAsIDB4NjAsIDB4QTAsIDB4OEIsIDB4QkUsCisgICAgICAweDc1LCAweDQyLCAweEJFLCAweDhCLCAweDQyLCAweDc1LCAweDY2LCAweEFBLAorICAgICAgMHg5QSwgMHg1NiwgMHhBQSwgMHg2NiwgMHg1NiwgMHg5QSwgMHg3MCwgMHhCNSwKKyAgICAgIDB4OTAsIDB4NEIsIDB4QjUsIDB4NzAsIDB4NEIsIDB4OTAsIDB4QkUsIDB4Q0YsCisgICAgICAweDQyLCAweDMxLCAweENGLCAweEJFLCAweDMxLCAweDQyLCAweEFCLCAweEQwLAorICAgICAgMHg1NSwgMHgzMCwgMHhEMCwgMHhBQiwgMHgzMCwgMHg1NSwgMHhEMSwgMHhEMSwKKyAgICAgIDB4MkYsIDB4MkYsIDB4OUEsIDB4RDMsIDB4NjYsIDB4MkQsIDB4RDMsIDB4OUEsCisgICAgICAweDJELCAweDY2LCAweDdCLCAweEM1LCAweDg1LCAweDNCLCAweEM1LCAweDdCLAorICAgICAgMHgzQiwgMHg4NSwgMHg1NCwgMHhCNCwgMHhBQywgMHg0QywgMHhCNCwgMHg1NCwKKyAgICAgIDB4NEMsIDB4QUMsIDB4NUUsIDB4QkUsIDB4QTIsIDB4NDIsIDB4QkUsIDB4NUUsCisgICAgICAweDQyLCAweEEyLCAweDg3LCAweEQ4LCAweDc5LCAweDI4LCAweEQ4LCAweDg3LAorICAgICAgMHgyOCwgMHg3OSwgMHhDMCwgMHhFOCwgMHg0MCwgMHgxOCwgMHhFOCwgMHhDMCwKKyAgICAgIDB4MTgsIDB4NDAsIDB4RDUsIDB4RTgsIDB4MkIsIDB4MTgsIDB4RTgsIDB4RDUsCisgICAgICAweDE4LCAweDJCLCAweEFCLCAweEU5LCAweDU1LCAweDE3LCAweEU5LCAweEFCLAorICAgICAgMHgxNywgMHg1NSwgMHg2OCwgMHhDRCwgMHg5OCwgMHgzMywgMHhDRCwgMHg2OCwKKyAgICAgIDB4MzMsIDB4OTgsIDB4RUEsIDB4RUEsIDB4MTYsIDB4MTYsIDB4ODAsIDB4ODAsIH0sCisgICAgeyAweDgwLCAweDgwLCAweDg2LCAweDg2LCAweDdBLCAweDdBLCAweDdFLCAweDg4LAorICAgICAgMHg4MiwgMHg3OCwgMHg4OCwgMHg3RSwgMHg3OCwgMHg4MiwgMHg5MiwgMHg5MiwKKyAgICAgIDB4NkUsIDB4NkUsIDB4ODUsIDB4OTIsIDB4N0IsIDB4NkUsIDB4OTIsIDB4ODUsCisgICAgICAweDZFLCAweDdCLCAweDczLCAweDhELCAweDhELCAweDczLCAweDhELCAweDczLAorICAgICAgMHg3MywgMHg4RCwgMHg5MSwgMHg5RSwgMHg2RiwgMHg2MiwgMHg5RSwgMHg5MSwKKyAgICAgIDB4NjIsIDB4NkYsIDB4NzksIDB4OTcsIDB4ODcsIDB4NjksIDB4OTcsIDB4NzksCisgICAgICAweDY5LCAweDg3LCAweEEwLCAweEEwLCAweDYwLCAweDYwLCAweDgzLCAweEEyLAorICAgICAgMHg3RCwgMHg1RSwgMHhBMiwgMHg4MywgMHg1RSwgMHg3RCwgMHhBMCwgMHhCMCwKKyAgICAgIDB4NjAsIDB4NTAsIDB4QjAsIDB4QTAsIDB4NTAsIDB4NjAsIDB4QjEsIDB4QjEsCisgICAgICAweDRGLCAweDRGLCAweDhGLCAweEIyLCAweDcxLCAweDRFLCAweEIyLCAweDhGLAorICAgICAgMHg0RSwgMHg3MSwgMHg2QiwgMHg5RSwgMHg5NSwgMHg2MiwgMHg5RSwgMHg2QiwKKyAgICAgIDB4NjIsIDB4OTUsIDB4NzQsIDB4QTksIDB4OEMsIDB4NTcsIDB4QTksIDB4NzQsCisgICAgICAweDU3LCAweDhDLCAweDdGLCAweEI4LCAweDgxLCAweDQ4LCAweEI4LCAweDdGLAorICAgICAgMHg0OCwgMHg4MSwgMHhCNCwgMHhDNSwgMHg0QywgMHgzQiwgMHhDNSwgMHhCNCwKKyAgICAgIDB4M0IsIDB4NEMsIDB4OUYsIDB4QzYsIDB4NjEsIDB4M0EsIDB4QzYsIDB4OUYsCisgICAgICAweDNBLCAweDYxLCAweEM2LCAweEM2LCAweDNBLCAweDNBLCAweDU5LCAweEE3LAorICAgICAgMHhBNywgMHg1OSwgMHhBNywgMHg1OSwgMHg1OSwgMHhBNywgMHg4RCwgMHhDQSwKKyAgICAgIDB4NzMsIDB4MzYsIDB4Q0EsIDB4OEQsIDB4MzYsIDB4NzMsIDB4NjEsIDB4QjIsCisgICAgICAweDlGLCAweDRFLCAweEIyLCAweDYxLCAweDRFLCAweDlGLCAweDZELCAweEJGLAorICAgICAgMHg5MywgMHg0MSwgMHhCRiwgMHg2RCwgMHg0MSwgMHg5MywgMHhDQSwgMHhERiwKKyAgICAgIDB4MzYsIDB4MjEsIDB4REYsIDB4Q0EsIDB4MjEsIDB4MzYsIDB4QjMsIDB4REYsCisgICAgICAweDRELCAweDIxLCAweERGLCAweEIzLCAweDIxLCAweDRELCAweEUxLCAweEUxLAorICAgICAgMHgxRiwgMHgxRiwgMHg5RiwgMHhFMywgMHg2MSwgMHgxRCwgMHhFMywgMHg5RiwKKyAgICAgIDB4MUQsIDB4NjEsIDB4N0EsIDB4RDMsIDB4ODYsIDB4MkQsIDB4RDMsIDB4N0EsCisgICAgICAweDJELCAweDg2LCAweDRDLCAweEJFLCAweEI0LCAweDQyLCAweEJFLCAweDRDLAorICAgICAgMHg0MiwgMHhCNCwgMHg1NywgMHhDQSwgMHhBOSwgMHgzNiwgMHhDQSwgMHg1NywKKyAgICAgIDB4MzYsIDB4QTksIDB4ODgsIDB4RTksIDB4NzgsIDB4MTcsIDB4RTksIDB4ODgsCisgICAgICAweDE3LCAweDc4LCAweENDLCAweEZCLCAweDM0LCAweDA1LCAweEZCLCAweENDLAorICAgICAgMHgwNSwgMHgzNCwgMHhFNiwgMHhGQiwgMHgxQSwgMHgwNSwgMHhGQiwgMHhFNiwKKyAgICAgIDB4MDUsIDB4MUEsIDB4QjQsIDB4RkQsIDB4NEMsIDB4MDMsIDB4RkQsIDB4QjQsCisgICAgICAweDAzLCAweDRDLCAweDYzLCAweERDLCAweDlELCAweDI0LCAweERDLCAweDYzLAorICAgICAgMHgyNCwgMHg5RCwgMHhGRSwgMHhGRSwgMHgwMiwgMHgwMiwgMHg4MCwgMHg4MCwgfSwKKyAgICB7IDB4ODAsIDB4ODAsIDB4ODcsIDB4ODcsIDB4NzksIDB4NzksIDB4N0UsIDB4ODksCisgICAgICAweDgyLCAweDc3LCAweDg5LCAweDdFLCAweDc3LCAweDgyLCAweDk1LCAweDk1LAorICAgICAgMHg2QiwgMHg2QiwgMHg4NiwgMHg5NiwgMHg3QSwgMHg2QSwgMHg5NiwgMHg4NiwKKyAgICAgIDB4NkEsIDB4N0EsIDB4NzAsIDB4OTAsIDB4OTAsIDB4NzAsIDB4OTAsIDB4NzAsCisgICAgICAweDcwLCAweDkwLCAweDk0LCAweEE0LCAweDZDLCAweDVDLCAweEE0LCAweDk0LAorICAgICAgMHg1QywgMHg2QywgMHg3OCwgMHg5QiwgMHg4OCwgMHg2NSwgMHg5QiwgMHg3OCwKKyAgICAgIDB4NjUsIDB4ODgsIDB4QTYsIDB4QTYsIDB4NUEsIDB4NUEsIDB4ODMsIDB4QTksCisgICAgICAweDdELCAweDU3LCAweEE5LCAweDgzLCAweDU3LCAweDdELCAweEE2LCAweEI5LAorICAgICAgMHg1QSwgMHg0NywgMHhCOSwgMHhBNiwgMHg0NywgMHg1QSwgMHhCQSwgMHhCQSwKKyAgICAgIDB4NDYsIDB4NDYsIDB4OTIsIDB4QkMsIDB4NkUsIDB4NDQsIDB4QkMsIDB4OTIsCisgICAgICAweDQ0LCAweDZFLCAweDY3LCAweEEzLCAweDk5LCAweDVELCAweEEzLCAweDY3LAorICAgICAgMHg1RCwgMHg5OSwgMHg3MiwgMHhCMCwgMHg4RSwgMHg1MCwgMHhCMCwgMHg3MiwKKyAgICAgIDB4NTAsIDB4OEUsIDB4N0YsIDB4QzMsIDB4ODEsIDB4M0QsIDB4QzMsIDB4N0YsCisgICAgICAweDNELCAweDgxLCAweEJFLCAweEQyLCAweDQyLCAweDJFLCAweEQyLCAweEJFLAorICAgICAgMHgyRSwgMHg0MiwgMHhBNSwgMHhENCwgMHg1QiwgMHgyQywgMHhENCwgMHhBNSwKKyAgICAgIDB4MkMsIDB4NUIsIDB4RDQsIDB4RDQsIDB4MkMsIDB4MkMsIDB4NTIsIDB4QUUsCisgICAgICAweEFFLCAweDUyLCAweEFFLCAweDUyLCAweDUyLCAweEFFLCAweDhGLCAweEQ4LAorICAgICAgMHg3MSwgMHgyOCwgMHhEOCwgMHg4RiwgMHgyOCwgMHg3MSwgMHg1QiwgMHhCQiwKKyAgICAgIDB4QTUsIDB4NDUsIDB4QkIsIDB4NUIsIDB4NDUsIDB4QTUsIDB4NjksIDB4Q0IsCisgICAgICAweDk3LCAweDM1LCAweENCLCAweDY5LCAweDM1LCAweDk3LCAweEQ4LCAweEYwLAorICAgICAgMHgyOCwgMHgxMCwgMHhGMCwgMHhEOCwgMHgxMCwgMHgyOCwgMHhCRCwgMHhGMSwKKyAgICAgIDB4NDMsIDB4MEYsIDB4RjEsIDB4QkQsIDB4MEYsIDB4NDMsIDB4RjMsIDB4RjMsCisgICAgICAweDBELCAweDBELCAweEE1LCAweEY2LCAweDVCLCAweDBBLCAweEY2LCAweEE1LAorICAgICAgMHgwQSwgMHg1QiwgMHg3OCwgMHhFMiwgMHg4OCwgMHgxRSwgMHhFMiwgMHg3OCwKKyAgICAgIDB4MUUsIDB4ODgsIDB4NDIsIDB4QzksIDB4QkUsIDB4MzcsIDB4QzksIDB4NDIsCisgICAgICAweDM3LCAweEJFLCAweDRGLCAweEQ4LCAweEIxLCAweDI4LCAweEQ4LCAweDRGLAorICAgICAgMHgyOCwgMHhCMSwgMHg4QSwgMHhGRCwgMHg3NiwgMHgwMywgMHhGRCwgMHg4QSwKKyAgICAgIDB4MDMsIDB4NzYsIDB4REIsIDB4RkYsIDB4MjUsIDB4MDEsIDB4RkYsIDB4REIsCisgICAgICAweDAxLCAweDI1LCAweEY5LCAweEZGLCAweDA3LCAweDAxLCAweEZGLCAweEY5LAorICAgICAgMHgwMSwgMHgwNywgMHhCRSwgMHhGRiwgMHg0MiwgMHgwMSwgMHhGRiwgMHhCRSwKKyAgICAgIDB4MDEsIDB4NDIsIDB4NUUsIDB4RUQsIDB4QTIsIDB4MTMsIDB4RUQsIDB4NUUsCisgICAgICAweDEzLCAweEEyLCAweEZGLCAweEZGLCAweDAxLCAweDAxLCAweDgwLCAweDgwLCB9LAogfTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfSU5ERU8yREFUQV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2luZGVvMy5jIGIvbGliYXZjb2RlYy9pbmRlbzMuYwppbmRleCAzZjMxOTQ2Li43MWQ0NzhjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2luZGVvMy5jCisrKyBiL2xpYmF2Y29kZWMvaW5kZW8zLmMKQEAgLTUzLDcgKzUzLDcgQEAKIAogCiAvKiBTb21lIGNvbnN0YW50cyBmb3IgcGFyc2luZyBmcmFtZSBiaXRzdHJlYW0gZmxhZ3MuICovCi0jZGVmaW5lIEJTXzhCSVRfUEVMICAgICAoMSA8PCAxKSAvLy88IDhiaXQgcGl4ZWwgYml0ZGVwdGggaW5kaWNhdG9yCisjZGVmaW5lIEJTXzhCSVRfUEVMICAgICAoMSA8PCAxKSAvLy88IDgtYml0IHBpeGVsIGJpdGRlcHRoIGluZGljYXRvcgogI2RlZmluZSBCU19LRVlGUkFNRSAgICAgKDEgPDwgMikgLy8vPCBpbnRyYSBmcmFtZSBpbmRpY2F0b3IKICNkZWZpbmUgQlNfTVZfWV9IQUxGICAgICgxIDw8IDQpIC8vLzwgdmVydGljYWwgbXYgaGFsZnBlbCByZXNvbHV0aW9uIGluZGljYXRvcgogI2RlZmluZSBCU19NVl9YX0hBTEYgICAgKDEgPDwgNSkgLy8vPCBob3Jpem9udGFsIG12IGhhbGZwZWwgcmVzb2x1dGlvbiBpbmRpY2F0b3IKQEAgLTY2LDcgKzY2LDcgQEAKICAgICB1aW50OF90ICAgICAgICAgKnBpeGVsc1syXTsgLy8vPCBwb2ludGVyIHRvIHRoZSBhY3R1YWwgcGl4ZWwgZGF0YSBvZiB0aGUgYnVmZmVycyBhYm92ZQogICAgIHVpbnQzMl90ICAgICAgICB3aWR0aDsKICAgICB1aW50MzJfdCAgICAgICAgaGVpZ2h0OwotICAgIHVpbnQzMl90ICAgICAgICBwaXRjaDsKKyAgICBwdHJkaWZmX3QgICAgICAgcGl0Y2g7CiB9IFBsYW5lOwogCiAjZGVmaW5lIENFTExfU1RBQ0tfTUFYICAyMApAQCAtMTY2LDcgKzE2Niw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBsdW1hX3dpZHRoLCBpbnQgbHVtYV9oZWlnaHQpCiB7CiAgICAgaW50IHAsIGNocm9tYV93aWR0aCwgY2hyb21hX2hlaWdodDsKLSAgICBpbnQgbHVtYV9waXRjaCwgY2hyb21hX3BpdGNoLCBsdW1hX3NpemUsIGNocm9tYV9zaXplOworICAgIGludCBsdW1hX3NpemUsIGNocm9tYV9zaXplOworICAgIHB0cmRpZmZfdCBsdW1hX3BpdGNoLCBjaHJvbWFfcGl0Y2g7CiAKICAgICBpZiAobHVtYV93aWR0aCAgPCAxNiB8fCBsdW1hX3dpZHRoICA+IDY0MCB8fAogICAgICAgICBsdW1hX2hlaWdodCA8IDE2IHx8IGx1bWFfaGVpZ2h0ID4gNDgwIHx8CkBAIC0zMTcsNyArMzE4LDcgQEAKIH0KIAogCi0vKiBGaWxsIG4gbGluZXMgd2l0aCA2NGJpdCBwaXhlbCB2YWx1ZSBwaXggKi8KKy8qIEZpbGwgbiBsaW5lcyB3aXRoIDY0LWJpdCBwaXhlbCB2YWx1ZSBwaXggKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsXzY0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDY0X3QgcGl4LCBpbnQzMl90IG4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19vZmZzZXQpCiB7CkBAIC00MjUsNyArNDI2LDcgQEAKIAogc3RhdGljIGludCBkZWNvZGVfY2VsbF9kYXRhKEluZGVvM0RlY29kZUNvbnRleHQgKmN0eCwgQ2VsbCAqY2VsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpibG9jaywgdWludDhfdCAqcmVmX2Jsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgaW50IGhfem9vbSwgaW50IHZfem9vbSwgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHJvd19vZmZzZXQsIGludCBoX3pvb20sIGludCB2X3pvb20sIGludCBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZxRW50cnkgKmRlbHRhWzJdLCBpbnQgc3dhcF9xdWFkc1syXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqZGF0YV9wdHIsIGNvbnN0IHVpbnQ4X3QgKmxhc3RfcHRyKQogewpAQCAtNDM2LDkgKzQzNyw4IEBACiAgICAgdW5zaWduZWQgaW50ICBkeWFkMSwgZHlhZDI7CiAgICAgdWludDY0X3QgICAgICBwaXg2NDsKICAgICBpbnQgICAgICAgICAgIHNraXBfZmxhZyA9IDAsIGlzX3RvcF9vZl9jZWxsLCBpc19maXJzdF9yb3cgPSAxOwotICAgIGludCAgICAgICAgICAgcm93X29mZnNldCwgYmxrX3Jvd19vZmZzZXQsIGxpbmVfb2Zmc2V0OworICAgIGludCAgICAgICAgICAgYmxrX3Jvd19vZmZzZXQsIGxpbmVfb2Zmc2V0OwogCi0gICAgcm93X29mZnNldCAgICAgPSAgcGl0Y2g7CiAgICAgYmxrX3Jvd19vZmZzZXQgPSAocm93X29mZnNldCA8PCAoMiArIHZfem9vbSkpIC0gKGNlbGwtPndpZHRoIDw8IDIpOwogICAgIGxpbmVfb2Zmc2V0ICAgID0gdl96b29tID8gcm93X29mZnNldCA6IDA7CiAKQEAgLTEwMjUsMTEgKzEwMjUsMTEgQEAKICAqICBAcGFyYW1baW5dICBkc3RfaGVpZ2h0ICAgb3V0cHV0IHBsYW5lIGhlaWdodAogICovCiBzdGF0aWMgdm9pZCBvdXRwdXRfcGxhbmUoY29uc3QgUGxhbmUgKnBsYW5lLCBpbnQgYnVmX3NlbCwgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfcGl0Y2gsIGludCBkc3RfaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkc3RfcGl0Y2gsIGludCBkc3RfaGVpZ2h0KQogewogICAgIGludCAgICAgICAgICAgICB4LHk7CiAgICAgY29uc3QgdWludDhfdCAgICpzcmMgID0gcGxhbmUtPnBpeGVsc1tidWZfc2VsXTsKLSAgICB1aW50MzJfdCAgICAgICAgcGl0Y2ggPSBwbGFuZS0+cGl0Y2g7CisgICAgcHRyZGlmZl90ICAgICAgIHBpdGNoID0gcGxhbmUtPnBpdGNoOwogCiAgICAgZHN0X2hlaWdodCA9IEZGTUlOKGRzdF9oZWlnaHQsIHBsYW5lLT5oZWlnaHQpOwogICAgIGZvciAoeSA9IDA7IHkgPCBkc3RfaGVpZ2h0OyB5KyspIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaW5kZW8zZGF0YS5oIGIvbGliYXZjb2RlYy9pbmRlbzNkYXRhLmgKaW5kZXggZmU4ZjBiYS4uZmJlNzZhZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pbmRlbzNkYXRhLmgKKysrIGIvbGliYXZjb2RlYy9pbmRlbzNkYXRhLmgKQEAgLTIzNCw3ICsyMzQsNyBAQAogCiAKIC8qKgotICogUGFjayB0d28gZGVsdGEgdmFsdWVzIChhLGIpIGludG8gb25lIDE2Yml0IHdvcmQKKyAqIFBhY2sgdHdvIGRlbHRhIHZhbHVlcyAoYSxiKSBpbnRvIG9uZSAxNi1iaXQgd29yZAogICogYWNjb3JkaW5nIHdpdGggZW5kaWFubmVzcyBvZiB0aGUgaG9zdCBtYWNoaW5lLgogICovCiAjaWYgSEFWRV9CSUdFTkRJQU4KQEAgLTI4MSw3ICsyODEsNyBAQAogI3VuZGVmIFBECiAKIC8qKgotICogUGFjayBmb3VyIGRlbHRhIHZhbHVlcyAoYSxhLGIsYikgaW50byBvbmUgMzJiaXQgd29yZAorICogUGFjayBmb3VyIGRlbHRhIHZhbHVlcyAoYSxhLGIsYikgaW50byBvbmUgMzItYml0IHdvcmQKICAqIGFjY29yZGluZyB3aXRoIGVuZGlhbm5lc3Mgb2YgdGhlIGhvc3QgbWFjaGluZS4KICAqLwogI2lmIEhBVkVfQklHRU5ESUFOCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2luZGVvNC5jIGIvbGliYXZjb2RlYy9pbmRlbzQuYwppbmRleCAwMDY1YjUyLi40YmZjNmNkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2luZGVvNC5jCisrKyBiL2xpYmF2Y29kZWMvaW5kZW80LmMKQEAgLTMwLDEwICszMCwxMSBAQAogI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCi0jaW5jbHVkZSAiaXZpLmgiCi0jaW5jbHVkZSAiaXZpX2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImluZGVvNGRhdGEuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIml2aS5oIgorI2luY2x1ZGUgIml2aV9kc3AuaCIKIAogI2RlZmluZSBJVkk0X1BJQ19TSVpFX0VTQyAgIDcKIApAQCAtMTE5LDE3ICsxMjAsMTAgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0jaWYgSVZJNF9TVFJFQU1fQU5BTFlTRVIKICAgICBpZiAoY3R4LT5mcmFtZV90eXBlID09IElWSTRfRlJBTUVUWVBFX0JJRElSKQogICAgICAgICBjdHgtPmhhc19iX2ZyYW1lcyA9IDE7Ci0jZW5kaWYKIAotICAgIGN0eC0+dHJhbnNwX3N0YXR1cyA9IGdldF9iaXRzMSgmY3R4LT5nYik7Ci0jaWYgSVZJNF9TVFJFQU1fQU5BTFlTRVIKLSAgICBpZiAoY3R4LT50cmFuc3Bfc3RhdHVzKSB7Ci0gICAgICAgIGN0eC0+aGFzX3RyYW5zcCA9IDE7Ci0gICAgfQotI2VuZGlmCisgICAgY3R4LT5oYXNfdHJhbnNwID0gZ2V0X2JpdHMxKCZjdHgtPmdiKTsKIAogICAgIC8qIHVua25vd24gYml0OiBNYWMgZGVjb2RlciBpZ25vcmVzIHRoaXMgYml0LCBYQU5JTSByZXR1cm5zIGVycm9yICovCiAgICAgaWYgKGdldF9iaXRzMSgmY3R4LT5nYikpIHsKQEAgLTE2MywxMiArMTU3LDEwIEBACiAgICAgfQogCiAgICAgLyogRGVjb2RlIHRpbGUgZGltZW5zaW9ucy4gKi8KLSAgICBpZiAoZ2V0X2JpdHMxKCZjdHgtPmdiKSkgeworICAgIGN0eC0+dXNlc190aWxpbmcgPSBnZXRfYml0czEoJmN0eC0+Z2IpOworICAgIGlmIChjdHgtPnVzZXNfdGlsaW5nKSB7CiAgICAgICAgIHBpY19jb25mLnRpbGVfaGVpZ2h0ID0gc2NhbGVfdGlsZV9zaXplKHBpY19jb25mLnBpY19oZWlnaHQsIGdldF9iaXRzKCZjdHgtPmdiLCA0KSk7CiAgICAgICAgIHBpY19jb25mLnRpbGVfd2lkdGggID0gc2NhbGVfdGlsZV9zaXplKHBpY19jb25mLnBpY193aWR0aCwgIGdldF9iaXRzKCZjdHgtPmdiLCA0KSk7Ci0jaWYgSVZJNF9TVFJFQU1fQU5BTFlTRVIKLSAgICAgICAgY3R4LT51c2VzX3RpbGluZyA9IDE7Ci0jZW5kaWYKICAgICB9IGVsc2UgewogICAgICAgICBwaWNfY29uZi50aWxlX2hlaWdodCA9IHBpY19jb25mLnBpY19oZWlnaHQ7CiAgICAgICAgIHBpY19jb25mLnRpbGVfd2lkdGggID0gcGljX2NvbmYucGljX3dpZHRoOwpAQCAtMTg3LDYgKzE3OSwxMyBAQAogICAgIHBpY19jb25mLmNocm9tYV9iYW5kcyA9IDA7CiAgICAgaWYgKHBpY19jb25mLmx1bWFfYmFuZHMpCiAgICAgICAgIHBpY19jb25mLmNocm9tYV9iYW5kcyA9IGRlY29kZV9wbGFuZV9zdWJkaXZpc2lvbigmY3R4LT5nYik7CisKKyAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZTIocGljX2NvbmYucGljX3dpZHRoLCBwaWNfY29uZi5waWNfaGVpZ2h0LCBhdmN0eC0+bWF4X3BpeGVscywgQVZfUElYX0ZNVF9ZVVY0MTBQLCAwLCBhdmN0eCkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGljdHVyZSBkaW1lbnNpb25zICVkICVkIGNhbm5vdCBiZSBkZWNvZGVkXG4iLAorICAgICAgICAgICAgICAgcGljX2NvbmYucGljX3dpZHRoLCBwaWNfY29uZi5waWNfaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCiAgICAgY3R4LT5pc19zY2FsYWJsZSA9IHBpY19jb25mLmx1bWFfYmFuZHMgIT0gMSB8fCBwaWNfY29uZi5jaHJvbWFfYmFuZHMgIT0gMTsKICAgICBpZiAoY3R4LT5pc19zY2FsYWJsZSAmJiAocGljX2NvbmYubHVtYV9iYW5kcyAhPSA0IHx8IHBpY19jb25mLmNocm9tYV9iYW5kcyAhPSAxKSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNjYWxhYmlsaXR5OiB1bnN1cHBvcnRlZCBzdWJkaXZpc2lvbiEgTHVtYSBiYW5kczogJWQsIGNocm9tYSBiYW5kczogJWRcbiIsCkBAIC0xOTYsNyArMTk1LDcgQEAKIAogICAgIC8qIGNoZWNrIGlmIHBpY3R1cmUgbGF5b3V0IHdhcyBjaGFuZ2VkIGFuZCByZWFsbG9jYXRlIGJ1ZmZlcnMgKi8KICAgICBpZiAoaXZpX3BpY19jb25maWdfY21wKCZwaWNfY29uZiwgJmN0eC0+cGljX2NvbmYpKSB7Ci0gICAgICAgIGlmIChmZl9pdmlfaW5pdF9wbGFuZXMoY3R4LT5wbGFuZXMsICZwaWNfY29uZiwgMSkpIHsKKyAgICAgICAgaWYgKGZmX2l2aV9pbml0X3BsYW5lcyhhdmN0eCwgY3R4LT5wbGFuZXMsICZwaWNfY29uZiwgMSkpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGRuJ3QgcmVhbGxvY2F0ZSBjb2xvciBwbGFuZXMhXG4iKTsKICAgICAgICAgICAgIGN0eC0+cGljX2NvbmYubHVtYV9iYW5kcyA9IDA7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpAQCAtMjQ2LDYgKzI0NSw4IEBACiAgICAgLyogc2tpcCBwaWN0dXJlIGhlYWRlciBleHRlbnNpb24gaWYgYW55ICovCiAgICAgd2hpbGUgKGdldF9iaXRzMSgmY3R4LT5nYikpIHsKICAgICAgICAgZmZfZGxvZyhhdmN0eCwgIlBpYyBoZHIgZXh0ZW5zaW9uIGVuY291bnRlcmVkIVxuIik7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZjdHgtPmdiKSA8IDEwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIHNraXBfYml0cygmY3R4LT5nYiwgOCk7CiAgICAgfQogCkBAIC0yNjcsMTIgKzI2OCwxNCBAQAogICogIEBwYXJhbVtpbl0gICAgIGF2Y3R4ICAgICBwb2ludGVyIHRvIHRoZSBBVkNvZGVjQ29udGV4dAogICogIEByZXR1cm4gICAgICAgIHJlc3VsdCBjb2RlOiAwID0gT0ssIG5lZ2F0aXZlIG51bWJlciA9IGVycm9yCiAgKi8KLXN0YXRpYyBpbnQgZGVjb2RlX2JhbmRfaGRyKElWSTQ1RGVjQ29udGV4dCAqY3R4LCBJVklCYW5kRGVzYyAqYmFuZCwKK3N0YXRpYyBpbnQgZGVjb2RlX2JhbmRfaGRyKElWSTQ1RGVjQ29udGV4dCAqY3R4LCBJVklCYW5kRGVzYyAqYXJnX2JhbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgaW50IHBsYW5lLCBiYW5kX251bSwgaW5keCwgdHJhbnNmb3JtX2lkLCBzY2FuX2luZHg7CiAgICAgaW50IGk7CiAgICAgaW50IHF1YW50X21hdDsKKyAgICBJVklCYW5kRGVzYyB0ZW1wX2JhbmQsICpiYW5kID0gJnRlbXBfYmFuZDsKKyAgICBtZW1jcHkoJnRlbXBfYmFuZCwgYXJnX2JhbmQsIHNpemVvZih0ZW1wX2JhbmQpKTsKIAogICAgIHBsYW5lICAgID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDIpOwogICAgIGJhbmRfbnVtID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDQpOwpAQCAtMjk1LDEwICsyOTgsOCBAQAogICAgICAgICAgICAgICAgICAgIGJhbmQtPmlzX2hhbGZwZWwpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KLSNpZiBJVkk0X1NUUkVBTV9BTkFMWVNFUgogICAgICAgICBpZiAoIWJhbmQtPmlzX2hhbGZwZWwpCiAgICAgICAgICAgICBjdHgtPnVzZXNfZnVsbHBlbCA9IDE7Ci0jZW5kaWYKIAogICAgICAgICBiYW5kLT5jaGVja3N1bV9wcmVzZW50ID0gZ2V0X2JpdHMxKCZjdHgtPmdiKTsKICAgICAgICAgaWYgKGJhbmQtPmNoZWNrc3VtX3ByZXNlbnQpCkBAIC0zMzQsMTAgKzMzNSw4IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ3cm9uZyB0cmFuc2Zvcm0gc2l6ZSFcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQotI2lmIElWSTRfU1RSRUFNX0FOQUxZU0VSCiAgICAgICAgICAgICBpZiAoKHRyYW5zZm9ybV9pZCA+PSAwICYmIHRyYW5zZm9ybV9pZCA8PSAyKSB8fCB0cmFuc2Zvcm1faWQgPT0gMTApCiAgICAgICAgICAgICAgICAgY3R4LT51c2VzX2hhYXIgPSAxOwotI2VuZGlmCiAKICAgICAgICAgICAgIGJhbmQtPmludl90cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zW3RyYW5zZm9ybV9pZF0uaW52X3RyYW5zOwogICAgICAgICAgICAgYmFuZC0+ZGNfdHJhbnNmb3JtICA9IHRyYW5zZm9ybXNbdHJhbnNmb3JtX2lkXS5kY190cmFuczsKQEAgLTQwNiwxMCArNDA1LDEwIEBACiAKICAgICAgICAgLyogZGVjb2RlIGJsb2NrIGh1ZmZtYW4gY29kZWJvb2sgKi8KICAgICAgICAgaWYgKCFnZXRfYml0czEoJmN0eC0+Z2IpKQotICAgICAgICAgICAgYmFuZC0+YmxrX3ZsYy50YWIgPSBjdHgtPmJsa192bGMudGFiOworICAgICAgICAgICAgYXJnX2JhbmQtPmJsa192bGMudGFiID0gY3R4LT5ibGtfdmxjLnRhYjsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgaWYgKGZmX2l2aV9kZWNfaHVmZl9kZXNjKCZjdHgtPmdiLCAxLCBJVklfQkxLX0hVRkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhbmQtPmJsa192bGMsIGF2Y3R4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXJnX2JhbmQtPmJsa192bGMsIGF2Y3R4KSkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgICAgICAvKiBzZWxlY3QgYXBwcm9wcmlhdGUgcnZtYXAgdGFibGUgZm9yIHRoaXMgYmFuZCAqLwpAQCAtNDUwLDYgKzQ0OSw5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAorICAgIGJhbmQtPmJsa192bGMgPSBhcmdfYmFuZC0+YmxrX3ZsYzsKKyAgICBtZW1jcHkoYXJnX2JhbmQsIGJhbmQsIHNpemVvZigqYXJnX2JhbmQpKTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC00OTgsNiArNTAwLDExIEBACiAgICAgICAgICAgICBtYi0+Yl9tdl94ICAgPQogICAgICAgICAgICAgbWItPmJfbXZfeSAgID0gMDsKIAorICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmN0eC0+Z2IpIDwgMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGlucHV0IGZvciBtYiBpbmZvXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmY3R4LT5nYikpIHsKICAgICAgICAgICAgICAgICBpZiAoY3R4LT5mcmFtZV90eXBlID09IElWSTRfRlJBTUVUWVBFX0lOVFJBKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRW1wdHkgbWFjcm9ibG9jayBpbiBhbiBJTlRSQSBwaWN0dXJlIVxuIik7CkBAIC02ODMsNiArNjkwLDcgQEAKICAgICBjdHgtPmlzX25vbm51bGxfZnJhbWUgPSBpc19ub25udWxsX2ZyYW1lOwogCiAgICAgY3R4LT5pc19pbmRlbzQgPSAxOworICAgIGN0eC0+c2hvd19pbmRlbzRfaW5mbyA9IDE7CiAKICAgICBjdHgtPmRzdF9idWYgICA9IDA7CiAgICAgY3R4LT5yZWZfYnVmICAgPSAxOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pbmRlbzUuYyBiL2xpYmF2Y29kZWMvaW5kZW81LmMKaW5kZXggNWY5MzFjOC4uYjM5Y2ZmZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pbmRlbzUuYworKysgYi9saWJhdmNvZGVjL2luZGVvNS5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAogICAgIC8qIGNoZWNrIGlmIHBpY3R1cmUgbGF5b3V0IHdhcyBjaGFuZ2VkIGFuZCByZWFsbG9jYXRlIGJ1ZmZlcnMgKi8KICAgICBpZiAoaXZpX3BpY19jb25maWdfY21wKCZwaWNfY29uZiwgJmN0eC0+cGljX2NvbmYpIHx8IGN0eC0+Z29wX2ludmFsaWQpIHsKLSAgICAgICAgcmVzdWx0ID0gZmZfaXZpX2luaXRfcGxhbmVzKGN0eC0+cGxhbmVzLCAmcGljX2NvbmYsIDApOworICAgICAgICByZXN1bHQgPSBmZl9pdmlfaW5pdF9wbGFuZXMoYXZjdHgsIGN0eC0+cGxhbmVzLCAmcGljX2NvbmYsIDApOwogICAgICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCByZWFsbG9jYXRlIGNvbG9yIHBsYW5lcyFcbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTMyNCw2ICszMjQsNyBAQAogICAgIGN0eC0+ZnJhbWVfdHlwZSAgICAgID0gZ2V0X2JpdHMoJmN0eC0+Z2IsIDMpOwogICAgIGlmIChjdHgtPmZyYW1lX3R5cGUgPj0gNSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgdHlwZTogJWQgXG4iLCBjdHgtPmZyYW1lX3R5cGUpOworICAgICAgICBjdHgtPmZyYW1lX3R5cGUgPSBGUkFNRVRZUEVfSU5UUkE7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIApAQCAtNjU3LDcgKzY1OCw3IEBACiAgICAgY3R4LT5waWNfY29uZi50aWxlX2hlaWdodCAgID0gYXZjdHgtPmhlaWdodDsKICAgICBjdHgtPnBpY19jb25mLmx1bWFfYmFuZHMgICAgPSBjdHgtPnBpY19jb25mLmNocm9tYV9iYW5kcyA9IDE7CiAKLSAgICByZXN1bHQgPSBmZl9pdmlfaW5pdF9wbGFuZXMoY3R4LT5wbGFuZXMsICZjdHgtPnBpY19jb25mLCAwKTsKKyAgICByZXN1bHQgPSBmZl9pdmlfaW5pdF9wbGFuZXMoYXZjdHgsIGN0eC0+cGxhbmVzLCAmY3R4LT5waWNfY29uZiwgMCk7CiAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkbid0IGFsbG9jYXRlIGNvbG9yIHBsYW5lcyFcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaW50ZWxoMjYzZGVjLmMgYi9saWJhdmNvZGVjL2ludGVsaDI2M2RlYy5jCmluZGV4IGZlOGQxODUuLmQzMjFkZDQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaW50ZWxoMjYzZGVjLmMKKysrIGIvbGliYXZjb2RlYy9pbnRlbGgyNjNkZWMuYwpAQCAtMzksMTIgKzM5LDEyIEBACiAgICAgfQogICAgIHMtPnBpY3R1cmVfbnVtYmVyID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsgLyogcGljdHVyZSB0aW1lc3RhbXAgKi8KIAotICAgIGlmIChjaGVja19tYXJrZXIoJnMtPmdiLCAiYWZ0ZXIgcGljdHVyZV9udW1iZXIiKSAhPSAxKSB7CisgICAgaWYgKGNoZWNrX21hcmtlcihzLT5hdmN0eCwgJnMtPmdiLCAiYWZ0ZXIgcGljdHVyZV9udW1iZXIiKSAhPSAxKSB7CiAgICAgICAgIHJldHVybiAtMTsgICAgICAvKiBtYXJrZXIgKi8KICAgICB9CiAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpICE9IDApIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYWQgSDI2MyBpZFxuIik7Ci0gICAgICAgIHJldHVybiAtMTsgICAgICAvKiBoMjYzIGlkICovCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmFkIEguMjYzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8qIEguMjYzIGlkICovCiAgICAgfQogICAgIHNraXBfYml0czEoJnMtPmdiKTsgICAgICAgICAvKiBzcGxpdCBzY3JlZW4gb2ZmICovCiAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAgICAgICAgIC8qIGNhbWVyYSAgb2ZmICovCkBAIC01Miw3ICs1Miw3IEBACiAKICAgICBmb3JtYXQgPSBnZXRfYml0cygmcy0+Z2IsIDMpOwogICAgIGlmIChmb3JtYXQgPT0gMCB8fCBmb3JtYXQgPT0gNikgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludGVsIEgyNjMgZnJlZSBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW50ZWwgSC4yNjMgZnJlZSBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcy0+aDI2M19wbHVzID0gMDsKQEAgLTc3LDcgKzc3LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBmb3JtYXQgPSBnZXRfYml0cygmcy0+Z2IsIDMpOwogICAgICAgICBpZihmb3JtYXQgPT0gMCB8fCBmb3JtYXQgPT0gNyl7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIldyb25nIEludGVsIEgyNjMgZm9ybWF0XG4iKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiV3JvbmcgSW50ZWwgSC4yNjMgZm9ybWF0XG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgICAgICBpZihnZXRfYml0cygmcy0+Z2IsIDIpKQpAQCAtOTUsNyArOTUsNyBAQAogICAgIGlmKGZvcm1hdCA9PSA2KXsKICAgICAgICAgaW50IGFyID0gZ2V0X2JpdHMoJnMtPmdiLCA0KTsKICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgOSk7IC8vIGRpc3BsYXkgd2lkdGgKLSAgICAgICAgY2hlY2tfbWFya2VyKCZzLT5nYiwgImluIGRpbWVuc2lvbnMiKTsKKyAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCAmcy0+Z2IsICJpbiBkaW1lbnNpb25zIik7CiAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDkpOyAvLyBkaXNwbGF5IGhlaWdodAogICAgICAgICBpZihhciA9PSAxNSl7CiAgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBnZXRfYml0cygmcy0+Z2IsIDgpOyAvLyBhc3BlY3QgcmF0aW8gLSB3aWR0aApAQCAtMTM4LDYgKzEzOCw3IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICA9IGZmX2gyNjNfZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9TS0lQX0ZSQU1FX0ZJTExfUEFSQU0sCiAgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ludGVybmFsLmggYi9saWJhdmNvZGVjL2ludGVybmFsLmgKaW5kZXggMjRkMzIwYy4uYmI5Mjg3MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pbnRlcm5hbC5oCisrKyBiL2xpYmF2Y29kZWMvaW50ZXJuYWwuaApAQCAtNDgsOCArNDgsOCBAQAogI2RlZmluZSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQICAgICAgICAgICAoMSA8PCAxKQogLyoqCiAgKiBEZWNvZGVycyBtYXJrZWQgd2l0aCBGRl9DT0RFQ19DQVBfU0VUU19QS1RfRFRTIHdhbnQgdG8gc2V0Ci0gKiBBVkZyYW1lLnBrdF9kdHMgbWFudWFsbHkuIElmIHRoZSBmbGFnIGlzIHNldCwgdXRpbHMuYyB3b24ndCBvdmVyd3JpdGUKLSAqIHRoaXMgZmllbGQuIElmIGl0J3MgdW5zZXQsIHV0aWxzLmMgdHJpZXMgdG8gZ3Vlc3MgdGhlIHBrdF9kdHMgZmllbGQKKyAqIEFWRnJhbWUucGt0X2R0cyBtYW51YWxseS4gSWYgdGhlIGZsYWcgaXMgc2V0LCBkZWNvZGUuYyB3b24ndCBvdmVyd3JpdGUKKyAqIHRoaXMgZmllbGQuIElmIGl0J3MgdW5zZXQsIGRlY29kZS5jIHRyaWVzIHRvIGd1ZXNzIHRoZSBwa3RfZHRzIGZpZWxkCiAgKiBmcm9tIHRoZSBpbnB1dCBBVlBhY2tldC4KICAqLwogI2RlZmluZSBGRl9DT0RFQ19DQVBfU0VUU19QS1RfRFRTICAgICAgICAgICAoMSA8PCAyKQpAQCAtNTgsNiArNTgsMTYgQEAKICAqIHNraXBwZWQgZHVlIHRvIHRoZSBza2lwX2ZyYW1lIHNldHRpbmcuCiAgKi8KICNkZWZpbmUgRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSAgKDEgPDwgMykKKy8qKgorICogVGhlIGRlY29kZXIgc2V0cyB0aGUgY3JvcHBpbmcgZmllbGRzIGluIHRoZSBvdXRwdXQgZnJhbWVzIG1hbnVhbGx5LgorICogSWYgdGhpcyBjYXAgaXMgc2V0LCB0aGUgZ2VuZXJpYyBjb2RlIHdpbGwgaW5pdGlhbGl6ZSBvdXRwdXQgZnJhbWUKKyAqIGRpbWVuc2lvbnMgdG8gY29kZWQgcmF0aGVyIHRoYW4gZGlzcGxheSB2YWx1ZXMuCisgKi8KKyNkZWZpbmUgRkZfQ09ERUNfQ0FQX0VYUE9SVFNfQ1JPUFBJTkcgICAgICAgKDEgPDwgNCkKKy8qKgorICogQ29kZWMgaW5pdGlhbGl6ZXMgc2xpY2UtYmFzZWQgdGhyZWFkaW5nIHdpdGggYSBtYWluIGZ1bmN0aW9uCisgKi8KKyNkZWZpbmUgRkZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRF9IQVNfTUYgICAgKDEgPDwgNSkKIAogI2lmZGVmIFRSQUNFCiAjICAgZGVmaW5lIGZmX3Rsb2coY3R4LCAuLi4pIGF2X2xvZyhjdHgsIEFWX0xPR19UUkFDRSwgX19WQV9BUkdTX18pCkBAIC02NiwxNSArNzYsMjAgQEAKICNlbmRpZgogCiAKLSNpZiAhRkZfQVBJX1FVQU5UX0JJQVMKICNkZWZpbmUgRkZfREVGQVVMVF9RVUFOVF9CSUFTIDk5OTk5OQotI2VuZGlmCisKKyNkZWZpbmUgRkZfUVNDQUxFX1RZUEVfTVBFRzEgMAorI2RlZmluZSBGRl9RU0NBTEVfVFlQRV9NUEVHMiAxCisjZGVmaW5lIEZGX1FTQ0FMRV9UWVBFX0gyNjQgIDIKKyNkZWZpbmUgRkZfUVNDQUxFX1RZUEVfVlA1NiAgMwogCiAjZGVmaW5lIEZGX1NBTkVfTkJfQ0hBTk5FTFMgNjRVCiAKICNkZWZpbmUgRkZfU0lHTkJJVCh4KSAoKHgpID4+IENIQVJfQklUICogc2l6ZW9mKHgpIC0gMSkKIAotI2lmIEhBVkVfQVZYCisjaWYgSEFWRV9TSU1EX0FMSUdOXzY0CisjICAgZGVmaW5lIFNUUklERV9BTElHTiA2NCAvKiBBVlgtNTEyICovCisjZWxpZiBIQVZFX1NJTURfQUxJR05fMzIKICMgICBkZWZpbmUgU1RSSURFX0FMSUdOIDMyCiAjZWxpZiBIQVZFX1NJTURfQUxJR05fMTYKICMgICBkZWZpbmUgU1RSSURFX0FMSUdOIDE2CkBAIC0xMDEsNiArMTE2LDE2IEBACiAgICAgaW50IHNhbXBsZXM7CiB9IEZyYW1lUG9vbDsKIAordHlwZWRlZiBzdHJ1Y3QgRGVjb2RlU2ltcGxlQ29udGV4dCB7CisgICAgQVZQYWNrZXQgKmluX3BrdDsKKyAgICBBVkZyYW1lICAqb3V0X2ZyYW1lOworfSBEZWNvZGVTaW1wbGVDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBEZWNvZGVGaWx0ZXJDb250ZXh0IHsKKyAgICBBVkJTRkNvbnRleHQgKipic2ZzOworICAgIGludCAgICAgICAgIG5iX2JzZnM7Cit9IERlY29kZUZpbHRlckNvbnRleHQ7CisKIHR5cGVkZWYgc3RydWN0IEFWQ29kZWNJbnRlcm5hbCB7CiAgICAgLyoqCiAgICAgICogV2hldGhlciB0aGUgcGFyZW50IEFWQ29kZWNDb250ZXh0IGlzIGEgY29weSBvZiB0aGUgY29udGV4dCB3aGljaCBoYWQKQEAgLTEzNywxMSArMTYyLDE0IEBACiAKICAgICB2b2lkICp0aHJlYWRfY3R4OwogCisgICAgRGVjb2RlU2ltcGxlQ29udGV4dCBkczsKKyAgICBEZWNvZGVGaWx0ZXJDb250ZXh0IGZpbHRlcjsKKwogICAgIC8qKgotICAgICAqIEN1cnJlbnQgcGFja2V0IGFzIHBhc3NlZCBpbnRvIHRoZSBkZWNvZGVyLCB0byBhdm9pZCBoYXZpbmcgdG8gcGFzcyB0aGUKLSAgICAgKiBwYWNrZXQgaW50byBldmVyeSBmdW5jdGlvbi4KKyAgICAgKiBQcm9wZXJ0aWVzICh0aW1lc3RhbXBzK3NpZGUgZGF0YSkgZXh0cmFjdGVkIGZyb20gdGhlIGxhc3QgcGFja2V0IHBhc3NlZAorICAgICAqIGZvciBkZWNvZGluZy4KICAgICAgKi8KLSAgICBBVlBhY2tldCAqcGt0OworICAgIEFWUGFja2V0ICpsYXN0X3BrdF9wcm9wczsKIAogICAgIC8qKgogICAgICAqIHRlbXBvcmFyeSBidWZmZXIgdXNlZCBmb3IgZW5jb2RlcnMgdG8gc3RvcmUgdGhlaXIgYml0c3RyZWFtCkBAIC0xNjAsNiArMTg4LDM2IEBACiAgICAgICogaHdhY2NlbC1zcGVjaWZpYyBwcml2YXRlIGRhdGEKICAgICAgKi8KICAgICB2b2lkICpod2FjY2VsX3ByaXZfZGF0YTsKKworICAgIC8qKgorICAgICAqIGNoZWNrcyBBUEkgdXNhZ2U6IGFmdGVyIGNvZGVjIGRyYWluaW5nLCBmbHVzaCBpcyByZXF1aXJlZCB0byByZXN1bWUgb3BlcmF0aW9uCisgICAgICovCisgICAgaW50IGRyYWluaW5nOworCisgICAgLyoqCisgICAgICogYnVmZmVycyBmb3IgdXNpbmcgbmV3IGVuY29kZS9kZWNvZGUgQVBJIHRocm91Z2ggbGVnYWN5IEFQSQorICAgICAqLworICAgIEFWUGFja2V0ICpidWZmZXJfcGt0OworICAgIGludCBidWZmZXJfcGt0X3ZhbGlkOyAvLyBlbmNvZGluZzogcGFja2V0IHdpdGhvdXQgZGF0YSBjYW4gYmUgdmFsaWQKKyAgICBBVkZyYW1lICpidWZmZXJfZnJhbWU7CisgICAgaW50IGRyYWluaW5nX2RvbmU7CisgICAgLyogc2V0IHRvIDEgd2hlbiB0aGUgY2FsbGVyIGlzIHVzaW5nIHRoZSBvbGQgZGVjb2RpbmcgQVBJICovCisgICAgaW50IGNvbXBhdF9kZWNvZGU7CisgICAgaW50IGNvbXBhdF9kZWNvZGVfd2FybmVkOworICAgIC8qIHRoaXMgdmFyaWFibGUgaXMgc2V0IGJ5IHRoZSBkZWNvZGVyIGludGVybmFscyB0byBzaWduYWwgdG8gdGhlIG9sZAorICAgICAqIEFQSSBjb21wYXQgd3JhcHBlcnMgdGhlIGFtb3VudCBvZiBkYXRhIGNvbnN1bWVkIGZyb20gdGhlIGxhc3QgcGFja2V0ICovCisgICAgc2l6ZV90IGNvbXBhdF9kZWNvZGVfY29uc3VtZWQ7CisgICAgLyogd2hlbiBhIHBhcnRpYWwgcGFja2V0IGhhcyBiZWVuIGNvbnN1bWVkLCB0aGlzIHN0b3JlcyB0aGUgcmVtYWluaW5nIHNpemUKKyAgICAgKiBvZiB0aGUgcGFja2V0ICh0aGF0IHNob3VsZCBiZSBzdWJtaXR0ZWQgaW4gdGhlIG5leHQgZGVjb2RlIGNhbGwgKi8KKyAgICBzaXplX3QgY29tcGF0X2RlY29kZV9wYXJ0aWFsX3NpemU7CisgICAgQVZGcmFtZSAqY29tcGF0X2RlY29kZV9mcmFtZTsKKworICAgIGludCBzaG93ZWRfbXVsdGlfcGFja2V0X3dhcm5pbmc7CisKKyAgICBpbnQgc2tpcF9zYW1wbGVzX211bHRpcGxpZXI7CisKKyAgICAvKiB0byBwcmV2ZW50IGluZmluaXRlIGxvb3Agb24gZXJyb3JzIHdoZW4gZHJhaW5pbmcgKi8KKyAgICBpbnQgbmJfZHJhaW5pbmdfZXJyb3JzOwogfSBBVkNvZGVjSW50ZXJuYWw7CiAKIHN0cnVjdCBBVkNvZGVjRGVmYXVsdCB7CkBAIC0xNzcsMjEgKzIzNSw4IEBACiAKIHVuc2lnbmVkIGludCBhdnByaXZfdG91cHBlcjQodW5zaWduZWQgaW50IHgpOwogCi0vKioKLSAqIGRvZXMgbmVlZGVkIHNldHVwIG9mIHBrdF9wdHMvcG9zIGFuZCBzdWNoIGZvciAocmUpZ2V0X2J1ZmZlcigpOwotICovCi1pbnQgZmZfaW5pdF9idWZmZXJfaW5mbyhBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpOwotCi0KIHZvaWQgZmZfY29sb3JfZnJhbWUoQVZGcmFtZSAqZnJhbWUsIGNvbnN0IGludCBjb2xvcls0XSk7CiAKLWV4dGVybiB2b2xhdGlsZSBpbnQgZmZfYXZjb2RlY19sb2NrZWQ7Ci1pbnQgZmZfbG9ja19hdmNvZGVjKEFWQ29kZWNDb250ZXh0ICpsb2dfY3R4LCBjb25zdCBBVkNvZGVjICpjb2RlYyk7Ci1pbnQgZmZfdW5sb2NrX2F2Y29kZWMoY29uc3QgQVZDb2RlYyAqY29kZWMpOwotCi1pbnQgYXZwcml2X2xvY2tfYXZmb3JtYXQodm9pZCk7Ci1pbnQgYXZwcml2X3VubG9ja19hdmZvcm1hdCh2b2lkKTsKLQogLyoqCiAgKiBNYXhpbXVtIHNpemUgaW4gYnl0ZXMgb2YgZXh0cmFkYXRhLgogICogVGhpcyB2YWx1ZSB3YXMgY2hvc2VuIHN1Y2ggdGhhdCBldmVyeSBiaXQgb2YgdGhlIGJ1ZmZlciBpcwpAQCAtMjQ4LDcgKzI5Myw3IEBACiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBmbG9hdCBmZl9leHAyZmkoaW50IHgpIHsKICAgICAvKiBOb3JtYWwgcmFuZ2UgKi8KICAgICBpZiAoLTEyNiA8PSB4ICYmIHggPD0gMTI4KQotICAgICAgICByZXR1cm4gYXZfaW50MmZsb2F0KHgrMTI3IDw8IDIzKTsKKyAgICAgICAgcmV0dXJuIGF2X2ludDJmbG9hdCgoeCsxMjcpIDw8IDIzKTsKICAgICAvKiBUb28gbGFyZ2UgKi8KICAgICBlbHNlIGlmICh4ID4gMTI4KQogICAgICAgICByZXR1cm4gSU5GSU5JVFk7CkBAIC0yOTMsNiArMzM4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqc3RhdGUpOwogCitpbnQgYXZwcml2X2NvZGVjX2dldF9jYXBfc2tpcF9mcmFtZV9maWxsX3BhcmFtKGNvbnN0IEFWQ29kZWMgKmNvZGVjKTsKKwogLyoqCiAgKiBDaGVjayB0aGF0IHRoZSBwcm92aWRlZCBmcmFtZSBkaW1lbnNpb25zIGFyZSB2YWxpZCBhbmQgc2V0IHRoZW0gb24gdGhlIGNvZGVjCiAgKiBjb250ZXh0LgpAQCAtMzE1LDYgKzM2MiwxMiBAQAogICogU2VsZWN0IHRoZSAocG9zc2libHkgaGFyZHdhcmUgYWNjZWxlcmF0ZWQpIHBpeGVsIGZvcm1hdC4KICAqIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBBVkNvZGVjQ29udGV4dC5nZXRfZm9ybWF0KCkgYW5kIHNob3VsZCBiZSB1c2VkCiAgKiBpbnN0ZWFkIG9mIGNhbGxpbmcgZ2V0X2Zvcm1hdCgpIGRpcmVjdGx5LgorICoKKyAqIFRoZSBsaXN0IG9mIHBpeGVsIGZvcm1hdHMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSB2YWxpZCBlbnRyeSwgYW5kIGlzCisgKiB0ZXJtaW5hdGVkIHdpdGggQVZfUElYX0ZNVF9OT05FLiAgSWYgaXQgaXMgcG9zc2libGUgdG8gZGVjb2RlIHRvIHNvZnR3YXJlLAorICogdGhlIGxhc3QgZW50cnkgaW4gdGhlIGxpc3QgbXVzdCBiZSB0aGUgbW9zdCBhY2N1cmF0ZSBzb2Z0d2FyZSBmb3JtYXQuCisgKiBJZiBpdCBpcyBub3QgcG9zc2libGUgdG8gZGVjb2RlIHRvIHNvZnR3YXJlLCBBVkNvZGVjQ29udGV4dC5zd19waXhfZm10CisgKiBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCiBpbnQgZmZfZ2V0X2Zvcm1hdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqZm10KTsKIApAQCAtMzMwLDQgKzM4MywzMSBAQAogCiBpbnQgZmZfc2lkZV9kYXRhX3NldF9lbmNvZGVyX3N0YXRzKEFWUGFja2V0ICpwa3QsIGludCBxdWFsaXR5LCBpbnQ2NF90ICplcnJvciwgaW50IGVycm9yX2NvdW50LCBpbnQgcGljdF90eXBlKTsKIAorLyoqCisgKiBDaGVjayBBVkZyYW1lIGZvciBBNTMgc2lkZSBkYXRhIGFuZCBhbGxvY2F0ZSBhbmQgZmlsbCBTRUkgbWVzc2FnZSB3aXRoIEE1MyBpbmZvCisgKgorICogQHBhcmFtIGZyYW1lICAgICAgUmF3IGZyYW1lIHRvIGdldCBBNTMgc2lkZSBkYXRhIGZyb20KKyAqIEBwYXJhbSBwcmVmaXhfbGVuIE51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBiZWZvcmUgU0VJIG1lc3NhZ2UKKyAqIEBwYXJhbSBkYXRhICAgICAgIFBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byBzdG9yZSBhbGxvY2F0ZWQgbWVtb3J5CisgKiAgICAgICAgICAgICAgICAgICBVcG9uIHJldHVybiB0aGUgdmFyaWFibGUgd2lsbCBob2xkIE5VTEwgb24gZXJyb3Igb3IgaWYgZnJhbWUgaGFzIG5vIEE1MyBpbmZvLgorICogICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIGl0IHdpbGwgcG9pbnQgdG8gcHJlZml4X2xlbiB1bmluaXRpYWxpemVkIGJ5dGVzIGZvbGxvd2VkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAqc2VpX3NpemUgU0VJIG1lc3NhZ2UKKyAqIEBwYXJhbSBzZWlfc2l6ZSAgIFBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byBzdG9yZSBnZW5lcmF0ZWQgU0VJIG1lc3NhZ2UgbGVuZ3RoCisgKiBAcmV0dXJuICAgICAgICAgICBaZXJvIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgZmZfYWxsb2NfYTUzX3NlaShjb25zdCBBVkZyYW1lICpmcmFtZSwgc2l6ZV90IHByZWZpeF9sZW4sCisgICAgICAgICAgICAgICAgICAgICB2b2lkICoqZGF0YSwgc2l6ZV90ICpzZWlfc2l6ZSk7CisKKy8qKgorICogR2V0IGFuIGVzdGltYXRlZCB2aWRlbyBiaXRyYXRlIGJhc2VkIG9uIGZyYW1lIHNpemUsIGZyYW1lIHJhdGUgYW5kIGNvZGVkCisgKiBiaXRzIHBlciBwaXhlbC4KKyAqLworaW50NjRfdCBmZl9ndWVzc19jb2RlZF9iaXRyYXRlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKyNpZiBkZWZpbmVkKF9XSU4zMikgJiYgQ09ORklHX1NIQVJFRCAmJiAhZGVmaW5lZChCVUlMRElOR19hdmNvZGVjKQorIyAgICBkZWZpbmUgYXZfZXhwb3J0X2F2Y29kZWMgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjZWxzZQorIyAgICBkZWZpbmUgYXZfZXhwb3J0X2F2Y29kZWMKKyNlbmRpZgorCiAjZW5kaWYgLyogQVZDT0RFQ19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ludGVycGxheWFjbS5jIGIvbGliYXZjb2RlYy9pbnRlcnBsYXlhY20uYwppbmRleCBhNjc2YmNiLi5jODk3ZTcyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ludGVycGxheWFjbS5jCisrKyBiL2xpYmF2Y29kZWMvaW50ZXJwbGF5YWNtLmMKQEAgLTE5LDggKzE5LDkgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKKwogI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtNjEsNiArNjIsMTEgQEAKICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMTQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHM6ICVkXG4iLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKICAgICBzLT5sZXZlbCA9IEFWX1JMMTYoYXZjdHgtPmV4dHJhZGF0YSArIDEyKSAmIDB4ZjsKICAgICBzLT5yb3dzICA9IEFWX1JMMTYoYXZjdHgtPmV4dHJhZGF0YSArIDEyKSA+PiAgNDsKICAgICBzLT5jb2xzICA9IDEgPDwgcy0+bGV2ZWw7CkBAIC03MSw3ICs3Nyw3IEBACiAgICAgcy0+YmxvY2sgICA9IGF2X2NhbGxvYyhzLT5ibG9ja19sZW4sIHNpemVvZihpbnQpKTsKICAgICBzLT53cmFwYnVmID0gYXZfY2FsbG9jKHMtPndyYXBidWZfbGVuLCBzaXplb2YoaW50KSk7CiAgICAgcy0+YW1wYnVmICA9IGF2X2NhbGxvYygweDEwMDAwLCBzaXplb2YoaW50KSk7Ci0gICAgcy0+Yml0c3RyZWFtID0gYXZfY2FsbG9jKHMtPm1heF9mcmFtZXNpemUsIHNpemVvZigqcy0+Yml0c3RyZWFtKSk7CisgICAgcy0+Yml0c3RyZWFtID0gYXZfY2FsbG9jKHMtPm1heF9mcmFtZXNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFIC8gc2l6ZW9mKCpzLT5iaXRzdHJlYW0pICsgMSwgc2l6ZW9mKCpzLT5iaXRzdHJlYW0pKTsKICAgICBpZiAoIXMtPmJsb2NrIHx8ICFzLT53cmFwYnVmIHx8ICFzLT5hbXBidWYgfHwgIXMtPmJpdHN0cmVhbSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIApAQCAtMzI1LDYgKzMzMSwxMCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5yb3dzOyBpKyspIHsKICAgICAgICAgLyogYiA9ICh4MSkgKyAoeDIgKiAzKSArICh4MyAqIDkpICovCiAgICAgICAgIGIgPSBnZXRfYml0cyhnYiwgNSk7CisgICAgICAgIGlmIChiID4gMjYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJUb28gbGFyZ2UgYiA9ICVkID4gMjZcbiIsIGIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KIAogICAgICAgICBuMSA9ICAobXVsXzN4M1tiXSAmIDB4MEYpIC0gMTsKICAgICAgICAgbjIgPSAoKG11bF8zeDNbYl0gPj4gNCkgJiAweDBGKSAtIDE7CkBAIC0zNTAsNiArMzYwLDEwIEBACiAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJvd3M7IGkrKykgewogICAgICAgICAvKiBiID0gKHgxKSArICh4MiAqIDUpICsgKHgzICogMjUpICovCiAgICAgICAgIGIgPSBnZXRfYml0cyhnYiwgNyk7CisgICAgICAgIGlmIChiID4gMTI0KSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVG9vIGxhcmdlIGIgPSAlZCA+IDEyNFxuIiwgYik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogCiAgICAgICAgIG4xID0gIChtdWxfM3g1W2JdICYgMHgwRikgLSAyOwogICAgICAgICBuMiA9ICgobXVsXzN4NVtiXSA+PiA0KSAmIDB4MEYpIC0gMjsKQEAgLTM3NCw2ICszODgsMTAgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cm93czsgaSsrKSB7CiAgICAgICAgIC8qIGIgPSAoeDEpICsgKHgyICogMTEpICovCiAgICAgICAgIGIgPSBnZXRfYml0cyhnYiwgNyk7CisgICAgICAgIGlmIChiID4gMTIwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVG9vIGxhcmdlIGIgPSAlZCA+IDEyMFxuIiwgYik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogCiAgICAgICAgIG4xID0gIChtdWxfMngxMVtiXSAmIDB4MEYpIC0gNTsKICAgICAgICAgbjIgPSAoKG11bF8yeDExW2JdID4+IDQpICYgMHgwRikgLSA1OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pbnRlcnBsYXl2aWRlby5jIGIvbGliYXZjb2RlYy9pbnRlcnBsYXl2aWRlby5jCmluZGV4IDE0NjA3NDEuLmRlYWEwOWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaW50ZXJwbGF5dmlkZW8uYworKysgYi9saWJhdmNvZGVjL2ludGVycGxheXZpZGVvLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogSW50ZXJwbGF5IE1WRSBWaWRlbyBEZWNvZGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTM5LDExICszOSwxMiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgotI2luY2x1ZGUgImhwZWxkc3AuaCIKLSNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaHBlbGRzcC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNkZWZpbmUgUEFMRVRURV9DT1VOVCAyNTYKQEAgLTU0LDggKzU1LDE1IEBACiAgICAgSHBlbERTUENvbnRleHQgaGRzcDsKICAgICBBVkZyYW1lICpzZWNvbmRfbGFzdF9mcmFtZTsKICAgICBBVkZyYW1lICpsYXN0X2ZyYW1lOworCisgICAgLyogRm9yIGZvcm1hdCAweDEwICovCisgICAgQVZGcmFtZSAqY3VyX2RlY29kZV9mcmFtZTsKKyAgICBBVkZyYW1lICpwcmV2X2RlY29kZV9mcmFtZTsKKwogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRlY29kaW5nX21hcDsKICAgICBpbnQgZGVjb2RpbmdfbWFwX3NpemU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqc2tpcF9tYXA7CisgICAgaW50IHNraXBfbWFwX3NpemU7CiAKICAgICBpbnQgaXNfMTZicHA7CiAgICAgR2V0Qnl0ZUNvbnRleHQgc3RyZWFtX3B0ciwgbXZfcHRyOwpAQCAtOTAyLDcgKzkxMCwxOTMgQEAKICAgICBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHhFXzE2LCBpcHZpZGVvX2RlY29kZV9ibG9ja19vcGNvZGVfMHgxLAogfTsKIAotc3RhdGljIHZvaWQgaXB2aWRlb19kZWNvZGVfb3Bjb2RlcyhJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCitzdGF0aWMgdm9pZCBpcHZpZGVvX2Zvcm1hdF8wNl9maXJzdHBhc3MoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lLCBpbnQxNl90IG9wY29kZSkKK3sKKyAgICBpbnQgbGluZTsKKworICAgIGlmICghb3Bjb2RlKSB7CisgICAgICAgIGZvciAobGluZSA9IDA7IGxpbmUgPCA4OyArK2xpbmUpIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJnMtPnN0cmVhbV9wdHIsIHMtPnBpeGVsX3B0ciwgOCk7CisgICAgICAgICAgICBzLT5waXhlbF9wdHIgKz0gcy0+c3RyaWRlOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRG9uJ3QgdHJ5IHRvIGNvcHkgc2Vjb25kX2xhc3RfZnJhbWUgZGF0YSBvbiB0aGUgZmlyc3QgZnJhbWVzICovCisgICAgICAgIGlmIChzLT5hdmN0eC0+ZnJhbWVfbnVtYmVyID4gMikKKyAgICAgICAgICAgIGNvcHlfZnJvbShzLCBzLT5zZWNvbmRfbGFzdF9mcmFtZSwgZnJhbWUsIDAsIDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaXB2aWRlb19mb3JtYXRfMDZfc2Vjb25kcGFzcyhJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludDE2X3Qgb3Bjb2RlKQoreworICAgIGludCBvZmZfeCwgb2ZmX3k7CisKKyAgICBpZiAob3Bjb2RlIDwgMCkgeworICAgICAgICBvZmZfeCA9ICgodWludDE2X3Qpb3Bjb2RlIC0gMHhDMDAwKSAlIGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgb2ZmX3kgPSAoKHVpbnQxNl90KW9wY29kZSAtIDB4QzAwMCkgLyBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIGNvcHlfZnJvbShzLCBzLT5sYXN0X2ZyYW1lLCBmcmFtZSwgb2ZmX3gsIG9mZl95KTsKKyAgICB9IGVsc2UgaWYgKG9wY29kZSA+IDApIHsKKyAgICAgICAgb2ZmX3ggPSAoKHVpbnQxNl90KW9wY29kZSAtIDB4NDAwMCkgJSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIG9mZl95ID0gKCh1aW50MTZfdClvcGNvZGUgLSAweDQwMDApIC8gZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBjb3B5X2Zyb20ocywgZnJhbWUsIGZyYW1lLCBvZmZfeCwgb2ZmX3kpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgKCogY29uc3QgaXB2aWRlb19mb3JtYXRfMDZfcGFzc2VzW10pKElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50MTZfdCBvcCkgPSB7CisgICAgaXB2aWRlb19mb3JtYXRfMDZfZmlyc3RwYXNzLCBpcHZpZGVvX2Zvcm1hdF8wNl9zZWNvbmRwYXNzLAorfTsKKworc3RhdGljIHZvaWQgaXB2aWRlb19kZWNvZGVfZm9ybWF0XzA2X29wY29kZXMoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBwYXNzLCB4LCB5OworICAgIGludDE2X3Qgb3Bjb2RlOworICAgIEdldEJ5dGVDb250ZXh0IGRlY29kaW5nX21hcF9wdHI7CisKKyAgICAvKiB0aGlzIGlzIFBBTDgsIHNvIG1ha2UgdGhlIHBhbGV0dGUgYXZhaWxhYmxlICovCisgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBzLT5wYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICBzLT5zdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbMF07CisKKyAgICBzLT5saW5lX2luYyA9IHMtPnN0cmlkZSAtIDg7CisgICAgcy0+dXBwZXJfbW90aW9uX2xpbWl0X29mZnNldCA9IChzLT5hdmN0eC0+aGVpZ2h0IC0gOCkgKiBmcmFtZS0+bGluZXNpemVbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzLT5hdmN0eC0+d2lkdGggLSA4KSAqICgxICsgcy0+aXNfMTZicHApOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZGVjb2RpbmdfbWFwX3B0ciwgcy0+ZGVjb2RpbmdfbWFwLCBzLT5kZWNvZGluZ19tYXBfc2l6ZSk7CisKKyAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgMjsgKytwYXNzKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmRlY29kaW5nX21hcF9wdHIsIDAsIFNFRUtfU0VUKTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmF2Y3R4LT5oZWlnaHQ7IHkgKz0gOCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPmF2Y3R4LT53aWR0aDsgeCArPSA4KSB7CisgICAgICAgICAgICAgICAgb3Bjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmRlY29kaW5nX21hcF9wdHIpOworCisgICAgICAgICAgICAgICAgZmZfdGxvZyhzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgIGJsb2NrIEAgKCUzZCwgJTNkKTogb3Bjb2RlIDB4JVgsIGRhdGEgcHRyIG9mZnNldCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIG9wY29kZSwgYnl0ZXN0cmVhbTJfdGVsbCgmcy0+c3RyZWFtX3B0cikpOworCisgICAgICAgICAgICAgICAgcy0+cGl4ZWxfcHRyID0gZnJhbWUtPmRhdGFbMF0gKyB4ICsgeSAqIGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgICAgICBpcHZpZGVvX2Zvcm1hdF8wNl9wYXNzZXNbcGFzc10ocywgZnJhbWUsIG9wY29kZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPnN0cmVhbV9wdHIpID4gMSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJkZWNvZGUgZmluaXNoZWQgd2l0aCAlZCBieXRlcyBsZWZ0IG92ZXJcbiIsCisgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+c3RyZWFtX3B0cikpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaXB2aWRlb19mb3JtYXRfMTBfZmlyc3RwYXNzKElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50MTZfdCBvcGNvZGUpCit7CisgICAgaW50IGxpbmU7CisKKyAgICBpZiAoIW9wY29kZSkgeworICAgICAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgODsgKytsaW5lKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZzLT5zdHJlYW1fcHRyLCBzLT5waXhlbF9wdHIsIDgpOworICAgICAgICAgICAgcy0+cGl4ZWxfcHRyICs9IHMtPnN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaXB2aWRlb19mb3JtYXRfMTBfc2Vjb25kcGFzcyhJcHZpZGVvQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludDE2X3Qgb3Bjb2RlKQoreworICAgIGludCBvZmZfeCwgb2ZmX3k7CisKKyAgICBpZiAob3Bjb2RlIDwgMCkgeworICAgICAgICBvZmZfeCA9ICgodWludDE2X3Qpb3Bjb2RlIC0gMHhDMDAwKSAlIHMtPmN1cl9kZWNvZGVfZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBvZmZfeSA9ICgodWludDE2X3Qpb3Bjb2RlIC0gMHhDMDAwKSAvIHMtPmN1cl9kZWNvZGVfZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBjb3B5X2Zyb20ocywgcy0+cHJldl9kZWNvZGVfZnJhbWUsIHMtPmN1cl9kZWNvZGVfZnJhbWUsIG9mZl94LCBvZmZfeSk7CisgICAgfSBlbHNlIGlmIChvcGNvZGUgPiAwKSB7CisgICAgICAgIG9mZl94ID0gKCh1aW50MTZfdClvcGNvZGUgLSAweDQwMDApICUgcy0+Y3VyX2RlY29kZV9mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIG9mZl95ID0gKCh1aW50MTZfdClvcGNvZGUgLSAweDQwMDApIC8gcy0+Y3VyX2RlY29kZV9mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIGNvcHlfZnJvbShzLCBzLT5jdXJfZGVjb2RlX2ZyYW1lLCBzLT5jdXJfZGVjb2RlX2ZyYW1lLCBvZmZfeCwgb2ZmX3kpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgKCogY29uc3QgaXB2aWRlb19mb3JtYXRfMTBfcGFzc2VzW10pKElwdmlkZW9Db250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50MTZfdCBvcCkgPSB7CisgICAgaXB2aWRlb19mb3JtYXRfMTBfZmlyc3RwYXNzLCBpcHZpZGVvX2Zvcm1hdF8xMF9zZWNvbmRwYXNzLAorfTsKKworc3RhdGljIHZvaWQgaXB2aWRlb19kZWNvZGVfZm9ybWF0XzEwX29wY29kZXMoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBwYXNzLCB4LCB5LCBjaGFuZ2VkX2Jsb2NrOworICAgIGludDE2X3Qgb3Bjb2RlLCBza2lwOworICAgIEdldEJ5dGVDb250ZXh0IGRlY29kaW5nX21hcF9wdHI7CisgICAgR2V0Qnl0ZUNvbnRleHQgc2tpcF9tYXBfcHRyOworCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+c3RyZWFtX3B0ciwgMTQpOyAvKiBkYXRhIHN0YXJ0cyAxNCBieXRlcyBpbiAqLworCisgICAgLyogdGhpcyBpcyBQQUw4LCBzbyBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSAqLworICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSwgcy0+cGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgcy0+c3RyaWRlID0gZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgcy0+bGluZV9pbmMgPSBzLT5zdHJpZGUgLSA4OworICAgIHMtPnVwcGVyX21vdGlvbl9saW1pdF9vZmZzZXQgPSAocy0+YXZjdHgtPmhlaWdodCAtIDgpICogZnJhbWUtPmxpbmVzaXplWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocy0+YXZjdHgtPndpZHRoIC0gOCkgKiAoMSArIHMtPmlzXzE2YnBwKTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmRlY29kaW5nX21hcF9wdHIsIHMtPmRlY29kaW5nX21hcCwgcy0+ZGVjb2RpbmdfbWFwX3NpemUpOworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnNraXBfbWFwX3B0ciwgcy0+c2tpcF9tYXAsIHMtPnNraXBfbWFwX3NpemUpOworCisgICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IDI7ICsrcGFzcykgeworICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZkZWNvZGluZ19tYXBfcHRyLCAwLCBTRUVLX1NFVCk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnNraXBfbWFwX3B0ciwgMCwgU0VFS19TRVQpOworICAgICAgICBza2lwID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnNraXBfbWFwX3B0cik7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmF2Y3R4LT5oZWlnaHQ7IHkgKz0gOCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPmF2Y3R4LT53aWR0aDsgeCArPSA4KSB7CisgICAgICAgICAgICAgICAgcy0+cGl4ZWxfcHRyID0gcy0+Y3VyX2RlY29kZV9mcmFtZS0+ZGF0YVswXSArIHggKyB5ICogcy0+Y3VyX2RlY29kZV9mcmFtZS0+bGluZXNpemVbMF07CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoc2tpcCA8PSAwKSAgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2tpcCAhPSAtMHg4MDAwICYmIHNraXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZkZWNvZGluZ19tYXBfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwdmlkZW9fZm9ybWF0XzEwX3Bhc3Nlc1twYXNzXShzLCBmcmFtZSwgb3Bjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmc2tpcF9tYXBfcHRyKSA8IDIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIHNraXAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmc2tpcF9tYXBfcHRyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2tpcCAqPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2Vlaygmc2tpcF9tYXBfcHRyLCAwLCBTRUVLX1NFVCk7CisgICAgc2tpcCA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZza2lwX21hcF9wdHIpOworICAgIGZvciAoeSA9IDA7IHkgPCBzLT5hdmN0eC0+aGVpZ2h0OyB5ICs9IDgpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPmF2Y3R4LT53aWR0aDsgeCArPSA4KSB7CisgICAgICAgICAgICBjaGFuZ2VkX2Jsb2NrID0gMDsKKyAgICAgICAgICAgIHMtPnBpeGVsX3B0ciA9IGZyYW1lLT5kYXRhWzBdICsgeCArIHkqZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgICAgICAgICB3aGlsZSAoc2tpcCA8PSAwKSAgeworICAgICAgICAgICAgICAgIGlmIChza2lwICE9IC0weDgwMDAgJiYgc2tpcCkgeworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkX2Jsb2NrID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmc2tpcF9tYXBfcHRyKSA8IDIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICBza2lwID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnNraXBfbWFwX3B0cik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkX2Jsb2NrKSB7CisgICAgICAgICAgICAgICAgY29weV9mcm9tKHMsIHMtPmN1cl9kZWNvZGVfZnJhbWUsIGZyYW1lLCAwLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogRG9uJ3QgdHJ5IHRvIGNvcHkgbGFzdF9mcmFtZSBkYXRhIG9uIHRoZSBmaXJzdCBmcmFtZSAqLworICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+ZnJhbWVfbnVtYmVyKQorICAgICAgICAgICAgICAgICAgICBjb3B5X2Zyb20ocywgcy0+bGFzdF9mcmFtZSwgZnJhbWUsIDAsIDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2tpcCAqPSAyOworICAgICAgICB9CisgICAgfQorCisgICAgRkZTV0FQKEFWRnJhbWUqLCBzLT5wcmV2X2RlY29kZV9mcmFtZSwgcy0+Y3VyX2RlY29kZV9mcmFtZSk7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPnN0cmVhbV9wdHIpID4gMSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJkZWNvZGUgZmluaXNoZWQgd2l0aCAlZCBieXRlcyBsZWZ0IG92ZXJcbiIsCisgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+c3RyZWFtX3B0cikpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaXB2aWRlb19kZWNvZGVfZm9ybWF0XzExX29wY29kZXMoSXB2aWRlb0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQogewogICAgIGludCB4LCB5OwogICAgIHVuc2lnbmVkIGNoYXIgb3Bjb2RlOwpAQCAtOTI3LDYgKzExMjEsOCBAQAogICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzLT5kZWNvZGluZ19tYXAsIHMtPmRlY29kaW5nX21hcF9zaXplICogOCk7CiAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmF2Y3R4LT5oZWlnaHQ7IHkgKz0gOCkgewogICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+YXZjdHgtPndpZHRoOyB4ICs9IDgpIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPCA0KQorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIG9wY29kZSA9IGdldF9iaXRzKCZnYiwgNCk7CiAKICAgICAgICAgICAgIGZmX3Rsb2cocy0+YXZjdHgsCkBAIC05NTksNiArMTE1NSw3IEBACiBzdGF0aWMgYXZfY29sZCBpbnQgaXB2aWRlb19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgSXB2aWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CiAKICAgICBzLT5hdmN0eCA9IGF2Y3R4OwogCkBAIC05NjksMTMgKzExNjYsMzYgQEAKIAogICAgIHMtPmxhc3RfZnJhbWUgICAgICAgID0gYXZfZnJhbWVfYWxsb2MoKTsKICAgICBzLT5zZWNvbmRfbGFzdF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7Ci0gICAgaWYgKCFzLT5sYXN0X2ZyYW1lIHx8ICFzLT5zZWNvbmRfbGFzdF9mcmFtZSkgewotICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X2ZyYW1lKTsKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+c2Vjb25kX2xhc3RfZnJhbWUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPmN1cl9kZWNvZGVfZnJhbWUgID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBzLT5wcmV2X2RlY29kZV9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT5sYXN0X2ZyYW1lIHx8ICFzLT5zZWNvbmRfbGFzdF9mcmFtZSB8fAorICAgICAgICAhcy0+Y3VyX2RlY29kZV9mcmFtZSB8fCAhcy0+cHJldl9kZWNvZGVfZnJhbWUpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAorICAgIHMtPmN1cl9kZWNvZGVfZnJhbWUtPndpZHRoICAgPSBhdmN0eC0+d2lkdGg7CisgICAgcy0+cHJldl9kZWNvZGVfZnJhbWUtPndpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBzLT5jdXJfZGVjb2RlX2ZyYW1lLT5oZWlnaHQgID0gYXZjdHgtPmhlaWdodDsKKyAgICBzLT5wcmV2X2RlY29kZV9mcmFtZS0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKyAgICBzLT5jdXJfZGVjb2RlX2ZyYW1lLT5mb3JtYXQgID0gYXZjdHgtPnBpeF9mbXQ7CisgICAgcy0+cHJldl9kZWNvZGVfZnJhbWUtPmZvcm1hdCA9IGF2Y3R4LT5waXhfZm10OworCisgICAgcmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcy0+Y3VyX2RlY29kZV9mcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBzLT5wcmV2X2RlY29kZV9mcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKICAgICByZXR1cm4gMDsKK2Vycm9yOgorICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNlY29uZF9sYXN0X2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5jdXJfZGVjb2RlX2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2X2RlY29kZV9mcmFtZSk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBpcHZpZGVvX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCkBAIC05ODcsNDEgKzEyMDcsMTUwIEBACiAgICAgSXB2aWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKICAgICBpbnQgcmV0OwotCi0gICAgaWYgKGJ1Zl9zaXplIDwgMikKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0KLSAgICAvKiBkZWNvZGluZyBtYXAgY29udGFpbnMgNCBiaXRzIG9mIGluZm9ybWF0aW9uIHBlciA4eDggYmxvY2sgKi8KLSAgICBzLT5kZWNvZGluZ19tYXBfc2l6ZSA9IEFWX1JMMTYoYXZwa3QtPmRhdGEpOwotCi0gICAgLyogY29tcHJlc3NlZCBidWZmZXIgbmVlZHMgdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGF0IGxlYXN0IGhvbGQgYW4gZW50aXJlCi0gICAgICogZGVjb2RpbmcgbWFwICovCi0gICAgaWYgKGJ1Zl9zaXplIDwgcy0+ZGVjb2RpbmdfbWFwX3NpemUgKyAyKQotICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgaW50IHNlbmRfYnVmZmVyOworICAgIGludCBmcmFtZV9mb3JtYXQ7CisgICAgaW50IHZpZGVvX2RhdGFfc2l6ZTsKIAogICAgIGlmIChhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFSQU1fQ0hBTkdFLCBOVUxMKSkgewogICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5sYXN0X2ZyYW1lKTsKICAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+c2Vjb25kX2xhc3RfZnJhbWUpOworICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5jdXJfZGVjb2RlX2ZyYW1lKTsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+cHJldl9kZWNvZGVfZnJhbWUpOwogICAgIH0KIAotICAgIHMtPmRlY29kaW5nX21hcCA9IGJ1ZiArIDI7Ci0gICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+c3RyZWFtX3B0ciwgYnVmICsgMiArIHMtPmRlY29kaW5nX21hcF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUgLSBzLT5kZWNvZGluZ19tYXBfc2l6ZSk7CisgICAgaWYgKCFzLT5jdXJfZGVjb2RlX2ZyYW1lLT5kYXRhWzBdKSB7CisgICAgICAgIHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHMtPmN1cl9kZWNvZGVfZnJhbWUsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcy0+cHJldl9kZWNvZGVfZnJhbWUsIDApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+Y3VyX2RlY29kZV9mcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1Zl9zaXplIDwgOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBmcmFtZV9mb3JtYXQgICAgICAgICA9IEFWX1JMOChidWYpOworICAgIHNlbmRfYnVmZmVyICAgICAgICAgID0gQVZfUkw4KGJ1ZiArIDEpOworICAgIHZpZGVvX2RhdGFfc2l6ZSAgICAgID0gQVZfUkwxNihidWYgKyAyKTsKKyAgICBzLT5kZWNvZGluZ19tYXBfc2l6ZSA9IEFWX1JMMTYoYnVmICsgNCk7CisgICAgcy0+c2tpcF9tYXBfc2l6ZSAgICAgPSBBVl9STDE2KGJ1ZiArIDYpOworCisgICAgc3dpdGNoKGZyYW1lX2Zvcm1hdCkgeworICAgICAgICBjYXNlIDB4MDY6CisgICAgICAgICAgICBpZiAocy0+ZGVjb2RpbmdfbWFwX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlY29kaW5nIG1hcCBmb3IgZm9ybWF0IDB4MDZcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+c2tpcF9tYXBfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2tpcCBtYXAgZm9yIGZvcm1hdCAweDA2XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPmlzXzE2YnBwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJWaWRlbyBmb3JtYXQgMHgwNiBkb2VzIG5vdCBzdXBwb3J0IDE2YnBwIG1vdmllc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIERlY29kaW5nIG1hcCBmb3IgMHgwNiBmcmFtZSBmb3JtYXQgaXMgYXQgdGhlIHRvcCBvZiBwaXhlbGRhdGEgKi8KKyAgICAgICAgICAgIHMtPmRlY29kaW5nX21hcF9zaXplID0gKChzLT5hdmN0eC0+d2lkdGggLyA4KSAqIChzLT5hdmN0eC0+aGVpZ2h0IC8gOCkpICogMjsKKyAgICAgICAgICAgIHMtPmRlY29kaW5nX21hcCA9IGJ1ZiArIDggKyAxNDsgLyogMTQgYml0cyBvZiBvcCBkYXRhICovCisgICAgICAgICAgICB2aWRlb19kYXRhX3NpemUgLT0gcy0+ZGVjb2RpbmdfbWFwX3NpemUgKyAxNDsKKyAgICAgICAgICAgIGlmICh2aWRlb19kYXRhX3NpemUgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplIDwgOCArIHMtPmRlY29kaW5nX21hcF9zaXplICsgMTQgKyB2aWRlb19kYXRhX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPnN0cmVhbV9wdHIsIGJ1ZiArIDggKyBzLT5kZWNvZGluZ19tYXBfc2l6ZSArIDE0LCB2aWRlb19kYXRhX3NpemUpOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MTA6CisgICAgICAgICAgICBpZiAoISBzLT5kZWNvZGluZ19tYXBfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRW1wdHkgZGVjb2RpbmcgbWFwIGZvciBmb3JtYXQgMHgxMFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghIHMtPnNraXBfbWFwX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVtcHR5IHNraXAgbWFwIGZvciBmb3JtYXQgMHgxMFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5pc18xNmJwcCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVmlkZW8gZm9ybWF0IDB4MTAgZG9lcyBub3Qgc3VwcG9ydCAxNmJwcCBtb3ZpZXNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVmX3NpemUgPCA4ICsgdmlkZW9fZGF0YV9zaXplICsgcy0+ZGVjb2RpbmdfbWFwX3NpemUgKyBzLT5za2lwX21hcF9zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5zdHJlYW1fcHRyLCBidWYgKyA4LCB2aWRlb19kYXRhX3NpemUpOworICAgICAgICAgICAgcy0+ZGVjb2RpbmdfbWFwID0gYnVmICsgOCArIHZpZGVvX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgIHMtPnNraXBfbWFwID0gYnVmICsgOCArIHZpZGVvX2RhdGFfc2l6ZSArIHMtPmRlY29kaW5nX21hcF9zaXplOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDB4MTE6CisgICAgICAgICAgICBpZiAoISBzLT5kZWNvZGluZ19tYXBfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRW1wdHkgZGVjb2RpbmcgbWFwIGZvciBmb3JtYXQgMHgxMVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5za2lwX21hcF9zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTa2lwIG1hcCBmb3IgZm9ybWF0IDB4MTFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYnVmX3NpemUgPCA4ICsgdmlkZW9fZGF0YV9zaXplICsgcy0+ZGVjb2RpbmdfbWFwX3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPnN0cmVhbV9wdHIsIGJ1ZiArIDgsIHZpZGVvX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBzLT5kZWNvZGluZ19tYXAgPSBidWYgKyA4ICsgdmlkZW9fZGF0YV9zaXplOworCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGcmFtZSB0eXBlIDB4JTAyWCB1bnN1cHBvcnRlZFxuIiwgZnJhbWVfZm9ybWF0KTsKKyAgICB9CisKKyAgICAvKiBlbnN1cmUgd2UgY2FuJ3Qgb3ZlcnJlYWQgdGhlIHBhY2tldCAqLworICAgIGlmIChidWZfc2l6ZSA8IDggKyBzLT5kZWNvZGluZ19tYXBfc2l6ZSArIHZpZGVvX2RhdGFfc2l6ZSArIHMtPnNraXBfbWFwX3NpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIElQIHBhY2tldCBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQogCiAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmICghcy0+aXNfMTZicHApIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOwotICAgICAgICBpZiAocGFsKSB7CisgICAgICAgIGludCBzaXplOworICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgJnNpemUpOworICAgICAgICBpZiAocGFsICYmIHNpemUgPT0gQVZQQUxFVFRFX1NJWkUpIHsKICAgICAgICAgICAgIGZyYW1lLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKICAgICAgICAgICAgIG1lbWNweShzLT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgICAgICB9IGVsc2UgaWYgKHBhbCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWxldHRlIHNpemUgJWQgaXMgd3JvbmdcbiIsIHNpemUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaXB2aWRlb19kZWNvZGVfb3Bjb2RlcyhzLCBmcmFtZSk7CisgICAgc3dpdGNoKGZyYW1lX2Zvcm1hdCkgeworICAgICAgICBjYXNlIDB4MDY6CisgICAgICAgICAgICBpcHZpZGVvX2RlY29kZV9mb3JtYXRfMDZfb3Bjb2RlcyhzLCBmcmFtZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDEwOgorICAgICAgICAgICAgaXB2aWRlb19kZWNvZGVfZm9ybWF0XzEwX29wY29kZXMocywgZnJhbWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgxMToKKyAgICAgICAgICAgIGlwdmlkZW9fZGVjb2RlX2Zvcm1hdF8xMV9vcGNvZGVzKHMsIGZyYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KIAotICAgICpnb3RfZnJhbWUgPSAxOworICAgICpnb3RfZnJhbWUgPSBzZW5kX2J1ZmZlcjsKIAogICAgIC8qIHNodWZmbGUgZnJhbWVzICovCiAgICAgYXZfZnJhbWVfdW5yZWYocy0+c2Vjb25kX2xhc3RfZnJhbWUpOwpAQCAtMTAzOSw2ICsxMzY4LDggQEAKIAogICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOwogICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNlY29uZF9sYXN0X2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5jdXJfZGVjb2RlX2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2X2RlY29kZV9mcmFtZSk7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaW50cmF4OC5jIGIvbGliYXZjb2RlYy9pbnRyYXg4LmMKaW5kZXggY2YwMTI4OS4uZDQ2Zjk3YyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pbnRyYXg4LmMKKysrIGIvbGliYXZjb2RlYy9pbnRyYXg4LmMKQEAgLTIzLDE2ICsyMywxNiBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImVycm9yX3Jlc2lsaWVuY2UuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImlkY3Rkc3AuaCIKLSNpbmNsdWRlICJtcGVndmlkZW8uaCIKICNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgogI2luY2x1ZGUgImludHJheDhodWYuaCIKICNpbmNsdWRlICJpbnRyYXg4LmgiCiAjaW5jbHVkZSAiaW50cmF4OGRzcC5oIgorI2luY2x1ZGUgIm1wZWd1dGlscy5oIgogCi0jZGVmaW5lIE1BWF9UQUJMRV9ERVBUSCh0YWJsZV9iaXRzLCBtYXhfYml0cykgKChtYXhfYml0cyt0YWJsZV9iaXRzLTEpL3RhYmxlX2JpdHMpCisjZGVmaW5lIE1BWF9UQUJMRV9ERVBUSCh0YWJsZV9iaXRzLCBtYXhfYml0cykgXAorICAgICgobWF4X2JpdHMgKyB0YWJsZV9iaXRzIC0gMSkgLyB0YWJsZV9iaXRzKQogCiAjZGVmaW5lIERDX1ZMQ19CSVRTIDkKICNkZWZpbmUgQUNfVkxDX0JJVFMgOQpAQCAtNDIsMTUgKzQyLDE2IEBACiAjZGVmaW5lIEFDX1ZMQ19NVEQgTUFYX1RBQkxFX0RFUFRIKEFDX1ZMQ19CSVRTLCBNQVhfQUNfVkxDX0JJVFMpCiAjZGVmaW5lIE9SX1ZMQ19NVEQgTUFYX1RBQkxFX0RFUFRIKE9SX1ZMQ19CSVRTLCBNQVhfT1JfVkxDX0JJVFMpCiAKLXN0YXRpYyBWTEMgal9hY192bGNbMl1bMl1bOF07ICAvL1txdWFudDwxM10sW2ludHJhL2ludGVyXSxbc2VsZWN0XQotc3RhdGljIFZMQyBqX2RjX3ZsY1syXVs4XTsgICAgIC8vW3F1YW50XSwgW3NlbGVjdF0KLXN0YXRpYyBWTEMgal9vcmllbnRfdmxjWzJdWzRdOyAvL1txdWFudF0sIFtzZWxlY3RdCitzdGF0aWMgVkxDIGpfYWNfdmxjWzJdWzJdWzhdOyAgLy8gW3F1YW50IDwgMTNdLCBbaW50cmEgLyBpbnRlcl0sIFtzZWxlY3RdCitzdGF0aWMgVkxDIGpfZGNfdmxjWzJdWzhdOyAgICAgLy8gW3F1YW50XSwgW3NlbGVjdF0KK3N0YXRpYyBWTEMgal9vcmllbnRfdmxjWzJdWzRdOyAvLyBbcXVhbnRdLCBbc2VsZWN0XQogCi1zdGF0aWMgYXZfY29sZCB2b2lkIHg4X3ZsY19pbml0KHZvaWQpeworc3RhdGljIGF2X2NvbGQgaW50IHg4X3ZsY19pbml0KHZvaWQpCit7CiAgICAgaW50IGk7CiAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgaW50IHNpemVpZHggPSAwOwotICAgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBzaXplc1s4KjQgKyA4KjIgKyAyICsgNF0gPSB7CisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpemVzWzggKiA0ICsgOCAqIDIgKyAyICsgNF0gPSB7CiAgICAgICAgIDU3NiwgNTQ4LCA1ODIsIDYxOCwgNTQ2LCA2MTYsIDU2MCwgNjQyLAogICAgICAgICA1ODQsIDU4MiwgNzA0LCA2NjQsIDUxMiwgNTQ0LCA2NTYsIDY0MCwKICAgICAgICAgNTEyLCA2NDgsIDU4MiwgNTY2LCA1MzIsIDYxNCwgNTk2LCA2NDgsCkBAIC01OSw3MzUgKzYwLDc4NCBAQAogICAgICAgICA1MjgsIDUyOCwgNTI2LCA1MjgsIDUzNiwgNTI4LCA1MjYsIDU0NCwKICAgICAgICAgNTQ0LCA1MTIsIDUxMiwgNTI4LCA1MjgsIDU0NCwgNTEyLCA1NDQsCiAKLSAgICAgICAgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOH07CisgICAgICAgIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsCisgICAgfTsKIAogICAgIHN0YXRpYyBWTENfVFlQRSB0YWJsZVsyODE1MF1bMl07CiAKLSNkZWZpbmUgIGluaXRfYWNfdmxjKGRzdCxzcmMpIFwKLSAgICBkc3QudGFibGUgPSAmdGFibGVbb2Zmc2V0XTsgXAotICAgIGRzdC50YWJsZV9hbGxvY2F0ZWQgPSBzaXplc1tzaXplaWR4XTsgXAotICAgIG9mZnNldCArPSBzaXplc1tzaXplaWR4KytdOyBcCi0gICAgICAgaW5pdF92bGMoJmRzdCwgXAotICAgICAgICAgICAgICBBQ19WTENfQklUUyw3NywgXAotICAgICAgICAgICAgICAmc3JjWzFdLDQsMiwgXAotICAgICAgICAgICAgICAmc3JjWzBdLDQsMiwgXAotICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQykKLS8vc2V0IGFjIHRhYmxlcwotICAgIGZvcihpPTA7aTw4O2krKyl7Ci0gICAgICAgIGluaXRfYWNfdmxjKCBqX2FjX3ZsY1swXVswXVtpXSwgeDhfYWMwX2hpZ2hxdWFudF90YWJsZVtpXVswXSApOwotICAgICAgICBpbml0X2FjX3ZsYyggal9hY192bGNbMF1bMV1baV0sIHg4X2FjMV9oaWdocXVhbnRfdGFibGVbaV1bMF0gKTsKLSAgICAgICAgaW5pdF9hY192bGMoIGpfYWNfdmxjWzFdWzBdW2ldLCB4OF9hYzBfbG93cXVhbnRfdGFibGUgW2ldWzBdICk7Ci0gICAgICAgIGluaXRfYWNfdmxjKCBqX2FjX3ZsY1sxXVsxXVtpXSwgeDhfYWMxX2xvd3F1YW50X3RhYmxlIFtpXVswXSApOworLy8gc2V0IGFjIHRhYmxlcworI2RlZmluZSBpbml0X2FjX3ZsYyhkc3QsIHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QudGFibGUgICAgICAgICAgID0gJnRhYmxlW29mZnNldF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QudGFibGVfYWxsb2NhdGVkID0gc2l6ZXNbc2l6ZWlkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvZmZzZXQgICAgICAgICAgICAgKz0gc2l6ZXNbc2l6ZWlkeCsrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbml0X3ZsYygmZHN0LCBBQ19WTENfQklUUywgNzcsICZzcmNbMV0sIDQsIDIsICZzcmNbMF0sIDQsIDIsICAgICAgICAgXAorICAgICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaW5pdF9hY192bGMoal9hY192bGNbMF1bMF1baV0sIHg4X2FjMF9oaWdocXVhbnRfdGFibGVbaV1bMF0pOworICAgICAgICBpbml0X2FjX3ZsYyhqX2FjX3ZsY1swXVsxXVtpXSwgeDhfYWMxX2hpZ2hxdWFudF90YWJsZVtpXVswXSk7CisgICAgICAgIGluaXRfYWNfdmxjKGpfYWNfdmxjWzFdWzBdW2ldLCB4OF9hYzBfbG93cXVhbnRfdGFibGVbaV1bMF0pOworICAgICAgICBpbml0X2FjX3ZsYyhqX2FjX3ZsY1sxXVsxXVtpXSwgeDhfYWMxX2xvd3F1YW50X3RhYmxlW2ldWzBdKTsKICAgICB9CiAjdW5kZWYgaW5pdF9hY192bGMKIAotLy9zZXQgZGMgdGFibGVzCi0jZGVmaW5lIGluaXRfZGNfdmxjKGRzdCxzcmMpIFwKLSAgICBkc3QudGFibGUgPSAmdGFibGVbb2Zmc2V0XTsgXAotICAgIGRzdC50YWJsZV9hbGxvY2F0ZWQgPSBzaXplc1tzaXplaWR4XTsgXAotICAgIG9mZnNldCArPSBzaXplc1tzaXplaWR4KytdOyBcCi0gICAgICAgIGluaXRfdmxjKCZkc3QsIFwKLSAgICAgICAgRENfVkxDX0JJVFMsMzQsIFwKLSAgICAgICAgJnNyY1sxXSw0LDIsIFwKLSAgICAgICAgJnNyY1swXSw0LDIsIFwKLSAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOwotICAgIGZvcihpPTA7aTw4O2krKyl7Ci0gICAgICAgIGluaXRfZGNfdmxjKCBqX2RjX3ZsY1swXVtpXSwgeDhfZGNfaGlnaHF1YW50X3RhYmxlW2ldWzBdKTsKLSAgICAgICAgaW5pdF9kY192bGMoIGpfZGNfdmxjWzFdW2ldLCB4OF9kY19sb3dxdWFudF90YWJsZSBbaV1bMF0pOworLy8gc2V0IGRjIHRhYmxlcworI2RlZmluZSBpbml0X2RjX3ZsYyhkc3QsIHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QudGFibGUgICAgICAgICAgID0gJnRhYmxlW29mZnNldF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3QudGFibGVfYWxsb2NhdGVkID0gc2l6ZXNbc2l6ZWlkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvZmZzZXQgICAgICAgICAgICAgKz0gc2l6ZXNbc2l6ZWlkeCsrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbml0X3ZsYygmZHN0LCBEQ19WTENfQklUUywgMzQsICZzcmNbMV0sIDQsIDIsICZzcmNbMF0sIDQsIDIsICAgICAgICAgXAorICAgICAgICAgICAgICAgICBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUoMCkKKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaW5pdF9kY192bGMoal9kY192bGNbMF1baV0sIHg4X2RjX2hpZ2hxdWFudF90YWJsZVtpXVswXSk7CisgICAgICAgIGluaXRfZGNfdmxjKGpfZGNfdmxjWzFdW2ldLCB4OF9kY19sb3dxdWFudF90YWJsZVtpXVswXSk7CiAgICAgfQogI3VuZGVmIGluaXRfZGNfdmxjCiAKLS8vc2V0IG9yaWVudCB0YWJsZXMKLSNkZWZpbmUgaW5pdF9vcl92bGMoZHN0LHNyYykgXAotICAgIGRzdC50YWJsZSA9ICZ0YWJsZVtvZmZzZXRdOyBcCi0gICAgZHN0LnRhYmxlX2FsbG9jYXRlZCA9IHNpemVzW3NpemVpZHhdOyBcCi0gICAgb2Zmc2V0ICs9IHNpemVzW3NpemVpZHgrK107IFwKLSAgICBpbml0X3ZsYygmZHN0LCBcCi0gICAgT1JfVkxDX0JJVFMsMTIsIFwKLSAgICAmc3JjWzFdLDQsMiwgXAotICAgICZzcmNbMF0sNCwyLCBcCi0gICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOwotICAgIGZvcihpPTA7aTwyO2krKyl7Ci0gICAgICAgIGluaXRfb3JfdmxjKCBqX29yaWVudF92bGNbMF1baV0sIHg4X29yaWVudF9oaWdocXVhbnRfdGFibGVbaV1bMF0pOwotICAgIH0KLSAgICBmb3IoaT0wO2k8NDtpKyspewotICAgICAgICBpbml0X29yX3ZsYyggal9vcmllbnRfdmxjWzFdW2ldLCB4OF9vcmllbnRfbG93cXVhbnRfdGFibGUgW2ldWzBdKQotICAgIH0KLSAgICBpZiAob2Zmc2V0ICE9IHNpemVvZih0YWJsZSkvc2l6ZW9mKFZMQ19UWVBFKS8yKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAidGFibGUgc2l6ZSAlaSBkb2VzIG5vdCBtYXRjaCBuZWVkZWQgJWlcbiIsIChpbnQpKHNpemVvZih0YWJsZSkvc2l6ZW9mKFZMQ19UWVBFKS8yKSwgb2Zmc2V0KTsKLX0KKy8vIHNldCBvcmllbnQgdGFibGVzCisjZGVmaW5lIGluaXRfb3JfdmxjKGRzdCwgc3JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdC50YWJsZSAgICAgICAgICAgPSAmdGFibGVbb2Zmc2V0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdC50YWJsZV9hbGxvY2F0ZWQgPSBzaXplc1tzaXplaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9mZnNldCAgICAgICAgICAgICArPSBzaXplc1tzaXplaWR4KytdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGluaXRfdmxjKCZkc3QsIE9SX1ZMQ19CSVRTLCAxMiwgJnNyY1sxXSwgNCwgMiwgJnNyY1swXSwgNCwgMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgaW5pdF9vcl92bGMoal9vcmllbnRfdmxjWzBdW2ldLCB4OF9vcmllbnRfaGlnaHF1YW50X3RhYmxlW2ldWzBdKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBpbml0X29yX3ZsYyhqX29yaWVudF92bGNbMV1baV0sIHg4X29yaWVudF9sb3dxdWFudF90YWJsZVtpXVswXSk7CiAjdW5kZWYgaW5pdF9vcl92bGMKIAotc3RhdGljIHZvaWQgeDhfcmVzZXRfdmxjX3RhYmxlcyhJbnRyYVg4Q29udGV4dCAqIHcpewotICAgIG1lbXNldCh3LT5qX2RjX3ZsYywwLHNpemVvZih3LT5qX2RjX3ZsYykpOwotICAgIG1lbXNldCh3LT5qX2FjX3ZsYywwLHNpemVvZih3LT5qX2FjX3ZsYykpOwotICAgIHctPmpfb3JpZW50X3ZsYz1OVUxMOworICAgIGlmIChvZmZzZXQgIT0gc2l6ZW9mKHRhYmxlKSAvIHNpemVvZihWTENfVFlQRSkgLyAyKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJ0YWJsZSBzaXplICUiU0laRV9TUEVDSUZJRVIiIGRvZXMgbm90IG1hdGNoIG5lZWRlZCAlaVxuIiwKKyAgICAgICAgICAgICAgIHNpemVvZih0YWJsZSkgLyBzaXplb2YoVkxDX1RZUEUpIC8gMiwgb2Zmc2V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB4OF9zZWxlY3RfYWNfdGFibGUoSW50cmFYOENvbnRleHQgKiBjb25zdCB3ICwgaW50IG1vZGUpewotICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3Qgcz0gdy0+czsKK3N0YXRpYyB2b2lkIHg4X3Jlc2V0X3ZsY190YWJsZXMoSW50cmFYOENvbnRleHQgKncpCit7CisgICAgbWVtc2V0KHctPmpfZGNfdmxjLCAwLCBzaXplb2Yody0+al9kY192bGMpKTsKKyAgICBtZW1zZXQody0+al9hY192bGMsIDAsIHNpemVvZih3LT5qX2FjX3ZsYykpOworICAgIHctPmpfb3JpZW50X3ZsYyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4OF9zZWxlY3RfYWNfdGFibGUoSW50cmFYOENvbnRleHQgKmNvbnN0IHcsIGludCBtb2RlKQorewogICAgIGludCB0YWJsZV9pbmRleDsKIAotICAgIGF2X2Fzc2VydDIobW9kZTw0KTsKKyAgICBhdl9hc3NlcnQyKG1vZGUgPCA0KTsKIAotICAgIGlmKCB3LT5qX2FjX3ZsY1ttb2RlXSApIHJldHVybjsKKyAgICBpZiAody0+al9hY192bGNbbW9kZV0pCisgICAgICAgIHJldHVybjsKIAotICAgIHRhYmxlX2luZGV4ID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKLSAgICB3LT5qX2FjX3ZsY1ttb2RlXSA9ICZqX2FjX3ZsY1t3LT5xdWFudDwxM11bbW9kZT4+MV1bdGFibGVfaW5kZXhdOy8vMiBtb2RlcyB1c2Ugc2FtZSB0YWJsZXMKKyAgICB0YWJsZV9pbmRleCAgICAgICA9IGdldF9iaXRzKHctPmdiLCAzKTsKKyAgICAvLyAyIG1vZGVzIHVzZSBzYW1lIHRhYmxlcworICAgIHctPmpfYWNfdmxjW21vZGVdID0gJmpfYWNfdmxjW3ctPnF1YW50IDwgMTNdW21vZGUgPj4gMV1bdGFibGVfaW5kZXhdOwogICAgIGF2X2Fzc2VydDIody0+al9hY192bGNbbW9kZV0pOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB4OF9nZXRfb3JpZW50X3ZsYyhJbnRyYVg4Q29udGV4dCAqIHcpewotICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3Qgcz0gdy0+czsKLSAgICBpbnQgdGFibGVfaW5kZXg7Ci0KLSAgICBpZighdy0+al9vcmllbnRfdmxjICl7Ci0gICAgICAgIHRhYmxlX2luZGV4ID0gZ2V0X2JpdHMoJnMtPmdiLCAxKyh3LT5xdWFudDwxMykgKTsKLSAgICAgICAgdy0+al9vcmllbnRfdmxjID0gJmpfb3JpZW50X3ZsY1t3LT5xdWFudDwxM11bdGFibGVfaW5kZXhdOworc3RhdGljIGlubGluZSBpbnQgeDhfZ2V0X29yaWVudF92bGMoSW50cmFYOENvbnRleHQgKncpCit7CisgICAgaWYgKCF3LT5qX29yaWVudF92bGMpIHsKKyAgICAgICAgaW50IHRhYmxlX2luZGV4ID0gZ2V0X2JpdHMody0+Z2IsIDEgKyAody0+cXVhbnQgPCAxMykpOworICAgICAgICB3LT5qX29yaWVudF92bGMgPSAmal9vcmllbnRfdmxjW3ctPnF1YW50IDwgMTNdW3RhYmxlX2luZGV4XTsKICAgICB9CiAKLSAgICByZXR1cm4gZ2V0X3ZsYzIoJnMtPmdiLCB3LT5qX29yaWVudF92bGMtPnRhYmxlLCBPUl9WTENfQklUUywgT1JfVkxDX01URCk7CisgICAgcmV0dXJuIGdldF92bGMyKHctPmdiLCB3LT5qX29yaWVudF92bGMtPnRhYmxlLCBPUl9WTENfQklUUywgT1JfVkxDX01URCk7CiB9CiAKLSNkZWZpbmUgZXh0cmFfYml0cyhlYikgKGViKQotI2RlZmluZSBleHRyYV9ydW4gICAoMHhGRjw8OCkKLSNkZWZpbmUgZXh0cmFfbGV2ZWwgKDB4MDA8PDgpCi0jZGVmaW5lICAgcnVuX29mZnNldChyKSAgICAoKHIpPDwxNikKLSNkZWZpbmUgbGV2ZWxfb2Zmc2V0KGwpICAgICgobCk8PDI0KQotc3RhdGljIGNvbnN0IHVpbnQzMl90IGFjX2RlY29kZV90YWJsZVtdPXsKLSAgICAvKjQ2Ki8gZXh0cmFfYml0cygzKSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgxNikgfCBsZXZlbF9vZmZzZXQoIDApLAotICAgIC8qNDcqLyBleHRyYV9iaXRzKDMpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KDI0KSB8IGxldmVsX29mZnNldCggMCksCi0gICAgLyo0OCovIGV4dHJhX2JpdHMoMikgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoIDQpIHwgbGV2ZWxfb2Zmc2V0KCAxKSwKLSAgICAvKjQ5Ki8gZXh0cmFfYml0cygzKSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCggOCkgfCBsZXZlbF9vZmZzZXQoIDEpLAorI2RlZmluZSBleHRyYV9iaXRzKGViKSAgKGViKSAgICAgICAgLy8gMyBiaXRzCisjZGVmaW5lIGV4dHJhX3J1biAgICAgICAoMHhGRiA8PCA4KSAvLyAxIGJpdAorI2RlZmluZSBleHRyYV9sZXZlbCAgICAgKDB4MDAgPDwgOCkgLy8gMSBiaXQKKyNkZWZpbmUgcnVuX29mZnNldChyKSAgICgocikgPDwgMTYpIC8vIDYgYml0cworI2RlZmluZSBsZXZlbF9vZmZzZXQobCkgKChsKSA8PCAyNCkgLy8gNSBiaXRzCitzdGF0aWMgY29uc3QgdWludDMyX3QgYWNfZGVjb2RlX3RhYmxlW10gPSB7CisgICAgLyogNDYgKi8gZXh0cmFfYml0cygzKSB8IGV4dHJhX3J1biAgIHwgcnVuX29mZnNldCgxNikgfCBsZXZlbF9vZmZzZXQoMCksCisgICAgLyogNDcgKi8gZXh0cmFfYml0cygzKSB8IGV4dHJhX3J1biAgIHwgcnVuX29mZnNldCgyNCkgfCBsZXZlbF9vZmZzZXQoMCksCisgICAgLyogNDggKi8gZXh0cmFfYml0cygyKSB8IGV4dHJhX3J1biAgIHwgcnVuX29mZnNldCg0KSAgfCBsZXZlbF9vZmZzZXQoMSksCisgICAgLyogNDkgKi8gZXh0cmFfYml0cygzKSB8IGV4dHJhX3J1biAgIHwgcnVuX29mZnNldCg4KSAgfCBsZXZlbF9vZmZzZXQoMSksCiAKLSAgICAvKjUwKi8gZXh0cmFfYml0cyg1KSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgzMikgfCBsZXZlbF9vZmZzZXQoIDApLAotICAgIC8qNTEqLyBleHRyYV9iaXRzKDQpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KDE2KSB8IGxldmVsX29mZnNldCggMSksCisgICAgLyogNTAgKi8gZXh0cmFfYml0cyg1KSB8IGV4dHJhX3J1biAgIHwgcnVuX29mZnNldCgzMikgfCBsZXZlbF9vZmZzZXQoMCksCisgICAgLyogNTEgKi8gZXh0cmFfYml0cyg0KSB8IGV4dHJhX3J1biAgIHwgcnVuX29mZnNldCgxNikgfCBsZXZlbF9vZmZzZXQoMSksCiAKLSAgICAvKjUyKi8gZXh0cmFfYml0cygyKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMCkgfCBsZXZlbF9vZmZzZXQoIDQpLAotICAgIC8qNTMqLyBleHRyYV9iaXRzKDIpIHwgZXh0cmFfbGV2ZWwgfCBydW5fb2Zmc2V0KCAwKSB8IGxldmVsX29mZnNldCggOCksCi0gICAgLyo1NCovIGV4dHJhX2JpdHMoMikgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoIDApIHwgbGV2ZWxfb2Zmc2V0KDEyKSwKLSAgICAvKjU1Ki8gZXh0cmFfYml0cygzKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMCkgfCBsZXZlbF9vZmZzZXQoMTYpLAotICAgIC8qNTYqLyBleHRyYV9iaXRzKDMpIHwgZXh0cmFfbGV2ZWwgfCBydW5fb2Zmc2V0KCAwKSB8IGxldmVsX29mZnNldCgyNCksCisgICAgLyogNTIgKi8gZXh0cmFfYml0cygyKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCgwKSAgfCBsZXZlbF9vZmZzZXQoNCksCisgICAgLyogNTMgKi8gZXh0cmFfYml0cygyKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCgwKSAgfCBsZXZlbF9vZmZzZXQoOCksCisgICAgLyogNTQgKi8gZXh0cmFfYml0cygyKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCgwKSAgfCBsZXZlbF9vZmZzZXQoMTIpLAorICAgIC8qIDU1ICovIGV4dHJhX2JpdHMoMykgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoMCkgIHwgbGV2ZWxfb2Zmc2V0KDE2KSwKKyAgICAvKiA1NiAqLyBleHRyYV9iaXRzKDMpIHwgZXh0cmFfbGV2ZWwgfCBydW5fb2Zmc2V0KDApICB8IGxldmVsX29mZnNldCgyNCksCiAKLSAgICAvKjU3Ki8gZXh0cmFfYml0cygyKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMSkgfCBsZXZlbF9vZmZzZXQoIDMpLAotICAgIC8qNTgqLyBleHRyYV9iaXRzKDMpIHwgZXh0cmFfbGV2ZWwgfCBydW5fb2Zmc2V0KCAxKSB8IGxldmVsX29mZnNldCggNyksCisgICAgLyogNTcgKi8gZXh0cmFfYml0cygyKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCgxKSAgfCBsZXZlbF9vZmZzZXQoMyksCisgICAgLyogNTggKi8gZXh0cmFfYml0cygzKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCgxKSAgfCBsZXZlbF9vZmZzZXQoNyksCiAKLSAgICAvKjU5Ki8gZXh0cmFfYml0cygyKSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgxNikgfCBsZXZlbF9vZmZzZXQoIDApLAotICAgIC8qNjAqLyBleHRyYV9iaXRzKDIpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KDIwKSB8IGxldmVsX29mZnNldCggMCksCi0gICAgLyo2MSovIGV4dHJhX2JpdHMoMikgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoMjQpIHwgbGV2ZWxfb2Zmc2V0KCAwKSwKLSAgICAvKjYyKi8gZXh0cmFfYml0cygyKSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgyOCkgfCBsZXZlbF9vZmZzZXQoIDApLAotICAgIC8qNjMqLyBleHRyYV9iaXRzKDQpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KDMyKSB8IGxldmVsX29mZnNldCggMCksCi0gICAgLyo2NCovIGV4dHJhX2JpdHMoNCkgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoNDgpIHwgbGV2ZWxfb2Zmc2V0KCAwKSwKKyAgICAvKiA1OSAqLyBleHRyYV9iaXRzKDIpIHwgZXh0cmFfcnVuICAgfCBydW5fb2Zmc2V0KDE2KSB8IGxldmVsX29mZnNldCgwKSwKKyAgICAvKiA2MCAqLyBleHRyYV9iaXRzKDIpIHwgZXh0cmFfcnVuICAgfCBydW5fb2Zmc2V0KDIwKSB8IGxldmVsX29mZnNldCgwKSwKKyAgICAvKiA2MSAqLyBleHRyYV9iaXRzKDIpIHwgZXh0cmFfcnVuICAgfCBydW5fb2Zmc2V0KDI0KSB8IGxldmVsX29mZnNldCgwKSwKKyAgICAvKiA2MiAqLyBleHRyYV9iaXRzKDIpIHwgZXh0cmFfcnVuICAgfCBydW5fb2Zmc2V0KDI4KSB8IGxldmVsX29mZnNldCgwKSwKKyAgICAvKiA2MyAqLyBleHRyYV9iaXRzKDQpIHwgZXh0cmFfcnVuICAgfCBydW5fb2Zmc2V0KDMyKSB8IGxldmVsX29mZnNldCgwKSwKKyAgICAvKiA2NCAqLyBleHRyYV9iaXRzKDQpIHwgZXh0cmFfcnVuICAgfCBydW5fb2Zmc2V0KDQ4KSB8IGxldmVsX29mZnNldCgwKSwKIAotICAgIC8qNjUqLyBleHRyYV9iaXRzKDIpIHwgIGV4dHJhX3J1biAgfCBydW5fb2Zmc2V0KCA0KSB8IGxldmVsX29mZnNldCggMSksCi0gICAgLyo2NiovIGV4dHJhX2JpdHMoMykgfCAgZXh0cmFfcnVuICB8IHJ1bl9vZmZzZXQoIDgpIHwgbGV2ZWxfb2Zmc2V0KCAxKSwKLSAgICAvKjY3Ki8gZXh0cmFfYml0cyg0KSB8ICBleHRyYV9ydW4gIHwgcnVuX29mZnNldCgxNikgfCBsZXZlbF9vZmZzZXQoIDEpLAorICAgIC8qIDY1ICovIGV4dHJhX2JpdHMoMikgfCBleHRyYV9ydW4gICB8IHJ1bl9vZmZzZXQoNCkgIHwgbGV2ZWxfb2Zmc2V0KDEpLAorICAgIC8qIDY2ICovIGV4dHJhX2JpdHMoMykgfCBleHRyYV9ydW4gICB8IHJ1bl9vZmZzZXQoOCkgIHwgbGV2ZWxfb2Zmc2V0KDEpLAorICAgIC8qIDY3ICovIGV4dHJhX2JpdHMoNCkgfCBleHRyYV9ydW4gICB8IHJ1bl9vZmZzZXQoMTYpIHwgbGV2ZWxfb2Zmc2V0KDEpLAogCi0gICAgLyo2OCovIGV4dHJhX2JpdHMoMikgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoIDApIHwgbGV2ZWxfb2Zmc2V0KCA0KSwKLSAgICAvKjY5Ki8gZXh0cmFfYml0cygzKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMCkgfCBsZXZlbF9vZmZzZXQoIDgpLAotICAgIC8qNzAqLyBleHRyYV9iaXRzKDQpIHwgZXh0cmFfbGV2ZWwgfCBydW5fb2Zmc2V0KCAwKSB8IGxldmVsX29mZnNldCgxNiksCisgICAgLyogNjggKi8gZXh0cmFfYml0cygyKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCgwKSAgfCBsZXZlbF9vZmZzZXQoNCksCisgICAgLyogNjkgKi8gZXh0cmFfYml0cygzKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCgwKSAgfCBsZXZlbF9vZmZzZXQoOCksCisgICAgLyogNzAgKi8gZXh0cmFfYml0cyg0KSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCgwKSAgfCBsZXZlbF9vZmZzZXQoMTYpLAogCi0gICAgLyo3MSovIGV4dHJhX2JpdHMoMikgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoIDEpIHwgbGV2ZWxfb2Zmc2V0KCAzKSwKLSAgICAvKjcyKi8gZXh0cmFfYml0cygzKSB8IGV4dHJhX2xldmVsIHwgcnVuX29mZnNldCggMSkgfCBsZXZlbF9vZmZzZXQoIDcpLAorICAgIC8qIDcxICovIGV4dHJhX2JpdHMoMikgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoMSkgIHwgbGV2ZWxfb2Zmc2V0KDMpLAorICAgIC8qIDcyICovIGV4dHJhX2JpdHMoMykgfCBleHRyYV9sZXZlbCB8IHJ1bl9vZmZzZXQoMSkgIHwgbGV2ZWxfb2Zmc2V0KDcpLAogfTsKLS8vZXh0cmFfYml0cyA9IDNiaXRzOyBleHRyYV9ydW4vbGV2ZWwgPSAxIGJpdDsgcnVuX29mZnNldCA9IDZiaXRzOyBsZXZlbF9vZmZzZXQgPSA1IGJpdHM7CiAjdW5kZWYgZXh0cmFfYml0cwogI3VuZGVmIGV4dHJhX3J1bgogI3VuZGVmIGV4dHJhX2xldmVsCiAjdW5kZWYgcnVuX29mZnNldAogI3VuZGVmIGxldmVsX29mZnNldAogCi1zdGF0aWMgdm9pZCB4OF9nZXRfYWNfcmxmKEludHJhWDhDb250ZXh0ICogY29uc3QgdywgY29uc3QgaW50IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgKiBjb25zdCBydW4sIGludCAqIGNvbnN0IGxldmVsLCBpbnQgKiBjb25zdCBmaW5hbCl7Ci0gICAgTXBlZ0VuY0NvbnRleHQgKiAgY29uc3Qgcz0gdy0+czsKLSAgICBpbnQgaSxlOworc3RhdGljIHZvaWQgeDhfZ2V0X2FjX3JsZihJbnRyYVg4Q29udGV4dCAqY29uc3QgdywgY29uc3QgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29uc3QgcnVuLCBpbnQgKmNvbnN0IGxldmVsLCBpbnQgKmNvbnN0IGZpbmFsKQoreworICAgIGludCBpLCBlOwogCi0vLyAgICB4OF9zZWxlY3RfYWNfdGFibGUodyxtb2RlKTsKLSAgICBpID0gZ2V0X3ZsYzIoJnMtPmdiLCB3LT5qX2FjX3ZsY1ttb2RlXS0+dGFibGUsIEFDX1ZMQ19CSVRTLCBBQ19WTENfTVREKTsKKy8vICAgIHg4X3NlbGVjdF9hY190YWJsZSh3LCBtb2RlKTsKKyAgICBpID0gZ2V0X3ZsYzIody0+Z2IsIHctPmpfYWNfdmxjW21vZGVdLT50YWJsZSwgQUNfVkxDX0JJVFMsIEFDX1ZMQ19NVEQpOwogCi0gICAgaWYoaTw0Nil7IC8vWzAtNDVdCi0gICAgICAgIGludCB0LGw7Ci0gICAgICAgIGlmKGk8MCl7Ci0gICAgICAgICAgICAoKmxldmVsKT0oKmZpbmFsKT0vL3ByZXZlbnQgJ21heSBiZSB1c2VkIHVuaWxpdGlhbGl6ZWQnCi0gICAgICAgICAgICAoKnJ1bik9NjQ7Ly90aGlzIHdvdWxkIGNhdXNlIGVycm9yIGV4aXQgaW4gdGhlIGFjIGxvb3AKKyAgICBpZiAoaSA8IDQ2KSB7IC8vIFswLTQ1XQorICAgICAgICBpbnQgdCwgbDsKKyAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICAqbGV2ZWwgPQorICAgICAgICAgICAgKmZpbmFsID0gICAgICAvLyBwcmV2ZW50ICdtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkJworICAgICAgICAgICAgKnJ1biAgID0gNjQ7ICAvLyB0aGlzIHdvdWxkIGNhdXNlIGVycm9yIGV4aXQgaW4gdGhlIGFjIGxvb3AKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgICgqZmluYWwpID0gdCA9IChpPjIyKTsKLSAgICAgICAgaS09MjMqdDsKLS8qCi0gIGk9PSAwLTE1IHI9MC0xNSBsPTAgO3I9aSYgJTAxMTExCi0gIGk9PTE2LTE5IHI9MC0zICBsPTEgO3I9aSYgJTAwMDExCi0gIGk9PTIwLTIxIHI9MC0xICBsPTIgO3I9aSYgJTAwMDAxCi0gIGk9PTIyICAgIHI9MCAgICBsPTMgO3I9aSYgJTAwMDAwCi1sPWx1dF9sW2kvMl09ezAsMCwwLDAsMCwwLDAsMCwxLDEsMiwzfVtpPj4xXTsvLyAxMSAxMCcwMSAwMScwMCAwMCcwMCAwMCcwMCAwMCcwMCAwMCA9PiAweEU1MDAwMAotdD1sdXRfbWFza1tsXT17MHgwZiwweDAzLDB4MDEsMHgwMH1bbF07IGFzIGk8MjU2IHRoZSBoaWdoZXIgYml0cyBkbyBub3QgbWF0dGVyICovCi0gICAgICAgIGw9KDB4RTUwMDAwPj4oaSYoMHgxRSkpKSYzOy8qMHgxRSBvciAofjEpIG9yICgoaT4+MSk8PDEpKi8KLSAgICAgICAgdD0oMHgwMTAzMEY+PihsPDwzKSk7CisgICAgICAgIC8qCisgICAgICAgICAqIGkgPT0gMC0xNSAgciA9IDAtMTUgbCA9IDA7IHIgPSBpICYgJTAxMTExCisgICAgICAgICAqIGkgPT0gMTYtMTkgciA9IDAtMyAgbCA9IDE7IHIgPSBpICYgJTAwMDExCisgICAgICAgICAqIGkgPT0gMjAtMjEgciA9IDAtMSAgbCA9IDI7IHIgPSBpICYgJTAwMDAxCisgICAgICAgICAqIGkgPT0gMjIgICAgciA9IDAgICAgbCA9IDM7IHIgPSBpICYgJTAwMDAwCisgICAgICAgICAqLwogCi0gICAgICAgICgqcnVuKSAgID0gaSZ0OwotICAgICAgICAoKmxldmVsKSA9IGw7Ci0gICAgfWVsc2UgaWYoaTw3Myl7Ly9bNDYtNzJdCisgICAgICAgICpmaW5hbCA9CisgICAgICAgIHQgICAgICA9IGkgPiAyMjsKKyAgICAgICAgaSAgICAgLT0gMjMgKiB0OworCisgICAgICAgIC8qIGwgPSBsdXRfbFtpIC8gMl0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDIsIDMgfVtpID4+IDFdOworICAgICAgICAgKiAgICAgMTEgMTAnMDEgMDEnMDAgMDAnMDAgMDAnMDAgMDAnMDAgMDAgPT4gMHhFNTAwMDAgKi8KKyAgICAgICAgbCA9ICgweEU1MDAwMCA+PiAoaSAmIDB4MUUpKSAmIDM7IC8vIDB4MUUgb3IgfjEgb3IgKGkgPj4gMSA8PCAxKQorCisgICAgICAgIC8qIHQgPSBsdXRfbWFza1tsXSA9IHsgMHgwZiwgMHgwMywgMHgwMSwgMHgwMCB9W2xdOworICAgICAgICAgKiAgICAgYXMgaSA8IDI1NiB0aGUgaGlnaGVyIGJpdHMgZG8gbm90IG1hdHRlciAqLworICAgICAgICB0ID0gMHgwMTAzMEYgPj4gKGwgPDwgMyk7CisKKyAgICAgICAgKnJ1biAgID0gaSAmIHQ7CisgICAgICAgICpsZXZlbCA9IGw7CisgICAgfSBlbHNlIGlmIChpIDwgNzMpIHsgLy8gWzQ2LTcyXQogICAgICAgICB1aW50MzJfdCBzbTsKICAgICAgICAgdWludDMyX3QgbWFzazsKIAotICAgICAgICBpLT00NjsKLSAgICAgICAgc209YWNfZGVjb2RlX3RhYmxlW2ldOworICAgICAgICBpIC09IDQ2OworICAgICAgICBzbSA9IGFjX2RlY29kZV90YWJsZVtpXTsKIAotICAgICAgICBlPWdldF9iaXRzKCZzLT5nYixzbSYweEYpO3NtPj49ODsvLzNiaXRzCi0gICAgICAgIG1hc2s9c20mMHhmZjtzbT4+PTg7ICAgICAgICAgICAgIC8vMWJpdAorICAgICAgICBlICAgID0gZ2V0X2JpdHMody0+Z2IsIHNtICYgMHhGKTsKKyAgICAgICAgc20gPj49IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMgYml0cworICAgICAgICBtYXNrID0gc20gJiAweGZmOworICAgICAgICBzbSA+Pj0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSBiaXQKIAotICAgICAgICAoKnJ1bikgID0oc20mMHhmZikgKyAoZSYoIG1hc2spKTsvLzZiaXRzCi0gICAgICAgICgqbGV2ZWwpPShzbT4+OCkgICArIChlJih+bWFzaykpOy8vNWJpdHMKLSAgICAgICAgKCpmaW5hbCk9aT4oNTgtNDYpOwotICAgIH1lbHNlIGlmKGk8NzUpey8vWzczLTc0XQotICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjcmF6eV9taXhfcnVubGV2ZWxbMzJdPXsKLSAgICAgICAgMHgyMiwweDMyLDB4MzMsMHg1MywweDIzLDB4NDIsMHg0MywweDYzLAotICAgICAgICAweDI0LDB4NTIsMHgzNCwweDczLDB4MjUsMHg2MiwweDQ0LDB4ODMsCi0gICAgICAgIDB4MjYsMHg3MiwweDM1LDB4NTQsMHgyNywweDgyLDB4NDUsMHg2NCwKLSAgICAgICAgMHgyOCwweDkyLDB4MzYsMHg3NCwweDI5LDB4YTIsMHg0NiwweDg0fTsKKyAgICAgICAgKnJ1biAgID0gKHNtICYgIDB4ZmYpICsgKGUgJiAgbWFzayk7ICAgIC8vIDYgYml0cworICAgICAgICAqbGV2ZWwgPSAoc20gPj4gICAgOCkgKyAoZSAmIH5tYXNrKTsgICAgLy8gNSBiaXRzCisgICAgICAgICpmaW5hbCA9IGkgPiAoNTggLSA0Nik7CisgICAgfSBlbHNlIGlmIChpIDwgNzUpIHsgLy8gWzczLTc0XQorICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBjcmF6eV9taXhfcnVubGV2ZWxbMzJdID0geworICAgICAgICAgICAgMHgyMiwgMHgzMiwgMHgzMywgMHg1MywgMHgyMywgMHg0MiwgMHg0MywgMHg2MywKKyAgICAgICAgICAgIDB4MjQsIDB4NTIsIDB4MzQsIDB4NzMsIDB4MjUsIDB4NjIsIDB4NDQsIDB4ODMsCisgICAgICAgICAgICAweDI2LCAweDcyLCAweDM1LCAweDU0LCAweDI3LCAweDgyLCAweDQ1LCAweDY0LAorICAgICAgICAgICAgMHgyOCwgMHg5MiwgMHgzNiwgMHg3NCwgMHgyOSwgMHhhMiwgMHg0NiwgMHg4NCwKKyAgICAgICAgfTsKIAotICAgICAgICAoKmZpbmFsKT0hKGkmMSk7Ci0gICAgICAgIGU9Z2V0X2JpdHMoJnMtPmdiLDUpOy8vZ2V0IHRoZSBleHRyYSBiaXRzCi0gICAgICAgICgqcnVuKSAgPWNyYXp5X21peF9ydW5sZXZlbFtlXT4+NDsKLSAgICAgICAgKCpsZXZlbCk9Y3JhenlfbWl4X3J1bmxldmVsW2VdJjB4MEY7Ci0gICAgfWVsc2V7Ci0gICAgICAgICgqbGV2ZWwpPWdldF9iaXRzKCAmcy0+Z2IsIDctMyooaSYxKSk7Ci0gICAgICAgICgqcnVuKSAgPWdldF9iaXRzKCAmcy0+Z2IsIDYpOwotICAgICAgICAoKmZpbmFsKT1nZXRfYml0czEoJnMtPmdiKTsKKyAgICAgICAgKmZpbmFsID0gIShpICYgMSk7CisgICAgICAgIGUgICAgICA9IGdldF9iaXRzKHctPmdiLCA1KTsgLy8gZ2V0IHRoZSBleHRyYSBiaXRzCisgICAgICAgICpydW4gICA9IGNyYXp5X21peF9ydW5sZXZlbFtlXSA+PiA0OworICAgICAgICAqbGV2ZWwgPSBjcmF6eV9taXhfcnVubGV2ZWxbZV0gJiAweDBGOworICAgIH0gZWxzZSB7CisgICAgICAgICpsZXZlbCA9IGdldF9iaXRzKHctPmdiLCA3IC0gMyAqIChpICYgMSkpOworICAgICAgICAqcnVuICAgPSBnZXRfYml0cyh3LT5nYiwgNik7CisgICAgICAgICpmaW5hbCA9IGdldF9iaXRzMSh3LT5nYik7CiAgICAgfQogICAgIHJldHVybjsKIH0KIAotLy9zdGF0aWMgY29uc3QgdWludDhfdCBkY19leHRyYV9zYml0c1tdICAgPXswLCAxLDEsIDEsMSwgMiwyLCAzLDMsICAgNCw0LCAgIDUsNSwgICA2LDYsICAgIDcsNyAgICB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGNfaW5kZXhfb2Zmc2V0W10gID17IDAsIDEsMiwgMyw0LCA1LDcsIDksMTMsIDE3LDI1LCAzMyw0OSwgNjUsOTcsIDEyOSwxOTN9OworLyogc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGNfZXh0cmFfc2JpdHNbXSA9IHsKKyAqICAgICAwLCAxLCAxLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LAorICogfTsgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGRjX2luZGV4X29mZnNldFtdID0geworICAgIDAsIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKK307CiAKLXN0YXRpYyBpbnQgeDhfZ2V0X2RjX3JsZihJbnRyYVg4Q29udGV4dCAqIGNvbnN0IHcsaW50IGNvbnN0IG1vZGUsIGludCAqIGNvbnN0IGxldmVsLCBpbnQgKiBjb25zdCBmaW5hbCl7Ci0gICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzPSB3LT5zOwotICAgIGludCBpLGUsYzsKK3N0YXRpYyBpbnQgeDhfZ2V0X2RjX3JsZihJbnRyYVg4Q29udGV4dCAqY29uc3QgdywgY29uc3QgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb25zdCBsZXZlbCwgaW50ICpjb25zdCBmaW5hbCkKK3sKKyAgICBpbnQgaSwgZSwgYzsKIAotICAgIGF2X2Fzc2VydDIobW9kZTwzKTsKLSAgICBpZiggIXctPmpfZGNfdmxjW21vZGVdICkgewotICAgICAgICBpbnQgdGFibGVfaW5kZXg7Ci0gICAgICAgIHRhYmxlX2luZGV4ID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKLSAgICAgICAgLy80IG1vZGVzLCBzYW1lIHRhYmxlCi0gICAgICAgIHctPmpfZGNfdmxjW21vZGVdPSAmal9kY192bGNbdy0+cXVhbnQ8MTNdW3RhYmxlX2luZGV4XTsKKyAgICBhdl9hc3NlcnQyKG1vZGUgPCAzKTsKKyAgICBpZiAoIXctPmpfZGNfdmxjW21vZGVdKSB7CisgICAgICAgIGludCB0YWJsZV9pbmRleCA9IGdldF9iaXRzKHctPmdiLCAzKTsKKyAgICAgICAgLy8gNCBtb2Rlcywgc2FtZSB0YWJsZQorICAgICAgICB3LT5qX2RjX3ZsY1ttb2RlXSA9ICZqX2RjX3ZsY1t3LT5xdWFudCA8IDEzXVt0YWJsZV9pbmRleF07CiAgICAgfQogCi0gICAgaT1nZXRfdmxjMigmcy0+Z2IsIHctPmpfZGNfdmxjW21vZGVdLT50YWJsZSwgRENfVkxDX0JJVFMsIERDX1ZMQ19NVEQpOworICAgIGkgPSBnZXRfdmxjMih3LT5nYiwgdy0+al9kY192bGNbbW9kZV0tPnRhYmxlLCBEQ19WTENfQklUUywgRENfVkxDX01URCk7CiAKLSAgICAvKihpPj0xNykge2ktPTE3O2ZpbmFsPTE7fSovCi0gICAgYz0gaT4xNjsKLSAgICAoKmZpbmFsKT1jOwotICAgIGktPTE3KmM7CisgICAgLyogKGkgPj0gMTcpIHsgaSAtPSAxNzsgZmluYWwgPTE7IH0gKi8KKyAgICBjICAgICAgPSBpID4gMTY7CisgICAgKmZpbmFsID0gYzsKKyAgICBpICAgICAgLT0gMTcgKiBjOwogCi0gICAgaWYoaTw9MCl7Ci0gICAgICAgICgqbGV2ZWwpPTA7CisgICAgaWYgKGkgPD0gMCkgeworICAgICAgICAqbGV2ZWwgPSAwOwogICAgICAgICByZXR1cm4gLWk7CiAgICAgfQotICAgIGM9KGkrMSk+PjE7Ly9oYWNraXNoIHdheSB0byBjYWxjdWxhdGUgZGNfZXh0cmFfc2JpdHNbXQotICAgIGMtPWM+MTsKKyAgICBjICA9IChpICsgMSkgPj4gMTsgLy8gaGFja2lzaCB3YXkgdG8gY2FsY3VsYXRlIGRjX2V4dHJhX3NiaXRzW10KKyAgICBjIC09IGMgPiAxOwogCi0gICAgZT1nZXRfYml0cygmcy0+Z2IsYyk7Ly9nZXQgdGhlIGV4dHJhIGJpdHMKLSAgICBpPWRjX2luZGV4X29mZnNldFtpXSsoZT4+MSk7CisgICAgZSA9IGdldF9iaXRzKHctPmdiLCBjKTsgLy8gZ2V0IHRoZSBleHRyYSBiaXRzCisgICAgaSA9IGRjX2luZGV4X29mZnNldFtpXSArIChlID4+IDEpOwogCi0gICAgZT0gLShlICYgMSk7Ly8wLDB4ZmZmZmZmCi0gICAgKCpsZXZlbCk9IChpIF4gZSkgLSBlOy8vIChpXjApLTAgLCAoaV4weGZmKS0oLTEpCisgICAgZSAgICAgID0gLShlICYgMSk7ICAgICAvLyAwLCAweGZmZmZmZgorICAgICpsZXZlbCA9ICAoaSBeIGUpIC0gZTsgLy8gKGkgXiAwKSAtIDAsIChpIF4gMHhmZikgLSAoLTEpCiAgICAgcmV0dXJuIDA7CiB9Ci0vL2VuZCBvZiBodWZmbWFuCiAKLXN0YXRpYyBpbnQgeDhfc2V0dXBfc3BhdGlhbF9wcmVkaWN0b3IoSW50cmFYOENvbnRleHQgKiBjb25zdCB3LCBjb25zdCBpbnQgY2hyb21hKXsKLSAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHM9IHctPnM7CisvLyBlbmQgb2YgaHVmZm1hbgorCitzdGF0aWMgaW50IHg4X3NldHVwX3NwYXRpYWxfcHJlZGljdG9yKEludHJhWDhDb250ZXh0ICpjb25zdCB3LCBjb25zdCBpbnQgY2hyb21hKQorewogICAgIGludCByYW5nZTsKICAgICBpbnQgc3VtOwogICAgIGludCBxdWFudDsKIAotICAgIHctPmRzcC5zZXR1cF9zcGF0aWFsX2NvbXBlbnNhdGlvbihzLT5kZXN0W2Nocm9tYV0sIHMtPnNjLmVkZ2VfZW11X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplW2Nocm9tYT4wXSwKKyAgICB3LT5kc3Auc2V0dXBfc3BhdGlhbF9jb21wZW5zYXRpb24ody0+ZGVzdFtjaHJvbWFdLCB3LT5zY3JhdGNocGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5mcmFtZS0+bGluZXNpemVbY2hyb21hID4gMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyYW5nZSwgJnN1bSwgdy0+ZWRnZXMpOwotICAgIGlmKGNocm9tYSl7Ci0gICAgICAgIHctPm9yaWVudD13LT5jaHJvbWFfb3JpZW50OwotICAgICAgICBxdWFudD13LT5xdWFudF9kY19jaHJvbWE7Ci0gICAgfWVsc2V7Ci0gICAgICAgIHF1YW50PXctPnF1YW50OworICAgIGlmIChjaHJvbWEpIHsKKyAgICAgICAgdy0+b3JpZW50ID0gdy0+Y2hyb21hX29yaWVudDsKKyAgICAgICAgcXVhbnQgICAgID0gdy0+cXVhbnRfZGNfY2hyb21hOworICAgIH0gZWxzZSB7CisgICAgICAgIHF1YW50ID0gdy0+cXVhbnQ7CiAgICAgfQogCi0gICAgdy0+ZmxhdF9kYz0wOwotICAgIGlmKHJhbmdlIDwgcXVhbnQgfHwgcmFuZ2UgPCAzKXsKLSAgICAgICAgdy0+b3JpZW50PTA7Ci0gICAgICAgIGlmKHJhbmdlIDwgMyl7Ly95ZXAgeW91IHJlYWQgcmlnaHQsIGEgKy0xIGlkY3QgZXJyb3IgbWF5IGJyZWFrIGRlY29kaW5nIQotICAgICAgICAgICAgdy0+ZmxhdF9kYz0xOwotICAgICAgICAgICAgc3VtKz05OwotICAgICAgICAgICAgdy0+cHJlZGljdGVkX2RjID0gKHN1bSo2ODk5KT4+MTc7Ly8oKDE8PDE3KSs5KS8oOCs4KzErMik9Njg5OQorICAgIHctPmZsYXRfZGMgPSAwOworICAgIGlmIChyYW5nZSA8IHF1YW50IHx8IHJhbmdlIDwgMykgeworICAgICAgICB3LT5vcmllbnQgPSAwOworCisgICAgICAgIC8vIHllcCB5b3UgcmVhZCByaWdodCwgYSArLTEgaWRjdCBlcnJvciBtYXkgYnJlYWsgZGVjb2RpbmchCisgICAgICAgIGlmIChyYW5nZSA8IDMpIHsKKyAgICAgICAgICAgIHctPmZsYXRfZGMgICAgICA9IDE7CisgICAgICAgICAgICBzdW0gICAgICAgICAgICArPSA5OworICAgICAgICAgICAgLy8gKCgxIDw8IDE3KSArIDkpIC8gKDggKyA4ICsgMSArIDIpID0gNjg5OQorICAgICAgICAgICAgdy0+cHJlZGljdGVkX2RjID0gc3VtICogNjg5OSA+PiAxNzsKICAgICAgICAgfQogICAgIH0KLSAgICBpZihjaHJvbWEpCisgICAgaWYgKGNocm9tYSkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBhdl9hc3NlcnQyKHctPm9yaWVudCA8IDMpOwotICAgIGlmKHJhbmdlIDwgMip3LT5xdWFudCl7Ci0gICAgICAgIGlmKCAody0+ZWRnZXMmMykgPT0gMCl7Ci0gICAgICAgICAgICBpZih3LT5vcmllbnQ9PTEpIHctPm9yaWVudD0xMTsKLSAgICAgICAgICAgIGlmKHctPm9yaWVudD09Mikgdy0+b3JpZW50PTEwOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIHctPm9yaWVudD0wOworICAgIGlmIChyYW5nZSA8IDIgKiB3LT5xdWFudCkgeworICAgICAgICBpZiAoKHctPmVkZ2VzICYgMykgPT0gMCkgeworICAgICAgICAgICAgaWYgKHctPm9yaWVudCA9PSAxKQorICAgICAgICAgICAgICAgIHctPm9yaWVudCA9IDExOworICAgICAgICAgICAgaWYgKHctPm9yaWVudCA9PSAyKQorICAgICAgICAgICAgICAgIHctPm9yaWVudCA9IDEwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdy0+b3JpZW50ID0gMDsKICAgICAgICAgfQotICAgICAgICB3LT5yYXdfb3JpZW50PTA7Ci0gICAgfWVsc2V7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHByZWRpY3Rpb25fdGFibGVbM11bMTJdPXsKLSAgICAgICAgICAgIHswLDgsNCwgMTAsMTEsIDIsNiw5LDEsMyw1LDd9LAotICAgICAgICAgICAgezQsMCw4LCAxMSwxMCwgMyw1LDIsNiw5LDEsN30sCi0gICAgICAgICAgICB7OCwwLDQsIDEwLDExLCAxLDcsMiw2LDksMyw1fQorICAgICAgICB3LT5yYXdfb3JpZW50ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBwcmVkaWN0aW9uX3RhYmxlWzNdWzEyXSA9IHsKKyAgICAgICAgICAgIHsgMCwgOCwgNCwgMTAsIDExLCAyLCA2LCA5LCAxLCAzLCA1LCA3IH0sCisgICAgICAgICAgICB7IDQsIDAsIDgsIDExLCAxMCwgMywgNSwgMiwgNiwgOSwgMSwgNyB9LAorICAgICAgICAgICAgeyA4LCAwLCA0LCAxMCwgMTEsIDEsIDcsIDIsIDYsIDksIDMsIDUgfSwKICAgICAgICAgfTsKLSAgICAgICAgdy0+cmF3X29yaWVudD14OF9nZXRfb3JpZW50X3ZsYyh3KTsKLSAgICAgICAgaWYody0+cmF3X29yaWVudDwwKSByZXR1cm4gLTE7Ci0gICAgICAgIGF2X2Fzc2VydDIody0+cmF3X29yaWVudCA8IDEyICk7Ci0gICAgICAgIGF2X2Fzc2VydDIody0+b3JpZW50PDMpOworICAgICAgICB3LT5yYXdfb3JpZW50ID0geDhfZ2V0X29yaWVudF92bGModyk7CisgICAgICAgIGlmICh3LT5yYXdfb3JpZW50IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYXZfYXNzZXJ0Mih3LT5yYXdfb3JpZW50IDwgMTIpOworICAgICAgICBhdl9hc3NlcnQyKHctPm9yaWVudCA8IDMpOwogICAgICAgICB3LT5vcmllbnQ9cHJlZGljdGlvbl90YWJsZVt3LT5vcmllbnRdW3ctPnJhd19vcmllbnRdOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgeDhfdXBkYXRlX3ByZWRpY3Rpb25zKEludHJhWDhDb250ZXh0ICogY29uc3QgdywgY29uc3QgaW50IG9yaWVudCwgY29uc3QgaW50IGVzdF9ydW4gKXsKLSAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHM9IHctPnM7Ci0KLSAgICB3LT5wcmVkaWN0aW9uX3RhYmxlW3MtPm1iX3gqMisocy0+bWJfeSYxKV0gPSAoZXN0X3J1bjw8MikgKyAxKihvcmllbnQ9PTQpICsgMioob3JpZW50PT04KTsKK3N0YXRpYyB2b2lkIHg4X3VwZGF0ZV9wcmVkaWN0aW9ucyhJbnRyYVg4Q29udGV4dCAqY29uc3QgdywgY29uc3QgaW50IG9yaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZXN0X3J1bikKK3sKKyAgICB3LT5wcmVkaWN0aW9uX3RhYmxlW3ctPm1iX3ggKiAyICsgKHctPm1iX3kgJiAxKV0gPSAoZXN0X3J1biA8PCAyKSArIDEgKiAob3JpZW50ID09IDQpICsgMiAqIChvcmllbnQgPT0gOCk7CiAvKgotICB5PTJuKzAgLT4vLzAgMiA0Ci0gIHk9Mm4rMSAtPi8vMSAzIDUKLSovCisgKiB5ID0gMm4gKyAwIC0+IC8vIDAgMiA0CisgKiB5ID0gMm4gKyAxIC0+IC8vIDEgMyA1CisgKi8KIH0KLXN0YXRpYyB2b2lkIHg4X2dldF9wcmVkaWN0aW9uX2Nocm9tYShJbnRyYVg4Q29udGV4dCAqIGNvbnN0IHcpewotICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3Qgcz0gdy0+czsKIAotICAgIHctPmVkZ2VzID0gMSooICEocy0+bWJfeD4+MSkgKTsKLSAgICB3LT5lZGdlc3w9IDIqKCAhKHMtPm1iX3k+PjEpICk7Ci0gICAgdy0+ZWRnZXN8PSA0Kiggcy0+bWJfeCA+PSAoMipzLT5tYl93aWR0aC0xKSApOy8vbWJfeCBmb3IgY2hyb21hIHdvdWxkIGFsd2F5cyBiZSBvZGQKK3N0YXRpYyB2b2lkIHg4X2dldF9wcmVkaWN0aW9uX2Nocm9tYShJbnRyYVg4Q29udGV4dCAqY29uc3QgdykKK3sKKyAgICB3LT5lZGdlcyAgPSAxICogISh3LT5tYl94ID4+IDEpOworICAgIHctPmVkZ2VzIHw9IDIgKiAhKHctPm1iX3kgPj4gMSk7CisgICAgdy0+ZWRnZXMgfD0gNCAqICh3LT5tYl94ID49ICgyICogdy0+bWJfd2lkdGggLSAxKSk7IC8vIG1iX3ggZm9yIGNocm9tYSB3b3VsZCBhbHdheXMgYmUgb2RkCiAKLSAgICB3LT5yYXdfb3JpZW50PTA7Ci0gICAgaWYody0+ZWRnZXMmMyl7Ly9sdXRfY29bOF09e2ludiw0LDgsOCwgaW52LDQsOCw4fTwtID0+ezEsMSwwLDA7MSwxLDAsMH0gPT4gMHhDQwotICAgICAgICB3LT5jaHJvbWFfb3JpZW50PTQ8PCgoMHhDQz4+dy0+ZWRnZXMpJjEpOworICAgIHctPnJhd19vcmllbnQgPSAwOworICAgIC8vIGx1dF9jb1s4XSA9IHtpbnYsNCw4LDgsIGludiw0LDgsOH0gPC0gPT4gezEsMSwwLDA7MSwxLDAsMH0gPT4gMHhDQworICAgIGlmICh3LT5lZGdlcyAmIDMpIHsKKyAgICAgICAgdy0+Y2hyb21hX29yaWVudCA9IDQgPDwgKCgweENDID4+IHctPmVkZ2VzKSAmIDEpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHctPmNocm9tYV9vcmllbnQgPSAody0+cHJlZGljdGlvbl90YWJsZVsyKnMtPm1iX3gtMl0gJiAweDAzKTw8MjsvL2Jsb2NrW3gtMV1beXwxLTEpXQorICAgIC8vIGJsb2NrW3ggLSAxXVt5IHwgMSAtIDEpXQorICAgIHctPmNocm9tYV9vcmllbnQgPSAody0+cHJlZGljdGlvbl90YWJsZVsyICogdy0+bWJfeCAtIDJdICYgMHgwMykgPDwgMjsKIH0KIAotc3RhdGljIHZvaWQgeDhfZ2V0X3ByZWRpY3Rpb24oSW50cmFYOENvbnRleHQgKiBjb25zdCB3KXsKLSAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHM9IHctPnM7Ci0gICAgaW50IGEsYixjLGk7CitzdGF0aWMgdm9pZCB4OF9nZXRfcHJlZGljdGlvbihJbnRyYVg4Q29udGV4dCAqY29uc3QgdykKK3sKKyAgICBpbnQgYSwgYiwgYywgaTsKIAotICAgIHctPmVkZ2VzID0gMSooICFzLT5tYl94ICk7Ci0gICAgdy0+ZWRnZXN8PSAyKiggIXMtPm1iX3kgKTsKLSAgICB3LT5lZGdlc3w9IDQqKCBzLT5tYl94ID49ICgyKnMtPm1iX3dpZHRoLTEpICk7CisgICAgdy0+ZWRnZXMgID0gMSAqICF3LT5tYl94OworICAgIHctPmVkZ2VzIHw9IDIgKiAhdy0+bWJfeTsKKyAgICB3LT5lZGdlcyB8PSA0ICogKHctPm1iX3ggPj0gKDIgKiB3LT5tYl93aWR0aCAtIDEpKTsKIAotICAgIHN3aXRjaCh3LT5lZGdlcyYzKXsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIC8vdGFrZSB0aGUgb25lIGZyb20gdGhlIGFib3ZlIGJsb2NrWzBdW3ktMV0KLSAgICAgICAgICAgIHctPmVzdF9ydW4gPSB3LT5wcmVkaWN0aW9uX3RhYmxlWyEocy0+bWJfeSYxKV0+PjI7Ci0gICAgICAgICAgICB3LT5vcmllbnQgID0gMTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgLy90YWtlIHRoZSBvbmUgZnJvbSB0aGUgcHJldmlvdXMgYmxvY2tbeC0xXVswXQotICAgICAgICAgICAgdy0+ZXN0X3J1biA9IHctPnByZWRpY3Rpb25fdGFibGVbMipzLT5tYl94LTJdPj4yOwotICAgICAgICAgICAgdy0+b3JpZW50ICA9IDI7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIHctPmVzdF9ydW4gPSAxNjsKLSAgICAgICAgICAgIHctPm9yaWVudCAgPSAwOwotICAgICAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvL25vIGVkZ2UgY2FzZXMKLSAgICBiPSB3LT5wcmVkaWN0aW9uX3RhYmxlWzIqcy0+bWJfeCAgICsgIShzLT5tYl95JjEpIF07Ly9ibG9ja1t4ICBdW3ktMV0KLSAgICBhPSB3LT5wcmVkaWN0aW9uX3RhYmxlWzIqcy0+bWJfeC0yICsgIChzLT5tYl95JjEpIF07Ly9ibG9ja1t4LTFdW3kgIF0KLSAgICBjPSB3LT5wcmVkaWN0aW9uX3RhYmxlWzIqcy0+bWJfeC0yICsgIShzLT5tYl95JjEpIF07Ly9ibG9ja1t4LTFdW3ktMV0KLQotICAgIHctPmVzdF9ydW4gPSBGRk1JTihiLGEpOwotICAgIC8qIFRoaXMgY29uZGl0aW9uIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggdy0+ZWRnZXMsIGV2ZW4gaWYgaXQgbG9va3MKLSAgICAgICBzaW1pbGFyIGl0IHdvdWxkIHRyaWdnZXIgaWYgZS5nLiB4PTM7eT0yOwotICAgICAgIEkgZ3Vlc3Mgc29tZWJvZHkgd3JvdGUgc29tZXRoaW5nIHdyb25nIGFuZCBpdCBiZWNhbWUgc3RhbmRhcmQuICovCi0gICAgaWYoIChzLT5tYl94ICYgcy0+bWJfeSkgIT0gMCApIHctPmVzdF9ydW49RkZNSU4oYyx3LT5lc3RfcnVuKTsKLSAgICB3LT5lc3RfcnVuPj49MjsKLQotICAgIGEmPTM7Ci0gICAgYiY9MzsKLSAgICBjJj0zOwotCi0gICAgaT0oIDB4RkZFQUY0QzQ+PigyKmIrOCphKSApJjM7Ci0gICAgaWYoaSE9Mykgdy0+b3JpZW50PWk7Ci0gICAgZWxzZSAgICAgdy0+b3JpZW50PSggMHhGRkVBRDg+PigyKmMrOCoody0+cXVhbnQ+MTIpKSApJjM7Ci0vKgotbHV0MVtiXVthXT17Ci0tPnswLCAxLCAwLCBwYWR9LAotICB7MCwgMSwgWCwgcGFkfSwKLSAgezIsIDIsIDIsIHBhZH19Ci0gICBwYWQgMiAgIDIgIDI7IHBhZCBYICAxICAwOyBwYWQgMCAgMSAgMCA8LQotLT4gMTEgMTAgJzEwIDEwICcxMSAxMScwMSAwMCAnMTEgMDAnMDEgMDA9PjB4RUFGNEM0Ci0KLWx1dDJbcT4xMl1bY109ewotICAtPnswLDIsMSxwYWR9LAotICAgIHsyLDIsMixwYWR9fQotICAgcGFkIDIgIDIgIDI7IHBhZCAxICAyICAwIDwtCi0tPiAxMSAxMCcxMCAxMCAnMTEgMDEnMTAgMDA9PjB4RUFEOAotKi8KLX0KLQotCi1zdGF0aWMgdm9pZCB4OF9hY19jb21wZW5zYXRpb24oSW50cmFYOENvbnRleHQgKiBjb25zdCB3LCBpbnQgY29uc3QgZGlyZWN0aW9uLCBpbnQgY29uc3QgZGNfbGV2ZWwpewotICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3Qgcz0gdy0+czsKLSAgICBpbnQgdDsKLSNkZWZpbmUgQih4LHkpICBzLT5ibG9ja1swXVt3LT5pZGN0X3Blcm11dGF0aW9uWyh4KSsoeSkqOF1dCi0jZGVmaW5lIFQoeCkgICgoeCkgKiBkY19sZXZlbCArIDB4ODAwMCkgPj4gMTY7Ci0gICAgc3dpdGNoKGRpcmVjdGlvbil7CisgICAgc3dpdGNoICh3LT5lZGdlcyAmIDMpIHsKICAgICBjYXNlIDA6Ci0gICAgICAgIHQgPSBUKDM4MTEpOy8vaAotICAgICAgICBCKDEsMCkgLT0gdDsKLSAgICAgICAgQigwLDEpIC09IHQ7Ci0KLSAgICAgICAgdCA9IFQoNDg3KTsvL2UKLSAgICAgICAgQigyLDApIC09IHQ7Ci0gICAgICAgIEIoMCwyKSAtPSB0OwotCi0gICAgICAgIHQgPSBUKDUwNik7Ly9mCi0gICAgICAgIEIoMywwKSAtPSB0OwotICAgICAgICBCKDAsMykgLT0gdDsKLQotICAgICAgICB0ID0gVCgxMzUpOy8vYwotICAgICAgICBCKDQsMCkgLT0gdDsKLSAgICAgICAgQigwLDQpIC09IHQ7Ci0gICAgICAgIEIoMiwxKSArPSB0OwotICAgICAgICBCKDEsMikgKz0gdDsKLSAgICAgICAgQigzLDEpICs9IHQ7Ci0gICAgICAgIEIoMSwzKSArPSB0OwotCi0gICAgICAgIHQgPSBUKDE3Myk7Ly9kCi0gICAgICAgIEIoNSwwKSAtPSB0OwotICAgICAgICBCKDAsNSkgLT0gdDsKLQotICAgICAgICB0ID0gVCg2MSk7Ly9iCi0gICAgICAgIEIoNiwwKSAtPSB0OwotICAgICAgICBCKDAsNikgLT0gdDsKLSAgICAgICAgQig1LDEpICs9IHQ7Ci0gICAgICAgIEIoMSw1KSArPSB0OwotCi0gICAgICAgIHQgPSBUKDQyKTsgLy9hCi0gICAgICAgIEIoNywwKSAtPSB0OwotICAgICAgICBCKDAsNykgLT0gdDsKLSAgICAgICAgQig0LDEpICs9IHQ7Ci0gICAgICAgIEIoMSw0KSArPSB0OwotICAgICAgICBCKDQsNCkgKz0gdDsKLQotICAgICAgICB0ID0gVCgxMDg0KTsvL2cKLSAgICAgICAgQigxLDEpICs9IHQ7Ci0KLSAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFswXSA9IEZGTUFYKHMtPmJsb2NrX2xhc3RfaW5kZXhbMF0sIDcqOCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMToKLSAgICAgICAgQigwLDEpIC09IFQoNjI2OSk7Ci0gICAgICAgIEIoMCwzKSAtPSBUKCA3MDgpOwotICAgICAgICBCKDAsNSkgLT0gVCggMTcyKTsKLSAgICAgICAgQigwLDcpIC09IFQoICA3Myk7CisgICAgICAgIC8vIHRha2UgdGhlIG9uZSBmcm9tIHRoZSBhYm92ZSBibG9ja1swXVt5IC0gMV0KKyAgICAgICAgdy0+ZXN0X3J1biA9IHctPnByZWRpY3Rpb25fdGFibGVbISh3LT5tYl95ICYgMSldID4+IDI7CisgICAgICAgIHctPm9yaWVudCAgPSAxOworICAgICAgICByZXR1cm47CisgICAgY2FzZSAyOgorICAgICAgICAvLyB0YWtlIHRoZSBvbmUgZnJvbSB0aGUgcHJldmlvdXMgYmxvY2tbeCAtIDFdWzBdCisgICAgICAgIHctPmVzdF9ydW4gPSB3LT5wcmVkaWN0aW9uX3RhYmxlWzIgKiB3LT5tYl94IC0gMl0gPj4gMjsKKyAgICAgICAgdy0+b3JpZW50ICA9IDI7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIDM6CisgICAgICAgIHctPmVzdF9ydW4gPSAxNjsKKyAgICAgICAgdy0+b3JpZW50ICA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gbm8gZWRnZSBjYXNlcworICAgIGIgPSB3LT5wcmVkaWN0aW9uX3RhYmxlWzIgKiB3LT5tYl94ICAgICArICEody0+bWJfeSAmIDEpXTsgLy8gYmxvY2tbeCAgICBdW3kgLSAxXQorICAgIGEgPSB3LT5wcmVkaWN0aW9uX3RhYmxlWzIgKiB3LT5tYl94IC0gMiArICAody0+bWJfeSAmIDEpXTsgLy8gYmxvY2tbeCAtIDFdW3kgICAgXQorICAgIGMgPSB3LT5wcmVkaWN0aW9uX3RhYmxlWzIgKiB3LT5tYl94IC0gMiArICEody0+bWJfeSAmIDEpXTsgLy8gYmxvY2tbeCAtIDFdW3kgLSAxXQogCi0gICAgICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbMF0gPSBGRk1BWChzLT5ibG9ja19sYXN0X2luZGV4WzBdLCA3KjgpOworICAgIHctPmVzdF9ydW4gPSBGRk1JTihiLCBhKTsKKyAgICAvKiBUaGlzIGNvbmRpdGlvbiBoYXMgbm90aGluZyB0byBkbyB3aXRoIHctPmVkZ2VzLCBldmVuIGlmIGl0IGxvb2tzCisgICAgICogc2ltaWxhciBpdCB3b3VsZCB0cmlnZ2VyIGlmIGUuZy4geCA9IDM7IHkgPSAyOworICAgICAqIEkgZ3Vlc3Mgc29tZWJvZHkgd3JvdGUgc29tZXRoaW5nIHdyb25nIGFuZCBpdCBiZWNhbWUgc3RhbmRhcmQuICovCisgICAgaWYgKCh3LT5tYl94ICYgdy0+bWJfeSkgIT0gMCkKKyAgICAgICAgdy0+ZXN0X3J1biA9IEZGTUlOKGMsIHctPmVzdF9ydW4pOworICAgIHctPmVzdF9ydW4gPj49IDI7CisKKyAgICBhICY9IDM7CisgICAgYiAmPSAzOworICAgIGMgJj0gMzsKKworICAgIGkgPSAoMHhGRkVBRjRDNCA+PiAoMiAqIGIgKyA4ICogYSkpICYgMzsKKyAgICBpZiAoaSAhPSAzKQorICAgICAgICB3LT5vcmllbnQgPSBpOworICAgIGVsc2UKKyAgICAgICAgdy0+b3JpZW50ID0gKDB4RkZFQUQ4ID4+ICgyICogYyArIDggKiAody0+cXVhbnQgPiAxMikpKSAmIDM7CisvKgorICogbHV0MVtiXVthXSA9IHsKKyAqIC0+eyAwLCAxLCAwLCBwYWQgfSwKKyAqICAgeyAwLCAxLCBYLCBwYWQgfSwKKyAqICAgeyAyLCAyLCAyLCBwYWQgfQorICogfQorICogcGFkIDIgIDIgIDI7CisgKiBwYWQgWCAgMSAgMDsKKyAqIHBhZCAwICAxICAwIDwtCisgKiAtPiAxMSAxMCAnMTAgMTAgJzExIDExJzAxIDAwICcxMSAwMCcwMSAwMCA9PiAweEVBRjRDNAorICoKKyAqIGx1dDJbcT4xMl1bY10gPSB7CisgKiAtPnsgMCwgMiwgMSwgcGFkfSwKKyAqICAgeyAyLCAyLCAyLCBwYWR9CisgKiB9CisgKiBwYWQgMiAgMiAgMjsKKyAqIHBhZCAxICAyICAwIDwtCisgKiAtPiAxMSAxMCcxMCAxMCAnMTEgMDEnMTAgMDAgPT4gMHhFQUQ4CisgKi8KK30KKworc3RhdGljIHZvaWQgeDhfYWNfY29tcGVuc2F0aW9uKEludHJhWDhDb250ZXh0ICpjb25zdCB3LCBjb25zdCBpbnQgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkY19sZXZlbCkKK3sKKyAgICBpbnQgdDsKKyNkZWZpbmUgQih4LHkpICB3LT5ibG9ja1swXVt3LT5pZGN0X3Blcm11dGF0aW9uWyh4KSArICh5KSAqIDhdXQorI2RlZmluZSBUKHgpICAoKHgpICogZGNfbGV2ZWwgKyAweDgwMDApID4+IDE2OworICAgIHN3aXRjaCAoZGlyZWN0aW9uKSB7CisgICAgY2FzZSAwOgorICAgICAgICB0ICAgICAgICA9IFQoMzgxMSk7IC8vIGgKKyAgICAgICAgQigxLCAwKSAtPSB0OworICAgICAgICBCKDAsIDEpIC09IHQ7CisKKyAgICAgICAgdCAgICAgICAgPSBUKDQ4Nyk7IC8vIGUKKyAgICAgICAgQigyLCAwKSAtPSB0OworICAgICAgICBCKDAsIDIpIC09IHQ7CisKKyAgICAgICAgdCAgICAgICAgPSBUKDUwNik7IC8vIGYKKyAgICAgICAgQigzLCAwKSAtPSB0OworICAgICAgICBCKDAsIDMpIC09IHQ7CisKKyAgICAgICAgdCAgICAgICAgPSBUKDEzNSk7IC8vIGMKKyAgICAgICAgQig0LCAwKSAtPSB0OworICAgICAgICBCKDAsIDQpIC09IHQ7CisgICAgICAgIEIoMiwgMSkgKz0gdDsKKyAgICAgICAgQigxLCAyKSArPSB0OworICAgICAgICBCKDMsIDEpICs9IHQ7CisgICAgICAgIEIoMSwgMykgKz0gdDsKKworICAgICAgICB0ICAgICAgICA9IFQoMTczKTsgLy8gZAorICAgICAgICBCKDUsIDApIC09IHQ7CisgICAgICAgIEIoMCwgNSkgLT0gdDsKKworICAgICAgICB0ICAgICAgICA9IFQoNjEpOyAvLyBiCisgICAgICAgIEIoNiwgMCkgLT0gdDsKKyAgICAgICAgQigwLCA2KSAtPSB0OworICAgICAgICBCKDUsIDEpICs9IHQ7CisgICAgICAgIEIoMSwgNSkgKz0gdDsKKworICAgICAgICB0ICAgICAgICA9IFQoNDIpOyAvLyBhCisgICAgICAgIEIoNywgMCkgLT0gdDsKKyAgICAgICAgQigwLCA3KSAtPSB0OworICAgICAgICBCKDQsIDEpICs9IHQ7CisgICAgICAgIEIoMSwgNCkgKz0gdDsKKyAgICAgICAgQig0LCA0KSArPSB0OworCisgICAgICAgIHQgICAgICAgID0gVCgxMDg0KTsgLy8gZworICAgICAgICBCKDEsIDEpICs9IHQ7CisKKyAgICAgICAgdy0+YmxvY2tfbGFzdF9pbmRleFswXSA9IEZGTUFYKHctPmJsb2NrX2xhc3RfaW5kZXhbMF0sIDcgKiA4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBCKDAsIDEpIC09IFQoNjI2OSk7CisgICAgICAgIEIoMCwgMykgLT0gVCg3MDgpOworICAgICAgICBCKDAsIDUpIC09IFQoMTcyKTsKKyAgICAgICAgQigwLCA3KSAtPSBUKDczKTsKKworICAgICAgICB3LT5ibG9ja19sYXN0X2luZGV4WzBdID0gRkZNQVgody0+YmxvY2tfbGFzdF9pbmRleFswXSwgNyAqIDgpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDI6Ci0gICAgICAgIEIoMSwwKSAtPSBUKDYyNjkpOwotICAgICAgICBCKDMsMCkgLT0gVCggNzA4KTsKLSAgICAgICAgQig1LDApIC09IFQoIDE3Mik7Ci0gICAgICAgIEIoNywwKSAtPSBUKCAgNzMpOworICAgICAgICBCKDEsIDApIC09IFQoNjI2OSk7CisgICAgICAgIEIoMywgMCkgLT0gVCg3MDgpOworICAgICAgICBCKDUsIDApIC09IFQoMTcyKTsKKyAgICAgICAgQig3LCAwKSAtPSBUKDczKTsKIAotICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4WzBdID0gRkZNQVgocy0+YmxvY2tfbGFzdF9pbmRleFswXSwgNyk7CisgICAgICAgIHctPmJsb2NrX2xhc3RfaW5kZXhbMF0gPSBGRk1BWCh3LT5ibG9ja19sYXN0X2luZGV4WzBdLCA3KTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogI3VuZGVmIEIKICN1bmRlZiBUCiB9CiAKLXN0YXRpYyB2b2lkIGRzcF94OF9wdXRfc29saWRjb2xvcih1aW50OF90IGNvbnN0IHBpeCwgdWludDhfdCAqIGRzdCwgaW50IGNvbnN0IGxpbmVzaXplKXsKK3N0YXRpYyB2b2lkIGRzcF94OF9wdXRfc29saWRjb2xvcihjb25zdCB1aW50OF90IHBpeCwgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBsaW5lc2l6ZSkKK3sKICAgICBpbnQgazsKLSAgICBmb3Ioaz0wO2s8ODtrKyspewotICAgICAgICBtZW1zZXQoZHN0LHBpeCw4KTsKLSAgICAgICAgZHN0Kz1saW5lc2l6ZTsKKyAgICBmb3IgKGsgPSAwOyBrIDwgODsgaysrKSB7CisgICAgICAgIG1lbXNldChkc3QsIHBpeCwgOCk7CisgICAgICAgIGRzdCArPSBsaW5lc2l6ZTsKICAgICB9CiB9CiAKIHN0YXRpYyBjb25zdCBpbnQxNl90IHF1YW50X3RhYmxlWzY0XSA9IHsKLSAgICAyNTYsIDI1NiwgMjU2LCAyNTYsICAyNTYsIDI1NiwgMjU5LCAyNjIsCi0gICAgMjY1LCAyNjksIDI3MiwgMjc1LCAgMjc4LCAyODIsIDI4NSwgMjg4LAotICAgIDI5MiwgMjk1LCAyOTksIDMwMywgIDMwNiwgMzEwLCAzMTQsIDMxNywKLSAgICAzMjEsIDMyNSwgMzI5LCAzMzMsICAzMzcsIDM0MSwgMzQ1LCAzNDksCi0gICAgMzUzLCAzNTgsIDM2MiwgMzY2LCAgMzcxLCAzNzUsIDM3OSwgMzg0LAotICAgIDM4OSwgMzkzLCAzOTgsIDQwMywgIDQwOCwgNDEzLCA0MTcsIDQyMiwKLSAgICA0MjgsIDQzMywgNDM4LCA0NDMsICA0NDgsIDQ1NCwgNDU5LCA0NjUsCi0gICAgNDcwLCA0NzYsIDQ4MiwgNDg4LCAgNDkzLCA0OTksIDUwNSwgNTExCisgICAgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU5LCAyNjIsCisgICAgMjY1LCAyNjksIDI3MiwgMjc1LCAyNzgsIDI4MiwgMjg1LCAyODgsCisgICAgMjkyLCAyOTUsIDI5OSwgMzAzLCAzMDYsIDMxMCwgMzE0LCAzMTcsCisgICAgMzIxLCAzMjUsIDMyOSwgMzMzLCAzMzcsIDM0MSwgMzQ1LCAzNDksCisgICAgMzUzLCAzNTgsIDM2MiwgMzY2LCAzNzEsIDM3NSwgMzc5LCAzODQsCisgICAgMzg5LCAzOTMsIDM5OCwgNDAzLCA0MDgsIDQxMywgNDE3LCA0MjIsCisgICAgNDI4LCA0MzMsIDQzOCwgNDQzLCA0NDgsIDQ1NCwgNDU5LCA0NjUsCisgICAgNDcwLCA0NzYsIDQ4MiwgNDg4LCA0OTMsIDQ5OSwgNTA1LCA1MTEsCiB9OwogCi1zdGF0aWMgaW50IHg4X2RlY29kZV9pbnRyYV9tYihJbnRyYVg4Q29udGV4dCogY29uc3QgdywgY29uc3QgaW50IGNocm9tYSl7Ci0gICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzPSB3LT5zOwotCi0gICAgdWludDhfdCAqIHNjYW50YWJsZTsKLSAgICBpbnQgZmluYWwscnVuLGxldmVsOwotICAgIGludCBhY19tb2RlLGRjX21vZGUsZXN0X3J1bixkY19sZXZlbDsKLSAgICBpbnQgcG9zLG47CitzdGF0aWMgaW50IHg4X2RlY29kZV9pbnRyYV9tYihJbnRyYVg4Q29udGV4dCAqY29uc3QgdywgY29uc3QgaW50IGNocm9tYSkKK3sKKyAgICB1aW50OF90ICpzY2FudGFibGU7CisgICAgaW50IGZpbmFsLCBydW4sIGxldmVsOworICAgIGludCBhY19tb2RlLCBkY19tb2RlLCBlc3RfcnVuLCBkY19sZXZlbDsKKyAgICBpbnQgcG9zLCBuOwogICAgIGludCB6ZXJvc19vbmx5OwogICAgIGludCB1c2VfcXVhbnRfbWF0cml4OwogICAgIGludCBzaWduOwogCi0gICAgYXZfYXNzZXJ0Mih3LT5vcmllbnQ8MTIpOwotICAgIHMtPmJkc3AuY2xlYXJfYmxvY2socy0+YmxvY2tbMF0pOworICAgIGF2X2Fzc2VydDIody0+b3JpZW50IDwgMTIpOworICAgIHctPmJkc3AuY2xlYXJfYmxvY2sody0+YmxvY2tbMF0pOwogCi0gICAgaWYoY2hyb21hKXsKLSAgICAgICAgZGNfbW9kZT0yOwotICAgIH1lbHNlewotICAgICAgICBkY19tb2RlPSEhdy0+ZXN0X3J1bjsvLzAsMQotICAgIH0KKyAgICBpZiAoY2hyb21hKQorICAgICAgICBkY19tb2RlID0gMjsKKyAgICBlbHNlCisgICAgICAgIGRjX21vZGUgPSAhIXctPmVzdF9ydW47IC8vIDAsIDEKIAotICAgIGlmKHg4X2dldF9kY19ybGYodywgZGNfbW9kZSwgJmRjX2xldmVsLCAmZmluYWwpKSByZXR1cm4gLTE7Ci0gICAgbj0wOwotICAgIHplcm9zX29ubHk9MDsKLSAgICBpZighZmluYWwpey8vZGVjb2RlIGFjCi0gICAgICAgIHVzZV9xdWFudF9tYXRyaXg9dy0+dXNlX3F1YW50X21hdHJpeDsKLSAgICAgICAgaWYoY2hyb21hKXsKKyAgICBpZiAoeDhfZ2V0X2RjX3JsZih3LCBkY19tb2RlLCAmZGNfbGV2ZWwsICZmaW5hbCkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBuICAgICAgICAgID0gMDsKKyAgICB6ZXJvc19vbmx5ID0gMDsKKyAgICBpZiAoIWZpbmFsKSB7IC8vIGRlY29kZSBhYworICAgICAgICB1c2VfcXVhbnRfbWF0cml4ID0gdy0+dXNlX3F1YW50X21hdHJpeDsKKyAgICAgICAgaWYgKGNocm9tYSkgewogICAgICAgICAgICAgYWNfbW9kZSA9IDE7Ci0gICAgICAgICAgICBlc3RfcnVuID0gNjQ7Ly9ub3QgdXNlZAotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIGlmICh3LT5yYXdfb3JpZW50IDwgMyl7CisgICAgICAgICAgICBlc3RfcnVuID0gNjQ7IC8vIG5vdCB1c2VkCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAody0+cmF3X29yaWVudCA8IDMpCiAgICAgICAgICAgICAgICAgdXNlX3F1YW50X21hdHJpeCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZih3LT5yYXdfb3JpZW50ID4gNCl7CisKKyAgICAgICAgICAgIGlmICh3LT5yYXdfb3JpZW50ID4gNCkgewogICAgICAgICAgICAgICAgIGFjX21vZGUgPSAwOwogICAgICAgICAgICAgICAgIGVzdF9ydW4gPSA2NDsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIGlmKHctPmVzdF9ydW4gPiAxKXsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHctPmVzdF9ydW4gPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgIGFjX21vZGUgPSAyOwotICAgICAgICAgICAgICAgICAgICBlc3RfcnVuPXctPmVzdF9ydW47Ci0gICAgICAgICAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAgICAgICAgIGVzdF9ydW4gPSB3LT5lc3RfcnVuOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGFjX21vZGUgPSAzOwogICAgICAgICAgICAgICAgICAgICBlc3RfcnVuID0gNjQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHg4X3NlbGVjdF9hY190YWJsZSh3LGFjX21vZGUpOwotICAgICAgICAvKnNjYW50YWJsZV9zZWxlY3RvclsxMl09ezAsMiwwLDEsMSwxLDAsMiwyLDAsMSwyfTs8LQotICAgICAgICAtPiAxMCcwMScgMDAnMTAnIDEwJzAwJyAwMScwMScgMDEnMDAnIDEwJzAwID0+MHg5Mjg1NDggKi8KLSAgICAgICAgc2NhbnRhYmxlID0gdy0+c2NhbnRhYmxlWyAoMHg5Mjg1NDg+PigyKnctPm9yaWVudCkpJjMgXS5wZXJtdXRhdGVkOwotICAgICAgICBwb3M9MDsKKyAgICAgICAgeDhfc2VsZWN0X2FjX3RhYmxlKHcsIGFjX21vZGUpOworICAgICAgICAvKiBzY2FudGFibGVfc2VsZWN0b3JbMTJdID0geyAwLCAyLCAwLCAxLCAxLCAxLCAwLCAyLCAyLCAwLCAxLCAyIH07IDwtCisgICAgICAgICAqIC0+IDEwJzAxJyAwMCcxMCcgMTAnMDAnIDAxJzAxJyAwMScwMCcgMTAnMDAgPT4gMHg5Mjg1NDggKi8KKyAgICAgICAgc2NhbnRhYmxlID0gdy0+c2NhbnRhYmxlWygweDkyODU0OCA+PiAoMiAqIHctPm9yaWVudCkpICYgM10ucGVybXV0YXRlZDsKKyAgICAgICAgcG9zICAgICAgID0gMDsKICAgICAgICAgZG8gewogICAgICAgICAgICAgbisrOwotICAgICAgICAgICAgaWYoIG4gPj0gZXN0X3J1biApewotICAgICAgICAgICAgICAgIGFjX21vZGU9MzsKLSAgICAgICAgICAgICAgICB4OF9zZWxlY3RfYWNfdGFibGUodywzKTsKKyAgICAgICAgICAgIGlmIChuID49IGVzdF9ydW4pIHsKKyAgICAgICAgICAgICAgICBhY19tb2RlID0gMzsKKyAgICAgICAgICAgICAgICB4OF9zZWxlY3RfYWNfdGFibGUodywgMyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHg4X2dldF9hY19ybGYodyxhY19tb2RlLCZydW4sJmxldmVsLCZmaW5hbCk7CisgICAgICAgICAgICB4OF9nZXRfYWNfcmxmKHcsIGFjX21vZGUsICZydW4sICZsZXZlbCwgJmZpbmFsKTsKIAotICAgICAgICAgICAgcG9zKz1ydW4rMTsKLSAgICAgICAgICAgIGlmKHBvcz42Myl7Ci0gICAgICAgICAgICAgICAgLy90aGlzIGFsc28gaGFuZGxlcyB2bGMgZXJyb3IgaW4geDhfZ2V0X2FjX3JsZgorICAgICAgICAgICAgcG9zICs9IHJ1biArIDE7CisgICAgICAgICAgICBpZiAocG9zID4gNjMpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGFsc28gaGFuZGxlcyB2bGMgZXJyb3IgaW4geDhfZ2V0X2FjX3JsZgogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxldmVsPSAobGV2ZWwrMSkgKiB3LT5kcXVhbnQ7Ci0gICAgICAgICAgICBsZXZlbCs9IHctPnFzdW07CisgICAgICAgICAgICBsZXZlbCAgPSAobGV2ZWwgKyAxKSAqIHctPmRxdWFudDsKKyAgICAgICAgICAgIGxldmVsICs9IHctPnFzdW07CiAKLSAgICAgICAgICAgIHNpZ24gPSAtIGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgc2lnbiAgPSAtZ2V0X2JpdHMxKHctPmdiKTsKICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gc2lnbikgLSBzaWduOwogCi0gICAgICAgICAgICBpZih1c2VfcXVhbnRfbWF0cml4KXsKLSAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCpxdWFudF90YWJsZVtwb3NdKT4+ODsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPmJsb2NrWzBdWyBzY2FudGFibGVbcG9zXSBdPWxldmVsOwotICAgICAgICB9d2hpbGUoIWZpbmFsKTsKKyAgICAgICAgICAgIGlmICh1c2VfcXVhbnRfbWF0cml4KQorICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICogcXVhbnRfdGFibGVbcG9zXSkgPj4gODsKIAotICAgICAgICBzLT5ibG9ja19sYXN0X2luZGV4WzBdPXBvczsKLSAgICB9ZWxzZXsvL0RDIG9ubHkKLSAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFswXT0wOwotICAgICAgICBpZih3LT5mbGF0X2RjICYmICgodW5zaWduZWQpKGRjX2xldmVsKzEpKSA8IDMpey8vWy0xOzFdCi0gICAgICAgICAgICBpbnQzMl90IGRpdmlkZV9xdWFudD0gIWNocm9tYSA/IHctPmRpdmlkZV9xdWFudF9kY19sdW1hOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5kaXZpZGVfcXVhbnRfZGNfY2hyb21hOwotICAgICAgICAgICAgaW50MzJfdCBkY19xdWFudCAgICA9ICFjaHJvbWEgPyB3LT5xdWFudDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+cXVhbnRfZGNfY2hyb21hOworICAgICAgICAgICAgdy0+YmxvY2tbMF1bc2NhbnRhYmxlW3Bvc11dID0gbGV2ZWw7CisgICAgICAgIH0gd2hpbGUgKCFmaW5hbCk7CiAKLSAgICAgICAgICAgIC8vb3JpZ2luYWwgaW50ZW50IGRjX2xldmVsKz1wcmVkaWN0ZWRfZGMvcXVhbnQ7IGJ1dCBpdCBnb3QgbG9zdCBzb21ld2hlcmUgaW4gdGhlIHJvdW5kaW5nCi0gICAgICAgICAgICBkY19sZXZlbCs9ICh3LT5wcmVkaWN0ZWRfZGMqZGl2aWRlX3F1YW50ICsgKDE8PDEyKSApPj4xMzsKKyAgICAgICAgdy0+YmxvY2tfbGFzdF9pbmRleFswXSA9IHBvczsKKyAgICB9IGVsc2UgeyAvLyBEQyBvbmx5CisgICAgICAgIHctPmJsb2NrX2xhc3RfaW5kZXhbMF0gPSAwOworICAgICAgICBpZiAody0+ZmxhdF9kYyAmJiAoKHVuc2lnbmVkKSAoZGNfbGV2ZWwgKyAxKSkgPCAzKSB7IC8vIFstMTsgMV0KKyAgICAgICAgICAgIGludDMyX3QgZGl2aWRlX3F1YW50ID0gIWNocm9tYSA/IHctPmRpdmlkZV9xdWFudF9kY19sdW1hCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3LT5kaXZpZGVfcXVhbnRfZGNfY2hyb21hOworICAgICAgICAgICAgaW50MzJfdCBkY19xdWFudCAgICAgPSAhY2hyb21hID8gdy0+cXVhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHctPnF1YW50X2RjX2Nocm9tYTsKIAotICAgICAgICAgICAgZHNwX3g4X3B1dF9zb2xpZGNvbG9yKCBhdl9jbGlwX3VpbnQ4KChkY19sZXZlbCpkY19xdWFudCs0KT4+MyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlc3RbY2hyb21hXSwgcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWyEhY2hyb21hXSk7CisgICAgICAgICAgICAvLyBvcmlnaW5hbCBpbnRlbnQgZGNfbGV2ZWwgKz0gcHJlZGljdGVkX2RjL3F1YW50OworICAgICAgICAgICAgLy8gYnV0IGl0IGdvdCBsb3N0IHNvbWV3aGVyZSBpbiB0aGUgcm91bmRpbmcKKyAgICAgICAgICAgIGRjX2xldmVsICs9ICh3LT5wcmVkaWN0ZWRfZGMgKiBkaXZpZGVfcXVhbnQgKyAoMSA8PCAxMikpID4+IDEzOworCisgICAgICAgICAgICBkc3BfeDhfcHV0X3NvbGlkY29sb3IoYXZfY2xpcF91aW50OCgoZGNfbGV2ZWwgKiBkY19xdWFudCArIDQpID4+IDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPmRlc3RbY2hyb21hXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5mcmFtZS0+bGluZXNpemVbISFjaHJvbWFdKTsKIAogICAgICAgICAgICAgZ290byBibG9ja19wbGFjZWQ7CiAgICAgICAgIH0KLSAgICAgICAgemVyb3Nfb25seSA9IChkY19sZXZlbCA9PSAwKTsKKyAgICAgICAgemVyb3Nfb25seSA9IGRjX2xldmVsID09IDA7CiAgICAgfQotICAgIGlmKCFjaHJvbWEpewotICAgICAgICBzLT5ibG9ja1swXVswXSA9IGRjX2xldmVsKnctPnF1YW50OwotICAgIH1lbHNlewotICAgICAgICBzLT5ibG9ja1swXVswXSA9IGRjX2xldmVsKnctPnF1YW50X2RjX2Nocm9tYTsKLSAgICB9CisgICAgaWYgKCFjaHJvbWEpCisgICAgICAgIHctPmJsb2NrWzBdWzBdID0gZGNfbGV2ZWwgKiB3LT5xdWFudDsKKyAgICBlbHNlCisgICAgICAgIHctPmJsb2NrWzBdWzBdID0gZGNfbGV2ZWwgKiB3LT5xdWFudF9kY19jaHJvbWE7CiAKLSAgICAvL3RoZXJlIGlzICF6ZXJvX29ubHkgY2hlY2sgaW4gdGhlIG9yaWdpbmFsLCBidXQgZGNfbGV2ZWwgY2hlY2sgaXMgZW5vdWdoCi0gICAgaWYoICh1bnNpZ25lZCBpbnQpKGRjX2xldmVsKzEpID49IDMgJiYgKHctPmVkZ2VzJjMpICE9IDMgKXsKKyAgICAvLyB0aGVyZSBpcyAhemVyb19vbmx5IGNoZWNrIGluIHRoZSBvcmlnaW5hbCwgYnV0IGRjX2xldmVsIGNoZWNrIGlzIGVub3VnaAorICAgIGlmICgodW5zaWduZWQgaW50KSAoZGNfbGV2ZWwgKyAxKSA+PSAzICYmICh3LT5lZGdlcyAmIDMpICE9IDMpIHsKICAgICAgICAgaW50IGRpcmVjdGlvbjsKLSAgICAgICAgLyphY19jb21wX2RpcmVjdGlvbltvcmllbnRdID0geyAwLCAzLCAzLCAxLCAxLCAwLCAwLCAwLCAyLCAyLCAyLCAxIH07PC0KLSAgICAgICAgLT4gMDEnMTAnIDEwJzEwJyAwMCcwMCcgMDAnMDEnIDAxJzExJyAxMScwMCA9PjB4NkEwMTdDICovCi0gICAgICAgIGRpcmVjdGlvbj0gKDB4NkEwMTdDPj4ody0+b3JpZW50KjIpKSYzOwotICAgICAgICBpZiAoZGlyZWN0aW9uICE9IDMpewotICAgICAgICAgICAgeDhfYWNfY29tcGVuc2F0aW9uKHcsIGRpcmVjdGlvbiwgcy0+YmxvY2tbMF1bMF0pOy8vbW9kaWZ5IGJsb2NrX2xhc3RbXQorICAgICAgICAvKiBhY19jb21wX2RpcmVjdGlvbltvcmllbnRdID0geyAwLCAzLCAzLCAxLCAxLCAwLCAwLCAwLCAyLCAyLCAyLCAxIH07IDwtCisgICAgICAgICAqIC0+IDAxJzEwJyAxMCcxMCcgMDAnMDAnIDAwJzAxJyAwMScxMScgMTEnMDAgPT4gMHg2QTAxN0MgKi8KKyAgICAgICAgZGlyZWN0aW9uID0gKDB4NkEwMTdDID4+ICh3LT5vcmllbnQgKiAyKSkgJiAzOworICAgICAgICBpZiAoZGlyZWN0aW9uICE9IDMpIHsKKyAgICAgICAgICAgIC8vIG1vZGlmeSBibG9ja19sYXN0W10KKyAgICAgICAgICAgIHg4X2FjX2NvbXBlbnNhdGlvbih3LCBkaXJlY3Rpb24sIHctPmJsb2NrWzBdWzBdKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmKHctPmZsYXRfZGMpewotICAgICAgICBkc3BfeDhfcHV0X3NvbGlkY29sb3Iody0+cHJlZGljdGVkX2RjLCBzLT5kZXN0W2Nocm9tYV0sIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5saW5lc2l6ZVshIWNocm9tYV0pOwotICAgIH1lbHNlewotICAgICAgICB3LT5kc3Auc3BhdGlhbF9jb21wZW5zYXRpb25bdy0+b3JpZW50XSggcy0+c2MuZWRnZV9lbXVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXN0W2Nocm9tYV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5mLT5saW5lc2l6ZVshIWNocm9tYV0gKTsKKyAgICBpZiAody0+ZmxhdF9kYykgeworICAgICAgICBkc3BfeDhfcHV0X3NvbGlkY29sb3Iody0+cHJlZGljdGVkX2RjLCB3LT5kZXN0W2Nocm9tYV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5mcmFtZS0+bGluZXNpemVbISFjaHJvbWFdKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3LT5kc3Auc3BhdGlhbF9jb21wZW5zYXRpb25bdy0+b3JpZW50XSh3LT5zY3JhdGNocGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5kZXN0W2Nocm9tYV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPmZyYW1lLT5saW5lc2l6ZVshIWNocm9tYV0pOwogICAgIH0KLSAgICBpZighemVyb3Nfb25seSkKLSAgICAgICAgdy0+d2RzcC5pZGN0X2FkZChzLT5kZXN0W2Nocm9tYV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWyEhY2hyb21hXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja1swXSk7CisgICAgaWYgKCF6ZXJvc19vbmx5KQorICAgICAgICB3LT53ZHNwLmlkY3RfYWRkKHctPmRlc3RbY2hyb21hXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3LT5mcmFtZS0+bGluZXNpemVbISFjaHJvbWFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHctPmJsb2NrWzBdKTsKIAogYmxvY2tfcGxhY2VkOgorICAgIGlmICghY2hyb21hKQorICAgICAgICB4OF91cGRhdGVfcHJlZGljdGlvbnModywgdy0+b3JpZW50LCBuKTsKIAotICAgIGlmKCFjaHJvbWEpewotICAgICAgICB4OF91cGRhdGVfcHJlZGljdGlvbnModyx3LT5vcmllbnQsbik7Ci0gICAgfQorICAgIGlmICh3LT5sb29wZmlsdGVyKSB7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IHctPmRlc3RbY2hyb21hXTsKKyAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplID0gdy0+ZnJhbWUtPmxpbmVzaXplWyEhY2hyb21hXTsKIAotICAgIGlmKHMtPmxvb3BfZmlsdGVyKXsKLSAgICAgICAgdWludDhfdCogcHRyID0gcy0+ZGVzdFtjaHJvbWFdOwotICAgICAgICBpbnQgbGluZXNpemUgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbISFjaHJvbWFdOwotCi0gICAgICAgIGlmKCEoICh3LT5lZGdlcyYyKSB8fCAoIHplcm9zX29ubHkgJiYgKHctPm9yaWVudHw0KT09NCApICkpeworICAgICAgICBpZiAoISgody0+ZWRnZXMgJiAyKSB8fCAoemVyb3Nfb25seSAmJiAody0+b3JpZW50IHwgNCkgPT0gNCkpKQogICAgICAgICAgICAgdy0+ZHNwLmhfbG9vcF9maWx0ZXIocHRyLCBsaW5lc2l6ZSwgdy0+cXVhbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmKCEoICh3LT5lZGdlcyYxKSB8fCAoIHplcm9zX29ubHkgJiYgKHctPm9yaWVudHw4KT09OCApICkpeworCisgICAgICAgIGlmICghKCh3LT5lZGdlcyAmIDEpIHx8ICh6ZXJvc19vbmx5ICYmICh3LT5vcmllbnQgfCA4KSA9PSA4KSkpCiAgICAgICAgICAgICB3LT5kc3Audl9sb29wX2ZpbHRlcihwdHIsIGxpbmVzaXplLCB3LT5xdWFudCk7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHg4X2luaXRfYmxvY2tfaW5kZXgoTXBlZ0VuY0NvbnRleHQgKnMpeyAvL0ZJWE1FIG1heWJlIG1lcmdlIHdpdGggZmZfKgotLy9ub3Qgcy0+bGluZXNpemUgYXMgdGhpcyB3b3VsZCBiZSB3cm9uZyBmb3IgZmllbGQgcGljcwotLy9ub3QgdGhhdCBJbnRyYVg4IGhhcyBpbnRlcmxhY2luZyBzdXBwb3J0IDspCi0gICAgY29uc3QgaW50IGxpbmVzaXplICAgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMF07Ci0gICAgY29uc3QgaW50IHV2bGluZXNpemUgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMV07CisvLyBGSVhNRSBtYXliZSBtZXJnZSB3aXRoIGZmXyoKK3N0YXRpYyB2b2lkIHg4X2luaXRfYmxvY2tfaW5kZXgoSW50cmFYOENvbnRleHQgKncsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIC8vIG5vdCBwYXJlbnQgY29kZWMgbGluZXNpemUgYXMgdGhpcyB3b3VsZCBiZSB3cm9uZyBmb3IgZmllbGQgcGljcworICAgIC8vIG5vdCB0aGF0IEludHJhWDggaGFzIGludGVybGFjaW5nIHN1cHBvcnQgOykKKyAgICBjb25zdCBwdHJkaWZmX3QgbGluZXNpemUgICA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBjb25zdCBwdHJkaWZmX3QgdXZsaW5lc2l6ZSA9IGZyYW1lLT5saW5lc2l6ZVsxXTsKIAotICAgIHMtPmRlc3RbMF0gPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVswXTsKLSAgICBzLT5kZXN0WzFdID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMV07Ci0gICAgcy0+ZGVzdFsyXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzJdOworICAgIHctPmRlc3RbMF0gPSBmcmFtZS0+ZGF0YVswXTsKKyAgICB3LT5kZXN0WzFdID0gZnJhbWUtPmRhdGFbMV07CisgICAgdy0+ZGVzdFsyXSA9IGZyYW1lLT5kYXRhWzJdOwogCi0gICAgcy0+ZGVzdFswXSArPSAgIHMtPm1iX3kgICAgICAgICogICBsaW5lc2l6ZSA8PCAzOwotICAgIHMtPmRlc3RbMV0gKz0gKCBzLT5tYl95Jih+MSkgKSAqIHV2bGluZXNpemUgPDwgMjsvL2Nocm9tYSBibG9ja3MgYXJlIG9uIGFkZCByb3dzCi0gICAgcy0+ZGVzdFsyXSArPSAoIHMtPm1iX3kmKH4xKSApICogdXZsaW5lc2l6ZSA8PCAyOworICAgIHctPmRlc3RbMF0gKz0gIHctPm1iX3kgICAgICAgKiBsaW5lc2l6ZSAgIDw8IDM7CisgICAgLy8gY2hyb21hIGJsb2NrcyBhcmUgb24gYWRkIHJvd3MKKyAgICB3LT5kZXN0WzFdICs9ICh3LT5tYl95ICYgfjEpICogdXZsaW5lc2l6ZSA8PCAyOworICAgIHctPmRlc3RbMl0gKz0gKHctPm1iX3kgJiB+MSkgKiB1dmxpbmVzaXplIDw8IDI7CiB9CiAKLS8qKgotICogSW5pdGlhbGl6ZSBJbnRyYVg4IGZyYW1lIGRlY29kZXIuCi0gKiBSZXF1aXJlcyB2YWxpZCBNcGVnRW5jQ29udGV4dCB3aXRoIHZhbGlkIHMtPm1iX3dpZHRoIGJlZm9yZSBjYWxsaW5nLgotICogQHBhcmFtIHcgcG9pbnRlciB0byBJbnRyYVg4Q29udGV4dAotICogQHBhcmFtIHMgcG9pbnRlciB0byBNcGVnRW5jQ29udGV4dCBvZiB0aGUgcGFyZW50IGNvZGVjCi0gKi8KLWF2X2NvbGQgdm9pZCBmZl9pbnRyYXg4X2NvbW1vbl9pbml0KEludHJhWDhDb250ZXh0ICogdywgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzKXsKK2F2X2NvbGQgaW50IGZmX2ludHJheDhfY29tbW9uX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRyYVg4Q29udGV4dCAqdywgSURDVERTUENvbnRleHQgKmlkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKCpibG9jaylbNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfbGFzdF9pbmRleFsxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl93aWR0aCwgaW50IG1iX2hlaWdodCkKK3sKKyAgICBpbnQgcmV0ID0geDhfdmxjX2luaXQoKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIHctPnM9czsKLSAgICB4OF92bGNfaW5pdCgpOwotICAgIGF2X2Fzc2VydDAocy0+bWJfd2lkdGg+MCk7Ci0gICAgdy0+cHJlZGljdGlvbl90YWJsZT1hdl9tYWxsb2N6KHMtPm1iX3dpZHRoKjIqMik7Ly90d28gcm93cywgMiBibG9ja3MgcGVyIGNhbm5vbiBtYgorICAgIHctPmF2Y3R4ID0gYXZjdHg7CisgICAgdy0+aWRzcCA9ICppZHNwOworICAgIHctPm1iX3dpZHRoICA9IG1iX3dpZHRoOworICAgIHctPm1iX2hlaWdodCA9IG1iX2hlaWdodDsKKyAgICB3LT5ibG9jayA9IGJsb2NrOworICAgIHctPmJsb2NrX2xhc3RfaW5kZXggPSBibG9ja19sYXN0X2luZGV4OworCisgICAgLy8gdHdvIHJvd3MsIDIgYmxvY2tzIHBlciBjYW5ub24gbWIKKyAgICB3LT5wcmVkaWN0aW9uX3RhYmxlID0gYXZfbWFsbG9jeih3LT5tYl93aWR0aCAqIDIgKiAyKTsKKyAgICBpZiAoIXctPnByZWRpY3Rpb25fdGFibGUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBmZl93bXYyZHNwX2luaXQoJnctPndkc3ApOworCiAgICAgZmZfaW5pdF9zY2FudGFibGVfcGVybXV0YXRpb24ody0+aWRjdF9wZXJtdXRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT53ZHNwLmlkY3RfcGVybSk7CiAKLSAgICBmZl9pbml0X3NjYW50YWJsZSh3LT5pZGN0X3Blcm11dGF0aW9uLCAmdy0+c2NhbnRhYmxlWzBdLCBmZl93bXYxX3NjYW50YWJsZVswXSk7Ci0gICAgZmZfaW5pdF9zY2FudGFibGUody0+aWRjdF9wZXJtdXRhdGlvbiwgJnctPnNjYW50YWJsZVsxXSwgZmZfd212MV9zY2FudGFibGVbMl0pOwotICAgIGZmX2luaXRfc2NhbnRhYmxlKHctPmlkY3RfcGVybXV0YXRpb24sICZ3LT5zY2FudGFibGVbMl0sIGZmX3dtdjFfc2NhbnRhYmxlWzNdKTsKKyAgICBmZl9pbml0X3NjYW50YWJsZSh3LT5pZGN0X3Blcm11dGF0aW9uLCAmdy0+c2NhbnRhYmxlWzBdLAorICAgICAgICAgICAgICAgICAgICAgIGZmX3dtdjFfc2NhbnRhYmxlWzBdKTsKKyAgICBmZl9pbml0X3NjYW50YWJsZSh3LT5pZGN0X3Blcm11dGF0aW9uLCAmdy0+c2NhbnRhYmxlWzFdLAorICAgICAgICAgICAgICAgICAgICAgIGZmX3dtdjFfc2NhbnRhYmxlWzJdKTsKKyAgICBmZl9pbml0X3NjYW50YWJsZSh3LT5pZGN0X3Blcm11dGF0aW9uLCAmdy0+c2NhbnRhYmxlWzJdLAorICAgICAgICAgICAgICAgICAgICAgIGZmX3dtdjFfc2NhbnRhYmxlWzNdKTsKIAogICAgIGZmX2ludHJheDhkc3BfaW5pdCgmdy0+ZHNwKTsKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZ3LT5iZHNwLCBhdmN0eCk7CisKKyAgICByZXR1cm4gMDsKIH0KIAotLyoqCi0gKiBEZXN0cm95IEludHJhWDggZnJhbWUgc3RydWN0dXJlLgotICogQHBhcmFtIHcgcG9pbnRlciB0byBJbnRyYVg4Q29udGV4dAotICovCi1hdl9jb2xkIHZvaWQgZmZfaW50cmF4OF9jb21tb25fZW5kKEludHJhWDhDb250ZXh0ICogdykKK2F2X2NvbGQgdm9pZCBmZl9pbnRyYXg4X2NvbW1vbl9lbmQoSW50cmFYOENvbnRleHQgKncpCiB7CiAgICAgYXZfZnJlZXAoJnctPnByZWRpY3Rpb25fdGFibGUpOwogfQogCi0vKioKLSAqIERlY29kZSBzaW5nbGUgSW50cmFYOCBmcmFtZS4KLSAqIFRoZSBwYXJlbnQgY29kZWMgbXVzdCBmaWxsIHMtPmxvb3BmaWx0ZXIgYW5kIHMtPmdiIChiaXRzdHJlYW0pLgotICogVGhlIHBhcmVudCBjb2RlYyBtdXN0IGNhbGwgZmZfbXB2X2ZyYW1lX3N0YXJ0KCksIGZmX2VyX2ZyYW1lX3N0YXJ0KCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAqIFRoZSBwYXJlbnQgY29kZWMgbXVzdCBjYWxsIGZmX2VyX2ZyYW1lX2VuZCgpLCBmZl9tcHZfZnJhbWVfZW5kKCkgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgZmZfbXB2X2RlY29kZV9tYigpLgotICogbG93cmVzIGRlY29kaW5nIGlzIHRoZW9yZXRpY2FsbHkgaW1wb3NzaWJsZS4KLSAqIEBwYXJhbSB3IHBvaW50ZXIgdG8gSW50cmFYOENvbnRleHQKLSAqIEBwYXJhbSBkcXVhbnQgZG91YmxlZCBxdWFudGl6ZXIsIGl0IHdvdWxkIGJlIG9kZCBpbiBjYXNlIG9mIFZDLTEgaGFsZnBxPT0xLgotICogQHBhcmFtIHF1YW50X29mZnNldCBvZmZzZXQgYXdheSBmcm9tIHplcm8KLSAqLwotaW50IGZmX2ludHJheDhfZGVjb2RlX3BpY3R1cmUoSW50cmFYOENvbnRleHQgKiBjb25zdCB3LCBpbnQgZHF1YW50LCBpbnQgcXVhbnRfb2Zmc2V0KXsKLSAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHM9IHctPnM7CitpbnQgZmZfaW50cmF4OF9kZWNvZGVfcGljdHVyZShJbnRyYVg4Q29udGV4dCAqdywgUGljdHVyZSAqcGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJpdENvbnRleHQgKmdiLCBpbnQgKm1iX3gsIGludCAqbWJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkcXVhbnQsIGludCBxdWFudF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9vcGZpbHRlciwgaW50IGxvd2RlbGF5KQorewogICAgIGludCBtYl94eTsKLSAgICB3LT51c2VfcXVhbnRfbWF0cml4ID0gZ2V0X2JpdHMxKCZzLT5nYik7CiAKKyAgICB3LT5nYiAgICAgPSBnYjsKICAgICB3LT5kcXVhbnQgPSBkcXVhbnQ7CiAgICAgdy0+cXVhbnQgID0gZHF1YW50ID4+IDE7CiAgICAgdy0+cXN1bSAgID0gcXVhbnRfb2Zmc2V0OworICAgIHctPmZyYW1lICA9IHBpY3QtPmY7CisgICAgdy0+bG9vcGZpbHRlciA9IGxvb3BmaWx0ZXI7CisgICAgdy0+dXNlX3F1YW50X21hdHJpeCA9IGdldF9iaXRzMSh3LT5nYik7CiAKLSAgICB3LT5kaXZpZGVfcXVhbnRfZGNfbHVtYSA9ICgoMTw8MTYpICsgKHctPnF1YW50Pj4xKSkgLyB3LT5xdWFudDsKLSAgICBpZih3LT5xdWFudCA8IDUpewotICAgICAgICB3LT5xdWFudF9kY19jaHJvbWEgPSAgdy0+cXVhbnQ7CisgICAgdy0+bWJfeCA9ICptYl94OworICAgIHctPm1iX3kgPSAqbWJfeTsKKworICAgIHctPmRpdmlkZV9xdWFudF9kY19sdW1hID0gKCgxIDw8IDE2KSArICh3LT5xdWFudCA+PiAxKSkgLyB3LT5xdWFudDsKKyAgICBpZiAody0+cXVhbnQgPCA1KSB7CisgICAgICAgIHctPnF1YW50X2RjX2Nocm9tYSAgICAgICAgPSB3LT5xdWFudDsKICAgICAgICAgdy0+ZGl2aWRlX3F1YW50X2RjX2Nocm9tYSA9IHctPmRpdmlkZV9xdWFudF9kY19sdW1hOwotICAgIH1lbHNlewotICAgICAgICB3LT5xdWFudF9kY19jaHJvbWEgPSAgdy0+cXVhbnQrKCh3LT5xdWFudCszKT4+Myk7Ci0gICAgICAgIHctPmRpdmlkZV9xdWFudF9kY19jaHJvbWEgPSAoKDE8PDE2KSArICh3LT5xdWFudF9kY19jaHJvbWE+PjEpKSAvIHctPnF1YW50X2RjX2Nocm9tYTsKKyAgICB9IGVsc2UgeworICAgICAgICB3LT5xdWFudF9kY19jaHJvbWEgICAgICAgID0gdy0+cXVhbnQgKyAoKHctPnF1YW50ICsgMykgPj4gMyk7CisgICAgICAgIHctPmRpdmlkZV9xdWFudF9kY19jaHJvbWEgPSAoKDEgPDwgMTYpICsgKHctPnF1YW50X2RjX2Nocm9tYSA+PiAxKSkgLyB3LT5xdWFudF9kY19jaHJvbWE7CiAgICAgfQogICAgIHg4X3Jlc2V0X3ZsY190YWJsZXModyk7CiAKLSAgICBzLT5yZXN5bmNfbWJfeD0wOwotICAgIHMtPnJlc3luY19tYl95PTA7Ci0KLSAgICBmb3Iocy0+bWJfeT0wOyBzLT5tYl95IDwgcy0+bWJfaGVpZ2h0KjI7IHMtPm1iX3krKyl7Ci0gICAgICAgIHg4X2luaXRfYmxvY2tfaW5kZXgocyk7Ci0gICAgICAgIG1iX3h5PShzLT5tYl95Pj4xKSpzLT5tYl9zdHJpZGU7Ci0KLSAgICAgICAgZm9yKHMtPm1iX3g9MDsgcy0+bWJfeCA8IHMtPm1iX3dpZHRoKjI7IHMtPm1iX3grKyl7CisgICAgZm9yICh3LT5tYl95ID0gMDsgdy0+bWJfeSA8IHctPm1iX2hlaWdodCAqIDI7IHctPm1iX3krKykgeworICAgICAgICB4OF9pbml0X2Jsb2NrX2luZGV4KHcsIHctPmZyYW1lKTsKKyAgICAgICAgbWJfeHkgPSAody0+bWJfeSA+PiAxKSAqICh3LT5tYl93aWR0aCArIDEpOworICAgICAgICBmb3IgKHctPm1iX3ggPSAwOyB3LT5tYl94IDwgdy0+bWJfd2lkdGggKiAyOyB3LT5tYl94KyspIHsKICAgICAgICAgICAgIHg4X2dldF9wcmVkaWN0aW9uKHcpOwotICAgICAgICAgICAgaWYoeDhfc2V0dXBfc3BhdGlhbF9wcmVkaWN0b3IodywwKSkgZ290byBlcnJvcjsKLSAgICAgICAgICAgIGlmKHg4X2RlY29kZV9pbnRyYV9tYih3LDApKSBnb3RvIGVycm9yOworICAgICAgICAgICAgaWYgKHg4X3NldHVwX3NwYXRpYWxfcHJlZGljdG9yKHcsIDApKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICBpZiAoeDhfZGVjb2RlX2ludHJhX21iKHcsIDApKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKLSAgICAgICAgICAgIGlmKCBzLT5tYl94ICYgcy0+bWJfeSAmIDEgKXsKKyAgICAgICAgICAgIGlmICh3LT5tYl94ICYgdy0+bWJfeSAmIDEpIHsKICAgICAgICAgICAgICAgICB4OF9nZXRfcHJlZGljdGlvbl9jaHJvbWEodyk7CiAKLSAgICAgICAgICAgICAgICAvKndoZW4gc2V0dGluZyB1cCBjaHJvbWEsIG5vIHZsYyBpcyByZWFkLAotICAgICAgICAgICAgICAgIHNvIG5vIGVycm9yIGNvbmRpdGlvbiBjYW4gYmUgcmVhY2hlZCovCi0gICAgICAgICAgICAgICAgeDhfc2V0dXBfc3BhdGlhbF9wcmVkaWN0b3IodywxKTsKLSAgICAgICAgICAgICAgICBpZih4OF9kZWNvZGVfaW50cmFfbWIodywxKSkgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAvKiB3aGVuIHNldHRpbmcgdXAgY2hyb21hLCBubyB2bGMgaXMgcmVhZCwKKyAgICAgICAgICAgICAgICAgKiBzbyBubyBlcnJvciBjb25kaXRpb24gY2FuIGJlIHJlYWNoZWQgKi8KKyAgICAgICAgICAgICAgICB4OF9zZXR1cF9zcGF0aWFsX3ByZWRpY3Rvcih3LCAxKTsKKyAgICAgICAgICAgICAgICBpZiAoeDhfZGVjb2RlX2ludHJhX21iKHcsIDEpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogCi0gICAgICAgICAgICAgICAgeDhfc2V0dXBfc3BhdGlhbF9wcmVkaWN0b3IodywyKTsKLSAgICAgICAgICAgICAgICBpZih4OF9kZWNvZGVfaW50cmFfbWIodywyKSkgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICB4OF9zZXR1cF9zcGF0aWFsX3ByZWRpY3Rvcih3LCAyKTsKKyAgICAgICAgICAgICAgICBpZiAoeDhfZGVjb2RlX2ludHJhX21iKHcsIDIpKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogCi0gICAgICAgICAgICAgICAgcy0+ZGVzdFsxXSs9IDg7Ci0gICAgICAgICAgICAgICAgcy0+ZGVzdFsyXSs9IDg7CisgICAgICAgICAgICAgICAgdy0+ZGVzdFsxXSArPSA4OworICAgICAgICAgICAgICAgIHctPmRlc3RbMl0gKz0gODsKIAotICAgICAgICAgICAgICAgIC8qZW11bGF0ZSBNQiBpbmZvIGluIHRoZSByZWxldmFudCB0YWJsZXMqLwotICAgICAgICAgICAgICAgIHMtPm1ic2tpcF90YWJsZSBbbWJfeHldPTA7Ci0gICAgICAgICAgICAgICAgcy0+bWJpbnRyYV90YWJsZVttYl94eV09MTsKLSAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUucXNjYWxlX3RhYmxlW21iX3h5XSA9IHctPnF1YW50OworICAgICAgICAgICAgICAgIHBpY3QtPnFzY2FsZV90YWJsZVttYl94eV0gPSB3LT5xdWFudDsKICAgICAgICAgICAgICAgICBtYl94eSsrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+ZGVzdFswXSs9IDg7CisgICAgICAgICAgICB3LT5kZXN0WzBdICs9IDg7CiAgICAgICAgIH0KLSAgICAgICAgaWYocy0+bWJfeSYxKXsKLSAgICAgICAgICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIChzLT5tYl95LTEpKjgsIDE2KTsKLSAgICAgICAgfQorICAgICAgICBpZiAody0+bWJfeSAmIDEpCisgICAgICAgICAgICBmZl9kcmF3X2hvcml6X2JhbmQody0+YXZjdHgsIHctPmZyYW1lLCB3LT5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAody0+bWJfeSAtIDEpICogOCwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUElDVF9GUkFNRSwgMCwgbG93ZGVsYXkpOwogICAgIH0KIAogZXJyb3I6Ci0gICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LAotICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1iX3g+PjEpLTEsIChzLT5tYl95Pj4xKS0xLAotICAgICAgICAgICAgICAgICAgICAgICAgRVJfTUJfRU5EICk7CisgICAgKm1iX3ggPSB3LT5tYl94OworICAgICptYl95ID0gdy0+bWJfeTsKKwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pbnRyYXg4LmggYi9saWJhdmNvZGVjL2ludHJheDguaAppbmRleCA5OTgxNzg1Li41Yjg5NDZlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2ludHJheDguaAorKysgYi9saWJhdmNvZGVjL2ludHJheDguaApAQCAtMTksMzMgKzE5LDQ4IEBACiAjaWZuZGVmIEFWQ09ERUNfSU5UUkFYOF9ICiAjZGVmaW5lIEFWQ09ERUNfSU5UUkFYOF9ICiAKKyNpbmNsdWRlICJibG9ja2RzcC5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCi0jaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAiaWRjdGRzcC5oIgogI2luY2x1ZGUgImludHJheDhkc3AuaCIKICNpbmNsdWRlICJ3bXYyZHNwLmgiCisjaW5jbHVkZSAibXBlZ3BpY3R1cmUuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgSW50cmFYOENvbnRleHQgewotICAgIFZMQyAqIGpfYWNfdmxjWzRdOy8vdGhleSBwb2ludCB0byB0aGUgc3RhdGljIGpfbWJfdmxjCi0gICAgVkxDICogal9vcmllbnRfdmxjOwotICAgIFZMQyAqIGpfZGNfdmxjWzNdOworICAgIFZMQyAqal9hY192bGNbNF07IC8vIHRoZXkgcG9pbnQgdG8gdGhlIHN0YXRpYyBqX21iX3ZsYworICAgIFZMQyAqal9vcmllbnRfdmxjOworICAgIFZMQyAqal9kY192bGNbM107CiAKICAgICBpbnQgdXNlX3F1YW50X21hdHJpeDsKLS8vc2V0IGJ5IGZmX2ludHJheDhfY29tbW9uX2luaXQKLSAgICB1aW50OF90ICogcHJlZGljdGlvbl90YWJsZTsvLzIqKG1iX3cqMikKKworICAgIC8vIHNldCBieSBmZl9pbnRyYXg4X2NvbW1vbl9pbml0CisgICAgdWludDhfdCAqcHJlZGljdGlvbl90YWJsZTsgLy8gMiAqIChtYl93ICogMikKICAgICBTY2FuVGFibGUgc2NhbnRhYmxlWzNdOwogICAgIFdNVjJEU1BDb250ZXh0IHdkc3A7CiAgICAgdWludDhfdCBpZGN0X3Blcm11dGF0aW9uWzY0XTsKLS8vc2V0IGJ5IHRoZSBjYWxsZXIgY29kZWMKLSAgICBNcGVnRW5jQ29udGV4dCAqIHM7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCAqYmxvY2tfbGFzdF9pbmRleDsgIC8vLzwgbGFzdCBub256ZXJvIGNvZWZmaWNpZW50IGluIGJsb2NrCisgICAgaW50MTZfdCAoKmJsb2NrKVs2NF07CisKKyAgICAvLyBzZXQgYnkgdGhlIGNhbGxlciBjb2RlYwogICAgIEludHJhWDhEU1BDb250ZXh0IGRzcDsKKyAgICBJRENURFNQQ29udGV4dCBpZHNwOworICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOwogICAgIGludCBxdWFudDsKICAgICBpbnQgZHF1YW50OwogICAgIGludCBxc3VtOwotLy9jYWxjdWxhdGVkIHBlciBmcmFtZQorICAgIGludCBsb29wZmlsdGVyOworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIEdldEJpdENvbnRleHQgKmdiOworCisgICAgLy8gY2FsY3VsYXRlZCBwZXIgZnJhbWUKICAgICBpbnQgcXVhbnRfZGNfY2hyb21hOwogICAgIGludCBkaXZpZGVfcXVhbnRfZGNfbHVtYTsKICAgICBpbnQgZGl2aWRlX3F1YW50X2RjX2Nocm9tYTsKLS8vY2hhbmdlZCBwZXIgYmxvY2sKKyAgICB1aW50OF90ICpkZXN0WzNdOworICAgIHVpbnQ4X3Qgc2NyYXRjaHBhZFs0Ml07IC8vIHNpemUgb2YgdGhlIGJsb2NrIGlzIGZpeGVkICg4eDggcGx1cyBwYWRkaW5nKQorCisgICAgLy8gY2hhbmdlZCBwZXIgYmxvY2sKICAgICBpbnQgZWRnZXM7CiAgICAgaW50IGZsYXRfZGM7CiAgICAgaW50IHByZWRpY3RlZF9kYzsKQEAgLTUzLDEwICs2OCw1MCBAQAogICAgIGludCBjaHJvbWFfb3JpZW50OwogICAgIGludCBvcmllbnQ7CiAgICAgaW50IGVzdF9ydW47CisKKyAgICAvLyBibG9jayBwcm9wcworICAgIGludCBtYl94LCBtYl95OworICAgIGludCBtYl93aWR0aCwgbWJfaGVpZ2h0OwogfSBJbnRyYVg4Q29udGV4dDsKIAotdm9pZCBmZl9pbnRyYXg4X2NvbW1vbl9pbml0KEludHJhWDhDb250ZXh0ICogdywgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzKTsKLXZvaWQgZmZfaW50cmF4OF9jb21tb25fZW5kKEludHJhWDhDb250ZXh0ICogdyk7Ci1pbnQgIGZmX2ludHJheDhfZGVjb2RlX3BpY3R1cmUoSW50cmFYOENvbnRleHQgKiB3LCBpbnQgcXVhbnQsIGludCBoYWxmcHEpOworLyoqCisgKiBJbml0aWFsaXplIEludHJhWDggZnJhbWUgZGVjb2Rlci4KKyAqIEBwYXJhbSBhdmN0eCBwb2ludGVyIHRvIEFWQ29kZWNDb250ZXh0CisgKiBAcGFyYW0gdyBwb2ludGVyIHRvIEludHJhWDhDb250ZXh0CisgKiBAcGFyYW0gaWRzcCBwb2ludGVyIHRvIElEQ1REU1BDb250ZXh0CisgKiBAcGFyYW0gYmxvY2sgcG9pbnRlciB0byBibG9jayBhcnJheQorICogQHBhcmFtIGJsb2NrX2xhc3RfaW5kZXggcG9pbnRlciB0byBpbmRleCBhcnJheQorICogQHBhcmFtIG1iX3dpZHRoIG1hY3JvYmxvY2sgd2lkdGgKKyAqIEBwYXJhbSBtYl9oZWlnaHQgbWFjcm9ibG9jayBoZWlnaHQKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgdmFsdWUgb24gZXJyb3IKKyAqLworaW50IGZmX2ludHJheDhfY29tbW9uX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmFYOENvbnRleHQgKncsIElEQ1REU1BDb250ZXh0ICppZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAoKmJsb2NrKVs2NF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfbGFzdF9pbmRleFsxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfd2lkdGgsIGludCBtYl9oZWlnaHQpOworCisvKioKKyAqIERlc3Ryb3kgSW50cmFYOCBmcmFtZSBzdHJ1Y3R1cmUuCisgKiBAcGFyYW0gdyBwb2ludGVyIHRvIEludHJhWDhDb250ZXh0CisgKi8KK3ZvaWQgZmZfaW50cmF4OF9jb21tb25fZW5kKEludHJhWDhDb250ZXh0ICp3KTsKKworLyoqCisgKiBEZWNvZGUgc2luZ2xlIEludHJhWDggZnJhbWUuCisgKiBsb3dyZXMgZGVjb2RpbmcgaXMgdGhlb3JldGljYWxseSBpbXBvc3NpYmxlLgorICogQHBhcmFtIHcgcG9pbnRlciB0byBJbnRyYVg4Q29udGV4dAorICogQHBhcmFtIHBpY3QgdGhlIG91dHB1dCBQaWN0dXJlIGNvbnRhaW5pbmcgYW4gQVZGcmFtZQorICogQHBhcmFtIGdiIG9wZW4gYml0c3RyZWFtIHJlYWRlcgorICogQHBhcmFtIG1iX3ggcG9pbnRlciB0byB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50IG1hY3JvYmxvY2sKKyAqIEBwYXJhbSBtYl95IHBvaW50ZXIgdG8gdGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgY3VycmVudCBtYWNyb2Jsb2NrCisgKiBAcGFyYW0gZHF1YW50IGRvdWJsZWQgcXVhbnRpemVyLCBpdCB3b3VsZCBiZSBvZGQgaW4gY2FzZSBvZiBWQy0xIGhhbGZwcT09MS4KKyAqIEBwYXJhbSBxdWFudF9vZmZzZXQgb2Zmc2V0IGF3YXkgZnJvbSB6ZXJvCisgKiBAcGFyYW0gbG9vcGZpbHRlciBlbmFibGUgZmlsdGVyIGFmdGVyIGRlY29kaW5nIGEgYmxvY2sKKyAqLworaW50IGZmX2ludHJheDhfZGVjb2RlX3BpY3R1cmUoSW50cmFYOENvbnRleHQgKncsIFBpY3R1cmUgKnBpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpnYiwgaW50ICptYl94LCBpbnQgKm1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbnQsIGludCBoYWxmcHEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9vcGZpbHRlciwgaW50IGxvd2RlbGF5KTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfSU5UUkFYOF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ludHJheDhkc3AuYyBiL2xpYmF2Y29kZWMvaW50cmF4OGRzcC5jCmluZGV4IDFiMzRmODkuLjgwYzM5MjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaW50cmF4OGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvaW50cmF4OGRzcC5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKi8KIAogLyoqCi0qIEBmaWxlCisgKiBAZmlsZQogICpAYnJpZWYgSW50cmFYOCBmcmFtZSBzdWJkZWNvZGVyIGltYWdlIG1hbmlwdWxhdGlvbiByb3V0aW5lcwogICovCiAKQEAgLTI1LDI3ICsyNSwyNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKIAogLyoKLWFyZWEgcG9zaXRpb25zLCAjMyBpcyAxIHBpeGVsIG9ubHksIG90aGVyIGFyZSA4IHBpeGVscwotICAgfDY2NjY2NjY2fAotICAzfDQ0NDQ0NDQ0fDU1NTU1NTU1fAotLSAtKy0tLS0tLS0tKy0tLS0tLS0tKwotMSAyfFhYWFhYWFhYfAotMSAyfFhYWFhYWFhYfAotMSAyfFhYWFhYWFhYfAotMSAyfFhYWFhYWFhYfAotMSAyfFhYWFhYWFhYfAotMSAyfFhYWFhYWFhYfAotMSAyfFhYWFhYWFhYfAotMSAyfFhYWFhYWFhYfAotXi1zdGFydAotKi8KKyAqIGFyZWEgcG9zaXRpb25zLCAjMyBpcyAxIHBpeGVsIG9ubHksIG90aGVyIGFyZSA4IHBpeGVscworICogICAgfDY2NjY2NjY2fAorICogICAzfDQ0NDQ0NDQ0fDU1NTU1NTU1fAorICogLSAtKy0tLS0tLS0tKy0tLS0tLS0tKworICogMSAyfFhYWFhYWFhYfAorICogMSAyfFhYWFhYWFhYfAorICogMSAyfFhYWFhYWFhYfAorICogMSAyfFhYWFhYWFhYfAorICogMSAyfFhYWFhYWFhYfAorICogMSAyfFhYWFhYWFhYfAorICogMSAyfFhYWFhYWFhYfAorICogMSAyfFhYWFhYWFhYfAorICogXi1zdGFydAorICovCiAKICNkZWZpbmUgYXJlYTEgKDApCiAjZGVmaW5lIGFyZWEyICg4KQotI2RlZmluZSBhcmVhMyAoOCs4KQotI2RlZmluZSBhcmVhNCAoOCs4KzEpCi0jZGVmaW5lIGFyZWE1ICg4KzgrMSs4KQotI2RlZmluZSBhcmVhNiAoOCs4KzErMTYpCisjZGVmaW5lIGFyZWEzICg4ICsgOCkKKyNkZWZpbmUgYXJlYTQgKDggKyA4ICsgMSkKKyNkZWZpbmUgYXJlYTUgKDggKyA4ICsgMSArIDgpCisjZGVmaW5lIGFyZWE2ICg4ICsgOCArIDEgKyAxNikKIAogLyoqCiAgQ29sbGVjdCBzdGF0aXN0aWNzIGFuZCBwcmVwYXJlIHRoZSBlZGdlIHBpeGVscyByZXF1aXJlZCBieSB0aGUgb3RoZXIgc3BhdGlhbCBjb21wZW5zYXRpb24gZnVuY3Rpb25zLgpAQCAtNjEsMzcyICs2MSw0MDUgQEAKICAgICAgICAgICAgICAgICAyICAgLSBtYl95PT0wIC0gZmlyc3Qgcm93LCBpbnRlcnBvbGF0ZSBhcmVhICMzLCM0LCM1LCM2OwogICAgICAgICBub3RlOiAgIDF8MiAtIG1iX3g9PW1iX3k9PTAgLSBmaXJzdCBibG9jaywgdXNlIDB4ODAgdmFsdWUgZm9yIGFsbCBhcmVhczsKICAgICAgICAgICAgICAgICA0ICAgLSBtYl94Pj0gKG1iX3dpZHRoLTEpIGxhc3QgYmxvY2sgaW4gdGhlIHJvdywgaW50ZXJwb2xhdGUgYXJlYSAjNTsKLSovCi1zdGF0aWMgdm9pZCB4OF9zZXR1cF9zcGF0aWFsX2NvbXBlbnNhdGlvbih1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplLAotICAgICAgICAgICBpbnQgKiByYW5nZSwgaW50ICogcHN1bSwgIGludCBlZGdlcyl7Ci0gICAgdWludDhfdCAqIHB0cjsKKy0qLworc3RhdGljIHZvaWQgeDhfc2V0dXBfc3BhdGlhbF9jb21wZW5zYXRpb24odWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgKnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpwc3VtLCBpbnQgZWRnZXMpCit7CisgICAgdWludDhfdCAqcHRyOwogICAgIGludCBzdW07CiAgICAgaW50IGk7Ci0gICAgaW50IG1pbl9waXgsbWF4X3BpeDsKKyAgICBpbnQgbWluX3BpeCwgbWF4X3BpeDsKICAgICB1aW50OF90IGM7CiAKLSAgICBpZigoZWRnZXMmMyk9PTMpewotICAgICAgICAqcHN1bT0weDgwKig4KzErOCsyKTsKLSAgICAgICAgKnJhbmdlPTA7Ci0gICAgICAgIG1lbXNldChkc3QsMHg4MCwxNisxKzE2KzgpOwotICAgICAgICAvL3RoaXMgdHJpZ2dlcnMgZmxhdF9kYyBmb3Igc3VyZS4KLSAgICAgICAgLy9mbGF0X2RjIGF2b2lkcyBhbGwgKG90aGVyKSBwcmVkaWN0aW9uIG1vZGVzLCBidXQgcmVxdWlyZXMgZGNfbGV2ZWwgZGVjb2RpbmcuCisgICAgaWYgKChlZGdlcyAmIDMpID09IDMpIHsKKyAgICAgICAgKnBzdW0gID0gMHg4MCAqICg4ICsgMSArIDggKyAyKTsKKyAgICAgICAgKnJhbmdlID0gMDsKKyAgICAgICAgbWVtc2V0KGRzdCwgMHg4MCwgMTYgKyAxICsgMTYgKyA4KTsKKyAgICAgICAgLyogdGhpcyB0cmlnZ2VycyBmbGF0X2RjIGZvciBzdXJlLiBmbGF0X2RjIGF2b2lkcyBhbGwgKG90aGVyKQorICAgICAgICAgKiBwcmVkaWN0aW9uIG1vZGVzLCBidXQgcmVxdWlyZXMgZGNfbGV2ZWwgZGVjb2RpbmcuICovCiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtaW5fcGl4PTI1NjsKLSAgICBtYXhfcGl4PS0xOworICAgIG1pbl9waXggPSAyNTY7CisgICAgbWF4X3BpeCA9IC0xOwogCi0gICAgc3VtPTA7CisgICAgc3VtID0gMDsKIAotICAgIGlmKCEoZWRnZXMmMSkpey8vKG1iX3ghPTApLy90aGVyZSBpcyBwcmV2aW91cyBibG9jayBvbiB0aGlzIHJvdwotICAgICAgICBwdHI9c3JjLTE7Ly9sZWZ0IGNvbHVtbiwgYXJlYSAyCi0gICAgICAgIGZvcihpPTc7aT49MDtpLS0pewotICAgICAgICAgICAgYz0qKHB0ci0xKTsvL2FyZWExLCBzYW1lIG1iIGFzIGFyZWEyLCBubyBuZWVkIHRvIGNoZWNrCi0gICAgICAgICAgICBkc3RbYXJlYTEraV09YzsKLSAgICAgICAgICAgIGM9KihwdHIpOworICAgIGlmICghKGVkZ2VzICYgMSkpIHsgLy8gKG1iX3ggIT0gMCkgLy8gdGhlcmUgaXMgcHJldmlvdXMgYmxvY2sgb24gdGhpcyByb3cKKyAgICAgICAgcHRyID0gc3JjIC0gMTsgLy8gbGVmdCBjb2x1bW4sIGFyZWEgMgorICAgICAgICBmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgYyAgICAgICAgICAgICAgPSAqKHB0ciAtIDEpOyAvLyBhcmVhMSwgc2FtZSBtYiBhcyBhcmVhMiwgbm8gbmVlZCB0byBjaGVjaworICAgICAgICAgICAgZHN0W2FyZWExICsgaV0gPSBjOworICAgICAgICAgICAgYyAgICAgICAgICAgICAgPSAqcHRyOwogCi0gICAgICAgICAgICBzdW0rPWM7Ci0gICAgICAgICAgICBtaW5fcGl4PUZGTUlOKG1pbl9waXgsYyk7Ci0gICAgICAgICAgICBtYXhfcGl4PUZGTUFYKG1heF9waXgsYyk7Ci0gICAgICAgICAgICBkc3RbYXJlYTIraV09YzsKKyAgICAgICAgICAgIHN1bSAgICAgICAgICAgKz0gYzsKKyAgICAgICAgICAgIG1pbl9waXggICAgICAgID0gRkZNSU4obWluX3BpeCwgYyk7CisgICAgICAgICAgICBtYXhfcGl4ICAgICAgICA9IEZGTUFYKG1heF9waXgsIGMpOworICAgICAgICAgICAgZHN0W2FyZWEyICsgaV0gPSBjOwogCi0gICAgICAgICAgICBwdHIrPWxpbmVzaXplOworICAgICAgICAgICAgcHRyICs9IHN0cmlkZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmKCEoZWRnZXMmMikpeyAgLy8obWJfeSE9MCkvL3RoZXJlIGlzIHJvdyBhYm92ZQotICAgICAgICBwdHI9c3JjLWxpbmVzaXplOy8vdG9wIGxpbmUKLSAgICAgICAgZm9yKGk9MDtpPDg7aSsrKXsKLSAgICAgICAgICAgIGM9KihwdHIraSk7Ci0gICAgICAgICAgICBzdW0rPWM7Ci0gICAgICAgICAgICBtaW5fcGl4PUZGTUlOKG1pbl9waXgsIGMpOwotICAgICAgICAgICAgbWF4X3BpeD1GRk1BWChtYXhfcGl4LCBjKTsKKyAgICBpZiAoIShlZGdlcyAmIDIpKSB7IC8vIChtYl95ICE9IDApIC8vIHRoZXJlIGlzIHJvdyBhYm92ZQorICAgICAgICBwdHIgPSBzcmMgLSBzdHJpZGU7IC8vIHRvcCBsaW5lCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGMgICAgICAgPSAqKHB0ciArIGkpOworICAgICAgICAgICAgc3VtICAgICs9IGM7CisgICAgICAgICAgICBtaW5fcGl4ID0gRkZNSU4obWluX3BpeCwgYyk7CisgICAgICAgICAgICBtYXhfcGl4ID0gRkZNQVgobWF4X3BpeCwgYyk7CiAgICAgICAgIH0KLSAgICAgICAgaWYoZWRnZXMmNCl7Ly9sYXN0IGJsb2NrIG9uIHRoZSByb3c/Ci0gICAgICAgICAgICBtZW1zZXQoZHN0K2FyZWE1LGMsOCk7Ly9zZXQgd2l0aCBsYXN0IHBpeGVsIGZyCi0gICAgICAgICAgICBtZW1jcHkoZHN0K2FyZWE0LCBwdHIsIDgpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIG1lbWNweShkc3QrYXJlYTQsIHB0ciwgMTYpOy8vYm90aCBhcmVhNCBhbmQgNQorICAgICAgICBpZiAoZWRnZXMgJiA0KSB7IC8vIGxhc3QgYmxvY2sgb24gdGhlIHJvdz8KKyAgICAgICAgICAgIG1lbXNldChkc3QgKyBhcmVhNSwgYywgOCk7IC8vIHNldCB3aXRoIGxhc3QgcGl4ZWwgZnIKKyAgICAgICAgICAgIG1lbWNweShkc3QgKyBhcmVhNCwgcHRyLCA4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShkc3QgKyBhcmVhNCwgcHRyLCAxNik7IC8vIGJvdGggYXJlYTQgYW5kIDUKICAgICAgICAgfQotICAgICAgICBtZW1jcHkoZHN0K2FyZWE2LCBwdHItbGluZXNpemUsIDgpOy8vYXJlYTYgYWx3YXlzIHByZXNlbnQgaW4gdGhlIGFib3ZlIGJsb2NrCisgICAgICAgIC8vIGFyZWE2IGFsd2F5cyBwcmVzZW50IGluIHRoZSBhYm92ZSBibG9jaworICAgICAgICBtZW1jcHkoZHN0ICsgYXJlYTYsIHB0ciAtIHN0cmlkZSwgOCk7CiAgICAgfQotICAgIC8vbm93IGNhbGN1bGF0ZSB0aGUgc3R1ZmYgd2UgbmVlZAotICAgIGlmKGVkZ2VzJjMpey8vbWJfeD09MCB8fCBtYl95PT0wKXsKLSAgICAgICAgaW50IGF2Zz0oc3VtKzQpPj4zOwotICAgICAgICBpZihlZGdlcyYxKXsgLy8obWJfeD09MCkgey8vaW1wbGllcyBtYl95IT0wCi0gICAgICAgICAgICBtZW1zZXQoZHN0K2FyZWExLGF2Zyw4KzgrMSk7Ly9hcmVhcyAxLDIgYW5kIDMgYXJlIGF2ZXJhZ2VkCi0gICAgICAgIH1lbHNley8vaW1wbGllcyB5PT0wIHghPTAKLSAgICAgICAgICAgIG1lbXNldChkc3QrYXJlYTMsYXZnLCAxKzE2KzgpOy8vYXJlYXMgMywgNCw1LDYKLSAgICAgICAgfQotICAgICAgICBzdW0rPWF2Zyo5OwotICAgIH1lbHNlewotICAgICAgICB1aW50OF90IGM9KihzcmMtMS1saW5lc2l6ZSk7Ly90aGUgZWRnZSBwaXhlbCwgaW4gdGhlIHRvcCBsaW5lIGFuZCBsZWZ0IGNvbHVtbgotICAgICAgICBkc3RbYXJlYTNdPWM7Ci0gICAgICAgIHN1bSs9YzsKLSAgICAgICAgLy9lZGdlIHBpeGVsIGlzIG5vdCBwYXJ0IG9mIG1pbi9tYXgKKyAgICAvLyBub3cgY2FsY3VsYXRlIHRoZSBzdHVmZiB3ZSBuZWVkCisgICAgaWYgKGVkZ2VzICYgMykgeyAvLyBtYl94ID09MCB8fCBtYl95ID09IDApIHsKKyAgICAgICAgaW50IGF2ZyA9IChzdW0gKyA0KSA+PiAzOworCisgICAgICAgIGlmIChlZGdlcyAmIDEpIC8vIChtYl94ID09IDApIHsgLy8gaW1wbGllcyBtYl95ICE9MAorICAgICAgICAgICAgbWVtc2V0KGRzdCArIGFyZWExLCBhdmcsIDggKyA4ICsgMSk7IC8vIGFyZWFzIDEsIDIsIDMgYXJlIGF2ZXJhZ2VkCisgICAgICAgIGVsc2UgLy8gaW1wbGllcyB5ID09IDAgeCAhPSAwCisgICAgICAgICAgICBtZW1zZXQoZHN0ICsgYXJlYTMsIGF2ZywgMSArIDE2ICsgOCk7IC8vIGFyZWFzIDMsIDQsIDUsIDYKKworICAgICAgICBzdW0gKz0gYXZnICogOTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB0aGUgZWRnZSBwaXhlbCwgaW4gdGhlIHRvcCBsaW5lIGFuZCBsZWZ0IGNvbHVtbgorICAgICAgICB1aW50OF90IGMgPSAqKHNyYyAtIDEgLSBzdHJpZGUpOworICAgICAgICBkc3RbYXJlYTNdID0gYzsKKyAgICAgICAgc3VtICAgICAgICs9IGM7CisgICAgICAgIC8vIGVkZ2UgcGl4ZWwgaXMgbm90IHBhcnQgb2YgbWluL21heAogICAgIH0KLSAgICAoKnJhbmdlKSA9IG1heF9waXggLSBtaW5fcGl4OwotICAgIHN1bSArPSAqKGRzdCthcmVhNSkgKyAqKGRzdCthcmVhNSsxKTsKLSAgICAqcHN1bSA9IHN1bTsKKyAgICAqcmFuZ2UgPSBtYXhfcGl4IC0gbWluX3BpeDsKKyAgICBzdW0gICArPSAqKGRzdCArIGFyZWE1KSArICooZHN0ICsgYXJlYTUgKyAxKTsKKyAgICAqcHN1bSAgPSBzdW07CiB9CiAKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHplcm9fcHJlZGljdGlvbl93ZWlnaHRzWzY0KjJdID0gewotICAgIDY0MCwgIDY0MCwgIDY2OSwgIDQ4MCwgIDcwOCwgIDM1NCwgIDc0OCwgMjU3LCAgNzkyLCAxOTgsICA3NjAsIDE0MywgIDgwOCwgMTAxLCAgNzcyLCAgNzIsCi0gICAgNDgwLCAgNjY5LCAgNTM3LCAgNTM3LCAgNTk4LCAgNDE2LCAgNjYxLCAzMTYsICA3MTksIDI1MCwgIDcwNywgMTg1LCAgNzY4LCAxMzQsICA3NDUsICA5NywKLSAgICAzNTQsICA3MDgsICA0MTYsICA1OTgsICA0ODgsICA0ODgsICA1NjQsIDM4OCwgIDYzNCwgMzE3LCAgNjQyLCAyNDEsICA3MTYsIDE3OSwgIDcwNiwgMTMyLAotICAgIDI1NywgIDc0OCwgIDMxNiwgIDY2MSwgIDM4OCwgIDU2NCwgIDQ2OSwgNDY5LCAgNTQzLCAzOTUsICA1NzEsIDMxMSwgIDY1NSwgMjM4LCAgNjYwLCAxODAsCi0gICAgMTk4LCAgNzkyLCAgMjUwLCAgNzE5LCAgMzE3LCAgNjM0LCAgMzk1LCA1NDMsICA0NjksIDQ2OSwgIDUwNywgMzgwLCAgNTk3LCAyOTksICA2MTYsIDIzMSwKLSAgICAxNjEsICA4NTUsICAyMDYsICA3ODgsICAyNjYsICA3MTAsICAzNDAsIDYyMywgIDQxMSwgNTQ4LCAgNDU1LCA0NTUsICA1NDgsIDM2NiwgIDU3NiwgMjg4LAotICAgIDEyMiwgIDk3MiwgIDE1OSwgIDkxNCwgIDIxMSwgIDg0MiwgIDI3NiwgNzU4LCAgMzQxLCA2ODIsICAzODksIDU4NCwgIDQ4MywgNDgzLCAgNTIwLCAzOTAsCi0gICAgMTEwLCAxMTcyLCAgMTQ0LCAxMTA3LCAgMTkzLCAxMDI4LCAgMjU0LCA5MzIsICAzMTcsIDg0NiwgIDM2NiwgNzMxLCAgNDU4LCA2MTEsICA0OTksIDQ5OQorc3RhdGljIGNvbnN0IHVpbnQxNl90IHplcm9fcHJlZGljdGlvbl93ZWlnaHRzWzY0ICogMl0gPSB7CisgICAgNjQwLCAgNjQwLCA2NjksICA0ODAsIDcwOCwgIDM1NCwgNzQ4LCAyNTcsCisgICAgNzkyLCAgMTk4LCA3NjAsICAxNDMsIDgwOCwgIDEwMSwgNzcyLCAgNzIsCisgICAgNDgwLCAgNjY5LCA1MzcsICA1MzcsIDU5OCwgIDQxNiwgNjYxLCAzMTYsCisgICAgNzE5LCAgMjUwLCA3MDcsICAxODUsIDc2OCwgIDEzNCwgNzQ1LCAgOTcsCisgICAgMzU0LCAgNzA4LCA0MTYsICA1OTgsIDQ4OCwgIDQ4OCwgNTY0LCAzODgsCisgICAgNjM0LCAgMzE3LCA2NDIsICAyNDEsIDcxNiwgIDE3OSwgNzA2LCAxMzIsCisgICAgMjU3LCAgNzQ4LCAzMTYsICA2NjEsIDM4OCwgIDU2NCwgNDY5LCA0NjksCisgICAgNTQzLCAgMzk1LCA1NzEsICAzMTEsIDY1NSwgIDIzOCwgNjYwLCAxODAsCisgICAgMTk4LCAgNzkyLCAyNTAsICA3MTksIDMxNywgIDYzNCwgMzk1LCA1NDMsCisgICAgNDY5LCAgNDY5LCA1MDcsICAzODAsIDU5NywgIDI5OSwgNjE2LCAyMzEsCisgICAgMTYxLCAgODU1LCAyMDYsICA3ODgsIDI2NiwgIDcxMCwgMzQwLCA2MjMsCisgICAgNDExLCAgNTQ4LCA0NTUsICA0NTUsIDU0OCwgIDM2NiwgNTc2LCAyODgsCisgICAgMTIyLCAgOTcyLCAxNTksICA5MTQsIDIxMSwgIDg0MiwgMjc2LCA3NTgsCisgICAgMzQxLCAgNjgyLCAzODksICA1ODQsIDQ4MywgIDQ4MywgNTIwLCAzOTAsCisgICAgMTEwLCAxMTcyLCAxNDQsIDExMDcsIDE5MywgMTAyOCwgMjU0LCA5MzIsCisgICAgMzE3LCAgODQ2LCAzNjYsICA3MzEsIDQ1OCwgIDYxMSwgNDk5LCA0OTksCiB9OwogCi1zdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl8wKHVpbnQ4X3QgKnNyYyAsIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplKXsKLSAgICBpbnQgaSxqOwotICAgIGludCB4LHk7Ci0gICAgdW5zaWduZWQgaW50IHA7Ly9wb3dlciBkaXZpZGVkIGJ5IDIKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzAodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHgsIHk7CisgICAgdW5zaWduZWQgaW50IHA7IC8vIHBvd2VyIGRpdmlkZWQgYnkgMgogICAgIGludCBhOwogICAgIHVpbnQxNl90IGxlZnRfc3VtWzJdWzhdID0geyB7IDAgfSB9OwogICAgIHVpbnQxNl90ICB0b3Bfc3VtWzJdWzhdID0geyB7IDAgfSB9OwogCi0gICAgZm9yKGk9MDtpPDg7aSsrKXsKLSAgICAgICAgYT1zcmNbYXJlYTIrNy1pXTw8NDsKLSAgICAgICAgZm9yKGo9MDtqPDg7aisrKXsKLSAgICAgICAgICAgIHA9YWJzKGktaik7Ci0gICAgICAgICAgICBsZWZ0X3N1bVtwJjFdW2pdKz0gYT4+KHA+PjEpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgYSA9IHNyY1thcmVhMiArIDcgLSBpXSA8PCA0OworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICBwICAgICAgICAgICAgICAgICAgID0gYWJzKGkgLSBqKTsKKyAgICAgICAgICAgIGxlZnRfc3VtW3AgJiAxXVtqXSArPSBhID4+IChwID4+IDEpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgZm9yKGk9MDtpPDg7aSsrKXsKLSAgICAgICAgYT1zcmNbYXJlYTQraV08PDQ7Ci0gICAgICAgIGZvcihqPTA7ajw4O2orKyl7Ci0gICAgICAgICAgICBwPWFicyhpLWopOwotICAgICAgICAgICAgdG9wX3N1bVtwJjFdW2pdKz0gICBhPj4ocD4+MSk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBhID0gc3JjW2FyZWE0ICsgaV0gPDwgNDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgcCAgICAgICAgICAgICAgICAgID0gYWJzKGkgLSBqKTsKKyAgICAgICAgICAgIHRvcF9zdW1bcCAmIDFdW2pdICs9IGEgPj4gKHAgPj4gMSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yKDtpPDEwO2krKyl7Ci0gICAgICAgIGE9c3JjW2FyZWE0K2ldPDw0OwotICAgICAgICBmb3Ioaj01O2o8ODtqKyspewotICAgICAgICAgICAgcD1hYnMoaS1qKTsKLSAgICAgICAgICAgIHRvcF9zdW1bcCYxXVtqXSs9ICAgYT4+KHA+PjEpOworICAgIGZvciAoOyBpIDwgMTA7IGkrKykgeworICAgICAgICBhID0gc3JjW2FyZWE0ICsgaV0gPDwgNDsKKyAgICAgICAgZm9yIChqID0gNTsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgcCAgICAgICAgICAgICAgICAgID0gYWJzKGkgLSBqKTsKKyAgICAgICAgICAgIHRvcF9zdW1bcCAmIDFdW2pdICs9IGEgPj4gKHAgPj4gMSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yKDtpPDEyO2krKyl7Ci0gICAgICAgIGE9c3JjW2FyZWE0K2ldPDw0OwotICAgICAgICBmb3Ioaj03O2o8ODtqKyspewotICAgICAgICAgICAgcD1hYnMoaS1qKTsKLSAgICAgICAgICAgIHRvcF9zdW1bcCYxXVtqXSs9ICAgYT4+KHA+PjEpOworICAgIGZvciAoOyBpIDwgMTI7IGkrKykgeworICAgICAgICBhID0gc3JjW2FyZWE0ICsgaV0gPDwgNDsKKyAgICAgICAgZm9yIChqID0gNzsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgcCAgICAgICAgICAgICAgICAgID0gYWJzKGkgLSBqKTsKKyAgICAgICAgICAgIHRvcF9zdW1bcCAmIDFdW2pdICs9IGEgPj4gKHAgPj4gMSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IoaT0wO2k8ODtpKyspewotICAgICAgICB0b3Bfc3VtIFswXVtpXSs9KHRvcF9zdW0gWzFdW2ldKjE4MSArIDEyOCApPj44Oy8vMTgxIGlzIHNxcnQoMikvMgotICAgICAgICBsZWZ0X3N1bVswXVtpXSs9KGxlZnRfc3VtWzFdW2ldKjE4MSArIDEyOCApPj44OworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgdG9wX3N1bVswXVtpXSAgKz0gICh0b3Bfc3VtWzFdW2ldICogMTgxICsgMTI4KSA+PiA4OyAvLyAxODEgaXMgc3FydCgyKS8yCisgICAgICAgIGxlZnRfc3VtWzBdW2ldICs9IChsZWZ0X3N1bVsxXVtpXSAqIDE4MSArIDEyOCkgPj4gODsKICAgICB9Ci0gICAgZm9yKHk9MDt5PDg7eSsrKXsKLSAgICAgICAgZm9yKHg9MDt4PDg7eCsrKXsKLSAgICAgICAgICAgIGRzdFt4XSA9ICgKLSAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpdG9wX3N1bSBbMF1beF0qemVyb19wcmVkaWN0aW9uX3dlaWdodHNbeSoxNit4KjIrMF0gKwotICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClsZWZ0X3N1bVswXVt5XSp6ZXJvX3ByZWRpY3Rpb25fd2VpZ2h0c1t5KjE2K3gqMisxXSArCi0gICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAotICAgICAgICAgICAgICAgICAgICAgICk+PjE2OwotICAgICAgICB9Ci0gICAgICAgIGRzdCs9bGluZXNpemU7Ci0gICAgfQotfQotc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fMSh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7Ci0gICAgaW50IHgseTsKLQotICAgIGZvcih5PTA7eTw4O3krKyl7Ci0gICAgICAgIGZvcih4PTA7eDw4O3grKyl7Ci0gICAgICAgICAgICBkc3RbeF09c3JjW2FyZWE0ICsgRkZNSU4oMip5K3grMiwgMTUpIF07Ci0gICAgICAgIH0KLSAgICAgICAgZHN0Kz1saW5lc2l6ZTsKLSAgICB9Ci19Ci1zdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl8yKHVpbnQ4X3QgKnNyYyAsIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplKXsKLSAgICBpbnQgeCx5OwotCi0gICAgZm9yKHk9MDt5PDg7eSsrKXsKLSAgICAgICAgZm9yKHg9MDt4PDg7eCsrKXsKLSAgICAgICAgICAgIGRzdFt4XT1zcmNbYXJlYTQgKzEreSt4XTsKLSAgICAgICAgfQotICAgICAgICBkc3QrPWxpbmVzaXplOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzModWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpewotICAgIGludCB4LHk7Ci0KLSAgICBmb3IoeT0wO3k8ODt5KyspewotICAgICAgICBmb3IoeD0wO3g8ODt4KyspewotICAgICAgICAgICAgZHN0W3hdPXNyY1thcmVhNCArKCh5KzEpPj4xKSt4XTsKLSAgICAgICAgfQotICAgICAgICBkc3QrPWxpbmVzaXplOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzQodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpewotICAgIGludCB4LHk7Ci0KLSAgICBmb3IoeT0wO3k8ODt5KyspewotICAgICAgICBmb3IoeD0wO3g8ODt4KyspewotICAgICAgICAgICAgZHN0W3hdPSggc3JjW2FyZWE0K3hdICsgc3JjW2FyZWE2K3hdICsgMSApPj4xOwotICAgICAgICB9Ci0gICAgICAgIGRzdCs9bGluZXNpemU7Ci0gICAgfQotfQotc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fNSh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7Ci0gICAgaW50IHgseTsKLQotICAgIGZvcih5PTA7eTw4O3krKyl7Ci0gICAgICAgIGZvcih4PTA7eDw4O3grKyl7Ci0gICAgICAgICAgICBpZigyKngteTwwKXsKLSAgICAgICAgICAgICAgICBkc3RbeF09c3JjW2FyZWEyKzkrMip4LXldOwotICAgICAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAgICAgZHN0W3hdPXNyY1thcmVhNCAreC0oKHkrMSk+PjEpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkc3QrPWxpbmVzaXplOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzYodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpewotICAgIGludCB4LHk7Ci0KLSAgICBmb3IoeT0wO3k8ODt5KyspewotICAgICAgICBmb3IoeD0wO3g8ODt4KyspewotICAgICAgICAgICAgZHN0W3hdPXNyY1thcmVhMyt4LXldOwotICAgICAgICB9Ci0gICAgICAgIGRzdCs9bGluZXNpemU7Ci0gICAgfQotfQotc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fNyh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7Ci0gICAgaW50IHgseTsKLQotICAgIGZvcih5PTA7eTw4O3krKyl7Ci0gICAgICAgIGZvcih4PTA7eDw4O3grKyl7Ci0gICAgICAgICAgICBpZih4LTIqeT4wKXsKLSAgICAgICAgICAgICAgICBkc3RbeF09KCBzcmNbYXJlYTMtMSt4LTIqeV0gKyBzcmNbYXJlYTMreC0yKnldICsgMSk+PjE7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBkc3RbeF09c3JjW2FyZWEyKzgteSArKHg+PjEpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkc3QrPWxpbmVzaXplOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzgodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpewotICAgIGludCB4LHk7Ci0KLSAgICBmb3IoeT0wO3k8ODt5KyspewotICAgICAgICBmb3IoeD0wO3g8ODt4KyspewotICAgICAgICAgICAgZHN0W3hdPSggc3JjW2FyZWExKzcteV0gKyBzcmNbYXJlYTIrNy15XSArIDEgKT4+MTsKLSAgICAgICAgfQotICAgICAgICBkc3QrPWxpbmVzaXplOwotICAgIH0KLX0KLXN0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzkodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpewotICAgIGludCB4LHk7Ci0KLSAgICBmb3IoeT0wO3k8ODt5KyspewotICAgICAgICBmb3IoeD0wO3g8ODt4KyspewotICAgICAgICAgICAgZHN0W3hdPXNyY1thcmVhMis2LUZGTUlOKHgreSw2KV07Ci0gICAgICAgIH0KLSAgICAgICAgZHN0Kz1saW5lc2l6ZTsKLSAgICB9Ci19Ci1zdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl8xMCh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSl7Ci0gICAgaW50IHgseTsKLQotICAgIGZvcih5PTA7eTw4O3krKyl7Ci0gICAgICAgIGZvcih4PTA7eDw4O3grKyl7Ci0gICAgICAgICAgICBkc3RbeF09KHNyY1thcmVhMis3LXldKig4LXgpK3NyY1thcmVhNCt4XSp4KzQpPj4zOwotICAgICAgICB9Ci0gICAgICAgIGRzdCs9bGluZXNpemU7Ci0gICAgfQotfQotc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fMTEodWludDhfdCAqc3JjICwgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUpewotICAgIGludCB4LHk7Ci0KLSAgICBmb3IoeT0wO3k8ODt5KyspewotICAgICAgICBmb3IoeD0wO3g8ODt4KyspewotICAgICAgICAgICAgZHN0W3hdPShzcmNbYXJlYTIrNy15XSp5K3NyY1thcmVhNCt4XSooOC15KSs0KT4+MzsKLSAgICAgICAgfQotICAgICAgICBkc3QrPWxpbmVzaXplOworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9ICgodWludDMyX3QpICB0b3Bfc3VtWzBdW3hdICogemVyb19wcmVkaWN0aW9uX3dlaWdodHNbeSAqIDE2ICsgeCAqIDIgKyAwXSArCisgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBsZWZ0X3N1bVswXVt5XSAqIHplcm9fcHJlZGljdGlvbl93ZWlnaHRzW3kgKiAxNiArIHggKiAyICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMCkgPj4gMTY7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCB4OF9sb29wX2ZpbHRlcih1aW50OF90ICogcHRyLCBjb25zdCBpbnQgYV9zdHJpZGUsIGNvbnN0IGludCBiX3N0cmlkZSwgaW50IHF1YW50KXsKLSAgICBpbnQgaSx0OwotICAgIGludCBwMCxwMSxwMixwMyxwNCxwNSxwNixwNyxwOCxwOTsKLSAgICBpbnQgcWw9KHF1YW50KzEwKT4+MzsKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzEodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IHgsIHk7CiAKLSAgICBmb3IoaT0wOyBpPDg7IGkrKyxwdHIrPWJfc3RyaWRlKXsKLSAgICAgICAgcDA9cHRyWy01KmFfc3RyaWRlXTsKLSAgICAgICAgcDE9cHRyWy00KmFfc3RyaWRlXTsKLSAgICAgICAgcDI9cHRyWy0zKmFfc3RyaWRlXTsKLSAgICAgICAgcDM9cHRyWy0yKmFfc3RyaWRlXTsKLSAgICAgICAgcDQ9cHRyWy0xKmFfc3RyaWRlXTsKLSAgICAgICAgcDU9cHRyWyAwICAgICAgICAgXTsKLSAgICAgICAgcDY9cHRyWyAxKmFfc3RyaWRlXTsKLSAgICAgICAgcDc9cHRyWyAyKmFfc3RyaWRlXTsKLSAgICAgICAgcDg9cHRyWyAzKmFfc3RyaWRlXTsKLSAgICAgICAgcDk9cHRyWyA0KmFfc3RyaWRlXTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBzcmNbYXJlYTQgKyBGRk1JTigyICogeSArIHggKyAyLCAxNSldOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KIAotICAgICAgICB0PQotICAgICAgICAgICAgKEZGQUJTKHAxLXAyKSA8PSBxbCkgKwotICAgICAgICAgICAgKEZGQUJTKHAyLXAzKSA8PSBxbCkgKwotICAgICAgICAgICAgKEZGQUJTKHAzLXA0KSA8PSBxbCkgKwotICAgICAgICAgICAgKEZGQUJTKHA0LXA1KSA8PSBxbCk7Ci0gICAgICAgIGlmKHQ+MCl7Ly9Zb3UgbmVlZCBhdCBsZWFzdCAxIHRvIGJlIGFibGUgdG8gcmVhY2ggYSB0b3RhbCBzY29yZSBvZiA2LgotICAgICAgICAgICAgdCs9Ci0gICAgICAgICAgICAgICAgKEZGQUJTKHA1LXA2KSA8PSBxbCkgKwotICAgICAgICAgICAgICAgIChGRkFCUyhwNi1wNykgPD0gcWwpICsKLSAgICAgICAgICAgICAgICAoRkZBQlMocDctcDgpIDw9IHFsKSArCi0gICAgICAgICAgICAgICAgKEZGQUJTKHA4LXA5KSA8PSBxbCkgKwotICAgICAgICAgICAgICAgIChGRkFCUyhwMC1wMSkgPD0gcWwpOwotICAgICAgICAgICAgaWYodD49Nil7Ci0gICAgICAgICAgICAgICAgaW50IG1pbixtYXg7CitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl8yKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCB4LCB5OwogCi0gICAgICAgICAgICAgICAgbWluPW1heD1wMTsKLSAgICAgICAgICAgICAgICBtaW49RkZNSU4obWluLHAzKTsgbWF4PUZGTUFYKG1heCxwMyk7Ci0gICAgICAgICAgICAgICAgbWluPUZGTUlOKG1pbixwNSk7IG1heD1GRk1BWChtYXgscDUpOwotICAgICAgICAgICAgICAgIG1pbj1GRk1JTihtaW4scDgpOyBtYXg9RkZNQVgobWF4LHA4KTsKLSAgICAgICAgICAgICAgICBpZihtYXgtbWluPDIqcXVhbnQpey8vZWFybHkgc3RvcAotICAgICAgICAgICAgICAgICAgICBtaW49RkZNSU4obWluLHAyKTsgbWF4PUZGTUFYKG1heCxwMik7Ci0gICAgICAgICAgICAgICAgICAgIG1pbj1GRk1JTihtaW4scDQpOyBtYXg9RkZNQVgobWF4LHA0KTsKLSAgICAgICAgICAgICAgICAgICAgbWluPUZGTUlOKG1pbixwNik7IG1heD1GRk1BWChtYXgscDYpOwotICAgICAgICAgICAgICAgICAgICBtaW49RkZNSU4obWluLHA3KTsgbWF4PUZGTUFYKG1heCxwNyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKG1heC1taW48MipxdWFudCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHJbLTIqYV9zdHJpZGVdPSg0KnAyICsgMypwMyArIDEqcDcgKyA0KT4+MzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0clstMSphX3N0cmlkZV09KDMqcDIgKyAzKnA0ICsgMipwNyArIDQpPj4zOwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyWyAwICAgICAgICAgXT0oMipwMiArIDMqcDUgKyAzKnA3ICsgNCk+PjM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHJbIDEqYV9zdHJpZGVdPSgxKnAyICsgMypwNiArIDQqcDcgKyA0KT4+MzsKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBzcmNbYXJlYTQgKyAxICsgeSArIHhdOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fMyh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IHNyY1thcmVhNCArICgoeSArIDEpID4+IDEpICsgeF07CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl80KHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gKHNyY1thcmVhNCArIHhdICsgc3JjW2FyZWE2ICsgeF0gKyAxKSA+PiAxOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fNSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeworICAgICAgICAgICAgaWYgKDIgKiB4IC0geSA8IDApCisgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW2FyZWEyICsgOSArIDIgKiB4IC0geV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW2FyZWE0ICsgeCAtICgoeSArIDEpID4+IDEpXTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3BhdGlhbF9jb21wZW5zYXRpb25fNih1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IHNyY1thcmVhMyArIHggLSB5XTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzcodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKKyAgICAgICAgICAgIGlmICh4IC0gMiAqIHkgPiAwKQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IChzcmNbYXJlYTMgLSAxICsgeCAtIDIgKiB5XSArIHNyY1thcmVhMyArIHggLSAyICogeV0gKyAxKSA+PiAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IHNyY1thcmVhMiArIDggLSB5ICsgKHggPj4gMSldOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl84KHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gKHNyY1thcmVhMSArIDcgLSB5XSArIHNyY1thcmVhMiArIDcgLSB5XSArIDEpID4+IDE7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl85KHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gc3JjW2FyZWEyICsgNiAtIEZGTUlOKHggKyB5LCA2KV07CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzcGF0aWFsX2NvbXBlbnNhdGlvbl8xMCh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IChzcmNbYXJlYTIgKyA3IC0geV0gKiAoOCAtIHgpICsgc3JjW2FyZWE0ICsgeF0gKiB4ICsgNCkgPj4gMzsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNwYXRpYWxfY29tcGVuc2F0aW9uXzExKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gKHNyY1thcmVhMiArIDcgLSB5XSAqIHkgKyBzcmNbYXJlYTQgKyB4XSAqICg4IC0geSkgKyA0KSA+PiAzOworICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeDhfbG9vcF9maWx0ZXIodWludDhfdCAqcHRyLCBjb25zdCBwdHJkaWZmX3QgYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdHJkaWZmX3QgYl9zdHJpZGUsIGludCBxdWFudCkKK3sKKyAgICBpbnQgaSwgdDsKKyAgICBpbnQgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYsIHA3LCBwOCwgcDk7CisgICAgaW50IHFsID0gKHF1YW50ICsgMTApID4+IDM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrLCBwdHIgKz0gYl9zdHJpZGUpIHsKKyAgICAgICAgcDAgPSBwdHJbLTUgKiBhX3N0cmlkZV07CisgICAgICAgIHAxID0gcHRyWy00ICogYV9zdHJpZGVdOworICAgICAgICBwMiA9IHB0clstMyAqIGFfc3RyaWRlXTsKKyAgICAgICAgcDMgPSBwdHJbLTIgKiBhX3N0cmlkZV07CisgICAgICAgIHA0ID0gcHRyWy0xICogYV9zdHJpZGVdOworICAgICAgICBwNSA9IHB0clswXTsKKyAgICAgICAgcDYgPSBwdHJbMSAqIGFfc3RyaWRlXTsKKyAgICAgICAgcDcgPSBwdHJbMiAqIGFfc3RyaWRlXTsKKyAgICAgICAgcDggPSBwdHJbMyAqIGFfc3RyaWRlXTsKKyAgICAgICAgcDkgPSBwdHJbNCAqIGFfc3RyaWRlXTsKKworICAgICAgICB0ID0gKEZGQUJTKHAxIC0gcDIpIDw9IHFsKSArCisgICAgICAgICAgICAoRkZBQlMocDIgLSBwMykgPD0gcWwpICsKKyAgICAgICAgICAgIChGRkFCUyhwMyAtIHA0KSA8PSBxbCkgKworICAgICAgICAgICAgKEZGQUJTKHA0IC0gcDUpIDw9IHFsKTsKKworICAgICAgICAvLyBZb3UgbmVlZCBhdCBsZWFzdCAxIHRvIGJlIGFibGUgdG8gcmVhY2ggYSB0b3RhbCBzY29yZSBvZiA2LgorICAgICAgICBpZiAodCA+IDApIHsKKyAgICAgICAgICAgIHQgKz0gKEZGQUJTKHA1IC0gcDYpIDw9IHFsKSArCisgICAgICAgICAgICAgICAgIChGRkFCUyhwNiAtIHA3KSA8PSBxbCkgKworICAgICAgICAgICAgICAgICAoRkZBQlMocDcgLSBwOCkgPD0gcWwpICsKKyAgICAgICAgICAgICAgICAgKEZGQUJTKHA4IC0gcDkpIDw9IHFsKSArCisgICAgICAgICAgICAgICAgIChGRkFCUyhwMCAtIHAxKSA8PSBxbCk7CisgICAgICAgICAgICBpZiAodCA+PSA2KSB7CisgICAgICAgICAgICAgICAgaW50IG1pbiwgbWF4OworCisgICAgICAgICAgICAgICAgbWluID0gbWF4ID0gcDE7CisgICAgICAgICAgICAgICAgbWluID0gRkZNSU4obWluLCBwMyk7CisgICAgICAgICAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBwMyk7CisgICAgICAgICAgICAgICAgbWluID0gRkZNSU4obWluLCBwNSk7CisgICAgICAgICAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBwNSk7CisgICAgICAgICAgICAgICAgbWluID0gRkZNSU4obWluLCBwOCk7CisgICAgICAgICAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBwOCk7CisgICAgICAgICAgICAgICAgaWYgKG1heCAtIG1pbiA8IDIgKiBxdWFudCkgeyAvLyBlYXJseSBzdG9wCisgICAgICAgICAgICAgICAgICAgIG1pbiA9IEZGTUlOKG1pbiwgcDIpOworICAgICAgICAgICAgICAgICAgICBtYXggPSBGRk1BWChtYXgsIHAyKTsKKyAgICAgICAgICAgICAgICAgICAgbWluID0gRkZNSU4obWluLCBwNCk7CisgICAgICAgICAgICAgICAgICAgIG1heCA9IEZGTUFYKG1heCwgcDQpOworICAgICAgICAgICAgICAgICAgICBtaW4gPSBGRk1JTihtaW4sIHA2KTsKKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBwNik7CisgICAgICAgICAgICAgICAgICAgIG1pbiA9IEZGTUlOKG1pbiwgcDcpOworICAgICAgICAgICAgICAgICAgICBtYXggPSBGRk1BWChtYXgsIHA3KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1heCAtIG1pbiA8IDIgKiBxdWFudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyWy0yICogYV9zdHJpZGVdID0gKDQgKiBwMiArIDMgKiBwMyArIDEgKiBwNyArIDQpID4+IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJbLTEgKiBhX3N0cmlkZV0gPSAoMyAqIHAyICsgMyAqIHA0ICsgMiAqIHA3ICsgNCkgPj4gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0clswXSAgICAgICAgICAgICA9ICgyICogcDIgKyAzICogcDUgKyAzICogcDcgKyA0KSA+PiAzOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyWzEgKiBhX3N0cmlkZV0gID0gKDEgKiBwMiArIDMgKiBwNiArIDQgKiBwNyArIDQpID4+IDM7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgeCx4MCx4MSx4MjsKKyAgICAgICAgICAgIGludCB4LCB4MCwgeDEsIHgyOwogICAgICAgICAgICAgaW50IG07CiAKLSAgICAgICAgICAgIHgwID0gICAoMipwMyAtIDUqcDQgKyA1KnA1IC0gMipwNiArIDQpPj4zOwotICAgICAgICAgICAgaWYoRkZBQlMoeDApIDwgcXVhbnQpewotICAgICAgICAgICAgICAgIHgxPSgyKnAxIC0gNSpwMiArIDUqcDMgLSAyKnA0ICsgNCk+PjM7Ci0gICAgICAgICAgICAgICAgeDI9KDIqcDUgLSA1KnA2ICsgNSpwNyAtIDIqcDggKyA0KT4+MzsKKyAgICAgICAgICAgIHgwID0gKDIgKiBwMyAtIDUgKiBwNCArIDUgKiBwNSAtIDIgKiBwNiArIDQpID4+IDM7CisgICAgICAgICAgICBpZiAoRkZBQlMoeDApIDwgcXVhbnQpIHsKKyAgICAgICAgICAgICAgICB4MSA9ICgyICogcDEgLSA1ICogcDIgKyA1ICogcDMgLSAyICogcDQgKyA0KSA+PiAzOworICAgICAgICAgICAgICAgIHgyID0gKDIgKiBwNSAtIDUgKiBwNiArIDUgKiBwNyAtIDIgKiBwOCArIDQpID4+IDM7CiAKLSAgICAgICAgICAgICAgICB4PUZGQUJTKHgwKSAtIEZGTUlOKCBGRkFCUyh4MSksIEZGQUJTKHgyKSApOwotICAgICAgICAgICAgICAgIG09cDQtcDU7CisgICAgICAgICAgICAgICAgeCA9IEZGQUJTKHgwKSAtIEZGTUlOKEZGQUJTKHgxKSwgRkZBQlMoeDIpKTsKKyAgICAgICAgICAgICAgICBtID0gcDQgLSBwNTsKIAotICAgICAgICAgICAgICAgIGlmKCB4ID4gMCAmJiAobV54MCkgPDApeworICAgICAgICAgICAgICAgIGlmICh4ID4gMCAmJiAobSBeIHgwKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaWduOwogCi0gICAgICAgICAgICAgICAgICAgIHNpZ249bT4+MzE7Ci0gICAgICAgICAgICAgICAgICAgIG09KG1ec2lnbiktc2lnbjsvL2FicyhtKQotICAgICAgICAgICAgICAgICAgICBtPj49MTsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IG0gPj4gMzE7CisgICAgICAgICAgICAgICAgICAgIG0gICAgPSAobSBeIHNpZ24pIC0gc2lnbjsgLy8gYWJzKG0pCisgICAgICAgICAgICAgICAgICAgIG0gID4+PSAxOwogCi0gICAgICAgICAgICAgICAgICAgIHg9KDUqeCk+PjM7CisgICAgICAgICAgICAgICAgICAgIHggPSA1ICogeCA+PiAzOwogCi0gICAgICAgICAgICAgICAgICAgIGlmKHg+bSkgeD1tOworICAgICAgICAgICAgICAgICAgICBpZiAoeCA+IG0pCisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gbTsKIAotICAgICAgICAgICAgICAgICAgICB4PSh4XnNpZ24pLXNpZ247CisgICAgICAgICAgICAgICAgICAgIHggPSAoeCBeIHNpZ24pIC0gc2lnbjsKIAotICAgICAgICAgICAgICAgICAgICBwdHJbLTEqYV9zdHJpZGVdIC09IHg7Ci0gICAgICAgICAgICAgICAgICAgIHB0clsgMF0gICAgICAgICAgKz0geDsKKyAgICAgICAgICAgICAgICAgICAgcHRyWy0xICogYV9zdHJpZGVdIC09IHg7CisgICAgICAgICAgICAgICAgICAgIHB0clswXSAgICAgICAgICAgICArPSB4OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgeDhfaF9sb29wX2ZpbHRlcih1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBxc2NhbGUpeworc3RhdGljIHZvaWQgeDhfaF9sb29wX2ZpbHRlcih1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBxc2NhbGUpCit7CiAgICAgeDhfbG9vcF9maWx0ZXIoc3JjLCBzdHJpZGUsIDEsIHFzY2FsZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHg4X3ZfbG9vcF9maWx0ZXIodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcXNjYWxlKXsKK3N0YXRpYyB2b2lkIHg4X3ZfbG9vcF9maWx0ZXIodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcXNjYWxlKQorewogICAgIHg4X2xvb3BfZmlsdGVyKHNyYywgMSwgc3RyaWRlLCBxc2NhbGUpOwogfQogCiBhdl9jb2xkIHZvaWQgZmZfaW50cmF4OGRzcF9pbml0KEludHJhWDhEU1BDb250ZXh0ICpkc3ApCiB7Ci0gICAgZHNwLT5oX2xvb3BfZmlsdGVyPXg4X2hfbG9vcF9maWx0ZXI7Ci0gICAgZHNwLT52X2xvb3BfZmlsdGVyPXg4X3ZfbG9vcF9maWx0ZXI7Ci0gICAgZHNwLT5zZXR1cF9zcGF0aWFsX2NvbXBlbnNhdGlvbj14OF9zZXR1cF9zcGF0aWFsX2NvbXBlbnNhdGlvbjsKLSAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzBdPXNwYXRpYWxfY29tcGVuc2F0aW9uXzA7Ci0gICAgZHNwLT5zcGF0aWFsX2NvbXBlbnNhdGlvblsxXT1zcGF0aWFsX2NvbXBlbnNhdGlvbl8xOwotICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bMl09c3BhdGlhbF9jb21wZW5zYXRpb25fMjsKLSAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzNdPXNwYXRpYWxfY29tcGVuc2F0aW9uXzM7Ci0gICAgZHNwLT5zcGF0aWFsX2NvbXBlbnNhdGlvbls0XT1zcGF0aWFsX2NvbXBlbnNhdGlvbl80OwotICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bNV09c3BhdGlhbF9jb21wZW5zYXRpb25fNTsKLSAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzZdPXNwYXRpYWxfY29tcGVuc2F0aW9uXzY7Ci0gICAgZHNwLT5zcGF0aWFsX2NvbXBlbnNhdGlvbls3XT1zcGF0aWFsX2NvbXBlbnNhdGlvbl83OwotICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bOF09c3BhdGlhbF9jb21wZW5zYXRpb25fODsKLSAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzldPXNwYXRpYWxfY29tcGVuc2F0aW9uXzk7Ci0gICAgZHNwLT5zcGF0aWFsX2NvbXBlbnNhdGlvblsxMF09c3BhdGlhbF9jb21wZW5zYXRpb25fMTA7Ci0gICAgZHNwLT5zcGF0aWFsX2NvbXBlbnNhdGlvblsxMV09c3BhdGlhbF9jb21wZW5zYXRpb25fMTE7CisgICAgZHNwLT5oX2xvb3BfZmlsdGVyICAgICAgICAgICAgICA9IHg4X2hfbG9vcF9maWx0ZXI7CisgICAgZHNwLT52X2xvb3BfZmlsdGVyICAgICAgICAgICAgICA9IHg4X3ZfbG9vcF9maWx0ZXI7CisgICAgZHNwLT5zZXR1cF9zcGF0aWFsX2NvbXBlbnNhdGlvbiA9IHg4X3NldHVwX3NwYXRpYWxfY29tcGVuc2F0aW9uOworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bMF0gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl8wOworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bMV0gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl8xOworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bMl0gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl8yOworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bM10gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl8zOworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bNF0gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl80OworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bNV0gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl81OworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bNl0gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl82OworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bN10gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl83OworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bOF0gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl84OworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bOV0gICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl85OworICAgIGRzcC0+c3BhdGlhbF9jb21wZW5zYXRpb25bMTBdICAgPSBzcGF0aWFsX2NvbXBlbnNhdGlvbl8xMDsKKyAgICBkc3AtPnNwYXRpYWxfY29tcGVuc2F0aW9uWzExXSAgID0gc3BhdGlhbF9jb21wZW5zYXRpb25fMTE7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ludHJheDhkc3AuaCBiL2xpYmF2Y29kZWMvaW50cmF4OGRzcC5oCmluZGV4IDFlNGEzYWYuLmJmNDI2OTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaW50cmF4OGRzcC5oCisrKyBiL2xpYmF2Y29kZWMvaW50cmF4OGRzcC5oCkBAIC0xOSwxNSArMTksMTggQEAKICNpZm5kZWYgQVZDT0RFQ19JTlRSQVg4RFNQX0gKICNkZWZpbmUgQVZDT0RFQ19JTlRSQVg4RFNQX0gKIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiB0eXBlZGVmIHN0cnVjdCBJbnRyYVg4RFNQQ29udGV4dCB7Ci0gICAgdm9pZCAoKnZfbG9vcF9maWx0ZXIpKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHFzY2FsZSk7Ci0gICAgdm9pZCAoKmhfbG9vcF9maWx0ZXIpKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHFzY2FsZSk7CisgICAgdm9pZCAoKnZfbG9vcF9maWx0ZXIpKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IHFzY2FsZSk7CisgICAgdm9pZCAoKmhfbG9vcF9maWx0ZXIpKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IHFzY2FsZSk7CiAKLSAgICB2b2lkICgqc3BhdGlhbF9jb21wZW5zYXRpb25bMTJdKSh1aW50OF90ICpzcmMgLCB1aW50OF90ICpkc3QsIGludCBsaW5lc2l6ZSk7Ci0gICAgdm9pZCAoKnNldHVwX3NwYXRpYWxfY29tcGVuc2F0aW9uKSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpyYW5nZSwgaW50ICpzdW0sICBpbnQgZWRnZXMpOworICAgIHZvaWQgKCpzcGF0aWFsX2NvbXBlbnNhdGlvblsxMl0pKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOworICAgIHZvaWQgKCpzZXR1cF9zcGF0aWFsX2NvbXBlbnNhdGlvbikodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgKnJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzdW0sIGludCBlZGdlcyk7CiB9IEludHJhWDhEU1BDb250ZXh0OwogCiB2b2lkIGZmX2ludHJheDhkc3BfaW5pdChJbnRyYVg4RFNQQ29udGV4dCAqZHNwKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaW50cmF4OGh1Zi5oIGIvbGliYXZjb2RlYy9pbnRyYXg4aHVmLmgKaW5kZXggMzc1OTA2Yi4uNTU4ZDBlNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pbnRyYXg4aHVmLmgKKysrIGIvbGliYXZjb2RlYy9pbnRyYXg4aHVmLmgKQEAgLTIxLDg5NyArMjEsOTQwIEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCi0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9vcmllbnRfbG93cXVhbnRfdGFibGVbNF1bMTJdWzJdPXsKLSAgICB7Ly8wCi0gICAgICAgIHsweDAwMDAsICAxfSwgezB4MDAwNCwgIDN9LCB7MHgwMDA1LCAgM30sIHsweDAwMEMsICA0fSwKLSAgICAgICAgezB4MDAwRCwgIDR9LCB7MHgwMDM4LCAgNn0sIHsweDAwMUQsICA1fSwgezB4MDAzOSwgIDZ9LAotICAgICAgICB7MHgwMDNDLCAgNn0sIHsweDAwM0QsICA2fSwgezB4MDAzRSwgIDZ9LCB7MHgwMDNGLCAgNn0sCi0gICAgfSx7Ly8xCi0gICAgICAgIHsweDAwMDAsICA1fSwgezB4MDAwMSwgIDV9LCB7MHgwMDAyLCAgNX0sIHsweDAwMDEsICAyfSwKLSAgICAgICAgezB4MDAwMiwgIDJ9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDMsICA1fSwgezB4MDAwNiwgIDN9LAotICAgICAgICB7MHgwMDAzLCAgNH0sIHsweDAwMEUsICA0fSwgezB4MDAxRSwgIDV9LCB7MHgwMDFGLCAgNX0sCi0gICAgfSx7Ly8yCi0gICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwMSwgIDJ9LCB7MHgwMDA0LCAgM30sIHsweDAwMDUsICAzfSwKLSAgICAgICAgezB4MDAwNiwgIDN9LCB7MHgwMDM4LCAgNn0sIHsweDAwMzksICA2fSwgezB4MDAxRCwgIDV9LAotICAgICAgICB7MHgwMDNDLCAgNn0sIHsweDAwM0QsICA2fSwgezB4MDAzRSwgIDZ9LCB7MHgwMDNGLCAgNn0sCi0gICAgfSx7Ly8zCi0gICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDAzLCAgNH0sIHsweDAwMDEsICAyfSwKLSAgICAgICAgezB4MDAwMiwgIDJ9LCB7MHgwMDE4LCAgNX0sIHsweDAwMTksICA1fSwgezB4MDAwRCwgIDR9LAotICAgICAgICB7MHgwMDFDLCAgNX0sIHsweDAwMUQsICA1fSwgezB4MDAxRSwgIDV9LCB7MHgwMDFGLCAgNX0sCi0gICAgfQorc3RhdGljIGNvbnN0IHVpbnQxNl90IHg4X29yaWVudF9sb3dxdWFudF90YWJsZVs0XVsxMl1bMl0gPSB7CisgICAgeyAvLyAwCisgICAgICAgIHsgMHgwMDAwLCAxIH0sIHsgMHgwMDA0LCAzIH0sIHsgMHgwMDA1LCAzIH0sIHsgMHgwMDBDLCA0IH0sCisgICAgICAgIHsgMHgwMDBELCA0IH0sIHsgMHgwMDM4LCA2IH0sIHsgMHgwMDFELCA1IH0sIHsgMHgwMDM5LCA2IH0sCisgICAgICAgIHsgMHgwMDNDLCA2IH0sIHsgMHgwMDNELCA2IH0sIHsgMHgwMDNFLCA2IH0sIHsgMHgwMDNGLCA2IH0sCisgICAgfSwKKyAgICB7IC8vIDEKKyAgICAgICAgeyAweDAwMDAsIDUgfSwgeyAweDAwMDEsIDUgfSwgeyAweDAwMDIsIDUgfSwgeyAweDAwMDEsIDIgfSwKKyAgICAgICAgeyAweDAwMDIsIDIgfSwgeyAweDAwMDIsIDQgfSwgeyAweDAwMDMsIDUgfSwgeyAweDAwMDYsIDMgfSwKKyAgICAgICAgeyAweDAwMDMsIDQgfSwgeyAweDAwMEUsIDQgfSwgeyAweDAwMUUsIDUgfSwgeyAweDAwMUYsIDUgfSwKKyAgICB9LAorICAgIHsgLy8gMgorICAgICAgICB7IDB4MDAwMCwgMiB9LCB7IDB4MDAwMSwgMiB9LCB7IDB4MDAwNCwgMyB9LCB7IDB4MDAwNSwgMyB9LAorICAgICAgICB7IDB4MDAwNiwgMyB9LCB7IDB4MDAzOCwgNiB9LCB7IDB4MDAzOSwgNiB9LCB7IDB4MDAxRCwgNSB9LAorICAgICAgICB7IDB4MDAzQywgNiB9LCB7IDB4MDAzRCwgNiB9LCB7IDB4MDAzRSwgNiB9LCB7IDB4MDAzRiwgNiB9LAorICAgIH0sCisgICAgeyAvLyAzCisgICAgICAgIHsgMHgwMDAwLCAzIH0sIHsgMHgwMDAyLCA0IH0sIHsgMHgwMDAzLCA0IH0sIHsgMHgwMDAxLCAyIH0sCisgICAgICAgIHsgMHgwMDAyLCAyIH0sIHsgMHgwMDE4LCA1IH0sIHsgMHgwMDE5LCA1IH0sIHsgMHgwMDBELCA0IH0sCisgICAgICAgIHsgMHgwMDFDLCA1IH0sIHsgMHgwMDFELCA1IH0sIHsgMHgwMDFFLCA1IH0sIHsgMHgwMDFGLCA1IH0sCisgICAgfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9vcmllbnRfaGlnaHF1YW50X3RhYmxlWzJdWzEyXVsyXT17Ci0gICAgey8vMAotICAgICAgICB7MHgwMDAwLCAgMn0sIHsweDAwMDEsICAyfSwgezB4MDAwNCwgIDN9LCB7MHgwMDA1LCAgM30sCi0gICAgICAgIHsweDAwMDYsICAzfSwgezB4MDAzOCwgIDZ9LCB7MHgwMDFELCAgNX0sIHsweDAwMzksICA2fSwKLSAgICAgICAgezB4MDAzQywgIDZ9LCB7MHgwMDNELCAgNn0sIHsweDAwM0UsICA2fSwgezB4MDAzRiwgIDZ9LAotICAgIH0sey8vMQotICAgICAgICB7MHgwMDAwLCAgMX0sIHsweDAwMDIsICAyfSwgezB4MDAwNiwgIDN9LCB7MHgwMDFDLCAgNX0sCi0gICAgICAgIHsweDAwMUQsICA1fSwgezB4MDA3OCwgIDd9LCB7MHgwMDNELCAgNn0sIHsweDAwNzksICA3fSwKLSAgICAgICAgezB4MDA3QywgIDd9LCB7MHgwMDdELCAgN30sIHsweDAwN0UsICA3fSwgezB4MDA3RiwgIDd9LAotICAgIH0KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9vcmllbnRfaGlnaHF1YW50X3RhYmxlWzJdWzEyXVsyXSA9IHsKKyAgICB7IC8vIDAKKyAgICAgICAgeyAweDAwMDAsIDIgfSwgeyAweDAwMDEsIDIgfSwgeyAweDAwMDQsIDMgfSwgeyAweDAwMDUsIDMgfSwKKyAgICAgICAgeyAweDAwMDYsIDMgfSwgeyAweDAwMzgsIDYgfSwgeyAweDAwMUQsIDUgfSwgeyAweDAwMzksIDYgfSwKKyAgICAgICAgeyAweDAwM0MsIDYgfSwgeyAweDAwM0QsIDYgfSwgeyAweDAwM0UsIDYgfSwgeyAweDAwM0YsIDYgfSwKKyAgICB9LAorICAgIHsgLy8gMQorICAgICAgICB7IDB4MDAwMCwgMSB9LCB7IDB4MDAwMiwgMiB9LCB7IDB4MDAwNiwgMyB9LCB7IDB4MDAxQywgNSB9LAorICAgICAgICB7IDB4MDAxRCwgNSB9LCB7IDB4MDA3OCwgNyB9LCB7IDB4MDAzRCwgNiB9LCB7IDB4MDA3OSwgNyB9LAorICAgICAgICB7IDB4MDA3QywgNyB9LCB7IDB4MDA3RCwgNyB9LCB7IDB4MDA3RSwgNyB9LCB7IDB4MDA3RiwgNyB9LAorICAgIH0sCiB9OwogI2RlZmluZSBNQVhfT1JfVkxDX0JJVFMgNwogCi0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9kY19sb3dxdWFudF90YWJsZVs4XVszNF1bMl09ewotICAgIHsvLzAKLSAgICAgICAgezB4MDAwMCwgIDV9LCB7MHgwMDAxLCAgNH0sIHsweDAwMDEsICA1fSwgezB4MDAwNCwgIDV9LAotICAgICAgICB7MHgwMDA1LCAgNX0sIHsweDAwMDYsICA1fSwgezB4MDAwRSwgIDZ9LCB7MHgwMDBGLCAgNn0sCi0gICAgICAgIHsweDAwNDAsICA4fSwgezB4MDA0MSwgIDh9LCB7MHgwODQwLCAxM30sIHsweDA4NDEsIDEzfSwKLSAgICAgICAgezB4MDg0MiwgMTN9LCB7MHgwODQzLCAxM30sIHsweDA4NDQsIDEzfSwgezB4MDg0NSwgMTN9LAotICAgICAgICB7MHgwODQ2LCAxM30sIHsweDAwMDIsICAyfSwgezB4MDAwMywgIDJ9LCB7MHgwMDAzLCAgM30sCi0gICAgICAgIHsweDAwMDUsICA0fSwgezB4MDAwOSwgIDV9LCB7MHgwMDExLCAgNn0sIHsweDAwNDMsICA4fSwKLSAgICAgICAgezB4MDA4NSwgIDl9LCB7MHgwODQ3LCAxM30sIHsweDA4NDgsIDEzfSwgezB4MDg0OSwgMTN9LAotICAgICAgICB7MHgwODRBLCAxM30sIHsweDA4NEIsIDEzfSwgezB4MDg0QywgMTN9LCB7MHgwODRELCAxM30sCi0gICAgICAgIHsweDA4NEUsIDEzfSwgezB4MDg0RiwgMTN9LAotICAgIH0sey8vMQotICAgICAgICB7MHgwMDAwLCAgNH0sIHsweDAwMDEsICAzfSwgezB4MDAwMiwgIDN9LCB7MHgwMDAxLCAgNH0sCi0gICAgICAgIHsweDAwMDYsICA0fSwgezB4MDAwNCwgIDN9LCB7MHgwMDA3LCAgNH0sIHsweDAwMDUsICAzfSwKLSAgICAgICAgezB4MDAwQywgIDR9LCB7MHgwMDBELCAgNH0sIHsweDAwMUMsICA1fSwgezB4MDAzQSwgIDZ9LAotICAgICAgICB7MHgwMUQ4LCAgOX0sIHsweDAxRDksICA5fSwgezB4MURBMCwgMTN9LCB7MHgxREExLCAxM30sCi0gICAgICAgIHsweDFEQTIsIDEzfSwgezB4MDAzQywgIDZ9LCB7MHgwMDNELCAgNn0sIHsweDAwM0UsICA2fSwKLSAgICAgICAgezB4MDA3NywgIDd9LCB7MHgwMURCLCAgOX0sIHsweDAwN0UsICA3fSwgezB4MDBGRSwgIDh9LAotICAgICAgICB7MHgwMUZFLCAgOX0sIHsweDFEQTMsIDEzfSwgezB4MURBNCwgMTN9LCB7MHgxREE1LCAxM30sCi0gICAgICAgIHsweDBFRDMsIDEyfSwgezB4MEVENCwgMTJ9LCB7MHgwMUZGLCAgOX0sIHsweDBFRDUsIDEyfSwKLSAgICAgICAgezB4MEVENiwgMTJ9LCB7MHgwRUQ3LCAxMn0sCi0gICAgfSx7Ly8yCi0gICAgICAgIHsweDAwMDAsICA0fSwgezB4MDAwMSwgIDN9LCB7MHgwMDAyLCAgM30sIHsweDAwMDEsICA0fSwKLSAgICAgICAgezB4MDAwNiwgIDR9LCB7MHgwMDA3LCAgNH0sIHsweDAwMDgsICA0fSwgezB4MDAwOSwgIDR9LAotICAgICAgICB7MHgwMDI4LCAgNn0sIHsweDAwMjksICA2fSwgezB4MDA1NCwgIDd9LCB7MHgwMDU1LCAgN30sCi0gICAgICAgIHsweDBBQzAsIDEyfSwgezB4MEFDMSwgMTJ9LCB7MHgwQUMyLCAxMn0sIHsweDBBQzMsIDEyfSwKLSAgICAgICAgezB4MEFDNCwgMTJ9LCB7MHgwMDBCLCAgNH0sIHsweDAwMDYsICAzfSwgezB4MDAwRSwgIDR9LAotICAgICAgICB7MHgwMDFFLCAgNX0sIHsweDAwM0UsICA2fSwgezB4MDAzRiwgIDZ9LCB7MHgwMDU3LCAgN30sCi0gICAgICAgIHsweDAwQUQsICA4fSwgezB4MEFDNSwgMTJ9LCB7MHgwQUM2LCAxMn0sIHsweDBBQzcsIDEyfSwKLSAgICAgICAgezB4MEFDOCwgMTJ9LCB7MHgwQUM5LCAxMn0sIHsweDBBQ0EsIDEyfSwgezB4MEFDQiwgMTJ9LAotICAgICAgICB7MHgwNTY2LCAxMX0sIHsweDA1NjcsIDExfSwKLSAgICB9LHsvLzMKLSAgICAgICAgezB4MDAwMCwgIDR9LCB7MHgwMDAxLCAgMn0sIHsweDAwMDEsICAzfSwgezB4MDAwNCwgIDN9LAotICAgICAgICB7MHgwMDA1LCAgM30sIHsweDAwMDYsICAzfSwgezB4MDAwMSwgIDR9LCB7MHgwMDBFLCAgNH0sCi0gICAgICAgIHsweDAwM0MsICA2fSwgezB4MDAzRCwgIDZ9LCB7MHgwMDdDLCAgN30sIHsweDAwRkEsICA4fSwKLSAgICAgICAgezB4M0VDMCwgMTR9LCB7MHgzRUMxLCAxNH0sIHsweDNFQzIsIDE0fSwgezB4M0VDMywgMTR9LAotICAgICAgICB7MHgxRjYyLCAxM30sIHsweDAxRjcsICA5fSwgezB4MDA3RSwgIDd9LCB7MHgwMEZFLCAgOH0sCi0gICAgICAgIHsweDAwRkYsICA4fSwgezB4MUY2MywgMTN9LCB7MHgxRjY0LCAxM30sIHsweDFGNjUsIDEzfSwKLSAgICAgICAgezB4MUY2NiwgMTN9LCB7MHgxRjY3LCAxM30sIHsweDFGNjgsIDEzfSwgezB4MUY2OSwgMTN9LAotICAgICAgICB7MHgxRjZBLCAxM30sIHsweDFGNkIsIDEzfSwgezB4MUY2QywgMTN9LCB7MHgxRjZELCAxM30sCi0gICAgICAgIHsweDFGNkUsIDEzfSwgezB4MUY2RiwgMTN9LAotICAgIH0sey8vNAotICAgICAgICB7MHgwMDAwLCAgN30sIHsweDAwMDEsICA3fSwgezB4MDAwMiwgIDd9LCB7MHgwMDAzLCAgN30sCi0gICAgICAgIHsweDAwMDQsICA3fSwgezB4MDAwNSwgIDd9LCB7MHgwMDA2LCAgN30sIHsweDAwMDcsICA3fSwKLSAgICAgICAgezB4MDAwOCwgIDd9LCB7MHgwMDA5LCAgN30sIHsweDAwMEEsICA3fSwgezB4MDAwQiwgIDd9LAotICAgICAgICB7MHgwMDBDLCAgN30sIHsweDAwMEQsICA3fSwgezB4MDAwRSwgIDd9LCB7MHgwMDBGLCAgN30sCi0gICAgICAgIHsweDAwMTAsICA3fSwgezB4MDAwMSwgIDF9LCB7MHgwMDAxLCAgMn0sIHsweDAwMTEsICA3fSwKLSAgICAgICAgezB4MDAxMiwgIDd9LCB7MHgwMDEzLCAgN30sIHsweDAwMTQsICA3fSwgezB4MDAxNSwgIDd9LAotICAgICAgICB7MHgwMDE2LCAgN30sIHsweDAwMTcsICA3fSwgezB4MDAxOCwgIDd9LCB7MHgwMDE5LCAgN30sCi0gICAgICAgIHsweDAwMUEsICA3fSwgezB4MDAxQiwgIDd9LCB7MHgwMDFDLCAgN30sIHsweDAwMUQsICA3fSwKLSAgICAgICAgezB4MDAxRSwgIDd9LCB7MHgwMDFGLCAgN30sCi0gICAgfSx7Ly81Ci0gICAgICAgIHsweDAwMDAsICA1fSwgezB4MDAwMSwgIDR9LCB7MHgwMDAxLCAgNX0sIHsweDAwMDgsICA2fSwKLSAgICAgICAgezB4MDAwOSwgIDZ9LCB7MHgwMDBBLCAgNn0sIHsweDAwMTYsICA3fSwgezB4MDAwQywgIDZ9LAotICAgICAgICB7MHgwMDE3LCAgN30sIHsweDAwMEQsICA2fSwgezB4MDAzOCwgIDh9LCB7MHgwMDFELCAgN30sCi0gICAgICAgIHsweDAwMzksICA4fSwgezB4MDc4MCwgMTN9LCB7MHgwNzgxLCAxM30sIHsweDA3ODIsIDEzfSwKLSAgICAgICAgezB4MDc4MywgMTN9LCB7MHgwMDAyLCAgM30sIHsweDAwMDEsICAxfSwgezB4MDAwMywgIDN9LAotICAgICAgICB7MHgwMDFGLCAgN30sIHsweDAwM0QsICA4fSwgezB4MDA3OSwgIDl9LCB7MHgwNzg0LCAxM30sCi0gICAgICAgIHsweDA3ODUsIDEzfSwgezB4MDc4NiwgMTN9LCB7MHgwNzg3LCAxM30sIHsweDA3ODgsIDEzfSwKLSAgICAgICAgezB4MDc4OSwgMTN9LCB7MHgwNzhBLCAxM30sIHsweDA3OEIsIDEzfSwgezB4MDc4QywgMTN9LAotICAgICAgICB7MHgwNzhELCAxM30sIHsweDAzQzcsIDEyfSwKLSAgICB9LHsvLzYKLSAgICAgICAgezB4MDAwMCwgIDR9LCB7MHgwMDAxLCAgMn0sIHsweDAwMDEsICAzfSwgezB4MDAwNCwgIDN9LAotICAgICAgICB7MHgwMDAxLCAgNH0sIHsweDAwMEEsICA0fSwgezB4MDAxNiwgIDV9LCB7MHgwMDJFLCAgNn0sCi0gICAgICAgIHsweDAwNUUsICA3fSwgezB4MDA1RiwgIDd9LCB7MHgwMEMwLCAgOH0sIHsweDMwNDAsIDE0fSwKLSAgICAgICAgezB4MzA0MSwgMTR9LCB7MHgwMzA1LCAxMH0sIHsweDAxODMsICA5fSwgezB4MzA0MiwgMTR9LAotICAgICAgICB7MHgzMDQzLCAxNH0sIHsweDAwMEQsICA0fSwgezB4MDAwNywgIDN9LCB7MHgwMDE5LCAgNX0sCi0gICAgICAgIHsweDAwMzEsICA2fSwgezB4MDBDMiwgIDh9LCB7MHgwMEMzLCAgOH0sIHsweDMwNDQsIDE0fSwKLSAgICAgICAgezB4MzA0NSwgMTR9LCB7MHgzMDQ2LCAxNH0sIHsweDMwNDcsIDE0fSwgezB4MzA0OCwgMTR9LAotICAgICAgICB7MHgzMDQ5LCAxNH0sIHsweDMwNEEsIDE0fSwgezB4MzA0QiwgMTR9LCB7MHgzMDRDLCAxNH0sCi0gICAgICAgIHsweDMwNEQsIDE0fSwgezB4MTgyNywgMTN9LAotICAgIH0sey8vNwotICAgICAgICB7MHgwMDAwLCAgNn0sIHsweDAwMDEsICA2fSwgezB4MDAwMiwgIDZ9LCB7MHgwMDA2LCAgN30sCi0gICAgICAgIHsweDAwMDcsICA3fSwgezB4MDAwNCwgIDZ9LCB7MHgwMDA1LCAgNn0sIHsweDAwMDYsICA2fSwKLSAgICAgICAgezB4MDAwRSwgIDd9LCB7MHgwMDFFLCAgOH0sIHsweDAwMUYsICA4fSwgezB4MDA0MCwgIDl9LAotICAgICAgICB7MHgwMDgyLCAxMH0sIHsweDA4MzAsIDE0fSwgezB4MDgzMSwgMTR9LCB7MHgwODMyLCAxNH0sCi0gICAgICAgIHsweDA4MzMsIDE0fSwgezB4MDAwMSwgIDF9LCB7MHgwMDAxLCAgMn0sIHsweDAwMDMsICA0fSwKLSAgICAgICAgezB4MDAwNSwgIDV9LCB7MHgwMDA5LCAgNn0sIHsweDAwMTEsICA3fSwgezB4MDAyMSwgIDh9LAotICAgICAgICB7MHgwODM0LCAxNH0sIHsweDA4MzUsIDE0fSwgezB4MDgzNiwgMTR9LCB7MHgwODM3LCAxNH0sCi0gICAgICAgIHsweDA4MzgsIDE0fSwgezB4MDgzOSwgMTR9LCB7MHgwODNBLCAxNH0sIHsweDA4M0IsIDE0fSwKLSAgICAgICAgezB4MDQxRSwgMTN9LCB7MHgwNDFGLCAxM30sCi0gICAgfQorc3RhdGljIGNvbnN0IHVpbnQxNl90IHg4X2RjX2xvd3F1YW50X3RhYmxlWzhdWzM0XVsyXSA9IHsKKyAgICB7IC8vIDAKKyAgICAgICAgeyAweDAwMDAsICA1IH0sIHsgMHgwMDAxLCAgNCB9LCB7IDB4MDAwMSwgIDUgfSwgeyAweDAwMDQsICA1IH0sCisgICAgICAgIHsgMHgwMDA1LCAgNSB9LCB7IDB4MDAwNiwgIDUgfSwgeyAweDAwMEUsICA2IH0sIHsgMHgwMDBGLCAgNiB9LAorICAgICAgICB7IDB4MDA0MCwgIDggfSwgeyAweDAwNDEsICA4IH0sIHsgMHgwODQwLCAxMyB9LCB7IDB4MDg0MSwgMTMgfSwKKyAgICAgICAgeyAweDA4NDIsIDEzIH0sIHsgMHgwODQzLCAxMyB9LCB7IDB4MDg0NCwgMTMgfSwgeyAweDA4NDUsIDEzIH0sCisgICAgICAgIHsgMHgwODQ2LCAxMyB9LCB7IDB4MDAwMiwgIDIgfSwgeyAweDAwMDMsICAyIH0sIHsgMHgwMDAzLCAgMyB9LAorICAgICAgICB7IDB4MDAwNSwgIDQgfSwgeyAweDAwMDksICA1IH0sIHsgMHgwMDExLCAgNiB9LCB7IDB4MDA0MywgIDggfSwKKyAgICAgICAgeyAweDAwODUsICA5IH0sIHsgMHgwODQ3LCAxMyB9LCB7IDB4MDg0OCwgMTMgfSwgeyAweDA4NDksIDEzIH0sCisgICAgICAgIHsgMHgwODRBLCAxMyB9LCB7IDB4MDg0QiwgMTMgfSwgeyAweDA4NEMsIDEzIH0sIHsgMHgwODRELCAxMyB9LAorICAgICAgICB7IDB4MDg0RSwgMTMgfSwgeyAweDA4NEYsIDEzIH0sCisgICAgfSwKKyAgICB7IC8vIDEKKyAgICAgICAgeyAweDAwMDAsICA0IH0sIHsgMHgwMDAxLCAgMyB9LCB7IDB4MDAwMiwgIDMgfSwgeyAweDAwMDEsICA0IH0sCisgICAgICAgIHsgMHgwMDA2LCAgNCB9LCB7IDB4MDAwNCwgIDMgfSwgeyAweDAwMDcsICA0IH0sIHsgMHgwMDA1LCAgMyB9LAorICAgICAgICB7IDB4MDAwQywgIDQgfSwgeyAweDAwMEQsICA0IH0sIHsgMHgwMDFDLCAgNSB9LCB7IDB4MDAzQSwgIDYgfSwKKyAgICAgICAgeyAweDAxRDgsICA5IH0sIHsgMHgwMUQ5LCAgOSB9LCB7IDB4MURBMCwgMTMgfSwgeyAweDFEQTEsIDEzIH0sCisgICAgICAgIHsgMHgxREEyLCAxMyB9LCB7IDB4MDAzQywgIDYgfSwgeyAweDAwM0QsICA2IH0sIHsgMHgwMDNFLCAgNiB9LAorICAgICAgICB7IDB4MDA3NywgIDcgfSwgeyAweDAxREIsICA5IH0sIHsgMHgwMDdFLCAgNyB9LCB7IDB4MDBGRSwgIDggfSwKKyAgICAgICAgeyAweDAxRkUsICA5IH0sIHsgMHgxREEzLCAxMyB9LCB7IDB4MURBNCwgMTMgfSwgeyAweDFEQTUsIDEzIH0sCisgICAgICAgIHsgMHgwRUQzLCAxMiB9LCB7IDB4MEVENCwgMTIgfSwgeyAweDAxRkYsICA5IH0sIHsgMHgwRUQ1LCAxMiB9LAorICAgICAgICB7IDB4MEVENiwgMTIgfSwgeyAweDBFRDcsIDEyIH0sCisgICAgfSwKKyAgICB7IC8vIDIKKyAgICAgICAgeyAweDAwMDAsICA0IH0sIHsgMHgwMDAxLCAgMyB9LCB7IDB4MDAwMiwgIDMgfSwgeyAweDAwMDEsICA0IH0sCisgICAgICAgIHsgMHgwMDA2LCAgNCB9LCB7IDB4MDAwNywgIDQgfSwgeyAweDAwMDgsICA0IH0sIHsgMHgwMDA5LCAgNCB9LAorICAgICAgICB7IDB4MDAyOCwgIDYgfSwgeyAweDAwMjksICA2IH0sIHsgMHgwMDU0LCAgNyB9LCB7IDB4MDA1NSwgIDcgfSwKKyAgICAgICAgeyAweDBBQzAsIDEyIH0sIHsgMHgwQUMxLCAxMiB9LCB7IDB4MEFDMiwgMTIgfSwgeyAweDBBQzMsIDEyIH0sCisgICAgICAgIHsgMHgwQUM0LCAxMiB9LCB7IDB4MDAwQiwgIDQgfSwgeyAweDAwMDYsICAzIH0sIHsgMHgwMDBFLCAgNCB9LAorICAgICAgICB7IDB4MDAxRSwgIDUgfSwgeyAweDAwM0UsICA2IH0sIHsgMHgwMDNGLCAgNiB9LCB7IDB4MDA1NywgIDcgfSwKKyAgICAgICAgeyAweDAwQUQsICA4IH0sIHsgMHgwQUM1LCAxMiB9LCB7IDB4MEFDNiwgMTIgfSwgeyAweDBBQzcsIDEyIH0sCisgICAgICAgIHsgMHgwQUM4LCAxMiB9LCB7IDB4MEFDOSwgMTIgfSwgeyAweDBBQ0EsIDEyIH0sIHsgMHgwQUNCLCAxMiB9LAorICAgICAgICB7IDB4MDU2NiwgMTEgfSwgeyAweDA1NjcsIDExIH0sCisgICAgfSwKKyAgICB7IC8vIDMKKyAgICAgICAgeyAweDAwMDAsICA0IH0sIHsgMHgwMDAxLCAgMiB9LCB7IDB4MDAwMSwgIDMgfSwgeyAweDAwMDQsICAzIH0sCisgICAgICAgIHsgMHgwMDA1LCAgMyB9LCB7IDB4MDAwNiwgIDMgfSwgeyAweDAwMDEsICA0IH0sIHsgMHgwMDBFLCAgNCB9LAorICAgICAgICB7IDB4MDAzQywgIDYgfSwgeyAweDAwM0QsICA2IH0sIHsgMHgwMDdDLCAgNyB9LCB7IDB4MDBGQSwgIDggfSwKKyAgICAgICAgeyAweDNFQzAsIDE0IH0sIHsgMHgzRUMxLCAxNCB9LCB7IDB4M0VDMiwgMTQgfSwgeyAweDNFQzMsIDE0IH0sCisgICAgICAgIHsgMHgxRjYyLCAxMyB9LCB7IDB4MDFGNywgIDkgfSwgeyAweDAwN0UsICA3IH0sIHsgMHgwMEZFLCAgOCB9LAorICAgICAgICB7IDB4MDBGRiwgIDggfSwgeyAweDFGNjMsIDEzIH0sIHsgMHgxRjY0LCAxMyB9LCB7IDB4MUY2NSwgMTMgfSwKKyAgICAgICAgeyAweDFGNjYsIDEzIH0sIHsgMHgxRjY3LCAxMyB9LCB7IDB4MUY2OCwgMTMgfSwgeyAweDFGNjksIDEzIH0sCisgICAgICAgIHsgMHgxRjZBLCAxMyB9LCB7IDB4MUY2QiwgMTMgfSwgeyAweDFGNkMsIDEzIH0sIHsgMHgxRjZELCAxMyB9LAorICAgICAgICB7IDB4MUY2RSwgMTMgfSwgeyAweDFGNkYsIDEzIH0sCisgICAgfSwKKyAgICB7IC8vIDQKKyAgICAgICAgeyAweDAwMDAsICA3IH0sIHsgMHgwMDAxLCAgNyB9LCB7IDB4MDAwMiwgIDcgfSwgeyAweDAwMDMsICA3IH0sCisgICAgICAgIHsgMHgwMDA0LCAgNyB9LCB7IDB4MDAwNSwgIDcgfSwgeyAweDAwMDYsICA3IH0sIHsgMHgwMDA3LCAgNyB9LAorICAgICAgICB7IDB4MDAwOCwgIDcgfSwgeyAweDAwMDksICA3IH0sIHsgMHgwMDBBLCAgNyB9LCB7IDB4MDAwQiwgIDcgfSwKKyAgICAgICAgeyAweDAwMEMsICA3IH0sIHsgMHgwMDBELCAgNyB9LCB7IDB4MDAwRSwgIDcgfSwgeyAweDAwMEYsICA3IH0sCisgICAgICAgIHsgMHgwMDEwLCAgNyB9LCB7IDB4MDAwMSwgIDEgfSwgeyAweDAwMDEsICAyIH0sIHsgMHgwMDExLCAgNyB9LAorICAgICAgICB7IDB4MDAxMiwgIDcgfSwgeyAweDAwMTMsICA3IH0sIHsgMHgwMDE0LCAgNyB9LCB7IDB4MDAxNSwgIDcgfSwKKyAgICAgICAgeyAweDAwMTYsICA3IH0sIHsgMHgwMDE3LCAgNyB9LCB7IDB4MDAxOCwgIDcgfSwgeyAweDAwMTksICA3IH0sCisgICAgICAgIHsgMHgwMDFBLCAgNyB9LCB7IDB4MDAxQiwgIDcgfSwgeyAweDAwMUMsICA3IH0sIHsgMHgwMDFELCAgNyB9LAorICAgICAgICB7IDB4MDAxRSwgIDcgfSwgeyAweDAwMUYsICA3IH0sCisgICAgfSwKKyAgICB7IC8vIDUKKyAgICAgICAgeyAweDAwMDAsICA1IH0sIHsgMHgwMDAxLCAgNCB9LCB7IDB4MDAwMSwgIDUgfSwgeyAweDAwMDgsICA2IH0sCisgICAgICAgIHsgMHgwMDA5LCAgNiB9LCB7IDB4MDAwQSwgIDYgfSwgeyAweDAwMTYsICA3IH0sIHsgMHgwMDBDLCAgNiB9LAorICAgICAgICB7IDB4MDAxNywgIDcgfSwgeyAweDAwMEQsICA2IH0sIHsgMHgwMDM4LCAgOCB9LCB7IDB4MDAxRCwgIDcgfSwKKyAgICAgICAgeyAweDAwMzksICA4IH0sIHsgMHgwNzgwLCAxMyB9LCB7IDB4MDc4MSwgMTMgfSwgeyAweDA3ODIsIDEzIH0sCisgICAgICAgIHsgMHgwNzgzLCAxMyB9LCB7IDB4MDAwMiwgIDMgfSwgeyAweDAwMDEsICAxIH0sIHsgMHgwMDAzLCAgMyB9LAorICAgICAgICB7IDB4MDAxRiwgIDcgfSwgeyAweDAwM0QsICA4IH0sIHsgMHgwMDc5LCAgOSB9LCB7IDB4MDc4NCwgMTMgfSwKKyAgICAgICAgeyAweDA3ODUsIDEzIH0sIHsgMHgwNzg2LCAxMyB9LCB7IDB4MDc4NywgMTMgfSwgeyAweDA3ODgsIDEzIH0sCisgICAgICAgIHsgMHgwNzg5LCAxMyB9LCB7IDB4MDc4QSwgMTMgfSwgeyAweDA3OEIsIDEzIH0sIHsgMHgwNzhDLCAxMyB9LAorICAgICAgICB7IDB4MDc4RCwgMTMgfSwgeyAweDAzQzcsIDEyIH0sCisgICAgfSwKKyAgICB7IC8vIDYKKyAgICAgICAgeyAweDAwMDAsICA0IH0sIHsgMHgwMDAxLCAgMiB9LCB7IDB4MDAwMSwgIDMgfSwgeyAweDAwMDQsICAzIH0sCisgICAgICAgIHsgMHgwMDAxLCAgNCB9LCB7IDB4MDAwQSwgIDQgfSwgeyAweDAwMTYsICA1IH0sIHsgMHgwMDJFLCAgNiB9LAorICAgICAgICB7IDB4MDA1RSwgIDcgfSwgeyAweDAwNUYsICA3IH0sIHsgMHgwMEMwLCAgOCB9LCB7IDB4MzA0MCwgMTQgfSwKKyAgICAgICAgeyAweDMwNDEsIDE0IH0sIHsgMHgwMzA1LCAxMCB9LCB7IDB4MDE4MywgIDkgfSwgeyAweDMwNDIsIDE0IH0sCisgICAgICAgIHsgMHgzMDQzLCAxNCB9LCB7IDB4MDAwRCwgIDQgfSwgeyAweDAwMDcsICAzIH0sIHsgMHgwMDE5LCAgNSB9LAorICAgICAgICB7IDB4MDAzMSwgIDYgfSwgeyAweDAwQzIsICA4IH0sIHsgMHgwMEMzLCAgOCB9LCB7IDB4MzA0NCwgMTQgfSwKKyAgICAgICAgeyAweDMwNDUsIDE0IH0sIHsgMHgzMDQ2LCAxNCB9LCB7IDB4MzA0NywgMTQgfSwgeyAweDMwNDgsIDE0IH0sCisgICAgICAgIHsgMHgzMDQ5LCAxNCB9LCB7IDB4MzA0QSwgMTQgfSwgeyAweDMwNEIsIDE0IH0sIHsgMHgzMDRDLCAxNCB9LAorICAgICAgICB7IDB4MzA0RCwgMTQgfSwgeyAweDE4MjcsIDEzIH0sCisgICAgfSwKKyAgICB7IC8vIDcKKyAgICAgICAgeyAweDAwMDAsICA2IH0sIHsgMHgwMDAxLCAgNiB9LCB7IDB4MDAwMiwgIDYgfSwgeyAweDAwMDYsICA3IH0sCisgICAgICAgIHsgMHgwMDA3LCAgNyB9LCB7IDB4MDAwNCwgIDYgfSwgeyAweDAwMDUsICA2IH0sIHsgMHgwMDA2LCAgNiB9LAorICAgICAgICB7IDB4MDAwRSwgIDcgfSwgeyAweDAwMUUsICA4IH0sIHsgMHgwMDFGLCAgOCB9LCB7IDB4MDA0MCwgIDkgfSwKKyAgICAgICAgeyAweDAwODIsIDEwIH0sIHsgMHgwODMwLCAxNCB9LCB7IDB4MDgzMSwgMTQgfSwgeyAweDA4MzIsIDE0IH0sCisgICAgICAgIHsgMHgwODMzLCAxNCB9LCB7IDB4MDAwMSwgIDEgfSwgeyAweDAwMDEsICAyIH0sIHsgMHgwMDAzLCAgNCB9LAorICAgICAgICB7IDB4MDAwNSwgIDUgfSwgeyAweDAwMDksICA2IH0sIHsgMHgwMDExLCAgNyB9LCB7IDB4MDAyMSwgIDggfSwKKyAgICAgICAgeyAweDA4MzQsIDE0IH0sIHsgMHgwODM1LCAxNCB9LCB7IDB4MDgzNiwgMTQgfSwgeyAweDA4MzcsIDE0IH0sCisgICAgICAgIHsgMHgwODM4LCAxNCB9LCB7IDB4MDgzOSwgMTQgfSwgeyAweDA4M0EsIDE0IH0sIHsgMHgwODNCLCAxNCB9LAorICAgICAgICB7IDB4MDQxRSwgMTMgfSwgeyAweDA0MUYsIDEzIH0sCisgICAgfSwKIH07CiAKLXN0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9kY19oaWdocXVhbnRfdGFibGVbOF1bMzRdWzJdPXsKLSAgICB7Ly8wCi0gICAgICAgIHsweDAwMDAsICA1fSwgezB4MDAwMSwgIDR9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDEsICA1fSwKLSAgICAgICAgezB4MDAwNiwgIDV9LCB7MHgwMDA0LCAgNH0sIHsweDAwMDcsICA1fSwgezB4MDAwQSwgIDV9LAotICAgICAgICB7MHgwMDJDLCAgN30sIHsweDAwMkQsICA3fSwgezB4MDVDMCwgMTJ9LCB7MHgwNUMxLCAxMn0sCi0gICAgICAgIHsweDA1QzIsIDEyfSwgezB4MDVDMywgMTJ9LCB7MHgwNUM0LCAxMn0sIHsweDA1QzUsIDEyfSwKLSAgICAgICAgezB4MDVDNiwgMTJ9LCB7MHgwMDAzLCAgM30sIHsweDAwMDIsICAyfSwgezB4MDAwNiwgIDN9LAotICAgICAgICB7MHgwMDBFLCAgNH0sIHsweDAwMUUsICA1fSwgezB4MDAxRiwgIDV9LCB7MHgwMDJGLCAgN30sCi0gICAgICAgIHsweDAwNUQsICA4fSwgezB4MDVDNywgMTJ9LCB7MHgwNUM4LCAxMn0sIHsweDA1QzksIDEyfSwKLSAgICAgICAgezB4MDVDQSwgMTJ9LCB7MHgwNUNCLCAxMn0sIHsweDA1Q0MsIDEyfSwgezB4MDVDRCwgMTJ9LAotICAgICAgICB7MHgwNUNFLCAxMn0sIHsweDA1Q0YsIDEyfSwKLSAgICB9LHsvLzEKLSAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAxLCAgM30sIHsweDAwMDIsICAzfSwgezB4MDAwNiwgIDR9LAotICAgICAgICB7MHgwMDA3LCAgNH0sIHsweDAwMDQsICAzfSwgezB4MDAwQSwgIDR9LCB7MHgwMDBCLCAgNH0sCi0gICAgICAgIHsweDAwMzAsICA2fSwgezB4MDA2MiwgIDd9LCB7MHgwMDYzLCAgN30sIHsweDA2NDAsIDExfSwKLSAgICAgICAgezB4MDY0MSwgMTF9LCB7MHgwNjQyLCAxMX0sIHsweDA2NDMsIDExfSwgezB4MDY0NCwgMTF9LAotICAgICAgICB7MHgwNjQ1LCAxMX0sIHsweDAwMzMsICA2fSwgezB4MDAwRCwgIDR9LCB7MHgwMDFDLCAgNX0sCi0gICAgICAgIHsweDAwMUQsICA1fSwgezB4MDAzQywgIDZ9LCB7MHgwMDFGLCAgNX0sIHsweDAwNjUsICA3fSwKLSAgICAgICAgezB4MDA3QSwgIDd9LCB7MHgwNjQ2LCAxMX0sIHsweDAwN0IsICA3fSwgezB4MDY0NywgMTF9LAotICAgICAgICB7MHgwNjQ4LCAxMX0sIHsweDA2NDksIDExfSwgezB4MDY0QSwgMTF9LCB7MHgwNjRCLCAxMX0sCi0gICAgICAgIHsweDAzMjYsIDEwfSwgezB4MDMyNywgMTB9LAotICAgIH0sey8vMgotICAgICAgICB7MHgwMDAwLCAgN30sIHsweDAwMDEsICA3fSwgezB4MDAwMSwgIDZ9LCB7MHgwMDA0LCAgN30sCi0gICAgICAgIHsweDAwMDMsICA2fSwgezB4MDAwNSwgIDd9LCB7MHgwMDEwLCAgOH0sIHsweDAwMTEsICA4fSwKLSAgICAgICAgezB4MDI0MCwgMTN9LCB7MHgwMjQxLCAxM30sIHsweDAyNDIsIDEzfSwgezB4MDI0MywgMTN9LAotICAgICAgICB7MHgwMjQ0LCAxM30sIHsweDAyNDUsIDEzfSwgezB4MDI0NiwgMTN9LCB7MHgwMjQ3LCAxM30sCi0gICAgICAgIHsweDAxMjQsIDEyfSwgezB4MDAwMSwgIDF9LCB7MHgwMDAxLCAgMn0sIHsweDAwMDEsICAzfSwKLSAgICAgICAgezB4MDAwMywgIDV9LCB7MHgwMDA1LCAgNn0sIHsweDAwMTMsICA4fSwgezB4MDEyNSwgMTJ9LAotICAgICAgICB7MHgwMTI2LCAxMn0sIHsweDAxMjcsIDEyfSwgezB4MDEyOCwgMTJ9LCB7MHgwMTI5LCAxMn0sCi0gICAgICAgIHsweDAxMkEsIDEyfSwgezB4MDEyQiwgMTJ9LCB7MHgwMTJDLCAxMn0sIHsweDAxMkQsIDEyfSwKLSAgICAgICAgezB4MDEyRSwgMTJ9LCB7MHgwMTJGLCAxMn0sCi0gICAgfSx7Ly8zCi0gICAgICAgIHsweDAwMDAsICA0fSwgezB4MDAwMSwgIDN9LCB7MHgwMDAyLCAgM30sIHsweDAwMDEsICA0fSwKLSAgICAgICAgezB4MDAwNiwgIDR9LCB7MHgwMDA0LCAgM30sIHsweDAwMDUsICAzfSwgezB4MDAwNiwgIDN9LAotICAgICAgICB7MHgwMDBFLCAgNX0sIHsweDAwMEYsICA1fSwgezB4MDA3MCwgIDd9LCB7MHgwNzEwLCAxMX0sCi0gICAgICAgIHsweDA3MTEsIDExfSwgezB4MDcxMiwgMTF9LCB7MHgwNzEzLCAxMX0sIHsweDA3MTQsIDExfSwKLSAgICAgICAgezB4MDcxNSwgMTF9LCB7MHgwMDFELCAgNX0sIHsweDAwNzIsICA3fSwgezB4MDAzQywgIDZ9LAotICAgICAgICB7MHgwMDNELCAgNn0sIHsweDAwNzMsICA3fSwgezB4MDA3QywgIDd9LCB7MHgwMDdELCAgN30sCi0gICAgICAgIHsweDAwN0UsICA3fSwgezB4MDcxNiwgMTF9LCB7MHgwNzE3LCAxMX0sIHsweDA3MTgsIDExfSwKLSAgICAgICAgezB4MDA3RiwgIDd9LCB7MHgwNzE5LCAxMX0sIHsweDA3MUEsIDExfSwgezB4MDcxQiwgMTF9LAotICAgICAgICB7MHgwMzhFLCAxMH0sIHsweDAzOEYsIDEwfSwKLSAgICB9LHsvLzQKLSAgICAgICAgezB4MDAwMCwgIDh9LCB7MHgwMDAxLCAgN30sIHsweDAwMDIsICA3fSwgezB4MDAwMywgIDd9LAotICAgICAgICB7MHgwMDAyLCAgOX0sIHsweDAwMDgsICA4fSwgezB4MDAwMywgIDl9LCB7MHgwMjQwLCAxNH0sCi0gICAgICAgIHsweDAyNDEsIDE0fSwgezB4MDI0MiwgMTR9LCB7MHgwMjQzLCAxNH0sIHsweDAyNDQsIDE0fSwKLSAgICAgICAgezB4MDI0NSwgMTR9LCB7MHgwMjQ2LCAxNH0sIHsweDAyNDcsIDE0fSwgezB4MDEyNCwgMTN9LAotICAgICAgICB7MHgwMTI1LCAxM30sIHsweDAwMDEsICAyfSwgezB4MDAwMSwgIDF9LCB7MHgwMDAxLCAgM30sCi0gICAgICAgIHsweDAwMDEsICA0fSwgezB4MDAwMywgIDZ9LCB7MHgwMDA1LCAgN30sIHsweDAwMTMsICA5fSwKLSAgICAgICAgezB4MDEyNiwgMTN9LCB7MHgwMTI3LCAxM30sIHsweDAxMjgsIDEzfSwgezB4MDEyOSwgMTN9LAotICAgICAgICB7MHgwMTJBLCAxM30sIHsweDAxMkIsIDEzfSwgezB4MDEyQywgMTN9LCB7MHgwMTJELCAxM30sCi0gICAgICAgIHsweDAxMkUsIDEzfSwgezB4MDEyRiwgMTN9LAotICAgIH0sey8vNQotICAgICAgICB7MHgwMDAwLCAgN30sIHsweDAwMDEsICA3fSwgezB4MDAwMSwgIDZ9LCB7MHgwMDAyLCAgNn0sCi0gICAgICAgIHsweDAwMDMsICA2fSwgezB4MDAwNCwgIDZ9LCB7MHgwMDA1LCAgNn0sIHsweDAwMDYsICA2fSwKLSAgICAgICAgezB4MDAwNywgIDZ9LCB7MHgwMDA4LCAgNn0sIHsweDAwMDksICA2fSwgezB4MDAwQSwgIDZ9LAotICAgICAgICB7MHgwMDBCLCAgNn0sIHsweDAwMEMsICA2fSwgezB4MDAwRCwgIDZ9LCB7MHgwMDBFLCAgNn0sCi0gICAgICAgIHsweDAwMEYsICA2fSwgezB4MDAxMCwgIDZ9LCB7MHgwMDExLCAgNn0sIHsweDAwMTIsICA2fSwKLSAgICAgICAgezB4MDAxMywgIDZ9LCB7MHgwMDE0LCAgNn0sIHsweDAwMTUsICA2fSwgezB4MDAxNiwgIDZ9LAotICAgICAgICB7MHgwMDE3LCAgNn0sIHsweDAwMTgsICA2fSwgezB4MDAxOSwgIDZ9LCB7MHgwMDAxLCAgMX0sCi0gICAgICAgIHsweDAwMUEsICA2fSwgezB4MDAxQiwgIDZ9LCB7MHgwMDFDLCAgNn0sIHsweDAwMUQsICA2fSwKLSAgICAgICAgezB4MDAxRSwgIDZ9LCB7MHgwMDFGLCAgNn0sCi0gICAgfSx7Ly82Ci0gICAgICAgIHsweDAwMDAsICA1fSwgezB4MDAwMSwgIDR9LCB7MHgwMDAxLCAgNX0sIHsweDAwMDQsICA1fSwKLSAgICAgICAgezB4MDAwQSwgIDZ9LCB7MHgwMDA2LCAgNX0sIHsweDAwMEIsICA2fSwgezB4MDAwRSwgIDZ9LAotICAgICAgICB7MHgwMDNDLCAgOH0sIHsweDAwM0QsICA4fSwgezB4MDdDMCwgMTN9LCB7MHgwN0MxLCAxM30sCi0gICAgICAgIHsweDA3QzIsIDEzfSwgezB4MDdDMywgMTN9LCB7MHgwN0M0LCAxM30sIHsweDA3QzUsIDEzfSwKLSAgICAgICAgezB4MDdDNiwgMTN9LCB7MHgwMDAxLCAgMn0sIHsweDAwMDIsICAyfSwgezB4MDAwNiwgIDN9LAotICAgICAgICB7MHgwMDBFLCAgNH0sIHsweDAwMUUsICA1fSwgezB4MDAxRiwgIDV9LCB7MHgwMDNGLCAgOH0sCi0gICAgICAgIHsweDAwN0QsICA5fSwgezB4MDdDNywgMTN9LCB7MHgwN0M4LCAxM30sIHsweDA3QzksIDEzfSwKLSAgICAgICAgezB4MDdDQSwgMTN9LCB7MHgwN0NCLCAxM30sIHsweDA3Q0MsIDEzfSwgezB4MDdDRCwgMTN9LAotICAgICAgICB7MHgwN0NFLCAxM30sIHsweDA3Q0YsIDEzfSwKLSAgICB9LHsvLzcKLSAgICAgICAgezB4MDAwMCwgIDd9LCB7MHgwMDAxLCAgN30sIHsweDAwMDIsICA3fSwgezB4MDAwMywgIDd9LAotICAgICAgICB7MHgwMDA0LCAgN30sIHsweDAwMDUsICA3fSwgezB4MDAwNiwgIDd9LCB7MHgwMDA3LCAgN30sCi0gICAgICAgIHsweDAwMDgsICA3fSwgezB4MDAwOSwgIDd9LCB7MHgwMDBBLCAgN30sIHsweDAwMEIsICA3fSwKLSAgICAgICAgezB4MDAwQywgIDd9LCB7MHgwMDBELCAgN30sIHsweDAwMEUsICA3fSwgezB4MDAwRiwgIDd9LAotICAgICAgICB7MHgwMDEwLCAgN30sIHsweDAwMDEsICAxfSwgezB4MDAwMSwgIDJ9LCB7MHgwMDExLCAgN30sCi0gICAgICAgIHsweDAwMTIsICA3fSwgezB4MDAxMywgIDd9LCB7MHgwMDE0LCAgN30sIHsweDAwMTUsICA3fSwKLSAgICAgICAgezB4MDAxNiwgIDd9LCB7MHgwMDE3LCAgN30sIHsweDAwMTgsICA3fSwgezB4MDAxOSwgIDd9LAotICAgICAgICB7MHgwMDFBLCAgN30sIHsweDAwMUIsICA3fSwgezB4MDAxQywgIDd9LCB7MHgwMDFELCAgN30sCi0gICAgICAgIHsweDAwMUUsICA3fSwgezB4MDAxRiwgIDd9LAotICAgIH0KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9kY19oaWdocXVhbnRfdGFibGVbOF1bMzRdWzJdID0geworICAgIHsgLy8gMAorICAgICAgICB7IDB4MDAwMCwgIDUgfSwgeyAweDAwMDEsICA0IH0sIHsgMHgwMDAyLCAgNCB9LCB7IDB4MDAwMSwgIDUgfSwKKyAgICAgICAgeyAweDAwMDYsICA1IH0sIHsgMHgwMDA0LCAgNCB9LCB7IDB4MDAwNywgIDUgfSwgeyAweDAwMEEsICA1IH0sCisgICAgICAgIHsgMHgwMDJDLCAgNyB9LCB7IDB4MDAyRCwgIDcgfSwgeyAweDA1QzAsIDEyIH0sIHsgMHgwNUMxLCAxMiB9LAorICAgICAgICB7IDB4MDVDMiwgMTIgfSwgeyAweDA1QzMsIDEyIH0sIHsgMHgwNUM0LCAxMiB9LCB7IDB4MDVDNSwgMTIgfSwKKyAgICAgICAgeyAweDA1QzYsIDEyIH0sIHsgMHgwMDAzLCAgMyB9LCB7IDB4MDAwMiwgIDIgfSwgeyAweDAwMDYsICAzIH0sCisgICAgICAgIHsgMHgwMDBFLCAgNCB9LCB7IDB4MDAxRSwgIDUgfSwgeyAweDAwMUYsICA1IH0sIHsgMHgwMDJGLCAgNyB9LAorICAgICAgICB7IDB4MDA1RCwgIDggfSwgeyAweDA1QzcsIDEyIH0sIHsgMHgwNUM4LCAxMiB9LCB7IDB4MDVDOSwgMTIgfSwKKyAgICAgICAgeyAweDA1Q0EsIDEyIH0sIHsgMHgwNUNCLCAxMiB9LCB7IDB4MDVDQywgMTIgfSwgeyAweDA1Q0QsIDEyIH0sCisgICAgICAgIHsgMHgwNUNFLCAxMiB9LCB7IDB4MDVDRiwgMTIgfSwKKyAgICB9LAorICAgIHsgLy8gMQorICAgICAgICB7IDB4MDAwMCwgIDMgfSwgeyAweDAwMDEsICAzIH0sIHsgMHgwMDAyLCAgMyB9LCB7IDB4MDAwNiwgIDQgfSwKKyAgICAgICAgeyAweDAwMDcsICA0IH0sIHsgMHgwMDA0LCAgMyB9LCB7IDB4MDAwQSwgIDQgfSwgeyAweDAwMEIsICA0IH0sCisgICAgICAgIHsgMHgwMDMwLCAgNiB9LCB7IDB4MDA2MiwgIDcgfSwgeyAweDAwNjMsICA3IH0sIHsgMHgwNjQwLCAxMSB9LAorICAgICAgICB7IDB4MDY0MSwgMTEgfSwgeyAweDA2NDIsIDExIH0sIHsgMHgwNjQzLCAxMSB9LCB7IDB4MDY0NCwgMTEgfSwKKyAgICAgICAgeyAweDA2NDUsIDExIH0sIHsgMHgwMDMzLCAgNiB9LCB7IDB4MDAwRCwgIDQgfSwgeyAweDAwMUMsICA1IH0sCisgICAgICAgIHsgMHgwMDFELCAgNSB9LCB7IDB4MDAzQywgIDYgfSwgeyAweDAwMUYsICA1IH0sIHsgMHgwMDY1LCAgNyB9LAorICAgICAgICB7IDB4MDA3QSwgIDcgfSwgeyAweDA2NDYsIDExIH0sIHsgMHgwMDdCLCAgNyB9LCB7IDB4MDY0NywgMTEgfSwKKyAgICAgICAgeyAweDA2NDgsIDExIH0sIHsgMHgwNjQ5LCAxMSB9LCB7IDB4MDY0QSwgMTEgfSwgeyAweDA2NEIsIDExIH0sCisgICAgICAgIHsgMHgwMzI2LCAxMCB9LCB7IDB4MDMyNywgMTAgfSwKKyAgICB9LAorICAgIHsgLy8gMgorICAgICAgICB7IDB4MDAwMCwgIDcgfSwgeyAweDAwMDEsICA3IH0sIHsgMHgwMDAxLCAgNiB9LCB7IDB4MDAwNCwgIDcgfSwKKyAgICAgICAgeyAweDAwMDMsICA2IH0sIHsgMHgwMDA1LCAgNyB9LCB7IDB4MDAxMCwgIDggfSwgeyAweDAwMTEsICA4IH0sCisgICAgICAgIHsgMHgwMjQwLCAxMyB9LCB7IDB4MDI0MSwgMTMgfSwgeyAweDAyNDIsIDEzIH0sIHsgMHgwMjQzLCAxMyB9LAorICAgICAgICB7IDB4MDI0NCwgMTMgfSwgeyAweDAyNDUsIDEzIH0sIHsgMHgwMjQ2LCAxMyB9LCB7IDB4MDI0NywgMTMgfSwKKyAgICAgICAgeyAweDAxMjQsIDEyIH0sIHsgMHgwMDAxLCAgMSB9LCB7IDB4MDAwMSwgIDIgfSwgeyAweDAwMDEsICAzIH0sCisgICAgICAgIHsgMHgwMDAzLCAgNSB9LCB7IDB4MDAwNSwgIDYgfSwgeyAweDAwMTMsICA4IH0sIHsgMHgwMTI1LCAxMiB9LAorICAgICAgICB7IDB4MDEyNiwgMTIgfSwgeyAweDAxMjcsIDEyIH0sIHsgMHgwMTI4LCAxMiB9LCB7IDB4MDEyOSwgMTIgfSwKKyAgICAgICAgeyAweDAxMkEsIDEyIH0sIHsgMHgwMTJCLCAxMiB9LCB7IDB4MDEyQywgMTIgfSwgeyAweDAxMkQsIDEyIH0sCisgICAgICAgIHsgMHgwMTJFLCAxMiB9LCB7IDB4MDEyRiwgMTIgfSwKKyAgICB9LAorICAgIHsgLy8gMworICAgICAgICB7IDB4MDAwMCwgIDQgfSwgeyAweDAwMDEsICAzIH0sIHsgMHgwMDAyLCAgMyB9LCB7IDB4MDAwMSwgIDQgfSwKKyAgICAgICAgeyAweDAwMDYsICA0IH0sIHsgMHgwMDA0LCAgMyB9LCB7IDB4MDAwNSwgIDMgfSwgeyAweDAwMDYsICAzIH0sCisgICAgICAgIHsgMHgwMDBFLCAgNSB9LCB7IDB4MDAwRiwgIDUgfSwgeyAweDAwNzAsICA3IH0sIHsgMHgwNzEwLCAxMSB9LAorICAgICAgICB7IDB4MDcxMSwgMTEgfSwgeyAweDA3MTIsIDExIH0sIHsgMHgwNzEzLCAxMSB9LCB7IDB4MDcxNCwgMTEgfSwKKyAgICAgICAgeyAweDA3MTUsIDExIH0sIHsgMHgwMDFELCAgNSB9LCB7IDB4MDA3MiwgIDcgfSwgeyAweDAwM0MsICA2IH0sCisgICAgICAgIHsgMHgwMDNELCAgNiB9LCB7IDB4MDA3MywgIDcgfSwgeyAweDAwN0MsICA3IH0sIHsgMHgwMDdELCAgNyB9LAorICAgICAgICB7IDB4MDA3RSwgIDcgfSwgeyAweDA3MTYsIDExIH0sIHsgMHgwNzE3LCAxMSB9LCB7IDB4MDcxOCwgMTEgfSwKKyAgICAgICAgeyAweDAwN0YsICA3IH0sIHsgMHgwNzE5LCAxMSB9LCB7IDB4MDcxQSwgMTEgfSwgeyAweDA3MUIsIDExIH0sCisgICAgICAgIHsgMHgwMzhFLCAxMCB9LCB7IDB4MDM4RiwgMTAgfSwKKyAgICB9LAorICAgIHsgLy8gNAorICAgICAgICB7IDB4MDAwMCwgIDggfSwgeyAweDAwMDEsICA3IH0sIHsgMHgwMDAyLCAgNyB9LCB7IDB4MDAwMywgIDcgfSwKKyAgICAgICAgeyAweDAwMDIsICA5IH0sIHsgMHgwMDA4LCAgOCB9LCB7IDB4MDAwMywgIDkgfSwgeyAweDAyNDAsIDE0IH0sCisgICAgICAgIHsgMHgwMjQxLCAxNCB9LCB7IDB4MDI0MiwgMTQgfSwgeyAweDAyNDMsIDE0IH0sIHsgMHgwMjQ0LCAxNCB9LAorICAgICAgICB7IDB4MDI0NSwgMTQgfSwgeyAweDAyNDYsIDE0IH0sIHsgMHgwMjQ3LCAxNCB9LCB7IDB4MDEyNCwgMTMgfSwKKyAgICAgICAgeyAweDAxMjUsIDEzIH0sIHsgMHgwMDAxLCAgMiB9LCB7IDB4MDAwMSwgIDEgfSwgeyAweDAwMDEsICAzIH0sCisgICAgICAgIHsgMHgwMDAxLCAgNCB9LCB7IDB4MDAwMywgIDYgfSwgeyAweDAwMDUsICA3IH0sIHsgMHgwMDEzLCAgOSB9LAorICAgICAgICB7IDB4MDEyNiwgMTMgfSwgeyAweDAxMjcsIDEzIH0sIHsgMHgwMTI4LCAxMyB9LCB7IDB4MDEyOSwgMTMgfSwKKyAgICAgICAgeyAweDAxMkEsIDEzIH0sIHsgMHgwMTJCLCAxMyB9LCB7IDB4MDEyQywgMTMgfSwgeyAweDAxMkQsIDEzIH0sCisgICAgICAgIHsgMHgwMTJFLCAxMyB9LCB7IDB4MDEyRiwgMTMgfSwKKyAgICB9LAorICAgIHsgLy8gNQorICAgICAgICB7IDB4MDAwMCwgIDcgfSwgeyAweDAwMDEsICA3IH0sIHsgMHgwMDAxLCAgNiB9LCB7IDB4MDAwMiwgIDYgfSwKKyAgICAgICAgeyAweDAwMDMsICA2IH0sIHsgMHgwMDA0LCAgNiB9LCB7IDB4MDAwNSwgIDYgfSwgeyAweDAwMDYsICA2IH0sCisgICAgICAgIHsgMHgwMDA3LCAgNiB9LCB7IDB4MDAwOCwgIDYgfSwgeyAweDAwMDksICA2IH0sIHsgMHgwMDBBLCAgNiB9LAorICAgICAgICB7IDB4MDAwQiwgIDYgfSwgeyAweDAwMEMsICA2IH0sIHsgMHgwMDBELCAgNiB9LCB7IDB4MDAwRSwgIDYgfSwKKyAgICAgICAgeyAweDAwMEYsICA2IH0sIHsgMHgwMDEwLCAgNiB9LCB7IDB4MDAxMSwgIDYgfSwgeyAweDAwMTIsICA2IH0sCisgICAgICAgIHsgMHgwMDEzLCAgNiB9LCB7IDB4MDAxNCwgIDYgfSwgeyAweDAwMTUsICA2IH0sIHsgMHgwMDE2LCAgNiB9LAorICAgICAgICB7IDB4MDAxNywgIDYgfSwgeyAweDAwMTgsICA2IH0sIHsgMHgwMDE5LCAgNiB9LCB7IDB4MDAwMSwgIDEgfSwKKyAgICAgICAgeyAweDAwMUEsICA2IH0sIHsgMHgwMDFCLCAgNiB9LCB7IDB4MDAxQywgIDYgfSwgeyAweDAwMUQsICA2IH0sCisgICAgICAgIHsgMHgwMDFFLCAgNiB9LCB7IDB4MDAxRiwgIDYgfSwKKyAgICB9LAorICAgIHsgLy8gNgorICAgICAgICB7IDB4MDAwMCwgIDUgfSwgeyAweDAwMDEsICA0IH0sIHsgMHgwMDAxLCAgNSB9LCB7IDB4MDAwNCwgIDUgfSwKKyAgICAgICAgeyAweDAwMEEsICA2IH0sIHsgMHgwMDA2LCAgNSB9LCB7IDB4MDAwQiwgIDYgfSwgeyAweDAwMEUsICA2IH0sCisgICAgICAgIHsgMHgwMDNDLCAgOCB9LCB7IDB4MDAzRCwgIDggfSwgeyAweDA3QzAsIDEzIH0sIHsgMHgwN0MxLCAxMyB9LAorICAgICAgICB7IDB4MDdDMiwgMTMgfSwgeyAweDA3QzMsIDEzIH0sIHsgMHgwN0M0LCAxMyB9LCB7IDB4MDdDNSwgMTMgfSwKKyAgICAgICAgeyAweDA3QzYsIDEzIH0sIHsgMHgwMDAxLCAgMiB9LCB7IDB4MDAwMiwgIDIgfSwgeyAweDAwMDYsICAzIH0sCisgICAgICAgIHsgMHgwMDBFLCAgNCB9LCB7IDB4MDAxRSwgIDUgfSwgeyAweDAwMUYsICA1IH0sIHsgMHgwMDNGLCAgOCB9LAorICAgICAgICB7IDB4MDA3RCwgIDkgfSwgeyAweDA3QzcsIDEzIH0sIHsgMHgwN0M4LCAxMyB9LCB7IDB4MDdDOSwgMTMgfSwKKyAgICAgICAgeyAweDA3Q0EsIDEzIH0sIHsgMHgwN0NCLCAxMyB9LCB7IDB4MDdDQywgMTMgfSwgeyAweDA3Q0QsIDEzIH0sCisgICAgICAgIHsgMHgwN0NFLCAxMyB9LCB7IDB4MDdDRiwgMTMgfSwKKyAgICB9LAorICAgIHsgLy8gNworICAgICAgICB7IDB4MDAwMCwgIDcgfSwgeyAweDAwMDEsICA3IH0sIHsgMHgwMDAyLCAgNyB9LCB7IDB4MDAwMywgIDcgfSwKKyAgICAgICAgeyAweDAwMDQsICA3IH0sIHsgMHgwMDA1LCAgNyB9LCB7IDB4MDAwNiwgIDcgfSwgeyAweDAwMDcsICA3IH0sCisgICAgICAgIHsgMHgwMDA4LCAgNyB9LCB7IDB4MDAwOSwgIDcgfSwgeyAweDAwMEEsICA3IH0sIHsgMHgwMDBCLCAgNyB9LAorICAgICAgICB7IDB4MDAwQywgIDcgfSwgeyAweDAwMEQsICA3IH0sIHsgMHgwMDBFLCAgNyB9LCB7IDB4MDAwRiwgIDcgfSwKKyAgICAgICAgeyAweDAwMTAsICA3IH0sIHsgMHgwMDAxLCAgMSB9LCB7IDB4MDAwMSwgIDIgfSwgeyAweDAwMTEsICA3IH0sCisgICAgICAgIHsgMHgwMDEyLCAgNyB9LCB7IDB4MDAxMywgIDcgfSwgeyAweDAwMTQsICA3IH0sIHsgMHgwMDE1LCAgNyB9LAorICAgICAgICB7IDB4MDAxNiwgIDcgfSwgeyAweDAwMTcsICA3IH0sIHsgMHgwMDE4LCAgNyB9LCB7IDB4MDAxOSwgIDcgfSwKKyAgICAgICAgeyAweDAwMUEsICA3IH0sIHsgMHgwMDFCLCAgNyB9LCB7IDB4MDAxQywgIDcgfSwgeyAweDAwMUQsICA3IH0sCisgICAgICAgIHsgMHgwMDFFLCAgNyB9LCB7IDB4MDAxRiwgIDcgfSwKKyAgICB9LAogfTsKICNkZWZpbmUgTUFYX0RDX1ZMQ19CSVRTIDE0CiAKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHg4X2FjMF9sb3dxdWFudF90YWJsZVs4XVs3N11bMl09ewotICAgIHsvLzAKLSAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDAyLCAgM30sIHsweDAwMDYsICA0fSwgezB4MDAwRSwgIDV9LAotICAgICAgICB7MHgwMDFFLCAgNn0sIHsweDAwM0UsICA3fSwgezB4MDAzRiwgIDd9LCB7MHgwMDQwLCAgN30sCi0gICAgICAgIHsweDAxMDQsICA5fSwgezB4MDA4MywgIDh9LCB7MHgwMDg0LCAgOH0sIHsweDAwODUsICA4fSwKLSAgICAgICAgezB4MDIwQSwgMTB9LCB7MHgwMjBCLCAxMH0sIHsweDAyMTgsIDEwfSwgezB4MDIxOSwgMTB9LAotICAgICAgICB7MHgwMDA5LCAgNH0sIHsweDAwNDQsICA3fSwgezB4MDEwRCwgIDl9LCB7MHgwMjFDLCAxMH0sCi0gICAgICAgIHsweDAwMjMsICA2fSwgezB4MDA0NSwgIDd9LCB7MHgwMDUwLCAgN30sIHsweDAwMEIsICA0fSwKLSAgICAgICAgezB4MDAwQywgIDR9LCB7MHgwMDE1LCAgNX0sIHsweDAwMUEsICA1fSwgezB4MDAxQiwgIDV9LAotICAgICAgICB7MHgwMDI5LCAgNn0sIHsweDAwMzgsICA2fSwgezB4MDAzOSwgIDZ9LCB7MHgwMDNBLCAgNn0sCi0gICAgICAgIHsweDAwNTEsICA3fSwgezB4MDA3NiwgIDd9LCB7MHgwMDc3LCAgN30sIHsweDAwNzgsICA3fSwKLSAgICAgICAgezB4MDA3OSwgIDd9LCB7MHgwMDdBLCAgN30sIHsweDAwN0IsICA3fSwgezB4MDBGOCwgIDh9LAotICAgICAgICB7MHgwMTBGLCAgOX0sIHsweDAyMUQsIDEwfSwgezB4M0U0MCwgMTR9LCB7MHgzRTQxLCAxNH0sCi0gICAgICAgIHsweDNFNDIsIDE0fSwgezB4M0U0MywgMTR9LCB7MHgwM0U1LCAxMH0sIHsweDNFNDQsIDE0fSwKLSAgICAgICAgezB4MDFGMywgIDl9LCB7MHgzRTQ1LCAxNH0sIHsweDNFNDYsIDE0fSwgezB4M0U0NywgMTR9LAotICAgICAgICB7MHgwMEZBLCAgOH0sIHsweDNFNDgsIDE0fSwgezB4M0U0OSwgMTR9LCB7MHgzRTRBLCAxNH0sCi0gICAgICAgIHsweDNFNEIsIDE0fSwgezB4MDNFQywgMTB9LCB7MHgzRTRDLCAxNH0sIHsweDAwN0UsICA3fSwKLSAgICAgICAgezB4MDBGRSwgIDh9LCB7MHgwMEZGLCAgOH0sIHsweDAxRjcsICA5fSwgezB4M0U0RCwgMTR9LAotICAgICAgICB7MHgzRTRFLCAxNH0sIHsweDNFNEYsIDE0fSwgezB4M0VEMCwgMTR9LCB7MHgzRUQxLCAxNH0sCi0gICAgICAgIHsweDNFRDIsIDE0fSwgezB4M0VEMywgMTR9LCB7MHgzRUQ0LCAxNH0sIHsweDNFRDUsIDE0fSwKLSAgICAgICAgezB4MUY2QiwgMTN9LCB7MHgxRjZDLCAxM30sIHsweDFGNkQsIDEzfSwgezB4MUY2RSwgMTN9LAotICAgICAgICB7MHgxRjZGLCAxM30sCi0gICAgfSx7Ly8xCi0gICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwNCwgIDV9LCB7MHgwMDE0LCAgN30sIHsweDAwMEIsICA2fSwKLSAgICAgICAgezB4MDAwQywgIDZ9LCB7MHgwMDJBLCAgOH0sIHsweDAwMkIsICA4fSwgezB4MDAzNCwgIDh9LAotICAgICAgICB7MHgwRDQwLCAxNH0sIHsweDBENDEsIDE0fSwgezB4MDAxQiwgIDd9LCB7MHgwRDQyLCAxNH0sCi0gICAgICAgIHsweDBENDMsIDE0fSwgezB4MEQ0NCwgMTR9LCB7MHgwRDQ1LCAxNH0sIHsweDBENDYsIDE0fSwKLSAgICAgICAgezB4MDAwRSwgIDZ9LCB7MHgwMDNDLCAgOH0sIHsweDBENDcsIDE0fSwgezB4MDAzRCwgIDh9LAotICAgICAgICB7MHgwRDQ4LCAxNH0sIHsweDBENDksIDE0fSwgezB4MEQ0QSwgMTR9LCB7MHgwMDAxLCAgMn0sCi0gICAgICAgIHsweDAwMDQsICAzfSwgezB4MDAxNCwgIDV9LCB7MHgwMDBCLCAgNH0sIHsweDAwMEMsICA0fSwKLSAgICAgICAgezB4MDAwRCwgIDR9LCB7MHgwMDJBLCAgNn0sIHsweDAwMUYsICA3fSwgezB4MDA1NiwgIDd9LAotICAgICAgICB7MHgwMDU3LCAgN30sIHsweDAwNzAsICA3fSwgezB4MDBFMiwgIDh9LCB7MHgwMDcyLCAgN30sCi0gICAgICAgIHsweDAwM0EsICA2fSwgezB4MDAzQiwgIDZ9LCB7MHgwMDNDLCAgNn0sIHsweDAwM0QsICA2fSwKLSAgICAgICAgezB4MDBFMywgIDh9LCB7MHgwRDRCLCAxNH0sIHsweDAwRTYsICA4fSwgezB4MDBFNywgIDh9LAotICAgICAgICB7MHgwMEY4LCAgOH0sIHsweDBENEMsIDE0fSwgezB4MEQ0RCwgMTR9LCB7MHgwRDRFLCAxNH0sCi0gICAgICAgIHsweDAwRjksICA4fSwgezB4MEQ0RiwgMTR9LCB7MHgwRDUwLCAxNH0sIHsweDBENTEsIDE0fSwKLSAgICAgICAgezB4MDZBOSwgMTN9LCB7MHgwNkFBLCAxM30sIHsweDA2QUIsIDEzfSwgezB4MDZBQywgMTN9LAotICAgICAgICB7MHgwNkFELCAxM30sIHsweDA2QUUsIDEzfSwgezB4MDZBRiwgMTN9LCB7MHgwMDNGLCAgNn0sCi0gICAgICAgIHsweDA2QjAsIDEzfSwgezB4MDZCMSwgMTN9LCB7MHgwNkIyLCAxM30sIHsweDA2QjMsIDEzfSwKLSAgICAgICAgezB4MDZCNCwgMTN9LCB7MHgwMDdELCAgN30sIHsweDA2QjUsIDEzfSwgezB4MDZCNiwgMTN9LAotICAgICAgICB7MHgwNkI3LCAxM30sIHsweDA2QjgsIDEzfSwgezB4MDZCOSwgMTN9LCB7MHgwNkJBLCAxM30sCi0gICAgICAgIHsweDA2QkIsIDEzfSwgezB4MDZCQywgMTN9LCB7MHgwNkJELCAxM30sIHsweDA2QkUsIDEzfSwKLSAgICAgICAgezB4MDZCRiwgMTN9LAotICAgIH0sey8vMgotICAgICAgICB7MHgwMDAwLCAgMn0sIHsweDAwMDIsICAzfSwgezB4MDAwMywgIDN9LCB7MHgwMDA4LCAgNH0sCi0gICAgICAgIHsweDAwMTIsICA1fSwgezB4MDAxMywgIDV9LCB7MHgwMDI4LCAgNn0sIHsweDAwMjksICA2fSwKLSAgICAgICAgezB4MDA1NCwgIDd9LCB7MHgwMDU1LCAgN30sIHsweDAwNTYsICA3fSwgezB4MDBBRSwgIDh9LAotICAgICAgICB7MHgwMEFGLCAgOH0sIHsweDAwQjAsICA4fSwgezB4MDE2MiwgIDl9LCB7MHgwMkM2LCAxMH0sCi0gICAgICAgIHsweDAwMEMsICA0fSwgezB4MDAyRCwgIDZ9LCB7MHgwMEIyLCAgOH0sIHsweDAxNjYsICA5fSwKLSAgICAgICAgezB4MDAyRSwgIDZ9LCB7MHgwMTY3LCAgOX0sIHsweDAwQkMsICA4fSwgezB4MDAxQSwgIDV9LAotICAgICAgICB7MHgwMDM2LCAgNn0sIHsweDAwMzcsICA2fSwgezB4MDAzOCwgIDZ9LCB7MHgwMDVGLCAgN30sCi0gICAgICAgIHsweDAwNzIsICA3fSwgezB4MDA3MywgIDd9LCB7MHgwMDc0LCAgN30sIHsweDAwNzUsICA3fSwKLSAgICAgICAgezB4MDA3NiwgIDd9LCB7MHgwMDc3LCAgN30sIHsweDAwNzgsICA3fSwgezB4MDA3OSwgIDd9LAotICAgICAgICB7MHgwMDdBLCAgN30sIHsweDAwN0IsICA3fSwgezB4MDBCRCwgIDh9LCB7MHhCMUMwLCAxNn0sCi0gICAgICAgIHsweEIxQzEsIDE2fSwgezB4NThFMSwgMTV9LCB7MHgwQjFELCAxMn0sIHsweDU4RTIsIDE1fSwKLSAgICAgICAgezB4NThFMywgMTV9LCB7MHg1OEU0LCAxNX0sIHsweDAwRjgsICA4fSwgezB4MDNFNCwgMTB9LAotICAgICAgICB7MHgwMUYzLCAgOX0sIHsweDBCMUUsIDEyfSwgezB4NThFNSwgMTV9LCB7MHg1OEU2LCAxNX0sCi0gICAgICAgIHsweDAwRkEsICA4fSwgezB4NThFNywgMTV9LCB7MHg1OEY4LCAxNX0sIHsweDU4RjksIDE1fSwKLSAgICAgICAgezB4NThGQSwgMTV9LCB7MHgwMUY2LCAgOX0sIHsweDU4RkIsIDE1fSwgezB4MDA3RSwgIDd9LAotICAgICAgICB7MHgwMEZFLCAgOH0sIHsweDAwRkYsICA4fSwgezB4MDdDQSwgMTF9LCB7MHgwRjk2LCAxMn0sCi0gICAgICAgIHsweDU4RkMsIDE1fSwgezB4NThGRCwgMTV9LCB7MHg1OEZFLCAxNX0sIHsweDU4RkYsIDE1fSwKLSAgICAgICAgezB4N0NCOCwgMTV9LCB7MHg3Q0I5LCAxNX0sIHsweDdDQkEsIDE1fSwgezB4N0NCQiwgMTV9LAotICAgICAgICB7MHg3Q0JDLCAxNX0sIHsweDAxRjcsICA5fSwgezB4N0NCRCwgMTV9LCB7MHg3Q0JFLCAxNX0sCi0gICAgICAgIHsweDdDQkYsIDE1fSwKLSAgICB9LHsvLzMKLSAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDAyLCAgM30sIHsweDAwMDYsICA0fSwgezB4MDAwRSwgIDV9LAotICAgICAgICB7MHgwMDBGLCAgNX0sIHsweDAwMjAsICA2fSwgezB4MDAyMSwgIDZ9LCB7MHgwMDQ0LCAgN30sCi0gICAgICAgIHsweDAwNDUsICA3fSwgezB4MDA4QywgIDh9LCB7MHgwMDhELCAgOH0sIHsweDAxMUMsICA5fSwKLSAgICAgICAgezB4MDExRCwgIDl9LCB7MHgwMTFFLCAgOX0sIHsweDAyM0UsIDEwfSwgezB4MDIzRiwgMTB9LAotICAgICAgICB7MHgwMDA1LCAgM30sIHsweDAwMTIsICA1fSwgezB4MDA0QywgIDd9LCB7MHgwMDRELCAgN30sCi0gICAgICAgIHsweDAwMEMsICA0fSwgezB4MDA0RSwgIDd9LCB7MHgwMDFBLCAgNX0sIHsweDAwMzYsICA2fSwKLSAgICAgICAgezB4MDA0RiwgIDd9LCB7MHgwMDZFLCAgN30sIHsweDAwNkYsICA3fSwgezB4MDBFMCwgIDh9LAotICAgICAgICB7MHgwMEUxLCAgOH0sIHsweDAwRTIsICA4fSwgezB4MDBFMywgIDh9LCB7MHgwMEU0LCAgOH0sCi0gICAgICAgIHsweDAwRTUsICA4fSwgezB4MDFDQywgIDl9LCB7MHgwMEU3LCAgOH0sIHsweDAwRTgsICA4fSwKLSAgICAgICAgezB4MDBFOSwgIDh9LCB7MHgwMUNELCAgOX0sIHsweDA3NTAsIDExfSwgezB4MDNBOSwgMTB9LAotICAgICAgICB7MHgwNzUxLCAxMX0sIHsweDc1NDAsIDE1fSwgezB4MDNBQiwgMTB9LCB7MHg3NTQxLCAxNX0sCi0gICAgICAgIHsweDc1NDIsIDE1fSwgezB4NzU0MywgMTV9LCB7MHgwMUQ2LCAgOX0sIHsweDA3NTUsIDExfSwKLSAgICAgICAgezB4MDA3NiwgIDd9LCB7MHgwRUE5LCAxMn0sIHsweDc1NDQsIDE1fSwgezB4NzU0NSwgMTV9LAotICAgICAgICB7MHgwMDFFLCAgNX0sIHsweDAwNzcsICA3fSwgezB4MDBGOCwgIDh9LCB7MHgwM0FFLCAxMH0sCi0gICAgICAgIHsweDA3NUUsIDExfSwgezB4MDA3RCwgIDd9LCB7MHgwM0U0LCAxMH0sIHsweDAwRkMsICA4fSwKLSAgICAgICAgezB4MDBGRCwgIDh9LCB7MHgwM0U1LCAxMH0sIHsweDAzRTYsIDEwfSwgezB4MEVCRSwgMTJ9LAotICAgICAgICB7MHg3NTQ2LCAxNX0sIHsweDA3Q0UsIDExfSwgezB4NzU0NywgMTV9LCB7MHg3NUY4LCAxNX0sCi0gICAgICAgIHsweDc1RjksIDE1fSwgezB4NzVGQSwgMTV9LCB7MHg3NUZCLCAxNX0sIHsweDc1RkMsIDE1fSwKLSAgICAgICAgezB4NzVGRCwgMTV9LCB7MHgwMDdGLCAgN30sIHsweDNBRkYsIDE0fSwgezB4MEY5RSwgMTJ9LAotICAgICAgICB7MHgwRjlGLCAxMn0sCi0gICAgfSx7Ly80Ci0gICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDAzLCAgNH0sIHsweDAwMDgsICA1fSwKLSAgICAgICAgezB4MDAxMiwgIDZ9LCB7MHgwMDEzLCAgNn0sIHsweDAwMTQsICA2fSwgezB4MDAyQSwgIDd9LAotICAgICAgICB7MHgwMDE2LCAgNn0sIHsweDAwMkIsICA3fSwgezB4MDA1QywgIDh9LCB7MHgwMDVELCAgOH0sCi0gICAgICAgIHsweDAwNUUsICA4fSwgezB4MDBCRSwgIDl9LCB7MHgwMEJGLCAgOX0sIHsweDAwNjAsICA4fSwKLSAgICAgICAgezB4MDAwNywgIDR9LCB7MHgwMDBELCAgNX0sIHsweDAwMTksICA2fSwgezB4MDAyMCwgIDZ9LAotICAgICAgICB7MHgwMDA5LCAgNH0sIHsweDAwMjEsICA2fSwgezB4MDAxMSwgIDV9LCB7MHgwMDE0LCAgNX0sCi0gICAgICAgIHsweDAwMkEsICA2fSwgezB4MDAyQiwgIDZ9LCB7MHgwMDJDLCAgNn0sIHsweDAwMkQsICA2fSwKLSAgICAgICAgezB4MDAyRSwgIDZ9LCB7MHgwMDJGLCAgNn0sIHsweDAwMzAsICA2fSwgezB4MDAzMSwgIDd9LAotICAgICAgICB7MHgwMDYyLCAgN30sIHsweDAwNjMsICA3fSwgezB4MDA2NCwgIDd9LCB7MHgwMDY1LCAgN30sCi0gICAgICAgIHsweDAwNjYsICA3fSwgezB4MDA2MSwgIDh9LCB7MHgwNjcwLCAxMX0sIHsweDAwNjgsICA3fSwKLSAgICAgICAgezB4MDA2OSwgIDd9LCB7MHgwMENGLCAgOH0sIHsweDAxOUQsICA5fSwgezB4MDFBOCwgIDl9LAotICAgICAgICB7MHgwMUE5LCAgOX0sIHsweDAzMzksIDEwfSwgezB4MDFBQSwgIDl9LCB7MHgwMzU2LCAxMH0sCi0gICAgICAgIHsweDAwMzYsICA2fSwgezB4MDBENiwgIDh9LCB7MHg2NzEwLCAxNX0sIHsweDY3MTEsIDE1fSwKLSAgICAgICAgezB4MDAwRSwgIDR9LCB7MHgwMDZFLCAgN30sIHsweDAxQUUsICA5fSwgezB4NjcxMiwgMTV9LAotICAgICAgICB7MHg2NzEzLCAxNX0sIHsweDAwM0MsICA2fSwgezB4MDM1NywgMTB9LCB7MHgwMDZGLCAgN30sCi0gICAgICAgIHsweDAwRjQsICA4fSwgezB4MDBGNSwgIDh9LCB7MHgwMzVFLCAxMH0sIHsweDAxRUMsICA5fSwKLSAgICAgICAgezB4NjcxNCwgMTV9LCB7MHgwMUVELCAgOX0sIHsweDAzNUYsIDEwfSwgezB4MDNEQywgMTB9LAotICAgICAgICB7MHgwM0RELCAxMH0sIHsweDY3MTUsIDE1fSwgezB4MzM4QiwgMTR9LCB7MHgzMzhDLCAxNH0sCi0gICAgICAgIHsweDMzOEQsIDE0fSwgezB4MDAxRiwgIDV9LCB7MHgwMUVGLCAgOX0sIHsweDMzOEUsIDE0fSwKLSAgICAgICAgezB4MzM4RiwgMTR9LAotICAgIH0sey8vNQotICAgICAgICB7MHgwMDAwLCAgMn0sIHsweDAwMDQsICA0fSwgezB4MDAwQSwgIDV9LCB7MHgwMDBCLCAgNX0sCi0gICAgICAgIHsweDAwMTgsICA2fSwgezB4MDAxOSwgIDZ9LCB7MHgwMDM0LCAgN30sIHsweDAwNkEsICA4fSwKLSAgICAgICAgezB4MDA2QiwgIDh9LCB7MHgwMDZDLCAgOH0sIHsweDAwREEsICA5fSwgezB4MDM2QywgMTF9LAotICAgICAgICB7MHgwMDZFLCAgOH0sIHsweDAxQjcsIDEwfSwgezB4MDM2RCwgMTF9LCB7MHgzNzgwLCAxNX0sCi0gICAgICAgIHsweDAwMDQsICAzfSwgezB4MDAwRSwgIDV9LCB7MHgwMDFFLCAgNn0sIHsweDAwM0UsICA3fSwKLSAgICAgICAgezB4MDAwQSwgIDR9LCB7MHgwMDJDLCAgNn0sIHsweDAwMTcsICA1fSwgezB4MDAyRCwgIDZ9LAotICAgICAgICB7MHgwMDNGLCAgN30sIHsweDAwQzAsICA4fSwgezB4MDA2MSwgIDd9LCB7MHgwMEMxLCAgOH0sCi0gICAgICAgIHsweDAwNjIsICA3fSwgezB4MDBDNiwgIDh9LCB7MHgwMDY0LCAgN30sIHsweDAwQzcsICA4fSwKLSAgICAgICAgezB4MDBDQSwgIDh9LCB7MHgwMERGLCAgOX0sIHsweDAxOTYsICA5fSwgezB4MDE5NywgIDl9LAotICAgICAgICB7MHgwMTk4LCAgOX0sIHsweDAxOTksICA5fSwgezB4MDM3OSwgMTF9LCB7MHgwMTlBLCAgOX0sCi0gICAgICAgIHsweDAxQkQsIDEwfSwgezB4MDY2QywgMTF9LCB7MHgzNzgxLCAxNX0sIHsweDAzMzcsIDEwfSwKLSAgICAgICAgezB4MDY2RCwgMTF9LCB7MHgwNjcwLCAxMX0sIHsweDAzMzksIDEwfSwgezB4MDY3MSwgMTF9LAotICAgICAgICB7MHgwMDM0LCAgNn0sIHsweDAwQ0YsICA4fSwgezB4Mzc4MiwgMTV9LCB7MHgzNzgzLCAxNX0sCi0gICAgICAgIHsweDAwMEUsICA0fSwgezB4MDAxQiwgIDV9LCB7MHgwMDZBLCAgN30sIHsweDAwNkIsICA3fSwKLSAgICAgICAgezB4MDE5RCwgIDl9LCB7MHgwMDNDLCAgNn0sIHsweDAwRjQsICA4fSwgezB4MDBGNSwgIDh9LAotICAgICAgICB7MHgwM0Q4LCAxMH0sIHsweDA3QjIsIDExfSwgezB4Mzc4NCwgMTV9LCB7MHgwM0RBLCAxMH0sCi0gICAgICAgIHsweDM3ODUsIDE1fSwgezB4MDNEQiwgMTB9LCB7MHgwM0RDLCAxMH0sIHsweDM3ODYsIDE1fSwKLSAgICAgICAgezB4Mzc4NywgMTV9LCB7MHgxQkM0LCAxNH0sIHsweDFCQzUsIDE0fSwgezB4MUJDNiwgMTR9LAotICAgICAgICB7MHgxQkM3LCAxNH0sIHsweDAwMUYsICA1fSwgezB4MDNERCwgMTB9LCB7MHgwN0IzLCAxMX0sCi0gICAgICAgIHsweDAxRUYsICA5fSwKLSAgICB9LHsvLzYKLSAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDA0LCAgNH0sIHsweDAwMEEsICA1fSwgezB4MDAxNiwgIDZ9LAotICAgICAgICB7MHgwMDE3LCAgNn0sIHsweDAwNjAsICA4fSwgezB4MDBDMiwgIDl9LCB7MHgwMTg2LCAxMH0sCi0gICAgICAgIHsweDAxODcsIDEwfSwgezB4MDBDNCwgIDl9LCB7MHgzMTQwLCAxNX0sIHsweDMxNDEsIDE1fSwKLSAgICAgICAgezB4MDE4QiwgMTB9LCB7MHgzMTQyLCAxNX0sIHsweDAxOEMsIDEwfSwgezB4MzE0MywgMTV9LAotICAgICAgICB7MHgwMDA3LCAgNH0sIHsweDAwMEQsICA1fSwgezB4MDA2NCwgIDh9LCB7MHgwMDY1LCAgOH0sCi0gICAgICAgIHsweDAwMTAsICA1fSwgezB4MDBDNywgIDl9LCB7MHgwMDY2LCAgOH0sIHsweDAwMDUsICAzfSwKLSAgICAgICAgezB4MDAwNiwgIDN9LCB7MHgwMDA5LCAgNH0sIHsweDAwMTEsICA1fSwgezB4MDAzOCwgIDZ9LAotICAgICAgICB7MHgwMDM5LCAgNn0sIHsweDAwNzQsICA3fSwgezB4MDA3NSwgIDd9LCB7MHgwMDc2LCAgN30sCi0gICAgICAgIHsweDAwNjcsICA4fSwgezB4MDBFRSwgIDh9LCB7MHgwMURFLCAgOX0sIHsweDAwRjAsICA4fSwKLSAgICAgICAgezB4MDE4RCwgMTB9LCB7MHgzMTQ0LCAxNX0sIHsweDAxREYsICA5fSwgezB4MDAzRCwgIDZ9LAotICAgICAgICB7MHgwMDNFLCAgNn0sIHsweDAxRTIsICA5fSwgezB4MDNDNiwgMTB9LCB7MHgwMEYyLCAgOH0sCi0gICAgICAgIHsweDAwRjMsICA4fSwgezB4MDNDNywgMTB9LCB7MHgzMTQ1LCAxNX0sIHsweDMxNDYsIDE1fSwKLSAgICAgICAgezB4MDFGOCwgIDl9LCB7MHgzMTQ3LCAxNX0sIHsweDMxNDgsIDE1fSwgezB4MzE0OSwgMTV9LAotICAgICAgICB7MHgwMEZELCAgOH0sIHsweDMxNEEsIDE1fSwgezB4MzE0QiwgMTV9LCB7MHgzMTRDLCAxNX0sCi0gICAgICAgIHsweDMxNEQsIDE1fSwgezB4MDFGOSwgIDl9LCB7MHgzMTRFLCAxNX0sIHsweDAxRkMsICA5fSwKLSAgICAgICAgezB4MzE0RiwgMTV9LCB7MHgzMTUwLCAxNX0sIHsweDMxNTEsIDE1fSwgezB4MzE1MiwgMTV9LAotICAgICAgICB7MHgzMTUzLCAxNX0sIHsweDAzRkEsIDEwfSwgezB4MDNGQiwgMTB9LCB7MHgzMTU0LCAxNX0sCi0gICAgICAgIHsweDMxNTUsIDE1fSwgezB4MzE1NiwgMTV9LCB7MHgzMTU3LCAxNX0sIHsweDMxNTgsIDE1fSwKLSAgICAgICAgezB4MzE1OSwgMTV9LCB7MHgwMEZGLCAgOH0sIHsweDE4QUQsIDE0fSwgezB4MThBRSwgMTR9LAotICAgICAgICB7MHgxOEFGLCAxNH0sCi0gICAgfSx7Ly83Ci0gICAgICAgIHsweDAwMDAsICA0fSwgezB4MDA4MCwgMTF9LCB7MHgwMDgxLCAxMX0sIHsweDAwODIsIDExfSwKLSAgICAgICAgezB4MDA4MywgMTF9LCB7MHgwMDg0LCAxMX0sIHsweDAwODUsIDExfSwgezB4MDA4NiwgMTF9LAotICAgICAgICB7MHgwMDg3LCAxMX0sIHsweDAwODgsIDExfSwgezB4MDA4OSwgMTF9LCB7MHgwMDhBLCAxMX0sCi0gICAgICAgIHsweDAwOEIsIDExfSwgezB4MDA4QywgMTF9LCB7MHgwMDhELCAxMX0sIHsweDAwOEUsIDExfSwKLSAgICAgICAgezB4MDA4RiwgMTF9LCB7MHgwMDQ4LCAxMH0sIHsweDAwNDksIDEwfSwgezB4MDA0QSwgMTB9LAotICAgICAgICB7MHgwMDRCLCAxMH0sIHsweDAwNEMsIDEwfSwgezB4MDA0RCwgMTB9LCB7MHgwMDAxLCAgMX0sCi0gICAgICAgIHsweDAwMDEsICAyfSwgezB4MDA0RSwgMTB9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDMsICA0fSwKLSAgICAgICAgezB4MDA0RiwgMTB9LCB7MHgwMDUwLCAxMH0sIHsweDAwNTEsIDEwfSwgezB4MDA1MiwgMTB9LAotICAgICAgICB7MHgwMDUzLCAxMH0sIHsweDAwNTQsIDEwfSwgezB4MDA1NSwgMTB9LCB7MHgwMDU2LCAxMH0sCi0gICAgICAgIHsweDAwNTcsIDEwfSwgezB4MDA1OCwgMTB9LCB7MHgwMDU5LCAxMH0sIHsweDAwNUEsIDEwfSwKLSAgICAgICAgezB4MDA1QiwgMTB9LCB7MHgwMDVDLCAxMH0sIHsweDAwNUQsIDEwfSwgezB4MDA1RSwgMTB9LAotICAgICAgICB7MHgwMDVGLCAxMH0sIHsweDAwNjAsIDEwfSwgezB4MDA2MSwgMTB9LCB7MHgwMDYyLCAxMH0sCi0gICAgICAgIHsweDAwNjMsIDEwfSwgezB4MDA2NCwgMTB9LCB7MHgwMDY1LCAxMH0sIHsweDAwNjYsIDEwfSwKLSAgICAgICAgezB4MDA2NywgMTB9LCB7MHgwMDY4LCAxMH0sIHsweDAwNjksIDEwfSwgezB4MDA2QSwgMTB9LAotICAgICAgICB7MHgwMDZCLCAxMH0sIHsweDAwNkMsIDEwfSwgezB4MDA2RCwgMTB9LCB7MHgwMDZFLCAxMH0sCi0gICAgICAgIHsweDAwNkYsIDEwfSwgezB4MDA3MCwgMTB9LCB7MHgwMDcxLCAxMH0sIHsweDAwNzIsIDEwfSwKLSAgICAgICAgezB4MDA3MywgMTB9LCB7MHgwMDc0LCAxMH0sIHsweDAwNzUsIDEwfSwgezB4MDA3NiwgMTB9LAotICAgICAgICB7MHgwMDc3LCAxMH0sIHsweDAwNzgsIDEwfSwgezB4MDA3OSwgMTB9LCB7MHgwMDdBLCAxMH0sCi0gICAgICAgIHsweDAwN0IsIDEwfSwgezB4MDA3QywgMTB9LCB7MHgwMDdELCAxMH0sIHsweDAwN0UsIDEwfSwKLSAgICAgICAgezB4MDA3RiwgMTB9LAotICAgIH0KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9hYzBfbG93cXVhbnRfdGFibGVbOF1bNzddWzJdID0geworICAgIHsgLy8gMAorICAgICAgICB7IDB4MDAwMCwgIDIgfSwgeyAweDAwMDIsICAzIH0sIHsgMHgwMDA2LCAgNCB9LCB7IDB4MDAwRSwgIDUgfSwKKyAgICAgICAgeyAweDAwMUUsICA2IH0sIHsgMHgwMDNFLCAgNyB9LCB7IDB4MDAzRiwgIDcgfSwgeyAweDAwNDAsICA3IH0sCisgICAgICAgIHsgMHgwMTA0LCAgOSB9LCB7IDB4MDA4MywgIDggfSwgeyAweDAwODQsICA4IH0sIHsgMHgwMDg1LCAgOCB9LAorICAgICAgICB7IDB4MDIwQSwgMTAgfSwgeyAweDAyMEIsIDEwIH0sIHsgMHgwMjE4LCAxMCB9LCB7IDB4MDIxOSwgMTAgfSwKKyAgICAgICAgeyAweDAwMDksICA0IH0sIHsgMHgwMDQ0LCAgNyB9LCB7IDB4MDEwRCwgIDkgfSwgeyAweDAyMUMsIDEwIH0sCisgICAgICAgIHsgMHgwMDIzLCAgNiB9LCB7IDB4MDA0NSwgIDcgfSwgeyAweDAwNTAsICA3IH0sIHsgMHgwMDBCLCAgNCB9LAorICAgICAgICB7IDB4MDAwQywgIDQgfSwgeyAweDAwMTUsICA1IH0sIHsgMHgwMDFBLCAgNSB9LCB7IDB4MDAxQiwgIDUgfSwKKyAgICAgICAgeyAweDAwMjksICA2IH0sIHsgMHgwMDM4LCAgNiB9LCB7IDB4MDAzOSwgIDYgfSwgeyAweDAwM0EsICA2IH0sCisgICAgICAgIHsgMHgwMDUxLCAgNyB9LCB7IDB4MDA3NiwgIDcgfSwgeyAweDAwNzcsICA3IH0sIHsgMHgwMDc4LCAgNyB9LAorICAgICAgICB7IDB4MDA3OSwgIDcgfSwgeyAweDAwN0EsICA3IH0sIHsgMHgwMDdCLCAgNyB9LCB7IDB4MDBGOCwgIDggfSwKKyAgICAgICAgeyAweDAxMEYsICA5IH0sIHsgMHgwMjFELCAxMCB9LCB7IDB4M0U0MCwgMTQgfSwgeyAweDNFNDEsIDE0IH0sCisgICAgICAgIHsgMHgzRTQyLCAxNCB9LCB7IDB4M0U0MywgMTQgfSwgeyAweDAzRTUsIDEwIH0sIHsgMHgzRTQ0LCAxNCB9LAorICAgICAgICB7IDB4MDFGMywgIDkgfSwgeyAweDNFNDUsIDE0IH0sIHsgMHgzRTQ2LCAxNCB9LCB7IDB4M0U0NywgMTQgfSwKKyAgICAgICAgeyAweDAwRkEsICA4IH0sIHsgMHgzRTQ4LCAxNCB9LCB7IDB4M0U0OSwgMTQgfSwgeyAweDNFNEEsIDE0IH0sCisgICAgICAgIHsgMHgzRTRCLCAxNCB9LCB7IDB4MDNFQywgMTAgfSwgeyAweDNFNEMsIDE0IH0sIHsgMHgwMDdFLCAgNyB9LAorICAgICAgICB7IDB4MDBGRSwgIDggfSwgeyAweDAwRkYsICA4IH0sIHsgMHgwMUY3LCAgOSB9LCB7IDB4M0U0RCwgMTQgfSwKKyAgICAgICAgeyAweDNFNEUsIDE0IH0sIHsgMHgzRTRGLCAxNCB9LCB7IDB4M0VEMCwgMTQgfSwgeyAweDNFRDEsIDE0IH0sCisgICAgICAgIHsgMHgzRUQyLCAxNCB9LCB7IDB4M0VEMywgMTQgfSwgeyAweDNFRDQsIDE0IH0sIHsgMHgzRUQ1LCAxNCB9LAorICAgICAgICB7IDB4MUY2QiwgMTMgfSwgeyAweDFGNkMsIDEzIH0sIHsgMHgxRjZELCAxMyB9LCB7IDB4MUY2RSwgMTMgfSwKKyAgICAgICAgeyAweDFGNkYsIDEzIH0sCisgICAgfSwKKyAgICB7IC8vIDEKKyAgICAgICAgeyAweDAwMDAsICAzIH0sIHsgMHgwMDA0LCAgNSB9LCB7IDB4MDAxNCwgIDcgfSwgeyAweDAwMEIsICA2IH0sCisgICAgICAgIHsgMHgwMDBDLCAgNiB9LCB7IDB4MDAyQSwgIDggfSwgeyAweDAwMkIsICA4IH0sIHsgMHgwMDM0LCAgOCB9LAorICAgICAgICB7IDB4MEQ0MCwgMTQgfSwgeyAweDBENDEsIDE0IH0sIHsgMHgwMDFCLCAgNyB9LCB7IDB4MEQ0MiwgMTQgfSwKKyAgICAgICAgeyAweDBENDMsIDE0IH0sIHsgMHgwRDQ0LCAxNCB9LCB7IDB4MEQ0NSwgMTQgfSwgeyAweDBENDYsIDE0IH0sCisgICAgICAgIHsgMHgwMDBFLCAgNiB9LCB7IDB4MDAzQywgIDggfSwgeyAweDBENDcsIDE0IH0sIHsgMHgwMDNELCAgOCB9LAorICAgICAgICB7IDB4MEQ0OCwgMTQgfSwgeyAweDBENDksIDE0IH0sIHsgMHgwRDRBLCAxNCB9LCB7IDB4MDAwMSwgIDIgfSwKKyAgICAgICAgeyAweDAwMDQsICAzIH0sIHsgMHgwMDE0LCAgNSB9LCB7IDB4MDAwQiwgIDQgfSwgeyAweDAwMEMsICA0IH0sCisgICAgICAgIHsgMHgwMDBELCAgNCB9LCB7IDB4MDAyQSwgIDYgfSwgeyAweDAwMUYsICA3IH0sIHsgMHgwMDU2LCAgNyB9LAorICAgICAgICB7IDB4MDA1NywgIDcgfSwgeyAweDAwNzAsICA3IH0sIHsgMHgwMEUyLCAgOCB9LCB7IDB4MDA3MiwgIDcgfSwKKyAgICAgICAgeyAweDAwM0EsICA2IH0sIHsgMHgwMDNCLCAgNiB9LCB7IDB4MDAzQywgIDYgfSwgeyAweDAwM0QsICA2IH0sCisgICAgICAgIHsgMHgwMEUzLCAgOCB9LCB7IDB4MEQ0QiwgMTQgfSwgeyAweDAwRTYsICA4IH0sIHsgMHgwMEU3LCAgOCB9LAorICAgICAgICB7IDB4MDBGOCwgIDggfSwgeyAweDBENEMsIDE0IH0sIHsgMHgwRDRELCAxNCB9LCB7IDB4MEQ0RSwgMTQgfSwKKyAgICAgICAgeyAweDAwRjksICA4IH0sIHsgMHgwRDRGLCAxNCB9LCB7IDB4MEQ1MCwgMTQgfSwgeyAweDBENTEsIDE0IH0sCisgICAgICAgIHsgMHgwNkE5LCAxMyB9LCB7IDB4MDZBQSwgMTMgfSwgeyAweDA2QUIsIDEzIH0sIHsgMHgwNkFDLCAxMyB9LAorICAgICAgICB7IDB4MDZBRCwgMTMgfSwgeyAweDA2QUUsIDEzIH0sIHsgMHgwNkFGLCAxMyB9LCB7IDB4MDAzRiwgIDYgfSwKKyAgICAgICAgeyAweDA2QjAsIDEzIH0sIHsgMHgwNkIxLCAxMyB9LCB7IDB4MDZCMiwgMTMgfSwgeyAweDA2QjMsIDEzIH0sCisgICAgICAgIHsgMHgwNkI0LCAxMyB9LCB7IDB4MDA3RCwgIDcgfSwgeyAweDA2QjUsIDEzIH0sIHsgMHgwNkI2LCAxMyB9LAorICAgICAgICB7IDB4MDZCNywgMTMgfSwgeyAweDA2QjgsIDEzIH0sIHsgMHgwNkI5LCAxMyB9LCB7IDB4MDZCQSwgMTMgfSwKKyAgICAgICAgeyAweDA2QkIsIDEzIH0sIHsgMHgwNkJDLCAxMyB9LCB7IDB4MDZCRCwgMTMgfSwgeyAweDA2QkUsIDEzIH0sCisgICAgICAgIHsgMHgwNkJGLCAxMyB9LAorICAgIH0sCisgICAgeyAvLyAyCisgICAgICAgIHsgMHgwMDAwLCAgMiB9LCB7IDB4MDAwMiwgIDMgfSwgeyAweDAwMDMsICAzIH0sIHsgMHgwMDA4LCAgNCB9LAorICAgICAgICB7IDB4MDAxMiwgIDUgfSwgeyAweDAwMTMsICA1IH0sIHsgMHgwMDI4LCAgNiB9LCB7IDB4MDAyOSwgIDYgfSwKKyAgICAgICAgeyAweDAwNTQsICA3IH0sIHsgMHgwMDU1LCAgNyB9LCB7IDB4MDA1NiwgIDcgfSwgeyAweDAwQUUsICA4IH0sCisgICAgICAgIHsgMHgwMEFGLCAgOCB9LCB7IDB4MDBCMCwgIDggfSwgeyAweDAxNjIsICA5IH0sIHsgMHgwMkM2LCAxMCB9LAorICAgICAgICB7IDB4MDAwQywgIDQgfSwgeyAweDAwMkQsICA2IH0sIHsgMHgwMEIyLCAgOCB9LCB7IDB4MDE2NiwgIDkgfSwKKyAgICAgICAgeyAweDAwMkUsICA2IH0sIHsgMHgwMTY3LCAgOSB9LCB7IDB4MDBCQywgIDggfSwgeyAweDAwMUEsICA1IH0sCisgICAgICAgIHsgMHgwMDM2LCAgNiB9LCB7IDB4MDAzNywgIDYgfSwgeyAweDAwMzgsICA2IH0sIHsgMHgwMDVGLCAgNyB9LAorICAgICAgICB7IDB4MDA3MiwgIDcgfSwgeyAweDAwNzMsICA3IH0sIHsgMHgwMDc0LCAgNyB9LCB7IDB4MDA3NSwgIDcgfSwKKyAgICAgICAgeyAweDAwNzYsICA3IH0sIHsgMHgwMDc3LCAgNyB9LCB7IDB4MDA3OCwgIDcgfSwgeyAweDAwNzksICA3IH0sCisgICAgICAgIHsgMHgwMDdBLCAgNyB9LCB7IDB4MDA3QiwgIDcgfSwgeyAweDAwQkQsICA4IH0sIHsgMHhCMUMwLCAxNiB9LAorICAgICAgICB7IDB4QjFDMSwgMTYgfSwgeyAweDU4RTEsIDE1IH0sIHsgMHgwQjFELCAxMiB9LCB7IDB4NThFMiwgMTUgfSwKKyAgICAgICAgeyAweDU4RTMsIDE1IH0sIHsgMHg1OEU0LCAxNSB9LCB7IDB4MDBGOCwgIDggfSwgeyAweDAzRTQsIDEwIH0sCisgICAgICAgIHsgMHgwMUYzLCAgOSB9LCB7IDB4MEIxRSwgMTIgfSwgeyAweDU4RTUsIDE1IH0sIHsgMHg1OEU2LCAxNSB9LAorICAgICAgICB7IDB4MDBGQSwgIDggfSwgeyAweDU4RTcsIDE1IH0sIHsgMHg1OEY4LCAxNSB9LCB7IDB4NThGOSwgMTUgfSwKKyAgICAgICAgeyAweDU4RkEsIDE1IH0sIHsgMHgwMUY2LCAgOSB9LCB7IDB4NThGQiwgMTUgfSwgeyAweDAwN0UsICA3IH0sCisgICAgICAgIHsgMHgwMEZFLCAgOCB9LCB7IDB4MDBGRiwgIDggfSwgeyAweDA3Q0EsIDExIH0sIHsgMHgwRjk2LCAxMiB9LAorICAgICAgICB7IDB4NThGQywgMTUgfSwgeyAweDU4RkQsIDE1IH0sIHsgMHg1OEZFLCAxNSB9LCB7IDB4NThGRiwgMTUgfSwKKyAgICAgICAgeyAweDdDQjgsIDE1IH0sIHsgMHg3Q0I5LCAxNSB9LCB7IDB4N0NCQSwgMTUgfSwgeyAweDdDQkIsIDE1IH0sCisgICAgICAgIHsgMHg3Q0JDLCAxNSB9LCB7IDB4MDFGNywgIDkgfSwgeyAweDdDQkQsIDE1IH0sIHsgMHg3Q0JFLCAxNSB9LAorICAgICAgICB7IDB4N0NCRiwgMTUgfSwKKyAgICB9LAorICAgIHsgLy8gMworICAgICAgICB7IDB4MDAwMCwgIDIgfSwgeyAweDAwMDIsICAzIH0sIHsgMHgwMDA2LCAgNCB9LCB7IDB4MDAwRSwgIDUgfSwKKyAgICAgICAgeyAweDAwMEYsICA1IH0sIHsgMHgwMDIwLCAgNiB9LCB7IDB4MDAyMSwgIDYgfSwgeyAweDAwNDQsICA3IH0sCisgICAgICAgIHsgMHgwMDQ1LCAgNyB9LCB7IDB4MDA4QywgIDggfSwgeyAweDAwOEQsICA4IH0sIHsgMHgwMTFDLCAgOSB9LAorICAgICAgICB7IDB4MDExRCwgIDkgfSwgeyAweDAxMUUsICA5IH0sIHsgMHgwMjNFLCAxMCB9LCB7IDB4MDIzRiwgMTAgfSwKKyAgICAgICAgeyAweDAwMDUsICAzIH0sIHsgMHgwMDEyLCAgNSB9LCB7IDB4MDA0QywgIDcgfSwgeyAweDAwNEQsICA3IH0sCisgICAgICAgIHsgMHgwMDBDLCAgNCB9LCB7IDB4MDA0RSwgIDcgfSwgeyAweDAwMUEsICA1IH0sIHsgMHgwMDM2LCAgNiB9LAorICAgICAgICB7IDB4MDA0RiwgIDcgfSwgeyAweDAwNkUsICA3IH0sIHsgMHgwMDZGLCAgNyB9LCB7IDB4MDBFMCwgIDggfSwKKyAgICAgICAgeyAweDAwRTEsICA4IH0sIHsgMHgwMEUyLCAgOCB9LCB7IDB4MDBFMywgIDggfSwgeyAweDAwRTQsICA4IH0sCisgICAgICAgIHsgMHgwMEU1LCAgOCB9LCB7IDB4MDFDQywgIDkgfSwgeyAweDAwRTcsICA4IH0sIHsgMHgwMEU4LCAgOCB9LAorICAgICAgICB7IDB4MDBFOSwgIDggfSwgeyAweDAxQ0QsICA5IH0sIHsgMHgwNzUwLCAxMSB9LCB7IDB4MDNBOSwgMTAgfSwKKyAgICAgICAgeyAweDA3NTEsIDExIH0sIHsgMHg3NTQwLCAxNSB9LCB7IDB4MDNBQiwgMTAgfSwgeyAweDc1NDEsIDE1IH0sCisgICAgICAgIHsgMHg3NTQyLCAxNSB9LCB7IDB4NzU0MywgMTUgfSwgeyAweDAxRDYsICA5IH0sIHsgMHgwNzU1LCAxMSB9LAorICAgICAgICB7IDB4MDA3NiwgIDcgfSwgeyAweDBFQTksIDEyIH0sIHsgMHg3NTQ0LCAxNSB9LCB7IDB4NzU0NSwgMTUgfSwKKyAgICAgICAgeyAweDAwMUUsICA1IH0sIHsgMHgwMDc3LCAgNyB9LCB7IDB4MDBGOCwgIDggfSwgeyAweDAzQUUsIDEwIH0sCisgICAgICAgIHsgMHgwNzVFLCAxMSB9LCB7IDB4MDA3RCwgIDcgfSwgeyAweDAzRTQsIDEwIH0sIHsgMHgwMEZDLCAgOCB9LAorICAgICAgICB7IDB4MDBGRCwgIDggfSwgeyAweDAzRTUsIDEwIH0sIHsgMHgwM0U2LCAxMCB9LCB7IDB4MEVCRSwgMTIgfSwKKyAgICAgICAgeyAweDc1NDYsIDE1IH0sIHsgMHgwN0NFLCAxMSB9LCB7IDB4NzU0NywgMTUgfSwgeyAweDc1RjgsIDE1IH0sCisgICAgICAgIHsgMHg3NUY5LCAxNSB9LCB7IDB4NzVGQSwgMTUgfSwgeyAweDc1RkIsIDE1IH0sIHsgMHg3NUZDLCAxNSB9LAorICAgICAgICB7IDB4NzVGRCwgMTUgfSwgeyAweDAwN0YsICA3IH0sIHsgMHgzQUZGLCAxNCB9LCB7IDB4MEY5RSwgMTIgfSwKKyAgICAgICAgeyAweDBGOUYsIDEyIH0sCisgICAgfSwKKyAgICB7IC8vIDQKKyAgICAgICAgeyAweDAwMDAsICAzIH0sIHsgMHgwMDAyLCAgNCB9LCB7IDB4MDAwMywgIDQgfSwgeyAweDAwMDgsICA1IH0sCisgICAgICAgIHsgMHgwMDEyLCAgNiB9LCB7IDB4MDAxMywgIDYgfSwgeyAweDAwMTQsICA2IH0sIHsgMHgwMDJBLCAgNyB9LAorICAgICAgICB7IDB4MDAxNiwgIDYgfSwgeyAweDAwMkIsICA3IH0sIHsgMHgwMDVDLCAgOCB9LCB7IDB4MDA1RCwgIDggfSwKKyAgICAgICAgeyAweDAwNUUsICA4IH0sIHsgMHgwMEJFLCAgOSB9LCB7IDB4MDBCRiwgIDkgfSwgeyAweDAwNjAsICA4IH0sCisgICAgICAgIHsgMHgwMDA3LCAgNCB9LCB7IDB4MDAwRCwgIDUgfSwgeyAweDAwMTksICA2IH0sIHsgMHgwMDIwLCAgNiB9LAorICAgICAgICB7IDB4MDAwOSwgIDQgfSwgeyAweDAwMjEsICA2IH0sIHsgMHgwMDExLCAgNSB9LCB7IDB4MDAxNCwgIDUgfSwKKyAgICAgICAgeyAweDAwMkEsICA2IH0sIHsgMHgwMDJCLCAgNiB9LCB7IDB4MDAyQywgIDYgfSwgeyAweDAwMkQsICA2IH0sCisgICAgICAgIHsgMHgwMDJFLCAgNiB9LCB7IDB4MDAyRiwgIDYgfSwgeyAweDAwMzAsICA2IH0sIHsgMHgwMDMxLCAgNyB9LAorICAgICAgICB7IDB4MDA2MiwgIDcgfSwgeyAweDAwNjMsICA3IH0sIHsgMHgwMDY0LCAgNyB9LCB7IDB4MDA2NSwgIDcgfSwKKyAgICAgICAgeyAweDAwNjYsICA3IH0sIHsgMHgwMDYxLCAgOCB9LCB7IDB4MDY3MCwgMTEgfSwgeyAweDAwNjgsICA3IH0sCisgICAgICAgIHsgMHgwMDY5LCAgNyB9LCB7IDB4MDBDRiwgIDggfSwgeyAweDAxOUQsICA5IH0sIHsgMHgwMUE4LCAgOSB9LAorICAgICAgICB7IDB4MDFBOSwgIDkgfSwgeyAweDAzMzksIDEwIH0sIHsgMHgwMUFBLCAgOSB9LCB7IDB4MDM1NiwgMTAgfSwKKyAgICAgICAgeyAweDAwMzYsICA2IH0sIHsgMHgwMEQ2LCAgOCB9LCB7IDB4NjcxMCwgMTUgfSwgeyAweDY3MTEsIDE1IH0sCisgICAgICAgIHsgMHgwMDBFLCAgNCB9LCB7IDB4MDA2RSwgIDcgfSwgeyAweDAxQUUsICA5IH0sIHsgMHg2NzEyLCAxNSB9LAorICAgICAgICB7IDB4NjcxMywgMTUgfSwgeyAweDAwM0MsICA2IH0sIHsgMHgwMzU3LCAxMCB9LCB7IDB4MDA2RiwgIDcgfSwKKyAgICAgICAgeyAweDAwRjQsICA4IH0sIHsgMHgwMEY1LCAgOCB9LCB7IDB4MDM1RSwgMTAgfSwgeyAweDAxRUMsICA5IH0sCisgICAgICAgIHsgMHg2NzE0LCAxNSB9LCB7IDB4MDFFRCwgIDkgfSwgeyAweDAzNUYsIDEwIH0sIHsgMHgwM0RDLCAxMCB9LAorICAgICAgICB7IDB4MDNERCwgMTAgfSwgeyAweDY3MTUsIDE1IH0sIHsgMHgzMzhCLCAxNCB9LCB7IDB4MzM4QywgMTQgfSwKKyAgICAgICAgeyAweDMzOEQsIDE0IH0sIHsgMHgwMDFGLCAgNSB9LCB7IDB4MDFFRiwgIDkgfSwgeyAweDMzOEUsIDE0IH0sCisgICAgICAgIHsgMHgzMzhGLCAxNCB9LAorICAgIH0sCisgICAgeyAvLyA1CisgICAgICAgIHsgMHgwMDAwLCAgMiB9LCB7IDB4MDAwNCwgIDQgfSwgeyAweDAwMEEsICA1IH0sIHsgMHgwMDBCLCAgNSB9LAorICAgICAgICB7IDB4MDAxOCwgIDYgfSwgeyAweDAwMTksICA2IH0sIHsgMHgwMDM0LCAgNyB9LCB7IDB4MDA2QSwgIDggfSwKKyAgICAgICAgeyAweDAwNkIsICA4IH0sIHsgMHgwMDZDLCAgOCB9LCB7IDB4MDBEQSwgIDkgfSwgeyAweDAzNkMsIDExIH0sCisgICAgICAgIHsgMHgwMDZFLCAgOCB9LCB7IDB4MDFCNywgMTAgfSwgeyAweDAzNkQsIDExIH0sIHsgMHgzNzgwLCAxNSB9LAorICAgICAgICB7IDB4MDAwNCwgIDMgfSwgeyAweDAwMEUsICA1IH0sIHsgMHgwMDFFLCAgNiB9LCB7IDB4MDAzRSwgIDcgfSwKKyAgICAgICAgeyAweDAwMEEsICA0IH0sIHsgMHgwMDJDLCAgNiB9LCB7IDB4MDAxNywgIDUgfSwgeyAweDAwMkQsICA2IH0sCisgICAgICAgIHsgMHgwMDNGLCAgNyB9LCB7IDB4MDBDMCwgIDggfSwgeyAweDAwNjEsICA3IH0sIHsgMHgwMEMxLCAgOCB9LAorICAgICAgICB7IDB4MDA2MiwgIDcgfSwgeyAweDAwQzYsICA4IH0sIHsgMHgwMDY0LCAgNyB9LCB7IDB4MDBDNywgIDggfSwKKyAgICAgICAgeyAweDAwQ0EsICA4IH0sIHsgMHgwMERGLCAgOSB9LCB7IDB4MDE5NiwgIDkgfSwgeyAweDAxOTcsICA5IH0sCisgICAgICAgIHsgMHgwMTk4LCAgOSB9LCB7IDB4MDE5OSwgIDkgfSwgeyAweDAzNzksIDExIH0sIHsgMHgwMTlBLCAgOSB9LAorICAgICAgICB7IDB4MDFCRCwgMTAgfSwgeyAweDA2NkMsIDExIH0sIHsgMHgzNzgxLCAxNSB9LCB7IDB4MDMzNywgMTAgfSwKKyAgICAgICAgeyAweDA2NkQsIDExIH0sIHsgMHgwNjcwLCAxMSB9LCB7IDB4MDMzOSwgMTAgfSwgeyAweDA2NzEsIDExIH0sCisgICAgICAgIHsgMHgwMDM0LCAgNiB9LCB7IDB4MDBDRiwgIDggfSwgeyAweDM3ODIsIDE1IH0sIHsgMHgzNzgzLCAxNSB9LAorICAgICAgICB7IDB4MDAwRSwgIDQgfSwgeyAweDAwMUIsICA1IH0sIHsgMHgwMDZBLCAgNyB9LCB7IDB4MDA2QiwgIDcgfSwKKyAgICAgICAgeyAweDAxOUQsICA5IH0sIHsgMHgwMDNDLCAgNiB9LCB7IDB4MDBGNCwgIDggfSwgeyAweDAwRjUsICA4IH0sCisgICAgICAgIHsgMHgwM0Q4LCAxMCB9LCB7IDB4MDdCMiwgMTEgfSwgeyAweDM3ODQsIDE1IH0sIHsgMHgwM0RBLCAxMCB9LAorICAgICAgICB7IDB4Mzc4NSwgMTUgfSwgeyAweDAzREIsIDEwIH0sIHsgMHgwM0RDLCAxMCB9LCB7IDB4Mzc4NiwgMTUgfSwKKyAgICAgICAgeyAweDM3ODcsIDE1IH0sIHsgMHgxQkM0LCAxNCB9LCB7IDB4MUJDNSwgMTQgfSwgeyAweDFCQzYsIDE0IH0sCisgICAgICAgIHsgMHgxQkM3LCAxNCB9LCB7IDB4MDAxRiwgIDUgfSwgeyAweDAzREQsIDEwIH0sIHsgMHgwN0IzLCAxMSB9LAorICAgICAgICB7IDB4MDFFRiwgIDkgfSwKKyAgICB9LAorICAgIHsgLy8gNgorICAgICAgICB7IDB4MDAwMCwgIDIgfSwgeyAweDAwMDQsICA0IH0sIHsgMHgwMDBBLCAgNSB9LCB7IDB4MDAxNiwgIDYgfSwKKyAgICAgICAgeyAweDAwMTcsICA2IH0sIHsgMHgwMDYwLCAgOCB9LCB7IDB4MDBDMiwgIDkgfSwgeyAweDAxODYsIDEwIH0sCisgICAgICAgIHsgMHgwMTg3LCAxMCB9LCB7IDB4MDBDNCwgIDkgfSwgeyAweDMxNDAsIDE1IH0sIHsgMHgzMTQxLCAxNSB9LAorICAgICAgICB7IDB4MDE4QiwgMTAgfSwgeyAweDMxNDIsIDE1IH0sIHsgMHgwMThDLCAxMCB9LCB7IDB4MzE0MywgMTUgfSwKKyAgICAgICAgeyAweDAwMDcsICA0IH0sIHsgMHgwMDBELCAgNSB9LCB7IDB4MDA2NCwgIDggfSwgeyAweDAwNjUsICA4IH0sCisgICAgICAgIHsgMHgwMDEwLCAgNSB9LCB7IDB4MDBDNywgIDkgfSwgeyAweDAwNjYsICA4IH0sIHsgMHgwMDA1LCAgMyB9LAorICAgICAgICB7IDB4MDAwNiwgIDMgfSwgeyAweDAwMDksICA0IH0sIHsgMHgwMDExLCAgNSB9LCB7IDB4MDAzOCwgIDYgfSwKKyAgICAgICAgeyAweDAwMzksICA2IH0sIHsgMHgwMDc0LCAgNyB9LCB7IDB4MDA3NSwgIDcgfSwgeyAweDAwNzYsICA3IH0sCisgICAgICAgIHsgMHgwMDY3LCAgOCB9LCB7IDB4MDBFRSwgIDggfSwgeyAweDAxREUsICA5IH0sIHsgMHgwMEYwLCAgOCB9LAorICAgICAgICB7IDB4MDE4RCwgMTAgfSwgeyAweDMxNDQsIDE1IH0sIHsgMHgwMURGLCAgOSB9LCB7IDB4MDAzRCwgIDYgfSwKKyAgICAgICAgeyAweDAwM0UsICA2IH0sIHsgMHgwMUUyLCAgOSB9LCB7IDB4MDNDNiwgMTAgfSwgeyAweDAwRjIsICA4IH0sCisgICAgICAgIHsgMHgwMEYzLCAgOCB9LCB7IDB4MDNDNywgMTAgfSwgeyAweDMxNDUsIDE1IH0sIHsgMHgzMTQ2LCAxNSB9LAorICAgICAgICB7IDB4MDFGOCwgIDkgfSwgeyAweDMxNDcsIDE1IH0sIHsgMHgzMTQ4LCAxNSB9LCB7IDB4MzE0OSwgMTUgfSwKKyAgICAgICAgeyAweDAwRkQsICA4IH0sIHsgMHgzMTRBLCAxNSB9LCB7IDB4MzE0QiwgMTUgfSwgeyAweDMxNEMsIDE1IH0sCisgICAgICAgIHsgMHgzMTRELCAxNSB9LCB7IDB4MDFGOSwgIDkgfSwgeyAweDMxNEUsIDE1IH0sIHsgMHgwMUZDLCAgOSB9LAorICAgICAgICB7IDB4MzE0RiwgMTUgfSwgeyAweDMxNTAsIDE1IH0sIHsgMHgzMTUxLCAxNSB9LCB7IDB4MzE1MiwgMTUgfSwKKyAgICAgICAgeyAweDMxNTMsIDE1IH0sIHsgMHgwM0ZBLCAxMCB9LCB7IDB4MDNGQiwgMTAgfSwgeyAweDMxNTQsIDE1IH0sCisgICAgICAgIHsgMHgzMTU1LCAxNSB9LCB7IDB4MzE1NiwgMTUgfSwgeyAweDMxNTcsIDE1IH0sIHsgMHgzMTU4LCAxNSB9LAorICAgICAgICB7IDB4MzE1OSwgMTUgfSwgeyAweDAwRkYsICA4IH0sIHsgMHgxOEFELCAxNCB9LCB7IDB4MThBRSwgMTQgfSwKKyAgICAgICAgeyAweDE4QUYsIDE0IH0sCisgICAgfSwKKyAgICB7IC8vIDcKKyAgICAgICAgeyAweDAwMDAsICA0IH0sIHsgMHgwMDgwLCAxMSB9LCB7IDB4MDA4MSwgMTEgfSwgeyAweDAwODIsIDExIH0sCisgICAgICAgIHsgMHgwMDgzLCAxMSB9LCB7IDB4MDA4NCwgMTEgfSwgeyAweDAwODUsIDExIH0sIHsgMHgwMDg2LCAxMSB9LAorICAgICAgICB7IDB4MDA4NywgMTEgfSwgeyAweDAwODgsIDExIH0sIHsgMHgwMDg5LCAxMSB9LCB7IDB4MDA4QSwgMTEgfSwKKyAgICAgICAgeyAweDAwOEIsIDExIH0sIHsgMHgwMDhDLCAxMSB9LCB7IDB4MDA4RCwgMTEgfSwgeyAweDAwOEUsIDExIH0sCisgICAgICAgIHsgMHgwMDhGLCAxMSB9LCB7IDB4MDA0OCwgMTAgfSwgeyAweDAwNDksIDEwIH0sIHsgMHgwMDRBLCAxMCB9LAorICAgICAgICB7IDB4MDA0QiwgMTAgfSwgeyAweDAwNEMsIDEwIH0sIHsgMHgwMDRELCAxMCB9LCB7IDB4MDAwMSwgIDEgfSwKKyAgICAgICAgeyAweDAwMDEsICAyIH0sIHsgMHgwMDRFLCAxMCB9LCB7IDB4MDAwMiwgIDQgfSwgeyAweDAwMDMsICA0IH0sCisgICAgICAgIHsgMHgwMDRGLCAxMCB9LCB7IDB4MDA1MCwgMTAgfSwgeyAweDAwNTEsIDEwIH0sIHsgMHgwMDUyLCAxMCB9LAorICAgICAgICB7IDB4MDA1MywgMTAgfSwgeyAweDAwNTQsIDEwIH0sIHsgMHgwMDU1LCAxMCB9LCB7IDB4MDA1NiwgMTAgfSwKKyAgICAgICAgeyAweDAwNTcsIDEwIH0sIHsgMHgwMDU4LCAxMCB9LCB7IDB4MDA1OSwgMTAgfSwgeyAweDAwNUEsIDEwIH0sCisgICAgICAgIHsgMHgwMDVCLCAxMCB9LCB7IDB4MDA1QywgMTAgfSwgeyAweDAwNUQsIDEwIH0sIHsgMHgwMDVFLCAxMCB9LAorICAgICAgICB7IDB4MDA1RiwgMTAgfSwgeyAweDAwNjAsIDEwIH0sIHsgMHgwMDYxLCAxMCB9LCB7IDB4MDA2MiwgMTAgfSwKKyAgICAgICAgeyAweDAwNjMsIDEwIH0sIHsgMHgwMDY0LCAxMCB9LCB7IDB4MDA2NSwgMTAgfSwgeyAweDAwNjYsIDEwIH0sCisgICAgICAgIHsgMHgwMDY3LCAxMCB9LCB7IDB4MDA2OCwgMTAgfSwgeyAweDAwNjksIDEwIH0sIHsgMHgwMDZBLCAxMCB9LAorICAgICAgICB7IDB4MDA2QiwgMTAgfSwgeyAweDAwNkMsIDEwIH0sIHsgMHgwMDZELCAxMCB9LCB7IDB4MDA2RSwgMTAgfSwKKyAgICAgICAgeyAweDAwNkYsIDEwIH0sIHsgMHgwMDcwLCAxMCB9LCB7IDB4MDA3MSwgMTAgfSwgeyAweDAwNzIsIDEwIH0sCisgICAgICAgIHsgMHgwMDczLCAxMCB9LCB7IDB4MDA3NCwgMTAgfSwgeyAweDAwNzUsIDEwIH0sIHsgMHgwMDc2LCAxMCB9LAorICAgICAgICB7IDB4MDA3NywgMTAgfSwgeyAweDAwNzgsIDEwIH0sIHsgMHgwMDc5LCAxMCB9LCB7IDB4MDA3QSwgMTAgfSwKKyAgICAgICAgeyAweDAwN0IsIDEwIH0sIHsgMHgwMDdDLCAxMCB9LCB7IDB4MDA3RCwgMTAgfSwgeyAweDAwN0UsIDEwIH0sCisgICAgICAgIHsgMHgwMDdGLCAxMCB9LAorICAgIH0sCiB9OwogCi1zdGF0aWMgY29uc3QgdWludDE2X3QgeDhfYWMwX2hpZ2hxdWFudF90YWJsZVs4XVs3N11bMl09ewotICAgIHsvLzAKLSAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMEMsICA2fSwgezB4MDAwRCwgIDZ9LAotICAgICAgICB7MHgwMDFDLCAgN30sIHsweDAwMEYsICA2fSwgezB4MUQwMCwgMTV9LCB7MHgwMDNCLCAgOH0sCi0gICAgICAgIHsweDFEMDEsIDE1fSwgezB4MDA3NSwgIDl9LCB7MHgxRDAyLCAxNX0sIHsweDAwODAsICA5fSwKLSAgICAgICAgezB4MUQwMywgMTV9LCB7MHgxRDA0LCAxNX0sIHsweDFEMDUsIDE1fSwgezB4MEU4MywgMTR9LAotICAgICAgICB7MHgwMDA5LCAgNX0sIHsweDAwMTEsICA2fSwgezB4MDA4MSwgIDl9LCB7MHgwMDgyLCAgOX0sCi0gICAgICAgIHsweDAwMjEsICA3fSwgezB4MDAyOCwgIDd9LCB7MHgwMDgzLCAgOX0sIHsweDAwMDIsICAyfSwKLSAgICAgICAgezB4MDAwMywgIDN9LCB7MHgwMDBDLCAgNH0sIHsweDAwMEQsICA0fSwgezB4MDAwQiwgIDV9LAotICAgICAgICB7MHgwMDE1LCAgNn0sIHsweDAwNTIsICA4fSwgezB4MDA3MCwgIDd9LCB7MHgwMDM5LCAgNn0sCi0gICAgICAgIHsweDAwNzEsICA3fSwgezB4MDA1MywgIDh9LCB7MHgwRTg0LCAxNH0sIHsweDAwNzQsICA3fSwKLSAgICAgICAgezB4MDA3NSwgIDd9LCB7MHgwMDc2LCAgN30sIHsweDAxREMsICA5fSwgezB4MDAxRSwgIDV9LAotICAgICAgICB7MHgwMDNFLCAgNn0sIHsweDAxREQsICA5fSwgezB4MDBFRiwgIDh9LCB7MHgwMUY4LCAgOX0sCi0gICAgICAgIHsweDAxRjksICA5fSwgezB4MEU4NSwgMTR9LCB7MHgwRTg2LCAxNH0sIHsweDBFODcsIDE0fSwKLSAgICAgICAgezB4MDBGRCwgIDh9LCB7MHgwRTg4LCAxNH0sIHsweDBFODksIDE0fSwgezB4MEU4QSwgMTR9LAotICAgICAgICB7MHgwRThCLCAxNH0sIHsweDBFOEMsIDE0fSwgezB4MEU4RCwgMTR9LCB7MHgwRThFLCAxNH0sCi0gICAgICAgIHsweDBFOEYsIDE0fSwgezB4MEU5MCwgMTR9LCB7MHgwRTkxLCAxNH0sIHsweDAxRkMsICA5fSwKLSAgICAgICAgezB4MEU5MiwgMTR9LCB7MHgwRTkzLCAxNH0sIHsweDBFOTQsIDE0fSwgezB4MEU5NSwgMTR9LAotICAgICAgICB7MHgwRTk2LCAxNH0sIHsweDBFOTcsIDE0fSwgezB4MDFGRCwgIDl9LCB7MHgwRTk4LCAxNH0sCi0gICAgICAgIHsweDAxRkUsICA5fSwgezB4MEU5OSwgMTR9LCB7MHgwRTlBLCAxNH0sIHsweDBFOUIsIDE0fSwKLSAgICAgICAgezB4MEU5QywgMTR9LCB7MHgwMUZGLCAgOX0sIHsweDBFOUQsIDE0fSwgezB4MEU5RSwgMTR9LAotICAgICAgICB7MHgwRTlGLCAxNH0sCi0gICAgfSx7Ly8xCi0gICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDAzLCAgNH0sIHsweDAwMDgsICA1fSwKLSAgICAgICAgezB4MDAxMiwgIDZ9LCB7MHgwMDEzLCAgNn0sIHsweDAwMTQsICA2fSwgezB4MDAxNSwgIDZ9LAotICAgICAgICB7MHgwMDJDLCAgN30sIHsweDAwNUEsICA4fSwgezB4MDA1QiwgIDh9LCB7MHgwMDVDLCAgOH0sCi0gICAgICAgIHsweDAwNUQsICA4fSwgezB4MTc4MCwgMTR9LCB7MHgwMTc5LCAxMH0sIHsweDAxN0EsIDEwfSwKLSAgICAgICAgezB4MDAwNiwgIDR9LCB7MHgwMDBFLCAgNX0sIHsweDAwMUUsICA2fSwgezB4MDAzRSwgIDd9LAotICAgICAgICB7MHgwMDEwLCAgNX0sIHsweDAwMjIsICA2fSwgezB4MDAxMiwgIDV9LCB7MHgwMDBBLCAgNH0sCi0gICAgICAgIHsweDAwMTMsICA1fSwgezB4MDAxNiwgIDV9LCB7MHgwMDIzLCAgNn0sIHsweDAwMkUsICA2fSwKLSAgICAgICAgezB4MDAyRiwgIDZ9LCB7MHgwMDMwLCAgNn0sIHsweDAwMzEsICA2fSwgezB4MDAzRiwgIDd9LAotICAgICAgICB7MHgwMDVGLCAgOH0sIHsweDAwQzgsICA4fSwgezB4MDA2NSwgIDd9LCB7MHgwMDY2LCAgN30sCi0gICAgICAgIHsweDAwNjcsICA3fSwgezB4MDA2OCwgIDd9LCB7MHgwMEM5LCAgOH0sIHsweDAwNjksICA3fSwKLSAgICAgICAgezB4MDA2QSwgIDd9LCB7MHgwMEQ2LCAgOH0sIHsweDAwRDcsICA4fSwgezB4MDBEOCwgIDh9LAotICAgICAgICB7MHgxNzgxLCAxNH0sIHsweDAxN0IsIDEwfSwgezB4MDFCMiwgIDl9LCB7MHgxNzgyLCAxNH0sCi0gICAgICAgIHsweDAwMUMsICA1fSwgezB4MDFCMywgIDl9LCB7MHgxNzgzLCAxNH0sIHsweDE3ODQsIDE0fSwKLSAgICAgICAgezB4MDAxRCwgIDV9LCB7MHgwMERBLCAgOH0sIHsweDE3ODUsIDE0fSwgezB4MTc4NiwgMTR9LAotICAgICAgICB7MHgxNzg3LCAxNH0sIHsweDAwMzcsICA2fSwgezB4MDBEQiwgIDh9LCB7MHgwMDc4LCAgN30sCi0gICAgICAgIHsweDAwRjIsICA4fSwgezB4MDFFNiwgIDl9LCB7MHgwMEY0LCAgOH0sIHsweDE3ODgsIDE0fSwKLSAgICAgICAgezB4MTc4OSwgMTR9LCB7MHgwMEY1LCAgOH0sIHsweDAxRTcsICA5fSwgezB4MTc4QSwgMTR9LAotICAgICAgICB7MHgxNzhCLCAxNH0sIHsweDE3OEMsIDE0fSwgezB4MTc4RCwgMTR9LCB7MHgwMUVDLCAgOX0sCi0gICAgICAgIHsweDE3OEUsIDE0fSwgezB4MDAxRiwgIDV9LCB7MHgwMEY3LCAgOH0sIHsweDAxRUQsICA5fSwKLSAgICAgICAgezB4MTc4RiwgMTR9LAotICAgIH0sey8vMgotICAgICAgICB7MHgwMDAwLCAgNH0sIHsweDAwMDIsICA1fSwgezB4MDE4MCwgMTJ9LCB7MHgwMTgxLCAxMn0sCi0gICAgICAgIHsweDAxODIsIDEyfSwgezB4MDE4MywgMTJ9LCB7MHgwMTg0LCAxMn0sIHsweDAxODUsIDEyfSwKLSAgICAgICAgezB4MDE4NiwgMTJ9LCB7MHgwMTg3LCAxMn0sIHsweDAxODgsIDEyfSwgezB4MDE4OSwgMTJ9LAotICAgICAgICB7MHgwMEM1LCAxMX0sIHsweDAwQzYsIDExfSwgezB4MDBDNywgMTF9LCB7MHgwMEM4LCAxMX0sCi0gICAgICAgIHsweDAwQzksIDExfSwgezB4MDBDQSwgMTF9LCB7MHgwMENCLCAxMX0sIHsweDAwQ0MsIDExfSwKLSAgICAgICAgezB4MDBDRCwgMTF9LCB7MHgwMENFLCAxMX0sIHsweDAwQ0YsIDExfSwgezB4MDAwMSwgIDF9LAotICAgICAgICB7MHgwMDAxLCAgMn0sIHsweDAwMDQsICA1fSwgezB4MDAwNSwgIDV9LCB7MHgwMDA2LCAgNX0sCi0gICAgICAgIHsweDAwRDAsIDExfSwgezB4MDBEMSwgMTF9LCB7MHgwMEQyLCAxMX0sIHsweDAwRDMsIDExfSwKLSAgICAgICAgezB4MDBENCwgMTF9LCB7MHgwMEQ1LCAxMX0sIHsweDAwRDYsIDExfSwgezB4MDBENywgMTF9LAotICAgICAgICB7MHgwMEQ4LCAxMX0sIHsweDAwRDksIDExfSwgezB4MDBEQSwgMTF9LCB7MHgwMDA3LCAgNX0sCi0gICAgICAgIHsweDAwREIsIDExfSwgezB4MDBEQywgMTF9LCB7MHgwMERELCAxMX0sIHsweDAwREUsIDExfSwKLSAgICAgICAgezB4MDBERiwgMTF9LCB7MHgwMEUwLCAxMX0sIHsweDAwRTEsIDExfSwgezB4MDBFMiwgMTF9LAotICAgICAgICB7MHgwMEUzLCAxMX0sIHsweDAwRTQsIDExfSwgezB4MDBFNSwgMTF9LCB7MHgwMEU2LCAxMX0sCi0gICAgICAgIHsweDAwRTcsIDExfSwgezB4MDBFOCwgMTF9LCB7MHgwMEU5LCAxMX0sIHsweDAwRUEsIDExfSwKLSAgICAgICAgezB4MDBFQiwgMTF9LCB7MHgwMEVDLCAxMX0sIHsweDAwRUQsIDExfSwgezB4MDBFRSwgMTF9LAotICAgICAgICB7MHgwMEVGLCAxMX0sIHsweDAwRjAsIDExfSwgezB4MDBGMSwgMTF9LCB7MHgwMEYyLCAxMX0sCi0gICAgICAgIHsweDAwRjMsIDExfSwgezB4MDBGNCwgMTF9LCB7MHgwMEY1LCAxMX0sIHsweDAwRjYsIDExfSwKLSAgICAgICAgezB4MDBGNywgMTF9LCB7MHgwMEY4LCAxMX0sIHsweDAwRjksIDExfSwgezB4MDBGQSwgMTF9LAotICAgICAgICB7MHgwMEZCLCAxMX0sIHsweDAwRkMsIDExfSwgezB4MDBGRCwgMTF9LCB7MHgwMEZFLCAxMX0sCi0gICAgICAgIHsweDAwRkYsIDExfSwKLSAgICB9LHsvLzMKLSAgICAgICAgezB4MDAwMCwgIDh9LCB7MHgwMDAxLCAgOH0sIHsweDAwMDIsICA4fSwgezB4MDAwMywgIDh9LAotICAgICAgICB7MHgwMDA0LCAgOH0sIHsweDAwMDUsICA4fSwgezB4MDAwNiwgIDh9LCB7MHgwMDA3LCAgOH0sCi0gICAgICAgIHsweDAwMDgsICA4fSwgezB4MDAwOSwgIDh9LCB7MHgwMDBBLCAgOH0sIHsweDAwMEIsICA4fSwKLSAgICAgICAgezB4MDAwQywgIDh9LCB7MHgwMDBELCAgOH0sIHsweDAwMEUsICA4fSwgezB4MDAwRiwgIDh9LAotICAgICAgICB7MHgwMDEwLCAgOH0sIHsweDAwMTEsICA4fSwgezB4MDAxMiwgIDh9LCB7MHgwMDEzLCAgOH0sCi0gICAgICAgIHsweDAwMTQsICA4fSwgezB4MDAxNSwgIDh9LCB7MHgwMDE2LCAgOH0sIHsweDAwMDEsICAxfSwKLSAgICAgICAgezB4MDAxNywgIDh9LCB7MHgwMDBDLCAgN30sIHsweDAwMEQsICA3fSwgezB4MDAwRSwgIDd9LAotICAgICAgICB7MHgwMDBGLCAgN30sIHsweDAwMTAsICA3fSwgezB4MDAxMSwgIDd9LCB7MHgwMDEyLCAgN30sCi0gICAgICAgIHsweDAwMTMsICA3fSwgezB4MDAxNCwgIDd9LCB7MHgwMDE1LCAgN30sIHsweDAwMTYsICA3fSwKLSAgICAgICAgezB4MDAxNywgIDd9LCB7MHgwMDE4LCAgN30sIHsweDAwMTksICA3fSwgezB4MDAxQSwgIDd9LAotICAgICAgICB7MHgwMDFCLCAgN30sIHsweDAwMUMsICA3fSwgezB4MDAxRCwgIDd9LCB7MHgwMDFFLCAgN30sCi0gICAgICAgIHsweDAwMUYsICA3fSwgezB4MDAyMCwgIDd9LCB7MHgwMDIxLCAgN30sIHsweDAwMjIsICA3fSwKLSAgICAgICAgezB4MDAyMywgIDd9LCB7MHgwMDI0LCAgN30sIHsweDAwMjUsICA3fSwgezB4MDAyNiwgIDd9LAotICAgICAgICB7MHgwMDI3LCAgN30sIHsweDAwMjgsICA3fSwgezB4MDAyOSwgIDd9LCB7MHgwMDJBLCAgN30sCi0gICAgICAgIHsweDAwMkIsICA3fSwgezB4MDAyQywgIDd9LCB7MHgwMDJELCAgN30sIHsweDAwMkUsICA3fSwKLSAgICAgICAgezB4MDAyRiwgIDd9LCB7MHgwMDMwLCAgN30sIHsweDAwMzEsICA3fSwgezB4MDAzMiwgIDd9LAotICAgICAgICB7MHgwMDMzLCAgN30sIHsweDAwMzQsICA3fSwgezB4MDAzNSwgIDd9LCB7MHgwMDM2LCAgN30sCi0gICAgICAgIHsweDAwMzcsICA3fSwgezB4MDAzOCwgIDd9LCB7MHgwMDM5LCAgN30sIHsweDAwM0EsICA3fSwKLSAgICAgICAgezB4MDAzQiwgIDd9LCB7MHgwMDNDLCAgN30sIHsweDAwM0QsICA3fSwgezB4MDAzRSwgIDd9LAotICAgICAgICB7MHgwMDNGLCAgN30sCi0gICAgfSx7Ly80Ci0gICAgICAgIHsweDAwMDAsICA5fSwgezB4MDAwMSwgIDl9LCB7MHgwMDAyLCAgOX0sIHsweDAwMDMsICA5fSwKLSAgICAgICAgezB4MDAwNCwgIDl9LCB7MHgwMDA1LCAgOX0sIHsweDAwMDYsICA5fSwgezB4MDAwNywgIDl9LAotICAgICAgICB7MHgwMDA4LCAgOX0sIHsweDAwMDksICA5fSwgezB4MDAwQSwgIDl9LCB7MHgwMDBCLCAgOX0sCi0gICAgICAgIHsweDAwMEMsICA5fSwgezB4MDAwRCwgIDl9LCB7MHgwMDBFLCAgOX0sIHsweDAwMEYsICA5fSwKLSAgICAgICAgezB4MDAxMCwgIDl9LCB7MHgwMDExLCAgOX0sIHsweDAwMTIsICA5fSwgezB4MDAxMywgIDl9LAotICAgICAgICB7MHgwMDE0LCAgOX0sIHsweDAwMTUsICA5fSwgezB4MDAwQiwgIDh9LCB7MHgwMDAxLCAgMn0sCi0gICAgICAgIHsweDAwMDEsICAxfSwgezB4MDAwQywgIDh9LCB7MHgwMDBELCAgOH0sIHsweDAwMEUsICA4fSwKLSAgICAgICAgezB4MDAwRiwgIDh9LCB7MHgwMDEwLCAgOH0sIHsweDAwMTEsICA4fSwgezB4MDAxMiwgIDh9LAotICAgICAgICB7MHgwMDEzLCAgOH0sIHsweDAwMTQsICA4fSwgezB4MDAxNSwgIDh9LCB7MHgwMDE2LCAgOH0sCi0gICAgICAgIHsweDAwMTcsICA4fSwgezB4MDAxOCwgIDh9LCB7MHgwMDE5LCAgOH0sIHsweDAwMUEsICA4fSwKLSAgICAgICAgezB4MDAxQiwgIDh9LCB7MHgwMDFDLCAgOH0sIHsweDAwMUQsICA4fSwgezB4MDAxRSwgIDh9LAotICAgICAgICB7MHgwMDFGLCAgOH0sIHsweDAwMjAsICA4fSwgezB4MDAyMSwgIDh9LCB7MHgwMDIyLCAgOH0sCi0gICAgICAgIHsweDAwMjMsICA4fSwgezB4MDAyNCwgIDh9LCB7MHgwMDI1LCAgOH0sIHsweDAwMjYsICA4fSwKLSAgICAgICAgezB4MDAyNywgIDh9LCB7MHgwMDI4LCAgOH0sIHsweDAwMjksICA4fSwgezB4MDAyQSwgIDh9LAotICAgICAgICB7MHgwMDJCLCAgOH0sIHsweDAwMkMsICA4fSwgezB4MDAyRCwgIDh9LCB7MHgwMDJFLCAgOH0sCi0gICAgICAgIHsweDAwMkYsICA4fSwgezB4MDAzMCwgIDh9LCB7MHgwMDMxLCAgOH0sIHsweDAwMzIsICA4fSwKLSAgICAgICAgezB4MDAzMywgIDh9LCB7MHgwMDM0LCAgOH0sIHsweDAwMzUsICA4fSwgezB4MDAzNiwgIDh9LAotICAgICAgICB7MHgwMDM3LCAgOH0sIHsweDAwMzgsICA4fSwgezB4MDAzOSwgIDh9LCB7MHgwMDNBLCAgOH0sCi0gICAgICAgIHsweDAwM0IsICA4fSwgezB4MDAzQywgIDh9LCB7MHgwMDNELCAgOH0sIHsweDAwM0UsICA4fSwKLSAgICAgICAgezB4MDAzRiwgIDh9LAotICAgIH0sey8vNQotICAgICAgICB7MHgwMDAwLCAxMH0sIHsweDAwMDEsIDEwfSwgezB4MDAwMiwgMTB9LCB7MHgwMDAzLCAxMH0sCi0gICAgICAgIHsweDAwMDQsIDEwfSwgezB4MDAwNSwgMTB9LCB7MHgwMDA2LCAxMH0sIHsweDAwMDcsIDEwfSwKLSAgICAgICAgezB4MDAwOCwgMTB9LCB7MHgwMDA5LCAxMH0sIHsweDAwMEEsIDEwfSwgezB4MDAwQiwgMTB9LAotICAgICAgICB7MHgwMDBDLCAxMH0sIHsweDAwMEQsIDEwfSwgezB4MDAwRSwgMTB9LCB7MHgwMDBGLCAxMH0sCi0gICAgICAgIHsweDAwMTAsIDEwfSwgezB4MDAxMSwgMTB9LCB7MHgwMDEyLCAxMH0sIHsweDAwMTMsIDEwfSwKLSAgICAgICAgezB4MDAwQSwgIDl9LCB7MHgwMDBCLCAgOX0sIHsweDAwMEMsICA5fSwgezB4MDAwMSwgIDF9LAotICAgICAgICB7MHgwMDAxLCAgM30sIHsweDAwMEQsICA5fSwgezB4MDAwRSwgIDl9LCB7MHgwMDAxLCAgMn0sCi0gICAgICAgIHsweDAwMEYsICA5fSwgezB4MDAxMCwgIDl9LCB7MHgwMDExLCAgOX0sIHsweDAwMTIsICA5fSwKLSAgICAgICAgezB4MDAxMywgIDl9LCB7MHgwMDE0LCAgOX0sIHsweDAwMTUsICA5fSwgezB4MDAxNiwgIDl9LAotICAgICAgICB7MHgwMDE3LCAgOX0sIHsweDAwMTgsICA5fSwgezB4MDAxOSwgIDl9LCB7MHgwMDFBLCAgOX0sCi0gICAgICAgIHsweDAwMUIsICA5fSwgezB4MDAxQywgIDl9LCB7MHgwMDFELCAgOX0sIHsweDAwMUUsICA5fSwKLSAgICAgICAgezB4MDAxRiwgIDl9LCB7MHgwMDIwLCAgOX0sIHsweDAwMjEsICA5fSwgezB4MDAyMiwgIDl9LAotICAgICAgICB7MHgwMDIzLCAgOX0sIHsweDAwMjQsICA5fSwgezB4MDAyNSwgIDl9LCB7MHgwMDI2LCAgOX0sCi0gICAgICAgIHsweDAwMjcsICA5fSwgezB4MDAyOCwgIDl9LCB7MHgwMDI5LCAgOX0sIHsweDAwMkEsICA5fSwKLSAgICAgICAgezB4MDAyQiwgIDl9LCB7MHgwMDJDLCAgOX0sIHsweDAwMkQsICA5fSwgezB4MDAyRSwgIDl9LAotICAgICAgICB7MHgwMDJGLCAgOX0sIHsweDAwMzAsICA5fSwgezB4MDAzMSwgIDl9LCB7MHgwMDMyLCAgOX0sCi0gICAgICAgIHsweDAwMzMsICA5fSwgezB4MDAzNCwgIDl9LCB7MHgwMDM1LCAgOX0sIHsweDAwMzYsICA5fSwKLSAgICAgICAgezB4MDAzNywgIDl9LCB7MHgwMDM4LCAgOX0sIHsweDAwMzksICA5fSwgezB4MDAzQSwgIDl9LAotICAgICAgICB7MHgwMDNCLCAgOX0sIHsweDAwM0MsICA5fSwgezB4MDAzRCwgIDl9LCB7MHgwMDNFLCAgOX0sCi0gICAgICAgIHsweDAwM0YsICA5fSwKLSAgICB9LHsvLzYKLSAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDA0LCAgNH0sIHsweDAwMEEsICA1fSwgezB4MDAwQiwgIDV9LAotICAgICAgICB7MHgwMDE4LCAgNn0sIHsweDAwMTksICA2fSwgezB4MDAzNCwgIDd9LCB7MHgwMDZBLCAgOH0sCi0gICAgICAgIHsweDAwNkIsICA4fSwgezB4MDA2QywgIDh9LCB7MHgwMERBLCAgOX0sIHsweDAwREIsICA5fSwKLSAgICAgICAgezB4MDFCOCwgMTB9LCB7MHgwMERELCAgOX0sIHsweDAxQjksIDEwfSwgezB4Mzc4MCwgMTV9LAotICAgICAgICB7MHgwMDA0LCAgM30sIHsweDAwMEUsICA1fSwgezB4MDAxRSwgIDZ9LCB7MHgwMDFGLCAgNn0sCi0gICAgICAgIHsweDAwMEEsICA0fSwgezB4MDA1OCwgIDd9LCB7MHgwMDE3LCAgNX0sIHsweDAwMTgsICA1fSwKLSAgICAgICAgezB4MDA1OSwgIDd9LCB7MHgwMDVBLCAgN30sIHsweDAwNUIsICA3fSwgezB4MDBDOCwgIDh9LAotICAgICAgICB7MHgwMDY1LCAgN30sIHsweDAwNjYsICA3fSwgezB4MDBDOSwgIDh9LCB7MHgwMENFLCAgOH0sCi0gICAgICAgIHsweDAwQ0YsICA4fSwgezB4MDBEMCwgIDh9LCB7MHgwMEQxLCAgOH0sIHsweDAwRDIsICA4fSwKLSAgICAgICAgezB4MDBEMywgIDh9LCB7MHgwMERGLCAgOX0sIHsweDAwRDQsICA4fSwgezB4MDBENSwgIDh9LAotICAgICAgICB7MHgwMEQ2LCAgOH0sIHsweDAxQUUsICA5fSwgezB4Mzc4MSwgMTV9LCB7MHgwMUJELCAxMH0sCi0gICAgICAgIHsweDAzNUUsIDEwfSwgezB4MDM1RiwgMTB9LCB7MHgzNzgyLCAxNX0sIHsweDAzNjAsIDEwfSwKLSAgICAgICAgezB4MDAzNywgIDZ9LCB7MHgwMUIxLCAgOX0sIHsweDM3ODMsIDE1fSwgezB4Mzc4NCwgMTV9LAotICAgICAgICB7MHgwMDBFLCAgNH0sIHsweDAwM0MsICA2fSwgezB4MDM2MSwgMTB9LCB7MHgzNzg1LCAxNX0sCi0gICAgICAgIHsweDFCQzMsIDE0fSwgezB4MDAzRCwgIDZ9LCB7MHgwMEQ5LCAgOH0sIHsweDFCQzQsIDE0fSwKLSAgICAgICAgezB4MDM2OCwgMTB9LCB7MHgxQkM1LCAxNH0sIHsweDFCQzYsIDE0fSwgezB4MUJDNywgMTR9LAotICAgICAgICB7MHgxQkM4LCAxNH0sIHsweDAwREIsICA4fSwgezB4MDM2OSwgMTB9LCB7MHgwMzZBLCAxMH0sCi0gICAgICAgIHsweDFCQzksIDE0fSwgezB4MUJDQSwgMTR9LCB7MHgxQkNCLCAxNH0sIHsweDFCQ0MsIDE0fSwKLSAgICAgICAgezB4MUJDRCwgMTR9LCB7MHgwMDFGLCAgNX0sIHsweDAzNkIsIDEwfSwgezB4MUJDRSwgMTR9LAotICAgICAgICB7MHgxQkNGLCAxNH0sCi0gICAgfSx7Ly83Ci0gICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDA2LCAgNX0sIHsweDAwMDcsICA1fSwKLSAgICAgICAgezB4MDAxMCwgIDZ9LCB7MHgwMDQ0LCAgOH0sIHsweDAwMjMsICA3fSwgezB4MDAxMiwgIDZ9LAotICAgICAgICB7MHgwMDI2LCAgN30sIHsweDA4QTAsIDEzfSwgezB4MDA0RSwgIDh9LCB7MHgwMDRGLCAgOH0sCi0gICAgICAgIHsweDA4QTEsIDEzfSwgezB4MDhBMiwgMTN9LCB7MHgwOEEzLCAxM30sIHsweDAwNTAsICA4fSwKLSAgICAgICAgezB4MDAwNiwgIDR9LCB7MHgwMDBCLCAgNX0sIHsweDAwMjksICA3fSwgezB4MDAxNSwgIDZ9LAotICAgICAgICB7MHgwMDFDLCAgNn0sIHsweDAwM0EsICA3fSwgezB4MDAxRSwgIDZ9LCB7MHgwMDA0LCAgM30sCi0gICAgICAgIHsweDAwMTQsICA1fSwgezB4MDAxNSwgIDV9LCB7MHgwMDBCLCAgNH0sIHsweDAwMUYsICA2fSwKLSAgICAgICAgezB4MDAzMCwgIDZ9LCB7MHgwMDMxLCAgNn0sIHsweDAwMTksICA1fSwgezB4MDA1MSwgIDh9LAotICAgICAgICB7MHgwMDM0LCAgNn0sIHsweDAwMzUsICA2fSwgezB4MDAzNiwgIDZ9LCB7MHgwMDM3LCAgNn0sCi0gICAgICAgIHsweDAwNzYsICA4fSwgezB4MDA3NywgIDh9LCB7MHgwMDcwLCAgN30sIHsweDAwMUQsICA1fSwKLSAgICAgICAgezB4MDA3MSwgIDd9LCB7MHgwMDcyLCAgN30sIHsweDA4QTQsIDEzfSwgezB4MDA3MywgIDd9LAotICAgICAgICB7MHgwMEYwLCAgOH0sIHsweDA4QTUsIDEzfSwgezB4MDhBNiwgMTN9LCB7MHgwOEE3LCAxM30sCi0gICAgICAgIHsweDAwNzksICA3fSwgezB4MDA3QSwgIDd9LCB7MHgwOEE4LCAxM30sIHsweDA4QTksIDEzfSwKLSAgICAgICAgezB4MDBGMSwgIDh9LCB7MHgwOEFBLCAxM30sIHsweDA4QUIsIDEzfSwgezB4MDhBQywgMTN9LAotICAgICAgICB7MHgwOEFELCAxM30sIHsweDAwRjYsICA4fSwgezB4MDhBRSwgMTN9LCB7MHgwMDdDLCAgN30sCi0gICAgICAgIHsweDAwRjcsICA4fSwgezB4MDhBRiwgMTN9LCB7MHgwOEIwLCAxM30sIHsweDA4QjEsIDEzfSwKLSAgICAgICAgezB4MDhCMiwgMTN9LCB7MHgwMEZBLCAgOH0sIHsweDA4QjMsIDEzfSwgezB4MDhCNCwgMTN9LAotICAgICAgICB7MHgwOEI1LCAxM30sIHsweDA4QjYsIDEzfSwgezB4MDhCNywgMTN9LCB7MHgwMEZCLCAgOH0sCi0gICAgICAgIHsweDA0NUMsIDEyfSwgezB4MDAzRiwgIDZ9LCB7MHgwNDVELCAxMn0sIHsweDA0NUUsIDEyfSwKLSAgICAgICAgezB4MDQ1RiwgMTJ9LAotICAgIH0KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9hYzBfaGlnaHF1YW50X3RhYmxlWzhdWzc3XVsyXSA9IHsKKyAgICB7IC8vIDAKKyAgICAgICAgeyAweDAwMDAsICAzIH0sIHsgMHgwMDAyLCAgNCB9LCB7IDB4MDAwQywgIDYgfSwgeyAweDAwMEQsICA2IH0sCisgICAgICAgIHsgMHgwMDFDLCAgNyB9LCB7IDB4MDAwRiwgIDYgfSwgeyAweDFEMDAsIDE1IH0sIHsgMHgwMDNCLCAgOCB9LAorICAgICAgICB7IDB4MUQwMSwgMTUgfSwgeyAweDAwNzUsICA5IH0sIHsgMHgxRDAyLCAxNSB9LCB7IDB4MDA4MCwgIDkgfSwKKyAgICAgICAgeyAweDFEMDMsIDE1IH0sIHsgMHgxRDA0LCAxNSB9LCB7IDB4MUQwNSwgMTUgfSwgeyAweDBFODMsIDE0IH0sCisgICAgICAgIHsgMHgwMDA5LCAgNSB9LCB7IDB4MDAxMSwgIDYgfSwgeyAweDAwODEsICA5IH0sIHsgMHgwMDgyLCAgOSB9LAorICAgICAgICB7IDB4MDAyMSwgIDcgfSwgeyAweDAwMjgsICA3IH0sIHsgMHgwMDgzLCAgOSB9LCB7IDB4MDAwMiwgIDIgfSwKKyAgICAgICAgeyAweDAwMDMsICAzIH0sIHsgMHgwMDBDLCAgNCB9LCB7IDB4MDAwRCwgIDQgfSwgeyAweDAwMEIsICA1IH0sCisgICAgICAgIHsgMHgwMDE1LCAgNiB9LCB7IDB4MDA1MiwgIDggfSwgeyAweDAwNzAsICA3IH0sIHsgMHgwMDM5LCAgNiB9LAorICAgICAgICB7IDB4MDA3MSwgIDcgfSwgeyAweDAwNTMsICA4IH0sIHsgMHgwRTg0LCAxNCB9LCB7IDB4MDA3NCwgIDcgfSwKKyAgICAgICAgeyAweDAwNzUsICA3IH0sIHsgMHgwMDc2LCAgNyB9LCB7IDB4MDFEQywgIDkgfSwgeyAweDAwMUUsICA1IH0sCisgICAgICAgIHsgMHgwMDNFLCAgNiB9LCB7IDB4MDFERCwgIDkgfSwgeyAweDAwRUYsICA4IH0sIHsgMHgwMUY4LCAgOSB9LAorICAgICAgICB7IDB4MDFGOSwgIDkgfSwgeyAweDBFODUsIDE0IH0sIHsgMHgwRTg2LCAxNCB9LCB7IDB4MEU4NywgMTQgfSwKKyAgICAgICAgeyAweDAwRkQsICA4IH0sIHsgMHgwRTg4LCAxNCB9LCB7IDB4MEU4OSwgMTQgfSwgeyAweDBFOEEsIDE0IH0sCisgICAgICAgIHsgMHgwRThCLCAxNCB9LCB7IDB4MEU4QywgMTQgfSwgeyAweDBFOEQsIDE0IH0sIHsgMHgwRThFLCAxNCB9LAorICAgICAgICB7IDB4MEU4RiwgMTQgfSwgeyAweDBFOTAsIDE0IH0sIHsgMHgwRTkxLCAxNCB9LCB7IDB4MDFGQywgIDkgfSwKKyAgICAgICAgeyAweDBFOTIsIDE0IH0sIHsgMHgwRTkzLCAxNCB9LCB7IDB4MEU5NCwgMTQgfSwgeyAweDBFOTUsIDE0IH0sCisgICAgICAgIHsgMHgwRTk2LCAxNCB9LCB7IDB4MEU5NywgMTQgfSwgeyAweDAxRkQsICA5IH0sIHsgMHgwRTk4LCAxNCB9LAorICAgICAgICB7IDB4MDFGRSwgIDkgfSwgeyAweDBFOTksIDE0IH0sIHsgMHgwRTlBLCAxNCB9LCB7IDB4MEU5QiwgMTQgfSwKKyAgICAgICAgeyAweDBFOUMsIDE0IH0sIHsgMHgwMUZGLCAgOSB9LCB7IDB4MEU5RCwgMTQgfSwgeyAweDBFOUUsIDE0IH0sCisgICAgICAgIHsgMHgwRTlGLCAxNCB9LAorICAgIH0sCisgICAgeyAvLyAxCisgICAgICAgIHsgMHgwMDAwLCAgMyB9LCB7IDB4MDAwMiwgIDQgfSwgeyAweDAwMDMsICA0IH0sIHsgMHgwMDA4LCAgNSB9LAorICAgICAgICB7IDB4MDAxMiwgIDYgfSwgeyAweDAwMTMsICA2IH0sIHsgMHgwMDE0LCAgNiB9LCB7IDB4MDAxNSwgIDYgfSwKKyAgICAgICAgeyAweDAwMkMsICA3IH0sIHsgMHgwMDVBLCAgOCB9LCB7IDB4MDA1QiwgIDggfSwgeyAweDAwNUMsICA4IH0sCisgICAgICAgIHsgMHgwMDVELCAgOCB9LCB7IDB4MTc4MCwgMTQgfSwgeyAweDAxNzksIDEwIH0sIHsgMHgwMTdBLCAxMCB9LAorICAgICAgICB7IDB4MDAwNiwgIDQgfSwgeyAweDAwMEUsICA1IH0sIHsgMHgwMDFFLCAgNiB9LCB7IDB4MDAzRSwgIDcgfSwKKyAgICAgICAgeyAweDAwMTAsICA1IH0sIHsgMHgwMDIyLCAgNiB9LCB7IDB4MDAxMiwgIDUgfSwgeyAweDAwMEEsICA0IH0sCisgICAgICAgIHsgMHgwMDEzLCAgNSB9LCB7IDB4MDAxNiwgIDUgfSwgeyAweDAwMjMsICA2IH0sIHsgMHgwMDJFLCAgNiB9LAorICAgICAgICB7IDB4MDAyRiwgIDYgfSwgeyAweDAwMzAsICA2IH0sIHsgMHgwMDMxLCAgNiB9LCB7IDB4MDAzRiwgIDcgfSwKKyAgICAgICAgeyAweDAwNUYsICA4IH0sIHsgMHgwMEM4LCAgOCB9LCB7IDB4MDA2NSwgIDcgfSwgeyAweDAwNjYsICA3IH0sCisgICAgICAgIHsgMHgwMDY3LCAgNyB9LCB7IDB4MDA2OCwgIDcgfSwgeyAweDAwQzksICA4IH0sIHsgMHgwMDY5LCAgNyB9LAorICAgICAgICB7IDB4MDA2QSwgIDcgfSwgeyAweDAwRDYsICA4IH0sIHsgMHgwMEQ3LCAgOCB9LCB7IDB4MDBEOCwgIDggfSwKKyAgICAgICAgeyAweDE3ODEsIDE0IH0sIHsgMHgwMTdCLCAxMCB9LCB7IDB4MDFCMiwgIDkgfSwgeyAweDE3ODIsIDE0IH0sCisgICAgICAgIHsgMHgwMDFDLCAgNSB9LCB7IDB4MDFCMywgIDkgfSwgeyAweDE3ODMsIDE0IH0sIHsgMHgxNzg0LCAxNCB9LAorICAgICAgICB7IDB4MDAxRCwgIDUgfSwgeyAweDAwREEsICA4IH0sIHsgMHgxNzg1LCAxNCB9LCB7IDB4MTc4NiwgMTQgfSwKKyAgICAgICAgeyAweDE3ODcsIDE0IH0sIHsgMHgwMDM3LCAgNiB9LCB7IDB4MDBEQiwgIDggfSwgeyAweDAwNzgsICA3IH0sCisgICAgICAgIHsgMHgwMEYyLCAgOCB9LCB7IDB4MDFFNiwgIDkgfSwgeyAweDAwRjQsICA4IH0sIHsgMHgxNzg4LCAxNCB9LAorICAgICAgICB7IDB4MTc4OSwgMTQgfSwgeyAweDAwRjUsICA4IH0sIHsgMHgwMUU3LCAgOSB9LCB7IDB4MTc4QSwgMTQgfSwKKyAgICAgICAgeyAweDE3OEIsIDE0IH0sIHsgMHgxNzhDLCAxNCB9LCB7IDB4MTc4RCwgMTQgfSwgeyAweDAxRUMsICA5IH0sCisgICAgICAgIHsgMHgxNzhFLCAxNCB9LCB7IDB4MDAxRiwgIDUgfSwgeyAweDAwRjcsICA4IH0sIHsgMHgwMUVELCAgOSB9LAorICAgICAgICB7IDB4MTc4RiwgMTQgfSwKKyAgICB9LAorICAgIHsgLy8gMgorICAgICAgICB7IDB4MDAwMCwgIDQgfSwgeyAweDAwMDIsICA1IH0sIHsgMHgwMTgwLCAxMiB9LCB7IDB4MDE4MSwgMTIgfSwKKyAgICAgICAgeyAweDAxODIsIDEyIH0sIHsgMHgwMTgzLCAxMiB9LCB7IDB4MDE4NCwgMTIgfSwgeyAweDAxODUsIDEyIH0sCisgICAgICAgIHsgMHgwMTg2LCAxMiB9LCB7IDB4MDE4NywgMTIgfSwgeyAweDAxODgsIDEyIH0sIHsgMHgwMTg5LCAxMiB9LAorICAgICAgICB7IDB4MDBDNSwgMTEgfSwgeyAweDAwQzYsIDExIH0sIHsgMHgwMEM3LCAxMSB9LCB7IDB4MDBDOCwgMTEgfSwKKyAgICAgICAgeyAweDAwQzksIDExIH0sIHsgMHgwMENBLCAxMSB9LCB7IDB4MDBDQiwgMTEgfSwgeyAweDAwQ0MsIDExIH0sCisgICAgICAgIHsgMHgwMENELCAxMSB9LCB7IDB4MDBDRSwgMTEgfSwgeyAweDAwQ0YsIDExIH0sIHsgMHgwMDAxLCAgMSB9LAorICAgICAgICB7IDB4MDAwMSwgIDIgfSwgeyAweDAwMDQsICA1IH0sIHsgMHgwMDA1LCAgNSB9LCB7IDB4MDAwNiwgIDUgfSwKKyAgICAgICAgeyAweDAwRDAsIDExIH0sIHsgMHgwMEQxLCAxMSB9LCB7IDB4MDBEMiwgMTEgfSwgeyAweDAwRDMsIDExIH0sCisgICAgICAgIHsgMHgwMEQ0LCAxMSB9LCB7IDB4MDBENSwgMTEgfSwgeyAweDAwRDYsIDExIH0sIHsgMHgwMEQ3LCAxMSB9LAorICAgICAgICB7IDB4MDBEOCwgMTEgfSwgeyAweDAwRDksIDExIH0sIHsgMHgwMERBLCAxMSB9LCB7IDB4MDAwNywgIDUgfSwKKyAgICAgICAgeyAweDAwREIsIDExIH0sIHsgMHgwMERDLCAxMSB9LCB7IDB4MDBERCwgMTEgfSwgeyAweDAwREUsIDExIH0sCisgICAgICAgIHsgMHgwMERGLCAxMSB9LCB7IDB4MDBFMCwgMTEgfSwgeyAweDAwRTEsIDExIH0sIHsgMHgwMEUyLCAxMSB9LAorICAgICAgICB7IDB4MDBFMywgMTEgfSwgeyAweDAwRTQsIDExIH0sIHsgMHgwMEU1LCAxMSB9LCB7IDB4MDBFNiwgMTEgfSwKKyAgICAgICAgeyAweDAwRTcsIDExIH0sIHsgMHgwMEU4LCAxMSB9LCB7IDB4MDBFOSwgMTEgfSwgeyAweDAwRUEsIDExIH0sCisgICAgICAgIHsgMHgwMEVCLCAxMSB9LCB7IDB4MDBFQywgMTEgfSwgeyAweDAwRUQsIDExIH0sIHsgMHgwMEVFLCAxMSB9LAorICAgICAgICB7IDB4MDBFRiwgMTEgfSwgeyAweDAwRjAsIDExIH0sIHsgMHgwMEYxLCAxMSB9LCB7IDB4MDBGMiwgMTEgfSwKKyAgICAgICAgeyAweDAwRjMsIDExIH0sIHsgMHgwMEY0LCAxMSB9LCB7IDB4MDBGNSwgMTEgfSwgeyAweDAwRjYsIDExIH0sCisgICAgICAgIHsgMHgwMEY3LCAxMSB9LCB7IDB4MDBGOCwgMTEgfSwgeyAweDAwRjksIDExIH0sIHsgMHgwMEZBLCAxMSB9LAorICAgICAgICB7IDB4MDBGQiwgMTEgfSwgeyAweDAwRkMsIDExIH0sIHsgMHgwMEZELCAxMSB9LCB7IDB4MDBGRSwgMTEgfSwKKyAgICAgICAgeyAweDAwRkYsIDExIH0sCisgICAgfSwKKyAgICB7IC8vIDMKKyAgICAgICAgeyAweDAwMDAsICA4IH0sIHsgMHgwMDAxLCAgOCB9LCB7IDB4MDAwMiwgIDggfSwgeyAweDAwMDMsICA4IH0sCisgICAgICAgIHsgMHgwMDA0LCAgOCB9LCB7IDB4MDAwNSwgIDggfSwgeyAweDAwMDYsICA4IH0sIHsgMHgwMDA3LCAgOCB9LAorICAgICAgICB7IDB4MDAwOCwgIDggfSwgeyAweDAwMDksICA4IH0sIHsgMHgwMDBBLCAgOCB9LCB7IDB4MDAwQiwgIDggfSwKKyAgICAgICAgeyAweDAwMEMsICA4IH0sIHsgMHgwMDBELCAgOCB9LCB7IDB4MDAwRSwgIDggfSwgeyAweDAwMEYsICA4IH0sCisgICAgICAgIHsgMHgwMDEwLCAgOCB9LCB7IDB4MDAxMSwgIDggfSwgeyAweDAwMTIsICA4IH0sIHsgMHgwMDEzLCAgOCB9LAorICAgICAgICB7IDB4MDAxNCwgIDggfSwgeyAweDAwMTUsICA4IH0sIHsgMHgwMDE2LCAgOCB9LCB7IDB4MDAwMSwgIDEgfSwKKyAgICAgICAgeyAweDAwMTcsICA4IH0sIHsgMHgwMDBDLCAgNyB9LCB7IDB4MDAwRCwgIDcgfSwgeyAweDAwMEUsICA3IH0sCisgICAgICAgIHsgMHgwMDBGLCAgNyB9LCB7IDB4MDAxMCwgIDcgfSwgeyAweDAwMTEsICA3IH0sIHsgMHgwMDEyLCAgNyB9LAorICAgICAgICB7IDB4MDAxMywgIDcgfSwgeyAweDAwMTQsICA3IH0sIHsgMHgwMDE1LCAgNyB9LCB7IDB4MDAxNiwgIDcgfSwKKyAgICAgICAgeyAweDAwMTcsICA3IH0sIHsgMHgwMDE4LCAgNyB9LCB7IDB4MDAxOSwgIDcgfSwgeyAweDAwMUEsICA3IH0sCisgICAgICAgIHsgMHgwMDFCLCAgNyB9LCB7IDB4MDAxQywgIDcgfSwgeyAweDAwMUQsICA3IH0sIHsgMHgwMDFFLCAgNyB9LAorICAgICAgICB7IDB4MDAxRiwgIDcgfSwgeyAweDAwMjAsICA3IH0sIHsgMHgwMDIxLCAgNyB9LCB7IDB4MDAyMiwgIDcgfSwKKyAgICAgICAgeyAweDAwMjMsICA3IH0sIHsgMHgwMDI0LCAgNyB9LCB7IDB4MDAyNSwgIDcgfSwgeyAweDAwMjYsICA3IH0sCisgICAgICAgIHsgMHgwMDI3LCAgNyB9LCB7IDB4MDAyOCwgIDcgfSwgeyAweDAwMjksICA3IH0sIHsgMHgwMDJBLCAgNyB9LAorICAgICAgICB7IDB4MDAyQiwgIDcgfSwgeyAweDAwMkMsICA3IH0sIHsgMHgwMDJELCAgNyB9LCB7IDB4MDAyRSwgIDcgfSwKKyAgICAgICAgeyAweDAwMkYsICA3IH0sIHsgMHgwMDMwLCAgNyB9LCB7IDB4MDAzMSwgIDcgfSwgeyAweDAwMzIsICA3IH0sCisgICAgICAgIHsgMHgwMDMzLCAgNyB9LCB7IDB4MDAzNCwgIDcgfSwgeyAweDAwMzUsICA3IH0sIHsgMHgwMDM2LCAgNyB9LAorICAgICAgICB7IDB4MDAzNywgIDcgfSwgeyAweDAwMzgsICA3IH0sIHsgMHgwMDM5LCAgNyB9LCB7IDB4MDAzQSwgIDcgfSwKKyAgICAgICAgeyAweDAwM0IsICA3IH0sIHsgMHgwMDNDLCAgNyB9LCB7IDB4MDAzRCwgIDcgfSwgeyAweDAwM0UsICA3IH0sCisgICAgICAgIHsgMHgwMDNGLCAgNyB9LAorICAgIH0sCisgICAgeyAvLyA0CisgICAgICAgIHsgMHgwMDAwLCAgOSB9LCB7IDB4MDAwMSwgIDkgfSwgeyAweDAwMDIsICA5IH0sIHsgMHgwMDAzLCAgOSB9LAorICAgICAgICB7IDB4MDAwNCwgIDkgfSwgeyAweDAwMDUsICA5IH0sIHsgMHgwMDA2LCAgOSB9LCB7IDB4MDAwNywgIDkgfSwKKyAgICAgICAgeyAweDAwMDgsICA5IH0sIHsgMHgwMDA5LCAgOSB9LCB7IDB4MDAwQSwgIDkgfSwgeyAweDAwMEIsICA5IH0sCisgICAgICAgIHsgMHgwMDBDLCAgOSB9LCB7IDB4MDAwRCwgIDkgfSwgeyAweDAwMEUsICA5IH0sIHsgMHgwMDBGLCAgOSB9LAorICAgICAgICB7IDB4MDAxMCwgIDkgfSwgeyAweDAwMTEsICA5IH0sIHsgMHgwMDEyLCAgOSB9LCB7IDB4MDAxMywgIDkgfSwKKyAgICAgICAgeyAweDAwMTQsICA5IH0sIHsgMHgwMDE1LCAgOSB9LCB7IDB4MDAwQiwgIDggfSwgeyAweDAwMDEsICAyIH0sCisgICAgICAgIHsgMHgwMDAxLCAgMSB9LCB7IDB4MDAwQywgIDggfSwgeyAweDAwMEQsICA4IH0sIHsgMHgwMDBFLCAgOCB9LAorICAgICAgICB7IDB4MDAwRiwgIDggfSwgeyAweDAwMTAsICA4IH0sIHsgMHgwMDExLCAgOCB9LCB7IDB4MDAxMiwgIDggfSwKKyAgICAgICAgeyAweDAwMTMsICA4IH0sIHsgMHgwMDE0LCAgOCB9LCB7IDB4MDAxNSwgIDggfSwgeyAweDAwMTYsICA4IH0sCisgICAgICAgIHsgMHgwMDE3LCAgOCB9LCB7IDB4MDAxOCwgIDggfSwgeyAweDAwMTksICA4IH0sIHsgMHgwMDFBLCAgOCB9LAorICAgICAgICB7IDB4MDAxQiwgIDggfSwgeyAweDAwMUMsICA4IH0sIHsgMHgwMDFELCAgOCB9LCB7IDB4MDAxRSwgIDggfSwKKyAgICAgICAgeyAweDAwMUYsICA4IH0sIHsgMHgwMDIwLCAgOCB9LCB7IDB4MDAyMSwgIDggfSwgeyAweDAwMjIsICA4IH0sCisgICAgICAgIHsgMHgwMDIzLCAgOCB9LCB7IDB4MDAyNCwgIDggfSwgeyAweDAwMjUsICA4IH0sIHsgMHgwMDI2LCAgOCB9LAorICAgICAgICB7IDB4MDAyNywgIDggfSwgeyAweDAwMjgsICA4IH0sIHsgMHgwMDI5LCAgOCB9LCB7IDB4MDAyQSwgIDggfSwKKyAgICAgICAgeyAweDAwMkIsICA4IH0sIHsgMHgwMDJDLCAgOCB9LCB7IDB4MDAyRCwgIDggfSwgeyAweDAwMkUsICA4IH0sCisgICAgICAgIHsgMHgwMDJGLCAgOCB9LCB7IDB4MDAzMCwgIDggfSwgeyAweDAwMzEsICA4IH0sIHsgMHgwMDMyLCAgOCB9LAorICAgICAgICB7IDB4MDAzMywgIDggfSwgeyAweDAwMzQsICA4IH0sIHsgMHgwMDM1LCAgOCB9LCB7IDB4MDAzNiwgIDggfSwKKyAgICAgICAgeyAweDAwMzcsICA4IH0sIHsgMHgwMDM4LCAgOCB9LCB7IDB4MDAzOSwgIDggfSwgeyAweDAwM0EsICA4IH0sCisgICAgICAgIHsgMHgwMDNCLCAgOCB9LCB7IDB4MDAzQywgIDggfSwgeyAweDAwM0QsICA4IH0sIHsgMHgwMDNFLCAgOCB9LAorICAgICAgICB7IDB4MDAzRiwgIDggfSwKKyAgICB9LAorICAgIHsgLy8gNQorICAgICAgICB7IDB4MDAwMCwgMTAgfSwgeyAweDAwMDEsIDEwIH0sIHsgMHgwMDAyLCAxMCB9LCB7IDB4MDAwMywgMTAgfSwKKyAgICAgICAgeyAweDAwMDQsIDEwIH0sIHsgMHgwMDA1LCAxMCB9LCB7IDB4MDAwNiwgMTAgfSwgeyAweDAwMDcsIDEwIH0sCisgICAgICAgIHsgMHgwMDA4LCAxMCB9LCB7IDB4MDAwOSwgMTAgfSwgeyAweDAwMEEsIDEwIH0sIHsgMHgwMDBCLCAxMCB9LAorICAgICAgICB7IDB4MDAwQywgMTAgfSwgeyAweDAwMEQsIDEwIH0sIHsgMHgwMDBFLCAxMCB9LCB7IDB4MDAwRiwgMTAgfSwKKyAgICAgICAgeyAweDAwMTAsIDEwIH0sIHsgMHgwMDExLCAxMCB9LCB7IDB4MDAxMiwgMTAgfSwgeyAweDAwMTMsIDEwIH0sCisgICAgICAgIHsgMHgwMDBBLCAgOSB9LCB7IDB4MDAwQiwgIDkgfSwgeyAweDAwMEMsICA5IH0sIHsgMHgwMDAxLCAgMSB9LAorICAgICAgICB7IDB4MDAwMSwgIDMgfSwgeyAweDAwMEQsICA5IH0sIHsgMHgwMDBFLCAgOSB9LCB7IDB4MDAwMSwgIDIgfSwKKyAgICAgICAgeyAweDAwMEYsICA5IH0sIHsgMHgwMDEwLCAgOSB9LCB7IDB4MDAxMSwgIDkgfSwgeyAweDAwMTIsICA5IH0sCisgICAgICAgIHsgMHgwMDEzLCAgOSB9LCB7IDB4MDAxNCwgIDkgfSwgeyAweDAwMTUsICA5IH0sIHsgMHgwMDE2LCAgOSB9LAorICAgICAgICB7IDB4MDAxNywgIDkgfSwgeyAweDAwMTgsICA5IH0sIHsgMHgwMDE5LCAgOSB9LCB7IDB4MDAxQSwgIDkgfSwKKyAgICAgICAgeyAweDAwMUIsICA5IH0sIHsgMHgwMDFDLCAgOSB9LCB7IDB4MDAxRCwgIDkgfSwgeyAweDAwMUUsICA5IH0sCisgICAgICAgIHsgMHgwMDFGLCAgOSB9LCB7IDB4MDAyMCwgIDkgfSwgeyAweDAwMjEsICA5IH0sIHsgMHgwMDIyLCAgOSB9LAorICAgICAgICB7IDB4MDAyMywgIDkgfSwgeyAweDAwMjQsICA5IH0sIHsgMHgwMDI1LCAgOSB9LCB7IDB4MDAyNiwgIDkgfSwKKyAgICAgICAgeyAweDAwMjcsICA5IH0sIHsgMHgwMDI4LCAgOSB9LCB7IDB4MDAyOSwgIDkgfSwgeyAweDAwMkEsICA5IH0sCisgICAgICAgIHsgMHgwMDJCLCAgOSB9LCB7IDB4MDAyQywgIDkgfSwgeyAweDAwMkQsICA5IH0sIHsgMHgwMDJFLCAgOSB9LAorICAgICAgICB7IDB4MDAyRiwgIDkgfSwgeyAweDAwMzAsICA5IH0sIHsgMHgwMDMxLCAgOSB9LCB7IDB4MDAzMiwgIDkgfSwKKyAgICAgICAgeyAweDAwMzMsICA5IH0sIHsgMHgwMDM0LCAgOSB9LCB7IDB4MDAzNSwgIDkgfSwgeyAweDAwMzYsICA5IH0sCisgICAgICAgIHsgMHgwMDM3LCAgOSB9LCB7IDB4MDAzOCwgIDkgfSwgeyAweDAwMzksICA5IH0sIHsgMHgwMDNBLCAgOSB9LAorICAgICAgICB7IDB4MDAzQiwgIDkgfSwgeyAweDAwM0MsICA5IH0sIHsgMHgwMDNELCAgOSB9LCB7IDB4MDAzRSwgIDkgfSwKKyAgICAgICAgeyAweDAwM0YsICA5IH0sCisgICAgfSwKKyAgICB7IC8vIDYKKyAgICAgICAgeyAweDAwMDAsICAyIH0sIHsgMHgwMDA0LCAgNCB9LCB7IDB4MDAwQSwgIDUgfSwgeyAweDAwMEIsICA1IH0sCisgICAgICAgIHsgMHgwMDE4LCAgNiB9LCB7IDB4MDAxOSwgIDYgfSwgeyAweDAwMzQsICA3IH0sIHsgMHgwMDZBLCAgOCB9LAorICAgICAgICB7IDB4MDA2QiwgIDggfSwgeyAweDAwNkMsICA4IH0sIHsgMHgwMERBLCAgOSB9LCB7IDB4MDBEQiwgIDkgfSwKKyAgICAgICAgeyAweDAxQjgsIDEwIH0sIHsgMHgwMERELCAgOSB9LCB7IDB4MDFCOSwgMTAgfSwgeyAweDM3ODAsIDE1IH0sCisgICAgICAgIHsgMHgwMDA0LCAgMyB9LCB7IDB4MDAwRSwgIDUgfSwgeyAweDAwMUUsICA2IH0sIHsgMHgwMDFGLCAgNiB9LAorICAgICAgICB7IDB4MDAwQSwgIDQgfSwgeyAweDAwNTgsICA3IH0sIHsgMHgwMDE3LCAgNSB9LCB7IDB4MDAxOCwgIDUgfSwKKyAgICAgICAgeyAweDAwNTksICA3IH0sIHsgMHgwMDVBLCAgNyB9LCB7IDB4MDA1QiwgIDcgfSwgeyAweDAwQzgsICA4IH0sCisgICAgICAgIHsgMHgwMDY1LCAgNyB9LCB7IDB4MDA2NiwgIDcgfSwgeyAweDAwQzksICA4IH0sIHsgMHgwMENFLCAgOCB9LAorICAgICAgICB7IDB4MDBDRiwgIDggfSwgeyAweDAwRDAsICA4IH0sIHsgMHgwMEQxLCAgOCB9LCB7IDB4MDBEMiwgIDggfSwKKyAgICAgICAgeyAweDAwRDMsICA4IH0sIHsgMHgwMERGLCAgOSB9LCB7IDB4MDBENCwgIDggfSwgeyAweDAwRDUsICA4IH0sCisgICAgICAgIHsgMHgwMEQ2LCAgOCB9LCB7IDB4MDFBRSwgIDkgfSwgeyAweDM3ODEsIDE1IH0sIHsgMHgwMUJELCAxMCB9LAorICAgICAgICB7IDB4MDM1RSwgMTAgfSwgeyAweDAzNUYsIDEwIH0sIHsgMHgzNzgyLCAxNSB9LCB7IDB4MDM2MCwgMTAgfSwKKyAgICAgICAgeyAweDAwMzcsICA2IH0sIHsgMHgwMUIxLCAgOSB9LCB7IDB4Mzc4MywgMTUgfSwgeyAweDM3ODQsIDE1IH0sCisgICAgICAgIHsgMHgwMDBFLCAgNCB9LCB7IDB4MDAzQywgIDYgfSwgeyAweDAzNjEsIDEwIH0sIHsgMHgzNzg1LCAxNSB9LAorICAgICAgICB7IDB4MUJDMywgMTQgfSwgeyAweDAwM0QsICA2IH0sIHsgMHgwMEQ5LCAgOCB9LCB7IDB4MUJDNCwgMTQgfSwKKyAgICAgICAgeyAweDAzNjgsIDEwIH0sIHsgMHgxQkM1LCAxNCB9LCB7IDB4MUJDNiwgMTQgfSwgeyAweDFCQzcsIDE0IH0sCisgICAgICAgIHsgMHgxQkM4LCAxNCB9LCB7IDB4MDBEQiwgIDggfSwgeyAweDAzNjksIDEwIH0sIHsgMHgwMzZBLCAxMCB9LAorICAgICAgICB7IDB4MUJDOSwgMTQgfSwgeyAweDFCQ0EsIDE0IH0sIHsgMHgxQkNCLCAxNCB9LCB7IDB4MUJDQywgMTQgfSwKKyAgICAgICAgeyAweDFCQ0QsIDE0IH0sIHsgMHgwMDFGLCAgNSB9LCB7IDB4MDM2QiwgMTAgfSwgeyAweDFCQ0UsIDE0IH0sCisgICAgICAgIHsgMHgxQkNGLCAxNCB9LAorICAgIH0sCisgICAgeyAvLyA3CisgICAgICAgIHsgMHgwMDAwLCAgMyB9LCB7IDB4MDAwMiwgIDQgfSwgeyAweDAwMDYsICA1IH0sIHsgMHgwMDA3LCAgNSB9LAorICAgICAgICB7IDB4MDAxMCwgIDYgfSwgeyAweDAwNDQsICA4IH0sIHsgMHgwMDIzLCAgNyB9LCB7IDB4MDAxMiwgIDYgfSwKKyAgICAgICAgeyAweDAwMjYsICA3IH0sIHsgMHgwOEEwLCAxMyB9LCB7IDB4MDA0RSwgIDggfSwgeyAweDAwNEYsICA4IH0sCisgICAgICAgIHsgMHgwOEExLCAxMyB9LCB7IDB4MDhBMiwgMTMgfSwgeyAweDA4QTMsIDEzIH0sIHsgMHgwMDUwLCAgOCB9LAorICAgICAgICB7IDB4MDAwNiwgIDQgfSwgeyAweDAwMEIsICA1IH0sIHsgMHgwMDI5LCAgNyB9LCB7IDB4MDAxNSwgIDYgfSwKKyAgICAgICAgeyAweDAwMUMsICA2IH0sIHsgMHgwMDNBLCAgNyB9LCB7IDB4MDAxRSwgIDYgfSwgeyAweDAwMDQsICAzIH0sCisgICAgICAgIHsgMHgwMDE0LCAgNSB9LCB7IDB4MDAxNSwgIDUgfSwgeyAweDAwMEIsICA0IH0sIHsgMHgwMDFGLCAgNiB9LAorICAgICAgICB7IDB4MDAzMCwgIDYgfSwgeyAweDAwMzEsICA2IH0sIHsgMHgwMDE5LCAgNSB9LCB7IDB4MDA1MSwgIDggfSwKKyAgICAgICAgeyAweDAwMzQsICA2IH0sIHsgMHgwMDM1LCAgNiB9LCB7IDB4MDAzNiwgIDYgfSwgeyAweDAwMzcsICA2IH0sCisgICAgICAgIHsgMHgwMDc2LCAgOCB9LCB7IDB4MDA3NywgIDggfSwgeyAweDAwNzAsICA3IH0sIHsgMHgwMDFELCAgNSB9LAorICAgICAgICB7IDB4MDA3MSwgIDcgfSwgeyAweDAwNzIsICA3IH0sIHsgMHgwOEE0LCAxMyB9LCB7IDB4MDA3MywgIDcgfSwKKyAgICAgICAgeyAweDAwRjAsICA4IH0sIHsgMHgwOEE1LCAxMyB9LCB7IDB4MDhBNiwgMTMgfSwgeyAweDA4QTcsIDEzIH0sCisgICAgICAgIHsgMHgwMDc5LCAgNyB9LCB7IDB4MDA3QSwgIDcgfSwgeyAweDA4QTgsIDEzIH0sIHsgMHgwOEE5LCAxMyB9LAorICAgICAgICB7IDB4MDBGMSwgIDggfSwgeyAweDA4QUEsIDEzIH0sIHsgMHgwOEFCLCAxMyB9LCB7IDB4MDhBQywgMTMgfSwKKyAgICAgICAgeyAweDA4QUQsIDEzIH0sIHsgMHgwMEY2LCAgOCB9LCB7IDB4MDhBRSwgMTMgfSwgeyAweDAwN0MsICA3IH0sCisgICAgICAgIHsgMHgwMEY3LCAgOCB9LCB7IDB4MDhBRiwgMTMgfSwgeyAweDA4QjAsIDEzIH0sIHsgMHgwOEIxLCAxMyB9LAorICAgICAgICB7IDB4MDhCMiwgMTMgfSwgeyAweDAwRkEsICA4IH0sIHsgMHgwOEIzLCAxMyB9LCB7IDB4MDhCNCwgMTMgfSwKKyAgICAgICAgeyAweDA4QjUsIDEzIH0sIHsgMHgwOEI2LCAxMyB9LCB7IDB4MDhCNywgMTMgfSwgeyAweDAwRkIsICA4IH0sCisgICAgICAgIHsgMHgwNDVDLCAxMiB9LCB7IDB4MDAzRiwgIDYgfSwgeyAweDA0NUQsIDEyIH0sIHsgMHgwNDVFLCAxMiB9LAorICAgICAgICB7IDB4MDQ1RiwgMTIgfSwKKyAgICB9LAogfTsKIAotc3RhdGljIGNvbnN0IHVpbnQxNl90IHg4X2FjMV9sb3dxdWFudF90YWJsZVs4XVs3N11bMl09ewotICAgIHsvLzAKLSAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDMsICA0fSwgezB4MDAwOCwgIDV9LAotICAgICAgICB7MHgwMDEyLCAgNn0sIHsweDAwMjYsICA3fSwgezB4MDAxNCwgIDZ9LCB7MHgwMDRFLCAgOH0sCi0gICAgICAgIHsweDAwNEYsICA4fSwgezB4MDBBOCwgIDl9LCB7MHgwMTUyLCAxMH0sIHsweDAwQUEsICA5fSwKLSAgICAgICAgezB4MDBBQiwgIDl9LCB7MHgwMEFDLCAgOX0sIHsweDJBNjAsIDE1fSwgezB4MDJBNywgMTF9LAotICAgICAgICB7MHgwMDA2LCAgNH0sIHsweDAwMEIsICA1fSwgezB4MDAxQywgIDZ9LCB7MHgwMDNBLCAgN30sCi0gICAgICAgIHsweDAwMEYsICA1fSwgezB4MDAzQiwgIDd9LCB7MHgwMDEwLCAgNX0sIHsweDAwMDUsICAzfSwKLSAgICAgICAgezB4MDAwOSwgIDR9LCB7MHgwMDExLCAgNX0sIHsweDAwMTgsICA1fSwgezB4MDAxOSwgIDV9LAotICAgICAgICB7MHgwMDFBLCAgNX0sIHsweDAwMzYsICA2fSwgezB4MDAzNywgIDZ9LCB7MHgwMDcwLCAgN30sCi0gICAgICAgIHsweDAwNTcsICA4fSwgezB4MDBFMiwgIDh9LCB7MHgwMEUzLCAgOH0sIHsweDAwRTQsICA4fSwKLSAgICAgICAgezB4MDBFNSwgIDh9LCB7MHgwMEFELCAgOX0sIHsweDAzOTgsIDEwfSwgezB4MDAzQSwgIDZ9LAotICAgICAgICB7MHgwMDc2LCAgN30sIHsweDAwRTcsICA4fSwgezB4MDBFRSwgIDh9LCB7MHgwMEVGLCAgOH0sCi0gICAgICAgIHsweDA3MzIsIDExfSwgezB4MDM5QSwgMTB9LCB7MHgwNzMzLCAxMX0sIHsweDJBNjEsIDE1fSwKLSAgICAgICAgezB4MDA3OCwgIDd9LCB7MHgxNTMxLCAxNH0sIHsweDE1MzIsIDE0fSwgezB4MTUzMywgMTR9LAotICAgICAgICB7MHgwMDNELCAgNn0sIHsweDAzOUIsIDEwfSwgezB4MTUzNCwgMTR9LCB7MHgxNTM1LCAxNH0sCi0gICAgICAgIHsweDE1MzYsIDE0fSwgezB4MDA3OSwgIDd9LCB7MHgxNTM3LCAxNH0sIHsweDAwRjgsICA4fSwKLSAgICAgICAgezB4MDFGMiwgIDl9LCB7MHgwN0NDLCAxMX0sIHsweDAzRTcsIDEwfSwgezB4MDdDRCwgMTF9LAotICAgICAgICB7MHgzRTgwLCAxNH0sIHsweDAwRkIsICA4fSwgezB4MDNFOSwgMTB9LCB7MHgzRTgxLCAxNH0sCi0gICAgICAgIHsweDNFODIsIDE0fSwgezB4M0U4MywgMTR9LCB7MHgzRTg0LCAxNH0sIHsweDNFODUsIDE0fSwKLSAgICAgICAgezB4M0U4NiwgMTR9LCB7MHgwMDNGLCAgNn0sIHsweDAxRjUsICA5fSwgezB4MDdEMSwgMTF9LAotICAgICAgICB7MHgzRTg3LCAxNH0sCi0gICAgfSx7Ly8xCi0gICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwMiwgIDN9LCB7MHgwMDA2LCAgNH0sIHsweDAwMEUsICA1fSwKLSAgICAgICAgezB4MDAxRSwgIDZ9LCB7MHgwMDFGLCAgNn0sIHsweDAwNDAsICA3fSwgezB4MDA4MiwgIDh9LAotICAgICAgICB7MHgwMDgzLCAgOH0sIHsweDAwODQsICA4fSwgezB4MDEwQSwgIDl9LCB7MHgwMTBCLCAgOX0sCi0gICAgICAgIHsweDA0MzAsIDExfSwgezB4MDQzMSwgMTF9LCB7MHgwNDMyLCAxMX0sIHsweDA0MzMsIDExfSwKLSAgICAgICAgezB4MDAwNSwgIDN9LCB7MHgwMDExLCAgNX0sIHsweDAwMjQsICA2fSwgezB4MDA0QSwgIDd9LAotICAgICAgICB7MHgwMDBDLCAgNH0sIHsweDAwMjYsICA2fSwgezB4MDAwRCwgIDR9LCB7MHgwMDg3LCAgOH0sCi0gICAgICAgIHsweDAxMEQsICA5fSwgezB4MDI1OCwgMTB9LCB7MHgwMTJELCAgOX0sIHsweDAyNTksIDEwfSwKLSAgICAgICAgezB4MDI1QywgMTB9LCB7MHgwOTc0LCAxMn0sIHsweDAyNUUsIDEwfSwgezB4MDI1RiwgMTB9LAotICAgICAgICB7MHgwMjcwLCAxMH0sIHsweDAyNzEsIDEwfSwgezB4MDRCQiwgMTF9LCB7MHgwOTc1LCAxMn0sCi0gICAgICAgIHsweDAyNzIsIDEwfSwgezB4MDlDQywgMTJ9LCB7MHgwOUNELCAxMn0sIHsweDRFNzAsIDE1fSwKLSAgICAgICAgezB4NEU3MSwgMTV9LCB7MHg0RTcyLCAxNX0sIHsweDRFNzMsIDE1fSwgezB4MjczQSwgMTR9LAotICAgICAgICB7MHgyNzNCLCAxNH0sIHsweDI3M0MsIDE0fSwgezB4MDRFOCwgMTF9LCB7MHgwNEU5LCAxMX0sCi0gICAgICAgIHsweDAwOUUsICA4fSwgezB4MDI3NSwgMTB9LCB7MHgwOUQ4LCAxMn0sIHsweDI3M0QsIDE0fSwKLSAgICAgICAgezB4MDAwRSwgIDR9LCB7MHgwMDNDLCAgNn0sIHsweDAwN0EsICA3fSwgezB4MDA5RiwgIDh9LAotICAgICAgICB7MHgwMjc3LCAxMH0sIHsweDAwM0UsICA2fSwgezB4MDBGNiwgIDh9LCB7MHgwNEVELCAxMX0sCi0gICAgICAgIHsweDAzREMsIDEwfSwgezB4MjczRSwgMTR9LCB7MHgwN0JBLCAxMX0sIHsweDA5RDksIDEyfSwKLSAgICAgICAgezB4MjczRiwgMTR9LCB7MHgzREQ4LCAxNH0sIHsweDNERDksIDE0fSwgezB4M0REQSwgMTR9LAotICAgICAgICB7MHgzRERCLCAxNH0sIHsweDNEREMsIDE0fSwgezB4M0RERCwgMTR9LCB7MHgzRERFLCAxNH0sCi0gICAgICAgIHsweDNEREYsIDE0fSwgezB4MDAzRiwgIDZ9LCB7MHgwN0JDLCAxMX0sIHsweDA3QkQsIDExfSwKLSAgICAgICAgezB4MDNERiwgMTB9LAotICAgIH0sey8vMgotICAgICAgICB7MHgwMDAwLCAgM30sIHsweDAwMDIsICA0fSwgezB4MDAwNiwgIDV9LCB7MHgwMDBFLCAgNn0sCi0gICAgICAgIHsweDAwMUUsICA3fSwgezB4MDAzRSwgIDh9LCB7MHgwMDNGLCAgOH0sIHsweDAwNDAsICA4fSwKLSAgICAgICAgezB4MDEwNCwgMTB9LCB7MHgwMDgzLCAgOX0sIHsweDAxMDUsIDEwfSwgezB4MDEwOCwgMTB9LAotICAgICAgICB7MHg0MjQwLCAxNn0sIHsweDAxMEEsIDEwfSwgezB4MDEwQiwgMTB9LCB7MHg0MjQxLCAxNn0sCi0gICAgICAgIHsweDAwMDMsICAzfSwgezB4MDAwOSwgIDV9LCB7MHgwMDExLCAgNn0sIHsweDAwNDMsICA4fSwKLSAgICAgICAgezB4MDAwNCwgIDN9LCB7MHgwMDBBLCAgNX0sIHsweDAwMEEsICA0fSwgezB4MDAyQywgIDd9LAotICAgICAgICB7MHgwMEI0LCAgOX0sIHsweDAwQjUsICA5fSwgezB4MDBCNiwgIDl9LCB7MHgwMEI3LCAgOX0sCi0gICAgICAgIHsweDAwQjgsICA5fSwgezB4MDE3MiwgMTB9LCB7MHgwMTczLCAxMH0sIHsweDAxNzQsIDEwfSwKLSAgICAgICAgezB4MDE3NSwgMTB9LCB7MHgwMTc2LCAxMH0sIHsweDAxNzcsIDEwfSwgezB4MDBCQywgIDl9LAotICAgICAgICB7MHgwMTdBLCAxMH0sIHsweDAyMTMsIDExfSwgezB4NDI0MiwgMTZ9LCB7MHgwMTdCLCAxMH0sCi0gICAgICAgIHsweDAyRjgsIDExfSwgezB4MDE3RCwgMTB9LCB7MHgwMkY5LCAxMX0sIHsweDAxN0UsIDEwfSwKLSAgICAgICAgezB4NDI0MywgMTZ9LCB7MHgwMkZFLCAxMX0sIHsweDIxMjIsIDE1fSwgezB4MjEyMywgMTV9LAotICAgICAgICB7MHgwMDU4LCAgN30sIHsweDAxNjQsICA5fSwgezB4MjEyNCwgMTV9LCB7MHgyMTI1LCAxNX0sCi0gICAgICAgIHsweDAwMDYsICAzfSwgezB4MDAwRSwgIDR9LCB7MHgwMDJELCAgNn0sIHsweDAwMkUsICA2fSwKLSAgICAgICAgezB4MDBCMywgIDh9LCB7MHgwMDFFLCAgNX0sIHsweDAwNUUsICA3fSwgezB4MjEyNiwgMTV9LAotICAgICAgICB7MHgyMTI3LCAxNX0sIHsweDIxMjgsIDE1fSwgezB4MjEyOSwgMTV9LCB7MHgwMkZGLCAxMX0sCi0gICAgICAgIHsweDIxMkEsIDE1fSwgezB4MDU5NCwgMTF9LCB7MHgwNTk1LCAxMX0sIHsweDA1OTYsIDExfSwKLSAgICAgICAgezB4MjEyQiwgMTV9LCB7MHgyMTJDLCAxNX0sIHsweDIxMkQsIDE1fSwgezB4MjEyRSwgMTV9LAotICAgICAgICB7MHgyMTJGLCAxNX0sIHsweDAwMUYsICA1fSwgezB4MDU5NywgMTF9LCB7MHgwMEJFLCAgOH0sCi0gICAgICAgIHsweDAwQkYsICA4fSwKLSAgICB9LHsvLzMKLSAgICAgICAgezB4MDAwMCwgIDJ9LCB7MHgwMDAyLCAgM30sIHsweDAwMDYsICA0fSwgezB4MDAwNywgIDR9LAotICAgICAgICB7MHgwMDEwLCAgNX0sIHsweDAwMTEsICA1fSwgezB4MDAyNCwgIDZ9LCB7MHgwMDI1LCAgNn0sCi0gICAgICAgIHsweDAwMjYsICA2fSwgezB4MDAyNywgIDZ9LCB7MHgwMDUwLCAgN30sIHsweDAwNTEsICA3fSwKLSAgICAgICAgezB4MDBBNCwgIDh9LCB7MHgwMEE1LCAgOH0sIHsweDAwQTYsICA4fSwgezB4MDE0RSwgIDl9LAotICAgICAgICB7MHgwMDBCLCAgNH0sIHsweDAwMkEsICA2fSwgezB4MDA1NiwgIDd9LCB7MHgwMTRGLCAgOX0sCi0gICAgICAgIHsweDAwMzAsICA2fSwgezB4MDBBRSwgIDh9LCB7MHgwMDYyLCAgN30sIHsweDAwMzIsICA2fSwKLSAgICAgICAgezB4MDAzMywgIDZ9LCB7MHgwMDM0LCAgNn0sIHsweDAwMzUsICA2fSwgezB4MDAzNiwgIDZ9LAotICAgICAgICB7MHgwMDYzLCAgN30sIHsweDAwNkUsICA3fSwgezB4MDA2RiwgIDd9LCB7MHgwMDcwLCAgN30sCi0gICAgICAgIHsweDAwNzEsICA3fSwgezB4MDA3MiwgIDd9LCB7MHgwMDczLCAgN30sIHsweDAwNzQsICA3fSwKLSAgICAgICAgezB4MDBBRiwgIDh9LCB7MHgwMEVBLCAgOH0sIHsweDAxRDYsICA5fSwgezB4MDc1QywgMTF9LAotICAgICAgICB7MHgwM0FGLCAxMH0sIHsweDc1RDAsIDE1fSwgezB4NzVEMSwgMTV9LCB7MHg3NUQyLCAxNX0sCi0gICAgICAgIHsweDc1RDMsIDE1fSwgezB4NzVENCwgMTV9LCB7MHgwMDc2LCAgN30sIHsweDAwRUUsICA4fSwKLSAgICAgICAgezB4MDBFRiwgIDh9LCB7MHgwRUJCLCAxMn0sIHsweDAxRTAsICA5fSwgezB4NzVENSwgMTV9LAotICAgICAgICB7MHgwMDc5LCAgN30sIHsweDAxRTEsICA5fSwgezB4NzVENiwgMTV9LCB7MHg3NUQ3LCAxNX0sCi0gICAgICAgIHsweDc4ODAsIDE1fSwgezB4MDBGNCwgIDh9LCB7MHgwNzg5LCAxMX0sIHsweDAwM0UsICA2fSwKLSAgICAgICAgezB4MDA3QiwgIDd9LCB7MHgwMEY1LCAgOH0sIHsweDAwRkMsICA4fSwgezB4MDA3RiwgIDd9LAotICAgICAgICB7MHgwMUUzLCAgOX0sIHsweDA3OEEsIDExfSwgezB4MDc4QiwgMTF9LCB7MHg3ODgxLCAxNX0sCi0gICAgICAgIHsweDc4ODIsIDE1fSwgezB4Nzg4MywgMTV9LCB7MHgzQzQyLCAxNH0sIHsweDNDNDMsIDE0fSwKLSAgICAgICAgezB4M0M0NCwgMTR9LCB7MHgwMEZELCAgOH0sIHsweDNDNDUsIDE0fSwgezB4M0M0NiwgMTR9LAotICAgICAgICB7MHgzQzQ3LCAxNH0sCi0gICAgfSx7Ly80Ci0gICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwNCwgIDR9LCB7MHgwMDBBLCAgNX0sIHsweDAwMTYsICA2fSwKLSAgICAgICAgezB4MDAxNywgIDZ9LCB7MHgwMDMwLCAgN30sIHsweDAwMzEsICA3fSwgezB4MDA2NCwgIDh9LAotICAgICAgICB7MHgwMDY1LCAgOH0sIHsweDAwNjYsICA4fSwgezB4MDBDRSwgIDl9LCB7MHgwMENGLCAgOX0sCi0gICAgICAgIHsweDAxQTAsIDEwfSwgezB4MDFBMSwgMTB9LCB7MHgxQTIwLCAxNH0sIHsweDA2ODksIDEyfSwKLSAgICAgICAgezB4MDAwNCwgIDN9LCB7MHgwMDBFLCAgNX0sIHsweDAwMUIsICA2fSwgezB4MDAzNSwgIDd9LAotICAgICAgICB7MHgwMDBBLCAgNH0sIHsweDAwMUUsICA2fSwgezB4MDAxNiwgIDV9LCB7MHgwMDE3LCAgNX0sCi0gICAgICAgIHsweDAwMUYsICA2fSwgezB4MDAzMCwgIDZ9LCB7MHgwMDMxLCAgNn0sIHsweDAwNjQsICA3fSwKLSAgICAgICAgezB4MDA2NSwgIDd9LCB7MHgwMDY5LCAgOH0sIHsweDAwNjYsICA3fSwgezB4MDBDRSwgIDh9LAotICAgICAgICB7MHgwMENGLCAgOH0sIHsweDAwRDAsICA4fSwgezB4MDBEMSwgIDh9LCB7MHgwMEQyLCAgOH0sCi0gICAgICAgIHsweDAxQTYsICA5fSwgezB4MDFBMywgMTB9LCB7MHgwMzRFLCAxMH0sIHsweDAwNkEsICA3fSwKLSAgICAgICAgezB4MDBENiwgIDh9LCB7MHgwMUFFLCAgOX0sIHsweDAxQUYsICA5fSwgezB4MDM0RiwgMTB9LAotICAgICAgICB7MHgwMzQ1LCAxMX0sIHsweDAxQjAsICA5fSwgezB4MDFCMSwgIDl9LCB7MHgwMzY0LCAxMH0sCi0gICAgICAgIHsweDAwNkQsICA3fSwgezB4MDBEQywgIDh9LCB7MHgwRDk0LCAxMn0sIHsweDBEOTUsIDEyfSwKLSAgICAgICAgezB4MDAwRSwgIDR9LCB7MHgwMDNDLCAgNn0sIHsweDAwREQsICA4fSwgezB4MDBERSwgIDh9LAotICAgICAgICB7MHgwMUIzLCAgOX0sIHsweDAwM0QsICA2fSwgezB4MDBERiwgIDh9LCB7MHgwMUYwLCAgOX0sCi0gICAgICAgIHsweDAzRTIsIDEwfSwgezB4MDNFMywgMTB9LCB7MHgwNkNCLCAxMX0sIHsweDAzRTQsIDEwfSwKLSAgICAgICAgezB4MDdDQSwgMTF9LCB7MHgwMUYzLCAgOX0sIHsweDAxRjQsICA5fSwgezB4MDdDQiwgMTF9LAotICAgICAgICB7MHgwN0Q0LCAxMX0sIHsweDFBMjEsIDE0fSwgezB4MUEyMiwgMTR9LCB7MHgwN0Q1LCAxMX0sCi0gICAgICAgIHsweDFBMjMsIDE0fSwgezB4MDAzRiwgIDZ9LCB7MHgwMUY2LCAgOX0sIHsweDAxRjcsICA5fSwKLSAgICAgICAgezB4MDNFQiwgMTB9LAotICAgIH0sey8vNQotICAgICAgICB7MHgwMDAwLCAgMn0sIHsweDAwMDIsICAzfSwgezB4MDAwNiwgIDR9LCB7MHgwMDBFLCAgNX0sCi0gICAgICAgIHsweDAwMEYsICA1fSwgezB4MDAyMCwgIDZ9LCB7MHgwMDIxLCAgNn0sIHsweDAwNDQsICA3fSwKLSAgICAgICAgezB4MDA0NSwgIDd9LCB7MHgwMDQ2LCAgN30sIHsweDAwOEUsICA4fSwgezB4MDA4RiwgIDh9LAotICAgICAgICB7MHgwMDkwLCAgOH0sIHsweDAxMjIsICA5fSwgezB4MDI0NiwgMTB9LCB7MHgwMTI0LCAgOX0sCi0gICAgICAgIHsweDAwMDUsICAzfSwgezB4MDAxMywgIDV9LCB7MHgwMDRBLCAgN30sIHsweDAwOTMsICA4fSwKLSAgICAgICAgezB4MDAxOCwgIDV9LCB7MHgwMDRCLCAgN30sIHsweDAwMzIsICA2fSwgezB4MDAxQSwgIDV9LAotICAgICAgICB7MHgwMDMzLCAgNn0sIHsweDAwNkMsICA3fSwgezB4MDA2RCwgIDd9LCB7MHgwMDZFLCAgN30sCi0gICAgICAgIHsweDAwREUsICA4fSwgezB4MDBERiwgIDh9LCB7MHgwMDcwLCAgN30sIHsweDAwRTIsICA4fSwKLSAgICAgICAgezB4MDBFMywgIDh9LCB7MHgwMEU0LCAgOH0sIHsweDAwRTUsICA4fSwgezB4MDBFNiwgIDh9LAotICAgICAgICB7MHgwMEU3LCAgOH0sIHsweDAxMjUsICA5fSwgezB4MDFEMCwgIDl9LCB7MHgwNDhFLCAxMX0sCi0gICAgICAgIHsweDA5MUUsIDEyfSwgezB4MDkxRiwgMTJ9LCB7MHg3NDQwLCAxNX0sIHsweDFEMTEsIDEzfSwKLSAgICAgICAgezB4NzQ0MSwgMTV9LCB7MHg3NDQyLCAxNX0sIHsweDAwRTksICA4fSwgezB4MDFENCwgIDl9LAotICAgICAgICB7MHgwMEVCLCAgOH0sIHsweDAzQTMsIDEwfSwgezB4MDFENSwgIDl9LCB7MHgxRDEyLCAxM30sCi0gICAgICAgIHsweDAwMUUsICA1fSwgezB4MDA3NiwgIDd9LCB7MHgwMURDLCAgOX0sIHsweDAxREQsICA5fSwKLSAgICAgICAgezB4NzQ0MywgMTV9LCB7MHgwMDdDLCAgN30sIHsweDA3NDUsIDExfSwgezB4MDBFRiwgIDh9LAotICAgICAgICB7MHgwMEZBLCAgOH0sIHsweDAwRkIsICA4fSwgezB4MDFGOCwgIDl9LCB7MHgwMEZELCAgOH0sCi0gICAgICAgIHsweDA3RTQsIDExfSwgezB4MEZDQSwgMTJ9LCB7MHgxRDEzLCAxM30sIHsweDdFNTgsIDE1fSwKLSAgICAgICAgezB4N0U1OSwgMTV9LCB7MHg3RTVBLCAxNX0sIHsweDdFNUIsIDE1fSwgezB4N0U1QywgMTV9LAotICAgICAgICB7MHg3RTVELCAxNX0sIHsweDAwN0YsICA3fSwgezB4M0YyRiwgMTR9LCB7MHgwN0U2LCAxMX0sCi0gICAgICAgIHsweDA3RTcsIDExfSwKLSAgICB9LHsvLzYKLSAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDMsICA0fSwgezB4MDAwOCwgIDV9LAotICAgICAgICB7MHgwMDA5LCAgNX0sIHsweDAwMTQsICA2fSwgezB4MDAxNSwgIDZ9LCB7MHgwMDJDLCAgN30sCi0gICAgICAgIHsweDAwNUEsICA4fSwgezB4MDA1QiwgIDh9LCB7MHgwMDVDLCAgOH0sIHsweDAwQkEsICA5fSwKLSAgICAgICAgezB4MDBCQiwgIDl9LCB7MHgwMEJDLCAgOX0sIHsweDAyRjQsIDExfSwgezB4MDVFQSwgMTJ9LAotICAgICAgICB7MHgwMDAzLCAgM30sIHsweDAwMTAsICA1fSwgezB4MDAyMiwgIDZ9LCB7MHgwMDQ2LCAgN30sCi0gICAgICAgIHsweDAwMDksICA0fSwgezB4MDAyOCwgIDZ9LCB7MHgwMDE1LCAgNX0sIHsweDAwMEIsICA0fSwKLSAgICAgICAgezB4MDAxOCwgIDV9LCB7MHgwMDI5LCAgNn0sIHsweDAwMzIsICA2fSwgezB4MDA0NywgIDd9LAotICAgICAgICB7MHgwMDY2LCAgN30sIHsweDAwNjcsICA3fSwgezB4MDA2OCwgIDd9LCB7MHgwMDY5LCAgN30sCi0gICAgICAgIHsweDAwNkEsICA3fSwgezB4MDA1RiwgIDh9LCB7MHgwMEQ2LCAgOH0sIHsweDAwRDcsICA4fSwKLSAgICAgICAgezB4MDFCMCwgIDl9LCB7MHgwMEQ5LCAgOH0sIHsweDAxN0IsIDEwfSwgezB4MDA2RCwgIDd9LAotICAgICAgICB7MHgwMERDLCAgOH0sIHsweDAxQjEsICA5fSwgezB4MDZFOCwgMTF9LCB7MHgwMUJCLCAgOX0sCi0gICAgICAgIHsweDAzNzUsIDEwfSwgezB4MDVFQiwgMTJ9LCB7MHgwMUJDLCAgOX0sIHsweDZFOTAsIDE1fSwKLSAgICAgICAgezB4MDAzOCwgIDZ9LCB7MHgwMDcyLCAgN30sIHsweDZFOTEsIDE1fSwgezB4NkU5MiwgMTV9LAotICAgICAgICB7MHgwMDFELCAgNX0sIHsweDAwNzMsICA3fSwgezB4MDFCRCwgIDl9LCB7MHgwNkY4LCAxMX0sCi0gICAgICAgIHsweDZFOTMsIDE1fSwgezB4MDAzQywgIDZ9LCB7MHgwMUJGLCAgOX0sIHsweDAwRjQsICA4fSwKLSAgICAgICAgezB4MDFFQSwgIDl9LCB7MHgwMzdELCAxMH0sIHsweDAzRDYsIDEwfSwgezB4MDZGOSwgMTF9LAotICAgICAgICB7MHg2RTk0LCAxNX0sIHsweDAwRjYsICA4fSwgezB4MDFFRSwgIDl9LCB7MHg2RTk1LCAxNX0sCi0gICAgICAgIHsweDZFOTYsIDE1fSwgezB4NkU5NywgMTV9LCB7MHgzNzRDLCAxNH0sIHsweDM3NEQsIDE0fSwKLSAgICAgICAgezB4Mzc0RSwgMTR9LCB7MHgwMDFGLCAgNX0sIHsweDAzRDcsIDEwfSwgezB4MDFFRiwgIDl9LAotICAgICAgICB7MHgzNzRGLCAxNH0sCi0gICAgfSx7Ly83Ci0gICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwNCwgIDR9LCB7MHgwMDBBLCAgNX0sIHsweDAwMTYsICA2fSwKLSAgICAgICAgezB4MDAyRSwgIDd9LCB7MHgwMDJGLCAgN30sIHsweDAwNjAsICA4fSwgezB4MDA2MSwgIDh9LAotICAgICAgICB7MHgwMEM0LCAgOX0sIHsweDAwQzUsICA5fSwgezB4MDBDNiwgIDl9LCB7MHgwMThFLCAxMH0sCi0gICAgICAgIHsweDMxRTAsIDE1fSwgezB4MzFFMSwgMTV9LCB7MHgzMUUyLCAxNX0sIHsweDMxRTMsIDE1fSwKLSAgICAgICAgezB4MDAwNCwgIDN9LCB7MHgwMDBELCAgNX0sIHsweDAwMTksICA2fSwgezB4MDAzOCwgIDd9LAotICAgICAgICB7MHgwMDBBLCAgNH0sIHsweDAwMUQsICA2fSwgezB4MDAwQiwgIDR9LCB7MHgwMDcyLCAgOH0sCi0gICAgICAgIHsweDAwNzMsICA4fSwgezB4MDBGMCwgIDl9LCB7MHgwMUUyLCAxMH0sIHsweDAwRjIsICA5fSwKLSAgICAgICAgezB4MDFFMywgMTB9LCB7MHgwMEYzLCAgOX0sIHsweDAxRTgsIDEwfSwgezB4MDFFOSwgMTB9LAotICAgICAgICB7MHgzMUU0LCAxNX0sIHsweDAxRUEsIDEwfSwgezB4MDMxRiwgMTF9LCB7MHgwM0Q2LCAxMX0sCi0gICAgICAgIHsweDMxRTUsIDE1fSwgezB4MDFFQywgMTB9LCB7MHgzMUU2LCAxNX0sIHsweDAwRjcsICA5fSwKLSAgICAgICAgezB4MDNENywgMTF9LCB7MHgzMUU3LCAxNX0sIHsweDMxRTgsIDE1fSwgezB4MDNEQSwgMTF9LAotICAgICAgICB7MHgwM0RCLCAxMX0sIHsweDMxRTksIDE1fSwgezB4MDNFMCwgMTF9LCB7MHgzMUVBLCAxNX0sCi0gICAgICAgIHsweDAwM0YsICA3fSwgezB4MDFGMSwgMTB9LCB7MHgzMUVCLCAxNX0sIHsweDMxRUMsIDE1fSwKLSAgICAgICAgezB4MDAwNiwgIDN9LCB7MHgwMDFDLCAgNX0sIHsweDAwNzQsICA3fSwgezB4MDA3NSwgIDd9LAotICAgICAgICB7MHgwMEY5LCAgOX0sIHsweDAwMUUsICA1fSwgezB4MDA3NiwgIDd9LCB7MHgwMEZBLCAgOX0sCi0gICAgICAgIHsweDAzRTEsIDExfSwgezB4MzFFRCwgMTV9LCB7MHgxOEY3LCAxNH0sIHsweDFGNjAsIDE0fSwKLSAgICAgICAgezB4MUY2MSwgMTR9LCB7MHgwMURDLCAgOX0sIHsweDAxREQsICA5fSwgezB4MUY2MiwgMTR9LAotICAgICAgICB7MHgxRjYzLCAxNH0sIHsweDFGNjQsIDE0fSwgezB4MUY2NSwgMTR9LCB7MHgxRjY2LCAxNH0sCi0gICAgICAgIHsweDFGNjcsIDE0fSwgezB4MDAxRiwgIDV9LCB7MHgwM0VELCAxMX0sIHsweDAwRUYsICA4fSwKLSAgICAgICAgezB4MDFGNywgMTB9LAotICAgIH0KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9hYzFfbG93cXVhbnRfdGFibGVbOF1bNzddWzJdID0geworICAgIHsgLy8gMAorICAgICAgICB7IDB4MDAwMCwgIDMgfSwgeyAweDAwMDIsICA0IH0sIHsgMHgwMDAzLCAgNCB9LCB7IDB4MDAwOCwgIDUgfSwKKyAgICAgICAgeyAweDAwMTIsICA2IH0sIHsgMHgwMDI2LCAgNyB9LCB7IDB4MDAxNCwgIDYgfSwgeyAweDAwNEUsICA4IH0sCisgICAgICAgIHsgMHgwMDRGLCAgOCB9LCB7IDB4MDBBOCwgIDkgfSwgeyAweDAxNTIsIDEwIH0sIHsgMHgwMEFBLCAgOSB9LAorICAgICAgICB7IDB4MDBBQiwgIDkgfSwgeyAweDAwQUMsICA5IH0sIHsgMHgyQTYwLCAxNSB9LCB7IDB4MDJBNywgMTEgfSwKKyAgICAgICAgeyAweDAwMDYsICA0IH0sIHsgMHgwMDBCLCAgNSB9LCB7IDB4MDAxQywgIDYgfSwgeyAweDAwM0EsICA3IH0sCisgICAgICAgIHsgMHgwMDBGLCAgNSB9LCB7IDB4MDAzQiwgIDcgfSwgeyAweDAwMTAsICA1IH0sIHsgMHgwMDA1LCAgMyB9LAorICAgICAgICB7IDB4MDAwOSwgIDQgfSwgeyAweDAwMTEsICA1IH0sIHsgMHgwMDE4LCAgNSB9LCB7IDB4MDAxOSwgIDUgfSwKKyAgICAgICAgeyAweDAwMUEsICA1IH0sIHsgMHgwMDM2LCAgNiB9LCB7IDB4MDAzNywgIDYgfSwgeyAweDAwNzAsICA3IH0sCisgICAgICAgIHsgMHgwMDU3LCAgOCB9LCB7IDB4MDBFMiwgIDggfSwgeyAweDAwRTMsICA4IH0sIHsgMHgwMEU0LCAgOCB9LAorICAgICAgICB7IDB4MDBFNSwgIDggfSwgeyAweDAwQUQsICA5IH0sIHsgMHgwMzk4LCAxMCB9LCB7IDB4MDAzQSwgIDYgfSwKKyAgICAgICAgeyAweDAwNzYsICA3IH0sIHsgMHgwMEU3LCAgOCB9LCB7IDB4MDBFRSwgIDggfSwgeyAweDAwRUYsICA4IH0sCisgICAgICAgIHsgMHgwNzMyLCAxMSB9LCB7IDB4MDM5QSwgMTAgfSwgeyAweDA3MzMsIDExIH0sIHsgMHgyQTYxLCAxNSB9LAorICAgICAgICB7IDB4MDA3OCwgIDcgfSwgeyAweDE1MzEsIDE0IH0sIHsgMHgxNTMyLCAxNCB9LCB7IDB4MTUzMywgMTQgfSwKKyAgICAgICAgeyAweDAwM0QsICA2IH0sIHsgMHgwMzlCLCAxMCB9LCB7IDB4MTUzNCwgMTQgfSwgeyAweDE1MzUsIDE0IH0sCisgICAgICAgIHsgMHgxNTM2LCAxNCB9LCB7IDB4MDA3OSwgIDcgfSwgeyAweDE1MzcsIDE0IH0sIHsgMHgwMEY4LCAgOCB9LAorICAgICAgICB7IDB4MDFGMiwgIDkgfSwgeyAweDA3Q0MsIDExIH0sIHsgMHgwM0U3LCAxMCB9LCB7IDB4MDdDRCwgMTEgfSwKKyAgICAgICAgeyAweDNFODAsIDE0IH0sIHsgMHgwMEZCLCAgOCB9LCB7IDB4MDNFOSwgMTAgfSwgeyAweDNFODEsIDE0IH0sCisgICAgICAgIHsgMHgzRTgyLCAxNCB9LCB7IDB4M0U4MywgMTQgfSwgeyAweDNFODQsIDE0IH0sIHsgMHgzRTg1LCAxNCB9LAorICAgICAgICB7IDB4M0U4NiwgMTQgfSwgeyAweDAwM0YsICA2IH0sIHsgMHgwMUY1LCAgOSB9LCB7IDB4MDdEMSwgMTEgfSwKKyAgICAgICAgeyAweDNFODcsIDE0IH0sCisgICAgfSwKKyAgICB7IC8vIDEKKyAgICAgICAgeyAweDAwMDAsICAyIH0sIHsgMHgwMDAyLCAgMyB9LCB7IDB4MDAwNiwgIDQgfSwgeyAweDAwMEUsICA1IH0sCisgICAgICAgIHsgMHgwMDFFLCAgNiB9LCB7IDB4MDAxRiwgIDYgfSwgeyAweDAwNDAsICA3IH0sIHsgMHgwMDgyLCAgOCB9LAorICAgICAgICB7IDB4MDA4MywgIDggfSwgeyAweDAwODQsICA4IH0sIHsgMHgwMTBBLCAgOSB9LCB7IDB4MDEwQiwgIDkgfSwKKyAgICAgICAgeyAweDA0MzAsIDExIH0sIHsgMHgwNDMxLCAxMSB9LCB7IDB4MDQzMiwgMTEgfSwgeyAweDA0MzMsIDExIH0sCisgICAgICAgIHsgMHgwMDA1LCAgMyB9LCB7IDB4MDAxMSwgIDUgfSwgeyAweDAwMjQsICA2IH0sIHsgMHgwMDRBLCAgNyB9LAorICAgICAgICB7IDB4MDAwQywgIDQgfSwgeyAweDAwMjYsICA2IH0sIHsgMHgwMDBELCAgNCB9LCB7IDB4MDA4NywgIDggfSwKKyAgICAgICAgeyAweDAxMEQsICA5IH0sIHsgMHgwMjU4LCAxMCB9LCB7IDB4MDEyRCwgIDkgfSwgeyAweDAyNTksIDEwIH0sCisgICAgICAgIHsgMHgwMjVDLCAxMCB9LCB7IDB4MDk3NCwgMTIgfSwgeyAweDAyNUUsIDEwIH0sIHsgMHgwMjVGLCAxMCB9LAorICAgICAgICB7IDB4MDI3MCwgMTAgfSwgeyAweDAyNzEsIDEwIH0sIHsgMHgwNEJCLCAxMSB9LCB7IDB4MDk3NSwgMTIgfSwKKyAgICAgICAgeyAweDAyNzIsIDEwIH0sIHsgMHgwOUNDLCAxMiB9LCB7IDB4MDlDRCwgMTIgfSwgeyAweDRFNzAsIDE1IH0sCisgICAgICAgIHsgMHg0RTcxLCAxNSB9LCB7IDB4NEU3MiwgMTUgfSwgeyAweDRFNzMsIDE1IH0sIHsgMHgyNzNBLCAxNCB9LAorICAgICAgICB7IDB4MjczQiwgMTQgfSwgeyAweDI3M0MsIDE0IH0sIHsgMHgwNEU4LCAxMSB9LCB7IDB4MDRFOSwgMTEgfSwKKyAgICAgICAgeyAweDAwOUUsICA4IH0sIHsgMHgwMjc1LCAxMCB9LCB7IDB4MDlEOCwgMTIgfSwgeyAweDI3M0QsIDE0IH0sCisgICAgICAgIHsgMHgwMDBFLCAgNCB9LCB7IDB4MDAzQywgIDYgfSwgeyAweDAwN0EsICA3IH0sIHsgMHgwMDlGLCAgOCB9LAorICAgICAgICB7IDB4MDI3NywgMTAgfSwgeyAweDAwM0UsICA2IH0sIHsgMHgwMEY2LCAgOCB9LCB7IDB4MDRFRCwgMTEgfSwKKyAgICAgICAgeyAweDAzREMsIDEwIH0sIHsgMHgyNzNFLCAxNCB9LCB7IDB4MDdCQSwgMTEgfSwgeyAweDA5RDksIDEyIH0sCisgICAgICAgIHsgMHgyNzNGLCAxNCB9LCB7IDB4M0REOCwgMTQgfSwgeyAweDNERDksIDE0IH0sIHsgMHgzRERBLCAxNCB9LAorICAgICAgICB7IDB4M0REQiwgMTQgfSwgeyAweDNEREMsIDE0IH0sIHsgMHgzRERELCAxNCB9LCB7IDB4M0RERSwgMTQgfSwKKyAgICAgICAgeyAweDNEREYsIDE0IH0sIHsgMHgwMDNGLCAgNiB9LCB7IDB4MDdCQywgMTEgfSwgeyAweDA3QkQsIDExIH0sCisgICAgICAgIHsgMHgwM0RGLCAxMCB9LAorICAgIH0sCisgICAgeyAvLyAyCisgICAgICAgIHsgMHgwMDAwLCAgMyB9LCB7IDB4MDAwMiwgIDQgfSwgeyAweDAwMDYsICA1IH0sIHsgMHgwMDBFLCAgNiB9LAorICAgICAgICB7IDB4MDAxRSwgIDcgfSwgeyAweDAwM0UsICA4IH0sIHsgMHgwMDNGLCAgOCB9LCB7IDB4MDA0MCwgIDggfSwKKyAgICAgICAgeyAweDAxMDQsIDEwIH0sIHsgMHgwMDgzLCAgOSB9LCB7IDB4MDEwNSwgMTAgfSwgeyAweDAxMDgsIDEwIH0sCisgICAgICAgIHsgMHg0MjQwLCAxNiB9LCB7IDB4MDEwQSwgMTAgfSwgeyAweDAxMEIsIDEwIH0sIHsgMHg0MjQxLCAxNiB9LAorICAgICAgICB7IDB4MDAwMywgIDMgfSwgeyAweDAwMDksICA1IH0sIHsgMHgwMDExLCAgNiB9LCB7IDB4MDA0MywgIDggfSwKKyAgICAgICAgeyAweDAwMDQsICAzIH0sIHsgMHgwMDBBLCAgNSB9LCB7IDB4MDAwQSwgIDQgfSwgeyAweDAwMkMsICA3IH0sCisgICAgICAgIHsgMHgwMEI0LCAgOSB9LCB7IDB4MDBCNSwgIDkgfSwgeyAweDAwQjYsICA5IH0sIHsgMHgwMEI3LCAgOSB9LAorICAgICAgICB7IDB4MDBCOCwgIDkgfSwgeyAweDAxNzIsIDEwIH0sIHsgMHgwMTczLCAxMCB9LCB7IDB4MDE3NCwgMTAgfSwKKyAgICAgICAgeyAweDAxNzUsIDEwIH0sIHsgMHgwMTc2LCAxMCB9LCB7IDB4MDE3NywgMTAgfSwgeyAweDAwQkMsICA5IH0sCisgICAgICAgIHsgMHgwMTdBLCAxMCB9LCB7IDB4MDIxMywgMTEgfSwgeyAweDQyNDIsIDE2IH0sIHsgMHgwMTdCLCAxMCB9LAorICAgICAgICB7IDB4MDJGOCwgMTEgfSwgeyAweDAxN0QsIDEwIH0sIHsgMHgwMkY5LCAxMSB9LCB7IDB4MDE3RSwgMTAgfSwKKyAgICAgICAgeyAweDQyNDMsIDE2IH0sIHsgMHgwMkZFLCAxMSB9LCB7IDB4MjEyMiwgMTUgfSwgeyAweDIxMjMsIDE1IH0sCisgICAgICAgIHsgMHgwMDU4LCAgNyB9LCB7IDB4MDE2NCwgIDkgfSwgeyAweDIxMjQsIDE1IH0sIHsgMHgyMTI1LCAxNSB9LAorICAgICAgICB7IDB4MDAwNiwgIDMgfSwgeyAweDAwMEUsICA0IH0sIHsgMHgwMDJELCAgNiB9LCB7IDB4MDAyRSwgIDYgfSwKKyAgICAgICAgeyAweDAwQjMsICA4IH0sIHsgMHgwMDFFLCAgNSB9LCB7IDB4MDA1RSwgIDcgfSwgeyAweDIxMjYsIDE1IH0sCisgICAgICAgIHsgMHgyMTI3LCAxNSB9LCB7IDB4MjEyOCwgMTUgfSwgeyAweDIxMjksIDE1IH0sIHsgMHgwMkZGLCAxMSB9LAorICAgICAgICB7IDB4MjEyQSwgMTUgfSwgeyAweDA1OTQsIDExIH0sIHsgMHgwNTk1LCAxMSB9LCB7IDB4MDU5NiwgMTEgfSwKKyAgICAgICAgeyAweDIxMkIsIDE1IH0sIHsgMHgyMTJDLCAxNSB9LCB7IDB4MjEyRCwgMTUgfSwgeyAweDIxMkUsIDE1IH0sCisgICAgICAgIHsgMHgyMTJGLCAxNSB9LCB7IDB4MDAxRiwgIDUgfSwgeyAweDA1OTcsIDExIH0sIHsgMHgwMEJFLCAgOCB9LAorICAgICAgICB7IDB4MDBCRiwgIDggfSwKKyAgICB9LAorICAgIHsgLy8gMworICAgICAgICB7IDB4MDAwMCwgIDIgfSwgeyAweDAwMDIsICAzIH0sIHsgMHgwMDA2LCAgNCB9LCB7IDB4MDAwNywgIDQgfSwKKyAgICAgICAgeyAweDAwMTAsICA1IH0sIHsgMHgwMDExLCAgNSB9LCB7IDB4MDAyNCwgIDYgfSwgeyAweDAwMjUsICA2IH0sCisgICAgICAgIHsgMHgwMDI2LCAgNiB9LCB7IDB4MDAyNywgIDYgfSwgeyAweDAwNTAsICA3IH0sIHsgMHgwMDUxLCAgNyB9LAorICAgICAgICB7IDB4MDBBNCwgIDggfSwgeyAweDAwQTUsICA4IH0sIHsgMHgwMEE2LCAgOCB9LCB7IDB4MDE0RSwgIDkgfSwKKyAgICAgICAgeyAweDAwMEIsICA0IH0sIHsgMHgwMDJBLCAgNiB9LCB7IDB4MDA1NiwgIDcgfSwgeyAweDAxNEYsICA5IH0sCisgICAgICAgIHsgMHgwMDMwLCAgNiB9LCB7IDB4MDBBRSwgIDggfSwgeyAweDAwNjIsICA3IH0sIHsgMHgwMDMyLCAgNiB9LAorICAgICAgICB7IDB4MDAzMywgIDYgfSwgeyAweDAwMzQsICA2IH0sIHsgMHgwMDM1LCAgNiB9LCB7IDB4MDAzNiwgIDYgfSwKKyAgICAgICAgeyAweDAwNjMsICA3IH0sIHsgMHgwMDZFLCAgNyB9LCB7IDB4MDA2RiwgIDcgfSwgeyAweDAwNzAsICA3IH0sCisgICAgICAgIHsgMHgwMDcxLCAgNyB9LCB7IDB4MDA3MiwgIDcgfSwgeyAweDAwNzMsICA3IH0sIHsgMHgwMDc0LCAgNyB9LAorICAgICAgICB7IDB4MDBBRiwgIDggfSwgeyAweDAwRUEsICA4IH0sIHsgMHgwMUQ2LCAgOSB9LCB7IDB4MDc1QywgMTEgfSwKKyAgICAgICAgeyAweDAzQUYsIDEwIH0sIHsgMHg3NUQwLCAxNSB9LCB7IDB4NzVEMSwgMTUgfSwgeyAweDc1RDIsIDE1IH0sCisgICAgICAgIHsgMHg3NUQzLCAxNSB9LCB7IDB4NzVENCwgMTUgfSwgeyAweDAwNzYsICA3IH0sIHsgMHgwMEVFLCAgOCB9LAorICAgICAgICB7IDB4MDBFRiwgIDggfSwgeyAweDBFQkIsIDEyIH0sIHsgMHgwMUUwLCAgOSB9LCB7IDB4NzVENSwgMTUgfSwKKyAgICAgICAgeyAweDAwNzksICA3IH0sIHsgMHgwMUUxLCAgOSB9LCB7IDB4NzVENiwgMTUgfSwgeyAweDc1RDcsIDE1IH0sCisgICAgICAgIHsgMHg3ODgwLCAxNSB9LCB7IDB4MDBGNCwgIDggfSwgeyAweDA3ODksIDExIH0sIHsgMHgwMDNFLCAgNiB9LAorICAgICAgICB7IDB4MDA3QiwgIDcgfSwgeyAweDAwRjUsICA4IH0sIHsgMHgwMEZDLCAgOCB9LCB7IDB4MDA3RiwgIDcgfSwKKyAgICAgICAgeyAweDAxRTMsICA5IH0sIHsgMHgwNzhBLCAxMSB9LCB7IDB4MDc4QiwgMTEgfSwgeyAweDc4ODEsIDE1IH0sCisgICAgICAgIHsgMHg3ODgyLCAxNSB9LCB7IDB4Nzg4MywgMTUgfSwgeyAweDNDNDIsIDE0IH0sIHsgMHgzQzQzLCAxNCB9LAorICAgICAgICB7IDB4M0M0NCwgMTQgfSwgeyAweDAwRkQsICA4IH0sIHsgMHgzQzQ1LCAxNCB9LCB7IDB4M0M0NiwgMTQgfSwKKyAgICAgICAgeyAweDNDNDcsIDE0IH0sCisgICAgfSwKKyAgICB7IC8vIDQKKyAgICAgICAgeyAweDAwMDAsICAyIH0sIHsgMHgwMDA0LCAgNCB9LCB7IDB4MDAwQSwgIDUgfSwgeyAweDAwMTYsICA2IH0sCisgICAgICAgIHsgMHgwMDE3LCAgNiB9LCB7IDB4MDAzMCwgIDcgfSwgeyAweDAwMzEsICA3IH0sIHsgMHgwMDY0LCAgOCB9LAorICAgICAgICB7IDB4MDA2NSwgIDggfSwgeyAweDAwNjYsICA4IH0sIHsgMHgwMENFLCAgOSB9LCB7IDB4MDBDRiwgIDkgfSwKKyAgICAgICAgeyAweDAxQTAsIDEwIH0sIHsgMHgwMUExLCAxMCB9LCB7IDB4MUEyMCwgMTQgfSwgeyAweDA2ODksIDEyIH0sCisgICAgICAgIHsgMHgwMDA0LCAgMyB9LCB7IDB4MDAwRSwgIDUgfSwgeyAweDAwMUIsICA2IH0sIHsgMHgwMDM1LCAgNyB9LAorICAgICAgICB7IDB4MDAwQSwgIDQgfSwgeyAweDAwMUUsICA2IH0sIHsgMHgwMDE2LCAgNSB9LCB7IDB4MDAxNywgIDUgfSwKKyAgICAgICAgeyAweDAwMUYsICA2IH0sIHsgMHgwMDMwLCAgNiB9LCB7IDB4MDAzMSwgIDYgfSwgeyAweDAwNjQsICA3IH0sCisgICAgICAgIHsgMHgwMDY1LCAgNyB9LCB7IDB4MDA2OSwgIDggfSwgeyAweDAwNjYsICA3IH0sIHsgMHgwMENFLCAgOCB9LAorICAgICAgICB7IDB4MDBDRiwgIDggfSwgeyAweDAwRDAsICA4IH0sIHsgMHgwMEQxLCAgOCB9LCB7IDB4MDBEMiwgIDggfSwKKyAgICAgICAgeyAweDAxQTYsICA5IH0sIHsgMHgwMUEzLCAxMCB9LCB7IDB4MDM0RSwgMTAgfSwgeyAweDAwNkEsICA3IH0sCisgICAgICAgIHsgMHgwMEQ2LCAgOCB9LCB7IDB4MDFBRSwgIDkgfSwgeyAweDAxQUYsICA5IH0sIHsgMHgwMzRGLCAxMCB9LAorICAgICAgICB7IDB4MDM0NSwgMTEgfSwgeyAweDAxQjAsICA5IH0sIHsgMHgwMUIxLCAgOSB9LCB7IDB4MDM2NCwgMTAgfSwKKyAgICAgICAgeyAweDAwNkQsICA3IH0sIHsgMHgwMERDLCAgOCB9LCB7IDB4MEQ5NCwgMTIgfSwgeyAweDBEOTUsIDEyIH0sCisgICAgICAgIHsgMHgwMDBFLCAgNCB9LCB7IDB4MDAzQywgIDYgfSwgeyAweDAwREQsICA4IH0sIHsgMHgwMERFLCAgOCB9LAorICAgICAgICB7IDB4MDFCMywgIDkgfSwgeyAweDAwM0QsICA2IH0sIHsgMHgwMERGLCAgOCB9LCB7IDB4MDFGMCwgIDkgfSwKKyAgICAgICAgeyAweDAzRTIsIDEwIH0sIHsgMHgwM0UzLCAxMCB9LCB7IDB4MDZDQiwgMTEgfSwgeyAweDAzRTQsIDEwIH0sCisgICAgICAgIHsgMHgwN0NBLCAxMSB9LCB7IDB4MDFGMywgIDkgfSwgeyAweDAxRjQsICA5IH0sIHsgMHgwN0NCLCAxMSB9LAorICAgICAgICB7IDB4MDdENCwgMTEgfSwgeyAweDFBMjEsIDE0IH0sIHsgMHgxQTIyLCAxNCB9LCB7IDB4MDdENSwgMTEgfSwKKyAgICAgICAgeyAweDFBMjMsIDE0IH0sIHsgMHgwMDNGLCAgNiB9LCB7IDB4MDFGNiwgIDkgfSwgeyAweDAxRjcsICA5IH0sCisgICAgICAgIHsgMHgwM0VCLCAxMCB9LAorICAgIH0sCisgICAgeyAvLyA1CisgICAgICAgIHsgMHgwMDAwLCAgMiB9LCB7IDB4MDAwMiwgIDMgfSwgeyAweDAwMDYsICA0IH0sIHsgMHgwMDBFLCAgNSB9LAorICAgICAgICB7IDB4MDAwRiwgIDUgfSwgeyAweDAwMjAsICA2IH0sIHsgMHgwMDIxLCAgNiB9LCB7IDB4MDA0NCwgIDcgfSwKKyAgICAgICAgeyAweDAwNDUsICA3IH0sIHsgMHgwMDQ2LCAgNyB9LCB7IDB4MDA4RSwgIDggfSwgeyAweDAwOEYsICA4IH0sCisgICAgICAgIHsgMHgwMDkwLCAgOCB9LCB7IDB4MDEyMiwgIDkgfSwgeyAweDAyNDYsIDEwIH0sIHsgMHgwMTI0LCAgOSB9LAorICAgICAgICB7IDB4MDAwNSwgIDMgfSwgeyAweDAwMTMsICA1IH0sIHsgMHgwMDRBLCAgNyB9LCB7IDB4MDA5MywgIDggfSwKKyAgICAgICAgeyAweDAwMTgsICA1IH0sIHsgMHgwMDRCLCAgNyB9LCB7IDB4MDAzMiwgIDYgfSwgeyAweDAwMUEsICA1IH0sCisgICAgICAgIHsgMHgwMDMzLCAgNiB9LCB7IDB4MDA2QywgIDcgfSwgeyAweDAwNkQsICA3IH0sIHsgMHgwMDZFLCAgNyB9LAorICAgICAgICB7IDB4MDBERSwgIDggfSwgeyAweDAwREYsICA4IH0sIHsgMHgwMDcwLCAgNyB9LCB7IDB4MDBFMiwgIDggfSwKKyAgICAgICAgeyAweDAwRTMsICA4IH0sIHsgMHgwMEU0LCAgOCB9LCB7IDB4MDBFNSwgIDggfSwgeyAweDAwRTYsICA4IH0sCisgICAgICAgIHsgMHgwMEU3LCAgOCB9LCB7IDB4MDEyNSwgIDkgfSwgeyAweDAxRDAsICA5IH0sIHsgMHgwNDhFLCAxMSB9LAorICAgICAgICB7IDB4MDkxRSwgMTIgfSwgeyAweDA5MUYsIDEyIH0sIHsgMHg3NDQwLCAxNSB9LCB7IDB4MUQxMSwgMTMgfSwKKyAgICAgICAgeyAweDc0NDEsIDE1IH0sIHsgMHg3NDQyLCAxNSB9LCB7IDB4MDBFOSwgIDggfSwgeyAweDAxRDQsICA5IH0sCisgICAgICAgIHsgMHgwMEVCLCAgOCB9LCB7IDB4MDNBMywgMTAgfSwgeyAweDAxRDUsICA5IH0sIHsgMHgxRDEyLCAxMyB9LAorICAgICAgICB7IDB4MDAxRSwgIDUgfSwgeyAweDAwNzYsICA3IH0sIHsgMHgwMURDLCAgOSB9LCB7IDB4MDFERCwgIDkgfSwKKyAgICAgICAgeyAweDc0NDMsIDE1IH0sIHsgMHgwMDdDLCAgNyB9LCB7IDB4MDc0NSwgMTEgfSwgeyAweDAwRUYsICA4IH0sCisgICAgICAgIHsgMHgwMEZBLCAgOCB9LCB7IDB4MDBGQiwgIDggfSwgeyAweDAxRjgsICA5IH0sIHsgMHgwMEZELCAgOCB9LAorICAgICAgICB7IDB4MDdFNCwgMTEgfSwgeyAweDBGQ0EsIDEyIH0sIHsgMHgxRDEzLCAxMyB9LCB7IDB4N0U1OCwgMTUgfSwKKyAgICAgICAgeyAweDdFNTksIDE1IH0sIHsgMHg3RTVBLCAxNSB9LCB7IDB4N0U1QiwgMTUgfSwgeyAweDdFNUMsIDE1IH0sCisgICAgICAgIHsgMHg3RTVELCAxNSB9LCB7IDB4MDA3RiwgIDcgfSwgeyAweDNGMkYsIDE0IH0sIHsgMHgwN0U2LCAxMSB9LAorICAgICAgICB7IDB4MDdFNywgMTEgfSwKKyAgICB9LAorICAgIHsgLy8gNgorICAgICAgICB7IDB4MDAwMCwgIDMgfSwgeyAweDAwMDIsICA0IH0sIHsgMHgwMDAzLCAgNCB9LCB7IDB4MDAwOCwgIDUgfSwKKyAgICAgICAgeyAweDAwMDksICA1IH0sIHsgMHgwMDE0LCAgNiB9LCB7IDB4MDAxNSwgIDYgfSwgeyAweDAwMkMsICA3IH0sCisgICAgICAgIHsgMHgwMDVBLCAgOCB9LCB7IDB4MDA1QiwgIDggfSwgeyAweDAwNUMsICA4IH0sIHsgMHgwMEJBLCAgOSB9LAorICAgICAgICB7IDB4MDBCQiwgIDkgfSwgeyAweDAwQkMsICA5IH0sIHsgMHgwMkY0LCAxMSB9LCB7IDB4MDVFQSwgMTIgfSwKKyAgICAgICAgeyAweDAwMDMsICAzIH0sIHsgMHgwMDEwLCAgNSB9LCB7IDB4MDAyMiwgIDYgfSwgeyAweDAwNDYsICA3IH0sCisgICAgICAgIHsgMHgwMDA5LCAgNCB9LCB7IDB4MDAyOCwgIDYgfSwgeyAweDAwMTUsICA1IH0sIHsgMHgwMDBCLCAgNCB9LAorICAgICAgICB7IDB4MDAxOCwgIDUgfSwgeyAweDAwMjksICA2IH0sIHsgMHgwMDMyLCAgNiB9LCB7IDB4MDA0NywgIDcgfSwKKyAgICAgICAgeyAweDAwNjYsICA3IH0sIHsgMHgwMDY3LCAgNyB9LCB7IDB4MDA2OCwgIDcgfSwgeyAweDAwNjksICA3IH0sCisgICAgICAgIHsgMHgwMDZBLCAgNyB9LCB7IDB4MDA1RiwgIDggfSwgeyAweDAwRDYsICA4IH0sIHsgMHgwMEQ3LCAgOCB9LAorICAgICAgICB7IDB4MDFCMCwgIDkgfSwgeyAweDAwRDksICA4IH0sIHsgMHgwMTdCLCAxMCB9LCB7IDB4MDA2RCwgIDcgfSwKKyAgICAgICAgeyAweDAwREMsICA4IH0sIHsgMHgwMUIxLCAgOSB9LCB7IDB4MDZFOCwgMTEgfSwgeyAweDAxQkIsICA5IH0sCisgICAgICAgIHsgMHgwMzc1LCAxMCB9LCB7IDB4MDVFQiwgMTIgfSwgeyAweDAxQkMsICA5IH0sIHsgMHg2RTkwLCAxNSB9LAorICAgICAgICB7IDB4MDAzOCwgIDYgfSwgeyAweDAwNzIsICA3IH0sIHsgMHg2RTkxLCAxNSB9LCB7IDB4NkU5MiwgMTUgfSwKKyAgICAgICAgeyAweDAwMUQsICA1IH0sIHsgMHgwMDczLCAgNyB9LCB7IDB4MDFCRCwgIDkgfSwgeyAweDA2RjgsIDExIH0sCisgICAgICAgIHsgMHg2RTkzLCAxNSB9LCB7IDB4MDAzQywgIDYgfSwgeyAweDAxQkYsICA5IH0sIHsgMHgwMEY0LCAgOCB9LAorICAgICAgICB7IDB4MDFFQSwgIDkgfSwgeyAweDAzN0QsIDEwIH0sIHsgMHgwM0Q2LCAxMCB9LCB7IDB4MDZGOSwgMTEgfSwKKyAgICAgICAgeyAweDZFOTQsIDE1IH0sIHsgMHgwMEY2LCAgOCB9LCB7IDB4MDFFRSwgIDkgfSwgeyAweDZFOTUsIDE1IH0sCisgICAgICAgIHsgMHg2RTk2LCAxNSB9LCB7IDB4NkU5NywgMTUgfSwgeyAweDM3NEMsIDE0IH0sIHsgMHgzNzRELCAxNCB9LAorICAgICAgICB7IDB4Mzc0RSwgMTQgfSwgeyAweDAwMUYsICA1IH0sIHsgMHgwM0Q3LCAxMCB9LCB7IDB4MDFFRiwgIDkgfSwKKyAgICAgICAgeyAweDM3NEYsIDE0IH0sCisgICAgfSwKKyAgICB7IC8vIDcKKyAgICAgICAgeyAweDAwMDAsICAyIH0sIHsgMHgwMDA0LCAgNCB9LCB7IDB4MDAwQSwgIDUgfSwgeyAweDAwMTYsICA2IH0sCisgICAgICAgIHsgMHgwMDJFLCAgNyB9LCB7IDB4MDAyRiwgIDcgfSwgeyAweDAwNjAsICA4IH0sIHsgMHgwMDYxLCAgOCB9LAorICAgICAgICB7IDB4MDBDNCwgIDkgfSwgeyAweDAwQzUsICA5IH0sIHsgMHgwMEM2LCAgOSB9LCB7IDB4MDE4RSwgMTAgfSwKKyAgICAgICAgeyAweDMxRTAsIDE1IH0sIHsgMHgzMUUxLCAxNSB9LCB7IDB4MzFFMiwgMTUgfSwgeyAweDMxRTMsIDE1IH0sCisgICAgICAgIHsgMHgwMDA0LCAgMyB9LCB7IDB4MDAwRCwgIDUgfSwgeyAweDAwMTksICA2IH0sIHsgMHgwMDM4LCAgNyB9LAorICAgICAgICB7IDB4MDAwQSwgIDQgfSwgeyAweDAwMUQsICA2IH0sIHsgMHgwMDBCLCAgNCB9LCB7IDB4MDA3MiwgIDggfSwKKyAgICAgICAgeyAweDAwNzMsICA4IH0sIHsgMHgwMEYwLCAgOSB9LCB7IDB4MDFFMiwgMTAgfSwgeyAweDAwRjIsICA5IH0sCisgICAgICAgIHsgMHgwMUUzLCAxMCB9LCB7IDB4MDBGMywgIDkgfSwgeyAweDAxRTgsIDEwIH0sIHsgMHgwMUU5LCAxMCB9LAorICAgICAgICB7IDB4MzFFNCwgMTUgfSwgeyAweDAxRUEsIDEwIH0sIHsgMHgwMzFGLCAxMSB9LCB7IDB4MDNENiwgMTEgfSwKKyAgICAgICAgeyAweDMxRTUsIDE1IH0sIHsgMHgwMUVDLCAxMCB9LCB7IDB4MzFFNiwgMTUgfSwgeyAweDAwRjcsICA5IH0sCisgICAgICAgIHsgMHgwM0Q3LCAxMSB9LCB7IDB4MzFFNywgMTUgfSwgeyAweDMxRTgsIDE1IH0sIHsgMHgwM0RBLCAxMSB9LAorICAgICAgICB7IDB4MDNEQiwgMTEgfSwgeyAweDMxRTksIDE1IH0sIHsgMHgwM0UwLCAxMSB9LCB7IDB4MzFFQSwgMTUgfSwKKyAgICAgICAgeyAweDAwM0YsICA3IH0sIHsgMHgwMUYxLCAxMCB9LCB7IDB4MzFFQiwgMTUgfSwgeyAweDMxRUMsIDE1IH0sCisgICAgICAgIHsgMHgwMDA2LCAgMyB9LCB7IDB4MDAxQywgIDUgfSwgeyAweDAwNzQsICA3IH0sIHsgMHgwMDc1LCAgNyB9LAorICAgICAgICB7IDB4MDBGOSwgIDkgfSwgeyAweDAwMUUsICA1IH0sIHsgMHgwMDc2LCAgNyB9LCB7IDB4MDBGQSwgIDkgfSwKKyAgICAgICAgeyAweDAzRTEsIDExIH0sIHsgMHgzMUVELCAxNSB9LCB7IDB4MThGNywgMTQgfSwgeyAweDFGNjAsIDE0IH0sCisgICAgICAgIHsgMHgxRjYxLCAxNCB9LCB7IDB4MDFEQywgIDkgfSwgeyAweDAxREQsICA5IH0sIHsgMHgxRjYyLCAxNCB9LAorICAgICAgICB7IDB4MUY2MywgMTQgfSwgeyAweDFGNjQsIDE0IH0sIHsgMHgxRjY1LCAxNCB9LCB7IDB4MUY2NiwgMTQgfSwKKyAgICAgICAgeyAweDFGNjcsIDE0IH0sIHsgMHgwMDFGLCAgNSB9LCB7IDB4MDNFRCwgMTEgfSwgeyAweDAwRUYsICA4IH0sCisgICAgICAgIHsgMHgwMUY3LCAxMCB9LAorICAgIH0sCiB9OwogCi1zdGF0aWMgY29uc3QgdWludDE2X3QgeDhfYWMxX2hpZ2hxdWFudF90YWJsZVs4XVs3N11bMl09ewotICAgIHsvLzAKLSAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDYsICA1fSwgezB4MDAwNywgIDV9LAotICAgICAgICB7MHgwMDA4LCAgNX0sIHsweDAwMDksICA1fSwgezB4MDAxNCwgIDZ9LCB7MHgwMDJBLCAgN30sCi0gICAgICAgIHsweDAwMTYsICA2fSwgezB4MDAyQiwgIDd9LCB7MHgwMDVDLCAgOH0sIHsweDAwMkYsICA3fSwKLSAgICAgICAgezB4MDAzMCwgIDd9LCB7MHgwMDVELCAgOH0sIHsweDAwNjIsICA4fSwgezB4MDBDNiwgIDl9LAotICAgICAgICB7MHgwMDA3LCAgNH0sIHsweDAwMTksICA2fSwgezB4MDAxQSwgIDZ9LCB7MHgwMDM2LCAgN30sCi0gICAgICAgIHsweDAwMTAsICA1fSwgezB4MDA2RSwgIDh9LCB7MHgwMDIyLCAgNn0sIHsweDAwMDksICA0fSwKLSAgICAgICAgezB4MDAwQSwgIDR9LCB7MHgwMDE2LCAgNX0sIHsweDAwMjMsICA2fSwgezB4MDAyRSwgIDZ9LAotICAgICAgICB7MHgwMDJGLCAgNn0sIHsweDAwMzAsICA2fSwgezB4MDA2MiwgIDd9LCB7MHgwMDYzLCAgN30sCi0gICAgICAgIHsweDAwNjQsICA3fSwgezB4MDA2NSwgIDd9LCB7MHgwMDY2LCAgN30sIHsweDAwNjcsICA3fSwKLSAgICAgICAgezB4MDA2OCwgIDd9LCB7MHgwMDY5LCAgN30sIHsweDAwNkEsICA3fSwgezB4MDA2QiwgIDd9LAotICAgICAgICB7MHgwMDZDLCAgN30sIHsweDAwQzcsICA5fSwgezB4MDBERSwgIDl9LCB7MHgwMERGLCAgOX0sCi0gICAgICAgIHsweDA2RDAsIDExfSwgezB4MDFCNSwgIDl9LCB7MHgwMDM3LCAgNn0sIHsweDAwREIsICA4fSwKLSAgICAgICAgezB4MDAxQywgIDV9LCB7MHgwMDc0LCAgN30sIHsweDAxRDQsICA5fSwgezB4MDFENSwgIDl9LAotICAgICAgICB7MHgwMDc2LCAgN30sIHsweDAzNjksIDEwfSwgezB4MzY4OCwgMTR9LCB7MHgzNjg5LCAxNH0sCi0gICAgICAgIHsweDM2OEEsIDE0fSwgezB4MDA3NywgIDd9LCB7MHgwM0FDLCAxMH0sIHsweDAwNzgsICA3fSwKLSAgICAgICAgezB4MDBGMiwgIDh9LCB7MHgwMUQ3LCAgOX0sIHsweDAwRjMsICA4fSwgezB4MDA3QSwgIDd9LAotICAgICAgICB7MHgzNjhCLCAxNH0sIHsweDAwN0IsICA3fSwgezB4MDA3QywgIDd9LCB7MHgwM0FELCAxMH0sCi0gICAgICAgIHsweDAzRTgsIDEwfSwgezB4MzY4QywgMTR9LCB7MHgzNjhELCAxNH0sIHsweDAzRTksIDEwfSwKLSAgICAgICAgezB4MzY4RSwgMTR9LCB7MHgwMDNGLCAgNn0sIHsweDAxRjUsICA5fSwgezB4MDBGQiwgIDh9LAotICAgICAgICB7MHgzNjhGLCAxNH0sCi0gICAgfSx7Ly8xCi0gICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwNCwgIDR9LCB7MHgwMDBBLCAgNX0sIHsweDAwMEIsICA1fSwKLSAgICAgICAgezB4MDAxOCwgIDZ9LCB7MHgwMDMyLCAgN30sIHsweDAwMzMsICA3fSwgezB4MDAzNCwgIDd9LAotICAgICAgICB7MHgwMDZBLCAgOH0sIHsweDAwRDYsICA5fSwgezB4MDBENywgIDl9LCB7MHgwMEQ4LCAgOX0sCi0gICAgICAgIHsweDAwRDksICA5fSwgezB4MzY4MCwgMTV9LCB7MHgwMUI1LCAxMH0sIHsweDAzNjksIDExfSwKLSAgICAgICAgezB4MDAwNCwgIDN9LCB7MHgwMDBFLCAgNX0sIHsweDAwMUUsICA2fSwgezB4MDAzNywgIDd9LAotICAgICAgICB7MHgwMDBBLCAgNH0sIHsweDAwMTYsICA1fSwgezB4MDAwQywgIDR9LCB7MHgwMDFGLCAgNn0sCi0gICAgICAgIHsweDAwNUMsICA3fSwgezB4MDA1RCwgIDd9LCB7MHgwMEJDLCAgOH0sIHsweDAwQkQsICA4fSwKLSAgICAgICAgezB4MDA1RiwgIDd9LCB7MHgwMEQwLCAgOH0sIHsweDAwREIsICA5fSwgezB4MDBEMSwgIDh9LAotICAgICAgICB7MHgwMUE0LCAgOX0sIHsweDAxQTUsICA5fSwgezB4MDFBNiwgIDl9LCB7MHgwMUE3LCAgOX0sCi0gICAgICAgIHsweDAzNTAsIDEwfSwgezB4MDZBMiwgMTF9LCB7MHgwNkEzLCAxMX0sIHsweDAxQTksICA5fSwKLSAgICAgICAgezB4MDFBQSwgIDl9LCB7MHgwNkFDLCAxMX0sIHsweDM2ODEsIDE1fSwgezB4MDM1NywgMTB9LAotICAgICAgICB7MHgzNjgyLCAxNX0sIHsweDM2ODMsIDE1fSwgezB4MzY4NCwgMTV9LCB7MHgzNjg1LCAxNX0sCi0gICAgICAgIHsweDAwMzYsICA2fSwgezB4MDBENiwgIDh9LCB7MHgzNjg2LCAxNX0sIHsweDM2ODcsIDE1fSwKLSAgICAgICAgezB4MDAwRSwgIDR9LCB7MHgwMDZFLCAgN30sIHsweDAwRDcsICA4fSwgezB4MDZBRCwgMTF9LAotICAgICAgICB7MHgzNjg4LCAxNX0sIHsweDAwMUUsICA1fSwgezB4MDBERSwgIDh9LCB7MHgwNkY4LCAxMX0sCi0gICAgICAgIHsweDAzN0QsIDEwfSwgezB4MzY4OSwgMTV9LCB7MHgzNjhBLCAxNX0sIHsweDM2OEIsIDE1fSwKLSAgICAgICAgezB4MzY4QywgMTV9LCB7MHgwMUJGLCAgOX0sIHsweDM2OEQsIDE1fSwgezB4MUI0NywgMTR9LAotICAgICAgICB7MHgzN0M4LCAxNH0sIHsweDM3QzksIDE0fSwgezB4MzdDQSwgMTR9LCB7MHgzN0NCLCAxNH0sCi0gICAgICAgIHsweDM3Q0MsIDE0fSwgezB4MDAxRiwgIDV9LCB7MHgzN0NELCAxNH0sIHsweDM3Q0UsIDE0fSwKLSAgICAgICAgezB4MzdDRiwgMTR9LAotICAgIH0sey8vMgotICAgICAgICB7MHgwMDAwLCAgM30sIHsweDAwMDIsICA0fSwgezB4MDAwMywgIDR9LCB7MHgwMDA4LCAgNX0sCi0gICAgICAgIHsweDAwMTIsICA2fSwgezB4MDAyNiwgIDd9LCB7MHgwMDE0LCAgNn0sIHsweDAwMjcsICA3fSwKLSAgICAgICAgezB4MDBBOCwgIDl9LCB7MHgwMEE5LCAgOX0sIHsweDAwNTUsICA4fSwgezB4MkIwMCwgMTV9LAotICAgICAgICB7MHgwMEFELCAgOX0sIHsweDJCMDEsIDE1fSwgezB4MkIwMiwgMTV9LCB7MHgyQjAzLCAxNX0sCi0gICAgICAgIHsweDAwMDMsICAzfSwgezB4MDAwQiwgIDV9LCB7MHgwMDQwLCAgN30sIHsweDAwNDEsICA3fSwKLSAgICAgICAgezB4MDAwOSwgIDR9LCB7MHgwMDIxLCAgNn0sIHsweDAwMTEsICA1fSwgezB4MDAwQSwgIDR9LAotICAgICAgICB7MHgwMDBCLCAgNH0sIHsweDAwMTgsICA1fSwgezB4MDAzMiwgIDZ9LCB7MHgwMDMzLCAgNn0sCi0gICAgICAgIHsweDAwMzQsICA2fSwgezB4MDAzNSwgIDZ9LCB7MHgwMDZDLCAgN30sIHsweDAwNTcsICA4fSwKLSAgICAgICAgezB4MDA2RCwgIDd9LCB7MHgwMERDLCAgOH0sIHsweDAxNTksIDEwfSwgezB4MDBERCwgIDh9LAotICAgICAgICB7MHgwMUJDLCAgOX0sIHsweDAzN0EsIDEwfSwgezB4MDM3QiwgMTB9LCB7MHgwMDM4LCAgNn0sCi0gICAgICAgIHsweDAwNzIsICA3fSwgezB4MDFCRSwgIDl9LCB7MHgwMUJGLCAgOX0sIHsweDAwRTYsICA4fSwKLSAgICAgICAgezB4MDM5QywgMTB9LCB7MHgwMUNGLCAgOX0sIHsweDJCMDQsIDE1fSwgezB4MkIwNSwgMTV9LAotICAgICAgICB7MHgwMDc0LCAgN30sIHsweDAxRDQsICA5fSwgezB4MkIwNiwgMTV9LCB7MHgyQjA3LCAxNX0sCi0gICAgICAgIHsweDAwMUUsICA1fSwgezB4MDBFQiwgIDh9LCB7MHgxNTg0LCAxNH0sIHsweDE1ODUsIDE0fSwKLSAgICAgICAgezB4MTU4NiwgMTR9LCB7MHgwMDNCLCAgNn0sIHsweDAxRDUsICA5fSwgezB4MDFGMCwgIDl9LAotICAgICAgICB7MHgwMzlELCAxMH0sIHsweDAzRTIsIDEwfSwgezB4MTU4NywgMTR9LCB7MHgxNTg4LCAxNH0sCi0gICAgICAgIHsweDE1ODksIDE0fSwgezB4MDBGOSwgIDh9LCB7MHgxNThBLCAxNH0sIHsweDE1OEIsIDE0fSwKLSAgICAgICAgezB4MDNFMywgMTB9LCB7MHgxNThDLCAxNH0sIHsweDE1OEQsIDE0fSwgezB4MDFGNCwgIDl9LAotICAgICAgICB7MHgxNThFLCAxNH0sIHsweDAwM0YsICA2fSwgezB4MDBGQiwgIDh9LCB7MHgwMUY1LCAgOX0sCi0gICAgICAgIHsweDE1OEYsIDE0fSwKLSAgICB9LHsvLzMKLSAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDYsICA1fSwgezB4MDAwNywgIDV9LAotICAgICAgICB7MHgwMDEwLCAgNn0sIHsweDAwMTEsICA2fSwgezB4MDAyNCwgIDd9LCB7MHgwMDI1LCAgN30sCi0gICAgICAgIHsweDAwMTMsICA2fSwgezB4MDAxNCwgIDZ9LCB7MHgwMDJBLCAgN30sIHsweDAwMkIsICA3fSwKLSAgICAgICAgezB4MDBCMCwgIDl9LCB7MHgwMEIxLCAgOX0sIHsweDAwMkQsICA3fSwgezB4MDA1OSwgIDh9LAotICAgICAgICB7MHgwMDBDLCAgNX0sIHsweDAwMTcsICA2fSwgezB4MDBEMCwgIDl9LCB7MHgwMDM1LCAgN30sCi0gICAgICAgIHsweDAwMUIsICA2fSwgezB4MDAzOCwgIDd9LCB7MHgwMDM5LCAgN30sIHsweDAwMDQsICAzfSwKLSAgICAgICAgezB4MDAwNSwgIDN9LCB7MHgwMDBGLCAgNX0sIHsweDAwMTgsICA1fSwgezB4MDAxRCwgIDZ9LAotICAgICAgICB7MHgwMDMyLCAgNn0sIHsweDAwMzMsICA2fSwgezB4MDA2OCwgIDd9LCB7MHgwMDY5LCAgN30sCi0gICAgICAgIHsweDAwNjksICA4fSwgezB4MDBENCwgIDh9LCB7MHgwMEQ1LCAgOH0sIHsweDAwRDYsICA4fSwKLSAgICAgICAgezB4MDA2QywgIDd9LCB7MHgwMDM3LCAgNn0sIHsweDAwNkQsICA3fSwgezB4MDA3MCwgIDd9LAotICAgICAgICB7MHgwMDM5LCAgNn0sIHsweDAwRDcsICA4fSwgezB4MDBEMSwgIDl9LCB7MHgzODgwLCAxNH0sCi0gICAgICAgIHsweDM4ODEsIDE0fSwgezB4Mzg4MiwgMTR9LCB7MHgwMDc0LCAgN30sIHsweDAxQzUsICA5fSwKLSAgICAgICAgezB4MDA3NSwgIDd9LCB7MHgwMEUzLCAgOH0sIHsweDM4ODMsIDE0fSwgezB4Mzg4NCwgMTR9LAotICAgICAgICB7MHgwMEVDLCAgOH0sIHsweDM4ODUsIDE0fSwgezB4MUM0MywgMTN9LCB7MHgxQzQ0LCAxM30sCi0gICAgICAgIHsweDFDNDUsIDEzfSwgezB4MDBFRCwgIDh9LCB7MHgxQzQ2LCAxM30sIHsweDAwM0MsICA2fSwKLSAgICAgICAgezB4MDA3NywgIDd9LCB7MHgwMUU4LCAgOX0sIHsweDAwM0UsICA2fSwgezB4MDA3QiwgIDd9LAotICAgICAgICB7MHgxQzQ3LCAxM30sIHsweDAwN0UsICA3fSwgezB4MDA3RiwgIDd9LCB7MHgxQzQ4LCAxM30sCi0gICAgICAgIHsweDFDNDksIDEzfSwgezB4MUM0QSwgMTN9LCB7MHgxQzRCLCAxM30sIHsweDFDNEMsIDEzfSwKLSAgICAgICAgezB4MUM0RCwgMTN9LCB7MHgwMEY1LCAgOH0sIHsweDFDNEUsIDEzfSwgezB4MDFFOSwgIDl9LAotICAgICAgICB7MHgxQzRGLCAxM30sCi0gICAgfSx7Ly80Ci0gICAgICAgIHsweDAwMDAsICAyfSwgezB4MDAwNCwgIDR9LCB7MHgwMDBBLCAgNX0sIHsweDAwMEIsICA1fSwKLSAgICAgICAgezB4MDAxOCwgIDZ9LCB7MHgwMDE5LCAgNn0sIHsweDAwMzQsICA3fSwgezB4MDAzNSwgIDd9LAotICAgICAgICB7MHgwMDM2LCAgN30sIHsweDAwNkUsICA4fSwgezB4MDBERSwgIDl9LCB7MHgwMERGLCAgOX0sCi0gICAgICAgIHsweDAxQzAsIDEwfSwgezB4MDFDMSwgMTB9LCB7MHgwMUMyLCAxMH0sIHsweDM4NjAsIDE1fSwKLSAgICAgICAgezB4MDAwNCwgIDN9LCB7MHgwMDBGLCAgNX0sIHsweDAwMUQsICA2fSwgezB4MDAzOSwgIDd9LAotICAgICAgICB7MHgwMDBBLCAgNH0sIHsweDAwMkMsICA2fSwgezB4MDAyRCwgIDZ9LCB7MHgwMDBDLCAgNH0sCi0gICAgICAgIHsweDAwMTcsICA1fSwgezB4MDAzNCwgIDZ9LCB7MHgwMDM1LCAgNn0sIHsweDAwMzYsICA2fSwKLSAgICAgICAgezB4MDA2RSwgIDd9LCB7MHgwMDZGLCAgN30sIHsweDAwNzAsICA3fSwgezB4MDA3MSwgIDd9LAotICAgICAgICB7MHgwMDcxLCAgOH0sIHsweDAwRTQsICA4fSwgezB4MDBFNSwgIDh9LCB7MHgwMEU2LCAgOH0sCi0gICAgICAgIHsweDAwRTcsICA4fSwgezB4MDBFOCwgIDh9LCB7MHgwM0E0LCAxMH0sIHsweDAwNzUsICA3fSwKLSAgICAgICAgezB4MDBFQywgIDh9LCB7MHgwMUQzLCAgOX0sIHsweDAxREEsICA5fSwgezB4MDNBNSwgMTB9LAotICAgICAgICB7MHgwM0I2LCAxMH0sIHsweDA3MEQsIDEyfSwgezB4MDNCNywgMTB9LCB7MHgwNzBFLCAxMn0sCi0gICAgICAgIHsweDAwM0MsICA2fSwgezB4MDBFRSwgIDh9LCB7MHgzODYxLCAxNX0sIHsweDM4NjIsIDE1fSwKLSAgICAgICAgezB4MDAzRCwgIDZ9LCB7MHgwMURFLCAgOX0sIHsweDM4NjMsIDE1fSwgezB4Mzg2NCwgMTV9LAotICAgICAgICB7MHgzODY1LCAxNX0sIHsweDAwN0MsICA3fSwgezB4MDcwRiwgMTJ9LCB7MHgwM0JFLCAxMH0sCi0gICAgICAgIHsweDAzQkYsIDEwfSwgezB4Mzg2NiwgMTV9LCB7MHgwRkEwLCAxMn0sIHsweDA3RDEsIDExfSwKLSAgICAgICAgezB4Mzg2NywgMTV9LCB7MHgwMEZCLCAgOH0sIHsweDAxRjUsICA5fSwgezB4N0QwOCwgMTV9LAotICAgICAgICB7MHgwRkE0LCAxMn0sIHsweDdEMDksIDE1fSwgezB4N0QwQSwgMTV9LCB7MHg3RDBCLCAxNX0sCi0gICAgICAgIHsweDNFODYsIDE0fSwgezB4MDAzRiwgIDZ9LCB7MHgwRkE1LCAxMn0sIHsweDA3RDMsIDExfSwKLSAgICAgICAgezB4M0U4NywgMTR9LAotICAgIH0sey8vNQotICAgICAgICB7MHgwMDAwLCAgM30sIHsweDAwMDIsICA0fSwgezB4MDAwMywgIDR9LCB7MHgwMDA4LCAgNX0sCi0gICAgICAgIHsweDAwMDksICA1fSwgezB4MDAxNCwgIDZ9LCB7MHgwMDJBLCAgN30sIHsweDAwNTYsICA4fSwKLSAgICAgICAgezB4MDJCOCwgMTF9LCB7MHgwMEFGLCAgOX0sIHsweDAyQjksIDExfSwgezB4MDE1RCwgMTB9LAotICAgICAgICB7MHgwMkMwLCAxMX0sIHsweDJDMTAsIDE1fSwgezB4MkMxMSwgMTV9LCB7MHgyQzEyLCAxNX0sCi0gICAgICAgIHsweDAwMDYsICA0fSwgezB4MDAwRSwgIDV9LCB7MHgwMDE3LCAgNn0sIHsweDAwMkQsICA3fSwKLSAgICAgICAgezB4MDAwRiwgIDV9LCB7MHgwMDQwLCAgN30sIHsweDAwMjEsICA2fSwgezB4MDAwNSwgIDN9LAotICAgICAgICB7MHgwMDA5LCAgNH0sIHsweDAwMTEsICA1fSwgezB4MDAxOCwgIDV9LCB7MHgwMDE5LCAgNX0sCi0gICAgICAgIHsweDAwMUEsICA1fSwgezB4MDAzNiwgIDZ9LCB7MHgwMDM3LCAgNn0sIHsweDAwNDEsICA3fSwKLSAgICAgICAgezB4MDA1OSwgIDh9LCB7MHgwMEUwLCAgOH0sIHsweDAwRTEsICA4fSwgezB4MDA3MSwgIDd9LAotICAgICAgICB7MHgwMEU0LCAgOH0sIHsweDAwQjEsICA5fSwgezB4MDJDMiwgMTF9LCB7MHgwMDFELCAgNX0sCi0gICAgICAgIHsweDAwNzMsICA3fSwgezB4MDBFNSwgIDh9LCB7MHgwMEYwLCAgOH0sIHsweDAwNzksICA3fSwKLSAgICAgICAgezB4MDNDNCwgMTB9LCB7MHgwMUUzLCAgOX0sIHsweDAxRTgsICA5fSwgezB4MkMxMywgMTV9LAotICAgICAgICB7MHgwMDdCLCAgN30sIHsweDJDMTQsIDE1fSwgezB4MkMxNSwgMTV9LCB7MHgyQzE2LCAxNX0sCi0gICAgICAgIHsweDAwN0MsICA3fSwgezB4MDJDMywgMTF9LCB7MHgyQzE3LCAxNX0sIHsweDE2MEMsIDE0fSwKLSAgICAgICAgezB4MTYwRCwgMTR9LCB7MHgwMDdELCAgN30sIHsweDE2MEUsIDE0fSwgezB4MDFFOSwgIDl9LAotICAgICAgICB7MHgwM0M1LCAxMH0sIHsweDAzRDQsIDEwfSwgezB4MDFFQiwgIDl9LCB7MHgxNjBGLCAxNH0sCi0gICAgICAgIHsweDNENTAsIDE0fSwgezB4MDBGQywgIDh9LCB7MHgwN0FCLCAxMX0sIHsweDNENTEsIDE0fSwKLSAgICAgICAgezB4M0Q1MiwgMTR9LCB7MHgzRDUzLCAxNH0sIHsweDNENTQsIDE0fSwgezB4MDFGQSwgIDl9LAotICAgICAgICB7MHgzRDU1LCAxNH0sIHsweDAwN0YsICA3fSwgezB4MDFGQiwgIDl9LCB7MHgzRDU2LCAxNH0sCi0gICAgICAgIHsweDNENTcsIDE0fSwKLSAgICB9LHsvLzYKLSAgICAgICAgezB4MDAwMCwgIDN9LCB7MHgwMDAyLCAgNH0sIHsweDAwMDMsICA0fSwgezB4MDAwOCwgIDV9LAotICAgICAgICB7MHgwMDA5LCAgNX0sIHsweDAwMEEsICA1fSwgezB4MDAwQiwgIDV9LCB7MHgwMDE4LCAgNn0sCi0gICAgICAgIHsweDAwMzIsICA3fSwgezB4MDAwRCwgIDV9LCB7MHgwMDMzLCAgN30sIHsweDBFMDAsIDEzfSwKLSAgICAgICAgezB4MDAzOSwgIDd9LCB7MHgwRTAxLCAxM30sIHsweDAwM0EsICA3fSwgezB4MEUwMiwgMTN9LAotICAgICAgICB7MHgwMDA4LCAgNH0sIHsweDAwMUUsICA2fSwgezB4MDAzQiwgIDd9LCB7MHgwMDNFLCAgN30sCi0gICAgICAgIHsweDAwMTIsICA1fSwgezB4MDAzRiwgIDd9LCB7MHgwMDEzLCAgNX0sIHsweDAwMjgsICA2fSwKLSAgICAgICAgezB4MDAyOSwgIDZ9LCB7MHgwMDU0LCAgN30sIHsweDAwMkIsICA2fSwgezB4MDA1NSwgIDd9LAotICAgICAgICB7MHgwMDU4LCAgN30sIHsweDBFMDMsIDEzfSwgezB4MDA1OSwgIDd9LCB7MHgwMDVBLCAgN30sCi0gICAgICAgIHsweDBFMDQsIDEzfSwgezB4MEUwNSwgMTN9LCB7MHgwNzAzLCAxMn0sIHsweDAwNUIsICA3fSwKLSAgICAgICAgezB4MDA1QywgIDd9LCB7MHgwNzA0LCAxMn0sIHsweDA3MDUsIDEyfSwgezB4MDA1RCwgIDd9LAotICAgICAgICB7MHgwNzA2LCAxMn0sIHsweDA3MDcsIDEyfSwgezB4MDcwOCwgMTJ9LCB7MHgwNzA5LCAxMn0sCi0gICAgICAgIHsweDA3MEEsIDEyfSwgezB4MDcwQiwgMTJ9LCB7MHgwMDE4LCAgNX0sIHsweDAwMkYsICA2fSwKLSAgICAgICAgezB4MDAwRCwgIDR9LCB7MHgwMDE5LCAgNX0sIHsweDA3MEMsIDEyfSwgezB4MDA3MCwgIDd9LAotICAgICAgICB7MHgwMDFELCAgNX0sIHsweDA3MEQsIDEyfSwgezB4MDcwRSwgMTJ9LCB7MHgwNzBGLCAxMn0sCi0gICAgICAgIHsweDA3MTAsIDEyfSwgezB4MDAzOSwgIDZ9LCB7MHgwNzExLCAxMn0sIHsweDAwM0MsICA2fSwKLSAgICAgICAgezB4MDcxMiwgMTJ9LCB7MHgwNzEzLCAxMn0sIHsweDA3MTQsIDEyfSwgezB4MDcxNSwgMTJ9LAotICAgICAgICB7MHgwNzE2LCAxMn0sIHsweDAwM0QsICA2fSwgezB4MDcxNywgMTJ9LCB7MHgwNzE4LCAxMn0sCi0gICAgICAgIHsweDA3MTksIDEyfSwgezB4MDcxQSwgMTJ9LCB7MHgwNzFCLCAxMn0sIHsweDA3MUMsIDEyfSwKLSAgICAgICAgezB4MDcxRCwgMTJ9LCB7MHgwMDFGLCAgNX0sIHsweDA3MUUsIDEyfSwgezB4MDA3MSwgIDd9LAotICAgICAgICB7MHgwNzFGLCAxMn0sCi0gICAgfSx7Ly83Ci0gICAgICAgIHsweDAwMDAsICAzfSwgezB4MDAwMiwgIDR9LCB7MHgwMDA2LCAgNX0sIHsweDAwMEUsICA2fSwKLSAgICAgICAgezB4MDAwRiwgIDZ9LCB7MHgwMDQwLCAgOH0sIHsweDAwNDEsICA4fSwgezB4MDA0MiwgIDh9LAotICAgICAgICB7MHgwMjE4LCAxMX0sIHsweDIxOTAsIDE1fSwgezB4MjE5MSwgMTV9LCB7MHgyMTkyLCAxNX0sCi0gICAgICAgIHsweDIxOTMsIDE1fSwgezB4MjE5NCwgMTV9LCB7MHgyMTk1LCAxNX0sIHsweDIxOTYsIDE1fSwKLSAgICAgICAgezB4MDAwNSwgIDR9LCB7MHgwMDExLCAgNn0sIHsweDAwMjQsICA3fSwgezB4MDA4NywgIDl9LAotICAgICAgICB7MHgwMDBDLCAgNX0sIHsweDAwNEEsICA4fSwgezB4MDA0QiwgIDh9LCB7MHgwMDAyLCAgMn0sCi0gICAgICAgIHsweDAwMDYsICAzfSwgezB4MDAwRCwgIDV9LCB7MHgwMDBFLCAgNX0sIHsweDAwMEYsICA1fSwKLSAgICAgICAgezB4MDAxMywgIDZ9LCB7MHgwMDM4LCAgNn0sIHsweDAwRTQsICA4fSwgezB4MDBFNSwgIDh9LAotICAgICAgICB7MHgwMUNDLCAgOX0sIHsweDAwRTcsICA4fSwgezB4MDA3NCwgIDd9LCB7MHgwMEVBLCAgOH0sCi0gICAgICAgIHsweDAxQ0QsICA5fSwgezB4MDIxQSwgMTF9LCB7MHgyMTk3LCAxNX0sIHsweDAwMUUsICA1fSwKLSAgICAgICAgezB4MDA3NiwgIDd9LCB7MHgwMEVCLCAgOH0sIHsweDAxREMsICA5fSwgezB4MDBFRiwgIDh9LAotICAgICAgICB7MHgwMURELCAgOX0sIHsweDAxRjAsICA5fSwgezB4MjE5OCwgMTV9LCB7MHgyMTk5LCAxNX0sCi0gICAgICAgIHsweDAwRjksICA4fSwgezB4MDNFMiwgMTB9LCB7MHgyMTlBLCAxNX0sIHsweDIxOUIsIDE1fSwKLSAgICAgICAgezB4MDBGQSwgIDh9LCB7MHgyMTlDLCAxNX0sIHsweDIxOUQsIDE1fSwgezB4MjE5RSwgMTV9LAotICAgICAgICB7MHgyMTlGLCAxNX0sIHsweDAxRjYsICA5fSwgezB4MjFCMCwgMTV9LCB7MHgwMEZDLCAgOH0sCi0gICAgICAgIHsweDAxRjcsICA5fSwgezB4MjFCMSwgMTV9LCB7MHgyMUIyLCAxNX0sIHsweDIxQjMsIDE1fSwKLSAgICAgICAgezB4MjFCNCwgMTV9LCB7MHgwMUZBLCAgOX0sIHsweDIxQjUsIDE1fSwgezB4MjFCNiwgMTV9LAotICAgICAgICB7MHgyMUI3LCAxNX0sIHsweDIxQjgsIDE1fSwgezB4MjFCOSwgMTV9LCB7MHgwM0UzLCAxMH0sCi0gICAgICAgIHsweDEwREQsIDE0fSwgezB4MDA3RiwgIDd9LCB7MHgwMUZCLCAgOX0sIHsweDEwREUsIDE0fSwKLSAgICAgICAgezB4MTBERiwgMTR9LAotICAgIH0KK3N0YXRpYyBjb25zdCB1aW50MTZfdCB4OF9hYzFfaGlnaHF1YW50X3RhYmxlWzhdWzc3XVsyXSA9IHsKKyAgICB7IC8vIDAKKyAgICAgICAgeyAweDAwMDAsICAzIH0sIHsgMHgwMDAyLCAgNCB9LCB7IDB4MDAwNiwgIDUgfSwgeyAweDAwMDcsICA1IH0sCisgICAgICAgIHsgMHgwMDA4LCAgNSB9LCB7IDB4MDAwOSwgIDUgfSwgeyAweDAwMTQsICA2IH0sIHsgMHgwMDJBLCAgNyB9LAorICAgICAgICB7IDB4MDAxNiwgIDYgfSwgeyAweDAwMkIsICA3IH0sIHsgMHgwMDVDLCAgOCB9LCB7IDB4MDAyRiwgIDcgfSwKKyAgICAgICAgeyAweDAwMzAsICA3IH0sIHsgMHgwMDVELCAgOCB9LCB7IDB4MDA2MiwgIDggfSwgeyAweDAwQzYsICA5IH0sCisgICAgICAgIHsgMHgwMDA3LCAgNCB9LCB7IDB4MDAxOSwgIDYgfSwgeyAweDAwMUEsICA2IH0sIHsgMHgwMDM2LCAgNyB9LAorICAgICAgICB7IDB4MDAxMCwgIDUgfSwgeyAweDAwNkUsICA4IH0sIHsgMHgwMDIyLCAgNiB9LCB7IDB4MDAwOSwgIDQgfSwKKyAgICAgICAgeyAweDAwMEEsICA0IH0sIHsgMHgwMDE2LCAgNSB9LCB7IDB4MDAyMywgIDYgfSwgeyAweDAwMkUsICA2IH0sCisgICAgICAgIHsgMHgwMDJGLCAgNiB9LCB7IDB4MDAzMCwgIDYgfSwgeyAweDAwNjIsICA3IH0sIHsgMHgwMDYzLCAgNyB9LAorICAgICAgICB7IDB4MDA2NCwgIDcgfSwgeyAweDAwNjUsICA3IH0sIHsgMHgwMDY2LCAgNyB9LCB7IDB4MDA2NywgIDcgfSwKKyAgICAgICAgeyAweDAwNjgsICA3IH0sIHsgMHgwMDY5LCAgNyB9LCB7IDB4MDA2QSwgIDcgfSwgeyAweDAwNkIsICA3IH0sCisgICAgICAgIHsgMHgwMDZDLCAgNyB9LCB7IDB4MDBDNywgIDkgfSwgeyAweDAwREUsICA5IH0sIHsgMHgwMERGLCAgOSB9LAorICAgICAgICB7IDB4MDZEMCwgMTEgfSwgeyAweDAxQjUsICA5IH0sIHsgMHgwMDM3LCAgNiB9LCB7IDB4MDBEQiwgIDggfSwKKyAgICAgICAgeyAweDAwMUMsICA1IH0sIHsgMHgwMDc0LCAgNyB9LCB7IDB4MDFENCwgIDkgfSwgeyAweDAxRDUsICA5IH0sCisgICAgICAgIHsgMHgwMDc2LCAgNyB9LCB7IDB4MDM2OSwgMTAgfSwgeyAweDM2ODgsIDE0IH0sIHsgMHgzNjg5LCAxNCB9LAorICAgICAgICB7IDB4MzY4QSwgMTQgfSwgeyAweDAwNzcsICA3IH0sIHsgMHgwM0FDLCAxMCB9LCB7IDB4MDA3OCwgIDcgfSwKKyAgICAgICAgeyAweDAwRjIsICA4IH0sIHsgMHgwMUQ3LCAgOSB9LCB7IDB4MDBGMywgIDggfSwgeyAweDAwN0EsICA3IH0sCisgICAgICAgIHsgMHgzNjhCLCAxNCB9LCB7IDB4MDA3QiwgIDcgfSwgeyAweDAwN0MsICA3IH0sIHsgMHgwM0FELCAxMCB9LAorICAgICAgICB7IDB4MDNFOCwgMTAgfSwgeyAweDM2OEMsIDE0IH0sIHsgMHgzNjhELCAxNCB9LCB7IDB4MDNFOSwgMTAgfSwKKyAgICAgICAgeyAweDM2OEUsIDE0IH0sIHsgMHgwMDNGLCAgNiB9LCB7IDB4MDFGNSwgIDkgfSwgeyAweDAwRkIsICA4IH0sCisgICAgICAgIHsgMHgzNjhGLCAxNCB9LAorICAgIH0sCisgICAgeyAvLyAxCisgICAgICAgIHsgMHgwMDAwLCAgMiB9LCB7IDB4MDAwNCwgIDQgfSwgeyAweDAwMEEsICA1IH0sIHsgMHgwMDBCLCAgNSB9LAorICAgICAgICB7IDB4MDAxOCwgIDYgfSwgeyAweDAwMzIsICA3IH0sIHsgMHgwMDMzLCAgNyB9LCB7IDB4MDAzNCwgIDcgfSwKKyAgICAgICAgeyAweDAwNkEsICA4IH0sIHsgMHgwMEQ2LCAgOSB9LCB7IDB4MDBENywgIDkgfSwgeyAweDAwRDgsICA5IH0sCisgICAgICAgIHsgMHgwMEQ5LCAgOSB9LCB7IDB4MzY4MCwgMTUgfSwgeyAweDAxQjUsIDEwIH0sIHsgMHgwMzY5LCAxMSB9LAorICAgICAgICB7IDB4MDAwNCwgIDMgfSwgeyAweDAwMEUsICA1IH0sIHsgMHgwMDFFLCAgNiB9LCB7IDB4MDAzNywgIDcgfSwKKyAgICAgICAgeyAweDAwMEEsICA0IH0sIHsgMHgwMDE2LCAgNSB9LCB7IDB4MDAwQywgIDQgfSwgeyAweDAwMUYsICA2IH0sCisgICAgICAgIHsgMHgwMDVDLCAgNyB9LCB7IDB4MDA1RCwgIDcgfSwgeyAweDAwQkMsICA4IH0sIHsgMHgwMEJELCAgOCB9LAorICAgICAgICB7IDB4MDA1RiwgIDcgfSwgeyAweDAwRDAsICA4IH0sIHsgMHgwMERCLCAgOSB9LCB7IDB4MDBEMSwgIDggfSwKKyAgICAgICAgeyAweDAxQTQsICA5IH0sIHsgMHgwMUE1LCAgOSB9LCB7IDB4MDFBNiwgIDkgfSwgeyAweDAxQTcsICA5IH0sCisgICAgICAgIHsgMHgwMzUwLCAxMCB9LCB7IDB4MDZBMiwgMTEgfSwgeyAweDA2QTMsIDExIH0sIHsgMHgwMUE5LCAgOSB9LAorICAgICAgICB7IDB4MDFBQSwgIDkgfSwgeyAweDA2QUMsIDExIH0sIHsgMHgzNjgxLCAxNSB9LCB7IDB4MDM1NywgMTAgfSwKKyAgICAgICAgeyAweDM2ODIsIDE1IH0sIHsgMHgzNjgzLCAxNSB9LCB7IDB4MzY4NCwgMTUgfSwgeyAweDM2ODUsIDE1IH0sCisgICAgICAgIHsgMHgwMDM2LCAgNiB9LCB7IDB4MDBENiwgIDggfSwgeyAweDM2ODYsIDE1IH0sIHsgMHgzNjg3LCAxNSB9LAorICAgICAgICB7IDB4MDAwRSwgIDQgfSwgeyAweDAwNkUsICA3IH0sIHsgMHgwMEQ3LCAgOCB9LCB7IDB4MDZBRCwgMTEgfSwKKyAgICAgICAgeyAweDM2ODgsIDE1IH0sIHsgMHgwMDFFLCAgNSB9LCB7IDB4MDBERSwgIDggfSwgeyAweDA2RjgsIDExIH0sCisgICAgICAgIHsgMHgwMzdELCAxMCB9LCB7IDB4MzY4OSwgMTUgfSwgeyAweDM2OEEsIDE1IH0sIHsgMHgzNjhCLCAxNSB9LAorICAgICAgICB7IDB4MzY4QywgMTUgfSwgeyAweDAxQkYsICA5IH0sIHsgMHgzNjhELCAxNSB9LCB7IDB4MUI0NywgMTQgfSwKKyAgICAgICAgeyAweDM3QzgsIDE0IH0sIHsgMHgzN0M5LCAxNCB9LCB7IDB4MzdDQSwgMTQgfSwgeyAweDM3Q0IsIDE0IH0sCisgICAgICAgIHsgMHgzN0NDLCAxNCB9LCB7IDB4MDAxRiwgIDUgfSwgeyAweDM3Q0QsIDE0IH0sIHsgMHgzN0NFLCAxNCB9LAorICAgICAgICB7IDB4MzdDRiwgMTQgfSwKKyAgICB9LAorICAgIHsgLy8gMgorICAgICAgICB7IDB4MDAwMCwgIDMgfSwgeyAweDAwMDIsICA0IH0sIHsgMHgwMDAzLCAgNCB9LCB7IDB4MDAwOCwgIDUgfSwKKyAgICAgICAgeyAweDAwMTIsICA2IH0sIHsgMHgwMDI2LCAgNyB9LCB7IDB4MDAxNCwgIDYgfSwgeyAweDAwMjcsICA3IH0sCisgICAgICAgIHsgMHgwMEE4LCAgOSB9LCB7IDB4MDBBOSwgIDkgfSwgeyAweDAwNTUsICA4IH0sIHsgMHgyQjAwLCAxNSB9LAorICAgICAgICB7IDB4MDBBRCwgIDkgfSwgeyAweDJCMDEsIDE1IH0sIHsgMHgyQjAyLCAxNSB9LCB7IDB4MkIwMywgMTUgfSwKKyAgICAgICAgeyAweDAwMDMsICAzIH0sIHsgMHgwMDBCLCAgNSB9LCB7IDB4MDA0MCwgIDcgfSwgeyAweDAwNDEsICA3IH0sCisgICAgICAgIHsgMHgwMDA5LCAgNCB9LCB7IDB4MDAyMSwgIDYgfSwgeyAweDAwMTEsICA1IH0sIHsgMHgwMDBBLCAgNCB9LAorICAgICAgICB7IDB4MDAwQiwgIDQgfSwgeyAweDAwMTgsICA1IH0sIHsgMHgwMDMyLCAgNiB9LCB7IDB4MDAzMywgIDYgfSwKKyAgICAgICAgeyAweDAwMzQsICA2IH0sIHsgMHgwMDM1LCAgNiB9LCB7IDB4MDA2QywgIDcgfSwgeyAweDAwNTcsICA4IH0sCisgICAgICAgIHsgMHgwMDZELCAgNyB9LCB7IDB4MDBEQywgIDggfSwgeyAweDAxNTksIDEwIH0sIHsgMHgwMERELCAgOCB9LAorICAgICAgICB7IDB4MDFCQywgIDkgfSwgeyAweDAzN0EsIDEwIH0sIHsgMHgwMzdCLCAxMCB9LCB7IDB4MDAzOCwgIDYgfSwKKyAgICAgICAgeyAweDAwNzIsICA3IH0sIHsgMHgwMUJFLCAgOSB9LCB7IDB4MDFCRiwgIDkgfSwgeyAweDAwRTYsICA4IH0sCisgICAgICAgIHsgMHgwMzlDLCAxMCB9LCB7IDB4MDFDRiwgIDkgfSwgeyAweDJCMDQsIDE1IH0sIHsgMHgyQjA1LCAxNSB9LAorICAgICAgICB7IDB4MDA3NCwgIDcgfSwgeyAweDAxRDQsICA5IH0sIHsgMHgyQjA2LCAxNSB9LCB7IDB4MkIwNywgMTUgfSwKKyAgICAgICAgeyAweDAwMUUsICA1IH0sIHsgMHgwMEVCLCAgOCB9LCB7IDB4MTU4NCwgMTQgfSwgeyAweDE1ODUsIDE0IH0sCisgICAgICAgIHsgMHgxNTg2LCAxNCB9LCB7IDB4MDAzQiwgIDYgfSwgeyAweDAxRDUsICA5IH0sIHsgMHgwMUYwLCAgOSB9LAorICAgICAgICB7IDB4MDM5RCwgMTAgfSwgeyAweDAzRTIsIDEwIH0sIHsgMHgxNTg3LCAxNCB9LCB7IDB4MTU4OCwgMTQgfSwKKyAgICAgICAgeyAweDE1ODksIDE0IH0sIHsgMHgwMEY5LCAgOCB9LCB7IDB4MTU4QSwgMTQgfSwgeyAweDE1OEIsIDE0IH0sCisgICAgICAgIHsgMHgwM0UzLCAxMCB9LCB7IDB4MTU4QywgMTQgfSwgeyAweDE1OEQsIDE0IH0sIHsgMHgwMUY0LCAgOSB9LAorICAgICAgICB7IDB4MTU4RSwgMTQgfSwgeyAweDAwM0YsICA2IH0sIHsgMHgwMEZCLCAgOCB9LCB7IDB4MDFGNSwgIDkgfSwKKyAgICAgICAgeyAweDE1OEYsIDE0IH0sCisgICAgfSwKKyAgICB7IC8vIDMKKyAgICAgICAgeyAweDAwMDAsICAzIH0sIHsgMHgwMDAyLCAgNCB9LCB7IDB4MDAwNiwgIDUgfSwgeyAweDAwMDcsICA1IH0sCisgICAgICAgIHsgMHgwMDEwLCAgNiB9LCB7IDB4MDAxMSwgIDYgfSwgeyAweDAwMjQsICA3IH0sIHsgMHgwMDI1LCAgNyB9LAorICAgICAgICB7IDB4MDAxMywgIDYgfSwgeyAweDAwMTQsICA2IH0sIHsgMHgwMDJBLCAgNyB9LCB7IDB4MDAyQiwgIDcgfSwKKyAgICAgICAgeyAweDAwQjAsICA5IH0sIHsgMHgwMEIxLCAgOSB9LCB7IDB4MDAyRCwgIDcgfSwgeyAweDAwNTksICA4IH0sCisgICAgICAgIHsgMHgwMDBDLCAgNSB9LCB7IDB4MDAxNywgIDYgfSwgeyAweDAwRDAsICA5IH0sIHsgMHgwMDM1LCAgNyB9LAorICAgICAgICB7IDB4MDAxQiwgIDYgfSwgeyAweDAwMzgsICA3IH0sIHsgMHgwMDM5LCAgNyB9LCB7IDB4MDAwNCwgIDMgfSwKKyAgICAgICAgeyAweDAwMDUsICAzIH0sIHsgMHgwMDBGLCAgNSB9LCB7IDB4MDAxOCwgIDUgfSwgeyAweDAwMUQsICA2IH0sCisgICAgICAgIHsgMHgwMDMyLCAgNiB9LCB7IDB4MDAzMywgIDYgfSwgeyAweDAwNjgsICA3IH0sIHsgMHgwMDY5LCAgNyB9LAorICAgICAgICB7IDB4MDA2OSwgIDggfSwgeyAweDAwRDQsICA4IH0sIHsgMHgwMEQ1LCAgOCB9LCB7IDB4MDBENiwgIDggfSwKKyAgICAgICAgeyAweDAwNkMsICA3IH0sIHsgMHgwMDM3LCAgNiB9LCB7IDB4MDA2RCwgIDcgfSwgeyAweDAwNzAsICA3IH0sCisgICAgICAgIHsgMHgwMDM5LCAgNiB9LCB7IDB4MDBENywgIDggfSwgeyAweDAwRDEsICA5IH0sIHsgMHgzODgwLCAxNCB9LAorICAgICAgICB7IDB4Mzg4MSwgMTQgfSwgeyAweDM4ODIsIDE0IH0sIHsgMHgwMDc0LCAgNyB9LCB7IDB4MDFDNSwgIDkgfSwKKyAgICAgICAgeyAweDAwNzUsICA3IH0sIHsgMHgwMEUzLCAgOCB9LCB7IDB4Mzg4MywgMTQgfSwgeyAweDM4ODQsIDE0IH0sCisgICAgICAgIHsgMHgwMEVDLCAgOCB9LCB7IDB4Mzg4NSwgMTQgfSwgeyAweDFDNDMsIDEzIH0sIHsgMHgxQzQ0LCAxMyB9LAorICAgICAgICB7IDB4MUM0NSwgMTMgfSwgeyAweDAwRUQsICA4IH0sIHsgMHgxQzQ2LCAxMyB9LCB7IDB4MDAzQywgIDYgfSwKKyAgICAgICAgeyAweDAwNzcsICA3IH0sIHsgMHgwMUU4LCAgOSB9LCB7IDB4MDAzRSwgIDYgfSwgeyAweDAwN0IsICA3IH0sCisgICAgICAgIHsgMHgxQzQ3LCAxMyB9LCB7IDB4MDA3RSwgIDcgfSwgeyAweDAwN0YsICA3IH0sIHsgMHgxQzQ4LCAxMyB9LAorICAgICAgICB7IDB4MUM0OSwgMTMgfSwgeyAweDFDNEEsIDEzIH0sIHsgMHgxQzRCLCAxMyB9LCB7IDB4MUM0QywgMTMgfSwKKyAgICAgICAgeyAweDFDNEQsIDEzIH0sIHsgMHgwMEY1LCAgOCB9LCB7IDB4MUM0RSwgMTMgfSwgeyAweDAxRTksICA5IH0sCisgICAgICAgIHsgMHgxQzRGLCAxMyB9LAorICAgIH0sCisgICAgeyAvLyA0CisgICAgICAgIHsgMHgwMDAwLCAgMiB9LCB7IDB4MDAwNCwgIDQgfSwgeyAweDAwMEEsICA1IH0sIHsgMHgwMDBCLCAgNSB9LAorICAgICAgICB7IDB4MDAxOCwgIDYgfSwgeyAweDAwMTksICA2IH0sIHsgMHgwMDM0LCAgNyB9LCB7IDB4MDAzNSwgIDcgfSwKKyAgICAgICAgeyAweDAwMzYsICA3IH0sIHsgMHgwMDZFLCAgOCB9LCB7IDB4MDBERSwgIDkgfSwgeyAweDAwREYsICA5IH0sCisgICAgICAgIHsgMHgwMUMwLCAxMCB9LCB7IDB4MDFDMSwgMTAgfSwgeyAweDAxQzIsIDEwIH0sIHsgMHgzODYwLCAxNSB9LAorICAgICAgICB7IDB4MDAwNCwgIDMgfSwgeyAweDAwMEYsICA1IH0sIHsgMHgwMDFELCAgNiB9LCB7IDB4MDAzOSwgIDcgfSwKKyAgICAgICAgeyAweDAwMEEsICA0IH0sIHsgMHgwMDJDLCAgNiB9LCB7IDB4MDAyRCwgIDYgfSwgeyAweDAwMEMsICA0IH0sCisgICAgICAgIHsgMHgwMDE3LCAgNSB9LCB7IDB4MDAzNCwgIDYgfSwgeyAweDAwMzUsICA2IH0sIHsgMHgwMDM2LCAgNiB9LAorICAgICAgICB7IDB4MDA2RSwgIDcgfSwgeyAweDAwNkYsICA3IH0sIHsgMHgwMDcwLCAgNyB9LCB7IDB4MDA3MSwgIDcgfSwKKyAgICAgICAgeyAweDAwNzEsICA4IH0sIHsgMHgwMEU0LCAgOCB9LCB7IDB4MDBFNSwgIDggfSwgeyAweDAwRTYsICA4IH0sCisgICAgICAgIHsgMHgwMEU3LCAgOCB9LCB7IDB4MDBFOCwgIDggfSwgeyAweDAzQTQsIDEwIH0sIHsgMHgwMDc1LCAgNyB9LAorICAgICAgICB7IDB4MDBFQywgIDggfSwgeyAweDAxRDMsICA5IH0sIHsgMHgwMURBLCAgOSB9LCB7IDB4MDNBNSwgMTAgfSwKKyAgICAgICAgeyAweDAzQjYsIDEwIH0sIHsgMHgwNzBELCAxMiB9LCB7IDB4MDNCNywgMTAgfSwgeyAweDA3MEUsIDEyIH0sCisgICAgICAgIHsgMHgwMDNDLCAgNiB9LCB7IDB4MDBFRSwgIDggfSwgeyAweDM4NjEsIDE1IH0sIHsgMHgzODYyLCAxNSB9LAorICAgICAgICB7IDB4MDAzRCwgIDYgfSwgeyAweDAxREUsICA5IH0sIHsgMHgzODYzLCAxNSB9LCB7IDB4Mzg2NCwgMTUgfSwKKyAgICAgICAgeyAweDM4NjUsIDE1IH0sIHsgMHgwMDdDLCAgNyB9LCB7IDB4MDcwRiwgMTIgfSwgeyAweDAzQkUsIDEwIH0sCisgICAgICAgIHsgMHgwM0JGLCAxMCB9LCB7IDB4Mzg2NiwgMTUgfSwgeyAweDBGQTAsIDEyIH0sIHsgMHgwN0QxLCAxMSB9LAorICAgICAgICB7IDB4Mzg2NywgMTUgfSwgeyAweDAwRkIsICA4IH0sIHsgMHgwMUY1LCAgOSB9LCB7IDB4N0QwOCwgMTUgfSwKKyAgICAgICAgeyAweDBGQTQsIDEyIH0sIHsgMHg3RDA5LCAxNSB9LCB7IDB4N0QwQSwgMTUgfSwgeyAweDdEMEIsIDE1IH0sCisgICAgICAgIHsgMHgzRTg2LCAxNCB9LCB7IDB4MDAzRiwgIDYgfSwgeyAweDBGQTUsIDEyIH0sIHsgMHgwN0QzLCAxMSB9LAorICAgICAgICB7IDB4M0U4NywgMTQgfSwKKyAgICB9LAorICAgIHsgLy8gNQorICAgICAgICB7IDB4MDAwMCwgIDMgfSwgeyAweDAwMDIsICA0IH0sIHsgMHgwMDAzLCAgNCB9LCB7IDB4MDAwOCwgIDUgfSwKKyAgICAgICAgeyAweDAwMDksICA1IH0sIHsgMHgwMDE0LCAgNiB9LCB7IDB4MDAyQSwgIDcgfSwgeyAweDAwNTYsICA4IH0sCisgICAgICAgIHsgMHgwMkI4LCAxMSB9LCB7IDB4MDBBRiwgIDkgfSwgeyAweDAyQjksIDExIH0sIHsgMHgwMTVELCAxMCB9LAorICAgICAgICB7IDB4MDJDMCwgMTEgfSwgeyAweDJDMTAsIDE1IH0sIHsgMHgyQzExLCAxNSB9LCB7IDB4MkMxMiwgMTUgfSwKKyAgICAgICAgeyAweDAwMDYsICA0IH0sIHsgMHgwMDBFLCAgNSB9LCB7IDB4MDAxNywgIDYgfSwgeyAweDAwMkQsICA3IH0sCisgICAgICAgIHsgMHgwMDBGLCAgNSB9LCB7IDB4MDA0MCwgIDcgfSwgeyAweDAwMjEsICA2IH0sIHsgMHgwMDA1LCAgMyB9LAorICAgICAgICB7IDB4MDAwOSwgIDQgfSwgeyAweDAwMTEsICA1IH0sIHsgMHgwMDE4LCAgNSB9LCB7IDB4MDAxOSwgIDUgfSwKKyAgICAgICAgeyAweDAwMUEsICA1IH0sIHsgMHgwMDM2LCAgNiB9LCB7IDB4MDAzNywgIDYgfSwgeyAweDAwNDEsICA3IH0sCisgICAgICAgIHsgMHgwMDU5LCAgOCB9LCB7IDB4MDBFMCwgIDggfSwgeyAweDAwRTEsICA4IH0sIHsgMHgwMDcxLCAgNyB9LAorICAgICAgICB7IDB4MDBFNCwgIDggfSwgeyAweDAwQjEsICA5IH0sIHsgMHgwMkMyLCAxMSB9LCB7IDB4MDAxRCwgIDUgfSwKKyAgICAgICAgeyAweDAwNzMsICA3IH0sIHsgMHgwMEU1LCAgOCB9LCB7IDB4MDBGMCwgIDggfSwgeyAweDAwNzksICA3IH0sCisgICAgICAgIHsgMHgwM0M0LCAxMCB9LCB7IDB4MDFFMywgIDkgfSwgeyAweDAxRTgsICA5IH0sIHsgMHgyQzEzLCAxNSB9LAorICAgICAgICB7IDB4MDA3QiwgIDcgfSwgeyAweDJDMTQsIDE1IH0sIHsgMHgyQzE1LCAxNSB9LCB7IDB4MkMxNiwgMTUgfSwKKyAgICAgICAgeyAweDAwN0MsICA3IH0sIHsgMHgwMkMzLCAxMSB9LCB7IDB4MkMxNywgMTUgfSwgeyAweDE2MEMsIDE0IH0sCisgICAgICAgIHsgMHgxNjBELCAxNCB9LCB7IDB4MDA3RCwgIDcgfSwgeyAweDE2MEUsIDE0IH0sIHsgMHgwMUU5LCAgOSB9LAorICAgICAgICB7IDB4MDNDNSwgMTAgfSwgeyAweDAzRDQsIDEwIH0sIHsgMHgwMUVCLCAgOSB9LCB7IDB4MTYwRiwgMTQgfSwKKyAgICAgICAgeyAweDNENTAsIDE0IH0sIHsgMHgwMEZDLCAgOCB9LCB7IDB4MDdBQiwgMTEgfSwgeyAweDNENTEsIDE0IH0sCisgICAgICAgIHsgMHgzRDUyLCAxNCB9LCB7IDB4M0Q1MywgMTQgfSwgeyAweDNENTQsIDE0IH0sIHsgMHgwMUZBLCAgOSB9LAorICAgICAgICB7IDB4M0Q1NSwgMTQgfSwgeyAweDAwN0YsICA3IH0sIHsgMHgwMUZCLCAgOSB9LCB7IDB4M0Q1NiwgMTQgfSwKKyAgICAgICAgeyAweDNENTcsIDE0IH0sCisgICAgfSwKKyAgICB7IC8vIDYKKyAgICAgICAgeyAweDAwMDAsICAzIH0sIHsgMHgwMDAyLCAgNCB9LCB7IDB4MDAwMywgIDQgfSwgeyAweDAwMDgsICA1IH0sCisgICAgICAgIHsgMHgwMDA5LCAgNSB9LCB7IDB4MDAwQSwgIDUgfSwgeyAweDAwMEIsICA1IH0sIHsgMHgwMDE4LCAgNiB9LAorICAgICAgICB7IDB4MDAzMiwgIDcgfSwgeyAweDAwMEQsICA1IH0sIHsgMHgwMDMzLCAgNyB9LCB7IDB4MEUwMCwgMTMgfSwKKyAgICAgICAgeyAweDAwMzksICA3IH0sIHsgMHgwRTAxLCAxMyB9LCB7IDB4MDAzQSwgIDcgfSwgeyAweDBFMDIsIDEzIH0sCisgICAgICAgIHsgMHgwMDA4LCAgNCB9LCB7IDB4MDAxRSwgIDYgfSwgeyAweDAwM0IsICA3IH0sIHsgMHgwMDNFLCAgNyB9LAorICAgICAgICB7IDB4MDAxMiwgIDUgfSwgeyAweDAwM0YsICA3IH0sIHsgMHgwMDEzLCAgNSB9LCB7IDB4MDAyOCwgIDYgfSwKKyAgICAgICAgeyAweDAwMjksICA2IH0sIHsgMHgwMDU0LCAgNyB9LCB7IDB4MDAyQiwgIDYgfSwgeyAweDAwNTUsICA3IH0sCisgICAgICAgIHsgMHgwMDU4LCAgNyB9LCB7IDB4MEUwMywgMTMgfSwgeyAweDAwNTksICA3IH0sIHsgMHgwMDVBLCAgNyB9LAorICAgICAgICB7IDB4MEUwNCwgMTMgfSwgeyAweDBFMDUsIDEzIH0sIHsgMHgwNzAzLCAxMiB9LCB7IDB4MDA1QiwgIDcgfSwKKyAgICAgICAgeyAweDAwNUMsICA3IH0sIHsgMHgwNzA0LCAxMiB9LCB7IDB4MDcwNSwgMTIgfSwgeyAweDAwNUQsICA3IH0sCisgICAgICAgIHsgMHgwNzA2LCAxMiB9LCB7IDB4MDcwNywgMTIgfSwgeyAweDA3MDgsIDEyIH0sIHsgMHgwNzA5LCAxMiB9LAorICAgICAgICB7IDB4MDcwQSwgMTIgfSwgeyAweDA3MEIsIDEyIH0sIHsgMHgwMDE4LCAgNSB9LCB7IDB4MDAyRiwgIDYgfSwKKyAgICAgICAgeyAweDAwMEQsICA0IH0sIHsgMHgwMDE5LCAgNSB9LCB7IDB4MDcwQywgMTIgfSwgeyAweDAwNzAsICA3IH0sCisgICAgICAgIHsgMHgwMDFELCAgNSB9LCB7IDB4MDcwRCwgMTIgfSwgeyAweDA3MEUsIDEyIH0sIHsgMHgwNzBGLCAxMiB9LAorICAgICAgICB7IDB4MDcxMCwgMTIgfSwgeyAweDAwMzksICA2IH0sIHsgMHgwNzExLCAxMiB9LCB7IDB4MDAzQywgIDYgfSwKKyAgICAgICAgeyAweDA3MTIsIDEyIH0sIHsgMHgwNzEzLCAxMiB9LCB7IDB4MDcxNCwgMTIgfSwgeyAweDA3MTUsIDEyIH0sCisgICAgICAgIHsgMHgwNzE2LCAxMiB9LCB7IDB4MDAzRCwgIDYgfSwgeyAweDA3MTcsIDEyIH0sIHsgMHgwNzE4LCAxMiB9LAorICAgICAgICB7IDB4MDcxOSwgMTIgfSwgeyAweDA3MUEsIDEyIH0sIHsgMHgwNzFCLCAxMiB9LCB7IDB4MDcxQywgMTIgfSwKKyAgICAgICAgeyAweDA3MUQsIDEyIH0sIHsgMHgwMDFGLCAgNSB9LCB7IDB4MDcxRSwgMTIgfSwgeyAweDAwNzEsICA3IH0sCisgICAgICAgIHsgMHgwNzFGLCAxMiB9LAorICAgIH0sCisgICAgeyAvLyA3CisgICAgICAgIHsgMHgwMDAwLCAgMyB9LCB7IDB4MDAwMiwgIDQgfSwgeyAweDAwMDYsICA1IH0sIHsgMHgwMDBFLCAgNiB9LAorICAgICAgICB7IDB4MDAwRiwgIDYgfSwgeyAweDAwNDAsICA4IH0sIHsgMHgwMDQxLCAgOCB9LCB7IDB4MDA0MiwgIDggfSwKKyAgICAgICAgeyAweDAyMTgsIDExIH0sIHsgMHgyMTkwLCAxNSB9LCB7IDB4MjE5MSwgMTUgfSwgeyAweDIxOTIsIDE1IH0sCisgICAgICAgIHsgMHgyMTkzLCAxNSB9LCB7IDB4MjE5NCwgMTUgfSwgeyAweDIxOTUsIDE1IH0sIHsgMHgyMTk2LCAxNSB9LAorICAgICAgICB7IDB4MDAwNSwgIDQgfSwgeyAweDAwMTEsICA2IH0sIHsgMHgwMDI0LCAgNyB9LCB7IDB4MDA4NywgIDkgfSwKKyAgICAgICAgeyAweDAwMEMsICA1IH0sIHsgMHgwMDRBLCAgOCB9LCB7IDB4MDA0QiwgIDggfSwgeyAweDAwMDIsICAyIH0sCisgICAgICAgIHsgMHgwMDA2LCAgMyB9LCB7IDB4MDAwRCwgIDUgfSwgeyAweDAwMEUsICA1IH0sIHsgMHgwMDBGLCAgNSB9LAorICAgICAgICB7IDB4MDAxMywgIDYgfSwgeyAweDAwMzgsICA2IH0sIHsgMHgwMEU0LCAgOCB9LCB7IDB4MDBFNSwgIDggfSwKKyAgICAgICAgeyAweDAxQ0MsICA5IH0sIHsgMHgwMEU3LCAgOCB9LCB7IDB4MDA3NCwgIDcgfSwgeyAweDAwRUEsICA4IH0sCisgICAgICAgIHsgMHgwMUNELCAgOSB9LCB7IDB4MDIxQSwgMTEgfSwgeyAweDIxOTcsIDE1IH0sIHsgMHgwMDFFLCAgNSB9LAorICAgICAgICB7IDB4MDA3NiwgIDcgfSwgeyAweDAwRUIsICA4IH0sIHsgMHgwMURDLCAgOSB9LCB7IDB4MDBFRiwgIDggfSwKKyAgICAgICAgeyAweDAxREQsICA5IH0sIHsgMHgwMUYwLCAgOSB9LCB7IDB4MjE5OCwgMTUgfSwgeyAweDIxOTksIDE1IH0sCisgICAgICAgIHsgMHgwMEY5LCAgOCB9LCB7IDB4MDNFMiwgMTAgfSwgeyAweDIxOUEsIDE1IH0sIHsgMHgyMTlCLCAxNSB9LAorICAgICAgICB7IDB4MDBGQSwgIDggfSwgeyAweDIxOUMsIDE1IH0sIHsgMHgyMTlELCAxNSB9LCB7IDB4MjE5RSwgMTUgfSwKKyAgICAgICAgeyAweDIxOUYsIDE1IH0sIHsgMHgwMUY2LCAgOSB9LCB7IDB4MjFCMCwgMTUgfSwgeyAweDAwRkMsICA4IH0sCisgICAgICAgIHsgMHgwMUY3LCAgOSB9LCB7IDB4MjFCMSwgMTUgfSwgeyAweDIxQjIsIDE1IH0sIHsgMHgyMUIzLCAxNSB9LAorICAgICAgICB7IDB4MjFCNCwgMTUgfSwgeyAweDAxRkEsICA5IH0sIHsgMHgyMUI1LCAxNSB9LCB7IDB4MjFCNiwgMTUgfSwKKyAgICAgICAgeyAweDIxQjcsIDE1IH0sIHsgMHgyMUI4LCAxNSB9LCB7IDB4MjFCOSwgMTUgfSwgeyAweDAzRTMsIDEwIH0sCisgICAgICAgIHsgMHgxMERELCAxNCB9LCB7IDB4MDA3RiwgIDcgfSwgeyAweDAxRkIsICA5IH0sIHsgMHgxMERFLCAxNCB9LAorICAgICAgICB7IDB4MTBERiwgMTQgfSwKKyAgICB9LAogfTsKICNkZWZpbmUgTUFYX0FDX1ZMQ19CSVRTIDE2CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvaXR1aDI2M2RlYy5jIGIvbGliYXZjb2RlYy9pdHVoMjYzZGVjLmMKaW5kZXggMmU0NDlmOC4uMWI1N2U1MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pdHVoMjYzZGVjLmMKKysrIGIvbGliYXZjb2RlYy9pdHVoMjYzZGVjLmMKQEAgLTEsNyArMSw3IEBACiAvKgotICogSVRVIEgyNjMgYml0c3RyZWFtIGRlY29kZXIKKyAqIElUVSBILjI2MyBiaXRzdHJlYW0gZGVjb2RlcgogICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCi0gKiBIMjYzKyBzdXBwb3J0LgorICogSC4yNjMrIHN1cHBvcnQuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEgSnVhbiBKLiBTaWVycmFsdGEgUAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqCkBAIC0yNCw3ICsyNCw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIGgyNjMgZGVjb2Rlci4KKyAqIEguMjYzIGRlY29kZXIuCiAgKi8KIAogI2RlZmluZSBVTkNIRUNLRURfQklUU1RSRUFNX1JFQURFUiAxCkBAIC0xNjcsNyArMTY3LDggQEAKICAgICAgICAgLyogV2UgaGF2ZSBhIEdCU0MgcHJvYmFibHkgd2l0aCBHU1RVRkYgKi8KICAgICBza2lwX2JpdHMoJnMtPmdiLCAxNik7IC8qIERyb3AgdGhlIHplcm9zICovCiAgICAgbGVmdD0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpOwotICAgIC8vTU46IHdlIG11c3QgY2hlY2sgdGhlIGJpdHMgbGVmdCBvciB3ZSBtaWdodCBlbmQgaW4gYSBpbmZpbml0ZSBsb29wIChvciBzZWdmYXVsdCkKKyAgICBsZWZ0ID0gRkZNSU4obGVmdCwgMzIpOworICAgIC8vTU46IHdlIG11c3QgY2hlY2sgdGhlIGJpdHMgbGVmdCBvciB3ZSBtaWdodCBlbmQgaW4gYW4gaW5maW5pdGUgbG9vcCAob3Igc2VnZmF1bHQpCiAgICAgZm9yKDtsZWZ0PjEzOyBsZWZ0LS0pewogICAgICAgICBpZihnZXRfYml0czEoJnMtPmdiKSkgYnJlYWs7IC8qIFNlZWsgdGhlICcxJyBiaXQgKi8KICAgICB9CkBAIC0xNzUsMTcgKzE3NiwxNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAKICAgICBpZihzLT5oMjYzX3NsaWNlX3N0cnVjdHVyZWQpewotICAgICAgICBpZihjaGVja19tYXJrZXIoJnMtPmdiLCAiYmVmb3JlIE1CQSIpPT0wKQorICAgICAgICBpZihjaGVja19tYXJrZXIocy0+YXZjdHgsICZzLT5nYiwgImJlZm9yZSBNQkEiKT09MCkKICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICBmZl9oMjYzX2RlY29kZV9tYmEocyk7CiAKICAgICAgICAgaWYocy0+bWJfbnVtID4gMTU4MykKLSAgICAgICAgICAgIGlmKGNoZWNrX21hcmtlcigmcy0+Z2IsICJhZnRlciBNQkEiKT09MCkKKyAgICAgICAgICAgIGlmKGNoZWNrX21hcmtlcihzLT5hdmN0eCwgJnMtPmdiLCAiYWZ0ZXIgTUJBIik9PTApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgICAgIHMtPnFzY2FsZSA9IGdldF9iaXRzKCZzLT5nYiwgNSk7IC8qIFNRVUFOVCAqLwotICAgICAgICBpZihjaGVja19tYXJrZXIoJnMtPmdiLCAiYWZ0ZXIgU1FVQU5UIik9PTApCisgICAgICAgIGlmKGNoZWNrX21hcmtlcihzLT5hdmN0eCwgJnMtPmdiLCAiYWZ0ZXIgU1FVQU5UIik9PTApCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDIpOyAvKiBHRklEICovCiAgICAgfWVsc2V7CkBAIC0yMDYsMTIgKzIwNywyNyBAQAogfQogCiAvKioKLSAqIERlY29kZSB0aGUgZ3JvdXAgb2YgYmxvY2tzIC8gdmlkZW8gcGFja2V0IGhlYWRlci4KKyAqIERlY29kZSB0aGUgZ3JvdXAgb2YgYmxvY2tzIC8gdmlkZW8gcGFja2V0IGhlYWRlciAvIHNsaWNlIGhlYWRlciAoTVBFRy00IFN0dWRpbykuCiAgKiBAcmV0dXJuIGJpdCBwb3NpdGlvbiBvZiB0aGUgcmVzeW5jX21hcmtlciwgb3IgPDAgaWYgbm9uZSB3YXMgZm91bmQKICAqLwogaW50IGZmX2gyNjNfcmVzeW5jKE1wZWdFbmNDb250ZXh0ICpzKXsKICAgICBpbnQgbGVmdCwgcG9zLCByZXQ7CiAKKyAgICAvKiBJbiBNUEVHLTQgc3R1ZGlvIG1vZGUgbG9vayBmb3IgYSBuZXcgc2xpY2Ugc3RhcnRjb2RlCisgICAgICogYW5kIGRlY29kZSBzbGljZSBoZWFkZXIgKi8KKyAgICBpZihzLT5jb2RlY19pZD09QVZfQ09ERUNfSURfTVBFRzQgJiYgcy0+c3R1ZGlvX3Byb2ZpbGUpIHsKKyAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKKworICAgICAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID49IDMyICYmIHNob3dfYml0c19sb25nKCZzLT5nYiwgMzIpICE9IFNMSUNFX1NUQVJUX0NPREUpIHsKKyAgICAgICAgICAgIGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hvd19iaXRzX2xvbmcoJnMtPmdiLCAzMikgPT0gU0xJQ0VfU1RBUlRfQ09ERSkKKyAgICAgICAgICAgIHJldHVybiBnZXRfYml0c19jb3VudCgmcy0+Z2IpOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiAgICAgaWYocy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUc0KXsKICAgICAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOwogICAgICAgICBhbGlnbl9nZXRfYml0cygmcy0+Z2IpOwpAQCAtMjc3LDcgKzI5Myw3IEBACiAgICAgaWYgKCFzLT5oMjYzX2xvbmdfdmVjdG9ycykgewogICAgICAgICB2YWwgPSBzaWduX2V4dGVuZCh2YWwsIDUgKyBmX2NvZGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIGhvcnJpYmxlIGgyNjMgbG9uZyB2ZWN0b3IgbW9kZSAqLworICAgICAgICAvKiBob3JyaWJsZSBILjI2MyBsb25nIHZlY3RvciBtb2RlICovCiAgICAgICAgIGlmIChwcmVkIDwgLTMxICYmIHZhbCA8IC02MykKICAgICAgICAgICAgIHZhbCArPSA2NDsKICAgICAgICAgaWYgKHByZWQgPiAzMiAmJiB2YWwgPiA2MykKQEAgLTMwMiw2ICszMTgsMTAgQEAKICAgIHsKICAgICAgIGNvZGUgPDw9IDE7CiAgICAgICBjb2RlICs9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgaWYgKGNvZGUgPj0gMzI3NjgpIHsKKyAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJIdWdlIERNViIpOworICAgICAgICAgIHJldHVybiAweGZmZmY7CisgICAgICB9CiAgICB9CiAgICBzaWduID0gY29kZSAmIDE7CiAgICBjb2RlID4+PSAxOwpAQCAtMzEzLDcgKzMzMyw3IEBACiB9CiAKIC8qKgotICogcmVhZCB0aGUgbmV4dCBNVnMgZm9yIE9CTUMuIHllcyB0aGlzIGlzIGEgdWdseSBoYWNrLCBmZWVsIGZyZWUgdG8gc2VuZCBhIHBhdGNoIDopCisgKiByZWFkIHRoZSBuZXh0IE1WcyBmb3IgT0JNQy4geWVzIHRoaXMgaXMgYW4gdWdseSBoYWNrLCBmZWVsIGZyZWUgdG8gc2VuZCBhIHBhdGNoIDopCiAgKi8KIHN0YXRpYyB2b2lkIHByZXZpZXdfb2JtYyhNcGVnRW5jQ29udGV4dCAqcyl7CiAgICAgR2V0Qml0Q29udGV4dCBnYj0gcy0+Z2I7CkBAIC0zNjMsMTQgKzM4MywxNCBAQAogICAgICAgICAgICAgICAgIC8qIDE2eDE2IG1vdGlvbiBwcmVkaWN0aW9uICovCiAgICAgICAgICAgICAgICAgbW90X3ZhbD0gZmZfaDI2M19wcmVkX21vdGlvbihzLCAwLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKICAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cykKLSAgICAgICAgICAgICAgICAgICBteCA9IGgyNjNwX2RlY29kZV91bW90aW9uKHMsIHByZWRfeCk7CisgICAgICAgICAgICAgICAgICAgIG14ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF94KTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF94LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF94LCAxKTsKIAogICAgICAgICAgICAgICAgIGlmIChzLT51bXZwbHVzKQotICAgICAgICAgICAgICAgICAgIG15ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF95KTsKKyAgICAgICAgICAgICAgICAgICAgbXkgPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3kpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIDEpOworICAgICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIDEpOwogCiAgICAgICAgICAgICAgICAgbW90X3ZhbFswICAgICAgIF09IG1vdF92YWxbMiAgICAgICBdPQogICAgICAgICAgICAgICAgIG1vdF92YWxbMCtzdHJpZGVdPSBtb3RfdmFsWzIrc3RyaWRlXT0gbXg7CkBAIC0zODEsMTYgKzQwMSwxNiBAQAogICAgICAgICAgICAgZm9yKGk9MDtpPDQ7aSsrKSB7CiAgICAgICAgICAgICAgICAgbW90X3ZhbCA9IGZmX2gyNjNfcHJlZF9tb3Rpb24ocywgaSwgMCwgJnByZWRfeCwgJnByZWRfeSk7CiAgICAgICAgICAgICAgICAgaWYgKHMtPnVtdnBsdXMpCi0gICAgICAgICAgICAgICAgICBteCA9IGgyNjNwX2RlY29kZV91bW90aW9uKHMsIHByZWRfeCk7CisgICAgICAgICAgICAgICAgICAgIG14ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF94KTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3gsIDEpOworICAgICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3gsIDEpOwogCiAgICAgICAgICAgICAgICAgaWYgKHMtPnVtdnBsdXMpCi0gICAgICAgICAgICAgICAgICBteSA9IGgyNjNwX2RlY29kZV91bW90aW9uKHMsIHByZWRfeSk7CisgICAgICAgICAgICAgICAgICAgIG15ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF95KTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIDEpOworICAgICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIDEpOwogICAgICAgICAgICAgICAgIGlmIChzLT51bXZwbHVzICYmIChteCAtIHByZWRfeCkgPT0gMSAmJiAobXkgLSBwcmVkX3kpID09IDEpCi0gICAgICAgICAgICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7IC8qIEJpdCBzdHVmZmluZyB0byBwcmV2ZW50IFBTQyAqLworICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7IC8qIEJpdCBzdHVmZmluZyB0byBwcmV2ZW50IFBTQyAqLwogICAgICAgICAgICAgICAgIG1vdF92YWxbMF0gPSBteDsKICAgICAgICAgICAgICAgICBtb3RfdmFsWzFdID0gbXk7CiAgICAgICAgICAgICB9CkBAIC01MjMsNyArNTQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgNSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgfD0gU0hPV19TQklUUyhyZSwgJnMtPmdiLCA2KTw8NTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIHw9IFNIT1dfU0JJVFMocmUsICZzLT5nYiwgNikgKiAoMTw8NSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTS0lQX0NPVU5URVIocmUsICZzLT5nYiwgNSArIDYpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtNTY5LDcgKzU4OSw3IEBACiAKIHN0YXRpYyBpbnQgaDI2M19za2lwX2JfcGFydChNcGVnRW5jQ29udGV4dCAqcywgaW50IGNicCkKIHsKLSAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGRibG9jaywgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBkYmxvY2ssIFs2NF0pOwogICAgIGludCBpLCBtYmk7CiAgICAgaW50IGJsaVs2XTsKIApAQCAtNjA3LDYgKzYyNyw3MyBAQAogICAgIHJldHVybiBtdjsKIH0KIAorI2RlZmluZSB0YWJfc2l6ZSAoKHNpZ25lZClGRl9BUlJBWV9FTEVNUyhzLT5kaXJlY3Rfc2NhbGVfbXZbMF0pKQorI2RlZmluZSB0YWJfYmlhcyAodGFiX3NpemUgLyAyKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9vbmVfZGlyZWN0X212KE1wZWdFbmNDb250ZXh0ICpzLCBQaWN0dXJlICpwLCBpbnQgaSkKK3sKKyAgICBpbnQgeHkgICAgICAgICAgID0gcy0+YmxvY2tfaW5kZXhbaV07CisgICAgdWludDE2X3QgdGltZV9wcCA9IHMtPnBwX3RpbWU7CisgICAgdWludDE2X3QgdGltZV9wYiA9IHMtPnBiX3RpbWU7CisgICAgaW50IHBfbXgsIHBfbXk7CisKKyAgICBwX214ID0gcC0+bW90aW9uX3ZhbFswXVt4eV1bMF07CisgICAgaWYgKCh1bnNpZ25lZCkocF9teCArIHRhYl9iaWFzKSA8IHRhYl9zaXplKSB7CisgICAgICAgIHMtPm12WzBdW2ldWzBdID0gcy0+ZGlyZWN0X3NjYWxlX212WzBdW3BfbXggKyB0YWJfYmlhc107CisgICAgICAgIHMtPm12WzFdW2ldWzBdID0gcy0+ZGlyZWN0X3NjYWxlX212WzFdW3BfbXggKyB0YWJfYmlhc107CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bXZbMF1baV1bMF0gPSBwX214ICogdGltZV9wYiAvIHRpbWVfcHA7CisgICAgICAgIHMtPm12WzFdW2ldWzBdID0gcF9teCAqICh0aW1lX3BiIC0gdGltZV9wcCkgLyB0aW1lX3BwOworICAgIH0KKyAgICBwX215ID0gcC0+bW90aW9uX3ZhbFswXVt4eV1bMV07CisgICAgaWYgKCh1bnNpZ25lZCkocF9teSArIHRhYl9iaWFzKSA8IHRhYl9zaXplKSB7CisgICAgICAgIHMtPm12WzBdW2ldWzFdID0gcy0+ZGlyZWN0X3NjYWxlX212WzBdW3BfbXkgKyB0YWJfYmlhc107CisgICAgICAgIHMtPm12WzFdW2ldWzFdID0gcy0+ZGlyZWN0X3NjYWxlX212WzFdW3BfbXkgKyB0YWJfYmlhc107CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bXZbMF1baV1bMV0gPSBwX215ICogdGltZV9wYiAvIHRpbWVfcHA7CisgICAgICAgIHMtPm12WzFdW2ldWzFdID0gcF9teSAqICh0aW1lX3BiIC0gdGltZV9wcCkgLyB0aW1lX3BwOworICAgIH0KK30KKworLyoqCisgKiBAcmV0dXJuIHRoZSBtYl90eXBlCisgKi8KK3N0YXRpYyBpbnQgc2V0X2RpcmVjdF9tdihNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBjb25zdCBpbnQgbWJfaW5kZXggPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKKyAgICBQaWN0dXJlICpwID0gJnMtPm5leHRfcGljdHVyZTsKKyAgICBpbnQgY29sb2NhdGVkX21iX3R5cGUgPSBwLT5tYl90eXBlW21iX2luZGV4XTsKKyAgICBpbnQgaTsKKworICAgIGlmIChzLT5jb2RlY190YWcgPT0gQVZfUkwzMigiVTI2MyIpICYmIHAtPmYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBwID0gJnMtPmxhc3RfcGljdHVyZTsKKyAgICAgICAgY29sb2NhdGVkX21iX3R5cGUgPSBwLT5tYl90eXBlW21iX2luZGV4XTsKKyAgICB9CisKKyAgICBpZiAoSVNfOFg4KGNvbG9jYXRlZF9tYl90eXBlKSkgeworICAgICAgICBzLT5tdl90eXBlID0gTVZfVFlQRV84WDg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBzZXRfb25lX2RpcmVjdF9tdihzLCBwLCBpKTsKKyAgICAgICAgcmV0dXJuIE1CX1RZUEVfRElSRUNUMiB8IE1CX1RZUEVfOHg4IHwgTUJfVFlQRV9MMEwxOworICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9vbmVfZGlyZWN0X212KHMsIHAsIDApOworICAgICAgICBzLT5tdlswXVsxXVswXSA9CisgICAgICAgIHMtPm12WzBdWzJdWzBdID0KKyAgICAgICAgcy0+bXZbMF1bM11bMF0gPSBzLT5tdlswXVswXVswXTsKKyAgICAgICAgcy0+bXZbMF1bMV1bMV0gPQorICAgICAgICBzLT5tdlswXVsyXVsxXSA9CisgICAgICAgIHMtPm12WzBdWzNdWzFdID0gcy0+bXZbMF1bMF1bMV07CisgICAgICAgIHMtPm12WzFdWzFdWzBdID0KKyAgICAgICAgcy0+bXZbMV1bMl1bMF0gPQorICAgICAgICBzLT5tdlsxXVszXVswXSA9IHMtPm12WzFdWzBdWzBdOworICAgICAgICBzLT5tdlsxXVsxXVsxXSA9CisgICAgICAgIHMtPm12WzFdWzJdWzFdID0KKyAgICAgICAgcy0+bXZbMV1bM11bMV0gPSBzLT5tdlsxXVswXVsxXTsKKyAgICAgICAgcy0+bXZfdHlwZSA9IE1WX1RZUEVfOFg4OworICAgICAgICAvLyBOb3RlIHNlZSBwcmV2IGxpbmUKKyAgICAgICAgcmV0dXJuIE1CX1RZUEVfRElSRUNUMiB8IE1CX1RZUEVfMTZ4MTYgfCBNQl9UWVBFX0wwTDE7CisgICAgfQorfQorCiBpbnQgZmZfaDI2M19kZWNvZGVfbWIoTXBlZ0VuY0NvbnRleHQgKnMsCiAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBibG9ja1s2XVs2NF0pCiB7CkBAIC02MzUsNyArNzIyLDcgQEAKICAgICAgICAgICAgIGNicGMgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfaW50ZXJfTUNCUENfdmxjLnRhYmxlLCBJTlRFUl9NQ0JQQ19WTENfQklUUywgMik7CiAgICAgICAgICAgICBpZiAoY2JwYyA8IDApewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2JwYyBkYW1hZ2VkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNMSUNFX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9d2hpbGUoY2JwYyA9PSAyMCk7CiAKQEAgLTY0OSw2ICs3MzYsMTEgQEAKICAgICAgICAgICAgIHBiX212X2NvdW50ID0gaDI2M19nZXRfbW9kYigmcy0+Z2IsIHMtPnBiX2ZyYW1lLCAmY2JwYik7CiAgICAgICAgIGNicHkgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfY2JweV92bGMudGFibGUsIENCUFlfVkxDX0JJVFMsIDEpOwogCisgICAgICAgIGlmIChjYnB5IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYnB5IGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOworICAgICAgICAgICAgcmV0dXJuIFNMSUNFX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgaWYocy0+YWx0X2ludGVyX3ZsYz09MCB8fCAoY2JwYyAmIDMpIT0zKQogICAgICAgICAgICAgY2JweSBePSAweEY7CiAKQEAgLTY2OSw3ICs3NjEsNyBAQAogICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF94LCAxKTsKIAogICAgICAgICAgICAgaWYgKG14ID49IDB4ZmZmZikKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNMSUNFX0VSUk9SOwogCiAgICAgICAgICAgICBpZiAocy0+dW12cGx1cykKICAgICAgICAgICAgICAgIG15ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF95KTsKQEAgLTY3Nyw3ICs3NjksNyBAQAogICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95LCAxKTsKIAogICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNMSUNFX0VSUk9SOwogICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBteDsKICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gbXk7CiAKQEAgLTY4OSwxOCArNzgxLDE4IEBACiAgICAgICAgICAgICBmb3IoaT0wO2k8NDtpKyspIHsKICAgICAgICAgICAgICAgICBtb3RfdmFsID0gZmZfaDI2M19wcmVkX21vdGlvbihzLCBpLCAwLCAmcHJlZF94LCAmcHJlZF95KTsKICAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cykKLSAgICAgICAgICAgICAgICAgIG14ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF94KTsKKyAgICAgICAgICAgICAgICAgICAgbXggPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3gpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeCwgMSk7CisgICAgICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeCwgMSk7CiAgICAgICAgICAgICAgICAgaWYgKG14ID49IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0xJQ0VfRVJST1I7CiAKICAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cykKLSAgICAgICAgICAgICAgICAgIG15ID0gaDI2M3BfZGVjb2RlX3Vtb3Rpb24ocywgcHJlZF95KTsKKyAgICAgICAgICAgICAgICAgICAgbXkgPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3kpOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgIG15ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeSwgMSk7CisgICAgICAgICAgICAgICAgICAgIG15ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeSwgMSk7CiAgICAgICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0xJQ0VfRVJST1I7CiAgICAgICAgICAgICAgICAgcy0+bXZbMF1baV1bMF0gPSBteDsKICAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVsxXSA9IG15OwogICAgICAgICAgICAgICAgIGlmIChzLT51bXZwbHVzICYmIChteCAtIHByZWRfeCkgPT0gMSAmJiAobXkgLSBwcmVkX3kpID09IDEpCkBAIC03MjYsNyArODE4LDcgQEAKICAgICAgICAgICAgIG1iX3R5cGU9IGdldF92bGMyKCZzLT5nYiwgaDI2M19tYnR5cGVfYl92bGMudGFibGUsIEgyNjNfTUJUWVBFX0JfVkxDX0JJVFMsIDIpOwogICAgICAgICAgICAgaWYgKG1iX3R5cGUgPCAwKXsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImIgbWJfdHlwZSBkYW1hZ2VkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNMSUNFX0VSUk9SOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtYl90eXBlPSBoMjYzX21iX3R5cGVfYl9tYXBbIG1iX3R5cGUgXTsKQEAgLTc0NSw3ICs4MzcsNyBAQAogCiAgICAgICAgICAgICBpZiAoY2JweSA8IDApewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYiBjYnB5IGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0xJQ0VfRVJST1I7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmKHMtPmFsdF9pbnRlcl92bGM9PTAgfHwgKGNicGMgJiAzKSE9MykKQEAgLTc2MywxOCArODU1LDMyIEBACiAKICAgICAgICAgaWYoSVNfRElSRUNUKG1iX3R5cGUpKXsKICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEIHwgTVZfRElSX0JBQ0tXQVJEIHwgTVZfRElSRUNUOwotICAgICAgICAgICAgbWJfdHlwZSB8PSBmZl9tcGVnNF9zZXRfZGlyZWN0X212KHMsIDAsIDApOworICAgICAgICAgICAgbWJfdHlwZSB8PSBzZXRfZGlyZWN0X212KHMpOwogICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgIHMtPm12X2RpciA9IDA7CiAgICAgICAgICAgICBzLT5tdl90eXBlPSBNVl9UWVBFXzE2WDE2OwogLy9GSVhNRSBVTVYKIAogICAgICAgICAgICAgaWYoVVNFU19MSVNUKG1iX3R5cGUsIDApKXsKLSAgICAgICAgICAgICAgICBpbnQxNl90ICptb3RfdmFsPSBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZteCwgJm15KTsKKyAgICAgICAgICAgICAgICBpbnQxNl90ICptb3RfdmFsPSBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDAsICZwcmVkX3gsICZwcmVkX3kpOwogICAgICAgICAgICAgICAgIHMtPm12X2RpciA9IE1WX0RJUl9GT1JXQVJEOwogCi0gICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgbXgsIDEpOwotICAgICAgICAgICAgICAgIG15ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIG15LCAxKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cykKKyAgICAgICAgICAgICAgICAgICAgbXggPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3gpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF94LCAxKTsKKyAgICAgICAgICAgICAgICBpZiAobXggPj0gMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0xJQ0VfRVJST1I7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cykKKyAgICAgICAgICAgICAgICAgICAgbXkgPSBoMjYzcF9kZWNvZGVfdW1vdGlvbihzLCBwcmVkX3kpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95LCAxKTsKKyAgICAgICAgICAgICAgICBpZiAobXkgPj0gMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gU0xJQ0VfRVJST1I7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+dW12cGx1cyAmJiAobXggLSBwcmVkX3gpID09IDEgJiYgKG15IC0gcHJlZF95KSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMxKCZzLT5nYik7IC8qIEJpdCBzdHVmZmluZyB0byBwcmV2ZW50IFBTQyAqLwogCiAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBteDsKICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IG15OwpAQCAtNzgzLDExICs4ODksMjUgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYoVVNFU19MSVNUKG1iX3R5cGUsIDEpKXsKLSAgICAgICAgICAgICAgICBpbnQxNl90ICptb3RfdmFsPSBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDEsICZteCwgJm15KTsKKyAgICAgICAgICAgICAgICBpbnQxNl90ICptb3RfdmFsPSBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIDAsIDEsICZwcmVkX3gsICZwcmVkX3kpOwogICAgICAgICAgICAgICAgIHMtPm12X2RpciB8PSBNVl9ESVJfQkFDS1dBUkQ7CiAKLSAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBteCwgMSk7Ci0gICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgbXksIDEpOworICAgICAgICAgICAgICAgIGlmIChzLT51bXZwbHVzKQorICAgICAgICAgICAgICAgICAgICBteCA9IGgyNjNwX2RlY29kZV91bW90aW9uKHMsIHByZWRfeCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBteCA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3gsIDEpOworICAgICAgICAgICAgICAgIGlmIChteCA+PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTTElDRV9FUlJPUjsKKworICAgICAgICAgICAgICAgIGlmIChzLT51bXZwbHVzKQorICAgICAgICAgICAgICAgICAgICBteSA9IGgyNjNwX2RlY29kZV91bW90aW9uKHMsIHByZWRfeSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIDEpOworICAgICAgICAgICAgICAgIGlmIChteSA+PSAweGZmZmYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTTElDRV9FUlJPUjsKKworICAgICAgICAgICAgICAgIGlmIChzLT51bXZwbHVzICYmIChteCAtIHByZWRfeCkgPT0gMSAmJiAobXkgLSBwcmVkX3kpID09IDEpCisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0czEoJnMtPmdiKTsgLyogQml0IHN0dWZmaW5nIHRvIHByZXZlbnQgUFNDICovCiAKICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVswXSA9IG14OwogICAgICAgICAgICAgICAgIHMtPm12WzFdWzBdWzFdID0gbXk7CkBAIC04MDIsNyArOTIyLDcgQEAKICAgICAgICAgICAgIGNicGMgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfaW50cmFfTUNCUENfdmxjLnRhYmxlLCBJTlRSQV9NQ0JQQ19WTENfQklUUywgMik7CiAgICAgICAgICAgICBpZiAoY2JwYyA8IDApewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSSBjYnBjIGRhbWFnZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0xJQ0VfRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH13aGlsZShjYnBjID09IDgpOwogCkBAIC04MjcsNyArOTQ3LDcgQEAKICAgICAgICAgY2JweSA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19jYnB5X3ZsYy50YWJsZSwgQ0JQWV9WTENfQklUUywgMSk7CiAgICAgICAgIGlmKGNicHk8MCl7CiAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkkgY2JweSBkYW1hZ2VkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBTTElDRV9FUlJPUjsKICAgICAgICAgfQogICAgICAgICBjYnAgPSAoY2JwYyAmIDMpIHwgKGNicHkgPDwgMik7CiAgICAgICAgIGlmIChkcXVhbnQpIHsKQEAgLTg1Nyw2ICs5NzcsOSBAQAogICAgIH0KIGVuZDoKIAorICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgICAgICAvKiBwZXItTUIgZW5kIG9mIHNsaWNlIGNoZWNrICovCiAgICAgewogICAgICAgICBpbnQgdj0gc2hvd19iaXRzKCZzLT5nYiwgMTYpOwpAQCAtODcyLDcgKzk5NSw3IEBACiAgICAgcmV0dXJuIFNMSUNFX09LOwogfQogCi0vKiBtb3N0IGlzIGhhcmRjb2RlZC4gc2hvdWxkIGV4dGVuZCB0byBoYW5kbGUgYWxsIGgyNjMgc3RyZWFtcyAqLworLyogTW9zdCBpcyBoYXJkY29kZWQ7IHNob3VsZCBleHRlbmQgdG8gaGFuZGxlIGFsbCBILjI2MyBzdHJlYW1zLiAqLwogaW50IGZmX2gyNjNfZGVjb2RlX3BpY3R1cmVfaGVhZGVyKE1wZWdFbmNDb250ZXh0ICpzKQogewogICAgIGludCBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGksIHJldDsKQEAgLTg5OSwxNyArMTAyMiwxOCBAQAogICAgIH0KICAgICAvKiB0ZW1wb3JhbCByZWZlcmVuY2UgKi8KICAgICBpID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsgLyogcGljdHVyZSB0aW1lc3RhbXAgKi8KLSAgICBpZiggKHMtPnBpY3R1cmVfbnVtYmVyJn4weEZGKStpIDwgcy0+cGljdHVyZV9udW1iZXIpCi0gICAgICAgIGkrPSAyNTY7CisKKyAgICBpIC09IChpIC0gKHMtPnBpY3R1cmVfbnVtYmVyICYgMHhGRikgKyAxMjgpICYgfjB4RkY7CisKICAgICBzLT5waWN0dXJlX251bWJlcj0gKHMtPnBpY3R1cmVfbnVtYmVyJn4weEZGKSArIGk7CiAKICAgICAvKiBQVFlQRSBzdGFydHMgaGVyZSAqLwotICAgIGlmIChjaGVja19tYXJrZXIoJnMtPmdiLCAiaW4gUFRZUEUiKSAhPSAxKSB7CisgICAgaWYgKGNoZWNrX21hcmtlcihzLT5hdmN0eCwgJnMtPmdiLCAiaW4gUFRZUEUiKSAhPSAxKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpICE9IDApIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCYWQgSDI2MyBpZFxuIik7Ci0gICAgICAgIHJldHVybiAtMTsgICAgICAvKiBoMjYzIGlkICovCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQmFkIEguMjYzIGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgIC8qIEguMjYzIGlkICovCiAgICAgfQogICAgIHNraXBfYml0czEoJnMtPmdiKTsgICAgICAgICAvKiBzcGxpdCBzY3JlZW4gb2ZmICovCiAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOyAgICAgICAgIC8qIGNhbWVyYSAgb2ZmICovCkBAIC05MzYsNyArMTA2MCw3IEBACiAgICAgICAgIHMtPmgyNjNfbG9uZ192ZWN0b3JzID0gZ2V0X2JpdHMxKCZzLT5nYik7CiAKICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpICE9IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSDI2MyBTQUMgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkguMjYzIFNBQyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsgLyogU0FDOiBvZmYgKi8KICAgICAgICAgfQogICAgICAgICBzLT5vYm1jPSBnZXRfYml0czEoJnMtPmdiKTsgLyogQWR2YW5jZWQgcHJlZGljdGlvbiBtb2RlICovCkBAIC0xMDI1LDExICsxMTQ5LDExIEBACiAgICAgICAgICAgICAgICAgNi0xNCAtIHJlc2VydmVkCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICB3aWR0aCA9IChnZXRfYml0cygmcy0+Z2IsIDkpICsgMSkgKiA0OwotICAgICAgICAgICAgICAgIGNoZWNrX21hcmtlcigmcy0+Z2IsICJpbiBkaW1lbnNpb25zIik7CisgICAgICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCAmcy0+Z2IsICJpbiBkaW1lbnNpb25zIik7CiAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZ2V0X2JpdHMoJnMtPmdiLCA5KSAqIDQ7CiAgICAgICAgICAgICAgICAgZmZfZGxvZyhzLT5hdmN0eCwgIlxuSC4yNjMrIEN1c3RvbSBwaWN0dXJlOiAlZHglZFxuIix3aWR0aCxoZWlnaHQpOwogICAgICAgICAgICAgICAgIGlmIChzLT5hc3BlY3RfcmF0aW9faW5mbyA9PSBGRl9BU1BFQ1RfRVhURU5ERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYXNwZWN0ZWQgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgICAgICAgICAvKiBleHBlY3RlZCBkaW1lbnNpb25zICovCiAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bT0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuPSBnZXRfYml0cygmcy0+Z2IsIDgpOwogICAgICAgICAgICAgICAgIH1lbHNlewpAQCAtMTA4MCw2ICsxMjA0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5vcmRlcmVkIHNsaWNlcyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgNCk7IC8vRUxOVU0KKyAgICAgICAgICAgICAgICBpZiAodWZlcCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDQpOyAvLyBSTE5VTQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIHMtPnFzY2FsZSA9IGdldF9iaXRzKCZzLT5nYiwgNSk7CkBAIC0xMTIwLDE4ICsxMjUwLDIxIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgaWYocy0+aDI2M19zbGljZV9zdHJ1Y3R1cmVkKXsKLSAgICAgICAgaWYgKGNoZWNrX21hcmtlcigmcy0+Z2IsICJTRVBCMSIpICE9IDEpIHsKKyAgICAgICAgaWYgKGNoZWNrX21hcmtlcihzLT5hdmN0eCwgJnMtPmdiLCAiU0VQQjEiKSAhPSAxKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KIAogICAgICAgICBmZl9oMjYzX2RlY29kZV9tYmEocyk7CiAKLSAgICAgICAgaWYgKGNoZWNrX21hcmtlcigmcy0+Z2IsICJTRVBCMiIpICE9IDEpIHsKKyAgICAgICAgaWYgKGNoZWNrX21hcmtlcihzLT5hdmN0eCwgJnMtPmdiLCAiU0VQQjIiKSAhPSAxKSB7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CiAgICAgcy0+Zl9jb2RlID0gMTsKIAorICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIHMtPmxvd19kZWxheSA9IDA7CisKICAgICBpZihzLT5oMjYzX2FpYyl7CiAgICAgICAgICBzLT55X2RjX3NjYWxlX3RhYmxlPQogICAgICAgICAgcy0+Y19kY19zY2FsZV90YWJsZT0gZmZfYWljX2RjX3NjYWxlX3RhYmxlOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pdHVoMjYzZW5jLmMgYi9saWJhdmNvZGVjL2l0dWgyNjNlbmMuYwppbmRleCBkOTU5NmM5Li5lZTA5ZjI5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2l0dWgyNjNlbmMuYworKysgYi9saWJhdmNvZGVjL2l0dWgyNjNlbmMuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCi0gKiBJVFUgSDI2MyBiaXRzdHJlYW0gZW5jb2RlcgorICogSVRVIEguMjYzIGJpdHN0cmVhbSBlbmNvZGVyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKLSAqIEgyNjMrIHN1cHBvcnQuCisgKiBILjI2Mysgc3VwcG9ydC4KICAqIENvcHlyaWdodCAoYykgMjAwMSBKdWFuIEouIFNpZXJyYWx0YSBQCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICoKQEAgLTI0LDcgKzI0LDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogaDI2MyBiaXRzdHJlYW0gZW5jb2Rlci4KKyAqIEguMjYzIGJpdHN0cmVhbSBlbmNvZGVyLgogICovCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4KQEAgLTM3LDcgKzM3LDYgQEAKICNpbmNsdWRlICJoMjYzZGF0YS5oIgogI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKLSNpbmNsdWRlICJ1bmFyeS5oIgogI2luY2x1ZGUgImZsdi5oIgogI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMTM1LDcgKzEzNCw3IEBACiAgICAgcHV0X3NiaXRzKCZzLT5wYiwgOCwgdGVtcF9yZWYpOyAvKiBUZW1wb3JhbFJlZmVyZW5jZSAqLwogCiAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAxKTsgICAgIC8qIG1hcmtlciAqLwotICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAvKiBoMjYzIGlkICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgIC8qIEguMjYzIGlkICovCiAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgIC8qIHNwbGl0IHNjcmVlbiBvZmYgKi8KICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgLyogY2FtZXJhICBvZmYgKi8KICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgLyogZnJlZXplIHBpY3R1cmUgcmVsZWFzZSBvZmYgKi8KQEAgLTE1MSw3ICsxNTAsNyBAQAogICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgIC8qIFVucmVzdHJpY3RlZCBNb3Rpb24gVmVjdG9yOiBvZmYgKi8KICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBTQUM6IG9mZiAqLwogICAgICAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPm9ibWMpOyAgIC8qIEFkdmFuY2VkIFByZWRpY3Rpb24gKi8KLSAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgICAgICAvKiBvbmx5IEkvUCBmcmFtZXMsIG5vIFBCIGZyYW1lICovCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgLyogb25seSBJL1AtZnJhbWVzLCBubyBQQi1mcmFtZSAqLwogICAgICAgICBwdXRfYml0cygmcy0+cGIsIDUsIHMtPnFzY2FsZSk7CiAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMCk7ICAgICAgICAgLyogQ29udGludW91cyBQcmVzZW5jZSBNdWx0aXBvaW50IG1vZGU6IG9mZiAqLwogICAgIH0gZWxzZSB7CkBAIC0yNjIsNyArMjYxLDcgQEAKIH0KIAogLyoqCi0gKiBtb2RpZnkgcXNjYWxlIHNvIHRoYXQgZW5jb2RpbmcgaXMgYWN0dWFsbHkgcG9zc2libGUgaW4gaDI2MyAobGltaXQgZGlmZmVyZW5jZSB0byAtMi4uMikKKyAqIG1vZGlmeSBxc2NhbGUgc28gdGhhdCBlbmNvZGluZyBpcyBhY3R1YWxseSBwb3NzaWJsZSBpbiBILjI2MyAobGltaXQgZGlmZmVyZW5jZSB0byAtMi4uMikKICAqLwogdm9pZCBmZl9jbGVhbl9oMjYzX3FzY2FsZXMoTXBlZ0VuY0NvbnRleHQgKnMpewogICAgIGludCBpOwpAQCAtNzc0LDcgKzc3Myw3IEBACiAKICAgICAgICAgaW5pdF9tdl9wZW5hbHR5X2FuZF9mY29kZShzKTsKICAgICB9Ci0gICAgcy0+bWUubXZfcGVuYWx0eT0gbXZfcGVuYWx0eTsgLy9GSVhNRSBleGFjdCB0YWJsZSBmb3IgbXNtcGVnNCAmIGgyNjNwCisgICAgcy0+bWUubXZfcGVuYWx0eT0gbXZfcGVuYWx0eTsgLy8gRklYTUUgZXhhY3QgdGFibGUgZm9yIE1TTVBFRzQgJiBILjI2MysKIAogICAgIHMtPmludHJhX2FjX3ZsY19sZW5ndGggICAgID1zLT5pbnRlcl9hY192bGNfbGVuZ3RoICAgICA9IHVuaV9oMjYzX2ludGVyX3JsX2xlbjsKICAgICBzLT5pbnRyYV9hY192bGNfbGFzdF9sZW5ndGg9cy0+aW50ZXJfYWNfdmxjX2xhc3RfbGVuZ3RoPSB1bmlfaDI2M19pbnRlcl9ybF9sZW4gKyAxMjgqNjQ7CkBAIC03ODQsNyArNzgzLDcgQEAKICAgICB9CiAgICAgcy0+YWNfZXNjX2xlbmd0aD0gNysxKzYrODsKIAotICAgIC8vIHVzZSBmY29kZXMgPjEgb25seSBmb3IgbXBlZzQgJiBoMjYzICYgaDI2M3AgRklYTUUKKyAgICAvLyB1c2UgZmNvZGVzID4xIG9ubHkgZm9yIE1QRUctNCAmIEguMjYzICYgSC4yNjMrIEZJWE1FCiAgICAgc3dpdGNoKHMtPmNvZGVjX2lkKXsKICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgogICAgICAgICBzLT5mY29kZV90YWI9IGZjb2RlX3RhYjsKQEAgLTgwMCw3ICs3OTksNyBAQAogICAgICAgICAgICAgcy0+bWF4X3Fjb2VmZj0gIDEyNzsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICAgICAgLy9Ob3RlIGZvciBtcGVnNCAmIGgyNjMgdGhlIGRjLXNjYWxlIHRhYmxlIHdpbGwgYmUgc2V0IHBlciBmcmFtZSBhcyBuZWVkZWQgbGF0ZXIKKyAgICAgICAgLy8gTm90ZSBmb3IgTVBFRy00ICYgSC4yNjMgdGhlIGRjLXNjYWxlIHRhYmxlIHdpbGwgYmUgc2V0IHBlciBmcmFtZSBhcyBuZWVkZWQgbGF0ZXIKICAgICBjYXNlIEFWX0NPREVDX0lEX0ZMVjE6CiAgICAgICAgIGlmIChzLT5oMjYzX2ZsdiA+IDEpIHsKICAgICAgICAgICAgIHMtPm1pbl9xY29lZmY9IC0xMDIzOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pdmkuYyBiL2xpYmF2Y29kZWMvaXZpLmMKaW5kZXggZTc3OTkwMC4uY2VhNDBkOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pdmkuYworKysgYi9saWJhdmNvZGVjL2l2aS5jCkBAIC0yOCwxMCArMjgsMTEgQEAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKLSNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVyLmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC03MywxMCArNzQsMTAgQEAKIHN0YXRpYyBWTEMgaXZpX2Jsa192bGNfdGFic1s4XTsgLy8vPCBzdGF0aWMgYmxvY2sgSHVmZm1hbiB0YWJsZXMKIAogdHlwZWRlZiB2b2lkICgqaXZpX21jX2Z1bmMpIChpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwaXRjaCwgaW50IG1jX3R5cGUpOwogdHlwZWRlZiB2b2lkICgqaXZpX21jX2F2Z19mdW5jKSAoaW50MTZfdCAqYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnJlZl9idWYyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlLCBpbnQgbWNfdHlwZTIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHBpdGNoLCBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyKTsKIAogc3RhdGljIGludCBpdmlfbWMoSVZJQmFuZERlc2MgKmJhbmQsIGl2aV9tY19mdW5jIG1jLCBpdmlfbWNfYXZnX2Z1bmMgbWNfYXZnLAogICAgICAgICAgICAgICAgICAgaW50IG9mZnMsIGludCBtdl94LCBpbnQgbXZfeSwgaW50IG12X3gyLCBpbnQgbXZfeTIsCkBAIC0zMDEsNyArMzAyLDcgQEAKICAgICB9CiB9CiAKLWF2X2NvbGQgaW50IGZmX2l2aV9pbml0X3BsYW5lcyhJVklQbGFuZURlc2MgKnBsYW5lcywgY29uc3QgSVZJUGljQ29uZmlnICpjZmcsCithdl9jb2xkIGludCBmZl9pdmlfaW5pdF9wbGFuZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBJVklQbGFuZURlc2MgKnBsYW5lcywgY29uc3QgSVZJUGljQ29uZmlnICpjZmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2luZGVvNCkKIHsKICAgICBpbnQgcCwgYjsKQEAgLTMxMSw3ICszMTIsNyBAQAogCiAgICAgaXZpX2ZyZWVfYnVmZmVycyhwbGFuZXMpOwogCi0gICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUoY2ZnLT5waWNfd2lkdGgsIGNmZy0+cGljX2hlaWdodCwgMCwgTlVMTCkgPCAwIHx8CisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUyKGNmZy0+cGljX3dpZHRoLCBjZmctPnBpY19oZWlnaHQsIGF2Y3R4LT5tYXhfcGl4ZWxzLCBBVl9QSVhfRk1UX1lVVjQxMFAsIDAsIGF2Y3R4KSA8IDAgfHwKICAgICAgICAgY2ZnLT5sdW1hX2JhbmRzIDwgMSB8fCBjZmctPmNocm9tYV9iYW5kcyA8IDEpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCkBAIC05MDIsMTEgKzkwMywxMSBAQAogICogIEBwYXJhbVtvdXRdICBkc3QgICAgICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciByZWNlaXZpbmcgY29udmVydGVkIHBpeGVscwogICogIEBwYXJhbVtpbl0gICBkc3RfcGl0Y2ggIHBpdGNoIGZvciBtb3ZpbmcgdG8gdGhlIG5leHQgeSBsaW5lCiAgKi8KLXN0YXRpYyB2b2lkIGl2aV9vdXRwdXRfcGxhbmUoSVZJUGxhbmVEZXNjICpwbGFuZSwgdWludDhfdCAqZHN0LCBpbnQgZHN0X3BpdGNoKQorc3RhdGljIHZvaWQgaXZpX291dHB1dF9wbGFuZShJVklQbGFuZURlc2MgKnBsYW5lLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfcGl0Y2gpCiB7CiAgICAgaW50ICAgICAgICAgICAgIHgsIHk7CiAgICAgY29uc3QgaW50MTZfdCAgICpzcmMgID0gcGxhbmUtPmJhbmRzWzBdLmJ1ZjsKLSAgICB1aW50MzJfdCAgICAgICAgcGl0Y2ggPSBwbGFuZS0+YmFuZHNbMF0ucGl0Y2g7CisgICAgcHRyZGlmZl90ICAgICAgIHBpdGNoID0gcGxhbmUtPmJhbmRzWzBdLnBpdGNoOwogCiAgICAgaWYgKCFzcmMpCiAgICAgICAgIHJldHVybjsKQEAgLTEwNTksNyArMTA2MCw5IEBACiAgICAgaW50ICAgICAgICAgICAgIGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CiAgICAgaW50ICAgICAgICAgICAgIHJlc3VsdCwgcCwgYjsKIAotICAgIGluaXRfZ2V0X2JpdHMoJmN0eC0+Z2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKyAgICByZXN1bHQgPSBpbml0X2dldF9iaXRzOCgmY3R4LT5nYiwgYnVmLCBidWZfc2l6ZSk7CisgICAgaWYgKHJlc3VsdCA8IDApCisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgY3R4LT5mcmFtZV9kYXRhID0gYnVmOwogICAgIGN0eC0+ZnJhbWVfc2l6ZSA9IGJ1Zl9zaXplOwogCkBAIC0xMTcyLDYgKzExNzUsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChjdHgtPnNob3dfaW5kZW80X2luZm8pIHsKKyAgICAgICAgaWYgKGN0eC0+aXNfc2NhbGFibGUpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlRoaXMgdmlkZW8gdXNlcyBzY2FsYWJpbGl0eSBtb2RlXG4iKTsKKyAgICAgICAgaWYgKGN0eC0+dXNlc190aWxpbmcpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlRoaXMgdmlkZW8gdXNlcyBsb2NhbCBkZWNvZGluZ1xuIik7CisgICAgICAgIGlmIChjdHgtPmhhc19iX2ZyYW1lcykKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVGhpcyB2aWRlbyBjb250YWlucyBCLWZyYW1lc1xuIik7CisgICAgICAgIGlmIChjdHgtPmhhc190cmFuc3ApCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlRyYW5zcGFyZW5jeSBtb2RlIGlzIGVuYWJsZWRcbiIpOworICAgICAgICBpZiAoY3R4LT51c2VzX2hhYXIpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlRoaXMgdmlkZW8gdXNlcyBIYWFyIHRyYW5zZm9ybVxuIik7CisgICAgICAgIGlmIChjdHgtPnVzZXNfZnVsbHBlbCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVGhpcyB2aWRlbyB1c2VzIGZ1bGxwZWwgbW90aW9uIHZlY3RvcnNcbiIpOworICAgICAgICBjdHgtPnNob3dfaW5kZW80X2luZm8gPSAwOworICAgIH0KKwogICAgIHJldHVybiBidWZfc2l6ZTsKIH0KIApAQCAtMTE4NywyMiArMTIwNiw4IEBACiAgICAgaWYgKGN0eC0+bWJfdmxjLmN1c3RfdGFiLnRhYmxlKQogICAgICAgICBmZl9mcmVlX3ZsYygmY3R4LT5tYl92bGMuY3VzdF90YWIpOwogCi0jaWYgSVZJNF9TVFJFQU1fQU5BTFlTRVIKLSAgICBpZiAoY3R4LT5pc19pbmRlbzQpIHsKLSAgICBpZiAoY3R4LT5pc19zY2FsYWJsZSkKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGlzIHZpZGVvIHVzZXMgc2NhbGFiaWxpdHkgbW9kZSFcbiIpOwotICAgIGlmIChjdHgtPnVzZXNfdGlsaW5nKQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoaXMgdmlkZW8gdXNlcyBsb2NhbCBkZWNvZGluZyFcbiIpOwotICAgIGlmIChjdHgtPmhhc19iX2ZyYW1lcykKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGlzIHZpZGVvIGNvbnRhaW5zIEItZnJhbWVzIVxuIik7Ci0gICAgaWYgKGN0eC0+aGFzX3RyYW5zcCkKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUcmFuc3BhcmVuY3kgbW9kZSBpcyBlbmFibGVkIVxuIik7Ci0gICAgaWYgKGN0eC0+dXNlc19oYWFyKQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoaXMgdmlkZW8gdXNlcyBIYWFyIHRyYW5zZm9ybSFcbiIpOwotICAgIGlmIChjdHgtPnVzZXNfZnVsbHBlbCkKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGlzIHZpZGVvIHVzZXMgZnVsbHBlbCBtb3Rpb24gdmVjdG9ycyFcbiIpOwotICAgIH0KLSNlbmRpZgorICAgIGlmIChjdHgtPmJsa192bGMuY3VzdF90YWIudGFibGUpCisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPmJsa192bGMuY3VzdF90YWIpOwogCiAgICAgYXZfZnJhbWVfZnJlZSgmY3R4LT5wX2ZyYW1lKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pdmkuaCBiL2xpYmF2Y29kZWMvaXZpLmgKaW5kZXggYWJlNDM0Ni4uMTQyNzUzNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9pdmkuaAorKysgYi9saWJhdmNvZGVjL2l2aS5oCkBAIC00Nyw3ICs0Nyw2IEBACiB9OwogCiAjZGVmaW5lIElWSV9WTENfQklUUyAxMyAvLy88IG1heCBudW1iZXIgb2YgYml0cyBvZiB0aGUgaXZpJ3MgaHVmZm1hbiBjb2RlcwotI2RlZmluZSBJVkk0X1NUUkVBTV9BTkFMWVNFUiAgICAwCiAjZGVmaW5lIElWSTVfSVNfUFJPVEVDVEVEICAgICAgIDB4MjAKIAogLyoqCkBAIC04OCw4ICs4Nyw4IEBACiAvKioKICAqICBEZWNsYXJlIGludmVyc2UgdHJhbnNmb3JtIGZ1bmN0aW9uIHR5cGVzCiAgKi8KLXR5cGVkZWYgdm9pZCAoSW52VHJhbnNmb3JtUHRyKShjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpOwotdHlwZWRlZiB2b2lkIChEQ1RyYW5zZm9ybVB0cikgKGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBpbnQgYmxrX3NpemUpOwordHlwZWRlZiB2b2lkIChJbnZUcmFuc2Zvcm1QdHIpKGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpOwordHlwZWRlZiB2b2lkIChEQ1RyYW5zZm9ybVB0cikgKGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwgaW50IGJsa19zaXplKTsKIAogCiAvKioKQEAgLTE1NCw3ICsxNTMsNyBAQAogICAgIGludDE2X3QgICAgICAgICAqcmVmX2J1ZjsgICAgICAgLy8vPCBwb2ludGVyIHRvIHRoZSByZWZlcmVuY2UgZnJhbWUgYnVmZmVyIChmb3IgbW90aW9uIGNvbXBlbnNhdGlvbikKICAgICBpbnQxNl90ICAgICAgICAgKmJfcmVmX2J1ZjsgICAgIC8vLzwgcG9pbnRlciB0byB0aGUgc2Vjb25kIHJlZmVyZW5jZSBmcmFtZSBidWZmZXIgKGZvciBtb3Rpb24gY29tcGVuc2F0aW9uKQogICAgIGludDE2X3QgICAgICAgICAqYnVmc1s0XTsgICAgICAgLy8vPCBhcnJheSBvZiBwb2ludGVycyB0byB0aGUgYmFuZCBidWZmZXJzCi0gICAgaW50ICAgICAgICAgICAgIHBpdGNoOyAgICAgICAgICAvLy88IHBpdGNoIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVycyBhYm92ZQorICAgIHB0cmRpZmZfdCAgICAgICBwaXRjaDsgICAgICAgICAgLy8vPCBwaXRjaCBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcnMgYWJvdmUKICAgICBpbnQgICAgICAgICAgICAgaXNfZW1wdHk7ICAgICAgIC8vLzwgPSAxIGlmIHRoaXMgYmFuZCBkb2Vzbid0IGNvbnRhaW4gYW55IGRhdGEKICAgICBpbnQgICAgICAgICAgICAgbWJfc2l6ZTsgICAgICAgIC8vLzwgbWFjcm9ibG9jayBzaXplCiAgICAgaW50ICAgICAgICAgICAgIGJsa19zaXplOyAgICAgICAvLy88IGJsb2NrIHNpemUKQEAgLTIyMCw3ICsyMTksNiBAQAogICAgIGludCAgICAgICAgICAgICBwcmV2X2ZyYW1lX3R5cGU7IC8vLzwgZnJhbWUgdHlwZSBvZiB0aGUgcHJldmlvdXMgZnJhbWUKICAgICB1aW50MzJfdCAgICAgICAgZGF0YV9zaXplOyAgICAgICAvLy88IHNpemUgb2YgdGhlIGZyYW1lIGRhdGEgaW4gYnl0ZXMgZnJvbSBwaWN0dXJlIGhlYWRlcgogICAgIGludCAgICAgICAgICAgICBpc19zY2FsYWJsZTsKLSAgICBpbnQgICAgICAgICAgICAgdHJhbnNwX3N0YXR1czsgICAvLy88IHRyYW5zcGFyZW5jeSBtb2RlIHN0YXR1czogMSAtIGVuYWJsZWQKICAgICBjb25zdCB1aW50OF90ICAgKmZyYW1lX2RhdGE7ICAgICAvLy88IGlucHV0IGZyYW1lIGRhdGEgcG9pbnRlcgogICAgIGludCAgICAgICAgICAgICBpbnRlcl9zY2FsOyAgICAgIC8vLzwgc2lnbmFscyBhIHNlcXVlbmNlIG9mIHNjYWxhYmxlIGludGVyIGZyYW1lcwogICAgIHVpbnQzMl90ICAgICAgICBmcmFtZV9zaXplOyAgICAgIC8vLzwgZnJhbWUgc2l6ZSBpbiBieXRlcwpAQCAtMjUwLDEzICsyNDgsMTIgQEAKICAgICB1aW50OF90ICAgICAgICAgZ29wX2ZsYWdzOwogICAgIHVpbnQzMl90ICAgICAgICBsb2NrX3dvcmQ7CiAKLSNpZiBJVkk0X1NUUkVBTV9BTkFMWVNFUgorICAgIGludCAgICAgICAgICAgICBzaG93X2luZGVvNF9pbmZvOwogICAgIHVpbnQ4X3QgICAgICAgICBoYXNfYl9mcmFtZXM7Ci0gICAgdWludDhfdCAgICAgICAgIGhhc190cmFuc3A7CisgICAgdWludDhfdCAgICAgICAgIGhhc190cmFuc3A7ICAgICAgLy8vPCB0cmFuc3BhcmVuY3kgbW9kZSBzdGF0dXM6IDEgLSBlbmFibGVkCiAgICAgdWludDhfdCAgICAgICAgIHVzZXNfdGlsaW5nOwogICAgIHVpbnQ4X3QgICAgICAgICB1c2VzX2hhYXI7CiAgICAgdWludDhfdCAgICAgICAgIHVzZXNfZnVsbHBlbDsKLSNlbmRpZgogCiAgICAgaW50ICAgICAgICAgICAgICgqZGVjb2RlX3BpY19oZHIpICAoc3RydWN0IElWSTQ1RGVjQ29udGV4dCAqY3R4LCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwogICAgIGludCAgICAgICAgICAgICAoKmRlY29kZV9iYW5kX2hkcikgKHN0cnVjdCBJVkk0NURlY0NvbnRleHQgKmN0eCwgSVZJQmFuZERlc2MgKmJhbmQsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CkBAIC0zMjUsOCArMzIyLDggQEAKICAqICBAcGFyYW1baW5dICAgICAgaXNfaW5kZW80ICBmbGFnIHNpZ25hbGxpbmcgaWYgaXQgaXMgSW5kZW8gNCBvciBub3QKICAqICBAcmV0dXJuICAgICAgICAgICAgIHJlc3VsdCBjb2RlOiAwIC0gT0sKICAqLwotaW50ICBmZl9pdmlfaW5pdF9wbGFuZXMoSVZJUGxhbmVEZXNjICpwbGFuZXMsIGNvbnN0IElWSVBpY0NvbmZpZyAqY2ZnLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2luZGVvNCk7CitpbnQgIGZmX2l2aV9pbml0X3BsYW5lcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIElWSVBsYW5lRGVzYyAqcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSVZJUGljQ29uZmlnICpjZmcsIGludCBpc19pbmRlbzQpOwogCiAvKioKICAqICBJbml0aWFsaXplIHRpbGUgYW5kIG1hY3JvYmxvY2sgZGVzY3JpcHRvcnMuCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2l2aV9kc3AuYyBiL2xpYmF2Y29kZWMvaXZpX2RzcC5jCmluZGV4IDRiOTczOTkuLjRhZWRmMTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvaXZpX2RzcC5jCisrKyBiL2xpYmF2Y29kZWMvaXZpX2RzcC5jCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIERTUCBmdW5jdGlvbnMgKGludmVyc2UgdHJhbnNmb3JtcywgbW90aW9uIGNvbXBlbnNhdGlvbiwgd2F2ZWxldCByZWNvbXBvc3Rpb25zKQorICogRFNQIGZ1bmN0aW9ucyAoaW52ZXJzZSB0cmFuc2Zvcm1zLCBtb3Rpb24gY29tcGVuc2F0aW9uLCB3YXZlbGV0IHJlY29tcG9zaXRpb25zKQogICogZm9yIEluZGVvIFZpZGVvIEludGVyYWN0aXZlIGNvZGVjcy4KICAqLwogCkBAIC0zMSwxMyArMzEsMTMgQEAKICNpbmNsdWRlICJpdmlfZHNwLmgiCiAKIHZvaWQgZmZfaXZpX3JlY29tcG9zZTUzKGNvbnN0IElWSVBsYW5lRGVzYyAqcGxhbmUsIHVpbnQ4X3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3RfcGl0Y2gpCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdHJkaWZmX3QgZHN0X3BpdGNoKQogewogICAgIGludCAgICAgICAgICAgICB4LCB5LCBpbmR4OwogICAgIGludDMyX3QgICAgICAgICBwMCwgcDEsIHAyLCBwMywgdG1wMCwgdG1wMSwgdG1wMjsKICAgICBpbnQzMl90ICAgICAgICAgYjBfMSwgYjBfMiwgYjFfMSwgYjFfMiwgYjFfMywgYjJfMSwgYjJfMiwgYjJfMywgYjJfNCwgYjJfNSwgYjJfNjsKICAgICBpbnQzMl90ICAgICAgICAgYjNfMSwgYjNfMiwgYjNfMywgYjNfNCwgYjNfNSwgYjNfNiwgYjNfNywgYjNfOCwgYjNfOTsKLSAgICBpbnQzMl90ICAgICAgICAgcGl0Y2gsIGJhY2tfcGl0Y2g7CisgICAgcHRyZGlmZl90ICAgICAgIHBpdGNoLCBiYWNrX3BpdGNoOwogICAgIGNvbnN0IHNob3J0ICAgICAqYjBfcHRyLCAqYjFfcHRyLCAqYjJfcHRyLCAqYjNfcHRyOwogICAgIGNvbnN0IGludCAgICAgICBudW1fYmFuZHMgPSA0OwogCkBAIC0xMTYsMTAgKzExNiwxMCBAQAogICAgICAgICAgICAgICAgIGIwXzIgPSBiMF9wdHJbcGl0Y2graW5keCsxXTsKICAgICAgICAgICAgICAgICB0bXAxID0gdG1wMCArIGIwXzE7CiAKLSAgICAgICAgICAgICAgICBwMCA9ICB0bXAwIDw8IDQ7Ci0gICAgICAgICAgICAgICAgcDEgPSAgdG1wMSA8PCAzOwotICAgICAgICAgICAgICAgIHAyID0gKHRtcDAgKyB0bXAyKSA8PCAzOwotICAgICAgICAgICAgICAgIHAzID0gKHRtcDEgKyB0bXAyICsgYjBfMikgPDwgMjsKKyAgICAgICAgICAgICAgICBwMCA9ICB0bXAwICogMTY7CisgICAgICAgICAgICAgICAgcDEgPSAgdG1wMSAqIDg7CisgICAgICAgICAgICAgICAgcDIgPSAodG1wMCArIHRtcDIpICogODsKKyAgICAgICAgICAgICAgICBwMyA9ICh0bXAxICsgdG1wMiArIGIwXzIpICogNDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogcHJvY2VzcyB0aGUgSEwtYmFuZCBieSBhcHBseWluZyBIUEYgdmVydGljYWxseSBhbmQgTFBGIGhvcml6b250YWxseSAqLwpAQCAtMTMyLDEwICsxMzIsMTAgQEAKICAgICAgICAgICAgICAgICB0bXAyID0gdG1wMSAtIHRtcDAqNiArIGIxXzM7CiAgICAgICAgICAgICAgICAgYjFfMyA9IGIxXzEgLSBiMV8yKjYgKyBiMV9wdHJbcGl0Y2graW5keCsxXTsKIAotICAgICAgICAgICAgICAgIHAwICs9ICh0bXAwICsgdG1wMSkgPDwgMzsKLSAgICAgICAgICAgICAgICBwMSArPSAodG1wMCArIHRtcDEgKyBiMV8xICsgYjFfMikgPDwgMjsKLSAgICAgICAgICAgICAgICBwMiArPSAgdG1wMiA8PCAyOwotICAgICAgICAgICAgICAgIHAzICs9ICh0bXAyICsgYjFfMykgPDwgMTsKKyAgICAgICAgICAgICAgICBwMCArPSAodG1wMCArIHRtcDEpICogODsKKyAgICAgICAgICAgICAgICBwMSArPSAodG1wMCArIHRtcDEgKyBiMV8xICsgYjFfMikgKiA0OworICAgICAgICAgICAgICAgIHAyICs9ICB0bXAyICogNDsKKyAgICAgICAgICAgICAgICBwMyArPSAodG1wMiArIGIxXzMpICogMjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogcHJvY2VzcyB0aGUgTEgtYmFuZCBieSBhcHBseWluZyBMUEYgdmVydGljYWxseSBhbmQgSFBGIGhvcml6b250YWxseSAqLwpAQCAtMTQ2LDEwICsxNDYsMTAgQEAKICAgICAgICAgICAgICAgICB0bXAwID0gYjJfMSArIGIyXzI7CiAgICAgICAgICAgICAgICAgdG1wMSA9IGIyXzEgLSBiMl8yKjYgKyBiMl8zOwogCi0gICAgICAgICAgICAgICAgcDAgKz0gdG1wMCA8PCAzOwotICAgICAgICAgICAgICAgIHAxICs9IHRtcDEgPDwgMjsKLSAgICAgICAgICAgICAgICBwMiArPSAodG1wMCArIGIyXzQgKyBiMl81KSA8PCAyOwotICAgICAgICAgICAgICAgIHAzICs9ICh0bXAxICsgYjJfNCAtIGIyXzUqNiArIGIyXzYpIDw8IDE7CisgICAgICAgICAgICAgICAgcDAgKz0gdG1wMCAqIDg7CisgICAgICAgICAgICAgICAgcDEgKz0gdG1wMSAqIDQ7CisgICAgICAgICAgICAgICAgcDIgKz0gKHRtcDAgKyBiMl80ICsgYjJfNSkgKiA0OworICAgICAgICAgICAgICAgIHAzICs9ICh0bXAxICsgYjJfNCAtIGIyXzUqNiArIGIyXzYpICogMjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogcHJvY2VzcyB0aGUgSEgtYmFuZCBieSBhcHBseWluZyBIUEYgYm90aCB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHkgKi8KQEAgLTE2Myw5ICsxNjMsOSBAQAogCiAgICAgICAgICAgICAgICAgYjNfOSA9IGIzXzMgLSBiM182KjYgKyBiM19wdHJbcGl0Y2graW5keCsxXTsKIAotICAgICAgICAgICAgICAgIHAwICs9ICh0bXAwICsgdG1wMSkgPDwgMjsKLSAgICAgICAgICAgICAgICBwMSArPSAodG1wMCAtIHRtcDEqNiArIHRtcDIpIDw8IDE7Ci0gICAgICAgICAgICAgICAgcDIgKz0gKGIzXzcgKyBiM184KSA8PCAxOworICAgICAgICAgICAgICAgIHAwICs9ICh0bXAwICsgdG1wMSkgKiA0OworICAgICAgICAgICAgICAgIHAxICs9ICh0bXAwIC0gdG1wMSo2ICsgdG1wMikgKiAyOworICAgICAgICAgICAgICAgIHAyICs9IChiM183ICsgYjNfOCkgKiAyOwogICAgICAgICAgICAgICAgIHAzICs9ICBiM183IC0gYjNfOCo2ICsgYjNfOTsKICAgICAgICAgICAgIH0KIApAQCAtMTg4LDExICsxODgsMTEgQEAKIH0KIAogdm9pZCBmZl9pdmlfcmVjb21wb3NlX2hhYXIoY29uc3QgSVZJUGxhbmVEZXNjICpwbGFuZSwgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRzdF9waXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBkc3RfcGl0Y2gpCiB7CiAgICAgaW50ICAgICAgICAgICAgIHgsIHksIGluZHgsIGIwLCBiMSwgYjIsIGIzLCBwMCwgcDEsIHAyLCBwMzsKICAgICBjb25zdCBzaG9ydCAgICAgKmIwX3B0ciwgKmIxX3B0ciwgKmIyX3B0ciwgKmIzX3B0cjsKLSAgICBpbnQzMl90ICAgICAgICAgcGl0Y2g7CisgICAgcHRyZGlmZl90ICAgICAgIHBpdGNoOwogCiAgICAgLyogYWxsIGJhbmRzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHBpdGNoICovCiAgICAgcGl0Y2ggPSBwbGFuZS0+YmFuZHNbMF0ucGl0Y2g7CkBAIC0yNDMsNyArMjQzLDcgQEAKICNkZWZpbmUgSU5WX0hBQVI4KHMxLCBzNSwgczMsIHM3LCBzMiwgczQsIHM2LCBzOCxcCiAgICAgICAgICAgICAgICAgICBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsXAogICAgICAgICAgICAgICAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NSwgdDYsIHQ3LCB0OCkge1wKLSAgICB0MSA9IChzMSkgPDwgMTsgdDUgPSAoczUpIDw8IDE7XAorICAgIHQxID0gKHMxKSAqIDI7IHQ1ID0gKHM1KSAqIDI7XAogICAgIElWSV9IQUFSX0JGTFkodDEsIHQ1LCB0MSwgdDUsIHQwKTsgSVZJX0hBQVJfQkZMWSh0MSwgczMsIHQxLCB0MywgdDApO1wKICAgICBJVklfSEFBUl9CRkxZKHQ1LCBzNywgdDUsIHQ3LCB0MCk7IElWSV9IQUFSX0JGTFkodDEsIHMyLCB0MSwgdDIsIHQwKTtcCiAgICAgSVZJX0hBQVJfQkZMWSh0MywgczQsIHQzLCB0NCwgdDApOyBJVklfSEFBUl9CRkxZKHQ1LCBzNiwgdDUsIHQ2LCB0MCk7XApAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgZDMgPSBDT01QRU5TQVRFKHQyKTtcCiAgICAgZDQgPSBDT01QRU5TQVRFKHQzKTsgfQogCi12b2lkIGZmX2l2aV9pbnZlcnNlX2hhYXJfOHg4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfaW52ZXJzZV9oYWFyXzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKQogewogICAgIGludCAgICAgaSwgc2hpZnQsIHNwMSwgc3AyLCBzcDMsIHNwNDsKQEAgLTI4NCwxMCArMjg0LDEwIEBACiAgICAgICAgIGlmIChmbGFnc1tpXSkgewogICAgICAgICAgICAgLyogcHJlLXNjYWxpbmcgKi8KICAgICAgICAgICAgIHNoaWZ0ID0gIShpICYgNCk7Ci0gICAgICAgICAgICBzcDEgPSBzcmNbIDBdIDw8IHNoaWZ0OwotICAgICAgICAgICAgc3AyID0gc3JjWyA4XSA8PCBzaGlmdDsKLSAgICAgICAgICAgIHNwMyA9IHNyY1sxNl0gPDwgc2hpZnQ7Ci0gICAgICAgICAgICBzcDQgPSBzcmNbMjRdIDw8IHNoaWZ0OworICAgICAgICAgICAgc3AxID0gc3JjWyAwXSAqICgxIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgIHNwMiA9IHNyY1sgOF0gKiAoMSA8PCBzaGlmdCk7CisgICAgICAgICAgICBzcDMgPSBzcmNbMTZdICogKDEgPDwgc2hpZnQpOworICAgICAgICAgICAgc3A0ID0gc3JjWzI0XSAqICgxIDw8IHNoaWZ0KTsKICAgICAgICAgICAgIElOVl9IQUFSOCggICAgc3AxLCAgICAgc3AyLCAgICAgc3AzLCAgICAgc3A0LAogICAgICAgICAgICAgICAgICAgICAgIHNyY1szMl0sIHNyY1s0MF0sIHNyY1s0OF0sIHNyY1s1Nl0sCiAgICAgICAgICAgICAgICAgICAgICAgZHN0WyAwXSwgZHN0WyA4XSwgZHN0WzE2XSwgZHN0WzI0XSwKQEAgLTMyMiw3ICszMjIsNyBAQAogI3VuZGVmICBDT01QRU5TQVRFCiB9CiAKLXZvaWQgZmZfaXZpX3Jvd19oYWFyOChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKK3ZvaWQgZmZfaXZpX3Jvd19oYWFyOChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpCiB7CiAgICAgaW50ICAgICBpOwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAjdW5kZWYgIENPTVBFTlNBVEUKIH0KIAotdm9pZCBmZl9pdmlfY29sX2hhYXI4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfY29sX2hhYXI4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncykKIHsKICAgICBpbnQgICAgIGk7CkBAIC0zNzYsNyArMzc2LDcgQEAKICN1bmRlZiAgQ09NUEVOU0FURQogfQogCi12b2lkIGZmX2l2aV9pbnZlcnNlX2hhYXJfNHg0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfaW52ZXJzZV9oYWFyXzR4NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKQogewogICAgIGludCAgICAgaSwgc2hpZnQsIHNwMSwgc3AyOwpAQCAtMzkzLDggKzM5Myw4IEBACiAgICAgICAgIGlmIChmbGFnc1tpXSkgewogICAgICAgICAgICAgLyogcHJlLXNjYWxpbmcgKi8KICAgICAgICAgICAgIHNoaWZ0ID0gIShpICYgMik7Ci0gICAgICAgICAgICBzcDEgPSBzcmNbMF0gPDwgc2hpZnQ7Ci0gICAgICAgICAgICBzcDIgPSBzcmNbNF0gPDwgc2hpZnQ7CisgICAgICAgICAgICBzcDEgPSBzcmNbMF0gKiAoMSA8PCBzaGlmdCk7CisgICAgICAgICAgICBzcDIgPSBzcmNbNF0gKiAoMSA8PCBzaGlmdCk7CiAgICAgICAgICAgICBJTlZfSEFBUjQoICAgc3AxLCAgICBzcDIsIHNyY1s4XSwgc3JjWzEyXSwKICAgICAgICAgICAgICAgICAgICAgICBkc3RbMF0sIGRzdFs0XSwgZHN0WzhdLCBkc3RbMTJdLAogICAgICAgICAgICAgICAgICAgICAgIHQwLCB0MSwgdDIsIHQzLCB0NCk7CkBAIC00MjMsNyArNDIzLDcgQEAKICN1bmRlZiAgQ09NUEVOU0FURQogfQogCi12b2lkIGZmX2l2aV9yb3dfaGFhcjQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCit2b2lkIGZmX2l2aV9yb3dfaGFhcjQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKQogewogICAgIGludCAgICAgaTsKQEAgLTQ0NSw3ICs0NDUsNyBAQAogI3VuZGVmICBDT01QRU5TQVRFCiB9CiAKLXZvaWQgZmZfaXZpX2NvbF9oYWFyNChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKK3ZvaWQgZmZfaXZpX2NvbF9oYWFyNChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpCiB7CiAgICAgaW50ICAgICBpOwpAQCAtNDY5LDcgKzQ2OSw3IEBACiAjdW5kZWYgIENPTVBFTlNBVEUKIH0KIAotdm9pZCBmZl9pdmlfZGNfaGFhcl8yZChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKK3ZvaWQgZmZfaXZpX2RjX2hhYXJfMmQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrX3NpemUpCiB7CiAgICAgaW50ICAgICB4LCB5OwpAQCAtNTMzLDcgKzUzMyw3IEBACiAgICAgZDMgPSBDT01QRU5TQVRFKHQzKTtcCiAgICAgZDQgPSBDT01QRU5TQVRFKHQ0KTt9CiAKLXZvaWQgZmZfaXZpX2ludmVyc2Vfc2xhbnRfOHg4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncykKK3ZvaWQgZmZfaXZpX2ludmVyc2Vfc2xhbnRfOHg4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpCiB7CiAgICAgaW50ICAgICBpOwogICAgIGNvbnN0IGludDMyX3QgKnNyYzsKQEAgLTU1Miw4ICs1NTIsOCBAQAogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgIGRzdFswXSA9IGRzdFs4XSA9IGRzdFsxNl0gPSBkc3RbMjRdID0gZHN0WzMyXSA9IGRzdFs0MF0gPSBkc3RbNDhdID0gZHN0WzU2XSA9IDA7CiAKLSAgICAgICAgICAgIHNyYysrOwotICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIHNyYysrOworICAgICAgICBkc3QrKzsKICAgICB9CiAjdW5kZWYgQ09NUEVOU0FURQogCkBAIC01NzMsNyArNTczLDcgQEAKICN1bmRlZiBDT01QRU5TQVRFCiB9CiAKLXZvaWQgZmZfaXZpX2ludmVyc2Vfc2xhbnRfNHg0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncykKK3ZvaWQgZmZfaXZpX2ludmVyc2Vfc2xhbnRfNHg0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpCiB7CiAgICAgaW50ICAgICBpOwogICAgIGNvbnN0IGludDMyX3QgKnNyYzsKQEAgLTU5Miw4ICs1OTIsOCBAQAogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgIGRzdFswXSA9IGRzdFs0XSA9IGRzdFs4XSA9IGRzdFsxMl0gPSAwOwogCi0gICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgICAgIGRzdCsrOworICAgICAgICBzcmMrKzsKKyAgICAgICAgZHN0Kys7CiAgICAgfQogI3VuZGVmIENPTVBFTlNBVEUKIApAQCAtNjEzLDcgKzYxMyw3IEBACiAjdW5kZWYgQ09NUEVOU0FURQogfQogCi12b2lkIGZmX2l2aV9kY19zbGFudF8yZChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgaW50IGJsa19zaXplKQordm9pZCBmZl9pdmlfZGNfc2xhbnRfMmQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLCBpbnQgYmxrX3NpemUpCiB7CiAgICAgaW50ICAgICB4LCB5OwogICAgIGludDE2X3QgZGNfY29lZmY7CkBAIC02MjYsNyArNjI2LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgZmZfaXZpX3Jvd19zbGFudDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKQordm9pZCBmZl9pdmlfcm93X3NsYW50OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKQogewogICAgIGludCAgICAgaTsKICAgICBpbnQgICAgIHQwLCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDg7CkBAIC02NDYsNyArNjQ2LDcgQEAKICN1bmRlZiBDT01QRU5TQVRFCiB9CiAKLXZvaWQgZmZfaXZpX2RjX3Jvd19zbGFudChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgaW50IGJsa19zaXplKQordm9pZCBmZl9pdmlfZGNfcm93X3NsYW50KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwgaW50IGJsa19zaXplKQogewogICAgIGludCAgICAgeCwgeTsKICAgICBpbnQxNl90IGRjX2NvZWZmOwpAQCAtNjY0LDcgKzY2NCw3IEBACiAgICAgfQogfQogCi12b2lkIGZmX2l2aV9jb2xfc2xhbnQ4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncykKK3ZvaWQgZmZfaXZpX2NvbF9zbGFudDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncykKIHsKICAgICBpbnQgICAgIGksIHJvdzIsIHJvdzQsIHJvdzg7CiAgICAgaW50ICAgICB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsIHQ4OwpAQCAtNjkxLDcgKzY5MSw3IEBACiAjdW5kZWYgQ09NUEVOU0FURQogfQogCi12b2lkIGZmX2l2aV9kY19jb2xfc2xhbnQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGludCBibGtfc2l6ZSkKK3ZvaWQgZmZfaXZpX2RjX2NvbF9zbGFudChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsIGludCBibGtfc2l6ZSkKIHsKICAgICBpbnQgICAgIHgsIHk7CiAgICAgaW50MTZfdCBkY19jb2VmZjsKQEAgLTcwNSw3ICs3MDUsNyBAQAogICAgIH0KIH0KIAotdm9pZCBmZl9pdmlfcm93X3NsYW50NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpCit2b2lkIGZmX2l2aV9yb3dfc2xhbnQ0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpCiB7CiAgICAgaW50ICAgICBpOwogICAgIGludCAgICAgdDAsIHQxLCB0MiwgdDMsIHQ0OwpAQCAtNzI1LDcgKzcyNSw3IEBACiAjdW5kZWYgQ09NUEVOU0FURQogfQogCi12b2lkIGZmX2l2aV9jb2xfc2xhbnQ0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncykKK3ZvaWQgZmZfaXZpX2NvbF9zbGFudDQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncykKIHsKICAgICBpbnQgICAgIGksIHJvdzI7CiAgICAgaW50ICAgICB0MCwgdDEsIHQyLCB0MywgdDQ7CkBAIC03NDgsNyArNzQ4LDcgQEAKICN1bmRlZiBDT01QRU5TQVRFCiB9CiAKLXZvaWQgZmZfaXZpX3B1dF9waXhlbHNfOHg4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfcHV0X3BpeGVsc184eDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpCiB7CiAgICAgaW50ICAgICB4LCB5OwpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgICAgICAgICBvdXRbeF0gPSBpblt4XTsKIH0KIAotdm9pZCBmZl9pdmlfcHV0X2RjX3BpeGVsXzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKK3ZvaWQgZmZfaXZpX3B1dF9kY19waXhlbF84eDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxrX3NpemUpCiB7CiAgICAgaW50ICAgICB5OwpAQCAtNzczLDkgKzc3Myw5IEBACiAKICNkZWZpbmUgSVZJX01DX1RFTVBMQVRFKHNpemUsIHN1ZmZpeCwgT1ApIFwKIHN0YXRpYyB2b2lkIGl2aV9tY18gIyMgc2l6ZSAjI3gjIyBzaXplICMjIHN1ZmZpeChpbnQxNl90ICpidWYsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkcGl0Y2gsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHBpdGNoLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwaXRjaCwgaW50IG1jX3R5cGUpIFwKIHsgXAogICAgIGludCAgICAgaSwgajsgXAogICAgIGNvbnN0IGludDE2X3QgKndwdHI7IFwKQEAgLTgwOSw3ICs4MDksNyBAQAogfSBcCiBcCiB2b2lkIGZmX2l2aV9tY18gIyMgc2l6ZSAjI3gjIyBzaXplICMjIHN1ZmZpeChpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHBpdGNoLCBpbnQgbWNfdHlwZSkgXAogeyBcCiAgICAgaXZpX21jXyAjIyBzaXplICMjeCMjIHNpemUgIyMgc3VmZml4KGJ1ZiwgcGl0Y2gsIHJlZl9idWYsIHBpdGNoLCBtY190eXBlKTsgXAogfSBcCkBAIC04MTgsNyArODE4LDcgQEAKIHZvaWQgZmZfaXZpX21jX2F2Z18gIyMgc2l6ZSAjI3gjIyBzaXplICMjIHN1ZmZpeChpbnQxNl90ICpidWYsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpyZWZfYnVmLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqcmVmX2J1ZjIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwaXRjaCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwaXRjaCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtY190eXBlLCBpbnQgbWNfdHlwZTIpIFwKIHsgXAogICAgIGludDE2X3QgdG1wW3NpemUgKiBzaXplXTsgXApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9pdmlfZHNwLmggYi9saWJhdmNvZGVjL2l2aV9kc3AuaAppbmRleCBmNjRjNzE4Li4yNzA0ZDJiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2l2aV9kc3AuaAorKysgYi9saWJhdmNvZGVjL2l2aV9kc3AuaApAQCAtMjIsMTMgKzIyLDE0IEBACiAKIC8qKgogICogQGZpbGUKLSAqIERTUCBmdW5jdGlvbnMgKGludmVyc2UgdHJhbnNmb3JtcywgbW90aW9uIGNvbXBlbnNhdGlvbnMsIHdhdmVsZXQgcmVjb21wb3N0aW9uKQorICogRFNQIGZ1bmN0aW9ucyAoaW52ZXJzZSB0cmFuc2Zvcm1zLCBtb3Rpb24gY29tcGVuc2F0aW9ucywgd2F2ZWxldCByZWNvbXBvc2l0aW9uKQogICogZm9yIEluZGVvIFZpZGVvIEludGVyYWN0aXZlIGNvZGVjcy4KICAqLwogCiAjaWZuZGVmIEFWQ09ERUNfSVZJX0RTUF9ICiAjZGVmaW5lIEFWQ09ERUNfSVZJX0RTUF9ICiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgIml2aS5oIgpAQCAtNDEsNyArNDIsNyBAQAogICogIEBwYXJhbVtpbl0gICBkc3RfcGl0Y2ggICAgcGl0Y2ggb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgogICovCiB2b2lkIGZmX2l2aV9yZWNvbXBvc2U1Myhjb25zdCBJVklQbGFuZURlc2MgKnBsYW5lLCB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZHN0X3BpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBkc3RfcGl0Y2gpOwogCiAvKioKICAqICBIYWFyIHdhdmVsZXQgcmVjb21wb3NpdGlvbiBmaWx0ZXIgZm9yIEluZGVvIDQKQEAgLTUxLDcgKzUyLDcgQEAKICAqICBAcGFyYW1baW5dICBkc3RfcGl0Y2ggICAgcGl0Y2ggb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlcgogICovCiB2b2lkIGZmX2l2aV9yZWNvbXBvc2VfaGFhcihjb25zdCBJVklQbGFuZURlc2MgKnBsYW5lLCB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZHN0X3BpdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0cmRpZmZfdCBkc3RfcGl0Y2gpOwogCiAvKioKICAqICB0d28tZGltZW5zaW9uYWwgaW52ZXJzZSBIYWFyIDh4OCB0cmFuc2Zvcm0gZm9yIEluZGVvIDQKQEAgLTYzLDcgKzY0LDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCAtIG5vbl9lbXB0eSBjb2x1bW4sIDAgLSBlbXB0eSBvbmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXJyYXkgbXVzdCBiZSBmaWxsZWQgYnkgY2FsbGVyKQogICovCi12b2lkIGZmX2l2aV9pbnZlcnNlX2hhYXJfOHg4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfaW52ZXJzZV9oYWFyXzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKTsKIHZvaWQgZmZfaXZpX2ludmVyc2VfaGFhcl84eDEoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKTsKQEAgLTgwLDcgKzgxLDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCAtIG5vbl9lbXB0eSBjb2x1bW4sIDAgLSBlbXB0eSBvbmUKICAqICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXJyYXkgbXVzdCBiZSBmaWxsZWQgYnkgY2FsbGVyKQogICovCi12b2lkIGZmX2l2aV9yb3dfaGFhcjgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCit2b2lkIGZmX2l2aV9yb3dfaGFhcjgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKTsKIAogLyoqCkBAIC05Myw3ICs5NCw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKICAqLwotdm9pZCBmZl9pdmlfY29sX2hhYXI4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfY29sX2hhYXI4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CiAKIC8qKgpAQCAtMTA2LDcgKzEwNyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKICAqLwotdm9pZCBmZl9pdmlfaW52ZXJzZV9oYWFyXzR4NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwKK3ZvaWQgZmZfaXZpX2ludmVyc2VfaGFhcl80eDQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CiAKIC8qKgpAQCAtMTE5LDcgKzEyMCw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKICAqLwotdm9pZCBmZl9pdmlfcm93X2hhYXI0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfcm93X2hhYXI0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CiAKIC8qKgpAQCAtMTMyLDcgKzEzMyw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKICAqLwotdm9pZCBmZl9pdmlfY29sX2hhYXI0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfY29sX2hhYXI0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CiAKIC8qKgpAQCAtMTQ1LDcgKzE0Niw3IEBACiAgKiAgQHBhcmFtW2luXSAgcGl0Y2ggICAgICAgcGl0Y2ggdG8gbW92ZSB0byB0aGUgbmV4dCB5IGxpbmUKICAqICBAcGFyYW1baW5dICBibGtfc2l6ZSAgICB0cmFuc2Zvcm0gYmxvY2sgc2l6ZQogICovCi12b2lkIGZmX2l2aV9kY19oYWFyXzJkKGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfZGNfaGFhcl8yZChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGtfc2l6ZSk7CiAKIC8qKgpAQCAtMTU4LDcgKzE1OSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKICAqLwotdm9pZCBmZl9pdmlfaW52ZXJzZV9zbGFudF84eDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCit2b2lkIGZmX2l2aV9pbnZlcnNlX3NsYW50Xzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CiAKIC8qKgpAQCAtMTcxLDcgKzE3Miw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICE9IDAgLSBub25fZW1wdHkgY29sdW1uLCAwIC0gZW1wdHkgb25lCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFycmF5IG11c3QgYmUgZmlsbGVkIGJ5IGNhbGxlcikKICAqLwotdm9pZCBmZl9pdmlfaW52ZXJzZV9zbGFudF80eDQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCit2b2lkIGZmX2l2aV9pbnZlcnNlX3NsYW50XzR4NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpmbGFncyk7CiAKIC8qKgpAQCAtMTg1LDcgKzE4Niw3IEBACiAgKiAgQHBhcmFtW2luXSAgICBwaXRjaCAgICAgICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQogICogIEBwYXJhbVtpbl0gICAgYmxrX3NpemUgICAgdHJhbnNmb3JtIGJsb2NrIHNpemUKICAqLwotdm9pZCBmZl9pdmlfZGNfc2xhbnRfMmQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGludCBibGtfc2l6ZSk7Cit2b2lkIGZmX2l2aV9kY19zbGFudF8yZChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsIGludCBibGtfc2l6ZSk7CiAKIC8qKgogICogIGludmVyc2UgMUQgcm93IHNsYW50IHRyYW5zZm9ybQpAQCAtMTk1LDcgKzE5Niw3IEBACiAgKiAgQHBhcmFtW2luXSAgICBwaXRjaCAgIHBpdGNoIHRvIG1vdmUgdG8gdGhlIG5leHQgeSBsaW5lCiAgKiAgQHBhcmFtW2luXSAgICBmbGFncyAgIHBvaW50ZXIgdG8gdGhlIGFycmF5IG9mIGNvbHVtbiBmbGFncyAodW51c2VkIGhlcmUpCiAgKi8KLXZvaWQgZmZfaXZpX3Jvd19zbGFudDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCit2b2lkIGZmX2l2aV9yb3dfc2xhbnQ4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpOwogCiAvKioKQEAgLTIwOCw3ICsyMDksNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAhPSAwIC0gbm9uX2VtcHR5IGNvbHVtbiwgMCAtIGVtcHR5IG9uZQogICogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcnJheSBtdXN0IGJlIGZpbGxlZCBieSBjYWxsZXIpCiAgKi8KLXZvaWQgZmZfaXZpX2NvbF9zbGFudDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCit2b2lkIGZmX2l2aV9jb2xfc2xhbnQ4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpOwogCiAvKioKQEAgLTIxOSw3ICsyMjAsNyBAQAogICogIEBwYXJhbVtpbl0gICAgcGl0Y2ggICBwaXRjaCB0byBtb3ZlIHRvIHRoZSBuZXh0IHkgbGluZQogICogIEBwYXJhbVtpbl0gICAgZmxhZ3MgICBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBjb2x1bW4gZmxhZ3MgKHVudXNlZCBoZXJlKQogICovCi12b2lkIGZmX2l2aV9yb3dfc2xhbnQ0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHVpbnQzMl90IHBpdGNoLAordm9pZCBmZl9pdmlfcm93X3NsYW50NChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmZsYWdzKTsKIAogLyoqCkBAIC0yMzIsMjkgKzIzMywyOSBAQAogICogICAgICAgICAgICAgICAgICAgICAgICAhPSAwIC0gbm9uX2VtcHR5IGNvbHVtbiwgMCAtIGVtcHR5IG9uZQogICogICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcnJheSBtdXN0IGJlIGZpbGxlZCBieSBjYWxsZXIpCiAgKi8KLXZvaWQgZmZfaXZpX2NvbF9zbGFudDQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsCit2b2lkIGZmX2l2aV9jb2xfc2xhbnQ0KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmxhZ3MpOwogCiAvKioKICAqICBEQy1vbmx5IGludmVyc2Ugcm93IHNsYW50IHRyYW5zZm9ybQogICovCi12b2lkIGZmX2l2aV9kY19yb3dfc2xhbnQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGludCBibGtfc2l6ZSk7Cit2b2lkIGZmX2l2aV9kY19yb3dfc2xhbnQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLCBpbnQgYmxrX3NpemUpOwogCiAvKioKICAqICBEQy1vbmx5IGludmVyc2UgY29sdW1uIHNsYW50IHRyYW5zZm9ybQogICovCi12b2lkIGZmX2l2aV9kY19jb2xfc2xhbnQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGludCBibGtfc2l6ZSk7Cit2b2lkIGZmX2l2aV9kY19jb2xfc2xhbnQoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLCBpbnQgYmxrX3NpemUpOwogCiAvKioKICAqICBDb3B5IHRoZSBwaXhlbHMgaW50byB0aGUgZnJhbWUgYnVmZmVyLgogICovCi12b2lkIGZmX2l2aV9wdXRfcGl4ZWxzXzh4OChjb25zdCBpbnQzMl90ICppbiwgaW50MTZfdCAqb3V0LCB1aW50MzJfdCBwaXRjaCwgY29uc3QgdWludDhfdCAqZmxhZ3MpOwordm9pZCBmZl9pdmlfcHV0X3BpeGVsc184eDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgcHRyZGlmZl90IHBpdGNoLCBjb25zdCB1aW50OF90ICpmbGFncyk7CiAKIC8qKgogICogIENvcHkgdGhlIERDIGNvZWZmaWNpZW50IGludG8gdGhlIGZpcnN0IHBpeGVsIG9mIHRoZSBibG9jayBhbmQKICAqICB6ZXJvIGFsbCBvdGhlcnMuCiAgKi8KLXZvaWQgZmZfaXZpX3B1dF9kY19waXhlbF84eDgoY29uc3QgaW50MzJfdCAqaW4sIGludDE2X3QgKm91dCwgdWludDMyX3QgcGl0Y2gsIGludCBibGtfc2l6ZSk7Cit2b2lkIGZmX2l2aV9wdXRfZGNfcGl4ZWxfOHg4KGNvbnN0IGludDMyX3QgKmluLCBpbnQxNl90ICpvdXQsIHB0cmRpZmZfdCBwaXRjaCwgaW50IGJsa19zaXplKTsKIAogLyoqCiAgKiAgOHg4IGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aCBhZGRpbmcgZGVsdGEKQEAgLTI2NCw3ICsyNjUsNyBAQAogICogIEBwYXJhbVtpbl0gICAgICAgcGl0Y2ggICAgcGl0Y2ggZm9yIG1vdmluZyB0byB0aGUgbmV4dCB5IGxpbmUKICAqICBAcGFyYW1baW5dICAgICAgIG1jX3R5cGUgIGludGVycG9sYXRpb24gdHlwZQogICovCi12b2lkIGZmX2l2aV9tY184eDhfZGVsdGEoaW50MTZfdCAqYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmLCB1aW50MzJfdCBwaXRjaCwgaW50IG1jX3R5cGUpOwordm9pZCBmZl9pdmlfbWNfOHg4X2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgcHRyZGlmZl90IHBpdGNoLCBpbnQgbWNfdHlwZSk7CiAKIC8qKgogICogIDR4NCBibG9jayBtb3Rpb24gY29tcGVuc2F0aW9uIHdpdGggYWRkaW5nIGRlbHRhCkBAIC0yNzQsNyArMjc1LDcgQEAKICAqICBAcGFyYW1baW5dICAgICAgIHBpdGNoICAgIHBpdGNoIGZvciBtb3ZpbmcgdG8gdGhlIG5leHQgeSBsaW5lCiAgKiAgQHBhcmFtW2luXSAgICAgICBtY190eXBlICBpbnRlcnBvbGF0aW9uIHR5cGUKICAqLwotdm9pZCBmZl9pdmlfbWNfNHg0X2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlKTsKK3ZvaWQgZmZfaXZpX21jXzR4NF9kZWx0YShpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIHB0cmRpZmZfdCBwaXRjaCwgaW50IG1jX3R5cGUpOwogCiAvKioKICAqICBtb3Rpb24gY29tcGVuc2F0aW9uIHdpdGhvdXQgYWRkaW5nIGRlbHRhCkBAIC0yODQsNyArMjg1LDcgQEAKICAqICBAcGFyYW1baW5dICAgICAgcGl0Y2ggICAgcGl0Y2ggZm9yIG1vdmluZyB0byB0aGUgbmV4dCB5IGxpbmUKICAqICBAcGFyYW1baW5dICAgICAgbWNfdHlwZSAgaW50ZXJwb2xhdGlvbiB0eXBlCiAgKi8KLXZvaWQgZmZfaXZpX21jXzh4OF9ub19kZWx0YShpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSk7Cit2b2lkIGZmX2l2aV9tY184eDhfbm9fZGVsdGEoaW50MTZfdCAqYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmLCBwdHJkaWZmX3QgcGl0Y2gsIGludCBtY190eXBlKTsKIAogLyoqCiAgKiAgNHg0IGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24gd2l0aG91dCBhZGRpbmcgZGVsdGEKQEAgLTI5NCw3ICsyOTUsNyBAQAogICogIEBwYXJhbVtpbl0gICAgICBwaXRjaCAgICBwaXRjaCBmb3IgbW92aW5nIHRvIHRoZSBuZXh0IHkgbGluZQogICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlICBpbnRlcnBvbGF0aW9uIHR5cGUKICAqLwotdm9pZCBmZl9pdmlfbWNfNHg0X25vX2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlKTsKK3ZvaWQgZmZfaXZpX21jXzR4NF9ub19kZWx0YShpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIHB0cmRpZmZfdCBwaXRjaCwgaW50IG1jX3R5cGUpOwogCiAvKioKICAqICA4eDggYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbiB3aXRoIGFkZGluZyBkZWx0YQpAQCAtMzA2LDcgKzMwNyw3IEBACiAgKiAgQHBhcmFtW2luXSAgICAgIG1jX3R5cGUgIGludGVycG9sYXRpb24gdHlwZSBmb3IgYmFja3dhcmQgcmVmZXJlbmNlCiAgKiAgQHBhcmFtW2luXSAgICAgIG1jX3R5cGUyIGludGVycG9sYXRpb24gdHlwZSBmb3IgZm9yd2FyZCByZWZlcmVuY2UKICAqLwotdm9pZCBmZl9pdmlfbWNfYXZnXzh4OF9kZWx0YShpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYyLCB1aW50MzJfdCBwaXRjaCwgaW50IG1jX3R5cGUsIGludCBtY190eXBlMik7Cit2b2lkIGZmX2l2aV9tY19hdmdfOHg4X2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZjIsIHB0cmRpZmZfdCBwaXRjaCwgaW50IG1jX3R5cGUsIGludCBtY190eXBlMik7CiAKIC8qKgogICogIDR4NCBibG9jayBtb3Rpb24gY29tcGVuc2F0aW9uIHdpdGggYWRkaW5nIGRlbHRhCkBAIC0zMTgsNyArMzE5LDcgQEAKICAqICBAcGFyYW1baW5dICAgICAgbWNfdHlwZSAgaW50ZXJwb2xhdGlvbiB0eXBlIGZvciBiYWNrd2FyZCByZWZlcmVuY2UKICAqICBAcGFyYW1baW5dICAgICAgbWNfdHlwZTIgaW50ZXJwb2xhdGlvbiB0eXBlIGZvciBmb3J3YXJkIHJlZmVyZW5jZQogICovCi12b2lkIGZmX2l2aV9tY19hdmdfNHg0X2RlbHRhKGludDE2X3QgKmJ1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZiwgY29uc3QgaW50MTZfdCAqcmVmX2J1ZjIsIHVpbnQzMl90IHBpdGNoLCBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyKTsKK3ZvaWQgZmZfaXZpX21jX2F2Z180eDRfZGVsdGEoaW50MTZfdCAqYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmMiwgcHRyZGlmZl90IHBpdGNoLCBpbnQgbWNfdHlwZSwgaW50IG1jX3R5cGUyKTsKIAogLyoqCiAgKiAgbW90aW9uIGNvbXBlbnNhdGlvbiB3aXRob3V0IGFkZGluZyBkZWx0YSBmb3IgQi1mcmFtZXMKQEAgLTMzMCw3ICszMzEsNyBAQAogICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlICBpbnRlcnBvbGF0aW9uIHR5cGUgZm9yIGJhY2t3YXJkIHJlZmVyZW5jZQogICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlMiBpbnRlcnBvbGF0aW9uIHR5cGUgZm9yIGZvcndhcmQgcmVmZXJlbmNlCiAgKi8KLXZvaWQgZmZfaXZpX21jX2F2Z184eDhfbm9fZGVsdGEoaW50MTZfdCAqYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmMiwgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlLCBpbnQgbWNfdHlwZTIpOwordm9pZCBmZl9pdmlfbWNfYXZnXzh4OF9ub19kZWx0YShpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYyLCBwdHJkaWZmX3QgcGl0Y2gsIGludCBtY190eXBlLCBpbnQgbWNfdHlwZTIpOwogCiAvKioKICAqICA0eDQgYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbiB3aXRob3V0IGFkZGluZyBkZWx0YSBmb3IgQi1mcmFtZXMKQEAgLTM0Miw2ICszNDMsNiBAQAogICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlICBpbnRlcnBvbGF0aW9uIHR5cGUgZm9yIGJhY2t3YXJkIHJlZmVyZW5jZQogICogIEBwYXJhbVtpbl0gICAgICBtY190eXBlMiBpbnRlcnBvbGF0aW9uIHR5cGUgZm9yIGZvcndhcmQgcmVmZXJlbmNlCiAgKi8KLXZvaWQgZmZfaXZpX21jX2F2Z180eDRfbm9fZGVsdGEoaW50MTZfdCAqYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmLCBjb25zdCBpbnQxNl90ICpyZWZfYnVmMiwgdWludDMyX3QgcGl0Y2gsIGludCBtY190eXBlLCBpbnQgbWNfdHlwZTIpOwordm9pZCBmZl9pdmlfbWNfYXZnXzR4NF9ub19kZWx0YShpbnQxNl90ICpidWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYsIGNvbnN0IGludDE2X3QgKnJlZl9idWYyLCBwdHJkaWZmX3QgcGl0Y2gsIGludCBtY190eXBlLCBpbnQgbWNfdHlwZTIpOwogCiAjZW5kaWYgLyogQVZDT0RFQ19JVklfRFNQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvajJrZW5jLmMgYi9saWJhdmNvZGVjL2oya2VuYy5jCmluZGV4IDJjZDgzN2QuLjNlNTQyYWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvajJrZW5jLmMKKysrIGIvbGliYXZjb2RlYy9qMmtlbmMuYwpAQCAtMTcsOCArMTcsNDYgQEAKICAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGluY29ycG9yYXRlcyB3b3JrIGNvdmVyZWQgYnkgdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQgYW5kCisgKiBwZXJtaXNzaW9uIG5vdGljZToKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNywgQ29tbXVuaWNhdGlvbnMgYW5kIFJlbW90ZSBTZW5zaW5nIExhYm9yYXRvcnksIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNywgUHJvZmVzc29yIEJlbm9pdCBNYWNxCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggYW5kIEFudG9uaW4gRGVzY2FtcGUKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQorICogQ29weXJpZ2h0IChjKSAyMDA3LCBDYWxsdW0gTGVyd2ljayA8c2VnQGhheHhlZC5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKKwogLyoqCiAgKiBKUEVHMjAwMCBpbWFnZSBlbmNvZGVyCiAgKiBAZmlsZQpAQCAtMzEsNiArNjksNyBAQAogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJqcGVnMjAwMC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKIAogI2RlZmluZSBOTVNFREVDX0JJVFMgNwpAQCAtNjI0LDcgKzY2Myw4IEBACiAgICAgICAgIGJwbm8gPSBjYmxrLT5ub256ZXJvYml0cyAtIDE7CiAgICAgfQogCi0gICAgZmZfbXFjX2luaXRlbmMoJnQxLT5tcWMsIGNibGstPmRhdGEpOworICAgIGNibGstPmRhdGFbMF0gPSAwOworICAgIGZmX21xY19pbml0ZW5jKCZ0MS0+bXFjLCBjYmxrLT5kYXRhICsgMSk7CiAKICAgICBmb3IgKHBhc3NubyA9IDA7IGJwbm8gPj0gMDsgcGFzc25vKyspewogICAgICAgICBubXNlZGVjPTA7CkBAIC02NTAsNyArNjkwLDggQEAKICAgICBjYmxrLT5ucGFzc2VzID0gcGFzc25vOwogICAgIGNibGstPm5pbmNscGFzc2VzID0gcGFzc25vOwogCi0gICAgY2Jsay0+cGFzc2VzW3Bhc3Nuby0xXS5yYXRlID0gZmZfbXFjX2ZsdXNoX3RvKCZ0MS0+bXFjLCBjYmxrLT5wYXNzZXNbcGFzc25vLTFdLmZsdXNoZWQsICZjYmxrLT5wYXNzZXNbcGFzc25vLTFdLmZsdXNoZWRfbGVuKTsKKyAgICBpZiAocGFzc25vKQorICAgICAgICBjYmxrLT5wYXNzZXNbcGFzc25vLTFdLnJhdGUgPSBmZl9tcWNfZmx1c2hfdG8oJnQxLT5tcWMsIGNibGstPnBhc3Nlc1twYXNzbm8tMV0uZmx1c2hlZCwgJmNibGstPnBhc3Nlc1twYXNzbm8tMV0uZmx1c2hlZF9sZW4pOwogfQogCiAvKiB0aWVyLTIgcm91dGluZXM6ICovCkBAIC03NTcsNyArNzk4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoY2Jsay0+bmluY2xwYXNzZXMpewogICAgICAgICAgICAgICAgICAgICBpZiAocy0+YnVmX2VuZCAtIHMtPmJ1ZiA8IGNibGstPnBhc3Nlc1tjYmxrLT5uaW5jbHBhc3Nlcy0xXS5yYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnMtPmJ1ZiwgY2Jsay0+ZGF0YSwgICBjYmxrLT5wYXNzZXNbY2Jsay0+bmluY2xwYXNzZXMtMV0ucmF0ZQorICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnMtPmJ1ZiwgY2Jsay0+ZGF0YSArIDEsICAgY2Jsay0+cGFzc2VzW2NibGstPm5pbmNscGFzc2VzLTFdLnJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY2Jsay0+cGFzc2VzW2NibGstPm5pbmNscGFzc2VzLTFdLmZsdXNoZWRfbGVuKTsKICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZzLT5idWYsIGNibGstPnBhc3Nlc1tjYmxrLT5uaW5jbHBhc3Nlcy0xXS5mbHVzaGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+cGFzc2VzW2NibGstPm5pbmNscGFzc2VzLTFdLmZsdXNoZWRfbGVuKTsKQEAgLTg5OCw2ICs5MzksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJlYy0+Y2Jsa1tjYmxrbm9dLmRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlYy0+Y2Jsa1tjYmxrbm9dLmRhdGEgPSBhdl9tYWxsb2MoMSArIDgxOTIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVjLT5jYmxrW2NibGtub10ucGFzc2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWMtPmNibGtbY2Jsa25vXS5wYXNzZXMgPSBhdl9tYWxsb2NfYXJyYXkoSlBFRzIwMDBfTUFYX1BBU1NFUywgc2l6ZW9mICgqcHJlYy0+Y2Jsa1tjYmxrbm9dLnBhc3NlcykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwcmVjLT5jYmxrW2NibGtub10uZGF0YSB8fCAhcHJlYy0+Y2Jsa1tjYmxrbm9dLnBhc3NlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2NibGsocywgJnQxLCBwcmVjLT5jYmxrICsgY2Jsa25vLCB0aWxlLCB4eDEgLSB4eDAsIHl5MSAtIHl5MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRwb3MsIGNvZHN0eS0+bnJlc2xldmVscyAtIHJlc2xldmVsbm8gLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHh4MCA9IHh4MTsKQEAgLTExMTIsOCArMTE1OSwxMCBAQAogICAgIH0gZWxzZXsgLy8gcGxhbmFyIFlVVgogICAgICAgICBzLT5wbGFuYXIgPSAxOwogICAgICAgICBzLT5uY29tcG9uZW50cyA9IDM7Ci0gICAgICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LAotICAgICAgICAgICAgICAgIHMtPmNocm9tYV9zaGlmdCwgcy0+Y2hyb21hX3NoaWZ0ICsgMSk7CisgICAgICAgIHJldCA9IGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jaHJvbWFfc2hpZnQsIHMtPmNocm9tYV9zaGlmdCArIDEpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBmZl9qcGVnMjAwMF9pbml0X3RpZXIxX2x1dHMoKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvamFjb3N1YmRlYy5jIGIvbGliYXZjb2RlYy9qYWNvc3ViZGVjLmMKaW5kZXggMGM5N2ViOC4uY2RiMzcyYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9qYWNvc3ViZGVjLmMKKysrIGIvbGliYXZjb2RlYy9qYWNvc3ViZGVjLmMKQEAgLTE2Nyw2ICsxNjcsNyBAQAogICAgIGludCByZXQ7CiAgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKICAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBGRkFTU0RlY29kZXJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKIAogICAgIGlmIChhdnBrdC0+c2l6ZSA8PSAwKQogICAgICAgICBnb3RvIGVuZDsKQEAgLTE4MSw3ICsxODIsNyBAQAogCiAgICAgICAgIGF2X2JwcmludF9pbml0KCZidWZmZXIsIEpTU19NQVhfTElORVNJWkUsIEpTU19NQVhfTElORVNJWkUpOwogICAgICAgICBqYWNvc3ViX3RvX2FzcyhhdmN0eCwgJmJ1ZmZlciwgcHRyKTsKLSAgICAgICAgcmV0ID0gZmZfYXNzX2FkZF9yZWN0X2JwcmludChzdWIsICZidWZmZXIsIGF2cGt0LT5wdHMsIGF2cGt0LT5kdXJhdGlvbik7CisgICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdChzdWIsIGJ1ZmZlci5zdHIsIHMtPnJlYWRvcmRlcisrLCAwLCBOVUxMLCBOVUxMKTsKICAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWZmZXIsIE5VTEwpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC0xOTksNCArMjAwLDYgQEAKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9KQUNPU1VCLAogICAgIC5pbml0ICAgICAgICAgICA9IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdCwKICAgICAuZGVjb2RlICAgICAgICAgPSBqYWNvc3ViX2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmZl9hc3NfZGVjb2Rlcl9mbHVzaCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZBU1NEZWNvZGVyQ29udGV4dCksCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9qZmRjdGludF90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9qZmRjdGludF90ZW1wbGF0ZS5jCmluZGV4IDNlYTJmNWQuLjY3ZmI3N2IgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvamZkY3RpbnRfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL2pmZGN0aW50X3RlbXBsYXRlLmMKQEAgLTY5LDEyICs2OSw3IEBACiAjZGVmaW5lIEdMT0JBTCh4KSB4CiAjZGVmaW5lIFJJR0hUX1NISUZUKHgsIG4pICgoeCkgPj4gKG4pKQogI2RlZmluZSBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkgKCh2YXIpKihjb25zdCkpCi0KLSNpZiAxIC8vZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORwogI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKCh4KSArICgxIDw8ICgobikgLSAxKSksIG4pCi0jZWxzZQotI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKHgsIG4pCi0jZW5kaWYKIAogCiAvKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9qbmkuYyBiL2xpYmF2Y29kZWMvam5pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkY2YyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvam5pLmMKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIEpOSSBwdWJsaWMgQVBJIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uIHN0dXBlZmxpeC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Vycm9yLmgiCisjaW5jbHVkZSAiam5pLmgiCisKKyNpZiBDT05GSUdfSk5JCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImZmam5pLmgiCisKK3ZvaWQgKmphdmFfdm07CitwdGhyZWFkX211dGV4X3QgbG9jayA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CisKK2ludCBhdl9qbmlfc2V0X2phdmFfdm0odm9pZCAqdm0sIHZvaWQgKmxvZ19jdHgpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJmxvY2spOworICAgIGlmIChqYXZhX3ZtID09IE5VTEwpIHsKKyAgICAgICAgamF2YV92bSA9IHZtOworICAgIH0gZWxzZSBpZiAoamF2YV92bSAhPSB2bSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJBIEphdmEgdmlydHVhbCBtYWNoaW5lIGhhcyBhbHJlYWR5IGJlZW4gc2V0Iik7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZsb2NrKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgKmF2X2puaV9nZXRfamF2YV92bSh2b2lkICpsb2dfY3R4KQoreworICAgIHZvaWQgKnZtOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZsb2NrKTsKKyAgICB2bSA9IGphdmFfdm07CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmxvY2spOworCisgICAgcmV0dXJuIHZtOworfQorCisjZWxzZQorCitpbnQgYXZfam5pX3NldF9qYXZhX3ZtKHZvaWQgKnZtLCB2b2lkICpsb2dfY3R4KQoreworICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Cit9CisKK3ZvaWQgKmF2X2puaV9nZXRfamF2YV92bSh2b2lkICpsb2dfY3R4KQoreworICAgIHJldHVybiBOVUxMOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvam5pLmggYi9saWJhdmNvZGVjL2puaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkOTllOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2puaS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBKTkkgcHVibGljIEFQSSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbiBzdHVwZWZsaXguY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfSk5JX0gKKyNkZWZpbmUgQVZDT0RFQ19KTklfSAorCisvKgorICogTWFudWFsbHkgc2V0IGEgSmF2YSB2aXJ0dWFsIG1hY2hpbmUgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlIHRoZSBKTkkKKyAqIGVudmlyb25tZW50LiBPbmNlIGEgSmF2YSBWTSBpcyBzZXQgaXQgY2Fubm90IGJlIGNoYW5nZWQgYWZ0ZXJ3YXJkcywgbWVhbmluZworICogeW91IGNhbiBjYWxsIG11bHRpcGxlIHRpbWVzIGF2X2puaV9zZXRfamF2YV92bSB3aXRoIHRoZSBzYW1lIEphdmEgVk0gcG9pbnRlcgorICogaG93ZXZlciBpdCB3aWxsIGVycm9yIG91dCBpZiB5b3UgdHJ5IHRvIHNldCBhIGRpZmZlcmVudCBKYXZhIFZNLgorICoKKyAqIEBwYXJhbSB2bSBKYXZhIHZpcnR1YWwgbWFjaGluZQorICogQHBhcmFtIGxvZ19jdHggY29udGV4dCB1c2VkIGZvciBsb2dnaW5nLCBjYW4gYmUgTlVMTAorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwgMCBvdGhlcndpc2UKKyAqLworaW50IGF2X2puaV9zZXRfamF2YV92bSh2b2lkICp2bSwgdm9pZCAqbG9nX2N0eCk7CisKKy8qCisgKiBHZXQgdGhlIEphdmEgdmlydHVhbCBtYWNoaW5lIHdoaWNoIGhhcyBiZWVuIHNldCB3aXRoIGF2X2puaV9zZXRfamF2YV92bS4KKyAqCisgKiBAcGFyYW0gdm0gSmF2YSB2aXJ0dWFsIG1hY2hpbmUKKyAqIEByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBKYXZhIHZpcnR1YWwgbWFjaGluZQorICovCit2b2lkICphdl9qbmlfZ2V0X2phdmFfdm0odm9pZCAqbG9nX2N0eCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX0pOSV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2pwZWcyMDAwLmMgYi9saWJhdmNvZGVjL2pwZWcyMDAwLmMKaW5kZXggYjViMmRiZi4uOGU5MDk4MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9qcGVnMjAwMC5jCisrKyBiL2xpYmF2Y29kZWMvanBlZzIwMDAuYwpAQCAtMjQ5LDcgKzI0OSw3IEBACiAKICAgICBiYW5kLT5pX3N0ZXBzaXplID0gYmFuZC0+Zl9zdGVwc2l6ZSAqICgxIDw8IDE1KTsKIAotICAgIC8qIEZJWE1FOiBJbiBvcGVuamVwZyBjb2RlIHN0ZXNwaXplID0gc3RlcHNpemUgKiAwLjUuIFdoeT8KKyAgICAvKiBGSVhNRTogSW4gT3BlbkpQRUcgY29kZSBzdGVwc2l6ZSA9IHN0ZXBzaXplICogMC41LiBXaHk/CiAgICAgICogSWYgbm90IHNldCBvdXRwdXQgb2YgZW50cm9waWMgZGVjb2RlciBpcyBub3QgY29ycmVjdC4gKi8KICAgICBpZiAoIWF2X2NvZGVjX2lzX2VuY29kZXIoYXZjdHgtPmNvZGVjKSkKICAgICAgICAgYmFuZC0+Zl9zdGVwc2l6ZSAqPSAwLjU7CkBAIC0zNTcsMTAgKzM1Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLT5yZXNsZXZlbFtyZXNsZXZlbG5vLTFdLmNvb3JkWzFdWzBdOwogICAgICAgICB9CiAKLSAgICAgICAgY2Jsay0+emVybyAgICAgID0gMDsKICAgICAgICAgY2Jsay0+bGJsb2NrICAgID0gMzsKICAgICAgICAgY2Jsay0+bGVuZ3RoICAgID0gMDsKLSAgICAgICAgbWVtc2V0KGNibGstPmxlbmd0aGluYywgMCwgc2l6ZW9mKGNibGstPmxlbmd0aGluYykpOwogICAgICAgICBjYmxrLT5ucGFzc2VzICAgPSAwOwogICAgIH0KIApAQCAtNTA2LDYgKzUwNCw5IEBACiAgICAgICAgIC8vIHVwZGF0ZSBwcmVjaW5jdHMgc2l6ZTogMl5uIHZhbHVlCiAgICAgICAgIHJlc2xldmVsLT5sb2cyX3ByZWNfd2lkdGggID0gY29kc3R5LT5sb2cyX3ByZWNfd2lkdGhzW3Jlc2xldmVsbm9dOwogICAgICAgICByZXNsZXZlbC0+bG9nMl9wcmVjX2hlaWdodCA9IGNvZHN0eS0+bG9nMl9wcmVjX2hlaWdodHNbcmVzbGV2ZWxub107CisgICAgICAgIGlmICghcmVzbGV2ZWwtPmxvZzJfcHJlY193aWR0aCB8fCAhcmVzbGV2ZWwtPmxvZzJfcHJlY19oZWlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAKICAgICAgICAgLyogTnVtYmVyIG9mIGJhbmRzIGZvciBlYWNoIHJlc29sdXRpb24gbGV2ZWwgKi8KICAgICAgICAgaWYgKHJlc2xldmVsbm8gPT0gMCkKQEAgLTU0MCw2ICs1NDEsOSBAQAogICAgICAgICBpZiAoIXJlc2xldmVsLT5iYW5kKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAorICAgICAgICBpZiAocmVzbGV2ZWwtPm51bV9wcmVjaW5jdHNfeCAqICh1aW50NjRfdClyZXNsZXZlbC0+bnVtX3ByZWNpbmN0c195ICogcmVzbGV2ZWwtPm5iYW5kcyA+IGF2Y3R4LT5tYXhfcGl4ZWxzIC8gc2l6ZW9mKCpyZXNsZXZlbC0+YmFuZC0+cHJlYykpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCiAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzbGV2ZWwtPm5iYW5kczsgYmFuZG5vKyssIGdiYW5kbm8rKykgewogICAgICAgICAgICAgcmV0ID0gaW5pdF9iYW5kKGF2Y3R4LCByZXNsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLCBjb2RzdHksIHFudHN0eSwKQEAgLTU5NSw5ICs1OTksMjEgQEAKICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzbGV2ZWwtPm51bV9wcmVjaW5jdHNfeCAqIHJlc2xldmVsLT5udW1fcHJlY2luY3RzX3k7IHByZWNubysrKSB7CiAgICAgICAgICAgICAgICAgaWYgKGJhbmQtPnByZWMpIHsKICAgICAgICAgICAgICAgICAgICAgSnBlZzIwMDBQcmVjICpwcmVjID0gYmFuZC0+cHJlYyArIHByZWNubzsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5iX2NvZGVfYmxvY2tzID0gcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQgKiBwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoOworCiAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwcmVjLT56ZXJvYml0cyk7CiAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwcmVjLT5jYmxraW5jbCk7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwcmVjLT5jYmxrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWMtPmNibGspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYmxrbm87CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IG5iX2NvZGVfYmxvY2tzOyBjYmxrbm8gKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGVnMjAwMENibGsgKmNibGsgPSAmcHJlYy0+Y2Jsa1tjYmxrbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZjYmxrLT5kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmY2Jsay0+cGFzc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmY2Jsay0+bGVuZ3RoaW5jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmY2Jsay0+ZGF0YV9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcHJlYy0+Y2Jsayk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvanBlZzIwMDAuaCBiL2xpYmF2Y29kZWMvanBlZzIwMDAuaAppbmRleCBlZDNiNDIxLi5jNDI5Y2E1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2pwZWcyMDAwLmgKKysrIGIvbGliYXZjb2RlYy9qcGVnMjAwMC5oCkBAIC0xNjUsMTUgKzE2NSwxNSBAQAogICAgIHVpbnQ4X3QgbmluY2xwYXNzZXM7IC8vIG51bWJlciBjb2Rpbmcgb2YgcGFzc2VzIGluY2x1ZGVkIGluIGNvZGVzdHJlYW0KICAgICB1aW50OF90IG5vbnplcm9iaXRzOwogICAgIHVpbnQxNl90IGxlbmd0aDsKLSAgICB1aW50MTZfdCBsZW5ndGhpbmNbSlBFRzIwMDBfTUFYX1BBU1NFU107CisgICAgdWludDE2X3QgKmxlbmd0aGluYzsKICAgICB1aW50OF90IG5iX2xlbmd0aGluYzsKICAgICB1aW50OF90IGxibG9jazsKLSAgICB1aW50OF90IHplcm87Ci0gICAgdWludDhfdCBkYXRhWzgxOTJdOworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgc2l6ZV90IGRhdGFfYWxsb2NhdGVkOwogICAgIGludCBuYl90ZXJtaW5hdGlvbnM7CiAgICAgaW50IG5iX3Rlcm1pbmF0aW9uc2luYzsKLSAgICBpbnQgZGF0YV9zdGFydFtKUEVHMjAwMF9NQVhfUEFTU0VTXTsKLSAgICBKcGVnMjAwMFBhc3MgcGFzc2VzW0pQRUcyMDAwX01BWF9QQVNTRVNdOworICAgIGludCAqZGF0YV9zdGFydDsKKyAgICBKcGVnMjAwMFBhc3MgKnBhc3NlczsKICAgICBpbnQgY29vcmRbMl1bMl07IC8vIGJvcmRlciBjb29yZGluYXRlcyB7e3gwLCB4MX0sIHt5MCwgeTF9fQogfSBKcGVnMjAwMENibGs7IC8vIGNvZGUgYmxvY2sKIApAQCAtMjE1LDEyICsyMTUsMTIgQEAKIC8qIG1pc2MgdG9vbHMgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGZmX2pwZWcyMDAwX2NlaWxkaXZwb3cyKGludCBhLCBpbnQgYikKIHsKLSAgICByZXR1cm4gLSgoKGludDY0X3QpKC1hKSkgPj4gYik7CisgICAgcmV0dXJuIC0oKC0oaW50NjRfdClhKSA+PiBiKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgZmZfanBlZzIwMDBfY2VpbGRpdihpbnQgYSwgaW50IGIpCiB7Ci0gICAgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKKyAgICByZXR1cm4gKGEgKyAoaW50NjRfdCliIC0gMSkgLyBiOwogfQogCiAvKiBUSUVSLTEgcm91dGluZXMgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvanBlZzIwMDBkZWMuYyBiL2xpYmF2Y29kZWMvanBlZzIwMDBkZWMuYwppbmRleCBjMTM2NzBlLi5mYzE0ZmIzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2pwZWcyMDAwZGVjLmMKKysrIGIvbGliYXZjb2RlYy9qcGVnMjAwMGRlYy5jCkBAIC0yNiw2ICsyNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKQEAgLTMzLDYgKzM0LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMTA2LDYgKzEwOCw3IEBACiAgICAgaW50ICAgICAgICAgICAgIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0OwogICAgIHVuc2lnbmVkICAgICAgICBudW1YdGlsZXMsIG51bVl0aWxlczsKICAgICBpbnQgICAgICAgICAgICAgbWF4dGlsZWxlbjsKKyAgICBBVlJhdGlvbmFsICAgICAgc2FyOwogCiAgICAgSnBlZzIwMDBDb2RpbmdTdHlsZSBjb2RzdHlbNF07CiAgICAgSnBlZzIwMDBRdWFudFN0eWxlICBxbnRzdHlbNF07CkBAIC0yNjAsNiArMjYzLDcgQEAKICAgICB1aW50MzJfdCBsb2cyX2Nocm9tYV93aCA9IDA7CiAgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwb3NzaWJsZV9mbXRzID0gTlVMTDsKICAgICBpbnQgcG9zc2libGVfZm10c19uYiA9IDA7CisgICAgaW50IHJldDsKIAogICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCAzNikgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluc3VmZmljaWVudCBzcGFjZSBmb3IgU0laXG4iKTsKQEAgLTI4MSw3ICsyODUsNyBAQAogICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJTdXBwb3J0IGZvciBpbWFnZSBvZmZzZXRzIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9Ci0gICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUocy0+d2lkdGgsIHMtPmhlaWdodCwgMCwgcy0+YXZjdHgpKSB7CisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUyKHMtPndpZHRoLCBzLT5oZWlnaHQsIHMtPmF2Y3R4LT5tYXhfcGl4ZWxzLCBBVl9QSVhfRk1UX05PTkUsIDAsIHMtPmF2Y3R4KSkgewogICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJMYXJnZSBEaW1lbnNpb25zIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CkBAIC0yOTgsNiArMzAyLDE2IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKKyAgICBpZiAocy0+dGlsZV9vZmZzZXRfeCA8IDAgfHwgcy0+dGlsZV9vZmZzZXRfeSA8IDAgfHwKKyAgICAgICAgcy0+aW1hZ2Vfb2Zmc2V0X3ggPCBzLT50aWxlX29mZnNldF94IHx8CisgICAgICAgIHMtPmltYWdlX29mZnNldF95IDwgcy0+dGlsZV9vZmZzZXRfeSB8fAorICAgICAgICBzLT50aWxlX3dpZHRoICArIChpbnQ2NF90KXMtPnRpbGVfb2Zmc2V0X3ggPD0gcy0+aW1hZ2Vfb2Zmc2V0X3ggfHwKKyAgICAgICAgcy0+dGlsZV9oZWlnaHQgKyAoaW50NjRfdClzLT50aWxlX29mZnNldF95IDw9IHMtPmltYWdlX29mZnNldF95CisgICAgKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGlsZSBvZmZzZXRzIGFyZSBpbnZhbGlkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCiAgICAgcy0+bmNvbXBvbmVudHMgPSBuY29tcG9uZW50czsKIAogICAgIGlmIChzLT50aWxlX3dpZHRoIDw9IDAgfHwgcy0+dGlsZV9oZWlnaHQgPD0gMCkgewpAQCAtMzI5LDcgKzM0MywxMCBAQAogICAgIHMtPm51bVh0aWxlcyA9IGZmX2pwZWcyMDAwX2NlaWxkaXYocy0+d2lkdGggIC0gcy0+dGlsZV9vZmZzZXRfeCwgcy0+dGlsZV93aWR0aCk7CiAgICAgcy0+bnVtWXRpbGVzID0gZmZfanBlZzIwMDBfY2VpbGRpdihzLT5oZWlnaHQgLSBzLT50aWxlX29mZnNldF95LCBzLT50aWxlX2hlaWdodCk7CiAKLSAgICBpZiAocy0+bnVtWHRpbGVzICogKHVpbnQ2NF90KXMtPm51bVl0aWxlcyA+IElOVF9NQVgvc2l6ZW9mKCpzLT50aWxlKSkgeworICAgIC8vIFRoZXJlIG11c3QgYmUgYXQgbGVhc3QgYSBTT1QgYW5kIFNPRCBwZXIgdGlsZSwgdGhlaXIgbWluaW11bSBzaXplIGlzIDE0CisgICAgaWYgKHMtPm51bVh0aWxlcyAqICh1aW50NjRfdClzLT5udW1ZdGlsZXMgPiBJTlRfTUFYL3NpemVvZigqcy0+dGlsZSkgfHwKKyAgICAgICAgcy0+bnVtWHRpbGVzICogcy0+bnVtWXRpbGVzICogMTRMTCA+IGJ5dGVzdHJlYW0yX3NpemUoJnMtPmcpCisgICAgKSB7CiAgICAgICAgIHMtPm51bVh0aWxlcyA9IHMtPm51bVl0aWxlcyA9IDA7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQpAQCAtMzQ5LDEwICszNjYsMTMgQEAKICAgICB9CiAKICAgICAvKiBjb21wdXRlIGltYWdlIHNpemUgd2l0aCByZWR1Y3Rpb24gZmFjdG9yICovCi0gICAgcy0+YXZjdHgtPndpZHRoICA9IGZmX2pwZWcyMDAwX2NlaWxkaXZwb3cyKHMtPndpZHRoICAtIHMtPmltYWdlX29mZnNldF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZWR1Y3Rpb25fZmFjdG9yKTsKLSAgICBzLT5hdmN0eC0+aGVpZ2h0ID0gZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIocy0+aGVpZ2h0IC0gcy0+aW1hZ2Vfb2Zmc2V0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZHVjdGlvbl9mYWN0b3IpOworICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKHMtPmF2Y3R4LAorICAgICAgICAgICAgZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIocy0+d2lkdGggIC0gcy0+aW1hZ2Vfb2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZHVjdGlvbl9mYWN0b3IpLAorICAgICAgICAgICAgZmZfanBlZzIwMDBfY2VpbGRpdnBvdzIocy0+aGVpZ2h0IC0gcy0+aW1hZ2Vfb2Zmc2V0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlZHVjdGlvbl9mYWN0b3IpKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmIChzLT5hdmN0eC0+cHJvZmlsZSA9PSBGRl9QUk9GSUxFX0pQRUcyMDAwX0RDSU5FTUFfMksgfHwKICAgICAgICAgcy0+YXZjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9KUEVHMjAwMF9EQ0lORU1BXzRLKSB7CkBAIC03MzcsOSArNzU3LDkgQEAKICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpOyAgICAgICAgICAgICAgIC8vIFROc290CiAKICAgICBpZiAoIVBzb3QpCi0gICAgICAgIFBzb3QgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgKyBuICsgMjsKKyAgICAgICAgUHNvdCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSAtIDIgKyBuICsgMjsKIAotICAgIGlmIChQc290ID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpICsgbiArIDIpIHsKKyAgICBpZiAoUHNvdCA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSAtIDIgKyBuICsgMikgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlBzb3QgJSJQUkl1MzIiIHRvbyBiaWdcbiIsIFBzb3QpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC05MzMsNiArOTUzLDcgQEAKICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBuYl9jb2RlX2Jsb2NrczsgY2Jsa25vKyspIHsKICAgICAgICAgICAgIEpwZWcyMDAwQ2JsayAqY2JsayA9IHByZWMtPmNibGsgKyBjYmxrbm87CiAgICAgICAgICAgICBpbnQgaW5jbCwgbmV3cGFzc2VzLCBsbGVuOworICAgICAgICAgICAgdm9pZCAqdG1wOwogCiAgICAgICAgICAgICBpZiAoY2Jsay0+bnBhc3NlcykKICAgICAgICAgICAgICAgICBpbmNsID0gZ2V0X2JpdHMocywgMSk7CkBAIC05NDYsOSArOTY3LDkgQEAKICAgICAgICAgICAgIGlmICghY2Jsay0+bnBhc3NlcykgewogICAgICAgICAgICAgICAgIGludCB2ID0gZXhwbltiYW5kbm9dICsgbnVtZ2JpdHMgLSAxIC0KICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ190cmVlX2RlY29kZShzLCBwcmVjLT56ZXJvYml0cyArIGNibGtubywgMTAwKTsKLSAgICAgICAgICAgICAgICBpZiAodiA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAodiA8IDAgfHwgdiA+IDMwKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbnplcm9iaXRzICVkIGludmFsaWRcbiIsIHYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vbnplcm9iaXRzICVkIGludmFsaWQgb3IgdW5zdXBwb3J0ZWRcbiIsIHYpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2Jsay0+bm9uemVyb2JpdHMgPSB2OwpAQCAtOTcyLDYgKzk5MywxNCBAQAogCiAgICAgICAgICAgICBjYmxrLT5uYl9sZW5ndGhpbmMgPSAwOwogICAgICAgICAgICAgY2Jsay0+bmJfdGVybWluYXRpb25zaW5jID0gMDsKKyAgICAgICAgICAgIGF2X2ZyZWUoY2Jsay0+bGVuZ3RoaW5jKTsKKyAgICAgICAgICAgIGNibGstPmxlbmd0aGluYyAgPSBhdl9tYWxsb2N6X2FycmF5KG5ld3Bhc3NlcyAgICAsIHNpemVvZigqY2Jsay0+bGVuZ3RoaW5jKSk7CisgICAgICAgICAgICBpZiAoIWNibGstPmxlbmd0aGluYykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgdG1wID0gYXZfcmVhbGxvY19hcnJheShjYmxrLT5kYXRhX3N0YXJ0LCBjYmxrLT5uYl90ZXJtaW5hdGlvbnMgKyBuZXdwYXNzZXMgKyAxLCBzaXplb2YoKmNibGstPmRhdGFfc3RhcnQpKTsKKyAgICAgICAgICAgIGlmICghdG1wKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBjYmxrLT5kYXRhX3N0YXJ0ID0gdG1wOwogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGludCBuZXdwYXNzZXMxID0gMDsKIApAQCAtOTg1LDEwICsxMDE0LDE4IEBACiAKICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGdldF9iaXRzKHMsIGF2X2xvZzIobmV3cGFzc2VzMSkgKyBjYmxrLT5sYmxvY2spKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA+IHNpemVvZihjYmxrLT5kYXRhKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXQgPiBjYmxrLT5kYXRhX2FsbG9jYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmV3X3NpemUgPSBGRk1BWCgyKmNibGstPmRhdGFfYWxsb2NhdGVkLCByZXQpOworICAgICAgICAgICAgICAgICAgICB2b2lkICpuZXcgPSBhdl9yZWFsbG9jKGNibGstPmRhdGEsIG5ld19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+ZGF0YSA9IG5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmRhdGFfYWxsb2NhdGVkID0gbmV3X3NpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJldCA+IGNibGstPmRhdGFfYWxsb2NhdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmxvY2sgd2l0aCBsZW5ndGhpbmMgZ3JlYXRlciB0aGFuICUiU0laRV9TUEVDSUZJRVIiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY2Jsay0+ZGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmRhdGFfYWxsb2NhdGVkKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjYmxrLT5sZW5ndGhpbmNbY2Jsay0+bmJfbGVuZ3RoaW5jKytdID0gcmV0OwpAQCAtMTAxMyw5ICsxMDUwLDE5IEBACiAgICAgICAgIG5iX2NvZGVfYmxvY2tzID0gcHJlYy0+bmJfY29kZWJsb2Nrc19oZWlnaHQgKiBwcmVjLT5uYl9jb2RlYmxvY2tzX3dpZHRoOwogICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IG5iX2NvZGVfYmxvY2tzOyBjYmxrbm8rKykgewogICAgICAgICAgICAgSnBlZzIwMDBDYmxrICpjYmxrID0gcHJlYy0+Y2JsayArIGNibGtubzsKKyAgICAgICAgICAgIGlmICghY2Jsay0+bmJfdGVybWluYXRpb25zaW5jICYmICFjYmxrLT5sZW5ndGhpbmMpCisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBmb3IgKGN3c25vID0gMDsgY3dzbm8gPCBjYmxrLT5uYl9sZW5ndGhpbmM7IGN3c25vICsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGNibGstPmRhdGFfYWxsb2NhdGVkIDwgY2Jsay0+bGVuZ3RoICsgY2Jsay0+bGVuZ3RoaW5jW2N3c25vXSArIDQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld19zaXplID0gRkZNQVgoMipjYmxrLT5kYXRhX2FsbG9jYXRlZCwgY2Jsay0+bGVuZ3RoICsgY2Jsay0+bGVuZ3RoaW5jW2N3c25vXSArIDQpOworICAgICAgICAgICAgICAgICAgICB2b2lkICpuZXcgPSBhdl9yZWFsbG9jKGNibGstPmRhdGEsIG5ld19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+ZGF0YSA9IG5ldzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmRhdGFfYWxsb2NhdGVkID0gbmV3X3NpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA8IGNibGstPmxlbmd0aGluY1tjd3Nub10KLSAgICAgICAgICAgICAgICAgICAgfHwgc2l6ZW9mKGNibGstPmRhdGEpIDwgY2Jsay0+bGVuZ3RoICsgY2Jsay0+bGVuZ3RoaW5jW2N3c25vXSArIDQKKyAgICAgICAgICAgICAgICAgICAgfHwgY2Jsay0+ZGF0YV9hbGxvY2F0ZWQgPCBjYmxrLT5sZW5ndGggKyBjYmxrLT5sZW5ndGhpbmNbY3dzbm9dICsgNAogICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICJCbG9jayBsZW5ndGggJSJQUkl1MTYiIG9yIGxlbmd0aGluYyAlZCBpcyB0b28gbGFyZ2UsIGxlZnQgJWRcbiIsCkBAIC0xMDM0LDYgKzEwODEsNyBAQAogICAgICAgICAgICAgICAgICAgICBjYmxrLT5kYXRhX3N0YXJ0W2NibGstPm5iX3Rlcm1pbmF0aW9uc10gPSBjYmxrLT5sZW5ndGg7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfZnJlZXAoJmNibGstPmxlbmd0aGluYyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0xMTExLDYgKzExNTksOSBAQAogICAgICAgICAgICAgc3RlcF94ID0gMzI7CiAgICAgICAgICAgICBzdGVwX3kgPSAzMjsKIAorICAgICAgICAgICAgaWYgKFJTcG9jID49IEZGTUlOKGNvZHN0eS0+bnJlc2xldmVscywgUkVwb2MpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICBmb3IgKHJlc2xldmVsbm8gPSBSU3BvYzsgcmVzbGV2ZWxubyA8IEZGTUlOKGNvZHN0eS0+bnJlc2xldmVscywgUkVwb2MpOyByZXNsZXZlbG5vKyspIHsKICAgICAgICAgICAgICAgICB1aW50OF90IHJlZHVjZWRyZXNubyA9IGNvZHN0eS0+bnJlc2xldmVscyAtIDEgLXJlc2xldmVsbm87IC8vICA9PT4gTl9MIC0gcgogICAgICAgICAgICAgICAgIEpwZWcyMDAwUmVzTGV2ZWwgKnJsZXZlbCA9IGNvbXAtPnJlc2xldmVsICsgcmVzbGV2ZWxubzsKQEAgLTExMzAsMTAgKzExODEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4YyA9IHggLyBzLT5jZHhbY29tcG5vXTsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5YyA9IHkgLyBzLT5jZHlbY29tcG5vXTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHljICUgKDEgPDwgKHJsZXZlbC0+bG9nMl9wcmVjX2hlaWdodCArIHJlZHVjZWRyZXNubykpICYmIHkgIT0gdGlsZS0+Y29vcmRbMV1bMF0pIC8vRklYTUUgdGhpcyBpcyBhIHN1YnNldCBvZiB0aGUgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5YyAlICgxTEwgPDwgKHJsZXZlbC0+bG9nMl9wcmVjX2hlaWdodCArIHJlZHVjZWRyZXNubykpICYmIHkgIT0gdGlsZS0+Y29vcmRbMV1bMF0pIC8vRklYTUUgdGhpcyBpcyBhIHN1YnNldCBvZiB0aGUgY2hlY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhjICUgKDEgPDwgKHJsZXZlbC0+bG9nMl9wcmVjX3dpZHRoICsgcmVkdWNlZHJlc25vKSkgJiYgeCAhPSB0aWxlLT5jb29yZFswXVswXSkgLy9GSVhNRSB0aGlzIGlzIGEgc3Vic2V0IG9mIHRoZSBjaGVjaworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhjICUgKDFMTCA8PCAocmxldmVsLT5sb2cyX3ByZWNfd2lkdGggKyByZWR1Y2VkcmVzbm8pKSAmJiB4ICE9IHRpbGUtPmNvb3JkWzBdWzBdKSAvL0ZJWE1FIHRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGEgcHJlY2luY3QgZXhpc3RzCkBAIC0xMjAwLDEwICsxMjUxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzbGV2ZWxubyA+PSBjb2RzdHktPm5yZXNsZXZlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5YyAlICgxIDw8IChybGV2ZWwtPmxvZzJfcHJlY19oZWlnaHQgKyByZWR1Y2VkcmVzbm8pKSAmJiB5ICE9IHRpbGUtPmNvb3JkWzFdWzBdKSAvL0ZJWE1FIHRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeWMgJSAoMUxMIDw8IChybGV2ZWwtPmxvZzJfcHJlY19oZWlnaHQgKyByZWR1Y2VkcmVzbm8pKSAmJiB5ICE9IHRpbGUtPmNvb3JkWzFdWzBdKSAvL0ZJWE1FIHRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4YyAlICgxIDw8IChybGV2ZWwtPmxvZzJfcHJlY193aWR0aCArIHJlZHVjZWRyZXNubykpICYmIHggIT0gdGlsZS0+Y29vcmRbMF1bMF0pIC8vRklYTUUgdGhpcyBpcyBhIHN1YnNldCBvZiB0aGUgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4YyAlICgxTEwgPDwgKHJsZXZlbC0+bG9nMl9wcmVjX3dpZHRoICsgcmVkdWNlZHJlc25vKSkgJiYgeCAhPSB0aWxlLT5jb29yZFswXVswXSkgLy9GSVhNRSB0aGlzIGlzIGEgc3Vic2V0IG9mIHRoZSBjaGVjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhIHByZWNpbmN0IGV4aXN0cwpAQCAtMTI3MSwxMCArMTMyMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWR1Y2VkcmVzbm8gPSBjb2RzdHktPm5yZXNsZXZlbHMgLSAxIC1yZXNsZXZlbG5vOyAvLyAgPT0+IE5fTCAtIHIKICAgICAgICAgICAgICAgICAgICAgICAgIEpwZWcyMDAwUmVzTGV2ZWwgKnJsZXZlbCA9IGNvbXAtPnJlc2xldmVsICsgcmVzbGV2ZWxubzsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHljICUgKDEgPDwgKHJsZXZlbC0+bG9nMl9wcmVjX2hlaWdodCArIHJlZHVjZWRyZXNubykpICYmIHkgIT0gdGlsZS0+Y29vcmRbMV1bMF0pIC8vRklYTUUgdGhpcyBpcyBhIHN1YnNldCBvZiB0aGUgY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5YyAlICgxTEwgPDwgKHJsZXZlbC0+bG9nMl9wcmVjX2hlaWdodCArIHJlZHVjZWRyZXNubykpICYmIHkgIT0gdGlsZS0+Y29vcmRbMV1bMF0pIC8vRklYTUUgdGhpcyBpcyBhIHN1YnNldCBvZiB0aGUgY2hlY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhjICUgKDEgPDwgKHJsZXZlbC0+bG9nMl9wcmVjX3dpZHRoICsgcmVkdWNlZHJlc25vKSkgJiYgeCAhPSB0aWxlLT5jb29yZFswXVswXSkgLy9GSVhNRSB0aGlzIGlzIGEgc3Vic2V0IG9mIHRoZSBjaGVjaworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhjICUgKDFMTCA8PCAocmxldmVsLT5sb2cyX3ByZWNfd2lkdGggKyByZWR1Y2VkcmVzbm8pKSAmJiB4ICE9IHRpbGUtPmNvb3JkWzBdWzBdKSAvL0ZJWE1FIHRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGEgcHJlY2luY3QgZXhpc3RzCkBAIC0xNzU1LDkgKzE4MDYsMTIgQEAKIAogI3VuZGVmIFdSSVRFX0ZSQU1FCiAKLXN0YXRpYyBpbnQganBlZzIwMDBfZGVjb2RlX3RpbGUoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCAqcywgSnBlZzIwMDBUaWxlICp0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpwaWN0dXJlKQorc3RhdGljIGludCBqcGVnMjAwMF9kZWNvZGVfdGlsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9ibnIsIGludCB0aHJlYWRucikKIHsKKyAgICBKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpwaWN0dXJlID0gdGQ7CisgICAgSnBlZzIwMDBUaWxlICp0aWxlID0gcy0+dGlsZSArIGpvYm5yOwogICAgIGludCB4OwogCiAgICAgdGlsZV9jb2RlYmxvY2tzKHMsIHRpbGUpOwpAQCAtMTk2Miw3ICsyMDE2LDE2IEBACiAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA+PSA4KSB7CiAgICAgICAgIGF0b21fc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmcy0+Zyk7CiAgICAgICAgIGF0b20gICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmcy0+Zyk7Ci0gICAgICAgIGF0b21fZW5kICA9IGJ5dGVzdHJlYW0yX3RlbGwoJnMtPmcpICsgYXRvbV9zaXplIC0gODsKKyAgICAgICAgaWYgKGF0b21fc2l6ZSA9PSAxKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nKSkgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIkh1Z2UgYXRvbSIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXRvbV9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZzLT5nKTsKKyAgICAgICAgICAgIGF0b21fZW5kICA9IGJ5dGVzdHJlYW0yX3RlbGwoJnMtPmcpICsgYXRvbV9zaXplIC0gMTY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdG9tX2VuZCAgPSBieXRlc3RyZWFtMl90ZWxsKCZzLT5nKSArIGF0b21fc2l6ZSAtICA4OworICAgICAgICB9CiAKICAgICAgICAgaWYgKGF0b20gPT0gSlAyX0NPREVTVFJFQU0pCiAgICAgICAgICAgICByZXR1cm4gMTsKQEAgLTE5NzksNiArMjA0Miw3IEBACiAgICAgICAgICAgICAgICAgYXRvbTJfZW5kICA9IGJ5dGVzdHJlYW0yX3RlbGwoJnMtPmcpICsgYXRvbTJfc2l6ZSAtIDg7CiAgICAgICAgICAgICAgICAgaWYgKGF0b20yX3NpemUgPCA4IHx8IGF0b20yX2VuZCA+IGF0b21fZW5kIHx8IGF0b20yX2VuZCA8IGF0b20yX3NpemUpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGF0b20yX3NpemUgLT0gODsKICAgICAgICAgICAgICAgICBpZiAoYXRvbTIgPT0gSlAyX0NPREVTVFJFQU0pIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdG9tMiA9PSBNS0JFVEFHKCdjJywnbycsJ2wnLCdyJykgJiYgYXRvbTJfc2l6ZSA+PSA3KSB7CkBAIC0yMDE5LDEzICsyMDgzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3VyX2RlcHRoWzFdIDw9IDgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGV1KCZzLT5nKSA8PCA4IC0gY29sb3VyX2RlcHRoWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgfD0gciA+PiBjb2xvdXJfZGVwdGhbMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyB8PSBnID4+IGNvbG91cl9kZXB0aFsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+ZykgPj4gY29sb3VyX2RlcHRoWzFdIC0gODsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvdXJfZGVwdGhbMl0gPD0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpIDw8IDggLSBjb2xvdXJfZGVwdGhbMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgciB8PSByID4+IGNvbG91cl9kZXB0aFsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIHw9IGIgPj4gY29sb3VyX2RlcHRoWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKSA+PiBjb2xvdXJfZGVwdGhbMl0gLSA4OwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMjA0MCw2ICsyMTA0LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY24gPCA0ICYmIGFzb2MgPCA0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNkZWZbY25dID0gYXNvYzsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXRvbTIgPT0gTUtCRVRBRygncicsJ2UnLCdzJywnICcpICYmIGF0b20yX3NpemUgPj0gMTgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2bnVtLCB2ZGVuLCBobnVtLCBoZGVuLCB2ZXhwLCBoZXhwOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXN4OworICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVzeCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN4ICE9IE1LQkVUQUcoJ3InLCdlJywncycsJ2MnKSAmJiByZXN4ICE9IE1LQkVUQUcoJ3InLCdlJywncycsJ2QnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2Vlaygmcy0+ZywgYXRvbTJfZW5kLCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2bnVtID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKTsKKyAgICAgICAgICAgICAgICAgICAgdmRlbiA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2dSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgICAgIGhudW0gPSBieXRlc3RyZWFtMl9nZXRfYmUxNnUoJnMtPmcpOworICAgICAgICAgICAgICAgICAgICBoZGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTZ1KCZzLT5nKTsKKyAgICAgICAgICAgICAgICAgICAgdmV4cCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmcy0+Zyk7CisgICAgICAgICAgICAgICAgICAgIGhleHAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmcpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXZudW0gfHwgIXZkZW4gfHwgIWhudW0gfHwgIWhkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NlZWsoJnMtPmcsIGF0b20yX2VuZCwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlJFUyBib3ggaW52YWxpZFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodmV4cCA+IGhleHApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZleHAgLT0gaGV4cDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhleHAgPSAwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaGV4cCAtPSB2ZXhwOworICAgICAgICAgICAgICAgICAgICAgICAgdmV4cCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCAgIElOVDY0X01BWCAvIChobnVtICogdmRlbikgPiBwb3coMTAsIGhleHApCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBJTlQ2NF9NQVggLyAodm51bSAqIGhkZW4pID4gcG93KDEwLCB2ZXhwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X3JlZHVjZSgmcy0+c2FyLmRlbiwgJnMtPnNhci5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG51bSAqIHZkZW4gKiBwb3coMTAsIGhleHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZudW0gKiBoZGVuICogcG93KDEwLCB2ZXhwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMl9NQVgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nLCBhdG9tMl9lbmQsIFNFRUtfU0VUKTsKICAgICAgICAgICAgIH0gd2hpbGUgKGF0b21fZW5kIC0gYXRvbTJfZW5kID49IDgpOwpAQCAtMjA1MiwxMCArMjE0OSwxOCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgYXZfY29sZCB2b2lkIGpwZWcyMDAwX2luaXRfc3RhdGljX2RhdGEodm9pZCkKK3sKKyAgICBmZl9qcGVnMjAwMF9pbml0X3RpZXIxX2x1dHMoKTsKKyAgICBmZl9tcWNfaW5pdF9jb250ZXh0X3RhYmxlcygpOworfQorCiBzdGF0aWMgYXZfY29sZCBpbnQganBlZzIwMDBfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogeworICAgIHN0YXRpYyBBVk9uY2UgaW5pdF9zdGF0aWNfb25jZSA9IEFWX09OQ0VfSU5JVDsKICAgICBKcGVnMjAwMERlY29kZXJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKIAorICAgIGZmX3RocmVhZF9vbmNlKCZpbml0X3N0YXRpY19vbmNlLCBqcGVnMjAwMF9pbml0X3N0YXRpY19kYXRhKTsKICAgICBmZl9qcGVnMjAwMGRzcF9pbml0KCZzLT5kc3ApOwogCiAgICAgcmV0dXJuIDA7CkBAIC0yMDY3LDcgKzIxNzIsNyBAQAogICAgIEpwZWcyMDAwRGVjb2RlckNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIFRocmVhZEZyYW1lIGZyYW1lID0geyAuZiA9IGRhdGEgfTsKICAgICBBVkZyYW1lICpwaWN0dXJlID0gZGF0YTsKLSAgICBpbnQgdGlsZW5vLCByZXQ7CisgICAgaW50IHJldDsKIAogICAgIHMtPmF2Y3R4ICAgICA9IGF2Y3R4OwogICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmcsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CkBAIC0yMTE0LDkgKzIyMTksNyBAQAogICAgIGlmIChyZXQgPSBqcGVnMjAwMF9yZWFkX2JpdHN0cmVhbV9wYWNrZXRzKHMpKQogICAgICAgICBnb3RvIGVuZDsKIAotICAgIGZvciAodGlsZW5vID0gMDsgdGlsZW5vIDwgcy0+bnVtWHRpbGVzICogcy0+bnVtWXRpbGVzOyB0aWxlbm8rKykKLSAgICAgICAgaWYgKHJldCA9IGpwZWcyMDAwX2RlY29kZV90aWxlKHMsIHMtPnRpbGUgKyB0aWxlbm8sIHBpY3R1cmUpKQotICAgICAgICAgICAgZ290byBlbmQ7CisgICAgYXZjdHgtPmV4ZWN1dGUyKGF2Y3R4LCBqcGVnMjAwMF9kZWNvZGVfdGlsZSwgcGljdHVyZSwgTlVMTCwgcy0+bnVtWHRpbGVzICogcy0+bnVtWXRpbGVzKTsKIAogICAgIGpwZWcyMDAwX2RlY19jbGVhbnVwKHMpOwogCkBAIC0yMTI0LDYgKzIyMjcsOSBAQAogCiAgICAgaWYgKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkKICAgICAgICAgbWVtY3B5KHBpY3R1cmUtPmRhdGFbMV0sIHMtPnBhbGV0dGUsIDI1NiAqIHNpemVvZih1aW50MzJfdCkpOworICAgIGlmIChzLT5zYXIubnVtICYmIHMtPnNhci5kZW4pCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcy0+c2FyOworICAgIHMtPnNhci5udW0gPSBzLT5zYXIuZGVuID0gMDsKIAogICAgIHJldHVybiBieXRlc3RyZWFtMl90ZWxsKCZzLT5nKTsKIApAQCAtMjEzMiwxMiArMjIzOCw2IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGF2X2NvbGQgdm9pZCBqcGVnMjAwMF9pbml0X3N0YXRpY19kYXRhKEFWQ29kZWMgKmNvZGVjKQotewotICAgIGZmX2pwZWcyMDAwX2luaXRfdGllcjFfbHV0cygpOwotICAgIGZmX21xY19pbml0X2NvbnRleHRfdGFibGVzKCk7Ci19Ci0KICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEpwZWcyMDAwRGVjb2RlckNvbnRleHQsIHgpCiAjZGVmaW5lIFZEIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KIApAQCAtMjE1OSw5ICsyMjU5LDggQEAKICAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJKUEVHIDIwMDAiKSwKICAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0pQRUcyMDAwLAotICAgIC5jYXBhYmlsaXRpZXMgICAgID0gQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfCBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBhYmlsaXRpZXMgICAgID0gQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IEFWX0NPREVDX0NBUF9EUjEsCiAgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoSnBlZzIwMDBEZWNvZGVyQ29udGV4dCksCi0gICAgLmluaXRfc3RhdGljX2RhdGEgPSBqcGVnMjAwMF9pbml0X3N0YXRpY19kYXRhLAogICAgIC5pbml0ICAgICAgICAgICAgID0ganBlZzIwMDBfZGVjb2RlX2luaXQsCiAgICAgLmRlY29kZSAgICAgICAgICAgPSBqcGVnMjAwMF9kZWNvZGVfZnJhbWUsCiAgICAgLnByaXZfY2xhc3MgICAgICAgPSAmanBlZzIwMDBfY2xhc3MsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2pwZWcyMDAwZHNwLmMgYi9saWJhdmNvZGVjL2pwZWcyMDAwZHNwLmMKaW5kZXggZDE4M2NiYi4uOTBlNzNiMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9qcGVnMjAwMGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvanBlZzIwMDBkc3AuYwpAQCAtNjQsMTAgKzY0LDEwIEBACiAgICAgaW50IGk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgY3NpemU7IGkrKykgewotICAgICAgICBpMCA9ICpzcmMwICsgKCgoaV9pY3RfcGFyYW1zWzBdICogKnNyYzIpICsgKDEgPDwgMTUpKSA+PiAxNik7Ci0gICAgICAgIGkxID0gKnNyYzAgLSAoKChpX2ljdF9wYXJhbXNbMV0gKiAqc3JjMSkgKyAoMSA8PCAxNSkpID4+IDE2KQotICAgICAgICAgICAgICAgICAgIC0gKCgoaV9pY3RfcGFyYW1zWzJdICogKnNyYzIpICsgKDEgPDwgMTUpKSA+PiAxNik7Ci0gICAgICAgIGkyID0gKnNyYzAgKyAoKChpX2ljdF9wYXJhbXNbM10gKiAqc3JjMSkgKyAoMSA8PCAxNSkpID4+IDE2KTsKKyAgICAgICAgaTAgPSAqc3JjMCArICpzcmMyICsgKChpbnQpKCgyNjM0NVUgKiAqc3JjMikgKyAoMSA8PCAxNSkpID4+IDE2KTsKKyAgICAgICAgaTEgPSAqc3JjMCAtICgoaW50KSgoKHVuc2lnbmVkKWlfaWN0X3BhcmFtc1sxXSAqICpzcmMxKSArICgxIDw8IDE1KSkgPj4gMTYpCisgICAgICAgICAgICAgICAgICAgLSAoKGludCkoKCh1bnNpZ25lZClpX2ljdF9wYXJhbXNbMl0gKiAqc3JjMikgKyAoMSA8PCAxNSkpID4+IDE2KTsKKyAgICAgICAgaTIgPSAqc3JjMCArICgyICogKnNyYzEpICsgKChpbnQpKCgtMTQ5NDJVICogKnNyYzEpICsgKDEgPDwgMTUpKSA+PiAxNik7CiAgICAgICAgICpzcmMwKysgPSBpMDsKICAgICAgICAgKnNyYzErKyA9IGkxOwogICAgICAgICAqc3JjMisrID0gaTI7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2pwZWcyMDAwZHd0LmMgYi9saWJhdmNvZGVjL2pwZWcyMDAwZHd0LmMKaW5kZXggYTQ2YzkzYS4uYmFkZjBmOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9qcGVnMjAwMGR3dC5jCisrKyBiL2xpYmF2Y29kZWMvanBlZzIwMDBkd3QuYwpAQCAtMzA1LDIyICszMDUsMjIgQEAKICAgICAgICAgdFtpXSA9ICh0W2ldICsgKCgxPDxJX1BSRVNISUZUKT4+MSkpID4+IElfUFJFU0hJRlQ7CiB9CiAKLXN0YXRpYyB2b2lkIHNyXzFkNTMoaW50ICpwLCBpbnQgaTAsIGludCBpMSkKK3N0YXRpYyB2b2lkIHNyXzFkNTModW5zaWduZWQgKnAsIGludCBpMCwgaW50IGkxKQogewogICAgIGludCBpOwogCiAgICAgaWYgKGkxIDw9IGkwICsgMSkgewogICAgICAgICBpZiAoaTAgPT0gMSkKLSAgICAgICAgICAgIHBbMV0gPj49IDE7CisgICAgICAgICAgICBwWzFdID0gKGludClwWzFdID4+IDE7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBleHRlbmQ1MyhwLCBpMCwgaTEpOwogCiAgICAgZm9yIChpID0gKGkwID4+IDEpOyBpIDwgKGkxID4+IDEpICsgMTsgaSsrKQotICAgICAgICBwWzIgKiBpXSAtPSAocFsyICogaSAtIDFdICsgcFsyICogaSArIDFdICsgMikgPj4gMjsKKyAgICAgICAgcFsyICogaV0gLT0gKGludCkocFsyICogaSAtIDFdICsgcFsyICogaSArIDFdICsgMikgPj4gMjsKICAgICBmb3IgKGkgPSAoaTAgPj4gMSk7IGkgPCAoaTEgPj4gMSk7IGkrKykKLSAgICAgICAgcFsyICogaSArIDFdICs9IChwWzIgKiBpXSArIHBbMiAqIGkgKyAyXSkgPj4gMTsKKyAgICAgICAgcFsyICogaSArIDFdICs9IChpbnQpKHBbMiAqIGldICsgcFsyICogaSArIDJdKSA+PiAxOwogfQogCiBzdGF0aWMgdm9pZCBkd3RfZGVjb2RlNTMoRFdUQ29udGV4dCAqcywgaW50ICp0KQpAQCAtNDY0LDE2ICs0NjQsMTYgQEAKICAgICBleHRlbmQ5N19pbnQocCwgaTAsIGkxKTsKIAogICAgIGZvciAoaSA9IChpMCA+PiAxKSAtIDE7IGkgPCAoaTEgPj4gMSkgKyAyOyBpKyspCi0gICAgICAgIHBbMiAqIGldICAgICAtPSAoSV9MRlRHX0RFTFRBICogKHBbMiAqIGkgLSAxXSArIHBbMiAqIGkgKyAxXSkgKyAoMSA8PCAxNSkpID4+IDE2OworICAgICAgICBwWzIgKiBpXSAgICAgLT0gKElfTEZUR19ERUxUQSAqIChwWzIgKiBpIC0gMV0gKyAoaW50NjRfdClwWzIgKiBpICsgMV0pICsgKDEgPDwgMTUpKSA+PiAxNjsKICAgICAvKiBzdGVwIDQgKi8KICAgICBmb3IgKGkgPSAoaTAgPj4gMSkgLSAxOyBpIDwgKGkxID4+IDEpICsgMTsgaSsrKQotICAgICAgICBwWzIgKiBpICsgMV0gLT0gKElfTEZUR19HQU1NQSAqIChwWzIgKiBpXSAgICAgKyBwWzIgKiBpICsgMl0pICsgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICAgICAgcFsyICogaSArIDFdIC09IChJX0xGVEdfR0FNTUEgKiAocFsyICogaV0gICAgICsgKGludDY0X3QpcFsyICogaSArIDJdKSArICgxIDw8IDE1KSkgPj4gMTY7CiAgICAgLypzdGVwIDUqLwogICAgIGZvciAoaSA9IChpMCA+PiAxKTsgaSA8IChpMSA+PiAxKSArIDE7IGkrKykKLSAgICAgICAgcFsyICogaV0gICAgICs9IChJX0xGVEdfQkVUQSAgKiAocFsyICogaSAtIDFdICsgcFsyICogaSArIDFdKSArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgICAgIHBbMiAqIGldICAgICArPSAoSV9MRlRHX0JFVEEgICogKHBbMiAqIGkgLSAxXSArIChpbnQ2NF90KXBbMiAqIGkgKyAxXSkgKyAoMSA8PCAxNSkpID4+IDE2OwogICAgIC8qIHN0ZXAgNiAqLwogICAgIGZvciAoaSA9IChpMCA+PiAxKTsgaSA8IChpMSA+PiAxKTsgaSsrKQotICAgICAgICBwWzIgKiBpICsgMV0gKz0gKElfTEZUR19BTFBIQSAqIChwWzIgKiBpXSAgICAgKyBwWzIgKiBpICsgMl0pICsgKDEgPDwgMTUpKSA+PiAxNjsKKyAgICAgICAgcFsyICogaSArIDFdICs9IChJX0xGVEdfQUxQSEEgKiAocFsyICogaV0gICAgICsgKGludDY0X3QpcFsyICogaSArIDJdKSArICgxIDw8IDE1KSkgPj4gMTY7CiB9CiAKIHN0YXRpYyB2b2lkIGR3dF9kZWNvZGU5N19pbnQoRFdUQ29udGV4dCAqcywgaW50MzJfdCAqdCkKQEAgLTQ4OCw3ICs0ODgsNyBAQAogICAgIGxpbmUgKz0gNTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCB3ICogaDsgaSsrKQotICAgICAgICBkYXRhW2ldIDw8PSBJX1BSRVNISUZUOworICAgICAgICBkYXRhW2ldICo9IDFMTCA8PCBJX1BSRVNISUZUOwogCiAgICAgZm9yIChsZXYgPSAwOyBsZXYgPCBzLT5uZGVjbGV2ZWxzOyBsZXYrKykgewogICAgICAgICBpbnQgbGggPSBzLT5saW5lbGVuW2xldl1bMF0sCkBAIC01MzEsNyArNTMxLDcgQEAKICAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgdyAqIGg7IGkrKykKLSAgICAgICAgZGF0YVtpXSA9IChkYXRhW2ldICsgKCgxPDxJX1BSRVNISUZUKT4+MSkpID4+IElfUFJFU0hJRlQ7CisgICAgICAgIGRhdGFbaV0gPSAoZGF0YVtpXSArICgoMUxMPDxJX1BSRVNISUZUKT4+MSkpID4+IElfUFJFU0hJRlQ7CiB9CiAKIGludCBmZl9qcGVnMjAwMF9kd3RfaW5pdChEV1RDb250ZXh0ICpzLCBpbnQgYm9yZGVyWzJdWzJdLApAQCAtNjIyLDEyNSArNjIyLDMgQEAKICAgICBhdl9mcmVlcCgmcy0+Zl9saW5lYnVmKTsKICAgICBhdl9mcmVlcCgmcy0+aV9saW5lYnVmKTsKIH0KLQotI2lmZGVmIFRFU1QKLQotI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKLQotI2RlZmluZSBNQVhfVyAyNTYKLQotc3RhdGljIGludCB0ZXN0X2R3dChpbnQgKmFycmF5LCBpbnQgKnJlZiwgaW50IGJvcmRlclsyXVsyXSwgaW50IGRlY29tcF9sZXZlbHMsIGludCB0eXBlLCBpbnQgbWF4X2RpZmYpIHsKLSAgICBpbnQgcmV0LCBqOwotICAgIERXVENvbnRleHQgczE9e3t7MH19fSwgKnM9ICZzMTsKLSAgICBpbnQ2NF90IGVycjIgPSAwOwotCi0gICAgcmV0ID0gZmZfanBlZzIwMDBfZHd0X2luaXQocywgIGJvcmRlciwgZGVjb21wX2xldmVscywgdHlwZSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZl9qcGVnMjAwMF9kd3RfaW5pdCBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0ID0gZmZfZHd0X2VuY29kZShzLCBhcnJheSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZl9kd3RfZW5jb2RlIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXQgPSBmZl9kd3RfZGVjb2RlKHMsIGFycmF5KTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZmX2R3dF9lbmNvZGUgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGZvciAoaiA9IDA7IGo8TUFYX1cgKiBNQVhfVzsgaisrKSB7Ci0gICAgICAgIGlmIChGRkFCUyhhcnJheVtqXSAtIHJlZltqXSkgPiBtYXhfZGlmZikgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtaXNzbWF0Y2ggYXQgJWQgKCVkICE9ICVkKSBkZWNvbXA6JWQgYm9yZGVyICVkICVkICVkICVkXG4iLAotICAgICAgICAgICAgICAgICAgICBqLCBhcnJheVtqXSwgcmVmW2pdLGRlY29tcF9sZXZlbHMsIGJvcmRlclswXVswXSwgYm9yZGVyWzBdWzFdLCBib3JkZXJbMV1bMF0sIGJvcmRlclsxXVsxXSk7Ci0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBlcnIyICs9IChhcnJheVtqXSAtIHJlZltqXSkgKiAoYXJyYXlbal0gLSByZWZbal0pOwotICAgICAgICBhcnJheVtqXSA9IHJlZltqXTsKLSAgICB9Ci0gICAgZmZfZHd0X2Rlc3Ryb3kocyk7Ci0KLSAgICBwcmludGYoIiVzLCBkZWNvbXA6JTJkIGJvcmRlciAlM2QgJTNkICUzZCAlM2QgbWlsbGktZXJyMjolOSJQUklkNjQiXG4iLAotICAgICAgICAgICB0eXBlID09IEZGX0RXVDUzID8gIjUvM2kiIDogIjkvN2kiLAotICAgICAgICAgICBkZWNvbXBfbGV2ZWxzLCBib3JkZXJbMF1bMF0sIGJvcmRlclswXVsxXSwgYm9yZGVyWzFdWzBdLCBib3JkZXJbMV1bMV0sCi0gICAgICAgICAgIDEwMDAqZXJyMiAvICgoYm9yZGVyWzBdWzFdIC0gYm9yZGVyWzBdWzBdKSooYm9yZGVyWzFdWzFdIC0gYm9yZGVyWzFdWzBdKSkpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGVzdF9kd3RmKGZsb2F0ICphcnJheSwgZmxvYXQgKnJlZiwgaW50IGJvcmRlclsyXVsyXSwgaW50IGRlY29tcF9sZXZlbHMsIGZsb2F0IG1heF9kaWZmKSB7Ci0gICAgaW50IHJldCwgajsKLSAgICBEV1RDb250ZXh0IHMxPXt7ezB9fX0sICpzPSAmczE7Ci0gICAgZG91YmxlIGVycjIgPSAwOwotCi0gICAgcmV0ID0gZmZfanBlZzIwMDBfZHd0X2luaXQocywgIGJvcmRlciwgZGVjb21wX2xldmVscywgRkZfRFdUOTcpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmZfanBlZzIwMDBfZHd0X2luaXQgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldCA9IGZmX2R3dF9lbmNvZGUocywgYXJyYXkpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmZfZHd0X2VuY29kZSBmYWlsZWRcbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0ID0gZmZfZHd0X2RlY29kZShzLCBhcnJheSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZl9kd3RfZW5jb2RlIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBmb3IgKGogPSAwOyBqPE1BWF9XICogTUFYX1c7IGorKykgewotICAgICAgICBpZiAoRkZBQlMoYXJyYXlbal0gLSByZWZbal0pID4gbWF4X2RpZmYpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWlzc21hdGNoIGF0ICVkICglZiAhPSAlZikgZGVjb21wOiVkIGJvcmRlciAlZCAlZCAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaiwgYXJyYXlbal0sIHJlZltqXSxkZWNvbXBfbGV2ZWxzLCBib3JkZXJbMF1bMF0sIGJvcmRlclswXVsxXSwgYm9yZGVyWzFdWzBdLCBib3JkZXJbMV1bMV0pOwotICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgZXJyMiArPSAoYXJyYXlbal0gLSByZWZbal0pICogKGFycmF5W2pdIC0gcmVmW2pdKTsKLSAgICAgICAgYXJyYXlbal0gPSByZWZbal07Ci0gICAgfQotICAgIGZmX2R3dF9kZXN0cm95KHMpOwotCi0gICAgcHJpbnRmKCI5LzdmLCBkZWNvbXA6JTJkIGJvcmRlciAlM2QgJTNkICUzZCAlM2QgZXJyMjolMjAuM2ZcbiIsCi0gICAgICAgICAgIGRlY29tcF9sZXZlbHMsIGJvcmRlclswXVswXSwgYm9yZGVyWzBdWzFdLCBib3JkZXJbMV1bMF0sIGJvcmRlclsxXVsxXSwKLSAgICAgICAgICAgZXJyMiAvICgoYm9yZGVyWzBdWzFdIC0gYm9yZGVyWzBdWzBdKSooYm9yZGVyWzFdWzFdIC0gYm9yZGVyWzFdWzBdKSkpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYXJyYXlbTUFYX1cgKiBNQVhfV107Ci1zdGF0aWMgaW50IHJlZiAgW01BWF9XICogTUFYX1ddOwotc3RhdGljIGZsb2F0IGFycmF5ZltNQVhfVyAqIE1BWF9XXTsKLXN0YXRpYyBmbG9hdCByZWZmICBbTUFYX1cgKiBNQVhfV107Ci0KLWludCBtYWluKHZvaWQpIHsKLSAgICBBVkxGRyBwcm5nOwotICAgIGludCBpLGo7Ci0gICAgaW50IGJvcmRlclsyXVsyXTsKLSAgICBpbnQgcmV0LCBkZWNvbXBfbGV2ZWxzOwotCi0gICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOwotCi0gICAgZm9yIChpID0gMDsgaTxNQVhfVyAqIE1BWF9XOyBpKyspCi0gICAgICAgIGFycmF5ZltpXSA9IHJlZmZbaV0gPSBhcnJheVtpXSA9IHJlZltpXSA9ICBhdl9sZmdfZ2V0KCZwcm5nKSAlIDIwNDg7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgZm9yIChqPTA7IGo8NDsgaisrKQotICAgICAgICAgICAgYm9yZGVyW2o+PjFdW2omMV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIE1BWF9XOwotICAgICAgICBpZiAoYm9yZGVyWzBdWzBdID49IGJvcmRlclswXVsxXSB8fCBib3JkZXJbMV1bMF0gPj0gYm9yZGVyWzFdWzFdKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGRlY29tcF9sZXZlbHMgPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIEZGX0RXVF9NQVhfREVDTFZMUzsKLQotICAgICAgICByZXQgPSB0ZXN0X2R3dChhcnJheSwgcmVmLCBib3JkZXIsIGRlY29tcF9sZXZlbHMsIEZGX0RXVDUzLCAwKTsKLSAgICAgICAgaWYgKHJldCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIHJldCA9IHRlc3RfZHd0KGFycmF5LCByZWYsIGJvcmRlciwgZGVjb21wX2xldmVscywgRkZfRFdUOTdfSU5ULCBGRk1JTig3KzUqZGVjb21wX2xldmVscywgMTUrMypkZWNvbXBfbGV2ZWxzKSk7Ci0gICAgICAgIGlmIChyZXQpCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICByZXQgPSB0ZXN0X2R3dGYoYXJyYXlmLCByZWZmLCBib3JkZXIsIGRlY29tcF9sZXZlbHMsIDAuMDUpOwotICAgICAgICBpZiAocmV0KQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2pwZWdscy5oIGIvbGliYXZjb2RlYy9qcGVnbHMuaAppbmRleCBjODk5N2M3Li42Yjg5YjJhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2pwZWdscy5oCisrKyBiL2xpYmF2Y29kZWMvanBlZ2xzLmgKQEAgLTMyLDYgKzMyLDggQEAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAorI3VuZGVmIG5lYXIgLyogVGhpcyBmaWxlIHVzZXMgc3RydWN0IG1lbWJlciAnbmVhcicgd2hpY2ggaW4gd2luZG93cy5oIGlzIGRlZmluZWQgYXMgZW1wdHkuICovCisKIHR5cGVkZWYgc3RydWN0IEpwZWdsc0NvbnRleHQgewogICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKIH0gSnBlZ2xzQ29udGV4dDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvanBlZ2xzZGVjLmMgYi9saWJhdmNvZGVjL2pwZWdsc2RlYy5jCmluZGV4IDY4MTUxY2IuLjUzMDhiNzQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvanBlZ2xzZGVjLmMKKysrIGIvbGliYXZjb2RlYy9qcGVnbHNkZWMuYwpAQCAtMjMzLDYgKzIzMyw5IEBACiAgICAgd2hpbGUgKHggPCB3KSB7CiAgICAgICAgIGludCBlcnIsIHByZWQ7CiAKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuOworCiAgICAgICAgIC8qIGNvbXB1dGUgZ3JhZGllbnRzICovCiAgICAgICAgIFJhID0geCA/IFIoZHN0LCB4IC0gc3RyaWRlKSA6IFIobGFzdCwgeCk7CiAgICAgICAgIFJiID0gUihsYXN0LCB4KTsKQEAgLTM3NSw2ICszNzgsMTEgQEAKICAgICBlbHNlCiAgICAgICAgIHNoaWZ0ID0gcG9pbnRfdHJhbnNmb3JtICsgKDE2IC0gcy0+Yml0cyk7CiAKKyAgICBpZiAoc2hpZnQgPj0gMTYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCiAgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywKICAgICAgICAgICAgICAgICJKUEVHLUxTIHBhcmFtczogJWl4JWkgTkVBUj0laSBNVj0laSBUKCVpLCVpLCVpKSAiCkBAIC0zODUsNiArMzkzLDEwIEBACiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiSlBFRyBwYXJhbXM6IElMVj0laSBQdD0laSBCUFA9JWksIHNjYW4gPSAlaVxuIiwKICAgICAgICAgICAgICAgICBpbHYsIHBvaW50X3RyYW5zZm9ybSwgcy0+Yml0cywgcy0+Y3VyX3NjYW4pOwogICAgIH0KKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgcy0+aGVpZ2h0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KICAgICBpZiAoaWx2ID09IDApIHsgLyogc2VwYXJhdGUgcGxhbmVzICovCiAgICAgICAgIGlmIChzLT5jdXJfc2NhbiA+IHMtPm5iX2NvbXBvbmVudHMpIHsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC00MzQsNiArNDQ2LDEwIEBACiAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiU2FtcGxlIGludGVybGVhdmVkIGltYWdlcyIpOwogICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgZ290byBlbmQ7CisgICAgfSBlbHNlIHsgLyogdW5rbm93biBpbnRlcmxlYXZpbmcgKi8KKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICJVbmtub3duIGludGVybGVhdmVkIGltYWdlcyIpOworICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgZ290byBlbmQ7CiAgICAgfQogCiAgICAgaWYgKHMtPnhmcm0gJiYgcy0+bmJfY29tcG9uZW50cyA9PSAzKSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2pwZWdsc2VuYy5jIGIvbGliYXZjb2RlYy9qcGVnbHNlbmMuYwppbmRleCBjZDE2MTg0Li4xMjA4Y2RhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2pwZWdsc2VuYy5jCisrKyBiL2xpYmF2Y29kZWMvanBlZ2xzZW5jLmMKQEAgLTM4Niw3ICszODYsNyBAQAogICAgIGF2X2ZyZWVwKCZzdGF0ZSk7CiAKICAgICAvKiB0aGUgc3BlY2lmaWNhdGlvbiBzYXlzIHRoYXQgYWZ0ZXIgZG9pbmcgMHhmZiBlc2NhcGluZyB1bnVzZWQgYml0cyBpbgotICAgICAqIHRoZSBsYXN0IGJ5dGUgbXVzdCBiZSBzZXQgdG8gMCwgc28ganVzdCBhcHBlbmQgNyAib3B0aW9uYWwiIHplcm8tYml0cworICAgICAqIHRoZSBsYXN0IGJ5dGUgbXVzdCBiZSBzZXQgdG8gMCwgc28ganVzdCBhcHBlbmQgNyAib3B0aW9uYWwiIHplcm8gYml0cwogICAgICAqIHRvIGF2b2lkIHNwZWNpYWwtY2FzaW5nLiAqLwogICAgIHB1dF9iaXRzKCZwYjIsIDcsIDApOwogICAgIHNpemUgPSBwdXRfYml0c19jb3VudCgmcGIyKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvanBlZ3RhYmxlcy5oIGIvbGliYXZjb2RlYy9qcGVndGFibGVzLmgKaW5kZXggNjgzM2I0Yi4uYWEzOGRmNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9qcGVndGFibGVzLmgKKysrIGIvbGliYXZjb2RlYy9qcGVndGFibGVzLmgKQEAgLTIzLDE4ICsyMywxOCBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi1leHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQ4X3QgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlW107Ci1leHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQ4X3QgYXZwcml2X21qcGVnX3ZhbF9kY1tdOworZXh0ZXJuIGF2X2V4cG9ydF9hdmNvZGVjIGNvbnN0IHVpbnQ4X3QgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlW107CitleHRlcm4gYXZfZXhwb3J0X2F2Y29kZWMgY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfdmFsX2RjW107CiAKLWV4dGVybiBhdl9leHBvcnQgY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfYml0c19kY19jaHJvbWluYW5jZVtdOworZXh0ZXJuIGF2X2V4cG9ydF9hdmNvZGVjIGNvbnN0IHVpbnQ4X3QgYXZwcml2X21qcGVnX2JpdHNfZGNfY2hyb21pbmFuY2VbXTsKIAotZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ19iaXRzX2FjX2x1bWluYW5jZVtdOwotZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ192YWxfYWNfbHVtaW5hbmNlW107CitleHRlcm4gYXZfZXhwb3J0X2F2Y29kZWMgY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfYml0c19hY19sdW1pbmFuY2VbXTsKK2V4dGVybiBhdl9leHBvcnRfYXZjb2RlYyBjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ192YWxfYWNfbHVtaW5hbmNlW107CiAKLWV4dGVybiBhdl9leHBvcnQgY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfYml0c19hY19jaHJvbWluYW5jZVtdOwotZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ192YWxfYWNfY2hyb21pbmFuY2VbXTsKK2V4dGVybiBhdl9leHBvcnRfYXZjb2RlYyBjb25zdCB1aW50OF90IGF2cHJpdl9tanBlZ19iaXRzX2FjX2Nocm9taW5hbmNlW107CitleHRlcm4gYXZfZXhwb3J0X2F2Y29kZWMgY29uc3QgdWludDhfdCBhdnByaXZfbWpwZWdfdmFsX2FjX2Nocm9taW5hbmNlW107CiAKIHZvaWQgZmZfbWpwZWdfYnVpbGRfaHVmZm1hbl9jb2Rlcyh1aW50OF90ICpodWZmX3NpemUsIHVpbnQxNl90ICpodWZmX2NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYml0c190YWJsZSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvanJldmRjdC5jIGIvbGliYXZjb2RlYy9qcmV2ZGN0LmMKaW5kZXggNTVhNzM5Mi4uM2IxNWE1MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9qcmV2ZGN0LmMKKysrIGIvbGliYXZjb2RlYy9qcmV2ZGN0LmMKQEAgLTExNTYsMTQgKzExNTYsMTQgQEAKICN1bmRlZiBGSVgKICN1bmRlZiBDT05TVF9CSVRTCiAKLXZvaWQgZmZfanJlZl9pZGN0X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3ZvaWQgZmZfanJlZl9pZGN0X3B1dCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKIHsKICAgICBmZl9qX3Jldl9kY3QoYmxvY2spOwotICAgIGZmX3B1dF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKKyAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWRfYyhibG9jaywgZGVzdCwgbGluZV9zaXplKTsKIH0KIAotdm9pZCBmZl9qcmVmX2lkY3RfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQordm9pZCBmZl9qcmVmX2lkY3RfYWRkKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGZmX2pfcmV2X2RjdChibG9jayk7Ci0gICAgZmZfYWRkX3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9jKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9qdmRlYy5jIGIvbGliYXZjb2RlYy9qdmRlYy5jCmluZGV4IGNiZTgzZDMuLjQzMzdkNTYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvanZkZWMuYworKysgYi9saWJhdmNvZGVjL2p2ZGVjLmMKQEAgLTE3MCw2ICsxNzAsMTEgQEAKICAgICAgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCA4ICogdmlkZW9fc2l6ZSk7CiAKKyAgICAgICAgICAgIGlmIChhdmN0eC0+aGVpZ2h0LzggKiAoYXZjdHgtPndpZHRoLzgpID4gNCAqIHZpZGVvX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluc3VmZmljaWVudCBpbnB1dCBkYXRhIGZvciBkaW1lbnNpb25zXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT5oZWlnaHQ7IGogKz0gOCkKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPndpZHRoOyBpICs9IDgpCiAgICAgICAgICAgICAgICAgICAgIGRlY29kZTh4OCgmZ2IsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2tndjFkZWMuYyBiL2xpYmF2Y29kZWMva2d2MWRlYy5jCmluZGV4IDUzNTk0MTEuLmE2YmQ5NDAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMva2d2MWRlYy5jCisrKyBiL2xpYmF2Y29kZWMva2d2MWRlYy5jCkBAIC02Miw2ICs2Miw5IEBACiAgICAgaCA9IChidWZbMV0gKyAxKSAqIDg7CiAgICAgYnVmICs9IDI7CiAKKyAgICBpZiAoYXZwa3QtPnNpemUgPCAyICsgdypoIC8gNTEzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIGlmICh3ICE9IGF2Y3R4LT53aWR0aCB8fCBoICE9IGF2Y3R4LT5oZWlnaHQpIHsKICAgICAgICAgYXZfZnJlZXAoJmMtPmZyYW1lX2J1ZmZlcik7CiAgICAgICAgIGF2X2ZyZWVwKCZjLT5sYXN0X2ZyYW1lX2J1ZmZlcik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2ttdmMuYyBiL2xpYmF2Y29kZWMva212Yy5jCmluZGV4IDdhY2FiYTcuLmZmZTZhMTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMva212Yy5jCisrKyBiL2xpYmF2Y29kZWMva212Yy5jCkBAIC0yNjgsNyArMjY4LDggQEAKICAgICBpbnQgaSwgcmV0OwogICAgIGludCBoZWFkZXI7CiAgICAgaW50IGJsb2Nrc2l6ZTsKLSAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisgICAgaW50IHBhbF9zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKnBhbCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCAmcGFsX3NpemUpOwogCiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmY3R4LT5nLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwogCkBAIC0zMDMsOSArMzA0LDExIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAocGFsKSB7CisgICAgaWYgKHBhbCAmJiBwYWxfc2l6ZSA9PSBBVlBBTEVUVEVfU0laRSkgewogICAgICAgICBmcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CiAgICAgICAgIG1lbWNweShjdHgtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgfSBlbHNlIGlmIChwYWwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWxldHRlIHNpemUgJWQgaXMgd3JvbmdcbiIsIHBhbF9zaXplKTsKICAgICB9CiAKICAgICBpZiAoY3R4LT5zZXRwYWwpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGFnYXJpdGguYyBiL2xpYmF2Y29kZWMvbGFnYXJpdGguYwppbmRleCA5NGQ3MjNkLi4wZjRhYTg5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xhZ2FyaXRoLmMKKysrIGIvbGliYXZjb2RlYy9sYWdhcml0aC5jCkBAIC0zMCw4ICszMCw4IEBACiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAibWF0aG9wcy5oIgotI2luY2x1ZGUgImh1ZmZ5dXZkc3AuaCIKICNpbmNsdWRlICJsYWdhcml0aHJhYy5oIgorI2luY2x1ZGUgImxvc3NsZXNzX3ZpZGVvZHNwLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAKIGVudW0gTGFnYXJpdGhGcmFtZVR5cGUgewpAQCAtNTAsNyArNTAsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBMYWdhcml0aENvbnRleHQgewogICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKLSAgICBIdWZmWVVWRFNQQ29udGV4dCBoZHNwOworICAgIExMVmlkRFNQQ29udGV4dCBsbHZpZGRzcDsKICAgICBpbnQgemVyb3M7ICAgICAgICAgICAgICAgICAgLyoqPCBudW1iZXIgb2YgY29uc2VjdXRpdmUgemVybyBieXRlcyBlbmNvdW50ZXJlZCAqLwogICAgIGludCB6ZXJvc19yZW07ICAgICAgICAgICAgICAvKio8IG51bWJlciBvZiB6ZXJvIGJ5dGVzIHJlbWFpbmluZyB0byBvdXRwdXQgKi8KICAgICB1aW50OF90ICpyZ2JfcGxhbmVzOwpAQCAtNTksMTEgKzU5LDExIEBACiB9IExhZ2FyaXRoQ29udGV4dDsKIAogLyoqCi0gKiBDb21wdXRlIHRoZSA1MmJpdCBtYW50aXNzYSBvZiAxLyhkb3VibGUpZGVub20uCisgKiBDb21wdXRlIHRoZSA1Mi1iaXQgbWFudGlzc2Egb2YgMS8oZG91YmxlKWRlbm9tLgogICogVGhpcyBjcmF6eSBmb3JtYXQgdXNlcyBmbG9hdHMgaW4gYW4gZW50cm9weSBjb2RlciBhbmQgd2UgaGF2ZSB0byBtYXRjaCB4ODYKICAqIHJvdW5kaW5nIGV4YWN0bHksIHRodXMgb3JkaW5hcnkgZmxvYXRzIGFyZW4ndCBwb3J0YWJsZSBlbm91Z2guCiAgKiBAcGFyYW0gZGVub20gZGVub21pbmF0b3IKLSAqIEByZXR1cm4gNTJiaXQgbWFudGlzc2EKKyAqIEByZXR1cm4gNTItYml0IG1hbnRpc3NhCiAgKiBAc2VlIHNvZnRmbG9hdF9tdWwKICAqLwogc3RhdGljIHVpbnQ2NF90IHNvZnRmbG9hdF9yZWNpcHJvY2FsKHVpbnQzMl90IGRlbm9tKQpAQCAtODAsOSArODAsOSBAQAogLyoqCiAgKiAodWludDMyX3QpKHgqZiksIHdoZXJlIGYgaGFzIHRoZSBnaXZlbiBtYW50aXNzYSwgYW5kIGV4cG9uZW50IDAKICAqIFVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBzb2Z0ZmxvYXRfcmVjaXByb2NhbCBjb21wdXRlcyB4Lyhkb3VibGUpZGVub20uCi0gKiBAcGFyYW0geCAzMmJpdCBpbnRlZ2VyIGZhY3RvcgorICogQHBhcmFtIHggMzItYml0IGludGVnZXIgZmFjdG9yCiAgKiBAcGFyYW0gbWFudGlzc2EgbWFudGlzc2Egb2YgZiB3aXRoIGV4cG9uZW50IDAKLSAqIEByZXR1cm4gMzJiaXQgaW50ZWdlciB2YWx1ZSAoeCpmKQorICogQHJldHVybiAzMi1iaXQgaW50ZWdlciB2YWx1ZSAoeCpmKQogICogQHNlZSBzb2Z0ZmxvYXRfcmVjaXByb2NhbAogICovCiBzdGF0aWMgdWludDMyX3Qgc29mdGZsb2F0X211bCh1aW50MzJfdCB4LCB1aW50NjRfdCBtYW50aXNzYSkKQEAgLTkxLDE0ICs5MSwxNCBAQAogICAgIHVpbnQ2NF90IGggPSB4ICogKG1hbnRpc3NhID4+IDMyKTsKICAgICBoICs9IGwgPj4gMzI7CiAgICAgbCAmPSAweGZmZmZmZmZmOwotICAgIGwgKz0gMSA8PCBhdl9sb2cyKGggPj4gMjEpOworICAgIGwgKz0gMUxMIDw8IGF2X2xvZzIoaCA+PiAyMSk7CiAgICAgaCArPSBsID4+IDMyOwogICAgIHJldHVybiBoID4+IDIwOwogfQogCiBzdGF0aWMgdWludDhfdCBsYWdfY2FsY196ZXJvX3J1bihpbnQ4X3QgeCkKIHsKLSAgICByZXR1cm4gKHggPDwgMSkgXiAoeCA+PiA3KTsKKyAgICByZXR1cm4gKHggKiAyKSBeICh4ID4+IDcpOwogfQogCiBzdGF0aWMgaW50IGxhZ19kZWNvZGVfcHJvYihHZXRCaXRDb250ZXh0ICpnYiwgdWludDMyX3QgKnZhbHVlKQpAQCAtMTkxLDcgKzE5MSw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBzY2FsZV9mYWN0b3IrKzsKLSAgICAgICAgY3VtdWxhdGl2ZV90YXJnZXQgPSAxIDw8IHNjYWxlX2ZhY3RvcjsKKyAgICAgICAgaWYgKHNjYWxlX2ZhY3RvciA+PSAzMlUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgY3VtdWxhdGl2ZV90YXJnZXQgPSAxVSA8PCBzY2FsZV9mYWN0b3I7CiAKICAgICAgICAgaWYgKHNjYWxlZF9jdW11bF9wcm9iID4gY3VtdWxhdGl2ZV90YXJnZXQpIHsKICAgICAgICAgICAgIGF2X2xvZyhyYWMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCkBAIC0yMzQsNyArMjM2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0X3RvcCkKIHsKICAgICAvKiBUaGlzIGlzIGFsbW9zdCBpZGVudGljYWwgdG8gYWRkX2hmeXVfbWVkaWFuX3ByZWQgaW4gaHVmZnl1dmRzcC5oLgotICAgICAqIEhvd2V2ZXIgdGhlICYweEZGIG9uIHRoZSBncmFkaWVudCBwcmVkaWN0b3IgeWVhbGRzIGluY29ycmVjdCBvdXRwdXQKKyAgICAgKiBIb3dldmVyIHRoZSAmMHhGRiBvbiB0aGUgZ3JhZGllbnQgcHJlZGljdG9yIHlpZWxkcyBpbmNvcnJlY3Qgb3V0cHV0CiAgICAgICogZm9yIGxhZ2FyaXRoLgogICAgICAqLwogICAgIGludCBpOwpAQCAtMjYwLDcgKzI2Miw3IEBACiAKICAgICBpZiAoIWxpbmUpIHsKICAgICAgICAgLyogTGVmdCBwcmVkaWN0aW9uIG9ubHkgZm9yIGZpcnN0IGxpbmUgKi8KLSAgICAgICAgTCA9IGwtPmhkc3AuYWRkX2hmeXVfbGVmdF9wcmVkKGJ1ZiwgYnVmLCB3aWR0aCwgMCk7CisgICAgICAgIEwgPSBsLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKGJ1ZiwgYnVmLCB3aWR0aCwgMCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogTGVmdCBwaXhlbCBpcyBhY3R1YWxseSBwcmV2X3Jvd1t3aWR0aF0gKi8KICAgICAgICAgTCA9IGJ1Zlt3aWR0aCAtIHN0cmlkZSAtIDFdOwpAQCAtMjg5LDcgKzI5MSw3IEBACiAgICAgICAgIEw9IGJ1ZlswXTsKICAgICAgICAgaWYgKGlzX2x1bWEpCiAgICAgICAgICAgICBidWZbMF0gPSAwOwotICAgICAgICBsLT5oZHNwLmFkZF9oZnl1X2xlZnRfcHJlZChidWYsIGJ1Ziwgd2lkdGgsIDApOworICAgICAgICBsLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKGJ1ZiwgYnVmLCB3aWR0aCwgMCk7CiAgICAgICAgIGlmIChpc19sdW1hKQogICAgICAgICAgICAgYnVmWzBdID0gTDsKICAgICAgICAgcmV0dXJuOwpAQCAtMzEyLDcgKzMxNCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgVEwgPSBidWZbd2lkdGggLSAoMiAqIHN0cmlkZSkgLSAxXTsKICAgICAgICAgTCAgPSBidWZbd2lkdGggLSBzdHJpZGUgLSAxXTsKLSAgICAgICAgbC0+aGRzcC5hZGRfaGZ5dV9tZWRpYW5fcHJlZChidWYsIGJ1ZiAtIHN0cmlkZSwgYnVmLCB3aWR0aCwgJkwsICZUTCk7CisgICAgICAgIGwtPmxsdmlkZHNwLmFkZF9tZWRpYW5fcHJlZChidWYsIGJ1ZiAtIHN0cmlkZSwgYnVmLCB3aWR0aCwgJkwsICZUTCk7CiAgICAgfQogfQogCkBAIC00NTMsMTAgKzQ1NSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgICAgIGZmX2xhZ19yYWNfaW5pdCgmcmFjLCAmZ2IsIGxlbmd0aCAtIHN0cmlkZSk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChyYWMub3ZlcnJlYWQgPiBNQVhfT1ZFUlJFQUQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICByZWFkICs9IGxhZ19kZWNvZGVfbGluZShsLCAmcmFjLCBkc3QgKyAoaSAqIHN0cmlkZSksIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBlc2NfY291bnQpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlYWQgPiBsZW5ndGgpCiAgICAgICAgICAgICBhdl9sb2cobC0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLApAQCAtNzI1LDExICs3MjksMjEgQEAKICAgICBMYWdhcml0aENvbnRleHQgKmwgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGwtPmF2Y3R4ID0gYXZjdHg7CiAKLSAgICBmZl9odWZmeXV2ZHNwX2luaXQoJmwtPmhkc3ApOworICAgIGZmX2xsdmlkZHNwX2luaXQoJmwtPmxsdmlkZHNwKTsKIAogICAgIHJldHVybiAwOwogfQogCisjaWYgSEFWRV9USFJFQURTCitzdGF0aWMgYXZfY29sZCBpbnQgbGFnX2RlY29kZV9pbml0X3RocmVhZF9jb3B5KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMYWdhcml0aENvbnRleHQgKmwgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGwtPmF2Y3R4ID0gYXZjdHg7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCiBzdGF0aWMgYXZfY29sZCBpbnQgbGFnX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIExhZ2FyaXRoQ29udGV4dCAqbCA9IGF2Y3R4LT5wcml2X2RhdGE7CkBAIC03NDYsNiArNzYwLDcgQEAKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9MQUdBUklUSCwKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTGFnYXJpdGhDb250ZXh0KSwKICAgICAuaW5pdCAgICAgICAgICAgPSBsYWdfZGVjb2RlX2luaXQsCisgICAgLmluaXRfdGhyZWFkX2NvcHkgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChsYWdfZGVjb2RlX2luaXRfdGhyZWFkX2NvcHkpLAogICAgIC5jbG9zZSAgICAgICAgICA9IGxhZ19kZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICA9IGxhZ19kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9sYWdhcml0aHJhYy5jIGIvbGliYXZjb2RlYy9sYWdhcml0aHJhYy5jCmluZGV4IDNkMzZkMWIuLmNkZGE2N2YgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGFnYXJpdGhyYWMuYworKysgYi9saWJhdmNvZGVjL2xhZ2FyaXRocmFjLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICAgICBsLT5yYW5nZSAgICAgICAgPSAweDgwOwogICAgIGwtPmxvdyAgICAgICAgICA9ICpsLT5ieXRlc3RyZWFtID4+IDE7CiAgICAgbC0+aGFzaF9zaGlmdCAgID0gRkZNQVgobC0+c2NhbGUsIDEwKSAtIDEwOworICAgIGwtPm92ZXJyZWFkICAgICA9IDA7CiAKICAgICBmb3IgKGkgPSBqID0gMDsgaSA8IDEwMjQ7IGkrKykgewogICAgICAgICB1bnNpZ25lZCByID0gaSA8PCBsLT5oYXNoX3NoaWZ0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9sYWdhcml0aHJhYy5oIGIvbGliYXZjb2RlYy9sYWdhcml0aHJhYy5oCmluZGV4IGRmZGZlYTAuLmVlODM2ZDAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGFnYXJpdGhyYWMuaAorKysgYi9saWJhdmNvZGVjL2xhZ2FyaXRocmFjLmgKQEAgLTQ3LDYgKzQ3LDkgQEAKICAgICBjb25zdCB1aW50OF90ICpieXRlc3RyZWFtOyAgICAgICAgLyoqPCBDdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IGJ5dGVzdHJlYW0uICovCiAgICAgY29uc3QgdWludDhfdCAqYnl0ZXN0cmVhbV9lbmQ7ICAgIC8qKjwgRW5kIHBvc2l0aW9uIG9mIGlucHV0IGJ5dGVzdHJlYW0uICovCiAKKyAgICBpbnQgb3ZlcnJlYWQ7CisjZGVmaW5lIE1BWF9PVkVSUkVBRCA0CisKICAgICB1aW50MzJfdCBwcm9iWzI1OF07ICAgICAgICAgLyoqPCBUYWJsZSBvZiBjdW11bGF0aXZlIHByb2JhYmlsaXR5IGZvciBlYWNoIHN5bWJvbC4gKi8KICAgICB1aW50OF90ICByYW5nZV9oYXNoWzEwMjRdOyAgIC8qKjwgSGFzaCB0YWJsZSBtYXBwaW5nIHVwcGVyIGJ5dGUgdG8gYXBwcm94aW1hdGUgc3ltYm9sLiAqLwogfSBsYWdfcmFjOwpAQCAtNjIsNiArNjUsOCBAQAogICAgICAgICBsLT5sb3cgfD0gMHhmZiAmIChBVl9SQjE2KGwtPmJ5dGVzdHJlYW0pID4+IDEpOwogICAgICAgICBpZiAobC0+Ynl0ZXN0cmVhbSA8IGwtPmJ5dGVzdHJlYW1fZW5kKQogICAgICAgICAgICAgbC0+Ynl0ZXN0cmVhbSsrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsLT5vdmVycmVhZCsrOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9sY2xkZWMuYyBiL2xpYmF2Y29kZWMvbGNsZGVjLmMKaW5kZXggYzA0ZWQ1ZS4uMTA0ZGVmYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9sY2xkZWMuYworKysgYi9saWJhdmNvZGVjL2xjbGRlYy5jCkBAIC0zNSw3ICszNSw2IEBACiAgKiAgIGh0dHA6Ly93d3cucGNpc3lzLm5ldC9+bWVsYW5zb24vY29kZWNzCiAgKgogICogU3VwcG9ydHM6IEJHUjI0IChSR0IgMjRicHApCi0gKgogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtNDcsMTQgKzQ2LDEyIEBACiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibGNsLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCiAKICNpZiBDT05GSUdfWkxJQl9ERUNPREVSCiAjaW5jbHVkZSA8emxpYi5oPgogI2VuZGlmCiAKLS8qCi0gKiBEZWNvZGVyIGNvbnRleHQKLSAqLwogdHlwZWRlZiBzdHJ1Y3QgTGNsRGVjQ29udGV4dCB7CiAgICAgLy8gSW1hZ2UgdHlwZQogICAgIGludCBpbWd0eXBlOwpAQCAtMTU4LDE0ICsxNTUsMTAgQEAKICNlbmRpZgogCiAKLS8qCi0gKgotICogRGVjb2RlIGEgZnJhbWUKLSAqCi0gKi8KIHN0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKIHsKICAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisgICAgVGhyZWFkRnJhbWUgdGZyYW1lID0geyAuZiA9IGRhdGEgfTsKICAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKICAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKICAgICBMY2xEZWNDb250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CkBAIC0xODIsNyArMTc1LDcgQEAKICAgICB1bnNpZ25lZCBpbnQgbGVuID0gYnVmX3NpemU7CiAgICAgaW50IGxpbmVzaXplOwogCi0gICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmdGZyYW1lLCAwKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgb3V0cHRyID0gZnJhbWUtPmRhdGFbMF07IC8vIE91dHB1dCBpbWFnZSBwb2ludGVyCkBAIC00NjcsMTcgKzQ2MCwxNSBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKKyAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMTsKKyAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisKICAgICAqZ290X2ZyYW1lID0gMTsKIAogICAgIC8qIGFsd2F5cyByZXBvcnQgdGhhdCB0aGUgYnVmZmVyIHdhcyBjb21wbGV0ZWx5IGNvbnN1bWVkICovCiAgICAgcmV0dXJuIGJ1Zl9zaXplOwogfQogCi0vKgotICoKLSAqIEluaXQgbGNsIGRlY29kZXIKLSAqCi0gKi8KIHN0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgTGNsRGVjQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOwpAQCAtNjMyLDExICs2MjMsMTMgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyoKLSAqCi0gKiBVbmluaXQgbGNsIGRlY29kZXIKLSAqCi0gKi8KKyNpZiBIQVZFX1RIUkVBRFMKK3N0YXRpYyBpbnQgaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgcmV0dXJuIGRlY29kZV9pbml0KGF2Y3R4KTsKK30KKyNlbmRpZgorCiBzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgTGNsRGVjQ29udGV4dCAqIGNvbnN0IGMgPSBhdmN0eC0+cHJpdl9kYXRhOwpAQCAtNjU4LDkgKzY1MSwxMSBAQAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01TWkgsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExjbERlY0NvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoaW5pdF90aHJlYWRfY29weSksCiAgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKICAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CiAjZW5kaWYKIApAQCAtNjcyLDggKzY2NywxMCBAQAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1pMSUIsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExjbERlY0NvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5pbml0X3RocmVhZF9jb3B5ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQoaW5pdF90aHJlYWRfY29weSksCiAgICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKICAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGNsZW5jLmMgYi9saWJhdmNvZGVjL2xjbGVuYy5jCmluZGV4IDFiMWUwOGIuLjM1NzMxM2QgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGNsZW5jLmMKKysrIGIvbGliYXZjb2RlYy9sY2xlbmMuYwpAQCAtMzUsNyArMzUsNiBAQAogICogICBodHRwOi8vd3d3LnBjaXN5cy5uZXQvfm1lbGFuc29uL2NvZGVjcwogICoKICAqIFN1cHBvcnRzOiBCR1IyNCAoUkdCIDI0YnBwKQotICoKICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTUwLDkgKzQ5LDYgQEAKIAogI2luY2x1ZGUgPHpsaWIuaD4KIAotLyoKLSAqIERlY29kZXIgY29udGV4dAotICovCiB0eXBlZGVmIHN0cnVjdCBMY2xFbmNDb250ZXh0IHsKIAogICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKQEAgLTY2LDExICs2Miw2IEBACiAgICAgel9zdHJlYW0genN0cmVhbTsKIH0gTGNsRW5jQ29udGV4dDsKIAotLyoKLSAqCi0gKiBFbmNvZGUgYSBmcmFtZQotICoKLSAqLwogc3RhdGljIGludCBlbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcCwgaW50ICpnb3RfcGFja2V0KQogewpAQCAtMTE3LDExICsxMDgsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0vKgotICoKLSAqIEluaXQgbGNsIGVuY29kZXIKLSAqCi0gKi8KIHN0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgTGNsRW5jQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CkBAIC0xNzEsMTEgKzE1Nyw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qCi0gKgotICogVW5pbml0IGxjbCBlbmNvZGVyCi0gKgotICovCiBzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgTGNsRW5jQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYmFvbWRlYy5jIGIvbGliYXZjb2RlYy9saWJhb21kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJkZTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9saWJhb21kZWMuYwpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFWMSBkZWNvZGVyIHN1cHBvcnQgdmlhIGxpYmFvbQorICovCisKKyNpbmNsdWRlIDxhb20vYW9tX2RlY29kZXIuaD4KKyNpbmNsdWRlIDxhb20vYW9tZHguaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInByb2ZpbGVzLmgiCisKK3R5cGVkZWYgc3RydWN0IEFWMURlY29kZUNvbnRleHQgeworICAgIHN0cnVjdCBhb21fY29kZWNfY3R4IGRlY29kZXI7Cit9IEFWMURlY29kZUNvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBhb21faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFvbV9jb2RlY19pZmFjZSAqaWZhY2UpCit7CisgICAgQVYxRGVjb2RlQ29udGV4dCAqY3R4ICAgICAgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGFvbV9jb2RlY19kZWNfY2ZnIGRlY2NmZyA9IHsKKyAgICAgICAgLyogdG9rZW4gcGFydGl0aW9ucysxIHdvdWxkIGJlIGEgZGVjZW50IGNob2ljZSAqLworICAgICAgICAudGhyZWFkcyA9IEZGTUlOKGF2Y3R4LT50aHJlYWRfY291bnQsIDE2KQorICAgIH07CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiJXNcbiIsIGFvbV9jb2RlY192ZXJzaW9uX3N0cigpKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiJXNcbiIsIGFvbV9jb2RlY19idWlsZF9jb25maWcoKSk7CisKKyAgICBpZiAoYW9tX2NvZGVjX2RlY19pbml0KCZjdHgtPmRlY29kZXIsIGlmYWNlLCAmZGVjY2ZnLCAwKSAhPSBBT01fQ09ERUNfT0spIHsKKyAgICAgICAgY29uc3QgY2hhciAqZXJyb3IgPSBhb21fY29kZWNfZXJyb3IoJmN0eC0+ZGVjb2Rlcik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGVjb2RlcjogJXNcbiIsCisgICAgICAgICAgICAgICBlcnJvcik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGltYWdlX2NvcHlfMTZfdG9fOChBVkZyYW1lICpwaWMsIHN0cnVjdCBhb21faW1hZ2UgKmltZykKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpYy0+Zm9ybWF0KTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgaW50IHcgPSBpbWctPmRfdzsKKyAgICAgICAgaW50IGggPSBpbWctPmRfaDsKKyAgICAgICAgaW50IHgsIHk7CisKKyAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgIHcgPSAodyArIGltZy0+eF9jaHJvbWFfc2hpZnQpID4+IGltZy0+eF9jaHJvbWFfc2hpZnQ7CisgICAgICAgICAgICBoID0gKGggKyBpbWctPnlfY2hyb21hX3NoaWZ0KSA+PiBpbWctPnlfY2hyb21hX3NoaWZ0OworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgdWludDE2X3QgKnNyYyA9ICh1aW50MTZfdCAqKShpbWctPnBsYW5lc1tpXSArIHkgKiBpbWctPnN0cmlkZVtpXSk7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBwaWMtPmRhdGFbaV0gKyB5ICogcGljLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICAgICAgKmRzdCsrID0gKnNyYysrOworICAgICAgICB9CisgICAgfQorfQorCisvLyByZXR1cm5zIDAgb24gc3VjY2VzcywgQVZFUlJPUl9JTlZBTElEREFUQSBvdGhlcndpc2UKK3N0YXRpYyBpbnQgc2V0X3BpeF9mbXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBzdHJ1Y3QgYW9tX2ltYWdlICppbWcpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZDb2xvclJhbmdlIGNvbG9yX3Jhbmdlc1tdID0geworICAgICAgICBBVkNPTF9SQU5HRV9NUEVHLCBBVkNPTF9SQU5HRV9KUEVHCisgICAgfTsKKyAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPSBjb2xvcl9yYW5nZXNbaW1nLT5yYW5nZV07CisgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IGltZy0+Y3A7CisgICAgYXZjdHgtPmNvbG9yc3BhY2UgID0gaW1nLT5tYzsKKyAgICBhdmN0eC0+Y29sb3JfdHJjICAgPSBpbWctPnRjOworCisgICAgc3dpdGNoIChpbWctPmZtdCkgeworICAgIGNhc2UgQU9NX0lNR19GTVRfSTQyMDoKKyAgICBjYXNlIEFPTV9JTUdfRk1UX0k0MjAxNjoKKyAgICAgICAgaWYgKGltZy0+Yml0X2RlcHRoID09IDgpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gaW1nLT5tb25vY2hyb21lID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCA6IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9BVjFfTUFJTjsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKGltZy0+Yml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IGltZy0+bW9ub2Nocm9tZSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfR1JBWTEwIDogQVZfUElYX0ZNVF9ZVVY0MjBQMTA7CisgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfQVYxX01BSU47CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmIChpbWctPmJpdF9kZXB0aCA9PSAxMikgeworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBpbWctPm1vbm9jaHJvbWUgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0dSQVkxMiA6IEFWX1BJWF9GTVRfWVVWNDIwUDEyOworICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0FWMV9QUk9GRVNTSU9OQUw7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgY2FzZSBBT01fSU1HX0ZNVF9JNDIyOgorICAgIGNhc2UgQU9NX0lNR19GTVRfSTQyMjE2OgorICAgICAgICBpZiAoaW1nLT5iaXRfZGVwdGggPT0gOCkgeworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfQVYxX1BST0ZFU1NJT05BTDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKGltZy0+Yml0X2RlcHRoID09IDEwKSB7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDEwOworICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0FWMV9QUk9GRVNTSU9OQUw7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmIChpbWctPmJpdF9kZXB0aCA9PSAxMikgeworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMjsKKyAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9BVjFfUFJPRkVTU0lPTkFMOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIGNhc2UgQU9NX0lNR19GTVRfSTQ0NDoKKyAgICBjYXNlIEFPTV9JTUdfRk1UX0k0NDQxNjoKKyAgICAgICAgaWYgKGltZy0+Yml0X2RlcHRoID09IDgpIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOworICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0FWMV9ISUdIOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSBpZiAoaW1nLT5iaXRfZGVwdGggPT0gMTApIHsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTA7CisgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfQVYxX0hJR0g7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSBlbHNlIGlmIChpbWctPmJpdF9kZXB0aCA9PSAxMikgeworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjsKKyAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9BVjFfUFJPRkVTU0lPTkFMOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorfQorCitzdGF0aWMgaW50IGFvbV9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgQVYxRGVjb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpwaWN0dXJlICAgICAgPSBkYXRhOworICAgIGNvbnN0IHZvaWQgKml0ZXIgICAgICA9IE5VTEw7CisgICAgc3RydWN0IGFvbV9pbWFnZSAqaW1nOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYW9tX2NvZGVjX2RlY29kZSgmY3R4LT5kZWNvZGVyLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUsIE5VTEwpICE9CisgICAgICAgIEFPTV9DT0RFQ19PSykgeworICAgICAgICBjb25zdCBjaGFyICplcnJvciAgPSBhb21fY29kZWNfZXJyb3IoJmN0eC0+ZGVjb2Rlcik7CisgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCA9IGFvbV9jb2RlY19lcnJvcl9kZXRhaWwoJmN0eC0+ZGVjb2Rlcik7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lOiAlc1xuIiwgZXJyb3IpOworICAgICAgICBpZiAoZGV0YWlsKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICIgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb246ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGRldGFpbCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgoaW1nID0gYW9tX2NvZGVjX2dldF9mcmFtZSgmY3R4LT5kZWNvZGVyLCAmaXRlcikpKSB7CisgICAgICAgIGlmIChpbWctPmRfdyA+IGltZy0+dyB8fCBpbWctPmRfaCA+IGltZy0+aCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEaXNwbGF5IGRpbWVuc2lvbnMgJWR4JWQgZXhjZWVkIHN0b3JhZ2UgJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgaW1nLT5kX3csIGltZy0+ZF9oLCBpbWctPncsIGltZy0+aCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocmV0ID0gc2V0X3BpeF9mbXQoYXZjdHgsIGltZykpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBvdXRwdXQgY29sb3JzcGFjZSAoJWQpIC8gYml0X2RlcHRoICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgaW1nLT5mbXQsIGltZy0+Yml0X2RlcHRoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGludClpbWctPmRfdyAhPSBhdmN0eC0+d2lkdGggfHwgKGludClpbWctPmRfaCAhPSBhdmN0eC0+aGVpZ2h0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiZGltZW5zaW9uIGNoYW5nZSEgJWR4JWQgLT4gJWR4JWRcbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBpbWctPmRfdywgaW1nLT5kX2gpOworICAgICAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIGltZy0+ZF93LCBpbWctPmRfaCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljdHVyZSwgMCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICgoaW1nLT5mbXQgJiBBT01fSU1HX0ZNVF9ISUdIQklUREVQVEgpICYmIGltZy0+Yml0X2RlcHRoID09IDgpCisgICAgICAgICAgICBpbWFnZV9jb3B5XzE2X3RvXzgocGljdHVyZSwgaW1nKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfaW1hZ2VfY29weShwaWN0dXJlLT5kYXRhLCBwaWN0dXJlLT5saW5lc2l6ZSwgKGNvbnN0IHVpbnQ4X3QgKiopaW1nLT5wbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+c3RyaWRlLCBhdmN0eC0+cGl4X2ZtdCwgaW1nLT5kX3csIGltZy0+ZF9oKTsKKyAgICAgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgfQorICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFvbV9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVjFEZWNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGFvbV9jb2RlY19kZXN0cm95KCZjdHgtPmRlY29kZXIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgYXYxX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHJldHVybiBhb21faW5pdChhdmN0eCwgJmFvbV9jb2RlY19hdjFfZHhfYWxnbyk7Cit9CisKK0FWQ29kZWMgZmZfbGliYW9tX2F2MV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJhb20tYXYxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGliYW9tIEFWMSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BVjEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFWMURlY29kZUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IGF2MV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9IGFvbV9mcmVlLAorICAgIC5kZWNvZGUgICAgICAgICA9IGFvbV9kZWNvZGUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0FVVE9fVEhSRUFEUyB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLnByb2ZpbGVzICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoZmZfYXYxX3Byb2ZpbGVzKSwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGliYW9tIiwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYmFvbWVuYy5jIGIvbGliYXZjb2RlYy9saWJhb21lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFiYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9saWJhb21lbmMuYwpAQCAtMCwwICsxLDczNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEFWMSBlbmNvZGVyIHN1cHBvcnQgdmlhIGxpYmFvbQorICovCisKKyNkZWZpbmUgQU9NX0RJU0FCTEVfQ1RSTF9UWVBFQ0hFQ0tTIDEKKyNpbmNsdWRlIDxhb20vYW9tX2VuY29kZXIuaD4KKyNpbmNsdWRlIDxhb20vYW9tY3guaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9iYXNlNjQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwcm9maWxlcy5oIgorCisvKgorICogUG9ydGlvbiBvZiBzdHJ1Y3QgYW9tX2NvZGVjX2N4X3BrdCBmcm9tIGFvbV9lbmNvZGVyLmguCisgKiBPbmUgZW5jb2RlZCBmcmFtZSByZXR1cm5lZCBmcm9tIHRoZSBsaWJyYXJ5LgorICovCitzdHJ1Y3QgRnJhbWVMaXN0RGF0YSB7CisgICAgdm9pZCAqYnVmOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBjb21wcmVzc2VkIGRhdGEgYnVmZmVyICovCisgICAgc2l6ZV90IHN6OyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBsZW5ndGggb2YgY29tcHJlc3NlZCBkYXRhICovCisgICAgaW50NjRfdCBwdHM7ICAgICAgICAgICAgICAgICAgICAgLyoqPCB0aW1lIHN0YW1wIHRvIHNob3cgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiB0aW1lYmFzZSB1bml0cykgKi8KKyAgICB1bnNpZ25lZCBsb25nIGR1cmF0aW9uOyAgICAgICAgICAvKio8IGR1cmF0aW9uIHRvIHNob3cgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbiB0aW1lYmFzZSB1bml0cykgKi8KKyAgICB1aW50MzJfdCBmbGFnczsgICAgICAgICAgICAgICAgICAvKio8IGZsYWdzIGZvciB0aGlzIGZyYW1lICovCisgICAgc3RydWN0IEZyYW1lTGlzdERhdGEgKm5leHQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBBT01FbmNvZGVyQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgc3RydWN0IGFvbV9jb2RlY19jdHggZW5jb2RlcjsKKyAgICBzdHJ1Y3QgYW9tX2ltYWdlIHJhd2ltZzsKKyAgICBzdHJ1Y3QgYW9tX2ZpeGVkX2J1ZiB0d29wYXNzX3N0YXRzOworICAgIHN0cnVjdCBGcmFtZUxpc3REYXRhICpjb2RlZF9mcmFtZV9saXN0OworICAgIGludCBjcHVfdXNlZDsKKyAgICBpbnQgYXV0b19hbHRfcmVmOworICAgIGludCBsYWdfaW5fZnJhbWVzOworICAgIGludCBlcnJvcl9yZXNpbGllbnQ7CisgICAgaW50IGNyZjsKKyAgICBpbnQgc3RhdGljX3RocmVzaDsKKyAgICBpbnQgZHJvcF90aHJlc2hvbGQ7CisgICAgaW50IG5vaXNlX3NlbnNpdGl2aXR5OworfSBBT01Db250ZXh0OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY3RsaWRzdHJbXSA9IHsKKyAgICBbQU9NRV9TRVRfQ1BVVVNFRF0gICAgICAgICAgPSAiQU9NRV9TRVRfQ1BVVVNFRCIsCisgICAgW0FPTUVfU0VUX0NRX0xFVkVMXSAgICAgICAgID0gIkFPTUVfU0VUX0NRX0xFVkVMIiwKKyAgICBbQU9NRV9TRVRfRU5BQkxFQVVUT0FMVFJFRl0gPSAiQU9NRV9TRVRfRU5BQkxFQVVUT0FMVFJFRiIsCisgICAgW0FPTUVfU0VUX1NUQVRJQ19USFJFU0hPTERdID0gIkFPTUVfU0VUX1NUQVRJQ19USFJFU0hPTEQiLAorICAgIFtBVjFFX1NFVF9DT0xPUl9SQU5HRV0gICAgICA9ICJBVjFFX1NFVF9DT0xPUl9SQU5HRSIsCisgICAgW0FWMUVfU0VUX0NPTE9SX1BSSU1BUklFU10gID0gIkFWMUVfU0VUX0NPTE9SX1BSSU1BUklFUyIsCisgICAgW0FWMUVfU0VUX01BVFJJWF9DT0VGRklDSUVOVFNdID0gIkFWMUVfU0VUX01BVFJJWF9DT0VGRklDSUVOVFMiLAorICAgIFtBVjFFX1NFVF9UUkFOU0ZFUl9DSEFSQUNURVJJU1RJQ1NdID0gIkFWMUVfU0VUX1RSQU5TRkVSX0NIQVJBQ1RFUklTVElDUyIsCit9OworCitzdGF0aWMgYXZfY29sZCB2b2lkIGxvZ19lbmNvZGVyX2Vycm9yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqZGVzYykKK3sKKyAgICBBT01Db250ZXh0ICpjdHggICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IGNoYXIgKmVycm9yICA9IGFvbV9jb2RlY19lcnJvcigmY3R4LT5lbmNvZGVyKTsKKyAgICBjb25zdCBjaGFyICpkZXRhaWwgPSBhb21fY29kZWNfZXJyb3JfZGV0YWlsKCZjdHgtPmVuY29kZXIpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICIlczogJXNcbiIsIGRlc2MsIGVycm9yKTsKKyAgICBpZiAoZGV0YWlsKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIiAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbjogJXNcbiIsIGRldGFpbCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZHVtcF9lbmNfY2ZnKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhb21fY29kZWNfZW5jX2NmZyAqY2ZnKQoreworICAgIGludCB3aWR0aCA9IC0zMDsKKyAgICBpbnQgbGV2ZWwgPSBBVl9MT0dfREVCVUc7CisKKyAgICBhdl9sb2coYXZjdHgsIGxldmVsLCAiYW9tX2NvZGVjX2VuY19jZmdcbiIpOworICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJnZW5lcmljIHNldHRpbmdzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAlKnMldVxuICAlKnMldVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICUqc3sldS8ldX1cbiAgJSpzJXVcbiAgJSpzJWRcbiAgJSpzJXVcbiIsCisgICAgICAgICAgIHdpZHRoLCAiZ191c2FnZToiLCAgICAgICAgICAgY2ZnLT5nX3VzYWdlLAorICAgICAgICAgICB3aWR0aCwgImdfdGhyZWFkczoiLCAgICAgICAgIGNmZy0+Z190aHJlYWRzLAorICAgICAgICAgICB3aWR0aCwgImdfcHJvZmlsZToiLCAgICAgICAgIGNmZy0+Z19wcm9maWxlLAorICAgICAgICAgICB3aWR0aCwgImdfdzoiLCAgICAgICAgICAgICAgIGNmZy0+Z193LAorICAgICAgICAgICB3aWR0aCwgImdfaDoiLCAgICAgICAgICAgICAgIGNmZy0+Z19oLAorICAgICAgICAgICB3aWR0aCwgImdfYml0X2RlcHRoOiIsICAgICAgIGNmZy0+Z19iaXRfZGVwdGgsCisgICAgICAgICAgIHdpZHRoLCAiZ19pbnB1dF9iaXRfZGVwdGg6IiwgY2ZnLT5nX2lucHV0X2JpdF9kZXB0aCwKKyAgICAgICAgICAgd2lkdGgsICJnX3RpbWViYXNlOiIsICAgICAgICBjZmctPmdfdGltZWJhc2UubnVtLCBjZmctPmdfdGltZWJhc2UuZGVuLAorICAgICAgICAgICB3aWR0aCwgImdfZXJyb3JfcmVzaWxpZW50OiIsIGNmZy0+Z19lcnJvcl9yZXNpbGllbnQsCisgICAgICAgICAgIHdpZHRoLCAiZ19wYXNzOiIsICAgICAgICAgICAgY2ZnLT5nX3Bhc3MsCisgICAgICAgICAgIHdpZHRoLCAiZ19sYWdfaW5fZnJhbWVzOiIsICAgY2ZnLT5nX2xhZ19pbl9mcmFtZXMpOworICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJyYXRlIGNvbnRyb2wgc2V0dGluZ3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAlKnMldVxuICAlKnMlZFxuICAlKnMlcCglIlNJWkVfU1BFQ0lGSUVSIilcbiAgJSpzJXVcbiIsCisgICAgICAgICAgIHdpZHRoLCAicmNfZHJvcGZyYW1lX3RocmVzaDoiLCBjZmctPnJjX2Ryb3BmcmFtZV90aHJlc2gsCisgICAgICAgICAgIHdpZHRoLCAicmNfZW5kX3VzYWdlOiIsICAgICAgICBjZmctPnJjX2VuZF91c2FnZSwKKyAgICAgICAgICAgd2lkdGgsICJyY190d29wYXNzX3N0YXRzX2luOiIsIGNmZy0+cmNfdHdvcGFzc19zdGF0c19pbi5idWYsIGNmZy0+cmNfdHdvcGFzc19zdGF0c19pbi5zeiwKKyAgICAgICAgICAgd2lkdGgsICJyY190YXJnZXRfYml0cmF0ZToiLCAgIGNmZy0+cmNfdGFyZ2V0X2JpdHJhdGUpOworICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJxdWFudGl6ZXIgc2V0dGluZ3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAlKnMldVxuICAlKnMldVxuIiwKKyAgICAgICAgICAgd2lkdGgsICJyY19taW5fcXVhbnRpemVyOiIsIGNmZy0+cmNfbWluX3F1YW50aXplciwKKyAgICAgICAgICAgd2lkdGgsICJyY19tYXhfcXVhbnRpemVyOiIsIGNmZy0+cmNfbWF4X3F1YW50aXplcik7CisgICAgYXZfbG9nKGF2Y3R4LCBsZXZlbCwgImJpdHJhdGUgdG9sZXJhbmNlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgJSpzJXVcbiAgJSpzJXVcbiIsCisgICAgICAgICAgIHdpZHRoLCAicmNfdW5kZXJzaG9vdF9wY3Q6IiwgY2ZnLT5yY191bmRlcnNob290X3BjdCwKKyAgICAgICAgICAgd2lkdGgsICJyY19vdmVyc2hvb3RfcGN0OiIsICBjZmctPnJjX292ZXJzaG9vdF9wY3QpOworICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJkZWNvZGVyIGJ1ZmZlciBtb2RlbFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICUqcyV1XG4gICUqcyV1XG4gICUqcyV1XG4iLAorICAgICAgICAgICB3aWR0aCwgInJjX2J1Zl9zejoiLCAgICAgICAgIGNmZy0+cmNfYnVmX3N6LAorICAgICAgICAgICB3aWR0aCwgInJjX2J1Zl9pbml0aWFsX3N6OiIsIGNmZy0+cmNfYnVmX2luaXRpYWxfc3osCisgICAgICAgICAgIHdpZHRoLCAicmNfYnVmX29wdGltYWxfc3o6IiwgY2ZnLT5yY19idWZfb3B0aW1hbF9zeik7CisgICAgYXZfbG9nKGF2Y3R4LCBsZXZlbCwgIjIgcGFzcyByYXRlIGNvbnRyb2wgc2V0dGluZ3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAlKnMldVxuICAlKnMldVxuICAlKnMldVxuIiwKKyAgICAgICAgICAgd2lkdGgsICJyY18ycGFzc192YnJfYmlhc19wY3Q6IiwgICAgICAgY2ZnLT5yY18ycGFzc192YnJfYmlhc19wY3QsCisgICAgICAgICAgIHdpZHRoLCAicmNfMnBhc3NfdmJyX21pbnNlY3Rpb25fcGN0OiIsIGNmZy0+cmNfMnBhc3NfdmJyX21pbnNlY3Rpb25fcGN0LAorICAgICAgICAgICB3aWR0aCwgInJjXzJwYXNzX3Zicl9tYXhzZWN0aW9uX3BjdDoiLCBjZmctPnJjXzJwYXNzX3Zicl9tYXhzZWN0aW9uX3BjdCk7CisgICAgYXZfbG9nKGF2Y3R4LCBsZXZlbCwgImtleWZyYW1pbmcgc2V0dGluZ3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAlKnMlZFxuICAlKnMldVxuICAlKnMldVxuIiwKKyAgICAgICAgICAgd2lkdGgsICJrZl9tb2RlOiIsICAgICBjZmctPmtmX21vZGUsCisgICAgICAgICAgIHdpZHRoLCAia2ZfbWluX2Rpc3Q6IiwgY2ZnLT5rZl9taW5fZGlzdCwKKyAgICAgICAgICAgd2lkdGgsICJrZl9tYXhfZGlzdDoiLCBjZmctPmtmX21heF9kaXN0KTsKKyAgICBhdl9sb2coYXZjdHgsIGxldmVsLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgY29kZWRfZnJhbWVfYWRkKHZvaWQgKmxpc3QsIHN0cnVjdCBGcmFtZUxpc3REYXRhICpjeF9mcmFtZSkKK3sKKyAgICBzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqKnAgPSBsaXN0OworCisgICAgd2hpbGUgKCpwKQorICAgICAgICBwID0gJigqcCktPm5leHQ7CisgICAgKnAgPSBjeF9mcmFtZTsKKyAgICBjeF9mcmFtZS0+bmV4dCA9IE5VTEw7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZnJlZV9jb2RlZF9mcmFtZShzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqY3hfZnJhbWUpCit7CisgICAgYXZfZnJlZXAoJmN4X2ZyYW1lLT5idWYpOworICAgIGF2X2ZyZWVwKCZjeF9mcmFtZSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgZnJlZV9mcmFtZV9saXN0KHN0cnVjdCBGcmFtZUxpc3REYXRhICpsaXN0KQoreworICAgIHN0cnVjdCBGcmFtZUxpc3REYXRhICpwID0gbGlzdDsKKworICAgIHdoaWxlIChwKSB7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICBmcmVlX2NvZGVkX2ZyYW1lKHApOworICAgICAgICBwID0gbGlzdDsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjb2RlY2N0bF9pbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGFvbWVfZW5jX2NvbnRyb2xfaWQgaWQsIGludCB2YWwpCit7CisgICAgQU9NQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjaGFyIGJ1Zls4MF07CisgICAgaW50IHdpZHRoID0gLTMwOworICAgIGludCByZXM7CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXM6IiwgY3RsaWRzdHJbaWRdKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAgJSpzJWRcbiIsIHdpZHRoLCBidWYsIHZhbCk7CisKKyAgICByZXMgPSBhb21fY29kZWNfY29udHJvbCgmY3R4LT5lbmNvZGVyLCBpZCwgdmFsKTsKKyAgICBpZiAocmVzICE9IEFPTV9DT0RFQ19PSykgeworICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiRmFpbGVkIHRvIHNldCAlcyBjb2RlYyBjb250cm9sIiwKKyAgICAgICAgICAgICAgICAgY3RsaWRzdHJbaWRdKTsKKyAgICAgICAgbG9nX2VuY29kZXJfZXJyb3IoYXZjdHgsIGJ1Zik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhb21fZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgQU9NQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGFvbV9jb2RlY19kZXN0cm95KCZjdHgtPmVuY29kZXIpOworICAgIGF2X2ZyZWVwKCZjdHgtPnR3b3Bhc3Nfc3RhdHMuYnVmKTsKKyAgICBhdl9mcmVlcCgmYXZjdHgtPnN0YXRzX291dCk7CisgICAgZnJlZV9mcmFtZV9saXN0KGN0eC0+Y29kZWRfZnJhbWVfbGlzdCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3BpeF9mbXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBhb21fY29kZWNfY2Fwc190IGNvZGVjX2NhcHMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhb21fY29kZWNfZW5jX2NmZyAqZW5jY2ZnLCBhb21fY29kZWNfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGFvbV9pbWdfZm10X3QgKmltZ19mbXQpCit7CisgICAgQU9NQ29udGV4dCBhdl91bnVzZWQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZW5jY2ZnLT5nX2JpdF9kZXB0aCA9IGVuY2NmZy0+Z19pbnB1dF9iaXRfZGVwdGggPSA4OworICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICAgICAgZW5jY2ZnLT5nX3Byb2ZpbGUgPSBGRl9QUk9GSUxFX0FWMV9NQUlOOworICAgICAgICAqaW1nX2ZtdCA9IEFPTV9JTUdfRk1UX0k0MjA7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOgorICAgICAgICBlbmNjZmctPmdfcHJvZmlsZSA9IEZGX1BST0ZJTEVfQVYxX1BST0ZFU1NJT05BTDsKKyAgICAgICAgKmltZ19mbXQgPSBBT01fSU1HX0ZNVF9JNDIyOworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICAgICAgZW5jY2ZnLT5nX3Byb2ZpbGUgPSBGRl9QUk9GSUxFX0FWMV9ISUdIOworICAgICAgICAqaW1nX2ZtdCA9IEFPTV9JTUdfRk1UX0k0NDQ7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMjoKKyAgICAgICAgaWYgKGNvZGVjX2NhcHMgJiBBT01fQ09ERUNfQ0FQX0hJR0hCSVRERVBUSCkgeworICAgICAgICAgICAgZW5jY2ZnLT5nX2JpdF9kZXB0aCA9IGVuY2NmZy0+Z19pbnB1dF9iaXRfZGVwdGggPQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUDEwID8gMTAgOiAxMjsKKyAgICAgICAgICAgIGVuY2NmZy0+Z19wcm9maWxlID0KKyAgICAgICAgICAgICAgICBlbmNjZmctPmdfYml0X2RlcHRoID09IDEwID8gRkZfUFJPRklMRV9BVjFfTUFJTiA6IEZGX1BST0ZJTEVfQVYxX1BST0ZFU1NJT05BTDsKKyAgICAgICAgICAgICppbWdfZm10ID0gQU9NX0lNR19GTVRfSTQyMDE2OworICAgICAgICAgICAgKmZsYWdzIHw9IEFPTV9DT0RFQ19VU0VfSElHSEJJVERFUFRIOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyOgorICAgICAgICBpZiAoY29kZWNfY2FwcyAmIEFPTV9DT0RFQ19DQVBfSElHSEJJVERFUFRIKSB7CisgICAgICAgICAgICBlbmNjZmctPmdfYml0X2RlcHRoID0gZW5jY2ZnLT5nX2lucHV0X2JpdF9kZXB0aCA9CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQMTAgPyAxMCA6IDEyOworICAgICAgICAgICAgZW5jY2ZnLT5nX3Byb2ZpbGUgPSBGRl9QUk9GSUxFX0FWMV9QUk9GRVNTSU9OQUw7CisgICAgICAgICAgICAqaW1nX2ZtdCA9IEFPTV9JTUdfRk1UX0k0MjIxNjsKKyAgICAgICAgICAgICpmbGFncyB8PSBBT01fQ09ERUNfVVNFX0hJR0hCSVRERVBUSDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjoKKyAgICAgICAgaWYgKGNvZGVjX2NhcHMgJiBBT01fQ09ERUNfQ0FQX0hJR0hCSVRERVBUSCkgeworICAgICAgICAgICAgZW5jY2ZnLT5nX2JpdF9kZXB0aCA9IGVuY2NmZy0+Z19pbnB1dF9iaXRfZGVwdGggPQorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UDEwID8gMTAgOiAxMjsKKyAgICAgICAgICAgIGVuY2NmZy0+Z19wcm9maWxlID0KKyAgICAgICAgICAgICAgICBlbmNjZmctPmdfYml0X2RlcHRoID09IDEwID8gRkZfUFJPRklMRV9BVjFfSElHSCA6IEZGX1BST0ZJTEVfQVYxX1BST0ZFU1NJT05BTDsKKyAgICAgICAgICAgICppbWdfZm10ID0gQU9NX0lNR19GTVRfSTQ0NDE2OworICAgICAgICAgICAgKmZsYWdzIHw9IEFPTV9DT0RFQ19VU0VfSElHSEJJVERFUFRIOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0LlxuIik7CisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9jb2xvcl9yYW5nZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgZW51bSBhb21fY29sb3JfcmFuZ2UgYW9tX2NyOworICAgIHN3aXRjaCAoYXZjdHgtPmNvbG9yX3JhbmdlKSB7CisgICAgY2FzZSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRDoKKyAgICBjYXNlIEFWQ09MX1JBTkdFX01QRUc6ICAgICAgIGFvbV9jciA9IEFPTV9DUl9TVFVESU9fUkFOR0U7IGJyZWFrOworICAgIGNhc2UgQVZDT0xfUkFOR0VfSlBFRzogICAgICAgYW9tX2NyID0gQU9NX0NSX0ZVTExfUkFOR0U7ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIGNvbG9yIHJhbmdlICglZClcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBBVjFFX1NFVF9DT0xPUl9SQU5HRSwgYW9tX2NyKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGFvbV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYW9tX2NvZGVjX2lmYWNlICppZmFjZSkKK3sKKyAgICBBT01Db250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBhb21fY29kZWNfZW5jX2NmZyBlbmNjZmcgPSB7IDAgfTsKKyAgICBhb21fY29kZWNfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgQVZDUEJQcm9wZXJ0aWVzICpjcGJfcHJvcHM7CisgICAgaW50IHJlczsKKyAgICBhb21faW1nX2ZtdF90IGltZ19mbXQ7CisgICAgYW9tX2NvZGVjX2NhcHNfdCBjb2RlY19jYXBzID0gYW9tX2NvZGVjX2dldF9jYXBzKGlmYWNlKTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIlc1xuIiwgYW9tX2NvZGVjX3ZlcnNpb25fc3RyKCkpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICIlc1xuIiwgYW9tX2NvZGVjX2J1aWxkX2NvbmZpZygpKTsKKworICAgIGlmICgocmVzID0gYW9tX2NvZGVjX2VuY19jb25maWdfZGVmYXVsdChpZmFjZSwgJmVuY2NmZywgMCkpICE9IEFPTV9DT0RFQ19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgY29uZmlnOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGFvbV9jb2RlY19lcnJfdG9fc3RyaW5nKHJlcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChzZXRfcGl4X2ZtdChhdmN0eCwgY29kZWNfY2FwcywgJmVuY2NmZywgJmZsYWdzLCAmaW1nX2ZtdCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZighYXZjdHgtPmJpdF9yYXRlKQorICAgICAgICBpZihhdmN0eC0+cmNfbWF4X3JhdGUgfHwgYXZjdHgtPnJjX2J1ZmZlcl9zaXplIHx8IGF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kpIHsKKyAgICAgICAgICAgIGF2X2xvZyggYXZjdHgsIEFWX0xPR19FUlJPUiwgIlJhdGUgY29udHJvbCBwYXJhbWV0ZXJzIHNldCB3aXRob3V0IGEgYml0cmF0ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICBkdW1wX2VuY19jZmcoYXZjdHgsICZlbmNjZmcpOworCisgICAgZW5jY2ZnLmdfdyAgICAgICAgICAgID0gYXZjdHgtPndpZHRoOworICAgIGVuY2NmZy5nX2ggICAgICAgICAgICA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgZW5jY2ZnLmdfdGltZWJhc2UubnVtID0gYXZjdHgtPnRpbWVfYmFzZS5udW07CisgICAgZW5jY2ZnLmdfdGltZWJhc2UuZGVuID0gYXZjdHgtPnRpbWVfYmFzZS5kZW47CisgICAgZW5jY2ZnLmdfdGhyZWFkcyAgICAgID0gYXZjdHgtPnRocmVhZF9jb3VudDsKKworICAgIGlmIChjdHgtPmxhZ19pbl9mcmFtZXMgPj0gMCkKKyAgICAgICAgZW5jY2ZnLmdfbGFnX2luX2ZyYW1lcyA9IGN0eC0+bGFnX2luX2ZyYW1lczsKKworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MxKQorICAgICAgICBlbmNjZmcuZ19wYXNzID0gQU9NX1JDX0ZJUlNUX1BBU1M7CisgICAgZWxzZSBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QQVNTMikKKyAgICAgICAgZW5jY2ZnLmdfcGFzcyA9IEFPTV9SQ19MQVNUX1BBU1M7CisgICAgZWxzZQorICAgICAgICBlbmNjZmcuZ19wYXNzID0gQU9NX1JDX09ORV9QQVNTOworCisgICAgaWYgKGF2Y3R4LT5yY19taW5fcmF0ZSA9PSBhdmN0eC0+cmNfbWF4X3JhdGUgJiYKKyAgICAgICAgYXZjdHgtPnJjX21pbl9yYXRlID09IGF2Y3R4LT5iaXRfcmF0ZSAmJiBhdmN0eC0+Yml0X3JhdGUpIHsKKyAgICAgICAgZW5jY2ZnLnJjX2VuZF91c2FnZSA9IEFPTV9DQlI7CisgICAgfSBlbHNlIGlmIChjdHgtPmNyZiA+PSAwKSB7CisgICAgICAgIGVuY2NmZy5yY19lbmRfdXNhZ2UgPSBBT01fQ1E7CisgICAgICAgIGlmICghYXZjdHgtPmJpdF9yYXRlKQorICAgICAgICAgICAgZW5jY2ZnLnJjX2VuZF91c2FnZSA9IEFPTV9ROworICAgIH0KKworICAgIGlmIChhdmN0eC0+Yml0X3JhdGUpIHsKKyAgICAgICAgZW5jY2ZnLnJjX3RhcmdldF9iaXRyYXRlID0gYXZfcmVzY2FsZV9ybmQoYXZjdHgtPmJpdF9yYXRlLCAxLCAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9ORUFSX0lORik7CisgICAgfSBlbHNlIGlmIChlbmNjZmcucmNfZW5kX3VzYWdlICE9IEFPTV9RKSB7CisgICAgICAgIGlmIChlbmNjZmcucmNfZW5kX3VzYWdlID09IEFPTV9DUSkgeworICAgICAgICAgICAgZW5jY2ZnLnJjX3RhcmdldF9iaXRyYXRlID0gMTAwMDAwMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGVuY2NmZy5yY190YXJnZXRfYml0cmF0ZSAqIDEwMDA7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJOZWl0aGVyIGJpdHJhdGUgbm9yIGNvbnN0cmFpbmVkIHF1YWxpdHkgc3BlY2lmaWVkLCB1c2luZyBkZWZhdWx0IGJpdHJhdGUgb2YgJWRrYml0L3NlY1xuIiwKKyAgICAgICAgICAgICAgICAgICBlbmNjZmcucmNfdGFyZ2V0X2JpdHJhdGUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5xbWluID49IDApCisgICAgICAgIGVuY2NmZy5yY19taW5fcXVhbnRpemVyID0gYXZjdHgtPnFtaW47CisgICAgaWYgKGF2Y3R4LT5xbWF4ID49IDApCisgICAgICAgIGVuY2NmZy5yY19tYXhfcXVhbnRpemVyID0gYXZjdHgtPnFtYXg7CisKKyAgICBpZiAoZW5jY2ZnLnJjX2VuZF91c2FnZSA9PSBBT01fQ1EgfHwgZW5jY2ZnLnJjX2VuZF91c2FnZSA9PSBBT01fUSkgeworICAgICAgICBpZiAoY3R4LT5jcmYgPCBlbmNjZmcucmNfbWluX3F1YW50aXplciB8fCBjdHgtPmNyZiA+IGVuY2NmZy5yY19tYXhfcXVhbnRpemVyKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ1EgbGV2ZWwgJWQgbXVzdCBiZSBiZXR3ZWVuIG1pbmltdW0gYW5kIG1heGltdW0gcXVhbnRpemVyIHZhbHVlICglZC0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgY3R4LT5jcmYsIGVuY2NmZy5yY19taW5fcXVhbnRpemVyLCBlbmNjZmcucmNfbWF4X3F1YW50aXplcik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgZW5jY2ZnLnJjX2Ryb3BmcmFtZV90aHJlc2ggPSBjdHgtPmRyb3BfdGhyZXNob2xkOworCisgICAgLy8gMC0xMDAgKDAgPT4gQ0JSLCAxMDAgPT4gVkJSKQorICAgIGVuY2NmZy5yY18ycGFzc192YnJfYmlhc19wY3QgICAgICAgPSByb3VuZChhdmN0eC0+cWNvbXByZXNzICogMTAwKTsKKyAgICBpZiAoYXZjdHgtPmJpdF9yYXRlKQorICAgICAgICBlbmNjZmcucmNfMnBhc3NfdmJyX21pbnNlY3Rpb25fcGN0ID0KKyAgICAgICAgICAgIGF2Y3R4LT5yY19taW5fcmF0ZSAqIDEwMExMIC8gYXZjdHgtPmJpdF9yYXRlOworICAgIGlmIChhdmN0eC0+cmNfbWF4X3JhdGUpCisgICAgICAgIGVuY2NmZy5yY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3QgPQorICAgICAgICAgICAgYXZjdHgtPnJjX21heF9yYXRlICogMTAwTEwgLyBhdmN0eC0+Yml0X3JhdGU7CisKKyAgICBpZiAoYXZjdHgtPnJjX2J1ZmZlcl9zaXplKQorICAgICAgICBlbmNjZmcucmNfYnVmX3N6ID0KKyAgICAgICAgICAgIGF2Y3R4LT5yY19idWZmZXJfc2l6ZSAqIDEwMDBMTCAvIGF2Y3R4LT5iaXRfcmF0ZTsKKyAgICBpZiAoYXZjdHgtPnJjX2luaXRpYWxfYnVmZmVyX29jY3VwYW5jeSkKKyAgICAgICAgZW5jY2ZnLnJjX2J1Zl9pbml0aWFsX3N6ID0KKyAgICAgICAgICAgIGF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kgKiAxMDAwTEwgLyBhdmN0eC0+Yml0X3JhdGU7CisgICAgZW5jY2ZnLnJjX2J1Zl9vcHRpbWFsX3N6ID0gZW5jY2ZnLnJjX2J1Zl9zeiAqIDUgLyA2OworCisgICAgLy8gX2VuY19pbml0KCkgd2lsbCBiYWxrIGlmIGtmX21pbl9kaXN0IGRpZmZlcnMgZnJvbSBtYXggdy9BT01fS0ZfQVVUTworICAgIGlmIChhdmN0eC0+a2V5aW50X21pbiA+PSAwICYmIGF2Y3R4LT5rZXlpbnRfbWluID09IGF2Y3R4LT5nb3Bfc2l6ZSkKKyAgICAgICAgZW5jY2ZnLmtmX21pbl9kaXN0ID0gYXZjdHgtPmtleWludF9taW47CisgICAgaWYgKGF2Y3R4LT5nb3Bfc2l6ZSA+PSAwKQorICAgICAgICBlbmNjZmcua2ZfbWF4X2Rpc3QgPSBhdmN0eC0+Z29wX3NpemU7CisKKyAgICBpZiAoZW5jY2ZnLmdfcGFzcyA9PSBBT01fUkNfRklSU1RfUEFTUykKKyAgICAgICAgZW5jY2ZnLmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgZWxzZSBpZiAoZW5jY2ZnLmdfcGFzcyA9PSBBT01fUkNfTEFTVF9QQVNTKSB7CisgICAgICAgIGludCBkZWNvZGVfc2l6ZSwgcmV0OworCisgICAgICAgIGlmICghYXZjdHgtPnN0YXRzX2luKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIHN0YXRzIGZpbGUgZm9yIHNlY29uZCBwYXNzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgY3R4LT50d29wYXNzX3N0YXRzLnN6ID0gc3RybGVuKGF2Y3R4LT5zdGF0c19pbikgKiAzIC8gNDsKKyAgICAgICAgcmV0ICAgICAgICAgICAgICAgICAgID0gYXZfcmVhbGxvY3AoJmN0eC0+dHdvcGFzc19zdGF0cy5idWYsIGN0eC0+dHdvcGFzc19zdGF0cy5zeik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiU3RhdCBidWZmZXIgYWxsb2MgKCUiU0laRV9TUEVDSUZJRVIiIGJ5dGVzKSBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgY3R4LT50d29wYXNzX3N0YXRzLnN6KTsKKyAgICAgICAgICAgIGN0eC0+dHdvcGFzc19zdGF0cy5zeiA9IDA7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGRlY29kZV9zaXplID0gYXZfYmFzZTY0X2RlY29kZShjdHgtPnR3b3Bhc3Nfc3RhdHMuYnVmLCBhdmN0eC0+c3RhdHNfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnR3b3Bhc3Nfc3RhdHMuc3opOworICAgICAgICBpZiAoZGVjb2RlX3NpemUgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN0YXQgYnVmZmVyIGRlY29kZSBmYWlsZWRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnR3b3Bhc3Nfc3RhdHMuc3ogICAgICA9IGRlY29kZV9zaXplOworICAgICAgICBlbmNjZmcucmNfdHdvcGFzc19zdGF0c19pbiA9IGN0eC0+dHdvcGFzc19zdGF0czsKKyAgICB9CisKKyAgICAvKiAwLTM6IEZvciBub24temVybyB2YWx1ZXMgdGhlIGVuY29kZXIgaW5jcmVhc2luZ2x5IG9wdGltaXplcyBmb3IgcmVkdWNlZAorICAgICAqIGNvbXBsZXhpdHkgcGxheWJhY2sgb24gbG93IHBvd2VyZWQgZGV2aWNlcyBhdCB0aGUgZXhwZW5zZSBvZiBlbmNvZGUKKyAgICAgKiBxdWFsaXR5LiAqLworICAgIGlmIChhdmN0eC0+cHJvZmlsZSAhPSBGRl9QUk9GSUxFX1VOS05PV04pCisgICAgICAgIGVuY2NmZy5nX3Byb2ZpbGUgPSBhdmN0eC0+cHJvZmlsZTsKKworICAgIGVuY2NmZy5nX2Vycm9yX3Jlc2lsaWVudCA9IGN0eC0+ZXJyb3JfcmVzaWxpZW50OworCisgICAgZHVtcF9lbmNfY2ZnKGF2Y3R4LCAmZW5jY2ZnKTsKKyAgICAvKiBDb25zdHJ1Y3QgRW5jb2RlciBDb250ZXh0ICovCisgICAgcmVzID0gYW9tX2NvZGVjX2VuY19pbml0KCZjdHgtPmVuY29kZXIsIGlmYWNlLCAmZW5jY2ZnLCBmbGFncyk7CisgICAgaWYgKHJlcyAhPSBBT01fQ09ERUNfT0spIHsKKyAgICAgICAgbG9nX2VuY29kZXJfZXJyb3IoYXZjdHgsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8gY29kZWMgY29udHJvbCBmYWlsdXJlcyBhcmUgY3VycmVudGx5IHRyZWF0ZWQgb25seSBhcyB3YXJuaW5ncworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiYW9tX2NvZGVjX2NvbnRyb2xcbiIpOworICAgIGNvZGVjY3RsX2ludChhdmN0eCwgQU9NRV9TRVRfQ1BVVVNFRCwgY3R4LT5jcHVfdXNlZCk7CisgICAgaWYgKGN0eC0+YXV0b19hbHRfcmVmID49IDApCisgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgQU9NRV9TRVRfRU5BQkxFQVVUT0FMVFJFRiwgY3R4LT5hdXRvX2FsdF9yZWYpOworCisgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBBT01FX1NFVF9TVEFUSUNfVEhSRVNIT0xELCBjdHgtPnN0YXRpY190aHJlc2gpOworICAgIGlmIChjdHgtPmNyZiA+PSAwKQorICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIEFPTUVfU0VUX0NRX0xFVkVMLCAgICAgICAgICBjdHgtPmNyZik7CisKKyAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIEFWMUVfU0VUX0NPTE9SX1BSSU1BUklFUywgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyk7CisgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBBVjFFX1NFVF9NQVRSSVhfQ09FRkZJQ0lFTlRTLCBhdmN0eC0+Y29sb3JzcGFjZSk7CisgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBBVjFFX1NFVF9UUkFOU0ZFUl9DSEFSQUNURVJJU1RJQ1MsIGF2Y3R4LT5jb2xvcl90cmMpOworICAgIHNldF9jb2xvcl9yYW5nZShhdmN0eCk7CisKKyAgICAvLyBwcm92aWRlIGR1bW15IHZhbHVlIHRvIGluaXRpYWxpemUgd3JhcHBlciwgdmFsdWVzIHdpbGwgYmUgdXBkYXRlZCBlYWNoIF9lbmNvZGUoKQorICAgIGFvbV9pbWdfd3JhcCgmY3R4LT5yYXdpbWcsIGltZ19mbXQsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMSwKKyAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKTEpOworCisgICAgaWYgKGNvZGVjX2NhcHMgJiBBT01fQ09ERUNfQ0FQX0hJR0hCSVRERVBUSCkKKyAgICAgICAgY3R4LT5yYXdpbWcuYml0X2RlcHRoID0gZW5jY2ZnLmdfYml0X2RlcHRoOworCisgICAgY3BiX3Byb3BzID0gZmZfYWRkX2NwYl9zaWRlX2RhdGEoYXZjdHgpOworICAgIGlmICghY3BiX3Byb3BzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGVuY2NmZy5yY19lbmRfdXNhZ2UgPT0gQU9NX0NCUiB8fAorICAgICAgICBlbmNjZmcuZ19wYXNzICE9IEFPTV9SQ19PTkVfUEFTUykgeworICAgICAgICBjcGJfcHJvcHMtPm1heF9iaXRyYXRlID0gYXZjdHgtPnJjX21heF9yYXRlOworICAgICAgICBjcGJfcHJvcHMtPm1pbl9iaXRyYXRlID0gYXZjdHgtPnJjX21pbl9yYXRlOworICAgICAgICBjcGJfcHJvcHMtPmF2Z19iaXRyYXRlID0gYXZjdHgtPmJpdF9yYXRlOworICAgIH0KKyAgICBjcGJfcHJvcHMtPmJ1ZmZlcl9zaXplID0gYXZjdHgtPnJjX2J1ZmZlcl9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjeF9wa3RjcHkoc3RydWN0IEZyYW1lTGlzdERhdGEgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFvbV9jb2RlY19jeF9wa3QgKnNyYykKK3sKKyAgICBkc3QtPnB0cyAgICAgID0gc3JjLT5kYXRhLmZyYW1lLnB0czsKKyAgICBkc3QtPmR1cmF0aW9uID0gc3JjLT5kYXRhLmZyYW1lLmR1cmF0aW9uOworICAgIGRzdC0+ZmxhZ3MgICAgPSBzcmMtPmRhdGEuZnJhbWUuZmxhZ3M7CisgICAgZHN0LT5zeiAgICAgICA9IHNyYy0+ZGF0YS5mcmFtZS5zejsKKyAgICBkc3QtPmJ1ZiAgICAgID0gc3JjLT5kYXRhLmZyYW1lLmJ1ZjsKK30KKworLyoqCisgKiBTdG9yZSBjb2RlZCBmcmFtZSBpbmZvcm1hdGlvbiBpbiBmb3JtYXQgc3VpdGFibGUgZm9yIHJldHVybiBmcm9tIGVuY29kZTIoKS4KKyAqCisgKiBXcml0ZSBpbmZvcm1hdGlvbiBmcm9tIEBhIGN4X2ZyYW1lIHRvIEBhIHBrdAorICogQHJldHVybiBwYWNrZXQgZGF0YSBzaXplIG9uIHN1Y2Nlc3MKKyAqIEByZXR1cm4gYSBuZWdhdGl2ZSBBVkVSUk9SIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc3RvcmVmcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHN0cnVjdCBGcmFtZUxpc3REYXRhICpjeF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQoreworICAgIGludCByZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIGN4X2ZyYW1lLT5zeiwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRXJyb3IgZ2V0dGluZyBvdXRwdXQgcGFja2V0IG9mIHNpemUgJSJTSVpFX1NQRUNJRklFUiIuXG4iLCBjeF9mcmFtZS0+c3opOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtZW1jcHkocGt0LT5kYXRhLCBjeF9mcmFtZS0+YnVmLCBwa3QtPnNpemUpOworICAgIHBrdC0+cHRzID0gcGt0LT5kdHMgPSBjeF9mcmFtZS0+cHRzOworCisgICAgaWYgKCEhKGN4X2ZyYW1lLT5mbGFncyAmIEFPTV9GUkFNRV9JU19LRVkpKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICByZXR1cm4gcGt0LT5zaXplOworfQorCisvKioKKyAqIFF1ZXVlIG11bHRpcGxlIG91dHB1dCBmcmFtZXMgZnJvbSB0aGUgZW5jb2RlciwgcmV0dXJuaW5nIHRoZSBmcm9udC1tb3N0LgorICogSW4gY2FzZXMgd2hlcmUgYW9tX2NvZGVjX2dldF9jeF9kYXRhKCkgcmV0dXJucyBtb3JlIHRoYW4gMSBmcmFtZSBhcHBlbmQKKyAqIHRoZSBmcmFtZSBxdWV1ZS4gUmV0dXJuIHRoZSBoZWFkIGZyYW1lIGlmIGF2YWlsYWJsZS4KKyAqIEByZXR1cm4gU3RvcmVkIGZyYW1lIHNpemUKKyAqIEByZXR1cm4gQVZFUlJPUihFSU5WQUwpIG9uIG91dHB1dCBzaXplIGVycm9yCisgKiBAcmV0dXJuIEFWRVJST1IoRU5PTUVNKSBvbiBjb2RlZCBmcmFtZSBxdWV1ZSBkYXRhIGFsbG9jYXRpb24gZXJyb3IKKyAqLworc3RhdGljIGludCBxdWV1ZV9mcmFtZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0X291dCkKK3sKKyAgICBBT01Db250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IHN0cnVjdCBhb21fY29kZWNfY3hfcGt0ICpwa3Q7CisgICAgY29uc3Qgdm9pZCAqaXRlciA9IE5VTEw7CisgICAgaW50IHNpemUgPSAwOworCisgICAgaWYgKGN0eC0+Y29kZWRfZnJhbWVfbGlzdCkgeworICAgICAgICBzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqY3hfZnJhbWUgPSBjdHgtPmNvZGVkX2ZyYW1lX2xpc3Q7CisgICAgICAgIC8qIHJldHVybiB0aGUgbGVhZGluZyBmcmFtZSBpZiB3ZSd2ZSBhbHJlYWR5IGJlZ3VuIHF1ZXVlaW5nICovCisgICAgICAgIHNpemUgPSBzdG9yZWZyYW1lKGF2Y3R4LCBjeF9mcmFtZSwgcGt0X291dCk7CisgICAgICAgIGlmIChzaXplIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICBjdHgtPmNvZGVkX2ZyYW1lX2xpc3QgPSBjeF9mcmFtZS0+bmV4dDsKKyAgICAgICAgZnJlZV9jb2RlZF9mcmFtZShjeF9mcmFtZSk7CisgICAgfQorCisgICAgLyogY29uc3VtZSBhbGwgYXZhaWxhYmxlIG91dHB1dCBmcm9tIHRoZSBlbmNvZGVyIGJlZm9yZSByZXR1cm5pbmcuIGJ1ZmZlcnMKKyAgICAgKiBhcmUgb25seSBnb29kIHRocm91Z2ggdGhlIG5leHQgYW9tX2NvZGVjIGNhbGwgKi8KKyAgICB3aGlsZSAoKHBrdCA9IGFvbV9jb2RlY19nZXRfY3hfZGF0YSgmY3R4LT5lbmNvZGVyLCAmaXRlcikpKSB7CisgICAgICAgIHN3aXRjaCAocGt0LT5raW5kKSB7CisgICAgICAgIGNhc2UgQU9NX0NPREVDX0NYX0ZSQU1FX1BLVDoKKyAgICAgICAgICAgIGlmICghc2l6ZSkgeworICAgICAgICAgICAgICAgIHN0cnVjdCBGcmFtZUxpc3REYXRhIGN4X2ZyYW1lOworCisgICAgICAgICAgICAgICAgLyogYXZvaWQgc3RvcmluZyB0aGUgZnJhbWUgd2hlbiB0aGUgbGlzdCBpcyBlbXB0eSBhbmQgd2UgaGF2ZW4ndCB5ZXQKKyAgICAgICAgICAgICAgICAgKiBwcm92aWRlZCBhIGZyYW1lIGZvciBvdXRwdXQgKi8KKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKCFjdHgtPmNvZGVkX2ZyYW1lX2xpc3QpOworICAgICAgICAgICAgICAgIGN4X3BrdGNweSgmY3hfZnJhbWUsIHBrdCk7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHN0b3JlZnJhbWUoYXZjdHgsICZjeF9mcmFtZSwgcGt0X291dCk7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RydWN0IEZyYW1lTGlzdERhdGEgKmN4X2ZyYW1lID0KKyAgICAgICAgICAgICAgICAgICAgYXZfbWFsbG9jKHNpemVvZihzdHJ1Y3QgRnJhbWVMaXN0RGF0YSkpOworCisgICAgICAgICAgICAgICAgaWYgKCFjeF9mcmFtZSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBxdWV1ZSBlbGVtZW50IGFsbG9jIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN4X3BrdGNweShjeF9mcmFtZSwgcGt0KTsKKyAgICAgICAgICAgICAgICBjeF9mcmFtZS0+YnVmID0gYXZfbWFsbG9jKGN4X2ZyYW1lLT5zeik7CisKKyAgICAgICAgICAgICAgICBpZiAoIWN4X2ZyYW1lLT5idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSBidWZmZXIgYWxsb2MgKCUiU0laRV9TUEVDSUZJRVIiIGJ5dGVzKSBmYWlsZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjeF9mcmFtZS0+c3opOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmY3hfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkoY3hfZnJhbWUtPmJ1ZiwgcGt0LT5kYXRhLmZyYW1lLmJ1ZiwgcGt0LT5kYXRhLmZyYW1lLnN6KTsKKyAgICAgICAgICAgICAgICBjb2RlZF9mcmFtZV9hZGQoJmN0eC0+Y29kZWRfZnJhbWVfbGlzdCwgY3hfZnJhbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU9NX0NPREVDX1NUQVRTX1BLVDoKKyAgICAgICAgeworICAgICAgICAgICAgc3RydWN0IGFvbV9maXhlZF9idWYgKnN0YXRzID0gJmN0eC0+dHdvcGFzc19zdGF0czsKKyAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZzdGF0cy0+YnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy0+c3ogKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5zeikpIDwgMCkgeworICAgICAgICAgICAgICAgIHN0YXRzLT5zeiA9IDA7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTdGF0IGJ1ZmZlciByZWFsbG9jIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSgodWludDhfdCAqKXN0YXRzLT5idWYgKyBzdGF0cy0+c3osCisgICAgICAgICAgICAgICAgICAgcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuYnVmLCBwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5zeik7CisgICAgICAgICAgICBzdGF0cy0+c3ogKz0gcGt0LT5kYXRhLnR3b3Bhc3Nfc3RhdHMuc3o7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFPTV9DT0RFQ19QU05SX1BLVDogLy8gRklYTUUgYWRkIHN1cHBvcnQgZm9yIEFWX0NPREVDX0ZMQUdfUFNOUgorICAgICAgICBjYXNlIEFPTV9DT0RFQ19DVVNUT01fUEtUOgorICAgICAgICAgICAgLy8gaWdub3JlIHVuc3VwcG9ydGVkL3VucmVjb2duaXplZCBwYWNrZXQgdHlwZXMKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgYW9tX2VuY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBBT01Db250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBhb21faW1hZ2UgKnJhd2ltZyA9IE5VTEw7CisgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIGludCByZXMsIGNvZGVkX3NpemU7CisgICAgYW9tX2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gMDsKKworICAgIGlmIChmcmFtZSkgeworICAgICAgICByYXdpbWcgICAgICAgICAgICAgICAgICAgICAgPSAmY3R4LT5yYXdpbWc7CisgICAgICAgIHJhd2ltZy0+cGxhbmVzW0FPTV9QTEFORV9ZXSA9IGZyYW1lLT5kYXRhWzBdOworICAgICAgICByYXdpbWctPnBsYW5lc1tBT01fUExBTkVfVV0gPSBmcmFtZS0+ZGF0YVsxXTsKKyAgICAgICAgcmF3aW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdID0gZnJhbWUtPmRhdGFbMl07CisgICAgICAgIHJhd2ltZy0+c3RyaWRlW0FPTV9QTEFORV9ZXSA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICAgICAgcmF3aW1nLT5zdHJpZGVbQU9NX1BMQU5FX1VdID0gZnJhbWUtPmxpbmVzaXplWzFdOworICAgICAgICByYXdpbWctPnN0cmlkZVtBT01fUExBTkVfVl0gPSBmcmFtZS0+bGluZXNpemVbMl07CisgICAgICAgIHRpbWVzdGFtcCAgICAgICAgICAgICAgICAgICA9IGZyYW1lLT5wdHM7CisgICAgICAgIHN3aXRjaCAoZnJhbWUtPmNvbG9yX3JhbmdlKSB7CisgICAgICAgIGNhc2UgQVZDT0xfUkFOR0VfTVBFRzoKKyAgICAgICAgICAgIHJhd2ltZy0+cmFuZ2UgPSBBT01fQ1JfU1RVRElPX1JBTkdFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDT0xfUkFOR0VfSlBFRzoKKyAgICAgICAgICAgIHJhd2ltZy0+cmFuZ2UgPSBBT01fQ1JfRlVMTF9SQU5HRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgICAgICBmbGFncyB8PSBBT01fRUZMQUdfRk9SQ0VfS0Y7CisgICAgfQorCisgICAgcmVzID0gYW9tX2NvZGVjX2VuY29kZSgmY3R4LT5lbmNvZGVyLCByYXdpbWcsIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT50aWNrc19wZXJfZnJhbWUsIGZsYWdzKTsKKyAgICBpZiAocmVzICE9IEFPTV9DT0RFQ19PSykgeworICAgICAgICBsb2dfZW5jb2Rlcl9lcnJvcihhdmN0eCwgIkVycm9yIGVuY29kaW5nIGZyYW1lIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBjb2RlZF9zaXplID0gcXVldWVfZnJhbWVzKGF2Y3R4LCBwa3QpOworCisgICAgaWYgKCFmcmFtZSAmJiBhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MxKSB7CisgICAgICAgIHNpemVfdCBiNjRfc2l6ZSA9IEFWX0JBU0U2NF9TSVpFKGN0eC0+dHdvcGFzc19zdGF0cy5zeik7CisKKyAgICAgICAgYXZjdHgtPnN0YXRzX291dCA9IGF2X21hbGxvYyhiNjRfc2l6ZSk7CisgICAgICAgIGlmICghYXZjdHgtPnN0YXRzX291dCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTdGF0IGJ1ZmZlciBhbGxvYyAoJSJTSVpFX1NQRUNJRklFUiIgYnl0ZXMpIGZhaWxlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBiNjRfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2Jhc2U2NF9lbmNvZGUoYXZjdHgtPnN0YXRzX291dCwgYjY0X3NpemUsIGN0eC0+dHdvcGFzc19zdGF0cy5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT50d29wYXNzX3N0YXRzLnN6KTsKKyAgICB9CisKKyAgICAqZ290X3BhY2tldCA9ICEhY29kZWRfc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBhdjFfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgYXYxX3BpeF9mbXRzX2hpZ2hiZFtdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyLAorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEyLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCBhdjFfaW5pdF9zdGF0aWMoQVZDb2RlYyAqY29kZWMpCit7CisgICAgYW9tX2NvZGVjX2NhcHNfdCBjb2RlY19jYXBzID0gYW9tX2NvZGVjX2dldF9jYXBzKGFvbV9jb2RlY19hdjFfY3goKSk7CisgICAgaWYgKGNvZGVjX2NhcHMgJiBBT01fQ09ERUNfQ0FQX0hJR0hCSVRERVBUSCkKKyAgICAgICAgY29kZWMtPnBpeF9mbXRzID0gYXYxX3BpeF9mbXRzX2hpZ2hiZDsKKyAgICBlbHNlCisgICAgICAgIGNvZGVjLT5waXhfZm10cyA9IGF2MV9waXhfZm10czsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGF2MV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICByZXR1cm4gYW9tX2luaXQoYXZjdHgsIGFvbV9jb2RlY19hdjFfY3goKSk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFPTUNvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiY3B1LXVzZWQiLCAgICAgICAgIlF1YWxpdHkvU3BlZWQgcmF0aW8gbW9kaWZpZXIiLCAgICAgICAgICAgT0ZGU0VUKGNwdV91c2VkKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgLTgsIDgsIFZFfSwKKyAgICB7ICJhdXRvLWFsdC1yZWYiLCAgICAiRW5hYmxlIHVzZSBvZiBhbHRlcm5hdGUgcmVmZXJlbmNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVzICgyLXBhc3Mgb25seSkiLCAgICAgICAgICAgICAgICAgICBPRkZTRVQoYXV0b19hbHRfcmVmKSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICAyLCAgICAgICBWRX0sCisgICAgeyAibGFnLWluLWZyYW1lcyIsICAgIk51bWJlciBvZiBmcmFtZXMgdG8gbG9vayBhaGVhZCBhdCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lIHNlbGVjdGlvbiIsICAgIE9GRlNFVChsYWdfaW5fZnJhbWVzKSwgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAgICAgIC0xLCAgICAgIElOVF9NQVgsIFZFfSwKKyAgICB7ICJlcnJvci1yZXNpbGllbmNlIiwgIkVycm9yIHJlc2lsaWVuY2UgY29uZmlndXJhdGlvbiIsIE9GRlNFVChlcnJvcl9yZXNpbGllbnQpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJlciJ9LAorICAgIHsgImRlZmF1bHQiLCAgICAgICAgICJJbXByb3ZlIHJlc2lsaWVuY3kgYWdhaW5zdCBsb3NzZXMgb2Ygd2hvbGUgZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQU9NX0VSUk9SX1JFU0lMSUVOVF9ERUZBVUxUfSwgMCwgMCwgVkUsICJlciJ9LAorICAgIHsgImNyZiIsICAgICAgICAgICAgICAiU2VsZWN0IHRoZSBxdWFsaXR5IGZvciBjb25zdGFudCBxdWFsaXR5IG1vZGUiLCBvZmZzZXRvZihBT01Db250ZXh0LCBjcmYpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgNjMsIFZFIH0sCisgICAgeyAic3RhdGljLXRocmVzaCIsICAgICJBIGNoYW5nZSB0aHJlc2hvbGQgb24gYmxvY2tzIGJlbG93IHdoaWNoIHRoZXkgd2lsbCBiZSBza2lwcGVkIGJ5IHRoZSBlbmNvZGVyIiwgT0ZGU0VUKHN0YXRpY190aHJlc2gpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgVkUgfSwKKyAgICB7ICJkcm9wLXRocmVzaG9sZCIsICAgIkZyYW1lIGRyb3AgdGhyZXNob2xkIiwgb2Zmc2V0b2YoQU9NQ29udGV4dCwgZHJvcF90aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSB9LAorICAgIHsgIm5vaXNlLXNlbnNpdGl2aXR5IiwgIk5vaXNlIHNlbnNpdGl2aXR5IiwgT0ZGU0VUKG5vaXNlX3NlbnNpdGl2aXR5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgMCwgNCwgVkV9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgZGVmYXVsdHNbXSA9IHsKKyAgICB7ICJxbWluIiwgICAgICAgICAgICAgIi0xIiB9LAorICAgIHsgInFtYXgiLCAgICAgICAgICAgICAiLTEiIH0sCisgICAgeyAiZyIsICAgICAgICAgICAgICAgICItMSIgfSwKKyAgICB7ICJrZXlpbnRfbWluIiwgICAgICAgIi0xIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY2xhc3NfYW9tID0geworICAgIC5jbGFzc19uYW1lID0gImxpYmFvbS1hdjEgZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2xpYmFvbV9hdjFfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGliYW9tLWF2MSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYmFvbSBBVjEiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfQVYxLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBT01Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBhdjFfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBhb21fZW5jb2RlLAorICAgIC5jbG9zZSAgICAgICAgICA9IGFvbV9mcmVlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9BVVRPX1RIUkVBRFMgfCBBVl9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMLAorICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX2F2MV9wcm9maWxlcyksCisgICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzX2FvbSwKKyAgICAuZGVmYXVsdHMgICAgICAgPSBkZWZhdWx0cywKKyAgICAuaW5pdF9zdGF0aWNfZGF0YSA9IGF2MV9pbml0X3N0YXRpYywKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGliYW9tIiwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYmF2Y29kZWMudiBiL2xpYmF2Y29kZWMvbGliYXZjb2RlYy52CmluZGV4IGM5MjNjZDMuLmYxZDVlNWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGliYXZjb2RlYy52CisrKyBiL2xpYmF2Y29kZWMvbGliYXZjb2RlYy52CkBAIC0xLDcgKzEsNiBAQAotTElCQVZDT0RFQ18kTUFKT1IgewotICAgICAgICBnbG9iYWw6IGF2KjsKLSAgICAgICAgICAgICAgICAjZGVwcmVjYXRlZCwgcmVtb3ZlIGFmdGVyIG5leHQgYnVtcAotICAgICAgICAgICAgICAgIGF1ZGlvX3Jlc2FtcGxlOwotICAgICAgICAgICAgICAgIGF1ZGlvX3Jlc2FtcGxlX2Nsb3NlOwotICAgICAgICBsb2NhbDogICo7CitMSUJBVkNPREVDX01BSk9SIHsKKyAgICBnbG9iYWw6CisgICAgICAgIGF2KjsKKyAgICBsb2NhbDoKKyAgICAgICAgKjsKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYmNlbHRfZGVjLmMgYi9saWJhdmNvZGVjL2xpYmNlbHRfZGVjLmMKaW5kZXggODc4ZTRjYy4uNzViNDM4YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJjZWx0X2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvbGliY2VsdF9kZWMuYwpAQCAtMTM3LDQgKzEzNyw1IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gbGliY2VsdF9kZWNfY2xvc2UsCiAgICAgLmRlY29kZSAgICAgICAgID0gbGliY2VsdF9kZWNfZGVjb2RlLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYmNlbHQiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGliY29kZWMyLmMgYi9saWJhdmNvZGVjL2xpYmNvZGVjMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNmJlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2xpYmNvZGVjMi5jCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogY29kZWMyIGVuY29kZXIvZGVjb2RlciB1c2luZyBsaWJjb2RlYzIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBUb21hcyBIw6RyZGluCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxjb2RlYzIvY29kZWMyLmg+CisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImNvZGVjMnV0aWxzLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBzdHJ1Y3QgQ09ERUMyICpjb2RlYzsKKyAgICBpbnQgbW9kZTsKK30gTGliQ29kZWMyQ29udGV4dDsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAvL25vdCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSBzaW5jZSBtb2RlIHNob3VsZCBjb21lIGZyb20gdGhlIGRlbXV4ZXIKKyAgICAvLzEzMDAgKGFrYSBGcmVlRFYgMTYwMCkgaXMgdGhlIG1vc3QgY29tbW9uIG1vZGUgb24tdGhlLWFpciwgZGVmYXVsdCB0byBpdCBoZXJlIGFzIHdlbGwKKyAgICBBVlBSSVZfQ09ERUMyX0FWT1BUSU9OUygiY29kZWMyIG1vZGUiLCBMaWJDb2RlYzJDb250ZXh0LCAwLCA0IC8qQ09ERUMyX01PREVfMTMwMCovLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSksCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBsaWJjb2RlYzJfZW5jX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImxpYmNvZGVjMiBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGxpYmNvZGVjMl9kZWNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGliY29kZWMyIGRlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgbGliY29kZWMyX2luaXRfY29tbW9uKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IG1vZGUpCit7CisgICAgTGliQ29kZWMyQ29udGV4dCAqYzIgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIC8vR3JhYiBtb2RlIG5hbWUgZnJvbSBvcHRpb25zLCB1bmxlc3MgaXQncyBzb21lIHdlaXJkIG51bWJlci4KKyAgICBjb25zdCBjaGFyICptb2RlbmFtZSA9IG1vZGUgPj0gMCAmJiBtb2RlIDw9IEFWUFJJVl9DT0RFQzJfTU9ERV9NQVggPyBvcHRpb25zW21vZGUrMV0ubmFtZSA6ICI/IjsKKworICAgIGMyLT5jb2RlYyA9IGNvZGVjMl9jcmVhdGUobW9kZSk7CisgICAgaWYgKCFjMi0+Y29kZWMpIHsKKyAgICAgICAgLy9PdXQgb2YgbWVtb3J5IG9yIHVuc3VwcG9ydGVkIG1vZGUuIFRoZSBsYXR0ZXIgc2VlbXMgbW9zdCBsaWtlbHksCisgICAgICAgIC8vYnV0IHdlIGNhbid0IHRlbGwgZm9yIHN1cmUgd2l0aCB0aGUgY3VycmVudCBBUEkuCisgICAgICAgIGdvdG8gbGliY29kZWMyX2luaXRfY29tbW9uX2Vycm9yOworICAgIH0KKworICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gY29kZWMyX3NhbXBsZXNfcGVyX2ZyYW1lKGMyLT5jb2RlYyk7CisgICAgYXZjdHgtPmJsb2NrX2FsaWduID0gKGNvZGVjMl9iaXRzX3Blcl9mcmFtZShjMi0+Y29kZWMpICsgNykgLyA4OworCisgICAgaWYgKGF2Y3R4LT5mcmFtZV9zaXplIDw9IDAgfHwgYXZjdHgtPmJsb2NrX2FsaWduIDw9IDApIHsKKyAgICAgICAgLy9jb2RlYzJfY3JlYXRlKCkgbWF5IHN1Y2NlZWQgZm9yIHNvbWUgbW9kZXMgYnV0IHN0aWxsIGZhaWwgYXQgY29kZWMyX3NhbXBsZXNfcGVyX2ZyYW1lKCkKKyAgICAgICAgLy9leGFtcGxlIGlzIC1tb2RlIDcwMEMgb24gbGliY29kZWMyIDAuNAorICAgICAgICBjb2RlYzJfZGVzdHJveShjMi0+Y29kZWMpOworICAgICAgICBjMi0+Y29kZWMgPSBOVUxMOworICAgICAgICBnb3RvIGxpYmNvZGVjMl9pbml0X2NvbW1vbl9lcnJvcjsKKyAgICB9CisKKyAgICBjb2RlYzJfc2V0X25hdHVyYWxfb3JfZ3JheShjMi0+Y29kZWMsIDEpOworCisgICAgcmV0dXJuIDA7CisKK2xpYmNvZGVjMl9pbml0X2NvbW1vbl9lcnJvcjoKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgIk1vZGUgJWkgKCVzKSBub3Qgc3VwcG9ydGVkIHdpdGggdGhlIGxpbmtlZCB2ZXJzaW9uIG9mIGxpYmNvZGVjMlxuIiwKKyAgICAgICAgbW9kZSwgbW9kZW5hbWUpOworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJjb2RlYzJfaW5pdF9kZWNvZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdmN0eC0+c2FtcGxlX3JhdGUgICAgICA9IDgwMDA7CisgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgICAgPSAxOworICAgIGF2Y3R4LT5zYW1wbGVfZm10ICAgICAgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ICAgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgIT0gQVZQUklWX0NPREVDMl9FWFRSQURBVEFfU0laRSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm11c3QgaGF2ZSBleGFjdGx5ICVpIGJ5dGVzIG9mIGV4dHJhZGF0YSAoZ290ICVpKVxuIiwKKyAgICAgICAgICAgICAgIEFWUFJJVl9DT0RFQzJfRVhUUkFEQVRBX1NJWkUsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldHVybiBsaWJjb2RlYzJfaW5pdF9jb21tb24oYXZjdHgsIGF2cHJpdl9jb2RlYzJfbW9kZV9mcm9tX2V4dHJhZGF0YShhdmN0eC0+ZXh0cmFkYXRhKSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBsaWJjb2RlYzJfaW5pdF9lbmNvZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMaWJDb2RlYzJDb250ZXh0ICpjMiA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICAvL3dpbGwgbmVlZCB0byBiZSBzbWFydGVyIG9uY2Ugd2UgZ2V0IHdpZGViYW5kIHN1cHBvcnQKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlICE9IDgwMDAgfHwKKyAgICAgICAgYXZjdHgtPmNoYW5uZWxzICE9IDEgfHwKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9TMTYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJvbmx5IDgga0h6IDE2LWJpdCBtb25vIGFsbG93ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KEFWUFJJVl9DT0RFQzJfRVhUUkFEQVRBX1NJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBBVlBSSVZfQ09ERUMyX0VYVFJBREFUQV9TSVpFOworICAgIGF2cHJpdl9jb2RlYzJfbWFrZV9leHRyYWRhdGEoYXZjdHgtPmV4dHJhZGF0YSwgYzItPm1vZGUpOworCisgICAgcmV0dXJuIGxpYmNvZGVjMl9pbml0X2NvbW1vbihhdmN0eCwgYzItPm1vZGUpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbGliY29kZWMyX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBMaWJDb2RlYzJDb250ZXh0ICpjMiA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjb2RlYzJfZGVzdHJveShjMi0+Y29kZWMpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpYmNvZGVjMl9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBMaWJDb2RlYzJDb250ZXh0ICpjMiA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIGludCByZXQsIG5mcmFtZXMsIGk7CisgICAgdWludDhfdCAqaW5wdXQ7CisgICAgaW50MTZfdCAqb3V0cHV0OworCisgICAgbmZyYW1lcyAgICAgICAgICAgPSBwa3QtPnNpemUgLyBhdmN0eC0+YmxvY2tfYWxpZ247CisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBhdmN0eC0+ZnJhbWVfc2l6ZSAqIG5mcmFtZXM7CisKKyAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpbnB1dCAgPSBwa3QtPmRhdGE7CisgICAgb3V0cHV0ID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuZnJhbWVzOyBpKyspIHsKKyAgICAgICAgY29kZWMyX2RlY29kZShjMi0+Y29kZWMsIG91dHB1dCwgaW5wdXQpOworICAgICAgICBpbnB1dCAgKz0gYXZjdHgtPmJsb2NrX2FsaWduOworICAgICAgICBvdXRwdXQgKz0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgfQorCisgICAgKmdvdF9mcmFtZV9wdHIgPSBuZnJhbWVzID4gMDsKKyAgICByZXR1cm4gbmZyYW1lcyAqIGF2Y3R4LT5ibG9ja19hbGlnbjsKK30KKworc3RhdGljIGludCBsaWJjb2RlYzJfZW5jb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIExpYkNvZGVjMkNvbnRleHQgKmMyID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQxNl90ICpzYW1wbGVzID0gKGludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKworICAgIGludCByZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgYXZjdHgtPmJsb2NrX2FsaWduLCAwKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGNvZGVjMl9lbmNvZGUoYzItPmNvZGVjLCBhdnBrdC0+ZGF0YSwgc2FtcGxlcyk7CisgICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX2xpYmNvZGVjMl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgID0gImxpYmNvZGVjMiIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiY29kZWMyIGRlY29kZXIgdXNpbmcgbGliY29kZWMyIiksCisgICAgLnR5cGUgICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9DT0RFQzIsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICAgPSBzaXplb2YoTGliQ29kZWMyQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICAgPSBsaWJjb2RlYzJfaW5pdF9kZWNvZGVyLAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgID0gbGliY29kZWMyX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgID0gbGliY29kZWMyX2RlY29kZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgICA9IDAsCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyAgPSAoY29uc3QgaW50W10peyA4MDAwLCAwIH0sCisgICAgLnNhbXBsZV9mbXRzICAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfUzE2LCBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAuY2hhbm5lbF9sYXlvdXRzICAgICAgICA9IChjb25zdCB1aW50NjRfdFtdKSB7IEFWX0NIX0xBWU9VVF9NT05PLCAwIH0sCisgICAgLnByaXZfY2xhc3MgICAgICAgICAgICAgPSAmbGliY29kZWMyX2RlY19jbGFzcywKK307CisKK0FWQ29kZWMgZmZfbGliY29kZWMyX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICAgPSAibGliY29kZWMyIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJjb2RlYzIgZW5jb2RlciB1c2luZyBsaWJjb2RlYzIiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0NPREVDMiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgICA9IHNpemVvZihMaWJDb2RlYzJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgICA9IGxpYmNvZGVjMl9pbml0X2VuY29kZXIsCisgICAgLmNsb3NlICAgICAgICAgICAgICAgICAgPSBsaWJjb2RlYzJfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICAgPSBsaWJjb2RlYzJfZW5jb2RlLAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgID0gMCwKKyAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzICA9IChjb25zdCBpbnRbXSl7IDgwMDAsIDAgfSwKKyAgICAuc2FtcGxlX2ZtdHMgICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMTYsIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgID0gKGNvbnN0IHVpbnQ2NF90W10pIHsgQVZfQ0hfTEFZT1VUX01PTk8sIDAgfSwKKyAgICAucHJpdl9jbGFzcyAgICAgICAgICAgICA9ICZsaWJjb2RlYzJfZW5jX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGliZGNhZGVjLmMgYi9saWJhdmNvZGVjL2xpYmRjYWRlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFmOTMxLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvbGliZGNhZGVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoKLSAqIGxpYmRjYWRlYyBkZWNvZGVyIHdyYXBwZXIKLSAqIENvcHlyaWdodCAoQykgMjAxNSBIZW5kcmlrIExlcHBrZXMKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgPGxpYmRjYWRlYy9kY2FfY29udGV4dC5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLQotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJkY2EuaCIKLSNpbmNsdWRlICJkY2Ffc3luY3dvcmRzLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJwcm9maWxlcy5oIgotCi10eXBlZGVmIHN0cnVjdCBEQ0FEZWNDb250ZXh0IHsKLSAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKLSAgICBzdHJ1Y3QgZGNhZGVjX2NvbnRleHQgKmN0eDsKLSAgICB1aW50OF90ICpidWZmZXI7Ci0gICAgaW50IGJ1ZmZlcl9zaXplOwotICAgIGludCBsZmVfZmlsdGVyOwotICAgIGludCBjb3JlX29ubHk7Ci19IERDQURlY0NvbnRleHQ7Ci0KLXN0YXRpYyB2b2lkIG15X2xvZ19jYihpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZvaWQgKmNiYXJnKQotewotICAgIGludCBhdl9sZXZlbDsKLQotICAgIHN3aXRjaCAobGV2ZWwpIHsKLSAgICBjYXNlIERDQURFQ19MT0dfRVJST1I6Ci0gICAgICAgIGF2X2xldmVsID0gQVZfTE9HX0VSUk9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERDQURFQ19MT0dfV0FSTklORzoKLSAgICAgICAgYXZfbGV2ZWwgPSBBVl9MT0dfV0FSTklORzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBEQ0FERUNfTE9HX0lORk86Ci0gICAgICAgIGF2X2xldmVsID0gQVZfTE9HX0lORk87Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRENBREVDX0xPR19WRVJCT1NFOgotICAgICAgICBhdl9sZXZlbCA9IEFWX0xPR19WRVJCT1NFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERDQURFQ19MT0dfREVCVUc6Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYXZfbGV2ZWwgPSBBVl9MT0dfREVCVUc7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGF2X2xvZyhjYmFyZywgYXZfbGV2ZWwsICIlc1xuIiwgbWVzc2FnZSk7Ci19Ci0KLXN0YXRpYyBpbnQgZGNhZGVjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgRENBRGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOwotICAgIHN0cnVjdCBkY2FkZWNfZXhzc19pbmZvICpleHNzOwotICAgIGludCByZXQsIGksIGs7Ci0gICAgaW50ICoqc2FtcGxlcywgbnNhbXBsZXMsIGNoYW5uZWxfbWFzaywgc2FtcGxlX3JhdGUsIGJpdHNfcGVyX3NhbXBsZSwgcHJvZmlsZTsKLSAgICB1aW50MzJfdCBtcms7Ci0gICAgdWludDhfdCAqaW5wdXQgPSBhdnBrdC0+ZGF0YTsKLSAgICBpbnQgaW5wdXRfc2l6ZSA9IGF2cGt0LT5zaXplOwotCi0gICAgLyogY29udmVydCBieXRlc3RyZWFtIHN5bnRheCB0byBSQVcgQkUgZm9ybWF0IGlmIHJlcXVpcmVkICovCi0gICAgaWYgKGlucHV0X3NpemUgPCA4KSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5wdXQgc2l6ZSB0b28gc21hbGxcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0gICAgbXJrID0gQVZfUkIzMihpbnB1dCk7Ci0gICAgaWYgKG1yayAhPSBEQ0FfU1lOQ1dPUkRfQ09SRV9CRSAmJiBtcmsgIT0gRENBX1NZTkNXT1JEX1NVQlNUUkVBTSkgewotICAgICAgICBzLT5idWZmZXIgPSBhdl9mYXN0X3JlYWxsb2Mocy0+YnVmZmVyLCAmcy0+YnVmZmVyX3NpemUsIGF2cGt0LT5zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgIGlmICghcy0+YnVmZmVyKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgICAgICBmb3IgKGkgPSAwLCByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOyBpIDwgaW5wdXRfc2l6ZSAtIDMgJiYgcmV0IDwgMDsgaSsrKQotICAgICAgICAgICAgcmV0ID0gYXZwcml2X2RjYV9jb252ZXJ0X2JpdHN0cmVhbShpbnB1dCArIGksIGlucHV0X3NpemUgLSBpLCBzLT5idWZmZXIsIHMtPmJ1ZmZlcl9zaXplKTsKLQotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgaW5wdXQgICAgICA9IHMtPmJ1ZmZlcjsKLSAgICAgICAgaW5wdXRfc2l6ZSA9IHJldDsKLSAgICB9Ci0KLSAgICBpZiAoKHJldCA9IGRjYWRlY19jb250ZXh0X3BhcnNlKHMtPmN0eCwgaW5wdXQsIGlucHV0X3NpemUpKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkY2FkZWNfY29udGV4dF9wYXJzZSgpIGZhaWxlZDogJWQgKCVzKVxuIiwgLXJldCwgZGNhZGVjX3N0cmVycm9yKHJldCkpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICB9Ci0gICAgaWYgKChyZXQgPSBkY2FkZWNfY29udGV4dF9maWx0ZXIocy0+Y3R4LCAmc2FtcGxlcywgJm5zYW1wbGVzLCAmY2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVfcmF0ZSwgJmJpdHNfcGVyX3NhbXBsZSwgJnByb2ZpbGUpKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkY2FkZWNfY29udGV4dF9maWx0ZXIoKSBmYWlsZWQ6ICVkICglcylcbiIsIC1yZXQsIGRjYWRlY19zdHJlcnJvcihyZXQpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Ci0gICAgfQotCi0gICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGNoYW5uZWxfbWFzayk7Ci0gICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbF9tYXNrOwotICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSAgICA9IHNhbXBsZV9yYXRlOwotCi0gICAgaWYgKGJpdHNfcGVyX3NhbXBsZSA9PSAxNikKLSAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNlA7Ci0gICAgZWxzZSBpZiAoYml0c19wZXJfc2FtcGxlID4gMTYgJiYgYml0c19wZXJfc2FtcGxlIDw9IDI0KQotICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyUDsKLSAgICBlbHNlIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgYml0cyBwZXIgc2FtcGxlOiAlZFxuIiwKLSAgICAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Ci0gICAgfQotCi0gICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0KLSAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKLSAgICBjYXNlIERDQURFQ19QUk9GSUxFX0RTOgotICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfRFRTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERDQURFQ19QUk9GSUxFX0RTXzk2XzI0OgotICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfRFRTXzk2XzI0OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERDQURFQ19QUk9GSUxFX0RTX0VTOgotICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfRFRTX0VTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERDQURFQ19QUk9GSUxFX0hEX0hSQToKLSAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0RUU19IRF9IUkE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRENBREVDX1BST0ZJTEVfSERfTUE6Ci0gICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9EVFNfSERfTUE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRENBREVDX1BST0ZJTEVfRVhQUkVTUzoKLSAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0RUU19FWFBSRVNTOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERDQURFQ19QUk9GSUxFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX1VOS05PV047Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qIGJpdHJhdGUgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZXJlIGFyZSBubyBIRCBleHRlbnNpb25zLCBhcyB0aGV5IGRpc3RvcnQgdGhlIGJpdHJhdGUgKi8KLSAgICBpZiAocHJvZmlsZSA9PSBEQ0FERUNfUFJPRklMRV9EUyB8fCBwcm9maWxlID09IERDQURFQ19QUk9GSUxFX0RTXzk2XzI0IHx8IHByb2ZpbGUgPT0gRENBREVDX1BST0ZJTEVfRFNfRVMpIHsKLSAgICAgICAgc3RydWN0IGRjYWRlY19jb3JlX2luZm8gKmluZm8gPSBkY2FkZWNfY29udGV4dF9nZXRfY29yZV9pbmZvKHMtPmN0eCk7Ci0gICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGluZm8tPmJpdF9yYXRlOwotICAgICAgICBkY2FkZWNfY29udGV4dF9mcmVlX2NvcmVfaW5mbyhpbmZvKTsKLSAgICB9IGVsc2UKLSAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gMDsKLQotICAgIGlmIChleHNzID0gZGNhZGVjX2NvbnRleHRfZ2V0X2V4c3NfaW5mbyhzLT5jdHgpKSB7Ci0gICAgICAgIGVudW0gQVZNYXRyaXhFbmNvZGluZyBtYXRyaXhfZW5jb2RpbmcgPSBBVl9NQVRSSVhfRU5DT0RJTkdfTk9ORTsKLQotICAgICAgICBzd2l0Y2goZXhzcy0+bWF0cml4X2VuY29kaW5nKSB7Ci0gICAgICAgIGNhc2UgRENBREVDX01BVFJJWF9FTkNPRElOR19TVVJST1VORDoKLSAgICAgICAgICAgIG1hdHJpeF9lbmNvZGluZyA9IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERDQURFQ19NQVRSSVhfRU5DT0RJTkdfSEVBRFBIT05FOgotICAgICAgICAgICAgbWF0cml4X2VuY29kaW5nID0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZSEVBRFBIT05FOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGNhZGVjX2NvbnRleHRfZnJlZV9leHNzX2luZm8oZXhzcyk7Ci0KLSAgICAgICAgaWYgKG1hdHJpeF9lbmNvZGluZyAhPSBBVl9NQVRSSVhfRU5DT0RJTkdfTk9ORSAmJgotICAgICAgICAgICAgKHJldCA9IGZmX3NpZGVfZGF0YV91cGRhdGVfbWF0cml4X2VuY29kaW5nKGZyYW1lLCBtYXRyaXhfZW5jb2RpbmcpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gbnNhbXBsZXM7Ci0gICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykgewotICAgICAgICBpZiAoZnJhbWUtPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlApIHsKLSAgICAgICAgICAgIGludDE2X3QgKnBsYW5lID0gKGludDE2X3QgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXTsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBuc2FtcGxlczsgaysrKQotICAgICAgICAgICAgICAgIHBsYW5lW2tdID0gc2FtcGxlc1tpXVtrXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3QgKnBsYW5lID0gKGludDMyX3QgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXTsKLSAgICAgICAgICAgIGludCBzaGlmdCA9IDMyIC0gYml0c19wZXJfc2FtcGxlOwotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG5zYW1wbGVzOyBrKyspCi0gICAgICAgICAgICAgICAgcGxhbmVba10gPSBzYW1wbGVzW2ldW2tdIDw8IHNoaWZ0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKmdvdF9mcmFtZV9wdHIgPSAxOwotCi0gICAgcmV0dXJuIGF2cGt0LT5zaXplOwotfQotCi1zdGF0aWMgYXZfY29sZCB2b2lkIGRjYWRlY19mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgRENBRGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgZGNhZGVjX2NvbnRleHRfY2xlYXIocy0+Y3R4KTsKLX0KLQotc3RhdGljIGF2X2NvbGQgaW50IGRjYWRlY19jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgRENBRGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0KLSAgICBkY2FkZWNfY29udGV4dF9kZXN0cm95KHMtPmN0eCk7Ci0gICAgcy0+Y3R4ID0gTlVMTDsKLQotICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBhdl9jb2xkIGludCBkY2FkZWNfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgRENBRGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IGZsYWdzID0gMDsKLQotICAgIC8qIEFmZmVjdHMgb25seSBsb3NzeSBEVFMgcHJvZmlsZXMuIERUUy1IRCBNQSBpcyBhbHdheXMgYml0ZXhhY3QgKi8KLSAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19CSVRFWEFDVCkKLSAgICAgICAgZmxhZ3MgfD0gRENBREVDX0ZMQUdfQ09SRV9CSVRfRVhBQ1Q7Ci0KLSAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCi0gICAgICAgIGZsYWdzIHw9IERDQURFQ19GTEFHX1NUUklDVDsKLQotICAgIGlmIChhdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCkgewotICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0KSB7Ci0gICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUX1NURVJFTzoKLSAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfU1RFUkVPX0RPV05NSVg6Ci0gICAgICAgICAgICBmbGFncyB8PSBEQ0FERUNfRkxBR19LRUVQX0RNSVhfMkNIOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzVQT0lOVDE6Ci0gICAgICAgICAgICBmbGFncyB8PSBEQ0FERUNfRkxBR19LRUVQX0RNSVhfNkNIOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUX05BVElWRToKLSAgICAgICAgICAgIGZsYWdzIHw9IERDQURFQ19GTEFHX05BVElWRV9MQVlPVVQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIHJlcXVlc3RfY2hhbm5lbF9sYXlvdXRcbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocy0+Y29yZV9vbmx5KQotICAgICAgICBmbGFncyB8PSBEQ0FERUNfRkxBR19DT1JFX09OTFk7Ci0KLSAgICBzd2l0Y2ggKHMtPmxmZV9maWx0ZXIpIHsKLSNpZiBEQ0FERUNfQVBJX1ZFUlNJT04gPj0gRENBREVDX1ZFUlNJT05fQ09ERSgwLCAxLCAwKQotICAgIGNhc2UgMToKLSAgICAgICAgZmxhZ3MgfD0gRENBREVDX0ZMQUdfQ09SRV9MRkVfSUlSOwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgIGNhc2UgMjoKLSAgICAgICAgZmxhZ3MgfD0gRENBREVDX0ZMQUdfQ09SRV9MRkVfRklSOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzLT5jdHggPSBkY2FkZWNfY29udGV4dF9jcmVhdGUoZmxhZ3MpOwotICAgIGlmICghcy0+Y3R4KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZGNhZGVjX2NvbnRleHRfc2V0X2xvZ19jYihzLT5jdHgsIG15X2xvZ19jYiwgYXZjdHgpOwotCi0gICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MzMlA7Ci0gICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSAyNDsKLQotICAgIHJldHVybiAwOwotfQotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihEQ0FEZWNDb250ZXh0LCB4KQotI2RlZmluZSBQQVJBTSBBVl9PUFRfRkxBR19BVURJT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCi0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBkY2FkZWNfb3B0aW9uc1tdID0gewotICAgIHsgImxmZV9maWx0ZXIiLCAiTG9zc3kgTEZFIGNoYW5uZWwgaW50ZXJwb2xhdGlvbiBmaWx0ZXIiLCBPRkZTRVQobGZlX2ZpbHRlciksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sIDAsICAgICAgIDIsICAgICAgIFBBUkFNLCAibGZlX2ZpbHRlciIgfSwKLSAgICB7ICJkZWZhdWx0IiwgICAgIkxpYnJhcnkgZGVmYXVsdCIsICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBQQVJBTSwgImxmZV9maWx0ZXIiIH0sCi0gICAgeyAiaWlyIiwgICAgICAgICJJSVIgZmlsdGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDEgfSwgSU5UX01JTiwgSU5UX01BWCwgUEFSQU0sICJsZmVfZmlsdGVyIiB9LAotICAgIHsgImZpciIsICAgICAgICAiRklSIGZpbHRlciIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAyIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAibGZlX2ZpbHRlciIgfSwKLSAgICB7ICJjb3JlX29ubHkiLCAgIkRlY29kZSBjb3JlIG9ubHkgd2l0aG91dCBleHRlbnNpb25zIiwgICAgT0ZGU0VUKGNvcmVfb25seSksICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAwLCAgICAgICAxLCAgICAgICBQQVJBTSB9LAotICAgIHsgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyBkY2FkZWNfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAibGliZGNhZGVjIGRlY29kZXIiLAotICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgLm9wdGlvbiAgICAgPSBkY2FkZWNfb3B0aW9ucywKLSAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLSAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFQ09ERVIsCi19OwotCi1BVkNvZGVjIGZmX2xpYmRjYWRlY19kZWNvZGVyID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJkY2FkZWMiLAotICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJkY2FkZWMgRENBIGRlY29kZXIiKSwKLSAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCi0gICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfRFRTLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEQ0FEZWNDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBkY2FkZWNfaW5pdCwKLSAgICAuZGVjb2RlICAgICAgICAgPSBkY2FkZWNfZGVjb2RlX2ZyYW1lLAotICAgIC5jbG9zZSAgICAgICAgICA9IGRjYWRlY19jbG9zZSwKLSAgICAuZmx1c2ggICAgICAgICAgPSBkY2FkZWNfZmx1c2gsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9DSEFOTkVMX0NPTkYsCi0gICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX1MzMlAsIEFWX1NBTVBMRV9GTVRfUzE2UCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAotICAgIC5wcml2X2NsYXNzICAgICA9ICZkY2FkZWNfY2xhc3MsCi0gICAgLnByb2ZpbGVzICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoZmZfZGNhX3Byb2ZpbGVzKSwKLX07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYmZhYWMuYyBiL2xpYmF2Y29kZWMvbGliZmFhYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGIzYmE4Li4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvbGliZmFhYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qCi0gKiBJbnRlcmZhY2UgdG8gbGliZmFhYyBmb3IgYWFjIGVuY29kaW5nCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgR2lsZGFzIEJhemluIDxnYmF6aW5AbmV0Y291cnJpZXIuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSAqIEBmaWxlCi0gKiBJbnRlcmZhY2UgdG8gbGliZmFhYyBmb3IgYWFjIGVuY29kaW5nLgotICovCi0KLSNpbmNsdWRlIDxmYWFjLmg+Ci0KLSNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImF1ZGlvX2ZyYW1lX3F1ZXVlLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotCi0vKiBsaWJmYWFjIGhhcyBhbiBlbmNvZGVyIGRlbGF5IG9mIDEwMjQgc2FtcGxlcyAqLwotI2RlZmluZSBGQUFDX0RFTEFZX1NBTVBMRVMgMTAyNAotCi10eXBlZGVmIHN0cnVjdCBGYWFjQXVkaW9Db250ZXh0IHsKLSAgICBmYWFjRW5jSGFuZGxlIGZhYWNfaGFuZGxlOwotICAgIEF1ZGlvRnJhbWVRdWV1ZSBhZnE7Ci19IEZhYWNBdWRpb0NvbnRleHQ7Ci0KLXN0YXRpYyBhdl9jb2xkIGludCBGYWFjX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgRmFhY0F1ZGlvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0KLSAgICBhdl9mcmVlcCgmYXZjdHgtPmV4dHJhZGF0YSk7Ci0gICAgZmZfYWZfcXVldWVfY2xvc2UoJnMtPmFmcSk7Ci0KLSAgICBpZiAocy0+ZmFhY19oYW5kbGUpCi0gICAgICAgIGZhYWNFbmNDbG9zZShzLT5mYWFjX2hhbmRsZSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IGludCBjaGFubmVsX21hcHNbXVs2XSA9IHsKLSAgICB7IDIsIDAsIDEgfSwgICAgICAgICAgLy88IEMgTCBSCi0gICAgeyAyLCAwLCAxLCAzIH0sICAgICAgIC8vPCBDIEwgUiBDcwotICAgIHsgMiwgMCwgMSwgMywgNCB9LCAgICAvLzwgQyBMIFIgTHMgUnMKLSAgICB7IDIsIDAsIDEsIDQsIDUsIDMgfSwgLy88IEMgTCBSIExzIFJzIExGRQotfTsKLQotc3RhdGljIGF2X2NvbGQgaW50IEZhYWNfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIEZhYWNBdWRpb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGZhYWNFbmNDb25maWd1cmF0aW9uUHRyIGZhYWNfY2ZnOwotICAgIHVuc2lnbmVkIGxvbmcgc2FtcGxlc19pbnB1dCwgbWF4X2J5dGVzX291dHB1dDsKLSAgICBpbnQgcmV0OwotCi0gICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCi0gICAgaWYgKGF2Y3R4LT5jaGFubmVscyA8IDEgfHwgYXZjdHgtPmNoYW5uZWxzID4gNikgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVuY29kaW5nICVkIGNoYW5uZWwocykgaXMgbm90IGFsbG93ZWRcbiIsIGF2Y3R4LT5jaGFubmVscyk7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBzLT5mYWFjX2hhbmRsZSA9IGZhYWNFbmNPcGVuKGF2Y3R4LT5zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVzX2lucHV0LCAmbWF4X2J5dGVzX291dHB1dCk7Ci0gICAgaWYgKCFzLT5mYWFjX2hhbmRsZSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGluIGZhYWNFbmNPcGVuKClcbiIpOwotICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgZmFhYyB2ZXJzaW9uICovCi0gICAgZmFhY19jZmcgPSBmYWFjRW5jR2V0Q3VycmVudENvbmZpZ3VyYXRpb24ocy0+ZmFhY19oYW5kbGUpOwotICAgIGlmIChmYWFjX2NmZy0+dmVyc2lvbiAhPSBGQUFDX0NGR19WRVJTSU9OKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAid3JvbmcgbGliZmFhYyB2ZXJzaW9uIChjb21waWxlZCBmb3I6ICVkLCB1c2luZyAlZClcbiIsIEZBQUNfQ0ZHX1ZFUlNJT04sIGZhYWNfY2ZnLT52ZXJzaW9uKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8qIHB1dCB0aGUgb3B0aW9ucyBpbiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3QgKi8KLSAgICBzd2l0Y2goYXZjdHgtPnByb2ZpbGUpIHsKLSAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0FBQ19NQUlOOgotICAgICAgICAgICAgZmFhY19jZmctPmFhY09iamVjdFR5cGUgPSBNQUlOOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkZfUFJPRklMRV9VTktOT1dOOgotICAgICAgICBjYXNlIEZGX1BST0ZJTEVfQUFDX0xPVzoKLSAgICAgICAgICAgIGZhYWNfY2ZnLT5hYWNPYmplY3RUeXBlID0gTE9XOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkZfUFJPRklMRV9BQUNfU1NSOgotICAgICAgICAgICAgZmFhY19jZmctPmFhY09iamVjdFR5cGUgPSBTU1I7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0FBQ19MVFA6Ci0gICAgICAgICAgICBmYWFjX2NmZy0+YWFjT2JqZWN0VHlwZSA9IExUUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIEFBQyBwcm9maWxlXG4iKTsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotICAgIGZhYWNfY2ZnLT5tcGVnVmVyc2lvbiA9IE1QRUc0OwotICAgIGZhYWNfY2ZnLT51c2VUbnMgPSAwOwotICAgIGZhYWNfY2ZnLT5hbGxvd01pZHNpZGUgPSAxOwotICAgIGZhYWNfY2ZnLT5iaXRSYXRlID0gYXZjdHgtPmJpdF9yYXRlIC8gYXZjdHgtPmNoYW5uZWxzOwotICAgIGZhYWNfY2ZnLT5iYW5kV2lkdGggPSBhdmN0eC0+Y3V0b2ZmOwotICAgIGlmKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKSB7Ci0gICAgICAgIGZhYWNfY2ZnLT5iaXRSYXRlID0gMDsKLSAgICAgICAgZmFhY19jZmctPnF1YW50cXVhbCA9IGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSAvIEZGX1FQMkxBTUJEQTsKLSAgICB9Ci0gICAgZmFhY19jZmctPm91dHB1dEZvcm1hdCA9IDE7Ci0gICAgZmFhY19jZmctPmlucHV0Rm9ybWF0ID0gRkFBQ19JTlBVVF8xNkJJVDsKLSAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID4gMikKLSAgICAgICAgbWVtY3B5KGZhYWNfY2ZnLT5jaGFubmVsX21hcCwgY2hhbm5lbF9tYXBzW2F2Y3R4LT5jaGFubmVscy0zXSwKLSAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAqIHNpemVvZihpbnQpKTsKLQotICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gc2FtcGxlc19pbnB1dCAvIGF2Y3R4LT5jaGFubmVsczsKLQotICAgIC8qIFNldCBkZWNvZGVyIHNwZWNpZmljIGluZm8gKi8KLSAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAwOwotICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHsKLQotICAgICAgICB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBOVUxMOwotICAgICAgICB1bnNpZ25lZCBsb25nIGRlY29kZXJfc3BlY2lmaWNfaW5mb19zaXplOwotCi0gICAgICAgIGlmICghZmFhY0VuY0dldERlY29kZXJTcGVjaWZpY0luZm8ocy0+ZmFhY19oYW5kbGUsICZidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlY29kZXJfc3BlY2lmaWNfaW5mb19zaXplKSkgewotICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyhkZWNvZGVyX3NwZWNpZmljX2luZm9fc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgICAgICAgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBkZWNvZGVyX3NwZWNpZmljX2luZm9fc2l6ZTsKLSAgICAgICAgICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhLCBidWZmZXIsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgICAgICAgICBmYWFjX2NmZy0+b3V0cHV0Rm9ybWF0ID0gMDsKLSAgICAgICAgfQotICAgICAgICBmcmVlKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgaWYgKCFmYWFjRW5jU2V0Q29uZmlndXJhdGlvbihzLT5mYWFjX2hhbmRsZSwgZmFhY19jZmcpKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSBhdmN0eC0+Yml0X3JhdGUvMTAwMDsgaSA7IGktLSkgewotICAgICAgICAgICAgZmFhY19jZmctPmJpdFJhdGUgPSAxMDAwKmkgLyBhdmN0eC0+Y2hhbm5lbHM7Ci0gICAgICAgICAgICBpZiAoZmFhY0VuY1NldENvbmZpZ3VyYXRpb24ocy0+ZmFhY19oYW5kbGUsIGZhYWNfY2ZnKSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibGliZmFhYyBkb2Vzbid0IHN1cHBvcnQgdGhpcyBvdXRwdXQgZm9ybWF0IVxuIik7Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZjdHgtPmJpdF9yYXRlID0gMTAwMCppOwotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImxpYmZhYWMgZG9lc24ndCBzdXBwb3J0IHRoZSBzcGVjaWZpZWQgYml0cmF0ZSwgdXNpbmcgJWRrYml0L3MgaW5zdGVhZFxuIiwgaSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nID0gRkFBQ19ERUxBWV9TQU1QTEVTOwotICAgIGZmX2FmX3F1ZXVlX2luaXQoYXZjdHgsICZzLT5hZnEpOwotCi0gICAgcmV0dXJuIDA7Ci1lcnJvcjoKLSAgICBGYWFjX2VuY29kZV9jbG9zZShhdmN0eCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBGYWFjX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldF9wdHIpCi17Ci0gICAgRmFhY0F1ZGlvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IGJ5dGVzX3dyaXR0ZW4sIHJldDsKLSAgICBpbnQgbnVtX3NhbXBsZXMgID0gZnJhbWUgPyBmcmFtZS0+bmJfc2FtcGxlcyA6IDA7Ci0gICAgdm9pZCAqc2FtcGxlcyAgICA9IGZyYW1lID8gZnJhbWUtPmRhdGFbMF0gICAgOiBOVUxMOwotCi0gICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgKDcgKyA3NjgpICogYXZjdHgtPmNoYW5uZWxzLCAwKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgYnl0ZXNfd3JpdHRlbiA9IGZhYWNFbmNFbmNvZGUocy0+ZmFhY19oYW5kbGUsIHNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3NhbXBsZXMgKiBhdmN0eC0+Y2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKLSAgICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJmYWFjRW5jRW5jb2RlKCkgZXJyb3JcbiIpOwotICAgICAgICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKLSAgICB9Ci0KLSAgICAvKiBhZGQgY3VycmVudCBmcmFtZSB0byB0aGUgcXVldWUgKi8KLSAgICBpZiAoZnJhbWUpIHsKLSAgICAgICAgaWYgKChyZXQgPSBmZl9hZl9xdWV1ZV9hZGQoJnMtPmFmcSwgZnJhbWUpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGlmICghYnl0ZXNfd3JpdHRlbikKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBHZXQgdGhlIG5leHQgZnJhbWUgcHRzL2R1cmF0aW9uICovCi0gICAgZmZfYWZfcXVldWVfcmVtb3ZlKCZzLT5hZnEsIGF2Y3R4LT5mcmFtZV9zaXplLCAmYXZwa3QtPnB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgJmF2cGt0LT5kdXJhdGlvbik7Ci0KLSAgICBhdnBrdC0+c2l6ZSA9IGJ5dGVzX3dyaXR0ZW47Ci0gICAgKmdvdF9wYWNrZXRfcHRyID0gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IEFWUHJvZmlsZSBwcm9maWxlc1tdID0gewotICAgIHsgRkZfUFJPRklMRV9BQUNfTUFJTiwgIk1haW4iIH0sCi0gICAgeyBGRl9QUk9GSUxFX0FBQ19MT1csICAiTEMiICAgfSwKLSAgICB7IEZGX1BST0ZJTEVfQUFDX1NTUiwgICJTU1IiICB9LAotICAgIHsgRkZfUFJPRklMRV9BQUNfTFRQLCAgIkxUUCIgIH0sCi0gICAgeyBGRl9QUk9GSUxFX1VOS05PV04gfSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50NjRfdCBmYWFjX2NoYW5uZWxfbGF5b3V0c1tdID0gewotICAgIEFWX0NIX0xBWU9VVF9NT05PLAotICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCi0gICAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5ELAotICAgIEFWX0NIX0xBWU9VVF80UE9JTlQwLAotICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0ssCi0gICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSywKLSAgICAwCi19OwotCi1BVkNvZGVjIGZmX2xpYmZhYWNfZW5jb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAibGliZmFhYyIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYmZhYWMgQUFDIChBZHZhbmNlZCBBdWRpbyBDb2RpbmcpIiksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FBQywKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRmFhY0F1ZGlvQ29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgID0gRmFhY19lbmNvZGVfaW5pdCwKLSAgICAuZW5jb2RlMiAgICAgICAgPSBGYWFjX2VuY29kZV9mcmFtZSwKLSAgICAuY2xvc2UgICAgICAgICAgPSBGYWFjX2VuY29kZV9jbG9zZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfU01BTExfTEFTVF9GUkFNRSB8IEFWX0NPREVDX0NBUF9ERUxBWSwKLSAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAotICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKHByb2ZpbGVzKSwKLSAgICAuY2hhbm5lbF9sYXlvdXRzID0gZmFhY19jaGFubmVsX2xheW91dHMsCi19OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJmZGstYWFjZGVjLmMgYi9saWJhdmNvZGVjL2xpYmZkay1hYWNkZWMuYwppbmRleCBlNWY3YzRlLi42NzdiMTEwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYmZkay1hYWNkZWMuYworKysgYi9saWJhdmNvZGVjL2xpYmZkay1hYWNkZWMuYwpAQCAtNzksNyArNzksMTAgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBBVkNsYXNzIGZka19hYWNfZGVjX2NsYXNzID0gewotICAgICJsaWJmZGstYWFjIGRlY29kZXIiLCBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgZmRrX2FhY19kZWNfb3B0aW9ucywgTElCQVZVVElMX1ZFUlNJT05fSU5UCisgICAgLmNsYXNzX25hbWUgPSAibGliZmRrLWFhYyBkZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZmRrX2FhY19kZWNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKIH07CiAKIHN0YXRpYyBpbnQgZ2V0X3N0cmVhbV9pbmZvKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKQEAgLTMyNSw3ICszMjgsNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBlcnIgPSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKHMtPmhhbmRsZSwgKElOVF9QQ00gKikgcy0+ZGVjb2Rlcl9idWZmZXIsIHMtPmRlY29kZXJfYnVmZmVyX3NpemUsIDApOworICAgIGVyciA9IGFhY0RlY29kZXJfRGVjb2RlRnJhbWUocy0+aGFuZGxlLCAoSU5UX1BDTSAqKSBzLT5kZWNvZGVyX2J1ZmZlciwgcy0+ZGVjb2Rlcl9idWZmZXJfc2l6ZSAvIHNpemVvZihJTlRfUENNKSwgMCk7CiAgICAgaWYgKGVyciA9PSBBQUNfREVDX05PVF9FTk9VR0hfQklUUykgewogICAgICAgICByZXQgPSBhdnBrdC0+c2l6ZSAtIHZhbGlkOwogICAgICAgICBnb3RvIGVuZDsKQEAgLTM4Miw0ICszODUsNSBAQAogICAgIC5wcml2X2NsYXNzICAgICA9ICZmZGtfYWFjX2RlY19jbGFzcywKICAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFIHwKICAgICAgICAgICAgICAgICAgICAgICBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJmZGsiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGliZmRrLWFhY2VuYy5jIGIvbGliYXZjb2RlYy9saWJmZGstYWFjZW5jLmMKaW5kZXggOThhODE3Yi4uZDQ3MTM3YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJmZGstYWFjZW5jLmMKKysrIGIvbGliYXZjb2RlYy9saWJmZGstYWFjZW5jLmMKQEAgLTU0LDcgKzU0LDEwIEBACiB9OwogCiBzdGF0aWMgY29uc3QgQVZDbGFzcyBhYWNfZW5jX2NsYXNzID0gewotICAgICJsaWJmZGtfYWFjIiwgYXZfZGVmYXVsdF9pdGVtX25hbWUsIGFhY19lbmNfb3B0aW9ucywgTElCQVZVVElMX1ZFUlNJT05fSU5UCisgICAgLmNsYXNzX25hbWUgPSAibGliZmRrX2FhYyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGFhY19lbmNfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICphYWNfZ2V0X2Vycm9yKEFBQ0VOQ19FUlJPUiBlcnIpCkBAIC0yMTYsNyArMjE5LDcgQEAKICAgICAgICAgaWYgKChlcnIgPSBhYWNFbmNvZGVyX1NldFBhcmFtKHMtPmhhbmRsZSwgQUFDRU5DX0JJVFJBVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUpKSAhPSBBQUNFTkNfT0spIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCB0aGUgYml0cmF0ZSAlIlBSSWQ2NCI6ICVzXG4iLAotICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KWF2Y3R4LT5iaXRfcmF0ZSwgYWFjX2dldF9lcnJvcihlcnIpKTsKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUsIGFhY19nZXRfZXJyb3IoZXJyKSk7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAgICAgfQpAQCAtNDI1LDQgKzQyOCw1IEBACiAgICAgLnByb2ZpbGVzICAgICAgICAgICAgICA9IHByb2ZpbGVzLAogICAgIC5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMgPSBhYWNfc2FtcGxlX3JhdGVzLAogICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgPSBhYWNfY2hhbm5lbF9sYXlvdXQsCisgICAgLndyYXBwZXJfbmFtZSAgICAgICAgICA9ICJsaWJmZGsiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGliZ3NtZGVjLmMgYi9saWJhdmNvZGVjL2xpYmdzbWRlYy5jCmluZGV4IGE1MDMyMTUuLjg5ZTFkZTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGliZ3NtZGVjLmMKKysrIGIvbGliYXZjb2RlYy9saWJnc21kZWMuYwpAQCAtMTM1LDYgKzEzNSw3IEBACiAgICAgLmRlY29kZSAgICAgICAgID0gbGliZ3NtX2RlY29kZV9mcmFtZSwKICAgICAuZmx1c2ggICAgICAgICAgPSBsaWJnc21fZmx1c2gsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGliZ3NtIiwKIH07CiAjZW5kaWYKICNpZiBDT05GSUdfTElCR1NNX01TX0RFQ09ERVIKQEAgLTE0OSw1ICsxNTAsNiBAQAogICAgIC5kZWNvZGUgICAgICAgICA9IGxpYmdzbV9kZWNvZGVfZnJhbWUsCiAgICAgLmZsdXNoICAgICAgICAgID0gbGliZ3NtX2ZsdXNoLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYmdzbSIsCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYmdzbWVuYy5jIGIvbGliYXZjb2RlYy9saWJnc21lbmMuYwppbmRleCA2OWNlNDM5Li5jOWU3YmEwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYmdzbWVuYy5jCisrKyBiL2xpYmF2Y29kZWMvbGliZ3NtZW5jLmMKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgYXZjdHgtPmJpdF9yYXRlICE9IDEzMjAwIC8qIFZlcnkgY29tbW9uICovICYmCiAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSAhPSAwIC8qIFVua25vd247IGEuby4gbW92IGRvZXMgbm90IHNldCBiaXRyYXRlIHdoZW4gZGVjb2RpbmcgKi8gKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQml0cmF0ZSAxMzAwMGJwcyByZXF1aXJlZCBmb3IgR1NNLCBnb3QgJSJQUklkNjQiYnBzXG4iLAotICAgICAgICAgICAgICAgKGludDY0X3QpYXZjdHgtPmJpdF9yYXRlKTsKKyAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSk7CiAgICAgICAgIGlmIChhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9VTk9GRklDSUFMKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTEyNiw2ICsxMjYsNyBAQAogICAgIC5jbG9zZSAgICAgICAgICA9IGxpYmdzbV9lbmNvZGVfY2xvc2UsCiAgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGliZ3NtIiwKIH07CiAjZW5kaWYKICNpZiBDT05GSUdfTElCR1NNX01TX0VOQ09ERVIKQEAgLTEzOSw1ICsxNDAsNiBAQAogICAgIC5jbG9zZSAgICAgICAgICA9IGxpYmdzbV9lbmNvZGVfY2xvc2UsCiAgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IEFWX1NBTVBMRV9GTVRfUzE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGliZ3NtIiwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGliaWxiYy5jIGIvbGliYXZjb2RlYy9saWJpbGJjLmMKaW5kZXggYzRjMDU0Zi4uOWE1NmNjOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJpbGJjLmMKKysrIGIvbGliYXZjb2RlYy9saWJpbGJjLmMKQEAgLTE5Myw0ICsxOTMsNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKICAgICAuZGVmYXVsdHMgICAgICAgPSBpbGJjX2VuY29kZV9kZWZhdWx0cywKICAgICAucHJpdl9jbGFzcyAgICAgPSAmaWxiY19lbmNfY2xhc3MsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYmJpbGJjIiwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYmt2YXphYXIuYyBiL2xpYmF2Y29kZWMvbGlia3ZhemFhci5jCmluZGV4IDc5ZmRlNDEuLjQxYTFiYmIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlia3ZhemFhci5jCisrKyBiL2xpYmF2Y29kZWMvbGlia3ZhemFhci5jCkBAIC0yMSwxMyArMjEsMTcgQEAKICAqLwogCiAjaW5jbHVkZSA8a3ZhemFhci5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAKQEAgLTIyNyw3ICsyMzEsNyBAQAogICAgICAgICBrdnpfZGF0YV9jaHVuayAqY2h1bmsgPSBOVUxMOwogICAgICAgICB1aW50NjRfdCB3cml0dGVuID0gMDsKIAotICAgICAgICByZXR2YWwgPSBmZl9hbGxvY19wYWNrZXQoYXZwa3QsIGxlbl9vdXQpOworICAgICAgICByZXR2YWwgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgbGVuX291dCwgbGVuX291dCk7CiAgICAgICAgIGlmIChyZXR2YWwgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBvdXRwdXQgcGFja2V0LlxuIik7CiAgICAgICAgICAgICBnb3RvIGRvbmU7CkBAIC0zMDEsNCArMzA1LDYgQEAKICAgICAuY2xvc2UgICAgICAgICAgICA9IGxpYmt2YXphYXJfY2xvc2UsCiAKICAgICAuY2Fwc19pbnRlcm5hbCAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfCBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorCisgICAgLndyYXBwZXJfbmFtZSAgICAgPSAibGlia3ZhemFhciIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJtcDNsYW1lLmMgYi9saWJhdmNvZGVjL2xpYm1wM2xhbWUuYwppbmRleCA1NjQyMjY0Li5lY2RkMmUzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYm1wM2xhbWUuYworKysgYi9saWJhdmNvZGVjL2xpYm1wM2xhbWUuYwpAQCAtNTAsNiArNTAsNyBAQAogICAgIGludCByZXNlcnZvaXI7CiAgICAgaW50IGpvaW50X3N0ZXJlbzsKICAgICBpbnQgYWJyOworICAgIGludCBkZWxheV9zZW50OwogICAgIGZsb2F0ICpzYW1wbGVzX2ZsdFsyXTsKICAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOwogICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOwpAQCAtMTI0LDYgKzEyNSwxMCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogbG93cGFzcyBjdXRvZmYgZnJlcXVlbmN5ICovCisgICAgaWYgKGF2Y3R4LT5jdXRvZmYpCisgICAgICAgIGxhbWVfc2V0X2xvd3Bhc3NmcmVxKHMtPmdmcCwgYXZjdHgtPmN1dG9mZik7CisKICAgICAvKiBkbyBub3QgZ2V0IGEgWGluZyBWQlIgaGVhZGVyIGZyYW1lIGZyb20gTEFNRSAqLwogICAgIGxhbWVfc2V0X2JXcml0ZVZiclRhZyhzLT5nZnAsMCk7CiAKQEAgLTE4NSw3ICsxOTAsNyBAQAogewogICAgIExBTUVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBNUEFEZWNvZGVIZWFkZXIgaGRyOwotICAgIGludCBsZW4sIHJldCwgY2g7CisgICAgaW50IGxlbiwgcmV0LCBjaCwgZGlzY2FyZF9wYWRkaW5nOwogICAgIGludCBsYW1lX3Jlc3VsdDsKICAgICB1aW50MzJfdCBoOwogCkBAIC0yNjksNiArMjc0LDMwIEBACiAgICAgICAgIGZmX2FmX3F1ZXVlX3JlbW92ZSgmcy0+YWZxLCBhdmN0eC0+ZnJhbWVfc2l6ZSwgJmF2cGt0LT5wdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZwa3QtPmR1cmF0aW9uKTsKIAorICAgICAgICBkaXNjYXJkX3BhZGRpbmcgPSBhdmN0eC0+ZnJhbWVfc2l6ZSAtIGF2cGt0LT5kdXJhdGlvbjsKKyAgICAgICAgLy8gQ2hlY2sgaWYgc3VidHJhY3Rpb24gcmVzdWx0ZWQgaW4gYW4gb3ZlcmZsb3cKKyAgICAgICAgaWYgKChkaXNjYXJkX3BhZGRpbmcgPCBhdmN0eC0+ZnJhbWVfc2l6ZSkgIT0gKGF2cGt0LT5kdXJhdGlvbiA+IDApKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImRpc2NhcmQgcGFkZGluZyBvdmVyZmxvd1xuIik7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoYXZwa3QpOworICAgICAgICAgICAgYXZfZnJlZShhdnBrdCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmICgoIXMtPmRlbGF5X3NlbnQgJiYgYXZjdHgtPmluaXRpYWxfcGFkZGluZyA+IDApIHx8IGRpc2NhcmRfcGFkZGluZyA+IDApIHsKKyAgICAgICAgICAgIHVpbnQ4X3QqIHNpZGVfZGF0YSA9IGF2X3BhY2tldF9uZXdfc2lkZV9kYXRhKGF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfU0tJUF9TQU1QTEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTApOworICAgICAgICAgICAgaWYoIXNpZGVfZGF0YSkgeworICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihhdnBrdCk7CisgICAgICAgICAgICAgICAgYXZfZnJlZShhdnBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghcy0+ZGVsYXlfc2VudCkgeworICAgICAgICAgICAgICAgIEFWX1dMMzIoc2lkZV9kYXRhLCBhdmN0eC0+aW5pdGlhbF9wYWRkaW5nKTsKKyAgICAgICAgICAgICAgICBzLT5kZWxheV9zZW50ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFWX1dMMzIoc2lkZV9kYXRhICsgNCwgZGlzY2FyZF9wYWRkaW5nKTsKKyAgICAgICAgfQorCiAgICAgICAgIGF2cGt0LT5zaXplID0gbGVuOwogICAgICAgICAqZ290X3BhY2tldF9wdHIgPSAxOwogICAgIH0KQEAgLTMyMCw0ICszNDksNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIH0sCiAgICAgLnByaXZfY2xhc3MgICAgICAgICAgICA9ICZsaWJtcDNsYW1lX2NsYXNzLAogICAgIC5kZWZhdWx0cyAgICAgICAgICAgICAgPSBsaWJtcDNsYW1lX2RlZmF1bHRzLAorICAgIC53cmFwcGVyX25hbWUgICAgICAgICAgPSAibGlibXAzbGFtZSIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJvcGVuY29yZS1hbXIuYyBiL2xpYmF2Y29kZWMvbGlib3BlbmNvcmUtYW1yLmMKaW5kZXggZjBlMzQyNi4uNTE2ZjYyNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJvcGVuY29yZS1hbXIuYworKysgYi9saWJhdmNvZGVjL2xpYm9wZW5jb3JlLWFtci5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIEFNUiBBdWRpbyBkZWNvZGVyIHN0dWIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMTksNiArMTksOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgpAQCAtMTExLDEzICsxMTMsMTMgQEAKICAgICBwYWNrZXRfc2l6ZSA9IGJsb2NrX3NpemVbZGVjX21vZGVdICsgMTsKIAogICAgIGlmIChwYWNrZXRfc2l6ZSA+IGJ1Zl9zaXplKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYW1yIGZyYW1lIHRvbyBzaG9ydCAoJXUsIHNob3VsZCBiZSAldSlcbiIsCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQU1SIGZyYW1lIHRvbyBzaG9ydCAoJWQsIHNob3VsZCBiZSAlZClcbiIsCiAgICAgICAgICAgICAgICBidWZfc2l6ZSwgcGFja2V0X3NpemUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBmZl9kbG9nKGF2Y3R4LCAicGFja2V0X3NpemU9JWQgYnVmPSAweCVYICVYICVYICVYXG4iLAotICAgICAgICAgICAgICBwYWNrZXRfc2l6ZSwgYnVmWzBdLCBidWZbMV0sIGJ1ZlsyXSwgYnVmWzNdKTsKKyAgICBmZl9kbG9nKGF2Y3R4LCAicGFja2V0X3NpemU9JWQgYnVmPSAweCUiUFJJeDgiICUiUFJJeDgiICUiUFJJeDgiICUiUFJJeDgiXG4iLAorICAgICAgICAgICAgcGFja2V0X3NpemUsIGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0sIGJ1ZlszXSk7CiAgICAgLyogY2FsbCBkZWNvZGVyICovCiAgICAgRGVjb2Rlcl9JbnRlcmZhY2VfRGVjb2RlKHMtPmRlY19zdGF0ZSwgYnVmLCAoc2hvcnQgKilmcmFtZS0+ZGF0YVswXSwgMCk7CiAKQEAgLTE0OSw3ICsxNTEsNyBAQAogLyogTWF0Y2ggZGVzaXJlZCBiaXRyYXRlICovCiBzdGF0aWMgaW50IGdldF9iaXRyYXRlX21vZGUoaW50IGJpdHJhdGUsIHZvaWQgKmxvZ19jdHgpCiB7Ci0gICAgLyogbWFrZSB0aGUgY29ycmVzcG9uZGFuY2UgYmV0d2VlbiBiaXRyYXRlIGFuZCBtb2RlICovCisgICAgLyogbWFrZSB0aGUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBiaXRyYXRlIGFuZCBtb2RlICovCiAgICAgc3RhdGljIGNvbnN0IEFNUl9iaXRyYXRlcyByYXRlc1tdID0gewogICAgICAgICB7IDQ3NTAsIE1SNDc1IH0sIHsgNTE1MCwgTVI1MTUgfSwgeyAgNTkwMCwgTVI1OSAgfSwgeyAgNjcwMCwgTVI2NyAgfSwKICAgICAgICAgeyA3NDAwLCBNUjc0IH0sICB7IDc5NTAsIE1SNzk1IH0sIHsgMTAyMDAsIE1SMTAyIH0sIHsgMTIyMDAsIE1SMTIyIH0KQEAgLTE4MSw3ICsxODMsMTAgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBBVkNsYXNzIGFtcm5iX2NsYXNzID0gewotICAgICJsaWJvcGVuY29yZV9hbXJuYiIsIGF2X2RlZmF1bHRfaXRlbV9uYW1lLCBvcHRpb25zLCBMSUJBVlVUSUxfVkVSU0lPTl9JTlQKKyAgICAuY2xhc3NfbmFtZSA9ICJsaWJvcGVuY29yZV9hbXJuYiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCiBzdGF0aWMgYXZfY29sZCBpbnQgYW1yX25iX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKQEAgLTMzOSw3ICszNDQsNyBAQAogICAgIHBhY2tldF9zaXplID0gYmxvY2tfc2l6ZVttb2RlXTsKIAogICAgIGlmIChwYWNrZXRfc2l6ZSA+IGJ1Zl9zaXplKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYW1yIGZyYW1lIHRvbyBzaG9ydCAoJXUsIHNob3VsZCBiZSAldSlcbiIsCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQU1SIGZyYW1lIHRvbyBzaG9ydCAoJWQsIHNob3VsZCBiZSAlZClcbiIsCiAgICAgICAgICAgICAgICBidWZfc2l6ZSwgcGFja2V0X3NpemUgKyAxKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtMzczLDYgKzM3OCw3IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gYW1yX3diX2RlY29kZV9jbG9zZSwKICAgICAuZGVjb2RlICAgICAgICAgPSBhbXJfd2JfZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYm9wZW5jb3JlX2FtcndiIiwKIH07CiAKICNlbmRpZiAvKiBDT05GSUdfTElCT1BFTkNPUkVfQU1SV0JfREVDT0RFUiAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJvcGVuaDI2NC5jIGIvbGliYXZjb2RlYy9saWJvcGVuaDI2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzYxYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2xpYm9wZW5oMjY0LmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIE9wZW5IMjY0IHNoYXJlZCB1dGlscworICogQ29weXJpZ2h0IChDKSAyMDE0IE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx3ZWxzL2NvZGVjX2FwaS5oPgorI2luY2x1ZGUgPHdlbHMvY29kZWNfdmVyLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisKKyNpbmNsdWRlICJsaWJvcGVuaDI2NC5oIgorCisvLyBDb252ZXJ0IGxpYm9wZW5oMjY0IGxvZyBsZXZlbCB0byBlcXVpdmFsZW50IGZmbXBlZyBsb2cgbGV2ZWwuCitzdGF0aWMgaW50IGxpYm9wZW5oMjY0X3RvX2ZmbXBlZ19sb2dfbGV2ZWwoaW50IGxpYm9wZW5oMjY0X2xvZ19sZXZlbCkKK3sKKyAgICBpZiAgICAgIChsaWJvcGVuaDI2NF9sb2dfbGV2ZWwgPj0gV0VMU19MT0dfREVUQUlMKSAgcmV0dXJuIEFWX0xPR19UUkFDRTsKKyAgICBlbHNlIGlmIChsaWJvcGVuaDI2NF9sb2dfbGV2ZWwgPj0gV0VMU19MT0dfREVCVUcpICAgcmV0dXJuIEFWX0xPR19ERUJVRzsKKyAgICBlbHNlIGlmIChsaWJvcGVuaDI2NF9sb2dfbGV2ZWwgPj0gV0VMU19MT0dfSU5GTykgICAgcmV0dXJuIEFWX0xPR19WRVJCT1NFOworICAgIGVsc2UgaWYgKGxpYm9wZW5oMjY0X2xvZ19sZXZlbCA+PSBXRUxTX0xPR19XQVJOSU5HKSByZXR1cm4gQVZfTE9HX1dBUk5JTkc7CisgICAgZWxzZSBpZiAobGlib3BlbmgyNjRfbG9nX2xldmVsID49IFdFTFNfTE9HX0VSUk9SKSAgIHJldHVybiBBVl9MT0dfRVJST1I7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVl9MT0dfUVVJRVQ7Cit9CisKK3ZvaWQgZmZfbGlib3BlbmgyNjRfdHJhY2VfY2FsbGJhY2sodm9pZCAqY3R4LCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKm1zZykKK3sKKyAgICAvLyBUaGUgbWVzc2FnZSB3aWxsIGJlIGxvZ2dlZCBvbmx5IGlmIHRoZSByZXF1ZXN0ZWQgRVFVSVZBTEVOVCBmZm1wZWcgbG9nIGxldmVsIGlzCisgICAgLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGZmbXBlZyBsb2cgbGV2ZWwuCisgICAgaW50IGVxdWl2X2ZmbXBlZ19sb2dfbGV2ZWwgPSBsaWJvcGVuaDI2NF90b19mZm1wZWdfbG9nX2xldmVsKGxldmVsKTsKKyAgICBhdl9sb2coY3R4LCBlcXVpdl9mZm1wZWdfbG9nX2xldmVsLCAiJXNcbiIsIG1zZyk7Cit9CisKK2ludCBmZl9saWJvcGVuaDI2NF9jaGVja192ZXJzaW9uKHZvaWQgKmxvZ2N0eCkKK3sKKyAgICAvLyBNaW5ndyBHQ0MgPCA0Ljcgb24geDg2XzMyIHVzZXMgYW4gaW5jb3JyZWN0L2J1Z2d5IEFCSSBmb3IgdGhlIFdlbHNHZXRDb2RlY1ZlcnNpb24KKyAgICAvLyBmdW5jdGlvbiAoZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgbGFyZ2VyIHN0cnVjdHMpLCB0aHVzIHNraXAgdGhlIGNoZWNrIGluIHRob3NlCisgICAgLy8gY29uZmlndXJhdGlvbnMuCisjaWYgIWRlZmluZWQoX1dJTjMyKSB8fCAhZGVmaW5lZChfX0dOVUNfXykgfHwgIUFSQ0hfWDg2XzMyIHx8IEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDQsIDcpCisgICAgT3BlbkgyNjRWZXJzaW9uIGxpYnZlciA9IFdlbHNHZXRDb2RlY1ZlcnNpb24oKTsKKyAgICBpZiAobWVtY21wKCZsaWJ2ZXIsICZnX3N0Q29kZWNWZXJzaW9uLCBzaXplb2YobGlidmVyKSkpIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IGxpYnJhcnkgdmVyc2lvbiBsb2FkZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJvcGVuaDI2NC5oIGIvbGliYXZjb2RlYy9saWJvcGVuaDI2NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYjljNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2xpYm9wZW5oMjY0LmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIE9wZW5IMjY0IHNoYXJlZCB1dGlscworICogQ29weXJpZ2h0IChDKSAyMDE0IE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19MSUJPUEVOSDI2NF9ICisjZGVmaW5lIEFWQ09ERUNfTElCT1BFTkgyNjRfSAorCisjZGVmaW5lIE9QRU5IMjY0X1ZFUl9BVF9MRUFTVChtYWosIG1pbikgXAorICAgICgoT1BFTkgyNjRfTUFKT1IgID4gKG1haikpIHx8IFwKKyAgICAgKE9QRU5IMjY0X01BSk9SID09IChtYWopICYmIE9QRU5IMjY0X01JTk9SID49IChtaW4pKSkKKworLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIHByb3ZpZGVkIHRvIHRoZSBsaWJvcGVuaDI2NCBsaWJyYXJ5LiAgVGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisvLyB3aGVuIGxpYm9wZW5oMjY0IHdhbnRzIHRvIGxvZyBhIG1lc3NhZ2UgKGVycm9yLCB3YXJuaW5nLCBpbmZvLCBldGMuKS4gIFRoZSBzaWduYXR1cmUgZm9yCisvLyB0aGlzIGZ1bmN0aW9uIChkZWZpbmVkIGluIC4uLi9jb2RlYy9hcGkvc3ZjL2NvZGVjX2FwaS5oKSBpczoKKy8vCisvLyAgICAgICAgdHlwZWRlZiB2b2lkICgqV2Vsc1RyYWNlQ2FsbGJhY2spICh2b2lkKiBjdHgsIGludCBsZXZlbCwgY29uc3QgY2hhciogc3RyaW5nKTsKKwordm9pZCBmZl9saWJvcGVuaDI2NF90cmFjZV9jYWxsYmFjayh2b2lkICpjdHgsIGludCBsZXZlbCwgY29uc3QgY2hhciAqbXNnKTsKKworaW50IGZmX2xpYm9wZW5oMjY0X2NoZWNrX3ZlcnNpb24odm9pZCAqbG9nY3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTElCT1BFTkgyNjRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJvcGVuaDI2NGRlYy5jIGIvbGliYXZjb2RlYy9saWJvcGVuaDI2NGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWQ4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL2xpYm9wZW5oMjY0ZGVjLmMKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBPcGVuSDI2NCB2aWRlbyBkZWNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHdlbHMvY29kZWNfYXBpLmg+CisjaW5jbHVkZSA8d2Vscy9jb2RlY192ZXIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJvcGVuaDI2NC5oIgorCit0eXBlZGVmIHN0cnVjdCBTVkNDb250ZXh0IHsKKyAgICBJU1ZDRGVjb2RlciAqZGVjb2RlcjsKK30gU1ZDQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IHN2Y19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNWQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHMtPmRlY29kZXIpCisgICAgICAgIFdlbHNEZXN0cm95RGVjb2RlcihzLT5kZWNvZGVyKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc3ZjX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTVkNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBTRGVjb2RpbmdQYXJhbSBwYXJhbSA9IHsgMCB9OworICAgIGludCBlcnI7CisgICAgaW50IGxvZ19sZXZlbDsKKyAgICBXZWxzVHJhY2VDYWxsYmFjayBjYWxsYmFja19mdW5jdGlvbjsKKworICAgIGlmICgoZXJyID0gZmZfbGlib3BlbmgyNjRfY2hlY2tfdmVyc2lvbihhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGlmIChXZWxzQ3JlYXRlRGVjb2Rlcigmcy0+ZGVjb2RlcikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlIGRlY29kZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIC8vIFBhc3MgYWxsIGxpYm9wZW5oMjY0IG1lc3NhZ2VzIHRvIG91ciBjYWxsYmFjaywgdG8gYWxsb3cgb3Vyc2VsdmVzIHRvIGZpbHRlciB0aGVtLgorICAgIGxvZ19sZXZlbCA9IFdFTFNfTE9HX0RFVEFJTDsKKyAgICBjYWxsYmFja19mdW5jdGlvbiA9IGZmX2xpYm9wZW5oMjY0X3RyYWNlX2NhbGxiYWNrOworICAgICgqcy0+ZGVjb2RlciktPlNldE9wdGlvbihzLT5kZWNvZGVyLCBERUNPREVSX09QVElPTl9UUkFDRV9MRVZFTCwgJmxvZ19sZXZlbCk7CisgICAgKCpzLT5kZWNvZGVyKS0+U2V0T3B0aW9uKHMtPmRlY29kZXIsIERFQ09ERVJfT1BUSU9OX1RSQUNFX0NBTExCQUNLLCAodm9pZCAqKSZjYWxsYmFja19mdW5jdGlvbik7CisgICAgKCpzLT5kZWNvZGVyKS0+U2V0T3B0aW9uKHMtPmRlY29kZXIsIERFQ09ERVJfT1BUSU9OX1RSQUNFX0NBTExCQUNLX0NPTlRFWFQsICh2b2lkICopJmF2Y3R4KTsKKworI2lmICFPUEVOSDI2NF9WRVJfQVRfTEVBU1QoMSwgNikKKyAgICBwYXJhbS5lT3V0cHV0Q29sb3JGb3JtYXQgPSB2aWRlb0Zvcm1hdEk0MjA7CisjZW5kaWYKKyAgICBwYXJhbS5lRWNBY3RpdmVJZGMgICAgICAgPSBFUlJPUl9DT05fRElTQUJMRTsKKyAgICBwYXJhbS5zVmlkZW9Qcm9wZXJ0eS5lVmlkZW9Cc1R5cGUgPSBWSURFT19CSVRTVFJFQU1fREVGQVVMVDsKKworICAgIGlmICgoKnMtPmRlY29kZXIpLT5Jbml0aWFsaXplKHMtPmRlY29kZXIsICZwYXJhbSkgIT0gY21SZXN1bHRTdWNjZXNzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5pdGlhbGl6ZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3ZjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBTVkNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBTQnVmZmVySW5mbyBpbmZvID0geyAwIH07CisgICAgdWludDhfdCogcHRyc1szXTsKKyAgICBpbnQgcmV0LCBsaW5lc2l6ZVszXTsKKyAgICBBVkZyYW1lICphdmZyYW1lID0gZGF0YTsKKyAgICBERUNPRElOR19TVEFURSBzdGF0ZTsKKworICAgIHN0YXRlID0gKCpzLT5kZWNvZGVyKS0+RGVjb2RlRnJhbWUyKHMtPmRlY29kZXIsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSwgcHRycywgJmluZm8pOworICAgIGlmIChzdGF0ZSAhPSBkc0Vycm9yRnJlZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlY29kZUZyYW1lMiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBpZiAoaW5mby5pQnVmZmVyU3RhdHVzICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJObyBmcmFtZSBwcm9kdWNlZFxuIik7CisgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgaW5mby5Vc3JEYXRhLnNTeXN0ZW1CdWZmZXIuaVdpZHRoLCBpbmZvLlVzckRhdGEuc1N5c3RlbUJ1ZmZlci5pSGVpZ2h0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAvLyBUaGUgZGVjb2RlciBkb2Vzbid0IChjdXJyZW50bHkpIHN1cHBvcnQgZGVjb2RpbmcgaW50byBhIHVzZXIKKyAgICAvLyBwcm92aWRlZCBidWZmZXIsIHNvIGRvIGEgY29weSBpbnN0ZWFkLgorICAgIGlmIChmZl9nZXRfYnVmZmVyKGF2Y3R4LCBhdmZyYW1lLCAwKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBsaW5lc2l6ZVswXSA9IGluZm8uVXNyRGF0YS5zU3lzdGVtQnVmZmVyLmlTdHJpZGVbMF07CisgICAgbGluZXNpemVbMV0gPSBsaW5lc2l6ZVsyXSA9IGluZm8uVXNyRGF0YS5zU3lzdGVtQnVmZmVyLmlTdHJpZGVbMV07CisgICAgYXZfaW1hZ2VfY29weShhdmZyYW1lLT5kYXRhLCBhdmZyYW1lLT5saW5lc2l6ZSwgKGNvbnN0IHVpbnQ4X3QgKiopIHB0cnMsIGxpbmVzaXplLCBhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKKworICAgIGF2ZnJhbWUtPnB0cyAgICAgPSBhdnBrdC0+cHRzOworICAgIGF2ZnJhbWUtPnBrdF9kdHMgPSBhdnBrdC0+ZHRzOworI2lmIEZGX0FQSV9QS1RfUFRTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgYXZmcmFtZS0+cGt0X3B0cyA9IGF2cGt0LT5wdHM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitBVkNvZGVjIGZmX2xpYm9wZW5oMjY0X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImxpYm9wZW5oMjY0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT3BlbkgyNjQgSC4yNjQgLyBBVkMgLyBNUEVHLTQgQVZDIC8gTVBFRy00IHBhcnQgMTAiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU1ZDQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gc3ZjX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHN2Y19kZWNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gc3ZjX2RlY29kZV9jbG9zZSwKKyAgICAvLyBUaGUgZGVjb2RlciBkb2Vzbid0IGN1cnJlbnRseSBzdXBwb3J0IEItZnJhbWVzLCBhbmQgdGhlIGRlY29kZXIncyBBUEkKKyAgICAvLyBkb2Vzbid0IHN1cHBvcnQgcmVvcmRlcmluZy9kZWxheSwgYnV0IHRoZSBCU0YgY291bGQgaW5jdXIgZGVsYXkuCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfU0VUU19QS1RfRFRTIHwgRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8CisgICAgICAgICAgICAgICAgICAgICAgRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKKyAgICAuYnNmcyAgICAgICAgICAgPSAiaDI2NF9tcDR0b2FubmV4YiIsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYm9wZW5oMjY0IiwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYm9wZW5oMjY0ZW5jLmMgYi9saWJhdmNvZGVjL2xpYm9wZW5oMjY0ZW5jLmMKaW5kZXggNjg1MDU2OC4uODNjM2YwYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJvcGVuaDI2NGVuYy5jCisrKyBiL2xpYmF2Y29kZWMvbGlib3BlbmgyNjRlbmMuYwpAQCAtMzEsNiArMzEsMTEgQEAKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYm9wZW5oMjY0LmgiCisKKyNpZiAhT1BFTkgyNjRfVkVSX0FUX0xFQVNUKDEsIDYpCisjZGVmaW5lIFNNX1NJWkVMSU1JVEVEX1NMSUNFIFNNX0RZTl9TTElDRQorI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IFNWQ0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOwpAQCAtNDQsMTggKzQ5LDIzIEBACiAgICAgaW50IGNhYmFjOwogfSBTVkNDb250ZXh0OwogCi0jZGVmaW5lIE9QRU5IMjY0X1ZFUl9BVF9MRUFTVChtYWosIG1pbikgXAotICAgICgoT1BFTkgyNjRfTUFKT1IgID4gKG1haikpIHx8IFwKLSAgICAgKE9QRU5IMjY0X01BSk9SID09IChtYWopICYmIE9QRU5IMjY0X01JTk9SID49IChtaW4pKSkKLQogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU1ZDQ29udGV4dCwgeCkKICNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyNpZiBPUEVOSDI2NF9WRVJfQVRfTEVBU1QoMSwgNikKKyAgICB7ICJzbGljZV9tb2RlIiwgInNldCBzbGljZSBtb2RlIiwgT0ZGU0VUKHNsaWNlX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IFNNX0ZJWEVEU0xDTlVNX1NMSUNFIH0sIFNNX1NJTkdMRV9TTElDRSwgU01fUkVTRVJWRUQsIFZFLCAic2xpY2VfbW9kZSIgfSwKKyNlbHNlCiAgICAgeyAic2xpY2VfbW9kZSIsICJzZXQgc2xpY2UgbW9kZSIsIE9GRlNFVChzbGljZV9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBTTV9BVVRPX1NMSUNFIH0sIFNNX1NJTkdMRV9TTElDRSwgU01fUkVTRVJWRUQsIFZFLCAic2xpY2VfbW9kZSIgfSwKKyNlbmRpZgogICAgICAgICB7ICJmaXhlZCIsICJhIGZpeGVkIG51bWJlciBvZiBzbGljZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gU01fRklYRURTTENOVU1fU0xJQ0UgfSwgMCwgMCwgVkUsICJzbGljZV9tb2RlIiB9LAorI2lmIE9QRU5IMjY0X1ZFUl9BVF9MRUFTVCgxLCA2KQorICAgICAgICB7ICJkeW4iLCAiU2l6ZSBsaW1pdGVkIChjb21wYXRpYmlsaXR5IG5hbWUpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFNNX1NJWkVMSU1JVEVEX1NMSUNFIH0sIDAsIDAsIFZFLCAic2xpY2VfbW9kZSIgfSwKKyAgICAgICAgeyAic2l6ZWxpbWl0ZWQiLCAiU2l6ZSBsaW1pdGVkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFNNX1NJWkVMSU1JVEVEX1NMSUNFIH0sIDAsIDAsIFZFLCAic2xpY2VfbW9kZSIgfSwKKyNlbHNlCiAgICAgICAgIHsgInJvd21iIiwgIm9uZSBzbGljZSBwZXIgcm93IG9mIG1hY3JvYmxvY2tzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFNNX1JPV01CX1NMSUNFIH0sIDAsIDAsIFZFLCAic2xpY2VfbW9kZSIgfSwKICAgICAgICAgeyAiYXV0byIsICJhdXRvbWF0aWMgbnVtYmVyIG9mIHNsaWNlcyBhY2NvcmRpbmcgdG8gbnVtYmVyIG9mIHRocmVhZHMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gU01fQVVUT19TTElDRSB9LCAwLCAwLCBWRSwgInNsaWNlX21vZGUiIH0sCiAgICAgICAgIHsgImR5biIsICJEeW5hbWljIHNsaWNpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gU01fRFlOX1NMSUNFIH0sIDAsIDAsIFZFLCAic2xpY2VfbW9kZSIgfSwKKyNlbmRpZgogICAgIHsgImxvb3BmaWx0ZXIiLCAiZW5hYmxlIGxvb3AgZmlsdGVyIiwgT0ZGU0VUKGxvb3BmaWx0ZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMSwgVkUgfSwKICAgICB7ICJwcm9maWxlIiwgInNldCBwcm9maWxlIHJlc3RyaWN0aW9ucyIsIE9GRlNFVChwcm9maWxlKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIFZFIH0sCiAgICAgeyAibWF4X25hbF9zaXplIiwgInNldCBtYXhpbXVtIE5BTCBzaXplIGluIGJ5dGVzIiwgT0ZGU0VUKG1heF9uYWxfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWRSB9LApAQCAtNjUsMzQgKzc1LDEyIEBACiB9OwogCiBzdGF0aWMgY29uc3QgQVZDbGFzcyBjbGFzcyA9IHsKLSAgICAibGlib3BlbmgyNjRlbmMiLCBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgb3B0aW9ucywgTElCQVZVVElMX1ZFUlNJT05fSU5UCisgICAgLmNsYXNzX25hbWUgPSAibGlidm9fYW1yd2JlbmMiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAotLy8gQ29udmVydCBsaWJvcGVuaDI2NCBsb2cgbGV2ZWwgdG8gZXF1aXZhbGVudCBmZm1wZWcgbG9nIGxldmVsLgotc3RhdGljIGludCBsaWJvcGVuaDI2NF90b19mZm1wZWdfbG9nX2xldmVsKGludCBsaWJvcGVuaDI2NF9sb2dfbGV2ZWwpCi17Ci0gICAgaWYgICAgICAobGlib3BlbmgyNjRfbG9nX2xldmVsID49IFdFTFNfTE9HX0RFVEFJTCkgIHJldHVybiBBVl9MT0dfVFJBQ0U7Ci0gICAgZWxzZSBpZiAobGlib3BlbmgyNjRfbG9nX2xldmVsID49IFdFTFNfTE9HX0RFQlVHKSAgIHJldHVybiBBVl9MT0dfREVCVUc7Ci0gICAgZWxzZSBpZiAobGlib3BlbmgyNjRfbG9nX2xldmVsID49IFdFTFNfTE9HX0lORk8pICAgIHJldHVybiBBVl9MT0dfVkVSQk9TRTsKLSAgICBlbHNlIGlmIChsaWJvcGVuaDI2NF9sb2dfbGV2ZWwgPj0gV0VMU19MT0dfV0FSTklORykgcmV0dXJuIEFWX0xPR19XQVJOSU5HOwotICAgIGVsc2UgaWYgKGxpYm9wZW5oMjY0X2xvZ19sZXZlbCA+PSBXRUxTX0xPR19FUlJPUikgICByZXR1cm4gQVZfTE9HX0VSUk9SOwotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZfTE9HX1FVSUVUOwotfQotCi0vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgcHJvdmlkZWQgdG8gdGhlIGxpYm9wZW5oMjY0IGxpYnJhcnkuICBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQKLS8vIHdoZW4gbGlib3BlbmgyNjQgd2FudHMgdG8gbG9nIGEgbWVzc2FnZSAoZXJyb3IsIHdhcm5pbmcsIGluZm8sIGV0Yy4pLiAgVGhlIHNpZ25hdHVyZSBmb3IKLS8vIHRoaXMgZnVuY3Rpb24gKGRlZmluZWQgaW4gLi4uL2NvZGVjL2FwaS9zdmMvY29kZWNfYXBpLmgpIGlzOgotLy8KLS8vICAgICAgICB0eXBlZGVmIHZvaWQgKCpXZWxzVHJhY2VDYWxsYmFjaykgKHZvaWQqIGN0eCwgaW50IGxldmVsLCBjb25zdCBjaGFyKiBzdHJpbmcpOwotCi1zdGF0aWMgdm9pZCBsaWJvcGVuaDI2NF90cmFjZV9jYWxsYmFjayh2b2lkICpjdHgsIGludCBsZXZlbCwgY2hhciBjb25zdCAqbXNnKQotewotICAgIC8vIFRoZSBtZXNzYWdlIHdpbGwgYmUgbG9nZ2VkIG9ubHkgaWYgdGhlIHJlcXVlc3RlZCBFUVVJVkFMRU5UIGZmbXBlZyBsb2cgbGV2ZWwgaXMKLSAgICAvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgZmZtcGVnIGxvZyBsZXZlbC4KLSAgICBpbnQgZXF1aXZfZmZtcGVnX2xvZ19sZXZlbCA9IGxpYm9wZW5oMjY0X3RvX2ZmbXBlZ19sb2dfbGV2ZWwobGV2ZWwpOwotICAgIGF2X2xvZyhjdHgsIGVxdWl2X2ZmbXBlZ19sb2dfbGV2ZWwsICIlc1xuIiwgbXNnKTsKLX0KLQogc3RhdGljIGF2X2NvbGQgaW50IHN2Y19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIFNWQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwpAQCAtMTA4LDIxICs5NiwxMyBAQAogewogICAgIFNWQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIFNFbmNQYXJhbUV4dCBwYXJhbSA9IHsgMCB9OwotICAgIGludCBlcnIgPSBBVkVSUk9SX1VOS05PV047CisgICAgaW50IGVycjsKICAgICBpbnQgbG9nX2xldmVsOwogICAgIFdlbHNUcmFjZUNhbGxiYWNrIGNhbGxiYWNrX2Z1bmN0aW9uOwogICAgIEFWQ1BCUHJvcGVydGllcyAqcHJvcHM7CiAKLSAgICAvLyBNaW5ndyBHQ0MgPCA0Ljcgb24geDg2XzMyIHVzZXMgYW4gaW5jb3JyZWN0L2J1Z2d5IEFCSSBmb3IgdGhlIFdlbHNHZXRDb2RlY1ZlcnNpb24KLSAgICAvLyBmdW5jdGlvbiAoZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgbGFyZ2VyIHN0cnVjdHMpLCB0aHVzIHNraXAgdGhlIGNoZWNrIGluIHRob3NlCi0gICAgLy8gY29uZmlndXJhdGlvbnMuCi0jaWYgIWRlZmluZWQoX1dJTjMyKSB8fCAhZGVmaW5lZChfX0dOVUNfXykgfHwgIUFSQ0hfWDg2XzMyIHx8IEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDQsIDcpCi0gICAgT3BlbkgyNjRWZXJzaW9uIGxpYnZlciA9IFdlbHNHZXRDb2RlY1ZlcnNpb24oKTsKLSAgICBpZiAobWVtY21wKCZsaWJ2ZXIsICZnX3N0Q29kZWNWZXJzaW9uLCBzaXplb2YobGlidmVyKSkpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgbGlicmFyeSB2ZXJzaW9uIGxvYWRlZFxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotI2VuZGlmCisgICAgaWYgKChlcnIgPSBmZl9saWJvcGVuaDI2NF9jaGVja192ZXJzaW9uKGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOwogCiAgICAgaWYgKFdlbHNDcmVhdGVTVkNFbmNvZGVyKCZzLT5lbmNvZGVyKSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgZW5jb2RlclxuIik7CkBAIC0xMzQsMTEgKzExNCwxMSBAQAogICAgICgqcy0+ZW5jb2RlciktPlNldE9wdGlvbihzLT5lbmNvZGVyLCBFTkNPREVSX09QVElPTl9UUkFDRV9MRVZFTCwgJmxvZ19sZXZlbCk7CiAKICAgICAvLyBTZXQgdGhlIGxvZ2dpbmcgY2FsbGJhY2sgZnVuY3Rpb24gdG8gb25lIHRoYXQgdXNlcyBhdl9sb2coKSAoc2VlIGltcGxlbWVudGF0aW9uIGFib3ZlKS4KLSAgICBjYWxsYmFja19mdW5jdGlvbiA9IChXZWxzVHJhY2VDYWxsYmFjaykgbGlib3BlbmgyNjRfdHJhY2VfY2FsbGJhY2s7Ci0gICAgKCpzLT5lbmNvZGVyKS0+U2V0T3B0aW9uKHMtPmVuY29kZXIsIEVOQ09ERVJfT1BUSU9OX1RSQUNFX0NBTExCQUNLLCAodm9pZCAqKSZjYWxsYmFja19mdW5jdGlvbik7CisgICAgY2FsbGJhY2tfZnVuY3Rpb24gPSAoV2Vsc1RyYWNlQ2FsbGJhY2spIGZmX2xpYm9wZW5oMjY0X3RyYWNlX2NhbGxiYWNrOworICAgICgqcy0+ZW5jb2RlciktPlNldE9wdGlvbihzLT5lbmNvZGVyLCBFTkNPREVSX09QVElPTl9UUkFDRV9DQUxMQkFDSywgJmNhbGxiYWNrX2Z1bmN0aW9uKTsKIAogICAgIC8vIFNldCB0aGUgQVZDb2RlY0NvbnRleHQgYXMgdGhlIGxpYm9wZW5oMjY0IGNhbGxiYWNrIGNvbnRleHQgc28gdGhhdCBpdCBjYW4gYmUgcGFzc2VkIHRvIGF2X2xvZygpLgotICAgICgqcy0+ZW5jb2RlciktPlNldE9wdGlvbihzLT5lbmNvZGVyLCBFTkNPREVSX09QVElPTl9UUkFDRV9DQUxMQkFDS19DT05URVhULCAodm9pZCAqKSZhdmN0eCk7CisgICAgKCpzLT5lbmNvZGVyKS0+U2V0T3B0aW9uKHMtPmVuY29kZXIsIEVOQ09ERVJfT1BUSU9OX1RSQUNFX0NBTExCQUNLX0NPTlRFWFQsICZhdmN0eCk7CiAKICAgICAoKnMtPmVuY29kZXIpLT5HZXREZWZhdWx0UGFyYW1zKHMtPmVuY29kZXIsICZwYXJhbSk7CiAKQEAgLTE4NCwzNCArMTY0LDQ1IEBACiAgICAgcGFyYW0uc1NwYXRpYWxMYXllcnNbMF0uaVNwYXRpYWxCaXRyYXRlICAgICA9IHBhcmFtLmlUYXJnZXRCaXRyYXRlOwogICAgIHBhcmFtLnNTcGF0aWFsTGF5ZXJzWzBdLmlNYXhTcGF0aWFsQml0cmF0ZSAgPSBwYXJhbS5pTWF4Qml0cmF0ZTsKIAotICAgIGlmICgoYXZjdHgtPnNsaWNlcyA+IDEpICYmIChzLT5tYXhfbmFsX3NpemUpKXsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LEFWX0xPR19FUlJPUiwiSW52YWxpZCBjb21iaW5hdGlvbiAtc2xpY2VzICVkIGFuZCAtbWF4X25hbF9zaXplICVkLlxuIixhdmN0eC0+c2xpY2VzLHMtPm1heF9uYWxfc2l6ZSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoKGF2Y3R4LT5zbGljZXMgPiAxKSAmJiAocy0+bWF4X25hbF9zaXplKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIGNvbWJpbmF0aW9uIC1zbGljZXMgJWQgYW5kIC1tYXhfbmFsX3NpemUgJWQuXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnNsaWNlcywgcy0+bWF4X25hbF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKICAgICBpZiAoYXZjdHgtPnNsaWNlcyA+IDEpCiAgICAgICAgIHMtPnNsaWNlX21vZGUgPSBTTV9GSVhFRFNMQ05VTV9TTElDRTsKIAogICAgIGlmIChzLT5tYXhfbmFsX3NpemUpCi0gICAgICAgIHMtPnNsaWNlX21vZGUgPSBTTV9EWU5fU0xJQ0U7CisgICAgICAgIHMtPnNsaWNlX21vZGUgPSBTTV9TSVpFTElNSVRFRF9TTElDRTsKIAorI2lmIE9QRU5IMjY0X1ZFUl9BVF9MRUFTVCgxLCA2KQorICAgIHBhcmFtLnNTcGF0aWFsTGF5ZXJzWzBdLnNTbGljZUFyZ3VtZW50LnVpU2xpY2VNb2RlID0gcy0+c2xpY2VfbW9kZTsKKyAgICBwYXJhbS5zU3BhdGlhbExheWVyc1swXS5zU2xpY2VBcmd1bWVudC51aVNsaWNlTnVtICA9IGF2Y3R4LT5zbGljZXM7CisjZWxzZQogICAgIHBhcmFtLnNTcGF0aWFsTGF5ZXJzWzBdLnNTbGljZUNmZy51aVNsaWNlTW9kZSAgICAgICAgICAgICAgID0gcy0+c2xpY2VfbW9kZTsKICAgICBwYXJhbS5zU3BhdGlhbExheWVyc1swXS5zU2xpY2VDZmcuc1NsaWNlQXJndW1lbnQudWlTbGljZU51bSA9IGF2Y3R4LT5zbGljZXM7CisjZW5kaWYKIAotICAgIGlmIChzLT5zbGljZV9tb2RlID09IFNNX0RZTl9TTElDRSkgeworICAgIGlmIChzLT5zbGljZV9tb2RlID09IFNNX1NJWkVMSU1JVEVEX1NMSUNFKSB7CiAgICAgICAgIGlmIChzLT5tYXhfbmFsX3NpemUpewogICAgICAgICAgICAgcGFyYW0udWlNYXhOYWxTaXplID0gcy0+bWF4X25hbF9zaXplOworI2lmIE9QRU5IMjY0X1ZFUl9BVF9MRUFTVCgxLCA2KQorICAgICAgICAgICAgcGFyYW0uc1NwYXRpYWxMYXllcnNbMF0uc1NsaWNlQXJndW1lbnQudWlTbGljZVNpemVDb25zdHJhaW50ID0gcy0+bWF4X25hbF9zaXplOworI2Vsc2UKICAgICAgICAgICAgIHBhcmFtLnNTcGF0aWFsTGF5ZXJzWzBdLnNTbGljZUNmZy5zU2xpY2VBcmd1bWVudC51aVNsaWNlU2l6ZUNvbnN0cmFpbnQgPSBzLT5tYXhfbmFsX3NpemU7CisjZW5kaWYKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCAtbWF4X25hbF9zaXplLCAiCiAgICAgICAgICAgICAgICAgICAgInNwZWNpZnkgYSB2YWxpZCBtYXhfbmFsX3NpemUgdG8gdXNlIC1zbGljZV9tb2RlIGR5blxuIik7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKCgqcy0+ZW5jb2RlciktPkluaXRpYWxpemVFeHQocy0+ZW5jb2RlciwgJnBhcmFtKSAhPSBjbVJlc3VsdFN1Y2Nlc3MpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbml0aWFsaXplIGZhaWxlZFxuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7CkBAIC0yMjEsMjcgKzIxMiwxOSBAQAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmJpLnNMYXllckluZm9bMF0uaU5hbENvdW50OyBpKyspCiAgICAgICAgICAgICBzaXplICs9IGZiaS5zTGF5ZXJJbmZvWzBdLnBOYWxMZW5ndGhJbkJ5dGVbaV07CiAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKSB7Ci0gICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gc2l6ZTsKICAgICAgICAgbWVtY3B5KGF2Y3R4LT5leHRyYWRhdGEsIGZiaS5zTGF5ZXJJbmZvWzBdLnBCc0J1Ziwgc2l6ZSk7CiAgICAgfQogCiAgICAgcHJvcHMgPSBmZl9hZGRfY3BiX3NpZGVfZGF0YShhdmN0eCk7Ci0gICAgaWYgKCFwcm9wcykgewotICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9CisgICAgaWYgKCFwcm9wcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBwcm9wcy0+bWF4X2JpdHJhdGUgPSBwYXJhbS5pTWF4Qml0cmF0ZTsKICAgICBwcm9wcy0+YXZnX2JpdHJhdGUgPSBwYXJhbS5pVGFyZ2V0Qml0cmF0ZTsKIAogICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIHN2Y19lbmNvZGVfY2xvc2UoYXZjdHgpOwotICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgc3ZjX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwKQEAgLTI2Myw2ICsyNDYsMTAgQEAKICAgICBzcC5pUGljV2lkdGggID0gYXZjdHgtPndpZHRoOwogICAgIHNwLmlQaWNIZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OwogCisgICAgaWYgKGZyYW1lLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgKCpzLT5lbmNvZGVyKS0+Rm9yY2VJbnRyYUZyYW1lKHMtPmVuY29kZXIsIHRydWUpOworICAgIH0KKwogICAgIGVuY29kZWQgPSAoKnMtPmVuY29kZXIpLT5FbmNvZGVGcmFtZShzLT5lbmNvZGVyLCAmc3AsICZmYmkpOwogICAgIGlmIChlbmNvZGVkICE9IGNtUmVzdWx0U3VjY2VzcykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVuY29kZUZyYW1lIGZhaWxlZFxuIik7CkBAIC0zMTQsNyArMzAxLDkgQEAKICAgICAuZW5jb2RlMiAgICAgICAgPSBzdmNfZW5jb2RlX2ZyYW1lLAogICAgIC5jbG9zZSAgICAgICAgICA9IHN2Y19lbmNvZGVfY2xvc2UsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0FVVE9fVEhSRUFEUywKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFIHwgRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX1lVVjQyMFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJvcGVuaDI2NCIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJvcGVuanBlZ2RlYy5jIGIvbGliYXZjb2RlYy9saWJvcGVuanBlZ2RlYy5jCmluZGV4IGNhZTNkMjAuLjVlNjZjZDkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlib3BlbmpwZWdkZWMuYworKysgYi9saWJhdmNvZGVjL2xpYm9wZW5qcGVnZGVjLmMKQEAgLTI0LDggKzI0LDYgQEAKICAqIEpQRUcgMjAwMCBkZWNvZGVyIHVzaW5nIGxpYm9wZW5qcGVnCiAgKi8KIAotI2RlZmluZSAgT1BKX1NUQVRJQwotCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKQEAgLTM2LDIzICszNCw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKIAotI2lmIEhBVkVfT1BFTkpQRUdfMl8xX09QRU5KUEVHX0gKLSMgIGluY2x1ZGUgPG9wZW5qcGVnLTIuMS9vcGVuanBlZy5oPgotI2VsaWYgSEFWRV9PUEVOSlBFR18yXzBfT1BFTkpQRUdfSAotIyAgaW5jbHVkZSA8b3BlbmpwZWctMi4wL29wZW5qcGVnLmg+Ci0jZWxpZiBIQVZFX09QRU5KUEVHXzFfNV9PUEVOSlBFR19ICi0jICBpbmNsdWRlIDxvcGVuanBlZy0xLjUvb3BlbmpwZWcuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDxvcGVuanBlZy5oPgotI2VuZGlmCi0KLSNpZiBIQVZFX09QRU5KUEVHXzJfMV9PUEVOSlBFR19IIHx8IEhBVkVfT1BFTkpQRUdfMl8wX09QRU5KUEVHX0gKLSMgIGRlZmluZSBPUEVOSlBFR19NQUpPUl9WRVJTSU9OIDIKLSMgIGRlZmluZSBPUEooeCkgT1BKXyMjeAotI2Vsc2UKLSMgIGRlZmluZSBPUEVOSlBFR19NQUpPUl9WRVJTSU9OIDEKLSMgIGRlZmluZSBPUEooeCkgeAotI2VuZGlmCisjaW5jbHVkZSA8b3BlbmpwZWcuaD4KIAogI2RlZmluZSBKUDJfU0lHX1RZUEUgICAgMHg2QTUwMjAyMAogI2RlZmluZSBKUDJfU0lHX1ZBTFVFICAgMHgwRDBBODcwQQpAQCAtOTUsOSArNzcsNiBAQAogdHlwZWRlZiBzdHJ1Y3QgTGliT3BlbkpQRUdDb250ZXh0IHsKICAgICBBVkNsYXNzICpjbGFzczsKICAgICBvcGpfZHBhcmFtZXRlcnNfdCBkZWNfcGFyYW1zOwotI2lmIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMQotICAgIG9wal9ldmVudF9tZ3JfdCBldmVudF9tZ3I7Ci0jZW5kaWYgLy8gT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAxCiAgICAgaW50IGxvd3F1YWw7CiB9IExpYk9wZW5KUEVHQ29udGV4dDsKIApAQCAtMTE2LDcgKzk1LDYgQEAKICAgICBhdl9sb2coZGF0YSwgQVZfTE9HX0RFQlVHLCAiJXMiLCBtc2cpOwogfQogCi0jaWYgT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAyCiB0eXBlZGVmIHN0cnVjdCBCdWZmZXJSZWFkZXIgewogICAgIGludCBwb3M7CiAgICAgaW50IHNpemU7CkBAIC0xMjYsMTAgKzEwNCwxMiBAQAogc3RhdGljIE9QSl9TSVpFX1Qgc3RyZWFtX3JlYWQodm9pZCAqb3V0X2J1ZmZlciwgT1BKX1NJWkVfVCBuYl9ieXRlcywgdm9pZCAqdXNlcl9kYXRhKQogewogICAgIEJ1ZmZlclJlYWRlciAqcmVhZGVyID0gdXNlcl9kYXRhOworICAgIGludCByZW1haW5pbmc7CisKICAgICBpZiAocmVhZGVyLT5wb3MgPT0gcmVhZGVyLT5zaXplKSB7CiAgICAgICAgIHJldHVybiAoT1BKX1NJWkVfVCktMTsKICAgICB9Ci0gICAgaW50IHJlbWFpbmluZyA9IHJlYWRlci0+c2l6ZSAtIHJlYWRlci0+cG9zOworICAgIHJlbWFpbmluZyA9IHJlYWRlci0+c2l6ZSAtIHJlYWRlci0+cG9zOwogICAgIGlmIChuYl9ieXRlcyA+IHJlbWFpbmluZykgewogICAgICAgICBuYl9ieXRlcyA9IHJlbWFpbmluZzsKICAgICB9CkBAIC0xNDksMTAgKzEyOSwxMiBAQAogICAgICAgICAgICAgbmJfYnl0ZXMgPSAtcmVhZGVyLT5wb3M7CiAgICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgICBpbnQgcmVtYWluaW5nOworCiAgICAgICAgIGlmIChyZWFkZXItPnBvcyA9PSByZWFkZXItPnNpemUpIHsKICAgICAgICAgICAgIHJldHVybiAoT1BKX1NJWkVfVCktMTsKICAgICAgICAgfQotICAgICAgICBpbnQgcmVtYWluaW5nID0gcmVhZGVyLT5zaXplIC0gcmVhZGVyLT5wb3M7CisgICAgICAgIHJlbWFpbmluZyA9IHJlYWRlci0+c2l6ZSAtIHJlYWRlci0+cG9zOwogICAgICAgICBpZiAobmJfYnl0ZXMgPiByZW1haW5pbmcpIHsKICAgICAgICAgICAgIG5iX2J5dGVzID0gcmVtYWluaW5nOwogICAgICAgICB9CkBAIC0xNzAsNyArMTUyLDYgQEAKICAgICByZWFkZXItPnBvcyA9IChpbnQpbmJfYnl0ZXM7CiAgICAgcmV0dXJuIE9QSl9UUlVFOwogfQotI2VuZGlmIC8vIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMgogCiBzdGF0aWMgaW5saW5lIGludCBsaWJvcGVuanBlZ19tYXRjaGVzX3BpeF9mbXQoY29uc3Qgb3BqX2ltYWdlX3QgKmltYWdlLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKIHsKQEAgLTIxNSwxNSArMTk2LDE1IEBACiAgICAgaW50IHBvc3NpYmxlX2ZtdHNfbmIgPSAwOwogCiAgICAgc3dpdGNoIChpbWFnZS0+Y29sb3Jfc3BhY2UpIHsKLSAgICBjYXNlIE9QSihDTFJTUENfU1JHQik6CisgICAgY2FzZSBPUEpfQ0xSU1BDX1NSR0I6CiAgICAgICAgIHBvc3NpYmxlX2ZtdHMgICAgPSBsaWJvcGVuanBlZ19yZ2JfcGl4X2ZtdHM7CiAgICAgICAgIHBvc3NpYmxlX2ZtdHNfbmIgPSBGRl9BUlJBWV9FTEVNUyhsaWJvcGVuanBlZ19yZ2JfcGl4X2ZtdHMpOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIE9QSihDTFJTUENfR1JBWSk6CisgICAgY2FzZSBPUEpfQ0xSU1BDX0dSQVk6CiAgICAgICAgIHBvc3NpYmxlX2ZtdHMgICAgPSBsaWJvcGVuanBlZ19ncmF5X3BpeF9mbXRzOwogICAgICAgICBwb3NzaWJsZV9mbXRzX25iID0gRkZfQVJSQVlfRUxFTVMobGlib3BlbmpwZWdfZ3JheV9waXhfZm10cyk7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BKKENMUlNQQ19TWUNDKToKKyAgICBjYXNlIE9QSl9DTFJTUENfU1lDQzoKICAgICAgICAgcG9zc2libGVfZm10cyAgICA9IGxpYm9wZW5qcGVnX3l1dl9waXhfZm10czsKICAgICAgICAgcG9zc2libGVfZm10c19uYiA9IEZGX0FSUkFZX0VMRU1TKGxpYm9wZW5qcGVnX3l1dl9waXhfZm10cyk7CiAgICAgICAgIGJyZWFrOwpAQCAtMzUwLDE0ICszMzEsOSBAQAogICAgIGludCBpc3BhY2tlZCAgID0gMDsKICAgICBpbnQgaTsKICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UgPSBOVUxMOwotI2lmIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMQotICAgIG9wal9kaW5mb190ICpkZWMgPSBOVUxMOwotICAgIG9wal9jaW9fdCAqc3RyZWFtID0gTlVMTDsKLSNlbHNlIC8vIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMgogICAgIEJ1ZmZlclJlYWRlciByZWFkZXIgPSB7MCwgYXZwa3QtPnNpemUsIGF2cGt0LT5kYXRhfTsKICAgICBvcGpfY29kZWNfdCAqZGVjID0gTlVMTDsKICAgICBvcGpfc3RyZWFtX3QgKnN0cmVhbSA9IE5VTEw7Ci0jZW5kaWYgLy8gT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAxCiAKICAgICAqZ290X2ZyYW1lID0gMDsKIApAQCAtMzY1LDEzICszNDEsMTMgQEAKICAgICBpZiAoKEFWX1JCMzIoYnVmKSA9PSAxMikgJiYKICAgICAgICAgKEFWX1JCMzIoYnVmICsgNCkgPT0gSlAyX1NJR19UWVBFKSAmJgogICAgICAgICAoQVZfUkIzMihidWYgKyA4KSA9PSBKUDJfU0lHX1ZBTFVFKSkgewotICAgICAgICBkZWMgPSBvcGpfY3JlYXRlX2RlY29tcHJlc3MoT1BKKENPREVDX0pQMikpOworICAgICAgICBkZWMgPSBvcGpfY3JlYXRlX2RlY29tcHJlc3MoT1BKX0NPREVDX0pQMik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogSWYgdGhlIEFWUGFja2V0IGNvbnRhaW5zIGEganAyYyBib3gsIHRoZW4gc2tpcCB0bwogICAgICAgICAgKiB0aGUgc3RhcnRpbmcgYnl0ZSBvZiB0aGUgY29kZXN0cmVhbS4gKi8KICAgICAgICAgaWYgKEFWX1JCMzIoYnVmICsgNCkgPT0gQVZfUkIzMigianAyYyIpKQogICAgICAgICAgICAgYnVmICs9IDg7Ci0gICAgICAgIGRlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEooQ09ERUNfSjJLKSk7CisgICAgICAgIGRlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSjJLKTsKICAgICB9CiAKICAgICBpZiAoIWRlYykgewpAQCAtMzgwLDE1ICszNTYsNiBAQAogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCi0jaWYgT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAxCi0gICAgbWVtc2V0KCZjdHgtPmV2ZW50X21nciwgMCwgc2l6ZW9mKGN0eC0+ZXZlbnRfbWdyKSk7Ci0gICAgY3R4LT5ldmVudF9tZ3IuaW5mb19oYW5kbGVyICAgID0gaW5mb19jYWxsYmFjazsKLSAgICBjdHgtPmV2ZW50X21nci5lcnJvcl9oYW5kbGVyICAgPSBlcnJvcl9jYWxsYmFjazsKLSAgICBjdHgtPmV2ZW50X21nci53YXJuaW5nX2hhbmRsZXIgPSB3YXJuaW5nX2NhbGxiYWNrOwotICAgIG9wal9zZXRfZXZlbnRfbWdyKChvcGpfY29tbW9uX3B0cikgZGVjLCAmY3R4LT5ldmVudF9tZ3IsIGF2Y3R4KTsKLSAgICBjdHgtPmRlY19wYXJhbXMuY3BfbGltaXRfZGVjb2RpbmcgPSBMSU1JVF9UT19NQUlOX0hFQURFUjsKLSAgICBjdHgtPmRlY19wYXJhbXMuY3BfbGF5ZXIgICAgICAgICAgPSBjdHgtPmxvd3F1YWw7Ci0jZWxzZSAvLyBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDIKICAgICBpZiAoIW9wal9zZXRfZXJyb3JfaGFuZGxlcihkZWMsIGVycm9yX2NhbGxiYWNrLCBhdmN0eCkgfHwKICAgICAgICAgIW9wal9zZXRfd2FybmluZ19oYW5kbGVyKGRlYywgd2FybmluZ19jYWxsYmFjaywgYXZjdHgpIHx8CiAgICAgICAgICFvcGpfc2V0X2luZm9faGFuZGxlcihkZWMsIGluZm9fY2FsbGJhY2ssIGF2Y3R4KSkgewpAQCAtMzk5LDE2ICszNjYsMTEgQEAKIAogICAgIGN0eC0+ZGVjX3BhcmFtcy5jcF9sYXllciA9IGN0eC0+bG93cXVhbDsKICAgICBjdHgtPmRlY19wYXJhbXMuY3BfcmVkdWNlID0gYXZjdHgtPmxvd3JlczsKLSNlbmRpZiAvLyBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDEKIAogICAgIC8vIFRpZSBkZWNvZGVyIHdpdGggZGVjb2RpbmcgcGFyYW1ldGVycwogICAgIG9wal9zZXR1cF9kZWNvZGVyKGRlYywgJmN0eC0+ZGVjX3BhcmFtcyk7CiAKLSNpZiBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDEKLSAgICBzdHJlYW0gPSBvcGpfY2lvX29wZW4oKG9wal9jb21tb25fcHRyKSBkZWMsIGJ1ZiwgYnVmX3NpemUpOwotI2Vsc2UgLy8gT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAyCiAgICAgc3RyZWFtID0gb3BqX3N0cmVhbV9kZWZhdWx0X2NyZWF0ZShPUEpfU1RSRUFNX1JFQUQpOwotI2VuZGlmIC8vIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMQogCiAgICAgaWYgKCFzdHJlYW0pIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCkBAIC00MTcsMjcgKzM3OSwxMyBAQAogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCi0jaWYgT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAxCi0gICAgLy8gRGVjb2RlIHRoZSBoZWFkZXIgb25seS4KLSAgICBpbWFnZSA9IG9wal9kZWNvZGVfd2l0aF9pbmZvKGRlYywgc3RyZWFtLCBOVUxMKTsKLSAgICBvcGpfY2lvX2Nsb3NlKHN0cmVhbSk7Ci0gICAgc3RyZWFtID0gTlVMTDsKLSAgICByZXQgPSAhaW1hZ2U7Ci0jZWxzZSAvLyBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDIKICAgICBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKHN0cmVhbSwgc3RyZWFtX3JlYWQpOwogICAgIG9wal9zdHJlYW1fc2V0X3NraXBfZnVuY3Rpb24oc3RyZWFtLCBzdHJlYW1fc2tpcCk7CiAgICAgb3BqX3N0cmVhbV9zZXRfc2Vla19mdW5jdGlvbihzdHJlYW0sIHN0cmVhbV9zZWVrKTsKLSNpZiBIQVZFX09QRU5KUEVHXzJfMV9PUEVOSlBFR19ICiAgICAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhKHN0cmVhbSwgJnJlYWRlciwgTlVMTCk7Ci0jZWxpZiBIQVZFX09QRU5KUEVHXzJfMF9PUEVOSlBFR19ICi0gICAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhKHN0cmVhbSwgJnJlYWRlcik7Ci0jZWxzZQotI2Vycm9yIE1pc3NpbmcgY2FsbCB0byBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEKLSNlbmRpZgogICAgIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YV9sZW5ndGgoc3RyZWFtLCBhdnBrdC0+c2l6ZSk7CiAgICAgLy8gRGVjb2RlIHRoZSBoZWFkZXIgb25seS4KICAgICByZXQgPSAhb3BqX3JlYWRfaGVhZGVyKHN0cmVhbSwgZGVjLCAmaW1hZ2UpOwotI2VuZGlmIC8vIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMQogCiAgICAgaWYgKHJldCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGRlY29kaW5nIGNvZGVzdHJlYW0gaGVhZGVyLlxuIik7CkBAIC00NzEsMjUgKzQxOSw3IEBACiAgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQogICAgICAgICBnb3RvIGRvbmU7CiAKLSNpZiBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDEKLSAgICBjdHgtPmRlY19wYXJhbXMuY3BfbGltaXRfZGVjb2RpbmcgPSBOT19MSU1JVEFUSU9OOwotICAgIGN0eC0+ZGVjX3BhcmFtcy5jcF9yZWR1Y2UgPSBhdmN0eC0+bG93cmVzOwotICAgIC8vIFRpZSBkZWNvZGVyIHdpdGggZGVjb2RpbmcgcGFyYW1ldGVycy4KLSAgICBvcGpfc2V0dXBfZGVjb2RlcihkZWMsICZjdHgtPmRlY19wYXJhbXMpOwotICAgIHN0cmVhbSA9IG9wal9jaW9fb3Blbigob3BqX2NvbW1vbl9wdHIpIGRlYywgYnVmLCBidWZfc2l6ZSk7Ci0gICAgaWYgKCFzdHJlYW0pIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiQ29kZXN0cmVhbSBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciByZWFkaW5nLlxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7Ci0gICAgICAgIGdvdG8gZG9uZTsKLSAgICB9Ci0gICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOwotICAgIC8vIERlY29kZSB0aGUgY29kZXN0cmVhbQotICAgIGltYWdlID0gb3BqX2RlY29kZV93aXRoX2luZm8oZGVjLCBzdHJlYW0sIE5VTEwpOwotICAgIHJldCA9ICFpbWFnZTsKLSNlbHNlIC8vIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMgogICAgIHJldCA9ICFvcGpfZGVjb2RlKGRlYywgc3RyZWFtLCBpbWFnZSk7Ci0jZW5kaWYgLy8gT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAxCiAKICAgICBpZiAocmV0KSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZGVjb2RpbmcgY29kZXN0cmVhbS5cbiIpOwpAQCAtNTM4LDM1ICs0NjgsMjMgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIHBpeGVsIHNpemUgJWRcbiIsIHBpeGVsX3NpemUpOworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgIlBpeGVsIHNpemUgJWQiLCBwaXhlbF9zaXplKTsKICAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKICAgICAqZ290X2ZyYW1lID0gMTsKKyAgICBwaWN0dXJlLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwaWN0dXJlLT5rZXlfZnJhbWUgPSAxOwogICAgIHJldCAgICAgICAgPSBidWZfc2l6ZTsKIAogZG9uZToKICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0jaWYgT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAyCiAgICAgb3BqX3N0cmVhbV9kZXN0cm95KHN0cmVhbSk7CiAgICAgb3BqX2Rlc3Ryb3lfY29kZWMoZGVjKTsKLSNlbHNlCi0gICAgb3BqX2Npb19jbG9zZShzdHJlYW0pOwotICAgIG9wal9kZXN0cm95X2RlY29tcHJlc3MoZGVjKTsKLSNlbmRpZgogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBhdl9jb2xkIHZvaWQgbGlib3BlbmpwZWdfc3RhdGljX2luaXQoQVZDb2RlYyAqY29kZWMpCi17Ci0gICAgY29uc3QgY2hhciAqdmVyc2lvbiA9IG9wal92ZXJzaW9uKCk7Ci0gICAgaW50IG1ham9yLCBtaW5vcjsKLQotICAgIGlmIChzc2NhbmYodmVyc2lvbiwgIiVkLiVkIiwgJm1ham9yLCAmbWlub3IpID09IDIgJiYgMTAwMCptYWpvciArIG1pbm9yIDw9IDEwMDMpCi0gICAgICAgIGNvZGVjLT5jYXBhYmlsaXRpZXMgfD0gQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTDsKLX0KLQogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTGliT3BlbkpQRUdDb250ZXh0LCB4KQogI2RlZmluZSBWRCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCiAKQEAgLTU5NCw1ICs1MTIsNSBAQAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKICAgICAubWF4X2xvd3JlcyAgICAgPSAzMSwKICAgICAucHJpdl9jbGFzcyAgICAgPSAmb3BlbmpwZWdfY2xhc3MsCi0gICAgLmluaXRfc3RhdGljX2RhdGEgPSBsaWJvcGVuanBlZ19zdGF0aWNfaW5pdCwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGlib3BlbmpwZWciLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlib3BlbmpwZWdlbmMuYyBiL2xpYmF2Y29kZWMvbGlib3BlbmpwZWdlbmMuYwppbmRleCBiNjdjMzIwLi43YzdkMGFhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYm9wZW5qcGVnZW5jLmMKKysrIGIvbGliYXZjb2RlYy9saWJvcGVuanBlZ2VuYy5jCkBAIC0yNCw4ICsyNCw2IEBACiAgKiBKUEVHIDIwMDAgZW5jb2RlciB1c2luZyBsaWJvcGVuanBlZwogICovCiAKLSNkZWZpbmUgIE9QSl9TVEFUSUMKLQogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKQEAgLTMzLDQwICszMSwxOCBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotI2lmIEhBVkVfT1BFTkpQRUdfMl8xX09QRU5KUEVHX0gKLSMgIGluY2x1ZGUgPG9wZW5qcGVnLTIuMS9vcGVuanBlZy5oPgotI2VsaWYgSEFWRV9PUEVOSlBFR18yXzBfT1BFTkpQRUdfSAotIyAgaW5jbHVkZSA8b3BlbmpwZWctMi4wL29wZW5qcGVnLmg+Ci0jZWxpZiBIQVZFX09QRU5KUEVHXzFfNV9PUEVOSlBFR19ICi0jICBpbmNsdWRlIDxvcGVuanBlZy0xLjUvb3BlbmpwZWcuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDxvcGVuanBlZy5oPgotI2VuZGlmCi0KLSNpZiBIQVZFX09QRU5KUEVHXzJfMV9PUEVOSlBFR19IIHx8IEhBVkVfT1BFTkpQRUdfMl8wX09QRU5KUEVHX0gKLSMgIGRlZmluZSBPUEVOSlBFR19NQUpPUl9WRVJTSU9OIDIKLSMgIGRlZmluZSBPUEooeCkgT1BKXyMjeAotI2Vsc2UKLSMgIGRlZmluZSBPUEVOSlBFR19NQUpPUl9WRVJTSU9OIDEKLSMgIGRlZmluZSBPUEooeCkgeAotI2VuZGlmCisjaW5jbHVkZSA8b3BlbmpwZWcuaD4KIAogdHlwZWRlZiBzdHJ1Y3QgTGliT3BlbkpQRUdDb250ZXh0IHsKICAgICBBVkNsYXNzICphdmNsYXNzOwotICAgIG9wal9pbWFnZV90ICppbWFnZTsKICAgICBvcGpfY3BhcmFtZXRlcnNfdCBlbmNfcGFyYW1zOwotI2lmIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMQotICAgIG9wal9ldmVudF9tZ3JfdCBldmVudF9tZ3I7Ci0jZW5kaWYgLy8gT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAxCiAgICAgaW50IGZvcm1hdDsKICAgICBpbnQgcHJvZmlsZTsKICAgICBpbnQgcHJvZ19vcmRlcjsKICAgICBpbnQgY2luZW1hX21vZGU7CiAgICAgaW50IG51bXJlc29sdXRpb247Ci0gICAgaW50IG51bWxheWVyczsKKyAgICBpbnQgaXJyZXZlcnNpYmxlOwogICAgIGludCBkaXN0b19hbGxvYzsKLSAgICBpbnQgZml4ZWRfYWxsb2M7CiAgICAgaW50IGZpeGVkX3F1YWxpdHk7CiB9IExpYk9wZW5KUEVHQ29udGV4dDsKIApAQCAtODUsNyArNjEsNiBAQAogICAgIGF2X2xvZyhkYXRhLCBBVl9MT0dfREVCVUcsICIlc1xuIiwgbXNnKTsKIH0KIAotI2lmIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMgogdHlwZWRlZiBzdHJ1Y3QgUGFja2V0V3JpdGVyIHsKICAgICBpbnQgcG9zOwogICAgIEFWUGFja2V0ICpwYWNrZXQ7CkBAIC0xNTUsNyArMTMwLDYgQEAKICAgICB3cml0ZXItPnBvcyA9IChpbnQpbmJfYnl0ZXM7CiAgICAgcmV0dXJuIE9QSl9UUlVFOwogfQotI2VuZGlmIC8vIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMgogCiBzdGF0aWMgdm9pZCBjaW5lbWFfcGFyYW1ldGVycyhvcGpfY3BhcmFtZXRlcnNfdCAqcCkKIHsKQEAgLTE3OSw3ICsxNTMsNyBAQAogICAgIHAtPmNzdHkgfD0gMHgwMTsKIAogICAgIC8qIFRoZSBwcm9ncmVzc2lvbiBvcmRlciBzaGFsbCBiZSBDUFJMICovCi0gICAgcC0+cHJvZ19vcmRlciA9IE9QSihDUFJMKTsKKyAgICBwLT5wcm9nX29yZGVyID0gT1BKX0NQUkw7CiAKICAgICAvKiBObyBST0kgKi8KICAgICBwLT5yb2lfY29tcG5vID0gLTE7CkBAIC0yMDMsNyArMTc3LDcgQEAKICAgICBpbnQgc3ViX2R4WzRdOwogICAgIGludCBzdWJfZHlbNF07CiAgICAgaW50IG51bWNvbXBzOwotICAgIE9QSl9DT0xPUl9TUEFDRSBjb2xvcl9zcGFjZSA9IE9QSihDTFJTUENfVU5LTk9XTik7CisgICAgT1BKX0NPTE9SX1NQQUNFIGNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19VTktOT1dOOwogCiAgICAgc3ViX2R4WzBdID0gc3ViX2R4WzNdID0gMTsKICAgICBzdWJfZHlbMF0gPSBzdWJfZHlbM10gPSAxOwpAQCAtMjE3LDcgKzE5MSw3IEBACiAgICAgY2FzZSBBVl9QSVhfRk1UX1lBODoKICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZQTE2OgotICAgICAgICBjb2xvcl9zcGFjZSA9IE9QSihDTFJTUENfR1JBWSk7CisgICAgICAgIGNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19HUkFZOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CkBAIC0yMzAsNyArMjA0LDcgQEAKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0OgogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTY6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1hZWjEyOgotICAgICAgICBjb2xvcl9zcGFjZSA9IE9QSihDTFJTUENfU1JHQik7CisgICAgICAgIGNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDEwUDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKQEAgLTI2NSw3ICsyMzksNyBAQAogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2OgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2OgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2OgotICAgICAgICBjb2xvcl9zcGFjZSA9IE9QSihDTFJTUENfU1lDQyk7CisgICAgICAgIGNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TWUNDOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKQEAgLTMwNiw3ICsyODAsNiBAQAogCiAgICAgb3BqX3NldF9kZWZhdWx0X2VuY29kZXJfcGFyYW1ldGVycygmY3R4LT5lbmNfcGFyYW1zKTsKIAotI2lmIEhBVkVfT1BFTkpQRUdfMl8xX09QRU5KUEVHX0gKICAgICBzd2l0Y2ggKGN0eC0+Y2luZW1hX21vZGUpIHsKICAgICBjYXNlIE9QSl9DSU5FTUEyS18yNDoKICAgICAgICAgY3R4LT5lbmNfcGFyYW1zLnJzaXogPSBPUEpfUFJPRklMRV9DSU5FTUFfMks7CkBAIC0zNDUsMzkgKzMxOCwyOCBAQAogICAgIGlmIChlcnIpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiSW52YWxpZCBwYXJhbWV0ZXIgcGFpcmluZzogY2luZW1hX21vZGUgYW5kIHByb2ZpbGUgY29uZmxpY3QuXG4iKTsKLSAgICAgICAgZ290byBmYWlsOworICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSNlbHNlCi0gICAgY3R4LT5lbmNfcGFyYW1zLmNwX3JzaXogPSBjdHgtPnByb2ZpbGU7Ci0gICAgY3R4LT5lbmNfcGFyYW1zLmNwX2NpbmVtYSA9IGN0eC0+Y2luZW1hX21vZGU7Ci0jZW5kaWYKIAotICAgIGN0eC0+ZW5jX3BhcmFtcy5tb2RlID0gISFhdmN0eC0+Z2xvYmFsX3F1YWxpdHk7CisgICAgaWYgKCFjdHgtPm51bXJlc29sdXRpb24pIHsKKyAgICAgICAgY3R4LT5udW1yZXNvbHV0aW9uID0gNjsKKyAgICAgICAgd2hpbGUgKEZGTUlOKGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCkgPj4gY3R4LT5udW1yZXNvbHV0aW9uIDwgMSkKKyAgICAgICAgICAgIGN0eC0+bnVtcmVzb2x1dGlvbiAtLTsKKyAgICB9CisKICAgICBjdHgtPmVuY19wYXJhbXMucHJvZ19vcmRlciA9IGN0eC0+cHJvZ19vcmRlcjsKICAgICBjdHgtPmVuY19wYXJhbXMubnVtcmVzb2x1dGlvbiA9IGN0eC0+bnVtcmVzb2x1dGlvbjsKKyAgICBjdHgtPmVuY19wYXJhbXMuaXJyZXZlcnNpYmxlID0gY3R4LT5pcnJldmVyc2libGU7CiAgICAgY3R4LT5lbmNfcGFyYW1zLmNwX2Rpc3RvX2FsbG9jID0gY3R4LT5kaXN0b19hbGxvYzsKLSAgICBjdHgtPmVuY19wYXJhbXMuY3BfZml4ZWRfYWxsb2MgPSBjdHgtPmZpeGVkX2FsbG9jOwogICAgIGN0eC0+ZW5jX3BhcmFtcy5jcF9maXhlZF9xdWFsaXR5ID0gY3R4LT5maXhlZF9xdWFsaXR5OwotICAgIGN0eC0+ZW5jX3BhcmFtcy50Y3BfbnVtbGF5ZXJzID0gY3R4LT5udW1sYXllcnM7CisgICAgY3R4LT5lbmNfcGFyYW1zLnRjcF9udW1sYXllcnMgPSAxOwogICAgIGN0eC0+ZW5jX3BhcmFtcy50Y3BfcmF0ZXNbMF0gPSBGRk1BWChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwsIDApICogMjsKIAogICAgIGlmIChjdHgtPmNpbmVtYV9tb2RlID4gMCkgewogICAgICAgICBjaW5lbWFfcGFyYW1ldGVycygmY3R4LT5lbmNfcGFyYW1zKTsKICAgICB9CiAKLSAgICBjdHgtPmltYWdlID0gbWoyX2NyZWF0ZV9pbWFnZShhdmN0eCwgJmN0eC0+ZW5jX3BhcmFtcyk7Ci0gICAgaWYgKCFjdHgtPmltYWdlKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcgdGhlIG1qMiBpbWFnZVxuIik7Ci0gICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQogICAgIHJldHVybiAwOwotCi1mYWlsOgotICAgIG9wal9pbWFnZV9kZXN0cm95KGN0eC0+aW1hZ2UpOwotICAgIGN0eC0+aW1hZ2UgPSBOVUxMOwotICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQgbGlib3BlbmpwZWdfY29weV9wYWNrZWQ4KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZGcmFtZSAqZnJhbWUsIG9wal9pbWFnZV90ICppbWFnZSkKQEAgLTQxMSw3ICszNzMsNyBAQAogICAgICAgICBmb3IgKDsgeSA8IGltYWdlLT5jb21wc1tjb21wbm9dLmg7ICsreSkgewogICAgICAgICAgICAgaW1hZ2VfbGluZSA9IGltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgKyB5ICogaW1hZ2UtPmNvbXBzW2NvbXBub10udzsKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpbWFnZS0+Y29tcHNbY29tcG5vXS53OyArK3gpIHsKLSAgICAgICAgICAgICAgICBpbWFnZV9saW5lW3hdID0gaW1hZ2VfbGluZVt4IC0gaW1hZ2UtPmNvbXBzW2NvbXBub10ud107CisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGltYWdlX2xpbmVbeCAtIChpbnQpaW1hZ2UtPmNvbXBzW2NvbXBub10ud107CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC00NTEsNyArNDEzLDcgQEAKICAgICAgICAgZm9yICg7IHkgPCBpbWFnZS0+Y29tcHNbY29tcG5vXS5oOyArK3kpIHsKICAgICAgICAgICAgIGltYWdlX2xpbmUgPSBpbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhICsgeSAqIGltYWdlLT5jb21wc1tjb21wbm9dLnc7CiAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10udzsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGltYWdlX2xpbmVbeCAtIGltYWdlLT5jb21wc1tjb21wbm9dLnddOworICAgICAgICAgICAgICAgIGltYWdlX2xpbmVbeF0gPSBpbWFnZV9saW5lW3ggLSAoaW50KWltYWdlLT5jb21wc1tjb21wbm9dLnddOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDkxLDcgKzQ1Myw3IEBACiAgICAgICAgIGZvciAoOyB5IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10uaDsgKyt5KSB7CiAgICAgICAgICAgICBpbWFnZV9saW5lID0gaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSArIHkgKiBpbWFnZS0+Y29tcHNbY29tcG5vXS53OwogICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGltYWdlLT5jb21wc1tjb21wbm9dLnc7ICsreCkgewotICAgICAgICAgICAgICAgIGltYWdlX2xpbmVbeF0gPSBpbWFnZV9saW5lW3ggLSBpbWFnZS0+Y29tcHNbY29tcG5vXS53XTsKKyAgICAgICAgICAgICAgICBpbWFnZV9saW5lW3hdID0gaW1hZ2VfbGluZVt4IC0gKGludClpbWFnZS0+Y29tcHNbY29tcG5vXS53XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTUxOCw4ICs0ODAsOCBAQAogICAgIH0KIAogICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY29tcHM7ICsrY29tcG5vKSB7Ci0gICAgICAgIHdpZHRoICA9IGF2Y3R4LT53aWR0aCAvIGltYWdlLT5jb21wc1tjb21wbm9dLmR4OwotICAgICAgICBoZWlnaHQgPSBhdmN0eC0+aGVpZ2h0IC8gaW1hZ2UtPmNvbXBzW2NvbXBub10uZHk7CisgICAgICAgIHdpZHRoICA9IChhdmN0eC0+d2lkdGggKyBpbWFnZS0+Y29tcHNbY29tcG5vXS5keCAtIDEpIC8gaW1hZ2UtPmNvbXBzW2NvbXBub10uZHg7CisgICAgICAgIGhlaWdodCA9IChhdmN0eC0+aGVpZ2h0ICsgaW1hZ2UtPmNvbXBzW2NvbXBub10uZHkgLSAxKSAvIGltYWdlLT5jb21wc1tjb21wbm9dLmR5OwogICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgICAgICAgIGltYWdlX2xpbmUgPSBpbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhICsgeSAqIGltYWdlLT5jb21wc1tjb21wbm9dLnc7CiAgICAgICAgICAgICBmcmFtZV9pbmRleCA9IHkgKiBmcmFtZS0+bGluZXNpemVbY29tcG5vXTsKQEAgLTUzMiw3ICs0OTQsNyBAQAogICAgICAgICBmb3IgKDsgeSA8IGltYWdlLT5jb21wc1tjb21wbm9dLmg7ICsreSkgewogICAgICAgICAgICAgaW1hZ2VfbGluZSA9IGltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgKyB5ICogaW1hZ2UtPmNvbXBzW2NvbXBub10udzsKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpbWFnZS0+Y29tcHNbY29tcG5vXS53OyArK3gpIHsKLSAgICAgICAgICAgICAgICBpbWFnZV9saW5lW3hdID0gaW1hZ2VfbGluZVt4IC0gaW1hZ2UtPmNvbXBzW2NvbXBub10ud107CisgICAgICAgICAgICAgICAgaW1hZ2VfbGluZVt4XSA9IGltYWdlX2xpbmVbeCAtIChpbnQpaW1hZ2UtPmNvbXBzW2NvbXBub10ud107CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01NjAsOCArNTIyLDggQEAKICAgICB9CiAKICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyArK2NvbXBubykgewotICAgICAgICB3aWR0aCAgICAgPSBhdmN0eC0+d2lkdGggLyBpbWFnZS0+Y29tcHNbY29tcG5vXS5keDsKLSAgICAgICAgaGVpZ2h0ICAgID0gYXZjdHgtPmhlaWdodCAvIGltYWdlLT5jb21wc1tjb21wbm9dLmR5OworICAgICAgICB3aWR0aCAgICAgPSAoYXZjdHgtPndpZHRoICsgaW1hZ2UtPmNvbXBzW2NvbXBub10uZHggLSAxKSAvIGltYWdlLT5jb21wc1tjb21wbm9dLmR4OworICAgICAgICBoZWlnaHQgICAgPSAoYXZjdHgtPmhlaWdodCArIGltYWdlLT5jb21wc1tjb21wbm9dLmR5IC0gMSkgLyBpbWFnZS0+Y29tcHNbY29tcG5vXS5keTsKICAgICAgICAgZnJhbWVfcHRyID0gKHVpbnQxNl90ICopZnJhbWUtPmRhdGFbY29tcG5vXTsKICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgICBpbWFnZV9saW5lID0gaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSArIHkgKiBpbWFnZS0+Y29tcHNbY29tcG5vXS53OwpAQCAtNTc1LDcgKzUzNyw3IEBACiAgICAgICAgIGZvciAoOyB5IDwgaW1hZ2UtPmNvbXBzW2NvbXBub10uaDsgKyt5KSB7CiAgICAgICAgICAgICBpbWFnZV9saW5lID0gaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSArIHkgKiBpbWFnZS0+Y29tcHNbY29tcG5vXS53OwogICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGltYWdlLT5jb21wc1tjb21wbm9dLnc7ICsreCkgewotICAgICAgICAgICAgICAgIGltYWdlX2xpbmVbeF0gPSBpbWFnZV9saW5lW3ggLSBpbWFnZS0+Y29tcHNbY29tcG5vXS53XTsKKyAgICAgICAgICAgICAgICBpbWFnZV9saW5lW3hdID0gaW1hZ2VfbGluZVt4IC0gKGludClpbWFnZS0+Y29tcHNbY29tcG5vXS53XTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTU4NywxOCArNTQ5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQogewogICAgIExpYk9wZW5KUEVHQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UgICAgICA9IGN0eC0+aW1hZ2U7Ci0jaWYgT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAxCi0gICAgb3BqX2NpbmZvX3QgKmNvbXByZXNzICAgPSBOVUxMOwotICAgIG9wal9jaW9fdCAqc3RyZWFtICAgICAgID0gTlVMTDsKLSAgICBpbnQgbGVuOwotI2Vsc2UgLy8gT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAyCi0gICAgb3BqX2NvZGVjX3QgKmNvbXByZXNzICAgPSBOVUxMOwotICAgIG9wal9zdHJlYW1fdCAqc3RyZWFtICAgID0gTlVMTDsKLSNlbmRpZiAvLyBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDEKLSAgICBpbnQgY3B5cmVzdWx0ID0gMDsKICAgICBpbnQgcmV0OwogICAgIEFWRnJhbWUgKmdicmZyYW1lOworICAgIGludCBjcHlyZXN1bHQgPSAwOworICAgIFBhY2tldFdyaXRlciB3cml0ZXIgICAgID0geyAwIH07CisgICAgb3BqX2NvZGVjX3QgKmNvbXByZXNzICAgPSBOVUxMOworICAgIG9wal9zdHJlYW1fdCAqc3RyZWFtICAgID0gTlVMTDsKKyAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UgICAgICA9IG1qMl9jcmVhdGVfaW1hZ2UoYXZjdHgsICZjdHgtPmVuY19wYXJhbXMpOworICAgIGlmICghaW1hZ2UpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBjcmVhdGluZyB0aGUgbWoyIGltYWdlXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQogCiAgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgewogICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKQEAgLTYyMSw4ICs1ODMsMTAgQEAKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0OgogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTY6CiAgICAgICAgIGdicmZyYW1lID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOwotICAgICAgICBpZiAoIWdicmZyYW1lKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKCFnYnJmcmFtZSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CiAgICAgICAgIGdicmZyYW1lLT5kYXRhWzBdID0gZnJhbWUtPmRhdGFbMl07IC8vIHN3YXAgdG8gYmUgcmdiCiAgICAgICAgIGdicmZyYW1lLT5kYXRhWzFdID0gZnJhbWUtPmRhdGFbMF07CiAgICAgICAgIGdicmZyYW1lLT5kYXRhWzJdID0gZnJhbWUtPmRhdGFbMV07CkBAIC02NzksMjEgKzY0MywyMSBAQAogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJUaGUgZnJhbWUncyBwaXhlbCBmb3JtYXQgJyVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLAogICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShhdmN0eC0+cGl4X2ZtdCkpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZG9uZTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgaWYgKCFjcHlyZXN1bHQpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNvcHkgdGhlIGZyYW1lIGRhdGEgdG8gdGhlIGludGVybmFsIGltYWdlIGJ1ZmZlclxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKLSNpZiBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDIKICAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgMTAyNCwgMCkpIDwgMCkgewotICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQotI2VuZGlmIC8vIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMgogCiAgICAgY29tcHJlc3MgPSBvcGpfY3JlYXRlX2NvbXByZXNzKGN0eC0+Zm9ybWF0KTsKICAgICBpZiAoIWNvbXByZXNzKSB7CkBAIC03MDIsMTAgKzY2Niw2IEBACiAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKLSNpZiBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDEKLSAgICBvcGpfc2V0dXBfZW5jb2Rlcihjb21wcmVzcywgJmN0eC0+ZW5jX3BhcmFtcywgaW1hZ2UpOwotICAgIHN0cmVhbSA9IG9wal9jaW9fb3Blbigob3BqX2NvbW1vbl9wdHIpIGNvbXByZXNzLCBOVUxMLCAwKTsKLSNlbHNlIC8vIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMgogICAgIGlmICghb3BqX3NldF9lcnJvcl9oYW5kbGVyKGNvbXByZXNzLCBlcnJvcl9jYWxsYmFjaywgYXZjdHgpIHx8CiAgICAgICAgICFvcGpfc2V0X3dhcm5pbmdfaGFuZGxlcihjb21wcmVzcywgd2FybmluZ19jYWxsYmFjaywgYXZjdHgpIHx8CiAgICAgICAgICFvcGpfc2V0X2luZm9faGFuZGxlcihjb21wcmVzcywgaW5mb19jYWxsYmFjaywgYXZjdHgpKSB7CkBAIC03MjAsNDUgKzY4MCwyMCBAQAogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogICAgIHN0cmVhbSA9IG9wal9zdHJlYW1fZGVmYXVsdF9jcmVhdGUoT1BKX1NUUkVBTV9XUklURSk7Ci0jZW5kaWYgLy8gT1BFTkpQRUdfTUFKT1JfVkVSU0lPTiA9PSAxCiAKICAgICBpZiAoIXN0cmVhbSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGNyZWF0aW5nIHRoZSBjaW8gc3RyZWFtXG4iKTsKICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQotI2lmIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMQotICAgIG1lbXNldCgmY3R4LT5ldmVudF9tZ3IsIDAsIHNpemVvZihjdHgtPmV2ZW50X21ncikpOwotICAgIGN0eC0+ZXZlbnRfbWdyLmluZm9faGFuZGxlciAgICA9IGluZm9fY2FsbGJhY2s7Ci0gICAgY3R4LT5ldmVudF9tZ3IuZXJyb3JfaGFuZGxlciAgID0gZXJyb3JfY2FsbGJhY2s7Ci0gICAgY3R4LT5ldmVudF9tZ3Iud2FybmluZ19oYW5kbGVyID0gd2FybmluZ19jYWxsYmFjazsKLSAgICBvcGpfc2V0X2V2ZW50X21ncigob3BqX2NvbW1vbl9wdHIpIGNvbXByZXNzLCAmY3R4LT5ldmVudF9tZ3IsIGF2Y3R4KTsKLSAgICBpZiAoIW9wal9lbmNvZGUoY29tcHJlc3MsIHN0cmVhbSwgaW1hZ2UsIE5VTEwpKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZHVyaW5nIHRoZSBvcGogZW5jb2RlXG4iKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgZ290byBkb25lOwotICAgIH0KIAotICAgIGxlbiA9IGNpb190ZWxsKHN0cmVhbSk7Ci0gICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIGxlbiwgMCkpIDwgMCkgewotICAgICAgICBnb3RvIGRvbmU7Ci0gICAgfQotCi0gICAgbWVtY3B5KHBrdC0+ZGF0YSwgc3RyZWFtLT5idWZmZXIsIGxlbik7Ci0jZWxzZSAvLyBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDIKLSAgICBQYWNrZXRXcml0ZXIgd3JpdGVyID0gezAsIHBrdH07CisgICAgd3JpdGVyLnBhY2tldCA9IHBrdDsKICAgICBvcGpfc3RyZWFtX3NldF93cml0ZV9mdW5jdGlvbihzdHJlYW0sIHN0cmVhbV93cml0ZSk7CiAgICAgb3BqX3N0cmVhbV9zZXRfc2tpcF9mdW5jdGlvbihzdHJlYW0sIHN0cmVhbV9za2lwKTsKICAgICBvcGpfc3RyZWFtX3NldF9zZWVrX2Z1bmN0aW9uKHN0cmVhbSwgc3RyZWFtX3NlZWspOwotI2lmIEhBVkVfT1BFTkpQRUdfMl8xX09QRU5KUEVHX0gKICAgICBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEoc3RyZWFtLCAmd3JpdGVyLCBOVUxMKTsKLSNlbGlmIEhBVkVfT1BFTkpQRUdfMl8wX09QRU5KUEVHX0gKLSAgICBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEoc3RyZWFtLCAmd3JpdGVyKTsKLSNlbHNlCi0jZXJyb3IgTWlzc2luZyBjYWxsIHRvIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YQotI2VuZGlmCiAKLSAgICBpZiAoIW9wal9zdGFydF9jb21wcmVzcyhjb21wcmVzcywgY3R4LT5pbWFnZSwgc3RyZWFtKSB8fAorICAgIGlmICghb3BqX3N0YXJ0X2NvbXByZXNzKGNvbXByZXNzLCBpbWFnZSwgc3RyZWFtKSB8fAogICAgICAgICAhb3BqX2VuY29kZShjb21wcmVzcywgc3RyZWFtKSB8fAogICAgICAgICAhb3BqX2VuZF9jb21wcmVzcyhjb21wcmVzcywgc3RyZWFtKSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGR1cmluZyB0aGUgb3BqIGVuY29kZVxuIik7CkBAIC03NjcsNTggKzcwMiw0MyBAQAogICAgIH0KIAogICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCB3cml0ZXIucG9zKTsKLSNlbmRpZiAvLyBPUEVOSlBFR19NQUpPUl9WRVJTSU9OID09IDEKIAogICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwogICAgICpnb3RfcGFja2V0ID0gMTsKICAgICByZXQgPSAwOwogCiBkb25lOgotI2lmIE9QRU5KUEVHX01BSk9SX1ZFUlNJT04gPT0gMgogICAgIG9wal9zdHJlYW1fZGVzdHJveShzdHJlYW0pOwogICAgIG9wal9kZXN0cm95X2NvZGVjKGNvbXByZXNzKTsKLSNlbHNlCi0gICAgb3BqX2Npb19jbG9zZShzdHJlYW0pOwotICAgIG9wal9kZXN0cm95X2NvbXByZXNzKGNvbXByZXNzKTsKLSNlbmRpZgorICAgIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgYXZfY29sZCBpbnQgbGlib3BlbmpwZWdfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBMaWJPcGVuSlBFR0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0KLSAgICBvcGpfaW1hZ2VfZGVzdHJveShjdHgtPmltYWdlKTsKLSAgICBjdHgtPmltYWdlID0gTlVMTDsKLSAgICByZXR1cm4gMDsKLX0KLQogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTGliT3BlbkpQRUdDb250ZXh0LCB4KQogI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewotICAgIHsgImZvcm1hdCIsICAgICAgICAiQ29kZWMgRm9ybWF0IiwgICAgICBPRkZTRVQoZm9ybWF0KSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBPUEooQ09ERUNfSlAyKSAgIH0sIE9QSihDT0RFQ19KMkspLCBPUEooQ09ERUNfSlAyKSwgICBWRSwgImZvcm1hdCIgICAgICB9LAotICAgIHsgImoyayIsICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUEooQ09ERUNfSjJLKSAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAiZm9ybWF0IiAgICAgIH0sCi0gICAgeyAianAyIiwgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSihDT0RFQ19KUDIpICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJmb3JtYXQiICAgICAgfSwKLSAgICB7ICJwcm9maWxlIiwgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKHByb2ZpbGUpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gT1BKKFNURF9SU0laKSAgICB9LCBPUEooU1REX1JTSVopLCAgT1BKKENJTkVNQTRLKSwgICAgVkUsICJwcm9maWxlIiAgICAgfSwKLSAgICB7ICJqcGVnMjAwMCIsICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BKKFNURF9SU0laKSAgICB9LCAwLCAgICAgICAgIDAsICAgICAgICAgICBWRSwgInByb2ZpbGUiICAgICB9LAotICAgIHsgImNpbmVtYTJrIiwgICAgICBOVUxMLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUEooQ0lORU1BMkspICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZmlsZSIgICAgIH0sCi0gICAgeyAiY2luZW1hNGsiLCAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSihDSU5FTUE0SykgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9maWxlIiAgICAgfSwKLSAgICB7ICJjaW5lbWFfbW9kZSIsICAgIkRpZ2l0YWwgQ2luZW1hIiwgICAgT0ZGU0VUKGNpbmVtYV9tb2RlKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gT1BKKE9GRikgICAgICAgICB9LCBPUEooT0ZGKSwgICAgICAgT1BKKENJTkVNQTRLXzI0KSwgVkUsICJjaW5lbWFfbW9kZSIgfSwKLSAgICB7ICJvZmYiLCAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BKKE9GRikgICAgICAgICB9LCAwLCAgICAgICAgIDAsICAgICAgICAgICBWRSwgImNpbmVtYV9tb2RlIiB9LAotICAgIHsgIjJrXzI0IiwgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUEooQ0lORU1BMktfMjQpIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAiY2luZW1hX21vZGUiIH0sCi0gICAgeyAiMmtfNDgiLCAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSihDSU5FTUEyS180OCkgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJjaW5lbWFfbW9kZSIgfSwKLSAgICB7ICI0a18yNCIsICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BKKENJTkVNQTRLXzI0KSB9LCAwLCAgICAgICAgIDAsICAgICAgICAgICBWRSwgImNpbmVtYV9tb2RlIiB9LAotICAgIHsgInByb2dfb3JkZXIiLCAgICAiUHJvZ3Jlc3Npb24gT3JkZXIiLCBPRkZTRVQocHJvZ19vcmRlciksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBPUEooTFJDUCkgICAgfSwgT1BKKExSQ1ApLCAgT1BKKENQUkwpLCAgICBWRSwgInByb2dfb3JkZXIiICB9LAotICAgIHsgImxyY3AiLCAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUEooTFJDUCkgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9nX29yZGVyIiAgfSwKLSAgICB7ICJybGNwIiwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BKKFJMQ1ApICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZ19vcmRlciIgIH0sCi0gICAgeyAicnBjbCIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSihSUENMKSAgICB9LCAwLCAgICAgICAgIDAsICAgICAgICAgICBWRSwgInByb2dfb3JkZXIiICB9LAotICAgIHsgInBjcmwiLCAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUEooUENSTCkgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9nX29yZGVyIiAgfSwKLSAgICB7ICJjcHJsIiwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BKKENQUkwpICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZ19vcmRlciIgIH0sCi0gICAgeyAibnVtcmVzb2x1dGlvbiIsIE5VTEwsICAgICAgICAgICAgICAgIE9GRlNFVChudW1yZXNvbHV0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDYgICAgICAgICAgIH0sIDEsICAgICAgICAgSU5UX01BWCwgICAgIFZFICAgICAgICAgICAgICAgIH0sCi0gICAgeyAibnVtbGF5ZXJzIiwgICAgIE5VTEwsICAgICAgICAgICAgICAgIE9GRlNFVChudW1sYXllcnMpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDEgICAgICAgICAgIH0sIDEsICAgICAgICAgMTAsICAgICAgICAgIFZFICAgICAgICAgICAgICAgIH0sCi0gICAgeyAiZGlzdG9fYWxsb2MiLCAgIE5VTEwsICAgICAgICAgICAgICAgIE9GRlNFVChkaXN0b19hbGxvYyksICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDEgICAgICAgICAgIH0sIDAsICAgICAgICAgMSwgICAgICAgICAgIFZFICAgICAgICAgICAgICAgIH0sCi0gICAgeyAiZml4ZWRfYWxsb2MiLCAgIE5VTEwsICAgICAgICAgICAgICAgIE9GRlNFVChmaXhlZF9hbGxvYyksICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgICAgICAgICAgIH0sIDAsICAgICAgICAgMSwgICAgICAgICAgIFZFICAgICAgICAgICAgICAgIH0sCi0gICAgeyAiZml4ZWRfcXVhbGl0eSIsIE5VTEwsICAgICAgICAgICAgICAgIE9GRlNFVChmaXhlZF9xdWFsaXR5KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgICAgICAgICAgIH0sIDAsICAgICAgICAgMSwgICAgICAgICAgIFZFICAgICAgICAgICAgICAgIH0sCisgICAgeyAiZm9ybWF0IiwgICAgICAgICJDb2RlYyBGb3JtYXQiLCAgICAgIE9GRlNFVChmb3JtYXQpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IE9QSl9DT0RFQ19KUDIgICB9LCBPUEpfQ09ERUNfSjJLLCBPUEpfQ09ERUNfSlAyLCAgIFZFLCAiZm9ybWF0IiAgICAgIH0sCisgICAgeyAiajJrIiwgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSl9DT0RFQ19KMksgICB9LCAwLCAgICAgICAgIDAsICAgICAgICAgICBWRSwgImZvcm1hdCIgICAgICB9LAorICAgIHsgImpwMiIsICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUEpfQ09ERUNfSlAyICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJmb3JtYXQiICAgICAgfSwKKyAgICB7ICJwcm9maWxlIiwgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKHByb2ZpbGUpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gT1BKX1NURF9SU0laICAgIH0sIE9QSl9TVERfUlNJWiwgIE9QSl9DSU5FTUE0SywgICAgVkUsICJwcm9maWxlIiAgICAgfSwKKyAgICB7ICJqcGVnMjAwMCIsICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BKX1NURF9SU0laICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZmlsZSIgICAgIH0sCisgICAgeyAiY2luZW1hMmsiLCAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSl9DSU5FTUEySyAgICB9LCAwLCAgICAgICAgIDAsICAgICAgICAgICBWRSwgInByb2ZpbGUiICAgICB9LAorICAgIHsgImNpbmVtYTRrIiwgICAgICBOVUxMLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUEpfQ0lORU1BNEsgICAgfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJwcm9maWxlIiAgICAgfSwKKyAgICB7ICJjaW5lbWFfbW9kZSIsICAgIkRpZ2l0YWwgQ2luZW1hIiwgICAgT0ZGU0VUKGNpbmVtYV9tb2RlKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gT1BKX09GRiAgICAgICAgIH0sIE9QSl9PRkYsICAgICAgIE9QSl9DSU5FTUE0S18yNCwgVkUsICJjaW5lbWFfbW9kZSIgfSwKKyAgICB7ICJvZmYiLCAgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BKX09GRiAgICAgICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAiY2luZW1hX21vZGUiIH0sCisgICAgeyAiMmtfMjQiLCAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSl9DSU5FTUEyS18yNCB9LCAwLCAgICAgICAgIDAsICAgICAgICAgICBWRSwgImNpbmVtYV9tb2RlIiB9LAorICAgIHsgIjJrXzQ4IiwgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBPUEpfQ0lORU1BMktfNDggfSwgMCwgICAgICAgICAwLCAgICAgICAgICAgVkUsICJjaW5lbWFfbW9kZSIgfSwKKyAgICB7ICI0a18yNCIsICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gT1BKX0NJTkVNQTRLXzI0IH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAiY2luZW1hX21vZGUiIH0sCisgICAgeyAicHJvZ19vcmRlciIsICAgICJQcm9ncmVzc2lvbiBPcmRlciIsIE9GRlNFVChwcm9nX29yZGVyKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IE9QSl9MUkNQICAgIH0sIE9QSl9MUkNQLCAgT1BKX0NQUkwsICAgIFZFLCAicHJvZ19vcmRlciIgIH0sCisgICAgeyAibHJjcCIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSl9MUkNQICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZ19vcmRlciIgIH0sCisgICAgeyAicmxjcCIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSl9STENQICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZ19vcmRlciIgIH0sCisgICAgeyAicnBjbCIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSl9SUENMICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZ19vcmRlciIgIH0sCisgICAgeyAicGNybCIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSl9QQ1JMICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZ19vcmRlciIgIH0sCisgICAgeyAiY3BybCIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE9QSl9DUFJMICAgIH0sIDAsICAgICAgICAgMCwgICAgICAgICAgIFZFLCAicHJvZ19vcmRlciIgIH0sCisgICAgeyAibnVtcmVzb2x1dGlvbiIsIE5VTEwsICAgICAgICAgICAgICAgIE9GRlNFVChudW1yZXNvbHV0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDYgICAgICAgICAgICB9LCAwLCAgICAgICAgIDMzLCAgICAgICAgICBWRSAgICAgICAgICAgICAgICB9LAorICAgIHsgImlycmV2ZXJzaWJsZSIsICBOVUxMLCAgICAgICAgICAgICAgICBPRkZTRVQoaXJyZXZlcnNpYmxlKSwgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwICAgICAgICAgICAgfSwgMCwgICAgICAgICAxLCAgICAgICAgICAgVkUgICAgICAgICAgICAgICAgfSwKKyAgICB7ICJkaXN0b19hbGxvYyIsICAgTlVMTCwgICAgICAgICAgICAgICAgT0ZGU0VUKGRpc3RvX2FsbG9jKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMSAgICAgICAgICAgIH0sIDAsICAgICAgICAgMSwgICAgICAgICAgIFZFICAgICAgICAgICAgICAgIH0sCisgICAgeyAiZml4ZWRfcXVhbGl0eSIsIE5VTEwsICAgICAgICAgICAgICAgIE9GRlNFVChmaXhlZF9xdWFsaXR5KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgICAgICAgICAgICB9LCAwLCAgICAgICAgIDEsICAgICAgICAgICBWRSAgICAgICAgICAgICAgICB9LAogICAgIHsgTlVMTCB9LAogfTsKIApAQCAtODM3LDcgKzc1Nyw2IEBACiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKExpYk9wZW5KUEVHQ29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgID0gbGlib3BlbmpwZWdfZW5jb2RlX2luaXQsCiAgICAgLmVuY29kZTIgICAgICAgID0gbGlib3BlbmpwZWdfZW5jb2RlX2ZyYW1lLAotICAgIC5jbG9zZSAgICAgICAgICA9IGxpYm9wZW5qcGVnX2VuY29kZV9jbG9zZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IEFWX0NPREVDX0NBUF9JTlRSQV9PTkxZLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgewogICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX1JHQkEsIEFWX1BJWF9GTVRfUkdCNDgsCkBAIC04NTksNCArNzc4LDUgQEAKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfSwKICAgICAucHJpdl9jbGFzcyAgICAgPSAmb3BlbmpwZWdfY2xhc3MsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYm9wZW5qcGVnIiwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYm9wdXNkZWMuYyBiL2xpYmF2Y29kZWMvbGlib3B1c2RlYy5jCmluZGV4IDFlOTc2MDQuLjJhOTc4MTEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlib3B1c2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvbGlib3B1c2RlYy5jCkBAIC0yMiw5ICsyMiwxMSBAQAogI2luY2x1ZGUgPG9wdXMuaD4KICNpbmNsdWRlIDxvcHVzX211bHRpc3RyZWFtLmg+CiAKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmbWF0aC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKwogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInZvcmJpcy5oIgpAQCAtMzIsMTEgKzM0LDE1IEBACiAjaW5jbHVkZSAibGlib3B1cy5oIgogCiBzdHJ1Y3QgbGlib3B1c19jb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKICAgICBPcHVzTVNEZWNvZGVyICpkZWM7CiAgICAgaW50IHByZV9za2lwOwogI2lmbmRlZiBPUFVTX1NFVF9HQUlOCiAgICAgdW5pb24geyBpbnQgaTsgZG91YmxlIGQ7IH0gZ2FpbjsKICNlbmRpZgorI2lmZGVmIE9QVVNfU0VUX1BIQVNFX0lOVkVSU0lPTl9ESVNBQkxFRF9SRVFVRVNUCisgICAgaW50IGFwcGx5X3BoYXNlX2ludjsKKyNlbmRpZgogfTsKIAogI2RlZmluZSBPUFVTX0hFQURfU0laRSAxOQpAQCAtNDcsMTEgKzUzLDE2IEBACiAgICAgaW50IHJldCwgY2hhbm5lbF9tYXAgPSAwLCBnYWluX2RiID0gMCwgbmJfc3RyZWFtcywgbmJfY291cGxlZDsKICAgICB1aW50OF90IG1hcHBpbmdfYXJyWzhdID0geyAwLCAxIH0sICptYXBwaW5nOwogCisgICAgYXZjLT5jaGFubmVscyA9IGF2Yy0+ZXh0cmFkYXRhX3NpemUgPj0gMTAgPyBhdmMtPmV4dHJhZGF0YVs5XSA6IChhdmMtPmNoYW5uZWxzID09IDEpID8gMSA6IDI7CisgICAgaWYgKGF2Yy0+Y2hhbm5lbHMgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAlZCwgZGVmYXVsdGluZyB0byBzdGVyZW9cbiIsIGF2Yy0+Y2hhbm5lbHMpOworICAgICAgICBhdmMtPmNoYW5uZWxzID0gMjsKKyAgICB9CisKICAgICBhdmMtPnNhbXBsZV9yYXRlICAgID0gNDgwMDA7CiAgICAgYXZjLT5zYW1wbGVfZm10ICAgICA9IGF2Yy0+cmVxdWVzdF9zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfRkxUID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQgOiBBVl9TQU1QTEVfRk1UX1MxNjsKLSAgICBhdmMtPmNoYW5uZWxfbGF5b3V0ID0gYXZjLT5jaGFubmVscyA+IDggPyAwIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0c1thdmMtPmNoYW5uZWxzIC0gMV07CiAKICAgICBpZiAoYXZjLT5leHRyYWRhdGFfc2l6ZSA+PSBPUFVTX0hFQURfU0laRSkgewogICAgICAgICBvcHVzLT5wcmVfc2tpcCA9IEFWX1JMMTYoYXZjLT5leHRyYWRhdGEgKyAxMCk7CkBAIC03NSwxNCArODYsMzUgQEAKICAgICAgICAgbWFwcGluZyAgICA9IG1hcHBpbmdfYXJyOwogICAgIH0KIAotICAgIGlmIChhdmMtPmNoYW5uZWxzID4gMiAmJiBhdmMtPmNoYW5uZWxzIDw9IDgpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqdm9yYmlzX29mZnNldCA9IGZmX3ZvcmJpc19jaGFubmVsX2xheW91dF9vZmZzZXRzW2F2Yy0+Y2hhbm5lbHMgLSAxXTsKLSAgICAgICAgaW50IGNoOworICAgIGlmIChjaGFubmVsX21hcCA9PSAxKSB7CisgICAgICAgIGF2Yy0+Y2hhbm5lbF9sYXlvdXQgPSBhdmMtPmNoYW5uZWxzID4gOCA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdm9yYmlzX2NoYW5uZWxfbGF5b3V0c1thdmMtPmNoYW5uZWxzIC0gMV07CisgICAgICAgIGlmIChhdmMtPmNoYW5uZWxzID4gMiAmJiBhdmMtPmNoYW5uZWxzIDw9IDgpIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZvcmJpc19vZmZzZXQgPSBmZl92b3JiaXNfY2hhbm5lbF9sYXlvdXRfb2Zmc2V0c1thdmMtPmNoYW5uZWxzIC0gMV07CisgICAgICAgICAgICBpbnQgY2g7CiAKLSAgICAgICAgLyogUmVtYXAgY2hhbm5lbHMgZnJvbSB2b3JiaXMgb3JkZXIgdG8gZmZtcGVnIG9yZGVyICovCi0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGF2Yy0+Y2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICBtYXBwaW5nX2FycltjaF0gPSBtYXBwaW5nW3ZvcmJpc19vZmZzZXRbY2hdXTsKLSAgICAgICAgbWFwcGluZyA9IG1hcHBpbmdfYXJyOworICAgICAgICAgICAgLyogUmVtYXAgY2hhbm5lbHMgZnJvbSBWb3JiaXMgb3JkZXIgdG8gZmZtcGVnIG9yZGVyICovCisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBhdmMtPmNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgICAgIG1hcHBpbmdfYXJyW2NoXSA9IG1hcHBpbmdbdm9yYmlzX29mZnNldFtjaF1dOworICAgICAgICAgICAgbWFwcGluZyA9IG1hcHBpbmdfYXJyOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjaGFubmVsX21hcCA9PSAyKSB7CisgICAgICAgIGludCBhbWJpc29uaWNfb3JkZXIgPSBmZl9zcXJ0KGF2Yy0+Y2hhbm5lbHMpIC0gMTsKKyAgICAgICAgaWYgKGF2Yy0+Y2hhbm5lbHMgIT0gKGFtYmlzb25pY19vcmRlciArIDEpICogKGFtYmlzb25pY19vcmRlciArIDEpICYmCisgICAgICAgICAgICBhdmMtPmNoYW5uZWxzICE9IChhbWJpc29uaWNfb3JkZXIgKyAxKSAqIChhbWJpc29uaWNfb3JkZXIgKyAxKSArIDIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiQ2hhbm5lbCBtYXBwaW5nIDIgaXMgb25seSBzcGVjaWZpZWQgZm9yIGNoYW5uZWwgY291bnRzIgorICAgICAgICAgICAgICAgICAgICIgd2hpY2ggY2FuIGJlIHdyaXR0ZW4gYXMgKG4gKyAxKV4yIG9yIChuICsgMileMiArIDIiCisgICAgICAgICAgICAgICAgICAgIiBmb3Igbm9ubmVnYXRpdmUgaW50ZWdlciBuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChhdmMtPmNoYW5uZWxzID4gMjI3KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjLCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBjaGFubmVsc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBhdmMtPmNoYW5uZWxfbGF5b3V0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmMtPmNoYW5uZWxfbGF5b3V0ID0gMDsKICAgICB9CiAKICAgICBvcHVzLT5kZWMgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGF2Yy0+c2FtcGxlX3JhdGUsIGF2Yy0+Y2hhbm5lbHMsCkBAIC0xMDksNiArMTQxLDE1IEBACiAgICAgfQogI2VuZGlmCiAKKyNpZmRlZiBPUFVTX1NFVF9QSEFTRV9JTlZFUlNJT05fRElTQUJMRURfUkVRVUVTVAorICAgIHJldCA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwob3B1cy0+ZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfUEhBU0VfSU5WRVJTSU9OX0RJU0FCTEVEKCFvcHVzLT5hcHBseV9waGFzZV9pbnYpKTsKKyAgICBpZiAocmV0ICE9IE9QVVNfT0spCisgICAgICAgIGF2X2xvZyhhdmMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgcGhhc2UgaW52ZXJzaW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3IocmV0KSk7CisjZW5kaWYKKwogICAgIC8qIERlY29kZXIgZGVsYXkgKGluIHNhbXBsZXMpIGF0IDQ4a0h6ICovCiAgICAgYXZjLT5kZWxheSA9IGF2Yy0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyA9IG9wdXMtPnByZV9za2lwOwogCkBAIC0xMTksNyArMTYwLDEwIEBACiB7CiAgICAgc3RydWN0IGxpYm9wdXNfY29udGV4dCAqb3B1cyA9IGF2Yy0+cHJpdl9kYXRhOwogCi0gICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2Rlc3Ryb3kob3B1cy0+ZGVjKTsKKyAgICBpZiAob3B1cy0+ZGVjKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG9wdXMtPmRlYyk7CisgICAgICAgIG9wdXMtPmRlYyA9IE5VTEw7CisgICAgfQogICAgIHJldHVybiAwOwogfQogCkBAIC0xODIsNiArMjI2LDI0IEBACiAgICAgYXZjLT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzID0gb3B1cy0+cHJlX3NraXA7CiB9CiAKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2Yoc3RydWN0IGxpYm9wdXNfY29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGxpYm9wdXNkZWNfb3B0aW9uc1tdID0geworI2lmZGVmIE9QVVNfU0VUX1BIQVNFX0lOVkVSU0lPTl9ESVNBQkxFRF9SRVFVRVNUCisgICAgeyAiYXBwbHlfcGhhc2VfaW52IiwgIkFwcGx5IGludGVuc2l0eSBzdGVyZW8gcGhhc2UgaW52ZXJzaW9uIiwgT0ZGU0VUKGFwcGx5X3BoYXNlX2ludiksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDEgfSwgMCwgMSwgRkxBR1MgfSwKKyNlbmRpZgorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgbGlib3B1c2RlY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJsaWJvcHVzZGVjIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gbGlib3B1c2RlY19vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworCiBBVkNvZGVjIGZmX2xpYm9wdXNfZGVjb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibGlib3B1cyIsCiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYm9wdXMgT3B1cyIpLApAQCAtMTkzLDcgKzI1NSwxMCBAQAogICAgIC5kZWNvZGUgICAgICAgICA9IGxpYm9wdXNfZGVjb2RlLAogICAgIC5mbHVzaCAgICAgICAgICA9IGxpYm9wdXNfZmx1c2gsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAogICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX0ZMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZsaWJvcHVzZGVjX2NsYXNzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJvcHVzIiwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYm9wdXNlbmMuYyBiL2xpYmF2Y29kZWMvbGlib3B1c2VuYy5jCmluZGV4IDNmM2U4MGQuLjRhZTgxYjAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlib3B1c2VuYy5jCisrKyBiL2xpYmF2Y29kZWMvbGlib3B1c2VuYy5jCkBAIC0zOCw2ICszOCwxMCBAQAogICAgIGZsb2F0IGZyYW1lX2R1cmF0aW9uOwogICAgIGludCBwYWNrZXRfc2l6ZTsKICAgICBpbnQgbWF4X2JhbmR3aWR0aDsKKyAgICBpbnQgbWFwcGluZ19mYW1pbHk7CisjaWZkZWYgT1BVU19TRVRfUEhBU0VfSU5WRVJTSU9OX0RJU0FCTEVEX1JFUVVFU1QKKyAgICBpbnQgYXBwbHlfcGhhc2VfaW52OworI2VuZGlmCiB9IExpYm9wdXNFbmNPcHRzOwogCiB0eXBlZGVmIHN0cnVjdCBMaWJvcHVzRW5jQ29udGV4dCB7CkBAIC00Nyw2ICs1MSw3IEBACiAgICAgdWludDhfdCAqc2FtcGxlczsKICAgICBMaWJvcHVzRW5jT3B0cyBvcHRzOwogICAgIEF1ZGlvRnJhbWVRdWV1ZSBhZnE7CisgICAgY29uc3QgdWludDhfdCAqZW5jb2Rlcl9jaGFubmVsX21hcDsKIH0gTGlib3B1c0VuY0NvbnRleHQ7CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IG9wdXNfY291cGxlZF9zdHJlYW1zWzhdID0gewpAQCAtNzksNiArODQsNyBAQAogCiBzdGF0aWMgdm9pZCBsaWJvcHVzX3dyaXRlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBzdHJlYW1fY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291cGxlZF9zdHJlYW1fY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFwcGluZ19mYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjaGFubmVsX21hcHBpbmcpCiB7CiAgICAgdWludDhfdCAqcCAgID0gYXZjdHgtPmV4dHJhZGF0YTsKQEAgLTkyLDEzICs5OCwxMSBAQAogICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnAsIDApOyAvKiBHYWluIG9mIDBkQiBpcyByZWNvbW1lbmRlZC4gKi8KIAogICAgIC8qIENoYW5uZWwgbWFwcGluZyAqLwotICAgIGlmIChjaGFubmVscyA+IDIpIHsKLSAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgY2hhbm5lbHMgPD0gOCA/IDEgOiAyNTUpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIG1hcHBpbmdfZmFtaWx5KTsKKyAgICBpZiAobWFwcGluZ19mYW1pbHkgIT0gMCkgewogICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCBzdHJlYW1fY291bnQpOwogICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCBjb3VwbGVkX3N0cmVhbV9jb3VudCk7CiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgY2hhbm5lbF9tYXBwaW5nLCBjaGFubmVscyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMCk7CiAgICAgfQogfQogCkBAIC0xNTMsNDIgKzE1NywxMDMgQEAKICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHNldCBtYXhpbXVtIGJhbmR3aWR0aDogJXNcbiIsIG9wdXNfc3RyZXJyb3IocmV0KSk7CiAgICAgfQogCisjaWZkZWYgT1BVU19TRVRfUEhBU0VfSU5WRVJTSU9OX0RJU0FCTEVEX1JFUVVFU1QKKyAgICByZXQgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVVNfU0VUX1BIQVNFX0lOVkVSU0lPTl9ESVNBQkxFRCghb3B0cy0+YXBwbHlfcGhhc2VfaW52KSk7CisgICAgaWYgKHJldCAhPSBPUFVTX09LKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlVuYWJsZSB0byBzZXQgcGhhc2UgaW52ZXJzaW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3IocmV0KSk7CisjZW5kaWYKICAgICByZXR1cm4gT1BVU19PSzsKIH0KIAorc3RhdGljIGludCBsaWJvcHVzX2NoZWNrX21heF9jaGFubmVscyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY2hhbm5lbHMpIHsKKyAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID4gbWF4X2NoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT3B1cyBtYXBwaW5nIGZhbWlseSB1bmRlZmluZWQgZm9yICVkIGNoYW5uZWxzLlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlib3B1c19jaGVja192b3JiaXNfbGF5b3V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IG1hcHBpbmdfZmFtaWx5KSB7CisgICAgYXZfYXNzZXJ0MihhdmN0eC0+Y2hhbm5lbHMgPCBGRl9BUlJBWV9FTEVNUyhmZl92b3JiaXNfY2hhbm5lbF9sYXlvdXRzKSk7CisKKyAgICBpZiAoIWF2Y3R4LT5jaGFubmVsX2xheW91dCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIk5vIGNoYW5uZWwgbGF5b3V0IHNwZWNpZmllZC4gT3B1cyBlbmNvZGVyIHdpbGwgdXNlIFZvcmJpcyAiCisgICAgICAgICAgICAgICAiY2hhbm5lbCBsYXlvdXQgZm9yICVkIGNoYW5uZWxzLlxuIiwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jaGFubmVsX2xheW91dCAhPSBmZl92b3JiaXNfY2hhbm5lbF9sYXlvdXRzW2F2Y3R4LT5jaGFubmVscyAtIDFdKSB7CisgICAgICAgIGNoYXIgbmFtZVszMl07CisgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcobmFtZSwgc2l6ZW9mKG5hbWUpLCBhdmN0eC0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0KTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiSW52YWxpZCBjaGFubmVsIGxheW91dCAlcyBmb3Igc3BlY2lmaWVkIG1hcHBpbmcgZmFtaWx5ICVkLlxuIiwKKyAgICAgICAgICAgICAgIG5hbWUsIG1hcHBpbmdfZmFtaWx5KTsKKworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxpYm9wdXNfdmFsaWRhdGVfbGF5b3V0X2FuZF9nZXRfY2hhbm5lbF9tYXAoCisgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgaW50IG1hcHBpbmdfZmFtaWx5LAorICAgICAgICBjb25zdCB1aW50OF90ICoqIGNoYW5uZWxfbWFwX3Jlc3VsdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICogY2hhbm5lbF9tYXAgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBzd2l0Y2ggKG1hcHBpbmdfZmFtaWx5KSB7CisgICAgY2FzZSAtMToKKyAgICAgICAgcmV0ID0gbGlib3B1c19jaGVja19tYXhfY2hhbm5lbHMoYXZjdHgsIDgpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIHJldCA9IGxpYm9wdXNfY2hlY2tfdm9yYmlzX2xheW91dChhdmN0eCwgbWFwcGluZ19mYW1pbHkpOworICAgICAgICAgICAgLyogQ2hhbm5lbHMgZG8gbm90IG5lZWQgdG8gYmUgcmVvcmRlcmVkLiAqLworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgICAgICByZXQgPSBsaWJvcHVzX2NoZWNrX21heF9jaGFubmVscyhhdmN0eCwgMik7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgcmV0ID0gbGlib3B1c19jaGVja192b3JiaXNfbGF5b3V0KGF2Y3R4LCBtYXBwaW5nX2ZhbWlseSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICAvKiBPcHVzIGV4cGVjdHMgY2hhbm5lbHMgdG8gYmUgaW4gVm9yYmlzIG9yZGVyLiAqLworICAgICAgICByZXQgPSBsaWJvcHVzX2NoZWNrX21heF9jaGFubmVscyhhdmN0eCwgOCk7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgcmV0ID0gbGlib3B1c19jaGVja192b3JiaXNfbGF5b3V0KGF2Y3R4LCBtYXBwaW5nX2ZhbWlseSk7CisgICAgICAgICAgICBjaGFubmVsX21hcCA9IGZmX3ZvcmJpc19jaGFubmVsX2xheW91dF9vZmZzZXRzW2F2Y3R4LT5jaGFubmVscyAtIDFdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjU1OgorICAgICAgICByZXQgPSBsaWJvcHVzX2NoZWNrX21heF9jaGFubmVscyhhdmN0eCwgMjU0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJVbmtub3duIGNoYW5uZWwgbWFwcGluZyBmYW1pbHkgJWQuIE91dHB1dCBjaGFubmVsIGxheW91dCBtYXkgYmUgaW52YWxpZC5cbiIsCisgICAgICAgICAgICAgICBtYXBwaW5nX2ZhbWlseSk7CisgICAgICAgIHJldCA9IDA7CisgICAgfQorCisgICAgKmNoYW5uZWxfbWFwX3Jlc3VsdCA9IGNoYW5uZWxfbWFwOworICAgIHJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBhdl9jb2xkIGludCBsaWJvcHVzX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBMaWJvcHVzRW5jQ29udGV4dCAqb3B1cyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgY29uc3QgdWludDhfdCAqY2hhbm5lbF9tYXBwaW5nOwogICAgIE9wdXNNU0VuY29kZXIgKmVuYzsKKyAgICB1aW50OF90IGxpYm9wdXNfY2hhbm5lbF9tYXBwaW5nWzI1NV07CiAgICAgaW50IHJldCA9IE9QVVNfT0s7CisgICAgaW50IGF2X3JldDsKICAgICBpbnQgY291cGxlZF9zdHJlYW1fY291bnQsIGhlYWRlcl9zaXplLCBmcmFtZV9zaXplOwotCi0gICAgY291cGxlZF9zdHJlYW1fY291bnQgPSBvcHVzX2NvdXBsZWRfc3RyZWFtc1thdmN0eC0+Y2hhbm5lbHMgLSAxXTsKLSAgICBvcHVzLT5zdHJlYW1fY291bnQgICA9IGF2Y3R4LT5jaGFubmVscyAtIGNvdXBsZWRfc3RyZWFtX2NvdW50OwotICAgIGNoYW5uZWxfbWFwcGluZyAgICAgID0gbGliYXZjb2RlY19saWJvcHVzX2NoYW5uZWxfbWFwW2F2Y3R4LT5jaGFubmVscyAtIDFdOwotCi0gICAgLyogRklYTUU6IE9wdXMgY2FuIGhhbmRsZSB1cCB0byAyNTUgY2hhbm5lbHMuIEhvd2V2ZXIsIHRoZSBtYXBwaW5nIGZvcgotICAgICAqIGFueXRoaW5nIGdyZWF0ZXIgdGhhbiA4IGlzIHVuZGVmaW5lZC4gKi8KLSAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID4gOCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJDaGFubmVsIGxheW91dCB1bmRlZmluZWQgZm9yICVkIGNoYW5uZWxzLlxuIiwgYXZjdHgtPmNoYW5uZWxzKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwotICAgIH0KLSAgICBpZiAoIWF2Y3R4LT5iaXRfcmF0ZSkgewotICAgICAgICAvKiBTYW5lIGRlZmF1bHQgY29waWVkIGZyb20gb3B1c2VuYyAqLwotICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSA2NDAwMCAqIG9wdXMtPnN0cmVhbV9jb3VudCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwICogY291cGxlZF9zdHJlYW1fY291bnQ7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAiTm8gYml0IHJhdGUgc2V0LiBEZWZhdWx0aW5nIHRvICUiUFJJZDY0IiBicHMuXG4iLCAoaW50NjRfdClhdmN0eC0+Yml0X3JhdGUpOwotICAgIH0KLQotICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPCA1MDAgfHwgYXZjdHgtPmJpdF9yYXRlID4gMjU2MDAwICogYXZjdHgtPmNoYW5uZWxzKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhlIGJpdCByYXRlICUiUFJJZDY0IiBicHMgaXMgdW5zdXBwb3J0ZWQuICIKLSAgICAgICAgICAgICAgICJQbGVhc2UgY2hvb3NlIGEgdmFsdWUgYmV0d2VlbiA1MDAgYW5kICVkLlxuIiwgKGludDY0X3QpYXZjdHgtPmJpdF9yYXRlLAotICAgICAgICAgICAgICAgMjU2MDAwICogYXZjdHgtPmNoYW5uZWxzKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9CisgICAgaW50IG1hcHBpbmdfZmFtaWx5OwogCiAgICAgZnJhbWVfc2l6ZSA9IG9wdXMtPm9wdHMuZnJhbWVfZHVyYXRpb24gKiA0ODAwMCAvIDEwMDA7CiAgICAgc3dpdGNoIChmcmFtZV9zaXplKSB7CkBAIC0yNTEsMjQgKzMxNiw3MSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZW5jID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2NyZWF0ZShhdmN0eC0+c2FtcGxlX3JhdGUsIGF2Y3R4LT5jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXMtPnN0cmVhbV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdXBsZWRfc3RyZWFtX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbF9tYXBwaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1cy0+b3B0cy5hcHBsaWNhdGlvbiwgJnJldCk7CisgICAgLyogQ2hhbm5lbHMgbWF5IG5lZWQgdG8gYmUgcmVvcmRlcmVkIHRvIG1hdGNoIG9wdXMgbWFwcGluZy4gKi8KKyAgICBhdl9yZXQgPSBsaWJvcHVzX3ZhbGlkYXRlX2xheW91dF9hbmRfZ2V0X2NoYW5uZWxfbWFwKGF2Y3R4LCBvcHVzLT5vcHRzLm1hcHBpbmdfZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdXMtPmVuY29kZXJfY2hhbm5lbF9tYXApOworICAgIGlmIChhdl9yZXQpIHsKKyAgICAgICAgcmV0dXJuIGF2X3JldDsKKyAgICB9CisKKyAgICBpZiAob3B1cy0+b3B0cy5tYXBwaW5nX2ZhbWlseSA9PSAtMSkgeworICAgICAgICAvKiBCeSBkZWZhdWx0LCB1c2UgbWFwcGluZyBmYW1pbHkgMSBmb3IgdGhlIGhlYWRlciBidXQgdXNlIHRoZSBvbGRlcgorICAgICAgICAgKiBsaWJvcHVzIG11bHRpc3RyZWFtIEFQSSB0byBhdm9pZCBzdXJyb3VuZCBtYXNraW5nLiAqLworCisgICAgICAgIC8qIFNldCB0aGUgbWFwcGluZyBmYW1pbHkgc28gdGhhdCB0aGUgdmFsdWUgaXMgY29ycmVjdCBpbiB0aGUgaGVhZGVyICovCisgICAgICAgIG1hcHBpbmdfZmFtaWx5ID0gYXZjdHgtPmNoYW5uZWxzID4gMiA/IDEgOiAwOworICAgICAgICBjb3VwbGVkX3N0cmVhbV9jb3VudCA9IG9wdXNfY291cGxlZF9zdHJlYW1zW2F2Y3R4LT5jaGFubmVscyAtIDFdOworICAgICAgICBvcHVzLT5zdHJlYW1fY291bnQgICA9IGF2Y3R4LT5jaGFubmVscyAtIGNvdXBsZWRfc3RyZWFtX2NvdW50OworICAgICAgICBtZW1jcHkobGlib3B1c19jaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICBvcHVzX3ZvcmJpc19jaGFubmVsX21hcFthdmN0eC0+Y2hhbm5lbHMgLSAxXSwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAqIHNpemVvZigqbGlib3B1c19jaGFubmVsX21hcHBpbmcpKTsKKworICAgICAgICBlbmMgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3JlYXRlKAorICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlLCBhdmN0eC0+Y2hhbm5lbHMsIG9wdXMtPnN0cmVhbV9jb3VudCwKKyAgICAgICAgICAgIGNvdXBsZWRfc3RyZWFtX2NvdW50LAorICAgICAgICAgICAgbGliYXZjb2RlY19saWJvcHVzX2NoYW5uZWxfbWFwW2F2Y3R4LT5jaGFubmVscyAtIDFdLAorICAgICAgICAgICAgb3B1cy0+b3B0cy5hcHBsaWNhdGlvbiwgJnJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVXNlIHRoZSBuZXdlciBtdWx0aXN0cmVhbSBBUEkuIFRoZSBlbmNvZGVyIHdpbGwgc2V0IHRoZSBjaGFubmVsCisgICAgICAgICAqIG1hcHBpbmcgYW5kIGNvdXBsZWQgc3RyZWFtIGNvdW50cyB0byBpdHMgaW50ZXJuYWwgZGVmYXVsdHMgYW5kIHdpbGwKKyAgICAgICAgICogdXNlIHN1cnJvdW5kIG1hc2tpbmcgYW5hbHlzaXMgdG8gc2F2ZSBiaXRzLiAqLworICAgICAgICBtYXBwaW5nX2ZhbWlseSA9IG9wdXMtPm9wdHMubWFwcGluZ19mYW1pbHk7CisgICAgICAgIGVuYyA9IG9wdXNfbXVsdGlzdHJlYW1fc3Vycm91bmRfZW5jb2Rlcl9jcmVhdGUoCisgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUsIGF2Y3R4LT5jaGFubmVscywgbWFwcGluZ19mYW1pbHksCisgICAgICAgICAgICAmb3B1cy0+c3RyZWFtX2NvdW50LCAmY291cGxlZF9zdHJlYW1fY291bnQsIGxpYm9wdXNfY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgb3B1cy0+b3B0cy5hcHBsaWNhdGlvbiwgJnJldCk7CisgICAgfQorCiAgICAgaWYgKHJldCAhPSBPUFVTX09LKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgZW5jb2RlcjogJXNcbiIsIG9wdXNfc3RyZXJyb3IocmV0KSk7CiAgICAgICAgIHJldHVybiBmZl9vcHVzX2Vycm9yX3RvX2F2ZXJyb3IocmV0KTsKICAgICB9CiAKKyAgICBpZiAoIWF2Y3R4LT5iaXRfcmF0ZSkgeworICAgICAgICAvKiBTYW5lIGRlZmF1bHQgY29waWVkIGZyb20gb3B1c2VuYyAqLworICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSA2NDAwMCAqIG9wdXMtPnN0cmVhbV9jb3VudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwICogY291cGxlZF9zdHJlYW1fY291bnQ7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiTm8gYml0IHJhdGUgc2V0LiBEZWZhdWx0aW5nIHRvICUiUFJJZDY0IiBicHMuXG4iLCBhdmN0eC0+Yml0X3JhdGUpOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPCA1MDAgfHwgYXZjdHgtPmJpdF9yYXRlID4gMjU2MDAwICogYXZjdHgtPmNoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhlIGJpdCByYXRlICUiUFJJZDY0IiBicHMgaXMgdW5zdXBwb3J0ZWQuICIKKyAgICAgICAgICAgICAgICJQbGVhc2UgY2hvb3NlIGEgdmFsdWUgYmV0d2VlbiA1MDAgYW5kICVkLlxuIiwgYXZjdHgtPmJpdF9yYXRlLAorICAgICAgICAgICAgICAgMjU2MDAwICogYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCiAgICAgcmV0ID0gbGlib3B1c19jb25maWd1cmVfZW5jb2RlcihhdmN0eCwgZW5jLCAmb3B1cy0+b3B0cyk7CiAgICAgaWYgKHJldCAhPSBPUFVTX09LKSB7CiAgICAgICAgIHJldCA9IGZmX29wdXNfZXJyb3JfdG9fYXZlcnJvcihyZXQpOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCi0gICAgaGVhZGVyX3NpemUgPSAxOSArIChhdmN0eC0+Y2hhbm5lbHMgPiAyID8gMiArIGF2Y3R4LT5jaGFubmVscyA6IDApOworICAgIC8qIEhlYWRlciBpbmNsdWRlcyBjaGFubmVsIG1hcHBpbmcgdGFibGUgaWYgYW5kIG9ubHkgaWYgbWFwcGluZyBmYW1pbHkgaXMgTk9UIDAgKi8KKyAgICBoZWFkZXJfc2l6ZSA9IDE5ICsgKG1hcHBpbmdfZmFtaWx5ID09IDAgPyAwIDogMiArIGF2Y3R4LT5jaGFubmVscyk7CiAgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyhoZWFkZXJfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBleHRyYWRhdGEuXG4iKTsKQEAgLTI5Miw3ICs0MDQsNyBAQAogICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihyZXQpKTsKIAogICAgIGxpYm9wdXNfd3JpdGVfaGVhZGVyKGF2Y3R4LCBvcHVzLT5zdHJlYW1fY291bnQsIGNvdXBsZWRfc3RyZWFtX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIG9wdXNfdm9yYmlzX2NoYW5uZWxfbWFwW2F2Y3R4LT5jaGFubmVscyAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nX2ZhbWlseSwgbGlib3B1c19jaGFubmVsX21hcHBpbmcpOwogCiAgICAgZmZfYWZfcXVldWVfaW5pdChhdmN0eCwgJm9wdXMtPmFmcSk7CiAKQEAgLTMwNiwxMiArNDE4LDI2IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgbGlib3B1c19jb3B5X3NhbXBsZXNfd2l0aF9jaGFubmVsX21hcCgKKyAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqY2hhbm5lbF9tYXAsCisgICAgaW50IG5iX2NoYW5uZWxzLCBpbnQgbmJfc2FtcGxlcywgaW50IGJ5dGVzX3Blcl9zYW1wbGUpIHsKKyAgICBpbnQgc2FtcGxlLCBjaGFubmVsOworICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgbmJfc2FtcGxlczsgKytzYW1wbGUpIHsKKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IG5iX2NoYW5uZWxzOyArK2NoYW5uZWwpIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzcmNfcG9zID0gYnl0ZXNfcGVyX3NhbXBsZSAqIChuYl9jaGFubmVscyAqIHNhbXBsZSArIGNoYW5uZWwpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGRzdF9wb3MgPSBieXRlc19wZXJfc2FtcGxlICogKG5iX2NoYW5uZWxzICogc2FtcGxlICsgY2hhbm5lbF9tYXBbY2hhbm5lbF0pOworCisgICAgICAgICAgICBtZW1jcHkoJmRzdFtkc3RfcG9zXSwgJnNyY1tzcmNfcG9zXSwgYnl0ZXNfcGVyX3NhbXBsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXRpYyBpbnQgbGlib3B1c19lbmNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQogewogICAgIExpYm9wdXNFbmNDb250ZXh0ICpvcHVzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBjb25zdCBpbnQgc2FtcGxlX3NpemUgICA9IGF2Y3R4LT5jaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShhdmN0eC0+c2FtcGxlX2ZtdCk7CisgICAgY29uc3QgaW50IGJ5dGVzX3Blcl9zYW1wbGUgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShhdmN0eC0+c2FtcGxlX2ZtdCk7CisgICAgY29uc3QgaW50IHNhbXBsZV9zaXplICAgICAgPSBhdmN0eC0+Y2hhbm5lbHMgKiBieXRlc19wZXJfc2FtcGxlOwogICAgIHVpbnQ4X3QgKmF1ZGlvOwogICAgIGludCByZXQ7CiAgICAgaW50IGRpc2NhcmRfcGFkZGluZzsKQEAgLTMyMCw3ICs0NDYsMTIgQEAKICAgICAgICAgcmV0ID0gZmZfYWZfcXVldWVfYWRkKCZvcHVzLT5hZnEsIGZyYW1lKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICBpZiAoZnJhbWUtPm5iX3NhbXBsZXMgPCBvcHVzLT5vcHRzLnBhY2tldF9zaXplKSB7CisgICAgICAgIGlmIChvcHVzLT5lbmNvZGVyX2NoYW5uZWxfbWFwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGF1ZGlvID0gb3B1cy0+c2FtcGxlczsKKyAgICAgICAgICAgIGxpYm9wdXNfY29weV9zYW1wbGVzX3dpdGhfY2hhbm5lbF9tYXAoCisgICAgICAgICAgICAgICAgYXVkaW8sIGZyYW1lLT5kYXRhWzBdLCBvcHVzLT5lbmNvZGVyX2NoYW5uZWxfbWFwLAorICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywgZnJhbWUtPm5iX3NhbXBsZXMsIGJ5dGVzX3Blcl9zYW1wbGUpOworICAgICAgICB9IGVsc2UgaWYgKGZyYW1lLT5uYl9zYW1wbGVzIDwgb3B1cy0+b3B0cy5wYWNrZXRfc2l6ZSkgewogICAgICAgICAgICAgYXVkaW8gPSBvcHVzLT5zYW1wbGVzOwogICAgICAgICAgICAgbWVtY3B5KGF1ZGlvLCBmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPm5iX3NhbXBsZXMgKiBzYW1wbGVfc2l6ZSk7CiAgICAgICAgIH0gZWxzZQpAQCAtNDA5LDYgKzU0MCwxMCBAQAogICAgICAgICB7ICJvZmYiLCAgICAgICAgICAgICJVc2UgY29uc3RhbnQgYml0IHJhdGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMCB9LCAwLCAwLCBGTEFHUywgInZiciIgfSwKICAgICAgICAgeyAib24iLCAgICAgICAgICAgICAiVXNlIHZhcmlhYmxlIGJpdCByYXRlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDEgfSwgMCwgMCwgRkxBR1MsICJ2YnIiIH0sCiAgICAgICAgIHsgImNvbnN0cmFpbmVkIiwgICAgIlVzZSBjb25zdHJhaW5lZCBWQlIiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAyIH0sIDAsIDAsIEZMQUdTLCAidmJyIiB9LAorICAgIHsgIm1hcHBpbmdfZmFtaWx5IiwgIkNoYW5uZWwgTWFwcGluZyBGYW1pbHkiLCAgICAgICAgICAgICAgT0ZGU0VUKG1hcHBpbmdfZmFtaWx5KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xIH0sICAgLTEsICAyNTUsICBGTEFHUywgIm1hcHBpbmdfZmFtaWx5IiB9LAorI2lmZGVmIE9QVVNfU0VUX1BIQVNFX0lOVkVSU0lPTl9ESVNBQkxFRF9SRVFVRVNUCisgICAgeyAiYXBwbHlfcGhhc2VfaW52IiwgIkFwcGx5IGludGVuc2l0eSBzdGVyZW8gcGhhc2UgaW52ZXJzaW9uIiwgT0ZGU0VUKGFwcGx5X3BoYXNlX2ludiksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDEgfSwgMCwgMSwgRkxBR1MgfSwKKyNlbmRpZgogICAgIHsgTlVMTCB9LAogfTsKIApAQCAtNDQyLDggKzU3Nyw4IEBACiAgICAgLnNhbXBsZV9mbXRzICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MxNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCi0gICAgLmNoYW5uZWxfbGF5b3V0cyA9IGZmX3ZvcmJpc19jaGFubmVsX2xheW91dHMsCiAgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IGxpYm9wdXNfc2FtcGxlX3JhdGVzLAogICAgIC5wcml2X2NsYXNzICAgICAgPSAmbGlib3B1c19jbGFzcywKICAgICAuZGVmYXVsdHMgICAgICAgID0gbGlib3B1c19kZWZhdWx0cywKKyAgICAud3JhcHBlcl9uYW1lICAgID0gImxpYm9wdXMiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlicnN2Z2RlYy5jIGIvbGliYXZjb2RlYy9saWJyc3ZnZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5Nzc4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbGlicnN2Z2RlYy5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogTGlicnN2ZyByYXN0ZXJpemF0aW9uIHdyYXBwZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJyc3ZnLTIuMC9saWJyc3ZnL3JzdmcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTGliUlNWR0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworCisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IGtlZXBfYXI7Cit9IExpYlJTVkdDb250ZXh0OworCitzdGF0aWMgaW50IGxpYnJzdmdfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldDsKKyAgICBMaWJSU1ZHQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworCisgICAgUnN2Z0hhbmRsZSAqaGFuZGxlOworICAgIFJzdmdEaW1lbnNpb25EYXRhIHVuc2NhbGVkX2RpbWVuc2lvbnMsIGRpbWVuc2lvbnM7CisgICAgY2Fpcm9fc3VyZmFjZV90ICppbWFnZTsKKyAgICBjYWlyb190ICpjcmVuZGVyID0gTlVMTDsKKyAgICBHRXJyb3IgKmVycm9yID0gTlVMTDsKKworICAgICpnb3RfZnJhbWUgPSAwOworCisgICAgaGFuZGxlID0gcnN2Z19oYW5kbGVfbmV3X2Zyb21fZGF0YShwa3QtPmRhdGEsIHBrdC0+c2l6ZSwgJmVycm9yKTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIHN2ZyFcbiIpOworICAgICAgICBnX2Vycm9yX2ZyZWUoZXJyb3IpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByc3ZnX2hhbmRsZV9nZXRfZGltZW5zaW9ucyhoYW5kbGUsICZkaW1lbnNpb25zKTsKKyAgICByc3ZnX2hhbmRsZV9nZXRfZGltZW5zaW9ucyhoYW5kbGUsICZ1bnNjYWxlZF9kaW1lbnNpb25zKTsKKyAgICBkaW1lbnNpb25zLndpZHRoICA9IHMtPndpZHRoICA/IHMtPndpZHRoICA6IGRpbWVuc2lvbnMud2lkdGg7CisgICAgZGltZW5zaW9ucy5oZWlnaHQgPSBzLT5oZWlnaHQgPyBzLT5oZWlnaHQgOiBkaW1lbnNpb25zLmhlaWdodDsKKyAgICBpZiAocy0+a2VlcF9hciAmJiAocy0+d2lkdGggfHwgcy0+aGVpZ2h0KSkgeworICAgICAgICBkb3VibGUgZGVmYXVsdF9hciA9IHVuc2NhbGVkX2RpbWVuc2lvbnMud2lkdGgvKGRvdWJsZSl1bnNjYWxlZF9kaW1lbnNpb25zLmhlaWdodDsKKyAgICAgICAgaWYgKCFzLT53aWR0aCkKKyAgICAgICAgICAgIGRpbWVuc2lvbnMud2lkdGggID0gbHJpbnRmKGRpbWVuc2lvbnMuaGVpZ2h0ICogZGVmYXVsdF9hcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRpbWVuc2lvbnMuaGVpZ2h0ID0gbHJpbnRmKGRpbWVuc2lvbnMud2lkdGggIC8gZGVmYXVsdF9hcik7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgZGltZW5zaW9ucy53aWR0aCwgZGltZW5zaW9ucy5oZWlnaHQpKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAxOworCisgICAgaW1hZ2UgPSBjYWlyb19pbWFnZV9zdXJmYWNlX2NyZWF0ZV9mb3JfZGF0YShmcmFtZS0+ZGF0YVswXSwgQ0FJUk9fRk9STUFUX0FSR0IzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgaWYgKGNhaXJvX3N1cmZhY2Vfc3RhdHVzKGltYWdlKSAhPSBDQUlST19TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBjcmVuZGVyID0gY2Fpcm9fY3JlYXRlKGltYWdlKTsKKworICAgIGNhaXJvX3NhdmUoY3JlbmRlcik7CisgICAgY2Fpcm9fc2V0X29wZXJhdG9yKGNyZW5kZXIsIENBSVJPX09QRVJBVE9SX0NMRUFSKTsKKyAgICBjYWlyb19wYWludChjcmVuZGVyKTsKKyAgICBjYWlyb19yZXN0b3JlKGNyZW5kZXIpOworCisgICAgY2Fpcm9fc2NhbGUoY3JlbmRlciwgZGltZW5zaW9ucy53aWR0aCAvIChkb3VibGUpdW5zY2FsZWRfZGltZW5zaW9ucy53aWR0aCwKKyAgICAgICAgICAgICAgICBkaW1lbnNpb25zLmhlaWdodCAvIChkb3VibGUpdW5zY2FsZWRfZGltZW5zaW9ucy5oZWlnaHQpOworCisgICAgcnN2Z19oYW5kbGVfcmVuZGVyX2NhaXJvKGhhbmRsZSwgY3JlbmRlcik7CisKKyAgICBjYWlyb19kZXN0cm95KGNyZW5kZXIpOworICAgIGNhaXJvX3N1cmZhY2VfZGVzdHJveShpbWFnZSk7CisgICAgZ19vYmplY3RfdW5yZWYoaGFuZGxlKTsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKExpYlJTVkdDb250ZXh0LCB4KQorI2RlZmluZSBERUMgKEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0pCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgIndpZHRoIiwgIldpZHRoIHRvIHJlbmRlciB0byAoMCBmb3IgZGVmYXVsdCkiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgREVDIH0sCisgICAgeyAiaGVpZ2h0IiwgIkhlaWdodCB0byByZW5kZXIgdG8gKDAgZm9yIGRlZmF1bHQpIiwgT0ZGU0VUKGhlaWdodCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBERUMgfSwKKyAgICB7ICJrZWVwX2FyIiwgIktlZXAgYXNwZWN0IHJhdGlvIHdpdGggY3VzdG9tIHdpZHRoL2hlaWdodCIsIE9GRlNFVChrZWVwX2FyKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGxpYnJzdmdfZGVjb2Rlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJMaWJyc3ZnIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbGlicnN2Z19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJsaWJyc3ZnIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTGlicnN2ZyByYXN0ZXJpemVyIiksCisgICAgLnByaXZfY2xhc3MgICAgID0gJmxpYnJzdmdfZGVjb2Rlcl9jbGFzcywKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1ZHLAorICAgIC5kZWNvZGUgICAgICAgICA9IGxpYnJzdmdfZGVjb2RlX2ZyYW1lLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihMaWJSU1ZHQ29udGV4dCksCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0xPU1NMRVNTIHwgQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAud3JhcHBlcl9uYW1lICAgID0gImxpYnJzdmciLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyLmMgYi9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjAyYjJjLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCQkMsIEFudXJhZGhhIFN1cmFwYXJhanUgPGFzdXJhcGFyYWp1IGF0IGdtYWlsIGRvdCBjb20gPgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSogQGZpbGUKLSogZnVuY3Rpb24gZGVmaW5pdGlvbnMgY29tbW9uIHRvIGxpYnNjaHJvZWRpbmdlciBkZWNvZGVyIGFuZCBlbmNvZGVyCi0qLwotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCi0jaW5jbHVkZSAibGlic2Nocm9lZGluZ2VyLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotc3RhdGljIGNvbnN0IFNjaHJvVmlkZW9Gb3JtYXRJbmZvIGZmX3NjaHJvX3ZpZGVvX2Zvcm1hdF9pbmZvW10gPSB7Ci0gICAgeyA2NDAsICA0ODAsICAyNDAwMCwgMTAwMX0sCi0gICAgeyAxNzYsICAxMjAsICAxNTAwMCwgMTAwMX0sCi0gICAgeyAxNzYsICAxNDQsICAyNSwgICAgMiAgIH0sCi0gICAgeyAzNTIsICAyNDAsICAxNTAwMCwgMTAwMX0sCi0gICAgeyAzNTIsICAyODgsICAyNSwgICAgMiAgIH0sCi0gICAgeyA3MDQsICA0ODAsICAxNTAwMCwgMTAwMX0sCi0gICAgeyA3MDQsICA1NzYsICAyNSwgICAgMiAgIH0sCi0gICAgeyA3MjAsICA0ODAsICAzMDAwMCwgMTAwMX0sCi0gICAgeyA3MjAsICA1NzYsICAyNSwgICAgMSAgIH0sCi0gICAgeyAxMjgwLCA3MjAsICA2MDAwMCwgMTAwMX0sCi0gICAgeyAxMjgwLCA3MjAsICA1MCwgICAgMSAgIH0sCi0gICAgeyAxOTIwLCAxMDgwLCAzMDAwMCwgMTAwMX0sCi0gICAgeyAxOTIwLCAxMDgwLCAyNSwgICAgMSAgIH0sCi0gICAgeyAxOTIwLCAxMDgwLCA2MDAwMCwgMTAwMX0sCi0gICAgeyAxOTIwLCAxMDgwLCA1MCwgICAgMSAgIH0sCi0gICAgeyAyMDQ4LCAxMDgwLCAyNCwgICAgMSAgIH0sCi0gICAgeyA0MDk2LCAyMTYwLCAyNCwgICAgMSAgIH0sCi19OwotCi1zdGF0aWMgdW5zaWduZWQgaW50IGdldF92aWRlb19mb3JtYXRfaWR4KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgcmV0X2lkeCA9IDA7Ci0gICAgdW5zaWduZWQgaW50IGlkeDsKLSAgICB1bnNpZ25lZCBpbnQgbnVtX2Zvcm1hdHMgPSBzaXplb2YoZmZfc2Nocm9fdmlkZW9fZm9ybWF0X2luZm8pIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmZfc2Nocm9fdmlkZW9fZm9ybWF0X2luZm9bMF0pOwotCi0gICAgZm9yIChpZHggPSAxOyBpZHggPCBudW1fZm9ybWF0czsgKytpZHgpIHsKLSAgICAgICAgY29uc3QgU2Nocm9WaWRlb0Zvcm1hdEluZm8gKnZmID0gJmZmX3NjaHJvX3ZpZGVvX2Zvcm1hdF9pbmZvW2lkeF07Ci0gICAgICAgIGlmIChhdmN0eC0+d2lkdGggID09IHZmLT53aWR0aCAmJgotICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA9PSB2Zi0+aGVpZ2h0KSB7Ci0gICAgICAgICAgICByZXRfaWR4ID0gaWR4OwotICAgICAgICAgICAgaWYgKGF2Y3R4LT50aW1lX2Jhc2UuZGVuID09IHZmLT5mcmFtZV9yYXRlX251bSAmJgotICAgICAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UubnVtID09IHZmLT5mcmFtZV9yYXRlX2Rlbm9tKQotICAgICAgICAgICAgICAgIHJldHVybiBpZHg7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldF9pZHg7Ci19Ci0KLWF2X2NvbGQgdm9pZCBmZl9zY2hyb19xdWV1ZV9pbml0KEZGU2Nocm9RdWV1ZSAqcXVldWUpCi17Ci0gICAgcXVldWUtPnBfaGVhZCA9IHF1ZXVlLT5wX3RhaWwgPSBOVUxMOwotICAgIHF1ZXVlLT5zaXplID0gMDsKLX0KLQotdm9pZCBmZl9zY2hyb19xdWV1ZV9mcmVlKEZGU2Nocm9RdWV1ZSAqcXVldWUsIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKikpCi17Ci0gICAgd2hpbGUgKHF1ZXVlLT5wX2hlYWQpCi0gICAgICAgIGZyZWVfZnVuYyhmZl9zY2hyb19xdWV1ZV9wb3AocXVldWUpKTsKLX0KLQotaW50IGZmX3NjaHJvX3F1ZXVlX3B1c2hfYmFjayhGRlNjaHJvUXVldWUgKnF1ZXVlLCB2b2lkICpwX2RhdGEpCi17Ci0gICAgRkZTY2hyb1F1ZXVlRWxlbWVudCAqcF9uZXcgPSBhdl9tYWxsb2N6KHNpemVvZihGRlNjaHJvUXVldWVFbGVtZW50KSk7Ci0KLSAgICBpZiAoIXBfbmV3KQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBwX25ldy0+ZGF0YSA9IHBfZGF0YTsKLQotICAgIGlmICghcXVldWUtPnBfaGVhZCkKLSAgICAgICAgcXVldWUtPnBfaGVhZCA9IHBfbmV3OwotICAgIGVsc2UKLSAgICAgICAgcXVldWUtPnBfdGFpbC0+bmV4dCA9IHBfbmV3OwotICAgIHF1ZXVlLT5wX3RhaWwgPSBwX25ldzsKLQotICAgICsrcXVldWUtPnNpemU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgKmZmX3NjaHJvX3F1ZXVlX3BvcChGRlNjaHJvUXVldWUgKnF1ZXVlKQotewotICAgIEZGU2Nocm9RdWV1ZUVsZW1lbnQgKnRvcCA9IHF1ZXVlLT5wX2hlYWQ7Ci0KLSAgICBpZiAodG9wKSB7Ci0gICAgICAgIHZvaWQgKmRhdGEgPSB0b3AtPmRhdGE7Ci0gICAgICAgIHF1ZXVlLT5wX2hlYWQgPSBxdWV1ZS0+cF9oZWFkLT5uZXh0OwotICAgICAgICAtLXF1ZXVlLT5zaXplOwotICAgICAgICBhdl9mcmVlcCgmdG9wKTsKLSAgICAgICAgcmV0dXJuIGRhdGE7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8qKgotKiBTY2hyb2VkaW5nZXIgdmlkZW8gcHJlc2V0IHRhYmxlLiBFbnN1cmUgdGhhdCB0aGlzIHRhYmxlcyBtYXRjaGVzIHVwIGNvcnJlY3RseQotKiB3aXRoIHRoZSBmZl9zY2hyb192aWRlb19mb3JtYXRfaW5mbyB0YWJsZS4KLSovCi1zdGF0aWMgY29uc3QgU2Nocm9WaWRlb0Zvcm1hdEVudW0gZmZfc2Nocm9fdmlkZW9fZm9ybWF0c1tdPXsKLSAgICBTQ0hST19WSURFT19GT1JNQVRfQ1VTVE9NICAgICAsCi0gICAgU0NIUk9fVklERU9fRk9STUFUX1FTSUYgICAgICAgLAotICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9RQ0lGICAgICAgICwKLSAgICBTQ0hST19WSURFT19GT1JNQVRfU0lGICAgICAgICAsCi0gICAgU0NIUk9fVklERU9fRk9STUFUX0NJRiAgICAgICAgLAotICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF80U0lGICAgICAgICwKLSAgICBTQ0hST19WSURFT19GT1JNQVRfNENJRiAgICAgICAsCi0gICAgU0NIUk9fVklERU9fRk9STUFUX1NENDgwSV82MCAgLAotICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9TRDU3NklfNTAgICwKLSAgICBTQ0hST19WSURFT19GT1JNQVRfSEQ3MjBQXzYwICAsCi0gICAgU0NIUk9fVklERU9fRk9STUFUX0hENzIwUF81MCAgLAotICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9IRDEwODBJXzYwICwKLSAgICBTQ0hST19WSURFT19GT1JNQVRfSEQxMDgwSV81MCAsCi0gICAgU0NIUk9fVklERU9fRk9STUFUX0hEMTA4MFBfNjAgLAotICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9IRDEwODBQXzUwICwKLSAgICBTQ0hST19WSURFT19GT1JNQVRfREMyS18yNCAgICAsCi0gICAgU0NIUk9fVklERU9fRk9STUFUX0RDNEtfMjQgICAgLAotfTsKLQotU2Nocm9WaWRlb0Zvcm1hdEVudW0gZmZfZ2V0X3NjaHJvX3ZpZGVvX2Zvcm1hdF9wcmVzZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIHVuc2lnbmVkIGludCBudW1fZm9ybWF0cyA9IHNpemVvZihmZl9zY2hyb192aWRlb19mb3JtYXRzKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZmX3NjaHJvX3ZpZGVvX2Zvcm1hdHNbMF0pOwotCi0gICAgdW5zaWduZWQgaW50IGlkeCA9IGdldF92aWRlb19mb3JtYXRfaWR4KGF2Y3R4KTsKLQotICAgIHJldHVybiAoaWR4IDwgbnVtX2Zvcm1hdHMpID8gZmZfc2Nocm9fdmlkZW9fZm9ybWF0c1tpZHhdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSFJPX1ZJREVPX0ZPUk1BVF9DVVNUT007Ci19Ci0KLWludCBmZl9nZXRfc2Nocm9fZnJhbWVfZm9ybWF0IChTY2hyb0Nocm9tYUZvcm1hdCBzY2hyb19waXhfZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaHJvRnJhbWVGb3JtYXQgICpzY2hyb19mcmFtZV9mbXQpCi17Ci0gICAgdW5zaWduZWQgaW50IG51bV9mb3JtYXRzID0gc2l6ZW9mKHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXApIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2Nocm9fcGl4ZWxfZm9ybWF0X21hcFswXSk7Ci0KLSAgICBpbnQgaWR4OwotCi0gICAgZm9yIChpZHggPSAwOyBpZHggPCBudW1fZm9ybWF0czsgKytpZHgpIHsKLSAgICAgICAgaWYgKHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbaWR4XS5zY2hyb19waXhfZm10ID09IHNjaHJvX3BpeF9mbXQpIHsKLSAgICAgICAgICAgICpzY2hyb19mcmFtZV9mbXQgPSBzY2hyb19waXhlbF9mb3JtYXRfbWFwW2lkeF0uc2Nocm9fZnJhbWVfZm10OwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX3NjaHJvX2ZyYW1lKFNjaHJvRnJhbWUgKmZyYW1lLCB2b2lkICpwcml2KQotewotICAgIEFWRnJhbWUgKnBfcGljID0gcHJpdjsKLSAgICBhdl9mcmFtZV9mcmVlKCZwX3BpYyk7Ci19Ci0KLVNjaHJvRnJhbWUgKmZmX2NyZWF0ZV9zY2hyb19mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nocm9GcmFtZUZvcm1hdCBzY2hyb19mcmFtZV9mbXQpCi17Ci0gICAgQVZGcmFtZSAqcF9waWM7Ci0gICAgU2Nocm9GcmFtZSAqcF9mcmFtZTsKLSAgICBpbnQgeV93aWR0aCwgdXZfd2lkdGg7Ci0gICAgaW50IHlfaGVpZ2h0LCB1dl9oZWlnaHQ7Ci0gICAgaW50IGk7Ci0KLSAgICB5X3dpZHRoICAgPSBhdmN0eC0+d2lkdGg7Ci0gICAgeV9oZWlnaHQgID0gYXZjdHgtPmhlaWdodDsKLSAgICB1dl93aWR0aCAgPSB5X3dpZHRoICA+PiAoU0NIUk9fRlJBTUVfRk9STUFUX0hfU0hJRlQoc2Nocm9fZnJhbWVfZm10KSk7Ci0gICAgdXZfaGVpZ2h0ID0geV9oZWlnaHQgPj4gKFNDSFJPX0ZSQU1FX0ZPUk1BVF9WX1NISUZUKHNjaHJvX2ZyYW1lX2ZtdCkpOwotCi0gICAgcF9waWMgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGlmICghcF9waWMpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKGZmX2dldF9idWZmZXIoYXZjdHgsIHBfcGljLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSA8IDApIHsKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmcF9waWMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBwX2ZyYW1lICAgICAgICAgPSBzY2hyb19mcmFtZV9uZXcoKTsKLSAgICBwX2ZyYW1lLT5mb3JtYXQgPSBzY2hyb19mcmFtZV9mbXQ7Ci0gICAgcF9mcmFtZS0+d2lkdGggID0geV93aWR0aDsKLSAgICBwX2ZyYW1lLT5oZWlnaHQgPSB5X2hlaWdodDsKLSAgICBzY2hyb19mcmFtZV9zZXRfZnJlZV9jYWxsYmFjayhwX2ZyYW1lLCBmcmVlX3NjaHJvX2ZyYW1lLCAodm9pZCAqKXBfcGljKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICAgICAgcF9mcmFtZS0+Y29tcG9uZW50c1tpXS53aWR0aCAgPSBpID8gdXZfd2lkdGggOiB5X3dpZHRoOwotICAgICAgICBwX2ZyYW1lLT5jb21wb25lbnRzW2ldLnN0cmlkZSA9IHBfcGljLT5saW5lc2l6ZVtpXTsKLSAgICAgICAgcF9mcmFtZS0+Y29tcG9uZW50c1tpXS5oZWlnaHQgPSBpID8gdXZfaGVpZ2h0IDogeV9oZWlnaHQ7Ci0gICAgICAgIHBfZnJhbWUtPmNvbXBvbmVudHNbaV0ubGVuZ3RoID0KLSAgICAgICAgICAgICAgICAgcF9mcmFtZS0+Y29tcG9uZW50c1tpXS5zdHJpZGUgKiBwX2ZyYW1lLT5jb21wb25lbnRzW2ldLmhlaWdodDsKLSAgICAgICAgcF9mcmFtZS0+Y29tcG9uZW50c1tpXS5kYXRhICAgPSBwX3BpYy0+ZGF0YVtpXTsKLQotICAgICAgICBpZiAoaSkgewotICAgICAgICAgICAgcF9mcmFtZS0+Y29tcG9uZW50c1tpXS52X3NoaWZ0ID0KLSAgICAgICAgICAgICAgICBTQ0hST19GUkFNRV9GT1JNQVRfVl9TSElGVChwX2ZyYW1lLT5mb3JtYXQpOwotICAgICAgICAgICAgcF9mcmFtZS0+Y29tcG9uZW50c1tpXS5oX3NoaWZ0ID0KLSAgICAgICAgICAgICAgICBTQ0hST19GUkFNRV9GT1JNQVRfSF9TSElGVChwX2ZyYW1lLT5mb3JtYXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHBfZnJhbWU7Ci19CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlci5oIGIvbGliYXZjb2RlYy9saWJzY2hyb2VkaW5nZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJmZTU3Yy4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQkJDLCBBbnVyYWRoYSBTdXJhcGFyYWp1IDxhc3VyYXBhcmFqdSBhdCBnbWFpbCBkb3QgY29tID4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0qIEBmaWxlCi0qIGRhdGEgc3RydWN0dXJlcyBjb21tb24gdG8gbGlic2Nocm9lZGluZ2VyIGRlY29kZXIgYW5kIGVuY29kZXIKLSovCi0KLSNpZm5kZWYgQVZDT0RFQ19MSUJTQ0hST0VESU5HRVJfSAotI2RlZmluZSBBVkNPREVDX0xJQlNDSFJPRURJTkdFUl9ICi0KLSNpbmNsdWRlIDxzY2hyb2VkaW5nZXIvc2Nocm9iaXRzdHJlYW0uaD4KLSNpbmNsdWRlIDxzY2hyb2VkaW5nZXIvc2Nocm9mcmFtZS5oPgotCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgotCi10eXBlZGVmIHN0cnVjdCBTY2hyb1ZpZGVvRm9ybWF0SW5mbyB7Ci0gICAgdWludDE2X3Qgd2lkdGg7Ci0gICAgdWludDE2X3QgaGVpZ2h0OwotICAgIHVpbnQxNl90IGZyYW1lX3JhdGVfbnVtOwotICAgIHVpbnQxNl90IGZyYW1lX3JhdGVfZGVub207Ci19IFNjaHJvVmlkZW9Gb3JtYXRJbmZvOwotCi0vKioKLSogY29udGFpbnMgYSBzaW5nbGUgZW5jb2RlZCBmcmFtZSByZXR1cm5lZCBmcm9tIERpcmFjIG9yIFNjaHJvZWRpbmdlcgotKi8KLXR5cGVkZWYgc3RydWN0IEZGU2Nocm9FbmNvZGVkRnJhbWUgewotICAgIC8qKiBlbmNvZGVkIGZyYW1lIGRhdGEgKi8KLSAgICB1aW50OF90ICpwX2VuY2J1ZjsKLQotICAgIC8qKiBlbmNvZGVkIGZyYW1lIHNpemUgKi8KLSAgICB1aW50MzJfdCBzaXplOwotCi0gICAgLyoqIGVuY29kZWQgZnJhbWUgbnVtYmVyLiBXaWxsIGJlIHVzZWQgYXMgcHRzICovCi0gICAgdWludDMyX3QgZnJhbWVfbnVtOwotCi0gICAgLyoqIGtleSBmcmFtZSBmbGFnLiAxIDogaXMga2V5IGZyYW1lICwgMCA6IGluIG5vdCBrZXkgZnJhbWUgKi8KLSAgICB1aW50MTZfdCBrZXlfZnJhbWU7Ci19IEZGU2Nocm9FbmNvZGVkRnJhbWU7Ci0KLS8qKgotKiBxdWV1ZSBlbGVtZW50Ci0qLwotdHlwZWRlZiBzdHJ1Y3QgRkZTY2hyb1F1ZXVlRWxlbWVudCB7Ci0gICAgLyoqIERhdGEgdG8gYmUgc3RvcmVkIGluIHF1ZXVlKi8KLSAgICB2b2lkICpkYXRhOwotICAgIC8qKiBQb2ludGVyIHRvIG5leHQgZWxlbWVudCBxdWV1ZSAqLwotICAgIHN0cnVjdCBGRlNjaHJvUXVldWVFbGVtZW50ICpuZXh0OwotfSBGRlNjaHJvUXVldWVFbGVtZW50OwotCi0KLS8qKgotKiBBIHNpbXBsZSBxdWV1ZSBpbXBsZW1lbnRhdGlvbiB1c2VkIGluIGxpYnNjaHJvZWRpbmdlcgotKi8KLXR5cGVkZWYgc3RydWN0IEZGU2Nocm9RdWV1ZSB7Ci0gICAgLyoqIFBvaW50ZXIgdG8gaGVhZCBvZiBxdWV1ZSAqLwotICAgIEZGU2Nocm9RdWV1ZUVsZW1lbnQgKnBfaGVhZDsKLSAgICAvKiogUG9pbnRlciB0byB0YWlsIG9mIHF1ZXVlICovCi0gICAgRkZTY2hyb1F1ZXVlRWxlbWVudCAqcF90YWlsOwotICAgIC8qKiBRdWV1ZSBzaXplKi8KLSAgICBpbnQgc2l6ZTsKLX0gRkZTY2hyb1F1ZXVlOwotCi0vKioKLSogSW5pdGlhbGlzZSB0aGUgcXVldWUKLSovCi12b2lkIGZmX3NjaHJvX3F1ZXVlX2luaXQoRkZTY2hyb1F1ZXVlICpxdWV1ZSk7Ci0KLS8qKgotKiBBZGQgYW4gZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBxdWV1ZQotKi8KLWludCBmZl9zY2hyb19xdWV1ZV9wdXNoX2JhY2soRkZTY2hyb1F1ZXVlICpxdWV1ZSwgdm9pZCAqcF9kYXRhKTsKLQotLyoqCi0qIFJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgcXVldWUKLSovCi12b2lkICpmZl9zY2hyb19xdWV1ZV9wb3AoRkZTY2hyb1F1ZXVlICpxdWV1ZSk7Ci0KLS8qKgotKiBGcmVlIHRoZSBxdWV1ZSByZXNvdXJjZXMuIGZyZWVfZnVuYyBpcyBhIGZ1bmN0aW9uIHN1cHBsaWVkIGJ5IHRoZSBjYWxsZXIgdG8KLSogZnJlZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyLiBUaGUgZGF0YSBmaWVsZCBvZiB0aGUgcXVldWUKLSogZWxlbWVudCBpcyBwYXNzZWQgdG8gaXQuCi0qLwotdm9pZCBmZl9zY2hyb19xdWV1ZV9mcmVlKEZGU2Nocm9RdWV1ZSAqcXVldWUsIHZvaWQgKCpmcmVlX2Z1bmMpKHZvaWQgKikpOwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgIGZmX3BpeF9mbXQ7Ci0gICAgU2Nocm9DaHJvbWFGb3JtYXQgc2Nocm9fcGl4X2ZtdDsKLSAgICBTY2hyb0ZyYW1lRm9ybWF0ICBzY2hyb19mcmFtZV9mbXQ7Ci19IHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbXSA9IHsKLSAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUCwgU0NIUk9fQ0hST01BXzQyMCwgU0NIUk9fRlJBTUVfRk9STUFUX1U4XzQyMCB9LAotICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjJQLCBTQ0hST19DSFJPTUFfNDIyLCBTQ0hST19GUkFNRV9GT1JNQVRfVThfNDIyIH0sCi0gICAgeyBBVl9QSVhfRk1UX1lVVjQ0NFAsIFNDSFJPX0NIUk9NQV80NDQsIFNDSFJPX0ZSQU1FX0ZPUk1BVF9VOF80NDQgfSwKLX07Ci0KLS8qKgotKiBSZXR1cm5zIHRoZSB2aWRlbyBmb3JtYXQgcHJlc2V0IG1hdGNoaW5nIHRoZSBpbnB1dCB2aWRlbyBkaW1lbnNpb25zIGFuZAotKiB0aW1lIGJhc2UuCi0qLwotU2Nocm9WaWRlb0Zvcm1hdEVudW0gZmZfZ2V0X3NjaHJvX3ZpZGVvX2Zvcm1hdF9wcmVzZXQgKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Ci0KLS8qKgotKiBTZXRzIHRoZSBTY2hyb2VkaW5nZXIgZnJhbWUgZm9ybWF0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFNjaHJvIGNocm9tYSBmb3JtYXQKLSogcGFzc2VkLiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLSovCi1pbnQgZmZfZ2V0X3NjaHJvX2ZyYW1lX2Zvcm1hdChTY2hyb0Nocm9tYUZvcm1hdCBzY2hyb19jaHJvbWFfZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Nocm9GcmFtZUZvcm1hdCAgKnNjaHJvX2ZyYW1lX2ZtdCk7Ci0KLS8qKgotKiBDcmVhdGUgYSBTY2hybyBmcmFtZSBiYXNlZCBvbiB0aGUgZGltZW5zaW9ucyBhbmQgZnJhbWUgZm9ybWF0Ci0qIHBhc3NlZC4gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBmcmFtZSBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUuCi0qLwotU2Nocm9GcmFtZSAqZmZfY3JlYXRlX3NjaHJvX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hyb0ZyYW1lRm9ybWF0IHNjaHJvX2ZyYW1lX2ZtdCk7Ci0KLSNlbmRpZiAvKiBBVkNPREVDX0xJQlNDSFJPRURJTkdFUl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlcmRlYy5jIGIvbGliYXZjb2RlYy9saWJzY2hyb2VkaW5nZXJkZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyY2JlNy4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlcmRlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg4ICswLDAgQEAKLS8qCi0gKiBEaXJhYyBkZWNvZGVyIHN1cHBvcnQgdmlhIFNjaHJvZWRpbmdlciBsaWJyYXJpZXMKLSAqIENvcHlyaWdodCAoYykgMjAwOCBCQkMsIEFudXJhZGhhIFN1cmFwYXJhanUgPGFzdXJhcGFyYWp1IGF0IGdtYWlsIGRvdCBjb20gPgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSogQGZpbGUKLSogRGlyYWMgZGVjb2RlciBzdXBwb3J0IHZpYSBsaWJzY2hyb2VkaW5nZXItMS4wIGxpYnJhcmllcy4gTW9yZSBkZXRhaWxzIGFib3V0Ci0qIHRoZSBTY2hyb2VkaW5nZXIgcHJvamVjdCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5kaXJhY3ZpZGVvLm9yZy8uCi0qIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgRGlyYWMgU3BlY2lmaWNhdGlvbiBWZXJzaW9uIDIuMi4KLSogKGh0dHA6Ly9kaXJhYy5zb3VyY2Vmb3JnZS5uZXQvc3BlY2lmaWNhdGlvbi5odG1sKS4KLSovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAibGlic2Nocm9lZGluZ2VyLmgiCi0KLSNpbmNsdWRlIDxzY2hyb2VkaW5nZXIvc2Nocm8uaD4KLSNpbmNsdWRlIDxzY2hyb2VkaW5nZXIvc2Nocm9kZWJ1Zy5oPgotI2luY2x1ZGUgPHNjaHJvZWRpbmdlci9zY2hyb3ZpZGVvZm9ybWF0Lmg+Ci0KLS8qKiBTY2hyb0ZyYW1lIGFuZCBQdHMgcmVsYXRpb24gKi8KLXR5cGVkZWYgc3RydWN0IExpYlNjaHJvRnJhbWVDb250ZXh0IHsKLSAgICAgU2Nocm9GcmFtZSAqZnJhbWU7Ci0gICAgIGludDY0X3QgcHRzOwotfSBMaWJTY2hyb0ZyYW1lQ29udGV4dDsKLQotLyoqIGxpYnNjaHJvZWRpbmdlciBkZWNvZGVyIHByaXZhdGUgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgU2Nocm9EZWNvZGVyUGFyYW1zIHsKLSAgICAvKiogU2Nocm9lZGluZ2VyIHZpZGVvIGZvcm1hdCAqLwotICAgIFNjaHJvVmlkZW9Gb3JtYXQgKmZvcm1hdDsKLQotICAgIC8qKiBTY2hyb2VkaW5nZXIgZnJhbWUgZm9ybWF0ICovCi0gICAgU2Nocm9GcmFtZUZvcm1hdCBmcmFtZV9mb3JtYXQ7Ci0KLSAgICAvKiogZGVjb2RlciBoYW5kbGUgKi8KLSAgICBTY2hyb0RlY29kZXIqIGRlY29kZXI7Ci0KLSAgICAvKiogcXVldWUgc3RvcmluZyBkZWNvZGVkIGZyYW1lcyAqLwotICAgIEZGU2Nocm9RdWV1ZSBkZWNfZnJhbWVfcXVldWU7Ci0KLSAgICAvKiogZW5kIG9mIHNlcXVlbmNlIHNpZ25hbGxlZCAqLwotICAgIGludCBlb3Nfc2lnbmFsbGVkOwotCi0gICAgLyoqIGVuZCBvZiBzZXF1ZW5jZSBwdWxsZWQgKi8KLSAgICBpbnQgZW9zX3B1bGxlZDsKLX0gU2Nocm9EZWNvZGVyUGFyYW1zOwotCi10eXBlZGVmIHN0cnVjdCBTY2hyb1BhcnNlVW5pdENvbnRleHQgewotICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjsKLSAgICBpbnQgICAgICAgICAgIGJ1Zl9zaXplOwotfSBTY2hyb1BhcnNlVW5pdENvbnRleHQ7Ci0KLQotc3RhdGljIHZvaWQgbGlic2Nocm9lZGluZ2VyX2RlY29kZV9idWZmZXJfZnJlZShTY2hyb0J1ZmZlciAqc2Nocm9fYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwcml2KQotewotICAgIGF2X2ZyZWVwKCZwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgcGFyc2VfY29udGV4dF9pbml0KFNjaHJvUGFyc2VVbml0Q29udGV4dCAqcGFyc2VfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQotewotICAgIHBhcnNlX2N0eC0+YnVmICAgICAgICAgICA9IGJ1ZjsKLSAgICBwYXJzZV9jdHgtPmJ1Zl9zaXplICAgICAgPSBidWZfc2l6ZTsKLX0KLQotc3RhdGljIFNjaHJvQnVmZmVyICpmaW5kX25leHRfcGFyc2VfdW5pdChTY2hyb1BhcnNlVW5pdENvbnRleHQgKnBhcnNlX2N0eCkKLXsKLSAgICBTY2hyb0J1ZmZlciAqZW5jX2J1ZiA9IE5VTEw7Ci0gICAgaW50IG5leHRfcHVfb2Zmc2V0ID0gMDsKLSAgICB1bnNpZ25lZCBjaGFyICppbl9idWY7Ci0KLSAgICBpZiAocGFyc2VfY3R4LT5idWZfc2l6ZSA8IDEzIHx8Ci0gICAgICAgIHBhcnNlX2N0eC0+YnVmWzBdICE9ICdCJyB8fAotICAgICAgICBwYXJzZV9jdHgtPmJ1ZlsxXSAhPSAnQicgfHwKLSAgICAgICAgcGFyc2VfY3R4LT5idWZbMl0gIT0gJ0MnIHx8Ci0gICAgICAgIHBhcnNlX2N0eC0+YnVmWzNdICE9ICdEJykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBuZXh0X3B1X29mZnNldCA9IChwYXJzZV9jdHgtPmJ1Zls1XSA8PCAyNCkgKwotICAgICAgICAgICAgICAgICAgICAgKHBhcnNlX2N0eC0+YnVmWzZdIDw8IDE2KSArCi0gICAgICAgICAgICAgICAgICAgICAocGFyc2VfY3R4LT5idWZbN10gPDwgIDgpICsKLSAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9jdHgtPmJ1Zls4XTsKLQotICAgIGlmIChuZXh0X3B1X29mZnNldCA9PSAwICYmCi0gICAgICAgIFNDSFJPX1BBUlNFX0NPREVfSVNfRU5EX09GX1NFUVVFTkNFKHBhcnNlX2N0eC0+YnVmWzRdKSkKLSAgICAgICAgbmV4dF9wdV9vZmZzZXQgPSAxMzsKLQotICAgIGlmIChuZXh0X3B1X29mZnNldCA8PSAwIHx8IHBhcnNlX2N0eC0+YnVmX3NpemUgPCBuZXh0X3B1X29mZnNldCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpbl9idWYgPSBhdl9tYWxsb2MobmV4dF9wdV9vZmZzZXQpOwotICAgIGlmICghaW5fYnVmKSB7Ci0gICAgICAgIGF2X2xvZyhwYXJzZV9jdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBpbnB1dCBidWZmZXJcbiIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBtZW1jcHkoaW5fYnVmLCBwYXJzZV9jdHgtPmJ1ZiwgbmV4dF9wdV9vZmZzZXQpOwotICAgIGVuY19idWYgICAgICAgPSBzY2hyb19idWZmZXJfbmV3X3dpdGhfZGF0YShpbl9idWYsIG5leHRfcHVfb2Zmc2V0KTsKLSAgICBlbmNfYnVmLT5mcmVlID0gbGlic2Nocm9lZGluZ2VyX2RlY29kZV9idWZmZXJfZnJlZTsKLSAgICBlbmNfYnVmLT5wcml2ID0gaW5fYnVmOwotCi0gICAgcGFyc2VfY3R4LT5idWYgICAgICArPSBuZXh0X3B1X29mZnNldDsKLSAgICBwYXJzZV9jdHgtPmJ1Zl9zaXplIC09IG5leHRfcHVfb2Zmc2V0OwotCi0gICAgcmV0dXJuIGVuY19idWY7Ci19Ci0KLS8qKgotKiBSZXR1cm5zIEZGbXBlZyBjaHJvbWEgZm9ybWF0LgotKi8KLXN0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgZ2V0X2Nocm9tYV9mb3JtYXQoU2Nocm9DaHJvbWFGb3JtYXQgc2Nocm9fcGl4X2ZtdCkKLXsKLSAgICBpbnQgbnVtX2Zvcm1hdHMgPSBzaXplb2Yoc2Nocm9fcGl4ZWxfZm9ybWF0X21hcCkgLwotICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY2hyb19waXhlbF9mb3JtYXRfbWFwWzBdKTsKLSAgICBpbnQgaWR4OwotCi0gICAgZm9yIChpZHggPSAwOyBpZHggPCBudW1fZm9ybWF0czsgKytpZHgpCi0gICAgICAgIGlmIChzY2hyb19waXhlbF9mb3JtYXRfbWFwW2lkeF0uc2Nocm9fcGl4X2ZtdCA9PSBzY2hyb19waXhfZm10KQotICAgICAgICAgICAgcmV0dXJuIHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbaWR4XS5mZl9waXhfZm10OwotICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7Ci19Ci0KLXN0YXRpYyBhdl9jb2xkIGludCBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotCi0gICAgU2Nocm9EZWNvZGVyUGFyYW1zICpwX3NjaHJvX3BhcmFtcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgLyogRmlyc3Qgb2YgYWxsLCBpbml0aWFsaXplIG91ciBzdXBwb3J0aW5nIGxpYnJhcmllcy4gKi8KLSAgICBzY2hyb19pbml0KCk7Ci0KLSAgICBzY2hyb19kZWJ1Z19zZXRfbGV2ZWwoYXZjdHgtPmRlYnVnKTsKLSAgICBwX3NjaHJvX3BhcmFtcy0+ZGVjb2RlciA9IHNjaHJvX2RlY29kZXJfbmV3KCk7Ci0gICAgc2Nocm9fZGVjb2Rlcl9zZXRfc2tpcF9yYXRpbyhwX3NjaHJvX3BhcmFtcy0+ZGVjb2RlciwgMSk7Ci0KLSAgICBpZiAoIXBfc2Nocm9fcGFyYW1zLT5kZWNvZGVyKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBkZWNvZGVkIGZyYW1lIHF1ZXVlLiAqLwotICAgIGZmX3NjaHJvX3F1ZXVlX2luaXQoJnBfc2Nocm9fcGFyYW1zLT5kZWNfZnJhbWVfcXVldWUpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2ZyYW1lX2ZyZWUodm9pZCAqZnJhbWUpCi17Ci0gICAgc2Nocm9fZnJhbWVfdW5yZWYoZnJhbWUpOwotfQotCi1zdGF0aWMgdm9pZCBsaWJzY2hyb2VkaW5nZXJfaGFuZGxlX2ZpcnN0X2FjY2Vzc191bml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBTY2hyb0RlY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBTY2hyb0RlY29kZXIgKmRlY29kZXIgPSBwX3NjaHJvX3BhcmFtcy0+ZGVjb2RlcjsKLQotICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQgPSBzY2hyb19kZWNvZGVyX2dldF92aWRlb19mb3JtYXQoZGVjb2Rlcik7Ci0KLSAgICAvKiBUZWxsIEZGbXBlZyBhYm91dCBzZXF1ZW5jZSBkZXRhaWxzLiAqLwotICAgIGlmIChhdl9pbWFnZV9jaGVja19zaXplKHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmhlaWdodCwgMCwgYXZjdHgpIDwgMCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZGltZW5zaW9ucyAoJWR4JWQpXG4iLAotICAgICAgICAgICAgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+d2lkdGgsIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmhlaWdodCk7Ci0gICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBhdmN0eC0+d2lkdGggPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF2Y3R4LT5oZWlnaHQgID0gcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+aGVpZ2h0OwotICAgIGF2Y3R4LT53aWR0aCAgID0gcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+d2lkdGg7Ci0gICAgYXZjdHgtPnBpeF9mbXQgPSBnZXRfY2hyb21hX2Zvcm1hdChwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5jaHJvbWFfZm9ybWF0KTsKLQotICAgIGlmIChmZl9nZXRfc2Nocm9fZnJhbWVfZm9ybWF0KHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmNocm9tYV9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfc2Nocm9fcGFyYW1zLT5mcmFtZV9mb3JtYXQpID09IC0xKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlRoaXMgY29kZWMgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgcGxhbmFyIFlVViA0OjI6MCwgNDoyOjIgIgotICAgICAgICAgICAgICAgImFuZCA0OjQ6NCBmb3JtYXRzLlxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdmN0eC0+ZnJhbWVyYXRlLm51bSA9IHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmZyYW1lX3JhdGVfbnVtZXJhdG9yOwotICAgIGF2Y3R4LT5mcmFtZXJhdGUuZGVuID0gcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+ZnJhbWVfcmF0ZV9kZW5vbWluYXRvcjsKLX0KLQotc3RhdGljIGludCBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7Ci0gICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7Ci0gICAgaW50NjRfdCBwdHMgID0gYXZwa3QtPnB0czsKLSAgICBTY2hyb1RhZyAqdGFnOwotCi0gICAgU2Nocm9EZWNvZGVyUGFyYW1zICpwX3NjaHJvX3BhcmFtcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgU2Nocm9EZWNvZGVyICpkZWNvZGVyID0gcF9zY2hyb19wYXJhbXMtPmRlY29kZXI7Ci0gICAgU2Nocm9CdWZmZXIgKmVuY19idWY7Ci0gICAgU2Nocm9GcmFtZSogZnJhbWU7Ci0gICAgQVZGcmFtZSAqYXZmcmFtZSA9IGRhdGE7Ci0gICAgaW50IHN0YXRlOwotICAgIGludCBnbyA9IDE7Ci0gICAgaW50IG91dGVyID0gMTsKLSAgICBTY2hyb1BhcnNlVW5pdENvbnRleHQgcGFyc2VfY3R4OwotICAgIExpYlNjaHJvRnJhbWVDb250ZXh0ICpmcmFtZXdpdGhwdHMgPSBOVUxMOwotCi0gICAgKmdvdF9mcmFtZSA9IDA7Ci0KLSAgICBwYXJzZV9jb250ZXh0X2luaXQoJnBhcnNlX2N0eCwgYnVmLCBidWZfc2l6ZSk7Ci0gICAgaWYgKCFidWZfc2l6ZSkgewotICAgICAgICBpZiAoIXBfc2Nocm9fcGFyYW1zLT5lb3Nfc2lnbmFsbGVkKSB7Ci0gICAgICAgICAgICBzdGF0ZSA9IHNjaHJvX2RlY29kZXJfcHVzaF9lbmRfb2Zfc3RyZWFtKGRlY29kZXIpOwotICAgICAgICAgICAgcF9zY2hyb19wYXJhbXMtPmVvc19zaWduYWxsZWQgPSAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogTG9vcCB0aHJvdWdoIGFsbCB0aGUgaW5kaXZpZHVhbCBwYXJzZSB1bml0cyBpbiB0aGUgaW5wdXQgYnVmZmVyICovCi0gICAgZG8gewotICAgICAgICBpZiAoKGVuY19idWYgPSBmaW5kX25leHRfcGFyc2VfdW5pdCgmcGFyc2VfY3R4KSkpIHsKLSAgICAgICAgICAgIC8qIFNldCBTY2hyb3RhZyB3aXRoIHRoZSBwdHMgdG8gYmUgcmVjb3ZlcmVkIGFmdGVyIGRlY29kaW5nKi8KLSAgICAgICAgICAgIGVuY19idWYtPnRhZyA9IHNjaHJvX3RhZ19uZXcoYXZfbWFsbG9jKHNpemVvZihpbnQ2NF90KSksIGF2X2ZyZWUpOwotICAgICAgICAgICAgaWYgKCFlbmNfYnVmLT50YWctPnZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gYWxsb2NhdGUgU2Nocm9UYWdcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBVl9XTig2NCwgZW5jX2J1Zi0+dGFnLT52YWx1ZSwgcHRzKTsKLSAgICAgICAgICAgIC8qIFB1c2ggYnVmZmVyIGludG8gZGVjb2Rlci4gKi8KLSAgICAgICAgICAgIGlmIChTQ0hST19QQVJTRV9DT0RFX0lTX1BJQ1RVUkUoZW5jX2J1Zi0+ZGF0YVs0XSkgJiYKLSAgICAgICAgICAgICAgICBTQ0hST19QQVJTRV9DT0RFX05VTV9SRUZTKGVuY19idWYtPmRhdGFbNF0pID4gMCkKLSAgICAgICAgICAgICAgICBhdmN0eC0+aGFzX2JfZnJhbWVzID0gMTsKLSAgICAgICAgICAgIHN0YXRlID0gc2Nocm9fZGVjb2Rlcl9wdXNoKGRlY29kZXIsIGVuY19idWYpOwotICAgICAgICAgICAgaWYgKHN0YXRlID09IFNDSFJPX0RFQ09ERVJfRklSU1RfQUNDRVNTX1VOSVQpCi0gICAgICAgICAgICAgICAgbGlic2Nocm9lZGluZ2VyX2hhbmRsZV9maXJzdF9hY2Nlc3NfdW5pdChhdmN0eCk7Ci0gICAgICAgICAgICBnbyA9IDE7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgb3V0ZXIgPSAwOwotCi0gICAgICAgIHdoaWxlIChnbykgewotICAgICAgICAgICAgLyogUGFyc2UgZGF0YSBhbmQgcHJvY2VzcyByZXN1bHQuICovCi0gICAgICAgICAgICBzdGF0ZSA9IHNjaHJvX2RlY29kZXJfd2FpdChkZWNvZGVyKTsKLSAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgU0NIUk9fREVDT0RFUl9GSVJTVF9BQ0NFU1NfVU5JVDoKLSAgICAgICAgICAgICAgICBsaWJzY2hyb2VkaW5nZXJfaGFuZGxlX2ZpcnN0X2FjY2Vzc191bml0KGF2Y3R4KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTQ0hST19ERUNPREVSX05FRURfQklUUzoKLSAgICAgICAgICAgICAgICAvKiBOZWVkIG1vcmUgaW5wdXQgZGF0YSAtIHN0b3AgaXRlcmF0aW5nIG92ZXIgd2hhdCB3ZSBoYXZlLiAqLwotICAgICAgICAgICAgICAgIGdvID0gMDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTQ0hST19ERUNPREVSX05FRURfRlJBTUU6Ci0gICAgICAgICAgICAgICAgLyogRGVjb2RlciBuZWVkcyBhIGZyYW1lIC0gY3JlYXRlIG9uZSBhbmQgcHVzaCBpdCBpbi4gKi8KLSAgICAgICAgICAgICAgICBmcmFtZSA9IGZmX2NyZWF0ZV9zY2hyb19mcmFtZShhdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZnJhbWVfZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBpZiAoIWZyYW1lKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgIHNjaHJvX2RlY29kZXJfYWRkX291dHB1dF9waWN0dXJlKGRlY29kZXIsIGZyYW1lKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBTQ0hST19ERUNPREVSX09LOgotICAgICAgICAgICAgICAgIC8qIFB1bGwgYSBmcmFtZSBvdXQgb2YgdGhlIGRlY29kZXIuICovCi0gICAgICAgICAgICAgICAgdGFnICAgPSBzY2hyb19kZWNvZGVyX2dldF9waWN0dXJlX3RhZyhkZWNvZGVyKTsKLSAgICAgICAgICAgICAgICBmcmFtZSA9IHNjaHJvX2RlY29kZXJfcHVsbChkZWNvZGVyKTsKLQotICAgICAgICAgICAgICAgIGlmIChmcmFtZSkgewotICAgICAgICAgICAgICAgICAgICAvKiBBZGQgcmVsYXRpb24gYmV0d2VlbiBzY2hyb2ZyYW1lIGFuZCBwdHMuICovCi0gICAgICAgICAgICAgICAgICAgIGZyYW1ld2l0aHB0cyA9IGF2X21hbGxvYyhzaXplb2YoTGliU2Nocm9GcmFtZUNvbnRleHQpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFmcmFtZXdpdGhwdHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGFsbG9jYXRlIEZyYW1lV2l0aFB0c1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyYW1ld2l0aHB0cy0+ZnJhbWUgPSBmcmFtZTsKLSAgICAgICAgICAgICAgICAgICAgZnJhbWV3aXRocHRzLT5wdHMgICA9IEFWX1JONjQodGFnLT52YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGZmX3NjaHJvX3F1ZXVlX3B1c2hfYmFjaygmcF9zY2hyb19wYXJhbXMtPmRlY19mcmFtZV9xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1ld2l0aHB0cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTQ0hST19ERUNPREVSX0VPUzoKLSAgICAgICAgICAgICAgICBnbyA9IDA7Ci0gICAgICAgICAgICAgICAgcF9zY2hyb19wYXJhbXMtPmVvc19wdWxsZWQgPSAxOwotICAgICAgICAgICAgICAgIHNjaHJvX2RlY29kZXJfcmVzZXQoZGVjb2Rlcik7Ci0gICAgICAgICAgICAgICAgb3V0ZXIgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNDSFJPX0RFQ09ERVJfRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSB3aGlsZSAob3V0ZXIpOwotCi0gICAgLyogR3JhYiBuZXh0IGZyYW1lIHRvIGJlIHJldHVybmVkIGZyb20gdGhlIHRvcCBvZiB0aGUgcXVldWUuICovCi0gICAgZnJhbWV3aXRocHRzID0gZmZfc2Nocm9fcXVldWVfcG9wKCZwX3NjaHJvX3BhcmFtcy0+ZGVjX2ZyYW1lX3F1ZXVlKTsKLQotICAgIGlmIChmcmFtZXdpdGhwdHMgJiYgZnJhbWV3aXRocHRzLT5mcmFtZSkgewotICAgICAgICBpbnQgcmV0OwotCi0gICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgYXZmcmFtZSwgMCkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgbWVtY3B5KGF2ZnJhbWUtPmRhdGFbMF0sCi0gICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzBdLmRhdGEsCi0gICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzBdLmxlbmd0aCk7Ci0KLSAgICAgICAgbWVtY3B5KGF2ZnJhbWUtPmRhdGFbMV0sCi0gICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzFdLmRhdGEsCi0gICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzFdLmxlbmd0aCk7Ci0KLSAgICAgICAgbWVtY3B5KGF2ZnJhbWUtPmRhdGFbMl0sCi0gICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzJdLmRhdGEsCi0gICAgICAgICAgICAgICBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzJdLmxlbmd0aCk7Ci0KLSAgICAgICAgLyogRmlsbCBmcmFtZSB3aXRoIGN1cnJlbnQgYnVmZmVyIGRhdGEgZnJvbSBTY2hyb2VkaW5nZXIuICovCi0gICAgICAgIGF2ZnJhbWUtPnBrdF9wdHMgPSBmcmFtZXdpdGhwdHMtPnB0czsKLSAgICAgICAgYXZmcmFtZS0+bGluZXNpemVbMF0gPSBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzBdLnN0cmlkZTsKLSAgICAgICAgYXZmcmFtZS0+bGluZXNpemVbMV0gPSBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzFdLnN0cmlkZTsKLSAgICAgICAgYXZmcmFtZS0+bGluZXNpemVbMl0gPSBmcmFtZXdpdGhwdHMtPmZyYW1lLT5jb21wb25lbnRzWzJdLnN0cmlkZTsKLQotICAgICAgICAqZ290X2ZyYW1lICAgICAgPSAxOwotCi0gICAgICAgIC8qIE5vdyBmcmVlIHRoZSBmcmFtZSByZXNvdXJjZXMuICovCi0gICAgICAgIGxpYnNjaHJvZWRpbmdlcl9kZWNvZGVfZnJhbWVfZnJlZShmcmFtZXdpdGhwdHMtPmZyYW1lKTsKLSAgICAgICAgYXZfZnJlZShmcmFtZXdpdGhwdHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRhdGEgICAgICAgPSBOVUxMOwotICAgICAgICAqZ290X2ZyYW1lID0gMDsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1Zl9zaXplOwotfQotCi0KLXN0YXRpYyBhdl9jb2xkIGludCBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBTY2hyb0RlY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICAvKiBGcmVlIHRoZSBkZWNvZGVyLiAqLwotICAgIHNjaHJvX2RlY29kZXJfZnJlZShwX3NjaHJvX3BhcmFtcy0+ZGVjb2Rlcik7Ci0gICAgYXZfZnJlZXAoJnBfc2Nocm9fcGFyYW1zLT5mb3JtYXQpOwotCi0gICAgLyogRnJlZSBkYXRhIGluIHRoZSBvdXRwdXQgZnJhbWUgcXVldWUuICovCi0gICAgZmZfc2Nocm9fcXVldWVfZnJlZSgmcF9zY2hyb19wYXJhbXMtPmRlY19mcmFtZV9xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpYnNjaHJvZWRpbmdlcl9kZWNvZGVfZnJhbWVfZnJlZSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbGlic2Nocm9lZGluZ2VyX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICAvKiBHb3QgYSBzZWVrIHJlcXVlc3QuIEZyZWUgdGhlIGRlY29kZWQgZnJhbWVzIHF1ZXVlIGFuZCB0aGVuIHJlc2V0Ci0gICAgICogdGhlIGRlY29kZXIgKi8KLSAgICBTY2hyb0RlY29kZXJQYXJhbXMgKnBfc2Nocm9fcGFyYW1zID0gYXZjdHgtPnByaXZfZGF0YTsKLQotICAgIC8qIEZyZWUgZGF0YSBpbiB0aGUgb3V0cHV0IGZyYW1lIHF1ZXVlLiAqLwotICAgIGZmX3NjaHJvX3F1ZXVlX2ZyZWUoJnBfc2Nocm9fcGFyYW1zLT5kZWNfZnJhbWVfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2ZyYW1lX2ZyZWUpOwotCi0gICAgZmZfc2Nocm9fcXVldWVfaW5pdCgmcF9zY2hyb19wYXJhbXMtPmRlY19mcmFtZV9xdWV1ZSk7Ci0gICAgc2Nocm9fZGVjb2Rlcl9yZXNldChwX3NjaHJvX3BhcmFtcy0+ZGVjb2Rlcik7Ci0gICAgcF9zY2hyb19wYXJhbXMtPmVvc19wdWxsZWQgPSAwOwotICAgIHBfc2Nocm9fcGFyYW1zLT5lb3Nfc2lnbmFsbGVkID0gMDsKLX0KLQotQVZDb2RlYyBmZl9saWJzY2hyb2VkaW5nZXJfZGVjb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAibGlic2Nocm9lZGluZ2VyIiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlic2Nocm9lZGluZ2VyIERpcmFjIDIuMiIpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9ESVJBQywKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU2Nocm9EZWNvZGVyUGFyYW1zKSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2luaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gbGlic2Nocm9lZGluZ2VyX2RlY29kZV9jbG9zZSwKLSAgICAuZGVjb2RlICAgICAgICAgPSBsaWJzY2hyb2VkaW5nZXJfZGVjb2RlX2ZyYW1lLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9EUjEsCi0gICAgLmZsdXNoICAgICAgICAgID0gbGlic2Nocm9lZGluZ2VyX2ZsdXNoLAotfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyZW5jLmMgYi9saWJhdmNvZGVjL2xpYnNjaHJvZWRpbmdlcmVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWRhNmZjLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvbGlic2Nocm9lZGluZ2VyZW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLyoKLSAqIERpcmFjIGVuY29kZXIgc3VwcG9ydCB2aWEgU2Nocm9lZGluZ2VyIGxpYnJhcmllcwotICogQ29weXJpZ2h0IChjKSAyMDA4IEJCQywgQW51cmFkaGEgU3VyYXBhcmFqdSA8YXN1cmFwYXJhanUgYXQgZ21haWwgZG90IGNvbSA+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLS8qKgotKiBAZmlsZQotKiBEaXJhYyBlbmNvZGVyIHN1cHBvcnQgdmlhIGxpYnNjaHJvZWRpbmdlci0xLjAgbGlicmFyaWVzLiBNb3JlIGRldGFpbHMgYWJvdXQKLSogdGhlIFNjaHJvZWRpbmdlciBwcm9qZWN0IGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vd3d3LmRpcmFjdmlkZW8ub3JnLy4KLSogVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBEaXJhYyBTcGVjaWZpY2F0aW9uIFZlcnNpb24gMi4yCi0qIChodHRwOi8vZGlyYWMuc291cmNlZm9yZ2UubmV0L3NwZWNpZmljYXRpb24uaHRtbCkuCi0qLwotCi0jaW5jbHVkZSA8c2Nocm9lZGluZ2VyL3NjaHJvLmg+Ci0jaW5jbHVkZSA8c2Nocm9lZGluZ2VyL3NjaHJvZGVidWcuaD4KLSNpbmNsdWRlIDxzY2hyb2VkaW5nZXIvc2Nocm92aWRlb2Zvcm1hdC5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCi0KLSNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJzY2hyb2VkaW5nZXIuaCIKLSNpbmNsdWRlICJieXRlc3RyZWFtLmgiCi0KLQotLyoqIGxpYnNjaHJvZWRpbmdlciBlbmNvZGVyIHByaXZhdGUgZGF0YSAqLwotdHlwZWRlZiBzdHJ1Y3QgU2Nocm9FbmNvZGVyUGFyYW1zIHsKLSAgICBBVkNsYXNzICAgICAgICAqY2xhc3M7Ci0KLSAgICAvKiogU2Nocm9lZGluZ2VyIHZpZGVvIGZvcm1hdCAqLwotICAgIFNjaHJvVmlkZW9Gb3JtYXQgKmZvcm1hdDsKLQotICAgIC8qKiBTY2hyb2VkaW5nZXIgZnJhbWUgZm9ybWF0ICovCi0gICAgU2Nocm9GcmFtZUZvcm1hdCBmcmFtZV9mb3JtYXQ7Ci0KLSAgICAvKiogZnJhbWUgc2l6ZSAqLwotICAgIGludCBmcmFtZV9zaXplOwotCi0gICAgLyoqIFNjaHJvZWRpbmdlciBlbmNvZGVyIGhhbmRsZSovCi0gICAgU2Nocm9FbmNvZGVyKiBlbmNvZGVyOwotCi0gICAgLyoqIGJ1ZmZlciB0byBzdG9yZSBlbmNvZGVyIG91dHB1dCBiZWZvcmUgd3JpdGluZyBpdCB0byB0aGUgZnJhbWUgcXVldWUqLwotICAgIHVuc2lnbmVkIGNoYXIgKmVuY19idWY7Ci0KLSAgICAvKiogU2l6ZSBvZiBlbmNvZGVyIGJ1ZmZlciovCi0gICAgaW50IGVuY19idWZfc2l6ZTsKLQotICAgIC8qKiBxdWV1ZSBzdG9yaW5nIGVuY29kZWQgZnJhbWVzICovCi0gICAgRkZTY2hyb1F1ZXVlIGVuY19mcmFtZV9xdWV1ZTsKLQotICAgIC8qKiBlbmQgb2Ygc2VxdWVuY2Ugc2lnbmFsbGVkICovCi0gICAgaW50IGVvc19zaWduYWxsZWQ7Ci0KLSAgICAvKiogZW5kIG9mIHNlcXVlbmNlIHB1bGxlZCAqLwotICAgIGludCBlb3NfcHVsbGVkOwotCi0gICAgLyogY291bnRlciBmb3IgZnJhbWVzIHN1Ym1pdHRlZCB0byBlbmNvZGVyLCB1c2VkIGFzIGR0cyAqLwotICAgIGludDY0X3QgZHRzOwotCi0gICAgLyoqIGVuYWJsZSBub2FyaXRoICovCi0gICAgaW50IG5vYXJpdGg7Ci19IFNjaHJvRW5jb2RlclBhcmFtczsKLQotLyoqCi0qIFdvcmtzIG91dCBTY2hyby1jb21wYXRpYmxlIGNocm9tYSBmb3JtYXQuCi0qLwotc3RhdGljIGludCBzZXRfY2hyb21hX2Zvcm1hdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgaW50IG51bV9mb3JtYXRzID0gc2l6ZW9mKHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXApIC8KLSAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2Nocm9fcGl4ZWxfZm9ybWF0X21hcFswXSk7Ci0gICAgaW50IGlkeDsKLQotICAgIFNjaHJvRW5jb2RlclBhcmFtcyAqcF9zY2hyb19wYXJhbXMgPSBhdmN0eC0+cHJpdl9kYXRhOwotCi0gICAgZm9yIChpZHggPSAwOyBpZHggPCBudW1fZm9ybWF0czsgKytpZHgpIHsKLSAgICAgICAgaWYgKHNjaHJvX3BpeGVsX2Zvcm1hdF9tYXBbaWR4XS5mZl9waXhfZm10ID09IGF2Y3R4LT5waXhfZm10KSB7Ci0gICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5jaHJvbWFfZm9ybWF0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hyb19waXhlbF9mb3JtYXRfbWFwW2lkeF0uc2Nocm9fcGl4X2ZtdDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICJUaGlzIGNvZGVjIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHBsYW5hciBZVVYgNDoyOjAsIDQ6MjoyIgotICAgICAgICAgICAiIGFuZCA0OjQ6NCBmb3JtYXRzLlxuIik7Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBhdl9jb2xkIGludCBsaWJzY2hyb2VkaW5nZXJfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIFNjaHJvRW5jb2RlclBhcmFtcyAqcF9zY2hyb19wYXJhbXMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIFNjaHJvVmlkZW9Gb3JtYXRFbnVtIHByZXNldDsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIGxpYnJhcmllcyB0aGF0IGxpYnNjaHJvZWRpbmdlciBkZXBlbmRzIG9uLiAqLwotICAgIHNjaHJvX2luaXQoKTsKLQotICAgIC8qIENyZWF0ZSBhbiBlbmNvZGVyIG9iamVjdC4gKi8KLSAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jb2RlciA9IHNjaHJvX2VuY29kZXJfbmV3KCk7Ci0KLSAgICBpZiAoIXBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlVucmVjb3ZlcmFibGUgRXJyb3I6IHNjaHJvX2VuY29kZXJfbmV3IGZhaWxlZC4gIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBmb3JtYXQuICovCi0gICAgcHJlc2V0ID0gZmZfZ2V0X3NjaHJvX3ZpZGVvX2Zvcm1hdF9wcmVzZXQoYXZjdHgpOwotICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICBzY2hyb19lbmNvZGVyX2dldF92aWRlb19mb3JtYXQocF9zY2hyb19wYXJhbXMtPmVuY29kZXIpOwotICAgIHNjaHJvX3ZpZGVvX2Zvcm1hdF9zZXRfc3RkX3ZpZGVvX2Zvcm1hdChwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LCBwcmVzZXQpOwotICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPndpZHRoICA9IGF2Y3R4LT53aWR0aDsKLSAgICBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OwotCi0gICAgaWYgKHNldF9jaHJvbWFfZm9ybWF0KGF2Y3R4KSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgPT0gQVZDT0xfUFJJX0JUNzA5KSB7Ci0gICAgICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmNvbG91cl9wcmltYXJpZXMgPSBTQ0hST19DT0xPVVJfUFJJTUFSWV9IRFRWOwotICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9PSBBVkNPTF9QUklfQlQ0NzBCRykgewotICAgICAgICBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5jb2xvdXJfcHJpbWFyaWVzID0gU0NIUk9fQ09MT1VSX1BSSU1BUllfU0RUVl82MjU7Ci0gICAgfSBlbHNlIGlmIChhdmN0eC0+Y29sb3JfcHJpbWFyaWVzID09IEFWQ09MX1BSSV9TTVBURTE3ME0pIHsKLSAgICAgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+Y29sb3VyX3ByaW1hcmllcyA9IFNDSFJPX0NPTE9VUl9QUklNQVJZX1NEVFZfNTI1OwotICAgIH0KLQotICAgIGlmIChhdmN0eC0+Y29sb3JzcGFjZSA9PSBBVkNPTF9TUENfQlQ3MDkpIHsKLSAgICAgICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+Y29sb3VyX21hdHJpeCA9IFNDSFJPX0NPTE9VUl9NQVRSSVhfSERUVjsKLSAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19CVDQ3MEJHKSB7Ci0gICAgICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmNvbG91cl9tYXRyaXggPSBTQ0hST19DT0xPVVJfTUFUUklYX1NEVFY7Ci0gICAgfQotCi0gICAgaWYgKGF2Y3R4LT5jb2xvcl90cmMgPT0gQVZDT0xfVFJDX0JUNzA5KSB7Ci0gICAgICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPnRyYW5zZmVyX2Z1bmN0aW9uID0gU0NIUk9fVFJBTlNGRVJfQ0hBUl9UVl9HQU1NQTsKLSAgICB9Ci0KLSAgICBpZiAoZmZfZ2V0X3NjaHJvX2ZyYW1lX2Zvcm1hdChwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0LT5jaHJvbWFfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwX3NjaHJvX3BhcmFtcy0+ZnJhbWVfZm9ybWF0KSA9PSAtMSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJUaGlzIGNvZGVjIGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IHBsYW5hciBZVVYgNDoyOjAsIDQ6MjoyIgotICAgICAgICAgICAgICAgIiBhbmQgNDo0OjQgZm9ybWF0cy5cbiIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcF9zY2hyb19wYXJhbXMtPmZvcm1hdC0+ZnJhbWVfcmF0ZV9udW1lcmF0b3IgICA9IGF2Y3R4LT50aW1lX2Jhc2UuZGVuOwotICAgIHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQtPmZyYW1lX3JhdGVfZGVub21pbmF0b3IgPSBhdmN0eC0+dGltZV9iYXNlLm51bTsKLQotICAgIHBfc2Nocm9fcGFyYW1zLT5mcmFtZV9zaXplID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKGF2Y3R4LT5waXhfZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0LCAxKTsKLQotICAgIGlmICghYXZjdHgtPmdvcF9zaXplKSB7Ci0gICAgICAgIHNjaHJvX2VuY29kZXJfc2V0dGluZ19zZXRfZG91YmxlKHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29wX3N0cnVjdHVyZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSFJPX0VOQ09ERVJfR09QX0lOVFJBX09OTFkpOwotCi0jaWYgRkZfQVBJX0NPREVSX1RZUEUKLUZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSAgICAgICAgaWYgKGF2Y3R4LT5jb2Rlcl90eXBlICE9IEZGX0NPREVSX1RZUEVfVkxDKQotICAgICAgICAgICAgcF9zY2hyb19wYXJhbXMtPm5vYXJpdGggPSAwOwotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKLSAgICAgICAgc2Nocm9fZW5jb2Rlcl9zZXR0aW5nX3NldF9kb3VibGUocF9zY2hyb19wYXJhbXMtPmVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmFibGVfbm9hcml0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5ub2FyaXRoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzY2hyb19lbmNvZGVyX3NldHRpbmdfc2V0X2RvdWJsZShwX3NjaHJvX3BhcmFtcy0+ZW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1X2Rpc3RhbmNlIiwgYXZjdHgtPmdvcF9zaXplKTsKLSAgICAgICAgYXZjdHgtPmhhc19iX2ZyYW1lcyA9IDE7Ci0gICAgICAgIHBfc2Nocm9fcGFyYW1zLT5kdHMgPSAtMTsKLSAgICB9Ci0KLSAgICAvKiBGSVhNRSAtIE5lZWQgdG8gaGFuZGxlIFNDSFJPX0VOQ09ERVJfUkFURV9DT05UUk9MX0xPV19ERUxBWS4gKi8KLSAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19RU0NBTEUpIHsKLSAgICAgICAgaWYgKCFhdmN0eC0+Z2xvYmFsX3F1YWxpdHkpIHsKLSAgICAgICAgICAgIC8qIGxvc3NsZXNzIGNvZGluZyAqLwotICAgICAgICAgICAgc2Nocm9fZW5jb2Rlcl9zZXR0aW5nX3NldF9kb3VibGUocF9zY2hyb19wYXJhbXMtPmVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmF0ZV9jb250cm9sIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSFJPX0VOQ09ERVJfUkFURV9DT05UUk9MX0xPU1NMRVNTKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBxdWFsaXR5OwotICAgICAgICAgICAgc2Nocm9fZW5jb2Rlcl9zZXR0aW5nX3NldF9kb3VibGUocF9zY2hyb19wYXJhbXMtPmVuY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmF0ZV9jb250cm9sIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSFJPX0VOQ09ERVJfUkFURV9DT05UUk9MX0NPTlNUQU5UX1FVQUxJVFkpOwotCi0gICAgICAgICAgICBxdWFsaXR5ID0gYXZjdHgtPmdsb2JhbF9xdWFsaXR5IC8gRkZfUVAyTEFNQkRBOwotICAgICAgICAgICAgaWYgKHF1YWxpdHkgPiAxMCkKLSAgICAgICAgICAgICAgICBxdWFsaXR5ID0gMTA7Ci0gICAgICAgICAgICBzY2hyb19lbmNvZGVyX3NldHRpbmdfc2V0X2RvdWJsZShwX3NjaHJvX3BhcmFtcy0+ZW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJxdWFsaXR5IiwgcXVhbGl0eSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBzY2hyb19lbmNvZGVyX3NldHRpbmdfc2V0X2RvdWJsZShwX3NjaHJvX3BhcmFtcy0+ZW5jb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJhdGVfY29udHJvbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSFJPX0VOQ09ERVJfUkFURV9DT05UUk9MX0NPTlNUQU5UX0JJVFJBVEUpOwotCi0gICAgICAgIHNjaHJvX2VuY29kZXJfc2V0dGluZ19zZXRfZG91YmxlKHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYml0cmF0ZSIsIGF2Y3R4LT5iaXRfcmF0ZSk7Ci0gICAgfQotCi0gICAgaWYgKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfSU5URVJMQUNFRF9NRSkKLSAgICAgICAgLyogQWxsIG1hdGVyaWFsIGNhbiBiZSBjb2RlZCBhcyBpbnRlcmxhY2VkIG9yIHByb2dyZXNzaXZlCi0gICAgICAgICAgIGlycmVzcGVjdGl2ZSBvZiB0aGUgdHlwZSBvZiBzb3VyY2UgbWF0ZXJpYWwuICovCi0gICAgICAgIHNjaHJvX2VuY29kZXJfc2V0dGluZ19zZXRfZG91YmxlKHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJsYWNlZF9jb2RpbmciLCAxKTsKLQotICAgIHNjaHJvX2VuY29kZXJfc2V0dGluZ19zZXRfZG91YmxlKHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLCAib3Blbl9nb3AiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19DTE9TRURfR09QKSk7Ci0KLSAgICAvKiBGSVhNRTogU2lnbmFsIHJhbmdlIGhhcmRjb2RlZCB0byA4LWJpdCBkYXRhIHVudGlsIGJvdGggbGlic2Nocm9lZGluZ2VyCi0gICAgICogYW5kIGxpYmRpcmFjIHN1cHBvcnQgb3RoZXIgYml0LWRlcHRoIGRhdGEuICovCi0gICAgc2Nocm9fdmlkZW9fZm9ybWF0X3NldF9zdGRfc2lnbmFsX3JhbmdlKHBfc2Nocm9fcGFyYW1zLT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDSFJPX1NJR05BTF9SQU5HRV84QklUX1ZJREVPKTsKLQotICAgIC8qIFNldCB0aGUgZW5jb2RlciBmb3JtYXQuICovCi0gICAgc2Nocm9fZW5jb2Rlcl9zZXRfdmlkZW9fZm9ybWF0KHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0KTsKLQotICAgIC8qIFNldCB0aGUgZGVidWcgbGV2ZWwuICovCi0gICAgc2Nocm9fZGVidWdfc2V0X2xldmVsKGF2Y3R4LT5kZWJ1Zyk7Ci0KLSAgICBzY2hyb19lbmNvZGVyX3N0YXJ0KHBfc2Nocm9fcGFyYW1zLT5lbmNvZGVyKTsKLQotICAgIC8qIEluaXRpYWxpemUgdGhlIGVuY29kZWQgZnJhbWUgcXVldWUuICovCi0gICAgZmZfc2Nocm9fcXVldWVfaW5pdCgmcF9zY2hyb19wYXJhbXMtPmVuY19mcmFtZV9xdWV1ZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBTY2hyb0ZyYW1lICpsaWJzY2hyb2VkaW5nZXJfZnJhbWVfZnJvbV9kYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQotewotICAgIFNjaHJvRW5jb2RlclBhcmFtcyAqcF9zY2hyb19wYXJhbXMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIFNjaHJvRnJhbWUgKmluX2ZyYW1lID0gZmZfY3JlYXRlX3NjaHJvX2ZyYW1lKGF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5mcmFtZV9mb3JtYXQpOwotCi0gICAgaWYgKGluX2ZyYW1lKSB7Ci0gICAgICAgIC8qIENvcHkgaW5wdXQgZGF0YSB0byBTY2hyb0ZyYW1lIGJ1ZmZlcnMgKHRoZXkgbWF0Y2ggdGhlIG9uZXMKLSAgICAgICAgICogcmVmZXJlbmNlZCBieSB0aGUgQVZGcmFtZSBzdG9yZWQgaW4gcHJpdikgKi8KLSAgICAgICAgaWYgKGF2X2ZyYW1lX2NvcHkoaW5fZnJhbWUtPnByaXYsIGZyYW1lKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNvcHkgaW5wdXQgZGF0YVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBpbl9mcmFtZTsKLX0KLQotc3RhdGljIHZvaWQgbGlic2Nocm9lZGluZ2VyX2ZyZWVfZnJhbWUodm9pZCAqZGF0YSkKLXsKLSAgICBGRlNjaHJvRW5jb2RlZEZyYW1lICplbmNfZnJhbWUgPSBkYXRhOwotCi0gICAgYXZfZnJlZXAoJmVuY19mcmFtZS0+cF9lbmNidWYpOwotICAgIGF2X2ZyZWUoZW5jX2ZyYW1lKTsKLX0KLQotc3RhdGljIGludCBsaWJzY2hyb2VkaW5nZXJfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQotewotICAgIGludCBlbmNfc2l6ZSA9IDA7Ci0gICAgU2Nocm9FbmNvZGVyUGFyYW1zICpwX3NjaHJvX3BhcmFtcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgU2Nocm9FbmNvZGVyICplbmNvZGVyID0gcF9zY2hyb19wYXJhbXMtPmVuY29kZXI7Ci0gICAgc3RydWN0IEZGU2Nocm9FbmNvZGVkRnJhbWUgKnBfZnJhbWVfb3V0cHV0ID0gTlVMTDsKLSAgICBpbnQgZ28gPSAxOwotICAgIFNjaHJvQnVmZmVyICplbmNfYnVmOwotICAgIGludCBwcmVzZW50YXRpb25fZnJhbWU7Ci0gICAgaW50IHBhcnNlX2NvZGU7Ci0gICAgaW50IGxhc3RfZnJhbWVfaW5fc2VxdWVuY2UgPSAwOwotICAgIGludCBwa3Rfc2l6ZSwgcmV0OwotCi0gICAgaWYgKCFmcmFtZSkgewotICAgICAgICAvKiBQdXNoIGVuZCBvZiBzZXF1ZW5jZSBpZiBub3QgYWxyZWFkeSBzaWduYWxsZWQuICovCi0gICAgICAgIGlmICghcF9zY2hyb19wYXJhbXMtPmVvc19zaWduYWxsZWQpIHsKLSAgICAgICAgICAgIHNjaHJvX2VuY29kZXJfZW5kX29mX3N0cmVhbShlbmNvZGVyKTsKLSAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5lb3Nfc2lnbmFsbGVkID0gMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIEFsbG9jYXRlIGZyYW1lIGRhdGEgdG8gc2Nocm8gaW5wdXQgYnVmZmVyLiAqLwotICAgICAgICBTY2hyb0ZyYW1lICppbl9mcmFtZSA9IGxpYnNjaHJvZWRpbmdlcl9mcmFtZV9mcm9tX2RhdGEoYXZjdHgsIGZyYW1lKTsKLSAgICAgICAgaWYgKCFpbl9mcmFtZSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIC8qIExvYWQgbmV4dCBmcmFtZS4gKi8KLSAgICAgICAgc2Nocm9fZW5jb2Rlcl9wdXNoX2ZyYW1lKGVuY29kZXIsIGluX2ZyYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAocF9zY2hyb19wYXJhbXMtPmVvc19wdWxsZWQpCi0gICAgICAgIGdvID0gMDsKLQotICAgIC8qIE5vdyBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhbnkgb3V0cHV0IGZyb20gdGhlIGVuY29kZXIuICovCi0gICAgd2hpbGUgKGdvKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIFNjaHJvU3RhdGVFbnVtIHN0YXRlOwotICAgICAgICBzdGF0ZSA9IHNjaHJvX2VuY29kZXJfd2FpdChlbmNvZGVyKTsKLSAgICAgICAgc3dpdGNoIChzdGF0ZSkgewotICAgICAgICBjYXNlIFNDSFJPX1NUQVRFX0hBVkVfQlVGRkVSOgotICAgICAgICBjYXNlIFNDSFJPX1NUQVRFX0VORF9PRl9TVFJFQU06Ci0gICAgICAgICAgICBlbmNfYnVmID0gc2Nocm9fZW5jb2Rlcl9wdWxsKGVuY29kZXIsICZwcmVzZW50YXRpb25fZnJhbWUpOwotICAgICAgICAgICAgaWYgKGVuY19idWYtPmxlbmd0aCA8PSAwKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKLSAgICAgICAgICAgIHBhcnNlX2NvZGUgPSBlbmNfYnVmLT5kYXRhWzRdOwotCi0gICAgICAgICAgICAvKiBBbGwgbm9uLWZyYW1lIGRhdGEgaXMgcHJlcGVuZGVkIHRvIGFjdHVhbCBmcmFtZSBkYXRhIHRvCi0gICAgICAgICAgICAgKiBiZSBhYmxlIHRvIHNldCB0aGUgcHRzIGNvcnJlY3RseS4gU28gd2UgZG9uJ3Qgd3JpdGUgZGF0YQotICAgICAgICAgICAgICogdG8gdGhlIGZyYW1lIG91dHB1dCBxdWV1ZSB1bnRpbCB3ZSBhY3R1YWxseSBoYXZlIGEgZnJhbWUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmcF9zY2hyb19wYXJhbXMtPmVuY19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmX3NpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNfYnVmLT5sZW5ndGgpKSA8IDApIHsKLSAgICAgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZW1jcHkocF9zY2hyb19wYXJhbXMtPmVuY19idWYgKyBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgIGVuY19idWYtPmRhdGEsIGVuY19idWYtPmxlbmd0aCk7Ci0gICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplICs9IGVuY19idWYtPmxlbmd0aDsKLQotCi0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gU0NIUk9fU1RBVEVfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5lb3NfcHVsbGVkID0gMTsKLSAgICAgICAgICAgICAgICBnbyA9IDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghU0NIUk9fUEFSU0VfQ09ERV9JU19QSUNUVVJFKHBhcnNlX2NvZGUpKSB7Ci0gICAgICAgICAgICAgICAgc2Nocm9fYnVmZmVyX3VucmVmKGVuY19idWYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBDcmVhdGUgb3V0cHV0IGZyYW1lLiAqLwotICAgICAgICAgICAgcF9mcmFtZV9vdXRwdXQgPSBhdl9tYWxsb2N6KHNpemVvZihGRlNjaHJvRW5jb2RlZEZyYW1lKSk7Ci0gICAgICAgICAgICBpZiAoIXBfZnJhbWVfb3V0cHV0KQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAvKiBTZXQgb3V0cHV0IGRhdGEuICovCi0gICAgICAgICAgICBwX2ZyYW1lX291dHB1dC0+c2l6ZSAgICAgPSBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplOwotICAgICAgICAgICAgcF9mcmFtZV9vdXRwdXQtPnBfZW5jYnVmID0gcF9zY2hyb19wYXJhbXMtPmVuY19idWY7Ci0gICAgICAgICAgICBpZiAoU0NIUk9fUEFSU0VfQ09ERV9JU19JTlRSQShwYXJzZV9jb2RlKSAmJgotICAgICAgICAgICAgICAgIFNDSFJPX1BBUlNFX0NPREVfSVNfUkVGRVJFTkNFKHBhcnNlX2NvZGUpKQotICAgICAgICAgICAgICAgIHBfZnJhbWVfb3V0cHV0LT5rZXlfZnJhbWUgPSAxOwotCi0gICAgICAgICAgICAvKiBQYXJzZSB0aGUgY29kZWQgZnJhbWUgbnVtYmVyIGZyb20gdGhlIGJpdHN0cmVhbS4gQnl0ZXMgMTQKLSAgICAgICAgICAgICAqIHRocm91Z2ggMTcgcmVwcmVzZXNlbnQgdGhlIGZyYW1lIG51bWJlci4gKi8KLSAgICAgICAgICAgIHBfZnJhbWVfb3V0cHV0LT5mcmFtZV9udW0gPSBBVl9SQjMyKGVuY19idWYtPmRhdGEgKyAxMyk7Ci0KLSAgICAgICAgICAgIGZmX3NjaHJvX3F1ZXVlX3B1c2hfYmFjaygmcF9zY2hyb19wYXJhbXMtPmVuY19mcmFtZV9xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ZyYW1lX291dHB1dCk7Ci0gICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplID0gMDsKLSAgICAgICAgICAgIHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmICAgICAgPSBOVUxMOwotCi0gICAgICAgICAgICBzY2hyb19idWZmZXJfdW5yZWYoZW5jX2J1Zik7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0NIUk9fU1RBVEVfTkVFRF9GUkFNRToKLSAgICAgICAgICAgIGdvID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0NIUk9fU1RBVEVfQUdBSU46Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIFNjaHJvIEVuY29kZXIgc3RhdGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ29weSAnbmV4dCcgZnJhbWUgaW4gcXVldWUuICovCi0KLSAgICBpZiAocF9zY2hyb19wYXJhbXMtPmVuY19mcmFtZV9xdWV1ZS5zaXplID09IDEgJiYKLSAgICAgICAgcF9zY2hyb19wYXJhbXMtPmVvc19wdWxsZWQpCi0gICAgICAgIGxhc3RfZnJhbWVfaW5fc2VxdWVuY2UgPSAxOwotCi0gICAgcF9mcmFtZV9vdXRwdXQgPSBmZl9zY2hyb19xdWV1ZV9wb3AoJnBfc2Nocm9fcGFyYW1zLT5lbmNfZnJhbWVfcXVldWUpOwotCi0gICAgaWYgKCFwX2ZyYW1lX291dHB1dCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBwa3Rfc2l6ZSA9IHBfZnJhbWVfb3V0cHV0LT5zaXplOwotICAgIGlmIChsYXN0X2ZyYW1lX2luX3NlcXVlbmNlICYmIHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmX3NpemUgPiAwKQotICAgICAgICBwa3Rfc2l6ZSArPSBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplOwotICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBwa3Rfc2l6ZSwgMCkpIDwgMCkKLSAgICAgICAgZ290byBlcnJvcjsKLQotICAgIG1lbWNweShwa3QtPmRhdGEsIHBfZnJhbWVfb3V0cHV0LT5wX2VuY2J1ZiwgcF9mcmFtZV9vdXRwdXQtPnNpemUpOwotI2lmIEZGX0FQSV9DT0RFRF9GUkFNRQotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lID0gcF9mcmFtZV9vdXRwdXQtPmtleV9mcmFtZTsKLSAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnB0cyA9IHBfZnJhbWVfb3V0cHV0LT5mcmFtZV9udW07Ci1GRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgotICAgIC8qIFVzZSB0aGUgZnJhbWUgbnVtYmVyIG9mIHRoZSBlbmNvZGVkIGZyYW1lIGFzIHRoZSBwdHMuIEl0IGlzIE9LIHRvCi0gICAgICogZG8gc28gc2luY2UgRGlyYWMgaXMgYSBjb25zdGFudCBmcmFtZSByYXRlIGNvZGVjLiBJdCBleHBlY3RzIGlucHV0Ci0gICAgICogdG8gYmUgb2YgY29uc3RhbnQgZnJhbWUgcmF0ZS4gKi8KLSAgICBwa3QtPnB0cyA9IHBfZnJhbWVfb3V0cHV0LT5mcmFtZV9udW07Ci0gICAgcGt0LT5kdHMgPSBwX3NjaHJvX3BhcmFtcy0+ZHRzKys7Ci0gICAgZW5jX3NpemUgPSBwX2ZyYW1lX291dHB1dC0+c2l6ZTsKLQotICAgIC8qIEFwcGVuZCB0aGUgZW5kIG9mIHNlcXVlbmNlIGluZm9ybWF0aW9uIHRvIHRoZSBsYXN0IGZyYW1lIGluIHRoZQotICAgICAqIHNlcXVlbmNlLiAqLwotICAgIGlmIChsYXN0X2ZyYW1lX2luX3NlcXVlbmNlICYmIHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmX3NpemUgPiAwKSB7Ci0gICAgICAgIG1lbWNweShwa3QtPmRhdGEgKyBlbmNfc2l6ZSwgcF9zY2hyb19wYXJhbXMtPmVuY19idWYsCi0gICAgICAgICAgICAgICBwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zl9zaXplKTsKLSAgICAgICAgZW5jX3NpemUgKz0gcF9zY2hyb19wYXJhbXMtPmVuY19idWZfc2l6ZTsKLSAgICAgICAgYXZfZnJlZXAoJnBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmKTsKLSAgICAgICAgcF9zY2hyb19wYXJhbXMtPmVuY19idWZfc2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKHBfZnJhbWVfb3V0cHV0LT5rZXlfZnJhbWUpCi0gICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwotICAgICpnb3RfcGFja2V0ID0gMTsKLQotZXJyb3I6Ci0gICAgLyogZnJlZSBmcmFtZSAqLwotICAgIGxpYnNjaHJvZWRpbmdlcl9mcmVlX2ZyYW1lKHBfZnJhbWVfb3V0cHV0KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgbGlic2Nocm9lZGluZ2VyX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgU2Nocm9FbmNvZGVyUGFyYW1zICpwX3NjaHJvX3BhcmFtcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0KLSAgICAvKiBDbG9zZSB0aGUgZW5jb2Rlci4gKi8KLSAgICBzY2hyb19lbmNvZGVyX2ZyZWUocF9zY2hyb19wYXJhbXMtPmVuY29kZXIpOwotCi0gICAgLyogRnJlZSBkYXRhIGluIHRoZSBvdXRwdXQgZnJhbWUgcXVldWUuICovCi0gICAgZmZfc2Nocm9fcXVldWVfZnJlZSgmcF9zY2hyb19wYXJhbXMtPmVuY19mcmFtZV9xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpYnNjaHJvZWRpbmdlcl9mcmVlX2ZyYW1lKTsKLQotCi0gICAgLyogRnJlZSB0aGUgZW5jb2RlciBidWZmZXIuICovCi0gICAgaWYgKHBfc2Nocm9fcGFyYW1zLT5lbmNfYnVmX3NpemUpCi0gICAgICAgIGF2X2ZyZWVwKCZwX3NjaHJvX3BhcmFtcy0+ZW5jX2J1Zik7Ci0KLSAgICAvKiBGcmVlIHRoZSB2aWRlbyBmb3JtYXQgc3RydWN0dXJlLiAqLwotICAgIGF2X2ZyZWVwKCZwX3NjaHJvX3BhcmFtcy0+Zm9ybWF0KTsKLQotICAgIHJldHVybiAwOwotfQotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTY2hyb0VuY29kZXJQYXJhbXMsIHgpCi0jZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7Ci0gICAgeyAibm9hcml0aCIsICJFbmFibGUgbm9hcml0aCIsIE9GRlNFVChub2FyaXRoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIFZFIH0sCi0KLSAgICB7IE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBBVkNsYXNzIGxpYnNjaHJvZWRpbmdlcl9jbGFzcyA9IHsKLSAgICAuY2xhc3NfbmFtZSA9ICJsaWJzY2hyb2VkaW5nZXIiLAotICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAotICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAotfTsKLQotQVZDb2RlYyBmZl9saWJzY2hyb2VkaW5nZXJfZW5jb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAibGlic2Nocm9lZGluZ2VyIiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlic2Nocm9lZGluZ2VyIERpcmFjIDIuMiIpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9ESVJBQywKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU2Nocm9FbmNvZGVyUGFyYW1zKSwKLSAgICAucHJpdl9jbGFzcyAgICAgPSAmbGlic2Nocm9lZGluZ2VyX2NsYXNzLAotICAgIC5pbml0ICAgICAgICAgICA9IGxpYnNjaHJvZWRpbmdlcl9lbmNvZGVfaW5pdCwKLSAgICAuZW5jb2RlMiAgICAgICAgPSBsaWJzY2hyb2VkaW5nZXJfZW5jb2RlX2ZyYW1lLAotICAgIC5jbG9zZSAgICAgICAgICA9IGxpYnNjaHJvZWRpbmdlcl9lbmNvZGVfY2xvc2UsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7Ci0gICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfTk9ORQotICAgIH0sCi19OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJzaGluZS5jIGIvbGliYXZjb2RlYy9saWJzaGluZS5jCmluZGV4IGY0Y2Y1OTguLjcwNTZmY2QgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlic2hpbmUuYworKysgYi9saWJhdmNvZGVjL2xpYnNoaW5lLmMKQEAgLTE0Niw0ICsxNDYsNSBAQAogICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgPSAoY29uc3QgdWludDY0X3RbXSkgeyBBVl9DSF9MQVlPVVRfTU9OTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCB9LAorICAgIC53cmFwcGVyX25hbWUgICAgICAgICAgPSAibGlic2hpbmUiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlic3BlZXhkZWMuYyBiL2xpYmF2Y29kZWMvbGlic3BlZXhkZWMuYwppbmRleCAwNDQ4ODNhLi5kNjdjNjhjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYnNwZWV4ZGVjLmMKKysrIGIvbGliYXZjb2RlYy9saWJzcGVleGRlYy5jCkBAIC0yMDAsNCArMjAwLDUgQEAKICAgICAuZGVjb2RlICAgICAgICAgPSBsaWJzcGVleF9kZWNvZGVfZnJhbWUsCiAgICAgLmZsdXNoICAgICAgICAgID0gbGlic3BlZXhfZGVjb2RlX2ZsdXNoLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9TVUJGUkFNRVMgfCBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJzcGVleCIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJzcGVleGVuYy5jIGIvbGliYXZjb2RlYy9saWJzcGVleGVuYy5jCmluZGV4IDY1YTg0ZGMuLjZhMzdkYmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlic3BlZXhlbmMuYworKysgYi9saWJhdmNvZGVjL2xpYnNwZWV4ZW5jLmMKQEAgLTEyNSwxMCArMTI1LDEwIEBACiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiICBxdWFsaXR5OiAlZlxuIiwgcy0+dmJyX3F1YWxpdHkpOwogICAgIH0gZWxzZSBpZiAocy0+YWJyKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAicmF0ZSBjb250cm9sOiBBQlJcbiIpOwotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAgYml0cmF0ZTogJSJQUklkNjQiIGJwc1xuIiwgKGludDY0X3QpYXZjdHgtPmJpdF9yYXRlKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgIGJpdHJhdGU6ICUiUFJJZDY0IiBicHNcbiIsIGF2Y3R4LT5iaXRfcmF0ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJyYXRlIGNvbnRyb2w6IENCUlxuIik7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiICBiaXRyYXRlOiAlIlBSSWQ2NCIgYnBzXG4iLCAoaW50NjRfdClhdmN0eC0+Yml0X3JhdGUpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAgYml0cmF0ZTogJSJQUklkNjQiIGJwc1xuIiwgYXZjdHgtPmJpdF9yYXRlKTsKICAgICB9CiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJjb21wbGV4aXR5OiAlZFxuIiwKICAgICAgICAgICAgYXZjdHgtPmNvbXByZXNzaW9uX2xldmVsKTsKQEAgLTE1OSw5ICsxNTksOSBAQAogCiAgICAgLyogc2FtcGxlIHJhdGUgYW5kIGVuY29kaW5nIG1vZGUgKi8KICAgICBzd2l0Y2ggKGF2Y3R4LT5zYW1wbGVfcmF0ZSkgewotICAgIGNhc2UgIDgwMDA6IG1vZGUgPSAmc3BlZXhfbmJfbW9kZTsgIGJyZWFrOwotICAgIGNhc2UgMTYwMDA6IG1vZGUgPSAmc3BlZXhfd2JfbW9kZTsgIGJyZWFrOwotICAgIGNhc2UgMzIwMDA6IG1vZGUgPSAmc3BlZXhfdXdiX21vZGU7IGJyZWFrOworICAgIGNhc2UgIDgwMDA6IG1vZGUgPSBzcGVleF9saWJfZ2V0X21vZGUoU1BFRVhfTU9ERUlEX05CKTsgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6IG1vZGUgPSBzcGVleF9saWJfZ2V0X21vZGUoU1BFRVhfTU9ERUlEX1dCKTsgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6IG1vZGUgPSBzcGVleF9saWJfZ2V0X21vZGUoU1BFRVhfTU9ERUlEX1VXQik7IGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2FtcGxlIHJhdGUgb2YgJWQgSHogaXMgbm90IHN1cHBvcnRlZC4gIgogICAgICAgICAgICAgICAgIlJlc2FtcGxlIHRvIDgsIDE2LCBvciAzMiBrSHouXG4iLCBhdmN0eC0+c2FtcGxlX3JhdGUpOwpAQCAtMjE2LDcgKzIxNiw3IEBACiAgICAgaWYgKHMtPnZhZCkKICAgICAgICAgc3BlZXhfZW5jb2Rlcl9jdGwocy0+ZW5jX3N0YXRlLCBTUEVFWF9TRVRfVkFELCAmcy0+dmFkKTsKIAotICAgIC8qIEFjdGl2aXRpbmcgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gKi8KKyAgICAvKiBBY3RpdmF0aW5nIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uICovCiAgICAgaWYgKHMtPmR0eCkgewogICAgICAgICBzcGVleF9lbmNvZGVyX2N0bChzLT5lbmNfc3RhdGUsIFNQRUVYX1NFVF9EVFgsICZzLT5kdHgpOwogICAgICAgICBpZiAoIShzLT5hYnIgfHwgcy0+dmFkIHx8IHMtPmhlYWRlci52YnIpKQpAQCAtMzY1LDQgKzM2NSw1IEBACiAgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IChjb25zdCBpbnRbXSl7IDgwMDAsIDE2MDAwLCAzMjAwMCwgMCB9LAogICAgIC5wcml2X2NsYXNzICAgICA9ICZzcGVleF9jbGFzcywKICAgICAuZGVmYXVsdHMgICAgICAgPSBkZWZhdWx0cywKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGlic3BlZXgiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlidGhlb3JhZW5jLmMgYi9saWJhdmNvZGVjL2xpYnRoZW9yYWVuYy5jCmluZGV4IGM1ODFiMzQuLjE2OTY2ZWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlidGhlb3JhZW5jLmMKKysrIGIvbGliYXZjb2RlYy9saWJ0aGVvcmFlbmMuYwpAQCAtMjA4LDcgKzIwOCw5IEBACiAgICAgICAgIGF2X2xvZyhhdmNfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4X2ZtdFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQotICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y19jb250ZXh0LT5waXhfZm10LCAmaC0+dXZfaHNoaWZ0LCAmaC0+dXZfdnNoaWZ0KTsKKyAgICByZXQgPSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmNfY29udGV4dC0+cGl4X2ZtdCwgJmgtPnV2X2hzaGlmdCwgJmgtPnV2X3ZzaGlmdCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmIChhdmNfY29udGV4dC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FTQ0FMRSkgewogICAgICAgICAvKiBDbGlwIGdsb2JhbF9xdWFsaXR5IGluIFFQIHVuaXRzIHRvIHRoZSBbMCAtIDEwXSByYW5nZQpAQCAtMjUzLDcgKzI1NSw3IEBACiAgICAgICAgIE91dHB1dCBmaXJzdCBoZWFkZXIgcGFja2V0IGNvbnNpc3Rpbmcgb2YgdGhlb3JhCiAgICAgICAgIGhlYWRlciwgY29tbWVudCwgYW5kIHRhYmxlcy4KIAotICAgICAgICBFYWNoIG9uZSBpcyBwcmVmaXhlZCB3aXRoIGEgMTZiaXQgc2l6ZSwgdGhlbiB0aGV5CisgICAgICAgIEVhY2ggb25lIGlzIHByZWZpeGVkIHdpdGggYSAxNi1iaXQgc2l6ZSwgdGhlbiB0aGV5CiAgICAgICAgIGFyZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgaW50byBsaWJhdmNvZGVjJ3MgZXh0cmFkYXRhLgogICAgICovCiAgICAgb2Zmc2V0ID0gMDsKQEAgLTM4Myw0ICszODUsNSBAQAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfTk9ORQogICAgIH0sCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYnRoZW9yYSIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJ0d29sYW1lLmMgYi9saWJhdmNvZGVjL2xpYnR3b2xhbWUuYwppbmRleCAxMmQ3MWU3Li4wMzBmODg4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYnR3b2xhbWUuYworKysgYi9saWJhdmNvZGVjL2xpYnR3b2xhbWUuYwpAQCAtMjI2LDQgKzIyNiw1IEBACiAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCiAgICAgICAgIDAgfSwKICAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzID0gdHdvbGFtZV9zYW1wbGVyYXRlcywKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGlidHdvbGFtZSIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJ1dHZpZGVvLmggYi9saWJhdmNvZGVjL2xpYnV0dmlkZW8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMwMzA5Ny4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2xpYnV0dmlkZW8uaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiBEZXJlayBCdWl0ZW5odWlzCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZS4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLS8qKgotICogQGZpbGUKLSAqIEtub3duIEZPVVJDQ3M6Ci0gKiAgICAgJ1VMWTAnIChZQ2JDciA0OjI6MCksICdVTFkyJyAoWUNiQ3IgNDoyOjIpLCAnVUxSRycgKFJHQiksICdVTFJBJyAoUkdCQSksCi0gKiAgICAgJ1VMSDAnIChZQ2JDciA0OjI6MCBCVC43MDkpLCAnVUxIMicgKFlDYkNyIDQ6MjoyIEJULjcwOSkKLSAqLwotCi0jaWZuZGVmIEFWQ09ERUNfTElCVVRWSURFT19ICi0jZGVmaW5lIEFWQ09ERUNfTElCVVRWSURFT19ICi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDx1dHZpZGVvL3V0dmlkZW8uaD4KLSNpbmNsdWRlIDx1dHZpZGVvL0NvZGVjLmg+Ci0KLS8qCi0gKiBVdCBWaWRlbyB2ZXJzaW9uIDEyLjAuMCBjaGFuZ2VkIHRoZSBSR0IgZm9ybWF0IG5hbWVzIGFuZCByZW1vdmVkCi0gKiB0aGUgX1dJTiBuYW1lcywgc28gaWYgdGhlIG5ldyBuYW1lcyBhcmUgYWJzZW50LCBkZWZpbmUgdGhlbQotICogYWdhaW5zdCB0aGUgb2xkIG5hbWVzIHNvIGNvbXBhdGliaWxpdHkgd2l0aCBwcmUtdjEyIHZlcnNpb25zCi0gKiBpcyBtYWludGFpbmVkLgotICovCi0jaWYgIWRlZmluZWQoVVRWRl9ORkNDX0JHUl9CVSkKLSNkZWZpbmUgVVRWRl9ORkNDX0JHUl9CVSBVVFZGX1JHQjI0X1dJTgotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChVVFZGX05GQ0NfQkdSQV9CVSkKLSNkZWZpbmUgVVRWRl9ORkNDX0JHUkFfQlUgVVRWRl9SR0IzMl9XSU4KLSNlbmRpZgotCi0vKgotICogVXQgVmlkZW8gdmVyc2lvbiAxMy4wLjEgaW50cm9kdWNlZCBuZXcgQlQuNzA5IHZhcmlhbnRzLgotICogU3BlY2lhbC1jYXNlIHRoZXNlIGFuZCBvbmx5IHVzZSB0aGVtIGlmIHYxMyBpcyBkZXRlY3RlZC4KLSAqLwotI2lmIGRlZmluZWQoVVRWRl9IRFlDKQotI2RlZmluZSBVVFZfQlQ3MDkKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdWludDMyX3QgdmVyc2lvbjsKLSAgICB1aW50MzJfdCBvcmlnaW5hbF9mb3JtYXQ7Ci0gICAgdWludDMyX3QgZnJhbWVpbmZvX3NpemU7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci19IFV0VmlkZW9FeHRyYTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IEFWQ2xhc3MgKmM7Ci0gICAgQ0NvZGVjICpjb2RlYzsKLSAgICB1bnNpZ25lZCBpbnQgYnVmX3NpemU7Ci0gICAgdWludDhfdCAqYnVmZmVyOwotICAgIGludCBwcmVkOwotfSBVdFZpZGVvQ29udGV4dDsKLQotI2VuZGlmIC8qIEFWQ09ERUNfTElCVVRWSURFT19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYnV0dmlkZW9kZWMuY3BwIGIvbGliYXZjb2RlYy9saWJ1dHZpZGVvZGVjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2MGY0Zi4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2xpYnV0dmlkZW9kZWMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgRGVyZWsgQnVpdGVuaHVpcwotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247Ci0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSAqIEBmaWxlCi0gKiBLbm93biBGT1VSQ0NzOgotICogICAgICdVTFkwJyAoWUNiQ3IgNDoyOjApLCAnVUxZMicgKFlDYkNyIDQ6MjoyKSwgJ1VMUkcnIChSR0IpLCAnVUxSQScgKFJHQkEpLAotICogICAgICdVTEgwJyAoWUNiQ3IgNDoyOjAgQlQuNzA5KSwgJ1VMSDInIChZQ2JDciA0OjI6MiBCVC43MDkpCi0gKi8KLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotfQotCi0jaW5jbHVkZSAibGlidXR2aWRlby5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCi0KLXN0YXRpYyBhdl9jb2xkIGludCB1dHZpZGVvX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBVdFZpZGVvQ29udGV4dCAqdXR2ID0gKFV0VmlkZW9Db250ZXh0ICopYXZjdHgtPnByaXZfZGF0YTsKLSAgICBVdFZpZGVvRXh0cmEgaW5mbzsKLSAgICBpbnQgZm9ybWF0OwotICAgIGludCBiZWdpbl9yZXQ7Ci0KLSAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplICE9IDE2ICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSA4ICkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4dHJhZGF0YSBzaXplICglZCkgbWlzbWF0Y2guXG4iLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogUmVhZCBleHRyYWRhdGEgKi8KLSAgICBpbmZvLnZlcnNpb24gPSBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEpOwotICAgIGluZm8ub3JpZ2luYWxfZm9ybWF0ID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgNCk7Ci0gICAgaW5mby5mcmFtZWluZm9fc2l6ZSA9IEFWX1JMMzIoYXZjdHgtPmV4dHJhZGF0YSArIDgpOwotICAgIGluZm8uZmxhZ3MgPSBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEgKyAxMik7Ci0KLSAgICAvKiBQaWNrIGZvcm1hdCBiYXNlZCBvbiBGT1VSQ0MgKi8KLSAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY190YWcpIHsKLSNpZmRlZiBVVFZfQlQ3MDkKLSAgICBjYXNlIE1LVEFHKCdVJywgJ0wnLCAnSCcsICcwJyk6Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOwotICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDcwOTsKLSAgICAgICAgZm9ybWF0ID0gVVRWRl9ZVjEyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1LVEFHKCdVJywgJ0wnLCAnSCcsICcyJyk6Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVlWNDIyOwotICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDcwOTsKLSAgICAgICAgZm9ybWF0ID0gVVRWRl9ZVVkyOwotICAgICAgICBicmVhazsKLSNlbmRpZgotICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdZJywgJzAnKToKLSAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7Ci0gICAgICAgIGZvcm1hdCA9IFVUVkZfWVYxMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNS1RBRygnVScsICdMJywgJ1knLCAnMicpOgotICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVZVjQyMjsKLSAgICAgICAgZm9ybWF0ID0gVVRWRl9ZVVkyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1LVEFHKCdVJywgJ0wnLCAnUicsICdHJyk6Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKLSAgICAgICAgZm9ybWF0ID0gVVRWRl9ORkNDX0JHUl9CVTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNS1RBRygnVScsICdMJywgJ1InLCAnQScpOgotICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMzI7Ci0gICAgICAgIGZvcm1hdCA9IFVUVkZfTkZDQ19CR1JBX0JVOwotICAgICAgICBicmVhazsKLSNpZmRlZiBVVFZGX1VRWTIKLSAgICBjYXNlIE1LVEFHKCdVJywgJ1EnLCAnWScsICcyJyk6Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7Ci0gICAgICAgIGZvcm1hdCA9IFVUVkZfdjIxMDsKLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgIk5vdCBhIFV0IFZpZGVvIEZPVVJDQzogJVhcbiIsIGF2Y3R4LT5jb2RlY190YWcpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogT25seSBhbGxvY2F0ZSB0aGUgYnVmZmVyIG9uY2UgKi8KLSAgICB1dHYtPmJ1Zl9zaXplID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKGF2Y3R4LT5waXhfZm10LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDEpOwotI2lmZGVmIFVUVkZfVVFZMgotICAgIGlmIChmb3JtYXQgPT0gVVRWRl92MjEwKQotICAgICAgICB1dHYtPmJ1Zl9zaXplICs9IGF2Y3R4LT5oZWlnaHQgKiAoKGF2Y3R4LT53aWR0aCArIDQ3KSAvIDQ4KSAqIDEyODsgLy8gdGhlIGxpbmVzaXplIHVzZWQgYnkgdGhlIGRlY29kZXIsIHRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSBleHBvcnRlZAotI2VuZGlmCi0gICAgdXR2LT5idWZmZXIgPSAodWludDhfdCAqKWF2X21hbGxvYyh1dHYtPmJ1Zl9zaXplICogc2l6ZW9mKHVpbnQ4X3QpKTsKLQotICAgIGlmICh1dHYtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG91dHB1dCBidWZmZXIuXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBvdXRwdXQgZnJhbWUgKi8KLSAgICBhdmN0eC0+Y29kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotCi0gICAgLyogVXQgVmlkZW8gb25seSBzdXBwb3J0cyA4LWJpdCAqLwotICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gODsKLQotICAgIC8qIElzIGl0IGludGVybGFjZWQ/ICovCi0gICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID0gaW5mby5mbGFncyAmIDB4ODAwID8gMSA6IDA7Ci0KLSAgICAvKiBBcHBhcmVudGx5IFV0IFZpZGVvIGRvZXNuJ3Qgc3RvcmUgdGhpcyBpbmZvLi4uICovCi0gICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT50b3BfZmllbGRfZmlyc3QgPSAxOwotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgYSBVdCBWaWRlbyBpbnN0YW5jZS4gU2luY2UgdGhlIGZ1bmN0aW9uIHdhbnRzCi0gICAgICogYW4gImludGVyZmFjZSBuYW1lIiBzdHJpbmcsIHBhc3MgaXQgdGhlIG5hbWUgb2YgdGhlIGxpYi4KLSAgICAgKi8KLSAgICB1dHYtPmNvZGVjID0gQ0NvZGVjOjpDcmVhdGVJbnN0YW5jZShVTkZDQyhhdmN0eC0+Y29kZWNfdGFnKSwgImxpYmF2Y29kZWMiKTsKLQotICAgIC8qIEluaXRpYWxpemUgRGVjb2RpbmcgKi8KLSAgICBiZWdpbl9yZXQgPSB1dHYtPmNvZGVjLT5EZWNvZGVCZWdpbihmb3JtYXQsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkdST1NTV0lEVEhfV0lORE9XUywgJmluZm8sIHNpemVvZihVdFZpZGVvRXh0cmEpKTsKLQotICAgIC8qIENoZWNrIHRvIHNlZSBpZiB0aGUgZGVjb2RlciBpbml0bGl6ZWQgcHJvcGVybHkgKi8KLSAgICBpZiAoYmVnaW5fcmV0ICE9IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiQ291bGQgbm90IGluaXRpYWxpemUgZGVjb2RlcjogJWRcbiIsIGJlZ2luX3JldCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB1dHZpZGVvX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgVXRWaWRlb0NvbnRleHQgKnV0diA9IChVdFZpZGVvQ29udGV4dCAqKWF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZGcmFtZSAqcGljID0gYXZjdHgtPmNvZGVkX2ZyYW1lOwotICAgIGludCB3ID0gYXZjdHgtPndpZHRoLCBoID0gYXZjdHgtPmhlaWdodDsKLQotICAgIC8qIFNldCBmbGFncyAqLwotICAgIHBpYy0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7Ci0gICAgcGljLT5rZXlfZnJhbWUgPSAxOwotCi0gICAgLyogRGVjb2RlIHRoZSBmcmFtZSAqLwotICAgIHV0di0+Y29kZWMtPkRlY29kZUZyYW1lKHV0di0+YnVmZmVyLCBhdnBrdC0+ZGF0YSwgdHJ1ZSk7Ci0KLSAgICAvKiBTZXQgdGhlIG91dHB1dCBkYXRhIGRlcGVuZGluZyBvbiB0aGUgY29sb3JzcGFjZSAqLwotICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKLSAgICAgICAgcGljLT5saW5lc2l6ZVswXSA9IHc7Ci0gICAgICAgIHBpYy0+bGluZXNpemVbMV0gPSBwaWMtPmxpbmVzaXplWzJdID0gdyAvIDI7Ci0gICAgICAgIHBpYy0+ZGF0YVswXSA9IHV0di0+YnVmZmVyOwotICAgICAgICBwaWMtPmRhdGFbMl0gPSB1dHYtPmJ1ZmZlciArICh3ICogaCk7Ci0gICAgICAgIHBpYy0+ZGF0YVsxXSA9IHBpYy0+ZGF0YVsyXSArICh3ICogaCAvIDQpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVZVjQyMjoKLSAgICAgICAgcGljLT5saW5lc2l6ZVswXSA9IHcgKiAyOwotICAgICAgICBwaWMtPmRhdGFbMF0gPSB1dHYtPmJ1ZmZlcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDogewotICAgICAgICB1aW50MTZfdCAqeSwgKnUsICp2OwotICAgICAgICBpbnQgaSxqOwotICAgICAgICBpbnQgbGluZXNpemUgPSAoKHcgKyA0NykgLyA0OCkgKiAxMjg7Ci0KLSAgICAgICAgcGljLT5saW5lc2l6ZVswXSA9IHcgKiAyOwotICAgICAgICBwaWMtPmxpbmVzaXplWzFdID0KLSAgICAgICAgcGljLT5saW5lc2l6ZVsyXSA9IHc7Ci0gICAgICAgIHBpYy0+ZGF0YVswXSA9IHV0di0+YnVmZmVyICsgbGluZXNpemUgKiBoOwotICAgICAgICBwaWMtPmRhdGFbMV0gPSBwaWMtPmRhdGFbMF0gKyBoKnBpYy0+bGluZXNpemVbMF07Ci0gICAgICAgIHBpYy0+ZGF0YVsyXSA9IHBpYy0+ZGF0YVsxXSArIGgqcGljLT5saW5lc2l6ZVsxXTsKLSAgICAgICAgeSA9ICh1aW50MTZfdCopcGljLT5kYXRhWzBdOwotICAgICAgICB1ID0gKHVpbnQxNl90KilwaWMtPmRhdGFbMV07Ci0gICAgICAgIHYgPSAodWludDE2X3QqKXBpYy0+ZGF0YVsyXTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgewotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW4gPSB1dHYtPmJ1ZmZlciArIGogKiBsaW5lc2l6ZTsKLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSArIDEgPCB3OyBpICs9IDYsIGluICs9IDQpIHsKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBhLGI7Ci0gICAgICAgICAgICAgICAgYSA9IEFWX1JMMzIoaW4pOwotICAgICAgICAgICAgICAgIGluICs9IDQ7Ci0gICAgICAgICAgICAgICAgYiA9IEFWX1JMMzIoaW4pOwotICAgICAgICAgICAgICAgICp1KysgPSAoYSAgICApICYgMHgzRkY7Ci0gICAgICAgICAgICAgICAgKnkrKyA9IChhPj4xMCkgJiAweDNGRjsKLSAgICAgICAgICAgICAgICAqdisrID0gKGE+PjIwKSAmIDB4M0ZGOwotICAgICAgICAgICAgICAgICp5KysgPSAoYiAgICApICYgMHgzRkY7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaSArIDMgPj0gdykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBpbiArPSA0OwotICAgICAgICAgICAgICAgIGEgPSBBVl9STDMyKGluKTsKLSAgICAgICAgICAgICAgICAqdSsrID0gKGI+PjEwKSAmIDB4M0ZGOwotICAgICAgICAgICAgICAgICp5KysgPSAoYj4+MjApICYgMHgzRkY7Ci0gICAgICAgICAgICAgICAgKnYrKyA9IChhICAgICkgJiAweDNGRjsKLSAgICAgICAgICAgICAgICAqeSsrID0gKGE+PjEwKSAmIDB4M0ZGOwotCi0gICAgICAgICAgICAgICAgaWYgKGkgKyA1ID49IHcpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgaW4gKz0gNDsKLSAgICAgICAgICAgICAgICBiID0gQVZfUkwzMihpbik7Ci0gICAgICAgICAgICAgICAgKnUrKyA9IChhPj4yMCkgJiAweDNGRjsKLSAgICAgICAgICAgICAgICAqeSsrID0gKGIgICAgKSAmIDB4M0ZGOwotICAgICAgICAgICAgICAgICp2KysgPSAoYj4+MTApICYgMHgzRkY7Ci0gICAgICAgICAgICAgICAgKnkrKyA9IChiPj4yMCkgJiAweDNGRjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgotICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKLSAgICAgICAgLyogTWFrZSB0aGUgbGluZXNpemUgbmVnYXRpdmUsIHNpbmNlIFV0IFZpZGVvIHVzZXMgYm90dG9tLXVwIEJHUiAqLwotICAgICAgICBwaWMtPmxpbmVzaXplWzBdID0gLTEgKiB3ICogKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMjQgPyAzIDogNCk7Ci0gICAgICAgIHBpYy0+ZGF0YVswXSA9IHV0di0+YnVmZmVyICsgdXR2LT5idWZfc2l6ZSArIHBpYy0+bGluZXNpemVbMF07Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgICpnb3RfZnJhbWUgPSAxOwotICAgIGF2X2ZyYW1lX21vdmVfcmVmKChBVkZyYW1lKilkYXRhLCBwaWMpOwotCi0gICAgcmV0dXJuIGF2cGt0LT5zaXplOwotfQotCi1zdGF0aWMgYXZfY29sZCBpbnQgdXR2aWRlb19kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIFV0VmlkZW9Db250ZXh0ICp1dHYgPSAoVXRWaWRlb0NvbnRleHQgKilhdmN0eC0+cHJpdl9kYXRhOwotCi0gICAgLyogRnJlZSBvdXRwdXQgKi8KLSAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOwotICAgIGF2X2ZyZWVwKCZ1dHYtPmJ1ZmZlcik7Ci0KLSAgICAvKiBGaW5pc2ggZGVjb2RpbmcgYW5kIGNsZWFuIHVwIHRoZSBpbnN0YW5jZSAqLwotICAgIHV0di0+Y29kZWMtPkRlY29kZUVuZCgpOwotICAgIENDb2RlYzo6RGVsZXRlSW5zdGFuY2UodXR2LT5jb2RlYyk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotQVZDb2RlYyBmZl9saWJ1dHZpZGVvX2RlY29kZXIgPSB7Ci0gICAgImxpYnV0dmlkZW8iLAotICAgIE5VTExfSUZfQ09ORklHX1NNQUxMKCJVdCBWaWRlbyIpLAotICAgIEFWTUVESUFfVFlQRV9WSURFTywKLSAgICBBVl9DT0RFQ19JRF9VVFZJREVPLAotICAgIDAsICAgIC8vY2FwYWJpbGl0aWVzCi0gICAgTlVMTCwgLy9zdXBwb3J0ZWRfZnJhbWVyYXRlcwotICAgIE5VTEwsIC8vcGl4X2ZtdHMKLSAgICBOVUxMLCAvL3N1cHBvcnRlZF9zYW1wbGVyYXRlcwotICAgIE5VTEwsIC8vc2FtcGxlX2ZtdHMKLSAgICBOVUxMLCAvL2NoYW5uZWxfbGF5b3V0cwotICAgIDAsICAgIC8vbWF4X2xvd3JlcwotICAgIE5VTEwsIC8vcHJpdl9jbGFzcwotICAgIE5VTEwsIC8vcHJvZmlsZXMKLSAgICBzaXplb2YoVXRWaWRlb0NvbnRleHQpLAotICAgIE5VTEwsIC8vbmV4dAotICAgIE5VTEwsIC8vaW5pdF90aHJlYWRfY29weQotICAgIE5VTEwsIC8vdXBkYXRlX3RocmVhZF9jb250ZXh0Ci0gICAgTlVMTCwgLy9kZWZhdWx0cwotICAgIE5VTEwsIC8vaW5pdF9zdGF0aWNfZGF0YQotICAgIHV0dmlkZW9fZGVjb2RlX2luaXQsCi0gICAgTlVMTCwgLy9lbmNvZGUKLSAgICBOVUxMLCAvL2VuY29kZTIKLSAgICB1dHZpZGVvX2RlY29kZV9mcmFtZSwKLSAgICB1dHZpZGVvX2RlY29kZV9jbG9zZSwKLX07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYnV0dmlkZW9lbmMuY3BwIGIvbGliYXZjb2RlYy9saWJ1dHZpZGVvZW5jLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkZmVmOS4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL2xpYnV0dmlkZW9lbmMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTIgRGVyZWsgQnVpdGVuaHVpcwotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247Ci0gKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSAqIEBmaWxlCi0gKiBLbm93biBGT1VSQ0NzOgotICogICAgICdVTFkwJyAoWUNiQ3IgNDoyOjApLCAnVUxZMicgKFlDYkNyIDQ6MjoyKSwgJ1VMUkcnIChSR0IpLCAnVUxSQScgKFJHQkEpLAotICogICAgICdVTEgwJyAoWUNiQ3IgNDoyOjAgQlQuNzA5KSwgJ1VMSDInIChZQ2JDciA0OjI6MiBCVC43MDkpCi0gKi8KLQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotfQotCi0jaW5jbHVkZSAibGlidXR2aWRlby5oIgotI2luY2x1ZGUgInB1dF9iaXRzLmgiCi0KLXN0YXRpYyBhdl9jb2xkIGludCB1dHZpZGVvX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBVdFZpZGVvQ29udGV4dCAqdXR2ID0gKFV0VmlkZW9Db250ZXh0ICopYXZjdHgtPnByaXZfZGF0YTsKLSAgICBVdFZpZGVvRXh0cmEgKmluZm87Ci0gICAgdWludDMyX3QgZmxhZ3MsIGluX2Zvcm1hdDsKLSAgICBpbnQgcmV0OwotCi0gICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgewotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgotICAgICAgICBpbl9mb3JtYXQgPSBVVFZGX1lWMTI7Ci0gICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxMjsKLSAgICAgICAgaWYgKGF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19CVDcwOSkKLSAgICAgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ0gnLCAnMCcpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ1UnLCAnTCcsICdZJywgJzAnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVWVY0MjI6Ci0gICAgICAgIGluX2Zvcm1hdCA9IFVUVkZfWVVZVjsKLSAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OwotICAgICAgICBpZiAoYXZjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX0JUNzA5KQotICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnSCcsICcyJyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ1knLCAnMicpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6Ci0gICAgICAgIGluX2Zvcm1hdCA9IFVUVkZfTkZDQ19CR1JfQlU7Ci0gICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKLSAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnUicsICdHJyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKLSAgICAgICAgaW5fZm9ybWF0ID0gVVRWRl9ORkNDX0JHUkFfQlU7Ci0gICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAzMjsKLSAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnUicsICdBJyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotCi0jaWYgRkZfQVBJX1BSSVZBVEVfT1BUCi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgaWYgKGF2Y3R4LT5wcmVkaWN0aW9uX21ldGhvZCkKLSAgICAgICAgdXR2LT5wcmVkID0gYXZjdHgtPnByZWRpY3Rpb25fbWV0aG9kOwotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKLQotICAgIC8qIENoZWNrIGJlZm9yZSB3ZSBhbGxvYyBhbnl0aGluZyAqLwotICAgIGlmICh1dHYtPnByZWQgIT0gMCAmJiB1dHYtPnByZWQgIT0gMikgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcHJlZGljdGlvbiBtZXRob2QuXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICBmbGFncyA9ICgodXR2LT5wcmVkICsgMSkgPDwgOCkgfCAoYXZjdHgtPnRocmVhZF9jb3VudCAtIDEpOwotCi0gICAgYXZjdHgtPnByaXZfZGF0YSA9IHV0djsKLQotICAgIC8qIEFsbG9jIGV4dHJhZGF0YSBidWZmZXIgKi8KLSAgICBpbmZvID0gKFV0VmlkZW9FeHRyYSAqKWF2X21hbGxvYyhzaXplb2YoKmluZm8pKTsKLQotICAgIGlmICghaW5mbykgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBleHRyYWRhdGEgYnVmZmVyLlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBXZSB1c2UgdGhpcyBidWZmZXIgdG8gaG9sZCB0aGUgZGF0YSB0aGF0IFV0IFZpZGVvIHJldHVybnMsCi0gICAgICogc2luY2Ugd2UgY2Fubm90IGRlY29kZSBwbGFuZXMgc2VwYXJhdGVseSB3aXRoIGl0LgotICAgICAqLwotICAgIHJldCA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShhdmN0eC0+cGl4X2ZtdCwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAxKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9mcmVlKGluZm8pOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICB1dHYtPmJ1Zl9zaXplID0gcmV0OwotCi0gICAgdXR2LT5idWZmZXIgPSAodWludDhfdCAqKWF2X21hbGxvYyh1dHYtPmJ1Zl9zaXplKTsKLQotICAgIGlmICh1dHYtPmJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIG91dHB1dCBidWZmZXIuXG4iKTsKLSAgICAgICAgYXZfZnJlZShpbmZvKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENyZWF0ZSBhIFV0IFZpZGVvIGluc3RhbmNlLiBTaW5jZSB0aGUgZnVuY3Rpb24gd2FudHMKLSAgICAgKiBhbiAiaW50ZXJmYWNlIG5hbWUiIHN0cmluZywgcGFzcyBpdCB0aGUgbmFtZSBvZiB0aGUgbGliLgotICAgICAqLwotICAgIHV0di0+Y29kZWMgPSBDQ29kZWM6OkNyZWF0ZUluc3RhbmNlKFVORkNDKGF2Y3R4LT5jb2RlY190YWcpLCAibGliYXZjb2RlYyIpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBlbmNvZGVyICovCi0gICAgdXR2LT5jb2RlYy0+RW5jb2RlQmVnaW4oaW5fZm9ybWF0LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JHUk9TU1dJRFRIX1dJTkRPV1MpOwotCi0gICAgLyogR2V0IGV4dHJhZGF0YSBmcm9tIGVuY29kZXIgKi8KLSAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSB1dHYtPmNvZGVjLT5FbmNvZGVHZXRFeHRyYURhdGFTaXplKCk7Ci0gICAgdXR2LT5jb2RlYy0+RW5jb2RlR2V0RXh0cmFEYXRhKGluZm8sIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSwgaW5fZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCR1JPU1NXSURUSF9XSU5ET1dTKTsKLSAgICBhdmN0eC0+ZXh0cmFkYXRhID0gKHVpbnQ4X3QgKilpbmZvOwotCi0gICAgLyogU2V0IGZsYWdzICovCi0gICAgdXR2LT5jb2RlYy0+U2V0U3RhdGUoJmZsYWdzLCBzaXplb2YoZmxhZ3MpKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHV0dmlkZW9fZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljLCBpbnQgKmdvdF9wYWNrZXQpCi17Ci0gICAgVXRWaWRlb0NvbnRleHQgKnV0diA9IChVdFZpZGVvQ29udGV4dCAqKWF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IHcgPSBhdmN0eC0+d2lkdGgsIGggPSBhdmN0eC0+aGVpZ2h0OwotICAgIGludCByZXQsIHJnYl9zaXplLCBpOwotICAgIGJvb2wga2V5ZnJhbWU7Ci0gICAgdWludDhfdCAqeSwgKnUsICp2OwotICAgIHVpbnQ4X3QgKmRzdDsKLQotICAgIC8qIEFsbG9jIGJ1ZmZlciAqLwotICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCB1dHYtPmJ1Zl9zaXplLCAwKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgZHN0ID0gcGt0LT5kYXRhOwotCi0gICAgLyogTW92ZSBpbnB1dCBpZiBuZWVkZWQgZGF0YSBpbnRvIFV0IFZpZGVvIGZyaWVuZGx5IGJ1ZmZlciAqLwotICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKLSAgICAgICAgeSA9IHV0di0+YnVmZmVyOwotICAgICAgICB1ID0geSArIHcgKiBoOwotICAgICAgICB2ID0gdSArIHcgKiBoIC8gNDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewotICAgICAgICAgICAgbWVtY3B5KHksIHBpYy0+ZGF0YVswXSArIGkgKiBwaWMtPmxpbmVzaXplWzBdLCB3KTsKLSAgICAgICAgICAgIHkgKz0gdzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaCAvIDI7IGkrKykgewotICAgICAgICAgICAgbWVtY3B5KHUsIHBpYy0+ZGF0YVsyXSArIGkgKiBwaWMtPmxpbmVzaXplWzJdLCB3ID4+IDEpOwotICAgICAgICAgICAgbWVtY3B5KHYsIHBpYy0+ZGF0YVsxXSArIGkgKiBwaWMtPmxpbmVzaXplWzFdLCB3ID4+IDEpOwotICAgICAgICAgICAgdSArPSB3ID4+IDE7Ci0gICAgICAgICAgICB2ICs9IHcgPj4gMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVZVjQyMjoKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKLSAgICAgICAgICAgIG1lbWNweSh1dHYtPmJ1ZmZlciArIGkgKiAodyA8PCAxKSwKLSAgICAgICAgICAgICAgICAgICBwaWMtPmRhdGFbMF0gKyBpICogcGljLT5saW5lc2l6ZVswXSwgdyA8PCAxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OgotICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKLSAgICAgICAgLyogVXQgVmlkZW8gdGFrZXMgYm90dG9tLXVwIEJHUiAqLwotICAgICAgICByZ2Jfc2l6ZSA9IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMjQgPyAzIDogNDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKLSAgICAgICAgICAgIG1lbWNweSh1dHYtPmJ1ZmZlciArIChoIC0gaSAtIDEpICogdyAqIHJnYl9zaXplLAotICAgICAgICAgICAgICAgICAgIHBpYy0+ZGF0YVswXSArIGkgKiBwaWMtPmxpbmVzaXplWzBdLAotICAgICAgICAgICAgICAgICAgIHcgKiByZ2Jfc2l6ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotCi0gICAgLyogRW5jb2RlIGZyYW1lICovCi0gICAgcGt0LT5zaXplID0gdXR2LT5jb2RlYy0+RW5jb2RlRnJhbWUoZHN0LCAma2V5ZnJhbWUsIHV0di0+YnVmZmVyKTsKLQotICAgIGlmICghcGt0LT5zaXplKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRW5jb2RlRnJhbWUgZmFpbGVkIVxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVXQgVmlkZW8gaXMgaW50cmEtb25seSBhbmQgZXZlcnkgZnJhbWUgaXMgYSBrZXlmcmFtZSwKLSAgICAgKiBhbmQgdGhlIEFQSSBhbHdheXMgcmV0dXJucyB0cnVlLiBJbiBjYXNlIHNvbWV0aGluZwotICAgICAqIGR1cmFzdGljIGNoYW5nZXMgaW4gdGhlIGZ1dHVyZSwgc3VjaCBhcyBpbnRlciBzdXBwb3J0LAotICAgICAqIGFzc2VydCB0aGF0IHRoaXMgaXMgdHJ1ZS4KLSAgICAgKi8KLSAgICBhdl9hc3NlcnQyKGtleWZyYW1lID09IHRydWUpOwotCi0gICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7Ci0gICAgKmdvdF9wYWNrZXQgPSAxOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXZfY29sZCBpbnQgdXR2aWRlb19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIFV0VmlkZW9Db250ZXh0ICp1dHYgPSAoVXRWaWRlb0NvbnRleHQgKilhdmN0eC0+cHJpdl9kYXRhOwotCi0gICAgYXZfZnJlZXAoJmF2Y3R4LT5leHRyYWRhdGEpOwotICAgIGF2X2ZyZWVwKCZ1dHYtPmJ1ZmZlcik7Ci0KLSAgICB1dHYtPmNvZGVjLT5FbmNvZGVFbmQoKTsKLSAgICBDQ29kZWM6OkRlbGV0ZUluc3RhbmNlKHV0di0+Y29kZWMpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFV0VmlkZW9Db250ZXh0LCB4KQotI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewotICAgIHsgInByZWQiLCAiUHJlZGljdGlvbiBtZXRob2QiLCBPRkZTRVQocHJlZCksIEFWX09QVF9UWVBFX0lOVCwgMCwgMCwgMiwgVkUsICJwcmVkIiB9LAotICAgIHsgImxlZnQiLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAwLCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgInByZWQiIH0sCi0gICAgeyAibWVkaWFuIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgMiwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJwcmVkIiB9LAotICAgIHsgTlVMTCB9LAotfTsKLQotc3RhdGljIGNvbnN0IEFWQ2xhc3MgdXR2aWRlb19jbGFzcyA9IHsKLSAgICAibGlidXR2aWRlbyIsCi0gICAgYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgb3B0aW9ucywKLSAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi0gICAgMCwKLSAgICAwLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBBVl9DTEFTU19DQVRFR09SWV9OQSwKLSAgICBOVUxMLAotICAgIE5VTEwsCi19OwotCi1BVkNvZGVjIGZmX2xpYnV0dmlkZW9fZW5jb2RlciA9IHsKLSAgICAibGlidXR2aWRlbyIsCi0gICAgTlVMTF9JRl9DT05GSUdfU01BTEwoIlV0IFZpZGVvIiksCi0gICAgQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIEFWX0NPREVDX0lEX1VUVklERU8sCi0gICAgQVZfQ09ERUNfQ0FQX0FVVE9fVEhSRUFEUyB8IEFWX0NPREVDX0NBUF9MT1NTTEVTUyB8IEFWX0NPREVDX0NBUF9JTlRSQV9PTkxZLAotICAgIE5VTEwsIC8qIHN1cHBvcnRlZF9mcmFtZXJhdGVzICovCi0gICAgKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7Ci0gICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVlWNDIyLCBBVl9QSVhfRk1UX0JHUjI0LAotICAgICAgICBBVl9QSVhfRk1UX1JHQjMyLCBBVl9QSVhfRk1UX05PTkUKLSAgICB9LAotICAgIE5VTEwsIC8qIHN1cHBvcnRlZF9zYW1wbGVyYXRlcyAqLwotICAgIE5VTEwsIC8qIHNhbXBsZV9mbXRzICovCi0gICAgTlVMTCwgLyogY2hhbm5lbF9sYXlvdXRzICovCi0gICAgMCwgICAgLyogbWF4X2xvd3JlcyAqLwotICAgICZ1dHZpZGVvX2NsYXNzLCAvKiBwcml2X2NsYXNzICovCi0gICAgTlVMTCwgLyogcHJvZmlsZXMgKi8KLSAgICBzaXplb2YoVXRWaWRlb0NvbnRleHQpLAotICAgIE5VTEwsIC8qIG5leHQgKi8KLSAgICBOVUxMLCAvKiBpbml0X3RocmVhZF9jb3B5ICovCi0gICAgTlVMTCwgLyogdXBkYXRlX3RocmVhZF9jb250ZXh0ICovCi0gICAgTlVMTCwgLyogZGVmYXVsdHMgKi8KLSAgICBOVUxMLCAvKiBpbml0X3N0YXRpY19kYXRhICovCi0gICAgdXR2aWRlb19lbmNvZGVfaW5pdCwKLSAgICBOVUxMLCAvKiBlbmNvZGUgKi8KLSAgICB1dHZpZGVvX2VuY29kZV9mcmFtZSwKLSAgICBOVUxMLCAvKiBkZWNvZGUgKi8KLSAgICB1dHZpZGVvX2VuY29kZV9jbG9zZSwKLSAgICBOVUxMLCAvKiBmbHVzaCAqLwotfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlidm8tYW1yd2JlbmMuYyBiL2xpYmF2Y29kZWMvbGlidm8tYW1yd2JlbmMuYwppbmRleCA5MmZhMTg1Li43N2QwY2NlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYnZvLWFtcndiZW5jLmMKKysrIGIvbGliYXZjb2RlYy9saWJ2by1hbXJ3YmVuYy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIEFNUiBBdWRpbyBlbmNvZGVyIHN0dWIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtNDYsMTIgKzQ2LDE1IEBACiB9OwogCiBzdGF0aWMgY29uc3QgQVZDbGFzcyBhbXJ3Yl9jbGFzcyA9IHsKLSAgICAibGlidm9fYW1yd2JlbmMiLCBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgb3B0aW9ucywgTElCQVZVVElMX1ZFUlNJT05fSU5UCisgICAgLmNsYXNzX25hbWUgPSAibGlidm9fYW1yd2JlbmMiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAogc3RhdGljIGludCBnZXRfd2JfYml0cmF0ZV9tb2RlKGludCBiaXRyYXRlLCB2b2lkICpsb2dfY3R4KQogewotICAgIC8qIG1ha2UgdGhlIGNvcnJlc3BvbmRhbmNlIGJldHdlZW4gYml0cmF0ZSBhbmQgbW9kZSAqLworICAgIC8qIG1ha2UgdGhlIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gYml0cmF0ZSBhbmQgbW9kZSAqLwogICAgIHN0YXRpYyBjb25zdCBpbnQgcmF0ZXNbXSA9IHsgIDY2MDAsICA4ODUwLCAxMjY1MCwgMTQyNTAsIDE1ODUwLCAxODI1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5ODUwLCAyMzA1MCwgMjM4NTAgfTsKICAgICBpbnQgaSwgYmVzdCA9IC0xLCBtaW5fZGlmZiA9IDA7CkBAIC0xNDksNCArMTUyLDUgQEAKICAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKXsgQVZfU0FNUExFX0ZNVF9TMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAogICAgIC5wcml2X2NsYXNzICAgICA9ICZhbXJ3Yl9jbGFzcywKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibGlidm9fYW1yd2JlbmMiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlidm9yYmlzZW5jLmMgYi9saWJhdmNvZGVjL2xpYnZvcmJpc2VuYy5jCmluZGV4IDNjYTViNTUuLmY3OGY4NzIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlidm9yYmlzZW5jLmMKKysrIGIvbGliYXZjb2RlYy9saWJ2b3JiaXNlbmMuYwpAQCAtMzc3LDQgKzM3Nyw1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKICAgICAucHJpdl9jbGFzcyAgICAgPSAmdm9yYmlzX2NsYXNzLAogICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJ2b3JiaXMiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlidnB4LmMgYi9saWJhdmNvZGVjL2xpYnZweC5jCmluZGV4IGE2MGQxODYuLmNjMDU1YTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlidnB4LmMKKysrIGIvbGliYXZjb2RlYy9saWJ2cHguYwpAQCAtMjksMTA4ICsyOSw1MiBAQAogCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHZwOV9waXhfZm10c19kZWZbXSA9IHsKICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKICAgICBBVl9QSVhfRk1UX05PTkUKIH07CiAKICNpZiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHZwOV9waXhfZm10c19oaWdoY29sW10gPSB7CiAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAogICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwKICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgQVZfUElYX0ZNVF9HQlJQLAogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKIAogc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCB2cDlfcGl4X2ZtdHNfaGlnaGJkW10gPSB7CiAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAogICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwKICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCi0gICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRSwKLSAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMExFLAotICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwTEUsCi0gICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTBMRSwKLSAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMkxFLAotICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEyTEUsCi0gICAgQVZfUElYX0ZNVF9ZVVY0NDBQMTJMRSwKLSAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMkxFLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyLAorICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEyLAorICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEyLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAorICAgIEFWX1BJWF9GTVRfR0JSUCwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMiwKICAgICBBVl9QSVhfRk1UX05PTkUKIH07CiAjZW5kaWYKIAogYXZfY29sZCB2b2lkIGZmX3ZwOV9pbml0X3N0YXRpYyhBVkNvZGVjICpjb2RlYykKIHsKLSAgICBpZiAoICAgIHZweF9jb2RlY192ZXJzaW9uX21ham9yKCkgPCAxCi0gICAgICAgIHx8ICh2cHhfY29kZWNfdmVyc2lvbl9tYWpvcigpID09IDEgJiYgdnB4X2NvZGVjX3ZlcnNpb25fbWlub3IoKSA8IDMpKQotICAgICAgICBjb2RlYy0+Y2FwYWJpbGl0aWVzIHw9IEFWX0NPREVDX0NBUF9FWFBFUklNRU5UQUw7CiAgICAgY29kZWMtPnBpeF9mbXRzID0gdnA5X3BpeF9mbXRzX2RlZjsKICNpZiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSCi0gICAgaWYgKCAgICB2cHhfY29kZWNfdmVyc2lvbl9tYWpvcigpID4gMQotICAgICAgICB8fCAodnB4X2NvZGVjX3ZlcnNpb25fbWFqb3IoKSA9PSAxICYmIHZweF9jb2RlY192ZXJzaW9uX21pbm9yKCkgPj0gNCkpIHsKLSNpZmRlZiBWUFhfQ09ERUNfQ0FQX0hJR0hCSVRERVBUSAorICAgIHsKICAgICAgICAgdnB4X2NvZGVjX2NhcHNfdCBjb2RlY19jYXBzID0gdnB4X2NvZGVjX2dldF9jYXBzKHZweF9jb2RlY192cDlfY3goKSk7CiAgICAgICAgIGlmIChjb2RlY19jYXBzICYgVlBYX0NPREVDX0NBUF9ISUdIQklUREVQVEgpCiAgICAgICAgICAgICBjb2RlYy0+cGl4X2ZtdHMgPSB2cDlfcGl4X2ZtdHNfaGlnaGJkOwogICAgICAgICBlbHNlCi0jZW5kaWYKICAgICAgICAgICAgIGNvZGVjLT5waXhfZm10cyA9IHZwOV9waXhfZm10c19oaWdoY29sOwogICAgIH0KICNlbmRpZgogfQotI2lmIDAKLWVudW0gQVZQaXhlbEZvcm1hdCBmZl92cHhfaW1nZm10X3RvX3BpeGZtdCh2cHhfaW1nX2ZtdF90IGltZykKLXsKLSAgICBzd2l0Y2ggKGltZykgewotICAgIGNhc2UgVlBYX0lNR19GTVRfUkdCMjQ6ICAgICByZXR1cm4gQVZfUElYX0ZNVF9SR0IyNDsKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjU2NTogICAgcmV0dXJuIEFWX1BJWF9GTVRfUkdCNTY1QkU7Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9SR0I1NTU6ICAgIHJldHVybiBBVl9QSVhfRk1UX1JHQjU1NUJFOwotICAgIGNhc2UgVlBYX0lNR19GTVRfVVlWWTogICAgICByZXR1cm4gQVZfUElYX0ZNVF9VWVZZNDIyOwotICAgIGNhc2UgVlBYX0lNR19GTVRfWVVZMjogICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVlWNDIyOwotICAgIGNhc2UgVlBYX0lNR19GTVRfWVZZVTogICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVllVNDIyOwotICAgIGNhc2UgVlBYX0lNR19GTVRfQkdSMjQ6ICAgICByZXR1cm4gQVZfUElYX0ZNVF9CR1IyNDsKLSAgICBjYXNlIFZQWF9JTUdfRk1UX0FSR0I6ICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfQVJHQjsKLSAgICBjYXNlIFZQWF9JTUdfRk1UX0FSR0JfTEU6ICAgcmV0dXJuIEFWX1BJWF9GTVRfQkdSQTsKLSAgICBjYXNlIFZQWF9JTUdfRk1UX1JHQjU2NV9MRTogcmV0dXJuIEFWX1BJWF9GTVRfUkdCNTY1TEU7Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9SR0I1NTVfTEU6IHJldHVybiBBVl9QSVhfRk1UX1JHQjU1NUxFOwotICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMDogICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVY0MjBQOwotICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMjogICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVY0MjJQOwotICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDogICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVY0NDRQOwotICAgIGNhc2UgVlBYX0lNR19GTVRfNDQ0QTogICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVZBNDQ0UDsKLSNpZiBWUFhfSU1BR0VfQUJJX1ZFUlNJT04gPj0gMwotICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0MDogICAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVY0NDBQOwotICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMDE2OiAgICByZXR1cm4gQVZfUElYX0ZNVF9ZVVY0MjBQMTZCRTsKLSAgICBjYXNlIFZQWF9JTUdfRk1UX0k0MjIxNjogICAgcmV0dXJuIEFWX1BJWF9GTVRfWVVWNDIyUDE2QkU7Ci0gICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDQ0MTY6ICAgIHJldHVybiBBVl9QSVhfRk1UX1lVVjQ0NFAxNkJFOwotI2VuZGlmCi0gICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7Ci0gICAgfQotfQotCi12cHhfaW1nX2ZtdF90IGZmX3ZweF9waXhmbXRfdG9faW1nZm10KGVudW0gQVZQaXhlbEZvcm1hdCBwaXgpCi17Ci0gICAgc3dpdGNoIChwaXgpIHsKLSAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6ICAgICAgICByZXR1cm4gVlBYX0lNR19GTVRfUkdCMjQ7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1JHQjU2NUJFOiAgICAgcmV0dXJuIFZQWF9JTUdfRk1UX1JHQjU2NTsKLSAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTU1QkU6ICAgICByZXR1cm4gVlBYX0lNR19GTVRfUkdCNTU1OwotICAgIGNhc2UgQVZfUElYX0ZNVF9VWVZZNDIyOiAgICAgIHJldHVybiBWUFhfSU1HX0ZNVF9VWVZZOwotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOiAgICAgIHJldHVybiBWUFhfSU1HX0ZNVF9ZVVkyOwotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVllVNDIyOiAgICAgIHJldHVybiBWUFhfSU1HX0ZNVF9ZVllVOwotICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IyNDogICAgICAgIHJldHVybiBWUFhfSU1HX0ZNVF9CR1IyNDsKLSAgICBjYXNlIEFWX1BJWF9GTVRfQVJHQjogICAgICAgICByZXR1cm4gVlBYX0lNR19GTVRfQVJHQjsKLSAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTogICAgICAgICByZXR1cm4gVlBYX0lNR19GTVRfQVJHQl9MRTsKLSAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNTY1TEU6ICAgICByZXR1cm4gVlBYX0lNR19GTVRfUkdCNTY1X0xFOwotICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I1NTVMRTogICAgIHJldHVybiBWUFhfSU1HX0ZNVF9SR0I1NTVfTEU7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6ICAgICAgcmV0dXJuIFZQWF9JTUdfRk1UX0k0MjA7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6ICAgICAgcmV0dXJuIFZQWF9JTUdfRk1UX0k0MjI7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6ICAgICAgcmV0dXJuIFZQWF9JTUdfRk1UX0k0NDQ7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOiAgICAgcmV0dXJuIFZQWF9JTUdfRk1UXzQ0NEE7Ci0jaWYgVlBYX0lNQUdFX0FCSV9WRVJTSU9OID49IDMKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDogICAgICByZXR1cm4gVlBYX0lNR19GTVRfSTQ0MDsKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2QkU6ICByZXR1cm4gVlBYX0lNR19GTVRfSTQyMDE2OwotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTZCRTogIHJldHVybiBWUFhfSU1HX0ZNVF9JNDIyMTY7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNkJFOiAgcmV0dXJuIFZQWF9JTUdfRk1UX0k0NDQxNjsKLSNlbmRpZgotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBWUFhfSU1HX0ZNVF9OT05FOwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJ2cHhkZWMuYyBiL2xpYmF2Y29kZWMvbGlidnB4ZGVjLmMKaW5kZXggYjUxYmZhMi4uMDRmMjdkMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJ2cHhkZWMuYworKysgYi9saWJhdmNvZGVjL2xpYnZweGRlYy5jCkBAIC0yMCw3ICsyMCw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIFZQOCBkZWNvZGVyIHN1cHBvcnQgdmlhIGxpYnZweAorICogVlA4LzkgZGVjb2RlciBzdXBwb3J0IHZpYSBsaWJ2cHgKICAqLwogCiAjZGVmaW5lIFZQWF9DT0RFQ19ESVNBQkxFX0NPTVBBVCAxCkBAIC0yOSwxOSArMjksMjMgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibGlidnB4LmgiCiAjaW5jbHVkZSAicHJvZmlsZXMuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgVlA4RGVjb2RlckNvbnRleHQgewordHlwZWRlZiBzdHJ1Y3QgVlB4RGVjb2RlckNvbnRleHQgewogICAgIHN0cnVjdCB2cHhfY29kZWNfY3R4IGRlY29kZXI7Ci19IFZQOENvbnRleHQ7CisgICAgc3RydWN0IHZweF9jb2RlY19jdHggZGVjb2Rlcl9hbHBoYTsKKyAgICBpbnQgaGFzX2FscGhhX2NoYW5uZWw7Cit9IFZQeENvbnRleHQ7CiAKIHN0YXRpYyBhdl9jb2xkIGludCB2cHhfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZweF9jb2RlY19pZmFjZSAqaWZhY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHZweF9jb2RlY19pZmFjZSAqaWZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2FscGhhX2RlY29kZXIpCiB7Ci0gICAgVlA4Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWUHhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIHN0cnVjdCB2cHhfY29kZWNfZGVjX2NmZyBkZWNjZmcgPSB7CiAgICAgICAgIC8qIHRva2VuIHBhcnRpdGlvbnMrMSB3b3VsZCBiZSBhIGRlY2VudCBjaG9pY2UgKi8KICAgICAgICAgLnRocmVhZHMgPSBGRk1JTihhdmN0eC0+dGhyZWFkX2NvdW50LCAxNikKQEAgLTUwLDcgKzU0LDkgQEAKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiJXNcbiIsIHZweF9jb2RlY192ZXJzaW9uX3N0cigpKTsKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiJXNcbiIsIHZweF9jb2RlY19idWlsZF9jb25maWcoKSk7CiAKLSAgICBpZiAodnB4X2NvZGVjX2RlY19pbml0KCZjdHgtPmRlY29kZXIsIGlmYWNlLCAmZGVjY2ZnLCAwKSAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICBpZiAodnB4X2NvZGVjX2RlY19pbml0KAorICAgICAgICAgICAgaXNfYWxwaGFfZGVjb2RlciA/ICZjdHgtPmRlY29kZXJfYWxwaGEgOiAmY3R4LT5kZWNvZGVyLAorICAgICAgICAgICAgaWZhY2UsICZkZWNjZmcsIDApICE9IFZQWF9DT0RFQ19PSykgewogICAgICAgICBjb25zdCBjaGFyICplcnJvciA9IHZweF9jb2RlY19lcnJvcigmY3R4LT5kZWNvZGVyKTsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyOiAlc1xuIiwKICAgICAgICAgICAgICAgIGVycm9yKTsKQEAgLTYxLDkgKzY3LDkgQEAKIH0KIAogLy8gcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIEFWRVJST1JfSU5WQUxJRERBVEEgb3RoZXJ3aXNlCi1zdGF0aWMgaW50IHNldF9waXhfZm10KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgc3RydWN0IHZweF9pbWFnZSAqaW1nKQorc3RhdGljIGludCBzZXRfcGl4X2ZtdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHN0cnVjdCB2cHhfaW1hZ2UgKmltZywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19hbHBoYV9jaGFubmVsKQogewotI2lmIFZQWF9JTUFHRV9BQklfVkVSU0lPTiA+PSAzCiAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZDb2xvclNwYWNlIGNvbG9yc3BhY2VzWzhdID0gewogICAgICAgICBBVkNPTF9TUENfVU5TUEVDSUZJRUQsIEFWQ09MX1NQQ19CVDQ3MEJHLCBBVkNPTF9TUENfQlQ3MDksIEFWQ09MX1NQQ19TTVBURTE3ME0sCiAgICAgICAgIEFWQ09MX1NQQ19TTVBURTI0ME0sIEFWQ09MX1NQQ19CVDIwMjBfTkNMLCBBVkNPTF9TUENfUkVTRVJWRUQsIEFWQ09MX1NQQ19SR0IsCkBAIC03NSw0MyArODEsMzYgQEAKICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPSBjb2xvcl9yYW5nZXNbaW1nLT5yYW5nZV07CiAjZW5kaWYKICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IGNvbG9yc3BhY2VzW2ltZy0+Y3NdOwotI2VuZGlmCiAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDggJiYgaW1nLT5mbXQgIT0gVlBYX0lNR19GTVRfSTQyMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgc3dpdGNoIChpbWctPmZtdCkgewogICAgIGNhc2UgVlBYX0lNR19GTVRfSTQyMDoKICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpCiAgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfVlA5XzA7Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9CisgICAgICAgICAgICBoYXNfYWxwaGFfY2hhbm5lbCA/IEFWX1BJWF9GTVRfWVVWQTQyMFAgOiBBVl9QSVhfRk1UX1lVVjQyMFA7CiAgICAgICAgIHJldHVybiAwOwogI2lmIENPTkZJR19MSUJWUFhfVlA5X0RFQ09ERVIKICAgICBjYXNlIFZQWF9JTUdfRk1UX0k0MjI6CiAgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9WUDlfMTsKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CiAgICAgICAgIHJldHVybiAwOwotI2lmIFZQWF9JTUFHRV9BQklfVkVSU0lPTiA+PSAzCiAgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDQwOgogICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfVlA5XzE7CiAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDBQOwogICAgICAgICByZXR1cm4gMDsKLSNlbmRpZgogICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDoKICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX1ZQOV8xOwotI2lmIFZQWF9JTUFHRV9BQklfVkVSU0lPTiA+PSAzCiAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYXZjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX1JHQiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9HQlJQIDogQVZfUElYX0ZNVF9ZVVY0NDRQOwotI2Vsc2UKLSAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7Ci0jZW5kaWYKICAgICAgICAgcmV0dXJuIDA7Ci0jaWZkZWYgVlBYX0lNR19GTVRfSElHSEJJVERFUFRICiAgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIwMTY6CiAgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9WUDlfMjsKICAgICAgICAgaWYgKGltZy0+Yml0X2RlcHRoID09IDEwKSB7Ci0gICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEwTEU7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEwOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0gZWxzZSBpZiAoaW1nLT5iaXRfZGVwdGggPT0gMTIpIHsKLSAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQMTJMRTsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQMTI7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtMTE5LDg1ICsxMTgsMTIyIEBACiAgICAgY2FzZSBWUFhfSU1HX0ZNVF9JNDIyMTY6CiAgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9WUDlfMzsKICAgICAgICAgaWYgKGltZy0+Yml0X2RlcHRoID09IDEwKSB7Ci0gICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDEwTEU7CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDEwOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0gZWxzZSBpZiAoaW1nLT5iaXRfZGVwdGggPT0gMTIpIHsKLSAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTJMRTsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTI7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9Ci0jaWYgVlBYX0lNQUdFX0FCSV9WRVJTSU9OID49IDMKICAgICBjYXNlIFZQWF9JTUdfRk1UX0k0NDAxNjoKICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX1ZQOV8zOwogICAgICAgICBpZiAoaW1nLT5iaXRfZGVwdGggPT0gMTApIHsKLSAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDBQMTBMRTsKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDBQMTA7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfSBlbHNlIGlmIChpbWctPmJpdF9kZXB0aCA9PSAxMikgewotICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0MFAxMkxFOworICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0MFAxMjsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KLSNlbmRpZgogICAgIGNhc2UgVlBYX0lNR19GTVRfSTQ0NDE2OgogICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfVlA5XzM7CiAgICAgICAgIGlmIChpbWctPmJpdF9kZXB0aCA9PSAxMCkgewotI2lmIFZQWF9JTUFHRV9BQklfVkVSU0lPTiA+PSAzCiAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IGF2Y3R4LT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19SR0IgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0dCUlAxMExFIDogQVZfUElYX0ZNVF9ZVVY0NDRQMTBMRTsKLSNlbHNlCi0gICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDEwTEU7Ci0jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTAgOiBBVl9QSVhfRk1UX1lVVjQ0NFAxMDsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9IGVsc2UgaWYgKGltZy0+Yml0X2RlcHRoID09IDEyKSB7Ci0jaWYgVlBYX0lNQUdFX0FCSV9WRVJTSU9OID49IDMKICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gYXZjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX1JHQiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyTEUgOiBBVl9QSVhfRk1UX1lVVjQ0NFAxMkxFOwotI2Vsc2UKLSAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTJMRTsKLSNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0dCUlAxMiA6IEFWX1BJWF9GTVRfWVVWNDQ0UDEyOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogI2VuZGlmCi0jZW5kaWYKICAgICBkZWZhdWx0OgogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgdnA4X2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdnB4X2NvZGVjX2N0eF90ICpkZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgdWludDMyX3QgZGF0YV9zeikKIHsKLSAgICBWUDhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRnJhbWUgKnBpY3R1cmUgPSBkYXRhOwotICAgIGNvbnN0IHZvaWQgKml0ZXIgPSBOVUxMOwotICAgIHN0cnVjdCB2cHhfaW1hZ2UgKmltZzsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKHZweF9jb2RlY19kZWNvZGUoJmN0eC0+ZGVjb2RlciwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplLCBOVUxMLCAwKSAhPQotICAgICAgICBWUFhfQ09ERUNfT0spIHsKLSAgICAgICAgY29uc3QgY2hhciAqZXJyb3IgID0gdnB4X2NvZGVjX2Vycm9yKCZjdHgtPmRlY29kZXIpOwotICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwgPSB2cHhfY29kZWNfZXJyb3JfZGV0YWlsKCZjdHgtPmRlY29kZXIpOworICAgIGlmICh2cHhfY29kZWNfZGVjb2RlKGRlY29kZXIsIGRhdGEsIGRhdGFfc3osIE5VTEwsIDApICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBjb25zdCBjaGFyICplcnJvciAgPSB2cHhfY29kZWNfZXJyb3IoZGVjb2Rlcik7CisgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCA9IHZweF9jb2RlY19lcnJvcl9kZXRhaWwoZGVjb2Rlcik7CiAKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lOiAlc1xuIiwgZXJyb3IpOwotICAgICAgICBpZiAoZGV0YWlsKQorICAgICAgICBpZiAoZGV0YWlsKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIiAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbjogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsKTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CisgICAgcmV0dXJuIDA7Cit9CiAKLSAgICBpZiAoKGltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoJmN0eC0+ZGVjb2RlciwgJml0ZXIpKSkgewotICAgICAgICBpZiAoKHJldCA9IHNldF9waXhfZm10KGF2Y3R4LCBpbWcpKSA8IDApIHsKLSNpZmRlZiBWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEgKK3N0YXRpYyBpbnQgdnB4X2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBWUHhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKnBpY3R1cmUgPSBkYXRhOworICAgIGNvbnN0IHZvaWQgKml0ZXIgPSBOVUxMOworICAgIGNvbnN0IHZvaWQgKml0ZXJfYWxwaGEgPSBOVUxMOworICAgIHN0cnVjdCB2cHhfaW1hZ2UgKmltZywgKmltZ19hbHBoYTsKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgKnNpZGVfZGF0YSA9IE5VTEw7CisgICAgaW50IHNpZGVfZGF0YV9zaXplID0gMDsKKworICAgIHJldCA9IGRlY29kZV9mcmFtZShhdmN0eCwgJmN0eC0+ZGVjb2RlciwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc2lkZV9kYXRhID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfTUFUUk9TS0FfQkxPQ0tBRERJVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWRlX2RhdGFfc2l6ZSk7CisgICAgaWYgKHNpZGVfZGF0YV9zaXplID4gMSkgeworICAgICAgICBjb25zdCB1aW50NjRfdCBhZGRpdGlvbmFsX2lkID0gQVZfUkI2NChzaWRlX2RhdGEpOworICAgICAgICBzaWRlX2RhdGEgKz0gODsKKyAgICAgICAgc2lkZV9kYXRhX3NpemUgLT0gODsKKyAgICAgICAgaWYgKGFkZGl0aW9uYWxfaWQgPT0gMSkgeyAgLy8gMSBzdGFuZHMgZm9yIGFscGhhIGNoYW5uZWwgZGF0YS4KKyAgICAgICAgICAgIGlmICghY3R4LT5oYXNfYWxwaGFfY2hhbm5lbCkgeworICAgICAgICAgICAgICAgIGN0eC0+aGFzX2FscGhhX2NoYW5uZWwgPSAxOworICAgICAgICAgICAgICAgIHJldCA9IHZweF9pbml0KGF2Y3R4LAorI2lmIENPTkZJR19MSUJWUFhfVlA4X0RFQ09ERVIgJiYgQ09ORklHX0xJQlZQWF9WUDlfREVDT0RFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZweF9jb2RlY192cDhfZHhfYWxnbyA6ICZ2cHhfY29kZWNfdnA5X2R4X2FsZ28sCisjZWxpZiBDT05GSUdfTElCVlBYX1ZQOF9ERUNPREVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZweF9jb2RlY192cDhfZHhfYWxnbywKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZweF9jb2RlY192cDlfZHhfYWxnbywKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfZnJhbWUoYXZjdHgsICZjdHgtPmRlY29kZXJfYWxwaGEsIHNpZGVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWRlX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUoJmN0eC0+ZGVjb2RlciwgJml0ZXIpKSAmJgorICAgICAgICAoIWN0eC0+aGFzX2FscGhhX2NoYW5uZWwgfHwKKyAgICAgICAgIChpbWdfYWxwaGEgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKCZjdHgtPmRlY29kZXJfYWxwaGEsICZpdGVyX2FscGhhKSkpKSB7CisgICAgICAgIHVpbnQ4X3QgKnBsYW5lc1s0XTsKKyAgICAgICAgaW50IGxpbmVzaXplc1s0XTsKKworICAgICAgICBpZiAoaW1nLT5kX3cgPiBpbWctPncgfHwgaW1nLT5kX2ggPiBpbWctPmgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGlzcGxheSBkaW1lbnNpb25zICVkeCVkIGV4Y2VlZCBzdG9yYWdlICVkeCVkXG4iLAorICAgICAgICAgICAgICAgICAgIGltZy0+ZF93LCBpbWctPmRfaCwgaW1nLT53LCBpbWctPmgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IHNldF9waXhfZm10KGF2Y3R4LCBpbWcsIGN0eC0+aGFzX2FscGhhX2NoYW5uZWwpKSA8IDApIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgb3V0cHV0IGNvbG9yc3BhY2UgKCVkKSAvIGJpdF9kZXB0aCAoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgIGltZy0+Zm10LCBpbWctPmJpdF9kZXB0aCk7Ci0jZWxzZQotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBvdXRwdXQgY29sb3JzcGFjZSAoJWQpIC8gYml0X2RlcHRoICglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgaW1nLT5mbXQsIDgpOwotI2VuZGlmCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAKQEAgLTIxMCwyNCArMjQ2LDM3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwaWN0dXJlLCAwKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgYXZfaW1hZ2VfY29weShwaWN0dXJlLT5kYXRhLCBwaWN0dXJlLT5saW5lc2l6ZSwgKGNvbnN0IHVpbnQ4X3QgKiopaW1nLT5wbGFuZXMsCi0gICAgICAgICAgICAgICAgICAgICAgaW1nLT5zdHJpZGUsIGF2Y3R4LT5waXhfZm10LCBpbWctPmRfdywgaW1nLT5kX2gpOworCisgICAgICAgIHBsYW5lc1swXSA9IGltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKyAgICAgICAgcGxhbmVzWzFdID0gaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICBwbGFuZXNbMl0gPSBpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisgICAgICAgIHBsYW5lc1szXSA9CisgICAgICAgICAgICBjdHgtPmhhc19hbHBoYV9jaGFubmVsID8gaW1nX2FscGhhLT5wbGFuZXNbVlBYX1BMQU5FX1ldIDogTlVMTDsKKyAgICAgICAgbGluZXNpemVzWzBdID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOworICAgICAgICBsaW5lc2l6ZXNbMV0gPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CisgICAgICAgIGxpbmVzaXplc1syXSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKKyAgICAgICAgbGluZXNpemVzWzNdID0KKyAgICAgICAgICAgIGN0eC0+aGFzX2FscGhhX2NoYW5uZWwgPyBpbWdfYWxwaGEtPnN0cmlkZVtWUFhfUExBTkVfWV0gOiAwOworICAgICAgICBhdl9pbWFnZV9jb3B5KHBpY3R1cmUtPmRhdGEsIHBpY3R1cmUtPmxpbmVzaXplLCAoY29uc3QgdWludDhfdCoqKXBsYW5lcywKKyAgICAgICAgICAgICAgICAgICAgICBsaW5lc2l6ZXMsIGF2Y3R4LT5waXhfZm10LCBpbWctPmRfdywgaW1nLT5kX2gpOwogICAgICAgICAqZ290X2ZyYW1lICAgICAgICAgICA9IDE7CiAgICAgfQogICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKIH0KIAotc3RhdGljIGF2X2NvbGQgaW50IHZwOF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3N0YXRpYyBhdl9jb2xkIGludCB2cHhfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgVlA4Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWUHhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIHZweF9jb2RlY19kZXN0cm95KCZjdHgtPmRlY29kZXIpOworICAgIGlmIChjdHgtPmhhc19hbHBoYV9jaGFubmVsKQorICAgICAgICB2cHhfY29kZWNfZGVzdHJveSgmY3R4LT5kZWNvZGVyX2FscGhhKTsKICAgICByZXR1cm4gMDsKIH0KIAogI2lmIENPTkZJR19MSUJWUFhfVlA4X0RFQ09ERVIKIHN0YXRpYyBhdl9jb2xkIGludCB2cDhfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgcmV0dXJuIHZweF9pbml0KGF2Y3R4LCAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvKTsKKyAgICByZXR1cm4gdnB4X2luaXQoYXZjdHgsICZ2cHhfY29kZWNfdnA4X2R4X2FsZ28sIDApOwogfQogCiBBVkNvZGVjIGZmX2xpYnZweF92cDhfZGVjb2RlciA9IHsKQEAgLTIzNSwxOCArMjg0LDE5IEBACiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnZweCBWUDgiKSwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA4LAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWUDhDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlB4Q29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgID0gdnA4X2luaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gdnA4X2ZyZWUsCi0gICAgLmRlY29kZSAgICAgICAgID0gdnA4X2RlY29kZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2cHhfZnJlZSwKKyAgICAuZGVjb2RlICAgICAgICAgPSB2cHhfZGVjb2RlLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9BVVRPX1RIUkVBRFMgfCBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJ2cHgiLAogfTsKICNlbmRpZiAvKiBDT05GSUdfTElCVlBYX1ZQOF9ERUNPREVSICovCiAKICNpZiBDT05GSUdfTElCVlBYX1ZQOV9ERUNPREVSCiBzdGF0aWMgYXZfY29sZCBpbnQgdnA5X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIHJldHVybiB2cHhfaW5pdChhdmN0eCwgJnZweF9jb2RlY192cDlfZHhfYWxnbyk7CisgICAgcmV0dXJuIHZweF9pbml0KGF2Y3R4LCAmdnB4X2NvZGVjX3ZwOV9keF9hbGdvLCAwKTsKIH0KIAogQVZDb2RlYyBmZl9saWJ2cHhfdnA5X2RlY29kZXIgPSB7CkBAIC0yNTQsMTIgKzMwNCwxMyBAQAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJ2cHggVlA5IiksCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZQOSwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlA4Q29udGV4dCksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZQeENvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICA9IHZwOV9pbml0LAotICAgIC5jbG9zZSAgICAgICAgICA9IHZwOF9mcmVlLAotICAgIC5kZWNvZGUgICAgICAgICA9IHZwOF9kZWNvZGUsCisgICAgLmNsb3NlICAgICAgICAgID0gdnB4X2ZyZWUsCisgICAgLmRlY29kZSAgICAgICAgID0gdnB4X2RlY29kZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfQVVUT19USFJFQURTIHwgQVZfQ09ERUNfQ0FQX0RSMSwKICAgICAuaW5pdF9zdGF0aWNfZGF0YSA9IGZmX3ZwOV9pbml0X3N0YXRpYywKICAgICAucHJvZmlsZXMgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl92cDlfcHJvZmlsZXMpLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJ2cHgiLAogfTsKICNlbmRpZiAvKiBDT05GSUdfTElCVlBYX1ZQOV9ERUNPREVSICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYnZweGVuYy5jIGIvbGliYXZjb2RlYy9saWJ2cHhlbmMuYwppbmRleCA4OTkyNDk3Li5kMGJkMWU5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYnZweGVuYy5jCisrKyBiL2xpYmF2Y29kZWMvbGlidnB4ZW5jLmMKQEAgLTIwLDcgKzIwLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogVlA4IGVuY29kZXIgc3VwcG9ydCB2aWEgbGlidnB4CisgKiBWUDgvOSBlbmNvZGVyIHN1cHBvcnQgdmlhIGxpYnZweAogICovCiAKICNkZWZpbmUgVlBYX0RJU0FCTEVfQ1RSTF9UWVBFQ0hFQ0tTIDEKQEAgLTYwLDcgKzYwLDcgQEAKICAgICBzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqbmV4dDsKIH07CiAKLXR5cGVkZWYgc3RydWN0IFZQOEVuY29kZXJDb250ZXh0IHsKK3R5cGVkZWYgc3RydWN0IFZQeEVuY29kZXJDb250ZXh0IHsKICAgICBBVkNsYXNzICpjbGFzczsKICAgICBzdHJ1Y3QgdnB4X2NvZGVjX2N0eCBlbmNvZGVyOwogICAgIHN0cnVjdCB2cHhfaW1hZ2UgcmF3aW1nOwpAQCAtMTA2LDcgKzEwNiwxMiBAQAogICAgIGludCBhcV9tb2RlOwogICAgIGludCBkcm9wX3RocmVzaG9sZDsKICAgICBpbnQgbm9pc2Vfc2Vuc2l0aXZpdHk7Ci19IFZQOENvbnRleHQ7CisgICAgaW50IHZweF9jczsKKyAgICBmbG9hdCBsZXZlbDsKKyAgICBpbnQgcm93X210OworICAgIGludCB0dW5lX2NvbnRlbnQ7CisgICAgaW50IGNvcnB1c19jb21wbGV4aXR5OworfSBWUHhDb250ZXh0OwogCiAvKiogU3RyaW5nIG1hcHBpbmdzIGZvciBlbnVtIHZwOGVfZW5jX2NvbnRyb2xfaWQgKi8KIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjdGxpZHN0cltdID0gewpAQCAtMTI3LDE4ICsxMzIsMjYgQEAKICAgICBbVlA5RV9TRVRfVElMRV9ST1dTXSAgICAgICAgICAgICAgID0gIlZQOUVfU0VUX1RJTEVfUk9XUyIsCiAgICAgW1ZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HXSA9ICJWUDlFX1NFVF9GUkFNRV9QQVJBTExFTF9ERUNPRElORyIsCiAgICAgW1ZQOUVfU0VUX0FRX01PREVdICAgICAgICAgICAgICAgICA9ICJWUDlFX1NFVF9BUV9NT0RFIiwKLSNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+IDgKICAgICBbVlA5RV9TRVRfQ09MT1JfU1BBQ0VdICAgICAgICAgICAgID0gIlZQOUVfU0VUX0NPTE9SX1NQQUNFIiwKLSNlbmRpZgogI2lmIFZQWF9FTkNPREVSX0FCSV9WRVJTSU9OID49IDExCiAgICAgW1ZQOUVfU0VUX0NPTE9SX1JBTkdFXSAgICAgICAgICAgICA9ICJWUDlFX1NFVF9DT0xPUl9SQU5HRSIsCiAjZW5kaWYKKyNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+PSAxMgorICAgIFtWUDlFX1NFVF9UQVJHRVRfTEVWRUxdICAgICAgICAgICAgPSAiVlA5RV9TRVRfVEFSR0VUX0xFVkVMIiwKKyAgICBbVlA5RV9HRVRfTEVWRUxdICAgICAgICAgICAgICAgICAgID0gIlZQOUVfR0VUX0xFVkVMIiwKKyNlbmRpZgorI2lmZGVmIFZQWF9DVFJMX1ZQOUVfU0VUX1JPV19NVAorICAgIFtWUDlFX1NFVF9ST1dfTVRdICAgICAgICAgICAgICAgICAgPSAiVlA5RV9TRVRfUk9XX01UIiwKKyNlbmRpZgorI2lmZGVmIFZQWF9DVFJMX1ZQOUVfU0VUX1RVTkVfQ09OVEVOVAorICAgIFtWUDlFX1NFVF9UVU5FX0NPTlRFTlRdICAgICAgICAgICAgPSAiVlA5RV9TRVRfVFVORV9DT05URU5UIiwKKyNlbmRpZgogI2VuZGlmCiB9OwogCiBzdGF0aWMgYXZfY29sZCB2b2lkIGxvZ19lbmNvZGVyX2Vycm9yKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqZGVzYykKIHsKLSAgICBWUDhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZQeENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgY29uc3QgY2hhciAqZXJyb3IgID0gdnB4X2NvZGVjX2Vycm9yKCZjdHgtPmVuY29kZXIpOwogICAgIGNvbnN0IGNoYXIgKmRldGFpbCA9IHZweF9jb2RlY19lcnJvcl9kZXRhaWwoJmN0eC0+ZW5jb2Rlcik7CiAKQEAgLTE1Niw3ICsxNjksNyBAQAogICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJ2cHhfY29kZWNfZW5jX2NmZ1xuIik7CiAgICAgYXZfbG9nKGF2Y3R4LCBsZXZlbCwgImdlbmVyaWMgc2V0dGluZ3NcbiIKICAgICAgICAgICAgIiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiAgJSpzJXVcbiIKLSNpZiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSICYmIGRlZmluZWQoVlBYX0lNR19GTVRfSElHSEJJVERFUFRIKQorI2lmIENPTkZJR19MSUJWUFhfVlA5X0VOQ09ERVIKICAgICAgICAgICAgIiAgJSpzJXVcbiAgJSpzJXVcbiIKICNlbmRpZgogICAgICAgICAgICAiICAlKnN7JXUvJXV9XG4gICUqcyV1XG4gICUqcyVkXG4gICUqcyV1XG4iLApAQCAtMTY1LDcgKzE3OCw3IEBACiAgICAgICAgICAgIHdpZHRoLCAiZ19wcm9maWxlOiIsICAgICAgICAgY2ZnLT5nX3Byb2ZpbGUsCiAgICAgICAgICAgIHdpZHRoLCAiZ193OiIsICAgICAgICAgICAgICAgY2ZnLT5nX3csCiAgICAgICAgICAgIHdpZHRoLCAiZ19oOiIsICAgICAgICAgICAgICAgY2ZnLT5nX2gsCi0jaWYgQ09ORklHX0xJQlZQWF9WUDlfRU5DT0RFUiAmJiBkZWZpbmVkKFZQWF9JTUdfRk1UX0hJR0hCSVRERVBUSCkKKyNpZiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSCiAgICAgICAgICAgIHdpZHRoLCAiZ19iaXRfZGVwdGg6IiwgICAgICAgY2ZnLT5nX2JpdF9kZXB0aCwKICAgICAgICAgICAgd2lkdGgsICJnX2lucHV0X2JpdF9kZXB0aDoiLCBjZmctPmdfaW5wdXRfYml0X2RlcHRoLAogI2VuZGlmCkBAIC0yMDEsNiArMjE0LDEwIEBACiAgICAgICAgICAgIHdpZHRoLCAicmNfMnBhc3NfdmJyX2JpYXNfcGN0OiIsICAgICAgIGNmZy0+cmNfMnBhc3NfdmJyX2JpYXNfcGN0LAogICAgICAgICAgICB3aWR0aCwgInJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdDoiLCBjZmctPnJjXzJwYXNzX3Zicl9taW5zZWN0aW9uX3BjdCwKICAgICAgICAgICAgd2lkdGgsICJyY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3Q6IiwgY2ZnLT5yY18ycGFzc192YnJfbWF4c2VjdGlvbl9wY3QpOworI2lmIFZQWF9FTkNPREVSX0FCSV9WRVJTSU9OID49IDE0CisgICAgYXZfbG9nKGF2Y3R4LCBsZXZlbCwgIiAgJSpzJXVcbiIsCisgICAgICAgICAgIHdpZHRoLCAicmNfMnBhc3NfdmJyX2NvcnB1c19jb21wbGV4aXR5OiIsIGNmZy0+cmNfMnBhc3NfdmJyX2NvcnB1c19jb21wbGV4aXR5KTsKKyNlbmRpZgogICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJrZXlmcmFtaW5nIHNldHRpbmdzXG4iCiAgICAgICAgICAgICIgICUqcyVkXG4gICUqcyV1XG4gICUqcyV1XG4iLAogICAgICAgICAgICB3aWR0aCwgImtmX21vZGU6IiwgICAgIGNmZy0+a2ZfbW9kZSwKQEAgLTI0MSw3ICsyNTgsNyBAQAogc3RhdGljIGF2X2NvbGQgaW50IGNvZGVjY3RsX2ludChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gdnA4ZV9lbmNfY29udHJvbF9pZCBpZCwgaW50IHZhbCkKIHsKLSAgICBWUDhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZQeENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgY2hhciBidWZbODBdOwogICAgIGludCB3aWR0aCA9IC0zMDsKICAgICBpbnQgcmVzOwpAQCAtMjU5LDkgKzI3Niw0MSBAQAogICAgIHJldHVybiByZXMgPT0gVlBYX0NPREVDX09LID8gMCA6IEFWRVJST1IoRUlOVkFMKTsKIH0KIAotc3RhdGljIGF2X2NvbGQgaW50IHZwOF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKKyNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+PSAxMgorc3RhdGljIGF2X2NvbGQgaW50IGNvZGVjY3RsX2ludHAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSB2cDhlX2VuY19jb250cm9sX2lkIGlkLCBpbnQgKnZhbCkKIHsKLSAgICBWUDhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZQeENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY2hhciBidWZbODBdOworICAgIGludCB3aWR0aCA9IC0zMDsKKyAgICBpbnQgcmVzOworCisgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzOiIsIGN0bGlkc3RyW2lkXSk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgICUqcyVkXG4iLCB3aWR0aCwgYnVmLCAqdmFsKTsKKworICAgIHJlcyA9IHZweF9jb2RlY19jb250cm9sKCZjdHgtPmVuY29kZXIsIGlkLCB2YWwpOworICAgIGlmIChyZXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJGYWlsZWQgdG8gc2V0ICVzIGNvZGVjIGNvbnRyb2wiLAorICAgICAgICAgICAgICAgICBjdGxpZHN0cltpZF0pOworICAgICAgICBsb2dfZW5jb2Rlcl9lcnJvcihhdmN0eCwgYnVmKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzID09IFZQWF9DT0RFQ19PSyA/IDAgOiBBVkVSUk9SKEVJTlZBTCk7Cit9CisjZW5kaWYKKworc3RhdGljIGF2X2NvbGQgaW50IHZweF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWUHhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisjaWYgVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04gPj0gMTIKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOSAmJiBjdHgtPmxldmVsID49IDAgJiYKKyAgICAgICAgIShhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MxKSkgeworICAgICAgICBpbnQgbGV2ZWxfb3V0ID0gMDsKKyAgICAgICAgaWYgKCFjb2RlY2N0bF9pbnRwKGF2Y3R4LCBWUDlFX0dFVF9MRVZFTCwgJmxldmVsX291dCkpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiRW5jb2RlZCBsZXZlbCAlLjFmXG4iLCBsZXZlbF9vdXQgKiAwLjEpOworICAgIH0KKyNlbmRpZgogCiAgICAgdnB4X2NvZGVjX2Rlc3Ryb3koJmN0eC0+ZW5jb2Rlcik7CiAgICAgaWYgKGN0eC0+aXNfYWxwaGEpCkBAIC0yNzcsMTEgKzMyNiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdnB4X2NvZGVjX2VuY19jZmcgKmVuY2NmZywgdnB4X2NvZGVjX2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICB2cHhfaW1nX2ZtdF90ICppbWdfZm10KQogewotI2lmZGVmIFZQWF9JTUdfRk1UX0hJR0hCSVRERVBUSAorICAgIFZQeENvbnRleHQgYXZfdW51c2VkICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGVuY2NmZy0+Z19iaXRfZGVwdGggPSBlbmNjZmctPmdfaW5wdXRfYml0X2RlcHRoID0gODsKLSNlbmRpZgogICAgIHN3aXRjaCAoYXZjdHgtPnBpeF9mbXQpIHsKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFA6CiAgICAgICAgIGVuY2NmZy0+Z19wcm9maWxlID0gMDsKICAgICAgICAgKmltZ19mbXQgPSBWUFhfSU1HX0ZNVF9JNDIwOwogICAgICAgICByZXR1cm4gMDsKQEAgLTI4OSw2NCArMzM4LDY0IEBACiAgICAgICAgIGVuY2NmZy0+Z19wcm9maWxlID0gMTsKICAgICAgICAgKmltZ19mbXQgPSBWUFhfSU1HX0ZNVF9JNDIyOwogICAgICAgICByZXR1cm4gMDsKLSNpZiBWUFhfSU1BR0VfQUJJX1ZFUlNJT04gPj0gMwogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQOgogICAgICAgICBlbmNjZmctPmdfcHJvZmlsZSA9IDE7CiAgICAgICAgICppbWdfZm10ID0gVlBYX0lNR19GTVRfSTQ0MDsKICAgICAgICAgcmV0dXJuIDA7Ci0jZW5kaWYKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICAgICAgY3R4LT52cHhfY3MgPSBWUFhfQ1NfU1JHQjsKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKICAgICAgICAgZW5jY2ZnLT5nX3Byb2ZpbGUgPSAxOwogICAgICAgICAqaW1nX2ZtdCA9IFZQWF9JTUdfRk1UX0k0NDQ7CiAgICAgICAgIHJldHVybiAwOwotI2lmZGVmIFZQWF9JTUdfRk1UX0hJR0hCSVRERVBUSAotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEyOgogICAgICAgICBpZiAoY29kZWNfY2FwcyAmIFZQWF9DT0RFQ19DQVBfSElHSEJJVERFUFRIKSB7CiAgICAgICAgICAgICBlbmNjZmctPmdfYml0X2RlcHRoID0gZW5jY2ZnLT5nX2lucHV0X2JpdF9kZXB0aCA9Ci0gICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRSA/IDEwIDogMTI7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQMTAgPyAxMCA6IDEyOwogICAgICAgICAgICAgZW5jY2ZnLT5nX3Byb2ZpbGUgPSAyOwogICAgICAgICAgICAgKmltZ19mbXQgPSBWUFhfSU1HX0ZNVF9JNDIwMTY7CiAgICAgICAgICAgICAqZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9ISUdIQklUREVQVEg7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEwTEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMjoKICAgICAgICAgaWYgKGNvZGVjX2NhcHMgJiBWUFhfQ09ERUNfQ0FQX0hJR0hCSVRERVBUSCkgewogICAgICAgICAgICAgZW5jY2ZnLT5nX2JpdF9kZXB0aCA9IGVuY2NmZy0+Z19pbnB1dF9iaXRfZGVwdGggPQotICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUDEwTEUgPyAxMCA6IDEyOworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUDEwID8gMTAgOiAxMjsKICAgICAgICAgICAgIGVuY2NmZy0+Z19wcm9maWxlID0gMzsKICAgICAgICAgICAgICppbWdfZm10ID0gVlBYX0lNR19GTVRfSTQyMjE2OwogICAgICAgICAgICAgKmZsYWdzIHw9IFZQWF9DT0RFQ19VU0VfSElHSEJJVERFUFRIOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0jaWYgVlBYX0lNQUdFX0FCSV9WRVJTSU9OID49IDMKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDEwTEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMjoKICAgICAgICAgaWYgKGNvZGVjX2NhcHMgJiBWUFhfQ09ERUNfQ0FQX0hJR0hCSVRERVBUSCkgewogICAgICAgICAgICAgZW5jY2ZnLT5nX2JpdF9kZXB0aCA9IGVuY2NmZy0+Z19pbnB1dF9iaXRfZGVwdGggPQotICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDQwUDEwTEUgPyAxMCA6IDEyOworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDQwUDEwID8gMTAgOiAxMjsKICAgICAgICAgICAgIGVuY2NmZy0+Z19wcm9maWxlID0gMzsKICAgICAgICAgICAgICppbWdfZm10ID0gVlBYX0lNR19GTVRfSTQ0MDE2OwogICAgICAgICAgICAgKmZsYWdzIHw9IFZQWF9DT0RFQ19VU0VfSElHSEJJVERFUFRIOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwTEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMjoKKyAgICAgICAgY3R4LT52cHhfY3MgPSBWUFhfQ1NfU1JHQjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTI6CiAgICAgICAgIGlmIChjb2RlY19jYXBzICYgVlBYX0NPREVDX0NBUF9ISUdIQklUREVQVEgpIHsKICAgICAgICAgICAgIGVuY2NmZy0+Z19iaXRfZGVwdGggPSBlbmNjZmctPmdfaW5wdXRfYml0X2RlcHRoID0KLSAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFAxMExFID8gMTAgOiAxMjsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFAxMCB8fAorICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSUDEwID8gMTAgOiAxMjsKICAgICAgICAgICAgIGVuY2NmZy0+Z19wcm9maWxlID0gMzsKICAgICAgICAgICAgICppbWdfZm10ID0gVlBYX0lNR19GTVRfSTQ0NDE2OwogICAgICAgICAgICAgKmZsYWdzIHw9IFZQWF9DT0RFQ19VU0VfSElHSEJJVERFUFRIOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKICAgICB9CkBAIC0zNTQsMjggKzQwMywzMSBAQAogICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogfQogCi0jaWYgVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04gPiA4CiBzdGF0aWMgdm9pZCBzZXRfY29sb3JzcGFjZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgZW51bSB2cHhfY29sb3Jfc3BhY2UgdnB4X2NzOworICAgIFZQeENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKLSAgICBzd2l0Y2ggKGF2Y3R4LT5jb2xvcnNwYWNlKSB7Ci0gICAgY2FzZSBBVkNPTF9TUENfUkdCOiAgICAgICAgIHZweF9jcyA9IFZQWF9DU19TUkdCOyAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZDT0xfU1BDX0JUNzA5OiAgICAgICB2cHhfY3MgPSBWUFhfQ1NfQlRfNzA5OyAgICBicmVhazsKLSAgICBjYXNlIEFWQ09MX1NQQ19VTlNQRUNJRklFRDogdnB4X2NzID0gVlBYX0NTX1VOS05PV047ICAgYnJlYWs7Ci0gICAgY2FzZSBBVkNPTF9TUENfUkVTRVJWRUQ6ICAgIHZweF9jcyA9IFZQWF9DU19SRVNFUlZFRDsgIGJyZWFrOwotICAgIGNhc2UgQVZDT0xfU1BDX0JUNDcwQkc6ICAgICB2cHhfY3MgPSBWUFhfQ1NfQlRfNjAxOyAgICBicmVhazsKLSAgICBjYXNlIEFWQ09MX1NQQ19TTVBURTE3ME06ICAgdnB4X2NzID0gVlBYX0NTX1NNUFRFXzE3MDsgYnJlYWs7Ci0gICAgY2FzZSBBVkNPTF9TUENfU01QVEUyNDBNOiAgIHZweF9jcyA9IFZQWF9DU19TTVBURV8yNDA7IGJyZWFrOwotICAgIGNhc2UgQVZDT0xfU1BDX0JUMjAyMF9OQ0w6ICB2cHhfY3MgPSBWUFhfQ1NfQlRfMjAyMDsgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgY29sb3JzcGFjZSAoJWQpXG4iLAotICAgICAgICAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKGN0eC0+dnB4X2NzKSB7CisgICAgICAgIHZweF9jcyA9IGN0eC0+dnB4X2NzOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoYXZjdHgtPmNvbG9yc3BhY2UpIHsKKyAgICAgICAgY2FzZSBBVkNPTF9TUENfUkdCOiAgICAgICAgIHZweF9jcyA9IFZQWF9DU19TUkdCOyAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ09MX1NQQ19CVDcwOTogICAgICAgdnB4X2NzID0gVlBYX0NTX0JUXzcwOTsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDT0xfU1BDX1VOU1BFQ0lGSUVEOiB2cHhfY3MgPSBWUFhfQ1NfVU5LTk9XTjsgICBicmVhazsKKyAgICAgICAgY2FzZSBBVkNPTF9TUENfUkVTRVJWRUQ6ICAgIHZweF9jcyA9IFZQWF9DU19SRVNFUlZFRDsgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ09MX1NQQ19CVDQ3MEJHOiAgICAgdnB4X2NzID0gVlBYX0NTX0JUXzYwMTsgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDT0xfU1BDX1NNUFRFMTcwTTogICB2cHhfY3MgPSBWUFhfQ1NfU01QVEVfMTcwOyBicmVhazsKKyAgICAgICAgY2FzZSBBVkNPTF9TUENfU01QVEUyNDBNOiAgIHZweF9jcyA9IFZQWF9DU19TTVBURV8yNDA7IGJyZWFrOworICAgICAgICBjYXNlIEFWQ09MX1NQQ19CVDIwMjBfTkNMOiAgdnB4X2NzID0gVlBYX0NTX0JUXzIwMjA7ICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgY29sb3JzcGFjZSAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOUVfU0VUX0NPTE9SX1NQQUNFLCB2cHhfY3MpOwogfQotI2VuZGlmCiAKICNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+PSAxMQogc3RhdGljIHZvaWQgc2V0X2NvbG9yX3JhbmdlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKQEAgLTM5OSw3ICs0NTEsNyBAQAogc3RhdGljIGF2X2NvbGQgaW50IHZweF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2lmYWNlICppZmFjZSkKIHsKLSAgICBWUDhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZQeENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgc3RydWN0IHZweF9jb2RlY19lbmNfY2ZnIGVuY2NmZyA9IHsgMCB9OwogICAgIHN0cnVjdCB2cHhfY29kZWNfZW5jX2NmZyBlbmNjZmdfYWxwaGE7CiAgICAgdnB4X2NvZGVjX2ZsYWdzX3QgZmxhZ3MgPSAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QU05SKSA/IFZQWF9DT0RFQ19VU0VfUFNOUiA6IDA7CkBAIC01MTgsNiArNTcwLDE0IEBACiAgICAgaWYgKGF2Y3R4LT5yY19tYXhfcmF0ZSkKICAgICAgICAgZW5jY2ZnLnJjXzJwYXNzX3Zicl9tYXhzZWN0aW9uX3BjdCA9CiAgICAgICAgICAgICBhdmN0eC0+cmNfbWF4X3JhdGUgKiAxMDBMTCAvIGF2Y3R4LT5iaXRfcmF0ZTsKKyNpZiBDT05GSUdfTElCVlBYX1ZQOV9FTkNPREVSCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpIHsKKyNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+PSAxNAorICAgICAgICBpZiAoY3R4LT5jb3JwdXNfY29tcGxleGl0eSA+PSAwKQorICAgICAgICAgICAgZW5jY2ZnLnJjXzJwYXNzX3Zicl9jb3JwdXNfY29tcGxleGl0eSA9IGN0eC0+Y29ycHVzX2NvbXBsZXhpdHk7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKIAogICAgIGlmIChhdmN0eC0+cmNfYnVmZmVyX3NpemUpCiAgICAgICAgIGVuY2NmZy5yY19idWZfc3ogICAgICAgICA9CkBAIC01MjYsMTUgKzU4Niw2IEBACiAgICAgICAgIGVuY2NmZy5yY19idWZfaW5pdGlhbF9zeiA9CiAgICAgICAgICAgICBhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5ICogMTAwMExMIC8gYXZjdHgtPmJpdF9yYXRlOwogICAgIGVuY2NmZy5yY19idWZfb3B0aW1hbF9zeiAgICAgPSBlbmNjZmcucmNfYnVmX3N6ICogNSAvIDY7Ci0jaWYgRkZfQVBJX01QVl9PUFQKLSAgICBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgaWYgKGF2Y3R4LT5yY19idWZmZXJfYWdncmVzc2l2aXR5ICE9IDEuMCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlIHJjX2J1ZmZlcl9hZ2dyZXNzaXZpdHkgb3B0aW9uIGlzICIKLSAgICAgICAgICAgICAgICJkZXByZWNhdGVkLCB1c2UgdGhlIHVuZGVyc2hvb3QtcGN0IHByaXZhdGUgb3B0aW9uIGluc3RlYWQuXG4iKTsKLSAgICAgICAgZW5jY2ZnLnJjX3VuZGVyc2hvb3RfcGN0ID0gbHJpbnQoYXZjdHgtPnJjX2J1ZmZlcl9hZ2dyZXNzaXZpdHkgKiAxMDApOwotICAgIH0KLSAgICBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgogICAgIGlmIChjdHgtPnJjX3VuZGVyc2hvb3RfcGN0ID49IDApCiAgICAgICAgIGVuY2NmZy5yY191bmRlcnNob290X3BjdCA9IGN0eC0+cmNfdW5kZXJzaG9vdF9wY3Q7CiAgICAgaWYgKGN0eC0+cmNfb3ZlcnNob290X3BjdCA+PSAwKQpAQCAtNjA3LDcgKzY1OCw4IEBACiAgICAgaWYgKGN0eC0+ZmxhZ3MgJiBWUDhGX0FVVE9fQUxUX1JFRikKICAgICAgICAgY3R4LT5hdXRvX2FsdF9yZWYgPSAxOwogICAgIGlmIChjdHgtPmF1dG9fYWx0X3JlZiA+PSAwKQotICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOEVfU0VUX0VOQUJMRUFVVE9BTFRSRUYsIGN0eC0+YXV0b19hbHRfcmVmKTsKKyAgICAgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDhFX1NFVF9FTkFCTEVBVVRPQUxUUkVGLAorICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCA/ICEhY3R4LT5hdXRvX2FsdF9yZWYgOiBjdHgtPmF1dG9fYWx0X3JlZik7CiAgICAgaWYgKGN0eC0+YXJucl9tYXhfZnJhbWVzID49IDApCiAgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA4RV9TRVRfQVJOUl9NQVhGUkFNRVMsICAgY3R4LT5hcm5yX21heF9mcmFtZXMpOwogICAgIGlmIChjdHgtPmFybnJfc3RyZW5ndGggPj0gMCkKQEAgLTYxNyw2ICs2NjksMTEgQEAKICAgICBpZiAoY3R4LT50dW5lID49IDApCiAgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA4RV9TRVRfVFVOSU5HLCAgICAgICAgICAgY3R4LT50dW5lKTsKIAorICAgIGlmIChjdHgtPmF1dG9fYWx0X3JlZiAmJiBjdHgtPmlzX2FscGhhICYmIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUcmFuc3BhcmVuY3kgZW5jb2Rpbmcgd2l0aCBhdXRvX2FsdF9yZWYgZG9lcyBub3Qgd29ya1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCiAgICAgaWYgKENPTkZJR19MSUJWUFhfVlA4X0VOQ09ERVIgJiYgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCkgewogI2lmIEZGX0FQSV9QUklWQVRFX09QVAogRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwpAQCAtNjI3LDE1ICs2ODQsNiBAQAogICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOEVfU0VUX05PSVNFX1NFTlNJVElWSVRZLCBjdHgtPm5vaXNlX3NlbnNpdGl2aXR5KTsKICAgICAgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDhFX1NFVF9UT0tFTl9QQVJUSVRJT05TLCAgYXZfbG9nMihhdmN0eC0+c2xpY2VzKSk7CiAgICAgfQotI2lmIEZGX0FQSV9NUFZfT1BUCi0gICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGlmIChhdmN0eC0+bWJfdGhyZXNob2xkKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGUgbWJfdGhyZXNob2xkIG9wdGlvbiBpcyBkZXByZWNhdGVkLCAiCi0gICAgICAgICAgICAgICAidXNlIHRoZSBzdGF0aWMtdGhyZXNoIHByaXZhdGUgb3B0aW9uIGluc3RlYWQuXG4iKTsKLSAgICAgICAgY3R4LT5zdGF0aWNfdGhyZXNoID0gYXZjdHgtPm1iX3RocmVzaG9sZDsKLSAgICB9Ci0gICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOEVfU0VUX1NUQVRJQ19USFJFU0hPTEQsICBjdHgtPnN0YXRpY190aHJlc2gpOwogICAgIGlmIChjdHgtPmNyZiA+PSAwKQogICAgICAgICBjb2RlY2N0bF9pbnQoYXZjdHgsIFZQOEVfU0VUX0NRX0xFVkVMLCAgICAgICAgICBjdHgtPmNyZik7CkBAIC02NTQsMTIgKzcwMiwyMSBAQAogICAgICAgICAgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDlFX1NFVF9GUkFNRV9QQVJBTExFTF9ERUNPRElORywgY3R4LT5mcmFtZV9wYXJhbGxlbCk7CiAgICAgICAgIGlmIChjdHgtPmFxX21vZGUgPj0gMCkKICAgICAgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA5RV9TRVRfQVFfTU9ERSwgY3R4LT5hcV9tb2RlKTsKLSNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+IDgKICAgICAgICAgc2V0X2NvbG9yc3BhY2UoYXZjdHgpOwotI2VuZGlmCiAjaWYgVlBYX0VOQ09ERVJfQUJJX1ZFUlNJT04gPj0gMTEKICAgICAgICAgc2V0X2NvbG9yX3JhbmdlKGF2Y3R4KTsKICNlbmRpZgorI2lmIFZQWF9FTkNPREVSX0FCSV9WRVJTSU9OID49IDEyCisgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA5RV9TRVRfVEFSR0VUX0xFVkVMLCBjdHgtPmxldmVsIDwgMCA/IDI1NSA6IGxyaW50KGN0eC0+bGV2ZWwgKiAxMCkpOworI2VuZGlmCisjaWZkZWYgVlBYX0NUUkxfVlA5RV9TRVRfUk9XX01UCisgICAgICAgIGlmIChjdHgtPnJvd19tdCA+PSAwKQorICAgICAgICAgICAgY29kZWNjdGxfaW50KGF2Y3R4LCBWUDlFX1NFVF9ST1dfTVQsIGN0eC0+cm93X210KTsKKyNlbmRpZgorI2lmZGVmIFZQWF9DVFJMX1ZQOUVfU0VUX1RVTkVfQ09OVEVOVAorICAgICAgICBpZiAoY3R4LT50dW5lX2NvbnRlbnQgPj0gMCkKKyAgICAgICAgICAgIGNvZGVjY3RsX2ludChhdmN0eCwgVlA5RV9TRVRfVFVORV9DT05URU5ULCBjdHgtPnR1bmVfY29udGVudCk7CisjZW5kaWYKICAgICB9CiAjZW5kaWYKIApAQCAtNjY4LDcgKzcyNSw3IEBACiAgICAgLy9wcm92aWRlIGR1bW15IHZhbHVlIHRvIGluaXRpYWxpemUgd3JhcHBlciwgdmFsdWVzIHdpbGwgYmUgdXBkYXRlZCBlYWNoIF9lbmNvZGUoKQogICAgIHZweF9pbWdfd3JhcCgmY3R4LT5yYXdpbWcsIGltZ19mbXQsIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMSwKICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIqKTEpOwotI2lmIENPTkZJR19MSUJWUFhfVlA5X0VOQ09ERVIgJiYgZGVmaW5lZChWUFhfSU1HX0ZNVF9ISUdIQklUREVQVEgpCisjaWYgQ09ORklHX0xJQlZQWF9WUDlfRU5DT0RFUgogICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA5ICYmIChjb2RlY19jYXBzICYgVlBYX0NPREVDX0NBUF9ISUdIQklUREVQVEgpKQogICAgICAgICBjdHgtPnJhd2ltZy5iaXRfZGVwdGggPSBlbmNjZmcuZ19iaXRfZGVwdGg7CiAjZW5kaWYKQEAgLTY5NSw3ICs3NTIsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGN4X3BrdGNweShzdHJ1Y3QgRnJhbWVMaXN0RGF0YSAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdnB4X2NvZGVjX2N4X3BrdCAqc3JjX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhDb250ZXh0ICpjdHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQeENvbnRleHQgKmN0eCkKIHsKICAgICBkc3QtPnB0cyAgICAgID0gc3JjLT5kYXRhLmZyYW1lLnB0czsKICAgICBkc3QtPmR1cmF0aW9uID0gc3JjLT5kYXRhLmZyYW1lLmR1cmF0aW9uOwpAQCAtODE0LDcgKzg3MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgcXVldWVfZnJhbWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdF9vdXQpCiB7Ci0gICAgVlA4Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWUHhDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGNvbnN0IHN0cnVjdCB2cHhfY29kZWNfY3hfcGt0ICpwa3Q7CiAgICAgY29uc3Qgc3RydWN0IHZweF9jb2RlY19jeF9wa3QgKnBrdF9hbHBoYSA9IE5VTEw7CiAgICAgY29uc3Qgdm9pZCAqaXRlciA9IE5VTEw7CkBAIC05MTQsMTAgKzk3MSwxMCBAQAogICAgIHJldHVybiBzaXplOwogfQogCi1zdGF0aWMgaW50IHZwOF9lbmNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorc3RhdGljIGludCB2cHhfZW5jb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQogewotICAgIFZQOENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVlB4Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBzdHJ1Y3QgdnB4X2ltYWdlICpyYXdpbWcgPSBOVUxMOwogICAgIHN0cnVjdCB2cHhfaW1hZ2UgKnJhd2ltZ19hbHBoYSA9IE5VTEw7CiAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAwOwpAQCAtOTUyLDYgKzEwMDksMTYgQEAKICAgICAgICAgICAgIHJhd2ltZ19hbHBoYS0+c3RyaWRlW1ZQWF9QTEFORV9WXSA9IGZyYW1lLT5saW5lc2l6ZVsyXTsKICAgICAgICAgfQogICAgICAgICB0aW1lc3RhbXAgICAgICAgICAgICAgICAgICAgPSBmcmFtZS0+cHRzOworI2lmIFZQWF9JTUFHRV9BQklfVkVSU0lPTiA+PSA0CisgICAgICAgIHN3aXRjaCAoZnJhbWUtPmNvbG9yX3JhbmdlKSB7CisgICAgICAgIGNhc2UgQVZDT0xfUkFOR0VfTVBFRzoKKyAgICAgICAgICAgIHJhd2ltZy0+cmFuZ2UgPSBWUFhfQ1JfU1RVRElPX1JBTkdFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZDT0xfUkFOR0VfSlBFRzoKKyAgICAgICAgICAgIHJhd2ltZy0+cmFuZ2UgPSBWUFhfQ1JfRlVMTF9SQU5HRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKICAgICAgICAgaWYgKGZyYW1lLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCiAgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CiAgICAgfQpAQCAtOTk2LDE3ICsxMDYzLDEyIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLSNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFZQOENvbnRleHQsIHgpCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihWUHhDb250ZXh0LCB4KQogI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCiAKLSNpZm5kZWYgVlBYX0VSUk9SX1JFU0lMSUVOVF9ERUZBVUxUCi0jZGVmaW5lIFZQWF9FUlJPUl9SRVNJTElFTlRfREVGQVVMVCAxCi0jZGVmaW5lIFZQWF9FUlJPUl9SRVNJTElFTlRfUEFSVElUSU9OUyAyCi0jZW5kaWYKLQogI2RlZmluZSBDT01NT05fT1BUSU9OUyBcCiAgICAgeyAiYXV0by1hbHQtcmVmIiwgICAgIkVuYWJsZSB1c2Ugb2YgYWx0ZXJuYXRlIHJlZmVyZW5jZSAiIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVzICgyLXBhc3Mgb25seSkiLCAgICAgICAgICAgICAgICAgICBPRkZTRVQoYXV0b19hbHRfcmVmKSwgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAtMX0sICAgICAtMSwgICAgICAxLCAgICAgICBWRX0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWVzICgyLXBhc3Mgb25seSkiLCAgICAgICAgICAgICAgICAgICBPRkZTRVQoYXV0b19hbHRfcmVmKSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICAyLCAgICAgICBWRX0sIFwKICAgICB7ICJsYWctaW4tZnJhbWVzIiwgICAiTnVtYmVyIG9mIGZyYW1lcyB0byBsb29rIGFoZWFkIGZvciAiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYWx0ZXJuYXRlIHJlZmVyZW5jZSBmcmFtZSBzZWxlY3Rpb24iLCAgICBPRkZTRVQobGFnX2luX2ZyYW1lcyksICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICBJTlRfTUFYLCBWRX0sIFwKICAgICB7ICJhcm5yLW1heGZyYW1lcyIsICAiYWx0cmVmIG5vaXNlIHJlZHVjdGlvbiBtYXggZnJhbWUgY291bnQiLCBPRkZTRVQoYXJucl9tYXhfZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgICAgICAtMSwgICAgICBJTlRfTUFYLCBWRX0sIFwKQEAgLTEwMjksMjMgKzEwOTEsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiYnkgdGhlIGJvb2wgZGVjb2RlciwgbWVhbmluZyB0aGF0IHBhcnRpdGlvbnMgY2FuIGJlIGRlY29kZWQgZXZlbiAiIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAidGhvdWdoIGVhcmxpZXIgcGFydGl0aW9ucyBoYXZlIGJlZW4gbG9zdC4gTm90ZSB0aGF0IGludHJhIHByZWRpY2l0aW9uIiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBzdGlsbCBkb25lIG92ZXIgdGhlIHBhcnRpdGlvbiBib3VuZGFyeS4iLCAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBWUFhfRVJST1JfUkVTSUxJRU5UX1BBUlRJVElPTlN9LCAwLCAwLCBWRSwgImVyIn0sIFwKLSAgICB7ICJjcmYiLCAgICAgICAgICAgICAgIlNlbGVjdCB0aGUgcXVhbGl0eSBmb3IgY29uc3RhbnQgcXVhbGl0eSBtb2RlIiwgb2Zmc2V0b2YoVlA4Q29udGV4dCwgY3JmKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIDYzLCBWRSB9LCBcCisgICAgeyAiY3JmIiwgICAgICAgICAgICAgICJTZWxlY3QgdGhlIHF1YWxpdHkgZm9yIGNvbnN0YW50IHF1YWxpdHkgbW9kZSIsIG9mZnNldG9mKFZQeENvbnRleHQsIGNyZiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCA2MywgVkUgfSwgXAogICAgIHsgInN0YXRpYy10aHJlc2giLCAgICAiQSBjaGFuZ2UgdGhyZXNob2xkIG9uIGJsb2NrcyBiZWxvdyB3aGljaCB0aGV5IHdpbGwgYmUgc2tpcHBlZCBieSB0aGUgZW5jb2RlciIsIE9GRlNFVChzdGF0aWNfdGhyZXNoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIFZFIH0sIFwKLSAgICB7ICJkcm9wLXRocmVzaG9sZCIsICAgIkZyYW1lIGRyb3AgdGhyZXNob2xkIiwgb2Zmc2V0b2YoVlA4Q29udGV4dCwgZHJvcF90aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSB9LCBcCisgICAgeyAiZHJvcC10aHJlc2hvbGQiLCAgICJGcmFtZSBkcm9wIHRocmVzaG9sZCIsIG9mZnNldG9mKFZQeENvbnRleHQsIGRyb3BfdGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUgfSwgXAogICAgIHsgIm5vaXNlLXNlbnNpdGl2aXR5IiwgIk5vaXNlIHNlbnNpdGl2aXR5IiwgT0ZGU0VUKG5vaXNlX3NlbnNpdGl2aXR5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgMCwgNCwgVkV9LCBcCiAgICAgeyAidW5kZXJzaG9vdC1wY3QiLCAgIkRhdGFyYXRlIHVuZGVyc2hvb3QgKG1pbikgdGFyZ2V0ICglKSIsIE9GRlNFVChyY191bmRlcnNob290X3BjdCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIDEwMCwgVkUgfSwgXAogICAgIHsgIm92ZXJzaG9vdC1wY3QiLCAgICJEYXRhcmF0ZSBvdmVyc2hvb3QgKG1heCkgdGFyZ2V0ICglKSIsIE9GRlNFVChyY19vdmVyc2hvb3RfcGN0KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAtMSwgMTAwMCwgVkUgfSwgXAogCiAjZGVmaW5lIExFR0FDWV9PUFRJT05TIFwKLSAgICB7InNwZWVkIiwgIiIsIG9mZnNldG9mKFZQOENvbnRleHQsIGNwdV91c2VkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDF9LCAtMTYsIDE2LCBWRX0sIFwKLSAgICB7InF1YWxpdHkiLCAiIiwgb2Zmc2V0b2YoVlA4Q29udGV4dCwgZGVhZGxpbmUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gVlBYX0RMX0dPT0RfUVVBTElUWX0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAicXVhbGl0eSJ9LCBcCi0gICAgeyJ2cDhmbGFncyIsICIiLCBvZmZzZXRvZihWUDhDb250ZXh0LCBmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IDB9LCAwLCBVSU5UX01BWCwgVkUsICJmbGFncyJ9LCBcCisgICAgeyJzcGVlZCIsICIiLCBvZmZzZXRvZihWUHhDb250ZXh0LCBjcHVfdXNlZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgLTE2LCAxNiwgVkV9LCBcCisgICAgeyJxdWFsaXR5IiwgIiIsIG9mZnNldG9mKFZQeENvbnRleHQsIGRlYWRsaW5lKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFZQWF9ETF9HT09EX1FVQUxJVFl9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgInF1YWxpdHkifSwgXAorICAgIHsidnA4ZmxhZ3MiLCAiIiwgb2Zmc2V0b2YoVlB4Q29udGV4dCwgZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSAwfSwgMCwgVUlOVF9NQVgsIFZFLCAiZmxhZ3MifSwgXAogICAgIHsiZXJyb3JfcmVzaWxpZW50IiwgImVuYWJsZSBlcnJvciByZXNpbGllbmNlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVlA4Rl9FUlJPUl9SRVNJTElFTlR9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImZsYWdzIn0sIFwKICAgICB7ImFsdHJlZiIsICJlbmFibGUgdXNlIG9mIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWVzIChWUDgvMi1wYXNzIG9ubHkpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVlA4Rl9BVVRPX0FMVF9SRUZ9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImZsYWdzIn0sIFwKLSAgICB7ImFybnJfbWF4X2ZyYW1lcyIsICJhbHRyZWYgbm9pc2UgcmVkdWN0aW9uIG1heCBmcmFtZSBjb3VudCIsIG9mZnNldG9mKFZQOENvbnRleHQsIGFybnJfbWF4X2ZyYW1lcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgMTUsIFZFfSwgXAotICAgIHsiYXJucl9zdHJlbmd0aCIsICJhbHRyZWYgbm9pc2UgcmVkdWN0aW9uIGZpbHRlciBzdHJlbmd0aCIsIG9mZnNldG9mKFZQOENvbnRleHQsIGFybnJfc3RyZW5ndGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gM30sIDAsIDYsIFZFfSwgXAotICAgIHsiYXJucl90eXBlIiwgImFsdHJlZiBub2lzZSByZWR1Y3Rpb24gZmlsdGVyIHR5cGUiLCBvZmZzZXRvZihWUDhDb250ZXh0LCBhcm5yX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gM30sIDEsIDMsIFZFfSwgXAotICAgIHsicmNfbG9va2FoZWFkIiwgIk51bWJlciBvZiBmcmFtZXMgdG8gbG9vayBhaGVhZCBmb3IgYWx0ZXJuYXRlIHJlZmVyZW5jZSBmcmFtZSBzZWxlY3Rpb24iLCBvZmZzZXRvZihWUDhDb250ZXh0LCBsYWdfaW5fZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDI1fSwgMCwgMjUsIFZFfSwgXAorICAgIHsiYXJucl9tYXhfZnJhbWVzIiwgImFsdHJlZiBub2lzZSByZWR1Y3Rpb24gbWF4IGZyYW1lIGNvdW50Iiwgb2Zmc2V0b2YoVlB4Q29udGV4dCwgYXJucl9tYXhfZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxNSwgVkV9LCBcCisgICAgeyJhcm5yX3N0cmVuZ3RoIiwgImFsdHJlZiBub2lzZSByZWR1Y3Rpb24gZmlsdGVyIHN0cmVuZ3RoIiwgb2Zmc2V0b2YoVlB4Q29udGV4dCwgYXJucl9zdHJlbmd0aCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAzfSwgMCwgNiwgVkV9LCBcCisgICAgeyJhcm5yX3R5cGUiLCAiYWx0cmVmIG5vaXNlIHJlZHVjdGlvbiBmaWx0ZXIgdHlwZSIsIG9mZnNldG9mKFZQeENvbnRleHQsIGFybnJfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAzfSwgMSwgMywgVkV9LCBcCisgICAgeyJyY19sb29rYWhlYWQiLCAiTnVtYmVyIG9mIGZyYW1lcyB0byBsb29rIGFoZWFkIGZvciBhbHRlcm5hdGUgcmVmZXJlbmNlIGZyYW1lIHNlbGVjdGlvbiIsIG9mZnNldG9mKFZQeENvbnRleHQsIGxhZ19pbl9mcmFtZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMjV9LCAwLCAyNSwgVkV9LCBcCiAKICNpZiBDT05GSUdfTElCVlBYX1ZQOF9FTkNPREVSCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gdnA4X29wdGlvbnNbXSA9IHsKQEAgLTEwNjQsMTEgKzExMjYsMzcgQEAKICAgICB7ICJ0aWxlLWNvbHVtbnMiLCAgICAiTnVtYmVyIG9mIHRpbGUgY29sdW1ucyB0byB1c2UsIGxvZzIiLCAgICAgICAgIE9GRlNFVCh0aWxlX2NvbHVtbnMpLCAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgNiwgVkV9LAogICAgIHsgInRpbGUtcm93cyIsICAgICAgICJOdW1iZXIgb2YgdGlsZSByb3dzIHRvIHVzZSwgbG9nMiIsICAgICAgICAgICAgT0ZGU0VUKHRpbGVfcm93cyksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCAyLCBWRX0sCiAgICAgeyAiZnJhbWUtcGFyYWxsZWwiLCAgIkVuYWJsZSBmcmFtZSBwYXJhbGxlbCBkZWNvZGFiaWxpdHkgZmVhdHVyZXMiLCBPRkZTRVQoZnJhbWVfcGFyYWxsZWwpLCAgQVZfT1BUX1RZUEVfQk9PTCx7Lmk2NCA9IC0xfSwgLTEsIDEsIFZFfSwKKyNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+PSAxMgorICAgIHsgImFxLW1vZGUiLCAgICAgICAgICJhZGFwdGl2ZSBxdWFudGl6YXRpb24gbW9kZSIsICAgICAgICAgICAgICAgICAgT0ZGU0VUKGFxX21vZGUpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCA0LCBWRSwgImFxX21vZGUifSwKKyNlbHNlCiAgICAgeyAiYXEtbW9kZSIsICAgICAgICAgImFkYXB0aXZlIHF1YW50aXphdGlvbiBtb2RlIiwgICAgICAgICAgICAgICAgICBPRkZTRVQoYXFfbW9kZSksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIDMsIFZFLCAiYXFfbW9kZSJ9LAorI2VuZGlmCiAgICAgeyAibm9uZSIsICAgICAgICAgICAgIkFxIG5vdCB1c2VkIiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAwfSwgMCwgMCwgVkUsICJhcV9tb2RlIiB9LAogICAgIHsgInZhcmlhbmNlIiwgICAgICAgICJWYXJpYW5jZSBiYXNlZCBBcSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMX0sIDAsIDAsIFZFLCAiYXFfbW9kZSIgfSwKICAgICB7ICJjb21wbGV4aXR5IiwgICAgICAiQ29tcGxleGl0eSBiYXNlZCBBcSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDJ9LCAwLCAwLCBWRSwgImFxX21vZGUiIH0sCiAgICAgeyAiY3ljbGljIiwgICAgICAgICAgIkN5Y2xpYyBSZWZyZXNoIEFxIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAzfSwgMCwgMCwgVkUsICJhcV9tb2RlIiB9LAorI2lmIFZQWF9FTkNPREVSX0FCSV9WRVJTSU9OID49IDEyCisgICAgeyAiZXF1YXRvcjM2MCIsICAgICAgIjM2MCB2aWRlbyBBcSIsICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSA0fSwgMCwgMCwgVkUsICJhcV9tb2RlIiB9LAorICAgIHsibGV2ZWwiLCAiU3BlY2lmeSBsZXZlbCIsIE9GRlNFVChsZXZlbCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0tMX0sIC0xLCA2LjIsIFZFfSwKKyNlbmRpZgorI2lmZGVmIFZQWF9DVFJMX1ZQOUVfU0VUX1JPV19NVAorICAgIHsicm93LW10IiwgIlJvdyBiYXNlZCBtdWx0aS10aHJlYWRpbmciLCBPRkZTRVQocm93X210KSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAtMX0sIC0xLCAxLCBWRX0sCisjZW5kaWYKKyNpZmRlZiBWUFhfQ1RSTF9WUDlFX1NFVF9UVU5FX0NPTlRFTlQKKyNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+PSAxNAorICAgIHsgInR1bmUtY29udGVudCIsICAgICJUdW5lIGNvbnRlbnQgdHlwZSIsIE9GRlNFVCh0dW5lX2NvbnRlbnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgMiwgVkUsICJ0dW5lX2NvbnRlbnQiIH0sCisjZWxzZQorICAgIHsgInR1bmUtY29udGVudCIsICAgICJUdW5lIGNvbnRlbnQgdHlwZSIsIE9GRlNFVCh0dW5lX2NvbnRlbnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgMSwgVkUsICJ0dW5lX2NvbnRlbnQiIH0sCisjZW5kaWYKKyAgICB7ICJkZWZhdWx0IiwgICAgICAgICAiUmVndWxhciB2aWRlbyBjb250ZW50IiwgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAwfSwgMCwgMCwgVkUsICJ0dW5lX2NvbnRlbnQiIH0sCisgICAgeyAic2NyZWVuIiwgICAgICAgICAgIlNjcmVlbiBjYXB0dXJlIGNvbnRlbnQiLCAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMX0sIDAsIDAsIFZFLCAidHVuZV9jb250ZW50IiB9LAorI2lmIFZQWF9FTkNPREVSX0FCSV9WRVJTSU9OID49IDE0CisgICAgeyAiZmlsbSIsICAgICAgICAgICAgIkZpbG0gY29udGVudDsgaW1wcm92ZXMgZ3JhaW4gcmV0ZW50aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMn0sIDAsIDAsIFZFLCAidHVuZV9jb250ZW50IiB9LAorI2VuZGlmCisjZW5kaWYKKyNpZiBWUFhfRU5DT0RFUl9BQklfVkVSU0lPTiA+PSAxNAorICAgIHsgImNvcnB1cy1jb21wbGV4aXR5IiwgImNvcnB1cyB2YnIgY29tcGxleGl0eSBtaWRwb2ludCIsIE9GRlNFVChjb3JwdXNfY29tcGxleGl0eSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCAxMDAwMCwgVkUgfSwKKyNlbmRpZgogICAgIExFR0FDWV9PUFRJT05TCiAgICAgeyBOVUxMIH0KIH07CkBAIC0xMTAzLDE0ICsxMTkxLDE1IEBACiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImxpYnZweCBWUDgiKSwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA4LAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWUDhDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlB4Q29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgID0gdnA4X2luaXQsCi0gICAgLmVuY29kZTIgICAgICAgID0gdnA4X2VuY29kZSwKLSAgICAuY2xvc2UgICAgICAgICAgPSB2cDhfZnJlZSwKKyAgICAuZW5jb2RlMiAgICAgICAgPSB2cHhfZW5jb2RlLAorICAgIC5jbG9zZSAgICAgICAgICA9IHZweF9mcmVlLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9BVVRPX1RIUkVBRFMsCiAgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX05PTkUgfSwKICAgICAucHJpdl9jbGFzcyAgICAgPSAmY2xhc3NfdnA4LAogICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJ2cHgiLAogfTsKICNlbmRpZiAvKiBDT05GSUdfTElCVlBYX1ZQOF9FTkNPREVSICovCiAKQEAgLTExMzIsMTQgKzEyMjEsMTUgQEAKICAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgibGlidnB4IFZQOSIpLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDksCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZQOENvbnRleHQpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWUHhDb250ZXh0KSwKICAgICAuaW5pdCAgICAgICAgICAgPSB2cDlfaW5pdCwKLSAgICAuZW5jb2RlMiAgICAgICAgPSB2cDhfZW5jb2RlLAotICAgIC5jbG9zZSAgICAgICAgICA9IHZwOF9mcmVlLAorICAgIC5lbmNvZGUyICAgICAgICA9IHZweF9lbmNvZGUsCisgICAgLmNsb3NlICAgICAgICAgID0gdnB4X2ZyZWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0FVVE9fVEhSRUFEUywKICAgICAucHJvZmlsZXMgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl92cDlfcHJvZmlsZXMpLAogICAgIC5wcml2X2NsYXNzICAgICA9ICZjbGFzc192cDksCiAgICAgLmRlZmF1bHRzICAgICAgID0gZGVmYXVsdHMsCiAgICAgLmluaXRfc3RhdGljX2RhdGEgPSBmZl92cDlfaW5pdF9zdGF0aWMsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYnZweCIsCiB9OwogI2VuZGlmIC8qIENPTkZJR19MSUJWUFhfVlA5X0VOQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlid2F2cGFja2VuYy5jIGIvbGliYXZjb2RlYy9saWJ3YXZwYWNrZW5jLmMKaW5kZXggNmQ1NzA4OS4uZTg0YjA3NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJ3YXZwYWNrZW5jLmMKKysrIGIvbGliYXZjb2RlYy9saWJ3YXZwYWNrZW5jLmMKQEAgLTE5MSw0ICsxOTEsNSBAQAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FLAogICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX1MzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYndhdnBhY2siLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlid2VicGVuYy5jIGIvbGliYXZjb2RlYy9saWJ3ZWJwZW5jLmMKaW5kZXggMGJjZjYyOC4uNDhmNDViNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJ3ZWJwZW5jLmMKKysrIGIvbGliYXZjb2RlYy9saWJ3ZWJwZW5jLmMKQEAgLTEwOSw0ICsxMDksNSBAQAogICAgIH0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzLAogICAgIC5kZWZhdWx0cyAgICAgICA9IGxpYndlYnBfZGVmYXVsdHMsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYndlYnAiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlid2VicGVuY19hbmltZW5jb2Rlci5jIGIvbGliYXZjb2RlYy9saWJ3ZWJwZW5jX2FuaW1lbmNvZGVyLmMKaW5kZXggZDc0MzdhOS4uN2YzNWEwYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJ3ZWJwZW5jX2FuaW1lbmNvZGVyLmMKKysrIGIvbGliYXZjb2RlYy9saWJ3ZWJwZW5jX2FuaW1lbmNvZGVyLmMKQEAgLTQxLDggKzQxLDkgQEAKICAgICBpbnQgcmV0ID0gZmZfbGlid2VicF9lbmNvZGVfaW5pdF9jb21tb24oYXZjdHgpOwogICAgIGlmICghcmV0KSB7CiAgICAgICAgIExpYldlYlBBbmltQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgICAgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgZW5jX29wdGlvbnM7CisgICAgICAgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgZW5jX29wdGlvbnMgPSB7IHsgMCB9IH07CiAgICAgICAgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0KCZlbmNfb3B0aW9ucyk7CisgICAgICAgIGVuY19vcHRpb25zLnZlcmJvc2UgPSBhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX1ZFUkJPU0U7CiAgICAgICAgIC8vIFRPRE8odXJ2YW5nKTogRXhwb3NlIHNvbWUgb3B0aW9ucyBvbiBjb21tYW5kLWxpbmUgcGVyaGFwcy4KICAgICAgICAgcy0+ZW5jID0gV2ViUEFuaW1FbmNvZGVyTmV3KGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgJmVuY19vcHRpb25zKTsKICAgICAgICAgaWYgKCFzLT5lbmMpCkBAIC0xNDcsNCArMTQ4LDUgQEAKICAgICB9LAogICAgIC5wcml2X2NsYXNzICAgICA9ICZjbGFzcywKICAgICAuZGVmYXVsdHMgICAgICAgPSBsaWJ3ZWJwX2RlZmF1bHRzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJ3ZWJwIiwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYngyNjQuYyBiL2xpYmF2Y29kZWMvbGlieDI2NC5jCmluZGV4IDUwMzBkNjUuLjgwMWFmZmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlieDI2NC5jCisrKyBiL2xpYmF2Y29kZWMvbGlieDI2NC5jCkBAIC0yNDQsMTEgKzI0NCwyMyBAQAogICAgICAgICBjYXNlIEFWX1NURVJFTzNEX0ZSQU1FU0VRVUVOQ0U6CiAgICAgICAgICAgICBmcGFfdHlwZSA9IDU7CiAgICAgICAgICAgICBicmVhazsKKyNpZiBYMjY0X0JVSUxEID49IDE0NQorICAgICAgICBjYXNlIEFWX1NURVJFTzNEXzJEOgorICAgICAgICAgICAgZnBhX3R5cGUgPSA2OworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGZwYV90eXBlID0gLTE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIC8qIEludmVydGVkIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB4MjY0ICovCisgICAgICAgIGlmIChzdGVyZW8tPmZsYWdzICYgQVZfU1RFUkVPM0RfRkxBR19JTlZFUlQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyB1bnN1cHBvcnRlZCBpbnZlcnRlZCBzdGVyZW8gdmFsdWUgJWRcbiIsIGZwYV90eXBlKTsKKyAgICAgICAgICAgIGZwYV90eXBlID0gLTE7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoZnBhX3R5cGUgIT0geDQtPnBhcmFtcy5pX2ZyYW1lX3BhY2tpbmcpIHsKICAgICAgICAgICAgIHg0LT5wYXJhbXMuaV9mcmFtZV9wYWNraW5nID0gZnBhX3R5cGU7CiAgICAgICAgICAgICB4MjY0X2VuY29kZXJfcmVjb25maWcoeDQtPmVuYywgJng0LT5wYXJhbXMpOwpAQCAtMjY0LDExICsyNzYsMTQgQEAKICAgICBpbnQgbm5hbCwgaSwgcmV0OwogICAgIHgyNjRfcGljdHVyZV90IHBpY19vdXQgPSB7MH07CiAgICAgaW50IHBpY3RfdHlwZTsKLSAgICBBVkZyYW1lU2lkZURhdGEgKnNpZGVfZGF0YTsKIAogICAgIHgyNjRfcGljdHVyZV9pbml0KCAmeDQtPnBpYyApOwogICAgIHg0LT5waWMuaW1nLmlfY3NwICAgPSB4NC0+cGFyYW1zLmlfY3NwOworI2lmIFgyNjRfQlVJTEQgPj0gMTUzCisgICAgaWYgKHg0LT5wYXJhbXMuaV9iaXRkZXB0aCA+IDgpCisjZWxzZQogICAgIGlmICh4MjY0X2JpdF9kZXB0aCA+IDgpCisjZW5kaWYKICAgICAgICAgeDQtPnBpYy5pbWcuaV9jc3AgfD0gWDI2NF9DU1BfSElHSF9ERVBUSDsKICAgICB4NC0+cGljLmltZy5pX3BsYW5lID0gYXZmbXQyX251bV9wbGFuZXMoY3R4LT5waXhfZm10KTsKIApAQCAtMjgyLDggKzI5Nyw4IEBACiAKICAgICAgICAgc3dpdGNoIChmcmFtZS0+cGljdF90eXBlKSB7CiAgICAgICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0k6Ci0gICAgICAgICAgICB4NC0+cGljLmlfdHlwZSA9IHg0LT5mb3JjZWRfaWRyID49IDAgPyBYMjY0X1RZUEVfSURSCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYMjY0X1RZUEVfS0VZRlJBTUU7CisgICAgICAgICAgICB4NC0+cGljLmlfdHlwZSA9IHg0LT5mb3JjZWRfaWRyID4gMCA/IFgyNjRfVFlQRV9JRFIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWDI2NF9UWVBFX0tFWUZSQU1FOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX1A6CiAgICAgICAgICAgICB4NC0+cGljLmlfdHlwZSA9IFgyNjRfVFlQRV9QOwpAQCAtMjk4LDQ2ICszMTMsMjkgQEAKICAgICAgICAgcmVjb25maWdfZW5jb2RlcihjdHgsIGZyYW1lKTsKIAogICAgICAgICBpZiAoeDQtPmE1M19jYykgewotICAgICAgICAgICAgc2lkZV9kYXRhID0gYXZfZnJhbWVfZ2V0X3NpZGVfZGF0YShmcmFtZSwgQVZfRlJBTUVfREFUQV9BNTNfQ0MpOwotICAgICAgICAgICAgaWYgKHNpZGVfZGF0YSkgeworICAgICAgICAgICAgdm9pZCAqc2VpX2RhdGE7CisgICAgICAgICAgICBzaXplX3Qgc2VpX3NpemU7CisKKyAgICAgICAgICAgIHJldCA9IGZmX2FsbG9jX2E1M19zZWkoZnJhbWUsIDAsICZzZWlfZGF0YSwgJnNlaV9zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGNsb3NlZCBjYXB0aW9ucywgc2tpcHBpbmdcbiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZWlfZGF0YSkgewogICAgICAgICAgICAgICAgIHg0LT5waWMuZXh0cmFfc2VpLnBheWxvYWRzID0gYXZfbWFsbG9jeihzaXplb2YoeDQtPnBpYy5leHRyYV9zZWkucGF5bG9hZHNbMF0pKTsKICAgICAgICAgICAgICAgICBpZiAoeDQtPnBpYy5leHRyYV9zZWkucGF5bG9hZHMgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY2xvc2VkIGNhcHRpb25zLCBza2lwcGluZ1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gc2tpcF9hNTNjYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeDQtPnBpYy5leHRyYV9zZWkuc2VpX2ZyZWUgPSBhdl9mcmVlOworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHNlaV9kYXRhKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB4NC0+cGljLmV4dHJhX3NlaS5zZWlfZnJlZSA9IGF2X2ZyZWU7CiAKLSAgICAgICAgICAgICAgICB4NC0+cGljLmV4dHJhX3NlaS5wYXlsb2Fkc1swXS5wYXlsb2FkX3NpemUgPSBzaWRlX2RhdGEtPnNpemUgKyAxMTsKLSAgICAgICAgICAgICAgICB4NC0+cGljLmV4dHJhX3NlaS5wYXlsb2Fkc1swXS5wYXlsb2FkID0gYXZfbWFsbG9jeih4NC0+cGljLmV4dHJhX3NlaS5wYXlsb2Fkc1swXS5wYXlsb2FkX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICh4NC0+cGljLmV4dHJhX3NlaS5wYXlsb2Fkc1swXS5wYXlsb2FkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGNsb3NlZCBjYXB0aW9ucywgc2tpcHBpbmdcbiIpOwotICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmeDQtPnBpYy5leHRyYV9zZWkucGF5bG9hZHMpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXBfYTUzY2M7CisgICAgICAgICAgICAgICAgICAgIHg0LT5waWMuZXh0cmFfc2VpLnBheWxvYWRzWzBdLnBheWxvYWRfc2l6ZSA9IHNlaV9zaXplOworICAgICAgICAgICAgICAgICAgICB4NC0+cGljLmV4dHJhX3NlaS5wYXlsb2Fkc1swXS5wYXlsb2FkID0gc2VpX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIHg0LT5waWMuZXh0cmFfc2VpLm51bV9wYXlsb2FkcyA9IDE7CisgICAgICAgICAgICAgICAgICAgIHg0LT5waWMuZXh0cmFfc2VpLnBheWxvYWRzWzBdLnBheWxvYWRfdHlwZSA9IDQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHg0LT5waWMuZXh0cmFfc2VpLm51bV9wYXlsb2FkcyA9IDE7Ci0gICAgICAgICAgICAgICAgeDQtPnBpYy5leHRyYV9zZWkucGF5bG9hZHNbMF0ucGF5bG9hZF90eXBlID0gNDsKLSAgICAgICAgICAgICAgICBtZW1jcHkoeDQtPnBpYy5leHRyYV9zZWkucGF5bG9hZHNbMF0ucGF5bG9hZCArIDEwLCBzaWRlX2RhdGEtPmRhdGEsIHNpZGVfZGF0YS0+c2l6ZSk7Ci0gICAgICAgICAgICAgICAgeDQtPnBpYy5leHRyYV9zZWkucGF5bG9hZHNbMF0ucGF5bG9hZFswXSA9IDE4MTsKLSAgICAgICAgICAgICAgICB4NC0+cGljLmV4dHJhX3NlaS5wYXlsb2Fkc1swXS5wYXlsb2FkWzFdID0gMDsKLSAgICAgICAgICAgICAgICB4NC0+cGljLmV4dHJhX3NlaS5wYXlsb2Fkc1swXS5wYXlsb2FkWzJdID0gNDk7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiAnR0E5NCcgaXMgc3RhbmRhcmQgaW4gTm9ydGggQW1lcmljYSBmb3IgQVRTQywgYnV0IGhhcmQgY29kaW5nCi0gICAgICAgICAgICAgICAgICogdGhpcyBzdHlsZSBtYXkgbm90IGJlIHRoZSByaWdodCB0aGluZyB0byBkbyAtLSBvdGhlciBmb3JtYXRzCi0gICAgICAgICAgICAgICAgICogZG8gZXhpc3QuIFRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgc2lkZV9kYXRhCi0gICAgICAgICAgICAgICAgICogc28gd2UgYXJlIGdvaW5nIHdpdGggdGhpcyByaWdodCBub3cuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQVZfV0wzMih4NC0+cGljLmV4dHJhX3NlaS5wYXlsb2Fkc1swXS5wYXlsb2FkICsgMywKLSAgICAgICAgICAgICAgICAgICAgTUtUQUcoJ0cnLCAnQScsICc5JywgJzQnKSk7Ci0gICAgICAgICAgICAgICAgeDQtPnBpYy5leHRyYV9zZWkucGF5bG9hZHNbMF0ucGF5bG9hZFs3XSA9IDM7Ci0gICAgICAgICAgICAgICAgeDQtPnBpYy5leHRyYV9zZWkucGF5bG9hZHNbMF0ucGF5bG9hZFs4XSA9Ci0gICAgICAgICAgICAgICAgICAgICgoc2lkZV9kYXRhLT5zaXplLzMpICYgMHgxZikgfCAweDQwOwotICAgICAgICAgICAgICAgIHg0LT5waWMuZXh0cmFfc2VpLnBheWxvYWRzWzBdLnBheWxvYWRbOV0gPSAwOwotICAgICAgICAgICAgICAgIHg0LT5waWMuZXh0cmFfc2VpLnBheWxvYWRzWzBdLnBheWxvYWRbc2lkZV9kYXRhLT5zaXplKzEwXSA9IDI1NTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLXNraXBfYTUzY2M6CisKICAgICBkbyB7CiAgICAgICAgIGlmICh4MjY0X2VuY29kZXJfZW5jb2RlKHg0LT5lbmMsICZuYWwsICZubmFsLCBmcmFtZT8gJng0LT5waWM6IE5VTEwsICZwaWNfb3V0KSA8IDApCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKQEAgLTQzMCw3ICs0MjgsNyBAQAogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDQ0UDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDk6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDogcmV0dXJuIFgyNjRfQ1NQX0k0NDQ7Ci0jaWZkZWYgWDI2NF9DU1BfQkdSCisjaWYgQ09ORklHX0xJQlgyNjRSR0JfRU5DT0RFUgogICAgIGNhc2UgQVZfUElYX0ZNVF9CR1IwOgogICAgICAgICByZXR1cm4gWDI2NF9DU1BfQkdSQTsKICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSMjQ6CkBAIC00OTYsNiArNDk0LDkgQEAKICAgICB4NC0+cGFyYW1zLnBfbG9nX3ByaXZhdGUgICAgICAgID0gYXZjdHg7CiAgICAgeDQtPnBhcmFtcy5pX2xvZ19sZXZlbCAgICAgICAgICA9IFgyNjRfTE9HX0RFQlVHOwogICAgIHg0LT5wYXJhbXMuaV9jc3AgICAgICAgICAgICAgICAgPSBjb252ZXJ0X3BpeF9mbXQoYXZjdHgtPnBpeF9mbXQpOworI2lmIFgyNjRfQlVJTEQgPj0gMTUzCisgICAgeDQtPnBhcmFtcy5pX2JpdGRlcHRoICAgICAgICAgICA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnBpeF9mbXQpLT5jb21wWzBdLmRlcHRoOworI2VuZGlmCiAKICAgICBQQVJTRV9YMjY0X09QVCgid2VpZ2h0cCIsIHdwcmVkcCk7CiAKQEAgLTcwNywyNCArNzA4LDggQEAKICAgICBpZiAoeDQtPm5hbF9ocmQgPj0gMCkKICAgICAgICAgeDQtPnBhcmFtcy5pX25hbF9ocmQgPSB4NC0+bmFsX2hyZDsKIAotICAgIGlmICh4NC0+bW90aW9uX2VzdCA+PSAwKSB7CisgICAgaWYgKHg0LT5tb3Rpb25fZXN0ID49IDApCiAgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IHg0LT5tb3Rpb25fZXN0OwotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGF2Y3R4LT5tZV9tZXRob2QgPT0gTUVfRVBaUykKLSAgICAgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFgyNjRfTUVfRElBOwotICAgICAgICBlbHNlIGlmIChhdmN0eC0+bWVfbWV0aG9kID09IE1FX0hFWCkKLSAgICAgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFgyNjRfTUVfSEVYOwotICAgICAgICBlbHNlIGlmIChhdmN0eC0+bWVfbWV0aG9kID09IE1FX1VNSCkKLSAgICAgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFgyNjRfTUVfVU1IOwotICAgICAgICBlbHNlIGlmIChhdmN0eC0+bWVfbWV0aG9kID09IE1FX0ZVTEwpCi0gICAgICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9tZXRob2QgPSBYMjY0X01FX0VTQTsKLSAgICAgICAgZWxzZSBpZiAoYXZjdHgtPm1lX21ldGhvZCA9PSBNRV9URVNBKQotICAgICAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfbWVfbWV0aG9kID0gWDI2NF9NRV9URVNBOwotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKLSAgICB9CiAKICAgICBpZiAoeDQtPmNvZGVyID49IDApCiAgICAgICAgIHg0LT5wYXJhbXMuYl9jYWJhYyA9IHg0LT5jb2RlcjsKQEAgLTc4Myw4ICs3NjgsOCBAQAogICAgIGlmKHg0LT54MjY0b3B0cyl7CiAgICAgICAgIGNvbnN0IGNoYXIgKnA9IHg0LT54MjY0b3B0czsKICAgICAgICAgd2hpbGUocCl7Ci0gICAgICAgICAgICBjaGFyIHBhcmFtWzI1Nl09ezB9LCB2YWxbMjU2XT17MH07Ci0gICAgICAgICAgICBpZihzc2NhbmYocCwgIiUyNTVbXjo9XT0lMjU1W146XSIsIHBhcmFtLCB2YWwpID09IDEpeworICAgICAgICAgICAgY2hhciBwYXJhbVs0MDk2XT17MH0sIHZhbFs0MDk2XT17MH07CisgICAgICAgICAgICBpZihzc2NhbmYocCwgIiU0MDk1W146PV09JTQwOTVbXjpdIiwgcGFyYW0sIHZhbCkgPT0gMSl7CiAgICAgICAgICAgICAgICAgT1BUX1NUUihwYXJhbSwgIjEiKTsKICAgICAgICAgICAgIH1lbHNlCiAgICAgICAgICAgICAgICAgT1BUX1NUUihwYXJhbSwgdmFsKTsKQEAgLTg4NCwyMyArODY5LDQ1IEBACiAgICAgQVZfUElYX0ZNVF9OVjIwLAogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNfYWxsW10gPSB7CisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgQVZfUElYX0ZNVF9OVjEyLAorICAgIEFWX1BJWF9GTVRfTlYxNiwKKyNpZmRlZiBYMjY0X0NTUF9OVjIxCisgICAgQVZfUElYX0ZNVF9OVjIxLAorI2VuZGlmCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgQVZfUElYX0ZNVF9OVjIwLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKyNpZiBDT05GSUdfTElCWDI2NFJHQl9FTkNPREVSCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzXzhiaXRfcmdiW10gPSB7Ci0jaWZkZWYgWDI2NF9DU1BfQkdSCiAgICAgQVZfUElYX0ZNVF9CR1IwLAogICAgIEFWX1BJWF9GTVRfQkdSMjQsCiAgICAgQVZfUElYX0ZNVF9SR0IyNCwKLSNlbmRpZgogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKKyNlbmRpZgogCiBzdGF0aWMgYXZfY29sZCB2b2lkIFgyNjRfaW5pdF9zdGF0aWMoQVZDb2RlYyAqY29kZWMpCiB7CisjaWYgWDI2NF9CVUlMRCA8IDE1MwogICAgIGlmICh4MjY0X2JpdF9kZXB0aCA9PSA4KQogICAgICAgICBjb2RlYy0+cGl4X2ZtdHMgPSBwaXhfZm10c184Yml0OwogICAgIGVsc2UgaWYgKHgyNjRfYml0X2RlcHRoID09IDkpCiAgICAgICAgIGNvZGVjLT5waXhfZm10cyA9IHBpeF9mbXRzXzliaXQ7CiAgICAgZWxzZSBpZiAoeDI2NF9iaXRfZGVwdGggPT0gMTApCiAgICAgICAgIGNvZGVjLT5waXhfZm10cyA9IHBpeF9mbXRzXzEwYml0OworI2Vsc2UKKyAgICBjb2RlYy0+cGl4X2ZtdHMgPSBwaXhfZm10c19hbGw7CisjZW5kaWYKIH0KIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoWDI2NENvbnRleHQsIHgpCkBAIC05MTMsNyArOTIwLDcgQEAKICAgICB7ImxldmVsIiwgIlNwZWNpZnkgbGV2ZWwgKGFzIGRlZmluZWQgYnkgQW5uZXggQSkiLCBPRkZTRVQobGV2ZWwpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAwLCAwLCBWRX0sCiAgICAgeyJwYXNzbG9nZmlsZSIsICJGaWxlbmFtZSBmb3IgMiBwYXNzIHN0YXRzIiwgT0ZGU0VUKHN0YXRzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMCwgVkV9LAogICAgIHsid3ByZWRwIiwgIldlaWdodGVkIHByZWRpY3Rpb24gZm9yIFAtZnJhbWVzIiwgT0ZGU0VUKHdwcmVkcCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIDAsIDAsIFZFfSwKLSAgICB7ImE1M2NjIiwgICAgICAgICAgIlVzZSBBNTMgQ2xvc2VkIENhcHRpb25zIChpZiBhdmFpbGFibGUpIiwgICAgICAgICAgT0ZGU0VUKGE1M19jYyksICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgIHsuaTY0ID0gMH0sIDAsIDEsIFZFfSwKKyAgICB7ImE1M2NjIiwgICAgICAgICAgIlVzZSBBNTMgQ2xvc2VkIENhcHRpb25zIChpZiBhdmFpbGFibGUpIiwgICAgICAgICAgT0ZGU0VUKGE1M19jYyksICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgIHsuaTY0ID0gMX0sIDAsIDEsIFZFfSwKICAgICB7IngyNjRvcHRzIiwgIngyNjQgb3B0aW9ucyIsIE9GRlNFVCh4MjY0b3B0cyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIDAsIDAsIFZFfSwKICAgICB7ICJjcmYiLCAgICAgICAgICAgIlNlbGVjdCB0aGUgcXVhbGl0eSBmb3IgY29uc3RhbnQgcXVhbGl0eSBtb2RlIiwgICAgT0ZGU0VUKGNyZiksICAgICAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsID0gLTEgfSwgLTEsIEZMVF9NQVgsIFZFIH0sCiAgICAgeyAiY3JmX21heCIsICAgICAgICJJbiBDUkYgbW9kZSwgcHJldmVudHMgVkJWIGZyb20gbG93ZXJpbmcgcXVhbGl0eSBiZXlvbmQgdGhpcyBwb2ludC4iLE9GRlNFVChjcmZfbWF4KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gLTEgfSwgLTEsIEZMVF9NQVgsIFZFIH0sCkBAIC05NjQsMTMgKzk3MSwxNCBAQAogICAgIHsgInZiciIsICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBYMjY0X05BTF9IUkRfVkJSfSwgIElOVF9NSU4sIElOVF9NQVgsIFZFLCAibmFsLWhyZCIgfSwKICAgICB7ICJjYnIiLCAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWDI2NF9OQUxfSFJEX0NCUn0sICBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgIm5hbC1ocmQiIH0sCiAgICAgeyAiYXZjaW50cmEtY2xhc3MiLCJBVkMtSW50cmEgY2xhc3MgNTAvMTAwLzIwMCIsICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChhdmNpbnRyYV9jbGFzcyksQVZfT1BUX1RZUEVfSU5ULCAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDIwMCAgICwgVkV9LAorICAgIHsgIm1lX21ldGhvZCIsICAgICJTZXQgbW90aW9uIGVzdGltYXRpb24gbWV0aG9kIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobW90aW9uX2VzdCksICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIFgyNjRfTUVfVEVTQSwgVkUsICJtb3Rpb24tZXN0In0sCiAgICAgeyAibW90aW9uLWVzdCIsICAgIlNldCBtb3Rpb24gZXN0aW1hdGlvbiBtZXRob2QiLCAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChtb3Rpb25fZXN0KSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAtMSB9LCAtMSwgWDI2NF9NRV9URVNBLCBWRSwgIm1vdGlvbi1lc3QifSwKICAgICB7ICJkaWEiLCAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFgyNjRfTUVfRElBIH0sICBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgIm1vdGlvbi1lc3QiIH0sCiAgICAgeyAiaGV4IiwgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBYMjY0X01FX0hFWCB9LCAgSU5UX01JTiwgSU5UX01BWCwgVkUsICJtb3Rpb24tZXN0IiB9LAogICAgIHsgInVtaCIsICAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gWDI2NF9NRV9VTUggfSwgIElOVF9NSU4sIElOVF9NQVgsIFZFLCAibW90aW9uLWVzdCIgfSwKICAgICB7ICJlc2EiLCAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFgyNjRfTUVfRVNBIH0sICBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgIm1vdGlvbi1lc3QiIH0sCiAgICAgeyAidGVzYSIsICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBYMjY0X01FX1RFU0EgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJtb3Rpb24tZXN0IiB9LAotICAgIHsgImZvcmNlZC1pZHIiLCAgICJJZiBmb3JjaW5nIGtleWZyYW1lcywgZm9yY2UgdGhlbSBhcyBJRFIgZnJhbWVzLiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChmb3JjZWRfaWRyKSwgIEFWX09QVF9UWVBFX0JPT0wsICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZFIH0sCisgICAgeyAiZm9yY2VkLWlkciIsICAgIklmIGZvcmNpbmcga2V5ZnJhbWVzLCBmb3JjZSB0aGVtIGFzIElEUiBmcmFtZXMuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZvcmNlZF9pZHIpLCAgQVZfT1BUX1RZUEVfQk9PTCwgICB7IC5pNjQgPSAwIH0sIC0xLCAxLCBWRSB9LAogICAgIHsgImNvZGVyIiwgICAgIkNvZGVyIHR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoY29kZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBWRSwgImNvZGVyIiB9LAogICAgIHsgImRlZmF1bHQiLCAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gLTEgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJjb2RlciIgfSwKICAgICB7ICJjYXZsYyIsICAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDAgfSwgIElOVF9NSU4sIElOVF9NQVgsIFZFLCAiY29kZXIiIH0sCkBAIC0xMDA4LDkgKzEwMTYsNiBAQAogICAgIHsgIm5yIiwgICAgICAgICAgICAgICAiLTEiIH0sCiAjZW5kaWYKICAgICB7ICJtZV9yYW5nZSIsICAgICAgICAgIi0xIiB9LAotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi0gICAgeyAibWVfbWV0aG9kIiwgICAgICAgICItMSIgfSwKLSNlbmRpZgogICAgIHsgInN1YnEiLCAgICAgICAgICAgICAiLTEiIH0sCiAjaWYgRkZfQVBJX1BSSVZBVEVfT1BUCiAgICAgeyAiYl9zdHJhdGVneSIsICAgICAgICItMSIgfSwKQEAgLTEwMzUsMTMgKzEwNDAsNiBAQAogICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAotc3RhdGljIGNvbnN0IEFWQ2xhc3MgcmdiY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAibGlieDI2NHJnYiIsCi0gICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKLSAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCi0gICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi19OwotCiBBVkNvZGVjIGZmX2xpYngyNjRfZW5jb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgICA9ICJsaWJ4MjY0IiwKICAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJsaWJ4MjY0IEguMjY0IC8gQVZDIC8gTVBFRy00IEFWQyAvIE1QRUctNCBwYXJ0IDEwIiksCkBAIC0xMDU1LDggKzEwNTMsMTcgQEAKICAgICAucHJpdl9jbGFzcyAgICAgICA9ICZ4MjY0X2NsYXNzLAogICAgIC5kZWZhdWx0cyAgICAgICAgID0geDI2NF9kZWZhdWx0cywKICAgICAuaW5pdF9zdGF0aWNfZGF0YSA9IFgyNjRfaW5pdF9zdGF0aWMsCi0gICAgLmNhcHNfaW50ZXJuYWwgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZGX0NPREVDX0NBUF9JTklUX0NMRUFOVVAsCisgICAgLmNhcHNfaW50ZXJuYWwgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC53cmFwcGVyX25hbWUgICAgID0gImxpYngyNjQiLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0xJQlgyNjRSR0JfRU5DT0RFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3MgcmdiY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGlieDI2NHJnYiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCiBBVkNvZGVjIGZmX2xpYngyNjRyZ2JfZW5jb2RlciA9IHsKQEAgLTEwNzIsNiArMTA3OSw3IEBACiAgICAgLnByaXZfY2xhc3MgICAgID0gJnJnYmNsYXNzLAogICAgIC5kZWZhdWx0cyAgICAgICA9IHgyNjRfZGVmYXVsdHMsCiAgICAgLnBpeF9mbXRzICAgICAgID0gcGl4X2ZtdHNfOGJpdF9yZ2IsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYngyNjQiLAogfTsKICNlbmRpZgogCkBAIC0xMDk2LDcgKzExMDQsNyBAQAogICAgIC5wcml2X2NsYXNzICAgICAgID0gJlgyNjJfY2xhc3MsCiAgICAgLmRlZmF1bHRzICAgICAgICAgPSB4MjY0X2RlZmF1bHRzLAogICAgIC5waXhfZm10cyAgICAgICAgID0gcGl4X2ZtdHNfOGJpdCwKLSAgICAuY2Fwc19pbnRlcm5hbCAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfAotICAgICAgICAgICAgICAgICAgICAgICAgRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKKyAgICAuY2Fwc19pbnRlcm5hbCAgICA9IEZGX0NPREVDX0NBUF9JTklUX0NMRUFOVVAsCisgICAgLndyYXBwZXJfbmFtZSAgICAgPSAibGlieDI2NCIsCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYngyNjUuYyBiL2xpYmF2Y29kZWMvbGlieDI2NS5jCmluZGV4IDY4YzdmYmEuLmMyMDhjMGYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlieDI2NS5jCisrKyBiL2xpYmF2Y29kZWMvbGlieDI2NS5jCkBAIC00Miw4ICs0MiwxMCBAQAogICAgIGNvbnN0IHgyNjVfYXBpICphcGk7CiAKICAgICBmbG9hdCBjcmY7CisgICAgaW50ICAgZm9yY2VkX2lkcjsKICAgICBjaGFyICpwcmVzZXQ7CiAgICAgY2hhciAqdHVuZTsKKyAgICBjaGFyICpwcm9maWxlOwogICAgIGNoYXIgKngyNjVfb3B0czsKIH0gbGlieDI2NUNvbnRleHQ7CiAKQEAgLTExMywxMSArMTE1LDIyIEBACiAgICAgY3R4LT5wYXJhbXMtPnNvdXJjZUhlaWdodCAgICA9IGF2Y3R4LT5oZWlnaHQ7CiAgICAgY3R4LT5wYXJhbXMtPmJFbmFibGVQc25yICAgICA9ICEhKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUFNOUik7CiAKLSAgICBpZiAoKGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgPD0gQVZDT0xfUFJJX0JUMjAyMCAmJgorICAgIC8qIFR1bmUgdGhlIENUVSBzaXplIGJhc2VkIG9uIGlucHV0IHJlc29sdXRpb24uICovCisgICAgaWYgKGN0eC0+cGFyYW1zLT5zb3VyY2VXaWR0aCA8IDY0IHx8IGN0eC0+cGFyYW1zLT5zb3VyY2VIZWlnaHQgPCA2NCkKKyAgICAgICAgY3R4LT5wYXJhbXMtPm1heENVU2l6ZSA9IDMyOworICAgIGlmIChjdHgtPnBhcmFtcy0+c291cmNlV2lkdGggPCAzMiB8fCBjdHgtPnBhcmFtcy0+c291cmNlSGVpZ2h0IDwgMzIpCisgICAgICAgIGN0eC0+cGFyYW1zLT5tYXhDVVNpemUgPSAxNjsKKyAgICBpZiAoY3R4LT5wYXJhbXMtPnNvdXJjZVdpZHRoIDwgMTYgfHwgY3R4LT5wYXJhbXMtPnNvdXJjZUhlaWdodCA8IDE2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW1hZ2Ugc2l6ZSBpcyB0b28gc21hbGwgKCVkeCVkKS5cbiIsCisgICAgICAgICAgICAgICBjdHgtPnBhcmFtcy0+c291cmNlV2lkdGgsIGN0eC0+cGFyYW1zLT5zb3VyY2VIZWlnaHQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICgoYXZjdHgtPmNvbG9yX3ByaW1hcmllcyA8PSBBVkNPTF9QUklfU01QVEU0MzIgJiYKICAgICAgICAgIGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgIT0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEKSB8fAotICAgICAgICAoYXZjdHgtPmNvbG9yX3RyYyA8PSBBVkNPTF9UUkNfQlQyMDIwXzEyICYmCisgICAgICAgIChhdmN0eC0+Y29sb3JfdHJjIDw9IEFWQ09MX1RSQ19BUklCX1NURF9CNjcgJiYKICAgICAgICAgIGF2Y3R4LT5jb2xvcl90cmMgIT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKSB8fAotICAgICAgICAoYXZjdHgtPmNvbG9yc3BhY2UgPD0gQVZDT0xfU1BDX0JUMjAyMF9DTCAmJgorICAgICAgICAoYXZjdHgtPmNvbG9yc3BhY2UgPD0gQVZDT0xfU1BDX0lDVENQICYmCiAgICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSAhPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQpKSB7CiAKICAgICAgICAgY3R4LT5wYXJhbXMtPnZ1aS5iRW5hYmxlVmlkZW9TaWduYWxUeXBlUHJlc2VudEZsYWcgID0gMTsKQEAgLTE1NCwxMSArMTY3LDI4IEBACiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMjoKICAgICAgICAgY3R4LT5wYXJhbXMtPmludGVybmFsQ3NwID0gWDI2NV9DU1BfSTQyMjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyOgorICAgICAgICBjdHgtPnBhcmFtcy0+dnVpLm1hdHJpeENvZWZmcyA9IEFWQ09MX1NQQ19SR0I7CisgICAgICAgIGN0eC0+cGFyYW1zLT52dWkuYkVuYWJsZVZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnICA9IDE7CisgICAgICAgIGN0eC0+cGFyYW1zLT52dWkuYkVuYWJsZUNvbG9yRGVzY3JpcHRpb25QcmVzZW50RmxhZyA9IDE7CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyOgogICAgICAgICBjdHgtPnBhcmFtcy0+aW50ZXJuYWxDc3AgPSBYMjY1X0NTUF9JNDQ0OwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTEyOgorICAgICAgICBpZiAoY3R4LT5hcGktPmFwaV9idWlsZF9udW1iZXIgPCA4NSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImxpYngyNjUgdmVyc2lvbiBpcyAlZCwgbXVzdCBiZSBhdCBsZWFzdCA4NSBmb3IgZ3JheSBlbmNvZGluZy5cbiIsCisgICAgICAgICAgICAgICAgICAgY3R4LT5hcGktPmFwaV9idWlsZF9udW1iZXIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5wYXJhbXMtPmludGVybmFsQ3NwID0gWDI2NV9DU1BfSTQwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgaWYgKGN0eC0+Y3JmID49IDApIHsKQEAgLTIwMiw2ICsyMzIsMTggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChjdHgtPnByb2ZpbGUpIHsKKyAgICAgICAgaWYgKGN0eC0+YXBpLT5wYXJhbV9hcHBseV9wcm9maWxlKGN0eC0+cGFyYW1zLCBjdHgtPnByb2ZpbGUpIDwgMCkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgb3IgaW5jb21wYXRpYmxlIHByb2ZpbGUgc2V0OiAlcy5cbiIsIGN0eC0+cHJvZmlsZSk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiUG9zc2libGUgcHJvZmlsZXM6Iik7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyB4MjY1X3Byb2ZpbGVfbmFtZXNbaV07IGkrKykKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiICVzIiwgeDI2NV9wcm9maWxlX25hbWVzW2ldKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGN0eC0+ZW5jb2RlciA9IGN0eC0+YXBpLT5lbmNvZGVyX29wZW4oY3R4LT5wYXJhbXMpOwogICAgIGlmICghY3R4LT5lbmNvZGVyKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IG9wZW4gbGlieDI2NSBlbmNvZGVyLlxuIik7CkBAIC0yNTgsNyArMzAwLDggQEAKICAgICAgICAgeDI2NXBpYy5wdHMgICAgICA9IHBpYy0+cHRzOwogICAgICAgICB4MjY1cGljLmJpdERlcHRoID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCktPmNvbXBbMF0uZGVwdGg7CiAKLSAgICAgICAgeDI2NXBpYy5zbGljZVR5cGUgPSBwaWMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/IFgyNjVfVFlQRV9JIDoKKyAgICAgICAgeDI2NXBpYy5zbGljZVR5cGUgPSBwaWMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eC0+Zm9yY2VkX2lkciA/IFgyNjVfVFlQRV9JRFIgOiBYMjY1X1RZUEVfSSkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QID8gWDI2NV9UWVBFX1AgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CID8gWDI2NV9UWVBFX0IgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFgyNjVfVFlQRV9BVVRPOwpAQCAtMjc1LDcgKzMxOCw3IEBACiAgICAgZm9yIChpID0gMDsgaSA8IG5uYWw7IGkrKykKICAgICAgICAgcGF5bG9hZCArPSBuYWxbaV0uc2l6ZUJ5dGVzOwogCi0gICAgcmV0ID0gZmZfYWxsb2NfcGFja2V0KHBrdCwgcGF5bG9hZCk7CisgICAgcmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCBwYXlsb2FkLCBwYXlsb2FkKTsKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGdldHRpbmcgb3V0cHV0IHBhY2tldC5cbiIpOwogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMzEwLDYgKzM1MywxMyBAQAogRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAjZW5kaWYKIAorI2lmIFgyNjVfQlVJTEQgPj0gMTMwCisgICAgaWYgKHgyNjVwaWNfb3V0LnNsaWNlVHlwZSA9PSBYMjY1X1RZUEVfQikKKyNlbHNlCisgICAgaWYgKHgyNjVwaWNfb3V0LmZyYW1lRGF0YS5zbGljZVR5cGUgPT0gJ2InKQorI2VuZGlmCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfRElTUE9TQUJMRTsKKwogICAgICpnb3RfcGFja2V0ID0gMTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTMxOCw2ICszNjgsOCBAQAogICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKICAgICBBVl9QSVhfRk1UX1lVVjQyMlAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgIEFWX1BJWF9GTVRfR0JSUCwKKyAgICBBVl9QSVhfRk1UX0dSQVk4LAogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKIApAQCAtMzI1LDkgKzM3NywxMyBAQAogICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKICAgICBBVl9QSVhfRk1UX1lVVjQyMlAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgIEFWX1BJWF9GTVRfR0JSUCwKICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwKICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMCwKICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgIEFWX1BJWF9GTVRfR1JBWTEwLAogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKIApAQCAtMzM1LDEyICszOTEsMTggQEAKICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLAogICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICBBVl9QSVhfRk1UX0dCUlAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgQVZfUElYX0ZNVF9HQlJQMTAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsCiAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsCisgICAgQVZfUElYX0ZNVF9HQlJQMTIsCisgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICBBVl9QSVhfRk1UX0dSQVkxMCwKKyAgICBBVl9QSVhfRk1UX0dSQVkxMiwKICAgICBBVl9QSVhfRk1UX05PTkUKIH07CiAKQEAgLTM1OCw4ICs0MjAsMTAgQEAKICNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICB7ICJjcmYiLCAgICAgICAgICJzZXQgdGhlIHgyNjUgY3JmIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoY3JmKSwgICAgICAgQVZfT1BUX1RZUEVfRkxPQVQsICB7IC5kYmwgPSAtMSB9LCAtMSwgRkxUX01BWCwgVkUgfSwKKyAgICB7ICJmb3JjZWQtaWRyIiwgICJpZiBmb3JjaW5nIGtleWZyYW1lcywgZm9yY2UgdGhlbSBhcyBJRFIgZnJhbWVzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZm9yY2VkX2lkciksQVZfT1BUX1RZUEVfQk9PTCwgICB7IC5pNjQgPSAgMCB9LCAgMCwgICAgICAgMSwgVkUgfSwKICAgICB7ICJwcmVzZXQiLCAgICAgICJzZXQgdGhlIHgyNjUgcHJlc2V0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocHJlc2V0KSwgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgVkUgfSwKICAgICB7ICJ0dW5lIiwgICAgICAgICJzZXQgdGhlIHgyNjUgdHVuZSBwYXJhbWV0ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQodHVuZSksICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgVkUgfSwKKyAgICB7ICJwcm9maWxlIiwgICAgICJzZXQgdGhlIHgyNjUgcHJvZmlsZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocHJvZmlsZSksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgVkUgfSwKICAgICB7ICJ4MjY1LXBhcmFtcyIsICJzZXQgdGhlIHgyNjUgY29uZmlndXJhdGlvbiB1c2luZyBhIDotc2VwYXJhdGVkIGxpc3Qgb2Yga2V5PXZhbHVlIHBhcmFtZXRlcnMiLCBPRkZTRVQoeDI2NV9vcHRzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgVkUgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTM4OSw0ICs0NTMsNSBAQAogICAgIC5wcml2X2NsYXNzICAgICAgID0gJmNsYXNzLAogICAgIC5kZWZhdWx0cyAgICAgICAgID0geDI2NV9kZWZhdWx0cywKICAgICAuY2FwYWJpbGl0aWVzICAgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9BVVRPX1RIUkVBRFMsCisgICAgLndyYXBwZXJfbmFtZSAgICAgPSAibGlieDI2NSIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9saWJ4YXZzLmMgYi9saWJhdmNvZGVjL2xpYnhhdnMuYwppbmRleCBmMjU3ZTU1Li44MDFhMDVkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xpYnhhdnMuYworKysgYi9saWJhdmNvZGVjL2xpYnhhdnMuYwpAQCAtMjgzLDMyICsyODMsNiBAQAogICAgIGlmICh4NC0+Y3BseGJsdXIgPj0gMCkKICAgICAgICAgeDQtPnBhcmFtcy5yYy5mX2NvbXBsZXhpdHlfYmx1ciA9IHg0LT5jcGx4Ymx1cjsKIAotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgaWYgKHg0LT5tb3Rpb25fZXN0IDwgMCkgewotICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5tZV9tZXRob2QpIHsKLSAgICAgICAgY2FzZSAgTUVfRVBaUzoKLSAgICAgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFhBVlNfTUVfRElBOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIE1FX0hFWDoKLSAgICAgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFhBVlNfTUVfSEVYOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIE1FX1VNSDoKLSAgICAgICAgICAgIHg0LT5wYXJhbXMuYW5hbHlzZS5pX21lX21ldGhvZCA9IFhBVlNfTUVfVU1IOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgIE1FX0ZVTEw6Ci0gICAgICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9tZXRob2QgPSBYQVZTX01FX0VTQTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICBNRV9URVNBOgotICAgICAgICAgICAgeDQtPnBhcmFtcy5hbmFseXNlLmlfbWVfbWV0aG9kID0gWEFWU19NRV9URVNBOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICB4NC0+cGFyYW1zLmFuYWx5c2UuaV9tZV9tZXRob2QgPSBYQVZTX01FX0hFWDsKLSAgICAgICAgfQotICAgIH0KLUZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotI2VuZGlmCi0KICAgICB4NC0+cGFyYW1zLmlfYmZyYW1lICAgICAgICAgID0gYXZjdHgtPm1heF9iX2ZyYW1lczsKICAgICAvKiBjYWJhYyBpcyBub3QgaW5jbHVkZWQgaW4gQVZTIEppWmh1biBQcm9maWxlICovCiAgICAgeDQtPnBhcmFtcy5iX2NhYmFjICAgICAgICAgICA9IDA7CkBAIC00NjUsNyArNDM5LDcgQEAKICAgICB7ICJtYnRyZWUiLCAgICAgICAgIlVzZSBtYWNyb2Jsb2NrIHRyZWUgcmF0ZWNvbnRyb2wuIiwgICAgICAgICAgICAgICAgT0ZGU0VUKG1idHJlZSksICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgICB7Lmk2NCA9IC0xIH0sIC0xLCAxLCBWRX0sCiAgICAgeyAibWl4ZWQtcmVmcyIsICAgICJPbmUgcmVmZXJlbmNlIHBlciBwYXJ0aXRpb24sIGFzIG9wcG9zZWQgdG8gb25lIHJlZmVyZW5jZSBwZXIgbWFjcm9ibG9jayIsIE9GRlNFVChtaXhlZF9yZWZzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAtMX0sIC0xLCAxLCBWRSB9LAogICAgIHsgImZhc3QtcHNraXAiLCAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZmFzdF9wc2tpcCksICAgIEFWX09QVF9UWVBFX0JPT0wsICAgIHsuaTY0ID0gLTEgfSwgLTEsIDEsIFZFfSwKLSAgICB7ICJtb3Rpb24tZXN0IiwgICAiU2V0IG1vdGlvbiBlc3RpbWF0aW9uIG1ldGhvZCIsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKG1vdGlvbl9lc3QpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBYQVZTX01FX1RFU0EsIFZFLCAibW90aW9uLWVzdCJ9LAorICAgIHsgIm1vdGlvbi1lc3QiLCAgICJTZXQgbW90aW9uIGVzdGltYXRpb24gbWV0aG9kIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobW90aW9uX2VzdCksICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gWEFWU19NRV9ESUEgfSwgLTEsIFhBVlNfTUVfVEVTQSwgVkUsICJtb3Rpb24tZXN0In0sCiAgICAgeyAiZGlhIiwgICAgICAgICAgIE5VTEwsICAgICAgMCwgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFhBVlNfTUVfRElBIH0sICAgICAgICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVkUsICJtb3Rpb24tZXN0IiB9LAogICAgIHsgImhleCIsICAgICAgICAgICBOVUxMLCAgICAgIDAsICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBYQVZTX01FX0hFWCB9LCAgICAgICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZFLCAibW90aW9uLWVzdCIgfSwKICAgICB7ICJ1bWgiLCAgICAgICAgICAgTlVMTCwgICAgICAwLCAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gWEFWU19NRV9VTUggfSwgICAgICAgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgIm1vdGlvbi1lc3QiIH0sCkBAIC01MDQsNCArNDc4LDUgQEAKICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUgfSwKICAgICAucHJpdl9jbGFzcyAgICAgPSAmeGF2c19jbGFzcywKICAgICAuZGVmYXVsdHMgICAgICAgPSB4YXZzX2RlZmF1bHRzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJsaWJ4YXZzIiwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYnh2aWQuYyBiL2xpYmF2Y29kZWMvbGlieHZpZC5jCmluZGV4IDZmZDRlMTYuLmNkYWFlMjAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlieHZpZC5jCisrKyBiL2xpYmF2Y29kZWMvbGlieHZpZC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEludGVyZmFjZSB0byB4dmlkY29yZSBmb3IgbXBlZzQgZW5jb2RpbmcKKyAqIEludGVyZmFjZSB0byB4dmlkY29yZSBmb3IgTVBFRy00IGVuY29kaW5nCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQgQWRhbSBUaGF5ZXIgPGtyZXZuaWtAY29tY2FzdC5uZXQ+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgpAQCAtODQsNyArODQsNyBAQAogICAgIGludCBzc2ltX2FjYzsgICAgICAgICAgICAgICAgICAvKio8IFNTSU0gYWNjdXJhY3kuIDA6IGFjY3VyYXRlLiA0OiBmYXN0LiAqLwogICAgIGludCBnbWM7CiAgICAgaW50IG1lX3F1YWxpdHk7ICAgICAgICAgICAgICAgIC8qKjwgTW90aW9uIGVzdGltYXRpb24gcXVhbGl0eS4gMDogZmFzdCA2OiBiZXN0LiAqLwotICAgIGludCBtcGVnX3F1YW50OyAgICAgICAgICAgICAgICAvKio8IFF1YW50aXphdGlvbiB0eXBlLiAwOiBIMjYzLCAxOiBNUEVHICovCisgICAgaW50IG1wZWdfcXVhbnQ7ICAgICAgICAgICAgICAgIC8qKjwgUXVhbnRpemF0aW9uIHR5cGUuIDA6IEguMjYzLCAxOiBNUEVHICovCiB9OwogCiAvKioKQEAgLTk2LDYgKzk2LDkgQEAKIH07CiAKIHN0YXRpYyBpbnQgeHZpZF9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK3N0YXRpYyBpbnQgeHZpZF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWN0dXJlLCBpbnQgKmdvdF9wYWNrZXQpOworCiAKIC8qCiAgKiBYdmlkIDItUGFzcyBLbHVkZ2UgU2VjdGlvbgpAQCAtMTQyLDcgKzE0NSw3IEBACiAgKiBEZXN0cm95IHRoZSB0d28tcGFzcyBwbHVnaW4gY29udGV4dC4KICAqCiAgKiBAcGFyYW0gcmVmIENvbnRleHQgcG9pbnRlciBmb3IgdGhlIHBsdWdpbgotICogQHBhcmFtIHBhcmFtIERlc3Ryb295IGNvbnRleHQKKyAqIEBwYXJhbSBwYXJhbSBEZXN0cm95IGNvbnRleHQKICAqIEByZXR1cm4gUmV0dXJucyAwLCBzdWNjZXNzIGd1YXJhbnRlZWQKICAqLwogc3RhdGljIGludCB4dmlkX2ZmXzJwYXNzX2Rlc3Ryb3koc3RydWN0IHh2aWRfY29udGV4dCAqcmVmLApAQCAtNDE1LDMwICs0MTgsNiBAQAogICAgIGNhc2UgMToKICAgICAgICAgeC0+bWVfZmxhZ3MgfD0gWFZJRF9NRV9BRFZBTkNFRERJQU1PTkQxNiB8CiAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfTUVfSEFMRlBFTFJFRklORTE2OwotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHN3aXRjaCAoYXZjdHgtPm1lX21ldGhvZCkgewotICAgICAgICBjYXNlIE1FX0ZVTEw6ICAgLyogUXVhbGl0eSA2ICovCi0gICAgICAgICAgICAgeC0+bWVfZmxhZ3MgfD0gWFZJRF9NRV9FWFRTRUFSQ0gxNiB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWFZJRF9NRV9FWFRTRUFSQ0g4OwotICAgICAgICBjYXNlIE1FX0VQWlM6ICAgLyogUXVhbGl0eSA0ICovCi0gICAgICAgICAgICAgeC0+bWVfZmxhZ3MgfD0gWFZJRF9NRV9BRFZBTkNFRERJQU1PTkQ4IHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYVklEX01FX0hBTEZQRUxSRUZJTkU4ICAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfTUVfQ0hST01BX1BWT1AgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWFZJRF9NRV9DSFJPTUFfQlZPUDsKLSAgICAgICAgY2FzZSBNRV9MT0c6ICAgIC8qIFF1YWxpdHkgMiAqLwotICAgICAgICBjYXNlIE1FX1BIT0RTOgotICAgICAgICBjYXNlIE1FX1gxOgotICAgICAgICAgICAgIHgtPm1lX2ZsYWdzIHw9IFhWSURfTUVfQURWQU5DRURESUFNT05EMTYgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfTUVfSEFMRlBFTFJFRklORTE2OwotICAgICAgICBjYXNlIE1FX1pFUk86ICAgLyogUXVhbGl0eSAwICovCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKICAgICB9CiAKICAgICAvKiBEZWNpZGUgaG93IHdlIHNob3VsZCBkZWNpZGUgYmxvY2tzICovCkBAIC00NTksMTEgKzQzOCw2IEBACiAgICAgfQogCiAgICAgLyogQnJpbmcgaW4gVk9MIGZsYWdzIGZyb20gZmZtcGVnIGNvbW1hbmQtbGluZSAqLwotI2lmIEZGX0FQSV9HTUMKLSAgICBpZiAoYXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19HTUMpCi0gICAgICAgIHgtPmdtYyA9IDE7Ci0jZW5kaWYKLQogICAgIHgtPnZvbF9mbGFncyA9IDA7CiAgICAgaWYgKHgtPmdtYykgewogICAgICAgICB4LT52b2xfZmxhZ3MgfD0gWFZJRF9WT0xfR01DOwpAQCAtNTQxLDcgKzUxNSw3IEBACiAgICAgICAgIHJjMnBhc3MyLnZlcnNpb24gPSBYVklEX1ZFUlNJT047CiAgICAgICAgIHJjMnBhc3MyLmJpdHJhdGUgPSBhdmN0eC0+Yml0X3JhdGU7CiAKLSAgICAgICAgZmQgPSBhdl90ZW1wZmlsZSgieHZpZGZmLiIsICZ4LT50d29wYXNzZmlsZSwgMCwgYXZjdHgpOworICAgICAgICBmZCA9IGF2cHJpdl90ZW1wZmlsZSgieHZpZGZmLiIsICZ4LT50d29wYXNzZmlsZSwgMCwgYXZjdHgpOwogICAgICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlh2aWQ6IENhbm5vdCB3cml0ZSAyLXBhc3MgcGlwZVxuIik7CiAgICAgICAgICAgICByZXR1cm4gZmQ7CkBAIC02ODgsNyArNjYyLDcgQEAKICAgICBhdmN0eC0+ZXh0cmFkYXRhICAgICAgPSBOVUxMOwogICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IDA7CiAgICAgaWYgKHh2aWRfZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHsKLSAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBhcmUgY2xhaW1pbmcgdG8gYmUgTVBFRzQgKi8KKyAgICAgICAgLyogSW4gdGhpcyBjYXNlLCB3ZSBhcmUgY2xhaW1pbmcgdG8gYmUgTVBFRy00ICovCiAgICAgICAgIHgtPnF1aWNrdGltZV9mb3JtYXQgPSAxOwogICAgICAgICBhdmN0eC0+Y29kZWNfaWQgICAgID0gQVZfQ09ERUNfSURfTVBFRzQ7CiAgICAgfSBlbHNlIHsKQEAgLTcwNyw2ICs2ODEsNDMgQEAKIAogICAgIGF2X2Fzc2VydDAoeHZpZF9lbmNfY3JlYXRlLm51bV9wbHVnaW5zICsgKCEheC0+c3NpbSkgKyAoISF4LT52YXJpYW5jZV9hcSkgKyAoISF4LT5sdW1pX2FxKSA8PSBGRl9BUlJBWV9FTEVNUyhwbHVnaW5zKSk7CiAKKyAgICAvKiBFbmNvZGUgYSBkdW1teSBmcmFtZSB0byBnZXQgdGhlIGV4dHJhZGF0YSBpbW1lZGlhdGVseSAqLworICAgIGlmICh4LT5xdWlja3RpbWVfZm9ybWF0KSB7CisgICAgICAgIEFWRnJhbWUgKnBpY3R1cmU7CisgICAgICAgIEFWUGFja2V0IHBhY2tldCA9IHswfTsKKyAgICAgICAgaW50IHNpemUsIGdvdF9wYWNrZXQsIHJldDsKKworICAgICAgICBhdl9pbml0X3BhY2tldCgmcGFja2V0KTsKKworICAgICAgICBwaWN0dXJlID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFwaWN0dXJlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICB4ZXJyID0geHZpZF9lbmNvcmUoTlVMTCwgWFZJRF9FTkNfQ1JFQVRFLCAmeHZpZF9lbmNfY3JlYXRlLCBOVUxMKTsKKyAgICAgICAgaWYoIHhlcnIgKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZwaWN0dXJlKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiWHZpZDogQ291bGQgbm90IGNyZWF0ZSBlbmNvZGVyIHJlZmVyZW5jZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorICAgICAgICB4LT5lbmNvZGVyX2hhbmRsZSA9IHh2aWRfZW5jX2NyZWF0ZS5oYW5kbGU7CisgICAgICAgIHNpemUgPSAoKGF2Y3R4LT53aWR0aCArIDEpICYgfjEpICogKChhdmN0eC0+aGVpZ2h0ICsgMSkgJiB+MSk7CisgICAgICAgIHBpY3R1cmUtPmRhdGFbMF0gPSBhdl9tYWxsb2Moc2l6ZSArIHNpemUgLyAyKTsKKyAgICAgICAgaWYgKCFwaWN0dXJlLT5kYXRhWzBdKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZwaWN0dXJlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgcGljdHVyZS0+ZGF0YVsxXSA9IHBpY3R1cmUtPmRhdGFbMF0gKyBzaXplOworICAgICAgICBwaWN0dXJlLT5kYXRhWzJdID0gcGljdHVyZS0+ZGF0YVsxXSArIHNpemUgLyA0OworICAgICAgICBtZW1zZXQocGljdHVyZS0+ZGF0YVswXSwgMCwgc2l6ZSk7CisgICAgICAgIG1lbXNldChwaWN0dXJlLT5kYXRhWzFdLCAxMjgsIHNpemUgLyAyKTsKKyAgICAgICAgcmV0ID0geHZpZF9lbmNvZGVfZnJhbWUoYXZjdHgsICZwYWNrZXQsIHBpY3R1cmUsICZnb3RfcGFja2V0KTsKKyAgICAgICAgaWYgKCFyZXQgJiYgZ290X3BhY2tldCkKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGFja2V0KTsKKyAgICAgICAgYXZfZnJlZShwaWN0dXJlLT5kYXRhWzBdKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcGljdHVyZSk7CisgICAgICAgIHh2aWRfZW5jb3JlKHgtPmVuY29kZXJfaGFuZGxlLCBYVklEX0VOQ19ERVNUUk9ZLCBOVUxMLCBOVUxMKTsKKyAgICB9CisKICAgICAvKiBDcmVhdGUgZW5jb2RlciBjb250ZXh0ICovCiAgICAgeGVyciA9IHh2aWRfZW5jb3JlKE5VTEwsIFhWSURfRU5DX0NSRUFURSwgJnh2aWRfZW5jX2NyZWF0ZSwgTlVMTCk7CiAgICAgaWYgKHhlcnIpIHsKQEAgLTg5OCw3ICs5MDksNyBAQAogICAgIHsgImZyYW1lIiwgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgInNzaW0iIH0sCiAgICAgeyAic3NpbV9hY2MiLCAgICAiU1NJTSBhY2N1cmFjeSIsICAgICAgICAgICAgICAgICAgIE9GRlNFVChzc2ltX2FjYyksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAyIH0sICAgICAgIDAsICAgICAgIDQsIFZFICAgICAgICAgfSwKICAgICB7ICJnbWMiLCAgICAgICAgICJ1c2UgR01DIiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGdtYyksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgfSwgICAgICAgMCwgICAgICAgMSwgVkUgICAgICAgICB9LAotICAgIHsgIm1lX3F1YWxpdHkiLCAgIk1vdGlvbiBlc3RpbWF0aW9uIHF1YWxpdHkiLCAgICAgICBPRkZTRVQobWVfcXVhbGl0eSksICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMCB9LCAgICAgICAwLCAgICAgICA2LCBWRSAgICAgICAgIH0sCisgICAgeyAibWVfcXVhbGl0eSIsICAiTW90aW9uIGVzdGltYXRpb24gcXVhbGl0eSIsICAgICAgIE9GRlNFVChtZV9xdWFsaXR5KSwgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSA0IH0sICAgICAgIDAsICAgICAgIDYsIFZFICAgICAgICAgfSwKICAgICB7ICJtcGVnX3F1YW50IiwgICJVc2UgTVBFRyBxdWFudGl6ZXJzIGluc3RlYWQgb2YgSC4yNjMiLCBPRkZTRVQobXBlZ19xdWFudCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAgICAgMCwgICAgICAgMSwgVkUgICAgICAgICB9LAogICAgIHsgTlVMTCB9LAogfTsKQEAgLTkyMyw0ICs5MzQsNSBAQAogICAgIC5wcml2X2NsYXNzICAgICA9ICZ4dmlkX2NsYXNzLAogICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfAogICAgICAgICAgICAgICAgICAgICAgIEZGX0NPREVDX0NBUF9JTklUX0NMRUFOVVAsCisgICAgLndyYXBwZXJfbmFtZSAgID0gImxpYnh2aWQiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlieHZpZC5oIGIvbGliYXZjb2RlYy9saWJ4dmlkLmgKaW5kZXggYmZmZTA3ZC4uNThiZWY2MSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJ4dmlkLmgKKysrIGIvbGliYXZjb2RlYy9saWJ4dmlkLmgKQEAgLTI2LDYgKzI2LDExIEBACiAgKiBjb21tb24gZnVuY3Rpb25zIGZvciB1c2Ugd2l0aCB0aGUgWHZpZCB3cmFwcGVycwogICovCiAKLWludCBmZl90ZW1wZmlsZShjb25zdCBjaGFyICpwcmVmaXgsIGNoYXIgKipmaWxlbmFtZSk7CitzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQ7CisKKy8qIHJhdGUgY29udHJvbCAqLworaW50IGZmX3h2aWRfcmF0ZV9jb250cm9sX2luaXQoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzKTsKK3ZvaWQgZmZfeHZpZF9yYXRlX2NvbnRyb2xfdW5pbml0KHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcyk7CitmbG9hdCBmZl94dmlkX3JhdGVfZXN0aW1hdGVfcXNjYWxlKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgaW50IGRyeV9ydW4pOwogCiAjZW5kaWYgLyogQVZDT0RFQ19MSUJYVklEX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbGlieHZpZF9yYy5jIGIvbGliYXZjb2RlYy9saWJ4dmlkX3JjLmMKaW5kZXggMGZkMDMwYy4uMDc2YzMyYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9saWJ4dmlkX3JjLmMKKysrIGIvbGliYXZjb2RlYy9saWJ4dmlkX3JjLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlIDx4dmlkLmg+CiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAibGlieHZpZC5oIgpAQCAtNDYsOSArNDYsOSBAQAogICAgIHh2aWRfcGxnX2NyZWF0ZV90IHh2aWRfcGxnX2NyZWF0ZSA9IHsgMCB9OwogICAgIHh2aWRfcGx1Z2luXzJwYXNzMl90IHh2aWRfMnBhc3MyICA9IHsgMCB9OwogCi0gICAgZmQgPSBhdl90ZW1wZmlsZSgieHZpZHJjLiIsICZ0bXBfbmFtZSwgMCwgcy0+YXZjdHgpOworICAgIGZkID0gYXZwcml2X3RlbXBmaWxlKCJ4dmlkcmMuIiwgJnRtcF9uYW1lLCAwLCBzLT5hdmN0eCk7CiAgICAgaWYgKGZkIDwgMCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgY3JlYXRlIHRlbXBvcmFyeSBwYXNzMiBmaWxlLlxuIik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW4ndCBjcmVhdGUgdGVtcG9yYXJ5IHBhc3MyIGZpbGUuXG4iKTsKICAgICAgICAgcmV0dXJuIGZkOwogICAgIH0KIApAQCAtNjksNyArNjksNyBAQAogCiAgICAgICAgIGlmICh3cml0ZShmZCwgdG1wLCBzdHJsZW4odG1wKSkgPCAwKSB7CiAgICAgICAgICAgICBpbnQgcmV0ID0gQVZFUlJPUihlcnJubyk7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgJXMgd3JpdGluZyAycGFzcyBsb2dmaWxlXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yICVzIHdyaXRpbmcgMnBhc3MgbG9nZmlsZVxuIiwgYXZfZXJyMnN0cihyZXQpKTsKICAgICAgICAgICAgIGF2X2ZyZWUodG1wX25hbWUpOwogICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTkyLDcgKzkyLDcgQEAKIAogICAgIGlmICh4dmlkX3BsdWdpbl8ycGFzczIoTlVMTCwgWFZJRF9QTEdfQ1JFQVRFLCAmeHZpZF9wbGdfY3JlYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnJjX2NvbnRleHQubm9uX2xhdmNfb3BhcXVlKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInh2aWRfcGx1Z2luXzJwYXNzMiBmYWlsZWRcbiIpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAieHZpZF9wbHVnaW5fMnBhc3MyIGZhaWxlZFxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgICAgIHh2aWRfcGxnX2RhdGEudHlwZSAgICAgICAgICA9IHMtPmxhc3RfcGljdF90eXBlOwogICAgICAgICAgICAgaWYgKHh2aWRfcGx1Z2luXzJwYXNzMihzLT5yY19jb250ZXh0Lm5vbl9sYXZjX29wYXF1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFZJRF9QTEdfQUZURVIsICZ4dmlkX3BsZ19kYXRhLCBOVUxMKSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJ4dmlkX3BsdWdpbl8ycGFzczIoaGFuZGxlLCBYVklEX1BMR19BRlRFUiwgLi4uKSBGQUlMRURcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgICB4dmlkX3BsZ19kYXRhLnF1YW50ICAgICAgICAgICAgICAgPSAwOwogICAgICAgICBpZiAoeHZpZF9wbHVnaW5fMnBhc3MyKHMtPnJjX2NvbnRleHQubm9uX2xhdmNfb3BhcXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhWSURfUExHX0JFRk9SRSwgJnh2aWRfcGxnX2RhdGEsIE5VTEwpKSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgInh2aWRfcGx1Z2luXzJwYXNzMihoYW5kbGUsIFhWSURfUExHX0JFRk9SRSwgLi4uKSBGQUlMRURcbiIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xpYnp2YmktdGVsZXRleHRkZWMuYyBiL2xpYmF2Y29kZWMvbGlienZiaS10ZWxldGV4dGRlYy5jCmluZGV4IDMwOGY3MzUuLjMwZDA1OTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGlienZiaS10ZWxldGV4dGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvbGlienZiaS10ZWxldGV4dGRlYy5jCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9hc3MuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2R2YnR4dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCkBAIC03Myw2ICs3NCw4IEBACiAgICAgdmJpX2V4cG9ydCAqICAgIGV4OwogI2VuZGlmCiAgICAgdmJpX3NsaWNlZCAgICAgIHNsaWNlZFtNQVhfU0xJQ0VTXTsKKworICAgIGludCAgICAgICAgICAgICByZWFkb3JkZXI7CiB9IFRlbGV0ZXh0Q29udGV4dDsKIAogc3RhdGljIGludCBjaG9wX3NwYWNlc191dGY4KGNvbnN0IHVuc2lnbmVkIGNoYXIqIHQsIGludCBsZW4pCkBAIC05NCwzNyArOTcsMjAgQEAKICAgICBhdl9mcmVlcChzdWJfcmVjdCk7CiB9CiAKLXN0YXRpYyBpbnQgY3JlYXRlX2Fzc190ZXh0KFRlbGV0ZXh0Q29udGV4dCAqY3R4LCBjb25zdCBjaGFyICp0ZXh0LCBjaGFyICoqYXNzKQorc3RhdGljIGNoYXIgKmNyZWF0ZV9hc3NfdGV4dChUZWxldGV4dENvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqdGV4dCkKIHsKLSAgICBpbnQgcmV0OwotICAgIEFWQlByaW50IGJ1ZiwgYnVmMjsKLSAgICBjb25zdCBpbnQgdHNfc3RhcnQgICAgPSBhdl9yZXNjYWxlX3EoY3R4LT5wdHMsICAgICAgICAgIEFWX1RJTUVfQkFTRV9RLCAgICAgICAgKEFWUmF0aW9uYWwpezEsIDEwMH0pOwotICAgIGNvbnN0IGludCB0c19kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShjdHgtPnN1Yl9kdXJhdGlvbiwgKEFWUmF0aW9uYWwpezEsIDEwMDB9LCAoQVZSYXRpb25hbCl7MSwgMTAwfSk7CisgICAgY2hhciAqZGlhbG9nOworICAgIEFWQlByaW50IGJ1ZjsKIAotICAgIC8qIEZpcnN0IHdlIGVzY2FwZSB0aGUgcGxhaW4gdGV4dCBpbnRvIGJ1Zi4gKi8KICAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwogICAgIGZmX2Fzc19icHJpbnRfdGV4dF9ldmVudCgmYnVmLCB0ZXh0LCBzdHJsZW4odGV4dCksICIiLCAwKTsKLSAgICBhdl9icHJpbnRmKCZidWYsICJcclxuIik7Ci0KICAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmYnVmKSkgewogICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLQotICAgIC8qIFRoZW4gd2UgY3JlYXRlIHRoZSBhc3MgZGlhbG9nIGxpbmUgaW4gYnVmMiBmcm9tIHRoZSBlc2NhcGVkIHRleHQgaW4gYnVmLiAqLwotICAgIGF2X2JwcmludF9pbml0KCZidWYyLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwotICAgIGZmX2Fzc19icHJpbnRfZGlhbG9nKCZidWYyLCBidWYuc3RyLCB0c19zdGFydCwgdHNfZHVyYXRpb24sIDApOworICAgIGRpYWxvZyA9IGZmX2Fzc19nZXRfZGlhbG9nKGN0eC0+cmVhZG9yZGVyKyssIDAsIE5VTEwsIE5VTEwsIGJ1Zi5zdHIpOwogICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKLQotICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKCZidWYyKSkgewotICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZjIsIE5VTEwpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIGlmICgocmV0ID0gYXZfYnByaW50X2ZpbmFsaXplKCZidWYyLCBhc3MpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZGlhbG9nOwogfQogCiAvKiBEcmF3IGEgcGFnZSBhcyB0ZXh0ICovCkBAIC0xODAsMTEgKzE2NiwxMiBAQAogICAgIH0KIAogICAgIGlmIChidWYubGVuKSB7Ci0gICAgICAgIGludCByZXQ7CiAgICAgICAgIHN1Yl9yZWN0LT50eXBlID0gU1VCVElUTEVfQVNTOwotICAgICAgICBpZiAoKHJldCA9IGNyZWF0ZV9hc3NfdGV4dChjdHgsIGJ1Zi5zdHIsICZzdWJfcmVjdC0+YXNzKSkgPCAwKSB7CisgICAgICAgIHN1Yl9yZWN0LT5hc3MgPSBjcmVhdGVfYXNzX3RleHQoY3R4LCBidWYuc3RyKTsKKworICAgICAgICBpZiAoIXN1Yl9yZWN0LT5hc3MpIHsKICAgICAgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgInN1YnRleHQ6JXM6dHhldGJ1c1xuIiwgc3ViX3JlY3QtPmFzcyk7CiAgICAgfSBlbHNlIHsKQEAgLTM2OCwxMiArMzU1LDYgQEAKICAgICB2YmlfdW5yZWZfcGFnZSgmcGFnZSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGRhdGFfaWRlbnRpZmllcl9pc190ZWxldGV4dChpbnQgZGF0YV9pZGVudGlmaWVyKSB7Ci0gICAgLyogU2VlIEVOIDMwMSA3NzUgc2VjdGlvbiA0LjQuMi4gKi8KLSAgICByZXR1cm4gKGRhdGFfaWRlbnRpZmllciA+PSAweDEwICYmIGRhdGFfaWRlbnRpZmllciA8PSAweDFGIHx8Ci0gICAgICAgICAgICBkYXRhX2lkZW50aWZpZXIgPj0gMHg5OSAmJiBkYXRhX2lkZW50aWZpZXIgPD0gMHg5Qik7Ci19Ci0KIHN0YXRpYyBpbnQgc2xpY2VfdG9fdmJpX2xpbmVzKFRlbGV0ZXh0Q29udGV4dCAqY3R4LCB1aW50OF90KiBidWYsIGludCBzaXplKQogewogICAgIGludCBsaW5lcyA9IDA7CkBAIC0zODIsNyArMzYzLDcgQEAKICAgICAgICAgaW50IGRhdGFfdW5pdF9sZW5ndGggPSBidWZbMV07CiAgICAgICAgIGlmIChkYXRhX3VuaXRfbGVuZ3RoICsgMiA+IHNpemUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgaWYgKGRhdGFfdW5pdF9pZCA9PSAweDAyIHx8IGRhdGFfdW5pdF9pZCA9PSAweDAzKSB7CisgICAgICAgIGlmIChmZl9kYXRhX3VuaXRfaWRfaXNfdGVsZXRleHQoZGF0YV91bml0X2lkKSkgewogICAgICAgICAgICAgaWYgKGRhdGFfdW5pdF9sZW5ndGggIT0gMHgyYykKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGVsc2UgewpAQCAtNDE0LDcgKzM5NSw3IEBACiAgICAgaWYgKCFjdHgtPnZiaSkgewogICAgICAgICBpZiAoIShjdHgtPnZiaSA9IHZiaV9kZWNvZGVyX25ldygpKSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGlmICghdmJpX2V2ZW50X2hhbmRsZXJfYWRkKGN0eC0+dmJpLCBWQklfRVZFTlRfVFRYX1BBR0UsIGhhbmRsZXIsIGN0eCkpIHsKKyAgICAgICAgaWYgKCF2YmlfZXZlbnRfaGFuZGxlcl9yZWdpc3RlcihjdHgtPnZiaSwgVkJJX0VWRU5UX1RUWF9QQUdFLCBoYW5kbGVyLCBjdHgpKSB7CiAgICAgICAgICAgICB2YmlfZGVjb2Rlcl9kZWxldGUoY3R4LT52YmkpOwogICAgICAgICAgICAgY3R4LT52YmkgPSBOVUxMOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTQzNCw3ICs0MTUsNyBAQAogCiAgICAgICAgIGN0eC0+aGFuZGxlcl9yZXQgPSBwa3QtPnNpemU7CiAKLSAgICAgICAgaWYgKGRhdGFfaWRlbnRpZmllcl9pc190ZWxldGV4dCgqcGt0LT5kYXRhKSkgeworICAgICAgICBpZiAoZmZfZGF0YV9pZGVudGlmaWVyX2lzX3RlbGV0ZXh0KCpwa3QtPmRhdGEpKSB7CiAgICAgICAgICAgICBpZiAoKGxpbmVzID0gc2xpY2VfdG9fdmJpX2xpbmVzKGN0eCwgcGt0LT5kYXRhICsgMSwgcGt0LT5zaXplIC0gMSkpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gbGluZXM7CiAgICAgICAgICAgICBmZl9kbG9nKGF2Y3R4LCAiY3R4PSVwIGJ1Zl9zaXplPSVkIGxpbmVzPSV1IHBrdF9wdHM9JTcuM2ZcbiIsCkBAIC01NDYsNiArNTI3LDggQEAKICAgICB2YmlfZGVjb2Rlcl9kZWxldGUoY3R4LT52YmkpOwogICAgIGN0eC0+dmJpID0gTlVMTDsKICAgICBjdHgtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIGlmICghKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9ST19GTFVTSF9OT09QKSkKKyAgICAgICAgY3R4LT5yZWFkb3JkZXIgPSAwOwogICAgIHJldHVybiAwOwogfQogCkBAIC01OTAsNCArNTczLDUgQEAKICAgICAuY2FwYWJpbGl0aWVzID0gQVZfQ09ERUNfQ0FQX0RFTEFZLAogICAgIC5mbHVzaCAgICAgPSB0ZWxldGV4dF9mbHVzaCwKICAgICAucHJpdl9jbGFzcz0gJnRlbGV0ZXh0X2NsYXNzLAorICAgIC53cmFwcGVyX25hbWUgPSAibGlienZiaSIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9sanBlZ2VuYy5jIGIvbGliYXZjb2RlYy9sanBlZ2VuYy5jCmluZGV4IGFmYWFiMDUuLjkyNGQyZTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbGpwZWdlbmMuYworKysgYi9saWJhdmNvZGVjL2xqcGVnZW5jLmMKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlICJqcGVndGFibGVzLmgiCiAjaW5jbHVkZSAibWpwZWdlbmNfY29tbW9uLmgiCiAjaW5jbHVkZSAibWpwZWcuaCIKLSNpbmNsdWRlICJtanBlZ2VuYy5oIgogCiB0eXBlZGVmIHN0cnVjdCBMSnBlZ0VuY0NvbnRleHQgewogICAgIEFWQ2xhc3MgKmNsYXNzOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9sb3NzbGVzc19hdWRpb2RzcC5jIGIvbGliYXZjb2RlYy9sb3NzbGVzc19hdWRpb2RzcC5jCmluZGV4IDMyZjRjOWUuLjNhOWY5YjIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbG9zc2xlc3NfYXVkaW9kc3AuYworKysgYi9saWJhdmNvZGVjL2xvc3NsZXNzX2F1ZGlvZHNwLmMKQEAgLTI5LDE2ICsyOSwzNCBAQAogewogICAgIGludCByZXMgPSAwOwogCi0gICAgd2hpbGUgKG9yZGVyLS0pIHsKKyAgICBkbyB7CiAgICAgICAgIHJlcyAgICs9ICp2MSAqICp2MisrOwogICAgICAgICAqdjErKyArPSBtdWwgKiAqdjMrKzsKLSAgICB9CisgICAgICAgIHJlcyAgICs9ICp2MSAqICp2MisrOworICAgICAgICAqdjErKyArPSBtdWwgKiAqdjMrKzsKKyAgICB9IHdoaWxlIChvcmRlci09Mik7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludDMyX3Qgc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQzMl9jKGludDE2X3QgKnYxLCBjb25zdCBpbnQzMl90ICp2MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGludCBtdWwpCit7CisgICAgaW50IHJlcyA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIHJlcyAgICs9ICp2MSAqICh1aW50MzJfdCkqdjIrKzsKKyAgICAgICAgKnYxKysgKz0gbXVsICogKnYzKys7CisgICAgICAgIHJlcyAgICs9ICp2MSAqICh1aW50MzJfdCkqdjIrKzsKKyAgICAgICAgKnYxKysgKz0gbXVsICogKnYzKys7CisgICAgfSB3aGlsZSAob3JkZXItPTIpOwogICAgIHJldHVybiByZXM7CiB9CiAKIGF2X2NvbGQgdm9pZCBmZl9sbGF1ZGRzcF9pbml0KExMQXVkRFNQQ29udGV4dCAqYykKIHsKICAgICBjLT5zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2ID0gc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNl9jOworICAgIGMtPnNjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MzIgPSBzY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDMyX2M7CiAKICAgICBpZiAoQVJDSF9BUk0pCiAgICAgICAgIGZmX2xsYXVkZHNwX2luaXRfYXJtKGMpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9sb3NzbGVzc19hdWRpb2RzcC5oIGIvbGliYXZjb2RlYy9sb3NzbGVzc19hdWRpb2RzcC5oCmluZGV4IDc5Y2EzMGQuLmVlYTVkNDkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbG9zc2xlc3NfYXVkaW9kc3AuaAorKysgYi9saWJhdmNvZGVjL2xvc3NsZXNzX2F1ZGlvZHNwLmgKQEAgLTM2LDYgKzM2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IG11bCk7CisKKyAgICBpbnQzMl90ICgqc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQzMikoaW50MTZfdCAqdjEgLyogYWxpZ24gMTYgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKnYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IG11bCk7CiB9IExMQXVkRFNQQ29udGV4dDsKIAogdm9pZCBmZl9sbGF1ZGRzcF9pbml0KExMQXVkRFNQQ29udGV4dCAqYyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xvc3NsZXNzX3ZpZGVvZHNwLmMgYi9saWJhdmNvZGVjL2xvc3NsZXNzX3ZpZGVvZHNwLmMKaW5kZXggMzQ5MTYyMS4uY2ZmOTRjMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9sb3NzbGVzc192aWRlb2RzcC5jCisrKyBiL2xpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9kc3AuYwpAQCAtMjEsNTUgKzIxLDM2IEBACiAjaW5jbHVkZSAibG9zc2xlc3NfdmlkZW9kc3AuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL21hdGhvcHMuaCIKIAotc3RhdGljIHZvaWQgYWRkX2ludDE2X2ModWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcpeworLy8gMHg3ZjdmN2Y3ZiBvciAweDdmN2Y3ZjdmN2Y3ZjdmN2Ygb3Igd2hhdGV2ZXIsIGRlcGVuZGluZyBvbiB0aGUgY3B1J3MgbmF0aXZlIGFyaXRobWV0aWMgc2l6ZQorI2RlZmluZSBwYl83ZiAofjBVTCAvIDI1NSAqIDB4N2YpCisjZGVmaW5lIHBiXzgwICh+MFVMIC8gMjU1ICogMHg4MCkKKworc3RhdGljIHZvaWQgYWRkX2J5dGVzX2ModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCB3KQorewogICAgIGxvbmcgaTsKLSAgICB1bnNpZ25lZCBsb25nIHB3X2xzYiA9IChtYXNrID4+IDEpICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOwotICAgIHVuc2lnbmVkIGxvbmcgcHdfbXNiID0gcHdfbHNiICsgIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IHcgLSAoaW50KXNpemVvZihsb25nKS8yOyBpICs9IHNpemVvZihsb25nKS8yKSB7Ci0gICAgICAgIGxvbmcgYSA9ICoobG9uZyopKHNyYytpKTsKLSAgICAgICAgbG9uZyBiID0gKihsb25nKikoZHN0K2kpOwotICAgICAgICAqKGxvbmcqKShkc3QraSkgPSAoKGEmcHdfbHNiKSArIChiJnB3X2xzYikpIF4gKChhXmIpJnB3X21zYik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IHcgLSAoaW50KSBzaXplb2YobG9uZyk7IGkgKz0gc2l6ZW9mKGxvbmcpKSB7CisgICAgICAgIGxvbmcgYSA9ICoobG9uZyAqKSAoc3JjICsgaSk7CisgICAgICAgIGxvbmcgYiA9ICoobG9uZyAqKSAoZHN0ICsgaSk7CisgICAgICAgICoobG9uZyAqKSAoZHN0ICsgaSkgPSAoKGEgJiBwYl83ZikgKyAoYiAmIHBiXzdmKSkgXiAoKGEgXiBiKSAmIHBiXzgwKTsKICAgICB9Ci0gICAgZm9yKDsgaTx3OyBpKyspCi0gICAgICAgIGRzdFtpXSA9IChkc3RbaV0gKyBzcmNbaV0pICYgbWFzazsKKyAgICBmb3IgKDsgaSA8IHc7IGkrKykKKyAgICAgICAgZHN0W2kgKyAwXSArPSBzcmNbaSArIDBdOwogfQogCi1zdGF0aWMgdm9pZCBkaWZmX2ludDE2X2ModWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYzEsIGNvbnN0IHVpbnQxNl90ICpzcmMyLCB1bnNpZ25lZCBtYXNrLCBpbnQgdyl7Ci0gICAgbG9uZyBpOwotI2lmICFIQVZFX0ZBU1RfVU5BTElHTkVECi0gICAgaWYoKGxvbmcpc3JjMiAmIChzaXplb2YobG9uZyktMSkpewotICAgICAgICBmb3IoaT0wOyBpKzM8dzsgaSs9NCl7Ci0gICAgICAgICAgICBkc3RbaSswXSA9IChzcmMxW2krMF0tc3JjMltpKzBdKSAmIG1hc2s7Ci0gICAgICAgICAgICBkc3RbaSsxXSA9IChzcmMxW2krMV0tc3JjMltpKzFdKSAmIG1hc2s7Ci0gICAgICAgICAgICBkc3RbaSsyXSA9IChzcmMxW2krMl0tc3JjMltpKzJdKSAmIG1hc2s7Ci0gICAgICAgICAgICBkc3RbaSszXSA9IChzcmMxW2krM10tc3JjMltpKzNdKSAmIG1hc2s7Ci0gICAgICAgIH0KLSAgICB9ZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgICB1bnNpZ25lZCBsb25nIHB3X2xzYiA9IChtYXNrID4+IDEpICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOwotICAgICAgICB1bnNpZ25lZCBsb25nIHB3X21zYiA9IHB3X2xzYiArICAweDAwMDEwMDAxMDAwMTAwMDFVTEw7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSB3IC0gKGludClzaXplb2YobG9uZykvMjsgaSArPSBzaXplb2YobG9uZykvMikgewotICAgICAgICAgICAgbG9uZyBhID0gKihsb25nKikoc3JjMStpKTsKLSAgICAgICAgICAgIGxvbmcgYiA9ICoobG9uZyopKHNyYzIraSk7Ci0gICAgICAgICAgICAqKGxvbmcqKShkc3QraSkgPSAoKGF8cHdfbXNiKSAtIChiJnB3X2xzYikpIF4gKChhXmJecHdfbXNiKSZwd19tc2IpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoOyBpPHc7IGkrKykKLSAgICAgICAgZHN0W2ldID0gKHNyYzFbaV0gLSBzcmMyW2ldKSAmIG1hc2s7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF9oZnl1X21lZGlhbl9wcmVkX2ludDE2X2ModWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgY29uc3QgdWludDE2X3QgKmRpZmYsIHVuc2lnbmVkIG1hc2ssIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3Apeworc3RhdGljIHZvaWQgYWRkX21lZGlhbl9wcmVkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgcHRyZGlmZl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCit7CiAgICAgaW50IGk7Ci0gICAgdWludDE2X3QgbCwgbHQ7CisgICAgdWludDhfdCBsLCBsdDsKIAogICAgIGwgID0gKmxlZnQ7CiAgICAgbHQgPSAqbGVmdF90b3A7CiAKLSAgICBmb3IoaT0wOyBpPHc7IGkrKyl7Ci0gICAgICAgIGwgID0gKG1pZF9wcmVkKGwsIHNyY1tpXSwgKGwgKyBzcmNbaV0gLSBsdCkgJiBtYXNrKSArIGRpZmZbaV0pICYgbWFzazsKLSAgICAgICAgbHQgPSBzcmNbaV07CisgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICBsICAgICAgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkgJiAweEZGKSArIGRpZmZbaV07CisgICAgICAgIGx0ICAgICA9IHNyYzFbaV07CiAgICAgICAgIGRzdFtpXSA9IGw7CiAgICAgfQogCkBAIC03Nyw1MiArNTgsNjggQEAKICAgICAqbGVmdF90b3AgPSBsdDsKIH0KIAotc3RhdGljIHZvaWQgc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfYyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsIHVuc2lnbmVkIG1hc2ssIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApewotICAgIGludCBpOwotICAgIHVpbnQxNl90IGwsIGx0OwotCi0gICAgbCAgPSAqbGVmdDsKLSAgICBsdCA9ICpsZWZ0X3RvcDsKLQotICAgIGZvcihpPTA7IGk8dzsgaSsrKXsKLSAgICAgICAgY29uc3QgaW50IHByZWQgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkgJiBtYXNrKTsKLSAgICAgICAgbHQgPSBzcmMxW2ldOwotICAgICAgICBsICA9IHNyYzJbaV07Ci0gICAgICAgIGRzdFtpXSA9IChsIC0gcHJlZCkgJiBtYXNrOwotICAgIH0KLQotICAgICpsZWZ0ICAgICA9IGw7Ci0gICAgKmxlZnRfdG9wID0gbHQ7Ci19Ci0KLXN0YXRpYyBpbnQgYWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2X2ModWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcsIHVuc2lnbmVkIGFjYyl7CitzdGF0aWMgaW50IGFkZF9sZWZ0X3ByZWRfYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNjKQorewogICAgIGludCBpOwogCi0gICAgZm9yKGk9MDsgaTx3LTE7IGkrKyl7Ci0gICAgICAgIGFjYys9IHNyY1tpXTsKLSAgICAgICAgZHN0W2ldPSBhY2MgJiBtYXNrOworICAgIGZvciAoaSA9IDA7IGkgPCB3IC0gMTsgaSsrKSB7CisgICAgICAgIGFjYyAgICs9IHNyY1tpXTsKKyAgICAgICAgZHN0W2ldID0gYWNjOwogICAgICAgICBpKys7Ci0gICAgICAgIGFjYys9IHNyY1tpXTsKLSAgICAgICAgZHN0W2ldPSBhY2MgJiBtYXNrOworICAgICAgICBhY2MgICArPSBzcmNbaV07CisgICAgICAgIGRzdFtpXSA9IGFjYzsKICAgICB9CiAKLSAgICBmb3IoOyBpPHc7IGkrKyl7Ci0gICAgICAgIGFjYys9IHNyY1tpXTsKLSAgICAgICAgZHN0W2ldPSBhY2MgJiBtYXNrOworICAgIGZvciAoOyBpIDwgdzsgaSsrKSB7CisgICAgICAgIGFjYyAgICs9IHNyY1tpXTsKKyAgICAgICAgZHN0W2ldID0gYWNjOwogICAgIH0KIAogICAgIHJldHVybiBhY2M7CiB9CiAKK3N0YXRpYyBpbnQgYWRkX2xlZnRfcHJlZF9pbnQxNl9jKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMsIHVuc2lnbmVkIG1hc2ssIHB0cmRpZmZfdCB3LCB1bnNpZ25lZCBhY2MpeworICAgIGludCBpOwogCi12b2lkIGZmX2xsdmlkZHNwX2luaXQoTExWaWREU1BDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCisgICAgZm9yKGk9MDsgaTx3LTE7IGkrKyl7CisgICAgICAgIGFjYys9IHNyY1tpXTsKKyAgICAgICAgZHN0W2ldPSBhY2MgJj0gbWFzazsKKyAgICAgICAgaSsrOworICAgICAgICBhY2MrPSBzcmNbaV07CisgICAgICAgIGRzdFtpXT0gYWNjICY9IG1hc2s7CisgICAgfQorCisgICAgZm9yKDsgaTx3OyBpKyspeworICAgICAgICBhY2MrPSBzcmNbaV07CisgICAgICAgIGRzdFtpXT0gYWNjICY9IG1hc2s7CisgICAgfQorCisgICAgcmV0dXJuIGFjYzsKK30KKworc3RhdGljIHZvaWQgYWRkX2dyYWRpZW50X3ByZWRfYyh1aW50OF90ICpzcmMsIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHB0cmRpZmZfdCB3aWR0aCl7CisgICAgaW50IEEsIEIsIEMsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBBID0gc3JjW2kgLSBzdHJpZGVdOworICAgICAgICBCID0gc3JjW2kgLSAoc3RyaWRlICsgMSldOworICAgICAgICBDID0gc3JjW2kgLSAxXTsKKyAgICAgICAgc3JjW2ldID0gKEEgLSBCICsgQyArIHNyY1tpXSkgJiAweEZGOworICAgIH0KK30KKwordm9pZCBmZl9sbHZpZGRzcF9pbml0KExMVmlkRFNQQ29udGV4dCAqYykKIHsKLSAgICBjLT5hZGRfaW50MTYgPSBhZGRfaW50MTZfYzsKLSAgICBjLT5kaWZmX2ludDE2PSBkaWZmX2ludDE2X2M7Ci0gICAgYy0+YWRkX2hmeXVfbGVmdF9wcmVkX2ludDE2ICAgPSBhZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTZfYzsKLSAgICBjLT5hZGRfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNiA9IGFkZF9oZnl1X21lZGlhbl9wcmVkX2ludDE2X2M7Ci0gICAgYy0+c3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYgPSBzdWJfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNl9jOworICAgIGMtPmFkZF9ieXRlcyAgICAgICAgICAgICAgICAgID0gYWRkX2J5dGVzX2M7CisgICAgYy0+YWRkX21lZGlhbl9wcmVkICAgICAgICAgICAgPSBhZGRfbWVkaWFuX3ByZWRfYzsKKyAgICBjLT5hZGRfbGVmdF9wcmVkICAgICAgICAgICAgICA9IGFkZF9sZWZ0X3ByZWRfYzsKIAorICAgIGMtPmFkZF9sZWZ0X3ByZWRfaW50MTYgICAgICAgID0gYWRkX2xlZnRfcHJlZF9pbnQxNl9jOworICAgIGMtPmFkZF9ncmFkaWVudF9wcmVkICAgICAgICAgID0gYWRkX2dyYWRpZW50X3ByZWRfYzsKKworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgZmZfbGx2aWRkc3BfaW5pdF9wcGMoYyk7CiAgICAgaWYgKEFSQ0hfWDg2KQotICAgICAgICBmZl9sbHZpZGRzcF9pbml0X3g4NihjLCBhdmN0eCk7CisgICAgICAgIGZmX2xsdmlkZHNwX2luaXRfeDg2KGMpOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9sb3NzbGVzc192aWRlb2RzcC5oIGIvbGliYXZjb2RlYy9sb3NzbGVzc192aWRlb2RzcC5oCmluZGV4IDA0MDkwMmUuLjgwNzc4OTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9kc3AuaAorKysgYi9saWJhdmNvZGVjL2xvc3NsZXNzX3ZpZGVvZHNwLmgKQEAgLTIyLDE5ICsyMiwyOCBAQAogI2lmbmRlZiBBVkNPREVDX0xPU1NMRVNTX1ZJREVPRFNQX0gKICNkZWZpbmUgQVZDT0RFQ19MT1NTTEVTU19WSURFT0RTUF9ICiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKwogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAKIHR5cGVkZWYgc3RydWN0IExMVmlkRFNQQ29udGV4dCB7Ci0gICAgdm9pZCAoKmFkZF9pbnQxNikodWludDE2X3QgKmRzdC8qYWxpZ24gMTYqLywgY29uc3QgdWludDE2X3QgKnNyYy8qYWxpZ24gMTYqLywgdW5zaWduZWQgbWFzaywgaW50IHcpOwotICAgIHZvaWQgKCpkaWZmX2ludDE2KSh1aW50MTZfdCAqZHN0LyphbGlnbiAxNiovLCBjb25zdCB1aW50MTZfdCAqc3JjMS8qYWxpZ24gMTYqLywgY29uc3QgdWludDE2X3QgKnNyYzIvKmFsaWduIDEqLywgdW5zaWduZWQgbWFzaywgaW50IHcpOworICAgIHZvaWQgKCphZGRfYnl0ZXMpKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiAzMiAqLywgdWludDhfdCAqc3JjIC8qIGFsaWduIDMyICovLAorICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB3KTsKKyAgICB2b2lkICgqYWRkX21lZGlhbl9wcmVkKSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaWZmLCBwdHJkaWZmX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApOworICAgIGludCAoKmFkZF9sZWZ0X3ByZWQpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB3LCBpbnQgbGVmdCk7CiAKLSAgICB2b2lkICgqc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYpKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMxLCBjb25zdCB1aW50MTZfdCAqc3JjMiwgdW5zaWduZWQgbWFzaywgaW50IHcsIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7Ci0gICAgdm9pZCAoKmFkZF9oZnl1X21lZGlhbl9wcmVkX2ludDE2KSh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqdG9wLCBjb25zdCB1aW50MTZfdCAqZGlmZiwgdW5zaWduZWQgbWFzaywgaW50IHcsIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7Ci0gICAgaW50ICAoKmFkZF9oZnl1X2xlZnRfcHJlZF9pbnQxNikodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcsIHVuc2lnbmVkIGxlZnQpOworICAgIGludCAgKCphZGRfbGVmdF9wcmVkX2ludDE2KSh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXNrLCBwdHJkaWZmX3QgdywgdW5zaWduZWQgbGVmdCk7CisgICAgdm9pZCAoKmFkZF9ncmFkaWVudF9wcmVkKSh1aW50OF90ICpzcmMgLyogYWxpZ24gMzIgKi8sIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHB0cmRpZmZfdCB3aWR0aCk7CiB9IExMVmlkRFNQQ29udGV4dDsKIAotdm9pZCBmZl9sbHZpZGRzcF9pbml0KExMVmlkRFNQQ29udGV4dCAqbGx2aWRkc3AsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Ci12b2lkIGZmX2xsdmlkZHNwX2luaXRfeDg2KExMVmlkRFNQQ29udGV4dCAqbGx2aWRkc3AsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Cit2b2lkIGZmX2xsdmlkZHNwX2luaXQoTExWaWREU1BDb250ZXh0ICpsbHZpZGRzcCk7Cit2b2lkIGZmX2xsdmlkZHNwX2luaXRfeDg2KExMVmlkRFNQQ29udGV4dCAqbGx2aWRkc3ApOwordm9pZCBmZl9sbHZpZGRzcF9pbml0X3BwYyhMTFZpZERTUENvbnRleHQgKmxsdmlkZHNwKTsKIAogI2VuZGlmIC8vQVZDT0RFQ19MT1NTTEVTU19WSURFT0RTUF9ICmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xvc3NsZXNzX3ZpZGVvZW5jZHNwLmMgYi9saWJhdmNvZGVjL2xvc3NsZXNzX3ZpZGVvZW5jZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3MDMyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9lbmNkc3AuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxvc3NsZXNzX3ZpZGVvZW5jZHNwLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorCisvLyAweDdmN2Y3ZjdmIG9yIDB4N2Y3ZjdmN2Y3ZjdmN2Y3ZiBvciB3aGF0ZXZlciwgZGVwZW5kaW5nIG9uIHRoZSBjcHUncyBuYXRpdmUgYXJpdGhtZXRpYyBzaXplCisjZGVmaW5lIHBiXzdmICh+MFVMIC8gMjU1ICogMHg3ZikKKyNkZWZpbmUgcGJfODAgKH4wVUwgLyAyNTUgKiAweDgwKQorCitzdGF0aWMgdm9pZCBkaWZmX2J5dGVzX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLCBpbnRwdHJfdCB3KQoreworICAgIGxvbmcgaTsKKworI2lmICFIQVZFX0ZBU1RfVU5BTElHTkVECisgICAgaWYgKCgobG9uZylzcmMxIHwgKGxvbmcpc3JjMikgJiAoc2l6ZW9mKGxvbmcpIC0gMSkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSArIDcgPCB3OyBpICs9IDgpIHsKKyAgICAgICAgICAgIGRzdFtpICsgMF0gPSBzcmMxW2kgKyAwXSAtIHNyYzJbaSArIDBdOworICAgICAgICAgICAgZHN0W2kgKyAxXSA9IHNyYzFbaSArIDFdIC0gc3JjMltpICsgMV07CisgICAgICAgICAgICBkc3RbaSArIDJdID0gc3JjMVtpICsgMl0gLSBzcmMyW2kgKyAyXTsKKyAgICAgICAgICAgIGRzdFtpICsgM10gPSBzcmMxW2kgKyAzXSAtIHNyYzJbaSArIDNdOworICAgICAgICAgICAgZHN0W2kgKyA0XSA9IHNyYzFbaSArIDRdIC0gc3JjMltpICsgNF07CisgICAgICAgICAgICBkc3RbaSArIDVdID0gc3JjMVtpICsgNV0gLSBzcmMyW2kgKyA1XTsKKyAgICAgICAgICAgIGRzdFtpICsgNl0gPSBzcmMxW2kgKyA2XSAtIHNyYzJbaSArIDZdOworICAgICAgICAgICAgZHN0W2kgKyA3XSA9IHNyYzFbaSArIDddIC0gc3JjMltpICsgN107CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIGZvciAoaSA9IDA7IGkgPD0gdyAtIChpbnQpIHNpemVvZihsb25nKTsgaSArPSBzaXplb2YobG9uZykpIHsKKyAgICAgICAgbG9uZyBhID0gKihsb25nICopIChzcmMxICsgaSk7CisgICAgICAgIGxvbmcgYiA9ICoobG9uZyAqKSAoc3JjMiArIGkpOworICAgICAgICAqKGxvbmcgKikgKGRzdCArIGkpID0gKChhIHwgcGJfODApIC0gKGIgJiBwYl83ZikpIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYSBeIGIgXiBwYl84MCkgJiBwYl84MCk7CisgICAgfQorICAgIGZvciAoOyBpIDwgdzsgaSsrKQorICAgICAgICBkc3RbaSArIDBdID0gc3JjMVtpICsgMF0gLSBzcmMyW2kgKyAwXTsKK30KKworc3RhdGljIHZvaWQgc3ViX21lZGlhbl9wcmVkX2ModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50cHRyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90IGwsIGx0OworCisgICAgbCAgPSAqbGVmdDsKKyAgICBsdCA9ICpsZWZ0X3RvcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHByZWQgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkgJiAweEZGKTsKKyAgICAgICAgbHQgICAgID0gc3JjMVtpXTsKKyAgICAgICAgbCAgICAgID0gc3JjMltpXTsKKyAgICAgICAgZHN0W2ldID0gbCAtIHByZWQ7CisgICAgfQorCisgICAgKmxlZnQgICAgID0gbDsKKyAgICAqbGVmdF90b3AgPSBsdDsKK30KKworc3RhdGljIHZvaWQgc3ViX2xlZnRfcHJlZGljdF9jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIHB0cmRpZmZfdCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICB1aW50OF90IHByZXYgPSAweDgwOyAvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgKi8KKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgICpkc3QrKyA9IHNyY1tpXSAtIHByZXY7CisgICAgICAgICAgICBwcmV2ICAgPSBzcmNbaV07CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9sbHZpZGVuY2RzcF9pbml0KExMVmlkRW5jRFNQQ29udGV4dCAqYykKK3sKKyAgICBjLT5kaWZmX2J5dGVzICAgICAgPSBkaWZmX2J5dGVzX2M7CisgICAgYy0+c3ViX21lZGlhbl9wcmVkID0gc3ViX21lZGlhbl9wcmVkX2M7CisgICAgYy0+c3ViX2xlZnRfcHJlZGljdCA9IHN1Yl9sZWZ0X3ByZWRpY3RfYzsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfbGx2aWRlbmNkc3BfaW5pdF94ODYoYyk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xvc3NsZXNzX3ZpZGVvZW5jZHNwLmggYi9saWJhdmNvZGVjL2xvc3NsZXNzX3ZpZGVvZW5jZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFhNmMzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9lbmNkc3AuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19MT1NTTEVTU19WSURFT0VOQ0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfTE9TU0xFU1NfVklERU9FTkNEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK3R5cGVkZWYgc3RydWN0IExMVmlkRW5jRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKmRpZmZfYnl0ZXMpKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiAxNiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMSAvKiBhbGlnbiAxNiAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3KTsKKyAgICAvKioKKyAgICAgKiBTdWJ0cmFjdCBIdWZmWVVWJ3MgdmFyaWFudCBvZiBtZWRpYW4gcHJlZGljdGlvbi4KKyAgICAgKiBOb3RlLCB0aGlzIG1pZ2h0IHJlYWQgZnJvbSBzcmMxWy0xXSwgc3JjMlstMV0uCisgICAgICovCisgICAgdm9pZCAoKnN1Yl9tZWRpYW5fcHJlZCkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludHB0cl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKKworICAgIHZvaWQgKCpzdWJfbGVmdF9wcmVkaWN0KSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgcHRyZGlmZl90IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK30gTExWaWRFbmNEU1BDb250ZXh0OworCit2b2lkIGZmX2xsdmlkZW5jZHNwX2luaXQoTExWaWRFbmNEU1BDb250ZXh0ICpjKTsKK3ZvaWQgZmZfbGx2aWRlbmNkc3BfaW5pdF94ODYoTExWaWRFbmNEU1BDb250ZXh0ICpjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTE9TU0xFU1NfVklERU9FTkNEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9scGMuYyBiL2xpYmF2Y29kZWMvbHBjLmMKaW5kZXggMzgzOTExOS4uZjhkYTFlMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9scGMuYworKysgYi9saWJhdmNvZGVjL2xwYy5jCkBAIC05Myw3ICs5Myw4IEBACiAgKiBRdWFudGl6ZSBMUEMgY29lZmZpY2llbnRzCiAgKi8KIHN0YXRpYyB2b2lkIHF1YW50aXplX2xwY19jb2Vmcyhkb3VibGUgKmxwY19pbiwgaW50IG9yZGVyLCBpbnQgcHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmxwY19vdXQsIGludCAqc2hpZnQsIGludCBtYXhfc2hpZnQsIGludCB6ZXJvX3NoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmxwY19vdXQsIGludCAqc2hpZnQsIGludCBtaW5fc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9zaGlmdCwgaW50IHplcm9fc2hpZnQpCiB7CiAgICAgaW50IGk7CiAgICAgZG91YmxlIGNtYXgsIGVycm9yOwpAQCAtMTE4LDcgKzExOSw3IEBACiAKICAgICAvKiBjYWxjdWxhdGUgbGV2ZWwgc2hpZnQgd2hpY2ggc2NhbGVzIG1heCBjb2VmZiB0byBhdmFpbGFibGUgYml0cyAqLwogICAgIHNoID0gbWF4X3NoaWZ0OwotICAgIHdoaWxlKChjbWF4ICogKDEgPDwgc2gpID4gcW1heCkgJiYgKHNoID4gMCkpIHsKKyAgICB3aGlsZSgoY21heCAqICgxIDw8IHNoKSA+IHFtYXgpICYmIChzaCA+IG1pbl9zaGlmdCkpIHsKICAgICAgICAgc2gtLTsKICAgICB9CiAKQEAgLTE3Niw5ICsxNzcsMTAgQEAKICAgICBjb25zdCBkb3VibGUgYSA9IDAuNWYsIGIgPSAxLjBmIC0gYTsKIAogICAgIC8qIEFwcGx5IHdpbmRvd2luZyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPD0gbGVuIC8gMjsgaSsrKSB7CiAgICAgICAgIGRvdWJsZSB3ZWlnaHQgPSBhIC0gYipjb3MoKDIqTV9QSSppKS8obGVuIC0gMSkpOwogICAgICAgICBzLT53aW5kb3dlZF9zYW1wbGVzW2ldID0gd2VpZ2h0KnNhbXBsZXNbaV07CisgICAgICAgIHMtPndpbmRvd2VkX3NhbXBsZXNbbGVuLTEtaV0gPSB3ZWlnaHQqc2FtcGxlc1tsZW4tMS1pXTsKICAgICB9CiAKICAgICBzLT5scGNfY29tcHV0ZV9hdXRvY29ycihzLT53aW5kb3dlZF9zYW1wbGVzLCBsZW4sIG9yZGVyLCBhdXRvYyk7CkBAIC0yMDAsNyArMjAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X29yZGVyLCBpbnQgcHJlY2lzaW9uLAogICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29lZnNbXVtNQVhfTFBDX09SREVSXSwgaW50ICpzaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEZGTFBDVHlwZSBscGNfdHlwZSwgaW50IGxwY19wYXNzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IG9tZXRob2QsIGludCBtYXhfc2hpZnQsIGludCB6ZXJvX3NoaWZ0KQorICAgICAgICAgICAgICAgICAgICAgIGludCBvbWV0aG9kLCBpbnQgbWluX3NoaWZ0LCBpbnQgbWF4X3NoaWZ0LCBpbnQgemVyb19zaGlmdCkKIHsKICAgICBkb3VibGUgYXV0b2NbTUFYX0xQQ19PUkRFUisxXTsKICAgICBkb3VibGUgcmVmW01BWF9MUENfT1JERVJdID0geyAwIH07CkBAIC0yODMsMTAgKzI4NSwxMiBAQAogICAgIGlmKG9tZXRob2QgPT0gT1JERVJfTUVUSE9EX0VTVCkgewogICAgICAgICBvcHRfb3JkZXIgPSBlc3RpbWF0ZV9iZXN0X29yZGVyKHJlZiwgbWluX29yZGVyLCBtYXhfb3JkZXIpOwogICAgICAgICBpID0gb3B0X29yZGVyLTE7Ci0gICAgICAgIHF1YW50aXplX2xwY19jb2VmcyhscGNbaV0sIGkrMSwgcHJlY2lzaW9uLCBjb2Vmc1tpXSwgJnNoaWZ0W2ldLCBtYXhfc2hpZnQsIHplcm9fc2hpZnQpOworICAgICAgICBxdWFudGl6ZV9scGNfY29lZnMobHBjW2ldLCBpKzEsIHByZWNpc2lvbiwgY29lZnNbaV0sICZzaGlmdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zaGlmdCwgbWF4X3NoaWZ0LCB6ZXJvX3NoaWZ0KTsKICAgICB9IGVsc2UgewogICAgICAgICBmb3IoaT1taW5fb3JkZXItMTsgaTxtYXhfb3JkZXI7IGkrKykgewotICAgICAgICAgICAgcXVhbnRpemVfbHBjX2NvZWZzKGxwY1tpXSwgaSsxLCBwcmVjaXNpb24sIGNvZWZzW2ldLCAmc2hpZnRbaV0sIG1heF9zaGlmdCwgemVyb19zaGlmdCk7CisgICAgICAgICAgICBxdWFudGl6ZV9scGNfY29lZnMobHBjW2ldLCBpKzEsIHByZWNpc2lvbiwgY29lZnNbaV0sICZzaGlmdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2hpZnQsIG1heF9zaGlmdCwgemVyb19zaGlmdCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbHBjLmggYi9saWJhdmNvZGVjL2xwYy5oCmluZGV4IGVkYjFhNmIuLjg4Y2EyNDcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbHBjLmgKKysrIGIvbGliYXZjb2RlYy9scGMuaApAQCAtOTUsNyArOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfb3JkZXIsIGludCBwcmVjaXNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2Vmc1tdW01BWF9MUENfT1JERVJdLCBpbnQgKnNoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgIGVudW0gRkZMUENUeXBlIGxwY190eXBlLCBpbnQgbHBjX3Bhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgb21ldGhvZCwgaW50IG1heF9zaGlmdCwgaW50IHplcm9fc2hpZnQpOworICAgICAgICAgICAgICAgICAgICAgIGludCBvbWV0aG9kLCBpbnQgbWluX3NoaWZ0LCBpbnQgbWF4X3NoaWZ0LCBpbnQgemVyb19zaGlmdCk7CiAKIGludCBmZl9scGNfY2FsY19yZWZfY29lZnMoTFBDQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqc2FtcGxlcywgaW50IG9yZGVyLCBkb3VibGUgKnJlZik7CkBAIC0xMTcsMTEgKzExNywxNCBAQAogCiAjaWYgVVNFX0ZJWEVECiB0eXBlZGVmIGludCBMUENfVFlQRTsKK3R5cGVkZWYgdW5zaWduZWQgTFBDX1RZUEVfVTsKICNlbHNlCiAjaWZkZWYgTFBDX1VTRV9ET1VCTEUKIHR5cGVkZWYgZG91YmxlIExQQ19UWVBFOwordHlwZWRlZiBkb3VibGUgTFBDX1RZUEVfVTsKICNlbHNlCiB0eXBlZGVmIGZsb2F0IExQQ19UWVBFOwordHlwZWRlZiBmbG9hdCBMUENfVFlQRV9VOwogI2VuZGlmCiAjZW5kaWYgLy8gVVNFX0ZJWEVECiAKQEAgLTE5Miw4ICsxOTUsOCBAQAogICAgICAgICBmb3Ioaj0wOyBqIDwgKGkrMSk+PjE7IGorKykgewogICAgICAgICAgICAgTFBDX1RZUEUgZiA9IGxwY19sYXN0WyAgICBqXTsKICAgICAgICAgICAgIExQQ19UWVBFIGIgPSBscGNfbGFzdFtpLTEtal07Ci0gICAgICAgICAgICBscGNbICAgIGpdID0gZiArIEFBQ19NVUwyNihyLCBiKTsKLSAgICAgICAgICAgIGxwY1tpLTEtal0gPSBiICsgQUFDX01VTDI2KHIsIGYpOworICAgICAgICAgICAgbHBjWyAgICBqXSA9IGYgKyAoTFBDX1RZUEVfVSlBQUNfTVVMMjYociwgYik7CisgICAgICAgICAgICBscGNbaS0xLWpdID0gYiArIChMUENfVFlQRV9VKUFBQ19NVUwyNihyLCBmKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChmYWlsICYmIGVyciA8IDApCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2xzcC5jIGIvbGliYXZjb2RlYy9sc3AuYwppbmRleCAxN2Y1OWVhLi45YWJhMDIwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2xzcC5jCisrKyBiL2xpYmF2Y29kZWMvbHNwLmMKQEAgLTM0LDcgKzM0LDcgQEAKIHsKICAgICBpbnQgaSwgajsKIAotICAgIC8qIHNvcnQgbHNmcSBpbiBhc2NlbmRpbmcgb3JkZXIuIGZsb2F0IGJ1YmJsZSBhZ29yaXRobSwKKyAgICAvKiBzb3J0IGxzZnEgaW4gYXNjZW5kaW5nIG9yZGVyLiBmbG9hdCBidWJibGUgYWxnb3JpdGhtLAogICAgICAgIE8obikgaWYgZGF0YSBhbHJlYWR5IHNvcnRlZCwgTyhuXjIpIC0gb3RoZXJ3aXNlICovCiAgICAgZm9yKGk9MDsgaTxscF9vcmRlci0xOyBpKyspCiAgICAgICAgIGZvcihqPWk7IGo+PTAgJiYgbHNmcVtqXSA+IGxzZnFbaisxXTsgai0tKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9sc3AuaCBiL2xpYmF2Y29kZWMvbHNwLmgKaW5kZXggNDZhMmQ0Ny4uNjIxZWJlYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9sc3AuaAorKysgYi9saWJhdmNvZGVjL2xzcC5oCkBAIC0xMDIsNyArMTAyLDcgQEAKICAqIEBwYXJhbSBscF9oYWxmX29yZGVyIGhhbGYgdGhlIG51bWJlciBvZiB0aGUgYW1vdW50IG9mIExQQ3MgdG8gYmUKICAqICAgICAgICByZWNvbnN0cnVjdGVkLCBuZWVkIHRvIGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8gTUFYX0xQX0hBTEZfT1JERVIKICAqCi0gKiBAbm90ZSBidWZmZXJzIHNob3VsZCBoYXZlIGEgbWluaW11eCBzaXplIG9mIDIqbHBfaGFsZl9vcmRlciBlbGVtZW50cy4KKyAqIEBub3RlIGJ1ZmZlcnMgc2hvdWxkIGhhdmUgYSBtaW5pbXVtIHNpemUgb2YgMipscF9oYWxmX29yZGVyIGVsZW1lbnRzLgogICoKICAqIFRJQS9FSUEvSVMtNzMzIDIuNC4zLjMuNQogICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL2x6Zi5jIGIvbGliYXZjb2RlYy9semYuYwppbmRleCA0MDlhN2ZmLi41Yjc1MjZlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL2x6Zi5jCisrKyBiL2xpYmF2Y29kZWMvbHpmLmMKQEAgLTUzLDYgKzUzLDcgQEAKICAgICAgICAgICAgICAgICByZXQgPSBhdl9yZWFsbG9jcChidWYsICpzaXplKTsKICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBwID0gKmJ1ZiArIGxlbjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcihnYiwgcCwgcyk7CkBAIC03NSw2ICs3Niw3IEBACiAgICAgICAgICAgICAgICAgcmV0ID0gYXZfcmVhbGxvY3AoYnVmLCAqc2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgcCA9ICpidWYgKyBsZW47CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGF2X21lbWNweV9iYWNrcHRyKHAsIG9mZiwgbCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL20xMDEuYyBiL2xpYmF2Y29kZWMvbTEwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNTQ5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL20xMDEuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNaWNoYWVsIE5pZWRlcm1heWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworCitzdGF0aWMgYXZfY29sZCBpbnQgbTEwMV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDYqNCkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJNaXNzaW5nIG9yIHRvbyBzbWFsbCBleHRyYWRhdGEgKHNpemUgJWQpIiwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFbMio0XSA9PSAxMCkKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICBlbHNlIGlmIChhdmN0eC0+ZXh0cmFkYXRhWzIqNF0gPT0gOCkgeworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVZVjQyMjsKKyAgICB9IGVsc2UgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJCUFMgJWQiLCBhdmN0eC0+ZXh0cmFkYXRhWzIqNF0pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtMTAxX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgc3RyaWRlLCByZXQ7CisgICAgaW50IHgsIHk7CisgICAgaW50IG1pbl9zdHJpZGUgPSAyICogYXZjdHgtPndpZHRoOworICAgIGludCBiaXRzID0gYXZjdHgtPmV4dHJhZGF0YVsyKjRdOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAxOworCisgICAgc3RyaWRlID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgNSo0KTsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlAxMCkKKyAgICAgICAgbWluX3N0cmlkZSA9IChhdmN0eC0+d2lkdGggKyAxNSkgLyAxNiAqIDIwOworCisgICAgaWYgKHN0cmlkZSA8IG1pbl9zdHJpZGUgfHwgYXZwa3QtPnNpemUgPCBzdHJpZGUgKiAodWludDY0X3QpYXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInN0cmlkZSAoJWQpIGlzIGludmFsaWQgZm9yIHBhY2tldCBzaXplZCAlZFxuIiwKKyAgICAgICAgICAgICAgIHN0cmlkZSwgYXZwa3QtPnNpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9ICgoYXZjdHgtPmV4dHJhZGF0YVszKjRdICYgMykgIT0gMyk7CisgICAgaWYgKGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lKQorICAgICAgICBmcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID0gYXZjdHgtPmV4dHJhZGF0YVszKjRdICYgMTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaW50IHNyY195ID0geTsKKyAgICAgICAgaWYgKGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lKQorICAgICAgICAgICAgc3JjX3kgPSAoKHkmMSleZnJhbWUtPnRvcF9maWVsZF9maXJzdCkgPyB5LzIgOiAoeS8yICsgYXZjdHgtPmhlaWdodC8yKTsKKyAgICAgICAgaWYgKGJpdHMgPT0gOCkgeworICAgICAgICAgICAgdWludDhfdCAqbGluZSA9IGZyYW1lLT5kYXRhWzBdICsgeSpmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICBtZW1jcHkobGluZSwgYnVmICsgc3JjX3kqc3RyaWRlLCAyKmF2Y3R4LT53aWR0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgYmxvY2s7CisgICAgICAgICAgICB1aW50MTZfdCAqbHVtYSA9ICh1aW50MTZfdCopJmZyYW1lLT5kYXRhWzBdW3kqZnJhbWUtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgIHVpbnQxNl90ICpjYiAgID0gKHVpbnQxNl90KikmZnJhbWUtPmRhdGFbMV1beSpmcmFtZS0+bGluZXNpemVbMV1dOworICAgICAgICAgICAgdWludDE2X3QgKmNyICAgPSAodWludDE2X3QqKSZmcmFtZS0+ZGF0YVsyXVt5KmZyYW1lLT5saW5lc2l6ZVsyXV07CisgICAgICAgICAgICBmb3IgKGJsb2NrID0gMDsgMTYqYmxvY2sgPCBhdmN0eC0+d2lkdGg7IGJsb2NrICsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmX3NyYyA9IGJ1ZiArIHNyY195KnN0cmlkZSArIDQwKmJsb2NrOworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNiAmJiB4ICsgMTYqYmxvY2sgPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgeGQgPSB4ICsgMTYqYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIGlmICh4JjEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx1bWEgW3hkXSA9ICg0KmJ1Zl9zcmNbMip4ICsgMF0pICsgKChidWZfc3JjWzMyICsgKHg+PjEpXT4+NCkmMyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsdW1hIFt4ZF0gPSAoNCpidWZfc3JjWzIqeCArIDBdKSArICAoYnVmX3NyY1szMiArICh4Pj4xKV0gICAgJjMpOworICAgICAgICAgICAgICAgICAgICAgICAgY2JbeGQ+PjFdID0gKDQqYnVmX3NyY1syKnggKyAxXSkgKyAoKGJ1Zl9zcmNbMzIgKyAoeD4+MSldPj4yKSYzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyW3hkPj4xXSA9ICg0KmJ1Zl9zcmNbMip4ICsgM10pICsgIChidWZfc3JjWzMyICsgKHg+PjEpXT4+Nik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfbTEwMV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtMTAxIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWF0cm94IFVuY29tcHJlc3NlZCBTRCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NMTAxLAorICAgIC5pbml0ICAgICAgICAgICA9IG0xMDFfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gbTEwMV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21hZ2ljeXV2LmMgYi9saWJhdmNvZGVjL21hZ2ljeXV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExMjljMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbWFnaWN5dXYuYwpAQCAtMCwwICsxLDgwMiBAQAorLyoKKyAqIE1hZ2ljWVVWIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcXNvcnQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJodWZmeXV2ZHNwLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb3NzbGVzc192aWRlb2RzcC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorCit0eXBlZGVmIHN0cnVjdCBTbGljZSB7CisgICAgdWludDMyX3Qgc3RhcnQ7CisgICAgdWludDMyX3Qgc2l6ZTsKK30gU2xpY2U7CisKK3R5cGVkZWYgZW51bSBQcmVkaWN0aW9uIHsKKyAgICBMRUZUID0gMSwKKyAgICBHUkFESUVOVCwKKyAgICBNRURJQU4sCit9IFByZWRpY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IEh1ZmZFbnRyeSB7CisgICAgdWludDE2X3Qgc3ltOworICAgIHVpbnQ4X3QgIGxlbjsKKyAgICB1aW50MzJfdCBjb2RlOworfSBIdWZmRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IE1hZ2ljWVVWQ29udGV4dCB7CisgICAgQVZGcmFtZSAgICAgICAgICAqcDsKKyAgICBpbnQgICAgICAgICAgICAgICBtYXg7CisgICAgaW50ICAgICAgICAgICAgICAgYnBzOworICAgIGludCAgICAgICAgICAgICAgIHNsaWNlX2hlaWdodDsKKyAgICBpbnQgICAgICAgICAgICAgICBuYl9zbGljZXM7CisgICAgaW50ICAgICAgICAgICAgICAgcGxhbmVzOyAgICAgICAgIC8vIG51bWJlciBvZiBlbmNvZGVkIHBsYW5lcyBpbiBiaXRzdHJlYW0KKyAgICBpbnQgICAgICAgICAgICAgICBkZWNvcnJlbGF0ZTsgICAgLy8gcG9zdHByb2Nlc3Npbmcgd29yaworICAgIGludCAgICAgICAgICAgICAgIGNvbG9yX21hdHJpeDsgICAvLyB2aWRlbyBjb2xvciBtYXRyaXgKKyAgICBpbnQgICAgICAgICAgICAgICBmbGFnczsKKyAgICBpbnQgICAgICAgICAgICAgICBpbnRlcmxhY2VkOyAgICAgLy8gdmlkZW8gaXMgaW50ZXJsYWNlZAorICAgIHVpbnQ4X3QgICAgICAgICAgKmJ1ZjsgICAgICAgICAgICAvLyBwb2ludGVyIHRvIEFWUGFja2V0LT5kYXRhCisgICAgaW50ICAgICAgICAgICAgICAgaHNoaWZ0WzRdOworICAgIGludCAgICAgICAgICAgICAgIHZzaGlmdFs0XTsKKyAgICBTbGljZSAgICAgICAgICAgICpzbGljZXNbNF07ICAgICAgLy8gc2xpY2UgYml0c3RyZWFtIHBvc2l0aW9ucyBmb3IgZWFjaCBwbGFuZQorICAgIHVuc2lnbmVkIGludCAgICAgIHNsaWNlc19zaXplWzRdOyAvLyBzbGljZSBzaXplcyBmb3IgZWFjaCBwbGFuZQorICAgIHVpbnQ4X3QgICAgICAgICAgIGxlbls0XVs0MDk2XTsgICAvLyB0YWJsZSBvZiBjb2RlIGxlbmd0aHMgZm9yIGVhY2ggcGxhbmUKKyAgICBWTEMgICAgICAgICAgICAgICB2bGNbNF07ICAgICAgICAgLy8gVkxDIGZvciBlYWNoIHBsYW5lCisgICAgaW50ICgqaHVmZl9idWlsZCkoVkxDICp2bGMsIHVpbnQ4X3QgKmxlbik7CisgICAgaW50ICgqbWFneV9kZWNvZGVfc2xpY2UpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqLCBpbnQgdGhyZWFkbnIpOworICAgIExMVmlkRFNQQ29udGV4dCAgIGxsdmlkZHNwOworfSBNYWdpY1lVVkNvbnRleHQ7CisKK3N0YXRpYyBpbnQgaHVmZl9jbXBfbGVuKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgSHVmZkVudHJ5ICphYSA9IGEsICpiYiA9IGI7CisgICAgcmV0dXJuIChhYS0+bGVuIC0gYmItPmxlbikgKiAyNTYgKyBhYS0+c3ltIC0gYmItPnN5bTsKK30KKworc3RhdGljIGludCBodWZmX2NtcF9sZW4xMChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IEh1ZmZFbnRyeSAqYWEgPSBhLCAqYmIgPSBiOworICAgIHJldHVybiAoYWEtPmxlbiAtIGJiLT5sZW4pICogMTAyNCArIGFhLT5zeW0gLSBiYi0+c3ltOworfQorCitzdGF0aWMgaW50IGh1ZmZfY21wX2xlbjEyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgSHVmZkVudHJ5ICphYSA9IGEsICpiYiA9IGI7CisgICAgcmV0dXJuIChhYS0+bGVuIC0gYmItPmxlbikgKiA0MDk2ICsgYWEtPnN5bSAtIGJiLT5zeW07Cit9CisKK3N0YXRpYyBpbnQgaHVmZl9idWlsZDEwKFZMQyAqdmxjLCB1aW50OF90ICpsZW4pCit7CisgICAgSHVmZkVudHJ5IGhlWzEwMjRdOworICAgIHVpbnQzMl90IGNvZGVzWzEwMjRdOworICAgIHVpbnQ4X3QgYml0c1sxMDI0XTsKKyAgICB1aW50MTZfdCBzeW1zWzEwMjRdOworICAgIHVpbnQzMl90IGNvZGU7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisgICAgICAgIGhlW2ldLnN5bSA9IDEwMjMgLSBpOworICAgICAgICBoZVtpXS5sZW4gPSBsZW5baV07CisgICAgICAgIGlmIChsZW5baV0gPT0gMCB8fCBsZW5baV0gPiAzMikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBBVl9RU09SVChoZSwgMTAyNCwgSHVmZkVudHJ5LCBodWZmX2NtcF9sZW4xMCk7CisKKyAgICBjb2RlID0gMTsKKyAgICBmb3IgKGkgPSAxMDIzOyBpID49IDA7IGktLSkgeworICAgICAgICBjb2Rlc1tpXSA9IGNvZGUgPj4gKDMyIC0gaGVbaV0ubGVuKTsKKyAgICAgICAgYml0c1tpXSAgPSBoZVtpXS5sZW47CisgICAgICAgIHN5bXNbaV0gID0gaGVbaV0uc3ltOworICAgICAgICBjb2RlICs9IDB4ODAwMDAwMDB1ID4+IChoZVtpXS5sZW4gLSAxKTsKKyAgICB9CisKKyAgICBmZl9mcmVlX3ZsYyh2bGMpOworICAgIHJldHVybiBmZl9pbml0X3ZsY19zcGFyc2UodmxjLCBGRk1JTihoZVsxMDIzXS5sZW4sIDEyKSwgMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsICBzaXplb2YoKmJpdHMpLCAgc2l6ZW9mKCpiaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzLCBzaXplb2YoKmNvZGVzKSwgc2l6ZW9mKCpjb2RlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zLCAgc2l6ZW9mKCpzeW1zKSwgIHNpemVvZigqc3ltcyksIDApOworfQorCitzdGF0aWMgaW50IGh1ZmZfYnVpbGQxMihWTEMgKnZsYywgdWludDhfdCAqbGVuKQoreworICAgIEh1ZmZFbnRyeSBoZVs0MDk2XTsKKyAgICB1aW50MzJfdCBjb2Rlc1s0MDk2XTsKKyAgICB1aW50OF90IGJpdHNbNDA5Nl07CisgICAgdWludDE2X3Qgc3ltc1s0MDk2XTsKKyAgICB1aW50MzJfdCBjb2RlOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQwOTY7IGkrKykgeworICAgICAgICBoZVtpXS5zeW0gPSA0MDk1IC0gaTsKKyAgICAgICAgaGVbaV0ubGVuID0gbGVuW2ldOworICAgICAgICBpZiAobGVuW2ldID09IDAgfHwgbGVuW2ldID4gMzIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgQVZfUVNPUlQoaGUsIDQwOTYsIEh1ZmZFbnRyeSwgaHVmZl9jbXBfbGVuMTIpOworCisgICAgY29kZSA9IDE7CisgICAgZm9yIChpID0gNDA5NTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgY29kZXNbaV0gPSBjb2RlID4+ICgzMiAtIGhlW2ldLmxlbik7CisgICAgICAgIGJpdHNbaV0gID0gaGVbaV0ubGVuOworICAgICAgICBzeW1zW2ldICA9IGhlW2ldLnN5bTsKKyAgICAgICAgY29kZSArPSAweDgwMDAwMDAwdSA+PiAoaGVbaV0ubGVuIC0gMSk7CisgICAgfQorCisgICAgZmZfZnJlZV92bGModmxjKTsKKyAgICByZXR1cm4gZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgRkZNSU4oaGVbNDA5NV0ubGVuLCAxNCksIDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCAgc2l6ZW9mKCpiaXRzKSwgIHNpemVvZigqYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlcywgc2l6ZW9mKCpjb2RlcyksIHNpemVvZigqY29kZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcywgIHNpemVvZigqc3ltcyksICBzaXplb2YoKnN5bXMpLCAwKTsKK30KKworc3RhdGljIGludCBodWZmX2J1aWxkKFZMQyAqdmxjLCB1aW50OF90ICpsZW4pCit7CisgICAgSHVmZkVudHJ5IGhlWzI1Nl07CisgICAgdWludDMyX3QgY29kZXNbMjU2XTsKKyAgICB1aW50OF90IGJpdHNbMjU2XTsKKyAgICB1aW50OF90IHN5bXNbMjU2XTsKKyAgICB1aW50MzJfdCBjb2RlOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGhlW2ldLnN5bSA9IDI1NSAtIGk7CisgICAgICAgIGhlW2ldLmxlbiA9IGxlbltpXTsKKyAgICAgICAgaWYgKGxlbltpXSA9PSAwIHx8IGxlbltpXSA+IDMyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIEFWX1FTT1JUKGhlLCAyNTYsIEh1ZmZFbnRyeSwgaHVmZl9jbXBfbGVuKTsKKworICAgIGNvZGUgPSAxOworICAgIGZvciAoaSA9IDI1NTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgY29kZXNbaV0gPSBjb2RlID4+ICgzMiAtIGhlW2ldLmxlbik7CisgICAgICAgIGJpdHNbaV0gID0gaGVbaV0ubGVuOworICAgICAgICBzeW1zW2ldICA9IGhlW2ldLnN5bTsKKyAgICAgICAgY29kZSArPSAweDgwMDAwMDAwdSA+PiAoaGVbaV0ubGVuIC0gMSk7CisgICAgfQorCisgICAgZmZfZnJlZV92bGModmxjKTsKKyAgICByZXR1cm4gZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgRkZNSU4oaGVbMjU1XS5sZW4sIDEyKSwgMjU2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgIHNpemVvZigqYml0cyksICBzaXplb2YoKmJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXMsIHNpemVvZigqY29kZXMpLCBzaXplb2YoKmNvZGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMsICBzaXplb2YoKnN5bXMpLCAgc2l6ZW9mKCpzeW1zKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hZ2ljeXV2X21lZGlhbl9wcmVkMTYodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpkaWZmLCBpbnRwdHJfdCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3AsIGludCBtYXgpCit7CisgICAgaW50IGk7CisgICAgdWludDE2X3QgbCwgbHQ7CisKKyAgICBsICA9ICpsZWZ0OworICAgIGx0ID0gKmxlZnRfdG9wOworCisgICAgZm9yIChpID0gMDsgaSA8IHc7IGkrKykgeworICAgICAgICBsICAgICAgPSBtaWRfcHJlZChsLCBzcmMxW2ldLCAobCArIHNyYzFbaV0gLSBsdCkpICsgZGlmZltpXTsKKyAgICAgICAgbCAgICAgJj0gbWF4OworICAgICAgICBsdCAgICAgPSBzcmMxW2ldOworICAgICAgICBkc3RbaV0gPSBsOworICAgIH0KKworICAgICpsZWZ0ICAgICA9IGw7CisgICAgKmxlZnRfdG9wID0gbHQ7Cit9CisKK3N0YXRpYyBpbnQgbWFneV9kZWNvZGVfc2xpY2UxMChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqLCBpbnQgdGhyZWFkbnIpCit7CisgICAgTWFnaWNZVVZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaW50ZXJsYWNlZCA9IHMtPmludGVybGFjZWQ7CisgICAgY29uc3QgaW50IGJwcyA9IHMtPmJwczsKKyAgICBjb25zdCBpbnQgbWF4ID0gcy0+bWF4IC0gMTsKKyAgICBBVkZyYW1lICpwID0gcy0+cDsKKyAgICBpbnQgaSwgaywgeDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIHVpbnQxNl90ICpkc3Q7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgaW50IGxlZnQsIGxlZnR0b3AsIHRvcDsKKyAgICAgICAgaW50IGhlaWdodCA9IEFWX0NFSUxfUlNISUZUKEZGTUlOKHMtPnNsaWNlX2hlaWdodCwgYXZjdHgtPmNvZGVkX2hlaWdodCAtIGogKiBzLT5zbGljZV9oZWlnaHQpLCBzLT52c2hpZnRbaV0pOworICAgICAgICBpbnQgd2lkdGggPSBBVl9DRUlMX1JTSElGVChhdmN0eC0+Y29kZWRfd2lkdGgsIHMtPmhzaGlmdFtpXSk7CisgICAgICAgIGludCBzaGVpZ2h0ID0gQVZfQ0VJTF9SU0hJRlQocy0+c2xpY2VfaGVpZ2h0LCBzLT52c2hpZnRbaV0pOworICAgICAgICBwdHJkaWZmX3QgZmFrZV9zdHJpZGUgPSAocC0+bGluZXNpemVbaV0gLyAyKSAqICgxICsgaW50ZXJsYWNlZCk7CisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUgPSBwLT5saW5lc2l6ZVtpXSAvIDI7CisgICAgICAgIGludCBmbGFncywgcHJlZDsKKyAgICAgICAgaW50IHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgcy0+YnVmICsgcy0+c2xpY2VzW2ldW2pdLnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2xpY2VzW2ldW2pdLnNpemUpOworCisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBmbGFncyA9IGdldF9iaXRzKCZnYiwgOCk7CisgICAgICAgIHByZWQgID0gZ2V0X2JpdHMoJmdiLCA4KTsKKworICAgICAgICBkc3QgPSAodWludDE2X3QgKilwLT5kYXRhW2ldICsgaiAqIHNoZWlnaHQgKiBzdHJpZGU7CisgICAgICAgIGlmIChmbGFncyAmIDEpIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPCBicHMgKiB3aWR0aCAqIGhlaWdodCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBoZWlnaHQ7IGsrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSBnZXRfYml0cygmZ2IsIGJwcyk7CisKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGhlaWdodDsgaysrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBpeDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICAgICAgcGl4ID0gZ2V0X3ZsYzIoJmdiLCBzLT52bGNbaV0udGFibGUsIHMtPnZsY1tpXS5iaXRzLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpeCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSBtYXggLSBwaXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHByZWQpIHsKKyAgICAgICAgY2FzZSBMRUZUOgorICAgICAgICAgICAgZHN0ID0gKHVpbnQxNl90ICopcC0+ZGF0YVtpXSArIGogKiBzaGVpZ2h0ICogc3RyaWRlOworICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZF9pbnQxNihkc3QsIGRzdCwgbWF4LCB3aWR0aCwgMCk7CisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgaWYgKGludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkX2ludDE2KGRzdCwgZHN0LCBtYXgsIHdpZHRoLCAwKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChrID0gMSArIGludGVybGFjZWQ7IGsgPCBoZWlnaHQ7IGsrKykgeworICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWRfaW50MTYoZHN0LCBkc3QsIG1heCwgd2lkdGgsIGRzdFstZmFrZV9zdHJpZGVdKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1JBRElFTlQ6CisgICAgICAgICAgICBkc3QgPSAodWludDE2X3QgKilwLT5kYXRhW2ldICsgaiAqIHNoZWlnaHQgKiBzdHJpZGU7CisgICAgICAgICAgICBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkX2ludDE2KGRzdCwgZHN0LCBtYXgsIHdpZHRoLCAwKTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICBpZiAoaW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWRfaW50MTYoZHN0LCBkc3QsIG1heCwgd2lkdGgsIDApOworICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGsgPSAxICsgaW50ZXJsYWNlZDsgayA8IGhlaWdodDsgaysrKSB7CisgICAgICAgICAgICAgICAgdG9wID0gZHN0Wy1mYWtlX3N0cmlkZV07CisgICAgICAgICAgICAgICAgbGVmdCA9IHRvcCArIGRzdFswXTsKKyAgICAgICAgICAgICAgICBkc3RbMF0gPSBsZWZ0ICYgbWF4OworICAgICAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRvcCA9IGRzdFt4IC0gZmFrZV9zdHJpZGVdOworICAgICAgICAgICAgICAgICAgICBsZWZ0dG9wID0gZHN0W3ggLSAoZmFrZV9zdHJpZGUgKyAxKV07CisgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gdG9wIC0gbGVmdHRvcCArIGRzdFt4XTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gbGVmdCAmIG1heDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBTjoKKyAgICAgICAgICAgIGRzdCA9ICh1aW50MTZfdCAqKXAtPmRhdGFbaV0gKyBqICogc2hlaWdodCAqIHN0cmlkZTsKKyAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWRfaW50MTYoZHN0LCBkc3QsIG1heCwgd2lkdGgsIDApOworICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIGlmIChpbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZF9pbnQxNihkc3QsIGRzdCwgbWF4LCB3aWR0aCwgMCk7CisgICAgICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxlZnR0b3AgPSBsZWZ0ID0gZHN0WzBdOworICAgICAgICAgICAgZm9yIChrID0gMSArIGludGVybGFjZWQ7IGsgPCBoZWlnaHQ7IGsrKykgeworICAgICAgICAgICAgICAgIG1hZ2ljeXV2X21lZGlhbl9wcmVkMTYoZHN0LCBkc3QgLSBmYWtlX3N0cmlkZSwgZHN0LCB3aWR0aCwgJmxlZnQsICZsZWZ0dG9wLCBtYXgpOworICAgICAgICAgICAgICAgIGxlZnR0b3AgPSBsZWZ0ID0gZHN0WzBdOworICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlVua25vd24gcHJlZGljdGlvbjogJWQiLCBwcmVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5kZWNvcnJlbGF0ZSkgeworICAgICAgICBpbnQgaGVpZ2h0ID0gRkZNSU4ocy0+c2xpY2VfaGVpZ2h0LCBhdmN0eC0+Y29kZWRfaGVpZ2h0IC0gaiAqIHMtPnNsaWNlX2hlaWdodCk7CisgICAgICAgIGludCB3aWR0aCA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgdWludDE2X3QgKnIgPSAodWludDE2X3QgKilwLT5kYXRhWzBdICsgaiAqIHMtPnNsaWNlX2hlaWdodCAqIHAtPmxpbmVzaXplWzBdIC8gMjsKKyAgICAgICAgdWludDE2X3QgKmcgPSAodWludDE2X3QgKilwLT5kYXRhWzFdICsgaiAqIHMtPnNsaWNlX2hlaWdodCAqIHAtPmxpbmVzaXplWzFdIC8gMjsKKyAgICAgICAgdWludDE2X3QgKmIgPSAodWludDE2X3QgKilwLT5kYXRhWzJdICsgaiAqIHMtPnNsaWNlX2hlaWdodCAqIHAtPmxpbmVzaXplWzJdIC8gMjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB3aWR0aDsgaysrKSB7CisgICAgICAgICAgICAgICAgYltrXSA9IChiW2tdICsgZ1trXSkgJiBtYXg7CisgICAgICAgICAgICAgICAgcltrXSA9IChyW2tdICsgZ1trXSkgJiBtYXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiICs9IHAtPmxpbmVzaXplWzBdIC8gMjsKKyAgICAgICAgICAgIGcgKz0gcC0+bGluZXNpemVbMV0gLyAyOworICAgICAgICAgICAgciArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWd5X2RlY29kZV9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiwgaW50IHRocmVhZG5yKQoreworICAgIE1hZ2ljWVVWQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGludGVybGFjZWQgPSBzLT5pbnRlcmxhY2VkOworICAgIEFWRnJhbWUgKnAgPSBzLT5wOworICAgIGludCBpLCBrLCB4LCBtaW5fd2lkdGg7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICB1aW50OF90ICpkc3Q7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgaW50IGxlZnQsIGxlZnR0b3AsIHRvcDsKKyAgICAgICAgaW50IGhlaWdodCA9IEFWX0NFSUxfUlNISUZUKEZGTUlOKHMtPnNsaWNlX2hlaWdodCwgYXZjdHgtPmNvZGVkX2hlaWdodCAtIGogKiBzLT5zbGljZV9oZWlnaHQpLCBzLT52c2hpZnRbaV0pOworICAgICAgICBpbnQgd2lkdGggPSBBVl9DRUlMX1JTSElGVChhdmN0eC0+Y29kZWRfd2lkdGgsIHMtPmhzaGlmdFtpXSk7CisgICAgICAgIGludCBzaGVpZ2h0ID0gQVZfQ0VJTF9SU0hJRlQocy0+c2xpY2VfaGVpZ2h0LCBzLT52c2hpZnRbaV0pOworICAgICAgICBwdHJkaWZmX3QgZmFrZV9zdHJpZGUgPSBwLT5saW5lc2l6ZVtpXSAqICgxICsgaW50ZXJsYWNlZCk7CisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUgPSBwLT5saW5lc2l6ZVtpXTsKKyAgICAgICAgaW50IGZsYWdzLCBwcmVkOworICAgICAgICBpbnQgcmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBzLT5idWYgKyBzLT5zbGljZXNbaV1bal0uc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zbGljZXNbaV1bal0uc2l6ZSk7CisKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGZsYWdzID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICAgICAgcHJlZCAgPSBnZXRfYml0cygmZ2IsIDgpOworCisgICAgICAgIGRzdCA9IHAtPmRhdGFbaV0gKyBqICogc2hlaWdodCAqIHN0cmlkZTsKKyAgICAgICAgaWYgKGZsYWdzICYgMSkgeworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8IDgqIHdpZHRoICogaGVpZ2h0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGhlaWdodDsgaysrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IGdldF9iaXRzKCZnYiwgOCk7CisKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGhlaWdodDsgaysrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBpeDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICAgICAgcGl4ID0gZ2V0X3ZsYzIoJmdiLCBzLT52bGNbaV0udGFibGUsIHMtPnZsY1tpXS5iaXRzLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpeCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAyNTUgLSBwaXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHByZWQpIHsKKyAgICAgICAgY2FzZSBMRUZUOgorICAgICAgICAgICAgZHN0ID0gcC0+ZGF0YVtpXSArIGogKiBzaGVpZ2h0ICogc3RyaWRlOworICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChkc3QsIGRzdCwgd2lkdGgsIDApOworICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIGlmIChpbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChkc3QsIGRzdCwgd2lkdGgsIDApOworICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGsgPSAxICsgaW50ZXJsYWNlZDsgayA8IGhlaWdodDsgaysrKSB7CisgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChkc3QsIGRzdCwgd2lkdGgsIGRzdFstZmFrZV9zdHJpZGVdKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgR1JBRElFTlQ6CisgICAgICAgICAgICBkc3QgPSBwLT5kYXRhW2ldICsgaiAqIHNoZWlnaHQgKiBzdHJpZGU7CisgICAgICAgICAgICBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKGRzdCwgZHN0LCB3aWR0aCwgMCk7CisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgaWYgKGludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICBzLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKGRzdCwgZHN0LCB3aWR0aCwgMCk7CisgICAgICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1pbl93aWR0aCA9IEZGTUlOKHdpZHRoLCAzMik7CisgICAgICAgICAgICBmb3IgKGsgPSAxICsgaW50ZXJsYWNlZDsgayA8IGhlaWdodDsgaysrKSB7CisgICAgICAgICAgICAgICAgdG9wID0gZHN0Wy1mYWtlX3N0cmlkZV07CisgICAgICAgICAgICAgICAgbGVmdCA9IHRvcCArIGRzdFswXTsKKyAgICAgICAgICAgICAgICBkc3RbMF0gPSBsZWZ0OworICAgICAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCBtaW5fd2lkdGg7IHgrKykgeyAvKiBkc3AgbmVlZCBhbGlnbmVkIDMyICovCisgICAgICAgICAgICAgICAgICAgIHRvcCA9IGRzdFt4IC0gZmFrZV9zdHJpZGVdOworICAgICAgICAgICAgICAgICAgICBsZWZ0dG9wID0gZHN0W3ggLSAoZmFrZV9zdHJpZGUgKyAxKV07CisgICAgICAgICAgICAgICAgICAgIGxlZnQgKz0gdG9wIC0gbGVmdHRvcCArIGRzdFt4XTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gbGVmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gMzIpCisgICAgICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9ncmFkaWVudF9wcmVkKGRzdCArIDMyLCBmYWtlX3N0cmlkZSwgd2lkdGggLSAzMik7CisgICAgICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1FRElBTjoKKyAgICAgICAgICAgIGRzdCA9IHAtPmRhdGFbaV0gKyBqICogc2hlaWdodCAqIHN0cmlkZTsKKyAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWQoZHN0LCBkc3QsIHdpZHRoLCAwKTsKKyAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICBpZiAoaW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWQoZHN0LCBkc3QsIHdpZHRoLCAwKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVmdHRvcCA9IGxlZnQgPSBkc3RbMF07CisgICAgICAgICAgICBmb3IgKGsgPSAxICsgaW50ZXJsYWNlZDsgayA8IGhlaWdodDsgaysrKSB7CisgICAgICAgICAgICAgICAgcy0+bGx2aWRkc3AuYWRkX21lZGlhbl9wcmVkKGRzdCwgZHN0IC0gZmFrZV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIHdpZHRoLCAmbGVmdCwgJmxlZnR0b3ApOworICAgICAgICAgICAgICAgIGxlZnR0b3AgPSBsZWZ0ID0gZHN0WzBdOworICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlVua25vd24gcHJlZGljdGlvbjogJWQiLCBwcmVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5kZWNvcnJlbGF0ZSkgeworICAgICAgICBpbnQgaGVpZ2h0ID0gRkZNSU4ocy0+c2xpY2VfaGVpZ2h0LCBhdmN0eC0+Y29kZWRfaGVpZ2h0IC0gaiAqIHMtPnNsaWNlX2hlaWdodCk7CisgICAgICAgIGludCB3aWR0aCA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgdWludDhfdCAqYiA9IHAtPmRhdGFbMF0gKyBqICogcy0+c2xpY2VfaGVpZ2h0ICogcC0+bGluZXNpemVbMF07CisgICAgICAgIHVpbnQ4X3QgKmcgPSBwLT5kYXRhWzFdICsgaiAqIHMtPnNsaWNlX2hlaWdodCAqIHAtPmxpbmVzaXplWzFdOworICAgICAgICB1aW50OF90ICpyID0gcC0+ZGF0YVsyXSArIGogKiBzLT5zbGljZV9oZWlnaHQgKiBwLT5saW5lc2l6ZVsyXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIHMtPmxsdmlkZHNwLmFkZF9ieXRlcyhiLCBnLCB3aWR0aCk7CisgICAgICAgICAgICBzLT5sbHZpZGRzcC5hZGRfYnl0ZXMociwgZywgd2lkdGgpOworICAgICAgICAgICAgYiArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGcgKz0gcC0+bGluZXNpemVbMV07CisgICAgICAgICAgICByICs9IHAtPmxpbmVzaXplWzJdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfaHVmZm1hbihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiaXQsIGludCBtYXgpCit7CisgICAgTWFnaWNZVVZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSA9IDAsIGogPSAwLCBrOworCisgICAgbWVtc2V0KHMtPmxlbiwgMCwgc2l6ZW9mKHMtPmxlbikpOworICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KGdiaXQpID49IDgpIHsKKyAgICAgICAgaW50IGIgPSBnZXRfYml0cyhnYml0LCAxKTsKKyAgICAgICAgaW50IHggPSBnZXRfYml0cyhnYml0LCA3KTsKKyAgICAgICAgaW50IGwgPSBnZXRfYml0c3ooZ2JpdCwgYiAqIDgpICsgMTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbDsgaysrKQorICAgICAgICAgICAgaWYgKGogKyBrIDwgbWF4KQorICAgICAgICAgICAgICAgIHMtPmxlbltpXVtqICsga10gPSB4OworCisgICAgICAgIGogKz0gbDsKKyAgICAgICAgaWYgKGogPT0gbWF4KSB7CisgICAgICAgICAgICBqID0gMDsKKyAgICAgICAgICAgIGlmIChzLT5odWZmX2J1aWxkKCZzLT52bGNbaV0sIHMtPmxlbltpXSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBidWlsZCBIdWZmbWFuIGNvZGVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGlmIChpID09IHMtPnBsYW5lcykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGogPiBtYXgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBIdWZmbWFuIGNvZGVzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGkgIT0gcy0+cGxhbmVzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSHVmZm1hbiB0YWJsZXMgdG9vIHNob3J0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFneV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIE1hZ2ljWVVWQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OworICAgIEFWRnJhbWUgKnAgPSBkYXRhOworICAgIEdldEJ5dGVDb250ZXh0IGdieXRlOworICAgIEdldEJpdENvbnRleHQgZ2JpdDsKKyAgICB1aW50MzJfdCBmaXJzdF9vZmZzZXQsIG9mZnNldCwgbmV4dF9vZmZzZXQsIGhlYWRlcl9zaXplLCBzbGljZV93aWR0aDsKKyAgICBpbnQgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB2ZXJzaW9uLCB0YWJsZV9zaXplOworICAgIGludCByZXQsIGksIGo7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYnl0ZSwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdieXRlKSAhPSBNS1RBRygnTScsICdBJywgJ0cnLCAnWScpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGhlYWRlcl9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdieXRlKTsKKyAgICBpZiAoaGVhZGVyX3NpemUgPCAzMiB8fCBoZWFkZXJfc2l6ZSA+PSBhdnBrdC0+c2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJoZWFkZXIgb3IgcGFja2V0IHRvbyBzbWFsbCAlIlBSSXUzMiJcbiIsIGhlYWRlcl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgdmVyc2lvbiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYnl0ZSk7CisgICAgaWYgKHZlcnNpb24gIT0gNykgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJWZXJzaW9uICVkIiwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBzLT5oc2hpZnRbMV0gPQorICAgIHMtPnZzaGlmdFsxXSA9CisgICAgcy0+aHNoaWZ0WzJdID0KKyAgICBzLT52c2hpZnRbMl0gPSAwOworICAgIHMtPmRlY29ycmVsYXRlID0gMDsKKyAgICBzLT5tYXggPSAyNTY7CisgICAgcy0+YnBzID0gODsKKyAgICBzLT5odWZmX2J1aWxkID0gaHVmZl9idWlsZDsKKyAgICBzLT5tYWd5X2RlY29kZV9zbGljZSA9IG1hZ3lfZGVjb2RlX3NsaWNlOworCisgICAgZm9ybWF0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdieXRlKTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgMHg2NToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlA7CisgICAgICAgIHMtPmRlY29ycmVsYXRlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDY2OgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSQVA7CisgICAgICAgIHMtPmRlY29ycmVsYXRlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDY3OgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDY4OgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgcy0+aHNoaWZ0WzFdID0KKyAgICAgICAgcy0+aHNoaWZ0WzJdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDY5OgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgcy0+aHNoaWZ0WzFdID0KKyAgICAgICAgcy0+dnNoaWZ0WzFdID0KKyAgICAgICAgcy0+aHNoaWZ0WzJdID0KKyAgICAgICAgcy0+dnNoaWZ0WzJdID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDZhOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2YjoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NmM6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CisgICAgICAgIHMtPmhzaGlmdFsxXSA9CisgICAgICAgIHMtPmhzaGlmdFsyXSA9IDE7CisgICAgICAgIHMtPm1heCA9IDEwMjQ7CisgICAgICAgIHMtPmh1ZmZfYnVpbGQgPSBodWZmX2J1aWxkMTA7CisgICAgICAgIHMtPm1hZ3lfZGVjb2RlX3NsaWNlID0gbWFneV9kZWNvZGVfc2xpY2UxMDsKKyAgICAgICAgcy0+YnBzID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2ZDoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMDsKKyAgICAgICAgcy0+ZGVjb3JyZWxhdGUgPSAxOworICAgICAgICBzLT5tYXggPSAxMDI0OworICAgICAgICBzLT5odWZmX2J1aWxkID0gaHVmZl9idWlsZDEwOworICAgICAgICBzLT5tYWd5X2RlY29kZV9zbGljZSA9IG1hZ3lfZGVjb2RlX3NsaWNlMTA7CisgICAgICAgIHMtPmJwcyA9IDEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NmU6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJBUDEwOworICAgICAgICBzLT5kZWNvcnJlbGF0ZSA9IDE7CisgICAgICAgIHMtPm1heCA9IDEwMjQ7CisgICAgICAgIHMtPmh1ZmZfYnVpbGQgPSBodWZmX2J1aWxkMTA7CisgICAgICAgIHMtPm1hZ3lfZGVjb2RlX3NsaWNlID0gbWFneV9kZWNvZGVfc2xpY2UxMDsKKyAgICAgICAgcy0+YnBzID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg2ZjoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUlAxMjsKKyAgICAgICAgcy0+ZGVjb3JyZWxhdGUgPSAxOworICAgICAgICBzLT5tYXggPSA0MDk2OworICAgICAgICBzLT5odWZmX2J1aWxkID0gaHVmZl9idWlsZDEyOworICAgICAgICBzLT5tYWd5X2RlY29kZV9zbGljZSA9IG1hZ3lfZGVjb2RlX3NsaWNlMTA7CisgICAgICAgIHMtPmJwcyA9IDEyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4NzA6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJBUDEyOworICAgICAgICBzLT5kZWNvcnJlbGF0ZSA9IDE7CisgICAgICAgIHMtPm1heCA9IDQwOTY7CisgICAgICAgIHMtPmh1ZmZfYnVpbGQgPSBodWZmX2J1aWxkMTI7CisgICAgICAgIHMtPm1hZ3lfZGVjb2RlX3NsaWNlID0gbWFneV9kZWNvZGVfc2xpY2UxMDsKKyAgICAgICAgcy0+YnBzID0gMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHg3MzoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxMDsKKyAgICAgICAgcy0+bWF4ID0gMTAyNDsKKyAgICAgICAgcy0+aHVmZl9idWlsZCA9IGh1ZmZfYnVpbGQxMDsKKyAgICAgICAgcy0+bWFneV9kZWNvZGVfc2xpY2UgPSBtYWd5X2RlY29kZV9zbGljZTEwOworICAgICAgICBzLT5icHMgPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiRm9ybWF0IDB4JVgiLCBmb3JtYXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorICAgIHMtPnBsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGF2Y3R4LT5waXhfZm10KTsKKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdieXRlLCAxKTsKKyAgICBzLT5jb2xvcl9tYXRyaXggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2J5dGUpOworICAgIHMtPmZsYWdzICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYnl0ZSk7CisgICAgcy0+aW50ZXJsYWNlZCAgID0gISEocy0+ZmxhZ3MgJiAyKTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZnYnl0ZSwgMyk7CisKKyAgICB3aWR0aCAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2J5dGUpOworICAgIGhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYnl0ZSk7CisgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHdpZHRoLCBoZWlnaHQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc2xpY2Vfd2lkdGggPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2J5dGUpOworICAgIGlmIChzbGljZV93aWR0aCAhPSBhdmN0eC0+Y29kZWRfd2lkdGgpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiU2xpY2Ugd2lkdGggJSJQUkl1MzIsIHNsaWNlX3dpZHRoKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBzLT5zbGljZV9oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2J5dGUpOworICAgIGlmIChzLT5zbGljZV9oZWlnaHQgPD0gMCB8fCBzLT5zbGljZV9oZWlnaHQgPiBJTlRfTUFYIC0gYXZjdHgtPmNvZGVkX2hlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJpbnZhbGlkIHNsaWNlIGhlaWdodDogJWRcbiIsIHMtPnNsaWNlX2hlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdieXRlLCA0KTsKKworICAgIHMtPm5iX3NsaWNlcyA9IChhdmN0eC0+Y29kZWRfaGVpZ2h0ICsgcy0+c2xpY2VfaGVpZ2h0IC0gMSkgLyBzLT5zbGljZV9oZWlnaHQ7CisgICAgaWYgKHMtPm5iX3NsaWNlcyA+IElOVF9NQVggLyBzaXplb2YoU2xpY2UpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImludmFsaWQgbnVtYmVyIG9mIHNsaWNlczogJWRcbiIsIHMtPm5iX3NsaWNlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wbGFuZXM7IGkrKykgeworICAgICAgICBhdl9mYXN0X21hbGxvYygmcy0+c2xpY2VzW2ldLCAmcy0+c2xpY2VzX3NpemVbaV0sIHMtPm5iX3NsaWNlcyAqIHNpemVvZihTbGljZSkpOworICAgICAgICBpZiAoIXMtPnNsaWNlc1tpXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdieXRlKTsKKyAgICAgICAgaWYgKG9mZnNldCA+PSBhdnBrdC0+c2l6ZSAtIGhlYWRlcl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgIGZpcnN0X29mZnNldCA9IG9mZnNldDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfc2xpY2VzIC0gMTsgaisrKSB7CisgICAgICAgICAgICBzLT5zbGljZXNbaV1bal0uc3RhcnQgPSBvZmZzZXQgKyBoZWFkZXJfc2l6ZTsKKworICAgICAgICAgICAgbmV4dF9vZmZzZXQgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2J5dGUpOworICAgICAgICAgICAgaWYgKG5leHRfb2Zmc2V0IDw9IG9mZnNldCB8fCBuZXh0X29mZnNldCA+PSBhdnBrdC0+c2l6ZSAtIGhlYWRlcl9zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBzLT5zbGljZXNbaV1bal0uc2l6ZSA9IG5leHRfb2Zmc2V0IC0gb2Zmc2V0OworICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dF9vZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBzLT5zbGljZXNbaV1bal0uc3RhcnQgPSBvZmZzZXQgKyBoZWFkZXJfc2l6ZTsKKyAgICAgICAgcy0+c2xpY2VzW2ldW2pdLnNpemUgID0gYXZwa3QtPnNpemUgLSBzLT5zbGljZXNbaV1bal0uc3RhcnQ7CisgICAgfQorCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYnl0ZSkgIT0gcy0+cGxhbmVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdieXRlLCBzLT5uYl9zbGljZXMgKiBzLT5wbGFuZXMpOworCisgICAgdGFibGVfc2l6ZSA9IGhlYWRlcl9zaXplICsgZmlyc3Rfb2Zmc2V0IC0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2J5dGUpOworICAgIGlmICh0YWJsZV9zaXplIDwgMikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByZXQgPSBpbml0X2dldF9iaXRzOCgmZ2JpdCwgYXZwa3QtPmRhdGEgKyBieXRlc3RyZWFtMl90ZWxsKCZnYnl0ZSksIHRhYmxlX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gYnVpbGRfaHVmZm1hbihhdmN0eCwgJmdiaXQsIHMtPm1heCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwLT5rZXlfZnJhbWUgPSAxOworCisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+YnVmID0gYXZwa3QtPmRhdGE7CisgICAgcy0+cCA9IHA7CisgICAgYXZjdHgtPmV4ZWN1dGUyKGF2Y3R4LCBzLT5tYWd5X2RlY29kZV9zbGljZSwgTlVMTCwgTlVMTCwgcy0+bmJfc2xpY2VzKTsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAgICB8fAorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUkFQICB8fAorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAxMCB8fAorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUkFQMTB8fAorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUkFQMTJ8fAorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAxMikgeworICAgICAgICBGRlNXQVAodWludDhfdCosIHAtPmRhdGFbMF0sIHAtPmRhdGFbMV0pOworICAgICAgICBGRlNXQVAoaW50LCBwLT5saW5lc2l6ZVswXSwgcC0+bGluZXNpemVbMV0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAocy0+Y29sb3JfbWF0cml4KSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHAtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ0NzBCRzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBwLT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNzA5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcC0+Y29sb3JfcmFuZ2UgPSAocy0+ZmxhZ3MgJiA0KSA/IEFWQ09MX1JBTkdFX0pQRUcgOiBBVkNPTF9SQU5HRV9NUEVHOworICAgIH0KKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCisjaWYgSEFWRV9USFJFQURTCitzdGF0aWMgaW50IG1hZ3lfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTWFnaWNZVVZDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5zbGljZXMpOyBpKyspIHsKKyAgICAgICAgcy0+c2xpY2VzW2ldID0gTlVMTDsKKyAgICAgICAgcy0+c2xpY2VzX3NpemVbaV0gPSAwOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBhdl9jb2xkIGludCBtYWd5X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNYWdpY1lVVkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZmX2xsdmlkZHNwX2luaXQoJnMtPmxsdmlkZHNwKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1hZ3lfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTWFnaWNZVVZDb250ZXh0ICogY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+c2xpY2VzKTsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5zbGljZXNbaV0pOworICAgICAgICBzLT5zbGljZXNfc2l6ZVtpXSA9IDA7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZzLT52bGNbaV0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX21hZ2ljeXV2X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAibWFnaWN5dXYiLAorICAgIC5sb25nX25hbWUgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1hZ2ljWVVWIHZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NQUdJQ1lVViwKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihNYWdpY1lVVkNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgID0gbWFneV9kZWNvZGVfaW5pdCwKKyAgICAuaW5pdF90aHJlYWRfY29weSA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKG1hZ3lfaW5pdF90aHJlYWRfY29weSksCisgICAgLmNsb3NlICAgICAgICAgICAgPSBtYWd5X2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBtYWd5X2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IEFWX0NPREVDX0NBUF9EUjEgfAorICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfAorICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWFnaWN5dXZlbmMuYyBiL2xpYmF2Y29kZWMvbWFnaWN5dXZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmZiOGQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9tYWdpY3l1dmVuYy5jCkBAIC0wLDAgKzEsNTU4IEBACisvKgorICogTWFnaWNZVVYgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcXNvcnQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgImxvc3NsZXNzX3ZpZGVvZW5jZHNwLmgiCisKK3R5cGVkZWYgZW51bSBQcmVkaWN0aW9uIHsKKyAgICBMRUZUID0gMSwKKyAgICBHUkFESUVOVCwKKyAgICBNRURJQU4sCit9IFByZWRpY3Rpb247CisKK3R5cGVkZWYgc3RydWN0IEh1ZmZFbnRyeSB7CisgICAgdWludDhfdCAgc3ltOworICAgIHVpbnQ4X3QgIGxlbjsKKyAgICB1aW50MzJfdCBjb2RlOworfSBIdWZmRW50cnk7CisKK3R5cGVkZWYgc3RydWN0IFBUYWJsZSB7CisgICAgaW50ICAgICB2YWx1ZTsgIC8vLzwgaW5wdXQgdmFsdWUKKyAgICBpbnQ2NF90IHByb2I7ICAgLy8vPCBudW1iZXIgb2Ygb2NjdXJlbmNlcyBvZiB0aGlzIHZhbHVlIGluIGlucHV0Cit9IFBUYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgTWFnaWNZVVZDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICAgICAgICpjbGFzczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBmcmFtZV9wcmVkOworICAgIFB1dEJpdENvbnRleHQgICAgICAgIHBiOworICAgIGludCAgICAgICAgICAgICAgICAgIHBsYW5lczsKKyAgICB1aW50OF90ICAgICAgICAgICAgICBmb3JtYXQ7CisgICAgQVZGcmFtZSAgICAgICAgICAgICAqcDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtYXg7CisgICAgaW50ICAgICAgICAgICAgICAgICAgc2xpY2VfaGVpZ2h0OworICAgIGludCAgICAgICAgICAgICAgICAgIG5iX3NsaWNlczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBjb3JyZWxhdGU7CisgICAgaW50ICAgICAgICAgICAgICAgICAgaHNoaWZ0WzRdOworICAgIGludCAgICAgICAgICAgICAgICAgIHZzaGlmdFs0XTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICpzbGljZXNbNF07CisgICAgdW5zaWduZWQgICAgICAgICAgICAgc2xpY2VfcG9zWzRdOworICAgIHVuc2lnbmVkICAgICAgICAgICAgIHRhYmxlc19zaXplOworICAgIEh1ZmZFbnRyeSAgICAgICAgICAgIGhlWzRdWzI1Nl07CisgICAgTExWaWRFbmNEU1BDb250ZXh0ICAgbGx2aWRlbmNkc3A7CisgICAgdm9pZCAoKnByZWRpY3QpKHN0cnVjdCBNYWdpY1lVVkNvbnRleHQgKnMsIHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworfSBNYWdpY1lVVkNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGxlZnRfcHJlZGljdChNYWdpY1lVVkNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIHVpbnQ4X3QgcHJldiA9IDA7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICBkc3RbaV0gPSBzcmNbaV0gLSBwcmV2OworICAgICAgICBwcmV2ICAgPSBzcmNbaV07CisgICAgfQorICAgIGRzdCArPSB3aWR0aDsKKyAgICBzcmMgKz0gc3RyaWRlOworICAgIGZvciAoaiA9IDE7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBwcmV2ID0gc3JjWy1zdHJpZGVdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldIC0gcHJldjsKKyAgICAgICAgICAgIHByZXYgICA9IHNyY1tpXTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gd2lkdGg7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBncmFkaWVudF9wcmVkaWN0KE1hZ2ljWVVWQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgbGVmdCA9IDAsIHRvcCwgbGVmdHRvcDsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGRzdFtpXSA9IHNyY1tpXSAtIGxlZnQ7CisgICAgICAgIGxlZnQgICA9IHNyY1tpXTsKKyAgICB9CisgICAgZHN0ICs9IHdpZHRoOworICAgIHNyYyArPSBzdHJpZGU7CisgICAgZm9yIChqID0gMTsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgIHRvcCA9IHNyY1stc3RyaWRlXTsKKyAgICAgICAgbGVmdCA9IHNyY1swXSAtIHRvcDsKKyAgICAgICAgZHN0WzBdID0gbGVmdDsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIHRvcCA9IHNyY1tpIC0gc3RyaWRlXTsKKyAgICAgICAgICAgIGxlZnR0b3AgPSBzcmNbaSAtIChzdHJpZGUgKyAxKV07CisgICAgICAgICAgICBsZWZ0ID0gc3JjW2ktMV07CisgICAgICAgICAgICBkc3RbaV0gPSAoc3JjW2ldIC0gdG9wKSAtIGxlZnQgKyBsZWZ0dG9wOworICAgICAgICB9CisgICAgICAgIGRzdCArPSB3aWR0aDsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1lZGlhbl9wcmVkaWN0KE1hZ2ljWVVWQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCBsZWZ0ID0gMCwgbGVmdHRvcDsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIGRzdFtpXSA9IHNyY1tpXSAtIGxlZnQ7CisgICAgICAgIGxlZnQgICA9IHNyY1tpXTsKKyAgICB9CisgICAgZHN0ICs9IHdpZHRoOworICAgIHNyYyArPSBzdHJpZGU7CisgICAgZm9yIChqID0gMTsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgIGxlZnQgPSBsZWZ0dG9wID0gc3JjWy1zdHJpZGVdOworICAgICAgICBzLT5sbHZpZGVuY2RzcC5zdWJfbWVkaWFuX3ByZWQoZHN0LCBzcmMgLSBzdHJpZGUsIHNyYywgd2lkdGgsICZsZWZ0LCAmbGVmdHRvcCk7CisgICAgICAgIGRzdCArPSB3aWR0aDsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtYWd5X2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNYWdpY1lVVkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOgorICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ00nLCAnOCcsICdSJywgJ0cnKTsKKyAgICAgICAgcy0+Y29ycmVsYXRlID0gMTsKKyAgICAgICAgcy0+Zm9ybWF0ID0gMHg2NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQOgorICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ00nLCAnOCcsICdSJywgJ0EnKTsKKyAgICAgICAgcy0+Y29ycmVsYXRlID0gMTsKKyAgICAgICAgcy0+Zm9ybWF0ID0gMHg2NjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnTScsICc4JywgJ1knLCAnMCcpOworICAgICAgICBzLT5oc2hpZnRbMV0gPQorICAgICAgICBzLT52c2hpZnRbMV0gPQorICAgICAgICBzLT5oc2hpZnRbMl0gPQorICAgICAgICBzLT52c2hpZnRbMl0gPSAxOworICAgICAgICBzLT5mb3JtYXQgPSAweDY5OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdNJywgJzgnLCAnWScsICcyJyk7CisgICAgICAgIHMtPmhzaGlmdFsxXSA9CisgICAgICAgIHMtPmhzaGlmdFsyXSA9IDE7CisgICAgICAgIHMtPmZvcm1hdCA9IDB4Njg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ00nLCAnOCcsICdZJywgJzQnKTsKKyAgICAgICAgcy0+Zm9ybWF0ID0gMHg2NzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOgorICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ00nLCAnOCcsICdZJywgJ0EnKTsKKyAgICAgICAgcy0+Zm9ybWF0ID0gMHg2YTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gTUtUQUcoJ00nLCAnOCcsICdHJywgJzAnKTsKKyAgICAgICAgcy0+Zm9ybWF0ID0gMHg2YjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQ6ICVkXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmZl9sbHZpZGVuY2RzcF9pbml0KCZzLT5sbHZpZGVuY2RzcCk7CisKKyAgICBzLT5wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhhdmN0eC0+cGl4X2ZtdCk7CisKKyAgICBzLT5uYl9zbGljZXMgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnBsYW5lczsgaSsrKSB7CisgICAgICAgIHMtPnNsaWNlc1tpXSA9IGF2X21hbGxvYyhhdmN0eC0+d2lkdGggKiAoYXZjdHgtPmhlaWdodCArIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIXMtPnNsaWNlc1tpXSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgdGVtcG9yYXJ5IGJ1ZmZlci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAocy0+ZnJhbWVfcHJlZCkgeworICAgIGNhc2UgTEVGVDogICAgIHMtPnByZWRpY3QgPSBsZWZ0X3ByZWRpY3Q7ICAgICBicmVhazsKKyAgICBjYXNlIEdSQURJRU5UOiBzLT5wcmVkaWN0ID0gZ3JhZGllbnRfcHJlZGljdDsgYnJlYWs7CisgICAgY2FzZSBNRURJQU46ICAgcy0+cHJlZGljdCA9IG1lZGlhbl9wcmVkaWN0OyAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hZ3lfaHVmZl9jbXBfbGVuKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgSHVmZkVudHJ5ICphYSA9IGEsICpiYiA9IGI7CisgICAgcmV0dXJuIChhYS0+bGVuIC0gYmItPmxlbikgKiAyNTYgKyBhYS0+c3ltIC0gYmItPnN5bTsKK30KKworc3RhdGljIGludCBodWZmX2NtcF9zeW0oY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBIdWZmRW50cnkgKmFhID0gYSwgKmJiID0gYjsKKyAgICByZXR1cm4gYmItPnN5bSAtIGFhLT5zeW07Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9jb2RlcyhIdWZmRW50cnkgKmhlKQoreworICAgIHVpbnQzMl90IGNvZGU7CisgICAgaW50IGk7CisKKyAgICBBVl9RU09SVChoZSwgMjU2LCBIdWZmRW50cnksIG1hZ3lfaHVmZl9jbXBfbGVuKTsKKworICAgIGNvZGUgPSAxOworICAgIGZvciAoaSA9IDI1NTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgaGVbaV0uY29kZSAgPSBjb2RlID4+ICgzMiAtIGhlW2ldLmxlbik7CisgICAgICAgIGNvZGUgICAgICAgKz0gMHg4MDAwMDAwMHUgPj4gKGhlW2ldLmxlbiAtIDEpOworICAgIH0KKworICAgIEFWX1FTT1JUKGhlLCAyNTYsIEh1ZmZFbnRyeSwgaHVmZl9jbXBfc3ltKTsKK30KKworc3RhdGljIHZvaWQgY291bnRfdXNhZ2UodWludDhfdCAqc3JjLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBQVGFibGUgKmNvdW50cykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgY291bnRzW3NyY1tpXV0ucHJvYisrOworICAgICAgICB9CisgICAgICAgIHNyYyArPSB3aWR0aDsKKyAgICB9Cit9CisKK3R5cGVkZWYgc3RydWN0IFBhY2thZ2VNZXJnZXJMaXN0IHsKKyAgICBpbnQgbml0ZW1zOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdCBhbmQgcHJvYmFiaWxpdHkgICAgICBleC4gNAorICAgIGludCBpdGVtX2lkeFs1MTVdOyAgICAgIC8vLzwgaW5kZXggcmFuZ2UgZm9yIGVhY2ggaXRlbSBpbiBpdGVtcyAgICAgICAgICAgICAgICAgICAwLCAyLCA1LCA5LCAxMworICAgIGludCBwcm9iYWJpbGl0eVs1MTRdOyAgIC8vLzwgcHJvYmFiaWxpdHkgb2YgZWFjaCBpdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCA4LCAxOCwgNDYKKyAgICBpbnQgaXRlbXNbMjU3ICogMTZdOyAgICAvLy88IGNoYWluIG9mIGFsbCBpbmRpdmlkdWFsIHZhbHVlcyB0aGF0IG1ha2UgdXAgaXRlbXMgICAgQSwgQiwgQSwgQiwgQywgQSwgQiwgQywgRCwgQywgRCwgRCwgRQorfSBQYWNrYWdlTWVyZ2VyTGlzdDsKKworc3RhdGljIGludCBjb21wYXJlX2J5X3Byb2IoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBQVGFibGUgYV92YWwgPSAqKFBUYWJsZSAqKWE7CisgICAgUFRhYmxlIGJfdmFsID0gKihQVGFibGUgKiliOworICAgIHJldHVybiBhX3ZhbC5wcm9iIC0gYl92YWwucHJvYjsKK30KKworc3RhdGljIHZvaWQgbWFneV9odWZmbWFuX2NvbXB1dGVfYml0cyhQVGFibGUgKnByb2JfdGFibGUsIEh1ZmZFbnRyeSAqZGlzdGluY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IG1heF9sZW5ndGgpCit7CisgICAgUGFja2FnZU1lcmdlckxpc3QgbGlzdF9hLCBsaXN0X2IsICp0byA9ICZsaXN0X2EsICpmcm9tID0gJmxpc3RfYiwgKnRlbXA7CisgICAgaW50IHRpbWVzLCBpLCBqLCBrOworICAgIGludCBuYml0c1syNTddID0gezB9OworICAgIGludCBtaW47CisKKyAgICBhdl9hc3NlcnQwKG1heF9sZW5ndGggPiAwKTsKKworICAgIHRvLT5uaXRlbXMgPSAwOworICAgIGZyb20tPm5pdGVtcyA9IDA7CisgICAgdG8tPml0ZW1faWR4WzBdID0gMDsKKyAgICBmcm9tLT5pdGVtX2lkeFswXSA9IDA7CisgICAgQVZfUVNPUlQocHJvYl90YWJsZSwgc2l6ZSwgUFRhYmxlLCBjb21wYXJlX2J5X3Byb2IpOworCisgICAgZm9yICh0aW1lcyA9IDA7IHRpbWVzIDw9IG1heF9sZW5ndGg7IHRpbWVzKyspIHsKKyAgICAgICAgdG8tPm5pdGVtcyA9IDA7CisgICAgICAgIHRvLT5pdGVtX2lkeFswXSA9IDA7CisKKyAgICAgICAgaiA9IDA7CisgICAgICAgIGsgPSAwOworCisgICAgICAgIGlmICh0aW1lcyA8IG1heF9sZW5ndGgpIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChpIDwgc2l6ZSB8fCBqICsgMSA8IGZyb20tPm5pdGVtcykgeworICAgICAgICAgICAgdG8tPm5pdGVtcysrOworICAgICAgICAgICAgdG8tPml0ZW1faWR4W3RvLT5uaXRlbXNdID0gdG8tPml0ZW1faWR4W3RvLT5uaXRlbXMgLSAxXTsKKyAgICAgICAgICAgIGlmIChpIDwgc2l6ZSAmJgorICAgICAgICAgICAgICAgIChqICsgMSA+PSBmcm9tLT5uaXRlbXMgfHwKKyAgICAgICAgICAgICAgICAgcHJvYl90YWJsZVtpXS5wcm9iIDwKKyAgICAgICAgICAgICAgICAgICAgIGZyb20tPnByb2JhYmlsaXR5W2pdICsgZnJvbS0+cHJvYmFiaWxpdHlbaiArIDFdKSkgeworICAgICAgICAgICAgICAgIHRvLT5pdGVtc1t0by0+aXRlbV9pZHhbdG8tPm5pdGVtc10rK10gPSBwcm9iX3RhYmxlW2ldLnZhbHVlOworICAgICAgICAgICAgICAgIHRvLT5wcm9iYWJpbGl0eVt0by0+bml0ZW1zIC0gMV0gPSBwcm9iX3RhYmxlW2ldLnByb2I7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSBmcm9tLT5pdGVtX2lkeFtqXTsgayA8IGZyb20tPml0ZW1faWR4W2ogKyAyXTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIHRvLT5pdGVtc1t0by0+aXRlbV9pZHhbdG8tPm5pdGVtc10rK10gPSBmcm9tLT5pdGVtc1trXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG8tPnByb2JhYmlsaXR5W3RvLT5uaXRlbXMgLSAxXSA9CisgICAgICAgICAgICAgICAgICAgIGZyb20tPnByb2JhYmlsaXR5W2pdICsgZnJvbS0+cHJvYmFiaWxpdHlbaiArIDFdOworICAgICAgICAgICAgICAgIGogKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0ZW1wID0gdG87CisgICAgICAgIHRvID0gZnJvbTsKKyAgICAgICAgZnJvbSA9IHRlbXA7CisgICAgfQorCisgICAgbWluID0gKHNpemUgLSAxIDwgZnJvbS0+bml0ZW1zKSA/IHNpemUgLSAxIDogZnJvbS0+bml0ZW1zOworICAgIGZvciAoaSA9IDA7IGkgPCBmcm9tLT5pdGVtX2lkeFttaW5dOyBpKyspIHsKKyAgICAgICAgbmJpdHNbZnJvbS0+aXRlbXNbaV1dKys7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBkaXN0aW5jdHNbaV0uc3ltID0gaTsKKyAgICAgICAgZGlzdGluY3RzW2ldLmxlbiA9IG5iaXRzW2ldOworICAgIH0KK30KKworc3RhdGljIGludCBlbmNvZGVfdGFibGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBQdXRCaXRDb250ZXh0ICpwYiwgSHVmZkVudHJ5ICpoZSkKK3sKKyAgICBQVGFibGUgY291bnRzWzI1Nl0gPSB7IHswfSB9OworICAgIGludCBpOworCisgICAgY291bnRfdXNhZ2UoZHN0LCB3aWR0aCwgaGVpZ2h0LCBjb3VudHMpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgIGNvdW50c1tpXS5wcm9iKys7CisgICAgICAgIGNvdW50c1tpXS52YWx1ZSA9IDI1NSAtIGk7CisgICAgfQorCisgICAgbWFneV9odWZmbWFuX2NvbXB1dGVfYml0cyhjb3VudHMsIGhlLCAyNTYsIDE2KTsKKworICAgIGNhbGN1bGF0ZV9jb2RlcyhoZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworICAgICAgICBwdXRfYml0cyhwYiwgNywgaGVbaV0ubGVuKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNvZGVfc2xpY2UodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBkc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgSHVmZkVudHJ5ICpoZSwgaW50IHByZWRpY3Rpb24pCit7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgY291bnQ7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgZHN0LCBkc3Rfc2l6ZSk7CisKKyAgICBwdXRfYml0cygmcGIsIDgsIDApOworICAgIHB1dF9iaXRzKCZwYiwgOCwgcHJlZGljdGlvbik7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBpZHggPSBzcmNbaV07CisgICAgICAgICAgICBwdXRfYml0cygmcGIsIGhlW2lkeF0ubGVuLCBoZVtpZHhdLmNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgc3JjICs9IHdpZHRoOworICAgIH0KKworICAgIGNvdW50ID0gcHV0X2JpdHNfY291bnQoJnBiKSAmIDB4MUY7CisKKyAgICBpZiAoY291bnQpCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMzIgLSBjb3VudCwgMCk7CisKKyAgICBjb3VudCA9IHB1dF9iaXRzX2NvdW50KCZwYik7CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgcmV0dXJuIGNvdW50ID4+IDM7Cit9CisKK3N0YXRpYyBpbnQgbWFneV9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIE1hZ2ljWVVWQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgUHV0Qnl0ZUNvbnRleHQgcGI7CisgICAgY29uc3QgaW50IHdpZHRoID0gYXZjdHgtPndpZHRoLCBoZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworICAgIGludCBwb3MsIHNsaWNlLCBpLCBqLCByZXQgPSAwOworCisgICAgcmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgcGt0LCAoMjU2ICsgNCAqIHMtPm5iX3NsaWNlcyArIHdpZHRoICogaGVpZ2h0KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZXMgKyAyNTYsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMzIoJnBiLCBNS1RBRygnTScsICdBJywgJ0cnLCAnWScpKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIDMyKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIDcpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgcy0+Zm9ybWF0KTsKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGIsIDApOworICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKCZwYiwgMCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMzIoJnBiLCAwKTsKKworICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKCZwYiwgYXZjdHgtPndpZHRoKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIGF2Y3R4LT5oZWlnaHQpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKCZwYiwgYXZjdHgtPndpZHRoKTsKKyAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIGF2Y3R4LT5oZWlnaHQpOworICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKCZwYiwgMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMzIoJnBiLCAwKTsKKyAgICAgICAgZm9yIChqID0gMTsgaiA8IHMtPm5iX3NsaWNlczsgaisrKSB7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUzMigmcGIsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBzLT5wbGFuZXMpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnBsYW5lczsgaSsrKSB7CisgICAgICAgIGZvciAoc2xpY2UgPSAwOyBzbGljZSA8IHMtPm5iX3NsaWNlczsgc2xpY2UrKykgeworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5jb3JyZWxhdGUpIHsKKyAgICAgICAgdWludDhfdCAqciwgKmcsICpiOworICAgICAgICBBVkZyYW1lICpwID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworCisgICAgICAgIGcgPSBwLT5kYXRhWzBdOworICAgICAgICBiID0gcC0+ZGF0YVsxXTsKKyAgICAgICAgciA9IHAtPmRhdGFbMl07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBzLT5sbHZpZGVuY2RzcC5kaWZmX2J5dGVzKGIsIGIsIGcsIHdpZHRoKTsKKyAgICAgICAgICAgIHMtPmxsdmlkZW5jZHNwLmRpZmZfYnl0ZXMociwgciwgZywgd2lkdGgpOworICAgICAgICAgICAgZyArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGIgKz0gcC0+bGluZXNpemVbMV07CisgICAgICAgICAgICByICs9IHAtPmxpbmVzaXplWzJdOworICAgICAgICB9CisKKyAgICAgICAgRkZTV0FQKHVpbnQ4X3QqLCBwLT5kYXRhWzBdLCBwLT5kYXRhWzFdKTsKKyAgICAgICAgRkZTV0FQKGludCwgcC0+bGluZXNpemVbMF0sIHAtPmxpbmVzaXplWzFdKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoc2xpY2UgPSAwOyBzbGljZSA8IHMtPm5iX3NsaWNlczsgc2xpY2UrKykgeworICAgICAgICAgICAgICAgIHMtPnByZWRpY3QocywgcC0+ZGF0YVtpXSwgcy0+c2xpY2VzW2ldLCBwLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT53aWR0aCwgcC0+aGVpZ2h0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnApOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgZm9yIChzbGljZSA9IDA7IHNsaWNlIDwgcy0+bmJfc2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgICAgICAgICAgcy0+cHJlZGljdChzLCBmcmFtZS0+ZGF0YVtpXSwgcy0+c2xpY2VzW2ldLCBmcmFtZS0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DRUlMX1JTSElGVChmcmFtZS0+d2lkdGgsIHMtPmhzaGlmdFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DRUlMX1JTSElGVChmcmFtZS0+aGVpZ2h0LCBzLT52c2hpZnRbaV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBwa3QtPmRhdGEgKyBieXRlc3RyZWFtMl90ZWxsX3AoJnBiKSwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnRfcCgmcGIpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wbGFuZXM7IGkrKykgeworICAgICAgICBlbmNvZGVfdGFibGUoYXZjdHgsIHMtPnNsaWNlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgIEFWX0NFSUxfUlNISUZUKGZyYW1lLT53aWR0aCwgIHMtPmhzaGlmdFtpXSksCisgICAgICAgICAgICAgICAgICAgICBBVl9DRUlMX1JTSElGVChmcmFtZS0+aGVpZ2h0LCBzLT52c2hpZnRbaV0pLAorICAgICAgICAgICAgICAgICAgICAgJnMtPnBiLCBzLT5oZVtpXSk7CisgICAgfQorICAgIHMtPnRhYmxlc19zaXplID0gKHB1dF9iaXRzX2NvdW50KCZzLT5wYikgKyA3KSA+PiAzOworICAgIGJ5dGVzdHJlYW0yX3NraXBfcCgmcGIsIHMtPnRhYmxlc19zaXplKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wbGFuZXM7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBzbGljZV9zaXplOworCisgICAgICAgIHMtPnNsaWNlX3Bvc1tpXSA9IGJ5dGVzdHJlYW0yX3RlbGxfcCgmcGIpOworICAgICAgICBzbGljZV9zaXplID0gZW5jb2RlX3NsaWNlKHMtPnNsaWNlc1tpXSwgcGt0LT5kYXRhICsgYnl0ZXN0cmVhbTJfdGVsbF9wKCZwYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnRfcCgmcGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NFSUxfUlNISUZUKGZyYW1lLT53aWR0aCwgIHMtPmhzaGlmdFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0VJTF9SU0hJRlQoZnJhbWUtPmhlaWdodCwgcy0+dnNoaWZ0W2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oZVtpXSwgcy0+ZnJhbWVfcHJlZCk7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXBfcCgmcGIsIHNsaWNlX3NpemUpOworICAgIH0KKworICAgIHBvcyA9IGJ5dGVzdHJlYW0yX3RlbGxfcCgmcGIpOworICAgIGJ5dGVzdHJlYW0yX3NlZWtfcCgmcGIsIDMyLCBTRUVLX1NFVCk7CisgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMzIoJnBiLCBzLT5zbGljZV9wb3NbMF0gLSAzMik7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPnBsYW5lczsgaSsrKSB7CisgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKCZwYiwgcy0+c2xpY2VfcG9zW2ldIC0gMzIpOworICAgIH0KKyAgICBieXRlc3RyZWFtMl9zZWVrX3AoJnBiLCBwb3MsIFNFRUtfU0VUKTsKKworICAgIHBrdC0+c2l6ZSAgID0gYnl0ZXN0cmVhbTJfdGVsbF9wKCZwYik7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICAqZ290X3BhY2tldCA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG1hZ3lfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNYWdpY1lVVkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnBsYW5lczsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmcy0+c2xpY2VzW2ldKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNYWdpY1lVVkNvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicHJlZCIsICJQcmVkaWN0aW9uIG1ldGhvZCIsIE9GRlNFVChmcmFtZV9wcmVkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1MRUZUfSwgTEVGVCwgTUVESUFOLCBWRSwgInByZWQiIH0sCisgICAgeyAibGVmdCIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTEVGVCB9LCAgICAgMCwgMCwgVkUsICJwcmVkIiB9LAorICAgIHsgImdyYWRpZW50IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEdSQURJRU5UIH0sIDAsIDAsIFZFLCAicHJlZCIgfSwKKyAgICB7ICJtZWRpYW4iLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBNRURJQU4gfSwgICAwLCAwLCBWRSwgInByZWQiIH0sCisgICAgeyBOVUxMfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG1hZ2ljeXV2X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm1hZ2ljeXV2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbWFnaWN5dXZfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJtYWdpY3l1diIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWFnaWNZVVYgdmlkZW8iKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01BR0lDWVVWLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKE1hZ2ljWVVWQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgICAgPSAmbWFnaWN5dXZfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgICAgPSBtYWd5X2VuY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgID0gbWFneV9lbmNvZGVfY2xvc2UsCisgICAgLmVuY29kZTIgICAgICAgICAgPSBtYWd5X2VuY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTIHwgQVZfQ09ERUNfQ0FQX0lOVFJBX09OTFkgfCBBVl9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMLAorICAgIC5waXhfZm10cyAgICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgICAgICAgICAgICAgICAgICAgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21hdGhvcHMuYyBiL2xpYmF2Y29kZWMvbWF0aG9wcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWM4ZTY5Li4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvbWF0aG9wcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotI2luY2x1ZGUgIm1hdGhvcHMuaCIKLQotI2lmZGVmIFRFU1QKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIHVuc2lnbmVkIHU7Ci0KLSAgICBmb3IodT0wOyB1PDY1NTM2OyB1KyspIHsKLSAgICAgICAgdW5zaWduZWQgcyA9IHUqdTsKLSAgICAgICAgdW5zaWduZWQgcm9vdCA9IGZmX3NxcnQocyk7Ci0gICAgICAgIHVuc2lnbmVkIHJvb3RfbTEgPSBmZl9zcXJ0KHMtMSk7Ci0gICAgICAgIGlmIChzICYmIHJvb3QgIT0gdSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZl9zcXJ0IGZhaWxlZCBhdCAldSB3aXRoICV1XG4iLCBzLCByb290KTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1ICYmIHJvb3RfbTEgIT0gdSAtIDEpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmZfc3FydCBmYWlsZWQgYXQgJXUgd2l0aCAldVxuIiwgcywgcm9vdCk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21hdGhvcHMuaCBiL2xpYmF2Y29kZWMvbWF0aG9wcy5oCmluZGV4IDQ5ODhmMWQuLjFjMzU2NjQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWF0aG9wcy5oCisrKyBiL2xpYmF2Y29kZWMvbWF0aG9wcy5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3JldmVyc2UuaCIKICNpbmNsdWRlICJjb25maWcuaCIKIAogI2RlZmluZSBNQVhfTkVHX0NST1AgMTAyNApAQCAtMzMsNiArMzQsNyBAQAogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfc3FydF90YWJbMjU2XTsKIGV4dGVybiBjb25zdCB1aW50OF90IGZmX2Nyb3BfdGFiWzI1NiArIDIgKiBNQVhfTkVHX0NST1BdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfemlnemFnX2RpcmVjdFs2NF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl96aWd6YWdfc2NhblsxNisxXTsKIAogI2lmICAgQVJDSF9BUk0KICMgICBpbmNsdWRlICJhcm0vbWF0aG9wcy5oIgpAQCAtOTUsMTUgKzk3LDYgQEAKICNkZWZpbmUgbWlkX3ByZWQgbWlkX3ByZWQKIHN0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50IG1pZF9wcmVkKGludCBhLCBpbnQgYiwgaW50IGMpCiB7Ci0jaWYgMAotICAgIGludCB0PSAoYS1iKSYoKGEtYik+PjMxKTsKLSAgICBhLT10OwotICAgIGIrPXQ7Ci0gICAgYi09IChiLWMpJigoYi1jKT4+MzEpOwotICAgIGIrPSAoYS1iKSYoKGEtYik+PjMxKTsKLQotICAgIHJldHVybiBiOwotI2Vsc2UKICAgICBpZihhPmIpewogICAgICAgICBpZihjPmIpewogICAgICAgICAgICAgaWYoYz5hKSBiPWE7CkBAIC0xMTYsNyArMTA5LDYgQEAKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gYjsKLSNlbmRpZgogfQogI2VuZGlmCiAKQEAgLTI0OCw0ICsyNDAsMTIgQEAKICAgICByZXR1cm4gYi5zODsKIH0KIAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgYml0c3dhcF8zMih1aW50MzJfdCB4KQoreworICAgIHJldHVybiAodWludDMyX3QpZmZfcmV2ZXJzZVsgeCAgICAgICAgJiAweEZGXSA8PCAyNCB8CisgICAgICAgICAgICh1aW50MzJfdClmZl9yZXZlcnNlWyh4ID4+IDgpICAmIDB4RkZdIDw8IDE2IHwKKyAgICAgICAgICAgKHVpbnQzMl90KWZmX3JldmVyc2VbKHggPj4gMTYpICYgMHhGRl0gPDwgOCAgfAorICAgICAgICAgICAodWludDMyX3QpZmZfcmV2ZXJzZVsgeCA+PiAyNF07Cit9CisKICNlbmRpZiAvKiBBVkNPREVDX01BVEhPUFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tYXRodGFibGVzLmMgYi9saWJhdmNvZGVjL21hdGh0YWJsZXMuYwppbmRleCA3YjVlZmI4Li44MWVhYmM3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21hdGh0YWJsZXMuYworKysgYi9saWJhdmNvZGVjL21hdGh0YWJsZXMuYwpAQCAtMTA1LDMgKzEwNSwxMCBAQAogICAgIDU4LCA1OSwgNTIsIDQ1LCAzOCwgMzEsIDM5LCA0NiwKICAgICA1MywgNjAsIDYxLCA1NCwgNDcsIDU1LCA2MiwgNjMKIH07CisKK2NvbnN0IHVpbnQ4X3QgZmZfemlnemFnX3NjYW5bMTYrMV0gPSB7CisgICAgMCArIDAgKiA0LCAxICsgMCAqIDQsIDAgKyAxICogNCwgMCArIDIgKiA0LAorICAgIDEgKyAxICogNCwgMiArIDAgKiA0LCAzICsgMCAqIDQsIDIgKyAxICogNCwKKyAgICAxICsgMiAqIDQsIDAgKyAzICogNCwgMSArIDMgKiA0LCAyICsgMiAqIDQsCisgICAgMyArIDEgKiA0LCAzICsgMiAqIDQsIDIgKyAzICogNCwgMyArIDMgKiA0LAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWRjdDE1LmMgYi9saWJhdmNvZGVjL21kY3QxNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzUwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21kY3QxNS5jCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgTW96aWxsYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE3IFJvc3Rpc2xhdiBQZWhsaXZhbm92IDxhdG9tbnVrZXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDZWx0IG5vbi1wb3dlciBvZiAyIGlNRENUCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKworI2luY2x1ZGUgIm1kY3QxNS5oIgorCisjZGVmaW5lIEZGVF9GTE9BVCAxCisjaW5jbHVkZSAiZmZ0LWludGVybmFsLmgiCisKKyNkZWZpbmUgQ01VTDMoYywgYSwgYikgQ01VTCgoYykucmUsIChjKS5pbSwgKGEpLnJlLCAoYSkuaW0sIChiKS5yZSwgKGIpLmltKQorCithdl9jb2xkIHZvaWQgZmZfbWRjdDE1X3VuaW5pdChNRENUMTVDb250ZXh0ICoqcHMpCit7CisgICAgTURDVDE1Q29udGV4dCAqcyA9ICpwczsKKworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworCisgICAgZmZfZmZ0X2VuZCgmcy0+cHR3b19mZnQpOworCisgICAgYXZfZnJlZXAoJnMtPnBmYV9wcmVyZWluZGV4KTsKKyAgICBhdl9mcmVlcCgmcy0+cGZhX3Bvc3RyZWluZGV4KTsKKyAgICBhdl9mcmVlcCgmcy0+dHdpZGRsZV9leHB0YWIpOworICAgIGF2X2ZyZWVwKCZzLT50bXApOworCisgICAgYXZfZnJlZXAocHMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpbml0X3BmYV9yZWluZGV4X3RhYnMoTURDVDE1Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCBpbnQgYl9wdHdvID0gcy0+cHR3b19mZnQubmJpdHM7IC8qIEJpdHMgZm9yIHRoZSBwb3dlciBvZiB0d28gRkZUcyAqLworICAgIGNvbnN0IGludCBsX3B0d28gPSAxIDw8IGJfcHR3bzsgLyogVG90YWwgbGVuZ3RoIGZvciB0aGUgcG93ZXIgb2YgdHdvIEZGVHMgKi8KKyAgICBjb25zdCBpbnQgaW52XzEgPSBsX3B0d28gPDwgKCg0IC0gYl9wdHdvKSAmIDMpOyAvKiAoMl5iX3B0d28pXi0xIG1vZCAxNSAqLworICAgIGNvbnN0IGludCBpbnZfMiA9IDB4ZWVlZWVlZWYgJiAoKDFVIDw8IGJfcHR3bykgLSAxKTsgLyogMTVeLTEgbW9kIDJeYl9wdHdvICovCisKKyAgICBzLT5wZmFfcHJlcmVpbmRleCA9IGF2X21hbGxvY19hcnJheSgxNSAqIGxfcHR3bywgc2l6ZW9mKCpzLT5wZmFfcHJlcmVpbmRleCkpOworICAgIGlmICghcy0+cGZhX3ByZXJlaW5kZXgpCisgICAgICAgIHJldHVybiAxOworCisgICAgcy0+cGZhX3Bvc3RyZWluZGV4ID0gYXZfbWFsbG9jX2FycmF5KDE1ICogbF9wdHdvLCBzaXplb2YoKnMtPnBmYV9wb3N0cmVpbmRleCkpOworICAgIGlmICghcy0+cGZhX3Bvc3RyZWluZGV4KQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIFByZS9Qb3N0LXJlaW5kZXggKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9wdHdvOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE1OyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBxX3ByZSA9ICgobF9wdHdvICogaikvMTUgKyBpKSA+PiBiX3B0d287CisgICAgICAgICAgICBjb25zdCBpbnQgcV9wb3N0ID0gKCgoaippbnZfMSkvMTUpICsgKGkqaW52XzIpKSA+PiBiX3B0d287CisgICAgICAgICAgICBjb25zdCBpbnQga19wcmUgPSAxNSppICsgKGogLSBxX3ByZSoxNSkqKDEgPDwgYl9wdHdvKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBrX3Bvc3QgPSBpKmludl8yKjE1ICsgaippbnZfMSAtIDE1KnFfcG9zdCpsX3B0d287CisgICAgICAgICAgICBzLT5wZmFfcHJlcmVpbmRleFtpKjE1ICsgal0gPSBrX3ByZSA8PCAxOworICAgICAgICAgICAgcy0+cGZhX3Bvc3RyZWluZGV4W2tfcG9zdF0gPSBsX3B0d28qaiArIGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyogU3RyaWRlIGlzIGhhcmRjb2RlZCB0byAzICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0NShGRlRDb21wbGV4ICpvdXQsIEZGVENvbXBsZXggKmluLCBGRlRDb21wbGV4IGV4cHRhYlsyXSkKK3sKKyAgICBGRlRDb21wbGV4IHowWzRdLCB0WzZdOworCisgICAgdFswXS5yZSA9IGluWzNdLnJlICsgaW5bMTJdLnJlOworICAgIHRbMF0uaW0gPSBpblszXS5pbSArIGluWzEyXS5pbTsKKyAgICB0WzFdLmltID0gaW5bM10ucmUgLSBpblsxMl0ucmU7CisgICAgdFsxXS5yZSA9IGluWzNdLmltIC0gaW5bMTJdLmltOworICAgIHRbMl0ucmUgPSBpbls2XS5yZSArIGluWyA5XS5yZTsKKyAgICB0WzJdLmltID0gaW5bNl0uaW0gKyBpblsgOV0uaW07CisgICAgdFszXS5pbSA9IGluWzZdLnJlIC0gaW5bIDldLnJlOworICAgIHRbM10ucmUgPSBpbls2XS5pbSAtIGluWyA5XS5pbTsKKworICAgIG91dFswXS5yZSA9IGluWzBdLnJlICsgaW5bM10ucmUgKyBpbls2XS5yZSArIGluWzldLnJlICsgaW5bMTJdLnJlOworICAgIG91dFswXS5pbSA9IGluWzBdLmltICsgaW5bM10uaW0gKyBpbls2XS5pbSArIGluWzldLmltICsgaW5bMTJdLmltOworCisgICAgdFs0XS5yZSA9IGV4cHRhYlswXS5yZSAqIHRbMl0ucmUgLSBleHB0YWJbMV0ucmUgKiB0WzBdLnJlOworICAgIHRbNF0uaW0gPSBleHB0YWJbMF0ucmUgKiB0WzJdLmltIC0gZXhwdGFiWzFdLnJlICogdFswXS5pbTsKKyAgICB0WzBdLnJlID0gZXhwdGFiWzBdLnJlICogdFswXS5yZSAtIGV4cHRhYlsxXS5yZSAqIHRbMl0ucmU7CisgICAgdFswXS5pbSA9IGV4cHRhYlswXS5yZSAqIHRbMF0uaW0gLSBleHB0YWJbMV0ucmUgKiB0WzJdLmltOworICAgIHRbNV0ucmUgPSBleHB0YWJbMF0uaW0gKiB0WzNdLnJlIC0gZXhwdGFiWzFdLmltICogdFsxXS5yZTsKKyAgICB0WzVdLmltID0gZXhwdGFiWzBdLmltICogdFszXS5pbSAtIGV4cHRhYlsxXS5pbSAqIHRbMV0uaW07CisgICAgdFsxXS5yZSA9IGV4cHRhYlswXS5pbSAqIHRbMV0ucmUgKyBleHB0YWJbMV0uaW0gKiB0WzNdLnJlOworICAgIHRbMV0uaW0gPSBleHB0YWJbMF0uaW0gKiB0WzFdLmltICsgZXhwdGFiWzFdLmltICogdFszXS5pbTsKKworICAgIHowWzBdLnJlID0gdFswXS5yZSAtIHRbMV0ucmU7CisgICAgejBbMF0uaW0gPSB0WzBdLmltIC0gdFsxXS5pbTsKKyAgICB6MFsxXS5yZSA9IHRbNF0ucmUgKyB0WzVdLnJlOworICAgIHowWzFdLmltID0gdFs0XS5pbSArIHRbNV0uaW07CisKKyAgICB6MFsyXS5yZSA9IHRbNF0ucmUgLSB0WzVdLnJlOworICAgIHowWzJdLmltID0gdFs0XS5pbSAtIHRbNV0uaW07CisgICAgejBbM10ucmUgPSB0WzBdLnJlICsgdFsxXS5yZTsKKyAgICB6MFszXS5pbSA9IHRbMF0uaW0gKyB0WzFdLmltOworCisgICAgb3V0WzFdLnJlID0gaW5bMF0ucmUgKyB6MFszXS5yZTsKKyAgICBvdXRbMV0uaW0gPSBpblswXS5pbSArIHowWzBdLmltOworICAgIG91dFsyXS5yZSA9IGluWzBdLnJlICsgejBbMl0ucmU7CisgICAgb3V0WzJdLmltID0gaW5bMF0uaW0gKyB6MFsxXS5pbTsKKyAgICBvdXRbM10ucmUgPSBpblswXS5yZSArIHowWzFdLnJlOworICAgIG91dFszXS5pbSA9IGluWzBdLmltICsgejBbMl0uaW07CisgICAgb3V0WzRdLnJlID0gaW5bMF0ucmUgKyB6MFswXS5yZTsKKyAgICBvdXRbNF0uaW0gPSBpblswXS5pbSArIHowWzNdLmltOworfQorCitzdGF0aWMgdm9pZCBmZnQxNV9jKEZGVENvbXBsZXggKm91dCwgRkZUQ29tcGxleCAqaW4sIEZGVENvbXBsZXggKmV4cHRhYiwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBpbnQgazsKKyAgICBGRlRDb21wbGV4IHRtcDFbNV0sIHRtcDJbNV0sIHRtcDNbNV07CisKKyAgICBmZnQ1KHRtcDEsIGluICsgMCwgZXhwdGFiICsgMTkpOworICAgIGZmdDUodG1wMiwgaW4gKyAxLCBleHB0YWIgKyAxOSk7CisgICAgZmZ0NSh0bXAzLCBpbiArIDIsIGV4cHRhYiArIDE5KTsKKworICAgIGZvciAoayA9IDA7IGsgPCA1OyBrKyspIHsKKyAgICAgICAgRkZUQ29tcGxleCB0WzJdOworCisgICAgICAgIENNVUwzKHRbMF0sIHRtcDJba10sIGV4cHRhYltrXSk7CisgICAgICAgIENNVUwzKHRbMV0sIHRtcDNba10sIGV4cHRhYlsyICoga10pOworICAgICAgICBvdXRbc3RyaWRlKmtdLnJlID0gdG1wMVtrXS5yZSArIHRbMF0ucmUgKyB0WzFdLnJlOworICAgICAgICBvdXRbc3RyaWRlKmtdLmltID0gdG1wMVtrXS5pbSArIHRbMF0uaW0gKyB0WzFdLmltOworCisgICAgICAgIENNVUwzKHRbMF0sIHRtcDJba10sIGV4cHRhYltrICsgNV0pOworICAgICAgICBDTVVMMyh0WzFdLCB0bXAzW2tdLCBleHB0YWJbMiAqIChrICsgNSldKTsKKyAgICAgICAgb3V0W3N0cmlkZSooayArIDUpXS5yZSA9IHRtcDFba10ucmUgKyB0WzBdLnJlICsgdFsxXS5yZTsKKyAgICAgICAgb3V0W3N0cmlkZSooayArIDUpXS5pbSA9IHRtcDFba10uaW0gKyB0WzBdLmltICsgdFsxXS5pbTsKKworICAgICAgICBDTVVMMyh0WzBdLCB0bXAyW2tdLCBleHB0YWJbayArIDEwXSk7CisgICAgICAgIENNVUwzKHRbMV0sIHRtcDNba10sIGV4cHRhYlsyICogayArIDVdKTsKKyAgICAgICAgb3V0W3N0cmlkZSooayArIDEwKV0ucmUgPSB0bXAxW2tdLnJlICsgdFswXS5yZSArIHRbMV0ucmU7CisgICAgICAgIG91dFtzdHJpZGUqKGsgKyAxMCldLmltID0gdG1wMVtrXS5pbSArIHRbMF0uaW0gKyB0WzFdLmltOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbWRjdDE1KE1EQ1QxNUNvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGksIGo7CisgICAgY29uc3QgaW50IGxlbjQgPSBzLT5sZW40LCBsZW4zID0gbGVuNCAqIDMsIGxlbjggPSBsZW40ID4+IDE7CisgICAgY29uc3QgaW50IGxfcHR3byA9IDEgPDwgcy0+cHR3b19mZnQubmJpdHM7CisgICAgRkZUQ29tcGxleCBmZnQxNWluWzE1XTsKKworICAgIC8qIEZvbGRpbmcgYW5kIHByZS1yZWluZGV4aW5nICovCisgICAgZm9yIChpID0gMDsgaSA8IGxfcHR3bzsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgayA9IHMtPnBmYV9wcmVyZWluZGV4W2kqMTUgKyBqXTsKKyAgICAgICAgICAgIEZGVENvbXBsZXggdG1wLCBleHAgPSBzLT50d2lkZGxlX2V4cHRhYltrID4+IDFdOworICAgICAgICAgICAgaWYgKGsgPCBsZW40KSB7CisgICAgICAgICAgICAgICAgdG1wLnJlID0gLXNyY1sgbGVuNCArIGtdICsgc3JjWzEqbGVuNCAtIDEgLSBrXTsKKyAgICAgICAgICAgICAgICB0bXAuaW0gPSAtc3JjWyBsZW4zICsga10gLSBzcmNbMSpsZW4zIC0gMSAtIGtdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAucmUgPSAtc3JjWyBsZW40ICsga10gLSBzcmNbNSpsZW40IC0gMSAtIGtdOworICAgICAgICAgICAgICAgIHRtcC5pbSA9ICBzcmNbLWxlbjQgKyBrXSAtIHNyY1sxKmxlbjMgLSAxIC0ga107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDTVVMKGZmdDE1aW5bal0uaW0sIGZmdDE1aW5bal0ucmUsIHRtcC5yZSwgdG1wLmltLCBleHAucmUsIGV4cC5pbSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+ZmZ0MTUocy0+dG1wICsgcy0+cHR3b19mZnQucmV2dGFiW2ldLCBmZnQxNWluLCBzLT5leHB0YWIsIGxfcHR3byk7CisgICAgfQorCisgICAgLyogVGhlbiBhIDE1eE4gRkZUICh3aGVyZSBOIGlzIGEgcG93ZXIgb2YgdHdvKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgICAgICBzLT5wdHdvX2ZmdC5mZnRfY2FsYygmcy0+cHR3b19mZnQsIHMtPnRtcCArIGxfcHR3byppKTsKKworICAgIC8qIFJlaW5kZXggYWdhaW4sIGFwcGx5IHR3aWRkbGVzIGFuZCBvdXRwdXQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuODsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBpMCA9IGxlbjggKyBpLCBpMSA9IGxlbjggLSBpIC0gMTsKKyAgICAgICAgY29uc3QgaW50IHMwID0gcy0+cGZhX3Bvc3RyZWluZGV4W2kwXSwgczEgPSBzLT5wZmFfcG9zdHJlaW5kZXhbaTFdOworCisgICAgICAgIENNVUwoZHN0WzIqaTEqc3RyaWRlICsgc3RyaWRlXSwgZHN0WzIqaTAqc3RyaWRlXSwgcy0+dG1wW3MwXS5yZSwgcy0+dG1wW3MwXS5pbSwKKyAgICAgICAgICAgICBzLT50d2lkZGxlX2V4cHRhYltpMF0uaW0sIHMtPnR3aWRkbGVfZXhwdGFiW2kwXS5yZSk7CisgICAgICAgIENNVUwoZHN0WzIqaTAqc3RyaWRlICsgc3RyaWRlXSwgZHN0WzIqaTEqc3RyaWRlXSwgcy0+dG1wW3MxXS5yZSwgcy0+dG1wW3MxXS5pbSwKKyAgICAgICAgICAgICBzLT50d2lkZGxlX2V4cHRhYltpMV0uaW0sIHMtPnR3aWRkbGVfZXhwdGFiW2kxXS5yZSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpbWRjdDE1X2hhbGYoTURDVDE1Q29udGV4dCAqcywgZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIEZGVENvbXBsZXggZmZ0MTVpblsxNV07CisgICAgRkZUQ29tcGxleCAqeiA9IChGRlRDb21wbGV4ICopZHN0OworICAgIGludCBpLCBqLCBsZW44ID0gcy0+bGVuNCA+PiAxLCBsX3B0d28gPSAxIDw8IHMtPnB0d29fZmZ0Lm5iaXRzOworICAgIGNvbnN0IGZsb2F0ICppbjEgPSBzcmMsICppbjIgPSBzcmMgKyAocy0+bGVuMiAtIDEpICogc3RyaWRlOworCisgICAgLyogUmVpbmRleCBpbnB1dCwgcHV0dGluZyBpdCBpbnRvIGEgYnVmZmVyIGFuZCBkb2luZyBhbiBOeDE1IEZGVCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsX3B0d287IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTU7IGorKykgeworICAgICAgICAgICAgY29uc3QgaW50IGsgPSBzLT5wZmFfcHJlcmVpbmRleFtpKjE1ICsgal07CisgICAgICAgICAgICBGRlRDb21wbGV4IHRtcCA9IHsgaW4yWy1rKnN0cmlkZV0sIGluMVtrKnN0cmlkZV0gfTsKKyAgICAgICAgICAgIENNVUwzKGZmdDE1aW5bal0sIHRtcCwgcy0+dHdpZGRsZV9leHB0YWJbayA+PiAxXSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+ZmZ0MTUocy0+dG1wICsgcy0+cHR3b19mZnQucmV2dGFiW2ldLCBmZnQxNWluLCBzLT5leHB0YWIsIGxfcHR3byk7CisgICAgfQorCisgICAgLyogVGhlbiBhIDE1eE4gRkZUICh3aGVyZSBOIGlzIGEgcG93ZXIgb2YgdHdvKSAqLworICAgIGZvciAoaSA9IDA7IGkgPCAxNTsgaSsrKQorICAgICAgICBzLT5wdHdvX2ZmdC5mZnRfY2FsYygmcy0+cHR3b19mZnQsIHMtPnRtcCArIGxfcHR3byppKTsKKworICAgIC8qIFJlaW5kZXggYWdhaW4sIGFwcGx5IHR3aWRkbGVzIGFuZCBvdXRwdXQgKi8KKyAgICBzLT5wb3N0cmVpbmRleCh6LCBzLT50bXAsIHMtPnR3aWRkbGVfZXhwdGFiLCBzLT5wZmFfcG9zdHJlaW5kZXgsIGxlbjgpOworfQorCitzdGF0aWMgdm9pZCBwb3N0cm90YXRlX2MoRkZUQ29tcGxleCAqb3V0LCBGRlRDb21wbGV4ICppbiwgRkZUQ29tcGxleCAqZXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbHV0LCBwdHJkaWZmX3QgbGVuOCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIFJlaW5kZXggYWdhaW4sIGFwcGx5IHR3aWRkbGVzIGFuZCBvdXRwdXQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuODsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBpMCA9IGxlbjggKyBpLCBpMSA9IGxlbjggLSBpIC0gMTsKKyAgICAgICAgY29uc3QgaW50IHMwID0gbHV0W2kwXSwgczEgPSBsdXRbaTFdOworCisgICAgICAgIENNVUwob3V0W2kxXS5yZSwgb3V0W2kwXS5pbSwgaW5bczFdLmltLCBpbltzMV0ucmUsIGV4cFtpMV0uaW0sIGV4cFtpMV0ucmUpOworICAgICAgICBDTVVMKG91dFtpMF0ucmUsIG91dFtpMV0uaW0sIGluW3MwXS5pbSwgaW5bczBdLnJlLCBleHBbaTBdLmltLCBleHBbaTBdLnJlKTsKKyAgICB9Cit9CisKK2F2X2NvbGQgaW50IGZmX21kY3QxNV9pbml0KE1EQ1QxNUNvbnRleHQgKipwcywgaW50IGludmVyc2UsIGludCBOLCBkb3VibGUgc2NhbGUpCit7CisgICAgTURDVDE1Q29udGV4dCAqczsKKyAgICBkb3VibGUgYWxwaGEsIHRoZXRhOworICAgIGludCBsZW4yID0gMTUgKiAoMSA8PCBOKTsKKyAgICBpbnQgbGVuICA9IDIgKiBsZW4yOworICAgIGludCBpOworCisgICAgLyogVGVzdGVkIGFuZCB2ZXJpZmllZCB0byB3b3JrIG9uIGV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiAqLworICAgIGlmICgoTiA8IDIpIHx8IChOID4gMTMpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzKSk7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+ZmZ0X24gICAgICAgPSBOIC0gMTsKKyAgICBzLT5sZW40ICAgICAgICA9IGxlbjIgLyAyOworICAgIHMtPmxlbjIgICAgICAgID0gbGVuMjsKKyAgICBzLT5pbnZlcnNlICAgICA9IGludmVyc2U7CisgICAgcy0+ZmZ0MTUgICAgICAgPSBmZnQxNV9jOworICAgIHMtPm1kY3QgICAgICAgID0gbWRjdDE1OworICAgIHMtPmltZGN0X2hhbGYgID0gaW1kY3QxNV9oYWxmOworICAgIHMtPnBvc3RyZWluZGV4ID0gcG9zdHJvdGF0ZV9jOworCisgICAgaWYgKGZmX2ZmdF9pbml0KCZzLT5wdHdvX2ZmdCwgTiAtIDEsIHMtPmludmVyc2UpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKGluaXRfcGZhX3JlaW5kZXhfdGFicyhzKSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcy0+dG1wICA9IGF2X21hbGxvY19hcnJheShsZW4sIDIgKiBzaXplb2YoKnMtPnRtcCkpOworICAgIGlmICghcy0+dG1wKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBzLT50d2lkZGxlX2V4cHRhYiA9IGF2X21hbGxvY19hcnJheShzLT5sZW40LCBzaXplb2YoKnMtPnR3aWRkbGVfZXhwdGFiKSk7CisgICAgaWYgKCFzLT50d2lkZGxlX2V4cHRhYikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgdGhldGEgPSAwLjEyNWYgKyAoc2NhbGUgPCAwID8gcy0+bGVuNCA6IDApOworICAgIHNjYWxlID0gc3FydChmYWJzKHNjYWxlKSk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmxlbjQ7IGkrKykgeworICAgICAgICBhbHBoYSA9IDIgKiBNX1BJICogKGkgKyB0aGV0YSkgLyBsZW47CisgICAgICAgIHMtPnR3aWRkbGVfZXhwdGFiW2ldLnJlID0gY29zZihhbHBoYSkgKiBzY2FsZTsKKyAgICAgICAgcy0+dHdpZGRsZV9leHB0YWJbaV0uaW0gPSBzaW5mKGFscGhhKSAqIHNjYWxlOworICAgIH0KKworICAgIC8qIDE1LXBvaW50IEZGVCBleHB0YWIgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTk7IGkrKykgeworICAgICAgICBpZiAoaSA8IDE1KSB7CisgICAgICAgICAgICBkb3VibGUgdGhldGEgPSAoMi4wZiAqIE1fUEkgKiBpKSAvIDE1LjBmOworICAgICAgICAgICAgaWYgKCFzLT5pbnZlcnNlKQorICAgICAgICAgICAgICAgIHRoZXRhICo9IC0xOworICAgICAgICAgICAgcy0+ZXhwdGFiW2ldLnJlID0gY29zZih0aGV0YSk7CisgICAgICAgICAgICBzLT5leHB0YWJbaV0uaW0gPSBzaW5mKHRoZXRhKTsKKyAgICAgICAgfSBlbHNlIHsgLyogV3JhcCBhcm91bmQgdG8gc2ltcGxpZnkgZmZ0MTUgKi8KKyAgICAgICAgICAgIHMtPmV4cHRhYltpXSA9IHMtPmV4cHRhYltpIC0gMTVdOworICAgICAgICB9CisgICAgfQorCisgICAgLyogNS1wb2ludCBGRlQgZXhwdGFiICovCisgICAgcy0+ZXhwdGFiWzE5XS5yZSA9IGNvc2YoMi4wZiAqIE1fUEkgLyA1LjBmKTsKKyAgICBzLT5leHB0YWJbMTldLmltID0gc2luZigyLjBmICogTV9QSSAvIDUuMGYpOworICAgIHMtPmV4cHRhYlsyMF0ucmUgPSBjb3NmKDEuMGYgKiBNX1BJIC8gNS4wZik7CisgICAgcy0+ZXhwdGFiWzIwXS5pbSA9IHNpbmYoMS4wZiAqIE1fUEkgLyA1LjBmKTsKKworICAgIC8qIEludmVydCB0aGUgcGhhc2UgZm9yIGFuIGludmVyc2UgdHJhbnNmb3JtLCBkbyBub3RoaW5nIGZvciBhIGZvcndhcmQgdHJhbnNmb3JtICovCisgICAgaWYgKHMtPmludmVyc2UpIHsKKyAgICAgICAgcy0+ZXhwdGFiWzE5XS5pbSAqPSAtMTsKKyAgICAgICAgcy0+ZXhwdGFiWzIwXS5pbSAqPSAtMTsKKyAgICB9CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX21kY3QxNV9pbml0X3g4NihzKTsKKworICAgICpwcyA9IHM7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmZl9tZGN0MTVfdW5pbml0KCZzKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tZGN0MTUuaCBiL2xpYmF2Y29kZWMvbWRjdDE1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNjBmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbWRjdDE1LmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01EQ1QxNV9ICisjZGVmaW5lIEFWQ09ERUNfTURDVDE1X0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAiZmZ0LmgiCisKK3R5cGVkZWYgc3RydWN0IE1EQ1QxNUNvbnRleHQgeworICAgIGludCBmZnRfbjsKKyAgICBpbnQgbGVuMjsKKyAgICBpbnQgbGVuNDsKKyAgICBpbnQgaW52ZXJzZTsKKyAgICBpbnQgKnBmYV9wcmVyZWluZGV4OworICAgIGludCAqcGZhX3Bvc3RyZWluZGV4OworCisgICAgRkZUQ29udGV4dCBwdHdvX2ZmdDsKKyAgICBGRlRDb21wbGV4ICp0bXA7CisgICAgRkZUQ29tcGxleCAqdHdpZGRsZV9leHB0YWI7CisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIEZGVENvbXBsZXgsIGV4cHRhYilbNjRdOworCisgICAgLyogMTUtcG9pbnQgRkZUICovCisgICAgdm9pZCAoKmZmdDE1KShGRlRDb21wbGV4ICpvdXQsIEZGVENvbXBsZXggKmluLCBGRlRDb21wbGV4ICpleHB0YWIsIHB0cmRpZmZfdCBzdHJpZGUpOworCisgICAgLyogUEZBIHBvc3Ryb3RhdGUgYW5kIGV4cHRhYiAqLworICAgIHZvaWQgKCpwb3N0cmVpbmRleCkoRkZUQ29tcGxleCAqb3V0LCBGRlRDb21wbGV4ICppbiwgRkZUQ29tcGxleCAqZXhwLCBpbnQgKmx1dCwgcHRyZGlmZl90IGxlbjgpOworCisgICAgLyogQ2FsY3VsYXRlIGEgZnVsbCAyTiAtPiBOIE1EQ1QgKi8KKyAgICB2b2lkICgqbWRjdCkoc3RydWN0IE1EQ1QxNUNvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpOworCisgICAgLyogQ2FsY3VsYXRlIHRoZSBtaWRkbGUgaGFsZiBvZiB0aGUgaU1EQ1QgKi8KKyAgICB2b2lkICgqaW1kY3RfaGFsZikoc3RydWN0IE1EQ1QxNUNvbnRleHQgKnMsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOworfSBNRENUMTVDb250ZXh0OworCisvKiBJbml0IGFuIChpKU1EQ1Qgb2YgdGhlIGxlbmd0aCAyICogMTUgKiAoMl5OKSAqLworaW50IGZmX21kY3QxNV9pbml0KE1EQ1QxNUNvbnRleHQgKipwcywgaW50IGludmVyc2UsIGludCBOLCBkb3VibGUgc2NhbGUpOwordm9pZCBmZl9tZGN0MTVfdW5pbml0KE1EQ1QxNUNvbnRleHQgKipwcyk7CisKK3ZvaWQgZmZfbWRjdDE1X2luaXRfeDg2KE1EQ1QxNUNvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZDT0RFQ19NRENUMTVfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tZGN0X2ZpeGVkLmMgYi9saWJhdmNvZGVjL21kY3RfZml4ZWQuYwppbmRleCBhMzJjYjAwLi5hYWJmMGM4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21kY3RfZml4ZWQuYworKysgYi9saWJhdmNvZGVjL21kY3RfZml4ZWQuYwpAQCAtMzksMTMgKzM5LDEzIEBACiAKICAgICAvKiBwcmUgcm90YXRpb24gKi8KICAgICBmb3IoaT0wO2k8bjg7aSsrKSB7Ci0gICAgICAgIHJlID0gUlNDQUxFKC1pbnB1dFsyKmkrbjNdIC0gaW5wdXRbbjMtMS0yKmldKTsKLSAgICAgICAgaW0gPSBSU0NBTEUoLWlucHV0W240KzIqaV0gKyBpbnB1dFtuNC0xLTIqaV0pOworICAgICAgICByZSA9IFJTQ0FMRSgtaW5wdXRbMippK24zXSwgLSBpbnB1dFtuMy0xLTIqaV0pOworICAgICAgICBpbSA9IFJTQ0FMRSgtaW5wdXRbbjQrMippXSwgKyBpbnB1dFtuNC0xLTIqaV0pOwogICAgICAgICBqID0gcmV2dGFiW2ldOwogICAgICAgICBDTVVMKHhbal0ucmUsIHhbal0uaW0sIHJlLCBpbSwgLXRjb3NbaV0sIHRzaW5baV0pOwogCi0gICAgICAgIHJlID0gUlNDQUxFKCBpbnB1dFsyKmldICAgIC0gaW5wdXRbbjItMS0yKmldKTsKLSAgICAgICAgaW0gPSBSU0NBTEUoLWlucHV0W24yKzIqaV0gLSBpbnB1dFsgbi0xLTIqaV0pOworICAgICAgICByZSA9IFJTQ0FMRSggaW5wdXRbMippXSAgICwgLSBpbnB1dFtuMi0xLTIqaV0pOworICAgICAgICBpbSA9IFJTQ0FMRSgtaW5wdXRbbjIrMippXSwgLSBpbnB1dFsgbi0xLTIqaV0pOwogICAgICAgICBqID0gcmV2dGFiW244ICsgaV07CiAgICAgICAgIENNVUwoeFtqXS5yZSwgeFtqXS5pbSwgcmUsIGltLCAtdGNvc1tuOCArIGldLCB0c2luW244ICsgaV0pOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWRjdF90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9tZGN0X3RlbXBsYXRlLmMKaW5kZXggMDQzOTZiNC4uZTBhZDlmMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tZGN0X3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9tZGN0X3RlbXBsYXRlLmMKQEAgLTMzLDEyICszMywxMiBAQAogICovCiAKICNpZiBGRlRfRkxPQVQKLSMgICBkZWZpbmUgUlNDQUxFKHgpICh4KQorIyAgIGRlZmluZSBSU0NBTEUoeCwgeSkgKCh4KSArICh5KSkKICNlbHNlCiAjaWYgRkZUX0ZJWEVEXzMyCi0jICAgZGVmaW5lIFJTQ0FMRSh4KSAoKCh4KSArIDMyKSA+PiA2KQorIyAgIGRlZmluZSBSU0NBTEUoeCwgeSkgKChpbnQpKCh4KSArICh1bnNpZ25lZCkoeSkgKyAzMikgPj4gNikKICNlbHNlIC8qIEZGVF9GSVhFRF8zMiAqLwotIyAgIGRlZmluZSBSU0NBTEUoeCkgKCh4KSA+PiAxKQorIyAgIGRlZmluZSBSU0NBTEUoeCwgeSkgKChpbnQpKCh4KSArICh1bnNpZ25lZCkoeSkpID4+IDEpCiAjZW5kaWYgLyogRkZUX0ZJWEVEXzMyICovCiAjZW5kaWYKIApAQCAtMTgxLDEzICsxODEsMTMgQEAKIAogICAgIC8qIHByZSByb3RhdGlvbiAqLwogICAgIGZvcihpPTA7aTxuODtpKyspIHsKLSAgICAgICAgcmUgPSBSU0NBTEUoLWlucHV0WzIqaStuM10gLSBpbnB1dFtuMy0xLTIqaV0pOwotICAgICAgICBpbSA9IFJTQ0FMRSgtaW5wdXRbbjQrMippXSArIGlucHV0W240LTEtMippXSk7CisgICAgICAgIHJlID0gUlNDQUxFKC1pbnB1dFsyKmkrbjNdLCAtIGlucHV0W24zLTEtMippXSk7CisgICAgICAgIGltID0gUlNDQUxFKC1pbnB1dFtuNCsyKmldLCArIGlucHV0W240LTEtMippXSk7CiAgICAgICAgIGogPSByZXZ0YWJbaV07CiAgICAgICAgIENNVUwoeFtqXS5yZSwgeFtqXS5pbSwgcmUsIGltLCAtdGNvc1tpXSwgdHNpbltpXSk7CiAKLSAgICAgICAgcmUgPSBSU0NBTEUoIGlucHV0WzIqaV0gICAgLSBpbnB1dFtuMi0xLTIqaV0pOwotICAgICAgICBpbSA9IFJTQ0FMRSgtaW5wdXRbbjIrMippXSAtIGlucHV0WyBuLTEtMippXSk7CisgICAgICAgIHJlID0gUlNDQUxFKCBpbnB1dFsyKmldICAgLCAtIGlucHV0W24yLTEtMippXSk7CisgICAgICAgIGltID0gUlNDQUxFKC1pbnB1dFtuMisyKmldLCAtIGlucHV0WyBuLTEtMippXSk7CiAgICAgICAgIGogPSByZXZ0YWJbbjggKyBpXTsKICAgICAgICAgQ01VTCh4W2pdLnJlLCB4W2pdLmltLCByZSwgaW0sIC10Y29zW244ICsgaV0sIHRzaW5bbjggKyBpXSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tZGVjLmMgYi9saWJhdmNvZGVjL21kZWMuYwppbmRleCAxY2M0Y2E0Li4zMzBiNzYxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21kZWMuYworKysgYi9saWJhdmNvZGVjL21kZWMuYwpAQCAtNDgsNyArNDgsOCBAQAogICAgIGludCBtYl93aWR0aDsKICAgICBpbnQgbWJfaGVpZ2h0OwogICAgIGludCBtYl94LCBtYl95OwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2spWzZdWzY0XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGludDE2X3QsIGJsb2NrKVs2XVs2NF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50MTZfdCwgcXVhbnRfbWF0cml4KVs2NF07CiAgICAgdWludDhfdCAqYml0c3RyZWFtX2J1ZmZlcjsKICAgICB1bnNpZ25lZCBpbnQgYml0c3RyZWFtX2J1ZmZlcl9zaXplOwogICAgIGludCBibG9ja19sYXN0X2luZGV4WzZdOwpAQCAtNjEsNyArNjIsNyBAQAogICAgIGludCBjb21wb25lbnQ7CiAgICAgUkxUYWJsZSAqcmwgPSAmZmZfcmxfbXBlZzE7CiAgICAgdWludDhfdCAqIGNvbnN0IHNjYW50YWJsZSA9IGEtPnNjYW50YWJsZS5wZXJtdXRhdGVkOwotICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXggPSBmZl9tcGVnMV9kZWZhdWx0X2ludHJhX21hdHJpeDsKKyAgICBjb25zdCB1aW50MTZfdCAqcXVhbnRfbWF0cml4ID0gYS0+cXVhbnRfbWF0cml4OwogICAgIGNvbnN0IGludCBxc2NhbGUgPSBhLT5xc2NhbGU7CiAKICAgICAvKiBEQyBjb2VmZmljaWVudCAqLwpAQCAtNzMsNyArNzQsNyBAQAogICAgICAgICBpZiAoZGlmZiA+PSAweGZmZmYpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgYS0+bGFzdF9kY1tjb21wb25lbnRdICs9IGRpZmY7Ci0gICAgICAgIGJsb2NrWzBdID0gYS0+bGFzdF9kY1tjb21wb25lbnRdIDw8IDM7CisgICAgICAgIGJsb2NrWzBdID0gYS0+bGFzdF9kY1tjb21wb25lbnRdICogKDEgPDwgMyk7CiAgICAgfQogCiAgICAgaSA9IDA7CkBAIC0xMTEsMTEgKzExMiwxMSBAQAogICAgICAgICAgICAgICAgIGogPSBzY2FudGFibGVbaV07CiAgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDM7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICogKHVuc2lnbmVkKXFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gMzsKICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CiAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiAzOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAqICh1bnNpZ25lZClxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDM7CiAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIC0gMSkgfCAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIxMiw2ICsyMTMsNyBAQAogc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBNREVDQ29udGV4dCAqIGNvbnN0IGEgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOwogCiAgICAgYS0+bWJfd2lkdGggID0gKGF2Y3R4LT5jb2RlZF93aWR0aCAgKyAxNSkgLyAxNjsKICAgICBhLT5tYl9oZWlnaHQgPSAoYXZjdHgtPmNvZGVkX2hlaWdodCArIDE1KSAvIDE2OwpAQCAtMjI1LDExICsyMjcsMTYgQEAKICAgICBmZl9pbml0X3NjYW50YWJsZShhLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZhLT5zY2FudGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgZmZfemlnemFnX2RpcmVjdCk7CiAKLSAgICBpZiAoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8pCi0gICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPSBGRl9JRENUX1NJTVBMRTsKICAgICBhdmN0eC0+cGl4X2ZtdCAgPSBBVl9QSVhfRk1UX1lVVko0MjBQOwogICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CiAKKyAgICAvKiBpbml0IHEgbWF0cml4ICovCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaW50IGogPSBhLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV07CisKKyAgICAgICAgYS0+cXVhbnRfbWF0cml4W2pdID0gZmZfbXBlZzFfZGVmYXVsdF9pbnRyYV9tYXRyaXhbaV07CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVfY21wLmMgYi9saWJhdmNvZGVjL21lX2NtcC5jCmluZGV4IGRjNzZiMDcuLmFlMjQ4YzUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWVfY21wLmMKKysrIGIvbGliYXZjb2RlYy9tZV9jbXAuYwpAQCAtMjksMTMgKzI5LDQ3IEBACiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLXVpbnQzMl90IGZmX3NxdWFyZV90YWJbNTEyXSA9IHsgMCwgfTsKKy8qIChpIC0gMjU2KSAqIChpIC0gMjU2KSAqLworY29uc3QgdWludDMyX3QgZmZfc3F1YXJlX3RhYls1MTJdID0geworICAgIDY1NTM2LCA2NTAyNSwgNjQ1MTYsIDY0MDA5LCA2MzUwNCwgNjMwMDEsIDYyNTAwLCA2MjAwMSwgNjE1MDQsIDYxMDA5LCA2MDUxNiwgNjAwMjUsIDU5NTM2LCA1OTA0OSwgNTg1NjQsIDU4MDgxLAorICAgIDU3NjAwLCA1NzEyMSwgNTY2NDQsIDU2MTY5LCA1NTY5NiwgNTUyMjUsIDU0NzU2LCA1NDI4OSwgNTM4MjQsIDUzMzYxLCA1MjkwMCwgNTI0NDEsIDUxOTg0LCA1MTUyOSwgNTEwNzYsIDUwNjI1LAorICAgIDUwMTc2LCA0OTcyOSwgNDkyODQsIDQ4ODQxLCA0ODQwMCwgNDc5NjEsIDQ3NTI0LCA0NzA4OSwgNDY2NTYsIDQ2MjI1LCA0NTc5NiwgNDUzNjksIDQ0OTQ0LCA0NDUyMSwgNDQxMDAsIDQzNjgxLAorICAgIDQzMjY0LCA0Mjg0OSwgNDI0MzYsIDQyMDI1LCA0MTYxNiwgNDEyMDksIDQwODA0LCA0MDQwMSwgNDAwMDAsIDM5NjAxLCAzOTIwNCwgMzg4MDksIDM4NDE2LCAzODAyNSwgMzc2MzYsIDM3MjQ5LAorICAgIDM2ODY0LCAzNjQ4MSwgMzYxMDAsIDM1NzIxLCAzNTM0NCwgMzQ5NjksIDM0NTk2LCAzNDIyNSwgMzM4NTYsIDMzNDg5LCAzMzEyNCwgMzI3NjEsIDMyNDAwLCAzMjA0MSwgMzE2ODQsIDMxMzI5LAorICAgIDMwOTc2LCAzMDYyNSwgMzAyNzYsIDI5OTI5LCAyOTU4NCwgMjkyNDEsIDI4OTAwLCAyODU2MSwgMjgyMjQsIDI3ODg5LCAyNzU1NiwgMjcyMjUsIDI2ODk2LCAyNjU2OSwgMjYyNDQsIDI1OTIxLAorICAgIDI1NjAwLCAyNTI4MSwgMjQ5NjQsIDI0NjQ5LCAyNDMzNiwgMjQwMjUsIDIzNzE2LCAyMzQwOSwgMjMxMDQsIDIyODAxLCAyMjUwMCwgMjIyMDEsIDIxOTA0LCAyMTYwOSwgMjEzMTYsIDIxMDI1LAorICAgIDIwNzM2LCAyMDQ0OSwgMjAxNjQsIDE5ODgxLCAxOTYwMCwgMTkzMjEsIDE5MDQ0LCAxODc2OSwgMTg0OTYsIDE4MjI1LCAxNzk1NiwgMTc2ODksIDE3NDI0LCAxNzE2MSwgMTY5MDAsIDE2NjQxLAorICAgIDE2Mzg0LCAxNjEyOSwgMTU4NzYsIDE1NjI1LCAxNTM3NiwgMTUxMjksIDE0ODg0LCAxNDY0MSwgMTQ0MDAsIDE0MTYxLCAxMzkyNCwgMTM2ODksIDEzNDU2LCAxMzIyNSwgMTI5OTYsIDEyNzY5LAorICAgIDEyNTQ0LCAxMjMyMSwgMTIxMDAsIDExODgxLCAxMTY2NCwgMTE0NDksIDExMjM2LCAxMTAyNSwgMTA4MTYsIDEwNjA5LCAxMDQwNCwgMTAyMDEsIDEwMDAwLCAgOTgwMSwgIDk2MDQsICA5NDA5LAorICAgICA5MjE2LCAgOTAyNSwgIDg4MzYsICA4NjQ5LCAgODQ2NCwgIDgyODEsICA4MTAwLCAgNzkyMSwgIDc3NDQsICA3NTY5LCAgNzM5NiwgIDcyMjUsICA3MDU2LCAgNjg4OSwgIDY3MjQsICA2NTYxLAorICAgICA2NDAwLCAgNjI0MSwgIDYwODQsICA1OTI5LCAgNTc3NiwgIDU2MjUsICA1NDc2LCAgNTMyOSwgIDUxODQsICA1MDQxLCAgNDkwMCwgIDQ3NjEsICA0NjI0LCAgNDQ4OSwgIDQzNTYsICA0MjI1LAorICAgICA0MDk2LCAgMzk2OSwgIDM4NDQsICAzNzIxLCAgMzYwMCwgIDM0ODEsICAzMzY0LCAgMzI0OSwgIDMxMzYsICAzMDI1LCAgMjkxNiwgIDI4MDksICAyNzA0LCAgMjYwMSwgIDI1MDAsICAyNDAxLAorICAgICAyMzA0LCAgMjIwOSwgIDIxMTYsICAyMDI1LCAgMTkzNiwgIDE4NDksICAxNzY0LCAgMTY4MSwgIDE2MDAsICAxNTIxLCAgMTQ0NCwgIDEzNjksICAxMjk2LCAgMTIyNSwgIDExNTYsICAxMDg5LAorICAgICAxMDI0LCAgIDk2MSwgICA5MDAsICAgODQxLCAgIDc4NCwgICA3MjksICAgNjc2LCAgIDYyNSwgICA1NzYsICAgNTI5LCAgIDQ4NCwgICA0NDEsICAgNDAwLCAgIDM2MSwgICAzMjQsICAgMjg5LAorICAgICAgMjU2LCAgIDIyNSwgICAxOTYsICAgMTY5LCAgIDE0NCwgICAxMjEsICAgMTAwLCAgICA4MSwgICAgNjQsICAgIDQ5LCAgICAzNiwgICAgMjUsICAgIDE2LCAgICAgOSwgICAgIDQsICAgICAxLAorICAgICAgICAwLCAgICAgMSwgICAgIDQsICAgICA5LCAgICAxNiwgICAgMjUsICAgIDM2LCAgICA0OSwgICAgNjQsICAgIDgxLCAgIDEwMCwgICAxMjEsICAgMTQ0LCAgIDE2OSwgICAxOTYsICAgMjI1LAorICAgICAgMjU2LCAgIDI4OSwgICAzMjQsICAgMzYxLCAgIDQwMCwgICA0NDEsICAgNDg0LCAgIDUyOSwgICA1NzYsICAgNjI1LCAgIDY3NiwgICA3MjksICAgNzg0LCAgIDg0MSwgICA5MDAsICAgOTYxLAorICAgICAxMDI0LCAgMTA4OSwgIDExNTYsICAxMjI1LCAgMTI5NiwgIDEzNjksICAxNDQ0LCAgMTUyMSwgIDE2MDAsICAxNjgxLCAgMTc2NCwgIDE4NDksICAxOTM2LCAgMjAyNSwgIDIxMTYsICAyMjA5LAorICAgICAyMzA0LCAgMjQwMSwgIDI1MDAsICAyNjAxLCAgMjcwNCwgIDI4MDksICAyOTE2LCAgMzAyNSwgIDMxMzYsICAzMjQ5LCAgMzM2NCwgIDM0ODEsICAzNjAwLCAgMzcyMSwgIDM4NDQsICAzOTY5LAorICAgICA0MDk2LCAgNDIyNSwgIDQzNTYsICA0NDg5LCAgNDYyNCwgIDQ3NjEsICA0OTAwLCAgNTA0MSwgIDUxODQsICA1MzI5LCAgNTQ3NiwgIDU2MjUsICA1Nzc2LCAgNTkyOSwgIDYwODQsICA2MjQxLAorICAgICA2NDAwLCAgNjU2MSwgIDY3MjQsICA2ODg5LCAgNzA1NiwgIDcyMjUsICA3Mzk2LCAgNzU2OSwgIDc3NDQsICA3OTIxLCAgODEwMCwgIDgyODEsICA4NDY0LCAgODY0OSwgIDg4MzYsICA5MDI1LAorICAgICA5MjE2LCAgOTQwOSwgIDk2MDQsICA5ODAxLCAxMDAwMCwgMTAyMDEsIDEwNDA0LCAxMDYwOSwgMTA4MTYsIDExMDI1LCAxMTIzNiwgMTE0NDksIDExNjY0LCAxMTg4MSwgMTIxMDAsIDEyMzIxLAorICAgIDEyNTQ0LCAxMjc2OSwgMTI5OTYsIDEzMjI1LCAxMzQ1NiwgMTM2ODksIDEzOTI0LCAxNDE2MSwgMTQ0MDAsIDE0NjQxLCAxNDg4NCwgMTUxMjksIDE1Mzc2LCAxNTYyNSwgMTU4NzYsIDE2MTI5LAorICAgIDE2Mzg0LCAxNjY0MSwgMTY5MDAsIDE3MTYxLCAxNzQyNCwgMTc2ODksIDE3OTU2LCAxODIyNSwgMTg0OTYsIDE4NzY5LCAxOTA0NCwgMTkzMjEsIDE5NjAwLCAxOTg4MSwgMjAxNjQsIDIwNDQ5LAorICAgIDIwNzM2LCAyMTAyNSwgMjEzMTYsIDIxNjA5LCAyMTkwNCwgMjIyMDEsIDIyNTAwLCAyMjgwMSwgMjMxMDQsIDIzNDA5LCAyMzcxNiwgMjQwMjUsIDI0MzM2LCAyNDY0OSwgMjQ5NjQsIDI1MjgxLAorICAgIDI1NjAwLCAyNTkyMSwgMjYyNDQsIDI2NTY5LCAyNjg5NiwgMjcyMjUsIDI3NTU2LCAyNzg4OSwgMjgyMjQsIDI4NTYxLCAyODkwMCwgMjkyNDEsIDI5NTg0LCAyOTkyOSwgMzAyNzYsIDMwNjI1LAorICAgIDMwOTc2LCAzMTMyOSwgMzE2ODQsIDMyMDQxLCAzMjQwMCwgMzI3NjEsIDMzMTI0LCAzMzQ4OSwgMzM4NTYsIDM0MjI1LCAzNDU5NiwgMzQ5NjksIDM1MzQ0LCAzNTcyMSwgMzYxMDAsIDM2NDgxLAorICAgIDM2ODY0LCAzNzI0OSwgMzc2MzYsIDM4MDI1LCAzODQxNiwgMzg4MDksIDM5MjA0LCAzOTYwMSwgNDAwMDAsIDQwNDAxLCA0MDgwNCwgNDEyMDksIDQxNjE2LCA0MjAyNSwgNDI0MzYsIDQyODQ5LAorICAgIDQzMjY0LCA0MzY4MSwgNDQxMDAsIDQ0NTIxLCA0NDk0NCwgNDUzNjksIDQ1Nzk2LCA0NjIyNSwgNDY2NTYsIDQ3MDg5LCA0NzUyNCwgNDc5NjEsIDQ4NDAwLCA0ODg0MSwgNDkyODQsIDQ5NzI5LAorICAgIDUwMTc2LCA1MDYyNSwgNTEwNzYsIDUxNTI5LCA1MTk4NCwgNTI0NDEsIDUyOTAwLCA1MzM2MSwgNTM4MjQsIDU0Mjg5LCA1NDc1NiwgNTUyMjUsIDU1Njk2LCA1NjE2OSwgNTY2NDQsIDU3MTIxLAorICAgIDU3NjAwLCA1ODA4MSwgNTg1NjQsIDU5MDQ5LCA1OTUzNiwgNjAwMjUsIDYwNTE2LCA2MTAwOSwgNjE1MDQsIDYyMDAxLCA2MjUwMCwgNjMwMDEsIDYzNTA0LCA2NDAwOSwgNjQ1MTYsIDY1MDI1LAorfTsKIAogc3RhdGljIGludCBzc2U0X2MoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCiAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKIHsKICAgICBpbnQgcyA9IDAsIGk7Ci0gICAgdWludDMyX3QgKnNxID0gZmZfc3F1YXJlX3RhYiArIDI1NjsKKyAgICBjb25zdCB1aW50MzJfdCAqc3EgPSBmZl9zcXVhcmVfdGFiICsgMjU2OwogCiAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewogICAgICAgICBzICAgICs9IHNxW3BpeDFbMF0gLSBwaXgyWzBdXTsKQEAgLTUyLDcgKzg2LDcgQEAKICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQogewogICAgIGludCBzID0gMCwgaTsKLSAgICB1aW50MzJfdCAqc3EgPSBmZl9zcXVhcmVfdGFiICsgMjU2OworICAgIGNvbnN0IHVpbnQzMl90ICpzcSA9IGZmX3NxdWFyZV90YWIgKyAyNTY7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CiAgICAgICAgIHMgICAgKz0gc3FbcGl4MVswXSAtIHBpeDJbMF1dOwpAQCAtNzMsNyArMTA3LDcgQEAKICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKIHsKICAgICBpbnQgcyA9IDAsIGk7Ci0gICAgdWludDMyX3QgKnNxID0gZmZfc3F1YXJlX3RhYiArIDI1NjsKKyAgICBjb25zdCB1aW50MzJfdCAqc3EgPSBmZl9zcXVhcmVfdGFiICsgMjU2OwogCiAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewogICAgICAgICBzICs9IHNxW3BpeDFbMF0gIC0gcGl4MlswXV07CkBAIC0xMzksNiArMTczLDQ1IEBACiAgICAgcmV0dXJuIHM7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IHBpeF9tZWRpYW5fYWJzMTZfYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpCit7CisgICAgaW50IHMgPSAwLCBpLCBqOworCisjZGVmaW5lIFYoeCkgKHBpeDFbeF0gLSBwaXgyW3hdKQorCisgICAgcyAgICArPSBhYnMoVigwKSk7CisgICAgcyAgICArPSBhYnMoVigxKSAtIFYoMCkpOworICAgIHMgICAgKz0gYWJzKFYoMikgLSBWKDEpKTsKKyAgICBzICAgICs9IGFicyhWKDMpIC0gVigyKSk7CisgICAgcyAgICArPSBhYnMoVig0KSAtIFYoMykpOworICAgIHMgICAgKz0gYWJzKFYoNSkgLSBWKDQpKTsKKyAgICBzICAgICs9IGFicyhWKDYpIC0gVig1KSk7CisgICAgcyAgICArPSBhYnMoVig3KSAtIFYoNikpOworICAgIHMgICAgKz0gYWJzKFYoOCkgLSBWKDcpKTsKKyAgICBzICAgICs9IGFicyhWKDkpIC0gVig4KSk7CisgICAgcyAgICArPSBhYnMoVigxMCkgLSBWKDkpKTsKKyAgICBzICAgICs9IGFicyhWKDExKSAtIFYoMTApKTsKKyAgICBzICAgICs9IGFicyhWKDEyKSAtIFYoMTEpKTsKKyAgICBzICAgICs9IGFicyhWKDEzKSAtIFYoMTIpKTsKKyAgICBzICAgICs9IGFicyhWKDE0KSAtIFYoMTMpKTsKKyAgICBzICAgICs9IGFicyhWKDE1KSAtIFYoMTQpKTsKKworICAgIHBpeDEgKz0gc3RyaWRlOworICAgIHBpeDIgKz0gc3RyaWRlOworCisgICAgZm9yIChpID0gMTsgaSA8IGg7IGkrKykgeworICAgICAgICBzICAgICs9IGFicyhWKDApIC0gVigtc3RyaWRlKSk7CisgICAgICAgIGZvciAoaiA9IDE7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgcyAgICArPSBhYnMoVihqKSAtIG1pZF9wcmVkKFYoai1zdHJpZGUpLCBWKGotMSksIFYoai1zdHJpZGUpICsgVihqLTEpIC0gVihqLXN0cmlkZS0xKSkpOworICAgICAgICBwaXgxICs9IHN0cmlkZTsKKyAgICAgICAgcGl4MiArPSBzdHJpZGU7CisKKyAgICB9CisjdW5kZWYgVgorICAgIHJldHVybiBzOworfQorCiBzdGF0aWMgaW50IHBpeF9hYnMxNl94Ml9jKE1wZWdFbmNDb250ZXh0ICp2LCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKIHsKQEAgLTI0Nyw2ICszMjAsMzcgQEAKICAgICByZXR1cm4gczsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgcGl4X21lZGlhbl9hYnM4X2MoTXBlZ0VuY0NvbnRleHQgKnYsIHVpbnQ4X3QgKnBpeDEsIHVpbnQ4X3QgKnBpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQoreworICAgIGludCBzID0gMCwgaSwgajsKKworI2RlZmluZSBWKHgpIChwaXgxW3hdIC0gcGl4Mlt4XSkKKworICAgIHMgICAgKz0gYWJzKFYoMCkpOworICAgIHMgICAgKz0gYWJzKFYoMSkgLSBWKDApKTsKKyAgICBzICAgICs9IGFicyhWKDIpIC0gVigxKSk7CisgICAgcyAgICArPSBhYnMoVigzKSAtIFYoMikpOworICAgIHMgICAgKz0gYWJzKFYoNCkgLSBWKDMpKTsKKyAgICBzICAgICs9IGFicyhWKDUpIC0gVig0KSk7CisgICAgcyAgICArPSBhYnMoVig2KSAtIFYoNSkpOworICAgIHMgICAgKz0gYWJzKFYoNykgLSBWKDYpKTsKKworICAgIHBpeDEgKz0gc3RyaWRlOworICAgIHBpeDIgKz0gc3RyaWRlOworCisgICAgZm9yIChpID0gMTsgaSA8IGg7IGkrKykgeworICAgICAgICBzICAgICs9IGFicyhWKDApIC0gVigtc3RyaWRlKSk7CisgICAgICAgIGZvciAoaiA9IDE7IGogPCA4OyBqKyspCisgICAgICAgICAgICBzICAgICs9IGFicyhWKGopIC0gbWlkX3ByZWQoVihqLXN0cmlkZSksIFYoai0xKSwgVihqLXN0cmlkZSkgKyBWKGotMSkgLSBWKGotc3RyaWRlLTEpKSk7CisgICAgICAgIHBpeDEgKz0gc3RyaWRlOworICAgICAgICBwaXgyICs9IHN0cmlkZTsKKworICAgIH0KKyN1bmRlZiBWCisgICAgcmV0dXJuIHM7Cit9CisKIHN0YXRpYyBpbnQgcGl4X2FiczhfeDJfYyhNcGVnRW5jQ29udGV4dCAqdiwgdWludDhfdCAqcGl4MSwgdWludDhfdCAqcGl4MiwKICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKIHsKQEAgLTM3OCw2ICs0ODIsOSBAQAogICAgICAgICBjYXNlIEZGX0NNUF9TQUQ6CiAgICAgICAgICAgICBjbXBbaV0gPSBjLT5zYWRbaV07CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9DTVBfTUVESUFOX1NBRDoKKyAgICAgICAgICAgIGNtcFtpXSA9IGMtPm1lZGlhbl9zYWRbaV07CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBGRl9DTVBfU0FURDoKICAgICAgICAgICAgIGNtcFtpXSA9IGMtPmhhZGFtYXJkOF9kaWZmW2ldOwogICAgICAgICAgICAgYnJlYWs7CkBAIC01NTUsNyArNjYyLDcgQEAKIAogICAgIGF2X2Fzc2VydDIoaCA9PSA4KTsKIAotICAgIHMtPnBkc3AuZGlmZl9waXhlbHModGVtcCwgc3JjMSwgc3JjMiwgc3RyaWRlKTsKKyAgICBzLT5wZHNwLmRpZmZfcGl4ZWxzX3VuYWxpZ25lZCh0ZW1wLCBzcmMxLCBzcmMyLCBzdHJpZGUpOwogICAgIHMtPmZkc3AuZmRjdCh0ZW1wKTsKICAgICByZXR1cm4gcy0+bWVjYy5zdW1fYWJzX2RjdGVsZW0odGVtcCk7CiB9CkBAIC01OTUsNyArNzAyLDcgQEAKICAgICBpbnQxNl90IGRjdFs4XVs4XTsKICAgICBpbnQgaSwgc3VtID0gMDsKIAotICAgIHMtPnBkc3AuZGlmZl9waXhlbHMoZGN0WzBdLCBzcmMxLCBzcmMyLCBzdHJpZGUpOworICAgIHMtPnBkc3AuZGlmZl9waXhlbHNfdW5hbGlnbmVkKGRjdFswXSwgc3JjMSwgc3JjMiwgc3RyaWRlKTsKIAogI2RlZmluZSBTUkMoeCkgZGN0W2ldW3hdCiAjZGVmaW5lIERTVCh4LCB2KSBkY3RbaV1beF0gPSB2CkBAIC02MjIsNyArNzI5LDcgQEAKIAogICAgIGF2X2Fzc2VydDIoaCA9PSA4KTsKIAotICAgIHMtPnBkc3AuZGlmZl9waXhlbHModGVtcCwgc3JjMSwgc3JjMiwgc3RyaWRlKTsKKyAgICBzLT5wZHNwLmRpZmZfcGl4ZWxzX3VuYWxpZ25lZCh0ZW1wLCBzcmMxLCBzcmMyLCBzdHJpZGUpOwogICAgIHMtPmZkc3AuZmRjdCh0ZW1wKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQpAQCAtNjQxLDE0ICs3NDgsMTQgQEAKICAgICBhdl9hc3NlcnQyKGggPT0gOCk7CiAgICAgcy0+bWJfaW50cmEgPSAwOwogCi0gICAgcy0+cGRzcC5kaWZmX3BpeGVscyh0ZW1wLCBzcmMxLCBzcmMyLCBzdHJpZGUpOworICAgIHMtPnBkc3AuZGlmZl9waXhlbHNfdW5hbGlnbmVkKHRlbXAsIHNyYzEsIHNyYzIsIHN0cmlkZSk7CiAKICAgICBtZW1jcHkoYmFrLCB0ZW1wLCA2NCAqIHNpemVvZihpbnQxNl90KSk7CiAKICAgICBzLT5ibG9ja19sYXN0X2luZGV4WzAgLyogRklYTUUgKi9dID0KICAgICAgICAgcy0+ZmFzdF9kY3RfcXVhbnRpemUocywgdGVtcCwgMCAvKiBGSVhNRSAqLywgcy0+cXNjYWxlLCAmaSk7CiAgICAgcy0+ZGN0X3VucXVhbnRpemVfaW50ZXIocywgdGVtcCwgMCwgcy0+cXNjYWxlKTsKLSAgICBmZl9zaW1wbGVfaWRjdF84KHRlbXApOyAvLyBGSVhNRQorICAgIGZmX3NpbXBsZV9pZGN0X2ludDE2XzhiaXQodGVtcCk7IC8vIEZJWE1FCiAKICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKICAgICAgICAgc3VtICs9ICh0ZW1wW2ldIC0gYmFrW2ldKSAqICh0ZW1wW2ldIC0gYmFrW2ldKTsKQEAgLTc0NCw3ICs4NTEsNyBAQAogCiAgICAgYXZfYXNzZXJ0MihoID09IDgpOwogCi0gICAgcy0+cGRzcC5kaWZmX3BpeGVscyh0ZW1wLCBzcmMxLCBzcmMyLCBzdHJpZGUpOworICAgIHMtPnBkc3AuZGlmZl9waXhlbHNfdW5hbGlnbmVkKHRlbXAsIHNyYzEsIHNyYzIsIHN0cmlkZSk7CiAKICAgICBzLT5ibG9ja19sYXN0X2luZGV4WzAgLyogRklYTUUgKi9dID0KICAgICBsYXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0KQEAgLTkwNCwxNCArMTAxMSw2IEBACiBXUkFQUEVSOF8xNl9TUShyZDh4OF9jLCByZDE2X2MpCiBXUkFQUEVSOF8xNl9TUShiaXQ4eDhfYywgYml0MTZfYykKIAotYXZfY29sZCB2b2lkIGZmX21lX2NtcF9pbml0X3N0YXRpYyh2b2lkKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKQotICAgICAgICBmZl9zcXVhcmVfdGFiW2ldID0gKGkgLSAyNTYpICogKGkgLSAyNTYpOwotfQotCiBpbnQgZmZfY2hlY2tfYWxpZ25tZW50KHZvaWQpCiB7CiAgICAgc3RhdGljIGludCBkaWRfZmFpbCA9IDA7CkBAIC05OTMsNCArMTA5Miw3IEBACiAgICAgICAgIGZmX21lX2NtcF9pbml0X3g4NihjLCBhdmN0eCk7CiAgICAgaWYgKEFSQ0hfTUlQUykKICAgICAgICAgZmZfbWVfY21wX2luaXRfbWlwcyhjLCBhdmN0eCk7CisKKyAgICBjLT5tZWRpYW5fc2FkWzBdID0gcGl4X21lZGlhbl9hYnMxNl9jOworICAgIGMtPm1lZGlhbl9zYWRbMV0gPSBwaXhfbWVkaWFuX2FiczhfYzsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVfY21wLmggYi9saWJhdmNvZGVjL21lX2NtcC5oCmluZGV4IGEzNjAzZWMuLjBhNTg5ZTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWVfY21wLmgKKysrIGIvbGliYXZjb2RlYy9tZV9jbXAuaApAQCAtMjMsNyArMjMsNyBAQAogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogCi1leHRlcm4gdWludDMyX3QgZmZfc3F1YXJlX3RhYls1MTJdOworZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGZmX3NxdWFyZV90YWJbNTEyXTsKIAogCiAvKiBtaW5pbXVtIGFsaWdubWVudCBydWxlcyA7KQpAQCAtNzYsMTAgKzc2LDkgQEAKICAgICBtZV9jbXBfZnVuYyBmcmFtZV9za2lwX2NtcFs2XTsgLy8gb25seSB3aWR0aCA4IHVzZWQKIAogICAgIG1lX2NtcF9mdW5jIHBpeF9hYnNbMl1bNF07CisgICAgbWVfY21wX2Z1bmMgbWVkaWFuX3NhZFs2XTsKIH0gTUVDbXBDb250ZXh0OwogCi12b2lkIGZmX21lX2NtcF9pbml0X3N0YXRpYyh2b2lkKTsKLQogaW50IGZmX2NoZWNrX2FsaWdubWVudCh2b2lkKTsKIAogdm9pZCBmZl9tZV9jbXBfaW5pdChNRUNtcENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21lZGlhY29kZWMuYyBiL2xpYmF2Y29kZWMvbWVkaWFjb2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYWFlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21lZGlhY29kZWMuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIEFuZHJvaWQgTWVkaWFDb2RlYyBwdWJsaWMgQVBJIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbiBzdHVwZWZsaXguY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXJyb3IuaCIKKworI2luY2x1ZGUgIm1lZGlhY29kZWMuaCIKKworI2lmIENPTkZJR19NRURJQUNPREVDCisKKyNpbmNsdWRlIDxqbmkuaD4KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImZmam5pLmgiCisjaW5jbHVkZSAibWVkaWFjb2RlY2RlY19jb21tb24uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKK0FWTWVkaWFDb2RlY0NvbnRleHQgKmF2X21lZGlhY29kZWNfYWxsb2NfY29udGV4dCh2b2lkKQoreworICAgIHJldHVybiBhdl9tYWxsb2N6KHNpemVvZihBVk1lZGlhQ29kZWNDb250ZXh0KSk7Cit9CisKK2ludCBhdl9tZWRpYWNvZGVjX2RlZmF1bHRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWTWVkaWFDb2RlY0NvbnRleHQgKmN0eCwgdm9pZCAqc3VyZmFjZSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisKKyAgICBlbnYgPSBmZl9qbmlfZ2V0X2VudihhdmN0eCk7CisgICAgaWYgKCFlbnYpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgY3R4LT5zdXJmYWNlID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBzdXJmYWNlKTsKKyAgICBpZiAoY3R4LT5zdXJmYWNlKSB7CisgICAgICAgIGF2Y3R4LT5od2FjY2VsX2NvbnRleHQgPSBjdHg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIG5ldyBnbG9iYWwgcmVmZXJlbmNlXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIGF2X21lZGlhY29kZWNfZGVmYXVsdF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisKKyAgICBBVk1lZGlhQ29kZWNDb250ZXh0ICpjdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworCisgICAgaWYgKCFjdHgpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVudiA9IGZmX2puaV9nZXRfZW52KGF2Y3R4KTsKKyAgICBpZiAoIWVudikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGN0eC0+c3VyZmFjZSkgeworICAgICAgICAoKmVudiktPkRlbGV0ZUdsb2JhbFJlZihlbnYsIGN0eC0+c3VyZmFjZSk7CisgICAgICAgIGN0eC0+c3VyZmFjZSA9IE5VTEw7CisgICAgfQorCisgICAgYXZfZnJlZXAoJmF2Y3R4LT5od2FjY2VsX2NvbnRleHQpOworfQorCitpbnQgYXZfbWVkaWFjb2RlY19yZWxlYXNlX2J1ZmZlcihBVk1lZGlhQ29kZWNCdWZmZXIgKmJ1ZmZlciwgaW50IHJlbmRlcikKK3sKKyAgICBNZWRpYUNvZGVjRGVjQ29udGV4dCAqY3R4ID0gYnVmZmVyLT5jdHg7CisgICAgaW50IHJlbGVhc2VkID0gYXRvbWljX2ZldGNoX2FkZCgmYnVmZmVyLT5yZWxlYXNlZCwgMSk7CisKKyAgICBpZiAoIXJlbGVhc2VkICYmIChjdHgtPmRlbGF5X2ZsdXNoIHx8IGJ1ZmZlci0+c2VyaWFsID09IGF0b21pY19sb2FkKCZjdHgtPnNlcmlhbCkpKSB7CisgICAgICAgIGF0b21pY19mZXRjaF9zdWIoJmN0eC0+aHdfYnVmZmVyX2NvdW50LCAxKTsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJSZWxlYXNpbmcgb3V0cHV0IGJ1ZmZlciAlemQgKCVwKSB0cz0lIlBSSWQ2NCIgd2l0aCByZW5kZXI9JWQgWyVkIHBlbmRpbmddXG4iLAorICAgICAgICAgICAgICAgYnVmZmVyLT5pbmRleCwgYnVmZmVyLCBidWZmZXItPnB0cywgcmVuZGVyLCBhdG9taWNfbG9hZCgmY3R4LT5od19idWZmZXJfY291bnQpKTsKKyAgICAgICAgcmV0dXJuIGZmX0FNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIoY3R4LT5jb2RlYywgYnVmZmVyLT5pbmRleCwgcmVuZGVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2Vsc2UKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitBVk1lZGlhQ29kZWNDb250ZXh0ICphdl9tZWRpYWNvZGVjX2FsbG9jX2NvbnRleHQodm9pZCkKK3sKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGF2X21lZGlhY29kZWNfZGVmYXVsdF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZNZWRpYUNvZGVjQ29udGV4dCAqY3R4LCB2b2lkICpzdXJmYWNlKQoreworICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Cit9CisKK3ZvaWQgYXZfbWVkaWFjb2RlY19kZWZhdWx0X2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworfQorCitpbnQgYXZfbWVkaWFjb2RlY19yZWxlYXNlX2J1ZmZlcihBVk1lZGlhQ29kZWNCdWZmZXIgKmJ1ZmZlciwgaW50IHJlbmRlcikKK3sKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVkaWFjb2RlYy5oIGIvbGliYXZjb2RlYy9tZWRpYWNvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwNmQyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbWVkaWFjb2RlYy5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBBbmRyb2lkIE1lZGlhQ29kZWMgcHVibGljIEFQSQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbiBzdHVwZWZsaXguY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfTUVESUFDT0RFQ19ICisjZGVmaW5lIEFWQ09ERUNfTUVESUFDT0RFQ19ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBhIHJlZmVyZW5jZSB0byBhIGFuZHJvaWQvdmlldy9TdXJmYWNlIG9iamVjdCB0aGF0IHdpbGwKKyAqIGJlIHVzZWQgYXMgb3V0cHV0IGJ5IHRoZSBkZWNvZGVyLgorICoKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZNZWRpYUNvZGVjQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBhbmRyb2lkL3ZpZXcvU3VyZmFjZSBvYmplY3QgcmVmZXJlbmNlLgorICAgICAqLworICAgIHZvaWQgKnN1cmZhY2U7CisKK30gQVZNZWRpYUNvZGVjQ29udGV4dDsKKworLyoqCisgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIE1lZGlhQ29kZWMgY29udGV4dC4KKyAqCisgKiBXaGVuIGRlY29kaW5nIHdpdGggTWVkaWFDb2RlYyBpcyBmaW5pc2hlZCwgdGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlCisgKiBNZWRpYUNvZGVjIGNvbnRleHQgd2l0aCBhdl9tZWRpYWNvZGVjX2RlZmF1bHRfZnJlZS4KKyAqCisgKiBAcmV0dXJuIGEgcG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBBVk1lZGlhQ29kZWNDb250ZXh0IG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK0FWTWVkaWFDb2RlY0NvbnRleHQgKmF2X21lZGlhY29kZWNfYWxsb2NfY29udGV4dCh2b2lkKTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIE1lZGlhQ29kZWMgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gYXZjdHggY29kZWMgY29udGV4dAorICogQHBhcmFtIGN0eCBNZWRpYUNvZGVjIGNvbnRleHQgdG8gaW5pdGlhbGl6ZQorICogQHBhcmFtIHN1cmZhY2UgcmVmZXJlbmNlIHRvIGFuIGFuZHJvaWQvdmlldy9TdXJmYWNlCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgPCAwIG90aGVyd2lzZQorICovCitpbnQgYXZfbWVkaWFjb2RlY19kZWZhdWx0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVk1lZGlhQ29kZWNDb250ZXh0ICpjdHgsIHZvaWQgKnN1cmZhY2UpOworCisvKioKKyAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgdG8gZnJlZSB0aGUgTWVkaWFDb2RlYyBjb250ZXh0IGluaXRpYWxpemVkIHdpdGgKKyAqIGF2X21lZGlhY29kZWNfZGVmYXVsdF9pbml0KCkuCisgKgorICogQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKKyAqLwordm9pZCBhdl9tZWRpYWNvZGVjX2RlZmF1bHRfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisvKioKKyAqIE9wYXF1ZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgTWVkaWFDb2RlYyBidWZmZXIgdG8gcmVuZGVyLgorICovCit0eXBlZGVmIHN0cnVjdCBNZWRpYUNvZGVjQnVmZmVyIEFWTWVkaWFDb2RlY0J1ZmZlcjsKKworLyoqCisgKiBSZWxlYXNlIGEgTWVkaWFDb2RlYyBidWZmZXIgYW5kIHJlbmRlciBpdCB0byB0aGUgc3VyZmFjZSB0aGF0IGlzIGFzc29jaWF0ZWQKKyAqIHdpdGggdGhlIGRlY29kZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2Ugb24gYSBnaXZlbgorICogYnVmZmVyLCBvbmNlIHJlbGVhc2VkIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciByZXR1cm5zIHRvIHRoZSBjb2RlYywgdGh1cworICogc3Vic2VxdWVudCBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIHdpbGwgaGF2ZSBubyBlZmZlY3QuCisgKgorICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHJlbmRlcgorICogQHBhcmFtIHJlbmRlciAxIHRvIHJlbGVhc2UgYW5kIHJlbmRlciB0aGUgYnVmZmVyIHRvIHRoZSBzdXJmYWNlIG9yIDAgdG8KKyAqIGRpc2NhcmQgdGhlIGJ1ZmZlcgorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIDwgMCBvdGhlcndpc2UKKyAqLworaW50IGF2X21lZGlhY29kZWNfcmVsZWFzZV9idWZmZXIoQVZNZWRpYUNvZGVjQnVmZmVyICpidWZmZXIsIGludCByZW5kZXIpOworCisjZW5kaWYgLyogQVZDT0RFQ19NRURJQUNPREVDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVkaWFjb2RlY19zdXJmYWNlLmMgYi9saWJhdmNvZGVjL21lZGlhY29kZWNfc3VyZmFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZGExZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21lZGlhY29kZWNfc3VyZmFjZS5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBBbmRyb2lkIE1lZGlhQ29kZWMgU3VyZmFjZSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb24gc3R1cGVmbGl4LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGpuaS5oPgorCisjaW5jbHVkZSAiZmZqbmkuaCIKKyNpbmNsdWRlICJtZWRpYWNvZGVjX3N1cmZhY2UuaCIKKwordm9pZCAqZmZfbWVkaWFjb2RlY19zdXJmYWNlX3JlZih2b2lkICpzdXJmYWNlLCB2b2lkICpsb2dfY3R4KQoreworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKworICAgIHZvaWQgKnJlZmVyZW5jZSA9IE5VTEw7CisKKyAgICBlbnYgPSBmZl9qbmlfZ2V0X2Vudihsb2dfY3R4KTsKKyAgICBpZiAoIWVudikgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZWZlcmVuY2UgPSAoKmVudiktPk5ld0dsb2JhbFJlZihlbnYsIHN1cmZhY2UpOworCisgICAgcmV0dXJuIHJlZmVyZW5jZTsKK30KKworaW50IGZmX21lZGlhY29kZWNfc3VyZmFjZV91bnJlZih2b2lkICpzdXJmYWNlLCB2b2lkICpsb2dfY3R4KQoreworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKworICAgIGVudiA9IGZmX2puaV9nZXRfZW52KGxvZ19jdHgpOworICAgIGlmICghZW52KSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgICgqZW52KS0+RGVsZXRlR2xvYmFsUmVmKGVudiwgc3VyZmFjZSk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVkaWFjb2RlY19zdXJmYWNlLmggYi9saWJhdmNvZGVjL21lZGlhY29kZWNfc3VyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzhiOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21lZGlhY29kZWNfc3VyZmFjZS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBBbmRyb2lkIE1lZGlhQ29kZWMgU3VyZmFjZSBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb24gc3R1cGVmbGl4LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01FRElBQ09ERUNfU1VSRkFDRV9ICisjZGVmaW5lIEFWQ09ERUNfTUVESUFDT0RFQ19TVVJGQUNFX0gKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorCit2b2lkICpmZl9tZWRpYWNvZGVjX3N1cmZhY2VfcmVmKHZvaWQgKnN1cmZhY2UsIHZvaWQgKmxvZ19jdHgpOworaW50IGZmX21lZGlhY29kZWNfc3VyZmFjZV91bnJlZih2b2lkICpzdXJmYWNlLCB2b2lkICpsb2dfY3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUVESUFDT0RFQ19TVVJGQUNFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVkaWFjb2RlY19zd19idWZmZXIuYyBiL2xpYmF2Y29kZWMvbWVkaWFjb2RlY19zd19idWZmZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjQyOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9tZWRpYWNvZGVjX3N3X2J1ZmZlci5jCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogQW5kcm9pZCBNZWRpYUNvZGVjIHNvZnR3YXJlIGJ1ZmZlciBjb3B5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uIHN0dXBlZmxpeC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtZWRpYWNvZGVjX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJtZWRpYWNvZGVjX3N3X2J1ZmZlci5oIgorI2luY2x1ZGUgIm1lZGlhY29kZWNkZWNfY29tbW9uLmgiCisKKyNkZWZpbmUgUUNPTV9USUxFX1dJRFRIIDY0CisjZGVmaW5lIFFDT01fVElMRV9IRUlHSFQgMzIKKyNkZWZpbmUgUUNPTV9USUxFX1NJWkUgKFFDT01fVElMRV9XSURUSCAqIFFDT01fVElMRV9IRUlHSFQpCisjZGVmaW5lIFFDT01fVElMRV9HUk9VUF9TSVpFICg0ICogUUNPTV9USUxFX1NJWkUpCisKKy8qKgorICogVGhlIGNvZGUgaGFuZGxpbmcgdGhlIHZhcmlvdXMgWVVWIGNvbG9yIGZvcm1hdHMgaXMgdGFrZW4gZnJvbSB0aGUKKyAqIEdTdHJlYW1lciBwcm9qZWN0LgorICoKKyAqIEdzdHJlYW1lciByZWZlcmVuY2U6CisgKiBodHRwczovL2NnaXQuZnJlZWRlc2t0b3Aub3JnL2dzdHJlYW1lci9nc3QtcGx1Z2lucy1iYWQvdHJlZS9zeXMvYW5kcm9pZG1lZGlhLworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgQ29sbGFib3JhIEx0ZC4KKyAqICAgQXV0aG9yOiBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW4uZHJvZWdlQGNvbGxhYm9yYS5jby51az4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIsIFJhZmHDq2wgQ2FycsOpIDxmdW5tYW5AdmlkZW9sYW5vcmc+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LCBTZWJhc3RpYW4gRHLDtmdlIDxzZWJhc3RpYW5AY2VudHJpY3VsYXIuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNC0yMDE1LCBDb2xsYWJvcmEgTHRkLgorICogICBBdXRob3I6IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uQGdjb2xsYWJvcmEuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSwgRWR3YXJkIEhlcnZleQorICogICBBdXRob3I6IEVkd2FyZCBIZXJ2ZXkgPGJpbGJvZWRAZ21haWwuY29tPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSwgTWF0dGhldyBXYXRlcnMgPG1hdHRoZXdAY2VudHJpY3VsYXIuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KK3ZvaWQgZmZfbWVkaWFjb2RlY19zd19idWZmZXJfY29weV95dXY0MjBfcGxhbmFyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNEZWNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICpzcmMgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBpbnQgc3RyaWRlID0gcy0+c3RyaWRlOworICAgICAgICBpbnQgaGVpZ2h0OworCisgICAgICAgIHNyYyA9IGRhdGEgKyBpbmZvLT5vZmZzZXQ7CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICAgICAgICAgIHNyYyArPSBzLT5jcm9wX3RvcCAqIHMtPnN0cmlkZTsKKyAgICAgICAgICAgIHNyYyArPSBzLT5jcm9wX2xlZnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoZWlnaHQgPSBhdmN0eC0+aGVpZ2h0IC8gMjsKKyAgICAgICAgICAgIHN0cmlkZSA9IChzLT5zdHJpZGUgKyAxKSAvIDI7CisKKyAgICAgICAgICAgIHNyYyArPSBzLT5zbGljZV9oZWlnaHQgKiBzLT5zdHJpZGU7CisKKyAgICAgICAgICAgIGlmIChpID09IDIpIHsKKyAgICAgICAgICAgICAgICBzcmMgKz0gKChzLT5zbGljZV9oZWlnaHQgKyAxKSAvIDIpICogc3RyaWRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzcmMgKz0gcy0+Y3JvcF90b3AgKiBzdHJpZGU7CisgICAgICAgICAgICBzcmMgKz0gKHMtPmNyb3BfbGVmdCAvIDIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lLT5saW5lc2l6ZVtpXSA9PSBzdHJpZGUpIHsKKyAgICAgICAgICAgIG1lbWNweShmcmFtZS0+ZGF0YVtpXSwgc3JjLCBoZWlnaHQgKiBzdHJpZGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGosIHdpZHRoOworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gZnJhbWUtPmRhdGFbaV07CisKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IGF2Y3R4LT53aWR0aDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+PSAxKSB7CisgICAgICAgICAgICAgICAgd2lkdGggPSBGRk1JTihmcmFtZS0+bGluZXNpemVbaV0sIEZGQUxJR04oYXZjdHgtPndpZHRoLCAyKSAvIDIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgIGRzdCArPSBmcmFtZS0+bGluZXNpemVbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZmZfbWVkaWFjb2RlY19zd19idWZmZXJfY29weV95dXY0MjBfc2VtaV9wbGFuYXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjRGVjQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90ICpzcmMgPSBOVUxMOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpbnQgaGVpZ2h0OworCisgICAgICAgIHNyYyA9IGRhdGEgKyBpbmZvLT5vZmZzZXQ7CisgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgIGhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICAgICAgICAgIHNyYyArPSBzLT5jcm9wX3RvcCAqIHMtPnN0cmlkZTsKKyAgICAgICAgICAgIHNyYyArPSBzLT5jcm9wX2xlZnQ7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7CisgICAgICAgICAgICBoZWlnaHQgPSBhdmN0eC0+aGVpZ2h0IC8gMjsKKworICAgICAgICAgICAgc3JjICs9IHMtPnNsaWNlX2hlaWdodCAqIHMtPnN0cmlkZTsKKyAgICAgICAgICAgIHNyYyArPSBzLT5jcm9wX3RvcCAqIHMtPnN0cmlkZTsKKyAgICAgICAgICAgIHNyYyArPSBzLT5jcm9wX2xlZnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWUtPmxpbmVzaXplW2ldID09IHMtPnN0cmlkZSkgeworICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhW2ldLCBzcmMsIGhlaWdodCAqIHMtPnN0cmlkZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaiwgd2lkdGg7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBmcmFtZS0+ZGF0YVtpXTsKKworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gYXZjdHgtPndpZHRoOworICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IEZGTUlOKGZyYW1lLT5saW5lc2l6ZVtpXSwgRkZBTElHTihhdmN0eC0+d2lkdGgsIDIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgc3JjICs9IHMtPnN0cmlkZTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gZnJhbWUtPmxpbmVzaXplW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKwordm9pZCBmZl9tZWRpYWNvZGVjX3N3X2J1ZmZlcl9jb3B5X3l1djQyMF9wYWNrZWRfc2VtaV9wbGFuYXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgKnNyYyA9IE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGludCBoZWlnaHQ7CisKKyAgICAgICAgc3JjID0gZGF0YSArIGluZm8tPm9mZnNldDsKKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKyAgICAgICAgfSBlbHNlIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgIGhlaWdodCA9IGF2Y3R4LT5oZWlnaHQgLyAyOworCisgICAgICAgICAgICBzcmMgKz0gKHMtPnNsaWNlX2hlaWdodCAtIHMtPmNyb3BfdG9wIC8gMikgKiBzLT5zdHJpZGU7CisKKyAgICAgICAgICAgIHNyYyArPSBzLT5jcm9wX3RvcCAqIHMtPnN0cmlkZTsKKyAgICAgICAgICAgIHNyYyArPSBzLT5jcm9wX2xlZnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWUtPmxpbmVzaXplW2ldID09IHMtPnN0cmlkZSkgeworICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhW2ldLCBzcmMsIGhlaWdodCAqIHMtPnN0cmlkZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgaiwgd2lkdGg7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBmcmFtZS0+ZGF0YVtpXTsKKworICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIHdpZHRoID0gYXZjdHgtPndpZHRoOworICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IDEpIHsKKyAgICAgICAgICAgICAgICB3aWR0aCA9IEZGTUlOKGZyYW1lLT5saW5lc2l6ZVtpXSwgRkZBTElHTihhdmN0eC0+d2lkdGgsIDIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgc3JjICs9IHMtPnN0cmlkZTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gZnJhbWUtPmxpbmVzaXplW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIFRoZSBjb2RlIGhhbmRsaW5nIHRoZSBRQ09NX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI2NHgzMlRpbGUybThrYQorICogY29sb3IgZm9ybWF0IGlzIHRha2VuIGZyb20gdGhlIFZMQyBwcm9qZWN0LgorICoKKyAqIFZMQyByZWZlcmVuY2U6CisgKiBodHRwOi8vZ2l0LnZpZGVvbGFuLm9yZy8/cD12bGMuZ2l0O2E9YmxvYjtmPW1vZHVsZXMvY29kZWMvb214aWwvcWNvbS5jO2hiPUhFQUQKKyAqCisgKiBWTEMgY29weXJpZ2h0IG5vdGljZToKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHFjb20uYyA6IHBpeGVsIGZvcm1hdCB0cmFuc2xhdGlvbiBmb3IgUXVhbGNvbW0gdGlsZWQgbnYxMgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBDb3B5cmlnaHQgwqkgMjAxMiBSYWZhw6tsIENhcnLDqQorICoKKyAqIEF1dGhvcnM6IFJhZmHDq2wgQ2FycsOpIDxmdW5tYW5AdmlkZW9sYW5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAqIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKK3N0YXRpYyBzaXplX3QgcWNvbV90aWxlX3BvcyhzaXplX3QgeCwgc2l6ZV90IHksIHNpemVfdCB3LCBzaXplX3QgaCkKK3sKKyAgc2l6ZV90IGZsaW0gPSB4ICsgKHkgJiB+MSkgKiB3OworCisgIGlmICh5ICYgMSkgeworICAgIGZsaW0gKz0gKHggJiB+MykgKyAyOworICB9IGVsc2UgaWYgKChoICYgMSkgPT0gMCB8fCB5ICE9IChoIC0gMSkpIHsKKyAgICBmbGltICs9ICh4ICsgMikgJiB+MzsKKyAgfQorCisgIHJldHVybiBmbGltOworfQorCit2b2lkIGZmX21lZGlhY29kZWNfc3dfYnVmZmVyX2NvcHlfeXV2NDIwX3BhY2tlZF9zZW1pX3BsYW5hcl82NHgzMlRpbGUybThrYShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjRGVjQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgc2l6ZV90IHdpZHRoID0gZnJhbWUtPndpZHRoOworICAgIHNpemVfdCBsaW5lc2l6ZSA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBzaXplX3QgaGVpZ2h0ID0gZnJhbWUtPmhlaWdodDsKKworICAgIGNvbnN0IHNpemVfdCB0aWxlX3cgPSAod2lkdGggLSAxKSAvIFFDT01fVElMRV9XSURUSCArIDE7CisgICAgY29uc3Qgc2l6ZV90IHRpbGVfd19hbGlnbiA9ICh0aWxlX3cgKyAxKSAmIH4xOworICAgIGNvbnN0IHNpemVfdCB0aWxlX2hfbHVtYSA9IChoZWlnaHQgLSAxKSAvIFFDT01fVElMRV9IRUlHSFQgKyAxOworICAgIGNvbnN0IHNpemVfdCB0aWxlX2hfY2hyb21hID0gKGhlaWdodCAvIDIgLSAxKSAvIFFDT01fVElMRV9IRUlHSFQgKyAxOworCisgICAgc2l6ZV90IGx1bWFfc2l6ZSA9IHRpbGVfd19hbGlnbiAqIHRpbGVfaF9sdW1hICogUUNPTV9USUxFX1NJWkU7CisgICAgaWYoKGx1bWFfc2l6ZSAlIFFDT01fVElMRV9HUk9VUF9TSVpFKSAhPSAwKQorICAgICAgICBsdW1hX3NpemUgPSAoKChsdW1hX3NpemUgLSAxKSAvIFFDT01fVElMRV9HUk9VUF9TSVpFKSArIDEpICogUUNPTV9USUxFX0dST1VQX1NJWkU7CisKKyAgICBmb3Ioc2l6ZV90IHkgPSAwOyB5IDwgdGlsZV9oX2x1bWE7IHkrKykgeworICAgICAgICBzaXplX3Qgcm93X3dpZHRoID0gd2lkdGg7CisgICAgICAgIGZvcihzaXplX3QgeCA9IDA7IHggPCB0aWxlX3c7IHgrKykgeworICAgICAgICAgICAgc2l6ZV90IHRpbGVfd2lkdGggPSByb3dfd2lkdGg7CisgICAgICAgICAgICBzaXplX3QgdGlsZV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICAvKiBkZXN0IGx1bWEgbWVtb3J5IGluZGV4IGZvciB0aGlzIHRpbGUgKi8KKyAgICAgICAgICAgIHNpemVfdCBsdW1hX2lkeCA9IHkgKiBRQ09NX1RJTEVfSEVJR0hUICogbGluZXNpemUgKyB4ICogUUNPTV9USUxFX1dJRFRIOworICAgICAgICAgICAgLyogZGVzdCBjaHJvbWEgbWVtb3J5IGluZGV4IGZvciB0aGlzIHRpbGUgKi8KKyAgICAgICAgICAgIC8qIFhYWDogcmVtb3ZlIGRpdmlzaW9ucyAqLworICAgICAgICAgICAgc2l6ZV90IGNocm9tYV9pZHggPSAobHVtYV9pZHggLyBsaW5lc2l6ZSkgKiBsaW5lc2l6ZSAvIDIgKyAobHVtYV9pZHggJSBsaW5lc2l6ZSk7CisKKyAgICAgICAgICAgIC8qIGx1bWEgc291cmNlIHBvaW50ZXIgZm9yIHRoaXMgdGlsZSAqLworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX2x1bWEgID0gZGF0YQorICAgICAgICAgICAgICAgICsgcWNvbV90aWxlX3Bvcyh4LCB5LHRpbGVfd19hbGlnbiwgdGlsZV9oX2x1bWEpICogUUNPTV9USUxFX1NJWkU7CisKKyAgICAgICAgICAgIC8qIGNocm9tYSBzb3VyY2UgcG9pbnRlciBmb3IgdGhpcyB0aWxlICovCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfY2hyb21hID0gZGF0YSArIGx1bWFfc2l6ZQorICAgICAgICAgICAgICAgICsgcWNvbV90aWxlX3Bvcyh4LCB5LzIsIHRpbGVfd19hbGlnbiwgdGlsZV9oX2Nocm9tYSkgKiBRQ09NX1RJTEVfU0laRTsKKyAgICAgICAgICAgIGlmICh5ICYgMSkKKyAgICAgICAgICAgICAgICBzcmNfY2hyb21hICs9IFFDT01fVElMRV9TSVpFLzI7CisKKyAgICAgICAgICAgIC8qIGFjY291bnQgZm9yIHJpZ2h0IGNvbHVtbnMgKi8KKyAgICAgICAgICAgIGlmICh0aWxlX3dpZHRoID4gUUNPTV9USUxFX1dJRFRIKQorICAgICAgICAgICAgICAgIHRpbGVfd2lkdGggPSBRQ09NX1RJTEVfV0lEVEg7CisKKyAgICAgICAgICAgIC8qIGFjY291bnQgZm9yIGJvdHRvbSByb3dzICovCisgICAgICAgICAgICBpZiAodGlsZV9oZWlnaHQgPiBRQ09NX1RJTEVfSEVJR0hUKQorICAgICAgICAgICAgICAgIHRpbGVfaGVpZ2h0ID0gUUNPTV9USUxFX0hFSUdIVDsKKworICAgICAgICAgICAgdGlsZV9oZWlnaHQgLz0gMjsKKyAgICAgICAgICAgIHdoaWxlICh0aWxlX2hlaWdodC0tKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzBdICsgbHVtYV9pZHgsIHNyY19sdW1hLCB0aWxlX3dpZHRoKTsKKyAgICAgICAgICAgICAgICBzcmNfbHVtYSArPSBRQ09NX1RJTEVfV0lEVEg7CisgICAgICAgICAgICAgICAgbHVtYV9pZHggKz0gbGluZXNpemU7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoZnJhbWUtPmRhdGFbMF0gKyBsdW1hX2lkeCwgc3JjX2x1bWEsIHRpbGVfd2lkdGgpOworICAgICAgICAgICAgICAgIHNyY19sdW1hICs9IFFDT01fVElMRV9XSURUSDsKKyAgICAgICAgICAgICAgICBsdW1hX2lkeCArPSBsaW5lc2l6ZTsKKworICAgICAgICAgICAgICAgIG1lbWNweShmcmFtZS0+ZGF0YVsxXSArIGNocm9tYV9pZHgsIHNyY19jaHJvbWEsIHRpbGVfd2lkdGgpOworICAgICAgICAgICAgICAgIHNyY19jaHJvbWEgKz0gUUNPTV9USUxFX1dJRFRIOworICAgICAgICAgICAgICAgIGNocm9tYV9pZHggKz0gbGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByb3dfd2lkdGggLT0gUUNPTV9USUxFX1dJRFRIOworICAgICAgICB9CisgICAgICAgIGhlaWdodCAtPSBRQ09NX1RJTEVfSEVJR0hUOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVkaWFjb2RlY19zd19idWZmZXIuaCBiL2xpYmF2Y29kZWMvbWVkaWFjb2RlY19zd19idWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzRmYjUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9tZWRpYWNvZGVjX3N3X2J1ZmZlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBBbmRyb2lkIE1lZGlhQ29kZWMgc29mdHdhcmUgYnVmZmVyIGNvcHkgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb24gc3R1cGVmbGl4LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01FRElBQ09ERUNfU1dfQlVGRkVSX0gKKyNkZWZpbmUgQVZDT0RFQ19NRURJQUNPREVDX1NXX0JVRkZFUl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1lZGlhY29kZWNfd3JhcHBlci5oIgorI2luY2x1ZGUgIm1lZGlhY29kZWNkZWNfY29tbW9uLmgiCisKK3ZvaWQgZmZfbWVkaWFjb2RlY19zd19idWZmZXJfY29weV95dXY0MjBfcGxhbmFyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNEZWNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSk7CisKK3ZvaWQgZmZfbWVkaWFjb2RlY19zd19idWZmZXJfY29weV95dXY0MjBfc2VtaV9wbGFuYXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjRGVjQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSk7CisKK3ZvaWQgZmZfbWVkaWFjb2RlY19zd19idWZmZXJfY29weV95dXY0MjBfcGFja2VkX3NlbWlfcGxhbmFyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUpOworCit2b2lkIGZmX21lZGlhY29kZWNfc3dfYnVmZmVyX2NvcHlfeXV2NDIwX3BhY2tlZF9zZW1pX3BsYW5hcl82NHgzMlRpbGUybThrYShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNEZWNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUVESUFDT0RFQ19TV19CVUZGRVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tZWRpYWNvZGVjX3dyYXBwZXIuYyBiL2xpYmF2Y29kZWMvbWVkaWFjb2RlY193cmFwcGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3YzJjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbWVkaWFjb2RlY193cmFwcGVyLmMKQEAgLTAsMCArMSwxNzA0IEBACisvKgorICogQW5kcm9pZCBNZWRpYUNvZGVjIFdyYXBwZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbiBzdHVwZWZsaXguY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8am5pLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZmZqbmkuaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisjaW5jbHVkZSAibWVkaWFjb2RlY193cmFwcGVyLmgiCisKK3N0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMgeworCisgICAgamNsYXNzIG1lZGlhY29kZWNfbGlzdF9jbGFzczsKKyAgICBqbWV0aG9kSUQgaW5pdF9pZDsKKyAgICBqbWV0aG9kSUQgZmluZF9kZWNvZGVyX2Zvcl9mb3JtYXRfaWQ7CisKKyAgICBqbWV0aG9kSUQgZ2V0X2NvZGVjX2NvdW50X2lkOworICAgIGptZXRob2RJRCBnZXRfY29kZWNfaW5mb19hdF9pZDsKKworICAgIGpjbGFzcyBtZWRpYWNvZGVjX2luZm9fY2xhc3M7CisgICAgam1ldGhvZElEIGdldF9uYW1lX2lkOworICAgIGptZXRob2RJRCBnZXRfY29kZWNfY2FwYWJpbGl0aWVzX2lkOworICAgIGptZXRob2RJRCBnZXRfc3VwcG9ydGVkX3R5cGVzX2lkOworICAgIGptZXRob2RJRCBpc19lbmNvZGVyX2lkOworCisgICAgamNsYXNzIGNvZGVjX2NhcGFiaWxpdGllc19jbGFzczsKKyAgICBqZmllbGRJRCBjb2xvcl9mb3JtYXRzX2lkOworICAgIGpmaWVsZElEIHByb2ZpbGVfbGV2ZWxzX2lkOworCisgICAgamNsYXNzIGNvZGVjX3Byb2ZpbGVfbGV2ZWxfY2xhc3M7CisgICAgamZpZWxkSUQgcHJvZmlsZV9pZDsKKyAgICBqZmllbGRJRCBsZXZlbF9pZDsKKworICAgIGpmaWVsZElEIGF2Y19wcm9maWxlX2Jhc2VsaW5lX2lkOworICAgIGpmaWVsZElEIGF2Y19wcm9maWxlX21haW5faWQ7CisgICAgamZpZWxkSUQgYXZjX3Byb2ZpbGVfZXh0ZW5kZWRfaWQ7CisgICAgamZpZWxkSUQgYXZjX3Byb2ZpbGVfaGlnaF9pZDsKKyAgICBqZmllbGRJRCBhdmNfcHJvZmlsZV9oaWdoMTBfaWQ7CisgICAgamZpZWxkSUQgYXZjX3Byb2ZpbGVfaGlnaDQyMl9pZDsKKyAgICBqZmllbGRJRCBhdmNfcHJvZmlsZV9oaWdoNDQ0X2lkOworCisgICAgamZpZWxkSUQgaGV2Y19wcm9maWxlX21haW5faWQ7CisgICAgamZpZWxkSUQgaGV2Y19wcm9maWxlX21haW4xMF9pZDsKKyAgICBqZmllbGRJRCBoZXZjX3Byb2ZpbGVfbWFpbjEwX2hkcjEwX2lkOworCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IEZGSm5pRmllbGQgam5pX2FtZWRpYWNvZGVjbGlzdF9tYXBwaW5nW10gPSB7CisgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjTGlzdCIsIE5VTEwsIE5VTEwsIEZGX0pOSV9DTEFTUywgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgbWVkaWFjb2RlY19saXN0X2NsYXNzKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWNMaXN0IiwgIjxpbml0PiIsICIoSSlWIiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgaW5pdF9pZCksIDAgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjTGlzdCIsICJmaW5kRGVjb2RlckZvckZvcm1hdCIsICIoTGFuZHJvaWQvbWVkaWEvTWVkaWFGb3JtYXQ7KUxqYXZhL2xhbmcvU3RyaW5nOyIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGZpbmRfZGVjb2Rlcl9mb3JfZm9ybWF0X2lkKSwgMCB9LAorCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0xpc3QiLCAiZ2V0Q29kZWNDb3VudCIsICIoKUkiLCBGRl9KTklfU1RBVElDX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgZ2V0X2NvZGVjX2NvdW50X2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWNMaXN0IiwgImdldENvZGVjSW5mb0F0IiwgIihJKUxhbmRyb2lkL21lZGlhL01lZGlhQ29kZWNJbmZvOyIsIEZGX0pOSV9TVEFUSUNfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNMaXN0RmllbGRzLCBnZXRfY29kZWNfaW5mb19hdF9pZCksIDEgfSwKKworICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8iLCBOVUxMLCBOVUxMLCBGRl9KTklfQ0xBU1MsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIG1lZGlhY29kZWNfaW5mb19jbGFzcyksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjSW5mbyIsICJnZXROYW1lIiwgIigpTGphdmEvbGFuZy9TdHJpbmc7IiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgZ2V0X25hbWVfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8iLCAiZ2V0Q2FwYWJpbGl0aWVzRm9yVHlwZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL21lZGlhL01lZGlhQ29kZWNJbmZvJENvZGVjQ2FwYWJpbGl0aWVzOyIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGdldF9jb2RlY19jYXBhYmlsaXRpZXNfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8iLCAiZ2V0U3VwcG9ydGVkVHlwZXMiLCAiKClbTGphdmEvbGFuZy9TdHJpbmc7IiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgZ2V0X3N1cHBvcnRlZF90eXBlc19pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjSW5mbyIsICJpc0VuY29kZXIiLCAiKClaIiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgaXNfZW5jb2Rlcl9pZCksIDEgfSwKKworICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8kQ29kZWNDYXBhYmlsaXRpZXMiLCBOVUxMLCBOVUxMLCBGRl9KTklfQ0xBU1MsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGNvZGVjX2NhcGFiaWxpdGllc19jbGFzcyksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjSW5mbyRDb2RlY0NhcGFiaWxpdGllcyIsICJjb2xvckZvcm1hdHMiLCAiW0kiLCBGRl9KTklfRklFTEQsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGNvbG9yX2Zvcm1hdHNfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8kQ29kZWNDYXBhYmlsaXRpZXMiLCAicHJvZmlsZUxldmVscyIsICJbTGFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8kQ29kZWNQcm9maWxlTGV2ZWw7IiwgRkZfSk5JX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNMaXN0RmllbGRzLCBwcm9maWxlX2xldmVsc19pZCksIDEgfSwKKworICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8kQ29kZWNQcm9maWxlTGV2ZWwiLCBOVUxMLCBOVUxMLCBGRl9KTklfQ0xBU1MsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGNvZGVjX3Byb2ZpbGVfbGV2ZWxfY2xhc3MpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8kQ29kZWNQcm9maWxlTGV2ZWwiLCAicHJvZmlsZSIsICJJIiwgRkZfSk5JX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNMaXN0RmllbGRzLCBwcm9maWxlX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWNJbmZvJENvZGVjUHJvZmlsZUxldmVsIiwgImxldmVsIiwgIkkiLCBGRl9KTklfRklFTEQsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGxldmVsX2lkKSwgMSB9LAorCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8kQ29kZWNQcm9maWxlTGV2ZWwiLCAiQVZDUHJvZmlsZUJhc2VsaW5lIiwgIkkiLCBGRl9KTklfU1RBVElDX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNMaXN0RmllbGRzLCBhdmNfcHJvZmlsZV9iYXNlbGluZV9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjSW5mbyRDb2RlY1Byb2ZpbGVMZXZlbCIsICJBVkNQcm9maWxlTWFpbiIsICJJIiwgRkZfSk5JX1NUQVRJQ19GSUVMRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgYXZjX3Byb2ZpbGVfbWFpbl9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjSW5mbyRDb2RlY1Byb2ZpbGVMZXZlbCIsICJBVkNQcm9maWxlRXh0ZW5kZWQiLCAiSSIsIEZGX0pOSV9TVEFUSUNfRklFTEQsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGF2Y19wcm9maWxlX2V4dGVuZGVkX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWNJbmZvJENvZGVjUHJvZmlsZUxldmVsIiwgIkFWQ1Byb2ZpbGVIaWdoIiwgIkkiLCBGRl9KTklfU1RBVElDX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNMaXN0RmllbGRzLCBhdmNfcHJvZmlsZV9oaWdoX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWNJbmZvJENvZGVjUHJvZmlsZUxldmVsIiwgIkFWQ1Byb2ZpbGVIaWdoMTAiLCAiSSIsIEZGX0pOSV9TVEFUSUNfRklFTEQsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGF2Y19wcm9maWxlX2hpZ2gxMF9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjSW5mbyRDb2RlY1Byb2ZpbGVMZXZlbCIsICJBVkNQcm9maWxlSGlnaDQyMiIsICJJIiwgRkZfSk5JX1NUQVRJQ19GSUVMRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgYXZjX3Byb2ZpbGVfaGlnaDQyMl9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjSW5mbyRDb2RlY1Byb2ZpbGVMZXZlbCIsICJBVkNQcm9maWxlSGlnaDQ0NCIsICJJIiwgRkZfSk5JX1NUQVRJQ19GSUVMRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgYXZjX3Byb2ZpbGVfaGlnaDQ0NF9pZCksIDEgfSwKKworICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWNJbmZvJENvZGVjUHJvZmlsZUxldmVsIiwgIkhFVkNQcm9maWxlTWFpbiIsICJJIiwgRkZfSk5JX1NUQVRJQ19GSUVMRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgaGV2Y19wcm9maWxlX21haW5faWQpLCAwIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8kQ29kZWNQcm9maWxlTGV2ZWwiLCAiSEVWQ1Byb2ZpbGVNYWluMTAiLCAiSSIsIEZGX0pOSV9TVEFUSUNfRklFTEQsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMsIGhldmNfcHJvZmlsZV9tYWluMTBfaWQpLCAwIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlY0luZm8kQ29kZWNQcm9maWxlTGV2ZWwiLCAiSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMCIsICJJIiwgRkZfSk5JX1NUQVRJQ19GSUVMRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjTGlzdEZpZWxkcywgaGV2Y19wcm9maWxlX21haW4xMF9oZHIxMF9pZCksIDAgfSwKKworICAgIHsgTlVMTCB9Cit9OworCitzdHJ1Y3QgSk5JQU1lZGlhRm9ybWF0RmllbGRzIHsKKworICAgIGpjbGFzcyBtZWRpYWZvcm1hdF9jbGFzczsKKworICAgIGptZXRob2RJRCBpbml0X2lkOworCisgICAgam1ldGhvZElEIGNvbnRhaW5zX2tleV9pZDsKKworICAgIGptZXRob2RJRCBnZXRfaW50ZWdlcl9pZDsKKyAgICBqbWV0aG9kSUQgZ2V0X2xvbmdfaWQ7CisgICAgam1ldGhvZElEIGdldF9mbG9hdF9pZDsKKyAgICBqbWV0aG9kSUQgZ2V0X2J5dGVidWZmZXJfaWQ7CisgICAgam1ldGhvZElEIGdldF9zdHJpbmdfaWQ7CisKKyAgICBqbWV0aG9kSUQgc2V0X2ludGVnZXJfaWQ7CisgICAgam1ldGhvZElEIHNldF9sb25nX2lkOworICAgIGptZXRob2RJRCBzZXRfZmxvYXRfaWQ7CisgICAgam1ldGhvZElEIHNldF9ieXRlYnVmZmVyX2lkOworICAgIGptZXRob2RJRCBzZXRfc3RyaW5nX2lkOworCisgICAgam1ldGhvZElEIHRvX3N0cmluZ19pZDsKKworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBGRkpuaUZpZWxkIGpuaV9hbWVkaWFmb3JtYXRfbWFwcGluZ1tdID0geworICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFGb3JtYXQiLCBOVUxMLCBOVUxMLCBGRl9KTklfQ0xBU1MsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMsIG1lZGlhZm9ybWF0X2NsYXNzKSwgMSB9LAorCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFGb3JtYXQiLCAiPGluaXQ+IiwgIigpViIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMsIGluaXRfaWQpLCAxIH0sCisKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUZvcm1hdCIsICJjb250YWluc0tleSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KVoiLCBGRl9KTklfTUVUSE9ELG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMsIGNvbnRhaW5zX2tleV9pZCksIDEgfSwKKworICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhRm9ybWF0IiwgImdldEludGVnZXIiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylJIiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUZvcm1hdEZpZWxkcywgZ2V0X2ludGVnZXJfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFGb3JtYXQiLCAiZ2V0TG9uZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUoiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhRm9ybWF0RmllbGRzLCBnZXRfbG9uZ19pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUZvcm1hdCIsICJnZXRGbG9hdCIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhRm9ybWF0RmllbGRzLCBnZXRfZmxvYXRfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFGb3JtYXQiLCAiZ2V0Qnl0ZUJ1ZmZlciIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL25pby9CeXRlQnVmZmVyOyIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMsIGdldF9ieXRlYnVmZmVyX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhRm9ybWF0IiwgImdldFN0cmluZyIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nOyIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMsIGdldF9zdHJpbmdfaWQpLCAxIH0sCisKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUZvcm1hdCIsICJzZXRJbnRlZ2VyIiwgIihMamF2YS9sYW5nL1N0cmluZztJKVYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhRm9ybWF0RmllbGRzLCBzZXRfaW50ZWdlcl9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUZvcm1hdCIsICJzZXRMb25nIiwgIihMamF2YS9sYW5nL1N0cmluZztKKVYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhRm9ybWF0RmllbGRzLCBzZXRfbG9uZ19pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUZvcm1hdCIsICJzZXRGbG9hdCIsICIoTGphdmEvbGFuZy9TdHJpbmc7RilWIiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUZvcm1hdEZpZWxkcywgc2V0X2Zsb2F0X2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhRm9ybWF0IiwgInNldEJ5dGVCdWZmZXIiLCAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL25pby9CeXRlQnVmZmVyOylWIiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUZvcm1hdEZpZWxkcywgc2V0X2J5dGVidWZmZXJfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFGb3JtYXQiLCAic2V0U3RyaW5nIiwgIihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1N0cmluZzspViIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMsIHNldF9zdHJpbmdfaWQpLCAxIH0sCisKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUZvcm1hdCIsICJ0b1N0cmluZyIsICIoKUxqYXZhL2xhbmcvU3RyaW5nOyIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMsIHRvX3N0cmluZ19pZCksIDEgfSwKKworICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBhbWVkaWFmb3JtYXRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiYW1lZGlhZm9ybWF0IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RydWN0IEZGQU1lZGlhRm9ybWF0IHsKKworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMgamZpZWxkczsKKyAgICBqb2JqZWN0IG9iamVjdDsKK307CisKK3N0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcyB7CisKKyAgICBqY2xhc3MgbWVkaWFjb2RlY19jbGFzczsKKworICAgIGpmaWVsZElEIGluZm9fdHJ5X2FnYWluX2xhdGVyX2lkOworICAgIGpmaWVsZElEIGluZm9fb3V0cHV0X2J1ZmZlcnNfY2hhbmdlZF9pZDsKKyAgICBqZmllbGRJRCBpbmZvX291dHB1dF9mb3JtYXRfY2hhbmdlZF9pZDsKKworICAgIGpmaWVsZElEIGJ1ZmZlcl9mbGFnX2NvZGVjX2NvbmZpZ19pZDsKKyAgICBqZmllbGRJRCBidWZmZXJfZmxhZ19lbmRfb2Zfc3RyZWFtX2lkOworICAgIGpmaWVsZElEIGJ1ZmZlcl9mbGFnX2tleV9mcmFtZV9pZDsKKworICAgIGpmaWVsZElEIGNvbmZpZ3VyZV9mbGFnX2VuY29kZV9pZDsKKworICAgIGptZXRob2RJRCBjcmVhdGVfYnlfY29kZWNfbmFtZV9pZDsKKyAgICBqbWV0aG9kSUQgY3JlYXRlX2RlY29kZXJfYnlfdHlwZV9pZDsKKyAgICBqbWV0aG9kSUQgY3JlYXRlX2VuY29kZXJfYnlfdHlwZV9pZDsKKworICAgIGptZXRob2RJRCBnZXRfbmFtZV9pZDsKKworICAgIGptZXRob2RJRCBjb25maWd1cmVfaWQ7CisgICAgam1ldGhvZElEIHN0YXJ0X2lkOworICAgIGptZXRob2RJRCBmbHVzaF9pZDsKKyAgICBqbWV0aG9kSUQgc3RvcF9pZDsKKyAgICBqbWV0aG9kSUQgcmVsZWFzZV9pZDsKKworICAgIGptZXRob2RJRCBnZXRfb3V0cHV0X2Zvcm1hdF9pZDsKKworICAgIGptZXRob2RJRCBkZXF1ZXVlX2lucHV0X2J1ZmZlcl9pZDsKKyAgICBqbWV0aG9kSUQgcXVldWVfaW5wdXRfYnVmZmVyX2lkOworICAgIGptZXRob2RJRCBnZXRfaW5wdXRfYnVmZmVyX2lkOworICAgIGptZXRob2RJRCBnZXRfaW5wdXRfYnVmZmVyc19pZDsKKworICAgIGptZXRob2RJRCBkZXF1ZXVlX291dHB1dF9idWZmZXJfaWQ7CisgICAgam1ldGhvZElEIGdldF9vdXRwdXRfYnVmZmVyX2lkOworICAgIGptZXRob2RJRCBnZXRfb3V0cHV0X2J1ZmZlcnNfaWQ7CisgICAgam1ldGhvZElEIHJlbGVhc2Vfb3V0cHV0X2J1ZmZlcl9pZDsKKyAgICBqbWV0aG9kSUQgcmVsZWFzZV9vdXRwdXRfYnVmZmVyX2F0X3RpbWVfaWQ7CisKKyAgICBqY2xhc3MgbWVkaWFpbmZvX2NsYXNzOworCisgICAgam1ldGhvZElEIGluaXRfaWQ7CisKKyAgICBqZmllbGRJRCBmbGFnc19pZDsKKyAgICBqZmllbGRJRCBvZmZzZXRfaWQ7CisgICAgamZpZWxkSUQgcHJlc2VudGF0aW9uX3RpbWVfdXNfaWQ7CisgICAgamZpZWxkSUQgc2l6ZV9pZDsKKworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBGRkpuaUZpZWxkIGpuaV9hbWVkaWFjb2RlY19tYXBwaW5nW10gPSB7CisgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgTlVMTCwgTlVMTCwgRkZfSk5JX0NMQVNTLCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIG1lZGlhY29kZWNfY2xhc3MpLCAxIH0sCisKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgIklORk9fVFJZX0FHQUlOX0xBVEVSIiwgIkkiLCBGRl9KTklfU1RBVElDX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGluZm9fdHJ5X2FnYWluX2xhdGVyX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEIiwgIkkiLCBGRl9KTklfU1RBVElDX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGluZm9fb3V0cHV0X2J1ZmZlcnNfY2hhbmdlZF9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgIklORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEIiwgIkkiLCBGRl9KTklfU1RBVElDX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGluZm9fb3V0cHV0X2Zvcm1hdF9jaGFuZ2VkX2lkKSwgMSB9LAorCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYyIsICJCVUZGRVJfRkxBR19DT0RFQ19DT05GSUciLCAiSSIsIEZGX0pOSV9TVEFUSUNfRklFTEQsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgYnVmZmVyX2ZsYWdfY29kZWNfY29uZmlnX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTSIsICJJIiwgRkZfSk5JX1NUQVRJQ19GSUVMRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjRmllbGRzLCBidWZmZXJfZmxhZ19lbmRfb2Zfc3RyZWFtX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiQlVGRkVSX0ZMQUdfS0VZX0ZSQU1FIiwgIkkiLCBGRl9KTklfU1RBVElDX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGJ1ZmZlcl9mbGFnX2tleV9mcmFtZV9pZCksIDAgfSwKKworICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiQ09ORklHVVJFX0ZMQUdfRU5DT0RFIiwgIkkiLCBGRl9KTklfU1RBVElDX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGNvbmZpZ3VyZV9mbGFnX2VuY29kZV9pZCksIDEgfSwKKworICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiY3JlYXRlQnlDb2RlY05hbWUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjOyIsIEZGX0pOSV9TVEFUSUNfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGNyZWF0ZV9ieV9jb2RlY19uYW1lX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiY3JlYXRlRGVjb2RlckJ5VHlwZSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL21lZGlhL01lZGlhQ29kZWM7IiwgRkZfSk5JX1NUQVRJQ19NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgY3JlYXRlX2RlY29kZXJfYnlfdHlwZV9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgImNyZWF0ZUVuY29kZXJCeVR5cGUiLCAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjOyIsIEZGX0pOSV9TVEFUSUNfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGNyZWF0ZV9lbmNvZGVyX2J5X3R5cGVfaWQpLCAxIH0sCisKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgImdldE5hbWUiLCAiKClMamF2YS9sYW5nL1N0cmluZzsiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGdldF9uYW1lX2lkKSwgMSB9LAorCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYyIsICJjb25maWd1cmUiLCAiKExhbmRyb2lkL21lZGlhL01lZGlhRm9ybWF0O0xhbmRyb2lkL3ZpZXcvU3VyZmFjZTtMYW5kcm9pZC9tZWRpYS9NZWRpYUNyeXB0bztJKVYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGNvbmZpZ3VyZV9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgInN0YXJ0IiwgIigpViIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgc3RhcnRfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYyIsICJmbHVzaCIsICIoKVYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGZsdXNoX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAic3RvcCIsICIoKVYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIHN0b3BfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYyIsICJyZWxlYXNlIiwgIigpViIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgcmVsZWFzZV9pZCksIDEgfSwKKworICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiZ2V0T3V0cHV0Rm9ybWF0IiwgIigpTGFuZHJvaWQvbWVkaWEvTWVkaWFGb3JtYXQ7IiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjRmllbGRzLCBnZXRfb3V0cHV0X2Zvcm1hdF9pZCksIDEgfSwKKworICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiZGVxdWV1ZUlucHV0QnVmZmVyIiwgIihKKUkiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGRlcXVldWVfaW5wdXRfYnVmZmVyX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAicXVldWVJbnB1dEJ1ZmZlciIsICIoSUlJSkkpViIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgcXVldWVfaW5wdXRfYnVmZmVyX2lkKSwgMSB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiZ2V0SW5wdXRCdWZmZXIiLCAiKEkpTGphdmEvbmlvL0J5dGVCdWZmZXI7IiwgRkZfSk5JX01FVEhPRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjRmllbGRzLCBnZXRfaW5wdXRfYnVmZmVyX2lkKSwgMCB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiZ2V0SW5wdXRCdWZmZXJzIiwgIigpW0xqYXZhL25pby9CeXRlQnVmZmVyOyIsIEZGX0pOSV9NRVRIT0QsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgZ2V0X2lucHV0X2J1ZmZlcnNfaWQpLCAxIH0sCisKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgImRlcXVldWVPdXRwdXRCdWZmZXIiLCAiKExhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMkQnVmZmVySW5mbztKKUkiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGRlcXVldWVfb3V0cHV0X2J1ZmZlcl9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgImdldE91dHB1dEJ1ZmZlciIsICIoSSlMamF2YS9uaW8vQnl0ZUJ1ZmZlcjsiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGdldF9vdXRwdXRfYnVmZmVyX2lkKSwgMCB9LAorICAgICAgICB7ICJhbmRyb2lkL21lZGlhL01lZGlhQ29kZWMiLCAiZ2V0T3V0cHV0QnVmZmVycyIsICIoKVtMamF2YS9uaW8vQnl0ZUJ1ZmZlcjsiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGdldF9vdXRwdXRfYnVmZmVyc19pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgInJlbGVhc2VPdXRwdXRCdWZmZXIiLCAiKElaKVYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIHJlbGVhc2Vfb3V0cHV0X2J1ZmZlcl9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjIiwgInJlbGVhc2VPdXRwdXRCdWZmZXIiLCAiKElKKVYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIHJlbGVhc2Vfb3V0cHV0X2J1ZmZlcl9hdF90aW1lX2lkKSwgMCB9LAorCisgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjJEJ1ZmZlckluZm8iLCBOVUxMLCBOVUxMLCBGRl9KTklfQ0xBU1MsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgbWVkaWFpbmZvX2NsYXNzKSwgMSB9LAorCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYy5CdWZmZXJJbmZvIiwgIjxpbml0PiIsICIoKVYiLCBGRl9KTklfTUVUSE9ELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIGluaXRfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYy5CdWZmZXJJbmZvIiwgImZsYWdzIiwgIkkiLCBGRl9KTklfRklFTEQsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgZmxhZ3NfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYy5CdWZmZXJJbmZvIiwgIm9mZnNldCIsICJJIiwgRkZfSk5JX0ZJRUxELCBvZmZzZXRvZihzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMsIG9mZnNldF9pZCksIDEgfSwKKyAgICAgICAgeyAiYW5kcm9pZC9tZWRpYS9NZWRpYUNvZGVjLkJ1ZmZlckluZm8iLCAicHJlc2VudGF0aW9uVGltZVVzIiwgIkoiLCBGRl9KTklfRklFTEQsIG9mZnNldG9mKHN0cnVjdCBKTklBTWVkaWFDb2RlY0ZpZWxkcywgcHJlc2VudGF0aW9uX3RpbWVfdXNfaWQpLCAxIH0sCisgICAgICAgIHsgImFuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYy5CdWZmZXJJbmZvIiwgInNpemUiLCAiSSIsIEZGX0pOSV9GSUVMRCwgb2Zmc2V0b2Yoc3RydWN0IEpOSUFNZWRpYUNvZGVjRmllbGRzLCBzaXplX2lkKSwgMSB9LAorCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFtZWRpYWNvZGVjX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImFtZWRpYWNvZGVjIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RydWN0IEZGQU1lZGlhQ29kZWMgeworCisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBzdHJ1Y3QgSk5JQU1lZGlhQ29kZWNGaWVsZHMgamZpZWxkczsKKworICAgIGpvYmplY3Qgb2JqZWN0OworICAgIGpvYmplY3QgYnVmZmVyX2luZm87CisKKyAgICBqb2JqZWN0IGlucHV0X2J1ZmZlcnM7CisgICAgam9iamVjdCBvdXRwdXRfYnVmZmVyczsKKworICAgIGludCBJTkZPX1RSWV9BR0FJTl9MQVRFUjsKKyAgICBpbnQgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOworICAgIGludCBJTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDsKKworICAgIGludCBCVUZGRVJfRkxBR19DT0RFQ19DT05GSUc7CisgICAgaW50IEJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CisgICAgaW50IEJVRkZFUl9GTEFHX0tFWV9GUkFNRTsKKworICAgIGludCBDT05GSUdVUkVfRkxBR19FTkNPREU7CisKKyAgICBpbnQgaGFzX2dldF9pX29fYnVmZmVyOworfTsKKworI2RlZmluZSBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBsb2dfY3R4LCByZXQpIGRvIHsgICAgICAgICAgICAgIFwKKyAgICAoZW52KSA9IGZmX2puaV9nZXRfZW52KGxvZ19jdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEoZW52KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEpOSV9HRVRfRU5WX09SX1JFVFVSTl9WT0lEKGVudiwgbG9nX2N0eCkgZG8geyAgICAgICAgICAgICAgXAorICAgIChlbnYpID0gZmZfam5pX2dldF9lbnYobG9nX2N0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShlbnYpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK2ludCBmZl9BTWVkaWFDb2RlY1Byb2ZpbGVfZ2V0UHJvZmlsZUZyb21BVkNvZGVjQ29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IHJldCA9IC0xOworCisgICAgSk5JRW52ICplbnYgPSBOVUxMOworICAgIHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMgamZpZWxkcyA9IHsgMCB9OworICAgIGpmaWVsZElEIGZpZWxkX2lkID0gMDsKKworICAgIEpOSV9HRVRfRU5WX09SX1JFVFVSTihlbnYsIGF2Y3R4LCAtMSk7CisKKyAgICBpZiAoZmZfam5pX2luaXRfamZpZWxkcyhlbnYsICZqZmllbGRzLCBqbmlfYW1lZGlhY29kZWNsaXN0X21hcHBpbmcsIDAsIGF2Y3R4KSA8IDApIHsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgICAgICBzd2l0Y2goYXZjdHgtPnByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfQkFTRUxJTkU6CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0NPTlNUUkFJTkVEX0JBU0VMSU5FOgorICAgICAgICAgICAgZmllbGRfaWQgPSBqZmllbGRzLmF2Y19wcm9maWxlX2Jhc2VsaW5lX2lkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X01BSU46CisgICAgICAgICAgICBmaWVsZF9pZCA9IGpmaWVsZHMuYXZjX3Byb2ZpbGVfbWFpbl9pZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9FWFRFTkRFRDoKKyAgICAgICAgICAgIGZpZWxkX2lkID0gamZpZWxkcy5hdmNfcHJvZmlsZV9leHRlbmRlZF9pZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIOgorICAgICAgICAgICAgZmllbGRfaWQgPSBqZmllbGRzLmF2Y19wcm9maWxlX2hpZ2hfaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF8xMDoKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF8xMF9JTlRSQToKKyAgICAgICAgICAgIGZpZWxkX2lkID0gamZpZWxkcy5hdmNfcHJvZmlsZV9oaWdoMTBfaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80MjI6CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyX0lOVFJBOgorICAgICAgICAgICAgZmllbGRfaWQgPSBqZmllbGRzLmF2Y19wcm9maWxlX2hpZ2g0MjJfaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDQ6CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X0lOVFJBOgorICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFOgorICAgICAgICAgICAgZmllbGRfaWQgPSBqZmllbGRzLmF2Y19wcm9maWxlX2hpZ2g0NDRfaWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hFVkMpIHsKKyAgICAgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSEVWQ19NQUlOOgorICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSEVWQ19NQUlOX1NUSUxMX1BJQ1RVUkU6CisgICAgICAgICAgICBmaWVsZF9pZCA9IGpmaWVsZHMuaGV2Y19wcm9maWxlX21haW5faWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0hFVkNfTUFJTl8xMDoKKyAgICAgICAgICAgIGZpZWxkX2lkID0gamZpZWxkcy5oZXZjX3Byb2ZpbGVfbWFpbjEwX2lkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgICAgaWYgKGZpZWxkX2lkKSB7CisgICAgICAgICAgICByZXQgPSAoKmVudiktPkdldFN0YXRpY0ludEZpZWxkKGVudiwgamZpZWxkcy5jb2RlY19wcm9maWxlX2xldmVsX2NsYXNzLCBmaWVsZF9pZCk7CisgICAgICAgICAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGF2Y3R4KSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworZG9uZToKKyAgICBmZl9qbmlfcmVzZXRfamZpZWxkcyhlbnYsICZqZmllbGRzLCBqbmlfYW1lZGlhY29kZWNsaXN0X21hcHBpbmcsIDAsIGF2Y3R4KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2NoYXIgKmZmX0FNZWRpYUNvZGVjTGlzdF9nZXRDb2RlY05hbWVCeVR5cGUoY29uc3QgY2hhciAqbWltZSwgaW50IHByb2ZpbGUsIGludCBlbmNvZGVyLCB2b2lkICpsb2dfY3R4KQoreworICAgIGludCByZXQ7CisgICAgaW50IGk7CisgICAgaW50IGNvZGVjX2NvdW50OworICAgIGludCBmb3VuZF9jb2RlYyA9IDA7CisgICAgY2hhciAqbmFtZSA9IE5VTEw7CisgICAgY2hhciAqc3VwcG9ydGVkX3R5cGUgPSBOVUxMOworCisgICAgSk5JRW52ICplbnYgPSBOVUxMOworICAgIHN0cnVjdCBKTklBTWVkaWFDb2RlY0xpc3RGaWVsZHMgamZpZWxkcyA9IHsgMCB9OworICAgIHN0cnVjdCBKTklBTWVkaWFGb3JtYXRGaWVsZHMgbWVkaWFmb3JtYXRfamZpZWxkcyA9IHsgMCB9OworCisgICAgam9iamVjdCBmb3JtYXQgPSBOVUxMOworICAgIGpvYmplY3QgY29kZWMgPSBOVUxMOworICAgIGpvYmplY3QgY29kZWNfbmFtZSA9IE5VTEw7CisKKyAgICBqb2JqZWN0IGluZm8gPSBOVUxMOworICAgIGpvYmplY3QgdHlwZSA9IE5VTEw7CisgICAgam9iamVjdEFycmF5IHR5cGVzID0gTlVMTDsKKworICAgIGpvYmplY3QgY2FwYWJpbGl0aWVzID0gTlVMTDsKKyAgICBqb2JqZWN0IHByb2ZpbGVfbGV2ZWwgPSBOVUxMOworICAgIGpvYmplY3RBcnJheSBwcm9maWxlX2xldmVscyA9IE5VTEw7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBsb2dfY3R4LCBOVUxMKTsKKworICAgIGlmICgocmV0ID0gZmZfam5pX2luaXRfamZpZWxkcyhlbnYsICZqZmllbGRzLCBqbmlfYW1lZGlhY29kZWNsaXN0X21hcHBpbmcsIDAsIGxvZ19jdHgpKSA8IDApIHsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfam5pX2luaXRfamZpZWxkcyhlbnYsICZtZWRpYWZvcm1hdF9qZmllbGRzLCBqbmlfYW1lZGlhZm9ybWF0X21hcHBpbmcsIDAsIGxvZ19jdHgpKSA8IDApIHsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGNvZGVjX2NvdW50ID0gKCplbnYpLT5DYWxsU3RhdGljSW50TWV0aG9kKGVudiwgamZpZWxkcy5tZWRpYWNvZGVjX2xpc3RfY2xhc3MsIGpmaWVsZHMuZ2V0X2NvZGVjX2NvdW50X2lkKTsKKyAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGxvZ19jdHgpIDwgMCkgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgY29kZWNfY291bnQ7IGkrKykgeworICAgICAgICBpbnQgajsKKyAgICAgICAgaW50IHR5cGVfY291bnQ7CisgICAgICAgIGludCBpc19lbmNvZGVyOworCisgICAgICAgIGluZm8gPSAoKmVudiktPkNhbGxTdGF0aWNPYmplY3RNZXRob2QoZW52LCBqZmllbGRzLm1lZGlhY29kZWNfbGlzdF9jbGFzcywgamZpZWxkcy5nZXRfY29kZWNfaW5mb19hdF9pZCwgaSk7CisgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgbG9nX2N0eCkgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICB0eXBlcyA9ICgqZW52KS0+Q2FsbE9iamVjdE1ldGhvZChlbnYsIGluZm8sIGpmaWVsZHMuZ2V0X3N1cHBvcnRlZF90eXBlc19pZCk7CisgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgbG9nX2N0eCkgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBpc19lbmNvZGVyID0gKCplbnYpLT5DYWxsQm9vbGVhbk1ldGhvZChlbnYsIGluZm8sIGpmaWVsZHMuaXNfZW5jb2Rlcl9pZCk7CisgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgbG9nX2N0eCkgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNfZW5jb2RlciAhPSBlbmNvZGVyKSB7CisgICAgICAgICAgICBnb3RvIGRvbmVfd2l0aF9pbmZvOworICAgICAgICB9CisKKyAgICAgICAgdHlwZV9jb3VudCA9ICgqZW52KS0+R2V0QXJyYXlMZW5ndGgoZW52LCB0eXBlcyk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB0eXBlX2NvdW50OyBqKyspIHsKKyAgICAgICAgICAgIGludCBrOworICAgICAgICAgICAgaW50IHByb2ZpbGVfY291bnQ7CisKKyAgICAgICAgICAgIHR5cGUgPSAoKmVudiktPkdldE9iamVjdEFycmF5RWxlbWVudChlbnYsIHR5cGVzLCBqKTsKKyAgICAgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgbG9nX2N0eCkgPCAwKSB7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdXBwb3J0ZWRfdHlwZSA9IGZmX2puaV9qc3RyaW5nX3RvX3V0Zl9jaGFycyhlbnYsIHR5cGUsIGxvZ19jdHgpOworICAgICAgICAgICAgaWYgKCFzdXBwb3J0ZWRfdHlwZSkgeworICAgICAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKHN1cHBvcnRlZF90eXBlLCBtaW1lKSkgeworICAgICAgICAgICAgICAgIGNvZGVjX25hbWUgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBpbmZvLCBqZmllbGRzLmdldF9uYW1lX2lkKTsKKyAgICAgICAgICAgICAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGxvZ19jdHgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbmFtZSA9IGZmX2puaV9qc3RyaW5nX3RvX3V0Zl9jaGFycyhlbnYsIGNvZGVjX25hbWUsIGxvZ19jdHgpOworICAgICAgICAgICAgICAgIGlmICghbmFtZSkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogU2tpcCBzb2Z0d2FyZSBkZWNvZGVycyAqLworICAgICAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKG5hbWUsICJPTVguZ29vZ2xlIikgfHwKKyAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKG5hbWUsICJPTVguZmZtcGVnIikgfHwKKyAgICAgICAgICAgICAgICAgICAgKHN0cnN0cihuYW1lLCAiT01YLlNFQyIpICYmIHN0cnN0cihuYW1lLCAiLnN3LiIpKSB8fAorICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG5hbWUsICJPTVgucWNvbS52aWRlby5kZWNvZGVyLmhldmNzd3ZkZWMiKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZG9uZV93aXRoX3R5cGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FwYWJpbGl0aWVzID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgaW5mbywgamZpZWxkcy5nZXRfY29kZWNfY2FwYWJpbGl0aWVzX2lkLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGxvZ19jdHgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvZmlsZV9sZXZlbHMgPSAoKmVudiktPkdldE9iamVjdEZpZWxkKGVudiwgY2FwYWJpbGl0aWVzLCBqZmllbGRzLnByb2ZpbGVfbGV2ZWxzX2lkKTsKKyAgICAgICAgICAgICAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGxvZ19jdHgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJvZmlsZV9jb3VudCA9ICgqZW52KS0+R2V0QXJyYXlMZW5ndGgoZW52LCBwcm9maWxlX2xldmVscyk7CisgICAgICAgICAgICAgICAgaWYgKCFwcm9maWxlX2NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2NvZGVjID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHByb2ZpbGVfY291bnQ7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3VwcG9ydGVkX3Byb2ZpbGUgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRfY29kZWMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2xldmVsID0gKCplbnYpLT5HZXRPYmplY3RBcnJheUVsZW1lbnQoZW52LCBwcm9maWxlX2xldmVscywgayk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgbG9nX2N0eCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfcHJvZmlsZSA9ICgqZW52KS0+R2V0SW50RmllbGQoZW52LCBwcm9maWxlX2xldmVsLCBqZmllbGRzLnByb2ZpbGVfaWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGxvZ19jdHgpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmRfY29kZWMgPSBwcm9maWxlID09IHN1cHBvcnRlZF9wcm9maWxlOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwcm9maWxlX2xldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgcHJvZmlsZV9sZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2xldmVsID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZF9jb2RlYykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKK2RvbmVfd2l0aF90eXBlOgorICAgICAgICAgICAgaWYgKHByb2ZpbGVfbGV2ZWxzKSB7CisgICAgICAgICAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHByb2ZpbGVfbGV2ZWxzKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlX2xldmVscyA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgY2FwYWJpbGl0aWVzKTsKKyAgICAgICAgICAgICAgICBjYXBhYmlsaXRpZXMgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodHlwZSkgeworICAgICAgICAgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCB0eXBlKTsKKyAgICAgICAgICAgICAgICB0eXBlID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfZnJlZXAoJnN1cHBvcnRlZF90eXBlKTsKKworICAgICAgICAgICAgaWYgKGZvdW5kX2NvZGVjKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZuYW1lKTsKKyAgICAgICAgfQorCitkb25lX3dpdGhfaW5mbzoKKyAgICAgICAgaWYgKGluZm8pIHsKKyAgICAgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBpbmZvKTsKKyAgICAgICAgICAgIGluZm8gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHR5cGVzKSB7CisgICAgICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgdHlwZXMpOworICAgICAgICAgICAgdHlwZXMgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvdW5kX2NvZGVjKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworZG9uZToKKyAgICBpZiAoZm9ybWF0KSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBmb3JtYXQpOworICAgIH0KKworICAgIGlmIChjb2RlYykgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgY29kZWMpOworICAgIH0KKworICAgIGlmIChjb2RlY19uYW1lKSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBjb2RlY19uYW1lKTsKKyAgICB9CisKKyAgICBpZiAoaW5mbykgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgaW5mbyk7CisgICAgfQorCisgICAgaWYgKHR5cGUpIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHR5cGUpOworICAgIH0KKworICAgIGlmICh0eXBlcykgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgdHlwZXMpOworICAgIH0KKworICAgIGlmIChjYXBhYmlsaXRpZXMpIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGNhcGFiaWxpdGllcyk7CisgICAgfQorCisgICAgaWYgKHByb2ZpbGVfbGV2ZWwpIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHByb2ZpbGVfbGV2ZWwpOworICAgIH0KKworICAgIGlmIChwcm9maWxlX2xldmVscykgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgcHJvZmlsZV9sZXZlbHMpOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZzdXBwb3J0ZWRfdHlwZSk7CisKKyAgICBmZl9qbmlfcmVzZXRfamZpZWxkcyhlbnYsICZqZmllbGRzLCBqbmlfYW1lZGlhY29kZWNsaXN0X21hcHBpbmcsIDAsIGxvZ19jdHgpOworICAgIGZmX2puaV9yZXNldF9qZmllbGRzKGVudiwgJm1lZGlhZm9ybWF0X2pmaWVsZHMsIGpuaV9hbWVkaWFmb3JtYXRfbWFwcGluZywgMCwgbG9nX2N0eCk7CisKKyAgICBpZiAoIWZvdW5kX2NvZGVjKSB7CisgICAgICAgIGF2X2ZyZWVwKCZuYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gbmFtZTsKK30KKworRkZBTWVkaWFGb3JtYXQgKmZmX0FNZWRpYUZvcm1hdF9uZXcodm9pZCkKK3sKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisgICAgRkZBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IE5VTEw7CisgICAgam9iamVjdCBvYmplY3QgPSBOVUxMOworCisgICAgZm9ybWF0ID0gYXZfbWFsbG9jeihzaXplb2YoRkZBTWVkaWFGb3JtYXQpKTsKKyAgICBpZiAoIWZvcm1hdCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9ybWF0LT5jbGFzcyA9ICZhbWVkaWFmb3JtYXRfY2xhc3M7CisKKyAgICBlbnYgPSBmZl9qbmlfZ2V0X2Vudihmb3JtYXQpOworICAgIGlmICghZW52KSB7CisgICAgICAgIGF2X2ZyZWVwKCZmb3JtYXQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZmZfam5pX2luaXRfamZpZWxkcyhlbnYsICZmb3JtYXQtPmpmaWVsZHMsIGpuaV9hbWVkaWFmb3JtYXRfbWFwcGluZywgMSwgZm9ybWF0KSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG9iamVjdCA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgZm9ybWF0LT5qZmllbGRzLm1lZGlhZm9ybWF0X2NsYXNzLCBmb3JtYXQtPmpmaWVsZHMuaW5pdF9pZCk7CisgICAgaWYgKCFvYmplY3QpIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvcm1hdC0+b2JqZWN0ID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBvYmplY3QpOworICAgIGlmICghZm9ybWF0LT5vYmplY3QpIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICBpZiAob2JqZWN0KSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBvYmplY3QpOworICAgIH0KKworICAgIGlmICghZm9ybWF0LT5vYmplY3QpIHsKKyAgICAgICAgZmZfam5pX3Jlc2V0X2pmaWVsZHMoZW52LCAmZm9ybWF0LT5qZmllbGRzLCBqbmlfYW1lZGlhZm9ybWF0X21hcHBpbmcsIDEsIGZvcm1hdCk7CisgICAgICAgIGF2X2ZyZWVwKCZmb3JtYXQpOworICAgIH0KKworICAgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXRpYyBGRkFNZWRpYUZvcm1hdCAqZmZfQU1lZGlhRm9ybWF0X25ld0Zyb21PYmplY3Qodm9pZCAqb2JqZWN0KQoreworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKyAgICBGRkFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gTlVMTDsKKworICAgIGZvcm1hdCA9IGF2X21hbGxvY3ooc2l6ZW9mKEZGQU1lZGlhRm9ybWF0KSk7CisgICAgaWYgKCFmb3JtYXQpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGZvcm1hdC0+Y2xhc3MgPSAmYW1lZGlhZm9ybWF0X2NsYXNzOworCisgICAgZW52ID0gZmZfam5pX2dldF9lbnYoZm9ybWF0KTsKKyAgICBpZiAoIWVudikgeworICAgICAgICBhdl9mcmVlcCgmZm9ybWF0KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGZmX2puaV9pbml0X2pmaWVsZHMoZW52LCAmZm9ybWF0LT5qZmllbGRzLCBqbmlfYW1lZGlhZm9ybWF0X21hcHBpbmcsIDEsIGZvcm1hdCkgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmb3JtYXQtPm9iamVjdCA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgb2JqZWN0KTsKKyAgICBpZiAoIWZvcm1hdC0+b2JqZWN0KSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gZm9ybWF0OworZmFpbDoKKyAgICBmZl9qbmlfcmVzZXRfamZpZWxkcyhlbnYsICZmb3JtYXQtPmpmaWVsZHMsIGpuaV9hbWVkaWFmb3JtYXRfbWFwcGluZywgMSwgZm9ybWF0KTsKKworICAgIGF2X2ZyZWVwKCZmb3JtYXQpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBmZl9BTWVkaWFGb3JtYXRfZGVsZXRlKEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisKKyAgICBpZiAoIWZvcm1hdCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBmb3JtYXQsIEFWRVJST1JfRVhURVJOQUwpOworCisgICAgKCplbnYpLT5EZWxldGVHbG9iYWxSZWYoZW52LCBmb3JtYXQtPm9iamVjdCk7CisgICAgZm9ybWF0LT5vYmplY3QgPSBOVUxMOworCisgICAgZmZfam5pX3Jlc2V0X2pmaWVsZHMoZW52LCAmZm9ybWF0LT5qZmllbGRzLCBqbmlfYW1lZGlhZm9ybWF0X21hcHBpbmcsIDEsIGZvcm1hdCk7CisKKyAgICBhdl9mcmVlcCgmZm9ybWF0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2NoYXIqIGZmX0FNZWRpYUZvcm1hdF90b1N0cmluZyhGRkFNZWRpYUZvcm1hdCogZm9ybWF0KQoreworICAgIGNoYXIgKnJldCA9IE5VTEw7CisKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisgICAganN0cmluZyBkZXNjcmlwdGlvbiA9IE5VTEw7CisKKyAgICBhdl9hc3NlcnQwKGZvcm1hdCAhPSBOVUxMKTsKKworICAgIEpOSV9HRVRfRU5WX09SX1JFVFVSTihlbnYsIGZvcm1hdCwgTlVMTCk7CisKKyAgICBkZXNjcmlwdGlvbiA9ICgqZW52KS0+Q2FsbE9iamVjdE1ldGhvZChlbnYsIGZvcm1hdC0+b2JqZWN0LCBmb3JtYXQtPmpmaWVsZHMudG9fc3RyaW5nX2lkKTsKKyAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIE5VTEwpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gZmZfam5pX2pzdHJpbmdfdG9fdXRmX2NoYXJzKGVudiwgZGVzY3JpcHRpb24sIGZvcm1hdCk7CitmYWlsOgorICAgIGlmIChkZXNjcmlwdGlvbikgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9BTWVkaWFGb3JtYXRfZ2V0SW50MzIoRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqb3V0KQoreworICAgIGludCByZXQgPSAxOworCisgICAgSk5JRW52ICplbnYgPSBOVUxMOworICAgIGpzdHJpbmcga2V5ID0gTlVMTDsKKyAgICBqYm9vbGVhbiBjb250YWluc19rZXk7CisKKyAgICBhdl9hc3NlcnQwKGZvcm1hdCAhPSBOVUxMKTsKKworICAgIEpOSV9HRVRfRU5WX09SX1JFVFVSTihlbnYsIGZvcm1hdCwgMCk7CisKKyAgICBrZXkgPSBmZl9qbmlfdXRmX2NoYXJzX3RvX2pzdHJpbmcoZW52LCBuYW1lLCBmb3JtYXQpOworICAgIGlmICgha2V5KSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjb250YWluc19rZXkgPSAoKmVudiktPkNhbGxCb29sZWFuTWV0aG9kKGVudiwgZm9ybWF0LT5vYmplY3QsIGZvcm1hdC0+amZpZWxkcy5jb250YWluc19rZXlfaWQsIGtleSk7CisgICAgaWYgKCFjb250YWluc19rZXkgfHwgKHJldCA9IGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBmb3JtYXQpKSA8IDApIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgICpvdXQgPSAoKmVudiktPkNhbGxJbnRNZXRob2QoZW52LCBmb3JtYXQtPm9iamVjdCwgZm9ybWF0LT5qZmllbGRzLmdldF9pbnRlZ2VyX2lkLCBrZXkpOworICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGZvcm1hdCkpIDwgMCkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gMTsKK2ZhaWw6CisgICAgaWYgKGtleSkgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwga2V5KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfQU1lZGlhRm9ybWF0X2dldEludDY0KEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCkKK3sKKyAgICBpbnQgcmV0ID0gMTsKKworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKyAgICBqc3RyaW5nIGtleSA9IE5VTEw7CisgICAgamJvb2xlYW4gY29udGFpbnNfa2V5OworCisgICAgYXZfYXNzZXJ0MChmb3JtYXQgIT0gTlVMTCk7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBmb3JtYXQsIDApOworCisgICAga2V5ID0gZmZfam5pX3V0Zl9jaGFyc190b19qc3RyaW5nKGVudiwgbmFtZSwgZm9ybWF0KTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY29udGFpbnNfa2V5ID0gKCplbnYpLT5DYWxsQm9vbGVhbk1ldGhvZChlbnYsIGZvcm1hdC0+b2JqZWN0LCBmb3JtYXQtPmpmaWVsZHMuY29udGFpbnNfa2V5X2lkLCBrZXkpOworICAgIGlmICghY29udGFpbnNfa2V5IHx8IChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgZm9ybWF0KSkgPCAwKSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAqb3V0ID0gKCplbnYpLT5DYWxsTG9uZ01ldGhvZChlbnYsIGZvcm1hdC0+b2JqZWN0LCBmb3JtYXQtPmpmaWVsZHMuZ2V0X2xvbmdfaWQsIGtleSk7CisgICAgaWYgKChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgZm9ybWF0KSkgPCAwKSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSAxOworZmFpbDoKKyAgICBpZiAoa2V5KSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBrZXkpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9BTWVkaWFGb3JtYXRfZ2V0RmxvYXQoRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgKm91dCkKK3sKKyAgICBpbnQgcmV0ID0gMTsKKworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKyAgICBqc3RyaW5nIGtleSA9IE5VTEw7CisgICAgamJvb2xlYW4gY29udGFpbnNfa2V5OworCisgICAgYXZfYXNzZXJ0MChmb3JtYXQgIT0gTlVMTCk7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBmb3JtYXQsIDApOworCisgICAga2V5ID0gZmZfam5pX3V0Zl9jaGFyc190b19qc3RyaW5nKGVudiwgbmFtZSwgZm9ybWF0KTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY29udGFpbnNfa2V5ID0gKCplbnYpLT5DYWxsQm9vbGVhbk1ldGhvZChlbnYsIGZvcm1hdC0+b2JqZWN0LCBmb3JtYXQtPmpmaWVsZHMuY29udGFpbnNfa2V5X2lkLCBrZXkpOworICAgIGlmICghY29udGFpbnNfa2V5IHx8IChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgZm9ybWF0KSkgPCAwKSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAqb3V0ID0gKCplbnYpLT5DYWxsRmxvYXRNZXRob2QoZW52LCBmb3JtYXQtPm9iamVjdCwgZm9ybWF0LT5qZmllbGRzLmdldF9mbG9hdF9pZCwga2V5KTsKKyAgICBpZiAoKHJldCA9IGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBmb3JtYXQpKSA8IDApIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IDE7CitmYWlsOgorICAgIGlmIChrZXkpIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGtleSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX0FNZWRpYUZvcm1hdF9nZXRCdWZmZXIoRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqc2l6ZSkKK3sKKyAgICBpbnQgcmV0ID0gMTsKKworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKyAgICBqc3RyaW5nIGtleSA9IE5VTEw7CisgICAgamJvb2xlYW4gY29udGFpbnNfa2V5OworICAgIGpvYmplY3QgcmVzdWx0ID0gTlVMTDsKKworICAgIGF2X2Fzc2VydDAoZm9ybWF0ICE9IE5VTEwpOworCisgICAgSk5JX0dFVF9FTlZfT1JfUkVUVVJOKGVudiwgZm9ybWF0LCAwKTsKKworICAgIGtleSA9IGZmX2puaV91dGZfY2hhcnNfdG9fanN0cmluZyhlbnYsIG5hbWUsIGZvcm1hdCk7CisgICAgaWYgKCFrZXkpIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGNvbnRhaW5zX2tleSA9ICgqZW52KS0+Q2FsbEJvb2xlYW5NZXRob2QoZW52LCBmb3JtYXQtPm9iamVjdCwgZm9ybWF0LT5qZmllbGRzLmNvbnRhaW5zX2tleV9pZCwga2V5KTsKKyAgICBpZiAoIWNvbnRhaW5zX2tleSB8fCAocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGZvcm1hdCkpIDwgMCkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmVzdWx0ID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgZm9ybWF0LT5vYmplY3QsIGZvcm1hdC0+amZpZWxkcy5nZXRfYnl0ZWJ1ZmZlcl9pZCwga2V5KTsKKyAgICBpZiAoKHJldCA9IGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBmb3JtYXQpKSA8IDApIHsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgICpkYXRhID0gKCplbnYpLT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGVudiwgcmVzdWx0KTsKKyAgICAqc2l6ZSA9ICgqZW52KS0+R2V0RGlyZWN0QnVmZmVyQ2FwYWNpdHkoZW52LCByZXN1bHQpOworCisgICAgaWYgKCpkYXRhICYmICpzaXplKSB7CisgICAgICAgIHZvaWQgKnNyYyA9ICpkYXRhOworICAgICAgICAqZGF0YSA9IGF2X21hbGxvYygqc2l6ZSk7CisgICAgICAgIGlmICghKmRhdGEpIHsKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoKmRhdGEsIHNyYywgKnNpemUpOworICAgIH0KKworICAgIHJldCA9IDE7CitmYWlsOgorICAgIGlmIChrZXkpIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGtleSk7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfQU1lZGlhRm9ybWF0X2dldFN0cmluZyhGRkFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KQoreworICAgIGludCByZXQgPSAxOworCisgICAgSk5JRW52ICplbnYgPSBOVUxMOworICAgIGpzdHJpbmcga2V5ID0gTlVMTDsKKyAgICBqYm9vbGVhbiBjb250YWluc19rZXk7CisgICAganN0cmluZyByZXN1bHQgPSBOVUxMOworCisgICAgYXZfYXNzZXJ0MChmb3JtYXQgIT0gTlVMTCk7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBmb3JtYXQsIDApOworCisgICAga2V5ID0gZmZfam5pX3V0Zl9jaGFyc190b19qc3RyaW5nKGVudiwgbmFtZSwgZm9ybWF0KTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY29udGFpbnNfa2V5ID0gKCplbnYpLT5DYWxsQm9vbGVhbk1ldGhvZChlbnYsIGZvcm1hdC0+b2JqZWN0LCBmb3JtYXQtPmpmaWVsZHMuY29udGFpbnNfa2V5X2lkLCBrZXkpOworICAgIGlmICghY29udGFpbnNfa2V5IHx8IChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgZm9ybWF0KSkgPCAwKSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXN1bHQgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBmb3JtYXQtPm9iamVjdCwgZm9ybWF0LT5qZmllbGRzLmdldF9zdHJpbmdfaWQsIGtleSk7CisgICAgaWYgKChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgZm9ybWF0KSkgPCAwKSB7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAqb3V0ID0gZmZfam5pX2pzdHJpbmdfdG9fdXRmX2NoYXJzKGVudiwgcmVzdWx0LCBmb3JtYXQpOworICAgIGlmICghKm91dCkgeworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gMTsKK2ZhaWw6CisgICAgaWYgKGtleSkgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwga2V5KTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCByZXN1bHQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmZfQU1lZGlhRm9ybWF0X3NldEludDMyKEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgdmFsdWUpCit7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworICAgIGpzdHJpbmcga2V5ID0gTlVMTDsKKworICAgIGF2X2Fzc2VydDAoZm9ybWF0ICE9IE5VTEwpOworCisgICAgSk5JX0dFVF9FTlZfT1JfUkVUVVJOX1ZPSUQoZW52LCBmb3JtYXQpOworCisgICAga2V5ID0gZmZfam5pX3V0Zl9jaGFyc190b19qc3RyaW5nKGVudiwgbmFtZSwgZm9ybWF0KTsKKyAgICBpZiAoIWtleSkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgKCplbnYpLT5DYWxsVm9pZE1ldGhvZChlbnYsIGZvcm1hdC0+b2JqZWN0LCBmb3JtYXQtPmpmaWVsZHMuc2V0X2ludGVnZXJfaWQsIGtleSwgdmFsdWUpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgZm9ybWF0KSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICBpZiAoa2V5KSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBrZXkpOworICAgIH0KK30KKwordm9pZCBmZl9BTWVkaWFGb3JtYXRfc2V0SW50NjQoRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisgICAganN0cmluZyBrZXkgPSBOVUxMOworCisgICAgYXZfYXNzZXJ0MChmb3JtYXQgIT0gTlVMTCk7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk5fVk9JRChlbnYsIGZvcm1hdCk7CisKKyAgICBrZXkgPSBmZl9qbmlfdXRmX2NoYXJzX3RvX2pzdHJpbmcoZW52LCBuYW1lLCBmb3JtYXQpOworICAgIGlmICgha2V5KSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgZm9ybWF0LT5vYmplY3QsIGZvcm1hdC0+amZpZWxkcy5zZXRfbG9uZ19pZCwga2V5LCB2YWx1ZSk7CisgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBmb3JtYXQpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIGlmIChrZXkpIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGtleSk7CisgICAgfQorfQorCit2b2lkIGZmX0FNZWRpYUZvcm1hdF9zZXRGbG9hdChGRkFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkKK3sKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisgICAganN0cmluZyBrZXkgPSBOVUxMOworCisgICAgYXZfYXNzZXJ0MChmb3JtYXQgIT0gTlVMTCk7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk5fVk9JRChlbnYsIGZvcm1hdCk7CisKKyAgICBrZXkgPSBmZl9qbmlfdXRmX2NoYXJzX3RvX2pzdHJpbmcoZW52LCBuYW1lLCBmb3JtYXQpOworICAgIGlmICgha2V5KSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgZm9ybWF0LT5vYmplY3QsIGZvcm1hdC0+amZpZWxkcy5zZXRfZmxvYXRfaWQsIGtleSwgdmFsdWUpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgZm9ybWF0KSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICBpZiAoa2V5KSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBrZXkpOworICAgIH0KK30KKwordm9pZCBmZl9BTWVkaWFGb3JtYXRfc2V0U3RyaW5nKEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKQoreworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKyAgICBqc3RyaW5nIGtleSA9IE5VTEw7CisgICAganN0cmluZyBzdHJpbmcgPSBOVUxMOworCisgICAgYXZfYXNzZXJ0MChmb3JtYXQgIT0gTlVMTCk7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk5fVk9JRChlbnYsIGZvcm1hdCk7CisKKyAgICBrZXkgPSBmZl9qbmlfdXRmX2NoYXJzX3RvX2pzdHJpbmcoZW52LCBuYW1lLCBmb3JtYXQpOworICAgIGlmICgha2V5KSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzdHJpbmcgPSBmZl9qbmlfdXRmX2NoYXJzX3RvX2pzdHJpbmcoZW52LCB2YWx1ZSwgZm9ybWF0KTsKKyAgICBpZiAoIXN0cmluZykgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgKCplbnYpLT5DYWxsVm9pZE1ldGhvZChlbnYsIGZvcm1hdC0+b2JqZWN0LCBmb3JtYXQtPmpmaWVsZHMuc2V0X3N0cmluZ19pZCwga2V5LCBzdHJpbmcpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgZm9ybWF0KSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICBpZiAoa2V5KSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBrZXkpOworICAgIH0KKworICAgIGlmIChzdHJpbmcpIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIHN0cmluZyk7CisgICAgfQorfQorCit2b2lkIGZmX0FNZWRpYUZvcm1hdF9zZXRCdWZmZXIoRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworICAgIGpzdHJpbmcga2V5ID0gTlVMTDsKKyAgICBqb2JqZWN0IGJ1ZmZlciA9IE5VTEw7CisgICAgdm9pZCAqYnVmZmVyX2RhdGEgPSBOVUxMOworCisgICAgYXZfYXNzZXJ0MChmb3JtYXQgIT0gTlVMTCk7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk5fVk9JRChlbnYsIGZvcm1hdCk7CisKKyAgICBrZXkgPSBmZl9qbmlfdXRmX2NoYXJzX3RvX2pzdHJpbmcoZW52LCBuYW1lLCBmb3JtYXQpOworICAgIGlmICgha2V5KSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIWRhdGEgfHwgIXNpemUpIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGJ1ZmZlcl9kYXRhID0gYXZfbWFsbG9jKHNpemUpOworICAgIGlmICghYnVmZmVyX2RhdGEpIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG1lbWNweShidWZmZXJfZGF0YSwgZGF0YSwgc2l6ZSk7CisKKyAgICBidWZmZXIgPSAoKmVudiktPk5ld0RpcmVjdEJ5dGVCdWZmZXIoZW52LCBidWZmZXJfZGF0YSwgc2l6ZSk7CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgICgqZW52KS0+Q2FsbFZvaWRNZXRob2QoZW52LCBmb3JtYXQtPm9iamVjdCwgZm9ybWF0LT5qZmllbGRzLnNldF9ieXRlYnVmZmVyX2lkLCBrZXksIGJ1ZmZlcik7CisgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBmb3JtYXQpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIGlmIChrZXkpIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGtleSk7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29kZWNfaW5pdF9zdGF0aWNfZmllbGRzKEZGQU1lZGlhQ29kZWMgKmNvZGVjKQoreworICAgIGludCByZXQgPSAwOworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKworICAgIEpOSV9HRVRfRU5WX09SX1JFVFVSTihlbnYsIGNvZGVjLCBBVkVSUk9SX0VYVEVSTkFMKTsKKworICAgIGNvZGVjLT5JTkZPX1RSWV9BR0FJTl9MQVRFUiA9ICgqZW52KS0+R2V0U3RhdGljSW50RmllbGQoZW52LCBjb2RlYy0+amZpZWxkcy5tZWRpYWNvZGVjX2NsYXNzLCBjb2RlYy0+amZpZWxkcy5pbmZvX3RyeV9hZ2Fpbl9sYXRlcl9pZCk7CisgICAgaWYgKChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGNvZGVjLT5CVUZGRVJfRkxBR19DT0RFQ19DT05GSUcgPSAoKmVudiktPkdldFN0YXRpY0ludEZpZWxkKGVudiwgY29kZWMtPmpmaWVsZHMubWVkaWFjb2RlY19jbGFzcywgY29kZWMtPmpmaWVsZHMuYnVmZmVyX2ZsYWdfY29kZWNfY29uZmlnX2lkKTsKKyAgICBpZiAoKHJldCA9IGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY29kZWMtPkJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0gPSAoKmVudiktPkdldFN0YXRpY0ludEZpZWxkKGVudiwgY29kZWMtPmpmaWVsZHMubWVkaWFjb2RlY19jbGFzcywgY29kZWMtPmpmaWVsZHMuYnVmZmVyX2ZsYWdfZW5kX29mX3N0cmVhbV9pZCk7CisgICAgaWYgKChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChjb2RlYy0+amZpZWxkcy5idWZmZXJfZmxhZ19rZXlfZnJhbWVfaWQpIHsKKyAgICAgICAgY29kZWMtPkJVRkZFUl9GTEFHX0tFWV9GUkFNRSA9ICgqZW52KS0+R2V0U3RhdGljSW50RmllbGQoZW52LCBjb2RlYy0+amZpZWxkcy5tZWRpYWNvZGVjX2NsYXNzLCBjb2RlYy0+amZpZWxkcy5idWZmZXJfZmxhZ19rZXlfZnJhbWVfaWQpOworICAgICAgICBpZiAoKHJldCA9IGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykpIDwgMCkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgY29kZWMtPkNPTkZJR1VSRV9GTEFHX0VOQ09ERSA9ICgqZW52KS0+R2V0U3RhdGljSW50RmllbGQoZW52LCBjb2RlYy0+amZpZWxkcy5tZWRpYWNvZGVjX2NsYXNzLCBjb2RlYy0+amZpZWxkcy5jb25maWd1cmVfZmxhZ19lbmNvZGVfaWQpOworICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSkgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjb2RlYy0+SU5GT19UUllfQUdBSU5fTEFURVIgPSAoKmVudiktPkdldFN0YXRpY0ludEZpZWxkKGVudiwgY29kZWMtPmpmaWVsZHMubWVkaWFjb2RlY19jbGFzcywgY29kZWMtPmpmaWVsZHMuaW5mb190cnlfYWdhaW5fbGF0ZXJfaWQpOworICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSkgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjb2RlYy0+SU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEID0gKCplbnYpLT5HZXRTdGF0aWNJbnRGaWVsZChlbnYsIGNvZGVjLT5qZmllbGRzLm1lZGlhY29kZWNfY2xhc3MsIGNvZGVjLT5qZmllbGRzLmluZm9fb3V0cHV0X2J1ZmZlcnNfY2hhbmdlZF9pZCk7CisgICAgaWYgKChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGNvZGVjLT5JTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRCA9ICgqZW52KS0+R2V0U3RhdGljSW50RmllbGQoZW52LCBjb2RlYy0+amZpZWxkcy5tZWRpYWNvZGVjX2NsYXNzLCBjb2RlYy0+amZpZWxkcy5pbmZvX291dHB1dF9mb3JtYXRfY2hhbmdlZF9pZCk7CisgICAgaWYgKChyZXQgPSBmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgQ1JFQVRFX0NPREVDX0JZX05BTUUgICAwCisjZGVmaW5lIENSRUFURV9ERUNPREVSX0JZX1RZUEUgMQorI2RlZmluZSBDUkVBVEVfRU5DT0RFUl9CWV9UWVBFIDIKKworc3RhdGljIGlubGluZSBGRkFNZWRpYUNvZGVjICpjb2RlY19jcmVhdGUoaW50IG1ldGhvZCwgY29uc3QgY2hhciAqYXJnKQoreworICAgIGludCByZXQgPSAtMTsKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisgICAgRkZBTWVkaWFDb2RlYyAqY29kZWMgPSBOVUxMOworICAgIGpzdHJpbmcgamFyZyA9IE5VTEw7CisgICAgam9iamVjdCBvYmplY3QgPSBOVUxMOworICAgIGpvYmplY3QgYnVmZmVyX2luZm8gPSBOVUxMOworICAgIGptZXRob2RJRCBjcmVhdGVfaWQgPSBOVUxMOworCisgICAgY29kZWMgPSBhdl9tYWxsb2N6KHNpemVvZihGRkFNZWRpYUNvZGVjKSk7CisgICAgaWYgKCFjb2RlYykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY29kZWMtPmNsYXNzID0gJmFtZWRpYWNvZGVjX2NsYXNzOworCisgICAgZW52ID0gZmZfam5pX2dldF9lbnYoY29kZWMpOworICAgIGlmICghZW52KSB7CisgICAgICAgIGF2X2ZyZWVwKCZjb2RlYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChmZl9qbmlfaW5pdF9qZmllbGRzKGVudiwgJmNvZGVjLT5qZmllbGRzLCBqbmlfYW1lZGlhY29kZWNfbWFwcGluZywgMSwgY29kZWMpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgamFyZyA9IGZmX2puaV91dGZfY2hhcnNfdG9fanN0cmluZyhlbnYsIGFyZywgY29kZWMpOworICAgIGlmICghamFyZykgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgc3dpdGNoIChtZXRob2QpIHsKKyAgICBjYXNlIENSRUFURV9DT0RFQ19CWV9OQU1FOiAgIGNyZWF0ZV9pZCA9IGNvZGVjLT5qZmllbGRzLmNyZWF0ZV9ieV9jb2RlY19uYW1lX2lkOyAgIGJyZWFrOworICAgIGNhc2UgQ1JFQVRFX0RFQ09ERVJfQllfVFlQRTogY3JlYXRlX2lkID0gY29kZWMtPmpmaWVsZHMuY3JlYXRlX2RlY29kZXJfYnlfdHlwZV9pZDsgYnJlYWs7CisgICAgY2FzZSBDUkVBVEVfRU5DT0RFUl9CWV9UWVBFOiBjcmVhdGVfaWQgPSBjb2RlYy0+amZpZWxkcy5jcmVhdGVfZW5jb2Rlcl9ieV90eXBlX2lkOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIG9iamVjdCA9ICgqZW52KS0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChlbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5qZmllbGRzLm1lZGlhY29kZWNfY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFyZyk7CisgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjb2RlYy0+b2JqZWN0ID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBvYmplY3QpOworICAgIGlmICghY29kZWMtPm9iamVjdCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGNvZGVjX2luaXRfc3RhdGljX2ZpZWxkcyhjb2RlYykgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoY29kZWMtPmpmaWVsZHMuZ2V0X2lucHV0X2J1ZmZlcl9pZCAmJiBjb2RlYy0+amZpZWxkcy5nZXRfb3V0cHV0X2J1ZmZlcl9pZCkgeworICAgICAgICBjb2RlYy0+aGFzX2dldF9pX29fYnVmZmVyID0gMTsKKyAgICB9CisKKyAgICBidWZmZXJfaW5mbyA9ICgqZW52KS0+TmV3T2JqZWN0KGVudiwgY29kZWMtPmpmaWVsZHMubWVkaWFpbmZvX2NsYXNzLCBjb2RlYy0+amZpZWxkcy5pbml0X2lkKTsKKyAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGNvZGVjLT5idWZmZXJfaW5mbyA9ICgqZW52KS0+TmV3R2xvYmFsUmVmKGVudiwgYnVmZmVyX2luZm8pOworICAgIGlmICghY29kZWMtPmJ1ZmZlcl9pbmZvKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSAwOworZmFpbDoKKyAgICBpZiAoamFyZykgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgamFyZyk7CisgICAgfQorCisgICAgaWYgKG9iamVjdCkgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgb2JqZWN0KTsKKyAgICB9CisKKyAgICBpZiAoYnVmZmVyX2luZm8pIHsKKyAgICAgICAgKCplbnYpLT5EZWxldGVMb2NhbFJlZihlbnYsIGJ1ZmZlcl9pbmZvKTsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoY29kZWMtPm9iamVjdCkgeworICAgICAgICAgICAgKCplbnYpLT5EZWxldGVHbG9iYWxSZWYoZW52LCBjb2RlYy0+b2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2RlYy0+YnVmZmVyX2luZm8pIHsKKyAgICAgICAgICAgICgqZW52KS0+RGVsZXRlR2xvYmFsUmVmKGVudiwgY29kZWMtPmJ1ZmZlcl9pbmZvKTsKKyAgICAgICAgfQorCisgICAgICAgIGZmX2puaV9yZXNldF9qZmllbGRzKGVudiwgJmNvZGVjLT5qZmllbGRzLCBqbmlfYW1lZGlhY29kZWNfbWFwcGluZywgMSwgY29kZWMpOworICAgICAgICBhdl9mcmVlcCgmY29kZWMpOworICAgIH0KKworICAgIHJldHVybiBjb2RlYzsKK30KKworI2RlZmluZSBERUNMQVJFX0ZGX0FNRURJQUNPREVDX0NSRUFURV9GVU5DKG5hbWUsIG1ldGhvZCkgXAorRkZBTWVkaWFDb2RlYyAqZmZfQU1lZGlhQ29kZWNfIyNuYW1lKGNvbnN0IGNoYXIgKmFyZykgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBjb2RlY19jcmVhdGUobWV0aG9kLCBhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitERUNMQVJFX0ZGX0FNRURJQUNPREVDX0NSRUFURV9GVU5DKGNyZWF0ZUNvZGVjQnlOYW1lLCAgIENSRUFURV9DT0RFQ19CWV9OQU1FKQorREVDTEFSRV9GRl9BTUVESUFDT0RFQ19DUkVBVEVfRlVOQyhjcmVhdGVEZWNvZGVyQnlUeXBlLCBDUkVBVEVfREVDT0RFUl9CWV9UWVBFKQorREVDTEFSRV9GRl9BTUVESUFDT0RFQ19DUkVBVEVfRlVOQyhjcmVhdGVFbmNvZGVyQnlUeXBlLCBDUkVBVEVfRU5DT0RFUl9CWV9UWVBFKQorCitpbnQgZmZfQU1lZGlhQ29kZWNfZGVsZXRlKEZGQU1lZGlhQ29kZWMqIGNvZGVjKQoreworICAgIGludCByZXQgPSAwOworCisgICAgSk5JRW52ICplbnYgPSBOVUxMOworCisgICAgaWYgKCFjb2RlYykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBjb2RlYywgQVZFUlJPUl9FWFRFUk5BTCk7CisKKyAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgY29kZWMtPm9iamVjdCwgY29kZWMtPmpmaWVsZHMucmVsZWFzZV9pZCk7CisgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykgPCAwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgKCplbnYpLT5EZWxldGVHbG9iYWxSZWYoZW52LCBjb2RlYy0+b2JqZWN0KTsKKyAgICBjb2RlYy0+b2JqZWN0ID0gTlVMTDsKKworICAgICgqZW52KS0+RGVsZXRlR2xvYmFsUmVmKGVudiwgY29kZWMtPmJ1ZmZlcl9pbmZvKTsKKyAgICBjb2RlYy0+YnVmZmVyX2luZm8gPSBOVUxMOworCisgICAgZmZfam5pX3Jlc2V0X2pmaWVsZHMoZW52LCAmY29kZWMtPmpmaWVsZHMsIGpuaV9hbWVkaWFjb2RlY19tYXBwaW5nLCAxLCBjb2RlYyk7CisKKyAgICBhdl9mcmVlcCgmY29kZWMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworY2hhciAqZmZfQU1lZGlhQ29kZWNfZ2V0TmFtZShGRkFNZWRpYUNvZGVjICpjb2RlYykKK3sKKyAgICBjaGFyICpyZXQgPSBOVUxMOworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKyAgICBqb2JqZWN0ICpuYW1lID0gTlVMTDsKKworICAgIEpOSV9HRVRfRU5WX09SX1JFVFVSTihlbnYsIGNvZGVjLCBOVUxMKTsKKworICAgIG5hbWUgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBjb2RlYy0+b2JqZWN0LCBjb2RlYy0+amZpZWxkcy5nZXRfbmFtZV9pZCk7CisgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBmZl9qbmlfanN0cmluZ190b191dGZfY2hhcnMoZW52LCBuYW1lLCBjb2RlYyk7CisKK2ZhaWw6CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX0FNZWRpYUNvZGVjX2NvbmZpZ3VyZShGRkFNZWRpYUNvZGVjKiBjb2RlYywgY29uc3QgRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgdm9pZCogc3VyZmFjZSwgdm9pZCAqY3J5cHRvLCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBjb2RlYywgQVZFUlJPUl9FWFRFUk5BTCk7CisKKyAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgY29kZWMtPm9iamVjdCwgY29kZWMtPmpmaWVsZHMuY29uZmlndXJlX2lkLCBmb3JtYXQtPm9iamVjdCwgc3VyZmFjZSwgTlVMTCwgZmxhZ3MpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9BTWVkaWFDb2RlY19zdGFydChGRkFNZWRpYUNvZGVjKiBjb2RlYykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBjb2RlYywgQVZFUlJPUl9FWFRFUk5BTCk7CisKKyAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgY29kZWMtPm9iamVjdCwgY29kZWMtPmpmaWVsZHMuc3RhcnRfaWQpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9BTWVkaWFDb2RlY19zdG9wKEZGQU1lZGlhQ29kZWMqIGNvZGVjKQoreworICAgIGludCByZXQgPSAwOworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKworICAgIEpOSV9HRVRfRU5WX09SX1JFVFVSTihlbnYsIGNvZGVjLCBBVkVSUk9SX0VYVEVSTkFMKTsKKworICAgICgqZW52KS0+Q2FsbFZvaWRNZXRob2QoZW52LCBjb2RlYy0+b2JqZWN0LCBjb2RlYy0+amZpZWxkcy5zdG9wX2lkKTsKKyAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSA8IDApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfQU1lZGlhQ29kZWNfZmx1c2goRkZBTWVkaWFDb2RlYyogY29kZWMpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworCisgICAgSk5JX0dFVF9FTlZfT1JfUkVUVVJOKGVudiwgY29kZWMsIEFWRVJST1JfRVhURVJOQUwpOworCisgICAgKCplbnYpLT5DYWxsVm9pZE1ldGhvZChlbnYsIGNvZGVjLT5vYmplY3QsIGNvZGVjLT5qZmllbGRzLmZsdXNoX2lkKTsKKyAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSA8IDApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihGRkFNZWRpYUNvZGVjKiBjb2RlYywgc2l6ZV90IGlkeCwgaW50IHJlbmRlcikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBjb2RlYywgQVZFUlJPUl9FWFRFUk5BTCk7CisKKyAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgY29kZWMtPm9iamVjdCwgY29kZWMtPmpmaWVsZHMucmVsZWFzZV9vdXRwdXRfYnVmZmVyX2lkLCAoamludClpZHgsIChqYm9vbGVhbilyZW5kZXIpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9BTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lKEZGQU1lZGlhQ29kZWMgKmNvZGVjLCBzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKQoreworICAgIGludCByZXQgPSAwOworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKworICAgIEpOSV9HRVRfRU5WX09SX1JFVFVSTihlbnYsIGNvZGVjLCBBVkVSUk9SX0VYVEVSTkFMKTsKKworICAgICgqZW52KS0+Q2FsbFZvaWRNZXRob2QoZW52LCBjb2RlYy0+b2JqZWN0LCBjb2RlYy0+amZpZWxkcy5yZWxlYXNlX291dHB1dF9idWZmZXJfYXRfdGltZV9pZCwgKGppbnQpaWR4LCB0aW1lc3RhbXBOcyk7CisgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykgPCAwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKK2ZhaWw6CisgICAgcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBmZl9BTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIoRkZBTWVkaWFDb2RlYyogY29kZWMsIGludDY0X3QgdGltZW91dFVzKQoreworICAgIGludCByZXQgPSAwOworICAgIEpOSUVudiAqZW52ID0gTlVMTDsKKworICAgIEpOSV9HRVRfRU5WX09SX1JFVFVSTihlbnYsIGNvZGVjLCBBVkVSUk9SX0VYVEVSTkFMKTsKKworICAgIHJldCA9ICgqZW52KS0+Q2FsbEludE1ldGhvZChlbnYsIGNvZGVjLT5vYmplY3QsIGNvZGVjLT5qZmllbGRzLmRlcXVldWVfaW5wdXRfYnVmZmVyX2lkLCB0aW1lb3V0VXMpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9BTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKEZGQU1lZGlhQ29kZWMqIGNvZGVjLCBzaXplX3QgaWR4LCBvZmZfdCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBKTklFbnYgKmVudiA9IE5VTEw7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBjb2RlYywgQVZFUlJPUl9FWFRFUk5BTCk7CisKKyAgICAoKmVudiktPkNhbGxWb2lkTWV0aG9kKGVudiwgY29kZWMtPm9iamVjdCwgY29kZWMtPmpmaWVsZHMucXVldWVfaW5wdXRfYnVmZmVyX2lkLCAoamludClpZHgsIChqaW50KW9mZnNldCwgKGppbnQpc2l6ZSwgdGltZSwgZmxhZ3MpOworICAgIGlmICgocmV0ID0gZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSkgPCAwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKK2ZhaWw6CisgICAgcmV0dXJuIHJldDsKK30KKworc3NpemVfdCBmZl9BTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKEZGQU1lZGlhQ29kZWMqIGNvZGVjLCBGRkFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbywgaW50NjRfdCB0aW1lb3V0VXMpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworCisgICAgSk5JX0dFVF9FTlZfT1JfUkVUVVJOKGVudiwgY29kZWMsIEFWRVJST1JfRVhURVJOQUwpOworCisgICAgcmV0ID0gKCplbnYpLT5DYWxsSW50TWV0aG9kKGVudiwgY29kZWMtPm9iamVjdCwgY29kZWMtPmpmaWVsZHMuZGVxdWV1ZV9vdXRwdXRfYnVmZmVyX2lkLCBjb2RlYy0+YnVmZmVyX2luZm8sIHRpbWVvdXRVcyk7CisgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykgPCAwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGluZm8tPmZsYWdzID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGNvZGVjLT5idWZmZXJfaW5mbywgY29kZWMtPmpmaWVsZHMuZmxhZ3NfaWQpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBpbmZvLT5vZmZzZXQgPSAoKmVudiktPkdldEludEZpZWxkKGVudiwgY29kZWMtPmJ1ZmZlcl9pbmZvLCBjb2RlYy0+amZpZWxkcy5vZmZzZXRfaWQpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBpbmZvLT5wcmVzZW50YXRpb25UaW1lVXMgPSAoKmVudiktPkdldExvbmdGaWVsZChlbnYsIGNvZGVjLT5idWZmZXJfaW5mbywgY29kZWMtPmpmaWVsZHMucHJlc2VudGF0aW9uX3RpbWVfdXNfaWQpOworICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBpbmZvLT5zaXplID0gKCplbnYpLT5HZXRJbnRGaWVsZChlbnYsIGNvZGVjLT5idWZmZXJfaW5mbywgY29kZWMtPmpmaWVsZHMuc2l6ZV9pZCk7CisgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykgPCAwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3VpbnQ4X3QqIGZmX0FNZWRpYUNvZGVjX2dldElucHV0QnVmZmVyKEZGQU1lZGlhQ29kZWMqIGNvZGVjLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKQoreworICAgIHVpbnQ4X3QgKnJldCA9IE5VTEw7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworCisgICAgam9iamVjdCBidWZmZXIgPSBOVUxMOworICAgIGpvYmplY3QgaW5wdXRfYnVmZmVycyA9IE5VTEw7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBjb2RlYywgTlVMTCk7CisKKyAgICBpZiAoY29kZWMtPmhhc19nZXRfaV9vX2J1ZmZlcikgeworICAgICAgICBidWZmZXIgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBjb2RlYy0+b2JqZWN0LCBjb2RlYy0+amZpZWxkcy5nZXRfaW5wdXRfYnVmZmVyX2lkLCAoamludClpZHgpOworICAgICAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghY29kZWMtPmlucHV0X2J1ZmZlcnMpIHsKKyAgICAgICAgICAgIGlucHV0X2J1ZmZlcnMgPSAoKmVudiktPkNhbGxPYmplY3RNZXRob2QoZW52LCBjb2RlYy0+b2JqZWN0LCBjb2RlYy0+amZpZWxkcy5nZXRfaW5wdXRfYnVmZmVyc19pZCk7CisgICAgICAgICAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSA8IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvZGVjLT5pbnB1dF9idWZmZXJzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBpbnB1dF9idWZmZXJzKTsKKyAgICAgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlciA9ICgqZW52KS0+R2V0T2JqZWN0QXJyYXlFbGVtZW50KGVudiwgY29kZWMtPmlucHV0X2J1ZmZlcnMsIGlkeCk7CisgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gKCplbnYpLT5HZXREaXJlY3RCdWZmZXJBZGRyZXNzKGVudiwgYnVmZmVyKTsKKyAgICAqb3V0X3NpemUgPSAoKmVudiktPkdldERpcmVjdEJ1ZmZlckNhcGFjaXR5KGVudiwgYnVmZmVyKTsKK2ZhaWw6CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgYnVmZmVyKTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRfYnVmZmVycykgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgaW5wdXRfYnVmZmVycyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordWludDhfdCogZmZfQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKEZGQU1lZGlhQ29kZWMqIGNvZGVjLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKQoreworICAgIHVpbnQ4X3QgKnJldCA9IE5VTEw7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworCisgICAgam9iamVjdCBidWZmZXIgPSBOVUxMOworICAgIGpvYmplY3Qgb3V0cHV0X2J1ZmZlcnMgPSBOVUxMOworCisgICAgSk5JX0dFVF9FTlZfT1JfUkVUVVJOKGVudiwgY29kZWMsIE5VTEwpOworCisgICAgaWYgKGNvZGVjLT5oYXNfZ2V0X2lfb19idWZmZXIpIHsKKyAgICAgICAgYnVmZmVyID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgY29kZWMtPm9iamVjdCwgY29kZWMtPmpmaWVsZHMuZ2V0X291dHB1dF9idWZmZXJfaWQsIChqaW50KWlkeCk7CisgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFjb2RlYy0+b3V0cHV0X2J1ZmZlcnMpIHsKKyAgICAgICAgICAgIG91dHB1dF9idWZmZXJzID0gKCplbnYpLT5DYWxsT2JqZWN0TWV0aG9kKGVudiwgY29kZWMtPm9iamVjdCwgY29kZWMtPmpmaWVsZHMuZ2V0X291dHB1dF9idWZmZXJzX2lkKTsKKyAgICAgICAgICAgIGlmIChmZl9qbmlfZXhjZXB0aW9uX2NoZWNrKGVudiwgMSwgY29kZWMpIDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29kZWMtPm91dHB1dF9idWZmZXJzID0gKCplbnYpLT5OZXdHbG9iYWxSZWYoZW52LCBvdXRwdXRfYnVmZmVycyk7CisgICAgICAgICAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSA8IDApIHsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIgPSAoKmVudiktPkdldE9iamVjdEFycmF5RWxlbWVudChlbnYsIGNvZGVjLT5vdXRwdXRfYnVmZmVycywgaWR4KTsKKyAgICAgICAgaWYgKGZmX2puaV9leGNlcHRpb25fY2hlY2soZW52LCAxLCBjb2RlYykgPCAwKSB7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSAoKmVudiktPkdldERpcmVjdEJ1ZmZlckFkZHJlc3MoZW52LCBidWZmZXIpOworICAgICpvdXRfc2l6ZSA9ICgqZW52KS0+R2V0RGlyZWN0QnVmZmVyQ2FwYWNpdHkoZW52LCBidWZmZXIpOworZmFpbDoKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBidWZmZXIpOworICAgIH0KKworICAgIGlmIChvdXRwdXRfYnVmZmVycykgeworICAgICAgICAoKmVudiktPkRlbGV0ZUxvY2FsUmVmKGVudiwgb3V0cHV0X2J1ZmZlcnMpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK0ZGQU1lZGlhRm9ybWF0KiBmZl9BTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQoRkZBTWVkaWFDb2RlYyogY29kZWMpCit7CisgICAgRkZBTWVkaWFGb3JtYXQgKnJldCA9IE5VTEw7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworCisgICAgam9iamVjdCBtZWRpYWZvcm1hdCA9IE5VTEw7CisKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBjb2RlYywgTlVMTCk7CisKKyAgICBtZWRpYWZvcm1hdCA9ICgqZW52KS0+Q2FsbE9iamVjdE1ldGhvZChlbnYsIGNvZGVjLT5vYmplY3QsIGNvZGVjLT5qZmllbGRzLmdldF9vdXRwdXRfZm9ybWF0X2lkKTsKKyAgICBpZiAoZmZfam5pX2V4Y2VwdGlvbl9jaGVjayhlbnYsIDEsIGNvZGVjKSA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IGZmX0FNZWRpYUZvcm1hdF9uZXdGcm9tT2JqZWN0KG1lZGlhZm9ybWF0KTsKK2ZhaWw6CisgICAgaWYgKG1lZGlhZm9ybWF0KSB7CisgICAgICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCBtZWRpYWZvcm1hdCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX0FNZWRpYUNvZGVjX2luZm9UcnlBZ2FpbkxhdGVyKEZGQU1lZGlhQ29kZWMgKmNvZGVjLCBzc2l6ZV90IGlkeCkKK3sKKyAgICByZXR1cm4gaWR4ID09IGNvZGVjLT5JTkZPX1RSWV9BR0FJTl9MQVRFUjsKK30KKworaW50IGZmX0FNZWRpYUNvZGVjX2luZm9PdXRwdXRCdWZmZXJzQ2hhbmdlZChGRkFNZWRpYUNvZGVjICpjb2RlYywgc3NpemVfdCBpZHgpCit7CisgICAgcmV0dXJuIGlkeCA9PSBjb2RlYy0+SU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOworfQorCitpbnQgZmZfQU1lZGlhQ29kZWNfaW5mb091dHB1dEZvcm1hdENoYW5nZWQoRkZBTWVkaWFDb2RlYyAqY29kZWMsIHNzaXplX3QgaWR4KQoreworICAgIHJldHVybiBpZHggPT0gY29kZWMtPklORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOworfQorCitpbnQgZmZfQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRmxhZ0NvZGVjQ29uZmlnKEZGQU1lZGlhQ29kZWMgKmNvZGVjKQoreworICAgIHJldHVybiBjb2RlYy0+QlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHOworfQorCitpbnQgZmZfQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRmxhZ0VuZE9mU3RyZWFtKEZGQU1lZGlhQ29kZWMgKmNvZGVjKQoreworICAgIHJldHVybiBjb2RlYy0+QlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKK30KKworaW50IGZmX0FNZWRpYUNvZGVjX2dldEJ1ZmZlckZsYWdLZXlGcmFtZShGRkFNZWRpYUNvZGVjICpjb2RlYykKK3sKKyAgICByZXR1cm4gY29kZWMtPkJVRkZFUl9GTEFHX0tFWV9GUkFNRTsKK30KKworaW50IGZmX0FNZWRpYUNvZGVjX2dldENvbmZpZ3VyZUZsYWdFbmNvZGUoRkZBTWVkaWFDb2RlYyAqY29kZWMpCit7CisgICAgcmV0dXJuIGNvZGVjLT5DT05GSUdVUkVfRkxBR19FTkNPREU7Cit9CisKK2ludCBmZl9BTWVkaWFDb2RlY19jbGVhbk91dHB1dEJ1ZmZlcnMoRkZBTWVkaWFDb2RlYyAqY29kZWMpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIWNvZGVjLT5oYXNfZ2V0X2lfb19idWZmZXIpIHsKKyAgICAgICAgaWYgKGNvZGVjLT5vdXRwdXRfYnVmZmVycykgeworICAgICAgICAgICAgSk5JRW52ICplbnYgPSBOVUxMOworCisgICAgICAgICAgICBlbnYgPSBmZl9qbmlfZ2V0X2Vudihjb2RlYyk7CisgICAgICAgICAgICBpZiAoIWVudikgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAoKmVudiktPkRlbGV0ZUdsb2JhbFJlZihlbnYsIGNvZGVjLT5vdXRwdXRfYnVmZmVycyk7CisgICAgICAgICAgICBjb2RlYy0+b3V0cHV0X2J1ZmZlcnMgPSBOVUxMOworICAgICAgICB9CisgICAgfQorCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9CdWlsZF9TREtfSU5UKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgSk5JRW52ICplbnYgPSBOVUxMOworICAgIGpjbGFzcyB2ZXJzaW9uQ2xhc3M7CisgICAgamZpZWxkSUQgc2RrSW50RmllbGRJRDsKKyAgICBKTklfR0VUX0VOVl9PUl9SRVRVUk4oZW52LCBhdmN0eCwgLTEpOworCisgICAgdmVyc2lvbkNsYXNzID0gKCplbnYpLT5GaW5kQ2xhc3MoZW52LCAiYW5kcm9pZC9vcy9CdWlsZCRWRVJTSU9OIik7CisgICAgc2RrSW50RmllbGRJRCA9ICgqZW52KS0+R2V0U3RhdGljRmllbGRJRChlbnYsIHZlcnNpb25DbGFzcywgIlNES19JTlQiLCAiSSIpOworICAgIHJldCA9ICgqZW52KS0+R2V0U3RhdGljSW50RmllbGQoZW52LCB2ZXJzaW9uQ2xhc3MsIHNka0ludEZpZWxkSUQpOworICAgICgqZW52KS0+RGVsZXRlTG9jYWxSZWYoZW52LCB2ZXJzaW9uQ2xhc3MpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21lZGlhY29kZWNfd3JhcHBlci5oIGIvbGliYXZjb2RlYy9tZWRpYWNvZGVjX3dyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlMTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9tZWRpYWNvZGVjX3dyYXBwZXIuaApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIEFuZHJvaWQgTWVkaWFDb2RlYyBXcmFwcGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTYgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb24gc3R1cGVmbGl4LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01FRElBQ09ERUNfV1JBUFBFUl9ICisjZGVmaW5lIEFWQ09ERUNfTUVESUFDT0RFQ19XUkFQUEVSX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKioKKyAqIFRoZSBmb2xsb3dpbmcgQVBJIGFyb3VuZCBNZWRpYUNvZGVjIGFuZCBNZWRpYUZvcm1hdCBpcyBiYXNlZCBvbiB0aGUKKyAqIE5ESyBvbmUgcHJvdmlkZWQgYnkgR29vZ2xlIHNpbmNlIEFuZHJvaWQgNS4wLgorICoKKyAqIERpZmZlcmVuY2VzIGZyb20gdGhlIE5ESyBBUEk6CisgKgorICogQnVmZmVycyByZXR1cm5lZCBieSBmZl9BTWVkaWFGb3JtYXRfdG9TdHJpbmcgYW5kIGZmX0FNZWRpYUZvcm1hdF9nZXRTdHJpbmcKKyAqIGFyZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIGFuZCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSB1c2VyIGFmdGVyIHVzZS4KKyAqCisgKiBUaGUgTWVkaWFDcnlwdG8gQVBJIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAqCisgKiBmZl9BTWVkaWFDb2RlY19pbmZvVHJ5QWdhaW5MYXRlciwgZmZfQU1lZGlhQ29kZWNfaW5mb091dHB1dEJ1ZmZlcnNDaGFuZ2VkLAorICogZmZfQU1lZGlhQ29kZWNfaW5mb091dHB1dEZvcm1hdENoYW5nZWQsIGZmX0FNZWRpYUNvZGVjX2NsZWFuT3V0cHV0QnVmZmVycworICogZmZfQU1lZGlhQ29kZWNfZ2V0TmFtZSBhbmQgZmZfQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRmxhZ0VuZE9mU3RyZWFtIGFyZSBub3QKKyAqIHBhcnQgb2YgdGhlIG9yaWdpbmFsIE5ESyBBUEkgYW5kIGFyZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gaGlkZSBKTkkKKyAqIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFRoZSBBUEkgYXJvdW5kIE1lZGlhQ29kZWNMaXN0IGlzIG5vdCBwYXJ0IG9mIHRoZSBOREsgKGFuZCBpcyBsYWNraW5nIGFzCisgKiB3ZSBzdGlsbCBuZWVkIHRvIHJldHJpZXZlIHRoZSBjb2RlYyBuYW1lIHRvIHdvcmsgYXJvdW5kIGZhdWx0eSBkZWNvZGVycworICogYW5kIGVuY29kZXJzKS4KKyAqCisgKiBGb3IgZG9jdW1lbnRhdGlvbiwgcGxlYXNlIHJlZmVycyB0byBOZGtNZWRpYUNvZGVjLmggTmRrTWVkaWFGb3JtYXQuaCBhbmQKKyAqIGh0dHA6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvTWVkaWFDb2RlYy5odG1sLgorICoKKyAqLworCitpbnQgZmZfQU1lZGlhQ29kZWNQcm9maWxlX2dldFByb2ZpbGVGcm9tQVZDb2RlY0NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworY2hhciAqZmZfQU1lZGlhQ29kZWNMaXN0X2dldENvZGVjTmFtZUJ5VHlwZShjb25zdCBjaGFyICptaW1lLCBpbnQgcHJvZmlsZSwgaW50IGVuY29kZXIsIHZvaWQgKmxvZ19jdHgpOworCitzdHJ1Y3QgRkZBTWVkaWFGb3JtYXQ7Cit0eXBlZGVmIHN0cnVjdCBGRkFNZWRpYUZvcm1hdCBGRkFNZWRpYUZvcm1hdDsKKworRkZBTWVkaWFGb3JtYXQgKmZmX0FNZWRpYUZvcm1hdF9uZXcodm9pZCk7CitpbnQgZmZfQU1lZGlhRm9ybWF0X2RlbGV0ZShGRkFNZWRpYUZvcm1hdCogZm9ybWF0KTsKKworY2hhciogZmZfQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQpOworCitpbnQgZmZfQU1lZGlhRm9ybWF0X2dldEludDMyKEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm91dCk7CitpbnQgZmZfQU1lZGlhRm9ybWF0X2dldEludDY0KEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCk7CitpbnQgZmZfQU1lZGlhRm9ybWF0X2dldEZsb2F0KEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICpvdXQpOworaW50IGZmX0FNZWRpYUZvcm1hdF9nZXRCdWZmZXIoRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqc2l6ZSk7CitpbnQgZmZfQU1lZGlhRm9ybWF0X2dldFN0cmluZyhGRkFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KTsKKwordm9pZCBmZl9BTWVkaWFGb3JtYXRfc2V0SW50MzIoRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSk7Cit2b2lkIGZmX0FNZWRpYUZvcm1hdF9zZXRJbnQ2NChGRkFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgZmZfQU1lZGlhRm9ybWF0X3NldEZsb2F0KEZGQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIGZsb2F0IHZhbHVlKTsKK3ZvaWQgZmZfQU1lZGlhRm9ybWF0X3NldFN0cmluZyhGRkFNZWRpYUZvcm1hdCogZm9ybWF0LCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSk7Cit2b2lkIGZmX0FNZWRpYUZvcm1hdF9zZXRCdWZmZXIoRkZBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOworCitzdHJ1Y3QgRkZBTWVkaWFDb2RlYzsKK3R5cGVkZWYgc3RydWN0IEZGQU1lZGlhQ29kZWMgRkZBTWVkaWFDb2RlYzsKK3R5cGVkZWYgc3RydWN0IEZGQU1lZGlhQ29kZWNDcnlwdG9JbmZvIEZGQU1lZGlhQ29kZWNDcnlwdG9JbmZvOworCitzdHJ1Y3QgRkZBTWVkaWFDb2RlY0J1ZmZlckluZm8geworICAgIGludDMyX3Qgb2Zmc2V0OworICAgIGludDMyX3Qgc2l6ZTsKKyAgICBpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVczsKKyAgICB1aW50MzJfdCBmbGFnczsKK307Cit0eXBlZGVmIHN0cnVjdCBGRkFNZWRpYUNvZGVjQnVmZmVySW5mbyBGRkFNZWRpYUNvZGVjQnVmZmVySW5mbzsKKworY2hhciAqZmZfQU1lZGlhQ29kZWNfZ2V0TmFtZShGRkFNZWRpYUNvZGVjICpjb2RlYyk7CisKK0ZGQU1lZGlhQ29kZWMqIGZmX0FNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpOworRkZBTWVkaWFDb2RlYyogZmZfQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpOworRkZBTWVkaWFDb2RlYyogZmZfQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpOworCitpbnQgZmZfQU1lZGlhQ29kZWNfY29uZmlndXJlKEZGQU1lZGlhQ29kZWMqIGNvZGVjLCBjb25zdCBGRkFNZWRpYUZvcm1hdCogZm9ybWF0LCB2b2lkKiBzdXJmYWNlLCB2b2lkICpjcnlwdG8sIHVpbnQzMl90IGZsYWdzKTsKK2ludCBmZl9BTWVkaWFDb2RlY19zdGFydChGRkFNZWRpYUNvZGVjKiBjb2RlYyk7CitpbnQgZmZfQU1lZGlhQ29kZWNfc3RvcChGRkFNZWRpYUNvZGVjKiBjb2RlYyk7CitpbnQgZmZfQU1lZGlhQ29kZWNfZmx1c2goRkZBTWVkaWFDb2RlYyogY29kZWMpOworaW50IGZmX0FNZWRpYUNvZGVjX2RlbGV0ZShGRkFNZWRpYUNvZGVjKiBjb2RlYyk7CisKK3VpbnQ4X3QqIGZmX0FNZWRpYUNvZGVjX2dldElucHV0QnVmZmVyKEZGQU1lZGlhQ29kZWMqIGNvZGVjLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKTsKK3VpbnQ4X3QqIGZmX0FNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihGRkFNZWRpYUNvZGVjKiBjb2RlYywgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSk7CisKK3NzaXplX3QgZmZfQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKEZGQU1lZGlhQ29kZWMqIGNvZGVjLCBpbnQ2NF90IHRpbWVvdXRVcyk7CitpbnQgZmZfQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihGRkFNZWRpYUNvZGVjKiBjb2RlYywgc2l6ZV90IGlkeCwgb2ZmX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworCitzc2l6ZV90IGZmX0FNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoRkZBTWVkaWFDb2RlYyogY29kZWMsIEZGQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLCBpbnQ2NF90IHRpbWVvdXRVcyk7CitGRkFNZWRpYUZvcm1hdCogZmZfQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KEZGQU1lZGlhQ29kZWMqIGNvZGVjKTsKKworaW50IGZmX0FNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIoRkZBTWVkaWFDb2RlYyogY29kZWMsIHNpemVfdCBpZHgsIGludCByZW5kZXIpOworaW50IGZmX0FNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXJBdFRpbWUoRkZBTWVkaWFDb2RlYyAqY29kZWMsIHNpemVfdCBpZHgsIGludDY0X3QgdGltZXN0YW1wTnMpOworCitpbnQgZmZfQU1lZGlhQ29kZWNfaW5mb1RyeUFnYWluTGF0ZXIoRkZBTWVkaWFDb2RlYyAqY29kZWMsIHNzaXplX3QgaWR4KTsKK2ludCBmZl9BTWVkaWFDb2RlY19pbmZvT3V0cHV0QnVmZmVyc0NoYW5nZWQoRkZBTWVkaWFDb2RlYyAqY29kZWMsIHNzaXplX3QgaWR4KTsKK2ludCBmZl9BTWVkaWFDb2RlY19pbmZvT3V0cHV0Rm9ybWF0Q2hhbmdlZChGRkFNZWRpYUNvZGVjICpjb2RlYywgc3NpemVfdCBpbmR4KTsKKworaW50IGZmX0FNZWRpYUNvZGVjX2dldEJ1ZmZlckZsYWdDb2RlY0NvbmZpZyAoRkZBTWVkaWFDb2RlYyAqY29kZWMpOworaW50IGZmX0FNZWRpYUNvZGVjX2dldEJ1ZmZlckZsYWdFbmRPZlN0cmVhbShGRkFNZWRpYUNvZGVjICpjb2RlYyk7CitpbnQgZmZfQU1lZGlhQ29kZWNfZ2V0QnVmZmVyRmxhZ0tleUZyYW1lKEZGQU1lZGlhQ29kZWMgKmNvZGVjKTsKKworaW50IGZmX0FNZWRpYUNvZGVjX2dldENvbmZpZ3VyZUZsYWdFbmNvZGUoRkZBTWVkaWFDb2RlYyAqY29kZWMpOworCitpbnQgZmZfQU1lZGlhQ29kZWNfY2xlYW5PdXRwdXRCdWZmZXJzKEZGQU1lZGlhQ29kZWMgKmNvZGVjKTsKKworaW50IGZmX0J1aWxkX1NES19JTlQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUVESUFDT0RFQ19XUkFQUEVSX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVkaWFjb2RlY2RlYy5jIGIvbGliYXZjb2RlYy9tZWRpYWNvZGVjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E0MjQwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbWVkaWFjb2RlY2RlYy5jCkBAIC0wLDAgKzEsNTU0IEBACisvKgorICogQW5kcm9pZCBNZWRpYUNvZGVjIE1QRUctMiAvIEguMjY0IC8gSC4yNjUgLyBNUEVHLTQgLyBWUDggLyBWUDkgZGVjb2RlcnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbiBzdHVwZWZsaXguY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZGVjb2RlLmgiCisjaW5jbHVkZSAiaDI2NF9wYXJzZS5oIgorI2luY2x1ZGUgImhldmNfcGFyc2UuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtZWRpYWNvZGVjX3dyYXBwZXIuaCIKKyNpbmNsdWRlICJtZWRpYWNvZGVjZGVjX2NvbW1vbi5oIgorCit0eXBlZGVmIHN0cnVjdCBNZWRpYUNvZGVjSDI2NERlY0NvbnRleHQgeworCisgICAgQVZDbGFzcyAqYXZjbGFzczsKKworICAgIE1lZGlhQ29kZWNEZWNDb250ZXh0ICpjdHg7CisKKyAgICBBVlBhY2tldCBidWZmZXJlZF9wa3Q7CisKKyAgICBpbnQgZGVsYXlfZmx1c2g7CisgICAgaW50IGFtbG9naWNfbXBlZzJfYXBpMjNfd29ya2Fyb3VuZDsKKworfSBNZWRpYUNvZGVjSDI2NERlY0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBtZWRpYWNvZGVjX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTWVkaWFDb2RlY0gyNjREZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX21lZGlhY29kZWNfZGVjX2Nsb3NlKGF2Y3R4LCBzLT5jdHgpOworICAgIHMtPmN0eCA9IE5VTEw7CisKKyAgICBhdl9wYWNrZXRfdW5yZWYoJnMtPmJ1ZmZlcmVkX3BrdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19IMjY0X01FRElBQ09ERUNfREVDT0RFUiB8fCBDT05GSUdfSEVWQ19NRURJQUNPREVDX0RFQ09ERVIKK3N0YXRpYyBpbnQgaDI2NDVfcHNfdG9fbmFsdShjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc2l6ZSwgdWludDhfdCAqKm91dCwgaW50ICpvdXRfc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1aW50OF90ICpwID0gTlVMTDsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBuYWx1X2hlYWRlcltdID0geyAweDAwLCAweDAwLCAweDAwLCAweDAxIH07CisKKyAgICBpZiAoIW91dCB8fCAhb3V0X3NpemUpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBwID0gYXZfbWFsbG9jKHNpemVvZihuYWx1X2hlYWRlcikgKyBzcmNfc2l6ZSk7CisgICAgaWYgKCFwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgKm91dCA9IHA7CisgICAgKm91dF9zaXplID0gc2l6ZW9mKG5hbHVfaGVhZGVyKSArIHNyY19zaXplOworCisgICAgbWVtY3B5KHAsIG5hbHVfaGVhZGVyLCBzaXplb2YobmFsdV9oZWFkZXIpKTsKKyAgICBtZW1jcHkocCArIHNpemVvZihuYWx1X2hlYWRlciksIHNyYywgc3JjX3NpemUpOworCisgICAgLyogRXNjYXBlIDB4MDAsIDB4MDAsIDB4MHswLTN9IHBhdHRlcm4gKi8KKyAgICBmb3IgKGkgPSA0OyBpIDwgKm91dF9zaXplOyBpKyspIHsKKyAgICAgICAgaWYgKGkgPCAqb3V0X3NpemUgLSAzICYmCisgICAgICAgICAgICBwW2kgKyAwXSA9PSAwICYmCisgICAgICAgICAgICBwW2kgKyAxXSA9PSAwICYmCisgICAgICAgICAgICBwW2kgKyAyXSA8PSAzKSB7CisgICAgICAgICAgICB1aW50OF90ICpuZXc7CisKKyAgICAgICAgICAgICpvdXRfc2l6ZSArPSAxOworICAgICAgICAgICAgbmV3ID0gYXZfcmVhbGxvYygqb3V0LCAqb3V0X3NpemUpOworICAgICAgICAgICAgaWYgKCFuZXcpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKm91dCA9IHAgPSBuZXc7CisKKyAgICAgICAgICAgIGkgPSBpICsgMjsKKyAgICAgICAgICAgIG1lbW1vdmUocCArIGkgKyAxLCBwICsgaSwgKm91dF9zaXplIC0gKGkgKyAxKSk7CisgICAgICAgICAgICBwW2ldID0gMHgwMzsKKyAgICAgICAgfQorICAgIH0KK2RvbmU6CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfZnJlZXAob3V0KTsKKyAgICAgICAgKm91dF9zaXplID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorI2VuZGlmCisKKyNpZiBDT05GSUdfSDI2NF9NRURJQUNPREVDX0RFQ09ERVIKK3N0YXRpYyBpbnQgaDI2NF9zZXRfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgRkZBTWVkaWFGb3JtYXQgKmZvcm1hdCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0OworCisgICAgSDI2NFBhcmFtU2V0cyBwczsKKyAgICBjb25zdCBQUFMgKnBwcyA9IE5VTEw7CisgICAgY29uc3QgU1BTICpzcHMgPSBOVUxMOworICAgIGludCBpc19hdmMgPSAwOworICAgIGludCBuYWxfbGVuZ3RoX3NpemUgPSAwOworCisgICAgbWVtc2V0KCZwcywgMCwgc2l6ZW9mKHBzKSk7CisKKyAgICByZXQgPSBmZl9oMjY0X2RlY29kZV9leHRyYWRhdGEoYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHMsICZpc19hdmMsICZuYWxfbGVuZ3RoX3NpemUsIDAsIGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QUFNfQ09VTlQ7IGkrKykgeworICAgICAgICBpZiAocHMucHBzX2xpc3RbaV0pIHsKKyAgICAgICAgICAgIHBwcyA9IChjb25zdCBQUFMqKXBzLnBwc19saXN0W2ldLT5kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHBzKSB7CisgICAgICAgIGlmIChwcy5zcHNfbGlzdFtwcHMtPnNwc19pZF0pIHsKKyAgICAgICAgICAgIHNwcyA9IChjb25zdCBTUFMqKXBzLnNwc19saXN0W3Bwcy0+c3BzX2lkXS0+ZGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcHMgJiYgc3BzKSB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMOworICAgICAgICBpbnQgZGF0YV9zaXplID0gMDsKKworICAgICAgICBpZiAoKHJldCA9IGgyNjQ1X3BzX3RvX25hbHUoc3BzLT5kYXRhLCBzcHMtPmRhdGFfc2l6ZSwgJmRhdGEsICZkYXRhX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgICBmZl9BTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGZvcm1hdCwgImNzZC0wIiwgKHZvaWQqKWRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgIGF2X2ZyZWVwKCZkYXRhKTsKKworICAgICAgICBpZiAoKHJldCA9IGgyNjQ1X3BzX3RvX25hbHUocHBzLT5kYXRhLCBwcHMtPmRhdGFfc2l6ZSwgJmRhdGEsICZkYXRhX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorICAgICAgICBmZl9BTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGZvcm1hdCwgImNzZC0xIiwgKHZvaWQqKWRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICAgIGF2X2ZyZWVwKCZkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBleHRyYWN0IFBQUy9TUFMgZnJvbSBleHRyYWRhdGEiKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKK2RvbmU6CisgICAgZmZfaDI2NF9wc191bmluaXQoJnBzKTsKKworICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYKKworI2lmIENPTkZJR19IRVZDX01FRElBQ09ERUNfREVDT0RFUgorc3RhdGljIGludCBoZXZjX3NldF9leHRyYWRhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBGRkFNZWRpYUZvcm1hdCAqZm9ybWF0KQoreworICAgIGludCBpOworICAgIGludCByZXQ7CisKKyAgICBIRVZDUGFyYW1TZXRzIHBzOworICAgIEhFVkNTRUkgc2VpOworCisgICAgY29uc3QgSEVWQ1ZQUyAqdnBzID0gTlVMTDsKKyAgICBjb25zdCBIRVZDUFBTICpwcHMgPSBOVUxMOworICAgIGNvbnN0IEhFVkNTUFMgKnNwcyA9IE5VTEw7CisgICAgaW50IGlzX25hbGZmID0gMDsKKyAgICBpbnQgbmFsX2xlbmd0aF9zaXplID0gMDsKKworICAgIHVpbnQ4X3QgKnZwc19kYXRhID0gTlVMTDsKKyAgICB1aW50OF90ICpzcHNfZGF0YSA9IE5VTEw7CisgICAgdWludDhfdCAqcHBzX2RhdGEgPSBOVUxMOworICAgIGludCB2cHNfZGF0YV9zaXplID0gMDsKKyAgICBpbnQgc3BzX2RhdGFfc2l6ZSA9IDA7CisgICAgaW50IHBwc19kYXRhX3NpemUgPSAwOworCisgICAgbWVtc2V0KCZwcywgMCwgc2l6ZW9mKHBzKSk7CisgICAgbWVtc2V0KCZzZWksIDAsIHNpemVvZihzZWkpKTsKKworICAgIHJldCA9IGZmX2hldmNfZGVjb2RlX2V4dHJhZGF0YShhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcywgJnNlaSwgJmlzX25hbGZmLCAmbmFsX2xlbmd0aF9zaXplLCAwLCAxLCBhdmN0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBIRVZDX01BWF9WUFNfQ09VTlQ7IGkrKykgeworICAgICAgICBpZiAocHMudnBzX2xpc3RbaV0pIHsKKyAgICAgICAgICAgIHZwcyA9IChjb25zdCBIRVZDVlBTKilwcy52cHNfbGlzdFtpXS0+ZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEhFVkNfTUFYX1BQU19DT1VOVDsgaSsrKSB7CisgICAgICAgIGlmIChwcy5wcHNfbGlzdFtpXSkgeworICAgICAgICAgICAgcHBzID0gKGNvbnN0IEhFVkNQUFMqKXBzLnBwc19saXN0W2ldLT5kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHBzKSB7CisgICAgICAgIGlmIChwcy5zcHNfbGlzdFtwcHMtPnNwc19pZF0pIHsKKyAgICAgICAgICAgIHNwcyA9IChjb25zdCBIRVZDU1BTKilwcy5zcHNfbGlzdFtwcHMtPnNwc19pZF0tPmRhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodnBzICYmIHBwcyAmJiBzcHMpIHsKKyAgICAgICAgdWludDhfdCAqZGF0YTsKKyAgICAgICAgaW50IGRhdGFfc2l6ZTsKKworICAgICAgICBpZiAoKHJldCA9IGgyNjQ1X3BzX3RvX25hbHUodnBzLT5kYXRhLCB2cHMtPmRhdGFfc2l6ZSwgJnZwc19kYXRhLCAmdnBzX2RhdGFfc2l6ZSkpIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGgyNjQ1X3BzX3RvX25hbHUoc3BzLT5kYXRhLCBzcHMtPmRhdGFfc2l6ZSwgJnNwc19kYXRhLCAmc3BzX2RhdGFfc2l6ZSkpIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGgyNjQ1X3BzX3RvX25hbHUocHBzLT5kYXRhLCBwcHMtPmRhdGFfc2l6ZSwgJnBwc19kYXRhLCAmcHBzX2RhdGFfc2l6ZSkpIDwgMCkgeworICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisKKyAgICAgICAgZGF0YV9zaXplID0gdnBzX2RhdGFfc2l6ZSArIHNwc19kYXRhX3NpemUgKyBwcHNfZGF0YV9zaXplOworICAgICAgICBkYXRhID0gYXZfbWFsbG9jeihkYXRhX3NpemUpOworICAgICAgICBpZiAoIWRhdGEpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHZwc19kYXRhLCB2cHNfZGF0YV9zaXplKTsKKyAgICAgICAgbWVtY3B5KGRhdGEgKyB2cHNfZGF0YV9zaXplICAgICAgICAgICAgICAgICwgc3BzX2RhdGEsIHNwc19kYXRhX3NpemUpOworICAgICAgICBtZW1jcHkoZGF0YSArIHZwc19kYXRhX3NpemUgKyBzcHNfZGF0YV9zaXplLCBwcHNfZGF0YSwgcHBzX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgZmZfQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmb3JtYXQsICJjc2QtMCIsIGRhdGEsIGRhdGFfc2l6ZSk7CisKKyAgICAgICAgYXZfZnJlZXAoJmRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGV4dHJhY3QgVlBTL1BQUy9TUFMgZnJvbSBleHRyYWRhdGEiKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKK2RvbmU6CisgICAgZmZfaGV2Y19wc191bmluaXQoJnBzKTsKKworICAgIGF2X2ZyZWVwKCZ2cHNfZGF0YSk7CisgICAgYXZfZnJlZXAoJnNwc19kYXRhKTsKKyAgICBhdl9mcmVlcCgmcHBzX2RhdGEpOworCisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcyX01FRElBQ09ERUNfREVDT0RFUiB8fCBcCisgICAgQ09ORklHX01QRUc0X01FRElBQ09ERUNfREVDT0RFUiB8fCBcCisgICAgQ09ORklHX1ZQOF9NRURJQUNPREVDX0RFQ09ERVIgICB8fCBcCisgICAgQ09ORklHX1ZQOV9NRURJQUNPREVDX0RFQ09ERVIKK3N0YXRpYyBpbnQgY29tbW9uX3NldF9leHRyYWRhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBGRkFNZWRpYUZvcm1hdCAqZm9ybWF0KQoreworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgZmZfQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihmb3JtYXQsICJjc2QtMCIsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCitzdGF0aWMgYXZfY29sZCBpbnQgbWVkaWFjb2RlY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQgc2RrX2ludDsKKworICAgIGNvbnN0IGNoYXIgKmNvZGVjX21pbWUgPSBOVUxMOworCisgICAgRkZBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IE5VTEw7CisgICAgTWVkaWFDb2RlY0gyNjREZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZvcm1hdCA9IGZmX0FNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBpZiAoIWZvcm1hdCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgbWVkaWEgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBkb25lOworICAgIH0KKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX2lkKSB7CisjaWYgQ09ORklHX0gyNjRfTUVESUFDT0RFQ19ERUNPREVSCisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OgorICAgICAgICBjb2RlY19taW1lID0gInZpZGVvL2F2YyI7CisKKyAgICAgICAgcmV0ID0gaDI2NF9zZXRfZXh0cmFkYXRhKGF2Y3R4LCBmb3JtYXQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfSEVWQ19NRURJQUNPREVDX0RFQ09ERVIKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgIGNvZGVjX21pbWUgPSAidmlkZW8vaGV2YyI7CisKKyAgICAgICAgcmV0ID0gaGV2Y19zZXRfZXh0cmFkYXRhKGF2Y3R4LCBmb3JtYXQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZG9uZTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzJfTUVESUFDT0RFQ19ERUNPREVSCisgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOgorICAgICAgICBjb2RlY19taW1lID0gInZpZGVvL21wZWcyIjsKKworICAgICAgICByZXQgPSBjb21tb25fc2V0X2V4dHJhZGF0YShhdmN0eCwgZm9ybWF0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGRvbmU7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgQ09ORklHX01QRUc0X01FRElBQ09ERUNfREVDT0RFUgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisgICAgICAgIGNvZGVjX21pbWUgPSAidmlkZW8vbXA0di1lcyIsCisKKyAgICAgICAgcmV0ID0gY29tbW9uX3NldF9leHRyYWRhdGEoYXZjdHgsIGZvcm1hdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIENPTkZJR19WUDhfTUVESUFDT0RFQ19ERUNPREVSCisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDg6CisgICAgICAgIGNvZGVjX21pbWUgPSAidmlkZW8veC12bmQub24yLnZwOCI7CisKKyAgICAgICAgcmV0ID0gY29tbW9uX3NldF9leHRyYWRhdGEoYXZjdHgsIGZvcm1hdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIENPTkZJR19WUDlfTUVESUFDT0RFQ19ERUNPREVSCisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDk6CisgICAgICAgIGNvZGVjX21pbWUgPSAidmlkZW8veC12bmQub24yLnZwOSI7CisKKyAgICAgICAgcmV0ID0gY29tbW9uX3NldF9leHRyYWRhdGEoYXZjdHgsIGZvcm1hdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfQorCisgICAgZmZfQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmb3JtYXQsICJtaW1lIiwgY29kZWNfbWltZSk7CisgICAgZmZfQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgIndpZHRoIiwgYXZjdHgtPndpZHRoKTsKKyAgICBmZl9BTWVkaWFGb3JtYXRfc2V0SW50MzIoZm9ybWF0LCAiaGVpZ2h0IiwgYXZjdHgtPmhlaWdodCk7CisKKyAgICBzLT5jdHggPSBhdl9tYWxsb2N6KHNpemVvZigqcy0+Y3R4KSk7CisgICAgaWYgKCFzLT5jdHgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgTWVkaWFDb2RlY0RlY0NvbnRleHRcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBzLT5jdHgtPmRlbGF5X2ZsdXNoID0gcy0+ZGVsYXlfZmx1c2g7CisKKyAgICBpZiAoKHJldCA9IGZmX21lZGlhY29kZWNfZGVjX2luaXQoYXZjdHgsIHMtPmN0eCwgY29kZWNfbWltZSwgZm9ybWF0KSkgPCAwKSB7CisgICAgICAgIHMtPmN0eCA9IE5VTEw7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAiTWVkaWFDb2RlYyBzdGFydGVkIHN1Y2Nlc3NmdWxseTogY29kZWMgPSAlcywgcmV0ID0gJWRcbiIsCisgICAgICAgICAgIHMtPmN0eC0+Y29kZWNfbmFtZSwgcmV0KTsKKworICAgIHNka19pbnQgPSBmZl9CdWlsZF9TREtfSU5UKGF2Y3R4KTsKKyAgICBpZiAoc2RrX2ludCA8PSAyMyAmJgorICAgICAgICBzdHJjbXAocy0+Y3R4LT5jb2RlY19uYW1lLCAiT01YLmFtbG9naWMubXBlZzIuZGVjb2Rlci5hd2Vzb21lIikgPT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiRW5hYmxpbmcgd29ya2Fyb3VuZCBmb3IgJXMgb24gQVBJPSVkXG4iLAorICAgICAgICAgICAgICAgcy0+Y3R4LT5jb2RlY19uYW1lLCBzZGtfaW50KTsKKyAgICAgICAgcy0+YW1sb2dpY19tcGVnMl9hcGkyM193b3JrYXJvdW5kID0gMTsKKyAgICB9CisKK2RvbmU6CisgICAgaWYgKGZvcm1hdCkgeworICAgICAgICBmZl9BTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CisgICAgfQorCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgbWVkaWFjb2RlY19kZWNvZGVfY2xvc2UoYXZjdHgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkaWFjb2RlY19yZWNlaXZlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgTWVkaWFDb2RlY0gyNjREZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworICAgIHNzaXplX3QgaW5kZXg7CisKKyAgICAvKiBJbiBkZWxheV9mbHVzaCBtb2RlLCB3YWl0IHVudGlsIHRoZSB1c2VyIGhhcyByZWxlYXNlZCBvciByZW5kZXJlZAorICAgICAgIGFsbCByZXRhaW5lZCBmcmFtZXMuICovCisgICAgaWYgKHMtPmRlbGF5X2ZsdXNoICYmIGZmX21lZGlhY29kZWNfZGVjX2lzX2ZsdXNoaW5nKGF2Y3R4LCBzLT5jdHgpKSB7CisgICAgICAgIGlmICghZmZfbWVkaWFjb2RlY19kZWNfZmx1c2goYXZjdHgsIHMtPmN0eCkpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwb2xsIGZvciBuZXcgZnJhbWUgKi8KKyAgICByZXQgPSBmZl9tZWRpYWNvZGVjX2RlY19yZWNlaXZlKGF2Y3R4LCBzLT5jdHgsIGZyYW1lLCBmYWxzZSk7CisgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBmZWVkIGRlY29kZXIgKi8KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAocy0+Y3R4LT5jdXJyZW50X2lucHV0X2J1ZmZlciA8IDApIHsKKyAgICAgICAgICAgIC8qIHBvbGwgZm9yIGlucHV0IHNwYWNlICovCisgICAgICAgICAgICBpbmRleCA9IGZmX0FNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihzLT5jdHgtPmNvZGVjLCAwKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICAvKiBubyBzcGFjZSwgYmxvY2sgZm9yIGFuIG91dHB1dCBmcmFtZSB0byBhcHBlYXIgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gZmZfbWVkaWFjb2RlY19kZWNfcmVjZWl2ZShhdmN0eCwgcy0+Y3R4LCBmcmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT5jdHgtPmN1cnJlbnRfaW5wdXRfYnVmZmVyID0gaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICAvKiB0cnkgdG8gZmx1c2ggYW55IGJ1ZmZlcmVkIHBhY2tldCBkYXRhICovCisgICAgICAgIGlmIChzLT5idWZmZXJlZF9wa3Quc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IGZmX21lZGlhY29kZWNfZGVjX3NlbmQoYXZjdHgsIHMtPmN0eCwgJnMtPmJ1ZmZlcmVkX3BrdCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICAgICAgcy0+YnVmZmVyZWRfcGt0LnNpemUgLT0gcmV0OworICAgICAgICAgICAgICAgIHMtPmJ1ZmZlcmVkX3BrdC5kYXRhICs9IHJldDsKKyAgICAgICAgICAgICAgICBpZiAocy0+YnVmZmVyZWRfcGt0LnNpemUgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZzLT5idWZmZXJlZF9wa3QpOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SKEVBR0FJTikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+YW1sb2dpY19tcGVnMl9hcGkyM193b3JrYXJvdW5kICYmIHMtPmJ1ZmZlcmVkX3BrdC5zaXplIDw9IDApIHsKKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhyb3VnaCB0byBmZXRjaCBuZXh0IHBhY2tldCByZWdhcmRsZXNzIG9mIGlucHV0IGJ1ZmZlciBzcGFjZSAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBwb2xsIGZvciBzcGFjZSBhZ2FpbiAqLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogZmV0Y2ggbmV3IHBhY2tldCBvciBlb2YgKi8KKyAgICAgICAgcmV0ID0gZmZfZGVjb2RlX2dldF9wYWNrZXQoYXZjdHgsICZzLT5idWZmZXJlZF9wa3QpOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICBBVlBhY2tldCBudWxsX3BrdCA9IHsgMCB9OworICAgICAgICAgICAgcmV0ID0gZmZfbWVkaWFjb2RlY19kZWNfc2VuZChhdmN0eCwgcy0+Y3R4LCAmbnVsbF9wa3QsIHRydWUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pICYmIHMtPmN0eC0+Y3VycmVudF9pbnB1dF9idWZmZXIgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmZfbWVkaWFjb2RlY19kZWNfcmVjZWl2ZShhdmN0eCwgcy0+Y3R4LCBmcmFtZSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Cit9CisKK3N0YXRpYyB2b2lkIG1lZGlhY29kZWNfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBNZWRpYUNvZGVjSDI2NERlY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfcGFja2V0X3VucmVmKCZzLT5idWZmZXJlZF9wa3QpOworCisgICAgZmZfbWVkaWFjb2RlY19kZWNfZmx1c2goYXZjdHgsIHMtPmN0eCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCAqbWVkaWFjb2RlY19od19jb25maWdzW10gPSB7CisgICAgJihjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCkgeworICAgICAgICAucHVibGljICAgICAgICAgID0geworICAgICAgICAgICAgLnBpeF9mbXQgICAgID0gQVZfUElYX0ZNVF9NRURJQUNPREVDLAorICAgICAgICAgICAgLm1ldGhvZHMgICAgID0gQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9BRF9IT0MgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9IV19ERVZJQ0VfQ1RYLAorICAgICAgICAgICAgLmRldmljZV90eXBlID0gQVZfSFdERVZJQ0VfVFlQRV9NRURJQUNPREVDLAorICAgICAgICB9LAorICAgICAgICAuaHdhY2NlbCAgICAgICAgID0gTlVMTCwKKyAgICB9LAorICAgIE5VTEwKK307CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1lZGlhQ29kZWNIMjY0RGVjQ29udGV4dCwgeCkKKyNkZWZpbmUgVkQgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZmX21lZGlhY29kZWNfdmRlY19vcHRpb25zW10gPSB7CisgICAgeyAiZGVsYXlfZmx1c2giLCAiRGVsYXkgZmx1c2ggdW50aWwgaHcgb3V0cHV0IGJ1ZmZlcnMgYXJlIHJldHVybmVkIHRvIHRoZSBkZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChkZWxheV9mbHVzaCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIDAsIDEsIFZEIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNkZWZpbmUgREVDTEFSRV9NRURJQUNPREVDX1ZDTEFTUyhzaG9ydF9uYW1lKSAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmZl8jI3Nob3J0X25hbWUjI19tZWRpYWNvZGVjX2RlY19jbGFzcyA9IHsgXAorICAgIC5jbGFzc19uYW1lID0gI3Nob3J0X25hbWUgIl9tZWRpYWNvZGVjIiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLm9wdGlvbiAgICAgPSBmZl9tZWRpYWNvZGVjX3ZkZWNfb3B0aW9ucywgICAgICAgICAgICAgICAgICAgXAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULCAgICAgICAgICAgICAgICAgICAgICAgIFwKK307CisKKyNkZWZpbmUgREVDTEFSRV9NRURJQUNPREVDX1ZERUMoc2hvcnRfbmFtZSwgZnVsbF9uYW1lLCBjb2RlY19pZCwgYnNmKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVDTEFSRV9NRURJQUNPREVDX1ZDTEFTUyhzaG9ydF9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitBVkNvZGVjIGZmXyMjc2hvcnRfbmFtZSMjX21lZGlhY29kZWNfZGVjb2RlciA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAubmFtZSAgICAgICAgICAgPSAjc2hvcnRfbmFtZSAiX21lZGlhY29kZWMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZ1bGxfbmFtZSAiIEFuZHJvaWQgTWVkaWFDb2RlYyBkZWNvZGVyIiksICAgICAgICAgICBcCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaWQgICAgICAgICAgICAgPSBjb2RlY19pZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5wcml2X2NsYXNzICAgICA9ICZmZl8jI3Nob3J0X25hbWUjI19tZWRpYWNvZGVjX2RlY19jbGFzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1lZGlhQ29kZWNIMjY0RGVjQ29udGV4dCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuaW5pdCAgICAgICAgICAgPSBtZWRpYWNvZGVjX2RlY29kZV9pbml0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5yZWNlaXZlX2ZyYW1lICA9IG1lZGlhY29kZWNfcmVjZWl2ZV9mcmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmZsdXNoICAgICAgICAgID0gbWVkaWFjb2RlY19kZWNvZGVfZmx1c2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuY2xvc2UgICAgICAgICAgPSBtZWRpYWNvZGVjX2RlY29kZV9jbG9zZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9BVk9JRF9QUk9CSU5HIHwgQVZfQ09ERUNfQ0FQX0hBUkRXQVJFLCBcCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX1NFVFNfUEtUX0RUUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAuYnNmcyAgICAgICAgICAgPSBic2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC5od19jb25maWdzICAgICA9IG1lZGlhY29kZWNfaHdfY29uZmlncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLndyYXBwZXJfbmFtZSAgID0gIm1lZGlhY29kZWMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjaWYgQ09ORklHX0gyNjRfTUVESUFDT0RFQ19ERUNPREVSCitERUNMQVJFX01FRElBQ09ERUNfVkRFQyhoMjY0LCAiSC4yNjQiLCBBVl9DT0RFQ19JRF9IMjY0LCAiaDI2NF9tcDR0b2FubmV4YiIpCisjZW5kaWYKKworI2lmIENPTkZJR19IRVZDX01FRElBQ09ERUNfREVDT0RFUgorREVDTEFSRV9NRURJQUNPREVDX1ZERUMoaGV2YywgIkguMjY1IiwgQVZfQ09ERUNfSURfSEVWQywgImhldmNfbXA0dG9hbm5leGIiKQorI2VuZGlmCisKKyNpZiBDT05GSUdfTVBFRzJfTUVESUFDT0RFQ19ERUNPREVSCitERUNMQVJFX01FRElBQ09ERUNfVkRFQyhtcGVnMiwgIk1QRUctMiIsIEFWX0NPREVDX0lEX01QRUcyVklERU8sIE5VTEwpCisjZW5kaWYKKworI2lmIENPTkZJR19NUEVHNF9NRURJQUNPREVDX0RFQ09ERVIKK0RFQ0xBUkVfTUVESUFDT0RFQ19WREVDKG1wZWc0LCAiTVBFRy00IiwgQVZfQ09ERUNfSURfTVBFRzQsIE5VTEwpCisjZW5kaWYKKworI2lmIENPTkZJR19WUDhfTUVESUFDT0RFQ19ERUNPREVSCitERUNMQVJFX01FRElBQ09ERUNfVkRFQyh2cDgsICJWUDgiLCBBVl9DT0RFQ19JRF9WUDgsIE5VTEwpCisjZW5kaWYKKworI2lmIENPTkZJR19WUDlfTUVESUFDT0RFQ19ERUNPREVSCitERUNMQVJFX01FRElBQ09ERUNfVkRFQyh2cDksICJWUDkiLCBBVl9DT0RFQ19JRF9WUDksIE5VTEwpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWVkaWFjb2RlY2RlY19jb21tb24uYyBiL2xpYmF2Y29kZWMvbWVkaWFjb2RlY2RlY19jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM1ZGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9tZWRpYWNvZGVjZGVjX2NvbW1vbi5jCkBAIC0wLDAgKzEsODA3IEBACisvKgorICogQW5kcm9pZCBNZWRpYUNvZGVjIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbiBzdHVwZWZsaXguY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dF9tZWRpYWNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgIm1lZGlhY29kZWMuaCIKKyNpbmNsdWRlICJtZWRpYWNvZGVjX3N1cmZhY2UuaCIKKyNpbmNsdWRlICJtZWRpYWNvZGVjX3N3X2J1ZmZlci5oIgorI2luY2x1ZGUgIm1lZGlhY29kZWNfd3JhcHBlci5oIgorI2luY2x1ZGUgIm1lZGlhY29kZWNkZWNfY29tbW9uLmgiCisKKy8qKgorICogT01YLmszLnZpZGVvLmRlY29kZXIuYXZjLCBPTVguTlZJRElBLiogT01YLlNFQy5hdmMuZGVjIGFuZCBPTVguZ29vZ2xlCisgKiBjb2RlYyB3b3JrYXJvdW5kcyB1c2VkIGluIHZhcmlvdXMgcGxhY2UgYXJlIHRha2VuIGZyb20gdGhlIEdzdHJlYW1lcgorICogcHJvamVjdC4KKyAqCisgKiBHc3RyZWFtZXIgcmVmZXJlbmNlczoKKyAqIGh0dHBzOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvZ3N0cmVhbWVyL2dzdC1wbHVnaW5zLWJhZC90cmVlL3N5cy9hbmRyb2lkbWVkaWEvCisgKgorICogR3N0cmVhbWVyIGNvcHlyaWdodCBub3RpY2U6CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyLCBDb2xsYWJvcmEgTHRkLgorICogICBBdXRob3I6IFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbi5kcm9lZ2VAY29sbGFib3JhLmNvLnVrPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiwgUmFmYcOrbCBDYXJyw6kgPGZ1bm1hbkB2aWRlb2xhbm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUsIFNlYmFzdGlhbiBEcsO2Z2UgPHNlYmFzdGlhbkBjZW50cmljdWxhci5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTUsIENvbGxhYm9yYSBMdGQuCisgKiAgIEF1dGhvcjogTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb25AZ2NvbGxhYm9yYS5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LCBFZHdhcmQgSGVydmV5CisgKiAgIEF1dGhvcjogRWR3YXJkIEhlcnZleSA8YmlsYm9lZEBnbWFpbC5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1LCBNYXR0aGV3IFdhdGVycyA8bWF0dGhld0BjZW50cmljdWxhci5jb20+CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjZGVmaW5lIElOUFVUX0RFUVVFVUVfVElNRU9VVF9VUyA4MDAwCisjZGVmaW5lIE9VVFBVVF9ERVFVRVVFX1RJTUVPVVRfVVMgODAwMAorI2RlZmluZSBPVVRQVVRfREVRVUVVRV9CTE9DS19USU1FT1VUX1VTIDEwMDAwMDAKKworZW51bSB7CisgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEzLAorICAgIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNSwKKyAgICBDT0xPUl9Gb3JtYXRZQ2JZQ3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTksCisgICAgQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDdGMDAwNzg5LAorICAgIENPTE9SX1FDT01fRm9ybWF0WVVWNDIwU2VtaVBsYW5hciAgICAgICAgICAgICAgICAgICAgID0gMHg3ZmEzMGMwMCwKKyAgICBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIzMm0gICAgICAgICAgICAgICAgICA9IDB4N2ZhMzBjMDQsCisgICAgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyNjR4MzJUaWxlMm04a2EgPSAweDdmYTMwYzAzLAorICAgIENPTE9SX1RJX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIgICAgICAgICAgICAgICAgID0gMHg3ZjAwMDEwMCwKKyAgICBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFySW50ZXJsYWNlZCAgICAgICA9IDB4N2YwMDAwMDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKworICAgIGludCBjb2xvcl9mb3JtYXQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisKK30gY29sb3JfZm9ybWF0c1tdID0geworCisgICAgeyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQIH0sCisgICAgeyBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OVjEyICAgIH0sCisgICAgeyBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OVjEyICAgIH0sCisgICAgeyBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIzMm0sICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OVjEyICAgIH0sCisgICAgeyBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI2NHgzMlRpbGUybThrYSwgQVZfUElYX0ZNVF9OVjEyICAgIH0sCisgICAgeyBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyLCAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OVjEyICAgIH0sCisgICAgeyBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFySW50ZXJsYWNlZCwgICAgICAgQVZfUElYX0ZNVF9OVjEyICAgIH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgbWNkZWNfbWFwX2NvbG9yX2Zvcm1hdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yX2Zvcm1hdCkKK3sKKyAgICBpbnQgaTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcmV0ID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgaWYgKHMtPnN1cmZhY2UpIHsKKyAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfTUVESUFDT0RFQzsKKyAgICB9CisKKyAgICBpZiAoIXN0cmNtcChzLT5jb2RlY19uYW1lLCAiT01YLmszLnZpZGVvLmRlY29kZXIuYXZjIikgJiYgY29sb3JfZm9ybWF0ID09IENPTE9SX0Zvcm1hdFlDYllDcikgeworICAgICAgICBzLT5jb2xvcl9mb3JtYXQgPSBjb2xvcl9mb3JtYXQgPSBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjb2xvcl9mb3JtYXRzKTsgaSsrKSB7CisgICAgICAgIGlmIChjb2xvcl9mb3JtYXRzW2ldLmNvbG9yX2Zvcm1hdCA9PSBjb2xvcl9mb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBjb2xvcl9mb3JtYXRzW2ldLnBpeF9mbXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk91dHB1dCBjb2xvciBmb3JtYXQgMHgleCAodmFsdWU9JWQpIGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisgICAgICAgIGNvbG9yX2Zvcm1hdCwgY29sb3JfZm9ybWF0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZmX21lZGlhY29kZWNfZGVjX3JlZihNZWRpYUNvZGVjRGVjQ29udGV4dCAqcykKK3sKKyAgICBhdG9taWNfZmV0Y2hfYWRkKCZzLT5yZWZjb3VudCwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZmX21lZGlhY29kZWNfZGVjX3VucmVmKE1lZGlhQ29kZWNEZWNDb250ZXh0ICpzKQoreworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGF0b21pY19mZXRjaF9zdWIoJnMtPnJlZmNvdW50LCAxKSA9PSAxKSB7CisgICAgICAgIGlmIChzLT5jb2RlYykgeworICAgICAgICAgICAgZmZfQU1lZGlhQ29kZWNfZGVsZXRlKHMtPmNvZGVjKTsKKyAgICAgICAgICAgIHMtPmNvZGVjID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIGZmX0FNZWRpYUZvcm1hdF9kZWxldGUocy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIHMtPmZvcm1hdCA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+c3VyZmFjZSkgeworICAgICAgICAgICAgZmZfbWVkaWFjb2RlY19zdXJmYWNlX3VucmVmKHMtPnN1cmZhY2UsIE5VTEwpOworICAgICAgICAgICAgcy0+c3VyZmFjZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlcCgmcy0+Y29kZWNfbmFtZSk7CisgICAgICAgIGF2X2ZyZWVwKCZzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1lZGlhY29kZWNfYnVmZmVyX3JlbGVhc2Uodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQoreworICAgIEFWTWVkaWFDb2RlY0J1ZmZlciAqYnVmZmVyID0gb3BhcXVlOworICAgIE1lZGlhQ29kZWNEZWNDb250ZXh0ICpjdHggPSBidWZmZXItPmN0eDsKKyAgICBpbnQgcmVsZWFzZWQgPSBhdG9taWNfbG9hZCgmYnVmZmVyLT5yZWxlYXNlZCk7CisKKyAgICBpZiAoIXJlbGVhc2VkICYmIChjdHgtPmRlbGF5X2ZsdXNoIHx8IGJ1ZmZlci0+c2VyaWFsID09IGF0b21pY19sb2FkKCZjdHgtPnNlcmlhbCkpKSB7CisgICAgICAgIGF0b21pY19mZXRjaF9zdWIoJmN0eC0+aHdfYnVmZmVyX2NvdW50LCAxKTsKKyAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICJSZWxlYXNpbmcgb3V0cHV0IGJ1ZmZlciAlemQgKCVwKSB0cz0lIlBSSWQ2NCIgb24gZnJlZSgpIFslZCBwZW5kaW5nXVxuIiwKKyAgICAgICAgICAgICAgIGJ1ZmZlci0+aW5kZXgsIGJ1ZmZlciwgYnVmZmVyLT5wdHMsIGF0b21pY19sb2FkKCZjdHgtPmh3X2J1ZmZlcl9jb3VudCkpOworICAgICAgICBmZl9BTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyKGN0eC0+Y29kZWMsIGJ1ZmZlci0+aW5kZXgsIDApOworICAgIH0KKworICAgIGlmIChjdHgtPmRlbGF5X2ZsdXNoKQorICAgICAgICBmZl9tZWRpYWNvZGVjX2RlY191bnJlZihjdHgpOworICAgIGF2X2ZyZWVwKCZidWZmZXIpOworfQorCitzdGF0aWMgaW50IG1lZGlhY29kZWNfd3JhcF9od19idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNEZWNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgQVZNZWRpYUNvZGVjQnVmZmVyICpidWZmZXIgPSBOVUxMOworCisgICAgZnJhbWUtPmJ1ZlswXSA9IE5VTEw7CisgICAgZnJhbWUtPndpZHRoID0gYXZjdHgtPndpZHRoOworICAgIGZyYW1lLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworICAgIGZyYW1lLT5mb3JtYXQgPSBhdmN0eC0+cGl4X2ZtdDsKKyAgICBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvOworCisgICAgaWYgKGF2Y3R4LT5wa3RfdGltZWJhc2UubnVtICYmIGF2Y3R4LT5wa3RfdGltZWJhc2UuZGVuKSB7CisgICAgICAgIGZyYW1lLT5wdHMgPSBhdl9yZXNjYWxlX3EoaW5mby0+cHJlc2VudGF0aW9uVGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBrdF90aW1lYmFzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWUtPnB0cyA9IGluZm8tPnByZXNlbnRhdGlvblRpbWVVczsKKyAgICB9CisjaWYgRkZfQVBJX1BLVF9QVFMKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBmcmFtZS0+cGt0X3B0cyA9IGZyYW1lLT5wdHM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorICAgIGZyYW1lLT5wa3RfZHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBidWZmZXIgPSBhdl9tYWxsb2N6KHNpemVvZihBVk1lZGlhQ29kZWNCdWZmZXIpKTsKKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdG9taWNfaW5pdCgmYnVmZmVyLT5yZWxlYXNlZCwgMCk7CisKKyAgICBmcmFtZS0+YnVmWzBdID0gYXZfYnVmZmVyX2NyZWF0ZShOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFjb2RlY19idWZmZXJfcmVsZWFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQlVGRkVSX0ZMQUdfUkVBRE9OTFkpOworCisgICAgaWYgKCFmcmFtZS0+YnVmWzBdKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworCisgICAgfQorCisgICAgYnVmZmVyLT5jdHggPSBzOworICAgIGJ1ZmZlci0+c2VyaWFsID0gYXRvbWljX2xvYWQoJnMtPnNlcmlhbCk7CisgICAgaWYgKHMtPmRlbGF5X2ZsdXNoKQorICAgICAgICBmZl9tZWRpYWNvZGVjX2RlY19yZWYocyk7CisKKyAgICBidWZmZXItPmluZGV4ID0gaW5kZXg7CisgICAgYnVmZmVyLT5wdHMgPSBpbmZvLT5wcmVzZW50YXRpb25UaW1lVXM7CisKKyAgICBmcmFtZS0+ZGF0YVszXSA9ICh1aW50OF90ICopYnVmZmVyOworCisgICAgYXRvbWljX2ZldGNoX2FkZCgmcy0+aHdfYnVmZmVyX2NvdW50LCAxKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICJXcmFwcGluZyBvdXRwdXQgYnVmZmVyICV6ZCAoJXApIHRzPSUiUFJJZDY0IiBbJWQgcGVuZGluZ11cbiIsCisgICAgICAgICAgICBidWZmZXItPmluZGV4LCBidWZmZXIsIGJ1ZmZlci0+cHRzLCBhdG9taWNfbG9hZCgmcy0+aHdfYnVmZmVyX2NvdW50KSk7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfZnJlZXAoYnVmZmVyKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5idWZbMF0pOworICAgIHN0YXR1cyA9IGZmX0FNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIocy0+Y29kZWMsIGluZGV4LCAwKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlIG91dHB1dCBidWZmZXJcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWVkaWFjb2RlY193cmFwX3N3X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCByZXQgPSAwOworICAgIGludCBzdGF0dXMgPSAwOworCisgICAgZnJhbWUtPndpZHRoID0gYXZjdHgtPndpZHRoOworICAgIGZyYW1lLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworICAgIGZyYW1lLT5mb3JtYXQgPSBhdmN0eC0+cGl4X2ZtdDsKKworICAgIC8qIE1lZGlhQ29kZWMgYnVmZmVycyBuZWVkcyB0byBiZSBjb3BpZWQgdG8gb3VyIG93biByZWZjb3VudGVkIGJ1ZmZlcnMKKyAgICAgKiBiZWNhdXNlIHRoZSBmbHVzaCBjb21tYW5kIGludmFsaWRhdGVzIGFsbCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMuCisgICAgICovCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgLyogT3ZlcnJpZGUgZnJhbWUtPnBrdF9wdHMgYXMgZmZfZ2V0X2J1ZmZlciB3aWxsIG92ZXJyaWRlIGl0cyB2YWx1ZSBiYXNlZAorICAgICAqIG9uIHRoZSBsYXN0IGF2cGFja2V0IHJlY2VpdmVkIHdoaWNoIGlzIG5vdCBpbiBzeW5jIHdpdGggdGhlIGZyYW1lOgorICAgICAqICAgKiBOIGF2cGFja2V0cyBjYW4gYmUgcHVzaGVkIGJlZm9yZSAxIGZyYW1lIGlzIGFjdHVhbGx5IHJldHVybmVkCisgICAgICogICAqIDAtc2l6ZWQgYXZwYWNrZXRzIGFyZSBwdXNoZWQgdG8gZmx1c2ggcmVtYWluaW5nIGZyYW1lcyBhdCBFT1MgKi8KKyAgICBpZiAoYXZjdHgtPnBrdF90aW1lYmFzZS5udW0gJiYgYXZjdHgtPnBrdF90aW1lYmFzZS5kZW4pIHsKKyAgICAgICAgZnJhbWUtPnB0cyA9IGF2X3Jlc2NhbGVfcShpbmZvLT5wcmVzZW50YXRpb25UaW1lVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGt0X3RpbWViYXNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZS0+cHRzID0gaW5mby0+cHJlc2VudGF0aW9uVGltZVVzOworICAgIH0KKyNpZiBGRl9BUElfUEtUX1BUUworRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGZyYW1lLT5wa3RfcHRzID0gZnJhbWUtPnB0czsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgZnJhbWUtPnBrdF9kdHMgPSBBVl9OT1BUU19WQUxVRTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1RSQUNFLAorICAgICAgICAgICAgIkZyYW1lOiB3aWR0aD0lZCBzdHJpZGU9JWQgaGVpZ2h0PSVkIHNsaWNlLWhlaWdodD0lZCAiCisgICAgICAgICAgICAiY3JvcC10b3A9JWQgY3JvcC1ib3R0b209JWQgY3JvcC1sZWZ0PSVkIGNyb3AtcmlnaHQ9JWQgZW5jb2Rlcj0lc1xuIgorICAgICAgICAgICAgImRlc3RpbmF0aW9uIGxpbmVzaXplcz0lZCwlZCwlZFxuIiAsCisgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIHMtPnN0cmlkZSwgYXZjdHgtPmhlaWdodCwgcy0+c2xpY2VfaGVpZ2h0LAorICAgICAgICAgICAgcy0+Y3JvcF90b3AsIHMtPmNyb3BfYm90dG9tLCBzLT5jcm9wX2xlZnQsIHMtPmNyb3BfcmlnaHQsIHMtPmNvZGVjX25hbWUsCisgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0sIGZyYW1lLT5saW5lc2l6ZVsxXSwgZnJhbWUtPmxpbmVzaXplWzJdKTsKKworICAgIHN3aXRjaCAocy0+Y29sb3JfZm9ybWF0KSB7CisgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIGZmX21lZGlhY29kZWNfc3dfYnVmZmVyX2NvcHlfeXV2NDIwX3BsYW5hcihhdmN0eCwgcywgZGF0YSwgc2l6ZSwgaW5mbywgZnJhbWUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgY2FzZSBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgY2FzZSBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIzMm06CisgICAgICAgIGZmX21lZGlhY29kZWNfc3dfYnVmZmVyX2NvcHlfeXV2NDIwX3NlbWlfcGxhbmFyKGF2Y3R4LCBzLCBkYXRhLCBzaXplLCBpbmZvLCBmcmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JfVElfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKKyAgICBjYXNlIENPTE9SX1RJX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXJJbnRlcmxhY2VkOgorICAgICAgICBmZl9tZWRpYWNvZGVjX3N3X2J1ZmZlcl9jb3B5X3l1djQyMF9wYWNrZWRfc2VtaV9wbGFuYXIoYXZjdHgsIHMsIGRhdGEsIHNpemUsIGluZm8sIGZyYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI2NHgzMlRpbGUybThrYToKKyAgICAgICAgZmZfbWVkaWFjb2RlY19zd19idWZmZXJfY29weV95dXY0MjBfcGFja2VkX3NlbWlfcGxhbmFyXzY0eDMyVGlsZTJtOGthKGF2Y3R4LCBzLCBkYXRhLCBzaXplLCBpbmZvLCBmcmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY29sb3IgZm9ybWF0IDB4JXggKHZhbHVlPSVkKVxuIiwKKyAgICAgICAgICAgIHMtPmNvbG9yX2Zvcm1hdCwgcy0+Y29sb3JfZm9ybWF0KTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisgICAgcmV0ID0gMDsKK2RvbmU6CisgICAgc3RhdHVzID0gZmZfQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihzLT5jb2RlYywgaW5kZXgsIDApOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2Ugb3V0cHV0IGJ1ZmZlclxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBBTUVESUFGT1JNQVRfR0VUX0lOVDMyKG5hbWUsIGtleSwgbWFuZGF0b3J5KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludDMyX3QgdmFsdWUgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChmZl9BTWVkaWFGb3JtYXRfZ2V0SW50MzIocy0+Zm9ybWF0LCBrZXksICZ2YWx1ZSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAobmFtZSkgPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSBpZiAobWFuZGF0b3J5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgJXMgZnJvbSBmb3JtYXQgJXNcbiIsIGtleSwgZm9ybWF0KTsgXAorICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitzdGF0aWMgaW50IG1lZGlhY29kZWNfZGVjX3BhcnNlX2Zvcm1hdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIE1lZGlhQ29kZWNEZWNDb250ZXh0ICpzKQoreworICAgIGludCByZXQgPSAwOworICAgIGludCB3aWR0aCA9IDA7CisgICAgaW50IGhlaWdodCA9IDA7CisgICAgY2hhciAqZm9ybWF0ID0gTlVMTDsKKworICAgIGlmICghcy0+Zm9ybWF0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT3V0cHV0IE1lZGlhRm9ybWF0IGlzIG5vdCBzZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZvcm1hdCA9IGZmX0FNZWRpYUZvcm1hdF90b1N0cmluZyhzLT5mb3JtYXQpOworICAgIGlmICghZm9ybWF0KSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlBhcnNpbmcgTWVkaWFGb3JtYXQgJXNcbiIsIGZvcm1hdCk7CisKKyAgICAvKiBNYW5kYXRvcnkgZmllbGRzICovCisgICAgQU1FRElBRk9STUFUX0dFVF9JTlQzMihzLT53aWR0aCwgICJ3aWR0aCIsIDEpOworICAgIEFNRURJQUZPUk1BVF9HRVRfSU5UMzIocy0+aGVpZ2h0LCAiaGVpZ2h0IiwgMSk7CisKKyAgICBBTUVESUFGT1JNQVRfR0VUX0lOVDMyKHMtPnN0cmlkZSwgInN0cmlkZSIsIDApOworICAgIHMtPnN0cmlkZSA9IHMtPnN0cmlkZSA+IDAgPyBzLT5zdHJpZGUgOiBzLT53aWR0aDsKKworICAgIEFNRURJQUZPUk1BVF9HRVRfSU5UMzIocy0+c2xpY2VfaGVpZ2h0LCAic2xpY2UtaGVpZ2h0IiwgMCk7CisKKyAgICBpZiAoc3Ryc3RyKHMtPmNvZGVjX25hbWUsICJPTVguTnZpZGlhLiIpICYmIHMtPnNsaWNlX2hlaWdodCA9PSAwKSB7CisgICAgICAgIHMtPnNsaWNlX2hlaWdodCA9IEZGQUxJR04ocy0+aGVpZ2h0LCAxNik7CisgICAgfSBlbHNlIGlmIChzdHJzdHIocy0+Y29kZWNfbmFtZSwgIk9NWC5TRUMuYXZjLmRlYyIpKSB7CisgICAgICAgIHMtPnNsaWNlX2hlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgICAgIHMtPnN0cmlkZSA9IGF2Y3R4LT53aWR0aDsKKyAgICB9IGVsc2UgaWYgKHMtPnNsaWNlX2hlaWdodCA9PSAwKSB7CisgICAgICAgIHMtPnNsaWNlX2hlaWdodCA9IHMtPmhlaWdodDsKKyAgICB9CisKKyAgICBBTUVESUFGT1JNQVRfR0VUX0lOVDMyKHMtPmNvbG9yX2Zvcm1hdCwgImNvbG9yLWZvcm1hdCIsIDEpOworICAgIGF2Y3R4LT5waXhfZm10ID0gbWNkZWNfbWFwX2NvbG9yX2Zvcm1hdChhdmN0eCwgcywgcy0+Y29sb3JfZm9ybWF0KTsKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT3V0cHV0IGNvbG9yIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogT3B0aW9uYWwgZmllbGRzICovCisgICAgQU1FRElBRk9STUFUX0dFVF9JTlQzMihzLT5jcm9wX3RvcCwgICAgImNyb3AtdG9wIiwgICAgMCk7CisgICAgQU1FRElBRk9STUFUX0dFVF9JTlQzMihzLT5jcm9wX2JvdHRvbSwgImNyb3AtYm90dG9tIiwgMCk7CisgICAgQU1FRElBRk9STUFUX0dFVF9JTlQzMihzLT5jcm9wX2xlZnQsICAgImNyb3AtbGVmdCIsICAgMCk7CisgICAgQU1FRElBRk9STUFUX0dFVF9JTlQzMihzLT5jcm9wX3JpZ2h0LCAgImNyb3AtcmlnaHQiLCAgMCk7CisKKyAgICB3aWR0aCA9IHMtPmNyb3BfcmlnaHQgKyAxIC0gcy0+Y3JvcF9sZWZ0OworICAgIGhlaWdodCA9IHMtPmNyb3BfYm90dG9tICsgMSAtIHMtPmNyb3BfdG9wOworCisgICAgQU1FRElBRk9STUFUX0dFVF9JTlQzMihzLT5kaXNwbGF5X3dpZHRoLCAgImRpc3BsYXktd2lkdGgiLCAgMCk7CisgICAgQU1FRElBRk9STUFUX0dFVF9JTlQzMihzLT5kaXNwbGF5X2hlaWdodCwgImRpc3BsYXktaGVpZ2h0IiwgMCk7CisKKyAgICBpZiAocy0+ZGlzcGxheV93aWR0aCAmJiBzLT5kaXNwbGF5X2hlaWdodCkgeworICAgICAgICBBVlJhdGlvbmFsIHNhciA9IGF2X2Rpdl9xKAorICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyBzLT5kaXNwbGF5X3dpZHRoLCBzLT5kaXNwbGF5X2hlaWdodCB9LAorICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyB3aWR0aCwgaGVpZ2h0IH0pOworICAgICAgICBmZl9zZXRfc2FyKGF2Y3R4LCBzYXIpOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICJPdXRwdXQgY3JvcCBwYXJhbWV0ZXJzIHRvcD0lZCBib3R0b209JWQgbGVmdD0lZCByaWdodD0lZCwgIgorICAgICAgICAicmVzdWx0aW5nIGRpbWVuc2lvbnMgd2lkdGg9JWQgaGVpZ2h0PSVkXG4iLAorICAgICAgICBzLT5jcm9wX3RvcCwgcy0+Y3JvcF9ib3R0b20sIHMtPmNyb3BfbGVmdCwgcy0+Y3JvcF9yaWdodCwKKyAgICAgICAgd2lkdGgsIGhlaWdodCk7CisKKyAgICBhdl9mcmVlcCgmZm9ybWF0KTsKKyAgICByZXR1cm4gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHdpZHRoLCBoZWlnaHQpOworZmFpbDoKKyAgICBhdl9mcmVlcCgmZm9ybWF0KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1lZGlhY29kZWNfZGVjX2ZsdXNoX2NvZGVjKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMpCit7CisgICAgRkZBTWVkaWFDb2RlYyAqY29kZWMgPSBzLT5jb2RlYzsKKyAgICBpbnQgc3RhdHVzOworCisgICAgcy0+b3V0cHV0X2J1ZmZlcl9jb3VudCA9IDA7CisKKyAgICBzLT5kcmFpbmluZyA9IDA7CisgICAgcy0+Zmx1c2hpbmcgPSAwOworICAgIHMtPmVvcyA9IDA7CisgICAgYXRvbWljX2ZldGNoX2FkZCgmcy0+c2VyaWFsLCAxKTsKKyAgICBhdG9taWNfaW5pdCgmcy0+aHdfYnVmZmVyX2NvdW50LCAwKTsKKyAgICBzLT5jdXJyZW50X2lucHV0X2J1ZmZlciA9IC0xOworCisgICAgc3RhdHVzID0gZmZfQU1lZGlhQ29kZWNfZmx1c2goY29kZWMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGZsdXNoIGNvZGVjXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9tZWRpYWNvZGVjX2RlY19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lLCBGRkFNZWRpYUZvcm1hdCAqZm9ybWF0KQoreworICAgIGludCByZXQgPSAwOworICAgIGludCBzdGF0dXM7CisgICAgaW50IHByb2ZpbGU7CisKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfTUVESUFDT0RFQywKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FLAorICAgIH07CisKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIGF0b21pY19pbml0KCZzLT5yZWZjb3VudCwgMSk7CisgICAgYXRvbWljX2luaXQoJnMtPmh3X2J1ZmZlcl9jb3VudCwgMCk7CisgICAgYXRvbWljX2luaXQoJnMtPnNlcmlhbCwgMSk7CisgICAgcy0+Y3VycmVudF9pbnB1dF9idWZmZXIgPSAtMTsKKworICAgIHBpeF9mbXQgPSBmZl9nZXRfZm9ybWF0KGF2Y3R4LCBwaXhfZm10cyk7CisgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NRURJQUNPREVDKSB7CisgICAgICAgIEFWTWVkaWFDb2RlY0NvbnRleHQgKnVzZXJfY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKworICAgICAgICBpZiAoYXZjdHgtPmh3X2RldmljZV9jdHgpIHsKKyAgICAgICAgICAgIEFWSFdEZXZpY2VDb250ZXh0ICpkZXZpY2VfY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0KikoYXZjdHgtPmh3X2RldmljZV9jdHgtPmRhdGEpOworICAgICAgICAgICAgaWYgKGRldmljZV9jdHgtPnR5cGUgPT0gQVZfSFdERVZJQ0VfVFlQRV9NRURJQUNPREVDKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9jdHgtPmh3Y3R4KSB7CisgICAgICAgICAgICAgICAgICAgIEFWTWVkaWFDb2RlY0RldmljZUNvbnRleHQgKm1lZGlhY29kZWNfY3R4ID0gKEFWTWVkaWFDb2RlY0RldmljZUNvbnRleHQgKilkZXZpY2VfY3R4LT5od2N0eDsKKyAgICAgICAgICAgICAgICAgICAgcy0+c3VyZmFjZSA9IGZmX21lZGlhY29kZWNfc3VyZmFjZV9yZWYobWVkaWFjb2RlY19jdHgtPnN1cmZhY2UsIGF2Y3R4KTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlVzaW5nIHN1cmZhY2UgJXBcbiIsIHMtPnN1cmZhY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghcy0+c3VyZmFjZSAmJiB1c2VyX2N0eCAmJiB1c2VyX2N0eC0+c3VyZmFjZSkgeworICAgICAgICAgICAgcy0+c3VyZmFjZSA9IGZmX21lZGlhY29kZWNfc3VyZmFjZV9yZWYodXNlcl9jdHgtPnN1cmZhY2UsIGF2Y3R4KTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJVc2luZyBzdXJmYWNlICVwXG4iLCBzLT5zdXJmYWNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb2ZpbGUgPSBmZl9BTWVkaWFDb2RlY1Byb2ZpbGVfZ2V0UHJvZmlsZUZyb21BVkNvZGVjQ29udGV4dChhdmN0eCk7CisgICAgaWYgKHByb2ZpbGUgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVbnN1cHBvcnRlZCBvciB1bmtub3duIHByb2ZpbGVcbiIpOworICAgIH0KKworICAgIHMtPmNvZGVjX25hbWUgPSBmZl9BTWVkaWFDb2RlY0xpc3RfZ2V0Q29kZWNOYW1lQnlUeXBlKG1pbWUsIHByb2ZpbGUsIDAsIGF2Y3R4KTsKKyAgICBpZiAoIXMtPmNvZGVjX25hbWUpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRm91bmQgZGVjb2RlciAlc1xuIiwgcy0+Y29kZWNfbmFtZSk7CisgICAgcy0+Y29kZWMgPSBmZl9BTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShzLT5jb2RlY19uYW1lKTsKKyAgICBpZiAoIXMtPmNvZGVjKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBtZWRpYSBkZWNvZGVyIGZvciB0eXBlICVzIGFuZCBuYW1lICVzXG4iLCBtaW1lLCBzLT5jb2RlY19uYW1lKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHN0YXR1cyA9IGZmX0FNZWRpYUNvZGVjX2NvbmZpZ3VyZShzLT5jb2RlYywgZm9ybWF0LCBzLT5zdXJmYWNlLCBOVUxMLCAwKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICBjaGFyICpkZXNjID0gZmZfQU1lZGlhRm9ybWF0X3RvU3RyaW5nKGZvcm1hdCk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgIkZhaWxlZCB0byBjb25maWd1cmUgY29kZWMgKHN0YXR1cyA9ICVkKSB3aXRoIGZvcm1hdCAlc1xuIiwKKyAgICAgICAgICAgIHN0YXR1cywgZGVzYyk7CisgICAgICAgIGF2X2ZyZWVwKCZkZXNjKTsKKworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgc3RhdHVzID0gZmZfQU1lZGlhQ29kZWNfc3RhcnQocy0+Y29kZWMpOworICAgIGlmIChzdGF0dXMgPCAwKSB7CisgICAgICAgIGNoYXIgKmRlc2MgPSBmZl9BTWVkaWFGb3JtYXRfdG9TdHJpbmcoZm9ybWF0KTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAiRmFpbGVkIHRvIHN0YXJ0IGNvZGVjIChzdGF0dXMgPSAlZCkgd2l0aCBmb3JtYXQgJXNcbiIsCisgICAgICAgICAgICBzdGF0dXMsIGRlc2MpOworICAgICAgICBhdl9mcmVlcCgmZGVzYyk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBzLT5mb3JtYXQgPSBmZl9BTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQocy0+Y29kZWMpOworICAgIGlmIChzLT5mb3JtYXQpIHsKKyAgICAgICAgaWYgKChyZXQgPSBtZWRpYWNvZGVjX2RlY19wYXJzZV9mb3JtYXQoYXZjdHgsIHMpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY29uZmlndXJlIGNvbnRleHRcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJNZWRpYUNvZGVjICVwIHN0YXJ0ZWQgc3VjY2Vzc2Z1bGx5XG4iLCBzLT5jb2RlYyk7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1lZGlhQ29kZWMgJXAgZmFpbGVkIHRvIHN0YXJ0XG4iLCBzLT5jb2RlYyk7CisgICAgZmZfbWVkaWFjb2RlY19kZWNfY2xvc2UoYXZjdHgsIHMpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9tZWRpYWNvZGVjX2RlY19zZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0LCBib29sIHdhaXQpCit7CisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaW50IG5lZWRfZHJhaW5pbmcgPSAwOworICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgc3NpemVfdCBpbmRleCA9IHMtPmN1cnJlbnRfaW5wdXRfYnVmZmVyOworICAgIHNpemVfdCBzaXplOworICAgIEZGQU1lZGlhQ29kZWMgKmNvZGVjID0gcy0+Y29kZWM7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQ2NF90IGlucHV0X2RlcXVldWVfdGltZW91dF91cyA9IHdhaXQgPyBJTlBVVF9ERVFVRVVFX1RJTUVPVVRfVVMgOiAwOworICAgIGludDY0X3QgcHRzOworCisgICAgaWYgKHMtPmZsdXNoaW5nKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGVjb2RlciBpcyBmbHVzaGluZyBhbmQgY2Fubm90IGFjY2VwdCBuZXcgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnRpbCBhbGwgb3V0cHV0IGJ1ZmZlcnMgaGF2ZSBiZWVuIHJlbGVhc2VkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgaWYgKHBrdC0+c2l6ZSA9PSAwKSB7CisgICAgICAgIG5lZWRfZHJhaW5pbmcgPSAxOworICAgIH0KKworICAgIGlmIChzLT5kcmFpbmluZyAmJiBzLT5lb3MpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKworICAgIHdoaWxlIChvZmZzZXQgPCBwa3QtPnNpemUgfHwgKG5lZWRfZHJhaW5pbmcgJiYgIXMtPmRyYWluaW5nKSkgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICBpbmRleCA9IGZmX0FNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihjb2RlYywgaW5wdXRfZGVxdWV1ZV90aW1lb3V0X3VzKTsKKyAgICAgICAgICAgIGlmIChmZl9BTWVkaWFDb2RlY19pbmZvVHJ5QWdhaW5MYXRlcihjb2RlYywgaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJObyBpbnB1dCBidWZmZXIgYXZhaWxhYmxlLCB0cnkgYWdhaW4gbGF0ZXJcbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVxdWV1ZSBpbnB1dCBidWZmZXIgKHN0YXR1cz0lemQpXG4iLCBpbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcy0+Y3VycmVudF9pbnB1dF9idWZmZXIgPSAtMTsKKworICAgICAgICBkYXRhID0gZmZfQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoY29kZWMsIGluZGV4LCAmc2l6ZSk7CisgICAgICAgIGlmICghZGF0YSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IGlucHV0IGJ1ZmZlclxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorCisgICAgICAgIHB0cyA9IHBrdC0+cHRzOworICAgICAgICBpZiAocHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIGF2Y3R4LT5wa3RfdGltZWJhc2UubnVtICYmIGF2Y3R4LT5wa3RfdGltZWJhc2UuZGVuKSB7CisgICAgICAgICAgICBwdHMgPSBhdl9yZXNjYWxlX3EocHRzLCBhdmN0eC0+cGt0X3RpbWViYXNlLCBBVl9USU1FX0JBU0VfUSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobmVlZF9kcmFpbmluZykgeworICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBmZl9BTWVkaWFDb2RlY19nZXRCdWZmZXJGbGFnRW5kT2ZTdHJlYW0oY29kZWMpOworCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlNlbmRpbmcgRW5kIE9mIFN0cmVhbSBzaWduYWxcbiIpOworCisgICAgICAgICAgICBzdGF0dXMgPSBmZl9BTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKGNvZGVjLCBpbmRleCwgMCwgMCwgcHRzLCBmbGFncyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXVlIGlucHV0IGVtcHR5IGJ1ZmZlciAoc3RhdHVzID0gJWQpXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19UUkFDRSwKKyAgICAgICAgICAgICAgICAgICAiUXVldWVkIGlucHV0IGJ1ZmZlciAlemQgc2l6ZT0lemQgdHM9JSJQUklpNjQiXG4iLCBpbmRleCwgc2l6ZSwgcHRzKTsKKworICAgICAgICAgICAgcy0+ZHJhaW5pbmcgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplID0gRkZNSU4ocGt0LT5zaXplIC0gb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIG1lbWNweShkYXRhLCBwa3QtPmRhdGEgKyBvZmZzZXQsIHNpemUpOworICAgICAgICAgICAgb2Zmc2V0ICs9IHNpemU7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGZmX0FNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIoY29kZWMsIGluZGV4LCAwLCBzaXplLCBwdHMsIDApOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWV1ZSBpbnB1dCBidWZmZXIgKHN0YXR1cyA9ICVkKVxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVFJBQ0UsCisgICAgICAgICAgICAgICAgICAgIlF1ZXVlZCBpbnB1dCBidWZmZXIgJXpkIHNpemU9JXpkIHRzPSUiUFJJaTY0IlxuIiwgaW5kZXgsIHNpemUsIHB0cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ID09IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgcmV0dXJuIG9mZnNldDsKK30KKworaW50IGZmX21lZGlhY29kZWNfZGVjX3JlY2VpdmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBNZWRpYUNvZGVjRGVjQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBib29sIHdhaXQpCit7CisgICAgaW50IHJldDsKKyAgICB1aW50OF90ICpkYXRhOworICAgIHNzaXplX3QgaW5kZXg7CisgICAgc2l6ZV90IHNpemU7CisgICAgRkZBTWVkaWFDb2RlYyAqY29kZWMgPSBzLT5jb2RlYzsKKyAgICBGRkFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZvID0geyAwIH07CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQ2NF90IG91dHB1dF9kZXF1ZXVlX3RpbWVvdXRfdXMgPSBPVVRQVVRfREVRVUVVRV9USU1FT1VUX1VTOworCisgICAgaWYgKHMtPmRyYWluaW5nICYmIHMtPmVvcykgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgaWYgKHMtPmRyYWluaW5nKSB7CisgICAgICAgIC8qIElmIHRoZSBjb2RlYyBpcyBmbHVzaGluZyBvciBuZWVkIHRvIGJlIGZsdXNoZWQsIGJsb2NrIGZvciBhIGZhaXIKKyAgICAgICAgICogYW1vdW50IG9mIHRpbWUgdG8gZW5zdXJlIHdlIGdvdCBhIGZyYW1lICovCisgICAgICAgIG91dHB1dF9kZXF1ZXVlX3RpbWVvdXRfdXMgPSBPVVRQVVRfREVRVUVVRV9CTE9DS19USU1FT1VUX1VTOworICAgIH0gZWxzZSBpZiAocy0+b3V0cHV0X2J1ZmZlcl9jb3VudCA9PSAwIHx8ICF3YWl0KSB7CisgICAgICAgIC8qIElmIHRoZSBjb2RlYyBoYXNuJ3QgcHJvZHVjZWQgYW55IGZyYW1lcywgZG8gbm90IGJsb2NrIHNvIHdlCisgICAgICAgICAqIGNhbiBwdXNoIGRhdGEgdG8gaXQgYXMgZmFzdCBhcyBwb3NzaWJsZSwgYW5kIGdldCB0aGUgZmlyc3QKKyAgICAgICAgICogZnJhbWUgKi8KKyAgICAgICAgb3V0cHV0X2RlcXVldWVfdGltZW91dF91cyA9IDA7CisgICAgfQorCisgICAgaW5kZXggPSBmZl9BTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKGNvZGVjLCAmaW5mbywgb3V0cHV0X2RlcXVldWVfdGltZW91dF91cyk7CisgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJHb3Qgb3V0cHV0IGJ1ZmZlciAlemQiCisgICAgICAgICAgICAgICAgIiBvZmZzZXQ9JSIgUFJJaTMyICIgc2l6ZT0lIiBQUklpMzIgIiB0cz0lIiBQUklpNjQKKyAgICAgICAgICAgICAgICAiIGZsYWdzPSUiIFBSSXUzMiAiXG4iLCBpbmRleCwgaW5mby5vZmZzZXQsIGluZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICBpbmZvLnByZXNlbnRhdGlvblRpbWVVcywgaW5mby5mbGFncyk7CisKKyAgICAgICAgaWYgKGluZm8uZmxhZ3MgJiBmZl9BTWVkaWFDb2RlY19nZXRCdWZmZXJGbGFnRW5kT2ZTdHJlYW0oY29kZWMpKSB7CisgICAgICAgICAgICBzLT5lb3MgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluZm8uc2l6ZSkgeworICAgICAgICAgICAgaWYgKHMtPnN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG1lZGlhY29kZWNfd3JhcF9od19idWZmZXIoYXZjdHgsIHMsIGluZGV4LCAmaW5mbywgZnJhbWUpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd3JhcCBNZWRpYUNvZGVjIGJ1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhID0gZmZfQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKGNvZGVjLCBpbmRleCwgJnNpemUpOworICAgICAgICAgICAgICAgIGlmICghZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgb3V0cHV0IGJ1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gbWVkaWFjb2RlY193cmFwX3N3X2J1ZmZlcihhdmN0eCwgcywgZGF0YSwgc2l6ZSwgaW5kZXgsICZpbmZvLCBmcmFtZSkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB3cmFwIE1lZGlhQ29kZWMgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMtPm91dHB1dF9idWZmZXJfY291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdHVzID0gZmZfQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihjb2RlYywgaW5kZXgsIDApOworICAgICAgICAgICAgaWYgKHN0YXR1cyA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlIG91dHB1dCBidWZmZXJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGZmX0FNZWRpYUNvZGVjX2luZm9PdXRwdXRGb3JtYXRDaGFuZ2VkKGNvZGVjLCBpbmRleCkpIHsKKyAgICAgICAgY2hhciAqZm9ybWF0ID0gTlVMTDsKKworICAgICAgICBpZiAocy0+Zm9ybWF0KSB7CisgICAgICAgICAgICBzdGF0dXMgPSBmZl9BTWVkaWFGb3JtYXRfZGVsZXRlKHMtPmZvcm1hdCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlbGV0ZSBNZWRpYUZvcm1hdCAlcFxuIiwgcy0+Zm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHMtPmZvcm1hdCA9IGZmX0FNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChjb2RlYyk7CisgICAgICAgIGlmICghcy0+Zm9ybWF0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgb3V0cHV0IGZvcm1hdFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorCisgICAgICAgIGZvcm1hdCA9IGZmX0FNZWRpYUZvcm1hdF90b1N0cmluZyhzLT5mb3JtYXQpOworICAgICAgICBpZiAoIWZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIk91dHB1dCBNZWRpYUZvcm1hdCBjaGFuZ2VkIHRvICVzXG4iLCBmb3JtYXQpOworICAgICAgICBhdl9mcmVlcCgmZm9ybWF0KTsKKworICAgICAgICBpZiAoKHJldCA9IG1lZGlhY29kZWNfZGVjX3BhcnNlX2Zvcm1hdChhdmN0eCwgcykpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIGlmIChmZl9BTWVkaWFDb2RlY19pbmZvT3V0cHV0QnVmZmVyc0NoYW5nZWQoY29kZWMsIGluZGV4KSkgeworICAgICAgICBmZl9BTWVkaWFDb2RlY19jbGVhbk91dHB1dEJ1ZmZlcnMoY29kZWMpOworICAgIH0gZWxzZSBpZiAoZmZfQU1lZGlhQ29kZWNfaW5mb1RyeUFnYWluTGF0ZXIoY29kZWMsIGluZGV4KSkgeworICAgICAgICBpZiAocy0+ZHJhaW5pbmcpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlcXVldWUgb3V0cHV0IGJ1ZmZlciB3aXRoaW4gJSIgUFJJaTY0ICJtcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWxlIGRyYWluaW5nIHJlbWFpbmluZyBmcmFtZXMsIG91dHB1dCB3aWxsIHByb2JhYmx5IGxhY2sgZnJhbWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kZXF1ZXVlX3RpbWVvdXRfdXMgLyAxMDAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1RSQUNFLCAiTm8gb3V0cHV0IGJ1ZmZlciBhdmFpbGFibGUsIHRyeSBhZ2FpbiBsYXRlclxuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBkZXF1ZXVlIG91dHB1dCBidWZmZXIgKHN0YXR1cz0lemQpXG4iLCBpbmRleCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Cit9CisKKy8qCisqIGZmX21lZGlhY29kZWNfZGVjX2ZsdXNoIHJldHVybnMgMCBpZiB0aGUgZmx1c2ggY2Fubm90IGJlIHBlcmZvcm1lZCBvbgorKiB0aGUgY29kZWMgKGJlY2F1c2UgdGhlIHVzZXIgcmV0YWlucyBmcmFtZXMpLiBUaGUgY29kZWMgc3RheXMgaW4gdGhlCisqIGZsdXNoaW5nIHN0YXRlLgorKgorKiBmZl9tZWRpYWNvZGVjX2RlY19mbHVzaCByZXR1cm5zIDEgaWYgdGhlIGZsdXNoIGNhbiBhY3R1YWxseSBiZQorKiBwZXJmb3JtZWQgb24gdGhlIGNvZGVjLiBUaGUgY29kZWMgbGVhdmVzIHRoZSBmbHVzaGluZyBzdGF0ZSBhbmQgY2FuCisqIHByb2Nlc3MgYWdhaW4gcGFja2V0cy4KKyoKKyogZmZfbWVkaWFjb2RlY19kZWNfZmx1c2ggcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIGFuIGVycm9yIGhhcworKiBvY2N1cnJlZC4KKyovCitpbnQgZmZfbWVkaWFjb2RlY19kZWNfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBNZWRpYUNvZGVjRGVjQ29udGV4dCAqcykKK3sKKyAgICBpZiAoIXMtPnN1cmZhY2UgfHwgYXRvbWljX2xvYWQoJnMtPnJlZmNvdW50KSA9PSAxKSB7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgLyogTm8gZnJhbWVzIChob2xkaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBjb2RlYykgYXJlIHJldGFpbmVkIGJ5IHRoZQorICAgICAgICAgKiB1c2VyLCB0aHVzIHdlIGNhbiBmbHVzaCB0aGUgY29kZWMgYW5kIHJldHVybnMgYWNjb3JkaW5nbHkgKi8KKyAgICAgICAgaWYgKChyZXQgPSBtZWRpYWNvZGVjX2RlY19mbHVzaF9jb2RlYyhhdmN0eCwgcykpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHMtPmZsdXNoaW5nID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX21lZGlhY29kZWNfZGVjX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMpCit7CisgICAgZmZfbWVkaWFjb2RlY19kZWNfdW5yZWYocyk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX21lZGlhY29kZWNfZGVjX2lzX2ZsdXNoaW5nKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMpCit7CisgICAgcmV0dXJuIHMtPmZsdXNoaW5nOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tZWRpYWNvZGVjZGVjX2NvbW1vbi5oIGIvbGliYXZjb2RlYy9tZWRpYWNvZGVjZGVjX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjExMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21lZGlhY29kZWNkZWNfY29tbW9uLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBBbmRyb2lkIE1lZGlhQ29kZWMgZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNS0yMDE2IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uIHN0dXBlZmxpeC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NRURJQUNPREVDREVDX0NPTU1PTl9ICisjZGVmaW5lIEFWQ09ERUNfTUVESUFDT0RFQ0RFQ19DT01NT05fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm1lZGlhY29kZWNfd3JhcHBlci5oIgorCit0eXBlZGVmIHN0cnVjdCBNZWRpYUNvZGVjRGVjQ29udGV4dCB7CisKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgYXRvbWljX2ludCByZWZjb3VudDsKKyAgICBhdG9taWNfaW50IGh3X2J1ZmZlcl9jb3VudDsKKworICAgIGNoYXIgKmNvZGVjX25hbWU7CisKKyAgICBGRkFNZWRpYUNvZGVjICpjb2RlYzsKKyAgICBGRkFNZWRpYUZvcm1hdCAqZm9ybWF0OworCisgICAgdm9pZCAqc3VyZmFjZTsKKworICAgIGludCBzdGFydGVkOworICAgIGludCBkcmFpbmluZzsKKyAgICBpbnQgZmx1c2hpbmc7CisgICAgaW50IGVvczsKKworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCBzdHJpZGU7CisgICAgaW50IHNsaWNlX2hlaWdodDsKKyAgICBpbnQgY29sb3JfZm9ybWF0OworICAgIGludCBjcm9wX3RvcDsKKyAgICBpbnQgY3JvcF9ib3R0b207CisgICAgaW50IGNyb3BfbGVmdDsKKyAgICBpbnQgY3JvcF9yaWdodDsKKyAgICBpbnQgZGlzcGxheV93aWR0aDsKKyAgICBpbnQgZGlzcGxheV9oZWlnaHQ7CisKKyAgICB1aW50NjRfdCBvdXRwdXRfYnVmZmVyX2NvdW50OworICAgIHNzaXplX3QgY3VycmVudF9pbnB1dF9idWZmZXI7CisKKyAgICBib29sIGRlbGF5X2ZsdXNoOworICAgIGF0b21pY19pbnQgc2VyaWFsOworCit9IE1lZGlhQ29kZWNEZWNDb250ZXh0OworCitpbnQgZmZfbWVkaWFjb2RlY19kZWNfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjRGVjQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKKworaW50IGZmX21lZGlhY29kZWNfZGVjX3NlbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3YWl0KTsKKworaW50IGZmX21lZGlhY29kZWNfZGVjX3JlY2VpdmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgd2FpdCk7CisKK2ludCBmZl9tZWRpYWNvZGVjX2RlY19mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb2RlY0RlY0NvbnRleHQgKnMpOworCitpbnQgZmZfbWVkaWFjb2RlY19kZWNfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNEZWNDb250ZXh0ICpzKTsKKworaW50IGZmX21lZGlhY29kZWNfZGVjX2lzX2ZsdXNoaW5nKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjRGVjQ29udGV4dCAqcyk7CisKK3R5cGVkZWYgc3RydWN0IE1lZGlhQ29kZWNCdWZmZXIgeworCisgICAgTWVkaWFDb2RlY0RlY0NvbnRleHQgKmN0eDsKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGludDY0X3QgcHRzOworICAgIGF0b21pY19pbnQgcmVsZWFzZWQ7CisgICAgaW50IHNlcmlhbDsKKworfSBNZWRpYUNvZGVjQnVmZmVyOworCisjZW5kaWYgLyogQVZDT0RFQ19NRURJQUNPREVDREVDX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21ldGFzb3VuZC5jIGIvbGliYXZjb2RlYy9tZXRhc291bmQuYwppbmRleCA1YTdmNGMzLi44N2NkN2NiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21ldGFzb3VuZC5jCisrKyBiL2xpYmF2Y29kZWMvbWV0YXNvdW5kLmMKQEAgLTI1LDEyICsyNSwxMyBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKICNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibHNwLmgiCiAjaW5jbHVkZSAic2luZXdpbi5oIgpAQCAtMTY5LDkgKzE3MCwxMCBAQAogICAgIGludCBjaGFubmVscyAgICAgICAgICAgICAgPSB0Y3R4LT5hdmN0eC0+Y2hhbm5lbHM7CiAgICAgaW50IHN1YjsKICAgICBHZXRCaXRDb250ZXh0IGdiOwotICAgIGludCBpLCBqLCBrOworICAgIGludCBpLCBqLCBrLCByZXQ7CiAKLSAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCBidWZfc2l6ZSAqIDgpOworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgZm9yICh0Y3R4LT5jdXJfZnJhbWUgPSAwOyB0Y3R4LT5jdXJfZnJhbWUgPCB0Y3R4LT5mcmFtZXNfcGVyX3BhY2tldDsKICAgICAgICAgIHRjdHgtPmN1cl9mcmFtZSsrKSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21ldGFzb3VuZF9kYXRhLmMgYi9saWJhdmNvZGVjL21ldGFzb3VuZF9kYXRhLmMKaW5kZXggNmQ4NzExNy4uZGEyNTQ4YSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tZXRhc291bmRfZGF0YS5jCisrKyBiL2xpYmF2Y29kZWMvbWV0YXNvdW5kX2RhdGEuYwpAQCAtMTQ5NDYsMTEgKzE0OTQ2LDYgQEAKICAgICAyLCAyLCAyLCAzLCAzLCA1LCA3LCAxMiwgMjUsIDY3CiB9OwogCi0vKiB1bnVzZWQKLXN0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9zMTZfNjRbXSA9IHsKLSAgICAxLCAxLCAyLCAyLCAzLCA2LCAxMSwgMzgKLX07ICovCi0KIHN0YXRpYyBjb25zdCB1aW50MTZfdCBiYXJrX3RhYl9sMTZzXzEwMjRbXSA9IHsKICAgICAgIDksICAgOSwgICA4LCAgIDksICAxMCwgICA5LCAgMTAsICAxMCwKICAgICAgMTAsICAxMiwgIDExLCAgMTMsICAxMywgIDE0LCAgMTYsICAxNywKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWljcm9kdmRkZWMuYyBiL2xpYmF2Y29kZWMvbWljcm9kdmRkZWMuYwppbmRleCA0NmQ2ZDE0Li40YTM0MjY3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pY3JvZHZkZGVjLmMKKysrIGIvbGliYXZjb2RlYy9taWNyb2R2ZGRlYy5jCkBAIC0yMTQsNyArMjE0LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgICAgYXZfYnByaW50ZihuZXdfbGluZSwgIntcXGMmSCUwNlgmfSIsIHRhZ3NbaV0uZGF0YTEpOworICAgICAgICAgICAgYXZfYnByaW50ZihuZXdfbGluZSwgIntcXGMmSCUwNiJQUklYMzIiJn0iLCB0YWdzW2ldLmRhdGExKTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgJ2YnOgpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgIGF2X2JwcmludGYobmV3X2xpbmUsICJ7XFxmcyVkfSIsIHRhZ3NbaV0uZGF0YTEpOworICAgICAgICAgICAgYXZfYnByaW50ZihuZXdfbGluZSwgIntcXGZzJSJQUklkMzIifSIsIHRhZ3NbaV0uZGF0YTEpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSAncCc6CkBAIC0yMzIsNyArMjMyLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgICAgYXZfYnByaW50ZihuZXdfbGluZSwgIntcXHBvcyglZCwlZCl9IiwKKyAgICAgICAgICAgIGF2X2JwcmludGYobmV3X2xpbmUsICJ7XFxwb3MoJSJQUklkMzIiLCUiUFJJZDMyIil9IiwKICAgICAgICAgICAgICAgICAgICAgICAgdGFnc1tpXS5kYXRhMSwgdGFnc1tpXS5kYXRhMik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjgwLDYgKzI4MCw3IEBACiAgICAgQVZCUHJpbnQgbmV3X2xpbmU7CiAgICAgY2hhciAqbGluZSA9IGF2cGt0LT5kYXRhOwogICAgIGNoYXIgKmVuZCA9IGF2cGt0LT5kYXRhICsgYXZwa3QtPnNpemU7CisgICAgRkZBU1NEZWNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgc3RydWN0IG1pY3JvZHZkX3RhZyB0YWdzW3NpemVvZihNSUNST0RWRF9UQUdTKSAtIDFdID0ge3swfX07CiAKICAgICBpZiAoYXZwa3QtPnNpemUgPD0gMCkKQEAgLTMwOCwxNCArMzA5LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobmV3X2xpbmUubGVuKSB7Ci0gICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgICBpbnQ2NF90IHN0YXJ0ICAgID0gYXZwa3QtPnB0czsKLSAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSBhdnBrdC0+ZHVyYXRpb247Ci0gICAgICAgICAgICBpbnQgdHNfc3RhcnQgICAgID0gYXZfcmVzY2FsZV9xKHN0YXJ0LCAgICBhdmN0eC0+dGltZV9iYXNlLCAoQVZSYXRpb25hbCl7MSwxMDB9KTsKLSAgICAgICAgICAgIGludCB0c19kdXJhdGlvbiAgPSBkdXJhdGlvbiAhPSAtMSA/Ci0gICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGR1cmF0aW9uLCBhdmN0eC0+dGltZV9iYXNlLCAoQVZSYXRpb25hbCl7MSwxMDB9KSA6IC0xOwotCi0gICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmbmV3X2xpbmUsIHRzX3N0YXJ0LCB0c19kdXJhdGlvbik7CisgICAgICAgIGludCByZXQgPSBmZl9hc3NfYWRkX3JlY3Qoc3ViLCBuZXdfbGluZS5zdHIsIHMtPnJlYWRvcmRlcisrLCAwLCBOVUxMLCBOVUxMKTsKICAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZuZXdfbGluZSwgTlVMTCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTM4MSw0ICszNzUsNiBAQAogICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NSUNST0RWRCwKICAgICAuaW5pdCAgICAgICAgID0gbWljcm9kdmRfaW5pdCwKICAgICAuZGVjb2RlICAgICAgID0gbWljcm9kdmRfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgPSBmZl9hc3NfZGVjb2Rlcl9mbHVzaCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZBU1NEZWNvZGVyQ29udGV4dCksCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taW1pYy5jIGIvbGliYXZjb2RlYy9taW1pYy5jCmluZGV4IDA2ZmIzOTMuLjFkNDYzZTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWltaWMuYworKysgYi9saWJhdmNvZGVjL21pbWljLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgIFRocmVhZEZyYW1lICAgICBmcmFtZXMgICAgIFsxNl07CiAKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIGRjdF9ibG9jaylbNjRdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50MTZfdCwgZGN0X2Jsb2NrKVs2NF07CiAKICAgICBHZXRCaXRDb250ZXh0ICAgZ2I7CiAgICAgU2NhblRhYmxlICAgICAgIHNjYW50YWJsZTsKQEAgLTI2MCw5ICsyNjAsOSBAQAogICAgICAgICAvKiBGRm1wZWcncyBJRENUIGJlaGF2ZXMgc29tZXdoYXQgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIGNvZGUsIHNvCiAgICAgICAgICAqIGEgZmFjdG9yIG9mIDQgd2FzIGFkZGVkIHRvIHRoZSBpbnB1dCAqLwogCi0gICAgICAgIGNvZWZmID0gdmxjZGVjX2xvb2t1cFtudW1fYml0c11bdmFsdWVdOworICAgICAgICBjb2VmZiA9ICgoaW50OF90Kil2bGNkZWNfbG9va3VwW251bV9iaXRzXSlbdmFsdWVdOwogICAgICAgICBpZiAocG9zIDwgMykKLSAgICAgICAgICAgIGNvZWZmIDw8PSA0OworICAgICAgICAgICAgY29lZmYgKj0gMTY7CiAgICAgICAgIGVsc2UgLyogVE9ETyBVc2UgPj4gMTAgaW5zdGVhZCBvZiAvIDEwMDEgKi8KICAgICAgICAgICAgIGNvZWZmID0gKGNvZWZmICogcXNjYWxlKSAvIDEwMDE7CiAKQEAgLTM5MCw5ICszOTAsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAKKyAgICAgICAgcmVzID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisKICAgICAgICAgY3R4LT5hdmN0eCAgICAgPSBhdmN0eDsKLSAgICAgICAgYXZjdHgtPndpZHRoICAgPSB3aWR0aDsKLSAgICAgICAgYXZjdHgtPmhlaWdodCAgPSBoZWlnaHQ7CiAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgICAgICBjdHgtPm51bV92YmxvY2tzW2ldID0gQVZfQ0VJTF9SU0hJRlQoaGVpZ2h0LCAgIDMgKyAhIWkpOwpAQCAtNDQ2LDkgKzQ0OCw2IEBACiAgICAgY3R4LT5wcmV2X2luZGV4ID0gY3R4LT5uZXh0X3ByZXZfaW5kZXg7CiAgICAgY3R4LT5jdXJfaW5kZXggID0gY3R4LT5uZXh0X2N1cl9pbmRleDsKIAotICAgIC8qIE9ubHkgcmVsZWFzZSBmcmFtZXMgdGhhdCBhcmVuJ3QgdXNlZCBmb3IgYmFja3JlZmVyZW5jZXMgYW55bW9yZSAqLwotICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJmN0eC0+ZnJhbWVzW2N0eC0+Y3VyX2luZGV4XSk7Ci0KICAgICByZXR1cm4gYnVmX3NpemU7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9NYWtlZmlsZSBiL2xpYmF2Y29kZWMvbWlwcy9NYWtlZmlsZQppbmRleCBmNjYwMTdhLi4xZjY1OWEwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvTWFrZWZpbGUKKysrIGIvbGliYXZjb2RlYy9taXBzL01ha2VmaWxlCkBAIC0zNiw2ICszNiw5IEBACiBPQkpTLSQoQ09ORklHX01QRUdWSURFT0VOQykgICAgICAgICAgICAgICArPSBtaXBzL21wZWd2aWRlb2VuY2RzcF9pbml0X21pcHMubwogT0JKUy0kKENPTkZJR19NRV9DTVApICAgICAgICAgICAgICAgICAgICAgKz0gbWlwcy9tZV9jbXBfaW5pdF9taXBzLm8KIE9CSlMtJChDT05GSUdfTVBFRzRfREVDT0RFUikgICAgICAgICAgICAgICs9IG1pcHMveHZpZGlkY3RfaW5pdF9taXBzLm8KK09CSlMtJChDT05GSUdfVkMxRFNQKSAgICAgICAgICAgICAgICAgICAgICs9IG1pcHMvdmMxZHNwX2luaXRfbWlwcy5vCitPQkpTLSQoQ09ORklHX1dNVjJEU1ApICAgICAgICAgICAgICAgICAgICArPSBtaXBzL3dtdjJkc3BfaW5pdF9taXBzLm8KK09CSlMtJChDT05GSUdfVklERU9EU1ApICAgICAgICAgICAgICAgICAgICs9IG1pcHMvdmlkZW9kc3BfaW5pdC5vCiBNU0EtT0JKUy0kKENPTkZJR19IRVZDX0RFQ09ERVIpICAgICAgICAgICArPSBtaXBzL2hldmNkc3BfbXNhLm8gICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzL2hldmNfbWNfdW5pX21zYS5vICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzL2hldmNfbWNfdW5pd19tc2EubyAgICAgICBcCkBAIC03NywzICs4MCw3IEBACiBNTUktT0JKUy0kKENPTkZJR19CTE9DS0RTUCkgICAgICAgICAgICAgICArPSBtaXBzL2Jsb2NrZHNwX21taS5vCiBNTUktT0JKUy0kKENPTkZJR19QSVhCTE9DS0RTUCkgICAgICAgICAgICArPSBtaXBzL3BpeGJsb2NrZHNwX21taS5vCiBNTUktT0JKUy0kKENPTkZJR19IMjY0UVBFTCkgICAgICAgICAgICAgICArPSBtaXBzL2gyNjRxcGVsX21taS5vCitNTUktT0JKUy0kKENPTkZJR19WUDhfREVDT0RFUikgICAgICAgICAgICArPSBtaXBzL3ZwOGRzcF9tbWkubworTU1JLU9CSlMtJChDT05GSUdfSFBFTERTUCkgICAgICAgICAgICAgICAgKz0gbWlwcy9ocGVsZHNwX21taS5vCitNTUktT0JKUy0kKENPTkZJR19WQzFfREVDT0RFUikgICAgICAgICAgICArPSBtaXBzL3ZjMWRzcF9tbWkubworTU1JLU9CSlMtJChDT05GSUdfV01WMkRTUCkgICAgICAgICAgICAgICAgKz0gbWlwcy93bXYyZHNwX21taS5vCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvYWFjY29kZXJfbWlwcy5jIGIvbGliYXZjb2RlYy9taXBzL2FhY2NvZGVyX21pcHMuYwppbmRleCA4ZmJkZmQyLi5kNjkwYzhjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvYWFjY29kZXJfbWlwcy5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9hYWNjb2Rlcl9taXBzLmMKQEAgLTY2LDYgKzY2LDcgQEAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2FhY2VuY191dGlscy5oIgogCiAjaWYgSEFWRV9JTkxJTkVfQVNNCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKIHR5cGVkZWYgc3RydWN0IEJhbmRDb2RpbmdQYXRoIHsKICAgICBpbnQgcHJldl9pZHg7CiAgICAgZmxvYXQgY29zdDsKQEAgLTI0NzcsMTAgKzI0NzgsMTIgQEAKIAogI2luY2x1ZGUgImxpYmF2Y29kZWMvYWFjY29kZXJfdHJlbGxpcy5oIgogCisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIAogdm9pZCBmZl9hYWNfY29kZXJfaW5pdF9taXBzKEFBQ0VuY0NvbnRleHQgKmMpIHsKICNpZiBIQVZFX0lOTElORV9BU00KKyNpZiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNgogICAgIEFBQ0NvZWZmaWNpZW50c0VuY29kZXIgKmUgPSBjLT5jb2RlcjsKICAgICBpbnQgb3B0aW9uID0gYy0+b3B0aW9ucy5jb2RlcjsKIApAQCAtMjQ5NCw1ICsyNDk3LDYgQEAKICNpZiBIQVZFX01JUFNGUFUKICAgICBlLT5zZWFyY2hfZm9yX21zICAgICAgICAgICAgPSBzZWFyY2hfZm9yX21zX21pcHM7CiAjZW5kaWYgLyogSEFWRV9NSVBTRlBVICovCisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9hYWNkZWNfbWlwcy5oIGIvbGliYXZjb2RlYy9taXBzL2FhY2RlY19taXBzLmgKaW5kZXggYzRmNjQzOC4uNzU4MjY2ZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2FhY2RlY19taXBzLmgKKysrIGIvbGliYXZjb2RlYy9taXBzL2FhY2RlY19taXBzLmgKQEAgLTYxLDYgKzYxLDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9hc21kZWZzLmgiCiAKICNpZiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV9NSVBTRlBVCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKIHN0YXRpYyBpbmxpbmUgZmxvYXQgKlZNVUwyX21pcHMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnYsIHVuc2lnbmVkIGlkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzY2FsZSkKIHsKQEAgLTI0Niw2ICsyNDcsNyBAQAogI2RlZmluZSBWTVVMNCBWTVVMNF9taXBzCiAjZGVmaW5lIFZNVUwyUyBWTVVMMlNfbWlwcwogI2RlZmluZSBWTVVMNFMgVk1VTDRTX21pcHMKKyNlbmRpZiAvKiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNiAqLwogI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFX01JUFNGUFUgKi8KIAogI2VuZGlmIC8qIEFWQ09ERUNfTUlQU19BQUNERUNfTUlQU19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvYWFjcHNkc3BfbWlwcy5jIGIvbGliYXZjb2RlYy9taXBzL2FhY3BzZHNwX21pcHMuYwppbmRleCA2OTVmOWVmLi44M2ZkYzJmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvYWFjcHNkc3BfbWlwcy5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9hYWNwc2RzcF9taXBzLmMKQEAgLTE4OCw2ICsxODgsNyBAQAogfQogCiAjaWYgSEFWRV9NSVBTRlBVCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKIHN0YXRpYyB2b2lkIHBzX2FkZF9zcXVhcmVzX21pcHMoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKCpzcmMpWzJdLCBpbnQgbikKIHsKICAgICBpbnQgaTsKQEAgLTQ0Miw2ICs0NDMsNyBAQAogICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KKyNlbmRpZiAvKiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNiAqLwogI2VuZGlmIC8qIEhBVkVfTUlQU0ZQVSAqLwogI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLwogCkBAIC00NTEsMTAgKzQ1MywxMiBAQAogICAgIHMtPmh5YnJpZF9hbmFseXNpc19pbGVhdmUgPSBwc19oeWJyaWRfYW5hbHlzaXNfaWxlYXZlX21pcHM7CiAgICAgcy0+aHlicmlkX3N5bnRoZXNpc19kZWludCA9IHBzX2h5YnJpZF9zeW50aGVzaXNfZGVpbnRfbWlwczsKICNpZiBIQVZFX01JUFNGUFUKKyNpZiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNgogICAgIHMtPmFkZF9zcXVhcmVzICAgICAgICAgICAgPSBwc19hZGRfc3F1YXJlc19taXBzOwogICAgIHMtPm11bF9wYWlyX3NpbmdsZSAgICAgICAgPSBwc19tdWxfcGFpcl9zaW5nbGVfbWlwczsKICAgICBzLT5kZWNvcnJlbGF0ZSAgICAgICAgICAgID0gcHNfZGVjb3JyZWxhdGVfbWlwczsKICAgICBzLT5zdGVyZW9faW50ZXJwb2xhdGVbMF0gID0gcHNfc3RlcmVvX2ludGVycG9sYXRlX21pcHM7CisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX01JUFNGUFUgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9hYWNwc3lfbWlwcy5oIGIvbGliYXZjb2RlYy9taXBzL2FhY3BzeV9taXBzLmgKaW5kZXggNDJmZjQ0Mi4uYTFmZTVjYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2FhY3BzeV9taXBzLmgKKysrIGIvbGliYXZjb2RlYy9taXBzL2FhY3BzeV9taXBzLmgKQEAgLTU5LDYgKzU5LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9hc21kZWZzLmgiCiAKICNpZiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV9NSVBTRlBVICYmICggUFNZX0xBTUVfRklSX0xFTiA9PSAyMSApCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKIHN0YXRpYyB2b2lkIGNhbGNfdGhyXzNncHBfbWlwcyhjb25zdCBGRlBzeVdpbmRvd0luZm8gKndpLCBjb25zdCBpbnQgbnVtX2JhbmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFhY1BzeUNoYW5uZWwgKnBjaCwgY29uc3QgdWludDhfdCAqYmFuZF9zaXplcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZnMsIGNvbnN0IGludCBjdXRvZmYpCkBAIC0yMzIsNSArMjMzLDYgQEAKICNkZWZpbmUgY2FsY190aHJfM2dwcCBjYWxjX3Rocl8zZ3BwX21pcHMKICNkZWZpbmUgcHN5X2hwX2ZpbHRlciBwc3lfaHBfZmlsdGVyX21pcHMKIAorI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfTUlQU0ZQVSAqLwogI2VuZGlmIC8qIEFWQ09ERUNfTUlQU19BQUNQU1lfTUlQU19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvYWFjc2JyX21pcHMuYyBiL2xpYmF2Y29kZWMvbWlwcy9hYWNzYnJfbWlwcy5jCmluZGV4IGU0NzgyOTAuLjU2YWE0ZTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9hYWNzYnJfbWlwcy5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9hYWNzYnJfbWlwcy5jCkBAIC0zMTEsNiArMzExLDcgQEAKIH0KIAogI2lmIEhBVkVfTUlQU0ZQVQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiBzdGF0aWMgdm9pZCBzYnJfaGZfYXNzZW1ibGVfbWlwcyhmbG9hdCBZMVszOF1bNjRdWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IFhfaGlnaFs2NF1bNDBdWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWN0cmFsQmFuZFJlcGxpY2F0aW9uICpzYnIsIFNCUkRhdGEgKmNoX2RhdGEsCkBAIC02MDMsNiArNjA0LDcgQEAKICAgICAgICAgfQogICAgIH0KIH0KKyNlbmRpZiAvKiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNiAqLwogI2VuZGlmIC8qIEhBVkVfTUlQU0ZQVSAqLwogI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLwogCkBAIC02MTIsOCArNjE0LDEwIEBACiAgICAgYy0+c2JyX2xmX2dlbiAgICAgICAgICAgID0gc2JyX2xmX2dlbl9taXBzOwogICAgIGMtPnNicl94X2dlbiAgICAgICAgICAgICA9IHNicl94X2dlbl9taXBzOwogI2lmIEhBVkVfTUlQU0ZQVQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiAgICAgYy0+c2JyX2hmX2ludmVyc2VfZmlsdGVyID0gc2JyX2hmX2ludmVyc2VfZmlsdGVyX21pcHM7CiAgICAgYy0+c2JyX2hmX2Fzc2VtYmxlICAgICAgID0gc2JyX2hmX2Fzc2VtYmxlX21pcHM7CisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX01JUFNGUFUgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9hYWNzYnJfbWlwcy5oIGIvbGliYXZjb2RlYy9taXBzL2FhY3Nicl9taXBzLmgKaW5kZXggMTNlNTVkMi4uNDQ2MWU3NiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2FhY3Nicl9taXBzLmgKKysrIGIvbGliYXZjb2RlYy9taXBzL2FhY3Nicl9taXBzLmgKQEAgLTE1MCw2ICsxNTAsNyBAQAogfQogCiAjaWYgSEFWRV9NSVBTRlBVCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKIHN0YXRpYyB2b2lkIHNicl9xbWZfc3ludGhlc2lzX21pcHMoRkZUQ29udGV4dCAqbWRjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNCUkRTUENvbnRleHQgKnNicmRzcCwgQVZGbG9hdERTUENvbnRleHQgKmZkc3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0LCBmbG9hdCBYWzJdWzM4XVs2NF0sCkBAIC00ODgsNiArNDg5LDcgQEAKICNkZWZpbmUgc2JyX3FtZl9hbmFseXNpcyBzYnJfcW1mX2FuYWx5c2lzX21pcHMKICNkZWZpbmUgc2JyX3FtZl9zeW50aGVzaXMgc2JyX3FtZl9zeW50aGVzaXNfbWlwcwogCisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX01JUFNGUFUgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2FjM2RzcF9taXBzLmMgYi9saWJhdmNvZGVjL21pcHMvYWMzZHNwX21pcHMuYwppbmRleCBkYTQ5MTlmLi5lNWNlZTE2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvYWMzZHNwX21pcHMuYworKysgYi9saWJhdmNvZGVjL21pcHMvYWMzZHNwX21pcHMuYwpAQCAtMjAxLDYgKzIwMSw3IEBACiAjZW5kaWYKIAogI2lmIEhBVkVfTUlQU0ZQVQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiBzdGF0aWMgdm9pZCBmbG9hdF90b19maXhlZDI0X21pcHMoaW50MzJfdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKQogewogICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gMSA8PCAyNDsKQEAgLTM5NSw3ICszOTYsOCBAQAogICAgICAgICA6Im1lbW9yeSIKICAgICApOwogfQotI2VuZGlmCisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KKyNlbmRpZiAvKiBIQVZFX01JUFNGUFUgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIAogdm9pZCBmZl9hYzNkc3BfaW5pdF9taXBzKEFDM0RTUENvbnRleHQgKmMsIGludCBiaXRfZXhhY3QpIHsKQEAgLTQwNSw5ICs0MDcsMTEgQEAKICAgICBjLT51cGRhdGVfYmFwX2NvdW50cyAgPSBhYzNfdXBkYXRlX2JhcF9jb3VudHNfbWlwczsKICNlbmRpZgogI2lmIEhBVkVfTUlQU0ZQVQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiAgICAgYy0+ZmxvYXRfdG9fZml4ZWQyNCA9IGZsb2F0X3RvX2ZpeGVkMjRfbWlwczsKLSAgICBjLT5kb3dubWl4ICAgICAgICAgID0gYWMzX2Rvd25taXhfbWlwczsKKyAgICAvL2MtPmRvd25taXggICAgICAgICAgPSBhYzNfZG93bm1peF9taXBzOwogI2VuZGlmCiAjZW5kaWYKIAorI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvYWNlbHBfZmlsdGVyc19taXBzLmMgYi9saWJhdmNvZGVjL21pcHMvYWNlbHBfZmlsdGVyc19taXBzLmMKaW5kZXggYmE3ODlhYi4uNDc4ZGI4NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2FjZWxwX2ZpbHRlcnNfbWlwcy5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9hY2VscF9maWx0ZXJzX21pcHMuYwpAQCAtNTcsNiArNTcsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL2FzbWRlZnMuaCIKIAogI2lmIEhBVkVfSU5MSU5FX0FTTQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiBzdGF0aWMgdm9pZCBmZl9hY2VscF9pbnRlcnBvbGF0ZWZfbWlwcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZmlsdGVyX2NvZWZmcywgaW50IHByZWNpc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFjX3BvcywgaW50IGZpbHRlcl9sZW5ndGgsIGludCBsZW5ndGgpCkBAIC0yMDYsMTIgKzIwNywxNSBAQAogICAgICAgICAgICAiJGYxMiIsICIkZjEzIiwgIiRmMTQiLCAiJGYxNSIsICIkZjE2IiwgIm1lbW9yeSIKICAgICApOwogfQorI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCiAKIHZvaWQgZmZfYWNlbHBfZmlsdGVyX2luaXRfbWlwcyhBQ0VMUEZDb250ZXh0ICpjKQogewogI2lmIEhBVkVfSU5MSU5FX0FTTQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiAgICAgYy0+YWNlbHBfaW50ZXJwb2xhdGVmICAgICAgICAgICAgICAgICAgICAgID0gZmZfYWNlbHBfaW50ZXJwb2xhdGVmX21pcHM7CiAgICAgYy0+YWNlbHBfYXBwbHlfb3JkZXJfMl90cmFuc2Zlcl9mdW5jdGlvbiAgID0gZmZfYWNlbHBfYXBwbHlfb3JkZXJfMl90cmFuc2Zlcl9mdW5jdGlvbl9taXBzOwogI2VuZGlmCisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9hY2VscF92ZWN0b3JzX21pcHMuYyBiL2xpYmF2Y29kZWMvbWlwcy9hY2VscF92ZWN0b3JzX21pcHMuYwppbmRleCBhZDk0MzQ4Li4wYWIyYjZhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvYWNlbHBfdmVjdG9yc19taXBzLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2FjZWxwX3ZlY3RvcnNfbWlwcy5jCkBAIC01Nyw2ICs1Nyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL21pcHMvYXNtZGVmcy5oIgogCiAjaWYgSEFWRV9JTkxJTkVfQVNNCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKIHN0YXRpYyB2b2lkIGZmX3dlaWdodGVkX3ZlY3Rvcl9zdW1mX21pcHMoCiAgICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW5fYSwgY29uc3QgZmxvYXQgKmluX2IsCiAgICAgICAgICAgICAgICAgICBmbG9hdCB3ZWlnaHRfY29lZmZfYSwgZmxvYXQgd2VpZ2h0X2NvZWZmX2IsIGludCBsZW5ndGgpCkBAIC05MiwxMSArOTMsMTQgQEAKICAgICAgICAgOiAiJGYwIiwgIiRmMSIsICIkZjIiLCAiJGYzIiwgIiRmNCIsICIkZjUiLCAibWVtb3J5IgogICAgICk7CiB9CisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIAogdm9pZCBmZl9hY2VscF92ZWN0b3JzX2luaXRfbWlwcyhBQ0VMUFZDb250ZXh0ICpjKQogewogI2lmIEhBVkVfSU5MSU5FX0FTTQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiAgICAgYy0+d2VpZ2h0ZWRfdmVjdG9yX3N1bWYgPSBmZl93ZWlnaHRlZF92ZWN0b3Jfc3VtZl9taXBzOwogI2VuZGlmCisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9hbXJ3YmRlY19taXBzLmMgYi9saWJhdmNvZGVjL21pcHMvYW1yd2JkZWNfbWlwcy5jCmluZGV4IGU5MzNiOGEuLjVkYzA1NDMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9hbXJ3YmRlY19taXBzLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2FtcndiZGVjX21pcHMuYwpAQCAtNTQsNiArNTQsNyBAQAogI2luY2x1ZGUgImFtcndiZGVjX21pcHMuaCIKIAogI2lmIEhBVkVfSU5MSU5FX0FTTQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiB2b2lkIGZmX2hiX2Zpcl9maWx0ZXJfbWlwcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCBmaXJfY29lZltIQl9GSVJfU0laRSArIDFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtZW1bSEJfRklSX1NJWkVdLCBjb25zdCBmbG9hdCAqaW4pCiB7CkBAIC0xODQsNCArMTg1LDUgQEAKICAgICB9CiAgICAgbWVtY3B5KG1lbSwgZGF0YSArIEFNUldCX1NGUl9TSVpFXzE2aywgSEJfRklSX1NJWkUgKiBzaXplb2YoZmxvYXQpKTsKIH0KKyNlbmRpZiAvKiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNiAqLwogI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2FtcndiZGVjX21pcHMuaCBiL2xpYmF2Y29kZWMvbWlwcy9hbXJ3YmRlY19taXBzLmgKaW5kZXggZWM0NmY5NS4uYTlmNjZmZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2FtcndiZGVjX21pcHMuaAorKysgYi9saWJhdmNvZGVjL21pcHMvYW1yd2JkZWNfbWlwcy5oCkBAIC01NCw5ICs1NCwxMSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogCiAjaWYgSEFWRV9NSVBTRlBVICYmIEhBVkVfSU5MSU5FX0FTTQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiB2b2lkIGZmX2hiX2Zpcl9maWx0ZXJfbWlwcyhmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCBmaXJfY29lZltdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtZW1bXSwgY29uc3QgZmxvYXQgKmluKTsKICNkZWZpbmUgaGJfZmlyX2ZpbHRlciBmZl9oYl9maXJfZmlsdGVyX21pcHMKICNlbmRpZgorI2VuZGlmCiAKICNlbmRpZiAvKiBBVkNPREVDX01JUFNfQU1SV0JERUNfTUlQU19IICAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2Jsb2NrZHNwX21pcHMuaCBiL2xpYmF2Y29kZWMvbWlwcy9ibG9ja2RzcF9taXBzLmgKaW5kZXggOTU1OWQ0MC4uMTc0MmIxMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2Jsb2NrZHNwX21pcHMuaAorKysgYi9saWJhdmNvZGVjL21pcHMvYmxvY2tkc3BfbWlwcy5oCkBAIC0yNCwxMyArMjQsMTMgQEAKIAogI2luY2x1ZGUgIi4uL21wZWd2aWRlby5oIgogCi12b2lkIGZmX2ZpbGxfYmxvY2sxNl9tc2EodWludDhfdCAqc3JjLCB1aW50OF90IHZhbCwgaW50IHN0cmlkZSwgaW50IGhlaWdodCk7Ci12b2lkIGZmX2ZpbGxfYmxvY2s4X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgdmFsLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0KTsKK3ZvaWQgZmZfZmlsbF9ibG9jazE2X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgdmFsLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0KTsKK3ZvaWQgZmZfZmlsbF9ibG9jazhfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCB2YWwsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoZWlnaHQpOwogdm9pZCBmZl9jbGVhcl9ibG9ja19tc2EoaW50MTZfdCAqYmxvY2spOwogdm9pZCBmZl9jbGVhcl9ibG9ja3NfbXNhKGludDE2X3QgKmJsb2NrKTsKIAotdm9pZCBmZl9maWxsX2Jsb2NrMTZfbW1pKHVpbnQ4X3QgKmJsb2NrLCB1aW50OF90IHZhbHVlLCBpbnQgbGluZV9zaXplLCBpbnQgaCk7Ci12b2lkIGZmX2ZpbGxfYmxvY2s4X21taSh1aW50OF90ICpibG9jaywgdWludDhfdCB2YWx1ZSwgaW50IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9maWxsX2Jsb2NrMTZfbW1pKHVpbnQ4X3QgKmJsb2NrLCB1aW50OF90IHZhbHVlLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX2ZpbGxfYmxvY2s4X21taSh1aW50OF90ICpibG9jaywgdWludDhfdCB2YWx1ZSwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwogdm9pZCBmZl9jbGVhcl9ibG9ja19tbWkoaW50MTZfdCAqYmxvY2spOwogdm9pZCBmZl9jbGVhcl9ibG9ja3NfbW1pKGludDE2X3QgKmJsb2NrKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2Jsb2NrZHNwX21taS5jIGIvbGliYXZjb2RlYy9taXBzL2Jsb2NrZHNwX21taS5jCmluZGV4IDYzZWFmNjkuLjY4NjQxZTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9ibG9ja2RzcF9tbWkuYworKysgYi9saWJhdmNvZGVjL21pcHMvYmxvY2tkc3BfbW1pLmMKQEAgLTIyLDEyNiArMjIsMTM4IEBACiAgKi8KIAogI2luY2x1ZGUgImJsb2NrZHNwX21pcHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9tbWl1dGlscy5oIgogCi12b2lkIGZmX2ZpbGxfYmxvY2sxNl9tbWkodWludDhfdCAqYmxvY2ssIHVpbnQ4X3QgdmFsdWUsIGludCBsaW5lX3NpemUsIGludCBoKQordm9pZCBmZl9maWxsX2Jsb2NrMTZfbW1pKHVpbnQ4X3QgKmJsb2NrLCB1aW50OF90IHZhbHVlLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKIHsKKyAgICBkb3VibGUgZnRtcFsxXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAibW92ZSAkOCwgJTMgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdmUgJDksICUwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAlMSwgJGYyICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMiAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RsYzEgJGYyLCA3KCQ5KSAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkcmMxICRmMiwgMCgkOSkgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIsIDE1KCQ5KSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYyLCA4KCQ5KSAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaSAkOCwgJDgsIC0xICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDksICQ5LCAlMiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJDgsIDFiICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6InIiKGJsb2NrKSwiciIodmFsdWUpLCJyIihsaW5lX3NpemUpLCJyIihoKQotICAgICAgICA6ICIkOCIsIiQ5IgorICAgICAgICAibXRjMSAgICAgICAlW3ZhbHVlXSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgUFRSX0FEREkgICAiJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtibG9ja10sICAgJVtibG9ja10sICAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbYmxvY2tdIismciIoYmxvY2spLCAgICAgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbdmFsdWVdInIiKHZhbHVlKSwgICAgICAgICAgICAgICAgW2xpbmVfc2l6ZV0iciIoKG1pcHNfcmVnKWxpbmVfc2l6ZSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKLXZvaWQgZmZfZmlsbF9ibG9jazhfbW1pKHVpbnQ4X3QgKmJsb2NrLCB1aW50OF90IHZhbHVlLCBpbnQgbGluZV9zaXplLCBpbnQgaCkKK3ZvaWQgZmZfZmlsbF9ibG9jazhfbW1pKHVpbnQ4X3QgKmJsb2NrLCB1aW50OF90IHZhbHVlLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKIHsKKyAgICBkb3VibGUgZnRtcDA7CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgIm1vdmUgJDgsICUzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3ZlICQ5LCAlMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJTEsICRmMiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMiAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmMiwgNygkOSkgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjIsIDAoJDkpICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpICQ4LCAkOCwgLTEgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOSwgJDksICUyICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkOCwgMWIgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOjoiciIoYmxvY2spLCJyIih2YWx1ZSksInIiKGxpbmVfc2l6ZSksInIiKGgpCi0gICAgICAgIDogIiQ4IiwiJDkiCisgICAgICAgICJtdGMxICAgICAgICVbdmFsdWVdLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBQVFJfQURESSAgICIlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtibG9ja10sICAgJVtibG9ja10sICAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wMCksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2Jsb2NrXSIrJnIiKGJsb2NrKSwgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgIDogW3ZhbHVlXSJyIih2YWx1ZSksICAgICAgICAgICAgICAgIFtsaW5lX3NpemVdInIiKChtaXBzX3JlZylsaW5lX3NpemUpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCiB2b2lkIGZmX2NsZWFyX2Jsb2NrX21taShpbnQxNl90ICpibG9jaykKIHsKKyAgICBkb3VibGUgZnRtcFsyXTsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAieG9yICRmMCwgJGYwLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYyLCAkZjIsICRmMiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgICAwKCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAgMTYoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsICAzMiglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgIDQ4KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAgNjQoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsICA4MCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgIDk2KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAxMTIoJTApICAgICAgIFxyXG4iCi0gICAgICAgIDo6InIiKGJsb2NrKQorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MjApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MzApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4NDApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4NTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4NjApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4NzApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKQorICAgICAgICA6IFtibG9ja10iciIoYmxvY2spCiAgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCiB2b2lkIGZmX2NsZWFyX2Jsb2Nrc19tbWkoaW50MTZfdCAqYmxvY2spCiB7CisgICAgZG91YmxlIGZ0bXBbMl07CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMiwgJGYyLCAkZjIgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsICAgMCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgIDE2KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAgMzIoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsICA0OCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgIDY0KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAgODAoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsICA5NiglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgMTEyKCUwKSAgICAgICBcclxuIgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MjApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MzApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4NDApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4NTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4NjApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4NzApCiAKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgMTI4KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAxNDQoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDE2MCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgMTc2KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAxOTIoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDIwOCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgMjI0KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAyNDAoJTApICAgICAgIFxyXG4iCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4ODApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4OTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4YTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4YjApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4YzApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4ZDApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4ZTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4ZjApCiAKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgMjU2KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAyNzIoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDI4OCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgMzA0KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAzMjAoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDMzNiglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgMzUyKCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAzNjgoJTApICAgICAgIFxyXG4iCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MTAwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDExMCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgxMjApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MTMwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDE0MCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgxNTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MTYwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDE3MCkKIAotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCAzODQoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDQwMCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgNDE2KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCA0MzIoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDQ0OCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgNDY0KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCA0ODAoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDQ5NiglMCkgICAgICAgXHJcbiIKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgxODApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MTkwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDFhMCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgxYjApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MWMwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDFkMCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgxZTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MWYwKQogCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDUxMiglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgNTI4KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCA1NDQoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDU2MCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgNTc2KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCA1OTIoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDYwOCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgNjI0KCUwKSAgICAgICBcclxuIgorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDIwMCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgyMTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MjIwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDIzMCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgyNDApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MjUwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDI2MCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgyNzApCiAKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgNjQwKCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCA2NTYoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDY3MiglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgNjg4KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCA3MDQoJTApICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NxYzEgJGYwLCAkZjIsIDcyMCglMCkgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3FjMSAkZjAsICRmMiwgNzM2KCUwKSAgICAgICBcclxuIgotICAgICAgICAiZ3NzcWMxICRmMCwgJGYyLCA3NTIoJTApICAgICAgIFxyXG4iCi0gICAgICAgIDo6InIiKGJsb2NrKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDI4MCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgyOTApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MmEwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDJiMCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgyYzApCisgICAgICAgIE1NSV9TUUMxKCVbZnRtcDBdLCAlW2Z0bXAxXSwgJVtibG9ja10sIDB4MmQwKQorICAgICAgICBNTUlfU1FDMSglW2Z0bXAwXSwgJVtmdG1wMV0sICVbYmxvY2tdLCAweDJlMCkKKyAgICAgICAgTU1JX1NRQzEoJVtmdG1wMF0sICVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgyZjApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKQorICAgICAgICA6IFtibG9ja10iciIoKHVpbnQ2NF90ICopYmxvY2spCiAgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2Jsb2NrZHNwX21zYS5jIGIvbGliYXZjb2RlYy9taXBzL2Jsb2NrZHNwX21zYS5jCmluZGV4IDMyYWM4NTguLjJiNzhjMjggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9ibG9ja2RzcF9tc2EuYworKysgYi9saWJhdmNvZGVjL21pcHMvYmxvY2tkc3BfbXNhLmMKQEAgLTY1LDEyICs2NSwxMiBAQAogICAgIH0KIH0KIAotdm9pZCBmZl9maWxsX2Jsb2NrMTZfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCB2YWwsIGludCBzdHJpZGUsIGludCBoZWlnaHQpCit2b2lkIGZmX2ZpbGxfYmxvY2sxNl9tc2EodWludDhfdCAqc3JjLCB1aW50OF90IHZhbCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCkKIHsKICAgICBjb3B5XzhiaXRfdmFsdWVfd2lkdGgxNl9tc2Eoc3JjLCB2YWwsIHN0cmlkZSwgaGVpZ2h0KTsKIH0KIAotdm9pZCBmZl9maWxsX2Jsb2NrOF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90IHZhbCwgaW50IHN0cmlkZSwgaW50IGhlaWdodCkKK3ZvaWQgZmZfZmlsbF9ibG9jazhfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCB2YWwsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoZWlnaHQpCiB7CiAgICAgY29weV84Yml0X3ZhbHVlX3dpZHRoOF9tc2Eoc3JjLCB2YWwsIHN0cmlkZSwgaGVpZ2h0KTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9jZWxwX2ZpbHRlcnNfbWlwcy5jIGIvbGliYXZjb2RlYy9taXBzL2NlbHBfZmlsdGVyc19taXBzLmMKaW5kZXggODhhYzQ1OC4uOTI2ZjFjYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2NlbHBfZmlsdGVyc19taXBzLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2NlbHBfZmlsdGVyc19taXBzLmMKQEAgLTU4LDYgKzU4LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9hc21kZWZzLmgiCiAKICNpZiBIQVZFX0lOTElORV9BU00KKyNpZiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNgogc3RhdGljIHZvaWQgZmZfY2VscF9scF9zeW50aGVzaXNfZmlsdGVyZl9taXBzKGZsb2F0ICpvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZpbHRlcl9jb2VmZnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGluLCBpbnQgYnVmZmVyX2xlbmd0aCwKQEAgLTI3OCwxMiArMjc5LDE1IEBACiAgICAgICAgIG91dFtuXSA9IHN1bV9vdXQxOwogICAgIH0KIH0KKyNlbmRpZiAvKiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNiAqLwogI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLwogCiB2b2lkIGZmX2NlbHBfZmlsdGVyX2luaXRfbWlwcyhDRUxQRkNvbnRleHQgKmMpCiB7CiAjaWYgSEFWRV9JTkxJTkVfQVNNCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKICAgICBjLT5jZWxwX2xwX3N5bnRoZXNpc19maWx0ZXJmICAgICAgICA9IGZmX2NlbHBfbHBfc3ludGhlc2lzX2ZpbHRlcmZfbWlwczsKICAgICBjLT5jZWxwX2xwX3plcm9fc3ludGhlc2lzX2ZpbHRlcmYgICA9IGZmX2NlbHBfbHBfemVyb19zeW50aGVzaXNfZmlsdGVyZl9taXBzOwogI2VuZGlmCisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9jZWxwX21hdGhfbWlwcy5jIGIvbGliYXZjb2RlYy9taXBzL2NlbHBfbWF0aF9taXBzLmMKaW5kZXggMDA4ZGQ4MC4uY2U3MTFiZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2NlbHBfbWF0aF9taXBzLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2NlbHBfbWF0aF9taXBzLmMKQEAgLTU2LDYgKzU2LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9hc21kZWZzLmgiCiAKICNpZiBIQVZFX0lOTElORV9BU00KKyNpZiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNgogc3RhdGljIGZsb2F0IGZmX2RvdF9wcm9kdWN0Zl9taXBzKGNvbnN0IGZsb2F0KiBhLCBjb25zdCBmbG9hdCogYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKQogewpAQCAtODAsMTEgKzgxLDE0IEBACiAgICAgKTsKICAgICByZXR1cm4gc3VtOwogfQorI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCiAKIHZvaWQgZmZfY2VscF9tYXRoX2luaXRfbWlwcyhDRUxQTUNvbnRleHQgKmMpCiB7CiAjaWYgSEFWRV9JTkxJTkVfQVNNCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKICAgICBjLT5kb3RfcHJvZHVjdGYgPSBmZl9kb3RfcHJvZHVjdGZfbWlwczsKICNlbmRpZgorI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvY29tcHV0ZV9hbnRpYWxpYXNfZmxvYXQuaCBiL2xpYmF2Y29kZWMvbWlwcy9jb21wdXRlX2FudGlhbGlhc19mbG9hdC5oCmluZGV4IGY2Y2Y0NjUuLmUyYjRmMjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9jb21wdXRlX2FudGlhbGlhc19mbG9hdC5oCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9jb21wdXRlX2FudGlhbGlhc19mbG9hdC5oCkBAIC01OCw2ICs1OCw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL21pcHMvYXNtZGVmcy5oIgogCiAjaWYgSEFWRV9JTkxJTkVfQVNNCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKIHN0YXRpYyB2b2lkIGNvbXB1dGVfYW50aWFsaWFzX21pcHNfZmxvYXQoTVBBRGVjb2RlQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFudWxlRGVmICpnKQogewpAQCAtMTc5LDYgKzE4MCw3IEBACiAgICAgKTsKIH0KICNkZWZpbmUgY29tcHV0ZV9hbnRpYWxpYXMgY29tcHV0ZV9hbnRpYWxpYXNfbWlwc19mbG9hdAorI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCiAKICNlbmRpZiAvKiBBVkNPREVDX01JUFNfQ09NUFVURV9BTlRJQUxJQVNfRkxPQVRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2NvbnN0YW50cy5jIGIvbGliYXZjb2RlYy9taXBzL2NvbnN0YW50cy5jCmluZGV4IGY4MTMwZDkuLmE3YzRhNWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9jb25zdGFudHMuYworKysgYi9saWJhdmNvZGVjL21pcHMvY29uc3RhbnRzLmMKQEAgLTI0LDE1ICsyNCwyMSBAQAogI2luY2x1ZGUgImNvbnN0YW50cy5oIgogCiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzEpID0gICAgICAgezB4MDAwMTAwMDEwMDAxMDAwMVVMTH07CitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzIpID0gICAgICAgezB4MDAwMjAwMDIwMDAyMDAwMlVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzMpID0gICAgICAgezB4MDAwMzAwMDMwMDAzMDAwM1VMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzQpID0gICAgICAgezB4MDAwNDAwMDQwMDA0MDAwNFVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzUpID0gICAgICAgezB4MDAwNTAwMDUwMDA1MDAwNVVMTH07CitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzYpID0gICAgICAgezB4MDAwNjAwMDYwMDA2MDAwNlVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzgpID0gICAgICAgezB4MDAwODAwMDgwMDA4MDAwOFVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzkpID0gICAgICAgezB4MDAwOTAwMDkwMDA5MDAwOVVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzEwKSA9ICAgICAgezB4MDAwQTAwMEEwMDBBMDAwQVVMTH07CitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzEyKSA9ICAgICAgezB4MDAwQzAwMEMwMDBDMDAwQ1VMTH07CitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzE1KSA9ICAgICAgezB4MDAwRjAwMEYwMDBGMDAwRlVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzE2KSA9ICAgICAgezB4MDAxMDAwMTAwMDEwMDAxMFVMTH07CitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzE3KSA9ICAgICAgezB4MDAxMTAwMTEwMDExMDAxMVVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzE4KSA9ICAgICAgezB4MDAxMjAwMTIwMDEyMDAxMlVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzIwKSA9ICAgICAgezB4MDAxNDAwMTQwMDE0MDAxNFVMTH07CitERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzIyKSA9ICAgICAgezB4MDAxNjAwMTYwMDE2MDAxNlVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzI4KSA9ICAgICAgezB4MDAxQzAwMUMwMDFDMDAxQ1VMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzMyKSA9ICAgICAgezB4MDAyMDAwMjAwMDIwMDAyMFVMTH07CiBERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX3B3XzUzKSA9ICAgICAgezB4MDAzNTAwMzUwMDM1MDAzNVVMTH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvY29uc3RhbnRzLmggYi9saWJhdmNvZGVjL21pcHMvY29uc3RhbnRzLmgKaW5kZXggMGE0ZWZmZC4uMjYwNDU1OSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2NvbnN0YW50cy5oCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9jb25zdGFudHMuaApAQCAtMjUsMTUgKzI1LDIxIEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIGV4dGVybiBjb25zdCB1aW50NjRfdCBmZl9wd18xOworZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3XzI7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMzsKIGV4dGVybiBjb25zdCB1aW50NjRfdCBmZl9wd180OwogZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3XzU7CitleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfNjsKIGV4dGVybiBjb25zdCB1aW50NjRfdCBmZl9wd184OwogZXh0ZXJuIGNvbnN0IHVpbnQ2NF90IGZmX3B3Xzk7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMTA7CitleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMTI7CitleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMTU7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMTY7CitleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMTc7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMTg7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMjA7CitleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMjI7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMjg7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMzI7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfNTM7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvZmZ0X21pcHMuYyBiL2xpYmF2Y29kZWMvbWlwcy9mZnRfbWlwcy5jCmluZGV4IGNmMDA4YzYuLjAzZGNiYWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9mZnRfbWlwcy5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9mZnRfbWlwcy5jCkBAIC01Nyw2ICs1Nyw3IEBACiAgKi8KIAogI2lmIEhBVkVfSU5MSU5FX0FTTQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiBzdGF0aWMgdm9pZCBmZl9mZnRfY2FsY19taXBzKEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopCiB7CiAgICAgaW50IG5iaXRzLCBpLCBuLCBudW1fdHJhbnNmb3Jtcywgb2Zmc2V0LCBzdGVwOwpAQCAtNzEsNyArNzIsNyBAQAogICAgIEZGVENvbXBsZXggKiB0bXB6X24yLCAqIHRtcHpfbjM0LCAqIHRtcHpfbjQ7CiAgICAgRkZUQ29tcGxleCAqIHRtcHpfbjJfaSwgKiB0bXB6X24zNF9pLCAqIHRtcHpfbjRfaSwgKiB0bXB6X2k7CiAKLSAgICBudW1fdHJhbnNmb3JtcyA9ICgweDJhYWIgPj4gKDE2IC0gcy0+bmJpdHMpKSB8IDE7CisgICAgbnVtX3RyYW5zZm9ybXMgPSAoMjE4NDUgPj4gKDE3IC0gcy0+bmJpdHMpKSB8IDE7CiAKICAgICBmb3IgKG49MDsgbjxudW1fdHJhbnNmb3JtczsgbisrKSB7CiAgICAgICAgIG9mZnNldCA9IGZmX2ZmdF9vZmZzZXRzX2x1dFtuXSA8PCAyOwpAQCAtMjUwLDggKzI1MSw4IEBACiAgICAgICAgICAgICAgICAgOiAibWVtb3J5IgogICAgICAgICAgICAgKTsKIAotICAgICAgICAgICAgd19yZV9wdHIgPSAoZmxvYXQqKShmZl9jb3NfNjU1MzYgKyBzdGVwKTsKLSAgICAgICAgICAgIHdfaW1fcHRyID0gKGZsb2F0KikoZmZfY29zXzY1NTM2ICsgTUFYX0ZGVF9TSVpFLzQgLSBzdGVwKTsKKyAgICAgICAgICAgIHdfcmVfcHRyID0gKGZsb2F0KikoZmZfY29zXzEzMTA3MiArIHN0ZXApOworICAgICAgICAgICAgd19pbV9wdHIgPSAoZmxvYXQqKShmZl9jb3NfMTMxMDcyICsgTUFYX0ZGVF9TSVpFLzQgLSBzdGVwKTsKIAogICAgICAgICAgICAgZm9yIChpPTE7IGk8bjQ7IGkrKykgewogICAgICAgICAgICAgICAgIHdfcmUgPSB3X3JlX3B0clswXTsKQEAgLTQ5NCwyMCArNDk1LDIzIEBACiAgICAgICAgIG91dHB1dFtuLWstNF0gPSBvdXRwdXRbbjIrayszXTsKICAgICB9CiB9CisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIAogYXZfY29sZCB2b2lkIGZmX2ZmdF9pbml0X21pcHMoRkZUQ29udGV4dCAqcykKIHsKICAgICBpbnQgbj0wOwogCi0gICAgZmZfZmZ0X2x1dF9pbml0KGZmX2ZmdF9vZmZzZXRzX2x1dCwgMCwgMSA8PCAxNiwgJm4pOwotICAgIGZmX2luaXRfZmZfY29zX3RhYnMoMTYpOworICAgIGZmX2ZmdF9sdXRfaW5pdChmZl9mZnRfb2Zmc2V0c19sdXQsIDAsIDEgPDwgMTcsICZuKTsKKyAgICBmZl9pbml0X2ZmX2Nvc190YWJzKDE3KTsKIAogI2lmIEhBVkVfSU5MSU5FX0FTTQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiAgICAgcy0+ZmZ0X2NhbGMgICAgID0gZmZfZmZ0X2NhbGNfbWlwczsKICNpZiBDT05GSUdfTURDVAogICAgIHMtPmltZGN0X2NhbGMgICA9IGZmX2ltZGN0X2NhbGNfbWlwczsKICAgICBzLT5pbWRjdF9oYWxmICAgPSBmZl9pbWRjdF9oYWxmX21pcHM7CiAjZW5kaWYKICNlbmRpZgorI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaDI2NGNocm9tYV9taXBzLmggYi9saWJhdmNvZGVjL21pcHMvaDI2NGNocm9tYV9taXBzLmgKaW5kZXggMGVmNmM3NC4uOTk2Mzg0ZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2gyNjRjaHJvbWFfbWlwcy5oCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0Y2hyb21hX21pcHMuaApAQCAtMjEsMjcgKzIxLDI3IEBACiAjaWZuZGVmIEFWQ09ERUNfTUlQU19IMjY0Q0hST01BX01JUFNfSAogI2RlZmluZSBBVkNPREVDX01JUFNfSDI2NENIUk9NQV9NSVBTX0gKIAotI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NC5oIgotdm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM4X21zYSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRkZWMuaCIKK3ZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbXNhKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM0X21zYSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHgsIGludCB5KTsKLXZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jMl9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzJfbXNhKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgeCwgaW50IHkpOwotdm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X21zYSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKK3ZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jOF9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfbXNhKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM0X21zYSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHgsIGludCB5KTsKLXZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jMl9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzJfbXNhKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgeCwgaW50IHkpOwogCi12b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzhfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM4X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzhfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM0X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7Ci12b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM0X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKICNlbmRpZiAvKiBBVkNPREVDX01JUFNfSDI2NENIUk9NQV9NSVBTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oMjY0Y2hyb21hX21taS5jIGIvbGliYXZjb2RlYy9taXBzL2gyNjRjaHJvbWFfbW1pLmMKaW5kZXggZWYyOTQ3Ni4uYmFmZTBmOSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2gyNjRjaHJvbWFfbW1pLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2gyNjRjaHJvbWFfbW1pLmMKQEAgLTIzLDggKzIzLDEwIEBACiAgKi8KIAogI2luY2x1ZGUgImgyNjRjaHJvbWFfbWlwcy5oIgorI2luY2x1ZGUgImNvbnN0YW50cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL21taXV0aWxzLmgiCiAKLXZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9tbWkodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzhfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KQogewogICAgIGNvbnN0IGludCBBID0gKDggLSB4KSAqICg4IC0geSk7CkBAIC0zMiwxNzUgKzM0LDE4MCBAQAogICAgIGNvbnN0IGludCBDID0gKDggLSB4KSAqIHk7CiAgICAgY29uc3QgaW50IEQgPSB4ICogeTsKICAgICBjb25zdCBpbnQgRSA9IEIgKyBDOwotICAgIGludCBpOwotCi0gICAgYXZfYXNzZXJ0Mih4PDggJiYgeTw4ICYmIHg+PTAgJiYgeT49MCk7CisgICAgZG91YmxlIGZ0bXBbMTBdOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OwogCiAgICAgaWYgKEQpIHsKLSAgICAgICAgZm9yIChpPTA7IGk8aDsgaSsrKSB7Ci0gICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgICAgICAgICAibGRsICQyLCAlMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQyLCAlMSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQzLCAlNCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQzLCAlMyAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQ0LCAlNiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQ0LCAlNSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQ1LCAlOCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQ1LCAlNyAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZGFkZGl1ICQ2LCAkMCwgMzIgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlOSwgJGY2ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlMTAsICRmOCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlMTEsICRmMTAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlMTIsICRmMTIgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMCwgJGYyMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMiwgJGYyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMywgJGY0ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNCwgJGYxNiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNSwgJGYxOCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNiwgJGYxNCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmNiwgJGY2LCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmOCwgJGY4LCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmMTAsICRmMTAsICRmMjAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmMTIsICRmMTIsICRmMjAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmMTQsICRmMTQsICRmMjAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMTYsICRmMTYsICRmMjAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMTgsICRmMTgsICRmMjAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZGFkZGl1ICQ2LCAkMCwgNiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNiwgJGYyMiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZHNybDMyICQyLCAkMiwgMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZHNybDMyICQzLCAkMywgMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZHNybDMyICQ0LCAkNCwgMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZHNybDMyICQ1LCAkNSwgMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmNCwgJGY0LCAkZjggICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMTYsICRmMTAsICRmMTYgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMTgsICRmMTIsICRmMTggICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGY0LCAkZjQsICRmMTYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTggICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmNCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNyYWggJGYyNCwgJGYyLCAkZjIyICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMiwgJGYyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMywgJGY0ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNCwgJGYxNiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNSwgJGYxOCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMTYsICRmMTYsICRmMjAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMTgsICRmMTgsICRmMjAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmNCwgJGY0LCAkZjggICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMTYsICRmMTAsICRmMTYgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMTgsICRmMTIsICRmMTggICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGY0LCAkZjQsICRmMTYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTggICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmNCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMjIgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFja3VzaGIgJGYyLCAkZjI0LCAkZjIgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAic2RjMSAkZjIsICUwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICA6ICI9bSIoKmRzdCkKLSAgICAgICAgICAgICAgICA6ICJtIigqc3JjKSwibSIoKihzcmMrNykpLCJtIigqKHNyYysxKSksIm0iKCooc3JjKzgpKSwKLSAgICAgICAgICAgICAgICAgICJtIigqKHNyYytzdHJpZGUpKSwibSIoKihzcmMrc3RyaWRlKzcpKSwKLSAgICAgICAgICAgICAgICAgICJtIigqKHNyYytzdHJpZGUrMSkpLCJtIigqKHNyYytzdHJpZGUrOCkpLAotICAgICAgICAgICAgICAgICAgInIiKEEpLCJyIihCKSwiciIoQyksInIiKEQpCi0gICAgICAgICAgICAgICAgOiAiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIKLSAgICAgICAgICAgICk7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0FdLCAgICAgICAlW0FdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtCXSwgICAgICAgJVtCXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0NdLCAgICAgICAlW0NdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtEXSwgICAgICAgJVtEXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKLSAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMl0sICVbc3JjXSwgMHgwMSkKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNF0sICVbYWRkcjBdLCAweDAxKQorCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDddLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW0JdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW0JdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDddLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbQ10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW0RdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbQ10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW0RdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18zMl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImFkZGkgICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLFtmZl9wd18zMl0iZiIoZmZfcHdfMzIpLAorICAgICAgICAgICAgICBbQV0iZiIoQSksICAgICAgICAgICAgICAgICAgICBbQl0iZiIoQiksCisgICAgICAgICAgICAgIFtDXSJmIihDKSwgICAgICAgICAgICAgICAgICAgIFtEXSJmIihEKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOwogICAgIH0gZWxzZSBpZiAoRSkgewogICAgICAgICBjb25zdCBpbnQgc3RlcCA9IEMgPyBzdHJpZGUgOiAxOwogCi0gICAgICAgIGZvciAoaT0wOyBpPGg7IGkrKykgewotICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICAgICAgICAgImRhZGRpdSAkNiwgJDAsIDMyICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkbCAkMiwgJTIgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkMiwgJTEgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkbCAkMywgJTQgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkMywgJTMgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDYsICRmMTQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTUsICRmNiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTYsICRmOCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDAsICRmMjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDIsICRmMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDMsICRmNCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImRhZGRpdSAkNiwgJDAsIDYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjYsICRmNiwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjgsICRmOCwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjE0LCAkZjE0LCAkZjIwICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDYsICRmMjIgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImRzcmwzMiAkMiwgJDIsIDAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImRzcmwzMiAkMywgJDMsIDAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjIsICRmMiwgJGY2ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjQsICRmNCwgJGY4ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjE0ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjQgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzcmFoICRmMjQsICRmMiwgJGYyMiAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDIsICRmMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDMsICRmNCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjIsICRmMiwgJGY2ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjQsICRmNCwgJGY4ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjE0ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjQgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjIyICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyNCwgJGYyICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInNkYzEgJGYyLCAlMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgOiAiPW0iKCpkc3QpCi0gICAgICAgICAgICAgICAgOiAibSIoKihzcmMpKSwibSIoKihzcmMrNykpLAotICAgICAgICAgICAgICAgICAgIm0iKCooc3JjK3N0ZXApKSwibSIoKihzcmMrc3RlcCs3KSksCi0gICAgICAgICAgICAgICAgICAiciIoQSksInIiKEUpCi0gICAgICAgICAgICAgICAgOiAiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIKLSAgICAgICAgICAgICk7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0FdLCAgICAgICAlW0FdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtFXSwgICAgICAgJVtFXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDddICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7Ci0gICAgICAgICAgICBzcmMgKz0gc3RyaWRlOwotICAgICAgICB9CisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzcmNdLCAgICAgICAgICVbc3RlcF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgMHgwMCkKKworICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYmggICVbZnRtcDRdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW0FdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtFXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW0FdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtFXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMzJdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLFtzdGVwXSJyIigobWlwc19yZWcpc3RlcCksCisgICAgICAgICAgICAgIFtmZl9wd18zMl0iZiIoZmZfcHdfMzIpLAorICAgICAgICAgICAgICBbQV0iZiIoQSksICAgICAgICAgICAgICAgICAgICBbRV0iZiIoRSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgICAgICAgICAiZGFkZGl1ICQ2LCAkMCwgMzIgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQyLCAlMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQyLCAlMSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNiwgJGYxNCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlMywgJGY2ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMCwgJGYyMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMiwgJGYyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZGFkZGl1ICQ2LCAkMCwgNiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmNiwgJGY2LCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmMTQsICRmMTQsICRmMjAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNiwgJGYyMiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZHNybDMyICQyLCAkMiwgMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNyYWggJGYyNCwgJGYyLCAkZjIyICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMiwgJGYyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMjIgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFja3VzaGIgJGYyLCAkZjI0LCAkZjIgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAic2RjMSAkZjIsICUwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICA6Ij1tIigqZHN0KQotICAgICAgICAgICAgICAgIDoibSIoKnNyYyksIm0iKCooc3JjKzcpKSwiciIoQSkKLSAgICAgICAgICAgICAgICA6IiQyIgotICAgICAgICAgICAgKTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbQV0sICAgICAgICVbQV0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogCi0gICAgICAgICAgICBkc3QgKz0gc3RyaWRlOwotICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKLSAgICAgICAgfQorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSwgICAgICAgJVtBXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wM10sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18zMl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDNdLCAgICAgICAlW0FdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmZl9wd18zMl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMzJdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpICAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtkc3RdLCAweDAwKQorCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksCisgICAgICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLFtmZl9wd18zMl0iZiIoZmZfcHdfMzIpLAorICAgICAgICAgICAgICBbQV0iZiIoQSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKKyAgICAgICAgKTsKICAgICB9CiB9CiAKLXZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jOF9tbWkodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzhfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICBpbnQgaCwgaW50IHgsIGludCB5KQogewogICAgIGNvbnN0IGludCBBID0gKDggLSB4KSAqICg4IC0geSk7CkBAIC0yMDgsMTQ0ICsyMTUsMTg4IEBACiAgICAgY29uc3QgaW50IEMgPSAoOCAtIHgpICogeTsKICAgICBjb25zdCBpbnQgRCA9IHggKiB5OwogICAgIGNvbnN0IGludCBFID0gQiArIEM7Ci0gICAgaW50IGk7Ci0KLSAgICBhdl9hc3NlcnQyKHg8OCAmJiB5PDggJiYgeD49MCAmJiB5Pj0wKTsKKyAgICBkb3VibGUgZnRtcFsxMF07CisgICAgdWludDY0X3QgdG1wWzFdOworICAgIG1pcHNfcmVnIGFkZHJbMV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CiAKICAgICBpZiAoRCkgewotICAgICAgICBmb3IgKGk9MDsgaTxoOyBpKyspIHsKLSAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAgICAgICAgICJsZGwgJDIsICUyICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJsZHIgJDIsICUxICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJsZGwgJDMsICU0ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJsZHIgJDMsICUzICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJsZGwgJDQsICU2ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJsZHIgJDQsICU1ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJsZGwgJDUsICU4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJsZHIgJDUsICU3ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJkYWRkaXUgJDYsICQwLCAzMiAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICU5LCAkZjYgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICUxMCwgJGY4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICUxMSwgJGYxMCAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICUxMiwgJGYxMiAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQwLCAkZjIwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQyLCAkZjIgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQzLCAkZjQgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQ0LCAkZjE2ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQ1LCAkZjE4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQ2LCAkZjE0ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMjAgICBcclxuIgotICAgICAgICAgICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmMjAgICBcclxuIgotICAgICAgICAgICAgICAgICJwc2h1ZmggJGY2LCAkZjYsICRmMjAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwc2h1ZmggJGY4LCAkZjgsICRmMjAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwc2h1ZmggJGYxMCwgJGYxMCwgJGYyMCAgICBcclxuIgotICAgICAgICAgICAgICAgICJwc2h1ZmggJGYxMiwgJGYxMiwgJGYyMCAgICBcclxuIgotICAgICAgICAgICAgICAgICJwc2h1ZmggJGYxNCwgJGYxNCwgJGYyMCAgICBcclxuIgotICAgICAgICAgICAgICAgICJwdW5wY2tsYmggJGYxNiwgJGYxNiwgJGYyMCBcclxuIgotICAgICAgICAgICAgICAgICJwdW5wY2tsYmggJGYxOCwgJGYxOCwgJGYyMCBcclxuIgotICAgICAgICAgICAgICAgICJkYWRkaXUgJDYsICQwLCA2ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQ2LCAkZjIyICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJkc3JsMzIgJDIsICQyLCAwICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJkc3JsMzIgJDMsICQzLCAwICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJkc3JsMzIgJDQsICQ0LCAwICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJkc3JsMzIgJDUsICQ1LCAwICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwbXVsbGggJGYyLCAkZjIsICRmNiAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwbXVsbGggJGY0LCAkZjQsICRmOCAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwbXVsbGggJGYxNiwgJGYxMCwgJGYxNiAgICBcclxuIgotICAgICAgICAgICAgICAgICJwbXVsbGggJGYxOCwgJGYxMiwgJGYxOCAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYxNCAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGYxNiAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYxOCAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGY0ICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwc3JhaCAkZjI0LCAkZjIsICRmMjIgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQyLCAkZjIgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQzLCAkZjQgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQ0LCAkZjE2ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJtdGMxICQ1LCAkZjE4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMjAgICBcclxuIgotICAgICAgICAgICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmMjAgICBcclxuIgotICAgICAgICAgICAgICAgICJwdW5wY2tsYmggJGYxNiwgJGYxNiwgJGYyMCBcclxuIgotICAgICAgICAgICAgICAgICJwdW5wY2tsYmggJGYxOCwgJGYxOCwgJGYyMCBcclxuIgotICAgICAgICAgICAgICAgICJwbXVsbGggJGYyLCAkZjIsICRmNiAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwbXVsbGggJGY0LCAkZjQsICRmOCAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwbXVsbGggJGYxNiwgJGYxMCwgJGYxNiAgICBcclxuIgotICAgICAgICAgICAgICAgICJwbXVsbGggJGYxOCwgJGYxMiwgJGYxOCAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYxNCAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGYxNiAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYxOCAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGY0ICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwc3JhaCAkZjIsICRmMiwgJGYyMiAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYWNrdXNoYiAkZjIsICRmMjQsICRmMiAgICBcclxuIgotICAgICAgICAgICAgICAgICJsZGMxICRmNCwgJTAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJwYXZnYiAkZjIsICRmMiwgJGY0ICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgICJzZGMxICRmMiwgJTAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgICAgIDogIj1tIigqZHN0KQotICAgICAgICAgICAgICAgIDogIm0iKCooc3JjKSksIm0iKCooc3JjKzcpKSwibSIoKihzcmMrMSkpLCJtIigqKHNyYys4KSksCi0gICAgICAgICAgICAgICAgICAibSIoKihzcmMrc3RyaWRlKSksIm0iKCooc3JjK3N0cmlkZSs3KSksCi0gICAgICAgICAgICAgICAgICAibSIoKihzcmMrc3RyaWRlKzEpKSwibSIoKihzcmMrc3RyaWRlKzgpKSwKLSAgICAgICAgICAgICAgICAgICJyIihBKSwiciIoQiksInIiKEMpLCJyIihEKQotICAgICAgICAgICAgICAgIDogIiQyIiwiJDMiLCIkNCIsIiQ1IiwiJDYiCi0gICAgICAgICAgICApOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtBXSwgICAgICAgJVtBXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbQl0sICAgICAgICVbQl0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtDXSwgICAgICAgJVtDXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbRF0sICAgICAgICVbRF0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7Ci0gICAgICAgICAgICBzcmMgKz0gc3RyaWRlOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMl0sICVbc3JjXSwgMHgwMSkKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNF0sICVbYWRkcjBdLCAweDAxKQorCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDddLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW0JdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW0JdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDddLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbQ10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW0RdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbQ10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW0RdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18zMl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksCisgICAgICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKSwKKyAgICAgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgICAgIDogW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksW2ZmX3B3XzMyXSJmIihmZl9wd18zMiksCisgICAgICAgICAgICAgIFtBXSJmIihBKSwgICAgICAgICAgICAgICAgICAgIFtCXSJmIihCKSwKKyAgICAgICAgICAgICAgW0NdImYiKEMpLCAgICAgICAgICAgICAgICAgICAgW0RdImYiKEQpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgfSBlbHNlIGlmIChFKSB7CiAgICAgICAgIGNvbnN0IGludCBzdGVwID0gQyA/IHN0cmlkZSA6IDE7CiAKLSAgICAgICAgZm9yIChpPTA7IGk8aDsgaSsrKSB7Ci0gICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgICAgICAgICAiZGFkZGl1ICQ2LCAkMCwgMzIgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQyLCAlMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQyLCAlMSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQzLCAlNCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQzLCAlMyAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNiwgJGYxNCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlNSwgJGY2ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlNiwgJGY4ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMCwgJGYyMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMiwgJGYyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMywgJGY0ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZGFkZGl1ICQ2LCAkMCwgNiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmNiwgJGY2LCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmOCwgJGY4LCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmMTQsICRmMTQsICRmMjAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNiwgJGYyMiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZHNybDMyICQyLCAkMiwgMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZHNybDMyICQzLCAkMywgMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmNCwgJGY0LCAkZjggICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmNCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNyYWggJGYyNCwgJGYyLCAkZjIyICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMiwgJGYyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMywgJGY0ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmNCwgJGY0LCAkZjggICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmNCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMjIgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFja3VzaGIgJGYyLCAkZjI0LCAkZjIgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRjMSAkZjQsICUwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGF2Z2IgJGYyLCAkZjIsICRmNCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAic2RjMSAkZjIsICUwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICA6ICI9bSIoKmRzdCkKLSAgICAgICAgICAgICAgICA6ICJtIigqKHNyYykpLCJtIigqKHNyYys3KSksCi0gICAgICAgICAgICAgICAgICAibSIoKihzcmMrc3RlcCkpLCJtIigqKHNyYytzdGVwKzcpKSwiciIoQSksInIiKEUpCi0gICAgICAgICAgICAgICAgOiAiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIKLSAgICAgICAgICAgICk7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0FdLCAgICAgICAlW0FdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtFXSwgICAgICAgJVtFXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDddICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7Ci0gICAgICAgICAgICBzcmMgKz0gc3RyaWRlOwotICAgICAgICB9CisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzcmNdLCAgICAgICAgICVbc3RlcF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgMHgwMCkKKworICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYmggICVbZnRtcDRdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW0FdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtFXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW0FdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtFXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMzJdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpICAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksCisgICAgICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKSwKKyAgICAgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgICAgIDogW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksW3N0ZXBdInIiKChtaXBzX3JlZylzdGVwKSwKKyAgICAgICAgICAgICAgW2ZmX3B3XzMyXSJmIihmZl9wd18zMiksCisgICAgICAgICAgICAgIFtBXSJmIihBKSwgICAgICAgICAgICAgICAgICAgIFtFXSJmIihFKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0FdLCAgICAgICAlW0FdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSwgICAgICAgJVtBXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wM10sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18zMl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSwgICAgICAgJVtBXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wM10sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18zMl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKworICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLAorICAgICAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICAgICAgOiBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSxbZmZfcHdfMzJdImYiKGZmX3B3XzMyKSwKKyAgICAgICAgICAgICAgW0FdImYiKEEpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CiAgICAgfQogfQogCi12b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM0X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSkKIHsKICAgICBjb25zdCBpbnQgQSA9ICg4IC0geCkgKiAoOCAtIHkpOwpAQCAtMzUzLDIzMCArNDA0LDMwMSBAQAogICAgIGNvbnN0IGludCBDID0gKDggLSB4KSAqICB5OwogICAgIGNvbnN0IGludCBEID0geCAqICB5OwogICAgIGNvbnN0IGludCBFID0gQiArIEM7Ci0gICAgaW50IGk7Ci0KLSAgICBhdl9hc3NlcnQyKHg8OCAmJiB5PDggJiYgeD49MCAmJiB5Pj0wKTsKKyAgICBkb3VibGUgZnRtcFs4XTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgbWlwc19yZWcgYWRkclsxXTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKIAogICAgIGlmIChEKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpPGg7IGkrKykgewotICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICAgICAgICAgImxkbCAkMiwgJTIgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkMiwgJTEgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkbCAkMywgJTQgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkMywgJTMgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkbCAkNCwgJTYgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkNCwgJTUgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkbCAkNSwgJTggICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkNSwgJTcgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImRhZGRpdSAkNiwgJDAsIDMyICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTksICRmNiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTEwLCAkZjggICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTExLCAkZjEwICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTEyLCAkZjEyICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDAsICRmMjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDIsICRmMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDMsICRmNCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDQsICRmMTYgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDUsICRmMTggICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDYsICRmMTQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjYsICRmNiwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjgsICRmOCwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjEwLCAkZjEwLCAkZjIwICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjEyLCAkZjEyLCAkZjIwICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjE0LCAkZjE0LCAkZjIwICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjE2LCAkZjE2LCAkZjIwIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjE4LCAkZjE4LCAkZjIwIFxyXG4iCi0gICAgICAgICAgICAgICAgImRhZGRpdSAkNiwgJDAsIDYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDYsICRmMjIgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjIsICRmMiwgJGY2ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjQsICRmNCwgJGY4ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjE2LCAkZjEwLCAkZjE2ICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjE4LCAkZjEyLCAkZjE4ICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjE0ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmNCwgJGY0LCAkZjE2ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjE4ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjQgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjIyICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyLCAkZjIgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInN3YzEgJGYyLCAlMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgOiAiPW0iKCpkc3QpCi0gICAgICAgICAgICAgICAgOiAibSIoKihzcmMpKSwibSIoKihzcmMrNykpLCJtIigqKHNyYysxKSksIm0iKCooc3JjKzgpKSwKLSAgICAgICAgICAgICAgICAgICJtIigqKHNyYytzdHJpZGUpKSwibSIoKihzcmMrc3RyaWRlKzcpKSwKLSAgICAgICAgICAgICAgICAgICJtIigqKHNyYytzdHJpZGUrMSkpLCJtIigqKHNyYytzdHJpZGUrOCkpLAotICAgICAgICAgICAgICAgICAgInIiKEEpLCJyIihCKSwiciIoQyksInIiKEQpCi0gICAgICAgICAgICAgICAgOiAiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIKLSAgICAgICAgICAgICk7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0FdLCAgICAgICAlW0FdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtCXSwgICAgICAgJVtCXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDddICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0NdLCAgICAgICAlW0NdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtEXSwgICAgICAgJVtEXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKLSAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMl0sICVbc3JjXSwgMHgwMSkKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAzXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNF0sICVbYWRkcjBdLCAweDAxKQorCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW0FdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtCXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNV0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDZdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtDXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbRF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmZl9wd18zMl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLFtmZl9wd18zMl0iZiIoZmZfcHdfMzIpLAorICAgICAgICAgICAgICBbQV0iZiIoQSksICAgICAgICAgICAgICAgICAgICBbQl0iZiIoQiksCisgICAgICAgICAgICAgIFtDXSJmIihDKSwgICAgICAgICAgICAgICAgICAgIFtEXSJmIihEKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOwogICAgIH0gZWxzZSBpZiAoRSkgewogICAgICAgICBjb25zdCBpbnQgc3RlcCA9IEMgPyBzdHJpZGUgOiAxOwogCi0gICAgICAgIGZvciAoaT0wOyBpPGg7IGkrKykgewotICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICAgICAgICAgImxkbCAkMiwgJTIgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkMiwgJTEgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkbCAkMywgJTQgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkMywgJTMgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImRhZGRpdSAkNCwgJDAsIDMyICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTUsICRmNiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTYsICRmOCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDAsICRmMjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDIsICRmMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDMsICRmNCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDQsICRmMTAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjYsICRmNiwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjgsICRmOCwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjEwLCAkZjEwLCAkZjIwICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImRhZGRpdSAkNCwgJDAsIDYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDQsICRmMjIgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjIsICRmMiwgJGY2ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjQsICRmNCwgJGY4ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjEwICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjQgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjIyICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyLCAkZjIwICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInN3YzEgJGYyLCAlMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgOiAiPW0iKCpkc3QpCi0gICAgICAgICAgICAgICAgOiAibSIoKihzcmMpKSwibSIoKihzcmMrNykpLCJtIigqKHNyYytzdGVwKSksCi0gICAgICAgICAgICAgICAgICAibSIoKihzcmMrc3RlcCs3KSksInIiKEEpLCJyIihFKQotICAgICAgICAgICAgICAgIDogIiQyIiwiJDMiLCIkNCIsIiQ1IiwiJDYiCi0gICAgICAgICAgICApOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtBXSwgICAgICAgJVtBXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbRV0sICAgICAgICVbRV0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogCi0gICAgICAgICAgICBkc3QgKz0gc3RyaWRlOwotICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKLSAgICAgICAgfQorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3JjXSwgICAgICAgICAlW3N0ZXBdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVthZGRyMF0sIDB4MDApCisKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW0VdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmZl9wd18zMl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwKKyAgICAgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLAorICAgICAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICAgICAgOiBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSxbc3RlcF0iciIoKG1pcHNfcmVnKXN0ZXApLAorICAgICAgICAgICAgICBbZmZfcHdfMzJdImYiKGZmX3B3XzMyKSwKKyAgICAgICAgICAgICAgW0FdImYiKEEpLCAgICAgICAgICAgICAgICAgICAgW0VdImYiKEUpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpPTA7IGk8aDsgaSsrKSB7Ci0gICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgICAgICAgICAibHdsICQyLCAlMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibHdyICQyLCAlMSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAic3cgJDIsICUwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICA6ICI9bSIoKmRzdCkKLSAgICAgICAgICAgICAgICA6ICJtIigqc3JjKSwibSIoKihzcmMrMykpCi0gICAgICAgICAgICAgICAgOiAiJDIiCi0gICAgICAgICAgICApOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtBXSwgICAgICAgJVtBXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7Ci0gICAgICAgICAgICBzcmMgKz0gc3RyaWRlOwotICAgICAgICB9CisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU1dDMSglW2Z0bXAxXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpICAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU1dDMSglW2Z0bXAxXSwgJVtkc3RdLCAweDAwKQorCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLAorICAgICAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICAgICAgOiBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSxbZmZfcHdfMzJdImYiKGZmX3B3XzMyKSwKKyAgICAgICAgICAgICAgW0FdImYiKEEpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CiAgICAgfQogfQogCi12b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM0X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSkKIHsKICAgICBjb25zdCBpbnQgQSA9ICg4IC0geCkgKig4IC0geSk7CiAgICAgY29uc3QgaW50IEIgPSB4ICogKDggLSB5KTsKICAgICBjb25zdCBpbnQgQyA9ICg4IC0geCkgKiB5OwogICAgIGNvbnN0IGludCBEID0geCAqIHk7Ci0gICAgaW50IGk7Ci0KLSAgICBhdl9hc3NlcnQyKHg8OCAmJiB5PDggJiYgeD49MCAmJiB5Pj0wKTsKKyAgICBjb25zdCBpbnQgRSA9IEIgKyBDOworICAgIGRvdWJsZSBmdG1wWzhdOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOwogCiAgICAgaWYgKEQpIHsKLSAgICAgICAgZm9yIChpPTA7IGk8aDsgaSsrKSB7Ci0gICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgICAgICAgICAibGRsICQyLCAlMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQyLCAlMSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQzLCAlNCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQzLCAlMyAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQ0LCAlNiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQ0LCAlNSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRsICQ1LCAlOCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibGRyICQ1LCAlNyAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZGFkZGl1ICQ2LCAkMCwgMzIgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlOSwgJGY2ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlMTAsICRmOCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlMTEsICRmMTAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAlMTIsICRmMTIgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMCwgJGYyMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMiwgJGYyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkMywgJGY0ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNCwgJGYxNiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNSwgJGYxOCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNiwgJGYxNCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjIwICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmNiwgJGY2LCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmOCwgJGY4LCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmMTAsICRmMTAsICRmMjAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmMTIsICRmMTIsICRmMjAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNodWZoICRmMTQsICRmMTQsICRmMjAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMTYsICRmMTYsICRmMjAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHVucGNrbGJoICRmMTgsICRmMTgsICRmMjAgXHJcbiIKLSAgICAgICAgICAgICAgICAiZGFkZGl1ICQ2LCAkMCwgNiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibXRjMSAkNiwgJGYyMiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmNCwgJGY0LCAkZjggICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMTYsICRmMTAsICRmMTYgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicG11bGxoICRmMTgsICRmMTIsICRmMTggICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGY0LCAkZjQsICRmMTYgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTggICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmNCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMjIgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGFja3VzaGIgJGYyLCAkZjIsICRmMiAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAibHdjMSAkZjQsICUwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAicGF2Z2IgJGYyLCAkZjIsICRmNCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICAic3djMSAkZjIsICUwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICAgICA6ICI9bSIoKmRzdCkKLSAgICAgICAgICAgICAgICA6ICJtIigqKHNyYykpLCJtIigqKHNyYys3KSksIm0iKCooc3JjKzEpKSwibSIoKihzcmMrOCkpLAotICAgICAgICAgICAgICAgICAgIm0iKCooc3JjK3N0cmlkZSkpLCJtIigqKHNyYytzdHJpZGUrNykpLAotICAgICAgICAgICAgICAgICAgIm0iKCooc3JjK3N0cmlkZSsxKSksIm0iKCooc3JjK3N0cmlkZSs4KSksCi0gICAgICAgICAgICAgICAgICAiciIoQSksInIiKEIpLCJyIihDKSwiciIoRCkKLSAgICAgICAgICAgICAgICA6ICIkMiIsIiQzIiwiJDQiLCIkNSIsIiQ2IgotICAgICAgICAgICAgKTsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbQV0sICAgICAgICVbQV0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0JdLCAgICAgICAlW0JdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbQ10sICAgICAgICVbQ10sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW0RdLCAgICAgICAlW0RdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgogCi0gICAgICAgICAgICBkc3QgKz0gc3RyaWRlOwotICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IGludCBFID0gQiArIEM7CisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDEpCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbYWRkcjBdLCAweDAwKQorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDRdLCAlW2FkZHIwXSwgMHgwMSkKKworICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtBXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbQl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbQ10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW0RdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMzJdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLFtmZl9wd18zMl0iZiIoZmZfcHdfMzIpLAorICAgICAgICAgICAgICBbQV0iZiIoQSksICAgICAgICAgICAgICAgICAgICBbQl0iZiIoQiksCisgICAgICAgICAgICAgIFtDXSJmIihDKSwgICAgICAgICAgICAgICAgICAgIFtEXSJmIihEKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworICAgIH0gZWxzZSBpZiAoRSkgewogICAgICAgICBjb25zdCBpbnQgc3RlcCA9IEMgPyBzdHJpZGUgOiAxOwogCi0gICAgICAgIGZvciAoaT0wOyBpPGg7IGkrKykgewotICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICAgICAgICAgImxkbCAkMiwgJTIgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkMiwgJTEgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkbCAkMywgJTQgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImxkciAkMywgJTMgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImRhZGRpdSAkNCwgJDAsIDMyICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTUsICRmNiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJTYsICRmOCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDAsICRmMjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDIsICRmMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDMsICRmNCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDQsICRmMTAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYyMCAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjYsICRmNiwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjgsICRmOCwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzaHVmaCAkZjEwLCAkZjEwLCAkZjIwICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImRhZGRpdSAkNCwgJDAsIDYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgIm10YzEgJDQsICRmMjIgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjIsICRmMiwgJGY2ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBtdWxsaCAkZjQsICRmNCwgJGY4ICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjEwICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjQgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjIyICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyLCAkZjIwICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgImx3YzEgJGY0LCAlMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInBhdmdiICRmMiwgJGYyLCAkZjQgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgInN3YzEgJGYyLCAlMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAgICAgOiAiPW0iKCpkc3QpCi0gICAgICAgICAgICAgICAgOiAibSIoKihzcmMpKSwibSIoKihzcmMrNykpLCJtIigqKHNyYytzdGVwKSksCi0gICAgICAgICAgICAgICAgICAibSIoKihzcmMrc3RlcCs3KSksInIiKEEpLCJyIihFKQotICAgICAgICAgICAgICAgIDogIiQyIiwiJDMiLCIkNCIsIiQ1IiwiJDYiCi0gICAgICAgICAgICApOworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtBXSwgICAgICAgJVtBXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbRV0sICAgICAgICVbRV0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3JjXSwgICAgICAgICAlW3N0ZXBdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVthZGRyMF0sIDB4MDApCiAKLSAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7Ci0gICAgICAgICAgICBzcmMgKz0gc3RyaWRlOwotICAgICAgICB9CisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW0FdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtFXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMzJdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwKKyAgICAgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLAorICAgICAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICAgICAgOiBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSxbc3RlcF0iciIoKG1pcHNfcmVnKXN0ZXApLAorICAgICAgICAgICAgICBbZmZfcHdfMzJdImYiKGZmX3B3XzMyKSwKKyAgICAgICAgICAgICAgW0FdImYiKEEpLCAgICAgICAgICAgICAgICAgICAgW0VdImYiKEUpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbQV0sICAgICAgICVbQV0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbQV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzMyXSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNybGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDJdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICBcblx0IgorCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSwgICAgICAgJVtBXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMzJdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKworICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKSwKKyAgICAgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgICAgIDogW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksW2ZmX3B3XzMyXSJmIihmZl9wd18zMiksCisgICAgICAgICAgICAgIFtBXSJmIihBKQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oMjY0Y2hyb21hX21zYS5jIGIvbGliYXZjb2RlYy9taXBzL2gyNjRjaHJvbWFfbXNhLmMKaW5kZXggNjdkMGJjMS4uNGMyNTc2MSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2gyNjRjaHJvbWFfbXNhLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2gyNjRjaHJvbWFfbXNhLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1IFNoaXZyYWogUGF0aWwgKFNoaXZyYWouUGF0aWxAaW1ndGVjLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAxNSAtIDIwMTcgU2hpdnJhaiBQYXRpbCAoU2hpdnJhai5QYXRpbEBpbWd0ZWMuY29tKQogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0yOSw4ICsyOSw3IEBACiAgICAgMCwgMSwgMSwgMiwgMTYsIDE3LCAxNywgMTgsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMAogfTsKIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel8yeDJfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel8yeDJfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKIHsKICAgICB1aW50MTZfdCBvdXQwLCBvdXQxOwpAQCAtNDQsNyArNDMsNyBAQAogCiAgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbMF0pOwogCi0gICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7CisgICAgTERfU0IyKHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxKTsKIAogICAgIHNyYzAgPSBfX21zYV92c2hmX2IobWFzaywgc3JjMSwgc3JjMCk7CiAgICAgcmVzX3IgPSBfX21zYV9kb3RwX3VfaCgodjE2dTgpIHNyYzAsIGNvZWZmX3ZlYyk7CkBAIC01NywxMiArNTYsMTEgQEAKICAgICBvdXQxID0gX19tc2FfY29weV91X2gocmVzLCAyKTsKIAogICAgIFNIKG91dDAsIGRzdCk7Ci0gICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgZHN0ICs9IHN0cmlkZTsKICAgICBTSChvdXQxLCBkc3QpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6XzJ4NF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6XzJ4NF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwgdWludDMyX3QgY29lZmYxKQogewogICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CkBAIC03NSw3ICs3Myw3IEBACiAKICAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2Fycls2NF0pOwogCi0gICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgTERfVUI0KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKIAogICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzaywgbWFzaywgc3JjMCwgc3JjMik7CiAKQEAgLTg3LDY0ICs4NSwyMSBAQAogICAgIHJlc19yID0gX19tc2Ffc2F0X3VfaChyZXNfciwgNyk7CiAgICAgcmVzID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3IsICh2MTZpOCkgcmVzX3IpOwogCi0gICAgU1QyeDRfVUIocmVzLCAwLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFNUMng0X1VCKHJlcywgMCwgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6XzJ4OF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEpCi17Ci0gICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKLSAgICB2OHUxNiByZXNfcjsKLSAgICB2OGkxNiByZXM7Ci0gICAgdjE2aTggbWFzazsKLSAgICB2MTZpOCBjb2VmZl92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZmMCk7Ci0gICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOwotICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOwotCi0gICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbNjRdKTsKLQotICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotCi0gICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrLCBtYXNrLCBzcmMwLCBzcmMyKTsKLSAgICBWU0hGX0IyX1VCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2ssIG1hc2ssIHNyYzQsIHNyYzYpOwotCi0gICAgSUxWUl9EMl9VQihzcmMyLCBzcmMwLCBzcmM2LCBzcmM0LCBzcmMwLCBzcmM0KTsKLQotICAgIHJlc19yID0gX19tc2FfZG90cF91X2goc3JjMCwgY29lZmZfdmVjKTsKLSAgICByZXNfciA8PD0gMzsKLSAgICByZXNfciA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc19yLCA2KTsKLSAgICByZXNfciA9IF9fbXNhX3NhdF91X2gocmVzX3IsIDcpOwotICAgIHJlcyA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc19yLCAodjE2aTgpIHJlc19yKTsKLQotICAgIFNUMng0X1VCKHJlcywgMCwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgIHJlc19yID0gX19tc2FfZG90cF91X2goc3JjNCwgY29lZmZfdmVjKTsKLSAgICByZXNfciA8PD0gMzsKLSAgICByZXNfciA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc19yLCA2KTsKLSAgICByZXNfciA9IF9fbXNhX3NhdF91X2gocmVzX3IsIDcpOwotICAgIHJlcyA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc19yLCAodjE2aTgpIHJlc19yKTsKLQotICAgIFNUMng0X1VCKHJlcywgMCwgZHN0LCBkc3Rfc3RyaWRlKTsKLX0KLQotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel8yd19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfMndfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwgdWludDMyX3QgY29lZmYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHpfMngyX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgY29lZmYwLCBjb2VmZjEpOworICAgICAgICBhdmNfY2hyb21hX2h6XzJ4Ml9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOwogICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9oel8yeDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7Ci0gICAgfSBlbHNlIGlmICg4ID09IGhlaWdodCkgewotICAgICAgICBhdmNfY2hyb21hX2h6XzJ4OF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKKyAgICAgICAgYXZjX2Nocm9tYV9oel8yeDRfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfNHgyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfNHgyX21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEpCiB7CiAgICAgdjE2aTggc3JjMCwgc3JjMTsKQEAgLTE1Nyw3ICsxMTIsNyBAQAogCiAgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbMF0pOwogCi0gICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7CisgICAgTERfU0IyKHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxKTsKIAogICAgIHNyYzAgPSBfX21zYV92c2hmX2IobWFzaywgc3JjMSwgc3JjMCk7CiAgICAgcmVzX3IgPSBfX21zYV9kb3RwX3VfaCgodjE2dTgpIHNyYzAsIGNvZWZmX3ZlYyk7CkBAIC0xNjYsMTggKzEyMSwxNCBAQAogICAgIHJlc19yID0gX19tc2Ffc2F0X3VfaChyZXNfciwgNyk7CiAgICAgcmVzID0gKHY0aTMyKSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3IsICh2MTZpOCkgcmVzX3IpOwogCi0gICAgU1Q0eDJfVUIocmVzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFNUNHgyX1VCKHJlcywgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6XzR4NG11bHRpcGxlX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfNHg0X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEpCiB7Ci0gICAgdWludDMyX3Qgcm93OwotICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgb3V0OwogICAgIHY4dTE2IHJlczBfciwgcmVzMV9yOwotICAgIHY0aTMyIHJlczAsIHJlczE7CiAgICAgdjE2aTggbWFzazsKICAgICB2MTZpOCBjb2VmZl92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZmMCk7CiAgICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOwpAQCAtMTg1LDQyICsxMzYsMTEzIEBACiAKICAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclswXSk7CiAKLSAgICBmb3IgKHJvdyA9IChoZWlnaHQgPj4gMik7IHJvdy0tOykgewotICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrLCBtYXNrLCBzcmMwLCBzcmMyKTsKLSAgICAgICAgRE9UUF9VQjJfVUgoc3JjMCwgc3JjMiwgY29lZmZfdmVjLCBjb2VmZl92ZWMsIHJlczBfciwgcmVzMV9yKTsKLQotICAgICAgICByZXMwX3IgPDw9IDM7Ci0gICAgICAgIHJlczFfciA8PD0gMzsKLQotICAgICAgICBTUkFSSV9IMl9VSChyZXMwX3IsIHJlczFfciwgNik7Ci0gICAgICAgIFNBVF9VSDJfVUgocmVzMF9yLCByZXMxX3IsIDcpOwotICAgICAgICBQQ0tFVl9CMl9TVyhyZXMwX3IsIHJlczBfciwgcmVzMV9yLCByZXMxX3IsIHJlczAsIHJlczEpOwotCi0gICAgICAgIFNUNHg0X1VCKHJlczAsIHJlczEsIDAsIDEsIDAsIDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBMRF9VQjQoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzaywgbWFzaywgc3JjMCwgc3JjMik7CisgICAgRE9UUF9VQjJfVUgoc3JjMCwgc3JjMiwgY29lZmZfdmVjLCBjb2VmZl92ZWMsIHJlczBfciwgcmVzMV9yKTsKKyAgICByZXMwX3IgPDw9IDM7CisgICAgcmVzMV9yIDw8PSAzOworICAgIFNSQVJJX0gyX1VIKHJlczBfciwgcmVzMV9yLCA2KTsKKyAgICBTQVRfVUgyX1VIKHJlczBfciwgcmVzMV9yLCA3KTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXMxX3IsICh2MTZpOCkgcmVzMF9yKTsKKyAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel80eDhfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKK3sKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBvdXQwLCBvdXQxOworICAgIHYxNmk4IG1hc2s7CisgICAgdjh1MTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKKyAgICB2MTZpOCBjb2VmZl92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZmMCk7CisgICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOworICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOworCisgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbMF0pOworCisgICAgTERfVUI4KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2ssIG1hc2ssIHNyYzAsIHNyYzIpOworICAgIFZTSEZfQjJfVUIoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgbWFzaywgbWFzaywgc3JjNCwgc3JjNik7CisgICAgRE9UUF9VQjJfVUgoc3JjMCwgc3JjMiwgY29lZmZfdmVjLCBjb2VmZl92ZWMsIHJlczAsIHJlczEpOworICAgIERPVFBfVUIyX1VIKHNyYzQsIHNyYzYsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCByZXMyLCByZXMzKTsKKyAgICBTTExJXzRWKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDMpOworICAgIFNSQVJJX0g0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDYpOworICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgUENLRVZfQjJfVUIocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgb3V0MCwgb3V0MSk7CisgICAgU1Q0eDhfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6XzR3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIGlmICgyID09IGhlaWdodCkgewotICAgICAgICBhdmNfY2hyb21hX2h6XzR4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhdmNfY2hyb21hX2h6XzR4NG11bHRpcGxlX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgY29lZmYwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZjEsIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfaHpfNHgyX21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX2h6XzR4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOworICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Nocm9tYV9oel80eDhfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfOHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel84eDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKK3sKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBvdXQwLCBvdXQxOworICAgIHY4dTE2IHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgICAgdjE2aTggbWFzazsKKyAgICB2MTZpOCBjb2VmZl92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZmMCk7CisgICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOworICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOworCisgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbMzJdKTsKKyAgICBMRF9VQjQoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzaywgbWFzaywgc3JjMCwgc3JjMSk7CisgICAgVlNIRl9CMl9VQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrLCBtYXNrLCBzcmMyLCBzcmMzKTsKKyAgICBET1RQX1VCNF9VSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX3ZlYywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgU0xMSV80VihyZXMwLCByZXMxLCByZXMyLCByZXMzLCAzKTsKKyAgICBTUkFSSV9INF9VSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA2KTsKKyAgICBTQVRfVUg0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgIFBDS0VWX0IyX1VCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIG91dDAsIG91dDEpOworICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel84eDhfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKK3sKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjh1MTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNzsKKyAgICB2MTZpOCBtYXNrOworICAgIHYxNmk4IGNvZWZmX3ZlYzAgPSBfX21zYV9maWxsX2IoY29lZmYwKTsKKyAgICB2MTZpOCBjb2VmZl92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZmMSk7CisgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CisKKyAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclszMl0pOworCisgICAgTERfVUI4KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2ssIG1hc2ssIHNyYzAsIHNyYzEpOworICAgIFZTSEZfQjJfVUIoc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzaywgbWFzaywgc3JjMiwgc3JjMyk7CisgICAgVlNIRl9CMl9VQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrLCBtYXNrLCBzcmM0LCBzcmM1KTsKKyAgICBWU0hGX0IyX1VCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2ssIG1hc2ssIHNyYzYsIHNyYzcpOworICAgIERPVFBfVUI0X1VIKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCBjb2VmZl92ZWMsCisgICAgICAgICAgICAgICAgY29lZmZfdmVjLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBET1RQX1VCNF9VSChzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX3ZlYywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgU0xMSV80VihyZXMwLCByZXMxLCByZXMyLCByZXMzLCAzKTsKKyAgICBTTExJXzRWKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDMpOworICAgIFNSQVJJX0g0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDYpOworICAgIFNSQVJJX0g0X1VIKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDYpOworICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgU0FUX1VINF9VSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA3KTsKKyAgICBQQ0tFVl9CMl9VQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCBvdXQwLCBvdXQxKTsKKyAgICBQQ0tFVl9CMl9VQihyZXM1LCByZXM0LCByZXM3LCByZXM2LCBvdXQyLCBvdXQzKTsKKyAgICBTVDh4OF9VQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfbm9ubXVsdF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBjb2VmZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3Qgcm93OwogICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG91dDAsIG91dDE7CkBAIC0yMzMsOCArMjU1LDggQEAKICAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclszMl0pOwogCiAgICAgZm9yIChyb3cgPSBoZWlnaHQgPj4gMjsgcm93LS07KSB7Ci0gICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgTERfVUI0KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKIAogICAgICAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2ssIG1hc2ssIHNyYzAsIHNyYzEpOwogICAgICAgICBWU0hGX0IyX1VCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2ssIG1hc2ssIHNyYzIsIHNyYzMpOwpAQCAtMjQ0LDE0ICsyNjYsMTQgQEAKICAgICAgICAgU1JBUklfSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNik7CiAgICAgICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CiAgICAgICAgIFBDS0VWX0IyX1VCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIG91dDAsIG91dDEpOwotICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOwogICAgIH0KIAogICAgIGlmICgwICE9IChoZWlnaHQgJSA0KSkgewogICAgICAgICBmb3IgKHJvdyA9IChoZWlnaHQgJSA0KTsgcm93LS07KSB7CiAgICAgICAgICAgICBzcmMwID0gTERfVUIoc3JjKTsKLSAgICAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKIAogICAgICAgICAgICAgc3JjMCA9ICh2MTZ1OCkgX19tc2FfdnNoZl9iKG1hc2ssICh2MTZpOCkgc3JjMCwgKHYxNmk4KSBzcmMwKTsKIApAQCAtMjYyLDEzICsyODQsMjUgQEAKICAgICAgICAgICAgIHJlczAgPSAodjh1MTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXMwLCAodjE2aTgpIHJlczApOwogCiAgICAgICAgICAgICBTVDh4MV9VQihyZXMwLCBkc3QpOwotICAgICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgICAgICBkc3QgKz0gc3RyaWRlOwogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0XzJ4Ml9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6Xzh3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQoreworICAgIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX2h6Xzh4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOworICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Nocm9tYV9oel84eDhfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmNfY2hyb21hX2h6X25vbm11bHRfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxLCBoZWlnaHQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF8yeDJfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKIHsKICAgICB1aW50MTZfdCBvdXQwLCBvdXQxOwpAQCAtMjgwLDcgKzMxNCw3IEBACiAgICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOwogICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOwogCi0gICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgTERfU0IzKHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKIAogICAgIElMVlJfQjJfVUIoc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgdG1wMCwgdG1wMSk7CiAKQEAgLTI5NiwxMiArMzMwLDExIEBACiAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9oKHJlcywgMik7CiAKICAgICBTSChvdXQwLCBkc3QpOwotICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIGRzdCArPSBzdHJpZGU7CiAgICAgU0gob3V0MSwgZHN0KTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF8yeDRfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF8yeDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKIHsKICAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwpAQCAtMzEyLDcgKzM0NSw3IEBACiAgICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOwogICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOwogCi0gICAgTERfVUI1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgTERfVUI1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKICAgICBJTFZSX0I0X1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsCiAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKICAgICBJTFZSX1cyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHRtcDAsIHRtcDIpOwpAQCAtMzI2LDc0ICszNTksMjEgQEAKIAogICAgIHJlcyA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc19yLCAodjE2aTgpIHJlc19yKTsKIAotICAgIFNUMng0X1VCKHJlcywgMCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDJ4NF9VQihyZXMsIDAsIGRzdCwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF8yeDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwgdWludDMyX3QgY29lZmYxKQotewotICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7Ci0gICAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICB2OGkxNiByZXM7Ci0gICAgdjh1MTYgcmVzX3I7Ci0gICAgdjE2aTggY29lZmZfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmZjApOwotICAgIHYxNmk4IGNvZWZmX3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZmYxKTsKLSAgICB2MTZ1OCBjb2VmZl92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl92ZWMwLCBjb2VmZl92ZWMxKTsKLQotICAgIExEX1VCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwotCi0gICAgSUxWUl9CNF9VQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLAotICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7Ci0gICAgSUxWUl9XMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0bXAwLCB0bXAyKTsKLQotICAgIHRtcDAgPSAodjE2dTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHRtcDIsICh2Mmk2NCkgdG1wMCk7Ci0KLSAgICByZXNfciA9IF9fbXNhX2RvdHBfdV9oKHRtcDAsIGNvZWZmX3ZlYyk7Ci0gICAgcmVzX3IgPDw9IDM7Ci0gICAgcmVzX3IgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSByZXNfciwgNik7Ci0gICAgcmVzX3IgPSBfX21zYV9zYXRfdV9oKHJlc19yLCA3KTsKLQotICAgIHJlcyA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc19yLCAodjE2aTgpIHJlc19yKTsKLQotICAgIFNUMng0X1VCKHJlcywgMCwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgIElMVlJfQjRfVUIoc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywKLSAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOwotICAgIElMVlJfVzJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wMCwgdG1wMik7Ci0KLSAgICB0bXAwID0gKHYxNnU4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSB0bXAyLCAodjJpNjQpIHRtcDApOwotCi0gICAgcmVzX3IgPSBfX21zYV9kb3RwX3VfaCh0bXAwLCBjb2VmZl92ZWMpOwotICAgIHJlc19yIDw8PSAzOwotICAgIHJlc19yID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgcmVzX3IsIDYpOwotICAgIHJlc19yID0gX19tc2Ffc2F0X3VfaChyZXNfciwgNyk7Ci0KLSAgICByZXMgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfciwgKHYxNmk4KSByZXNfcik7Ci0KLSAgICBTVDJ4NF9VQihyZXMsIDAsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfMndfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0XzJ3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIGlmICgyID09IGhlaWdodCkgewotICAgICAgICBhdmNfY2hyb21hX3Z0XzJ4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKKyAgICAgICAgYXZjX2Nocm9tYV92dF8yeDJfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKICAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfdnRfMng0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgY29lZmYwLCBjb2VmZjEpOwotICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV92dF8yeDhfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfMng0X21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0XzR4Ml9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0XzR4Ml9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwgdWludDMyX3QgY29lZmYxKQogewogICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzI7CkBAIC00MDQsNyArMzg0LDcgQEAKICAgICB2MTZpOCBjb2VmZl92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZmMSk7CiAgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CiAKLSAgICBMRF9VQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBMRF9VQjMoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIElMVlJfQjJfVUIoc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgdG1wMCwgdG1wMSk7CiAKICAgICB0bXAwID0gKHYxNnU4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSB0bXAxLCAodjJpNjQpIHRtcDApOwpAQCAtNDE0LDk4ICszOTQsMTM5IEBACiAgICAgcmVzX3IgPSBfX21zYV9zYXRfdV9oKHJlc19yLCA3KTsKICAgICByZXMgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfciwgKHYxNmk4KSByZXNfcik7CiAKLSAgICBTVDR4Ml9VQihyZXMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgU1Q0eDJfVUIocmVzLCBkc3QsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfNHg0bXVsdGlwbGVfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF80eDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKIHsKLSAgICB1aW50MzJfdCByb3c7CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKICAgICB2MTZ1OCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHYxNnU4IG91dDsKICAgICB2OHUxNiByZXMwX3IsIHJlczFfcjsKLSAgICB2NGkzMiByZXMwLCByZXMxOwogICAgIHYxNmk4IGNvZWZmX3ZlYzAgPSBfX21zYV9maWxsX2IoY29lZmYwKTsKICAgICB2MTZpOCBjb2VmZl92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZmMSk7CiAgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CiAKLSAgICBzcmMwID0gTERfVUIoc3JjKTsKLSAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLQotICAgIGZvciAocm93ID0gKGhlaWdodCA+PiAyKTsgcm93LS07KSB7Ci0gICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBJTFZSX0I0X1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7Ci0gICAgICAgIElMVlJfRDJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wMCwgdG1wMik7Ci0gICAgICAgIERPVFBfVUIyX1VIKHRtcDAsIHRtcDIsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCByZXMwX3IsIHJlczFfcik7Ci0KLSAgICAgICAgcmVzMF9yIDw8PSAzOwotICAgICAgICByZXMxX3IgPDw9IDM7Ci0KLSAgICAgICAgU1JBUklfSDJfVUgocmVzMF9yLCByZXMxX3IsIDYpOwotICAgICAgICBTQVRfVUgyX1VIKHJlczBfciwgcmVzMV9yLCA3KTsKLSAgICAgICAgUENLRVZfQjJfU1cocmVzMF9yLCByZXMwX3IsIHJlczFfciwgcmVzMV9yLCByZXMwLCByZXMxKTsKLQotICAgICAgICBTVDR4NF9VQihyZXMwLCByZXMxLCAwLCAxLCAwLCAxLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgc3JjMCA9IHNyYzQ7Ci0gICAgfQorICAgIExEX1VCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgSUxWUl9CNF9VQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCB0bXAwLCB0bXAxLCB0bXAyLAorICAgICAgICAgICAgICAgdG1wMyk7CisgICAgSUxWUl9EMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0bXAwLCB0bXAyKTsKKyAgICBET1RQX1VCMl9VSCh0bXAwLCB0bXAyLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgcmVzMF9yLCByZXMxX3IpOworICAgIHJlczBfciA8PD0gMzsKKyAgICByZXMxX3IgPDw9IDM7CisgICAgU1JBUklfSDJfVUgocmVzMF9yLCByZXMxX3IsIDYpOworICAgIFNBVF9VSDJfVUgocmVzMF9yLCByZXMxX3IsIDcpOworICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlczFfciwgKHYxNmk4KSByZXMwX3IpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfNHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0XzR4OF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwgdWludDMyX3QgY29lZmYxKQoreworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgb3V0MCwgb3V0MTsKKyAgICB2OHUxNiByZXMwLCByZXMxLCByZXMyLCByZXMzOworICAgIHYxNmk4IGNvZWZmX3ZlYzAgPSBfX21zYV9maWxsX2IoY29lZmYwKTsKKyAgICB2MTZpOCBjb2VmZl92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZmMSk7CisgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CisKKyAgICBMRF9VQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisgICAgTERfVUI0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBJTFZSX0I0X1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHRtcDAsIHRtcDEsIHRtcDIsCisgICAgICAgICAgICAgICB0bXAzKTsKKyAgICBJTFZSX0I0X1VCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHRtcDQsIHRtcDUsIHRtcDYsCisgICAgICAgICAgICAgICB0bXA3KTsKKyAgICBJTFZSX0QyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHRtcDAsIHRtcDIpOworICAgIElMVlJfRDJfVUIodG1wNSwgdG1wNCwgdG1wNywgdG1wNiwgdG1wNCwgdG1wNik7CisgICAgRE9UUF9VQjJfVUgodG1wMCwgdG1wMiwgY29lZmZfdmVjLCBjb2VmZl92ZWMsIHJlczAsIHJlczEpOworICAgIERPVFBfVUIyX1VIKHRtcDQsIHRtcDYsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCByZXMyLCByZXMzKTsKKyAgICBTTExJXzRWKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDMpOworICAgIFNSQVJJX0g0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDYpOworICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgUENLRVZfQjJfVUIocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgb3V0MCwgb3V0MSk7CisgICAgU1Q0eDhfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0XzR3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIGlmICgyID09IGhlaWdodCkgewotICAgICAgICBhdmNfY2hyb21hX3Z0XzR4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhdmNfY2hyb21hX3Z0XzR4NG11bHRpcGxlX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgY29lZmYwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZjEsIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfNHgyX21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX3Z0XzR4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOworICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Nocm9tYV92dF80eDhfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfOHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF84eDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKIHsKLSAgICB1aW50MzJfdCByb3c7CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgb3V0MCwgb3V0MTsKICAgICB2OHUxNiByZXMwLCByZXMxLCByZXMyLCByZXMzOwogICAgIHYxNmk4IGNvZWZmX3ZlYzAgPSBfX21zYV9maWxsX2IoY29lZmYwKTsKICAgICB2MTZpOCBjb2VmZl92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZmMSk7CiAgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CiAKLSAgICBzcmMwID0gTERfVUIoc3JjKTsKLSAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICBMRF9VQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIElMVlJfQjRfVUIoc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMCwgc3JjMSwgc3JjMiwKKyAgICAgICAgICAgICAgIHNyYzMpOworICAgIERPVFBfVUI0X1VIKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCBjb2VmZl92ZWMsCisgICAgICAgICAgICAgICAgY29lZmZfdmVjLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBTTExJXzRWKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDMpOworICAgIFNSQVJJX0g0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDYpOworICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgUENLRVZfQjJfVUIocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgb3V0MCwgb3V0MSk7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworfQogCi0gICAgZm9yIChyb3cgPSBoZWlnaHQgPj4gMjsgcm93LS07KSB7Ci0gICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfOHg4X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEpCit7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHY4dTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7CisgICAgdjE2aTggY29lZmZfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmZjApOworICAgIHYxNmk4IGNvZWZmX3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZmYxKTsKKyAgICB2MTZ1OCBjb2VmZl92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl92ZWMwLCBjb2VmZl92ZWMxKTsKIAotICAgICAgICBJTFZSX0I0X1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIERPVFBfVUI0X1VIKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCBjb2VmZl92ZWMsCi0gICAgICAgICAgICAgICAgICAgIGNvZWZmX3ZlYywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIFNMTElfNFYocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgMyk7Ci0gICAgICAgIFNSQVJJX0g0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDYpOwotICAgICAgICBTQVRfVUg0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOwotICAgICAgICBQQ0tFVl9CMl9VQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCBvdXQwLCBvdXQxKTsKKyAgICBMRF9VQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisgICAgTERfVUI0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBJTFZSX0I0X1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzAsIHNyYzEsIHNyYzIsCisgICAgICAgICAgICAgICBzcmMzKTsKKyAgICBJTFZSX0I0X1VCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzQsIHNyYzUsIHNyYzYsCisgICAgICAgICAgICAgICBzcmM3KTsKKyAgICBET1RQX1VCNF9VSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX3ZlYywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgRE9UUF9VQjRfVUgoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgY29lZmZfdmVjLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywKKyAgICAgICAgICAgICAgICBjb2VmZl92ZWMsIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgIFNMTElfNFYocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgMyk7CisgICAgU0xMSV80VihyZXM0LCByZXM1LCByZXM2LCByZXM3LCAzKTsKKyAgICBTUkFSSV9INF9VSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA2KTsKKyAgICBTUkFSSV9INF9VSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA2KTsKKyAgICBTQVRfVUg0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgUENLRVZfQjJfVUIocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgb3V0MCwgb3V0MSk7CisgICAgUENLRVZfQjJfVUIocmVzNSwgcmVzNCwgcmVzNywgcmVzNiwgb3V0Miwgb3V0Myk7CisgICAgU1Q4eDhfVUIob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBzdHJpZGUpOworfQogCi0gICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIHNyYzAgPSBzcmM0Oworc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF84d19tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3sKKyAgICBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Nocm9tYV92dF84eDRfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKKyAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfOHg4X21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2XzJ4Ml9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2XzJ4Ml9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwgdWludDMyX3QgY29lZl9ob3IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMCwgdWludDMyX3QgY29lZl92ZXIxKQogewpAQCAtNTIyLDcgKzU0Myw3IEBACiAKICAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2Fycls0OF0pOwogCi0gICAgTERfVUIzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgTERfVUIzKHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKICAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzEsIHNyYzIsIG1hc2ssIG1hc2ssIHNyYzAsIHNyYzEpOwogICAgIERPVFBfVUIyX1VIKHNyYzAsIHNyYzEsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHowLCByZXNfaHoxKTsKICAgICBNVUwyKHJlc19oejAsIGNvZWZmX3Z0X3ZlYzEsIHJlc19oejEsIGNvZWZmX3Z0X3ZlYzAsIHJlc192dDAsIHJlc192dDEpOwpAQCAtNTM2LDEyICs1NTcsMTEgQEAKICAgICBvdXQxID0gX19tc2FfY29weV91X2gocmVzX3ZlcnQsIDEpOwogCiAgICAgU0gob3V0MCwgZHN0KTsKLSAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICBkc3QgKz0gc3RyaWRlOwogICAgIFNIKG91dDEsIGRzdCk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfMng0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfMng0X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLCB1aW50MzJfdCBjb2VmX2hvcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLCB1aW50MzJfdCBjb2VmX3ZlcjEpCiB7CkBAIC01NTgsNyArNTc4LDcgQEAKIAogICAgIG1hc2sgPSBMRF9TQigmY2hyb21hX21hc2tfYXJyWzQ4XSk7CiAKLSAgICBMRF9VQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBMRF9VQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwogCiAgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrLCBtYXNrLCB0bXAwLCB0bXAxKTsKICAgICBWU0hGX0IyX1VCKHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIG1hc2ssIG1hc2ssIHRtcDIsIHRtcDMpOwpAQCAtNTY5LDgzICs1ODksMjcgQEAKICAgICByZXNfdnQwICs9IHJlc192dDE7CiAgICAgcmVzX3Z0MCA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc192dDAsIDYpOwogICAgIHJlc192dDAgPSBfX21zYV9zYXRfdV9oKHJlc192dDAsIDcpOworCiAgICAgcmVzID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3Z0MCwgKHYxNmk4KSByZXNfdnQwKTsKIAotICAgIFNUMng0X1VCKHJlcywgMCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDJ4NF9VQihyZXMsIDAsIGRzdCwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl8yeDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwgdWludDMyX3QgY29lZl9ob3IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMCwgdWludDMyX3QgY29lZl92ZXIxKQotewotICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7Ci0gICAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICB2OHUxNiByZXNfaHowLCByZXNfaHoxLCByZXNfdnQwLCByZXNfdnQxOwotICAgIHY4aTE2IHJlczsKLSAgICB2MTZpOCBtYXNrOwotICAgIHYxNmk4IGNvZWZmX2h6X3ZlYzAgPSBfX21zYV9maWxsX2IoY29lZl9ob3IwKTsKLSAgICB2MTZpOCBjb2VmZl9oel92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZfaG9yMSk7Ci0gICAgdjE2dTggY29lZmZfaHpfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfaHpfdmVjMCwgY29lZmZfaHpfdmVjMSk7Ci0gICAgdjh1MTYgY29lZmZfdnRfdmVjMCA9ICh2OHUxNikgX19tc2FfZmlsbF9oKGNvZWZfdmVyMCk7Ci0gICAgdjh1MTYgY29lZmZfdnRfdmVjMSA9ICh2OHUxNikgX19tc2FfZmlsbF9oKGNvZWZfdmVyMSk7Ci0KLSAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2Fycls0OF0pOwotCi0gICAgTERfVUI1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICg1ICogc3JjX3N0cmlkZSk7Ci0gICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7Ci0KLSAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2ssIG1hc2ssIHRtcDAsIHRtcDEpOwotICAgIFZTSEZfQjJfVUIoc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgbWFzaywgbWFzaywgdG1wMiwgdG1wMyk7Ci0gICAgSUxWUl9EMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCBzcmMwLCBzcmMxKTsKLSAgICBWU0hGX0IyX1VCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2ssIG1hc2ssIHRtcDAsIHRtcDEpOwotICAgIFZTSEZfQjJfVUIoc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgbWFzaywgbWFzaywgdG1wMiwgdG1wMyk7Ci0gICAgSUxWUl9EMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCBzcmM0LCBzcmM1KTsKLSAgICBET1RQX1VCMl9VSChzcmMwLCBzcmMxLCBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywgcmVzX2h6MCwgcmVzX2h6MSk7Ci0gICAgTVVMMihyZXNfaHowLCBjb2VmZl92dF92ZWMxLCByZXNfaHoxLCBjb2VmZl92dF92ZWMwLCByZXNfdnQwLCByZXNfdnQxKTsKLQotICAgIHJlc192dDAgKz0gcmVzX3Z0MTsKLSAgICByZXNfdnQwID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgcmVzX3Z0MCwgNik7Ci0gICAgcmVzX3Z0MCA9IF9fbXNhX3NhdF91X2gocmVzX3Z0MCwgNyk7Ci0KLSAgICByZXMgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfdnQwLCAodjE2aTgpIHJlc192dDApOwotCi0gICAgU1QyeDRfVUIocmVzLCAwLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotCi0gICAgRE9UUF9VQjJfVUgoc3JjNCwgc3JjNSwgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsIHJlc19oejAsIHJlc19oejEpOwotICAgIE1VTDIocmVzX2h6MCwgY29lZmZfdnRfdmVjMSwgcmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0MCwgcmVzX3Z0MSk7Ci0KLSAgICByZXNfdnQwICs9IHJlc192dDE7Ci0gICAgcmVzX3Z0MCA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc192dDAsIDYpOwotICAgIHJlc192dDAgPSBfX21zYV9zYXRfdV9oKHJlc192dDAsIDcpOwotCi0gICAgcmVzID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3Z0MCwgKHYxNmk4KSByZXNfdnQwKTsKLQotICAgIFNUMng0X1VCKHJlcywgMCwgZHN0LCBkc3Rfc3RyaWRlKTsKLX0KLQotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl8yd19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfMndfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwgdWludDMyX3QgY29lZl9ob3IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLCB1aW50MzJfdCBjb2VmX3ZlcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9odl8yeDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBjb2VmX2hvcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjEsIGNvZWZfdmVyMCwgY29lZl92ZXIxKTsKKyAgICAgICAgYXZjX2Nocm9tYV9odl8yeDJfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZfaG9yMCwgY29lZl9ob3IxLCBjb2VmX3ZlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX3ZlcjEpOwogICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9odl8yeDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBjb2VmX2hvcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjEsIGNvZWZfdmVyMCwgY29lZl92ZXIxKTsKLSAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHZfMng4X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgY29lZl9ob3IwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9ob3IxLCBjb2VmX3ZlcjAsIGNvZWZfdmVyMSk7CisgICAgICAgIGF2Y19jaHJvbWFfaHZfMng0X21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmX2hvcjAsIGNvZWZfaG9yMSwgY29lZl92ZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl92ZXIxKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfNHgyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfNHgyX21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLCB1aW50MzJfdCBjb2VmX2hvcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLCB1aW50MzJfdCBjb2VmX3ZlcjEpCiB7CkBAIC02NjAsNyArNjI0LDcgQEAKICAgICB2OHUxNiBjb2VmZl92dF92ZWMxID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIxKTsKIAogICAgIG1hc2sgPSBMRF9TQigmY2hyb21hX21hc2tfYXJyWzBdKTsKLSAgICBMRF9VQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBMRF9VQjMoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzaywgbWFzaywgc3JjMCwgc3JjMSk7CiAgICAgRE9UUF9VQjJfVUgoc3JjMCwgc3JjMSwgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsIHJlc19oejAsIHJlc19oejEpOwogICAgIE1VTDIocmVzX2h6MCwgY29lZmZfdnRfdmVjMSwgcmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0MCwgcmVzX3Z0MSk7CkBAIC02NzAsMTggKzYzNCwxMyBAQAogICAgIHJlc192dDAgPSBfX21zYV9zYXRfdV9oKHJlc192dDAsIDcpOwogICAgIHJlcyA9ICh2NGkzMikgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc192dDAsICh2MTZpOCkgcmVzX3Z0MCk7CiAKLSAgICBTVDR4Ml9VQihyZXMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgU1Q0eDJfVUIocmVzLCBkc3QsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfNHg0bXVsdGlwbGVfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfNHg0X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLCB1aW50MzJfdCBjb2VmX2hvcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLCB1aW50MzJfdCBjb2VmX3ZlcjEpCiB7Ci0gICAgdWludDMyX3Qgcm93OwogICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7CiAgICAgdjh1MTYgcmVzX2h6MCwgcmVzX2h6MSwgcmVzX2h6MiwgcmVzX2h6MzsKICAgICB2OHUxNiByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzOwpAQCAtNjk1LDU1ICs2NTQsODIgQEAKIAogICAgIG1hc2sgPSBMRF9TQigmY2hyb21hX21hc2tfYXJyWzBdKTsKIAotICAgIHNyYzAgPSBMRF9VQihzcmMpOwotICAgIHNyYyArPSBzcmNfc3RyaWRlOwotCi0gICAgZm9yIChyb3cgPSAoaGVpZ2h0ID4+IDIpOyByb3ctLTspIHsKLSAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzaywgbWFzaywgc3JjMCwgc3JjMSk7Ci0gICAgICAgIFZTSEZfQjJfVUIoc3JjMiwgc3JjMywgc3JjMywgc3JjNCwgbWFzaywgbWFzaywgc3JjMiwgc3JjMyk7Ci0gICAgICAgIERPVFBfVUI0X1VIKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAotICAgICAgICAgICAgICAgICAgICBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywgcmVzX2h6MCwgcmVzX2h6MSwgcmVzX2h6MiwKLSAgICAgICAgICAgICAgICAgICAgcmVzX2h6Myk7Ci0gICAgICAgIE1VTDQocmVzX2h6MCwgY29lZmZfdnRfdmVjMSwgcmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX2h6MiwKLSAgICAgICAgICAgICBjb2VmZl92dF92ZWMxLCByZXNfaHozLCBjb2VmZl92dF92ZWMwLCByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLAotICAgICAgICAgICAgIHJlc192dDMpOwotICAgICAgICBBREQyKHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMsIHJlc192dDAsIHJlc192dDEpOwotICAgICAgICBTUkFSSV9IMl9VSChyZXNfdnQwLCByZXNfdnQxLCA2KTsKLSAgICAgICAgU0FUX1VIMl9VSChyZXNfdnQwLCByZXNfdnQxLCA3KTsKLSAgICAgICAgUENLRVZfQjJfU1cocmVzX3Z0MCwgcmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MSwgcmVzMCwgcmVzMSk7Ci0KLSAgICAgICAgU1Q0eDRfVUIocmVzMCwgcmVzMSwgMCwgMSwgMCwgMSwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIHNyYzAgPSBzcmM0OwotICAgIH0KKyAgICBMRF9VQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzaywgbWFzaywgc3JjMCwgc3JjMSk7CisgICAgVlNIRl9CMl9VQihzcmMyLCBzcmMzLCBzcmMzLCBzcmM0LCBtYXNrLCBtYXNrLCBzcmMyLCBzcmMzKTsKKyAgICBET1RQX1VCNF9VSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywKKyAgICAgICAgICAgICAgICBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywgcmVzX2h6MCwgcmVzX2h6MSwgcmVzX2h6MiwKKyAgICAgICAgICAgICAgICByZXNfaHozKTsKKyAgICBNVUw0KHJlc19oejAsIGNvZWZmX3Z0X3ZlYzEsIHJlc19oejEsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejIsIGNvZWZmX3Z0X3ZlYzEsCisgICAgICAgICByZXNfaHozLCBjb2VmZl92dF92ZWMwLCByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzKTsKKyAgICBBREQyKHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMsIHJlc192dDAsIHJlc192dDEpOworICAgIFNSQVJJX0gyX1VIKHJlc192dDAsIHJlc192dDEsIDYpOworICAgIFNBVF9VSDJfVUgocmVzX3Z0MCwgcmVzX3Z0MSwgNyk7CisgICAgUENLRVZfQjJfU1cocmVzX3Z0MCwgcmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MSwgcmVzMCwgcmVzMSk7CisgICAgU1Q0eDRfVUIocmVzMCwgcmVzMSwgMCwgMSwgMCwgMSwgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl80eDhfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjAsIHVpbnQzMl90IGNvZWZfaG9yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsIHVpbnQzMl90IGNvZWZfdmVyMSkKK3sKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCByZXMwLCByZXMxOworICAgIHY4dTE2IHJlc19oejAsIHJlc19oejEsIHJlc19oejIsIHJlc19oejMsIHJlc19oejQsIHJlc19oejUsIHJlc19oejYsIHJlc19oejc7CisgICAgdjh1MTYgcmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MywgcmVzX3Z0NCwgcmVzX3Z0NSwgcmVzX3Z0NiwgcmVzX3Z0NzsKKyAgICB2MTZpOCBtYXNrOworICAgIHYxNmk4IGNvZWZmX2h6X3ZlYzAgPSBfX21zYV9maWxsX2IoY29lZl9ob3IwKTsKKyAgICB2MTZpOCBjb2VmZl9oel92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZfaG9yMSk7CisgICAgdjE2dTggY29lZmZfaHpfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfaHpfdmVjMCwgY29lZmZfaHpfdmVjMSk7CisgICAgdjh1MTYgY29lZmZfdnRfdmVjMCA9ICh2OHUxNikgX19tc2FfZmlsbF9oKGNvZWZfdmVyMCk7CisgICAgdjh1MTYgY29lZmZfdnRfdmVjMSA9ICh2OHUxNikgX19tc2FfZmlsbF9oKGNvZWZfdmVyMSk7CisKKyAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclswXSk7CisKKyAgICBMRF9VQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisgICAgTERfVUI0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzaywgbWFzaywgc3JjMCwgc3JjMSk7CisgICAgVlNIRl9CMl9VQihzcmMyLCBzcmMzLCBzcmMzLCBzcmM0LCBtYXNrLCBtYXNrLCBzcmMyLCBzcmMzKTsKKyAgICBWU0hGX0IyX1VCKHNyYzQsIHNyYzUsIHNyYzUsIHNyYzYsIG1hc2ssIG1hc2ssIHNyYzQsIHNyYzUpOworICAgIFZTSEZfQjJfVUIoc3JjNiwgc3JjNywgc3JjNywgc3JjOCwgbWFzaywgbWFzaywgc3JjNiwgc3JjNyk7CisgICAgRE9UUF9VQjRfVUgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsCisgICAgICAgICAgICAgICAgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsIHJlc19oejAsIHJlc19oejEsIHJlc19oejIsIHJlc19oejMpOworICAgIERPVFBfVUI0X1VIKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHo0LCByZXNfaHo1LCByZXNfaHo2LCByZXNfaHo3KTsKKyAgICBNVUw0KHJlc19oejAsIGNvZWZmX3Z0X3ZlYzEsIHJlc19oejEsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejIsIGNvZWZmX3Z0X3ZlYzEsCisgICAgICAgICByZXNfaHozLCBjb2VmZl92dF92ZWMwLCByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzKTsKKyAgICBNVUw0KHJlc19oejQsIGNvZWZmX3Z0X3ZlYzEsIHJlc19oejUsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejYsIGNvZWZmX3Z0X3ZlYzEsCisgICAgICAgICByZXNfaHo3LCBjb2VmZl92dF92ZWMwLCByZXNfdnQ0LCByZXNfdnQ1LCByZXNfdnQ2LCByZXNfdnQ3KTsKKyAgICBBREQyKHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMsIHJlc192dDAsIHJlc192dDEpOworICAgIEFERDIocmVzX3Z0NCwgcmVzX3Z0NSwgcmVzX3Z0NiwgcmVzX3Z0NywgcmVzX3Z0MiwgcmVzX3Z0Myk7CisgICAgU1JBUklfSDRfVUgocmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MywgNik7CisgICAgU0FUX1VINF9VSChyZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzLCA3KTsKKyAgICBQQ0tFVl9CMl9VQihyZXNfdnQxLCByZXNfdnQwLCByZXNfdnQzLCByZXNfdnQyLCByZXMwLCByZXMxKTsKKyAgICBTVDR4OF9VQihyZXMwLCByZXMxLCBkc3QsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfNHdfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwgdWludDMyX3QgY29lZl9ob3IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLCB1aW50MzJfdCBjb2VmX3ZlcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9odl80eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBjb2VmX2hvcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjEsIGNvZWZfdmVyMCwgY29lZl92ZXIxKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhdmNfY2hyb21hX2h2XzR4NG11bHRpcGxlX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9ob3IwLCBjb2VmX2hvcjEsIGNvZWZfdmVyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl92ZXIxLCBoZWlnaHQpOworICAgICAgICBhdmNfY2hyb21hX2h2XzR4Ml9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZl9ob3IwLCBjb2VmX2hvcjEsIGNvZWZfdmVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfdmVyMSk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX2h2XzR4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZl9ob3IwLCBjb2VmX2hvcjEsIGNvZWZfdmVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfdmVyMSk7CisgICAgfSBlbHNlIGlmICg4ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX2h2XzR4OF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZl9ob3IwLCBjb2VmX2hvcjEsIGNvZWZfdmVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfdmVyMSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2Xzh3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLCB1aW50MzJfdCBjb2VmX2hvcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsIHVpbnQzMl90IGNvZWZfdmVyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl84eDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjAsIHVpbnQzMl90IGNvZWZfaG9yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsIHVpbnQzMl90IGNvZWZfdmVyMSkKIHsKLSAgICB1aW50MzJfdCByb3c7CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgb3V0MCwgb3V0MTsKICAgICB2OHUxNiByZXNfaHowLCByZXNfaHoxLCByZXNfaHoyLCByZXNfaHozLCByZXNfaHo0OwogICAgIHY4dTE2IHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDM7CkBAIC03NTcsNDYgKzc0MywxMDcgQEAKICAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclszMl0pOwogCiAgICAgc3JjMCA9IExEX1VCKHNyYyk7Ci0gICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgc3JjICs9IHN0cmlkZTsKIAogICAgIHNyYzAgPSAodjE2dTgpIF9fbXNhX3ZzaGZfYihtYXNrLCAodjE2aTgpIHNyYzAsICh2MTZpOCkgc3JjMCk7CiAgICAgcmVzX2h6MCA9IF9fbXNhX2RvdHBfdV9oKHNyYzAsIGNvZWZmX2h6X3ZlYyk7CiAKLSAgICBmb3IgKHJvdyA9IChoZWlnaHQgPj4gMik7IHJvdy0tOykgewotICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgTERfVUI0KHNyYywgc3RyaWRlLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOwogCi0gICAgICAgIFZTSEZfQjJfVUIoc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzaywgbWFzaywgc3JjMSwgc3JjMik7Ci0gICAgICAgIFZTSEZfQjJfVUIoc3JjMywgc3JjMywgc3JjNCwgc3JjNCwgbWFzaywgbWFzaywgc3JjMywgc3JjNCk7Ci0gICAgICAgIERPVFBfVUI0X1VIKHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAotICAgICAgICAgICAgICAgICAgICBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywgcmVzX2h6MSwgcmVzX2h6MiwgcmVzX2h6MywKLSAgICAgICAgICAgICAgICAgICAgcmVzX2h6NCk7Ci0gICAgICAgIE1VTDQocmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX2h6MiwgY29lZmZfdnRfdmVjMCwgcmVzX2h6MywKLSAgICAgICAgICAgICBjb2VmZl92dF92ZWMwLCByZXNfaHo0LCBjb2VmZl92dF92ZWMwLCByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLAotICAgICAgICAgICAgIHJlc192dDMpOworICAgIFZTSEZfQjJfVUIoc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzaywgbWFzaywgc3JjMSwgc3JjMik7CisgICAgVlNIRl9CMl9VQihzcmMzLCBzcmMzLCBzcmM0LCBzcmM0LCBtYXNrLCBtYXNrLCBzcmMzLCBzcmM0KTsKKyAgICBET1RQX1VCNF9VSChzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywKKyAgICAgICAgICAgICAgICBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywgcmVzX2h6MSwgcmVzX2h6MiwgcmVzX2h6MywgcmVzX2h6NCk7CisgICAgTVVMNChyZXNfaHoxLCBjb2VmZl92dF92ZWMwLCByZXNfaHoyLCBjb2VmZl92dF92ZWMwLCByZXNfaHozLCBjb2VmZl92dF92ZWMwLAorICAgICAgICAgcmVzX2h6NCwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0Myk7CiAKLSAgICAgICAgcmVzX3Z0MCArPSAocmVzX2h6MCAqIGNvZWZmX3Z0X3ZlYzEpOwotICAgICAgICByZXNfdnQxICs9IChyZXNfaHoxICogY29lZmZfdnRfdmVjMSk7Ci0gICAgICAgIHJlc192dDIgKz0gKHJlc19oejIgKiBjb2VmZl92dF92ZWMxKTsKLSAgICAgICAgcmVzX3Z0MyArPSAocmVzX2h6MyAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIHJlc192dDAgKz0gKHJlc19oejAgKiBjb2VmZl92dF92ZWMxKTsKKyAgICByZXNfdnQxICs9IChyZXNfaHoxICogY29lZmZfdnRfdmVjMSk7CisgICAgcmVzX3Z0MiArPSAocmVzX2h6MiAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIHJlc192dDMgKz0gKHJlc19oejMgKiBjb2VmZl92dF92ZWMxKTsKIAotICAgICAgICBTUkFSSV9INF9VSChyZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzLCA2KTsKLSAgICAgICAgU0FUX1VINF9VSChyZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzLCA3KTsKLSAgICAgICAgUENLRVZfQjJfVUIocmVzX3Z0MSwgcmVzX3Z0MCwgcmVzX3Z0MywgcmVzX3Z0Miwgb3V0MCwgb3V0MSk7Ci0gICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgU1JBUklfSDRfVUgocmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MywgNik7CisgICAgU0FUX1VINF9VSChyZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzLCA3KTsKKyAgICBQQ0tFVl9CMl9VQihyZXNfdnQxLCByZXNfdnQwLCByZXNfdnQzLCByZXNfdnQyLCBvdXQwLCBvdXQxKTsKKyAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIHN0cmlkZSk7Cit9CiAKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2Xzh4OF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwgdWludDMyX3QgY29lZl9ob3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMCwgdWludDMyX3QgY29lZl92ZXIxKQoreworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2OHUxNiByZXNfaHowLCByZXNfaHoxLCByZXNfaHoyLCByZXNfaHozLCByZXNfaHo0OworICAgIHY4dTE2IHJlc19oejUsIHJlc19oejYsIHJlc19oejcsIHJlc19oejg7CisgICAgdjh1MTYgcmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MzsKKyAgICB2OHUxNiByZXNfdnQ0LCByZXNfdnQ1LCByZXNfdnQ2LCByZXNfdnQ3OworICAgIHYxNmk4IG1hc2s7CisgICAgdjE2aTggY29lZmZfaHpfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmX2hvcjApOworICAgIHYxNmk4IGNvZWZmX2h6X3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZl9ob3IxKTsKKyAgICB2MTZ1OCBjb2VmZl9oel92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl9oel92ZWMwLCBjb2VmZl9oel92ZWMxKTsKKyAgICB2OHUxNiBjb2VmZl92dF92ZWMwID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIwKTsKKyAgICB2OHUxNiBjb2VmZl92dF92ZWMxID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIxKTsKIAotICAgICAgICByZXNfaHowID0gcmVzX2h6NDsKKyAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclszMl0pOworCisgICAgTERfVUI1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIExEX1VCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgc3JjMCA9ICh2MTZ1OCkgX19tc2FfdnNoZl9iKG1hc2ssICh2MTZpOCkgc3JjMCwgKHYxNmk4KSBzcmMwKTsKKyAgICBWU0hGX0IyX1VCKHNyYzEsIHNyYzEsIHNyYzIsIHNyYzIsIG1hc2ssIG1hc2ssIHNyYzEsIHNyYzIpOworICAgIFZTSEZfQjJfVUIoc3JjMywgc3JjMywgc3JjNCwgc3JjNCwgbWFzaywgbWFzaywgc3JjMywgc3JjNCk7CisgICAgVlNIRl9CMl9VQihzcmM1LCBzcmM1LCBzcmM2LCBzcmM2LCBtYXNrLCBtYXNrLCBzcmM1LCBzcmM2KTsKKyAgICBWU0hGX0IyX1VCKHNyYzcsIHNyYzcsIHNyYzgsIHNyYzgsIG1hc2ssIG1hc2ssIHNyYzcsIHNyYzgpOworICAgIHJlc19oejAgPSBfX21zYV9kb3RwX3VfaChzcmMwLCBjb2VmZl9oel92ZWMpOworICAgIERPVFBfVUI0X1VIKHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHoxLCByZXNfaHoyLCByZXNfaHozLAorICAgICAgICAgICAgICAgIHJlc19oejQpOworICAgIERPVFBfVUI0X1VIKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHo1LCByZXNfaHo2LCByZXNfaHo3LCByZXNfaHo4KTsKKyAgICBNVUw0KHJlc19oejEsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejIsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejMsCisgICAgICAgICBjb2VmZl92dF92ZWMwLCByZXNfaHo0LCBjb2VmZl92dF92ZWMwLCByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLAorICAgICAgICAgcmVzX3Z0Myk7CisgICAgTVVMNChyZXNfaHo1LCBjb2VmZl92dF92ZWMwLCByZXNfaHo2LCBjb2VmZl92dF92ZWMwLCByZXNfaHo3LAorICAgICAgICAgY29lZmZfdnRfdmVjMCwgcmVzX2h6OCwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0NCwgcmVzX3Z0NSwgcmVzX3Z0NiwKKyAgICAgICAgIHJlc192dDcpOworICAgIHJlc192dDAgKz0gKHJlc19oejAgKiBjb2VmZl92dF92ZWMxKTsKKyAgICByZXNfdnQxICs9IChyZXNfaHoxICogY29lZmZfdnRfdmVjMSk7CisgICAgcmVzX3Z0MiArPSAocmVzX2h6MiAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIHJlc192dDMgKz0gKHJlc19oejMgKiBjb2VmZl92dF92ZWMxKTsKKyAgICByZXNfdnQ0ICs9IChyZXNfaHo0ICogY29lZmZfdnRfdmVjMSk7CisgICAgcmVzX3Z0NSArPSAocmVzX2h6NSAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIHJlc192dDYgKz0gKHJlc19oejYgKiBjb2VmZl92dF92ZWMxKTsKKyAgICByZXNfdnQ3ICs9IChyZXNfaHo3ICogY29lZmZfdnRfdmVjMSk7CisgICAgU1JBUklfSDRfVUgocmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MywgNik7CisgICAgU1JBUklfSDRfVUgocmVzX3Z0NCwgcmVzX3Z0NSwgcmVzX3Z0NiwgcmVzX3Z0NywgNik7CisgICAgU0FUX1VINF9VSChyZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzLCA3KTsKKyAgICBTQVRfVUg0X1VIKHJlc192dDQsIHJlc192dDUsIHJlc192dDYsIHJlc192dDcsIDcpOworICAgIFBDS0VWX0IyX1VCKHJlc192dDEsIHJlc192dDAsIHJlc192dDMsIHJlc192dDIsIG91dDAsIG91dDEpOworICAgIFBDS0VWX0IyX1VCKHJlc192dDUsIHJlc192dDQsIHJlc192dDcsIHJlc192dDYsIG91dDIsIG91dDMpOworICAgIFNUOHg4X1VCKG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl84d19tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLCB1aW50MzJfdCBjb2VmX2hvcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsIHVpbnQzMl90IGNvZWZfdmVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQoreworICAgIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX2h2Xzh4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZl9ob3IwLCBjb2VmX2hvcjEsIGNvZWZfdmVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfdmVyMSk7CisgICAgfSBlbHNlIGlmICg4ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX2h2Xzh4OF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZl9ob3IwLCBjb2VmX2hvcjEsIGNvZWZfdmVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfdmVyMSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF8yeDJfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEpCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF8yeDJfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjEpCiB7CiAgICAgdWludDE2X3Qgb3V0MCwgb3V0MTsKLSAgICB1aW50MzJfdCBsb2FkMCwgbG9hZDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMTsKICAgICB2MTZ1OCBkc3RfZGF0YSA9IHsgMCB9OwogICAgIHY4dTE2IHJlc19yOwpAQCAtODA4LDEyICs4NTUsMTMgQEAKIAogICAgIG1hc2sgPSBMRF9TQigmY2hyb21hX21hc2tfYXJyWzBdKTsKIAotICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEpOworICAgIExEX1NCMihzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSk7CiAKLSAgICBsb2FkMCA9IExXKGRzdCk7Ci0gICAgbG9hZDEgPSBMVyhkc3QgKyBkc3Rfc3RyaWRlKTsKKyAgICBvdXQwID0gTEgoZHN0KTsKKyAgICBvdXQxID0gTEgoZHN0ICsgc3RyaWRlKTsKIAotICAgIElOU0VSVF9XMl9VQihsb2FkMCwgbG9hZDEsIGRzdF9kYXRhKTsKKyAgICBkc3RfZGF0YSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YSwgMCwgb3V0MCk7CisgICAgZHN0X2RhdGEgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEsIDIsIG91dDEpOwogCiAgICAgc3JjMCA9IF9fbXNhX3ZzaGZfYihtYXNrLCBzcmMxLCBzcmMwKTsKIApAQCAtODI5LDMwICs4NzcsMzQgQEAKICAgICBvdXQxID0gX19tc2FfY29weV91X2goKHY4aTE2KSBkc3RfZGF0YSwgMik7CiAKICAgICBTSChvdXQwLCBkc3QpOwotICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIGRzdCArPSBzdHJpZGU7CiAgICAgU0gob3V0MSwgZHN0KTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfMng0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwgdWludDMyX3QgY29lZmYxKQorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfMng0X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGNvZWZmMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYxKQogeworICAgIHVpbnQxNl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2dTggZHN0MCwgZHN0X2RhdGEgPSB7IDAgfTsKICAgICB2OHUxNiByZXNfcjsKLSAgICB2MTZpOCByZXMsIG1hc2s7CisgICAgdjE2aTggbWFzazsKICAgICB2MTZpOCBjb2VmZl92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZmMCk7CiAgICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOwogICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOwogCiAgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbNjRdKTsKIAotICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCi0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfaCgodjhpMTYpIGRzdDAsIDEsICh2OGkxNikgZHN0MSk7Ci0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfaCgodjhpMTYpIGRzdDAsIDIsICh2OGkxNikgZHN0Mik7Ci0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfaCgodjhpMTYpIGRzdDAsIDMsICh2OGkxNikgZHN0Myk7CisgICAgTERfVUI0KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICB0cDAgPSBMSChkc3QpOworICAgIHRwMSA9IExIKGRzdCArIHN0cmlkZSk7CisgICAgdHAyID0gTEgoZHN0ICsgMiAqIHN0cmlkZSk7CisgICAgdHAzID0gTEgoZHN0ICsgMyAqIHN0cmlkZSk7CisgICAgZHN0X2RhdGEgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEsIDAsIHRwMCk7CisgICAgZHN0X2RhdGEgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEsIDEsIHRwMSk7CisgICAgZHN0X2RhdGEgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEsIDIsIHRwMik7CisgICAgZHN0X2RhdGEgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEsIDMsIHRwMyk7CiAKICAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2ssIG1hc2ssIHNyYzAsIHNyYzIpOwogCkBAIC04NjMsNzUgKzkxNSwyNiBAQAogICAgIHJlc19yID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgcmVzX3IsIDYpOwogICAgIHJlc19yID0gX19tc2Ffc2F0X3VfaChyZXNfciwgNyk7CiAKLSAgICByZXMgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3IsICh2MTZpOCkgcmVzX3IpOwotICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYigodjE2dTgpIHJlcywgZHN0MCk7CisgICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc19yLCAodjE2aTgpIHJlc19yKTsKKyAgICBkc3QwID0gX19tc2FfYXZlcl91X2IoZHN0MCwgZHN0X2RhdGEpOwogCi0gICAgU1QyeDRfVUIoZHN0MCwgMCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDJ4NF9VQihkc3QwLCAwLCBkc3QsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzJ4OF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSkKLXsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7Ci0gICAgdjh1MTYgcmVzMF9yLCByZXMxX3I7Ci0gICAgdjE2dTggcmVzMCwgcmVzMSwgbWFzazsKLSAgICB2MTZpOCBjb2VmZl92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZmMCk7Ci0gICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOwotICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOwotCi0gICAgbWFzayA9IExEX1VCKCZjaHJvbWFfbWFza19hcnJbNjRdKTsKLQotICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgIExEX1VCOChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOwotCi0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfaCgodjhpMTYpIGRzdDAsIDEsICh2OGkxNikgZHN0MSk7Ci0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfaCgodjhpMTYpIGRzdDAsIDIsICh2OGkxNikgZHN0Mik7Ci0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfaCgodjhpMTYpIGRzdDAsIDMsICh2OGkxNikgZHN0Myk7Ci0KLSAgICBkc3Q0ID0gKHYxNnU4KSBfX21zYV9pbnN2ZV9oKCh2OGkxNikgZHN0NCwgMSwgKHY4aTE2KSBkc3Q1KTsKLSAgICBkc3Q0ID0gKHYxNnU4KSBfX21zYV9pbnN2ZV9oKCh2OGkxNikgZHN0NCwgMiwgKHY4aTE2KSBkc3Q2KTsKLSAgICBkc3Q0ID0gKHYxNnU4KSBfX21zYV9pbnN2ZV9oKCh2OGkxNikgZHN0NCwgMywgKHY4aTE2KSBkc3Q3KTsKLQotICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzaywgbWFzaywgc3JjMCwgc3JjMik7Ci0gICAgVlNIRl9CMl9VQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrLCBtYXNrLCBzcmM0LCBzcmM2KTsKLSAgICBJTFZSX0QyX1VCKHNyYzIsIHNyYzAsIHNyYzYsIHNyYzQsIHNyYzAsIHNyYzQpOwotICAgIERPVFBfVUIyX1VIKHNyYzAsIHNyYzQsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCByZXMwX3IsIHJlczFfcik7Ci0KLSAgICByZXMwX3IgPDw9IDM7Ci0gICAgcmVzMV9yIDw8PSAzOwotCi0gICAgU1JBUklfSDJfVUgocmVzMF9yLCByZXMxX3IsIDYpOwotICAgIFNBVF9VSDJfVUgocmVzMF9yLCByZXMxX3IsIDcpOwotICAgIFBDS0VWX0IyX1VCKHJlczBfciwgcmVzMF9yLCByZXMxX3IsIHJlczFfciwgcmVzMCwgcmVzMSk7Ci0gICAgQVZFUl9VQjJfVUIocmVzMCwgZHN0MCwgcmVzMSwgZHN0NCwgZHN0MCwgZHN0NCk7Ci0KLSAgICBTVDJ4NF9VQihkc3QwLCAwLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIFNUMng0X1VCKGRzdDQsIDAsIGRzdCwgZHN0X3N0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzJ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzJ3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzJ4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYwLCBjb2VmZjEpOworICAgICAgICBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF8yeDJfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKICAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzJ4NF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYwLCBjb2VmZjEpOwotICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfMng4X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZjAsIGNvZWZmMSk7CisgICAgICAgIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzJ4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfNHgyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwgdWludDMyX3QgY29lZmYxKQorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfNHgyX21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGNvZWZmMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYxKQogewogICAgIHVpbnQzMl90IGxvYWQwLCBsb2FkMTsKICAgICB2MTZpOCBzcmMwLCBzcmMxOwpAQCAtOTQ0LDEwICs5NDcsOSBAQAogCiAgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbMF0pOwogCi0gICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7CisgICAgTERfU0IyKHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxKTsKIAotICAgIGxvYWQwID0gTFcoZHN0KTsKLSAgICBsb2FkMSA9IExXKGRzdCArIGRzdF9zdHJpZGUpOworICAgIExXMihkc3QsIHN0cmlkZSwgbG9hZDAsIGxvYWQxKTsKIAogICAgIElOU0VSVF9XMl9VQihsb2FkMCwgbG9hZDEsIGRzdF9kYXRhKTsKIApAQCAtOTYwLDg0ICs5NjIsMTIyIEBACiAgICAgcmVzID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc19yLCAodjE2aTgpIHJlc19yKTsKICAgICBkc3RfZGF0YSA9IF9fbXNhX2F2ZXJfdV9iKCh2MTZ1OCkgcmVzLCBkc3RfZGF0YSk7CiAKLSAgICBTVDR4Ml9VQihkc3RfZGF0YSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDR4Ml9VQihkc3RfZGF0YSwgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF80eDRtdWx0aXBsZV9tc2EodWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF80eDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjEpCiB7Ci0gICAgdWludDMyX3QgbG9hZDAsIGxvYWQxOwotICAgIHVpbnQzMl90IHJvdzsKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZ1OCBkc3QwID0geyAwIH07Ci0gICAgdjE2dTggZHN0MSA9IHsgMCB9OworICAgIHYxNnU4IG91dCwgZHN0X2RhdGEgPSB7IDAgfTsKKyAgICB2MTZpOCBtYXNrOwogICAgIHY4dTE2IHJlczBfciwgcmVzMV9yOwotICAgIHYxNnU4IHJlczAsIHJlczEsIG1hc2s7CiAgICAgdjE2aTggY29lZmZfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmZjApOwogICAgIHYxNmk4IGNvZWZmX3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZmYxKTsKICAgICB2MTZ1OCBjb2VmZl92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl92ZWMwLCBjb2VmZl92ZWMxKTsKIAotICAgIG1hc2sgPSBMRF9VQigmY2hyb21hX21hc2tfYXJyWzBdKTsKKyAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclswXSk7CiAKLSAgICBmb3IgKHJvdyA9IChoZWlnaHQgPj4gMik7IHJvdy0tOykgewotICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgbG9hZDAgPSBMVyhkc3QpOwotICAgICAgICBsb2FkMSA9IExXKGRzdCArIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIElOU0VSVF9XMl9VQihsb2FkMCwgbG9hZDEsIGRzdDApOwotCi0gICAgICAgIGxvYWQwID0gTFcoZHN0ICsgMiAqIGRzdF9zdHJpZGUpOwotICAgICAgICBsb2FkMSA9IExXKGRzdCArIDMgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBJTlNFUlRfVzJfVUIobG9hZDAsIGxvYWQxLCBkc3QxKTsKLQotICAgICAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2ssIG1hc2ssIHNyYzAsIHNyYzIpOwotICAgICAgICBET1RQX1VCMl9VSChzcmMwLCBzcmMyLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgcmVzMF9yLCByZXMxX3IpOwotCi0gICAgICAgIHJlczBfciA8PD0gMzsKLSAgICAgICAgcmVzMV9yIDw8PSAzOwotCi0gICAgICAgIFNSQVJJX0gyX1VIKHJlczBfciwgcmVzMV9yLCA2KTsKLSAgICAgICAgU0FUX1VIMl9VSChyZXMwX3IsIHJlczFfciwgNyk7Ci0gICAgICAgIFBDS0VWX0IyX1VCKHJlczBfciwgcmVzMF9yLCByZXMxX3IsIHJlczFfciwgcmVzMCwgcmVzMSk7Ci0gICAgICAgIEFWRVJfVUIyX1VCKHJlczAsIGRzdDAsIHJlczEsIGRzdDEsIGRzdDAsIGRzdDEpOwotCi0gICAgICAgIFNUNHg0X1VCKGRzdDAsIGRzdDEsIDAsIDEsIDAsIDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBMRF9VQjQoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3RfZGF0YSk7CisgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrLCBtYXNrLCBzcmMwLCBzcmMyKTsKKyAgICBET1RQX1VCMl9VSChzcmMwLCBzcmMyLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgcmVzMF9yLCByZXMxX3IpOworICAgIHJlczBfciA8PD0gMzsKKyAgICByZXMxX3IgPDw9IDM7CisgICAgU1JBUklfSDJfVUgocmVzMF9yLCByZXMxX3IsIDYpOworICAgIFNBVF9VSDJfVUgocmVzMF9yLCByZXMxX3IsIDcpOworICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlczFfciwgKHYxNmk4KSByZXMwX3IpOworICAgIG91dCA9IF9fbXNhX2F2ZXJfdV9iKG91dCwgZHN0X2RhdGEpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzR4OF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBjb2VmZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSkKK3sKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgb3V0MCwgb3V0MTsKKyAgICB2MTZ1OCBkc3QwID0geyAwIH0sIGRzdDEgPSB7IDAgfTsKKyAgICB2MTZpOCBtYXNrOworICAgIHY4dTE2IHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgICAgdjE2aTggY29lZmZfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmZjApOworICAgIHYxNmk4IGNvZWZmX3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZmYxKTsKKyAgICB2MTZ1OCBjb2VmZl92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl92ZWMwLCBjb2VmZl92ZWMxKTsKKworICAgIG1hc2sgPSBMRF9TQigmY2hyb21hX21hc2tfYXJyWzBdKTsKKworICAgIExEX1VCOChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgTFc0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOworICAgIExXNChkc3QgKyA0ICogc3RyaWRlLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MSk7CisgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrLCBtYXNrLCBzcmMwLCBzcmMyKTsKKyAgICBWU0hGX0IyX1VCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2ssIG1hc2ssIHNyYzQsIHNyYzYpOworICAgIERPVFBfVUIyX1VIKHNyYzAsIHNyYzIsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCByZXMwLCByZXMxKTsKKyAgICBET1RQX1VCMl9VSChzcmM0LCBzcmM2LCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgcmVzMiwgcmVzMyk7CisgICAgU0xMSV80VihyZXMwLCByZXMxLCByZXMyLCByZXMzLCAzKTsKKyAgICBTUkFSSV9INF9VSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA2KTsKKyAgICBTQVRfVUg0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgIFBDS0VWX0IyX1VCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIG91dDAsIG91dDEpOworICAgIEFWRVJfVUIyX1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIG91dDAsIG91dDEpOworICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfNHdfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBjb2VmZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYxLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfNHgyX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZjAsIGNvZWZmMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfNHg0bXVsdGlwbGVfbXNhKHNyYywgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmMCwgY29lZmYxLCBoZWlnaHQpOworICAgICAgICBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF80eDJfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKKyAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzR4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOworICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfNHg4X21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF84d19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF84eDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjEpCiB7Ci0gICAgdWludDMyX3Qgcm93OworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBvdXQwLCBvdXQxOworICAgIHYxNnU4IGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9OwogICAgIHY4dTE2IHJlczAsIHJlczEsIHJlczIsIHJlczM7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICB2MTZpOCBtYXNrOworICAgIHYxNmk4IGNvZWZmX3ZlYzAgPSBfX21zYV9maWxsX2IoY29lZmYwKTsKKyAgICB2MTZpOCBjb2VmZl92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZmMSk7CisgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CisKKyAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclszMl0pOworICAgIExEX1VCNChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgTEQ0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2ssIG1hc2ssIHNyYzAsIHNyYzEpOworICAgIFZTSEZfQjJfVUIoc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzaywgbWFzaywgc3JjMiwgc3JjMyk7CisgICAgRE9UUF9VQjRfVUgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgY29lZmZfdmVjLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywKKyAgICAgICAgICAgICAgICBjb2VmZl92ZWMsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgIFNMTElfNFYocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgMyk7CisgICAgU1JBUklfSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNik7CisgICAgU0FUX1VINF9VSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA3KTsKKyAgICBQQ0tFVl9CMl9VQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCBvdXQwLCBvdXQxKTsKKyAgICBBVkVSX1VCMl9VQihvdXQwLCBkc3QwLCBvdXQxLCBkc3QxLCBkc3QwLCBkc3QxKTsKKyAgICBTVDh4NF9VQihkc3QwLCBkc3QxLCBkc3QsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0Xzh4OF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBjb2VmZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSkKK3sKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHYxNnU4IGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9LCBkc3QyID0geyAwIH0sIGRzdDMgPSB7IDAgfTsKKyAgICB2OHUxNiByZXMwLCByZXMxLCByZXMyLCByZXMzLCByZXM0LCByZXM1LCByZXM2LCByZXM3OwogICAgIHYxNmk4IG1hc2s7CiAgICAgdjE2aTggY29lZmZfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmZjApOwogICAgIHYxNmk4IGNvZWZmX3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZmYxKTsKQEAgLTEwNDUsNDMgKzEwODUsNjQgQEAKIAogICAgIG1hc2sgPSBMRF9TQigmY2hyb21hX21hc2tfYXJyWzMyXSk7CiAKLSAgICBmb3IgKHJvdyA9IGhlaWdodCA+PiAyOyByb3ctLTspIHsKLSAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrLCBtYXNrLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgVlNIRl9CMl9VQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrLCBtYXNrLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgRE9UUF9VQjRfVUgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgY29lZmZfdmVjLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgY29lZmZfdmVjLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKLSAgICAgICAgU0xMSV80VihyZXMwLCByZXMxLCByZXMyLCByZXMzLCAzKTsKLSAgICAgICAgU1JBUklfSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNik7Ci0gICAgICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7Ci0gICAgICAgIFBDS0VWX0IyX1VCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIG91dDAsIG91dDEpOwotICAgICAgICBQQ0tFVl9EMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKLSAgICAgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgb3V0MCwgb3V0MSk7Ci0gICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIExEX1VCOChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgTEQ0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICBMRDQoZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0Mik7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QzKTsKKyAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2ssIG1hc2ssIHNyYzAsIHNyYzEpOworICAgIFZTSEZfQjJfVUIoc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzaywgbWFzaywgc3JjMiwgc3JjMyk7CisgICAgVlNIRl9CMl9VQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrLCBtYXNrLCBzcmM0LCBzcmM1KTsKKyAgICBWU0hGX0IyX1VCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2ssIG1hc2ssIHNyYzYsIHNyYzcpOworICAgIERPVFBfVUI0X1VIKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCBjb2VmZl92ZWMsCisgICAgICAgICAgICAgICAgY29lZmZfdmVjLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBET1RQX1VCNF9VSChzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX3ZlYywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgU0xMSV80VihyZXMwLCByZXMxLCByZXMyLCByZXMzLCAzKTsKKyAgICBTTExJXzRWKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDMpOworICAgIFNSQVJJX0g0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDYpOworICAgIFNSQVJJX0g0X1VIKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDYpOworICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgU0FUX1VINF9VSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA3KTsKKyAgICBQQ0tFVl9CMl9VQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCBvdXQwLCBvdXQxKTsKKyAgICBQQ0tFVl9CMl9VQihyZXM1LCByZXM0LCByZXM3LCByZXM2LCBvdXQyLCBvdXQzKTsKKyAgICBBVkVSX1VCMl9VQihvdXQwLCBkc3QwLCBvdXQxLCBkc3QxLCBvdXQwLCBvdXQxKTsKKyAgICBBVkVSX1VCMl9VQihvdXQyLCBkc3QyLCBvdXQzLCBkc3QzLCBvdXQyLCBvdXQzKTsKKyAgICBTVDh4OF9VQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0Xzh3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSwgaW50MzJfdCBoZWlnaHQpCit7CisgICAgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0Xzh4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOworICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF8yeDJfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEpCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF8yeDJfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjEpCiB7CiAgICAgdWludDE2X3Qgb3V0MCwgb3V0MTsKLSAgICB1aW50MzJfdCBsb2FkMCwgbG9hZDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgdG1wMCwgdG1wMSwgcmVzOwogICAgIHYxNnU4IGRzdF9kYXRhID0geyAwIH07CisgICAgdjhpMTYgb3V0OwogICAgIHY4dTE2IHJlc19yOwogICAgIHYxNmk4IGNvZWZmX3ZlYzAgPSBfX21zYV9maWxsX2IoY29lZmYwKTsKICAgICB2MTZpOCBjb2VmZl92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZmMSk7CiAgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CiAKLSAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBsb2FkMCA9IExXKGRzdCk7Ci0gICAgbG9hZDEgPSBMVyhkc3QgKyBkc3Rfc3RyaWRlKTsKKyAgICBMRF9TQjMoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgIG91dDAgPSBMSChkc3QpOworICAgIG91dDEgPSBMSChkc3QgKyBzdHJpZGUpOwogCi0gICAgSU5TRVJUX1cyX1VCKGxvYWQwLCBsb2FkMSwgZHN0X2RhdGEpOworICAgIGRzdF9kYXRhID0gKHYxNnU4KSBfX21zYV9pbnNlcnRfaCgodjhpMTYpIGRzdF9kYXRhLCAwLCBvdXQwKTsKKyAgICBkc3RfZGF0YSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YSwgMiwgb3V0MSk7CiAKICAgICBJTFZSX0IyX1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHRtcDAsIHRtcDEpOwogCkBAIC0xMDkxLDIwICsxMTUyLDIwIEBACiAgICAgcmVzX3IgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSByZXNfciwgNik7CiAgICAgcmVzX3IgPSBfX21zYV9zYXRfdV9oKHJlc19yLCA3KTsKICAgICByZXMgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3IsICh2MTZpOCkgcmVzX3IpOwotICAgIGRzdF9kYXRhID0gX19tc2FfYXZlcl91X2IoKHYxNnU4KSByZXMsIGRzdF9kYXRhKTsKLSAgICBvdXQwID0gX19tc2FfY29weV91X2goKHY4aTE2KSBkc3RfZGF0YSwgMCk7Ci0gICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0X2RhdGEsIDIpOworICAgIG91dCA9ICh2OGkxNikgX19tc2FfYXZlcl91X2IoKHYxNnU4KSByZXMsIGRzdF9kYXRhKTsKKyAgICBvdXQwID0gX19tc2FfY29weV91X2gob3V0LCAwKTsKKyAgICBvdXQxID0gX19tc2FfY29weV91X2gob3V0LCAyKTsKIAogICAgIFNIKG91dDAsIGRzdCk7Ci0gICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgZHN0ICs9IHN0cmlkZTsKICAgICBTSChvdXQxLCBkc3QpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF8yeDRfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEpCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF8yeDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjEpCiB7Ci0gICAgdWludDMyX3QgbG9hZDAsIGxvYWQxOworICAgIHVpbnQxNl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHYxNnU4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgdjh1MTYgcmVzX3I7CkBAIC0xMTE0LDE5ICsxMTc1LDE2IEBACiAgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CiAgICAgdjE2dTggZHN0X2RhdGEgPSB7IDAgfTsKIAotICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CiAKLSAgICBsb2FkMCA9IExXKGRzdCk7Ci0gICAgbG9hZDEgPSBMVyhkc3QgKyBkc3Rfc3RyaWRlKTsKLQotICAgIGRzdF9kYXRhID0gKHYxNnU4KSBfX21zYV9pbnNlcnRfaCgodjhpMTYpIGRzdF9kYXRhLCAwLCBsb2FkMCk7Ci0gICAgZHN0X2RhdGEgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEsIDEsIGxvYWQxKTsKLQotICAgIGxvYWQwID0gTFcoZHN0ICsgMiAqIGRzdF9zdHJpZGUpOwotICAgIGxvYWQxID0gTFcoZHN0ICsgMyAqIGRzdF9zdHJpZGUpOwotCi0gICAgZHN0X2RhdGEgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEsIDIsIGxvYWQwKTsKLSAgICBkc3RfZGF0YSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YSwgMywgbG9hZDEpOworICAgIHRwMCA9IExIKGRzdCk7CisgICAgdHAxID0gTEgoZHN0ICsgc3RyaWRlKTsKKyAgICB0cDIgPSBMSChkc3QgKyAyICogc3RyaWRlKTsKKyAgICB0cDMgPSBMSChkc3QgKyAzICogc3RyaWRlKTsKKyAgICBkc3RfZGF0YSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YSwgMCwgdHAwKTsKKyAgICBkc3RfZGF0YSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YSwgMSwgdHAxKTsKKyAgICBkc3RfZGF0YSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YSwgMiwgdHAyKTsKKyAgICBkc3RfZGF0YSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YSwgMywgdHAzKTsKIAogICAgIElMVlJfQjRfVUIoc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOwpAQCAtMTE0MiwxMDIgKzEyMDAsMjYgQEAKICAgICByZXMgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfciwgKHYxNmk4KSByZXNfcik7CiAgICAgcmVzID0gKHY4aTE2KSBfX21zYV9hdmVyX3VfYigodjE2dTgpIHJlcywgZHN0X2RhdGEpOwogCi0gICAgU1QyeDRfVUIocmVzLCAwLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIFNUMng0X1VCKHJlcywgMCwgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF8yeDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYwLCB1aW50MzJfdCBjb2VmZjEpCi17Ci0gICAgdWludDMyX3QgbG9hZDAsIGxvYWQxLCBsb2FkMiwgbG9hZDM7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKLSAgICB2MTZ1OCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwotICAgIHY4aTE2IHJlczsKLSAgICB2OHUxNiByZXNfcjsKLSAgICB2MTZpOCBjb2VmZl92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZmMCk7Ci0gICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOwotICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOwotICAgIHYxNnU4IGRzdF9kYXRhMCA9IHsgMCB9OwotICAgIHYxNnU4IGRzdF9kYXRhMSA9IHsgMCB9OwotCi0gICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICg1ICogc3JjX3N0cmlkZSk7Ci0gICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7Ci0KLSAgICBMVzQoZHN0LCBkc3Rfc3RyaWRlLCBsb2FkMCwgbG9hZDEsIGxvYWQyLCBsb2FkMyk7Ci0KLSAgICBkc3RfZGF0YTAgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEwLCAwLCBsb2FkMCk7Ci0gICAgZHN0X2RhdGEwID0gKHYxNnU4KSBfX21zYV9pbnNlcnRfaCgodjhpMTYpIGRzdF9kYXRhMCwgMSwgbG9hZDEpOwotICAgIGRzdF9kYXRhMCA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YTAsIDIsIGxvYWQyKTsKLSAgICBkc3RfZGF0YTAgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGEwLCAzLCBsb2FkMyk7Ci0KLSAgICBMVzQoZHN0ICsgNCAqIGRzdF9zdHJpZGUsIGRzdF9zdHJpZGUsIGxvYWQwLCBsb2FkMSwgbG9hZDIsIGxvYWQzKTsKLQotICAgIGRzdF9kYXRhMSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YTEsIDAsIGxvYWQwKTsKLSAgICBkc3RfZGF0YTEgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0X2RhdGExLCAxLCBsb2FkMSk7Ci0gICAgZHN0X2RhdGExID0gKHYxNnU4KSBfX21zYV9pbnNlcnRfaCgodjhpMTYpIGRzdF9kYXRhMSwgMiwgbG9hZDIpOwotICAgIGRzdF9kYXRhMSA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3RfZGF0YTEsIDMsIGxvYWQzKTsKLQotICAgIElMVlJfQjRfVUIoc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOwotCi0gICAgSUxWUl9XMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0bXAwLCB0bXAyKTsKLQotICAgIHRtcDAgPSAodjE2dTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHRtcDIsICh2Mmk2NCkgdG1wMCk7Ci0KLSAgICByZXNfciA9IF9fbXNhX2RvdHBfdV9oKHRtcDAsIGNvZWZmX3ZlYyk7Ci0gICAgcmVzX3IgPDw9IDM7Ci0gICAgcmVzX3IgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSByZXNfciwgNik7Ci0gICAgcmVzX3IgPSBfX21zYV9zYXRfdV9oKHJlc19yLCA3KTsKLQotICAgIHJlcyA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc19yLCAodjE2aTgpIHJlc19yKTsKLSAgICByZXMgPSAodjhpMTYpIF9fbXNhX2F2ZXJfdV9iKCh2MTZ1OCkgcmVzLCBkc3RfZGF0YTApOwotCi0gICAgU1QyeDRfVUIocmVzLCAwLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotCi0gICAgSUxWUl9CNF9VQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LAotICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7Ci0KLSAgICBJTFZSX1cyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHRtcDAsIHRtcDIpOwotCi0gICAgdG1wMCA9ICh2MTZ1OCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgdG1wMiwgKHYyaTY0KSB0bXAwKTsKLQotICAgIHJlc19yID0gX19tc2FfZG90cF91X2godG1wMCwgY29lZmZfdmVjKTsKLSAgICByZXNfciA8PD0gMzsKLSAgICByZXNfciA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc19yLCA2KTsKLSAgICByZXNfciA9IF9fbXNhX3NhdF91X2gocmVzX3IsIDcpOwotCi0gICAgcmVzID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3IsICh2MTZpOCkgcmVzX3IpOwotICAgIHJlcyA9ICh2OGkxNikgX19tc2FfYXZlcl91X2IoKHYxNnU4KSByZXMsIGRzdF9kYXRhMSk7Ci0KLSAgICBTVDJ4NF9VQihyZXMsIDAsIGRzdCwgZHN0X3N0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzJ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzJ3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzJ4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYwLCBjb2VmZjEpOworICAgICAgICBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF8yeDJfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKICAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzJ4NF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYwLCBjb2VmZjEpOwotICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfMng4X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZjAsIGNvZWZmMSk7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzJ4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfNHgyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwgdWludDMyX3QgY29lZmYxKQorc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfNHgyX21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGNvZWZmMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYxKQogewogICAgIHVpbnQzMl90IGxvYWQwLCBsb2FkMTsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCB0bXAwLCB0bXAxOworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHRtcDAsIHRtcDE7CiAgICAgdjE2dTggZHN0X2RhdGEgPSB7IDAgfTsKICAgICB2OHUxNiByZXNfcjsKICAgICB2MTZ1OCByZXM7CkBAIC0xMjQ1LDE0MCArMTIyNywxOTYgQEAKICAgICB2MTZpOCBjb2VmZl92ZWMxID0gX19tc2FfZmlsbF9iKGNvZWZmMSk7CiAgICAgdjE2dTggY29lZmZfdmVjID0gKHYxNnU4KSBfX21zYV9pbHZyX2IoY29lZmZfdmVjMCwgY29lZmZfdmVjMSk7CiAKLSAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBMRF9VQjMoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogCi0gICAgbG9hZDAgPSBMVyhkc3QpOwotICAgIGxvYWQxID0gTFcoZHN0ICsgZHN0X3N0cmlkZSk7CisgICAgTFcyKGRzdCwgc3RyaWRlLCBsb2FkMCwgbG9hZDEpOwogCiAgICAgSU5TRVJUX1cyX1VCKGxvYWQwLCBsb2FkMSwgZHN0X2RhdGEpOwotICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgdG1wMCwgdG1wMSk7CisgICAgSUxWUl9CMl9VQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCB0bXAwLCB0bXAxKTsKIAotICAgIHRtcDAgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHRtcDEsICh2Mmk2NCkgdG1wMCk7CisgICAgdG1wMCA9ICh2MTZ1OCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgdG1wMSwgKHYyaTY0KSB0bXAwKTsKIAotICAgIHJlc19yID0gX19tc2FfZG90cF91X2goKHYxNnU4KSB0bXAwLCBjb2VmZl92ZWMpOworICAgIHJlc19yID0gX19tc2FfZG90cF91X2godG1wMCwgY29lZmZfdmVjKTsKICAgICByZXNfciA8PD0gMzsKICAgICByZXNfciA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc19yLCA2KTsKICAgICByZXNfciA9IF9fbXNhX3NhdF91X2gocmVzX3IsIDcpOwogICAgIHJlcyA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlc19yLCAodjE2aTgpIHJlc19yKTsKICAgICByZXMgPSBfX21zYV9hdmVyX3VfYihyZXMsIGRzdF9kYXRhKTsKIAotICAgIFNUNHgyX1VCKHJlcywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDR4Ml9VQihyZXMsIGRzdCwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfNHg0bXVsX21zYSh1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzR4NF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBjb2VmZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSkKIHsKLSAgICB1aW50MzJfdCBsb2FkMCwgbG9hZDEsIHJvdzsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHYxNnU4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgdjE2dTggZHN0MCA9IHsgMCB9OwotICAgIHYxNnU4IGRzdDEgPSB7IDAgfTsKICAgICB2OHUxNiByZXMwX3IsIHJlczFfcjsKLSAgICB2MTZ1OCByZXMwLCByZXMxOworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBjb2VmZl92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZmMCk7CiAgICAgdjE2aTggY29lZmZfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmZjEpOwogICAgIHYxNnU4IGNvZWZmX3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX3ZlYzAsIGNvZWZmX3ZlYzEpOwogCi0gICAgc3JjMCA9IExEX1NCKHNyYyk7Ci0gICAgc3JjICs9IHNyY19zdHJpZGU7Ci0KLSAgICBmb3IgKHJvdyA9IChoZWlnaHQgPj4gMik7IHJvdy0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgbG9hZDAgPSBMVyhkc3QpOwotICAgICAgICBsb2FkMSA9IExXKGRzdCArIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIElOU0VSVF9XMl9VQihsb2FkMCwgbG9hZDEsIGRzdDApOwotICAgICAgICBsb2FkMCA9IExXKGRzdCArIDIgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgbG9hZDEgPSBMVyhkc3QgKyAzICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIElOU0VSVF9XMl9VQihsb2FkMCwgbG9hZDEsIGRzdDEpOwotCi0gICAgICAgIElMVlJfQjRfVUIoc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKLSAgICAgICAgSUxWUl9EMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0bXAwLCB0bXAyKTsKLSAgICAgICAgRE9UUF9VQjJfVUgodG1wMCwgdG1wMiwgY29lZmZfdmVjLCBjb2VmZl92ZWMsIHJlczBfciwgcmVzMV9yKTsKLQotICAgICAgICByZXMwX3IgPDw9IDM7Ci0gICAgICAgIHJlczFfciA8PD0gMzsKLQotICAgICAgICBTUkFSSV9IMl9VSChyZXMwX3IsIHJlczFfciwgNik7Ci0gICAgICAgIFNBVF9VSDJfVUgocmVzMF9yLCByZXMxX3IsIDcpOwotICAgICAgICBQQ0tFVl9CMl9VQihyZXMwX3IsIHJlczBfciwgcmVzMV9yLCByZXMxX3IsIHJlczAsIHJlczEpOwotICAgICAgICBBVkVSX1VCMl9VQihyZXMwLCBkc3QwLCByZXMxLCBkc3QxLCByZXMwLCByZXMxKTsKLQotICAgICAgICBTVDR4NF9VQihyZXMwLCByZXMxLCAwLCAxLCAwLCAxLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgc3JjMCA9IHNyYzQ7Ci0gICAgfQorICAgIExEX1VCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgTFc0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOworICAgIElMVlJfQjRfVUIoc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgdG1wMCwgdG1wMSwgdG1wMiwKKyAgICAgICAgICAgICAgIHRtcDMpOworICAgIElMVlJfRDJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wMCwgdG1wMik7CisgICAgRE9UUF9VQjJfVUgodG1wMCwgdG1wMiwgY29lZmZfdmVjLCBjb2VmZl92ZWMsIHJlczBfciwgcmVzMV9yKTsKKyAgICByZXMwX3IgPDw9IDM7CisgICAgcmVzMV9yIDw8PSAzOworICAgIFNSQVJJX0gyX1VIKHJlczBfciwgcmVzMV9yLCA2KTsKKyAgICBTQVRfVUgyX1VIKHJlczBfciwgcmVzMV9yLCA3KTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXMxX3IsICh2MTZpOCkgcmVzMF9yKTsKKyAgICBvdXQgPSBfX21zYV9hdmVyX3VfYihvdXQsIGRzdDApOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzR4OF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBjb2VmZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSkKK3sKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZ1OCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCBvdXQwLCBvdXQxOworICAgIHYxNnU4IGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9OworICAgIHY4dTE2IHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgICAgdjE2aTggY29lZmZfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmZjApOworICAgIHYxNmk4IGNvZWZmX3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZmYxKTsKKyAgICB2MTZ1OCBjb2VmZl92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl92ZWMwLCBjb2VmZl92ZWMxKTsKKworICAgIExEX1VCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKyAgICBMRF9VQjQoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICBMVzQoZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDEpOworICAgIElMVlJfQjRfVUIoc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgdG1wMCwgdG1wMSwgdG1wMiwKKyAgICAgICAgICAgICAgIHRtcDMpOworICAgIElMVlJfQjRfVUIoc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgdG1wNCwgdG1wNSwgdG1wNiwKKyAgICAgICAgICAgICAgIHRtcDcpOworICAgIElMVlJfRDJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wMCwgdG1wMik7CisgICAgSUxWUl9EMl9VQih0bXA1LCB0bXA0LCB0bXA3LCB0bXA2LCB0bXA0LCB0bXA2KTsKKyAgICBET1RQX1VCMl9VSCh0bXAwLCB0bXAyLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgcmVzMCwgcmVzMSk7CisgICAgRE9UUF9VQjJfVUgodG1wNCwgdG1wNiwgY29lZmZfdmVjLCBjb2VmZl92ZWMsIHJlczIsIHJlczMpOworICAgIFNMTElfNFYocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgMyk7CisgICAgU1JBUklfSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNik7CisgICAgU0FUX1VINF9VSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA3KTsKKyAgICBQQ0tFVl9CMl9VQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCBvdXQwLCBvdXQxKTsKKyAgICBBVkVSX1VCMl9VQihvdXQwLCBkc3QwLCBvdXQxLCBkc3QxLCBvdXQwLCBvdXQxKTsKKyAgICBTVDR4OF9VQihvdXQwLCBvdXQxLCBkc3QsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzR3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgY29lZmYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzR4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYwLCBjb2VmZjEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzR4NG11bF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmYwLCBjb2VmZjEsIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzR4Ml9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOworICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfNHg0X21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmZjAsIGNvZWZmMSk7CisgICAgfSBlbHNlIGlmICg4ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF80eDhfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0Xzh3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjAsIHVpbnQzMl90IGNvZWZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0Xzh4NF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBjb2VmZjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZmMSkKIHsKLSAgICB1aW50MzJfdCByb3c7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7CiAgICAgdjE2dTggb3V0MCwgb3V0MTsKICAgICB2OHUxNiByZXMwLCByZXMxLCByZXMyLCByZXMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2dTggZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH07CiAgICAgdjE2aTggY29lZmZfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmZjApOwogICAgIHYxNmk4IGNvZWZmX3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZmYxKTsKICAgICB2MTZ1OCBjb2VmZl92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl92ZWMwLCBjb2VmZl92ZWMxKTsKIAotICAgIHNyYzAgPSBMRF9VQihzcmMpOwotICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIExEX1VCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgTEQ0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICBJTFZSX0I0X1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsCisgICAgICAgICAgICAgICBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBET1RQX1VCNF9VSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX3ZlYywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgU0xMSV80VihyZXMwLCByZXMxLCByZXMyLCByZXMzLCAzKTsKKyAgICBTUkFSSV9INF9VSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA2KTsKKyAgICBTQVRfVUg0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgIFBDS0VWX0IyX1VCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIG91dDAsIG91dDEpOworICAgIEFWRVJfVUIyX1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIG91dDAsIG91dDEpOworICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgc3RyaWRlKTsKK30KIAotICAgIGZvciAocm93ID0gaGVpZ2h0ID4+IDI7IHJvdy0tOykgewotICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBJTFZSX0I0X1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIERPVFBfVUI0X1VIKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLCBjb2VmZl92ZWMsCi0gICAgICAgICAgICAgICAgICAgIGNvZWZmX3ZlYywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIFNMTElfNFYocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgMyk7Ci0gICAgICAgIFNSQVJJX0g0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDYpOwotICAgICAgICBTQVRfVUg0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOwotICAgICAgICBQQ0tFVl9CMl9VQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCBvdXQwLCBvdXQxKTsKLSAgICAgICAgUENLRVZfRDJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7Ci0gICAgICAgIEFWRVJfVUIyX1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIG91dDAsIG91dDEpOwotICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOworc3RhdGljIHZvaWQgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfOHg4X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGNvZWZmMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZmYxKQoreworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2dTggZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH0sIGRzdDIgPSB7IDAgfSwgZHN0MyA9IHsgMCB9OworICAgIHY4dTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7CisgICAgdjE2aTggY29lZmZfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmZjApOworICAgIHYxNmk4IGNvZWZmX3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZmYxKTsKKyAgICB2MTZ1OCBjb2VmZl92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl92ZWMwLCBjb2VmZl92ZWMxKTsKIAotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgc3JjMCA9IHNyYzQ7CisgICAgTERfVUI1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIExEX1VCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgTEQ0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICBMRDQoZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0Mik7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QzKTsKKyAgICBJTFZSX0I0X1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsCisgICAgICAgICAgICAgICBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBJTFZSX0I0X1VCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsCisgICAgICAgICAgICAgICBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBET1RQX1VCNF9VSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywgY29lZmZfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX3ZlYywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgRE9UUF9VQjRfVUgoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgY29lZmZfdmVjLCBjb2VmZl92ZWMsIGNvZWZmX3ZlYywKKyAgICAgICAgICAgICAgICBjb2VmZl92ZWMsIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgIFNMTElfNFYocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgMyk7CisgICAgU0xMSV80VihyZXM0LCByZXM1LCByZXM2LCByZXM3LCAzKTsKKyAgICBTUkFSSV9INF9VSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA2KTsKKyAgICBTUkFSSV9INF9VSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA2KTsKKyAgICBTQVRfVUg0X1VIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgIFNBVF9VSDRfVUgocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgUENLRVZfQjJfVUIocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgb3V0MCwgb3V0MSk7CisgICAgUENLRVZfQjJfVUIocmVzNSwgcmVzNCwgcmVzNywgcmVzNiwgb3V0Miwgb3V0Myk7CisgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgb3V0MCwgb3V0MSk7CisgICAgQVZFUl9VQjJfVUIob3V0MiwgZHN0Miwgb3V0MywgZHN0Mywgb3V0Miwgb3V0Myk7CisgICAgU1Q4eDhfVUIob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF84d19tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGNvZWZmMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmZjEsIGludDMyX3QgaGVpZ2h0KQoreworICAgIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF84eDRfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZmMCwgY29lZmYxKTsKKyAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0Xzh4OF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZmYwLCBjb2VmZjEpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfMngyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF8yeDJfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIxKQogewogICAgIHVpbnQxNl90IG91dDAsIG91dDE7Ci0gICAgdjE2dTggZHN0MCwgZHN0MTsKKyAgICB2MTZ1OCBkc3QwID0geyAwIH07CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMjsKICAgICB2OHUxNiByZXNfaHowLCByZXNfaHoxLCByZXNfdnQwLCByZXNfdnQxOwogICAgIHYxNmk4IHJlcywgbWFzazsKQEAgLTEzOTAsOCArMTQyOCwxMSBAQAogCiAgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbNDhdKTsKIAotICAgIExEX1VCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIExEX1VCMihkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEpOworICAgIExEX1VCMyhzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgb3V0MCA9IExIKGRzdCk7CisgICAgb3V0MSA9IExIKGRzdCArIHN0cmlkZSk7CisgICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3QwLCAwLCBvdXQwKTsKKyAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnNlcnRfaCgodjhpMTYpIGRzdDAsIDEsIG91dDEpOwogICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzaywgbWFzaywgc3JjMCwgc3JjMSk7CiAgICAgRE9UUF9VQjJfVUgoc3JjMCwgc3JjMSwgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsIHJlc19oejAsIHJlc19oejEpOwogICAgIE1VTDIocmVzX2h6MCwgY29lZmZfdnRfdmVjMSwgcmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0MCwgcmVzX3Z0MSk7CkBAIC0xNDAwLDI2ICsxNDQxLDI2IEBACiAgICAgcmVzX3Z0MCA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc192dDAsIDYpOwogICAgIHJlc192dDAgPSBfX21zYV9zYXRfdV9oKHJlc192dDAsIDcpOwogICAgIHJlcyA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfdnQwLCAodjE2aTgpIHJlc192dDApOwotICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2luc3ZlX2goKHY4aTE2KSBkc3QwLCAxLCAodjhpMTYpIGRzdDEpOwogICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYigodjE2dTgpIHJlcywgZHN0MCk7CiAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0MCwgMCk7CiAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0MCwgMSk7CiAKICAgICBTSChvdXQwLCBkc3QpOwotICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIGRzdCArPSBzdHJpZGU7CiAgICAgU0gob3V0MSwgZHN0KTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfMng0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF8yeDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIxKQogeworICAgIHVpbnQxNl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHYxNnU4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICB2MTZ1OCBkc3QwID0geyAwIH07CiAgICAgdjh1MTYgcmVzX2h6MCwgcmVzX2h6MSwgcmVzX3Z0MCwgcmVzX3Z0MTsKICAgICB2MTZpOCByZXMsIG1hc2s7CiAgICAgdjE2aTggY29lZmZfaHpfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmX2hvcjApOwpAQCAtMTQzMCw4ICsxNDcxLDE1IEBACiAKICAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2Fycls0OF0pOwogCi0gICAgTERfVUI1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgTERfVUI1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICB0cDAgPSBMSChkc3QpOworICAgIHRwMSA9IExIKGRzdCArIHN0cmlkZSk7CisgICAgdHAyID0gTEgoZHN0ICsgMiAqIHN0cmlkZSk7CisgICAgdHAzID0gTEgoZHN0ICsgMyAqIHN0cmlkZSk7CisgICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3QwLCAwLCB0cDApOworICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2luc2VydF9oKCh2OGkxNikgZHN0MCwgMSwgdHAxKTsKKyAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnNlcnRfaCgodjhpMTYpIGRzdDAsIDIsIHRwMik7CisgICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zZXJ0X2goKHY4aTE2KSBkc3QwLCAzLCB0cDMpOwogICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzaywgbWFzaywgdG1wMCwgdG1wMSk7CiAgICAgVlNIRl9CMl9VQihzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBtYXNrLCBtYXNrLCB0bXAyLCB0bXAzKTsKICAgICBJTFZSX0QyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHNyYzAsIHNyYzEpOwpAQCAtMTQ0Miw4MSArMTQ5MCwxMyBAQAogICAgIHJlc192dDAgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSByZXNfdnQwLCA2KTsKICAgICByZXNfdnQwID0gX19tc2Ffc2F0X3VfaChyZXNfdnQwLCA3KTsKICAgICByZXMgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3Z0MCwgKHYxNmk4KSByZXNfdnQwKTsKLQotICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2luc3ZlX2goKHY4aTE2KSBkc3QwLCAxLCAodjhpMTYpIGRzdDEpOwotICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2luc3ZlX2goKHY4aTE2KSBkc3QwLCAyLCAodjhpMTYpIGRzdDIpOwotICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2luc3ZlX2goKHY4aTE2KSBkc3QwLCAzLCAodjhpMTYpIGRzdDMpOwogICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYigodjE2dTgpIHJlcywgZHN0MCk7CiAKLSAgICBTVDJ4NF9VQihkc3QwLCAwLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFNUMng0X1VCKGRzdDAsIDAsIGRzdCwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfMng4X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMSkKLXsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7Ci0gICAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICB2OHUxNiByZXNfaHowLCByZXNfaHoxLCByZXNfdnQwLCByZXNfdnQxOwotICAgIHYxNmk4IHJlcywgbWFzazsKLSAgICB2MTZpOCBjb2VmZl9oel92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZfaG9yMCk7Ci0gICAgdjE2aTggY29lZmZfaHpfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmX2hvcjEpOwotICAgIHYxNnU4IGNvZWZmX2h6X3ZlYyA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKGNvZWZmX2h6X3ZlYzAsIGNvZWZmX2h6X3ZlYzEpOwotICAgIHY4dTE2IGNvZWZmX3Z0X3ZlYzAgPSAodjh1MTYpIF9fbXNhX2ZpbGxfaChjb2VmX3ZlcjApOwotICAgIHY4dTE2IGNvZWZmX3Z0X3ZlYzEgPSAodjh1MTYpIF9fbXNhX2ZpbGxfaChjb2VmX3ZlcjEpOwotCi0gICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbNDhdKTsKLQotICAgIExEX1VCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwotCi0gICAgTERfVUI4KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7Ci0KLSAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnN2ZV9oKCh2OGkxNikgZHN0MCwgMSwgKHY4aTE2KSBkc3QxKTsKLSAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnN2ZV9oKCh2OGkxNikgZHN0MCwgMiwgKHY4aTE2KSBkc3QyKTsKLSAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnN2ZV9oKCh2OGkxNikgZHN0MCwgMywgKHY4aTE2KSBkc3QzKTsKLQotICAgIGRzdDQgPSAodjE2dTgpIF9fbXNhX2luc3ZlX2goKHY4aTE2KSBkc3Q0LCAxLCAodjhpMTYpIGRzdDUpOwotICAgIGRzdDQgPSAodjE2dTgpIF9fbXNhX2luc3ZlX2goKHY4aTE2KSBkc3Q0LCAyLCAodjhpMTYpIGRzdDYpOwotICAgIGRzdDQgPSAodjE2dTgpIF9fbXNhX2luc3ZlX2goKHY4aTE2KSBkc3Q0LCAzLCAodjhpMTYpIGRzdDcpOwotCi0gICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrLCBtYXNrLCB0bXAwLCB0bXAxKTsKLSAgICBWU0hGX0IyX1VCKHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIG1hc2ssIG1hc2ssIHRtcDIsIHRtcDMpOwotICAgIElMVlJfRDJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgc3JjMCwgc3JjMSk7Ci0gICAgVlNIRl9CMl9VQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrLCBtYXNrLCB0bXAwLCB0bXAxKTsKLSAgICBWU0hGX0IyX1VCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIG1hc2ssIG1hc2ssIHRtcDIsIHRtcDMpOwotICAgIElMVlJfRDJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgc3JjNCwgc3JjNSk7Ci0gICAgRE9UUF9VQjJfVUgoc3JjMCwgc3JjMSwgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsIHJlc19oejAsIHJlc19oejEpOwotICAgIE1VTDIocmVzX2h6MCwgY29lZmZfdnRfdmVjMSwgcmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0MCwgcmVzX3Z0MSk7Ci0KLSAgICByZXNfdnQwICs9IHJlc192dDE7Ci0gICAgcmVzX3Z0MCA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc192dDAsIDYpOwotICAgIHJlc192dDAgPSBfX21zYV9zYXRfdV9oKHJlc192dDAsIDcpOwotICAgIHJlcyA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfdnQwLCAodjE2aTgpIHJlc192dDApOwotICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYigodjE2dTgpIHJlcywgZHN0MCk7Ci0KLSAgICBTVDJ4NF9VQihkc3QwLCAwLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotCi0gICAgRE9UUF9VQjJfVUgoc3JjNCwgc3JjNSwgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsIHJlc19oejAsIHJlc19oejEpOwotICAgIE1VTDIocmVzX2h6MCwgY29lZmZfdnRfdmVjMSwgcmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0MCwgcmVzX3Z0MSk7Ci0KLSAgICByZXNfdnQwICs9IHJlc192dDE7Ci0gICAgcmVzX3Z0MCA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHJlc192dDAsIDYpOwotICAgIHJlc192dDAgPSBfX21zYV9zYXRfdV9oKHJlc192dDAsIDcpOwotICAgIHJlcyA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfdnQwLCAodjE2aTgpIHJlc192dDApOwotICAgIGRzdDQgPSBfX21zYV9hdmVyX3VfYigodjE2dTgpIHJlcywgZHN0NCk7Ci0KLSAgICBTVDJ4NF9VQihkc3Q0LCAwLCBkc3QsIGRzdF9zdHJpZGUpOwotfQotCi1zdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF8yd19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF8yd19tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsCkBAIC0xNTI0LDMxICsxNTA0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzJ4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9ob3IwLCBjb2VmX2hvcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl92ZXIwLCBjb2VmX3ZlcjEpOworICAgICAgICBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF8yeDJfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZfaG9yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjEsIGNvZWZfdmVyMCwgY29lZl92ZXIxKTsKICAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzJ4NF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9ob3IwLCBjb2VmX2hvcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl92ZXIwLCBjb2VmX3ZlcjEpOwotICAgIH0gZWxzZSBpZiAoOCA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfMng4X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjAsIGNvZWZfaG9yMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX3ZlcjAsIGNvZWZfdmVyMSk7CisgICAgICAgIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzJ4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZl9ob3IwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfaG9yMSwgY29lZl92ZXIwLCBjb2VmX3ZlcjEpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfNHgyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF80eDJfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIxKQogeworICAgIHVpbnQzMl90IHRwMCwgdHAxOwogICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzI7Ci0gICAgdjE2dTggZHN0MCwgZHN0MTsKKyAgICB2MTZ1OCBkc3QwLCBkc3RfZGF0YSA9IHsgMCB9OwogICAgIHY4dTE2IHJlc19oejAsIHJlc19oejEsIHJlc192dDAsIHJlc192dDE7Ci0gICAgdjE2aTggcmVzLCBtYXNrOworICAgIHYxNmk4IG1hc2s7CiAgICAgdjE2aTggY29lZmZfaHpfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmX2hvcjApOwogICAgIHYxNmk4IGNvZWZmX2h6X3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZl9ob3IxKTsKICAgICB2MTZ1OCBjb2VmZl9oel92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl9oel92ZWMwLCBjb2VmZl9oel92ZWMxKTsKQEAgLTE1NTcsOCArMTUzMiw5IEBACiAKICAgICBtYXNrID0gTERfU0IoJmNocm9tYV9tYXNrX2FyclswXSk7CiAKLSAgICBMRF9VQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBMRF9VQjIoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxKTsKKyAgICBMRF9VQjMoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExXMihkc3QsIHN0cmlkZSwgdHAwLCB0cDEpOworICAgIElOU0VSVF9XMl9VQih0cDAsIHRwMSwgZHN0X2RhdGEpOwogICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzaywgbWFzaywgc3JjMCwgc3JjMSk7CiAgICAgRE9UUF9VQjJfVUgoc3JjMCwgc3JjMSwgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsIHJlc19oejAsIHJlc19oejEpOwogICAgIE1VTDIocmVzX2h6MCwgY29lZmZfdnRfdmVjMSwgcmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0MCwgcmVzX3Z0MSk7CkBAIC0xNTY2LDI2ICsxNTQyLDIyIEBACiAgICAgcmVzX3Z0MCArPSByZXNfdnQxOwogICAgIHJlc192dDAgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSByZXNfdnQwLCA2KTsKICAgICByZXNfdnQwID0gX19tc2Ffc2F0X3VfaChyZXNfdnQwLCA3KTsKLSAgICByZXMgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzX3Z0MCwgKHYxNmk4KSByZXNfdnQwKTsKLSAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgZHN0MCwgMSwgKHY0aTMyKSBkc3QxKTsKLSAgICBkc3QwID0gX19tc2FfYXZlcl91X2IoKHYxNnU4KSByZXMsIGRzdDApOworICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfdnQwLCAodjE2aTgpIHJlc192dDApOworICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYihkc3QwLCBkc3RfZGF0YSk7CiAKLSAgICBTVDR4Ml9VQihkc3QwLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFNUNHgyX1VCKGRzdDAsIGRzdCwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfNHg0bXVsX21zYSh1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCitzdGF0aWMgdm9pZCBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF80eDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIxKQogewotICAgIHVpbnQzMl90IHJvdzsKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHYxNnU4IG91dCwgZHN0X2RhdGEgPSB7IDAgfTsKICAgICB2OHUxNiByZXNfaHowLCByZXNfaHoxLCByZXNfaHoyLCByZXNfaHozOwogICAgIHY4dTE2IHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDM7CiAgICAgdjE2aTggbWFzazsKQEAgLTE1OTQsNDUgKzE1NjYsNzggQEAKICAgICB2MTZ1OCBjb2VmZl9oel92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl9oel92ZWMwLCBjb2VmZl9oel92ZWMxKTsKICAgICB2OHUxNiBjb2VmZl92dF92ZWMwID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIwKTsKICAgICB2OHUxNiBjb2VmZl92dF92ZWMxID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIxKTsKLSAgICB2MTZ1OCByZXMwLCByZXMxOwogCiAgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbMF0pOwogCi0gICAgc3JjMCA9IExEX1VCKHNyYyk7Ci0gICAgc3JjICs9IHNyY19zdHJpZGU7Ci0KLSAgICBmb3IgKHJvdyA9IChoZWlnaHQgPj4gMik7IHJvdy0tOykgewotICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMxLCBzcmMyLCBtYXNrLCBtYXNrLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgVlNIRl9CMl9VQihzcmMyLCBzcmMzLCBzcmMzLCBzcmM0LCBtYXNrLCBtYXNrLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgRE9UUF9VQjRfVUgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsCi0gICAgICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHowLCByZXNfaHoxLCByZXNfaHoyLAotICAgICAgICAgICAgICAgICAgICByZXNfaHozKTsKLSAgICAgICAgTVVMNChyZXNfaHowLCBjb2VmZl92dF92ZWMxLCByZXNfaHoxLCBjb2VmZl92dF92ZWMwLCByZXNfaHoyLAotICAgICAgICAgICAgIGNvZWZmX3Z0X3ZlYzEsIHJlc19oejMsIGNvZWZmX3Z0X3ZlYzAsIHJlc192dDAsIHJlc192dDEsIHJlc192dDIsCi0gICAgICAgICAgICAgcmVzX3Z0Myk7Ci0gICAgICAgIEFERDIocmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MywgcmVzX3Z0MCwgcmVzX3Z0MSk7Ci0gICAgICAgIFNSQVJJX0gyX1VIKHJlc192dDAsIHJlc192dDEsIDYpOwotICAgICAgICBTQVRfVUgyX1VIKHJlc192dDAsIHJlc192dDEsIDcpOwotICAgICAgICBQQ0tFVl9CMl9VQihyZXNfdnQwLCByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQxLCByZXMwLCByZXMxKTsKLQotICAgICAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgZHN0MCwgMSwgKHY0aTMyKSBkc3QxKTsKLSAgICAgICAgZHN0MSA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfdygodjRpMzIpIGRzdDIsIDEsICh2NGkzMikgZHN0Myk7Ci0KLSAgICAgICAgQVZFUl9VQjJfVUIocmVzMCwgZHN0MCwgcmVzMSwgZHN0MSwgZHN0MCwgZHN0MSk7Ci0KLSAgICAgICAgU1Q0eDRfVUIoZHN0MCwgZHN0MSwgMCwgMSwgMCwgMSwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIHNyYzAgPSBzcmM0OwotICAgIH0KKyAgICBMRF9VQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3RfZGF0YSk7CisgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMxLCBzcmMyLCBtYXNrLCBtYXNrLCBzcmMwLCBzcmMxKTsKKyAgICBWU0hGX0IyX1VCKHNyYzIsIHNyYzMsIHNyYzMsIHNyYzQsIG1hc2ssIG1hc2ssIHNyYzIsIHNyYzMpOworICAgIERPVFBfVUI0X1VIKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHowLCByZXNfaHoxLCByZXNfaHoyLAorICAgICAgICAgICAgICAgIHJlc19oejMpOworICAgIE1VTDQocmVzX2h6MCwgY29lZmZfdnRfdmVjMSwgcmVzX2h6MSwgY29lZmZfdnRfdmVjMCwgcmVzX2h6MiwgY29lZmZfdnRfdmVjMSwKKyAgICAgICAgIHJlc19oejMsIGNvZWZmX3Z0X3ZlYzAsIHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMpOworICAgIEFERDIocmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MywgcmVzX3Z0MCwgcmVzX3Z0MSk7CisgICAgU1JBUklfSDJfVUgocmVzX3Z0MCwgcmVzX3Z0MSwgNik7CisgICAgU0FUX1VIMl9VSChyZXNfdnQwLCByZXNfdnQxLCA3KTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXNfdnQxLCAodjE2aTgpIHJlc192dDApOworICAgIG91dCA9IF9fbXNhX2F2ZXJfdV9iKG91dCwgZHN0X2RhdGEpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzR4OF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjEpCit7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHJlczAsIHJlczE7CisgICAgdjE2dTggZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH07CisgICAgdjh1MTYgcmVzX2h6MCwgcmVzX2h6MSwgcmVzX2h6MiwgcmVzX2h6MywgcmVzX2h6NCwgcmVzX2h6NSwgcmVzX2h6NiwgcmVzX2h6NzsKKyAgICB2OHUxNiByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzLCByZXNfdnQ0LCByZXNfdnQ1LCByZXNfdnQ2LCByZXNfdnQ3OworICAgIHYxNmk4IG1hc2s7CisgICAgdjE2aTggY29lZmZfaHpfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmX2hvcjApOworICAgIHYxNmk4IGNvZWZmX2h6X3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZl9ob3IxKTsKKyAgICB2MTZ1OCBjb2VmZl9oel92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl9oel92ZWMwLCBjb2VmZl9oel92ZWMxKTsKKyAgICB2OHUxNiBjb2VmZl92dF92ZWMwID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIwKTsKKyAgICB2OHUxNiBjb2VmZl92dF92ZWMxID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIxKTsKKworICAgIG1hc2sgPSBMRF9TQigmY2hyb21hX21hc2tfYXJyWzBdKTsKKworICAgIExEX1VCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKyAgICBMRF9VQjQoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICBMVzQoZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDEpOworICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzaywgbWFzaywgc3JjMCwgc3JjMSk7CisgICAgVlNIRl9CMl9VQihzcmMyLCBzcmMzLCBzcmMzLCBzcmM0LCBtYXNrLCBtYXNrLCBzcmMyLCBzcmMzKTsKKyAgICBWU0hGX0IyX1VCKHNyYzQsIHNyYzUsIHNyYzUsIHNyYzYsIG1hc2ssIG1hc2ssIHNyYzQsIHNyYzUpOworICAgIFZTSEZfQjJfVUIoc3JjNiwgc3JjNywgc3JjNywgc3JjOCwgbWFzaywgbWFzaywgc3JjNiwgc3JjNyk7CisgICAgRE9UUF9VQjRfVUgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsCisgICAgICAgICAgICAgICAgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsIHJlc19oejAsIHJlc19oejEsIHJlc19oejIsIHJlc19oejMpOworICAgIERPVFBfVUI0X1VIKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHo0LCByZXNfaHo1LCByZXNfaHo2LCByZXNfaHo3KTsKKyAgICBNVUw0KHJlc19oejAsIGNvZWZmX3Z0X3ZlYzEsIHJlc19oejEsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejIsIGNvZWZmX3Z0X3ZlYzEsCisgICAgICAgICByZXNfaHozLCBjb2VmZl92dF92ZWMwLCByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzKTsKKyAgICBNVUw0KHJlc19oejQsIGNvZWZmX3Z0X3ZlYzEsIHJlc19oejUsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejYsIGNvZWZmX3Z0X3ZlYzEsCisgICAgICAgICByZXNfaHo3LCBjb2VmZl92dF92ZWMwLCByZXNfdnQ0LCByZXNfdnQ1LCByZXNfdnQ2LCByZXNfdnQ3KTsKKyAgICBBREQyKHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMsIHJlc192dDAsIHJlc192dDEpOworICAgIEFERDIocmVzX3Z0NCwgcmVzX3Z0NSwgcmVzX3Z0NiwgcmVzX3Z0NywgcmVzX3Z0MiwgcmVzX3Z0Myk7CisgICAgU1JBUklfSDRfVUgocmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MywgNik7CisgICAgU0FUX1VINF9VSChyZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzLCA3KTsKKyAgICBQQ0tFVl9CMl9VQihyZXNfdnQxLCByZXNfdnQwLCByZXNfdnQzLCByZXNfdnQyLCByZXMwLCByZXMxKTsKKyAgICBBVkVSX1VCMl9VQihyZXMwLCBkc3QwLCByZXMxLCBkc3QxLCByZXMwLCByZXMxKTsKKyAgICBTVDR4OF9VQihyZXMwLCByZXMxLCBkc3QsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzR3X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMCwKQEAgLTE2NDAsMzAgKzE2NDUsMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfNHgyX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjAsIGNvZWZfaG9yMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX3ZlcjAsIGNvZWZfdmVyMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfNHg0bXVsX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjAsIGNvZWZfaG9yMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX3ZlcjAsIGNvZWZfdmVyMSwgaGVpZ2h0KTsKKyAgICAgICAgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfNHgyX21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmX2hvcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9ob3IxLCBjb2VmX3ZlcjAsIGNvZWZfdmVyMSk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF80eDRfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZfaG9yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjEsIGNvZWZfdmVyMCwgY29lZl92ZXIxKTsKKyAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzR4OF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgY29lZl9ob3IwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZfaG9yMSwgY29lZl92ZXIwLCBjb2VmX3ZlcjEpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfOHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0Xzh4NF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjEpCiB7Ci0gICAgdWludDMyX3Qgcm93OworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBvdXQwLCBvdXQxOwogICAgIHY4dTE2IHJlc19oejAsIHJlc19oejEsIHJlc19oejI7CiAgICAgdjh1MTYgcmVzX2h6MywgcmVzX2h6NDsKICAgICB2OHUxNiByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2dTggZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH07CiAgICAgdjE2aTggbWFzazsKICAgICB2MTZpOCBjb2VmZl9oel92ZWMwID0gX19tc2FfZmlsbF9iKGNvZWZfaG9yMCk7CiAgICAgdjE2aTggY29lZmZfaHpfdmVjMSA9IF9fbXNhX2ZpbGxfYihjb2VmX2hvcjEpOwpAQCAtMTY3NCwyNTUgKzE2NzksMjc0IEBACiAgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbMzJdKTsKIAogICAgIHNyYzAgPSBMRF9VQihzcmMpOwotICAgIHNyYyArPSBzcmNfc3RyaWRlOwotCisgICAgc3JjICs9IHN0cmlkZTsKICAgICBzcmMwID0gKHYxNnU4KSBfX21zYV92c2hmX2IobWFzaywgKHYxNmk4KSBzcmMwLCAodjE2aTgpIHNyYzApOwogICAgIHJlc19oejAgPSBfX21zYV9kb3RwX3VfaChzcmMwLCBjb2VmZl9oel92ZWMpOworICAgIExEX1VCNChzcmMsIHN0cmlkZSwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKKyAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworICAgIFZTSEZfQjJfVUIoc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzaywgbWFzaywgc3JjMSwgc3JjMik7CisgICAgVlNIRl9CMl9VQihzcmMzLCBzcmMzLCBzcmM0LCBzcmM0LCBtYXNrLCBtYXNrLCBzcmMzLCBzcmM0KTsKKyAgICBET1RQX1VCNF9VSChzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywKKyAgICAgICAgICAgICAgICBjb2VmZl9oel92ZWMsIGNvZWZmX2h6X3ZlYywgcmVzX2h6MSwgcmVzX2h6MiwgcmVzX2h6MywgcmVzX2h6NCk7CisgICAgTVVMNChyZXNfaHoxLCBjb2VmZl92dF92ZWMwLCByZXNfaHoyLCBjb2VmZl92dF92ZWMwLCByZXNfaHozLCBjb2VmZl92dF92ZWMwLAorICAgICAgICAgcmVzX2h6NCwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0Myk7CisgICAgcmVzX3Z0MCArPSAocmVzX2h6MCAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIHJlc192dDEgKz0gKHJlc19oejEgKiBjb2VmZl92dF92ZWMxKTsKKyAgICByZXNfdnQyICs9IChyZXNfaHoyICogY29lZmZfdnRfdmVjMSk7CisgICAgcmVzX3Z0MyArPSAocmVzX2h6MyAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIFNSQVJJX0g0X1VIKHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMsIDYpOworICAgIFNBVF9VSDRfVUgocmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MywgNyk7CisgICAgUENLRVZfQjJfVUIocmVzX3Z0MSwgcmVzX3Z0MCwgcmVzX3Z0MywgcmVzX3Z0Miwgb3V0MCwgb3V0MSk7CisgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgb3V0MCwgb3V0MSk7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworfQogCi0gICAgZm9yIChyb3cgPSAoaGVpZ2h0ID4+IDIpOyByb3ctLTspIHsKLSAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfOHg4X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl9ob3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX3ZlcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMSkKK3sKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHYxNnU4IGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9LCBkc3QyID0geyAwIH0sIGRzdDMgPSB7IDAgfTsKKyAgICB2OHUxNiByZXNfaHowLCByZXNfaHoxLCByZXNfaHoyLCByZXNfaHozLCByZXNfaHo0OworICAgIHY4dTE2IHJlc19oejUsIHJlc19oejYsIHJlc19oejcsIHJlc19oejg7CisgICAgdjh1MTYgcmVzX3Z0MCwgcmVzX3Z0MSwgcmVzX3Z0MiwgcmVzX3Z0MzsKKyAgICB2OHUxNiByZXNfdnQ0LCByZXNfdnQ1LCByZXNfdnQ2LCByZXNfdnQ3OworICAgIHYxNmk4IG1hc2s7CisgICAgdjE2aTggY29lZmZfaHpfdmVjMCA9IF9fbXNhX2ZpbGxfYihjb2VmX2hvcjApOworICAgIHYxNmk4IGNvZWZmX2h6X3ZlYzEgPSBfX21zYV9maWxsX2IoY29lZl9ob3IxKTsKKyAgICB2MTZ1OCBjb2VmZl9oel92ZWMgPSAodjE2dTgpIF9fbXNhX2lsdnJfYihjb2VmZl9oel92ZWMwLCBjb2VmZl9oel92ZWMxKTsKKyAgICB2OHUxNiBjb2VmZl92dF92ZWMwID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIwKTsKKyAgICB2OHUxNiBjb2VmZl92dF92ZWMxID0gKHY4dTE2KSBfX21zYV9maWxsX2goY29lZl92ZXIxKTsKIAotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgVlNIRl9CMl9VQihzcmMxLCBzcmMxLCBzcmMyLCBzcmMyLCBtYXNrLCBtYXNrLCBzcmMxLCBzcmMyKTsKLSAgICAgICAgVlNIRl9CMl9VQihzcmMzLCBzcmMzLCBzcmM0LCBzcmM0LCBtYXNrLCBtYXNrLCBzcmMzLCBzcmM0KTsKLSAgICAgICAgRE9UUF9VQjRfVUgoc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgY29lZmZfaHpfdmVjLCBjb2VmZl9oel92ZWMsCi0gICAgICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHoxLCByZXNfaHoyLCByZXNfaHozLAotICAgICAgICAgICAgICAgICAgICByZXNfaHo0KTsKLSAgICAgICAgTVVMNChyZXNfaHoxLCBjb2VmZl92dF92ZWMwLCByZXNfaHoyLCBjb2VmZl92dF92ZWMwLCByZXNfaHozLAotICAgICAgICAgICAgIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejQsIGNvZWZmX3Z0X3ZlYzAsIHJlc192dDAsIHJlc192dDEsIHJlc192dDIsCi0gICAgICAgICAgICAgcmVzX3Z0Myk7CisgICAgbWFzayA9IExEX1NCKCZjaHJvbWFfbWFza19hcnJbMzJdKTsKIAotICAgICAgICByZXNfdnQwICs9IChyZXNfaHowICogY29lZmZfdnRfdmVjMSk7Ci0gICAgICAgIHJlc192dDEgKz0gKHJlc19oejEgKiBjb2VmZl92dF92ZWMxKTsKLSAgICAgICAgcmVzX3Z0MiArPSAocmVzX2h6MiAqIGNvZWZmX3Z0X3ZlYzEpOwotICAgICAgICByZXNfdnQzICs9IChyZXNfaHozICogY29lZmZfdnRfdmVjMSk7CisgICAgTERfVUI1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIExEX1VCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgc3JjMCA9ICh2MTZ1OCkgX19tc2FfdnNoZl9iKG1hc2ssICh2MTZpOCkgc3JjMCwgKHYxNmk4KSBzcmMwKTsKKyAgICBWU0hGX0IyX1VCKHNyYzEsIHNyYzEsIHNyYzIsIHNyYzIsIG1hc2ssIG1hc2ssIHNyYzEsIHNyYzIpOworICAgIFZTSEZfQjJfVUIoc3JjMywgc3JjMywgc3JjNCwgc3JjNCwgbWFzaywgbWFzaywgc3JjMywgc3JjNCk7CisgICAgVlNIRl9CMl9VQihzcmM1LCBzcmM1LCBzcmM2LCBzcmM2LCBtYXNrLCBtYXNrLCBzcmM1LCBzcmM2KTsKKyAgICBWU0hGX0IyX1VCKHNyYzcsIHNyYzcsIHNyYzgsIHNyYzgsIG1hc2ssIG1hc2ssIHNyYzcsIHNyYzgpOworICAgIHJlc19oejAgPSBfX21zYV9kb3RwX3VfaChzcmMwLCBjb2VmZl9oel92ZWMpOworICAgIERPVFBfVUI0X1VIKHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHoxLCByZXNfaHoyLCByZXNfaHozLAorICAgICAgICAgICAgICAgIHJlc19oejQpOworICAgIERPVFBfVUI0X1VIKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLAorICAgICAgICAgICAgICAgIGNvZWZmX2h6X3ZlYywgY29lZmZfaHpfdmVjLCByZXNfaHo1LCByZXNfaHo2LCByZXNfaHo3LCByZXNfaHo4KTsKKyAgICBNVUw0KHJlc19oejEsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejIsIGNvZWZmX3Z0X3ZlYzAsIHJlc19oejMsCisgICAgICAgICBjb2VmZl92dF92ZWMwLCByZXNfaHo0LCBjb2VmZl92dF92ZWMwLCByZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLAorICAgICAgICAgcmVzX3Z0Myk7CisgICAgTVVMNChyZXNfaHo1LCBjb2VmZl92dF92ZWMwLCByZXNfaHo2LCBjb2VmZl92dF92ZWMwLCByZXNfaHo3LAorICAgICAgICAgY29lZmZfdnRfdmVjMCwgcmVzX2h6OCwgY29lZmZfdnRfdmVjMCwgcmVzX3Z0NCwgcmVzX3Z0NSwgcmVzX3Z0NiwKKyAgICAgICAgIHJlc192dDcpOworICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgTEQ0KGRzdCArIDQgKiBzdHJpZGUsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDIpOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0Myk7CisgICAgcmVzX3Z0MCArPSAocmVzX2h6MCAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIHJlc192dDEgKz0gKHJlc19oejEgKiBjb2VmZl92dF92ZWMxKTsKKyAgICByZXNfdnQyICs9IChyZXNfaHoyICogY29lZmZfdnRfdmVjMSk7CisgICAgcmVzX3Z0MyArPSAocmVzX2h6MyAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIHJlc192dDQgKz0gKHJlc19oejQgKiBjb2VmZl92dF92ZWMxKTsKKyAgICByZXNfdnQ1ICs9IChyZXNfaHo1ICogY29lZmZfdnRfdmVjMSk7CisgICAgcmVzX3Z0NiArPSAocmVzX2h6NiAqIGNvZWZmX3Z0X3ZlYzEpOworICAgIHJlc192dDcgKz0gKHJlc19oejcgKiBjb2VmZl92dF92ZWMxKTsKKyAgICBTUkFSSV9INF9VSChyZXNfdnQwLCByZXNfdnQxLCByZXNfdnQyLCByZXNfdnQzLCA2KTsKKyAgICBTUkFSSV9INF9VSChyZXNfdnQ0LCByZXNfdnQ1LCByZXNfdnQ2LCByZXNfdnQ3LCA2KTsKKyAgICBTQVRfVUg0X1VIKHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMsIDcpOworICAgIFNBVF9VSDRfVUgocmVzX3Z0NCwgcmVzX3Z0NSwgcmVzX3Z0NiwgcmVzX3Z0NywgNyk7CisgICAgUENLRVZfQjJfVUIocmVzX3Z0MSwgcmVzX3Z0MCwgcmVzX3Z0MywgcmVzX3Z0Miwgb3V0MCwgb3V0MSk7CisgICAgUENLRVZfQjJfVUIocmVzX3Z0NSwgcmVzX3Z0NCwgcmVzX3Z0NywgcmVzX3Z0Niwgb3V0Miwgb3V0Myk7CisgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgb3V0MCwgb3V0MSk7CisgICAgQVZFUl9VQjJfVUIob3V0MiwgZHN0Miwgb3V0MywgZHN0Mywgb3V0Miwgb3V0Myk7CisgICAgU1Q4eDhfVUIob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBzdHJpZGUpOworfQogCi0gICAgICAgIFNSQVJJX0g0X1VIKHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMsIDYpOwotICAgICAgICBTQVRfVUg0X1VIKHJlc192dDAsIHJlc192dDEsIHJlc192dDIsIHJlc192dDMsIDcpOwotCi0gICAgICAgIFBDS0VWX0IyX1VCKHJlc192dDEsIHJlc192dDAsIHJlc192dDMsIHJlc192dDIsIG91dDAsIG91dDEpOwotICAgICAgICBQQ0tFVl9EMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKLSAgICAgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgb3V0MCwgb3V0MSk7Ci0gICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIHJlc19oejAgPSByZXNfaHo0Oworc3RhdGljIHZvaWQgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfOHdfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfaG9yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2VmX2hvcjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29lZl92ZXIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZWZfdmVyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3sKKyAgICBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfOHg0X21zYShzcmMsIGRzdCwgc3RyaWRlLCBjb2VmX2hvcjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZl9ob3IxLCBjb2VmX3ZlcjAsIGNvZWZfdmVyMSk7CisgICAgfSBlbHNlIGlmICg4ID09IGhlaWdodCkgeworICAgICAgICBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF84eDhfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGNvZWZfaG9yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmX2hvcjEsIGNvZWZfdmVyMCwgY29lZl92ZXIxKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlfd2lkdGg4X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIGNvcHlfd2lkdGg0X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaW50MzJfdCBjbnQ7Ci0gICAgdWludDY0X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgb3V0Niwgb3V0NzsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMywgdHA0LCB0cDUsIHRwNiwgdHA3OwogCi0gICAgaWYgKDAgPT0gaGVpZ2h0ICUgMTIpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gMTIpOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMxLCAwKTsKLSAgICAgICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzIsIDApOwotICAgICAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMywgMCk7Ci0gICAgICAgICAgICBvdXQ0ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM0LCAwKTsKLSAgICAgICAgICAgIG91dDUgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzUsIDApOwotICAgICAgICAgICAgb3V0NiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNiwgMCk7Ci0gICAgICAgICAgICBvdXQ3ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM3LCAwKTsKLQotICAgICAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIFNENChvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3LCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMSwgMCk7Ci0gICAgICAgICAgICBvdXQyID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMyLCAwKTsKLSAgICAgICAgICAgIG91dDMgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzMsIDApOwotCi0gICAgICAgICAgICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDgpIHsKLSAgICAgICAgZm9yIChjbnQgPSBoZWlnaHQgPj4gMzsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMSwgMCk7Ci0gICAgICAgICAgICBvdXQyID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMyLCAwKTsKLSAgICAgICAgICAgIG91dDMgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzMsIDApOwotICAgICAgICAgICAgb3V0NCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNCwgMCk7Ci0gICAgICAgICAgICBvdXQ1ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM1LCAwKTsKLSAgICAgICAgICAgIG91dDYgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzYsIDApOwotICAgICAgICAgICAgb3V0NyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNywgMCk7Ci0KLSAgICAgICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTRDQob3V0NCwgb3V0NSwgb3V0Niwgb3V0NywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDQpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gNCk7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMSwgMCk7Ci0gICAgICAgICAgICBvdXQyID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMyLCAwKTsKLSAgICAgICAgICAgIG91dDMgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzMsIDApOwotCi0gICAgICAgICAgICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDIpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gMik7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUIyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7Ci0gICAgICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMSwgMCk7Ci0KLSAgICAgICAgICAgIFNEKG91dDAsIGRzdCk7Ci0gICAgICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgICAgICAgICAgIFNEKG91dDEsIGRzdCk7Ci0gICAgICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgICAgICAgfQorICAgIGlmICg4ID09IGhlaWdodCkgeworICAgICAgICBMVzQoc3JjLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIHNyYyArPSA0ICogc3RyaWRlOworICAgICAgICBMVzQoc3JjLCBzdHJpZGUsIHRwNCwgdHA1LCB0cDYsIHRwNyk7CisgICAgICAgIFNXNCh0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9IDQgKiBzdHJpZGU7CisgICAgICAgIFNXNCh0cDQsIHRwNSwgdHA2LCB0cDcsIGRzdCwgc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIExXNChzcmMsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgU1c0KHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0LCBzdHJpZGUpOworICAgIH0gZWxzZSBpZiAoMiA9PSBoZWlnaHQpIHsKKyAgICAgICAgTFcyKHNyYywgc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIFNXKHRwMCwgZHN0KTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgU1codHAxLCBkc3QpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgYXZnX3dpZHRoNF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorc3RhdGljIHZvaWQgY29weV93aWR0aDhfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBpbnQzMl90IGNudDsKLSAgICB1aW50MzJfdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICB1aW50NjRfdCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwogCi0gICAgaWYgKDAgPT0gKGhlaWdodCAlIDQpKSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCAvIDQpOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCi0gICAgICAgICAgICBBVkVSX1VCNF9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBzcmMzLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MSwgMCk7Ci0gICAgICAgICAgICBvdXQyID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QyLCAwKTsKLSAgICAgICAgICAgIG91dDMgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDMsIDApOwotICAgICAgICAgICAgU1c0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoMCA9PSAoaGVpZ2h0ICUgMikpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gMik7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUIyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7Ci0gICAgICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgTERfVUIyKGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSk7Ci0KLSAgICAgICAgICAgIEFWRVJfVUIyX1VCKHNyYzAsIGRzdDAsIHNyYzEsIGRzdDEsIGRzdDAsIGRzdDEpOwotCi0gICAgICAgICAgICBvdXQwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAwKTsKLSAgICAgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDEsIDApOwotICAgICAgICAgICAgU1cob3V0MCwgZHN0KTsKLSAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICAgICAgU1cob3V0MSwgZHN0KTsKLSAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICB9CisgICAgaWYgKDggPT0gaGVpZ2h0KSB7CisgICAgICAgIExENChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYyArPSA0ICogc3RyaWRlOworICAgICAgICBMRDQoc3JjLCBzdHJpZGUsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBTRDQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gNCAqIHN0cmlkZTsKKyAgICAgICAgU0Q0KHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIExENChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgIFNENChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QsIHN0cmlkZSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmdfd2lkdGg4X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAorc3RhdGljIHZvaWQgYXZnX3dpZHRoNF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaW50MzJfdCBjbnQ7Ci0gICAgdWludDY0X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9LCBkc3QwID0geyAwIH0sIGRzdDEgPSB7IDAgfTsKIAotICAgIGZvciAoY250ID0gKGhlaWdodCAvIDQpOyBjbnQtLTspIHsKLSAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgTFc0KHNyYywgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBzcmMgKz0gNCAqIHN0cmlkZTsKKyAgICAgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMCk7CisgICAgICAgIExXNChzcmMsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMSk7CisgICAgICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MCk7CisgICAgICAgIExXNChkc3QgKyA0ICogc3RyaWRlLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDEpOworICAgICAgICBBVkVSX1VCMl9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgU1Q0eDhfVUIoZHN0MCwgZHN0MSwgZHN0LCBzdHJpZGUpOworICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgTFc0KHNyYywgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBzcmMwKTsKKyAgICAgICAgTFc0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX2F2ZXJfdV9iKHNyYzAsIGRzdDApOworICAgICAgICBTVDR4NF9VQihkc3QwLCBkc3QwLCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7CisgICAgfSBlbHNlIGlmICgyID09IGhlaWdodCkgeworICAgICAgICBMVzIoc3JjLCBzdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX1cyX1VCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgTFcyKGRzdCwgc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIElOU0VSVF9XMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYihzcmMwLCBkc3QwKTsKKyAgICAgICAgU1Q0eDJfVUIoZHN0MCwgZHN0LCBzdHJpZGUpOworICAgIH0KK30KIAotICAgICAgICBBVkVSX1VCNF9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBzcmMzLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKK3N0YXRpYyB2b2lkIGF2Z193aWR0aDhfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQoreworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMywgdHA0LCB0cDUsIHRwNiwgdHA3OworICAgIHYxNnU4IHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9LCBzcmMyID0geyAwIH0sIHNyYzMgPSB7IDAgfTsKKyAgICB2MTZ1OCBkc3QwID0geyAwIH0sIGRzdDEgPSB7IDAgfSwgZHN0MiA9IHsgMCB9LCBkc3QzID0geyAwIH07CiAKLSAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MCwgMCk7Ci0gICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDEsIDApOwotICAgICAgICBvdXQyID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QyLCAwKTsKLSAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MywgMCk7Ci0gICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgTEQ0KHNyYywgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBzcmMgKz0gNCAqIHN0cmlkZTsKKyAgICAgICAgTEQ0KHNyYywgc3RyaWRlLCB0cDQsIHRwNSwgdHA2LCB0cDcpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIHNyYzApOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIHNyYzEpOworICAgICAgICBJTlNFUlRfRDJfVUIodHA0LCB0cDUsIHNyYzIpOworICAgICAgICBJTlNFUlRfRDJfVUIodHA2LCB0cDcsIHNyYzMpOworICAgICAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIExENChkc3QgKyA0ICogc3RyaWRlLCBzdHJpZGUsIHRwNCwgdHA1LCB0cDYsIHRwNyk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDQsIHRwNSwgZHN0Mik7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDYsIHRwNywgZHN0Myk7CisgICAgICAgIEFWRVJfVUI0X1VCKHNyYzAsIGRzdDAsIHNyYzEsIGRzdDEsIHNyYzIsIGRzdDIsIHNyYzMsIGRzdDMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDMpOworICAgICAgICBTVDh4OF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIHN0cmlkZSk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBMRDQoc3JjLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgc3JjMCk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgc3JjMSk7CisgICAgICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICAgICAgQVZFUl9VQjJfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgZHN0MCwgZHN0MSk7CisgICAgICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgc3RyaWRlKTsKICAgICB9CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jOF9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoZWlnaHQsIGludCB4LCBpbnQgeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IHgsIGludCB5KQogewogICAgIGF2X2Fzc2VydDIoeCA8IDggJiYgeSA8IDggJiYgeCA+PSAwICYmIHkgPj0gMCk7CiAKICAgICBpZiAoeCAmJiB5KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHZfOHdfbXNhKHNyYywgc3RyaWRlLCBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgeCwgKDggLSB4KSwgeSwgKDggLSB5KSwgaGVpZ2h0KTsKKyAgICAgICAgYXZjX2Nocm9tYV9odl84d19tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgeCwgKDggLSB4KSwgeSwgKDggLSB5KSwgaGVpZ2h0KTsKICAgICB9IGVsc2UgaWYgKHgpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9oel84d19tc2Eoc3JjLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCB4LCAoOCAtIHgpLCBoZWlnaHQpOworICAgICAgICBhdmNfY2hyb21hX2h6Xzh3X21zYShzcmMsIGRzdCwgc3RyaWRlLCB4LCAoOCAtIHgpLCBoZWlnaHQpOwogICAgIH0gZWxzZSBpZiAoeSkgewotICAgICAgICBhdmNfY2hyb21hX3Z0Xzh3X21zYShzcmMsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIHksICg4IC0geSksIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfOHdfbXNhKHNyYywgZHN0LCBzdHJpZGUsIHksICg4IC0geSksIGhlaWdodCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY29weV93aWR0aDhfbXNhKHNyYywgc3RyaWRlLCBkc3QsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgY29weV93aWR0aDhfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGhlaWdodCk7CiAgICAgfQogfQogCiB2b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbXNhKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgeCwgaW50IHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoZWlnaHQsIGludCB4LCBpbnQgeSkKIHsKLSAgICBpbnQzMl90IGNudDsKLQogICAgIGF2X2Fzc2VydDIoeCA8IDggJiYgeSA8IDggJiYgeCA+PSAwICYmIHkgPj0gMCk7CiAKICAgICBpZiAoeCAmJiB5KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHZfNHdfbXNhKHNyYywgc3RyaWRlLCBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgeCwgKDggLSB4KSwgeSwgKDggLSB5KSwgaGVpZ2h0KTsKKyAgICAgICAgYXZjX2Nocm9tYV9odl80d19tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgeCwgKDggLSB4KSwgeSwgKDggLSB5KSwgaGVpZ2h0KTsKICAgICB9IGVsc2UgaWYgKHgpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9oel80d19tc2Eoc3JjLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCB4LCAoOCAtIHgpLCBoZWlnaHQpOworICAgICAgICBhdmNfY2hyb21hX2h6XzR3X21zYShzcmMsIGRzdCwgc3RyaWRlLCB4LCAoOCAtIHgpLCBoZWlnaHQpOwogICAgIH0gZWxzZSBpZiAoeSkgewotICAgICAgICBhdmNfY2hyb21hX3Z0XzR3X21zYShzcmMsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIHksICg4IC0geSksIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfNHdfbXNhKHNyYywgZHN0LCBzdHJpZGUsIHksICg4IC0geSksIGhlaWdodCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChjbnQgPSBoZWlnaHQ7IGNudC0tOykgewotICAgICAgICAgICAgKigodWludDMyX3QgKikgZHN0KSA9ICooKHVpbnQzMl90ICopIHNyYyk7Ci0KLSAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgICAgICAgICBkc3QgKz0gc3RyaWRlOwotICAgICAgICB9CisgICAgICAgIGNvcHlfd2lkdGg0X21zYShzcmMsIGRzdCwgc3RyaWRlLCBoZWlnaHQpOwogICAgIH0KIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWMyX21zYSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IHgsIGludCB5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgeCwgaW50IHkpCiB7CiAgICAgaW50MzJfdCBjbnQ7CiAKICAgICBhdl9hc3NlcnQyKHggPCA4ICYmIHkgPCA4ICYmIHggPj0gMCAmJiB5ID49IDApOwogCiAgICAgaWYgKHggJiYgeSkgewotICAgICAgICBhdmNfY2hyb21hX2h2XzJ3X21zYShzcmMsIHN0cmlkZSwgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHgsICg4IC0geCksIHksICg4IC0geSksIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfaHZfMndfbXNhKHNyYywgZHN0LCBzdHJpZGUsIHgsICg4IC0geCksIHksICg4IC0geSksIGhlaWdodCk7CiAgICAgfSBlbHNlIGlmICh4KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHpfMndfbXNhKHNyYywgc3RyaWRlLCBkc3QsIHN0cmlkZSwgeCwgKDggLSB4KSwgaGVpZ2h0KTsKKyAgICAgICAgYXZjX2Nocm9tYV9oel8yd19tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgeCwgKDggLSB4KSwgaGVpZ2h0KTsKICAgICB9IGVsc2UgaWYgKHkpIHsKLSAgICAgICAgYXZjX2Nocm9tYV92dF8yd19tc2Eoc3JjLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCB5LCAoOCAtIHkpLCBoZWlnaHQpOworICAgICAgICBhdmNfY2hyb21hX3Z0XzJ3X21zYShzcmMsIGRzdCwgc3RyaWRlLCB5LCAoOCAtIHkpLCBoZWlnaHQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZvciAoY250ID0gaGVpZ2h0OyBjbnQtLTspIHsKICAgICAgICAgICAgICooKHVpbnQxNl90ICopIGRzdCkgPSAqKCh1aW50MTZfdCAqKSBzcmMpOwpAQCAtMTkzNCw2MyArMTk1OCw1NCBAQAogfQogCiB2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzhfbXNhKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgeCwgaW50IHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoZWlnaHQsIGludCB4LCBpbnQgeSkKIHsKICAgICBhdl9hc3NlcnQyKHggPCA4ICYmIHkgPCA4ICYmIHggPj0gMCAmJiB5ID49IDApOwogCiAKICAgICBpZiAoeCAmJiB5KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0Xzh3X21zYShzcmMsIHN0cmlkZSwgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCB4LCAoOCAtIHgpLCB5LAorICAgICAgICBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF84d19tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgeCwgKDggLSB4KSwgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4IC0geSksIGhlaWdodCk7CiAgICAgfSBlbHNlIGlmICh4KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0Xzh3X21zYShzcmMsIHN0cmlkZSwgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCB4LCAoOCAtIHgpLCBoZWlnaHQpOworICAgICAgICBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF84d19tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgeCwgKDggLSB4KSwgaGVpZ2h0KTsKICAgICB9IGVsc2UgaWYgKHkpIHsKLSAgICAgICAgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfOHdfbXNhKHNyYywgc3RyaWRlLCBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHksICg4IC0geSksIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0Xzh3X21zYShzcmMsIGRzdCwgc3RyaWRlLCB5LCAoOCAtIHkpLCBoZWlnaHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2Z193aWR0aDhfbXNhKHNyYywgc3RyaWRlLCBkc3QsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgYXZnX3dpZHRoOF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgaGVpZ2h0KTsKICAgICB9CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jNF9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoZWlnaHQsIGludCB4LCBpbnQgeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IHgsIGludCB5KQogewogICAgIGF2X2Fzc2VydDIoeCA8IDggJiYgeSA8IDggJiYgeCA+PSAwICYmIHkgPj0gMCk7CiAKICAgICBpZiAoeCAmJiB5KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzR3X21zYShzcmMsIHN0cmlkZSwgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCB4LCAoOCAtIHgpLCB5LAorICAgICAgICBhdmNfY2hyb21hX2h2X2FuZF9hdmVyX2RzdF80d19tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgeCwgKDggLSB4KSwgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4IC0geSksIGhlaWdodCk7CiAgICAgfSBlbHNlIGlmICh4KSB7Ci0gICAgICAgIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzR3X21zYShzcmMsIHN0cmlkZSwgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCB4LCAoOCAtIHgpLCBoZWlnaHQpOworICAgICAgICBhdmNfY2hyb21hX2h6X2FuZF9hdmVyX2RzdF80d19tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgeCwgKDggLSB4KSwgaGVpZ2h0KTsKICAgICB9IGVsc2UgaWYgKHkpIHsKLSAgICAgICAgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfNHdfbXNhKHNyYywgc3RyaWRlLCBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHksICg4IC0geSksIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfdnRfYW5kX2F2ZXJfZHN0XzR3X21zYShzcmMsIGRzdCwgc3RyaWRlLCB5LCAoOCAtIHkpLCBoZWlnaHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2Z193aWR0aDRfbXNhKHNyYywgc3RyaWRlLCBkc3QsIHN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgYXZnX3dpZHRoNF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgaGVpZ2h0KTsKICAgICB9CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jMl9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoZWlnaHQsIGludCB4LCBpbnQgeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IHgsIGludCB5KQogewogICAgIGludDMyX3QgY250OwogCiAgICAgYXZfYXNzZXJ0Mih4IDwgOCAmJiB5IDwgOCAmJiB4ID49IDAgJiYgeSA+PSAwKTsKIAogICAgIGlmICh4ICYmIHkpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9odl9hbmRfYXZlcl9kc3RfMndfbXNhKHNyYywgc3RyaWRlLCBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHgsICg4IC0geCksIHksCisgICAgICAgIGF2Y19jaHJvbWFfaHZfYW5kX2F2ZXJfZHN0XzJ3X21zYShzcmMsIGRzdCwgc3RyaWRlLCB4LCAoOCAtIHgpLCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDggLSB5KSwgaGVpZ2h0KTsKICAgICB9IGVsc2UgaWYgKHgpIHsKLSAgICAgICAgYXZjX2Nocm9tYV9oel9hbmRfYXZlcl9kc3RfMndfbXNhKHNyYywgc3RyaWRlLCBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIHgsICg4IC0geCksIGhlaWdodCk7CisgICAgICAgIGF2Y19jaHJvbWFfaHpfYW5kX2F2ZXJfZHN0XzJ3X21zYShzcmMsIGRzdCwgc3RyaWRlLCB4LCAoOCAtIHgpLCBoZWlnaHQpOwogICAgIH0gZWxzZSBpZiAoeSkgewotICAgICAgICBhdmNfY2hyb21hX3Z0X2FuZF9hdmVyX2RzdF8yd19tc2Eoc3JjLCBzdHJpZGUsIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgeSwgKDggLSB5KSwgaGVpZ2h0KTsKKyAgICAgICAgYXZjX2Nocm9tYV92dF9hbmRfYXZlcl9kc3RfMndfbXNhKHNyYywgZHN0LCBzdHJpZGUsIHksICg4IC0geSksIGhlaWdodCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZm9yIChjbnQgPSBoZWlnaHQ7IGNudC0tOykgewogICAgICAgICAgICAgZHN0WzBdID0gKGRzdFswXSArIHNyY1swXSArIDEpID4+IDE7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaDI2NGRzcF9taXBzLmggYi9saWJhdmNvZGVjL21pcHMvaDI2NGRzcF9taXBzLmgKaW5kZXggMmZkZmQxMS4uMjFiN2RlMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2gyNjRkc3BfbWlwcy5oCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0ZHNwX21pcHMuaApAQCAtMjIsNyArMjIsNyBAQAogI2lmbmRlZiBBVkNPREVDX01JUFNfSDI2NERTUF9NSVBTX0gKICNkZWZpbmUgQVZDT0RFQ19NSVBTX0gyNjREU1BfTUlQU19ICiAKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRkZWMuaCIKICNpbmNsdWRlICJjb25zdGFudHMuaCIKIAogdm9pZCBmZl9oMjY0X2hfbHBmX2x1bWFfaW50ZXJfbXNhKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKQEAgLTc5LDE5ICs3OSwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLCBpbnQgYmV0YSk7CiAKIHZvaWQgZmZfYml3ZWlnaHRfaDI2NF9waXhlbHMxNl84X21zYSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0ZCwgaW50IHdlaWdodHMsIGludCBvZmZzZXQpOwogdm9pZCBmZl9iaXdlaWdodF9oMjY0X3BpeGVsczhfOF9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoZWlnaHQsIGludCBsb2cyX2Rlbm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLCBpbnQgb2Zmc2V0KTsKIHZvaWQgZmZfYml3ZWlnaHRfaDI2NF9waXhlbHM0XzhfbXNhKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywgaW50IG9mZnNldCk7Ci12b2lkIGZmX3dlaWdodF9oMjY0X3BpeGVsczE2XzhfbXNhKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKK3ZvaWQgZmZfd2VpZ2h0X2gyNjRfcGl4ZWxzMTZfOF9tc2EodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodCwgaW50IG9mZnNldCk7Ci12b2lkIGZmX3dlaWdodF9oMjY0X3BpeGVsczhfOF9tc2EodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAordm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHM4XzhfbXNhKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodCwgaW50IG9mZnNldCk7Ci12b2lkIGZmX3dlaWdodF9oMjY0X3BpeGVsczRfOF9tc2EodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAordm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHM0XzhfbXNhKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodCwgaW50IG9mZnNldCk7CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMDBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMzM5LDIzICszMzksMjMgQEAKIHZvaWQgZmZfaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0XzhfbW1pKGludDE2X3QgKmJsb2NrLCBpbnQgcW11bCk7CiB2b2lkIGZmX2gyNjRfY2hyb21hNDIyX2RjX2RlcXVhbnRfaWRjdF84X21taShpbnQxNl90ICpibG9jaywgaW50IHFtdWwpOwogCi12b2lkIGZmX2gyNjRfd2VpZ2h0X3BpeGVsczE2XzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAordm9pZCBmZl9oMjY0X3dlaWdodF9waXhlbHMxNl84X21taSh1aW50OF90ICpibG9jaywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwKICAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOwogdm9pZCBmZl9oMjY0X2Jpd2VpZ2h0X3BpeGVsczE2XzhfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLAorICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLAogICAgICAgICBpbnQgb2Zmc2V0KTsKLXZvaWQgZmZfaDI2NF93ZWlnaHRfcGl4ZWxzOF84X21taSh1aW50OF90ICpibG9jaywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKK3ZvaWQgZmZfaDI2NF93ZWlnaHRfcGl4ZWxzOF84X21taSh1aW50OF90ICpibG9jaywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwKICAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOwogdm9pZCBmZl9oMjY0X2Jpd2VpZ2h0X3BpeGVsczhfOF9tbWkodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgIGludCBzdHJpZGUsIGludCBoZWlnaHQsIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0ZCwgaW50IHdlaWdodHMsCisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoZWlnaHQsIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0ZCwgaW50IHdlaWdodHMsCiAgICAgICAgIGludCBvZmZzZXQpOwotdm9pZCBmZl9oMjY0X3dlaWdodF9waXhlbHM0XzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAordm9pZCBmZl9oMjY0X3dlaWdodF9waXhlbHM0XzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LAogICAgICAgICBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodCwgaW50IG9mZnNldCk7CiB2b2lkIGZmX2gyNjRfYml3ZWlnaHRfcGl4ZWxzNF84X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywKICAgICAgICAgaW50IG9mZnNldCk7CiAKLXZvaWQgZmZfZGVibG9ja192X2Nocm9tYV84X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCit2b2lkIGZmX2RlYmxvY2tfdl9jaHJvbWFfOF9tbWkodWludDhfdCAqcGl4LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLAogICAgICAgICBpbnQ4X3QgKnRjMCk7CiB2b2lkIGZmX2RlYmxvY2tfdl9jaHJvbWFfaW50cmFfOF9tbWkodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCiAgICAgICAgIGludCBiZXRhKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oMjY0ZHNwX21taS5jIGIvbGliYXZjb2RlYy9taXBzL2gyNjRkc3BfbW1pLmMKaW5kZXggMTRjNGE0My4uYWM2ZmE5OSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2gyNjRkc3BfbW1pLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2gyNjRkc3BfbW1pLmMKQEAgLTI1LDM4ICsyNSw1MSBAQAogCiAjaW5jbHVkZSAibGliYXZjb2RlYy9iaXRfZGVwdGhfdGVtcGxhdGUuYyIKICNpbmNsdWRlICJoMjY0ZHNwX21pcHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9tbWl1dGlscy5oIgogCiB2b2lkIGZmX2gyNjRfYWRkX3BpeGVsczRfOF9tbWkodWludDhfdCAqZHN0LCBpbnQxNl90ICpzcmMsIGludCBzdHJpZGUpCiB7CisgICAgZG91YmxlIGZ0bXBbOV07CisgICAgREVDTEFSRV9WQVJfTE9XMzI7CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjIsIDAoJVtzcmNdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgOCglW3NyY10pICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGY2LCAxNiglW3NyY10pICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjgsIDI0KCVbc3JjXSkgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmMTAsIDAoJVtkc3QwXSkgICAgICAgICAgXHJcbiIKLSAgICAgICAgImx3YzEgJGYxMiwgMCglW2RzdDFdKSAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjE0LCAwKCVbZHN0Ml0pICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmMTYsIDAoJVtkc3QzXSkgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEwLCAkZjEwLCAkZjAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmMCAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxNCwgJGYxNCwgJGYwICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE2LCAkZjE2LCAkZjAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGYxMiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNiwgJGY2LCAkZjE0ICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGY4LCAkZjgsICRmMTYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjIsICRmMiwgJGYwICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmNCwgJGY0LCAkZjAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGY2LCAkZjYsICRmMCAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjgsICRmOCwgJGYwICAgICAgICAgXHJcbiIKLSAgICAgICAgInN3YzEgJGYyLCAwKCVbZHN0MF0pICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjQsIDAoJVtkc3QxXSkgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzd2MxICRmNiwgMCglW2RzdDJdKSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInN3YzEgJGY4LCAwKCVbZHN0M10pICAgICAgICAgICBcclxuIgotICAgICAgICA6Oltkc3QwXSJyIihkc3QpLFtkc3QxXSJyIihkc3Qrc3RyaWRlKSxbZHN0Ml0iciIoZHN0KzIqc3RyaWRlKSwKLSAgICAgICAgICBbZHN0M10iciIoZHN0KzMqc3RyaWRlKSxbc3JjXSJyIihzcmMpCi0gICAgICAgIDogIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsIiRmMTAiLCIkZjEyIiwiJGYxNCIsIiRmMTYiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDA4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDE4KQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNV0sICVbZHN0MF0sIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA2XSwgJVtkc3QxXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDddLCAlW2RzdDJdLCAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wOF0sICVbZHN0M10sIDB4MDApCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDFdLCAlW2RzdDBdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXAyXSwgJVtkc3QxXSwgMHgwMCkKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wM10sICVbZHN0Ml0sIDB4MDApCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDRdLCAlW2RzdDNdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pCisgICAgICAgIDogW2RzdDBdInIiKGRzdCksICAgICAgICAgICAgICAgICAgIFtkc3QxXSJyIihkc3Qrc3RyaWRlKSwKKyAgICAgICAgICBbZHN0Ml0iciIoZHN0KzIqc3RyaWRlKSwgICAgICAgICAgW2RzdDNdInIiKGRzdCszKnN0cmlkZSksCisgICAgICAgICAgW3NyY10iciIoc3JjKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIAogICAgIG1lbXNldChzcmMsIDAsIDMyKTsKQEAgLTY0LDc5ICs3Nyw5NCBAQAogCiB2b2lkIGZmX2gyNjRfaWRjdF9hZGRfOF9tbWkodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKIHsKKyAgICBkb3VibGUgZnRtcFsxMl07CisgICAgdWludDY0X3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkbGkgJDgsIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjAsIDAoJVtibG9ja10pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ4LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMiwgOCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ4LCA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGY0LCAxNiglW2Jsb2NrXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOCwgJGYxOCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY4LCAkZjIsICRmMTYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGY2LCAyNCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjEwLCAkZjYsICRmMTYgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY4LCAkZjgsICRmNiAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTAsICRmMTAsICRmMiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjIwLCAkZjQsICRmMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMjIsICRmMTAsICRmMjAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjQsICRmMjAsICRmMTAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyMCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYyLCAkZjIyLCAkZjIwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMTAsICRmMjIsICRmMjAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjgsICRmMCwgJGY0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmNCwgJGYxMCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjEwLCAkZjEwLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYyMCwgJGYyLCAkZjggICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMCwgJGYyLCAkZjggICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTAsICRmMTAsICVbZmZfcHdfMzJdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmNCwgJGYxNiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY2LCAkZjAsICRmMTYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmOCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGY0ICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIwLCAkZjEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTAsICRmMTAsICRmMjAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjIwLCAkZjYsICRmMiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYyLCAkZjIsICRmNiAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMjIsICRmOCwgJGYxMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxNCwgJGYxNCwgJGYxNCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxMCwgJGYxMCwgJGY4ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxNCwgMCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTQsIDgoJVtibG9ja10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjE0LCAxNiglW2Jsb2NrXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxNCwgMjQoJVtibG9ja10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmNCwgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY2LCAkZjIwLCAkZjE4ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHd4YzEgJGYwLCAwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmMjIsICRmMTggICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjE0ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjAsICRmMCwgJGYxNCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGY2ICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmNCwgJGY0LCAkZjE0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjAsICRmMCwgJGYxNCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjQsIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3d4YzEgJGYwLCAwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAlW2RzdF0sICVbZHN0XSwgJVtzdHJpZGVdICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJVtkc3RdLCAlW2RzdF0sICVbc3RyaWRlXSAgICAgICAgXHJcbiIKLSAgICAgICAgImx3YzEgJGY0LCAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjEwLCAkZjEwLCAkZjE4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3hjMSAkZjAsIDAoJVtkc3RdLCAlW3N0cmlkZV0pICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjE4ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmMTQgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjE0ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNCwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjAsICRmMCwgJGYyICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGY0LCAkZjQsICRmMTQgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInN3YzEgJGY0LCAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjAsICRmMCwgJGYxNCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3hjMSAkZjAsIDAoJVtkc3RdLCAlW3N0cmlkZV0pICAgICAgXHJcbiIKLSAgICAgICAgOjpbZHN0XSJyIihkc3QpLFtibG9ja10iciIoYmxvY2spLFtzdHJpZGVdInIiKCh1aW50NjRfdClzdHJpZGUpLAotICAgICAgICAgIFtmZl9wd18zMl0iZiIoZmZfcHdfMzIpCi0gICAgICAgIDogIiQ4IiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIsCi0gICAgICAgICAgIiRmMTgiLCIkZjIwIiwiJGYyMiIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgxMCkKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4MTgpCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDEwXSwgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMTFdLCAgJVtmdG1wNV0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDEwXSwgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxMF0sICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDFdLCAgICVbZnRtcDExXSwgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXA1XSwgICAlW2Z0bXAxMV0sICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wNF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAyXSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDEwXSwgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZmZfcHdfMzJdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxMF0sICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDEwXSwgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMTFdLCAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wN10sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA3XSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDddLCAlW2Jsb2NrXSwgMHgxMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wN10sICVbYmxvY2tdLCAweDE4KQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wMTBdLCAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV1hDMSglW2Z0bXAwXSwgJVtkc3RdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDExXSwgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAyXSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfU1dYQzEoJVtmdG1wMF0sICVbZHN0XSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXWEMxKCVbZnRtcDBdLCAlW2RzdF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV1hDMSglW2Z0bXAwXSwgJVtkc3RdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLCAgICAgICAgICBbZnRtcDExXSI9JmYiKGZ0bXBbMTFdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pCisgICAgICAgIDogW2RzdF0iciIoZHN0KSwgICAgICAgICAgICAgICAgICAgIFtibG9ja10iciIoYmxvY2spLAorICAgICAgICAgIFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLCAgICBbZmZfcHdfMzJdImYiKGZmX3B3XzMyKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIAogICAgIG1lbXNldChibG9jaywgMCwgMzIpOwpAQCAtMTQ0LDQ0OCArMTcyLDQ3MCBAQAogCiB2b2lkIGZmX2gyNjRfaWRjdDhfYWRkXzhfbW1pKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCiB7CisgICAgZG91YmxlIGZ0bXBbMTZdOworICAgIHVpbnQ2NF90IHRtcFs3XTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJsaHUgJDEwLCAweDAoJVtibG9ja10pICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkMjksICQyOSwgLTB4MjAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQxMCwgJDEwLCAweDIwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMiwgMHgxMCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQxMCwgMHgwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDB4MjAoJVtibG9ja10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbGkgJDEwLCAweDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGY2LCAweDMwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDEwLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMTAsIDB4NTAoJVtibG9ja10pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYxMiwgMHg2MCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjE0LCAweDcwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY4LCAkZjEwLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTAsICRmMTAsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY2LCAkZjYsICRmMTYgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjAsICRmMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTAsICRmMTAsICRmMTQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxNCwgJGYxNCwgJGYxNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkMTAsIDB4MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTAsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMTQsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMTggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjYsICRmOCwgJGYxOCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNiwgJGY2LCAkZjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYwLCAkZjAsICRmMTggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTAsICRmMTAsICRmMTggICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjE0LCAkZjE0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMTAsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxMiwgJGYxMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmNCwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTIsICRmMTIsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY4LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMHgwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYxMCwgMHg0MCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxMCwgJGYxMCwgJGY0ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTIsICRmMTIsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY0LCAkZjQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjEwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmOCwgJGY4LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxMCwgJGYxMCwgJGYxMiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTQsICRmMTQsICRmMTIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY0LCAkZjQsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEyLCAkZjEyLCAkZjEyICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxMiwgJGYxMiwgJGYxNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNiwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY0LCAkZjQsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjEwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxMiwgMHgwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxMCwgJGYxMCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYxMiwgJGYxNCwgJGYwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjE0LCAkZjE0LCAkZjAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMCwgJGY2LCAkZjIgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGY2LCAkZjYsICRmMiAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2h3ZCAkZjIsICRmMTQsICRmNiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTQsICRmMTQsICRmNiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGY2LCAkZjEyLCAkZjAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjAsIDB4MCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTQsIDB4MCgkMjkpICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYyLCAweDEwKCQyOSkgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG1mYzEgJDgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbWZjMSAkMTEsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjYsICRmMTAsICRmNCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMTAsICRmMTAsICRmNCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY0LCAkZjgsICRmMCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjgsICRmOCwgJGYwICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMCwgJGYxMCwgJGY4ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxMCwgJGYxMCwgJGY4ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2h3ZCAkZjgsICRmNiwgJGY0ICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmNiwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDB4OCgkMjkpICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYwLCAweDE4KCQyOSkgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG1mYzEgJDksICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbWZjMSAkMTIsICRmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYyLCAweDE4KCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEyLCAweDI4KCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMHgzOCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYwLCAweDU4KCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjYsIDB4NjgoJVtibG9ja10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmOCwgMHg3OCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMTQsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxMCwgJGYwLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjIsICRmMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTAsICRmMTAsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjggICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTQsICRmMTQsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjQsICRmNCwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTQsICRmMTQsICRmOCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmOCwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTQsICRmMTQsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjgsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmNCwgJGYxMCwgJGYxOCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMTggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTQsICRmMTQsICRmMTggICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjAsICRmMCwgJGYxOCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTQsICRmMTQsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjAsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmNiwgJGY2LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxMCwgJGYxMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTAsICRmMTAsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEyLCAweDgoJVtibG9ja10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMCwgMHg0OCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxMiwgJGYxMiwgJGYxMiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTIsICRmMTIsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMCwgJGYwLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxMiwgJGYxMiwgJGYxMiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTIsICRmMTIsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGY2LCAkZjYsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjE0LCAkZjE0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNiwgJGY2LCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxMCwgJGYxMCwgJGYxMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTAsICRmMTAsICRmMTQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxMiwgJGYxMiwgJGYxMiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTIsICRmMTIsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNiwgMHg4KCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmNiwgJGY4LCAkZjE0ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGY4LCAkZjgsICRmMTQgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjE0LCAkZjQsICRmMiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmNCwgJGY0LCAkZjIgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYyLCAkZjgsICRmNCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjgsICRmOCwgJGY0ICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmNCwgJGY2LCAkZjE0ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGY2LCAkZjYsICRmMTQgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYxNCwgMHg4KCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG1mYzEgJDEzLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbWZjMSAkMTUsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMjQsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGYyOCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY0LCAkZjAsICRmMTIgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjAsICRmMCwgJGYxMiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMTIsICRmMTAsICRmMTQgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2h3ZCAkZjE0LCAkZjAsICRmMTAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMCwgJGYwLCAkZjEwICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGY0LCAkZjEyICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjQsICRmNCwgJGYxMiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG1mYzEgJDE0LCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjIyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMjYsICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGYzMCwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJDEwLCAlW2RzdF0sIDB4NCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQxNSwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDExLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMiwgMHgxMCgkMjkpICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ4LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGY4LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjIsICRmMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMCwgJGYxNCwgJGYxNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjAsICRmMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYwLCAkZjAsICRmMjggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTIsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGY4LCAkZjgsICRmMjggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjE0LCAkZjE0LCAkZjI4ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTAsICRmMjgsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjE0LCAkZjE0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMTAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMTggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjEyLCAkZjAsICRmMTggICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxMiwgJGYxMiwgJGY4ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmOCwgJGYxOCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTQsICRmMTQsICRmMTggICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjEwLCAkZjEwLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMTQsICRmMjQgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY0LCAkZjI0LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjAsICRmNiwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmMTQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNiwgMHgwKCQyOSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQxMywgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxNCwgJGYxNCwgJGY2ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNCwgJGY0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY2LCAkZjYsICRmMTQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjE0LCAkZjE0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxNCwgJGYxNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTAsICRmMTAsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjQsICRmNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmOCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY0LCAkZjQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTIsICRmMTIsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGY2LCAkZjYsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjE0LCAkZjE0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGY2LCAweDAoJDI5KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxNCwgJGYxNCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMCwgMHgxMCgkMjkpICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtZmMxICQ4LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmNCwgJGY0LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHgwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGY0LCAweDgoJVtibG9ja10pICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDB4MTAoJVtibG9ja10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHgxOCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGY0LCAweDIwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDB4MjgoJVtibG9ja10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHgzMCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGY0LCAweDM4KCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDB4NDAoJVtibG9ja10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHg0OCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGY0LCAweDUwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDB4NTgoJVtibG9ja10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHg2MCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGY0LCAweDY4KCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDB4NzAoJVtibG9ja10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHg3OCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkMTEsIDB4NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjYsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTEsICRmMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHd4YzEgJGYwLCAweDAoJVtkc3RdLCAlW3N0cmlkZV0pICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxMCwgJGYxMCwgJGYyMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmOCwgJGYyMCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjYsICRmNiwgJGY0ICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGY2LCAkZjYsICRmNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInN3YzEgJGY2LCAweDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3hjMSAkZjAsIDB4MCglW2RzdF0sICVbc3RyaWRlXSkgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAlW2RzdF0sICVbZHN0XSwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICVbZHN0XSwgJVtkc3RdLCAlW3N0cmlkZV0gICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjYsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3eGMxICRmMCwgMHgwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTIsICRmMTIsICRmMjAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMjAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY2LCAkZjYsICRmNCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGY2LCAkZjYsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjAsICRmMCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmNiwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzd2MxICRmNiwgMHgwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3d4YzEgJGYwLCAweDAoJVtkc3RdLCAlW3N0cmlkZV0pICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEwLCAweDAoJDI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmOCwgMHgxMCgkMjkpICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJVtkc3RdLCAlW2RzdF0sICVbc3RyaWRlXSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAlW2RzdF0sICVbZHN0XSwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImx3YzEgJGY2LCAweDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3hjMSAkZjAsIDB4MCglW2RzdF0sICVbc3RyaWRlXSkgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjE0LCAkZjE0LCAkZjIwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTAsICRmMTAsICRmMjAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNiwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNiwgJGY2LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYwLCAkZjAsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjYsICRmNiwgJGY0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjYsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3eGMxICRmMCwgMHgwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICVbZHN0XSwgJVtkc3RdLCAlW3N0cmlkZV0gICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJVtkc3RdLCAlW2RzdF0sICVbc3RyaWRlXSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmNiwgMHgwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHd4YzEgJGYwLCAweDAoJVtkc3RdLCAlW3N0cmlkZV0pICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY4LCAkZjgsICRmMjAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjEyLCAkZjEyLCAkZjIwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjYsICRmNiwgJGY0ICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGY2LCAkZjYsICRmNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInN3YzEgJGY2LCAweDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3hjMSAkZjAsIDB4MCglW2RzdF0sICVbc3RyaWRlXSkgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTIsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ5LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjgsIDB4MTgoJDI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjEwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmOCwgJGY4LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxNCwgJGYyMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjE0LCAkZjE0LCAkZjIyICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxNCwgJGYxNCwgJGYzMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGYyMiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMTQsICRmMTQsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGY4LCAkZjgsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjEwLCAkZjEwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNiwgJGYyMiwgJGYyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMTYgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjMwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNiwgJGY2LCAkZjMwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY0LCAkZjMwLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjEwLCAkZjEwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNiwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGY0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmOCwgJGYxOCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMiwgJGYxNCwgJGYxOCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGY4LCAkZjgsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjIsICRmMiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTAsICRmMTAsICRmMTggICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY2LCAkZjYsICRmMTggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjEwLCAkZjEwLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGY2LCAkZjI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjAsICRmMjYsICRmMTYgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTQsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYwLCAkZjAsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjE0LCAkZjE0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYxMiwgMHg4KCQyOSkgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDE0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjYsICRmNiwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTIsICRmMTIsICRmMTIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYwLCAkZjAsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjEyLCAkZjEyLCAkZjYgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNiwgJGY2LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxNCwgJGYxNCwgJGYxMiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTIsICRmMTIsICRmMTIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGY0LCAkZjQsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjEyLCAkZjEyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTQsICRmMTQsICRmMTQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjE0LCAkZjE0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTIsICRmMTIsICRmMTIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGY4LCAkZjgsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjEyLCAkZjEyLCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNiwgJGY2LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjEyLCAweDgoJDI5KSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjYsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxNCwgMHgxOCgkMjkpICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG1mYzEgJDksICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImx3YzEgJGYxMiwgMHgwKCQxMCkgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3hjMSAkZjE0LCAweDAoJDEwLCAlW3N0cmlkZV0pICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjQsICRmNCwgJGYyMCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTAsICRmMTAsICRmMjAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxNCwgJGYxNCwgJGYwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTIsICRmMTIsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxNCwgJGYxNCwgJGYxMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMTQsICRmMTQsICRmMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjEyLCAweDAoJDEwKSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3eGMxICRmMTQsIDB4MCgkMTAsICVbc3RyaWRlXSkgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQxMCwgJDEwLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmMTIsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHd4YzEgJGYxNCwgMHgwKCQxMCwgJVtzdHJpZGVdKSAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMjAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmOCwgJGYyMCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTQsICRmMTQsICRmMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEyLCAkZjEyLCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTQsICRmMTQsICRmOCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYxMiwgJGYxMiwgJGYwICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjE0LCAkZjE0LCAkZjAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInN3YzEgJGYxMiwgMHgwKCQxMCkgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3hjMSAkZjE0LCAweDAoJDEwLCAlW3N0cmlkZV0pICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMHg4KCQyOSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYxMCwgMHgxOCgkMjkpICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOSwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQxMCwgJDEwLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjEyLCAweDAoJDEwKSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3eGMxICRmMTQsIDB4MCgkMTAsICVbc3RyaWRlXSkgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmNiwgJGY2LCAkZjIwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY0LCAkZjQsICRmMjAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGYwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE0LCAkZjE0LCAkZjAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxMiwgJGYxMiwgJGY2ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjE0LCAkZjE0LCAkZjQgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMTIsICRmMTIsICRmMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYxNCwgJGYxNCwgJGYwICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzd2MxICRmMTIsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3d4YzEgJGYxNCwgMHgwKCQxMCwgJVtzdHJpZGVdKSAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTAsICQxMCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImx3YzEgJGYxMiwgMHgwKCQxMCkgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3hjMSAkZjE0LCAweDAoJDEwLCAlW3N0cmlkZV0pICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjEwLCAkZjEwLCAkZjIwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjIwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxNCwgJGYxNCwgJGYwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTIsICRmMTIsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYxNCwgJGYxNCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMTQsICRmMTQsICRmMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjEyLCAweDAoJDEwKSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3eGMxICRmMTQsIDB4MCgkMTAsICVbc3RyaWRlXSkgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkMjksICQyOSwgMHgyMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6Oltkc3RdInIiKGRzdCksW2Jsb2NrXSJyIihibG9jayksW3N0cmlkZV0iciIoKHVpbnQ2NF90KXN0cmlkZSkKLSAgICAgICAgOiIkOCIsIiQ5IiwiJDEwIiwiJDExIiwiJDEyIiwiJDEzIiwiJDE0IiwiJDE1IiwiJDI5IiwiJGYwIiwiJGYyIiwiJGY0IiwKLSAgICAgICAgICIkZjgiLCIkZjEwIiwiJGYxMiIsIiRmMTQiLCIkZjE2IiwiJGYxOCIsIiRmMjAiLCIkZjIyIiwiJGYyNCIsIiRmMjYiLAotICAgICAgICAgIiRmMjgiLCIkZjMwIgorICAgICAgICAibGh1ICAgICAgICAlW3RtcDBdLCAgICAweDAwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FEREkgICAiJDI5LCAgICAgICAgJDI5LCAgICAgICAgICAgIC0weDIwICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAweDIwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtibG9ja10sIDB4MTApCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMF0sICAgIDB4MDAoJVtibG9ja10pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MjApCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4MzApCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXA1XSwgJVtibG9ja10sIDB4NTApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDZdLCAlW2Jsb2NrXSwgMHg2MCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wN10sICVbYmxvY2tdLCAweDcwKQorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wN10sICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAlW2Jsb2NrXSwgMHg0MCkKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVtibG9ja10sIDB4MDApCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA2XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDBdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wMV0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAzXSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wN10sICQyOSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICQyOSwgMHgxMCkKKyAgICAgICAgImRtZmMxICAgICAgJVt0bXAxXSwgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbWZjMSAgICAgICVbdG1wM10sICAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAzXSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDJdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wMF0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA0XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAkMjksIDB4MDgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAkMjksIDB4MTgpCisgICAgICAgICJkbWZjMSAgICAgICVbdG1wMl0sICAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG1mYzEgICAgICAlW3RtcDRdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbYmxvY2tdLCAweDE4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXA2XSwgJVtibG9ja10sIDB4MjgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgzOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDU4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4NjgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW2Jsb2NrXSwgMHg3OCkKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wN10sICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDZdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDQ4KQorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDNdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDNdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wN10sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAxXSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDJdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wN10sICVbYmxvY2tdLCAweDA4KQorICAgICAgICAiZG1mYzEgICAgICAlW3RtcDVdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wMTBdLCAgJVtmdG1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDEyXSwgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAxNF0sICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMl0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA2XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDddLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNV0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG1mYzEgICAgICAlW3RtcDZdLCAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wMTFdLCAgJVtmdG1wN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDEzXSwgICVbZnRtcDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAxNV0sICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERElVICAiJVthZGRyMF0sICAgJVtkc3RdLCAgICAgICAgIDB4MDQgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDddLCAgICVbZnRtcDEwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDNdLCAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICQyOSwgMHgxMCkKKyAgICAgICAgImRtdGMxICAgICAgJVt0bXAxXSwgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxNF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAxNF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTRdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wMTRdLCAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wNV0sICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wN10sICAgJVtmdG1wMTJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDEyXSwgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJDI5LCAweDAwKQorICAgICAgICAiZG10YzEgICAgICAlW3RtcDVdLCAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJDI5LCAweDAwKQorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICQyOSwgMHgxMCkKKyAgICAgICAgImRtZmMxICAgICAgJVt0bXAxXSwgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDEwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MTgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgyMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDI4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MzApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgzOCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDQwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4NDgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHg1MCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDU4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4NjApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHg2OCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDcwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4NzgpCisgICAgICAgICJkbGkgICAgICAgICVbdG1wM10sICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDNdLCAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDNdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9MV1hDMSglW2Z0bXAwXSwgJVtkc3RdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wM10sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgTU1JX1NXWEMxKCVbZnRtcDBdLCAlW2RzdF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgTU1JX0xXWEMxKCVbZnRtcDBdLCAlW2RzdF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfU1dYQzEoJVtmdG1wMF0sICVbZHN0XSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA1XSwgJDI5LCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJDI5LCAweDEwKQorICAgICAgICAiZG10YzEgICAgICAlW3RtcDFdLCAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgTU1JX0xXWEMxKCVbZnRtcDBdLCAlW2RzdF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfU1dYQzEoJVtmdG1wMF0sICVbZHN0XSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfTFdYQzEoJVtmdG1wMF0sICVbZHN0XSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDNdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9TV1hDMSglW2Z0bXAwXSwgJVtkc3RdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgICJkbXRjMSAgICAgICVbdG1wNF0sICAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDJdLCAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICQyOSwgMHgxOCkKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXAxMV0sICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDExXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDExXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDExXSwgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDE1XSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxNV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAxNV0sICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAxM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMTNdLCAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDZdLCAkMjksIDB4MDgpCisgICAgICAgICJkbXRjMSAgICAgICVbdG1wNl0sICAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAkMjksIDB4MDgpCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA3XSwgJDI5LCAweDE4KQorICAgICAgICAiZG1mYzEgICAgICAlW3RtcDJdLCAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA2XSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9MV1hDMSglW2Z0bXA3XSwgJVthZGRyMF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9TV1hDMSglW2Z0bXA3XSwgJVthZGRyMF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfTFdYQzEoJVtmdG1wN10sICVbYWRkcjBdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfU1dYQzEoJVtmdG1wN10sICVbYWRkcjBdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAkMjksIDB4MDgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAkMjksIDB4MTgpCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDJdLCAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA2XSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9MV1hDMSglW2Z0bXA3XSwgJVthZGRyMF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9TV1hDMSglW2Z0bXA3XSwgJVthZGRyMF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfTFdYQzEoJVtmdG1wN10sICVbYWRkcjBdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfU1dYQzEoJVtmdG1wN10sICVbYWRkcjBdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgIFBUUl9BRERJVSAgIiQyOSwgICAgICAgICQyOSwgICAgICAgICAgICAweDIwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbZnRtcDEwXSI9JmYiKGZ0bXBbMTBdKSwgICAgICAgICAgW2Z0bXAxMV0iPSZmIihmdG1wWzExXSksCisgICAgICAgICAgW2Z0bXAxMl0iPSZmIihmdG1wWzEyXSksICAgICAgICAgIFtmdG1wMTNdIj0mZiIoZnRtcFsxM10pLAorICAgICAgICAgIFtmdG1wMTRdIj0mZiIoZnRtcFsxNF0pLCAgICAgICAgICBbZnRtcDE1XSI9JmYiKGZ0bXBbMTVdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLCAgICAgICAgICAgICAgW3RtcDFdIj0mciIodG1wWzFdKSwKKyAgICAgICAgICBbdG1wMl0iPSZyIih0bXBbMl0pLCAgICAgICAgICAgICAgW3RtcDNdIj0mciIodG1wWzNdKSwKKyAgICAgICAgICBbdG1wNF0iPSZyIih0bXBbNF0pLCAgICAgICAgICAgICAgW3RtcDVdIj0mciIodG1wWzVdKSwKKyAgICAgICAgICBbdG1wNl0iPSZyIih0bXBbNl0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKQorICAgICAgICA6IFtkc3RdInIiKGRzdCksICAgICAgICAgICAgICAgICAgICBbYmxvY2tdInIiKGJsb2NrKSwKKyAgICAgICAgICBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKQorICAgICAgICA6ICIkMjkiLCJtZW1vcnkiCiAgICAgKTsKIAogICAgIG1lbXNldChibG9jaywgMCwgMTI4KTsKQEAgLTU5Myw5MSArNjQzLDEzMCBAQAogCiB2b2lkIGZmX2gyNjRfaWRjdF9kY19hZGRfOF9tbWkodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKIHsKKyAgICBpbnQgZGMgPSAoYmxvY2tbMF0gKyAzMikgPj4gNjsKKyAgICBkb3VibGUgZnRtcFs2XTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKworICAgIGJsb2NrWzBdID0gMDsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAibGggJDgsIDB4MCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZCAkMCwgMHgwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkOCwgJDgsIDB4MjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAlW3N0cmlkZV0sICVbc3RyaWRlXSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkc3JhICQ4LCAkOCwgMHg2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjIsICRmMiwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibXRjMSAkOCwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYwLCAkZjAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ4LCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYyLCAkZjIsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyLCAkZjIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjQsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3eGMxICRmNiwgMHgwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHd4YzEgJGY4LCAweDAoJVtkc3RdLCAkMTApICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3hjMSAkZjEwLCAweDAoJVtkc3RdLCAkOCkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmNCwgJGY0LCAkZjAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGR1c2IgJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHVzYiAkZjgsICRmOCwgJGYwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmMTAsICRmMTAsICRmMCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJ1c2IgJGY0LCAkZjQsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJ1c2IgJGYxMCwgJGYxMCwgJGYyICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjQsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3eGMxICRmNiwgMHgwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3d4YzEgJGY4LCAweDAoJVtkc3RdLCAkMTApICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3hjMSAkZjEwLCAweDAoJVtkc3RdLCAkOCkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W2RzdF0iciIoZHN0KSxbYmxvY2tdInIiKGJsb2NrKSxbc3RyaWRlXSJyIigodWludDY0X3Qpc3RyaWRlKQotICAgICAgICA6ICIkOCIsIiQxMCIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsIiRmMTAiCisgICAgICAgICJtdGMxICAgICAgICVbZGNdLCAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgJVtkc3QwXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW2RzdDFdLCAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbZHN0Ml0sIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA0XSwgJVtkc3QzXSwgMHgwMCkKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0MF0sIDB4MDApCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDJdLCAlW2RzdDFdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXAzXSwgJVtkc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNF0sICVbZHN0M10sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSkKKyAgICAgICAgOiBbZHN0MF0iciIoZHN0KSwgICAgICAgICAgICAgICAgICAgW2RzdDFdInIiKGRzdCtzdHJpZGUpLAorICAgICAgICAgIFtkc3QyXSJyIihkc3QrMipzdHJpZGUpLCAgICAgICAgICBbZHN0M10iciIoZHN0KzMqc3RyaWRlKSwKKyAgICAgICAgICBbZGNdInIiKGRjKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAogdm9pZCBmZl9oMjY0X2lkY3Q4X2RjX2FkZF84X21taSh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQogeworICAgIGludCBkYyA9IChibG9ja1swXSArIDMyKSA+PiA2OworICAgIGRvdWJsZSBmdG1wWzEwXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIGJsb2NrWzBdID0gMDsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAibGggJDgsIDB4MCglW2Jsb2NrXSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZCAkMCwgMHgwKCVbYmxvY2tdKSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkOCwgJDgsIDB4MjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAlW3N0cmlkZV0sICVbc3RyaWRlXSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkc3JhICQ4LCAkOCwgMHg2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjIsICRmMiwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibXRjMSAkOCwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYwLCAkZjAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ4LCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYyLCAkZjIsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyLCAkZjIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmNiwgMHgwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGR4YzEgJGY4LCAweDAoJVtkc3RdLCAkMTApICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHhjMSAkZjEwLCAweDAoJVtkc3RdLCAkOCkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmNCwgJGY0LCAkZjAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGR1c2IgJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHVzYiAkZjgsICRmOCwgJGYwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmMTAsICRmMTAsICRmMCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJ1c2IgJGY0LCAkZjQsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJ1c2IgJGYxMCwgJGYxMCwgJGYyICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmNiwgMHgwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2R4YzEgJGY4LCAweDAoJVtkc3RdLCAkMTApICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDksICQxMCwgJDEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmMTAsIDB4MCglW2RzdF0sICQ4KSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICVbZHN0XSwgJVtkc3RdLCAkOSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmNiwgMHgwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGR4YzEgJGY4LCAweDAoJVtkc3RdLCAkMTApICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHhjMSAkZjEwLCAweDAoJVtkc3RdLCAkOCkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmNCwgJGY0LCAkZjAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGR1c2IgJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHVzYiAkZjgsICRmOCwgJGYwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmMTAsICRmMTAsICRmMCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJ1c2IgJGY0LCAkZjQsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJ1c2IgJGYxMCwgJGYxMCwgJGYyICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDB4MCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmNiwgMHgwKCVbZHN0XSwgJVtzdHJpZGVdKSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2R4YzEgJGY4LCAweDAoJVtkc3RdLCAkMTApICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHhjMSAkZjEwLCAweDAoJVtkc3RdLCAkOCkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W2RzdF0iciIoZHN0KSxbYmxvY2tdInIiKGJsb2NrKSxbc3RyaWRlXSJyIigodWludDY0X3Qpc3RyaWRlKQotICAgICAgICA6ICIkOCIsIiQ5IiwiJDEwIiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIKKyAgICAgICAgIm10YzEgICAgICAgJVtkY10sICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbZHN0MF0sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2RzdDFdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtkc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICVbZHN0M10sIDB4MDApCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDZdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wN10sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDldLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0MF0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2RzdDFdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJVtkc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbZHN0M10sIDB4MDApCisKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbZHN0NF0sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2RzdDVdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtkc3Q2XSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICVbZHN0N10sIDB4MDApCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDZdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wN10sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDldLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0NF0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2RzdDVdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJVtkc3Q2XSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbZHN0N10sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pCisgICAgICAgIDogW2RzdDBdInIiKGRzdCksICAgICAgICAgICAgICAgICAgIFtkc3QxXSJyIihkc3Qrc3RyaWRlKSwKKyAgICAgICAgICBbZHN0Ml0iciIoZHN0KzIqc3RyaWRlKSwgICAgICAgICAgW2RzdDNdInIiKGRzdCszKnN0cmlkZSksCisgICAgICAgICAgW2RzdDRdInIiKGRzdCs0KnN0cmlkZSksICAgICAgICAgIFtkc3Q1XSJyIihkc3QrNSpzdHJpZGUpLAorICAgICAgICAgIFtkc3Q2XSJyIihkc3QrNipzdHJpZGUpLCAgICAgICAgICBbZHN0N10iciIoZHN0Kzcqc3RyaWRlKSwKKyAgICAgICAgICBbZGNdInIiKGRjKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIApAQCAtNzc1LDIxMiArODY0LDIyNyBAQAogdm9pZCBmZl9oMjY0X2x1bWFfZGNfZGVxdWFudF9pZGN0XzhfbW1pKGludDE2X3QgKm91dHB1dCwgaW50MTZfdCAqaW5wdXQsCiAgICAgICAgIGludCBxbXVsKQogeworICAgIGRvdWJsZSBmdG1wWzEwXTsKKyAgICB1aW50NjRfdCB0bXBbMl07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgIi5zZXQgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkMTAsIDB4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGY2LCAweDE4KCVbaW5wdXRdKSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQxMCwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGY0LCAweDEwKCVbaW5wdXRdKSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkMTAsIDB4MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYyLCAweDgoJVtpbnB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQxMCwgJGYxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYwLCAweDAoJVtpbnB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmOCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNiwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNCwgJGY0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmOCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmOCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNiwgJGY2LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMiwgJGYyLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmOCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNCwgJGY0LCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmOCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjgsICRmOCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjIsICRmMCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2h3ZCAkZjQsICRmNiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjgsICRmOCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2h3ZCAkZjAsICRmMCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmOCwgJGY4LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNiwgJGY2LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNCwgJGY0LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkMTAsICVbcW11bF0sIC0weDdmZmYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmOCwgJGY4LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJndHogJDEwLCAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmNiwgJGY2LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm9yaSAkMTAsICQwLCAweDgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzbGwgJDEwLCAkMTAsIDB4MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjIsICRmMCwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICVbcW11bF0sICVbcW11bF0sICQxMCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjAsICRmMCwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjEwLCAkZjQsICVbZmZfcHdfMV0gICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjQsICRmNCwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm10YzEgJVtxbXVsXSwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjE0LCAkZjE0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYwLCAkZjAsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGY0LCAkZjQsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYyLCAkZjIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMCwgJGYwLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmNCwgJGY0LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMiwgJGYyLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMTAsICRmMTAsICRmMTYgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmNCwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJGYwLCAkZjAsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJVtpbnB1dF0sICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDgwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJVtpbnB1dF0sICVbaW5wdXRdLCAweDEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDIwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweGEwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJGY0LCAkZjQsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJVtpbnB1dF0sICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDQwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweGMwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJVtpbnB1dF0sICVbaW5wdXRdLCAweDEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDYwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweGUwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjIsICRmNiwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjYsICRmNiwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjEwLCAkZjgsICVbZmZfcHdfMV0gICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjgsICRmOCwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm10YzEgJVtxbXVsXSwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjE0LCAkZjE0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGY2LCAkZjYsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGY4LCAkZjgsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYyLCAkZjIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmNiwgJGY2LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmOCwgJGY4LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMiwgJGYyLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMTAsICRmMTAsICRmMTYgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmNiwgJGY2LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJGY2LCAkZjYsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJVtpbnB1dF0sICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDEwMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDE4MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJVtpbnB1dF0sICVbaW5wdXRdLCAweDEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDEyMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDFhMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJGY4LCAkZjgsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJVtpbnB1dF0sICRmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDE0MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDFjMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJVtpbnB1dF0sICVbaW5wdXRdLCAweDEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDE2MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImpyICQzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDFlMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm9yaSAkMTAsICQwLCAweDFmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImNseiAkOSwgJVtxbXVsXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm9yaSAlW2lucHV0XSwgJDAsIDB4NyAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzdWJ1ICQ5LCAkMTAsICQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm9yaSAkMTAsICQwLCAweDgwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzbGwgJDEwLCAkMTAsIDB4MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICVbcW11bF0sICVbcW11bF0sICQxMCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzdWJ1ICQxMCwgJDksICVbaW5wdXRdICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdm4gJDksICVbaW5wdXRdLCAkMTAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAlW2lucHV0XSwgJVtpbnB1dF0sIDB4MSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImFuZGkgJDEwLCAkOSwgMHhmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmx2ICVbcW11bF0sICVbcW11bF0sICQxMCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzdWJ1ICVbaW5wdXRdLCAlW2lucHV0XSwgJDkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm10YzEgJVtpbnB1dF0sICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjIsICRmMCwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjAsICRmMCwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjEwLCAkZjQsICVbZmZfcHdfMV0gICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjQsICRmNCwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm10YzEgJVtxbXVsXSwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjE0LCAkZjE0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYwLCAkZjAsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGY0LCAkZjQsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYyLCAkZjIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMCwgJGYwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmNCwgJGY0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMiwgJGYyLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMTAsICRmMTAsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmNCwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJGYwLCAkZjAsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJVtpbnB1dF0sICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDgwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDIwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJVtpbnB1dF0sICVbaW5wdXRdLCAweDEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweGEwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJGY0LCAkZjQsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDQwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJVtpbnB1dF0sICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweGMwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDYwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJVtpbnB1dF0sICVbaW5wdXRdLCAweDEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweGUwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjIsICRmNiwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjYsICRmNiwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hodyAkZjEwLCAkZjgsICVbZmZfcHdfMV0gICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xodyAkZjgsICRmOCwgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm10YzEgJVtxbXVsXSwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjE0LCAkZjE0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGY2LCAkZjYsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGY4LCAkZjgsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYyLCAkZjIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtYWRkaHcgJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmNiwgJGY2LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMiwgJGYyLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmF3ICRmMTAsICRmMTAsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmNiwgJGY2LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJGY2LCAkZjYsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJVtpbnB1dF0sICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDEwMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDE4MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJVtpbnB1dF0sICVbaW5wdXRdLCAweDEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDEyMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDFhMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJGY4LCAkZjgsICRmMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJVtpbnB1dF0sICRmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDE0MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDFjMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJVtpbnB1dF0sICVbaW5wdXRdLCAweDEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICQ5LCAweDE2MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNoICVbaW5wdXRdLCAweDFlMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIi5zZXQgcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOjpbb3V0cHV0XSJyIihvdXRwdXQpLFtpbnB1dF0iciIoaW5wdXQpLFtxbXVsXSJyIigodWludDY0X3QpcW11bCksCi0gICAgICAgICAgW2ZmX3B3XzFdImYiKGZmX3B3XzEpCi0gICAgICAgIDogIiQ5IiwiJDEwIiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIsCi0gICAgICAgICAgIiRmMTgiCisgICAgICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbaW5wdXRdLCAweDE4KQorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbaW5wdXRdLCAweDEwKQorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbaW5wdXRdLCAweDA4KQorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbaW5wdXRdLCAweDAwKQorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAxXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDJdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wMF0sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wMV0sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkaSAgICAgICVbdG1wMF0sICAgICVbcW11bF0sICAgICAgICAtMHg3ZmZmICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJndHogICAgICAgJVt0bXAwXSwgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3JpICAgICAgICAlW3RtcDBdLCAgICAkMCwgICAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzbGwgICAgICAgJVt0bXAwXSwgICAgJVt0bXAwXSwgICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDFdLCAgICVbZnRtcDBdLCAgICAgICAlW2ZmX3B3XzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZHUgICAgICAlW3FtdWxdLCAgICAlW3FtdWxdLCAgICAgICAgJVt0bXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZmZfcHdfMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVtxbXVsXSwgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1hZGRodyAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYWRkaHcgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWFkZGh3ICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1hZGRodyAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrc3N3aCAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2ggICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtZmMxICAgICAgJVt0bXAxXSwgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc3JsICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW2lucHV0XSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgJVt0bXAxXSwgICAgMHgwMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbaW5wdXRdLCAgIDB4ODAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNybCAgICAgICAlW3RtcDFdLCAgICAlW3RtcDFdLCAgICAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NSTCAgICAiJVtpbnB1dF0sICAgJVtpbnB1dF0sICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMV0sICAgIDB4MjAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW2lucHV0XSwgICAweGEwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtZmMxICAgICAgJVt0bXAxXSwgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc3JsICAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW2lucHV0XSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgJVt0bXAxXSwgICAgMHg0MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbaW5wdXRdLCAgIDB4YzAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNybCAgICAgICAlW3RtcDFdLCAgICAlW3RtcDFdLCAgICAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NSTCAgICAiJVtpbnB1dF0sICAgJVtpbnB1dF0sICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMV0sICAgIDB4NjAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW2lucHV0XSwgICAweGUwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMV0sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA1XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmZl9wd18xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcHdfMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbcW11bF0sICAgICVbZnRtcDddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYWRkaHcgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWFkZGh3ICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1hZGRodyAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYWRkaHcgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2ggICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2tzc3doICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbWZjMSAgICAgICVbdG1wMV0sICAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNybCAgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1mYzEgICAgICAgJVtpbnB1dF0sICAgJVtmdG1wM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMV0sICAgIDB4MTAwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW2lucHV0XSwgICAweDE4MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmwgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9TUkwgICAgIiVbaW5wdXRdLCAgICVbaW5wdXRdLCAgICAgICAweDEwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW3RtcDFdLCAgICAweDEyMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgJVtpbnB1dF0sICAgMHgxYTAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbWZjMSAgICAgICVbdG1wMV0sICAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNybCAgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1mYzEgICAgICAgJVtpbnB1dF0sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMV0sICAgIDB4MTQwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW2lucHV0XSwgICAweDFjMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmwgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9TUkwgICAgIiVbaW5wdXRdLCAgICVbaW5wdXRdLCAgICAgICAweDEwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW3RtcDFdLCAgICAweDE2MCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImogICAgICAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbaW5wdXRdLCAgIDB4MWUwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yaSAgICAgICAgJVt0bXAwXSwgICAgJDAsICAgICAgICAgICAgIDB4MWYgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjaWYgSEFWRV9MT09OR1NPTjMKKyAgICAgICAgImNseiAgICAgICAgJVt0bXAxXSwgICAgJVtxbXVsXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxpZiBIQVZFX0xPT05HU09OMgorI2VuZGlmCisgICAgICAgICJvcmkgICAgICAgICVbaW5wdXRdLCAgICQwLCAgICAgICAgICAgICAweDA3ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHN1YnUgICAgICAlW3RtcDFdLCAgICAlW3RtcDBdLCAgICAgICAgJVt0bXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yaSAgICAgICAgJVt0bXAwXSwgICAgJDAsICAgICAgICAgICAgIDB4ODAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc2xsICAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAweDEwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZHUgICAgICAlW3FtdWxdLCAgICAlW3FtdWxdLCAgICAgICAgJVt0bXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzdWJ1ICAgICAgJVt0bXAwXSwgICAgJVt0bXAxXSwgICAgICAgICVbaW5wdXRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZuICAgICAgICVbdG1wMV0sICAgICVbaW5wdXRdLCAgICAgICAlW3RtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW2lucHV0XSwgICAlW2lucHV0XSwgICAgICAgMHgwMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZGkgICAgICAgJVt0bXAwXSwgICAgJVt0bXAxXSwgICAgICAgIDB4ZmYgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmx2ICAgICAgICVbcW11bF0sICAgICVbcW11bF0sICAgICAgICAlW3RtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU1VCVSAgICIlW2lucHV0XSwgICAlW2lucHV0XSwgICAgICAgJVt0bXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVtpbnB1dF0sICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDFdLCAgICVbZnRtcDBdLCAgICAgICAlW2ZmX3B3XzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmZl9wd18xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wNV0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3FtdWxdLCAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWFkZGh3ICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1hZGRodyAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYWRkaHcgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWFkZGh3ICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2tzc3doICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrc3N3aCAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG1mYzEgICAgICAlW3RtcDFdLCAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmwgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMV0sICAgIDB4MDAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW2lucHV0XSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmwgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbaW5wdXRdLCAgIDB4ODAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW3RtcDFdLCAgICAweDIwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NSTCAgICAiJVtpbnB1dF0sICAgJVtpbnB1dF0sICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbWZjMSAgICAgICVbdG1wMV0sICAgICVbZnRtcDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW2lucHV0XSwgICAweGEwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmwgICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMV0sICAgIDB4NDAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW2lucHV0XSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmwgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbaW5wdXRdLCAgIDB4YzAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW3RtcDFdLCAgICAweDYwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NSTCAgICAiJVtpbnB1dF0sICAgJVtpbnB1dF0sICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbaW5wdXRdLCAgIDB4ZTAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAxXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd18xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDVdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3B3XzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmZl9wd18xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVtxbXVsXSwgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1hZGRodyAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtYWRkaHcgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWFkZGh3ICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1hZGRodyAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhdyAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYXcgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmF3ICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrc3N3aCAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2ggICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtZmMxICAgICAgJVt0bXAxXSwgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc3JsICAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW2lucHV0XSwgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgJVt0bXAxXSwgICAgMHgxMDAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbaW5wdXRdLCAgIDB4MTgwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNybCAgICAgICAlW3RtcDFdLCAgICAlW3RtcDFdLCAgICAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NSTCAgICAiJVtpbnB1dF0sICAgJVtpbnB1dF0sICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMV0sICAgIDB4MTIwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW2lucHV0XSwgICAweDFhMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtZmMxICAgICAgJVt0bXAxXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc3JsICAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW2lucHV0XSwgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNoICAgICAgICAgJVt0bXAxXSwgICAgMHgxNDAoJVtvdXRwdXRdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbaW5wdXRdLCAgIDB4MWMwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNybCAgICAgICAlW3RtcDFdLCAgICAlW3RtcDFdLCAgICAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NSTCAgICAiJVtpbnB1dF0sICAgJVtpbnB1dF0sICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaCAgICAgICAgICVbdG1wMV0sICAgIDB4MTYwKCVbb3V0cHV0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2ggICAgICAgICAlW2lucHV0XSwgICAweDFlMCglW291dHB1dF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIuc2V0ICAgICAgIHJlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLCAgICAgICAgICAgICAgW3RtcDFdIj0mciIodG1wWzFdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbb3V0cHV0XSIrJnIiKG91dHB1dCksICAgICAgICAgICAgW2lucHV0XSIrJnIiKGlucHV0KSwKKyAgICAgICAgICBbcW11bF0iKyZyIihxbXVsKQorICAgICAgICA6IFtmZl9wd18xXSJmIihmZl9wd18xKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIApAQCAtMTAzMSwxMCArMTEzNSwxMiBAQAogICAgIGJsb2NrWzQ4XT0gKChkLWIpKnFtdWwpID4+IDc7CiB9CiAKLXZvaWQgZmZfaDI2NF93ZWlnaHRfcGl4ZWxzMTZfOF9tbWkodWludDhfdCAqYmxvY2ssIGludCBzdHJpZGUsCi0gICAgICAgIGludCBoZWlnaHQsIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0LCBpbnQgb2Zmc2V0KQordm9pZCBmZl9oMjY0X3dlaWdodF9waXhlbHMxNl84X21taSh1aW50OF90ICpibG9jaywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwKKyAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpCiB7CiAgICAgaW50IHk7CisgICAgZG91YmxlIGZ0bXBbOF07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CiAKICAgICBvZmZzZXQgPDw9IGxvZzJfZGVub207CiAKQEAgLTEwNDMsMTA1ICsxMTQ5LDEyNSBAQAogCiAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyssIGJsb2NrKz1zdHJpZGUpIHsKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICAgICAibGRjMSAkZjIsICUwICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibGRjMSAkZjQsICUxICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAiZG10YzEgJDAsICRmMjAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibXRjMSAlMiwgJGY2ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibXRjMSAlMywgJGY4ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibXRjMSAlNCwgJGYxMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNodWZoICRmNiwgJGY2LCAkZjIwICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNodWZoICRmOCwgJGY4LCAkZjIwICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHVucGNraGJoICRmMTQsICRmMiwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHVucGNraGJoICRmMTYsICRmNCwgJGYyMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjIwICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicG11bGxoICRmMTQsICRmMTQsICRmNiAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicG11bGxoICRmMTYsICRmMTYsICRmNiAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicG11bGxoICRmNCwgJGY0LCAkZjYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFkZHNoICRmMTQsICRmMTQsICRmOCAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFkZHNoICRmMTYsICRmMTYsICRmOCAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFkZHNoICRmMiwgJGYyLCAkZjggICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFkZHNoICRmNCwgJGY0LCAkZjggICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNyYWggJGYxNCwgJGYxNCwgJGYxMCAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNyYWggJGYxNiwgJGYxNiwgJGYxMCAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMTAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNyYWggJGY0LCAkZjQsICRmMTAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFja3VzaGIgJGYyLCAkZjIsICRmMTQgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFja3VzaGIgJGY0LCAkZjQsICRmMTYgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAic2RjMSAkZjIsICUwICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAic2RjMSAkZjQsICUxICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICA6ICI9bSIoKmJsb2NrKSwiPW0iKCooYmxvY2sgKyA4KSkKLSAgICAgICAgICAgIDogInIiKHdlaWdodCksInIiKG9mZnNldCksInIiKGxvZzJfZGVub20pCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbYmxvY2swXSwgMHgwMCkKKyAgICAgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2Jsb2NrMV0sIDB4MDApCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3dlaWdodF0sICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVtvZmZzZXRdLCAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbbG9nMl9kZW5vbV0sICAgICAgICAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYmggICVbZnRtcDZdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXA3XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2Jsb2NrMF0sIDB4MDApCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtibG9jazFdLCAweDAwKQorICAgICAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSkKKyAgICAgICAgICAgIDogW2Jsb2NrMF0iciIoYmxvY2spLCAgICAgICAgICAgW2Jsb2NrMV0iciIoYmxvY2srOCksCisgICAgICAgICAgICAgIFt3ZWlnaHRdInIiKHdlaWdodCksICAgICAgICAgIFtvZmZzZXRdInIiKG9mZnNldCksCisgICAgICAgICAgICAgIFtsb2cyX2Rlbm9tXSJyIihsb2cyX2Rlbm9tKQorICAgICAgICAgICAgOiAibWVtb3J5IgogICAgICAgICApOwogICAgIH0KIH0KIAogdm9pZCBmZl9oMjY0X2Jpd2VpZ2h0X3BpeGVsczE2XzhfbW1pKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLAorICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LCBpbnQgbG9nMl9kZW5vbSwgaW50IHdlaWdodGQsIGludCB3ZWlnaHRzLAogICAgICAgICBpbnQgb2Zmc2V0KQogewogICAgIGludCB5OworICAgIGRvdWJsZSBmdG1wWzldOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OwogCiAgICAgb2Zmc2V0ID0gKChvZmZzZXQgKyAxKSB8IDEpIDw8IGxvZzJfZGVub207CiAKICAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7IHkrKywgZHN0Kz1zdHJpZGUsIHNyYys9c3RyaWRlKSB7CiAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAgICAgImxkYzEgJGYyLCAlMiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgImxkYzEgJGY0LCAlMyAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgImRtdGMxICQwLCAkZjIwICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgIm10YzEgJTYsICRmNiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgIm10YzEgJTcsICRmOCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgIm10YzEgJTgsICRmMTAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgIm10YzEgJTksICRmMTIgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzaHVmaCAkZjYsICRmNiwgJGYyMCAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzaHVmaCAkZjgsICRmOCwgJGYyMCAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzaHVmaCAkZjEwLCAkZjEwLCAkZjIwICAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2hiaCAkZjE0LCAkZjIsICRmMjAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2hiaCAkZjE2LCAkZjQsICRmMjAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyMCAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYyMCAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjE0LCAkZjE0LCAkZjYgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjE2LCAkZjE2LCAkZjggICAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjIsICRmMiwgJGY2ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjQsICRmNCwgJGY4ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjE0LCAkZjE0LCAkZjEwICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjIsICRmMiwgJGYxMCAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjE0LCAkZjE0LCAkZjE2ICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjIsICRmMiwgJGY0ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzcmFoICRmMTQsICRmMTQsICRmMTIgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjEyICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyLCAkZjE0ICAgICAgICBcclxuIgotICAgICAgICAgICAgInNkYzEgJGYyLCAlMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgImxkYzEgJGYyLCAlNCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgImxkYzEgJGY0LCAlNSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2hiaCAkZjE0LCAkZjIsICRmMjAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2hiaCAkZjE2LCAkZjQsICRmMjAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyMCAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYyMCAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjE0LCAkZjE0LCAkZjYgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjE2LCAkZjE2LCAkZjggICAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjIsICRmMiwgJGY2ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjQsICRmNCwgJGY4ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjE0LCAkZjE0LCAkZjEwICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjIsICRmMiwgJGYxMCAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjE0LCAkZjE0LCAkZjE2ICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjIsICRmMiwgJGY0ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzcmFoICRmMTQsICRmMTQsICRmMTIgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjEyICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyLCAkZjE0ICAgICAgICBcclxuIgotICAgICAgICAgICAgInNkYzEgJGYyLCAlMSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgOiAiPW0iKCpkc3QpLCI9bSIoKihkc3QrOCkpCi0gICAgICAgICAgICA6ICJtIigqc3JjKSwibSIoKmRzdCksIm0iKCooc3JjKzgpKSwibSIoKihkc3QrOCkpLAotICAgICAgICAgICAgICAiciIod2VpZ2h0cyksInIiKHdlaWdodGQpLCJyIihvZmZzZXQpLCJyIihsb2cyX2Rlbm9tKzEpCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbc3JjMF0sIDB4MDApCisgICAgICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtkc3QwXSwgMHgwMCkKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbd2VpZ2h0c10sICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3dlaWdodGRdLCAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVtvZmZzZXRdLCAgJVtmdG1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbbG9nMl9kZW5vbV0sICAgICAgICAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXA3XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wOF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtkc3QwXSwgMHgwMCkKKyAgICAgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW3NyYzFdLCAweDAwKQorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbZHN0MV0sIDB4MDApCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXA3XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wOF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtkc3QxXSwgMHgwMCkKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pCisgICAgICAgICAgICA6IFtkc3QwXSJyIihkc3QpLCAgICAgICAgICAgICAgIFtkc3QxXSJyIihkc3QrOCksCisgICAgICAgICAgICAgIFtzcmMwXSJyIihzcmMpLCAgICAgICAgICAgICAgIFtzcmMxXSJyIihzcmMrOCksCisgICAgICAgICAgICAgIFt3ZWlnaHRzXSJyIih3ZWlnaHRzKSwgICAgICAgIFt3ZWlnaHRkXSJyIih3ZWlnaHRkKSwKKyAgICAgICAgICAgICAgW29mZnNldF0iciIob2Zmc2V0KSwgICAgICAgICAgW2xvZzJfZGVub21dInIiKGxvZzJfZGVub20rMSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKICAgICAgICAgKTsKICAgICB9CiB9CiAKLXZvaWQgZmZfaDI2NF93ZWlnaHRfcGl4ZWxzOF84X21taSh1aW50OF90ICpibG9jaywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKK3ZvaWQgZmZfaDI2NF93ZWlnaHRfcGl4ZWxzOF84X21taSh1aW50OF90ICpibG9jaywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwKICAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpCiB7CiAgICAgaW50IHk7CisgICAgZG91YmxlIGZ0bXBbNl07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CiAKICAgICBvZmZzZXQgPDw9IGxvZzJfZGVub207CiAKQEAgLTExNTAsNzYgKzEyNzYsOTMgQEAKIAogICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrLCBibG9jays9c3RyaWRlKSB7CiAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAgICAgImxkYzEgJGYyLCAlMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgIm10YzEgJTEsICRmNiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgIm10YzEgJTIsICRmOCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgIm10YzEgJTMsICRmMTAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgImRtdGMxICQwLCAkZjIwICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzaHVmaCAkZjYsICRmNiwgJGYyMCAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzaHVmaCAkZjgsICRmOCwgJGYyMCAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2hiaCAkZjE0LCAkZjIsICRmMjAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2xiaCAkZjIsICRmMiwgJGYyMCAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjE0LCAkZjE0LCAkZjYgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBtdWxsaCAkZjIsICRmMiwgJGY2ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjE0LCAkZjE0LCAkZjggICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjIsICRmMiwgJGY4ICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzcmFoICRmMTQsICRmMTQsICRmMTAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBzcmFoICRmMiwgJGYyLCAkZjEwICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInBhY2t1c2hiICRmMiwgJGYyLCAkZjE0ICAgICAgICBcclxuIgotICAgICAgICAgICAgInNkYzEgJGYyLCAlMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgOiAiPW0iKCpibG9jaykKLSAgICAgICAgICAgIDogInIiKHdlaWdodCksInIiKG9mZnNldCksInIiKGxvZzJfZGVub20pCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICAgICAgIm10YzEgICAgICAgJVt3ZWlnaHRdLCAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbb2Zmc2V0XSwgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW2xvZzJfZGVub21dLCAgICAgICAgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNraGJoICAlW2Z0bXA0XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSkKKyAgICAgICAgICAgIDogW2Jsb2NrXSJyIihibG9jayksICAgICAgICAgICAgW3dlaWdodF0iciIod2VpZ2h0KSwKKyAgICAgICAgICAgICAgW29mZnNldF0iciIob2Zmc2V0KSwgICAgICAgICAgW2xvZzJfZGVub21dInIiKGxvZzJfZGVub20pCisgICAgICAgICAgICA6ICJtZW1vcnkiCiAgICAgICAgICk7CiAgICAgfQogfQogCiB2b2lkIGZmX2gyNjRfYml3ZWlnaHRfcGl4ZWxzOF84X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywKICAgICAgICAgaW50IG9mZnNldCkKIHsKICAgICBpbnQgeTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKIAogICAgIG9mZnNldCA9ICgob2Zmc2V0ICsgMSkgfCAxKSA8PCBsb2cyX2Rlbm9tOwogCiAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyssIGRzdCs9c3RyaWRlLCBzcmMrPXN0cmlkZSkgewogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgICAgICJsZGMxICRmMiwgJTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJsZGMxICRmNCwgJTIgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJkbXRjMSAkMCwgJGYyMCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtdGMxICUzLCAkZjYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtdGMxICU0LCAkZjggICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtdGMxICU1LCAkZjEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtdGMxICU2LCAkZjEyICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc2h1ZmggJGY2LCAkZjYsICRmMjAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc2h1ZmggJGY4LCAkZjgsICRmMjAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc2h1ZmggJGYxMCwgJGYxMCwgJGYyMCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwdW5wY2toYmggJGYxNCwgJGYyLCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwdW5wY2toYmggJGYxNiwgJGY0LCAkZjIwICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMjAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmMjAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwbXVsbGggJGYxNCwgJGYxNCwgJGY2ICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwbXVsbGggJGYxNiwgJGYxNiwgJGY4ICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwbXVsbGggJGYyLCAkZjIsICRmNiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwbXVsbGggJGY0LCAkZjQsICRmOCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWRkc2ggJGYxNCwgJGYxNCwgJGYxMCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWRkc2ggJGYyLCAkZjIsICRmMTAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWRkc2ggJGYxNCwgJGYxNCwgJGYxNiAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWRkc2ggJGYyLCAkZjIsICRmNCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc3JhaCAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc3JhaCAkZjIsICRmMiwgJGYxMiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWNrdXNoYiAkZjIsICRmMiwgJGYxNCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJzZGMxICRmMiwgJTAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgIDogIj1tIigqZHN0KQotICAgICAgICAgICAgOiAibSIoKnNyYyksIm0iKCpkc3QpLCJyIih3ZWlnaHRzKSwKLSAgICAgICAgICAgICAgInIiKHdlaWdodGQpLCJyIihvZmZzZXQpLCJyIihsb2cyX2Rlbm9tKzEpCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3dlaWdodHNdLCAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVt3ZWlnaHRkXSwgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbb2Zmc2V0XSwgICVbZnRtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW2xvZzJfZGVub21dLCAgICAgICAgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wN10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toYmggICVbZnRtcDhdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pCisgICAgICAgICAgICA6IFtkc3RdInIiKGRzdCksICAgICAgICAgICAgICAgIFtzcmNdInIiKHNyYyksCisgICAgICAgICAgICAgIFt3ZWlnaHRzXSJyIih3ZWlnaHRzKSwgICAgICAgIFt3ZWlnaHRkXSJyIih3ZWlnaHRkKSwKKyAgICAgICAgICAgICAgW29mZnNldF0iciIob2Zmc2V0KSwgICAgICAgICAgW2xvZzJfZGVub21dInIiKGxvZzJfZGVub20rMSkKKyAgICAgICAgICAgIDogIm1lbW9yeSIKICAgICAgICAgKTsKICAgICB9CiB9CiAKLXZvaWQgZmZfaDI2NF93ZWlnaHRfcGl4ZWxzNF84X21taSh1aW50OF90ICpibG9jaywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKK3ZvaWQgZmZfaDI2NF93ZWlnaHRfcGl4ZWxzNF84X21taSh1aW50OF90ICpibG9jaywgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwKICAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHQsIGludCBvZmZzZXQpCiB7CiAgICAgaW50IHk7CisgICAgZG91YmxlIGZ0bXBbNV07CisgICAgREVDTEFSRV9WQVJfTE9XMzI7CiAKICAgICBvZmZzZXQgPDw9IGxvZzJfZGVub207CiAKQEAgLTEyMjgsNzQ1ICsxMzcxLDg2MCBAQAogCiAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyssIGJsb2NrKz1zdHJpZGUpIHsKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICAgICAibHdjMSAkZjIsICUwICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibXRjMSAlMSwgJGY2ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibXRjMSAlMiwgJGY4ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibXRjMSAlMywgJGYxMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAiZG10YzEgJDAsICRmMjAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNodWZoICRmNiwgJGY2LCAkZjIwICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNodWZoICRmOCwgJGY4LCAkZjIwICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjIwICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFkZHNoICRmMiwgJGYyLCAkZjggICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMTAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFja3VzaGIgJGYyLCAkZjIsICRmMjAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAic3djMSAkZjIsICUwICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICA6ICI9bSIoKmJsb2NrKQotICAgICAgICAgICAgOiAiciIod2VpZ2h0KSwiciIob2Zmc2V0KSwiciIobG9nMl9kZW5vbSkKKyAgICAgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICAgICAgIm10YzEgICAgICAgJVt3ZWlnaHRdLCAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbb2Zmc2V0XSwgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW2xvZzJfZGVub21dLCAgICAgICAgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSkKKyAgICAgICAgICAgIDogW2Jsb2NrXSJyIihibG9jayksICAgICAgICAgICAgW3dlaWdodF0iciIod2VpZ2h0KSwKKyAgICAgICAgICAgICAgW29mZnNldF0iciIob2Zmc2V0KSwgICAgICAgICAgW2xvZzJfZGVub21dInIiKGxvZzJfZGVub20pCisgICAgICAgICAgICA6ICJtZW1vcnkiCiAgICAgICAgICk7CiAgICAgfQogfQogCiB2b2lkIGZmX2gyNjRfYml3ZWlnaHRfcGl4ZWxzNF84X21taSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCBpbnQgd2VpZ2h0cywKICAgICAgICAgaW50IG9mZnNldCkKIHsKICAgICBpbnQgeTsKKyAgICBkb3VibGUgZnRtcFs3XTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKIAogICAgIG9mZnNldCA9ICgob2Zmc2V0ICsgMSkgfCAxKSA8PCBsb2cyX2Rlbm9tOwogCiAgICAgZm9yICh5PTA7IHk8aGVpZ2h0OyB5KyssIGRzdCs9c3RyaWRlLCBzcmMrPXN0cmlkZSkgewogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgICAgICJsd2MxICRmMiwgJTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJsd2MxICRmNCwgJTIgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJkbXRjMSAkMCwgJGYyMCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtdGMxICUzLCAkZjYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtdGMxICU0LCAkZjggICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtdGMxICU1LCAkZjEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtdGMxICU2LCAkZjEyICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc2h1ZmggJGY2LCAkZjYsICRmMjAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc2h1ZmggJGY4LCAkZjgsICRmMjAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc2h1ZmggJGYxMCwgJGYxMCwgJGYyMCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMjAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmMjAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwbXVsbGggJGYyLCAkZjIsICRmNiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwbXVsbGggJGY0LCAkZjQsICRmOCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWRkc2ggJGYyLCAkZjIsICRmMTAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWRkc2ggJGYyLCAkZjIsICRmNCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwc3JhaCAkZjIsICRmMiwgJGYxMiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWNrdXNoYiAkZjIsICRmMiwgJGYyMCAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJzd2MxICRmMiwgJTAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgIDogIj1tIigqZHN0KQotICAgICAgICAgICAgOiAibSIoKnNyYyksIm0iKCpkc3QpLCJyIih3ZWlnaHRzKSwKLSAgICAgICAgICAgICAgInIiKHdlaWdodGQpLCJyIihvZmZzZXQpLCJyIihsb2cyX2Rlbm9tKzEpCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbd2VpZ2h0XSwgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3dlaWdodGRdLCAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVtvZmZzZXRdLCAgJVtmdG1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbbG9nMl9kZW5vbV0sICAgICAgICAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNodWZoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSkKKyAgICAgICAgICAgIDogW2RzdF0iciIoZHN0KSwgICAgICAgICAgICAgICAgW3NyY10iciIoc3JjKSwKKyAgICAgICAgICAgICAgW3dlaWdodF0iciIod2VpZ2h0cyksICAgICAgICAgW3dlaWdodGRdInIiKHdlaWdodGQpLAorICAgICAgICAgICAgICBbb2Zmc2V0XSJyIihvZmZzZXQpLCAgICAgICAgICBbbG9nMl9kZW5vbV0iciIobG9nMl9kZW5vbSsxKQorICAgICAgICAgICAgOiAibWVtb3J5IgogICAgICAgICApOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaW5saW5lIGNocm9tYV9pbnRlcl9ib2R5X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsCi0gICAgICAgIGludCBhbHBoYSwgaW50IGJldGEsIGludDhfdCAqdGMwKQotewotICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAieG9yICRmMTYsICRmMTYsICRmMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibXRjMSAlW2FscGhhXSwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibXRjMSAlW2JldGFdLCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmOCwgJGY4LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmMTAsICRmMTAsICRmMTYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGY4LCAkZjgsICRmOCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYxMCwgJGYxMCwgJGYxMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjEyLCAkZjQsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjE0LCAkZjIsICRmNCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJGYxNCwgJGYxNCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjE0LCAkZjE0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjEyLCAkZjIsICRmMCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjgsICRmMCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjgsICRmOCwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJGYxNCwgJGYxNCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjEyLCAkZjQsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjgsICRmNiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjgsICRmOCwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJGYxNCwgJGYxNCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMTIsICRmMTIsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGNtcGVxYiAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjEyLCAweDAoJVt0YzBdKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmMTIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYW5kICRmMTQsICRmMTQsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGNtcGVxYiAkZjgsICRmOCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMTAsICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmNiwgJGY2LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYW5kICRmMTAsICRmMTAsICVbZmZfcGJfMV0gICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmOCwgJGY4LCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGY2LCAkZjYsICVbZmZfcGJfM10gICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGY4LCAkZjgsICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGY2LCAkZjYsICRmMTAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHVzYiAkZjYsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjEyLCAlW2ZmX3BiX0ExXSwgJGY2ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjYsICRmNiwgJVtmZl9wYl9BMV0gICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG1pbnViICRmMTIsICRmMTIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG1pbnViICRmNiwgJGY2LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjIsICRmMiwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnVzYiAkZjQsICRmNCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHVzYiAkZjIsICRmMiwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHVzYiAkZjQsICRmNCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltwaXhdInIiKHBpeCksW3N0cmlkZV0iciIoKGludDY0X3Qpc3RyaWRlKSwKLSAgICAgICAgICBbYWxwaGFdInIiKChpbnQ2NF90KWFscGhhKSxbYmV0YV0iciIoKGludDY0X3QpYmV0YSksW3RjMF0iciIodGMwKSwKLSAgICAgICAgICBbZmZfcGJfMV0iZiIoZmZfcGJfMSksW2ZmX3BiXzNdImYiKGZmX3BiXzMpLFtmZl9wYl9BMV0iZiIoZmZfcGJfQTEpCi0gICAgICAgIDogIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsIiRmMTAiLCIkZjEyIiwiJGYxNCIsIiRmMTYiCi0gICAgKTsKLX0KLQotc3RhdGljIHZvaWQgaW5saW5lIGNocm9tYV9pbnRyYV9ib2R5X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsCi0gICAgICAgIGludCBhbHBoYSwgaW50IGJldGEpCi17Ci0gICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ4b3IgJGYxNiwgJGYxNiwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtdGMxICVbYWxwaGFdLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtdGMxICVbYmV0YV0sICRmMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGY4LCAkZjgsICRmMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYxMCwgJGYxMCwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjgsICRmOCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjEwLCAkZjEwLCAkZjEwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmNCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMTQsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmMiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmNCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmMTQsICRmMTQsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjEwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjEyLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjIsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY4LCAkZjgsICVbZmZfcGJfMV0gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjIsICRmMiwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMiwgJGYyLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjIsICRmMiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjQsICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY4LCAkZjgsICVbZmZfcGJfMV0gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjQsICRmNCwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmNCwgJGY0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjQsICRmNCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjIsICRmMiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjQsICRmNCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYyLCAkZjIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY0LCAkZjQsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjIsICRmMiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjQsICRmNCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3BpeF0iciIocGl4KSxbc3RyaWRlXSJyIigoaW50NjRfdClzdHJpZGUpLAotICAgICAgICAgIFthbHBoYV0iciIoKGludDY0X3QpYWxwaGEpLFtiZXRhXSJyIigoaW50NjRfdCliZXRhKSwKLSAgICAgICAgICBbZmZfcGJfMV0iZiIoZmZfcGJfMSkKLSAgICAgICAgOiAiJGYwIiwiJGYyIiwiJGY0IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIKLSAgICApOwotfQotCiB2b2lkIGZmX2RlYmxvY2tfdjhfbHVtYV84X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCiAgICAgICAgIGludDhfdCAqdGMwKQogeworICAgIGRvdWJsZSBmdG1wWzEyXTsKKyAgICBtaXBzX3JlZyBhZGRyWzJdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkYWRkdSAkOCwgJVtzdHJpZGVdLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxNiwgJGYxNiwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOSwgJVtzdHJpZGVdLCAkOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVthbHBoYV0sICVbYWxwaGFdLCAtMHgxICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkc3VidSAkOSwgJDAsICQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVtiZXRhXSwgJVtiZXRhXSwgLTB4MSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOSwgJDksICVbcGl4XSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMHgwKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMCwgMHgwKCQ5LCAlW3N0cmlkZV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMiwgMHgwKCQ5LCAkOCkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmNiwgMHgwKCVbcGl4XSwgJVtzdHJpZGVdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtdGMxICVbYWxwaGFdLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtdGMxICVbYmV0YV0sICRmMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGY4LCAkZjgsICRmMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYxMCwgJGYxMCwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjgsICRmOCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjEwLCAkZjEwLCAkZjEwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmNCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmMiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMTQsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmNCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmMTQsICRmMTQsICRmMTYgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmNiwgJGY2LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmOCwgMHgzKCVbdGMwXSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmOCwgMHgwKCVbdGMwXSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxOCwgJGY4LCAkZjggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZ3RiICRmOCwgJGYxOCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNiwgMHgwKCQ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYyMCwgJGY4LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmNiwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmMiwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMTQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmMTIsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmMTIsICRmMTIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJGYyMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY4LCAkZjIwLCAkZjE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjE0LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjIsIDB4MCgkOSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjYsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY4LCAkZjgsICVbZmZfcGJfMV0gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmNiwgJGY2LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGYwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmMTIsICRmMTIsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbWF4dWIgJGY2LCAkZjYsICRmOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbWludWIgJGY2LCAkZjYsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmNiwgMHgwKCQ5LCAlW3N0cmlkZV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmOCwgMHgwKCVbcGl4XSwgJDgpICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmNiwgJGY4LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmNCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmNiwgJGY2LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmMTIsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmMTIsICRmMTIsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJGYyMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMCwgJGYxOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmNiwgMHgwKCVbcGl4XSwgJVtzdHJpZGVdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjIsICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMjIsIDB4MCglW3BpeF0sICQ4KSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGYyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmNiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmMTAsICRmMTAsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbWF4dWIgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbWludWIgJGY4LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmOCwgMHgwKCVbcGl4XSwgJVtzdHJpZGVdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYyLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmOCwgJGY4LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMCwgJGYxMCwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY2LCAkZjYsICRmOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjYsICRmNiwgJVtmZl9wYl8zXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmOCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjYsICRmNiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmNiwgJGY2LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICVbZmZfcGJfQTFdLCAkZjYgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmNiwgJGY2LCAlW2ZmX3BiX0ExXSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbWludWIgJGYxMiwgJGYxMiwgJGYxNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbWludWIgJGY2LCAkZjYsICRmMTQgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMiwgJGYyLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNiICRmNCwgJGY0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmMiwgMHgwKCQ5LCAkOCkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHgwKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3BpeF0iciIocGl4KSxbc3RyaWRlXSJyIigoaW50NjRfdClzdHJpZGUpLAotICAgICAgICAgIFthbHBoYV0iciIoKGludDY0X3QpYWxwaGEpLFtiZXRhXSJyIigoaW50NjRfdCliZXRhKSxbdGMwXSJyIih0YzApLAotICAgICAgICAgIFtmZl9wYl8xXSJmIihmZl9wYl8xKSxbZmZfcGJfM10iZiIoZmZfcGJfMyksW2ZmX3BiX0ExXSJmIihmZl9wYl9BMSkKLSAgICAgICAgOiAiJDgiLCIkOSIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsIiRmMTAiLCIkZjEyIiwiJGYxNCIsIiRmMTYiLAotICAgICAgICAgICIkZjE4IiwiJGYyMCIsIiRmMjIiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3RyaWRlXSwgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtzdHJpZGVdLCAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpICAgICAgICVbYWxwaGFdLCAgICVbYWxwaGFdLCAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU1VCVSAgICIlW2FkZHIxXSwgICAkMCwgICAgICAgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGkgICAgICAgJVtiZXRhXSwgICAgJVtiZXRhXSwgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbYWRkcjFdLCAgICAgICAlW3BpeF0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtwaXhdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wMV0sICVbYWRkcjFdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXAyXSwgJVthZGRyMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wNF0sICVbcGl4XSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICAibXRjMSAgICAgICAlW2FscGhhXSwgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVtiZXRhXSwgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wOF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDVdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wN10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNV0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFiICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxYiAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDVdLCAlW3RjMF0sIDB4MDApCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA5XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGIgICAgJVtmdG1wNV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wMTBdLCAgJVtmdG1wNV0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDhdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxYiAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDEwXSwgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxMV0sICVbYWRkcjFdLCAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDExXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2ZmX3BiXzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHViICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtaW51YiAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA0XSwgJVthZGRyMV0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDVdLCAlW3BpeF0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA0XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wN10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWIgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXA0XSwgJVtwaXhdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDddLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERYQzEoJVtmdG1wMTFdLCAlW3BpeF0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDExXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2ZmX3BiXzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wN10sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1heHViICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtaW51YiAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA1XSwgJVtwaXhdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcGJfMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3BiXzNdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2ZmX3BiX0ExXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcGJfQTFdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWludWIgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1pbnViICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAyXSwgJVthZGRyMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJVtwaXhdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbZnRtcDEwXSI9JmYiKGZ0bXBbMTBdKSwgICAgICAgICAgW2Z0bXAxMV0iPSZmIihmdG1wWzExXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKQorICAgICAgICA6IFtwaXhdInIiKHBpeCksICAgICAgICAgICAgICAgICAgICBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSwKKyAgICAgICAgICBbYWxwaGFdInIiKChtaXBzX3JlZylhbHBoYSksICAgICAgW2JldGFdInIiKChtaXBzX3JlZyliZXRhKSwKKyAgICAgICAgICBbdGMwXSJyIih0YzApLCAgICAgICAgICAgICAgICAgICAgW2ZmX3BiXzFdImYiKGZmX3BiXzEpLAorICAgICAgICAgIFtmZl9wYl8zXSJmIihmZl9wYl8zKSwgICAgICAgICAgICBbZmZfcGJfQTFdImYiKGZmX3BiX0ExKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAotdm9pZCBmZl9kZWJsb2NrX3Y4X2x1bWFfaW50cmFfOF9tbWkodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCitzdGF0aWMgdm9pZCBkZWJsb2NrX3Y4X2x1bWFfaW50cmFfOF9tbWkodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCiAgICAgICAgIGludCBiZXRhKQogewotICAgIHVpbnQ2NF90IHN0YWNrWzB4YV07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBzdGFja1sweDBhXSk7CisgICAgZG91YmxlIGZ0bXBbMTZdOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKyAgICBtaXBzX3JlZyBhZGRyWzNdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJvcmkgJDgsICQwLCAweDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYzMCwgJGYzMCwgJGYzMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOCwgJGYxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkc2xsICQ4LCAlW3N0cmlkZV0sIDIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTAsICVbc3RyaWRlXSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVthbHBoYV0sICVbYWxwaGFdLCAtMHgxICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkc2xsICRmMjAsICRmMTYsICRmMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibHR6ICVbYWxwaGFdLCAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOSwgJDEwLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVtiZXRhXSwgJVtiZXRhXSwgLTB4MSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibHR6ICVbYmV0YV0sIDFmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkc3VidSAkOCwgJDAsICQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDgsICVbcGl4XSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMHgwKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMCwgMHgwKCQ4LCAkMTApICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMiwgMHgwKCQ4LCAkOSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmNiwgMHgwKCVbcGl4XSwgJVtzdHJpZGVdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtdGMxICVbYWxwaGFdLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtdGMxICVbYmV0YV0sICRmMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGY4LCAkZjgsICRmMzAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYxMCwgJGYxMCwgJGYzMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjgsICRmOCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmNCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjEwLCAkZjEwLCAkZjEwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmOCwgMHgxMCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMTQsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmMiwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmNCwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjE0LCAkZjE0LCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmOCwgMHgxMCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmMTQsICRmMTQsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTQsIDB4MjArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmOCwgJGYzMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmNCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmOCwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMTQsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTIsICRmMTIsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjgsIDB4MjArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmMTIsICRmMTIsICRmMTQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJGYyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMjgsIDB4MCgkOCwgJVtzdHJpZGVdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMjgsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGYyLCAkZjI4ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMTQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmOCwgJGY4LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMjYsIDB4MCglW3BpeF0sICQxMCkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmOCwgMHgzMCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMjYsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY0LCAkZjI2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmMTQsICRmMTQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNiICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFiICRmOCwgJGY4LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmOCwgMHg0MCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmMjgsICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjIsICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmOCwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDB4MTArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjI4LCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjE0LCAkZjIsICRmNCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjEyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTIsIDB4MCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjEyLCAkZjEyLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjEyLCAkZjMwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjI4LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEyLCAkZjI4LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjE0LCAkZjE0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEwLCAkZjEwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjQsIDB4MTArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjEwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjE0LCAkZjE0LCAkZjIwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjEwLCAkZjI0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjE0LCAkZjE0LCAkZjMwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxNCwgJGYxNCwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxNCwgJGYxNCwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEwLCAkZjEwLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxNCwgJGYyLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjIsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxNCwgJGYxNCwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEyLCAkZjEyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjQsIDB4MzArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjIsIDB4MjArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMCwgJGYxMCwgJGYyNCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJGYyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmMTAsIDB4MCgkOCwgJDkpICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMTAsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjI4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjEwLCAkZjI4ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjIsIDB4MCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjEwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjEyLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjEyLCAkZjIyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjEyLCAkZjEyLCAkZjIwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjEyLCAkZjMwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjIsIDB4MzArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEwLCAkZjEwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY4LCAkZjgsICRmMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMCwgJGYxMCwgJGYyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYyOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmOCwgMHgwKCQ4LCAkMTApICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmMTAsIDB4MCgkOCwgJVtzdHJpZGVdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmMjYsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjQsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjgsICRmOCwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDB4MTArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjI2LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjE0LCAkZjQsICRmMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjEyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTIsIDB4MCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjEyLCAkZjEyLCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjEyLCAkZjMwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjI2LCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjE0LCAkZjE0LCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEyLCAkZjI2LCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjE0LCAkZjE0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEwLCAkZjEwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjIsIDB4MTArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjEwLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjEwLCAkZjIyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjE0LCAkZjE0LCAkZjIwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjE0LCAkZjE0LCAkZjMwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxNCwgJGYxNCwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxNCwgJGYxNCwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEwLCAkZjEwLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxNCwgJGY0LCAkZjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjQsICRmMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxNCwgJGYxNCwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjIsIDB4NDArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEyLCAkZjEyLCAkZjE0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjQsIDB4MjArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjEyLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMCwgJGYxMCwgJGYyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJGYyNCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDB4MCglW3BpeF0pICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMTAsIDB4MCglW3BpeF0sICQ5KSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjI2LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjEwLCAkZjI2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjIsIDB4MCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEwLCAkZjEwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjEyLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkYiAkZjEyLCAkZjEyLCAkZjIyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjEyLCAkZjEyLCAkZjIwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjEyLCAkZjMwICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGYxMCAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMiwgJGYxMiwgJVtmZl9wYl8xXSAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjIsIDB4NDArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViYiAkZjEwLCAkZjEwLCAkZjEyICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYyNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGY4LCAkZjgsICRmMjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJhbmQgJGYxMCwgJGYxMCwgJGYyMiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYyNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmOCwgMHgwKCVbcGl4XSwgJVtzdHJpZGVdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmMTAsIDB4MCglW3BpeF0sICQxMCkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3BpeF0iciIocGl4KSxbc3RyaWRlXSJyIigoaW50NjRfdClzdHJpZGUpLAotICAgICAgICAgIFthbHBoYV0iciIoKGludDY0X3QpYWxwaGEpLFtiZXRhXSJyIigoaW50NjRfdCliZXRhKSwKLSAgICAgICAgICBbc3RhY2tdIm0iKHN0YWNrWzBdKSxbZmZfcGJfMV0iZiIoZmZfcGJfMSkKLSAgICAgICAgOiAiJDgiLCIkOSIsIiQxMCIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsIiRmMTAiLCIkZjEyIiwiJGYxNCIsCi0gICAgICAgICAgIiRmMTYiLCIkZjE4IiwiJGYyMCIsIiRmMjIiLCIkZjI0IiwiJGYyNiIsIiRmMjgiLCIkZjMwIgorICAgICAgICAib3JpICAgICAgICAlW3RtcDBdLCAgICAkMCwgICAgICAgICAgICAgMHgwMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU0xMICAgICIlW2FkZHIwXSwgICAlW3N0cmlkZV0sICAgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVtzdHJpZGVdLCAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWxwaGFdLCAgICVbYWxwaGFdLCAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU0xMICAgICIlW2Z0bXAxMV0sICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJsdHogICAgICAgJVthbHBoYV0sICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbYWRkcjJdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW2JldGFdLCAgICAlW2JldGFdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJsdHogICAgICAgJVtiZXRhXSwgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9TVUJVICAgIiVbYWRkcjBdLCAgICQwLCAgICAgICAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtwaXhdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbcGl4XSwgMHgwMCkKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDFdLCAlW2FkZHIwXSwgJVthZGRyMl0sIDB4MDApCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXAyXSwgJVthZGRyMF0sICVbYWRkcjFdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wNF0sICVbcGl4XSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICAibXRjMSAgICAgICAlW2FscGhhXSwgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVtiZXRhXSwgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA4XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA1XSwgJVtzdGFja10sIDB4MTApCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAlW3N0YWNrXSwgMHgxMCkKKyAgICAgICAgInBjbXBlcWIgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZGMxICAgICAgICVbZnRtcDEwXSwgICVbZmZfcGJfMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA4XSwgJVtzdGFja10sIDB4MjApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA4XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDE1XSwgJVtzdGFja10sIDB4MjApCisgICAgICAgICJwY21wZXFiICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDE1XSwgJVthZGRyMF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wOF0sICAgJVtmdG1wMTVdLCAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxNV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFiICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDE0XSwgJVtwaXhdLCAlW2FkZHIyXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNV0sICVbc3RhY2tdLCAweDMwKQorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA4XSwgICAlW2Z0bXAxNF0sICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNV0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDE0XSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWIgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA1XSwgJVtzdGFja10sIDB4NDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDVdLCAgICVbZnRtcDE1XSwgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3N0YWNrXSwgMHgxMCkKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wN10sICAgJVtmdG1wMTVdLCAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDhdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wOF0sICAgJVtmdG1wN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDddLCAlW3N0YWNrXSwgMHgwMCkKKyAgICAgICAgInBzcmxoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAxNV0sICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICAgICAgJVtmdG1wN10sICAgJVtmdG1wMTVdLCAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxM10sICVbc3RhY2tdLCAweDEwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxoICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDExXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxM10gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDddLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDEzXSwgJVtzdGFja10sIDB4MzApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxMl0sICVbc3RhY2tdLCAweDIwKQorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxM10gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTJdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICAicGFkZGIgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXAxNV0sICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDE1XSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDEyXSwgJVtzdGFja10sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDEyXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxMl0sICVbc3RhY2tdLCAweDMwKQorICAgICAgICAicHN1YmIgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxNV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMTJdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEyXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMTVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDVdLCAlW2FkZHIwXSwgJVthZGRyMl0sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA2XSwgJVthZGRyMF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNV0sICAgJVtmdG1wMTRdLCAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbc3RhY2tdLCAweDEwKQorICAgICAgICAicGFkZGIgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXAxNF0sICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wOF0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wN10sICVbc3RhY2tdLCAweDAwKQorICAgICAgICAicHNybGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDE0XSwgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICAgICAgJVtmdG1wN10sICAgJVtmdG1wMTRdLCAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDEyXSwgJVtzdGFja10sIDB4MTApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMTJdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxoICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDExXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wN10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxMl0sICVbc3RhY2tdLCAweDQwKQorICAgICAgICAicHN1YmIgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMTNdLCAlW3N0YWNrXSwgMHgyMCkKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEyXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxM10gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3BpeF0sIDB4MDApCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXA2XSwgJVtwaXhdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wN10sICAgJVtmdG1wMTRdLCAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxNF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxMl0sICVbc3RhY2tdLCAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMl0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMTJdLCAlW3N0YWNrXSwgMHg0MCkKKyAgICAgICAgInBzdWJiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMTRdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDEyXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxMl0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDE0XSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA1XSwgJVtwaXhdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA2XSwgJVtwaXhdLCAlW2FkZHIyXSwgMHgwMCkKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLCAgICAgICAgICBbZnRtcDExXSI9JmYiKGZ0bXBbMTFdKSwKKyAgICAgICAgICBbZnRtcDEyXSI9JmYiKGZ0bXBbMTJdKSwgICAgICAgICAgW2Z0bXAxM10iPSZmIihmdG1wWzEzXSksCisgICAgICAgICAgW2Z0bXAxNF0iPSZmIihmdG1wWzE0XSksICAgICAgICAgIFtmdG1wMTVdIj0mZiIoZnRtcFsxNV0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKSwKKyAgICAgICAgICBbYWRkcjJdIj0mciIoYWRkclsyXSksCisgICAgICAgICAgW2FscGhhXSIrJnIiKGFscGhhKSwgICAgICAgICAgICAgIFtiZXRhXSIrJnIiKGJldGEpCisgICAgICAgIDogW3BpeF0iciIocGl4KSwgICAgICAgICAgICAgICAgICAgIFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLAorICAgICAgICAgIFtzdGFja10iciIoc3RhY2spLCAgICAgICAgICAgICAgICBbZmZfcGJfMV0ibSIoZmZfcGJfMSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKLXZvaWQgZmZfZGVibG9ja192X2Nocm9tYV84X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCi0gICAgICAgIGludDhfdCAqdGMwKQordm9pZCBmZl9kZWJsb2NrX3ZfY2hyb21hXzhfbW1pKHVpbnQ4X3QgKnBpeCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGFscGhhLAorICAgICAgICBpbnQgYmV0YSwgaW50OF90ICp0YzApCiB7Ci0gICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkYWRkaXUgJVthbHBoYV0sICVbYWxwaGFdLCAtMHgxICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVtiZXRhXSwgJVtiZXRhXSwgLTB4MSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkMTYsICQwLCAlW3BpeF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkc3VidSAkMTYsICQxNiwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkc3VidSAkMTYsICQxNiwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMCwgMHgwKCQxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMiwgMHgwKCQxNiwgJVtzdHJpZGVdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMHgwKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmNiwgMHgwKCVbcGl4XSwgJVtzdHJpZGVdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW3BpeF0iK3IiKHBpeCksW3N0cmlkZV0iK3IiKHN0cmlkZSksW2FscGhhXSIrciIoYWxwaGEpLAotICAgICAgICAgIFtiZXRhXSIrciIoYmV0YSkKLSAgICAgICAgOiBbdGMwXSJyIih0YzApCi0gICAgICAgIDogIiQxNiIsIiRmMiIsIiRmNCIKLSAgICApOwotCi0gICAgY2hyb21hX2ludGVyX2JvZHlfbW1pKHBpeCwgc3RyaWRlLCBhbHBoYSwgYmV0YSwgdGMwKTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJnc3NkeGMxICRmMiwgMHgwKCQxNiwgJVtzdHJpZGVdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHgwKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3BpeF0iciIocGl4KSxbc3RyaWRlXSJyIigoaW50NjRfdClzdHJpZGUpCi0gICAgICAgIDogIiQxNiIsIiRmMiIsIiRmNCIKKyAgICAgICAgImFkZGkgICAgICAgJVthbHBoYV0sICAgJVthbHBoYV0sICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpICAgICAgICVbYmV0YV0sICAgICVbYmV0YV0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2FkZHIwXSwgICAkMCwgICAgICAgICAgICAgJVtwaXhdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NVQlUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9TVUJVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXAyXSwgJVthZGRyMF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbcGl4XSwgMHgwMCkKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDRdLCAlW3BpeF0sICVbc3RyaWRlXSwgMHgwMCkKKworICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVthbHBoYV0sICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbYmV0YV0sICAgICVbZnRtcDZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wN10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDhdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wN10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDVdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWIgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA3XSwgJVt0YzBdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFiICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3BiXzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3BiXzNdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2ZmX3BiX0ExXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcGJfQTFdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWludWIgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1pbnViICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJVtwaXhdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKQorICAgICAgICA6IFtwaXhdInIiKHBpeCksICAgICAgICAgICAgICAgICAgICBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSwKKyAgICAgICAgICBbYWxwaGFdInIiKGFscGhhKSwgICAgICAgICAgICAgICAgW2JldGFdInIiKGJldGEpLAorICAgICAgICAgIFt0YzBdInIiKHRjMCksICAgICAgICAgICAgICAgICAgICBbZmZfcGJfMV0iZiIoZmZfcGJfMSksCisgICAgICAgICAgW2ZmX3BiXzNdImYiKGZmX3BiXzMpLCAgICAgICAgICAgIFtmZl9wYl9BMV0iZiIoZmZfcGJfQTEpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCiB2b2lkIGZmX2RlYmxvY2tfdl9jaHJvbWFfaW50cmFfOF9tbWkodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCiAgICAgICAgIGludCBiZXRhKQogewotICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZGFkZGl1ICVbYWxwaGFdLCAlW2FscGhhXSwgLTB4MSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICVbYmV0YV0sICVbYmV0YV0sIC0weDEgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDE2LCAkMCwgJVtwaXhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHN1YnUgJDE2LCAkMTYsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHN1YnUgJDE2LCAkMTYsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjAsIDB4MCgkMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHhjMSAkZjIsIDB4MCgkMTYsICVbc3RyaWRlXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDB4MCglW3BpeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHhjMSAkZjYsIDB4MCglW3BpeF0sICVbc3RyaWRlXSkgICAgICAgICAgICBcclxuIgotICAgICAgICA6IFtwaXhdIityIihwaXgpLFtzdHJpZGVdIityIihzdHJpZGUpLFthbHBoYV0iK3IiKGFscGhhKSwKLSAgICAgICAgICBbYmV0YV0iK3IiKGJldGEpCi0gICAgICAgIDo6IiQxNiIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIKLSAgICApOwotCi0gICAgY2hyb21hX2ludHJhX2JvZHlfbW1pKHBpeCwgc3RyaWRlLCBhbHBoYSwgYmV0YSk7CisgICAgZG91YmxlIGZ0bXBbOV07CisgICAgbWlwc19yZWcgYWRkclsxXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZ3NzZHhjMSAkZjIsIDB4MCgkMTYsICVbc3RyaWRlXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDB4MCglW3BpeF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltwaXhdInIiKHBpeCksW3N0cmlkZV0iciIoKGludDY0X3Qpc3RyaWRlKQotICAgICAgICA6ICIkMTYiLCIkZjIiLCIkZjQiCisgICAgICAgICJhZGRpICAgICAgICVbYWxwaGFdLCAgICVbYWxwaGFdLCAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaSAgICAgICAlW2JldGFdLCAgICAlW2JldGFdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVthZGRyMF0sICAgJDAsICAgICAgICAgICAgICVbcGl4XSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9TVUJVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU1VCVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wMl0sICVbYWRkcjBdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDNdLCAlW3BpeF0sIDB4MDApCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXA0XSwgJVtwaXhdLCAlW3N0cmlkZV0sIDB4MDApCisKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbYWxwaGFdLCAgICVbZnRtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW2JldGFdLCAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA4XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA1XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFiICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wN10sICAgJVtmdG1wM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2ZmX3BiXzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAyXSwgJVthZGRyMF0sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbcGl4XSwgMHgwMCkKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSkKKyAgICAgICAgOiBbcGl4XSJyIihwaXgpLCAgICAgICAgICAgICAgICAgICAgW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksCisgICAgICAgICAgW2FscGhhXSJyIihhbHBoYSksICAgICAgICAgICAgICAgIFtiZXRhXSJyIihiZXRhKSwKKyAgICAgICAgICBbZmZfcGJfMV0iZiIoZmZfcGJfMSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKIHZvaWQgZmZfZGVibG9ja19oX2Nocm9tYV84X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCiAgICAgICAgIGludDhfdCAqdGMwKQogewotICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZGFkZGl1ICVbYWxwaGFdLCAlW2FscGhhXSwgLTB4MSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICVbYmV0YV0sICVbYmV0YV0sIC0weDEgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE2LCAlW3N0cmlkZV0sICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICVbcGl4XSwgJVtwaXhdLCAtMHgyICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE3LCAkMTYsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE5LCAkMTYsICQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDE4LCAkMCwgJVtwaXhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJVtwaXhdLCAlW3BpeF0sICQxNyAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjAsIDB4MygkMTgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTgsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjAsIDB4MCgkMTgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjQsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEzLCAkMTgsICQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjQsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjIsIDB4MygkMTMpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjIsIDB4MCgkMTMpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjYsIDB4MyglW3BpeF0pICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjYsIDB4MCglW3BpeF0pICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAlW3BpeF0sICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmNCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjgsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEzLCAlW3BpeF0sICQxNiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjgsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjEyLCAweDMoJDEzKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAlW3BpeF0sICQxNyAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjEyLCAweDAoJDEzKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjEwLCAweDMoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEzLCAlW3BpeF0sICQxOSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjEwLCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjE0LCAweDMoJDEzKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjE0LCAweDAoJDEzKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTAsICRmMTAsICRmMTQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGYxMiwgJGY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMTIsICRmMTIsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMiwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmNiwgJGY0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmNCwgJGY0LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGYyMCwgJGYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGYyMiwgJGY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6IFtwaXhdIityIihwaXgpLFtzdHJpZGVdIityIihzdHJpZGUpLFthbHBoYV0iK3IiKGFscGhhKSwKLSAgICAgICAgICBbYmV0YV0iK3IiKGJldGEpCi0gICAgICAgIDo6IiQxMiIsIiQxMyIsIiQxNiIsIiQxNyIsIiQxOCIsIiQxOSIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsCi0gICAgICAgICAgIiRmMTAiLCIkZjEyIiwiJGYxNCIsIiRmMjAiLCIkZjIyIgotICAgICk7Ci0KLSAgICBjaHJvbWFfaW50ZXJfYm9keV9tbWkocGl4LCBzdHJpZGUsIGFscGhhLCBiZXRhLCB0YzApOworICAgIGRvdWJsZSBmdG1wWzExXTsKKyAgICBtaXBzX3JlZyBhZGRyWzZdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJwdW5wY2tod2QgJGY4LCAkZjIwLCAkZjIwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGYyLCAkZjIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMiwgJGY0LCAkZjQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYwLCAkZjIwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmMjIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYyLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMiwgMHgzKCQxOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMiwgMHgwKCQxOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICQxOCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYyLCAkZjIsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMiwgMHgzKCQxMikgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTMsICQxOCwgJDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMiwgMHgwKCQxMikgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMCwgMHgzKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMCwgMHgwKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGY2LCAkZjIyLCAkZjIyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMCwgMHgzKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMCwgMHgwKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGY2ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICVbcGl4XSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYxMCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMTAsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMTAsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGYxMCwgJGYxMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICVbcGl4XSwgJDE2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTMsICVbcGl4XSwgJDE3ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMTAsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMTAsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmOCwgMHgzKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICVbcGl4XSwgJDE5ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYyMCwgJGY4LCAkZjggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmOCwgMHgwKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMjAsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMjAsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3BpeF0iciIocGl4KSxbc3RyaWRlXSJyIigoaW50NjRfdClzdHJpZGUpCi0gICAgICAgIDogIiQxMiIsIiQxMyIsIiQxNiIsIiQxNyIsIiQxOCIsIiQxOSIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsCi0gICAgICAgICAgIiRmMTAiLCIkZjEyIiwiJGYyMCIKKyAgICAgICAgImFkZGkgICAgICAgJVthbHBoYV0sICAgJVthbHBoYV0sICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpICAgICAgICVbYmV0YV0sICAgICVbYmV0YV0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3N0cmlkZV0sICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FEREkgICAiJVtwaXhdLCAgICAgJVtwaXhdLCAgICAgICAgIC0weDAyICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIyXSwgICAlW2FkZHIwXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVthZGRyNV0sICAgJDAsICAgICAgICAgICAgICVbcGl4XSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4XSwgICAgICVbcGl4XSwgICAgICAgICAlW2FkZHIxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMF0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI1XSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyNV0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgJVthZGRyNF0sIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAzXSwgJVtwaXhdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbcGl4XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAyXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA0XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjRdLCAgICVbcGl4XSwgICAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNl0sICVbYWRkcjRdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW3BpeF0sICAgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDVdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVtwaXhdLCAgICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA3XSwgJVthZGRyNF0sIDB4MDApCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDNdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDldLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAxMF0sICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAieG9yICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVthbHBoYV0sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbYmV0YV0sICAgICVbZnRtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDZdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA0XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDRdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWIgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA2XSwgJVt0YzBdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFiICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2ZmX3BiXzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3BiXzNdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA2XSwgICAlW2ZmX3BiX0ExXSwgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcGJfQTFdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWludWIgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG1pbnViICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzYiAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNF0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDVdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAxXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXAxXSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbYWRkcjVdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDFdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyNV0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXAwXSwgJVthZGRyNF0sIDB4MDApCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAzXSwgICAlW2Z0bXAxMF0sICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDBdLCAlW3BpeF0sIDB4MDApCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVtwaXhdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDVdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDVdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbcGl4XSwgICAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI0XSwgICAlW3BpeF0sICAgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDVdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDRdLCAlW2FkZHI0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVtwaXhdLCAgICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDldLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wOV0sICVbYWRkcjNdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbZnRtcDEwXSI9JmYiKGZ0bXBbMTBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFthZGRyMl0iPSZyIihhZGRyWzJdKSwgICAgICAgICAgICBbYWRkcjNdIj0mciIoYWRkclszXSksCisgICAgICAgICAgW2FkZHI0XSI9JnIiKGFkZHJbNF0pLCAgICAgICAgICAgIFthZGRyNV0iPSZyIihhZGRyWzVdKSwKKyAgICAgICAgICBbcGl4XSIrJnIiKHBpeCkKKyAgICAgICAgOiBbYWxwaGFdInIiKGFscGhhKSwgICAgICAgICAgICAgICAgW2JldGFdInIiKGJldGEpLAorICAgICAgICAgIFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLCAgICBbdGMwXSJyIih0YzApLAorICAgICAgICAgIFtmZl9wYl8xXSJmIihmZl9wYl8xKSwgICAgICAgICAgICBbZmZfcGJfM10iZiIoZmZfcGJfMyksCisgICAgICAgICAgW2ZmX3BiX0ExXSJmIihmZl9wYl9BMSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKIHZvaWQgZmZfZGVibG9ja19oX2Nocm9tYV9pbnRyYV84X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKICAgICAgICAgaW50IGJldGEpCiB7Ci0gICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkYWRkaXUgJVthbHBoYV0sICVbYWxwaGFdLCAtMHgxICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVtiZXRhXSwgJVtiZXRhXSwgLTB4MSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTYsICVbc3RyaWRlXSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVtwaXhdLCAlW3BpeF0sIC0weDIgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTcsICQxNiwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTksICQxNiwgJDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkMTgsICQwLCAlW3BpeF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAlW3BpeF0sICVbcGl4XSwgJDE3ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMCwgMHgzKCQxOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICQxOCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMCwgMHgwKCQxOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmNCwgMHgzKCQxMikgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTMsICQxOCwgJDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNCwgMHgwKCQxMikgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMiwgMHgzKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMiwgMHgwKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmNiwgMHgzKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNiwgMHgwKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICVbcGl4XSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY0LCAkZjAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYwLCAkZjAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmOCwgMHgzKCQxMikgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTMsICVbcGl4XSwgJDE2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmOCwgMHgwKCQxMikgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMTIsIDB4MygkMTMpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICVbcGl4XSwgJDE3ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTIsIDB4MCgkMTMpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMTAsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTMsICVbcGl4XSwgJDE5ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTAsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMTQsIDB4MygkMTMpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTQsIDB4MCgkMTMpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjEyLCAkZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGY4LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYxMiwgJGYxMiwgJGYxMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYyLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGY2LCAkZjQsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGY0LCAkZjQsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW3BpeF0iK3IiKHBpeCksW3N0cmlkZV0iK3IiKHN0cmlkZSksW2FscGhhXSIrciIoYWxwaGEpLAotICAgICAgICAgIFtiZXRhXSIrciIoYmV0YSkKLSAgICAgICAgOjoiJDEyIiwiJDEzIiwiJDE2IiwiJDE3IiwiJDE4IiwiJDE5IiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwKLSAgICAgICAgICAiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYyMCIsIiRmMjIiCi0gICAgKTsKLQotICAgIGNocm9tYV9pbnRyYV9ib2R5X21taShwaXgsIHN0cmlkZSwgYWxwaGEsIGJldGEpOworICAgIGRvdWJsZSBmdG1wWzExXTsKKyAgICBtaXBzX3JlZyBhZGRyWzZdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJwdW5wY2tod2QgJGY4LCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGYyLCAkZjIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMiwgJGY0LCAkZjQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYwLCAkZjAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYyLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMiwgMHgzKCQxOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMiwgMHgwKCQxOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICQxOCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYyLCAkZjIsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMiwgMHgzKCQxMikgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTMsICQxOCwgJDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMiwgMHgwKCQxMikgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMCwgMHgzKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMCwgMHgwKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGY2LCAkZjYsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMCwgMHgzKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMCwgMHgwKCVbcGl4XSkgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGY2ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICVbcGl4XSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYxMCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMTAsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMTAsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGYxMCwgJGYxMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICVbcGl4XSwgJDE2ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTMsICVbcGl4XSwgJDE3ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMTAsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMTAsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmOCwgMHgzKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTIsICVbcGl4XSwgJDE5ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYyMCwgJGY4LCAkZjggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmOCwgMHgwKCQxMykgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMjAsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMjAsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3BpeF0iciIocGl4KSxbc3RyaWRlXSJyIigoaW50NjRfdClzdHJpZGUpCi0gICAgICAgIDogIiQxMiIsIiQxMyIsIiQxNiIsIiQxNyIsIiQxOCIsIiQxOSIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsCi0gICAgICAgICAgIiRmMTAiLCIkZjEyIiwiJGYyMCIKKyAgICAgICAgImFkZGkgICAgICAgJVthbHBoYV0sICAgJVthbHBoYV0sICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpICAgICAgICVbYmV0YV0sICAgICVbYmV0YV0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3N0cmlkZV0sICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FEREkgICAiJVtwaXhdLCAgICAgJVtwaXhdLCAgICAgICAgIC0weDAyICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIyXSwgICAlW2FkZHIwXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVthZGRyNV0sICAgJDAsICAgICAgICAgICAgICVbcGl4XSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4XSwgICAgICVbcGl4XSwgICAgICAgICAlW2FkZHIxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMF0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI1XSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyNV0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgJVthZGRyNF0sIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAzXSwgJVtwaXhdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbcGl4XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAyXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA0XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjRdLCAgICVbcGl4XSwgICAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNl0sICVbYWRkcjRdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW3BpeF0sICAgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDVdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVtwaXhdLCAgICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA3XSwgJVthZGRyNF0sIDB4MDApCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDNdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbYWxwaGFdLCAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW2JldGFdLCAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA3XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA2XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wNF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzYiAgICAlW2Z0bXA0XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFiICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wNl0sICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDRdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3VidXNiICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3BiXzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2IgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmIgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhbmQgICAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYW5kICAgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDRdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wMV0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI1XSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjRdLCAgICVbYWRkcjVdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wMV0sICVbYWRkcjNdLCAweDAwKQorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wMF0sICVbYWRkcjRdLCAweDAwKQorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXAwXSwgJVtwaXhdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbcGl4XSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXA1XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXA1XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW3BpeF0sICAgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVtwaXhdLCAgICAgICAgICVbYWRkcjFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXA1XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbcGl4XSwgICAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wNF0sICVbYWRkcjRdLCAweDAwKQorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA5XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDldLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW2Z0bXAxMF0iPSZmIihmdG1wWzEwXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKSwKKyAgICAgICAgICBbYWRkcjJdIj0mciIoYWRkclsyXSksICAgICAgICAgICAgW2FkZHIzXSI9JnIiKGFkZHJbM10pLAorICAgICAgICAgIFthZGRyNF0iPSZyIihhZGRyWzRdKSwgICAgICAgICAgICBbYWRkcjVdIj0mciIoYWRkcls1XSksCisgICAgICAgICAgW3BpeF0iKyZyIihwaXgpCisgICAgICAgIDogW2FscGhhXSJyIihhbHBoYSksICAgICAgICAgICAgICAgIFtiZXRhXSJyIihiZXRhKSwKKyAgICAgICAgICBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSwgICAgW2ZmX3BiXzFdImYiKGZmX3BiXzEpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCkBAIC0xOTgyLDUxOSArMjI0MCw0OTMgQEAKIHZvaWQgZmZfZGVibG9ja192X2x1bWFfaW50cmFfOF9tbWkodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCiAgICAgICAgIGludCBiZXRhKQogewotICAgIGZmX2RlYmxvY2tfdjhfbHVtYV9pbnRyYV84X21taShwaXggKyAwLCBzdHJpZGUsIGFscGhhLCBiZXRhKTsKLSAgICBmZl9kZWJsb2NrX3Y4X2x1bWFfaW50cmFfOF9tbWkocGl4ICsgOCwgc3RyaWRlLCBhbHBoYSwgYmV0YSk7CisgICAgZGVibG9ja192OF9sdW1hX2ludHJhXzhfbW1pKHBpeCArIDAsIHN0cmlkZSwgYWxwaGEsIGJldGEpOworICAgIGRlYmxvY2tfdjhfbHVtYV9pbnRyYV84X21taShwaXggKyA4LCBzdHJpZGUsIGFscGhhLCBiZXRhKTsKIH0KIAogdm9pZCBmZl9kZWJsb2NrX2hfbHVtYV84X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwgaW50IGJldGEsCiAgICAgICAgIGludDhfdCAqdGMwKQogewotICAgIHVpbnQ2NF90IHN0YWNrWzB4ZF07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBzdGFja1sweDBkXSk7CisgICAgZG91YmxlIGZ0bXBbOV07CisgICAgbWlwc19yZWcgYWRkcls4XTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZGFkZHUgJDE1LCAlW3N0cmlkZV0sICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ4LCAlW3BpeF0sIC0weDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDksICVbc3RyaWRlXSwgJDE1ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjAsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjAsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkOCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAkOCwgJDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjIsIDB4NygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDExLCAkOCwgJDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjIsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjQsIDB4NygkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjQsIDB4MCgkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjYsIDB4NygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjYsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjgsIDB4NygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDExLCAkMTAsICQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjgsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjEwLCAweDcoJDExKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEwLCAweDAoJDExKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjEyLCAweDcoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEyLCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkMTUsICQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTQsICRmMCwgJGYyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMiwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmNiwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICQxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjIsIDB4MTArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjE2LCAweDcoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjE2LCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEzLCAkMTQsICQxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTAsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMiwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmNCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjE2LCAweDEwKyVbc3RhY2tdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjAsIDB4MCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMTIsICRmMTQsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMTQsICRmMTQsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMCwgJGY2LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmNiwgJGY2LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTIsICRmMTIsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMTQsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTQsICRmMTQsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmNiwgJGYyLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMiwgJGYyLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjIsIDB4MTArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjYsIDB4MjArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjE0LCAweDMwKyVbc3RhY2tdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjEwLCAweDQwKyVbc3RhY2tdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjEyLCAweDUwKyVbc3RhY2tdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ4LCAkMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAkMTAsICQxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjAsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkOCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjAsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjIsIDB4NygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDExLCAkOCwgJDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjIsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjQsIDB4NygkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjQsIDB4MCgkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjYsIDB4NygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjYsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjgsIDB4NygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDExLCAkMTAsICQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjgsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjEwLCAweDcoJDExKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEwLCAweDAoJDExKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjEyLCAweDcoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEyLCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTQsICRmMCwgJGYyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMiwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmNiwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICQxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjIsIDB4MTgrJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjE2LCAweDcoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjE2LCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMiwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTAsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmNCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjE2LCAweDE4KyVbc3RhY2tdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjAsIDB4OCslW3N0YWNrXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMTIsICRmMTQsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMTQsICRmMTQsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMCwgJGY2LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmNiwgJGY2LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMTQsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTQsICRmMTQsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmNiwgJGYyLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMiwgJGYyLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTIsICRmMTIsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjIsIDB4MTgrJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjYsIDB4MjgrJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjE0LCAweDM4KyVbc3RhY2tdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjEwLCAweDQ4KyVbc3RhY2tdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjEyLCAweDU4KyVbc3RhY2tdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltwaXhdInIiKHBpeCksW3N0cmlkZV0iciIoKGludDY0X3Qpc3RyaWRlKSxbc3RhY2tdIm0iKHN0YWNrWzBdKQotICAgICAgICA6ICIkOCIsIiQ5IiwiJDEwIiwiJDExIiwiJDEyIiwiJDEzIiwiJDE0IiwiJDE1IiwiJGYwIiwiJGYyIiwiJGY0IiwKLSAgICAgICAgICAiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzdHJpZGVdLCAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJICAgIiVbYWRkcjFdLCAgICVbcGl4XSwgICAgICAgICAtMHg0ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIyXSwgICAlW3N0cmlkZV0sICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyMV0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjRdLCAgICVbYWRkcjFdLCAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW2FkZHI0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyNF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA0XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNV0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDZdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNl0sICAgJVthZGRyMF0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDddLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHI2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtzdGFja10sIDB4MTApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA4XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjddLCAgICVbYWRkcjZdLCAgICAgICAlW2FkZHI2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDFdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXA4XSwgJVtzdGFja10sIDB4MTApCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtzdGFja10sIDB4MDApCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDZdLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMF0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNV0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW3N0YWNrXSwgMHgxMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbc3RhY2tdLCAweDIwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA3XSwgJVtzdGFja10sIDB4MzApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW3N0YWNrXSwgMHg0MCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbc3RhY2tdLCAweDUwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbYWRkcjFdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW2FkZHI0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyNF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA0XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNV0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDZdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wN10sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW3N0YWNrXSwgMHgxOCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDhdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDVdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDJdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDhdLCAlW3N0YWNrXSwgMHgxOCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbc3RhY2tdLCAweDA4KQorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA2XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDBdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNV0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtzdGFja10sIDB4MTgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDNdLCAlW3N0YWNrXSwgMHgyOCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wN10sICVbc3RhY2tdLCAweDM4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA1XSwgJVtzdGFja10sIDB4NDgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3N0YWNrXSwgMHg1OCkKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFthZGRyMl0iPSZyIihhZGRyWzJdKSwgICAgICAgICAgICBbYWRkcjNdIj0mciIoYWRkclszXSksCisgICAgICAgICAgW2FkZHI0XSI9JnIiKGFkZHJbNF0pLCAgICAgICAgICAgIFthZGRyNV0iPSZyIihhZGRyWzVdKSwKKyAgICAgICAgICBbYWRkcjZdIj0mciIoYWRkcls2XSksICAgICAgICAgICAgW2FkZHI3XSI9JnIiKGFkZHJbN10pCisgICAgICAgIDogW3BpeF0iciIocGl4KSwgICAgICAgICAgICAgICAgICAgIFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLAorICAgICAgICAgIFtzdGFja10iciIoc3RhY2spCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogCiAgICAgZmZfZGVibG9ja192X2x1bWFfOF9tbWkoKHVpbnQ4X3QgKikgJnN0YWNrWzZdLCAweDEwLCBhbHBoYSwgYmV0YSwgdGMwKTsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZGFkZHUgJDE1LCAlW3N0cmlkZV0sICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ4LCAlW3BpeF0sIC0weDIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkMTUsICQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDksICQxNSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEzLCAkMTQsICQxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAkOCwgJDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjAsIDB4MTArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjIsIDB4MjArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDB4MzArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjYsIDB4NDArJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmOCwgJGYwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMiwgJGYyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTIsICRmNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMiwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjIsIDB4MygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjIsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkOCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMiwgJGYyLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDExLCAkOCwgJDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjIsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjIsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjAsIDB4MygkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjAsIDB4MCgkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMCwgJGYwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmNiwgJGY2LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjAsIDB4MygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjAsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMTAsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjEwLCAweDMoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjEwLCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMTAsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDExLCAkMTAsICQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjEwLCAweDMoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjEwLCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjgsIDB4MygkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjgsIDB4MCgkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICQxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmOCwgJGY4LCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ4LCAkMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjgsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjgsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEwLCAkMTAsICQxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjAsIDB4MTgrJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjIsIDB4MjgrJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDB4MzgrJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjYsIDB4NDgrJVtzdGFja10gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE1LCAlW3N0cmlkZV0sICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmOCwgJGYwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkMTUsICQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMiwgJGYyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTIsICRmNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkOCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMiwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjIsIDB4MygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjIsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMiwgJGYyLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDExLCAkOCwgJDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjIsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjIsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjAsIDB4MygkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjAsIDB4MCgkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMCwgJGYwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmNiwgJGY2LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjAsIDB4MygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjAsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMTAsICRmOCwgJGYxMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjEwLCAweDMoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjEwLCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMTAsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDExLCAkMTAsICQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjEwLCAweDMoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjEwLCAweDAoJDEyKSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjgsIDB4MygkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjgsIDB4MCgkMTEpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDEyLCAkMTAsICQxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmOCwgJGY4LCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjgsIDB4MygkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjgsIDB4MCgkMTIpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltwaXhdInIiKHBpeCksW3N0cmlkZV0iciIoKGludDY0X3Qpc3RyaWRlKSxbc3RhY2tdIm0iKHN0YWNrWzBdKQotICAgICAgICA6ICIkOCIsIiQ5IiwiJDEwIiwiJDExIiwiJDEyIiwiJDEzIiwiJDE0IiwiJDE1IiwiJGYwIiwiJGYyIiwiJGY0IiwKLSAgICAgICAgICAiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzdHJpZGVdLCAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJICAgIiVbYWRkcjFdLCAgICVbcGl4XSwgICAgICAgICAtMHgwMiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHIwXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjddLCAgICVbYWRkcjZdLCAgICAgICAlW2FkZHI2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI0XSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbc3RhY2tdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtzdGFja10sIDB4MjApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW3N0YWNrXSwgMHgzMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbc3RhY2tdLCAweDQwKQorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA0XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDFdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDFdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyMV0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDFdLCAlW2FkZHIzXSwgMHgwMCkKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDBdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wMF0sICVbYWRkcjRdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDVdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI0XSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXA1XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXA1XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXA0XSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHI2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVthZGRyMV0sICAgICAgICVbYWRkcjddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXA0XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjRdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHI3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVtzdGFja10sIDB4MTgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW3N0YWNrXSwgMHgyOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbc3RhY2tdLCAweDM4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtzdGFja10sIDB4NDgpCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3RyaWRlXSwgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA0XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNl0sICAgJVthZGRyMF0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDVdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHIxXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wMV0sICVbYWRkcjFdLCAweDAwKQorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyMV0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXAxXSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXAwXSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTV0MxKCVbZnRtcDBdLCAlW2FkZHI0XSwgMHgwMCkKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI0XSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wNV0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wNV0sICVbYWRkcjNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wNV0sICVbYWRkcjNdLCAweDAwKQorICAgICAgICBNTUlfVVNXQzEoJVtmdG1wNF0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU1dDMSglW2Z0bXA0XSwgJVthZGRyM10sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKSwKKyAgICAgICAgICBbYWRkcjJdIj0mciIoYWRkclsyXSksICAgICAgICAgICAgW2FkZHIzXSI9JnIiKGFkZHJbM10pLAorICAgICAgICAgIFthZGRyNF0iPSZyIihhZGRyWzRdKSwgICAgICAgICAgICBbYWRkcjVdIj0mciIoYWRkcls1XSksCisgICAgICAgICAgW2FkZHI2XSI9JnIiKGFkZHJbNl0pLCAgICAgICAgICAgIFthZGRyN10iPSZyIihhZGRyWzddKQorICAgICAgICA6IFtwaXhdInIiKHBpeCksICAgICAgICAgICAgICAgICAgICBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSwKKyAgICAgICAgICBbc3RhY2tdInIiKHN0YWNrKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAogdm9pZCBmZl9kZWJsb2NrX2hfbHVtYV9pbnRyYV84X21taSh1aW50OF90ICpwaXgsIGludCBzdHJpZGUsIGludCBhbHBoYSwKICAgICAgICAgaW50IGJldGEpCiB7Ci0gICAgdWludDY0X3QgcHRtcFsweDExXTsKLSAgICB1aW50NjRfdCBwZGF0WzRdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgcHRtcFsweDExXSk7CisgICAgREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBwZGF0WzB4MDRdKTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICBtaXBzX3JlZyBhZGRyWzddOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkYWRkdSAkMTIsICVbc3RyaWRlXSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJDEwLCAlW3BpeF0sIC0weDQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTEsICQxMiwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTMsICQxMiwgJDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOSwgJDEwLCAkMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDEwLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMCwgMHg3KCQxMCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMCwgMHgwKCQxMCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTQsICQxMCwgJDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgMHg3KCQ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMiwgMHgwKCQ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNCwgMHg3KCQxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNCwgMHgwKCQxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDksICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNiwgMHg3KCQ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNiwgMHgwKCQ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTQsICQ5LCAkMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmOCwgMHg3KCQ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmOCwgMHgwKCQ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDksICQxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTAsIDB4NygkMTQpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTAsIDB4MCgkMTQpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTIsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTIsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDksICQxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxNCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYwLCAkZjAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYyLCAkZjQsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGY2LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTYsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTYsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxMCwgJGYxMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNiwgMHgwKyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY2LCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY0LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYxMiwgJGYxNCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYxNCwgJGYxNCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHgyMCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMHgwKyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYyLCAkZjQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGY0LCAkZjQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGY4LCAkZjE0LCAkZjQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxNCwgJGYxNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMCwgMHgwKyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDB4MTArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTQsIDB4NDArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmOCwgMHg1MCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMTYsIDB4MjArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYwLCAkZjYsICRmMTYgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGY2LCAkZjYsICRmMTYgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGYxMiwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxMiwgJGYxMiwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDEzLCAkMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNiwgMHgyMCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMCwgMHgzMCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTIsIDB4NjArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDB4NzArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTAsICQxMCwgJDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOSwgJDksICQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDEwLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMCwgMHg3KCQxMCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMCwgMHgwKCQxMCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTQsICQxMCwgJDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgMHg3KCQ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMiwgMHgwKCQ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNCwgMHg3KCQxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNCwgMHgwKCQxNCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDksICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNiwgMHg3KCQ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNiwgMHgwKCQ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMTQsICQ5LCAkMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmOCwgMHg3KCQ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmOCwgMHgwKCQ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDksICQxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTAsIDB4NygkMTQpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTAsIDB4MCgkMTQpICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTIsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTIsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJDksICQxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxNCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYwLCAkZjAsICRmMiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYyLCAkZjQsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY0LCAkZjQsICRmNiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGY2LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTYsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTYsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxMCwgJGYxMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGYxNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNiwgMHg4KyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY2LCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY0LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYxMiwgJGYxNCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYxNCwgJGYxNCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMHgyOCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMHg4KyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGYyLCAkZjQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGY0LCAkZjQsICRmMTAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGY4LCAkZjE0LCAkZjQgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxNCwgJGYxNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMCwgMHg4KyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDB4MTgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTQsIDB4NDgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmOCwgMHg1OCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMTYsIDB4MjgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYwLCAkZjYsICRmMTYgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGY2LCAkZjYsICRmMTYgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tod2QgJGYxMCwgJGYxMiwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxMiwgJGYxMiwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNiwgMHgyOCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMCwgMHgzOCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTIsIDB4NjgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDB4NzgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZCAkMTAsIDB4MDArJVtwZGF0XSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZCAkMTEsIDB4MDgrJVtwZGF0XSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZCAkMTIsIDB4MTArJVtwZGF0XSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZCAkMTMsIDB4MTgrJVtwZGF0XSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3BpeF0iciIocGl4KSxbc3RyaWRlXSJyIigodWludDY0X3Qpc3RyaWRlKSxbcHRtcF0ibSIocHRtcFswXSksCi0gICAgICAgICAgW3BkYXRdIm0iKHBkYXRbMF0pCi0gICAgICAgIDogIiQ4IiwiJDkiLCIkMTAiLCIkMTEiLCIkMTIiLCIkMTMiLCIkMTQiLCIkZjAiLCIkZjIiLCIkZjQiLCIkZjYiLAotICAgICAgICAgICIkZjgiLCIkZjEwIiwiJGYxMiIsIiRmMTQiLCIkZjE2IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3N0cmlkZV0sICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FEREkgICAiJVthZGRyMV0sICAgJVtwaXhdLCAgICAgICAgIC0weDA0ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjJdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW2FkZHIwXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyMV0sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjFdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMF0sICVbYWRkcjFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW2FkZHI2XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyNF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyNF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjZdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNF0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDVdLCAlW2FkZHI2XSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDZdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDddLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA4XSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDVdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbcHRtcF0sIDB4MDApCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDNdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA2XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW3B0bXBdLCAweDIwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtwdG1wXSwgMHgwMCkKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA1XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDRdLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbcHRtcF0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW3B0bXBdLCAweDEwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA3XSwgJVtwdG1wXSwgMHg0MCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbcHRtcF0sIDB4NTApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDhdLCAlW3B0bXBdLCAweDIwKQorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDVdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyM10sICAgICAgICVbYWRkcjNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDNdLCAlW3B0bXBdLCAweDIwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtwdG1wXSwgMHgzMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbcHRtcF0sIDB4NjApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW3B0bXBdLCAweDcwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjFdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMF0sICVbYWRkcjFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW2FkZHI2XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyNF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyNF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjZdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNF0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDVdLCAlW2FkZHI2XSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDZdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDddLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA4XSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDVdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbcHRtcF0sIDB4MDgpCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDNdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA2XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW3B0bXBdLCAweDI4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtwdG1wXSwgMHgwOCkKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA1XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDRdLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbcHRtcF0sIDB4MDgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW3B0bXBdLCAweDE4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA3XSwgJVtwdG1wXSwgMHg0OCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbcHRtcF0sIDB4NTgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDhdLCAlW3B0bXBdLCAweDI4KQorICAgICAgICAicHVucGNraHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDVdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbcHRtcF0sIDB4MjgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW3B0bXBdLCAweDM4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVtwdG1wXSwgMHg2OCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNV0sICVbcHRtcF0sIDB4NzgpCisgICAgICAgIFBUUl9TICAgICAgIiVbYWRkcjFdLCAgIDB4MDAoJVtwZGF0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfUyAgICAgICIlW2FkZHIyXSwgICAweDA4KCVbcGRhdF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1MgICAgICAiJVthZGRyMF0sICAgMHgxMCglW3BkYXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9TICAgICAgIiVbYWRkcjNdLCAgIDB4MTgoJVtwZGF0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSksCisgICAgICAgICAgW2FkZHIyXSI9JnIiKGFkZHJbMl0pLCAgICAgICAgICAgIFthZGRyM10iPSZyIihhZGRyWzNdKSwKKyAgICAgICAgICBbYWRkcjRdIj0mciIoYWRkcls0XSksICAgICAgICAgICAgW2FkZHI1XSI9JnIiKGFkZHJbNV0pLAorICAgICAgICAgIFthZGRyNl0iPSZyIihhZGRyWzZdKQorICAgICAgICA6IFtwaXhdInIiKHBpeCksICAgICAgICAgICAgICAgICAgICBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSwKKyAgICAgICAgICBbcHRtcF0iciIocHRtcCksICAgICAgICAgICAgICAgICAgW3BkYXRdInIiKHBkYXQpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogCiAgICAgZmZfZGVibG9ja192X2x1bWFfaW50cmFfOF9tbWkoKHVpbnQ4X3QgKikgJnB0bXBbOF0sIDB4MTAsIGFscGhhLCBiZXRhKTsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAibGQgJDEwLCAweDAwKyVbcGRhdF0gICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGQgJDExLCAweDA4KyVbcGRhdF0gICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGQgJDEyLCAweDEwKyVbcGRhdF0gICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGQgJDEzLCAweDE4KyVbcGRhdF0gICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDksICQxMCwgJDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjAsIDB4OCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjIsIDB4MTgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDB4MjgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjYsIDB4MzgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjgsIDB4NDgrJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEwLCAweDU4KyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEyLCAweDY4KyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTQsICRmMCwgJGYyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMiwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmNiwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjE2LCAweDc4KyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTAsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjYsIDB4NygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjYsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQxMCwgJDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmNiwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmNCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMTIsICRmMTQsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMTQsICRmMTQsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjQsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjQsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjQsIDB4NygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjQsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMiwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmNCwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmOCwgJGYxNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTQsICRmMTQsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQxMCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjAsIDB4NygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjAsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkOSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjEwLCAweDcoJDgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjEwLCAweDAoJDgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ5LCAkMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjE0LCAweDcoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjE0LCAweDAoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkMTAsICQxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjgsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjgsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjE2LCAweDcoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjE2LCAweDAoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQxMCwgJDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMCwgJGY2LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmNiwgJGY2LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMTIsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTIsICRmMTIsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjYsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjYsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ5LCAkMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjAsIDB4NygkOSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjAsIDB4MCgkOSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkOSwgJDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjEyLCAweDcoJDgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjEyLCAweDAoJDgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQxMywgJDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjEwLCAweDcoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjEwLCAweDAoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHN1YnUgJDEwLCAkMTAsICQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHN1YnUgJDksICQ5LCAkOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjAsIDB4MCslW3B0bXBdICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjIsIDB4MTArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDB4MjArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjYsIDB4MzArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjgsIDB4NDArJVtwdG1wXSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEwLCAweDUwKyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEyLCAweDYwKyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTQsICRmMCwgJGYyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMiwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmNiwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjE2LCAweDcwKyVbcHRtcF0gICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTAsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTIsICRmMTIsICRmMTYgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjYsIDB4NygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjYsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQxMCwgJDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmNiwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmNCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMTIsICRmMTQsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmMTQsICRmMTQsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjQsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjQsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjQsIDB4NygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjQsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGh3ICRmMiwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGh3ICRmNCwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMCwgJGY4ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmOCwgJGYxNCwgJGY0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTQsICRmMTQsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQxMCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjAsIDB4NygkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjAsIDB4MCgkMTApICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkOSwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjEwLCAweDcoJDgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjEwLCAweDAoJDgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ5LCAkMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjE0LCAweDcoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjE0LCAweDAoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkMTAsICQxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjgsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjgsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjE2LCAweDcoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjE2LCAweDAoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQxMCwgJDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMCwgJGY2LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmNiwgJGY2LCAkZjE2ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraHdkICRmMTAsICRmMTIsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTIsICRmMTIsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjYsIDB4NygkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjYsIDB4MCgkOCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ5LCAkMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjAsIDB4NygkOSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjAsIDB4MCgkOSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDE0LCAkOSwgJDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjEyLCAweDcoJDgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjEyLCAweDAoJDgpICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjEwLCAweDcoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjEwLCAweDAoJDE0KSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltwaXhdInIiKHBpeCksW3N0cmlkZV0iciIoKHVpbnQ2NF90KXN0cmlkZSksW3B0bXBdIm0iKHB0bXBbMF0pLAotICAgICAgICAgIFtwZGF0XSJtIihwZGF0WzBdKQotICAgICAgICA6ICIkOCIsIiQ5IiwiJDEwIiwiJDExIiwiJDEyIiwiJDEzIiwiJDE0IiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwKLSAgICAgICAgICAiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIKKyAgICAgICAgUFRSX0wgICAgICAiJVthZGRyMV0sICAgMHgwMCglW3BkYXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9MICAgICAgIiVbYWRkcjJdLCAgIDB4MDgoJVtwZGF0XSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfTCAgICAgICIlW2FkZHIwXSwgICAweDEwKCVbcGRhdF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0wgICAgICAiJVthZGRyM10sICAgMHgxOCglW3BkYXRdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjRdLCAgICVbYWRkcjFdLCAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVtwdG1wXSwgMHgwOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbcHRtcF0sIDB4MTgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW3B0bXBdLCAweDI4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtwdG1wXSwgMHgzOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICVbcHRtcF0sIDB4NDgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAlW3B0bXBdLCAweDU4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXA2XSwgJVtwdG1wXSwgMHg2OCkKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wN10sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wOF0sICVbcHRtcF0sIDB4NzgpCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDVdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTREMxKCVbZnRtcDNdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyMV0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDNdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wMl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXA2XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU0RDMSglW2Z0bXAyXSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDFdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA0XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjFdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNEQzEoJVtmdG1wMF0sICVbYWRkcjFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHI0XSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTREMxKCVbZnRtcDVdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU0RDMSglW2Z0bXA3XSwgJVthZGRyNl0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjZdLCAgICVbYWRkcjFdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNEQzEoJVtmdG1wNF0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wOF0sICVbYWRkcjZdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wMF0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraHdkICAlW2Z0bXA1XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU0RDMSglW2Z0bXAzXSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNEQzEoJVtmdG1wMF0sICVbYWRkcjRdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTREMxKCVbZnRtcDZdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyM10sICAgICAgICVbYWRkcjNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU0RDMSglW2Z0bXA1XSwgJVthZGRyNl0sIDB4MDApCisgICAgICAgIFBUUl9TVUJVICAgIiVbYWRkcjFdLCAgICVbYWRkcjFdLCAgICAgICAlW2FkZHI1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU1VCVSAgICIlW2FkZHI0XSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbcHRtcF0sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW3B0bXBdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtwdG1wXSwgMHgyMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbcHRtcF0sIDB4MzApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW3B0bXBdLCAweDQwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA1XSwgJVtwdG1wXSwgMHg1MCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNl0sICVbcHRtcF0sIDB4NjApCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDddLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMV0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDhdLCAlW3B0bXBdLCAweDcwKQorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU0RDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjFdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAzXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDJdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGh3ICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hodyAgJVtmdG1wNl0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNEQzEoJVtmdG1wMl0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMl0sICVbYWRkcjFdLCAweDAwKQorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDVdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNF0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHIxXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTREMxKCVbZnRtcDBdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNl0sICAgJVthZGRyNF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU0RDMSglW2Z0bXA1XSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjVdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNEQzEoJVtmdG1wN10sICVbYWRkcjZdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHIxXSwgICAgICAgJVthZGRyMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTREMxKCVbZnRtcDRdLCAlW2FkZHI1XSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDhdLCAlW2FkZHI2XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVthZGRyMV0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tod2QgICVbZnRtcDBdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2h3ZCAgJVtmdG1wNV0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsd2QgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVVNEQzEoJVtmdG1wM10sICVbYWRkcjVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHI0XSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VTREMxKCVbZnRtcDBdLCAlW2FkZHI0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNl0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VU0RDMSglW2Z0bXA2XSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgIE1NSV9VU0RDMSglW2Z0bXA1XSwgJVthZGRyNl0sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKSwKKyAgICAgICAgICBbYWRkcjJdIj0mciIoYWRkclsyXSksICAgICAgICAgICAgW2FkZHIzXSI9JnIiKGFkZHJbM10pLAorICAgICAgICAgIFthZGRyNF0iPSZyIihhZGRyWzRdKSwgICAgICAgICAgICBbYWRkcjVdIj0mciIoYWRkcls1XSksCisgICAgICAgICAgW2FkZHI2XSI9JnIiKGFkZHJbNl0pCisgICAgICAgIDogW3BpeF0iciIocGl4KSwgICAgICAgICAgICAgICAgICAgIFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLAorICAgICAgICAgIFtwdG1wXSJyIihwdG1wKSwgICAgICAgICAgICAgICAgICBbcGRhdF0iciIocGRhdCkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaDI2NGRzcF9tc2EuYyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0ZHNwX21zYS5jCmluZGV4IGZjZTAxYWMuLmU1MGY1Y2EgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9oMjY0ZHNwX21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0ZHNwX21zYS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSBQYXJhZyBTYWxhc2FrYXIgKFBhcmFnLlNhbGFzYWthckBpbWd0ZWMuY29tKQorICogQ29weXJpZ2h0IChjKSAyMDE1IC0gMjAxNyBQYXJhZyBTYWxhc2FrYXIgKFBhcmFnLlNhbGFzYWthckBpbWd0ZWMuY29tKQogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0yNSw0MDEgKzI1LDQ0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG9nMl9kZW5vbSwgaW50MzJfdCBzcmNfd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0X2luKQogewotICAgIHVpbnQzMl90IGRhdGEwLCBkYXRhMTsKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgb2Zmc2V0X3ZhbDsKICAgICB2MTZ1OCB6ZXJvID0geyAwIH07Ci0gICAgdjE2dTggc3JjMCwgc3JjMTsKLSAgICB2NGkzMiByZXMwLCByZXMxOwotICAgIHY4aTE2IHRlbXAwLCB0ZW1wMSwgdmVjMCwgdmVjMSwgd2d0LCBkZW5vbSwgb2Zmc2V0OwotICAgIHY4dTE2IG91dDAsIG91dDE7CisgICAgdjE2dTggc3JjMCA9IHsgMCB9OworICAgIHY4aTE2IHNyYzBfciwgdG1wMCwgd2d0LCBkZW5vbSwgb2Zmc2V0OwogCi0gICAgb2Zmc2V0X2luIDw8PSAobG9nMl9kZW5vbSk7Ci0KLSAgICBpZiAobG9nMl9kZW5vbSkgewotICAgICAgICBvZmZzZXRfaW4gKz0gKDEgPDwgKGxvZzJfZGVub20gLSAxKSk7Ci0gICAgfQorICAgIG9mZnNldF92YWwgPSAodW5zaWduZWQpIG9mZnNldF9pbiA8PCBsb2cyX2Rlbm9tOwogCiAgICAgd2d0ID0gX19tc2FfZmlsbF9oKHNyY193ZWlnaHQpOwotICAgIG9mZnNldCA9IF9fbXNhX2ZpbGxfaChvZmZzZXRfaW4pOworICAgIG9mZnNldCA9IF9fbXNhX2ZpbGxfaChvZmZzZXRfdmFsKTsKICAgICBkZW5vbSA9IF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tKTsKIAotICAgIGRhdGEwID0gTFcoZGF0YSk7Ci0gICAgZGF0YTEgPSBMVyhkYXRhICsgc3RyaWRlKTsKLQotICAgIHNyYzAgPSAodjE2dTgpIF9fbXNhX2ZpbGxfdyhkYXRhMCk7Ci0gICAgc3JjMSA9ICh2MTZ1OCkgX19tc2FfZmlsbF93KGRhdGExKTsKLQotICAgIElMVlJfQjJfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgdmVjMCwgdmVjMSk7Ci0gICAgTVVMMih3Z3QsIHZlYzAsIHdndCwgdmVjMSwgdGVtcDAsIHRlbXAxKTsKLSAgICBBRERTX1NIMl9TSCh0ZW1wMCwgb2Zmc2V0LCB0ZW1wMSwgb2Zmc2V0LCB0ZW1wMCwgdGVtcDEpOwotICAgIE1BWElfU0gyX1NIKHRlbXAwLCB0ZW1wMSwgMCk7Ci0KLSAgICBvdXQwID0gKHY4dTE2KSBfX21zYV9zcmxfaCh0ZW1wMCwgZGVub20pOwotICAgIG91dDEgPSAodjh1MTYpIF9fbXNhX3NybF9oKHRlbXAxLCBkZW5vbSk7Ci0KLSAgICBTQVRfVUgyX1VIKG91dDAsIG91dDEsIDcpOwotICAgIFBDS0VWX0IyX1NXKG91dDAsIG91dDAsIG91dDEsIG91dDEsIHJlczAsIHJlczEpOwotCi0gICAgZGF0YTAgPSBfX21zYV9jb3B5X3VfdyhyZXMwLCAwKTsKLSAgICBkYXRhMSA9IF9fbXNhX2NvcHlfdV93KHJlczEsIDApOwotICAgIFNXKGRhdGEwLCBkYXRhKTsKLSAgICBkYXRhICs9IHN0cmlkZTsKLSAgICBTVyhkYXRhMSwgZGF0YSk7CisgICAgTFcyKGRhdGEsIHN0cmlkZSwgdHAwLCB0cDEpOworICAgIElOU0VSVF9XMl9VQih0cDAsIHRwMSwgc3JjMCk7CisgICAgc3JjMF9yID0gKHY4aTE2KSBfX21zYV9pbHZyX2IoKHYxNmk4KSB6ZXJvLCAodjE2aTgpIHNyYzApOworICAgIHRtcDAgPSB3Z3QgKiBzcmMwX3I7CisgICAgdG1wMCA9IF9fbXNhX2FkZHNfc19oKHRtcDAsIG9mZnNldCk7CisgICAgdG1wMCA9IF9fbXNhX21heGlfc19oKHRtcDAsIDApOworICAgIHRtcDAgPSBfX21zYV9zcmxyX2godG1wMCwgZGVub20pOworICAgIHRtcDAgPSAodjhpMTYpIF9fbXNhX3NhdF91X2goKHY4dTE2KSB0bXAwLCA3KTsKKyAgICBzcmMwID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wMCwgKHYxNmk4KSB0bXAwKTsKKyAgICBTVDR4Ml9VQihzcmMwLCBkYXRhLCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfd2d0XzR4NG11bHRpcGxlX21zYSh1aW50OF90ICpkYXRhLCBpbnQzMl90IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY193ZWlnaHQsIGludDMyX3Qgb2Zmc2V0X2luKQorc3RhdGljIHZvaWQgYXZjX3dndF80eDRfbXNhKHVpbnQ4X3QgKmRhdGEsIGludDMyX3Qgc3RyaWRlLCBpbnQzMl90IGxvZzJfZGVub20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfd2VpZ2h0LCBpbnQzMl90IG9mZnNldF9pbikKIHsKLSAgICB1aW50OF90IGNudDsKLSAgICB1aW50MzJfdCBkYXRhMCwgZGF0YTEsIGRhdGEyLCBkYXRhMzsKLSAgICB2MTZ1OCB6ZXJvID0geyAwIH07Ci0gICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2OHUxNiB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgd2d0OwotICAgIHY4aTE2IGRlbm9tLCBvZmZzZXQ7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzLCBvZmZzZXRfdmFsOworICAgIHYxNnU4IHNyYzAgPSB7IDAgfTsKKyAgICB2OGkxNiBzcmMwX3IsIHNyYzFfciwgdG1wMCwgdG1wMSwgd2d0LCBkZW5vbSwgb2Zmc2V0OwogCi0gICAgb2Zmc2V0X2luIDw8PSAobG9nMl9kZW5vbSk7CisgICAgb2Zmc2V0X3ZhbCA9ICh1bnNpZ25lZCkgb2Zmc2V0X2luIDw8IGxvZzJfZGVub207CiAKLSAgICBpZiAobG9nMl9kZW5vbSkgewotICAgICAgICBvZmZzZXRfaW4gKz0gKDEgPDwgKGxvZzJfZGVub20gLSAxKSk7Ci0gICAgfQotCi0gICAgd2d0ID0gKHY4dTE2KSBfX21zYV9maWxsX2goc3JjX3dlaWdodCk7Ci0gICAgb2Zmc2V0ID0gX19tc2FfZmlsbF9oKG9mZnNldF9pbik7CisgICAgd2d0ID0gX19tc2FfZmlsbF9oKHNyY193ZWlnaHQpOworICAgIG9mZnNldCA9IF9fbXNhX2ZpbGxfaChvZmZzZXRfdmFsKTsKICAgICBkZW5vbSA9IF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tKTsKIAotICAgIGZvciAoY250ID0gaGVpZ2h0IC8gNDsgY250LS07KSB7Ci0gICAgICAgIExXNChkYXRhLCBzdHJpZGUsIGRhdGEwLCBkYXRhMSwgZGF0YTIsIGRhdGEzKTsKLQotICAgICAgICBzcmMwID0gKHYxNnU4KSBfX21zYV9maWxsX3coZGF0YTApOwotICAgICAgICBzcmMxID0gKHYxNnU4KSBfX21zYV9maWxsX3coZGF0YTEpOwotICAgICAgICBzcmMyID0gKHYxNnU4KSBfX21zYV9maWxsX3coZGF0YTIpOwotICAgICAgICBzcmMzID0gKHYxNnU4KSBfX21zYV9maWxsX3coZGF0YTMpOwotCi0gICAgICAgIElMVlJfQjRfVUgoemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKLSAgICAgICAgICAgICAgICAgICB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMyk7Ci0gICAgICAgIE1VTDQod2d0LCB0ZW1wMCwgd2d0LCB0ZW1wMSwgd2d0LCB0ZW1wMiwgd2d0LCB0ZW1wMywKLSAgICAgICAgICAgICB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMyk7Ci0gICAgICAgIEFERFNfU0g0X1VIKHRlbXAwLCBvZmZzZXQsIHRlbXAxLCBvZmZzZXQsIHRlbXAyLCBvZmZzZXQsIHRlbXAzLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgTUFYSV9TSDRfVUgodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOwotICAgICAgICBTUkxfSDRfVUgodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGRlbm9tKTsKLSAgICAgICAgU0FUX1VINF9VSCh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgNyk7Ci0gICAgICAgIFBDS0VWX1NUNHg0X1VCKHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCBkYXRhLCBzdHJpZGUpOwotICAgICAgICBkYXRhICs9ICg0ICogc3RyaWRlKTsKLSAgICB9CisgICAgTFc0KGRhdGEsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBzcmMwKTsKKyAgICBVTlBDS19VQl9TSChzcmMwLCBzcmMwX3IsIHNyYzFfcik7CisgICAgTVVMMih3Z3QsIHNyYzBfciwgd2d0LCBzcmMxX3IsIHRtcDAsIHRtcDEpOworICAgIEFERFNfU0gyX1NIKHRtcDAsIG9mZnNldCwgdG1wMSwgb2Zmc2V0LCB0bXAwLCB0bXAxKTsKKyAgICBNQVhJX1NIMl9TSCh0bXAwLCB0bXAxLCAwKTsKKyAgICB0bXAwID0gX19tc2Ffc3Jscl9oKHRtcDAsIGRlbm9tKTsKKyAgICB0bXAxID0gX19tc2Ffc3Jscl9oKHRtcDEsIGRlbm9tKTsKKyAgICBTQVRfVUgyX1NIKHRtcDAsIHRtcDEsIDcpOworICAgIHNyYzAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAxLCAodjE2aTgpIHRtcDApOworICAgIFNUNHg0X1VCKHNyYzAsIHNyYzAsIDAsIDEsIDIsIDMsIGRhdGEsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y193Z3RfNHdpZHRoX21zYSh1aW50OF90ICpkYXRhLCBpbnQzMl90IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBsb2cyX2Rlbm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3dlaWdodCwgaW50MzJfdCBvZmZzZXRfaW4pCitzdGF0aWMgdm9pZCBhdmNfd2d0XzR4OF9tc2EodWludDhfdCAqZGF0YSwgaW50MzJfdCBzdHJpZGUsIGludDMyX3QgbG9nMl9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY193ZWlnaHQsIGludDMyX3Qgb2Zmc2V0X2luKQogewotICAgIGlmICgyID09IGhlaWdodCkgewotICAgICAgICBhdmNfd2d0XzR4Ml9tc2EoZGF0YSwgc3RyaWRlLCBsb2cyX2Rlbm9tLCBzcmNfd2VpZ2h0LCBvZmZzZXRfaW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2Y193Z3RfNHg0bXVsdGlwbGVfbXNhKGRhdGEsIHN0cmlkZSwgaGVpZ2h0LCBsb2cyX2Rlbm9tLCBzcmNfd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfaW4pOwotICAgIH0KKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDMsIG9mZnNldF92YWw7CisgICAgdjE2dTggc3JjMCA9IHsgMCB9LCBzcmMxID0geyAwIH07CisgICAgdjhpMTYgc3JjMF9yLCBzcmMxX3IsIHNyYzJfciwgc3JjM19yLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHY4aTE2IHdndCwgZGVub20sIG9mZnNldDsKKworICAgIG9mZnNldF92YWwgPSAodW5zaWduZWQpIG9mZnNldF9pbiA8PCBsb2cyX2Rlbm9tOworCisgICAgd2d0ID0gX19tc2FfZmlsbF9oKHNyY193ZWlnaHQpOworICAgIG9mZnNldCA9IF9fbXNhX2ZpbGxfaChvZmZzZXRfdmFsKTsKKyAgICBkZW5vbSA9IF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tKTsKKworICAgIExXNChkYXRhLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMCk7CisgICAgTFc0KGRhdGEgKyA0ICogc3RyaWRlLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMSk7CisgICAgVU5QQ0tfVUJfU0goc3JjMCwgc3JjMF9yLCBzcmMxX3IpOworICAgIFVOUENLX1VCX1NIKHNyYzEsIHNyYzJfciwgc3JjM19yKTsKKyAgICBNVUw0KHdndCwgc3JjMF9yLCB3Z3QsIHNyYzFfciwgd2d0LCBzcmMyX3IsIHdndCwgc3JjM19yLCB0bXAwLCB0bXAxLCB0bXAyLAorICAgICAgICAgdG1wMyk7CisgICAgQUREU19TSDRfU0godG1wMCwgb2Zmc2V0LCB0bXAxLCBvZmZzZXQsIHRtcDIsIG9mZnNldCwgdG1wMywgb2Zmc2V0LCB0bXAwLAorICAgICAgICAgICAgICAgIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIE1BWElfU0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDApOworICAgIFNSTFJfSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZGVub20pOworICAgIFNBVF9VSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CisgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgc3JjMCwgc3JjMSk7CisgICAgU1Q0eDhfVUIoc3JjMCwgc3JjMSwgZGF0YSwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX3dndF84d2lkdGhfbXNhKHVpbnQ4X3QgKmRhdGEsIGludDMyX3Qgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfd2VpZ2h0LCBpbnQzMl90IG9mZnNldF9pbikKK3N0YXRpYyB2b2lkIGF2Y193Z3RfOHg0X21zYSh1aW50OF90ICpkYXRhLCBpbnQzMl90IHN0cmlkZSwgaW50MzJfdCBsb2cyX2Rlbm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3dlaWdodCwgaW50MzJfdCBvZmZzZXRfaW4pCiB7Ci0gICAgdWludDhfdCBjbnQ7Ci0gICAgdjE2dTggemVybyA9IHsgMCB9OwotICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgdjh1MTYgc3JjMF9yLCBzcmMxX3IsIHNyYzJfciwgc3JjM19yOwotICAgIHY4dTE2IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOwotICAgIHY4dTE2IHdndCwgZGVub20sIG9mZnNldDsKLSAgICB2MTZpOCBvdXQwLCBvdXQxOworICAgIHVpbnQzMl90IG9mZnNldF92YWw7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9OworICAgIHY4aTE2IHNyYzBfciwgc3JjMV9yLCBzcmMyX3IsIHNyYzNfciwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiB3Z3QsIGRlbm9tLCBvZmZzZXQ7CiAKLSAgICBvZmZzZXRfaW4gPDw9IChsb2cyX2Rlbm9tKTsKKyAgICBvZmZzZXRfdmFsID0gKHVuc2lnbmVkKSBvZmZzZXRfaW4gPDwgbG9nMl9kZW5vbTsKIAotICAgIGlmIChsb2cyX2Rlbm9tKSB7Ci0gICAgICAgIG9mZnNldF9pbiArPSAoMSA8PCAobG9nMl9kZW5vbSAtIDEpKTsKLSAgICB9CisgICAgd2d0ID0gX19tc2FfZmlsbF9oKHNyY193ZWlnaHQpOworICAgIG9mZnNldCA9IF9fbXNhX2ZpbGxfaChvZmZzZXRfdmFsKTsKKyAgICBkZW5vbSA9IF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tKTsKIAotICAgIHdndCA9ICh2OHUxNikgX19tc2FfZmlsbF9oKHNyY193ZWlnaHQpOwotICAgIG9mZnNldCA9ICh2OHUxNikgX19tc2FfZmlsbF9oKG9mZnNldF9pbik7Ci0gICAgZGVub20gPSAodjh1MTYpIF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tKTsKLQotICAgIGZvciAoY250ID0gaGVpZ2h0IC8gNDsgY250LS07KSB7Ci0gICAgICAgIExEX1VCNChkYXRhLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBJTFZSX0I0X1VIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgc3JjMF9yLCBzcmMxX3IsIHNyYzJfciwgc3JjM19yKTsKLSAgICAgICAgTVVMNCh3Z3QsIHNyYzBfciwgd2d0LCBzcmMxX3IsIHdndCwgc3JjMl9yLCB3Z3QsIHNyYzNfciwKLSAgICAgICAgICAgICB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMyk7Ci0gICAgICAgIEFERFNfU0g0X1VIKHRlbXAwLCBvZmZzZXQsIHRlbXAxLCBvZmZzZXQsIHRlbXAyLCBvZmZzZXQsIHRlbXAzLCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgTUFYSV9TSDRfVUgodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDApOwotICAgICAgICBTUkxfSDRfVUgodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGRlbm9tKTsKLSAgICAgICAgU0FUX1VINF9VSCh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgNyk7Ci0gICAgICAgIFBDS0VWX0IyX1NCKHRlbXAxLCB0ZW1wMCwgdGVtcDMsIHRlbXAyLCBvdXQwLCBvdXQxKTsKLSAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZGF0YSwgc3RyaWRlKTsKLSAgICAgICAgZGF0YSArPSAoNCAqIHN0cmlkZSk7Ci0gICAgfQorICAgIExENChkYXRhLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIHNyYzEpOworICAgIFVOUENLX1VCX1NIKHNyYzAsIHNyYzBfciwgc3JjMV9yKTsKKyAgICBVTlBDS19VQl9TSChzcmMxLCBzcmMyX3IsIHNyYzNfcik7CisgICAgTVVMNCh3Z3QsIHNyYzBfciwgd2d0LCBzcmMxX3IsIHdndCwgc3JjMl9yLCB3Z3QsIHNyYzNfciwgdG1wMCwgdG1wMSwgdG1wMiwKKyAgICAgICAgIHRtcDMpOworICAgIEFERFNfU0g0X1NIKHRtcDAsIG9mZnNldCwgdG1wMSwgb2Zmc2V0LCB0bXAyLCBvZmZzZXQsIHRtcDMsIG9mZnNldCwgdG1wMCwKKyAgICAgICAgICAgICAgICB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICBNQVhJX1NINF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCAwKTsKKyAgICBTUkxSX0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIGRlbm9tKTsKKyAgICBTQVRfVUg0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOworICAgIFBDS0VWX0IyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHNyYzAsIHNyYzEpOworICAgIFNUOHg0X1VCKHNyYzAsIHNyYzEsIGRhdGEsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y193Z3RfMTZ3aWR0aF9tc2EodWludDhfdCAqZGF0YSwgaW50MzJfdCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3dlaWdodCwgaW50MzJfdCBvZmZzZXRfaW4pCitzdGF0aWMgdm9pZCBhdmNfd2d0Xzh4OF9tc2EodWludDhfdCAqZGF0YSwgaW50MzJfdCBzdHJpZGUsIGludDMyX3QgbG9nMl9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY193ZWlnaHQsIGludDMyX3Qgb2Zmc2V0X2luKQogewotICAgIHVpbnQ4X3QgY250OwotICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjh1MTYgc3JjMF9sLCBzcmMxX2wsIHNyYzJfbCwgc3JjM19sLCBzcmMwX3IsIHNyYzFfciwgc3JjMl9yLCBzcmMzX3I7Ci0gICAgdjh1MTYgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OwotICAgIHY4dTE2IHdndCwgZGVub20sIG9mZnNldDsKKyAgICB1aW50MzJfdCBvZmZzZXRfdmFsOworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCBzcmMwID0geyAwIH0sIHNyYzEgPSB7IDAgfSwgc3JjMiA9IHsgMCB9LCBzcmMzID0geyAwIH07CisgICAgdjhpMTYgc3JjMF9yLCBzcmMxX3IsIHNyYzJfciwgc3JjM19yLCBzcmM0X3IsIHNyYzVfciwgc3JjNl9yLCBzcmM3X3I7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB2OGkxNiB3Z3QsIGRlbm9tLCBvZmZzZXQ7CiAKLSAgICBvZmZzZXRfaW4gPDw9IChsb2cyX2Rlbm9tKTsKKyAgICBvZmZzZXRfdmFsID0gKHVuc2lnbmVkKSBvZmZzZXRfaW4gPDwgbG9nMl9kZW5vbTsKIAotICAgIGlmIChsb2cyX2Rlbm9tKSB7Ci0gICAgICAgIG9mZnNldF9pbiArPSAoMSA8PCAobG9nMl9kZW5vbSAtIDEpKTsKLSAgICB9CisgICAgd2d0ID0gX19tc2FfZmlsbF9oKHNyY193ZWlnaHQpOworICAgIG9mZnNldCA9IF9fbXNhX2ZpbGxfaChvZmZzZXRfdmFsKTsKKyAgICBkZW5vbSA9IF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tKTsKIAotICAgIHdndCA9ICh2OHUxNikgX19tc2FfZmlsbF9oKHNyY193ZWlnaHQpOwotICAgIG9mZnNldCA9ICh2OHUxNikgX19tc2FfZmlsbF9oKG9mZnNldF9pbik7Ci0gICAgZGVub20gPSAodjh1MTYpIF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tKTsKKyAgICBMRDQoZGF0YSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgc3JjMCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBzcmMxKTsKKyAgICBMRDQoZGF0YSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIHNyYzIpOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgc3JjMyk7CisgICAgVU5QQ0tfVUJfU0goc3JjMCwgc3JjMF9yLCBzcmMxX3IpOworICAgIFVOUENLX1VCX1NIKHNyYzEsIHNyYzJfciwgc3JjM19yKTsKKyAgICBVTlBDS19VQl9TSChzcmMyLCBzcmM0X3IsIHNyYzVfcik7CisgICAgVU5QQ0tfVUJfU0goc3JjMywgc3JjNl9yLCBzcmM3X3IpOworICAgIE1VTDQod2d0LCBzcmMwX3IsIHdndCwgc3JjMV9yLCB3Z3QsIHNyYzJfciwgd2d0LCBzcmMzX3IsIHRtcDAsIHRtcDEsIHRtcDIsCisgICAgICAgICB0bXAzKTsKKyAgICBNVUw0KHdndCwgc3JjNF9yLCB3Z3QsIHNyYzVfciwgd2d0LCBzcmM2X3IsIHdndCwgc3JjN19yLCB0bXA0LCB0bXA1LCB0bXA2LAorICAgICAgICAgdG1wNyk7CisgICAgQUREU19TSDRfU0godG1wMCwgb2Zmc2V0LCB0bXAxLCBvZmZzZXQsIHRtcDIsIG9mZnNldCwgdG1wMywgb2Zmc2V0LCB0bXAwLAorICAgICAgICAgICAgICAgIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIEFERFNfU0g0X1NIKHRtcDQsIG9mZnNldCwgdG1wNSwgb2Zmc2V0LCB0bXA2LCBvZmZzZXQsIHRtcDcsIG9mZnNldCwgdG1wNCwKKyAgICAgICAgICAgICAgICB0bXA1LCB0bXA2LCB0bXA3KTsKKyAgICBNQVhJX1NIOF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCAwKTsKKyAgICBTUkxSX0g4X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIGRlbm9tKTsKKyAgICBTQVRfVUg4X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIDcpOworICAgIFBDS0VWX0I0X1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHRtcDUsIHRtcDQsIHRtcDcsIHRtcDYsIHNyYzAsIHNyYzEsCisgICAgICAgICAgICAgICAgc3JjMiwgc3JjMyk7CisgICAgU1Q4eDhfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZGF0YSwgc3RyaWRlKTsKK30KIAotICAgIGZvciAoY250ID0gaGVpZ2h0IC8gNDsgY250LS07KSB7Ci0gICAgICAgIExEX1VCNChkYXRhLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBJTFZSX0I0X1VIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgc3JjMF9yLCBzcmMxX3IsIHNyYzJfciwgc3JjM19yKTsKLSAgICAgICAgSUxWTF9CNF9VSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgIHNyYzBfbCwgc3JjMV9sLCBzcmMyX2wsIHNyYzNfbCk7Ci0gICAgICAgIE1VTDQod2d0LCBzcmMwX3IsIHdndCwgc3JjMF9sLCB3Z3QsIHNyYzFfciwgd2d0LCBzcmMxX2wsCi0gICAgICAgICAgICAgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMpOwotICAgICAgICBNVUw0KHdndCwgc3JjMl9yLCB3Z3QsIHNyYzJfbCwgd2d0LCBzcmMzX3IsIHdndCwgc3JjM19sLAotICAgICAgICAgICAgIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3KTsKLSAgICAgICAgQUREU19TSDRfVUgodGVtcDAsIG9mZnNldCwgdGVtcDEsIG9mZnNldCwgdGVtcDIsIG9mZnNldCwgdGVtcDMsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMpOwotICAgICAgICBBRERTX1NINF9VSCh0ZW1wNCwgb2Zmc2V0LCB0ZW1wNSwgb2Zmc2V0LCB0ZW1wNiwgb2Zmc2V0LCB0ZW1wNywgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNyk7Ci0gICAgICAgIE1BWElfU0g0X1VIKHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCAwKTsKLSAgICAgICAgTUFYSV9TSDRfVUgodGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIDApOwotICAgICAgICBTUkxfSDRfVUgodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGRlbm9tKTsKLSAgICAgICAgU1JMX0g0X1VIKHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCBkZW5vbSk7Ci0gICAgICAgIFNBVF9VSDRfVUgodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIDcpOwotICAgICAgICBTQVRfVUg0X1VIKHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCA3KTsKLSAgICAgICAgUENLRVZfQjRfVUIodGVtcDEsIHRlbXAwLCB0ZW1wMywgdGVtcDIsIHRlbXA1LCB0ZW1wNCwgdGVtcDcsIHRlbXA2LAotICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgU1RfVUI0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRhdGEsIHN0cmlkZSk7Ci0gICAgICAgIGRhdGEgKz0gNCAqIHN0cmlkZTsKK3N0YXRpYyB2b2lkIGF2Y193Z3RfOHgxNl9tc2EodWludDhfdCAqZGF0YSwgaW50MzJfdCBzdHJpZGUsIGludDMyX3QgbG9nMl9kZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfd2VpZ2h0LCBpbnQzMl90IG9mZnNldF9pbikKK3sKKyAgICB1aW50MzJfdCBvZmZzZXRfdmFsLCBjbnQ7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9LCBzcmMyID0geyAwIH0sIHNyYzMgPSB7IDAgfTsKKyAgICB2OGkxNiBzcmMwX3IsIHNyYzFfciwgc3JjMl9yLCBzcmMzX3IsIHNyYzRfciwgc3JjNV9yLCBzcmM2X3IsIHNyYzdfcjsKKyAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIHY4aTE2IHdndCwgZGVub20sIG9mZnNldDsKKworICAgIG9mZnNldF92YWwgPSAodW5zaWduZWQpIG9mZnNldF9pbiA8PCBsb2cyX2Rlbm9tOworCisgICAgd2d0ID0gX19tc2FfZmlsbF9oKHNyY193ZWlnaHQpOworICAgIG9mZnNldCA9IF9fbXNhX2ZpbGxfaChvZmZzZXRfdmFsKTsKKyAgICBkZW5vbSA9IF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tKTsKKworICAgIGZvciAoY250ID0gMjsgY250LS07KSB7CisgICAgICAgIExENChkYXRhLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgc3JjMCk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgc3JjMSk7CisgICAgICAgIExENChkYXRhICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIHNyYzIpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIHNyYzMpOworICAgICAgICBVTlBDS19VQl9TSChzcmMwLCBzcmMwX3IsIHNyYzFfcik7CisgICAgICAgIFVOUENLX1VCX1NIKHNyYzEsIHNyYzJfciwgc3JjM19yKTsKKyAgICAgICAgVU5QQ0tfVUJfU0goc3JjMiwgc3JjNF9yLCBzcmM1X3IpOworICAgICAgICBVTlBDS19VQl9TSChzcmMzLCBzcmM2X3IsIHNyYzdfcik7CisgICAgICAgIE1VTDQod2d0LCBzcmMwX3IsIHdndCwgc3JjMV9yLCB3Z3QsIHNyYzJfciwgd2d0LCBzcmMzX3IsIHRtcDAsIHRtcDEsCisgICAgICAgICAgICAgdG1wMiwgdG1wMyk7CisgICAgICAgIE1VTDQod2d0LCBzcmM0X3IsIHdndCwgc3JjNV9yLCB3Z3QsIHNyYzZfciwgd2d0LCBzcmM3X3IsIHRtcDQsIHRtcDUsCisgICAgICAgICAgICAgdG1wNiwgdG1wNyk7CisgICAgICAgIEFERFNfU0g0X1NIKHRtcDAsIG9mZnNldCwgdG1wMSwgb2Zmc2V0LCB0bXAyLCBvZmZzZXQsIHRtcDMsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIEFERFNfU0g0X1NIKHRtcDQsIG9mZnNldCwgdG1wNSwgb2Zmc2V0LCB0bXA2LCBvZmZzZXQsIHRtcDcsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNyk7CisgICAgICAgIE1BWElfU0g4X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIDApOworICAgICAgICBTUkxSX0g4X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIGRlbm9tKTsKKyAgICAgICAgU0FUX1VIOF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCA3KTsKKyAgICAgICAgUENLRVZfQjRfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wNSwgdG1wNCwgdG1wNywgdG1wNiwgc3JjMCwgc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgc3JjMiwgc3JjMyk7CisgICAgICAgIFNUOHg4X1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRhdGEsIHN0cmlkZSk7CisgICAgICAgIGRhdGEgKz0gOCAqIHN0cmlkZTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19iaXdndF80eDJfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCitzdGF0aWMgdm9pZCBhdmNfYml3Z3RfNHgyX21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvZzJfZGVub20sIGludDMyX3Qgc3JjX3dlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3dlaWdodCwgaW50MzJfdCBvZmZzZXRfaW4pCiB7Ci0gICAgdWludDMyX3QgbG9hZDAsIGxvYWQxLCBvdXQwLCBvdXQxOwotICAgIHYxNmk4IHNyY193Z3QsIGRzdF93Z3QsIHdndDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBkc3QwLCBkc3QxOwotICAgIHY4aTE2IHRlbXAwLCB0ZW1wMSwgZGVub20sIG9mZnNldCwgYWRkX3ZhbDsKLSAgICBpbnQzMl90IHZhbCA9IDEyOCAqIChzcmNfd2VpZ2h0ICsgZHN0X3dlaWdodCk7CisgICAgdWludDMyX3QgdHAwLCB0cDE7CisgICAgdjE2aTggc3JjX3dndCwgZHN0X3dndCwgd2d0LCB2ZWMwOworICAgIHYxNnU4IHNyYzAgPSB7IDAgfSwgZHN0MCA9IHsgMCB9OworICAgIHY4aTE2IHRtcDAsIGRlbm9tLCBvZmZzZXQsIG1heDI1NSA9IF9fbXNhX2xkaV9oKDI1NSk7CiAKLSAgICBvZmZzZXRfaW4gPSAoKG9mZnNldF9pbiArIDEpIHwgMSkgPDwgbG9nMl9kZW5vbTsKKyAgICBvZmZzZXRfaW4gPSAodW5zaWduZWQpICgob2Zmc2V0X2luICsgMSkgfCAxKSA8PCBsb2cyX2Rlbm9tOworICAgIG9mZnNldF9pbiArPSAoMTI4ICogKHNyY193ZWlnaHQgKyBkc3Rfd2VpZ2h0KSk7CiAKICAgICBzcmNfd2d0ID0gX19tc2FfZmlsbF9iKHNyY193ZWlnaHQpOwogICAgIGRzdF93Z3QgPSBfX21zYV9maWxsX2IoZHN0X3dlaWdodCk7CiAgICAgb2Zmc2V0ID0gX19tc2FfZmlsbF9oKG9mZnNldF9pbik7CiAgICAgZGVub20gPSBfX21zYV9maWxsX2gobG9nMl9kZW5vbSArIDEpOwotICAgIGFkZF92YWwgPSBfX21zYV9maWxsX2godmFsKTsKLSAgICBvZmZzZXQgKz0gYWRkX3ZhbDsKIAogICAgIHdndCA9IF9fbXNhX2lsdmV2X2IoZHN0X3dndCwgc3JjX3dndCk7CiAKLSAgICBsb2FkMCA9IExXKHNyYyk7Ci0gICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgbG9hZDEgPSBMVyhzcmMpOwotCi0gICAgc3JjMCA9ICh2MTZpOCkgX19tc2FfZmlsbF93KGxvYWQwKTsKLSAgICBzcmMxID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDEpOwotCi0gICAgbG9hZDAgPSBMVyhkc3QpOwotICAgIGxvYWQxID0gTFcoZHN0ICsgZHN0X3N0cmlkZSk7Ci0KLSAgICBkc3QwID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDApOwotICAgIGRzdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfdyhsb2FkMSk7Ci0KLSAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBkc3QwLCBkc3QxKTsKLSAgICBJTFZSX0IyX1NIKGRzdDAsIHNyYzAsIGRzdDEsIHNyYzEsIHRlbXAwLCB0ZW1wMSk7Ci0KLSAgICB0ZW1wMCA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgKHYxNmk4KSB0ZW1wMCk7Ci0gICAgdGVtcDEgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsICh2MTZpOCkgdGVtcDEpOwotCi0gICAgdGVtcDAgPj49IGRlbm9tOwotICAgIHRlbXAxID4+PSBkZW5vbTsKLQotICAgIENMSVBfU0gyXzBfMjU1KHRlbXAwLCB0ZW1wMSk7Ci0gICAgUENLRVZfQjJfU0IodGVtcDAsIHRlbXAwLCB0ZW1wMSwgdGVtcDEsIGRzdDAsIGRzdDEpOwotCi0gICAgb3V0MCA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMCk7Ci0gICAgb3V0MSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MSwgMCk7Ci0gICAgU1cob3V0MCwgZHN0KTsKLSAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgICBTVyhvdXQxLCBkc3QpOworICAgIExXMihzcmMsIHN0cmlkZSwgdHAwLCB0cDEpOworICAgIElOU0VSVF9XMl9VQih0cDAsIHRwMSwgc3JjMCk7CisgICAgTFcyKGRzdCwgc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgSU5TRVJUX1cyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICBYT1JJX0IyXzEyOF9VQihzcmMwLCBkc3QwKTsKKyAgICB2ZWMwID0gKHYxNmk4KSBfX21zYV9pbHZyX2IoKHYxNmk4KSBkc3QwLCAodjE2aTgpIHNyYzApOworICAgIHRtcDAgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzApOworICAgIHRtcDAgPj49IGRlbm9tOworICAgIHRtcDAgPSBfX21zYV9tYXhpX3NfaCh0bXAwLCAwKTsKKyAgICB0bXAwID0gX19tc2FfbWluX3NfaChtYXgyNTUsIHRtcDApOworICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAwLCAodjE2aTgpIHRtcDApOworICAgIFNUNHgyX1VCKGRzdDAsIGRzdCwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Jpd2d0XzR4NG11bHRpcGxlX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3dlaWdodCwgaW50MzJfdCBkc3Rfd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldF9pbikKK3N0YXRpYyB2b2lkIGF2Y19iaXdndF80eDRfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG9nMl9kZW5vbSwgaW50MzJfdCBzcmNfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfd2VpZ2h0LCBpbnQzMl90IG9mZnNldF9pbikKIHsKLSAgICB1aW50OF90IGNudDsKLSAgICB1aW50MzJfdCBsb2FkMCwgbG9hZDEsIGxvYWQyLCBsb2FkMzsKLSAgICB2MTZpOCBzcmNfd2d0LCBkc3Rfd2d0LCB3Z3Q7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotICAgIHY4aTE2IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOwotICAgIHY4aTE2IGRlbm9tLCBvZmZzZXQsIGFkZF92YWw7Ci0gICAgaW50MzJfdCB2YWwgPSAxMjggKiAoc3JjX3dlaWdodCArIGRzdF93ZWlnaHQpOworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZpOCBzcmNfd2d0LCBkc3Rfd2d0LCB3Z3QsIHZlYzAsIHZlYzE7CisgICAgdjE2dTggc3JjMCwgZHN0MDsKKyAgICB2OGkxNiB0bXAwLCB0bXAxLCBkZW5vbSwgb2Zmc2V0OwogCi0gICAgb2Zmc2V0X2luID0gKChvZmZzZXRfaW4gKyAxKSB8IDEpIDw8IGxvZzJfZGVub207CisgICAgb2Zmc2V0X2luID0gKHVuc2lnbmVkKSAoKG9mZnNldF9pbiArIDEpIHwgMSkgPDwgbG9nMl9kZW5vbTsKKyAgICBvZmZzZXRfaW4gKz0gKDEyOCAqIChzcmNfd2VpZ2h0ICsgZHN0X3dlaWdodCkpOwogCiAgICAgc3JjX3dndCA9IF9fbXNhX2ZpbGxfYihzcmNfd2VpZ2h0KTsKICAgICBkc3Rfd2d0ID0gX19tc2FfZmlsbF9iKGRzdF93ZWlnaHQpOwogICAgIG9mZnNldCA9IF9fbXNhX2ZpbGxfaChvZmZzZXRfaW4pOwogICAgIGRlbm9tID0gX19tc2FfZmlsbF9oKGxvZzJfZGVub20gKyAxKTsKLSAgICBhZGRfdmFsID0gX19tc2FfZmlsbF9oKHZhbCk7Ci0gICAgb2Zmc2V0ICs9IGFkZF92YWw7CiAKICAgICB3Z3QgPSBfX21zYV9pbHZldl9iKGRzdF93Z3QsIHNyY193Z3QpOwogCi0gICAgZm9yIChjbnQgPSBoZWlnaHQgLyA0OyBjbnQtLTspIHsKLSAgICAgICAgTFc0KHNyYywgc3JjX3N0cmlkZSwgbG9hZDAsIGxvYWQxLCBsb2FkMiwgbG9hZDMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBzcmMwID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDApOwotICAgICAgICBzcmMxID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDEpOwotICAgICAgICBzcmMyID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDIpOwotICAgICAgICBzcmMzID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDMpOwotCi0gICAgICAgIExXNChkc3QsIGRzdF9zdHJpZGUsIGxvYWQwLCBsb2FkMSwgbG9hZDIsIGxvYWQzKTsKLQotICAgICAgICBkc3QwID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDApOwotICAgICAgICBkc3QxID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDEpOwotICAgICAgICBkc3QyID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDIpOwotICAgICAgICBkc3QzID0gKHYxNmk4KSBfX21zYV9maWxsX3cobG9hZDMpOwotCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBYT1JJX0I0XzEyOF9TQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgSUxWUl9CNF9TSChkc3QwLCBzcmMwLCBkc3QxLCBzcmMxLCBkc3QyLCBzcmMyLCBkc3QzLCBzcmMzLAotICAgICAgICAgICAgICAgICAgIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsKLQotICAgICAgICB0ZW1wMCA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgKHYxNmk4KSB0ZW1wMCk7Ci0gICAgICAgIHRlbXAxID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCAodjE2aTgpIHRlbXAxKTsKLSAgICAgICAgdGVtcDIgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsICh2MTZpOCkgdGVtcDIpOwotICAgICAgICB0ZW1wMyA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgKHYxNmk4KSB0ZW1wMyk7Ci0KLSAgICAgICAgU1JBXzRWKHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCBkZW5vbSk7Ci0gICAgICAgIENMSVBfU0g0XzBfMjU1KHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgUENLRVZfU1Q0eDRfVUIodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBMVzQoc3JjLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMCk7CisgICAgTFc0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOworICAgIFhPUklfQjJfMTI4X1VCKHNyYzAsIGRzdDApOworICAgIElMVlJMX0IyX1NCKGRzdDAsIHNyYzAsIHZlYzAsIHZlYzEpOworICAgIHRtcDAgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzApOworICAgIHRtcDEgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzEpOworICAgIHRtcDAgPj49IGRlbm9tOworICAgIHRtcDEgPj49IGRlbm9tOworICAgIENMSVBfU0gyXzBfMjU1KHRtcDAsIHRtcDEpOworICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAxLCAodjE2aTgpIHRtcDApOworICAgIFNUNHg0X1VCKGRzdDAsIGRzdDAsIDAsIDEsIDIsIDMsIGRzdCwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2Jpd2d0XzR3aWR0aF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY193ZWlnaHQsIGludDMyX3QgZHN0X3dlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0X2luKQorc3RhdGljIHZvaWQgYXZjX2Jpd2d0XzR4OF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsb2cyX2Rlbm9tLCBpbnQzMl90IHNyY193ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF93ZWlnaHQsIGludDMyX3Qgb2Zmc2V0X2luKQogewotICAgIGlmICgyID09IGhlaWdodCkgewotICAgICAgICBhdmNfYml3Z3RfNHgyX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgbG9nMl9kZW5vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3dlaWdodCwgZHN0X3dlaWdodCwgb2Zmc2V0X2luKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhdmNfYml3Z3RfNHg0bXVsdGlwbGVfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMl9kZW5vbSwgc3JjX3dlaWdodCwgZHN0X3dlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfaW4pOwotICAgIH0KLX0KKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2aTggc3JjX3dndCwgZHN0X3dndCwgd2d0LCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOworICAgIHYxNnU4IHNyYzAsIHNyYzEsIGRzdDAsIGRzdDE7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZGVub20sIG9mZnNldDsKIAotc3RhdGljIHZvaWQgYXZjX2Jpd2d0Xzh3aWR0aF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY193ZWlnaHQsIGludDMyX3QgZHN0X3dlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0X2luKQotewotICAgIHVpbnQ4X3QgY250OwotICAgIHYxNmk4IHNyY193Z3QsIGRzdF93Z3QsIHdndDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNmk4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjE2aTggb3V0MCwgb3V0MTsKLSAgICB2OGkxNiB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKLSAgICB2OGkxNiBkZW5vbSwgb2Zmc2V0LCBhZGRfdmFsOwotICAgIGludDMyX3QgdmFsID0gMTI4ICogKHNyY193ZWlnaHQgKyBkc3Rfd2VpZ2h0KTsKLQotICAgIG9mZnNldF9pbiA9ICgob2Zmc2V0X2luICsgMSkgfCAxKSA8PCBsb2cyX2Rlbm9tOworICAgIG9mZnNldF9pbiA9ICh1bnNpZ25lZCkgKChvZmZzZXRfaW4gKyAxKSB8IDEpIDw8IGxvZzJfZGVub207CisgICAgb2Zmc2V0X2luICs9ICgxMjggKiAoc3JjX3dlaWdodCArIGRzdF93ZWlnaHQpKTsKIAogICAgIHNyY193Z3QgPSBfX21zYV9maWxsX2Ioc3JjX3dlaWdodCk7CiAgICAgZHN0X3dndCA9IF9fbXNhX2ZpbGxfYihkc3Rfd2VpZ2h0KTsKICAgICBvZmZzZXQgPSBfX21zYV9maWxsX2gob2Zmc2V0X2luKTsKICAgICBkZW5vbSA9IF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tICsgMSk7Ci0gICAgYWRkX3ZhbCA9IF9fbXNhX2ZpbGxfaCh2YWwpOwotICAgIG9mZnNldCArPSBhZGRfdmFsOworICAgIHdndCA9IF9fbXNhX2lsdmV2X2IoZHN0X3dndCwgc3JjX3dndCk7CisKKyAgICBMVzQoc3JjLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgc3JjICs9IDQgKiBzdHJpZGU7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMCk7CisgICAgTFc0KHNyYywgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIHNyYzEpOworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICBMVzQoZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDEpOworICAgIFhPUklfQjRfMTI4X1VCKHNyYzAsIHNyYzEsIGRzdDAsIGRzdDEpOworICAgIElMVlJMX0IyX1NCKGRzdDAsIHNyYzAsIHZlYzAsIHZlYzEpOworICAgIElMVlJMX0IyX1NCKGRzdDEsIHNyYzEsIHZlYzIsIHZlYzMpOworICAgIHRtcDAgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzApOworICAgIHRtcDEgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzEpOworICAgIHRtcDIgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzIpOworICAgIHRtcDMgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzMpOworICAgIFNSQV80Vih0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBkZW5vbSk7CisgICAgQ0xJUF9TSDRfMF8yNTUodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgZHN0MCwgZHN0MSk7CisgICAgU1Q0eDhfVUIoZHN0MCwgZHN0MSwgZHN0LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBhdmNfYml3Z3RfOHg0X21zYSh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvZzJfZGVub20sIGludDMyX3Qgc3JjX3dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3dlaWdodCwgaW50MzJfdCBvZmZzZXRfaW4pCit7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNmk4IHNyY193Z3QsIGRzdF93Z3QsIHdndCwgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBkc3QwLCBkc3QxOworICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIGRlbm9tLCBvZmZzZXQ7CisKKyAgICBvZmZzZXRfaW4gPSAodW5zaWduZWQpICgob2Zmc2V0X2luICsgMSkgfCAxKSA8PCBsb2cyX2Rlbm9tOworICAgIG9mZnNldF9pbiArPSAoMTI4ICogKHNyY193ZWlnaHQgKyBkc3Rfd2VpZ2h0KSk7CisKKyAgICBzcmNfd2d0ID0gX19tc2FfZmlsbF9iKHNyY193ZWlnaHQpOworICAgIGRzdF93Z3QgPSBfX21zYV9maWxsX2IoZHN0X3dlaWdodCk7CisgICAgb2Zmc2V0ID0gX19tc2FfZmlsbF9oKG9mZnNldF9pbik7CisgICAgZGVub20gPSBfX21zYV9maWxsX2gobG9nMl9kZW5vbSArIDEpOwogCiAgICAgd2d0ID0gX19tc2FfaWx2ZXZfYihkc3Rfd2d0LCBzcmNfd2d0KTsKIAotICAgIGZvciAoY250ID0gaGVpZ2h0IC8gNDsgY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBMRF9TQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIFhPUklfQjRfMTI4X1NCKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBJTFZSX0I0X1NIKGRzdDAsIHNyYzAsIGRzdDEsIHNyYzEsIGRzdDIsIHNyYzIsIGRzdDMsIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMpOwotCi0gICAgICAgIHRlbXAwID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCAodjE2aTgpIHRlbXAwKTsKLSAgICAgICAgdGVtcDEgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsICh2MTZpOCkgdGVtcDEpOwotICAgICAgICB0ZW1wMiA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgKHYxNmk4KSB0ZW1wMik7Ci0gICAgICAgIHRlbXAzID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCAodjE2aTgpIHRlbXAzKTsKLQotICAgICAgICBTUkFfNFYodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIGRlbm9tKTsKLSAgICAgICAgQ0xJUF9TSDRfMF8yNTUodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMpOwotICAgICAgICBQQ0tFVl9CMl9TQih0ZW1wMSwgdGVtcDAsIHRlbXAzLCB0ZW1wMiwgb3V0MCwgb3V0MSk7Ci0gICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSA0ICogZHN0X3N0cmlkZTsKLSAgICB9CisgICAgTEQ0KHNyYywgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgc3JjMCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBzcmMxKTsKKyAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworICAgIFhPUklfQjRfMTI4X1VCKHNyYzAsIHNyYzEsIGRzdDAsIGRzdDEpOworICAgIElMVlJMX0IyX1NCKGRzdDAsIHNyYzAsIHZlYzAsIHZlYzEpOworICAgIElMVlJMX0IyX1NCKGRzdDEsIHNyYzEsIHZlYzIsIHZlYzMpOworICAgIHRtcDAgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzApOworICAgIHRtcDEgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzEpOworICAgIHRtcDIgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzIpOworICAgIHRtcDMgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzMpOworICAgIFNSQV80Vih0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBkZW5vbSk7CisgICAgQ0xJUF9TSDRfMF8yNTUodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgZHN0MCwgZHN0MSk7CisgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfYml3Z3RfMTZ3aWR0aF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgbG9nMl9kZW5vbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY193ZWlnaHQsIGludDMyX3QgZHN0X3dlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldF9pbikKK3N0YXRpYyB2b2lkIGF2Y19iaXdndF84eDhfbXNhKHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG9nMl9kZW5vbSwgaW50MzJfdCBzcmNfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfd2VpZ2h0LCBpbnQzMl90IG9mZnNldF9pbikKK3sKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2aTggc3JjX3dndCwgZHN0X3dndCwgd2d0LCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgZGVub20sIG9mZnNldDsKKworICAgIG9mZnNldF9pbiA9ICh1bnNpZ25lZCkgKChvZmZzZXRfaW4gKyAxKSB8IDEpIDw8IGxvZzJfZGVub207CisgICAgb2Zmc2V0X2luICs9ICgxMjggKiAoc3JjX3dlaWdodCArIGRzdF93ZWlnaHQpKTsKKworICAgIHNyY193Z3QgPSBfX21zYV9maWxsX2Ioc3JjX3dlaWdodCk7CisgICAgZHN0X3dndCA9IF9fbXNhX2ZpbGxfYihkc3Rfd2VpZ2h0KTsKKyAgICBvZmZzZXQgPSBfX21zYV9maWxsX2gob2Zmc2V0X2luKTsKKyAgICBkZW5vbSA9IF9fbXNhX2ZpbGxfaChsb2cyX2Rlbm9tICsgMSk7CisgICAgd2d0ID0gX19tc2FfaWx2ZXZfYihkc3Rfd2d0LCBzcmNfd2d0KTsKKworICAgIExENChzcmMsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIHNyYzApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgc3JjMSk7CisgICAgTEQ0KHNyYyArIDQgKiBzdHJpZGUsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIHNyYzIpOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgc3JjMyk7CisgICAgTEQ0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICBMRDQoZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0Mik7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QzKTsKKyAgICBYT1JJX0I4XzEyOF9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICBJTFZSTF9CMl9TQihkc3QwLCBzcmMwLCB2ZWMwLCB2ZWMxKTsKKyAgICBJTFZSTF9CMl9TQihkc3QxLCBzcmMxLCB2ZWMyLCB2ZWMzKTsKKyAgICBJTFZSTF9CMl9TQihkc3QyLCBzcmMyLCB2ZWM0LCB2ZWM1KTsKKyAgICBJTFZSTF9CMl9TQihkc3QzLCBzcmMzLCB2ZWM2LCB2ZWM3KTsKKyAgICB0bXAwID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMwKTsKKyAgICB0bXAxID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxKTsKKyAgICB0bXAyID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMyKTsKKyAgICB0bXAzID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMzKTsKKyAgICB0bXA0ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM0KTsKKyAgICB0bXA1ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM1KTsKKyAgICB0bXA2ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM2KTsKKyAgICB0bXA3ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM3KTsKKyAgICBTUkFfNFYodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZGVub20pOworICAgIFNSQV80Vih0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCBkZW5vbSk7CisgICAgQ0xJUF9TSDRfMF8yNTUodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgQ0xJUF9TSDRfMF8yNTUodG1wNCwgdG1wNSwgdG1wNiwgdG1wNyk7CisgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgZHN0MCwgZHN0MSk7CisgICAgUENLRVZfQjJfVUIodG1wNSwgdG1wNCwgdG1wNywgdG1wNiwgZHN0MiwgZHN0Myk7CisgICAgU1Q4eDhfVUIoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBhdmNfYml3Z3RfOHgxNl9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbG9nMl9kZW5vbSwgaW50MzJfdCBzcmNfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3dlaWdodCwgaW50MzJfdCBvZmZzZXRfaW4pCiB7CiAgICAgdWludDhfdCBjbnQ7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyY193Z3QsIGRzdF93Z3QsIHdndDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNmk4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CiAgICAgdjhpMTYgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OwotICAgIHY4aTE2IGRlbm9tLCBvZmZzZXQsIGFkZF92YWw7Ci0gICAgaW50MzJfdCB2YWwgPSAxMjggKiAoc3JjX3dlaWdodCArIGRzdF93ZWlnaHQpOworICAgIHY4aTE2IGRlbm9tLCBvZmZzZXQ7CiAKLSAgICBvZmZzZXRfaW4gPSAoKG9mZnNldF9pbiArIDEpIHwgMSkgPDwgbG9nMl9kZW5vbTsKKyAgICBvZmZzZXRfaW4gPSAodW5zaWduZWQpICgob2Zmc2V0X2luICsgMSkgfCAxKSA8PCBsb2cyX2Rlbm9tOworICAgIG9mZnNldF9pbiArPSAoMTI4ICogKHNyY193ZWlnaHQgKyBkc3Rfd2VpZ2h0KSk7CiAKICAgICBzcmNfd2d0ID0gX19tc2FfZmlsbF9iKHNyY193ZWlnaHQpOwogICAgIGRzdF93Z3QgPSBfX21zYV9maWxsX2IoZHN0X3dlaWdodCk7CiAgICAgb2Zmc2V0ID0gX19tc2FfZmlsbF9oKG9mZnNldF9pbik7CiAgICAgZGVub20gPSBfX21zYV9maWxsX2gobG9nMl9kZW5vbSArIDEpOwotICAgIGFkZF92YWwgPSBfX21zYV9maWxsX2godmFsKTsKLSAgICBvZmZzZXQgKz0gYWRkX3ZhbDsKLQogICAgIHdndCA9IF9fbXNhX2lsdmV2X2IoZHN0X3dndCwgc3JjX3dndCk7CiAKLSAgICBmb3IgKGNudCA9IGhlaWdodCAvIDQ7IGNudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgTERfU0I0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBYT1JJX0I0XzEyOF9TQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICBmb3IgKGNudCA9IDI7IGNudC0tOykgeworICAgICAgICBMRDQoc3JjLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIHNyYyArPSA0ICogc3RyaWRlOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIHNyYzApOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIHNyYzEpOworICAgICAgICBMRDQoc3JjLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIHNyYyArPSA0ICogc3RyaWRlOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIHNyYzIpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIHNyYzMpOworICAgICAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgICAgIExENChkc3QgKyA0ICogc3RyaWRlLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0Mik7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0Myk7CisgICAgICAgIFhPUklfQjRfMTI4X1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBYT1JJX0I0XzEyOF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKICAgICAgICAgSUxWUl9CNF9TQihkc3QwLCBzcmMwLCBkc3QxLCBzcmMxLCBkc3QyLCBzcmMyLCBkc3QzLCBzcmMzLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzIsIHZlYzQsIHZlYzYpOwogICAgICAgICBJTFZMX0I0X1NCKGRzdDAsIHNyYzAsIGRzdDEsIHNyYzEsIGRzdDIsIHNyYzIsIGRzdDMsIHNyYzMsCkBAIC00MzgsMTAgKzQ3NywxMCBAQAogICAgICAgICBTUkFfNFYodGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIGRlbm9tKTsKICAgICAgICAgQ0xJUF9TSDRfMF8yNTUodGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMpOwogICAgICAgICBDTElQX1NINF8wXzI1NSh0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNyk7Ci0gICAgICAgIFBDS0VWX0I0X1NCKHRlbXAxLCB0ZW1wMCwgdGVtcDMsIHRlbXAyLCB0ZW1wNSwgdGVtcDQsIHRlbXA3LCB0ZW1wNiwKKyAgICAgICAgUENLRVZfQjRfVUIodGVtcDEsIHRlbXAwLCB0ZW1wMywgdGVtcDIsIHRlbXA1LCB0ZW1wNCwgdGVtcDcsIHRlbXA2LAogICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgU1RfU0I0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSA0ICogZHN0X3N0cmlkZTsKKyAgICAgICAgU1Q4eDhfVUIoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gOCAqIHN0cmlkZTsKICAgICB9CiB9CiAKQEAgLTY0NCw5NiArNjgzLDY5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJldGFfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWdfd2lkdGgpCiB7Ci0gICAgdjE2dTggcDJfYXN1Yl9wMCwgcTJfYXN1Yl9xMCwgcDBfYXN1Yl9xMDsKLSAgICB2MTZ1OCBhbHBoYSwgYmV0YTsKLSAgICB2MTZ1OCBpc19sZXNzX3RoYW4sIGlzX2xlc3NfdGhhbl9iZXRhLCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGE7Ci0gICAgdjE2dTggcDIsIHAxLCBwMCwgcTAsIHExLCBxMjsKLSAgICB2MTZ1OCBwM19vcmcsIHAyX29yZywgcDFfb3JnLCBwMF9vcmcsIHEwX29yZywgcTFfb3JnLCBxMl9vcmcsIHEzX29yZzsKLSAgICB2OGkxNiBwMV9vcmdfciwgcDBfb3JnX3IsIHEwX29yZ19yLCBxMV9vcmdfcjsKLSAgICB2OGkxNiBwMV9vcmdfbCwgcDBfb3JnX2wsIHEwX29yZ19sLCBxMV9vcmdfbDsKLSAgICB2OGkxNiBwMl9yID0geyAwIH07Ci0gICAgdjhpMTYgcDFfciA9IHsgMCB9OwotICAgIHY4aTE2IHAwX3IgPSB7IDAgfTsKLSAgICB2OGkxNiBxMF9yID0geyAwIH07Ci0gICAgdjhpMTYgcTFfciA9IHsgMCB9OwotICAgIHY4aTE2IHEyX3IgPSB7IDAgfTsKLSAgICB2OGkxNiBwMl9sID0geyAwIH07Ci0gICAgdjhpMTYgcDFfbCA9IHsgMCB9OwotICAgIHY4aTE2IHAwX2wgPSB7IDAgfTsKLSAgICB2OGkxNiBxMF9sID0geyAwIH07Ci0gICAgdjhpMTYgcTFfbCA9IHsgMCB9OwotICAgIHY4aTE2IHEyX2wgPSB7IDAgfTsKLSAgICB2MTZ1OCB0bXBfZmxhZzsKLSAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0KLSAgICBhbHBoYSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGFscGhhX2luKTsKLSAgICBiZXRhID0gKHYxNnU4KSBfX21zYV9maWxsX2IoYmV0YV9pbik7CisgICAgdjE2dTggcDBfYXN1Yl9xMCwgcDFfYXN1Yl9wMCwgcTFfYXN1Yl9xMDsKKyAgICB2MTZ1OCBpc19sZXNzX3RoYW4sIGlzX2xlc3NfdGhhbl9iZXRhLCBpc19sZXNzX3RoYW5fYWxwaGE7CisgICAgdjE2dTggcDFfb3JnLCBwMF9vcmcsIHEwX29yZywgcTFfb3JnOwogCiAgICAgTERfVUI0KGRhdGEgLSAoaW1nX3dpZHRoIDw8IDEpLCBpbWdfd2lkdGgsIHAxX29yZywgcDBfb3JnLCBxMF9vcmcsIHExX29yZyk7CiAKLSAgICB7Ci0gICAgICAgIHYxNnU4IHAxX2FzdWJfcDAsIHExX2FzdWJfcTAsIGlzX2xlc3NfdGhhbl9hbHBoYTsKKyAgICBwMF9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocDBfb3JnLCBxMF9vcmcpOworICAgIHAxX2FzdWJfcDAgPSBfX21zYV9hc3ViX3VfYihwMV9vcmcsIHAwX29yZyk7CisgICAgcTFfYXN1Yl9xMCA9IF9fbXNhX2FzdWJfdV9iKHExX29yZywgcTBfb3JnKTsKIAotICAgICAgICBwMF9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocDBfb3JnLCBxMF9vcmcpOwotICAgICAgICBwMV9hc3ViX3AwID0gX19tc2FfYXN1Yl91X2IocDFfb3JnLCBwMF9vcmcpOwotICAgICAgICBxMV9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocTFfb3JnLCBxMF9vcmcpOwotCi0gICAgICAgIGlzX2xlc3NfdGhhbl9hbHBoYSA9IChwMF9hc3ViX3EwIDwgYWxwaGEpOwotICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMV9hc3ViX3AwIDwgYmV0YSk7Ci0gICAgICAgIGlzX2xlc3NfdGhhbiA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuX2FscGhhOwotICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChxMV9hc3ViX3EwIDwgYmV0YSk7Ci0gICAgICAgIGlzX2xlc3NfdGhhbiA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwotICAgIH0KKyAgICBpc19sZXNzX3RoYW5fYWxwaGEgPSAocDBfYXN1Yl9xMCA8IGFscGhhX2luKTsKKyAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMV9hc3ViX3AwIDwgYmV0YV9pbik7CisgICAgaXNfbGVzc190aGFuID0gaXNfbGVzc190aGFuX2JldGEgJiBpc19sZXNzX3RoYW5fYWxwaGE7CisgICAgaXNfbGVzc190aGFuX2JldGEgPSAocTFfYXN1Yl9xMCA8IGJldGFfaW4pOworICAgIGlzX2xlc3NfdGhhbiA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwogCiAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoaXNfbGVzc190aGFuKSkgewotICAgICAgICBxMl9vcmcgPSBMRF9VQihkYXRhICsgKDIgKiBpbWdfd2lkdGgpKTsKLSAgICAgICAgcDNfb3JnID0gTERfVUIoZGF0YSAtIChpbWdfd2lkdGggPDwgMikpOwotICAgICAgICBwMl9vcmcgPSBMRF9VQihkYXRhIC0gKDMgKiBpbWdfd2lkdGgpKTsKKyAgICAgICAgdjE2dTggcDJfYXN1Yl9wMCwgcTJfYXN1Yl9xMCwgcDAsIHEwLCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGE7CisgICAgICAgIHY4aTE2IHAwX3IgPSB7IDAgfTsKKyAgICAgICAgdjhpMTYgcTBfciA9IHsgMCB9OworICAgICAgICB2OGkxNiBwMF9sID0geyAwIH07CisgICAgICAgIHY4aTE2IHEwX2wgPSB7IDAgfTsKKyAgICAgICAgdjE2aTggemVybyA9IHsgMCB9OworICAgICAgICB2OGkxNiBwMV9vcmdfciwgcDBfb3JnX3IsIHEwX29yZ19yLCBxMV9vcmdfcjsKKyAgICAgICAgdjhpMTYgcDFfb3JnX2wsIHAwX29yZ19sLCBxMF9vcmdfbCwgcTFfb3JnX2w7CisgICAgICAgIHYxNnU4IHEyX29yZyA9IExEX1VCKGRhdGEgKyAoMiAqIGltZ193aWR0aCkpOworICAgICAgICB2MTZ1OCBwMl9vcmcgPSBMRF9VQihkYXRhIC0gKDMgKiBpbWdfd2lkdGgpKTsKKyAgICAgICAgdjE2dTggdG1wX2ZsYWcgPSAodjE2dTgpX19tc2FfZmlsbF9iKChhbHBoYV9pbiA+PiAyKSArIDIpOwogCiAgICAgICAgIFVOUENLX1VCX1NIKHAxX29yZywgcDFfb3JnX3IsIHAxX29yZ19sKTsKICAgICAgICAgVU5QQ0tfVUJfU0gocDBfb3JnLCBwMF9vcmdfciwgcDBfb3JnX2wpOwogICAgICAgICBVTlBDS19VQl9TSChxMF9vcmcsIHEwX29yZ19yLCBxMF9vcmdfbCk7CiAKLSAgICAgICAgdG1wX2ZsYWcgPSBhbHBoYSA+PiAyOwotICAgICAgICB0bXBfZmxhZyA9IHRtcF9mbGFnICsgMjsKICAgICAgICAgdG1wX2ZsYWcgPSAocDBfYXN1Yl9xMCA8IHRtcF9mbGFnKTsKIAogICAgICAgICBwMl9hc3ViX3AwID0gX19tc2FfYXN1Yl91X2IocDJfb3JnLCBwMF9vcmcpOwotICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMl9hc3ViX3AwIDwgYmV0YSk7CisgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gKHAyX2FzdWJfcDAgPCBiZXRhX2luKTsKICAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSBpc19sZXNzX3RoYW5fYmV0YSAmIHRtcF9mbGFnOwogICAgICAgICBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEgPSBfX21zYV94b3JpX2IoaXNfbGVzc190aGFuX2JldGEsIDB4ZmYpOwogICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwogICAgICAgICBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEgPSBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEgJiBpc19sZXNzX3RoYW47Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHY4dTE2IGlzX2xlc3NfdGhhbl9iZXRhX2wsIGlzX2xlc3NfdGhhbl9iZXRhX3I7CiAKLSAgICAgICAgICAgIHExX29yZ19yID0gKHY4aTE2KSBfX21zYV9pbHZyX2IoemVybywgKHYxNmk4KSBxMV9vcmcpOworICAgICAgICBxMV9vcmdfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOCkgcTFfb3JnKTsKKyAgICAgICAgcTFfb3JnX2wgPSAodjhpMTYpIF9fbXNhX2lsdmxfYih6ZXJvLCAodjE2aTgpIHExX29yZyk7CiAKLSAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhX3IgPQotICAgICAgICAgICAgICAgICh2OHUxNikgX19tc2Ffc2xkaV9iKCh2MTZpOCkgaXNfbGVzc190aGFuX2JldGEsIHplcm8sIDgpOwotICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoKHYxNnU4KSBpc19sZXNzX3RoYW5fYmV0YV9yKSkgewotICAgICAgICAgICAgICAgIHY4aTE2IHAzX29yZ19yOwotCi0gICAgICAgICAgICAgICAgSUxWUl9CMl9TSCh6ZXJvLCBwM19vcmcsIHplcm8sIHAyX29yZywgcDNfb3JnX3IsIHAyX3IpOwotICAgICAgICAgICAgICAgIEFWQ19MUEZfUDBQMVAyX09SX1EwUTFRMihwM19vcmdfciwgcDBfb3JnX3IsIHEwX29yZ19yLCBwMV9vcmdfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJfciwgcTFfb3JnX3IsIHAwX3IsIHAxX3IsIHAyX3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBxMV9vcmdfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKHplcm8sICh2MTZpOCkgcTFfb3JnKTsKLQotICAgICAgICAgICAgaXNfbGVzc190aGFuX2JldGFfbCA9Ci0gICAgICAgICAgICAgICAgKHY4dTE2KSBfX21zYV9zbGRpX2IoemVybywgKHYxNmk4KSBpc19sZXNzX3RoYW5fYmV0YSwgOCk7Ci0KLSAgICAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KCh2MTZ1OCkgaXNfbGVzc190aGFuX2JldGFfbCkpIHsKLSAgICAgICAgICAgICAgICB2OGkxNiBwM19vcmdfbDsKLQotICAgICAgICAgICAgICAgIElMVkxfQjJfU0goemVybywgcDNfb3JnLCB6ZXJvLCBwMl9vcmcsIHAzX29yZ19sLCBwMl9sKTsKLSAgICAgICAgICAgICAgICBBVkNfTFBGX1AwUDFQMl9PUl9RMFExUTIocDNfb3JnX2wsIHAwX29yZ19sLCBxMF9vcmdfbCwgcDFfb3JnX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyX2wsIHExX29yZ19sLCBwMF9sLCBwMV9sLCBwMl9sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgICAvKiBjb21iaW5lIGFuZCBzdG9yZSAqLwogICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihpc19sZXNzX3RoYW5fYmV0YSkpIHsKKyAgICAgICAgICAgIHY4aTE2IHAzX29yZ19sLCBwM19vcmdfcjsKKyAgICAgICAgICAgIHYxNnU4IHAzX29yZyA9IExEX1VCKGRhdGEgLSAoaW1nX3dpZHRoIDw8IDIpKTsKKyAgICAgICAgICAgIHYxNnU4IHAyLCBwMTsKKyAgICAgICAgICAgIHY4aTE2IHAyX3IgPSB7IDAgfTsKKyAgICAgICAgICAgIHY4aTE2IHAyX2wgPSB7IDAgfTsKKyAgICAgICAgICAgIHY4aTE2IHAxX3IgPSB7IDAgfTsKKyAgICAgICAgICAgIHY4aTE2IHAxX2wgPSB7IDAgfTsKKworICAgICAgICAgICAgSUxWUl9CMl9TSCh6ZXJvLCBwM19vcmcsIHplcm8sIHAyX29yZywgcDNfb3JnX3IsIHAyX3IpOworICAgICAgICAgICAgQVZDX0xQRl9QMFAxUDJfT1JfUTBRMVEyKHAzX29yZ19yLCBwMF9vcmdfciwgcTBfb3JnX3IsIHAxX29yZ19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyX3IsIHExX29yZ19yLCBwMF9yLCBwMV9yLCBwMl9yKTsKKworICAgICAgICAgICAgSUxWTF9CMl9TSCh6ZXJvLCBwM19vcmcsIHplcm8sIHAyX29yZywgcDNfb3JnX2wsIHAyX2wpOworICAgICAgICAgICAgQVZDX0xQRl9QMFAxUDJfT1JfUTBRMVEyKHAzX29yZ19sLCBwMF9vcmdfbCwgcTBfb3JnX2wsIHAxX29yZ19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyX2wsIHExX29yZ19sLCBwMF9sLCBwMV9sLCBwMl9sKTsKKwogICAgICAgICAgICAgUENLRVZfQjNfVUIocDBfbCwgcDBfciwgcDFfbCwgcDFfciwgcDJfbCwgcDJfciwgcDAsIHAxLCBwMik7CiAKICAgICAgICAgICAgIHAwX29yZyA9IF9fbXNhX2JtbnpfdihwMF9vcmcsIHAwLCBpc19sZXNzX3RoYW5fYmV0YSk7CkBAIC03NDMsNjIgKzc1NSw0MiBAQAogICAgICAgICAgICAgU1RfVUIocDFfb3JnLCBkYXRhIC0gKDIgKiBpbWdfd2lkdGgpKTsKICAgICAgICAgICAgIFNUX1VCKHAyX29yZywgZGF0YSAtICgzICogaW1nX3dpZHRoKSk7CiAgICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgdjh1MTYgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhX3IsIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9sOwogCi0gICAgICAgICAgICBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfciA9Ci0gICAgICAgICAgICAgICAgKHY4dTE2KSBfX21zYV9zbGRpX2IoKHYxNmk4KSBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEsIHplcm8sIDgpOwotICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoKHYxNnU4KSBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfcikpIHsKLSAgICAgICAgICAgICAgICBBVkNfTFBGX1AwX09SX1EwKHAwX29yZ19yLCBxMV9vcmdfciwgcDFfb3JnX3IsIHAwX3IpOwotICAgICAgICAgICAgfQorICAgICAgICBBVkNfTFBGX1AwX09SX1EwKHAwX29yZ19yLCBxMV9vcmdfciwgcDFfb3JnX3IsIHAwX3IpOworICAgICAgICBBVkNfTFBGX1AwX09SX1EwKHAwX29yZ19sLCBxMV9vcmdfbCwgcDFfb3JnX2wsIHAwX2wpOwogCi0gICAgICAgICAgICBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfbCA9Ci0gICAgICAgICAgICAgICAgKHY4dTE2KSBfX21zYV9zbGRpX2IoemVybywgKHYxNmk4KSBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEsIDgpOwotICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoKHYxNnU4KSBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfbCkpIHsKLSAgICAgICAgICAgICAgICBBVkNfTFBGX1AwX09SX1EwKHAwX29yZ19sLCBxMV9vcmdfbCwgcDFfb3JnX2wsIHAwX2wpOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIC8qIGNvbWJpbmUgKi8KLSAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YobmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhKSkgewotICAgICAgICAgICAgcDAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBwMF9sLCAodjE2aTgpIHAwX3IpOwotICAgICAgICAgICAgcDBfb3JnID0gX19tc2FfYm1uel92KHAwX29yZywgcDAsIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSk7Ci0gICAgICAgIH0KKyAgICAgICAgcDAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBwMF9sLCAodjE2aTgpIHAwX3IpOworICAgICAgICBwMF9vcmcgPSBfX21zYV9ibW56X3YocDBfb3JnLCBwMCwgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhKTsKIAogICAgICAgICBTVF9VQihwMF9vcmcsIGRhdGEgLSBpbWdfd2lkdGgpOwogCiAgICAgICAgIC8qIGlmICh0bXBGbGFnICYmICh1bnNpZ25lZClBQlMocTItcTApIDwgdGhyZXNob2xkcy0+YmV0YV9pbikgKi8KLSAgICAgICAgcTNfb3JnID0gTERfVUIoZGF0YSArICgzICogaW1nX3dpZHRoKSk7CiAgICAgICAgIHEyX2FzdWJfcTAgPSBfX21zYV9hc3ViX3VfYihxMl9vcmcsIHEwX29yZyk7Ci0gICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gKHEyX2FzdWJfcTAgPCBiZXRhKTsKKyAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSAocTJfYXN1Yl9xMCA8IGJldGFfaW4pOwogICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IGlzX2xlc3NfdGhhbl9iZXRhICYgdG1wX2ZsYWc7CiAgICAgICAgIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSA9IF9fbXNhX3hvcmlfYihpc19sZXNzX3RoYW5fYmV0YSwgMHhmZik7CiAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gaXNfbGVzc190aGFuX2JldGEgJiBpc19sZXNzX3RoYW47CiAgICAgICAgIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSA9IG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbjsKIAotICAgICAgICB7Ci0gICAgICAgICAgICB2OHUxNiBpc19sZXNzX3RoYW5fYmV0YV9sLCBpc19sZXNzX3RoYW5fYmV0YV9yOwotICAgICAgICAgICAgaXNfbGVzc190aGFuX2JldGFfciA9Ci0gICAgICAgICAgICAgICAgKHY4dTE2KSBfX21zYV9zbGRpX2IoKHYxNmk4KSBpc19sZXNzX3RoYW5fYmV0YSwgemVybywgOCk7Ci0gICAgICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdigodjE2dTgpIGlzX2xlc3NfdGhhbl9iZXRhX3IpKSB7Ci0gICAgICAgICAgICAgICAgdjhpMTYgcTNfb3JnX3I7Ci0KLSAgICAgICAgICAgICAgICBJTFZSX0IyX1NIKHplcm8sIHEzX29yZywgemVybywgcTJfb3JnLCBxM19vcmdfciwgcTJfcik7Ci0gICAgICAgICAgICAgICAgQVZDX0xQRl9QMFAxUDJfT1JfUTBRMVEyKHEzX29yZ19yLCBxMF9vcmdfciwgcDBfb3JnX3IsIHExX29yZ19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxMl9yLCBwMV9vcmdfciwgcTBfciwgcTFfciwgcTJfcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YV9sID0KLSAgICAgICAgICAgICAgICAodjh1MTYpIF9fbXNhX3NsZGlfYih6ZXJvLCAodjE2aTgpIGlzX2xlc3NfdGhhbl9iZXRhLCA4KTsKLSAgICAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KCh2MTZ1OCkgaXNfbGVzc190aGFuX2JldGFfbCkpIHsKLSAgICAgICAgICAgICAgICB2OGkxNiBxM19vcmdfbDsKLQotICAgICAgICAgICAgICAgIElMVkxfQjJfU0goemVybywgcTNfb3JnLCB6ZXJvLCBxMl9vcmcsIHEzX29yZ19sLCBxMl9sKTsKLSAgICAgICAgICAgICAgICBBVkNfTFBGX1AwUDFQMl9PUl9RMFExUTIocTNfb3JnX2wsIHEwX29yZ19sLCBwMF9vcmdfbCwgcTFfb3JnX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEyX2wsIHAxX29yZ19sLCBxMF9sLCBxMV9sLCBxMl9sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCiAgICAgICAgIC8qIGNvbWJpbmUgYW5kIHN0b3JlICovCiAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KGlzX2xlc3NfdGhhbl9iZXRhKSkgeworICAgICAgICAgICAgdjhpMTYgcTNfb3JnX3IsIHEzX29yZ19sOworICAgICAgICAgICAgdjE2dTggcTNfb3JnID0gTERfVUIoZGF0YSArICgzICogaW1nX3dpZHRoKSk7CisgICAgICAgICAgICB2MTZ1OCBxMSwgcTI7CisgICAgICAgICAgICB2OGkxNiBxMl9yID0geyAwIH07CisgICAgICAgICAgICB2OGkxNiBxMl9sID0geyAwIH07CisgICAgICAgICAgICB2OGkxNiBxMV9yID0geyAwIH07CisgICAgICAgICAgICB2OGkxNiBxMV9sID0geyAwIH07CisKKyAgICAgICAgICAgIElMVlJfQjJfU0goemVybywgcTNfb3JnLCB6ZXJvLCBxMl9vcmcsIHEzX29yZ19yLCBxMl9yKTsKKyAgICAgICAgICAgIEFWQ19MUEZfUDBQMVAyX09SX1EwUTFRMihxM19vcmdfciwgcTBfb3JnX3IsIHAwX29yZ19yLCBxMV9vcmdfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxMl9yLCBwMV9vcmdfciwgcTBfciwgcTFfciwgcTJfcik7CisKKyAgICAgICAgICAgIElMVkxfQjJfU0goemVybywgcTNfb3JnLCB6ZXJvLCBxMl9vcmcsIHEzX29yZ19sLCBxMl9sKTsKKyAgICAgICAgICAgIEFWQ19MUEZfUDBQMVAyX09SX1EwUTFRMihxM19vcmdfbCwgcTBfb3JnX2wsIHAwX29yZ19sLCBxMV9vcmdfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxMl9sLCBwMV9vcmdfbCwgcTBfbCwgcTFfbCwgcTJfbCk7CisKICAgICAgICAgICAgIFBDS0VWX0IzX1VCKHEwX2wsIHEwX3IsIHExX2wsIHExX3IsIHEyX2wsIHEyX3IsIHEwLCBxMSwgcTIpOwogICAgICAgICAgICAgcTBfb3JnID0gX19tc2FfYm1uel92KHEwX29yZywgcTAsIGlzX2xlc3NfdGhhbl9iZXRhKTsKICAgICAgICAgICAgIHExX29yZyA9IF9fbXNhX2JtbnpfdihxMV9vcmcsIHExLCBpc19sZXNzX3RoYW5fYmV0YSk7CkBAIC04MDcsMjUgKzc5OSwxNCBAQAogICAgICAgICAgICAgU1RfVUIocTFfb3JnLCBkYXRhICsgaW1nX3dpZHRoKTsKICAgICAgICAgICAgIFNUX1VCKHEyX29yZywgZGF0YSArIDIgKiBpbWdfd2lkdGgpOwogICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHY4dTE2IG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9yLCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfbDsKLSAgICAgICAgICAgIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9yID0KLSAgICAgICAgICAgICAgICAodjh1MTYpIF9fbXNhX3NsZGlfYigodjE2aTgpIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSwgemVybywgOCk7Ci0gICAgICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdigodjE2dTgpIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9yKSkgewotICAgICAgICAgICAgICAgIEFWQ19MUEZfUDBfT1JfUTAocTBfb3JnX3IsIHAxX29yZ19yLCBxMV9vcmdfciwgcTBfcik7Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9sID0KLSAgICAgICAgICAgICAgICAodjh1MTYpIF9fbXNhX3NsZGlfYih6ZXJvLCAodjE2aTgpIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSwgOCk7Ci0gICAgICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdigodjE2dTgpIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9sKSkgewotICAgICAgICAgICAgICAgIEFWQ19MUEZfUDBfT1JfUTAocTBfb3JnX2wsIHAxX29yZ19sLCBxMV9vcmdfbCwgcTBfbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgQVZDX0xQRl9QMF9PUl9RMChxMF9vcmdfciwgcDFfb3JnX3IsIHExX29yZ19yLCBxMF9yKTsKKyAgICAgICAgQVZDX0xQRl9QMF9PUl9RMChxMF9vcmdfbCwgcDFfb3JnX2wsIHExX29yZ19sLCBxMF9sKTsKKwogICAgICAgICAvKiBjb21iaW5lICovCi0gICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSkpIHsKLSAgICAgICAgICAgIHEwID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcTBfbCwgKHYxNmk4KSBxMF9yKTsKLSAgICAgICAgICAgIHEwX29yZyA9IF9fbXNhX2JtbnpfdihxMF9vcmcsIHEwLCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEpOwotICAgICAgICB9CisgICAgICAgIHEwID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcTBfbCwgKHYxNmk4KSBxMF9yKTsKKyAgICAgICAgcTBfb3JnID0gX19tc2FfYm1uel92KHEwX29yZywgcTAsIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSk7CisKICAgICAgICAgU1RfVUIocTBfb3JnLCBkYXRhKTsKICAgICB9CiB9CkBAIC04MzUsMjkgKzgxNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiZXRhX2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW1nX3dpZHRoKQogewotICAgIHVpbnQ4X3QgKnNyYzsKKyAgICB1aW50OF90ICpzcmMgPSBkYXRhIC0gNDsKICAgICB2MTZ1OCBhbHBoYSwgYmV0YSwgcDBfYXN1Yl9xMDsKLSAgICB2MTZ1OCBpc19sZXNzX3RoYW5fYWxwaGEsIGlzX2xlc3NfdGhhbjsKLSAgICB2MTZ1OCBpc19sZXNzX3RoYW5fYmV0YSwgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhOworICAgIHYxNnU4IGlzX2xlc3NfdGhhbl9hbHBoYSwgaXNfbGVzc190aGFuLCBpc19sZXNzX3RoYW5fYmV0YTsKICAgICB2MTZ1OCBwM19vcmcsIHAyX29yZywgcDFfb3JnLCBwMF9vcmcsIHEwX29yZywgcTFfb3JnLCBxMl9vcmcsIHEzX29yZzsKLSAgICB2OGkxNiBwMV9vcmdfciwgcDBfb3JnX3IsIHEwX29yZ19yLCBxMV9vcmdfcjsKLSAgICB2OGkxNiBwMV9vcmdfbCwgcDBfb3JnX2wsIHEwX29yZ19sLCBxMV9vcmdfbDsKLSAgICB2OGkxNiBwMl9yID0geyAwIH07Ci0gICAgdjhpMTYgcDFfciA9IHsgMCB9OwotICAgIHY4aTE2IHAwX3IgPSB7IDAgfTsKLSAgICB2OGkxNiBxMF9yID0geyAwIH07Ci0gICAgdjhpMTYgcTFfciA9IHsgMCB9OwotICAgIHY4aTE2IHEyX3IgPSB7IDAgfTsKLSAgICB2OGkxNiBwMl9sID0geyAwIH07Ci0gICAgdjhpMTYgcDFfbCA9IHsgMCB9OwotICAgIHY4aTE2IHAwX2wgPSB7IDAgfTsKLSAgICB2OGkxNiBxMF9sID0geyAwIH07Ci0gICAgdjhpMTYgcTFfbCA9IHsgMCB9OwotICAgIHY4aTE2IHEyX2wgPSB7IDAgfTsKLSAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0gICAgdjE2dTggdG1wX2ZsYWc7CisgICAgdjE2dTggcDFfYXN1Yl9wMCwgcTFfYXN1Yl9xMDsKIAotICAgIHNyYyA9IGRhdGEgLSA0OworCiAgICAgewogICAgICAgICB2MTZ1OCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3OwogICAgICAgICB2MTZ1OCByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1OwpAQCAtODczLDExOSArODM4LDc3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDNfb3JnLCBwMl9vcmcsIHAxX29yZywgcDBfb3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEwX29yZywgcTFfb3JnLCBxMl9vcmcsIHEzX29yZyk7CiAgICAgfQotICAgIFVOUENLX1VCX1NIKHAxX29yZywgcDFfb3JnX3IsIHAxX29yZ19sKTsKLSAgICBVTlBDS19VQl9TSChwMF9vcmcsIHAwX29yZ19yLCBwMF9vcmdfbCk7Ci0gICAgVU5QQ0tfVUJfU0gocTBfb3JnLCBxMF9vcmdfciwgcTBfb3JnX2wpOwotICAgIFVOUENLX1VCX1NIKHExX29yZywgcTFfb3JnX3IsIHExX29yZ19sKTsKIAotICAgIC8qICBpZiAoICgodW5zaWduZWQpQUJTKHAwLXEwKSA8IHRocmVzaG9sZHMtPmFscGhhX2luKSAmJgotICAgICAgICgodW5zaWduZWQpQUJTKHAxLXAwKSA8IHRocmVzaG9sZHMtPmJldGFfaW4pICAmJgotICAgICAgICgodW5zaWduZWQpQUJTKHExLXEwKSA8IHRocmVzaG9sZHMtPmJldGFfaW4pICkgICAqLwotICAgIHsKLSAgICAgICAgdjE2dTggcDFfYXN1Yl9wMCwgcTFfYXN1Yl9xMDsKKyAgICBwMF9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocDBfb3JnLCBxMF9vcmcpOworICAgIHAxX2FzdWJfcDAgPSBfX21zYV9hc3ViX3VfYihwMV9vcmcsIHAwX29yZyk7CisgICAgcTFfYXN1Yl9xMCA9IF9fbXNhX2FzdWJfdV9iKHExX29yZywgcTBfb3JnKTsKIAotICAgICAgICBwMF9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocDBfb3JnLCBxMF9vcmcpOwotICAgICAgICBwMV9hc3ViX3AwID0gX19tc2FfYXN1Yl91X2IocDFfb3JnLCBwMF9vcmcpOwotICAgICAgICBxMV9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocTFfb3JnLCBxMF9vcmcpOworICAgIGFscGhhID0gKHYxNnU4KSBfX21zYV9maWxsX2IoYWxwaGFfaW4pOworICAgIGJldGEgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihiZXRhX2luKTsKIAotICAgICAgICBhbHBoYSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGFscGhhX2luKTsKLSAgICAgICAgYmV0YSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGJldGFfaW4pOwotCi0gICAgICAgIGlzX2xlc3NfdGhhbl9hbHBoYSA9IChwMF9hc3ViX3EwIDwgYWxwaGEpOwotICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMV9hc3ViX3AwIDwgYmV0YSk7Ci0gICAgICAgIGlzX2xlc3NfdGhhbiA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuX2FscGhhOwotICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChxMV9hc3ViX3EwIDwgYmV0YSk7Ci0gICAgICAgIGlzX2xlc3NfdGhhbiA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwotICAgIH0KKyAgICBpc19sZXNzX3RoYW5fYWxwaGEgPSAocDBfYXN1Yl9xMCA8IGFscGhhKTsKKyAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMV9hc3ViX3AwIDwgYmV0YSk7CisgICAgaXNfbGVzc190aGFuID0gaXNfbGVzc190aGFuX2JldGEgJiBpc19sZXNzX3RoYW5fYWxwaGE7CisgICAgaXNfbGVzc190aGFuX2JldGEgPSAocTFfYXN1Yl9xMCA8IGJldGEpOworICAgIGlzX2xlc3NfdGhhbiA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwogCiAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoaXNfbGVzc190aGFuKSkgeworICAgICAgICB2OGkxNiBwMF9yID0geyAwIH07CisgICAgICAgIHY4aTE2IHEwX3IgPSB7IDAgfTsKKyAgICAgICAgdjhpMTYgcDBfbCA9IHsgMCB9OworICAgICAgICB2OGkxNiBxMF9sID0geyAwIH07CisgICAgICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICAgICAgdjE2dTggdG1wX2ZsYWcsIHAwLCBxMCwgcDJfYXN1Yl9wMCwgcTJfYXN1Yl9xMDsKKyAgICAgICAgdjE2dTggbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhOworICAgICAgICB2OGkxNiBwMV9vcmdfciwgcDBfb3JnX3IsIHEwX29yZ19yLCBxMV9vcmdfcjsKKyAgICAgICAgdjhpMTYgcDFfb3JnX2wsIHAwX29yZ19sLCBxMF9vcmdfbCwgcTFfb3JnX2w7CisKKyAgICAgICAgVU5QQ0tfVUJfU0gocDFfb3JnLCBwMV9vcmdfciwgcDFfb3JnX2wpOworICAgICAgICBVTlBDS19VQl9TSChwMF9vcmcsIHAwX29yZ19yLCBwMF9vcmdfbCk7CisgICAgICAgIFVOUENLX1VCX1NIKHEwX29yZywgcTBfb3JnX3IsIHEwX29yZ19sKTsKKyAgICAgICAgVU5QQ0tfVUJfU0gocTFfb3JnLCBxMV9vcmdfciwgcTFfb3JnX2wpOworCiAgICAgICAgIHRtcF9mbGFnID0gYWxwaGEgPj4gMjsKICAgICAgICAgdG1wX2ZsYWcgPSB0bXBfZmxhZyArIDI7CiAgICAgICAgIHRtcF9mbGFnID0gKHAwX2FzdWJfcTAgPCB0bXBfZmxhZyk7CiAKLSAgICAgICAgewotICAgICAgICAgICAgdjE2dTggcDJfYXN1Yl9wMDsKLQotICAgICAgICAgICAgcDJfYXN1Yl9wMCA9IF9fbXNhX2FzdWJfdV9iKHAyX29yZywgcDBfb3JnKTsKLSAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gKHAyX2FzdWJfcDAgPCBiZXRhKTsKLSAgICAgICAgfQorICAgICAgICBwMl9hc3ViX3AwID0gX19tc2FfYXN1Yl91X2IocDJfb3JnLCBwMF9vcmcpOworICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMl9hc3ViX3AwIDwgYmV0YSk7CiAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gdG1wX2ZsYWcgJiBpc19sZXNzX3RoYW5fYmV0YTsKICAgICAgICAgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhID0gX19tc2FfeG9yaV9iKGlzX2xlc3NfdGhhbl9iZXRhLCAweGZmKTsKICAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbjsKICAgICAgICAgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhID0gbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwogCi0gICAgICAgIC8qIHJpZ2h0ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHYxNnU4IGlzX2xlc3NfdGhhbl9iZXRhX3I7Ci0KLSAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhX3IgPQotICAgICAgICAgICAgICAgICh2MTZ1OCkgX19tc2Ffc2xkaV9iKCh2MTZpOCkgaXNfbGVzc190aGFuX2JldGEsIHplcm8sIDgpOwotICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoaXNfbGVzc190aGFuX2JldGFfcikpIHsKLSAgICAgICAgICAgICAgICB2OGkxNiBwM19vcmdfcjsKLQotICAgICAgICAgICAgICAgIElMVlJfQjJfU0goemVybywgcDNfb3JnLCB6ZXJvLCBwMl9vcmcsIHAzX29yZ19yLCBwMl9yKTsKLSAgICAgICAgICAgICAgICBBVkNfTFBGX1AwUDFQMl9PUl9RMFExUTIocDNfb3JnX3IsIHAwX29yZ19yLCBxMF9vcmdfciwgcDFfb3JnX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyX3IsIHExX29yZ19yLCBwMF9yLCBwMV9yLCBwMl9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBsZWZ0ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHYxNnU4IGlzX2xlc3NfdGhhbl9iZXRhX2w7Ci0KLSAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhX2wgPQotICAgICAgICAgICAgICAgICh2MTZ1OCkgX19tc2Ffc2xkaV9iKHplcm8sICh2MTZpOCkgaXNfbGVzc190aGFuX2JldGEsIDgpOwotICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoaXNfbGVzc190aGFuX2JldGFfbCkpIHsKLSAgICAgICAgICAgICAgICB2OGkxNiBwM19vcmdfbDsKLQotICAgICAgICAgICAgICAgIElMVkxfQjJfU0goemVybywgcDNfb3JnLCB6ZXJvLCBwMl9vcmcsIHAzX29yZ19sLCBwMl9sKTsKLSAgICAgICAgICAgICAgICBBVkNfTFBGX1AwUDFQMl9PUl9RMFExUTIocDNfb3JnX2wsIHAwX29yZ19sLCBxMF9vcmdfbCwgcDFfb3JnX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyX2wsIHExX29yZ19sLCBwMF9sLCBwMV9sLCBwMl9sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBjb21iaW5lIGFuZCBzdG9yZSAqLwogICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihpc19sZXNzX3RoYW5fYmV0YSkpIHsKLSAgICAgICAgICAgIHYxNnU4IHAwLCBwMiwgcDE7CisgICAgICAgICAgICB2MTZ1OCBwMiwgcDE7CisgICAgICAgICAgICB2OGkxNiBwM19vcmdfciwgcDNfb3JnX2w7CisgICAgICAgICAgICB2OGkxNiBwMl9sID0geyAwIH07CisgICAgICAgICAgICB2OGkxNiBwMl9yID0geyAwIH07CisgICAgICAgICAgICB2OGkxNiBwMV9sID0geyAwIH07CisgICAgICAgICAgICB2OGkxNiBwMV9yID0geyAwIH07CisKKyAgICAgICAgICAgIElMVlJfQjJfU0goemVybywgcDNfb3JnLCB6ZXJvLCBwMl9vcmcsIHAzX29yZ19yLCBwMl9yKTsKKyAgICAgICAgICAgIEFWQ19MUEZfUDBQMVAyX09SX1EwUTFRMihwM19vcmdfciwgcDBfb3JnX3IsIHEwX29yZ19yLCBwMV9vcmdfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMl9yLCBxMV9vcmdfciwgcDBfciwgcDFfciwgcDJfcik7CisKKyAgICAgICAgICAgIElMVkxfQjJfU0goemVybywgcDNfb3JnLCB6ZXJvLCBwMl9vcmcsIHAzX29yZ19sLCBwMl9sKTsKKyAgICAgICAgICAgIEFWQ19MUEZfUDBQMVAyX09SX1EwUTFRMihwM19vcmdfbCwgcDBfb3JnX2wsIHEwX29yZ19sLCBwMV9vcmdfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJfbCwgcTFfb3JnX2wsIHAwX2wsIHAxX2wsIHAyX2wpOwogCiAgICAgICAgICAgICBQQ0tFVl9CM19VQihwMF9sLCBwMF9yLCBwMV9sLCBwMV9yLCBwMl9sLCBwMl9yLCBwMCwgcDEsIHAyKTsKICAgICAgICAgICAgIHAwX29yZyA9IF9fbXNhX2JtbnpfdihwMF9vcmcsIHAwLCBpc19sZXNzX3RoYW5fYmV0YSk7CiAgICAgICAgICAgICBwMV9vcmcgPSBfX21zYV9ibW56X3YocDFfb3JnLCBwMSwgaXNfbGVzc190aGFuX2JldGEpOwogICAgICAgICAgICAgcDJfb3JnID0gX19tc2FfYm1uel92KHAyX29yZywgcDIsIGlzX2xlc3NfdGhhbl9iZXRhKTsKICAgICAgICAgfQotICAgICAgICAvKiByaWdodCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICB2MTZ1OCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfcjsKIAotICAgICAgICAgICAgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhX3IgPQotICAgICAgICAgICAgICAgICh2MTZ1OCkgX19tc2Ffc2xkaV9iKCh2MTZpOCkgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhLCB6ZXJvLCA4KTsKKyAgICAgICAgQVZDX0xQRl9QMF9PUl9RMChwMF9vcmdfciwgcTFfb3JnX3IsIHAxX29yZ19yLCBwMF9yKTsKKyAgICAgICAgQVZDX0xQRl9QMF9PUl9RMChwMF9vcmdfbCwgcTFfb3JnX2wsIHAxX29yZ19sLCBwMF9sKTsKIAotICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YobmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhX3IpKSB7Ci0gICAgICAgICAgICAgICAgQVZDX0xQRl9QMF9PUl9RMChwMF9vcmdfciwgcTFfb3JnX3IsIHAxX29yZ19yLCBwMF9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBsZWZ0ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIHYxNnU4IG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9sOworICAgICAgICBwMCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHAwX2wsICh2MTZpOCkgcDBfcik7CisgICAgICAgIHAwX29yZyA9IF9fbXNhX2JtbnpfdihwMF9vcmcsIHAwLCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEpOwogCi0gICAgICAgICAgICBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfbCA9Ci0gICAgICAgICAgICAgICAgKHYxNnU4KSBfX21zYV9zbGRpX2IoemVybywgKHYxNmk4KSBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEsIDgpOwotICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YobmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhX2wpKSB7Ci0gICAgICAgICAgICAgICAgQVZDX0xQRl9QMF9PUl9RMChwMF9vcmdfbCwgcTFfb3JnX2wsIHAxX29yZ19sLCBwMF9sKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSkpIHsKLSAgICAgICAgICAgIHYxNnU4IHAwOwotCi0gICAgICAgICAgICBwMCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHAwX2wsICh2MTZpOCkgcDBfcik7Ci0gICAgICAgICAgICBwMF9vcmcgPSBfX21zYV9ibW56X3YocDBfb3JnLCBwMCwgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICAgIHYxNnU4IHEyX2FzdWJfcTA7Ci0KLSAgICAgICAgICAgIHEyX2FzdWJfcTAgPSBfX21zYV9hc3ViX3VfYihxMl9vcmcsIHEwX29yZyk7Ci0gICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChxMl9hc3ViX3EwIDwgYmV0YSk7Ci0gICAgICAgIH0KKyAgICAgICAgcTJfYXN1Yl9xMCA9IF9fbXNhX2FzdWJfdV9iKHEyX29yZywgcTBfb3JnKTsKKyAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSAocTJfYXN1Yl9xMCA8IGJldGEpOwogCiAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gaXNfbGVzc190aGFuX2JldGEgJiB0bXBfZmxhZzsKICAgICAgICAgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhID0gX19tc2FfeG9yaV9iKGlzX2xlc3NfdGhhbl9iZXRhLCAweGZmKTsKQEAgLTk5MywzNyArOTE2LDIxIEBACiAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gaXNfbGVzc190aGFuX2JldGEgJiBpc19sZXNzX3RoYW47CiAgICAgICAgIG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSA9IG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbjsKIAotICAgICAgICAvKiByaWdodCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICB2MTZ1OCBpc19sZXNzX3RoYW5fYmV0YV9yOwotCi0gICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YV9yID0KLSAgICAgICAgICAgICAgICAodjE2dTgpIF9fbXNhX3NsZGlfYigodjE2aTgpIGlzX2xlc3NfdGhhbl9iZXRhLCB6ZXJvLCA4KTsKLSAgICAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KGlzX2xlc3NfdGhhbl9iZXRhX3IpKSB7Ci0gICAgICAgICAgICAgICAgdjhpMTYgcTNfb3JnX3I7Ci0KLSAgICAgICAgICAgICAgICBJTFZSX0IyX1NIKHplcm8sIHEzX29yZywgemVybywgcTJfb3JnLCBxM19vcmdfciwgcTJfcik7Ci0gICAgICAgICAgICAgICAgQVZDX0xQRl9QMFAxUDJfT1JfUTBRMVEyKHEzX29yZ19yLCBxMF9vcmdfciwgcDBfb3JnX3IsIHExX29yZ19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxMl9yLCBwMV9vcmdfciwgcTBfciwgcTFfciwgcTJfcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogbGVmdCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICB2MTZ1OCBpc19sZXNzX3RoYW5fYmV0YV9sOwotCi0gICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YV9sID0KLSAgICAgICAgICAgICAgICAodjE2dTgpIF9fbXNhX3NsZGlfYih6ZXJvLCAodjE2aTgpIGlzX2xlc3NfdGhhbl9iZXRhLCA4KTsKLSAgICAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KGlzX2xlc3NfdGhhbl9iZXRhX2wpKSB7Ci0gICAgICAgICAgICAgICAgdjhpMTYgcTNfb3JnX2w7Ci0KLSAgICAgICAgICAgICAgICBJTFZMX0IyX1NIKHplcm8sIHEzX29yZywgemVybywgcTJfb3JnLCBxM19vcmdfbCwgcTJfbCk7Ci0gICAgICAgICAgICAgICAgQVZDX0xQRl9QMFAxUDJfT1JfUTBRMVEyKHEzX29yZ19sLCBxMF9vcmdfbCwgcDBfb3JnX2wsIHExX29yZ19sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxMl9sLCBwMV9vcmdfbCwgcTBfbCwgcTFfbCwgcTJfbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogY29tYmluZSBhbmQgc3RvcmUgKi8KICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoaXNfbGVzc190aGFuX2JldGEpKSB7Ci0gICAgICAgICAgICB2MTZ1OCBxMCwgcTEsIHEyOworICAgICAgICAgICAgdjE2dTggcTEsIHEyOworICAgICAgICAgICAgdjhpMTYgcTNfb3JnX3IsIHEzX29yZ19sOworICAgICAgICAgICAgdjhpMTYgcTFfbCA9IHsgMCB9OworICAgICAgICAgICAgdjhpMTYgcTFfciA9IHsgMCB9OworICAgICAgICAgICAgdjhpMTYgcTJfbCA9IHsgMCB9OworICAgICAgICAgICAgdjhpMTYgcTJfciA9IHsgMCB9OworCisgICAgICAgICAgICBJTFZSX0IyX1NIKHplcm8sIHEzX29yZywgemVybywgcTJfb3JnLCBxM19vcmdfciwgcTJfcik7CisgICAgICAgICAgICBBVkNfTFBGX1AwUDFQMl9PUl9RMFExUTIocTNfb3JnX3IsIHEwX29yZ19yLCBwMF9vcmdfciwgcTFfb3JnX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTJfciwgcDFfb3JnX3IsIHEwX3IsIHExX3IsIHEyX3IpOworCisgICAgICAgICAgICBJTFZMX0IyX1NIKHplcm8sIHEzX29yZywgemVybywgcTJfb3JnLCBxM19vcmdfbCwgcTJfbCk7CisgICAgICAgICAgICBBVkNfTFBGX1AwUDFQMl9PUl9RMFExUTIocTNfb3JnX2wsIHEwX29yZ19sLCBwMF9vcmdfbCwgcTFfb3JnX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTJfbCwgcDFfb3JnX2wsIHEwX2wsIHExX2wsIHEyX2wpOwogCiAgICAgICAgICAgICBQQ0tFVl9CM19VQihxMF9sLCBxMF9yLCBxMV9sLCBxMV9yLCBxMl9sLCBxMl9yLCBxMCwgcTEsIHEyKTsKICAgICAgICAgICAgIHEwX29yZyA9IF9fbXNhX2JtbnpfdihxMF9vcmcsIHEwLCBpc19sZXNzX3RoYW5fYmV0YSk7CkBAIC0xMDMxLDMzICs5MzgsMTIgQEAKICAgICAgICAgICAgIHEyX29yZyA9IF9fbXNhX2JtbnpfdihxMl9vcmcsIHEyLCBpc19sZXNzX3RoYW5fYmV0YSk7CiAgICAgICAgIH0KIAotICAgICAgICAvKiByaWdodCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICB2MTZ1OCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfcjsKKyAgICAgICAgQVZDX0xQRl9QMF9PUl9RMChxMF9vcmdfciwgcDFfb3JnX3IsIHExX29yZ19yLCBxMF9yKTsKKyAgICAgICAgQVZDX0xQRl9QMF9PUl9RMChxMF9vcmdfbCwgcDFfb3JnX2wsIHExX29yZ19sLCBxMF9sKTsKIAotICAgICAgICAgICAgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhX3IgPQotICAgICAgICAgICAgICAgICh2MTZ1OCkgX19tc2Ffc2xkaV9iKCh2MTZpOCkgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhLCB6ZXJvLCA4KTsKLSAgICAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9yKSkgewotICAgICAgICAgICAgICAgIEFWQ19MUEZfUDBfT1JfUTAocTBfb3JnX3IsIHAxX29yZ19yLCBxMV9vcmdfciwgcTBfcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogbGVmdCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICB2MTZ1OCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGFfbDsKKyAgICAgICAgcTAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBxMF9sLCAodjE2aTgpIHEwX3IpOworICAgICAgICBxMF9vcmcgPSBfX21zYV9ibW56X3YocTBfb3JnLCBxMCwgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhKTsKIAotICAgICAgICAgICAgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhX2wgPQotICAgICAgICAgICAgICAgICh2MTZ1OCkgX19tc2Ffc2xkaV9iKHplcm8sICh2MTZpOCkgbmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhLCA4KTsKLSAgICAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KG5lZ2F0ZV9pc19sZXNzX3RoYW5fYmV0YV9sKSkgewotICAgICAgICAgICAgICAgIEFWQ19MUEZfUDBfT1JfUTAocTBfb3JnX2wsIHAxX29yZ19sLCBxMV9vcmdfbCwgcTBfbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YobmVnYXRlX2lzX2xlc3NfdGhhbl9iZXRhKSkgewotICAgICAgICAgICAgdjE2dTggcTA7Ci0KLSAgICAgICAgICAgIHEwID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcTBfbCwgKHYxNmk4KSBxMF9yKTsKLSAgICAgICAgICAgIHEwX29yZyA9IF9fbXNhX2JtbnpfdihxMF9vcmcsIHEwLCBuZWdhdGVfaXNfbGVzc190aGFuX2JldGEpOwotICAgICAgICB9Ci0gICAgfQogICAgIHsKICAgICAgICAgdjhpMTYgdHAwLCB0cDEsIHRwMiwgdHAzLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwogCkBAIC0xMDgyLDYgKzk2OCw3IEBACiAgICAgICAgIFNUNHg0X1VCKHRtcDcsIHRtcDcsIDAsIDEsIDIsIDMsIHNyYywgaW1nX3dpZHRoKTsKICAgICAgICAgU1QyeDRfVUIodG1wNSwgNCwgc3JjICsgNCwgaW1nX3dpZHRoKTsKICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBhdmNfaF9sb29wX2ZpbHRlcl9sdW1hX21iYWZmX2ludHJhX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3RyaWRlLApAQCAtMTQwMiwyMSArMTI4OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJldGFfaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbWdfd2lkdGgpCiB7Ci0gICAgdWludDhfdCAqc3JjOwotICAgIHYxNnU4IGJldGEsIHRtcF92ZWMsIGJzID0geyAwIH07Ci0gICAgdjE2dTggdGMgPSB7IDAgfTsKLSAgICB2MTZ1OCBpc19sZXNzX3RoYW4sIGlzX2xlc3NfdGhhbl9iZXRhOwotICAgIHYxNnU4IHAxLCBwMCwgcTAsIHExOwotICAgIHY4aTE2IHAwX3IsIHEwX3IsIHAxX3IgPSB7IDAgfTsKLSAgICB2OGkxNiBxMV9yID0geyAwIH07Ci0gICAgdjhpMTYgcDBfbCwgcTBfbCwgcDFfbCA9IHsgMCB9OwotICAgIHY4aTE2IHExX2wgPSB7IDAgfTsKLSAgICB2MTZ1OCBwM19vcmcsIHAyX29yZywgcDFfb3JnLCBwMF9vcmcsIHEwX29yZywgcTFfb3JnLCBxMl9vcmcsIHEzX29yZzsKLSAgICB2OGkxNiBwMl9vcmdfciwgcDFfb3JnX3IsIHAwX29yZ19yLCBxMF9vcmdfciwgcTFfb3JnX3IsIHEyX29yZ19yOwotICAgIHY4aTE2IHAyX29yZ19sLCBwMV9vcmdfbCwgcDBfb3JnX2wsIHEwX29yZ19sLCBxMV9vcmdfbCwgcTJfb3JnX2w7Ci0gICAgdjhpMTYgdGNfciwgdGNfbDsKLSAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0gICAgdjE2dTggaXNfYnNfZ3JlYXRlcl90aGFuMDsKKyAgICB2MTZ1OCB0bXBfdmVjLCBicyA9IHsgMCB9OwogCiAgICAgdG1wX3ZlYyA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGJzMCk7CiAgICAgYnMgPSAodjE2dTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBicywgMCwgKHY0aTMyKSB0bXBfdmVjKTsKQEAgLTE0MjgsNiArMTMwMSwxNCBAQAogICAgIGJzID0gKHYxNnU4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgYnMsIDMsICh2NGkzMikgdG1wX3ZlYyk7CiAKICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihicykpIHsKKyAgICAgICAgdWludDhfdCAqc3JjID0gZGF0YSAtIDQ7CisgICAgICAgIHYxNnU4IHAzX29yZywgcDJfb3JnLCBwMV9vcmcsIHAwX29yZywgcTBfb3JnLCBxMV9vcmcsIHEyX29yZywgcTNfb3JnOworICAgICAgICB2MTZ1OCBwMF9hc3ViX3EwLCBwMV9hc3ViX3AwLCBxMV9hc3ViX3EwLCBhbHBoYSwgYmV0YTsKKyAgICAgICAgdjE2dTggaXNfbGVzc190aGFuLCBpc19sZXNzX3RoYW5fYmV0YSwgaXNfbGVzc190aGFuX2FscGhhOworICAgICAgICB2MTZ1OCBpc19ic19ncmVhdGVyX3RoYW4wOworICAgICAgICB2MTZ1OCB0YyA9IHsgMCB9OworICAgICAgICB2MTZpOCB6ZXJvID0geyAwIH07CisKICAgICAgICAgdG1wX3ZlYyA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKHRjMCk7CiAgICAgICAgIHRjID0gKHYxNnU4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgdGMsIDAsICh2NGkzMikgdG1wX3ZlYyk7CiAgICAgICAgIHRtcF92ZWMgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYih0YzEpOwpAQCAtMTQ0Myw5ICsxMzI0LDYgQEAKICAgICAgICAgICAgIHYxNnU4IHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzc7CiAgICAgICAgICAgICB2MTZ1OCByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1OwogCi0gICAgICAgICAgICBzcmMgPSBkYXRhOwotICAgICAgICAgICAgc3JjIC09IDQ7Ci0KICAgICAgICAgICAgIExEX1VCOChzcmMsIGltZ193aWR0aCwKICAgICAgICAgICAgICAgICAgICByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3KTsKICAgICAgICAgICAgIHNyYyArPSAoOCAqIGltZ193aWR0aCk7CkBAIC0xNDU4LDI3ICsxMzM2LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAzX29yZywgcDJfb3JnLCBwMV9vcmcsIHAwX29yZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcTBfb3JnLCBxMV9vcmcsIHEyX29yZywgcTNfb3JnKTsKICAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICB2MTZ1OCBwMF9hc3ViX3EwLCBwMV9hc3ViX3AwLCBxMV9hc3ViX3EwLCBhbHBoYTsKLSAgICAgICAgICAgIHYxNnU4IGlzX2xlc3NfdGhhbl9hbHBoYTsKIAotICAgICAgICAgICAgcDBfYXN1Yl9xMCA9IF9fbXNhX2FzdWJfdV9iKHAwX29yZywgcTBfb3JnKTsKLSAgICAgICAgICAgIHAxX2FzdWJfcDAgPSBfX21zYV9hc3ViX3VfYihwMV9vcmcsIHAwX29yZyk7Ci0gICAgICAgICAgICBxMV9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocTFfb3JnLCBxMF9vcmcpOworICAgICAgICBwMF9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocDBfb3JnLCBxMF9vcmcpOworICAgICAgICBwMV9hc3ViX3AwID0gX19tc2FfYXN1Yl91X2IocDFfb3JnLCBwMF9vcmcpOworICAgICAgICBxMV9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocTFfb3JnLCBxMF9vcmcpOwogCi0gICAgICAgICAgICBhbHBoYSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGFscGhhX2luKTsKLSAgICAgICAgICAgIGJldGEgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihiZXRhX2luKTsKKyAgICAgICAgYWxwaGEgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihhbHBoYV9pbik7CisgICAgICAgIGJldGEgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihiZXRhX2luKTsKIAotICAgICAgICAgICAgaXNfbGVzc190aGFuX2FscGhhID0gKHAwX2FzdWJfcTAgPCBhbHBoYSk7Ci0gICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMV9hc3ViX3AwIDwgYmV0YSk7Ci0gICAgICAgICAgICBpc19sZXNzX3RoYW4gPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbl9hbHBoYTsKLSAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gKHExX2FzdWJfcTAgPCBiZXRhKTsKLSAgICAgICAgICAgIGlzX2xlc3NfdGhhbiA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwotICAgICAgICAgICAgaXNfbGVzc190aGFuID0gaXNfbGVzc190aGFuICYgaXNfYnNfZ3JlYXRlcl90aGFuMDsKLSAgICAgICAgfQorICAgICAgICBpc19sZXNzX3RoYW5fYWxwaGEgPSAocDBfYXN1Yl9xMCA8IGFscGhhKTsKKyAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSAocDFfYXN1Yl9wMCA8IGJldGEpOworICAgICAgICBpc19sZXNzX3RoYW4gPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbl9hbHBoYTsKKyAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSAocTFfYXN1Yl9xMCA8IGJldGEpOworICAgICAgICBpc19sZXNzX3RoYW4gPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbjsKKyAgICAgICAgaXNfbGVzc190aGFuID0gaXNfbGVzc190aGFuICYgaXNfYnNfZ3JlYXRlcl90aGFuMDsKKwogICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihpc19sZXNzX3RoYW4pKSB7CiAgICAgICAgICAgICB2MTZpOCBuZWdhdGVfdGMsIHNpZ25fbmVnYXRlX3RjOwotICAgICAgICAgICAgdjhpMTYgbmVnYXRlX3RjX3IsIGkxNl9uZWdhdGV0Y19sOworICAgICAgICAgICAgdjE2dTggcDAsIHEwLCBwMl9hc3ViX3AwLCBxMl9hc3ViX3EwOworICAgICAgICAgICAgdjhpMTYgdGNfciwgdGNfbCwgbmVnYXRlX3RjX3IsIGkxNl9uZWdhdGV0Y19sOworICAgICAgICAgICAgdjhpMTYgcDFfb3JnX3IsIHAwX29yZ19yLCBxMF9vcmdfciwgcTFfb3JnX3I7CisgICAgICAgICAgICB2OGkxNiBwMV9vcmdfbCwgcDBfb3JnX2wsIHEwX29yZ19sLCBxMV9vcmdfbDsKKyAgICAgICAgICAgIHY4aTE2IHAwX3IsIHEwX3IsIHAwX2wsIHEwX2w7CiAKICAgICAgICAgICAgIG5lZ2F0ZV90YyA9IHplcm8gLSAodjE2aTgpIHRjOwogICAgICAgICAgICAgc2lnbl9uZWdhdGVfdGMgPSBfX21zYV9jbHRpX3NfYihuZWdhdGVfdGMsIDApOwpAQCAtMTQ5MCwzNCArMTM2OSwyMiBAQAogICAgICAgICAgICAgVU5QQ0tfVUJfU0gocDBfb3JnLCBwMF9vcmdfciwgcDBfb3JnX2wpOwogICAgICAgICAgICAgVU5QQ0tfVUJfU0gocTBfb3JnLCBxMF9vcmdfciwgcTBfb3JnX2wpOwogCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdjE2dTggcDJfYXN1Yl9wMDsKLSAgICAgICAgICAgICAgICB2MTZ1OCBpc19sZXNzX3RoYW5fYmV0YV9yLCBpc19sZXNzX3RoYW5fYmV0YV9sOwotCi0gICAgICAgICAgICAgICAgcDJfYXN1Yl9wMCA9IF9fbXNhX2FzdWJfdV9iKHAyX29yZywgcDBfb3JnKTsKLSAgICAgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMl9hc3ViX3AwIDwgYmV0YSk7Ci0gICAgICAgICAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbjsKLQotICAgICAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhX3IgPQotICAgICAgICAgICAgICAgICAgICAodjE2dTgpIF9fbXNhX3NsZGlfYigodjE2aTgpIGlzX2xlc3NfdGhhbl9iZXRhLCB6ZXJvLCA4KTsKLSAgICAgICAgICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihpc19sZXNzX3RoYW5fYmV0YV9yKSkgewotICAgICAgICAgICAgICAgICAgICBwMl9vcmdfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOCkgcDJfb3JnKTsKLQotICAgICAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19yLCBxMF9vcmdfciwgcDFfb3JnX3IsIHAyX29yZ19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZV90Y19yLCB0Y19yLCBwMV9yKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YV9sID0KLSAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBfX21zYV9zbGRpX2IoemVybywgKHYxNmk4KSBpc19sZXNzX3RoYW5fYmV0YSwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoaXNfbGVzc190aGFuX2JldGFfbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcDJfb3JnX2wgPSAodjhpMTYpIF9fbXNhX2lsdmxfYih6ZXJvLCAodjE2aTgpIHAyX29yZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgQVZDX0xQRl9QMV9PUl9RMShwMF9vcmdfbCwgcTBfb3JnX2wsIHAxX29yZ19sLCBwMl9vcmdfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMTZfbmVnYXRldGNfbCwgdGNfbCwgcDFfbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgcDJfYXN1Yl9wMCA9IF9fbXNhX2FzdWJfdV9iKHAyX29yZywgcDBfb3JnKTsKKyAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gKHAyX2FzdWJfcDAgPCBiZXRhKTsKKyAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gaXNfbGVzc190aGFuX2JldGEgJiBpc19sZXNzX3RoYW47CiAKICAgICAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KGlzX2xlc3NfdGhhbl9iZXRhKSkgeworICAgICAgICAgICAgICAgIHYxNnU4IHAxOworICAgICAgICAgICAgICAgIHY4aTE2IHAxX3IgPSB7IDAgfTsKKyAgICAgICAgICAgICAgICB2OGkxNiBwMV9sID0geyAwIH07CisgICAgICAgICAgICAgICAgdjhpMTYgcDJfb3JnX3IgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih6ZXJvLCAodjE2aTgpIHAyX29yZyk7CisgICAgICAgICAgICAgICAgdjhpMTYgcDJfb3JnX2wgPSAodjhpMTYpIF9fbXNhX2lsdmxfYih6ZXJvLCAodjE2aTgpIHAyX29yZyk7CisKKyAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19yLCBxMF9vcmdfciwgcDFfb3JnX3IsIHAyX29yZ19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRlX3RjX3IsIHRjX3IsIHAxX3IpOworICAgICAgICAgICAgICAgIEFWQ19MUEZfUDFfT1JfUTEocDBfb3JnX2wsIHEwX29yZ19sLCBwMV9vcmdfbCwgcDJfb3JnX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMTZfbmVnYXRldGNfbCwgdGNfbCwgcDFfbCk7CisKICAgICAgICAgICAgICAgICBwMSA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHAxX2wsICh2MTZpOCkgcDFfcik7CiAgICAgICAgICAgICAgICAgcDFfb3JnID0gX19tc2FfYm1uel92KHAxX29yZywgcDEsIGlzX2xlc3NfdGhhbl9iZXRhKTsKIApAQCAtMTUyNSwzNiArMTM5MiwyNSBAQAogICAgICAgICAgICAgICAgIHRjID0gdGMgKyBpc19sZXNzX3RoYW5fYmV0YTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHYxNnU4IHU4X3EyYXN1Yl9xMDsKLSAgICAgICAgICAgICAgICB2MTZ1OCBpc19sZXNzX3RoYW5fYmV0YV9sLCBpc19sZXNzX3RoYW5fYmV0YV9yOworICAgICAgICAgICAgcTJfYXN1Yl9xMCA9IF9fbXNhX2FzdWJfdV9iKHEyX29yZywgcTBfb3JnKTsKKyAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gKHEyX2FzdWJfcTAgPCBiZXRhKTsKKyAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gaXNfbGVzc190aGFuX2JldGEgJiBpc19sZXNzX3RoYW47CiAKLSAgICAgICAgICAgICAgICB1OF9xMmFzdWJfcTAgPSBfX21zYV9hc3ViX3VfYihxMl9vcmcsIHEwX29yZyk7Ci0gICAgICAgICAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSAodThfcTJhc3ViX3EwIDwgYmV0YSk7Ci0gICAgICAgICAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbjsKLQotICAgICAgICAgICAgICAgIHExX29yZ19yID0gKHY4aTE2KSBfX21zYV9pbHZyX2IoemVybywgKHYxNmk4KSBxMV9vcmcpOwotCi0gICAgICAgICAgICAgICAgaXNfbGVzc190aGFuX2JldGFfciA9Ci0gICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgX19tc2Ffc2xkaV9iKCh2MTZpOCkgaXNfbGVzc190aGFuX2JldGEsIHplcm8sIDgpOwotICAgICAgICAgICAgICAgIGlmICghX19tc2FfdGVzdF9iel92KGlzX2xlc3NfdGhhbl9iZXRhX3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHEyX29yZ19yID0gKHY4aTE2KSBfX21zYV9pbHZyX2IoemVybywgKHYxNmk4KSBxMl9vcmcpOwotICAgICAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19yLCBxMF9vcmdfciwgcTFfb3JnX3IsIHEyX29yZ19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZV90Y19yLCB0Y19yLCBxMV9yKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBxMV9vcmdfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKHplcm8sICh2MTZpOCkgcTFfb3JnKTsKLQotICAgICAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhX2wgPQotICAgICAgICAgICAgICAgICAgICAodjE2dTgpIF9fbXNhX3NsZGlfYih6ZXJvLCAodjE2aTgpIGlzX2xlc3NfdGhhbl9iZXRhLCA4KTsKLSAgICAgICAgICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihpc19sZXNzX3RoYW5fYmV0YV9sKSkgewotICAgICAgICAgICAgICAgICAgICBxMl9vcmdfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKHplcm8sICh2MTZpOCkgcTJfb3JnKTsKLSAgICAgICAgICAgICAgICAgICAgQVZDX0xQRl9QMV9PUl9RMShwMF9vcmdfbCwgcTBfb3JnX2wsIHExX29yZ19sLCBxMl9vcmdfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMTZfbmVnYXRldGNfbCwgdGNfbCwgcTFfbCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgICAgICAgICAgcTFfb3JnX3IgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih6ZXJvLCAodjE2aTgpIHExX29yZyk7CisgICAgICAgICAgICBxMV9vcmdfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKHplcm8sICh2MTZpOCkgcTFfb3JnKTsKIAogICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoaXNfbGVzc190aGFuX2JldGEpKSB7CisgICAgICAgICAgICAgICAgdjE2dTggcTE7CisgICAgICAgICAgICAgICAgdjhpMTYgcTFfciA9IHsgMCB9OworICAgICAgICAgICAgICAgIHY4aTE2IHExX2wgPSB7IDAgfTsKKyAgICAgICAgICAgICAgICB2OGkxNiBxMl9vcmdfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOCkgcTJfb3JnKTsKKyAgICAgICAgICAgICAgICB2OGkxNiBxMl9vcmdfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKHplcm8sICh2MTZpOCkgcTJfb3JnKTsKKworICAgICAgICAgICAgICAgIEFWQ19MUEZfUDFfT1JfUTEocDBfb3JnX3IsIHEwX29yZ19yLCBxMV9vcmdfciwgcTJfb3JnX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGVfdGNfciwgdGNfciwgcTFfcik7CisgICAgICAgICAgICAgICAgQVZDX0xQRl9QMV9PUl9RMShwMF9vcmdfbCwgcTBfb3JnX2wsIHExX29yZ19sLCBxMl9vcmdfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxNl9uZWdhdGV0Y19sLCB0Y19sLCBxMV9sKTsKKwogICAgICAgICAgICAgICAgIHExID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcTFfbCwgKHYxNmk4KSBxMV9yKTsKICAgICAgICAgICAgICAgICBxMV9vcmcgPSBfX21zYV9ibW56X3YocTFfb3JnLCBxMSwgaXNfbGVzc190aGFuX2JldGEpOwogCkBAIC0xNTg4LDcgKzE0NDQsNyBAQAogCiAgICAgICAgICAgICBwMF9vcmcgPSBfX21zYV9ibW56X3YocDBfb3JnLCBwMCwgaXNfbGVzc190aGFuKTsKICAgICAgICAgICAgIHEwX29yZyA9IF9fbXNhX2JtbnpfdihxMF9vcmcsIHEwLCBpc19sZXNzX3RoYW4pOwotICAgICAgICB9CisKICAgICAgICAgewogICAgICAgICAgICAgdjE2aTggdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgICAgICAgICAgdjhpMTYgdG1wMiwgdG1wNTsKQEAgLTE3MDAsNiArMTU1Niw3IEBACiAgICAgICAgICAgICBTVyhvdXQyLCBzcmMpOwogICAgICAgICAgICAgU0gob3V0MywgKHNyYyArIDQpKTsKICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xNzEyLDIwICsxNTY5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmV0YV9pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGltYWdlX3dpZHRoKQogewotICAgIHYxNnU4IHAyX2FzdWJfcDAsIHU4X3EyYXN1Yl9xMDsKLSAgICB2MTZ1OCBhbHBoYSwgYmV0YSwgaXNfbGVzc190aGFuLCBpc19sZXNzX3RoYW5fYmV0YTsKLSAgICB2MTZ1OCBwMSwgcDAsIHEwLCBxMTsKLSAgICB2OGkxNiBwMV9yID0geyAwIH07Ci0gICAgdjhpMTYgcDBfciwgcTBfciwgcTFfciA9IHsgMCB9OwotICAgIHY4aTE2IHAxX2wgPSB7IDAgfTsKLSAgICB2OGkxNiBwMF9sLCBxMF9sLCBxMV9sID0geyAwIH07Ci0gICAgdjE2dTggcDJfb3JnLCBwMV9vcmcsIHAwX29yZywgcTBfb3JnLCBxMV9vcmcsIHEyX29yZzsKLSAgICB2OGkxNiBwMl9vcmdfciwgcDFfb3JnX3IsIHAwX29yZ19yLCBxMF9vcmdfciwgcTFfb3JnX3IsIHEyX29yZ19yOwotICAgIHY4aTE2IHAyX29yZ19sLCBwMV9vcmdfbCwgcDBfb3JnX2wsIHEwX29yZ19sLCBxMV9vcmdfbCwgcTJfb3JnX2w7Ci0gICAgdjE2aTggemVybyA9IHsgMCB9OwogICAgIHYxNnU4IHRtcF92ZWM7CiAgICAgdjE2dTggYnMgPSB7IDAgfTsKLSAgICB2MTZpOCB0YyA9IHsgMCB9OwogCiAgICAgdG1wX3ZlYyA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGJzMCk7CiAgICAgYnMgPSAodjE2dTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBicywgMCwgKHY0aTMyKSB0bXBfdmVjKTsKQEAgLTE3MzcsNiArMTU4MiwxNiBAQAogICAgIGJzID0gKHYxNnU4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgYnMsIDMsICh2NGkzMikgdG1wX3ZlYyk7CiAKICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihicykpIHsKKyAgICAgICAgdjE2dTggYWxwaGEsIGJldGEsIGlzX2xlc3NfdGhhbiwgaXNfbGVzc190aGFuX2JldGE7CisgICAgICAgIHYxNnU4IHAwLCBxMCwgcDJfb3JnLCBwMV9vcmcsIHAwX29yZywgcTBfb3JnLCBxMV9vcmcsIHEyX29yZzsKKyAgICAgICAgdjE2dTggcDBfYXN1Yl9xMCwgcDFfYXN1Yl9wMCwgcTFfYXN1Yl9xMDsKKyAgICAgICAgdjE2dTggaXNfbGVzc190aGFuX2FscGhhLCBpc19ic19ncmVhdGVyX3RoYW4wOworICAgICAgICB2OGkxNiBwMF9yLCBxMF9yLCBwMF9sLCBxMF9sOworICAgICAgICB2OGkxNiBwMV9vcmdfciwgcDBfb3JnX3IsIHEwX29yZ19yLCBxMV9vcmdfcjsKKyAgICAgICAgdjhpMTYgcDFfb3JnX2wsIHAwX29yZ19sLCBxMF9vcmdfbCwgcTFfb3JnX2w7CisgICAgICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICAgICAgdjE2aTggdGMgPSB7IDAgfTsKKwogICAgICAgICB0bXBfdmVjID0gKHYxNnU4KSBfX21zYV9maWxsX2IodGMwKTsKICAgICAgICAgdGMgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSB0YywgMCwgKHY0aTMyKSB0bXBfdmVjKTsKICAgICAgICAgdG1wX3ZlYyA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKHRjMSk7CkBAIC0xNzUyLDI2ICsxNjA3LDIyIEBACiAgICAgICAgIExEX1VCNShkYXRhIC0gKDMgKiBpbWFnZV93aWR0aCksIGltYWdlX3dpZHRoLAogICAgICAgICAgICAgICAgcDJfb3JnLCBwMV9vcmcsIHAwX29yZywgcTBfb3JnLCBxMV9vcmcpOwogCi0gICAgICAgIHsKLSAgICAgICAgICAgIHYxNnU4IHAwX2FzdWJfcTAsIHAxX2FzdWJfcDAsIHExX2FzdWJfcTA7Ci0gICAgICAgICAgICB2MTZ1OCBpc19sZXNzX3RoYW5fYWxwaGEsIGlzX2JzX2dyZWF0ZXJfdGhhbjA7CisgICAgICAgIGlzX2JzX2dyZWF0ZXJfdGhhbjAgPSAoKHYxNnU4KSB6ZXJvIDwgYnMpOworICAgICAgICBwMF9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocDBfb3JnLCBxMF9vcmcpOworICAgICAgICBwMV9hc3ViX3AwID0gX19tc2FfYXN1Yl91X2IocDFfb3JnLCBwMF9vcmcpOworICAgICAgICBxMV9hc3ViX3EwID0gX19tc2FfYXN1Yl91X2IocTFfb3JnLCBxMF9vcmcpOwogCi0gICAgICAgICAgICBpc19ic19ncmVhdGVyX3RoYW4wID0gKCh2MTZ1OCkgemVybyA8IGJzKTsKLSAgICAgICAgICAgIHAwX2FzdWJfcTAgPSBfX21zYV9hc3ViX3VfYihwMF9vcmcsIHEwX29yZyk7Ci0gICAgICAgICAgICBwMV9hc3ViX3AwID0gX19tc2FfYXN1Yl91X2IocDFfb3JnLCBwMF9vcmcpOwotICAgICAgICAgICAgcTFfYXN1Yl9xMCA9IF9fbXNhX2FzdWJfdV9iKHExX29yZywgcTBfb3JnKTsKLQotICAgICAgICAgICAgaXNfbGVzc190aGFuX2FscGhhID0gKHAwX2FzdWJfcTAgPCBhbHBoYSk7Ci0gICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMV9hc3ViX3AwIDwgYmV0YSk7Ci0gICAgICAgICAgICBpc19sZXNzX3RoYW4gPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbl9hbHBoYTsKLSAgICAgICAgICAgIGlzX2xlc3NfdGhhbl9iZXRhID0gKHExX2FzdWJfcTAgPCBiZXRhKTsKLSAgICAgICAgICAgIGlzX2xlc3NfdGhhbiA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwotICAgICAgICAgICAgaXNfbGVzc190aGFuID0gaXNfbGVzc190aGFuICYgaXNfYnNfZ3JlYXRlcl90aGFuMDsKLSAgICAgICAgfQorICAgICAgICBpc19sZXNzX3RoYW5fYWxwaGEgPSAocDBfYXN1Yl9xMCA8IGFscGhhKTsKKyAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSAocDFfYXN1Yl9wMCA8IGJldGEpOworICAgICAgICBpc19sZXNzX3RoYW4gPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbl9hbHBoYTsKKyAgICAgICAgaXNfbGVzc190aGFuX2JldGEgPSAocTFfYXN1Yl9xMCA8IGJldGEpOworICAgICAgICBpc19sZXNzX3RoYW4gPSBpc19sZXNzX3RoYW5fYmV0YSAmIGlzX2xlc3NfdGhhbjsKKyAgICAgICAgaXNfbGVzc190aGFuID0gaXNfbGVzc190aGFuICYgaXNfYnNfZ3JlYXRlcl90aGFuMDsKIAogICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihpc19sZXNzX3RoYW4pKSB7CiAgICAgICAgICAgICB2MTZpOCBzaWduX25lZ2F0ZV90YywgbmVnYXRlX3RjOwogICAgICAgICAgICAgdjhpMTYgbmVnYXRlX3RjX3IsIGkxNl9uZWdhdGV0Y19sLCB0Y19sLCB0Y19yOworICAgICAgICAgICAgdjE2dTggcDJfYXN1Yl9wMCwgcTJfYXN1Yl9xMDsKIAogICAgICAgICAgICAgcTJfb3JnID0gTERfVUIoZGF0YSArICgyICogaW1hZ2Vfd2lkdGgpKTsKICAgICAgICAgICAgIG5lZ2F0ZV90YyA9IHplcm8gLSB0YzsKQEAgLTE3ODcsMjggKzE2MzgsMTkgQEAKICAgICAgICAgICAgIHAyX2FzdWJfcDAgPSBfX21zYV9hc3ViX3VfYihwMl9vcmcsIHAwX29yZyk7CiAgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChwMl9hc3ViX3AwIDwgYmV0YSk7CiAgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHY4dTE2IGlzX2xlc3NfdGhhbl9iZXRhX3IsIGlzX2xlc3NfdGhhbl9iZXRhX2w7CiAKLSAgICAgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YV9yID0KLSAgICAgICAgICAgICAgICAgICAgKHY4dTE2KSBfX21zYV9zbGRpX2IoKHYxNmk4KSBpc19sZXNzX3RoYW5fYmV0YSwgemVybywgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoKHYxNnU4KSBpc19sZXNzX3RoYW5fYmV0YV9yKSkgewotICAgICAgICAgICAgICAgICAgICBwMl9vcmdfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOCkgcDJfb3JnKTsKLQotICAgICAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19yLCBxMF9vcmdfciwgcDFfb3JnX3IsIHAyX29yZ19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZV90Y19yLCB0Y19yLCBwMV9yKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YV9sID0KLSAgICAgICAgICAgICAgICAgICAgKHY4dTE2KSBfX21zYV9zbGRpX2IoemVybywgKHYxNmk4KSBpc19sZXNzX3RoYW5fYmV0YSwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoKHYxNnU4KSBpc19sZXNzX3RoYW5fYmV0YV9sKSkgewotICAgICAgICAgICAgICAgICAgICBwMl9vcmdfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKHplcm8sICh2MTZpOCkgcDJfb3JnKTsKLQotICAgICAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19sLCBxMF9vcmdfbCwgcDFfb3JnX2wsIHAyX29yZ19sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxNl9uZWdhdGV0Y19sLCB0Y19sLCBwMV9sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihpc19sZXNzX3RoYW5fYmV0YSkpIHsKKyAgICAgICAgICAgICAgICB2MTZ1OCBwMTsKKyAgICAgICAgICAgICAgICB2OGkxNiBwMV9yID0geyAwIH07CisgICAgICAgICAgICAgICAgdjhpMTYgcDFfbCA9IHsgMCB9OworICAgICAgICAgICAgICAgIHY4aTE2IHAyX29yZ19yID0gKHY4aTE2KSBfX21zYV9pbHZyX2IoemVybywgKHYxNmk4KSBwMl9vcmcpOworICAgICAgICAgICAgICAgIHY4aTE2IHAyX29yZ19sID0gKHY4aTE2KSBfX21zYV9pbHZsX2IoemVybywgKHYxNmk4KSBwMl9vcmcpOworCisgICAgICAgICAgICAgICAgQVZDX0xQRl9QMV9PUl9RMShwMF9vcmdfciwgcTBfb3JnX3IsIHAxX29yZ19yLCBwMl9vcmdfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZV90Y19yLCB0Y19yLCBwMV9yKTsKKyAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19sLCBxMF9vcmdfbCwgcDFfb3JnX2wsIHAyX29yZ19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE2X25lZ2F0ZXRjX2wsIHRjX2wsIHAxX2wpOworCiAgICAgICAgICAgICAgICAgcDEgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBwMV9sLCAodjE2aTgpIHAxX3IpOwogICAgICAgICAgICAgICAgIHAxX29yZyA9IF9fbXNhX2JtbnpfdihwMV9vcmcsIHAxLCBpc19sZXNzX3RoYW5fYmV0YSk7CiAgICAgICAgICAgICAgICAgU1RfVUIocDFfb3JnLCBkYXRhIC0gKDIgKiBpbWFnZV93aWR0aCkpOwpAQCAtMTgxNywzNCArMTY1OSwyNSBAQAogICAgICAgICAgICAgICAgIHRjID0gdGMgKyAodjE2aTgpIGlzX2xlc3NfdGhhbl9iZXRhOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1OF9xMmFzdWJfcTAgPSBfX21zYV9hc3ViX3VfYihxMl9vcmcsIHEwX29yZyk7Ci0gICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9ICh1OF9xMmFzdWJfcTAgPCBiZXRhKTsKKyAgICAgICAgICAgIHEyX2FzdWJfcTAgPSBfX21zYV9hc3ViX3VfYihxMl9vcmcsIHEwX29yZyk7CisgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IChxMl9hc3ViX3EwIDwgYmV0YSk7CiAgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YSA9IGlzX2xlc3NfdGhhbl9iZXRhICYgaXNfbGVzc190aGFuOwogCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdjh1MTYgaXNfbGVzc190aGFuX2JldGFfciwgaXNfbGVzc190aGFuX2JldGFfbDsKLSAgICAgICAgICAgICAgICBpc19sZXNzX3RoYW5fYmV0YV9yID0KLSAgICAgICAgICAgICAgICAgICAgKHY4dTE2KSBfX21zYV9zbGRpX2IoKHYxNmk4KSBpc19sZXNzX3RoYW5fYmV0YSwgemVybywgOCk7CisgICAgICAgICAgICBxMV9vcmdfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOCkgcTFfb3JnKTsKKyAgICAgICAgICAgIHExX29yZ19sID0gKHY4aTE2KSBfX21zYV9pbHZsX2IoemVybywgKHYxNmk4KSBxMV9vcmcpOwogCi0gICAgICAgICAgICAgICAgcTFfb3JnX3IgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih6ZXJvLCAodjE2aTgpIHExX29yZyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoKHYxNnU4KSBpc19sZXNzX3RoYW5fYmV0YV9yKSkgewotICAgICAgICAgICAgICAgICAgICBxMl9vcmdfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOCkgcTJfb3JnKTsKLQotICAgICAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19yLCBxMF9vcmdfciwgcTFfb3JnX3IsIHEyX29yZ19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZV90Y19yLCB0Y19yLCBxMV9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaXNfbGVzc190aGFuX2JldGFfbCA9Ci0gICAgICAgICAgICAgICAgICAgICh2OHUxNikgX19tc2Ffc2xkaV9iKHplcm8sICh2MTZpOCkgaXNfbGVzc190aGFuX2JldGEsIDgpOwotCi0gICAgICAgICAgICAgICAgcTFfb3JnX2wgPSAodjhpMTYpIF9fbXNhX2lsdmxfYih6ZXJvLCAodjE2aTgpIHExX29yZyk7Ci0gICAgICAgICAgICAgICAgaWYgKCFfX21zYV90ZXN0X2J6X3YoKHYxNnU4KSBpc19sZXNzX3RoYW5fYmV0YV9sKSkgewotICAgICAgICAgICAgICAgICAgICBxMl9vcmdfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKHplcm8sICh2MTZpOCkgcTJfb3JnKTsKLQotICAgICAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19sLCBxMF9vcmdfbCwgcTFfb3JnX2wsIHEyX29yZ19sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxNl9uZWdhdGV0Y19sLCB0Y19sLCBxMV9sKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIV9fbXNhX3Rlc3RfYnpfdihpc19sZXNzX3RoYW5fYmV0YSkpIHsKKyAgICAgICAgICAgICAgICB2MTZ1OCBxMTsKKyAgICAgICAgICAgICAgICB2OGkxNiBxMV9yID0geyAwIH07CisgICAgICAgICAgICAgICAgdjhpMTYgcTFfbCA9IHsgMCB9OworICAgICAgICAgICAgICAgIHY4aTE2IHEyX29yZ19yID0gKHY4aTE2KSBfX21zYV9pbHZyX2IoemVybywgKHYxNmk4KSBxMl9vcmcpOworICAgICAgICAgICAgICAgIHY4aTE2IHEyX29yZ19sID0gKHY4aTE2KSBfX21zYV9pbHZsX2IoemVybywgKHYxNmk4KSBxMl9vcmcpOworCisgICAgICAgICAgICAgICAgQVZDX0xQRl9QMV9PUl9RMShwMF9vcmdfciwgcTBfb3JnX3IsIHExX29yZ19yLCBxMl9vcmdfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0ZV90Y19yLCB0Y19yLCBxMV9yKTsKKyAgICAgICAgICAgICAgICBBVkNfTFBGX1AxX09SX1ExKHAwX29yZ19sLCBxMF9vcmdfbCwgcTFfb3JnX2wsIHEyX29yZ19sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTE2X25lZ2F0ZXRjX2wsIHRjX2wsIHExX2wpOworCiAgICAgICAgICAgICAgICAgcTEgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBxMV9sLCAodjE2aTgpIHExX3IpOwogICAgICAgICAgICAgICAgIHExX29yZyA9IF9fbXNhX2JtbnpfdihxMV9vcmcsIHExLCBpc19sZXNzX3RoYW5fYmV0YSk7CiAgICAgICAgICAgICAgICAgU1RfVUIocTFfb3JnLCBkYXRhICsgaW1hZ2Vfd2lkdGgpOwpAQCAtMjQ5NSw1MCArMjMyOCwyNzMgQEAKICAgICBhdmNfaF9sb29wX2ZpbHRlcl9sdW1hX21iYWZmX2ludHJhX21zYShzcmMsIHlzdHJpZGUsIGFscGhhLCBiZXRhKTsKIH0KIAotdm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHMxNl84X21zYSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX3dlaWdodF9oMjY0X3BpeGVsczE2XzhfbXNhKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRfc3JjLCBpbnQgb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0X3NyYywgaW50IG9mZnNldF9pbikKIHsKLSAgICBhdmNfd2d0XzE2d2lkdGhfbXNhKHNyYywgc3RyaWRlLCBoZWlnaHQsIGxvZzJfZGVub20sIHdlaWdodF9zcmMsIG9mZnNldCk7CisgICAgdWludDMyX3Qgb2Zmc2V0X3ZhbDsKKyAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworICAgIHY4aTE2IHNyYzBfbCwgc3JjMV9sLCBzcmMyX2wsIHNyYzNfbCwgc3JjMF9yLCBzcmMxX3IsIHNyYzJfciwgc3JjM19yOworICAgIHY4aTE2IHNyYzRfbCwgc3JjNV9sLCBzcmM2X2wsIHNyYzdfbCwgc3JjNF9yLCBzcmM1X3IsIHNyYzZfciwgc3JjN19yOworICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgdjhpMTYgdG1wOCwgdG1wOSwgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0LCB0bXAxNTsKKyAgICB2OGkxNiB3Z3QsIGRlbm9tLCBvZmZzZXQ7CisKKyAgICBvZmZzZXRfdmFsID0gKHVuc2lnbmVkKSBvZmZzZXRfaW4gPDwgbG9nMl9kZW5vbTsKKworICAgIHdndCA9IF9fbXNhX2ZpbGxfaCh3ZWlnaHRfc3JjKTsKKyAgICBvZmZzZXQgPSBfX21zYV9maWxsX2gob2Zmc2V0X3ZhbCk7CisgICAgZGVub20gPSBfX21zYV9maWxsX2gobG9nMl9kZW5vbSk7CisKKyAgICBMRF9VQjgoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywgc3JjMF9yLCBzcmMxX3IsCisgICAgICAgICAgICAgICBzcmMyX3IsIHNyYzNfcik7CisgICAgSUxWTF9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLCBzcmMwX2wsIHNyYzFfbCwKKyAgICAgICAgICAgICAgIHNyYzJfbCwgc3JjM19sKTsKKyAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzQsIHplcm8sIHNyYzUsIHplcm8sIHNyYzYsIHplcm8sIHNyYzcsIHNyYzRfciwgc3JjNV9yLAorICAgICAgICAgICAgICAgc3JjNl9yLCBzcmM3X3IpOworICAgIElMVkxfQjRfU0goemVybywgc3JjNCwgemVybywgc3JjNSwgemVybywgc3JjNiwgemVybywgc3JjNywgc3JjNF9sLCBzcmM1X2wsCisgICAgICAgICAgICAgICBzcmM2X2wsIHNyYzdfbCk7CisgICAgTVVMNCh3Z3QsIHNyYzBfciwgd2d0LCBzcmMwX2wsIHdndCwgc3JjMV9yLCB3Z3QsIHNyYzFfbCwgdG1wMCwgdG1wMSwgdG1wMiwKKyAgICAgICAgIHRtcDMpOworICAgIE1VTDQod2d0LCBzcmMyX3IsIHdndCwgc3JjMl9sLCB3Z3QsIHNyYzNfciwgd2d0LCBzcmMzX2wsIHRtcDQsIHRtcDUsIHRtcDYsCisgICAgICAgICB0bXA3KTsKKyAgICBNVUw0KHdndCwgc3JjNF9yLCB3Z3QsIHNyYzRfbCwgd2d0LCBzcmM1X3IsIHdndCwgc3JjNV9sLCB0bXA4LCB0bXA5LCB0bXAxMCwKKyAgICAgICAgIHRtcDExKTsKKyAgICBNVUw0KHdndCwgc3JjNl9yLCB3Z3QsIHNyYzZfbCwgd2d0LCBzcmM3X3IsIHdndCwgc3JjN19sLCB0bXAxMiwgdG1wMTMsCisgICAgICAgICB0bXAxNCwgdG1wMTUpOworICAgIEFERFNfU0g0X1NIKHRtcDAsIG9mZnNldCwgdG1wMSwgb2Zmc2V0LCB0bXAyLCBvZmZzZXQsIHRtcDMsIG9mZnNldCwgdG1wMCwKKyAgICAgICAgICAgICAgICB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICBBRERTX1NINF9TSCh0bXA0LCBvZmZzZXQsIHRtcDUsIG9mZnNldCwgdG1wNiwgb2Zmc2V0LCB0bXA3LCBvZmZzZXQsIHRtcDQsCisgICAgICAgICAgICAgICAgdG1wNSwgdG1wNiwgdG1wNyk7CisgICAgQUREU19TSDRfU0godG1wOCwgb2Zmc2V0LCB0bXA5LCBvZmZzZXQsIHRtcDEwLCBvZmZzZXQsIHRtcDExLCBvZmZzZXQsIHRtcDgsCisgICAgICAgICAgICAgICAgdG1wOSwgdG1wMTAsIHRtcDExKTsKKyAgICBBRERTX1NINF9TSCh0bXAxMiwgb2Zmc2V0LCB0bXAxMywgb2Zmc2V0LCB0bXAxNCwgb2Zmc2V0LCB0bXAxNSwgb2Zmc2V0LAorICAgICAgICAgICAgICAgIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1KTsKKyAgICBNQVhJX1NIOF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCAwKTsKKyAgICBNQVhJX1NIOF9TSCh0bXA4LCB0bXA5LCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCAwKTsKKyAgICBTUkxSX0g4X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIGRlbm9tKTsKKyAgICBTUkxSX0g4X1NIKHRtcDgsIHRtcDksIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUsIGRlbm9tKTsKKyAgICBTQVRfVUg4X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIDcpOworICAgIFNBVF9VSDhfU0godG1wOCwgdG1wOSwgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0LCB0bXAxNSwgNyk7CisgICAgUENLRVZfQjRfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wNSwgdG1wNCwgdG1wNywgdG1wNiwgZHN0MCwgZHN0MSwKKyAgICAgICAgICAgICAgICBkc3QyLCBkc3QzKTsKKyAgICBQQ0tFVl9CNF9VQih0bXA5LCB0bXA4LCB0bXAxMSwgdG1wMTAsIHRtcDEzLCB0bXAxMiwgdG1wMTUsIHRtcDE0LCBkc3Q0LAorICAgICAgICAgICAgICAgIGRzdDUsIGRzdDYsIGRzdDcpOworICAgIFNUX1VCOChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBzcmMsIHN0cmlkZSk7CisgICAgc3JjICs9IDggKiBzdHJpZGU7CisKKyAgICBpZiAoMTYgPT0gaGVpZ2h0KSB7CisgICAgICAgIExEX1VCOChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywgc3JjMF9yLAorICAgICAgICAgICAgICAgICAgIHNyYzFfciwgc3JjMl9yLCBzcmMzX3IpOworICAgICAgICBJTFZMX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsIHNyYzBfbCwKKyAgICAgICAgICAgICAgICAgICBzcmMxX2wsIHNyYzJfbCwgc3JjM19sKTsKKyAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmM0LCB6ZXJvLCBzcmM1LCB6ZXJvLCBzcmM2LCB6ZXJvLCBzcmM3LCBzcmM0X3IsCisgICAgICAgICAgICAgICAgICAgc3JjNV9yLCBzcmM2X3IsIHNyYzdfcik7CisgICAgICAgIElMVkxfQjRfU0goemVybywgc3JjNCwgemVybywgc3JjNSwgemVybywgc3JjNiwgemVybywgc3JjNywgc3JjNF9sLAorICAgICAgICAgICAgICAgICAgIHNyYzVfbCwgc3JjNl9sLCBzcmM3X2wpOworICAgICAgICBNVUw0KHdndCwgc3JjMF9yLCB3Z3QsIHNyYzBfbCwgd2d0LCBzcmMxX3IsIHdndCwgc3JjMV9sLCB0bXAwLCB0bXAxLAorICAgICAgICAgICAgIHRtcDIsIHRtcDMpOworICAgICAgICBNVUw0KHdndCwgc3JjMl9yLCB3Z3QsIHNyYzJfbCwgd2d0LCBzcmMzX3IsIHdndCwgc3JjM19sLCB0bXA0LCB0bXA1LAorICAgICAgICAgICAgIHRtcDYsIHRtcDcpOworICAgICAgICBNVUw0KHdndCwgc3JjNF9yLCB3Z3QsIHNyYzRfbCwgd2d0LCBzcmM1X3IsIHdndCwgc3JjNV9sLCB0bXA4LCB0bXA5LAorICAgICAgICAgICAgIHRtcDEwLCB0bXAxMSk7CisgICAgICAgIE1VTDQod2d0LCBzcmM2X3IsIHdndCwgc3JjNl9sLCB3Z3QsIHNyYzdfciwgd2d0LCBzcmM3X2wsIHRtcDEyLCB0bXAxMywKKyAgICAgICAgICAgICB0bXAxNCwgdG1wMTUpOworICAgICAgICBBRERTX1NINF9TSCh0bXAwLCBvZmZzZXQsIHRtcDEsIG9mZnNldCwgdG1wMiwgb2Zmc2V0LCB0bXAzLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBBRERTX1NINF9TSCh0bXA0LCBvZmZzZXQsIHRtcDUsIG9mZnNldCwgdG1wNiwgb2Zmc2V0LCB0bXA3LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcpOworICAgICAgICBBRERTX1NINF9TSCh0bXA4LCBvZmZzZXQsIHRtcDksIG9mZnNldCwgdG1wMTAsIG9mZnNldCwgdG1wMTEsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgdG1wOCwgdG1wOSwgdG1wMTAsIHRtcDExKTsKKyAgICAgICAgQUREU19TSDRfU0godG1wMTIsIG9mZnNldCwgdG1wMTMsIG9mZnNldCwgdG1wMTQsIG9mZnNldCwgdG1wMTUsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUpOworICAgICAgICBNQVhJX1NIOF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCAwKTsKKyAgICAgICAgTUFYSV9TSDhfU0godG1wOCwgdG1wOSwgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTMsIHRtcDE0LCB0bXAxNSwgMCk7CisgICAgICAgIFNSTFJfSDhfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgZGVub20pOworICAgICAgICBTUkxSX0g4X1NIKHRtcDgsIHRtcDksIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUsIGRlbm9tKTsKKyAgICAgICAgU0FUX1VIOF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCA3KTsKKyAgICAgICAgU0FUX1VIOF9TSCh0bXA4LCB0bXA5LCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCA3KTsKKyAgICAgICAgUENLRVZfQjRfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wNSwgdG1wNCwgdG1wNywgdG1wNiwgZHN0MCwgZHN0MSwKKyAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgICAgIFBDS0VWX0I0X1VCKHRtcDksIHRtcDgsIHRtcDExLCB0bXAxMCwgdG1wMTMsIHRtcDEyLCB0bXAxNSwgdG1wMTQsIGRzdDQsCisgICAgICAgICAgICAgICAgICAgIGRzdDUsIGRzdDYsIGRzdDcpOworICAgICAgICBTVF9VQjgoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgc3JjLCBzdHJpZGUpOworICAgIH0KIH0KIAotdm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHM4XzhfbXNhKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKK3ZvaWQgZmZfd2VpZ2h0X2gyNjRfcGl4ZWxzOF84X21zYSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodF9zcmMsIGludCBvZmZzZXQpCiB7Ci0gICAgYXZjX3dndF84d2lkdGhfbXNhKHNyYywgc3RyaWRlLCBoZWlnaHQsIGxvZzJfZGVub20sIHdlaWdodF9zcmMsIG9mZnNldCk7CisgICAgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y193Z3RfOHg0X21zYShzcmMsIHN0cmlkZSwgbG9nMl9kZW5vbSwgd2VpZ2h0X3NyYywgb2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y193Z3RfOHg4X21zYShzcmMsIHN0cmlkZSwgbG9nMl9kZW5vbSwgd2VpZ2h0X3NyYywgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmNfd2d0Xzh4MTZfbXNhKHNyYywgc3RyaWRlLCBsb2cyX2Rlbm9tLCB3ZWlnaHRfc3JjLCBvZmZzZXQpOworICAgIH0KIH0KIAotdm9pZCBmZl93ZWlnaHRfaDI2NF9waXhlbHM0XzhfbXNhKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKK3ZvaWQgZmZfd2VpZ2h0X2gyNjRfcGl4ZWxzNF84X21zYSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGxvZzJfZGVub20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodF9zcmMsIGludCBvZmZzZXQpCiB7Ci0gICAgYXZjX3dndF80d2lkdGhfbXNhKHNyYywgc3RyaWRlLCBoZWlnaHQsIGxvZzJfZGVub20sIHdlaWdodF9zcmMsIG9mZnNldCk7CisgICAgaWYgKDIgPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y193Z3RfNHgyX21zYShzcmMsIHN0cmlkZSwgbG9nMl9kZW5vbSwgd2VpZ2h0X3NyYywgb2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y193Z3RfNHg0X21zYShzcmMsIHN0cmlkZSwgbG9nMl9kZW5vbSwgd2VpZ2h0X3NyYywgb2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmNfd2d0XzR4OF9tc2Eoc3JjLCBzdHJpZGUsIGxvZzJfZGVub20sIHdlaWdodF9zcmMsIG9mZnNldCk7CisgICAgfQogfQogCiB2b2lkIGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzMTZfOF9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0X2RzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0X3NyYywgaW50IG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0X3NyYywgaW50IG9mZnNldF9pbikKIHsKLSAgICBhdmNfYml3Z3RfMTZ3aWR0aF9tc2Eoc3JjLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCBoZWlnaHQsIGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF9zcmMsIHdlaWdodF9kc3QsIG9mZnNldCk7CisgICAgdjE2aTggc3JjX3dndCwgZHN0X3dndCwgd2d0OworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB2OGkxNiB0bXA4LCB0bXA5LCB0bXAxMCwgdG1wMTEsIHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1OworICAgIHY4aTE2IGRlbm9tLCBvZmZzZXQ7CisKKyAgICBvZmZzZXRfaW4gPSAodW5zaWduZWQpICgob2Zmc2V0X2luICsgMSkgfCAxKSA8PCBsb2cyX2Rlbm9tOworICAgIG9mZnNldF9pbiArPSAoMTI4ICogKHdlaWdodF9zcmMgKyB3ZWlnaHRfZHN0KSk7CisKKyAgICBzcmNfd2d0ID0gX19tc2FfZmlsbF9iKHdlaWdodF9zcmMpOworICAgIGRzdF93Z3QgPSBfX21zYV9maWxsX2Iod2VpZ2h0X2RzdCk7CisgICAgb2Zmc2V0ID0gX19tc2FfZmlsbF9oKG9mZnNldF9pbik7CisgICAgZGVub20gPSBfX21zYV9maWxsX2gobG9nMl9kZW5vbSArIDEpOworCisgICAgd2d0ID0gX19tc2FfaWx2ZXZfYihkc3Rfd2d0LCBzcmNfd2d0KTsKKworICAgIExEX1VCOChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgc3JjICs9IDggKiBzdHJpZGU7CisgICAgTERfVUI4KGRzdCwgc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3KTsKKyAgICBYT1JJX0I4XzEyOF9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBYT1JJX0I4XzEyOF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3KTsKKyAgICBJTFZSX0I0X1NCKGRzdDAsIHNyYzAsIGRzdDEsIHNyYzEsIGRzdDIsIHNyYzIsIGRzdDMsIHNyYzMsIHZlYzAsIHZlYzIsIHZlYzQsCisgICAgICAgICAgICAgICB2ZWM2KTsKKyAgICBJTFZMX0I0X1NCKGRzdDAsIHNyYzAsIGRzdDEsIHNyYzEsIGRzdDIsIHNyYzIsIGRzdDMsIHNyYzMsIHZlYzEsIHZlYzMsIHZlYzUsCisgICAgICAgICAgICAgICB2ZWM3KTsKKyAgICBJTFZSX0I0X1NCKGRzdDQsIHNyYzQsIGRzdDUsIHNyYzUsIGRzdDYsIHNyYzYsIGRzdDcsIHNyYzcsIHZlYzgsIHZlYzEwLAorICAgICAgICAgICAgICAgdmVjMTIsIHZlYzE0KTsKKyAgICBJTFZMX0I0X1NCKGRzdDQsIHNyYzQsIGRzdDUsIHNyYzUsIGRzdDYsIHNyYzYsIGRzdDcsIHNyYzcsIHZlYzksIHZlYzExLAorICAgICAgICAgICAgICAgdmVjMTMsIHZlYzE1KTsKKyAgICB0bXAwID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMwKTsKKyAgICB0bXAxID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxKTsKKyAgICB0bXAyID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMyKTsKKyAgICB0bXAzID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMzKTsKKyAgICB0bXA0ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM0KTsKKyAgICB0bXA1ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM1KTsKKyAgICB0bXA2ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM2KTsKKyAgICB0bXA3ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM3KTsKKyAgICB0bXA4ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM4KTsKKyAgICB0bXA5ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM5KTsKKyAgICB0bXAxMCA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgdmVjMTApOworICAgIHRtcDExID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxMSk7CisgICAgdG1wMTIgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzEyKTsKKyAgICB0bXAxMyA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgdmVjMTMpOworICAgIHRtcDE0ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxNCk7CisgICAgdG1wMTUgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzE1KTsKKyAgICBTUkFfNFYodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZGVub20pOworICAgIFNSQV80Vih0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCBkZW5vbSk7CisgICAgU1JBXzRWKHRtcDgsIHRtcDksIHRtcDEwLCB0bXAxMSwgZGVub20pOworICAgIFNSQV80Vih0bXAxMiwgdG1wMTMsIHRtcDE0LCB0bXAxNSwgZGVub20pOworICAgIENMSVBfU0g0XzBfMjU1KHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIENMSVBfU0g0XzBfMjU1KHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcpOworICAgIENMSVBfU0g0XzBfMjU1KHRtcDgsIHRtcDksIHRtcDEwLCB0bXAxMSk7CisgICAgQ0xJUF9TSDRfMF8yNTUodG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUpOworICAgIFBDS0VWX0I0X1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHRtcDUsIHRtcDQsIHRtcDcsIHRtcDYsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgUENLRVZfQjRfVUIodG1wOSwgdG1wOCwgdG1wMTEsIHRtcDEwLCB0bXAxMywgdG1wMTIsIHRtcDE1LCB0bXAxNCwgZHN0NCwKKyAgICAgICAgICAgICAgICBkc3Q1LCBkc3Q2LCBkc3Q3KTsKKyAgICBTVF9VQjgoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSA4ICogc3RyaWRlOworCisgICAgaWYgKDE2ID09IGhlaWdodCkgeworICAgICAgICBMRF9VQjgoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBMRF9VQjgoZHN0LCBzdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOworICAgICAgICBYT1JJX0I4XzEyOF9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgWE9SSV9COF8xMjhfVUIoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgIElMVlJfQjRfU0IoZHN0MCwgc3JjMCwgZHN0MSwgc3JjMSwgZHN0Miwgc3JjMiwgZHN0Mywgc3JjMywgdmVjMCwgdmVjMiwKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM2KTsKKyAgICAgICAgSUxWTF9CNF9TQihkc3QwLCBzcmMwLCBkc3QxLCBzcmMxLCBkc3QyLCBzcmMyLCBkc3QzLCBzcmMzLCB2ZWMxLCB2ZWMzLAorICAgICAgICAgICAgICAgICAgIHZlYzUsIHZlYzcpOworICAgICAgICBJTFZSX0I0X1NCKGRzdDQsIHNyYzQsIGRzdDUsIHNyYzUsIGRzdDYsIHNyYzYsIGRzdDcsIHNyYzcsIHZlYzgsIHZlYzEwLAorICAgICAgICAgICAgICAgICAgIHZlYzEyLCB2ZWMxNCk7CisgICAgICAgIElMVkxfQjRfU0IoZHN0NCwgc3JjNCwgZHN0NSwgc3JjNSwgZHN0Niwgc3JjNiwgZHN0Nywgc3JjNywgdmVjOSwgdmVjMTEsCisgICAgICAgICAgICAgICAgICAgdmVjMTMsIHZlYzE1KTsKKyAgICAgICAgdG1wMCA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgdmVjMCk7CisgICAgICAgIHRtcDEgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzEpOworICAgICAgICB0bXAyID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMyKTsKKyAgICAgICAgdG1wMyA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgdmVjMyk7CisgICAgICAgIHRtcDQgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzQpOworICAgICAgICB0bXA1ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM1KTsKKyAgICAgICAgdG1wNiA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgdmVjNik7CisgICAgICAgIHRtcDcgPSBfX21zYV9kcGFkZF9zX2gob2Zmc2V0LCB3Z3QsIHZlYzcpOworICAgICAgICB0bXA4ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWM4KTsKKyAgICAgICAgdG1wOSA9IF9fbXNhX2RwYWRkX3NfaChvZmZzZXQsIHdndCwgdmVjOSk7CisgICAgICAgIHRtcDEwID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxMCk7CisgICAgICAgIHRtcDExID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxMSk7CisgICAgICAgIHRtcDEyID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxMik7CisgICAgICAgIHRtcDEzID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxMyk7CisgICAgICAgIHRtcDE0ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxNCk7CisgICAgICAgIHRtcDE1ID0gX19tc2FfZHBhZGRfc19oKG9mZnNldCwgd2d0LCB2ZWMxNSk7CisgICAgICAgIFNSQV80Vih0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBkZW5vbSk7CisgICAgICAgIFNSQV80Vih0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCBkZW5vbSk7CisgICAgICAgIFNSQV80Vih0bXA4LCB0bXA5LCB0bXAxMCwgdG1wMTEsIGRlbm9tKTsKKyAgICAgICAgU1JBXzRWKHRtcDEyLCB0bXAxMywgdG1wMTQsIHRtcDE1LCBkZW5vbSk7CisgICAgICAgIENMSVBfU0g0XzBfMjU1KHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBDTElQX1NINF8wXzI1NSh0bXA0LCB0bXA1LCB0bXA2LCB0bXA3KTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTUodG1wOCwgdG1wOSwgdG1wMTAsIHRtcDExKTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTUodG1wMTIsIHRtcDEzLCB0bXAxNCwgdG1wMTUpOworICAgICAgICBQQ0tFVl9CNF9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0bXA1LCB0bXA0LCB0bXA3LCB0bXA2LCBkc3QwLCBkc3QxLAorICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QzKTsKKyAgICAgICAgUENLRVZfQjRfVUIodG1wOSwgdG1wOCwgdG1wMTEsIHRtcDEwLCB0bXAxMywgdG1wMTIsIHRtcDE1LCB0bXAxNCwgZHN0NCwKKyAgICAgICAgICAgICAgICAgICAgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgIFNUX1VCOChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBkc3QsIHN0cmlkZSk7CisgICAgfQogfQogCiB2b2lkIGZmX2Jpd2VpZ2h0X2gyNjRfcGl4ZWxzOF84X21zYSh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRfZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodF9zcmMsIGludCBvZmZzZXQpCiB7Ci0gICAgYXZjX2Jpd2d0Xzh3aWR0aF9tc2Eoc3JjLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCBoZWlnaHQsIGxvZzJfZGVub20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3NyYywgd2VpZ2h0X2RzdCwgb2Zmc2V0KTsKKyAgICBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgYXZjX2Jpd2d0Xzh4NF9tc2Eoc3JjLCBkc3QsIHN0cmlkZSwgbG9nMl9kZW5vbSwgd2VpZ2h0X3NyYywgd2VpZ2h0X2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0KTsKKyAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y19iaXdndF84eDhfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGxvZzJfZGVub20sIHdlaWdodF9zcmMsIHdlaWdodF9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZjX2Jpd2d0Xzh4MTZfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGxvZzJfZGVub20sIHdlaWdodF9zcmMsIHdlaWdodF9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIH0KIH0KIAogdm9pZCBmZl9iaXdlaWdodF9oMjY0X3BpeGVsczRfOF9tc2EodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0X2RzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHRfc3JjLCBpbnQgb2Zmc2V0KQogewotICAgIGF2Y19iaXdndF80d2lkdGhfbXNhKHNyYywgc3RyaWRlLCBkc3QsIHN0cmlkZSwgaGVpZ2h0LCBsb2cyX2Rlbm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF9zcmMsIHdlaWdodF9kc3QsIG9mZnNldCk7CisgICAgaWYgKDIgPT0gaGVpZ2h0KSB7CisgICAgICAgIGF2Y19iaXdndF80eDJfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGxvZzJfZGVub20sIHdlaWdodF9zcmMsIHdlaWdodF9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBhdmNfYml3Z3RfNHg0X21zYShzcmMsIGRzdCwgc3RyaWRlLCBsb2cyX2Rlbm9tLCB3ZWlnaHRfc3JjLCB3ZWlnaHRfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2Y19iaXdndF80eDhfbXNhKHNyYywgZHN0LCBzdHJpZGUsIGxvZzJfZGVub20sIHdlaWdodF9zcmMsIHdlaWdodF9kc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2gyNjRpZGN0X21zYS5jIGIvbGliYXZjb2RlYy9taXBzL2gyNjRpZGN0X21zYS5jCmluZGV4IGZhYzFlN2EuLjFlMWE1YzggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9oMjY0aWRjdF9tc2EuYworKysgYi9saWJhdmNvZGVjL21pcHMvaDI2NGlkY3RfbXNhLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgLSAyMDE3IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTM2LDYzICszNiwyNCBAQAogICAgIEJVVFRFUkZMWV80KHRtcDBfbSwgdG1wMV9tLCB0bXAyX20sIHRtcDNfbSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7ICBcCiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19pZGN0NHg0X2FkZGJsa19tc2EodWludDhfdCAqZHN0LCBpbnQxNl90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSkKLXsKLSAgICB2OGkxNiBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHY4aTE2IGhyZXMwLCBocmVzMSwgaHJlczIsIGhyZXMzOwotICAgIHY4aTE2IHZyZXMwLCB2cmVzMSwgdnJlczIsIHZyZXMzOwotICAgIHY4aTE2IHplcm9zID0geyAwIH07Ci0KLSAgICBMRDR4NF9TSChzcmMsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgIEFWQ19JVFJBTlNfSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBocmVzMCwgaHJlczEsIGhyZXMyLCBocmVzMyk7Ci0gICAgVFJBTlNQT1NFNHg0X1NIX1NIKGhyZXMwLCBocmVzMSwgaHJlczIsIGhyZXMzLCBocmVzMCwgaHJlczEsIGhyZXMyLCBocmVzMyk7Ci0gICAgQVZDX0lUUkFOU19IKGhyZXMwLCBocmVzMSwgaHJlczIsIGhyZXMzLCB2cmVzMCwgdnJlczEsIHZyZXMyLCB2cmVzMyk7Ci0gICAgU1JBUklfSDRfU0godnJlczAsIHZyZXMxLCB2cmVzMiwgdnJlczMsIDYpOwotICAgIEFEREJMS19TVDR4NF9VQih2cmVzMCwgdnJlczEsIHZyZXMyLCB2cmVzMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICBTVF9TSDIoemVyb3MsIHplcm9zLCBzcmMsIDgpOwotfQotCi1zdGF0aWMgdm9pZCBhdmNfaWRjdDR4NF9hZGRibGtfZGNfbXNhKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUpCi17Ci0gICAgaW50MTZfdCBkYzsKLSAgICB1aW50MzJfdCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNnU4IHByZWQgPSB7IDAgfTsKLSAgICB2MTZpOCBvdXQ7Ci0gICAgdjhpMTYgaW5wdXRfZGMsIHByZWRfciwgcHJlZF9sOwotCi0gICAgZGMgPSAoc3JjWzBdICsgMzIpID4+IDY7Ci0gICAgaW5wdXRfZGMgPSBfX21zYV9maWxsX2goZGMpOwotICAgIHNyY1swXSA9IDA7Ci0KLSAgICBMVzQoZHN0LCBkc3Rfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICBJTlNFUlRfVzRfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgcHJlZCk7Ci0gICAgVU5QQ0tfVUJfU0gocHJlZCwgcHJlZF9yLCBwcmVkX2wpOwotCi0gICAgcHJlZF9yICs9IGlucHV0X2RjOwotICAgIHByZWRfbCArPSBpbnB1dF9kYzsKLQotICAgIENMSVBfU0gyXzBfMjU1KHByZWRfciwgcHJlZF9sKTsKLSAgICBvdXQgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcHJlZF9sLCAodjE2aTgpIHByZWRfcik7Ci0gICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci19Ci0KIHN0YXRpYyB2b2lkIGF2Y19kZXFfaWRjdF9sdW1hX2RjX21zYShpbnQxNl90ICpkc3QsIGludDE2X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlX3FfdmFsKQogewogI2RlZmluZSBEQ19ERVNUX1NUUklERSAxNgotICAgIGludDE2X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2OGkxNiBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOworICAgIGludDE2X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgb3V0Niwgb3V0NzsKKyAgICB2OGkxNiBzcmMxLCBzcmMzOwogICAgIHY4aTE2IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBocmVzMCwgaHJlczEsIGhyZXMyLCBocmVzMzsKICAgICB2OGkxNiB2cmVzMCwgdnJlczEsIHZyZXMyLCB2cmVzMzsKICAgICB2NGkzMiB2cmVzMF9yLCB2cmVzMV9yLCB2cmVzMl9yLCB2cmVzM19yOwotICAgIHY0aTMyIGRlX3FfdmVjID0gX19tc2FfZmlsbF93KGRlX3FfdmFsKTsKKyAgICBjb25zdCB2NGkzMiBkZV9xX3ZlYyA9IF9fbXNhX2ZpbGxfdyhkZV9xX3ZhbCk7CisgICAgY29uc3QgdjhpMTYgc3JjMCA9IExEX1NIKHNyYyk7CisgICAgY29uc3QgdjhpMTYgc3JjMiA9IExEX1NIKHNyYyArIDgpOwogCi0gICAgTEQ0eDRfU0goc3JjLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICBUUkFOU1BPU0U0eDRfU0hfU0goc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgQlVUVEVSRkxZXzQoc3JjMCwgc3JjMiwgc3JjMywgc3JjMSwgdmVjMCwgdmVjMywgdmVjMiwgdmVjMSk7CisgICAgSUxWTF9EMl9TSChzcmMwLCBzcmMwLCBzcmMyLCBzcmMyLCBzcmMxLCBzcmMzKTsKKyAgICBUUkFOU1BPU0U0eDRfU0hfU0goc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgQlVUVEVSRkxZXzQodG1wMCwgdG1wMiwgdG1wMywgdG1wMSwgdmVjMCwgdmVjMywgdmVjMiwgdmVjMSk7CiAgICAgQlVUVEVSRkxZXzQodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgaHJlczAsIGhyZXMzLCBocmVzMiwgaHJlczEpOwogICAgIFRSQU5TUE9TRTR4NF9TSF9TSChocmVzMCwgaHJlczEsIGhyZXMyLCBocmVzMywgaHJlczAsIGhyZXMxLCBocmVzMiwgaHJlczMpOwogICAgIEJVVFRFUkZMWV80KGhyZXMwLCBocmVzMSwgaHJlczMsIGhyZXMyLCB2ZWMwLCB2ZWMzLCB2ZWMyLCB2ZWMxKTsKQEAgLTExNCw0MCArNzUsMzUgQEAKICAgICBvdXQxID0gX19tc2FfY29weV9zX2godmVjMCwgMSk7CiAgICAgb3V0MiA9IF9fbXNhX2NvcHlfc19oKHZlYzAsIDIpOwogICAgIG91dDMgPSBfX21zYV9jb3B5X3NfaCh2ZWMwLCAzKTsKLSAgICBTSChvdXQwLCBkc3QpOwotICAgIFNIKG91dDEsIChkc3QgKyAyICogRENfREVTVF9TVFJJREUpKTsKLSAgICBTSChvdXQyLCAoZHN0ICsgOCAqIERDX0RFU1RfU1RSSURFKSk7CisgICAgb3V0NCA9IF9fbXNhX2NvcHlfc19oKHZlYzAsIDQpOworICAgIG91dDUgPSBfX21zYV9jb3B5X3NfaCh2ZWMwLCA1KTsKKyAgICBvdXQ2ID0gX19tc2FfY29weV9zX2godmVjMCwgNik7CisgICAgb3V0NyA9IF9fbXNhX2NvcHlfc19oKHZlYzAsIDcpOworICAgIFNIKG91dDAsIChkc3QgKyAwICAqIERDX0RFU1RfU1RSSURFKSk7CisgICAgU0gob3V0MSwgKGRzdCArIDIgICogRENfREVTVF9TVFJJREUpKTsKKyAgICBTSChvdXQyLCAoZHN0ICsgOCAgKiBEQ19ERVNUX1NUUklERSkpOwogICAgIFNIKG91dDMsIChkc3QgKyAxMCAqIERDX0RFU1RfU1RSSURFKSk7Ci0gICAgZHN0ICs9IERDX0RFU1RfU1RSSURFOwotCi0gICAgb3V0MCA9IF9fbXNhX2NvcHlfc19oKHZlYzAsIDQpOwotICAgIG91dDEgPSBfX21zYV9jb3B5X3NfaCh2ZWMwLCA1KTsKLSAgICBvdXQyID0gX19tc2FfY29weV9zX2godmVjMCwgNik7Ci0gICAgb3V0MyA9IF9fbXNhX2NvcHlfc19oKHZlYzAsIDcpOwotICAgIFNIKG91dDAsIGRzdCk7Ci0gICAgU0gob3V0MSwgKGRzdCArIDIgKiBEQ19ERVNUX1NUUklERSkpOwotICAgIFNIKG91dDIsIChkc3QgKyA4ICogRENfREVTVF9TVFJJREUpKTsKLSAgICBTSChvdXQzLCAoZHN0ICsgMTAgKiBEQ19ERVNUX1NUUklERSkpOwotICAgIGRzdCArPSAoMyAqIERDX0RFU1RfU1RSSURFKTsKKyAgICBTSChvdXQ0LCAoZHN0ICsgMSAgKiBEQ19ERVNUX1NUUklERSkpOworICAgIFNIKG91dDUsIChkc3QgKyAzICAqIERDX0RFU1RfU1RSSURFKSk7CisgICAgU0gob3V0NiwgKGRzdCArIDkgICogRENfREVTVF9TVFJJREUpKTsKKyAgICBTSChvdXQ3LCAoZHN0ICsgMTEgKiBEQ19ERVNUX1NUUklERSkpOwogCiAgICAgb3V0MCA9IF9fbXNhX2NvcHlfc19oKHZlYzEsIDApOwogICAgIG91dDEgPSBfX21zYV9jb3B5X3NfaCh2ZWMxLCAxKTsKICAgICBvdXQyID0gX19tc2FfY29weV9zX2godmVjMSwgMik7CiAgICAgb3V0MyA9IF9fbXNhX2NvcHlfc19oKHZlYzEsIDMpOwotICAgIFNIKG91dDAsIGRzdCk7Ci0gICAgU0gob3V0MSwgKGRzdCArIDIgKiBEQ19ERVNUX1NUUklERSkpOwotICAgIFNIKG91dDIsIChkc3QgKyA4ICogRENfREVTVF9TVFJJREUpKTsKLSAgICBTSChvdXQzLCAoZHN0ICsgMTAgKiBEQ19ERVNUX1NUUklERSkpOwotICAgIGRzdCArPSBEQ19ERVNUX1NUUklERTsKLQotICAgIG91dDAgPSBfX21zYV9jb3B5X3NfaCh2ZWMxLCA0KTsKLSAgICBvdXQxID0gX19tc2FfY29weV9zX2godmVjMSwgNSk7Ci0gICAgb3V0MiA9IF9fbXNhX2NvcHlfc19oKHZlYzEsIDYpOwotICAgIG91dDMgPSBfX21zYV9jb3B5X3NfaCh2ZWMxLCA3KTsKLSAgICBTSChvdXQwLCBkc3QpOwotICAgIFNIKG91dDEsIChkc3QgKyAyICogRENfREVTVF9TVFJJREUpKTsKLSAgICBTSChvdXQyLCAoZHN0ICsgOCAqIERDX0RFU1RfU1RSSURFKSk7Ci0gICAgU0gob3V0MywgKGRzdCArIDEwICogRENfREVTVF9TVFJJREUpKTsKKyAgICBvdXQ0ID0gX19tc2FfY29weV9zX2godmVjMSwgNCk7CisgICAgb3V0NSA9IF9fbXNhX2NvcHlfc19oKHZlYzEsIDUpOworICAgIG91dDYgPSBfX21zYV9jb3B5X3NfaCh2ZWMxLCA2KTsKKyAgICBvdXQ3ID0gX19tc2FfY29weV9zX2godmVjMSwgNyk7CisgICAgU0gob3V0MCwgKGRzdCArIDQgICogRENfREVTVF9TVFJJREUpKTsKKyAgICBTSChvdXQxLCAoZHN0ICsgNiAgKiBEQ19ERVNUX1NUUklERSkpOworICAgIFNIKG91dDIsIChkc3QgKyAxMiAqIERDX0RFU1RfU1RSSURFKSk7CisgICAgU0gob3V0MywgKGRzdCArIDE0ICogRENfREVTVF9TVFJJREUpKTsKKyAgICBTSChvdXQ0LCAoZHN0ICsgNSAgKiBEQ19ERVNUX1NUUklERSkpOworICAgIFNIKG91dDUsIChkc3QgKyA3ICAqIERDX0RFU1RfU1RSSURFKSk7CisgICAgU0gob3V0NiwgKGRzdCArIDEzICogRENfREVTVF9TVFJJREUpKTsKKyAgICBTSChvdXQ3LCAoZHN0ICsgMTUgKiBEQ19ERVNUX1NUUklERSkpOwogCiAjdW5kZWYgRENfREVTVF9TVFJJREUKIH0KQEAgLTE2NCwxMSArMTIwLDEyIEBACiAgICAgdjRpMzIgcmVzMF9yLCByZXMxX3IsIHJlczJfciwgcmVzM19yLCByZXM0X3IsIHJlczVfciwgcmVzNl9yLCByZXM3X3I7CiAgICAgdjRpMzIgcmVzMF9sLCByZXMxX2wsIHJlczJfbCwgcmVzM19sLCByZXM0X2wsIHJlczVfbCwgcmVzNl9sLCByZXM3X2w7CiAgICAgdjE2aTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKLSAgICB2MTZpOCB6ZXJvcyA9IHsgMCB9OworICAgIHY4aTE2IHplcm9zID0geyAwIH07CiAKICAgICBzcmNbMF0gKz0gMzI7CiAKICAgICBMRF9TSDgoc3JjLCA4LCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBTVF9TSDgoemVyb3MsIHplcm9zLCB6ZXJvcywgemVyb3MsIHplcm9zLCB6ZXJvcywgemVyb3MsIHplcm9zLCBzcmMsIDgpOwogCiAgICAgdmVjMCA9IHNyYzAgKyBzcmM0OwogICAgIHZlYzEgPSBzcmMwIC0gc3JjNDsKQEAgLTMxNywyNCArMjc0LDczIEBACiAgICAgU1Q4eDRfVUIoZHN0MiwgZHN0MywgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAotdm9pZCBmZl9oMjY0X2lkY3RfYWRkX21zYSh1aW50OF90ICpkc3QsIGludDE2X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlKQordm9pZCBmZl9oMjY0X2lkY3RfYWRkX21zYSh1aW50OF90ICpkc3QsIGludDE2X3QgKnNyYywgaW50MzJfdCBkc3Rfc3RyaWRlKQogewotICAgIGF2Y19pZGN0NHg0X2FkZGJsa19tc2EoZHN0LCBzcmMsIGRzdF9zdHJpZGUpOwotICAgIG1lbXNldChzcmMsIDAsIDE2ICogc2l6ZW9mKGRjdGNvZWYpKTsKKyAgICB1aW50MzJfdCBzcmMwX20sIHNyYzFfbSwgc3JjMl9tLCBzcmMzX20sIG91dDBfbSwgb3V0MV9tLCBvdXQyX20sIG91dDNfbTsKKyAgICB2MTZpOCBkc3QwX20gPSB7IDAgfTsKKyAgICB2MTZpOCBkc3QxX20gPSB7IDAgfTsKKyAgICB2OGkxNiBocmVzMCwgaHJlczEsIGhyZXMyLCBocmVzMywgdnJlczAsIHZyZXMxLCB2cmVzMiwgdnJlczM7CisgICAgdjhpMTYgaW5wMF9tLCBpbnAxX20sIHJlczBfbSwgcmVzMV9tLCBzcmMxLCBzcmMzOworICAgIGNvbnN0IHY4aTE2IHNyYzAgPSBMRF9TSChzcmMpOworICAgIGNvbnN0IHY4aTE2IHNyYzIgPSBMRF9TSChzcmMgKyA4KTsKKyAgICBjb25zdCB2OGkxNiB6ZXJvID0geyAwIH07CisgICAgY29uc3QgdWludDhfdCAqZHN0MSA9IGRzdCArIGRzdF9zdHJpZGU7CisgICAgY29uc3QgdWludDhfdCAqZHN0MiA9IGRzdCArIDIgKiBkc3Rfc3RyaWRlOworICAgIGNvbnN0IHVpbnQ4X3QgKmRzdDMgPSBkc3QgKyAzICogZHN0X3N0cmlkZTsKKworICAgIElMVkxfRDJfU0goc3JjMCwgc3JjMCwgc3JjMiwgc3JjMiwgc3JjMSwgc3JjMyk7CisgICAgU1RfU0gyKHplcm8sIHplcm8sIHNyYywgOCk7CisgICAgQVZDX0lUUkFOU19IKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGhyZXMwLCBocmVzMSwgaHJlczIsIGhyZXMzKTsKKyAgICBUUkFOU1BPU0U0eDRfU0hfU0goaHJlczAsIGhyZXMxLCBocmVzMiwgaHJlczMsIGhyZXMwLCBocmVzMSwgaHJlczIsIGhyZXMzKTsKKyAgICBBVkNfSVRSQU5TX0goaHJlczAsIGhyZXMxLCBocmVzMiwgaHJlczMsIHZyZXMwLCB2cmVzMSwgdnJlczIsIHZyZXMzKTsKKyAgICBzcmMwX20gPSBMVyhkc3QpOworICAgIHNyYzFfbSA9IExXKGRzdDEpOworICAgIFNSQVJJX0g0X1NIKHZyZXMwLCB2cmVzMSwgdnJlczIsIHZyZXMzLCA2KTsKKyAgICBzcmMyX20gPSBMVyhkc3QyKTsKKyAgICBzcmMzX20gPSBMVyhkc3QzKTsKKyAgICBJTFZSX0QyX1NIKHZyZXMxLCB2cmVzMCwgdnJlczMsIHZyZXMyLCBpbnAwX20sIGlucDFfbSk7CisgICAgSU5TRVJUX1cyX1NCKHNyYzBfbSwgc3JjMV9tLCBkc3QwX20pOworICAgIElOU0VSVF9XMl9TQihzcmMyX20sIHNyYzNfbSwgZHN0MV9tKTsKKyAgICBJTFZSX0IyX1NIKHplcm8sIGRzdDBfbSwgemVybywgZHN0MV9tLCByZXMwX20sIHJlczFfbSk7CisgICAgQUREMihyZXMwX20sIGlucDBfbSwgcmVzMV9tLCBpbnAxX20sIHJlczBfbSwgcmVzMV9tKTsKKyAgICBDTElQX1NIMl8wXzI1NShyZXMwX20sIHJlczFfbSk7CisgICAgUENLRVZfQjJfU0IocmVzMF9tLCByZXMwX20sIHJlczFfbSwgcmVzMV9tLCBkc3QwX20sIGRzdDFfbSk7CisgICAgb3V0MF9tID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwX20sIDApOworICAgIG91dDFfbSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MF9tLCAxKTsKKyAgICBvdXQyX20gPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDFfbSwgMCk7CisgICAgb3V0M19tID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QxX20sIDEpOworICAgIFNXKG91dDBfbSwgZHN0KTsKKyAgICBTVyhvdXQxX20sIGRzdDEpOworICAgIFNXKG91dDJfbSwgZHN0Mik7CisgICAgU1cob3V0M19tLCBkc3QzKTsKIH0KIAogdm9pZCBmZl9oMjY0X2lkY3Q4X2FkZGJsa19tc2EodWludDhfdCAqZHN0LCBpbnQxNl90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUpCiB7CiAgICAgYXZjX2lkY3Q4X2FkZGJsa19tc2EoZHN0LCBzcmMsIGRzdF9zdHJpZGUpOwotICAgIG1lbXNldChzcmMsIDAsIDY0ICogc2l6ZW9mKGRjdGNvZWYpKTsKIH0KIAogdm9pZCBmZl9oMjY0X2lkY3Q0eDRfYWRkYmxrX2RjX21zYSh1aW50OF90ICpkc3QsIGludDE2X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlKQogewotICAgIGF2Y19pZGN0NHg0X2FkZGJsa19kY19tc2EoZHN0LCBzcmMsIGRzdF9zdHJpZGUpOworICAgIHYxNnU4IHByZWQgPSB7IDAgfTsKKyAgICB2MTZpOCBvdXQ7CisgICAgdjhpMTYgcHJlZF9yLCBwcmVkX2w7CisgICAgY29uc3QgdWludDMyX3Qgc3JjMCA9IExXKGRzdCk7CisgICAgY29uc3QgdWludDMyX3Qgc3JjMSA9IExXKGRzdCArIGRzdF9zdHJpZGUpOworICAgIGNvbnN0IHVpbnQzMl90IHNyYzIgPSBMVyhkc3QgKyAyICogZHN0X3N0cmlkZSk7CisgICAgY29uc3QgdWludDMyX3Qgc3JjMyA9IExXKGRzdCArIDMgKiBkc3Rfc3RyaWRlKTsKKyAgICBjb25zdCBpbnQxNl90IGRjID0gKHNyY1swXSArIDMyKSA+PiA2OworICAgIGNvbnN0IHY4aTE2IGlucHV0X2RjID0gX19tc2FfZmlsbF9oKGRjKTsKKworICAgIHNyY1swXSA9IDA7CisgICAgSU5TRVJUX1c0X1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHByZWQpOworICAgIFVOUENLX1VCX1NIKHByZWQsIHByZWRfciwgcHJlZF9sKTsKKyAgICBBREQyKHByZWRfciwgaW5wdXRfZGMsIHByZWRfbCwgaW5wdXRfZGMsIHByZWRfciwgcHJlZF9sKTsKKyAgICBDTElQX1NIMl8wXzI1NShwcmVkX3IsIHByZWRfbCk7CisgICAgb3V0ID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHByZWRfbCwgKHYxNmk4KSBwcmVkX3IpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiB2b2lkIGZmX2gyNjRfaWRjdDhfZGNfYWRkYmxrX21zYSh1aW50OF90ICpkc3QsIGludDE2X3QgKnNyYywKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oMjY0cHJlZF9pbml0X21pcHMuYyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0cHJlZF9pbml0X21pcHMuYwppbmRleCA5M2EyNDA5Li5jMzNkOGY3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaDI2NHByZWRfaW5pdF9taXBzLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2gyNjRwcmVkX2luaXRfbWlwcy5jCkBAIC0xMTUsMjMgKzExNSwyMiBAQAogICAgICAgICBoLT5wcmVkOHg4bCBbVE9QX0RDX1BSRUQgICAgICAgICAgICBdID0gZmZfcHJlZDh4OGxfdG9wX2RjXzhfbW1pOwogICAgICAgICBoLT5wcmVkOHg4bCBbRENfUFJFRCAgICAgICAgICAgICAgICBdID0gZmZfcHJlZDh4OGxfZGNfOF9tbWk7CiAKKyNpZiBBUkNIX01JUFM2NAogICAgICAgICBzd2l0Y2ggKGNvZGVjX2lkKSB7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfU1ZRMzoKICAgICAgICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4ICAgICAgXSA9IGZmX3ByZWQxNngxNl9wbGFuZV9zdnEzXzhfbW1pOwotICAgICAgICAgICAgOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUlY0MDoKICAgICAgICAgICAgIGgtPnByZWQxNngxNltQTEFORV9QUkVEOHg4ICAgICAgXSA9IGZmX3ByZWQxNngxNl9wbGFuZV9ydjQwXzhfbW1pOwotICAgICAgICAgICAgOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVlA3OgogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1ZQODoKLSAgICAgICAgICAgIDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaC0+cHJlZDE2eDE2W1BMQU5FX1BSRUQ4eDggICAgICBdID0gZmZfcHJlZDE2eDE2X3BsYW5lX2gyNjRfOF9tbWk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorI2VuZGlmCiAKICAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NWUTMgfHwgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgewogICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjID09IDEpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oMjY0cHJlZF9tbWkuYyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0cHJlZF9tbWkuYwppbmRleCBlOTQ5ZDExLi5mNGZlMDkxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaDI2NHByZWRfbW1pLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2gyNjRwcmVkX21taS5jCkBAIC0yMyw4NyArMjMsMTMyIEBACiAgKi8KIAogI2luY2x1ZGUgImgyNjRwcmVkX21pcHMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2JpdF9kZXB0aF90ZW1wbGF0ZS5jIgorI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL21taXV0aWxzLmgiCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCiAKIHZvaWQgZmZfcHJlZDE2eDE2X3ZlcnRpY2FsXzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIHsKKyAgICBkb3VibGUgZnRtcFsyXTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgImRsaSAkOCwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYyLCA3KCVbc3JjQV0pICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyLCAwKCVbc3JjQV0pICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY0LCAxNSglW3NyY0FdKSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY0LCA4KCVbc3JjQV0pICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RsYzEgJGYyLCA3KCVbc3JjXSkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYyLCAwKCVbc3JjXSkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RsYzEgJGY0LCAxNSglW3NyY10pICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGY0LCA4KCVbc3JjXSkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICVbc3JjXSwgJVtzcmNdLCAlW3N0cmlkZV0gICAgXHJcbiIKLSAgICAgICAgImRhZGRpICQ4LCAkOCwgLTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJDgsIDFiICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbc3JjXSIrJnIiKHNyYykKLSAgICAgICAgOiBbc3RyaWRlXSJyIihzdHJpZGUpLFtzcmNBXSJyIihzcmMtc3RyaWRlKQotICAgICAgICA6ICIkOCIsIiRmMiIsIiRmNCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDBdLCAlW3NyY0FdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtzcmNBXSwgMHgwOCkKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwOCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDgpCisKKyAgICAgICAgImRhZGRpICAgICAgJVt0bXAwXSwgICAgJVt0bXAwXSwgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW3NyY10iKyZyIihzcmMpCisgICAgICAgIDogW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksICAgIFtzcmNBXSJyIigobWlwc19yZWcpKHNyYy1zdHJpZGUpKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAogdm9pZCBmZl9wcmVkMTZ4MTZfaG9yaXpvbnRhbF84X21taSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiB7CisgICAgdWludDY0X3QgdG1wWzNdOworICAgIG1pcHNfcmVnIGFkZHJbMl07CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgImRhZGRpdSAkMiwgJVtzcmNdLCAtMSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQzLCAlW3NyY10sICQwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkNiwgMHgxMCAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNCwgMCgkMikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdWwgJDUsICQ0LCAlW2ZmX3BiXzFdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkbCAkNSwgNygkMykgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkciAkNSwgMCgkMykgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkbCAkNSwgMTUoJDMpICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkciAkNSwgOCgkMykgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQzLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkNiwgLTEgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJDYsIDFiICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOjpbc3JjXSJyIihzcmMpLFtzdHJpZGVdInIiKHN0cmlkZSksW2ZmX3BiXzFdInIiKGZmX3BiXzEpCi0gICAgICAgIDogIiQyIiwiJDMiLCIkNCIsIiQ1IiwiJDYiCisgICAgICAgIFBUUl9BRERJICAgIiVbYWRkcjBdLCAgICVbc3JjXSwgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW3NyY10sICAgICAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAyXSwgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW3RtcDBdLCAgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdWwgICAgICAgJVt0bXAxXSwgICAgJVt0bXAwXSwgICAgICAgICVbZmZfcGJfMV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2wgICAgICAgICVbdG1wMV0sICAgIDB4MDcoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3dyICAgICAgICAlW3RtcDFdLCAgICAweDAwKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3bCAgICAgICAgJVt0bXAxXSwgICAgMHgwZiglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd3IgICAgICAgICVbdG1wMV0sICAgIDB4MDgoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVthZGRyMV0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMF0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG11bCAgICAgICAlW3RtcDFdLCAgICAlW3RtcDBdLCAgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3bCAgICAgICAgJVt0bXAxXSwgICAgMHgwNyglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd3IgICAgICAgICVbdG1wMV0sICAgIDB4MDAoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3dsICAgICAgICAlW3RtcDFdLCAgICAweDBmKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ciAgICAgICAgJVt0bXAxXSwgICAgMHgwOCglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkaSAgICAgICVbdG1wMl0sICAgICVbdG1wMl0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVthZGRyMV0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbdG1wMl0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0bXAwXSI9JnIiKHRtcFswXSksICAgICAgICAgICAgICBbdG1wMV0iPSZyIih0bXBbMV0pLAorICAgICAgICAgIFt0bXAyXSI9JnIiKHRtcFsyXSksCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKQorICAgICAgICA6IFtzcmNdInIiKChtaXBzX3JlZylzcmMpLCAgICAgICAgICBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKSwKKyAgICAgICAgICBbZmZfcGJfMV0iciIoZmZfcGJfMSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKIHZvaWQgZmZfcHJlZDE2eDE2X2RjXzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIHsKKyAgICB1aW50NjRfdCB0bXBbNF07CisgICAgbWlwc19yZWcgYWRkclsyXTsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZGFkZGl1ICQyLCAlW3NyY10sIC0xICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ2LCAweDEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICQ4LCAkOCwgJDggICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ0LCAwKCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ4LCAkNCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDIsICQyLCAlW3N0cmlkZV0gICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ2LCAkNiwgLTEgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkNiwgMWIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ2LCAweDEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibmVndSAkMywgJVtzdHJpZGVdICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDIsICVbc3JjXSwgJDMgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ0LCAwKCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ4LCAkNCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQyLCAkMiwgMSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ2LCAkNiwgLTEgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkNiwgMmIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ4LCAkOCwgMHgxMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkOCwgNSAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG11bCAkNSwgJDgsICVbZmZfcGJfMV0gICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDIsICVbc3JjXSwgJDAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ2LCAweDEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RsICQ1LCA3KCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RyICQ1LCAwKCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RsICQ1LCAxNSgkMikgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RyICQ1LCA4KCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDIsICQyLCAlW3N0cmlkZV0gICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ2LCAkNiwgLTEgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkNiwgM2IgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltzcmNdInIiKHNyYyksW3N0cmlkZV0iciIoc3RyaWRlKSxbZmZfcGJfMV0iciIoZmZfcGJfMSkKLSAgICAgICAgOiAiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIsIiQ4IgorICAgICAgICBQVFJfQURESSAgICIlW2FkZHIwXSwgICAlW3NyY10sICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbdG1wM10sICAgICVbdG1wM10sICAgICAgICAlW3RtcDNdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAgICAgJVt0bXAxXSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkdSAgICAgICVbdG1wM10sICAgICVbdG1wM10sICAgICAgICAlW3RtcDFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAgICAgJVt0bXAxXSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkaSAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZHUgICAgICAlW3RtcDNdLCAgICAlW3RtcDNdLCAgICAgICAgJVt0bXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbdG1wMF0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU1VCVSAgICIlW2FkZHIwXSwgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMV0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZHUgICAgICAlW3RtcDNdLCAgICAlW3RtcDNdLCAgICAgICAgJVt0bXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERElVICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgIDB4MDEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMV0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZGkgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRhZGR1ICAgICAgJVt0bXAzXSwgICAgJVt0bXAzXSwgICAgICAgICVbdG1wMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAweDAxICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiZGFkZGl1ICAgICAlW3RtcDNdLCAgICAlW3RtcDNdLCAgICAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmEgICAgICAgJVt0bXAzXSwgICAgMHgwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXVsICAgICAgICVbdG1wMl0sICAgICVbdG1wM10sICAgICAgICAlW2ZmX3BiXzFdICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyY10sICAgICAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3dsICAgICAgICAlW3RtcDJdLCAgICAweDA3KCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ciAgICAgICAgJVt0bXAyXSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2wgICAgICAgICVbdG1wMl0sICAgIDB4MGYoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3dyICAgICAgICAlW3RtcDJdLCAgICAweDA4KCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd2wgICAgICAgICVbdG1wMl0sICAgIDB4MDcoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3dyICAgICAgICAlW3RtcDJdLCAgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3bCAgICAgICAgJVt0bXAyXSwgICAgMHgwZiglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd3IgICAgICAgICVbdG1wMl0sICAgIDB4MDgoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZGkgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbdG1wMF0sICAgIDNiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0bXAwXSI9JnIiKHRtcFswXSksICAgICAgICAgICAgICBbdG1wMV0iPSZyIih0bXBbMV0pLAorICAgICAgICAgIFt0bXAyXSI9JnIiKHRtcFsyXSksICAgICAgICAgICAgICBbdG1wM10iPSZyIih0bXBbM10pLAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSkKKyAgICAgICAgOiBbc3JjXSJyIigobWlwc19yZWcpc3JjKSwgICAgICAgICAgW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksCisgICAgICAgICAgW2ZmX3BiXzFdInIiKGZmX3BiXzEpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCkBAIC0xMTEsNzYgKzE1Niw5NyBAQAogICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIHVpbnQzMl90IGRjOworICAgIGRvdWJsZSBmdG1wWzExXTsKKyAgICBtaXBzX3JlZyB0bXBbM107CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisgICAgREVDTEFSRV9WQVJfQUREUlQ7CiAKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgImxkbCAkOCwgNyglW3NyY0FdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkciAkOCwgMCglW3NyY0FdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkbCAkOSwgNyglW3NyYzBdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkciAkOSwgMCglW3NyYzBdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkbCAkMTAsIDcoJVtzcmMxXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkciAkMTAsIDAoJVtzcmMxXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ4LCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ5LCAkZjQgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQxMCwgJGY2ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjgsICRmMiwgJGYwICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjEwLCAkZjIsICRmMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEyLCAkZjQsICRmMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjE0LCAkZjQsICRmMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE2LCAkZjYsICRmMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjE4LCAkZjYsICRmMCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJVtoYXNfdG9wbGVmdF0sIDFmICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBpbnNyaF8wICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJVtoYXNfdG9wcmlnaHRdLCAyZiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBpbnNyaF8zICRmMTgsICRmMTgsICRmMTQgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkOCwgJDAsIDIgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ4LCAkZjIwICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzaHVmaCAkZjIyLCAkZjIwLCAkZjAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjEyLCAkZjEyLCAkZjIyICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjE0LCAkZjE0LCAkZjIyICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTAsICRmMTAsICRmMTQgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmOCwgJGY4LCAkZjE2ICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTAsICRmMTAsICRmMTggICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmOCwgJGY4LCAkZjIyICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMTAsICRmMTAsICRmMjIgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmOCwgJGY4LCAkZjIwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTAsICRmMTAsICRmMjAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmNCwgJGY4LCAkZjEwICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJpYWRkICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1mYzEgJDksICRmMiAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImFkZGl1ICQ5LCAkOSwgNCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDksICQ5LCAzICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm11bCAlW2RjXSwgJDksICVbZmZfcGJfMV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbZGNdIj1yIihkYykKLSAgICAgICAgOiBbc3JjQV0iciIoc3JjLXN0cmlkZS0xKSxbc3JjMF0iciIoc3JjLXN0cmlkZSksCi0gICAgICAgICAgW3NyYzFdInIiKHNyYy1zdHJpZGUrMSksW2hhc190b3BsZWZ0XSJyIihoYXNfdG9wbGVmdCksCi0gICAgICAgICAgW2hhc190b3ByaWdodF0iciIoaGFzX3RvcHJpZ2h0KSxbZmZfcGJfMV0iciIoZmZfcGJfMSkKLSAgICAgICAgOiAiJDgiLCIkOSIsIiQxMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsIiRmMTAiLCIkZjEyIiwiJGYxNCIsIiRmMTYiLAotICAgICAgICAgICIkZjE4IiwiJGYyMCIsIiRmMjIiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMTBdLCAlW3NyY0FdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wOV0sICVbc3JjMF0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA4XSwgJVtzcmMxXSwgMHgwMCkKKworICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA3XSwgICAlW2Z0bXAxMF0sICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wMTBdLCAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDldLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDJdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hhc190b3BsZWZ0XSwgICAgICAgICAgICAgMWYgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBpbnNyaF8wICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaGFzX3RvcHJpZ2h0XSwgICAgICAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGluc3JoXzMgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd18yXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcHdfMl0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmZl9wd18yXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfMl0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wOV0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJiaWFkZCAgICAgICVbZnRtcDEwXSwgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZjMSAgICAgICAlW3RtcDFdLCAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgIDB4MDQgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzcmwgICAgICAgICVbdG1wMV0sICAgICVbdG1wMV0sICAgICAgICAweDAzICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsICAgICAgICAlW2RjXSwgICAgICAlW3RtcDFdLCAgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW2Z0bXAxMF0iPSZmIihmdG1wWzEwXSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwgICAgICAgICAgICAgIFt0bXAxXSI9JnIiKHRtcFsxXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2RjXSI9ciIoZGMpCisgICAgICAgIDogW3NyY0FdInIiKChtaXBzX3JlZykoc3JjLXN0cmlkZS0xKSksCisgICAgICAgICAgW3NyYzBdInIiKChtaXBzX3JlZykoc3JjLXN0cmlkZSkpLAorICAgICAgICAgIFtzcmMxXSJyIigobWlwc19yZWcpKHNyYy1zdHJpZGUrMSkpLAorICAgICAgICAgIFtoYXNfdG9wbGVmdF0iciIoaGFzX3RvcGxlZnQpLCAgICBbaGFzX3RvcHJpZ2h0XSJyIihoYXNfdG9wcmlnaHQpLAorICAgICAgICAgIFtmZl9wYl8xXSJyIihmZl9wYl8xKSwgICAgICAgICAgICBbZmZfcHdfMl0iZiIoZmZfcHdfMikKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiAKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgImRsaSAkOCwgOCAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjIsICVbZGNdLCAlW2RjXSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RsYzEgJGYyLCA3KCVbc3JjXSkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYyLCAwKCVbc3JjXSkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICVbc3JjXSwgJVtzcmNdLCAlW3N0cmlkZV0gICAgXHJcbiIKLSAgICAgICAgImRhZGRpICQ4LCAkOCwgLTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJDgsIDFiICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbc3JjXSIrJnIiKHNyYykKLSAgICAgICAgOiBbZGNdImYiKGRjKSxbc3RyaWRlXSJyIihzdHJpZGUpCi0gICAgICAgIDogIiQ4IiwiJGYyIgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2x3ZCAgJVtmdG1wMF0sICAgJVtkY10sICAgICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAwXSwgJVtzcmNdLCAlW3N0cmlkZV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDBdLCAlW3NyY10sICVbc3RyaWRlXSwgMHgwMCkKKworICAgICAgICAiZGFkZGkgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbZGNdImYiKGRjKSwgICAgICAgICAgICAgICAgICAgICAgW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKLXZvaWQgZmZfcHJlZDh4OGxfZGNfOF9tbWkodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCi0gICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBzdHJpZGUpCit2b2lkIGZmX3ByZWQ4eDhsX2RjXzhfbW1pKHVpbnQ4X3QgKnNyYywgaW50IGhhc190b3BsZWZ0LCBpbnQgaGFzX3RvcHJpZ2h0LAorICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIHVpbnQzMl90IGRjLCBkYzEsIGRjMjsKKyAgICBkb3VibGUgZnRtcFsxNF07CisgICAgbWlwc19yZWcgdG1wWzFdOwogCiAgICAgY29uc3QgaW50IGwwID0gKChoYXNfdG9wbGVmdCA/IHNyY1stMSstMSpzdHJpZGVdIDogc3JjWy0xKzAqc3RyaWRlXSkgKyAyKnNyY1stMSswKnN0cmlkZV0gKyBzcmNbLTErMSpzdHJpZGVdICsgMikgPj4gMjsKICAgICBjb25zdCBpbnQgbDEgPSAoc3JjWy0xKzAqc3RyaWRlXSArIDIqc3JjWy0xKzEqc3RyaWRlXSArIHNyY1stMSsyKnN0cmlkZV0gKyAyKSA+PiAyOwpAQCAtMTkxLDE0MSArMjU3LDE3MyBAQAogICAgIGNvbnN0IGludCBsNiA9IChzcmNbLTErNSpzdHJpZGVdICsgMipzcmNbLTErNipzdHJpZGVdICsgc3JjWy0xKzcqc3RyaWRlXSArIDIpID4+IDI7CiAgICAgY29uc3QgaW50IGw3ID0gKHNyY1stMSs2KnN0cmlkZV0gKyAyKnNyY1stMSs3KnN0cmlkZV0gKyBzcmNbLTErNypzdHJpZGVdICsgMikgPj4gMjsKIAorICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJsZGwgJDgsIDcoJVtzcmNBXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZHIgJDgsIDAoJVtzcmNBXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGwgJDksIDcoJVtzcmMwXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZHIgJDksIDAoJVtzcmMwXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGwgJDEwLCA3KCVbc3JjMV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZHIgJDEwLCAwKCVbc3JjMV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOSwgJGY0ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTAsICRmNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMCwgJGYwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjIsICRmMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxMCwgJGYyLCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGY0LCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxNCwgJGY0LCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxNiwgJGY2LCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxOCwgJGY2LCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJDgsICQwLCAzICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOCwgJGYyMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYyOCwgJGYxMCwgJGYyMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYzMCwgJGYxOCwgJGYyMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwaW5zcmhfMyAkZjEwLCAkZjEwLCAkZjMwICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwaW5zcmhfMyAkZjE4LCAkZjE4LCAkZjI4ICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICVbaGFzX3RvcGxlZnRdLCAxZiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwaW5zcmhfMCAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICVbaGFzX3RvcHJpZ2h0XSwgMmYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYzMCwgJGYxNCwgJGYyMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwaW5zcmhfMyAkZjEwLCAkZjEwLCAkZjMwICAgICAgICAgIFxyXG4iCi0gICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJDgsICQwLCAyICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOCwgJGYyMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYyMiwgJGYyMCwgJGYwICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxMiwgJGYxMiwgJGYyMiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxNCwgJGYxNCwgJGYyMiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjE0ICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGYxNiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjE4ICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGYyMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjIyICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmOCwgJGYyMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjEwLCAkZjEwLCAkZjIwICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjQsICRmOCwgJGYxMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJiaWFkZCAkZjIsICRmNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtZmMxICVbZGMyXSwgJGYyICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW2RjMl0iPXIiKGRjMikKLSAgICAgICAgOiBbc3JjQV0iciIoc3JjLXN0cmlkZS0xKSxbc3JjMF0iciIoc3JjLXN0cmlkZSksCi0gICAgICAgICAgW3NyYzFdInIiKHNyYy1zdHJpZGUrMSksW2hhc190b3BsZWZ0XSJyIihoYXNfdG9wbGVmdCksCi0gICAgICAgICAgW2hhc190b3ByaWdodF0iciIoaGFzX3RvcHJpZ2h0KQotICAgICAgICA6ICIkOCIsIiQ5IiwiJDEwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIsCi0gICAgICAgICAgIiRmMTgiLCIkZjIwIiwiJGYyMiIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDRdLCAlW3NyY0FdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNV0sICVbc3JjMF0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA2XSwgJVtzcmMxXSwgMHgwMCkKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA3XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wOF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA5XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMTBdLCAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDExXSwgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxMl0sICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wM10sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDEzXSwgICVbZnRtcDEyXSwgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGluc3JoXzMgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMTNdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBpbnNyaF8zICAgJVtmdG1wMTJdLCAgJVtmdG1wMTJdLCAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaGFzX3RvcGxlZnRdLCAgICAgICAgICAgICAxZiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGluc3JoXzAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoYXNfdG9wcmlnaHRdLCAgICAgICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDEzXSwgICVbZnRtcDEwXSwgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGluc3JoXzMgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMTNdICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDEwXSwgICVbZnRtcDEwXSwgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMTJdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDVdLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYmlhZGQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1mYzEgICAgICAgJVtkYzJdLCAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLCAgICAgICAgICBbZnRtcDExXSI9JmYiKGZ0bXBbMTFdKSwKKyAgICAgICAgICBbZnRtcDEyXSI9JmYiKGZ0bXBbMTJdKSwgICAgICAgICAgW2Z0bXAxM10iPSZmIihmdG1wWzEzXSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbZGMyXSI9ciIoZGMyKQorICAgICAgICA6IFtzcmNBXSJyIigobWlwc19yZWcpKHNyYy1zdHJpZGUtMSkpLAorICAgICAgICAgIFtzcmMwXSJyIigobWlwc19yZWcpKHNyYy1zdHJpZGUpKSwKKyAgICAgICAgICBbc3JjMV0iciIoKG1pcHNfcmVnKShzcmMtc3RyaWRlKzEpKSwKKyAgICAgICAgICBbaGFzX3RvcGxlZnRdInIiKGhhc190b3BsZWZ0KSwgICAgW2hhc190b3ByaWdodF0iciIoaGFzX3RvcHJpZ2h0KQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIAogICAgIGRjMSA9IGwwK2wxK2wyK2wzK2w0K2w1K2w2K2w3OwogICAgIGRjID0gKChkYzErZGMyKzgpPj40KSoweDAxMDEwMTAxVTsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZGxpICQ4LCA4ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMiwgJVtkY10sICVbZGNdICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIsIDcoJVtzcmNdKSAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjIsIDAoJVtzcmNdKSAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJVtzcmNdLCAlW3NyY10sICVbc3RyaWRlXSAgICBcclxuIgotICAgICAgICAiZGFkZGkgJDgsICQ4LCAtMSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkOCwgMWIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6IFtzcmNdIismciIoc3JjKQotICAgICAgICA6IFtkY10iZiIoZGMpLFtzdHJpZGVdInIiKHN0cmlkZSkKLSAgICAgICAgOiAiJDgiLCIkZjIiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbHdkICAlW2Z0bXAwXSwgICAlW2RjXSwgICAgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDBdLCAlW3NyY10sICVbc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wMF0sICVbc3JjXSwgJVtzdHJpZGVdLCAweDAwKQorCisgICAgICAgICJkYWRkaSAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbdG1wMF0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFtkY10iZiIoZGMpLCAgICAgICAgICAgICAgICAgICAgICBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAogdm9pZCBmZl9wcmVkOHg4bF92ZXJ0aWNhbF84X21taSh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwKICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSkKIHsKKyAgICBkb3VibGUgZnRtcFsxMl07CisgICAgbWlwc19yZWcgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJsZGwgJDgsIDcoJVtzcmNBXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZHIgJDgsIDAoJVtzcmNBXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGwgJDksIDcoJVtzcmMwXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZHIgJDksIDAoJVtzcmMwXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGwgJDEwLCA3KCVbc3JjMV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZHIgJDEwLCAwKCVbc3JjMV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOCwgJGYyICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOSwgJGY0ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTAsICRmNiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMCwgJGYwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjIsICRmMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxMCwgJGYyLCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGY0LCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxNCwgJGY0LCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxNiwgJGY2LCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxOCwgJGY2LCAkZjAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICVbaGFzX3RvcGxlZnRdLCAxZiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwaW5zcmhfMCAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICVbaGFzX3RvcHJpZ2h0XSwgMmYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwaW5zcmhfMyAkZjE4LCAkZjE4LCAkZjE0ICAgICAgICAgIFxyXG4iCi0gICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJDgsICQwLCAyICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkOCwgJGYyMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYyMiwgJGYyMCwgJGYwICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxMiwgJGYxMiwgJGYyMiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxNCwgJGYxNCwgJGYyMiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGYxMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjE0ICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGYxNiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjE4ICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjgsICRmOCwgJGYyMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjEwLCAkZjEwLCAkZjIyICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjgsICRmOCwgJGYyMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjEwLCAkZjEwLCAkZjIwICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjQsICRmOCwgJGYxMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMCglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW3NyY10iPXIiKHNyYykKLSAgICAgICAgOiBbc3JjQV0iciIoc3JjLXN0cmlkZS0xKSxbc3JjMF0iciIoc3JjLXN0cmlkZSksCi0gICAgICAgICAgW3NyYzFdInIiKHNyYy1zdHJpZGUrMSksW2hhc190b3BsZWZ0XSJyIihoYXNfdG9wbGVmdCksCi0gICAgICAgICAgW2hhc190b3ByaWdodF0iciIoaGFzX3RvcHJpZ2h0KQotICAgICAgICA6ICIkOCIsIiQ5IiwiJDEwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIsCi0gICAgICAgICAgIiRmMTgiLCIkZjIwIiwiJGYyMiIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDNdLCAlW3NyY0FdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtzcmMwXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNV0sICVbc3JjMV0sIDB4MDApCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDZdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA3XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wOF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDldLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxMF0sICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMTFdLCAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaGFzX3RvcGxlZnRdLCAgICAgICAgICAgICAxZiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGluc3JoXzAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoYXNfdG9wcmlnaHRdLCAgICAgICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwaW5zcmhfMyAgICVbZnRtcDExXSwgICVbZnRtcDExXSwgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDRdLCAlW3NyY10sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLCAgICAgICAgICBbZnRtcDExXSI9JmYiKGZ0bXBbMTFdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtzcmNdIj1yIihzcmMpCisgICAgICAgIDogW3NyY0FdInIiKChtaXBzX3JlZykoc3JjLXN0cmlkZS0xKSksCisgICAgICAgICAgW3NyYzBdInIiKChtaXBzX3JlZykoc3JjLXN0cmlkZSkpLAorICAgICAgICAgIFtzcmMxXSJyIigobWlwc19yZWcpKHNyYy1zdHJpZGUrMSkpLAorICAgICAgICAgIFtoYXNfdG9wbGVmdF0iciIoaGFzX3RvcGxlZnQpLCAgICBbaGFzX3RvcHJpZ2h0XSJyIihoYXNfdG9wcmlnaHQpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkbGkgJDgsIDcgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgNyglW3NyY10pICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMiwgMCglW3NyY10pICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbc3JjXSwgJVtzcmNdLCAlW3N0cmlkZV0gICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmMiwgNyglW3NyY10pICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkcmMxICRmMiwgMCglW3NyY10pICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAlW3NyY10sICVbc3JjXSwgJVtzdHJpZGVdICAgIFxyXG4iCi0gICAgICAgICJkYWRkaSAkOCwgJDgsIC0xICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICQ4LCAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW3NyY10iKyZyIihzcmMpCi0gICAgICAgIDogW3N0cmlkZV0iciIoc3RyaWRlKQotICAgICAgICA6ICIkOCIsIiRmMiIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisKKyAgICAgICAgImRhZGRpICAgICAgJVt0bXAwXSwgICAgJVt0bXAwXSwgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbc3RyaWRlXSJyIigobWlwc19yZWcpc3RyaWRlKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIApAQCAtMzM1LDQ0NiArNDMzLDU1MyBAQAogICAgIGNvbnN0IGludCBkYyA9IChzcmNbLXN0cmlkZV0gKyBzcmNbMS1zdHJpZGVdICsgc3JjWzItc3RyaWRlXQogICAgICAgICAgICAgICAgICArIHNyY1szLXN0cmlkZV0gKyBzcmNbLTErMCpzdHJpZGVdICsgc3JjWy0xKzEqc3RyaWRlXQogICAgICAgICAgICAgICAgICArIHNyY1stMSsyKnN0cmlkZV0gKyBzcmNbLTErMypzdHJpZGVdICsgNCkgPj4zOworICAgIHVpbnQ2NF90IHRtcFsyXTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0FERFJUOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkYWRkdSAkMiwgJVtkY10sICQwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXVsICQzLCAkMiwgJVtmZl9wYl8xXSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJDQsICQ0LCAkNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3eCAkMywgMCglW3NyY10sJDQpICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkNCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3eCAkMywgMCglW3NyY10sJDQpICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkNCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3eCAkMywgMCglW3NyY10sJDQpICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkNCwgJVtzdHJpZGVdICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3eCAkMywgMCglW3NyY10sJDQpICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3NyY10iciIoc3JjKSxbc3RyaWRlXSJyIihzdHJpZGUpLFtkY10iciIoZGMpLFtmZl9wYl8xXSJyIihmZl9wYl8xKQotICAgICAgICA6ICIkMiIsIiQzIiwiJDQiCisgICAgICAgIFBUUl9BRERVICAgIiVbdG1wMF0sICAgICVbZGNdLCAgICAgICAgICAkMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG11bCAgICAgICAlW3RtcDFdLCAgICAlW3RtcDBdLCAgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV1goJVt0bXAxXSwgJVtzcmNdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV1goJVt0bXAxXSwgJVtzcmNdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV1goJVt0bXAxXSwgJVtzcmNdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV1goJVt0bXAxXSwgJVtzcmNdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgOiBbdG1wMF0iPSZyIih0bXBbMF0pLCAgICAgICAgICAgICAgW3RtcDFdIj0mciIodG1wWzFdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSkKKyAgICAgICAgOiBbc3JjXSJyIigobWlwc19yZWcpc3JjKSwgICAgICAgICAgW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksCisgICAgICAgICAgW2RjXSJyIihkYyksICAgICAgICAgICAgICAgICAgICAgIFtmZl9wYl8xXSJyIihmZl9wYl8xKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAogdm9pZCBmZl9wcmVkOHg4X3ZlcnRpY2FsXzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIHsKKyAgICB1aW50NjRfdCB0bXBbMl07CisgICAgbWlwc19yZWcgYWRkclsyXTsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZHN1YnUgJDIsICVbc3JjXSwgJVtzdHJpZGVdICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3JjXSwgJDAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRsICQ0LCA3KCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRyICQ0LCAwKCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ1LCAweDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RsICQ0LCA3KCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RyICQ0LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ1LCAtMSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkNSwgMWIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltzcmNdInIiKHNyYyksW3N0cmlkZV0iciIoc3RyaWRlKQotICAgICAgICA6ICIkMiIsIiQzIiwiJDQiLCIkNSIKKyAgICAgICAgUFRSX1NVQlUgICAiJVthZGRyMF0sICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbc3JjXSwgICAgICAgICAkMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGRsICAgICAgICAlW3RtcDBdLCAgICAweDA3KCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxkciAgICAgICAgJVt0bXAwXSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMV0sICAgIDB4MDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNkbCAgICAgICAgJVt0bXAwXSwgICAgMHgwNyglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzZHIgICAgICAgICVbdG1wMF0sICAgIDB4MDAoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNkbCAgICAgICAgJVt0bXAwXSwgICAgMHgwNyglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzZHIgICAgICAgICVbdG1wMF0sICAgIDB4MDAoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZGkgICAgICAlW3RtcDFdLCAgICAtMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbdG1wMV0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0bXAwXSI9JnIiKHRtcFswXSksICAgICAgICAgICAgICBbdG1wMV0iPSZyIih0bXBbMV0pLAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSkKKyAgICAgICAgOiBbc3JjXSJyIigobWlwc19yZWcpc3JjKSwgICAgICAgICAgW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKIHZvaWQgZmZfcHJlZDh4OF9ob3Jpem9udGFsXzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIHsKKyAgICB1aW50NjRfdCB0bXBbM107CisgICAgbWlwc19yZWcgYWRkclsyXTsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZGFkZGl1ICQyLCAlW3NyY10sIC0xICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3JjXSwgJDAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ2LCAweDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ0LCAwKCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG11bCAkNSwgJDQsICVbZmZfcGJfMV0gICAgICAgICAgICBcclxuIgotICAgICAgICAic2RsICQ1LCA3KCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RyICQ1LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDIsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ2LCAtMSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkNiwgMWIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltzcmNdInIiKHNyYyksW3N0cmlkZV0iciIoc3RyaWRlKSxbZmZfcGJfMV0iciIoZmZfcGJfMSkKLSAgICAgICAgOiAiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIKKyAgICAgICAgUFRSX0FEREkgICAiJVthZGRyMF0sICAgJVtzcmNdLCAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbc3JjXSwgICAgICAgICAkMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMV0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG11bCAgICAgICAlW3RtcDJdLCAgICAlW3RtcDFdLCAgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3bCAgICAgICAgJVt0bXAyXSwgICAgMHgwNyglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd3IgICAgICAgICVbdG1wMl0sICAgIDB4MDAoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVthZGRyMV0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMV0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG11bCAgICAgICAlW3RtcDJdLCAgICAlW3RtcDFdLCAgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3bCAgICAgICAgJVt0bXAyXSwgICAgMHgwNyglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd3IgICAgICAgICVbdG1wMl0sICAgIDB4MDAoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZGkgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbYWRkcjFdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdG1wMF0iPSZyIih0bXBbMF0pLCAgICAgICAgICAgICAgW3RtcDFdIj0mciIodG1wWzFdKSwKKyAgICAgICAgICBbdG1wMl0iPSZyIih0bXBbMl0pLAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSkKKyAgICAgICAgOiBbc3JjXSJyIigobWlwc19yZWcpc3JjKSwgICAgICAgICAgW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksCisgICAgICAgICAgW2ZmX3BiXzFdInIiKGZmX3BiXzEpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCi1zdGF0aWMgdm9pZCBmZl9wcmVkMTZ4MTZfcGxhbmVfY29tcGF0XzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKLSAgICAgICAgY29uc3QgaW50IHN2cTMsIGNvbnN0IGludCBydjQwKQotewotICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAibmVndSAkMiwgJVtzdHJpZGVdICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3JjXSwgJDIgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmOCwgJGY4LCAkZjggICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjAsIDIoJDMpICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjAsIC0xKCQzKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjIsIDYoJDMpICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjIsIDMoJDMpICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjQsIDExKCQzKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjQsIDgoJDMpICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjYsIDE1KCQzKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjYsIDEyKCQzKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMCwgJGYwLCAkZjggICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjggICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjggICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNiwgJGY2LCAkZjggICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJVtmZl9wd19tOHRvbTVdLCAkZjIwICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJVtmZl9wd19tNHRvbTFdLCAkZjIyICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJVtmZl9wd18xdG80XSwgJGYyNCAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJVtmZl9wd181dG84XSwgJGYyNiAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMCwgJGYwLCAkZjIwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjIyICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmNCwgJGY0LCAkZjI0ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmNiwgJGY2LCAkZjI2ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ0LCAweEUgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDQsICRmMjggICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmMiwgJGYwLCAkZjI4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ0LCAweDEgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDQsICRmMzAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmMiwgJGYwLCAkZjMwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTAsICRmMCwgJGYyICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQzLCAlW3NyY10sIC0xICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICQyICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ0LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ4LCAxNigkMykgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ1LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ2LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ3LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNSwgMTYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNiwgMzIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNywgNDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDYsICQ3ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDQsICQ1ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDQsICQ2ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDQsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ0LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ1LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ2LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ3LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNSwgMTYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNiwgMzIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNywgNDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDYsICQ3ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDQsICQ1ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDQsICQ2ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDQsICRmMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ0LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ1LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ2LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ3LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNSwgMTYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNiwgMzIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNywgNDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDYsICQ3ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDQsICQ1ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDQsICQ2ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDQsICRmNCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ0LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ1LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ2LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ3LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDgsICQ3ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ4LCAxICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkOCwgNCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNSwgMTYgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNiwgMzIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkNywgNDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDYsICQ3ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDQsICQ1ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJDQsICQ2ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDQsICRmNiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMCwgJGYwLCAkZjIwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjIyICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmNCwgJGY0LCAkZjI0ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmNiwgJGY2LCAkZjI2ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmMiwgJGYwLCAkZjI4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmMiwgJGYwLCAkZjMwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTIsICRmMCwgJGYyICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG1mYzEgJDIsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkMiwgNDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkMiwgNDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG1mYzEgJDMsICRmMTIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNsbCAkMywgNDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkMywgNDggICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYmVxeiAlW3N2cTNdLCAxZiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ0LCA0ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGRpdiAkMiwgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGRpdiAkMywgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ0LCA1ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG11bCAkMiwgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG11bCAkMywgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ0LCAxNiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGRpdiAkMiwgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGRpdiAkMywgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDQsICQyLCAkMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDIsICQzLCAkMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICQ0LCAkMCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYiAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYmVxeiAlW3J2NDBdLCAxZiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkNCwgJDIsIDIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDIsICQ0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkNCwgJDMsIDIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICQ0ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkMiwgNCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkMywgNCAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYiAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ0LCA1ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG11bCAkMiwgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG11bCAkMywgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQyLCAzMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQzLCAzMiAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkMiwgNiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHNyYSAkMywgNiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDUsICQyLCAkMyAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ0LCA3ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG11bCAkNSwgJDQgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZHN1YnUgJDgsICQ1ICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDAsICRmOCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDIsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmMCwgJGYwLCAkZjggICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDMsICRmMTAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmMTAsICRmMTAsICRmOCAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDgsICRmMTIgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNodWZoICRmMTIsICRmMTIsICRmOCAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ0LCA1ICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG10YzEgJDQsICRmMTQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMiwgJVtmZl9wd18wdG8zXSwgJGYwICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmNCwgJVtmZl9wd180dG83XSwgJGYwICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmNiwgJVtmZl9wd184dG9iXSwgJGYwICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmOCwgJVtmZl9wd19jdG9mXSwgJGYwICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3JjXSwgJDAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQyLCAxNiAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTYsICRmMiwgJGYxMiAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxNiwgJGYxNiwgJGYxNCAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTgsICRmNCwgJGYxMiAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxOCwgJGYxOCwgJGYxNCAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyMCwgJGYxNiwgJGYxOCAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIwLCA3KCQzKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjIwLCAwKCQzKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTYsICRmNiwgJGYxMiAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxNiwgJGYxNiwgJGYxNCAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTgsICRmOCwgJGYxMiAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYxOCwgJGYxOCwgJGYxNCAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyMCwgJGYxNiwgJGYxOCAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIwLCAxNSgkMykgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjIwLCA4KCQzKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTIsICRmMTIsICRmMTAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQyLCAtMSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkMiwgMWIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltzcmNdInIiKHNyYyksW3N0cmlkZV0iciIoc3RyaWRlKSxbc3ZxM10iciIoc3ZxMyksW3J2NDBdInIiKHJ2NDApLAotICAgICAgICAgIFtmZl9wd19tOHRvbTVdInIiKGZmX3B3X204dG9tNSksW2ZmX3B3X200dG9tMV0iciIoZmZfcHdfbTR0b20xKSwKLSAgICAgICAgICBbZmZfcHdfMXRvNF0iciIoZmZfcHdfMXRvNCksW2ZmX3B3XzV0bzhdInIiKGZmX3B3XzV0bzgpLAotICAgICAgICAgIFtmZl9wd18wdG8zXSJmIihmZl9wd18wdG8zKSxbZmZfcHdfNHRvN10iZiIoZmZfcHdfNHRvNyksCi0gICAgICAgICAgW2ZmX3B3Xzh0b2JdImYiKGZmX3B3Xzh0b2IpLFtmZl9wd19jdG9mXSJmIihmZl9wd19jdG9mKQotICAgICAgICA6ICIkMiIsIiQzIiwiJDQiLCIkNSIsIiQ2IiwiJDciLCIkOCIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsCi0gICAgICAgICAgIiRmMTAiLCIkZjEyIiwiJGYxNCIsIiRmMTYiLCIkZjE4IiwiJGYyMCIsIiRmMjIiLCIkZjI0IiwiJGYyNiIsCi0gICAgICAgICAgIiRmMjgiLCIkZjMwIgotICAgICk7Ci19Ci0KLXZvaWQgZmZfcHJlZDE2eDE2X3BsYW5lX3N2cTNfOF9tbWkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGZmX3ByZWQxNngxNl9wbGFuZV9jb21wYXRfOF9tbWkoc3JjLCBzdHJpZGUsIDEsIDApOwotfQotCi12b2lkIGZmX3ByZWQxNngxNl9wbGFuZV9ydjQwXzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBmZl9wcmVkMTZ4MTZfcGxhbmVfY29tcGF0XzhfbW1pKHNyYywgc3RyaWRlLCAwLCAxKTsKLX0KLQotdm9pZCBmZl9wcmVkMTZ4MTZfcGxhbmVfaDI2NF84X21taSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgZmZfcHJlZDE2eDE2X3BsYW5lX2NvbXBhdF84X21taShzcmMsIHN0cmlkZSwgMCwgMCk7Ci19Ci0KIHZvaWQgZmZfcHJlZDh4OF90b3BfZGNfOF9tbWkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogeworICAgIGRvdWJsZSBmdG1wWzRdOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkbGkgJDIsIDIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYyLCAkZjIsICRmMiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYzMCwgJGYzMCwgJGYzMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJuZWd1ICQzLCAlW3N0cmlkZV0gICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkMywgJDMsICVbc3JjXSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNCwgNygkMykgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNCwgMCgkMykgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYwLCAkZjQsICRmMzAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYyLCAkZjQsICRmMzAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJiaWFkZCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJiaWFkZCAkZjIsICRmMiAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYwLCAkZjAsICRmMzAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGYyLCAkZjIsICRmMzAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc2h1ZmggJGY0LCAkZjQsICRmMzAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNoICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdXNoICRmMiwgJGYyLCAkZjQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMiwgJGY0ICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjIsICRmMiwgJGY0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjQsICRmMCwgJGYyICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbGkgJDIsIDggICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmNCwgNyglW3NyY10pICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkcmMxICRmNCwgMCglW3NyY10pICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAlW3NyY10sICUwLCAlW3N0cmlkZV0gICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJDIsICQyLCAtMSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICQyLCAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W3NyY10iciIoc3JjKSxbc3RyaWRlXSJyIihzdHJpZGUpCi0gICAgICAgIDogIiQyIiwiJDMiLCIkZjAiLCIkZjIiLCIkZjQiLCIkZjMwIgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9TVUJVICAgIiVbYWRkcjBdLCAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJpYWRkICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJiaWFkZCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2ggICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNoICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCiB2b2lkIGZmX3ByZWQ4eDhfZGNfOF9tbWkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogeworICAgIGRvdWJsZSBmdG1wWzVdOworICAgIG1pcHNfcmVnIGFkZHJbN107CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgIm5lZ3UgJDIsICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMiwgJVtzcmNdICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkNSwgJDIsIDQgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNiwgMCgkMikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQzLCAkMCwgJDYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkMiwgMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNiwgMCgkNSkgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ0LCAkMCwgJDYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkNSwgMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNiwgMCgkMikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQzLCAkMywgJDYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkMiwgMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNiwgMCgkNSkgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ0LCAkNCwgJDYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkNSwgMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNiwgMCgkMikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQzLCAkMywgJDYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkMiwgMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNiwgMCgkNSkgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ0LCAkNCwgJDYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkNSwgMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNiwgMCgkMikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQzLCAkMywgJDYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkMiwgMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNiwgMCgkNSkgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ0LCAkNCwgJDYgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkNSwgMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkNiwgLTEgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNiwgJVtzcmNdICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNSwgMCgkNikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ3LCAkMCwgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNSwgMCgkNikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ3LCAkNywgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNSwgMCgkNikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ3LCAkNywgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNSwgMCgkNikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ3LCAkNywgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNSwgMCgkNikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ4LCAkMCwgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNSwgMCgkNikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ4LCAkOCwgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNSwgMCgkNikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ4LCAkOCwgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxidSAkNSwgMCgkNikgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ4LCAkOCwgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQzLCAkMywgJDcgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkMywgJDMsIDQgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkNCwgJDQsIDIgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpdSAkNSwgJDgsIDIgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQ2LCAkNCwgJDUgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDMsIDMgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDQsIDIgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDUsIDIgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRzcmwgJDYsIDMgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjMwLCAkZjMwLCAkZjMwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQzLCAkZjAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzaHVmaCAkZjAsICRmMCwgJGYzMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ0LCAkZjIgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzaHVmaCAkZjIsICRmMiwgJGYzMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ1LCAkZjQgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzaHVmaCAkZjQsICRmNCwgJGYzMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQ2LCAkZjYgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzaHVmaCAkZjYsICRmNiwgJGYzMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMCwgJGYwLCAkZjIgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMiwgJGY0LCAkZjYgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMCwgJVtzcmNdICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYwLCAwKCQyKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYwLCAwKCQyKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYwLCAwKCQyKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYwLCAwKCQyKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYyLCAwKCQyKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYyLCAwKCQyKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYyLCAwKCQyKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICQyLCAkMiwgJVtzdHJpZGVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYyLCAwKCQyKSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOjpbc3JjXSJyIihzcmMpLFtzdHJpZGVdInIiKHN0cmlkZSkKLSAgICAgICAgOiAiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIsIiQ3IiwiJDgiLCIkZjAiLCIkZjIiLCIkZjQiLCIkZjYiLCIkZjMwIgorICAgICAgICAibmVndSAgICAgICAlW2FkZHIwXSwgICAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3JjXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjFdLCAgICVbYWRkcjBdLCAgICAgICAweDA0ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW2FkZHIyXSwgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJDAsICAgICAgICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjBdLCAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW2FkZHIyXSwgICAweDAwKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJDAsICAgICAgICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjFdLCAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW2FkZHIyXSwgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyM10sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjBdLCAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW2FkZHIyXSwgICAweDAwKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjFdLCAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW2FkZHIyXSwgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyM10sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjBdLCAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW2FkZHIyXSwgICAweDAwKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjFdLCAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW2FkZHIyXSwgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyM10sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjBdLCAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW2FkZHIyXSwgICAweDAwKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVthZGRyNF0sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjFdLCAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW2FkZHIyXSwgIC0weDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMl0sICAgICAgICVbc3JjXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbYWRkcjFdLCAgIDB4MDAoJVthZGRyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAkMCwgICAgICAgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMl0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbYWRkcjFdLCAgIDB4MDAoJVthZGRyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHI1XSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMl0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbYWRkcjFdLCAgIDB4MDAoJVthZGRyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHI1XSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMl0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbYWRkcjFdLCAgIDB4MDAoJVthZGRyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2FkZHI1XSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMl0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbYWRkcjFdLCAgIDB4MDAoJVthZGRyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAkMCwgICAgICAgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMl0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbYWRkcjFdLCAgIDB4MDAoJVthZGRyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHI2XSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMl0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbYWRkcjFdLCAgIDB4MDAoJVthZGRyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHI2XSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVthZGRyMl0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbYWRkcjFdLCAgIDB4MDAoJVthZGRyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI2XSwgICAlW2FkZHI2XSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVthZGRyM10sICAgICAgICVbYWRkcjVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjNdLCAgICVbYWRkcjNdLCAgICAgICAweDA0ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW2FkZHI0XSwgICAlW2FkZHI0XSwgICAgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERElVICAiJVthZGRyMV0sICAgJVthZGRyNl0sICAgICAgIDB4MDIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjJdLCAgICVbYWRkcjRdLCAgICAgICAlW2FkZHIxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU1JMICAgICIlW2FkZHIzXSwgICAweDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NSTCAgICAiJVthZGRyNF0sICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9TUkwgICAgIiVbYWRkcjFdLCAgIDB4MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU1JMICAgICIlW2FkZHIyXSwgICAweDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXRjMSAgICAgICVbYWRkcjNdLCAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVthZGRyNF0sICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW2FkZHIxXSwgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXRjMSAgICAgICVbYWRkcjJdLCAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDJdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAkMCwgICAgICAgICAgICAgJVtzcmNdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKSwKKyAgICAgICAgICBbYWRkcjJdIj0mciIoYWRkclsyXSksICAgICAgICAgICAgW2FkZHIzXSI9JnIiKGFkZHJbM10pLAorICAgICAgICAgIFthZGRyNF0iPSZyIihhZGRyWzRdKSwgICAgICAgICAgICBbYWRkcjVdIj0mciIoYWRkcls1XSksCisgICAgICAgICAgW2FkZHI2XSI9JnIiKGFkZHJbNl0pCisgICAgICAgIDogW3NyY10iciIoKG1pcHNfcmVnKXNyYyksICAgICAgICAgIFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCiB2b2lkIGZmX3ByZWQ4eDE2X3ZlcnRpY2FsXzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIHsKKyAgICBkb3VibGUgZnRtcFsxXTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgImdzbGRsYzEgJGYyLCA3KCVbc3JjQV0pICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyLCAwKCVbc3JjQV0pICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkOCwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RsYzEgJGYyLCA3KCVbc3JjXSkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYyLCAwKCVbc3JjXSkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGR1ICVbc3JjXSwgJVtzcmNdLCAlW3N0cmlkZV0gICAgXHJcbiIKLSAgICAgICAgImRhZGRpICQ4LCAkOCwgLTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJDgsIDFiICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbc3JjXSIrJnIiKHNyYykKLSAgICAgICAgOiBbc3RyaWRlXSJyIihzdHJpZGUpLFtzcmNBXSJyIihzcmMtc3RyaWRlKQotICAgICAgICA6ICIkOCIsIiRmMiIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbc3JjQV0sIDB4MDApCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorCisgICAgICAgICJkYWRkaSAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVt0bXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW3NyY10iKyZyIihzcmMpCisgICAgICAgIDogW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksICAgIFtzcmNBXSJyIigobWlwc19yZWcpKHNyYy1zdHJpZGUpKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAogdm9pZCBmZl9wcmVkOHgxNl9ob3Jpem9udGFsXzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIHsKKyAgICB1aW50NjRfdCB0bXBbM107CisgICAgbWlwc19yZWcgYWRkclsyXTsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZGFkZGl1ICQyLCAlW3NyY10sIC0xICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3JjXSwgJDAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ2LCAweDEwICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGJ1ICQ0LCAwKCQyKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZG11bCAkNSwgJDQsICVbZmZfcGJfMV0gICAgICAgICAgICBcclxuIgotICAgICAgICAic2RsICQ1LCA3KCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RyICQ1LCAwKCQzKSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDIsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZHUgJDMsICVbc3RyaWRlXSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZGl1ICQ2LCAtMSAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkNiwgMWIgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OltzcmNdInIiKHNyYyksW3N0cmlkZV0iciIoc3RyaWRlKSxbZmZfcGJfMV0iciIoZmZfcGJfMSkKLSAgICAgICAgOiAiJDIiLCIkMyIsIiQ0IiwiJDUiLCIkNiIKKyAgICAgICAgUFRSX0FEREkgICAiJVthZGRyMF0sICAgJVtzcmNdLCAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbc3JjXSwgICAgICAgICAkMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMV0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG11bCAgICAgICAlW3RtcDJdLCAgICAlW3RtcDFdLCAgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3bCAgICAgICAgJVt0bXAyXSwgICAgMHgwNyglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd3IgICAgICAgICVbdG1wMl0sICAgIDB4MDAoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVthZGRyMV0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMV0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG11bCAgICAgICAlW3RtcDJdLCAgICAlW3RtcDFdLCAgICAgICAgJVtmZl9wYl8xXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3bCAgICAgICAgJVt0bXAyXSwgICAgMHgwNyglW2FkZHIxXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzd3IgICAgICAgICVbdG1wMl0sICAgIDB4MDAoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZGkgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbYWRkcjFdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdG1wMF0iPSZyIih0bXBbMF0pLCAgICAgICAgICAgICAgW3RtcDFdIj0mciIodG1wWzFdKSwKKyAgICAgICAgICBbdG1wMl0iPSZyIih0bXBbMl0pLAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSkKKyAgICAgICAgOiBbc3JjXSJyIigobWlwc19yZWcpc3JjKSwgICAgICAgICAgW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksCisgICAgICAgICAgW2ZmX3BiXzFdInIiKGZmX3BiXzEpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZDE2eDE2X3BsYW5lX2NvbXBhdF9tbWkodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICBjb25zdCBpbnQgc3ZxMywgY29uc3QgaW50IHJ2NDApCit7CisgICAgZG91YmxlIGZ0bXBbMTFdOworICAgIHVpbnQ2NF90IHRtcFs2XTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgUFRSX1NVQlUgICAiJVthZGRyMF0sICAgJVtzcmNdLCAgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW2FkZHIwXSwgLTB4MDEpCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVthZGRyMF0sICAweDA4KQorICAgICAgICAiZHNybCAgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmwgICAgICAgJVtmdG1wM10sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZmZfcHdfbTh0b201XSAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3X200dG9tMV0gICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18xdG80XSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfNXRvOF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDFdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQURESVUgICIlW2FkZHIwXSwgICAlW3NyY10sICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX1NVQlUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMl0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW3RtcDVdLCAgICAweDEwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wM10sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAgICAgJVt0bXA0XSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW3RtcDBdLCAgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzbGwgICAgICAgJVt0bXAzXSwgICAgJVt0bXAzXSwgICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc2xsICAgICAgICVbdG1wNF0sICAgICVbdG1wNF0sICAgICAgICAweDIwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNsbCAgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgMHgzMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVt0bXA0XSwgICAgJVt0bXA0XSwgICAgICAgICVbdG1wMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbdG1wMl0sICAgICVbdG1wMl0sICAgICAgICAlW3RtcDNdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW3RtcDJdLCAgICAlW3RtcDJdLCAgICAgICAgJVt0bXA0XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVt0bXAyXSwgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMl0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAgICAgJVt0bXAzXSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW3RtcDRdLCAgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMF0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNsbCAgICAgICAlW3RtcDNdLCAgICAlW3RtcDNdLCAgICAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzbGwgICAgICAgJVt0bXA0XSwgICAgJVt0bXA0XSwgICAgICAgIDB4MjAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc2xsICAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAweDMwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW3RtcDRdLCAgICAlW3RtcDRdLCAgICAgICAgJVt0bXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVt0bXAyXSwgICAgJVt0bXAyXSwgICAgICAgICVbdG1wM10gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbdG1wMl0sICAgICVbdG1wMl0sICAgICAgICAlW3RtcDRdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDJdLCAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMl0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAgICAgJVt0bXAzXSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW3RtcDRdLCAgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wMF0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNsbCAgICAgICAlW3RtcDNdLCAgICAlW3RtcDNdLCAgICAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzbGwgICAgICAgJVt0bXA0XSwgICAgJVt0bXA0XSwgICAgICAgIDB4MjAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc2xsICAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAweDMwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW3RtcDRdLCAgICAlW3RtcDRdLCAgICAgICAgJVt0bXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVt0bXAyXSwgICAgJVt0bXAyXSwgICAgICAgICVbdG1wM10gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbdG1wMl0sICAgICVbdG1wMl0sICAgICAgICAlW3RtcDRdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDJdLCAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAgICAgJVt0bXAyXSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGJ1ICAgICAgICAlW3RtcDNdLCAgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsYnUgICAgICAgICVbdG1wNF0sICAgIDB4MDAoJVthZGRyMF0pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtzdHJpZGVdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxidSAgICAgICAgJVt0bXAwXSwgICAgMHgwMCglW2FkZHIwXSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkdSAgICAgICVbdG1wNV0sICAgICVbdG1wNV0sICAgICAgICAlW3RtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZGl1ICAgICAlW3RtcDVdLCAgICAlW3RtcDVdLCAgICAgICAgMHgwMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzbGwgICAgICAgJVt0bXA1XSwgICAgJVt0bXA1XSwgICAgICAgIDB4MDQgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImRzbGwgICAgICAgJVt0bXAzXSwgICAgJVt0bXAzXSwgICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc2xsICAgICAgICVbdG1wNF0sICAgICVbdG1wNF0sICAgICAgICAweDIwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNsbCAgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgMHgzMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVt0bXA0XSwgICAgJVt0bXA0XSwgICAgICAgICVbdG1wMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbdG1wMl0sICAgICVbdG1wMl0sICAgICAgICAlW3RtcDNdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW3RtcDJdLCAgICAlW3RtcDJdLCAgICAgICAgJVt0bXA0XSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVt0bXAyXSwgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZmZfcHdfbTh0b201XSAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3X200dG9tMV0gICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18xdG80XSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfNXRvOF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDZdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJkbWZjMSAgICAgICVbdG1wMF0sICAgICVbZnRtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNsbCAgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgMHgzMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmEgICAgICAgJVt0bXAwXSwgICAgJVt0bXAwXSwgICAgICAgIDB4MzAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbWZjMSAgICAgICVbdG1wMV0sICAgICVbZnRtcDZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNsbCAgICAgICAlW3RtcDFdLCAgICAlW3RtcDFdLCAgICAgICAgMHgzMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmEgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgIDB4MzAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImJlcXogICAgICAgJVtzdnEzXSwgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMl0sICAgIDB4MDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGRpdiAgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgJVt0bXAyXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRkaXYgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgICVbdG1wMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMl0sICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG11bCAgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgJVt0bXAyXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdWwgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgICVbdG1wMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMl0sICAgIDB4MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGRpdiAgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgJVt0bXAyXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRkaXYgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgICVbdG1wMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkdSAgICAgICVbdG1wMl0sICAgICVbdG1wMF0sICAgICAgICAkMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZHUgICAgICAlW3RtcDBdLCAgICAlW3RtcDFdLCAgICAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRhZGR1ICAgICAgJVt0bXAxXSwgICAgJVt0bXAyXSwgICAgICAgICQwICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJiICAgICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYmVxeiAgICAgICAlW3J2NDBdLCAgICAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmEgICAgICAgJVt0bXAyXSwgICAgJVt0bXAwXSwgICAgICAgIDB4MDIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkdSAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAlW3RtcDJdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNyYSAgICAgICAlW3RtcDJdLCAgICAlW3RtcDFdLCAgICAgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRhZGR1ICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgICVbdG1wMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc3JhICAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAweDA0ICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHNyYSAgICAgICAlW3RtcDFdLCAgICAlW3RtcDFdLCAgICAgICAgMHgwNCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImIgICAgICAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMl0sICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG11bCAgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgJVt0bXAyXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdWwgICAgICAgJVt0bXAxXSwgICAgJVt0bXAxXSwgICAgICAgICVbdG1wMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkaXUgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAweDIwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZGl1ICAgICAlW3RtcDFdLCAgICAlW3RtcDFdLCAgICAgICAgMHgyMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRzcmEgICAgICAgJVt0bXAwXSwgICAgJVt0bXAwXSwgICAgICAgIDB4MDYgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkc3JhICAgICAgICVbdG1wMV0sICAgICVbdG1wMV0sICAgICAgICAweDA2ICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGFkZHUgICAgICAlW3RtcDNdLCAgICAlW3RtcDBdLCAgICAgICAgJVt0bXAxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAyXSwgICAgMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXVsICAgICAgICVbdG1wM10sICAgICVbdG1wM10sICAgICAgICAlW3RtcDJdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZHN1YnUgICAgICAlW3RtcDVdLCAgICAlW3RtcDVdLCAgICAgICAgJVt0bXAzXSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAieG9yICAgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVt0bXAwXSwgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDFdLCAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXRjMSAgICAgICVbdG1wNV0sICAgICVbZnRtcDZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXRjMSAgICAgICVbdG1wMF0sICAgICVbZnRtcDddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2ZmX3B3XzB0bzNdLCAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVtmZl9wd180dG83XSwgICAgICAgICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW2ZmX3B3Xzh0b2JdLCAgICAgICAgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXRjMSAgICAgICVbZmZfcHdfY3RvZl0sICAgICAgICAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzcmNdLCAgICAgICAgICQwICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDldLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2FkZHIwXSwgMHgwMCkKKworICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDldLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2FkZHIwXSwgMHgwOCkKKworICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkYWRkaXUgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwgICAgICAgICAgICAgIFt0bXAxXSI9JnIiKHRtcFsxXSksCisgICAgICAgICAgW3RtcDJdIj0mciIodG1wWzJdKSwgICAgICAgICAgICAgIFt0bXAzXSI9JnIiKHRtcFszXSksCisgICAgICAgICAgW3RtcDRdIj0mciIodG1wWzRdKSwgICAgICAgICAgICAgIFt0bXA1XSI9JnIiKHRtcFs1XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pCisgICAgICAgIDogW3NyY10iciIoc3JjKSwgICAgICAgICAgICAgICAgICAgIFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLAorICAgICAgICAgIFtzdnEzXSJyIihzdnEzKSwgICAgICAgICAgICAgICAgICBbcnY0MF0iciIocnY0MCksCisgICAgICAgICAgW2ZmX3B3X204dG9tNV0iZiIoZmZfcHdfbTh0b201KSwgIFtmZl9wd19tNHRvbTFdImYiKGZmX3B3X200dG9tMSksCisgICAgICAgICAgW2ZmX3B3XzF0bzRdImYiKGZmX3B3XzF0bzQpLCAgICAgIFtmZl9wd181dG84XSJmIihmZl9wd181dG84KSwKKyAgICAgICAgICBbZmZfcHdfMHRvM10iZiIoZmZfcHdfMHRvMyksICAgICAgW2ZmX3B3XzR0bzddInIiKGZmX3B3XzR0bzcpLAorICAgICAgICAgIFtmZl9wd184dG9iXSJyIihmZl9wd184dG9iKSwgICAgICBbZmZfcHdfY3RvZl0iciIoZmZfcHdfY3RvZikKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3ZvaWQgZmZfcHJlZDE2eDE2X3BsYW5lX2gyNjRfOF9tbWkodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHByZWQxNngxNl9wbGFuZV9jb21wYXRfbW1pKHNyYywgc3RyaWRlLCAwLCAwKTsKK30KKwordm9pZCBmZl9wcmVkMTZ4MTZfcGxhbmVfc3ZxM184X21taSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgcHJlZDE2eDE2X3BsYW5lX2NvbXBhdF9tbWkoc3JjLCBzdHJpZGUsIDEsIDApOworfQorCit2b2lkIGZmX3ByZWQxNngxNl9wbGFuZV9ydjQwXzhfbW1pKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBwcmVkMTZ4MTZfcGxhbmVfY29tcGF0X21taShzcmMsIHN0cmlkZSwgMCwgMSk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaDI2NHByZWRfbXNhLmMgYi9saWJhdmNvZGVjL21pcHMvaDI2NHByZWRfbXNhLmMKaW5kZXggY2RkY2QyZS4uYjk5OTBjMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2gyNjRwcmVkX21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0cHJlZF9tc2EuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUgU2hpdnJhaiBQYXRpbCAoU2hpdnJhai5QYXRpbEBpbWd0ZWMuY29tKQorICogQ29weXJpZ2h0IChjKSAyMDE1IC0gMjAxNyBTaGl2cmFqIFBhdGlsIChTaGl2cmFqLlBhdGlsQGltZ3RlYy5jb20pCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTI0LDMxICsyNCwyMSBAQAogc3RhdGljIHZvaWQgaW50cmFfcHJlZGljdF92ZXJ0Xzh4OF9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUpCiB7Ci0gICAgdWludDMyX3Qgcm93OwotICAgIHVpbnQzMl90IHNyY19kYXRhMSwgc3JjX2RhdGEyOworICAgIHVpbnQ2NF90IG91dCA9IExEKHNyYyk7CiAKLSAgICBzcmNfZGF0YTEgPSBMVyhzcmMpOwotICAgIHNyY19kYXRhMiA9IExXKHNyYyArIDQpOwotCi0gICAgZm9yIChyb3cgPSA4OyByb3ctLTspIHsKLSAgICAgICAgU1coc3JjX2RhdGExLCBkc3QpOwotICAgICAgICBTVyhzcmNfZGF0YTIsIChkc3QgKyA0KSk7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgIH0KKyAgICBTRDQob3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIGRzdF9zdHJpZGUpOworICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIFNENChvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGludHJhX3ByZWRpY3RfdmVydF8xNngxNl9tc2EodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSkKIHsKLSAgICB1aW50MzJfdCByb3c7Ci0gICAgdjE2dTggc3JjMDsKKyAgICB2MTZ1OCBvdXQgPSBMRF9VQihzcmMpOwogCi0gICAgc3JjMCA9IExEX1VCKHNyYyk7Ci0KLSAgICBmb3IgKHJvdyA9IDE2OyByb3ctLTspIHsKLSAgICAgICAgU1RfVUIoc3JjMCwgZHN0KTsKLSAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgfQorICAgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKKyAgICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGludHJhX3ByZWRpY3RfaG9yaXpfOHg4X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKQEAgLTczLDE3MiArNjMsNzIgQEAKIHN0YXRpYyB2b2lkIGludHJhX3ByZWRpY3RfaG9yaXpfMTZ4MTZfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUpCiB7Ci0gICAgdWludDMyX3Qgcm93OwogICAgIHVpbnQ4X3QgaW5wMCwgaW5wMSwgaW5wMiwgaW5wMzsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2dTggc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMsIHNyYzE0LCBzcmMxNTsKIAotICAgIGZvciAocm93ID0gNDsgcm93LS07KSB7Ci0gICAgICAgIGlucDAgPSBzcmNbMF07Ci0gICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICAgICBpbnAxID0gc3JjWzBdOwotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICAgICAgaW5wMiA9IHNyY1swXTsKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgICAgIGlucDMgPSBzcmNbMF07Ci0gICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIGlucDAgPSBzcmNbMCAqIHNyY19zdHJpZGVdOworICAgIGlucDEgPSBzcmNbMSAqIHNyY19zdHJpZGVdOworICAgIGlucDIgPSBzcmNbMiAqIHNyY19zdHJpZGVdOworICAgIGlucDMgPSBzcmNbMyAqIHNyY19zdHJpZGVdOworICAgIHNyYzAgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihpbnAwKTsKKyAgICBzcmMxID0gKHYxNnU4KSBfX21zYV9maWxsX2IoaW5wMSk7CisgICAgc3JjMiA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGlucDIpOworICAgIHNyYzMgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihpbnAzKTsKKyAgICBpbnAwID0gc3JjWzQgKiBzcmNfc3RyaWRlXTsKKyAgICBpbnAxID0gc3JjWzUgKiBzcmNfc3RyaWRlXTsKKyAgICBpbnAyID0gc3JjWzYgKiBzcmNfc3RyaWRlXTsKKyAgICBpbnAzID0gc3JjWzcgKiBzcmNfc3RyaWRlXTsKKyAgICBzcmM0ID0gKHYxNnU4KSBfX21zYV9maWxsX2IoaW5wMCk7CisgICAgc3JjNSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGlucDEpOworICAgIHNyYzYgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihpbnAyKTsKKyAgICBzcmM3ID0gKHYxNnU4KSBfX21zYV9maWxsX2IoaW5wMyk7CisgICAgaW5wMCA9IHNyY1sgOCAqIHNyY19zdHJpZGVdOworICAgIGlucDEgPSBzcmNbIDkgKiBzcmNfc3RyaWRlXTsKKyAgICBpbnAyID0gc3JjWzEwICogc3JjX3N0cmlkZV07CisgICAgaW5wMyA9IHNyY1sxMSAqIHNyY19zdHJpZGVdOworICAgIHNyYzggPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihpbnAwKTsKKyAgICBzcmM5ID0gKHYxNnU4KSBfX21zYV9maWxsX2IoaW5wMSk7CisgICAgc3JjMTAgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihpbnAyKTsKKyAgICBzcmMxMSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGlucDMpOworICAgIGlucDAgPSBzcmNbMTIgKiBzcmNfc3RyaWRlXTsKKyAgICBpbnAxID0gc3JjWzEzICogc3JjX3N0cmlkZV07CisgICAgaW5wMiA9IHNyY1sxNCAqIHNyY19zdHJpZGVdOworICAgIGlucDMgPSBzcmNbMTUgKiBzcmNfc3RyaWRlXTsKKyAgICBzcmMxMiA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGlucDApOworICAgIHNyYzEzID0gKHYxNnU4KSBfX21zYV9maWxsX2IoaW5wMSk7CisgICAgc3JjMTQgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihpbnAyKTsKKyAgICBzcmMxNSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGlucDMpOwogCi0gICAgICAgIHNyYzAgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihpbnAwKTsKLSAgICAgICAgc3JjMSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGlucDEpOwotICAgICAgICBzcmMyID0gKHYxNnU4KSBfX21zYV9maWxsX2IoaW5wMik7Ci0gICAgICAgIHNyYzMgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihpbnAzKTsKLQotICAgICAgICBTVF9VQjQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgfQorICAgIFNUX1VCOChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBkc3QsIGRzdF9zdHJpZGUpOworICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworICAgIFNUX1VCOChzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQsIHNyYzE1LAorICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0X2RjXzh4OF9tc2EodWludDhfdCAqc3JjX3RvcCwgdWludDhfdCAqc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpc19hYm92ZSwgdWludDhfdCBpc19sZWZ0KQotewotICAgIHVpbnQzMl90IHJvdzsKLSAgICB1aW50MzJfdCBvdXQsIGFkZGl0aW9uID0gMDsKLSAgICB2MTZ1OCBzcmNfYWJvdmUsIHN0b3JlOwotICAgIHY4dTE2IHN1bV9hYm92ZTsKLSAgICB2NHUzMiBzdW1fdG9wOwotICAgIHYydTY0IHN1bTsKLQotICAgIGlmIChpc19sZWZ0ICYmIGlzX2Fib3ZlKSB7Ci0gICAgICAgIHNyY19hYm92ZSA9IExEX1VCKHNyY190b3ApOwotCi0gICAgICAgIHN1bV9hYm92ZSA9IF9fbXNhX2hhZGRfdV9oKHNyY19hYm92ZSwgc3JjX2Fib3ZlKTsKLSAgICAgICAgc3VtX3RvcCA9IF9fbXNhX2hhZGRfdV93KHN1bV9hYm92ZSwgc3VtX2Fib3ZlKTsKLSAgICAgICAgc3VtID0gX19tc2FfaGFkZF91X2Qoc3VtX3RvcCwgc3VtX3RvcCk7Ci0gICAgICAgIGFkZGl0aW9uID0gX19tc2FfY29weV91X3coKHY0aTMyKSBzdW0sIDApOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgODsgcm93KyspIHsKLSAgICAgICAgICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0W3JvdyAqIHNyY19zdHJpZGVfbGVmdF07Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRpdGlvbiA9IChhZGRpdGlvbiArIDgpID4+IDQ7Ci0gICAgICAgIHN0b3JlID0gKHYxNnU4KSBfX21zYV9maWxsX2IoYWRkaXRpb24pOwotICAgIH0gZWxzZSBpZiAoaXNfbGVmdCkgewotICAgICAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IDg7IHJvdysrKSB7Ci0gICAgICAgICAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFtyb3cgKiBzcmNfc3RyaWRlX2xlZnRdOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkaXRpb24gPSAoYWRkaXRpb24gKyA0KSA+PiAzOwotICAgICAgICBzdG9yZSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGFkZGl0aW9uKTsKLSAgICB9IGVsc2UgaWYgKGlzX2Fib3ZlKSB7Ci0gICAgICAgIHNyY19hYm92ZSA9IExEX1VCKHNyY190b3ApOwotCi0gICAgICAgIHN1bV9hYm92ZSA9IF9fbXNhX2hhZGRfdV9oKHNyY19hYm92ZSwgc3JjX2Fib3ZlKTsKLSAgICAgICAgc3VtX3RvcCA9IF9fbXNhX2hhZGRfdV93KHN1bV9hYm92ZSwgc3VtX2Fib3ZlKTsKLSAgICAgICAgc3VtID0gX19tc2FfaGFkZF91X2Qoc3VtX3RvcCwgc3VtX3RvcCk7Ci0gICAgICAgIHN1bSA9ICh2MnU2NCkgX19tc2Ffc3JhcmlfZCgodjJpNjQpIHN1bSwgMyk7Ci0gICAgICAgIHN0b3JlID0gKHYxNnU4KSBfX21zYV9zcGxhdGlfYigodjE2aTgpIHN1bSwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RvcmUgPSAodjE2dTgpIF9fbXNhX2xkaV9iKDEyOCk7Ci0gICAgfQotCi0gICAgb3V0ID0gX19tc2FfY29weV91X3coKHY0aTMyKSBzdG9yZSwgMCk7Ci0KLSAgICBmb3IgKHJvdyA9IDg7IHJvdy0tOykgewotICAgICAgICBTVyhvdXQsIGRzdCk7Ci0gICAgICAgIFNXKG91dCwgKGRzdCArIDQpKTsKLSAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0X2RjXzE2eDE2X21zYSh1aW50OF90ICpzcmNfdG9wLCB1aW50OF90ICpzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlzX2Fib3ZlLCB1aW50OF90IGlzX2xlZnQpCi17Ci0gICAgdWludDMyX3Qgcm93OwotICAgIHVpbnQzMl90IGFkZGl0aW9uID0gMDsKLSAgICB2MTZ1OCBzcmNfYWJvdmUsIHN0b3JlOwotICAgIHY4dTE2IHN1bV9hYm92ZTsKLSAgICB2NHUzMiBzdW1fdG9wOwotICAgIHYydTY0IHN1bTsKLQotICAgIGlmIChpc19sZWZ0ICYmIGlzX2Fib3ZlKSB7Ci0gICAgICAgIHNyY19hYm92ZSA9IExEX1VCKHNyY190b3ApOwotCi0gICAgICAgIHN1bV9hYm92ZSA9IF9fbXNhX2hhZGRfdV9oKHNyY19hYm92ZSwgc3JjX2Fib3ZlKTsKLSAgICAgICAgc3VtX3RvcCA9IF9fbXNhX2hhZGRfdV93KHN1bV9hYm92ZSwgc3VtX2Fib3ZlKTsKLSAgICAgICAgc3VtID0gX19tc2FfaGFkZF91X2Qoc3VtX3RvcCwgc3VtX3RvcCk7Ci0gICAgICAgIHN1bV90b3AgPSAodjR1MzIpIF9fbXNhX3Bja2V2X3coKHY0aTMyKSBzdW0sICh2NGkzMikgc3VtKTsKLSAgICAgICAgc3VtID0gX19tc2FfaGFkZF91X2Qoc3VtX3RvcCwgc3VtX3RvcCk7Ci0gICAgICAgIGFkZGl0aW9uID0gX19tc2FfY29weV91X3coKHY0aTMyKSBzdW0sIDApOwotCi0gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgMTY7IHJvdysrKSB7Ci0gICAgICAgICAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFtyb3cgKiBzcmNfc3RyaWRlX2xlZnRdOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkaXRpb24gPSAoYWRkaXRpb24gKyAxNikgPj4gNTsKLSAgICAgICAgc3RvcmUgPSAodjE2dTgpIF9fbXNhX2ZpbGxfYihhZGRpdGlvbik7Ci0gICAgfSBlbHNlIGlmIChpc19sZWZ0KSB7Ci0gICAgICAgIGZvciAocm93ID0gMDsgcm93IDwgMTY7IHJvdysrKSB7Ci0gICAgICAgICAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFtyb3cgKiBzcmNfc3RyaWRlX2xlZnRdOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkaXRpb24gPSAoYWRkaXRpb24gKyA4KSA+PiA0OwotICAgICAgICBzdG9yZSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGFkZGl0aW9uKTsKLSAgICB9IGVsc2UgaWYgKGlzX2Fib3ZlKSB7Ci0gICAgICAgIHNyY19hYm92ZSA9IExEX1VCKHNyY190b3ApOwotCi0gICAgICAgIHN1bV9hYm92ZSA9IF9fbXNhX2hhZGRfdV9oKHNyY19hYm92ZSwgc3JjX2Fib3ZlKTsKLSAgICAgICAgc3VtX3RvcCA9IF9fbXNhX2hhZGRfdV93KHN1bV9hYm92ZSwgc3VtX2Fib3ZlKTsKLSAgICAgICAgc3VtID0gX19tc2FfaGFkZF91X2Qoc3VtX3RvcCwgc3VtX3RvcCk7Ci0gICAgICAgIHN1bV90b3AgPSAodjR1MzIpIF9fbXNhX3Bja2V2X3coKHY0aTMyKSBzdW0sICh2NGkzMikgc3VtKTsKLSAgICAgICAgc3VtID0gX19tc2FfaGFkZF91X2Qoc3VtX3RvcCwgc3VtX3RvcCk7Ci0gICAgICAgIHN1bSA9ICh2MnU2NCkgX19tc2Ffc3JhcmlfZCgodjJpNjQpIHN1bSwgNCk7Ci0gICAgICAgIHN0b3JlID0gKHYxNnU4KSBfX21zYV9zcGxhdGlfYigodjE2aTgpIHN1bSwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RvcmUgPSAodjE2dTgpIF9fbXNhX2xkaV9iKDEyOCk7Ci0gICAgfQotCi0gICAgZm9yIChyb3cgPSAxNjsgcm93LS07KSB7Ci0gICAgICAgIFNUX1VCKHN0b3JlLCBkc3QpOwotICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgSU5UUkFfUFJFRElDVF9WQUxEQ184WDhfTVNBKHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgaW50cmFfcHJlZGljdF8jI3ZhbCMjZGNfOHg4X21zYSh1aW50OF90ICpkc3QsICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSkgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQzMl90IHJvdywgb3V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2aTggc3RvcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0b3JlID0gX19tc2FfbGRpX2IodmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0ID0gX19tc2FfY29weV91X3coKHY0aTMyKSBzdG9yZSwgMCk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAocm93ID0gODsgcm93LS07KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFNXKG91dCwgZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgU1cob3V0LCAoZHN0ICsgNCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgSU5UUkFfUFJFRElDVF9WQUxEQ184WDhfTVNBKHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0XyMjdmFsIyNkY184eDhfbXNhKHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2MTZpOCBzdG9yZSA9IF9fbXNhX2ZpbGxfYih2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDY0X3Qgb3V0ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzdG9yZSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRDQob3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIGRzdF9zdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNENChvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgZHN0X3N0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAogSU5UUkFfUFJFRElDVF9WQUxEQ184WDhfTVNBKDEyNyk7CiBJTlRSQV9QUkVESUNUX1ZBTERDXzhYOF9NU0EoMTI5KTsKIAotI2RlZmluZSBJTlRSQV9QUkVESUNUX1ZBTERDXzE2WDE2X01TQSh2YWwpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkIGludHJhX3ByZWRpY3RfIyN2YWwjI2RjXzE2eDE2X21zYSh1aW50OF90ICpkc3QsICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlKSAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50MzJfdCByb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2dTggc3RvcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdG9yZSA9ICh2MTZ1OCkgX19tc2FfbGRpX2IodmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAocm93ID0gMTY7IHJvdy0tOykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgU1RfVUIoc3RvcmUsIGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgSU5UUkFfUFJFRElDVF9WQUxEQ18xNlgxNl9NU0EodmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0XyMjdmFsIyNkY18xNngxNl9tc2EodWludDhfdCAqZHN0LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjE2dTggb3V0ID0gKHYxNnU4KSBfX21zYV9maWxsX2IodmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgZHN0X3N0cmlkZSk7ICBcCisgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBkc3Rfc3RyaWRlKTsgIFwKIH0KIAogSU5UUkFfUFJFRElDVF9WQUxEQ18xNlgxNl9NU0EoMTI3KTsKQEAgLTMyMSw4ICsyMTEsMTAgQEAKICAgICB2OGkxNiBzaG9ydF9tdWx0aXBsaWVyID0geyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4IH07CiAgICAgdjRpMzIgaW50X211bHRpcGxpZXIgPSB7IDAsIDEsIDIsIDMgfTsKICAgICB2MTZ1OCBzcmNfdG9wID0geyAwIH07Ci0gICAgdjhpMTYgdmVjOSwgdmVjMTA7CisgICAgdjE2dTggc3RvcmUwLCBzdG9yZTE7CisgICAgdjhpMTYgdmVjOSwgdmVjMTAsIHZlYzExLCB2ZWMxMjsKICAgICB2NGkzMiB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCByZXNfYWRkOworICAgIHY0aTMyIHJlZzAsIHJlZzEsIHJlZzIsIHJlZzM7CiAKICAgICBsb2FkMCA9IExEKHNyYyAtIChzdHJpZGUgKyAxKSk7CiAgICAgbG9hZDEgPSBMRChzcmMgLSAoc3RyaWRlICsgMSkgKyA5KTsKQEAgLTM2MiwxOCArMjU0LDI4IEBACiAgICAgdmVjNiA9IHZlYzggKiA0OwogICAgIHZlYzcgPSB2ZWM4ICogaW50X211bHRpcGxpZXI7CiAKLSAgICBmb3IgKGxwY250ID0gMTY7IGxwY250LS07KSB7CisgICAgZm9yIChscGNudCA9IDg7IGxwY250LS07KSB7CiAgICAgICAgIHZlYzAgPSB2ZWM3OworICAgICAgICByZWcwID0gdmVjNzsKICAgICAgICAgdmVjMCArPSB2ZWM0OworICAgICAgICB2ZWM0ICs9IHZlYzU7CisgICAgICAgIHJlZzAgKz0gdmVjNDsKICAgICAgICAgdmVjMSA9IHZlYzAgKyB2ZWM2OworICAgICAgICByZWcxID0gcmVnMCArIHZlYzY7CiAgICAgICAgIHZlYzIgPSB2ZWMxICsgdmVjNjsKKyAgICAgICAgcmVnMiA9IHJlZzEgKyB2ZWM2OwogICAgICAgICB2ZWMzID0gdmVjMiArIHZlYzY7CisgICAgICAgIHJlZzMgPSByZWcyICsgdmVjNjsKIAogICAgICAgICBTUkFfNFYodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgNSk7CisgICAgICAgIFNSQV80VihyZWcwLCByZWcxLCByZWcyLCByZWczLCA1KTsKICAgICAgICAgUENLRVZfSDJfU0godmVjMSwgdmVjMCwgdmVjMywgdmVjMiwgdmVjOSwgdmVjMTApOworICAgICAgICBQQ0tFVl9IMl9TSChyZWcxLCByZWcwLCByZWczLCByZWcyLCB2ZWMxMSwgdmVjMTIpOwogICAgICAgICBDTElQX1NIMl8wXzI1NSh2ZWM5LCB2ZWMxMCk7Ci0gICAgICAgIFBDS0VWX1NUX1NCKHZlYzksIHZlYzEwLCBzcmMpOwotICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBDTElQX1NIMl8wXzI1NSh2ZWMxMSwgdmVjMTIpOworICAgICAgICBQQ0tFVl9CMl9VQih2ZWMxMCwgdmVjOSwgdmVjMTIsIHZlYzExLCBzdG9yZTAsIHN0b3JlMSk7CisgICAgICAgIFNUX1VCMihzdG9yZTAsIHN0b3JlMSwgc3JjLCBzdHJpZGUpOworICAgICAgICBzcmMgKz0gMiAqIHN0cmlkZTsKIAogICAgICAgICB2ZWM0ICs9IHZlYzU7CiAgICAgfQpAQCAtMzgxLDkgKzI4Myw5IEBACiAKIHN0YXRpYyB2b2lkIGludHJhX3ByZWRpY3RfZGNfNGJsa184eDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBscF9jbnQ7Ci0gICAgdWludDMyX3Qgc3JjMCwgc3JjMSwgc3JjMywgc3JjMiA9IDA7CisgICAgdWludDMyX3Qgc3JjMCwgc3JjMSwgc3JjMywgc3JjMjsKICAgICB1aW50MzJfdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHVpbnQ2NF90IHN0b3JlMCwgc3RvcmUxOwogICAgIHYxNnU4IHNyY190b3A7CiAgICAgdjh1MTYgYWRkOwogICAgIHY0dTMyIHN1bTsKQEAgLTM5MywxMiArMjk1LDE0IEBACiAgICAgc3VtID0gX19tc2FfaGFkZF91X3coYWRkLCBhZGQpOwogICAgIHNyYzAgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIHN1bSwgMCk7CiAgICAgc3JjMSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgc3VtLCAxKTsKLQotICAgIGZvciAobHBfY250ID0gMDsgbHBfY250IDwgNDsgbHBfY250KyspIHsKLSAgICAgICAgc3JjMCArPSBzcmNbbHBfY250ICogc3RyaWRlIC0gMV07Ci0gICAgICAgIHNyYzIgKz0gc3JjWyg0ICsgbHBfY250KSAqIHN0cmlkZSAtIDFdOwotICAgIH0KLQorICAgIHNyYzAgKz0gc3JjWzAgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMwICs9IHNyY1sxICogc3RyaWRlIC0gMV07CisgICAgc3JjMCArPSBzcmNbMiAqIHN0cmlkZSAtIDFdOworICAgIHNyYzAgKz0gc3JjWzMgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMyICA9IHNyY1s0ICogc3RyaWRlIC0gMV07CisgICAgc3JjMiArPSBzcmNbNSAqIHN0cmlkZSAtIDFdOworICAgIHNyYzIgKz0gc3JjWzYgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMyICs9IHNyY1s3ICogc3RyaWRlIC0gMV07CiAgICAgc3JjMCA9IChzcmMwICsgNCkgPj4gMzsKICAgICBzcmMzID0gKHNyYzEgKyBzcmMyICsgNCkgPj4gMzsKICAgICBzcmMxID0gKHNyYzEgKyAyKSA+PiAyOwpAQCAtNDA3LDY5ICszMTEsNjIgQEAKICAgICBvdXQxID0gc3JjMSAqIDB4MDEwMTAxMDE7CiAgICAgb3V0MiA9IHNyYzIgKiAweDAxMDEwMTAxOwogICAgIG91dDMgPSBzcmMzICogMHgwMTAxMDEwMTsKKyAgICBzdG9yZTAgPSAoKHVpbnQ2NF90KSBvdXQxIDw8IDMyKSB8IG91dDA7CisgICAgc3RvcmUxID0gKCh1aW50NjRfdCkgb3V0MyA8PCAzMikgfCBvdXQyOwogCi0gICAgZm9yIChscF9jbnQgPSA0OyBscF9jbnQtLTspIHsKLSAgICAgICAgU1cob3V0MCwgc3JjKTsKLSAgICAgICAgU1cob3V0MSwgKHNyYyArIDQpKTsKLSAgICAgICAgU1cob3V0MiwgKHNyYyArIDQgKiBzdHJpZGUpKTsKLSAgICAgICAgU1cob3V0MywgKHNyYyArIDQgKiBzdHJpZGUgKyA0KSk7Ci0gICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgfQorICAgIFNENChzdG9yZTAsIHN0b3JlMCwgc3RvcmUwLCBzdG9yZTAsIHNyYywgc3RyaWRlKTsKKyAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOworICAgIFNENChzdG9yZTEsIHN0b3JlMSwgc3RvcmUxLCBzdG9yZTEsIHNyYywgc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaW50cmFfcHJlZGljdF9ob3JfZGNfOHg4X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgbHBfY250OwotICAgIHVpbnQzMl90IHNyYzAgPSAwLCBzcmMxID0gMDsKKyAgICB1aW50MzJfdCBzcmMwLCBzcmMxOwogICAgIHVpbnQ2NF90IG91dDAsIG91dDE7CiAKLSAgICBmb3IgKGxwX2NudCA9IDA7IGxwX2NudCA8IDQ7IGxwX2NudCsrKSB7Ci0gICAgICAgIHNyYzAgKz0gc3JjW2xwX2NudCAqIHN0cmlkZSAtIDFdOwotICAgICAgICBzcmMxICs9IHNyY1soNCArIGxwX2NudCkgKiBzdHJpZGUgLSAxXTsKLSAgICB9Ci0KKyAgICBzcmMwICA9IHNyY1swICogc3RyaWRlIC0gMV07CisgICAgc3JjMCArPSBzcmNbMSAqIHN0cmlkZSAtIDFdOworICAgIHNyYzAgKz0gc3JjWzIgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMwICs9IHNyY1szICogc3RyaWRlIC0gMV07CisgICAgc3JjMSAgPSBzcmNbNCAqIHN0cmlkZSAtIDFdOworICAgIHNyYzEgKz0gc3JjWzUgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMxICs9IHNyY1s2ICogc3RyaWRlIC0gMV07CisgICAgc3JjMSArPSBzcmNbNyAqIHN0cmlkZSAtIDFdOwogICAgIHNyYzAgPSAoc3JjMCArIDIpID4+IDI7CiAgICAgc3JjMSA9IChzcmMxICsgMikgPj4gMjsKICAgICBvdXQwID0gc3JjMCAqIDB4MDEwMTAxMDEwMTAxMDEwMTsKICAgICBvdXQxID0gc3JjMSAqIDB4MDEwMTAxMDEwMTAxMDEwMTsKIAotICAgIGZvciAobHBfY250ID0gNDsgbHBfY250LS07KSB7Ci0gICAgICAgIFNEKG91dDAsIHNyYyk7Ci0gICAgICAgIFNEKG91dDEsIChzcmMgKyA0ICogc3RyaWRlKSk7Ci0gICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgfQorICAgIFNENChvdXQwLCBvdXQwLCBvdXQwLCBvdXQwLCBzcmMsIHN0cmlkZSk7CisgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKKyAgICBTRDQob3V0MSwgb3V0MSwgb3V0MSwgb3V0MSwgc3JjLCBzdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0X3ZlcnRfZGNfOHg4X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgbHBfY250OwotICAgIHVpbnQzMl90IG91dDAgPSAwLCBvdXQxID0gMDsKLSAgICB2MTZ1OCBzcmNfdG9wOworICAgIHVpbnQ2NF90IG91dDA7CisgICAgdjE2aTggbWFzayA9IHsgMCwgMCwgMCwgMCwgNCwgNCwgNCwgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIHYxNnU4IHNyY190b3AsIHJlczA7CiAgICAgdjh1MTYgYWRkOwogICAgIHY0dTMyIHN1bTsKLSAgICB2NGkzMiByZXMwLCByZXMxOwogCiAgICAgc3JjX3RvcCA9IExEX1VCKHNyYyAtIHN0cmlkZSk7CiAgICAgYWRkID0gX19tc2FfaGFkZF91X2goc3JjX3RvcCwgc3JjX3RvcCk7CiAgICAgc3VtID0gX19tc2FfaGFkZF91X3coYWRkLCBhZGQpOwogICAgIHN1bSA9ICh2NHUzMikgX19tc2Ffc3JhcmlfdygodjRpMzIpIHN1bSwgMik7Ci0gICAgcmVzMCA9ICh2NGkzMikgX19tc2Ffc3BsYXRpX2IoKHYxNmk4KSBzdW0sIDApOwotICAgIHJlczEgPSAodjRpMzIpIF9fbXNhX3NwbGF0aV9iKCh2MTZpOCkgc3VtLCA0KTsKLSAgICBvdXQwID0gX19tc2FfY29weV91X3cocmVzMCwgMCk7Ci0gICAgb3V0MSA9IF9fbXNhX2NvcHlfdV93KHJlczEsIDApOworICAgIHJlczAgPSAodjE2dTgpIF9fbXNhX3ZzaGZfYihtYXNrLCAodjE2aTgpIHN1bSwgKHYxNmk4KSBzdW0pOworICAgIG91dDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHJlczAsIDApOwogCi0gICAgZm9yIChscF9jbnQgPSA4OyBscF9jbnQtLTspIHsKLSAgICAgICAgU1cob3V0MCwgc3JjKTsKLSAgICAgICAgU1cob3V0MSwgc3JjICsgNCk7Ci0gICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgfQorICAgIFNENChvdXQwLCBvdXQwLCBvdXQwLCBvdXQwLCBzcmMsIHN0cmlkZSk7CisgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKKyAgICBTRDQob3V0MCwgb3V0MCwgb3V0MCwgb3V0MCwgc3JjLCBzdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0X21hZF9jb3dfZGNfbDB0Xzh4OF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90IGxwX2NudDsKLSAgICB1aW50MzJfdCBzcmMwLCBzcmMxLCBzcmMyID0gMDsKKyAgICB1aW50MzJfdCBzcmMwLCBzcmMxLCBzcmMyOwogICAgIHVpbnQzMl90IG91dDAsIG91dDEsIG91dDI7CisgICAgdWludDY0X3Qgc3RvcmUwLCBzdG9yZTE7CiAgICAgdjE2dTggc3JjX3RvcDsKICAgICB2OHUxNiBhZGQ7CiAgICAgdjR1MzIgc3VtOwpAQCAtNDgwLDMwICszNzcsMzAgQEAKICAgICBzcmMwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBzdW0sIDApOwogICAgIHNyYzEgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIHN1bSwgMSk7CiAKLSAgICBmb3IgKGxwX2NudCA9IDA7IGxwX2NudCA8IDQ7IGxwX2NudCsrKSB7Ci0gICAgICAgIHNyYzIgKz0gc3JjW2xwX2NudCAqIHN0cmlkZSAtIDFdOwotICAgIH0KKyAgICBzcmMyICA9IHNyY1swICogc3RyaWRlIC0gMV07CisgICAgc3JjMiArPSBzcmNbMSAqIHN0cmlkZSAtIDFdOworICAgIHNyYzIgKz0gc3JjWzIgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMyICs9IHNyY1szICogc3RyaWRlIC0gMV07CiAgICAgc3JjMiA9IChzcmMwICsgc3JjMiArIDQpID4+IDM7CiAgICAgc3JjMCA9IChzcmMwICsgMikgPj4gMjsKICAgICBzcmMxID0gKHNyYzEgKyAyKSA+PiAyOwogICAgIG91dDAgPSBzcmMwICogMHgwMTAxMDEwMTsKICAgICBvdXQxID0gc3JjMSAqIDB4MDEwMTAxMDE7CiAgICAgb3V0MiA9IHNyYzIgKiAweDAxMDEwMTAxOworICAgIHN0b3JlMSA9ICgodWludDY0X3QpIG91dDEgPDwgMzIpOworICAgIHN0b3JlMCA9IHN0b3JlMSB8ICgodWludDY0X3QpIG91dDIpOworICAgIHN0b3JlMSA9IHN0b3JlMSB8ICgodWludDY0X3QpIG91dDApOwogCi0gICAgZm9yIChscF9jbnQgPSA0OyBscF9jbnQtLTspIHsKLSAgICAgICAgU1cob3V0Miwgc3JjKTsKLSAgICAgICAgU1cob3V0MSwgc3JjICsgNCk7Ci0gICAgICAgIFNXKG91dDAsIHNyYyArIHN0cmlkZSAqIDQpOwotICAgICAgICBTVyhvdXQxLCBzcmMgKyBzdHJpZGUgKiA0ICsgNCk7Ci0gICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgfQorICAgIFNENChzdG9yZTAsIHN0b3JlMCwgc3RvcmUwLCBzdG9yZTAsIHNyYywgc3RyaWRlKTsKKyAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOworICAgIFNENChzdG9yZTEsIHN0b3JlMSwgc3RvcmUxLCBzdG9yZTEsIHNyYywgc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaW50cmFfcHJlZGljdF9tYWRfY293X2RjXzBsdF84eDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBscF9jbnQ7Ci0gICAgdWludDMyX3Qgc3JjMCwgc3JjMSwgc3JjMiA9IDAsIHNyYzM7CisgICAgdWludDMyX3Qgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB1aW50MzJfdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHVpbnQ2NF90IHN0b3JlMCwgc3RvcmUxOwogICAgIHYxNnU4IHNyY190b3A7CiAgICAgdjh1MTYgYWRkOwogICAgIHY0dTMyIHN1bTsKQEAgLTUxNCwxMCArNDExLDEwIEBACiAgICAgc3JjMCA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgc3VtLCAwKTsKICAgICBzcmMxID0gX19tc2FfY29weV91X3coKHY0aTMyKSBzdW0sIDEpOwogCi0gICAgZm9yIChscF9jbnQgPSAwOyBscF9jbnQgPCA0OyBscF9jbnQrKykgewotICAgICAgICBzcmMyICs9IHNyY1soNCArIGxwX2NudCkgKiBzdHJpZGUgLSAxXTsKLSAgICB9Ci0KKyAgICBzcmMyICA9IHNyY1s0ICogc3RyaWRlIC0gMV07CisgICAgc3JjMiArPSBzcmNbNSAqIHN0cmlkZSAtIDFdOworICAgIHNyYzIgKz0gc3JjWzYgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMyICs9IHNyY1s3ICogc3RyaWRlIC0gMV07CiAgICAgc3JjMCA9IChzcmMwICsgMikgPj4gMjsKICAgICBzcmMzID0gKHNyYzEgKyBzcmMyICsgNCkgPj4gMzsKICAgICBzcmMxID0gKHNyYzEgKyAyKSA+PiAyOwpAQCAtNTI3LDU3ICs0MjQsNDkgQEAKICAgICBvdXQxID0gc3JjMSAqIDB4MDEwMTAxMDE7CiAgICAgb3V0MiA9IHNyYzIgKiAweDAxMDEwMTAxOwogICAgIG91dDMgPSBzcmMzICogMHgwMTAxMDEwMTsKKyAgICBzdG9yZTAgPSAoKHVpbnQ2NF90KSBvdXQxIDw8IDMyKSB8IG91dDA7CisgICAgc3RvcmUxID0gKCh1aW50NjRfdCkgb3V0MyA8PCAzMikgfCBvdXQyOwogCi0gICAgZm9yIChscF9jbnQgPSA0OyBscF9jbnQtLTspIHsKLSAgICAgICAgU1cob3V0MCwgc3JjKTsKLSAgICAgICAgU1cob3V0MSwgc3JjICsgNCk7Ci0gICAgICAgIFNXKG91dDIsIHNyYyArIHN0cmlkZSAqIDQpOwotICAgICAgICBTVyhvdXQzLCBzcmMgKyBzdHJpZGUgKiA0ICsgNCk7Ci0gICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgfQorICAgIFNENChzdG9yZTAsIHN0b3JlMCwgc3RvcmUwLCBzdG9yZTAsIHNyYywgc3RyaWRlKTsKKyAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOworICAgIFNENChzdG9yZTEsIHN0b3JlMSwgc3RvcmUxLCBzdG9yZTEsIHNyYywgc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaW50cmFfcHJlZGljdF9tYWRfY293X2RjX2wwMF84eDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBscF9jbnQ7Ci0gICAgdWludDMyX3Qgc3JjMCA9IDA7CisgICAgdWludDMyX3Qgc3JjMDsKICAgICB1aW50NjRfdCBvdXQwLCBvdXQxOwogCi0gICAgZm9yIChscF9jbnQgPSAwOyBscF9jbnQgPCA0OyBscF9jbnQrKykgewotICAgICAgICBzcmMwICs9IHNyY1tscF9jbnQgKiBzdHJpZGUgLSAxXTsKLSAgICB9Ci0KKyAgICBzcmMwICA9IHNyY1swICogc3RyaWRlIC0gMV07CisgICAgc3JjMCArPSBzcmNbMSAqIHN0cmlkZSAtIDFdOworICAgIHNyYzAgKz0gc3JjWzIgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMwICs9IHNyY1szICogc3RyaWRlIC0gMV07CiAgICAgc3JjMCA9IChzcmMwICsgMikgPj4gMjsKICAgICBvdXQwID0gc3JjMCAqIDB4MDEwMTAxMDEwMTAxMDEwMTsKICAgICBvdXQxID0gMHg4MDgwODA4MDgwODA4MDgwOwogCi0gICAgZm9yIChscF9jbnQgPSA0OyBscF9jbnQtLTspIHsKLSAgICAgICAgU0Qob3V0MCwgc3JjKTsKLSAgICAgICAgU0Qob3V0MSwgc3JjICsgc3RyaWRlICogNCk7Ci0gICAgICAgIHNyYyArPSBzdHJpZGU7Ci0gICAgfQorICAgIFNENChvdXQwLCBvdXQwLCBvdXQwLCBvdXQwLCBzcmMsIHN0cmlkZSk7CisgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKKyAgICBTRDQob3V0MSwgb3V0MSwgb3V0MSwgb3V0MSwgc3JjLCBzdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBpbnRyYV9wcmVkaWN0X21hZF9jb3dfZGNfMGwwXzh4OF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90IGxwX2NudDsKLSAgICB1aW50MzJfdCBzcmMwID0gMDsKKyAgICB1aW50MzJfdCBzcmMwOwogICAgIHVpbnQ2NF90IG91dDAsIG91dDE7CiAKLSAgICBmb3IgKGxwX2NudCA9IDA7IGxwX2NudCA8IDQ7IGxwX2NudCsrKSB7Ci0gICAgICAgIHNyYzAgKz0gc3JjWyg0ICsgbHBfY250KSAqIHN0cmlkZSAtIDFdOwotICAgIH0KLQorICAgIHNyYzAgID0gc3JjWzQgKiBzdHJpZGUgLSAxXTsKKyAgICBzcmMwICs9IHNyY1s1ICogc3RyaWRlIC0gMV07CisgICAgc3JjMCArPSBzcmNbNiAqIHN0cmlkZSAtIDFdOworICAgIHNyYzAgKz0gc3JjWzcgKiBzdHJpZGUgLSAxXTsKICAgICBzcmMwID0gKHNyYzAgKyAyKSA+PiAyOwogCiAgICAgb3V0MCA9IDB4ODA4MDgwODA4MDgwODA4MDsKICAgICBvdXQxID0gc3JjMCAqIDB4MDEwMTAxMDEwMTAxMDEwMTsKIAotICAgIGZvciAobHBfY250ID0gNDsgbHBfY250LS07KSB7Ci0gICAgICAgIFNEKG91dDAsIHNyYyk7Ci0gICAgICAgIFNEKG91dDEsIHNyYyArIHN0cmlkZSAqIDQpOwotICAgICAgICBzcmMgKz0gc3RyaWRlOwotICAgIH0KKyAgICBTRDQob3V0MCwgb3V0MCwgb3V0MCwgb3V0MCwgc3JjLCBzdHJpZGUpOworICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisgICAgU0Q0KG91dDEsIG91dDEsIG91dDEsIG91dDEsIHNyYywgc3RyaWRlKTsKIH0KIAogdm9pZCBmZl9oMjY0X2ludHJhX3ByZWRpY3RfcGxhbmVfOHg4X21zYSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCkBAIC02NDgsOCArNTM3LDQyIEBACiAgICAgdWludDhfdCAqc3JjX3RvcCA9IHNyYyAtIHN0cmlkZTsKICAgICB1aW50OF90ICpzcmNfbGVmdCA9IHNyYyAtIDE7CiAgICAgdWludDhfdCAqZHN0ID0gc3JjOworICAgIHVpbnQzMl90IGFkZGl0aW9uID0gMDsKKyAgICB2MTZ1OCBzcmNfYWJvdmUsIG91dDsKKyAgICB2OHUxNiBzdW1fYWJvdmU7CisgICAgdjR1MzIgc3VtX3RvcDsKKyAgICB2MnU2NCBzdW07CiAKLSAgICBpbnRyYV9wcmVkaWN0X2RjXzE2eDE2X21zYShzcmNfdG9wLCBzcmNfbGVmdCwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMSwgMSk7CisgICAgc3JjX2Fib3ZlID0gTERfVUIoc3JjX3RvcCk7CisKKyAgICBzdW1fYWJvdmUgPSBfX21zYV9oYWRkX3VfaChzcmNfYWJvdmUsIHNyY19hYm92ZSk7CisgICAgc3VtX3RvcCA9IF9fbXNhX2hhZGRfdV93KHN1bV9hYm92ZSwgc3VtX2Fib3ZlKTsKKyAgICBzdW0gPSBfX21zYV9oYWRkX3VfZChzdW1fdG9wLCBzdW1fdG9wKTsKKyAgICBzdW1fdG9wID0gKHY0dTMyKSBfX21zYV9wY2tldl93KCh2NGkzMikgc3VtLCAodjRpMzIpIHN1bSk7CisgICAgc3VtID0gX19tc2FfaGFkZF91X2Qoc3VtX3RvcCwgc3VtX3RvcCk7CisgICAgYWRkaXRpb24gPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIHN1bSwgMCk7CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbIDAgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WyAxICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsgMiAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbIDMgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WyA0ICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsgNSAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbIDYgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WyA3ICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsgOCAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbIDkgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WzEwICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsxMSAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbMTIgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WzEzICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsxNCAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbMTUgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uID0gKGFkZGl0aW9uICsgMTYpID4+IDU7CisgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9maWxsX2IoYWRkaXRpb24pOworCisgICAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIHN0cmlkZSk7CisgICAgZHN0ICs9ICg4ICogc3RyaWRlKTsKKyAgICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCwgc3RyaWRlKTsKIH0KIAogdm9pZCBmZl9oMjY0X2ludHJhX3ByZWRfdmVydF8xNngxNl9tc2EodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQpAQCAtNjY4LDM4ICs1OTEsODIgQEAKIAogdm9pZCBmZl9oMjY0X2ludHJhX3ByZWRfZGNfbGVmdF8xNngxNl9tc2EodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgKnNyY190b3AgPSBzcmMgLSBzdHJpZGU7CiAgICAgdWludDhfdCAqc3JjX2xlZnQgPSBzcmMgLSAxOwogICAgIHVpbnQ4X3QgKmRzdCA9IHNyYzsKKyAgICB1aW50MzJfdCBhZGRpdGlvbjsKKyAgICB2MTZ1OCBvdXQ7CiAKLSAgICBpbnRyYV9wcmVkaWN0X2RjXzE2eDE2X21zYShzcmNfdG9wLCBzcmNfbGVmdCwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMCwgMSk7CisgICAgYWRkaXRpb24gID0gc3JjX2xlZnRbIDAgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WyAxICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsgMiAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbIDMgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WyA0ICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsgNSAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbIDYgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WyA3ICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsgOCAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbIDkgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WzEwICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsxMSAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbMTIgKiBzdHJpZGVdOworICAgIGFkZGl0aW9uICs9IHNyY19sZWZ0WzEzICogc3RyaWRlXTsKKyAgICBhZGRpdGlvbiArPSBzcmNfbGVmdFsxNCAqIHN0cmlkZV07CisgICAgYWRkaXRpb24gKz0gc3JjX2xlZnRbMTUgKiBzdHJpZGVdOworCisgICAgYWRkaXRpb24gPSAoYWRkaXRpb24gKyA4KSA+PiA0OworICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKGFkZGl0aW9uKTsKKworICAgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSAoOCAqIHN0cmlkZSk7CisgICAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIHN0cmlkZSk7CiB9CiAKIHZvaWQgZmZfaDI2NF9pbnRyYV9wcmVkX2RjX3RvcF8xNngxNl9tc2EodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIHVpbnQ4X3QgKnNyY190b3AgPSBzcmMgLSBzdHJpZGU7Ci0gICAgdWludDhfdCAqc3JjX2xlZnQgPSBzcmMgLSAxOwogICAgIHVpbnQ4X3QgKmRzdCA9IHNyYzsKKyAgICB2MTZ1OCBzcmNfYWJvdmUsIG91dDsKKyAgICB2OHUxNiBzdW1fYWJvdmU7CisgICAgdjR1MzIgc3VtX3RvcDsKKyAgICB2MnU2NCBzdW07CiAKLSAgICBpbnRyYV9wcmVkaWN0X2RjXzE2eDE2X21zYShzcmNfdG9wLCBzcmNfbGVmdCwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMSwgMCk7CisgICAgc3JjX2Fib3ZlID0gTERfVUIoc3JjX3RvcCk7CisKKyAgICBzdW1fYWJvdmUgPSBfX21zYV9oYWRkX3VfaChzcmNfYWJvdmUsIHNyY19hYm92ZSk7CisgICAgc3VtX3RvcCA9IF9fbXNhX2hhZGRfdV93KHN1bV9hYm92ZSwgc3VtX2Fib3ZlKTsKKyAgICBzdW0gPSBfX21zYV9oYWRkX3VfZChzdW1fdG9wLCBzdW1fdG9wKTsKKyAgICBzdW1fdG9wID0gKHY0dTMyKSBfX21zYV9wY2tldl93KCh2NGkzMikgc3VtLCAodjRpMzIpIHN1bSk7CisgICAgc3VtID0gX19tc2FfaGFkZF91X2Qoc3VtX3RvcCwgc3VtX3RvcCk7CisgICAgc3VtID0gKHYydTY0KSBfX21zYV9zcmFyaV9kKCh2Mmk2NCkgc3VtLCA0KTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3NwbGF0aV9iKCh2MTZpOCkgc3VtLCAwKTsKKworICAgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSAoOCAqIHN0cmlkZSk7CisgICAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIHN0cmlkZSk7CiB9CiAKIHZvaWQgZmZfaDI2NF9pbnRyYV9wcmVkX2RjXzEyOF84eDhfbXNhKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90ICpzcmNfdG9wID0gc3JjIC0gc3RyaWRlOwotICAgIHVpbnQ4X3QgKnNyY19sZWZ0ID0gc3JjIC0gMTsKLSAgICB1aW50OF90ICpkc3QgPSBzcmM7CisgICAgdWludDY0X3Qgb3V0OworICAgIHYxNnU4IHN0b3JlOwogCi0gICAgaW50cmFfcHJlZGljdF9kY184eDhfbXNhKHNyY190b3AsIHNyY19sZWZ0LCBzdHJpZGUsIGRzdCwgc3RyaWRlLCAwLCAwKTsKKyAgICBzdG9yZSA9ICh2MTZ1OCkgX19tc2FfZmlsbF9iKDEyOCk7CisgICAgb3V0ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzdG9yZSwgMCk7CisKKyAgICBTRDQob3V0LCBvdXQsIG91dCwgb3V0LCBzcmMsIHN0cmlkZSk7CisgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKKyAgICBTRDQob3V0LCBvdXQsIG91dCwgb3V0LCBzcmMsIHN0cmlkZSk7CiB9CiAKIHZvaWQgZmZfaDI2NF9pbnRyYV9wcmVkX2RjXzEyOF8xNngxNl9tc2EodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgKnNyY190b3AgPSBzcmMgLSBzdHJpZGU7Ci0gICAgdWludDhfdCAqc3JjX2xlZnQgPSBzcmMgLSAxOwotICAgIHVpbnQ4X3QgKmRzdCA9IHNyYzsKKyAgICB2MTZ1OCBvdXQ7CiAKLSAgICBpbnRyYV9wcmVkaWN0X2RjXzE2eDE2X21zYShzcmNfdG9wLCBzcmNfbGVmdCwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMCwgMCk7CisgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9maWxsX2IoMTI4KTsKKworICAgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgc3JjLCBzdHJpZGUpOworICAgIHNyYyArPSAoOCAqIHN0cmlkZSk7CisgICAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBzcmMsIHN0cmlkZSk7CiB9CiAKIHZvaWQgZmZfdnA4X3ByZWQ4eDhfMTI3X2RjXzhfbXNhKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oMjY0cXBlbF9tbWkuYyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0cXBlbF9tbWkuYwppbmRleCBlMDRhMmQ1Li4xM2ZiZWJmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaDI2NHFwZWxfbW1pLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2gyNjRxcGVsX21taS5jCkBAIC0yMiw0MjEgKzIyLDIxMiBAQAogICovCiAKICNpbmNsdWRlICJoMjY0ZHNwX21pcHMuaCIKKyNpbmNsdWRlICJocGVsZHNwX21pcHMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2JpdF9kZXB0aF90ZW1wbGF0ZS5jIgorI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL21taXV0aWxzLmgiCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrNF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQogeworICAgIGRvdWJsZSBmdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjIsIDMoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYyLCAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMiwgMyglW2RzdF0pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjIsIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVtzcmNdLCAlW3NyY10sICVbc3JjU3RyaWRlXSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbZHN0XSwgJVtkc3RdLCAlW2RzdFN0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZGkgJVtoXSwgJVtoXSwgLTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJVtoXSwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW2RzdF0iKyZyIihkc3QpLFtzcmNdIismciIoc3JjKQotICAgICAgICA6IFtkc3RTdHJpZGVdInIiKGRzdFN0cmlkZSksW3NyY1N0cmlkZV0iciIoc3JjU3RyaWRlKSxbaF0iciIoaCkKLSAgICAgICAgOiAiJGYyIgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICJhZGRpICAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgIDogW2RzdFN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdFN0cmlkZSksCisgICAgICAgICAgW3NyY1N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY1N0cmlkZSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrOF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKQogeworICAgIGRvdWJsZSBmdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjIsIDcoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyLCAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmMiwgNyglW2RzdF0pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjIsIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVtzcmNdLCAlW3NyY10sICVbc3JjU3RyaWRlXSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbZHN0XSwgJVtkc3RdLCAlW2RzdFN0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZGkgJVtoXSwgJVtoXSwgLTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJVtoXSwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW2RzdF0iKyZyIihkc3QpLFtzcmNdIismciIoc3JjKQotICAgICAgICA6IFtkc3RTdHJpZGVdInIiKGRzdFN0cmlkZSksW3NyY1N0cmlkZV0iciIoc3JjU3RyaWRlKSxbaF0iciIoaCkKLSAgICAgICAgOiAiJGYyIgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICJhZGRpICAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLAorICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgIDogW2RzdFN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdFN0cmlkZSksCisgICAgICAgICAgW3NyY1N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY1N0cmlkZSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjb3B5X2Jsb2NrMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCkKIHsKKyAgICBkb3VibGUgZnRtcFsxXTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgNyglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjIsIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY0LCAxNSglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNCwgOCglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIsIDcoJVtkc3RdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYyLCAwKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmNCwgMTUoJVtkc3RdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjQsIDgoJVtkc3RdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVtzcmNdLCAlW3NyY10sICVbc3JjU3RyaWRlXSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbZHN0XSwgJVtkc3RdLCAlW2RzdFN0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZGkgJVtoXSwgJVtoXSwgLTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJVtoXSwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW2RzdF0iKyZyIihkc3QpLFtzcmNdIismciIoc3JjKQotICAgICAgICA6IFtkc3RTdHJpZGVdInIiKGRzdFN0cmlkZSksW3NyY1N0cmlkZV0iciIoc3JjU3RyaWRlKSxbaF0iciIoaCkKLSAgICAgICAgOiAiJGYyIiwiJGY0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgICJsZGwgICAgICAgICVbdG1wMF0sICAgIDB4MGYoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGRyICAgICAgICAlW3RtcDBdLCAgICAweDA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgInNkbCAgICAgICAgJVt0bXAwXSwgICAgMHgwZiglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzZHIgICAgICAgICVbdG1wMF0sICAgIDB4MDgoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaSAgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLAorICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgIDogW2RzdFN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdFN0cmlkZSksCisgICAgICAgICAgW3NyY1N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY1N0cmlkZSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKLSNkZWZpbmUgb3BfcHV0KGEsIGIpIGEgPSBiCi0jZGVmaW5lIG9wX2F2ZyhhLCBiKSBhID0gcm5kX2F2Z19waXhlbDQoYSwgYikKLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcGl4ZWxzNF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKLSAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCi17Ci0gICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjIsIDMoJVtwaXhlbHNdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYyLCAwKCVbcGl4ZWxzXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3bGMxICRmMiwgMyglW2Jsb2NrXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd3JjMSAkZjIsIDAoJVtibG9ja10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVtwaXhlbHNdLCAlW3BpeGVsc10sICVbbGluZV9zaXplXVxyXG4iCi0gICAgICAgICJkYWRkICVbYmxvY2tdLCAlW2Jsb2NrXSwgJVtsaW5lX3NpemVdICBcclxuIgotICAgICAgICAiZGFkZGkgJVtoXSwgJVtoXSwgLTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJVtoXSwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW2Jsb2NrXSIrJnIiKGJsb2NrKSxbcGl4ZWxzXSIrJnIiKHBpeGVscykKLSAgICAgICAgOiBbbGluZV9zaXplXSJyIihsaW5lX3NpemUpLFtoXSJyIihoKQotICAgICAgICA6ICIkZjIiCi0gICAgKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHB1dF9waXhlbHM4X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAotICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKLXsKLSAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgNyglW3BpeGVsc10pICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjIsIDAoJVtwaXhlbHNdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RsYzEgJGYyLCA3KCVbYmxvY2tdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkcmMxICRmMiwgMCglW2Jsb2NrXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3BpeGVsc10sICVbcGl4ZWxzXSwgJVtsaW5lX3NpemVdXHJcbiIKLSAgICAgICAgImRhZGQgJVtibG9ja10sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0gIFxyXG4iCi0gICAgICAgICJkYWRkaSAlW2hdLCAlW2hdLCAtMSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAlW2hdLCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbYmxvY2tdIismciIoYmxvY2spLFtwaXhlbHNdIismciIocGl4ZWxzKQotICAgICAgICA6IFtsaW5lX3NpemVdInIiKGxpbmVfc2l6ZSksW2hdInIiKGgpCi0gICAgICAgIDogIiRmMiIKLSAgICApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BpeGVsczE2X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAotICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKLXsKLSAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgNyglW3BpeGVsc10pICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjIsIDAoJVtwaXhlbHNdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY0LCAxNSglW3BpeGVsc10pICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNCwgOCglW3BpeGVsc10pICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIsIDcoJVtibG9ja10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYyLCAwKCVbYmxvY2tdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmNCwgMTUoJVtibG9ja10pICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjQsIDgoJVtibG9ja10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVtwaXhlbHNdLCAlW3BpeGVsc10sICVbbGluZV9zaXplXVxyXG4iCi0gICAgICAgICJkYWRkICVbYmxvY2tdLCAlW2Jsb2NrXSwgJVtsaW5lX3NpemVdICBcclxuIgotICAgICAgICAiZGFkZGkgJVtoXSwgJVtoXSwgLTEgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJVtoXSwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW2Jsb2NrXSIrJnIiKGJsb2NrKSxbcGl4ZWxzXSIrJnIiKHBpeGVscykKLSAgICAgICAgOiBbbGluZV9zaXplXSJyIihsaW5lX3NpemUpLFtoXSJyIihoKQotICAgICAgICA6ICIkZjIiLCIkZjQiCi0gICAgKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF2Z19waXhlbHM0X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAotICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKLXsKLSAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMiwgMyglW3BpeGVsc10pICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjIsIDAoJVtwaXhlbHNdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGY0LCAzKCVbYmxvY2tdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNCwgMCglW2Jsb2NrXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGYyLCAkZjIsICRmNCAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3dsYzEgJGYyLCAzKCVbYmxvY2tdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3N3cmMxICRmMiwgMCglW2Jsb2NrXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3BpeGVsc10sICVbcGl4ZWxzXSwgJVtsaW5lX3NpemVdXHJcbiIKLSAgICAgICAgImRhZGQgJVtibG9ja10sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0gIFxyXG4iCi0gICAgICAgICJkYWRkaSAlW2hdLCAlW2hdLCAtMSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAlW2hdLCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbYmxvY2tdIismciIoYmxvY2spLFtwaXhlbHNdIismciIocGl4ZWxzKQotICAgICAgICA6IFtsaW5lX3NpemVdInIiKGxpbmVfc2l6ZSksW2hdInIiKGgpCi0gICAgICAgIDogIiRmMiIsIiRmNCIKLSAgICApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXZnX3BpeGVsczhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCi0gICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQotewotICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYyLCA3KCVbYmxvY2tdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMiwgMCglW2Jsb2NrXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjQsIDcoJVtwaXhlbHNdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY0LCAwKCVbcGl4ZWxzXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjIsICRmMiwgJGY0ICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIsIDcoJVtibG9ja10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYyLCAwKCVbYmxvY2tdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbcGl4ZWxzXSwgJVtwaXhlbHNdLCAlW2xpbmVfc2l6ZV1cclxuIgotICAgICAgICAiZGFkZCAlW2Jsb2NrXSwgJVtibG9ja10sICVbbGluZV9zaXplXSAgXHJcbiIKLSAgICAgICAgImRhZGRpICVbaF0sICVbaF0sIC0xICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICVbaF0sIDFiICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6IFtibG9ja10iKyZyIihibG9jayksW3BpeGVsc10iKyZyIihwaXhlbHMpCi0gICAgICAgIDogW2xpbmVfc2l6ZV0iciIobGluZV9zaXplKSxbaF0iciIoaCkKLSAgICAgICAgOiAiJGYyIiwiJGY0IgotICAgICk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdmdfcGl4ZWxzMTZfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCi0gICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQotewotICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYyLCA3KCVbYmxvY2tdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMiwgMCglW2Jsb2NrXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjQsIDE1KCVbYmxvY2tdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY0LCA4KCVbYmxvY2tdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNiwgNyglW3BpeGVsc10pICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjYsIDAoJVtwaXhlbHNdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY4LCAxNSglW3BpeGVsc10pICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmOCwgOCglW3BpeGVsc10pICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGYyLCAkZjIsICRmNiAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhdmdiICRmNCwgJGY0LCAkZjggICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmMiwgNyglW2Jsb2NrXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHJjMSAkZjIsIDAoJVtibG9ja10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RsYzEgJGY0LCAxNSglW2Jsb2NrXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkcmMxICRmNCwgOCglW2Jsb2NrXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3BpeGVsc10sICVbcGl4ZWxzXSwgJVtsaW5lX3NpemVdXHJcbiIKLSAgICAgICAgImRhZGQgJVtibG9ja10sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0gIFxyXG4iCi0gICAgICAgICJkYWRkaSAlW2hdLCAlW2hdLCAtMSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAlW2hdLCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbYmxvY2tdIismciIoYmxvY2spLFtwaXhlbHNdIismciIocGl4ZWxzKQotICAgICAgICA6IFtsaW5lX3NpemVdInIiKGxpbmVfc2l6ZSksW2hdInIiKGgpCi0gICAgICAgIDogIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIKLSAgICApOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BpeGVsczRfbDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAotICAgICAgICBpbnQgaCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgIHBpeGVsNCBhLCBiOwotICAgICAgICBhID0gQVZfUk40UCgmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyXSk7Ci0gICAgICAgIG9wX3B1dCgqKChwaXhlbDQgKikgJmRzdFtpICogZHN0X3N0cmlkZV0pLCBybmRfYXZnX3BpeGVsNChhLCBiKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X3BpeGVsczhfbDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAotICAgICAgICBpbnQgaCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgIHBpeGVsNCBhLCBiOwotICAgICAgICBhID0gQVZfUk40UCgmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyXSk7Ci0gICAgICAgIG9wX3B1dCgqKChwaXhlbDQgKikgJmRzdFtpICogZHN0X3N0cmlkZV0pLCBybmRfYXZnX3BpeGVsNChhLCBiKSk7Ci0gICAgICAgIGEgPSBBVl9STjRQKCZzcmMxW2kgKiBzcmNfc3RyaWRlMSArIDRdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyICsgNF0pOwotICAgICAgICBvcF9wdXQoKigocGl4ZWw0ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyA0XSksIHJuZF9hdmdfcGl4ZWw0KGEsIGIpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcGl4ZWxzMTZfbDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAotICAgICAgICBpbnQgaCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgIHBpeGVsNCBhLCBiOwotICAgICAgICBhID0gQVZfUk40UCgmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyXSk7Ci0gICAgICAgIG9wX3B1dCgqKChwaXhlbDQgKikgJmRzdFtpICogZHN0X3N0cmlkZV0pLCBybmRfYXZnX3BpeGVsNChhLCBiKSk7Ci0gICAgICAgIGEgPSBBVl9STjRQKCZzcmMxW2kgKiBzcmNfc3RyaWRlMSArIDRdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyICsgNF0pOwotICAgICAgICBvcF9wdXQoKigocGl4ZWw0ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyA0XSksIHJuZF9hdmdfcGl4ZWw0KGEsIGIpKTsKLSAgICAgICAgYSA9IEFWX1JONFAoJnNyYzFbaSAqIHNyY19zdHJpZGUxICsgOF0pOwotICAgICAgICBiID0gQVZfUk40UCgmc3JjMltpICogc3JjX3N0cmlkZTIgKyA4XSk7Ci0gICAgICAgIG9wX3B1dCgqKChwaXhlbDQgKikgJmRzdFtpICogZHN0X3N0cmlkZSArIDhdKSwgcm5kX2F2Z19waXhlbDQoYSwgYikpOwotICAgICAgICBhID0gQVZfUk40UCgmc3JjMVtpICogc3JjX3N0cmlkZTEgKyAxMl0pOwotICAgICAgICBiID0gQVZfUk40UCgmc3JjMltpICogc3JjX3N0cmlkZTIgKyAxMl0pOwotICAgICAgICBvcF9wdXQoKigocGl4ZWw0ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyAxMl0pLCBybmRfYXZnX3BpeGVsNChhLCBiKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXZnX3BpeGVsczRfbDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAotICAgICAgICBpbnQgaCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgIHBpeGVsNCBhLCBiOwotICAgICAgICBhID0gQVZfUk40UCgmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyXSk7Ci0gICAgICAgIG9wX2F2ZygqKChwaXhlbDQgKikgJmRzdFtpICogZHN0X3N0cmlkZV0pLCBybmRfYXZnX3BpeGVsNChhLCBiKSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYXZnX3BpeGVsczhfbDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAotICAgICAgICBpbnQgaCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgIHBpeGVsNCBhLCBiOwotICAgICAgICBhID0gQVZfUk40UCgmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyXSk7Ci0gICAgICAgIG9wX2F2ZygqKChwaXhlbDQgKikgJmRzdFtpICogZHN0X3N0cmlkZV0pLCBybmRfYXZnX3BpeGVsNChhLCBiKSk7Ci0gICAgICAgIGEgPSBBVl9STjRQKCZzcmMxW2kgKiBzcmNfc3RyaWRlMSArIDRdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyICsgNF0pOwotICAgICAgICBvcF9hdmcoKigocGl4ZWw0ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyA0XSksIHJuZF9hdmdfcGl4ZWw0KGEsIGIpKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhdmdfcGl4ZWxzMTZfbDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAotICAgICAgICBpbnQgaCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7Ci0gICAgICAgIHBpeGVsNCBhLCBiOwotICAgICAgICBhID0gQVZfUk40UCgmc3JjMVtpICogc3JjX3N0cmlkZTFdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyXSk7Ci0gICAgICAgIG9wX2F2ZygqKChwaXhlbDQgKikgJmRzdFtpICogZHN0X3N0cmlkZV0pLCBybmRfYXZnX3BpeGVsNChhLCBiKSk7Ci0gICAgICAgIGEgPSBBVl9STjRQKCZzcmMxW2kgKiBzcmNfc3RyaWRlMSArIDRdKTsKLSAgICAgICAgYiA9IEFWX1JONFAoJnNyYzJbaSAqIHNyY19zdHJpZGUyICsgNF0pOwotICAgICAgICBvcF9hdmcoKigocGl4ZWw0ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyA0XSksIHJuZF9hdmdfcGl4ZWw0KGEsIGIpKTsKLSAgICAgICAgYSA9IEFWX1JONFAoJnNyYzFbaSAqIHNyY19zdHJpZGUxICsgOF0pOwotICAgICAgICBiID0gQVZfUk40UCgmc3JjMltpICogc3JjX3N0cmlkZTIgKyA4XSk7Ci0gICAgICAgIG9wX2F2ZygqKChwaXhlbDQgKikgJmRzdFtpICogZHN0X3N0cmlkZSArIDhdKSwgcm5kX2F2Z19waXhlbDQoYSwgYikpOwotICAgICAgICBhID0gQVZfUk40UCgmc3JjMVtpICogc3JjX3N0cmlkZTEgKyAxMl0pOwotICAgICAgICBiID0gQVZfUk40UCgmc3JjMltpICogc3JjX3N0cmlkZTIgKyAxMl0pOwotICAgICAgICBvcF9hdmcoKigocGl4ZWw0ICopICZkc3RbaSAqIGRzdF9zdHJpZGUgKyAxMl0pLCBybmRfYXZnX3BpeGVsNChhLCBiKSk7Ci0KLSAgICB9Ci19Ci0jdW5kZWYgb3BfcHV0Ci0jdW5kZWYgb3BfYXZnCi0KICNkZWZpbmUgb3AyX2F2ZyhhLCBiKSAgYSA9ICgoKGEpK0NMSVAoKChiKSArIDUxMik+PjEwKSsxKT4+MSkKICNkZWZpbmUgb3AyX3B1dChhLCBiKSAgYSA9IENMSVAoKChiKSArIDUxMik+PjEwKQogc3RhdGljIHZvaWQgcHV0X2gyNjRfcXBlbDRfaF9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSkKIHsKKyAgICBkb3VibGUgZnRtcFsxMF07CisgICAgdWludDY0X3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ4LCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMiwgMSglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjIsIC0yKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGY0LCAyKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNCwgLTEoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjYsIDMoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGY2LCAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmOCwgNCglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjgsIDEoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGYxMCwgNSglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTAsIDIoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjEyLCA2KCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYxMiwgMyglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTAsICRmMTAsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxNCwgJGY2LCAkZjggICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTYsICRmNCwgJGYxMCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE4LCAkZjIsICRmMTIgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxNCwgJGYxNCwgJVtmZl9wd18yMF0gICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMTYsICRmMTYsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjE0LCAkZjE0LCAkZjE2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxOCwgJGYxNCwgJGYxOCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTgsICRmMTgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMTgsICRmMTgsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjE4LCAkZjE4LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjE4LCAzKCVbZHN0XSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3dyYzEgJGYxOCwgMCglW2RzdF0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbZHN0XSwgJVtkc3RdLCAlW2RzdFN0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3NyY10sICVbc3JjXSwgJVtzcmNTdHJpZGVdICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpICQ4LCAkOCwgLTEgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICQ4LCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6IFtkc3RdIismciIoZHN0KSxbc3JjXSIrJnIiKHNyYykKLSAgICAgICAgOiBbZHN0U3RyaWRlXSJyIihkc3RTdHJpZGUpLFtzcmNTdHJpZGVdInIiKHNyY1N0cmlkZSksCi0gICAgICAgICAgW2ZmX3B3XzIwXSJmIihmZl9wd18yMCksW2ZmX3B3XzVdImYiKGZmX3B3XzUpLFtmZl9wd18xNl0iZiIoZmZfcHdfMTYpCi0gICAgICAgIDogIiQ4IiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIsCi0gICAgICAgICAgIiRmMTgiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAtMHgwMikKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW3NyY10sIC0weDAxKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbc3JjXSwgIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA0XSwgJVtzcmNdLCAgMHgwMSkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDVdLCAlW3NyY10sICAweDAyKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNl0sICVbc3JjXSwgIDB4MDMpCisKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wN10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDhdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA5XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZmZfcHdfMjBdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wOV0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDldLCAgICVbZnRtcDldLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDldLCAlW2RzdF0sICAweDAwKQorICAgICAgICAiZGFkZGkgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpCisgICAgICAgIDogW2RzdFN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdFN0cmlkZSksCisgICAgICAgICAgW3NyY1N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY1N0cmlkZSksCisgICAgICAgICAgW2ZmX3B3XzIwXSJmIihmZl9wd18yMCksICAgICAgICAgIFtmZl9wd181XSJmIihmZl9wd181KSwKKyAgICAgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAogc3RhdGljIHZvaWQgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSkKIHsKKyAgICBkb3VibGUgZnRtcFsxMV07CisgICAgdWludDY0X3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ4LCA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgNSglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjIsIC0yKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY0LCA2KCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNCwgLTEoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjYsIDcoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY2LCAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmOCwgOCglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjgsIDEoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYxMCwgOSglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTAsIDIoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjEyLCAxMCglW3NyY10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYxMiwgMyglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxNCwgJGY2LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTYsICRmNiwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE4LCAkZjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYyMCwgJGY4LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmNiwgJGYxNCwgJGYxOCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjgsICRmMTYsICRmMjAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGY2LCAkZjYsICVbZmZfcHdfMjBdICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmOCwgJGY4LCAlW2ZmX3B3XzIwXSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE0LCAkZjQsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxNiwgJGY0LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTgsICRmMTAsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjIwLCAkZjEwLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGY0LCAkZjE0LCAkZjE4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTAsICRmMTYsICRmMjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjQsICRmNCwgJVtmZl9wd181XSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxMCwgJGYxMCwgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTQsICRmMiwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjE2LCAkZjIsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxOCwgJGYxMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMjAsICRmMTIsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjIsICRmMTQsICRmMTggICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxMiwgJGYxNiwgJGYyMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmNiwgJGY2LCAkZjQgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjgsICRmOCwgJGYxMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGY2LCAkZjYsICRmMiAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmOCwgJGY4LCAkZjEyICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjYsICRmNiwgJVtmZl9wd18xNl0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGY4LCAkZjgsICVbZmZfcHdfMTZdICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY2LCAkZjYsICVbZmZfcHdfNV0gICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmOCwgJGY4LCAlW2ZmX3B3XzVdICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjE4LCAkZjYsICRmOCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjE4LCAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVtkc3RdLCAlW2RzdF0sICVbZHN0U3RyaWRlXSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbc3JjXSwgJVtzcmNdLCAlW3NyY1N0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZGkgJDgsICQ4LCAtMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJDgsIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW2RzdF0iKyZyIihkc3QpLFtzcmNdIismciIoc3JjKQotICAgICAgICA6IFtkc3RTdHJpZGVdInIiKGRzdFN0cmlkZSksW3NyY1N0cmlkZV0iciIoc3JjU3RyaWRlKSwKLSAgICAgICAgICBbZmZfcHdfMjBdImYiKGZmX3B3XzIwKSxbZmZfcHdfNV0iZiIoZmZfcHdfNSksW2ZmX3B3XzE2XSJmIihmZl9wd18xNikKLSAgICAgICAgOiAiJDgiLCIkZjAiLCIkZjIiLCIkZjQiLCIkZjYiLCIkZjgiLCIkZjEwIiwiJGYxMiIsIiRmMTQiLCIkZjE2IiwKLSAgICAgICAgICAiJGYxOCIsIiRmMjAiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAtMHgwMikKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3NyY10sIC0weDAxKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wM10sICVbc3JjXSwgIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA0XSwgJVtzcmNdLCAgMHgwMSkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDVdLCAlW3NyY10sICAweDAyKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNl0sICVbc3JjXSwgIDB4MDMpCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDddLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wOV0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDEwXSwgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzIwXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmZl9wd18yMF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wN10sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDhdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA5XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMTBdLCAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDJdLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA3XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wOF0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDldLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxMF0sICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDZdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDldLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA5XSwgJVtkc3RdLCAgMHgwMCkKKyAgICAgICAgImRhZGRpICAgICAgJVt0bXAwXSwgICAgJVt0bXAwXSwgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVt0bXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFtkc3RTdHJpZGVdInIiKChtaXBzX3JlZylkc3RTdHJpZGUpLAorICAgICAgICAgIFtzcmNTdHJpZGVdInIiKChtaXBzX3JlZylzcmNTdHJpZGUpLAorICAgICAgICAgIFtmZl9wd18yMF0iZiIoZmZfcHdfMjApLCAgICAgICAgICBbZmZfcHdfNV0iZiIoZmZfcHdfNSksCisgICAgICAgICAgW2ZmX3B3XzE2XSJmIihmZl9wd18xNikKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKQEAgLTQ1NCwxMTYgKzI0NSwxMjkgQEAKIHN0YXRpYyB2b2lkIGF2Z19oMjY0X3FwZWw0X2hfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpCiB7CisgICAgZG91YmxlIGZ0bXBbMTFdOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAieG9yICRmMCwgJGYwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkOCwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjIsIDEoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYyLCAtMiglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmNCwgMiglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjQsIC0xKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGY2LCAzKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNiwgMCglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjgsIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGY4LCAxKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMTAsIDUoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjEwLCAyKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGYxMiwgNiglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTIsIDMoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEwLCAkZjEwLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTQsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE2LCAkZjQsICRmMTAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxOCwgJGYyLCAkZjEyICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMTQsICRmMTQsICVbZmZfcHdfMjBdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjE2LCAkZjE2LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYxNCwgJGYxNCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTgsICRmMTQsICRmMTggICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE4LCAkZjE4LCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjE4LCAkZjE4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYxOCwgJGYxOCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImx3YzEgJGYyMCwgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjE4LCAkZjE4LCAkZjIwICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nzd2xjMSAkZjE4LCAzKCVbZHN0XSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc3dyYzEgJGYxOCwgMCglW2RzdF0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbZHN0XSwgJVtkc3RdLCAlW2RzdFN0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3NyY10sICVbc3JjXSwgJVtzcmNTdHJpZGVdICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpICQ4LCAkOCwgLTEgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICQ4LCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6IFtkc3RdIismciIoZHN0KSxbc3JjXSIrJnIiKHNyYykKLSAgICAgICAgOiBbZHN0U3RyaWRlXSJyIihkc3RTdHJpZGUpLFtzcmNTdHJpZGVdInIiKHNyY1N0cmlkZSksCi0gICAgICAgICAgW2ZmX3B3XzIwXSJmIihmZl9wd18yMCksW2ZmX3B3XzVdImYiKGZmX3B3XzUpLFtmZl9wd18xNl0iZiIoZmZfcHdfMTYpCi0gICAgICAgIDogIiQ4IiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIsCi0gICAgICAgICAgIiRmMTgiLCIkZjIwIgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgLTB4MDIpCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAtMHgwMSkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDNdLCAlW3NyY10sICAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNF0sICVbc3JjXSwgIDB4MDEpCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAgMHgwMikKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDZdLCAlW3NyY10sICAweDAzKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wOF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDldLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmZl9wd18yMF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA5XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDldLCAgICVbZnRtcDldLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMTBdLCAlW2RzdF0sICAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wOV0sICVbZHN0XSwgIDB4MDApCisgICAgICAgICJkYWRkaSAgICAgICVbdG1wMF0sICAgICVbdG1wMF0sICAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbdG1wMF0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbZnRtcDEwXSI9JmYiKGZ0bXBbMTBdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbZHN0U3RyaWRlXSJyIigobWlwc19yZWcpZHN0U3RyaWRlKSwKKyAgICAgICAgICBbc3JjU3RyaWRlXSJyIigobWlwc19yZWcpc3JjU3RyaWRlKSwKKyAgICAgICAgICBbZmZfcHdfMjBdImYiKGZmX3B3XzIwKSwgICAgICAgICAgW2ZmX3B3XzVdImYiKGZmX3B3XzUpLAorICAgICAgICAgIFtmZl9wd18xNl0iZiIoZmZfcHdfMTYpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCiBzdGF0aWMgdm9pZCBhdmdfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKQogeworICAgIGRvdWJsZSBmdG1wWzExXTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbGkgJDgsIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYyLCA1KCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMiwgLTIoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjQsIDYoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY0LCAtMSglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNiwgNyglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjYsIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY4LCA4KCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmOCwgMSglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjEwLCA5KCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYxMCwgMiglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTIsIDEwKCVbc3JjXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEyLCAzKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE0LCAkZjYsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxNiwgJGY2LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTgsICRmOCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjIwLCAkZjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGY2LCAkZjE0LCAkZjE4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmOCwgJGYxNiwgJGYyMCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjYsICRmNiwgJVtmZl9wd18yMF0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGY4LCAkZjgsICVbZmZfcHdfMjBdICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTQsICRmNCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjE2LCAkZjQsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxOCwgJGYxMCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMjAsICRmMTAsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjQsICRmMTQsICRmMTggICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxMCwgJGYxNiwgJGYyMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmNCwgJGY0LCAlW2ZmX3B3XzVdICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjEwLCAkZjEwLCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxNCwgJGYyLCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTYsICRmMiwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE4LCAkZjEyLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYyMCwgJGYxMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMiwgJGYxNCwgJGYxOCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjEyLCAkZjE2LCAkZjIwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGY2LCAkZjYsICRmNCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmNiwgJGY2LCAlW2ZmX3B3XzE2XSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjgsICRmOCwgJVtmZl9wd18xNl0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjYsICRmNiwgJVtmZl9wd181XSAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGY4LCAkZjgsICVbZmZfcHdfNV0gICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMTgsICRmNiwgJGY4ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjAsIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGYxOCwgJGYxOCwgJGYyMCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxOCwgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbZHN0XSwgJVtkc3RdLCAlW2RzdFN0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3NyY10sICVbc3JjXSwgJVtzcmNTdHJpZGVdICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpICQ4LCAkOCwgLTEgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICQ4LCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6IFtkc3RdIismciIoZHN0KSxbc3JjXSIrJnIiKHNyYykKLSAgICAgICAgOiBbZHN0U3RyaWRlXSJyIihkc3RTdHJpZGUpLFtzcmNTdHJpZGVdInIiKHNyY1N0cmlkZSksCi0gICAgICAgICAgW2ZmX3B3XzIwXSJmIihmZl9wd18yMCksW2ZmX3B3XzVdImYiKGZmX3B3XzUpLFtmZl9wd18xNl0iZiIoZmZfcHdfMTYpCi0gICAgICAgIDogIiQ4IiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIsCi0gICAgICAgICAgIiRmMTgiLCIkZjIwIgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbc3JjXSwgLTB4MDIpCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtzcmNdLCAtMHgwMSkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW3NyY10sICAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNF0sICVbc3JjXSwgIDB4MDEpCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA1XSwgJVtzcmNdLCAgMHgwMikKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDZdLCAlW3NyY10sICAweDAzKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA3XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wOF0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDldLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxMF0sICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDRdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd18yMF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcHdfMjBdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDddLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wOV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDEwXSwgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wN10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDhdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA5XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMTBdLCAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA5XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMTBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDldLCAgICVbZnRtcDldLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA5XSwgJVtkc3RdLCAweDAwKQorICAgICAgICAiZGFkZGkgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW2Z0bXAxMF0iPSZmIihmdG1wWzEwXSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpCisgICAgICAgIDogW2RzdFN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdFN0cmlkZSksCisgICAgICAgICAgW3NyY1N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY1N0cmlkZSksCisgICAgICAgICAgW2ZmX3B3XzIwXSJmIihmZl9wd18yMCksICAgICAgICAgIFtmZl9wd181XSJmIihmZl9wd181KSwKKyAgICAgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIApAQCAtNTgxLDM0MiArMzg1LDQwOCBAQAogc3RhdGljIHZvaWQgcHV0X2gyNjRfcXBlbDRfdl9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSkKIHsKKyAgICBkb3VibGUgZnRtcFsxMl07CisgICAgdWludDY0X3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworCisgICAgc3JjIC09IDIgKiBzcmNTdHJpZGU7CisKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMiwgMyglW3NyY0JdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjIsIDAoJVtzcmNCXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGY0LCAzKCVbc3JjQV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNCwgMCglW3NyY0FdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjYsIDMoJVtzcmMwXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGY2LCAwKCVbc3JjMF0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmOCwgMyglW3NyYzFdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjgsIDAoJVtzcmMxXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGYxMCwgMyglW3NyYzJdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTAsIDAoJVtzcmMyXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjEyLCAzKCVbc3JjM10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYxMiwgMCglW3NyYzNdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMTQsIDMoJVtzcmM0XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjE0LCAwKCVbc3JjNF0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGYxNiwgMyglW3NyYzVdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTYsIDAoJVtzcmM1XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjE4LCAzKCVbc3JjNl0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYxOCwgMCglW3NyYzZdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTAsICRmMTAsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxNCwgJGYxNCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTYsICRmMTYsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE4LCAkZjE4LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyMCwgJGY2LCAkZjggICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjAsICRmMjAsICVbZmZfcHdfMjBdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjIyLCAkZjQsICRmMTAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyMiwgJGYyMiwgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjQsICRmMjAsICRmMjIgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI0LCAkZjI0LCAkZjIgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNCwgJGYyNCwgJGYxMiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjAsICRmOCwgJGYxMCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjIwLCAkZjIwLCAlW2ZmX3B3XzIwXSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyMiwgJGY2LCAkZjEyICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjIsICRmMjIsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI2LCAkZjIwLCAkZjIyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNiwgJGYyNiwgJGY0ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjYsICRmMjYsICRmMTQgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjIwLCAkZjEwLCAkZjEyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyMCwgJGYyMCwgJVtmZl9wd18yMF0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjIsICRmOCwgJGYxNCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjIyLCAkZjIyLCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyMCwgJGYyMiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICRmNiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjE2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyMCwgJGYxMiwgJGYxNCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjAsICRmMjAsICVbZmZfcHdfMjBdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjIyLCAkZjEwLCAkZjE2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyMiwgJGYyMiwgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMzAsICRmMjAsICRmMjIgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjMwLCAkZjMwLCAkZjggICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYzMCwgJGYzMCwgJGYxOCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjQsICRmMjQsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI2LCAkZjI2LCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMzAsICRmMzAsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjQsICRmMjQsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI2LCAkZjI2LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyOCwgJGYyOCwgJVtmZl9wd181XSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMzAsICRmMzAsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjI0LCAkZjI0LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNiwgJGYyNiwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjMwLCAkZjMwLCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjI0LCAwKCVbZHN0MF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInN3YzEgJGYyNiwgMCglW2RzdDFdKSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzd2MxICRmMjgsIDAoJVtkc3QyXSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjMwLCAwKCVbZHN0M10pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOjpbZHN0MF0iciIoZHN0KSwgICAgICAgICAgICAgICBbZHN0MV0iciIoZHN0K2RzdFN0cmlkZSksCi0gICAgICAgICAgW2RzdDJdInIiKGRzdCsyKmRzdFN0cmlkZSksICAgW2RzdDNdInIiKGRzdCszKmRzdFN0cmlkZSksCi0gICAgICAgICAgW3NyY0JdInIiKHNyYy0yKnNyY1N0cmlkZSksICAgW3NyY0FdInIiKHNyYy1zcmNTdHJpZGUpLAotICAgICAgICAgIFtzcmMwXSJyIihzcmMpLCAgICAgICAgICAgICAgIFtzcmMxXSJyIihzcmMrc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjMl0iciIoc3JjKzIqc3JjU3RyaWRlKSwgICBbc3JjM10iciIoc3JjKzMqc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjNF0iciIoc3JjKzQqc3JjU3RyaWRlKSwgICBbc3JjNV0iciIoc3JjKzUqc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjNl0iciIoc3JjKzYqc3JjU3RyaWRlKSwgICBbZmZfcHdfMjBdImYiKGZmX3B3XzIwKSwKLSAgICAgICAgICBbZmZfcHdfNV0iZiIoZmZfcHdfNSksICAgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KQotICAgICAgICA6ICIkZjAiLCIkZjIiLCIkZjQiLCIkZjYiLCIkZjgiLCIkZjEwIiwiJGYxMiIsIiRmMTQiLCIkZjE2IiwiJGYxOCIsCi0gICAgICAgICAgIiRmMjAiLCIkZjIyIiwiJGYyNCIsIiRmMjYiLCIkZjI4IiwiJGYzMCIKKyAgICAgICAgIi5zZXQgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDApCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDExXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wM10sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDRdLCAlW3NyY10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXA2XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGxoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDExXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXA3XSwgJVtkc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wN10sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDApCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNsbGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMTFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDddLCAlW2RzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGxoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDExXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXA3XSwgJVtkc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5zZXQgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLCAgICAgICAgICBbZnRtcDExXSI9JmYiKGZ0bXBbMTFdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbZHN0U3RyaWRlXSJyIigobWlwc19yZWcpZHN0U3RyaWRlKSwKKyAgICAgICAgICBbc3JjU3RyaWRlXSJyIigobWlwc19yZWcpc3JjU3RyaWRlKSwKKyAgICAgICAgICBbZmZfcHdfNV0iZiIoZmZfcHdfNSksICAgICAgICAgICAgW2ZmX3B3XzE2XSJmIihmZl9wd18xNikKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKIHN0YXRpYyB2b2lkIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpCiB7Ci0gICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjIsIDcoJVtzcmNCXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyLCAwKCVbc3JjQl0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNCwgNyglW3NyY0FdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjQsIDAoJVtzcmNBXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY2LCA3KCVbc3JjMF0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNiwgMCglW3NyYzBdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjgsIDcoJVtzcmMxXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY4LCAwKCVbc3JjMV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTAsIDcoJVtzcmMyXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEwLCAwKCVbc3JjMl0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYxMiwgNyglW3NyYzNdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTIsIDAoJVtzcmMzXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjE0LCA3KCVbc3JjNF0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYxNCwgMCglW3NyYzRdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTYsIDcoJVtzcmM1XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjE2LCAwKCVbc3JjNV0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYxOCwgNyglW3NyYzZdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTgsIDAoJVtzcmM2XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjIwLCA3KCVbc3JjN10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyMCwgMCglW3NyYzddKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMjIsIDcoJVtzcmM4XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjIyLCAwKCVbc3JjOF0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYyNCwgNyglW3NyYzldKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMjQsIDAoJVtzcmM5XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjI2LCA3KCVbc3JjMTBdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyNiwgMCglW3NyYzEwXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxLCAkZjIsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMiwgJGYyLCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjMsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGY0LCAkZjQsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNSwgJGY2LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY3LCAkZjgsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmOCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjksICRmMTAsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxMCwgJGYxMCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTEsICRmMTIsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMywgJGYxNCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTQsICRmMTQsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE1LCAkZjE2LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxNiwgJGYxNiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTcsICRmMTgsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjE4LCAkZjE4LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxOSwgJGYyMCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMjAsICRmMjAsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjIxLCAkZjIyLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYyMiwgJGYyMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMjMsICRmMjQsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjI0LCAkZjI0LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYyNSwgJGYyNiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMjYsICRmMjYsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjUsICRmNyAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzArc3JjMQotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjMgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGY0ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmOSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjEwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjEgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYyICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMTEgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjEyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYyLCAkZjI3LCAkZjI4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjIsIDAoJVtkc3QwXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjcsICRmOSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmOCwgJGYxMCAgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzErc3JjMgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjUgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGY2ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMTEgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjEyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjMgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGY0ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMTMgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjE0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGY0LCAkZjI3LCAkZjI4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDAoJVtkc3QxXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjksICRmMTEgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMTAsICRmMTIgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzIrc3JjMwotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjcgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGY4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMTMgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjE0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjUgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGY2ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMTUgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjE2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGY2LCAkZjI3LCAkZjI4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjYsIDAoJVtkc3QyXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjExLCAkZjEzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMTIsICRmMTQgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzMrc3JjNAotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYxMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMTUgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjE2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjcgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGY4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMTcgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjE4ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGY4LCAkZjI3LCAkZjI4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjgsIDAoJVtkc3QzXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjEzLCAkZjE1ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMTQsICRmMTYgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzQrc3JjNQotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjExICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYxMiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMTcgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjE4ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYxMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMTkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjIwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxMCwgJGYyNywgJGYyOCAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjEwLCAwKCVbZHN0NF0pICAgICAgICAgICAgICAgICAgXHJcbiIKKyAgICBpbnQgdyA9IDI7CisgICAgaW50IGggPSA4OworICAgIGRvdWJsZSBmdG1wWzEwXTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgREVDTEFSRV9WQVJfTE9XMzI7CiAKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjE1LCAkZjE3ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMTYsICRmMTggICAgICAgICAgICAgICAgXHJcbiIvL3NyYzUrc3JjNgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjEzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYxNCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMTkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjIwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjExICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYxMiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMjEgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjIyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxMiwgJGYyNywgJGYyOCAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjEyLCAwKCVbZHN0NV0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjE3LCAkZjE5ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMTgsICRmMjAgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzYrc3JjNwotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjE1ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMjEgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjIyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjEzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYxNCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMjMgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjI0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxNCwgJGYyNywgJGYyOCAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjE0LCAwKCVbZHN0Nl0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjE5LCAkZjIxICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjAsICRmMjIgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzcrc3JjOAotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjE3ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYxOCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMjMgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjI0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjE1ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMjUgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjI2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxNiwgJGYyNywgJGYyOCAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjE2LCAwKCVbZHN0N10pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOjpbZHN0MF0iciIoZHN0KSwgICAgICAgICAgICAgICBbZHN0MV0iciIoZHN0K2RzdFN0cmlkZSksCi0gICAgICAgICAgW2RzdDJdInIiKGRzdCsyKmRzdFN0cmlkZSksICAgW2RzdDNdInIiKGRzdCszKmRzdFN0cmlkZSksCi0gICAgICAgICAgW2RzdDRdInIiKGRzdCs0KmRzdFN0cmlkZSksICAgW2RzdDVdInIiKGRzdCs1KmRzdFN0cmlkZSksCi0gICAgICAgICAgW2RzdDZdInIiKGRzdCs2KmRzdFN0cmlkZSksICAgW2RzdDddInIiKGRzdCs3KmRzdFN0cmlkZSksCi0gICAgICAgICAgW3NyY0JdInIiKHNyYy0yKnNyY1N0cmlkZSksICAgW3NyY0FdInIiKHNyYy1zcmNTdHJpZGUpLAotICAgICAgICAgIFtzcmMwXSJyIihzcmMpLCAgICAgICAgICAgICAgIFtzcmMxXSJyIihzcmMrc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjMl0iciIoc3JjKzIqc3JjU3RyaWRlKSwgICBbc3JjM10iciIoc3JjKzMqc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjNF0iciIoc3JjKzQqc3JjU3RyaWRlKSwgICBbc3JjNV0iciIoc3JjKzUqc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjNl0iciIoc3JjKzYqc3JjU3RyaWRlKSwgICBbc3JjN10iciIoc3JjKzcqc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjOF0iciIoc3JjKzgqc3JjU3RyaWRlKSwgICBbc3JjOV0iciIoc3JjKzkqc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjMTBdInIiKHNyYysxMCpzcmNTdHJpZGUpLCBbZmZfcHdfNF0iZiIoZmZfcHdfNCksCi0gICAgICAgICAgW2ZmX3B3XzVdImYiKGZmX3B3XzUpLCAgICAgICAgW2ZmX3B3XzE2XSJmIihmZl9wd18xNikKLSAgICAgICAgOiAiJGYwIiwiJGYxIiwiJGYyIiwiJGYzIiwiJGY0IiwiJGY1IiwiJGY2IiwiJGY3IiwiJGY4IiwiJGY5IiwiJGYxMCIsCi0gICAgICAgICAgIiRmMTEiLCIkZjEyIiwiJGYxMyIsIiRmMTQiLCIkZjE1IiwiJGYxNiIsIiRmMTciLCIkZjE4IiwiJGYxOSIsCi0gICAgICAgICAgIiRmMjAiLCIkZjIxIiwiJGYyMiIsIiRmMjMiLCIkZjI0IiwiJGYyNSIsIiRmMjYiLCIkZjI3IiwiJGYyOCIKLSAgICApOworICAgIHNyYyAtPSAyICogc3JjU3RyaWRlOworCisgICAgd2hpbGUgKHctLSkgeworICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgICAgICIuc2V0ICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDRdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDNdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdICwgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDRdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDVdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJibmUgICAgICAgICVbaF0sICAgICAgIDB4MTAsICAgICAgICAgICAyZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLCAgICAgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLAorICAgICAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICAgICAgOiBbZHN0U3RyaWRlXSJyIigobWlwc19yZWcpZHN0U3RyaWRlKSwKKyAgICAgICAgICAgICAgW3NyY1N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY1N0cmlkZSksCisgICAgICAgICAgICAgIFtmZl9wd181XSJmIihmZl9wd181KSwgICAgICAgIFtmZl9wd18xNl0iZiIoZmZfcHdfMTYpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgc3JjICs9IDQgLSAoaCArIDUpICogc3JjU3RyaWRlOworICAgICAgICBkc3QgKz0gNCAtIGggKiBkc3RTdHJpZGU7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTkzMywzNjUgKzgwMyw0NDUgQEAKIHN0YXRpYyB2b2lkIGF2Z19oMjY0X3FwZWw0X3ZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpCiB7CisgICAgZG91YmxlIGZ0bXBbMTBdOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKworICAgIHNyYyAtPSAyICogc3JjU3RyaWRlOworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjIsIDMoJVtzcmNCXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYyLCAwKCVbc3JjQl0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmNCwgMyglW3NyY0FdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjQsIDAoJVtzcmNBXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGY2LCAzKCVbc3JjMF0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNiwgMCglW3NyYzBdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjgsIDMoJVtzcmMxXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGY4LCAwKCVbc3JjMV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMTAsIDMoJVtzcmMyXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjEwLCAwKCVbc3JjMl0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGYxMiwgMyglW3NyYzNdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTIsIDAoJVtzcmMzXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjE0LCAzKCVbc3JjNF0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYxNCwgMCglW3NyYzRdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMTYsIDMoJVtzcmM1XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjE2LCAwKCVbc3JjNV0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGYxOCwgMyglW3NyYzZdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTgsIDAoJVtzcmM2XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEwLCAkZjEwLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTQsICRmMTQsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE2LCAkZjE2LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxOCwgJGYxOCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjAsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjIwLCAkZjIwLCAlW2ZmX3B3XzIwXSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyMiwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjIsICRmMjIsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI0LCAkZjIwLCAkZjIyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNCwgJGYyNCwgJGYyICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjQsICRmMjQsICRmMTIgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjIwLCAkZjgsICRmMTAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyMCwgJGYyMCwgJVtmZl9wd18yMF0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjIsICRmNiwgJGYxMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjIyLCAkZjIyLCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyNiwgJGYyMCwgJGYyMiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjYsICRmMjYsICRmNCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI2LCAkZjI2LCAkZjE0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyMCwgJGYxMCwgJGYxMiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjAsICRmMjAsICVbZmZfcHdfMjBdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjIyLCAkZjgsICRmMTQgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyMiwgJGYyMiwgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjgsICRmMjAsICRmMjIgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjYgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjAsICRmMTIsICRmMTQgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjIwLCAkZjIwLCAlW2ZmX3B3XzIwXSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyMiwgJGYxMCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjIsICRmMjIsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjMwLCAkZjIwLCAkZjIyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYzMCwgJGYzMCwgJGY4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMzAsICRmMzAsICRmMTggICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI0LCAkZjI0LCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNiwgJGYyNiwgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjMwLCAkZjMwLCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI0LCAkZjI0LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyNiwgJGYyNiwgJVtmZl9wd181XSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjMwLCAkZjMwLCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNCwgJGYyNCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjYsICRmMjYsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjI4LCAkZjI4LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYzMCwgJGYzMCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImx3YzEgJGYyLCAwKCVbZHN0MF0pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmNCwgMCglW2RzdDFdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjYsIDAoJVtkc3QyXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImx3YzEgJGY4LCAwKCVbZHN0M10pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjI0LCAkZjIsICRmMjQgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGYyNiwgJGY0LCAkZjI2ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhdmdiICRmMjgsICRmNiwgJGYyOCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjMwLCAkZjgsICRmMzAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjI0LCAwKCVbZHN0MF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInN3YzEgJGYyNiwgMCglW2RzdDFdKSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzd2MxICRmMjgsIDAoJVtkc3QyXSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic3djMSAkZjMwLCAwKCVbZHN0M10pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOjpbZHN0MF0iciIoZHN0KSwgICAgICAgICAgICAgICBbZHN0MV0iciIoZHN0K2RzdFN0cmlkZSksCi0gICAgICAgICAgW2RzdDJdInIiKGRzdCsyKmRzdFN0cmlkZSksICAgW2RzdDNdInIiKGRzdCszKmRzdFN0cmlkZSksCi0gICAgICAgICAgW3NyY0JdInIiKHNyYy0yKnNyY1N0cmlkZSksICAgW3NyY0FdInIiKHNyYy1zcmNTdHJpZGUpLAotICAgICAgICAgIFtzcmMwXSJyIihzcmMpLCAgICAgICAgICAgICAgIFtzcmMxXSJyIihzcmMrc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjMl0iciIoc3JjKzIqc3JjU3RyaWRlKSwgICBbc3JjM10iciIoc3JjKzMqc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjNF0iciIoc3JjKzQqc3JjU3RyaWRlKSwgICBbc3JjNV0iciIoc3JjKzUqc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjNl0iciIoc3JjKzYqc3JjU3RyaWRlKSwgICBbZmZfcHdfMjBdImYiKGZmX3B3XzIwKSwKKyAgICAgICAgIi5zZXQgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDNdLCAlW3NyY10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVtkc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCkKKyAgICAgICAgOiBbZHN0U3RyaWRlXSJyIigobWlwc19yZWcpZHN0U3RyaWRlKSwKKyAgICAgICAgICBbc3JjU3RyaWRlXSJyIigobWlwc19yZWcpc3JjU3RyaWRlKSwKICAgICAgICAgICBbZmZfcHdfNV0iZiIoZmZfcHdfNSksICAgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KQotICAgICAgICA6ICIkZjAiLCIkZjIiLCIkZjQiLCIkZjYiLCIkZjgiLCIkZjEwIiwiJGYxMiIsIiRmMTQiLCIkZjE2IiwiJGYxOCIsCi0gICAgICAgICAgIiRmMjAiLCIkZjIyIiwiJGYyNCIsIiRmMjYiLCIkZjI4IiwiJGYzMCIKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CiAKIHN0YXRpYyB2b2lkIGF2Z19oMjY0X3FwZWw4X3ZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpCiB7Ci0gICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjIsIDcoJVtzcmNCXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyLCAwKCVbc3JjQl0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNCwgNyglW3NyY0FdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjQsIDAoJVtzcmNBXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY2LCA3KCVbc3JjMF0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNiwgMCglW3NyYzBdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjgsIDcoJVtzcmMxXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY4LCAwKCVbc3JjMV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTAsIDcoJVtzcmMyXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEwLCAwKCVbc3JjMl0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYxMiwgNyglW3NyYzNdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTIsIDAoJVtzcmMzXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjE0LCA3KCVbc3JjNF0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYxNCwgMCglW3NyYzRdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTYsIDcoJVtzcmM1XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjE2LCAwKCVbc3JjNV0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYxOCwgNyglW3NyYzZdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTgsIDAoJVtzcmM2XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjIwLCA3KCVbc3JjN10pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyMCwgMCglW3NyYzddKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMjIsIDcoJVtzcmM4XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjIyLCAwKCVbc3JjOF0pICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYyNCwgNyglW3NyYzldKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMjQsIDAoJVtzcmM5XSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjI2LCA3KCVbc3JjMTBdKSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyNiwgMCglW3NyYzEwXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxLCAkZjIsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMiwgJGYyLCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjMsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGY0LCAkZjQsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNSwgJGY2LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY3LCAkZjgsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmOCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjksICRmMTAsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxMCwgJGYxMCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTEsICRmMTIsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMywgJGYxNCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTQsICRmMTQsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjE1LCAkZjE2LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxNiwgJGYxNiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTcsICRmMTgsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjE4LCAkZjE4LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxOSwgJGYyMCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMjAsICRmMjAsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjIxLCAkZjIyLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYyMiwgJGYyMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMjMsICRmMjQsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjI0LCAkZjI0LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYyNSwgJGYyNiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMjYsICRmMjYsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjUsICRmNyAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzArc3JjMQotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjMgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGY0ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmOSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjEwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjEgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYyICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMTEgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjEyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYyLCAkZjI3LCAkZjI4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjI4LCAwKCVbZHN0MF0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhdmdiICRmMiwgJGYyLCAkZjI4ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMiwgMCglW2RzdDBdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmNywgJGY5ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzRdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGY4LCAkZjEwICAgICAgICAgICAgICAgICBcclxuIi8vc3JjMStzcmMyCi0gICAgICAgICJwbXVsbGggJGYyOCwgJGYyOCwgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmNSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjYgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyNywgJGYyNywgJGYxMSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjgsICRmMjgsICRmMTIgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyOCwgJGYyOCwgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMyAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjQgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJGYxMyAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICRmMTQgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjI3LCAkZjI3LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyOCwgJGYyOCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjQsICRmMjcsICRmMjggICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjgsIDAoJVtkc3QxXSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGY0LCAkZjQsICRmMjggICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGY0LCAwKCVbZHN0MV0pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGY5LCAkZjExICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjcsICRmMjcsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjEwLCAkZjEyICAgICAgICAgICAgICAgIFxyXG4iLy9zcmMyK3NyYzMKLSAgICAgICAgInBtdWxsaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzRdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyNywgJGYyNywgJGY3ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjgsICRmMjgsICRmOCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjEzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYxNCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJGY1ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICRmNiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjE1ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyOCwgJGYyOCwgJVtmZl9wd181XSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjcsICRmMjcsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjI4LCAkZjI4LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmNiwgJGYyNywgJGYyOCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYyOCwgMCglW2RzdDJdKSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjYsICRmNiwgJGYyOCAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjYsIDAoJVtkc3QyXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjExLCAkZjEzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMTIsICRmMTQgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzMrc3JjNAotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYxMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMTUgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjE2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjcgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGY4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMTcgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjE4ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGY4LCAkZjI3LCAkZjI4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjI4LCAwKCVbZHN0M10pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhdmdiICRmOCwgJGY4LCAkZjI4ICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmOCwgMCglW2RzdDNdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMTMsICRmMTUgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzRdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYxNCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIi8vc3JjNCtzcmM1Ci0gICAgICAgICJwbXVsbGggJGYyOCwgJGYyOCwgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMTEgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjEyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyNywgJGYyNywgJGYxNyAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjgsICRmMjgsICRmMTggICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyOCwgJGYyOCwgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmOSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjEwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJGYxOSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICRmMjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjI3LCAkZjI3LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyOCwgJGYyOCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjEwLCAkZjI3LCAkZjI4ICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjgsIDAoJVtkc3Q0XSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGYxMCwgJGYxMCwgJGYyOCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxMCwgMCglW2RzdDRdKSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYxNSwgJGYxNyAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjcsICRmMjcsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjE2LCAkZjE4ICAgICAgICAgICAgICAgIFxyXG4iLy9zcmM1K3NyYzYKLSAgICAgICAgInBtdWxsaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzRdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyNywgJGYyNywgJGYxMyAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjgsICRmMjgsICRmMTQgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjE5ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYyMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJGYxMSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICRmMTIgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjIxICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYyMiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyOCwgJGYyOCwgJVtmZl9wd181XSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjcsICRmMjcsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjI4LCAkZjI4LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbHdkICRmMTIsICRmMjcsICRmMjggICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYyOCwgMCglW2RzdDVdKSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYXZnYiAkZjEyLCAkZjEyLCAkZjI4ICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjEyLCAwKCVbZHN0NV0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjE3LCAkZjE5ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMTgsICRmMjAgICAgICAgICAgICAgICAgXHJcbiIvL3NyYzYrc3JjNwotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNF0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI3LCAkZjI3LCAkZjE1ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyOCwgJGYyOCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMjEgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjIyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAkZjEzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJGYxNCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMjMgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjI0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICVbZmZfcHdfMTZdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjcsICRmMjcsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjI4LCAkZjI4LCAlW2ZmX3B3XzVdICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyNywgJGYyNywgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmMjgsICRmMjgsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsd2QgJGYxNCwgJGYyNywgJGYyOCAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjI4LCAwKCVbZHN0Nl0pICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhdmdiICRmMTQsICRmMTQsICRmMjggICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTQsIDAoJVtkc3Q2XSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMTksICRmMjEgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzRdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyMCwgJGYyMiAgICAgICAgICAgICAgICBcclxuIi8vc3JjNytzcmM4Ci0gICAgICAgICJwbXVsbGggJGYyOCwgJGYyOCwgJVtmZl9wd180XSAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjcsICRmMjcsICRmMTcgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjI4LCAkZjI4LCAkZjE4ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYyNywgJGYyNywgJGYyMyAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMjgsICRmMjgsICRmMjQgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyOCwgJGYyOCwgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjcsICRmMjcsICRmMTUgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI4LCAkZjI4LCAkZjE2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyNywgJGYyNywgJGYyNSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMjgsICRmMjgsICRmMjYgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjI3LCAkZjI3LCAlW2ZmX3B3XzE2XSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYyOCwgJGYyOCwgJVtmZl9wd18xNl0gICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyNywgJGYyNywgJVtmZl9wd181XSAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMjgsICRmMjgsICVbZmZfcHdfNV0gICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjI3LCAkZjI3LCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGYyOCwgJGYyOCwgJGYwICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2x3ZCAkZjE2LCAkZjI3LCAkZjI4ICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMjgsIDAoJVtkc3Q3XSkgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGF2Z2IgJGYxNiwgJGYxNiwgJGYyOCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxNiwgMCglW2RzdDddKSAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W2RzdDBdInIiKGRzdCksICAgICAgICAgICAgICAgW2RzdDFdInIiKGRzdCtkc3RTdHJpZGUpLAotICAgICAgICAgIFtkc3QyXSJyIihkc3QrMipkc3RTdHJpZGUpLCAgIFtkc3QzXSJyIihkc3QrMypkc3RTdHJpZGUpLAotICAgICAgICAgIFtkc3Q0XSJyIihkc3QrNCpkc3RTdHJpZGUpLCAgIFtkc3Q1XSJyIihkc3QrNSpkc3RTdHJpZGUpLAotICAgICAgICAgIFtkc3Q2XSJyIihkc3QrNipkc3RTdHJpZGUpLCAgIFtkc3Q3XSJyIihkc3QrNypkc3RTdHJpZGUpLAotICAgICAgICAgIFtzcmNCXSJyIihzcmMtMipzcmNTdHJpZGUpLCAgIFtzcmNBXSJyIihzcmMtc3JjU3RyaWRlKSwKLSAgICAgICAgICBbc3JjMF0iciIoc3JjKSwgICAgICAgICAgICAgICBbc3JjMV0iciIoc3JjK3NyY1N0cmlkZSksCi0gICAgICAgICAgW3NyYzJdInIiKHNyYysyKnNyY1N0cmlkZSksICAgW3NyYzNdInIiKHNyYyszKnNyY1N0cmlkZSksCi0gICAgICAgICAgW3NyYzRdInIiKHNyYys0KnNyY1N0cmlkZSksICAgW3NyYzVdInIiKHNyYys1KnNyY1N0cmlkZSksCi0gICAgICAgICAgW3NyYzZdInIiKHNyYys2KnNyY1N0cmlkZSksICAgW3NyYzddInIiKHNyYys3KnNyY1N0cmlkZSksCi0gICAgICAgICAgW3NyYzhdInIiKHNyYys4KnNyY1N0cmlkZSksICAgW3NyYzldInIiKHNyYys5KnNyY1N0cmlkZSksCi0gICAgICAgICAgW3NyYzEwXSJyIihzcmMrMTAqc3JjU3RyaWRlKSwgW2ZmX3B3XzRdImYiKGZmX3B3XzQpLAotICAgICAgICAgIFtmZl9wd181XSJmIihmZl9wd181KSwgICAgICAgIFtmZl9wd18xNl0iZiIoZmZfcHdfMTYpCi0gICAgICAgIDogIiRmMCIsIiRmMSIsIiRmMiIsIiRmMyIsIiRmNCIsIiRmNSIsIiRmNiIsIiRmNyIsIiRmOCIsIiRmOSIsIiRmMTAiLAotICAgICAgICAgICIkZjExIiwiJGYxMiIsIiRmMTMiLCIkZjE0IiwiJGYxNSIsIiRmMTYiLCIkZjE3IiwiJGYxOCIsIiRmMTkiLAotICAgICAgICAgICIkZjIwIiwiJGYyMSIsIiRmMjIiLCIkZjIzIiwiJGYyNCIsIiRmMjUiLCIkZjI2IiwiJGYyNyIsIiRmMjgiCi0gICAgKTsKKyAgICBpbnQgdyA9IDI7CisgICAgaW50IGggPSA4OworICAgIGRvdWJsZSBmdG1wWzEwXTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgREVDTEFSRV9WQVJfTE9XMzI7CisKKyAgICBzcmMgLT0gMiAqIHNyY1N0cmlkZTsKKworICAgIHdoaWxlICh3LS0pIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIi5zZXQgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAieG9yICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wM10sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wNV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAyXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDNdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wNF0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDRdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXA1XSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wNV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgImJuZSAgICAgICAgJVtoXSwgICAgICAgMHgxMCwgICAgICAgICAgIDJmICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wM10sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDRdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wNV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDVdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU1dDMSglW2Z0bXA2XSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTFdDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLCAgICAgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLAorICAgICAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICAgICAgOiBbZHN0U3RyaWRlXSJyIigobWlwc19yZWcpZHN0U3RyaWRlKSwKKyAgICAgICAgICAgICAgW3NyY1N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY1N0cmlkZSksCisgICAgICAgICAgICAgIFtmZl9wd181XSJmIihmZl9wd181KSwgICAgICAgIFtmZl9wd18xNl0iZiIoZmZfcHdfMTYpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgc3JjICs9IDQgLSAoaCArIDUpICogc3JjU3RyaWRlOworICAgICAgICBkc3QgKz0gNCAtIGggKiBkc3RTdHJpZGU7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBhdmdfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTEzMDgsNTMgKzEyNTgsNjEgQEAKIHN0YXRpYyB2b2lkIHB1dF9oMjY0X3FwZWw0X2h2X2xvd3Bhc3NfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKQogeworICAgIElOSVRfQ0xJUAogICAgIGludCBpOwogICAgIGludDE2X3QgX3RtcFszNl07CiAgICAgaW50MTZfdCAqdG1wID0gX3RtcDsKKyAgICBkb3VibGUgZnRtcFsxMF07CisgICAgdWludDY0X3QgdG1wMDsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKwogICAgIHNyYyAtPSAyKnNyY1N0cmlkZTsKKwogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAieG9yICRmMCwgJGYwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkOCwgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjIsIDEoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYyLCAtMiglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmNCwgMiglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjQsIC0xKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGY2LCAzKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNiwgMCglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjgsIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGY4LCAxKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMTAsIDUoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjEwLCAyKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGYxMiwgNiglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTIsIDMoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMiwgJGYyLCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmOCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEwLCAkZjEwLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTQsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE2LCAkZjQsICRmMTAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxOCwgJGYyLCAkZjEyICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMTQsICRmMTQsICVbZmZfcHdfMjBdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjE2LCAkZjE2LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYxNCwgJGYxNCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTgsICRmMTQsICRmMTggICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxOCwgMCglW3RtcF0pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbdG1wXSwgJVt0bXBdLCAlW3RtcFN0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3NyY10sICVbc3JjXSwgJVtzcmNTdHJpZGVdICAgICAgXHJcbiIKLSAgICAgICAgImRhZGRpICQ4LCAkOCwgLTEgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibmV6ICQ4LCAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6IFt0bXBdIismciIodG1wKSxbc3JjXSIrJnIiKHNyYykKLSAgICAgICAgOiBbdG1wU3RyaWRlXSJyIig4KSxbc3JjU3RyaWRlXSJyIihzcmNTdHJpZGUpLAotICAgICAgICAgIFtmZl9wd18yMF0iZiIoZmZfcHdfMjApLFtmZl9wd181XSJmIihmZl9wd181KQotICAgICAgICA6ICIkOCIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsIiRmMTAiLCIkZjEyIiwiJGYxNCIsIiRmMTYiLCIkZjE4IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgLTB4MDIpCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAtMHgwMSkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDNdLCAlW3NyY10sICAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNF0sICVbc3JjXSwgIDB4MDEpCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAgMHgwMikKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDZdLCAlW3NyY10sICAweDAzKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wOF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDldLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmZl9wd18yMF0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA5XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wOV0sICVbdG1wXSwgMHgwMCkKKyAgICAgICAgImRhZGRpICAgICAgJVt0bXAwXSwgICAgJVt0bXAwXSwgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3RtcF0sICAgICAlW3RtcF0sICAgICAgICAgJVt0bXBTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVt0bXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcDApLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFt0bXBdIismciIodG1wKSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbdG1wU3RyaWRlXSJyIig4KSwKKyAgICAgICAgICBbc3JjU3RyaWRlXSJyIigobWlwc19yZWcpc3JjU3RyaWRlKSwKKyAgICAgICAgICBbZmZfcHdfMjBdImYiKGZmX3B3XzIwKSwgICAgICAgICAgW2ZmX3B3XzVdImYiKGZmX3B3XzUpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogCiAgICAgdG1wIC09IDI4OwogCi0gICAgZm9yKGk9MDsgaTw0OyBpKyspIHsKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKICAgICAgICAgY29uc3QgaW50MTZfdCB0bXBCPSB0bXBbLThdOwogICAgICAgICBjb25zdCBpbnQxNl90IHRtcEE9IHRtcFstNF07CiAgICAgICAgIGNvbnN0IGludDE2X3QgdG1wMD0gdG1wWyAwXTsKQEAgLTEzNzMsMTYxICsxMzMxLDU1MiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpCitzdGF0aWMgdm9pZCBwdXRfaDI2NF9xcGVsOG9yMTZfaHYxX2xvd3Bhc3NfbW1pKGludDE2X3QgKnRtcCwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgdG1wU3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlLCBpbnQgc2l6ZSkKIHsKLSAgICBpbnQxNl90IF90bXBbMTA0XTsKLSAgICBpbnQxNl90ICp0bXAgPSBfdG1wOwotICAgIGludCBpOwotICAgIHNyYyAtPSAyKnNyY1N0cmlkZTsKKyAgICBpbnQgdyA9IChzaXplICsgOCkgPj4gMjsKKyAgICBkb3VibGUgZnRtcFsxMV07CisgICAgdWludDY0X3QgdG1wMDsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKIAotICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAieG9yICRmMCwgJGYwLCAkZjAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRsaSAkOCwgMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjIsIDUoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyLCAtMiglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNCwgNiglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjQsIC0xKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY2LCA3KCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmNiwgMCglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjgsIDgoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY4LCAxKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTAsIDkoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEwLCAyKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYxMiwgMTAoJVtzcmNdKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMTIsIDMoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMSwgJGYyLCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjMsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY1LCAkZjYsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNywgJGY4LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjksICRmMTAsICRmMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYxMSwgJGYxMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMiwgJGYyLCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjQsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGY2LCAkZjYsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmOCwgJGY4LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjEwLCAkZjEwLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxMiwgJGYxMiwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTMsICRmNSwgJGY3ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE1LCAkZjMsICRmOSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE3LCAkZjEsICRmMTEgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxMywgJGYxMywgJVtmZl9wd18yMF0gICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMTUsICRmMTUsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjEzLCAkZjEzLCAkZjE1ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxNywgJGYxMywgJGYxNyAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTQsICRmNiwgJGY4ICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE2LCAkZjQsICRmMTAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxOCwgJGYyLCAkZjEyICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMTQsICRmMTQsICVbZmZfcHdfMjBdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjE2LCAkZjE2LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYxNCwgJGYxNCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTgsICRmMTQsICRmMTggICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYxNywgMCglW3RtcF0pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTgsIDgoJVt0bXBdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3RtcF0sICVbdG1wXSwgJVt0bXBTdHJpZGVdICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVtzcmNdLCAlW3NyY10sICVbc3JjU3RyaWRlXSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaSAkOCwgJDgsIC0xICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkOCwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbdG1wXSIrJnIiKHRtcCksW3NyY10iKyZyIihzcmMpCi0gICAgICAgIDogW3RtcFN0cmlkZV0iciIoMTYpLFtzcmNTdHJpZGVdInIiKHNyY1N0cmlkZSksCi0gICAgICAgICAgW2ZmX3B3XzIwXSJmIihmZl9wd18yMCksW2ZmX3B3XzVdImYiKGZmX3B3XzUpCi0gICAgICAgIDogIiQ4IiwiJGYwIiwiJGYxIiwiJGYyIiwiJGYzIiwiJGY0IiwiJGY1IiwiJGY2IiwiJGY3IiwiJGY4IiwiJGY5IiwKLSAgICAgICAgICAiJGYxMCIsIiRmMTEiLCIkZjEyIiwiJGYxMyIsIiRmMTQiLCIkZjE1IiwiJGYxNiIsIiRmMTciLCIkZjE4IgotICAgICk7CisgICAgc3JjIC09IDIgKiBzcmNTdHJpZGUgKyAyOwogCi0gICAgdG1wIC09IDg4OworICAgIHdoaWxlICh3LS0pIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMl0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3RtcF0sIDB4MDApCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVt0bXBdLCAweDMwKQorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbdG1wXSwgMHg2MCkKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3RtcF0sIDB4OTApCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVt0bXBdLCAweGMwKQorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDRdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbdG1wXSwgMHhmMCkKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3RtcF0sIDB4MTIwKQorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbdG1wXSwgMHgxNTApCisgICAgICAgICAgICAiYm5lICAgICAgICAlW3NpemVdLCAgICAweDEwLCAgICAgICAgICAgMmYgICAgICAgICAgICAgICAgICBcblx0IgogCi0gICAgZm9yKGk9MDsgaTw4OyBpKyspIHsKLSAgICAgICAgY29uc3QgaW50IHRtcEI9IHRtcFstMTZdOwotICAgICAgICBjb25zdCBpbnQgdG1wQT0gdG1wWyAtOF07Ci0gICAgICAgIGNvbnN0IGludCB0bXAwPSB0bXBbICAwXTsKLSAgICAgICAgY29uc3QgaW50IHRtcDE9IHRtcFsgIDhdOwotICAgICAgICBjb25zdCBpbnQgdG1wMj0gdG1wWyAxNl07Ci0gICAgICAgIGNvbnN0IGludCB0bXAzPSB0bXBbIDI0XTsKLSAgICAgICAgY29uc3QgaW50IHRtcDQ9IHRtcFsgMzJdOwotICAgICAgICBjb25zdCBpbnQgdG1wNT0gdG1wWyA0MF07Ci0gICAgICAgIGNvbnN0IGludCB0bXA2PSB0bXBbIDQ4XTsKLSAgICAgICAgY29uc3QgaW50IHRtcDc9IHRtcFsgNTZdOwotICAgICAgICBjb25zdCBpbnQgdG1wOD0gdG1wWyA2NF07Ci0gICAgICAgIGNvbnN0IGludCB0bXA5PSB0bXBbIDcyXTsKLSAgICAgICAgY29uc3QgaW50IHRtcDEwPXRtcFsgODBdOwotICAgICAgICBvcDJfcHV0KGRzdFswKmRzdFN0cmlkZV0sICh0bXAwK3RtcDEpKjIwIC0gKHRtcEErdG1wMikqNSArICh0bXBCK3RtcDMpKTsKLSAgICAgICAgb3AyX3B1dChkc3RbMSpkc3RTdHJpZGVdLCAodG1wMSt0bXAyKSoyMCAtICh0bXAwK3RtcDMpKjUgKyAodG1wQSt0bXA0KSk7Ci0gICAgICAgIG9wMl9wdXQoZHN0WzIqZHN0U3RyaWRlXSwgKHRtcDIrdG1wMykqMjAgLSAodG1wMSt0bXA0KSo1ICsgKHRtcDArdG1wNSkpOwotICAgICAgICBvcDJfcHV0KGRzdFszKmRzdFN0cmlkZV0sICh0bXAzK3RtcDQpKjIwIC0gKHRtcDIrdG1wNSkqNSArICh0bXAxK3RtcDYpKTsKLSAgICAgICAgb3AyX3B1dChkc3RbNCpkc3RTdHJpZGVdLCAodG1wNCt0bXA1KSoyMCAtICh0bXAzK3RtcDYpKjUgKyAodG1wMit0bXA3KSk7Ci0gICAgICAgIG9wMl9wdXQoZHN0WzUqZHN0U3RyaWRlXSwgKHRtcDUrdG1wNikqMjAgLSAodG1wNCt0bXA3KSo1ICsgKHRtcDMrdG1wOCkpOwotICAgICAgICBvcDJfcHV0KGRzdFs2KmRzdFN0cmlkZV0sICh0bXA2K3RtcDcpKjIwIC0gKHRtcDUrdG1wOCkqNSArICh0bXA0K3RtcDkpKTsKLSAgICAgICAgb3AyX3B1dChkc3RbNypkc3RTdHJpZGVdLCAodG1wNyt0bXA4KSoyMCAtICh0bXA2K3RtcDkpKjUgKyAodG1wNSt0bXAxMCkpOwotICAgICAgICBkc3QrKzsKLSAgICAgICAgdG1wKys7CisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVt0bXBdLCAweDE4MCkKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3RtcF0sIDB4MWIwKQorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDNdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbdG1wXSwgMHgxZTApCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNF0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVt0bXBdLCAweDIxMCkKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA1XSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3RtcF0sIDB4MjQwKQorICAgICAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDBdLCAlW3NyY10sIDB4MDApCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDEwXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY1N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbdG1wXSwgMHgyNzApCisgICAgICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNsbGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVt0bXBdLCAweDJhMCkKKyAgICAgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNTdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW3RtcF0sIDB4MmQwKQorICAgICAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLAorICAgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXAwKSwKKyAgICAgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICAgICAgOiBbdG1wXSJyIih0bXApLCAgICAgICAgICAgICAgICBbc2l6ZV0iciIoc2l6ZSksCisgICAgICAgICAgICAgIFtzcmNTdHJpZGVdInIiKChtaXBzX3JlZylzcmNTdHJpZGUpLAorICAgICAgICAgICAgICBbZmZfcHdfNV0iZiIoZmZfcHdfNSksICAgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KQorICAgICAgICAgICAgOiAibWVtb3J5IgorICAgICAgICApOworCisgICAgICAgIHRtcCArPSA0OworICAgICAgICBzcmMgKz0gNCAtIChzaXplICsgNSkgKiBzcmNTdHJpZGU7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBwdXRfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpCitzdGF0aWMgdm9pZCBwdXRfaDI2NF9xcGVsOG9yMTZfaHYyX2xvd3Bhc3NfbW1pKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgaW50MTZfdCAqdG1wLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3QgdG1wU3RyaWRlLCBpbnQgc2l6ZSkKIHsKLSAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShkc3QsIHNyYywgZHN0U3RyaWRlLCBzcmNTdHJpZGUpOwotICAgIHB1dF9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpOwotICAgIHNyYyArPSA4KnNyY1N0cmlkZTsKLSAgICBkc3QgKz0gOCpkc3RTdHJpZGU7Ci0gICAgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkoZHN0LCBzcmMsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTsKLSAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTsKKyAgICBpbnQgdyA9IHNpemUgPj4gNDsKKyAgICBkb3VibGUgZnRtcFsxMF07CisgICAgdWludDY0X3QgdG1wMDsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIGRvIHsKKyAgICAgICAgaW50IGggPSBzaXplOworCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDhdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVt0bXBdLCAweDAwKQorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbdG1wXSwgMHgwOCkKKyAgICAgICAgICAgIE1NSV9MREMxKCVbZnRtcDZdLCAlW3RtcF0sIDB4MTApCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbdG1wXSwgMHgwMikKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXA0XSwgJVt0bXBdLCAweDBhKQorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDVdLCAlW3RtcF0sIDB4MTIpCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3RtcF0sIDB4MDQpCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNl0sICVbdG1wXSwgMHgwNikKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXA1XSwgJVt0bXBdLCAweDBjKQorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDddLCAlW3RtcF0sIDB4MGUpCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSAsICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGRpICAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgUFRSX0FERElVICAiJVt0bXBdLCAgICAgJVt0bXBdLCAgICAgICAgIDB4MzAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wMCksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBbdG1wXSIrJnIiKHRtcCksICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksCisgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgICAgICA6IFtkc3RTdHJpZGVdInIiKChtaXBzX3JlZylkc3RTdHJpZGUpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgdG1wICs9IDggLSBzaXplICogMjQ7CisgICAgICAgIGRzdCArPSA4IC0gc2l6ZSAqIGRzdFN0cmlkZTsKKyAgICB9IHdoaWxlICh3LS0pOworfQorCitzdGF0aWMgdm9pZCBwdXRfaDI2NF9xcGVsOG9yMTZfaHZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBpbnQxNl90ICp0bXAsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHRtcFN0cmlkZSwKKyAgICAgICAgcHRyZGlmZl90IHNyY1N0cmlkZSwgaW50IHNpemUpCit7CisgICAgcHV0X2gyNjRfcXBlbDhvcjE2X2h2MV9sb3dwYXNzX21taSh0bXAsIHNyYywgdG1wU3RyaWRlLCBzcmNTdHJpZGUsIHNpemUpOworICAgIHB1dF9oMjY0X3FwZWw4b3IxNl9odjJfbG93cGFzc19tbWkoZHN0LCB0bXAsIGRzdFN0cmlkZSwgdG1wU3RyaWRlLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBpbnQxNl90ICp0bXAsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHRtcFN0cmlkZSwKKyAgICAgICAgcHRyZGlmZl90IHNyY1N0cmlkZSkKK3sKKyAgICBwdXRfaDI2NF9xcGVsOG9yMTZfaHZfbG93cGFzc19tbWkoZHN0LCB0bXAsIHNyYywgZHN0U3RyaWRlLCB0bXBTdHJpZGUsCisgICAgICAgICAgICBzcmNTdHJpZGUsIDgpOworfQorCitzdGF0aWMgdm9pZCBwdXRfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBpbnQxNl90ICp0bXAsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHRtcFN0cmlkZSwKKyAgICAgICAgcHRyZGlmZl90IHNyY1N0cmlkZSkKK3sKKyAgICBwdXRfaDI2NF9xcGVsOG9yMTZfaHZfbG93cGFzc19tbWkoZHN0LCB0bXAsIHNyYywgZHN0U3RyaWRlLCB0bXBTdHJpZGUsCisgICAgICAgICAgICBzcmNTdHJpZGUsIDE2KTsKK30KKworc3RhdGljIHZvaWQgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX2wyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHNyYzJTdHJpZGUpCit7CisgICAgaW50IGggPSA4OworICAgIGRvdWJsZSBmdG1wWzldOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW3NyY10sIDB4MDEpCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNF0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNsbGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW3NyY10sIC0weDAxKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNV0sICVbc3JjXSwgIDB4MDIpCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDRdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbc3JjXSwgLTB4MDIpCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA2XSwgJVtzcmNdLCAweDA3KQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfMTZdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNV0sICVbc3JjMl0sICAweDAwKQorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMl0sICAgICVbc3JjMl0sICAgICAgICAlW3NyYzJTdHJpZGVdICAgICAgICAgICBcblx0IgorICAgICAgICAiYmd0eiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtzcmNdIismciIoc3JjKSwgICAgICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksCisgICAgICAgICAgW3NyYzJdIismciIoc3JjMiksICAgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgIDogW3NyYzJTdHJpZGVdInIiKChtaXBzX3JlZylzcmMyU3RyaWRlKSwKKyAgICAgICAgICBbZHN0U3RyaWRlXSJyIigobWlwc19yZWcpZHN0U3RyaWRlKSwKKyAgICAgICAgICBbZmZfcHdfNV0iZiIoZmZfcHdfNSksICAgICAgICAgICAgW2ZmX3B3XzE2XSJmIihmZl9wd18xNikKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9waXhlbHM4X2wyX3NoaWZ0NV9tbWkodWludDhfdCAqZHN0LCBpbnQxNl90ICpzcmMxNiwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjOCwgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHNyYzhTdHJpZGUsIGludCBoKQoreworICAgIGRvdWJsZSBmdG1wWzddOworICAgIHVpbnQ2NF90IHRtcDA7CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisgICAgREVDTEFSRV9WQVJfQUREUlQ7CisKKyAgICBkbyB7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVtzcmMxNl0sIDB4MDApCisgICAgICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW3NyYzE2XSwgMHgwOCkKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtzcmMxNl0sIDB4MzApCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wM10sICVbc3JjMTZdLCAweDM4KQorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wNV0sICVbc3JjOF0sIDB4MDApCisgICAgICAgICAgICBNTUlfTERYQzEoJVtmdG1wNF0sICVbc3JjOF0sICVbc3JjOFN0cmlkZV0sIDB4MDApCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICBNTUlfU0RYQzEoJVtmdG1wMl0sICVbZHN0XSwgJVtkc3RTdHJpZGVdLCAweDAwKQorICAgICAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wMCkKKyAgICAgICAgICAgIDogW3NyYzhdInIiKHNyYzgpLCAgICAgICAgICAgICAgW3NyYzE2XSJyIihzcmMxNiksCisgICAgICAgICAgICAgIFtkc3RdInIiKGRzdCksCisgICAgICAgICAgICAgIFtzcmM4U3RyaWRlXSJyIigobWlwc19yZWcpc3JjOFN0cmlkZSksCisgICAgICAgICAgICAgIFtkc3RTdHJpZGVdInIiKChtaXBzX3JlZylkc3RTdHJpZGUpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgc3JjOCAgKz0gMiAqIHNyYzhTdHJpZGU7CisgICAgICAgIHNyYzE2ICs9IDQ4OworICAgICAgICBkc3QgICArPSAyICogZHN0U3RyaWRlOworICAgIH0gd2hpbGUgKGggLT0gMik7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjMlN0cmlkZSkKK3sKKyAgICBwdXRfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbW1pKGRzdCwgc3JjLCBzcmMyLCBkc3RTdHJpZGUsIHNyYzJTdHJpZGUpOworICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9tbWkoZHN0ICsgOCwgc3JjICsgOCwgc3JjMiArIDgsIGRzdFN0cmlkZSwKKyAgICAgICAgICAgIHNyYzJTdHJpZGUpOworCisgICAgc3JjICs9IDggKiBkc3RTdHJpZGU7CisgICAgZHN0ICs9IDggKiBkc3RTdHJpZGU7CisgICAgc3JjMiArPSA4ICogc3JjMlN0cmlkZTsKKworICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9tbWkoZHN0LCBzcmMsIHNyYzIsIGRzdFN0cmlkZSwgc3JjMlN0cmlkZSk7CisgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX2wyX21taShkc3QgKyA4LCBzcmMgKyA4LCBzcmMyICsgOCwgZHN0U3RyaWRlLAorICAgICAgICAgICAgc3JjMlN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9waXhlbHMxNl9sMl9zaGlmdDVfbW1pKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqc3JjMTYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzgsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmM4U3RyaWRlLCBpbnQgaCkKK3sKKyAgICBwdXRfcGl4ZWxzOF9sMl9zaGlmdDVfbW1pKGRzdCwgc3JjMTYsIHNyYzgsIGRzdFN0cmlkZSwgc3JjOFN0cmlkZSwgaCk7CisgICAgcHV0X3BpeGVsczhfbDJfc2hpZnQ1X21taShkc3QgKyA4LCBzcmMxNiArIDgsIHNyYzggKyA4LCBkc3RTdHJpZGUsCisgICAgICAgICAgICBzcmM4U3RyaWRlLCBoKTsKIH0KIAogc3RhdGljIHZvaWQgYXZnX2gyNjRfcXBlbDRfaHZfbG93cGFzc19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpCiB7CisgICAgSU5JVF9DTElQCiAgICAgaW50IGk7CiAgICAgaW50MTZfdCBfdG1wWzM2XTsKICAgICBpbnQxNl90ICp0bXAgPSBfdG1wOworICAgIGRvdWJsZSBmdG1wWzEwXTsKKyAgICB1aW50NjRfdCB0bXAwOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworCiAgICAgc3JjIC09IDIqc3JjU3RyaWRlOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGxpICQ4LCA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmMiwgMSglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjIsIC0yKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGY0LCAyKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmNCwgLTEoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjYsIDMoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGY2LCAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3bGMxICRmOCwgNCglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd3JjMSAkZjgsIDEoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdsYzEgJGYxMCwgNSglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2x3cmMxICRmMTAsIDIoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3Nsd2xjMSAkZjEyLCA2KCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbHdyYzEgJGYxMiwgMyglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYyLCAkZjIsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGY0LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY4LCAkZjgsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTAsICRmMTAsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEyLCAkZjEyLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxNCwgJGY2LCAkZjggICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTYsICRmNCwgJGYxMCAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE4LCAkZjIsICRmMTIgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxNCwgJGYxNCwgJVtmZl9wd18yMF0gICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMTYsICRmMTYsICVbZmZfcHdfNV0gICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJzaCAkZjE0LCAkZjE0LCAkZjE2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxOCwgJGYxNCwgJGYxOCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjE4LCAwKCVbdG1wXSkgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVt0bXBdLCAlW3RtcF0sICVbdG1wU3RyaWRlXSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkICVbc3JjXSwgJVtzcmNdLCAlW3NyY1N0cmlkZV0gICAgICBcclxuIgotICAgICAgICAiZGFkZGkgJDgsICQ4LCAtMSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJuZXogJDgsIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW3RtcF0iKyZyIih0bXApLFtzcmNdIismciIoc3JjKQotICAgICAgICA6IFt0bXBTdHJpZGVdInIiKDgpLFtzcmNTdHJpZGVdInIiKHNyY1N0cmlkZSksCi0gICAgICAgICAgW2ZmX3B3XzIwXSJmIihmZl9wd18yMCksW2ZmX3B3XzVdImYiKGZmX3B3XzUpCi0gICAgICAgIDogIiQ4IiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IiwiJGYxNiIsIiRmMTgiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgJVtzcmNdLCAtMHgwMikKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW3NyY10sIC0weDAxKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbc3JjXSwgIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA0XSwgJVtzcmNdLCAgMHgwMSkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDVdLCAlW3NyY10sICAweDAyKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNl0sICVbc3JjXSwgIDB4MDMpCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDddLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wOV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2ZmX3B3XzIwXSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmZl9wd181XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDldLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA5XSwgJVt0bXBdLCAweDAwKQorICAgICAgICAiZGFkZGkgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3JjU3RyaWRlXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbdG1wXSwgICAgICVbdG1wXSwgICAgICAgICAlW3RtcFN0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wMCksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgW3RtcF0iKyZyIih0bXApLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFt0bXBTdHJpZGVdInIiKDgpLAorICAgICAgICAgIFtzcmNTdHJpZGVdInIiKChtaXBzX3JlZylzcmNTdHJpZGUpLAorICAgICAgICAgIFtmZl9wd18yMF0iZiIoZmZfcHdfMjApLCAgICAgICAgICBbZmZfcHdfNV0iZiIoZmZfcHdfNSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiAKICAgICB0bXAgLT0gMjg7CiAKLSAgICBmb3IoaT0wOyBpPDQ7IGkrKykKLSAgICB7CisgICAgZm9yIChpPTA7IGk8NDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IGludDE2X3QgdG1wQj0gdG1wWy04XTsKICAgICAgICAgY29uc3QgaW50MTZfdCB0bXBBPSB0bXBbLTRdOwogICAgICAgICBjb25zdCBpbnQxNl90IHRtcDA9IHRtcFsgMF07CkBAIC0xNTQ2LDExNCArMTg5NSwyNjIgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Z19oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKQorc3RhdGljIHZvaWQgYXZnX2gyNjRfcXBlbDhvcjE2X2h2Ml9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsCisgICAgICAgIGludDE2X3QgKnRtcCwgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHRtcFN0cmlkZSwgaW50IHNpemUpCiB7Ci0gICAgaW50MTZfdCBfdG1wWzEwNF07Ci0gICAgaW50MTZfdCAqdG1wID0gX3RtcDsKLSAgICBpbnQgaTsKLSAgICBzcmMgLT0gMipzcmNTdHJpZGU7CisgICAgaW50IHcgPSBzaXplID4+IDQ7CisgICAgZG91YmxlIGZ0bXBbMTFdOworICAgIHVpbnQ2NF90IHRtcDA7CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CiAKLSAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbGkgJDgsIDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYyLCA1KCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmMiwgLTIoJVtzcmNdKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjQsIDYoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGY0LCAtMSglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmNiwgNyglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjYsIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGY4LCA4KCVbc3JjXSkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkcmMxICRmOCwgMSglW3NyY10pICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZGxjMSAkZjEwLCA5KCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYxMCwgMiglW3NyY10pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMTIsIDEwKCVbc3JjXSkgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjEyLCAzKCVbc3JjXSkgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjEsICRmMiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGYzLCAkZjQsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmNSwgJGY2LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2xiaCAkZjcsICRmOCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsYmggJGY5LCAkZjEwLCAkZjAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNrbGJoICRmMTEsICRmMTIsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjIsICRmMiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGY0LCAkZjQsICRmMCAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmNiwgJGY2LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInB1bnBja2hiaCAkZjgsICRmOCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toYmggJGYxMCwgJGYxMCwgJGYwICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHVucGNraGJoICRmMTIsICRmMTIsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjEzLCAkZjUsICRmNyAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxNSwgJGYzLCAkZjkgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxNywgJGYxLCAkZjExICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMTMsICRmMTMsICVbZmZfcHdfMjBdICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjE1LCAkZjE1LCAlW2ZmX3B3XzVdICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3Vic2ggJGYxMywgJGYxMywgJGYxNSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTcsICRmMTMsICRmMTcgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE0LCAkZjYsICRmOCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkc2ggJGYxNiwgJGY0LCAkZjEwICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZHNoICRmMTgsICRmMiwgJGYxMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjE0LCAkZjE0LCAlW2ZmX3B3XzIwXSAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxNiwgJGYxNiwgJVtmZl9wd181XSAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YnNoICRmMTQsICRmMTQsICRmMTYgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRzaCAkZjE4LCAkZjE0LCAkZjE4ICAgICAgICAgICAgICAgIFxyXG4iCisgICAgZG8geworICAgICAgICBpbnQgaCA9IHNpemU7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVt0bXBdLCAweDAwKQorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbdG1wXSwgMHgwOCkKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVt0bXBdLCAweDAyKQorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDRdLCAlW3RtcF0sIDB4MGEpCisgICAgICAgICAgICBNTUlfTERDMSglW2Z0bXA3XSwgJVt0bXBdLCAweDEwKQorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDhdLCAlW3RtcF0sIDB4MTIpCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3RtcF0sIDB4MDQpCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNV0sICVbdG1wXSwgMHgwYykKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXA3XSwgJVt0bXBdLCAweDA2KQorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDhdLCAlW3RtcF0sIDB4MGUpCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHN1YmggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MREMxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJhZGRpICAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQVFJfQURESSAgICIlW3RtcF0sICAgICAlW3RtcF0sICAgICAgICAgMHgzMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0U3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgICAgICBbZnRtcDEwXSI9JmYiKGZ0bXBbMTBdKSwKKyAgICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wMCksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBbdG1wXSIrJnIiKHRtcCksICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksCisgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgICAgICA6IFtkc3RTdHJpZGVdInIiKChtaXBzX3JlZylkc3RTdHJpZGUpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CiAKLSAgICAgICAgInNkYzEgJGYxNywgMCglW3RtcF0pICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTgsIDgoJVt0bXBdKSAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZCAlW3RtcF0sICVbdG1wXSwgJVt0bXBTdHJpZGVdICAgICAgXHJcbiIKLSAgICAgICAgImRhZGQgJVtzcmNdLCAlW3NyY10sICVbc3JjU3RyaWRlXSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaSAkOCwgJDgsIC0xICAgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYm5leiAkOCwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOiBbdG1wXSIrJnIiKHRtcCksW3NyY10iKyZyIihzcmMpCi0gICAgICAgIDogW3RtcFN0cmlkZV0iciIoMTYpLFtzcmNTdHJpZGVdInIiKHNyY1N0cmlkZSksCi0gICAgICAgICAgW2ZmX3B3XzIwXSJmIihmZl9wd18yMCksW2ZmX3B3XzVdImYiKGZmX3B3XzUpCi0gICAgICAgIDogIiQ4IiwiJGYwIiwiJGYxIiwiJGYyIiwiJGYzIiwiJGY0IiwiJGY1IiwiJGY2IiwiJGY3IiwiJGY4IiwiJGY5IiwKLSAgICAgICAgICAiJGYxMCIsIiRmMTEiLCIkZjEyIiwiJGYxMyIsIiRmMTQiLCIkZjE1IiwiJGYxNiIsIiRmMTciLCIkZjE4IgotICAgICk7Ci0KLSAgICB0bXAgLT0gODg7Ci0KLSAgICBmb3IoaT0wOyBpPDg7IGkrKykgewotICAgICAgICBjb25zdCBpbnQgdG1wQj0gdG1wWy0xNl07Ci0gICAgICAgIGNvbnN0IGludCB0bXBBPSB0bXBbIC04XTsKLSAgICAgICAgY29uc3QgaW50IHRtcDA9IHRtcFsgIDBdOwotICAgICAgICBjb25zdCBpbnQgdG1wMT0gdG1wWyAgOF07Ci0gICAgICAgIGNvbnN0IGludCB0bXAyPSB0bXBbIDE2XTsKLSAgICAgICAgY29uc3QgaW50IHRtcDM9IHRtcFsgMjRdOwotICAgICAgICBjb25zdCBpbnQgdG1wND0gdG1wWyAzMl07Ci0gICAgICAgIGNvbnN0IGludCB0bXA1PSB0bXBbIDQwXTsKLSAgICAgICAgY29uc3QgaW50IHRtcDY9IHRtcFsgNDhdOwotICAgICAgICBjb25zdCBpbnQgdG1wNz0gdG1wWyA1Nl07Ci0gICAgICAgIGNvbnN0IGludCB0bXA4PSB0bXBbIDY0XTsKLSAgICAgICAgY29uc3QgaW50IHRtcDk9IHRtcFsgNzJdOwotICAgICAgICBjb25zdCBpbnQgdG1wMTA9dG1wWyA4MF07Ci0gICAgICAgIG9wMl9hdmcoZHN0WzAqZHN0U3RyaWRlXSwgKHRtcDArdG1wMSkqMjAgLSAodG1wQSt0bXAyKSo1ICsgKHRtcEIrdG1wMykpOwotICAgICAgICBvcDJfYXZnKGRzdFsxKmRzdFN0cmlkZV0sICh0bXAxK3RtcDIpKjIwIC0gKHRtcDArdG1wMykqNSArICh0bXBBK3RtcDQpKTsKLSAgICAgICAgb3AyX2F2Zyhkc3RbMipkc3RTdHJpZGVdLCAodG1wMit0bXAzKSoyMCAtICh0bXAxK3RtcDQpKjUgKyAodG1wMCt0bXA1KSk7Ci0gICAgICAgIG9wMl9hdmcoZHN0WzMqZHN0U3RyaWRlXSwgKHRtcDMrdG1wNCkqMjAgLSAodG1wMit0bXA1KSo1ICsgKHRtcDErdG1wNikpOwotICAgICAgICBvcDJfYXZnKGRzdFs0KmRzdFN0cmlkZV0sICh0bXA0K3RtcDUpKjIwIC0gKHRtcDMrdG1wNikqNSArICh0bXAyK3RtcDcpKTsKLSAgICAgICAgb3AyX2F2Zyhkc3RbNSpkc3RTdHJpZGVdLCAodG1wNSt0bXA2KSoyMCAtICh0bXA0K3RtcDcpKjUgKyAodG1wMyt0bXA4KSk7Ci0gICAgICAgIG9wMl9hdmcoZHN0WzYqZHN0U3RyaWRlXSwgKHRtcDYrdG1wNykqMjAgLSAodG1wNSt0bXA4KSo1ICsgKHRtcDQrdG1wOSkpOwotICAgICAgICBvcDJfYXZnKGRzdFs3KmRzdFN0cmlkZV0sICh0bXA3K3RtcDgpKjIwIC0gKHRtcDYrdG1wOSkqNSArICh0bXA1K3RtcDEwKSk7Ci0gICAgICAgIGRzdCsrOwotICAgICAgICB0bXArKzsKLSAgICB9CisgICAgICAgIHRtcCArPSA4IC0gc2l6ZSAqIDI0OworICAgICAgICBkc3QgKz0gOCAtIHNpemUgKiBkc3RTdHJpZGU7CisgICAgfSB3aGlsZSAody0tKTsKIH0KIAotc3RhdGljIHZvaWQgYXZnX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXsKLSAgICBhdmdfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShkc3QsIHNyYywgZHN0U3RyaWRlLCBzcmNTdHJpZGUpOwotICAgIGF2Z19oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpOwotICAgIHNyYyArPSA4KnNyY1N0cmlkZTsKLSAgICBkc3QgKz0gOCpkc3RTdHJpZGU7Ci0gICAgYXZnX2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkoZHN0LCBzcmMsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTsKLSAgICBhdmdfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTsKK3N0YXRpYyB2b2lkIGF2Z19oMjY0X3FwZWw4b3IxNl9odl9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsIGludDE2X3QgKnRtcCwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3QgdG1wU3RyaWRlLAorICAgICAgICBwdHJkaWZmX3Qgc3JjU3RyaWRlLCBpbnQgc2l6ZSkKK3sKKyAgICBwdXRfaDI2NF9xcGVsOG9yMTZfaHYxX2xvd3Bhc3NfbW1pKHRtcCwgc3JjLCB0bXBTdHJpZGUsIHNyY1N0cmlkZSwgc2l6ZSk7CisgICAgYXZnX2gyNjRfcXBlbDhvcjE2X2h2Ml9sb3dwYXNzX21taShkc3QsIHRtcCwgZHN0U3RyaWRlLCB0bXBTdHJpZGUsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBhdmdfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsIGludDE2X3QgKnRtcCwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3QgdG1wU3RyaWRlLAorICAgICAgICBwdHJkaWZmX3Qgc3JjU3RyaWRlKQoreworICAgIGF2Z19oMjY0X3FwZWw4b3IxNl9odl9sb3dwYXNzX21taShkc3QsIHRtcCwgc3JjLCBkc3RTdHJpZGUsIHRtcFN0cmlkZSwKKyAgICAgICAgICAgIHNyY1N0cmlkZSwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Z19oMjY0X3FwZWwxNl9odl9sb3dwYXNzX21taSh1aW50OF90ICpkc3QsIGludDE2X3QgKnRtcCwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3QgdG1wU3RyaWRlLAorICAgICAgICBwdHJkaWZmX3Qgc3JjU3RyaWRlKQoreworICAgIGF2Z19oMjY0X3FwZWw4b3IxNl9odl9sb3dwYXNzX21taShkc3QsIHRtcCwgc3JjLCBkc3RTdHJpZGUsIHRtcFN0cmlkZSwKKyAgICAgICAgICAgIHNyY1N0cmlkZSwgMTYpOworfQorCitzdGF0aWMgdm9pZCBhdmdfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjMlN0cmlkZSkKK3sKKyAgICBkb3VibGUgZnRtcFsxMF07CisgICAgdWludDY0X3QgdG1wWzJdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMV0sICAgIDB4MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3JpICAgICAgICAlW3RtcDBdLCAgICAkMCwgICAgICAgICAgICAgMHg4ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAxXSwgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMV0sICAgIDB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAxXSwgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDEpCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNF0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNsbGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3NyY10sIC0weDAxKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNV0sICVbc3JjXSwgIDB4MDIpCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDRdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZmZfcHdfNV0gICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzVdICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMl0sICVbc3JjXSwgLTB4MDIpCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA2XSwgJVtzcmNdLCAgMHgwNykKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzE2XSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd18xNl0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAlW3NyYzJdLCAweDAwKQorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wOV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtkc3RTdHJpZGVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgImRhZGRpICAgICAgJVt0bXAwXSwgICAgJVt0bXAwXSwgICAgICAgIC0weDAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdFN0cmlkZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzJdLCAgICAlW3NyYzJdLCAgICAgICAgJVtzcmMyU3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJndHogICAgICAgJVt0bXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksICAgICAgICAgICAgICBbdG1wMV0iPSZyIih0bXBbMV0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgW3NyYzJdIismciIoc3JjMikKKyAgICAgICAgOiBbZHN0U3RyaWRlXSJyIigobWlwc19yZWcpZHN0U3RyaWRlKSwKKyAgICAgICAgICBbc3JjMlN0cmlkZV0iciIoKG1pcHNfcmVnKXNyYzJTdHJpZGUpLAorICAgICAgICAgIFtmZl9wd181XSJmIihmZl9wd181KSwgICAgICAgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKworc3RhdGljIHZvaWQgYXZnX2gyNjRfcXBlbDE2X2hfbG93cGFzc19sMl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmMyU3RyaWRlKQoreworICAgIGF2Z19oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9tbWkoZHN0LCBzcmMsIHNyYzIsIGRzdFN0cmlkZSwgc3JjMlN0cmlkZSk7CisgICAgYXZnX2gyNjRfcXBlbDhfaF9sb3dwYXNzX2wyX21taShkc3QgKyA4LCBzcmMgKyA4LCBzcmMyICsgOCwgZHN0U3RyaWRlLAorICAgICAgICAgICAgc3JjMlN0cmlkZSk7CisKKyAgICBzcmMgKz0gOCAqIGRzdFN0cmlkZTsKKyAgICBkc3QgKz0gOCAqIGRzdFN0cmlkZTsKKyAgICBzcmMyICs9IDggKiBzcmMyU3RyaWRlOworCisgICAgYXZnX2gyNjRfcXBlbDhfaF9sb3dwYXNzX2wyX21taShkc3QsIHNyYywgc3JjMiwgZHN0U3RyaWRlLCBzcmMyU3RyaWRlKTsKKyAgICBhdmdfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbW1pKGRzdCArIDgsIHNyYyArIDgsIHNyYzIgKyA4LCBkc3RTdHJpZGUsCisgICAgICAgICAgICBzcmMyU3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgYXZnX3BpeGVsczhfbDJfc2hpZnQ1X21taSh1aW50OF90ICpkc3QsIGludDE2X3QgKnNyYzE2LAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmM4LCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjOFN0cmlkZSwgaW50IGIpCit7CisgICAgZG91YmxlIGZ0bXBbOF07CisgICAgdWludDY0X3QgdG1wMDsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKKworICAgIGRvIHsKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3NyYzE2XSwgMHgwMCkKKyAgICAgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDZdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbc3JjMTZdLCAweDA4KQorICAgICAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3NyYzE2XSwgMHgzMCkKKyAgICAgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVtzcmMxNl0sIDB4MzgpCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW3NyYzhdLCAweDAwKQorICAgICAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDVdLCAlW3NyYzhdLCAlW3NyYzhTdHJpZGVdLCAweDAwKQorICAgICAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgTU1JX0xEQzEoJVtmdG1wN10sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDddLCAlW2RzdF0sICVbZHN0U3RyaWRlXSwgMHgwMCkKKyAgICAgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNTUlfU0RYQzEoJVtmdG1wMl0sICVbZHN0XSwgJVtkc3RTdHJpZGVdLCAweDAwKQorICAgICAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICAgICAgW3RtcDBdIj0mciIodG1wMCkKKyAgICAgICAgICAgIDogW3NyYzhdInIiKHNyYzgpLCAgICAgICAgICAgICAgW3NyYzE2XSJyIihzcmMxNiksCisgICAgICAgICAgICAgIFtkc3RdInIiKGRzdCksCisgICAgICAgICAgICAgIFtzcmM4U3RyaWRlXSJyIigobWlwc19yZWcpc3JjOFN0cmlkZSksCisgICAgICAgICAgICAgIFtkc3RTdHJpZGVdInIiKChtaXBzX3JlZylkc3RTdHJpZGUpCisgICAgICAgICAgICA6ICJtZW1vcnkiCisgICAgICAgICk7CisKKyAgICAgICAgc3JjOCAgKz0gMiAqIHNyYzhTdHJpZGU7CisgICAgICAgIHNyYzE2ICs9IDQ4OworICAgICAgICBkc3QgICArPSAyICogZHN0U3RyaWRlOworICAgIH0gd2hpbGUgKGIgLT0gMik7Cit9CisKK3N0YXRpYyB2b2lkIGF2Z19waXhlbHMxNl9sMl9zaGlmdDVfbW1pKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqc3JjMTYsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzgsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmM4U3RyaWRlLCBpbnQgYikKK3sKKyAgICBhdmdfcGl4ZWxzOF9sMl9zaGlmdDVfbW1pKGRzdCwgc3JjMTYsIHNyYzgsIGRzdFN0cmlkZSwgc3JjOFN0cmlkZSwgYik7CisgICAgYXZnX3BpeGVsczhfbDJfc2hpZnQ1X21taShkc3QgKyA4LCBzcmMxNiArIDgsIHNyYzggKyA4LCBkc3RTdHJpZGUsCisgICAgICAgICAgICBzcmM4U3RyaWRlLCBiKTsKIH0KIAogLy9ERUZfSDI2NF9NQ19NTUkocHV0XywgNCkKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMwMF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgcHV0X3BpeGVsczRfbW1pKGRzdCwgc3JjLCBzdHJpZGUsIDQpOworICAgIGZmX3B1dF9waXhlbHM0XzhfbW1pKGRzdCwgc3JjLCBzdHJpZGUsIDQpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMTBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMTY2MSw3ICsyMTU4LDcgQEAKIHsKICAgICB1aW50OF90IGhhbGZbMTZdOwogICAgIHB1dF9oMjY0X3FwZWw0X2hfbG93cGFzc19tbWkoaGFsZiwgc3JjLCA0LCBzdHJpZGUpOwotICAgIHB1dF9waXhlbHM0X2wyX21taShkc3QsIHNyYywgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIDQsIDQpOworICAgIGZmX3B1dF9waXhlbHM0X2wyXzhfbW1pKGRzdCwgc3JjLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgNCwgNCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMyMF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xNjc1LDcgKzIxNzIsNyBAQAogewogICAgIHVpbnQ4X3QgaGFsZlsxNl07CiAgICAgcHV0X2gyNjRfcXBlbDRfaF9sb3dwYXNzX21taShoYWxmLCBzcmMsIDQsIHN0cmlkZSk7Ci0gICAgcHV0X3BpeGVsczRfbDJfbW1pKGRzdCwgc3JjKzEsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCA0LCA0KTsKKyAgICBmZl9wdXRfcGl4ZWxzNF9sMl84X21taShkc3QsIHNyYysxLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgNCwgNCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMwMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xNjg2LDcgKzIxODMsNyBAQAogICAgIHVpbnQ4X3QgaGFsZlsxNl07CiAgICAgY29weV9ibG9jazRfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCA0LCAgc3RyaWRlLCA5KTsKICAgICBwdXRfaDI2NF9xcGVsNF92X2xvd3Bhc3NfbW1pKGhhbGYsIGZ1bGxfbWlkLCA0LCA0KTsKLSAgICBwdXRfcGl4ZWxzNF9sMl9tbWkoZHN0LCBmdWxsX21pZCwgaGFsZiwgc3RyaWRlLCA0LCA0LCA0KTsKKyAgICBmZl9wdXRfcGl4ZWxzNF9sMl84X21taShkc3QsIGZ1bGxfbWlkLCBoYWxmLCBzdHJpZGUsIDQsIDQsIDQpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMTcwNiw3ICsyMjAzLDcgQEAKICAgICB1aW50OF90IGhhbGZbMTZdOwogICAgIGNvcHlfYmxvY2s0X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgNCwgIHN0cmlkZSwgOSk7CiAgICAgcHV0X2gyNjRfcXBlbDRfdl9sb3dwYXNzX21taShoYWxmLCBmdWxsX21pZCwgNCwgNCk7Ci0gICAgcHV0X3BpeGVsczRfbDJfbW1pKGRzdCwgZnVsbF9taWQrNCwgaGFsZiwgc3RyaWRlLCA0LCA0LCA0KTsKKyAgICBmZl9wdXRfcGl4ZWxzNF9sMl84X21taShkc3QsIGZ1bGxfbWlkKzQsIGhhbGYsIHN0cmlkZSwgNCwgNCwgNCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMxMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xNzE5LDcgKzIyMTYsNyBAQAogICAgIHB1dF9oMjY0X3FwZWw0X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYywgNCwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrNF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDQsICBzdHJpZGUsIDkpOwogICAgIHB1dF9oMjY0X3FwZWw0X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA0LCA0KTsKLSAgICBwdXRfcGl4ZWxzNF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgNCwgNCwgNCk7CisgICAgZmZfcHV0X3BpeGVsczRfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgNCwgNCwgNCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMzMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xNzMyLDcgKzIyMjksNyBAQAogICAgIHB1dF9oMjY0X3FwZWw0X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYywgNCwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrNF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyAxLCA0LCAgc3RyaWRlLCA5KTsKICAgICBwdXRfaDI2NF9xcGVsNF92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgNCwgNCk7Ci0gICAgcHV0X3BpeGVsczRfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDQsIDQsIDQpOworICAgIGZmX3B1dF9waXhlbHM0X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDQsIDQsIDQpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMTNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMTc0NSw3ICsyMjQyLDcgQEAKICAgICBwdXRfaDI2NF9xcGVsNF9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMgKyBzdHJpZGUsIDQsIHN0cmlkZSk7CiAgICAgY29weV9ibG9jazRfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCA0LCAgc3RyaWRlLCA5KTsKICAgICBwdXRfaDI2NF9xcGVsNF92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgNCwgNCk7Ci0gICAgcHV0X3BpeGVsczRfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDQsIDQsIDQpOworICAgIGZmX3B1dF9waXhlbHM0X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDQsIDQsIDQpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMzNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMTc1OCw3ICsyMjU1LDcgQEAKICAgICBwdXRfaDI2NF9xcGVsNF9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMgKyBzdHJpZGUsIDQsIHN0cmlkZSk7CiAgICAgY29weV9ibG9jazRfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyICsgMSwgNCwgIHN0cmlkZSwgOSk7CiAgICAgcHV0X2gyNjRfcXBlbDRfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDQsIDQpOwotICAgIHB1dF9waXhlbHM0X2wyX21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCA0LCA0LCA0KTsKKyAgICBmZl9wdXRfcGl4ZWxzNF9sMl84X21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCA0LCA0LCA0KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzIyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE3NzQsNyArMjI3MSw3IEBACiAgICAgdWludDhfdCBoYWxmSFZbMTZdOwogICAgIHB1dF9oMjY0X3FwZWw0X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYywgNCwgc3RyaWRlKTsKICAgICBwdXRfaDI2NF9xcGVsNF9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgNCwgc3RyaWRlKTsKLSAgICBwdXRfcGl4ZWxzNF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDQsIDQsIDQpOworICAgIGZmX3B1dF9waXhlbHM0X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZIViwgc3RyaWRlLCA0LCA0LCA0KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzIzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE3ODQsNyArMjI4MSw3IEBACiAgICAgdWludDhfdCBoYWxmSFZbMTZdOwogICAgIHB1dF9oMjY0X3FwZWw0X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYyArIHN0cmlkZSwgNCwgc3RyaWRlKTsKICAgICBwdXRfaDI2NF9xcGVsNF9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgNCwgc3RyaWRlKTsKLSAgICBwdXRfcGl4ZWxzNF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDQsIDQsIDQpOworICAgIGZmX3B1dF9waXhlbHM0X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZIViwgc3RyaWRlLCA0LCA0LCA0KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzEyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE3OTcsNyArMjI5NCw3IEBACiAgICAgY29weV9ibG9jazRfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCA0LCAgc3RyaWRlLCA5KTsKICAgICBwdXRfaDI2NF9xcGVsNF92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgNCwgNCk7CiAgICAgcHV0X2gyNjRfcXBlbDRfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBzcmMsIDQsIHN0cmlkZSk7Ci0gICAgcHV0X3BpeGVsczRfbDJfbW1pKGRzdCwgaGFsZlYsIGhhbGZIViwgc3RyaWRlLCA0LCA0LCA0KTsKKyAgICBmZl9wdXRfcGl4ZWxzNF9sMl84X21taShkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgNCwgNCwgNCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMzMl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xODEwLDE0ICsyMzA3LDE0IEBACiAgICAgY29weV9ibG9jazRfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyICsgMSwgNCwgIHN0cmlkZSwgOSk7CiAgICAgcHV0X2gyNjRfcXBlbDRfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDQsIDQpOwogICAgIHB1dF9oMjY0X3FwZWw0X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCA0LCBzdHJpZGUpOwotICAgIHB1dF9waXhlbHM0X2wyX21taShkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgNCwgNCwgNCk7CisgICAgZmZfcHV0X3BpeGVsczRfbDJfOF9tbWkoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIDQsIDQsIDQpOwogfQogCiAvL0RFRl9IMjY0X01DX01NSShhdmdfLCA0KQogdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzAwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICBhdmdfcGl4ZWxzNF9tbWkoZHN0LCBzcmMsIHN0cmlkZSwgNCk7CisgICAgZmZfYXZnX3BpeGVsczRfOF9tbWkoZHN0LCBzcmMsIHN0cmlkZSwgNCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMxMF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xODI1LDcgKzIzMjIsNyBAQAogewogICAgIHVpbnQ4X3QgaGFsZlsxNl07CiAgICAgcHV0X2gyNjRfcXBlbDRfaF9sb3dwYXNzX21taShoYWxmLCBzcmMsIDQsIHN0cmlkZSk7Ci0gICAgYXZnX3BpeGVsczRfbDJfbW1pKGRzdCwgc3JjLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgNCwgNCk7CisgICAgZmZfYXZnX3BpeGVsczRfbDJfOF9tbWkoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCA0LCA0KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzIwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE4MzksNyArMjMzNiw3IEBACiB7CiAgICAgdWludDhfdCBoYWxmWzE2XTsKICAgICBwdXRfaDI2NF9xcGVsNF9oX2xvd3Bhc3NfbW1pKGhhbGYsIHNyYywgNCwgc3RyaWRlKTsKLSAgICBhdmdfcGl4ZWxzNF9sMl9tbWkoZHN0LCBzcmMrMSwgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIDQsIDQpOworICAgIGZmX2F2Z19waXhlbHM0X2wyXzhfbW1pKGRzdCwgc3JjKzEsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCA0LCA0KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzAxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE4NTAsNyArMjM0Nyw3IEBACiAgICAgdWludDhfdCBoYWxmWzE2XTsKICAgICBjb3B5X2Jsb2NrNF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDQsICBzdHJpZGUsIDkpOwogICAgIHB1dF9oMjY0X3FwZWw0X3ZfbG93cGFzc19tbWkoaGFsZiwgZnVsbF9taWQsIDQsIDQpOwotICAgIGF2Z19waXhlbHM0X2wyX21taShkc3QsIGZ1bGxfbWlkLCBoYWxmLCBzdHJpZGUsIDQsIDQsIDQpOworICAgIGZmX2F2Z19waXhlbHM0X2wyXzhfbW1pKGRzdCwgZnVsbF9taWQsIGhhbGYsIHN0cmlkZSwgNCwgNCwgNCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMwMl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xODcwLDcgKzIzNjcsNyBAQAogICAgIHVpbnQ4X3QgaGFsZlsxNl07CiAgICAgY29weV9ibG9jazRfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCA0LCAgc3RyaWRlLCA5KTsKICAgICBwdXRfaDI2NF9xcGVsNF92X2xvd3Bhc3NfbW1pKGhhbGYsIGZ1bGxfbWlkLCA0LCA0KTsKLSAgICBhdmdfcGl4ZWxzNF9sMl9tbWkoZHN0LCBmdWxsX21pZCs0LCBoYWxmLCBzdHJpZGUsIDQsIDQsIDQpOworICAgIGZmX2F2Z19waXhlbHM0X2wyXzhfbW1pKGRzdCwgZnVsbF9taWQrNCwgaGFsZiwgc3RyaWRlLCA0LCA0LCA0KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzExX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE4ODMsNyArMjM4MCw3IEBACiAgICAgcHV0X2gyNjRfcXBlbDRfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjLCA0LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2s0X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgNCwgIHN0cmlkZSwgOSk7CiAgICAgcHV0X2gyNjRfcXBlbDRfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDQsIDQpOwotICAgIGF2Z19waXhlbHM0X2wyX21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCA0LCA0LCA0KTsKKyAgICBmZl9hdmdfcGl4ZWxzNF9sMl84X21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCA0LCA0LCA0KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzMxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE4OTYsNyArMjM5Myw3IEBACiAgICAgcHV0X2gyNjRfcXBlbDRfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjLCA0LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2s0X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiArIDEsIDQsICBzdHJpZGUsIDkpOwogICAgIHB1dF9oMjY0X3FwZWw0X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA0LCA0KTsKLSAgICBhdmdfcGl4ZWxzNF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgNCwgNCwgNCk7CisgICAgZmZfYXZnX3BpeGVsczRfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgNCwgNCwgNCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMxM19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xOTA5LDcgKzI0MDYsNyBAQAogICAgIHB1dF9oMjY0X3FwZWw0X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYyArIHN0cmlkZSwgNCwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrNF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDQsICBzdHJpZGUsIDkpOwogICAgIHB1dF9oMjY0X3FwZWw0X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA0LCA0KTsKLSAgICBhdmdfcGl4ZWxzNF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgNCwgNCwgNCk7CisgICAgZmZfYXZnX3BpeGVsczRfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgNCwgNCwgNCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMzM19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0xOTIyLDcgKzI0MTksNyBAQAogICAgIHB1dF9oMjY0X3FwZWw0X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYyArIHN0cmlkZSwgNCwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrNF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyAxLCA0LCAgc3RyaWRlLCA5KTsKICAgICBwdXRfaDI2NF9xcGVsNF92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgNCwgNCk7Ci0gICAgYXZnX3BpeGVsczRfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDQsIDQsIDQpOworICAgIGZmX2F2Z19waXhlbHM0X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDQsIDQsIDQpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMjJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMTkzOCw3ICsyNDM1LDcgQEAKICAgICB1aW50OF90IGhhbGZIVlsxNl07CiAgICAgcHV0X2gyNjRfcXBlbDRfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjLCA0LCBzdHJpZGUpOwogICAgIHB1dF9oMjY0X3FwZWw0X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCA0LCBzdHJpZGUpOwotICAgIGF2Z19waXhlbHM0X2wyX21taShkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgNCwgNCwgNCk7CisgICAgZmZfYXZnX3BpeGVsczRfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDQsIDQsIDQpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMjNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMTk0OCw3ICsyNDQ1LDcgQEAKICAgICB1aW50OF90IGhhbGZIVlsxNl07CiAgICAgcHV0X2gyNjRfcXBlbDRfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjICsgc3RyaWRlLCA0LCBzdHJpZGUpOwogICAgIHB1dF9oMjY0X3FwZWw0X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCA0LCBzdHJpZGUpOwotICAgIGF2Z19waXhlbHM0X2wyX21taShkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgNCwgNCwgNCk7CisgICAgZmZfYXZnX3BpeGVsczRfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDQsIDQsIDQpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMTJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMTk2MSw3ICsyNDU4LDcgQEAKICAgICBjb3B5X2Jsb2NrNF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDQsICBzdHJpZGUsIDkpOwogICAgIHB1dF9oMjY0X3FwZWw0X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA0LCA0KTsKICAgICBwdXRfaDI2NF9xcGVsNF9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgNCwgc3RyaWRlKTsKLSAgICBhdmdfcGl4ZWxzNF9sMl9tbWkoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIDQsIDQsIDQpOworICAgIGZmX2F2Z19waXhlbHM0X2wyXzhfbW1pKGRzdCwgaGFsZlYsIGhhbGZIViwgc3RyaWRlLCA0LCA0LCA0KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzMyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE5NzQsMTQgKzI0NzEsMTQgQEAKICAgICBjb3B5X2Jsb2NrNF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyAxLCA0LCAgc3RyaWRlLCA5KTsKICAgICBwdXRfaDI2NF9xcGVsNF92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgNCwgNCk7CiAgICAgcHV0X2gyNjRfcXBlbDRfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBzcmMsIDQsIHN0cmlkZSk7Ci0gICAgYXZnX3BpeGVsczRfbDJfbW1pKGRzdCwgaGFsZlYsIGhhbGZIViwgc3RyaWRlLCA0LCA0LCA0KTsKKyAgICBmZl9hdmdfcGl4ZWxzNF9sMl84X21taShkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgNCwgNCwgNCk7CiB9CiAKIC8vREVGX0gyNjRfTUNfTU1JKHB1dF8sIDgpCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMDBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHB1dF9waXhlbHM4X21taShkc3QsIHNyYywgc3RyaWRlLCA4KTsKKyAgICBmZl9wdXRfcGl4ZWxzOF84X21taShkc3QsIHNyYywgc3RyaWRlLCA4KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTE5ODksNyArMjQ4Niw3IEBACiB7CiAgICAgdWludDhfdCBoYWxmWzY0XTsKICAgICBwdXRfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbW1pKGhhbGYsIHNyYywgOCwgc3RyaWRlKTsKLSAgICBwdXRfcGl4ZWxzOF9sMl9tbWkoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCA4LCA4KTsKKyAgICBmZl9wdXRfcGl4ZWxzOF9sMl84X21taShkc3QsIHNyYywgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIDgsIDgpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMjBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjAwMyw3ICsyNTAwLDcgQEAKIHsKICAgICB1aW50OF90IGhhbGZbNjRdOwogICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19tbWkoaGFsZiwgc3JjLCA4LCBzdHJpZGUpOwotICAgIHB1dF9waXhlbHM4X2wyX21taShkc3QsIHNyYysxLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgOCwgOCk7CisgICAgZmZfcHV0X3BpeGVsczhfbDJfOF9tbWkoZHN0LCBzcmMrMSwgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIDgsIDgpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMDFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjAxNCw3ICsyNTExLDcgQEAKICAgICB1aW50OF90IGhhbGZbNjRdOwogICAgIGNvcHlfYmxvY2s4X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgOCwgIHN0cmlkZSwgMTMpOwogICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19tbWkoaGFsZiwgZnVsbF9taWQsIDgsIDgpOwotICAgIHB1dF9waXhlbHM4X2wyX21taShkc3QsIGZ1bGxfbWlkLCBoYWxmLCBzdHJpZGUsIDgsIDgsIDgpOworICAgIGZmX3B1dF9waXhlbHM4X2wyXzhfbW1pKGRzdCwgZnVsbF9taWQsIGhhbGYsIHN0cmlkZSwgOCwgOCwgOCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMwMl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yMDM0LDcgKzI1MzEsNyBAQAogICAgIHVpbnQ4X3QgaGFsZls2NF07CiAgICAgY29weV9ibG9jazhfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCA4LCAgc3RyaWRlLCAxMyk7CiAgICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX21taShoYWxmLCBmdWxsX21pZCwgOCwgOCk7Ci0gICAgcHV0X3BpeGVsczhfbDJfbW1pKGRzdCwgZnVsbF9taWQrOCwgaGFsZiwgc3RyaWRlLCA4LCA4LCA4KTsKKyAgICBmZl9wdXRfcGl4ZWxzOF9sMl84X21taShkc3QsIGZ1bGxfbWlkKzgsIGhhbGYsIHN0cmlkZSwgOCwgOCwgOCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMxMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yMDQ3LDcgKzI1NDQsNyBAQAogICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYywgOCwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrOF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDgsICBzdHJpZGUsIDEzKTsKICAgICBwdXRfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgOCwgOCk7Ci0gICAgcHV0X3BpeGVsczhfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDgsIDgsIDgpOworICAgIGZmX3B1dF9waXhlbHM4X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDgsIDgsIDgpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMzFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjA2MCw3ICsyNTU3LDcgQEAKICAgICBwdXRfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMsIDgsIHN0cmlkZSk7CiAgICAgY29weV9ibG9jazhfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyICsgMSwgOCwgIHN0cmlkZSwgMTMpOwogICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA4LCA4KTsKLSAgICBwdXRfcGl4ZWxzOF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgOCwgOCwgOCk7CisgICAgZmZfcHV0X3BpeGVsczhfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgOCwgOCwgOCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMxM19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yMDczLDcgKzI1NzAsNyBAQAogICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYyArIHN0cmlkZSwgOCwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrOF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDgsICBzdHJpZGUsIDEzKTsKICAgICBwdXRfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgOCwgOCk7Ci0gICAgcHV0X3BpeGVsczhfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDgsIDgsIDgpOworICAgIGZmX3B1dF9waXhlbHM4X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDgsIDgsIDgpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMzNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjA4Niw2NiArMjU4Myw2NiBAQAogICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYyArIHN0cmlkZSwgOCwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrOF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyAxLCA4LCAgc3RyaWRlLCAxMyk7CiAgICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDgsIDgpOwotICAgIHB1dF9waXhlbHM4X2wyX21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCA4LCA4LCA4KTsKKyAgICBmZl9wdXRfcGl4ZWxzOF9sMl84X21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCA4LCA4LCA4KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUpOworICAgIHVpbnQxNl90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkgdGVtcFsxOTJdOworCisgICAgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkoZHN0LCB0ZW1wLCBzcmMsIHN0cmlkZSwgOCwgc3RyaWRlKTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90IGhhbGZIWzY0XTsKLSAgICB1aW50OF90IGhhbGZIVls2NF07Ci0gICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjLCA4LCBzdHJpZGUpOwotICAgIHB1dF9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCA4LCBzdHJpZGUpOwotICAgIHB1dF9waXhlbHM4X2wyX21taShkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgOCwgOCwgOCk7CisgICAgdWludDhfdCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpIHRlbXBbNDQ4XTsKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSB0ZW1wOworICAgIGludDE2X3QgKmNvbnN0IGhhbGZWID0gKGludDE2X3QgKikgKHRlbXAgKyA2NCk7CisKKyAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShoYWxmSFYsIGhhbGZWLCBzcmMsIDgsIDgsIHN0cmlkZSk7CisgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX2wyX21taShkc3QsIHNyYywgaGFsZkhWLCBzdHJpZGUsIDgpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMjNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgaGFsZkhbNjRdOwotICAgIHVpbnQ4X3QgaGFsZkhWWzY0XTsKLSAgICBwdXRfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMgKyBzdHJpZGUsIDgsIHN0cmlkZSk7Ci0gICAgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBzcmMsIDgsIHN0cmlkZSk7Ci0gICAgcHV0X3BpeGVsczhfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZIViwgc3RyaWRlLCA4LCA4LCA4KTsKKyAgICB1aW50OF90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkgdGVtcFs0NDhdOworICAgIHVpbnQ4X3QgKmNvbnN0IGhhbGZIViA9IHRlbXA7CisgICAgaW50MTZfdCAqY29uc3QgaGFsZlYgPSAoaW50MTZfdCAqKSAodGVtcCArIDY0KTsKKworICAgIHB1dF9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgaGFsZlYsIHNyYywgOCwgOCwgc3RyaWRlKTsKKyAgICBwdXRfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbW1pKGRzdCwgc3JjICsgc3RyaWRlLCBoYWxmSFYsIHN0cmlkZSwgOCk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMxMl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBmdWxsWzEwNF07Ci0gICAgdWludDhfdCAqIGNvbnN0IGZ1bGxfbWlkPSBmdWxsICsgMTY7Ci0gICAgdWludDhfdCBoYWxmVls2NF07Ci0gICAgdWludDhfdCBoYWxmSFZbNjRdOwotICAgIGNvcHlfYmxvY2s4X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgOCwgIHN0cmlkZSwgMTMpOwotICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA4LCA4KTsKLSAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgOCwgc3RyaWRlKTsKLSAgICBwdXRfcGl4ZWxzOF9sMl9tbWkoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIDgsIDgsIDgpOworICAgIHVpbnQ4X3QgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKSB0ZW1wWzQ0OF07CisgICAgdWludDhfdCAqY29uc3QgaGFsZkhWID0gdGVtcDsKKyAgICBpbnQxNl90ICpjb25zdCBoYWxmViA9IChpbnQxNl90ICopICh0ZW1wICsgNjQpOworCisgICAgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBoYWxmViwgc3JjLCA4LCA4LCBzdHJpZGUpOworICAgIHB1dF9waXhlbHM4X2wyX3NoaWZ0NV9tbWkoZHN0LCBoYWxmViArIDIsIGhhbGZIViwgc3RyaWRlLCA4LCA4KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90IGZ1bGxbMTA0XTsKLSAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQ9IGZ1bGwgKyAxNjsKLSAgICB1aW50OF90IGhhbGZWWzY0XTsKLSAgICB1aW50OF90IGhhbGZIVls2NF07Ci0gICAgY29weV9ibG9jazhfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyICsgMSwgOCwgIHN0cmlkZSwgMTMpOwotICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA4LCA4KTsKLSAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgOCwgc3RyaWRlKTsKLSAgICBwdXRfcGl4ZWxzOF9sMl9tbWkoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIDgsIDgsIDgpOworICAgIHVpbnQ4X3QgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKSB0ZW1wWzQ0OF07CisgICAgdWludDhfdCAqY29uc3QgaGFsZkhWID0gdGVtcDsKKyAgICBpbnQxNl90ICpjb25zdCBoYWxmViA9IChpbnQxNl90ICopICh0ZW1wICsgNjQpOworCisgICAgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBoYWxmViwgc3JjLCA4LCA4LCBzdHJpZGUpOworICAgIHB1dF9waXhlbHM4X2wyX3NoaWZ0NV9tbWkoZHN0LCBoYWxmViArIDMsIGhhbGZIViwgc3RyaWRlLCA4LCA4KTsKIH0KIAogLy9ERUZfSDI2NF9NQ19NTUkoYXZnXywgOCkKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMwMF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgYXZnX3BpeGVsczhfbW1pKGRzdCwgc3JjLCBzdHJpZGUsIDgpOworICAgIGZmX2F2Z19waXhlbHM4XzhfbW1pKGRzdCwgc3JjLCBzdHJpZGUsIDgpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjE1Myw3ICsyNjUwLDcgQEAKIHsKICAgICB1aW50OF90IGhhbGZbNjRdOwogICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19tbWkoaGFsZiwgc3JjLCA4LCBzdHJpZGUpOwotICAgIGF2Z19waXhlbHM4X2wyX21taShkc3QsIHNyYywgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIDgsIDgpOworICAgIGZmX2F2Z19waXhlbHM4X2wyXzhfbW1pKGRzdCwgc3JjLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgOCwgOCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMyMF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yMTY3LDcgKzI2NjQsNyBAQAogewogICAgIHVpbnQ4X3QgaGFsZls2NF07CiAgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX21taShoYWxmLCBzcmMsIDgsIHN0cmlkZSk7Ci0gICAgYXZnX3BpeGVsczhfbDJfbW1pKGRzdCwgc3JjKzEsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCA4LCA4KTsKKyAgICBmZl9hdmdfcGl4ZWxzOF9sMl84X21taShkc3QsIHNyYysxLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgOCwgOCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMwMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yMTc4LDcgKzI2NzUsNyBAQAogICAgIHVpbnQ4X3QgaGFsZls2NF07CiAgICAgY29weV9ibG9jazhfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCA4LCAgc3RyaWRlLCAxMyk7CiAgICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX21taShoYWxmLCBmdWxsX21pZCwgOCwgOCk7Ci0gICAgYXZnX3BpeGVsczhfbDJfbW1pKGRzdCwgZnVsbF9taWQsIGhhbGYsIHN0cmlkZSwgOCwgOCwgOCk7CisgICAgZmZfYXZnX3BpeGVsczhfbDJfOF9tbWkoZHN0LCBmdWxsX21pZCwgaGFsZiwgc3RyaWRlLCA4LCA4LCA4KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzAyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTIxOTgsNyArMjY5NSw3IEBACiAgICAgdWludDhfdCBoYWxmWzY0XTsKICAgICBjb3B5X2Jsb2NrOF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDgsICBzdHJpZGUsIDEzKTsKICAgICBwdXRfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbW1pKGhhbGYsIGZ1bGxfbWlkLCA4LCA4KTsKLSAgICBhdmdfcGl4ZWxzOF9sMl9tbWkoZHN0LCBmdWxsX21pZCs4LCBoYWxmLCBzdHJpZGUsIDgsIDgsIDgpOworICAgIGZmX2F2Z19waXhlbHM4X2wyXzhfbW1pKGRzdCwgZnVsbF9taWQrOCwgaGFsZiwgc3RyaWRlLCA4LCA4LCA4KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzExX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTIyMTEsNyArMjcwOCw3IEBACiAgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjLCA4LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2s4X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgOCwgIHN0cmlkZSwgMTMpOwogICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA4LCA4KTsKLSAgICBhdmdfcGl4ZWxzOF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgOCwgOCwgOCk7CisgICAgZmZfYXZnX3BpeGVsczhfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgOCwgOCwgOCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMzMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yMjI0LDcgKzI3MjEsNyBAQAogICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYywgOCwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrOF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyAxLCA4LCAgc3RyaWRlLCAxMyk7CiAgICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDgsIDgpOwotICAgIGF2Z19waXhlbHM4X2wyX21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCA4LCA4LCA4KTsKKyAgICBmZl9hdmdfcGl4ZWxzOF9sMl84X21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCA4LCA4LCA4KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzEzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTIyMzcsNyArMjczNCw3IEBACiAgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjICsgc3RyaWRlLCA4LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2s4X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgOCwgIHN0cmlkZSwgMTMpOwogICAgIHB1dF9oMjY0X3FwZWw4X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCA4LCA4KTsKLSAgICBhdmdfcGl4ZWxzOF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgOCwgOCwgOCk7CisgICAgZmZfYXZnX3BpeGVsczhfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgOCwgOCwgOCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMzM19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yMjUwLDY2ICsyNzQ3LDY2IEBACiAgICAgcHV0X2gyNjRfcXBlbDhfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjICsgc3RyaWRlLCA4LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2s4X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiArIDEsIDgsICBzdHJpZGUsIDEzKTsKICAgICBwdXRfaDI2NF9xcGVsOF92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgOCwgOCk7Ci0gICAgYXZnX3BpeGVsczhfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDgsIDgsIDgpOworICAgIGZmX2F2Z19waXhlbHM4X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDgsIDgsIDgpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIGF2Z19oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSk7CisgICAgdWludDE2X3QgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKSB0ZW1wWzE5Ml07CisKKyAgICBhdmdfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShkc3QsIHRlbXAsIHNyYywgc3RyaWRlLCA4LCBzdHJpZGUpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgaGFsZkhbNjRdOwotICAgIHVpbnQ4X3QgaGFsZkhWWzY0XTsKLSAgICBwdXRfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMsIDgsIHN0cmlkZSk7Ci0gICAgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBzcmMsIDgsIHN0cmlkZSk7Ci0gICAgYXZnX3BpeGVsczhfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZIViwgc3RyaWRlLCA4LCA4LCA4KTsKKyAgICB1aW50OF90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkgdGVtcFs0NDhdOworICAgIHVpbnQ4X3QgKmNvbnN0IGhhbGZIViA9IHRlbXA7CisgICAgaW50MTZfdCAqY29uc3QgaGFsZlYgPSAoaW50MTZfdCAqKSAodGVtcCArIDY0KTsKKworICAgIHB1dF9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgaGFsZlYsIHNyYywgOCwgOCwgc3RyaWRlKTsKKyAgICBhdmdfaDI2NF9xcGVsOF9oX2xvd3Bhc3NfbDJfbW1pKGRzdCwgc3JjLCBoYWxmSFYsIHN0cmlkZSwgOCk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMyM19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBoYWxmSFs2NF07Ci0gICAgdWludDhfdCBoYWxmSFZbNjRdOwotICAgIHB1dF9oMjY0X3FwZWw4X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYyArIHN0cmlkZSwgOCwgc3RyaWRlKTsKLSAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgOCwgc3RyaWRlKTsKLSAgICBhdmdfcGl4ZWxzOF9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDgsIDgsIDgpOworICAgIHVpbnQ4X3QgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKSB0ZW1wWzQ0OF07CisgICAgdWludDhfdCAqY29uc3QgaGFsZkhWID0gdGVtcDsKKyAgICBpbnQxNl90ICpjb25zdCBoYWxmViA9IChpbnQxNl90ICopICh0ZW1wICsgNjQpOworCisgICAgcHV0X2gyNjRfcXBlbDhfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBoYWxmViwgc3JjLCA4LCA4LCBzdHJpZGUpOworICAgIGF2Z19oMjY0X3FwZWw4X2hfbG93cGFzc19sMl9tbWkoZHN0LCBzcmMgKyBzdHJpZGUsIGhhbGZIViwgc3RyaWRlLCA4KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzEyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90IGZ1bGxbMTA0XTsKLSAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQ9IGZ1bGwgKyAxNjsKLSAgICB1aW50OF90IGhhbGZWWzY0XTsKLSAgICB1aW50OF90IGhhbGZIVls2NF07Ci0gICAgY29weV9ibG9jazhfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCA4LCAgc3RyaWRlLCAxMyk7Ci0gICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDgsIDgpOwotICAgIHB1dF9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCA4LCBzdHJpZGUpOwotICAgIGF2Z19waXhlbHM4X2wyX21taShkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgOCwgOCwgOCk7CisgICAgdWludDhfdCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpIHRlbXBbNDQ4XTsKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSB0ZW1wOworICAgIGludDE2X3QgKmNvbnN0IGhhbGZWID0gKGludDE2X3QgKikgKHRlbXAgKyA2NCk7CisKKyAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShoYWxmSFYsIGhhbGZWLCBzcmMsIDgsIDgsIHN0cmlkZSk7CisgICAgYXZnX3BpeGVsczhfbDJfc2hpZnQ1X21taShkc3QsIGhhbGZWICsgMiwgaGFsZkhWLCBzdHJpZGUsIDgsIDgpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgZnVsbFsxMDRdOwotICAgIHVpbnQ4X3QgKiBjb25zdCBmdWxsX21pZD0gZnVsbCArIDE2OwotICAgIHVpbnQ4X3QgaGFsZlZbNjRdOwotICAgIHVpbnQ4X3QgaGFsZkhWWzY0XTsKLSAgICBjb3B5X2Jsb2NrOF9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyAxLCA4LCAgc3RyaWRlLCAxMyk7Ci0gICAgcHV0X2gyNjRfcXBlbDhfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDgsIDgpOwotICAgIHB1dF9oMjY0X3FwZWw4X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCA4LCBzdHJpZGUpOwotICAgIGF2Z19waXhlbHM4X2wyX21taShkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgOCwgOCwgOCk7CisgICAgdWludDhfdCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpIHRlbXBbNDQ4XTsKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSB0ZW1wOworICAgIGludDE2X3QgKmNvbnN0IGhhbGZWID0gKGludDE2X3QgKikgKHRlbXAgKyA2NCk7CisKKyAgICBwdXRfaDI2NF9xcGVsOF9odl9sb3dwYXNzX21taShoYWxmSFYsIGhhbGZWLCBzcmMsIDgsIDgsIHN0cmlkZSk7CisgICAgYXZnX3BpeGVsczhfbDJfc2hpZnQ1X21taShkc3QsIGhhbGZWICsgMywgaGFsZkhWLCBzdHJpZGUsIDgsIDgpOwogfQogCiAvL0RFRl9IMjY0X01DX01NSShwdXRfLCAxNikKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMDBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHB1dF9waXhlbHMxNl9tbWkoZHN0LCBzcmMsIHN0cmlkZSwgMTYpOworICAgIGZmX3B1dF9waXhlbHMxNl84X21taShkc3QsIHNyYywgc3RyaWRlLCAxNik7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjMxNyw3ICsyODE0LDcgQEAKIHsKICAgICB1aW50OF90IGhhbGZbMjU2XTsKICAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX21taShoYWxmLCBzcmMsIDE2LCBzdHJpZGUpOwotICAgIHB1dF9waXhlbHMxNl9sMl9tbWkoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCAxNiwgMTYpOworICAgIGZmX3B1dF9waXhlbHMxNl9sMl84X21taShkc3QsIHNyYywgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIDE2LCAxNik7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjMzMSw3ICsyODI4LDcgQEAKIHsKICAgICB1aW50OF90IGhhbGZbMjU2XTsKICAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX21taShoYWxmLCBzcmMsIDE2LCBzdHJpZGUpOwotICAgIHB1dF9waXhlbHMxNl9sMl9tbWkoZHN0LCBzcmMrMSwgaGFsZiwgc3RyaWRlLCBzdHJpZGUsIDE2LCAxNik7CisgICAgZmZfcHV0X3BpeGVsczE2X2wyXzhfbW1pKGRzdCwgc3JjKzEsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCAxNiwgMTYpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzAxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTIzNDIsNyArMjgzOSw3IEBACiAgICAgdWludDhfdCBoYWxmWzI1Nl07CiAgICAgY29weV9ibG9jazE2X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgMTYsICBzdHJpZGUsIDIxKTsKICAgICBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX21taShoYWxmLCBmdWxsX21pZCwgMTYsIDE2KTsKLSAgICBwdXRfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgZnVsbF9taWQsIGhhbGYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CisgICAgZmZfcHV0X3BpeGVsczE2X2wyXzhfbW1pKGRzdCwgZnVsbF9taWQsIGhhbGYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjM2Miw3ICsyODU5LDcgQEAKICAgICB1aW50OF90IGhhbGZbMjU2XTsKICAgICBjb3B5X2Jsb2NrMTZfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCAxNiwgIHN0cmlkZSwgMjEpOwogICAgIHB1dF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbW1pKGhhbGYsIGZ1bGxfbWlkLCAxNiwgMTYpOwotICAgIHB1dF9waXhlbHMxNl9sMl9tbWkoZHN0LCBmdWxsX21pZCsxNiwgaGFsZiwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKKyAgICBmZl9wdXRfcGl4ZWxzMTZfbDJfOF9tbWkoZHN0LCBmdWxsX21pZCsxNiwgaGFsZiwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yMzc1LDcgKzI4NzIsNyBAQAogICAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMsIDE2LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2sxNl9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDE2LCAgc3RyaWRlLCAyMSk7CiAgICAgcHV0X2gyNjRfcXBlbDE2X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCAxNiwgMTYpOwotICAgIHB1dF9waXhlbHMxNl9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CisgICAgZmZfcHV0X3BpeGVsczE2X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTIzODgsNyArMjg4NSw3IEBACiAgICAgcHV0X2gyNjRfcXBlbDE2X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYywgMTYsIHN0cmlkZSk7CiAgICAgY29weV9ibG9jazE2X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiArIDEsIDE2LCAgc3RyaWRlLCAyMSk7CiAgICAgcHV0X2gyNjRfcXBlbDE2X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCAxNiwgMTYpOwotICAgIHB1dF9waXhlbHMxNl9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CisgICAgZmZfcHV0X3BpeGVsczE2X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzEzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTI0MDEsNyArMjg5OCw3IEBACiAgICAgcHV0X2gyNjRfcXBlbDE2X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYyArIHN0cmlkZSwgMTYsIHN0cmlkZSk7CiAgICAgY29weV9ibG9jazE2X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgMTYsICBzdHJpZGUsIDIxKTsKICAgICBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDE2LCAxNik7Ci0gICAgcHV0X3BpeGVsczE2X2wyX21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKKyAgICBmZl9wdXRfcGl4ZWxzMTZfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMzNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjQxNCw2NiArMjkxMSw2NiBAQAogICAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMgKyBzdHJpZGUsIDE2LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2sxNl9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyAxLCAxNiwgIHN0cmlkZSwgMjEpOwogICAgIHB1dF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgMTYsIDE2KTsKLSAgICBwdXRfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOworICAgIGZmX3B1dF9waXhlbHMxNl9sMl84X21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMyMl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgcHV0X2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKGRzdCwgc3JjLCBzdHJpZGUsIHN0cmlkZSk7CisgICAgdWludDE2X3QgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKSB0ZW1wWzM4NF07CisKKyAgICBwdXRfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19tbWkoZHN0LCB0ZW1wLCBzcmMsIHN0cmlkZSwgMTYsIHN0cmlkZSk7CiB9CiAKIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgaGFsZkhbMjU2XTsKLSAgICB1aW50OF90IGhhbGZIVlsyNTZdOwotICAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMsIDE2LCBzdHJpZGUpOwotICAgIHB1dF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgMTYsIHN0cmlkZSk7Ci0gICAgcHV0X3BpeGVsczE2X2wyX21taShkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CisgICAgdWludDhfdCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpIHRlbXBbMTAyNF07CisgICAgdWludDhfdCAqY29uc3QgaGFsZkhWID0gdGVtcDsKKyAgICBpbnQxNl90ICpjb25zdCBoYWxmViA9IChpbnQxNl90ICopICh0ZW1wICsgMjU2KTsKKworICAgIHB1dF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX21taShoYWxmSFYsIGhhbGZWLCBzcmMsIDE2LCAxNiwgc3RyaWRlKTsKKyAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2wyX21taShkc3QsIHNyYywgaGFsZkhWLCBzdHJpZGUsIDE2KTsKIH0KIAogdm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMyM19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBoYWxmSFsyNTZdOwotICAgIHVpbnQ4X3QgaGFsZkhWWzI1Nl07Ci0gICAgcHV0X2gyNjRfcXBlbDE2X2hfbG93cGFzc19tbWkoaGFsZkgsIHNyYyArIHN0cmlkZSwgMTYsIHN0cmlkZSk7Ci0gICAgcHV0X2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCAxNiwgc3RyaWRlKTsKLSAgICBwdXRfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZIViwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKKyAgICB1aW50OF90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkgdGVtcFsxMDI0XTsKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSB0ZW1wOworICAgIGludDE2X3QgKmNvbnN0IGhhbGZWID0gKGludDE2X3QgKikgKHRlbXAgKyAyNTYpOworCisgICAgcHV0X2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgaGFsZlYsIHNyYywgMTYsIDE2LCBzdHJpZGUpOworICAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbDJfbW1pKGRzdCwgc3JjICsgc3RyaWRlLCBoYWxmSFYsIHN0cmlkZSwgMTYpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzEyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90IGZ1bGxbMzM2XTsKLSAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQ9IGZ1bGwgKyAzMjsKLSAgICB1aW50OF90IGhhbGZWWzI1Nl07Ci0gICAgdWludDhfdCBoYWxmSFZbMjU2XTsKLSAgICBjb3B5X2Jsb2NrMTZfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCAxNiwgIHN0cmlkZSwgMjEpOwotICAgIHB1dF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgMTYsIDE2KTsKLSAgICBwdXRfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBzcmMsIDE2LCBzdHJpZGUpOwotICAgIHB1dF9waXhlbHMxNl9sMl9tbWkoZHN0LCBoYWxmViwgaGFsZkhWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOworICAgIHVpbnQ4X3QgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKSB0ZW1wWzEwMjRdOworICAgIHVpbnQ4X3QgKmNvbnN0IGhhbGZIViA9IHRlbXA7CisgICAgaW50MTZfdCAqY29uc3QgaGFsZlYgPSAoaW50MTZfdCAqKSAodGVtcCArIDI1Nik7CisKKyAgICBwdXRfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBoYWxmViwgc3JjLCAxNiwgMTYsIHN0cmlkZSk7CisgICAgcHV0X3BpeGVsczE2X2wyX3NoaWZ0NV9tbWkoZHN0LCBoYWxmViArIDIsIGhhbGZIViwgc3RyaWRlLCAxNiwgMTYpOwogfQogCiB2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90IGZ1bGxbMzM2XTsKLSAgICB1aW50OF90ICogY29uc3QgZnVsbF9taWQ9IGZ1bGwgKyAzMjsKLSAgICB1aW50OF90IGhhbGZWWzI1Nl07Ci0gICAgdWludDhfdCBoYWxmSFZbMjU2XTsKLSAgICBjb3B5X2Jsb2NrMTZfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyICsgMSwgMTYsICBzdHJpZGUsIDIxKTsKLSAgICBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDE2LCAxNik7Ci0gICAgcHV0X2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCAxNiwgc3RyaWRlKTsKLSAgICBwdXRfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgaGFsZlYsIGhhbGZIViwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKKyAgICB1aW50OF90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkgdGVtcFsxMDI0XTsKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSB0ZW1wOworICAgIGludDE2X3QgKmNvbnN0IGhhbGZWID0gKGludDE2X3QgKikgKHRlbXAgKyAyNTYpOworCisgICAgcHV0X2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgaGFsZlYsIHNyYywgMTYsIDE2LCBzdHJpZGUpOworICAgIHB1dF9waXhlbHMxNl9sMl9zaGlmdDVfbW1pKGRzdCwgaGFsZlYgKyAzLCBoYWxmSFYsIHN0cmlkZSwgMTYsIDE2KTsKIH0KIAogLy9ERUZfSDI2NF9NQ19NTUkoYXZnXywgMTYpCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICBhdmdfcGl4ZWxzMTZfbW1pKGRzdCwgc3JjLCBzdHJpZGUsIDE2KTsKKyAgICBmZl9hdmdfcGl4ZWxzMTZfOF9tbWkoZHN0LCBzcmMsIHN0cmlkZSwgMTYpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzEwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTI0ODEsNyArMjk3OCw3IEBACiB7CiAgICAgdWludDhfdCBoYWxmWzI1Nl07CiAgICAgcHV0X2gyNjRfcXBlbDE2X2hfbG93cGFzc19tbWkoaGFsZiwgc3JjLCAxNiwgc3RyaWRlKTsKLSAgICBhdmdfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgc3JjLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgMTYsIDE2KTsKKyAgICBmZl9hdmdfcGl4ZWxzMTZfbDJfOF9tbWkoZHN0LCBzcmMsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCAxNiwgMTYpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzIwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTI0OTUsNyArMjk5Miw3IEBACiB7CiAgICAgdWludDhfdCBoYWxmWzI1Nl07CiAgICAgcHV0X2gyNjRfcXBlbDE2X2hfbG93cGFzc19tbWkoaGFsZiwgc3JjLCAxNiwgc3RyaWRlKTsKLSAgICBhdmdfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgc3JjKzEsIGhhbGYsIHN0cmlkZSwgc3RyaWRlLCAxNiwgMTYpOworICAgIGZmX2F2Z19waXhlbHMxNl9sMl84X21taShkc3QsIHNyYysxLCBoYWxmLCBzdHJpZGUsIHN0cmlkZSwgMTYsIDE2KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMwMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yNTA2LDcgKzMwMDMsNyBAQAogICAgIHVpbnQ4X3QgaGFsZlsyNTZdOwogICAgIGNvcHlfYmxvY2sxNl9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDE2LCAgc3RyaWRlLCAyMSk7CiAgICAgcHV0X2gyNjRfcXBlbDE2X3ZfbG93cGFzc19tbWkoaGFsZiwgZnVsbF9taWQsIDE2LCAxNik7Ci0gICAgYXZnX3BpeGVsczE2X2wyX21taShkc3QsIGZ1bGxfbWlkLCBoYWxmLCBzdHJpZGUsIDE2LCAxNiwgMTYpOworICAgIGZmX2F2Z19waXhlbHMxNl9sMl84X21taShkc3QsIGZ1bGxfbWlkLCBoYWxmLCBzdHJpZGUsIDE2LCAxNiwgMTYpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTI1MjYsNyArMzAyMyw3IEBACiAgICAgdWludDhfdCBoYWxmWzI1Nl07CiAgICAgY29weV9ibG9jazE2X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgMTYsICBzdHJpZGUsIDIxKTsKICAgICBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX21taShoYWxmLCBmdWxsX21pZCwgMTYsIDE2KTsKLSAgICBhdmdfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgZnVsbF9taWQrMTYsIGhhbGYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CisgICAgZmZfYXZnX3BpeGVsczE2X2wyXzhfbW1pKGRzdCwgZnVsbF9taWQrMTYsIGhhbGYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMTFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjUzOSw3ICszMDM2LDcgQEAKICAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjLCAxNiwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrMTZfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyLCAxNiwgIHN0cmlkZSwgMjEpOwogICAgIHB1dF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgMTYsIDE2KTsKLSAgICBhdmdfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOworICAgIGZmX2F2Z19waXhlbHMxNl9sMl84X21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMzMV9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yNTUyLDcgKzMwNDksNyBAQAogICAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMsIDE2LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2sxNl9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIgKyAxLCAxNiwgIHN0cmlkZSwgMjEpOwogICAgIHB1dF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfbW1pKGhhbGZWLCBmdWxsX21pZCwgMTYsIDE2KTsKLSAgICBhdmdfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOworICAgIGZmX2F2Z19waXhlbHMxNl9sMl84X21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxM19tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCkBAIC0yNTY1LDcgKzMwNjIsNyBAQAogICAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMgKyBzdHJpZGUsIDE2LCBzdHJpZGUpOwogICAgIGNvcHlfYmxvY2sxNl9tbWkoZnVsbCwgc3JjIC0gc3RyaWRlKjIsIDE2LCAgc3RyaWRlLCAyMSk7CiAgICAgcHV0X2gyNjRfcXBlbDE2X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCAxNiwgMTYpOwotICAgIGF2Z19waXhlbHMxNl9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CisgICAgZmZfYXZnX3BpeGVsczE2X2wyXzhfbW1pKGRzdCwgaGFsZkgsIGhhbGZWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKQEAgLTI1NzgsNTkgKzMwNzUsNTkgQEAKICAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjICsgc3RyaWRlLCAxNiwgc3RyaWRlKTsKICAgICBjb3B5X2Jsb2NrMTZfbW1pKGZ1bGwsIHNyYyAtIHN0cmlkZSoyICsgMSwgMTYsICBzdHJpZGUsIDIxKTsKICAgICBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDE2LCAxNik7Ci0gICAgYXZnX3BpeGVsczE2X2wyX21taShkc3QsIGhhbGZILCBoYWxmViwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKKyAgICBmZl9hdmdfcGl4ZWxzMTZfbDJfOF9tbWkoZHN0LCBoYWxmSCwgaGFsZlYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIGF2Z19oMjY0X3FwZWwxNl9odl9sb3dwYXNzX21taShkc3QsIHNyYywgc3RyaWRlLCBzdHJpZGUpOworICAgIHVpbnQxNl90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkgdGVtcFszODRdOworCisgICAgYXZnX2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKGRzdCwgdGVtcCwgc3JjLCBzdHJpZGUsIDE2LCBzdHJpZGUpOwogfQogCiB2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzIxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB1aW50OF90IGhhbGZIWzI1Nl07Ci0gICAgdWludDhfdCBoYWxmSFZbMjU2XTsKLSAgICBwdXRfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX21taShoYWxmSCwgc3JjLCAxNiwgc3RyaWRlKTsKLSAgICBwdXRfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBzcmMsIDE2LCBzdHJpZGUpOwotICAgIGF2Z19waXhlbHMxNl9sMl9tbWkoZHN0LCBoYWxmSCwgaGFsZkhWLCBzdHJpZGUsIDE2LCAxNiwgMTYpOworICAgIHVpbnQ4X3QgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQoOCkpKSB0ZW1wWzEwMjRdOworICAgIHVpbnQ4X3QgKmNvbnN0IGhhbGZIViA9IHRlbXA7CisgICAgaW50MTZfdCAqY29uc3QgaGFsZlYgPSAoaW50MTZfdCAqKSAodGVtcCArIDI1Nik7CisKKyAgICBwdXRfaDI2NF9xcGVsMTZfaHZfbG93cGFzc19tbWkoaGFsZkhWLCBoYWxmViwgc3JjLCAxNiwgMTYsIHN0cmlkZSk7CisgICAgYXZnX2gyNjRfcXBlbDE2X2hfbG93cGFzc19sMl9tbWkoZHN0LCBzcmMsIGhhbGZIViwgc3RyaWRlLCAxNik7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3QgaGFsZkhbMjU2XTsKLSAgICB1aW50OF90IGhhbGZIVlsyNTZdOwotICAgIHB1dF9oMjY0X3FwZWwxNl9oX2xvd3Bhc3NfbW1pKGhhbGZILCBzcmMgKyBzdHJpZGUsIDE2LCBzdHJpZGUpOwotICAgIHB1dF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgMTYsIHN0cmlkZSk7Ci0gICAgYXZnX3BpeGVsczE2X2wyX21taShkc3QsIGhhbGZILCBoYWxmSFYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CisgICAgdWludDhfdCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpIHRlbXBbMTAyNF07CisgICAgdWludDhfdCAqY29uc3QgaGFsZkhWID0gdGVtcDsKKyAgICBpbnQxNl90ICpjb25zdCBoYWxmViA9IChpbnQxNl90ICopICh0ZW1wICsgMjU2KTsKKworICAgIHB1dF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX21taShoYWxmSFYsIGhhbGZWLCBzcmMsIDE2LCAxNiwgc3RyaWRlKTsKKyAgICBhdmdfaDI2NF9xcGVsMTZfaF9sb3dwYXNzX2wyX21taShkc3QsIHNyYyArIHN0cmlkZSwgaGFsZkhWLCBzdHJpZGUsIDE2KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxMl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBmdWxsWzMzNl07Ci0gICAgdWludDhfdCAqIGNvbnN0IGZ1bGxfbWlkPSBmdWxsICsgMzI7Ci0gICAgdWludDhfdCBoYWxmVlsyNTZdOwotICAgIHVpbnQ4X3QgaGFsZkhWWzI1Nl07Ci0gICAgY29weV9ibG9jazE2X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiwgMTYsICBzdHJpZGUsIDIxKTsKLSAgICBwdXRfaDI2NF9xcGVsMTZfdl9sb3dwYXNzX21taShoYWxmViwgZnVsbF9taWQsIDE2LCAxNik7Ci0gICAgcHV0X2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgc3JjLCAxNiwgc3RyaWRlKTsKLSAgICBhdmdfcGl4ZWxzMTZfbDJfbW1pKGRzdCwgaGFsZlYsIGhhbGZIViwgc3RyaWRlLCAxNiwgMTYsIDE2KTsKKyAgICB1aW50OF90IF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDgpKSkgdGVtcFsxMDI0XTsKKyAgICB1aW50OF90ICpjb25zdCBoYWxmSFYgPSB0ZW1wOworICAgIGludDE2X3QgKmNvbnN0IGhhbGZWID0gKGludDE2X3QgKikgKHRlbXAgKyAyNTYpOworCisgICAgcHV0X2gyNjRfcXBlbDE2X2h2X2xvd3Bhc3NfbW1pKGhhbGZIViwgaGFsZlYsIHNyYywgMTYsIDE2LCBzdHJpZGUpOworICAgIGF2Z19waXhlbHMxNl9sMl9zaGlmdDVfbW1pKGRzdCwgaGFsZlYgKyAyLCBoYWxmSFYsIHN0cmlkZSwgMTYsIDE2KTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMzMl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBmdWxsWzMzNl07Ci0gICAgdWludDhfdCAqIGNvbnN0IGZ1bGxfbWlkPSBmdWxsICsgMzI7Ci0gICAgdWludDhfdCBoYWxmVlsyNTZdOwotICAgIHVpbnQ4X3QgaGFsZkhWWzI1Nl07Ci0gICAgY29weV9ibG9jazE2X21taShmdWxsLCBzcmMgLSBzdHJpZGUqMiArIDEsIDE2LCAgc3RyaWRlLCAyMSk7Ci0gICAgcHV0X2gyNjRfcXBlbDE2X3ZfbG93cGFzc19tbWkoaGFsZlYsIGZ1bGxfbWlkLCAxNiwgMTYpOwotICAgIHB1dF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX21taShoYWxmSFYsIHNyYywgMTYsIHN0cmlkZSk7Ci0gICAgYXZnX3BpeGVsczE2X2wyX21taShkc3QsIGhhbGZWLCBoYWxmSFYsIHN0cmlkZSwgMTYsIDE2LCAxNik7CisgICAgdWludDhfdCBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCg4KSkpIHRlbXBbMTAyNF07CisgICAgdWludDhfdCAqY29uc3QgaGFsZkhWID0gdGVtcDsKKyAgICBpbnQxNl90ICpjb25zdCBoYWxmViA9IChpbnQxNl90ICopICh0ZW1wICsgMjU2KTsKKworICAgIHB1dF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX21taShoYWxmSFYsIGhhbGZWLCBzcmMsIDE2LCAxNiwgc3RyaWRlKTsKKyAgICBhdmdfcGl4ZWxzMTZfbDJfc2hpZnQ1X21taShkc3QsIGhhbGZWICsgMywgaGFsZkhWLCBzdHJpZGUsIDE2LCAxNik7CiB9CiAKICN1bmRlZiBvcDJfYXZnCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaDI2NHFwZWxfbXNhLmMgYi9saWJhdmNvZGVjL21pcHMvaDI2NHFwZWxfbXNhLmMKaW5kZXggYzM4ZjFmNy4uOWM3NzliZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2gyNjRxcGVsX21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oMjY0cXBlbF9tc2EuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUgUGFyYWcgU2FsYXNha2FyIChQYXJhZy5TYWxhc2FrYXJAaW1ndGVjLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAxNSAtMjAxNyBQYXJhZyBTYWxhc2FrYXIgKFBhcmFnLlNhbGFzYWthckBpbWd0ZWMuY29tKQogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0yMSw1MCArMjEsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL2dlbmVyaWNfbWFjcm9zX21zYS5oIgogI2luY2x1ZGUgImgyNjRkc3BfbWlwcy5oIgogCi0jZGVmaW5lIEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfU0goaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSkgICAgXAotKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2NGkzMiB0bXAwX20sIHRtcDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjhpMTYgb3V0MF9tLCBvdXQxX20sIG91dDJfbSwgb3V0M19tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHY4aTE2IG1pbnVzNWhfbSA9IF9fbXNhX2xkaV9oKC01KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2OGkxNiBwbHVzMjBoX20gPSBfX21zYV9sZGlfaCgyMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIElMVlJMX0gyX1NXKGluNSwgaW4wLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wMF9tID0gX19tc2FfaGFkZF9zX3coKHY4aTE2KSB0bXAwX20sICh2OGkxNikgdG1wMF9tKTsgICAgICAgICAgICAgXAotICAgIHRtcDFfbSA9IF9fbXNhX2hhZGRfc193KCh2OGkxNikgdG1wMV9tLCAodjhpMTYpIHRtcDFfbSk7ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgSUxWUkxfSDJfU0goaW4xLCBpbjQsIG91dDBfbSwgb3V0MV9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERQQUREX1NIMl9TVyhvdXQwX20sIG91dDFfbSwgbWludXM1aF9tLCBtaW51czVoX20sIHRtcDBfbSwgdG1wMV9tKTsgIFwKLSAgICBJTFZSTF9IMl9TSChpbjIsIGluMywgb3V0Ml9tLCBvdXQzX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRFBBRERfU0gyX1NXKG91dDJfbSwgb3V0M19tLCBwbHVzMjBoX20sIHBsdXMyMGhfbSwgdG1wMF9tLCB0bXAxX20pOyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTUkFSSV9XMl9TVyh0bXAwX20sIHRtcDFfbSwgMTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU0FUX1NXMl9TVyh0bXAwX20sIHRtcDFfbSwgNyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG91dDBfbSA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX20sICh2OGkxNikgdG1wMF9tKTsgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSApCi0KLSNkZWZpbmUgQVZDX0hPUlpfRklMVEVSX1NIKGluLCBtYXNrMCwgbWFzazEsIG1hc2syKSAgICAgXAotKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjhpMTYgb3V0MF9tLCBvdXQxX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2MTZpOCB0bXAwX20sIHRtcDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcDBfbSA9IF9fbXNhX3ZzaGZfYigodjE2aTgpIG1hc2swLCBpbiwgaW4pOyAgICAgICBcCi0gICAgb3V0MF9tID0gX19tc2FfaGFkZF9zX2godG1wMF9tLCB0bXAwX20pOyAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcDBfbSA9IF9fbXNhX3ZzaGZfYigodjE2aTgpIG1hc2sxLCBpbiwgaW4pOyAgICAgICBcCi0gICAgb3V0MF9tID0gX19tc2FfZHBhZGRfc19oKG91dDBfbSwgbWludXM1YiwgdG1wMF9tKTsgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcDFfbSA9IF9fbXNhX3ZzaGZfYigodjE2aTgpIChtYXNrMiksIGluLCBpbik7ICAgICBcCi0gICAgb3V0MV9tID0gX19tc2FfZHBhZGRfc19oKG91dDBfbSwgcGx1czIwYiwgdG1wMV9tKTsgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG91dDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19ICkKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgbHVtYV9tYXNrX2FyclsxNiAqIDhdID0geworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbHVtYV9tYXNrX2FyclsxNiAqIDZdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMHg0MCkpKSA9IHsKICAgICAvKiA4IHdpZHRoIGNhc2VzICovCiAgICAgMCwgNSwgMSwgNiwgMiwgNywgMywgOCwgNCwgOSwgNSwgMTAsIDYsIDExLCA3LCAxMiwKICAgICAxLCA0LCAyLCA1LCAzLCA2LCA0LCA3LCA1LCA4LCA2LCA5LCA3LCAxMCwgOCwgMTEsCkBAIC03NCw5ICszMSw2IEBACiAgICAgMCwgNSwgMSwgNiwgMiwgNywgMywgOCwgMTYsIDIxLCAxNywgMjIsIDE4LCAyMywgMTksIDI0LAogICAgIDEsIDQsIDIsIDUsIDMsIDYsIDQsIDcsIDE3LCAyMCwgMTgsIDIxLCAxOSwgMjIsIDIwLCAyMywKICAgICAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsCi0KLSAgICAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAyNCwgMjUsCi0gICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMjQsIDI1LCAyNgogfTsKIAogI2RlZmluZSBBVkNfQ0FMQ19EUEFERF9CXzZQSVhfMkNPRUZGX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsICBcCkBAIC05NCwxNTYgKzQ4LDEwMzMgQEAKICAgICBEUEFERF9TQjJfU0godG1wMF9tLCB0bXAxX20sIHBsdXMyMGJfbSwgcGx1czIwYl9tLCBvdXQxLCBvdXQyKTsgICAgICAgICAgXAogfQogCi0jZGVmaW5lIEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfUl9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1KSAgXAotKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2OGkxNiB0bXAxX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2aTggdG1wMF9tLCB0bXAyX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHYxNmk4IG1pbnVzNWJfbSA9IF9fbXNhX2xkaV9iKC01KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2MTZpOCBwbHVzMjBiX20gPSBfX21zYV9sZGlfYigyMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcDFfbSA9ICh2OGkxNikgX19tc2FfaWx2cl9iKCh2MTZpOCkgdmVjNSwgKHYxNmk4KSB2ZWMwKTsgICAgICAgICAgICAgICAgIFwKLSAgICB0bXAxX20gPSBfX21zYV9oYWRkX3NfaCgodjE2aTgpIHRtcDFfbSwgKHYxNmk4KSB0bXAxX20pOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIElMVlJfQjJfU0IodmVjNCwgdmVjMSwgdmVjMywgdmVjMiwgdG1wMF9tLCB0bXAyX20pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEUEFERF9TQjJfU0godG1wMF9tLCB0bXAyX20sIG1pbnVzNWJfbSwgcGx1czIwYl9tLCB0bXAxX20sIHRtcDFfbSk7ICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQVZDX0hPUlpfRklMVEVSX1NIKGluMCwgaW4xLCBtYXNrMCwgbWFzazEsIG1hc2syKSAgXAorKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjhpMTYgb3V0MF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2MTZpOCB0bXAwX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDBfbSA9IF9fbXNhX3ZzaGZfYigodjE2aTgpIG1hc2swLCBpbjEsIGluMCk7ICAgICAgICBcCisgICAgb3V0MF9tID0gX19tc2FfaGFkZF9zX2godG1wMF9tLCB0bXAwX20pOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDBfbSA9IF9fbXNhX3ZzaGZfYigodjE2aTgpIG1hc2sxLCBpbjEsIGluMCk7ICAgICAgICBcCisgICAgb3V0MF9tID0gX19tc2FfZHBhZGRfc19oKG91dDBfbSwgbWludXM1YiwgdG1wMF9tKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDBfbSA9IF9fbXNhX3ZzaGZfYigodjE2aTgpIG1hc2syLCBpbjEsIGluMCk7ICAgICAgICBcCisgICAgb3V0MF9tID0gX19tc2FfZHBhZGRfc19oKG91dDBfbSwgcGx1czIwYiwgdG1wMF9tKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDBfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9ICkKIAotI2RlZmluZSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1JfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSkgIFwKLSggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjRpMzIgdG1wMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHY4aTE2IHRtcDJfbSwgdG1wM19tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2OGkxNiBtaW51czVoX20gPSBfX21zYV9sZGlfaCgtNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjhpMTYgcGx1czIwaF9tID0gX19tc2FfbGRpX2goMjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXAxX20gPSAodjRpMzIpIF9fbXNhX2lsdnJfaCgodjhpMTYpIHZlYzUsICh2OGkxNikgdmVjMCk7ICAgICAgICAgICAgICAgICBcCi0gICAgdG1wMV9tID0gX19tc2FfaGFkZF9zX3coKHY4aTE2KSB0bXAxX20sICh2OGkxNikgdG1wMV9tKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBJTFZSX0gyX1NIKHZlYzEsIHZlYzQsIHZlYzIsIHZlYzMsIHRtcDJfbSwgdG1wM19tKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRFBBRERfU0gyX1NXKHRtcDJfbSwgdG1wM19tLCBtaW51czVoX20sIHBsdXMyMGhfbSwgdG1wMV9tLCB0bXAxX20pOyAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXAxX20gPSBfX21zYV9zcmFyaV93KHRtcDFfbSwgMTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wMV9tID0gX19tc2Ffc2F0X3Nfdyh0bXAxX20sIDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXAyX20gPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMV9tLCAodjhpMTYpIHRtcDFfbSk7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRtcDJfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQVZDX0RPVF9TSDNfU0goaW4wLCBpbjEsIGluMiwgY29lZmYwLCBjb2VmZjEsIGNvZWZmMikgICAgICAgXAorKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjhpMTYgb3V0MF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDBfbSA9IF9fbXNhX2RvdHBfc19oKCh2MTZpOCkgaW4wLCAodjE2aTgpIGNvZWZmMCk7ICAgICAgICAgICBcCisgICAgb3V0MF9tID0gX19tc2FfZHBhZGRfc19oKG91dDBfbSwgKHYxNmk4KSBpbjEsICh2MTZpOCkgY29lZmYxKTsgIFwKKyAgICBvdXQwX20gPSBfX21zYV9kcGFkZF9zX2gob3V0MF9tLCAodjE2aTgpIGluMiwgKHYxNmk4KSBjb2VmZjIpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0MF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gKQogCi0jZGVmaW5lIEFWQ19YT1JfVlNIRl9CX0FORF9BUFBMWV82VEFQX0hPUklaX0ZJTFRfU0goc3JjMCwgc3JjMSwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMCwgbWFzazEsIG1hc2syKSAgICAgXAotKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjhpMTYgaHpfb3V0X207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2MTZpOCB2ZWMwX20sIHZlYzFfbSwgdmVjMl9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHYxNmk4IG1pbnVzNWJfbSA9IF9fbXNhX2xkaV9iKC01KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2aTggcGx1czIwYl9tID0gX19tc2FfbGRpX2IoMjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZlYzBfbSA9IF9fbXNhX3ZzaGZfYigodjE2aTgpIG1hc2swLCAodjE2aTgpIHNyYzEsICh2MTZpOCkgc3JjMCk7ICAgICAgICBcCi0gICAgaHpfb3V0X20gPSBfX21zYV9oYWRkX3NfaCh2ZWMwX20sIHZlYzBfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazEsIG1hc2syLCB2ZWMxX20sIHZlYzJfbSk7ICAgICAgICBcCi0gICAgRFBBRERfU0IyX1NIKHZlYzFfbSwgdmVjMl9tLCBtaW51czViX20sIHBsdXMyMGJfbSwgaHpfb3V0X20sIGh6X291dF9tKTsgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGh6X291dF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIEFWQ19ET1RfU1czX1NXKGluMCwgaW4xLCBpbjIsIGNvZWZmMCwgY29lZmYxLCBjb2VmZjIpICAgICAgIFwKKyggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHY0aTMyIG91dDBfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQwX20gPSBfX21zYV9kb3RwX3NfdygodjhpMTYpIGluMCwgKHY4aTE2KSBjb2VmZjApOyAgICAgICAgICAgXAorICAgIG91dDBfbSA9IF9fbXNhX2RwYWRkX3NfdyhvdXQwX20sICh2OGkxNikgaW4xLCAodjhpMTYpIGNvZWZmMSk7ICBcCisgICAgb3V0MF9tID0gX19tc2FfZHBhZGRfc193KG91dDBfbSwgKHY4aTE2KSBpbjIsICh2OGkxNikgY29lZmYyKTsgIFwKKyAgICBvdXQwX20gPSBfX21zYV9zcmFyaV93KG91dDBfbSwgMTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDBfbSA9IF9fbXNhX3NhdF9zX3cob3V0MF9tLCA3KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0MF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gKQogCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9oel80d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCitzdGF0aWMgdm9pZCBhdmNfbHVtYV9odl9xcnRfNHg0X21zYShjb25zdCB1aW50OF90ICpzcmNfeCwgY29uc3QgdWludDhfdCAqc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3Qgc3RyaWRlKQoreworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgdjE2dTggb3V0OworICAgIHYxNmk4IHNyY19oejAsIHNyY19oejEsIHNyY19oejIsIHNyY19oejMsIHNyY192dDcsIHNyY192dDg7CisgICAgdjE2aTggc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCwgc3JjX3Z0NSwgc3JjX3Z0NjsKKyAgICB2MTZpOCBzcmNfdnQxMF9yLCBzcmNfdnQzMl9yLCBzcmNfdnQ1NF9yLCBzcmNfdnQ3Nl9yOworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgdnRfb3V0MCwgdnRfb3V0MSwgb3V0MCwgb3V0MTsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgTERfU0I1KHNyY195LCBzdHJpZGUsIHNyY192dDAsIHNyY192dDEsIHNyY192dDIsIHNyY192dDMsIHNyY192dDQpOworICAgIHNyY195ICs9ICg1ICogc3RyaWRlKTsKKworICAgIHNyY192dDAgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQwLCAxLCAodjRpMzIpIHNyY192dDEpOworICAgIHNyY192dDEgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQxLCAxLCAodjRpMzIpIHNyY192dDIpOworICAgIHNyY192dDIgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQyLCAxLCAodjRpMzIpIHNyY192dDMpOworICAgIHNyY192dDMgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQzLCAxLCAodjRpMzIpIHNyY192dDQpOworCisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Myk7CisKKyAgICBMRF9TQjQoc3JjX3gsIHN0cmlkZSwgc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Myk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Myk7CisgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHowLCBzcmNfaHoxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejIsIHNyY19oejMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgU1JBUklfSDJfU0goaHpfb3V0MCwgaHpfb3V0MSwgNSk7CisgICAgU0FUX1NIMl9TSChoel9vdXQwLCBoel9vdXQxLCA3KTsKKworICAgIExEX1NCNChzcmNfeSwgc3RyaWRlLCBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3LCBzcmNfdnQ4KTsKKworICAgIHNyY192dDQgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQ0LCAxLCAodjRpMzIpIHNyY192dDUpOworICAgIHNyY192dDUgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQ1LCAxLCAodjRpMzIpIHNyY192dDYpOworICAgIHNyY192dDYgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQ2LCAxLCAodjRpMzIpIHNyY192dDcpOworICAgIHNyY192dDcgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQ3LCAxLCAodjRpMzIpIHNyY192dDgpOworCisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjX3Z0NCwgc3JjX3Z0NSwgc3JjX3Z0Niwgc3JjX3Z0Nyk7CisgICAgSUxWUl9CMl9TQihzcmNfdnQxLCBzcmNfdnQwLCBzcmNfdnQzLCBzcmNfdnQyLCBzcmNfdnQxMF9yLCBzcmNfdnQzMl9yKTsKKyAgICBJTFZSX0IyX1NCKHNyY192dDUsIHNyY192dDQsIHNyY192dDcsIHNyY192dDYsIHNyY192dDU0X3IsIHNyY192dDc2X3IpOworICAgIHZ0X291dDAgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQxMF9yLCBzcmNfdnQzMl9yLCBzcmNfdnQ1NF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB2dF9vdXQxID0gQVZDX0RPVF9TSDNfU0goc3JjX3Z0MzJfciwgc3JjX3Z0NTRfciwgc3JjX3Z0NzZfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgU1JBUklfSDJfU0godnRfb3V0MCwgdnRfb3V0MSwgNSk7CisgICAgU0FUX1NIMl9TSCh2dF9vdXQwLCB2dF9vdXQxLCA3KTsKKworICAgIG91dDAgPSBfX21zYV9zcmFyaV9oKChoel9vdXQwICsgdnRfb3V0MCksIDEpOworICAgIG91dDEgPSBfX21zYV9zcmFyaV9oKChoel9vdXQxICsgdnRfb3V0MSksIDEpOworCisgICAgU0FUX1NIMl9TSChvdXQwLCBvdXQxLCA3KTsKKyAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19sdW1hX2h2X3FydF84eDhfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyY194LCBjb25zdCB1aW50OF90ICpzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBzdHJpZGUpCit7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyY19oejAsIHNyY19oejEsIHNyY19oejIsIHNyY19oejMsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjE2aTggc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCwgc3JjX3Z0NSwgc3JjX3Z0NjsKKyAgICB2MTZpOCBzcmNfdnQ3LCBzcmNfdnQ4LCBzcmNfdnQ5LCBzcmNfdnQxMCwgc3JjX3Z0MTEsIHNyY192dDEyOworICAgIHYxNmk4IHNyY192dDEwX3IsIHNyY192dDIxX3IsIHNyY192dDMyX3IsIHNyY192dDQzX3IsIHNyY192dDU0X3I7CisgICAgdjE2aTggc3JjX3Z0NjVfciwgc3JjX3Z0NzZfciwgc3JjX3Z0ODdfciwgc3JjX3Z0OThfciwgc3JjX3Z0MTA5X3I7CisgICAgdjE2aTggc3JjX3Z0MTExMF9yLCBzcmNfdnQxMjExX3IsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgdnRfb3V0MCwgdnRfb3V0MSwgdnRfb3V0MjsKKyAgICB2OGkxNiB2dF9vdXQzLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworCisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBMRF9TQjUoc3JjX3ksIHN0cmlkZSwgc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7CisgICAgc3JjX3kgKz0gKDUgKiBzdHJpZGUpOworCisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7CisKKyAgICBMRF9TQjQoc3JjX3gsIHN0cmlkZSwgc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Myk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Myk7CisgICAgc3JjX3ggKz0gKDQgKiBzdHJpZGUpOworCisgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHowLCBzcmNfaHowLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejEsIHNyY19oejEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6Miwgc3JjX2h6MiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHozLCBzcmNfaHozLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIFNSQVJJX0g0X1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIDUpOworICAgIFNBVF9TSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNyk7CisKKyAgICBMRF9TQjQoc3JjX3ksIHN0cmlkZSwgc3JjX3Z0NSwgc3JjX3Z0Niwgc3JjX3Z0Nywgc3JjX3Z0OCk7CisgICAgc3JjX3kgKz0gKDQgKiBzdHJpZGUpOworICAgIFhPUklfQjRfMTI4X1NCKHNyY192dDUsIHNyY192dDYsIHNyY192dDcsIHNyY192dDgpOworCisgICAgSUxWUl9CNF9TQihzcmNfdnQxLCBzcmNfdnQwLCBzcmNfdnQyLCBzcmNfdnQxLCBzcmNfdnQzLCBzcmNfdnQyLCBzcmNfdnQ0LAorICAgICAgICAgICAgICAgc3JjX3Z0Mywgc3JjX3Z0MTBfciwgc3JjX3Z0MjFfciwgc3JjX3Z0MzJfciwgc3JjX3Z0NDNfcik7CisgICAgSUxWUl9CNF9TQihzcmNfdnQ1LCBzcmNfdnQ0LCBzcmNfdnQ2LCBzcmNfdnQ1LCBzcmNfdnQ3LCBzcmNfdnQ2LCBzcmNfdnQ4LAorICAgICAgICAgICAgICAgc3JjX3Z0Nywgc3JjX3Z0NTRfciwgc3JjX3Z0NjVfciwgc3JjX3Z0NzZfciwgc3JjX3Z0ODdfcik7CisgICAgdnRfb3V0MCA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDEwX3IsIHNyY192dDMyX3IsIHNyY192dDU0X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHZ0X291dDEgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQyMV9yLCBzcmNfdnQ0M19yLCBzcmNfdnQ2NV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB2dF9vdXQyID0gQVZDX0RPVF9TSDNfU0goc3JjX3Z0MzJfciwgc3JjX3Z0NTRfciwgc3JjX3Z0NzZfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdnRfb3V0MyA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDQzX3IsIHNyY192dDY1X3IsIHNyY192dDg3X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIFNSQVJJX0g0X1NIKHZ0X291dDAsIHZ0X291dDEsIHZ0X291dDIsIHZ0X291dDMsIDUpOworICAgIFNBVF9TSDRfU0godnRfb3V0MCwgdnRfb3V0MSwgdnRfb3V0MiwgdnRfb3V0MywgNyk7CisKKyAgICB0bXAwID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MCArIHZ0X291dDApLCAxKTsKKyAgICB0bXAxID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MSArIHZ0X291dDEpLCAxKTsKKyAgICB0bXAyID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MiArIHZ0X291dDIpLCAxKTsKKyAgICB0bXAzID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MyArIHZ0X291dDMpLCAxKTsKKworICAgIExEX1NCNChzcmNfeCwgc3RyaWRlLCBzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKKworICAgIFNBVF9TSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMiwgdG1wMyk7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICBMRF9TQjQoc3JjX3ksIHN0cmlkZSwgc3JjX3Z0OSwgc3JjX3Z0MTAsIHNyY192dDExLCBzcmNfdnQxMik7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjX3Z0OSwgc3JjX3Z0MTAsIHNyY192dDExLCBzcmNfdnQxMik7CisKKyAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejAsIHNyY19oejAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6MSwgc3JjX2h6MSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHoyLCBzcmNfaHoyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQzID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejMsIHNyY19oejMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgU1JBUklfSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNSk7CisgICAgU0FUX1NINF9TSChoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCA3KTsKKworICAgIElMVlJfQjRfU0Ioc3JjX3Z0OSwgc3JjX3Z0OCwgc3JjX3Z0MTAsIHNyY192dDksIHNyY192dDExLCBzcmNfdnQxMCwKKyAgICAgICAgICAgICAgIHNyY192dDEyLCBzcmNfdnQxMSwgc3JjX3Z0OThfciwgc3JjX3Z0MTA5X3IsIHNyY192dDExMTBfciwKKyAgICAgICAgICAgICAgIHNyY192dDEyMTFfcik7CisgICAgdnRfb3V0MCA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDU0X3IsIHNyY192dDc2X3IsIHNyY192dDk4X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHZ0X291dDEgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQ2NV9yLCBzcmNfdnQ4N19yLCBzcmNfdnQxMDlfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdnRfb3V0MiA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDc2X3IsIHNyY192dDk4X3IsIHNyY192dDExMTBfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdnRfb3V0MyA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDg3X3IsIHNyY192dDEwOV9yLCBzcmNfdnQxMjExX3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgIFNSQVJJX0g0X1NIKHZ0X291dDAsIHZ0X291dDEsIHZ0X291dDIsIHZ0X291dDMsIDUpOworICAgIFNBVF9TSDRfU0godnRfb3V0MCwgdnRfb3V0MSwgdnRfb3V0MiwgdnRfb3V0MywgNyk7CisKKyAgICB0bXAwID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MCArIHZ0X291dDApLCAxKTsKKyAgICB0bXAxID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MSArIHZ0X291dDEpLCAxKTsKKyAgICB0bXAyID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MiArIHZ0X291dDIpLCAxKTsKKyAgICB0bXAzID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MyArIHZ0X291dDMpLCAxKTsKKworICAgIFNBVF9TSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMiwgdG1wMyk7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19sdW1hX2h2X3FydF8xNngxNl9tc2EoY29uc3QgdWludDhfdCAqc3JjX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195LCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlKQoreworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgY29uc3QgdWludDhfdCAqc3JjX3hfdG1wID0gc3JjX3g7CisgICAgY29uc3QgdWludDhfdCAqc3JjX3lfdG1wID0gc3JjX3k7CisgICAgdWludDhfdCAqZHN0X3RtcCA9IGRzdDsKKyAgICB1aW50MzJfdCBtdWx0aXBsZThfY250LCBsb29wX2NudDsKKyAgICB2MTZ1OCB0bXAwLCB0bXAxOworICAgIHYxNmk4IHNyY19oejAsIHNyY19oejEsIHNyY19oejIsIHNyY19oejMsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjE2aTggc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCwgc3JjX3Z0NSwgc3JjX3Z0NjsKKyAgICB2MTZpOCBzcmNfdnQ3LCBzcmNfdnQ4OworICAgIHYxNmk4IHNyY192dDEwX3IsIHNyY192dDIxX3IsIHNyY192dDMyX3IsIHNyY192dDQzX3IsIHNyY192dDU0X3I7CisgICAgdjE2aTggc3JjX3Z0NjVfciwgc3JjX3Z0NzZfciwgc3JjX3Z0ODdfciwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCB2dF9vdXQwLCB2dF9vdXQxLCB2dF9vdXQyOworICAgIHY4aTE2IHZ0X291dDMsIG91dDAsIG91dDEsIG91dDIsIG91dDM7CisKKyAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKKworICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZm9yIChtdWx0aXBsZThfY250ID0gMjsgbXVsdGlwbGU4X2NudC0tOykgeworICAgICAgICBzcmNfeCA9IHNyY194X3RtcDsKKyAgICAgICAgc3JjX3kgPSBzcmNfeV90bXA7CisgICAgICAgIGRzdCA9IGRzdF90bXA7CisKKyAgICAgICAgTERfU0I1KHNyY195LCBzdHJpZGUsIHNyY192dDAsIHNyY192dDEsIHNyY192dDIsIHNyY192dDMsIHNyY192dDQpOworICAgICAgICBzcmNfeSArPSAoNSAqIHN0cmlkZSk7CisKKyAgICAgICAgWE9SSV9CNV8xMjhfU0Ioc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7CisKKyAgICAgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgICAgICBMRF9TQjQoc3JjX3gsIHN0cmlkZSwgc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Myk7CisgICAgICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKKyAgICAgICAgICAgIHNyY194ICs9ICg0ICogc3RyaWRlKTsKKworICAgICAgICAgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHowLCBzcmNfaHowLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6MSwgc3JjX2h6MSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejIsIHNyY19oejIsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHozLCBzcmNfaHozLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIFNSQVJJX0g0X1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIDUpOworICAgICAgICAgICAgU0FUX1NINF9TSChoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCA3KTsKKworICAgICAgICAgICAgTERfU0I0KHNyY195LCBzdHJpZGUsIHNyY192dDUsIHNyY192dDYsIHNyY192dDcsIHNyY192dDgpOworICAgICAgICAgICAgc3JjX3kgKz0gKDQgKiBzdHJpZGUpOworCisgICAgICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3LCBzcmNfdnQ4KTsKKyAgICAgICAgICAgIElMVlJfQjRfU0Ioc3JjX3Z0MSwgc3JjX3Z0MCwgc3JjX3Z0Miwgc3JjX3Z0MSwgc3JjX3Z0Mywgc3JjX3Z0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Z0NCwgc3JjX3Z0Mywgc3JjX3Z0MTBfciwgc3JjX3Z0MjFfciwgc3JjX3Z0MzJfciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Z0NDNfcik7CisgICAgICAgICAgICBJTFZSX0I0X1NCKHNyY192dDUsIHNyY192dDQsIHNyY192dDYsIHNyY192dDUsIHNyY192dDcsIHNyY192dDYsCisgICAgICAgICAgICAgICAgICAgICAgIHNyY192dDgsIHNyY192dDcsIHNyY192dDU0X3IsIHNyY192dDY1X3IsIHNyY192dDc2X3IsCisgICAgICAgICAgICAgICAgICAgICAgIHNyY192dDg3X3IpOworICAgICAgICAgICAgdnRfb3V0MCA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDEwX3IsIHNyY192dDMyX3IsIHNyY192dDU0X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB2dF9vdXQxID0gQVZDX0RPVF9TSDNfU0goc3JjX3Z0MjFfciwgc3JjX3Z0NDNfciwgc3JjX3Z0NjVfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHZ0X291dDIgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQzMl9yLCBzcmNfdnQ1NF9yLCBzcmNfdnQ3Nl9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdnRfb3V0MyA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDQzX3IsIHNyY192dDY1X3IsIHNyY192dDg3X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICBTUkFSSV9INF9TSCh2dF9vdXQwLCB2dF9vdXQxLCB2dF9vdXQyLCB2dF9vdXQzLCA1KTsKKyAgICAgICAgICAgIFNBVF9TSDRfU0godnRfb3V0MCwgdnRfb3V0MSwgdnRfb3V0MiwgdnRfb3V0MywgNyk7CisKKyAgICAgICAgICAgIG91dDAgPSBfX21zYV9zcmFyaV9oKChoel9vdXQwICsgdnRfb3V0MCksIDEpOworICAgICAgICAgICAgb3V0MSA9IF9fbXNhX3NyYXJpX2goKGh6X291dDEgKyB2dF9vdXQxKSwgMSk7CisgICAgICAgICAgICBvdXQyID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MiArIHZ0X291dDIpLCAxKTsKKyAgICAgICAgICAgIG91dDMgPSBfX21zYV9zcmFyaV9oKChoel9vdXQzICsgdnRfb3V0MyksIDEpOworCisgICAgICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOworICAgICAgICAgICAgdG1wMCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CisgICAgICAgICAgICB0bXAxID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKKyAgICAgICAgICAgIFNUOHg0X1VCKHRtcDAsIHRtcDEsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIHNyY192dDAgPSBzcmNfdnQ0OworICAgICAgICAgICAgc3JjX3Z0MSA9IHNyY192dDU7CisgICAgICAgICAgICBzcmNfdnQyID0gc3JjX3Z0NjsKKyAgICAgICAgICAgIHNyY192dDMgPSBzcmNfdnQ3OworICAgICAgICAgICAgc3JjX3Z0NCA9IHNyY192dDg7CisgICAgICAgIH0KKworICAgICAgICBzcmNfeF90bXAgKz0gODsKKyAgICAgICAgc3JjX3lfdG1wICs9IDg7CisgICAgICAgIGRzdF90bXAgKz0gODsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfNHg0X21zYShjb25zdCB1aW50OF90ICpzcmNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUpCit7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgdjE2dTggcmVzLCBkc3QwID0geyAwIH07CisgICAgdjE2aTggc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Mywgc3JjX3Z0Nywgc3JjX3Z0ODsKKyAgICB2MTZpOCBzcmNfdnQwLCBzcmNfdnQxLCBzcmNfdnQyLCBzcmNfdnQzLCBzcmNfdnQ0LCBzcmNfdnQ1LCBzcmNfdnQ2OworICAgIHYxNmk4IHNyY192dDEwX3IsIHNyY192dDMyX3IsIHNyY192dDU0X3IsIHNyY192dDc2X3I7CisgICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMiwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCB2dF9vdXQwLCB2dF9vdXQxLCByZXMwLCByZXMxOworCisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbNDhdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBMRF9TQjUoc3JjX3ksIHN0cmlkZSwgc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7CisgICAgc3JjX3kgKz0gKDUgKiBzdHJpZGUpOworCisgICAgc3JjX3Z0MCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDAsIDEsICh2NGkzMikgc3JjX3Z0MSk7CisgICAgc3JjX3Z0MSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDEsIDEsICh2NGkzMikgc3JjX3Z0Mik7CisgICAgc3JjX3Z0MiA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDIsIDEsICh2NGkzMikgc3JjX3Z0Myk7CisgICAgc3JjX3Z0MyA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDMsIDEsICh2NGkzMikgc3JjX3Z0NCk7CisKKyAgICBYT1JJX0I0XzEyOF9TQihzcmNfdnQwLCBzcmNfdnQxLCBzcmNfdnQyLCBzcmNfdnQzKTsKKworICAgIExEX1NCNChzcmNfeCwgc3RyaWRlLCBzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKKyAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejAsIHNyY19oejEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6Miwgc3JjX2h6MywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBTUkFSSV9IMl9TSChoel9vdXQwLCBoel9vdXQxLCA1KTsKKyAgICBTQVRfU0gyX1NIKGh6X291dDAsIGh6X291dDEsIDcpOworCisgICAgTERfU0I0KHNyY195LCBzdHJpZGUsIHNyY192dDUsIHNyY192dDYsIHNyY192dDcsIHNyY192dDgpOworCisgICAgc3JjX3Z0NCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDQsIDEsICh2NGkzMikgc3JjX3Z0NSk7CisgICAgc3JjX3Z0NSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDUsIDEsICh2NGkzMikgc3JjX3Z0Nik7CisgICAgc3JjX3Z0NiA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDYsIDEsICh2NGkzMikgc3JjX3Z0Nyk7CisgICAgc3JjX3Z0NyA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDcsIDEsICh2NGkzMikgc3JjX3Z0OCk7CisKKyAgICBYT1JJX0I0XzEyOF9TQihzcmNfdnQ0LCBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3KTsKKyAgICBJTFZSX0IyX1NCKHNyY192dDEsIHNyY192dDAsIHNyY192dDMsIHNyY192dDIsIHNyY192dDEwX3IsIHNyY192dDMyX3IpOworICAgIElMVlJfQjJfU0Ioc3JjX3Z0NSwgc3JjX3Z0NCwgc3JjX3Z0Nywgc3JjX3Z0Niwgc3JjX3Z0NTRfciwgc3JjX3Z0NzZfcik7CisgICAgdnRfb3V0MCA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDEwX3IsIHNyY192dDMyX3IsIHNyY192dDU0X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHZ0X291dDEgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQzMl9yLCBzcmNfdnQ1NF9yLCBzcmNfdnQ3Nl9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBTUkFSSV9IMl9TSCh2dF9vdXQwLCB2dF9vdXQxLCA1KTsKKyAgICBTQVRfU0gyX1NIKHZ0X291dDAsIHZ0X291dDEsIDcpOworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKworICAgIHJlczEgPSBfX21zYV9zcmFyaV9oKChoel9vdXQxICsgdnRfb3V0MSksIDEpOworICAgIHJlczAgPSBfX21zYV9zcmFyaV9oKChoel9vdXQwICsgdnRfb3V0MCksIDEpOworCisgICAgU0FUX1NIMl9TSChyZXMwLCByZXMxLCA3KTsKKyAgICByZXMgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczEpOworICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYihyZXMsIGRzdDApOworCisgICAgU1Q0eDRfVUIoZHN0MCwgZHN0MCwgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0Xzh4OF9tc2EoY29uc3QgdWludDhfdCAqc3JjX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlKQoreworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IG91dDAsIG91dDEsIGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9OworICAgIHYxNmk4IHNyY19oejAsIHNyY19oejEsIHNyY19oejIsIHNyY19oejMsIHNyY192dDAsIHNyY192dDEsIHNyY192dDI7CisgICAgdjE2aTggc3JjX3Z0Mywgc3JjX3Z0NCwgc3JjX3Z0NSwgc3JjX3Z0Niwgc3JjX3Z0Nywgc3JjX3Z0ODsKKyAgICB2MTZpOCBzcmNfdnQ5LCBzcmNfdnQxMCwgc3JjX3Z0MTEsIHNyY192dDEyLCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHYxNmk4IHNyY192dDEwX3IsIHNyY192dDIxX3IsIHNyY192dDMyX3IsIHNyY192dDQzX3IsIHNyY192dDU0X3I7CisgICAgdjE2aTggc3JjX3Z0NjVfciwgc3JjX3Z0NzZfciwgc3JjX3Z0ODdfciwgc3JjX3Z0OThfciwgc3JjX3Z0MTA5X3I7CisgICAgdjE2aTggc3JjX3Z0MTExMF9yLCBzcmNfdnQxMjExX3IsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgdnRfb3V0MCwgdnRfb3V0MSwgdnRfb3V0MjsKKyAgICB2OGkxNiB2dF9vdXQzLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworCisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBMRF9TQjUoc3JjX3ksIHN0cmlkZSwgc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7CisgICAgc3JjX3kgKz0gKDUgKiBzdHJpZGUpOworCisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7CisKKyAgICBMRF9TQjQoc3JjX3gsIHN0cmlkZSwgc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Myk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Myk7CisgICAgc3JjX3ggKz0gKDQgKiBzdHJpZGUpOworCisgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHowLCBzcmNfaHowLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejEsIHNyY19oejEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6Miwgc3JjX2h6MiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHozLCBzcmNfaHozLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIFNSQVJJX0g0X1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIDUpOworICAgIFNBVF9TSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNyk7CisKKyAgICBMRF9TQjQoc3JjX3ksIHN0cmlkZSwgc3JjX3Z0NSwgc3JjX3Z0Niwgc3JjX3Z0Nywgc3JjX3Z0OCk7CisgICAgc3JjX3kgKz0gKDQgKiBzdHJpZGUpOworICAgIFhPUklfQjRfMTI4X1NCKHNyY192dDUsIHNyY192dDYsIHNyY192dDcsIHNyY192dDgpOworCisgICAgSUxWUl9CNF9TQihzcmNfdnQxLCBzcmNfdnQwLCBzcmNfdnQyLCBzcmNfdnQxLCBzcmNfdnQzLCBzcmNfdnQyLCBzcmNfdnQ0LAorICAgICAgICAgICAgICAgc3JjX3Z0Mywgc3JjX3Z0MTBfciwgc3JjX3Z0MjFfciwgc3JjX3Z0MzJfciwgc3JjX3Z0NDNfcik7CisgICAgSUxWUl9CNF9TQihzcmNfdnQ1LCBzcmNfdnQ0LCBzcmNfdnQ2LCBzcmNfdnQ1LCBzcmNfdnQ3LCBzcmNfdnQ2LCBzcmNfdnQ4LAorICAgICAgICAgICAgICAgc3JjX3Z0Nywgc3JjX3Z0NTRfciwgc3JjX3Z0NjVfciwgc3JjX3Z0NzZfciwgc3JjX3Z0ODdfcik7CisgICAgdnRfb3V0MCA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDEwX3IsIHNyY192dDMyX3IsIHNyY192dDU0X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHZ0X291dDEgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQyMV9yLCBzcmNfdnQ0M19yLCBzcmNfdnQ2NV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB2dF9vdXQyID0gQVZDX0RPVF9TSDNfU0goc3JjX3Z0MzJfciwgc3JjX3Z0NTRfciwgc3JjX3Z0NzZfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdnRfb3V0MyA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDQzX3IsIHNyY192dDY1X3IsIHNyY192dDg3X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIFNSQVJJX0g0X1NIKHZ0X291dDAsIHZ0X291dDEsIHZ0X291dDIsIHZ0X291dDMsIDUpOworICAgIFNBVF9TSDRfU0godnRfb3V0MCwgdnRfb3V0MSwgdnRfb3V0MiwgdnRfb3V0MywgNyk7CisKKyAgICB0bXAwID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MCArIHZ0X291dDApLCAxKTsKKyAgICB0bXAxID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MSArIHZ0X291dDEpLCAxKTsKKyAgICB0bXAyID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MiArIHZ0X291dDIpLCAxKTsKKyAgICB0bXAzID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MyArIHZ0X291dDMpLCAxKTsKKworICAgIExEX1NCNChzcmNfeCwgc3RyaWRlLCBzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKKworICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisKKyAgICBTQVRfU0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOworICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDAsIHRtcDEpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDIsIHRtcDMpOworICAgIEFWRVJfVUIyX1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIGRzdDAsIGRzdDEpOworICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgc3RyaWRlKTsKKyAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOworCisgICAgTERfU0I0KHNyY195LCBzdHJpZGUsIHNyY192dDksIHNyY192dDEwLCBzcmNfdnQxMSwgc3JjX3Z0MTIpOworICAgIFhPUklfQjRfMTI4X1NCKHNyY192dDksIHNyY192dDEwLCBzcmNfdnQxMSwgc3JjX3Z0MTIpOworCisgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHowLCBzcmNfaHowLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejEsIHNyY19oejEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6Miwgc3JjX2h6MiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHozLCBzcmNfaHozLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIFNSQVJJX0g0X1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIDUpOworICAgIFNBVF9TSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNyk7CisKKyAgICBJTFZSX0I0X1NCKHNyY192dDksIHNyY192dDgsIHNyY192dDEwLCBzcmNfdnQ5LCBzcmNfdnQxMSwgc3JjX3Z0MTAsCisgICAgICAgICAgICAgICBzcmNfdnQxMiwgc3JjX3Z0MTEsIHNyY192dDk4X3IsIHNyY192dDEwOV9yLCBzcmNfdnQxMTEwX3IsCisgICAgICAgICAgICAgICBzcmNfdnQxMjExX3IpOworICAgIHZ0X291dDAgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQ1NF9yLCBzcmNfdnQ3Nl9yLCBzcmNfdnQ5OF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB2dF9vdXQxID0gQVZDX0RPVF9TSDNfU0goc3JjX3Z0NjVfciwgc3JjX3Z0ODdfciwgc3JjX3Z0MTA5X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHZ0X291dDIgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQ3Nl9yLCBzcmNfdnQ5OF9yLCBzcmNfdnQxMTEwX3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHZ0X291dDMgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQ4N19yLCBzcmNfdnQxMDlfciwgc3JjX3Z0MTIxMV9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICBTUkFSSV9INF9TSCh2dF9vdXQwLCB2dF9vdXQxLCB2dF9vdXQyLCB2dF9vdXQzLCA1KTsKKyAgICBTQVRfU0g0X1NIKHZ0X291dDAsIHZ0X291dDEsIHZ0X291dDIsIHZ0X291dDMsIDcpOworCisgICAgdG1wMCA9IF9fbXNhX3NyYXJpX2goKGh6X291dDAgKyB2dF9vdXQwKSwgMSk7CisgICAgdG1wMSA9IF9fbXNhX3NyYXJpX2goKGh6X291dDEgKyB2dF9vdXQxKSwgMSk7CisgICAgdG1wMiA9IF9fbXNhX3NyYXJpX2goKGh6X291dDIgKyB2dF9vdXQyKSwgMSk7CisgICAgdG1wMyA9IF9fbXNhX3NyYXJpX2goKGh6X291dDMgKyB2dF9vdXQzKSwgMSk7CisKKyAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworCisgICAgU0FUX1NINF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKKyAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQih0bXAwLCB0bXAxKTsKKyAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQih0bXAyLCB0bXAzKTsKKyAgICBBVkVSX1VCMl9VQihvdXQwLCBkc3QwLCBvdXQxLCBkc3QxLCBkc3QwLCBkc3QxKTsKKyAgICBTVDh4NF9VQihkc3QwLCBkc3QxLCBkc3QsIHN0cmlkZSk7CisgICAgZHN0ICs9ICg0ICogc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2EoY29uc3QgdWludDhfdCAqc3JjX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlKQoreworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgY29uc3QgdWludDhfdCAqc3JjX3hfdG1wID0gc3JjX3g7CisgICAgY29uc3QgdWludDhfdCAqc3JjX3lfdG1wID0gc3JjX3k7CisgICAgdWludDhfdCAqZHN0X3RtcCA9IGRzdDsKKyAgICB1aW50MzJfdCBtdWx0aXBsZThfY250LCBsb29wX2NudDsKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2dTggdG1wMCwgdG1wMSwgZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH07CisgICAgdjE2aTggc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6MywgbWFzazAsIG1hc2sxLCBtYXNrMjsKKyAgICB2MTZpOCBzcmNfdnQwLCBzcmNfdnQxLCBzcmNfdnQyLCBzcmNfdnQzLCBzcmNfdnQ0LCBzcmNfdnQ1LCBzcmNfdnQ2OworICAgIHYxNmk4IHNyY192dDcsIHNyY192dDg7CisgICAgdjE2aTggc3JjX3Z0MTBfciwgc3JjX3Z0MjFfciwgc3JjX3Z0MzJfciwgc3JjX3Z0NDNfciwgc3JjX3Z0NTRfcjsKKyAgICB2MTZpOCBzcmNfdnQ2NV9yLCBzcmNfdnQ3Nl9yLCBzcmNfdnQ4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIHZ0X291dDAsIHZ0X291dDEsIHZ0X291dDI7CisgICAgdjhpMTYgdnRfb3V0Mywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBmb3IgKG11bHRpcGxlOF9jbnQgPSAyOyBtdWx0aXBsZThfY250LS07KSB7CisgICAgICAgIHNyY194ID0gc3JjX3hfdG1wOworICAgICAgICBzcmNfeSA9IHNyY195X3RtcDsKKyAgICAgICAgZHN0ID0gZHN0X3RtcDsKKworICAgICAgICBMRF9TQjUoc3JjX3ksIHN0cmlkZSwgc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7CisgICAgICAgIHNyY195ICs9ICg1ICogc3RyaWRlKTsKKworICAgICAgICBYT1JJX0I1XzEyOF9TQihzcmNfdnQwLCBzcmNfdnQxLCBzcmNfdnQyLCBzcmNfdnQzLCBzcmNfdnQ0KTsKKworICAgICAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgICAgIExEX1NCNChzcmNfeCwgc3RyaWRlLCBzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyY19oejAsIHNyY19oejEsIHNyY19oejIsIHNyY19oejMpOworICAgICAgICAgICAgc3JjX3ggKz0gKDQgKiBzdHJpZGUpOworCisgICAgICAgICAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejAsIHNyY19oejAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgaHpfb3V0MSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHoxLCBzcmNfaHoxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6Miwgc3JjX2h6MiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBoel9vdXQzID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyY19oejMsIHNyY19oejMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgU1JBUklfSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNSk7CisgICAgICAgICAgICBTQVRfU0g0X1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIDcpOworCisgICAgICAgICAgICBMRF9TQjQoc3JjX3ksIHN0cmlkZSwgc3JjX3Z0NSwgc3JjX3Z0Niwgc3JjX3Z0Nywgc3JjX3Z0OCk7CisgICAgICAgICAgICBzcmNfeSArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyY192dDUsIHNyY192dDYsIHNyY192dDcsIHNyY192dDgpOworICAgICAgICAgICAgSUxWUl9CNF9TQihzcmNfdnQxLCBzcmNfdnQwLCBzcmNfdnQyLCBzcmNfdnQxLCBzcmNfdnQzLCBzcmNfdnQyLAorICAgICAgICAgICAgICAgICAgICAgICBzcmNfdnQ0LCBzcmNfdnQzLCBzcmNfdnQxMF9yLCBzcmNfdnQyMV9yLCBzcmNfdnQzMl9yLAorICAgICAgICAgICAgICAgICAgICAgICBzcmNfdnQ0M19yKTsKKyAgICAgICAgICAgIElMVlJfQjRfU0Ioc3JjX3Z0NSwgc3JjX3Z0NCwgc3JjX3Z0Niwgc3JjX3Z0NSwgc3JjX3Z0Nywgc3JjX3Z0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Z0OCwgc3JjX3Z0Nywgc3JjX3Z0NTRfciwgc3JjX3Z0NjVfciwgc3JjX3Z0NzZfciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Z0ODdfcik7CisgICAgICAgICAgICB2dF9vdXQwID0gQVZDX0RPVF9TSDNfU0goc3JjX3Z0MTBfciwgc3JjX3Z0MzJfciwgc3JjX3Z0NTRfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHZ0X291dDEgPSBBVkNfRE9UX1NIM19TSChzcmNfdnQyMV9yLCBzcmNfdnQ0M19yLCBzcmNfdnQ2NV9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdnRfb3V0MiA9IEFWQ19ET1RfU0gzX1NIKHNyY192dDMyX3IsIHNyY192dDU0X3IsIHNyY192dDc2X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB2dF9vdXQzID0gQVZDX0RPVF9TSDNfU0goc3JjX3Z0NDNfciwgc3JjX3Z0NjVfciwgc3JjX3Z0ODdfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIFNSQVJJX0g0X1NIKHZ0X291dDAsIHZ0X291dDEsIHZ0X291dDIsIHZ0X291dDMsIDUpOworICAgICAgICAgICAgU0FUX1NINF9TSCh2dF9vdXQwLCB2dF9vdXQxLCB2dF9vdXQyLCB2dF9vdXQzLCA3KTsKKworICAgICAgICAgICAgb3V0MCA9IF9fbXNhX3NyYXJpX2goKGh6X291dDAgKyB2dF9vdXQwKSwgMSk7CisgICAgICAgICAgICBvdXQxID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MSArIHZ0X291dDEpLCAxKTsKKyAgICAgICAgICAgIG91dDIgPSBfX21zYV9zcmFyaV9oKChoel9vdXQyICsgdnRfb3V0MiksIDEpOworICAgICAgICAgICAgb3V0MyA9IF9fbXNhX3NyYXJpX2goKGh6X291dDMgKyB2dF9vdXQzKSwgMSk7CisKKyAgICAgICAgICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworCisgICAgICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOworICAgICAgICAgICAgdG1wMCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CisgICAgICAgICAgICB0bXAxID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKKyAgICAgICAgICAgIEFWRVJfVUIyX1VCKHRtcDAsIGRzdDAsIHRtcDEsIGRzdDEsIGRzdDAsIGRzdDEpOworICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgZHN0LCBzdHJpZGUpOworICAgICAgICAgICAgZHN0ICs9ICg0ICogc3RyaWRlKTsKKworICAgICAgICAgICAgc3JjX3Z0MCA9IHNyY192dDQ7CisgICAgICAgICAgICBzcmNfdnQxID0gc3JjX3Z0NTsKKyAgICAgICAgICAgIHNyY192dDIgPSBzcmNfdnQ2OworICAgICAgICAgICAgc3JjX3Z0MyA9IHNyY192dDc7CisgICAgICAgICAgICBzcmNfdnQ0ID0gc3JjX3Z0ODsKKyAgICAgICAgfQorCisgICAgICAgIHNyY194X3RtcCArPSA4OworICAgICAgICBzcmNfeV90bXAgKz0gODsKKyAgICAgICAgZHN0X3RtcCArPSA4OworICAgIH0KK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2dTggc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMsIHNyYzE0LCBzcmMxNTsKKworICAgIExEX1VCOChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgc3JjICs9ICg4ICogc3RyaWRlKTsKKyAgICBMRF9VQjgoc3JjLCBzdHJpZGUsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIsIHNyYzEzLCBzcmMxNCwgc3JjMTUpOworCisgICAgU1RfVUI4KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgc3RyaWRlKTsKKyAgICBkc3QgKz0gKDggKiBzdHJpZGUpOworICAgIFNUX1VCOChzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQsIHNyYzE1LCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMwMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDY0X3Qgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKworICAgIExENChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgc3JjICs9IDQgKiBzdHJpZGU7CisgICAgTEQ0KHNyYywgc3RyaWRlLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBTRDQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSA0ICogc3RyaWRlOworICAgIFNENChzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMDBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisKKyAgICBMRF9VQjgoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIHNyYyArPSAoOCAqIHN0cmlkZSk7CisgICAgTERfVUI4KGRzdCwgc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3KTsKKworICAgIEFWRVJfVUI0X1VCKHNyYzAsIGRzdDAsIHNyYzEsIGRzdDEsIHNyYzIsIGRzdDIsIHNyYzMsIGRzdDMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgQVZFUl9VQjRfVUIoc3JjNCwgZHN0NCwgc3JjNSwgZHN0NSwgc3JjNiwgZHN0Niwgc3JjNywgZHN0NywgZHN0NCwgZHN0NSwKKyAgICAgICAgICAgICAgICBkc3Q2LCBkc3Q3KTsKKyAgICBTVF9VQjgoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSAoOCAqIHN0cmlkZSk7CisKKyAgICBMRF9VQjgoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIExEX1VCOChkc3QsIHN0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisKKyAgICBBVkVSX1VCNF9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBzcmMzLCBkc3QzLCBkc3QwLCBkc3QxLAorICAgICAgICAgICAgICAgIGRzdDIsIGRzdDMpOworICAgIEFWRVJfVUI0X1VCKHNyYzQsIGRzdDQsIHNyYzUsIGRzdDUsIHNyYzYsIGRzdDYsIHNyYzcsIGRzdDcsIGRzdDQsIGRzdDUsCisgICAgICAgICAgICAgICAgZHN0NiwgZHN0Nyk7CisgICAgU1RfVUI4KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzAwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDMsIHRwNCwgdHA1LCB0cDYsIHRwNzsKKyAgICB2MTZ1OCBzcmMwID0geyAwIH0sIHNyYzEgPSB7IDAgfSwgc3JjMiA9IHsgMCB9LCBzcmMzID0geyAwIH07CisgICAgdjE2dTggZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH0sIGRzdDIgPSB7IDAgfSwgZHN0MyA9IHsgMCB9OworCisgICAgTEQ0KHNyYywgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIHNyYyArPSA0ICogc3RyaWRlOworICAgIExENChzcmMsIHN0cmlkZSwgdHA0LCB0cDUsIHRwNiwgdHA3KTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIHNyYzApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgc3JjMSk7CisgICAgSU5TRVJUX0QyX1VCKHRwNCwgdHA1LCBzcmMyKTsKKyAgICBJTlNFUlRfRDJfVUIodHA2LCB0cDcsIHNyYzMpOworCisgICAgTEQ0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIExENChkc3QgKyA0ICogc3RyaWRlLCBzdHJpZGUsIHRwNCwgdHA1LCB0cDYsIHRwNyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworICAgIElOU0VSVF9EMl9VQih0cDQsIHRwNSwgZHN0Mik7CisgICAgSU5TRVJUX0QyX1VCKHRwNiwgdHA3LCBkc3QzKTsKKworICAgIEFWRVJfVUI0X1VCKHNyYzAsIGRzdDAsIHNyYzEsIGRzdDEsIHNyYzIsIGRzdDIsIHNyYzMsIGRzdDMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisKKyAgICBTVDh4OF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMwMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IHNyYzAgPSB7IDAgfSwgZHN0MCA9IHsgMCB9OworCisgICAgTFc0KHNyYywgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIHNyYzApOworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKworICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYihzcmMwLCBkc3QwKTsKKworICAgIFNUNHg0X1VCKGRzdDAsIGRzdDAsIDAsIDEsIDIsIDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgdjhpMTYgcmVzMCwgcmVzMTsKLSAgICB2MTZ1OCBvdXQ7Ci0gICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMjsKKyAgICB2MTZpOCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIHNyYzcsIHZlYzExOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzksIHZlYzEwOworICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7CisgICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKKyAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgbWFzazMgPSBtYXNrMCArIDg7CisgICAgbWFzazQgPSBtYXNrMSArIDg7CisgICAgbWFzazUgPSBtYXNrMiArIDg7CisgICAgc3JjIC09IDI7CisKKyAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0IyKHNyYywgMTYsIHNyYzAsIHNyYzEpOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIExEX1NCMihzcmMsIDE2LCBzcmM0LCBzcmM1KTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgTERfU0IyKHNyYywgMTYsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gc3RyaWRlOworCisgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMywgdmVjMCwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2szLCB2ZWM2LCB2ZWM5KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMSwgbWFzazQsIHZlYzEsIHZlYzQpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzMsIG1hc2sxLCBtYXNrNCwgdmVjNywgdmVjMTApOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrNSwgdmVjMiwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMywgbWFzazIsIG1hc2s1LCB2ZWM4LCB2ZWMxMSk7CisgICAgICAgIEhBRERfU0I0X1NIKHZlYzAsIHZlYzMsIHZlYzYsIHZlYzksIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMSwgdmVjNCwgdmVjNywgdmVjMTAsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsCisgICAgICAgICAgICAgICAgICAgICBtaW51czViLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzIsIHZlYzUsIHZlYzgsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAorICAgICAgICAgICAgICAgICAgICAgcGx1czIwYiwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNSwgbWFzazAsIG1hc2szLCB2ZWMwLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazMsIHZlYzYsIHZlYzkpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzUsIG1hc2sxLCBtYXNrNCwgdmVjMSwgdmVjNCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNywgbWFzazEsIG1hc2s0LCB2ZWM3LCB2ZWMxMCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNSwgbWFzazIsIG1hc2s1LCB2ZWMyLCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM3LCBtYXNrMiwgbWFzazUsIHZlYzgsIHZlYzExKTsKKyAgICAgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMywgdmVjNiwgdmVjOSwgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMxLCB2ZWM0LCB2ZWM3LCB2ZWMxMCwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKKyAgICAgICAgICAgICAgICAgICAgIG1pbnVzNWIsIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMiwgdmVjNSwgdmVjOCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCisgICAgICAgICAgICAgICAgICAgICBwbHVzMjBiLCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICAgICAgU0xESV9CMl9TQihzcmMxLCBzcmMzLCBzcmMwLCBzcmMyLCBzcmMwLCBzcmMyLCAyKTsKKyAgICAgICAgU0xESV9CMl9TQihzcmM1LCBzcmM3LCBzcmM0LCBzcmM2LCBzcmM0LCBzcmM2LCAyKTsKKyAgICAgICAgU1JBUklfSDRfU0gocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNSk7CisgICAgICAgIFNSQVJJX0g0X1NIKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDUpOworICAgICAgICBTQVRfU0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgICAgICBTQVRfU0g0X1NIKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDcpOworICAgICAgICBQQ0tFVl9CMl9TQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgUENLRVZfQjJfU0IocmVzNSwgcmVzNCwgcmVzNywgcmVzNiwgZHN0MiwgZHN0Myk7CisgICAgICAgIGRzdDAgPSBfX21zYV9hdmVyX3NfYihkc3QwLCBzcmMwKTsKKyAgICAgICAgZHN0MSA9IF9fbXNhX2F2ZXJfc19iKGRzdDEsIHNyYzIpOworICAgICAgICBkc3QyID0gX19tc2FfYXZlcl9zX2IoZHN0Miwgc3JjNCk7CisgICAgICAgIGRzdDMgPSBfX21zYV9hdmVyX3NfYihkc3QzLCBzcmM2KTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0IoZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFNUX1NCNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIHN0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisgICAgfQorfQorCit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2aTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBzcmM3LCB2ZWMxMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5LCB2ZWMxMDsKKyAgICB2OGkxNiByZXMwLCByZXMxLCByZXMyLCByZXMzLCByZXM0LCByZXM1LCByZXM2LCByZXM3OworICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7CisgICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsKKworICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIG1hc2szID0gbWFzazAgKyA4OworICAgIG1hc2s0ID0gbWFzazEgKyA4OworICAgIG1hc2s1ID0gbWFzazIgKyA4OworICAgIHNyYyAtPSAyOworCisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCMihzcmMsIDE2LCBzcmMwLCBzcmMxKTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgTERfU0IyKHNyYywgMTYsIHNyYzIsIHNyYzMpOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjNCwgc3JjNSk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIExEX1NCMihzcmMsIDE2LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMCwgbWFzazMsIHZlYzAsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMywgdmVjNiwgdmVjOSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazEsIG1hc2s0LCB2ZWMxLCB2ZWM0KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMzLCBtYXNrMSwgbWFzazQsIHZlYzcsIHZlYzEwKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazUsIHZlYzIsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzMsIG1hc2syLCBtYXNrNSwgdmVjOCwgdmVjMTEpOworICAgICAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMzLCB2ZWM2LCB2ZWM5LCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzEsIHZlYzQsIHZlYzcsIHZlYzEwLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICAgICAgbWludXM1YiwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMyLCB2ZWM1LCB2ZWM4LCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgICAgIHBsdXMyMGIsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzUsIG1hc2swLCBtYXNrMywgdmVjMCwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNywgbWFzazAsIG1hc2szLCB2ZWM2LCB2ZWM5KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM1LCBtYXNrMSwgbWFzazQsIHZlYzEsIHZlYzQpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzcsIG1hc2sxLCBtYXNrNCwgdmVjNywgdmVjMTApOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzUsIG1hc2syLCBtYXNrNSwgdmVjMiwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNywgbWFzazIsIG1hc2s1LCB2ZWM4LCB2ZWMxMSk7CisgICAgICAgIEhBRERfU0I0X1NIKHZlYzAsIHZlYzMsIHZlYzYsIHZlYzksIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMSwgdmVjNCwgdmVjNywgdmVjMTAsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsCisgICAgICAgICAgICAgICAgICAgICBtaW51czViLCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzIsIHZlYzUsIHZlYzgsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAorICAgICAgICAgICAgICAgICAgICAgcGx1czIwYiwgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgICAgIFNMRElfQjJfU0Ioc3JjMSwgc3JjMywgc3JjMCwgc3JjMiwgc3JjMCwgc3JjMiwgMyk7CisgICAgICAgIFNMRElfQjJfU0Ioc3JjNSwgc3JjNywgc3JjNCwgc3JjNiwgc3JjNCwgc3JjNiwgMyk7CisgICAgICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOworICAgICAgICBTUkFSSV9INF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA1KTsKKyAgICAgICAgU0FUX1NINF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA3KTsKKyAgICAgICAgU0FUX1NINF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA3KTsKKyAgICAgICAgUENLRVZfQjJfU0IocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgZHN0MCwgZHN0MSk7CisgICAgICAgIFBDS0VWX0IyX1NCKHJlczUsIHJlczQsIHJlczcsIHJlczYsIGRzdDIsIGRzdDMpOworICAgICAgICBkc3QwID0gX19tc2FfYXZlcl9zX2IoZHN0MCwgc3JjMCk7CisgICAgICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfYihkc3QxLCBzcmMyKTsKKyAgICAgICAgZHN0MiA9IF9fbXNhX2F2ZXJfc19iKGRzdDIsIHNyYzQpOworICAgICAgICBkc3QzID0gX19tc2FfYXZlcl9zX2IoZHN0Mywgc3JjNik7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBTVF9TQjQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOworICAgIH0KK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHYxNmk4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHZlYzExOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzksIHZlYzEwOworICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7CisgICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKKyAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgTERfU0I4KHNyYyAtIDIsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBtaW51czViLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzEwLCB2ZWMxMSk7CisgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2sxLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBtaW51czViLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMiwgbWFzazIsIHZlYzEwLCB2ZWMxMSk7CisgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgU0xESV9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCAyKTsKKyAgICBTTERJX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIDIpOworICAgIFNMRElfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgMik7CisgICAgU0xESV9CMl9TQihzcmM2LCBzcmM3LCBzcmM2LCBzcmM3LCBzcmM2LCBzcmM3LCAyKTsKKyAgICBQQ0tFVl9EMl9TQihzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmMwLCBzcmMxKTsKKyAgICBQQ0tFVl9EMl9TQihzcmM1LCBzcmM0LCBzcmM3LCBzcmM2LCBzcmM0LCBzcmM1KTsKKyAgICBTUkFSSV9INF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA1KTsKKyAgICBTUkFSSV9INF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA1KTsKKyAgICBTQVRfU0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgIFNBVF9TSDRfU0gocmVzNCwgcmVzNSwgcmVzNiwgcmVzNywgNyk7CisgICAgUENLRVZfQjJfU0IocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgdG1wMCwgdG1wMSk7CisgICAgUENLRVZfQjJfU0IocmVzNSwgcmVzNCwgcmVzNywgcmVzNiwgdG1wMiwgdG1wMyk7CisgICAgdG1wMCA9IF9fbXNhX2F2ZXJfc19iKHRtcDAsIHNyYzApOworICAgIHRtcDEgPSBfX21zYV9hdmVyX3NfYih0bXAxLCBzcmMxKTsKKyAgICB0bXAyID0gX19tc2FfYXZlcl9zX2IodG1wMiwgc3JjNCk7CisgICAgdG1wMyA9IF9fbXNhX2F2ZXJfc19iKHRtcDMsIHNyYzUpOworICAgIFhPUklfQjRfMTI4X1NCKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIFNUOHg4X1VCKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHYxNmk4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHZlYzExOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzksIHZlYzEwOworICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7CisgICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKKyAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgTERfU0I4KHNyYyAtIDIsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBtaW51czViLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzEwLCB2ZWMxMSk7CisgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2sxLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBtaW51czViLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMiwgbWFzazIsIHZlYzEwLCB2ZWMxMSk7CisgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgU0xESV9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCAzKTsKKyAgICBTTERJX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIDMpOworICAgIFNMRElfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgMyk7CisgICAgU0xESV9CMl9TQihzcmM2LCBzcmM3LCBzcmM2LCBzcmM3LCBzcmM2LCBzcmM3LCAzKTsKKyAgICBQQ0tFVl9EMl9TQihzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmMwLCBzcmMxKTsKKyAgICBQQ0tFVl9EMl9TQihzcmM1LCBzcmM0LCBzcmM3LCBzcmM2LCBzcmM0LCBzcmM1KTsKKyAgICBTUkFSSV9INF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA1KTsKKyAgICBTUkFSSV9INF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA1KTsKKyAgICBTQVRfU0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgIFNBVF9TSDRfU0gocmVzNCwgcmVzNSwgcmVzNiwgcmVzNywgNyk7CisgICAgUENLRVZfQjJfU0IocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgdG1wMCwgdG1wMSk7CisgICAgUENLRVZfQjJfU0IocmVzNSwgcmVzNCwgcmVzNywgcmVzNiwgdG1wMiwgdG1wMyk7CisgICAgdG1wMCA9IF9fbXNhX2F2ZXJfc19iKHRtcDAsIHNyYzApOworICAgIHRtcDEgPSBfX21zYV9hdmVyX3NfYih0bXAxLCBzcmMxKTsKKyAgICB0bXAyID0gX19tc2FfYXZlcl9zX2IodG1wMiwgc3JjNCk7CisgICAgdG1wMyA9IF9fbXNhX2F2ZXJfc19iKHRtcDMsIHNyYzUpOworICAgIFhPUklfQjRfMTI4X1NCKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIFNUOHg4X1VCKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzEwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCByZXMsIG1hc2swLCBtYXNrMSwgbWFzazI7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKKyAgICB2OGkxNiByZXMwLCByZXMxOwogICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7CiAgICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsKIAogICAgIExEX1NCMygmbHVtYV9tYXNrX2Fycls0OF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIEhBRERfU0IyX1NIKHZlYzAsIHZlYzEsIHJlczAsIHJlczEpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBtaW51czViLCBtaW51czViLCByZXMwLCByZXMxKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzQsIHZlYzUpOwotICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgcGx1czIwYiwgcGx1czIwYiwgcmVzMCwgcmVzMSk7Ci0gICAgICAgIFNSQVJJX0gyX1NIKHJlczAsIHJlczEsIDUpOwotICAgICAgICBTQVRfU0gyX1NIKHJlczAsIHJlczEsIDcpOwotICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczEpOwotICAgICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgfQorICAgIExEX1NCNChzcmMgLSAyLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBIQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCByZXMwLCByZXMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIG1pbnVzNWIsIG1pbnVzNWIsIHJlczAsIHJlczEpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazIsIG1hc2syLCB2ZWM0LCB2ZWM1KTsKKyAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgcGx1czIwYiwgcGx1czIwYiwgcmVzMCwgcmVzMSk7CisgICAgU1JBUklfSDJfU0gocmVzMCwgcmVzMSwgNSk7CisgICAgU0FUX1NIMl9TSChyZXMwLCByZXMxLCA3KTsKKyAgICByZXMgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcmVzMSwgKHYxNmk4KSByZXMwKTsKKyAgICBTTERJX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIDIpOworICAgIFNMRElfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgMik7CisgICAgc3JjMCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzAsIDEsICh2NGkzMikgc3JjMSk7CisgICAgc3JjMSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzIsIDEsICh2NGkzMikgc3JjMyk7CisgICAgc3JjMCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyYzAsIDEsICh2Mmk2NCkgc3JjMSk7CisgICAgcmVzID0gX19tc2FfYXZlcl9zX2IocmVzLCBzcmMwKTsKKyAgICByZXMgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHJlcywgMTI4KTsKKyAgICBTVDR4NF9VQihyZXMsIHJlcywgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9oel84d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCit2b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMzBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHJlcywgbWFzazAsIG1hc2sxLCBtYXNrMjsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHYxNmk4IHZlYzYsIHZlYzcsIHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMTsKKyAgICB2OGkxNiByZXMwLCByZXMxOwogICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7CiAgICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsKLSAgICB2MTZ1OCBvdXQwLCBvdXQxOwogCi0gICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKLSAgICAgICAgICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWMxMCwgdmVjMTEpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAotICAgICAgICAgICAgICAgICAgICAgcGx1czIwYiwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOwotICAgICAgICBTQVRfU0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOwotICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihyZXMwLCByZXMxKTsKLSAgICAgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIocmVzMiwgcmVzMyk7Ci0gICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbNDhdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgTERfU0I0KHNyYyAtIDIsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgIEhBRERfU0IyX1NIKHZlYzAsIHZlYzEsIHJlczAsIHJlczEpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgbWludXM1YiwgbWludXM1YiwgcmVzMCwgcmVzMSk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzQsIHZlYzUpOworICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBwbHVzMjBiLCBwbHVzMjBiLCByZXMwLCByZXMxKTsKKyAgICBTUkFSSV9IMl9TSChyZXMwLCByZXMxLCA1KTsKKyAgICBTQVRfU0gyX1NIKHJlczAsIHJlczEsIDcpOworICAgIHJlcyA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXMxLCAodjE2aTgpIHJlczApOworICAgIFNMRElfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgMyk7CisgICAgU0xESV9CMl9TQihzcmMyLCBzcmMzLCBzcmMyLCBzcmMzLCBzcmMyLCBzcmMzLCAzKTsKKyAgICBzcmMwID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjMCwgMSwgKHY0aTMyKSBzcmMxKTsKKyAgICBzcmMxID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjMiwgMSwgKHY0aTMyKSBzcmMzKTsKKyAgICBzcmMwID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjMCwgMSwgKHYyaTY0KSBzcmMxKTsKKyAgICByZXMgPSBfX21zYV9hdmVyX3NfYihyZXMsIHNyYzApOworICAgIHJlcyA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgcmVzLCAxMjgpOworICAgIFNUNHg0X1VCKHJlcywgcmVzLCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19sdW1hX2h6XzE2d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgdmVjOCwgdmVjOSwgdmVjMTA7CisgICAgdjE2aTggdmVjMTE7CiAgICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNzsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjE2aTggdmVjNiwgdmVjNywgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExOwogICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7CiAgICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsKIAogICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIHNyYyAtPSAyOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCMihzcmMsIDgsIHNyYzAsIHNyYzEpOwotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKICAgICAgICAgTERfU0IyKHNyYywgOCwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBMRF9TQjIoc3JjLCA4LCBzcmM0LCBzcmM1KTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgTERfU0IyKHNyYywgOCwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CiAKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMyk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWM2LCB2ZWM5KTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzEsIHZlYzQpOwpAQCAtMjU1LDEzICsxMDg2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgIG1pbnVzNWIsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwogICAgICAgICBEUEFERF9TQjRfU0godmVjMiwgdmVjNSwgdmVjOCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCiAgICAgICAgICAgICAgICAgICAgICBwbHVzMjBiLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKLQotICAgICAgICBMRF9TQjIoc3JjLCA4LCBzcmM0LCBzcmM1KTsKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgICAgIExEX1NCMihzcmMsIDgsIHNyYzYsIHNyYzcpOwotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLQotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKICAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzMpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMCwgdmVjNiwgdmVjOSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNSwgc3JjNSwgbWFzazEsIG1hc2sxLCB2ZWMxLCB2ZWM0KTsKQEAgLTI3NywxNDUgKzExMDEsMjQyMiBAQAogICAgICAgICBTUkFSSV9INF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA1KTsKICAgICAgICAgU0FUX1NINF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA3KTsKICAgICAgICAgU0FUX1NINF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA3KTsKLSAgICAgICAgUENLRVZfQjRfU0IocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgcmVzNSwgcmVzNCwgcmVzNywgcmVzNiwKLSAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFBDS0VWX0I0X1NCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIHJlczUsIHJlczQsIHJlczcsIHJlczYsIHZlYzAsIHZlYzEsCisgICAgICAgICAgICAgICAgICAgIHZlYzIsIHZlYzMpOwogICAgICAgICBYT1JJX0I0XzEyOF9TQih2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLQotICAgICAgICBTVF9TQjQodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIFNUX1NCNCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBkc3QsIHN0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9oel9xcnRfNHdfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgaG9yX29mZnNldCkKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMyMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgdWludDhfdCBzbGlkZTsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHY4aTE2IHJlczAsIHJlczE7Ci0gICAgdjE2aTggcmVzLCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMjsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5LCB2ZWMxMDsKKyAgICB2MTZpOCB2ZWMxMTsKKyAgICB2OGkxNiByZXMwLCByZXMxLCByZXMyLCByZXMzLCByZXM0LCByZXM1LCByZXM2LCByZXM3OworICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7CisgICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsKKworICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIExEX1NCOChzcmMgLSAyLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMiwgdmVjMyk7CisgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKKyAgICAgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzgsIHZlYzkpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWMxMCwgdmVjMTEpOworICAgIERQQUREX1NCNF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCisgICAgICAgICAgICAgICAgIHBsdXMyMGIsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMCwgdmVjMiwgdmVjMyk7CisgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMSwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazEsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKKyAgICAgICAgICAgICAgICAgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMiwgbWFzazIsIHZlYzgsIHZlYzkpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazIsIG1hc2syLCB2ZWMxMCwgdmVjMTEpOworICAgIERQQUREX1NCNF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCisgICAgICAgICAgICAgICAgIHBsdXMyMGIsIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOworICAgIFNSQVJJX0g0X1NIKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDUpOworICAgIFNBVF9TSDRfU0gocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgU0FUX1NINF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA3KTsKKyAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihyZXMwLCByZXMxKTsKKyAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQihyZXMyLCByZXMzKTsKKyAgICBvdXQyID0gUENLRVZfWE9SSTEyOF9VQihyZXM0LCByZXM1KTsKKyAgICBvdXQzID0gUENLRVZfWE9SSTEyOF9VQihyZXM2LCByZXM3KTsKKyAgICBTVDh4OF9VQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMyMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdjE2dTggb3V0OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazI7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKKyAgICB2OGkxNiByZXMwLCByZXMxOwogICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7CiAgICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsKIAogICAgIExEX1NCMygmbHVtYV9tYXNrX2Fycls0OF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICBzbGlkZSA9IDIgKyBob3Jfb2Zmc2V0OworICAgIExEX1NCNChzcmMgLSAyLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBIQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCByZXMwLCByZXMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIG1pbnVzNWIsIG1pbnVzNWIsIHJlczAsIHJlczEpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazIsIG1hc2syLCB2ZWM0LCB2ZWM1KTsKKyAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgcGx1czIwYiwgcGx1czIwYiwgcmVzMCwgcmVzMSk7CisgICAgU1JBUklfSDJfU0gocmVzMCwgcmVzMSwgNSk7CisgICAgU0FUX1NIMl9TSChyZXMwLCByZXMxLCA3KTsKKyAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczEpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7Cit9CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludDMyX3QgbG9vcF9jbnQ7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OworICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKKyAgICB2MTZ1OCByZXMwLCByZXMxLCByZXMyLCByZXMzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKKyAgICB2MTZpOCBzcmM4N19yLCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBzcmMyMV9sLCBzcmM0M19sOworICAgIHYxNmk4IHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2w7CiAKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgSEFERF9TQjJfU0godmVjMCwgdmVjMSwgcmVzMCwgcmVzMSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIG1pbnVzNWIsIG1pbnVzNWIsIHJlczAsIHJlczEpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjNCwgdmVjNSk7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBwbHVzMjBiLCBwbHVzMjBiLCByZXMwLCByZXMxKTsKLSAgICAgICAgU1JBUklfSDJfU0gocmVzMCwgcmVzMSwgNSk7Ci0gICAgICAgIFNBVF9TSDJfU0gocmVzMCwgcmVzMSwgNyk7CisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CiAKLSAgICAgICAgcmVzID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHJlczEsICh2MTZpOCkgcmVzMCk7Ci0gICAgICAgIHNyYzAgPSBfX21zYV9zbGRfYihzcmMwLCBzcmMwLCBzbGlkZSk7Ci0gICAgICAgIHNyYzEgPSBfX21zYV9zbGRfYihzcmMxLCBzcmMxLCBzbGlkZSk7Ci0gICAgICAgIHNyYzIgPSBfX21zYV9zbGRfYihzcmMyLCBzcmMyLCBzbGlkZSk7Ci0gICAgICAgIHNyYzMgPSBfX21zYV9zbGRfYihzcmMzLCBzcmMzLCBzbGlkZSk7Ci0gICAgICAgIHNyYzAgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmMwLCAxLCAodjRpMzIpIHNyYzEpOwotICAgICAgICBzcmMxID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjMiwgMSwgKHY0aTMyKSBzcmMzKTsKLSAgICAgICAgc3JjMCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyYzAsIDEsICh2Mmk2NCkgc3JjMSk7Ci0gICAgICAgIHJlcyA9IF9fbXNhX2F2ZXJfc19iKHJlcywgc3JjMCk7Ci0gICAgICAgIHJlcyA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgcmVzLCAxMjgpOworICAgIHNyYyAtPSAoc3RyaWRlICogMik7CiAKLSAgICAgICAgU1Q0eDRfVUIocmVzLCByZXMsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfbCwgc3JjMjFfbCwKKyAgICAgICAgICAgICAgIHNyYzMyX2wsIHNyYzQzX2wpOworCisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwKKyAgICAgICAgICAgICAgICAgICBzcmM2NV9yLCBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICAgICAgSUxWTF9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM1NF9sLAorICAgICAgICAgICAgICAgICAgIHNyYzY1X2wsIHNyYzc2X2wsIHNyYzg3X2wpOworICAgICAgICBvdXQwX3IgPSBBVkNfRE9UX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0MV9yID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDJfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQzX3IgPSBBVkNfRE9UX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0MF9sID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDFfbCA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQyX2wgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0M19sID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNSk7CisgICAgICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA1KTsKKyAgICAgICAgU0FUX1NINF9TSChvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2wsIDcpOworICAgICAgICBQQ0tFVl9CNF9VQihvdXQwX2wsIG91dDBfciwgb3V0MV9sLCBvdXQxX3IsIG91dDJfbCwgb3V0Ml9yLCBvdXQzX2wsCisgICAgICAgICAgICAgICAgICAgIG91dDNfciwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIHJlczAgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMCwgc3JjMik7CisgICAgICAgIHJlczEgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMSwgc3JjMyk7CisgICAgICAgIHJlczIgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMiwgc3JjNCk7CisgICAgICAgIHJlczMgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMywgc3JjNSk7CisgICAgICAgIFhPUklfQjRfMTI4X1VCKHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBTVF9VQjQocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOworCisgICAgICAgIHNyYzEwX3IgPSBzcmM1NF9yOworICAgICAgICBzcmMzMl9yID0gc3JjNzZfcjsKKyAgICAgICAgc3JjMjFfciA9IHNyYzY1X3I7CisgICAgICAgIHNyYzQzX3IgPSBzcmM4N19yOworICAgICAgICBzcmMxMF9sID0gc3JjNTRfbDsKKyAgICAgICAgc3JjMzJfbCA9IHNyYzc2X2w7CisgICAgICAgIHNyYzIxX2wgPSBzcmM2NV9sOworICAgICAgICBzcmM0M19sID0gc3JjODdfbDsKKyAgICAgICAgc3JjMiA9IHNyYzY7CisgICAgICAgIHNyYzMgPSBzcmM3OworICAgICAgICBzcmM0ID0gc3JjODsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19sdW1hX2h6X3FydF84d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwgdWludDhfdCBob3Jfb2Zmc2V0KQordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIHVpbnQ4X3Qgc2xpZGU7Ci0gICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCB0bXAwLCB0bXAxOwotICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgICAgaW50MzJfdCBsb29wX2NudDsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNnU4IHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yOworICAgIHYxNmk4IHNyYzg3X3IsIHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIHNyYzIxX2wsIHNyYzQzX2w7CisgICAgdjE2aTggc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbDsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgc3JjIC09IChzdHJpZGUgKiAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfbCwgc3JjMjFfbCwKKyAgICAgICAgICAgICAgIHNyYzMyX2wsIHNyYzQzX2wpOworCisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwKKyAgICAgICAgICAgICAgICAgICBzcmM2NV9yLCBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICAgICAgSUxWTF9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM1NF9sLAorICAgICAgICAgICAgICAgICAgIHNyYzY1X2wsIHNyYzc2X2wsIHNyYzg3X2wpOworICAgICAgICBvdXQwX3IgPSBBVkNfRE9UX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0MV9yID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDJfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQzX3IgPSBBVkNfRE9UX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0MF9sID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDFfbCA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQyX2wgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0M19sID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNSk7CisgICAgICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA1KTsKKyAgICAgICAgU0FUX1NINF9TSChvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2wsIDcpOworICAgICAgICBQQ0tFVl9CNF9VQihvdXQwX2wsIG91dDBfciwgb3V0MV9sLCBvdXQxX3IsIG91dDJfbCwgb3V0Ml9yLCBvdXQzX2wsCisgICAgICAgICAgICAgICAgICAgIG91dDNfciwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIHJlczAgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMCwgc3JjMyk7CisgICAgICAgIHJlczEgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMSwgc3JjNCk7CisgICAgICAgIHJlczIgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMiwgc3JjNSk7CisgICAgICAgIHJlczMgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMywgc3JjNik7CisgICAgICAgIFhPUklfQjRfMTI4X1VCKHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBTVF9VQjQocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOworCisgICAgICAgIHNyYzEwX3IgPSBzcmM1NF9yOworICAgICAgICBzcmMzMl9yID0gc3JjNzZfcjsKKyAgICAgICAgc3JjMjFfciA9IHNyYzY1X3I7CisgICAgICAgIHNyYzQzX3IgPSBzcmM4N19yOworICAgICAgICBzcmMxMF9sID0gc3JjNTRfbDsKKyAgICAgICAgc3JjMzJfbCA9IHNyYzc2X2w7CisgICAgICAgIHNyYzIxX2wgPSBzcmM2NV9sOworICAgICAgICBzcmM0M19sID0gc3JjODdfbDsKKyAgICAgICAgc3JjMyA9IHNyYzc7CisgICAgICAgIHNyYzQgPSBzcmM4OworICAgIH0KK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHYxNmk4IHNyYzExLCBzcmMxMiwgc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNjVfciwgc3JjNzZfciwgc3JjOThfcjsKKyAgICB2MTZpOCBzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yLCBzcmMxMDlfciwgc3JjMTIxMV9yLCBzcmMxMTEwX3I7CisgICAgdjE2aTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZmlsdDAsIGZpbHQxLCBmaWx0Miwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfcjsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgc3JjIC09IChzdHJpZGUgKiAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKyAgICBMRF9TQjgoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIFhPUklfQjhfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwgc3JjNjVfciwKKyAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IpOworICAgIElMVlJfQjRfU0Ioc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzExLCBzcmMxMCwgc3JjMTIsIHNyYzExLCBzcmM5OF9yLAorICAgICAgICAgICAgICAgc3JjMTA5X3IsIHNyYzExMTBfciwgc3JjMTIxMV9yKTsKKyAgICBvdXQwX3IgPSBBVkNfRE9UX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQxX3IgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQyX3IgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQzX3IgPSBBVkNfRE9UX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ0X3IgPSBBVkNfRE9UX1NIM19TSChzcmM1NF9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ1X3IgPSBBVkNfRE9UX1NIM19TSChzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0Nl9yID0gQVZDX0RPVF9TSDNfU0goc3JjNzZfciwgc3JjOThfciwgc3JjMTExMF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ3X3IgPSBBVkNfRE9UX1NIM19TSChzcmM4N19yLCBzcmMxMDlfciwgc3JjMTIxMV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBQQ0tFVl9EMl9TQihzcmMzLCBzcmMyLCBzcmM1LCBzcmM0LCB0bXAwLCB0bXAxKTsKKyAgICBQQ0tFVl9EMl9TQihzcmM3LCBzcmM2LCBzcmM5LCBzcmM4LCB0bXAyLCB0bXAzKTsKKyAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOworICAgIFNSQVJJX0g0X1NIKG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfciwgNSk7CisgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOworICAgIFNBVF9TSDRfU0gob3V0NF9yLCBvdXQ1X3IsIG91dDZfciwgb3V0N19yLCA3KTsKKyAgICBQQ0tFVl9CMl9TQihvdXQxX3IsIG91dDBfciwgb3V0M19yLCBvdXQyX3IsIG91dDAsIG91dDEpOworICAgIFBDS0VWX0IyX1NCKG91dDVfciwgb3V0NF9yLCBvdXQ3X3IsIG91dDZfciwgb3V0Miwgb3V0Myk7CisgICAgb3V0MCA9IF9fbXNhX2F2ZXJfc19iKG91dDAsIHRtcDApOworICAgIG91dDEgPSBfX21zYV9hdmVyX3NfYihvdXQxLCB0bXAxKTsKKyAgICBvdXQyID0gX19tc2FfYXZlcl9zX2Iob3V0MiwgdG1wMik7CisgICAgb3V0MyA9IF9fbXNhX2F2ZXJfc19iKG91dDMsIHRtcDMpOworICAgIFhPUklfQjRfMTI4X1NCKG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgIFNUOHg4X1VCKG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAzX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHYxNmk4IHNyYzExLCBzcmMxMiwgc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNjVfciwgc3JjNzZfciwgc3JjOThfcjsKKyAgICB2MTZpOCBzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yLCBzcmMxMDlfciwgc3JjMTIxMV9yLCBzcmMxMTEwX3I7CisgICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0Miwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfcjsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgc3JjIC09IChzdHJpZGUgKiAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKyAgICBMRF9TQjgoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjhfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwgc3JjNjVfciwKKyAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IpOworICAgIElMVlJfQjRfU0Ioc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzExLCBzcmMxMCwgc3JjMTIsIHNyYzExLCBzcmM5OF9yLAorICAgICAgICAgICAgICAgc3JjMTA5X3IsIHNyYzExMTBfciwgc3JjMTIxMV9yKTsKKyAgICBvdXQwX3IgPSBBVkNfRE9UX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQxX3IgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQyX3IgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQzX3IgPSBBVkNfRE9UX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ0X3IgPSBBVkNfRE9UX1NIM19TSChzcmM1NF9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ1X3IgPSBBVkNfRE9UX1NIM19TSChzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0Nl9yID0gQVZDX0RPVF9TSDNfU0goc3JjNzZfciwgc3JjOThfciwgc3JjMTExMF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ3X3IgPSBBVkNfRE9UX1NIM19TSChzcmM4N19yLCBzcmMxMDlfciwgc3JjMTIxMV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBQQ0tFVl9EMl9TQihzcmM0LCBzcmMzLCBzcmM2LCBzcmM1LCB0bXAwLCB0bXAxKTsKKyAgICBQQ0tFVl9EMl9TQihzcmM4LCBzcmM3LCBzcmMxMCwgc3JjOSwgdG1wMiwgdG1wMyk7CisgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA1KTsKKyAgICBTUkFSSV9INF9TSChvdXQ0X3IsIG91dDVfciwgb3V0Nl9yLCBvdXQ3X3IsIDUpOworICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKKyAgICBTQVRfU0g0X1NIKG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfciwgNyk7CisgICAgUENLRVZfQjJfU0Iob3V0MV9yLCBvdXQwX3IsIG91dDNfciwgb3V0Ml9yLCBvdXQwLCBvdXQxKTsKKyAgICBQQ0tFVl9CMl9TQihvdXQ1X3IsIG91dDRfciwgb3V0N19yLCBvdXQ2X3IsIG91dDIsIG91dDMpOworICAgIG91dDAgPSBfX21zYV9hdmVyX3NfYihvdXQwLCB0bXAwKTsKKyAgICBvdXQxID0gX19tc2FfYXZlcl9zX2Iob3V0MSwgdG1wMSk7CisgICAgb3V0MiA9IF9fbXNhX2F2ZXJfc19iKG91dDIsIHRtcDIpOworICAgIG91dDMgPSBfX21zYV9hdmVyX3NfYihvdXQzLCB0bXAzKTsKKyAgICBYT1JJX0I0XzEyOF9TQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICBTVDh4OF9VQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMwMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OworICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKKyAgICB2MTZ1OCBvdXQ7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yOworICAgIHYxNmk4IHNyYzg3X3IsIHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgb3V0MTAsIG91dDMyOworCisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKHN0cmlkZSAqIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfRDJfU0Ioc3JjMjFfciwgc3JjMTBfciwgc3JjNDNfciwgc3JjMzJfciwgc3JjMjExMCwgc3JjNDMzMik7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMjExMCwgc3JjNDMzMik7CisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X3IsIHNyYzY1X3IsCisgICAgICAgICAgICAgICBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICBJTFZSX0QyX1NCKHNyYzY1X3IsIHNyYzU0X3IsIHNyYzg3X3IsIHNyYzc2X3IsIHNyYzY1NTQsIHNyYzg3NzYpOworICAgIFhPUklfQjJfMTI4X1NCKHNyYzY1NTQsIHNyYzg3NzYpOworICAgIG91dDEwID0gQVZDX0RPVF9TSDNfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0MzIgPSBBVkNfRE9UX1NIM19TSChzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBTUkFSSV9IMl9TSChvdXQxMCwgb3V0MzIsIDUpOworICAgIFNBVF9TSDJfU0gob3V0MTAsIG91dDMyLCA3KTsKKyAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDEwLCBvdXQzMik7CisgICAgc3JjMzJfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzIsIDEsICh2NGkzMikgc3JjMyk7CisgICAgc3JjNTRfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzQsIDEsICh2NGkzMikgc3JjNSk7CisgICAgc3JjMzJfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyYzMyX3IsIDEsICh2Mmk2NCkgc3JjNTRfcik7CisgICAgb3V0ID0gX19tc2FfYXZlcl91X2Iob3V0LCAodjE2dTgpIHNyYzMyX3IpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMwM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OworICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKKyAgICB2MTZ1OCBvdXQ7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yOworICAgIHYxNmk4IHNyYzg3X3IsIHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgb3V0MTAsIG91dDMyOworCisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKHN0cmlkZSAqIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfRDJfU0Ioc3JjMjFfciwgc3JjMTBfciwgc3JjNDNfciwgc3JjMzJfciwgc3JjMjExMCwgc3JjNDMzMik7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMjExMCwgc3JjNDMzMik7CisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X3IsIHNyYzY1X3IsCisgICAgICAgICAgICAgICBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICBJTFZSX0QyX1NCKHNyYzY1X3IsIHNyYzU0X3IsIHNyYzg3X3IsIHNyYzc2X3IsIHNyYzY1NTQsIHNyYzg3NzYpOworICAgIFhPUklfQjJfMTI4X1NCKHNyYzY1NTQsIHNyYzg3NzYpOworICAgIG91dDEwID0gQVZDX0RPVF9TSDNfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0MzIgPSBBVkNfRE9UX1NIM19TSChzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBTUkFSSV9IMl9TSChvdXQxMCwgb3V0MzIsIDUpOworICAgIFNBVF9TSDJfU0gob3V0MTAsIG91dDMyLCA3KTsKKyAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDEwLCBvdXQzMik7CisgICAgc3JjMzJfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzMsIDEsICh2NGkzMikgc3JjNCk7CisgICAgc3JjNTRfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzUsIDEsICh2NGkzMikgc3JjNik7CisgICAgc3JjMzJfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyYzMyX3IsIDEsICh2Mmk2NCkgc3JjNTRfcik7CisgICAgb3V0ID0gX19tc2FfYXZlcl91X2Iob3V0LCAodjE2dTgpIHNyYzMyX3IpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfMTZ4MTZfbXNhKHNyYyAtIDIsIHNyYyAtIChzdHJpZGUgKiAyKSwgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZjX2x1bWFfaHZfcXJ0XzE2eDE2X21zYShzcmMgLSAyLCBzcmMgLSAoc3RyaWRlICogMikgKyAxLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfMTZ4MTZfbXNhKHNyYyArIHN0cmlkZSAtIDIsIHNyYyAtIChzdHJpZGUgKiAyKSwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGF2Y19sdW1hX2h2X3FydF8xNngxNl9tc2Eoc3JjICsgc3RyaWRlIC0gMiwgc3JjIC0gKHN0cmlkZSAqIDIpICsgMSwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzExX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfOHg4X21zYShzcmMgLSAyLCBzcmMgLSAoc3RyaWRlICogMiksIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfOHg4X21zYShzcmMgLSAyLCBzcmMgLSAoc3RyaWRlICogMikgKyAxLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMxM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZjX2x1bWFfaHZfcXJ0Xzh4OF9tc2Eoc3JjICsgc3RyaWRlIC0gMiwgc3JjIC0gKHN0cmlkZSAqIDIpLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMzM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZjX2x1bWFfaHZfcXJ0Xzh4OF9tc2Eoc3JjICsgc3RyaWRlIC0gMiwgc3JjIC0gKHN0cmlkZSAqIDIpICsgMSwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7Cit9CisKKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzExX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfNHg0X21zYShzcmMgLSAyLCBzcmMgLSAoc3RyaWRlICogMiksIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzMxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfNHg0X21zYShzcmMgLSAyLCBzcmMgLSAoc3RyaWRlICogMikgKyAxLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMxM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZjX2x1bWFfaHZfcXJ0XzR4NF9tc2Eoc3JjICsgc3RyaWRlIC0gMiwgc3JjIC0gKHN0cmlkZSAqIDIpLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMzM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZjX2x1bWFfaHZfcXJ0XzR4NF9tc2Eoc3JjICsgc3RyaWRlIC0gMiwgc3JjIC0gKHN0cmlkZSAqIDIpICsgMSwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50OF90ICpkc3RfdG1wID0gZHN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY190bXAgPSBzcmMgLSAoMiAqIHN0cmlkZSkgLSAyOworICAgIHVpbnQzMl90IG11bHRpcGxlOF9jbnQsIGxvb3BfY250OworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDAgPSAweGZmZmIwMDAxOworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDEgPSAweDE0MDAxNDsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QyID0gMHgxZmZmYjsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIG1hc2swLCBtYXNrMTsKKyAgICB2MTZpOCBtYXNrMjsKKyAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2OworICAgIHY4aTE2IGh6X291dDcsIGh6X291dDgsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjhpMTYgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfciwgaHpfb3V0NTRfcjsKKyAgICB2OGkxNiBoel9vdXQ2NV9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4N19yLCBoel9vdXQxMF9sLCBoel9vdXQyMV9sOworICAgIHY4aTE2IGh6X291dDMyX2wsIGh6X291dDQzX2wsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2w7CisgICAgdjhpMTYgaHpfb3V0ODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2NGkzMiB0bXAwLCB0bXAxOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIGZvciAobXVsdGlwbGU4X2NudCA9IDI7IG11bHRpcGxlOF9jbnQtLTspIHsKKyAgICAgICAgZHN0ID0gZHN0X3RtcDsKKyAgICAgICAgc3JjID0gc3JjX3RtcDsKKworICAgICAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgICAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICAgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgICAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQzID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICAgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworCisgICAgICAgICAgICBoel9vdXQ1ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgaHpfb3V0NiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgICAgICAgICBJTFZSX0g0X1NIKGh6X291dDEsIGh6X291dDAsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMsIGh6X291dDIsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQzX3IpOworICAgICAgICAgICAgSUxWTF9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQzLCBoel9vdXQxMF9sLCBoel9vdXQyMV9sLCBoel9vdXQzMl9sLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0M19sKTsKKyAgICAgICAgICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0OCwgaHpfb3V0NywgaHpfb3V0NTRfciwgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0ODdfcik7CisgICAgICAgICAgICBJTFZMX0g0X1NIKGh6X291dDUsIGh6X291dDQsIGh6X291dDYsIGh6X291dDUsIGh6X291dDcsIGh6X291dDYsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDgsIGh6X291dDcsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2wsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDg3X2wpOworCisgICAgICAgICAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MTBfciwgaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgICAgICAgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX3IsIGh6X291dDQzX3IsIGh6X291dDY1X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NjVfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIGRzdDIgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICAgICAgICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX2wsIGh6X291dDU0X2wsIGh6X291dDc2X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICBkc3Q0ID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgICAgICAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgZHN0NiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworCisgICAgICAgICAgICBkc3QxID0gX19tc2Ffc3JhcmlfaChoel9vdXQyLCA1KTsKKyAgICAgICAgICAgIGRzdDMgPSBfX21zYV9zcmFyaV9oKGh6X291dDMsIDUpOworICAgICAgICAgICAgZHN0NSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NCwgNSk7CisgICAgICAgICAgICBkc3Q3ID0gX19tc2Ffc3JhcmlfaChoel9vdXQ1LCA1KTsKKyAgICAgICAgICAgIFNBVF9TSDRfU0goZHN0MSwgZHN0MywgZHN0NSwgZHN0NywgNyk7CisKKyAgICAgICAgICAgIGRzdDAgPSBfX21zYV9hdmVyX3NfaChkc3QwLCBkc3QxKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIGRzdDIgPSBfX21zYV9hdmVyX3NfaChkc3Q0LCBkc3Q1KTsKKyAgICAgICAgICAgIGRzdDMgPSBfX21zYV9hdmVyX3NfaChkc3Q2LCBkc3Q3KTsKKworICAgICAgICAgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MCwgZHN0MSk7CisgICAgICAgICAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQihkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIGh6X291dDAgPSBoel9vdXQ0OworICAgICAgICAgICAgaHpfb3V0MSA9IGh6X291dDU7CisgICAgICAgICAgICBoel9vdXQyID0gaHpfb3V0NjsKKyAgICAgICAgICAgIGh6X291dDMgPSBoel9vdXQ3OworICAgICAgICAgICAgaHpfb3V0NCA9IGh6X291dDg7CisgICAgICAgIH0KKworICAgICAgICBzcmNfdG1wICs9IDg7CisgICAgICAgIGRzdF90bXAgKz0gODsKKyAgICB9Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50OF90ICpkc3RfdG1wID0gZHN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY190bXAgPSBzcmMgLSAoMiAqIHN0cmlkZSkgLSAyOworICAgIHVpbnQzMl90IG11bHRpcGxlOF9jbnQsIGxvb3BfY250OworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDAgPSAweGZmZmIwMDAxOworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDEgPSAweDE0MDAxNDsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QyID0gMHgxZmZmYjsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIG1hc2swLCBtYXNrMTsKKyAgICB2MTZpOCBtYXNrMjsKKyAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2OworICAgIHY4aTE2IGh6X291dDcsIGh6X291dDgsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjhpMTYgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfciwgaHpfb3V0NTRfcjsKKyAgICB2OGkxNiBoel9vdXQ2NV9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4N19yLCBoel9vdXQxMF9sLCBoel9vdXQyMV9sOworICAgIHY4aTE2IGh6X291dDMyX2wsIGh6X291dDQzX2wsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2w7CisgICAgdjhpMTYgaHpfb3V0ODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2NGkzMiB0bXAwLCB0bXAxOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIGZvciAobXVsdGlwbGU4X2NudCA9IDI7IG11bHRpcGxlOF9jbnQtLTspIHsKKyAgICAgICAgZHN0ID0gZHN0X3RtcDsKKyAgICAgICAgc3JjID0gc3JjX3RtcDsKKworICAgICAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgICAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICAgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgICAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQzID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICAgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworCisgICAgICAgICAgICBoel9vdXQ1ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgaHpfb3V0NiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgICAgICAgICBJTFZSX0g0X1NIKGh6X291dDEsIGh6X291dDAsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMsIGh6X291dDIsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQzX3IpOworICAgICAgICAgICAgSUxWTF9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQzLCBoel9vdXQxMF9sLCBoel9vdXQyMV9sLCBoel9vdXQzMl9sLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0M19sKTsKKyAgICAgICAgICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0OCwgaHpfb3V0NywgaHpfb3V0NTRfciwgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0ODdfcik7CisgICAgICAgICAgICBJTFZMX0g0X1NIKGh6X291dDUsIGh6X291dDQsIGh6X291dDYsIGh6X291dDUsIGh6X291dDcsIGh6X291dDYsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDgsIGh6X291dDcsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2wsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDg3X2wpOworCisgICAgICAgICAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MTBfciwgaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgICAgICAgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX3IsIGh6X291dDQzX3IsIGh6X291dDY1X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NjVfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIGRzdDIgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICAgICAgICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX2wsIGh6X291dDU0X2wsIGh6X291dDc2X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICBkc3Q0ID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgICAgICAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgZHN0NiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworCisgICAgICAgICAgICBkc3QxID0gX19tc2Ffc3JhcmlfaChoel9vdXQzLCA1KTsKKyAgICAgICAgICAgIGRzdDMgPSBfX21zYV9zcmFyaV9oKGh6X291dDQsIDUpOworICAgICAgICAgICAgZHN0NSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NSwgNSk7CisgICAgICAgICAgICBkc3Q3ID0gX19tc2Ffc3JhcmlfaChoel9vdXQ2LCA1KTsKKyAgICAgICAgICAgIFNBVF9TSDRfU0goZHN0MSwgZHN0MywgZHN0NSwgZHN0NywgNyk7CisKKyAgICAgICAgICAgIGRzdDAgPSBfX21zYV9hdmVyX3NfaChkc3QwLCBkc3QxKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIGRzdDIgPSBfX21zYV9hdmVyX3NfaChkc3Q0LCBkc3Q1KTsKKyAgICAgICAgICAgIGRzdDMgPSBfX21zYV9hdmVyX3NfaChkc3Q2LCBkc3Q3KTsKKworICAgICAgICAgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MCwgZHN0MSk7CisgICAgICAgICAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQihkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIGh6X291dDAgPSBoel9vdXQ0OworICAgICAgICAgICAgaHpfb3V0MSA9IGh6X291dDU7CisgICAgICAgICAgICBoel9vdXQyID0gaHpfb3V0NjsKKyAgICAgICAgICAgIGh6X291dDMgPSBoel9vdXQ3OworICAgICAgICAgICAgaHpfb3V0NCA9IGh6X291dDg7CisgICAgICAgIH0KKworICAgICAgICBzcmNfdG1wICs9IDg7CisgICAgICAgIGRzdF90bXAgKz0gODsKKyAgICB9Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMyMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MCA9IDB4ZmZmYjAwMDE7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MSA9IDB4MTQwMDE0OworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDIgPSAweDFmZmZiOworICAgIHYxNnU4IG91dDAsIG91dDE7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CisgICAgdjE2aTggc3JjMTEsIHNyYzEyLCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHY4aTE2IGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIGh6X291dDY7CisgICAgdjhpMTYgaHpfb3V0NywgaHpfb3V0OCwgaHpfb3V0OSwgaHpfb3V0MTAsIGh6X291dDExLCBoel9vdXQxMjsKKyAgICB2OGkxNiBoel9vdXQxMF9yLCBoel9vdXQyMV9yLCBoel9vdXQzMl9yLCBoel9vdXQ0M19yLCBoel9vdXQ1NF9yOworICAgIHY4aTE2IGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IsIGh6X291dDg5X3IsIGh6X291dDkxMF9yOworICAgIHY4aTE2IGh6X291dDExMTBfciwgaHpfb3V0MTIxMV9yLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHY4aTE2IGh6X291dDEwX2wsIGh6X291dDIxX2wsIGh6X291dDMyX2wsIGh6X291dDQzX2wsIGh6X291dDU0X2w7CisgICAgdjhpMTYgaHpfb3V0NjVfbCwgaHpfb3V0NzZfbCwgaHpfb3V0ODdfbCwgaHpfb3V0ODlfbCwgaHpfb3V0OTEwX2w7CisgICAgdjhpMTYgaHpfb3V0MTExMF9sLCBoel9vdXQxMjExX2wsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjRpMzIgdG1wMCwgdG1wMTsKKworICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworCisgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworCisgICAgaHpfb3V0NSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ2ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0OCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIElMVlJfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IpOworICAgIElMVkxfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX2wsIGh6X291dDIxX2wsIGh6X291dDMyX2wsIGh6X291dDQzX2wpOworICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X3IsIGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IpOworICAgIElMVkxfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2wsIGh6X291dDg3X2wpOworCisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDEwX3IsIGh6X291dDMyX3IsIGh6X291dDU0X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX3IsIGh6X291dDQzX3IsIGh6X291dDY1X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQyMV9sLCBoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX3IsIGh6X291dDU0X3IsIGh6X291dDc2X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBoel9vdXQ3Nl9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QyID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDQzX3IsIGh6X291dDY1X3IsIGh6X291dDg3X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QzID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisKKyAgICBTUkFSSV9INF9TSChoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCA1KTsKKyAgICBTQVRfU0g0X1NIKGh6X291dDIsIGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIDcpOworCisgICAgZHN0MCA9IF9fbXNhX2F2ZXJfc19oKGRzdDAsIGh6X291dDIpOworICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QxLCBoel9vdXQzKTsKKyAgICBkc3QyID0gX19tc2FfYXZlcl9zX2goZHN0MiwgaHpfb3V0NCk7CisgICAgZHN0MyA9IF9fbXNhX2F2ZXJfc19oKGRzdDMsIGh6X291dDUpOworCisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MCwgZHN0MSk7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MiwgZHN0Myk7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIGh6X291dDkgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjOSwgc3JjOSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MTAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMTAsIHNyYzEwLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxMSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxMSwgc3JjMTEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEyLCBzcmMxMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgSUxWUl9INF9TSChoel9vdXQ5LCBoel9vdXQ4LCBoel9vdXQxMCwgaHpfb3V0OSwgaHpfb3V0MTEsIGh6X291dDEwLAorICAgICAgICAgICAgICAgaHpfb3V0MTIsIGh6X291dDExLCBoel9vdXQ4OV9yLCBoel9vdXQ5MTBfciwgaHpfb3V0MTExMF9yLAorICAgICAgICAgICAgICAgaHpfb3V0MTIxMV9yKTsKKyAgICBJTFZMX0g0X1NIKGh6X291dDksIGh6X291dDgsIGh6X291dDEwLCBoel9vdXQ5LCBoel9vdXQxMSwgaHpfb3V0MTAsCisgICAgICAgICAgICAgICBoel9vdXQxMiwgaHpfb3V0MTEsIGh6X291dDg5X2wsIGh6X291dDkxMF9sLCBoel9vdXQxMTEwX2wsCisgICAgICAgICAgICAgICBoel9vdXQxMjExX2wpOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4OV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NTRfbCwgaHpfb3V0NzZfbCwgaHpfb3V0ODlfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ2NV9yLCBoel9vdXQ4N19yLCBoel9vdXQ5MTBfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDY1X2wsIGh6X291dDg3X2wsIGh6X291dDkxMF9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDc2X3IsIGh6X291dDg5X3IsIGh6X291dDExMTBfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDc2X2wsIGh6X291dDg5X2wsIGh6X291dDExMTBfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ4N19yLCBoel9vdXQ5MTBfciwgaHpfb3V0MTIxMV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0ODdfbCwgaHpfb3V0OTEwX2wsIGh6X291dDEyMTFfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MyA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworCisgICAgU1JBUklfSDRfU0goaHpfb3V0NiwgaHpfb3V0NywgaHpfb3V0OCwgaHpfb3V0OSwgNSk7CisgICAgU0FUX1NINF9TSChoel9vdXQ2LCBoel9vdXQ3LCBoel9vdXQ4LCBoel9vdXQ5LCA3KTsKKworICAgIGRzdDAgPSBfX21zYV9hdmVyX3NfaChkc3QwLCBoel9vdXQ2KTsKKyAgICBkc3QxID0gX19tc2FfYXZlcl9zX2goZHN0MSwgaHpfb3V0Nyk7CisgICAgZHN0MiA9IF9fbXNhX2F2ZXJfc19oKGRzdDIsIGh6X291dDgpOworICAgIGRzdDMgPSBfX21zYV9hdmVyX3NfaChkc3QzLCBoel9vdXQ5KTsKKworICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDEpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDIsIGRzdDMpOworICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIzX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QwID0gMHhmZmZiMDAwMTsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QxID0gMHgxNDAwMTQ7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MiA9IDB4MWZmZmI7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCBzcmMxMSwgc3JjMTIsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCBoel9vdXQ5LCBoel9vdXQxMCwgaHpfb3V0MTEsIGh6X291dDEyOworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfciwgaHpfb3V0ODlfciwgaHpfb3V0OTEwX3I7CisgICAgdjhpMTYgaHpfb3V0MTExMF9yLCBoel9vdXQxMjExX3IsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjhpMTYgaHpfb3V0MTBfbCwgaHpfb3V0MjFfbCwgaHpfb3V0MzJfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NTRfbDsKKyAgICB2OGkxNiBoel9vdXQ2NV9sLCBoel9vdXQ3Nl9sLCBoel9vdXQ4N19sLCBoel9vdXQ4OV9sLCBoel9vdXQ5MTBfbDsKKyAgICB2OGkxNiBoel9vdXQxMTEwX2wsIGh6X291dDEyMTFfbCwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2NGkzMiB0bXAwLCB0bXAxOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBmaWx0MCA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QyKTsKKworICAgIHNyYyAtPSAoKDIgKiBzdHJpZGUpICsgMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisKKyAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQzID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDQgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBoel9vdXQ1ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0NyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgSUxWUl9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLCBoel9vdXQ0LAorICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfcik7CisgICAgSUxWTF9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLCBoel9vdXQ0LAorICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0MTBfbCwgaHpfb3V0MjFfbCwgaHpfb3V0MzJfbCwgaHpfb3V0NDNfbCk7CisgICAgSUxWUl9INF9TSChoel9vdXQ1LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4LAorICAgICAgICAgICAgICAgaHpfb3V0NywgaHpfb3V0NTRfciwgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfcik7CisgICAgSUxWTF9INF9TSChoel9vdXQ1LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4LAorICAgICAgICAgICAgICAgaHpfb3V0NywgaHpfb3V0NTRfbCwgaHpfb3V0NjVfbCwgaHpfb3V0NzZfbCwgaHpfb3V0ODdfbCk7CisKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MTBfciwgaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDEwX2wsIGh6X291dDMyX2wsIGh6X291dDU0X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIGRzdDAgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfciwgaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX2wsIGh6X291dDQzX2wsIGh6X291dDY1X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIGRzdDEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgaHpfb3V0NzZfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX2wsIGh6X291dDU0X2wsIGh6X291dDc2X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIGRzdDIgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDQzX2wsIGh6X291dDY1X2wsIGh6X291dDg3X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIGRzdDMgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKworICAgIFNSQVJJX0g0X1NIKGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIGh6X291dDYsIDUpOworICAgIFNBVF9TSDRfU0goaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NiwgNyk7CisKKyAgICBkc3QwID0gX19tc2FfYXZlcl9zX2goZHN0MCwgaHpfb3V0Myk7CisgICAgZHN0MSA9IF9fbXNhX2F2ZXJfc19oKGRzdDEsIGh6X291dDQpOworICAgIGRzdDIgPSBfX21zYV9hdmVyX3NfaChkc3QyLCBoel9vdXQ1KTsKKyAgICBkc3QzID0gX19tc2FfYXZlcl9zX2goZHN0MywgaHpfb3V0Nik7CisKKyAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QxKTsKKyAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQihkc3QyLCBkc3QzKTsKKyAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIHN0cmlkZSk7CisgICAgZHN0ICs9ICg0ICogc3RyaWRlKTsKKworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMik7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMik7CisgICAgaHpfb3V0OSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM5LCBzcmM5LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxMCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxMCwgc3JjMTAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDExID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzExLCBzcmMxMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MTIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMTIsIHNyYzEyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBJTFZSX0g0X1NIKGh6X291dDksIGh6X291dDgsIGh6X291dDEwLCBoel9vdXQ5LCBoel9vdXQxMSwgaHpfb3V0MTAsCisgICAgICAgICAgICAgICBoel9vdXQxMiwgaHpfb3V0MTEsIGh6X291dDg5X3IsIGh6X291dDkxMF9yLCBoel9vdXQxMTEwX3IsCisgICAgICAgICAgICAgICBoel9vdXQxMjExX3IpOworICAgIElMVkxfSDRfU0goaHpfb3V0OSwgaHpfb3V0OCwgaHpfb3V0MTAsIGh6X291dDksIGh6X291dDExLCBoel9vdXQxMCwKKyAgICAgICAgICAgICAgIGh6X291dDEyLCBoel9vdXQxMSwgaHpfb3V0ODlfbCwgaHpfb3V0OTEwX2wsIGh6X291dDExMTBfbCwKKyAgICAgICAgICAgICAgIGh6X291dDEyMTFfbCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDU0X3IsIGh6X291dDc2X3IsIGh6X291dDg5X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ1NF9sLCBoel9vdXQ3Nl9sLCBoel9vdXQ4OV9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDY1X3IsIGh6X291dDg3X3IsIGh6X291dDkxMF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NjVfbCwgaHpfb3V0ODdfbCwgaHpfb3V0OTEwX2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIGRzdDEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NzZfciwgaHpfb3V0ODlfciwgaHpfb3V0MTExMF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NzZfbCwgaHpfb3V0ODlfbCwgaHpfb3V0MTExMF9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QyID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDg3X3IsIGh6X291dDkxMF9yLCBoel9vdXQxMjExX3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ4N19sLCBoel9vdXQ5MTBfbCwgaHpfb3V0MTIxMV9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QzID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisKKyAgICBTUkFSSV9INF9TSChoel9vdXQ3LCBoel9vdXQ4LCBoel9vdXQ5LCBoel9vdXQxMCwgNSk7CisgICAgU0FUX1NINF9TSChoel9vdXQ3LCBoel9vdXQ4LCBoel9vdXQ5LCBoel9vdXQxMCwgNyk7CisKKyAgICBkc3QwID0gX19tc2FfYXZlcl9zX2goZHN0MCwgaHpfb3V0Nyk7CisgICAgZHN0MSA9IF9fbXNhX2F2ZXJfc19oKGRzdDEsIGh6X291dDgpOworICAgIGRzdDIgPSBfX21zYV9hdmVyX3NfaChkc3QyLCBoel9vdXQ5KTsKKyAgICBkc3QzID0gX19tc2FfYXZlcl9zX2goZHN0MywgaHpfb3V0MTApOworCisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MCwgZHN0MSk7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MiwgZHN0Myk7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMjFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDAgPSAweGZmZmIwMDAxOworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDEgPSAweDE0MDAxNDsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QyID0gMHgxZmZmYjsKKyAgICB2MTZ1OCByZXM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKICAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjE2aTggdmVjNiwgdmVjNywgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExOwotICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7Ci0gICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsKKyAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2OworICAgIHY4aTE2IGh6X291dDcsIGh6X291dDgsIGRzdDAsIGRzdDEsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfciwgaHpfb3V0NTRfcjsKKyAgICB2OGkxNiBoel9vdXQ2NV9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4N19yOworICAgIHY0aTMyIHRtcDAsIHRtcDE7CiAKLSAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICBzbGlkZSA9IDIgKyBob3Jfb2Zmc2V0OworICAgIExEX1NCMygmbHVtYV9tYXNrX2Fycls0OF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKIAotICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMjsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgIGZpbHQwID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDIpOwogCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKLSAgICAgICAgICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWMxMCwgdmVjMTEpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAotICAgICAgICAgICAgICAgICAgICAgcGx1czIwYiwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgc3JjIC09ICgoMiAqIHN0cmlkZSkgKyAyKTsKIAotICAgICAgICBzcmMwID0gX19tc2Ffc2xkX2Ioc3JjMCwgc3JjMCwgc2xpZGUpOwotICAgICAgICBzcmMxID0gX19tc2Ffc2xkX2Ioc3JjMSwgc3JjMSwgc2xpZGUpOwotICAgICAgICBzcmMyID0gX19tc2Ffc2xkX2Ioc3JjMiwgc3JjMiwgc2xpZGUpOwotICAgICAgICBzcmMzID0gX19tc2Ffc2xkX2Ioc3JjMywgc3JjMywgc2xpZGUpOworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKyAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwogCi0gICAgICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOwotICAgICAgICBTQVRfU0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOwotICAgICAgICBQQ0tFVl9CMl9TQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCB0bXAwLCB0bXAxKTsKLSAgICAgICAgUENLRVZfRDJfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjMCwgc3JjMSk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CiAKLSAgICAgICAgdG1wMCA9IF9fbXNhX2F2ZXJfc19iKHRtcDAsIHNyYzApOwotICAgICAgICB0bXAxID0gX19tc2FfYXZlcl9zX2IodG1wMSwgc3JjMSk7CisgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMwLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDQgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNCwgc3JjNSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0NiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIFBDS09EX0QyX1NIKGh6X291dDAsIGh6X291dDAsIGh6X291dDIsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMpOworICAgIFBDS09EX0QyX1NIKGh6X291dDQsIGh6X291dDQsIGh6X291dDYsIGh6X291dDYsIGh6X291dDUsIGh6X291dDcpOwogCi0gICAgICAgIFhPUklfQjJfMTI4X1NCKHRtcDAsIHRtcDEpOwotICAgICAgICBTVDh4NF9VQih0bXAwLCB0bXAxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIElMVlJfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IpOworICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X3IsIGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IpOwogCi0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9yLCBoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfciwgaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MSA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworCisgICAgU1JBUklfSDJfU0goaHpfb3V0MiwgaHpfb3V0NCwgNSk7CisgICAgU0FUX1NIMl9TSChoel9vdXQyLCBoel9vdXQ0LCA3KTsKKworICAgIGRzdDAgPSBfX21zYV9hdmVyX3NfaChkc3QwLCBoel9vdXQyKTsKKyAgICBkc3QxID0gX19tc2FfYXZlcl9zX2goZHN0MSwgaHpfb3V0NCk7CisKKyAgICByZXMgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDEpOworICAgIFNUNHg0X1VCKHJlcywgcmVzLCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMyM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MCA9IDB4ZmZmYjAwMDE7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MSA9IDB4MTQwMDE0OworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDIgPSAweDFmZmZiOworICAgIHYxNnU4IHJlczsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCBkc3QwLCBkc3QxLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfcjsKKyAgICB2NGkzMiB0bXAwLCB0bXAxOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNiwgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0OCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBQQ0tPRF9EMl9TSChoel9vdXQwLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzKTsKKyAgICBQQ0tPRF9EMl9TSChoel9vdXQ0LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3KTsKKworICAgIElMVlJfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IpOworICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X3IsIGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IpOworCisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDEwX3IsIGh6X291dDMyX3IsIGh6X291dDU0X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQyMV9yLCBoel9vdXQ0M19yLCBoel9vdXQ2NV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX3IsIGh6X291dDU0X3IsIGh6X291dDc2X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19yLCBoel9vdXQ2NV9yLCBoel9vdXQ4N19yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisKKyAgICBQQ0tFVl9EMl9TSChoel9vdXQ0LCBoel9vdXQzLCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQwLCBoel9vdXQxKTsKKyAgICBTUkFSSV9IMl9TSChoel9vdXQwLCBoel9vdXQxLCA1KTsKKyAgICBTQVRfU0gyX1NIKGh6X291dDAsIGh6X291dDEsIDcpOworCisgICAgZHN0MCA9IF9fbXNhX2F2ZXJfc19oKGRzdDAsIGh6X291dDApOworICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QxLCBoel9vdXQxKTsKKworICAgIHJlcyA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MCwgZHN0MSk7CisgICAgU1Q0eDRfVUIocmVzLCByZXMsIDAsIDEsIDIsIDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGludDMyX3QgbG9vcF9jbnQ7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OworICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKKyAgICB2MTZ1OCByZXMwLCByZXMxLCByZXMyLCByZXMzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKKyAgICB2MTZpOCBzcmM4N19yLCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBzcmMyMV9sLCBzcmM0M19sOworICAgIHYxNmk4IHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2w7CisKKyAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKKyAgICBzcmMgLT0gKHN0cmlkZSAqIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworCisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgSUxWUl9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMxMF9yLCBzcmMyMV9yLAorICAgICAgICAgICAgICAgc3JjMzJfciwgc3JjNDNfcik7CisgICAgSUxWTF9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMxMF9sLCBzcmMyMV9sLAorICAgICAgICAgICAgICAgc3JjMzJfbCwgc3JjNDNfbCk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICAgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKKworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICAgICAgSUxWUl9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM1NF9yLAorICAgICAgICAgICAgICAgICAgIHNyYzY1X3IsIHNyYzc2X3IsIHNyYzg3X3IpOworICAgICAgICBJTFZMX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X2wsCisgICAgICAgICAgICAgICAgICAgc3JjNjVfbCwgc3JjNzZfbCwgc3JjODdfbCk7CisgICAgICAgIG91dDBfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQxX3IgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0Ml9yID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDNfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQwX2wgPSBBVkNfRE9UX1NIM19TSChzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0MV9sID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDJfbCA9IEFWQ19ET1RfU0gzX1NIKHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQzX2wgPSBBVkNfRE9UX1NIM19TSChzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA1KTsKKyAgICAgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2wsIDUpOworICAgICAgICBTQVRfU0g0X1NIKG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCwgNyk7CisgICAgICAgIFBDS0VWX0I0X1VCKG91dDBfbCwgb3V0MF9yLCBvdXQxX2wsIG91dDFfciwgb3V0Ml9sLCBvdXQyX3IsIG91dDNfbCwKKyAgICAgICAgICAgICAgICAgICAgb3V0M19yLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfVUIocmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIFNUX1VCNChyZXMwLCByZXMxLCByZXMyLCByZXMzLCBkc3QsIHN0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7CisgICAgICAgIHNyYzMyX3IgPSBzcmM3Nl9yOworICAgICAgICBzcmMyMV9yID0gc3JjNjVfcjsKKyAgICAgICAgc3JjNDNfciA9IHNyYzg3X3I7CisgICAgICAgIHNyYzEwX2wgPSBzcmM1NF9sOworICAgICAgICBzcmMzMl9sID0gc3JjNzZfbDsKKyAgICAgICAgc3JjMjFfbCA9IHNyYzY1X2w7CisgICAgICAgIHNyYzQzX2wgPSBzcmM4N19sOworICAgICAgICBzcmM0ID0gc3JjODsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19sdW1hX2h6X3FydF8xNndfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwgdWludDhfdCBob3Jfb2Zmc2V0KQordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CisgICAgdjE2aTggc3JjMTEsIHNyYzEyLCBzcmMxMF9yLCBzcmMyMV9yLCBzcmMzMl9yLCBzcmM0M19yLCBzcmM3Nl9yLCBzcmM4N19yOworICAgIHYxNmk4IHNyYzk4X3IsIHNyYzEwOV9yLCBzcmM4OV9yLCBzcmM5MTBfciwgc3JjMTExMF9yLCBzcmMxMjExX3I7CisgICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfcjsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgc3JjIC09IChzdHJpZGUgKiAyKTsKKworICAgIExEX1NCOChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgc3JjICs9ICg4ICogc3RyaWRlKTsKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNzZfciwgc3JjODdfciwKKyAgICAgICAgICAgICAgIHNyYzk4X3IsIHNyYzEwOV9yKTsKKyAgICBJTFZSX0I0X1NCKHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmMxMSwgc3JjMTAsIHNyYzEyLCBzcmMxMSwgc3JjODlfciwKKyAgICAgICAgICAgICAgIHNyYzkxMF9yLCBzcmMxMTEwX3IsIHNyYzEyMTFfcik7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfcik7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNzZfciwgc3JjODdfciwgc3JjOThfciwgc3JjMTA5X3IpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzg5X3IsIHNyYzkxMF9yLCBzcmMxMTEwX3IsIHNyYzEyMTFfcik7CisgICAgb3V0MF9yID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0MV9yID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0Ml9yID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfciwgc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0M19yID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfciwgc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDRfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzc2X3IsIHNyYzk4X3IsIHNyYzg5X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDVfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzg3X3IsIHNyYzEwOV9yLCBzcmM5MTBfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0Nl9yID0gQVZDX0RPVF9TSDNfU0goc3JjOThfciwgc3JjODlfciwgc3JjMTExMF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ3X3IgPSBBVkNfRE9UX1NIM19TSChzcmMxMDlfciwgc3JjOTEwX3IsIHNyYzEyMTFfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA1KTsKKyAgICBTUkFSSV9INF9TSChvdXQ0X3IsIG91dDVfciwgb3V0Nl9yLCBvdXQ3X3IsIDUpOworICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKKyAgICBTQVRfU0g0X1NIKG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfciwgNyk7CisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MF9yLCBvdXQxX3IpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDJfciwgb3V0M19yKTsKKyAgICBvdXQyID0gUENLRVZfWE9SSTEyOF9VQihvdXQ0X3IsIG91dDVfcik7CisgICAgb3V0MyA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Nl9yLCBvdXQ3X3IpOworICAgIFNUOHg4X1VCKG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzAyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNnU4IG91dDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3I7CisgICAgdjE2aTggc3JjODdfciwgc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NiwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2OGkxNiBvdXQxMCwgb3V0MzI7CisKKyAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKKworICAgIHNyYyAtPSAoc3RyaWRlICogMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwgc3JjNjVfciwKKyAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IpOworICAgIElMVlJfRDRfU0Ioc3JjMjFfciwgc3JjMTBfciwgc3JjNDNfciwgc3JjMzJfciwgc3JjNjVfciwgc3JjNTRfciwgc3JjODdfciwKKyAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYpOworICAgIG91dDEwID0gQVZDX0RPVF9TSDNfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0MzIgPSBBVkNfRE9UX1NIM19TSChzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBTUkFSSV9IMl9TSChvdXQxMCwgb3V0MzIsIDUpOworICAgIFNBVF9TSDJfU0gob3V0MTAsIG91dDMyLCA3KTsKKyAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDEwLCBvdXQzMik7CisgICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQzMl90IHJvdzsKKyAgICB2MTZ1OCBvdXQ7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CisgICAgdjE2aTggc3JjMTE7CisgICAgdjhpMTYgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMiwgdnRfcmVzMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgbWFzazM7CisgICAgdjhpMTYgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNSwgc2hmX3ZlYzY7CisgICAgdjhpMTYgc2hmX3ZlYzcsIHNoZl92ZWM4LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTEsIG1hc2s0LCBtYXNrNTsKKyAgICB2NGkzMiBoel9yZXMwLCBoel9yZXMxLCBoel9yZXMyLCBoel9yZXMzOworICAgIHY4aTE2IG1hc2swID0geyAwLCA1LCAxLCA2LCAyLCA3LCAzLCA4IH07CisgICAgdjhpMTYgbWFzazEgPSB7IDEsIDQsIDIsIDUsIDMsIDYsIDQsIDcgfTsKKyAgICB2OGkxNiBtYXNrMiA9IHsgMiwgMywgMywgNCwgNCwgNSwgNSwgNiB9OworICAgIHY4aTE2IG1pbnVzNWggPSBfX21zYV9sZGlfaCgtNSk7CisgICAgdjhpMTYgcGx1czIwaCA9IF9fbXNhX2xkaV9oKDIwKTsKKworICAgIG1hc2szID0gbWFzazAgKyA0OworICAgIG1hc2s0ID0gbWFzazEgKyA0OworICAgIG1hc2s1ID0gbWFzazIgKyA0OworCisgICAgc3JjIC09ICgoMiAqIHN0cmlkZSkgKyAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgTERfU0I1KHNyYyArIDgsIHN0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExKTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSk7CisKKyAgICBmb3IgKHJvdyA9IDE2OyByb3ctLTspIHsKKyAgICAgICAgTERfU0IyKHNyYywgOCwgc3JjNSwgc3JjNik7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzUsIHNyYzYpOworCisgICAgICAgIEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfU0goc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dF9yZXMwLCB2dF9yZXMxKTsKKyAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRfcmVzMiwgdnRfcmVzMyk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgbWFzazAsCisgICAgICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgICAgICBtYXNrMSwgbWFzazIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIG1hc2s0LCBtYXNrNSwgc2hmX3ZlYzYsIHNoZl92ZWM3LCBzaGZfdmVjOCk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgbWFzazMsCisgICAgICAgICAgICAgICAgICAgbWFzazQsIG1hc2s1LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTEpOworICAgICAgICBoel9yZXMwID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICAgICAgaHpfcmVzMSA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgICAgIGh6X3JlczIgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjNiwgc2hmX3ZlYzYpOworICAgICAgICBoel9yZXMzID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzksIHNoZl92ZWM5KTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjNCwgc2hmX3ZlYzUsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczEsIGh6X3JlczEpOworICAgICAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzcsIHNoZl92ZWM4LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMyLCBoel9yZXMyKTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxMCwgc2hmX3ZlYzExLCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMzLCBoel9yZXMzKTsKKyAgICAgICAgU1JBUklfVzRfU1coaHpfcmVzMCwgaHpfcmVzMSwgaHpfcmVzMiwgaHpfcmVzMywgMTApOworICAgICAgICBTQVRfU1c0X1NXKGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczMsIDcpOworICAgICAgICBkc3QwID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMiwgNSk7CisgICAgICAgIGRzdDEgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM1LCA1KTsKKyAgICAgICAgZHN0MiA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzgsIDUpOworICAgICAgICBkc3QzID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMTEsIDUpOworICAgICAgICBTQVRfU0g0X1NIKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcpOworICAgICAgICBQQ0tFVl9IMl9TSChkc3QyLCBkc3QwLCBkc3QzLCBkc3QxLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgUENLRVZfSDJfU0goaHpfcmVzMiwgaHpfcmVzMCwgaHpfcmVzMywgaHpfcmVzMSwgZHN0MiwgZHN0Myk7CisgICAgICAgIGRzdDAgPSBfX21zYV9hdmVyX3NfaChkc3QyLCBkc3QwKTsKKyAgICAgICAgZHN0MSA9IF9fbXNhX2F2ZXJfc19oKGRzdDMsIGRzdDEpOworICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDEpOworICAgICAgICBTVF9VQihvdXQsIGRzdCk7CisgICAgICAgIGRzdCArPSBzdHJpZGU7CisKKyAgICAgICAgc3JjMCA9IHNyYzE7CisgICAgICAgIHNyYzEgPSBzcmMyOworICAgICAgICBzcmMyID0gc3JjMzsKKyAgICAgICAgc3JjMyA9IHNyYzQ7CisgICAgICAgIHNyYzQgPSBzcmM1OworICAgICAgICBzcmM3ID0gc3JjODsKKyAgICAgICAgc3JjOCA9IHNyYzk7CisgICAgICAgIHNyYzkgPSBzcmMxMDsKKyAgICAgICAgc3JjMTAgPSBzcmMxMTsKKyAgICAgICAgc3JjMTEgPSBzcmM2OworICAgIH0KK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQzMl90IHJvdzsKKyAgICB2MTZ1OCBvdXQ7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CisgICAgdjE2aTggc3JjMTE7CisgICAgdjhpMTYgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMiwgdnRfcmVzMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgbWFzazM7CisgICAgdjhpMTYgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNSwgc2hmX3ZlYzY7CisgICAgdjhpMTYgc2hmX3ZlYzcsIHNoZl92ZWM4LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTEsIG1hc2s0LCBtYXNrNTsKKyAgICB2NGkzMiBoel9yZXMwLCBoel9yZXMxLCBoel9yZXMyLCBoel9yZXMzOworICAgIHY4aTE2IG1hc2swID0geyAwLCA1LCAxLCA2LCAyLCA3LCAzLCA4IH07CisgICAgdjhpMTYgbWFzazEgPSB7IDEsIDQsIDIsIDUsIDMsIDYsIDQsIDcgfTsKKyAgICB2OGkxNiBtYXNrMiA9IHsgMiwgMywgMywgNCwgNCwgNSwgNSwgNiB9OworICAgIHY4aTE2IG1pbnVzNWggPSBfX21zYV9sZGlfaCgtNSk7CisgICAgdjhpMTYgcGx1czIwaCA9IF9fbXNhX2xkaV9oKDIwKTsKKworICAgIG1hc2szID0gbWFzazAgKyA0OworICAgIG1hc2s0ID0gbWFzazEgKyA0OworICAgIG1hc2s1ID0gbWFzazIgKyA0OworCisgICAgc3JjIC09ICgoMiAqIHN0cmlkZSkgKyAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgTERfU0I1KHNyYyArIDgsIHN0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExKTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSk7CisKKyAgICBmb3IgKHJvdyA9IDE2OyByb3ctLTspIHsKKyAgICAgICAgTERfU0IyKHNyYywgOCwgc3JjNSwgc3JjNik7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzUsIHNyYzYpOworCisgICAgICAgIEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfU0goc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dF9yZXMwLCB2dF9yZXMxKTsKKyAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRfcmVzMiwgdnRfcmVzMyk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgbWFzazAsCisgICAgICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgICAgICBtYXNrMSwgbWFzazIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIG1hc2s0LCBtYXNrNSwgc2hmX3ZlYzYsIHNoZl92ZWM3LCBzaGZfdmVjOCk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgbWFzazMsCisgICAgICAgICAgICAgICAgICAgbWFzazQsIG1hc2s1LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTEpOworICAgICAgICBoel9yZXMwID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICAgICAgaHpfcmVzMSA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgICAgIGh6X3JlczIgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjNiwgc2hmX3ZlYzYpOworICAgICAgICBoel9yZXMzID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzksIHNoZl92ZWM5KTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjNCwgc2hmX3ZlYzUsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczEsIGh6X3JlczEpOworICAgICAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzcsIHNoZl92ZWM4LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMyLCBoel9yZXMyKTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxMCwgc2hmX3ZlYzExLCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMzLCBoel9yZXMzKTsKKyAgICAgICAgU1JBUklfVzRfU1coaHpfcmVzMCwgaHpfcmVzMSwgaHpfcmVzMiwgaHpfcmVzMywgMTApOworICAgICAgICBTQVRfU1c0X1NXKGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczMsIDcpOworICAgICAgICBkc3QwID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMiwgNSk7CisgICAgICAgIGRzdDEgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM1LCA1KTsKKyAgICAgICAgZHN0MiA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzgsIDUpOworICAgICAgICBkc3QzID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMTEsIDUpOworICAgICAgICBTQVRfU0g0X1NIKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcpOworICAgICAgICBkc3QwID0gX19tc2FfcGNrb2RfaChkc3QyLCBkc3QwKTsKKyAgICAgICAgZHN0MSA9IF9fbXNhX3Bja29kX2goZHN0MywgZHN0MSk7CisgICAgICAgIFBDS0VWX0gyX1NIKGh6X3JlczIsIGh6X3JlczAsIGh6X3JlczMsIGh6X3JlczEsIGRzdDIsIGRzdDMpOworICAgICAgICBkc3QwID0gX19tc2FfYXZlcl9zX2goZHN0MiwgZHN0MCk7CisgICAgICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QzLCBkc3QxKTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QxKTsKKyAgICAgICAgU1RfVUIob3V0LCBkc3QpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworCisgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICBzcmMxID0gc3JjMjsKKyAgICAgICAgc3JjMiA9IHNyYzM7CisgICAgICAgIHNyYzMgPSBzcmM0OworICAgICAgICBzcmM0ID0gc3JjNTsKKyAgICAgICAgc3JjNyA9IHNyYzg7CisgICAgICAgIHNyYzggPSBzcmM5OworICAgICAgICBzcmM5ID0gc3JjMTA7CisgICAgICAgIHNyYzEwID0gc3JjMTE7CisgICAgICAgIHNyYzExID0gc3JjNjsKKyAgICB9Cit9CisKK3ZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMxMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDMyX3Qgcm93OworICAgIHYxNnU4IG91dDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OworICAgIHY4aTE2IHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczIsIHZ0X3JlczMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjhpMTYgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNSwgc2hmX3ZlYzY7CisgICAgdjhpMTYgc2hmX3ZlYzcsIHNoZl92ZWM4LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTE7CisgICAgdjhpMTYgbWFzazMsIG1hc2s0LCBtYXNrNTsKKyAgICB2NGkzMiBoel9yZXMwLCBoel9yZXMxLCBoel9yZXMyLCBoel9yZXMzOworICAgIHY4aTE2IG1hc2swID0geyAwLCA1LCAxLCA2LCAyLCA3LCAzLCA4IH07CisgICAgdjhpMTYgbWFzazEgPSB7IDEsIDQsIDIsIDUsIDMsIDYsIDQsIDcgfTsKKyAgICB2OGkxNiBtYXNrMiA9IHsgMiwgMywgMywgNCwgNCwgNSwgNSwgNiB9OworICAgIHY4aTE2IG1pbnVzNWggPSBfX21zYV9sZGlfaCgtNSk7CisgICAgdjhpMTYgcGx1czIwaCA9IF9fbXNhX2xkaV9oKDIwKTsKKworICAgIG1hc2szID0gbWFzazAgKyA0OworICAgIG1hc2s0ID0gbWFzazEgKyA0OworICAgIG1hc2s1ID0gbWFzazIgKyA0OworCisgICAgc3JjIC09ICgoMiAqIHN0cmlkZSkgKyAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKworICAgIGZvciAocm93ID0gNDsgcm93LS07KSB7CisgICAgICAgIExEX1NCMihzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNik7CisgICAgICAgIHNyYyArPSAoMiAqIHN0cmlkZSk7CisgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzUsIHNyYzYpOworCisgICAgICAgIEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfU0goc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dF9yZXMwLCB2dF9yZXMxKTsKKyAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0X3JlczIsIHZ0X3JlczMpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2swLAorICAgICAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjMik7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgbWFzazAsCisgICAgICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1KTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICBtYXNrNCwgbWFzazUsIHNoZl92ZWM2LCBzaGZfdmVjNywgc2hmX3ZlYzgpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIG1hc2s0LCBtYXNrNSwgc2hmX3ZlYzksIHNoZl92ZWMxMCwgc2hmX3ZlYzExKTsKKyAgICAgICAgaHpfcmVzMCA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMwLCBzaGZfdmVjMCk7CisgICAgICAgIGh6X3JlczEgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjMywgc2hmX3ZlYzMpOworICAgICAgICBoel9yZXMyID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzYsIHNoZl92ZWM2KTsKKyAgICAgICAgaHpfcmVzMyA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWM5LCBzaGZfdmVjOSk7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjMSwgc2hmX3ZlYzIsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczAsIGh6X3JlczApOworICAgICAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzQsIHNoZl92ZWM1LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMxLCBoel9yZXMxKTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWM3LCBzaGZfdmVjOCwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMiwgaHpfcmVzMik7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjMTAsIHNoZl92ZWMxMSwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMywgaHpfcmVzMyk7CisgICAgICAgIFNSQVJJX1c0X1NXKGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczMsIDEwKTsKKyAgICAgICAgU0FUX1NXNF9TVyhoel9yZXMwLCBoel9yZXMxLCBoel9yZXMyLCBoel9yZXMzLCA3KTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzIsIDUpOworICAgICAgICBkc3QxID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjNSwgNSk7CisgICAgICAgIGRzdDIgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM4LCA1KTsKKyAgICAgICAgZHN0MyA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzExLCA1KTsKKyAgICAgICAgU0FUX1NINF9TSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3KTsKKyAgICAgICAgUENLRVZfSDJfU0goZHN0MiwgZHN0MCwgZHN0MywgZHN0MSwgZHN0MCwgZHN0MSk7CisgICAgICAgIFBDS0VWX0gyX1NIKGh6X3JlczIsIGh6X3JlczAsIGh6X3JlczMsIGh6X3JlczEsIGRzdDIsIGRzdDMpOworICAgICAgICBkc3QwID0gX19tc2FfYXZlcl9zX2goZHN0MiwgZHN0MCk7CisgICAgICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QzLCBkc3QxKTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QxKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0LCBkc3QsIHN0cmlkZSk7CisgICAgICAgIGRzdCArPSAoMiAqIHN0cmlkZSk7CisKKyAgICAgICAgc3JjMCA9IHNyYzI7CisgICAgICAgIHNyYzEgPSBzcmMzOworICAgICAgICBzcmMyID0gc3JjNDsKKyAgICAgICAgc3JjMyA9IHNyYzU7CisgICAgICAgIHNyYzQgPSBzcmM2OworICAgIH0KK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50MzJfdCByb3c7CisgICAgdjE2dTggb3V0OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzY7CisgICAgdjhpMTYgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMiwgdnRfcmVzMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICB2OGkxNiBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1LCBzaGZfdmVjNjsKKyAgICB2OGkxNiBzaGZfdmVjNywgc2hmX3ZlYzgsIHNoZl92ZWM5LCBzaGZfdmVjMTAsIHNoZl92ZWMxMTsKKyAgICB2OGkxNiBtYXNrMywgbWFzazQsIG1hc2s1OworICAgIHY0aTMyIGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczM7CisgICAgdjhpMTYgbWFzazAgPSB7IDAsIDUsIDEsIDYsIDIsIDcsIDMsIDggfTsKKyAgICB2OGkxNiBtYXNrMSA9IHsgMSwgNCwgMiwgNSwgMywgNiwgNCwgNyB9OworICAgIHY4aTE2IG1hc2syID0geyAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2IH07CisgICAgdjhpMTYgbWludXM1aCA9IF9fbXNhX2xkaV9oKC01KTsKKyAgICB2OGkxNiBwbHVzMjBoID0gX19tc2FfbGRpX2goMjApOworCisgICAgbWFzazMgPSBtYXNrMCArIDQ7CisgICAgbWFzazQgPSBtYXNrMSArIDQ7CisgICAgbWFzazUgPSBtYXNrMiArIDQ7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworCisgICAgZm9yIChyb3cgPSA0OyByb3ctLTspIHsKKyAgICAgICAgTERfU0IyKHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjICs9ICgyICogc3RyaWRlKTsKKyAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7CisKKyAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0X3JlczAsIHZ0X3JlczEpOworICAgICAgICBBVkNfQ0FMQ19EUEFERF9CXzZQSVhfMkNPRUZGX1NIKHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRfcmVzMiwgdnRfcmVzMyk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgbWFzazAsCisgICAgICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgICAgICBtYXNrMSwgbWFzazIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIG1hc2s0LCBtYXNrNSwgc2hmX3ZlYzYsIHNoZl92ZWM3LCBzaGZfdmVjOCk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgbWFzazMsCisgICAgICAgICAgICAgICAgICAgbWFzazQsIG1hc2s1LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTEpOworICAgICAgICBoel9yZXMwID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICAgICAgaHpfcmVzMSA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgICAgIGh6X3JlczIgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjNiwgc2hmX3ZlYzYpOworICAgICAgICBoel9yZXMzID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzksIHNoZl92ZWM5KTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjNCwgc2hmX3ZlYzUsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczEsIGh6X3JlczEpOworICAgICAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzcsIHNoZl92ZWM4LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMyLCBoel9yZXMyKTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxMCwgc2hmX3ZlYzExLCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMzLCBoel9yZXMzKTsKKyAgICAgICAgU1JBUklfVzRfU1coaHpfcmVzMCwgaHpfcmVzMSwgaHpfcmVzMiwgaHpfcmVzMywgMTApOworICAgICAgICBTQVRfU1c0X1NXKGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczMsIDcpOworICAgICAgICBkc3QwID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMiwgNSk7CisgICAgICAgIGRzdDEgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM1LCA1KTsKKyAgICAgICAgZHN0MiA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzgsIDUpOworICAgICAgICBkc3QzID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMTEsIDUpOworICAgICAgICBTQVRfU0g0X1NIKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcpOworICAgICAgICBkc3QwID0gX19tc2FfcGNrb2RfaChkc3QyLCBkc3QwKTsKKyAgICAgICAgZHN0MSA9IF9fbXNhX3Bja29kX2goZHN0MywgZHN0MSk7CisgICAgICAgIFBDS0VWX0gyX1NIKGh6X3JlczIsIGh6X3JlczAsIGh6X3JlczMsIGh6X3JlczEsIGRzdDIsIGRzdDMpOworICAgICAgICBkc3QwID0gX19tc2FfYXZlcl9zX2goZHN0MiwgZHN0MCk7CisgICAgICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QzLCBkc3QxKTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QxKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0LCBkc3QsIHN0cmlkZSk7CisgICAgICAgIGRzdCArPSAoMiAqIHN0cmlkZSk7CisKKyAgICAgICAgc3JjMCA9IHNyYzI7CisgICAgICAgIHNyYzEgPSBzcmMzOworICAgICAgICBzcmMyID0gc3JjNDsKKyAgICAgICAgc3JjMyA9IHNyYzU7CisgICAgICAgIHNyYzQgPSBzcmM2OworICAgIH0KK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzEyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNnU4IG91dDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNmk4IHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IsIHNyYzU0X3IsIHNyYzY1X3IsIHNyYzc2X3I7CisgICAgdjE2aTggc3JjODdfciwgc3JjMTBfbCwgc3JjMjFfbCwgc3JjMzJfbCwgc3JjNDNfbCwgc3JjNTRfbCwgc3JjNjVfbDsKKyAgICB2MTZpOCBzcmM3Nl9sLCBzcmM4N19sLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczIsIHZ0X3JlczMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHNoZl92ZWM3OworICAgIHY4aTE2IHNoZl92ZWMwLCBzaGZfdmVjMSwgc2hmX3ZlYzIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUsIHNoZl92ZWM2OworICAgIHY0aTMyIGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczM7CisgICAgdjhpMTYgbWFzazAgPSB7IDAsIDUsIDEsIDYsIDIsIDcsIDMsIDggfTsKKyAgICB2OGkxNiBtYXNrMSA9IHsgMSwgNCwgMiwgNSwgMywgNiwgNCwgNyB9OworICAgIHY4aTE2IG1hc2syID0geyAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2IH07CisgICAgdjhpMTYgbWludXM1aCA9IF9fbXNhX2xkaV9oKC01KTsKKyAgICB2OGkxNiBwbHVzMjBoID0gX19tc2FfbGRpX2goMjApOworICAgIHY4aTE2IHplcm9zID0geyAwIH07CisKKyAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKKworICAgIHNyYyAtPSAoKDIgKiBzdHJpZGUpICsgMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwgc3JjNjVfciwKKyAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IpOworICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfbCwgc3JjMjFfbCwKKyAgICAgICAgICAgICAgIHNyYzMyX2wsIHNyYzQzX2wpOworICAgIElMVkxfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfbCwgc3JjNjVfbCwKKyAgICAgICAgICAgICAgIHNyYzc2X2wsIHNyYzg3X2wpOworICAgIHZ0X3JlczAgPSBBVkNfRE9UX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICB2dF9yZXMxID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgdnRfcmVzMiA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIHZ0X3JlczMgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2swLAorICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKKyAgICBWU0hGX0gzX1NIKHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIG1hc2swLAorICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1KTsKKyAgICBoel9yZXMwID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzEsIHNoZl92ZWMyLCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMwLCBoel9yZXMwKTsKKyAgICBoel9yZXMxID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzMsIHNoZl92ZWMzKTsKKyAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzQsIHNoZl92ZWM1LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMxLCBoel9yZXMxKTsKKworICAgIHZ0X3JlczAgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICB2dF9yZXMxID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgdnRfcmVzMiA9IEFWQ19ET1RfU0gzX1NIKHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIHZ0X3JlczMgPSBBVkNfRE9UX1NIM19TSChzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2swLAorICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWM2KTsKKyAgICBWU0hGX0gzX1NIKHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIG1hc2swLAorICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM3KTsKKyAgICBoel9yZXMyID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzEsIHNoZl92ZWM2LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMyLCBoel9yZXMyKTsKKyAgICBoel9yZXMzID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzMsIHNoZl92ZWMzKTsKKyAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzQsIHNoZl92ZWM3LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMzLCBoel9yZXMzKTsKKworICAgIFNSQVJJX1cyX1NXKGh6X3JlczAsIGh6X3JlczEsIDEwKTsKKyAgICBTQVRfU1cyX1NXKGh6X3JlczAsIGh6X3JlczEsIDcpOworICAgIFNSQVJJX1cyX1NXKGh6X3JlczIsIGh6X3JlczMsIDEwKTsKKyAgICBTQVRfU1cyX1NXKGh6X3JlczIsIGh6X3JlczMsIDcpOworCisgICAgZHN0MCA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzIsIDUpOworICAgIGRzdDEgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM1LCA1KTsKKyAgICBkc3QyID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjNiwgNSk7CisgICAgZHN0MyA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzcsIDUpOworCisgICAgU0FUX1NIMl9TSChkc3QwLCBkc3QxLCA3KTsKKyAgICBTQVRfU0gyX1NIKGRzdDIsIGRzdDMsIDcpOworICAgIElMVkVWX0gyX1NIKGRzdDAsIHplcm9zLCBkc3QxLCB6ZXJvcywgZHN0MCwgZHN0MSk7CisgICAgSUxWRVZfSDJfU0goZHN0MiwgemVyb3MsIGRzdDMsIHplcm9zLCBkc3QyLCBkc3QzKTsKKworICAgIGh6X3JlczAgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMwLCAodjRpMzIpIGRzdDApOworICAgIGh6X3JlczEgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMxLCAodjRpMzIpIGRzdDEpOworICAgIGh6X3JlczIgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMyLCAodjRpMzIpIGRzdDIpOworICAgIGh6X3JlczMgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMzLCAodjRpMzIpIGRzdDMpOworCisgICAgUENLRVZfSDJfU0goaHpfcmVzMSwgaHpfcmVzMCwgaHpfcmVzMywgaHpfcmVzMiwgZHN0MCwgZHN0Mik7CisgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QyKTsKKyAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMzJfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgdjE2dTggb3V0OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfciwgc3JjNTRfciwgc3JjNjVfciwgc3JjNzZfcjsKKyAgICB2MTZpOCBzcmM4N19yLCBzcmMxMF9sLCBzcmMyMV9sLCBzcmMzMl9sLCBzcmM0M19sLCBzcmM1NF9sLCBzcmM2NV9sOworICAgIHYxNmk4IHNyYzc2X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMiwgdnRfcmVzMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgc2hmX3ZlYzc7CisgICAgdjhpMTYgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNSwgc2hmX3ZlYzY7CisgICAgdjRpMzIgaHpfcmVzMCwgaHpfcmVzMSwgaHpfcmVzMiwgaHpfcmVzMzsKKyAgICB2OGkxNiBtYXNrMCA9IHsgMCwgNSwgMSwgNiwgMiwgNywgMywgOCB9OworICAgIHY4aTE2IG1hc2sxID0geyAxLCA0LCAyLCA1LCAzLCA2LCA0LCA3IH07CisgICAgdjhpMTYgbWFzazIgPSB7IDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYgfTsKKyAgICB2OGkxNiBtaW51czVoID0gX19tc2FfbGRpX2goLTUpOworICAgIHY4aTE2IHBsdXMyMGggPSBfX21zYV9sZGlfaCgyMCk7CisgICAgdjhpMTYgemVyb3MgPSB7IDAgfTsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgc3JjIC09ICgoMiAqIHN0cmlkZSkgKyAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworCisgICAgSUxWUl9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMxMF9yLCBzcmMyMV9yLAorICAgICAgICAgICAgICAgc3JjMzJfciwgc3JjNDNfcik7CisgICAgSUxWUl9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM1NF9yLCBzcmM2NV9yLAorICAgICAgICAgICAgICAgc3JjNzZfciwgc3JjODdfcik7CisgICAgSUxWTF9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMxMF9sLCBzcmMyMV9sLAorICAgICAgICAgICAgICAgc3JjMzJfbCwgc3JjNDNfbCk7CisgICAgSUxWTF9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM1NF9sLCBzcmM2NV9sLAorICAgICAgICAgICAgICAgc3JjNzZfbCwgc3JjODdfbCk7CisKKyAgICB2dF9yZXMwID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgdnRfcmVzMSA9IEFWQ19ET1RfU0gzX1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIHZ0X3JlczIgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICB2dF9yZXMzID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgVlNIRl9IM19TSCh2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCBtYXNrMCwKKyAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjMik7CisgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNSk7CisgICAgaHpfcmVzMCA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMwLCBzaGZfdmVjMCk7CisgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7CisgICAgaHpfcmVzMSA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgRFBBRERfU0gyX1NXKHNoZl92ZWM0LCBzaGZfdmVjNSwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMSwgaHpfcmVzMSk7CisKKyAgICB2dF9yZXMwID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgdnRfcmVzMSA9IEFWQ19ET1RfU0gzX1NIKHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIHZ0X3JlczIgPSBBVkNfRE9UX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICB2dF9yZXMzID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgVlNIRl9IM19TSCh2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCBtYXNrMCwKKyAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjNik7CisgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNyk7CisgICAgaHpfcmVzMiA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMwLCBzaGZfdmVjMCk7CisgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjNiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMiwgaHpfcmVzMik7CisgICAgaHpfcmVzMyA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgRFBBRERfU0gyX1NXKHNoZl92ZWM0LCBzaGZfdmVjNywgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMywgaHpfcmVzMyk7CisKKyAgICBTUkFSSV9XMl9TVyhoel9yZXMwLCBoel9yZXMxLCAxMCk7CisgICAgU0FUX1NXMl9TVyhoel9yZXMwLCBoel9yZXMxLCA3KTsKKyAgICBTUkFSSV9XMl9TVyhoel9yZXMyLCBoel9yZXMzLCAxMCk7CisgICAgU0FUX1NXMl9TVyhoel9yZXMyLCBoel9yZXMzLCA3KTsKKworICAgIGRzdDAgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWMyLCA1KTsKKyAgICBkc3QxID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjNSwgNSk7CisgICAgZHN0MiA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzYsIDUpOworICAgIGRzdDMgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM3LCA1KTsKKworICAgIFNBVF9TSDJfU0goZHN0MCwgZHN0MSwgNyk7CisgICAgU0FUX1NIMl9TSChkc3QyLCBkc3QzLCA3KTsKKworICAgIGRzdDAgPSBfX21zYV9pbHZvZF9oKHplcm9zLCBkc3QwKTsKKyAgICBkc3QxID0gX19tc2FfaWx2b2RfaCh6ZXJvcywgZHN0MSk7CisgICAgZHN0MiA9IF9fbXNhX2lsdm9kX2goemVyb3MsIGRzdDIpOworICAgIGRzdDMgPSBfX21zYV9pbHZvZF9oKHplcm9zLCBkc3QzKTsKKworICAgIGh6X3JlczAgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMwLCAodjRpMzIpIGRzdDApOworICAgIGh6X3JlczEgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMxLCAodjRpMzIpIGRzdDEpOworICAgIGh6X3JlczIgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMyLCAodjRpMzIpIGRzdDIpOworICAgIGh6X3JlczMgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMzLCAodjRpMzIpIGRzdDMpOworCisgICAgUENLRVZfSDJfU0goaHpfcmVzMSwgaHpfcmVzMCwgaHpfcmVzMywgaHpfcmVzMiwgZHN0MCwgZHN0Mik7CisgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QyKTsKKyAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzIyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MCA9IDB4ZmZmYjAwMDE7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MSA9IDB4MTQwMDE0OworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDIgPSAweDFmZmZiOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY190bXAgPSBzcmMgLSAoMiAqIHN0cmlkZSkgLSAyOworICAgIHVpbnQ4X3QgKmRzdF90bXAgPSBkc3Q7CisgICAgdWludDMyX3QgbXVsdGlwbGU4X2NudCwgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHY4aTE2IGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIGh6X291dDY7CisgICAgdjhpMTYgaHpfb3V0NywgaHpfb3V0OCwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICB2OGkxNiBoel9vdXQxMF9yLCBoel9vdXQyMV9yLCBoel9vdXQzMl9yLCBoel9vdXQ0M19yLCBoel9vdXQ1NF9yOworICAgIHY4aTE2IGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IsIGh6X291dDEwX2wsIGh6X291dDIxX2w7CisgICAgdjhpMTYgaHpfb3V0MzJfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NTRfbCwgaHpfb3V0NjVfbCwgaHpfb3V0NzZfbDsKKyAgICB2OGkxNiBoel9vdXQ4N19sLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY0aTMyIHRtcDAsIHRtcDE7CisKKyAgICBmaWx0MCA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QyKTsKKworICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZm9yIChtdWx0aXBsZThfY250ID0gMjsgbXVsdGlwbGU4X2NudC0tOykgeworICAgICAgICBzcmMgPSBzcmNfdG1wOworICAgICAgICBkc3QgPSBkc3RfdG1wOworCisgICAgICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgICAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworCisgICAgICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgIGh6X291dDMgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgIGh6X291dDQgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICAgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgICAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgICAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOworCisgICAgICAgICAgICBoel9vdXQ1ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgaHpfb3V0NiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgICAgICAgICBJTFZSX0g0X1NIKGh6X291dDEsIGh6X291dDAsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMsIGh6X291dDIsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQzX3IpOworICAgICAgICAgICAgSUxWTF9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQzLCBoel9vdXQxMF9sLCBoel9vdXQyMV9sLCBoel9vdXQzMl9sLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0M19sKTsKKyAgICAgICAgICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0OCwgaHpfb3V0NywgaHpfb3V0NTRfciwgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0ODdfcik7CisgICAgICAgICAgICBJTFZMX0g0X1NIKGh6X291dDUsIGh6X291dDQsIGh6X291dDYsIGh6X291dDUsIGh6X291dDcsIGh6X291dDYsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDgsIGh6X291dDcsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2wsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDg3X2wpOworCisgICAgICAgICAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MTBfciwgaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgICAgICAgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX3IsIGh6X291dDQzX3IsIGh6X291dDY1X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NjVfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICAgICAgICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX2wsIGh6X291dDU0X2wsIGh6X291dDc2X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICBkc3QyID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgICAgICAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgZHN0MyA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworCisgICAgICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QxKTsKKyAgICAgICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDIsIGRzdDMpOworICAgICAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworICAgICAgICAgICAgZHN0ICs9ICg0ICogc3RyaWRlKTsKKworICAgICAgICAgICAgaHpfb3V0MCA9IGh6X291dDQ7CisgICAgICAgICAgICBoel9vdXQxID0gaHpfb3V0NTsKKyAgICAgICAgICAgIGh6X291dDIgPSBoel9vdXQ2OworICAgICAgICAgICAgaHpfb3V0MyA9IGh6X291dDc7CisgICAgICAgICAgICBoel9vdXQ0ID0gaHpfb3V0ODsKKyAgICAgICAgfQorCisgICAgICAgIHNyY190bXAgKz0gODsKKyAgICAgICAgZHN0X3RtcCArPSA4OworICAgIH0KK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzIyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QwID0gMHhmZmZiMDAwMTsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QxID0gMHgxNDAwMTQ7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MiA9IDB4MWZmZmI7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHY4aTE2IGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIGh6X291dDY7CisgICAgdjhpMTYgaHpfb3V0NywgaHpfb3V0OCwgaHpfb3V0OSwgaHpfb3V0MTAsIGh6X291dDExLCBoel9vdXQxMjsKKyAgICB2OGkxNiBoel9vdXQxMF9yLCBoel9vdXQyMV9yLCBoel9vdXQzMl9yLCBoel9vdXQ0M19yLCBoel9vdXQ1NF9yOworICAgIHY4aTE2IGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IsIGh6X291dDg5X3IsIGh6X291dDkxMF9yOworICAgIHY4aTE2IGh6X291dDExMTBfciwgaHpfb3V0MTIxMV9yLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHY4aTE2IGh6X291dDEwX2wsIGh6X291dDIxX2wsIGh6X291dDMyX2wsIGh6X291dDQzX2wsIGh6X291dDU0X2w7CisgICAgdjhpMTYgaHpfb3V0NjVfbCwgaHpfb3V0NzZfbCwgaHpfb3V0ODdfbCwgaHpfb3V0ODlfbCwgaHpfb3V0OTEwX2w7CisgICAgdjhpMTYgaHpfb3V0MTExMF9sLCBoel9vdXQxMjExX2wsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjRpMzIgdG1wMCwgdG1wMTsKKworICAgIGZpbHQwID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDIpOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDMgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0NCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKKyAgICBoel9vdXQ1ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0NyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIElMVlJfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IpOworICAgIElMVkxfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX2wsIGh6X291dDIxX2wsIGh6X291dDMyX2wsIGh6X291dDQzX2wpOworICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X3IsIGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IpOworICAgIElMVkxfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2wsIGh6X291dDg3X2wpOworCisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDEwX3IsIGh6X291dDMyX3IsIGh6X291dDU0X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX3IsIGh6X291dDQzX3IsIGh6X291dDY1X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQyMV9sLCBoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX3IsIGh6X291dDU0X3IsIGh6X291dDc2X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBoel9vdXQ3Nl9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QyID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDQzX3IsIGh6X291dDY1X3IsIGh6X291dDg3X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QzID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MCwgZHN0MSk7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MiwgZHN0Myk7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIGh6X291dDkgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MTAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MTEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MTIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgSUxWUl9INF9TSChoel9vdXQ5LCBoel9vdXQ4LCBoel9vdXQxMCwgaHpfb3V0OSwgaHpfb3V0MTEsIGh6X291dDEwLAorICAgICAgICAgICAgICAgaHpfb3V0MTIsIGh6X291dDExLCBoel9vdXQ4OV9yLCBoel9vdXQ5MTBfciwgaHpfb3V0MTExMF9yLAorICAgICAgICAgICAgICAgaHpfb3V0MTIxMV9yKTsKKyAgICBJTFZMX0g0X1NIKGh6X291dDksIGh6X291dDgsIGh6X291dDEwLCBoel9vdXQ5LCBoel9vdXQxMSwgaHpfb3V0MTAsCisgICAgICAgICAgICAgICBoel9vdXQxMiwgaHpfb3V0MTEsIGh6X291dDg5X2wsIGh6X291dDkxMF9sLCBoel9vdXQxMTEwX2wsCisgICAgICAgICAgICAgICBoel9vdXQxMjExX2wpOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4OV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NTRfbCwgaHpfb3V0NzZfbCwgaHpfb3V0ODlfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ2NV9yLCBoel9vdXQ4N19yLCBoel9vdXQ5MTBfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDY1X2wsIGh6X291dDg3X2wsIGh6X291dDkxMF9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDc2X3IsIGh6X291dDg5X3IsIGh6X291dDExMTBfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDc2X2wsIGh6X291dDg5X2wsIGh6X291dDExMTBfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ4N19yLCBoel9vdXQ5MTBfciwgaHpfb3V0MTIxMV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0ODdfbCwgaHpfb3V0OTEwX2wsIGh6X291dDEyMTFfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MyA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDEpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDIsIGRzdDMpOworICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzIyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QwID0gMHhmZmZiMDAwMTsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QxID0gMHgxNDAwMTQ7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MiA9IDB4MWZmZmI7CisgICAgdjE2dTggcmVzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMjsKKyAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2OworICAgIHY4aTE2IGh6X291dDcsIGh6X291dDgsIGRzdDAsIGRzdDEsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfciwgaHpfb3V0NTRfcjsKKyAgICB2OGkxNiBoel9vdXQ2NV9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4N19yOworICAgIHY0aTMyIHRtcDAsIHRtcDE7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbNDhdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBmaWx0MCA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QyKTsKKworICAgIHNyYyAtPSAoKDIgKiBzdHJpZGUpICsgMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNiwgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0OCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBQQ0tPRF9EMl9TSChoel9vdXQwLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzKTsKKyAgICBQQ0tPRF9EMl9TSChoel9vdXQ0LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3KTsKKyAgICBJTFZSX0g0X1NIKGh6X291dDEsIGh6X291dDAsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMsIGh6X291dDIsIGh6X291dDQsCisgICAgICAgICAgICAgICBoel9vdXQzLCBoel9vdXQxMF9yLCBoel9vdXQyMV9yLCBoel9vdXQzMl9yLCBoel9vdXQ0M19yKTsKKyAgICBJTFZSX0g0X1NIKGh6X291dDUsIGh6X291dDQsIGh6X291dDYsIGh6X291dDUsIGh6X291dDcsIGh6X291dDYsIGh6X291dDgsCisgICAgICAgICAgICAgICBoel9vdXQ3LCBoel9vdXQ1NF9yLCBoel9vdXQ2NV9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4N19yKTsKKworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9yLCBoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfciwgaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgZHN0MSA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIHJlcyA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MCwgZHN0MSk7CisgICAgU1Q0eDRfVUIocmVzLCByZXMsIDAsIDEsIDIsIDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IGRzdDAsIGRzdDE7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCB2c2hmOwotICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKLSAgICB2MTZpOCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTE7CisgICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICB2MTZpOCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIHNyYzcsIHZlYzExOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzksIHZlYzEwOworICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7CiAgICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKICAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOwogCiAgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgbWFzazMgPSBtYXNrMCArIDg7CisgICAgbWFzazQgPSBtYXNrMSArIDg7CisgICAgbWFzazUgPSBtYXNrMiArIDg7CisgICAgc3JjIC09IDI7CiAKLSAgICBpZiAoaG9yX29mZnNldCkgewotICAgICAgICB2c2hmID0gTERfU0IoJmx1bWFfbWFza19hcnJbMTYgKyA5Nl0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHZzaGYgPSBMRF9TQigmbHVtYV9tYXNrX2Fycls5Nl0pOworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjMCwgc3JjMSk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIExEX1NCMihzcmMsIDE2LCBzcmMyLCBzcmMzKTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgTERfU0IyKHNyYywgMTYsIHNyYzQsIHNyYzUpOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisKKyAgICAgICAgTERfVUI0KGRzdCwgc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2szLCB2ZWMwLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazMsIHZlYzYsIHZlYzkpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2sxLCBtYXNrNCwgdmVjMSwgdmVjNCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMywgbWFzazEsIG1hc2s0LCB2ZWM3LCB2ZWMxMCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2s1LCB2ZWMyLCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazUsIHZlYzgsIHZlYzExKTsKKyAgICAgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMywgdmVjNiwgdmVjOSwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMxLCB2ZWM0LCB2ZWM3LCB2ZWMxMCwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKKyAgICAgICAgICAgICAgICAgICAgIG1pbnVzNWIsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMiwgdmVjNSwgdmVjOCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCisgICAgICAgICAgICAgICAgICAgICBwbHVzMjBiLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM1LCBtYXNrMCwgbWFzazMsIHZlYzAsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMywgdmVjNiwgdmVjOSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNSwgbWFzazEsIG1hc2s0LCB2ZWMxLCB2ZWM0KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM3LCBtYXNrMSwgbWFzazQsIHZlYzcsIHZlYzEwKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM1LCBtYXNrMiwgbWFzazUsIHZlYzIsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzcsIG1hc2syLCBtYXNrNSwgdmVjOCwgdmVjMTEpOworICAgICAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMzLCB2ZWM2LCB2ZWM5LCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzEsIHZlYzQsIHZlYzcsIHZlYzEwLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICAgICAgbWludXM1YiwgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMyLCB2ZWM1LCB2ZWM4LCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgICAgIHBsdXMyMGIsIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgICAgICBTTERJX0IyX1NCKHNyYzEsIHNyYzMsIHNyYzAsIHNyYzIsIHNyYzAsIHNyYzIsIDIpOworICAgICAgICBTTERJX0IyX1NCKHNyYzUsIHNyYzcsIHNyYzQsIHNyYzYsIHNyYzQsIHNyYzYsIDIpOworICAgICAgICBTUkFSSV9INF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA1KTsKKyAgICAgICAgU1JBUklfSDRfU0gocmVzNCwgcmVzNSwgcmVzNiwgcmVzNywgNSk7CisgICAgICAgIFNBVF9TSDRfU0gocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgICAgIFNBVF9TSDRfU0gocmVzNCwgcmVzNSwgcmVzNiwgcmVzNywgNyk7CisgICAgICAgIFBDS0VWX0IyX1NCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9TQihyZXM1LCByZXM0LCByZXM3LCByZXM2LCBvdXQyLCBvdXQzKTsKKyAgICAgICAgb3V0MCA9IF9fbXNhX2F2ZXJfc19iKG91dDAsIHNyYzApOworICAgICAgICBvdXQxID0gX19tc2FfYXZlcl9zX2Iob3V0MSwgc3JjMik7CisgICAgICAgIG91dDIgPSBfX21zYV9hdmVyX3NfYihvdXQyLCBzcmM0KTsKKyAgICAgICAgb3V0MyA9IF9fbXNhX2F2ZXJfc19iKG91dDMsIHNyYzYpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgZHN0MCwgZHN0MSk7CisgICAgICAgIEFWRVJfVUIyX1VCKG91dDIsIGRzdDIsIG91dDMsIGRzdDMsIGRzdDIsIGRzdDMpOworICAgICAgICBTVF9VQjQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOwogICAgIH0KK30KIAotICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMTsgbG9vcF9jbnQtLTspIHsKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMzBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHYxNmk4IG91dDAsIG91dDEsIG91dDIsIG91dDMsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzY7CisgICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIG1hc2s0LCBtYXNrNSwgc3JjNywgdmVjMTE7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgdmVjOCwgdmVjOSwgdmVjMTA7CisgICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNzsKKyAgICB2MTZpOCBtaW51czViID0gX19tc2FfbGRpX2IoLTUpOworICAgIHYxNmk4IHBsdXMyMGIgPSBfX21zYV9sZGlfYigyMCk7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBtYXNrMyA9IG1hc2swICsgODsKKyAgICBtYXNrNCA9IG1hc2sxICsgODsKKyAgICBtYXNrNSA9IG1hc2syICsgODsKKyAgICBzcmMgLT0gMjsKKworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjMCwgc3JjMSk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIExEX1NCMihzcmMsIDE2LCBzcmMyLCBzcmMzKTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgTERfU0IyKHNyYywgMTYsIHNyYzQsIHNyYzUpOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisKKyAgICAgICAgTERfVUI0KGRzdCwgc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2szLCB2ZWMwLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazMsIHZlYzYsIHZlYzkpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2sxLCBtYXNrNCwgdmVjMSwgdmVjNCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMywgbWFzazEsIG1hc2s0LCB2ZWM3LCB2ZWMxMCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2s1LCB2ZWMyLCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazUsIHZlYzgsIHZlYzExKTsKKyAgICAgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMywgdmVjNiwgdmVjOSwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMxLCB2ZWM0LCB2ZWM3LCB2ZWMxMCwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKKyAgICAgICAgICAgICAgICAgICAgIG1pbnVzNWIsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMiwgdmVjNSwgdmVjOCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCisgICAgICAgICAgICAgICAgICAgICBwbHVzMjBiLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM1LCBtYXNrMCwgbWFzazMsIHZlYzAsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMywgdmVjNiwgdmVjOSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNSwgbWFzazEsIG1hc2s0LCB2ZWMxLCB2ZWM0KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM3LCBtYXNrMSwgbWFzazQsIHZlYzcsIHZlYzEwKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM1LCBtYXNrMiwgbWFzazUsIHZlYzIsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzcsIG1hc2syLCBtYXNrNSwgdmVjOCwgdmVjMTEpOworICAgICAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMzLCB2ZWM2LCB2ZWM5LCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzEsIHZlYzQsIHZlYzcsIHZlYzEwLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICAgICAgbWludXM1YiwgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMyLCB2ZWM1LCB2ZWM4LCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgICAgIHBsdXMyMGIsIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgICAgICBTTERJX0IyX1NCKHNyYzEsIHNyYzMsIHNyYzAsIHNyYzIsIHNyYzAsIHNyYzIsIDMpOworICAgICAgICBTTERJX0IyX1NCKHNyYzUsIHNyYzcsIHNyYzQsIHNyYzYsIHNyYzQsIHNyYzYsIDMpOworICAgICAgICBTUkFSSV9INF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA1KTsKKyAgICAgICAgU1JBUklfSDRfU0gocmVzNCwgcmVzNSwgcmVzNiwgcmVzNywgNSk7CisgICAgICAgIFNBVF9TSDRfU0gocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgICAgIFNBVF9TSDRfU0gocmVzNCwgcmVzNSwgcmVzNiwgcmVzNywgNyk7CisgICAgICAgIFBDS0VWX0IyX1NCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9TQihyZXM1LCByZXM0LCByZXM3LCByZXM2LCBvdXQyLCBvdXQzKTsKKyAgICAgICAgb3V0MCA9IF9fbXNhX2F2ZXJfc19iKG91dDAsIHNyYzApOworICAgICAgICBvdXQxID0gX19tc2FfYXZlcl9zX2Iob3V0MSwgc3JjMik7CisgICAgICAgIG91dDIgPSBfX21zYV9hdmVyX3NfYihvdXQyLCBzcmM0KTsKKyAgICAgICAgb3V0MyA9IF9fbXNhX2F2ZXJfc19iKG91dDMsIHNyYzYpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgZHN0MCwgZHN0MSk7CisgICAgICAgIEFWRVJfVUIyX1VCKG91dDIsIGRzdDIsIG91dDMsIGRzdDMsIGRzdDIsIGRzdDMpOworICAgICAgICBTVF9VQjQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOworICAgIH0KK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzEwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2dTggZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH0sIGRzdDIgPSB7IDAgfSwgZHN0MyA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjE2aTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdmVjMTE7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgdmVjOCwgdmVjOSwgdmVjMTA7CisgICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNzsKKyAgICB2MTZpOCBtaW51czViID0gX19tc2FfbGRpX2IoLTUpOworICAgIHYxNmk4IHBsdXMyMGIgPSBfX21zYV9sZGlfYigyMCk7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBMRF9TQjgoc3JjIC0gMiwgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBYT1JJX0I4XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgIEhBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsCisgICAgICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazIsIG1hc2syLCB2ZWM4LCB2ZWM5KTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjMTAsIHZlYzExKTsKKyAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAorICAgICAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgIEhBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNSwgc3JjNSwgbWFzazEsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2sxLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsCisgICAgICAgICAgICAgICAgIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNSwgc3JjNSwgbWFzazIsIG1hc2syLCB2ZWM4LCB2ZWM5KTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2syLCBtYXNrMiwgdmVjMTAsIHZlYzExKTsKKyAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAorICAgICAgICAgICAgICAgICByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICBTTERJX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIDIpOworICAgIFNMRElfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgMik7CisgICAgU0xESV9CMl9TQihzcmM0LCBzcmM1LCBzcmM0LCBzcmM1LCBzcmM0LCBzcmM1LCAyKTsKKyAgICBTTERJX0IyX1NCKHNyYzYsIHNyYzcsIHNyYzYsIHNyYzcsIHNyYzYsIHNyYzcsIDIpOworICAgIFBDS0VWX0QyX1NCKHNyYzEsIHNyYzAsIHNyYzMsIHNyYzIsIHNyYzAsIHNyYzEpOworICAgIFBDS0VWX0QyX1NCKHNyYzUsIHNyYzQsIHNyYzcsIHNyYzYsIHNyYzQsIHNyYzUpOworICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOworICAgIFNSQVJJX0g0X1NIKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDUpOworICAgIFNBVF9TSDRfU0gocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgU0FUX1NINF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA3KTsKKyAgICBQQ0tFVl9CMl9TQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCB0bXAwLCB0bXAxKTsKKyAgICBQQ0tFVl9CMl9TQihyZXM1LCByZXM0LCByZXM3LCByZXM2LCB0bXAyLCB0bXAzKTsKKyAgICB0bXAwID0gX19tc2FfYXZlcl9zX2IodG1wMCwgc3JjMCk7CisgICAgdG1wMSA9IF9fbXNhX2F2ZXJfc19iKHRtcDEsIHNyYzEpOworICAgIHRtcDIgPSBfX21zYV9hdmVyX3NfYih0bXAyLCBzcmM0KTsKKyAgICB0bXAzID0gX19tc2FfYXZlcl9zX2IodG1wMywgc3JjNSk7CisgICAgWE9SSV9CNF8xMjhfU0IodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgTEQ0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICBMRDQoZHN0ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0Mik7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QzKTsKKyAgICBBVkVSX1VCMl9VQih0bXAwLCBkc3QwLCB0bXAxLCBkc3QxLCBkc3QwLCBkc3QxKTsKKyAgICBBVkVSX1VCMl9VQih0bXAyLCBkc3QyLCB0bXAzLCBkc3QzLCBkc3QyLCBkc3QzKTsKKyAgICBTVDh4OF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMzMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9LCBkc3QyID0geyAwIH0sIGRzdDMgPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHYxNmk4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHZlYzExOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzksIHZlYzEwOworICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7CisgICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKKyAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgTERfU0I4KHNyYyAtIDIsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBtaW51czViLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzEwLCB2ZWMxMSk7CisgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICBIQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2sxLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBtaW51czViLCBtaW51czViLCBtaW51czViLCBtaW51czViLAorICAgICAgICAgICAgICAgICByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMiwgbWFzazIsIHZlYzEwLCB2ZWMxMSk7CisgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKKyAgICAgICAgICAgICAgICAgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgU0xESV9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCAzKTsKKyAgICBTTERJX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIDMpOworICAgIFNMRElfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgMyk7CisgICAgU0xESV9CMl9TQihzcmM2LCBzcmM3LCBzcmM2LCBzcmM3LCBzcmM2LCBzcmM3LCAzKTsKKyAgICBQQ0tFVl9EMl9TQihzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmMwLCBzcmMxKTsKKyAgICBQQ0tFVl9EMl9TQihzcmM1LCBzcmM0LCBzcmM3LCBzcmM2LCBzcmM0LCBzcmM1KTsKKyAgICBTUkFSSV9INF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA1KTsKKyAgICBTUkFSSV9INF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA1KTsKKyAgICBTQVRfU0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgIFNBVF9TSDRfU0gocmVzNCwgcmVzNSwgcmVzNiwgcmVzNywgNyk7CisgICAgUENLRVZfQjJfU0IocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgdG1wMCwgdG1wMSk7CisgICAgUENLRVZfQjJfU0IocmVzNSwgcmVzNCwgcmVzNywgcmVzNiwgdG1wMiwgdG1wMyk7CisgICAgdG1wMCA9IF9fbXNhX2F2ZXJfc19iKHRtcDAsIHNyYzApOworICAgIHRtcDEgPSBfX21zYV9hdmVyX3NfYih0bXAxLCBzcmMxKTsKKyAgICB0bXAyID0gX19tc2FfYXZlcl9zX2IodG1wMiwgc3JjNCk7CisgICAgdG1wMyA9IF9fbXNhX2F2ZXJfc19iKHRtcDMsIHNyYzUpOworICAgIFhPUklfQjRfMTI4X1NCKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgTEQ0KGRzdCArIDQgKiBzdHJpZGUsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDIpOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0Myk7CisgICAgQVZFUl9VQjJfVUIodG1wMCwgZHN0MCwgdG1wMSwgZHN0MSwgZHN0MCwgZHN0MSk7CisgICAgQVZFUl9VQjJfVUIodG1wMiwgZHN0MiwgdG1wMywgZHN0MywgZHN0MiwgZHN0Myk7CisgICAgU1Q4eDhfVUIoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMTBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCBkc3QwID0geyAwIH07CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgcmVzLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBtaW51czViID0gX19tc2FfbGRpX2IoLTUpOworICAgIHYxNmk4IHBsdXMyMGIgPSBfX21zYV9sZGlfYigyMCk7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbNDhdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgTERfU0I0KHNyYyAtIDIsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgIEhBRERfU0IyX1NIKHZlYzAsIHZlYzEsIG91dDAsIG91dDEpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgbWludXM1YiwgbWludXM1Yiwgb3V0MCwgb3V0MSk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzQsIHZlYzUpOworICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBwbHVzMjBiLCBwbHVzMjBiLCBvdXQwLCBvdXQxKTsKKyAgICBTUkFSSV9IMl9TSChvdXQwLCBvdXQxLCA1KTsKKyAgICBTQVRfU0gyX1NIKG91dDAsIG91dDEsIDcpOworICAgIHJlcyA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBvdXQxLCAodjE2aTgpIG91dDApOworICAgIFNMRElfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgMik7CisgICAgU0xESV9CMl9TQihzcmMyLCBzcmMzLCBzcmMyLCBzcmMzLCBzcmMyLCBzcmMzLCAyKTsKKyAgICBzcmMwID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjMCwgMSwgKHY0aTMyKSBzcmMxKTsKKyAgICBzcmMxID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjMiwgMSwgKHY0aTMyKSBzcmMzKTsKKyAgICBzcmMwID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjMCwgMSwgKHYyaTY0KSBzcmMxKTsKKyAgICByZXMgPSBfX21zYV9hdmVyX3NfYihyZXMsIHNyYzApOworICAgIHJlcyA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgcmVzLCAxMjgpOworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICBkc3QwID0gX19tc2FfYXZlcl91X2IoKHYxNnU4KSByZXMsIGRzdDApOworICAgIFNUNHg0X1VCKGRzdDAsIGRzdDAsIDAsIDEsIDIsIDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzMwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2dTggZHN0MCA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHJlcywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHY4aTE2IG91dDAsIG91dDE7CisgICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKKyAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIExEX1NCNChzcmMgLSAyLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBIQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBvdXQwLCBvdXQxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIG1pbnVzNWIsIG1pbnVzNWIsIG91dDAsIG91dDEpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazIsIG1hc2syLCB2ZWM0LCB2ZWM1KTsKKyAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgcGx1czIwYiwgcGx1czIwYiwgb3V0MCwgb3V0MSk7CisgICAgU1JBUklfSDJfU0gob3V0MCwgb3V0MSwgNSk7CisgICAgU0FUX1NIMl9TSChvdXQwLCBvdXQxLCA3KTsKKyAgICByZXMgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb3V0MSwgKHYxNmk4KSBvdXQwKTsKKyAgICBTTERJX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIDMpOworICAgIFNMRElfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgMyk7CisgICAgc3JjMCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzAsIDEsICh2NGkzMikgc3JjMSk7CisgICAgc3JjMSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzIsIDEsICh2NGkzMikgc3JjMyk7CisgICAgc3JjMCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyYzAsIDEsICh2Mmk2NCkgc3JjMSk7CisgICAgcmVzID0gX19tc2FfYXZlcl9zX2IocmVzLCBzcmMwKTsKKyAgICByZXMgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHJlcywgMTI4KTsKKyAgICBMVzQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MCk7CisgICAgZHN0MCA9IF9fbXNhX2F2ZXJfdV9iKCh2MTZ1OCkgcmVzLCBkc3QwKTsKKyAgICBTVDR4NF9VQihkc3QwLCBkc3QwLCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgdmVjOCwgdmVjOSwgdmVjMTA7CisgICAgdjE2aTggdmVjMTE7CisgICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNzsKKyAgICB2MTZpOCBtaW51czViID0gX19tc2FfbGRpX2IoLTUpOworICAgIHYxNmk4IHBsdXMyMGIgPSBfX21zYV9sZGlfYigyMCk7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBzcmMgLT0gMjsKKworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjIoc3JjLCA4LCBzcmMwLCBzcmMxKTsKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CiAgICAgICAgIExEX1NCMihzcmMsIDgsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgTERfU0IyKHNyYywgOCwgc3JjNCwgc3JjNSk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIExEX1NCMihzcmMsIDgsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gc3RyaWRlOwogCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBMRF9VQjQoZHN0LCBzdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzMpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjNiwgdmVjOSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWMxLCB2ZWM0KTsKQEAgLTQyNywxMDA0ICszNTI4LDEwMiBAQAogICAgICAgICAgICAgICAgICAgICAgbWludXM1YiwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CiAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMyLCB2ZWM1LCB2ZWM4LCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKICAgICAgICAgICAgICAgICAgICAgIHBsdXMyMGIsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHZzaGYsIHZzaGYsIHNyYzAsIHNyYzIpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazAsIG1hc2swLCB2ZWM2LCB2ZWM5KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMSwgbWFzazEsIHZlYzEsIHZlYzQpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2sxLCBtYXNrMSwgdmVjNywgdmVjMTApOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazIsIG1hc2syLCB2ZWM4LCB2ZWMxMSk7CisgICAgICAgIEhBRERfU0I0X1NIKHZlYzAsIHZlYzMsIHZlYzYsIHZlYzksIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMSwgdmVjNCwgdmVjNywgdmVjMTAsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsCisgICAgICAgICAgICAgICAgICAgICBtaW51czViLCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzIsIHZlYzUsIHZlYzgsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAorICAgICAgICAgICAgICAgICAgICAgcGx1czIwYiwgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CiAgICAgICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOworICAgICAgICBTUkFSSV9INF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA1KTsKICAgICAgICAgU0FUX1NINF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA3KTsKLSAgICAgICAgUENLRVZfQjJfU0IocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgZHN0MCwgZHN0MSk7Ci0KLSAgICAgICAgZHN0MCA9IF9fbXNhX2F2ZXJfc19iKGRzdDAsIHNyYzApOwotICAgICAgICBkc3QxID0gX19tc2FfYXZlcl9zX2IoZHN0MSwgc3JjMik7Ci0KLSAgICAgICAgWE9SSV9CMl8xMjhfU0IoZHN0MCwgZHN0MSk7Ci0KLSAgICAgICAgU1RfU0IyKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOworICAgICAgICBTQVRfU0g0X1NIKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDcpOworICAgICAgICBQQ0tFVl9CNF9TQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCByZXM1LCByZXM0LCByZXM3LCByZXM2LCB2ZWMwLCB2ZWMxLAorICAgICAgICAgICAgICAgICAgICB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0IodmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIEFWRVJfVUIyX1VCKHZlYzAsIGRzdDAsIHZlYzEsIGRzdDEsIGRzdDAsIGRzdDEpOworICAgICAgICBBVkVSX1VCMl9VQih2ZWMyLCBkc3QyLCB2ZWMzLCBkc3QzLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgU1RfVUI0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogc3RyaWRlKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19sdW1hX3Z0XzR3X21zYShjb25zdCB1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMyMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgaW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOwotICAgIGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKLSAgICB2MTZpOCBzcmM4N19yLCBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2OwotICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgZmlsdDI7Ci0gICAgdjhpMTYgb3V0MTAsIG91dDMyOwotICAgIHYxNnU4IG91dDsKLQotICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOwotICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOwotICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOwotCi0gICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICg1ICogc3JjX3N0cmlkZSk7Ci0KLSAgICBJTFZSX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsCi0gICAgICAgICAgICAgICBzcmMxMF9yLCBzcmMyMV9yLCBzcmMzMl9yLCBzcmM0M19yKTsKLSAgICBJTFZSX0QyX1NCKHNyYzIxX3IsIHNyYzEwX3IsIHNyYzQzX3IsIHNyYzMyX3IsIHNyYzIxMTAsIHNyYzQzMzIpOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzIxMTAsIHNyYzQzMzIpOwotCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsCi0gICAgICAgICAgICAgICAgICAgc3JjNTRfciwgc3JjNjVfciwgc3JjNzZfciwgc3JjODdfcik7Ci0gICAgICAgIElMVlJfRDJfU0Ioc3JjNjVfciwgc3JjNTRfciwgc3JjODdfciwgc3JjNzZfciwgc3JjNjU1NCwgc3JjODc3Nik7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzY1NTQsIHNyYzg3NzYpOwotICAgICAgICBvdXQxMCA9IERQQUREX1NIM19TSChzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MzIgPSBEUEFERF9TSDNfU0goc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NiwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIFNSQVJJX0gyX1NIKG91dDEwLCBvdXQzMiwgNSk7Ci0gICAgICAgIFNBVF9TSDJfU0gob3V0MTAsIG91dDMyLCA3KTsKLSAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQxMCwgb3V0MzIpOwotICAgICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgc3JjMjExMCA9IHNyYzY1NTQ7Ci0gICAgICAgIHNyYzQzMzIgPSBzcmM4Nzc2OwotICAgICAgICBzcmM0ID0gc3JjODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX3Z0Xzh3X21zYShjb25zdCB1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKLXsKLSAgICBpbnQzMl90IGxvb3BfY250OwotICAgIGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNzZfciwgc3JjOThfcjsKLSAgICB2MTZpOCBzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yLCBzcmMxMDlfcjsKLSAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3I7Ci0gICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0MjsKLSAgICB2MTZ1OCBvdXQwLCBvdXQxOwotCi0gICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7Ci0gICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7Ci0gICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7Ci0KLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IpOwotCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwotICAgICAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzQsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LAotICAgICAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yKTsKLSAgICAgICAgb3V0MF9yID0gRFBBRERfU0gzX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQxX3IgPSBEUEFERF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDJfciA9IERQQUREX1NIM19TSChzcmMzMl9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0M19yID0gRFBBRERfU0gzX1NIKHNyYzQzX3IsIHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA1KTsKLSAgICAgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOwotICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihvdXQwX3IsIG91dDFfcik7Ci0gICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDJfciwgb3V0M19yKTsKLSAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgc3JjMTBfciA9IHNyYzc2X3I7Ci0gICAgICAgIHNyYzMyX3IgPSBzcmM5OF9yOwotICAgICAgICBzcmMyMV9yID0gc3JjODdfcjsKLSAgICAgICAgc3JjNDNfciA9IHNyYzEwOV9yOwotICAgICAgICBzcmM0ID0gc3JjMTA7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV92dF8xNndfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCi17Ci0gICAgaW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOwotICAgIGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKLSAgICB2MTZpOCBzcmM4N19yLCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBzcmMyMV9sLCBzcmM0M19sOwotICAgIHYxNmk4IHNyYzY1X2wsIHNyYzg3X2w7Ci0gICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2w7Ci0gICAgdjE2dTggcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLSAgICB2MTZpOCBmaWx0MCwgZmlsdDEsIGZpbHQyOwotCi0gICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7Ci0gICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7Ci0gICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7Ci0KLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IpOwotICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX2wsIHNyYzIxX2wsIHNyYzMyX2wsIHNyYzQzX2wpOwotCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICAgICAgSUxWUl9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LAotICAgICAgICAgICAgICAgICAgIHNyYzU0X3IsIHNyYzY1X3IsIHNyYzc2X3IsIHNyYzg3X3IpOwotICAgICAgICBJTFZMX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsCi0gICAgICAgICAgICAgICAgICAgc3JjNTRfbCwgc3JjNjVfbCwgc3JjNzZfbCwgc3JjODdfbCk7Ci0gICAgICAgIG91dDBfciA9IERQQUREX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MV9yID0gRFBBRERfU0gzX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQyX3IgPSBEUEFERF9TSDNfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDNfciA9IERQQUREX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MF9sID0gRFBBRERfU0gzX1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQxX2wgPSBEUEFERF9TSDNfU0goc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDJfbCA9IERQQUREX1NIM19TSChzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0M19sID0gRFBBRERfU0gzX1NIKHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOwotICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7Ci0gICAgICAgIFNSQVJJX0g0X1NIKG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCwgNSk7Ci0gICAgICAgIFNBVF9TSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA3KTsKLSAgICAgICAgUENLRVZfQjRfVUIob3V0MF9sLCBvdXQwX3IsIG91dDFfbCwgb3V0MV9yLCBvdXQyX2wsIG91dDJfciwgb3V0M19sLAotICAgICAgICAgICAgICAgICAgICBvdXQzX3IsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBYT1JJX0I0XzEyOF9VQihyZXMwLCByZXMxLCByZXMyLCByZXMzKTsKLQotICAgICAgICBTVF9VQjQocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7Ci0gICAgICAgIHNyYzMyX3IgPSBzcmM3Nl9yOwotICAgICAgICBzcmMyMV9yID0gc3JjNjVfcjsKLSAgICAgICAgc3JjNDNfciA9IHNyYzg3X3I7Ci0gICAgICAgIHNyYzEwX2wgPSBzcmM1NF9sOwotICAgICAgICBzcmMzMl9sID0gc3JjNzZfbDsKLSAgICAgICAgc3JjMjFfbCA9IHNyYzY1X2w7Ci0gICAgICAgIHNyYzQzX2wgPSBzcmM4N19sOwotICAgICAgICBzcmM0ID0gc3JjODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX3Z0X3FydF80d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwgdWludDhfdCB2ZXJfb2Zmc2V0KQotewotICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OwotICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwotICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3I7Ci0gICAgdjE2aTggc3JjODdfciwgc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NjsKLSAgICB2OGkxNiBvdXQxMCwgb3V0MzI7Ci0gICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0MjsKLSAgICB2MTZ1OCBvdXQ7Ci0KLSAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKLSAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKLSAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKLQotICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotCi0gICAgSUxWUl9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLAotICAgICAgICAgICAgICAgc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfcik7Ci0gICAgSUxWUl9EMl9TQihzcmMyMV9yLCBzcmMxMF9yLCBzcmM0M19yLCBzcmMzMl9yLCBzcmMyMTEwLCBzcmM0MzMyKTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmMyMTEwLCBzcmM0MzMyKTsKLQotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgSUxWUl9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LAotICAgICAgICAgICAgICAgICAgIHNyYzU0X3IsIHNyYzY1X3IsIHNyYzc2X3IsIHNyYzg3X3IpOwotICAgICAgICBJTFZSX0QyX1NCKHNyYzY1X3IsIHNyYzU0X3IsIHNyYzg3X3IsIHNyYzc2X3IsIHNyYzY1NTQsIHNyYzg3NzYpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM2NTU0LCBzcmM4Nzc2KTsKLSAgICAgICAgb3V0MTAgPSBEUEFERF9TSDNfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDMyID0gRFBBRERfU0gzX1NIKHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBTUkFSSV9IMl9TSChvdXQxMCwgb3V0MzIsIDUpOwotICAgICAgICBTQVRfU0gyX1NIKG91dDEwLCBvdXQzMiwgNyk7Ci0KLSAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQxMCwgb3V0MzIpOwotCi0gICAgICAgIGlmICh2ZXJfb2Zmc2V0KSB7Ci0gICAgICAgICAgICBzcmMzMl9yID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjMywgMSwgKHY0aTMyKSBzcmM0KTsKLSAgICAgICAgICAgIHNyYzU0X3IgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmM1LCAxLCAodjRpMzIpIHNyYzYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjMzJfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzIsIDEsICh2NGkzMikgc3JjMyk7Ci0gICAgICAgICAgICBzcmM1NF9yID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjNCwgMSwgKHY0aTMyKSBzcmM1KTsKLSAgICAgICAgfQotCi0gICAgICAgIHNyYzMyX3IgPSAodjE2aTgpIF9fbXNhX2luc3ZlX2QoKHYyaTY0KSBzcmMzMl9yLCAxLCAodjJpNjQpIHNyYzU0X3IpOwotICAgICAgICBvdXQgPSBfX21zYV9hdmVyX3VfYihvdXQsICh2MTZ1OCkgc3JjMzJfcik7Ci0KLSAgICAgICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICBzcmMyMTEwID0gc3JjNjU1NDsKLSAgICAgICAgc3JjNDMzMiA9IHNyYzg3NzY7Ci0gICAgICAgIHNyYzIgPSBzcmM2OwotICAgICAgICBzcmMzID0gc3JjNzsKLSAgICAgICAgc3JjNCA9IHNyYzg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV92dF9xcnRfOHdfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgdmVyX29mZnNldCkKLXsKLSAgICBpbnQzMl90IGxvb3BfY250OwotICAgIGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNzZfciwgc3JjOThfcjsKLSAgICB2MTZpOCBzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yLCBzcmMxMDlfcjsKLSAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3I7Ci0gICAgdjE2aTggcmVzMCwgcmVzMTsKLSAgICB2MTZpOCBmaWx0MCwgZmlsdDEsIGZpbHQyOwotCi0gICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7Ci0gICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7Ci0gICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7Ci0KLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IpOwotCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwotICAgICAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzQsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LAotICAgICAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yKTsKLSAgICAgICAgb3V0MF9yID0gRFBBRERfU0gzX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQxX3IgPSBEUEFERF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDJfciA9IERQQUREX1NIM19TSChzcmMzMl9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0M19yID0gRFBBRERfU0gzX1NIKHNyYzQzX3IsIHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA1KTsKLSAgICAgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOwotICAgICAgICBQQ0tFVl9CMl9TQihvdXQxX3IsIG91dDBfciwgb3V0M19yLCBvdXQyX3IsIHJlczAsIHJlczEpOwotCi0gICAgICAgIGlmICh2ZXJfb2Zmc2V0KSB7Ci0gICAgICAgICAgICBQQ0tFVl9EMl9TQihzcmM0LCBzcmMzLCBzcmM4LCBzcmM3LCBzcmMxMF9yLCBzcmMzMl9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFBDS0VWX0QyX1NCKHNyYzMsIHNyYzIsIHNyYzcsIHNyYzQsIHNyYzEwX3IsIHNyYzMyX3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzMCA9IF9fbXNhX2F2ZXJfc19iKHJlczAsICh2MTZpOCkgc3JjMTBfcik7Ci0gICAgICAgIHJlczEgPSBfX21zYV9hdmVyX3NfYihyZXMxLCAodjE2aTgpIHNyYzMyX3IpOwotCi0gICAgICAgIFhPUklfQjJfMTI4X1NCKHJlczAsIHJlczEpOwotICAgICAgICBTVDh4NF9VQihyZXMwLCByZXMxLCBkc3QsIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICBzcmMxMF9yID0gc3JjNzZfcjsKLSAgICAgICAgc3JjMzJfciA9IHNyYzk4X3I7Ci0gICAgICAgIHNyYzIxX3IgPSBzcmM4N19yOwotICAgICAgICBzcmM0M19yID0gc3JjMTA5X3I7Ci0gICAgICAgIHNyYzIgPSBzcmM4OwotICAgICAgICBzcmMzID0gc3JjOTsKLSAgICAgICAgc3JjNCA9IHNyYzEwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfdnRfcXJ0XzE2d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LCB1aW50OF90IHZlcl9vZmZzZXQpCi17Ci0gICAgaW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOwotICAgIGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKLSAgICB2MTZpOCBzcmM4N19yLCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBzcmMyMV9sLCBzcmM0M19sOwotICAgIHYxNmk4IHNyYzY1X2wsIHNyYzg3X2w7Ci0gICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2w7Ci0gICAgdjE2dTggcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLSAgICB2MTZpOCBmaWx0MCwgZmlsdDEsIGZpbHQyOwotCi0gICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7Ci0gICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7Ci0gICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7Ci0KLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IpOwotICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX2wsIHNyYzIxX2wsIHNyYzMyX2wsIHNyYzQzX2wpOwotCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICAgICAgSUxWUl9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LAotICAgICAgICAgICAgICAgICAgIHNyYzU0X3IsIHNyYzY1X3IsIHNyYzc2X3IsIHNyYzg3X3IpOwotICAgICAgICBJTFZMX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsCi0gICAgICAgICAgICAgICAgICAgc3JjNTRfbCwgc3JjNjVfbCwgc3JjNzZfbCwgc3JjODdfbCk7Ci0gICAgICAgIG91dDBfciA9IERQQUREX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MV9yID0gRFBBRERfU0gzX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQyX3IgPSBEUEFERF9TSDNfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDNfciA9IERQQUREX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MF9sID0gRFBBRERfU0gzX1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQxX2wgPSBEUEFERF9TSDNfU0goc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDJfbCA9IERQQUREX1NIM19TSChzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0M19sID0gRFBBRERfU0gzX1NIKHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOwotICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7Ci0gICAgICAgIFNSQVJJX0g0X1NIKG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCwgNSk7Ci0gICAgICAgIFNBVF9TSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA3KTsKLSAgICAgICAgUENLRVZfQjRfVUIob3V0MF9sLCBvdXQwX3IsIG91dDFfbCwgb3V0MV9yLCBvdXQyX2wsIG91dDJfciwgb3V0M19sLAotICAgICAgICAgICAgICAgICAgICBvdXQzX3IsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotCi0gICAgICAgIGlmICh2ZXJfb2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXMwID0gKHYxNnU4KSBfX21zYV9hdmVyX3NfYigodjE2aTgpIHJlczAsIHNyYzMpOwotICAgICAgICAgICAgcmVzMSA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IoKHYxNmk4KSByZXMxLCBzcmM0KTsKLSAgICAgICAgICAgIHJlczIgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMiwgc3JjNSk7Ci0gICAgICAgICAgICByZXMzID0gKHYxNnU4KSBfX21zYV9hdmVyX3NfYigodjE2aTgpIHJlczMsIHNyYzYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzMCA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IoKHYxNmk4KSByZXMwLCBzcmMyKTsKLSAgICAgICAgICAgIHJlczEgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMSwgc3JjMyk7Ci0gICAgICAgICAgICByZXMyID0gKHYxNnU4KSBfX21zYV9hdmVyX3NfYigodjE2aTgpIHJlczIsIHNyYzQpOwotICAgICAgICAgICAgcmVzMyA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IoKHYxNmk4KSByZXMzLCBzcmM1KTsKLSAgICAgICAgfQotCi0gICAgICAgIFhPUklfQjRfMTI4X1VCKHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBTVF9VQjQocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0LCBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBzcmMxMF9yID0gc3JjNTRfcjsKLSAgICAgICAgc3JjMzJfciA9IHNyYzc2X3I7Ci0gICAgICAgIHNyYzIxX3IgPSBzcmM2NV9yOwotICAgICAgICBzcmM0M19yID0gc3JjODdfcjsKLSAgICAgICAgc3JjMTBfbCA9IHNyYzU0X2w7Ci0gICAgICAgIHNyYzMyX2wgPSBzcmM3Nl9sOwotICAgICAgICBzcmMyMV9sID0gc3JjNjVfbDsKLSAgICAgICAgc3JjNDNfbCA9IHNyYzg3X2w7Ci0gICAgICAgIHNyYzIgPSBzcmM2OwotICAgICAgICBzcmMzID0gc3JjNzsKLSAgICAgICAgc3JjNCA9IHNyYzg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWRfNHdfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCi17Ci0gICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOwotICAgIHY4aTE2IGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDM7Ci0gICAgdjhpMTYgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NiwgaHpfb3V0NywgaHpfb3V0ODsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotCi0gICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotCi0gICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0KLSAgICBoel9vdXQwID0gQVZDX1hPUl9WU0hGX0JfQU5EX0FQUExZXzZUQVBfSE9SSVpfRklMVF9TSChzcmMwLCBzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDIgPSBBVkNfWE9SX1ZTSEZfQl9BTkRfQVBQTFlfNlRBUF9IT1JJWl9GSUxUX1NIKHNyYzIsIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBQQ0tPRF9EMl9TSChoel9vdXQwLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzKTsKLQotICAgIGh6X291dDQgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotCi0gICAgICAgIGh6X291dDUgPSBBVkNfWE9SX1ZTSEZfQl9BTkRfQVBQTFlfNlRBUF9IT1JJWl9GSUxUX1NIKHNyYzAsIHNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2swLCBtYXNrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazIpOwotICAgICAgICBoel9vdXQ3ID0gQVZDX1hPUl9WU0hGX0JfQU5EX0FQUExZXzZUQVBfSE9SSVpfRklMVF9TSChzcmMyLCBzcmMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMCwgbWFzazEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2syKTsKLQotICAgICAgICBQQ0tPRF9EMl9TSChoel9vdXQ1LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4KTsKLQotICAgICAgICBkc3QwID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9SX1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSk7Ci0gICAgICAgIGRzdDEgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1JfU0goaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2KTsKLSAgICAgICAgZHN0MiA9IEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfUl9TSChoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDUsIGh6X291dDYsIGh6X291dDcpOwotICAgICAgICBkc3QzID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9SX1NIKGh6X291dDMsIGh6X291dDQsIGh6X291dDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NiwgaHpfb3V0NywgaHpfb3V0OCk7Ci0KLSAgICAgICAgUENLRVZfQjJfU0IoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzAsIHNyYzEpOwotCi0gICAgICAgIFNUNHg0X1VCKHNyYzAsIHNyYzEsIDAsIDIsIDAsIDIsIGRzdCwgZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgaHpfb3V0MCA9IGh6X291dDQ7Ci0gICAgICAgIGh6X291dDEgPSBoel9vdXQ1OwotICAgICAgICBoel9vdXQyID0gaHpfb3V0NjsKLSAgICAgICAgaHpfb3V0MyA9IGh6X291dDc7Ci0gICAgICAgIGh6X291dDQgPSBoel9vdXQ4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfbWlkXzh3X21zYShjb25zdCB1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQotewotICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7Ci0gICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMjsKLSAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzOwotICAgIHY4aTE2IGh6X291dDQsIGh6X291dDUsIGh6X291dDYsIGh6X291dDcsIGh6X291dDg7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyID0geyAwIH0sIG91dDMgPSB7IDAgfTsKKyAgICB2MTZ1OCBvdXQ0LCBvdXQ1LCBvdXQ2ID0geyAwIH0sIG91dDcgPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzksIHZlYzEwOworICAgIHYxNmk4IHZlYzExOworICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7CisgICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKKyAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOwogCiAgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CiAKLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgaHpfb3V0MSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDMgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgaHpfb3V0NCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLQotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIGh6X291dDUgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDggPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGRzdDAgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDQsIGh6X291dDUpOwotICAgICAgICBkc3QxID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9TSChoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2KTsKLSAgICAgICAgZHN0MiA9IEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfU0goaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NSwgaHpfb3V0NiwgaHpfb3V0Nyk7Ci0gICAgICAgIGRzdDMgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1NIKGh6X291dDMsIGh6X291dDQsIGh6X291dDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDYsIGh6X291dDcsIGh6X291dDgpOwotICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QxKTsKLSAgICAgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MiwgZHN0Myk7Ci0gICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIGh6X291dDMgPSBoel9vdXQ3OwotICAgICAgICBoel9vdXQxID0gaHpfb3V0NTsKLSAgICAgICAgaHpfb3V0NSA9IGh6X291dDQ7Ci0gICAgICAgIGh6X291dDQgPSBoel9vdXQ4OwotICAgICAgICBoel9vdXQyID0gaHpfb3V0NjsKLSAgICAgICAgaHpfb3V0MCA9IGh6X291dDU7Ci0gICAgfQorICAgIExEX1NCOChzcmMgLSAyLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMiwgdmVjMyk7CisgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKKyAgICAgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzgsIHZlYzkpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWMxMCwgdmVjMTEpOworICAgIERQQUREX1NCNF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCisgICAgICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMCwgdmVjMiwgdmVjMyk7CisgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMSwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazEsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKKyAgICAgICAgICAgICAgICAgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMiwgbWFzazIsIHZlYzgsIHZlYzkpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazIsIG1hc2syLCB2ZWMxMCwgdmVjMTEpOworICAgIERQQUREX1NCNF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCisgICAgICAgICAgICAgICAgIHJlczQsIHJlczUsIHJlczYsIHJlczcpOworICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOworICAgIFNSQVJJX0g0X1NIKHJlczQsIHJlczUsIHJlczYsIHJlczcsIDUpOworICAgIFNBVF9TSDRfU0gocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgU0FUX1NINF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA3KTsKKyAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihyZXMwLCByZXMxKTsKKyAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQihyZXMyLCByZXMzKTsKKyAgICBvdXQ0ID0gUENLRVZfWE9SSTEyOF9VQihyZXM0LCByZXM1KTsKKyAgICBvdXQ1ID0gUENLRVZfWE9SSTEyOF9VQihyZXM2LCByZXM3KTsKKyAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBvdXQyKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIG91dDMpOworICAgIExENChkc3QgKyA0ICogc3RyaWRlLCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBvdXQ2KTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIG91dDcpOworICAgIEFWRVJfVUIyX1VCKG91dDAsIG91dDIsIG91dDEsIG91dDMsIG91dDAsIG91dDEpOworICAgIEFWRVJfVUIyX1VCKG91dDQsIG91dDYsIG91dDUsIG91dDcsIG91dDQsIG91dDUpOworICAgIFNUOHg4X1VCKG91dDAsIG91dDEsIG91dDQsIG91dDUsIGRzdCwgc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgYXZjX2x1bWFfbWlkXzE2d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQordm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzIwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB1aW50MzJfdCBtdWx0aXBsZThfY250OwotCi0gICAgZm9yIChtdWx0aXBsZThfY250ID0gMjsgbXVsdGlwbGU4X2NudC0tOykgewotICAgICAgICBhdmNfbHVtYV9taWRfOHdfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQpOwotICAgICAgICBzcmMgKz0gODsKLSAgICAgICAgZHN0ICs9IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWRoX3FydF80d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgaG9yaXpfb2Zmc2V0KQotewotICAgIHVpbnQzMl90IHJvdzsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwotICAgIHY4aTE2IHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczIsIHZ0X3JlczM7Ci0gICAgdjRpMzIgaHpfcmVzMCwgaHpfcmVzMTsKLSAgICB2OGkxNiBkc3QwLCBkc3QxOwotICAgIHY4aTE2IHNoZl92ZWMwLCBzaGZfdmVjMSwgc2hmX3ZlYzIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzU7Ci0gICAgdjhpMTYgbWFzazAgPSB7IDAsIDUsIDEsIDYsIDIsIDcsIDMsIDggfTsKLSAgICB2OGkxNiBtYXNrMSA9IHsgMSwgNCwgMiwgNSwgMywgNiwgNCwgNyB9OwotICAgIHY4aTE2IG1hc2syID0geyAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2IH07Ci0gICAgdjhpMTYgbWludXM1aCA9IF9fbXNhX2xkaV9oKC01KTsKLSAgICB2OGkxNiBwbHVzMjBoID0gX19tc2FfbGRpX2goMjApOwotICAgIHY4aTE2IHplcm9zID0geyAwIH07Ci0gICAgdjE2dTggb3V0OwotCi0gICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICg1ICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0KLSAgICBmb3IgKHJvdyA9IChoZWlnaHQgPj4gMSk7IHJvdy0tOykgewotICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2KTsKLSAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7Ci0gICAgICAgIEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfU0goc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dF9yZXMwLCB2dF9yZXMxKTsKLSAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0X3JlczIsIHZ0X3JlczMpOwotICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsCi0gICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjMik7Ci0gICAgICAgIFZTSEZfSDNfU0godnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywKLSAgICAgICAgICAgICAgICAgICBtYXNrMCwgbWFzazEsIG1hc2syLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1KTsKLSAgICAgICAgaHpfcmVzMCA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMwLCBzaGZfdmVjMCk7Ci0gICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjMSwgc2hmX3ZlYzIsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczAsIGh6X3JlczApOwotICAgICAgICBoel9yZXMxID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzMsIHNoZl92ZWMzKTsKLSAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWM0LCBzaGZfdmVjNSwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMSwgaHpfcmVzMSk7Ci0KLSAgICAgICAgU1JBUklfVzJfU1coaHpfcmVzMCwgaHpfcmVzMSwgMTApOwotICAgICAgICBTQVRfU1cyX1NXKGh6X3JlczAsIGh6X3JlczEsIDcpOwotCi0gICAgICAgIGRzdDAgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWMyLCA1KTsKLSAgICAgICAgZHN0MSA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzUsIDUpOwotCi0gICAgICAgIFNBVF9TSDJfU0goZHN0MCwgZHN0MSwgNyk7Ci0KLSAgICAgICAgaWYgKGhvcml6X29mZnNldCkgewotICAgICAgICAgICAgZHN0MCA9IF9fbXNhX2lsdm9kX2goemVyb3MsIGRzdDApOwotICAgICAgICAgICAgZHN0MSA9IF9fbXNhX2lsdm9kX2goemVyb3MsIGRzdDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSUxWRVZfSDJfU0goZHN0MCwgemVyb3MsIGRzdDEsIHplcm9zLCBkc3QwLCBkc3QxKTsKLSAgICAgICAgfQotCi0gICAgICAgIGh6X3JlczAgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMwLCAodjRpMzIpIGRzdDApOwotICAgICAgICBoel9yZXMxID0gX19tc2FfYXZlcl9zX3coaHpfcmVzMSwgKHY0aTMyKSBkc3QxKTsKLSAgICAgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBoel9yZXMxLCAodjhpMTYpIGh6X3JlczApOwotCi0gICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MCwgZHN0MCk7Ci0gICAgICAgIFNUNHgyX1VCKG91dCwgZHN0LCBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBzcmMwID0gc3JjMjsKLSAgICAgICAgc3JjMSA9IHNyYzM7Ci0gICAgICAgIHNyYzIgPSBzcmM0OwotICAgICAgICBzcmMzID0gc3JjNTsKLSAgICAgICAgc3JjNCA9IHNyYzY7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWRoX3FydF84d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgaG9yaXpfb2Zmc2V0KQotewotICAgIHVpbnQzMl90IG11bHRpcGxlOF9jbnQ7Ci0KLSAgICBmb3IgKG11bHRpcGxlOF9jbnQgPSAyOyBtdWx0aXBsZThfY250LS07KSB7Ci0gICAgICAgIGF2Y19sdW1hX21pZGhfcXJ0XzR3X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpfb2Zmc2V0KTsKLQotICAgICAgICBzcmMgKz0gNDsKLSAgICAgICAgZHN0ICs9IDQ7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWRoX3FydF8xNndfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgaG9yaXpfb2Zmc2V0KQotewotICAgIHVpbnQzMl90IG11bHRpcGxlOF9jbnQ7Ci0KLSAgICBmb3IgKG11bHRpcGxlOF9jbnQgPSA0OyBtdWx0aXBsZThfY250LS07KSB7Ci0gICAgICAgIGF2Y19sdW1hX21pZGhfcXJ0XzR3X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9yaXpfb2Zmc2V0KTsKLQotICAgICAgICBzcmMgKz0gNDsKLSAgICAgICAgZHN0ICs9IDQ7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWR2X3FydF80d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgdmVyX29mZnNldCkKLXsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCByZXMsIGRzdDAgPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwogICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7Ci0gICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MzsKLSAgICB2OGkxNiBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2LCBoel9vdXQ3LCBoel9vdXQ4OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7Ci0KLSAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbNDhdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICg1ICogc3JjX3N0cmlkZSk7Ci0KLSAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLQotICAgIGh6X291dDAgPSBBVkNfWE9SX1ZTSEZfQl9BTkRfQVBQTFlfNlRBUF9IT1JJWl9GSUxUX1NIKHNyYzAsIHNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgaHpfb3V0MiA9IEFWQ19YT1JfVlNIRl9CX0FORF9BUFBMWV82VEFQX0hPUklaX0ZJTFRfU0goc3JjMiwgc3JjMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMCwgbWFzazEsIG1hc2syKTsKLQotICAgIFBDS09EX0QyX1NIKGh6X291dDAsIGh6X291dDAsIGh6X291dDIsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMpOwotCi0gICAgaHpfb3V0NCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLQotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotCi0gICAgICAgIGh6X291dDUgPSBBVkNfWE9SX1ZTSEZfQl9BTkRfQVBQTFlfNlRBUF9IT1JJWl9GSUxUX1NIKHNyYzAsIHNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2swLCBtYXNrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazIpOwotICAgICAgICBoel9vdXQ3ID0gQVZDX1hPUl9WU0hGX0JfQU5EX0FQUExZXzZUQVBfSE9SSVpfRklMVF9TSChzcmMyLCBzcmMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMCwgbWFzazEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2syKTsKLQotICAgICAgICBQQ0tPRF9EMl9TSChoel9vdXQ1LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4KTsKLQotICAgICAgICBkc3QwID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9TSChoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1KTsKLSAgICAgICAgZHN0MiA9IEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfU0goaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0Nik7Ci0gICAgICAgIGRzdDQgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1NIKGh6X291dDIsIGh6X291dDMsIGh6X291dDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDUsIGh6X291dDYsIGh6X291dDcpOwotICAgICAgICBkc3Q2ID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9TSChoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ2LCBoel9vdXQ3LCBoel9vdXQ4KTsKLQotICAgICAgICBpZiAodmVyX29mZnNldCkgewotICAgICAgICAgICAgZHN0MSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0MywgNSk7Ci0gICAgICAgICAgICBkc3QzID0gX19tc2Ffc3JhcmlfaChoel9vdXQ0LCA1KTsKLSAgICAgICAgICAgIGRzdDUgPSBfX21zYV9zcmFyaV9oKGh6X291dDUsIDUpOwotICAgICAgICAgICAgZHN0NyA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NiwgNSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkc3QxID0gX19tc2Ffc3JhcmlfaChoel9vdXQyLCA1KTsKLSAgICAgICAgICAgIGRzdDMgPSBfX21zYV9zcmFyaV9oKGh6X291dDMsIDUpOwotICAgICAgICAgICAgZHN0NSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NCwgNSk7Ci0gICAgICAgICAgICBkc3Q3ID0gX19tc2Ffc3JhcmlfaChoel9vdXQ1LCA1KTsKLSAgICAgICAgfQotCi0gICAgICAgIFNBVF9TSDRfU0goZHN0MSwgZHN0MywgZHN0NSwgZHN0NywgNyk7Ci0KLSAgICAgICAgZHN0MCA9IF9fbXNhX2F2ZXJfc19oKGRzdDAsIGRzdDEpOwotICAgICAgICBkc3QxID0gX19tc2FfYXZlcl9zX2goZHN0MiwgZHN0Myk7Ci0gICAgICAgIGRzdDIgPSBfX21zYV9hdmVyX3NfaChkc3Q0LCBkc3Q1KTsKLSAgICAgICAgZHN0MyA9IF9fbXNhX2F2ZXJfc19oKGRzdDYsIGRzdDcpOwotCi0gICAgICAgIFBDS0VWX0IyX1NCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIHNyYzAsIHNyYzEpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMwLCBzcmMxKTsKLQotICAgICAgICBTVDR4NF9VQihzcmMwLCBzcmMxLCAwLCAyLCAwLCAyLCBkc3QsIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICBoel9vdXQwID0gaHpfb3V0NDsKLSAgICAgICAgaHpfb3V0MSA9IGh6X291dDU7Ci0gICAgICAgIGh6X291dDIgPSBoel9vdXQ2OwotICAgICAgICBoel9vdXQzID0gaHpfb3V0NzsKLSAgICAgICAgaHpfb3V0NCA9IGh6X291dDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWR2X3FydF84d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3QgdmVyX29mZnNldCkKLXsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwotICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7Ci0gICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MzsKLSAgICB2OGkxNiBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2LCBoel9vdXQ3LCBoel9vdXQ4OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7Ci0gICAgdjE2dTggb3V0OwotCi0gICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgaHpfb3V0MSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDMgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgaHpfb3V0NCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLQotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIGh6X291dDUgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDggPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICAgICAgZHN0MCA9IEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSk7Ci0gICAgICAgIGRzdDIgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1NIKGh6X291dDEsIGh6X291dDIsIGh6X291dDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDUsIGh6X291dDYpOwotICAgICAgICBkc3Q0ID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9TSChoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ1LCBoel9vdXQ2LCBoel9vdXQ3KTsKLSAgICAgICAgZHN0NiA9IEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfU0goaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NiwgaHpfb3V0NywgaHpfb3V0OCk7Ci0KLSAgICAgICAgaWYgKHZlcl9vZmZzZXQpIHsKLSAgICAgICAgICAgIGRzdDEgPSBfX21zYV9zcmFyaV9oKGh6X291dDMsIDUpOwotICAgICAgICAgICAgZHN0MyA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NCwgNSk7Ci0gICAgICAgICAgICBkc3Q1ID0gX19tc2Ffc3JhcmlfaChoel9vdXQ1LCA1KTsKLSAgICAgICAgICAgIGRzdDcgPSBfX21zYV9zcmFyaV9oKGh6X291dDYsIDUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0MSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0MiwgNSk7Ci0gICAgICAgICAgICBkc3QzID0gX19tc2Ffc3JhcmlfaChoel9vdXQzLCA1KTsKLSAgICAgICAgICAgIGRzdDUgPSBfX21zYV9zcmFyaV9oKGh6X291dDQsIDUpOwotICAgICAgICAgICAgZHN0NyA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NSwgNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTQVRfU0g0X1NIKGRzdDEsIGRzdDMsIGRzdDUsIGRzdDcsIDcpOwotCi0gICAgICAgIGRzdDAgPSBfX21zYV9hdmVyX3NfaChkc3QwLCBkc3QxKTsKLSAgICAgICAgZHN0MSA9IF9fbXNhX2F2ZXJfc19oKGRzdDIsIGRzdDMpOwotICAgICAgICBkc3QyID0gX19tc2FfYXZlcl9zX2goZHN0NCwgZHN0NSk7Ci0gICAgICAgIGRzdDMgPSBfX21zYV9hdmVyX3NfaChkc3Q2LCBkc3Q3KTsKLQotICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDApOwotICAgICAgICBTVDh4MV9VQihvdXQsIGRzdCk7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDEsIGRzdDEpOwotICAgICAgICBTVDh4MV9VQihvdXQsIGRzdCk7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDIsIGRzdDIpOwotICAgICAgICBTVDh4MV9VQihvdXQsIGRzdCk7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDMsIGRzdDMpOwotICAgICAgICBTVDh4MV9VQihvdXQsIGRzdCk7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotCi0gICAgICAgIGh6X291dDAgPSBoel9vdXQ0OwotICAgICAgICBoel9vdXQxID0gaHpfb3V0NTsKLSAgICAgICAgaHpfb3V0MiA9IGh6X291dDY7Ci0gICAgICAgIGh6X291dDMgPSBoel9vdXQ3OwotICAgICAgICBoel9vdXQ0ID0gaHpfb3V0ODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX21pZHZfcXJ0XzE2d19tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwgdWludDhfdCB2ZXJ0X29mZnNldCkKLXsKLSAgICB1aW50MzJfdCBtdWx0aXBsZThfY250OwotCi0gICAgZm9yIChtdWx0aXBsZThfY250ID0gMjsgbXVsdGlwbGU4X2NudC0tOykgewotICAgICAgICBhdmNfbHVtYV9taWR2X3FydF84d19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRfb2Zmc2V0KTsKLQotICAgICAgICBzcmMgKz0gODsKLSAgICAgICAgZHN0ICs9IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9odl9xcnRfNHdfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyY194LCBjb25zdCB1aW50OF90ICpzcmNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLCB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwgaW50MzJfdCBoZWlnaHQpCi17Ci0gICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6MzsKLSAgICB2MTZpOCBzcmNfdnQwLCBzcmNfdnQxLCBzcmNfdnQyLCBzcmNfdnQzLCBzcmNfdnQ0OwotICAgIHYxNmk4IHNyY192dDUsIHNyY192dDYsIHNyY192dDcsIHNyY192dDg7Ci0gICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMjsKLSAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCB2ZXJ0X291dDAsIHZlcnRfb3V0MTsKLSAgICB2OGkxNiBvdXQwLCBvdXQxOwotICAgIHYxNnU4IG91dDsKLQotICAgIExEX1NCMygmbHVtYV9tYXNrX2Fycls0OF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLQotICAgIExEX1NCNShzcmNfeSwgc3JjX3N0cmlkZSwgc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7Ci0gICAgc3JjX3kgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIHNyY192dDAgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQwLCAxLCAodjRpMzIpIHNyY192dDEpOwotICAgIHNyY192dDEgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQxLCAxLCAodjRpMzIpIHNyY192dDIpOwotICAgIHNyY192dDIgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQyLCAxLCAodjRpMzIpIHNyY192dDMpOwotICAgIHNyY192dDMgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQzLCAxLCAodjRpMzIpIHNyY192dDQpOwotCi0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Myk7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyY194LCBzcmNfc3RyaWRlLCBzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKLSAgICAgICAgc3JjX3ggKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKLQotICAgICAgICBoel9vdXQwID0gQVZDX1hPUl9WU0hGX0JfQU5EX0FQUExZXzZUQVBfSE9SSVpfRklMVF9TSChzcmNfaHowLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfaHoxLCBtYXNrMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazEsIG1hc2syKTsKLSAgICAgICAgaHpfb3V0MSA9IEFWQ19YT1JfVlNIRl9CX0FORF9BUFBMWV82VEFQX0hPUklaX0ZJTFRfU0goc3JjX2h6MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2h6MywgbWFzazAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMik7Ci0KLSAgICAgICAgU1JBUklfSDJfU0goaHpfb3V0MCwgaHpfb3V0MSwgNSk7Ci0gICAgICAgIFNBVF9TSDJfU0goaHpfb3V0MCwgaHpfb3V0MSwgNyk7Ci0KLSAgICAgICAgTERfU0I0KHNyY195LCBzcmNfc3RyaWRlLCBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3LCBzcmNfdnQ4KTsKLSAgICAgICAgc3JjX3kgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBzcmNfdnQ0ID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjX3Z0NCwgMSwgKHY0aTMyKSBzcmNfdnQ1KTsKLSAgICAgICAgc3JjX3Z0NSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDUsIDEsICh2NGkzMikgc3JjX3Z0Nik7Ci0gICAgICAgIHNyY192dDYgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQ2LCAxLCAodjRpMzIpIHNyY192dDcpOwotICAgICAgICBzcmNfdnQ3ID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjX3Z0NywgMSwgKHY0aTMyKSBzcmNfdnQ4KTsKLQotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmNfdnQ0LCBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3KTsKLQotICAgICAgICAvKiBmaWx0ZXIgY2FsYyAqLwotICAgICAgICB2ZXJ0X291dDAgPSBBVkNfQ0FMQ19EUEFERF9CXzZQSVhfMkNPRUZGX1JfU0goc3JjX3Z0MCwgc3JjX3Z0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY192dDIsIHNyY192dDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdnQ0LCBzcmNfdnQ1KTsKLSAgICAgICAgdmVydF9vdXQxID0gQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9SX1NIKHNyY192dDIsIHNyY192dDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdnQ0LCBzcmNfdnQ1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Z0Niwgc3JjX3Z0Nyk7Ci0KLSAgICAgICAgU1JBUklfSDJfU0godmVydF9vdXQwLCB2ZXJ0X291dDEsIDUpOwotICAgICAgICBTQVRfU0gyX1NIKHZlcnRfb3V0MCwgdmVydF9vdXQxLCA3KTsKLQotICAgICAgICBvdXQwID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MCArIHZlcnRfb3V0MCksIDEpOwotICAgICAgICBvdXQxID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MSArIHZlcnRfb3V0MSksIDEpOwotCi0gICAgICAgIFNBVF9TSDJfU0gob3V0MCwgb3V0MSwgNyk7Ci0gICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7Ci0gICAgICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBzcmNfdnQzID0gc3JjX3Z0NzsKLSAgICAgICAgc3JjX3Z0MSA9IHNyY192dDU7Ci0gICAgICAgIHNyY192dDAgPSBzcmNfdnQ0OwotICAgICAgICBzcmNfdnQ0ID0gc3JjX3Z0ODsKLSAgICAgICAgc3JjX3Z0MiA9IHNyY192dDY7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9odl9xcnRfOHdfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyY194LCBjb25zdCB1aW50OF90ICpzcmNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLCB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwgaW50MzJfdCBoZWlnaHQpCi17Ci0gICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6MzsKLSAgICB2MTZpOCBzcmNfdnQwLCBzcmNfdnQxLCBzcmNfdnQyLCBzcmNfdnQzLCBzcmNfdnQ0OwotICAgIHYxNmk4IHNyY192dDUsIHNyY192dDYsIHNyY192dDcsIHNyY192dDg7Ci0gICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMjsKLSAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzOwotICAgIHY4aTE2IHZlcnRfb3V0MCwgdmVydF9vdXQxLCB2ZXJ0X291dDIsIHZlcnRfb3V0MzsKLSAgICB2OGkxNiBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHYxNnU4IHRtcDAsIHRtcDE7Ci0KLSAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICBMRF9TQjUoc3JjX3ksIHNyY19zdHJpZGUsIHNyY192dDAsIHNyY192dDEsIHNyY192dDIsIHNyY192dDMsIHNyY192dDQpOwotICAgIHNyY195ICs9ICg1ICogc3JjX3N0cmlkZSk7Ci0KLSAgICBzcmNfdnQwID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjX3Z0MCwgMSwgKHYyaTY0KSBzcmNfdnQxKTsKLSAgICBzcmNfdnQxID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjX3Z0MSwgMSwgKHYyaTY0KSBzcmNfdnQyKTsKLSAgICBzcmNfdnQyID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjX3Z0MiwgMSwgKHYyaTY0KSBzcmNfdnQzKTsKLSAgICBzcmNfdnQzID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjX3Z0MywgMSwgKHYyaTY0KSBzcmNfdnQ0KTsKLQotICAgIFhPUklfQjRfMTI4X1NCKHNyY192dDAsIHNyY192dDEsIHNyY192dDIsIHNyY192dDMpOwotCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmNfeCwgc3JjX3N0cmlkZSwgc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6Myk7Ci0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyY19oejAsIHNyY19oejEsIHNyY19oejIsIHNyY19oejMpOwotICAgICAgICBzcmNfeCArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6MCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6MSwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6MiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDMgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjX2h6MywgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICAgICAgU1JBUklfSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNSk7Ci0gICAgICAgIFNBVF9TSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNyk7Ci0KLSAgICAgICAgTERfU0I0KHNyY195LCBzcmNfc3RyaWRlLCBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3LCBzcmNfdnQ4KTsKLSAgICAgICAgc3JjX3kgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBzcmNfdnQ0ID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjX3Z0NCwgMSwgKHYyaTY0KSBzcmNfdnQ1KTsKLSAgICAgICAgc3JjX3Z0NSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyY192dDUsIDEsICh2Mmk2NCkgc3JjX3Z0Nik7Ci0gICAgICAgIHNyY192dDYgPSAodjE2aTgpIF9fbXNhX2luc3ZlX2QoKHYyaTY0KSBzcmNfdnQ2LCAxLCAodjJpNjQpIHNyY192dDcpOwotICAgICAgICBzcmNfdnQ3ID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjX3Z0NywgMSwgKHYyaTY0KSBzcmNfdnQ4KTsKLQotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmNfdnQ0LCBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3KTsKLQotICAgICAgICAvKiBmaWx0ZXIgY2FsYyAqLwotICAgICAgICBBVkNfQ0FMQ19EUEFERF9CXzZQSVhfMkNPRUZGX1NIKHNyY192dDAsIHNyY192dDEsIHNyY192dDIsIHNyY192dDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Z0NCwgc3JjX3Z0NSwgdmVydF9vdXQwLCB2ZXJ0X291dDEpOwotICAgICAgICBBVkNfQ0FMQ19EUEFERF9CXzZQSVhfMkNPRUZGX1NIKHNyY192dDIsIHNyY192dDMsIHNyY192dDQsIHNyY192dDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Z0Niwgc3JjX3Z0NywgdmVydF9vdXQyLCB2ZXJ0X291dDMpOwotCi0gICAgICAgIFNSQVJJX0g0X1NIKHZlcnRfb3V0MCwgdmVydF9vdXQxLCB2ZXJ0X291dDIsIHZlcnRfb3V0MywgNSk7Ci0gICAgICAgIFNBVF9TSDRfU0godmVydF9vdXQwLCB2ZXJ0X291dDEsIHZlcnRfb3V0MiwgdmVydF9vdXQzLCA3KTsKLQotICAgICAgICBvdXQwID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MCArIHZlcnRfb3V0MCksIDEpOwotICAgICAgICBvdXQxID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MSArIHZlcnRfb3V0MSksIDEpOwotICAgICAgICBvdXQyID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MiArIHZlcnRfb3V0MiksIDEpOwotICAgICAgICBvdXQzID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MyArIHZlcnRfb3V0MyksIDEpOwotCi0gICAgICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7Ci0gICAgICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwotICAgICAgICB0bXAxID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKLSAgICAgICAgU1Q4eDRfVUIodG1wMCwgdG1wMSwgZHN0LCBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgc3JjX3Z0MyA9IHNyY192dDc7Ci0gICAgICAgIHNyY192dDEgPSBzcmNfdnQ1OwotICAgICAgICBzcmNfdnQ1ID0gc3JjX3Z0NDsKLSAgICAgICAgc3JjX3Z0NCA9IHNyY192dDg7Ci0gICAgICAgIHNyY192dDIgPSBzcmNfdnQ2OwotICAgICAgICBzcmNfdnQwID0gc3JjX3Z0NTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX2h2X3FydF8xNndfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyY194LCBjb25zdCB1aW50OF90ICpzcmNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLCBpbnQzMl90IGhlaWdodCkKLXsKLSAgICB1aW50MzJfdCBtdWx0aXBsZThfY250OwotCi0gICAgZm9yIChtdWx0aXBsZThfY250ID0gMjsgbXVsdGlwbGU4X2NudC0tOykgewotICAgICAgICBhdmNfbHVtYV9odl9xcnRfOHdfbXNhKHNyY194LCBzcmNfeSwgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7Ci0KLSAgICAgICAgc3JjX3ggKz0gODsKLSAgICAgICAgc3JjX3kgKz0gODsKLSAgICAgICAgZHN0ICs9IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9oel9hbmRfYXZlcl9kc3RfNHg0X21zYShjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSkKLXsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHJlczsKICAgICB2OGkxNiByZXMwLCByZXMxOwotICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKICAgICB2MTZpOCBtaW51czViID0gX19tc2FfbGRpX2IoLTUpOwogICAgIHYxNmk4IHBsdXMyMGIgPSBfX21zYV9sZGlfYigyMCk7CiAKICAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbNDhdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0KLSAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICBMRF9TQjQoc3JjIC0gMiwgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CiAgICAgSEFERF9TQjJfU0godmVjMCwgdmVjMSwgcmVzMCwgcmVzMSk7CkBAIC0xNDM1LDY4NyArMzYzNCw3NCBAQAogICAgIFNSQVJJX0gyX1NIKHJlczAsIHJlczEsIDUpOwogICAgIFNBVF9TSDJfU0gocmVzMCwgcmVzMSwgNyk7CiAgICAgcmVzID0gUENLRVZfWE9SSTEyOF9VQihyZXMwLCByZXMxKTsKLSAgICBJTFZSX1cyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDEpOwotCi0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfZCgodjJpNjQpIGRzdDEsICh2Mmk2NCkgZHN0MCk7CisgICAgTFc0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOwogICAgIHJlcyA9IF9fbXNhX2F2ZXJfdV9iKHJlcywgZHN0MCk7Ci0KLSAgICBTVDR4NF9VQihyZXMsIHJlcywgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDR4NF9VQihyZXMsIHJlcywgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9oel9hbmRfYXZlcl9kc3RfOHg4X21zYShjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSkKLXsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjE2aTggdmVjNiwgdmVjNywgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExOwotICAgIHYxNmk4IG1pbnVzNWIgPSBfX21zYV9sZGlfYigtNSk7Ci0gICAgdjE2aTggcGx1czIwYiA9IF9fbXNhX2xkaV9iKDIwKTsKLQotICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotCi0gICAgZm9yIChsb29wX2NudCA9IDI7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLQotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIEhBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsCi0gICAgICAgICAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzgsIHZlYzkpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjMTAsIHZlYzExKTsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgcGx1czIwYiwgcGx1czIwYiwgcGx1czIwYiwKLSAgICAgICAgICAgICAgICAgICAgIHBsdXMyMGIsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBTUkFSSV9INF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA1KTsKLSAgICAgICAgU0FUX1NINF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA3KTsKLSAgICAgICAgQ09OVkVSVF9VQl9BVkdfU1Q4eDRfVUIocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX2h6X2FuZF9hdmVyX2RzdF8xNngxNl9tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlKQotewotICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOwotICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIHJlczQsIHJlczUsIHJlczYsIHJlczc7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKLSAgICB2MTZpOCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTE7Ci0gICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKLSAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOwotCi0gICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYywgOCwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICAgICBMRF9TQjIoc3JjLCA4LCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0KLSAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMzKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzYsIHZlYzkpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjMSwgdmVjNCk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWM3LCB2ZWMxMCk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazIsIG1hc2syLCB2ZWMyLCB2ZWM1KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzgsIHZlYzExKTsKLSAgICAgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMywgdmVjNiwgdmVjOSwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMxLCB2ZWM0LCB2ZWM3LCB2ZWMxMCwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKLSAgICAgICAgICAgICAgICAgICAgIG1pbnVzNWIsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMiwgdmVjNSwgdmVjOCwgdmVjMTEsIHBsdXMyMGIsIHBsdXMyMGIsIHBsdXMyMGIsCi0gICAgICAgICAgICAgICAgICAgICBwbHVzMjBiLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKLSAgICAgICAgTERfU0IyKHNyYywgOCwgc3JjNCwgc3JjNSk7Ci0gICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICAgICBMRF9TQjIoc3JjLCA4LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMyk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazAsIG1hc2swLCB2ZWM2LCB2ZWM5KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMSwgbWFzazEsIHZlYzEsIHZlYzQpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2sxLCBtYXNrMSwgdmVjNywgdmVjMTApOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjNSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazIsIG1hc2syLCB2ZWM4LCB2ZWMxMSk7Ci0gICAgICAgIEhBRERfU0I0X1NIKHZlYzAsIHZlYzMsIHZlYzYsIHZlYzksIHJlczQsIHJlczUsIHJlczYsIHJlczcpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMSwgdmVjNCwgdmVjNywgdmVjMTAsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsCi0gICAgICAgICAgICAgICAgICAgICBtaW51czViLCByZXM0LCByZXM1LCByZXM2LCByZXM3KTsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzIsIHZlYzUsIHZlYzgsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAotICAgICAgICAgICAgICAgICAgICAgcGx1czIwYiwgcmVzNCwgcmVzNSwgcmVzNiwgcmVzNyk7Ci0gICAgICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOwotICAgICAgICBTUkFSSV9INF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA1KTsKLSAgICAgICAgU0FUX1NINF9TSChyZXMwLCByZXMxLCByZXMyLCByZXMzLCA3KTsKLSAgICAgICAgU0FUX1NINF9TSChyZXM0LCByZXM1LCByZXM2LCByZXM3LCA3KTsKLSAgICAgICAgUENLRVZfQjRfU0IocmVzMSwgcmVzMCwgcmVzMywgcmVzMiwgcmVzNSwgcmVzNCwgcmVzNywgcmVzNiwKLSAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIFhPUklfQjRfMTI4X1NCKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBBVkVSX1VCNF9VQih2ZWMwLCBkc3QwLCB2ZWMxLCBkc3QxLCB2ZWMyLCBkc3QyLCB2ZWMzLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgU1RfVUI0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfaHpfcXJ0X2FuZF9hdmVyX2RzdF80eDRfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhvcl9vZmZzZXQpCi17Ci0gICAgdWludDhfdCBzbGlkZTsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMjsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IG91dDAsIG91dDE7Ci0gICAgdjE2aTggbWludXM1YiA9IF9fbXNhX2xkaV9iKC01KTsKLSAgICB2MTZpOCBwbHVzMjBiID0gX19tc2FfbGRpX2IoMjApOwotICAgIHYxNnU4IHJlczAsIHJlczE7Ci0KLSAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbNDhdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBpZiAoaG9yX29mZnNldCkgewotICAgICAgICBzbGlkZSA9IDM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2xpZGUgPSAyOwotICAgIH0KLQotICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCi0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOwotICAgIEhBRERfU0IyX1NIKHZlYzAsIHZlYzEsIG91dDAsIG91dDEpOwotICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgbWludXM1YiwgbWludXM1Yiwgb3V0MCwgb3V0MSk7Ci0gICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzQsIHZlYzUpOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBwbHVzMjBiLCBwbHVzMjBiLCBvdXQwLCBvdXQxKTsKLSAgICBTUkFSSV9IMl9TSChvdXQwLCBvdXQxLCA1KTsKLSAgICBTQVRfU0gyX1NIKG91dDAsIG91dDEsIDcpOwotCi0gICAgUENLRVZfQjJfVUIob3V0MCwgb3V0MCwgb3V0MSwgb3V0MSwgcmVzMCwgcmVzMSk7Ci0KLSAgICBzcmMwID0gX19tc2Ffc2xkX2Ioc3JjMCwgc3JjMCwgc2xpZGUpOwotICAgIHNyYzEgPSBfX21zYV9zbGRfYihzcmMxLCBzcmMxLCBzbGlkZSk7Ci0gICAgc3JjMiA9IF9fbXNhX3NsZF9iKHNyYzIsIHNyYzIsIHNsaWRlKTsKLSAgICBzcmMzID0gX19tc2Ffc2xkX2Ioc3JjMywgc3JjMywgc2xpZGUpOwotICAgIHNyYzAgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmMwLCAxLCAodjRpMzIpIHNyYzEpOwotICAgIHNyYzEgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmMyLCAxLCAodjRpMzIpIHNyYzMpOwotICAgIHJlczAgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMCwgc3JjMCk7Ci0gICAgcmVzMSA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IoKHYxNmk4KSByZXMxLCBzcmMxKTsKLQotICAgIFhPUklfQjJfMTI4X1VCKHJlczAsIHJlczEpOwotCi0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfdygodjRpMzIpIGRzdDAsIDEsICh2NGkzMikgZHN0MSk7Ci0gICAgZHN0MSA9ICh2MTZ1OCkgX19tc2FfaW5zdmVfdygodjRpMzIpIGRzdDIsIDEsICh2NGkzMikgZHN0Myk7Ci0KLSAgICBBVkVSX1VCMl9VQihyZXMwLCBkc3QwLCByZXMxLCBkc3QxLCBkc3QwLCBkc3QxKTsKLQotICAgIFNUNHg0X1VCKGRzdDAsIGRzdDEsIDAsIDEsIDAsIDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX2h6X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBob3Jfb2Zmc2V0KQotewotICAgIHVpbnQ4X3Qgc2xpZGU7Ci0gICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKLSAgICB2MTZpOCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTE7Ci0gICAgdjhpMTYgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2MTZpOCBtaW51czViID0gX19tc2FfbGRpX2IoLTUpOwotICAgIHYxNmk4IHBsdXMyMGIgPSBfX21zYV9sZGlfYigyMCk7Ci0gICAgdjE2aTggcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLQotICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotCi0gICAgaWYgKGhvcl9vZmZzZXQpIHsKLSAgICAgICAgc2xpZGUgPSAzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNsaWRlID0gMjsKLSAgICB9Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gMjsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgSEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwgbWludXM1YiwKLSAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjOCwgdmVjOSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWMxMCwgdmVjMTEpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAotICAgICAgICAgICAgICAgICAgICAgcGx1czIwYiwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7Ci0KLSAgICAgICAgc3JjMCA9IF9fbXNhX3NsZF9iKHNyYzAsIHNyYzAsIHNsaWRlKTsKLSAgICAgICAgc3JjMSA9IF9fbXNhX3NsZF9iKHNyYzEsIHNyYzEsIHNsaWRlKTsKLSAgICAgICAgc3JjMiA9IF9fbXNhX3NsZF9iKHNyYzIsIHNyYzIsIHNsaWRlKTsKLSAgICAgICAgc3JjMyA9IF9fbXNhX3NsZF9iKHNyYzMsIHNyYzMsIHNsaWRlKTsKLQotICAgICAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA1KTsKLSAgICAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKLQotICAgICAgICBQQ0tFVl9CNF9TQihvdXQwLCBvdXQwLCBvdXQxLCBvdXQxLCBvdXQyLCBvdXQyLCBvdXQzLCBvdXQzLAotICAgICAgICAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKLQotICAgICAgICByZXMwID0gX19tc2FfYXZlcl9zX2IocmVzMCwgc3JjMCk7Ci0gICAgICAgIHJlczEgPSBfX21zYV9hdmVyX3NfYihyZXMxLCBzcmMxKTsKLSAgICAgICAgcmVzMiA9IF9fbXNhX2F2ZXJfc19iKHJlczIsIHNyYzIpOwotICAgICAgICByZXMzID0gX19tc2FfYXZlcl9zX2IocmVzMywgc3JjMyk7Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfU0IocmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIEFWRVJfU1Q4eDRfVUIocmVzMCwgZHN0MCwgcmVzMSwgZHN0MSwgcmVzMiwgZHN0MiwgcmVzMywgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfaHpfcXJ0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBob3Jfb2Zmc2V0KQotewotICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IG91dDAsIG91dDE7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCB2c2hmOwotICAgIHYxNnU4IGRzdDAsIGRzdDE7Ci0gICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHYxNmk4IHZlYzYsIHZlYzcsIHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMTsKLSAgICB2MTZpOCBtaW51czViID0gX19tc2FfbGRpX2IoLTUpOwotICAgIHYxNmk4IHBsdXMyMGIgPSBfX21zYV9sZGlfYigyMCk7Ci0KLSAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLQotICAgIGlmIChob3Jfb2Zmc2V0KSB7Ci0gICAgICAgIHZzaGYgPSBMRF9TQigmbHVtYV9tYXNrX2FyclsxNiArIDk2XSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdnNoZiA9IExEX1NCKCZsdW1hX21hc2tfYXJyWzk2XSk7Ci0gICAgfQotCi0gICAgZm9yIChsb29wX2NudCA9IDg7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCMihzcmMsIDgsIHNyYzAsIHNyYzEpOwotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICAgICAgTERfU0IyKHNyYywgOCwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotCi0gICAgICAgIExEX1VCMihkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEpOwotCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMyk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWM2LCB2ZWM5KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzEsIHZlYzQpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjNywgdmVjMTApOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjNSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWM4LCB2ZWMxMSk7Ci0gICAgICAgIEhBRERfU0I0X1NIKHZlYzAsIHZlYzMsIHZlYzYsIHZlYzksIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMSwgdmVjNCwgdmVjNywgdmVjMTAsIG1pbnVzNWIsIG1pbnVzNWIsIG1pbnVzNWIsCi0gICAgICAgICAgICAgICAgICAgICBtaW51czViLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzIsIHZlYzUsIHZlYzgsIHZlYzExLCBwbHVzMjBiLCBwbHVzMjBiLCBwbHVzMjBiLAotICAgICAgICAgICAgICAgICAgICAgcGx1czIwYiwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgdnNoZiwgdnNoZiwgc3JjMCwgc3JjMik7Ci0gICAgICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDUpOwotICAgICAgICBTQVRfU0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOwotICAgICAgICBQQ0tFVl9CMl9TQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCBvdXQwLCBvdXQxKTsKLQotICAgICAgICBvdXQwID0gX19tc2FfYXZlcl9zX2Iob3V0MCwgc3JjMCk7Ci0gICAgICAgIG91dDEgPSBfX21zYV9hdmVyX3NfYihvdXQxLCBzcmMyKTsKLQotICAgICAgICBYT1JJX0IyXzEyOF9TQihvdXQwLCBvdXQxKTsKLSAgICAgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgZHN0MCwgZHN0MSk7Ci0gICAgICAgIFNUX1VCMihkc3QwLCBkc3QxLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX3Z0X2FuZF9hdmVyX2RzdF80eDRfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlKQotewotICAgIGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwotICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3I7Ci0gICAgdjE2aTggc3JjODdfciwgc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NjsKLSAgICB2OGkxNiBvdXQxMCwgb3V0MzI7Ci0gICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0MjsKLSAgICB2MTZ1OCByZXM7Ci0KLSAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKLSAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKLSAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKLQotICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotCi0gICAgSUxWUl9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLAotICAgICAgICAgICAgICAgc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfcik7Ci0gICAgSUxWUl9EMl9TQihzcmMyMV9yLCBzcmMxMF9yLCBzcmM0M19yLCBzcmMzMl9yLCBzcmMyMTEwLCBzcmM0MzMyKTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmMyMTEwLCBzcmM0MzMyKTsKLSAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsCi0gICAgICAgICAgICAgICBzcmM1NF9yLCBzcmM2NV9yLCBzcmM3Nl9yLCBzcmM4N19yKTsKLSAgICBJTFZSX0QyX1NCKHNyYzY1X3IsIHNyYzU0X3IsIHNyYzg3X3IsIHNyYzc2X3IsIHNyYzY1NTQsIHNyYzg3NzYpOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzY1NTQsIHNyYzg3NzYpOwotICAgIG91dDEwID0gRFBBRERfU0gzX1NIKHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgIG91dDMyID0gRFBBRERfU0gzX1NIKHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgIFNSQVJJX0gyX1NIKG91dDEwLCBvdXQzMiwgNSk7Ci0gICAgU0FUX1NIMl9TSChvdXQxMCwgb3V0MzIsIDcpOwotICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgIHJlcyA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MTAsIG91dDMyKTsKLQotICAgIElMVlJfVzJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7Ci0KLSAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9wY2tldl9kKCh2Mmk2NCkgZHN0MSwgKHYyaTY0KSBkc3QwKTsKLSAgICBkc3QwID0gX19tc2FfYXZlcl91X2IocmVzLCBkc3QwKTsKLQotICAgIFNUNHg0X1VCKGRzdDAsIGRzdDAsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX3Z0X2FuZF9hdmVyX2RzdF84eDhfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlKQordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMwMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludDMyX3QgbG9vcF9jbnQ7CiAgICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKICAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OwogICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwotICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzc2X3IsIHNyYzk4X3I7Ci0gICAgdjE2aTggc3JjMjFfciwgc3JjNDNfciwgc3JjODdfciwgc3JjMTA5X3I7Ci0gICAgdjhpMTYgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2MTZpOCBmaWx0MCwgZmlsdDEsIGZpbHQyOwotCi0gICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7Ci0gICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7Ci0gICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7Ci0KLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IpOwotCi0gICAgZm9yIChsb29wX2NudCA9IDI7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwotICAgICAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzQsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LAotICAgICAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yKTsKLSAgICAgICAgb3V0MCA9IERQQUREX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MSA9IERQQUREX1NIM19TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MiA9IERQQUREX1NIM19TSChzcmMzMl9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MyA9IERQQUREX1NIM19TSChzcmM0M19yLCBzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDUpOwotICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLQotICAgICAgICBDT05WRVJUX1VCX0FWR19TVDh4NF9VQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBzcmMxMF9yID0gc3JjNzZfcjsKLSAgICAgICAgc3JjMzJfciA9IHNyYzk4X3I7Ci0gICAgICAgIHNyYzIxX3IgPSBzcmM4N19yOwotICAgICAgICBzcmM0M19yID0gc3JjMTA5X3I7Ci0gICAgICAgIHNyYzQgPSBzcmMxMDsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX3Z0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlKQotewotICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OwotICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHYxNnU4IHJlczAsIHJlczEsIHJlczIsIHJlczMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yOwogICAgIHYxNmk4IHNyYzg3X3IsIHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIHNyYzIxX2wsIHNyYzQzX2w7Ci0gICAgdjE2aTggc3JjNjVfbCwgc3JjODdfbDsKKyAgICB2MTZpOCBzcmM2NV9sLCBzcmM4N19sLCBmaWx0MCwgZmlsdDEsIGZpbHQyOwogICAgIHY4aTE2IG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgb3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sOwotICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgZmlsdDI7Ci0gICAgdjE2dTggcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKIAogICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOwogICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOwogICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOwogCi0gICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICg1ICogc3JjX3N0cmlkZSk7CisgICAgc3JjIC09IChzdHJpZGUgKiAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKIAogICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IpOwotICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKLSAgICAgICAgICAgICAgIHNyYzEwX2wsIHNyYzIxX2wsIHNyYzMyX2wsIHNyYzQzX2wpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfbCwgc3JjMjFfbCwKKyAgICAgICAgICAgICAgIHNyYzMyX2wsIHNyYzQzX2wpOwogCiAgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICAgICAgc3JjICs9ICg0ICogc3RyaWRlKTsKIAogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICAgICAgSUxWUl9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LAotICAgICAgICAgICAgICAgICAgIHNyYzU0X3IsIHNyYzY1X3IsIHNyYzc2X3IsIHNyYzg3X3IpOwotICAgICAgICBJTFZMX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsCi0gICAgICAgICAgICAgICAgICAgc3JjNTRfbCwgc3JjNjVfbCwgc3JjNzZfbCwgc3JjODdfbCk7Ci0gICAgICAgIG91dDBfciA9IERQQUREX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MV9yID0gRFBBRERfU0gzX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQyX3IgPSBEUEFERF9TSDNfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDNfciA9IERQQUREX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0MF9sID0gRFBBRERfU0gzX1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQxX2wgPSBEUEFERF9TSDNfU0goc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDJfbCA9IERQQUREX1NIM19TSChzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0M19sID0gRFBBRERfU0gzX1NIKHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X3IsCisgICAgICAgICAgICAgICAgICAgc3JjNjVfciwgc3JjNzZfciwgc3JjODdfcik7CisgICAgICAgIElMVkxfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfbCwKKyAgICAgICAgICAgICAgICAgICBzcmM2NV9sLCBzcmM3Nl9sLCBzcmM4N19sKTsKKyAgICAgICAgb3V0MF9yID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDFfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQyX3IgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0M19yID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDBfbCA9IEFWQ19ET1RfU0gzX1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQxX2wgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0Ml9sID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDNfbCA9IEFWQ19ET1RfU0gzX1NIKHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwogICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOwotICAgICAgICBTUkFSSV9INF9TSChvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2wsIDUpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCwgNSk7CiAgICAgICAgIFNBVF9TSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA3KTsKLSAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAgICAgICAgIFBDS0VWX0I0X1VCKG91dDBfbCwgb3V0MF9yLCBvdXQxX2wsIG91dDFfciwgb3V0Ml9sLCBvdXQyX3IsIG91dDNfbCwKICAgICAgICAgICAgICAgICAgICAgb3V0M19yLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgcmVzMCA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IoKHYxNmk4KSByZXMwLCBzcmMyKTsKKyAgICAgICAgcmVzMSA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IoKHYxNmk4KSByZXMxLCBzcmMzKTsKKyAgICAgICAgcmVzMiA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IoKHYxNmk4KSByZXMyLCBzcmM0KTsKKyAgICAgICAgcmVzMyA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IoKHYxNmk4KSByZXMzLCBzcmM1KTsKKyAgICAgICAgTERfVUI0KGRzdCwgc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKICAgICAgICAgWE9SSV9CNF8xMjhfVUIocmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIEFWRVJfVUI0X1VCKHJlczAsIGRzdDAsIHJlczEsIGRzdDEsIHJlczIsIGRzdDIsIHJlczMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOwotICAgICAgICBTVF9VQjQocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7Ci0gICAgICAgIHNyYzMyX3IgPSBzcmM3Nl9yOwotICAgICAgICBzcmMyMV9yID0gc3JjNjVfcjsKLSAgICAgICAgc3JjNDNfciA9IHNyYzg3X3I7Ci0gICAgICAgIHNyYzEwX2wgPSBzcmM1NF9sOwotICAgICAgICBzcmMzMl9sID0gc3JjNzZfbDsKLSAgICAgICAgc3JjMjFfbCA9IHNyYzY1X2w7Ci0gICAgICAgIHNyYzQzX2wgPSBzcmM4N19sOwotICAgICAgICBzcmM0ID0gc3JjODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX3Z0X3FydF9hbmRfYXZlcl9kc3RfNHg0X21zYShjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2ZXJfb2Zmc2V0KQotewotICAgIGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwotICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3I7Ci0gICAgdjE2aTggc3JjODdfciwgc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NjsKLSAgICB2OGkxNiBvdXQxMCwgb3V0MzI7Ci0gICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0MjsKLSAgICB2MTZ1OCByZXM7Ci0KLSAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKLSAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKLSAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKLQotICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotCi0gICAgSUxWUl9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLAotICAgICAgICAgICAgICAgc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfcik7Ci0gICAgSUxWUl9EMl9TQihzcmMyMV9yLCBzcmMxMF9yLCBzcmM0M19yLCBzcmMzMl9yLCBzcmMyMTEwLCBzcmM0MzMyKTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmMyMTEwLCBzcmM0MzMyKTsKLSAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsCi0gICAgICAgICAgICAgICBzcmM1NF9yLCBzcmM2NV9yLCBzcmM3Nl9yLCBzcmM4N19yKTsKLSAgICBJTFZSX0QyX1NCKHNyYzY1X3IsIHNyYzU0X3IsIHNyYzg3X3IsIHNyYzc2X3IsIHNyYzY1NTQsIHNyYzg3NzYpOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzY1NTQsIHNyYzg3NzYpOwotICAgIG91dDEwID0gRFBBRERfU0gzX1NIKHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgIG91dDMyID0gRFBBRERfU0gzX1NIKHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgIFNSQVJJX0gyX1NIKG91dDEwLCBvdXQzMiwgNSk7Ci0gICAgU0FUX1NIMl9TSChvdXQxMCwgb3V0MzIsIDcpOwotICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgIHJlcyA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MTAsIG91dDMyKTsKLQotICAgIGlmICh2ZXJfb2Zmc2V0KSB7Ci0gICAgICAgIHNyYzMyX3IgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmMzLCAxLCAodjRpMzIpIHNyYzQpOwotICAgICAgICBzcmM1NF9yID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjNSwgMSwgKHY0aTMyKSBzcmM2KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzcmMzMl9yID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjMiwgMSwgKHY0aTMyKSBzcmMzKTsKLSAgICAgICAgc3JjNTRfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyYzQsIDEsICh2NGkzMikgc3JjNSk7Ci0gICAgfQotCi0gICAgc3JjMzJfciA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyYzMyX3IsIDEsICh2Mmk2NCkgc3JjNTRfcik7Ci0gICAgcmVzID0gX19tc2FfYXZlcl91X2IocmVzLCAodjE2dTgpIHNyYzMyX3IpOwotCi0gICAgSUxWUl9XMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKLQotICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2QoKHYyaTY0KSBkc3QxLCAodjJpNjQpIGRzdDApOwotICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYihyZXMsIGRzdDApOwotCi0gICAgU1Q0eDRfVUIoZHN0MCwgZHN0MCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfdnRfcXJ0X2FuZF9hdmVyX2RzdF84eDhfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZlcl9vZmZzZXQpCi17Ci0gICAgaW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOwotICAgIGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNzZfciwgc3JjOThfcjsKLSAgICB2MTZpOCBzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yLCBzcmMxMDlfcjsKLSAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3I7Ci0gICAgdjE2aTggcmVzMCwgcmVzMTsKLSAgICB2MTZ1OCB2ZWMwLCB2ZWMxOwotICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgZmlsdDI7Ci0KLSAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKLSAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKLSAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKLQotICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotCi0gICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgSUxWUl9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLAotICAgICAgICAgICAgICAgc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfcik7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gMjsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7Ci0gICAgICAgIElMVlJfQjRfU0Ioc3JjNywgc3JjNCwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksCi0gICAgICAgICAgICAgICAgICAgc3JjNzZfciwgc3JjODdfciwgc3JjOThfciwgc3JjMTA5X3IpOwotICAgICAgICBvdXQwX3IgPSBEUEFERF9TSDNfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDFfciA9IERQQUREX1NIM19TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0Ml9yID0gRFBBRERfU0gzX1NIKHNyYzMyX3IsIHNyYzc2X3IsIHNyYzk4X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQzX3IgPSBEUEFERF9TSDNfU0goc3JjNDNfciwgc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOwotICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7Ci0gICAgICAgIFBDS0VWX0IyX1NCKG91dDFfciwgb3V0MF9yLCBvdXQzX3IsIG91dDJfciwgcmVzMCwgcmVzMSk7Ci0KLSAgICAgICAgaWYgKHZlcl9vZmZzZXQpIHsKLSAgICAgICAgICAgIFBDS0VWX0QyX1NCKHNyYzQsIHNyYzMsIHNyYzgsIHNyYzcsIHNyYzEwX3IsIHNyYzMyX3IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUENLRVZfRDJfU0Ioc3JjMywgc3JjMiwgc3JjNywgc3JjNCwgc3JjMTBfciwgc3JjMzJfcik7Ci0gICAgICAgIH0KLQotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgSUxWUl9EMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKLQotICAgICAgICB2ZWMwID0gKHYxNnU4KSBfX21zYV9hdmVyX3NfYihyZXMwLCBzcmMxMF9yKTsKLSAgICAgICAgdmVjMSA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2IocmVzMSwgc3JjMzJfcik7Ci0KLSAgICAgICAgWE9SSV9CMl8xMjhfVUIodmVjMCwgdmVjMSk7Ci0gICAgICAgIEFWRVJfVUIyX1VCKHZlYzAsIGRzdDAsIHZlYzEsIGRzdDEsIHZlYzAsIHZlYzEpOwotICAgICAgICBTVDh4NF9VQih2ZWMwLCB2ZWMxLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBzcmMxMF9yID0gc3JjNzZfcjsKLSAgICAgICAgc3JjMzJfciA9IHNyYzk4X3I7Ci0gICAgICAgIHNyYzIxX3IgPSBzcmM4N19yOwotICAgICAgICBzcmM0M19yID0gc3JjMTA5X3I7Ci0gICAgICAgIHNyYzIgPSBzcmM4OwotICAgICAgICBzcmMzID0gc3JjOTsKLSAgICAgICAgc3JjNCA9IHNyYzEwOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfdnRfcXJ0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2ZXJfb2Zmc2V0KQotewotICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKLSAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OwotICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKLSAgICB2MTZpOCBzcmM4N19yLCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBzcmMyMV9sLCBzcmM0M19sOwotICAgIHYxNmk4IHNyYzY1X2wsIHNyYzg3X2w7Ci0gICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2w7Ci0gICAgdjE2aTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2MTZpOCBmaWx0MCwgZmlsdDEsIGZpbHQyOwotICAgIHYxNnU4IHJlczAsIHJlczEsIHJlczIsIHJlczM7Ci0KLSAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKLSAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKLSAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKLQotICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotCi0gICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgSUxWUl9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLAotICAgICAgICAgICAgICAgc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfcik7Ci0gICAgSUxWTF9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLAotICAgICAgICAgICAgICAgc3JjMTBfbCwgc3JjMjFfbCwgc3JjMzJfbCwgc3JjNDNfbCk7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwotICAgICAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsCi0gICAgICAgICAgICAgICAgICAgc3JjNTRfciwgc3JjNjVfciwgc3JjNzZfciwgc3JjODdfcik7Ci0gICAgICAgIElMVkxfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywKLSAgICAgICAgICAgICAgICAgICBzcmM1NF9sLCBzcmM2NV9sLCBzcmM3Nl9sLCBzcmM4N19sKTsKLSAgICAgICAgb3V0MF9yID0gRFBBRERfU0gzX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQxX3IgPSBEUEFERF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDJfciA9IERQQUREX1NIM19TSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0M19yID0gRFBBRERfU0gzX1NIKHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQwX2wgPSBEUEFERF9TSDNfU0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIG91dDFfbCA9IERQQUREX1NIM19TSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKLSAgICAgICAgb3V0Ml9sID0gRFBBRERfU0gzX1NIKHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOwotICAgICAgICBvdXQzX2wgPSBEUEFERF9TSDNfU0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7Ci0gICAgICAgIFNSQVJJX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNSk7Ci0gICAgICAgIFNSQVJJX0g0X1NIKG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCwgNSk7Ci0gICAgICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKLSAgICAgICAgU0FUX1NINF9TSChvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2wsIDcpOwotICAgICAgICBQQ0tFVl9CNF9TQihvdXQwX2wsIG91dDBfciwgb3V0MV9sLCBvdXQxX3IsIG91dDJfbCwgb3V0Ml9yLCBvdXQzX2wsCi0gICAgICAgICAgICAgICAgICAgIG91dDNfciwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7Ci0gICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCi0gICAgICAgIGlmICh2ZXJfb2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXMwID0gKHYxNnU4KSBfX21zYV9hdmVyX3NfYihvdXQwLCBzcmMzKTsKLSAgICAgICAgICAgIHJlczEgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKG91dDEsIHNyYzQpOwotICAgICAgICAgICAgcmVzMiA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2Iob3V0Miwgc3JjNSk7Ci0gICAgICAgICAgICByZXMzID0gKHYxNnU4KSBfX21zYV9hdmVyX3NfYihvdXQzLCBzcmM2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlczAgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKG91dDAsIHNyYzIpOwotICAgICAgICAgICAgcmVzMSA9ICh2MTZ1OCkgX19tc2FfYXZlcl9zX2Iob3V0MSwgc3JjMyk7Ci0gICAgICAgICAgICByZXMyID0gKHYxNnU4KSBfX21zYV9hdmVyX3NfYihvdXQyLCBzcmM0KTsKLSAgICAgICAgICAgIHJlczMgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKG91dDMsIHNyYzUpOwotICAgICAgICB9Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfVUIocmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgICAgIEFWRVJfVUI0X1VCKHJlczAsIGRzdDAsIHJlczEsIGRzdDEsIHJlczIsIGRzdDIsIHJlczMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBTVF9VQjQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIEFWRVJfVUIyX1VCKHJlczAsIGRzdDAsIHJlczEsIGRzdDEsIGRzdDAsIGRzdDEpOworICAgICAgICBBVkVSX1VCMl9VQihyZXMyLCBkc3QyLCByZXMzLCBkc3QzLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgU1RfVUI0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogc3RyaWRlKTsKIAogICAgICAgICBzcmMxMF9yID0gc3JjNTRfcjsKICAgICAgICAgc3JjMzJfciA9IHNyYzc2X3I7CkBAIC0yMTMxLDIwMSArMzcxNywxNTA4IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWRfYW5kX2F2ZXJfZHN0XzR4NF9tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSkKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMDNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwotICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7Ci0gICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MzsKLSAgICB2OGkxNiBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2LCBoel9vdXQ3LCBoel9vdXQ4OwotICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczM7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZ1OCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIGludDMyX3QgbG9vcF9jbnQ7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OworICAgIGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKKyAgICB2MTZ1OCByZXMwLCByZXMxLCByZXMyLCByZXMzLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKKyAgICB2MTZpOCBzcmM4N19yLCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBzcmMyMV9sLCBzcmM0M19sOworICAgIHYxNmk4IHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2w7CiAKLSAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbNDhdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICg1ICogc3JjX3N0cmlkZSk7CisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKHN0cmlkZSAqIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOwogCiAgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgSUxWUl9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMxMF9yLCBzcmMyMV9yLAorICAgICAgICAgICAgICAgc3JjMzJfciwgc3JjNDNfcik7CisgICAgSUxWTF9CNF9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMxMF9sLCBzcmMyMV9sLAorICAgICAgICAgICAgICAgc3JjMzJfbCwgc3JjNDNfbCk7CiAKLSAgICBoel9vdXQwID0gQVZDX1hPUl9WU0hGX0JfQU5EX0FQUExZXzZUQVBfSE9SSVpfRklMVF9TSChzcmMwLCBzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDIgPSBBVkNfWE9SX1ZTSEZfQl9BTkRfQVBQTFlfNlRBUF9IT1JJWl9GSUxUX1NIKHNyYzIsIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CiAKLSAgICBQQ0tPRF9EMl9TSChoel9vdXQwLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwKKyAgICAgICAgICAgICAgICAgICBzcmM2NV9yLCBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICAgICAgSUxWTF9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM1NF9sLAorICAgICAgICAgICAgICAgICAgIHNyYzY1X2wsIHNyYzc2X2wsIHNyYzg3X2wpOworICAgICAgICBvdXQwX3IgPSBBVkNfRE9UX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0MV9yID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDJfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQzX3IgPSBBVkNfRE9UX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0MF9sID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDFfbCA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQyX2wgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0M19sID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNSk7CisgICAgICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA1KTsKKyAgICAgICAgU0FUX1NINF9TSChvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2wsIDcpOworICAgICAgICBQQ0tFVl9CNF9VQihvdXQwX2wsIG91dDBfciwgb3V0MV9sLCBvdXQxX3IsIG91dDJfbCwgb3V0Ml9yLCBvdXQzX2wsCisgICAgICAgICAgICAgICAgICAgIG91dDNfciwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIHJlczAgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMCwgc3JjMyk7CisgICAgICAgIHJlczEgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMSwgc3JjNCk7CisgICAgICAgIHJlczIgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMiwgc3JjNSk7CisgICAgICAgIHJlczMgPSAodjE2dTgpIF9fbXNhX2F2ZXJfc19iKCh2MTZpOCkgcmVzMywgc3JjNik7CisgICAgICAgIExEX1VCNChkc3QsIHN0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFhPUklfQjRfMTI4X1VCKHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBBVkVSX1VCMl9VQihyZXMwLCBkc3QwLCByZXMxLCBkc3QxLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgQVZFUl9VQjJfVUIocmVzMiwgZHN0MiwgcmVzMywgZHN0MywgZHN0MiwgZHN0Myk7CisgICAgICAgIFNUX1VCNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIHN0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CiAKLSAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotCi0gICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0KLSAgICBoel9vdXQ1ID0gQVZDX1hPUl9WU0hGX0JfQU5EX0FQUExZXzZUQVBfSE9SSVpfRklMVF9TSChzcmMwLCBzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDcgPSBBVkNfWE9SX1ZTSEZfQl9BTkRfQVBQTFlfNlRBUF9IT1JJWl9GSUxUX1NIKHNyYzIsIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBQQ0tPRF9EMl9TSChoel9vdXQ1LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4KTsKLQotICAgIHJlczAgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1JfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDQsIGh6X291dDUpOwotICAgIHJlczEgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1JfU0goaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDUsIGh6X291dDYpOwotICAgIHJlczIgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1JfU0goaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDUsIGh6X291dDYsIGh6X291dDcpOwotICAgIHJlczMgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1JfU0goaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDYsIGh6X291dDcsIGh6X291dDgpOwotICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczEpOwotICAgIHRtcDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczIsIHJlczMpOwotICAgIFBDS0VWX0QyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIHRtcDIsIHRtcDMpOwotICAgIEFWRVJfVUIyX1VCKHRtcDAsIHRtcDIsIHRtcDEsIHRtcDMsIHRtcDAsIHRtcDEpOwotCi0gICAgU1Q0eDRfVUIodG1wMCwgdG1wMSwgMCwgMiwgMCwgMiwgZHN0LCBkc3Rfc3RyaWRlKTsKLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfbWlkX2FuZF9hdmVyX2RzdF84d19tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKLXsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwotICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7Ci0gICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MzsKLSAgICB2OGkxNiBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2LCBoel9vdXQ3LCBoel9vdXQ4OwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLQotICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotCi0gICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICg1ICogc3JjX3N0cmlkZSk7Ci0KLSAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICBoel9vdXQzID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDQgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBoel9vdXQ1ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgICAgICBoel9vdXQ2ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgICAgICBoel9vdXQ3ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgICAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotCi0gICAgICAgIHJlczAgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDQsIGh6X291dDUpOwotICAgICAgICByZXMxID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9TSChoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2KTsKLSAgICAgICAgcmVzMiA9IEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfU0goaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NSwgaHpfb3V0NiwgaHpfb3V0Nyk7Ci0gICAgICAgIHJlczMgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1NIKGh6X291dDMsIGh6X291dDQsIGh6X291dDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDYsIGh6X291dDcsIGh6X291dDgpOwotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgQ09OVkVSVF9VQl9BVkdfU1Q4eDRfVUIocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgaHpfb3V0MyA9IGh6X291dDc7Ci0gICAgICAgIGh6X291dDEgPSBoel9vdXQ1OwotICAgICAgICBoel9vdXQ1ID0gaHpfb3V0NDsKLSAgICAgICAgaHpfb3V0NCA9IGh6X291dDg7Ci0gICAgICAgIGh6X291dDIgPSBoel9vdXQ2OwotICAgICAgICBoel9vdXQwID0gaHpfb3V0NTsKKyAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7CisgICAgICAgIHNyYzMyX3IgPSBzcmM3Nl9yOworICAgICAgICBzcmMyMV9yID0gc3JjNjVfcjsKKyAgICAgICAgc3JjNDNfciA9IHNyYzg3X3I7CisgICAgICAgIHNyYzEwX2wgPSBzcmM1NF9sOworICAgICAgICBzcmMzMl9sID0gc3JjNzZfbDsKKyAgICAgICAgc3JjMjFfbCA9IHNyYzY1X2w7CisgICAgICAgIHNyYzQzX2wgPSBzcmM4N19sOworICAgICAgICBzcmMzID0gc3JjNzsKKyAgICAgICAgc3JjNCA9IHNyYzg7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWRfYW5kX2F2ZXJfZHN0XzE2eDE2X21zYShjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUpCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIGF2Y19sdW1hX21pZF9hbmRfYXZlcl9kc3RfOHdfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCAxNik7Ci0gICAgYXZjX2x1bWFfbWlkX2FuZF9hdmVyX2RzdF84d19tc2Eoc3JjICsgOCwgc3JjX3N0cmlkZSwgZHN0ICsgOCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNik7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgdjE2dTggZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH0sIGRzdDIgPSB7IDAgfSwgZHN0MyA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTI7CisgICAgdjE2aTggc3JjMTMsIHNyYzE0LCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBzcmMxMDlfcjsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yOworICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgZmlsdDIsIG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQ0X3IsIG91dDVfciwgb3V0Nl9yLCBvdXQ3X3I7CisKKyAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKKworICAgIHNyYyAtPSAoc3RyaWRlICogMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBJTFZSX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzEwX3IsIHNyYzIxX3IsCisgICAgICAgICAgICAgICBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICBMRF9TQjgoc3JjLCBzdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIsIHNyYzEzLCBzcmMxNCk7CisgICAgWE9SSV9COF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMsIHNyYzE0KTsKKyAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzQsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM3Nl9yLAorICAgICAgICAgICAgICAgc3JjODdfciwgc3JjOThfciwgc3JjMTA5X3IpOworICAgIG91dDBfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDFfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzg3X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDJfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzMyX3IsIHNyYzc2X3IsIHNyYzk4X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDNfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzQzX3IsIHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBQQ0tFVl9EMl9TQihzcmMzLCBzcmMyLCBzcmM3LCBzcmM0LCB0bXAwLCB0bXAxKTsKKyAgICBJTFZSX0I0X1NCKHNyYzExLCBzcmMxMCwgc3JjMTIsIHNyYzExLCBzcmMxMywgc3JjMTIsIHNyYzE0LCBzcmMxMywgc3JjMTBfciwKKyAgICAgICAgICAgICAgIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIG91dDRfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzc2X3IsIHNyYzk4X3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDVfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzg3X3IsIHNyYzEwOV9yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ2X3IgPSBBVkNfRE9UX1NIM19TSChzcmM5OF9yLCBzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBvdXQ3X3IgPSBBVkNfRE9UX1NIM19TSChzcmMxMDlfciwgc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgUENLRVZfRDJfU0Ioc3JjOSwgc3JjOCwgc3JjMTEsIHNyYzEwLCB0bXAyLCB0bXAzKTsKKyAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOworICAgIFNSQVJJX0g0X1NIKG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfciwgNSk7CisgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOworICAgIFNBVF9TSDRfU0gob3V0NF9yLCBvdXQ1X3IsIG91dDZfciwgb3V0N19yLCA3KTsKKworICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgTEQ0KGRzdCArIDQgKiBzdHJpZGUsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDIpOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0Myk7CisKKyAgICBQQ0tFVl9CMl9TQihvdXQxX3IsIG91dDBfciwgb3V0M19yLCBvdXQyX3IsIG91dDAsIG91dDEpOworICAgIFBDS0VWX0IyX1NCKG91dDVfciwgb3V0NF9yLCBvdXQ3X3IsIG91dDZfciwgb3V0Miwgb3V0Myk7CisgICAgb3V0MCA9IF9fbXNhX2F2ZXJfc19iKG91dDAsIHRtcDApOworICAgIG91dDEgPSBfX21zYV9hdmVyX3NfYihvdXQxLCB0bXAxKTsKKyAgICBvdXQyID0gX19tc2FfYXZlcl9zX2Iob3V0MiwgdG1wMik7CisgICAgb3V0MyA9IF9fbXNhX2F2ZXJfc19iKG91dDMsIHRtcDMpOworICAgIFhPUklfQjRfMTI4X1NCKG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgIEFWRVJfVUI0X1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIG91dDIsIGRzdDIsIG91dDMsIGRzdDMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgU1Q4eDhfVUIoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWRoX3FydF9hbmRfYXZlcl9kc3RfNHdfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaG9yaXpfb2Zmc2V0KQordm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzAzX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKKyAgICB2MTZ1OCBkc3QwID0geyAwIH0sIGRzdDEgPSB7IDAgfSwgZHN0MiA9IHsgMCB9LCBkc3QzID0geyAwIH07CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMjsKKyAgICB2MTZpOCBzcmMxMywgc3JjMTQsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHNyYzEwOV9yOworICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzc2X3IsIHNyYzk4X3IsIHNyYzIxX3IsIHNyYzQzX3IsIHNyYzg3X3I7CisgICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0Miwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfcjsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgc3JjIC09IChzdHJpZGUgKiAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIExEX1NCOChzcmMsIHN0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMsIHNyYzE0KTsKKyAgICBYT1JJX0I4XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQpOworICAgIElMVlJfQjRfU0Ioc3JjNywgc3JjNCwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzc2X3IsCisgICAgICAgICAgICAgICBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfcik7CisgICAgb3V0MF9yID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0MV9yID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0Ml9yID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfciwgc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0M19yID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfciwgc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIFBDS0VWX0QyX1NCKHNyYzQsIHNyYzMsIHNyYzgsIHNyYzcsIHRtcDAsIHRtcDEpOworICAgIElMVlJfQjRfU0Ioc3JjMTEsIHNyYzEwLCBzcmMxMiwgc3JjMTEsIHNyYzEzLCBzcmMxMiwgc3JjMTQsIHNyYzEzLCBzcmMxMF9yLAorICAgICAgICAgICAgICAgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfcik7CisgICAgb3V0NF9yID0gQVZDX0RPVF9TSDNfU0goc3JjNzZfciwgc3JjOThfciwgc3JjMTBfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0NV9yID0gQVZDX0RPVF9TSDNfU0goc3JjODdfciwgc3JjMTA5X3IsIHNyYzIxX3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDZfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzk4X3IsIHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDdfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzEwOV9yLCBzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBQQ0tFVl9EMl9TQihzcmMxMCwgc3JjOSwgc3JjMTIsIHNyYzExLCB0bXAyLCB0bXAzKTsKKyAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOworICAgIFNSQVJJX0g0X1NIKG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfciwgNSk7CisgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOworICAgIFNBVF9TSDRfU0gob3V0NF9yLCBvdXQ1X3IsIG91dDZfciwgb3V0N19yLCA3KTsKKworICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgTEQ0KGRzdCArIDQgKiBzdHJpZGUsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDIpOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0Myk7CisKKyAgICBQQ0tFVl9CMl9TQihvdXQxX3IsIG91dDBfciwgb3V0M19yLCBvdXQyX3IsIG91dDAsIG91dDEpOworICAgIFBDS0VWX0IyX1NCKG91dDVfciwgb3V0NF9yLCBvdXQ3X3IsIG91dDZfciwgb3V0Miwgb3V0Myk7CisgICAgb3V0MCA9IF9fbXNhX2F2ZXJfc19iKG91dDAsIHRtcDApOworICAgIG91dDEgPSBfX21zYV9hdmVyX3NfYihvdXQxLCB0bXAxKTsKKyAgICBvdXQyID0gX19tc2FfYXZlcl9zX2Iob3V0MiwgdG1wMik7CisgICAgb3V0MyA9IF9fbXNhX2F2ZXJfc19iKG91dDMsIHRtcDMpOworICAgIFhPUklfQjRfMTI4X1NCKG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgIEFWRVJfVUI0X1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIG91dDIsIGRzdDIsIG91dDMsIGRzdDMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgU1Q4eDhfVUIoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMDFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNnU4IHJlcywgZHN0MCA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKKyAgICB2MTZpOCBzcmM4N19yLCBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IG91dDEwLCBvdXQzMjsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgc3JjIC09IChzdHJpZGUgKiAyKTsKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisKKyAgICBJTFZSX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzEwX3IsIHNyYzIxX3IsCisgICAgICAgICAgICAgICBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICBJTFZSX0QyX1NCKHNyYzIxX3IsIHNyYzEwX3IsIHNyYzQzX3IsIHNyYzMyX3IsIHNyYzIxMTAsIHNyYzQzMzIpOworICAgIFhPUklfQjJfMTI4X1NCKHNyYzIxMTAsIHNyYzQzMzIpOworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgSUxWUl9CNF9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM1NF9yLCBzcmM2NV9yLAorICAgICAgICAgICAgICAgc3JjNzZfciwgc3JjODdfcik7CisgICAgSUxWUl9EMl9TQihzcmM2NV9yLCBzcmM1NF9yLCBzcmM4N19yLCBzcmM3Nl9yLCBzcmM2NTU0LCBzcmM4Nzc2KTsKKyAgICBYT1JJX0IyXzEyOF9TQihzcmM2NTU0LCBzcmM4Nzc2KTsKKyAgICBzcmMzMl9yID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjMiwgMSwgKHY0aTMyKSBzcmMzKTsKKyAgICBzcmM1NF9yID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgc3JjNCwgMSwgKHY0aTMyKSBzcmM1KTsKKyAgICBzcmMzMl9yID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjMzJfciwgMSwgKHYyaTY0KSBzcmM1NF9yKTsKKyAgICBvdXQxMCA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDMyID0gQVZDX0RPVF9TSDNfU0goc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NiwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgU1JBUklfSDJfU0gob3V0MTAsIG91dDMyLCA1KTsKKyAgICBTQVRfU0gyX1NIKG91dDEwLCBvdXQzMiwgNyk7CisgICAgTFc0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOworICAgIHJlcyA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MTAsIG91dDMyKTsKKyAgICByZXMgPSBfX21zYV9hdmVyX3VfYihyZXMsICh2MTZ1OCkgc3JjMzJfcik7CisgICAgZHN0MCA9IF9fbXNhX2F2ZXJfdV9iKHJlcywgZHN0MCk7CisgICAgU1Q0eDRfVUIoZHN0MCwgZHN0MCwgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMDNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNnU4IHJlcywgZHN0MCA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKKyAgICB2MTZpOCBzcmM4N19yLCBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IG91dDEwLCBvdXQzMjsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworCisgICAgc3JjIC09IChzdHJpZGUgKiAyKTsKKworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfRDJfU0Ioc3JjMjFfciwgc3JjMTBfciwgc3JjNDNfciwgc3JjMzJfciwgc3JjMjExMCwgc3JjNDMzMik7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMjExMCwgc3JjNDMzMik7CisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X3IsIHNyYzY1X3IsCisgICAgICAgICAgICAgICBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICBJTFZSX0QyX1NCKHNyYzY1X3IsIHNyYzU0X3IsIHNyYzg3X3IsIHNyYzc2X3IsIHNyYzY1NTQsIHNyYzg3NzYpOworICAgIFhPUklfQjJfMTI4X1NCKHNyYzY1NTQsIHNyYzg3NzYpOworICAgIG91dDEwID0gQVZDX0RPVF9TSDNfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0MzIgPSBBVkNfRE9UX1NIM19TSChzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBTUkFSSV9IMl9TSChvdXQxMCwgb3V0MzIsIDUpOworICAgIFNBVF9TSDJfU0gob3V0MTAsIG91dDMyLCA3KTsKKyAgICBMVzQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MCk7CisgICAgcmVzID0gUENLRVZfWE9SSTEyOF9VQihvdXQxMCwgb3V0MzIpOworICAgIHNyYzMyX3IgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmMzLCAxLCAodjRpMzIpIHNyYzQpOworICAgIHNyYzU0X3IgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmM1LCAxLCAodjRpMzIpIHNyYzYpOworICAgIHNyYzMyX3IgPSAodjE2aTgpIF9fbXNhX2luc3ZlX2QoKHYyaTY0KSBzcmMzMl9yLCAxLCAodjJpNjQpIHNyYzU0X3IpOworICAgIHJlcyA9IF9fbXNhX2F2ZXJfdV9iKHJlcywgKHYxNnU4KSBzcmMzMl9yKTsKKyAgICBkc3QwID0gX19tc2FfYXZlcl91X2IocmVzLCBkc3QwKTsKKyAgICBTVDR4NF9VQihkc3QwLCBkc3QwLCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMTFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0XzE2eDE2X21zYShzcmMgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMzFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0XzE2eDE2X21zYShzcmMgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfMTZ4MTZfbXNhKHNyYyArIHN0cmlkZSAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjIC0gKHN0cmlkZSAqIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMzM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfMTZ4MTZfbXNhKHNyYyArIHN0cmlkZSAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjIC0gKHN0cmlkZSAqIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzMxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0Xzh4OF9tc2Eoc3JjIC0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjIC0gKHN0cmlkZSAqIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMxM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF84eDhfbXNhKHNyYyArIHN0cmlkZSAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMgKyBzdHJpZGUgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDhfdCksIGRzdCwgc3RyaWRlKTsKK30KKworCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMTFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfNHg0X21zYShzcmMgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzMxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0XzR4NF9tc2Eoc3JjIC0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjIC0gKHN0cmlkZSAqIDIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMxM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF80eDRfbXNhKHNyYyArIHN0cmlkZSAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMzNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfNHg0X21zYShzcmMgKyBzdHJpZGUgLSAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDhfdCksIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMyMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB1aW50OF90ICpkc3RfdG1wID0gZHN0OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY190bXAgPSBzcmMgLSAoMiAqIHN0cmlkZSkgLSAyOworICAgIHVpbnQzMl90IG11bHRpcGxlOF9jbnQsIGxvb3BfY250OworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDAgPSAweGZmZmIwMDAxOworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDEgPSAweDE0MDAxNDsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QyID0gMHgxZmZmYjsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBkc3QwID0geyAwIH0sIGRzdDEgPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBtYXNrMCwgbWFzazE7CisgICAgdjE2aTggbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfciwgaHpfb3V0MTBfbCwgaHpfb3V0MjFfbDsKKyAgICB2OGkxNiBoel9vdXQzMl9sLCBoel9vdXQ0M19sLCBoel9vdXQ1NF9sLCBoel9vdXQ2NV9sLCBoel9vdXQ3Nl9sOworICAgIHY4aTE2IGh6X291dDg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjRpMzIgdG1wMF93LCB0bXAxX3c7CisKKyAgICBmaWx0MCA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QyKTsKKworICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZm9yIChtdWx0aXBsZThfY250ID0gMjsgbXVsdGlwbGU4X2NudC0tOykgeworICAgICAgICBkc3QgPSBkc3RfdG1wOworICAgICAgICBzcmMgPSBzcmNfdG1wOworCisgICAgICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgICAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworCisgICAgICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgIGh6X291dDMgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgIGh6X291dDQgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICAgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgICAgICBMRF9TQjIoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYpOworICAgICAgICAgICAgc3JjICs9ICgyICogc3RyaWRlKTsKKworICAgICAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7CisgICAgICAgICAgICBoel9vdXQ1ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgaHpfb3V0NiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIElMVlJfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NCwgaHpfb3V0MywgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NDNfcik7CisgICAgICAgICAgICBJTFZMX0g0X1NIKGh6X291dDEsIGh6X291dDAsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMsIGh6X291dDIsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDMsIGh6X291dDEwX2wsIGh6X291dDIxX2wsIGh6X291dDMyX2wsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQzX2wpOworICAgICAgICAgICAgSUxWUl9IMl9TSChoel9vdXQ1LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ1NF9yLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ2NV9yKTsKKyAgICAgICAgICAgIElMVkxfSDJfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NTRfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NjVfbCk7CisgICAgICAgICAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9yLCBoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDFfdywgKHY4aTE2KSB0bXAwX3cpOworICAgICAgICAgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfciwgaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMV93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NjVfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKworICAgICAgICAgICAgdG1wMSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0MiwgNSk7CisgICAgICAgICAgICB0bXAzID0gX19tc2Ffc3JhcmlfaChoel9vdXQzLCA1KTsKKyAgICAgICAgICAgIFNBVF9TSDJfU0godG1wMSwgdG1wMywgNyk7CisKKyAgICAgICAgICAgIHRtcDAgPSBfX21zYV9hdmVyX3NfaCh0bXAwLCB0bXAxKTsKKyAgICAgICAgICAgIHRtcDEgPSBfX21zYV9hdmVyX3NfaCh0bXAyLCB0bXAzKTsKKworICAgICAgICAgICAgTEQyKGRzdCwgc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworCisgICAgICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQih0bXAwLCB0bXAxKTsKKyAgICAgICAgICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYihvdXQwLCBkc3QwKTsKKyAgICAgICAgICAgIFNUOHgyX1VCKGRzdDAsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoMiAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIExEX1NCMihzcmMsIHN0cmlkZSwgc3JjNywgc3JjOCk7CisgICAgICAgICAgICBzcmMgKz0gKDIgKiBzdHJpZGUpOworCisgICAgICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM3LCBzcmM4KTsKKyAgICAgICAgICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgSUxWUl9IMl9TSChoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4LCBoel9vdXQ3LCBoel9vdXQ3Nl9yLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ4N19yKTsKKyAgICAgICAgICAgIElMVkxfSDJfU0goaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwgaHpfb3V0NywgaHpfb3V0NzZfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0ODdfbCk7CisgICAgICAgICAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBoel9vdXQ3Nl9sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXA0ID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDFfdywgKHY4aTE2KSB0bXAwX3cpOworICAgICAgICAgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMV93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfbCwgaHpfb3V0NjVfbCwgaHpfb3V0ODdfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wNiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKworICAgICAgICAgICAgdG1wNSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NCwgNSk7CisgICAgICAgICAgICB0bXA3ID0gX19tc2Ffc3JhcmlfaChoel9vdXQ1LCA1KTsKKyAgICAgICAgICAgIFNBVF9TSDJfU0godG1wNSwgdG1wNywgNyk7CisKKyAgICAgICAgICAgIHRtcDIgPSBfX21zYV9hdmVyX3NfaCh0bXA0LCB0bXA1KTsKKyAgICAgICAgICAgIHRtcDMgPSBfX21zYV9hdmVyX3NfaCh0bXA2LCB0bXA3KTsKKworICAgICAgICAgICAgTEQyKGRzdCwgc3RyaWRlLCB0cDIsIHRwMyk7CisgICAgICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworCisgICAgICAgICAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQih0bXAyLCB0bXAzKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9hdmVyX3VfYihvdXQxLCBkc3QxKTsKKyAgICAgICAgICAgIFNUOHgyX1VCKGRzdDEsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoMiAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIGh6X291dDAgPSBoel9vdXQ0OworICAgICAgICAgICAgaHpfb3V0MSA9IGh6X291dDU7CisgICAgICAgICAgICBoel9vdXQyID0gaHpfb3V0NjsKKyAgICAgICAgICAgIGh6X291dDMgPSBoel9vdXQ3OworICAgICAgICAgICAgaHpfb3V0NCA9IGh6X291dDg7CisgICAgICAgIH0KKworICAgICAgICBzcmNfdG1wICs9IDg7CisgICAgICAgIGRzdF90bXAgKz0gODsKKyAgICB9Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdWludDhfdCAqZHN0X3RtcCA9IGRzdDsKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdG1wID0gc3JjIC0gKDIgKiBzdHJpZGUpIC0gMjsKKyAgICB1aW50MzJfdCBtdWx0aXBsZThfY250LCBsb29wX2NudDsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QwID0gMHhmZmZiMDAwMTsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QxID0gMHgxNDAwMTQ7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MiA9IDB4MWZmZmI7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH07CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgbWFzazAsIG1hc2sxOworICAgIHYxNmk4IG1hc2syOworICAgIHY4aTE2IGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIGh6X291dDY7CisgICAgdjhpMTYgaHpfb3V0NywgaHpfb3V0OCwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB2OGkxNiBoel9vdXQxMF9yLCBoel9vdXQyMV9yLCBoel9vdXQzMl9yLCBoel9vdXQ0M19yLCBoel9vdXQ1NF9yOworICAgIHY4aTE2IGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IsIGh6X291dDEwX2wsIGh6X291dDIxX2w7CisgICAgdjhpMTYgaHpfb3V0MzJfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NTRfbCwgaHpfb3V0NjVfbCwgaHpfb3V0NzZfbDsKKyAgICB2OGkxNiBoel9vdXQ4N19sLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY0aTMyIHRtcDBfdywgdG1wMV93OworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIGZvciAobXVsdGlwbGU4X2NudCA9IDI7IG11bHRpcGxlOF9jbnQtLTspIHsKKyAgICAgICAgZHN0ID0gZHN0X3RtcDsKKyAgICAgICAgc3JjID0gc3JjX3RtcDsKKworICAgICAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgICAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICAgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgICAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQzID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICAgICAgTERfU0IyKHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2KTsKKyAgICAgICAgICAgIHNyYyArPSAoMiAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzUsIHNyYzYpOworICAgICAgICAgICAgaHpfb3V0NSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBJTFZSX0g0X1NIKGh6X291dDEsIGh6X291dDAsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMsIGh6X291dDIsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQzX3IpOworICAgICAgICAgICAgSUxWTF9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQzLCBoel9vdXQxMF9sLCBoel9vdXQyMV9sLCBoel9vdXQzMl9sLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0M19sKTsKKyAgICAgICAgICAgIElMVlJfSDJfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NTRfciwgaHpfb3V0NjVfcik7CisgICAgICAgICAgICBJTFZMX0gyX1NIKGh6X291dDUsIGh6X291dDQsIGh6X291dDYsIGh6X291dDUsIGh6X291dDU0X2wsIGh6X291dDY1X2wpOworCisgICAgICAgICAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9yLCBoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDFfdywgKHY4aTE2KSB0bXAwX3cpOworICAgICAgICAgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfciwgaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMV93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NjVfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKworICAgICAgICAgICAgdG1wMSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0MywgNSk7CisgICAgICAgICAgICB0bXAzID0gX19tc2Ffc3JhcmlfaChoel9vdXQ0LCA1KTsKKyAgICAgICAgICAgIFNBVF9TSDJfU0godG1wMSwgdG1wMywgNyk7CisKKyAgICAgICAgICAgIHRtcDAgPSBfX21zYV9hdmVyX3NfaCh0bXAwLCB0bXAxKTsKKyAgICAgICAgICAgIHRtcDEgPSBfX21zYV9hdmVyX3NfaCh0bXAyLCB0bXAzKTsKKworICAgICAgICAgICAgTEQyKGRzdCwgc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgICAgICAgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgICAgICAgICBkc3QwID0gX19tc2FfYXZlcl91X2Iob3V0MCwgZHN0MCk7CisgICAgICAgICAgICBTVDh4Ml9VQihkc3QwLCBkc3QsIHN0cmlkZSk7CisgICAgICAgICAgICBkc3QgKz0gKDIgKiBzdHJpZGUpOworCisgICAgICAgICAgICBMRF9TQjIoc3JjLCBzdHJpZGUsIHNyYzcsIHNyYzgpOworICAgICAgICAgICAgc3JjICs9ICgyICogc3RyaWRlKTsKKworICAgICAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNywgc3JjOCk7CisgICAgICAgICAgICBoel9vdXQ3ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgaHpfb3V0OCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIElMVlJfSDJfU0goaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwgaHpfb3V0NywgaHpfb3V0NzZfciwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0ODdfcik7CisgICAgICAgICAgICBJTFZMX0gyX1NIKGh6X291dDcsIGh6X291dDYsIGh6X291dDgsIGh6X291dDcsIGh6X291dDc2X2wsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDg3X2wpOworICAgICAgICAgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgaHpfb3V0NzZfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMV93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MzJfbCwgaHpfb3V0NTRfbCwgaHpfb3V0NzZfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wNCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKyAgICAgICAgICAgIHRtcDBfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDQzX3IsIGh6X291dDY1X3IsIGh6X291dDg3X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDQzX2wsIGh6X291dDY1X2wsIGh6X291dDg3X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDYgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMV93LCAodjhpMTYpIHRtcDBfdyk7CisKKyAgICAgICAgICAgIHRtcDUgPSBfX21zYV9zcmFyaV9oKGh6X291dDUsIDUpOworICAgICAgICAgICAgdG1wNyA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NiwgNSk7CisgICAgICAgICAgICBTQVRfU0gyX1NIKHRtcDUsIHRtcDcsIDcpOworCisgICAgICAgICAgICB0bXAyID0gX19tc2FfYXZlcl9zX2godG1wNCwgdG1wNSk7CisgICAgICAgICAgICB0bXAzID0gX19tc2FfYXZlcl9zX2godG1wNiwgdG1wNyk7CisKKyAgICAgICAgICAgIExEMihkc3QsIHN0cmlkZSwgdHAyLCB0cDMpOworICAgICAgICAgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICAgICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDIsIHRtcDMpOworICAgICAgICAgICAgZHN0MSA9IF9fbXNhX2F2ZXJfdV9iKG91dDEsIGRzdDEpOworICAgICAgICAgICAgU1Q4eDJfVUIoZHN0MSwgZHN0LCBzdHJpZGUpOworICAgICAgICAgICAgZHN0ICs9ICgyICogc3RyaWRlKTsKKworICAgICAgICAgICAgaHpfb3V0MCA9IGh6X291dDQ7CisgICAgICAgICAgICBoel9vdXQxID0gaHpfb3V0NTsKKyAgICAgICAgICAgIGh6X291dDIgPSBoel9vdXQ2OworICAgICAgICAgICAgaHpfb3V0MyA9IGh6X291dDc7CisgICAgICAgICAgICBoel9vdXQ0ID0gaHpfb3V0ODsKKyAgICAgICAgfQorCisgICAgICAgIHNyY190bXAgKz0gODsKKyAgICAgICAgZHN0X3RtcCArPSA4OworICAgIH0KK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzIxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QwID0gMHhmZmZiMDAwMTsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QxID0gMHgxNDAwMTQ7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MiA9IDB4MWZmZmI7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9LCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHYxNmk4IHNyYzExLCBzcmMxMiwgbWFzazAsIG1hc2sxLCBtYXNrMjsKKyAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2OworICAgIHY4aTE2IGh6X291dDcsIGh6X291dDgsIGh6X291dDksIGh6X291dDEwLCBoel9vdXQxMSwgaHpfb3V0MTI7CisgICAgdjhpMTYgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfciwgaHpfb3V0NTRfcjsKKyAgICB2OGkxNiBoel9vdXQ2NV9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4N19yLCBoel9vdXQ4OV9yLCBoel9vdXQ5MTBfcjsKKyAgICB2OGkxNiBoel9vdXQxMTEwX3IsIGh6X291dDEyMTFfciwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiBoel9vdXQxMF9sLCBoel9vdXQyMV9sLCBoel9vdXQzMl9sLCBoel9vdXQ0M19sLCBoel9vdXQ1NF9sOworICAgIHY4aTE2IGh6X291dDY1X2wsIGh6X291dDc2X2wsIGh6X291dDg3X2wsIGh6X291dDg5X2wsIGh6X291dDkxMF9sOworICAgIHY4aTE2IGh6X291dDExMTBfbCwgaHpfb3V0MTIxMV9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY0aTMyIHRtcDBfdywgdG1wMV93OworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBmaWx0MCA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2OGkxNikgX19tc2FfZmlsbF93KGZpbHRfY29uc3QyKTsKKworICAgIHNyYyAtPSAoKDIgKiBzdHJpZGUpICsgMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisKKyAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQzID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDQgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBoel9vdXQ1ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0NyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ4ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgSUxWUl9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLCBoel9vdXQ0LAorICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfcik7CisgICAgSUxWTF9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLCBoel9vdXQ0LAorICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0MTBfbCwgaHpfb3V0MjFfbCwgaHpfb3V0MzJfbCwgaHpfb3V0NDNfbCk7CisgICAgSUxWUl9INF9TSChoel9vdXQ1LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4LAorICAgICAgICAgICAgICAgaHpfb3V0NywgaHpfb3V0NTRfciwgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfcik7CisgICAgSUxWTF9INF9TSChoel9vdXQ1LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4LAorICAgICAgICAgICAgICAgaHpfb3V0NywgaHpfb3V0NTRfbCwgaHpfb3V0NjVfbCwgaHpfb3V0NzZfbCwgaHpfb3V0ODdfbCk7CisKKyAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9yLCBoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDEwX2wsIGh6X291dDMyX2wsIGh6X291dDU0X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKyAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQyMV9yLCBoel9vdXQ0M19yLCBoel9vdXQ2NV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX2wsIGh6X291dDQzX2wsIGh6X291dDY1X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKyAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX2wsIGh6X291dDU0X2wsIGh6X291dDc2X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKyAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19yLCBoel9vdXQ2NV9yLCBoel9vdXQ4N19yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDQzX2wsIGh6X291dDY1X2wsIGh6X291dDg3X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMyA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKworICAgIFNSQVJJX0g0X1NIKGh6X291dDIsIGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIDUpOworICAgIFNBVF9TSDRfU0goaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgNyk7CisKKyAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworCisgICAgdG1wMCA9IF9fbXNhX2F2ZXJfc19oKHRtcDAsIGh6X291dDIpOworICAgIHRtcDEgPSBfX21zYV9hdmVyX3NfaCh0bXAxLCBoel9vdXQzKTsKKyAgICB0bXAyID0gX19tc2FfYXZlcl9zX2godG1wMiwgaHpfb3V0NCk7CisgICAgdG1wMyA9IF9fbXNhX2F2ZXJfc19oKHRtcDMsIGh6X291dDUpOworCisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMiwgdG1wMyk7CisgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgZHN0MCwgZHN0MSk7CisgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgZHN0LCBzdHJpZGUpOworICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworICAgIGh6X291dDkgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjOSwgc3JjOSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MTAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMTAsIHNyYzEwLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxMSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxMSwgc3JjMTEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEyLCBzcmMxMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgSUxWUl9INF9TSChoel9vdXQ5LCBoel9vdXQ4LCBoel9vdXQxMCwgaHpfb3V0OSwgaHpfb3V0MTEsIGh6X291dDEwLAorICAgICAgICAgICAgICAgaHpfb3V0MTIsIGh6X291dDExLCBoel9vdXQ4OV9yLCBoel9vdXQ5MTBfciwgaHpfb3V0MTExMF9yLAorICAgICAgICAgICAgICAgaHpfb3V0MTIxMV9yKTsKKyAgICBJTFZMX0g0X1NIKGh6X291dDksIGh6X291dDgsIGh6X291dDEwLCBoel9vdXQ5LCBoel9vdXQxMSwgaHpfb3V0MTAsCisgICAgICAgICAgICAgICBoel9vdXQxMiwgaHpfb3V0MTEsIGh6X291dDg5X2wsIGh6X291dDkxMF9sLCBoel9vdXQxMTEwX2wsCisgICAgICAgICAgICAgICBoel9vdXQxMjExX2wpOworICAgIHRtcDBfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDU0X3IsIGh6X291dDc2X3IsIGh6X291dDg5X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMV93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NTRfbCwgaHpfb3V0NzZfbCwgaHpfb3V0ODlfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDFfdywgKHY4aTE2KSB0bXAwX3cpOworICAgIHRtcDBfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDY1X3IsIGh6X291dDg3X3IsIGh6X291dDkxMF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDY1X2wsIGh6X291dDg3X2wsIGh6X291dDkxMF9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMV93LCAodjhpMTYpIHRtcDBfdyk7CisgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NzZfciwgaHpfb3V0ODlfciwgaHpfb3V0MTExMF9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDc2X2wsIGh6X291dDg5X2wsIGh6X291dDExMTBfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAyID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDFfdywgKHY4aTE2KSB0bXAwX3cpOworICAgIHRtcDBfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDg3X3IsIGh6X291dDkxMF9yLCBoel9vdXQxMjExX3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMV93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0ODdfbCwgaHpfb3V0OTEwX2wsIGh6X291dDEyMTFfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAzID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDFfdywgKHY4aTE2KSB0bXAwX3cpOworCisgICAgU1JBUklfSDRfU0goaHpfb3V0NiwgaHpfb3V0NywgaHpfb3V0OCwgaHpfb3V0OSwgNSk7CisgICAgU0FUX1NINF9TSChoel9vdXQ2LCBoel9vdXQ3LCBoel9vdXQ4LCBoel9vdXQ5LCA3KTsKKworICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisKKyAgICB0bXAwID0gX19tc2FfYXZlcl9zX2godG1wMCwgaHpfb3V0Nik7CisgICAgdG1wMSA9IF9fbXNhX2F2ZXJfc19oKHRtcDEsIGh6X291dDcpOworICAgIHRtcDIgPSBfX21zYV9hdmVyX3NfaCh0bXAyLCBoel9vdXQ4KTsKKyAgICB0bXAzID0gX19tc2FfYXZlcl9zX2godG1wMywgaHpfb3V0OSk7CisKKyAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQih0bXAwLCB0bXAxKTsKKyAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQih0bXAyLCB0bXAzKTsKKyAgICBBVkVSX1VCMl9VQihvdXQwLCBkc3QwLCBvdXQxLCBkc3QxLCBkc3QwLCBkc3QxKTsKKyAgICBTVDh4NF9VQihkc3QwLCBkc3QxLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMyM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MCA9IDB4ZmZmYjAwMDE7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MSA9IDB4MTQwMDE0OworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDIgPSAweDFmZmZiOworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCBkc3QwID0geyAwIH0sIGRzdDEgPSB7IDAgfSwgb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCBzcmMxMSwgc3JjMTIsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCBoel9vdXQ5LCBoel9vdXQxMCwgaHpfb3V0MTEsIGh6X291dDEyOworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfciwgaHpfb3V0ODlfciwgaHpfb3V0OTEwX3I7CisgICAgdjhpMTYgaHpfb3V0MTExMF9yLCBoel9vdXQxMjExX3IsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdjhpMTYgaHpfb3V0MTBfbCwgaHpfb3V0MjFfbCwgaHpfb3V0MzJfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NTRfbDsKKyAgICB2OGkxNiBoel9vdXQ2NV9sLCBoel9vdXQ3Nl9sLCBoel9vdXQ4N19sLCBoel9vdXQ4OV9sLCBoel9vdXQ5MTBfbDsKKyAgICB2OGkxNiBoel9vdXQxMTEwX2wsIGh6X291dDEyMTFfbCwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2NGkzMiB0bXAwX3csIHRtcDFfdzsKKworICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworCisgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworCisgICAgaHpfb3V0NSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ2ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0OCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIElMVlJfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IpOworICAgIElMVkxfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX2wsIGh6X291dDIxX2wsIGh6X291dDMyX2wsIGh6X291dDQzX2wpOworICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X3IsIGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IpOworICAgIElMVkxfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2wsIGh6X291dDg3X2wpOworCisgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MTBfciwgaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDAgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMV93LCAodjhpMTYpIHRtcDBfdyk7CisgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfciwgaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQyMV9sLCBoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMV93LCAodjhpMTYpIHRtcDBfdyk7CisgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgaHpfb3V0NzZfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBoel9vdXQ3Nl9sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDIgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMV93LCAodjhpMTYpIHRtcDBfdyk7CisgICAgdG1wMF93ID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDMgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMV93LCAodjhpMTYpIHRtcDBfdyk7CisKKyAgICBTUkFSSV9INF9TSChoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2LCA1KTsKKyAgICBTQVRfU0g0X1NIKGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIGh6X291dDYsIDcpOworCisgICAgTEQ0KGRzdCwgc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKworICAgIHRtcDAgPSBfX21zYV9hdmVyX3NfaCh0bXAwLCBoel9vdXQzKTsKKyAgICB0bXAxID0gX19tc2FfYXZlcl9zX2godG1wMSwgaHpfb3V0NCk7CisgICAgdG1wMiA9IF9fbXNhX2F2ZXJfc19oKHRtcDIsIGh6X291dDUpOworICAgIHRtcDMgPSBfX21zYV9hdmVyX3NfaCh0bXAzLCBoel9vdXQ2KTsKKworICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDAsIHRtcDEpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDIsIHRtcDMpOworICAgIEFWRVJfVUIyX1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIGRzdDAsIGRzdDEpOworICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgc3RyaWRlKTsKKyAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOworCisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyKTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyKTsKKyAgICBoel9vdXQ5ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzksIHNyYzksIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEwLCBzcmMxMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MTEgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMTEsIHNyYzExLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxMiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxMiwgc3JjMTIsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIElMVlJfSDRfU0goaHpfb3V0OSwgaHpfb3V0OCwgaHpfb3V0MTAsIGh6X291dDksIGh6X291dDExLCBoel9vdXQxMCwKKyAgICAgICAgICAgICAgIGh6X291dDEyLCBoel9vdXQxMSwgaHpfb3V0ODlfciwgaHpfb3V0OTEwX3IsIGh6X291dDExMTBfciwKKyAgICAgICAgICAgICAgIGh6X291dDEyMTFfcik7CisgICAgSUxWTF9INF9TSChoel9vdXQ5LCBoel9vdXQ4LCBoel9vdXQxMCwgaHpfb3V0OSwgaHpfb3V0MTEsIGh6X291dDEwLAorICAgICAgICAgICAgICAgaHpfb3V0MTIsIGh6X291dDExLCBoel9vdXQ4OV9sLCBoel9vdXQ5MTBfbCwgaHpfb3V0MTExMF9sLAorICAgICAgICAgICAgICAgaHpfb3V0MTIxMV9sKTsKKyAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBoel9vdXQ4OV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDU0X2wsIGh6X291dDc2X2wsIGh6X291dDg5X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKyAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ2NV9yLCBoel9vdXQ4N19yLCBoel9vdXQ5MTBfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBoel9vdXQ5MTBfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDFfdywgKHY4aTE2KSB0bXAwX3cpOworICAgIHRtcDBfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDc2X3IsIGh6X291dDg5X3IsIGh6X291dDExMTBfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICB0bXAxX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ3Nl9sLCBoel9vdXQ4OV9sLCBoel9vdXQxMTEwX2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKyAgICB0bXAwX3cgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ4N19yLCBoel9vdXQ5MTBfciwgaHpfb3V0MTIxMV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDFfdyA9IEFWQ19ET1RfU1czX1NXKGh6X291dDg3X2wsIGh6X291dDkxMF9sLCBoel9vdXQxMjExX2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMyA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxX3csICh2OGkxNikgdG1wMF93KTsKKworICAgIFNSQVJJX0g0X1NIKGh6X291dDcsIGh6X291dDgsIGh6X291dDksIGh6X291dDEwLCA1KTsKKyAgICBTQVRfU0g0X1NIKGh6X291dDcsIGh6X291dDgsIGh6X291dDksIGh6X291dDEwLCA3KTsKKworICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisKKyAgICB0bXAwID0gX19tc2FfYXZlcl9zX2godG1wMCwgaHpfb3V0Nyk7CisgICAgdG1wMSA9IF9fbXNhX2F2ZXJfc19oKHRtcDEsIGh6X291dDgpOworICAgIHRtcDIgPSBfX21zYV9hdmVyX3NfaCh0bXAyLCBoel9vdXQ5KTsKKyAgICB0bXAzID0gX19tc2FfYXZlcl9zX2godG1wMywgaHpfb3V0MTApOworCisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMiwgdG1wMyk7CisgICAgQVZFUl9VQjJfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgZHN0MCwgZHN0MSk7CisgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMjFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QwID0gMHhmZmZiMDAwMTsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QxID0gMHgxNDAwMTQ7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MiA9IDB4MWZmZmI7CisgICAgdjE2dTggcmVzLCBvdXQgPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCBkc3QwLCBkc3QxLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfcjsKKyAgICB2NGkzMiB0bXAwLCB0bXAxOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNiwgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0OCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBQQ0tPRF9EMl9TSChoel9vdXQwLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzKTsKKyAgICBQQ0tPRF9EMl9TSChoel9vdXQ0LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3KTsKKworICAgIElMVlJfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IpOworICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X3IsIGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IpOworCisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDEwX3IsIGh6X291dDMyX3IsIGh6X291dDU0X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQyMV9yLCBoel9vdXQ0M19yLCBoel9vdXQ2NV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX3IsIGh6X291dDU0X3IsIGh6X291dDc2X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19yLCBoel9vdXQ2NV9yLCBoel9vdXQ4N19yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisKKyAgICBTUkFSSV9IMl9TSChoel9vdXQyLCBoel9vdXQ0LCA1KTsKKyAgICBTQVRfU0gyX1NIKGh6X291dDIsIGh6X291dDQsIDcpOworCisgICAgZHN0MCA9IF9fbXNhX2F2ZXJfc19oKGRzdDAsIGh6X291dDIpOworICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QxLCBoel9vdXQ0KTsKKyAgICBMVzQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgb3V0KTsKKyAgICByZXMgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDEpOworICAgIHJlcyA9IF9fbXNhX2F2ZXJfdV9iKHJlcywgb3V0KTsKKyAgICBTVDR4NF9VQihyZXMsIHJlcywgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMjNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDAgPSAweGZmZmIwMDAxOworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDEgPSAweDE0MDAxNDsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QyID0gMHgxZmZmYjsKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgdjE2dTggcmVzLCBvdXQgPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCBkc3QwLCBkc3QxLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfcjsKKyAgICB2NGkzMiB0bXAwLCB0bXAxOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNiwgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0OCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBQQ0tPRF9EMl9TSChoel9vdXQwLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzKTsKKyAgICBQQ0tPRF9EMl9TSChoel9vdXQ0LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3KTsKKworICAgIElMVlJfSDRfU0goaHpfb3V0MSwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0MywgaHpfb3V0MiwgaHpfb3V0NCwKKyAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IpOworICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwgaHpfb3V0OCwKKyAgICAgICAgICAgICAgIGh6X291dDcsIGh6X291dDU0X3IsIGh6X291dDY1X3IsIGh6X291dDc2X3IsIGh6X291dDg3X3IpOworCisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDEwX3IsIGh6X291dDMyX3IsIGh6X291dDU0X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQyMV9yLCBoel9vdXQ0M19yLCBoel9vdXQ2NV9yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX3IsIGh6X291dDU0X3IsIGh6X291dDc2X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19yLCBoel9vdXQ2NV9yLCBoel9vdXQ4N19yLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyKTsKKyAgICBkc3QxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisKKyAgICBQQ0tFVl9EMl9TSChoel9vdXQ0LCBoel9vdXQzLCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQwLCBoel9vdXQxKTsKKyAgICBTUkFSSV9IMl9TSChoel9vdXQwLCBoel9vdXQxLCA1KTsKKyAgICBTQVRfU0gyX1NIKGh6X291dDAsIGh6X291dDEsIDcpOworCisgICAgZHN0MCA9IF9fbXNhX2F2ZXJfc19oKGRzdDAsIGh6X291dDApOworICAgIGRzdDEgPSBfX21zYV9hdmVyX3NfaChkc3QxLCBoel9vdXQxKTsKKyAgICBMVzQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgb3V0KTsKKyAgICByZXMgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDEpOworICAgIHJlcyA9IF9fbXNhX2F2ZXJfdV9iKHJlcywgb3V0KTsKKyAgICBTVDR4NF9VQihyZXMsIHJlcywgMCwgMSwgMiwgMywgZHN0LCBzdHJpZGUpOworfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50MzJfdCBsb29wX2NudDsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNnU4IHJlczAsIHJlczEsIHJlczIsIHJlczMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yOworICAgIHYxNmk4IHNyYzg3X3IsIHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIHNyYzIxX2wsIHNyYzQzX2w7CisgICAgdjE2aTggc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbDsKKworICAgIGZpbHQwID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHYxNmk4KSBfX21zYV9maWxsX2goZmlsdF9jb25zdDIpOworICAgIHNyYyAtPSAoc3RyaWRlICogMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBJTFZSX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzEwX3IsIHNyYzIxX3IsCisgICAgICAgICAgICAgICBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICBJTFZMX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzEwX2wsIHNyYzIxX2wsCisgICAgICAgICAgICAgICBzcmMzMl9sLCBzcmM0M19sKTsKKworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjLCBzdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgICAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOworCisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgICAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X3IsCisgICAgICAgICAgICAgICAgICAgc3JjNjVfciwgc3JjNzZfciwgc3JjODdfcik7CisgICAgICAgIElMVkxfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfbCwKKyAgICAgICAgICAgICAgICAgICBzcmM2NV9sLCBzcmM3Nl9sLCBzcmM4N19sKTsKKyAgICAgICAgb3V0MF9yID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDFfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQyX3IgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0M19yID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDBfbCA9IEFWQ19ET1RfU0gzX1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBvdXQxX2wgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgb3V0Ml9sID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgICAgIG91dDNfbCA9IEFWQ19ET1RfU0gzX1NIKHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOworICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCwgNSk7CisgICAgICAgIFNBVF9TSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA3KTsKKyAgICAgICAgTERfVUI0KGRzdCwgc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgUENLRVZfQjRfVUIob3V0MF9sLCBvdXQwX3IsIG91dDFfbCwgb3V0MV9yLCBvdXQyX2wsIG91dDJfciwgb3V0M19sLAorICAgICAgICAgICAgICAgICAgICBvdXQzX3IsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBYT1JJX0I0XzEyOF9VQihyZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgQVZFUl9VQjJfVUIocmVzMCwgZHN0MCwgcmVzMSwgZHN0MSwgcmVzMCwgcmVzMSk7CisgICAgICAgIEFWRVJfVUIyX1VCKHJlczIsIGRzdDIsIHJlczMsIGRzdDMsIHJlczIsIHJlczMpOworICAgICAgICBTVF9VQjQocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOworCisgICAgICAgIHNyYzEwX3IgPSBzcmM1NF9yOworICAgICAgICBzcmMzMl9yID0gc3JjNzZfcjsKKyAgICAgICAgc3JjMjFfciA9IHNyYzY1X3I7CisgICAgICAgIHNyYzQzX3IgPSBzcmM4N19yOworICAgICAgICBzcmMxMF9sID0gc3JjNTRfbDsKKyAgICAgICAgc3JjMzJfbCA9IHNyYzc2X2w7CisgICAgICAgIHNyYzIxX2wgPSBzcmM2NV9sOworICAgICAgICBzcmM0M19sID0gc3JjODdfbDsKKyAgICAgICAgc3JjNCA9IHNyYzg7CisgICAgfQorfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDJfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QwID0gMHhmYjAxOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDEgPSAweDE0MTQ7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MiA9IDB4MWZiOworICAgIHYxNnU4IGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9LCBkc3QyID0geyAwIH0sIGRzdDMgPSB7IDAgfTsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMDlfcjsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yOworICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQ0X3IsIG91dDVfciwgb3V0Nl9yLCBvdXQ3X3I7CisKKyAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKKworICAgIHNyYyAtPSAoc3RyaWRlICogMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBJTFZSX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzEwX3IsIHNyYzIxX3IsCisgICAgICAgICAgICAgICBzcmMzMl9yLCBzcmM0M19yKTsKKworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgIElMVlJfQjRfU0Ioc3JjNywgc3JjNCwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzc2X3IsCisgICAgICAgICAgICAgICBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfcik7CisgICAgb3V0MF9yID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0MV9yID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0Ml9yID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfciwgc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0M19yID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfciwgc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworCisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBJTFZSX0I0X1NCKHNyYzAsIHNyYzEwLCBzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmMxMF9yLAorICAgICAgICAgICAgICAgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfcik7CisgICAgb3V0NF9yID0gQVZDX0RPVF9TSDNfU0goc3JjNzZfciwgc3JjOThfciwgc3JjMTBfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0NV9yID0gQVZDX0RPVF9TSDNfU0goc3JjODdfciwgc3JjMTA5X3IsIHNyYzIxX3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDZfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzk4X3IsIHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIG91dDdfciA9IEFWQ19ET1RfU0gzX1NIKHNyYzEwOV9yLCBzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKworICAgIExENChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgTEQ0KGRzdCArIDQgKiBzdHJpZGUsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDIpOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0Myk7CisKKyAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDUpOworICAgIFNSQVJJX0g0X1NIKG91dDRfciwgb3V0NV9yLCBvdXQ2X3IsIG91dDdfciwgNSk7CisgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOworICAgIFNBVF9TSDRfU0gob3V0NF9yLCBvdXQ1X3IsIG91dDZfciwgb3V0N19yLCA3KTsKKyAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihvdXQwX3IsIG91dDFfcik7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Ml9yLCBvdXQzX3IpOworICAgIG91dDIgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDRfciwgb3V0NV9yKTsKKyAgICBvdXQzID0gUENLRVZfWE9SSTEyOF9VQihvdXQ2X3IsIG91dDdfcik7CisgICAgQVZFUl9VQjRfVUIob3V0MCwgZHN0MCwgb3V0MSwgZHN0MSwgb3V0MiwgZHN0Miwgb3V0MywgZHN0MywgZHN0MCwgZHN0MSwKKyAgICAgICAgICAgICAgICBkc3QyLCBkc3QzKTsKKyAgICBTVDh4OF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIHN0cmlkZSk7Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMwMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgdjE2dTggcmVzLCBkc3QwID0geyAwIH07CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yOworICAgIHYxNmk4IHNyYzg3X3IsIHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjhpMTYgb3V0MTAsIG91dDMyOworCisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKHN0cmlkZSAqIDIpOworICAgIExEX1NCNShzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfRDJfU0Ioc3JjMjFfciwgc3JjMTBfciwgc3JjNDNfciwgc3JjMzJfciwgc3JjMjExMCwgc3JjNDMzMik7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMjExMCwgc3JjNDMzMik7CisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X3IsIHNyYzY1X3IsCisgICAgICAgICAgICAgICBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICBJTFZSX0QyX1NCKHNyYzY1X3IsIHNyYzU0X3IsIHNyYzg3X3IsIHNyYzc2X3IsIHNyYzY1NTQsIHNyYzg3NzYpOworICAgIFhPUklfQjJfMTI4X1NCKHNyYzY1NTQsIHNyYzg3NzYpOworICAgIG91dDEwID0gQVZDX0RPVF9TSDNfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgb3V0MzIgPSBBVkNfRE9UX1NIM19TSChzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBTUkFSSV9IMl9TSChvdXQxMCwgb3V0MzIsIDUpOworICAgIFNBVF9TSDJfU0gob3V0MTAsIG91dDMyLCA3KTsKKyAgICBMVzQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MCk7CisgICAgcmVzID0gUENLRVZfWE9SSTEyOF9VQihvdXQxMCwgb3V0MzIpOworICAgIGRzdDAgPSBfX21zYV9hdmVyX3VfYihyZXMsIGRzdDApOworICAgIFNUNHg0X1VCKGRzdDAsIGRzdDAsIDAsIDEsIDIsIDMsIGRzdCwgc3RyaWRlKTsKK30KKwordm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIHVpbnQzMl90IHJvdzsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIHJlczsKLSAgICB2OGkxNiB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMyLCB2dF9yZXMzOwotICAgIHY0aTMyIGh6X3JlczAsIGh6X3JlczE7Ci0gICAgdjhpMTYgcmVzMCwgcmVzMTsKLSAgICB2OGkxNiBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1OworICAgIHYxNnU4IG91dCwgZHN0MDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCBzcmMxMTsKKyAgICB2OGkxNiB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMyLCB2dF9yZXMzLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBtYXNrMzsKKyAgICB2OGkxNiBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1LCBzaGZfdmVjNjsKKyAgICB2OGkxNiBzaGZfdmVjNywgc2hmX3ZlYzgsIHNoZl92ZWM5LCBzaGZfdmVjMTAsIHNoZl92ZWMxMSwgbWFzazQsIG1hc2s1OworICAgIHY0aTMyIGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczM7CiAgICAgdjhpMTYgbWFzazAgPSB7IDAsIDUsIDEsIDYsIDIsIDcsIDMsIDggfTsKICAgICB2OGkxNiBtYXNrMSA9IHsgMSwgNCwgMiwgNSwgMywgNiwgNCwgNyB9OwogICAgIHY4aTE2IG1hc2syID0geyAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2IH07CiAgICAgdjhpMTYgbWludXM1aCA9IF9fbXNhX2xkaV9oKC01KTsKICAgICB2OGkxNiBwbHVzMjBoID0gX19tc2FfbGRpX2goMjApOwotICAgIHY4aTE2IHplcm9zID0geyAwIH07CiAKLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKKyAgICBtYXNrMyA9IG1hc2swICsgNDsKKyAgICBtYXNrNCA9IG1hc2sxICsgNDsKKyAgICBtYXNrNSA9IG1hc2syICsgNDsKIAorICAgIHNyYyAtPSAoKDIgKiBzdHJpZGUpICsgMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIExEX1NCNShzcmMgKyA4LCBzdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSk7CisgICAgc3JjICs9ICg1ICogc3RyaWRlKTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEpOworCisgICAgZm9yIChyb3cgPSAxNjsgcm93LS07KSB7CisgICAgICAgIExEX1NCMihzcmMsIDgsIHNyYzUsIHNyYzYpOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM1LCBzcmM2KTsKKyAgICAgICAgZHN0MCA9IExEX1VCKGRzdCk7CisKKyAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0X3JlczAsIHZ0X3JlczEpOworICAgICAgICBBVkNfQ0FMQ19EUEFERF9CXzZQSVhfMkNPRUZGX1NIKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dF9yZXMyLCB2dF9yZXMzKTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCBtYXNrMCwKKyAgICAgICAgICAgICAgICAgICBtYXNrMSwgbWFzazIsIHNoZl92ZWMwLCBzaGZfdmVjMSwgc2hmX3ZlYzIpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIG1hc2swLAorICAgICAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNSk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgbWFzazMsCisgICAgICAgICAgICAgICAgICAgbWFzazQsIG1hc2s1LCBzaGZfdmVjNiwgc2hmX3ZlYzcsIHNoZl92ZWM4KTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICBtYXNrNCwgbWFzazUsIHNoZl92ZWM5LCBzaGZfdmVjMTAsIHNoZl92ZWMxMSk7CisgICAgICAgIGh6X3JlczAgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjMCwgc2hmX3ZlYzApOworICAgICAgICBoel9yZXMxID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzMsIHNoZl92ZWMzKTsKKyAgICAgICAgaHpfcmVzMiA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWM2LCBzaGZfdmVjNik7CisgICAgICAgIGh6X3JlczMgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjOSwgc2hmX3ZlYzkpOworICAgICAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzEsIHNoZl92ZWMyLCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMwLCBoel9yZXMwKTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWM0LCBzaGZfdmVjNSwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMSwgaHpfcmVzMSk7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjNywgc2hmX3ZlYzgsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczIsIGh6X3JlczIpOworICAgICAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzEwLCBzaGZfdmVjMTEsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczMsIGh6X3JlczMpOworICAgICAgICBTUkFSSV9XNF9TVyhoel9yZXMwLCBoel9yZXMxLCBoel9yZXMyLCBoel9yZXMzLCAxMCk7CisgICAgICAgIFNBVF9TVzRfU1coaHpfcmVzMCwgaHpfcmVzMSwgaHpfcmVzMiwgaHpfcmVzMywgNyk7CisgICAgICAgIHRtcDAgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWMyLCA1KTsKKyAgICAgICAgdG1wMSA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzUsIDUpOworICAgICAgICB0bXAyID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjOCwgNSk7CisgICAgICAgIHRtcDMgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWMxMSwgNSk7CisgICAgICAgIFNBVF9TSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CisgICAgICAgIFBDS0VWX0gyX1NIKHRtcDIsIHRtcDAsIHRtcDMsIHRtcDEsIHRtcDAsIHRtcDEpOworICAgICAgICBQQ0tFVl9IMl9TSChoel9yZXMyLCBoel9yZXMwLCBoel9yZXMzLCBoel9yZXMxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgdG1wMCA9IF9fbXNhX2F2ZXJfc19oKHRtcDIsIHRtcDApOworICAgICAgICB0bXAxID0gX19tc2FfYXZlcl9zX2godG1wMywgdG1wMSk7CisgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgICAgIG91dCA9IF9fbXNhX2F2ZXJfdV9iKG91dCwgZHN0MCk7CisgICAgICAgIFNUX1VCKG91dCwgZHN0KTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKworICAgICAgICBzcmMwID0gc3JjMTsKKyAgICAgICAgc3JjMSA9IHNyYzI7CisgICAgICAgIHNyYzIgPSBzcmMzOworICAgICAgICBzcmMzID0gc3JjNDsKKyAgICAgICAgc3JjNCA9IHNyYzU7CisgICAgICAgIHNyYzcgPSBzcmM4OworICAgICAgICBzcmM4ID0gc3JjOTsKKyAgICAgICAgc3JjOSA9IHNyYzEwOworICAgICAgICBzcmMxMCA9IHNyYzExOworICAgICAgICBzcmMxMSA9IHNyYzY7CisgICAgfQorfQorCit2b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDMyX3Qgcm93OworICAgIHYxNnU4IG91dCwgZHN0MDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCBzcmMxMTsKKyAgICB2OGkxNiB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMyLCB2dF9yZXMzLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBtYXNrMzsKKyAgICB2OGkxNiBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1LCBzaGZfdmVjNjsKKyAgICB2OGkxNiBzaGZfdmVjNywgc2hmX3ZlYzgsIHNoZl92ZWM5LCBzaGZfdmVjMTAsIHNoZl92ZWMxMSwgbWFzazQsIG1hc2s1OworICAgIHY0aTMyIGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczM7CisgICAgdjhpMTYgbWFzazAgPSB7IDAsIDUsIDEsIDYsIDIsIDcsIDMsIDggfTsKKyAgICB2OGkxNiBtYXNrMSA9IHsgMSwgNCwgMiwgNSwgMywgNiwgNCwgNyB9OworICAgIHY4aTE2IG1hc2syID0geyAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2IH07CisgICAgdjhpMTYgbWludXM1aCA9IF9fbXNhX2xkaV9oKC01KTsKKyAgICB2OGkxNiBwbHVzMjBoID0gX19tc2FfbGRpX2goMjApOworCisgICAgbWFzazMgPSBtYXNrMCArIDQ7CisgICAgbWFzazQgPSBtYXNrMSArIDQ7CisgICAgbWFzazUgPSBtYXNrMiArIDQ7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBMRF9TQjUoc3JjICsgOCwgc3RyaWRlLCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExKTsKKworICAgIGZvciAocm93ID0gMTY7IHJvdy0tOykgeworICAgICAgICBMRF9TQjIoc3JjLCA4LCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7CisgICAgICAgIGRzdDAgPSBMRF9VQihkc3QpOworCisgICAgICAgIEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfU0goc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dF9yZXMwLCB2dF9yZXMxKTsKKyAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRfcmVzMiwgdnRfcmVzMyk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgbWFzazAsCisgICAgICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgICAgICBtYXNrMSwgbWFzazIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIG1hc2s0LCBtYXNrNSwgc2hmX3ZlYzYsIHNoZl92ZWM3LCBzaGZfdmVjOCk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgbWFzazMsCisgICAgICAgICAgICAgICAgICAgbWFzazQsIG1hc2s1LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTEpOworICAgICAgICBoel9yZXMwID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICAgICAgaHpfcmVzMSA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgICAgIGh6X3JlczIgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjNiwgc2hmX3ZlYzYpOworICAgICAgICBoel9yZXMzID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzksIHNoZl92ZWM5KTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjNCwgc2hmX3ZlYzUsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczEsIGh6X3JlczEpOworICAgICAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzcsIHNoZl92ZWM4LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMyLCBoel9yZXMyKTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxMCwgc2hmX3ZlYzExLCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMzLCBoel9yZXMzKTsKKyAgICAgICAgU1JBUklfVzRfU1coaHpfcmVzMCwgaHpfcmVzMSwgaHpfcmVzMiwgaHpfcmVzMywgMTApOworICAgICAgICBTQVRfU1c0X1NXKGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczMsIDcpOworICAgICAgICB0bXAwID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMiwgNSk7CisgICAgICAgIHRtcDEgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM1LCA1KTsKKyAgICAgICAgdG1wMiA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzgsIDUpOworICAgICAgICB0bXAzID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMTEsIDUpOworICAgICAgICBTQVRfU0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOworICAgICAgICB0bXAwID0gX19tc2FfcGNrb2RfaCh0bXAyLCB0bXAwKTsKKyAgICAgICAgdG1wMSA9IF9fbXNhX3Bja29kX2godG1wMywgdG1wMSk7CisgICAgICAgIFBDS0VWX0gyX1NIKGh6X3JlczIsIGh6X3JlczAsIGh6X3JlczMsIGh6X3JlczEsIHRtcDIsIHRtcDMpOworICAgICAgICB0bXAwID0gX19tc2FfYXZlcl9zX2godG1wMiwgdG1wMCk7CisgICAgICAgIHRtcDEgPSBfX21zYV9hdmVyX3NfaCh0bXAzLCB0bXAxKTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQih0bXAwLCB0bXAxKTsKKyAgICAgICAgb3V0ID0gX19tc2FfYXZlcl91X2Iob3V0LCBkc3QwKTsKKyAgICAgICAgU1RfVUIob3V0LCBkc3QpOworICAgICAgICBkc3QgKz0gc3RyaWRlOworCisgICAgICAgIHNyYzAgPSBzcmMxOworICAgICAgICBzcmMxID0gc3JjMjsKKyAgICAgICAgc3JjMiA9IHNyYzM7CisgICAgICAgIHNyYzMgPSBzcmM0OworICAgICAgICBzcmM0ID0gc3JjNTsKKyAgICAgICAgc3JjNyA9IHNyYzg7CisgICAgICAgIHNyYzggPSBzcmM5OworICAgICAgICBzcmM5ID0gc3JjMTA7CisgICAgICAgIHNyYzEwID0gc3JjMTE7CisgICAgICAgIHNyYzExID0gc3JjNjsKKyAgICB9Cit9CisKK3ZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMxMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgdWludDMyX3Qgcm93OworICAgIHVpbnQ2NF90IHRwMCwgdHAxOworICAgIHYxNnU4IG91dCwgZHN0MCA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzY7CisgICAgdjhpMTYgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMiwgdnRfcmVzMywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1LCBzaGZfdmVjNjsKKyAgICB2OGkxNiBzaGZfdmVjNywgc2hmX3ZlYzgsIHNoZl92ZWM5LCBzaGZfdmVjMTAsIHNoZl92ZWMxMTsKKyAgICB2OGkxNiBtYXNrMywgbWFzazQsIG1hc2s1OworICAgIHY0aTMyIGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczM7CisgICAgdjhpMTYgbWFzazAgPSB7IDAsIDUsIDEsIDYsIDIsIDcsIDMsIDggfTsKKyAgICB2OGkxNiBtYXNrMSA9IHsgMSwgNCwgMiwgNSwgMywgNiwgNCwgNyB9OworICAgIHY4aTE2IG1hc2syID0geyAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2IH07CisgICAgdjhpMTYgbWludXM1aCA9IF9fbXNhX2xkaV9oKC01KTsKKyAgICB2OGkxNiBwbHVzMjBoID0gX19tc2FfbGRpX2goMjApOworCisgICAgbWFzazMgPSBtYXNrMCArIDQ7CisgICAgbWFzazQgPSBtYXNrMSArIDQ7CisgICAgbWFzazUgPSBtYXNrMiArIDQ7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOwogICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwogCi0gICAgZm9yIChyb3cgPSAoaGVpZ2h0ID4+IDEpOyByb3ctLTspIHsKLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjNSwgc3JjNik7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotCisgICAgZm9yIChyb3cgPSA0OyByb3ctLTspIHsKKyAgICAgICAgTERfU0IyKHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjICs9ICgyICogc3RyaWRlKTsKICAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7Ci0gICAgICAgIExEX1VCMihkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEpOwotCi0gICAgICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2lsdnJfdygodjRpMzIpIGRzdDEsICh2NGkzMikgZHN0MCk7CiAKICAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0X3JlczAsIHZ0X3JlczEpOwogICAgICAgICBBVkNfQ0FMQ19EUEFERF9CXzZQSVhfMkNPRUZGX1NIKHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRfcmVzMiwgdnRfcmVzMyk7Ci0gICAgICAgIFZTSEZfSDNfU0godnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwKLSAgICAgICAgICAgICAgICAgICBtYXNrMCwgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKLSAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLAotICAgICAgICAgICAgICAgICAgIG1hc2swLCBtYXNrMSwgbWFzazIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUpOwotCisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgbWFzazAsCisgICAgICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgICAgICBtYXNrMSwgbWFzazIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIG1hc2s0LCBtYXNrNSwgc2hmX3ZlYzYsIHNoZl92ZWM3LCBzaGZfdmVjOCk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgbWFzazMsCisgICAgICAgICAgICAgICAgICAgbWFzazQsIG1hc2s1LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTEpOwogICAgICAgICBoel9yZXMwID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKLSAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7Ci0KICAgICAgICAgaHpfcmVzMSA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgICAgIGh6X3JlczIgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjNiwgc2hmX3ZlYzYpOworICAgICAgICBoel9yZXMzID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzksIHNoZl92ZWM5KTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7CiAgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjNCwgc2hmX3ZlYzUsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczEsIGh6X3JlczEpOwotCi0gICAgICAgIFNSQVJJX1cyX1NXKGh6X3JlczAsIGh6X3JlczEsIDEwKTsKLSAgICAgICAgU0FUX1NXMl9TVyhoel9yZXMwLCBoel9yZXMxLCA3KTsKLQotICAgICAgICByZXMwID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMiwgNSk7Ci0gICAgICAgIHJlczEgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM1LCA1KTsKLQotICAgICAgICBTQVRfU0gyX1NIKHJlczAsIHJlczEsIDcpOwotCi0gICAgICAgIGlmIChob3Jpel9vZmZzZXQpIHsKLSAgICAgICAgICAgIHJlczAgPSBfX21zYV9pbHZvZF9oKHplcm9zLCByZXMwKTsKLSAgICAgICAgICAgIHJlczEgPSBfX21zYV9pbHZvZF9oKHplcm9zLCByZXMxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIElMVkVWX0gyX1NIKHJlczAsIHplcm9zLCByZXMxLCB6ZXJvcywgcmVzMCwgcmVzMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaHpfcmVzMCA9IF9fbXNhX2F2ZXJfc193KGh6X3JlczAsICh2NGkzMikgcmVzMCk7Ci0gICAgICAgIGh6X3JlczEgPSBfX21zYV9hdmVyX3Nfdyhoel9yZXMxLCAodjRpMzIpIHJlczEpOwotICAgICAgICByZXMwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIGh6X3JlczEsICh2OGkxNikgaHpfcmVzMCk7Ci0KLSAgICAgICAgcmVzID0gUENLRVZfWE9SSTEyOF9VQihyZXMwLCByZXMwKTsKLQotICAgICAgICBkc3QwID0gX19tc2FfYXZlcl91X2IocmVzLCBkc3QwKTsKLQotICAgICAgICBTVDR4Ml9VQihkc3QwLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWM3LCBzaGZfdmVjOCwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMiwgaHpfcmVzMik7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjMTAsIHNoZl92ZWMxMSwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMywgaHpfcmVzMyk7CisgICAgICAgIFNSQVJJX1c0X1NXKGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczMsIDEwKTsKKyAgICAgICAgU0FUX1NXNF9TVyhoel9yZXMwLCBoel9yZXMxLCBoel9yZXMyLCBoel9yZXMzLCA3KTsKKyAgICAgICAgdG1wMCA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzIsIDUpOworICAgICAgICB0bXAxID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjNSwgNSk7CisgICAgICAgIHRtcDIgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM4LCA1KTsKKyAgICAgICAgdG1wMyA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzExLCA1KTsKKyAgICAgICAgTEQyKGRzdCwgc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgICAgIFNBVF9TSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CisgICAgICAgIFBDS0VWX0gyX1NIKHRtcDIsIHRtcDAsIHRtcDMsIHRtcDEsIHRtcDAsIHRtcDEpOworICAgICAgICBQQ0tFVl9IMl9TSChoel9yZXMyLCBoel9yZXMwLCBoel9yZXMzLCBoel9yZXMxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgdG1wMCA9IF9fbXNhX2F2ZXJfc19oKHRtcDIsIHRtcDApOworICAgICAgICB0bXAxID0gX19tc2FfYXZlcl9zX2godG1wMywgdG1wMSk7CisgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgICAgIG91dCA9IF9fbXNhX2F2ZXJfdV9iKG91dCwgZHN0MCk7CisgICAgICAgIFNUOHgyX1VCKG91dCwgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDIgKiBzdHJpZGUpOwogCiAgICAgICAgIHNyYzAgPSBzcmMyOwogICAgICAgICBzcmMxID0gc3JjMzsKQEAgLTIzMzUsMTI2NiArNTIyOCw1NjIgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGF2Y19sdW1hX21pZGhfcXJ0X2FuZF9hdmVyX2RzdF84d19tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBob3Jpel9vZmZzZXQpCi17Ci0gICAgdWludDMyX3QgbXVsdGlwbGU4X2NudDsKLQotICAgIGZvciAobXVsdGlwbGU4X2NudCA9IDI7IG11bHRpcGxlOF9jbnQtLTspIHsKLSAgICAgICAgYXZjX2x1bWFfbWlkaF9xcnRfYW5kX2F2ZXJfZHN0XzR3X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIGhvcml6X29mZnNldCk7Ci0KLSAgICAgICAgc3JjICs9IDQ7Ci0gICAgICAgIGRzdCArPSA0OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfbWlkaF9xcnRfYW5kX2F2ZXJfZHN0XzE2d19tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhvcml6X29mZnNldCkKLXsKLSAgICB1aW50MzJfdCBtdWx0aXBsZThfY250OwotCi0gICAgZm9yIChtdWx0aXBsZThfY250ID0gNDsgbXVsdGlwbGU4X2NudC0tOykgewotICAgICAgICBhdmNfbHVtYV9taWRoX3FydF9hbmRfYXZlcl9kc3RfNHdfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgaG9yaXpfb2Zmc2V0KTsKLQotICAgICAgICBzcmMgKz0gNDsKLSAgICAgICAgZHN0ICs9IDQ7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWR2X3FydF9hbmRfYXZlcl9kc3RfNHdfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmVyX29mZnNldCkKLXsKLSAgICBpbnQzMl90IGxvb3BfY250OwotICAgIGludDMyX3Qgb3V0MCwgb3V0MTsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwotICAgIHYxNnU4IGRzdDAsIGRzdDE7Ci0gICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMjsKLSAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzOwotICAgIHY4aTE2IGh6X291dDQsIGh6X291dDUsIGh6X291dDY7Ci0gICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLSAgICB2MTZ1OCB2ZWMwLCB2ZWMxOwotCi0gICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwotICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwotCi0gICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7Ci0KLSAgICBoel9vdXQwID0gQVZDX1hPUl9WU0hGX0JfQU5EX0FQUExZXzZUQVBfSE9SSVpfRklMVF9TSChzcmMwLCBzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDIgPSBBVkNfWE9SX1ZTSEZfQl9BTkRfQVBQTFlfNlRBUF9IT1JJWl9GSUxUX1NIKHNyYzIsIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBQQ0tPRF9EMl9TSChoel9vdXQwLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzKTsKLQotICAgIGh6X291dDQgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAxKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzAsIHNyYzEpOwotICAgICAgICBMRF9VQjIoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxKTsKLSAgICAgICAgaHpfb3V0NSA9IEFWQ19YT1JfVlNIRl9CX0FORF9BUFBMWV82VEFQX0hPUklaX0ZJTFRfU0goc3JjMCwgc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMik7Ci0gICAgICAgIGh6X291dDYgPSAodjhpMTYpIF9fbXNhX3Bja29kX2QoKHYyaTY0KSBoel9vdXQ1LCAodjJpNjQpIGh6X291dDUpOwotICAgICAgICByZXMwID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9SX1NIKGh6X291dDAsIGh6X291dDEsIGh6X291dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSk7Ci0gICAgICAgIHJlczIgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1JfU0goaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2KTsKLQotICAgICAgICBpZiAodmVyX29mZnNldCkgewotICAgICAgICAgICAgcmVzMSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0MywgNSk7Ci0gICAgICAgICAgICByZXMzID0gX19tc2Ffc3JhcmlfaChoel9vdXQ0LCA1KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlczEgPSBfX21zYV9zcmFyaV9oKGh6X291dDIsIDUpOwotICAgICAgICAgICAgcmVzMyA9IF9fbXNhX3NyYXJpX2goaHpfb3V0MywgNSk7Ci0gICAgICAgIH0KLQotICAgICAgICBTQVRfU0gyX1NIKHJlczEsIHJlczMsIDcpOwotCi0gICAgICAgIHJlczAgPSBfX21zYV9hdmVyX3NfaChyZXMwLCByZXMxKTsKLSAgICAgICAgcmVzMSA9IF9fbXNhX2F2ZXJfc19oKHJlczIsIHJlczMpOwotCi0gICAgICAgIHZlYzAgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczApOwotICAgICAgICB2ZWMxID0gUENLRVZfWE9SSTEyOF9VQihyZXMxLCByZXMxKTsKLQotICAgICAgICBBVkVSX1VCMl9VQih2ZWMwLCBkc3QwLCB2ZWMxLCBkc3QxLCBkc3QwLCBkc3QxKTsKLQotICAgICAgICBvdXQwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAwKTsKLSAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MSwgMCk7Ci0gICAgICAgIFNXKG91dDAsIGRzdCk7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICBTVyhvdXQxLCBkc3QpOwotICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLQotICAgICAgICBoel9vdXQwID0gaHpfb3V0MjsKLSAgICAgICAgaHpfb3V0MSA9IGh6X291dDM7Ci0gICAgICAgIGh6X291dDIgPSBoel9vdXQ0OwotICAgICAgICBoel9vdXQzID0gaHpfb3V0NTsKLSAgICAgICAgaHpfb3V0NCA9IGh6X291dDY7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9taWR2X3FydF9hbmRfYXZlcl9kc3RfOHdfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmVydF9vZmZzZXQpCi17Ci0gICAgaW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMjsKLSAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzOwotICAgIHY4aTE2IGh6X291dDQsIGh6X291dDUsIGh6X291dDYsIGh6X291dDcsIGh6X291dDg7Ci0gICAgdjhpMTYgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLSAgICB2OGkxNiByZXM0LCByZXM1LCByZXM2LCByZXM3OwotCi0gICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIGh6X291dDAgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgaHpfb3V0MSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICBoel9vdXQyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDMgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgaHpfb3V0NCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLQotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCi0gICAgICAgIGh6X291dDUgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDYgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDcgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgICAgIGh6X291dDggPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0KLSAgICAgICAgcmVzMCA9IEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSk7Ci0gICAgICAgIHJlczIgPSBBVkNfQ0FMQ19EUEFERF9IXzZQSVhfMkNPRUZGX1NIKGh6X291dDEsIGh6X291dDIsIGh6X291dDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDUsIGh6X291dDYpOwotICAgICAgICByZXM0ID0gQVZDX0NBTENfRFBBRERfSF82UElYXzJDT0VGRl9TSChoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ1LCBoel9vdXQ2LCBoel9vdXQ3KTsKLSAgICAgICAgcmVzNiA9IEFWQ19DQUxDX0RQQUREX0hfNlBJWF8yQ09FRkZfU0goaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0NiwgaHpfb3V0NywgaHpfb3V0OCk7Ci0KLSAgICAgICAgaWYgKHZlcnRfb2Zmc2V0KSB7Ci0gICAgICAgICAgICByZXMxID0gX19tc2Ffc3JhcmlfaChoel9vdXQzLCA1KTsKLSAgICAgICAgICAgIHJlczMgPSBfX21zYV9zcmFyaV9oKGh6X291dDQsIDUpOwotICAgICAgICAgICAgcmVzNSA9IF9fbXNhX3NyYXJpX2goaHpfb3V0NSwgNSk7Ci0gICAgICAgICAgICByZXM3ID0gX19tc2Ffc3JhcmlfaChoel9vdXQ2LCA1KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlczEgPSBfX21zYV9zcmFyaV9oKGh6X291dDIsIDUpOwotICAgICAgICAgICAgcmVzMyA9IF9fbXNhX3NyYXJpX2goaHpfb3V0MywgNSk7Ci0gICAgICAgICAgICByZXM1ID0gX19tc2Ffc3JhcmlfaChoel9vdXQ0LCA1KTsKLSAgICAgICAgICAgIHJlczcgPSBfX21zYV9zcmFyaV9oKGh6X291dDUsIDUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU0FUX1NINF9TSChyZXMxLCByZXMzLCByZXM1LCByZXM3LCA3KTsKLQotICAgICAgICByZXMwID0gX19tc2FfYXZlcl9zX2gocmVzMCwgcmVzMSk7Ci0gICAgICAgIHJlczEgPSBfX21zYV9hdmVyX3NfaChyZXMyLCByZXMzKTsKLSAgICAgICAgcmVzMiA9IF9fbXNhX2F2ZXJfc19oKHJlczQsIHJlczUpOwotICAgICAgICByZXMzID0gX19tc2FfYXZlcl9zX2gocmVzNiwgcmVzNyk7Ci0KLSAgICAgICAgQ09OVkVSVF9VQl9BVkdfU1Q4eDRfVUIocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgaHpfb3V0MCA9IGh6X291dDQ7Ci0gICAgICAgIGh6X291dDEgPSBoel9vdXQ1OwotICAgICAgICBoel9vdXQyID0gaHpfb3V0NjsKLSAgICAgICAgaHpfb3V0MyA9IGh6X291dDc7Ci0gICAgICAgIGh6X291dDQgPSBoel9vdXQ4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXZjX2x1bWFfbWlkdl9xcnRfYW5kX2F2ZXJfZHN0XzE2d19tc2EoY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZlcnRfb2Zmc2V0KQotewotICAgIGludDMyX3QgbXVsdGlwbGU4X2NudDsKLQotICAgIGZvciAobXVsdGlwbGU4X2NudCA9IDI7IG11bHRpcGxlOF9jbnQtLTspIHsKLSAgICAgICAgYXZjX2x1bWFfbWlkdl9xcnRfYW5kX2F2ZXJfZHN0Xzh3X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHZlcnRfb2Zmc2V0KTsKLQotICAgICAgICBzcmMgKz0gODsKLSAgICAgICAgZHN0ICs9IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0XzR4NF9tc2EoY29uc3QgdWludDhfdCAqc3JjX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUpCi17Ci0gICAgdjE2aTggc3JjX2h6MCwgc3JjX2h6MSwgc3JjX2h6Miwgc3JjX2h6MzsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotICAgIHYxNmk4IHNyY192dDAsIHNyY192dDEsIHNyY192dDIsIHNyY192dDMsIHNyY192dDQ7Ci0gICAgdjE2aTggc3JjX3Z0NSwgc3JjX3Z0Niwgc3JjX3Z0Nywgc3JjX3Z0ODsKLSAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syOwotICAgIHY4aTE2IGh6X291dDAsIGh6X291dDEsIHZlcnRfb3V0MCwgdmVydF9vdXQxOwotICAgIHY4aTE2IHJlczAsIHJlczE7Ci0gICAgdjE2dTggcmVzOwotCi0gICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIExEX1NCNShzcmNfeSwgc3JjX3N0cmlkZSwgc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCk7Ci0gICAgc3JjX3kgKz0gKDUgKiBzcmNfc3RyaWRlKTsKLQotICAgIHNyY192dDAgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQwLCAxLCAodjRpMzIpIHNyY192dDEpOwotICAgIHNyY192dDEgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQxLCAxLCAodjRpMzIpIHNyY192dDIpOwotICAgIHNyY192dDIgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQyLCAxLCAodjRpMzIpIHNyY192dDMpOwotICAgIHNyY192dDMgPSAodjE2aTgpIF9fbXNhX2luc3ZlX3coKHY0aTMyKSBzcmNfdnQzLCAxLCAodjRpMzIpIHNyY192dDQpOwotCi0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0Myk7Ci0gICAgTERfU0I0KHNyY194LCBzcmNfc3RyaWRlLCBzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKLSAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICBYT1JJX0I0XzEyOF9TQihzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKLSAgICBoel9vdXQwID0gQVZDX1hPUl9WU0hGX0JfQU5EX0FQUExZXzZUQVBfSE9SSVpfRklMVF9TSChzcmNfaHowLCBzcmNfaHoxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2swLCBtYXNrMSwgbWFzazIpOwotICAgIGh6X291dDEgPSBBVkNfWE9SX1ZTSEZfQl9BTkRfQVBQTFlfNlRBUF9IT1JJWl9GSUxUX1NIKHNyY19oejIsIHNyY19oejMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLCBtYXNrMik7Ci0gICAgU1JBUklfSDJfU0goaHpfb3V0MCwgaHpfb3V0MSwgNSk7Ci0gICAgU0FUX1NIMl9TSChoel9vdXQwLCBoel9vdXQxLCA3KTsKLSAgICBMRF9TQjQoc3JjX3ksIHNyY19zdHJpZGUsIHNyY192dDUsIHNyY192dDYsIHNyY192dDcsIHNyY192dDgpOwotCi0gICAgc3JjX3Z0NCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDQsIDEsICh2NGkzMikgc3JjX3Z0NSk7Ci0gICAgc3JjX3Z0NSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDUsIDEsICh2NGkzMikgc3JjX3Z0Nik7Ci0gICAgc3JjX3Z0NiA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDYsIDEsICh2NGkzMikgc3JjX3Z0Nyk7Ci0gICAgc3JjX3Z0NyA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHNyY192dDcsIDEsICh2NGkzMikgc3JjX3Z0OCk7Ci0KLSAgICBYT1JJX0I0XzEyOF9TQihzcmNfdnQ0LCBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3KTsKLQotICAgIC8qIGZpbHRlciBjYWxjICovCi0gICAgdmVydF9vdXQwID0gQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9SX1NIKHNyY192dDAsIHNyY192dDEsIHNyY192dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY192dDMsIHNyY192dDQsIHNyY192dDUpOwotICAgIHZlcnRfb3V0MSA9IEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfUl9TSChzcmNfdnQyLCBzcmNfdnQzLCBzcmNfdnQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3KTsKLSAgICBTUkFSSV9IMl9TSCh2ZXJ0X291dDAsIHZlcnRfb3V0MSwgNSk7Ci0gICAgU0FUX1NIMl9TSCh2ZXJ0X291dDAsIHZlcnRfb3V0MSwgNyk7Ci0KLSAgICByZXMxID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MSArIHZlcnRfb3V0MSksIDEpOwotICAgIHJlczAgPSBfX21zYV9zcmFyaV9oKChoel9vdXQwICsgdmVydF9vdXQwKSwgMSk7Ci0KLSAgICBTQVRfU0gyX1NIKHJlczAsIHJlczEsIDcpOwotICAgIHJlcyA9IFBDS0VWX1hPUkkxMjhfVUIocmVzMCwgcmVzMSk7Ci0KLSAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgZHN0MCwgMSwgKHY0aTMyKSBkc3QxKTsKLSAgICBkc3QxID0gKHYxNnU4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgZHN0MiwgMSwgKHY0aTMyKSBkc3QzKTsKLSAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgZHN0MCwgMSwgKHYyaTY0KSBkc3QxKTsKLSAgICBkc3QwID0gX19tc2FfYXZlcl91X2IocmVzLCBkc3QwKTsKLQotICAgIFNUNHg0X1VCKGRzdDAsIGRzdDAsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShjb25zdCB1aW50OF90ICpzcmNfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSkKLXsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjE2aTggc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0MzsKLSAgICB2MTZpOCBzcmNfdnQ0LCBzcmNfdnQ1LCBzcmNfdnQ2LCBzcmNfdnQ3LCBzcmNfdnQ4OwotICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7Ci0gICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MzsKLSAgICB2OGkxNiB2ZXJ0X291dDAsIHZlcnRfb3V0MSwgdmVydF9vdXQyLCB2ZXJ0X291dDM7Ci0gICAgdjhpMTYgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLQotICAgIExEX1NCMygmbHVtYV9tYXNrX2FyclswXSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOwotCi0gICAgTERfU0I1KHNyY195LCBzcmNfc3RyaWRlLCBzcmNfdnQwLCBzcmNfdnQxLCBzcmNfdnQyLCBzcmNfdnQzLCBzcmNfdnQ0KTsKLSAgICBzcmNfeSArPSAoNSAqIHNyY19zdHJpZGUpOwotCi0gICAgc3JjX3Z0MCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyY192dDAsIDEsICh2Mmk2NCkgc3JjX3Z0MSk7Ci0gICAgc3JjX3Z0MSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyY192dDEsIDEsICh2Mmk2NCkgc3JjX3Z0Mik7Ci0gICAgc3JjX3Z0MiA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyY192dDIsIDEsICh2Mmk2NCkgc3JjX3Z0Myk7Ci0gICAgc3JjX3Z0MyA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyY192dDMsIDEsICh2Mmk2NCkgc3JjX3Z0NCk7Ci0KLSAgICBYT1JJX0I0XzEyOF9TQihzcmNfdnQwLCBzcmNfdnQxLCBzcmNfdnQyLCBzcmNfdnQzKTsKLQotICAgIGZvciAobG9vcF9jbnQgPSAyOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjX3gsIHNyY19zdHJpZGUsIHNyY19oejAsIHNyY19oejEsIHNyY19oejIsIHNyY19oejMpOwotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmNfaHowLCBzcmNfaHoxLCBzcmNfaHoyLCBzcmNfaHozKTsKLSAgICAgICAgc3JjX3ggKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHowLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICAgICAgaHpfb3V0MSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHoxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICAgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHoyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICAgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmNfaHozLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKLSAgICAgICAgU1JBUklfSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNSk7Ci0gICAgICAgIFNBVF9TSDRfU0goaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgNyk7Ci0gICAgICAgIExEX1NCNChzcmNfeSwgc3JjX3N0cmlkZSwgc3JjX3Z0NSwgc3JjX3Z0Niwgc3JjX3Z0Nywgc3JjX3Z0OCk7Ci0gICAgICAgIHNyY195ICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgc3JjX3Z0NCA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyY192dDQsIDEsICh2Mmk2NCkgc3JjX3Z0NSk7Ci0gICAgICAgIHNyY192dDUgPSAodjE2aTgpIF9fbXNhX2luc3ZlX2QoKHYyaTY0KSBzcmNfdnQ1LCAxLCAodjJpNjQpIHNyY192dDYpOwotICAgICAgICBzcmNfdnQ2ID0gKHYxNmk4KSBfX21zYV9pbnN2ZV9kKCh2Mmk2NCkgc3JjX3Z0NiwgMSwgKHYyaTY0KSBzcmNfdnQ3KTsKLSAgICAgICAgc3JjX3Z0NyA9ICh2MTZpOCkgX19tc2FfaW5zdmVfZCgodjJpNjQpIHNyY192dDcsIDEsICh2Mmk2NCkgc3JjX3Z0OCk7Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjX3Z0NCwgc3JjX3Z0NSwgc3JjX3Z0Niwgc3JjX3Z0Nyk7Ci0gICAgICAgIEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfU0goc3JjX3Z0MCwgc3JjX3Z0MSwgc3JjX3Z0Miwgc3JjX3Z0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdnQ0LCBzcmNfdnQ1LCB2ZXJ0X291dDAsIHZlcnRfb3V0MSk7Ci0gICAgICAgIEFWQ19DQUxDX0RQQUREX0JfNlBJWF8yQ09FRkZfU0goc3JjX3Z0Miwgc3JjX3Z0Mywgc3JjX3Z0NCwgc3JjX3Z0NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdnQ2LCBzcmNfdnQ3LCB2ZXJ0X291dDIsIHZlcnRfb3V0Myk7Ci0gICAgICAgIFNSQVJJX0g0X1NIKHZlcnRfb3V0MCwgdmVydF9vdXQxLCB2ZXJ0X291dDIsIHZlcnRfb3V0MywgNSk7Ci0gICAgICAgIFNBVF9TSDRfU0godmVydF9vdXQwLCB2ZXJ0X291dDEsIHZlcnRfb3V0MiwgdmVydF9vdXQzLCA3KTsKLQotICAgICAgICBvdXQwID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MCArIHZlcnRfb3V0MCksIDEpOwotICAgICAgICBvdXQxID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MSArIHZlcnRfb3V0MSksIDEpOwotICAgICAgICBvdXQyID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MiArIHZlcnRfb3V0MiksIDEpOwotICAgICAgICBvdXQzID0gX19tc2Ffc3JhcmlfaCgoaHpfb3V0MyArIHZlcnRfb3V0MyksIDEpOwotCi0gICAgICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7Ci0gICAgICAgIENPTlZFUlRfVUJfQVZHX1NUOHg0X1VCKG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIHNyY192dDAgPSBzcmNfdnQ0OwotICAgICAgICBzcmNfdnQxID0gc3JjX3Z0NTsKLSAgICAgICAgc3JjX3Z0MiA9IHNyY192dDY7Ci0gICAgICAgIHNyY192dDMgPSBzcmNfdnQ3OwotICAgICAgICBzcmNfdnQ0ID0gc3JjX3Z0ODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfMTZ4MTZfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyY194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUpCi17Ci0gICAgdWludDMyX3QgbXVsdGlwbGU4X2NudDsKLQotICAgIGZvciAobXVsdGlwbGU4X2NudCA9IDI7IG11bHRpcGxlOF9jbnQtLTspIHsKLSAgICAgICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF84eDhfbXNhKHNyY194LCBzcmNfeSwgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgc3JjX3ggKz0gODsKLSAgICAgICAgc3JjX3kgKz0gODsKLSAgICAgICAgZHN0ICs9IDg7Ci0gICAgfQotCi0gICAgc3JjX3ggKz0gKDggKiBzcmNfc3RyaWRlKSAtIDE2OwotICAgIHNyY195ICs9ICg4ICogc3JjX3N0cmlkZSkgLSAxNjsKLSAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKSAtIDE2OwotCi0gICAgZm9yIChtdWx0aXBsZThfY250ID0gMjsgbXVsdGlwbGU4X2NudC0tOykgewotICAgICAgICBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0Xzh4OF9tc2Eoc3JjX3gsIHNyY195LCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBzcmNfeCArPSA4OwotICAgICAgICBzcmNfeSArPSA4OwotICAgICAgICBkc3QgKz0gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfd2lkdGg4X21zYShjb25zdCB1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKLXsKLSAgICBpbnQzMl90IGNudDsKLSAgICB1aW50NjRfdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3OwotICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7Ci0KLSAgICBpZiAoMCA9PSBoZWlnaHQgJSAxMikgewotICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyAxMik7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgICAgICBvdXQwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMwLCAwKTsKLSAgICAgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzEsIDApOwotICAgICAgICAgICAgb3V0MiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMiwgMCk7Ci0gICAgICAgICAgICBvdXQzID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMzLCAwKTsKLSAgICAgICAgICAgIG91dDQgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzQsIDApOwotICAgICAgICAgICAgb3V0NSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNSwgMCk7Ci0gICAgICAgICAgICBvdXQ2ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM2LCAwKTsKLSAgICAgICAgICAgIG91dDcgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzcsIDApOwotCi0gICAgICAgICAgICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgU0Q0KG91dDQsIG91dDUsIG91dDYsIG91dDcsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMxLCAwKTsKLSAgICAgICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzIsIDApOwotICAgICAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMywgMCk7Ci0KLSAgICAgICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgOCkgewotICAgICAgICBmb3IgKGNudCA9IGhlaWdodCA+PiAzOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMxLCAwKTsKLSAgICAgICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzIsIDApOwotICAgICAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMywgMCk7Ci0gICAgICAgICAgICBvdXQ0ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM0LCAwKTsKLSAgICAgICAgICAgIG91dDUgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzUsIDApOwotICAgICAgICAgICAgb3V0NiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNiwgMCk7Ci0gICAgICAgICAgICBvdXQ3ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM3LCAwKTsKLQotICAgICAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIFNENChvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3LCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgNCkgewotICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyA0KTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMxLCAwKTsKLSAgICAgICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzIsIDApOwotICAgICAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMywgMCk7Ci0KLSAgICAgICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgMikgewotICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyAyKTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMxLCAwKTsKLQotICAgICAgICAgICAgU0Qob3V0MCwgZHN0KTsKLSAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICAgICAgU0Qob3V0MSwgZHN0KTsKLSAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5XzE2bXVsdHg4bXVsdF9tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgpCi17Ci0gICAgaW50MzJfdCBjbnQsIGxvb3BfY250OwotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY190bXA7Ci0gICAgdWludDhfdCAqZHN0X3RtcDsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotCi0gICAgZm9yIChjbnQgPSAod2lkdGggPj4gNCk7IGNudC0tOykgewotICAgICAgICBzcmNfdG1wID0gc3JjOwotICAgICAgICBkc3RfdG1wID0gZHN0OwotCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDMpOyBsb29wX2NudC0tOykgewotICAgICAgICAgICAgTERfVUI4KHNyY190bXAsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmNfdG1wICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIFNUX1VCOChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LAotICAgICAgICAgICAgICAgICAgIGRzdF90bXAsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0X3RtcCArPSAoOCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjICs9IDE2OwotICAgICAgICBkc3QgKz0gMTY7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5X3dpZHRoMTZfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCi17Ci0gICAgaW50MzJfdCBjbnQ7Ci0gICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKLQotICAgIGlmICgwID09IGhlaWdodCAlIDEyKSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCAvIDEyKTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywKLSAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDgpIHsKLSAgICAgICAgY29weV8xNm11bHR4OG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQsIDE2KTsKLSAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgNCkgewotICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgPj4gMik7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXZnX3dpZHRoNF9tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQotewotICAgIGludDMyX3QgY250OwotICAgIHVpbnQzMl90IG91dDAsIG91dDEsIG91dDIsIG91dDM7Ci0gICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotCi0gICAgaWYgKDAgPT0gKGhlaWdodCAlIDQpKSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCAvIDQpOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCi0gICAgICAgICAgICBBVkVSX1VCNF9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBzcmMzLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MSwgMCk7Ci0gICAgICAgICAgICBvdXQyID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QyLCAwKTsKLSAgICAgICAgICAgIG91dDMgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDMsIDApOwotICAgICAgICAgICAgU1c0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoMCA9PSAoaGVpZ2h0ICUgMikpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gMik7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUIyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7Ci0gICAgICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgTERfVUIyKGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSk7Ci0KLSAgICAgICAgICAgIEFWRVJfVUIyX1VCKHNyYzAsIGRzdDAsIHNyYzEsIGRzdDEsIGRzdDAsIGRzdDEpOwotCi0gICAgICAgICAgICBvdXQwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAwKTsKLSAgICAgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDEsIDApOwotICAgICAgICAgICAgU1cob3V0MCwgZHN0KTsKLSAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICAgICAgU1cob3V0MSwgZHN0KTsKLSAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhdmdfd2lkdGg4X21zYShjb25zdCB1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCi17Ci0gICAgaW50MzJfdCBjbnQ7Ci0gICAgdWludDY0X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0KLSAgICBmb3IgKGNudCA9IChoZWlnaHQgLyA0KTsgY250LS07KSB7Ci0gICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgQVZFUl9VQjRfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgc3JjMiwgZHN0Miwgc3JjMywgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MCwgMCk7Ci0gICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDEsIDApOwotICAgICAgICBvdXQyID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QyLCAwKTsKLSAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MywgMCk7Ci0gICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGF2Z193aWR0aDE2X21zYShjb25zdCB1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKLXsKLSAgICBpbnQzMl90IGNudDsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7Ci0KLSAgICBmb3IgKGNudCA9IChoZWlnaHQgLyA4KTsgY250LS07KSB7Ci0gICAgICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgTERfVUI4KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7Ci0KLSAgICAgICAgQVZFUl9VQjRfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgc3JjMiwgZHN0Miwgc3JjMywgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIEFWRVJfVUI0X1VCKHNyYzQsIGRzdDQsIHNyYzUsIGRzdDUsIHNyYzYsIGRzdDYsIHNyYzcsIGRzdDcsCi0gICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOwotICAgICAgICBTVF9VQjgoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7Ci0gICAgfQotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzAwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgY29weV93aWR0aDE2X21zYShzcmMsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDE2KTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBjb3B5X3dpZHRoOF9tc2Eoc3JjLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4KTsKLX0KLQotdm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMwMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Z193aWR0aDE2X21zYShzcmMsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDE2KTsKLX0KLQotdm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzAwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmdfd2lkdGg4X21zYShzcmMsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDgpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMDBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Z193aWR0aDRfbXNhKHNyYywgc3RyaWRlLCBkc3QsIHN0cmlkZSwgNCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9oel9xcnRfMTZ3X21zYShzcmMgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxNiwgMCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMzBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9oel9xcnRfMTZ3X21zYShzcmMgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxNiwgMSk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMxMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHpfcXJ0Xzh3X21zYShzcmMgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4LCAwKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9oel9xcnRfOHdfbXNhKHNyYyAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDgsIDEpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMTBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h6X3FydF80d19tc2Eoc3JjIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgNCwgMCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMzMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHpfcXJ0XzR3X21zYShzcmMgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA0LCAxKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMyMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h6XzE2d19tc2Eoc3JjIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMTYpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMjBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h6Xzh3X21zYShzcmMgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4KTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzIwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9oel80d19tc2Eoc3JjIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgNCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMDFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV92dF9xcnRfMTZ3X21zYShzcmMgLSAoc3RyaWRlICogMiksIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDE2LCAwKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMwM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX3Z0X3FydF8xNndfbXNhKHNyYyAtIChzdHJpZGUgKiAyKSwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMTYsIDEpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMDFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX3Z0X3FydF84d19tc2Eoc3JjIC0gKHN0cmlkZSAqIDIpLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4LCAwKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAzX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV92dF9xcnRfOHdfbXNhKHNyYyAtIChzdHJpZGUgKiAyKSwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgOCwgMSk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMwMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfdnRfcXJ0XzR3X21zYShzcmMgLSAoc3RyaWRlICogMiksIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDQsIDApOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMDNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX3Z0X3FydF80d19tc2Eoc3JjIC0gKHN0cmlkZSAqIDIpLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA0LCAxKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF8xNndfbXNhKHNyYyAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjIC0gKHN0cmlkZSAqIDIpLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxNik7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMzFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9odl9xcnRfMTZ3X21zYShzcmMgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxNik7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMTNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9odl9xcnRfMTZ3X21zYShzcmMgKyBzdHJpZGUgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMTYpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzMzX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0XzE2d19tc2Eoc3JjICsgc3RyaWRlIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OF90KSwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMTYpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMTFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF84d19tc2Eoc3JjIC0gMiwgc3JjIC0gKHN0cmlkZSAqIDIpLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4KTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzMxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9odl9xcnRfOHdfbXNhKHNyYyAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4KTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEzX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9odl9xcnRfOHdfbXNhKHNyYyArIHN0cmlkZSAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMiksIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDgpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMzNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF84d19tc2Eoc3JjICsgc3RyaWRlIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDhfdCksIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDgpOwotfQotCi0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMxMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0XzR3X21zYShzcmMgLSAyLCBzcmMgLSAoc3RyaWRlICogMiksIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDQpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMzFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF80d19tc2Eoc3JjIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDhfdCksIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDQpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMTNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF80d19tc2Eoc3JjICsgc3RyaWRlIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgNCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMzM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0XzR3X21zYShzcmMgKyBzdHJpZGUgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjIC0gKHN0cmlkZSAqIDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OF90KSwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgNCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9taWR2X3FydF8xNndfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxNiwgMCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9taWR2X3FydF8xNndfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxNiwgMSk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMyMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfbWlkdl9xcnRfOHdfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDgsIDApOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw4X21jMjNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZHZfcXJ0Xzh3X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4LCAxKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzIxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9taWR2X3FydF80d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgNCwgMCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDRfbWMyM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfbWlkdl9xcnRfNHdfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDQsIDEpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWwxNl9tYzAyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfdnRfMTZ3X21zYShzcmMgLSAoc3RyaWRlICogMiksIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDE2KTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzAyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV92dF84d19tc2Eoc3JjIC0gKHN0cmlkZSAqIDIpLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4KTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzAyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV92dF80d19tc2Eoc3JjIC0gKHN0cmlkZSAqIDIpLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA0KTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMxMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZGhfcXJ0XzE2d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDE2LCAwKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsMTZfbWMzMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZGhfcXJ0XzE2d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDE2LCAxKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsOF9tYzEyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9taWRoX3FydF84d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgOCwgMCk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMzMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfbWlkaF9xcnRfOHdfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDgsIDEpOwotfQotCi12b2lkIGZmX3B1dF9oMjY0X3FwZWw0X21jMTJfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZGhfcXJ0XzR3X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA0LCAwKTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzMyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9taWRoX3FydF80d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgNCwgMSk7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDE2X21jMjJfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9taWRfMTZ3X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxNik7Ci19Ci0KLXZvaWQgZmZfcHV0X2gyNjRfcXBlbDhfbWMyMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfbWlkXzh3X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4KTsKLX0KLQotdm9pZCBmZl9wdXRfaDI2NF9xcGVsNF9tYzIyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9taWRfNHdfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDQpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzEwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHpfcXJ0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2Eoc3JjIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMCk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMzBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9oel9xcnRfYW5kX2F2ZXJfZHN0XzE2eDE2X21zYShzcmMgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxKTsKLX0KLQotdm9pZCBmZl9hdmdfaDI2NF9xcGVsOF9tYzEwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9oel9xcnRfYW5kX2F2ZXJfZHN0Xzh4OF9tc2Eoc3JjIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMCk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMzMF9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHpfcXJ0X2FuZF9hdmVyX2RzdF84eDhfbXNhKHNyYyAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDEpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMTBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h6X3FydF9hbmRfYXZlcl9kc3RfNHg0X21zYShzcmMgLSAyLCBzdHJpZGUsIGRzdCwgc3RyaWRlLCAwKTsKLX0KLQotdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzMwX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9oel9xcnRfYW5kX2F2ZXJfZHN0XzR4NF9tc2Eoc3JjIC0gMiwgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9oel9hbmRfYXZlcl9kc3RfMTZ4MTZfbXNhKHNyYyAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h6X2FuZF9hdmVyX2RzdF84eDhfbXNhKHNyYyAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMjBfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h6X2FuZF9hdmVyX2RzdF80eDRfbXNhKHNyYyAtIDIsIHN0cmlkZSwgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAxX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfdnRfcXJ0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2Eoc3JjIC0gKHN0cmlkZSAqIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDApOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAzX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfdnRfcXJ0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2Eoc3JjIC0gKHN0cmlkZSAqIDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDEpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX3Z0X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMgLSAoc3RyaWRlICogMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDApOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX3Z0X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMgLSAoc3RyaWRlICogMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDEpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMDFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX3Z0X3FydF9hbmRfYXZlcl9kc3RfNHg0X21zYShzcmMgLSAoc3RyaWRlICogMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDApOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMDNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX3Z0X3FydF9hbmRfYXZlcl9kc3RfNHg0X21zYShzcmMgLSAoc3RyaWRlICogMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDEpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzExX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2Eoc3JjIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMzFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0XzE2eDE2X21zYShzcmMgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpLCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzEzX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF8xNngxNl9tc2Eoc3JjICsgc3RyaWRlIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMzNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9odl9xcnRfYW5kX2F2ZXJfZHN0XzE2eDE2X21zYShzcmMgKyBzdHJpZGUgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpLCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDhfdCksIHN0cmlkZSwgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMTNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMgKyBzdHJpZGUgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMzNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX2h2X3FydF9hbmRfYXZlcl9kc3RfOHg4X21zYShzcmMgKyBzdHJpZGUgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgLSAoc3RyaWRlICogMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDhfdCksIHN0cmlkZSwgZHN0LCBzdHJpZGUpOwotfQotCi0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMxMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF80eDRfbXNhKHNyYyAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMzMV9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF80eDRfbXNhKHNyYyAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OF90KSwgc3RyaWRlLCBkc3QsIHN0cmlkZSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMxM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF80eDRfbXNhKHNyYyArIHN0cmlkZSAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMzM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfaHZfcXJ0X2FuZF9hdmVyX2RzdF80eDRfbXNhKHNyYyArIHN0cmlkZSAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAtIChzdHJpZGUgKiAyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50OF90KSwgc3RyaWRlLCBkc3QsIHN0cmlkZSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKLXsKLSAgICBhdmNfbHVtYV9taWR2X3FydF9hbmRfYXZlcl9kc3RfMTZ3X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDE2LCAwKTsKLX0KLQotdm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMyM19tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZHZfcXJ0X2FuZF9hdmVyX2RzdF8xNndfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMTYsIDEpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZHZfcXJ0X2FuZF9hdmVyX2RzdF84d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDgsIDApOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMjNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZHZfcXJ0X2FuZF9hdmVyX2RzdF84d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDgsIDEpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMjFfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZHZfcXJ0X2FuZF9hdmVyX2RzdF80d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDQsIDApOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw0X21jMjNfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZHZfcXJ0X2FuZF9hdmVyX2RzdF80d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUsIDQsIDEpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzAyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfdnRfYW5kX2F2ZXJfZHN0XzE2eDE2X21zYShzcmMgLSAoc3RyaWRlICogMiksIHN0cmlkZSwgZHN0LCBzdHJpZGUpOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWw4X21jMDJfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX3Z0X2FuZF9hdmVyX2RzdF84eDhfbXNhKHNyYyAtIChzdHJpZGUgKiAyKSwgc3RyaWRlLCBkc3QsIHN0cmlkZSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMwMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfdnRfYW5kX2F2ZXJfZHN0XzR4NF9tc2Eoc3JjIC0gKHN0cmlkZSAqIDIpLCBzdHJpZGUsIGRzdCwgc3RyaWRlKTsKLX0KLQotdm9pZCBmZl9hdmdfaDI2NF9xcGVsMTZfbWMxMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQotewotICAgIGF2Y19sdW1hX21pZGhfcXJ0X2FuZF9hdmVyX2RzdF8xNndfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSwgMTYsIDApOwotfQotCi12b2lkIGZmX2F2Z19oMjY0X3FwZWwxNl9tYzMyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfbWlkaF9xcnRfYW5kX2F2ZXJfZHN0XzE2d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIGRzdCwgc3RyaWRlLCAxNiwgMSk7Ci19Ci0KLXZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMxMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCi17Ci0gICAgYXZjX2x1bWFfbWlkaF9xcnRfYW5kX2F2ZXJfZHN0Xzh3X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSwgOCwgMCk7Ci19Ci0KIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMzMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgYXZjX2x1bWFfbWlkaF9xcnRfYW5kX2F2ZXJfZHN0Xzh3X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSwgOCwgMSk7CisgICAgdWludDMyX3Qgcm93OworICAgIHVpbnQ2NF90IHRwMCwgdHAxOworICAgIHYxNnU4IG91dCwgZHN0MCA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzY7CisgICAgdjhpMTYgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMiwgdnRfcmVzMywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1LCBzaGZfdmVjNjsKKyAgICB2OGkxNiBzaGZfdmVjNywgc2hmX3ZlYzgsIHNoZl92ZWM5LCBzaGZfdmVjMTAsIHNoZl92ZWMxMTsKKyAgICB2OGkxNiBtYXNrMywgbWFzazQsIG1hc2s1OworICAgIHY0aTMyIGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczM7CisgICAgdjhpMTYgbWFzazAgPSB7IDAsIDUsIDEsIDYsIDIsIDcsIDMsIDggfTsKKyAgICB2OGkxNiBtYXNrMSA9IHsgMSwgNCwgMiwgNSwgMywgNiwgNCwgNyB9OworICAgIHY4aTE2IG1hc2syID0geyAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2IH07CisgICAgdjhpMTYgbWludXM1aCA9IF9fbXNhX2xkaV9oKC01KTsKKyAgICB2OGkxNiBwbHVzMjBoID0gX19tc2FfbGRpX2goMjApOworCisgICAgbWFzazMgPSBtYXNrMCArIDQ7CisgICAgbWFzazQgPSBtYXNrMSArIDQ7CisgICAgbWFzazUgPSBtYXNrMiArIDQ7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworCisgICAgZm9yIChyb3cgPSA0OyByb3ctLTspIHsKKyAgICAgICAgTERfU0IyKHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjICs9ICgyICogc3RyaWRlKTsKKyAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7CisKKyAgICAgICAgQVZDX0NBTENfRFBBRERfQl82UElYXzJDT0VGRl9TSChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0X3JlczAsIHZ0X3JlczEpOworICAgICAgICBBVkNfQ0FMQ19EUEFERF9CXzZQSVhfMkNPRUZGX1NIKHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRfcmVzMiwgdnRfcmVzMyk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgdnRfcmVzMCwgdnRfcmVzMSwgbWFzazAsCisgICAgICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKKyAgICAgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgICAgICBtYXNrMSwgbWFzazIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUpOworICAgICAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIG1hc2s0LCBtYXNrNSwgc2hmX3ZlYzYsIHNoZl92ZWM3LCBzaGZfdmVjOCk7CisgICAgICAgIFZTSEZfSDNfU0godnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgdnRfcmVzMiwgdnRfcmVzMywgbWFzazMsCisgICAgICAgICAgICAgICAgICAgbWFzazQsIG1hc2s1LCBzaGZfdmVjOSwgc2hmX3ZlYzEwLCBzaGZfdmVjMTEpOworICAgICAgICBoel9yZXMwID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICAgICAgaHpfcmVzMSA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgICAgIGh6X3JlczIgPSBfX21zYV9oYWRkX3NfdyhzaGZfdmVjNiwgc2hmX3ZlYzYpOworICAgICAgICBoel9yZXMzID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzksIHNoZl92ZWM5KTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7CisgICAgICAgIERQQUREX1NIMl9TVyhzaGZfdmVjNCwgc2hmX3ZlYzUsIG1pbnVzNWgsIHBsdXMyMGgsIGh6X3JlczEsIGh6X3JlczEpOworICAgICAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzcsIHNoZl92ZWM4LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMyLCBoel9yZXMyKTsKKyAgICAgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxMCwgc2hmX3ZlYzExLCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMzLCBoel9yZXMzKTsKKyAgICAgICAgU1JBUklfVzRfU1coaHpfcmVzMCwgaHpfcmVzMSwgaHpfcmVzMiwgaHpfcmVzMywgMTApOworICAgICAgICBTQVRfU1c0X1NXKGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczMsIDcpOworICAgICAgICB0bXAwID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMiwgNSk7CisgICAgICAgIHRtcDEgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM1LCA1KTsKKyAgICAgICAgdG1wMiA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzgsIDUpOworICAgICAgICB0bXAzID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjMTEsIDUpOworICAgICAgICBMRDIoZHN0LCBzdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICAgICAgU0FUX1NINF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKKyAgICAgICAgdG1wMCA9IF9fbXNhX3Bja29kX2godG1wMiwgdG1wMCk7CisgICAgICAgIHRtcDEgPSBfX21zYV9wY2tvZF9oKHRtcDMsIHRtcDEpOworICAgICAgICBQQ0tFVl9IMl9TSChoel9yZXMyLCBoel9yZXMwLCBoel9yZXMzLCBoel9yZXMxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgdG1wMCA9IF9fbXNhX2F2ZXJfc19oKHRtcDIsIHRtcDApOworICAgICAgICB0bXAxID0gX19tc2FfYXZlcl9zX2godG1wMywgdG1wMSk7CisgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgICAgIG91dCA9IF9fbXNhX2F2ZXJfdV9iKG91dCwgZHN0MCk7CisgICAgICAgIFNUOHgyX1VCKG91dCwgZHN0LCBzdHJpZGUpOworICAgICAgICBkc3QgKz0gKDIgKiBzdHJpZGUpOworCisgICAgICAgIHNyYzAgPSBzcmMyOworICAgICAgICBzcmMxID0gc3JjMzsKKyAgICAgICAgc3JjMiA9IHNyYzQ7CisgICAgICAgIHNyYzMgPSBzcmM1OworICAgICAgICBzcmM0ID0gc3JjNjsKKyAgICB9CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDRfbWMxMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgYXZjX2x1bWFfbWlkaF9xcnRfYW5kX2F2ZXJfZHN0XzR3X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSwgNCwgMCk7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDAgPSAweGZiMDE7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MSA9IDB4MTQxNDsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QyID0gMHgxZmI7CisgICAgdjE2dTggb3V0LCBkc3R2ID0geyAwIH07CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMyMV9yLCBzcmMzMl9yLCBzcmM0M19yLCBzcmM1NF9yLCBzcmM2NV9yLCBzcmM3Nl9yOworICAgIHYxNmk4IHNyYzg3X3IsIHNyYzEwX2wsIHNyYzIxX2wsIHNyYzMyX2wsIHNyYzQzX2wsIHNyYzU0X2wsIHNyYzY1X2w7CisgICAgdjE2aTggc3JjNzZfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2OGkxNiB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMyLCB2dF9yZXMzLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBzaGZfdmVjNzsKKyAgICB2OGkxNiBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1LCBzaGZfdmVjNjsKKyAgICB2NGkzMiBoel9yZXMwLCBoel9yZXMxLCBoel9yZXMyLCBoel9yZXMzOworICAgIHY4aTE2IG1hc2swID0geyAwLCA1LCAxLCA2LCAyLCA3LCAzLCA4IH07CisgICAgdjhpMTYgbWFzazEgPSB7IDEsIDQsIDIsIDUsIDMsIDYsIDQsIDcgfTsKKyAgICB2OGkxNiBtYXNrMiA9IHsgMiwgMywgMywgNCwgNCwgNSwgNSwgNiB9OworICAgIHY4aTE2IG1pbnVzNWggPSBfX21zYV9sZGlfaCgtNSk7CisgICAgdjhpMTYgcGx1czIwaCA9IF9fbXNhX2xkaV9oKDIwKTsKKyAgICB2OGkxNiB6ZXJvcyA9IHsgMCB9OworCisgICAgZmlsdDAgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjE2aTgpIF9fbXNhX2ZpbGxfaChmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBJTFZSX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzEwX3IsIHNyYzIxX3IsCisgICAgICAgICAgICAgICBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X3IsIHNyYzY1X3IsCisgICAgICAgICAgICAgICBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICBJTFZMX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzEwX2wsIHNyYzIxX2wsCisgICAgICAgICAgICAgICBzcmMzMl9sLCBzcmM0M19sKTsKKyAgICBJTFZMX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X2wsIHNyYzY1X2wsCisgICAgICAgICAgICAgICBzcmM3Nl9sLCBzcmM4N19sKTsKKyAgICB2dF9yZXMwID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgdnRfcmVzMSA9IEFWQ19ET1RfU0gzX1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIHZ0X3JlczIgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICB2dF9yZXMzID0gQVZDX0RPVF9TSDNfU0goc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgVlNIRl9IM19TSCh2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCBtYXNrMCwKKyAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjMik7CisgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNSk7CisgICAgaHpfcmVzMCA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMwLCBzaGZfdmVjMCk7CisgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjMiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMCwgaHpfcmVzMCk7CisgICAgaHpfcmVzMSA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgRFBBRERfU0gyX1NXKHNoZl92ZWM0LCBzaGZfdmVjNSwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMSwgaHpfcmVzMSk7CisKKyAgICB2dF9yZXMwID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgdnRfcmVzMSA9IEFWQ19ET1RfU0gzX1NIKHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIHZ0X3JlczIgPSBBVkNfRE9UX1NIM19TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICB2dF9yZXMzID0gQVZDX0RPVF9TSDNfU0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgVlNIRl9IM19TSCh2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCB2dF9yZXMwLCB2dF9yZXMxLCBtYXNrMCwKKyAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzAsIHNoZl92ZWMxLCBzaGZfdmVjNik7CisgICAgVlNIRl9IM19TSCh2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCB2dF9yZXMyLCB2dF9yZXMzLCBtYXNrMCwKKyAgICAgICAgICAgICAgIG1hc2sxLCBtYXNrMiwgc2hmX3ZlYzMsIHNoZl92ZWM0LCBzaGZfdmVjNyk7CisgICAgaHpfcmVzMiA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMwLCBzaGZfdmVjMCk7CisgICAgRFBBRERfU0gyX1NXKHNoZl92ZWMxLCBzaGZfdmVjNiwgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMiwgaHpfcmVzMik7CisgICAgaHpfcmVzMyA9IF9fbXNhX2hhZGRfc193KHNoZl92ZWMzLCBzaGZfdmVjMyk7CisgICAgRFBBRERfU0gyX1NXKHNoZl92ZWM0LCBzaGZfdmVjNywgbWludXM1aCwgcGx1czIwaCwgaHpfcmVzMywgaHpfcmVzMyk7CisKKyAgICBTUkFSSV9XMl9TVyhoel9yZXMwLCBoel9yZXMxLCAxMCk7CisgICAgU0FUX1NXMl9TVyhoel9yZXMwLCBoel9yZXMxLCA3KTsKKyAgICBTUkFSSV9XMl9TVyhoel9yZXMyLCBoel9yZXMzLCAxMCk7CisgICAgU0FUX1NXMl9TVyhoel9yZXMyLCBoel9yZXMzLCA3KTsKKworICAgIGRzdDAgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWMyLCA1KTsKKyAgICBkc3QxID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjNSwgNSk7CisgICAgZHN0MiA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzYsIDUpOworICAgIGRzdDMgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM3LCA1KTsKKworICAgIFNBVF9TSDJfU0goZHN0MCwgZHN0MSwgNyk7CisgICAgU0FUX1NIMl9TSChkc3QyLCBkc3QzLCA3KTsKKyAgICBJTFZFVl9IMl9TSChkc3QwLCB6ZXJvcywgZHN0MSwgemVyb3MsIGRzdDAsIGRzdDEpOworICAgIElMVkVWX0gyX1NIKGRzdDIsIHplcm9zLCBkc3QzLCB6ZXJvcywgZHN0MiwgZHN0Myk7CisKKyAgICBoel9yZXMwID0gX19tc2FfYXZlcl9zX3coaHpfcmVzMCwgKHY0aTMyKSBkc3QwKTsKKyAgICBoel9yZXMxID0gX19tc2FfYXZlcl9zX3coaHpfcmVzMSwgKHY0aTMyKSBkc3QxKTsKKyAgICBoel9yZXMyID0gX19tc2FfYXZlcl9zX3coaHpfcmVzMiwgKHY0aTMyKSBkc3QyKTsKKyAgICBoel9yZXMzID0gX19tc2FfYXZlcl9zX3coaHpfcmVzMywgKHY0aTMyKSBkc3QzKTsKKworICAgIExXNChkc3QsIHN0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3R2KTsKKyAgICBQQ0tFVl9IMl9TSChoel9yZXMxLCBoel9yZXMwLCBoel9yZXMzLCBoel9yZXMyLCBkc3QwLCBkc3QyKTsKKyAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDIpOworICAgIG91dCA9IF9fbXNhX2F2ZXJfdV9iKG91dCwgZHN0dik7CisgICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgc3RyaWRlKTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzMyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICBhdmNfbHVtYV9taWRoX3FydF9hbmRfYXZlcl9kc3RfNHdfbXNhKHNyYyAtICgyICogc3RyaWRlKSAtIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIGRzdCwgc3RyaWRlLCA0LCAxKTsKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CisgICAgY29uc3QgaW50MTZfdCBmaWx0X2NvbnN0MCA9IDB4ZmIwMTsKKyAgICBjb25zdCBpbnQxNl90IGZpbHRfY29uc3QxID0gMHgxNDE0OworICAgIGNvbnN0IGludDE2X3QgZmlsdF9jb25zdDIgPSAweDFmYjsKKyAgICB2MTZ1OCBvdXQsIGRzdHYgPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNmk4IHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IsIHNyYzU0X3IsIHNyYzY1X3IsIHNyYzc2X3I7CisgICAgdjE2aTggc3JjODdfciwgc3JjMTBfbCwgc3JjMjFfbCwgc3JjMzJfbCwgc3JjNDNfbCwgc3JjNTRfbCwgc3JjNjVfbDsKKyAgICB2MTZpOCBzcmM3Nl9sLCBzcmM4N19sLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczIsIHZ0X3JlczMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHNoZl92ZWM3OworICAgIHY4aTE2IHNoZl92ZWMwLCBzaGZfdmVjMSwgc2hmX3ZlYzIsIHNoZl92ZWMzLCBzaGZfdmVjNCwgc2hmX3ZlYzUsIHNoZl92ZWM2OworICAgIHY0aTMyIGh6X3JlczAsIGh6X3JlczEsIGh6X3JlczIsIGh6X3JlczM7CisgICAgdjhpMTYgbWFzazAgPSB7IDAsIDUsIDEsIDYsIDIsIDcsIDMsIDggfTsKKyAgICB2OGkxNiBtYXNrMSA9IHsgMSwgNCwgMiwgNSwgMywgNiwgNCwgNyB9OworICAgIHY4aTE2IG1hc2syID0geyAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2IH07CisgICAgdjhpMTYgbWludXM1aCA9IF9fbXNhX2xkaV9oKC01KTsKKyAgICB2OGkxNiBwbHVzMjBoID0gX19tc2FfbGRpX2goMjApOworICAgIHY4aTE2IHplcm9zID0geyAwIH07CisKKyAgICBmaWx0MCA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QwKTsKKyAgICBmaWx0MSA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QxKTsKKyAgICBmaWx0MiA9ICh2MTZpOCkgX19tc2FfZmlsbF9oKGZpbHRfY29uc3QyKTsKKworICAgIHNyYyAtPSAoKDIgKiBzdHJpZGUpICsgMik7CisKKyAgICBMRF9TQjUoc3JjLCBzdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwgc3JjNjVfciwKKyAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IpOworICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfbCwgc3JjMjFfbCwKKyAgICAgICAgICAgICAgIHNyYzMyX2wsIHNyYzQzX2wpOworICAgIElMVkxfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfbCwgc3JjNjVfbCwKKyAgICAgICAgICAgICAgIHNyYzc2X2wsIHNyYzg3X2wpOworICAgIHZ0X3JlczAgPSBBVkNfRE9UX1NIM19TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICB2dF9yZXMxID0gQVZDX0RPVF9TSDNfU0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgdnRfcmVzMiA9IEFWQ19ET1RfU0gzX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIHZ0X3JlczMgPSBBVkNfRE9UX1NIM19TSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2swLAorICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWMyKTsKKyAgICBWU0hGX0gzX1NIKHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIG1hc2swLAorICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM1KTsKKyAgICBoel9yZXMwID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzEsIHNoZl92ZWMyLCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMwLCBoel9yZXMwKTsKKyAgICBoel9yZXMxID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzMsIHNoZl92ZWMzKTsKKyAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzQsIHNoZl92ZWM1LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMxLCBoel9yZXMxKTsKKworICAgIHZ0X3JlczAgPSBBVkNfRE9UX1NIM19TSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICB2dF9yZXMxID0gQVZDX0RPVF9TSDNfU0goc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwgZmlsdDAsIGZpbHQxLCBmaWx0Mik7CisgICAgdnRfcmVzMiA9IEFWQ19ET1RfU0gzX1NIKHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIpOworICAgIHZ0X3JlczMgPSBBVkNfRE9UX1NIM19TSChzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLCBmaWx0MCwgZmlsdDEsIGZpbHQyKTsKKyAgICBWU0hGX0gzX1NIKHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIHZ0X3JlczAsIHZ0X3JlczEsIG1hc2swLAorICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMCwgc2hmX3ZlYzEsIHNoZl92ZWM2KTsKKyAgICBWU0hGX0gzX1NIKHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIHZ0X3JlczIsIHZ0X3JlczMsIG1hc2swLAorICAgICAgICAgICAgICAgbWFzazEsIG1hc2syLCBzaGZfdmVjMywgc2hmX3ZlYzQsIHNoZl92ZWM3KTsKKyAgICBoel9yZXMyID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzAsIHNoZl92ZWMwKTsKKyAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzEsIHNoZl92ZWM2LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMyLCBoel9yZXMyKTsKKyAgICBoel9yZXMzID0gX19tc2FfaGFkZF9zX3coc2hmX3ZlYzMsIHNoZl92ZWMzKTsKKyAgICBEUEFERF9TSDJfU1coc2hmX3ZlYzQsIHNoZl92ZWM3LCBtaW51czVoLCBwbHVzMjBoLCBoel9yZXMzLCBoel9yZXMzKTsKKworICAgIFNSQVJJX1cyX1NXKGh6X3JlczAsIGh6X3JlczEsIDEwKTsKKyAgICBTQVRfU1cyX1NXKGh6X3JlczAsIGh6X3JlczEsIDcpOworICAgIFNSQVJJX1cyX1NXKGh6X3JlczIsIGh6X3JlczMsIDEwKTsKKyAgICBTQVRfU1cyX1NXKGh6X3JlczIsIGh6X3JlczMsIDcpOworCisgICAgZHN0MCA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzIsIDUpOworICAgIGRzdDEgPSBfX21zYV9zcmFyaV9oKHNoZl92ZWM1LCA1KTsKKyAgICBkc3QyID0gX19tc2Ffc3JhcmlfaChzaGZfdmVjNiwgNSk7CisgICAgZHN0MyA9IF9fbXNhX3NyYXJpX2goc2hmX3ZlYzcsIDUpOworCisgICAgU0FUX1NIMl9TSChkc3QwLCBkc3QxLCA3KTsKKyAgICBTQVRfU0gyX1NIKGRzdDIsIGRzdDMsIDcpOworCisgICAgZHN0MCA9IF9fbXNhX2lsdm9kX2goemVyb3MsIGRzdDApOworICAgIGRzdDEgPSBfX21zYV9pbHZvZF9oKHplcm9zLCBkc3QxKTsKKyAgICBkc3QyID0gX19tc2FfaWx2b2RfaCh6ZXJvcywgZHN0Mik7CisgICAgZHN0MyA9IF9fbXNhX2lsdm9kX2goemVyb3MsIGRzdDMpOworCisgICAgaHpfcmVzMCA9IF9fbXNhX2F2ZXJfc193KGh6X3JlczAsICh2NGkzMikgZHN0MCk7CisgICAgaHpfcmVzMSA9IF9fbXNhX2F2ZXJfc193KGh6X3JlczEsICh2NGkzMikgZHN0MSk7CisgICAgaHpfcmVzMiA9IF9fbXNhX2F2ZXJfc193KGh6X3JlczIsICh2NGkzMikgZHN0Mik7CisgICAgaHpfcmVzMyA9IF9fbXNhX2F2ZXJfc193KGh6X3JlczMsICh2NGkzMikgZHN0Myk7CisKKyAgICBMVzQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0dik7CisgICAgUENLRVZfSDJfU0goaHpfcmVzMSwgaHpfcmVzMCwgaHpfcmVzMywgaHpfcmVzMiwgZHN0MCwgZHN0Mik7CisgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihkc3QwLCBkc3QyKTsKKyAgICBvdXQgPSBfX21zYV9hdmVyX3VfYihvdXQsIGRzdHYpOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDE2X21jMjJfbXNhKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICBhdmNfbHVtYV9taWRfYW5kX2F2ZXJfZHN0XzE2eDE2X21zYShzcmMgLSAoMiAqIHN0cmlkZSkgLSAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgZHN0LCBzdHJpZGUpOworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDAgPSAweGZmZmIwMDAxOworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDEgPSAweDE0MDAxNDsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QyID0gMHgxZmZmYjsKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdG1wID0gc3JjIC0gKDIgKiBzdHJpZGUpIC0gMjsKKyAgICB1aW50OF90ICpkc3RfdG1wID0gZHN0OworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB1aW50MzJfdCBtdWx0aXBsZThfY250LCBsb29wX2NudDsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxLCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCByZXMwLCByZXMxLCByZXMyLCByZXMzOworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfciwgaHpfb3V0MTBfbCwgaHpfb3V0MjFfbDsKKyAgICB2OGkxNiBoel9vdXQzMl9sLCBoel9vdXQ0M19sLCBoel9vdXQ1NF9sLCBoel9vdXQ2NV9sLCBoel9vdXQ3Nl9sOworICAgIHY4aTE2IGh6X291dDg3X2wsIGZpbHQwLCBmaWx0MSwgZmlsdDI7CisgICAgdjRpMzIgdG1wMCwgdG1wMTsKKworICAgIGZpbHQwID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDApOworICAgIGZpbHQxID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDEpOworICAgIGZpbHQyID0gKHY4aTE2KSBfX21zYV9maWxsX3coZmlsdF9jb25zdDIpOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzBdLCAxNiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisKKyAgICBmb3IgKG11bHRpcGxlOF9jbnQgPSAyOyBtdWx0aXBsZThfY250LS07KSB7CisgICAgICAgIHNyYyA9IHNyY190bXA7CisgICAgICAgIGRzdCA9IGRzdF90bXA7CisKKyAgICAgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICAgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgICAgIHNyYyArPSAoNSAqIHN0cmlkZSk7CisKKyAgICAgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgaHpfb3V0MSA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgaHpfb3V0MiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgaHpfb3V0NCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgICAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIGh6X291dDUgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBoel9vdXQ2ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgICAgICAgaHpfb3V0NyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICAgICAgICAgIGh6X291dDggPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgICAgICAgICBJTFZSX0g0X1NIKGh6X291dDEsIGh6X291dDAsIGh6X291dDIsIGh6X291dDEsIGh6X291dDMsIGh6X291dDIsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQsIGh6X291dDMsIGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDQzX3IpOworICAgICAgICAgICAgSUxWTF9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0LCBoel9vdXQzLCBoel9vdXQxMF9sLCBoel9vdXQyMV9sLCBoel9vdXQzMl9sLAorICAgICAgICAgICAgICAgICAgICAgICBoel9vdXQ0M19sKTsKKyAgICAgICAgICAgIElMVlJfSDRfU0goaHpfb3V0NSwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0NywgaHpfb3V0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0OCwgaHpfb3V0NywgaHpfb3V0NTRfciwgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwKKyAgICAgICAgICAgICAgICAgICAgICAgaHpfb3V0ODdfcik7CisgICAgICAgICAgICBJTFZMX0g0X1NIKGh6X291dDUsIGh6X291dDQsIGh6X291dDYsIGh6X291dDUsIGh6X291dDcsIGh6X291dDYsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDgsIGh6X291dDcsIGh6X291dDU0X2wsIGh6X291dDY1X2wsIGh6X291dDc2X2wsCisgICAgICAgICAgICAgICAgICAgICAgIGh6X291dDg3X2wpOworCisgICAgICAgICAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MTBfciwgaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQxMF9sLCBoel9vdXQzMl9sLCBoel9vdXQ1NF9sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgcmVzMCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgICAgICAgICAgdG1wMCA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX3IsIGh6X291dDQzX3IsIGh6X291dDY1X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICB0bXAxID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NjVfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHJlczEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICAgICAgICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQzMl9yLCBoel9vdXQ1NF9yLCBoel9vdXQ3Nl9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX2wsIGh6X291dDU0X2wsIGh6X291dDc2X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0Mik7CisgICAgICAgICAgICByZXMyID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIHRtcDEsICh2OGkxNikgdG1wMCk7CisgICAgICAgICAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyKTsKKyAgICAgICAgICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ0M19sLCBoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIpOworICAgICAgICAgICAgcmVzMyA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworCisgICAgICAgICAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgICAgICAgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICAgICAgICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczEpOworICAgICAgICAgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIocmVzMiwgcmVzMyk7CisgICAgICAgICAgICBBVkVSX1VCMl9VQihvdXQwLCBkc3QwLCBvdXQxLCBkc3QxLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisKKyAgICAgICAgICAgIGh6X291dDAgPSBoel9vdXQ0OworICAgICAgICAgICAgaHpfb3V0MSA9IGh6X291dDU7CisgICAgICAgICAgICBoel9vdXQyID0gaHpfb3V0NjsKKyAgICAgICAgICAgIGh6X291dDMgPSBoel9vdXQ3OworICAgICAgICAgICAgaHpfb3V0NCA9IGh6X291dDg7CisgICAgICAgIH0KKworICAgICAgICBzcmNfdG1wICs9IDg7CisgICAgICAgIGRzdF90bXAgKz0gODsKKyAgICB9CiB9CiAKIHZvaWQgZmZfYXZnX2gyNjRfcXBlbDhfbWMyMl9tc2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgYXZjX2x1bWFfbWlkX2FuZF9hdmVyX2RzdF84d19tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpZGUsIGRzdCwgc3RyaWRlLCA4KTsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QwID0gMHhmZmZiMDAwMTsKKyAgICBjb25zdCBpbnQzMl90IGZpbHRfY29uc3QxID0gMHgxNDAwMTQ7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MiA9IDB4MWZmZmI7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IG91dDAsIG91dDEsIGRzdDAgPSB7IDAgfSwgZHN0MSA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCBoel9vdXQ5LCBoel9vdXQxMCwgaHpfb3V0MTEsIGh6X291dDEyOworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfciwgaHpfb3V0ODlfciwgaHpfb3V0OTEwX3I7CisgICAgdjhpMTYgaHpfb3V0MTExMF9yLCBoel9vdXQxMjExX3IsIHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgICAgdjhpMTYgaHpfb3V0MTBfbCwgaHpfb3V0MjFfbCwgaHpfb3V0MzJfbCwgaHpfb3V0NDNfbCwgaHpfb3V0NTRfbDsKKyAgICB2OGkxNiBoel9vdXQ2NV9sLCBoel9vdXQ3Nl9sLCBoel9vdXQ4N19sLCBoel9vdXQ4OV9sLCBoel9vdXQ5MTBfbDsKKyAgICB2OGkxNiBoel9vdXQxMTEwX2wsIGh6X291dDEyMTFfbCwgZmlsdDAsIGZpbHQxLCBmaWx0MjsKKyAgICB2NGkzMiB0bXAwLCB0bXAxOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBMRF9TQjMoJmx1bWFfbWFza19hcnJbMF0sIDE2LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKworICAgIHNyYyAtPSAoKDIgKiBzdHJpZGUpICsgMik7CisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworCisgICAgaHpfb3V0MCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQxID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0MyA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ0ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBzcmMgKz0gKDQgKiBzdHJpZGUpOworICAgIGh6X291dDUgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0NiA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ3ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDggPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgSUxWUl9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLCBoel9vdXQ0LAorICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfcik7CisgICAgSUxWTF9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLCBoel9vdXQ0LAorICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0MTBfbCwgaHpfb3V0MjFfbCwgaHpfb3V0MzJfbCwgaHpfb3V0NDNfbCk7CisgICAgSUxWUl9INF9TSChoel9vdXQ1LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4LAorICAgICAgICAgICAgICAgaHpfb3V0NywgaHpfb3V0NTRfciwgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfcik7CisgICAgSUxWTF9INF9TSChoel9vdXQ1LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4LAorICAgICAgICAgICAgICAgaHpfb3V0NywgaHpfb3V0NTRfbCwgaHpfb3V0NjVfbCwgaHpfb3V0NzZfbCwgaHpfb3V0ODdfbCk7CisKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MTBfciwgaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDEwX2wsIGh6X291dDMyX2wsIGh6X291dDU0X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczAgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MjFfciwgaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX2wsIGh6X291dDQzX2wsIGh6X291dDY1X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgaHpfb3V0NzZfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDMyX2wsIGh6X291dDU0X2wsIGh6X291dDc2X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczIgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NDNfciwgaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDQzX2wsIGh6X291dDY1X2wsIGh6X291dDg3X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczMgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczEpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczIsIHJlczMpOworICAgIEFWRVJfVUIyX1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIGRzdDAsIGRzdDEpOworICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgc3RyaWRlKTsKKyAgICBkc3QgKz0gKDQgKiBzdHJpZGUpOworCisgICAgTERfU0I0KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBoel9vdXQ5ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDExID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDEyID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIElMVlJfSDRfU0goaHpfb3V0OSwgaHpfb3V0OCwgaHpfb3V0MTAsIGh6X291dDksIGh6X291dDExLCBoel9vdXQxMCwKKyAgICAgICAgICAgICAgIGh6X291dDEyLCBoel9vdXQxMSwgaHpfb3V0ODlfciwgaHpfb3V0OTEwX3IsIGh6X291dDExMTBfciwKKyAgICAgICAgICAgICAgIGh6X291dDEyMTFfcik7CisgICAgSUxWTF9INF9TSChoel9vdXQ5LCBoel9vdXQ4LCBoel9vdXQxMCwgaHpfb3V0OSwgaHpfb3V0MTEsIGh6X291dDEwLAorICAgICAgICAgICAgICAgaHpfb3V0MTIsIGh6X291dDExLCBoel9vdXQ4OV9sLCBoel9vdXQ5MTBfbCwgaHpfb3V0MTExMF9sLAorICAgICAgICAgICAgICAgaHpfb3V0MTIxMV9sKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NTRfciwgaHpfb3V0NzZfciwgaHpfb3V0ODlfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDU0X2wsIGh6X291dDc2X2wsIGh6X291dDg5X2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczAgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0NjVfciwgaHpfb3V0ODdfciwgaHpfb3V0OTEwX3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ2NV9sLCBoel9vdXQ4N19sLCBoel9vdXQ5MTBfbCwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgcmVzMSA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSB0bXAxLCAodjhpMTYpIHRtcDApOworICAgIHRtcDAgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ3Nl9yLCBoel9vdXQ4OV9yLCBoel9vdXQxMTEwX3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHRtcDEgPSBBVkNfRE9UX1NXM19TVyhoel9vdXQ3Nl9sLCBoel9vdXQ4OV9sLCBoel9vdXQxMTEwX2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczIgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0ODdfciwgaHpfb3V0OTEwX3IsIGh6X291dDEyMTFfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDg3X2wsIGh6X291dDkxMF9sLCBoel9vdXQxMjExX2wsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczMgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICBMRDQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczEpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczIsIHJlczMpOworICAgIEFWRVJfVUIyX1VCKG91dDAsIGRzdDAsIG91dDEsIGRzdDEsIGRzdDAsIGRzdDEpOworICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgc3RyaWRlKTsKIH0KIAogdm9pZCBmZl9hdmdfaDI2NF9xcGVsNF9tYzIyX21zYSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKLSAgICBhdmNfbHVtYV9taWRfYW5kX2F2ZXJfZHN0XzR4NF9tc2Eoc3JjIC0gKDIgKiBzdHJpZGUpIC0gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWRlLCBkc3QsIHN0cmlkZSk7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MCA9IDB4ZmZmYjAwMDE7CisgICAgY29uc3QgaW50MzJfdCBmaWx0X2NvbnN0MSA9IDB4MTQwMDE0OworICAgIGNvbnN0IGludDMyX3QgZmlsdF9jb25zdDIgPSAweDFmZmZiOworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCByZXMsIGRzdDAgPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazI7CisgICAgdjhpMTYgaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NjsKKyAgICB2OGkxNiBoel9vdXQ3LCBoel9vdXQ4LCByZXMwLCByZXMxLCBmaWx0MCwgZmlsdDEsIGZpbHQyOworICAgIHY4aTE2IGh6X291dDEwX3IsIGh6X291dDIxX3IsIGh6X291dDMyX3IsIGh6X291dDQzX3IsIGh6X291dDU0X3I7CisgICAgdjhpMTYgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfcjsKKyAgICB2NGkzMiB0bXAwLCB0bXAxOworCisgICAgTERfU0IzKCZsdW1hX21hc2tfYXJyWzQ4XSwgMTYsIG1hc2swLCBtYXNrMSwgbWFzazIpOworCisgICAgZmlsdDAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MCk7CisgICAgZmlsdDEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0MSk7CisgICAgZmlsdDIgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhmaWx0X2NvbnN0Mik7CisKKyAgICBzcmMgLT0gKCgyICogc3RyaWRlKSArIDIpOworCisgICAgTERfU0I1KHNyYywgc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzdHJpZGUpOworICAgIExEX1NCNChzcmMsIHN0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKyAgICBoel9vdXQwID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDIgPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgaHpfb3V0NCA9IEFWQ19IT1JaX0ZJTFRFUl9TSChzcmM0LCBzcmM1LCBtYXNrMCwgbWFzazEsIG1hc2syKTsKKyAgICBoel9vdXQ2ID0gQVZDX0hPUlpfRklMVEVSX1NIKHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIGh6X291dDggPSBBVkNfSE9SWl9GSUxURVJfU0goc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgUENLT0RfRDJfU0goaHpfb3V0MCwgaHpfb3V0MCwgaHpfb3V0MiwgaHpfb3V0MiwgaHpfb3V0MSwgaHpfb3V0Myk7CisgICAgUENLT0RfRDJfU0goaHpfb3V0NCwgaHpfb3V0NCwgaHpfb3V0NiwgaHpfb3V0NiwgaHpfb3V0NSwgaHpfb3V0Nyk7CisgICAgSUxWUl9INF9TSChoel9vdXQxLCBoel9vdXQwLCBoel9vdXQyLCBoel9vdXQxLCBoel9vdXQzLCBoel9vdXQyLCBoel9vdXQ0LAorICAgICAgICAgICAgICAgaHpfb3V0MywgaHpfb3V0MTBfciwgaHpfb3V0MjFfciwgaHpfb3V0MzJfciwgaHpfb3V0NDNfcik7CisgICAgSUxWUl9INF9TSChoel9vdXQ1LCBoel9vdXQ0LCBoel9vdXQ2LCBoel9vdXQ1LCBoel9vdXQ3LCBoel9vdXQ2LCBoel9vdXQ4LAorICAgICAgICAgICAgICAgaHpfb3V0NywgaHpfb3V0NTRfciwgaHpfb3V0NjVfciwgaHpfb3V0NzZfciwgaHpfb3V0ODdfcik7CisKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MTBfciwgaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDIxX3IsIGh6X291dDQzX3IsIGh6X291dDY1X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczAgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICB0bXAwID0gQVZDX0RPVF9TVzNfU1coaHpfb3V0MzJfciwgaHpfb3V0NTRfciwgaHpfb3V0NzZfciwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Mik7CisgICAgdG1wMSA9IEFWQ19ET1RfU1czX1NXKGh6X291dDQzX3IsIGh6X291dDY1X3IsIGh6X291dDg3X3IsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIpOworICAgIHJlczEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgdG1wMSwgKHY4aTE2KSB0bXAwKTsKKyAgICBMVzQoZHN0LCBzdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MCk7CisgICAgcmVzID0gUENLRVZfWE9SSTEyOF9VQihyZXMwLCByZXMxKTsKKyAgICByZXMgPSBfX21zYV9hdmVyX3VfYihyZXMsIGRzdDApOworICAgIFNUNHg0X1VCKHJlcywgcmVzLCAwLCAxLCAyLCAzLCBkc3QsIHN0cmlkZSk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaGV2Y19pZGN0X21zYS5jIGIvbGliYXZjb2RlYy9taXBzL2hldmNfaWRjdF9tc2EuYwppbmRleCA5NzVkOTFmLi4wOTQzMTE5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaGV2Y19pZGN0X21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oZXZjX2lkY3RfbXNhLmMKQEAgLTIxLDE4ICsyMSwxOCBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL2dlbmVyaWNfbWFjcm9zX21zYS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvbWlwcy9oZXZjZHNwX21pcHMuaCIKIAotc3RhdGljIGNvbnN0IGludDE2X3QgZ3Q4eDhfY25zdFsxNl0gPSB7CitzdGF0aWMgY29uc3QgaW50MTZfdCBndDh4OF9jbnN0WzE2XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNjQpKSkgPSB7CiAgICAgNjQsIDY0LCA4MywgMzYsIDg5LCA1MCwgMTgsIDc1LCA2NCwgLTY0LCAzNiwgLTgzLCA3NSwgLTg5LCAtNTAsIC0xOAogfTsKIAotc3RhdGljIGNvbnN0IGludDE2X3QgZ3QxNngxNl9jbnN0WzY0XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGd0MTZ4MTZfY25zdFs2NF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDY0KSkpID0gewogICAgIDY0LCA4MywgNjQsIDM2LCA4OSwgNzUsIDUwLCAxOCwgOTAsIDgwLCA1NywgMjUsIDcwLCA4NywgOSwgNDMsCiAgICAgNjQsIDM2LCAtNjQsIC04MywgNzUsIC0xOCwgLTg5LCAtNTAsIDg3LCA5LCAtODAsIC03MCwgLTQzLCA1NywgLTI1LCAtOTAsCiAgICAgNjQsIC0zNiwgLTY0LCA4MywgNTAsIC04OSwgMTgsIDc1LCA4MCwgLTcwLCAtMjUsIDkwLCAtODcsIDksIDQzLCA1NywKICAgICA2NCwgLTgzLCA2NCwgLTM2LCAxOCwgLTUwLCA3NSwgLTg5LCA3MCwgLTg3LCA5MCwgLTgwLCA5LCAtNDMsIC01NywgMjUKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQxNl90IGd0MzJ4MzJfY25zdDBbMjU2XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGd0MzJ4MzJfY25zdDBbMjU2XSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNjQpKSkgPSB7CiAgICAgOTAsIDkwLCA4OCwgODUsIDgyLCA3OCwgNzMsIDY3LCA2MSwgNTQsIDQ2LCAzOCwgMzEsIDIyLCAxMywgNCwKICAgICA5MCwgODIsIDY3LCA0NiwgMjIsIC00LCAtMzEsIC01NCwgLTczLCAtODUsIC05MCwgLTg4LCAtNzgsIC02MSwgLTM4LCAtMTMsCiAgICAgODgsIDY3LCAzMSwgLTEzLCAtNTQsIC04MiwgLTkwLCAtNzgsIC00NiwgLTQsIDM4LCA3MywgOTAsIDg1LCA2MSwgMjIsCkBAIC01MSwyMSArNTEsMTcgQEAKICAgICA0LCAtMTMsIDIyLCAtMzEsIDM4LCAtNDYsIDU0LCAtNjEsIDY3LCAtNzMsIDc4LCAtODIsIDg1LCAtODgsIDkwLCAtOTAKIH07CiAKLXN0YXRpYyBjb25zdCBpbnQxNl90IGd0MzJ4MzJfY25zdDFbNjRdID0geworc3RhdGljIGNvbnN0IGludDE2X3QgZ3QzMngzMl9jbnN0MVs2NF0gX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKDY0KSkpID0gewogICAgIDkwLCA4NywgODAsIDcwLCA1NywgNDMsIDI1LCA5LCA4NywgNTcsIDksIC00MywgLTgwLCAtOTAsIC03MCwgLTI1LAogICAgIDgwLCA5LCAtNzAsIC04NywgLTI1LCA1NywgOTAsIDQzLCA3MCwgLTQzLCAtODcsIDksIDkwLCAyNSwgLTgwLCAtNTcsCiAgICAgNTcsIC04MCwgLTI1LCA5MCwgLTksIC04NywgNDMsIDcwLCA0MywgLTkwLCA1NywgMjUsIC04NywgNzAsIDksIC04MCwKICAgICAyNSwgLTcwLCA5MCwgLTgwLCA0MywgOSwgLTU3LCA4NywgOSwgLTI1LCA0MywgLTU3LCA3MCwgLTgwLCA4NywgLTkwCiB9OwogCi1zdGF0aWMgY29uc3QgaW50MTZfdCBndDMyeDMyX2Nuc3QyWzE2XSA9IHsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGd0MzJ4MzJfY25zdDJbMTZdIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg2NCkpKSA9IHsKICAgICA4OSwgNzUsIDUwLCAxOCwgNzUsIC0xOCwgLTg5LCAtNTAsIDUwLCAtODksIDE4LCA3NSwgMTgsIC01MCwgNzUsIC04OQogfTsKIAotc3RhdGljIGNvbnN0IGludDE2X3QgZ3QzMngzMl9jbnN0M1sxNl0gPSB7Ci0gICAgNjQsIDY0LCA2NCwgNjQsIDgzLCAzNiwgLTM2LCAtODMsIDY0LCAtNjQsIC02NCwgNjQsIDM2LCAtODMsIDgzLCAtMzYKLX07Ci0KICNkZWZpbmUgSEVWQ19JRENUNHg0X0NPTChpbl9yMCwgaW5fbDAsIGluX3IxLCBpbl9sMSwgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgIHN1bTAsIHN1bTEsIHN1bTIsIHN1bTMsIHNoaWZ0KSAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMyMywxNCArMzE5LDE4IEBACiAgICAgSEVWQ19JRENUNHg0X0NPTChpbl9yMCwgaW5fbDAsIGluX3IxLCBpbl9sMSwgc3VtMCwgc3VtMSwgc3VtMiwgc3VtMywgNyk7CiAgICAgVFJBTlNQT1NFNHg0X1NXX1NXKHN1bTAsIHN1bTEsIHN1bTIsIHN1bTMsIGluX3IwLCBpbl9sMCwgaW5fcjEsIGluX2wxKTsKICAgICBIRVZDX0lEQ1Q0eDRfQ09MKGluX3IwLCBpbl9sMCwgaW5fcjEsIGluX2wxLCBzdW0wLCBzdW0xLCBzdW0yLCBzdW0zLCAxMik7Ci0gICAgVFJBTlNQT1NFNHg0X1NXX1NXKHN1bTAsIHN1bTEsIHN1bTIsIHN1bTMsIHN1bTAsIHN1bTEsIHN1bTIsIHN1bTMpOwotICAgIFBDS0VWX0gyX1NIKHN1bTEsIHN1bTAsIHN1bTMsIHN1bTIsIGluMCwgaW4xKTsKKworICAgIC8qIFBhY2sgYW5kIHRyYW5zcG9zZSAqLworICAgIFBDS0VWX0gyX1NIKHN1bTIsIHN1bTAsIHN1bTMsIHN1bTEsIGluMCwgaW4xKTsKKyAgICBJTFZSTF9IMl9TVyhpbjEsIGluMCwgc3VtMCwgc3VtMSk7CisgICAgSUxWUkxfVzJfU0goc3VtMSwgc3VtMCwgaW4wLCBpbjEpOworCiAgICAgU1RfU0gyKGluMCwgaW4xLCBjb2VmZnMsIDgpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2lkY3RfOHg4X21zYShpbnQxNl90ICpjb2VmZnMpCiB7Ci0gICAgaW50MTZfdCAqZmlsdGVyID0gJmd0OHg4X2Nuc3RbMF07CisgICAgY29uc3QgaW50MTZfdCAqZmlsdGVyID0gJmd0OHg4X2Nuc3RbMF07CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CiAKICAgICBMRF9TSDgoY29lZmZzLCA4LCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7CkBAIC0zNDksNyArMzQ5LDcgQEAKICAgICBpbnQxNl90IGJ1ZlsyNTZdOwogICAgIGludDE2X3QgKmJ1Zl9wdHIgPSAmYnVmWzBdOwogICAgIGludDE2X3QgKnNyYyA9IGNvZWZmczsKLSAgICBpbnQxNl90ICpmaWx0ZXIgPSAmZ3QxNngxNl9jbnN0WzBdOworICAgIGNvbnN0IGludDE2X3QgKmZpbHRlciA9ICZndDE2eDE2X2Nuc3RbMF07CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CiAgICAgdjhpMTYgaW44LCBpbjksIGluMTAsIGluMTEsIGluMTIsIGluMTMsIGluMTQsIGluMTU7CiAgICAgdjhpMTYgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKQEAgLTQyOSwzMCArNDI5LDM4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm91bmQpCiB7CiAgICAgdWludDhfdCBpOwotICAgIGludDE2X3QgKmZpbHRlcl9wdHIwID0gJmd0MzJ4MzJfY25zdDBbMF07Ci0gICAgaW50MTZfdCAqZmlsdGVyX3B0cjEgPSAmZ3QzMngzMl9jbnN0MVswXTsKLSAgICBpbnQxNl90ICpmaWx0ZXJfcHRyMiA9ICZndDMyeDMyX2Nuc3QyWzBdOwotICAgIGludDE2X3QgKmZpbHRlcl9wdHIzID0gJmd0MzJ4MzJfY25zdDNbMF07CisgICAgY29uc3QgaW50MTZfdCAqZmlsdGVyX3B0cjAgPSAmZ3QzMngzMl9jbnN0MFswXTsKKyAgICBjb25zdCBpbnQxNl90ICpmaWx0ZXJfcHRyMSA9ICZndDMyeDMyX2Nuc3QxWzBdOworICAgIGNvbnN0IGludDE2X3QgKmZpbHRlcl9wdHIyID0gJmd0MzJ4MzJfY25zdDJbMF07CisgICAgY29uc3QgaW50MTZfdCAqZmlsdGVyX3B0cjMgPSAmZ3Q4eDhfY25zdFswXTsKICAgICBpbnQxNl90ICpzcmMwID0gKGNvZWZmcyArIGJ1Zl9waXRjaCk7CiAgICAgaW50MTZfdCAqc3JjMSA9IChjb2VmZnMgKyAyICogYnVmX3BpdGNoKTsKICAgICBpbnQxNl90ICpzcmMyID0gKGNvZWZmcyArIDQgKiBidWZfcGl0Y2gpOwogICAgIGludDE2X3QgKnNyYzMgPSAoY29lZmZzKTsKICAgICBpbnQzMl90IGNuc3QwLCBjbnN0MTsKLSAgICBpbnQzMl90IHRtcF9idWZbOCAqIDMyXTsKLSAgICBpbnQzMl90ICp0bXBfYnVmX3B0ciA9ICZ0bXBfYnVmWzBdOworICAgIGludDMyX3QgdG1wX2J1Zls4ICogMzIgKyAxNV07CisgICAgaW50MzJfdCAqdG1wX2J1Zl9wdHIgPSB0bXBfYnVmICsgMTU7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CiAgICAgdjhpMTYgc3JjMF9yLCBzcmMxX3IsIHNyYzJfciwgc3JjM19yLCBzcmM0X3IsIHNyYzVfciwgc3JjNl9yLCBzcmM3X3I7CiAgICAgdjhpMTYgc3JjMF9sLCBzcmMxX2wsIHNyYzJfbCwgc3JjM19sLCBzcmM0X2wsIHNyYzVfbCwgc3JjNl9sLCBzcmM3X2w7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHRlcjAsIGZpbHRlcjEsIGZpbHRlcjIsIGZpbHRlcjM7CiAgICAgdjRpMzIgc3VtMF9yLCBzdW0wX2wsIHN1bTFfciwgc3VtMV9sLCB0bXAwX3IsIHRtcDBfbCwgdG1wMV9yLCB0bXAxX2w7CiAKKyAgICAvKiBBbGlnbiBwb2ludGVyIHRvIDY0IGJ5dGUgYm91bmRhcnkgKi8KKyAgICB0bXBfYnVmX3B0ciA9IChpbnQzMl90ICopKCgodWludHB0cl90KSB0bXBfYnVmX3B0cikgJiB+KHVpbnRwdHJfdCkgNjMpOworCiAgICAgLyogcHJvY2VzcyBjb2VmZiA0LCAxMiwgMjAsIDI4ICovCiAgICAgTERfU0g0KHNyYzIsIDggKiBidWZfcGl0Y2gsIGluMCwgaW4xLCBpbjIsIGluMyk7CiAgICAgSUxWUl9IMl9TSChpbjEsIGluMCwgaW4zLCBpbjIsIHNyYzBfciwgc3JjMV9yKTsKICAgICBJTFZMX0gyX1NIKGluMSwgaW4wLCBpbjMsIGluMiwgc3JjMF9sLCBzcmMxX2wpOwogCisgICAgTERfU0gyKHNyYzMsIDE2ICogYnVmX3BpdGNoLCBpbjQsIGluNik7CisgICAgTERfU0gyKChzcmMzICsgOCAqIGJ1Zl9waXRjaCksIDE2ICogYnVmX3BpdGNoLCBpbjUsIGluNyk7CisgICAgSUxWUl9IMl9TSChpbjYsIGluNCwgaW43LCBpbjUsIHNyYzJfciwgc3JjM19yKTsKKyAgICBJTFZMX0gyX1NIKGluNiwgaW40LCBpbjcsIGluNSwgc3JjMl9sLCBzcmMzX2wpOworCiAgICAgLyogbG9vcCBmb3IgYWxsIGNvbHVtbnMgb2YgY29uc3RhbnRzICovCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgLyogcHJvY2Vzc2luZyBzaW5nbGUgY29sdW1uIG9mIGNvbnN0YW50cyAqLwogICAgICAgICBjbnN0MCA9IExXKGZpbHRlcl9wdHIyKTsKICAgICAgICAgY25zdDEgPSBMVyhmaWx0ZXJfcHRyMiArIDIpOwpAQCAtNDYyLDM3ICs0NzAsMzkgQEAKIAogICAgICAgICBET1RQX1NIMl9TVyhzcmMwX3IsIHNyYzBfbCwgZmlsdGVyMCwgZmlsdGVyMCwgc3VtMF9yLCBzdW0wX2wpOwogICAgICAgICBEUEFERF9TSDJfU1coc3JjMV9yLCBzcmMxX2wsIGZpbHRlcjEsIGZpbHRlcjEsIHN1bTBfciwgc3VtMF9sKTsKLSAgICAgICAgU1RfU1cyKHN1bTBfciwgc3VtMF9sLCAodG1wX2J1Zl9wdHIgKyBpICogOCksIDQpOworICAgICAgICBTVF9TVzIoc3VtMF9yLCBzdW0wX2wsICh0bXBfYnVmX3B0ciArIDIgKiBpICogOCksIDQpOwogCi0gICAgICAgIGZpbHRlcl9wdHIyICs9IDQ7Ci0gICAgfQotCi0gICAgLyogcHJvY2VzcyBjb2VmZiAwLCA4LCAxNiwgMjQgKi8KLSAgICBMRF9TSDIoc3JjMywgMTYgKiBidWZfcGl0Y2gsIGluMCwgaW4yKTsKLSAgICBMRF9TSDIoKHNyYzMgKyA4ICogYnVmX3BpdGNoKSwgMTYgKiBidWZfcGl0Y2gsIGluMSwgaW4zKTsKLQotICAgIElMVlJfSDJfU0goaW4yLCBpbjAsIGluMywgaW4xLCBzcmMwX3IsIHNyYzFfcik7Ci0gICAgSUxWTF9IMl9TSChpbjIsIGluMCwgaW4zLCBpbjEsIHNyYzBfbCwgc3JjMV9sKTsKLQotICAgIC8qIGxvb3AgZm9yIGFsbCBjb2x1bW5zIG9mIGNvbnN0YW50cyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgLyogcHJvY2Vzc2luZyBmaXJzdCBjb2x1bW4gb2YgZmlsdGVyIGNvbnN0YW50cyAqLwotICAgICAgICBjbnN0MCA9IExXKGZpbHRlcl9wdHIzKTsKLSAgICAgICAgY25zdDEgPSBMVyhmaWx0ZXJfcHRyMyArIDQpOworICAgICAgICAvKiBwcm9jZXNzaW5nIHNpbmdsZSBjb2x1bW4gb2YgY29uc3RhbnRzICovCisgICAgICAgIGNuc3QwID0gTFcoZmlsdGVyX3B0cjIgKyA0KTsKKyAgICAgICAgY25zdDEgPSBMVyhmaWx0ZXJfcHRyMiArIDYpOwogCiAgICAgICAgIGZpbHRlcjAgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhjbnN0MCk7CiAgICAgICAgIGZpbHRlcjEgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyhjbnN0MSk7CiAKLSAgICAgICAgRE9UUF9TSDRfU1coc3JjMF9yLCBzcmMwX2wsIHNyYzFfciwgc3JjMV9sLCBmaWx0ZXIwLCBmaWx0ZXIwLCBmaWx0ZXIxLAorICAgICAgICBET1RQX1NIMl9TVyhzcmMwX3IsIHNyYzBfbCwgZmlsdGVyMCwgZmlsdGVyMCwgc3VtMF9yLCBzdW0wX2wpOworICAgICAgICBEUEFERF9TSDJfU1coc3JjMV9yLCBzcmMxX2wsIGZpbHRlcjEsIGZpbHRlcjEsIHN1bTBfciwgc3VtMF9sKTsKKyAgICAgICAgU1RfU1cyKHN1bTBfciwgc3VtMF9sLCAodG1wX2J1Zl9wdHIgKyAoMiAqIGkgKyAxKSAqIDgpLCA0KTsKKworICAgICAgICBmaWx0ZXJfcHRyMiArPSA4OworICAgIH0KKworICAgIC8qIHByb2Nlc3MgY29lZmYgMCwgOCwgMTYsIDI0ICovCisgICAgLyogbG9vcCBmb3IgYWxsIGNvbHVtbnMgb2YgY29uc3RhbnRzICovCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAvKiBwcm9jZXNzaW5nIGZpcnN0IGNvbHVtbiBvZiBmaWx0ZXIgY29uc3RhbnRzICovCisgICAgICAgIGNuc3QwID0gTFcoZmlsdGVyX3B0cjMpOworICAgICAgICBjbnN0MSA9IExXKGZpbHRlcl9wdHIzICsgMik7CisKKyAgICAgICAgZmlsdGVyMCA9ICh2OGkxNikgX19tc2FfZmlsbF93KGNuc3QwKTsKKyAgICAgICAgZmlsdGVyMSA9ICh2OGkxNikgX19tc2FfZmlsbF93KGNuc3QxKTsKKworICAgICAgICBET1RQX1NINF9TVyhzcmMyX3IsIHNyYzJfbCwgc3JjM19yLCBzcmMzX2wsIGZpbHRlcjAsIGZpbHRlcjAsIGZpbHRlcjEsCiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcjEsIHN1bTBfciwgc3VtMF9sLCB0bXAxX3IsIHRtcDFfbCk7CiAKLSAgICAgICAgc3VtMV9yID0gc3VtMF9yOwotICAgICAgICBzdW0xX2wgPSBzdW0wX2w7Ci0gICAgICAgIHN1bTBfciArPSB0bXAxX3I7Ci0gICAgICAgIHN1bTBfbCArPSB0bXAxX2w7Ci0KLSAgICAgICAgc3VtMV9yIC09IHRtcDFfcjsKLSAgICAgICAgc3VtMV9sIC09IHRtcDFfbDsKKyAgICAgICAgc3VtMV9yID0gc3VtMF9yIC0gdG1wMV9yOworICAgICAgICBzdW0xX2wgPSBzdW0wX2wgLSB0bXAxX2w7CisgICAgICAgIHN1bTBfciA9IHN1bTBfciArIHRtcDFfcjsKKyAgICAgICAgc3VtMF9sID0gc3VtMF9sICsgdG1wMV9sOwogCiAgICAgICAgIEhFVkNfRVZFTjE2X0NBTEModG1wX2J1Zl9wdHIsIHN1bTBfciwgc3VtMF9sLCBpLCAoNyAtIGkpKTsKICAgICAgICAgSEVWQ19FVkVOMTZfQ0FMQyh0bXBfYnVmX3B0ciwgc3VtMV9yLCBzdW0xX2wsICgzIC0gaSksICg0ICsgaSkpOwpAQCAtNjE4LDExICs2MjgsMTQgQEAKIHsKICAgICB1aW50OF90IHJvd19jbnQsIGNvbF9jbnQ7CiAgICAgaW50MTZfdCAqc3JjID0gY29lZmZzOwotICAgIGludDE2X3QgdG1wX2J1Zls4ICogMzJdOwotICAgIGludDE2X3QgKnRtcF9idWZfcHRyID0gJnRtcF9idWZbMF07CisgICAgaW50MTZfdCB0bXBfYnVmWzggKiAzMiArIDMxXTsKKyAgICBpbnQxNl90ICp0bXBfYnVmX3B0ciA9IHRtcF9idWYgKyAzMTsKICAgICB1aW50OF90IHJvdW5kOwogICAgIHVpbnQ4X3QgYnVmX3BpdGNoOwogCisgICAgLyogQWxpZ24gcG9pbnRlciB0byA2NCBieXRlIGJvdW5kYXJ5ICovCisgICAgdG1wX2J1Zl9wdHIgPSAoaW50MTZfdCAqKSgoKHVpbnRwdHJfdCkgdG1wX2J1Zl9wdHIpICYgfih1aW50cHRyX3QpIDYzKTsKKwogICAgIC8qIGNvbHVtbiB0cmFuc2Zvcm0gKi8KICAgICByb3VuZCA9IDc7CiAgICAgYnVmX3BpdGNoID0gMzI7CkBAIC03NTgsMjEgKzc3MSwyMiBAQAogewogICAgIHVpbnQ4X3QgbG9vcF9jbnQ7CiAgICAgdWludDhfdCAqdGVtcF9kc3QgPSBkc3Q7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogICAgIHY4aTE2IGRzdF9yMCwgZHN0X2wwLCBkc3RfcjEsIGRzdF9sMSwgZHN0X3IyLCBkc3RfbDIsIGRzdF9yMywgZHN0X2wzOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwogCi0gICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NINChjb2VmZnMsIDE2LCBpbjAsIGluMiwgaW40LCBpbjYpOwotICAgICAgICBMRF9TSDQoKGNvZWZmcyArIDgpLCAxNiwgaW4xLCBpbjMsIGluNSwgaW43KTsKLSAgICAgICAgY29lZmZzICs9IDY0OwotICAgICAgICBMRF9VQjQodGVtcF9kc3QsIHN0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIHRlbXBfZHN0ICs9ICg0ICogc3RyaWRlKTsKKyAgICAvKiBQcmUtbG9hZCBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKyAgICBMRF9VQjQodGVtcF9kc3QsIHN0cmlkZSwgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgdGVtcF9kc3QgKz0gKDQgKiBzdHJpZGUpOworICAgIExEX1NINChjb2VmZnMsIDE2LCBpbjAsIGluMiwgaW40LCBpbjYpOworICAgIExEX1NINCgoY29lZmZzICsgOCksIDE2LCBpbjEsIGluMywgaW41LCBpbjcpOworICAgIGNvZWZmcyArPSA2NDsKIAotICAgICAgICBVTlBDS19VQl9TSChkc3QwLCBkc3RfcjAsIGRzdF9sMCk7Ci0gICAgICAgIFVOUENLX1VCX1NIKGRzdDEsIGRzdF9yMSwgZHN0X2wxKTsKLSAgICAgICAgVU5QQ0tfVUJfU0goZHN0MiwgZHN0X3IyLCBkc3RfbDIpOwotICAgICAgICBVTlBDS19VQl9TSChkc3QzLCBkc3RfcjMsIGRzdF9sMyk7CisgICAgZm9yIChsb29wX2NudCA9IDM7IGxvb3BfY250LS07KSB7CisgICAgICAgIFVOUENLX1VCX1NIKGRzdDQsIGRzdF9yMCwgZHN0X2wwKTsKKyAgICAgICAgVU5QQ0tfVUJfU0goZHN0NSwgZHN0X3IxLCBkc3RfbDEpOworICAgICAgICBVTlBDS19VQl9TSChkc3Q2LCBkc3RfcjIsIGRzdF9sMik7CisgICAgICAgIFVOUENLX1VCX1NIKGRzdDcsIGRzdF9yMywgZHN0X2wzKTsKIAogICAgICAgICBkc3RfcjAgKz0gaW4wOwogICAgICAgICBkc3RfbDAgKz0gaW4xOwpAQCAtNzgzLDYgKzc5NywxMyBAQAogICAgICAgICBkc3RfcjMgKz0gaW42OwogICAgICAgICBkc3RfbDMgKz0gaW43OwogCisgICAgICAgIC8qIFByZS1sb2FkIGZvciBuZXh0IGl0ZXJhdGlvbiAqLworICAgICAgICBMRF9VQjQodGVtcF9kc3QsIHN0cmlkZSwgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgIHRlbXBfZHN0ICs9ICg0ICogc3RyaWRlKTsKKyAgICAgICAgTERfU0g0KGNvZWZmcywgMTYsIGluMCwgaW4yLCBpbjQsIGluNik7CisgICAgICAgIExEX1NINCgoY29lZmZzICsgOCksIDE2LCBpbjEsIGluMywgaW41LCBpbjcpOworICAgICAgICBjb2VmZnMgKz0gNjQ7CisKICAgICAgICAgQ0xJUF9TSDRfMF8yNTUoZHN0X3IwLCBkc3RfbDAsIGRzdF9yMSwgZHN0X2wxKTsKICAgICAgICAgQ0xJUF9TSDRfMF8yNTUoZHN0X3IyLCBkc3RfbDIsIGRzdF9yMywgZHN0X2wzKTsKICAgICAgICAgUENLRVZfQjRfVUIoZHN0X2wwLCBkc3RfcjAsIGRzdF9sMSwgZHN0X3IxLCBkc3RfbDIsIGRzdF9yMiwgZHN0X2wzLApAQCAtNzkwLDI1ICs4MTEsNTAgQEAKICAgICAgICAgU1RfVUI0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdCwgc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogc3RyaWRlKTsKICAgICB9CisKKyAgICBVTlBDS19VQl9TSChkc3Q0LCBkc3RfcjAsIGRzdF9sMCk7CisgICAgVU5QQ0tfVUJfU0goZHN0NSwgZHN0X3IxLCBkc3RfbDEpOworICAgIFVOUENLX1VCX1NIKGRzdDYsIGRzdF9yMiwgZHN0X2wyKTsKKyAgICBVTlBDS19VQl9TSChkc3Q3LCBkc3RfcjMsIGRzdF9sMyk7CisKKyAgICBkc3RfcjAgKz0gaW4wOworICAgIGRzdF9sMCArPSBpbjE7CisgICAgZHN0X3IxICs9IGluMjsKKyAgICBkc3RfbDEgKz0gaW4zOworICAgIGRzdF9yMiArPSBpbjQ7CisgICAgZHN0X2wyICs9IGluNTsKKyAgICBkc3RfcjMgKz0gaW42OworICAgIGRzdF9sMyArPSBpbjc7CisKKyAgICBDTElQX1NINF8wXzI1NShkc3RfcjAsIGRzdF9sMCwgZHN0X3IxLCBkc3RfbDEpOworICAgIENMSVBfU0g0XzBfMjU1KGRzdF9yMiwgZHN0X2wyLCBkc3RfcjMsIGRzdF9sMyk7CisgICAgUENLRVZfQjRfVUIoZHN0X2wwLCBkc3RfcjAsIGRzdF9sMSwgZHN0X3IxLCBkc3RfbDIsIGRzdF9yMiwgZHN0X2wzLAorICAgICAgICAgICAgICAgIGRzdF9yMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgU1RfVUI0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdCwgc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19hZGRibGtfMzJ4MzJfbXNhKGludDE2X3QgKmNvZWZmcywgdWludDhfdCAqZHN0LCBpbnQzMl90IHN0cmlkZSkKIHsKICAgICB1aW50OF90IGxvb3BfY250OwogICAgIHVpbnQ4X3QgKnRlbXBfZHN0ID0gZHN0OwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKICAgICB2OGkxNiBkc3RfcjAsIGRzdF9sMCwgZHN0X3IxLCBkc3RfbDEsIGRzdF9yMiwgZHN0X2wyLCBkc3RfcjMsIGRzdF9sMzsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKIAotICAgIGZvciAobG9vcF9jbnQgPSA4OyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TSDQoY29lZmZzLCAzMiwgaW4wLCBpbjIsIGluNCwgaW42KTsKLSAgICAgICAgTERfU0g0KChjb2VmZnMgKyA4KSwgMzIsIGluMSwgaW4zLCBpbjUsIGluNyk7Ci0gICAgICAgIExEX1VCNCh0ZW1wX2RzdCwgc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAvKiBQcmUtbG9hZCBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKyAgICBMRF9VQjIodGVtcF9kc3QsIDE2LCBkc3Q0LCBkc3Q1KTsKKyAgICB0ZW1wX2RzdCArPSBzdHJpZGU7CisgICAgTERfVUIyKHRlbXBfZHN0LCAxNiwgZHN0NiwgZHN0Nyk7CisgICAgdGVtcF9kc3QgKz0gc3RyaWRlOworICAgIExEX1NINChjb2VmZnMsIDE2LCBpbjAsIGluMiwgaW40LCBpbjYpOworICAgIExEX1NINCgoY29lZmZzICsgOCksIDE2LCBpbjEsIGluMywgaW41LCBpbjcpOworICAgIGNvZWZmcyArPSA2NDsKIAotICAgICAgICBVTlBDS19VQl9TSChkc3QwLCBkc3RfcjAsIGRzdF9sMCk7Ci0gICAgICAgIFVOUENLX1VCX1NIKGRzdDEsIGRzdF9yMSwgZHN0X2wxKTsKLSAgICAgICAgVU5QQ0tfVUJfU0goZHN0MiwgZHN0X3IyLCBkc3RfbDIpOwotICAgICAgICBVTlBDS19VQl9TSChkc3QzLCBkc3RfcjMsIGRzdF9sMyk7CisgICAgZm9yIChsb29wX2NudCA9IDE0OyBsb29wX2NudC0tOykgeworICAgICAgICBVTlBDS19VQl9TSChkc3Q0LCBkc3RfcjAsIGRzdF9sMCk7CisgICAgICAgIFVOUENLX1VCX1NIKGRzdDUsIGRzdF9yMSwgZHN0X2wxKTsKKyAgICAgICAgVU5QQ0tfVUJfU0goZHN0NiwgZHN0X3IyLCBkc3RfbDIpOworICAgICAgICBVTlBDS19VQl9TSChkc3Q3LCBkc3RfcjMsIGRzdF9sMyk7CiAKICAgICAgICAgZHN0X3IwICs9IGluMDsKICAgICAgICAgZHN0X2wwICs9IGluMTsKQEAgLTgxOSw0MCArODY1LDc3IEBACiAgICAgICAgIGRzdF9yMyArPSBpbjY7CiAgICAgICAgIGRzdF9sMyArPSBpbjc7CiAKLSAgICAgICAgQ0xJUF9TSDRfMF8yNTUoZHN0X3IwLCBkc3RfbDAsIGRzdF9yMSwgZHN0X2wxKTsKLSAgICAgICAgQ0xJUF9TSDRfMF8yNTUoZHN0X3IyLCBkc3RfbDIsIGRzdF9yMywgZHN0X2wzKTsKLSAgICAgICAgUENLRVZfQjRfVUIoZHN0X2wwLCBkc3RfcjAsIGRzdF9sMSwgZHN0X3IxLCBkc3RfbDIsIGRzdF9yMiwgZHN0X2wzLAotICAgICAgICAgICAgICAgICAgICBkc3RfcjMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBTVF9VQjQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBzdHJpZGUpOwotCi0gICAgICAgIExEX1NINCgoY29lZmZzICsgMTYpLCAzMiwgaW4wLCBpbjIsIGluNCwgaW42KTsKLSAgICAgICAgTERfU0g0KChjb2VmZnMgKyAyNCksIDMyLCBpbjEsIGluMywgaW41LCBpbjcpOwotICAgICAgICBjb2VmZnMgKz0gMTI4OwotICAgICAgICBMRF9VQjQoKHRlbXBfZHN0ICsgMTYpLCBzdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICB0ZW1wX2RzdCArPSAoNCAqIHN0cmlkZSk7Ci0KLSAgICAgICAgVU5QQ0tfVUJfU0goZHN0MCwgZHN0X3IwLCBkc3RfbDApOwotICAgICAgICBVTlBDS19VQl9TSChkc3QxLCBkc3RfcjEsIGRzdF9sMSk7Ci0gICAgICAgIFVOUENLX1VCX1NIKGRzdDIsIGRzdF9yMiwgZHN0X2wyKTsKLSAgICAgICAgVU5QQ0tfVUJfU0goZHN0MywgZHN0X3IzLCBkc3RfbDMpOwotCi0gICAgICAgIGRzdF9yMCArPSBpbjA7Ci0gICAgICAgIGRzdF9sMCArPSBpbjE7Ci0gICAgICAgIGRzdF9yMSArPSBpbjI7Ci0gICAgICAgIGRzdF9sMSArPSBpbjM7Ci0gICAgICAgIGRzdF9yMiArPSBpbjQ7Ci0gICAgICAgIGRzdF9sMiArPSBpbjU7Ci0gICAgICAgIGRzdF9yMyArPSBpbjY7Ci0gICAgICAgIGRzdF9sMyArPSBpbjc7CisgICAgICAgIC8qIFByZS1sb2FkIGZvciBuZXh0IGl0ZXJhdGlvbiAqLworICAgICAgICBMRF9VQjIodGVtcF9kc3QsIDE2LCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgdGVtcF9kc3QgKz0gc3RyaWRlOworICAgICAgICBMRF9VQjIodGVtcF9kc3QsIDE2LCBkc3Q2LCBkc3Q3KTsKKyAgICAgICAgdGVtcF9kc3QgKz0gc3RyaWRlOworICAgICAgICBMRF9TSDQoY29lZmZzLCAxNiwgaW4wLCBpbjIsIGluNCwgaW42KTsKKyAgICAgICAgTERfU0g0KChjb2VmZnMgKyA4KSwgMTYsIGluMSwgaW4zLCBpbjUsIGluNyk7CisgICAgICAgIGNvZWZmcyArPSA2NDsKIAogICAgICAgICBDTElQX1NINF8wXzI1NShkc3RfcjAsIGRzdF9sMCwgZHN0X3IxLCBkc3RfbDEpOwogICAgICAgICBDTElQX1NINF8wXzI1NShkc3RfcjIsIGRzdF9sMiwgZHN0X3IzLCBkc3RfbDMpOwogICAgICAgICBQQ0tFVl9CNF9VQihkc3RfbDAsIGRzdF9yMCwgZHN0X2wxLCBkc3RfcjEsIGRzdF9sMiwgZHN0X3IyLCBkc3RfbDMsCiAgICAgICAgICAgICAgICAgICAgIGRzdF9yMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgU1RfVUI0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIChkc3QgKyAxNiksIHN0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIHN0cmlkZSk7CisgICAgICAgIFNUX1VCMihkc3QwLCBkc3QxLCBkc3QsIDE2KTsKKyAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgU1RfVUIyKGRzdDIsIGRzdDMsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gc3RyaWRlOwogICAgIH0KKworICAgIFVOUENLX1VCX1NIKGRzdDQsIGRzdF9yMCwgZHN0X2wwKTsKKyAgICBVTlBDS19VQl9TSChkc3Q1LCBkc3RfcjEsIGRzdF9sMSk7CisgICAgVU5QQ0tfVUJfU0goZHN0NiwgZHN0X3IyLCBkc3RfbDIpOworICAgIFVOUENLX1VCX1NIKGRzdDcsIGRzdF9yMywgZHN0X2wzKTsKKworICAgIGRzdF9yMCArPSBpbjA7CisgICAgZHN0X2wwICs9IGluMTsKKyAgICBkc3RfcjEgKz0gaW4yOworICAgIGRzdF9sMSArPSBpbjM7CisgICAgZHN0X3IyICs9IGluNDsKKyAgICBkc3RfbDIgKz0gaW41OworICAgIGRzdF9yMyArPSBpbjY7CisgICAgZHN0X2wzICs9IGluNzsKKworICAgIC8qIFByZS1sb2FkIGZvciBuZXh0IGl0ZXJhdGlvbiAqLworICAgIExEX1VCMih0ZW1wX2RzdCwgMTYsIGRzdDQsIGRzdDUpOworICAgIHRlbXBfZHN0ICs9IHN0cmlkZTsKKyAgICBMRF9VQjIodGVtcF9kc3QsIDE2LCBkc3Q2LCBkc3Q3KTsKKyAgICB0ZW1wX2RzdCArPSBzdHJpZGU7CisgICAgTERfU0g0KGNvZWZmcywgMTYsIGluMCwgaW4yLCBpbjQsIGluNik7CisgICAgTERfU0g0KChjb2VmZnMgKyA4KSwgMTYsIGluMSwgaW4zLCBpbjUsIGluNyk7CisKKyAgICBDTElQX1NINF8wXzI1NShkc3RfcjAsIGRzdF9sMCwgZHN0X3IxLCBkc3RfbDEpOworICAgIENMSVBfU0g0XzBfMjU1KGRzdF9yMiwgZHN0X2wyLCBkc3RfcjMsIGRzdF9sMyk7CisgICAgUENLRVZfQjRfVUIoZHN0X2wwLCBkc3RfcjAsIGRzdF9sMSwgZHN0X3IxLCBkc3RfbDIsIGRzdF9yMiwgZHN0X2wzLAorICAgICAgICAgICAgICAgIGRzdF9yMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgU1RfVUIyKGRzdDAsIGRzdDEsIGRzdCwgMTYpOworICAgIGRzdCArPSBzdHJpZGU7CisgICAgU1RfVUIyKGRzdDIsIGRzdDMsIGRzdCwgMTYpOworICAgIGRzdCArPSBzdHJpZGU7CisKKyAgICBVTlBDS19VQl9TSChkc3Q0LCBkc3RfcjAsIGRzdF9sMCk7CisgICAgVU5QQ0tfVUJfU0goZHN0NSwgZHN0X3IxLCBkc3RfbDEpOworICAgIFVOUENLX1VCX1NIKGRzdDYsIGRzdF9yMiwgZHN0X2wyKTsKKyAgICBVTlBDS19VQl9TSChkc3Q3LCBkc3RfcjMsIGRzdF9sMyk7CisKKyAgICBkc3RfcjAgKz0gaW4wOworICAgIGRzdF9sMCArPSBpbjE7CisgICAgZHN0X3IxICs9IGluMjsKKyAgICBkc3RfbDEgKz0gaW4zOworICAgIGRzdF9yMiArPSBpbjQ7CisgICAgZHN0X2wyICs9IGluNTsKKyAgICBkc3RfcjMgKz0gaW42OworICAgIGRzdF9sMyArPSBpbjc7CisKKyAgICBDTElQX1NINF8wXzI1NShkc3RfcjAsIGRzdF9sMCwgZHN0X3IxLCBkc3RfbDEpOworICAgIENMSVBfU0g0XzBfMjU1KGRzdF9yMiwgZHN0X2wyLCBkc3RfcjMsIGRzdF9sMyk7CisgICAgUENLRVZfQjRfVUIoZHN0X2wwLCBkc3RfcjAsIGRzdF9sMSwgZHN0X3IxLCBkc3RfbDIsIGRzdF9yMiwgZHN0X2wzLAorICAgICAgICAgICAgICAgIGRzdF9yMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgU1RfVUIyKGRzdDAsIGRzdDEsIGRzdCwgMTYpOworICAgIGRzdCArPSBzdHJpZGU7CisgICAgU1RfVUIyKGRzdDIsIGRzdDMsIGRzdCwgMTYpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2lkY3RfbHVtYV80eDRfbXNhKGludDE2X3QgKmNvZWZmcykKQEAgLTg2OCw4ICs5NTEsMTIgQEAKICAgICBUUkFOU1BPU0U0eDRfU1dfU1cocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgaW5fcjAsIGluX2wwLCBpbl9yMSwgaW5fbDEpOwogICAgIEhFVkNfSURDVF9MVU1BNHg0X0NPTChpbl9yMCwgaW5fbDAsIGluX3IxLCBpbl9sMSwgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIpOwotICAgIFRSQU5TUE9TRTR4NF9TV19TVyhyZXMwLCByZXMxLCByZXMyLCByZXMzLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKLSAgICBQQ0tFVl9IMl9TSChyZXMxLCByZXMwLCByZXMzLCByZXMyLCBkc3QwLCBkc3QxKTsKKworICAgIC8qIFBhY2sgYW5kIHRyYW5zcG9zZSAqLworICAgIFBDS0VWX0gyX1NIKHJlczIsIHJlczAsIHJlczMsIHJlczEsIGRzdDAsIGRzdDEpOworICAgIElMVlJMX0gyX1NXKGRzdDEsIGRzdDAsIHJlczAsIHJlczEpOworICAgIElMVlJMX1cyX1NIKHJlczEsIHJlczAsIGRzdDAsIGRzdDEpOworCiAgICAgU1RfU0gyKGRzdDAsIGRzdDEsIGNvZWZmcywgOCk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oZXZjX2xwZl9zYW9fbXNhLmMgYi9saWJhdmNvZGVjL21pcHMvaGV2Y19scGZfc2FvX21zYS5jCmluZGV4IGRhMWRiNTEuLmFkY2FmZGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9oZXZjX2xwZl9zYW9fbXNhLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2hldmNfbHBmX3Nhb19tc2EuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWFub2prdW1hciBCaG9zYWxlIChNYW5vamt1bWFyLkJob3NhbGVAaW1ndGVjLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAxNSAtMjAxNyBNYW5vamt1bWFyIEJob3NhbGUgKE1hbm9qa3VtYXIuQmhvc2FsZUBpbWd0ZWMuY29tKQogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0zNSwxMiArMzUsMTQgQEAKICAgICB1aW50OF90ICpxMyA9IHNyYyArIChzdHJpZGUgPDwgMSkgKyBzdHJpZGU7CiAgICAgdWludDhfdCBmbGFnMCwgZmxhZzE7CiAgICAgaW50MzJfdCBkcDAwLCBkcTAwLCBkcDMwLCBkcTMwLCBkMDAsIGQzMDsKKyAgICBpbnQzMl90IGQwMDMwLCBkMDQzNDsKICAgICBpbnQzMl90IGRwMDQsIGRxMDQsIGRwMzQsIGRxMzQsIGQwNCwgZDM0OwogICAgIGludDMyX3QgdGMwLCBwX2lzX3BjbTAsIHFfaXNfcGNtMCwgYmV0YTMwLCBiZXRhMjAsIHRjMjUwOwogICAgIGludDMyX3QgdGM0LCBwX2lzX3BjbTQsIHFfaXNfcGNtNCwgdGMyNTQsIHRtcDsKICAgICB1aW50NjRfdCBkc3RfdmFsMCwgZHN0X3ZhbDE7CiAgICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKICAgICB2Mmk2NCBjbXAwLCBjbXAxLCBjbXAyLCBwX2lzX3BjbV92ZWMsIHFfaXNfcGNtX3ZlYzsKKyAgICB2Mmk2NCBjbXAzOwogICAgIHY4dTE2IHRlbXAwLCB0ZW1wMTsKICAgICB2OGkxNiB0ZW1wMjsKICAgICB2OGkxNiB0Y19wb3MsIHRjX25lZzsKQEAgLTU0LDYyICs1Niw4NiBAQAogICAgIGRxMzAgPSBhYnMocTJbM10gLSAocTFbM10gPDwgMSkgKyBxMFszXSk7CiAgICAgZDAwID0gZHAwMCArIGRxMDA7CiAgICAgZDMwID0gZHAzMCArIGRxMzA7Ci0gICAgcF9pc19wY20wID0gcF9pc19wY21bMF07Ci0gICAgcV9pc19wY20wID0gcV9pc19wY21bMF07CiAgICAgZHAwNCA9IGFicyhwMls0XSAtIChwMVs0XSA8PCAxKSArIHAwWzRdKTsKICAgICBkcTA0ID0gYWJzKHEyWzRdIC0gKHExWzRdIDw8IDEpICsgcTBbNF0pOwogICAgIGRwMzQgPSBhYnMocDJbN10gLSAocDFbN10gPDwgMSkgKyBwMFs3XSk7CiAgICAgZHEzNCA9IGFicyhxMls3XSAtIChxMVs3XSA8PCAxKSArIHEwWzddKTsKICAgICBkMDQgPSBkcDA0ICsgZHEwNDsKICAgICBkMzQgPSBkcDM0ICsgZHEzNDsKKworICAgIHBfaXNfcGNtMCA9IHBfaXNfcGNtWzBdOwogICAgIHBfaXNfcGNtNCA9IHBfaXNfcGNtWzFdOworICAgIHFfaXNfcGNtMCA9IHFfaXNfcGNtWzBdOwogICAgIHFfaXNfcGNtNCA9IHFfaXNfcGNtWzFdOwogCi0gICAgaWYgKCFwX2lzX3BjbTAgfHwgIXBfaXNfcGNtNCB8fCAhcV9pc19wY20wIHx8ICFxX2lzX3BjbTQpIHsKLSAgICAgICAgaWYgKCEoZDAwICsgZDMwID49IGJldGEpIHx8ICEoZDA0ICsgZDM0ID49IGJldGEpKSB7Ci0gICAgICAgICAgICBwM19zcmMgPSBMRF9VSChwMyk7Ci0gICAgICAgICAgICBwMl9zcmMgPSBMRF9VSChwMik7Ci0gICAgICAgICAgICBwMV9zcmMgPSBMRF9VSChwMSk7Ci0gICAgICAgICAgICBwMF9zcmMgPSBMRF9VSChwMCk7Ci0gICAgICAgICAgICBxMF9zcmMgPSBMRF9VSChxMCk7Ci0gICAgICAgICAgICBxMV9zcmMgPSBMRF9VSChxMSk7Ci0gICAgICAgICAgICBxMl9zcmMgPSBMRF9VSChxMik7Ci0gICAgICAgICAgICBxM19zcmMgPSBMRF9VSChxMyk7CisgICAgY21wMCA9IF9fbXNhX2ZpbGxfZChwX2lzX3BjbTApOworICAgIGNtcDEgPSBfX21zYV9maWxsX2QocF9pc19wY200KTsKKyAgICBwX2lzX3BjbV92ZWMgPSBfX21zYV9pbHZldl9kKGNtcDEsIGNtcDApOworICAgIHBfaXNfcGNtX3ZlYyA9IF9fbXNhX2NlcWlfZChwX2lzX3BjbV92ZWMsIDApOwogCi0gICAgICAgICAgICB0YzAgPSB0Y1swXTsKLSAgICAgICAgICAgIGJldGEzMCA9IGJldGEgPj4gMzsKLSAgICAgICAgICAgIGJldGEyMCA9IGJldGEgPj4gMjsKLSAgICAgICAgICAgIHRjMjUwID0gKCh0YzAgKiA1ICsgMSkgPj4gMSk7Ci0gICAgICAgICAgICB0YzQgPSB0Y1sxXTsKLSAgICAgICAgICAgIHRjMjU0ID0gKCh0YzQgKiA1ICsgMSkgPj4gMSk7CisgICAgZDAwMzAgPSAoZDAwICsgZDMwKSA+PSBiZXRhOworICAgIGQwNDM0ID0gKGQwNCArIGQzNCkgPj0gYmV0YTsKIAotICAgICAgICAgICAgZmxhZzAgPSAoYWJzKHAzWzBdIC0gcDBbMF0pICsgYWJzKHEzWzBdIC0gcTBbMF0pIDwgYmV0YTMwICYmCi0gICAgICAgICAgICAgICAgICAgICBhYnMocDBbMF0gLSBxMFswXSkgPCB0YzI1MCAmJgotICAgICAgICAgICAgICAgICAgICAgYWJzKHAzWzNdIC0gcDBbM10pICsgYWJzKHEzWzNdIC0gcTBbM10pIDwgYmV0YTMwICYmCi0gICAgICAgICAgICAgICAgICAgICBhYnMocDBbM10gLSBxMFszXSkgPCB0YzI1MCAmJgotICAgICAgICAgICAgICAgICAgICAgKGQwMCA8PCAxKSA8IGJldGEyMCAmJiAoZDMwIDw8IDEpIDwgYmV0YTIwKTsKLSAgICAgICAgICAgIGNtcDAgPSBfX21zYV9maWxsX2QoZmxhZzApOworICAgIGNtcDAgPSAodjJpNjQpIF9fbXNhX2ZpbGxfdyhkMDAzMCk7CisgICAgY21wMSA9ICh2Mmk2NCkgX19tc2FfZmlsbF93KGQwNDM0KTsKKyAgICBjbXAzID0gKHYyaTY0KSBfX21zYV9pbHZldl93KCh2NGkzMikgY21wMSwgKHY0aTMyKSBjbXAwKTsKKyAgICBjbXAzID0gKHYyaTY0KSBfX21zYV9jZXFpX3coKHY0aTMyKSBjbXAzLCAwKTsKIAotICAgICAgICAgICAgZmxhZzEgPSAoYWJzKHAzWzRdIC0gcDBbNF0pICsgYWJzKHEzWzRdIC0gcTBbNF0pIDwgYmV0YTMwICYmCi0gICAgICAgICAgICAgICAgICAgICBhYnMocDBbNF0gLSBxMFs0XSkgPCB0YzI1NCAmJgotICAgICAgICAgICAgICAgICAgICAgYWJzKHAzWzddIC0gcDBbN10pICsgYWJzKHEzWzddIC0gcTBbN10pIDwgYmV0YTMwICYmCi0gICAgICAgICAgICAgICAgICAgICBhYnMocDBbN10gLSBxMFs3XSkgPCB0YzI1NCAmJgotICAgICAgICAgICAgICAgICAgICAgKGQwNCA8PCAxKSA8IGJldGEyMCAmJiAoZDM0IDw8IDEpIDwgYmV0YTIwKTsKLSAgICAgICAgICAgIGNtcDEgPSBfX21zYV9maWxsX2QoZmxhZzEpOwotICAgICAgICAgICAgY21wMiA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7Ci0gICAgICAgICAgICBjbXAyID0gX19tc2FfY2VxaV9kKGNtcDIsIDApOworICAgIGlmICgoIXBfaXNfcGNtMCB8fCAhcF9pc19wY200IHx8ICFxX2lzX3BjbTAgfHwgIXFfaXNfcGNtNCkgJiYKKyAgICAgICAgKCFkMDAzMCB8fCAhZDA0MzQpKSB7CisgICAgICAgIHAzX3NyYyA9IExEX1VIKHAzKTsKKyAgICAgICAgcDJfc3JjID0gTERfVUgocDIpOworICAgICAgICBwMV9zcmMgPSBMRF9VSChwMSk7CisgICAgICAgIHAwX3NyYyA9IExEX1VIKHAwKTsKIAotICAgICAgICAgICAgSUxWUl9COF9VSCh6ZXJvLCBwM19zcmMsIHplcm8sIHAyX3NyYywgemVybywgcDFfc3JjLCB6ZXJvLCBwMF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgIHplcm8sIHEwX3NyYywgemVybywgcTFfc3JjLCB6ZXJvLCBxMl9zcmMsIHplcm8sIHEzX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgcDNfc3JjLCBwMl9zcmMsIHAxX3NyYywgcDBfc3JjLCBxMF9zcmMsIHExX3NyYywgcTJfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICBxM19zcmMpOworICAgICAgICBjbXAwID0gX19tc2FfZmlsbF9kKHFfaXNfcGNtMCk7CisgICAgICAgIGNtcDEgPSBfX21zYV9maWxsX2QocV9pc19wY200KTsKKyAgICAgICAgcV9pc19wY21fdmVjID0gX19tc2FfaWx2ZXZfZChjbXAxLCBjbXAwKTsKKyAgICAgICAgcV9pc19wY21fdmVjID0gX19tc2FfY2VxaV9kKHFfaXNfcGNtX3ZlYywgMCk7CiAKLSAgICAgICAgICAgIGNtcDAgPSAodjJpNjQpIF9fbXNhX2ZpbGxfaCh0YzApOwotICAgICAgICAgICAgY21wMSA9ICh2Mmk2NCkgX19tc2FfZmlsbF9oKHRjNCk7Ci0gICAgICAgICAgICB0Y19wb3MgPSAodjhpMTYpIF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7CisgICAgICAgIHRjMCA9IHRjWzBdOworICAgICAgICBiZXRhMzAgPSBiZXRhID4+IDM7CisgICAgICAgIGJldGEyMCA9IGJldGEgPj4gMjsKKyAgICAgICAgdGMyNTAgPSAoKHRjMCAqIDUgKyAxKSA+PiAxKTsKKyAgICAgICAgdGM0ID0gdGNbMV07CisgICAgICAgIHRjMjU0ID0gKCh0YzQgKiA1ICsgMSkgPj4gMSk7CisKKyAgICAgICAgY21wMCA9ICh2Mmk2NCkgX19tc2FfZmlsbF9oKHRjMCk7CisgICAgICAgIGNtcDEgPSAodjJpNjQpIF9fbXNhX2ZpbGxfaCh0YzQpOworCisgICAgICAgIElMVlJfQjRfVUgoemVybywgcDNfc3JjLCB6ZXJvLCBwMl9zcmMsIHplcm8sIHAxX3NyYywgemVybywgcDBfc3JjLAorICAgICAgICAgICAgICAgICAgIHAzX3NyYywgcDJfc3JjLCBwMV9zcmMsIHAwX3NyYyk7CisgICAgICAgIHEwX3NyYyA9IExEX1VIKHEwKTsKKyAgICAgICAgcTFfc3JjID0gTERfVUgocTEpOworICAgICAgICBxMl9zcmMgPSBMRF9VSChxMik7CisgICAgICAgIHEzX3NyYyA9IExEX1VIKHEzKTsKKworICAgICAgICBmbGFnMCA9IGFicyhwM1swXSAtIHAwWzBdKSArIGFicyhxM1swXSAtIHEwWzBdKSA8IGJldGEzMCAmJgorICAgICAgICAgICAgICAgIGFicyhwMFswXSAtIHEwWzBdKSA8IHRjMjUwOworICAgICAgICBmbGFnMCA9IGZsYWcwICYmIChhYnMocDNbM10gLSBwMFszXSkgKyBhYnMocTNbM10gLSBxMFszXSkgPCBiZXRhMzAgJiYKKyAgICAgICAgICAgICAgICBhYnMocDBbM10gLSBxMFszXSkgPCB0YzI1MCAmJiAoZDAwIDw8IDEpIDwgYmV0YTIwICYmCisgICAgICAgICAgICAgICAgKGQzMCA8PCAxKSA8IGJldGEyMCk7CisKKyAgICAgICAgdGNfcG9zID0gKHY4aTE2KSBfX21zYV9pbHZldl9kKGNtcDEsIGNtcDApOworICAgICAgICBJTFZSX0I0X1VIKHplcm8sIHEwX3NyYywgemVybywgcTFfc3JjLCB6ZXJvLCBxMl9zcmMsIHplcm8sIHEzX3NyYywKKyAgICAgICAgICAgICAgICAgICBxMF9zcmMsIHExX3NyYywgcTJfc3JjLCBxM19zcmMpOworICAgICAgICBmbGFnMSA9IGFicyhwM1s0XSAtIHAwWzRdKSArIGFicyhxM1s0XSAtIHEwWzRdKSA8IGJldGEzMCAmJgorICAgICAgICAgICAgICAgIGFicyhwMFs0XSAtIHEwWzRdKSA8IHRjMjU0OworICAgICAgICBmbGFnMSA9IGZsYWcxICYmIChhYnMocDNbN10gLSBwMFs3XSkgKyBhYnMocTNbN10gLSBxMFs3XSkgPCBiZXRhMzAgJiYKKyAgICAgICAgICAgICAgICBhYnMocDBbN10gLSBxMFs3XSkgPCB0YzI1NCAmJiAoZDA0IDw8IDEpIDwgYmV0YTIwICYmCisgICAgICAgICAgICAgICAgKGQzNCA8PCAxKSA8IGJldGEyMCk7CisKKyAgICAgICAgY21wMCA9ICh2Mmk2NCkgX19tc2FfZmlsbF93KGZsYWcwKTsKKyAgICAgICAgY21wMSA9ICh2Mmk2NCkgX19tc2FfZmlsbF93KGZsYWcxKTsKKyAgICAgICAgY21wMiA9ICh2Mmk2NCkgX19tc2FfaWx2ZXZfdygodjRpMzIpIGNtcDEsICh2NGkzMikgY21wMCk7CisgICAgICAgIGNtcDIgPSAodjJpNjQpIF9fbXNhX2NlcWlfdygodjRpMzIpIGNtcDIsIDApOworCisgICAgICAgIGlmIChmbGFnMCAmJiBmbGFnMSkgeyAvKiBzdHJvbmcgb25seSAqLworICAgICAgICAgICAgLyogc3Ryb25nIGZpbHRlciAqLwogICAgICAgICAgICAgdGNfcG9zIDw8PSAxOwogICAgICAgICAgICAgdGNfbmVnID0gLXRjX3BvczsKIAorICAgICAgICAgICAgLyogcCBwYXJ0ICovCiAgICAgICAgICAgICB0ZW1wMCA9IChwMV9zcmMgKyBwMF9zcmMgKyBxMF9zcmMpOwogICAgICAgICAgICAgdGVtcDEgPSAoKHAzX3NyYyArIHAyX3NyYykgPDwgMSkgKyBwMl9zcmMgKyB0ZW1wMDsKICAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDMpOwpAQCAtMTI5LDE1ICsxNTUsMTEgQEAKICAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSCh0ZW1wMiwgdGNfbmVnLCB0Y19wb3MpOwogICAgICAgICAgICAgZHN0MiA9ICh2MTZ1OCkgKHRlbXAyICsgKHY4aTE2KSBwMF9zcmMpOwogCi0gICAgICAgICAgICBjbXAwID0gX19tc2FfZmlsbF9kKHBfaXNfcGNtMCk7Ci0gICAgICAgICAgICBjbXAxID0gX19tc2FfZmlsbF9kKHBfaXNfcGNtNCk7Ci0gICAgICAgICAgICBwX2lzX3BjbV92ZWMgPSBfX21zYV9pbHZldl9kKGNtcDEsIGNtcDApOwotICAgICAgICAgICAgcF9pc19wY21fdmVjID0gX19tc2FfY2VxaV9kKHBfaXNfcGNtX3ZlYywgMCk7Ci0KICAgICAgICAgICAgIGRzdDAgPSBfX21zYV9ibXpfdihkc3QwLCAodjE2dTgpIHAyX3NyYywgKHYxNnU4KSBwX2lzX3BjbV92ZWMpOwogICAgICAgICAgICAgZHN0MSA9IF9fbXNhX2Jtel92KGRzdDEsICh2MTZ1OCkgcDFfc3JjLCAodjE2dTgpIHBfaXNfcGNtX3ZlYyk7CiAgICAgICAgICAgICBkc3QyID0gX19tc2FfYm16X3YoZHN0MiwgKHYxNnU4KSBwMF9zcmMsICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKIAorICAgICAgICAgICAgLyogcSBwYXJ0ICovCiAgICAgICAgICAgICB0ZW1wMCA9IChxMV9zcmMgKyBwMF9zcmMgKyBxMF9zcmMpOwogCiAgICAgICAgICAgICB0ZW1wMSA9ICgocTNfc3JjICsgcTJfc3JjKSA8PCAxKSArIHEyX3NyYyArIHRlbXAwOwpAQCAtMTU4LDE1ICsxODAsNjAxIEBACiAgICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKICAgICAgICAgICAgIGRzdDMgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcTBfc3JjKTsKIAotICAgICAgICAgICAgY21wMCA9IF9fbXNhX2ZpbGxfZChxX2lzX3BjbTApOwotICAgICAgICAgICAgY21wMSA9IF9fbXNhX2ZpbGxfZChxX2lzX3BjbTQpOwotICAgICAgICAgICAgcV9pc19wY21fdmVjID0gX19tc2FfaWx2ZXZfZChjbXAxLCBjbXAwKTsKLSAgICAgICAgICAgIHFfaXNfcGNtX3ZlYyA9IF9fbXNhX2NlcWlfZChxX2lzX3BjbV92ZWMsIDApOworICAgICAgICAgICAgZHN0MyA9IF9fbXNhX2Jtel92KGRzdDMsICh2MTZ1OCkgcTBfc3JjLCAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7CisgICAgICAgICAgICBkc3Q0ID0gX19tc2FfYm16X3YoZHN0NCwgKHYxNnU4KSBxMV9zcmMsICh2MTZ1OCkgcV9pc19wY21fdmVjKTsKKyAgICAgICAgICAgIGRzdDUgPSBfX21zYV9ibXpfdihkc3Q1LCAodjE2dTgpIHEyX3NyYywgKHYxNnU4KSBxX2lzX3BjbV92ZWMpOworCisgICAgICAgICAgICAvKiBwYWNrIHJlc3VsdHMgdG8gOCBiaXQgKi8KKyAgICAgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDEpOworICAgICAgICAgICAgZHN0MiA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDUsICh2MTZpOCkgZHN0NCk7CisKKyAgICAgICAgICAgIC8qIHBhY2sgc3JjIHRvIDggYml0ICovCisgICAgICAgICAgICBQQ0tFVl9CMl9VQihwMV9zcmMsIHAyX3NyYywgcTBfc3JjLCBwMF9zcmMsIGRzdDMsIGRzdDQpOworICAgICAgICAgICAgZHN0NSA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHEyX3NyYywgKHYxNmk4KSBxMV9zcmMpOworCisgICAgICAgICAgICBkc3QwID0gX19tc2FfYm16X3YoZHN0MCwgZHN0MywgKHYxNnU4KSBjbXAzKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9ibXpfdihkc3QxLCBkc3Q0LCAodjE2dTgpIGNtcDMpOworICAgICAgICAgICAgZHN0MiA9IF9fbXNhX2Jtel92KGRzdDIsIGRzdDUsICh2MTZ1OCkgY21wMyk7CisKKyAgICAgICAgICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QyLCAwKTsKKyAgICAgICAgICAgIGRzdF92YWwxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QyLCAxKTsKKworICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgcDIsIHN0cmlkZSk7CisgICAgICAgICAgICBwMiArPSAoNCAqIHN0cmlkZSk7CisgICAgICAgICAgICBTRChkc3RfdmFsMCwgcDIpOworICAgICAgICAgICAgcDIgKz0gc3RyaWRlOworICAgICAgICAgICAgU0QoZHN0X3ZhbDEsIHAyKTsKKyAgICAgICAgICAgIC8qIHN0cm9uZyBmaWx0ZXIgZW5kcyAqLworICAgICAgICB9IGVsc2UgaWYgKGZsYWcwID09IGZsYWcxKSB7IC8qIHdlYWsgb25seSAqLworICAgICAgICAgICAgLyogd2VhayBmaWx0ZXIgKi8KKyAgICAgICAgICAgIHRjX25lZyA9IC10Y19wb3M7CisKKyAgICAgICAgICAgIGRpZmYwID0gKHY4aTE2KSAocTBfc3JjIC0gcDBfc3JjKTsKKyAgICAgICAgICAgIGRpZmYxID0gKHY4aTE2KSAocTFfc3JjIC0gcDFfc3JjKTsKKyAgICAgICAgICAgIGRpZmYwID0gKGRpZmYwIDw8IDMpICsgZGlmZjA7CisgICAgICAgICAgICBkaWZmMSA9IChkaWZmMSA8PCAxKSArIGRpZmYxOworICAgICAgICAgICAgZGVsdGEwID0gZGlmZjAgLSBkaWZmMTsKKyAgICAgICAgICAgIGRlbHRhMCA9IF9fbXNhX3NyYXJpX2goZGVsdGEwLCA0KTsKKworICAgICAgICAgICAgdGVtcDEgPSAodjh1MTYpICgodGNfcG9zIDw8IDMpICsgKHRjX3BvcyA8PCAxKSk7CisgICAgICAgICAgICBhYnNfZGVsdGEwID0gX19tc2FfYWRkX2FfaChkZWx0YTAsICh2OGkxNikgemVybyk7CisgICAgICAgICAgICBhYnNfZGVsdGEwID0gKHY4dTE2KSBhYnNfZGVsdGEwIDwgdGVtcDE7CisKKyAgICAgICAgICAgIGRlbHRhMCA9IENMSVBfU0goZGVsdGEwLCB0Y19uZWcsIHRjX3Bvcyk7CisKKyAgICAgICAgICAgIHRlbXAwID0gKHY4dTE2KSAoZGVsdGEwICsgcDBfc3JjKTsKKyAgICAgICAgICAgIHRlbXAwID0gKHY4dTE2KSBDTElQX1NIXzBfMjU1KHRlbXAwKTsKKyAgICAgICAgICAgIHRlbXAwID0gKHY4dTE2KSBfX21zYV9ibXpfdigodjE2dTgpIHRlbXAwLCAodjE2dTgpIHAwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIHBfaXNfcGNtX3ZlYyk7CisKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAocTBfc3JjIC0gZGVsdGEwKTsKKyAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSF8wXzI1NSh0ZW1wMik7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgX19tc2FfYm16X3YoKHYxNnU4KSB0ZW1wMiwgKHYxNnU4KSBxMF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBxX2lzX3BjbV92ZWMpOworCisgICAgICAgICAgICBwX2lzX3BjbV92ZWMgPSB+cF9pc19wY21fdmVjOworICAgICAgICAgICAgcV9pc19wY21fdmVjID0gfnFfaXNfcGNtX3ZlYzsKKyAgICAgICAgICAgIHRtcCA9IChiZXRhICsgKGJldGEgPj4gMSkpID4+IDM7CisgICAgICAgICAgICBjbXAwID0gX19tc2FfZmlsbF9kKGRwMDAgKyBkcDMwIDwgdG1wKTsKKyAgICAgICAgICAgIGNtcDEgPSBfX21zYV9maWxsX2QoZHAwNCArIGRwMzQgPCB0bXApOworICAgICAgICAgICAgY21wMCA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7CisgICAgICAgICAgICBjbXAwID0gX19tc2FfY2VxaV9kKGNtcDAsIDApOworICAgICAgICAgICAgcF9pc19wY21fdmVjID0gcF9pc19wY21fdmVjIHwgY21wMDsKKworICAgICAgICAgICAgY21wMCA9IF9fbXNhX2ZpbGxfZChkcTAwICsgZHEzMCA8IHRtcCk7CisgICAgICAgICAgICBjbXAxID0gX19tc2FfZmlsbF9kKGRxMDQgKyBkcTM0IDwgdG1wKTsKKyAgICAgICAgICAgIGNtcDAgPSBfX21zYV9pbHZldl9kKGNtcDEsIGNtcDApOworICAgICAgICAgICAgY21wMCA9IF9fbXNhX2NlcWlfZChjbXAwLCAwKTsKKyAgICAgICAgICAgIHFfaXNfcGNtX3ZlYyA9IHFfaXNfcGNtX3ZlYyB8IGNtcDA7CisKKyAgICAgICAgICAgIHRjX3BvcyA+Pj0gMTsKKyAgICAgICAgICAgIHRjX25lZyA9IC10Y19wb3M7CisKKyAgICAgICAgICAgIGRlbHRhMSA9ICh2OGkxNikgX19tc2FfYXZlcl91X2gocDJfc3JjLCBwMF9zcmMpOworICAgICAgICAgICAgZGVsdGExIC09ICh2OGkxNikgcDFfc3JjOworICAgICAgICAgICAgZGVsdGExICs9IGRlbHRhMDsKKyAgICAgICAgICAgIGRlbHRhMSA+Pj0gMTsKKyAgICAgICAgICAgIGRlbHRhMSA9IENMSVBfU0goZGVsdGExLCB0Y19uZWcsIHRjX3Bvcyk7CisgICAgICAgICAgICBkZWx0YTEgPSAodjhpMTYpIHAxX3NyYyArICh2OGkxNikgZGVsdGExOworICAgICAgICAgICAgZGVsdGExID0gQ0xJUF9TSF8wXzI1NShkZWx0YTEpOworICAgICAgICAgICAgZGVsdGExID0gKHY4aTE2KSBfX21zYV9ibW56X3YoKHYxNnU4KSBkZWx0YTEsICh2MTZ1OCkgcDFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBwX2lzX3BjbV92ZWMpOworCisgICAgICAgICAgICBkZWx0YTIgPSAodjhpMTYpIF9fbXNhX2F2ZXJfdV9oKHEwX3NyYywgcTJfc3JjKTsKKyAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhMiAtICh2OGkxNikgcTFfc3JjOworICAgICAgICAgICAgZGVsdGEyID0gZGVsdGEyIC0gZGVsdGEwOworICAgICAgICAgICAgZGVsdGEyID0gZGVsdGEyID4+IDE7CisgICAgICAgICAgICBkZWx0YTIgPSBDTElQX1NIKGRlbHRhMiwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZGVsdGEyID0gKHY4aTE2KSBxMV9zcmMgKyAodjhpMTYpIGRlbHRhMjsKKyAgICAgICAgICAgIGRlbHRhMiA9IENMSVBfU0hfMF8yNTUoZGVsdGEyKTsKKyAgICAgICAgICAgIGRlbHRhMiA9ICh2OGkxNikgX19tc2FfYm1uel92KCh2MTZ1OCkgZGVsdGEyLCAodjE2dTgpIHExX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgcV9pc19wY21fdmVjKTsKKworICAgICAgICAgICAgZHN0MSA9ICh2MTZ1OCkgX19tc2FfYm16X3YoKHYxNnU4KSBkZWx0YTEsICh2MTZ1OCkgcDFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBhYnNfZGVsdGEwKTsKKyAgICAgICAgICAgIGRzdDIgPSAodjE2dTgpIF9fbXNhX2Jtel92KCh2MTZ1OCkgdGVtcDAsICh2MTZ1OCkgcDBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBhYnNfZGVsdGEwKTsKKyAgICAgICAgICAgIGRzdDMgPSAodjE2dTgpIF9fbXNhX2Jtel92KCh2MTZ1OCkgdGVtcDIsICh2MTZ1OCkgcTBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBhYnNfZGVsdGEwKTsKKyAgICAgICAgICAgIGRzdDQgPSAodjE2dTgpIF9fbXNhX2Jtel92KCh2MTZ1OCkgZGVsdGEyLCAodjE2dTgpIHExX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgYWJzX2RlbHRhMCk7CisgICAgICAgICAgICAvKiBwYWNrIHJlc3VsdHMgdG8gOCBiaXQgKi8KKyAgICAgICAgICAgIFBDS0VWX0IyX1VCKGRzdDIsIGRzdDEsIGRzdDQsIGRzdDMsIGRzdDAsIGRzdDEpOworCisgICAgICAgICAgICAvKiBwYWNrIHNyYyB0byA4IGJpdCAqLworICAgICAgICAgICAgUENLRVZfQjJfVUIocDBfc3JjLCBwMV9zcmMsIHExX3NyYywgcTBfc3JjLCBkc3QyLCBkc3QzKTsKKworICAgICAgICAgICAgZHN0MCA9IF9fbXNhX2Jtel92KGRzdDAsIGRzdDIsICh2MTZ1OCkgY21wMyk7CisgICAgICAgICAgICBkc3QxID0gX19tc2FfYm16X3YoZHN0MSwgZHN0MywgKHYxNnU4KSBjbXAzKTsKKworICAgICAgICAgICAgcDIgKz0gc3RyaWRlOworICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgcDIsIHN0cmlkZSk7CisgICAgICAgICAgICAvKiB3ZWFrIGZpbHRlciBlbmRzICovCisgICAgICAgIH0gZWxzZSB7IC8qIHN0cm9uZyArIHdlYWsgKi8KKyAgICAgICAgICAgIC8qIHN0cm9uZyBmaWx0ZXIgKi8KKyAgICAgICAgICAgIHRjX3BvcyA8PD0gMTsKKyAgICAgICAgICAgIHRjX25lZyA9IC10Y19wb3M7CisKKyAgICAgICAgICAgIC8qIHAgcGFydCAqLworICAgICAgICAgICAgdGVtcDAgPSAocDFfc3JjICsgcDBfc3JjICsgcTBfc3JjKTsKKyAgICAgICAgICAgIHRlbXAxID0gKChwM19zcmMgKyBwMl9zcmMpIDw8IDEpICsgcDJfc3JjICsgdGVtcDA7CisgICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAzKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBwMl9zcmMpOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7CisgICAgICAgICAgICBkc3QwID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHAyX3NyYyk7CisKKyAgICAgICAgICAgIHRlbXAxID0gdGVtcDAgKyBwMl9zcmM7CisgICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAyKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBwMV9zcmMpOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7CisgICAgICAgICAgICBkc3QxID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHAxX3NyYyk7CisKKyAgICAgICAgICAgIHRlbXAxID0gKHRlbXAwIDw8IDEpICsgcDJfc3JjICsgcTFfc3JjOworICAgICAgICAgICAgdGVtcDEgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSB0ZW1wMSwgMyk7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgKHRlbXAxIC0gcDBfc3JjKTsKKyAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSCh0ZW1wMiwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZHN0MiA9ICh2MTZ1OCkgKHRlbXAyICsgKHY4aTE2KSBwMF9zcmMpOworCisgICAgICAgICAgICBkc3QwID0gX19tc2FfYm16X3YoZHN0MCwgKHYxNnU4KSBwMl9zcmMsICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9ibXpfdihkc3QxLCAodjE2dTgpIHAxX3NyYywgKHYxNnU4KSBwX2lzX3BjbV92ZWMpOworICAgICAgICAgICAgZHN0MiA9IF9fbXNhX2Jtel92KGRzdDIsICh2MTZ1OCkgcDBfc3JjLCAodjE2dTgpIHBfaXNfcGNtX3ZlYyk7CisKKyAgICAgICAgICAgIC8qIHEgcGFydCAqLworICAgICAgICAgICAgdGVtcDAgPSAocTFfc3JjICsgcDBfc3JjICsgcTBfc3JjKTsKKworICAgICAgICAgICAgdGVtcDEgPSAoKHEzX3NyYyArIHEyX3NyYykgPDwgMSkgKyBxMl9zcmMgKyB0ZW1wMDsKKyAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDMpOworICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpICh0ZW1wMSAtIHEyX3NyYyk7CisgICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKKyAgICAgICAgICAgIGRzdDUgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcTJfc3JjKTsKKworICAgICAgICAgICAgdGVtcDEgPSB0ZW1wMCArIHEyX3NyYzsKKyAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDIpOworICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpICh0ZW1wMSAtIHExX3NyYyk7CisgICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKKyAgICAgICAgICAgIGRzdDQgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcTFfc3JjKTsKKworICAgICAgICAgICAgdGVtcDEgPSAodGVtcDAgPDwgMSkgKyBwMV9zcmMgKyBxMl9zcmM7CisgICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAzKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBxMF9zcmMpOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7CisgICAgICAgICAgICBkc3QzID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHEwX3NyYyk7CiAKICAgICAgICAgICAgIGRzdDMgPSBfX21zYV9ibXpfdihkc3QzLCAodjE2dTgpIHEwX3NyYywgKHYxNnU4KSBxX2lzX3BjbV92ZWMpOwogICAgICAgICAgICAgZHN0NCA9IF9fbXNhX2Jtel92KGRzdDQsICh2MTZ1OCkgcTFfc3JjLCAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7CiAgICAgICAgICAgICBkc3Q1ID0gX19tc2FfYm16X3YoZHN0NSwgKHYxNnU4KSBxMl9zcmMsICh2MTZ1OCkgcV9pc19wY21fdmVjKTsKIAorICAgICAgICAgICAgLyogcGFjayBzdHJvbmcgcmVzdWx0cyB0byA4IGJpdCAqLworICAgICAgICAgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7CisgICAgICAgICAgICBkc3QyID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0NSwgKHYxNmk4KSBkc3Q0KTsKKyAgICAgICAgICAgIC8qIHN0cm9uZyBmaWx0ZXIgZW5kcyAqLworCisgICAgICAgICAgICAvKiB3ZWFrIGZpbHRlciAqLworICAgICAgICAgICAgdGNfcG9zID4+PSAxOworICAgICAgICAgICAgdGNfbmVnID0gLXRjX3BvczsKKworICAgICAgICAgICAgZGlmZjAgPSAodjhpMTYpIChxMF9zcmMgLSBwMF9zcmMpOworICAgICAgICAgICAgZGlmZjEgPSAodjhpMTYpIChxMV9zcmMgLSBwMV9zcmMpOworICAgICAgICAgICAgZGlmZjAgPSAoZGlmZjAgPDwgMykgKyBkaWZmMDsKKyAgICAgICAgICAgIGRpZmYxID0gKGRpZmYxIDw8IDEpICsgZGlmZjE7CisgICAgICAgICAgICBkZWx0YTAgPSBkaWZmMCAtIGRpZmYxOworICAgICAgICAgICAgZGVsdGEwID0gX19tc2Ffc3JhcmlfaChkZWx0YTAsIDQpOworCisgICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgKCh0Y19wb3MgPDwgMykgKyAodGNfcG9zIDw8IDEpKTsKKyAgICAgICAgICAgIGFic19kZWx0YTAgPSBfX21zYV9hZGRfYV9oKGRlbHRhMCwgKHY4aTE2KSB6ZXJvKTsKKyAgICAgICAgICAgIGFic19kZWx0YTAgPSAodjh1MTYpIGFic19kZWx0YTAgPCB0ZW1wMTsKKworICAgICAgICAgICAgZGVsdGEwID0gQ0xJUF9TSChkZWx0YTAsIHRjX25lZywgdGNfcG9zKTsKKworICAgICAgICAgICAgdGVtcDAgPSAodjh1MTYpIChkZWx0YTAgKyBwMF9zcmMpOworICAgICAgICAgICAgdGVtcDAgPSAodjh1MTYpIENMSVBfU0hfMF8yNTUodGVtcDApOworICAgICAgICAgICAgdGVtcDAgPSAodjh1MTYpIF9fbXNhX2Jtel92KCh2MTZ1OCkgdGVtcDAsICh2MTZ1OCkgcDBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKKworICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpIChxMF9zcmMgLSBkZWx0YTApOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIXzBfMjU1KHRlbXAyKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSBfX21zYV9ibXpfdigodjE2dTgpIHRlbXAyLCAodjE2dTgpIHEwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7CisKKyAgICAgICAgICAgIHBfaXNfcGNtX3ZlYyA9IH5wX2lzX3BjbV92ZWM7CisgICAgICAgICAgICBxX2lzX3BjbV92ZWMgPSB+cV9pc19wY21fdmVjOworICAgICAgICAgICAgdG1wID0gKGJldGEgKyAoYmV0YSA+PiAxKSkgPj4gMzsKKyAgICAgICAgICAgIGNtcDAgPSBfX21zYV9maWxsX2QoZHAwMCArIGRwMzAgPCB0bXApOworICAgICAgICAgICAgY21wMSA9IF9fbXNhX2ZpbGxfZChkcDA0ICsgZHAzNCA8IHRtcCk7CisgICAgICAgICAgICBjbXAwID0gX19tc2FfaWx2ZXZfZChjbXAxLCBjbXAwKTsKKyAgICAgICAgICAgIHBfaXNfcGNtX3ZlYyA9IHBfaXNfcGNtX3ZlYyB8IF9fbXNhX2NlcWlfZChjbXAwLCAwKTsKKworICAgICAgICAgICAgY21wMCA9IF9fbXNhX2ZpbGxfZChkcTAwICsgZHEzMCA8IHRtcCk7CisgICAgICAgICAgICBjbXAxID0gX19tc2FfZmlsbF9kKGRxMDQgKyBkcTM0IDwgdG1wKTsKKyAgICAgICAgICAgIGNtcDAgPSBfX21zYV9pbHZldl9kKGNtcDEsIGNtcDApOworICAgICAgICAgICAgcV9pc19wY21fdmVjID0gcV9pc19wY21fdmVjIHwgX19tc2FfY2VxaV9kKGNtcDAsIDApOworCisgICAgICAgICAgICB0Y19wb3MgPj49IDE7CisgICAgICAgICAgICB0Y19uZWcgPSAtdGNfcG9zOworCisgICAgICAgICAgICBkZWx0YTEgPSAodjhpMTYpIF9fbXNhX2F2ZXJfdV9oKHAyX3NyYywgcDBfc3JjKTsKKyAgICAgICAgICAgIGRlbHRhMSAtPSAodjhpMTYpIHAxX3NyYzsKKyAgICAgICAgICAgIGRlbHRhMSArPSBkZWx0YTA7CisgICAgICAgICAgICBkZWx0YTEgPj49IDE7CisgICAgICAgICAgICBkZWx0YTEgPSBDTElQX1NIKGRlbHRhMSwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZGVsdGExID0gKHY4aTE2KSBwMV9zcmMgKyAodjhpMTYpIGRlbHRhMTsKKyAgICAgICAgICAgIGRlbHRhMSA9IENMSVBfU0hfMF8yNTUoZGVsdGExKTsKKyAgICAgICAgICAgIGRlbHRhMSA9ICh2OGkxNikgX19tc2FfYm1uel92KCh2MTZ1OCkgZGVsdGExLCAodjE2dTgpIHAxX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKKworICAgICAgICAgICAgZGVsdGEyID0gKHY4aTE2KSBfX21zYV9hdmVyX3VfaChxMF9zcmMsIHEyX3NyYyk7CisgICAgICAgICAgICBkZWx0YTIgPSBkZWx0YTIgLSAodjhpMTYpIHExX3NyYzsKKyAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhMiAtIGRlbHRhMDsKKyAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhMiA+PiAxOworICAgICAgICAgICAgZGVsdGEyID0gQ0xJUF9TSChkZWx0YTIsIHRjX25lZywgdGNfcG9zKTsKKyAgICAgICAgICAgIGRlbHRhMiA9ICh2OGkxNikgcTFfc3JjICsgKHY4aTE2KSBkZWx0YTI7CisgICAgICAgICAgICBkZWx0YTIgPSBDTElQX1NIXzBfMjU1KGRlbHRhMik7CisgICAgICAgICAgICBkZWx0YTIgPSAodjhpMTYpIF9fbXNhX2JtbnpfdigodjE2dTgpIGRlbHRhMiwgKHYxNnU4KSBxMV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7CisKKyAgICAgICAgICAgIGRlbHRhMSA9ICh2OGkxNikgX19tc2FfYm16X3YoKHYxNnU4KSBkZWx0YTEsICh2MTZ1OCkgcDFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIGFic19kZWx0YTApOworICAgICAgICAgICAgdGVtcDAgPSAodjh1MTYpIF9fbXNhX2Jtel92KCh2MTZ1OCkgdGVtcDAsICh2MTZ1OCkgcDBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgYWJzX2RlbHRhMCk7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgX19tc2FfYm16X3YoKHYxNnU4KSB0ZW1wMiwgKHYxNnU4KSBxMF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBhYnNfZGVsdGEwKTsKKyAgICAgICAgICAgIGRlbHRhMiA9ICh2OGkxNikgX19tc2FfYm16X3YoKHYxNnU4KSBkZWx0YTIsICh2MTZ1OCkgcTFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIGFic19kZWx0YTApOworICAgICAgICAgICAgLyogd2VhayBmaWx0ZXIgZW5kcyAqLworCisgICAgICAgICAgICAvKiBwYWNrIHdlYWsgcmVzdWx0cyB0byA4IGJpdCAqLworICAgICAgICAgICAgUENLRVZfQjJfVUIoZGVsdGExLCBwMl9zcmMsIHRlbXAyLCB0ZW1wMCwgZHN0MywgZHN0NCk7CisgICAgICAgICAgICBkc3Q1ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgcTJfc3JjLCAodjE2aTgpIGRlbHRhMik7CisKKyAgICAgICAgICAgIC8qIHNlbGVjdCBiZXR3ZWVuIHdlYWsgb3Igc3Ryb25nICovCisgICAgICAgICAgICBkc3QwID0gX19tc2FfYm1uel92KGRzdDAsIGRzdDMsICh2MTZ1OCkgY21wMik7CisgICAgICAgICAgICBkc3QxID0gX19tc2FfYm1uel92KGRzdDEsIGRzdDQsICh2MTZ1OCkgY21wMik7CisgICAgICAgICAgICBkc3QyID0gX19tc2FfYm1uel92KGRzdDIsIGRzdDUsICh2MTZ1OCkgY21wMik7CisKKyAgICAgICAgICAgIC8qIHBhY2sgc3JjIHRvIDggYml0ICovCisgICAgICAgICAgICBQQ0tFVl9CMl9VQihwMV9zcmMsIHAyX3NyYywgcTBfc3JjLCBwMF9zcmMsIGRzdDMsIGRzdDQpOworICAgICAgICAgICAgZHN0NSA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHEyX3NyYywgKHYxNmk4KSBxMV9zcmMpOworCisgICAgICAgICAgICBkc3QwID0gX19tc2FfYm16X3YoZHN0MCwgZHN0MywgKHYxNnU4KSBjbXAzKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9ibXpfdihkc3QxLCBkc3Q0LCAodjE2dTgpIGNtcDMpOworICAgICAgICAgICAgZHN0MiA9IF9fbXNhX2Jtel92KGRzdDIsIGRzdDUsICh2MTZ1OCkgY21wMyk7CisKKyAgICAgICAgICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QyLCAwKTsKKyAgICAgICAgICAgIGRzdF92YWwxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QyLCAxKTsKKworICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgcDIsIHN0cmlkZSk7CisgICAgICAgICAgICBwMiArPSAoNCAqIHN0cmlkZSk7CisgICAgICAgICAgICBTRChkc3RfdmFsMCwgcDIpOworICAgICAgICAgICAgcDIgKz0gc3RyaWRlOworICAgICAgICAgICAgU0QoZHN0X3ZhbDEsIHAyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaGV2Y19sb29wZmlsdGVyX2x1bWFfdmVyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJldGEsIGludDMyX3QgKnRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpwX2lzX3BjbSwgdWludDhfdCAqcV9pc19wY20pCit7CisgICAgdWludDhfdCAqcDMgPSBzcmM7CisgICAgdWludDhfdCAqcDIgPSBzcmMgKyAzICogc3RyaWRlOworICAgIHVpbnQ4X3QgKnAxID0gc3JjICsgKHN0cmlkZSA8PCAyKTsKKyAgICB1aW50OF90ICpwMCA9IHNyYyArIDcgKiBzdHJpZGU7CisgICAgdWludDhfdCBmbGFnMCwgZmxhZzE7CisgICAgdWludDE2X3QgdG1wMCwgdG1wMTsKKyAgICB1aW50MzJfdCB0bXAyLCB0bXAzOworICAgIGludDMyX3QgZHAwMCwgZHEwMCwgZHAzMCwgZHEzMCwgZDAwLCBkMzA7CisgICAgaW50MzJfdCBkMDAzMCwgZDA0MzQ7CisgICAgaW50MzJfdCBkcDA0LCBkcTA0LCBkcDM0LCBkcTM0LCBkMDQsIGQzNDsKKyAgICBpbnQzMl90IHRjMCwgcF9pc19wY20wLCBxX2lzX3BjbTAsIGJldGEzMCwgYmV0YTIwLCB0YzI1MDsKKyAgICBpbnQzMl90IHRjNCwgcF9pc19wY200LCBxX2lzX3BjbTQsIHRjMjU0LCB0bXA7CisgICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2Mmk2NCBjbXAwLCBjbXAxLCBjbXAyLCBwX2lzX3BjbV92ZWMsIHFfaXNfcGNtX3ZlYzsKKyAgICB2Mmk2NCBjbXAzOworICAgIHY4dTE2IHRlbXAwLCB0ZW1wMTsKKyAgICB2OGkxNiB0ZW1wMjsKKyAgICB2OGkxNiB0Y19wb3MsIHRjX25lZzsKKyAgICB2OGkxNiBkaWZmMCwgZGlmZjEsIGRlbHRhMCwgZGVsdGExLCBkZWx0YTIsIGFic19kZWx0YTA7CisgICAgdjE2aTggemVybyA9IHsgMCB9OworICAgIHY4dTE2IHAzX3NyYywgcDJfc3JjLCBwMV9zcmMsIHAwX3NyYywgcTBfc3JjLCBxMV9zcmMsIHEyX3NyYywgcTNfc3JjOworCisgICAgZHAwMCA9IGFicyhwM1stM10gLSAocDNbLTJdIDw8IDEpICsgcDNbLTFdKTsKKyAgICBkcTAwID0gYWJzKHAzWzJdIC0gKHAzWzFdIDw8IDEpICsgcDNbMF0pOworICAgIGRwMzAgPSBhYnMocDJbLTNdIC0gKHAyWy0yXSA8PCAxKSArIHAyWy0xXSk7CisgICAgZHEzMCA9IGFicyhwMlsyXSAtIChwMlsxXSA8PCAxKSArIHAyWzBdKTsKKyAgICBkMDAgPSBkcDAwICsgZHEwMDsKKyAgICBkMzAgPSBkcDMwICsgZHEzMDsKKyAgICBwX2lzX3BjbTAgPSBwX2lzX3BjbVswXTsKKyAgICBxX2lzX3BjbTAgPSBxX2lzX3BjbVswXTsKKworICAgIGRwMDQgPSBhYnMocDFbLTNdIC0gKHAxWy0yXSA8PCAxKSArIHAxWy0xXSk7CisgICAgZHEwNCA9IGFicyhwMVsyXSAtIChwMVsxXSA8PCAxKSArIHAxWzBdKTsKKyAgICBkcDM0ID0gYWJzKHAwWy0zXSAtIChwMFstMl0gPDwgMSkgKyBwMFstMV0pOworICAgIGRxMzQgPSBhYnMocDBbMl0gLSAocDBbMV0gPDwgMSkgKyBwMFswXSk7CisgICAgZDA0ID0gZHAwNCArIGRxMDQ7CisgICAgZDM0ID0gZHAzNCArIGRxMzQ7CisgICAgcF9pc19wY200ID0gcF9pc19wY21bMV07CisgICAgcV9pc19wY200ID0gcV9pc19wY21bMV07CisKKyAgICBjbXAwID0gX19tc2FfZmlsbF9kKHBfaXNfcGNtMCk7CisgICAgY21wMSA9IF9fbXNhX2ZpbGxfZChwX2lzX3BjbTQpOworICAgIHBfaXNfcGNtX3ZlYyA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7CisgICAgcF9pc19wY21fdmVjID0gX19tc2FfY2VxaV9kKHBfaXNfcGNtX3ZlYywgMCk7CisKKyAgICBkMDAzMCA9IChkMDAgKyBkMzApID49IGJldGE7CisgICAgZDA0MzQgPSAoZDA0ICsgZDM0KSA+PSBiZXRhOworCisgICAgY21wMCA9IF9fbXNhX2ZpbGxfZChkMDAzMCk7CisgICAgY21wMSA9IF9fbXNhX2ZpbGxfZChkMDQzNCk7CisgICAgY21wMyA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7CisgICAgY21wMyA9ICh2Mmk2NCkgX19tc2FfY2VxaV9kKGNtcDMsIDApOworCisgICAgaWYgKCghcF9pc19wY20wIHx8ICFwX2lzX3BjbTQgfHwgIXFfaXNfcGNtMCB8fCAhcV9pc19wY200KSAmJgorICAgICAgICAoIWQwMDMwIHx8ICFkMDQzNCkpIHsKKyAgICAgICAgc3JjIC09IDQ7CisgICAgICAgIExEX1VIOChzcmMsIHN0cmlkZSwgcDNfc3JjLCBwMl9zcmMsIHAxX3NyYywgcDBfc3JjLCBxMF9zcmMsIHExX3NyYywKKyAgICAgICAgICAgICAgIHEyX3NyYywgcTNfc3JjKTsKKworICAgICAgICBjbXAwID0gX19tc2FfZmlsbF9kKHFfaXNfcGNtMCk7CisgICAgICAgIGNtcDEgPSBfX21zYV9maWxsX2QocV9pc19wY200KTsKKyAgICAgICAgcV9pc19wY21fdmVjID0gX19tc2FfaWx2ZXZfZChjbXAxLCBjbXAwKTsKKyAgICAgICAgcV9pc19wY21fdmVjID0gX19tc2FfY2VxaV9kKHFfaXNfcGNtX3ZlYywgMCk7CisKKyAgICAgICAgdGMwID0gdGNbMF07CisgICAgICAgIGJldGEzMCA9IGJldGEgPj4gMzsKKyAgICAgICAgYmV0YTIwID0gYmV0YSA+PiAyOworICAgICAgICB0YzI1MCA9ICgodGMwICogNSArIDEpID4+IDEpOworCisgICAgICAgIHRjNCA9IHRjWzFdOworICAgICAgICB0YzI1NCA9ICgodGM0ICogNSArIDEpID4+IDEpOworICAgICAgICBjbXAwID0gKHYyaTY0KSBfX21zYV9maWxsX2godGMwIDw8IDEpOworICAgICAgICBjbXAxID0gKHYyaTY0KSBfX21zYV9maWxsX2godGM0IDw8IDEpOworICAgICAgICB0Y19wb3MgPSAodjhpMTYpIF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7CisKKyAgICAgICAgVFJBTlNQT1NFOHg4X1VCX1VIKHAzX3NyYywgcDJfc3JjLCBwMV9zcmMsIHAwX3NyYywgcTBfc3JjLCBxMV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBxMl9zcmMsIHEzX3NyYywgcDNfc3JjLCBwMl9zcmMsIHAxX3NyYywgcDBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcTBfc3JjLCBxMV9zcmMsIHEyX3NyYywgcTNfc3JjKTsKKworICAgICAgICBmbGFnMCA9IGFicyhwM1stNF0gLSBwM1stMV0pICsgYWJzKHAzWzNdIC0gcDNbMF0pIDwgYmV0YTMwICYmCisgICAgICAgICAgICAgICAgYWJzKHAzWy0xXSAtIHAzWzBdKSA8IHRjMjUwOworICAgICAgICBmbGFnMCA9IGZsYWcwICYmIChhYnMocDJbLTRdIC0gcDJbLTFdKSArIGFicyhwMlszXSAtIHAyWzBdKSA8IGJldGEzMCAmJgorICAgICAgICAgICAgICAgIGFicyhwMlstMV0gLSBwMlswXSkgPCB0YzI1MCAmJiAoZDAwIDw8IDEpIDwgYmV0YTIwICYmCisgICAgICAgICAgICAgICAgKGQzMCA8PCAxKSA8IGJldGEyMCk7CisgICAgICAgIGNtcDAgPSBfX21zYV9maWxsX2QoZmxhZzApOworICAgICAgICBJTFZSX0I0X1VIKHplcm8sIHAzX3NyYywgemVybywgcDJfc3JjLCB6ZXJvLCBwMV9zcmMsIHplcm8sIHAwX3NyYywKKyAgICAgICAgICAgICAgICAgICBwM19zcmMsIHAyX3NyYywgcDFfc3JjLCBwMF9zcmMpOworCisgICAgICAgIGZsYWcxID0gYWJzKHAxWy00XSAtIHAxWy0xXSkgKyBhYnMocDFbM10gLSBwMVswXSkgPCBiZXRhMzAgJiYKKyAgICAgICAgICAgICAgICBhYnMocDFbLTFdIC0gcDFbMF0pIDwgdGMyNTQ7CisgICAgICAgIGZsYWcxID0gZmxhZzEgJiYgKGFicyhwMFstNF0gLSBwMFstMV0pICsgYWJzKHAwWzNdIC0gcDBbMF0pIDwgYmV0YTMwICYmCisgICAgICAgICAgICAgICAgYWJzKHAwWy0xXSAtIHAwWzBdKSA8IHRjMjU0ICYmIChkMDQgPDwgMSkgPCBiZXRhMjAgJiYKKyAgICAgICAgICAgICAgICAoZDM0IDw8IDEpIDwgYmV0YTIwKTsKKyAgICAgICAgSUxWUl9CNF9VSCh6ZXJvLCBxMF9zcmMsIHplcm8sIHExX3NyYywgemVybywgcTJfc3JjLCB6ZXJvLCBxM19zcmMsCisgICAgICAgICAgICAgICAgICAgcTBfc3JjLCBxMV9zcmMsIHEyX3NyYywgcTNfc3JjKTsKKworICAgICAgICBjbXAxID0gX19tc2FfZmlsbF9kKGZsYWcxKTsKKyAgICAgICAgY21wMiA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7CisgICAgICAgIGNtcDIgPSBfX21zYV9jZXFpX2QoY21wMiwgMCk7CisKKyAgICAgICAgaWYgKGZsYWcwICYmIGZsYWcxKSB7IC8qIHN0cm9uZyBvbmx5ICovCisgICAgICAgICAgICAvKiBzdHJvbmcgZmlsdGVyICovCisgICAgICAgICAgICB0Y19uZWcgPSAtdGNfcG9zOworCisgICAgICAgICAgICAvKiBwIHBhcnQgKi8KKyAgICAgICAgICAgIHRlbXAwID0gKHAxX3NyYyArIHAwX3NyYyArIHEwX3NyYyk7CisKKyAgICAgICAgICAgIHRlbXAxID0gKChwM19zcmMgKyBwMl9zcmMpIDw8IDEpICsgcDJfc3JjICsgdGVtcDA7CisgICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAzKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBwMl9zcmMpOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7CisgICAgICAgICAgICBkc3QwID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHAyX3NyYyk7CisKKyAgICAgICAgICAgIHRlbXAxID0gdGVtcDAgKyBwMl9zcmM7CisgICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAyKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBwMV9zcmMpOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7CisgICAgICAgICAgICBkc3QxID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHAxX3NyYyk7CisKKyAgICAgICAgICAgIHRlbXAxID0gKHRlbXAwIDw8IDEpICsgcDJfc3JjICsgcTFfc3JjOworICAgICAgICAgICAgdGVtcDEgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSB0ZW1wMSwgMyk7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgKHRlbXAxIC0gcDBfc3JjKTsKKyAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSCh0ZW1wMiwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZHN0MiA9ICh2MTZ1OCkgKHRlbXAyICsgKHY4aTE2KSBwMF9zcmMpOworCisgICAgICAgICAgICBkc3QwID0gX19tc2FfYm16X3YoZHN0MCwgKHYxNnU4KSBwMl9zcmMsICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9ibXpfdihkc3QxLCAodjE2dTgpIHAxX3NyYywgKHYxNnU4KSBwX2lzX3BjbV92ZWMpOworICAgICAgICAgICAgZHN0MiA9IF9fbXNhX2Jtel92KGRzdDIsICh2MTZ1OCkgcDBfc3JjLCAodjE2dTgpIHBfaXNfcGNtX3ZlYyk7CisKKyAgICAgICAgICAgIC8qIHEgcGFydCAqLworICAgICAgICAgICAgdGVtcDAgPSAocTFfc3JjICsgcDBfc3JjICsgcTBfc3JjKTsKKyAgICAgICAgICAgIHRlbXAxID0gKChxM19zcmMgKyBxMl9zcmMpIDw8IDEpICsgcTJfc3JjICsgdGVtcDA7CisgICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAzKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBxMl9zcmMpOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7CisgICAgICAgICAgICBkc3Q1ID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHEyX3NyYyk7CisKKyAgICAgICAgICAgIHRlbXAxID0gdGVtcDAgKyBxMl9zcmM7CisgICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAyKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBxMV9zcmMpOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7CisgICAgICAgICAgICBkc3Q0ID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHExX3NyYyk7CisKKyAgICAgICAgICAgIHRlbXAxID0gKHRlbXAwIDw8IDEpICsgcDFfc3JjICsgcTJfc3JjOworICAgICAgICAgICAgdGVtcDEgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSB0ZW1wMSwgMyk7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgKHRlbXAxIC0gcTBfc3JjKTsKKyAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSCh0ZW1wMiwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZHN0MyA9ICh2MTZ1OCkgKHRlbXAyICsgKHY4aTE2KSBxMF9zcmMpOworCisgICAgICAgICAgICBkc3QzID0gX19tc2FfYm16X3YoZHN0MywgKHYxNnU4KSBxMF9zcmMsICh2MTZ1OCkgcV9pc19wY21fdmVjKTsKKyAgICAgICAgICAgIGRzdDQgPSBfX21zYV9ibXpfdihkc3Q0LCAodjE2dTgpIHExX3NyYywgKHYxNnU4KSBxX2lzX3BjbV92ZWMpOworICAgICAgICAgICAgZHN0NSA9IF9fbXNhX2Jtel92KGRzdDUsICh2MTZ1OCkgcTJfc3JjLCAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7CisgICAgICAgICAgICAvKiBzdHJvbmcgZmlsdGVyIGVuZHMgKi8KKyAgICAgICAgfSBlbHNlIGlmIChmbGFnMCA9PSBmbGFnMSkgeyAvKiB3ZWFrIG9ubHkgKi8KKyAgICAgICAgICAgIC8qIHdlYWsgZmlsdGVyICovCisgICAgICAgICAgICB0Y19wb3MgPj49IDE7CisgICAgICAgICAgICB0Y19uZWcgPSAtdGNfcG9zOworCisgICAgICAgICAgICBkaWZmMCA9ICh2OGkxNikgKHEwX3NyYyAtIHAwX3NyYyk7CisgICAgICAgICAgICBkaWZmMSA9ICh2OGkxNikgKHExX3NyYyAtIHAxX3NyYyk7CisgICAgICAgICAgICBkaWZmMCA9IChkaWZmMCA8PCAzKSArIGRpZmYwOworICAgICAgICAgICAgZGlmZjEgPSAoZGlmZjEgPDwgMSkgKyBkaWZmMTsKKyAgICAgICAgICAgIGRlbHRhMCA9IGRpZmYwIC0gZGlmZjE7CisgICAgICAgICAgICBkZWx0YTAgPSBfX21zYV9zcmFyaV9oKGRlbHRhMCwgNCk7CisKKyAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSAoKHRjX3BvcyA8PCAzKSArICh0Y19wb3MgPDwgMSkpOworICAgICAgICAgICAgYWJzX2RlbHRhMCA9IF9fbXNhX2FkZF9hX2goZGVsdGEwLCAodjhpMTYpIHplcm8pOworICAgICAgICAgICAgYWJzX2RlbHRhMCA9ICh2OHUxNikgYWJzX2RlbHRhMCA8IHRlbXAxOworCisgICAgICAgICAgICBkZWx0YTAgPSBDTElQX1NIKGRlbHRhMCwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgdGVtcDAgPSAodjh1MTYpIChkZWx0YTAgKyBwMF9zcmMpOworICAgICAgICAgICAgdGVtcDAgPSAodjh1MTYpIENMSVBfU0hfMF8yNTUodGVtcDApOworICAgICAgICAgICAgdGVtcDAgPSAodjh1MTYpIF9fbXNhX2Jtel92KCh2MTZ1OCkgdGVtcDAsICh2MTZ1OCkgcDBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKKworICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpIChxMF9zcmMgLSBkZWx0YTApOworICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIXzBfMjU1KHRlbXAyKTsKKyAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSBfX21zYV9ibXpfdigodjE2dTgpIHRlbXAyLCAodjE2dTgpIHEwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7CisKKyAgICAgICAgICAgIHRtcCA9ICgoYmV0YSArIChiZXRhID4+IDEpKSA+PiAzKTsKKyAgICAgICAgICAgIGNtcDAgPSBfX21zYV9maWxsX2QoIXBfaXNfcGNtMCAmJiAoKGRwMDAgKyBkcDMwKSA8IHRtcCkpOworICAgICAgICAgICAgY21wMSA9IF9fbXNhX2ZpbGxfZCghcF9pc19wY200ICYmICgoZHAwNCArIGRwMzQpIDwgdG1wKSk7CisgICAgICAgICAgICBwX2lzX3BjbV92ZWMgPSBfX21zYV9pbHZldl9kKGNtcDEsIGNtcDApOworICAgICAgICAgICAgcF9pc19wY21fdmVjID0gX19tc2FfY2VxaV9kKHBfaXNfcGNtX3ZlYywgMCk7CisKKyAgICAgICAgICAgIGNtcDAgPSAodjJpNjQpIF9fbXNhX2ZpbGxfaCgoIXFfaXNfcGNtMCkgJiYgKGRxMDAgKyBkcTMwIDwgdG1wKSk7CisgICAgICAgICAgICBjbXAxID0gKHYyaTY0KSBfX21zYV9maWxsX2goKCFxX2lzX3BjbTQpICYmIChkcTA0ICsgZHEzNCA8IHRtcCkpOworICAgICAgICAgICAgcV9pc19wY21fdmVjID0gX19tc2FfaWx2ZXZfZChjbXAxLCBjbXAwKTsKKyAgICAgICAgICAgIHFfaXNfcGNtX3ZlYyA9IF9fbXNhX2NlcWlfZChxX2lzX3BjbV92ZWMsIDApOworCisgICAgICAgICAgICB0Y19wb3MgPj49IDE7CisgICAgICAgICAgICB0Y19uZWcgPSAtdGNfcG9zOworCisgICAgICAgICAgICBkZWx0YTEgPSAodjhpMTYpIF9fbXNhX2F2ZXJfdV9oKHAyX3NyYywgcDBfc3JjKTsKKyAgICAgICAgICAgIGRlbHRhMSAtPSAodjhpMTYpIHAxX3NyYzsKKyAgICAgICAgICAgIGRlbHRhMSArPSBkZWx0YTA7CisgICAgICAgICAgICBkZWx0YTEgPj49IDE7CisgICAgICAgICAgICBkZWx0YTEgPSBDTElQX1NIKGRlbHRhMSwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZGVsdGExID0gKHY4aTE2KSBwMV9zcmMgKyAodjhpMTYpIGRlbHRhMTsKKyAgICAgICAgICAgIGRlbHRhMSA9IENMSVBfU0hfMF8yNTUoZGVsdGExKTsKKyAgICAgICAgICAgIGRlbHRhMSA9ICh2OGkxNikgX19tc2FfYm1uel92KCh2MTZ1OCkgZGVsdGExLCAodjE2dTgpIHAxX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKKworICAgICAgICAgICAgZGVsdGEyID0gKHY4aTE2KSBfX21zYV9hdmVyX3VfaChxMF9zcmMsIHEyX3NyYyk7CisgICAgICAgICAgICBkZWx0YTIgPSBkZWx0YTIgLSAodjhpMTYpIHExX3NyYzsKKyAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhMiAtIGRlbHRhMDsKKyAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhMiA+PiAxOworICAgICAgICAgICAgZGVsdGEyID0gQ0xJUF9TSChkZWx0YTIsIHRjX25lZywgdGNfcG9zKTsKKyAgICAgICAgICAgIGRlbHRhMiA9ICh2OGkxNikgcTFfc3JjICsgKHY4aTE2KSBkZWx0YTI7CisgICAgICAgICAgICBkZWx0YTIgPSBDTElQX1NIXzBfMjU1KGRlbHRhMik7CisgICAgICAgICAgICBkZWx0YTIgPSAodjhpMTYpIF9fbXNhX2JtbnpfdigodjE2dTgpIGRlbHRhMiwgKHYxNnU4KSBxMV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7CisKKyAgICAgICAgICAgIGRzdDAgPSBfX21zYV9ibXpfdigodjE2dTgpIGRlbHRhMSwgKHYxNnU4KSBwMV9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBhYnNfZGVsdGEwKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9ibXpfdigodjE2dTgpIHRlbXAwLCAodjE2dTgpIHAwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIGFic19kZWx0YTApOworICAgICAgICAgICAgZHN0MiA9IF9fbXNhX2Jtel92KCh2MTZ1OCkgdGVtcDIsICh2MTZ1OCkgcTBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgYWJzX2RlbHRhMCk7CisgICAgICAgICAgICBkc3QzID0gX19tc2FfYm16X3YoKHYxNnU4KSBkZWx0YTIsICh2MTZ1OCkgcTFfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgYWJzX2RlbHRhMCk7CisgICAgICAgICAgICAvKiB3ZWFrIGZpbHRlciBlbmRzICovCisKKyAgICAgICAgICAgIGRzdDAgPSBfX21zYV9ibXpfdihkc3QwLCAodjE2dTgpIHAxX3NyYywgKHYxNnU4KSBjbXAzKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9ibXpfdihkc3QxLCAodjE2dTgpIHAwX3NyYywgKHYxNnU4KSBjbXAzKTsKKyAgICAgICAgICAgIGRzdDIgPSBfX21zYV9ibXpfdihkc3QyLCAodjE2dTgpIHEwX3NyYywgKHYxNnU4KSBjbXAzKTsKKyAgICAgICAgICAgIGRzdDMgPSBfX21zYV9ibXpfdihkc3QzLCAodjE2dTgpIHExX3NyYywgKHYxNnU4KSBjbXAzKTsKKworICAgICAgICAgICAgUENLRVZfQjJfVUIoZHN0MiwgZHN0MCwgZHN0MywgZHN0MSwgZHN0MCwgZHN0MSk7CisKKyAgICAgICAgICAgIC8qIHRyYW5zcG9zZSAqLworICAgICAgICAgICAgSUxWUkxfQjJfVUIoZHN0MSwgZHN0MCwgZHN0NCwgZHN0NSk7CisgICAgICAgICAgICBJTFZSTF9IMl9VQihkc3Q1LCBkc3Q0LCBkc3QwLCBkc3QxKTsKKworICAgICAgICAgICAgc3JjICs9IDI7CisKKyAgICAgICAgICAgIHRtcDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDApOworICAgICAgICAgICAgdG1wMyA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMSk7CisgICAgICAgICAgICBTVyh0bXAyLCBzcmMpOworICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgICAgIFNXKHRtcDMsIHNyYyk7CisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlOworCisgICAgICAgICAgICB0bXAyID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAyKTsKKyAgICAgICAgICAgIHRtcDMgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDMpOworICAgICAgICAgICAgU1codG1wMiwgc3JjKTsKKyAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgICAgICBTVyh0bXAzLCBzcmMpOworICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKKworICAgICAgICAgICAgdG1wMiA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MSwgMCk7CisgICAgICAgICAgICB0bXAzID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QxLCAxKTsKKyAgICAgICAgICAgIFNXKHRtcDIsIHNyYyk7CisgICAgICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICAgICAgU1codG1wMywgc3JjKTsKKyAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7CisKKyAgICAgICAgICAgIHRtcDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDEsIDIpOworICAgICAgICAgICAgdG1wMyA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MSwgMyk7CisgICAgICAgICAgICBTVyh0bXAyLCBzcmMpOworICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgICAgIFNXKHRtcDMsIHNyYyk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsgLyogc3Ryb25nICsgd2VhayAqLworICAgICAgICAgICAgLyogc3Ryb25nIGZpbHRlciAqLworICAgICAgICAgICAgdGNfbmVnID0gLXRjX3BvczsKKworICAgICAgICAgICAgLyogcCBwYXJ0ICovCisgICAgICAgICAgICB0ZW1wMCA9IChwMV9zcmMgKyBwMF9zcmMgKyBxMF9zcmMpOworCisgICAgICAgICAgICB0ZW1wMSA9ICgocDNfc3JjICsgcDJfc3JjKSA8PCAxKSArIHAyX3NyYyArIHRlbXAwOworICAgICAgICAgICAgdGVtcDEgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSB0ZW1wMSwgMyk7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgKHRlbXAxIC0gcDJfc3JjKTsKKyAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSCh0ZW1wMiwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZHN0MCA9ICh2MTZ1OCkgKHRlbXAyICsgKHY4aTE2KSBwMl9zcmMpOworCisgICAgICAgICAgICB0ZW1wMSA9IHRlbXAwICsgcDJfc3JjOworICAgICAgICAgICAgdGVtcDEgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSB0ZW1wMSwgMik7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgKHRlbXAxIC0gcDFfc3JjKTsKKyAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSCh0ZW1wMiwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZHN0MSA9ICh2MTZ1OCkgKHRlbXAyICsgKHY4aTE2KSBwMV9zcmMpOworCisgICAgICAgICAgICB0ZW1wMSA9ICh0ZW1wMCA8PCAxKSArIHAyX3NyYyArIHExX3NyYzsKKyAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDMpOworICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpICh0ZW1wMSAtIHAwX3NyYyk7CisgICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKKyAgICAgICAgICAgIGRzdDIgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcDBfc3JjKTsKKworICAgICAgICAgICAgZHN0MCA9IF9fbXNhX2Jtel92KGRzdDAsICh2MTZ1OCkgcDJfc3JjLCAodjE2dTgpIHBfaXNfcGNtX3ZlYyk7CisgICAgICAgICAgICBkc3QxID0gX19tc2FfYm16X3YoZHN0MSwgKHYxNnU4KSBwMV9zcmMsICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKKyAgICAgICAgICAgIGRzdDIgPSBfX21zYV9ibXpfdihkc3QyLCAodjE2dTgpIHAwX3NyYywgKHYxNnU4KSBwX2lzX3BjbV92ZWMpOworCisgICAgICAgICAgICAvKiBxIHBhcnQgKi8KKyAgICAgICAgICAgIHRlbXAwID0gKHExX3NyYyArIHAwX3NyYyArIHEwX3NyYyk7CisgICAgICAgICAgICB0ZW1wMSA9ICgocTNfc3JjICsgcTJfc3JjKSA8PCAxKSArIHEyX3NyYyArIHRlbXAwOworICAgICAgICAgICAgdGVtcDEgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSB0ZW1wMSwgMyk7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgKHRlbXAxIC0gcTJfc3JjKTsKKyAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSCh0ZW1wMiwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZHN0NSA9ICh2MTZ1OCkgKHRlbXAyICsgKHY4aTE2KSBxMl9zcmMpOworCisgICAgICAgICAgICB0ZW1wMSA9IHRlbXAwICsgcTJfc3JjOworICAgICAgICAgICAgdGVtcDEgPSAodjh1MTYpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSB0ZW1wMSwgMik7CisgICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgKHRlbXAxIC0gcTFfc3JjKTsKKyAgICAgICAgICAgIHRlbXAyID0gQ0xJUF9TSCh0ZW1wMiwgdGNfbmVnLCB0Y19wb3MpOworICAgICAgICAgICAgZHN0NCA9ICh2MTZ1OCkgKHRlbXAyICsgKHY4aTE2KSBxMV9zcmMpOworCisgICAgICAgICAgICB0ZW1wMSA9ICh0ZW1wMCA8PCAxKSArIHAxX3NyYyArIHEyX3NyYzsKKyAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDMpOworICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpICh0ZW1wMSAtIHEwX3NyYyk7CisgICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKKyAgICAgICAgICAgIGRzdDMgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcTBfc3JjKTsKKworICAgICAgICAgICAgZHN0MyA9IF9fbXNhX2Jtel92KGRzdDMsICh2MTZ1OCkgcTBfc3JjLCAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7CisgICAgICAgICAgICBkc3Q0ID0gX19tc2FfYm16X3YoZHN0NCwgKHYxNnU4KSBxMV9zcmMsICh2MTZ1OCkgcV9pc19wY21fdmVjKTsKKyAgICAgICAgICAgIGRzdDUgPSBfX21zYV9ibXpfdihkc3Q1LCAodjE2dTgpIHEyX3NyYywgKHYxNnU4KSBxX2lzX3BjbV92ZWMpOworICAgICAgICAgICAgLyogc3Ryb25nIGZpbHRlciBlbmRzICovCisKKyAgICAgICAgICAgIC8qIHdlYWsgZmlsdGVyICovCiAgICAgICAgICAgICB0Y19wb3MgPj49IDE7CiAgICAgICAgICAgICB0Y19uZWcgPSAtdGNfcG9zOwogCkBAIC0yMjYsNyArODM0LDYgQEAKICAgICAgICAgICAgIGRlbHRhMiA9IENMSVBfU0hfMF8yNTUoZGVsdGEyKTsKICAgICAgICAgICAgIGRlbHRhMiA9ICh2OGkxNikgX19tc2FfYm1uel92KCh2MTZ1OCkgZGVsdGEyLCAodjE2dTgpIHExX3NyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgcV9pc19wY21fdmVjKTsKLQogICAgICAgICAgICAgZGVsdGExID0gKHY4aTE2KSBfX21zYV9ibXpfdigodjE2dTgpIGRlbHRhMSwgKHYxNnU4KSBwMV9zcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgYWJzX2RlbHRhMCk7CiAgICAgICAgICAgICB0ZW1wMCA9ICh2OHUxNikgX19tc2FfYm16X3YoKHYxNnU4KSB0ZW1wMCwgKHYxNnU4KSBwMF9zcmMsCkBAIC0yMzUsMzIzICs4NDIsNzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIGFic19kZWx0YTApOwogICAgICAgICAgICAgZGVsdGEyID0gKHY4aTE2KSBfX21zYV9ibXpfdigodjE2dTgpIGRlbHRhMiwgKHYxNnU4KSBxMV9zcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgYWJzX2RlbHRhMCk7CisgICAgICAgICAgICAvKiB3ZWFrIGZpbHRlciBlbmRzKi8KIAorICAgICAgICAgICAgLyogc2VsZWN0IGJldHdlZW4gd2VhayBvciBzdHJvbmcgKi8KICAgICAgICAgICAgIGRzdDIgPSBfX21zYV9ibW56X3YoZHN0MiwgKHYxNnU4KSB0ZW1wMCwgKHYxNnU4KSBjbXAyKTsKICAgICAgICAgICAgIGRzdDMgPSBfX21zYV9ibW56X3YoZHN0MywgKHYxNnU4KSB0ZW1wMiwgKHYxNnU4KSBjbXAyKTsKICAgICAgICAgICAgIGRzdDEgPSBfX21zYV9ibW56X3YoZHN0MSwgKHYxNnU4KSBkZWx0YTEsICh2MTZ1OCkgY21wMik7CiAgICAgICAgICAgICBkc3Q0ID0gX19tc2FfYm1uel92KGRzdDQsICh2MTZ1OCkgZGVsdGEyLCAodjE2dTgpIGNtcDIpOwogICAgICAgICAgICAgZHN0MCA9IF9fbXNhX2Jtbnpfdihkc3QwLCAodjE2dTgpIHAyX3NyYywgKHYxNnU4KSBjbXAyKTsKICAgICAgICAgICAgIGRzdDUgPSBfX21zYV9ibW56X3YoZHN0NSwgKHYxNnU4KSBxMl9zcmMsICh2MTZ1OCkgY21wMik7Ci0KLSAgICAgICAgICAgIGNtcDAgPSBfX21zYV9maWxsX2QoZDAwICsgZDMwID49IGJldGEpOwotICAgICAgICAgICAgY21wMSA9IF9fbXNhX2ZpbGxfZChkMDQgKyBkMzQgPj0gYmV0YSk7Ci0gICAgICAgICAgICBjbXAwID0gX19tc2FfaWx2ZXZfZChjbXAxLCBjbXAwKTsKLSAgICAgICAgICAgIGNtcDAgPSBfX21zYV9jZXFpX2QoY21wMCwgMCk7Ci0KLSAgICAgICAgICAgIGRzdDAgPSBfX21zYV9ibXpfdihkc3QwLCAodjE2dTgpIHAyX3NyYywgKHYxNnU4KSBjbXAwKTsKLSAgICAgICAgICAgIGRzdDEgPSBfX21zYV9ibXpfdihkc3QxLCAodjE2dTgpIHAxX3NyYywgKHYxNnU4KSBjbXAwKTsKLSAgICAgICAgICAgIGRzdDIgPSBfX21zYV9ibXpfdihkc3QyLCAodjE2dTgpIHAwX3NyYywgKHYxNnU4KSBjbXAwKTsKLSAgICAgICAgICAgIGRzdDMgPSBfX21zYV9ibXpfdihkc3QzLCAodjE2dTgpIHEwX3NyYywgKHYxNnU4KSBjbXAwKTsKLSAgICAgICAgICAgIGRzdDQgPSBfX21zYV9ibXpfdihkc3Q0LCAodjE2dTgpIHExX3NyYywgKHYxNnU4KSBjbXAwKTsKLSAgICAgICAgICAgIGRzdDUgPSBfX21zYV9ibXpfdihkc3Q1LCAodjE2dTgpIHEyX3NyYywgKHYxNnU4KSBjbXAwKTsKLQotICAgICAgICAgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7Ci0gICAgICAgICAgICBkc3QyID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0NSwgKHYxNmk4KSBkc3Q0KTsKLQotICAgICAgICAgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDIsIDApOwotICAgICAgICAgICAgZHN0X3ZhbDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDIsIDEpOwotCi0gICAgICAgICAgICBTVDh4NF9VQihkc3QwLCBkc3QxLCBwMiwgc3RyaWRlKTsKLSAgICAgICAgICAgIHAyICs9ICg0ICogc3RyaWRlKTsKLSAgICAgICAgICAgIFNEKGRzdF92YWwwLCBwMik7Ci0gICAgICAgICAgICBwMiArPSBzdHJpZGU7Ci0gICAgICAgICAgICBTRChkc3RfdmFsMSwgcDIpOwogICAgICAgICB9Ci0gICAgfQotfQogCi1zdGF0aWMgdm9pZCBoZXZjX2xvb3BmaWx0ZXJfbHVtYV92ZXJfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmV0YSwgaW50MzJfdCAqdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBfaXNfcGNtLCB1aW50OF90ICpxX2lzX3BjbSkKLXsKLSAgICB1aW50OF90ICpwMyA9IHNyYzsKLSAgICB1aW50OF90ICpwMiA9IHNyYyArIDMgKiBzdHJpZGU7Ci0gICAgdWludDhfdCAqcDEgPSBzcmMgKyAoc3RyaWRlIDw8IDIpOwotICAgIHVpbnQ4X3QgKnAwID0gc3JjICsgNyAqIHN0cmlkZTsKLSAgICB1aW50OF90IGZsYWcwLCBmbGFnMTsKLSAgICB1aW50MTZfdCB0bXAwLCB0bXAxOwotICAgIHVpbnQzMl90IHRtcDIsIHRtcDM7Ci0gICAgaW50MzJfdCBkcDAwLCBkcTAwLCBkcDMwLCBkcTMwLCBkMDAsIGQzMDsKLSAgICBpbnQzMl90IGRwMDQsIGRxMDQsIGRwMzQsIGRxMzQsIGQwNCwgZDM0OwotICAgIGludDMyX3QgdGMwLCBwX2lzX3BjbTAsIHFfaXNfcGNtMCwgYmV0YTMwLCBiZXRhMjAsIHRjMjUwOwotICAgIGludDMyX3QgdGM0LCBwX2lzX3BjbTQsIHFfaXNfcGNtNCwgdGMyNTQsIHRtcDsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwotICAgIHYyaTY0IGNtcDAsIGNtcDEsIGNtcDIsIHBfaXNfcGNtX3ZlYywgcV9pc19wY21fdmVjOwotICAgIHY4dTE2IHRlbXAwLCB0ZW1wMTsKLSAgICB2OGkxNiB0ZW1wMjsKLSAgICB2OGkxNiB0Y19wb3MsIHRjX25lZzsKLSAgICB2OGkxNiBkaWZmMCwgZGlmZjEsIGRlbHRhMCwgZGVsdGExLCBkZWx0YTIsIGFic19kZWx0YTA7Ci0gICAgdjE2aTggemVybyA9IHsgMCB9OwotICAgIHY4dTE2IHAzX3NyYywgcDJfc3JjLCBwMV9zcmMsIHAwX3NyYywgcTBfc3JjLCBxMV9zcmMsIHEyX3NyYywgcTNfc3JjOworICAgICAgICBkc3QwID0gX19tc2FfYm16X3YoZHN0MCwgKHYxNnU4KSBwMl9zcmMsICh2MTZ1OCkgY21wMyk7CisgICAgICAgIGRzdDEgPSBfX21zYV9ibXpfdihkc3QxLCAodjE2dTgpIHAxX3NyYywgKHYxNnU4KSBjbXAzKTsKKyAgICAgICAgZHN0MiA9IF9fbXNhX2Jtel92KGRzdDIsICh2MTZ1OCkgcDBfc3JjLCAodjE2dTgpIGNtcDMpOworICAgICAgICBkc3QzID0gX19tc2FfYm16X3YoZHN0MywgKHYxNnU4KSBxMF9zcmMsICh2MTZ1OCkgY21wMyk7CisgICAgICAgIGRzdDQgPSBfX21zYV9ibXpfdihkc3Q0LCAodjE2dTgpIHExX3NyYywgKHYxNnU4KSBjbXAzKTsKKyAgICAgICAgZHN0NSA9IF9fbXNhX2Jtel92KGRzdDUsICh2MTZ1OCkgcTJfc3JjLCAodjE2dTgpIGNtcDMpOwogCi0gICAgZHAwMCA9IGFicyhwM1stM10gLSAocDNbLTJdIDw8IDEpICsgcDNbLTFdKTsKLSAgICBkcTAwID0gYWJzKHAzWzJdIC0gKHAzWzFdIDw8IDEpICsgcDNbMF0pOwotICAgIGRwMzAgPSBhYnMocDJbLTNdIC0gKHAyWy0yXSA8PCAxKSArIHAyWy0xXSk7Ci0gICAgZHEzMCA9IGFicyhwMlsyXSAtIChwMlsxXSA8PCAxKSArIHAyWzBdKTsKLSAgICBkMDAgPSBkcDAwICsgZHEwMDsKLSAgICBkMzAgPSBkcDMwICsgZHEzMDsKLSAgICBwX2lzX3BjbTAgPSBwX2lzX3BjbVswXTsKLSAgICBxX2lzX3BjbTAgPSBxX2lzX3BjbVswXTsKKyAgICAgICAgLyogcGFjayByZXN1bHRzIHRvIDggYml0ICovCisgICAgICAgIFBDS0VWX0I0X1VCKGRzdDIsIGRzdDAsIGRzdDMsIGRzdDEsIGRzdDQsIGRzdDQsIGRzdDUsIGRzdDUsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDMpOwogCi0gICAgZHAwNCA9IGFicyhwMVstM10gLSAocDFbLTJdIDw8IDEpICsgcDFbLTFdKTsKLSAgICBkcTA0ID0gYWJzKHAxWzJdIC0gKHAxWzFdIDw8IDEpICsgcDFbMF0pOwotICAgIGRwMzQgPSBhYnMocDBbLTNdIC0gKHAwWy0yXSA8PCAxKSArIHAwWy0xXSk7Ci0gICAgZHEzNCA9IGFicyhwMFsyXSAtIChwMFsxXSA8PCAxKSArIHAwWzBdKTsKLSAgICBkMDQgPSBkcDA0ICsgZHEwNDsKLSAgICBkMzQgPSBkcDM0ICsgZHEzNDsKLSAgICBwX2lzX3BjbTQgPSBwX2lzX3BjbVsxXTsKLSAgICBxX2lzX3BjbTQgPSBxX2lzX3BjbVsxXTsKKyAgICAgICAgLyogdHJhbnNwb3NlICovCisgICAgICAgIElMVlJMX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDQsIGRzdDUpOworICAgICAgICBJTFZSTF9CMl9VQihkc3QzLCBkc3QyLCBkc3Q2LCBkc3Q3KTsKKyAgICAgICAgSUxWUkxfSDJfVUIoZHN0NSwgZHN0NCwgZHN0MCwgZHN0MSk7CisgICAgICAgIElMVlJMX0gyX1VCKGRzdDcsIGRzdDYsIGRzdDIsIGRzdDMpOwogCi0gICAgaWYgKCFwX2lzX3BjbTAgfHwgIXBfaXNfcGNtNCB8fCAhcV9pc19wY20wIHx8ICFxX2lzX3BjbTQpIHsKLSAgICAgICAgaWYgKCEoZDAwICsgZDMwID49IGJldGEpIHx8ICEoZDA0ICsgZDM0ID49IGJldGEpKSB7Ci0gICAgICAgICAgICBzcmMgLT0gNDsKLSAgICAgICAgICAgIExEX1VIOChzcmMsIHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICBwM19zcmMsIHAyX3NyYywgcDFfc3JjLCBwMF9zcmMsIHEwX3NyYywgcTFfc3JjLCBxMl9zcmMsCi0gICAgICAgICAgICAgICAgICAgcTNfc3JjKTsKKyAgICAgICAgc3JjICs9IDE7CiAKLSAgICAgICAgICAgIHRjMCA9IHRjWzBdOwotICAgICAgICAgICAgYmV0YTMwID0gYmV0YSA+PiAzOwotICAgICAgICAgICAgYmV0YTIwID0gYmV0YSA+PiAyOwotICAgICAgICAgICAgdGMyNTAgPSAoKHRjMCAqIDUgKyAxKSA+PiAxKTsKKyAgICAgICAgdG1wMiA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMCk7CisgICAgICAgIHRtcDMgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDEpOworICAgICAgICB0bXAwID0gX19tc2FfY29weV91X2goKHY4aTE2KSBkc3QyLCAwKTsKKyAgICAgICAgdG1wMSA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0MiwgMik7CisgICAgICAgIFNXKHRtcDIsIHNyYyk7CisgICAgICAgIFNIKHRtcDAsIHNyYyArIDQpOworICAgICAgICBzcmMgKz0gc3RyaWRlOworICAgICAgICBTVyh0bXAzLCBzcmMpOworICAgICAgICBTSCh0bXAxLCBzcmMgKyA0KTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKIAotICAgICAgICAgICAgdGM0ID0gdGNbMV07Ci0gICAgICAgICAgICB0YzI1NCA9ICgodGM0ICogNSArIDEpID4+IDEpOworICAgICAgICB0bXAyID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAyKTsKKyAgICAgICAgdG1wMyA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMyk7CisgICAgICAgIHRtcDAgPSBfX21zYV9jb3B5X3VfaCgodjhpMTYpIGRzdDIsIDQpOworICAgICAgICB0bXAxID0gX19tc2FfY29weV91X2goKHY4aTE2KSBkc3QyLCA2KTsKKyAgICAgICAgU1codG1wMiwgc3JjKTsKKyAgICAgICAgU0godG1wMCwgc3JjICsgNCk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIFNXKHRtcDMsIHNyYyk7CisgICAgICAgIFNIKHRtcDEsIHNyYyArIDQpOworICAgICAgICBzcmMgKz0gc3RyaWRlOwogCi0gICAgICAgICAgICBUUkFOU1BPU0U4eDhfVUJfVUgocDNfc3JjLCBwMl9zcmMsIHAxX3NyYywgcDBfc3JjLCBxMF9zcmMsIHExX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxMl9zcmMsIHEzX3NyYywgcDNfc3JjLCBwMl9zcmMsIHAxX3NyYywgcDBfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEwX3NyYywgcTFfc3JjLCBxMl9zcmMsIHEzX3NyYyk7CisgICAgICAgIHRtcDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDEsIDApOworICAgICAgICB0bXAzID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QxLCAxKTsKKyAgICAgICAgdG1wMCA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0MywgMCk7CisgICAgICAgIHRtcDEgPSBfX21zYV9jb3B5X3VfaCgodjhpMTYpIGRzdDMsIDIpOworICAgICAgICBTVyh0bXAyLCBzcmMpOworICAgICAgICBTSCh0bXAwLCBzcmMgKyA0KTsKKyAgICAgICAgc3JjICs9IHN0cmlkZTsKKyAgICAgICAgU1codG1wMywgc3JjKTsKKyAgICAgICAgU0godG1wMSwgc3JjICsgNCk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CiAKLSAgICAgICAgICAgIGZsYWcwID0gKGFicyhwM1stNF0gLSBwM1stMV0pICsgYWJzKHAzWzNdIC0gcDNbMF0pIDwgYmV0YTMwICYmCi0gICAgICAgICAgICAgICAgICAgICBhYnMocDNbLTFdIC0gcDNbMF0pIDwgdGMyNTAgJiYKLSAgICAgICAgICAgICAgICAgICAgIGFicyhwMlstNF0gLSBwMlstMV0pICsgYWJzKHAyWzNdIC0gcDJbMF0pIDwgYmV0YTMwICYmCi0gICAgICAgICAgICAgICAgICAgICBhYnMocDJbLTFdIC0gcDJbMF0pIDwgdGMyNTAgJiYKLSAgICAgICAgICAgICAgICAgICAgIChkMDAgPDwgMSkgPCBiZXRhMjAgJiYgKGQzMCA8PCAxKSA8IGJldGEyMCk7Ci0gICAgICAgICAgICBjbXAwID0gX19tc2FfZmlsbF9kKGZsYWcwKTsKLQotICAgICAgICAgICAgZmxhZzEgPSAoYWJzKHAxWy00XSAtIHAxWy0xXSkgKyBhYnMocDFbM10gLSBwMVswXSkgPCBiZXRhMzAgJiYKLSAgICAgICAgICAgICAgICAgICAgIGFicyhwMVstMV0gLSBwMVswXSkgPCB0YzI1NCAmJgotICAgICAgICAgICAgICAgICAgICAgYWJzKHAwWy00XSAtIHAwWy0xXSkgKyBhYnMocDBbM10gLSBwMFswXSkgPCBiZXRhMzAgJiYKLSAgICAgICAgICAgICAgICAgICAgIGFicyhwMFstMV0gLSBwMFswXSkgPCB0YzI1NCAmJgotICAgICAgICAgICAgICAgICAgICAgKGQwNCA8PCAxKSA8IGJldGEyMCAmJiAoZDM0IDw8IDEpIDwgYmV0YTIwKTsKLSAgICAgICAgICAgIGNtcDEgPSBfX21zYV9maWxsX2QoZmxhZzEpOwotICAgICAgICAgICAgY21wMiA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7Ci0gICAgICAgICAgICBjbXAyID0gX19tc2FfY2VxaV9kKGNtcDIsIDApOwotCi0gICAgICAgICAgICBJTFZSX0I4X1VIKHplcm8sIHAzX3NyYywgemVybywgcDJfc3JjLCB6ZXJvLCBwMV9zcmMsIHplcm8sIHAwX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgemVybywgcTBfc3JjLCB6ZXJvLCBxMV9zcmMsIHplcm8sIHEyX3NyYywgemVybywgcTNfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICBwM19zcmMsIHAyX3NyYywgcDFfc3JjLCBwMF9zcmMsIHEwX3NyYywgcTFfc3JjLCBxMl9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgIHEzX3NyYyk7Ci0KLSAgICAgICAgICAgIGNtcDAgPSAodjJpNjQpIF9fbXNhX2ZpbGxfaCh0YzAgPDwgMSk7Ci0gICAgICAgICAgICBjbXAxID0gKHYyaTY0KSBfX21zYV9maWxsX2godGM0IDw8IDEpOwotICAgICAgICAgICAgdGNfcG9zID0gKHY4aTE2KSBfX21zYV9pbHZldl9kKGNtcDEsIGNtcDApOwotICAgICAgICAgICAgdGNfbmVnID0gLXRjX3BvczsKLQotICAgICAgICAgICAgdGVtcDAgPSAocDFfc3JjICsgcDBfc3JjICsgcTBfc3JjKTsKLQotICAgICAgICAgICAgdGVtcDEgPSAoKHAzX3NyYyArIHAyX3NyYykgPDwgMSkgKyBwMl9zcmMgKyB0ZW1wMDsKLSAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDMpOwotICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpICh0ZW1wMSAtIHAyX3NyYyk7Ci0gICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKLSAgICAgICAgICAgIGRzdDAgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcDJfc3JjKTsKLQotICAgICAgICAgICAgdGVtcDEgPSB0ZW1wMCArIHAyX3NyYzsKLSAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDIpOwotICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpICh0ZW1wMSAtIHAxX3NyYyk7Ci0gICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKLSAgICAgICAgICAgIGRzdDEgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcDFfc3JjKTsKLQotICAgICAgICAgICAgdGVtcDEgPSAodGVtcDAgPDwgMSkgKyBwMl9zcmMgKyBxMV9zcmM7Ci0gICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAzKTsKLSAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBwMF9zcmMpOwotICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7Ci0gICAgICAgICAgICBkc3QyID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHAwX3NyYyk7Ci0KLSAgICAgICAgICAgIGNtcDAgPSBfX21zYV9maWxsX2QocF9pc19wY20wKTsKLSAgICAgICAgICAgIGNtcDEgPSBfX21zYV9maWxsX2QocF9pc19wY200KTsKLSAgICAgICAgICAgIHBfaXNfcGNtX3ZlYyA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7Ci0gICAgICAgICAgICBwX2lzX3BjbV92ZWMgPSBfX21zYV9jZXFpX2QocF9pc19wY21fdmVjLCAwKTsKLQotICAgICAgICAgICAgZHN0MCA9IF9fbXNhX2Jtel92KGRzdDAsICh2MTZ1OCkgcDJfc3JjLCAodjE2dTgpIHBfaXNfcGNtX3ZlYyk7Ci0gICAgICAgICAgICBkc3QxID0gX19tc2FfYm16X3YoZHN0MSwgKHYxNnU4KSBwMV9zcmMsICh2MTZ1OCkgcF9pc19wY21fdmVjKTsKLSAgICAgICAgICAgIGRzdDIgPSBfX21zYV9ibXpfdihkc3QyLCAodjE2dTgpIHAwX3NyYywgKHYxNnU4KSBwX2lzX3BjbV92ZWMpOwotCi0gICAgICAgICAgICB0ZW1wMCA9IChxMV9zcmMgKyBwMF9zcmMgKyBxMF9zcmMpOwotICAgICAgICAgICAgdGVtcDEgPSAoKHEzX3NyYyArIHEyX3NyYykgPDwgMSkgKyBxMl9zcmMgKyB0ZW1wMDsKLSAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDMpOwotICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpICh0ZW1wMSAtIHEyX3NyYyk7Ci0gICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKLSAgICAgICAgICAgIGRzdDUgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcTJfc3JjKTsKLQotICAgICAgICAgICAgdGVtcDEgPSB0ZW1wMCArIHEyX3NyYzsKLSAgICAgICAgICAgIHRlbXAxID0gKHY4dTE2KSBfX21zYV9zcmFyaV9oKCh2OGkxNikgdGVtcDEsIDIpOwotICAgICAgICAgICAgdGVtcDIgPSAodjhpMTYpICh0ZW1wMSAtIHExX3NyYyk7Ci0gICAgICAgICAgICB0ZW1wMiA9IENMSVBfU0godGVtcDIsIHRjX25lZywgdGNfcG9zKTsKLSAgICAgICAgICAgIGRzdDQgPSAodjE2dTgpICh0ZW1wMiArICh2OGkxNikgcTFfc3JjKTsKLQotICAgICAgICAgICAgdGVtcDEgPSAodGVtcDAgPDwgMSkgKyBwMV9zcmMgKyBxMl9zcmM7Ci0gICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIHRlbXAxLCAzKTsKLSAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSAodGVtcDEgLSBxMF9zcmMpOwotICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIKHRlbXAyLCB0Y19uZWcsIHRjX3Bvcyk7Ci0gICAgICAgICAgICBkc3QzID0gKHYxNnU4KSAodGVtcDIgKyAodjhpMTYpIHEwX3NyYyk7Ci0KLSAgICAgICAgICAgIGNtcDAgPSBfX21zYV9maWxsX2QocV9pc19wY20wKTsKLSAgICAgICAgICAgIGNtcDEgPSBfX21zYV9maWxsX2QocV9pc19wY200KTsKLSAgICAgICAgICAgIHFfaXNfcGNtX3ZlYyA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7Ci0gICAgICAgICAgICBxX2lzX3BjbV92ZWMgPSBfX21zYV9jZXFpX2QocV9pc19wY21fdmVjLCAwKTsKLQotICAgICAgICAgICAgZHN0MyA9IF9fbXNhX2Jtel92KGRzdDMsICh2MTZ1OCkgcTBfc3JjLCAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7Ci0gICAgICAgICAgICBkc3Q0ID0gX19tc2FfYm16X3YoZHN0NCwgKHYxNnU4KSBxMV9zcmMsICh2MTZ1OCkgcV9pc19wY21fdmVjKTsKLSAgICAgICAgICAgIGRzdDUgPSBfX21zYV9ibXpfdihkc3Q1LCAodjE2dTgpIHEyX3NyYywgKHYxNnU4KSBxX2lzX3BjbV92ZWMpOwotCi0gICAgICAgICAgICB0Y19wb3MgPj49IDE7Ci0gICAgICAgICAgICB0Y19uZWcgPSAtdGNfcG9zOwotCi0gICAgICAgICAgICBkaWZmMCA9ICh2OGkxNikgKHEwX3NyYyAtIHAwX3NyYyk7Ci0gICAgICAgICAgICBkaWZmMSA9ICh2OGkxNikgKHExX3NyYyAtIHAxX3NyYyk7Ci0gICAgICAgICAgICBkaWZmMCA9ICh2OGkxNikgKGRpZmYwIDw8IDMpICsgZGlmZjA7Ci0gICAgICAgICAgICBkaWZmMSA9ICh2OGkxNikgKGRpZmYxIDw8IDEpICsgZGlmZjE7Ci0gICAgICAgICAgICBkZWx0YTAgPSBkaWZmMCAtIGRpZmYxOwotICAgICAgICAgICAgZGVsdGEwID0gX19tc2Ffc3JhcmlfaChkZWx0YTAsIDQpOwotCi0gICAgICAgICAgICB0ZW1wMSA9ICh2OHUxNikgKCh0Y19wb3MgPDwgMykgKyAodGNfcG9zIDw8IDEpKTsKLSAgICAgICAgICAgIGFic19kZWx0YTAgPSBfX21zYV9hZGRfYV9oKGRlbHRhMCwgKHY4aTE2KSB6ZXJvKTsKLSAgICAgICAgICAgIGFic19kZWx0YTAgPSAodjh1MTYpIGFic19kZWx0YTAgPCB0ZW1wMTsKLQotICAgICAgICAgICAgZGVsdGEwID0gQ0xJUF9TSChkZWx0YTAsIHRjX25lZywgdGNfcG9zKTsKLSAgICAgICAgICAgIHRlbXAwID0gKHY4dTE2KSBkZWx0YTAgKyBwMF9zcmM7Ci0gICAgICAgICAgICB0ZW1wMCA9ICh2OHUxNikgQ0xJUF9TSF8wXzI1NSh0ZW1wMCk7Ci0gICAgICAgICAgICB0ZW1wMCA9ICh2OHUxNikgX19tc2FfYm16X3YoKHYxNnU4KSB0ZW1wMCwgKHYxNnU4KSBwMF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBwX2lzX3BjbV92ZWMpOwotCi0gICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgcTBfc3JjIC0gZGVsdGEwOwotICAgICAgICAgICAgdGVtcDIgPSBDTElQX1NIXzBfMjU1KHRlbXAyKTsKLSAgICAgICAgICAgIHRlbXAyID0gKHY4aTE2KSBfX21zYV9ibXpfdigodjE2dTgpIHRlbXAyLCAodjE2dTgpIHEwX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIHFfaXNfcGNtX3ZlYyk7Ci0KLSAgICAgICAgICAgIHRtcCA9ICgoYmV0YSArIChiZXRhID4+IDEpKSA+PiAzKTsKLSAgICAgICAgICAgIGNtcDAgPSBfX21zYV9maWxsX2QoIXBfaXNfcGNtMCAmJiAoZHAwMCArIGRwMzAgPCB0bXApKTsKLSAgICAgICAgICAgIGNtcDEgPSBfX21zYV9maWxsX2QoIXBfaXNfcGNtNCAmJiAoZHAwNCArIGRwMzQgPCB0bXApKTsKLSAgICAgICAgICAgIHBfaXNfcGNtX3ZlYyA9IF9fbXNhX2lsdmV2X2QoY21wMSwgY21wMCk7Ci0gICAgICAgICAgICBwX2lzX3BjbV92ZWMgPSBfX21zYV9jZXFpX2QocF9pc19wY21fdmVjLCAwKTsKLQotICAgICAgICAgICAgY21wMCA9ICh2Mmk2NCkgX19tc2FfZmlsbF9oKCghcV9pc19wY20wKSAmJiAoZHEwMCArIGRxMzAgPCB0bXApKTsKLSAgICAgICAgICAgIGNtcDEgPSAodjJpNjQpIF9fbXNhX2ZpbGxfaCgoIXFfaXNfcGNtNCkgJiYgKGRxMDQgKyBkcTM0IDwgdG1wKSk7Ci0gICAgICAgICAgICBxX2lzX3BjbV92ZWMgPSBfX21zYV9pbHZldl9kKGNtcDEsIGNtcDApOwotICAgICAgICAgICAgcV9pc19wY21fdmVjID0gX19tc2FfY2VxaV9kKHFfaXNfcGNtX3ZlYywgMCk7Ci0KLSAgICAgICAgICAgIHRjX3BvcyA+Pj0gMTsKLSAgICAgICAgICAgIHRjX25lZyA9IC10Y19wb3M7Ci0KLSAgICAgICAgICAgIGRlbHRhMSA9ICh2OGkxNikgX19tc2FfYXZlcl91X2gocDJfc3JjLCBwMF9zcmMpOwotICAgICAgICAgICAgZGVsdGExIC09ICh2OGkxNikgcDFfc3JjOwotICAgICAgICAgICAgZGVsdGExICs9IGRlbHRhMDsKLSAgICAgICAgICAgIGRlbHRhMSA+Pj0gMTsKLSAgICAgICAgICAgIGRlbHRhMSA9IENMSVBfU0goZGVsdGExLCB0Y19uZWcsIHRjX3Bvcyk7Ci0gICAgICAgICAgICBkZWx0YTEgPSAodjhpMTYpIHAxX3NyYyArICh2OGkxNikgZGVsdGExOwotICAgICAgICAgICAgZGVsdGExID0gQ0xJUF9TSF8wXzI1NShkZWx0YTEpOwotICAgICAgICAgICAgZGVsdGExID0gKHY4aTE2KSBfX21zYV9ibW56X3YoKHYxNnU4KSBkZWx0YTEsICh2MTZ1OCkgcDFfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBwX2lzX3BjbV92ZWMpOwotCi0gICAgICAgICAgICBkZWx0YTIgPSAodjhpMTYpIF9fbXNhX2F2ZXJfdV9oKHEwX3NyYywgcTJfc3JjKTsKLSAgICAgICAgICAgIGRlbHRhMiA9IGRlbHRhMiAtICh2OGkxNikgcTFfc3JjOwotICAgICAgICAgICAgZGVsdGEyID0gZGVsdGEyIC0gZGVsdGEwOwotICAgICAgICAgICAgZGVsdGEyID0gZGVsdGEyID4+IDE7Ci0gICAgICAgICAgICBkZWx0YTIgPSBDTElQX1NIKGRlbHRhMiwgdGNfbmVnLCB0Y19wb3MpOwotICAgICAgICAgICAgZGVsdGEyID0gKHY4aTE2KSBxMV9zcmMgKyAodjhpMTYpIGRlbHRhMjsKLSAgICAgICAgICAgIGRlbHRhMiA9IENMSVBfU0hfMF8yNTUoZGVsdGEyKTsKLSAgICAgICAgICAgIGRlbHRhMiA9ICh2OGkxNikgX19tc2FfYm1uel92KCh2MTZ1OCkgZGVsdGEyLCAodjE2dTgpIHExX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgcV9pc19wY21fdmVjKTsKLSAgICAgICAgICAgIGRlbHRhMSA9ICh2OGkxNikgX19tc2FfYm16X3YoKHYxNnU4KSBkZWx0YTEsICh2MTZ1OCkgcDFfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIGFic19kZWx0YTApOwotICAgICAgICAgICAgdGVtcDAgPSAodjh1MTYpIF9fbXNhX2Jtel92KCh2MTZ1OCkgdGVtcDAsICh2MTZ1OCkgcDBfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MTZ1OCkgYWJzX2RlbHRhMCk7Ci0gICAgICAgICAgICB0ZW1wMiA9ICh2OGkxNikgX19tc2FfYm16X3YoKHYxNnU4KSB0ZW1wMiwgKHYxNnU4KSBxMF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYxNnU4KSBhYnNfZGVsdGEwKTsKLSAgICAgICAgICAgIGRlbHRhMiA9ICh2OGkxNikgX19tc2FfYm16X3YoKHYxNnU4KSBkZWx0YTIsICh2MTZ1OCkgcTFfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjE2dTgpIGFic19kZWx0YTApOwotCi0gICAgICAgICAgICBkc3QyID0gX19tc2FfYm1uel92KGRzdDIsICh2MTZ1OCkgdGVtcDAsICh2MTZ1OCkgY21wMik7Ci0gICAgICAgICAgICBkc3QzID0gX19tc2FfYm1uel92KGRzdDMsICh2MTZ1OCkgdGVtcDIsICh2MTZ1OCkgY21wMik7Ci0gICAgICAgICAgICBkc3QxID0gX19tc2FfYm1uel92KGRzdDEsICh2MTZ1OCkgZGVsdGExLCAodjE2dTgpIGNtcDIpOwotICAgICAgICAgICAgZHN0NCA9IF9fbXNhX2Jtbnpfdihkc3Q0LCAodjE2dTgpIGRlbHRhMiwgKHYxNnU4KSBjbXAyKTsKLSAgICAgICAgICAgIGRzdDAgPSBfX21zYV9ibW56X3YoZHN0MCwgKHYxNnU4KSBwMl9zcmMsICh2MTZ1OCkgY21wMik7Ci0gICAgICAgICAgICBkc3Q1ID0gX19tc2FfYm1uel92KGRzdDUsICh2MTZ1OCkgcTJfc3JjLCAodjE2dTgpIGNtcDIpOwotCi0gICAgICAgICAgICBjbXAwID0gX19tc2FfZmlsbF9kKGQwMCArIGQzMCA+PSBiZXRhKTsKLSAgICAgICAgICAgIGRzdDcgPSAodjE2dTgpIF9fbXNhX2ZpbGxfZChkMDQgKyBkMzQgPj0gYmV0YSk7Ci0gICAgICAgICAgICBjbXAwID0gX19tc2FfaWx2ZXZfZCgodjJpNjQpIGRzdDcsIGNtcDApOwotICAgICAgICAgICAgZHN0NiA9ICh2MTZ1OCkgX19tc2FfY2VxaV9kKGNtcDAsIDApOwotCi0gICAgICAgICAgICBkc3QwID0gX19tc2FfYm16X3YoZHN0MCwgKHYxNnU4KSBwMl9zcmMsIGRzdDYpOwotICAgICAgICAgICAgZHN0MSA9IF9fbXNhX2Jtel92KGRzdDEsICh2MTZ1OCkgcDFfc3JjLCBkc3Q2KTsKLSAgICAgICAgICAgIGRzdDIgPSBfX21zYV9ibXpfdihkc3QyLCAodjE2dTgpIHAwX3NyYywgZHN0Nik7Ci0gICAgICAgICAgICBkc3QzID0gX19tc2FfYm16X3YoZHN0MywgKHYxNnU4KSBxMF9zcmMsIGRzdDYpOwotICAgICAgICAgICAgZHN0NCA9IF9fbXNhX2Jtel92KGRzdDQsICh2MTZ1OCkgcTFfc3JjLCBkc3Q2KTsKLSAgICAgICAgICAgIGRzdDUgPSBfX21zYV9ibXpfdihkc3Q1LCAodjE2dTgpIHEyX3NyYywgZHN0Nik7Ci0KLSAgICAgICAgICAgIFBDS0VWX0I0X1VCKGRzdDAsIGRzdDAsIGRzdDEsIGRzdDEsIGRzdDIsIGRzdDIsIGRzdDMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgICAgIFBDS0VWX0IyX1VCKGRzdDQsIGRzdDQsIGRzdDUsIGRzdDUsIGRzdDQsIGRzdDUpOwotCi0gICAgICAgICAgICBUUkFOU1BPU0U4eDhfVUJfVUIoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3KTsKLQotICAgICAgICAgICAgc3JjICs9IDE7Ci0KLSAgICAgICAgICAgIHRtcDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDApOwotICAgICAgICAgICAgdG1wMCA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0MCwgMik7Ci0gICAgICAgICAgICB0bXAzID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QxLCAwKTsKLSAgICAgICAgICAgIHRtcDEgPSBfX21zYV9jb3B5X3VfaCgodjhpMTYpIGRzdDEsIDIpOwotICAgICAgICAgICAgU1codG1wMiwgc3JjKTsKLSAgICAgICAgICAgIFNIKHRtcDAsIHNyYyArIDQpOwotICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKLSAgICAgICAgICAgIFNXKHRtcDMsIHNyYyk7Ci0gICAgICAgICAgICBTSCh0bXAxLCBzcmMgKyA0KTsKLSAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7Ci0KLSAgICAgICAgICAgIHRtcDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDIsIDApOwotICAgICAgICAgICAgdG1wMCA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0MiwgMik7Ci0gICAgICAgICAgICB0bXAzID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QzLCAwKTsKLSAgICAgICAgICAgIHRtcDEgPSBfX21zYV9jb3B5X3VfaCgodjhpMTYpIGRzdDMsIDIpOwotICAgICAgICAgICAgU1codG1wMiwgc3JjKTsKLSAgICAgICAgICAgIFNIKHRtcDAsIHNyYyArIDQpOwotICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKLSAgICAgICAgICAgIFNXKHRtcDMsIHNyYyk7Ci0gICAgICAgICAgICBTSCh0bXAxLCBzcmMgKyA0KTsKLSAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7Ci0KLSAgICAgICAgICAgIHRtcDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDQsIDApOwotICAgICAgICAgICAgdG1wMCA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0NCwgMik7Ci0gICAgICAgICAgICB0bXAzID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3Q1LCAwKTsKLSAgICAgICAgICAgIHRtcDEgPSBfX21zYV9jb3B5X3VfaCgodjhpMTYpIGRzdDUsIDIpOwotICAgICAgICAgICAgU1codG1wMiwgc3JjKTsKLSAgICAgICAgICAgIFNIKHRtcDAsIHNyYyArIDQpOwotICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKLSAgICAgICAgICAgIFNXKHRtcDMsIHNyYyk7Ci0gICAgICAgICAgICBTSCh0bXAxLCBzcmMgKyA0KTsKLSAgICAgICAgICAgIHNyYyArPSBzdHJpZGU7Ci0KLSAgICAgICAgICAgIHRtcDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDYsIDApOwotICAgICAgICAgICAgdG1wMCA9IF9fbXNhX2NvcHlfdV9oKCh2OGkxNikgZHN0NiwgMik7Ci0gICAgICAgICAgICB0bXAzID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3Q3LCAwKTsKLSAgICAgICAgICAgIHRtcDEgPSBfX21zYV9jb3B5X3VfaCgodjhpMTYpIGRzdDcsIDIpOwotICAgICAgICAgICAgU1codG1wMiwgc3JjKTsKLSAgICAgICAgICAgIFNIKHRtcDAsIHNyYyArIDQpOwotICAgICAgICAgICAgc3JjICs9IHN0cmlkZTsKLSAgICAgICAgICAgIFNXKHRtcDMsIHNyYyk7Ci0gICAgICAgICAgICBTSCh0bXAxLCBzcmMgKyA0KTsKLSAgICAgICAgfQorICAgICAgICB0bXAyID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QxLCAyKTsKKyAgICAgICAgdG1wMyA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MSwgMyk7CisgICAgICAgIHRtcDAgPSBfX21zYV9jb3B5X3VfaCgodjhpMTYpIGRzdDMsIDQpOworICAgICAgICB0bXAxID0gX19tc2FfY29weV91X2goKHY4aTE2KSBkc3QzLCA2KTsKKyAgICAgICAgU1codG1wMiwgc3JjKTsKKyAgICAgICAgU0godG1wMCwgc3JjICsgNCk7CisgICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIFNXKHRtcDMsIHNyYyk7CisgICAgICAgIFNIKHRtcDEsIHNyYyArIDQpOwogICAgIH0KIH0KIApAQCAtNjg3LDI5ICsxMDQ5LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNhb19vZmZzZXRfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBpbnQzMl90IGhfY250OwogICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CiAgICAgdjE2aTggc3JjMF9yLCBzcmMxX3I7CiAgICAgdjE2aTggb2Zmc2V0LCBvZmZzZXRfdmFsLCBtYXNrOwotICAgIHYxNmk4IG9mZnNldDAgPSB7IDAgfTsKLSAgICB2MTZpOCBvZmZzZXQxID0geyAwIH07CisgICAgdjE2aTggZHN0MCwgb2Zmc2V0MCwgb2Zmc2V0MTsKICAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0gICAgdjhpMTYgdGVtcDAsIHRlbXAxLCBkc3QwLCBkc3QxOwogCiAgICAgb2Zmc2V0X3ZhbCA9IExEX1NCKHNhb19vZmZzZXRfdmFsICsgMSk7CiAgICAgb2Zmc2V0X3ZhbCA9ICh2MTZpOCkgX19tc2FfcGNrZXZfZCgodjJpNjQpIG9mZnNldF92YWwsICh2Mmk2NCkgb2Zmc2V0X3ZhbCk7CiAKICAgICBvZmZzZXRfdmFsID0gX19tc2FfcGNrZXZfYihvZmZzZXRfdmFsLCBvZmZzZXRfdmFsKTsKLSAgICBvZmZzZXQxID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgb2Zmc2V0MSwgMywgKHY0aTMyKSBvZmZzZXRfdmFsKTsKLSAgICBvZmZzZXQwID0gX19tc2Ffc2xkX2Iob2Zmc2V0MSwgb2Zmc2V0MCwgMjggLSAoKHNhb19sZWZ0X2NsYXNzKSAmIDMxKSk7CisgICAgb2Zmc2V0MSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHplcm8sIDMsICh2NGkzMikgb2Zmc2V0X3ZhbCk7CisgICAgb2Zmc2V0MCA9IF9fbXNhX3NsZF9iKG9mZnNldDEsIHplcm8sIDI4IC0gKChzYW9fbGVmdF9jbGFzcykgJiAzMSkpOwogICAgIG9mZnNldDEgPSBfX21zYV9zbGRfYih6ZXJvLCBvZmZzZXQxLCAyOCAtICgoc2FvX2xlZnRfY2xhc3MpICYgMzEpKTsKIAorICAgIC8qIGxvYWQgaW4gYWR2YW5jZS4gKi8KKyAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKwogICAgIGlmICghKChzYW9fbGVmdF9jbGFzcyA+IDEyKSAmIChzYW9fbGVmdF9jbGFzcyA8IDI5KSkpIHsKICAgICAgICAgU1dBUChvZmZzZXQwLCBvZmZzZXQxKTsKICAgICB9CiAKLSAgICBmb3IgKGhfY250ID0gaGVpZ2h0ID4+IDI7IGhfY250LS07KSB7Ci0gICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIGZvciAoaGVpZ2h0IC09IDQ7IGhlaWdodDsgaGVpZ2h0IC09IDQpIHsKICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CiAKICAgICAgICAgSUxWRVZfRDJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjMF9yLCBzcmMxX3IpOwpAQCAtNzE4LDE0ICsxMDc5LDMwIEBACiAgICAgICAgIG1hc2sgPSBfX21zYV9zcmxpX2Ioc3JjMF9yLCAzKTsKICAgICAgICAgb2Zmc2V0ID0gX19tc2FfdnNoZl9iKG1hc2ssIG9mZnNldDEsIG9mZnNldDApOwogCi0gICAgICAgIFVOUENLX1NCX1NIKG9mZnNldCwgdGVtcDAsIHRlbXAxKTsKLSAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMF9yLCBkc3QwLCBkc3QxKTsKLSAgICAgICAgQUREMihkc3QwLCB0ZW1wMCwgZHN0MSwgdGVtcDEsIGRzdDAsIGRzdDEpOwotICAgICAgICBDTElQX1NIMl8wXzI1NShkc3QwLCBkc3QxKTsKLSAgICAgICAgZHN0MCA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDEsICh2MTZpOCkgZHN0MCk7CisgICAgICAgIHNyYzBfciA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjMF9yLCAxMjgpOworICAgICAgICBkc3QwID0gX19tc2FfYWRkc19zX2Ioc3JjMF9yLCBvZmZzZXQpOworICAgICAgICBkc3QwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBkc3QwLCAxMjgpOworCisgICAgICAgIC8qIGxvYWQgaW4gYWR2YW5jZS4gKi8KKyAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisKKyAgICAgICAgLyogc3RvcmUgcmVzdWx0cyAqLwogICAgICAgICBTVDR4NF9VQihkc3QwLCBkc3QwLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKICAgICB9CisKKyAgICBJTFZFVl9EMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmMwX3IsIHNyYzFfcik7CisKKyAgICBzcmMwX3IgPSAodjE2aTgpIF9fbXNhX3Bja2V2X3coKHY0aTMyKSBzcmMxX3IsICh2NGkzMikgc3JjMF9yKTsKKyAgICBtYXNrID0gX19tc2Ffc3JsaV9iKHNyYzBfciwgMyk7CisgICAgb2Zmc2V0ID0gX19tc2FfdnNoZl9iKG1hc2ssIG9mZnNldDEsIG9mZnNldDApOworCisgICAgc3JjMF9yID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBzcmMwX3IsIDEyOCk7CisgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKHNyYzBfciwgb2Zmc2V0KTsKKyAgICBkc3QwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBkc3QwLCAxMjgpOworCisgICAgLyogc3RvcmUgcmVzdWx0cyAqLworICAgIFNUNHg0X1VCKGRzdDAsIGRzdDAsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfc2FvX2JhbmRfZmlsdGVyXzh3aWR0aF9tc2EodWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCkBAIC03MzQsNTEgKzExMTEsNjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc2FvX29mZnNldF92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGludDMyX3QgaF9jbnQ7CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2MTZpOCBzcmMwX3IsIHNyYzFfciwgbWFzazAsIG1hc2sxOwotICAgIHYxNmk4IG9mZnNldCwgb2Zmc2V0X3ZhbDsKLSAgICB2MTZpOCBvZmZzZXQwID0geyAwIH07Ci0gICAgdjE2aTggb2Zmc2V0MSA9IHsgMCB9OworICAgIHYxNmk4IG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxLCBvZmZzZXRfdmFsOworICAgIHYxNmk4IG9mZnNldDAsIG9mZnNldDEsIGRzdDAsIGRzdDE7CiAgICAgdjE2aTggemVybyA9IHsgMCB9OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjhpMTYgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CiAKICAgICBvZmZzZXRfdmFsID0gTERfU0Ioc2FvX29mZnNldF92YWwgKyAxKTsKICAgICBvZmZzZXRfdmFsID0gKHYxNmk4KSBfX21zYV9wY2tldl9kKCh2Mmk2NCkgb2Zmc2V0X3ZhbCwgKHYyaTY0KSBvZmZzZXRfdmFsKTsKICAgICBvZmZzZXRfdmFsID0gX19tc2FfcGNrZXZfYihvZmZzZXRfdmFsLCBvZmZzZXRfdmFsKTsKLSAgICBvZmZzZXQxID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgb2Zmc2V0MSwgMywgKHY0aTMyKSBvZmZzZXRfdmFsKTsKLSAgICBvZmZzZXQwID0gX19tc2Ffc2xkX2Iob2Zmc2V0MSwgb2Zmc2V0MCwgMjggLSAoKHNhb19sZWZ0X2NsYXNzKSAmIDMxKSk7CisgICAgb2Zmc2V0MSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHplcm8sIDMsICh2NGkzMikgb2Zmc2V0X3ZhbCk7CisgICAgb2Zmc2V0MCA9IF9fbXNhX3NsZF9iKG9mZnNldDEsIHplcm8sIDI4IC0gKChzYW9fbGVmdF9jbGFzcykgJiAzMSkpOwogICAgIG9mZnNldDEgPSBfX21zYV9zbGRfYih6ZXJvLCBvZmZzZXQxLCAyOCAtICgoc2FvX2xlZnRfY2xhc3MpICYgMzEpKTsKIAorICAgIC8qIGxvYWQgaW4gYWR2YW5jZS4gKi8KKyAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKwogICAgIGlmICghKChzYW9fbGVmdF9jbGFzcyA+IDEyKSAmIChzYW9fbGVmdF9jbGFzcyA8IDI5KSkpIHsKICAgICAgICAgU1dBUChvZmZzZXQwLCBvZmZzZXQxKTsKICAgICB9CiAKLSAgICBmb3IgKGhfY250ID0gaGVpZ2h0ID4+IDI7IGhfY250LS07KSB7Ci0gICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICBmb3IgKGhlaWdodCAtPSA0OyBoZWlnaHQ7IGhlaWdodCAtPSA0KSB7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlIDw8IDI7CiAKICAgICAgICAgSUxWUl9EMl9TQihzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmMwX3IsIHNyYzFfcik7CiAKICAgICAgICAgbWFzazAgPSBfX21zYV9zcmxpX2Ioc3JjMF9yLCAzKTsKICAgICAgICAgbWFzazEgPSBfX21zYV9zcmxpX2Ioc3JjMV9yLCAzKTsKIAotICAgICAgICBvZmZzZXQgPSBfX21zYV92c2hmX2IobWFzazAsIG9mZnNldDEsIG9mZnNldDApOwotICAgICAgICBVTlBDS19TQl9TSChvZmZzZXQsIHRlbXAwLCB0ZW1wMSk7CisgICAgICAgIG9mZnNldF9tYXNrMCA9IF9fbXNhX3ZzaGZfYihtYXNrMCwgb2Zmc2V0MSwgb2Zmc2V0MCk7CisgICAgICAgIG9mZnNldF9tYXNrMSA9IF9fbXNhX3ZzaGZfYihtYXNrMSwgb2Zmc2V0MSwgb2Zmc2V0MCk7CiAKLSAgICAgICAgb2Zmc2V0ID0gX19tc2FfdnNoZl9iKG1hc2sxLCBvZmZzZXQxLCBvZmZzZXQwKTsKLSAgICAgICAgVU5QQ0tfU0JfU0gob2Zmc2V0LCB0ZW1wMiwgdGVtcDMpOworICAgICAgICAvKiBsb2FkIGluIGFkdmFuY2UuICovCisgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogCi0gICAgICAgIFVOUENLX1VCX1NIKHNyYzBfciwgZHN0MCwgZHN0MSk7Ci0gICAgICAgIFVOUENLX1VCX1NIKHNyYzFfciwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIEFERDQoZHN0MCwgdGVtcDAsIGRzdDEsIHRlbXAxLCBkc3QyLCB0ZW1wMiwgZHN0MywgdGVtcDMsCi0gICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIENMSVBfU0g0XzBfMjU1KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBQQ0tFVl9CMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QyKTsKLSAgICAgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzBfciwgc3JjMV9yKTsKKworICAgICAgICBkc3QwID0gX19tc2FfYWRkc19zX2Ioc3JjMF9yLCBvZmZzZXRfbWFzazApOworICAgICAgICBkc3QxID0gX19tc2FfYWRkc19zX2Ioc3JjMV9yLCBvZmZzZXRfbWFzazEpOworCisgICAgICAgIFhPUklfQjJfMTI4X1NCKGRzdDAsIGRzdDEpOworCisgICAgICAgIC8qIHN0b3JlIHJlc3VsdHMgKi8KKyAgICAgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGUgPDwgMjsKICAgICB9CisKKyAgICBJTFZSX0QyX1NCKHNyYzEsIHNyYzAsIHNyYzMsIHNyYzIsIHNyYzBfciwgc3JjMV9yKTsKKworICAgIG1hc2swID0gX19tc2Ffc3JsaV9iKHNyYzBfciwgMyk7CisgICAgbWFzazEgPSBfX21zYV9zcmxpX2Ioc3JjMV9yLCAzKTsKKworICAgIG9mZnNldF9tYXNrMCA9IF9fbXNhX3ZzaGZfYihtYXNrMCwgb2Zmc2V0MSwgb2Zmc2V0MCk7CisgICAgb2Zmc2V0X21hc2sxID0gX19tc2FfdnNoZl9iKG1hc2sxLCBvZmZzZXQxLCBvZmZzZXQwKTsKKworICAgIFhPUklfQjJfMTI4X1NCKHNyYzBfciwgc3JjMV9yKTsKKworICAgIGRzdDAgPSBfX21zYV9hZGRzX3NfYihzcmMwX3IsIG9mZnNldF9tYXNrMCk7CisgICAgZHN0MSA9IF9fbXNhX2FkZHNfc19iKHNyYzFfciwgb2Zmc2V0X21hc2sxKTsKKworICAgIFhPUklfQjJfMTI4X1NCKGRzdDAsIGRzdDEpOworCisgICAgLyogc3RvcmUgcmVzdWx0cyAqLworICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfc2FvX2JhbmRfZmlsdGVyXzE2bXVsdGlwbGVfbXNhKHVpbnQ4X3QgKmRzdCwKQEAgLTc4OSwzMiArMTE4NCwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc2FvX29mZnNldF92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBpbnQzMl90IGhfY250LCB3X2NudDsKKyAgICBpbnQzMl90IHdfY250OwogICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKICAgICB2MTZpOCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwogICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szOwogICAgIHYxNmk4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIG9mZnNldF92YWw7Ci0gICAgdjE2aTggb2Zmc2V0MCA9IHsgMCB9OwotICAgIHYxNmk4IG9mZnNldDEgPSB7IDAgfTsKKyAgICB2MTZpOCBvZmZzZXQwLCBvZmZzZXQxOwogICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKLSAgICB2OGkxNiB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CiAKICAgICBvZmZzZXRfdmFsID0gTERfU0Ioc2FvX29mZnNldF92YWwgKyAxKTsKICAgICBvZmZzZXRfdmFsID0gKHYxNmk4KSBfX21zYV9wY2tldl9kKCh2Mmk2NCkgb2Zmc2V0X3ZhbCwgKHYyaTY0KSBvZmZzZXRfdmFsKTsKICAgICBvZmZzZXRfdmFsID0gX19tc2FfcGNrZXZfYihvZmZzZXRfdmFsLCBvZmZzZXRfdmFsKTsKLSAgICBvZmZzZXQxID0gKHYxNmk4KSBfX21zYV9pbnN2ZV93KCh2NGkzMikgb2Zmc2V0MSwgMywgKHY0aTMyKSBvZmZzZXRfdmFsKTsKLSAgICBvZmZzZXQwID0gX19tc2Ffc2xkX2Iob2Zmc2V0MSwgb2Zmc2V0MCwgMjggLSAoKHNhb19sZWZ0X2NsYXNzKSAmIDMxKSk7CisgICAgb2Zmc2V0MSA9ICh2MTZpOCkgX19tc2FfaW5zdmVfdygodjRpMzIpIHplcm8sIDMsICh2NGkzMikgb2Zmc2V0X3ZhbCk7CisgICAgb2Zmc2V0MCA9IF9fbXNhX3NsZF9iKG9mZnNldDEsIHplcm8sIDI4IC0gKChzYW9fbGVmdF9jbGFzcykgJiAzMSkpOwogICAgIG9mZnNldDEgPSBfX21zYV9zbGRfYih6ZXJvLCBvZmZzZXQxLCAyOCAtICgoc2FvX2xlZnRfY2xhc3MpICYgMzEpKTsKIAogICAgIGlmICghKChzYW9fbGVmdF9jbGFzcyA+IDEyKSAmIChzYW9fbGVmdF9jbGFzcyA8IDI5KSkpIHsKICAgICAgICAgU1dBUChvZmZzZXQwLCBvZmZzZXQxKTsKICAgICB9CiAKLSAgICBmb3IgKGhfY250ID0gaGVpZ2h0ID4+IDI7IGhfY250LS07KSB7Ci0gICAgICAgIGZvciAod19jbnQgPSAwOyB3X2NudCA8ICh3aWR0aCA+PiA0KTsgd19jbnQrKykgewotICAgICAgICAgICAgTERfVUI0KHNyYyArIHdfY250ICogMTYsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIHdoaWxlIChoZWlnaHQgPiAwKSB7CisgICAgICAgIC8qIGxvYWQgaW4gYWR2YW5jZSAqLworICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKIAorICAgICAgICBmb3IgKHdfY250ID0gMTY7IHdfY250IDwgd2lkdGg7IHdfY250ICs9IDE2KSB7CiAgICAgICAgICAgICBtYXNrMCA9IF9fbXNhX3NybGlfYigodjE2aTgpIHNyYzAsIDMpOwogICAgICAgICAgICAgbWFzazEgPSBfX21zYV9zcmxpX2IoKHYxNmk4KSBzcmMxLCAzKTsKICAgICAgICAgICAgIG1hc2syID0gX19tc2Ffc3JsaV9iKCh2MTZpOCkgc3JjMiwgMyk7CkBAIC04MjQsMjcgKzEyMTcsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSk7CiAgICAgICAgICAgICBWU0hGX0IyX1NCKG9mZnNldDAsIG9mZnNldDEsIG9mZnNldDAsIG9mZnNldDEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiwgdG1wMyk7Ci0gICAgICAgICAgICBVTlBDS19TQl9TSCh0bXAwLCB0ZW1wMCwgdGVtcDEpOwotICAgICAgICAgICAgVU5QQ0tfU0JfU0godG1wMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKHRtcDIsIHRlbXA0LCB0ZW1wNSk7Ci0gICAgICAgICAgICBVTlBDS19TQl9TSCh0bXAzLCB0ZW1wNiwgdGVtcDcpOwotICAgICAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7Ci0gICAgICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzIsIGRzdDQsIGRzdDUpOwotICAgICAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMywgZHN0NiwgZHN0Nyk7Ci0gICAgICAgICAgICBBREQ0KGRzdDAsIHRlbXAwLCBkc3QxLCB0ZW1wMSwgZHN0MiwgdGVtcDIsIGRzdDMsIHRlbXAzLAotICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgICAgIEFERDQoZHN0NCwgdGVtcDQsIGRzdDUsIHRlbXA1LCBkc3Q2LCB0ZW1wNiwgZHN0NywgdGVtcDcsCi0gICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOwotICAgICAgICAgICAgQ0xJUF9TSDRfMF8yNTUoZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgICAgICBDTElQX1NINF8wXzI1NShkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3KTsKLSAgICAgICAgICAgIFBDS0VWX0I0X1NCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKLSAgICAgICAgICAgIFNUX1NCNChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QgKyB3X2NudCAqIDE2LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworCisgICAgICAgICAgICBvdXQwID0gX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmMwLCB0bXAwKTsKKyAgICAgICAgICAgIG91dDEgPSBfX21zYV9hZGRzX3NfYigodjE2aTgpIHNyYzEsIHRtcDEpOworICAgICAgICAgICAgb3V0MiA9IF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjMiwgdG1wMik7CisgICAgICAgICAgICBvdXQzID0gX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmMzLCB0bXAzKTsKKworICAgICAgICAgICAgLyogbG9hZCBmb3IgbmV4dCBpdGVyYXRpb24gKi8KKyAgICAgICAgICAgIExEX1VCNChzcmMgKyB3X2NudCwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKG91dDAsIG91dDEsIG91dDIsIG91dDMpOworCisgICAgICAgICAgICBTVF9TQjQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0ICsgd19jbnQgLSAxNiwgZHN0X3N0cmlkZSk7CiAgICAgICAgIH0KIAorICAgICAgICBtYXNrMCA9IF9fbXNhX3NybGlfYigodjE2aTgpIHNyYzAsIDMpOworICAgICAgICBtYXNrMSA9IF9fbXNhX3NybGlfYigodjE2aTgpIHNyYzEsIDMpOworICAgICAgICBtYXNrMiA9IF9fbXNhX3NybGlfYigodjE2aTgpIHNyYzIsIDMpOworICAgICAgICBtYXNrMyA9IF9fbXNhX3NybGlfYigodjE2aTgpIHNyYzMsIDMpOworCisgICAgICAgIFZTSEZfQjJfU0Iob2Zmc2V0MCwgb2Zmc2V0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgbWFzazAsIG1hc2sxLCB0bXAwLAorICAgICAgICAgICAgICAgICAgIHRtcDEpOworICAgICAgICBWU0hGX0IyX1NCKG9mZnNldDAsIG9mZnNldDEsIG9mZnNldDAsIG9mZnNldDEsIG1hc2syLCBtYXNrMywgdG1wMiwKKyAgICAgICAgICAgICAgICAgICB0bXAzKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisKKyAgICAgICAgb3V0MCA9IF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjMCwgdG1wMCk7CisgICAgICAgIG91dDEgPSBfX21zYV9hZGRzX3NfYigodjE2aTgpIHNyYzEsIHRtcDEpOworICAgICAgICBvdXQyID0gX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmMyLCB0bXAyKTsKKyAgICAgICAgb3V0MyA9IF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjMywgdG1wMyk7CisKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Iob3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisKKyAgICAgICAgU1RfU0I0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCArIHdfY250IC0gMTYsIGRzdF9zdHJpZGUpOworCiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlIDw8IDI7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlIDw8IDI7CisgICAgICAgIGhlaWdodCAtPSA0OwogICAgIH0KIH0KIApAQCAtODU1LDU0ICsxMjY1LDUxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc2FvX29mZnNldF92YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaW50MzJfdCBoX2NudDsKICAgICB1aW50MzJfdCBkc3RfdmFsMCwgZHN0X3ZhbDE7Ci0gICAgdjhpMTYgZWRnZV9pZHggPSB7IDEsIDIsIDAsIDMsIDQsIDAsIDAsIDAgfTsKKyAgICB2MTZ1OCBjbXBfbWludXMxMCwgZGlmZl9taW51czEwLCBkaWZmX21pbnVzMTEsIHNyY19taW51czEwLCBzcmNfbWludXMxMTsKKyAgICB2MTZpOCBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworICAgIHYxNmk4IHNhb19vZmZzZXQgPSBMRF9TQihzYW9fb2Zmc2V0X3ZhbCk7CisgICAgdjE2aTggc3JjX3BsdXMxMCwgb2Zmc2V0LCBzcmMwLCBkc3QwOwogICAgIHYxNnU4IGNvbnN0MSA9ICh2MTZ1OCkgX19tc2FfbGRpX2IoMSk7Ci0gICAgdjE2dTggY21wX21pbnVzMTAsIGRpZmZfbWludXMxMCwgY21wX21pbnVzMTEsIGRpZmZfbWludXMxMTsKLSAgICB2MTZ1OCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTE7CiAgICAgdjE2aTggemVybyA9IHsgMCB9OwotICAgIHYxNmk4IHNyY196ZXJvMCwgc3JjX3plcm8xLCBzcmNfcGx1czEwLCBzcmNfcGx1czExLCBkc3QwOwotICAgIHY4aTE2IG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxOwotICAgIHY4aTE2IHNhb19vZmZzZXQsIHNyYzAwLCBzcmMwMTsKIAotICAgIHNhb19vZmZzZXQgPSBMRF9TSChzYW9fb2Zmc2V0X3ZhbCk7CisgICAgc2FvX29mZnNldCA9IF9fbXNhX3Bja2V2X2Ioc2FvX29mZnNldCwgc2FvX29mZnNldCk7CiAgICAgc3JjIC09IDE7CiAKLSAgICBmb3IgKGhfY250ID0gKGhlaWdodCA+PiAxKTsgaF9jbnQtLTspIHsKLSAgICAgICAgTERfVUIyKHNyYywgc3JjX3N0cmlkZSwgc3JjX21pbnVzMTAsIHNyY19taW51czExKTsKKyAgICAvKiBsb2FkIGluIGFkdmFuY2UgKi8KKyAgICBMRF9VQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEpOworCisgICAgZm9yIChoZWlnaHQgLT0gMjsgaGVpZ2h0OyBoZWlnaHQgLT0gMikgewogICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKIAotICAgICAgICBTTERJX0IyXzBfU0Ioc3JjX21pbnVzMTAsIHNyY19taW51czExLCBzcmNfemVybzAsIHNyY196ZXJvMSwgMSk7Ci0gICAgICAgIFNMRElfQjJfMF9TQihzcmNfbWludXMxMCwgc3JjX21pbnVzMTEsIHNyY19wbHVzMTAsIHNyY19wbHVzMTEsIDIpOwotICAgICAgICBJTFZSX0IyX1VCKHNyY19wbHVzMTAsIHNyY19taW51czEwLCBzcmNfcGx1czExLCBzcmNfbWludXMxMSwKLSAgICAgICAgICAgICAgICAgICBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEpOwotICAgICAgICBJTFZSX0IyX1NCKHNyY196ZXJvMCwgc3JjX3plcm8wLCBzcmNfemVybzEsIHNyY196ZXJvMSwgc3JjX3plcm8wLAotICAgICAgICAgICAgICAgICAgIHNyY196ZXJvMSk7CisgICAgICAgIHNyY19taW51czEwID0gKHYxNnU4KSBfX21zYV9wY2tldl9kKCh2Mmk2NCkgc3JjX21pbnVzMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2Mmk2NCkgc3JjX21pbnVzMTApOwogCi0gICAgICAgIGNtcF9taW51czEwID0gKCh2MTZ1OCkgc3JjX3plcm8wID09IHNyY19taW51czEwKTsKKyAgICAgICAgc3JjMCA9ICh2MTZpOCkgX19tc2Ffc2xkaV9iKHplcm8sICh2MTZpOCkgc3JjX21pbnVzMTAsIDEpOworICAgICAgICBzcmNfcGx1czEwID0gKHYxNmk4KSBfX21zYV9zbGRpX2IoemVybywgKHYxNmk4KSBzcmNfbWludXMxMCwgMik7CisKKyAgICAgICAgY21wX21pbnVzMTAgPSAoKHYxNnU4KSBzcmMwID09IHNyY19taW51czEwKTsKICAgICAgICAgZGlmZl9taW51czEwID0gX19tc2Ffbm9yX3YoY21wX21pbnVzMTAsIGNtcF9taW51czEwKTsKLSAgICAgICAgY21wX21pbnVzMTAgPSAoc3JjX21pbnVzMTAgPCAodjE2dTgpIHNyY196ZXJvMCk7CisgICAgICAgIGNtcF9taW51czEwID0gKHNyY19taW51czEwIDwgKHYxNnU4KSBzcmMwKTsKICAgICAgICAgZGlmZl9taW51czEwID0gX19tc2FfYm1uel92KGRpZmZfbWludXMxMCwgY29uc3QxLCBjbXBfbWludXMxMCk7CiAKLSAgICAgICAgY21wX21pbnVzMTEgPSAoKHYxNnU4KSBzcmNfemVybzEgPT0gc3JjX21pbnVzMTEpOwotICAgICAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMSwgY21wX21pbnVzMTEpOwotICAgICAgICBjbXBfbWludXMxMSA9IChzcmNfbWludXMxMSA8ICh2MTZ1OCkgc3JjX3plcm8xKTsKLSAgICAgICAgZGlmZl9taW51czExID0gX19tc2FfYm1uel92KGRpZmZfbWludXMxMSwgY29uc3QxLCBjbXBfbWludXMxMSk7CisgICAgICAgIGNtcF9taW51czEwID0gKCh2MTZ1OCkgc3JjMCA9PSAodjE2dTgpIHNyY19wbHVzMTApOworICAgICAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMCwgY21wX21pbnVzMTApOworICAgICAgICBjbXBfbWludXMxMCA9ICgodjE2dTgpIHNyY19wbHVzMTAgPCAodjE2dTgpIHNyYzApOworICAgICAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ibW56X3YoZGlmZl9taW51czExLCBjb25zdDEsIGNtcF9taW51czEwKTsKIAotICAgICAgICBvZmZzZXRfbWFzazAgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTAsIGRpZmZfbWludXMxMCkgKyAyKTsKLSAgICAgICAgb2Zmc2V0X21hc2sxID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czExLCBkaWZmX21pbnVzMTEpICsgMik7CisgICAgICAgIG9mZnNldCA9ICh2MTZpOCkgZGlmZl9taW51czEwICsgKHYxNmk4KSBkaWZmX21pbnVzMTEgKyAyOwogCi0gICAgICAgIFZTSEZfSDJfU0goZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXRfbWFzazAsCi0gICAgICAgICAgICAgICAgICAgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMCk7Ci0gICAgICAgIFZTSEZfSDJfU0goZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXRfbWFzazEsCi0gICAgICAgICAgICAgICAgICAgb2Zmc2V0X21hc2sxLCBvZmZzZXRfbWFzazEsIG9mZnNldF9tYXNrMSk7Ci0gICAgICAgIElMVkVWX0IyX1NIKHNyY196ZXJvMCwgemVybywgc3JjX3plcm8xLCB6ZXJvLCBzcmMwMCwgc3JjMDEpOwotICAgICAgICBBREQyKG9mZnNldF9tYXNrMCwgc3JjMDAsIG9mZnNldF9tYXNrMSwgc3JjMDEsIG9mZnNldF9tYXNrMCwKLSAgICAgICAgICAgICBvZmZzZXRfbWFzazEpOwotICAgICAgICBDTElQX1NIMl8wXzI1NShvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMSk7CisgICAgICAgIC8qIGxvYWQgaW4gYWR2YW5jZSAqLworICAgICAgICBMRF9VQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEpOwogCi0gICAgICAgIGRzdDAgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb2Zmc2V0X21hc2sxLCAodjE2aTgpIG9mZnNldF9tYXNrMCk7CisgICAgICAgIFZTSEZfQjJfU0IoZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXQsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG9mZnNldCk7CisKKyAgICAgICAgc3JjMCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjMCwgMTI4KTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKHNyYzAsIG9mZnNldCk7CisgICAgICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CisKICAgICAgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDApOwogICAgICAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMik7CiAgICAgICAgIFNXKGRzdF92YWwwLCBkc3QpOwpAQCAtOTEwLDYgKzEzMTcsMzcgQEAKICAgICAgICAgU1coZHN0X3ZhbDEsIGRzdCk7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwogICAgIH0KKworICAgIHNyY19taW51czEwID0gKHYxNnU4KSBfX21zYV9wY2tldl9kKCh2Mmk2NCkgc3JjX21pbnVzMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHYyaTY0KSBzcmNfbWludXMxMCk7CisKKyAgICBzcmMwID0gKHYxNmk4KSBfX21zYV9zbGRpX2IoemVybywgKHYxNmk4KSBzcmNfbWludXMxMCwgMSk7CisgICAgc3JjX3BsdXMxMCA9ICh2MTZpOCkgX19tc2Ffc2xkaV9iKHplcm8sICh2MTZpOCkgc3JjX21pbnVzMTAsIDIpOworCisgICAgY21wX21pbnVzMTAgPSAoKHYxNnU4KSBzcmMwID09IHNyY19taW51czEwKTsKKyAgICBkaWZmX21pbnVzMTAgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMCwgY21wX21pbnVzMTApOworICAgIGNtcF9taW51czEwID0gKHNyY19taW51czEwIDwgKHYxNnU4KSBzcmMwKTsKKyAgICBkaWZmX21pbnVzMTAgPSBfX21zYV9ibW56X3YoZGlmZl9taW51czEwLCBjb25zdDEsIGNtcF9taW51czEwKTsKKworICAgIGNtcF9taW51czEwID0gKCh2MTZ1OCkgc3JjMCA9PSAodjE2dTgpIHNyY19wbHVzMTApOworICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX25vcl92KGNtcF9taW51czEwLCBjbXBfbWludXMxMCk7CisgICAgY21wX21pbnVzMTAgPSAoKHYxNnU4KSBzcmNfcGx1czEwIDwgKHYxNnU4KSBzcmMwKTsKKyAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ibW56X3YoZGlmZl9taW51czExLCBjb25zdDEsIGNtcF9taW51czEwKTsKKworICAgIG9mZnNldCA9ICh2MTZpOCkgZGlmZl9taW51czEwICsgKHYxNmk4KSBkaWZmX21pbnVzMTEgKyAyOworICAgIFZTSEZfQjJfU0IoZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXQsIG9mZnNldCwKKyAgICAgICAgICAgICAgIG9mZnNldCwgb2Zmc2V0KTsKKworICAgIHNyYzAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzAsIDEyOCk7CisgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKHNyYzAsIG9mZnNldCk7CisgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKworICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAwKTsKKyAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMik7CisKKyAgICBTVyhkc3RfdmFsMCwgZHN0KTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICBTVyhkc3RfdmFsMSwgZHN0KTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19zYW9fZWRnZV9maWx0ZXJfMGRlZ3JlZV84d2lkdGhfbXNhKHVpbnQ4X3QgKmRzdCwKQEAgLTkxOSw2NCArMTM1Nyw5MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNhb19vZmZzZXRfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIHVpbnQ4X3QgKnNyY19taW51czE7Ci0gICAgaW50MzJfdCBoX2NudDsKICAgICB1aW50NjRfdCBkc3RfdmFsMCwgZHN0X3ZhbDE7Ci0gICAgdjhpMTYgZWRnZV9pZHggPSB7IDEsIDIsIDAsIDMsIDQsIDAsIDAsIDAgfTsKKyAgICB2MTZpOCBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwogICAgIHYxNnU4IGNvbnN0MSA9ICh2MTZ1OCkgX19tc2FfbGRpX2IoMSk7Ci0gICAgdjE2aTggZHN0MCwgZHN0MTsKLSAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0gICAgdjE2dTggY21wX21pbnVzMTAsIGRpZmZfbWludXMxMCwgY21wX21pbnVzMTEsIGRpZmZfbWludXMxMTsKLSAgICB2MTZ1OCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTE7Ci0gICAgdjE2aTggc3JjX3plcm8wLCBzcmNfcGx1czEwLCBzcmNfemVybzEsIHNyY19wbHVzMTE7Ci0gICAgdjhpMTYgc2FvX29mZnNldCwgc3JjMDAsIG9mZnNldF9tYXNrMCwgc3JjMDEsIG9mZnNldF9tYXNrMTsKKyAgICB2MTZ1OCBjbXBfbWludXMxMCwgZGlmZl9taW51czEwLCBkaWZmX21pbnVzMTE7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgZHN0MCwgc3JjX21pbnVzMTAsIHNyY19taW51czExLCBzcmNfcGx1czEwLCBzcmNfcGx1czExOworICAgIHYxNmk4IG9mZnNldCwgc2FvX29mZnNldCA9IExEX1NCKHNhb19vZmZzZXRfdmFsKTsKIAotICAgIHNhb19vZmZzZXQgPSBMRF9TSChzYW9fb2Zmc2V0X3ZhbCk7CisgICAgc2FvX29mZnNldCA9IF9fbXNhX3Bja2V2X2Ioc2FvX29mZnNldCwgc2FvX29mZnNldCk7CisgICAgc3JjIC09IDE7CiAKLSAgICBmb3IgKGhfY250ID0gKGhlaWdodCA+PiAxKTsgaF9jbnQtLTspIHsKLSAgICAgICAgc3JjX21pbnVzMSA9IHNyYyAtIDE7Ci0gICAgICAgIExEX1VCMihzcmNfbWludXMxLCBzcmNfc3RyaWRlLCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEpOworICAgIC8qIGxvYWQgaW4gYWR2YW5jZSAqLworICAgIExEX1VCMihzcmMsIHNyY19zdHJpZGUsIHNyY19taW51czEwLCBzcmNfbWludXMxMSk7CiAKLSAgICAgICAgU0xESV9CMl8wX1NCKHNyY19taW51czEwLCBzcmNfbWludXMxMSwgc3JjX3plcm8wLCBzcmNfemVybzEsIDEpOwotICAgICAgICBTTERJX0IyXzBfU0Ioc3JjX21pbnVzMTAsIHNyY19taW51czExLCBzcmNfcGx1czEwLCBzcmNfcGx1czExLCAyKTsKLSAgICAgICAgSUxWUl9CMl9VQihzcmNfcGx1czEwLCBzcmNfbWludXMxMCwgc3JjX3BsdXMxMSwgc3JjX21pbnVzMTEsCi0gICAgICAgICAgICAgICAgICAgc3JjX21pbnVzMTAsIHNyY19taW51czExKTsKLSAgICAgICAgSUxWUl9CMl9TQihzcmNfemVybzAsIHNyY196ZXJvMCwgc3JjX3plcm8xLCBzcmNfemVybzEsCi0gICAgICAgICAgICAgICAgICAgc3JjX3plcm8wLCBzcmNfemVybzEpOworICAgIGZvciAoaGVpZ2h0IC09IDI7IGhlaWdodDsgaGVpZ2h0IC09IDIpIHsKKyAgICAgICAgc3JjICs9IChzcmNfc3RyaWRlIDw8IDEpOwogCi0gICAgICAgIGNtcF9taW51czEwID0gKCh2MTZ1OCkgc3JjX3plcm8wID09IHNyY19taW51czEwKTsKKyAgICAgICAgU0xESV9CMl8wX1VCKHNyY19taW51czEwLCBzcmNfbWludXMxMSwgc3JjMCwgc3JjMSwgMSk7CisgICAgICAgIFNMRElfQjJfMF9VQihzcmNfbWludXMxMCwgc3JjX21pbnVzMTEsIHNyY19wbHVzMTAsIHNyY19wbHVzMTEsIDIpOworCisgICAgICAgIFBDS0VWX0QyX1VCKHNyY19taW51czExLCBzcmNfbWludXMxMCwgc3JjX3BsdXMxMSwgc3JjX3BsdXMxMCwKKyAgICAgICAgICAgICAgICAgICAgc3JjX21pbnVzMTAsIHNyY19wbHVzMTApOworICAgICAgICBzcmMwID0gKHYxNnU4KSBfX21zYV9wY2tldl9kKCh2Mmk2NCkgc3JjMSwgKHYyaTY0KSBzcmMwKTsKKworICAgICAgICBjbXBfbWludXMxMCA9IChzcmMwID09IHNyY19taW51czEwKTsKICAgICAgICAgZGlmZl9taW51czEwID0gX19tc2Ffbm9yX3YoY21wX21pbnVzMTAsIGNtcF9taW51czEwKTsKLSAgICAgICAgY21wX21pbnVzMTAgPSAoc3JjX21pbnVzMTAgPCAodjE2dTgpIHNyY196ZXJvMCk7CisgICAgICAgIGNtcF9taW51czEwID0gKHNyY19taW51czEwIDwgc3JjMCk7CiAgICAgICAgIGRpZmZfbWludXMxMCA9IF9fbXNhX2JtbnpfdihkaWZmX21pbnVzMTAsIGNvbnN0MSwgY21wX21pbnVzMTApOwogCi0gICAgICAgIGNtcF9taW51czExID0gKCh2MTZ1OCkgc3JjX3plcm8xID09IHNyY19taW51czExKTsKLSAgICAgICAgZGlmZl9taW51czExID0gX19tc2Ffbm9yX3YoY21wX21pbnVzMTEsIGNtcF9taW51czExKTsKLSAgICAgICAgY21wX21pbnVzMTEgPSAoc3JjX21pbnVzMTEgPCAodjE2dTgpIHNyY196ZXJvMSk7Ci0gICAgICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX2JtbnpfdihkaWZmX21pbnVzMTEsIGNvbnN0MSwgY21wX21pbnVzMTEpOworICAgICAgICBjbXBfbWludXMxMCA9IChzcmMwID09IHNyY19wbHVzMTApOworICAgICAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMCwgY21wX21pbnVzMTApOworICAgICAgICBjbXBfbWludXMxMCA9IChzcmNfcGx1czEwIDwgc3JjMCk7CisgICAgICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX2JtbnpfdihkaWZmX21pbnVzMTEsIGNvbnN0MSwgY21wX21pbnVzMTApOwogCi0gICAgICAgIG9mZnNldF9tYXNrMCA9ICh2OGkxNikgKF9fbXNhX2hhZGRfdV9oKGRpZmZfbWludXMxMCwgZGlmZl9taW51czEwKSArIDIpOwotICAgICAgICBvZmZzZXRfbWFzazEgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTEsIGRpZmZfbWludXMxMSkgKyAyKTsKKyAgICAgICAgb2Zmc2V0ID0gKHYxNmk4KSBkaWZmX21pbnVzMTAgKyAodjE2aTgpIGRpZmZfbWludXMxMSArIDI7CiAKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMCwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2swKTsKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMSwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazEsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgSUxWRVZfQjJfU0goc3JjX3plcm8wLCB6ZXJvLCBzcmNfemVybzEsIHplcm8sIHNyYzAwLCBzcmMwMSk7CisgICAgICAgIC8qIGxvYWQgaW4gYWR2YW5jZSAqLworICAgICAgICBMRF9VQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEpOwogCi0gICAgICAgIEFERDIob2Zmc2V0X21hc2swLCBzcmMwMCwgb2Zmc2V0X21hc2sxLCBzcmMwMSwgb2Zmc2V0X21hc2swLAotICAgICAgICAgICAgIG9mZnNldF9tYXNrMSk7Ci0gICAgICAgIENMSVBfU0gyXzBfMjU1KG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgUENLRVZfQjJfU0Iob2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxLAotICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxKTsKKyAgICAgICAgVlNIRl9CMl9TQihlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIG9mZnNldCwgb2Zmc2V0KTsKKworICAgICAgICBzcmMwID0gX19tc2FfeG9yaV9iKHNyYzAsIDEyOCk7CisgICAgICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjMCwgb2Zmc2V0KTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX3hvcmlfYihkc3QwLCAxMjgpOwogCiAgICAgICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QwLCAwKTsKLSAgICAgICAgZHN0X3ZhbDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDEsIDApOworICAgICAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MCwgMSk7CiAgICAgICAgIFNEKGRzdF92YWwwLCBkc3QpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICAgICAgU0QoZHN0X3ZhbDEsIGRzdCk7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICBzcmMgKz0gKHNyY19zdHJpZGUgPDwgMSk7CiAgICAgfQorCisgICAgU0xESV9CMl8wX1VCKHNyY19taW51czEwLCBzcmNfbWludXMxMSwgc3JjMCwgc3JjMSwgMSk7CisgICAgU0xESV9CMl8wX1VCKHNyY19taW51czEwLCBzcmNfbWludXMxMSwgc3JjX3BsdXMxMCwgc3JjX3BsdXMxMSwgMik7CisKKyAgICBQQ0tFVl9EMl9VQihzcmNfbWludXMxMSwgc3JjX21pbnVzMTAsIHNyY19wbHVzMTEsIHNyY19wbHVzMTAsIHNyY19taW51czEwLAorICAgICAgICAgICAgICAgIHNyY19wbHVzMTApOworICAgIHNyYzAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2QoKHYyaTY0KSBzcmMxLCAodjJpNjQpIHNyYzApOworCisgICAgY21wX21pbnVzMTAgPSAoKHYxNnU4KSBzcmMwID09IHNyY19taW51czEwKTsKKyAgICBkaWZmX21pbnVzMTAgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMCwgY21wX21pbnVzMTApOworICAgIGNtcF9taW51czEwID0gKHNyY19taW51czEwIDwgKHYxNnU4KSBzcmMwKTsKKyAgICBkaWZmX21pbnVzMTAgPSBfX21zYV9ibW56X3YoZGlmZl9taW51czEwLCBjb25zdDEsIGNtcF9taW51czEwKTsKKworICAgIGNtcF9taW51czEwID0gKHNyYzAgPT0gIHNyY19wbHVzMTApOworICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX25vcl92KGNtcF9taW51czEwLCBjbXBfbWludXMxMCk7CisgICAgY21wX21pbnVzMTAgPSAoc3JjX3BsdXMxMCA8IHNyYzApOworICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX2JtbnpfdihkaWZmX21pbnVzMTEsIGNvbnN0MSwgY21wX21pbnVzMTApOworCisgICAgb2Zmc2V0ID0gKHYxNmk4KSBkaWZmX21pbnVzMTAgKyAodjE2aTgpIGRpZmZfbWludXMxMSArIDI7CisKKyAgICBWU0hGX0IyX1NCKGVkZ2VfaWR4LCBlZGdlX2lkeCwgc2FvX29mZnNldCwgc2FvX29mZnNldCwgb2Zmc2V0LCBvZmZzZXQsCisgICAgICAgICAgICAgICBvZmZzZXQsIG9mZnNldCk7CisKKyAgICBzcmMwID0gX19tc2FfeG9yaV9iKHNyYzAsIDEyOCk7CisgICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmMwLCBvZmZzZXQpOworICAgIGRzdDAgPSBfX21zYV94b3JpX2IoZHN0MCwgMTI4KTsKKworICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QwLCAwKTsKKyAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MCwgMSk7CisgICAgU0QoZHN0X3ZhbDAsIGRzdCk7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgU0QoZHN0X3ZhbDEsIGRzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfc2FvX2VkZ2VfZmlsdGVyXzBkZWdyZWVfMTZtdWx0aXBsZV9tc2EodWludDhfdCAqZHN0LApAQCAtOTg4LDcgKzE0NTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50OF90ICpkc3RfcHRyLCAqc3JjX21pbnVzMTsKLSAgICBpbnQzMl90IGhfY250LCB2X2NudDsKKyAgICBpbnQzMl90IHZfY250OwogICAgIHYxNmk4IGVkZ2VfaWR4ID0geyAxLCAyLCAwLCAzLCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CiAgICAgdjE2dTggY29uc3QxID0gKHYxNnU4KSBfX21zYV9sZGlfYigxKTsKICAgICB2MTZpOCBzYW9fb2Zmc2V0OwpAQCAtMTAwMSwyMCArMTQ2NSwxOCBAQAogICAgIHYxNmk4IG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxLCBvZmZzZXRfbWFzazIsIG9mZnNldF9tYXNrMzsKICAgICB2MTZpOCBzcmNfemVybzAsIHNyY196ZXJvMSwgc3JjX3plcm8yLCBzcmNfemVybzM7CiAgICAgdjE2aTggc3JjX3BsdXMxMCwgc3JjX3BsdXMxMSwgc3JjX3BsdXMxMiwgc3JjX3BsdXMxMzsKLSAgICB2OGkxNiBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotICAgIHY4aTE2IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKIAogICAgIHNhb19vZmZzZXQgPSBMRF9TQihzYW9fb2Zmc2V0X3ZhbCk7CiAgICAgc2FvX29mZnNldCA9IF9fbXNhX3Bja2V2X2Ioc2FvX29mZnNldCwgc2FvX29mZnNldCk7CiAKLSAgICBmb3IgKGhfY250ID0gKGhlaWdodCA+PiAyKTsgaF9jbnQtLTspIHsKKyAgICBmb3IgKDsgaGVpZ2h0OyBoZWlnaHQgLT0gNCkgewogICAgICAgICBzcmNfbWludXMxID0gc3JjIC0gMTsKICAgICAgICAgTERfVUI0KHNyY19taW51czEsIHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEsIHNyY19taW51czEyLCBzcmNfbWludXMxMyk7CiAKLSAgICAgICAgZm9yICh2X2NudCA9IDA7IHZfY250IDwgKHdpZHRoID4+IDQpOyB2X2NudCsrKSB7CisgICAgICAgIGZvciAodl9jbnQgPSAwOyB2X2NudCA8IHdpZHRoOyB2X2NudCArPSAxNikgewogICAgICAgICAgICAgc3JjX21pbnVzMSArPSAxNjsKLSAgICAgICAgICAgIGRzdF9wdHIgPSBkc3QgKyAodl9jbnQgPDwgNCk7CisgICAgICAgICAgICBkc3RfcHRyID0gZHN0ICsgdl9jbnQ7CiAgICAgICAgICAgICBMRF9VQjQoc3JjX21pbnVzMSwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMpOwogCiAgICAgICAgICAgICBTTERJX0IyX1NCKHNyYzEwLCBzcmMxMSwgc3JjX21pbnVzMTAsIHNyY19taW51czExLCBzcmNfemVybzAsCkBAIC0xMDc1LDIyICsxNTM3LDE0IEBACiAgICAgICAgICAgICBWU0hGX0IyX1NCKGVkZ2VfaWR4LCBlZGdlX2lkeCwgc2FvX29mZnNldCwgc2FvX29mZnNldCwgb2Zmc2V0X21hc2szLAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazMsIG9mZnNldF9tYXNrMywgb2Zmc2V0X21hc2szKTsKIAotICAgICAgICAgICAgVU5QQ0tfVUJfU0goc3JjX3plcm8wLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKG9mZnNldF9tYXNrMCwgdGVtcDAsIHRlbXAxKTsKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyY196ZXJvMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBVTlBDS19TQl9TSChvZmZzZXRfbWFzazEsIHRlbXAyLCB0ZW1wMyk7Ci0gICAgICAgICAgICBVTlBDS19VQl9TSChzcmNfemVybzIsIHNyYzQsIHNyYzUpOwotICAgICAgICAgICAgVU5QQ0tfU0JfU0gob2Zmc2V0X21hc2syLCB0ZW1wNCwgdGVtcDUpOwotICAgICAgICAgICAgVU5QQ0tfVUJfU0goc3JjX3plcm8zLCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKG9mZnNldF9tYXNrMywgdGVtcDYsIHRlbXA3KTsKLSAgICAgICAgICAgIEFERDQodGVtcDAsIHNyYzAsIHRlbXAxLCBzcmMxLCB0ZW1wMiwgc3JjMiwgdGVtcDMsIHNyYzMsIHRlbXAwLAotICAgICAgICAgICAgICAgICB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgICAgIEFERDQodGVtcDQsIHNyYzQsIHRlbXA1LCBzcmM1LCB0ZW1wNiwgc3JjNiwgdGVtcDcsIHNyYzcsIHRlbXA0LAotICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDYsIHRlbXA3KTsKLSAgICAgICAgICAgIENMSVBfU0g0XzBfMjU1KHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgICAgIENMSVBfU0g0XzBfMjU1KHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3KTsKLSAgICAgICAgICAgIFBDS0VWX0I0X1VCKHRlbXAxLCB0ZW1wMCwgdGVtcDMsIHRlbXAyLCB0ZW1wNSwgdGVtcDQsIHRlbXA3LCB0ZW1wNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjX3plcm8wLCBzcmNfemVybzEsIHNyY196ZXJvMiwgc3JjX3plcm8zKTsKKworICAgICAgICAgICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmNfemVybzAsIG9mZnNldF9tYXNrMCk7CisgICAgICAgICAgICBkc3QxID0gKHYxNnU4KSBfX21zYV9hZGRzX3NfYigodjE2aTgpIHNyY196ZXJvMSwgb2Zmc2V0X21hc2sxKTsKKyAgICAgICAgICAgIGRzdDIgPSAodjE2dTgpIF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjX3plcm8yLCBvZmZzZXRfbWFzazIpOworICAgICAgICAgICAgZHN0MyA9ICh2MTZ1OCkgX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmNfemVybzMsIG9mZnNldF9tYXNrMyk7CisKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1VCKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogCiAgICAgICAgICAgICBzcmNfbWludXMxMCA9IHNyYzEwOwogICAgICAgICAgICAgU1RfVUIoZHN0MCwgZHN0X3B0cik7CkBAIC0xMTE0LDIzICsxNTY4LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNhb19vZmZzZXRfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBpbnQzMl90IGhfY250OwogICAgIHVpbnQzMl90IGRzdF92YWwwLCBkc3RfdmFsMTsKLSAgICB2OGkxNiBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCB9OworICAgIHYxNmk4IGVkZ2VfaWR4ID0geyAxLCAyLCAwLCAzLCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CiAgICAgdjE2dTggY29uc3QxID0gKHYxNnU4KSBfX21zYV9sZGlfYigxKTsKICAgICB2MTZpOCBkc3QwOwotICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2MTZpOCBzYW9fb2Zmc2V0ID0gTERfU0Ioc2FvX29mZnNldF92YWwpOwogICAgIHYxNnU4IGNtcF9taW51czEwLCBkaWZmX21pbnVzMTAsIGNtcF9taW51czExLCBkaWZmX21pbnVzMTE7CiAgICAgdjE2dTggc3JjX21pbnVzMTAsIHNyY19taW51czExLCBzcmMxMCwgc3JjMTE7CiAgICAgdjE2aTggc3JjX3plcm8wLCBzcmNfemVybzE7Ci0gICAgdjhpMTYgc2FvX29mZnNldCwgc3JjMDAsIHNyYzAxLCBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMTsKKyAgICB2MTZpOCBvZmZzZXQ7CisgICAgdjhpMTYgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazE7CiAKLSAgICBzYW9fb2Zmc2V0ID0gTERfU0goc2FvX29mZnNldF92YWwpOworICAgIHNhb19vZmZzZXQgPSBfX21zYV9wY2tldl9iKHNhb19vZmZzZXQsIHNhb19vZmZzZXQpOwogCisgICAgLyogbG9hZCBpbiBhZHZhbmNlICovCiAgICAgTERfVUIyKHNyYyAtIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyY19taW51czEwLCBzcmNfbWludXMxMSk7CisgICAgTERfVUIyKHNyYyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CiAKLSAgICBmb3IgKGhfY250ID0gKGhlaWdodCA+PiAxKTsgaF9jbnQtLTspIHsKLSAgICAgICAgTERfVUIyKHNyYyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CisgICAgZm9yIChoZWlnaHQgLT0gMjsgaGVpZ2h0OyBoZWlnaHQgLT0gMikgeworICAgICAgICBzcmMgKz0gKHNyY19zdHJpZGUgPDwgMSk7CiAKICAgICAgICAgc3JjX21pbnVzMTAgPSAodjE2dTgpIF9fbXNhX2lsdnJfYigodjE2aTgpIHNyYzEwLCAodjE2aTgpIHNyY19taW51czEwKTsKICAgICAgICAgc3JjX3plcm8wID0gX19tc2FfaWx2cl9iKCh2MTZpOCkgc3JjX21pbnVzMTEsICh2MTZpOCkgc3JjX21pbnVzMTEpOwpAQCAtMTE1MCwxOSArMTYwNiwyMiBAQAogICAgICAgICBvZmZzZXRfbWFzazAgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTAsIGRpZmZfbWludXMxMCkgKyAyKTsKICAgICAgICAgb2Zmc2V0X21hc2sxID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czExLCBkaWZmX21pbnVzMTEpICsgMik7CiAKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMCwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2swKTsKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMSwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazEsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgSUxWRVZfQjJfU0goc3JjX3plcm8wLCB6ZXJvLCBzcmNfemVybzEsIHplcm8sIHNyYzAwLCBzcmMwMSk7Ci0gICAgICAgIEFERDIob2Zmc2V0X21hc2swLCBzcmMwMCwgb2Zmc2V0X21hc2sxLCBzcmMwMSwgb2Zmc2V0X21hc2swLAotICAgICAgICAgICAgIG9mZnNldF9tYXNrMSk7Ci0gICAgICAgIENMSVBfU0gyXzBfMjU1KG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBvZmZzZXRfbWFzazEsICh2MTZpOCkgb2Zmc2V0X21hc2swKTsKKyAgICAgICAgb2Zmc2V0ID0gX19tc2FfcGNrZXZfYigodjE2aTgpIG9mZnNldF9tYXNrMSwgKHYxNmk4KSBvZmZzZXRfbWFzazApOworICAgICAgICBkc3QwID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHNyY196ZXJvMSwgKHYxNmk4KSBzcmNfemVybzApOworCisgICAgICAgIFZTSEZfQjJfU0IoZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXQsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG9mZnNldCk7CisKKyAgICAgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKGRzdDAsIG9mZnNldCk7CisgICAgICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CiAKICAgICAgICAgc3JjX21pbnVzMTAgPSBzcmMxMDsKICAgICAgICAgc3JjX21pbnVzMTEgPSBzcmMxMTsKIAorICAgICAgICAvKiBsb2FkIGluIGFkdmFuY2UgKi8KKyAgICAgICAgTERfVUIyKHNyYyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CisKICAgICAgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDApOwogICAgICAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMik7CiAgICAgICAgIFNXKGRzdF92YWwwLCBkc3QpOwpAQCAtMTE3MCw4ICsxNjI5LDQxIEBACiAgICAgICAgIFNXKGRzdF92YWwxLCBkc3QpOwogCiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICBzcmMgKz0gKHNyY19zdHJpZGUgPDwgMSk7CiAgICAgfQorCisgICAgc3JjX21pbnVzMTAgPSAodjE2dTgpIF9fbXNhX2lsdnJfYigodjE2aTgpIHNyYzEwLCAodjE2aTgpIHNyY19taW51czEwKTsKKyAgICBzcmNfemVybzAgPSBfX21zYV9pbHZyX2IoKHYxNmk4KSBzcmNfbWludXMxMSwgKHYxNmk4KSBzcmNfbWludXMxMSk7CisgICAgc3JjX21pbnVzMTEgPSAodjE2dTgpIF9fbXNhX2lsdnJfYigodjE2aTgpIHNyYzExLCAodjE2aTgpIHNyY19taW51czExKTsKKyAgICBzcmNfemVybzEgPSBfX21zYV9pbHZyX2IoKHYxNmk4KSBzcmMxMCwgKHYxNmk4KSBzcmMxMCk7CisKKyAgICBjbXBfbWludXMxMCA9ICgodjE2dTgpIHNyY196ZXJvMCA9PSBzcmNfbWludXMxMCk7CisgICAgZGlmZl9taW51czEwID0gX19tc2Ffbm9yX3YoY21wX21pbnVzMTAsIGNtcF9taW51czEwKTsKKyAgICBjbXBfbWludXMxMCA9IChzcmNfbWludXMxMCA8ICh2MTZ1OCkgc3JjX3plcm8wKTsKKyAgICBkaWZmX21pbnVzMTAgPSBfX21zYV9ibW56X3YoZGlmZl9taW51czEwLCBjb25zdDEsIGNtcF9taW51czEwKTsKKworICAgIGNtcF9taW51czExID0gKCh2MTZ1OCkgc3JjX3plcm8xID09IHNyY19taW51czExKTsKKyAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMSwgY21wX21pbnVzMTEpOworICAgIGNtcF9taW51czExID0gKHNyY19taW51czExIDwgKHYxNnU4KSBzcmNfemVybzEpOworICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX2JtbnpfdihkaWZmX21pbnVzMTEsIGNvbnN0MSwgY21wX21pbnVzMTEpOworCisgICAgb2Zmc2V0X21hc2swID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czEwLCBkaWZmX21pbnVzMTApICsgMik7CisgICAgb2Zmc2V0X21hc2sxID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czExLCBkaWZmX21pbnVzMTEpICsgMik7CisKKyAgICBvZmZzZXQgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb2Zmc2V0X21hc2sxLCAodjE2aTgpIG9mZnNldF9tYXNrMCk7CisgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBzcmNfemVybzEsICh2MTZpOCkgc3JjX3plcm8wKTsKKworICAgIFZTSEZfQjJfU0IoZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXQsCisgICAgICAgICAgICAgICBvZmZzZXQsIG9mZnNldCwgb2Zmc2V0KTsKKworICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CisgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKGRzdDAsIG9mZnNldCk7CisgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKworICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAwKTsKKyAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMik7CisgICAgU1coZHN0X3ZhbDAsIGRzdCk7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgU1coZHN0X3ZhbDEsIGRzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfc2FvX2VkZ2VfZmlsdGVyXzkwZGVncmVlXzh3aWR0aF9tc2EodWludDhfdCAqZHN0LApAQCAtMTE4MSwyMiArMTY3MywyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzYW9fb2Zmc2V0X3ZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaW50MzJfdCBoX2NudDsKICAgICB1aW50NjRfdCBkc3RfdmFsMCwgZHN0X3ZhbDE7Ci0gICAgdjhpMTYgZWRnZV9pZHggPSB7IDEsIDIsIDAsIDMsIDQsIDAsIDAsIDAgfTsKKyAgICB2MTZpOCBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwogICAgIHYxNnU4IGNvbnN0MSA9ICh2MTZ1OCkgX19tc2FfbGRpX2IoMSk7Ci0gICAgdjE2aTggemVybyA9IHsgMCB9OwotICAgIHYxNmk4IHNyY196ZXJvMCwgc3JjX3plcm8xLCBkc3QwLCBkc3QxOworICAgIHYxNmk4IG9mZnNldCwgc2FvX29mZnNldCA9IExEX1NCKHNhb19vZmZzZXRfdmFsKTsKKyAgICB2MTZpOCBzcmNfemVybzAsIHNyY196ZXJvMSwgZHN0MDsKICAgICB2MTZ1OCBjbXBfbWludXMxMCwgZGlmZl9taW51czEwLCBjbXBfbWludXMxMSwgZGlmZl9taW51czExOwogICAgIHYxNnU4IHNyY19taW51czEwLCBzcmNfbWludXMxMSwgc3JjMTAsIHNyYzExOwotICAgIHY4aTE2IHNhb19vZmZzZXQsIHNyYzAwLCBvZmZzZXRfbWFzazAsIHNyYzAxLCBvZmZzZXRfbWFzazE7CisgICAgdjhpMTYgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazE7CiAKLSAgICBzYW9fb2Zmc2V0ID0gTERfU0goc2FvX29mZnNldF92YWwpOworICAgIHNhb19vZmZzZXQgPSBfX21zYV9wY2tldl9iKHNhb19vZmZzZXQsIHNhb19vZmZzZXQpOwogCisgICAgLyogbG9hZCBpbiBhZHZhbmNlICovCiAgICAgTERfVUIyKHNyYyAtIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyY19taW51czEwLCBzcmNfbWludXMxMSk7CisgICAgTERfVUIyKHNyYyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CiAKLSAgICBmb3IgKGhfY250ID0gKGhlaWdodCA+PiAxKTsgaF9jbnQtLTspIHsKLSAgICAgICAgTERfVUIyKHNyYyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CisgICAgZm9yIChoZWlnaHQgLT0gMjsgaGVpZ2h0OyBoZWlnaHQgLT0gMikgeworICAgICAgICBzcmMgKz0gKHNyY19zdHJpZGUgPDwgMSk7CiAKICAgICAgICAgc3JjX21pbnVzMTAgPSAodjE2dTgpIF9fbXNhX2lsdnJfYigodjE2aTgpIHNyYzEwLCAodjE2aTgpIHNyY19taW51czEwKTsKICAgICAgICAgc3JjX3plcm8wID0gX19tc2FfaWx2cl9iKCh2MTZpOCkgc3JjX21pbnVzMTEsICh2MTZpOCkgc3JjX21pbnVzMTEpOwpAQCAtMTIxNiwyOCArMTcwOSw2MyBAQAogICAgICAgICBvZmZzZXRfbWFzazAgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTAsIGRpZmZfbWludXMxMCkgKyAyKTsKICAgICAgICAgb2Zmc2V0X21hc2sxID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czExLCBkaWZmX21pbnVzMTEpICsgMik7CiAKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMCwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2swKTsKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMSwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazEsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgSUxWRVZfQjJfU0goc3JjX3plcm8wLCB6ZXJvLCBzcmNfemVybzEsIHplcm8sIHNyYzAwLCBzcmMwMSk7Ci0gICAgICAgIEFERDIob2Zmc2V0X21hc2swLCBzcmMwMCwgb2Zmc2V0X21hc2sxLCBzcmMwMSwgb2Zmc2V0X21hc2swLAotICAgICAgICAgICAgIG9mZnNldF9tYXNrMSk7Ci0gICAgICAgIENMSVBfU0gyXzBfMjU1KG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgUENLRVZfQjJfU0Iob2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxLAotICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxKTsKKyAgICAgICAgb2Zmc2V0ID0gX19tc2FfcGNrZXZfYigodjE2aTgpIG9mZnNldF9tYXNrMSwgKHYxNmk4KSBvZmZzZXRfbWFzazApOworICAgICAgICBkc3QwID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHNyY196ZXJvMSwgKHYxNmk4KSBzcmNfemVybzApOworCisgICAgICAgIFZTSEZfQjJfU0IoZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBvZmZzZXQsIG9mZnNldCk7CisKKyAgICAgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKGRzdDAsIG9mZnNldCk7CisgICAgICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CiAKICAgICAgICAgc3JjX21pbnVzMTAgPSBzcmMxMDsKICAgICAgICAgc3JjX21pbnVzMTEgPSBzcmMxMTsKIAorICAgICAgICAvKiBsb2FkIGluIGFkdmFuY2UgKi8KKyAgICAgICAgTERfVUIyKHNyYyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CisKICAgICAgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDAsIDApOwotICAgICAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MSwgMCk7CisgICAgICAgIGRzdF92YWwxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QwLCAxKTsKICAgICAgICAgU0QoZHN0X3ZhbDAsIGRzdCk7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwogICAgICAgICBTRChkc3RfdmFsMSwgZHN0KTsKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgIHNyYyArPSAoc3JjX3N0cmlkZSA8PCAxKTsKICAgICB9CisKKyAgICBzcmNfbWludXMxMCA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKCh2MTZpOCkgc3JjMTAsICh2MTZpOCkgc3JjX21pbnVzMTApOworICAgIHNyY196ZXJvMCA9IF9fbXNhX2lsdnJfYigodjE2aTgpIHNyY19taW51czExLCAodjE2aTgpIHNyY19taW51czExKTsKKyAgICBzcmNfbWludXMxMSA9ICh2MTZ1OCkgX19tc2FfaWx2cl9iKCh2MTZpOCkgc3JjMTEsICh2MTZpOCkgc3JjX21pbnVzMTEpOworICAgIHNyY196ZXJvMSA9IF9fbXNhX2lsdnJfYigodjE2aTgpIHNyYzEwLCAodjE2aTgpIHNyYzEwKTsKKworICAgIGNtcF9taW51czEwID0gKCh2MTZ1OCkgc3JjX3plcm8wID09IHNyY19taW51czEwKTsKKyAgICBkaWZmX21pbnVzMTAgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMCwgY21wX21pbnVzMTApOworICAgIGNtcF9taW51czEwID0gKHNyY19taW51czEwIDwgKHYxNnU4KSBzcmNfemVybzApOworICAgIGRpZmZfbWludXMxMCA9IF9fbXNhX2JtbnpfdihkaWZmX21pbnVzMTAsIGNvbnN0MSwgY21wX21pbnVzMTApOworCisgICAgY21wX21pbnVzMTEgPSAoKHYxNnU4KSBzcmNfemVybzEgPT0gc3JjX21pbnVzMTEpOworICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX25vcl92KGNtcF9taW51czExLCBjbXBfbWludXMxMSk7CisgICAgY21wX21pbnVzMTEgPSAoc3JjX21pbnVzMTEgPCAodjE2dTgpIHNyY196ZXJvMSk7CisgICAgZGlmZl9taW51czExID0gX19tc2FfYm1uel92KGRpZmZfbWludXMxMSwgY29uc3QxLCBjbXBfbWludXMxMSk7CisKKyAgICBvZmZzZXRfbWFzazAgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTAsIGRpZmZfbWludXMxMCkgKyAyKTsKKyAgICBvZmZzZXRfbWFzazEgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTEsIGRpZmZfbWludXMxMSkgKyAyKTsKKworICAgIG9mZnNldCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBvZmZzZXRfbWFzazEsICh2MTZpOCkgb2Zmc2V0X21hc2swKTsKKyAgICBkc3QwID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHNyY196ZXJvMSwgKHYxNmk4KSBzcmNfemVybzApOworCisgICAgVlNIRl9CMl9TQihlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgb2Zmc2V0LCBvZmZzZXQpOworCisgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKyAgICBkc3QwID0gX19tc2FfYWRkc19zX2IoZHN0MCwgb2Zmc2V0KTsKKyAgICBkc3QwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBkc3QwLCAxMjgpOworCisgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDAsIDApOworICAgIGRzdF92YWwxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QwLCAxKTsKKyAgICBTRChkc3RfdmFsMCwgZHN0KTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICBTRChkc3RfdmFsMSwgZHN0KTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19zYW9fZWRnZV9maWx0ZXJfOTBkZWdyZWVfMTZtdWx0aXBsZV9tc2EodWludDhfdCAqZHN0LApAQCAtMTI2MSwxNSArMTc4OSwxMyBAQAogICAgIHYxNnU4IHNyYzEwLCBzcmNfbWludXMxMCwgZHN0MCwgc3JjMTEsIHNyY19taW51czExLCBkc3QxOwogICAgIHYxNnU4IHNyYzEyLCBkc3QyLCBzcmMxMywgZHN0MzsKICAgICB2MTZpOCBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2syLCBvZmZzZXRfbWFzazMsIHNhb19vZmZzZXQ7Ci0gICAgdjhpMTYgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKLSAgICB2OGkxNiB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CiAKICAgICBzYW9fb2Zmc2V0ID0gTERfU0Ioc2FvX29mZnNldF92YWwpOwogICAgIHNhb19vZmZzZXQgPSBfX21zYV9wY2tldl9iKHNhb19vZmZzZXQsIHNhb19vZmZzZXQpOwogCi0gICAgZm9yICh2X2NudCA9IDA7IHZfY250IDwgKHdpZHRoID4+IDQpOyB2X2NudCsrKSB7Ci0gICAgICAgIHNyYyA9IHNyY19vcmlnICsgKHZfY250IDw8IDQpOwotICAgICAgICBkc3QgPSBkc3Rfb3JpZyArICh2X2NudCA8PCA0KTsKKyAgICBmb3IgKHZfY250ID0gMDsgdl9jbnQgPCB3aWR0aDsgdl9jbnQgKz0gMTYpIHsKKyAgICAgICAgc3JjID0gc3JjX29yaWcgKyB2X2NudDsKKyAgICAgICAgZHN0ID0gZHN0X29yaWcgKyB2X2NudDsKIAogICAgICAgICBMRF9VQjIoc3JjIC0gc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgc3JjX21pbnVzMTAsIHNyY19taW51czExKTsKIApAQCAtMTMyNSwyNCArMTg1MSwxNSBAQAogICAgICAgICAgICAgVlNIRl9CMl9TQihlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF9tYXNrMywgb2Zmc2V0X21hc2szLCBvZmZzZXRfbWFzazMsIG9mZnNldF9tYXNrMyk7CiAKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyY19taW51czExLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKG9mZnNldF9tYXNrMCwgdGVtcDAsIHRlbXAxKTsKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyYzEwLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKG9mZnNldF9tYXNrMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyYzExLCBzcmM0LCBzcmM1KTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKG9mZnNldF9tYXNrMiwgdGVtcDQsIHRlbXA1KTsKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyYzEyLCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKG9mZnNldF9tYXNrMywgdGVtcDYsIHRlbXA3KTsKLSAgICAgICAgICAgIEFERDQodGVtcDAsIHNyYzAsIHRlbXAxLCBzcmMxLCB0ZW1wMiwgc3JjMiwgdGVtcDMsIHNyYzMsIHRlbXAwLAotICAgICAgICAgICAgICAgICB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgICAgIEFERDQodGVtcDQsIHNyYzQsIHRlbXA1LCBzcmM1LCB0ZW1wNiwgc3JjNiwgdGVtcDcsIHNyYzcsIHRlbXA0LAotICAgICAgICAgICAgICAgICB0ZW1wNSwgdGVtcDYsIHRlbXA3KTsKLSAgICAgICAgICAgIENMSVBfU0g0XzBfMjU1KHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsKLSAgICAgICAgICAgIENMSVBfU0g0XzBfMjU1KHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3KTsKLSAgICAgICAgICAgIFBDS0VWX0I0X1VCKHRlbXAxLCB0ZW1wMCwgdGVtcDMsIHRlbXAyLCB0ZW1wNSwgdGVtcDQsIHRlbXA3LCB0ZW1wNiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCiAgICAgICAgICAgICBzcmNfbWludXMxMCA9IHNyYzEyOworICAgICAgICAgICAgWE9SSV9CNF8xMjhfVUIoc3JjX21pbnVzMTEsIHNyYzEwLCBzcmMxMSwgc3JjMTIpOworCisgICAgICAgICAgICBkc3QwID0gKHYxNnU4KSBfX21zYV9hZGRzX3NfYigodjE2aTgpIHNyY19taW51czExLCBvZmZzZXRfbWFzazApOworICAgICAgICAgICAgZHN0MSA9ICh2MTZ1OCkgX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmMxMCwgb2Zmc2V0X21hc2sxKTsKKyAgICAgICAgICAgIGRzdDIgPSAodjE2dTgpIF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjMTEsIG9mZnNldF9tYXNrMik7CisgICAgICAgICAgICBkc3QzID0gKHYxNnU4KSBfX21zYV9hZGRzX3NfYigodjE2aTgpIHNyYzEyLCBvZmZzZXRfbWFzazMpOworCisgICAgICAgICAgICBYT1JJX0I0XzEyOF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKICAgICAgICAgICAgIHNyY19taW51czExID0gc3JjMTM7CiAKICAgICAgICAgICAgIFNUX1VCNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIGRzdF9zdHJpZGUpOwpAQCAtMTM2MSwyMyArMTg3OCwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50OF90ICpzcmNfb3JpZzsKLSAgICBpbnQzMl90IGhfY250OwogICAgIHVpbnQzMl90IGRzdF92YWwwLCBkc3RfdmFsMTsKLSAgICB2OGkxNiBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCB9OworICAgIHYxNmk4IGVkZ2VfaWR4ID0geyAxLCAyLCAwLCAzLCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CiAgICAgdjE2dTggY29uc3QxID0gKHYxNnU4KSBfX21zYV9sZGlfYigxKTsKLSAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjE2aTggb2Zmc2V0LCBzYW9fb2Zmc2V0ID0gTERfU0Ioc2FvX29mZnNldF92YWwpOwogICAgIHYxNnU4IGNtcF9taW51czEwLCBkaWZmX21pbnVzMTAsIHNyY19taW51czEwLCBjbXBfbWludXMxMSwgZGlmZl9taW51czExOwogICAgIHYxNnU4IHNyY19taW51czExLCBzcmMxMCwgc3JjMTE7CiAgICAgdjE2aTggc3JjX3BsdXMwLCBzcmNfemVybzAsIHNyY19wbHVzMSwgc3JjX3plcm8xLCBkc3QwOwotICAgIHY4aTE2IHNhb19vZmZzZXQsIHNyYzAwLCBzcmMwMSwgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazE7CisgICAgdjhpMTYgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazE7CiAKLSAgICBzYW9fb2Zmc2V0ID0gTERfU0goc2FvX29mZnNldF92YWwpOworICAgIHNhb19vZmZzZXQgPSBfX21zYV9wY2tldl9iKHNhb19vZmZzZXQsIHNhb19vZmZzZXQpOwogCiAgICAgc3JjX29yaWcgPSBzcmMgLSAxOwotICAgIExEX1VCMihzcmNfb3JpZyAtIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyY19taW51czEwLCBzcmNfbWludXMxMSk7CiAKLSAgICBmb3IgKGhfY250ID0gKGhlaWdodCA+PiAxKTsgaF9jbnQtLTspIHsKLSAgICAgICAgTERfVUIyKHNyY19vcmlnICsgc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExKTsKKyAgICAvKiBsb2FkIGluIGFkdmFuY2UgKi8KKyAgICBMRF9VQjIoc3JjX29yaWcgLSBzcmNfc3RyaWRlLCBzcmNfc3RyaWRlLCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEpOworICAgIExEX1VCMihzcmNfb3JpZyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CisKKyAgICBmb3IgKGhlaWdodCAtPSAyOyBoZWlnaHQ7IGhlaWdodCAtPSAyKSB7CisgICAgICAgIHNyY19vcmlnICs9IChzcmNfc3RyaWRlIDw8IDEpOwogCiAgICAgICAgIFNMRElfQjJfMF9TQihzcmNfbWludXMxMSwgc3JjMTAsIHNyY196ZXJvMCwgc3JjX3plcm8xLCAxKTsKICAgICAgICAgU0xESV9CMl8wX1NCKHNyYzEwLCBzcmMxMSwgc3JjX3BsdXMwLCBzcmNfcGx1czEsIDIpOwpAQCAtMTQwMCwyMCArMTkxOSwyMiBAQAogICAgICAgICBvZmZzZXRfbWFzazAgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTAsIGRpZmZfbWludXMxMCkgKyAyKTsKICAgICAgICAgb2Zmc2V0X21hc2sxID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czExLCBkaWZmX21pbnVzMTEpICsgMik7CiAKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMCwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2swKTsKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMSwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazEsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgSUxWRVZfQjJfU0goc3JjX3plcm8wLCB6ZXJvLCBzcmNfemVybzEsIHplcm8sIHNyYzAwLCBzcmMwMSk7Ci0gICAgICAgIEFERDIob2Zmc2V0X21hc2swLCBzcmMwMCwgb2Zmc2V0X21hc2sxLCBzcmMwMSwgb2Zmc2V0X21hc2swLAotICAgICAgICAgICAgIG9mZnNldF9tYXNrMSk7Ci0gICAgICAgIENMSVBfU0gyXzBfMjU1KG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxKTsKKyAgICAgICAgb2Zmc2V0ID0gX19tc2FfcGNrZXZfYigodjE2aTgpIG9mZnNldF9tYXNrMSwgKHYxNmk4KSBvZmZzZXRfbWFzazApOworICAgICAgICBkc3QwID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHNyY196ZXJvMSwgKHYxNmk4KSBzcmNfemVybzApOwogCi0gICAgICAgIGRzdDAgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb2Zmc2V0X21hc2sxLCAodjE2aTgpIG9mZnNldF9tYXNrMCk7CisgICAgICAgIFZTSEZfQjJfU0IoZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBvZmZzZXQsIG9mZnNldCk7CisKKyAgICAgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKGRzdDAsIG9mZnNldCk7CisgICAgICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CiAKICAgICAgICAgc3JjX21pbnVzMTAgPSBzcmMxMDsKICAgICAgICAgc3JjX21pbnVzMTEgPSBzcmMxMTsKIAorICAgICAgICAvKiBsb2FkIGluIGFkdmFuY2UgKi8KKyAgICAgICAgTERfVUIyKHNyY19vcmlnICsgc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExKTsKKwogICAgICAgICBkc3RfdmFsMCA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMCk7CiAgICAgICAgIGRzdF92YWwxID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAyKTsKICAgICAgICAgU1coZHN0X3ZhbDAsIGRzdCk7CkBAIC0xNDIxLDggKzE5NDIsNDQgQEAKICAgICAgICAgU1coZHN0X3ZhbDEsIGRzdCk7CiAKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgIHNyY19vcmlnICs9IChzcmNfc3RyaWRlIDw8IDEpOwogICAgIH0KKworICAgIFNMRElfQjJfMF9TQihzcmNfbWludXMxMSwgc3JjMTAsIHNyY196ZXJvMCwgc3JjX3plcm8xLCAxKTsKKyAgICBTTERJX0IyXzBfU0Ioc3JjMTAsIHNyYzExLCBzcmNfcGx1czAsIHNyY19wbHVzMSwgMik7CisKKyAgICBJTFZSX0IyX1VCKHNyY19wbHVzMCwgc3JjX21pbnVzMTAsIHNyY19wbHVzMSwgc3JjX21pbnVzMTEsIHNyY19taW51czEwLAorICAgICAgICAgICAgICAgc3JjX21pbnVzMTEpOworICAgIElMVlJfQjJfU0Ioc3JjX3plcm8wLCBzcmNfemVybzAsIHNyY196ZXJvMSwgc3JjX3plcm8xLCBzcmNfemVybzAsCisgICAgICAgICAgICAgICBzcmNfemVybzEpOworCisgICAgY21wX21pbnVzMTAgPSAoKHYxNnU4KSBzcmNfemVybzAgPT0gc3JjX21pbnVzMTApOworICAgIGRpZmZfbWludXMxMCA9IF9fbXNhX25vcl92KGNtcF9taW51czEwLCBjbXBfbWludXMxMCk7CisgICAgY21wX21pbnVzMTAgPSAoc3JjX21pbnVzMTAgPCAodjE2dTgpIHNyY196ZXJvMCk7CisgICAgZGlmZl9taW51czEwID0gX19tc2FfYm1uel92KGRpZmZfbWludXMxMCwgY29uc3QxLCBjbXBfbWludXMxMCk7CisKKyAgICBjbXBfbWludXMxMSA9ICgodjE2dTgpIHNyY196ZXJvMSA9PSBzcmNfbWludXMxMSk7CisgICAgZGlmZl9taW51czExID0gX19tc2Ffbm9yX3YoY21wX21pbnVzMTEsIGNtcF9taW51czExKTsKKyAgICBjbXBfbWludXMxMSA9IChzcmNfbWludXMxMSA8ICh2MTZ1OCkgc3JjX3plcm8xKTsKKyAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ibW56X3YoZGlmZl9taW51czExLCBjb25zdDEsIGNtcF9taW51czExKTsKKworICAgIG9mZnNldF9tYXNrMCA9ICh2OGkxNikgKF9fbXNhX2hhZGRfdV9oKGRpZmZfbWludXMxMCwgZGlmZl9taW51czEwKSArIDIpOworICAgIG9mZnNldF9tYXNrMSA9ICh2OGkxNikgKF9fbXNhX2hhZGRfdV9oKGRpZmZfbWludXMxMSwgZGlmZl9taW51czExKSArIDIpOworCisgICAgb2Zmc2V0ID0gX19tc2FfcGNrZXZfYigodjE2aTgpIG9mZnNldF9tYXNrMSwgKHYxNmk4KSBvZmZzZXRfbWFzazApOworICAgIGRzdDAgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgc3JjX3plcm8xLCAodjE2aTgpIHNyY196ZXJvMCk7CisKKyAgICBWU0hGX0IyX1NCKGVkZ2VfaWR4LCBlZGdlX2lkeCwgc2FvX29mZnNldCwgc2FvX29mZnNldCwgb2Zmc2V0LCBvZmZzZXQsCisgICAgICAgICAgICAgICBvZmZzZXQsIG9mZnNldCk7CisKKyAgICBkc3QwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBkc3QwLCAxMjgpOworICAgIGRzdDAgPSBfX21zYV9hZGRzX3NfYihkc3QwLCBvZmZzZXQpOworICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CisKKyAgICBkc3RfdmFsMCA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMCk7CisgICAgZHN0X3ZhbDEgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDIpOworICAgIFNXKGRzdF92YWwwLCBkc3QpOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIFNXKGRzdF92YWwxLCBkc3QpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX3Nhb19lZGdlX2ZpbHRlcl80NWRlZ3JlZV84d2lkdGhfbXNhKHVpbnQ4X3QgKmRzdCwKQEAgLTE0MzMsMjMgKzE5OTAsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDhfdCAqc3JjX29yaWc7Ci0gICAgaW50MzJfdCBoX2NudDsKICAgICB1aW50NjRfdCBkc3RfdmFsMCwgZHN0X3ZhbDE7Ci0gICAgdjhpMTYgZWRnZV9pZHggPSB7IDEsIDIsIDAsIDMsIDQsIDAsIDAsIDAgfTsKKyAgICB2MTZpOCBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwogICAgIHYxNnU4IGNvbnN0MSA9ICh2MTZ1OCkgX19tc2FfbGRpX2IoMSk7Ci0gICAgdjE2aTggemVybyA9IHsgMCB9OworICAgIHYxNmk4IG9mZnNldCwgc2FvX29mZnNldCA9IExEX1NCKHNhb19vZmZzZXRfdmFsKTsKICAgICB2MTZ1OCBjbXBfbWludXMxMCwgZGlmZl9taW51czEwLCBjbXBfbWludXMxMSwgZGlmZl9taW51czExOwogICAgIHYxNnU4IHNyY19taW51czEwLCBzcmMxMCwgc3JjX21pbnVzMTEsIHNyYzExOwotICAgIHYxNmk4IHNyY196ZXJvMCwgc3JjX3BsdXMxMCwgc3JjX3plcm8xLCBzcmNfcGx1czExLCBkc3QwLCBkc3QxOwotICAgIHY4aTE2IHNhb19vZmZzZXQsIHNyYzAwLCBvZmZzZXRfbWFzazAsIHNyYzAxLCBvZmZzZXRfbWFzazE7CisgICAgdjE2aTggc3JjX3plcm8wLCBzcmNfcGx1czEwLCBzcmNfemVybzEsIHNyY19wbHVzMTEsIGRzdDA7CisgICAgdjhpMTYgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazE7CiAKLSAgICBzYW9fb2Zmc2V0ID0gTERfU0goc2FvX29mZnNldF92YWwpOworICAgIHNhb19vZmZzZXQgPSBfX21zYV9wY2tldl9iKHNhb19vZmZzZXQsIHNhb19vZmZzZXQpOwogICAgIHNyY19vcmlnID0gc3JjIC0gMTsKIAorICAgIC8qIGxvYWQgaW4gYWR2YW5jZSAqLwogICAgIExEX1VCMihzcmNfb3JpZyAtIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyY19taW51czEwLCBzcmNfbWludXMxMSk7CisgICAgTERfVUIyKHNyY19vcmlnICsgc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExKTsKIAotICAgIGZvciAoaF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBoX2NudC0tOykgewotICAgICAgICBMRF9VQjIoc3JjX29yaWcgKyBzcmNfc3RyaWRlLCBzcmNfc3RyaWRlLCBzcmMxMCwgc3JjMTEpOworICAgIGZvciAoaGVpZ2h0IC09IDI7IGhlaWdodDsgaGVpZ2h0IC09IDIpIHsKKyAgICAgICAgc3JjX29yaWcgKz0gKHNyY19zdHJpZGUgPDwgMSk7CiAKICAgICAgICAgU0xESV9CMl8wX1NCKHNyY19taW51czExLCBzcmMxMCwgc3JjX3plcm8wLCBzcmNfemVybzEsIDEpOwogICAgICAgICBTTERJX0IyXzBfU0Ioc3JjMTAsIHNyYzExLCBzcmNfcGx1czEwLCBzcmNfcGx1czExLCAyKTsKQEAgLTE0NzIsMjkgKzIwMzAsNzEgQEAKICAgICAgICAgb2Zmc2V0X21hc2swID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czEwLCBkaWZmX21pbnVzMTApICsgMik7CiAgICAgICAgIG9mZnNldF9tYXNrMSA9ICh2OGkxNikgKF9fbXNhX2hhZGRfdV9oKGRpZmZfbWludXMxMSwgZGlmZl9taW51czExKSArIDIpOwogCi0gICAgICAgIFZTSEZfSDJfU0goZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXRfbWFzazAsCi0gICAgICAgICAgICAgICAgICAgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMCk7Ci0gICAgICAgIFZTSEZfSDJfU0goZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXRfbWFzazEsCi0gICAgICAgICAgICAgICAgICAgb2Zmc2V0X21hc2sxLCBvZmZzZXRfbWFzazEsIG9mZnNldF9tYXNrMSk7Ci0gICAgICAgIElMVkVWX0IyX1NIKHNyY196ZXJvMCwgemVybywgc3JjX3plcm8xLCB6ZXJvLCBzcmMwMCwgc3JjMDEpOwotICAgICAgICBBREQyKG9mZnNldF9tYXNrMCwgc3JjMDAsIG9mZnNldF9tYXNrMSwgc3JjMDEsIG9mZnNldF9tYXNrMCwKLSAgICAgICAgICAgICBvZmZzZXRfbWFzazEpOwotICAgICAgICBDTElQX1NIMl8wXzI1NShvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMSk7Ci0gICAgICAgIFBDS0VWX0IyX1NCKG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazEsIG9mZnNldF9tYXNrMSwKLSAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSk7CisgICAgICAgIG9mZnNldCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBvZmZzZXRfbWFzazEsICh2MTZpOCkgb2Zmc2V0X21hc2swKTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBzcmNfemVybzEsICh2MTZpOCkgc3JjX3plcm8wKTsKKworICAgICAgICBWU0hGX0IyX1NCKGVkZ2VfaWR4LCBlZGdlX2lkeCwgc2FvX29mZnNldCwgc2FvX29mZnNldCwgb2Zmc2V0LCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBvZmZzZXQpOworCisgICAgICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CisgICAgICAgIGRzdDAgPSBfX21zYV9hZGRzX3NfYihkc3QwLCBvZmZzZXQpOworICAgICAgICBkc3QwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBkc3QwLCAxMjgpOwogCiAgICAgICAgIHNyY19taW51czEwID0gc3JjMTA7CiAgICAgICAgIHNyY19taW51czExID0gc3JjMTE7CiAKKyAgICAgICAgLyogbG9hZCBpbiBhZHZhbmNlICovCisgICAgICAgIExEX1VCMihzcmNfb3JpZyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CisKICAgICAgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDAsIDApOwotICAgICAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MSwgMCk7CisgICAgICAgIGRzdF92YWwxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QwLCAxKTsKICAgICAgICAgU0QoZHN0X3ZhbDAsIGRzdCk7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwogICAgICAgICBTRChkc3RfdmFsMSwgZHN0KTsKLQogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgICAgICAgc3JjX29yaWcgKz0gKHNyY19zdHJpZGUgPDwgMSk7CiAgICAgfQorCisgICAgU0xESV9CMl8wX1NCKHNyY19taW51czExLCBzcmMxMCwgc3JjX3plcm8wLCBzcmNfemVybzEsIDEpOworICAgIFNMRElfQjJfMF9TQihzcmMxMCwgc3JjMTEsIHNyY19wbHVzMTAsIHNyY19wbHVzMTEsIDIpOworICAgIElMVlJfQjJfVUIoc3JjX3BsdXMxMCwgc3JjX21pbnVzMTAsIHNyY19wbHVzMTEsIHNyY19taW51czExLCBzcmNfbWludXMxMCwKKyAgICAgICAgICAgICAgIHNyY19taW51czExKTsKKyAgICBJTFZSX0IyX1NCKHNyY196ZXJvMCwgc3JjX3plcm8wLCBzcmNfemVybzEsIHNyY196ZXJvMSwgc3JjX3plcm8wLAorICAgICAgICAgICAgICAgc3JjX3plcm8xKTsKKworICAgIGNtcF9taW51czEwID0gKCh2MTZ1OCkgc3JjX3plcm8wID09IHNyY19taW51czEwKTsKKyAgICBkaWZmX21pbnVzMTAgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMCwgY21wX21pbnVzMTApOworICAgIGNtcF9taW51czEwID0gKHNyY19taW51czEwIDwgKHYxNnU4KSBzcmNfemVybzApOworICAgIGRpZmZfbWludXMxMCA9IF9fbXNhX2JtbnpfdihkaWZmX21pbnVzMTAsIGNvbnN0MSwgY21wX21pbnVzMTApOworCisgICAgY21wX21pbnVzMTEgPSAoKHYxNnU4KSBzcmNfemVybzEgPT0gc3JjX21pbnVzMTEpOworICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX25vcl92KGNtcF9taW51czExLCBjbXBfbWludXMxMSk7CisgICAgY21wX21pbnVzMTEgPSAoc3JjX21pbnVzMTEgPCAodjE2dTgpIHNyY196ZXJvMSk7CisgICAgZGlmZl9taW51czExID0gX19tc2FfYm1uel92KGRpZmZfbWludXMxMSwgY29uc3QxLCBjbXBfbWludXMxMSk7CisKKyAgICBvZmZzZXRfbWFzazAgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTAsIGRpZmZfbWludXMxMCkgKyAyKTsKKyAgICBvZmZzZXRfbWFzazEgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTEsIGRpZmZfbWludXMxMSkgKyAyKTsKKworICAgIG9mZnNldCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBvZmZzZXRfbWFzazEsICh2MTZpOCkgb2Zmc2V0X21hc2swKTsKKyAgICBkc3QwID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHNyY196ZXJvMSwgKHYxNmk4KSBzcmNfemVybzApOworCisgICAgVlNIRl9CMl9TQihlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgb2Zmc2V0LCBvZmZzZXQpOworCisgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKyAgICBkc3QwID0gX19tc2FfYWRkc19zX2IoZHN0MCwgb2Zmc2V0KTsKKyAgICBkc3QwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBkc3QwLCAxMjgpOworCisgICAgc3JjX21pbnVzMTAgPSBzcmMxMDsKKyAgICBzcmNfbWludXMxMSA9IHNyYzExOworCisgICAgLyogbG9hZCBpbiBhZHZhbmNlICovCisgICAgTERfVUIyKHNyY19vcmlnICsgc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExKTsKKworICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QwLCAwKTsKKyAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MCwgMSk7CisgICAgU0QoZHN0X3ZhbDAsIGRzdCk7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgU0QoZHN0X3ZhbDEsIGRzdCk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfc2FvX2VkZ2VfZmlsdGVyXzQ1ZGVncmVlXzE2bXVsdGlwbGVfbXNhKHVpbnQ4X3QgKmRzdCwKQEAgLTE1MDgsNyArMjEwOCw3IEBACiB7CiAgICAgdWludDhfdCAqc3JjX29yaWcgPSBzcmM7CiAgICAgdWludDhfdCAqZHN0X29yaWcgPSBkc3Q7Ci0gICAgaW50MzJfdCBoX2NudCwgdl9jbnQ7CisgICAgaW50MzJfdCB2X2NudDsKICAgICB2MTZpOCBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwogICAgIHYxNnU4IGNvbnN0MSA9ICh2MTZ1OCkgX19tc2FfbGRpX2IoMSk7CiAgICAgdjE2dTggY21wX21pbnVzMTAsIGNtcF9wbHVzMTAsIGRpZmZfbWludXMxMCwgZGlmZl9wbHVzMTAsIGNtcF9taW51czExOwpAQCAtMTUyMCwyMiArMjEyMCwyMCBAQAogICAgIHYxNnU4IHNyYzEyLCBzcmNfbWludXMxMiwgZHN0Miwgc3JjMTMsIHNyY19taW51czEzLCBkc3QzOwogICAgIHYxNmk4IHNyY196ZXJvMCwgc3JjX3BsdXMxMCwgc3JjX3plcm8xLCBzcmNfcGx1czExLCBzcmNfemVybzIsIHNyY19wbHVzMTI7CiAgICAgdjE2aTggc3JjX3plcm8zLCBzYW9fb2Zmc2V0OwotICAgIHY4aTE2IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7Ci0gICAgdjhpMTYgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OwogCiAgICAgc2FvX29mZnNldCA9IExEX1NCKHNhb19vZmZzZXRfdmFsKTsKICAgICBzYW9fb2Zmc2V0ID0gX19tc2FfcGNrZXZfYihzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0KTsKIAotICAgIGZvciAoaF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBoX2NudC0tOykgeworICAgIGZvciAoOyBoZWlnaHQ7IGhlaWdodCAtPSA0KSB7CiAgICAgICAgIHNyY19vcmlnID0gc3JjIC0gMTsKICAgICAgICAgZHN0X29yaWcgPSBkc3Q7Ci0gICAgICAgIExEX1VCNChzcmNfb3JpZywgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgIHNyY19taW51czExLCBzcmNfbWludXMxMiwgc3JjX21pbnVzMTMsIHNyY19taW51czE0KTsKKyAgICAgICAgTERfVUI0KHNyY19vcmlnLCBzcmNfc3RyaWRlLCBzcmNfbWludXMxMSwgc3JjX21pbnVzMTIsIHNyY19taW51czEzLAorICAgICAgICAgICAgICAgc3JjX21pbnVzMTQpOwogCi0gICAgICAgIGZvciAodl9jbnQgPSAwOyB2X2NudCA8ICh3aWR0aCA+PiA0KTsgdl9jbnQrKykgeworICAgICAgICBmb3IgKHZfY250ID0gMDsgdl9jbnQgPCB3aWR0aDsgdl9jbnQgKz0gMTYpIHsKICAgICAgICAgICAgIHNyY19taW51czEwID0gTERfVUIoc3JjX29yaWcgLSBzcmNfc3RyaWRlKTsKICAgICAgICAgICAgIExEX1VCNChzcmNfb3JpZyArIDE2LCBzcmNfc3RyaWRlLCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMyk7Ci0gICAgICAgICAgICBzcmNfcGx1czEzID0gTERfVUIoc3JjICsgMSArICh2X2NudCA8PCA0KSArIChzcmNfc3RyaWRlIDw8IDIpKTsKKyAgICAgICAgICAgIHNyY19wbHVzMTMgPSBMRF9VQihzcmMgKyAxICsgdl9jbnQgKyAoc3JjX3N0cmlkZSA8PCAyKSk7CiAgICAgICAgICAgICBzcmNfb3JpZyArPSAxNjsKIAogICAgICAgICAgICAgU0xESV9CMl9TQihzcmMxMCwgc3JjMTEsIHNyY19taW51czExLCBzcmNfbWludXMxMiwgc3JjX3plcm8wLApAQCAtMTU5NywyMiArMjE5NSwxNCBAQAogICAgICAgICAgICAgVlNIRl9CMl9TQihlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF9tYXNrMywgb2Zmc2V0X21hc2szLCBvZmZzZXRfbWFzazMsIG9mZnNldF9tYXNrMyk7CiAKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyY196ZXJvMCwgc3JjMCwgc3JjMSk7Ci0gICAgICAgICAgICBVTlBDS19TQl9TSChvZmZzZXRfbWFzazAsIHRlbXAwLCB0ZW1wMSk7Ci0gICAgICAgICAgICBVTlBDS19VQl9TSChzcmNfemVybzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgVU5QQ0tfU0JfU0gob2Zmc2V0X21hc2sxLCB0ZW1wMiwgdGVtcDMpOwotICAgICAgICAgICAgVU5QQ0tfVUJfU0goc3JjX3plcm8yLCBzcmM0LCBzcmM1KTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKG9mZnNldF9tYXNrMiwgdGVtcDQsIHRlbXA1KTsKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyY196ZXJvMywgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBVTlBDS19TQl9TSChvZmZzZXRfbWFzazMsIHRlbXA2LCB0ZW1wNyk7Ci0gICAgICAgICAgICBBREQ0KHRlbXAwLCBzcmMwLCB0ZW1wMSwgc3JjMSwgdGVtcDIsIHNyYzIsIHRlbXAzLCBzcmMzLCB0ZW1wMCwKLSAgICAgICAgICAgICAgICAgdGVtcDEsIHRlbXAyLCB0ZW1wMyk7Ci0gICAgICAgICAgICBBREQ0KHRlbXA0LCBzcmM0LCB0ZW1wNSwgc3JjNSwgdGVtcDYsIHNyYzYsIHRlbXA3LCBzcmM3LCB0ZW1wNCwKLSAgICAgICAgICAgICAgICAgdGVtcDUsIHRlbXA2LCB0ZW1wNyk7Ci0gICAgICAgICAgICBDTElQX1NINF8wXzI1NSh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMyk7Ci0gICAgICAgICAgICBDTElQX1NINF8wXzI1NSh0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNyk7Ci0gICAgICAgICAgICBQQ0tFVl9CNF9VQih0ZW1wMSwgdGVtcDAsIHRlbXAzLCB0ZW1wMiwgdGVtcDUsIHRlbXA0LAotICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDcsIHRlbXA2LCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyY196ZXJvMCwgc3JjX3plcm8xLCBzcmNfemVybzIsIHNyY196ZXJvMyk7CisKKyAgICAgICAgICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjX3plcm8wLCBvZmZzZXRfbWFzazApOworICAgICAgICAgICAgZHN0MSA9ICh2MTZ1OCkgX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmNfemVybzEsIG9mZnNldF9tYXNrMSk7CisgICAgICAgICAgICBkc3QyID0gKHYxNnU4KSBfX21zYV9hZGRzX3NfYigodjE2aTgpIHNyY196ZXJvMiwgb2Zmc2V0X21hc2syKTsKKyAgICAgICAgICAgIGRzdDMgPSAodjE2dTgpIF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjX3plcm8zLCBvZmZzZXRfbWFzazMpOworCisgICAgICAgICAgICBYT1JJX0I0XzEyOF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKIAogICAgICAgICAgICAgc3JjX21pbnVzMTEgPSBzcmMxMDsKICAgICAgICAgICAgIHNyY19taW51czEyID0gc3JjMTE7CkBAIC0xNjM2LDIzICsyMjI2LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50OF90ICpzcmNfb3JpZzsKLSAgICBpbnQzMl90IGhfY250OwogICAgIHVpbnQzMl90IGRzdF92YWwwLCBkc3RfdmFsMTsKLSAgICB2OGkxNiBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCB9OworICAgIHYxNmk4IGVkZ2VfaWR4ID0geyAxLCAyLCAwLCAzLCA0LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CiAgICAgdjE2dTggY29uc3QxID0gKHYxNnU4KSBfX21zYV9sZGlfYigxKTsKLSAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjE2aTggb2Zmc2V0LCBzYW9fb2Zmc2V0ID0gTERfU0Ioc2FvX29mZnNldF92YWwpOwogICAgIHYxNmk4IHNyY196ZXJvMCwgc3JjX3plcm8xLCBkc3QwOwogICAgIHYxNnU4IGNtcF9taW51czEwLCBkaWZmX21pbnVzMTAsIGNtcF9taW51czExLCBkaWZmX21pbnVzMTE7CiAgICAgdjE2dTggc3JjX21pbnVzMTAsIHNyYzEwLCBzcmNfbWludXMxMSwgc3JjMTE7Ci0gICAgdjhpMTYgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazEsIHNhb19vZmZzZXQsIHNyYzAwLCBzcmMwMTsKKyAgICB2OGkxNiBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMTsKIAotICAgIHNhb19vZmZzZXQgPSBMRF9TSChzYW9fb2Zmc2V0X3ZhbCk7CisgICAgc2FvX29mZnNldCA9IF9fbXNhX3Bja2V2X2Ioc2FvX29mZnNldCwgc2FvX29mZnNldCk7CiAgICAgc3JjX29yaWcgPSBzcmMgLSAxOwogCisgICAgLyogbG9hZCBpbiBhZHZhbmNlICovCiAgICAgTERfVUIyKHNyY19vcmlnIC0gc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgc3JjX21pbnVzMTAsIHNyY19taW51czExKTsKKyAgICBMRF9VQjIoc3JjX29yaWcgKyBzcmNfc3RyaWRlLCBzcmNfc3RyaWRlLCBzcmMxMCwgc3JjMTEpOwogCi0gICAgZm9yIChoX2NudCA9IChoZWlnaHQgPj4gMSk7IGhfY250LS07KSB7Ci0gICAgICAgIExEX1VCMihzcmNfb3JpZyArIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyYzEwLCBzcmMxMSk7CisgICAgZm9yIChoZWlnaHQgLT0gMjsgaGVpZ2h0OyBoZWlnaHQgLT0gMikgeworICAgICAgICBzcmNfb3JpZyArPSAoc3JjX3N0cmlkZSA8PCAxKTsKIAogICAgICAgICBTTERJX0IyXzBfU0Ioc3JjX21pbnVzMTEsIHNyYzEwLCBzcmNfemVybzAsIHNyY196ZXJvMSwgMSk7CiAgICAgICAgIFNMRElfQjJfMF9VQihzcmNfbWludXMxMCwgc3JjX21pbnVzMTEsIHNyY19taW51czEwLCBzcmNfbWludXMxMSwgMik7CkBAIC0xNjc1LDE5ICsyMjY2LDIyIEBACiAgICAgICAgIG9mZnNldF9tYXNrMCA9ICh2OGkxNikgKF9fbXNhX2hhZGRfdV9oKGRpZmZfbWludXMxMCwgZGlmZl9taW51czEwKSArIDIpOwogICAgICAgICBvZmZzZXRfbWFzazEgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTEsIGRpZmZfbWludXMxMSkgKyAyKTsKIAotICAgICAgICBWU0hGX0gyX1NIKGVkZ2VfaWR4LCBlZGdlX2lkeCwgc2FvX29mZnNldCwgc2FvX29mZnNldCwgb2Zmc2V0X21hc2swLAotICAgICAgICAgICAgICAgICAgIG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazApOwotICAgICAgICBWU0hGX0gyX1NIKGVkZ2VfaWR4LCBlZGdlX2lkeCwgc2FvX29mZnNldCwgc2FvX29mZnNldCwgb2Zmc2V0X21hc2sxLAotICAgICAgICAgICAgICAgICAgIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxLCBvZmZzZXRfbWFzazEpOwotICAgICAgICBJTFZFVl9CMl9TSChzcmNfemVybzAsIHplcm8sIHNyY196ZXJvMSwgemVybywgc3JjMDAsIHNyYzAxKTsKLSAgICAgICAgQUREMihvZmZzZXRfbWFzazAsIHNyYzAwLCBvZmZzZXRfbWFzazEsIHNyYzAxLCBvZmZzZXRfbWFzazAsCi0gICAgICAgICAgICAgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgQ0xJUF9TSDJfMF8yNTUob2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazEpOwotICAgICAgICBkc3QwID0gX19tc2FfcGNrZXZfYigodjE2aTgpIG9mZnNldF9tYXNrMSwgKHYxNmk4KSBvZmZzZXRfbWFzazApOworICAgICAgICBvZmZzZXQgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb2Zmc2V0X21hc2sxLCAodjE2aTgpIG9mZnNldF9tYXNrMCk7CisgICAgICAgIGRzdDAgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgc3JjX3plcm8xLCAodjE2aTgpIHNyY196ZXJvMCk7CisKKyAgICAgICAgVlNIRl9CMl9TQihlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIG9mZnNldCwgb2Zmc2V0KTsKKworICAgICAgICBkc3QwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBkc3QwLCAxMjgpOworICAgICAgICBkc3QwID0gX19tc2FfYWRkc19zX2IoZHN0MCwgb2Zmc2V0KTsKKyAgICAgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKIAogICAgICAgICBzcmNfbWludXMxMCA9IHNyYzEwOwogICAgICAgICBzcmNfbWludXMxMSA9IHNyYzExOwogCisgICAgICAgIC8qIGxvYWQgaW4gYWR2YW5jZSAqLworICAgICAgICBMRF9VQjIoc3JjX29yaWcgKyBzcmNfc3RyaWRlLCBzcmNfc3RyaWRlLCBzcmMxMCwgc3JjMTEpOworCiAgICAgICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAwKTsKICAgICAgICAgZHN0X3ZhbDEgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDIpOwogCkBAIC0xNjk2LDggKzIyOTAsNDYgQEAKICAgICAgICAgU1coZHN0X3ZhbDEsIGRzdCk7CiAKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgIHNyY19vcmlnICs9IChzcmNfc3RyaWRlIDw8IDEpOwogICAgIH0KKworICAgIFNMRElfQjJfMF9TQihzcmNfbWludXMxMSwgc3JjMTAsIHNyY196ZXJvMCwgc3JjX3plcm8xLCAxKTsKKyAgICBTTERJX0IyXzBfVUIoc3JjX21pbnVzMTAsIHNyY19taW51czExLCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEsIDIpOworCisgICAgSUxWUl9CMl9VQihzcmMxMCwgc3JjX21pbnVzMTAsIHNyYzExLCBzcmNfbWludXMxMSwgc3JjX21pbnVzMTAsCisgICAgICAgICAgICAgICBzcmNfbWludXMxMSk7CisgICAgSUxWUl9CMl9TQihzcmNfemVybzAsIHNyY196ZXJvMCwgc3JjX3plcm8xLCBzcmNfemVybzEsIHNyY196ZXJvMCwKKyAgICAgICAgICAgICAgIHNyY196ZXJvMSk7CisKKyAgICBjbXBfbWludXMxMCA9ICgodjE2dTgpIHNyY196ZXJvMCA9PSBzcmNfbWludXMxMCk7CisgICAgZGlmZl9taW51czEwID0gX19tc2Ffbm9yX3YoY21wX21pbnVzMTAsIGNtcF9taW51czEwKTsKKyAgICBjbXBfbWludXMxMCA9IChzcmNfbWludXMxMCA8ICh2MTZ1OCkgc3JjX3plcm8wKTsKKyAgICBkaWZmX21pbnVzMTAgPSBfX21zYV9ibW56X3YoZGlmZl9taW51czEwLCBjb25zdDEsIGNtcF9taW51czEwKTsKKworICAgIGNtcF9taW51czExID0gKCh2MTZ1OCkgc3JjX3plcm8xID09IHNyY19taW51czExKTsKKyAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ub3JfdihjbXBfbWludXMxMSwgY21wX21pbnVzMTEpOworICAgIGNtcF9taW51czExID0gKHNyY19taW51czExIDwgKHYxNnU4KSBzcmNfemVybzEpOworICAgIGRpZmZfbWludXMxMSA9IF9fbXNhX2JtbnpfdihkaWZmX21pbnVzMTEsIGNvbnN0MSwgY21wX21pbnVzMTEpOworCisgICAgb2Zmc2V0X21hc2swID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czEwLCBkaWZmX21pbnVzMTApICsgMik7CisgICAgb2Zmc2V0X21hc2sxID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czExLCBkaWZmX21pbnVzMTEpICsgMik7CisKKyAgICBvZmZzZXQgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb2Zmc2V0X21hc2sxLCAodjE2aTgpIG9mZnNldF9tYXNrMCk7CisgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBzcmNfemVybzEsICh2MTZpOCkgc3JjX3plcm8wKTsKKworICAgIFZTSEZfQjJfU0IoZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXQsIG9mZnNldCwKKyAgICAgICAgICAgICAgIG9mZnNldCwgb2Zmc2V0KTsKKworICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CisgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKGRzdDAsIG9mZnNldCk7CisgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKworICAgIGRzdF92YWwwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwLCAwKTsKKyAgICBkc3RfdmFsMSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMik7CisKKyAgICBTVyhkc3RfdmFsMCwgZHN0KTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICBTVyhkc3RfdmFsMSwgZHN0KTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19zYW9fZWRnZV9maWx0ZXJfMTM1ZGVncmVlXzh3aWR0aF9tc2EodWludDhfdCAqZHN0LApAQCAtMTcwOCwyMyArMjM0MCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDhfdCAqc3JjX29yaWc7Ci0gICAgaW50MzJfdCBoX2NudDsKICAgICB1aW50NjRfdCBkc3RfdmFsMCwgZHN0X3ZhbDE7Ci0gICAgdjhpMTYgZWRnZV9pZHggPSB7IDEsIDIsIDAsIDMsIDQsIDAsIDAsIDAgfTsKKyAgICB2MTZpOCBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwogICAgIHYxNnU4IGNvbnN0MSA9ICh2MTZ1OCkgX19tc2FfbGRpX2IoMSk7Ci0gICAgdjE2aTggemVybyA9IHsgMCB9OwotICAgIHYxNmk4IHNyY196ZXJvMCwgc3JjX3plcm8xLCBkc3QwLCBkc3QxOworICAgIHYxNmk4IG9mZnNldCwgc2FvX29mZnNldCA9IExEX1NCKHNhb19vZmZzZXRfdmFsKTsKICAgICB2MTZ1OCBjbXBfbWludXMxMCwgZGlmZl9taW51czEwLCBjbXBfbWludXMxMSwgZGlmZl9taW51czExOwogICAgIHYxNnU4IHNyY19taW51czEwLCBzcmMxMCwgc3JjX21pbnVzMTEsIHNyYzExOwotICAgIHY4aTE2IHNhb19vZmZzZXQsIHNyYzAwLCBvZmZzZXRfbWFzazAsIHNyYzAxLCBvZmZzZXRfbWFzazE7CisgICAgdjE2aTggc3JjX3plcm8wLCBzcmNfemVybzEsIGRzdDA7CisgICAgdjhpMTYgb2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazE7CiAKLSAgICBzYW9fb2Zmc2V0ID0gTERfU0goc2FvX29mZnNldF92YWwpOworICAgIHNhb19vZmZzZXQgPSBfX21zYV9wY2tldl9iKHNhb19vZmZzZXQsIHNhb19vZmZzZXQpOwogICAgIHNyY19vcmlnID0gc3JjIC0gMTsKIAorICAgIC8qIGxvYWQgaW4gYWR2YW5jZSAqLwogICAgIExEX1VCMihzcmNfb3JpZyAtIHNyY19zdHJpZGUsIHNyY19zdHJpZGUsIHNyY19taW51czEwLCBzcmNfbWludXMxMSk7CisgICAgTERfVUIyKHNyY19vcmlnICsgc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExKTsKIAotICAgIGZvciAoaF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBoX2NudC0tOykgewotICAgICAgICBMRF9VQjIoc3JjX29yaWcgKyBzcmNfc3RyaWRlLCBzcmNfc3RyaWRlLCBzcmMxMCwgc3JjMTEpOworICAgIGZvciAoaGVpZ2h0IC09IDI7IGhlaWdodDsgaGVpZ2h0IC09IDIpIHsKKyAgICAgICAgc3JjX29yaWcgKz0gKHNyY19zdHJpZGUgPDwgMSk7CiAKICAgICAgICAgU0xESV9CMl8wX1NCKHNyY19taW51czExLCBzcmMxMCwgc3JjX3plcm8wLCBzcmNfemVybzEsIDEpOwogICAgICAgICBTTERJX0IyXzBfVUIoc3JjX21pbnVzMTAsIHNyY19taW51czExLCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEsIDIpOwpAQCAtMTc0NiwzMCArMjM3OSw2OCBAQAogICAgICAgICBvZmZzZXRfbWFzazAgPSAodjhpMTYpIChfX21zYV9oYWRkX3VfaChkaWZmX21pbnVzMTAsIGRpZmZfbWludXMxMCkgKyAyKTsKICAgICAgICAgb2Zmc2V0X21hc2sxID0gKHY4aTE2KSAoX19tc2FfaGFkZF91X2goZGlmZl9taW51czExLCBkaWZmX21pbnVzMTEpICsgMik7CiAKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMCwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2swKTsKLSAgICAgICAgVlNIRl9IMl9TSChlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsIG9mZnNldF9tYXNrMSwKLSAgICAgICAgICAgICAgICAgICBvZmZzZXRfbWFzazEsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgSUxWRVZfQjJfU0goc3JjX3plcm8wLCB6ZXJvLCBzcmNfemVybzEsIHplcm8sIHNyYzAwLCBzcmMwMSk7Ci0gICAgICAgIEFERDIob2Zmc2V0X21hc2swLCBzcmMwMCwgb2Zmc2V0X21hc2sxLCBzcmMwMSwgb2Zmc2V0X21hc2swLAotICAgICAgICAgICAgIG9mZnNldF9tYXNrMSk7Ci0gICAgICAgIENMSVBfU0gyXzBfMjU1KG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxKTsKLSAgICAgICAgUENLRVZfQjJfU0Iob2Zmc2V0X21hc2swLCBvZmZzZXRfbWFzazAsIG9mZnNldF9tYXNrMSwgb2Zmc2V0X21hc2sxLAotICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxKTsKKyAgICAgICAgb2Zmc2V0ID0gX19tc2FfcGNrZXZfYigodjE2aTgpIG9mZnNldF9tYXNrMSwgKHYxNmk4KSBvZmZzZXRfbWFzazApOworICAgICAgICBkc3QwID0gX19tc2FfcGNrZXZfYigodjE2aTgpIHNyY196ZXJvMSwgKHYxNmk4KSBzcmNfemVybzApOworCisgICAgICAgIFZTSEZfQjJfU0IoZWRnZV9pZHgsIGVkZ2VfaWR4LCBzYW9fb2Zmc2V0LCBzYW9fb2Zmc2V0LCBvZmZzZXQsIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBvZmZzZXQsIG9mZnNldCk7CisKKyAgICAgICAgZHN0MCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgZHN0MCwgMTI4KTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19iKGRzdDAsIG9mZnNldCk7CisgICAgICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CiAKICAgICAgICAgc3JjX21pbnVzMTAgPSBzcmMxMDsKICAgICAgICAgc3JjX21pbnVzMTEgPSBzcmMxMTsKIAorICAgICAgICAvKiBsb2FkIGluIGFkdmFuY2UgKi8KKyAgICAgICAgTERfVUIyKHNyY19vcmlnICsgc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExKTsKKwogICAgICAgICBkc3RfdmFsMCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MCwgMCk7Ci0gICAgICAgIGRzdF92YWwxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QxLCAwKTsKKyAgICAgICAgZHN0X3ZhbDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDAsIDEpOwogCiAgICAgICAgIFNEKGRzdF92YWwwLCBkc3QpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICAgICAgU0QoZHN0X3ZhbDEsIGRzdCk7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotCi0gICAgICAgIHNyY19vcmlnICs9IChzcmNfc3RyaWRlIDw8IDEpOwogICAgIH0KKworICAgIFNMRElfQjJfMF9TQihzcmNfbWludXMxMSwgc3JjMTAsIHNyY196ZXJvMCwgc3JjX3plcm8xLCAxKTsKKyAgICBTTERJX0IyXzBfVUIoc3JjX21pbnVzMTAsIHNyY19taW51czExLCBzcmNfbWludXMxMCwgc3JjX21pbnVzMTEsIDIpOworICAgIElMVlJfQjJfVUIoc3JjMTAsIHNyY19taW51czEwLCBzcmMxMSwgc3JjX21pbnVzMTEsIHNyY19taW51czEwLAorICAgICAgICAgICAgICAgc3JjX21pbnVzMTEpOworICAgIElMVlJfQjJfU0Ioc3JjX3plcm8wLCBzcmNfemVybzAsIHNyY196ZXJvMSwgc3JjX3plcm8xLCBzcmNfemVybzAsCisgICAgICAgICAgICAgICBzcmNfemVybzEpOworCisgICAgY21wX21pbnVzMTAgPSAoKHYxNnU4KSBzcmNfemVybzAgPT0gc3JjX21pbnVzMTApOworICAgIGRpZmZfbWludXMxMCA9IF9fbXNhX25vcl92KGNtcF9taW51czEwLCBjbXBfbWludXMxMCk7CisgICAgY21wX21pbnVzMTAgPSAoc3JjX21pbnVzMTAgPCAodjE2dTgpIHNyY196ZXJvMCk7CisgICAgZGlmZl9taW51czEwID0gX19tc2FfYm1uel92KGRpZmZfbWludXMxMCwgY29uc3QxLCBjbXBfbWludXMxMCk7CisKKyAgICBjbXBfbWludXMxMSA9ICgodjE2dTgpIHNyY196ZXJvMSA9PSBzcmNfbWludXMxMSk7CisgICAgZGlmZl9taW51czExID0gX19tc2Ffbm9yX3YoY21wX21pbnVzMTEsIGNtcF9taW51czExKTsKKyAgICBjbXBfbWludXMxMSA9IChzcmNfbWludXMxMSA8ICh2MTZ1OCkgc3JjX3plcm8xKTsKKyAgICBkaWZmX21pbnVzMTEgPSBfX21zYV9ibW56X3YoZGlmZl9taW51czExLCBjb25zdDEsIGNtcF9taW51czExKTsKKworICAgIG9mZnNldF9tYXNrMCA9ICh2OGkxNikgKF9fbXNhX2hhZGRfdV9oKGRpZmZfbWludXMxMCwgZGlmZl9taW51czEwKSArIDIpOworICAgIG9mZnNldF9tYXNrMSA9ICh2OGkxNikgKF9fbXNhX2hhZGRfdV9oKGRpZmZfbWludXMxMSwgZGlmZl9taW51czExKSArIDIpOworCisgICAgb2Zmc2V0ID0gX19tc2FfcGNrZXZfYigodjE2aTgpIG9mZnNldF9tYXNrMSwgKHYxNmk4KSBvZmZzZXRfbWFzazApOworICAgIGRzdDAgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgc3JjX3plcm8xLCAodjE2aTgpIHNyY196ZXJvMCk7CisKKyAgICBWU0hGX0IyX1NCKGVkZ2VfaWR4LCBlZGdlX2lkeCwgc2FvX29mZnNldCwgc2FvX29mZnNldCwgb2Zmc2V0LCBvZmZzZXQsCisgICAgICAgICAgICAgICBvZmZzZXQsIG9mZnNldCk7CisKKyAgICBkc3QwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBkc3QwLCAxMjgpOworICAgIGRzdDAgPSBfX21zYV9hZGRzX3NfYihkc3QwLCBvZmZzZXQpOworICAgIGRzdDAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIGRzdDAsIDEyOCk7CisKKyAgICBkc3RfdmFsMCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MCwgMCk7CisgICAgZHN0X3ZhbDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDAsIDEpOworCisgICAgU0QoZHN0X3ZhbDAsIGRzdCk7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgU0QoZHN0X3ZhbDEsIGRzdCk7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfc2FvX2VkZ2VfZmlsdGVyXzEzNWRlZ3JlZV8xNm11bHRpcGxlX21zYSh1aW50OF90ICpkc3QsCkBAIC0xNzgyLDcgKzI0NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQ4X3QgKnNyY19vcmlnLCAqZHN0X29yaWc7Ci0gICAgaW50MzJfdCBoX2NudCwgdl9jbnQ7CisgICAgaW50MzJfdCB2X2NudDsKICAgICB2MTZpOCBlZGdlX2lkeCA9IHsgMSwgMiwgMCwgMywgNCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OwogICAgIHYxNnU4IGNvbnN0MSA9ICh2MTZ1OCkgX19tc2FfbGRpX2IoMSk7CiAgICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKQEAgLTE3OTMsMjAgKzI0NjQsMTggQEAKICAgICB2MTZ1OCBzcmNfcGx1czEwLCBzcmNfcGx1czExLCBzcmNfcGx1czEyLCBzcmNfcGx1czEzOwogICAgIHYxNmk4IHNyY19taW51czEyLCBzcmNfbWludXMxMywgc3JjX3plcm8wLCBzcmNfemVybzEsIHNyY196ZXJvMiwgc3JjX3plcm8zOwogICAgIHYxNmk4IG9mZnNldF9tYXNrMCwgb2Zmc2V0X21hc2sxLCBvZmZzZXRfbWFzazIsIG9mZnNldF9tYXNrMywgc2FvX29mZnNldDsKLSAgICB2OGkxNiBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotICAgIHY4aTE2IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKIAogICAgIHNhb19vZmZzZXQgPSBMRF9TQihzYW9fb2Zmc2V0X3ZhbCk7CiAgICAgc2FvX29mZnNldCA9IF9fbXNhX3Bja2V2X2Ioc2FvX29mZnNldCwgc2FvX29mZnNldCk7CiAKLSAgICBmb3IgKGhfY250ID0gKGhlaWdodCA+PiAyKTsgaF9jbnQtLTspIHsKKyAgICBmb3IgKDsgaGVpZ2h0OyBoZWlnaHQgLT0gNCkgewogICAgICAgICBzcmNfb3JpZyA9IHNyYyAtIDE7CiAgICAgICAgIGRzdF9vcmlnID0gZHN0OwogCi0gICAgICAgIExEX1VCNChzcmNfb3JpZywgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgIHNyY19taW51czExLCBzcmNfcGx1czEwLCBzcmNfcGx1czExLCBzcmNfcGx1czEyKTsKKyAgICAgICAgTERfVUI0KHNyY19vcmlnLCBzcmNfc3RyaWRlLCBzcmNfbWludXMxMSwgc3JjX3BsdXMxMCwgc3JjX3BsdXMxMSwKKyAgICAgICAgICAgICAgIHNyY19wbHVzMTIpOwogCi0gICAgICAgIGZvciAodl9jbnQgPSAwOyB2X2NudCA8ICh3aWR0aCA+PiA0KTsgdl9jbnQrKykgeworICAgICAgICBmb3IgKHZfY250ID0gMDsgdl9jbnQgPCB3aWR0aDsgdl9jbnQgKz0gMTYpIHsKICAgICAgICAgICAgIHNyY19taW51czEwID0gTERfVUIoc3JjX29yaWcgKyAyIC0gc3JjX3N0cmlkZSk7CiAgICAgICAgICAgICBMRF9VQjQoc3JjX29yaWcgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMpOwogICAgICAgICAgICAgc3JjX3BsdXMxMyA9IExEX1VCKHNyY19vcmlnICsgKHNyY19zdHJpZGUgPDwgMikpOwpAQCAtMTg3MywyMyArMjU0MiwxNCBAQAogICAgICAgICAgICAgVlNIRl9CMl9TQihlZGdlX2lkeCwgZWRnZV9pZHgsIHNhb19vZmZzZXQsIHNhb19vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF9tYXNrMywgb2Zmc2V0X21hc2szLCBvZmZzZXRfbWFzazMsIG9mZnNldF9tYXNrMyk7CiAKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyY196ZXJvMCwgc3JjMCwgc3JjMSk7Ci0gICAgICAgICAgICBVTlBDS19TQl9TSChvZmZzZXRfbWFzazAsIHRlbXAwLCB0ZW1wMSk7Ci0gICAgICAgICAgICBVTlBDS19VQl9TSChzcmNfemVybzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgVU5QQ0tfU0JfU0gob2Zmc2V0X21hc2sxLCB0ZW1wMiwgdGVtcDMpOwotICAgICAgICAgICAgVU5QQ0tfVUJfU0goc3JjX3plcm8yLCBzcmM0LCBzcmM1KTsKLSAgICAgICAgICAgIFVOUENLX1NCX1NIKG9mZnNldF9tYXNrMiwgdGVtcDQsIHRlbXA1KTsKLSAgICAgICAgICAgIFVOUENLX1VCX1NIKHNyY196ZXJvMywgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBVTlBDS19TQl9TSChvZmZzZXRfbWFzazMsIHRlbXA2LCB0ZW1wNyk7CisgICAgICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmNfemVybzAsIHNyY196ZXJvMSwgc3JjX3plcm8yLCBzcmNfemVybzMpOwogCi0gICAgICAgICAgICBBREQ0KHRlbXAwLCBzcmMwLCB0ZW1wMSwgc3JjMSwgdGVtcDIsIHNyYzIsIHRlbXAzLCBzcmMzLCB0ZW1wMCwKLSAgICAgICAgICAgICAgICAgdGVtcDEsIHRlbXAyLCB0ZW1wMyk7Ci0gICAgICAgICAgICBBREQ0KHRlbXA0LCBzcmM0LCB0ZW1wNSwgc3JjNSwgdGVtcDYsIHNyYzYsIHRlbXA3LCBzcmM3LCB0ZW1wNCwKLSAgICAgICAgICAgICAgICAgdGVtcDUsIHRlbXA2LCB0ZW1wNyk7Ci0gICAgICAgICAgICBDTElQX1NINF8wXzI1NSh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMyk7Ci0gICAgICAgICAgICBDTElQX1NINF8wXzI1NSh0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNyk7Ci0gICAgICAgICAgICBQQ0tFVl9CNF9VQih0ZW1wMSwgdGVtcDAsIHRlbXAzLCB0ZW1wMiwgdGVtcDUsIHRlbXA0LCB0ZW1wNywgdGVtcDYsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjX3plcm8wLCBvZmZzZXRfbWFzazApOworICAgICAgICAgICAgZHN0MSA9ICh2MTZ1OCkgX19tc2FfYWRkc19zX2IoKHYxNmk4KSBzcmNfemVybzEsIG9mZnNldF9tYXNrMSk7CisgICAgICAgICAgICBkc3QyID0gKHYxNnU4KSBfX21zYV9hZGRzX3NfYigodjE2aTgpIHNyY196ZXJvMiwgb2Zmc2V0X21hc2syKTsKKyAgICAgICAgICAgIGRzdDMgPSAodjE2dTgpIF9fbXNhX2FkZHNfc19iKCh2MTZpOCkgc3JjX3plcm8zLCBvZmZzZXRfbWFzazMpOworCisgICAgICAgICAgICBYT1JJX0I0XzEyOF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKIAogICAgICAgICAgICAgc3JjX21pbnVzMTEgPSBzcmMxMDsKICAgICAgICAgICAgIHNyY19wbHVzMTAgPSBzcmMxMTsKQEAgLTE5NzAsNyArMjYzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNhb19vZmZzZXRfdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW8sIGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKLSAgICBwdHJkaWZmX3Qgc3RyaWRlX3NyYyA9ICgyICogNjQgKyAzMikgLyBzaXplb2YodWludDhfdCk7CisgICAgcHRyZGlmZl90IHN0cmlkZV9zcmMgPSAoMiAqIE1BWF9QQl9TSVpFICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgLyBzaXplb2YodWludDhfdCk7CiAKICAgICBzd2l0Y2ggKGVvKSB7CiAgICAgY2FzZSAwOgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2hldmNfbWFjcm9zX21zYS5oIGIvbGliYXZjb2RlYy9taXBzL2hldmNfbWFjcm9zX21zYS5oCmluZGV4IGIwNmM1YWQuLmVhNTM4MTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9oZXZjX21hY3Jvc19tc2EuaAorKysgYi9saWJhdmNvZGVjL21pcHMvaGV2Y19tYWNyb3NfbXNhLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgLSAyMDE3IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIxLDQyICsyMSwxNiBAQAogI2lmbmRlZiBBVkNPREVDX01JUFNfSEVWQ19NQUNST1NfTVNBX0gKICNkZWZpbmUgQVZDT0RFQ19NSVBTX0hFVkNfTUFDUk9TX01TQV9ICiAKLSNkZWZpbmUgSEVWQ19QQ0tfU1dfU0IyKGluMCwgaW4xLCBvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2OGkxNiB0bXAwX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXAwX20gPSBfX21zYV9wY2tldl9oKCh2OGkxNikgaW4wLCAodjhpMTYpIGluMSk7ICAgICAgICAgICAgIFwKLSAgICBvdXQgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAwX20sICh2MTZpOCkgdG1wMF9tKTsgIFwKLX0KLQotI2RlZmluZSBIRVZDX1BDS19TV19TQjQoaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQpICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHY4aTE2IHRtcDBfbSwgdG1wMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFBDS0VWX0gyX1NIKGluMCwgaW4xLCBpbjIsIGluMywgdG1wMF9tLCB0bXAxX20pOyAgICAgICAgICAgICAgXAotICAgIG91dCA9ICh2NGkzMikgX19tc2FfcGNrZXZfYigodjE2aTgpIHRtcDFfbSwgKHYxNmk4KSB0bXAwX20pOyAgXAotfQotCi0jZGVmaW5lIEhFVkNfUENLX1NXX1NCOChpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgb3V0MCwgb3V0MSkgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHY4aTE2IHRtcDBfbSwgdG1wMV9tLCB0bXAyX20sIHRtcDNfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBQQ0tFVl9INF9TSChpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHRtcDBfbSwgdG1wMV9tLCB0bXAyX20sIHRtcDNfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUENLRVZfQjJfU1codG1wMV9tLCB0bXAwX20sIHRtcDNfbSwgdG1wMl9tLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBIRVZDX1BDS19TV19TQjEyKGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbjgsIGluOSwgaW4xMCwgaW4xMSwgb3V0MCwgb3V0MSwgb3V0MikgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHY4aTE2IHRtcDBfbSwgdG1wMV9tLCB0bXAyX20sIHRtcDNfbSwgdG1wNF9tLCB0bXA1X207ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUENLRVZfSDRfU0goaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHRtcDBfbSwgdG1wMV9tLCB0bXAyX20sIHRtcDNfbSk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBQQ0tFVl9IMl9TSChpbjgsIGluOSwgaW4xMCwgaW4xMSwgdG1wNF9tLCB0bXA1X20pOyAgICAgICAgICAgICBcCi0gICAgUENLRVZfQjJfU1codG1wMV9tLCB0bXAwX20sIHRtcDNfbSwgdG1wMl9tLCBvdXQwLCBvdXQxKTsgICAgICAgXAotICAgIG91dDIgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXA1X20sICh2MTZpOCkgdG1wNF9tKTsgIFwKLX0KKyNkZWZpbmUgSEVWQ19GSUxUXzhUQVBfU0goaW4wLCBpbjEsIGluMiwgaW4zLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MykgICAgICAgICAgICBcCisoIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2OGkxNiBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0X20gPSBfX21zYV9kb3RwX3NfaCgodjE2aTgpIGluMCwgKHYxNmk4KSBmaWx0MCk7ICAgICAgICAgIFwKKyAgICBvdXRfbSA9IF9fbXNhX2RwYWRkX3NfaChvdXRfbSwgKHYxNmk4KSBpbjEsICh2MTZpOCkgZmlsdDEpOyAgXAorICAgIERQQUREX1NCMl9TSChpbjIsIGluMywgZmlsdDIsIGZpbHQzLCBvdXRfbSwgb3V0X20pOyAgICAgICAgICBcCisgICAgb3V0X207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gKQogCiAjZGVmaW5lIEhFVkNfRklMVF84VEFQKGluMCwgaW4xLCBpbjIsIGluMywgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpICAgICAgICAgICAgICAgXApAQCAtNjksNiArNDMsMTUgQEAKICAgICBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSApCiAKKyNkZWZpbmUgSEVWQ19GSUxUXzRUQVBfU0goaW4wLCBpbjEsIGZpbHQwLCBmaWx0MSkgICAgICAgICAgICAgICAgXAorKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjhpMTYgb3V0X207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dF9tID0gX19tc2FfZG90cF9zX2goKHYxNmk4KSBpbjAsICh2MTZpOCkgZmlsdDApOyAgICAgICAgICBcCisgICAgb3V0X20gPSBfX21zYV9kcGFkZF9zX2gob3V0X20sICh2MTZpOCkgaW4xLCAodjE2aTgpIGZpbHQxKTsgIFwKKyAgICBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSApCisKICNkZWZpbmUgSEVWQ19GSUxUXzRUQVAoaW4wLCBpbjEsIGZpbHQwLCBmaWx0MSkgICAgICAgICAgIFwKICggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB2NGkzMiBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oZXZjX21jX2JpX21zYS5jIGIvbGliYXZjb2RlYy9taXBzL2hldmNfbWNfYmlfbXNhLmMKaW5kZXggODIwOGJlMy4uYjU1NTUxNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2hldmNfbWNfYmlfbXNhLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2hldmNfbWNfYmlfbXNhLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgLSAyMDE3IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIyLDYgKzIyLDEyIEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy9taXBzL2hldmNkc3BfbWlwcy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvbWlwcy9oZXZjX21hY3Jvc19tc2EuaCIKIAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19tYXNrX2FyclsxNiAqIDJdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMHg0MCkpKSA9IHsKKyAgICAvKiA4IHdpZHRoIGNhc2VzICovCisgICAgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwKKyAgICAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAKK307CisKICNkZWZpbmUgSEVWQ19CSV9STkRfQ0xJUDIoaW4wLCBpbjEsIHZlYzAsIHZlYzEsIHJuZF92YWwsIG91dDAsIG91dDEpICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIEFERFNfU0gyX1NIKHZlYzAsIGluMCwgdmVjMSwgaW4xLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM3LDYgKzQzLDIxIEBACiAgICAgSEVWQ19CSV9STkRfQ0xJUDIoaW4yLCBpbjMsIHZlYzIsIHZlYzMsIHJuZF92YWwsIG91dDIsIG91dDMpOyAgXAogfQogCisjZGVmaW5lIEhFVkNfQklfUk5EX0NMSVAyX01BWF9TQVRVKGluMCwgaW4xLCB2ZWMwLCB2ZWMxLCBybmRfdmFsLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxKSAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQUREU19TSDJfU0godmVjMCwgaW4wLCB2ZWMxLCBpbjEsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgXAorICAgIFNSQVJJX0gyX1NIKG91dDAsIG91dDEsIHJuZF92YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQX1NIMl8wXzI1NV9NQVhfU0FUVShvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgSEVWQ19CSV9STkRfQ0xJUDRfTUFYX1NBVFUoaW4wLCBpbjEsIGluMiwgaW4zLCB2ZWMwLCB2ZWMxLCB2ZWMyLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzMsICBybmRfdmFsLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIRVZDX0JJX1JORF9DTElQMl9NQVhfU0FUVShpbjAsIGluMSwgdmVjMCwgdmVjMSwgcm5kX3ZhbCwgb3V0MCwgb3V0MSk7ICBcCisgICAgSEVWQ19CSV9STkRfQ0xJUDJfTUFYX1NBVFUoaW4yLCBpbjMsIHZlYzIsIHZlYzMsIHJuZF92YWwsIG91dDIsIG91dDMpOyAgXAorfQorCiBzdGF0aWMgdm9pZCBoZXZjX2JpX2NvcHlfNHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzFfcHRyLApAQCAtNDUsNzEgKzY2LDU5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CisgICAgdWludDMyX3QgbG9vcF9jbnQsIHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB1aW50NjRfdCB0cGQwLCB0cGQxLCB0cGQyLCB0cGQzOworICAgIHYxNmk4IHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9OwogICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2OGkxNiBpbjAgPSB7IDAgfSwgaW4xID0geyAwIH0sIGluMiA9IHsgMCB9LCBpbjMgPSB7IDAgfTsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogCiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIHYxNmk4IHNyYzAsIHNyYzE7Ci0gICAgICAgIHY4aTE2IGRzdDAsIGluMCwgaW4xOwotCi0gICAgICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIExEX1NIMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xKTsKLQotICAgICAgICBzcmMwID0gKHYxNmk4KSBfX21zYV9pbHZyX3coKHY0aTMyKSBzcmMxLCAodjRpMzIpIHNyYzApOwotICAgICAgICBpbjAgPSAodjhpMTYpIF9fbXNhX2lsdnJfZCgodjJpNjQpIGluMSwgKHYyaTY0KSBpbjApOworICAgICAgICBMVzIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX1cyX1NCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgTEQyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHBkMCwgdHBkMSk7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cGQwLCB0cGQxLCBpbjApOwogCiAgICAgICAgIGRzdDAgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih6ZXJvLCBzcmMwKTsKICAgICAgICAgZHN0MCA8PD0gNjsKICAgICAgICAgZHN0MCArPSBpbjA7CiAgICAgICAgIGRzdDAgPSBfX21zYV9zcmFyaV9oKGRzdDAsIDcpOwotICAgICAgICBkc3QwID0gQ0xJUF9TSF8wXzI1NShkc3QwKTsKKyAgICAgICAgZHN0MCA9IENMSVBfU0hfMF8yNTVfTUFYX1NBVFUoZHN0MCk7CiAKICAgICAgICAgZHN0MCA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDAsICh2MTZpOCkgZHN0MCk7CiAgICAgICAgIFNUNHgyX1VCKGRzdDAsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewotICAgICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgICAgICB2OGkxNiBkc3QwLCBkc3QxOwotICAgICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7Ci0KLSAgICAgICAgTERfU0I0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgTERfU0g0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKLSAgICAgICAgSUxWUl9XMl9TQihzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgSUxWUl9EMl9TSChpbjEsIGluMCwgaW4zLCBpbjIsIGluMCwgaW4xKTsKLSAgICAgICAgSUxWUl9CMl9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCBkc3QwLCBkc3QxKTsKLQotICAgICAgICBkc3QwIDw8PSA2OwotICAgICAgICBkc3QxIDw8PSA2OwotICAgICAgICBIRVZDX0JJX1JORF9DTElQMihpbjAsIGluMSwgZHN0MCwgZHN0MSwgNywgZHN0MCwgZHN0MSk7Ci0KKyAgICAgICAgTFc0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfVzRfU0IodHAwLCB0cDEsIHRwMiwgdHAzLCBzcmMwKTsKKyAgICAgICAgTEQ0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHBkMCwgdHBkMSwgdHBkMiwgdHBkMyk7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cGQwLCB0cGQxLCBpbjApOworICAgICAgICBJTlNFUlRfRDJfU0godHBkMiwgdHBkMywgaW4xKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIFNMTElfMlYoZHN0MCwgZHN0MSwgNik7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVAyX01BWF9TQVRVKGluMCwgaW4xLCBkc3QwLCBkc3QxLCA3LCBkc3QwLCBkc3QxKTsKICAgICAgICAgZHN0MCA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDEsICh2MTZpOCkgZHN0MCk7CiAgICAgICAgIFNUNHg0X1VCKGRzdDAsIGRzdDAsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDgpIHsKLSAgICAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7Ci0gICAgICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwotCiAgICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDMpOyBsb29wX2NudC0tOykgewotICAgICAgICAgICAgTERfU0I4KHNyYzBfcHRyLCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICAgICAgc3JjMF9wdHIgKz0gKDggKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgTERfU0g4KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7Ci0gICAgICAgICAgICBzcmMxX3B0ciArPSAoOCAqIHNyYzJfc3RyaWRlKTsKLQotICAgICAgICAgICAgSUxWUl9EMl9TSChpbjEsIGluMCwgaW4zLCBpbjIsIGluMCwgaW4xKTsKLSAgICAgICAgICAgIElMVlJfRDJfU0goaW41LCBpbjQsIGluNywgaW42LCBpbjIsIGluMyk7Ci0KLSAgICAgICAgICAgIElMVlJfVzRfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjNSwgc3JjNCwgc3JjNywgc3JjNiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCisgICAgICAgICAgICBMVzQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgICAgICBzcmMwX3B0ciArPSA0ICogc3JjX3N0cmlkZTsKKyAgICAgICAgICAgIElOU0VSVF9XNF9TQih0cDAsIHRwMSwgdHAyLCB0cDMsIHNyYzApOworICAgICAgICAgICAgTFc0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICAgICAgc3JjMF9wdHIgKz0gNCAqIHNyY19zdHJpZGU7CisgICAgICAgICAgICBJTlNFUlRfVzRfU0IodHAwLCB0cDEsIHRwMiwgdHAzLCBzcmMxKTsKKyAgICAgICAgICAgIExENChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwZDAsIHRwZDEsIHRwZDIsIHRwZDMpOworICAgICAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CisgICAgICAgICAgICBJTlNFUlRfRDJfU0godHBkMCwgdHBkMSwgaW4wKTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9TSCh0cGQyLCB0cGQzLCBpbjEpOworICAgICAgICAgICAgTEQ0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHBkMCwgdHBkMSwgdHBkMiwgdHBkMyk7CisgICAgICAgICAgICBzcmMxX3B0ciArPSAoNCAqIHNyYzJfc3RyaWRlKTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9TSCh0cGQwLCB0cGQxLCBpbjIpOworICAgICAgICAgICAgSU5TRVJUX0QyX1NIKHRwZDIsIHRwZDMsIGluMyk7CisgICAgICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOwogICAgICAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKLSAgICAgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLQorICAgICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDRfTUFYX1NBVFUoaW4wLCBpbjEsIGluMiwgaW4zLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MywgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAgICAgICAgICAgICBQQ0tFVl9CMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKICAgICAgICAgICAgIFNUNHg4X1VCKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKQEAgLTEyNiwzNiArMTM1LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwogICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHYxNmk4IHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9LCBzcmMyID0geyAwIH0sIHNyYzMgPSB7IDAgfTsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogCiAgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMyk7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCOChzcmMwX3B0ciwgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICBzcmMwX3B0ciArPSAoOCAqIHNyY19zdHJpZGUpOworICAgICAgICBMRDQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIHNyYzBfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIElOU0VSVF9EMl9TQih0cDAsIHRwMSwgc3JjMCk7CisgICAgICAgIElOU0VSVF9EMl9TQih0cDIsIHRwMywgc3JjMSk7CisgICAgICAgIExENChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMyKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMiwgdHAzLCBzcmMzKTsKICAgICAgICAgTERfU0g4KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcpOwogICAgICAgICBzcmMxX3B0ciArPSAoOCAqIHNyYzJfc3RyaWRlKTsKLSAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzQsIHplcm8sIHNyYzUsIHplcm8sIHNyYzYsIHplcm8sIHNyYzcsCi0gICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7Ci0KKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMywgZHN0NiwgZHN0Nyk7CiAgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CiAgICAgICAgIFNMTElfNFYoZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgNik7Ci0gICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgUENLRVZfQjJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7Ci0gICAgICAgIFNUNng0X1VCKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluMCwgaW4xLCBpbjIsIGluMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluNCwgaW41LCBpbjYsIGluNywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1Q2eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW40LCBpbjUsIGluNiwgaW43LAotICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA3LCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3KTsKLQotICAgICAgICBQQ0tFVl9CMl9TSChkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBkc3Q0LCBkc3Q1KTsKLSAgICAgICAgU1Q2eDRfVUIoZHN0NCwgZHN0NSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q2eDRfVUIob3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQpAQCAtMTY4LDEwMCArMTgwLDgzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggc3JjMCA9IHsgMCB9LCBzcmMxID0geyAwIH0sIHNyYzIgPSB7IDAgfSwgc3JjMyA9IHsgMCB9OwogICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogCiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIHYxNmk4IHNyYzAsIHNyYzE7Ci0gICAgICAgIHY4aTE2IGluMCwgaW4xOwotICAgICAgICB2OGkxNiBkc3QwLCBkc3QxOwotCi0gICAgICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7CisgICAgICAgIExEMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgdHAwLCB0cDEpOworICAgICAgICBJTlNFUlRfRDJfU0IodHAwLCB0cDEsIHNyYzApOwogICAgICAgICBMRF9TSDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7Ci0gICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgZHN0MCwgZHN0MSk7Ci0KLSAgICAgICAgZHN0MCA8PD0gNjsKLSAgICAgICAgZHN0MSA8PD0gNjsKLSAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDIoaW4wLCBpbjEsIGRzdDAsIGRzdDEsIDcsIGRzdDAsIGRzdDEpOwotCi0gICAgICAgIGRzdDAgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxLCAodjE2aTgpIGRzdDApOwotICAgICAgICBTVDh4Ml9VQihkc3QwLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgU0xMSV8yVihkc3QwLCBkc3QxLCA2KTsKKyAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDJfTUFYX1NBVFUoaW4wLCBpbjEsIGRzdDAsIGRzdDEsIDcsIGRzdDAsIGRzdDEpOworICAgICAgICBvdXQwID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MSwgKHYxNmk4KSBkc3QwKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0MCwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKLSAgICAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLQotICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBMRDQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9EMl9TQih0cDAsIHRwMSwgc3JjMCk7CisgICAgICAgIElOU0VSVF9EMl9TQih0cDIsIHRwMywgc3JjMSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKICAgICAgICAgTERfU0g0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKLSAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCiAgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7Ci0gICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgUENLRVZfQjJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7Ci0gICAgICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluMCwgaW4xLCBpbjIsIGluMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIH0gZWxzZSBpZiAoNiA9PSBoZWlnaHQpIHsKLSAgICAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKLSAgICAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNTsKLSAgICAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLQotICAgICAgICBMRF9TQjYoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUpOworICAgICAgICBMRDQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIHNyYzBfcHRyICs9IDQgKiBzcmNfc3RyaWRlOworICAgICAgICBJTlNFUlRfRDJfU0IodHAwLCB0cDEsIHNyYzApOworICAgICAgICBJTlNFUlRfRDJfU0IodHAyLCB0cDMsIHNyYzEpOworICAgICAgICBMRDIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMyKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCBkc3Q0LCBkc3Q1KTsKICAgICAgICAgTERfU0g2KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSk7Ci0gICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKLSAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgSUxWUl9CMl9TSCh6ZXJvLCBzcmM0LCB6ZXJvLCBzcmM1LCBkc3Q0LCBkc3Q1KTsKLQogICAgICAgICBTTExJXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOwotICAgICAgICBkc3Q0IDw8PSA2OwotICAgICAgICBkc3Q1IDw8PSA2OwotICAgICAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBIRVZDX0JJX1JORF9DTElQMihpbjQsIGluNSwgZHN0NCwgZHN0NSwgNywgZHN0NCwgZHN0NSk7Ci0KLSAgICAgICAgUENLRVZfQjJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7Ci0gICAgICAgIGRzdDIgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3Q1LCAodjE2aTgpIGRzdDQpOwotICAgICAgICBTVDh4NF9VQihkc3QwLCBkc3QxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTTExJXzJWKGRzdDQsIGRzdDUsIDYpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQNF9NQVhfU0FUVShpbjAsIGluMSwgaW4yLCBpbjMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQMl9NQVhfU0FUVShpbjQsIGluNSwgZHN0NCwgZHN0NSwgNywgZHN0NCwgZHN0NSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgU1Q4eDJfVUIoZHN0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgOCkgewotICAgICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7Ci0gICAgICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CiAgICAgICAgIHVpbnQzMl90IGxvb3BfY250OwogCiAgICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDMpOyBsb29wX2NudC0tOykgewotICAgICAgICAgICAgTERfU0I0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIHNyYzBfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOwotICAgICAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7Ci0gICAgICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCisgICAgICAgICAgICBMRDQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgICAgICBzcmMwX3B0ciArPSA0ICogc3JjX3N0cmlkZTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9TQih0cDAsIHRwMSwgc3JjMCk7CisgICAgICAgICAgICBJTlNFUlRfRDJfU0IodHAyLCB0cDMsIHNyYzEpOworICAgICAgICAgICAgTEQ0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICAgICAgc3JjMF9wdHIgKz0gNCAqIHNyY19zdHJpZGU7CisgICAgICAgICAgICBJTlNFUlRfRDJfU0IodHAwLCB0cDEsIHNyYzIpOworICAgICAgICAgICAgSU5TRVJUX0QyX1NCKHRwMiwgdHAzLCBzcmMzKTsKKyAgICAgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMSwgZHN0MiwgZHN0Myk7CisgICAgICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzMsIGRzdDYsIGRzdDcpOworICAgICAgICAgICAgTERfU0g4KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LAorICAgICAgICAgICAgICAgICAgIGluNyk7CisgICAgICAgICAgICBzcmMxX3B0ciArPSAoOCAqIHNyYzJfc3RyaWRlKTsKICAgICAgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7Ci0gICAgICAgICAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgICAgIFBDS0VWX0IyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDEpOwotICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgc3JjMF9wdHIgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIExEX1NINChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7Ci0gICAgICAgICAgICBzcmMxX3B0ciArPSAoNCAqIHNyYzJfc3RyaWRlKTsKLSAgICAgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7Ci0gICAgICAgICAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgICAgIFBDS0VWX0IyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDEpOwotICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MCwgZHN0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgU0xMSV80Vihkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA2KTsKKyAgICAgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluMCwgaW4xLCBpbjIsIGluMywgZHN0MCwgZHN0MSwgZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDMsIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDRfTUFYX1NBVFUoaW40LCBpbjUsIGluNiwgaW43LCBkc3Q0LCBkc3Q1LCBkc3Q2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NywgNywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFBDS0VWX0IyX1VCKGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsIG91dDIsIG91dDMpOworICAgICAgICAgICAgU1Q4eDhfVUIob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjc1LDEyICsyNzAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICB2MTZpOCB6ZXJvID0geyAwIH07CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKDE2ID4+IDIpOyBsb29wX2NudC0tOykgeworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOwogCkBAIC0yODgsODggKzI4NCwyMSBAQAogICAgICAgICBMRF9TSDQoc3JjMV9wdHIgKyA4LCBzcmMyX3N0cmlkZSwgaW40LCBpbjUsIGluNiwgaW43KTsKICAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CiAgICAgICAgIElMVlJfRDJfU0goaW41LCBpbjQsIGluNywgaW42LCBpbjQsIGluNSk7Ci0gICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKLSAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLQorICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CiAgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CiAgICAgICAgIElMVkxfVzJfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjMCwgc3JjMSk7CiAgICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgZHN0NCwgZHN0NSk7Ci0gICAgICAgIGRzdDQgPDw9IDY7Ci0gICAgICAgIGRzdDUgPDw9IDY7Ci0gICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIEhFVkNfQklfUk5EX0NMSVAyKGluNCwgaW41LCBkc3Q0LCBkc3Q1LCA3LCBkc3Q0LCBkc3Q1KTsKLQotICAgICAgICBQQ0tFVl9CMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKLSAgICAgICAgZHN0MiA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDUsICh2MTZpOCkgZHN0NCk7Ci0gICAgICAgIFNUMTJ4NF9VQihkc3QwLCBkc3QxLCBkc3QyLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTTExJXzJWKGRzdDQsIGRzdDUsIDYpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQNF9NQVhfU0FUVShpbjAsIGluMSwgaW4yLCBpbjMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQMl9NQVhfU0FUVShpbjQsIGluNSwgZHN0NCwgZHN0NSwgNywgZHN0NCwgZHN0NSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBTVDEyeDRfVUIob3V0MCwgb3V0MSwgb3V0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBoZXZjX2JpX2NvcHlfMTZtdWx0eDRtdWx0X21zYSh1aW50OF90ICpzcmMwX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzFfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCkKLXsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB1aW50MzJfdCBjbnQ7Ci0gICAgdWludDhfdCAqc3JjMF9wdHJfdG1wOwotICAgIGludDE2X3QgKnNyYzFfcHRyX3RtcDsKLSAgICB1aW50OF90ICpkc3RfdG1wOwotICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKLQotICAgIGZvciAoY250ID0gKHdpZHRoID4+IDQpOyBjbnQtLTspIHsKLSAgICAgICAgc3JjMF9wdHJfdG1wID0gc3JjMF9wdHI7Ci0gICAgICAgIHNyYzFfcHRyX3RtcCA9IHNyYzFfcHRyOwotICAgICAgICBkc3RfdG1wID0gZHN0OwotCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICAgICAgICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwotICAgICAgICAgICAgdjhpMTYgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yOwotICAgICAgICAgICAgdjhpMTYgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotCi0gICAgICAgICAgICBMRF9TQjQoc3JjMF9wdHJfdG1wLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIHNyYzBfcHRyX3RtcCArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgTERfU0g0KHNyYzFfcHRyX3RtcCwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7Ci0gICAgICAgICAgICBMRF9TSDQoc3JjMV9wdHJfdG1wICsgOCwgc3JjMl9zdHJpZGUsIGluNCwgaW41LCBpbjYsIGluNyk7Ci0gICAgICAgICAgICBzcmMxX3B0cl90bXAgKz0gKDQgKiBzcmMyX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yKTsKLSAgICAgICAgICAgIElMVkxfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICAgICAgU0xMSV80Vihkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIDYpOwotICAgICAgICAgICAgU0xMSV80Vihkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIDYpOwotICAgICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluNCwgaW41LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sLCA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sKTsKLQotICAgICAgICAgICAgUENLRVZfQjJfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgICAgICBTVF9TSDIoZHN0MF9yLCBkc3QxX3IsIGRzdF90bXAsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0X3RtcCArPSAoMiAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgICAgICBIRVZDX0JJX1JORF9DTElQNChpbjIsIGluMywgaW42LCBpbjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyX3IsIGRzdDNfciwgZHN0Ml9sLCBkc3QzX2wsIDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyX3IsIGRzdDNfciwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgICAgICBQQ0tFVl9CMl9TSChkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDJfciwgZHN0M19yKTsKLSAgICAgICAgICAgIFNUX1NIMihkc3QyX3IsIGRzdDNfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmMwX3B0ciArPSAxNjsKLSAgICAgICAgc3JjMV9wdHIgKz0gMTY7Ci0gICAgICAgIGRzdCArPSAxNjsKLSAgICB9Ci19Ci0KIHN0YXRpYyB2b2lkIGhldmNfYmlfY29weV8xNndfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMV9wdHIsCkBAIC0zNzgsOCArMzA3LDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2JpX2NvcHlfMTZtdWx0eDRtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LCAxNik7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOworICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OworICAgIHY4aTE2IGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOworICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgICAgICBMRF9TSDQoc3JjMV9wdHIgKyA4LCBzcmMyX3N0cmlkZSwgaW40LCBpbjUsIGluNiwgaW43KTsKKyAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDBfciwgZHN0MF9sKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMSwgZHN0MV9yLCBkc3QxX2wpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCBkc3QyX3IsIGRzdDJfbCk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzMsIGRzdDNfciwgZHN0M19sKTsKKyAgICAgICAgU0xMSV80Vihkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIDYpOworICAgICAgICBTTExJXzRWKGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgNik7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluMCwgaW4xLCBpbjQsIGluNSwgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MV9sLCA3LCBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQNF9NQVhfU0FUVShpbjIsIGluMywgaW42LCBpbjcsIGRzdDJfciwgZHN0M19yLCBkc3QyX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDNfbCwgNywgZHN0Ml9yLCBkc3QzX3IsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1RfVUI0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19iaV9jb3B5XzI0d19tc2EodWludDhfdCAqc3JjMF9wdHIsCkBAIC0zOTAsMTEgKzM0NSw0MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19iaV9jb3B5XzE2bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwgMTYpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgemVybyA9IHsgMCB9OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdDgsIGRzdDksIGRzdDEwOworICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCBpbjgsIGluOSwgaW4xMCwgaW4xMSwgZHN0MTE7CiAKLSAgICBoZXZjX2JpX2NvcHlfOHdfbXNhKHNyYzBfcHRyICsgMTYsIHNyY19zdHJpZGUsIHNyYzFfcHRyICsgMTYsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgMTYsIGRzdF9zdHJpZGUsIGhlaWdodCk7CisgICAgZm9yIChsb29wX2NudCA9IDg7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjNCwgc3JjNSk7CisgICAgICAgIExEX1NCNChzcmMwX3B0ciArIDE2LCBzcmNfc3RyaWRlLCBzcmMyLCBzcmMzLCBzcmM2LCBzcmM3KTsKKyAgICAgICAgc3JjMF9wdHIgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgTERfU0g0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgICAgICAgTERfU0g0KHNyYzFfcHRyICsgOCwgc3JjMl9zdHJpZGUsIGluNCwgaW41LCBpbjYsIGluNyk7CisgICAgICAgIExEX1NINChzcmMxX3B0ciArIDE2LCBzcmMyX3N0cmlkZSwgaW44LCBpbjksIGluMTAsIGluMTEpOworICAgICAgICBzcmMxX3B0ciArPSAoNCAqIHNyYzJfc3RyaWRlKTsKKworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMSwgZHN0MiwgZHN0Myk7CisgICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMiwgemVybywgc3JjMywgZHN0NCwgZHN0NSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzQsIGRzdDYsIGRzdDcpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmM1LCBkc3Q4LCBkc3Q5KTsKKyAgICAgICAgSUxWUl9CMl9TSCh6ZXJvLCBzcmM2LCB6ZXJvLCBzcmM3LCBkc3QxMCwgZHN0MTEpOworICAgICAgICBTTExJXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOworICAgICAgICBTTExJXzRWKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIDYpOworICAgICAgICBTTExJXzRWKGRzdDgsIGRzdDksIGRzdDEwLCBkc3QxMSwgNik7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluMCwgaW40LCBpbjEsIGluNSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluOCwgaW45LCBpbjIsIGluNiwgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluMywgaW43LCBpbjEwLCBpbjExLCBkc3Q4LCBkc3Q5LCBkc3QxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MTEsIDcsIGRzdDgsIGRzdDksIGRzdDEwLCBkc3QxMSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBQQ0tFVl9CM19VQihkc3Q3LCBkc3Q2LCBkc3Q5LCBkc3Q4LCBkc3QxMSwgZHN0MTAsIG91dDMsIG91dDQsIG91dDUpOworICAgICAgICBTVF9VQjQob3V0MCwgb3V0MSwgb3V0Mywgb3V0NCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q4eDRfVUIob3V0Miwgb3V0NSwgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfYmlfY29weV8zMndfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNDA1LDggKzM5MSw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19iaV9jb3B5XzE2bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwgMzIpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKKyAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjIoc3JjMF9wdHIsIDE2LCBzcmMwLCBzcmMxKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfU0IyKHNyYzBfcHRyLCAxNiwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYzBfcHRyICs9IHNyY19zdHJpZGU7CisgICAgICAgIExEX1NINChzcmMxX3B0ciwgOCwgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisgICAgICAgIExEX1NINChzcmMxX3B0ciwgOCwgaW40LCBpbjUsIGluNiwgaW43KTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMywgZHN0NiwgZHN0Nyk7CisgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFNMTElfNFYoZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgNik7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluMCwgaW4xLCBpbjIsIGluMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0X01BWF9TQVRVKGluNCwgaW41LCBpbjYsIGluNywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1RfVUIyKG91dDAsIG91dDEsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU1RfVUIyKG91dDIsIG91dDMsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfYmlfY29weV80OHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNDE3LDggKzQzNSw1MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19iaV9jb3B5XzE2bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwgNDgpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKKyAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0OCwgZHN0OSwgZHN0MTA7CisgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIGluOCwgaW45LCBpbjEwLCBpbjExLCBkc3QxMTsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjMoc3JjMF9wdHIsIDE2LCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfU0IzKHNyYzBfcHRyLCAxNiwgc3JjMywgc3JjNCwgc3JjNSk7CisgICAgICAgIHNyYzBfcHRyICs9IHNyY19zdHJpZGU7CisKKyAgICAgICAgTERfU0g2KHNyYzFfcHRyLCA4LCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41KTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisgICAgICAgIExEX1NINihzcmMxX3B0ciwgOCwgaW42LCBpbjcsIGluOCwgaW45LCBpbjEwLCBpbjExKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMywgZHN0NiwgZHN0Nyk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzQsIGRzdDgsIGRzdDkpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmM1LCBkc3QxMCwgZHN0MTEpOworCisgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFNMTElfNFYoZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgNik7CisgICAgICAgIFNMTElfNFYoZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExLCA2KTsKKworICAgICAgICBIRVZDX0JJX1JORF9DTElQNF9NQVhfU0FUVShpbjAsIGluMSwgaW4yLCBpbjMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQNF9NQVhfU0FUVShpbjQsIGluNSwgaW42LCBpbjcsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQNF9NQVhfU0FUVShpbjgsIGluOSwgaW4xMCwgaW4xMSwgZHN0OCwgZHN0OSwgZHN0MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDExLCA3LCBkc3Q4LCBkc3Q5LCBkc3QxMCwgZHN0MTEpOworICAgICAgICBQQ0tFVl9CM19VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBvdXQwLCBvdXQxLCBvdXQyKTsKKyAgICAgICAgUENLRVZfQjNfVUIoZHN0NywgZHN0NiwgZHN0OSwgZHN0OCwgZHN0MTEsIGRzdDEwLCBvdXQzLCBvdXQ0LCBvdXQ1KTsKKyAgICAgICAgU1RfVUIyKG91dDAsIG91dDEsIGRzdCwgMTYpOworICAgICAgICBTVF9VQihvdXQyLCBkc3QgKyAzMik7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTVF9VQjIob3V0Mywgb3V0NCwgZHN0LCAxNik7CisgICAgICAgIFNUX1VCKG91dDUsIGRzdCArIDMyKTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2JpX2NvcHlfNjR3X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTQyOSw4ICs0ODksMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfYmlfY29weV8xNm11bHR4NG11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQsIDY0KTsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjE2aTggemVybyA9IHsgMCB9OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CisKKyAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIDE2LCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfU0g4KHNyYzFfcHRyLCA4LCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7CisgICAgICAgIHNyYzFfcHRyICs9IHNyYzJfc3RyaWRlOworCisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMiwgZHN0NCwgZHN0NSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzMsIGRzdDYsIGRzdDcpOworICAgICAgICBTTExJXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOworICAgICAgICBTTExJXzRWKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIDYpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQNF9NQVhfU0FUVShpbjAsIGluMSwgaW4yLCBpbjMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBIRVZDX0JJX1JORF9DTElQNF9NQVhfU0FUVShpbjQsIGluNSwgaW42LCBpbjcsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0NSwgZHN0NCwgZHN0NywgZHN0Niwgb3V0Miwgb3V0Myk7CisKKyAgICAgICAgU1RfVUI0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHpfYmlfOHRfNHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNDUwLDcgKzUzNyw3IEBACiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMTZdKTsKIAogICAgIHNyYzBfcHRyIC09IDM7CiAKQEAgLTQ3NiwyNiArNTYzLDI2IEBACiAgICAgICAgIElMVlJfRDJfU0goaW41LCBpbjQsIGluNywgaW42LCBpbjIsIGluMyk7CiAgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwogCi0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDAsIGRzdDAsIGRzdDApOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmM0LCBzcmM1LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjNiwgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDMsIGRzdDMsIGRzdDMsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2szLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgbWFzazMsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGZpbHQzLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CiAKICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKQEAgLTUyMyw3ICs2MTAsNyBAQAogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogCiAgICAgc3JjMF9wdHIgLT0gMzsKIApAQCAtNTQ0LDI2ICs2MzEsMjYgQEAKICAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogCi0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDAsIGRzdDAsIGRzdDApOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDMsIGRzdDMsIGRzdDMsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2szLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazMsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGZpbHQzLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CiAKICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKQEAgLTU4MywxMCArNjcwLDgzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19oel9iaV84dF84d19tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgaGVpZ2h0KTsKLSAgICBoZXZjX2h6X2JpXzh0XzR3X21zYShzcmMwX3B0ciArIDgsIHNyY19zdHJpZGUsIHNyYzFfcHRyICsgOCwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgOCwgZHN0X3N0cmlkZSwgZmlsdGVyLCBoZWlnaHQpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIGludDMyX3QgdG1wMCwgdG1wMTsKKyAgICBpbnQ2NF90IHRtcDIsIHRtcDM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyOworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyOworICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisKKyAgICBzcmMwX3B0ciAtPSAzOworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjIDw8PSA2OworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CisgICAgU1BMQVRJX0g0X1NIKGZpbHRlcl92ZWMsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKworICAgIG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CisgICAgbWFzazEgPSBtYXNrMCArIDI7CisgICAgbWFzazIgPSBtYXNrMCArIDQ7CisgICAgbWFzazMgPSBtYXNrMCArIDY7CisgICAgbWFzazQgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclsxNl0pOworICAgIG1hc2s1ID0gbWFzazQgKyAyOworICAgIG1hc2s2ID0gbWFzazQgKyA0OworICAgIG1hc2s3ID0gbWFzazQgKyA2OworCisgICAgZm9yIChsb29wX2NudCA9IDg7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCMihzcmMwX3B0ciwgOCwgc3JjMCwgc3JjMSk7CisgICAgICAgIHNyYzBfcHRyICs9IHNyY19zdHJpZGU7CisgICAgICAgIExEX1NCMihzcmMwX3B0ciwgOCwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYzBfcHRyICs9IHNyY19zdHJpZGU7CisgICAgICAgIExEX1NIMihzcmMxX3B0ciwgOCwgaW4wLCBpbjEpOworICAgICAgICBzcmMxX3B0ciArPSBzcmMyX3N0cmlkZTsKKyAgICAgICAgTERfU0gyKHNyYzFfcHRyLCA4LCBpbjIsIGluMyk7CisgICAgICAgIHNyYzFfcHRyICs9IHNyYzJfc3RyaWRlOworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKworICAgICAgICBkc3QwID0gY29uc3RfdmVjOworICAgICAgICBkc3QxID0gY29uc3RfdmVjOworICAgICAgICBkc3QyID0gY29uc3RfdmVjOworCisgICAgICAgIFZTSEZfQjNfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMywgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2s0LCBtYXNrMCwKKyAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MCwgZHN0MCwgZHN0MSk7CisgICAgICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX2goZHN0MiwgdmVjMiwgKHYxNmk4KSBmaWx0MCk7CisgICAgICAgIFZTSEZfQjNfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMywgc3JjMiwgc3JjMiwgbWFzazEsIG1hc2s1LCBtYXNrMSwKKyAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQxLCBmaWx0MSwgZHN0MCwgZHN0MSk7CisgICAgICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX2goZHN0MiwgdmVjMiwgKHYxNmk4KSBmaWx0MSk7CisgICAgICAgIFZTSEZfQjNfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMywgc3JjMiwgc3JjMiwgbWFzazIsIG1hc2s2LCBtYXNrMiwKKyAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQyLCBmaWx0MiwgZHN0MCwgZHN0MSk7CisgICAgICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX2goZHN0MiwgdmVjMiwgKHYxNmk4KSBmaWx0Mik7CisgICAgICAgIFZTSEZfQjNfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMywgc3JjMiwgc3JjMiwgbWFzazMsIG1hc2s3LCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQzLCBmaWx0MywgZHN0MCwgZHN0MSk7CisgICAgICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX2goZHN0MiwgdmVjMiwgKHYxNmk4KSBmaWx0Myk7CisKKyAgICAgICAgaW4xID0gKHY4aTE2KSBfX21zYV9wY2tldl9kKCh2Mmk2NCkgaW4zLCAodjJpNjQpIGluMSk7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVAyKGluMCwgaW4xLCBkc3QwLCBkc3QxLCA3LCBkc3QwLCBkc3QxKTsKKyAgICAgICAgZHN0MiA9IF9fbXNhX2FkZHNfc19oKGluMiwgZHN0Mik7CisgICAgICAgIGRzdDIgPSBfX21zYV9zcmFyaV9oKGRzdDIsIDcpOworICAgICAgICBkc3QyID0gQ0xJUF9TSF8wXzI1NShkc3QyKTsKKyAgICAgICAgUENLRVZfQjJfU0goZHN0MSwgZHN0MCwgZHN0MiwgZHN0MiwgZHN0MCwgZHN0MSk7CisKKyAgICAgICAgdG1wMiA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCkgZHN0MCwgMCk7CisgICAgICAgIHRtcDAgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpIGRzdDAsIDIpOworICAgICAgICB0bXAzID0gX19tc2FfY29weV9zX2QoKHYyaTY0KSBkc3QxLCAwKTsKKyAgICAgICAgdG1wMSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMikgZHN0MCwgMyk7CisgICAgICAgIFNEKHRtcDIsIGRzdCk7CisgICAgICAgIFNXKHRtcDAsIGRzdCArIDgpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU0QodG1wMywgZHN0KTsKKyAgICAgICAgU1codG1wMSwgZHN0ICsgOCk7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19oel9iaV84dF8xNndfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNjA2LDcgKzc2Niw3IEBACiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAKICAgICBzcmMwX3B0ciAtPSAzOwogICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CkBAIC02MzAsMjYgKzc5MCwyNiBAQAogICAgICAgICBzcmMxX3B0ciArPSBzcmMyX3N0cmlkZTsKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAKLSAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QyLCBkc3QyLCBkc3QyKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazMsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMywgbWFzazMsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKIAogICAgICAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwpAQCAtNjc4LDcgKzgzOCw3IEBACiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MjsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogCiAgICAgc3JjMF9wdHIgPSBzcmMwX3B0ciAtIDM7CiAgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKQEAgLTcwMywyMSArODYzLDIxIEBACiAgICAgICAgIHNyYzFfcHRyICs9IHNyYzJfc3RyaWRlOwogICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMwLCBzcmMxKTsKIAotICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMxLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrNCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQxLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0MCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazUsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazYsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MiwgZmlsdDIsIGRzdDEsCisgICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMwLCBzcmMwLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2s3LCBtYXNrMywgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MiwgZmlsdDMsIGZpbHQzLCBmaWx0MywgZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIpOwogCiAgICAgICAgIEhFVkNfQklfUk5EX0NMSVAyKGluMCwgaW4xLCBkc3QwLCBkc3QxLCA3LCBkc3QwLCBkc3QxKTsKICAgICAgICAgZHN0MiA9IF9fbXNhX2FkZHNfc19oKGRzdDIsIGluMik7CkBAIC03NDksNyArOTA5LDcgQEAKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKIAogICAgIHNyYzBfcHRyIC09IDM7CiAgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKQEAgLTc3NCwyNiArOTM0LDI2IEBACiAgICAgICAgIHNyYzFfcHRyICs9IHNyYzJfc3RyaWRlOwogICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKIAotICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMxLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QzLCBkc3QzLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMCwgbWFzazQsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMCwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2sxLCBtYXNrNSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazEsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2s2LCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMyLCBzcmMyLCBtYXNrMiwgbWFzazIsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMywgbWFzazcsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzIsIHNyYzIsIG1hc2szLCBtYXNrMywgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MywgZmlsdDMsIGZpbHQzLCBmaWx0MywgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOwogCiAgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CkBAIC04MjIsNyArOTgyLDcgQEAKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjU7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAKICAgICBzcmMwX3B0ciAtPSAzOwogCkBAIC04NDAsNjIgKzEwMDAsNTMgQEAKICAgICBtYXNrNiA9IG1hc2swICsgMTI7CiAgICAgbWFzazcgPSBtYXNrMCArIDE0OwogCi0gICAgZm9yIChsb29wX2NudCA9IGhlaWdodDsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYzBfcHRyLCAxNiwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzAsIHNyYzEpOwotICAgICAgICBMRF9TSDIoc3JjMV9wdHIsIDgsIGluMCwgaW4xKTsKLQotICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMxLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7Ci0KLSAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDIoaW4wLCBpbjEsIGRzdDAsIGRzdDEsIDcsIGRzdDAsIGRzdDEpOwotCi0gICAgICAgIHRtcDAgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MSwgKHYxNmk4KSBkc3QwKTsKLSAgICAgICAgU1RfU0IodG1wMCwgZHN0KTsKLQotICAgICAgICBMRF9TQjIoc3JjMF9wdHIgKyAzMiwgOCwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzIsIHNyYzMpOworICAgIGZvciAobG9vcF9jbnQgPSA2NDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0IzKHNyYzBfcHRyLCAxNiwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgICAgIHNyYzMgPSBMRF9TQihzcmMwX3B0ciArIDQwKTsKICAgICAgICAgc3JjMF9wdHIgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfU0g0KHNyYzFfcHRyLCA4LCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKIAotICAgICAgICBMRF9TSDIoc3JjMV9wdHIgKyAxNiwgOCwgaW4yLCBpbjMpOwotCi0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDEgPSBjb25zdF92ZWM7CiAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzIsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QzLCBkc3QzLCBkc3QzLCBkc3QzKTsKIAorICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrNCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzazAsIG1hc2s0LCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazEsIG1hc2s1LCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMyLCBtYXNrMSwgbWFzazUsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazYsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzIsIG1hc2syLCBtYXNrNiwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2szLCBtYXNrNywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzazMsIG1hc2s3LCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGZpbHQzLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIEhFVkNfQklfUk5EX0NMSVAyKGluMCwgaW4xLCBkc3QwLCBkc3QxLCA3LCBkc3QwLCBkc3QxKTsKICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDIoaW4yLCBpbjMsIGRzdDIsIGRzdDMsIDcsIGRzdDIsIGRzdDMpOwotCi0gICAgICAgIHRtcDEgPSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MywgKHYxNmk4KSBkc3QyKTsKKyAgICAgICAgUENLRVZfQjJfU0IoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMCwgdG1wMSk7CisgICAgICAgIFNUX1NCKHRtcDAsIGRzdCk7CiAgICAgICAgIFNUX1NCKHRtcDEsIGRzdCArIDE2KTsKIAogICAgICAgICBMRF9TSDIoc3JjMV9wdHIgKyAzMiwgOCwgaW40LCBpbjUpOwogICAgICAgICBzcmMxX3B0ciArPSBzcmMyX3N0cmlkZTsKIAotICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q0LCBkc3Q0LCBkc3Q0LCBkc3Q0KTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NSwgZHN0NSwgZHN0NSwgZHN0NSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MSwgZmlsdDEsIGRzdDQsCisgICAgICAgICAgICAgICAgICAgICBkc3Q1LCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2szLCBtYXNrMywgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MiwgZmlsdDIsIGZpbHQzLCBmaWx0MywgZHN0NCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDUsIGRzdDQsIGRzdDUpOwogCiAgICAgICAgIEhFVkNfQklfUk5EX0NMSVAyKGluNCwgaW41LCBkc3Q0LCBkc3Q1LCA3LCBkc3Q0LCBkc3Q1KTsKIApAQCAtOTE0LDE0ICsxMDY1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgdWludDhfdCAqc3JjMF9wdHJfdG1wOwotICAgIHVpbnQ4X3QgKmRzdF90bXA7Ci0gICAgaW50MTZfdCAqc3JjMV9wdHJfdG1wOwogICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHVpbnQzMl90IGNudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCB0bXAwLCB0bXAxOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHRtcDAsIHRtcDE7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CkBAIC05NDUsNDggKzEwOTIsNzQgQEAKICAgICBtYXNrNyA9IG1hc2swICsgMTQ7CiAKICAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0OyBsb29wX2NudC0tOykgewotICAgICAgICBzcmMwX3B0cl90bXAgPSBzcmMwX3B0cjsKLSAgICAgICAgZHN0X3RtcCA9IGRzdDsKLSAgICAgICAgc3JjMV9wdHJfdG1wID0gc3JjMV9wdHI7CisgICAgICAgIExEX1NCMihzcmMwX3B0ciwgMTYsIHNyYzAsIHNyYzEpOworICAgICAgICBzcmMyID0gTERfU0Ioc3JjMF9wdHIgKyAyNCk7CisgICAgICAgIExEX1NCMihzcmMwX3B0ciArIDMyLCAxNiwgc3JjMywgc3JjNCk7CisgICAgICAgIHNyYzUgPSBMRF9TQihzcmMwX3B0ciArIDU2KTsKKyAgICAgICAgTERfU0g0KHNyYzFfcHRyLCA4LCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKIAotICAgICAgICBmb3IgKGNudCA9IDI7IGNudC0tOykgewotICAgICAgICAgICAgTERfU0IyKHNyYzBfcHRyX3RtcCwgMTYsIHNyYzAsIHNyYzEpOwotICAgICAgICAgICAgc3JjMiA9IExEX1NCKHNyYzBfcHRyX3RtcCArIDI0KTsKLSAgICAgICAgICAgIHNyYzBfcHRyX3RtcCArPSAzMjsKLSAgICAgICAgICAgIExEX1NINChzcmMxX3B0cl90bXAsIDgsIGluMCwgaW4xLCBpbjIsIGluMyk7Ci0gICAgICAgICAgICBzcmMxX3B0cl90bXAgKz0gMzI7Ci0gICAgICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKIAotICAgICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDAsIGRzdDAsIGRzdDApOwotICAgICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMxLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKLSAgICAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICAgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOwotICAgICAgICAgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDMsIGRzdDMsIGRzdDMsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrNCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazEsIG1hc2s1LCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMyLCBzcmMyLCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazYsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzIsIHNyYzIsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2szLCBtYXNrNywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazMsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGZpbHQzLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKIAotICAgICAgICAgICAgUENLRVZfQjJfU0IoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMCwgdG1wMSk7Ci0gICAgICAgICAgICBTVF9TQjIodG1wMCwgdG1wMSwgZHN0X3RtcCwgMTYpOwotICAgICAgICAgICAgZHN0X3RtcCArPSAzMjsKLSAgICAgICAgfQorICAgICAgICBQQ0tFVl9CMl9TQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCB0bXAwLCB0bXAxKTsKKyAgICAgICAgU1RfU0IyKHRtcDAsIHRtcDEsIGRzdCwgMTYpOwogCisgICAgICAgIHNyYzAgPSBzcmMzOworICAgICAgICBzcmMxID0gc3JjNDsKKyAgICAgICAgc3JjMiA9IHNyYzU7CisKKyAgICAgICAgTERfU0g0KHNyYzFfcHRyICsgMzIsIDgsIGluMCwgaW4xLCBpbjIsIGluMyk7CisgICAgICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworCisgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDEgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2s0LCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMSwgbWFzazUsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzIsIHNyYzIsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrNiwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazIsIG1hc2syLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazMsIG1hc2s3LCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMyLCBzcmMyLCBtYXNrMywgbWFzazMsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgUENLRVZfQjJfU0IoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMCwgdG1wMSk7CisgICAgICAgIFNUX1NCMih0bXAwLCB0bXAxLCBkc3QgKyAzMiwgMTYpOwogICAgICAgICBzcmMxX3B0ciArPSBzcmMyX3N0cmlkZTsKICAgICAgICAgc3JjMF9wdHIgKz0gc3JjX3N0cmlkZTsKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CkBAIC0xNDQ3LDMwICsxNjIwLDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwotICAgIHY4aTE2IGluMCwgaW4xOworICAgIHVpbnQ2NF90IHRwMCwgdHAxOworICAgIHYxNnU4IG91dDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2OGkxNiBpbjAgPSB7IDAgfSwgaW4xID0geyAwIH07CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMzsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CiAgICAgdjE2aTggdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNTsKLSAgICB2OGkxNiBkc3QzMCwgZHN0NDEsIGRzdDUyLCBkc3Q2MywgZHN0NjYsIGRzdDg3OwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBpbjBfciwgaW4wX2w7Ci0gICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKLSAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKLSAgICB2OHUxNiBtYXNrNCA9IHsgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyB9OworICAgIHY4aTE2IG91dDAsIG91dDE7CisgICAgdjhpMTYgZHN0MzAsIGRzdDQxLCBkc3Q1MiwgZHN0NjMsIGRzdDY2LCBkc3Q5NywgZHN0MTA4OworICAgIHY4aTE2IGRzdDEwLCBkc3QzMiwgZHN0NTQsIGRzdDc2LCBkc3Q5OCwgZHN0MjEsIGRzdDQzLCBkc3Q2NSwgZHN0ODcsIGRzdDEwOTsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKIAogICAgIHNyYzBfcHRyIC09ICgoMyAqIHNyY19zdHJpZGUpICsgMyk7CiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1c0X1NXKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgIFNQTEFUSV9XNF9TSChmaWx0ZXJfdmVjLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2syID0gbWFzazAgKyA0OwpAQCAtMTQ5MSw3MSArMTY2NCw3NyBAQAogICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSk7CiAKLSAgICBkc3QzMCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgIGRzdDMwLCBkc3QzMCwgZHN0MzAsIGRzdDMwKTsKLSAgICBkc3Q0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgIGRzdDQxLCBkc3Q0MSwgZHN0NDEsIGRzdDQxKTsKLSAgICBkc3Q1MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgZHN0NTIsIGRzdDUyLCBkc3Q1MiwgZHN0NTIpOwotICAgIGRzdDYzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCNF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgIGRzdDYzLCBkc3Q2MywgZHN0NjMsIGRzdDYzKTsKKyAgICBkc3QzMCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0NDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDUyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDYzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAKLSAgICBJTFZSX0gzX1NIKGRzdDQxLCBkc3QzMCwgZHN0NTIsIGRzdDQxLCBkc3Q2MywgZHN0NTIsCi0gICAgICAgICAgICAgICBkc3QxMF9yLCBkc3QyMV9yLCBkc3QzMl9yKTsKLSAgICBkc3Q0M19yID0gX19tc2FfaWx2bF9oKGRzdDQxLCBkc3QzMCk7Ci0gICAgZHN0NTRfciA9IF9fbXNhX2lsdmxfaChkc3Q1MiwgZHN0NDEpOwotICAgIGRzdDY1X3IgPSBfX21zYV9pbHZsX2goZHN0NjMsIGRzdDUyKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q0MSwgZHN0MzAsIGRzdDEwLCBkc3Q0Myk7CisgICAgSUxWUkxfSDJfU0goZHN0NTIsIGRzdDQxLCBkc3QyMSwgZHN0NTQpOworICAgIElMVlJMX0gyX1NIKGRzdDYzLCBkc3Q1MiwgZHN0MzIsIGRzdDY1KTsKKwogICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDYzLCAxKTsKIAotICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4KTsKLSAgICAgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgTERfU0gyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEpOworICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMjsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgICAgIHNyYzBfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4wKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gKDIgKiBzcmMyX3N0cmlkZSk7CisgICAgICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjEpOwogICAgICAgICBzcmMxX3B0ciArPSAoMiAqIHNyYzJfc3RyaWRlKTsKIAotICAgICAgICBpbjAgPSAodjhpMTYpIF9fbXNhX2lsdnJfZCgodjJpNjQpIGluMSwgKHYyaTY0KSBpbjApOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM3LCBzcmM4KTsKLQotICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzksIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3Q4NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0ODcsIGRzdDg3LCBkc3Q4NywgZHN0ODcpOwotICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDg3LCBkc3Q2Nik7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF84VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwotICAgICAgICBkc3Q4N19yID0gX19tc2FfdnNoZl9oKCh2OGkxNikgbWFzazQsIGRzdDg3LCBkc3Q4Nyk7Ci0gICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF84VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzEwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0OTcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MTA4ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCi0gICAgICAgIGRzdDBfciA+Pj0gNjsKLSAgICAgICAgZHN0MV9yID4+PSA2OwotICAgICAgICBVTlBDS19TSF9TVyhpbjAsIGluMF9yLCBpbjBfbCk7Ci0gICAgICAgIGRzdDBfciA9IF9fbXNhX2FkZHNfc193KGRzdDBfciwgaW4wX3IpOwotICAgICAgICBkc3QxX3IgPSBfX21zYV9hZGRzX3Nfdyhkc3QxX3IsIGluMF9sKTsKLSAgICAgICAgU1JBUklfVzJfU1coZHN0MF9yLCBkc3QxX3IsIDcpOwotICAgICAgICBkc3QwX3IgPSBDTElQX1NXXzBfMjU1KGRzdDBfcik7Ci0gICAgICAgIGRzdDFfciA9IENMSVBfU1dfMF8yNTUoZHN0MV9yKTsKKyAgICAgICAgZHN0NzYgPSBfX21zYV9pbHZyX2goZHN0OTcsIGRzdDY2KTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MTA4LCBkc3Q5NywgZHN0ODcsIGRzdDEwOSk7CisgICAgICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDk3LCAxKTsKKyAgICAgICAgZHN0OTggPSBfX21zYV9pbHZyX2goZHN0NjYsIGRzdDEwOCk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IyKGRzdDFfciwgZHN0MF9yLCBkc3QwX3IpOwotICAgICAgICBTVDR4Ml9VQihkc3QwX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVAoZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYsIGZpbHRfaDAsIGZpbHRfaDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQKGRzdDIxLCBkc3Q0MywgZHN0NjUsIGRzdDg3LCBmaWx0X2gwLCBmaWx0X2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUChkc3QzMiwgZHN0NTQsIGRzdDc2LCBkc3Q5OCwgZmlsdF9oMCwgZmlsdF9oMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVAoZHN0NDMsIGRzdDY1LCBkc3Q4NywgZHN0MTA5LCBmaWx0X2gwLCBmaWx0X2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMiwgZmlsdF9oMyk7CiAKLSAgICAgICAgZHN0MTBfciA9IGRzdDMyX3I7Ci0gICAgICAgIGRzdDMyX3IgPSBkc3Q1NF9yOwotICAgICAgICBkc3Q1NF9yID0gZHN0NzZfcjsKLSAgICAgICAgZHN0MjFfciA9IGRzdDQzX3I7Ci0gICAgICAgIGRzdDQzX3IgPSBkc3Q2NV9yOwotICAgICAgICBkc3Q2NV9yID0gZHN0ODdfcjsKLSAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0ODcsIDEpOworICAgICAgICBTUkFfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFBDS0VWX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBBRERTX1NIMl9TSChvdXQwLCBpbjAsIG91dDEsIGluMSwgb3V0MCwgb3V0MSk7CisgICAgICAgIEFERFNfU0gyX1NIKG91dDAsIGNvbnN0X3ZlYywgb3V0MSwgY29uc3RfdmVjLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgU1JBUklfSDJfU0gob3V0MCwgb3V0MSwgNyk7CisgICAgICAgIENMSVBfU0gyXzBfMjU1X01BWF9TQVRVKG91dDAsIG91dDEpOworICAgICAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBvdXQxLCAodjE2aTgpIG91dDApOworICAgICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgZHN0MTAgPSBkc3Q1NDsKKyAgICAgICAgZHN0MzIgPSBkc3Q3NjsKKyAgICAgICAgZHN0NTQgPSBkc3Q5ODsKKyAgICAgICAgZHN0MjEgPSBkc3Q2NTsKKyAgICAgICAgZHN0NDMgPSBkc3Q4NzsKKyAgICAgICAgZHN0NjUgPSBkc3QxMDk7CisgICAgICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDEwOCwgMSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBoZXZjX2h2X2JpXzh0XzhtdWx0eDJtdWx0X21zYSh1aW50OF90ICpzcmMwX3B0ciwKK3N0YXRpYyB2b2lkIGhldmNfaHZfYmlfOHRfOG11bHR4MW11bHRfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMV9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyYzJfc3RyaWRlLApAQCAtMTU3MCwyMiArMTc0OSwyMCBAQAogICAgIHVpbnQ4X3QgKnNyYzBfcHRyX3RtcDsKICAgICBpbnQxNl90ICpzcmMxX3B0cl90bXA7CiAgICAgdWludDhfdCAqZHN0X3RtcDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwotICAgIHY4aTE2IGluMCwgaW4xOwotICAgIHY0aTMyIGluMF9yLCBpbjBfbCwgaW4xX3IsIGluMV9sOworICAgIHYxNnU4IG91dDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHY4aTE2IGluMCwgdG1wOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKICAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdDg7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sOworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2w7CiAgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKICAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3Q3Nl9sOwotICAgIHY4aTE2IGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3I7Ci0gICAgdjhpMTYgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbCwgZHN0ODdfbDsKIAogICAgIHNyYzBfcHRyIC09ICgoMyAqIHNyY19zdHJpZGUpICsgMyk7CiAgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKQEAgLTE1OTUsOSArMTc3Miw5IEBACiAgICAgU1BMQVRJX0g0X1NIKGZpbHRlcl92ZWMsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7Ci0gICAgU1BMQVRJX1c0X1NXKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CisKKyAgICBTUExBVElfVzRfU0goZmlsdGVyX3ZlYywgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKICAgICBtYXNrMiA9IG1hc2swICsgNDsKQEAgLTE2MjIsMTggKzE3OTksMTQgQEAKICAgICAgICAgICAgICAgICAgICB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1KTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOwogCiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CkBAIC0xNjQxLDM4ICsxODE0LDI4IEBACiAgICAgICAgICAgICAgICAgICAgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNyk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NCwgZHN0NCwgZHN0NCk7Ci0gICAgICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDUsIGRzdDUsIGRzdDUsIGRzdDUpOwotICAgICAgICBkc3Q2ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDYsIGRzdDYsIGRzdDYsIGRzdDYpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDYgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAKLSAgICAgICAgSUxWUl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3QyLCBkc3QxLAotICAgICAgICAgICAgICAgICAgIGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDIxX3IpOwotICAgICAgICBJTFZSX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDYsIGRzdDUsIGRzdDQzX3IsIGRzdDY1X3IpOwotICAgICAgICBJTFZMX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDIsIGRzdDEsCi0gICAgICAgICAgICAgICAgICAgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCk7Ci0gICAgICAgIElMVkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NiwgZHN0NSwgZHN0NDNfbCwgZHN0NjVfbCk7CisgICAgICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQ7IGxvb3BfY250LS07KSB7CisgICAgICAgICAgICBzcmM3ID0gTERfU0Ioc3JjMF9wdHJfdG1wKTsKKyAgICAgICAgICAgIHNyYzcgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzcsIDEyOCk7CisgICAgICAgICAgICBzcmMwX3B0cl90bXAgKz0gc3JjX3N0cmlkZTsKIAotICAgICAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDE7IGxvb3BfY250LS07KSB7Ci0gICAgICAgICAgICAvKiByb3cgNyAqLwotICAgICAgICAgICAgTERfU0IyKHNyYzBfcHRyX3RtcCwgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCk7Ci0gICAgICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM3LCBzcmM4KTsKLSAgICAgICAgICAgIHNyYzBfcHRyX3RtcCArPSAyICogc3JjX3N0cmlkZTsKLQotICAgICAgICAgICAgTERfU0gyKHNyYzFfcHRyX3RtcCwgc3JjMl9zdHJpZGUsIGluMCwgaW4xKTsKLSAgICAgICAgICAgIHNyYzFfcHRyX3RtcCArPSAoMiAqIHNyYzJfc3RyaWRlKTsKKyAgICAgICAgICAgIGluMCA9IExEX1NIKHNyYzFfcHRyX3RtcCk7CisgICAgICAgICAgICBzcmMxX3B0cl90bXAgKz0gc3JjMl9zdHJpZGU7CiAKICAgICAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICAgICAgZHN0NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q3LCBkc3Q3LCBkc3Q3LCBkc3Q3KTsKLQorICAgICAgICAgICAgZHN0NyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBkc3QyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOwogICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NywgZHN0NiwgZHN0NzZfciwgZHN0NzZfbCk7CiAgICAgICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CkBAIC0xNjgxLDQ5ICsxODQ0LDIxIEBACiAgICAgICAgICAgICBkc3QwX3IgPj49IDY7CiAgICAgICAgICAgICBkc3QwX2wgPj49IDY7CiAKLSAgICAgICAgICAgIFZTSEZfQjRfU0Ioc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICAgICAgZHN0OCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q4LCBkc3Q4LCBkc3Q4LCBkc3Q4KTsKKyAgICAgICAgICAgIHRtcCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QwX2wsICh2OGkxNikgZHN0MF9yKTsKKyAgICAgICAgICAgIEFERFNfU0gyX1NIKHRtcCwgaW4wLCB0bXAsIGNvbnN0X3ZlYywgdG1wLCB0bXApOworICAgICAgICAgICAgdG1wID0gX19tc2Ffc3JhcmlfaCh0bXAsIDcpOworICAgICAgICAgICAgdG1wID0gQ0xJUF9TSF8wXzI1NV9NQVhfU0FUVSh0bXApOworICAgICAgICAgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wLCAodjE2aTgpIHRtcCk7CisgICAgICAgICAgICBTVDh4MV9VQihvdXQsIGRzdF90bXApOworICAgICAgICAgICAgZHN0X3RtcCArPSBkc3Rfc3RyaWRlOwogCi0gICAgICAgICAgICBJTFZSTF9IMl9TSChkc3Q4LCBkc3Q3LCBkc3Q4N19yLCBkc3Q4N19sKTsKLSAgICAgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF84VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKLSAgICAgICAgICAgIGRzdDFfbCA9IEhFVkNfRklMVF84VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGRzdDY1X2wsIGRzdDg3X2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKLSAgICAgICAgICAgIGRzdDFfciA+Pj0gNjsKLSAgICAgICAgICAgIGRzdDFfbCA+Pj0gNjsKLQotICAgICAgICAgICAgVU5QQ0tfU0hfU1coaW4wLCBpbjBfciwgaW4wX2wpOwotICAgICAgICAgICAgVU5QQ0tfU0hfU1coaW4xLCBpbjFfciwgaW4xX2wpOwotICAgICAgICAgICAgaW4wX3IgPSBfX21zYV9hZGRzX3NfdyhpbjBfciwgZHN0MF9yKTsKLSAgICAgICAgICAgIGluMF9sID0gX19tc2FfYWRkc19zX3coaW4wX2wsIGRzdDBfbCk7Ci0gICAgICAgICAgICBpbjFfciA9IF9fbXNhX2FkZHNfc193KGluMV9yLCBkc3QxX3IpOwotICAgICAgICAgICAgaW4xX2wgPSBfX21zYV9hZGRzX3NfdyhpbjFfbCwgZHN0MV9sKTsKLSAgICAgICAgICAgIFNSQVJJX1c0X1NXKGluMF9yLCBpbjBfbCwgaW4xX3IsIGluMV9sLCA3KTsKLSAgICAgICAgICAgIGluMF9yID0gQ0xJUF9TV18wXzI1NShpbjBfcik7Ci0gICAgICAgICAgICBpbjBfbCA9IENMSVBfU1dfMF8yNTUoaW4wX2wpOwotICAgICAgICAgICAgaW4xX3IgPSBDTElQX1NXXzBfMjU1KGluMV9yKTsKLSAgICAgICAgICAgIGluMV9sID0gQ0xJUF9TV18wXzI1NShpbjFfbCk7Ci0KLSAgICAgICAgICAgIEhFVkNfUENLX1NXX1NCNChpbjBfbCwgaW4wX3IsIGluMV9sLCBpbjFfciwgZHN0MF9yKTsKLSAgICAgICAgICAgIFNUOHgyX1VCKGRzdDBfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIGRzdDEwX3IgPSBkc3QzMl9yOwotICAgICAgICAgICAgZHN0MzJfciA9IGRzdDU0X3I7Ci0gICAgICAgICAgICBkc3Q1NF9yID0gZHN0NzZfcjsKLSAgICAgICAgICAgIGRzdDEwX2wgPSBkc3QzMl9sOwotICAgICAgICAgICAgZHN0MzJfbCA9IGRzdDU0X2w7Ci0gICAgICAgICAgICBkc3Q1NF9sID0gZHN0NzZfbDsKLSAgICAgICAgICAgIGRzdDIxX3IgPSBkc3Q0M19yOwotICAgICAgICAgICAgZHN0NDNfciA9IGRzdDY1X3I7Ci0gICAgICAgICAgICBkc3Q2NV9yID0gZHN0ODdfcjsKLSAgICAgICAgICAgIGRzdDIxX2wgPSBkc3Q0M19sOwotICAgICAgICAgICAgZHN0NDNfbCA9IGRzdDY1X2w7Ci0gICAgICAgICAgICBkc3Q2NV9sID0gZHN0ODdfbDsKLSAgICAgICAgICAgIGRzdDYgPSBkc3Q4OworICAgICAgICAgICAgZHN0MCA9IGRzdDE7CisgICAgICAgICAgICBkc3QxID0gZHN0MjsKKyAgICAgICAgICAgIGRzdDIgPSBkc3QzOworICAgICAgICAgICAgZHN0MyA9IGRzdDQ7CisgICAgICAgICAgICBkc3Q0ID0gZHN0NTsKKyAgICAgICAgICAgIGRzdDUgPSBkc3Q2OworICAgICAgICAgICAgZHN0NiA9IGRzdDc7CiAgICAgICAgIH0KIAogICAgICAgICBzcmMwX3B0ciArPSA4OwpAQCAtMTc0Miw3ICsxODc3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2X2JpXzh0XzhtdWx0eDJtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAorICAgIGhldmNfaHZfYmlfOHRfOG11bHR4MW11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCA4KTsKIH0KQEAgLTE3NTcsMTIgKzE4OTIsMjA4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2X2JpXzh0XzhtdWx0eDJtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgOCk7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDhfdCAqc3JjMF9wdHJfdG1wLCAqZHN0X3RtcDsKKyAgICBpbnQxNl90ICpzcmMxX3B0cl90bXA7CisgICAgdWludDY0X3QgdHAwLCB0cDE7CisgICAgdjE2dTggb3V0OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CisgICAgdjhpMTYgaW4wLCBpbjEgPSB7IDAgfSwgb3V0MCwgb3V0MSwgdG1wLCBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDM7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2OGkxNiBkc3QzMCwgZHN0NDEsIGRzdDUyLCBkc3Q2MywgZHN0NjYsIGRzdDk3LCBkc3QxMDg7CisgICAgdjhpMTYgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYsIGRzdDk4LCBkc3QyMSwgZHN0NDMsIGRzdDY1LCBkc3Q4NywgZHN0MTA5OworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3I7CisgICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0NzZfbDsKKyAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKIAotICAgIGhldmNfaHZfYmlfOHRfNHdfbXNhKHNyYzBfcHRyICsgOCwgc3JjX3N0cmlkZSwgc3JjMV9wdHIgKyA4LCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKyA4LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCk7CisgICAgc3JjMF9wdHIgLT0gKCgzICogc3JjX3N0cmlkZSkgKyAzKTsKKworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjIDw8PSA2OworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKKyAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOworCisgICAgU1BMQVRJX1c0X1NIKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworCisgICAgbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKKyAgICBtYXNrMSA9IG1hc2swICsgMjsKKyAgICBtYXNrMiA9IG1hc2swICsgNDsKKyAgICBtYXNrMyA9IG1hc2swICsgNjsKKworICAgIHNyYzBfcHRyX3RtcCA9IHNyYzBfcHRyOworICAgIGRzdF90bXAgPSBkc3Q7CisgICAgc3JjMV9wdHJfdG1wID0gc3JjMV9wdHI7CisKKyAgICBMRF9TQjcoc3JjMF9wdHJfdG1wLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LAorICAgICAgICAgICBzcmM2KTsKKyAgICBzcmMwX3B0cl90bXAgKz0gKDcgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0I3XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKworICAgIC8qIHJvdyAwIHJvdyAxIHJvdyAyIHJvdyAzICovCisgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwKKyAgICAgICAgICAgICAgIHZlYzMpOworICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzQsIHZlYzUsIHZlYzYsCisgICAgICAgICAgICAgICB2ZWM3KTsKKyAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWM4LCB2ZWM5LCB2ZWMxMCwKKyAgICAgICAgICAgICAgIHZlYzExKTsKKyAgICBWU0hGX0I0X1NCKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWMxMiwgdmVjMTMsIHZlYzE0LAorICAgICAgICAgICAgICAgdmVjMTUpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CisgICAgVlNIRl9CNF9TQihzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwKKyAgICAgICAgICAgICAgIHZlYzMpOworICAgIFZTSEZfQjRfU0Ioc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzQsIHZlYzUsIHZlYzYsCisgICAgICAgICAgICAgICB2ZWM3KTsKKyAgICBWU0hGX0I0X1NCKHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWM4LCB2ZWM5LCB2ZWMxMCwKKyAgICAgICAgICAgICAgIHZlYzExKTsKKyAgICBkc3Q0ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDUgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0NiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworCisgICAgZm9yIChsb29wX2NudCA9IDE2OyBsb29wX2NudC0tOykgeworICAgICAgICBzcmM3ID0gTERfU0Ioc3JjMF9wdHJfdG1wKTsKKyAgICAgICAgc3JjNyA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjNywgMTI4KTsKKyAgICAgICAgc3JjMF9wdHJfdG1wICs9IHNyY19zdHJpZGU7CisKKyAgICAgICAgaW4wID0gTERfU0goc3JjMV9wdHJfdG1wKTsKKyAgICAgICAgc3JjMV9wdHJfdG1wICs9IHNyYzJfc3RyaWRlOworCisgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEsIHZlYzIsCisgICAgICAgICAgICAgICAgICAgdmVjMyk7CisgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q3LCBkc3Q2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF84VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDc2X2wsIGZpbHRfaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QwX3IgPj49IDY7CisgICAgICAgIGRzdDBfbCA+Pj0gNjsKKworICAgICAgICB0bXAgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MF9sLCAodjhpMTYpIGRzdDBfcik7CisgICAgICAgIEFERFNfU0gyX1NIKHRtcCwgaW4wLCB0bXAsIGNvbnN0X3ZlYywgdG1wLCB0bXApOworICAgICAgICB0bXAgPSBfX21zYV9zcmFyaV9oKHRtcCwgNyk7CisgICAgICAgIHRtcCA9IENMSVBfU0hfMF8yNTVfTUFYX1NBVFUodG1wKTsKKyAgICAgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wLCAodjE2aTgpIHRtcCk7CisgICAgICAgIFNUOHgxX1VCKG91dCwgZHN0X3RtcCk7CisgICAgICAgIGRzdF90bXAgKz0gZHN0X3N0cmlkZTsKKworICAgICAgICBkc3QwID0gZHN0MTsKKyAgICAgICAgZHN0MSA9IGRzdDI7CisgICAgICAgIGRzdDIgPSBkc3QzOworICAgICAgICBkc3QzID0gZHN0NDsKKyAgICAgICAgZHN0NCA9IGRzdDU7CisgICAgICAgIGRzdDUgPSBkc3Q2OworICAgICAgICBkc3Q2ID0gZHN0NzsKKyAgICB9CisKKyAgICBzcmMwX3B0ciArPSA4OworICAgIGRzdCArPSA4OworICAgIHNyYzFfcHRyICs9IDg7CisKKyAgICBtYXNrNCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CisgICAgbWFzazUgPSBtYXNrNCArIDI7CisgICAgbWFzazYgPSBtYXNrNCArIDQ7CisgICAgbWFzazcgPSBtYXNrNCArIDY7CisKKyAgICBMRF9TQjcoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgIHNyYzBfcHRyICs9ICg3ICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisKKyAgICAvKiByb3cgMCByb3cgMSByb3cgMiByb3cgMyAqLworICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjNCwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjRfU0Ioc3JjMiwgc3JjNSwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsCisgICAgICAgICAgICAgICB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEpOworICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjNiwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsCisgICAgICAgICAgICAgICB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSk7CisgICAgZHN0MzAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDQxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q1MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q2MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworCisgICAgSUxWUkxfSDJfU0goZHN0NDEsIGRzdDMwLCBkc3QxMCwgZHN0NDMpOworICAgIElMVlJMX0gyX1NIKGRzdDUyLCBkc3Q0MSwgZHN0MjEsIGRzdDU0KTsKKyAgICBJTFZSTF9IMl9TSChkc3Q2MywgZHN0NTIsIGRzdDMyLCBkc3Q2NSk7CisKKyAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q2MywgMSk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgICAgIHNyYzBfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4wKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gKDIgKiBzcmMyX3N0cmlkZSk7CisgICAgICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjEpOworICAgICAgICBzcmMxX3B0ciArPSAoMiAqIHNyYzJfc3RyaWRlKTsKKworICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzksIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzEwLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjNCwgdmVjNSwgdmVjNiwKKyAgICAgICAgICAgICAgICAgICB2ZWM3KTsKKyAgICAgICAgZHN0OTcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MTA4ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworCisgICAgICAgIGRzdDc2ID0gX19tc2FfaWx2cl9oKGRzdDk3LCBkc3Q2Nik7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEwOCwgZHN0OTcsIGRzdDg3LCBkc3QxMDkpOworICAgICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q5NywgMSk7CisgICAgICAgIGRzdDk4ID0gX19tc2FfaWx2cl9oKGRzdDY2LCBkc3QxMDgpOworCisgICAgICAgIHRtcDAgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3Q3NiwgZmlsdF9oMCwgZmlsdF9oMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICB0bXAxID0gSEVWQ19GSUxUXzhUQVAoZHN0MjEsIGRzdDQzLCBkc3Q2NSwgZHN0ODcsIGZpbHRfaDAsIGZpbHRfaDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgdG1wMiA9IEhFVkNfRklMVF84VEFQKGRzdDMyLCBkc3Q1NCwgZHN0NzYsIGRzdDk4LCBmaWx0X2gwLCBmaWx0X2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIHRtcDMgPSBIRVZDX0ZJTFRfOFRBUChkc3Q0MywgZHN0NjUsIGRzdDg3LCBkc3QxMDksIGZpbHRfaDAsIGZpbHRfaDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgU1JBXzRWKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDYpOworICAgICAgICBQQ0tFVl9IMl9TSCh0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgQUREU19TSDJfU0gob3V0MCwgaW4wLCBvdXQxLCBpbjEsIG91dDAsIG91dDEpOworICAgICAgICBBRERTX1NIMl9TSChvdXQwLCBjb25zdF92ZWMsIG91dDEsIGNvbnN0X3ZlYywgb3V0MCwgb3V0MSk7CisgICAgICAgIFNSQVJJX0gyX1NIKG91dDAsIG91dDEsIDcpOworICAgICAgICBDTElQX1NIMl8wXzI1NV9NQVhfU0FUVShvdXQwLCBvdXQxKTsKKyAgICAgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb3V0MSwgKHYxNmk4KSBvdXQwKTsKKyAgICAgICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwID0gZHN0NTQ7CisgICAgICAgIGRzdDMyID0gZHN0NzY7CisgICAgICAgIGRzdDU0ID0gZHN0OTg7CisgICAgICAgIGRzdDIxID0gZHN0NjU7CisgICAgICAgIGRzdDQzID0gZHN0ODc7CisgICAgICAgIGRzdDY1ID0gZHN0MTA5OworICAgICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QxMDgsIDEpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaV84dF8xNndfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMTc3NSw3ICsyMTA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfaHZfYmlfOHRfOG11bHR4Mm11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCisgICAgaGV2Y19odl9iaV84dF84bXVsdHgxbXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIDE2KTsKIH0KQEAgLTE3OTAsNyArMjEyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2X2JpXzh0XzhtdWx0eDJtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAorICAgIGhldmNfaHZfYmlfOHRfOG11bHR4MW11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAyNCk7CiB9CkBAIC0xODA1LDcgKzIxMzYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19odl9iaV84dF84bXVsdHgybXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKKyAgICBoZXZjX2h2X2JpXzh0XzhtdWx0eDFtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgMzIpOwogfQpAQCAtMTgyMCw3ICsyMTUxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfaHZfYmlfOHRfOG11bHR4Mm11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCisgICAgaGV2Y19odl9iaV84dF84bXVsdHgxbXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIDQ4KTsKIH0KQEAgLTE4MzUsNyArMjE2Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2X2JpXzh0XzhtdWx0eDJtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAorICAgIGhldmNfaHZfYmlfOHRfOG11bHR4MW11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCA2NCk7CiB9CkBAIC0xODUyLDcgKzIxODMsNyBAQAogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBkc3QwLCB2ZWMwLCB2ZWMxOwogICAgIHY4aTE2IGluMCwgaW4xOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzE2XSk7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjhpMTYgdG1wMDsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CkBAIC0xODk1LDcgKzIyMjYsOCBAQAogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QwLCB2ZWMwLCB2ZWMxOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwIH07CisgICAgdjE2aTggdmVjMiwgdmVjMzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzE2XSk7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjhpMTYgdG1wMCwgdG1wMTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CkBAIC0xOTE2LDEyICsyMjQ4LDEyIEBACiAgICAgSUxWUl9EMl9TSChpbjEsIGluMCwgaW4zLCBpbjIsIGluMCwgaW4xKTsKICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKIAotICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICB0bXAwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIHRtcDAsIHRtcDApOwotICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIHRtcDEsIHRtcDEpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDEsIGZpbHQxLCB0bXAwLCB0bXAxLAorICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxKTsKICAgICBIRVZDX0JJX1JORF9DTElQMihpbjAsIGluMSwgdG1wMCwgdG1wMSwgNywgdG1wMCwgdG1wMSk7CiAgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAxLCAodjE2aTgpIHRtcDApOwogCkBAIC0xOTQyLDggKzIyNzQsOCBAQAogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CiAgICAgdjE2aTggZHN0MCwgZHN0MTsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwIH07Ci0gICAgdjE2aTggbWFzazEsIHZlYzAsIHZlYzE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclsxNl0pOworICAgIHYxNmk4IG1hc2sxLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwogICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogCkBAIC0xOTY5LDE4ICsyMzAxLDE4IEBACiAgICAgICAgIElMVlJfRDJfU0goaW41LCBpbjQsIGluNywgaW42LCBpbjIsIGluMyk7CiAgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgdG1wMSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgdG1wMSwgdG1wMSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgdG1wMiwgdG1wMik7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNywgc3JjNiwgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgdG1wMywgdG1wMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIHRtcDAsCisgICAgICAgICAgICAgICAgICAgICB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgdG1wMCwKKyAgICAgICAgICAgICAgICAgICAgIHRtcDEsIHRtcDIsIHRtcDMpOwogCiAgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CkBAIC0yMDI2LDkgKzIzNTgsOSBAQAogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHYxNmk4IHZlYzAsIHZlYzE7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKIApAQCAtMjA0OSwxOCArMjM4MSwxOCBAQAogICAgICAgICBzcmMxX3B0ciArPSAoNCAqIHNyYzJfc3RyaWRlKTsKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CiAKICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKQEAgLTIwODMsOCArMjQxNSw4IEBACiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzE7CiAgICAgdjhpMTYgaW4wLCBpbjE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKLSAgICB2MTZpOCBtYXNrMSwgdmVjMCwgdmVjMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKKyAgICB2MTZpOCBtYXNrMSwgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKIApAQCAtMjEwMiwxMiArMjQzNCwxMiBAQAogICAgIExEX1NIMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xKTsKICAgICBYT1JJX0IyXzEyOF9TQihzcmMwLCBzcmMxKTsKIAotICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDEsIGZpbHQxLCBkc3QwLCBkc3QxLAorICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxKTsKICAgICBIRVZDX0JJX1JORF9DTElQMihpbjAsIGluMSwgZHN0MCwgZHN0MSwgNywgZHN0MCwgZHN0MSk7CiAKICAgICBkc3QwID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MSwgKHYxNmk4KSBkc3QwKTsKQEAgLTIxMjYsOSArMjQ1OCw5IEBACiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzU7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHYxNmk4IHZlYzAsIHZlYzE7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKIApAQCAtMjE0OCwyNCArMjQ4MCwyNSBAQAogICAgIExEX1NIMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluNCwgaW41KTsKICAgICBYT1JJX0I2XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1KTsKIAotICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZHN0MCwgZHN0MSwKKyAgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDMpOwogICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0gICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7CisKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQxLCBmaWx0MSwgZHN0NCwgZHN0NSwKKyAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSk7CiAKICAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CkBAIC0yMTkxLDkgKzI1MjQsOSBAQAogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjE2aTggdmVjMCwgdmVjMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogCkBAIC0yMjE0LDE4ICsyNTQ3LDE4IEBACiAgICAgICAgIHNyYzFfcHRyICs9ICg0ICogc3JjMl9zdHJpZGUpOwogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKIAogICAgICAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwpAQCAtMjI3MSwxMiArMjYwNCwxMiBAQAogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgdjE2aTggbWFzazIgPSB7CiAgICAgICAgIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsIDI4CiAgICAgfTsKICAgICB2MTZpOCBtYXNrMSwgbWFzazM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogCkBAIC0yMzAxLDI0ICsyNjM0LDI0IEBACiAgICAgICAgIElMVlJfRDJfU0goaW41LCBpbjQsIGluNywgaW42LCBpbjQsIGluNSk7CiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjNCwgdmVjNSk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQwLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazMsIG1hc2szLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MSwgZmlsdDEsIGRzdDQsIGRzdDUpOwogCiAgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CkBAIC0yMzQxLDEzICsyNjc0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKLSAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOworICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwotICAgIHYxNmk4IHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gMTsKQEAgLTIzNjAsNDkgKzI2OTEsMzYgQEAKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMiwgc3JjNCwgc3JjNik7Ci0gICAgICAgIExEX1NCNChzcmMwX3B0ciArIDgsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzMsIHNyYzUsIHNyYzcpOwotICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMiwgaW40LCBpbjYpOwotICAgICAgICBMRF9TSDQoc3JjMV9wdHIgKyA4LCBzcmMyX3N0cmlkZSwgaW4xLCBpbjMsIGluNSwgaW43KTsKLSAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7Ci0gICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzIpOworICAgICAgICBMRF9TQjIoc3JjMF9wdHIgKyA4LCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMzKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgTERfU0gyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjIpOworICAgICAgICBMRF9TSDIoc3JjMV9wdHIgKyA4LCBzcmMyX3N0cmlkZSwgaW4xLCBpbjMpOworICAgICAgICBzcmMxX3B0ciArPSAoMiAqIHNyYzJfc3RyaWRlKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworCiAgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDYgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDYsIGRzdDYpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDcgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDcsIGRzdDcpOworCisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOwogCiAgICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluNCwgaW41LCBpbjYsIGluNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgNywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CiAKLSAgICAgICAgUENLRVZfQjRfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwKLSAgICAgICAgICAgICAgICAgICAgZHN0NSwgZHN0NCwgZHN0NywgZHN0NiwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIFNUX1NINChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7CisgICAgICAgIFNUX1NIMihkc3QwLCBkc3QxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CiAKQEAgLTI0MjEsOSArMjczOSw5IEBACiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szOwotICAgIHYxNmk4IHZlYzAsIHZlYzE7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKIApAQCAtMjQ1MSwzMCArMjc2OSwzMSBAQAogICAgICAgICBzcmMxX3B0ciArPSAoNCAqIHNyYzJfc3RyaWRlKTsKICAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMzLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMiwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2syLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazEsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMzLCBtYXNrMSwgbWFzazMsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKwogICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM0LCBzcmM1LCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3Q2ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q2LCBkc3Q2KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM3LCBzcmM2LCBzcmM3LCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3Q3ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q3LCBkc3Q3KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM1LCBtYXNrMCwgbWFzazIsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMiwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZHN0NCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDUsIGRzdDYsIGRzdDcpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzUsIG1hc2sxLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNywgbWFzazEsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBkc3Q0LAorICAgICAgICAgICAgICAgICAgICAgZHN0NSwgZHN0NiwgZHN0Nyk7CiAKICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKQEAgLTI0ODksMTggKzI4MDgsMTggQEAKICAgICAgICAgTERfU0g0KHNyYzFfcHRyX3RtcCwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7CiAgICAgICAgIHNyYzFfcHRyX3RtcCArPSAoNCAqIHNyYzJfc3RyaWRlKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNywgc3JjNywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM3LCBzcmM3LCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKIAogICAgICAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwpAQCAtMjUyNCwxMCArMjg0MywxMCBAQAogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzI7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gMTsKQEAgLTI1NDIsNyArMjg2MSw3IEBACiAgICAgbWFzazIgPSBtYXNrMCArIDg7CiAgICAgbWFzazMgPSBtYXNrMCArIDEwOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMSk7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IGhlaWdodDsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0IyKHNyYzBfcHRyLCAxNiwgc3JjMCwgc3JjMSk7CiAgICAgICAgIHNyYzIgPSBMRF9TQihzcmMwX3B0ciArIDI0KTsKICAgICAgICAgc3JjMF9wdHIgKz0gc3JjX3N0cmlkZTsKQEAgLTI1NTAsNDUgKzI4NjksMTggQEAKICAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CiAgICAgICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0KLSAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA3LCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLQotICAgICAgICBQQ0tFVl9CMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKLSAgICAgICAgU1RfU0gyKGRzdDAsIGRzdDEsIGRzdCwgMTYpOwotICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLQotICAgICAgICBMRF9TQjIoc3JjMF9wdHIsIDE2LCBzcmMwLCBzcmMxKTsKLSAgICAgICAgc3JjMiA9IExEX1NCKHNyYzBfcHRyICsgMjQpOwotICAgICAgICBzcmMwX3B0ciArPSBzcmNfc3RyaWRlOwotICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIDgsIGluMCwgaW4xLCBpbjIsIGluMyk7Ci0gICAgICAgIHNyYzFfcHRyICs9IHNyYzJfc3RyaWRlOwotICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMiwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazEsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMyLCBzcmMyLCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKIAogICAgICAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDcsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwpAQCAtMjgwMCwxMCArMzA5Miw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjMjFfciwgc3JjNDNfcjsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM1NF9yLCBzcmM2NV9yOwogICAgIHY4aTE2IGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwpAQCAtMjgxOCw0MCArMzEwOSw3MCBAQAogCiAgICAgTERfU0IzKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKICAgICBzcmMwX3B0ciArPSAoMyAqIHNyY19zdHJpZGUpOworICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7CisgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKKyAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYpOworICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7CisgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4KTsKKyAgICBzcmMwX3B0ciArPSAoMiAqIHNyY19zdHJpZGUpOworICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjOSwgc3JjMTApOworICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7CisKKyAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgIHNyYzFfcHRyICs9ICg0ICogc3JjMl9zdHJpZGUpOworCiAgICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNywgc3JjOCk7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjOSwgc3JjMTApOworCiAgICAgSUxWUl9CMl9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMxMF9yLCBzcmMyMV9yKTsKKyAgICBJTFZSX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX3IsIHNyYzQzX3IpOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIExEX1NINChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7Ci0gICAgICAgIHNyYzFfcHRyICs9ICg0ICogc3JjMl9zdHJpZGUpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLSAgICAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICBkc3QwX3IgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgZHN0MF9yLCBkc3QwX3IpOworICAgIGRzdDFfciA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCBkc3QxX3IsIGRzdDFfcik7CiAKLSAgICAgICAgZHN0MF9yID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxLCBkc3QwX3IsIGRzdDBfcik7Ci0gICAgICAgIGRzdDFfciA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSwgZHN0MV9yLCBkc3QxX3IpOworICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNTRfciwgc3JjNjVfcik7CiAKLSAgICAgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmMyKTsKLSAgICAgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjMik7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjMTBfciwgc3JjMjFfcik7CisgICAgZHN0Ml9yID0gY29uc3RfdmVjOworICAgIERQQUREX1NCMl9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGRzdDJfciwgZHN0Ml9yKTsKKyAgICBkc3QzX3IgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZHN0M19yLCBkc3QzX3IpOwogCi0gICAgICAgIGRzdDJfciA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSwgZHN0Ml9yLCBkc3QyX3IpOwotICAgICAgICBkc3QzX3IgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEsIGRzdDNfciwgZHN0M19yKTsKKyAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCisgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA3LAorICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7CiAKLSAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7CisgICAgUENLRVZfQjJfU0goZHN0MV9yLCBkc3QwX3IsIGRzdDNfciwgZHN0Ml9yLCBkc3QwX3IsIGRzdDFfcik7CisgICAgU1Q2eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgUENLRVZfQjJfU0goZHN0MV9yLCBkc3QwX3IsIGRzdDNfciwgZHN0Ml9yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUNng0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICB9CisgICAgTERfU0g0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgICBzcmMxX3B0ciArPSAoNCAqIHNyYzJfc3RyaWRlKTsKKyAgICBJTFZSX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzMyX3IsIHNyYzQzX3IpOworCisgICAgZHN0MF9yID0gY29uc3RfdmVjOworICAgIERQQUREX1NCMl9TSChzcmM1NF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEsIGRzdDBfciwgZHN0MF9yKTsKKyAgICBkc3QxX3IgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHNyYzY1X3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSwgZHN0MV9yLCBkc3QxX3IpOworCisgICAgSUxWUl9CMl9TQihzcmM5LCBzcmM4LCBzcmMxMCwgc3JjOSwgc3JjNTRfciwgc3JjNjVfcik7CisKKyAgICBkc3QyX3IgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSwgZHN0Ml9yLCBkc3QyX3IpOworICAgIGRzdDNfciA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0goc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxLCBkc3QzX3IsIGRzdDNfcik7CisKKyAgICBIRVZDX0JJX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsCisgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA3LAorICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7CisKKyAgICBQQ0tFVl9CMl9TSChkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIGRzdDBfciwgZHN0MV9yKTsKKyAgICBTVDZ4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y192dF9iaV80dF84eDJfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMzA1MywxMiArMzM3NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwotICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNTRfciwgc3JjNjVfcjsKICAgICB2OGkxNiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3I7CiAgICAgdjE2aTggc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbDsKLSAgICB2MTZpOCBzcmMyMTEwLCBzcmM0MzMyOworICAgIHYxNmk4IHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQ7CiAgICAgdjhpMTYgZHN0MF9sLCBkc3QxX2wsIGZpbHQwLCBmaWx0MTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CiAKQEAgLTMwODAsMTUgKzM0MDEsMjEgQEAKICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKICAgICAgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKICAgICAgICAgTERfU0g0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKICAgICAgICAgTERfU0g0KChzcmMxX3B0ciArIDgpLCBzcmMyX3N0cmlkZSwgaW40LCBpbjUsIGluNiwgaW43KTsKICAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CiAgICAgICAgIElMVlJfRDJfU0goaW41LCBpbjQsIGluNywgaW42LCBpbjQsIGluNSk7CiAgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzMsIHNyYzQpOworICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM1LCBzcmM2KTsKIAogICAgICAgICBJTFZSX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX3IsIHNyYzQzX3IpOwogICAgICAgICBJTFZMX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX2wsIHNyYzQzX2wpOwogICAgICAgICBzcmM0MzMyID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmM0M19sLCAodjJpNjQpIHNyYzMyX2wpOworICAgICAgICBJTFZSX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzU0X3IsIHNyYzY1X3IpOworICAgICAgICBJTFZMX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzU0X2wsIHNyYzY1X2wpOworICAgICAgICBzcmM2NTU0ID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmM2NV9sLCAodjJpNjQpIHNyYzU0X2wpOwogCiAgICAgICAgIGRzdDBfciA9IGNvbnN0X3ZlYzsKICAgICAgICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgZHN0MF9yLCBkc3QwX3IpOwpAQCAtMzA5NiwyMSArMzQyMywxMiBAQAogICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCBkc3QxX3IsIGRzdDFfcik7CiAgICAgICAgIGRzdDBfbCA9IGNvbnN0X3ZlYzsKICAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSwgZHN0MF9sLCBkc3QwX2wpOwotCi0gICAgICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjNSwgc3JjMik7Ci0gICAgICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzUsIHNyYzIpOwotCi0gICAgICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjMTBfciwgc3JjMjFfcik7Ci0gICAgICAgIElMVkxfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjNTRfbCwgc3JjNjVfbCk7Ci0gICAgICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzY1X2wsICh2Mmk2NCkgc3JjNTRfbCk7Ci0KICAgICAgICAgZHN0Ml9yID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMzJfciwgc3JjMTBfciwgZmlsdDAsIGZpbHQxLCBkc3QyX3IsIGRzdDJfcik7CisgICAgICAgIERQQUREX1NCMl9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGRzdDJfciwgZHN0Ml9yKTsKICAgICAgICAgZHN0M19yID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNDNfciwgc3JjMjFfciwgZmlsdDAsIGZpbHQxLCBkc3QzX3IsIGRzdDNfcik7CisgICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEsIGRzdDNfciwgZHN0M19yKTsKICAgICAgICAgZHN0MV9sID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNDMzMiwgc3JjMjExMCwgZmlsdDAsIGZpbHQxLCBkc3QxX2wsIGRzdDFfbCk7CisgICAgICAgIERQQUREX1NCMl9TSChzcmM0MzMyLCBzcmM2NTU0LCBmaWx0MCwgZmlsdDEsIGRzdDFfbCwgZHN0MV9sKTsKICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIDcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7CkBAIC0zMTIwLDYgKzM0MzgsMTEgQEAKICAgICAgICAgZHN0MF9sID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MV9sLCAodjE2aTgpIGRzdDBfbCk7CiAgICAgICAgIFNUMTJ4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKworICAgICAgICBzcmMyID0gc3JjNjsKKyAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7CisgICAgICAgIHNyYzIxX3IgPSBzcmM2NV9yOworICAgICAgICBzcmMyMTEwID0gc3JjNjU1NDsKICAgICB9CiB9CiAKQEAgLTM0NDksMjAgKzM3NzIsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95KQogewotICAgIHY4aTE2IGluMCwgaW4xOworICAgIHVpbnQ2NF90IHRwMCwgdHAxOworICAgIHYxNnU4IG91dDsKKyAgICB2OGkxNiBpbjAgPSB7IDAgfTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NDsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfcjsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOworICAgIHY4aTE2IGRzdDIwLCBkc3QzMSwgZHN0NDIsIGRzdDEwLCBkc3QzMiwgZHN0MjEsIGRzdDQzLCB0bXA7CisgICAgdjRpMzIgZHN0MCwgZHN0MTsKIAogICAgIHNyYzBfcHRyIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTM0NzAsNTYgKzM3OTMsNDMgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAogICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogCi0gICAgTERfU0IzKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBzcmMwX3B0ciArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEX1NCNShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwotICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICBJTFZSX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDIsIGRzdDEsIGRzdDEwX3IsIGRzdDIxX3IpOworICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMCk7CisgICAgaW4wID0gX19tc2FfYWRkc19zX2goaW4wLCBjb25zdF92ZWMpOwogCi0gICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKLSAgICBMRF9TSDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7Ci0gICAgaW4wID0gKHY4aTE2KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBpbjEsICh2Mmk2NCkgaW4wKTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLSAgICAvKiByb3cgMyAqLwotICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3QzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0MywgZHN0Mik7Ci0gICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MF9yID4+PSA2OwotICAgIC8qIHJvdyA0ICovCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0gICAgZHN0NDNfciA9IF9fbXNhX2lsdnJfaChkc3Q0LCBkc3QzKTsKLSAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QxX3IgPj49IDY7Ci0gICAgZHN0MF9yID0gKHY0aTMyKSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MV9yLCAodjhpMTYpIGRzdDBfcik7Ci0gICAgZHN0MF9yID0gKHY0aTMyKSBfX21zYV9hZGRzX3NfaCgodjhpMTYpIGRzdDBfciwgaW4wKTsKLSAgICBkc3QwX3IgPSAodjRpMzIpIF9fbXNhX3NyYXJpX2goKHY4aTE2KSBkc3QwX3IsIDcpOwotICAgIGRzdDBfciA9ICh2NGkzMikgQ0xJUF9TSF8wXzI1NShkc3QwX3IpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMiwgc3JjMCwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzMsIHNyYzEsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmM0LCBzcmMyLCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwogCi0gICAgZHN0MF9yID0gKHY0aTMyKSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MF9yLCAodjE2aTgpIGRzdDBfcik7Ci0gICAgU1Q0eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIGRzdDIwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworCisgICAgSUxWUkxfSDJfU0goZHN0MzEsIGRzdDIwLCBkc3QxMCwgZHN0MzIpOworICAgIElMVlJMX0gyX1NIKGRzdDQyLCBkc3QzMSwgZHN0MjEsIGRzdDQzKTsKKworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMCwgZHN0MzIsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMSwgZHN0NDMsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDAgPj49IDY7CisgICAgZHN0MSA+Pj0gNjsKKyAgICB0bXAgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MSwgKHY4aTE2KSBkc3QwKTsKKyAgICB0bXAgPSBfX21zYV9hZGRzX3NfaCh0bXAsIGluMCk7CisgICAgdG1wID0gX19tc2Ffc3JhcmlfaCh0bXAsIDcpOworICAgIHRtcCA9IENMSVBfU0hfMF8yNTVfTUFYX1NBVFUodG1wKTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAsICh2MTZpOCkgdG1wKTsKKyAgICBTVDR4Ml9VQihvdXQsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfYmlfNHRfNHg0X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTM1MjksMjEgKzM4MzksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95KQogewotICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKKyAgICB1aW50NjRfdCB0cDAsIHRwMTsKKyAgICB2MTZ1OCBvdXQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7Ci0gICAgdjhpMTYgZHN0MF9yLCBkc3QxX3I7Ci0gICAgdjRpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjhpMTYgdG1wMCwgdG1wMTsKKyAgICB2OGkxNiBpbjAgPSB7IDAgfSwgaW4xID0geyAwIH07CisgICAgdjhpMTYgZHN0MzAsIGRzdDQxLCBkc3Q1MiwgZHN0NjM7CisgICAgdjhpMTYgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0MjEsIGRzdDQzLCBkc3Q2NTsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogCiAgICAgc3JjMF9wdHIgLT0gKHNyY19zdHJpZGUgKyAxKTsKIApAQCAtMzU1MSw2OSArMzg2Miw1MCBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCisgICAgTERfU0I3KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICBYT1JJX0I3XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKwogICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogCi0gICAgTERfU0IzKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBzcmMwX3B0ciArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICBzcmMxX3B0ciArPSAyICogc3JjMl9zdHJpZGU7CisgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjApOworICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMSk7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwotICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICBJTFZSX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDIsIGRzdDEsIGRzdDEwX3IsIGRzdDIxX3IpOworICAgIEFERFNfU0gyX1NIKGluMCwgY29uc3RfdmVjLCBpbjEsIGNvbnN0X3ZlYywgaW4wLCBpbjEpOwogCi0gICAgTERfU0I0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKLSAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOwotICAgIElMVlJfRDJfU0goaW4xLCBpbjAsIGluMywgaW4yLCBpbjAsIGluMSk7Ci0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7Ci0gICAgLyogcm93IDMgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLSAgICBkc3QzMl9yID0gX19tc2FfaWx2cl9oKGRzdDMsIGRzdDIpOwotICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICB0bXAwID4+PSA2OwotICAgIC8qIHJvdyA0ICovCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0gICAgZHN0NDNfciA9IF9fbXNhX2lsdnJfaChkc3Q0LCBkc3QzKTsKLSAgICB0bXAxID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgdG1wMSA+Pj0gNjsKLSAgICAvKiByb3cgNSAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotICAgIGRzdDEwX3IgPSBfX21zYV9pbHZyX2goZHN0NSwgZHN0NCk7Ci0gICAgdG1wMiA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDEwX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIHRtcDIgPj49IDY7Ci0gICAgLyogcm93IDYgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICBkc3QyMV9yID0gX19tc2FfaWx2cl9oKGRzdDIsIGRzdDUpOwotICAgIHRtcDMgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3QyMV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICB0bXAzID4+PSA2OwotICAgIFBDS0VWX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIGRzdDBfciwgZHN0MV9yKTsKLSAgICBIRVZDX0JJX1JORF9DTElQMihpbjAsIGluMSwgZHN0MF9yLCBkc3QxX3IsIDcsIGRzdDBfciwgZHN0MV9yKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzMsIHNyYzAsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmM0LCBzcmMxLCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjNSwgc3JjMiwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzYsIHNyYzMsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CiAKLSAgICBkc3QwX3IgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxX3IsICh2MTZpOCkgZHN0MF9yKTsKLSAgICBTVDR4NF9VQihkc3QwX3IsIGRzdDBfciwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICBkc3QzMCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDUyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q2MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisKKyAgICBJTFZSTF9IMl9TSChkc3Q0MSwgZHN0MzAsIGRzdDEwLCBkc3Q0Myk7CisgICAgSUxWUkxfSDJfU0goZHN0NTIsIGRzdDQxLCBkc3QyMSwgZHN0NTQpOworICAgIElMVlJMX0gyX1NIKGRzdDYzLCBkc3Q1MiwgZHN0MzIsIGRzdDY1KTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVAoZHN0MTAsIGRzdDMyLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVAoZHN0MjEsIGRzdDQzLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVAoZHN0MzIsIGRzdDU0LCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVAoZHN0NDMsIGRzdDY1LCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUkFfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgUENLRVZfSDJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMCwgdG1wMSk7CisgICAgQUREU19TSDJfU0godG1wMCwgaW4wLCB0bXAxLCBpbjEsIHRtcDAsIHRtcDEpOworICAgIFNSQVJJX0gyX1NIKHRtcDAsIHRtcDEsIDcpOworICAgIENMSVBfU0gyXzBfMjU1X01BWF9TQVRVKHRtcDAsIHRtcDEpOworICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHRtcDEsICh2MTZpOCkgdG1wMCk7CisgICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfYmlfNHRfNG11bHR4OG11bHRfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMzYyNywxOCArMzkxOSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CisgICAgdWludDY0X3QgdHAwLCB0cDE7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdDgsIGRzdDk7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKICAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHY4aTE2IGRzdDEwLCBkc3QyMSwgZHN0MjIsIGRzdDczLCBkc3Q4NCwgZHN0OTUsIGRzdDEwNjsKICAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yOwogICAgIHY4aTE2IGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3I7CisgICAgdjhpMTYgZHN0OThfciwgZHN0MTA5X3I7CisgICAgdjhpMTYgaW4wID0geyAwIH0sIGluMSA9IHsgMCB9LCBpbjIgPSB7IDAgfSwgaW4zID0geyAwIH07CiAgICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3I7CiAKICAgICBzcmMwX3B0ciAtPSAoc3JjX3N0cmlkZSArIDEpOwpAQCAtMzY0NywxMCArMzk0Miw5IEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKQEAgLTM2NjEsOTAgKzM5NTUsNzUgQEAKICAgICBzcmMwX3B0ciArPSAoMyAqIHNyY19zdHJpZGUpOwogICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwogCi0gICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKLSAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0gICAgSUxWUl9IMl9TSChkc3QxLCBkc3QwLCBkc3QyLCBkc3QxLCBkc3QxMF9yLCBkc3QyMV9yKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMyLCBzcmMxLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIGRzdDEwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgSUxWUkxfSDJfU0goZHN0MjEsIGRzdDEwLCBkc3QxMF9yLCBkc3QyMV9yKTsKKyAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QyMSwgMSk7CisKIAogICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMzsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0I4KHNyYzBfcHRyLCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogICAgICAgICBzcmMwX3B0ciArPSAoOCAqIHNyY19zdHJpZGUpOwotICAgICAgICBMRF9TSDgoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7Ci0gICAgICAgIHNyYzFfcHRyICs9ICg4ICogc3JjMl9zdHJpZGUpOwotICAgICAgICBJTFZSX0QyX1NIKGluMSwgaW4wLCBpbjMsIGluMiwgaW4wLCBpbjEpOwotICAgICAgICBJTFZSX0QyX1NIKGluNSwgaW40LCBpbjcsIGluNiwgaW4yLCBpbjMpOwogICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7Ci0gICAgICAgIC8qIHJvdyAzICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0gICAgICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0MywgZHN0Mik7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjNywgc3JjMywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM4LCBzcmM0LCBzcmM4LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzksIHNyYzUsIHNyYzksIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjMTAsIHNyYzYsIHNyYzEwLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworCisgICAgICAgIGRzdDczID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0ODQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q5NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEwNiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisKKyAgICAgICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3Q3MywgZHN0MjIpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q4NCwgZHN0NzMsIGRzdDQzX3IsIGRzdDg3X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q5NSwgZHN0ODQsIGRzdDU0X3IsIGRzdDk4X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDYsIGRzdDk1LCBkc3Q2NV9yLCBkc3QxMDlfcik7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDczLCAxKTsKKyAgICAgICAgZHN0NzZfciA9IF9fbXNhX2lsdnJfaChkc3QyMiwgZHN0MTA2KTsKKworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIHNyYzFfcHRyICs9IDIgKiBzcmMyX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjApOworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIHNyYzFfcHRyICs9IDIgKiBzcmMyX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjEpOworCisgICAgICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gMiAqIHNyYzJfc3RyaWRlOworICAgICAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMik7CisgICAgICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gMiAqIHNyYzJfc3RyaWRlOworICAgICAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMyk7CisKKyAgICAgICAgQUREU19TSDRfU0goaW4wLCBjb25zdF92ZWMsIGluMSwgY29uc3RfdmVjLCBpbjIsIGNvbnN0X3ZlYywgaW4zLAorICAgICAgICAgICAgICAgICAgICBjb25zdF92ZWMsIGluMCwgaW4xLCBpbjIsIGluMyk7CiAgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QwX3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA0ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0gICAgICAgIGRzdDQzX3IgPSBfX21zYV9pbHZyX2goZHN0NCwgZHN0Myk7CiAgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QxX3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA1ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7Ci0gICAgICAgIGRzdDU0X3IgPSBfX21zYV9pbHZyX2goZHN0NSwgZHN0NCk7CiAgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QyX3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA2ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NiwgZHN0Nik7Ci0gICAgICAgIGRzdDY1X3IgPSBfX21zYV9pbHZyX2goZHN0NiwgZHN0NSk7CiAgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QzX3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA3ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NywgZHN0Nyk7Ci0gICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0NywgZHN0Nik7CiAgICAgICAgIGRzdDRfciA9IEhFVkNfRklMVF80VEFQKGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q0X3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA4ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0OCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0OCwgZHN0OCk7Ci0gICAgICAgIGRzdDg3X3IgPSBfX21zYV9pbHZyX2goZHN0OCwgZHN0Nyk7CiAgICAgICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q1X3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA5ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjOSwgc3JjOSwgc3JjOSwgc3JjOSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0OSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0OSwgZHN0OSk7Ci0gICAgICAgIGRzdDEwX3IgPSBfX21zYV9pbHZyX2goZHN0OSwgZHN0OCk7Ci0gICAgICAgIGRzdDZfciA9IEhFVkNfRklMVF80VEFQKGRzdDc2X3IsIGRzdDEwX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q2X3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyAxMCAqLwotICAgICAgICBWU0hGX0IyX1NCKHNyYzEwLCBzcmMxMCwgc3JjMTAsIHNyYzEwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICAgICAgZHN0MjFfciA9IF9fbXNhX2lsdnJfaChkc3QyLCBkc3Q5KTsKLSAgICAgICAgZHN0N19yID0gSEVWQ19GSUxUXzRUQVAoZHN0ODdfciwgZHN0MjFfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDdfciA+Pj0gNjsKKyAgICAgICAgZHN0Nl9yID0gSEVWQ19GSUxUXzRUQVAoZHN0NzZfciwgZHN0OThfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDdfciA9IEhFVkNfRklMVF80VEFQKGRzdDg3X3IsIGRzdDEwOV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgU1JBXzRWKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgNik7CisgICAgICAgIFNSQV80Vihkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3IsIDYpOwogICAgICAgICBQQ0tFVl9INF9TSChkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsCiAgICAgICAgICAgICAgICAgICAgIGRzdDVfciwgZHN0NF9yLCBkc3Q3X3IsIGRzdDZfciwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7Ci0gICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7Ci0KLSAgICAgICAgUENLRVZfQjJfU0godG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wMCwgdG1wMSk7Ci0gICAgICAgIFNUNHg4X1VCKHRtcDAsIHRtcDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIEFERFNfU0g0X1NIKGluMCwgdG1wMCwgaW4xLCB0bXAxLCBpbjIsIHRtcDIsIGluMywgdG1wMywgdG1wMCwgdG1wMSwKKyAgICAgICAgICAgICAgICAgICAgdG1wMiwgdG1wMyk7CisgICAgICAgIFNSQVJJX0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOworICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwX3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QyMV9yID0gZHN0MTA5X3I7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDEwNiwgMSk7CiAgICAgfQogfQogCkBAIC0zNzYwLDEwICs0MDM5LDEwIEBACiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfaHZfYmlfNHRfNHgyX21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSk7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h2X2JpXzR0XzR4NF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3kpOwogICAgIH0gZWxzZSBpZiAoMCA9PSAoaGVpZ2h0ICUgOCkpIHsKICAgICAgICAgaGV2Y19odl9iaV80dF80bXVsdHg4bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKQEAgLTM3ODIsMjAgKzQwNjEsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwotICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKKyAgICB1aW50MzJfdCB0cHcwLCB0cHcxLCB0cHcyLCB0cHczOworICAgIHVpbnQ2NF90IHRwMCwgdHAxOworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKICAgICB2MTZpOCBtYXNrMTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OworICAgIHY4aTE2IGRzdGgwLCBkc3RoMSwgZHN0aDIsIGRzdGgzLCBkc3RoNCwgZHN0aDUsIGRzdGg2LCBkc3RoNywgZHN0aDgsIGRzdGg5OworICAgIHY4aTE2IGRzdGgxMCwgdG1wNCwgdG1wNTsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKKyAgICB2NGkzMiBkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3I7CiAgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwogICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDIxX2wsIGRzdDQzX2w7CisgICAgdjhpMTYgZHN0NTRfciwgZHN0NzZfciwgZHN0OThfciwgZHN0NjVfciwgZHN0ODdfciwgZHN0MTA5X3I7CisgICAgdjhpMTYgZHN0NTRfbCwgZHN0NzZfbCwgZHN0OThfbCwgZHN0NjVfbCwgZHN0ODdfbCwgZHN0MTA5X2w7CisgICAgdjhpMTYgZHN0MTAyMV9sLCBkc3QzMjQzX2wsIGRzdDU0NjVfbCwgZHN0NzY4N19sLCBkc3Q5ODEwOV9sOworICAgIHY4aTE2IGluMCA9IHsgMCB9LCBpbjEgPSB7IDAgfSwgaW4yID0geyAwIH0sIGluMyA9IHsgMCB9OworICAgIHY4aTE2IGluNCA9IHsgMCB9LCBpbjUgPSB7IDAgfTsKIAogICAgIHNyYzBfcHRyIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTM4MDMsMTAgKzQwOTAsOSBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCkBAIC0zODIwLDcxICs0MTA2LDEwMSBAQAogICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwogCi0gICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7CisgICAgZHN0aDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGgxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDI7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7Ci0gICAgICAgIHNyYzBfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIExEX1NINChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7Ci0gICAgICAgIHNyYzFfcHRyICs9ICg0ICogc3JjMl9zdHJpZGUpOwotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMSwgZHN0aDAsIGRzdDEwX3IsIGRzdDEwX2wpOworICAgIElMVlJMX0gyX1NIKGRzdGgyLCBkc3RoMSwgZHN0MjFfciwgZHN0MjFfbCk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKKyAgICBMRF9TQjgoc3JjMF9wdHIsIHNyY19zdHJpZGUsCisgICAgICAgICAgIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICBYT1JJX0I4XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CiAKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QwX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9sLCBkc3QzMl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MF9yID4+PSA2OwotICAgICAgICBkc3QwX2wgPj49IDY7CisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7CisgICAgZHN0aDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGg0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoNSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOwotICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDFfciA+Pj0gNjsKLSAgICAgICAgZHN0MV9sID4+PSA2OworICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmM5LCBzcmM5LCBzcmM5LCBzcmM5LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjMTAsIHNyYzEwLCBzcmMxMCwgc3JjMTAsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKKyAgICBkc3RoNyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDggPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGg5ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMTAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDEwX3IsIGRzdDEwX2wpOwotICAgICAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3QxMF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0Ml9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfbCwgZHN0MTBfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDJfciA+Pj0gNjsKLSAgICAgICAgZHN0Ml9sID4+PSA2OworICAgIElMVlJMX0gyX1NIKGRzdGgzLCBkc3RoMiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDQsIGRzdGgzLCBkc3Q0M19yLCBkc3Q0M19sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoNSwgZHN0aDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg2LCBkc3RoNSwgZHN0NjVfciwgZHN0NjVfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDcsIGRzdGg2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoOCwgZHN0aDcsIGRzdDg3X3IsIGRzdDg3X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg5LCBkc3RoOCwgZHN0OThfciwgZHN0OThfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDEwLCBkc3RoOSwgZHN0MTA5X3IsIGRzdDEwOV9sKTsKKyAgICBQQ0tFVl9EMl9TSChkc3QyMV9sLCBkc3QxMF9sLCBkc3Q0M19sLCBkc3QzMl9sLCBkc3QxMDIxX2wsIGRzdDMyNDNfbCk7CisgICAgUENLRVZfRDJfU0goZHN0NjVfbCwgZHN0NTRfbCwgZHN0ODdfbCwgZHN0NzZfbCwgZHN0NTQ2NV9sLCBkc3Q3Njg3X2wpOworICAgIGRzdDk4MTA5X2wgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2QoKHYyaTY0KSBkc3QxMDlfbCwgKHYyaTY0KSBkc3Q5OF9sKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOworICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDRfciA9IEhFVkNfRklMVF80VEFQKGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDZfciA9IEhFVkNfRklMVF80VEFQKGRzdDc2X3IsIGRzdDk4X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDdfciA9IEhFVkNfRklMVF80VEFQKGRzdDg3X3IsIGRzdDEwOV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QwX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMDIxX2wsIGRzdDMyNDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MzI0M19sLCBkc3Q1NDY1X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDU0NjVfbCwgZHN0NzY4N19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Njg3X2wsIGRzdDk4MTA5X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNSQV80Vihkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIDYpOworICAgIFNSQV80Vihkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3IsIDYpOworICAgIFNSQV80Vihkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIDYpOworICAgIFBDS0VWX0gyX1NIKGRzdDFfciwgZHN0MF9yLCBkc3QzX3IsIGRzdDJfciwgdG1wMCwgdG1wMSk7CisgICAgUENLRVZfSDJfU0goZHN0NV9yLCBkc3Q0X3IsIGRzdDdfciwgZHN0Nl9yLCB0bXAyLCB0bXAzKTsKKyAgICBQQ0tFVl9IMl9TSChkc3QxX2wsIGRzdDBfbCwgZHN0M19sLCBkc3QyX2wsIHRtcDQsIHRtcDUpOwogCi0gICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDUsIGRzdDIxX3IsIGRzdDIxX2wpOwotICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3QyMV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0MjFfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDNfciA+Pj0gNjsKLSAgICAgICAgZHN0M19sID4+PSA2OwotICAgICAgICBQQ0tFVl9INF9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7Ci0gICAgICAgIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgTEQyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHAwLCB0cDEpOworICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4wKTsKKyAgICBMRDIoc3JjMV9wdHIgKyAyICogc3JjMl9zdHJpZGUsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjEpOwogCi0gICAgICAgIFBDS0VWX0IyX1NXKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1Q2eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBMRDIoc3JjMV9wdHIgKyA0ICogc3JjMl9zdHJpZGUsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjIpOworICAgIExEMihzcmMxX3B0ciArIDYgKiBzcmMyX3N0cmlkZSwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMyk7CisKKyAgICBBRERTX1NINF9TSChpbjAsIGNvbnN0X3ZlYywgaW4xLCBjb25zdF92ZWMsIGluMiwgY29uc3RfdmVjLCBpbjMsIGNvbnN0X3ZlYywKKyAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgIEFERFNfU0g0X1NIKGluMCwgdG1wMCwgaW4xLCB0bXAxLCBpbjIsIHRtcDIsIGluMywgdG1wMywgdG1wMCwgdG1wMSwgdG1wMiwKKyAgICAgICAgICAgICAgICB0bXAzKTsKKyAgICBTUkFSSV9INF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKKyAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICBQQ0tFVl9CMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCBvdXQwLCBvdXQxKTsKKyAgICBTVDR4OF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOworCisgICAgTFc0KHNyYzFfcHRyICsgNCwgc3JjMl9zdHJpZGUsIHRwdzAsIHRwdzEsIHRwdzIsIHRwdzMpOworICAgIHNyYzFfcHRyICs9ICg0ICogc3JjMl9zdHJpZGUpOworICAgIElOU0VSVF9XNF9TSCh0cHcwLCB0cHcxLCB0cHcyLCB0cHczLCBpbjQpOworICAgIExXNChzcmMxX3B0ciArIDQsIHNyYzJfc3RyaWRlLCB0cHcwLCB0cHcxLCB0cHcyLCB0cHczKTsKKyAgICBJTlNFUlRfVzRfU0godHB3MCwgdHB3MSwgdHB3MiwgdHB3MywgaW41KTsKKyAgICBBRERTX1NIMl9TSChpbjQsIGNvbnN0X3ZlYywgaW41LCBjb25zdF92ZWMsIGluNCwgaW41KTsKKyAgICBBRERTX1NIMl9TSChpbjQsIHRtcDQsIGluNSwgdG1wNSwgdG1wNCwgdG1wNSk7CisgICAgU1JBUklfSDJfU0godG1wNCwgdG1wNSwgNyk7CisgICAgQ0xJUF9TSDJfMF8yNTVfTUFYX1NBVFUodG1wNCwgdG1wNSk7CisgICAgb3V0MiA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHRtcDUsICh2MTZpOCkgdG1wNCk7CisgICAgU1QyeDRfVUIob3V0MiwgMCwgZHN0ICsgNCwgZHN0X3N0cmlkZSk7CisgICAgZHN0ICs9IDQgKiBkc3Rfc3RyaWRlOworICAgIFNUMng0X1VCKG91dDIsIDQsIGRzdCArIDQsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X2JpXzR0Xzh4Ml9tc2EodWludDhfdCAqc3JjMF9wdHIsCkBAIC0zODk0LDE2ICs0MjEwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSkKIHsKKyAgICB2MTZ1OCBvdXQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKICAgICB2MTZpOCBtYXNrMTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQ7CiAgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sOwogICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDIxX3IsIGRzdDQzX3I7CkBAIC0zOTE3LDYyICs0MjMzLDE0NCBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCiAgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKICAgICBjb25zdF92ZWMgPDw9IDY7CiAKLSAgICBMRF9TQjMoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYzBfcHRyICs9ICgzICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisgICAgTERfU0I1KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKworICAgIExEX1NIMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xKTsKKyAgICBBRERTX1NIMl9TSChpbjAsIGNvbnN0X3ZlYywgaW4xLCBjb25zdF92ZWMsIGluMCwgaW4xKTsKIAogICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOworICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjOCwgdmVjOSk7CisKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjOCwgdmVjOSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIElMVlJMX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDEwX3IsIGRzdDEwX2wpOwogICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDEsIGRzdDIxX3IsIGRzdDIxX2wpOwotCi0gICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKLSAgICBMRF9TSDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7Ci0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQogICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOwogICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDBfciA+Pj0gNjsKLSAgICBkc3QwX2wgPj49IDY7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLQotICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOwogICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDFfciA+Pj0gNjsKLSAgICBkc3QxX2wgPj49IDY7Ci0KKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKICAgICBQQ0tFVl9IMl9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIHRtcDAsIHRtcDEpOwotICAgIEhFVkNfQklfUk5EX0NMSVAyKGluMCwgaW4xLCB0bXAwLCB0bXAxLCA3LCB0bXAwLCB0bXAxKTsKKyAgICBBRERTX1NIMl9TSChpbjAsIHRtcDAsIGluMSwgdG1wMSwgdG1wMCwgdG1wMSk7CisgICAgU1JBUklfSDJfU0godG1wMCwgdG1wMSwgNyk7CisgICAgQ0xJUF9TSDJfMF8yNTVfTUFYX1NBVFUodG1wMCwgdG1wMSk7CisgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wMSwgKHYxNmk4KSB0bXAwKTsKKyAgICBTVDh4Ml9VQihvdXQsIGRzdCwgZHN0X3N0cmlkZSk7Cit9CiAKLSAgICBkc3QwX3IgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAxLCAodjE2aTgpIHRtcDApOwotICAgIFNUOHgyX1VCKGRzdDBfciwgZHN0LCBkc3Rfc3RyaWRlKTsKK3N0YXRpYyB2b2lkIGhldmNfaHZfYmlfNHRfOG11bHR4NF9tc2EodWludDhfdCAqc3JjMF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjMV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjMl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoOG11bHQpCit7CisgICAgdWludDMyX3QgY250OworICAgIHYxNnU4IG91dDAsIG91dDE7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgbWFzazAsIG1hc2sxOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7CisgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2w7CisgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfcjsKKyAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sOworCisgICAgc3JjMF9wdHIgLT0gKHNyY19zdHJpZGUgKyAxKTsKKworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeCk7CisgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CisKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisKKyAgICBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOworICAgIG1hc2sxID0gbWFzazAgKyAyOworCisgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKKyAgICBjb25zdF92ZWMgPDw9IDY7CisKKyAgICBmb3IgKGNudCA9IHdpZHRoOG11bHQ7IGNudC0tOykgeworICAgICAgICBMRF9TQjcoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgICAgICBzcmMwX3B0ciArPSA4OworICAgICAgICBYT1JJX0I3XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKworICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgICAgICBzcmMxX3B0ciArPSA4OworICAgICAgICBBRERTX1NINF9TSChpbjAsIGNvbnN0X3ZlYywgaW4xLCBjb25zdF92ZWMsIGluMiwgY29uc3RfdmVjLCBpbjMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ZlYywgaW4wLCBpbjEsIGluMiwgaW4zKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworCisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDEsIGRzdDIxX3IsIGRzdDIxX2wpOworCisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKworICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBkc3QyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q2LCBkc3Q1LCBkc3Q2NV9yLCBkc3Q2NV9sKTsKKworICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDU0X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisKKyAgICAgICAgU1JBXzRWKGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgNik7CisgICAgICAgIFNSQV80Vihkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2wsIDYpOworICAgICAgICBQQ0tFVl9INF9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsCisgICAgICAgICAgICAgICAgICAgIGRzdDNfciwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIEFERFNfU0g0X1NIKGluMCwgdG1wMCwgaW4xLCB0bXAxLCBpbjIsIHRtcDIsIGluMywgdG1wMywKKyAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFNSQVJJX0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOworICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSA4OworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaV80dF84eDZfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMzk4MiwxNyArNDM4MCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kpCiB7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MjsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjU7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgdmVjOCwgdmVjOTsKKyAgICB2MTZpOCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCB2ZWMxNiwgdmVjMTc7CiAgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBkc3Q4OwogICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOwpAQCAtNDAwOCwxMjAgKzQ0MDcsODcgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAogICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogCi0gICAgTERfU0IzKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBzcmMwX3B0ciArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEX1NCNShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgc3JjMF9wdHIgKz0gKDUgKiBzcmNfc3RyaWRlKTsKKyAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworCisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBMRF9TSDYoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41KTsKKyAgICBBRERTX1NINF9TSChpbjAsIGNvbnN0X3ZlYywgaW4xLCBjb25zdF92ZWMsIGluMiwgY29uc3RfdmVjLCBpbjMsIGNvbnN0X3ZlYywKKyAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgIEFERFNfU0gyX1NIKGluNCwgY29uc3RfdmVjLCBpbjUsIGNvbnN0X3ZlYywgaW40LCBpbjUpOworCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWM4LCB2ZWM5KTsKKyAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMTAsIHZlYzExKTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMTIsIHZlYzEzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMTQsIHZlYzE1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMTYsIHZlYzE3KTsKKworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM4LCB2ZWM5LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzEyLCB2ZWMxMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q3ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDggPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxNiwgdmVjMTcsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKICAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3QxLCBkc3QyMV9yLCBkc3QyMV9sKTsKLQotICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLSAgICBMRF9TSDYoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41KTsKLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQogICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDYsIGRzdDUsIGRzdDY1X3IsIGRzdDY1X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDcsIGRzdDYsIGRzdDc2X3IsIGRzdDc2X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOworCiAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MF9yID4+PSA2OwotICAgIGRzdDBfbCA+Pj0gNjsKLSAgICB0bXAwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDBfbCwgKHY4aTE2KSBkc3QwX3IpOwotCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0KLSAgICBJTFZSTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q0M19yLCBkc3Q0M19sKTsKICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QxX3IgPj49IDY7Ci0gICAgZHN0MV9sID4+PSA2OwotICAgIHRtcDEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MV9sLCAodjhpMTYpIGRzdDFfcik7Ci0KLSAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYpOwotICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7Ci0gICAgLyogcm93IDUgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKLQotICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOwogICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDU0X2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDJfciA+Pj0gNjsKLSAgICBkc3QyX2wgPj49IDY7Ci0gICAgdG1wMiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QyX2wsICh2OGkxNikgZHN0Ml9yKTsKLQotICAgIC8qIHJvdyA2ICovCi0gICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDYgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NiwgZHN0Nik7Ci0KLSAgICBJTFZSTF9IMl9TSChkc3Q2LCBkc3Q1LCBkc3Q2NV9yLCBkc3Q2NV9sKTsKICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19sLCBkc3Q2NV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QzX3IgPj49IDY7Ci0gICAgZHN0M19sID4+PSA2OwotICAgIHRtcDMgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0M19sLCAodjhpMTYpIGRzdDNfcik7Ci0KLSAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgpOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzcsIHNyYzgpOwotICAgIC8qIHJvdyA3ICovCi0gICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDcgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NywgZHN0Nyk7Ci0KLSAgICBJTFZSTF9IMl9TSChkc3Q3LCBkc3Q2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKICAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3Q0X2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9sLCBkc3Q3Nl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLQotICAgIGRzdDRfciA+Pj0gNjsKLSAgICBkc3Q0X2wgPj49IDY7Ci0gICAgdG1wNCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3Q0X2wsICh2OGkxNikgZHN0NF9yKTsKLSAgICAvKiByb3cgOCAqLwotICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q4ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDgsIGRzdDgpOwotCi0gICAgSUxWUkxfSDJfU0goZHN0OCwgZHN0NywgZHN0ODdfciwgZHN0ODdfbCk7CiAgICAgZHN0NV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0NjVfciwgZHN0ODdfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0NV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0NjVfbCwgZHN0ODdfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0NV9yID4+PSA2OwotICAgIGRzdDVfbCA+Pj0gNjsKLSAgICB0bXA1ID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDVfbCwgKHY4aTE2KSBkc3Q1X3IpOwogCi0gICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAotICAgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOwotICAgIEhFVkNfQklfUk5EX0NMSVAyKGluNCwgaW41LCB0bXA0LCB0bXA1LCA3LCB0bXA0LCB0bXA1KTsKLQotICAgIFBDS0VWX0IyX1NXKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIGRzdDBfciwgZHN0MV9yKTsKLSAgICBkc3QyX3IgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXA1LCAodjE2aTgpIHRtcDQpOwotICAgIFNUOHg0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgIFNSQV80Vihkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2wsIDYpOworICAgIFNSQV80Vihkc3Q0X3IsIGRzdDRfbCwgZHN0NV9yLCBkc3Q1X2wsIDYpOworICAgIFBDS0VWX0g0X1NIKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLAorICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIFBDS0VWX0gyX1NIKGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwgdG1wNCwgdG1wNSk7CisgICAgQUREU19TSDRfU0goaW4wLCB0bXAwLCBpbjEsIHRtcDEsIGluMiwgdG1wMiwgaW4zLCB0bXAzLAorICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIEFERFNfU0gyX1NIKGluNCwgdG1wNCwgaW41LCB0bXA1LCB0bXA0LCB0bXA1KTsKKyAgICBTUkFSSV9INF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKKyAgICBTUkFSSV9IMl9TSCh0bXA0LCB0bXA1LCA3KTsKKyAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICBDTElQX1NIMl8wXzI1NV9NQVhfU0FUVSh0bXA0LCB0bXA1KTsKKyAgICBQQ0tFVl9CMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCBvdXQwLCBvdXQxKTsKKyAgICBvdXQyID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wNSwgKHYxNmk4KSB0bXA0KTsKKyAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIFNUOHgyX1VCKGRzdDJfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDh4Ml9VQihvdXQyLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X2JpXzR0XzhtdWx0eDRtdWx0X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTQxMzksMTkgKzQ1MDUsMjEgQEAKICAgICB1aW50OF90ICpzcmMwX3B0cl90bXA7CiAgICAgaW50MTZfdCAqc3JjMV9wdHJfdG1wOwogICAgIHVpbnQ4X3QgKmRzdF90bXA7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKICAgICB2MTZpOCBtYXNrMTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7CiAgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2w7CiAgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwogICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDIxX2wsIGRzdDQzX2w7CisgICAgdjhpMTYgZHN0NTRfciwgZHN0NTRfbCwgZHN0NjVfciwgZHN0NjVfbCwgZHN0NjsKIAogICAgIHNyYzBfcHRyIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTQxNTksMTAgKzQ1MjcsOSBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCkBAIC00MTgxLDEyICs0NTQ4LDEwIEBACiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKIAogICAgICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKICAgICAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7CkBAIC00MTk4LDU1ICs0NTYzLDUwIEBACiAgICAgICAgICAgICBzcmMxX3B0cl90bXAgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CiAgICAgICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKIAorICAgICAgICAgICAgQUREU19TSDRfU0goaW4wLCBjb25zdF92ZWMsIGluMSwgY29uc3RfdmVjLCBpbjIsIGNvbnN0X3ZlYywgaW4zLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfdmVjLCBpbjAsIGluMSwgaW4yLCBpbjMpOworCiAgICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisKKyAgICAgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOwogCiAgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBkc3QyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0NTRfciwgZHN0NTRfbCk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3Q2LCBkc3Q1LCBkc3Q2NV9yLCBkc3Q2NV9sKTsKKwogICAgICAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgICAgICAgICBkc3QwX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9sLCBkc3QzMl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgICAgIGRzdDBfciA+Pj0gNjsKLSAgICAgICAgICAgIGRzdDBfbCA+Pj0gNjsKLQotICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotCi0gICAgICAgICAgICBJTFZSTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q0M19yLCBkc3Q0M19sKTsKICAgICAgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgICAgICAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgICAgICBkc3QxX3IgPj49IDY7Ci0gICAgICAgICAgICBkc3QxX2wgPj49IDY7CisgICAgICAgICAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDU0X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgICAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19sLCBkc3Q2NV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAotICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotCi0gICAgICAgICAgICBJTFZSTF9IMl9TSChkc3Q1LCBkc3Q0LCBkc3QxMF9yLCBkc3QxMF9sKTsKLSAgICAgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDEwX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0Ml9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfbCwgZHN0MTBfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgICAgICBkc3QyX3IgPj49IDY7Ci0gICAgICAgICAgICBkc3QyX2wgPj49IDY7Ci0KLSAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLQotICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0NSwgZHN0MjFfciwgZHN0MjFfbCk7Ci0gICAgICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3QyMV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgICAgIGRzdDNfbCA9IEhFVkNfRklMVF80VEFQKGRzdDQzX2wsIGRzdDIxX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0M19yID4+PSA2OwotICAgICAgICAgICAgZHN0M19sID4+PSA2OwotCi0gICAgICAgICAgICBQQ0tFVl9INF9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOwotICAgICAgICAgICAgSEVWQ19CSV9STkRfQ0xJUDQoaW4wLCBpbjEsIGluMiwgaW4zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOwotCi0gICAgICAgICAgICBQQ0tFVl9CMl9TVyh0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgICAgICBTVDh4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBTUkFfNFYoZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKKyAgICAgICAgICAgIFNSQV80Vihkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2wsIDYpOworICAgICAgICAgICAgUENLRVZfSDRfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QyX2wsIGRzdDJfciwgZHN0M19sLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0M19yLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgICAgIEFERFNfU0g0X1NIKGluMCwgdG1wMCwgaW4xLCB0bXAxLCBpbjIsIHRtcDIsIGluMywgdG1wMywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICAgICAgU1JBUklfSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CisgICAgICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgICAgIFBDS0VWX0IyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIG91dDAsIG91dDEpOworICAgICAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7CiAgICAgICAgICAgICBkc3RfdG1wICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgICAgIGRzdDEwX3IgPSBkc3Q1NF9yOworICAgICAgICAgICAgZHN0MTBfbCA9IGRzdDU0X2w7CisgICAgICAgICAgICBkc3QyMV9yID0gZHN0NjVfcjsKKyAgICAgICAgICAgIGRzdDIxX2wgPSBkc3Q2NV9sOworICAgICAgICAgICAgZHN0MiA9IGRzdDY7CiAgICAgICAgIH0KIAogICAgICAgICBzcmMwX3B0ciArPSA4OwpAQCAtNDI2NywxMCArNDYyNywxMyBAQAogewogICAgIGlmICgyID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h2X2JpXzR0Xzh4Ml9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3kpOworICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgaGV2Y19odl9iaV80dF84bXVsdHg0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LCAxKTsKICAgICB9IGVsc2UgaWYgKDYgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfaHZfYmlfNHRfOHg2X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaGV2Y19odl9iaV80dF84bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKQEAgLTQyODksMTEgKzQ2NTIsMTk2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2X2JpXzR0XzhtdWx0eDRtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgOCk7Ci0gICAgaGV2Y19odl9iaV80dF80d19tc2Eoc3JjMF9wdHIgKyA4LCBzcmNfc3RyaWRlLCBzcmMxX3B0ciArIDgsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArIDgsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0KTsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB1aW50NjRfdCB0cDAsIHRwMTsKKyAgICB1aW50OF90ICpzcmMwX3B0cl90bXAsICpkc3RfdG1wOworICAgIGludDE2X3QgKnNyYzFfcHRyX3RtcDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazM7CisgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0ZXJfdmVjLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHY4aTE2IGRzdGgwLCBkc3RoMSwgZHN0aDIsIGRzdGgzLCBkc3RoNCwgZHN0aDUsIGRzdGg2LCBjb25zdF92ZWM7CisgICAgdjhpMTYgZHN0MTAsIGRzdDIxLCBkc3QyMiwgZHN0NzMsIGRzdDg0LCBkc3Q5NSwgZHN0MTA2OworICAgIHY4aTE2IGRzdDc2X3IsIGRzdDk4X3IsIGRzdDg3X3IsIGRzdDEwOV9yOworICAgIHY4aTE2IGluMCA9IHsgMCB9LCBpbjEgPSB7IDAgfSwgaW4yID0geyAwIH0sIGluMyA9IHsgMCB9OworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3I7CisgICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbDsKKyAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworCisgICAgc3JjMF9wdHIgLT0gKHNyY19zdHJpZGUgKyAxKTsKKworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeCk7CisgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CisKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisKKyAgICBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOworICAgIG1hc2sxID0gbWFzazAgKyAyOworCisgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKKyAgICBjb25zdF92ZWMgPDw9IDY7CisKKyAgICBzcmMwX3B0cl90bXAgPSBzcmMwX3B0cjsKKyAgICBkc3RfdG1wID0gZHN0OworICAgIHNyYzFfcHRyX3RtcCA9IHNyYzFfcHRyOworCisgICAgTERfU0IzKHNyYzBfcHRyX3RtcCwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgc3JjMF9wdHJfdG1wICs9ICgzICogc3JjX3N0cmlkZSk7CisKKyAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworCisgICAgZHN0aDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGgxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisKKyAgICBJTFZSTF9IMl9TSChkc3RoMSwgZHN0aDAsIGRzdDEwX3IsIGRzdDEwX2wpOworICAgIElMVlJMX0gyX1NIKGRzdGgyLCBkc3RoMSwgZHN0MjFfciwgZHN0MjFfbCk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYzBfcHRyX3RtcCwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgICAgIHNyYzBfcHRyX3RtcCArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKworICAgICAgICBMRF9TSDQoc3JjMV9wdHJfdG1wLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgICAgICAgc3JjMV9wdHJfdG1wICs9ICg0ICogc3JjMl9zdHJpZGUpOworICAgICAgICBBRERTX1NINF9TSChpbjAsIGNvbnN0X3ZlYywgaW4xLCBjb25zdF92ZWMsIGluMiwgY29uc3RfdmVjLCBpbjMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X3ZlYywgaW4wLCBpbjEsIGluMiwgaW4zKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisKKyAgICAgICAgZHN0aDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3RoNCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdGg1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0aDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworCisgICAgICAgIElMVlJMX0gyX1NIKGRzdGgzLCBkc3RoMiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg0LCBkc3RoMywgZHN0NDNfciwgZHN0NDNfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg1LCBkc3RoNCwgZHN0NTRfciwgZHN0NTRfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg2LCBkc3RoNSwgZHN0NjVfciwgZHN0NjVfbCk7CisKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDNfbCA9IEhFVkNfRklMVF80VEFQKGRzdDQzX2wsIGRzdDY1X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICAgICAgUENLRVZfSDRfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QyX2wsIGRzdDJfciwgZHN0M19sLAorICAgICAgICAgICAgICAgICAgICBkc3QzX3IsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBBRERTX1NINF9TSChpbjAsIHRtcDAsIGluMSwgdG1wMSwgaW4yLCB0bXAyLCBpbjMsIHRtcDMsCisgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBTUkFSSV9INF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTVfTUFYX1NBVFUodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFBDS0VWX0IyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIG91dDAsIG91dDEpOworICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0X3RtcCArPSAoNCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwX3IgPSBkc3Q1NF9yOworICAgICAgICBkc3QxMF9sID0gZHN0NTRfbDsKKyAgICAgICAgZHN0MjFfciA9IGRzdDY1X3I7CisgICAgICAgIGRzdDIxX2wgPSBkc3Q2NV9sOworICAgICAgICBkc3RoMiA9IGRzdGg2OworICAgIH0KKworICAgIHNyYzBfcHRyICs9IDg7CisgICAgZHN0ICs9IDg7CisgICAgc3JjMV9wdHIgKz0gODsKKworICAgIG1hc2syID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKKyAgICBtYXNrMyA9IG1hc2syICsgMjsKKworICAgIExEX1NCMyhzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgc3JjMF9wdHIgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMyLCBzcmMxLCBzcmMyLCBtYXNrMiwgbWFzazMsIHZlYzIsIHZlYzMpOworCisgICAgZHN0MTAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKworICAgIElMVlJMX0gyX1NIKGRzdDIxLCBkc3QxMCwgZHN0MTBfciwgZHN0MjFfcik7CisgICAgZHN0MjIgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MjEsIDEpOworCisgICAgZm9yIChsb29wX2NudCA9IDI7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCOChzcmMwX3B0ciwgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzcsIHNyYzMsIHNyYzcsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjOCwgc3JjNCwgc3JjOCwgbWFzazIsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM5LCBzcmM1LCBzcmM5LCBtYXNrMiwgbWFzazMsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzEwLCBzcmM2LCBzcmMxMCwgbWFzazIsIG1hc2szLCB2ZWM2LCB2ZWM3KTsKKworICAgICAgICBkc3Q3MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDg0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0OTUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxMDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworCisgICAgICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0NzMsIGRzdDIyKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0ODQsIGRzdDczLCBkc3Q0M19yLCBkc3Q4N19yKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0OTUsIGRzdDg0LCBkc3Q1NF9yLCBkc3Q5OF9yKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MTA2LCBkc3Q5NSwgZHN0NjVfciwgZHN0MTA5X3IpOworICAgICAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q3MywgMSk7CisgICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0MjIsIGRzdDEwNik7CisKKyAgICAgICAgTEQyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHAwLCB0cDEpOworICAgICAgICBzcmMxX3B0ciArPSAyICogc3JjMl9zdHJpZGU7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4wKTsKKyAgICAgICAgTEQyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHAwLCB0cDEpOworICAgICAgICBzcmMxX3B0ciArPSAyICogc3JjMl9zdHJpZGU7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4xKTsKKworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIHNyYzFfcHRyICs9IDIgKiBzcmMyX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjIpOworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIHNyYzFfcHRyICs9IDIgKiBzcmMyX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjMpOworCisgICAgICAgIEFERFNfU0g0X1NIKGluMCwgY29uc3RfdmVjLCBpbjEsIGNvbnN0X3ZlYywgaW4yLCBjb25zdF92ZWMsIGluMywKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfdmVjLCBpbjAsIGluMSwgaW4yLCBpbjMpOworCisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQKGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVAoZHN0NjVfciwgZHN0ODdfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Nl9yLCBkc3Q5OF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQKGRzdDg3X3IsIGRzdDEwOV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKworICAgICAgICBTUkFfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFNSQV80Vihkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA2KTsKKyAgICAgICAgUENLRVZfSDRfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0NywgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIEFERFNfU0g0X1NIKGluMCwgdG1wMCwgaW4xLCB0bXAxLCBpbjIsIHRtcDIsIGluMywgdG1wMywKKyAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFNSQVJJX0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOworICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwX3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QyMV9yID0gZHN0MTA5X3I7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDEwNiwgMSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X2JpXzR0XzE2d19tc2EodWludDhfdCAqc3JjMF9wdHIsCkBAIC00MzA2LDkgKzQ4NTQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfaHZfYmlfNHRfOG11bHR4NG11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAxNik7CisgICAgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIGhldmNfaHZfYmlfNHRfOG11bHR4NF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGV2Y19odl9iaV80dF84bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3ksIGhlaWdodCwgMTYpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaV80dF8yNHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNDMzMyw3ICs0ODg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIGhldmNfaHZfYmlfNHRfOG11bHR4NG11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCkBAIC00MzY4LDIyICs0OTIxLDIyIEBACiAKICN1bmRlZiBCSV9NQ19DT1BZCiAKLSNkZWZpbmUgQklfTUMoUEVMLCBESVIsIFdJRFRILCBUQVAsIERJUjEsIEZJTFRfRElSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi12b2lkIGZmX2hldmNfcHV0X2hldmNfYmlfIyNQRUwjI18jI0RJUiMjV0lEVEgjI184X21zYSh1aW50OF90ICpkc3QsICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmNfMTZiaXQsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludDhfdCAqZmlsdGVyID0gZmZfaGV2Y18jI1BFTCMjX2ZpbHRlcnNbRklMVF9ESVIgLSAxXTsgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaGV2Y18jI0RJUjEjI19iaV8jI1RBUCMjdF8jI1dJRFRIIyN3X21zYShzcmMsIHNyY19zdHJpZGUsIHNyY18xNmJpdCwgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BCX1NJWkUsIGRzdCwgZHN0X3N0cmlkZSwgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0KTsgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIEJJX01DKFBFTCwgRElSLCBXSURUSCwgVEFQLCBESVIxLCBGSUxUX0RJUikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfaGV2Y19wdXRfaGV2Y19iaV8jI1BFTCMjXyMjRElSIyNXSURUSCMjXzhfbXNhKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRzdF9zdHJpZGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjXzE2Yml0LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDhfdCAqZmlsdGVyID0gZmZfaGV2Y18jI1BFTCMjX2ZpbHRlcnNbRklMVF9ESVIgLSAxXTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBoZXZjXyMjRElSMSMjX2JpXyMjVEFQIyN0XyMjV0lEVEgjI3dfbXNhKHNyYywgc3JjX3N0cmlkZSwgc3JjXzE2Yml0LCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BCX1NJWkUsIGRzdCwgZHN0X3N0cmlkZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGhlaWdodCk7ICAgICAgICAgICAgICAgIFwKIH0KIAogQklfTUMocXBlbCwgaCwgNCwgOCwgaHosIG14KTsKQEAgLTQ0MjIsNDEgKzQ5NzUsNDAgQEAKIAogI3VuZGVmIEJJX01DCiAKLSNkZWZpbmUgQklfTUNfSFYoUEVMLCBESVIsIFdJRFRILCBUQVAsIERJUjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi12b2lkIGZmX2hldmNfcHV0X2hldmNfYmlfIyNQRUwjI18jI0RJUiMjV0lEVEgjI184X21zYSh1aW50OF90ICpkc3QsICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmNfMTZiaXQsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ggPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteCAtIDFdOyAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95ID0gZmZfaGV2Y18jI1BFTCMjX2ZpbHRlcnNbbXkgLSAxXTsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGhldmNfIyNESVIxIyNfYmlfIyNUQVAjI3RfIyNXSURUSCMjd19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBzcmNfMTZiaXQsICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQl9TSVpFLCBkc3QsIGRzdF9zdHJpZGUsICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgQklfTUNfSFYoUEVMLCBXSURUSCwgVEFQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjX2JpXyMjUEVMIyNfaHYjI1dJRFRIIyNfOF9tc2EodWludDhfdCAqZHN0LCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY19zdHJpZGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmNfMTZiaXQsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXgsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCA9IGZmX2hldmNfIyNQRUwjI19maWx0ZXJzW214IC0gMV07ICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95ID0gZmZfaGV2Y18jI1BFTCMjX2ZpbHRlcnNbbXkgLSAxXTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGV2Y19odl9iaV8jI1RBUCMjdF8jI1dJRFRIIyN3X21zYShzcmMsIHNyY19zdHJpZGUsIHNyY18xNmJpdCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQl9TSVpFLCBkc3QsIGRzdF9zdHJpZGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOyAgICAgICBcCiB9CiAKLUJJX01DX0hWKHFwZWwsIGh2LCA0LCA4LCBodik7Ci1CSV9NQ19IVihxcGVsLCBodiwgOCwgOCwgaHYpOwotQklfTUNfSFYocXBlbCwgaHYsIDEyLCA4LCBodik7Ci1CSV9NQ19IVihxcGVsLCBodiwgMTYsIDgsIGh2KTsKLUJJX01DX0hWKHFwZWwsIGh2LCAyNCwgOCwgaHYpOwotQklfTUNfSFYocXBlbCwgaHYsIDMyLCA4LCBodik7Ci1CSV9NQ19IVihxcGVsLCBodiwgNDgsIDgsIGh2KTsKLUJJX01DX0hWKHFwZWwsIGh2LCA2NCwgOCwgaHYpOworQklfTUNfSFYocXBlbCwgNCwgOCk7CitCSV9NQ19IVihxcGVsLCA4LCA4KTsKK0JJX01DX0hWKHFwZWwsIDEyLCA4KTsKK0JJX01DX0hWKHFwZWwsIDE2LCA4KTsKK0JJX01DX0hWKHFwZWwsIDI0LCA4KTsKK0JJX01DX0hWKHFwZWwsIDMyLCA4KTsKK0JJX01DX0hWKHFwZWwsIDQ4LCA4KTsKK0JJX01DX0hWKHFwZWwsIDY0LCA4KTsKIAotQklfTUNfSFYoZXBlbCwgaHYsIDQsIDQsIGh2KTsKLUJJX01DX0hWKGVwZWwsIGh2LCA4LCA0LCBodik7Ci1CSV9NQ19IVihlcGVsLCBodiwgNiwgNCwgaHYpOwotQklfTUNfSFYoZXBlbCwgaHYsIDEyLCA0LCBodik7Ci1CSV9NQ19IVihlcGVsLCBodiwgMTYsIDQsIGh2KTsKLUJJX01DX0hWKGVwZWwsIGh2LCAyNCwgNCwgaHYpOwotQklfTUNfSFYoZXBlbCwgaHYsIDMyLCA0LCBodik7CitCSV9NQ19IVihlcGVsLCA0LCA0KTsKK0JJX01DX0hWKGVwZWwsIDgsIDQpOworQklfTUNfSFYoZXBlbCwgNiwgNCk7CitCSV9NQ19IVihlcGVsLCAxMiwgNCk7CitCSV9NQ19IVihlcGVsLCAxNiwgNCk7CitCSV9NQ19IVihlcGVsLCAyNCwgNCk7CitCSV9NQ19IVihlcGVsLCAzMiwgNCk7CiAKICN1bmRlZiBCSV9NQ19IVgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2hldmNfbWNfYml3X21zYS5jIGIvbGliYXZjb2RlYy9taXBzL2hldmNfbWNfYml3X21zYS5jCmluZGV4IDA1YTI4ZWMuLmVhNjVmMDAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9oZXZjX21jX2Jpd19tc2EuYworKysgYi9saWJhdmNvZGVjL21pcHMvaGV2Y19tY19iaXdfbXNhLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgLSAyMDE3IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIyLDkgKzIyLDE3IEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy9taXBzL2hldmNkc3BfbWlwcy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvbWlwcy9oZXZjX21hY3Jvc19tc2EuaCIKIAorc3RhdGljIGNvbnN0IHVpbnQ4X3QgZmZfaGV2Y19tYXNrX2FyclsxNiAqIDJdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMHg0MCkpKSA9IHsKKyAgICAvKiA4IHdpZHRoIGNhc2VzICovCisgICAgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwKKyAgICAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAKK307CisKICNkZWZpbmUgSEVWQ19CSVdfUk5EX0NMSVAyKGluMCwgaW4xLCB2ZWMwLCB2ZWMxLCB3Z3QsIHJuZCwgb2Zmc2V0LCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MF9yLCBvdXQxX3IsIG91dDBfbCwgb3V0MV9sKSAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHY0aTMyIG91dDBfciwgb3V0MV9yLCBvdXQwX2wsIG91dDFfbDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBJTFZSX0gyX1NXKGluMCwgdmVjMCwgaW4xLCB2ZWMxLCBvdXQwX3IsIG91dDFfcik7ICAgICAgICAgICAgICAgXAogICAgIElMVkxfSDJfU1coaW4wLCB2ZWMwLCBpbjEsIHZlYzEsIG91dDBfbCwgb3V0MV9sKTsgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM0LDM3ICs0Miw0MSBAQAogICAgIG91dDFfbCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXQsICh2OGkxNikgb3V0MV9sLCAodjhpMTYpIHdndCk7ICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBTUkFSX1c0X1NXKG91dDBfciwgb3V0MV9yLCBvdXQwX2wsIG91dDFfbCwgcm5kKTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MF9yID0gQ0xJUF9TV18wXzI1NShvdXQwX3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvdXQxX3IgPSBDTElQX1NXXzBfMjU1KG91dDFfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG91dDBfbCA9IENMSVBfU1dfMF8yNTUob3V0MF9sKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MV9sID0gQ0xJUF9TV18wXzI1NShvdXQxX2wpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQQ0tFVl9IMl9TSChvdXQwX2wsIG91dDBfciwgb3V0MV9sLCBvdXQxX3IsIG91dDAsIG91dDEpOyAgICAgICAgXAorICAgIENMSVBfU0gyXzBfMjU1KG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLSNkZWZpbmUgSEVWQ19CSVdfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdndCwgcm5kLCBvZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCkgICAgICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBIRVZDX0JJV19STkRfQ0xJUDIoaW4wLCBpbjEsIHZlYzAsIHZlYzEsIHdndCwgcm5kLCBvZmZzZXQsICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0MF9yLCBvdXQxX3IsIG91dDBfbCwgb3V0MV9sKSAgICAgICAgICAgICAgICAgIFwKLSAgICBIRVZDX0JJV19STkRfQ0xJUDIoaW4yLCBpbjMsIHZlYzIsIHZlYzMsIHdndCwgcm5kLCBvZmZzZXQsICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgb3V0Ml9yLCBvdXQzX3IsIG91dDJfbCwgb3V0M19sKSAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgSEVWQ19CSVdfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd2d0LCBybmQsIG9mZnNldCwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIRVZDX0JJV19STkRfQ0xJUDIoaW4wLCBpbjEsIHZlYzAsIHZlYzEsIHdndCwgcm5kLCBvZmZzZXQsIG91dDAsIG91dDEpOyAgXAorICAgIEhFVkNfQklXX1JORF9DTElQMihpbjIsIGluMywgdmVjMiwgdmVjMywgd2d0LCBybmQsIG9mZnNldCwgb3V0Miwgb3V0Myk7ICBcCiB9CiAKLSNkZWZpbmUgSEVWQ19CSV9STkRfQ0xJUDIoaW4wLCBpbjEsIHZlYzAsIHZlYzEsIHJuZF92YWwsIG91dDAsIG91dDEpICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEFERFNfU0gyX1NIKHZlYzAsIGluMCwgdmVjMSwgaW4xLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTUkFSSV9IMl9TSChvdXQwLCBvdXQxLCBybmRfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0xJUF9TSDJfMF8yNTUob3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBIRVZDX0JJV19STkRfQ0xJUDJfTUFYX1NBVFUoaW4wLCBpbjEsIHZlYzAsIHZlYzEsIHdndCwgcm5kLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBvdXQwLCBvdXQxKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHY0aTMyIG91dDBfciwgb3V0MV9yLCBvdXQwX2wsIG91dDFfbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElMVlJfSDJfU1coaW4wLCB2ZWMwLCBpbjEsIHZlYzEsIG91dDBfciwgb3V0MV9yKTsgICAgICAgICAgICAgICAgXAorICAgIElMVkxfSDJfU1coaW4wLCB2ZWMwLCBpbjEsIHZlYzEsIG91dDBfbCwgb3V0MV9sKTsgICAgICAgICAgICAgICAgXAorICAgIG91dDBfciA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXQsICh2OGkxNikgb3V0MF9yLCAodjhpMTYpIHdndCk7ICAgXAorICAgIG91dDFfciA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXQsICh2OGkxNikgb3V0MV9yLCAodjhpMTYpIHdndCk7ICAgXAorICAgIG91dDBfbCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXQsICh2OGkxNikgb3V0MF9sLCAodjhpMTYpIHdndCk7ICAgXAorICAgIG91dDFfbCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXQsICh2OGkxNikgb3V0MV9sLCAodjhpMTYpIHdndCk7ICAgXAorICAgIFNSQVJfVzRfU1cob3V0MF9yLCBvdXQxX3IsIG91dDBfbCwgb3V0MV9sLCBybmQpOyAgICAgICAgICAgICAgICAgXAorICAgIFBDS0VWX0gyX1NIKG91dDBfbCwgb3V0MF9yLCBvdXQxX2wsIG91dDFfciwgb3V0MCwgb3V0MSk7ICAgICAgICAgXAorICAgIENMSVBfU0gyXzBfMjU1X01BWF9TQVRVKG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCi0jZGVmaW5lIEhFVkNfQklfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBybmRfdmFsLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEhFVkNfQklfUk5EX0NMSVAyKGluMCwgaW4xLCB2ZWMwLCB2ZWMxLCBybmRfdmFsLCBvdXQwLCBvdXQxKTsgIFwKLSAgICBIRVZDX0JJX1JORF9DTElQMihpbjIsIGluMywgdmVjMiwgdmVjMywgcm5kX3ZhbCwgb3V0Miwgb3V0Myk7ICBcCisjZGVmaW5lIEhFVkNfQklXX1JORF9DTElQNF9NQVhfU0FUVShpbjAsIGluMSwgaW4yLCBpbjMsIHZlYzAsIHZlYzEsIHZlYzIsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMzLCB3Z3QsIHJuZCwgb2Zmc2V0LCBvdXQwLCBvdXQxLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQyLCBvdXQzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEVWQ19CSVdfUk5EX0NMSVAyX01BWF9TQVRVKGluMCwgaW4xLCB2ZWMwLCB2ZWMxLCB3Z3QsIHJuZCwgb2Zmc2V0LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEVWQ19CSVdfUk5EX0NMSVAyX01BWF9TQVRVKGluMiwgaW4zLCB2ZWMyLCB2ZWMzLCB3Z3QsIHJuZCwgb2Zmc2V0LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfYml3Z3RfY29weV80d19tc2EodWludDhfdCAqc3JjMF9wdHIsCkBAIC04MCw5MyArOTIsNzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CisgICAgdWludDMyX3QgbG9vcF9jbnQsIHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB1aW50NjRfdCB0cGQwLCB0cGQxLCB0cGQyLCB0cGQzOwogICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKICAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2MTZpOCBzcmMwID0geyAwIH0sIHNyYzEgPSB7IDAgfTsKKyAgICB2OGkxNiBpbjAgPSB7IDAgfSwgaW4xID0geyAwIH0sIGluMiA9IHsgMCB9LCBpbjMgPSB7IDAgfTsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB3ZWlnaHRfdmVjOworICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBvZmZzZXRfdmVjLCBybmRfdmVjOwogCiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOwogCiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwotICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICB3ZWlnaHRfdmVjID0gKHY4aTE2KSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKIAogICAgIGlmICgyID09IGhlaWdodCkgewotICAgICAgICB2MTZpOCBzcmMwLCBzcmMxOwotICAgICAgICB2OGkxNiBpbjAsIGluMSwgZHN0MDsKLSAgICAgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2w7Ci0KLSAgICAgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgTERfU0gyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEpOwotICAgICAgICBpbjAgPSAodjhpMTYpIF9fbXNhX2lsdnJfZCgodjJpNjQpIGluMSwgKHYyaTY0KSBpbjApOwotICAgICAgICBzcmMwID0gKHYxNmk4KSBfX21zYV9pbHZyX3coKHY0aTMyKSBzcmMxLCAodjRpMzIpIHNyYzApOworICAgICAgICBMVzIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX1cyX1NCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgTEQyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHBkMCwgdHBkMSk7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cGQwLCB0cGQxLCBpbjApOwogCiAgICAgICAgIGRzdDAgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih6ZXJvLCBzcmMwKTsKICAgICAgICAgZHN0MCA8PD0gNjsKIAogICAgICAgICBJTFZSTF9IMl9TVyhkc3QwLCBpbjAsIGRzdDBfciwgZHN0MF9sKTsKLSAgICAgICAgZHN0MF9yID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsICh2OGkxNikgZHN0MF9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2KSB3ZWlnaHRfdmVjKTsKLSAgICAgICAgZHN0MF9sID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsICh2OGkxNikgZHN0MF9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHY4aTE2KSB3ZWlnaHRfdmVjKTsKKyAgICAgICAgZHN0MF9yID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsICh2OGkxNikgZHN0MF9yLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgZHN0MF9sID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsICh2OGkxNikgZHN0MF9sLCB3ZWlnaHRfdmVjKTsKICAgICAgICAgU1JBUl9XMl9TVyhkc3QwX3IsIGRzdDBfbCwgcm5kX3ZlYyk7Ci0gICAgICAgIGRzdDBfciA9IENMSVBfU1dfMF8yNTUoZHN0MF9yKTsKLSAgICAgICAgZHN0MF9sID0gQ0xJUF9TV18wXzI1NShkc3QwX2wpOwotCi0gICAgICAgIEhFVkNfUENLX1NXX1NCMihkc3QwX2wsIGRzdDBfciwgZHN0MF9yKTsKLSAgICAgICAgU1Q0eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QwID0gKHY4aTE2KSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MF9sLCAodjhpMTYpIGRzdDBfcik7CisgICAgICAgIGRzdDAgPSBDTElQX1NIXzBfMjU1X01BWF9TQVRVKGRzdDApOworICAgICAgICBvdXQwID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MCwgKHYxNmk4KSBkc3QwKTsKKyAgICAgICAgU1Q0eDJfVUIob3V0MCwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKLSAgICAgICAgdjhpMTYgZHN0MCwgZHN0MTsKLSAgICAgICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sOwotCi0gICAgICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIExEX1NINChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7Ci0gICAgICAgIElMVlJfRDJfU0goaW4xLCBpbjAsIGluMywgaW4yLCBpbjAsIGluMSk7Ci0gICAgICAgIElMVlJfVzJfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgZHN0MCwgZHN0MSk7Ci0gICAgICAgIGRzdDAgPDw9IDY7Ci0gICAgICAgIGRzdDEgPDw9IDY7Ci0gICAgICAgIEhFVkNfQklXX1JORF9DTElQMihkc3QwLCBkc3QxLCBpbjAsIGluMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOwotCi0gICAgICAgIEhFVkNfUENLX1NXX1NCNChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDBfcik7Ci0gICAgICAgIFNUNHg0X1VCKGRzdDBfciwgZHN0MF9yLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBMVzQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9XNF9TQih0cDAsIHRwMSwgdHAyLCB0cDMsIHNyYzApOworICAgICAgICBMRDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cGQwLCB0cGQxLCB0cGQyLCB0cGQzKTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwZDAsIHRwZDEsIGluMCk7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cGQyLCB0cGQzLCBpbjEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgU0xMSV8yVihkc3QwLCBkc3QxLCA2KTsKKyAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVAyX01BWF9TQVRVKGRzdDAsIGRzdDEsIGluMCwgaW4xLCB3ZWlnaHRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgZHN0MCwgZHN0MSk7CisgICAgICAgIG91dDAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxLCAodjE2aTgpIGRzdDApOworICAgICAgICBTVDR4NF9VQihvdXQwLCBvdXQwLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSA4KSB7Ci0gICAgICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotICAgICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKLSAgICAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICAgICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0KICAgICAgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMyk7IGxvb3BfY250LS07KSB7Ci0gICAgICAgICAgICBMRF9TQjgoc3JjMF9wdHIsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmMwX3B0ciArPSAoOCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgTERfU0g4KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7Ci0gICAgICAgICAgICBzcmMxX3B0ciArPSAoOCAqIHNyYzJfc3RyaWRlKTsKLQotICAgICAgICAgICAgSUxWUl9EMl9TSChpbjEsIGluMCwgaW4zLCBpbjIsIGluMCwgaW4xKTsKLSAgICAgICAgICAgIElMVlJfRDJfU0goaW41LCBpbjQsIGluNywgaW42LCBpbjIsIGluMyk7Ci0gICAgICAgICAgICBJTFZSX1c0X1NCKHNyYzEsIHNyYzAsIHNyYzMsIHNyYzIsIHNyYzUsIHNyYzQsIHNyYzcsIHNyYzYsCi0gICAgICAgICAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLQorICAgICAgICAgICAgTFc0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICAgICAgc3JjMF9wdHIgKz0gNCAqIHNyY19zdHJpZGU7CisgICAgICAgICAgICBJTlNFUlRfVzRfU0IodHAwLCB0cDEsIHRwMiwgdHAzLCBzcmMwKTsKKyAgICAgICAgICAgIExXNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgICAgIHNyYzBfcHRyICs9IDQgKiBzcmNfc3RyaWRlOworICAgICAgICAgICAgSU5TRVJUX1c0X1NCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMSk7CisgICAgICAgICAgICBMRDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cGQwLCB0cGQxLCB0cGQyLCB0cGQzKTsKKyAgICAgICAgICAgIHNyYzFfcHRyICs9ICg0ICogc3JjMl9zdHJpZGUpOworICAgICAgICAgICAgSU5TRVJUX0QyX1NIKHRwZDAsIHRwZDEsIGluMCk7CisgICAgICAgICAgICBJTlNFUlRfRDJfU0godHBkMiwgdHBkMywgaW4xKTsKKyAgICAgICAgICAgIExENChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwZDAsIHRwZDEsIHRwZDIsIHRwZDMpOworICAgICAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CisgICAgICAgICAgICBJTlNFUlRfRDJfU0godHBkMCwgdHBkMSwgaW4yKTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9TSCh0cGQyLCB0cGQzLCBpbjMpOworICAgICAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKICAgICAgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7Ci0gICAgICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgICAgIFNUNHg4X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0X01BWF9TQVRVKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGluMCwgaW4xLCBpbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4zLCB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICAgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgICAgICBTVDR4OF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODcsMTEgKzE4MywxMiBAQAogewogICAgIHVpbnQzMl90IGxvb3BfY250OwogICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IG91dDAsIG91dDE7CiAgICAgdjE2aTggemVybyA9IHsgMCB9OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjE2aTggc3JjMCA9IHsgMCB9LCBzcmMxID0geyAwIH07CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7CiAgICAgdjRpMzIgb2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKQEAgLTIwMywyMyArMjAwLDIxIEBACiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CiAKICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgTEQ0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOwogICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBJTlNFUlRfRDJfU0IodHAwLCB0cDEsIHNyYzApOworICAgICAgICBJTlNFUlRfRDJfU0IodHAyLCB0cDMsIHNyYzEpOwogICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOwogICAgICAgICBzcmMxX3B0ciArPSAoNCAqIHNyYzJfc3RyaWRlKTsKLSAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKICAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKLSAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUNng0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDRfTUFYX1NBVFUoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNng0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KQEAgLTIzNyw4ICsyMzIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MjsKICAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjE2aTggc3JjMCA9IHsgMCB9LCBzcmMxID0geyAwIH0sIHNyYzIgPSB7IDAgfTsKKyAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7CiAgICAgdjRpMzIgb2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKQEAgLTI1MCw4MCArMjUwLDU5IEBACiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CiAKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKLSAgICAgICAgdjE2aTggc3JjMCwgc3JjMTsKLSAgICAgICAgdjhpMTYgaW4wLCBpbjEsIGRzdDAsIGRzdDE7Ci0gICAgICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbDsKLQotICAgICAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEpOworICAgICAgICBMRDIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMwKTsKICAgICAgICAgTERfU0gyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgU0xMSV8yVihkc3QwLCBkc3QxLCA2KTsKIAotICAgICAgICBJTFZSX0IyX1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIGRzdDAsIGRzdDEpOwotCi0gICAgICAgIGRzdDAgPDw9IDY7Ci0gICAgICAgIGRzdDEgPDw9IDY7CiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQMihkc3QwLCBkc3QxLCBpbjAsIGluMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICAgICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBvdXQwID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MSwgKHYxNmk4KSBkc3QwKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0MCwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICB9IGVsc2UgaWYgKDYgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzU7Ci0gICAgICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjU7Ci0gICAgICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7Ci0gICAgICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0NF9yLCBkc3Q1X3I7Ci0gICAgICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgZHN0NF9sLCBkc3Q1X2w7Ci0KLSAgICAgICAgTERfU0I2KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1KTsKKyAgICAgICAgTEQ0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBzcmMwX3B0ciArPSA0ICogc3JjX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMiwgdHAzLCBzcmMxKTsKKyAgICAgICAgTEQyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIElOU0VSVF9EMl9TQih0cDAsIHRwMSwgc3JjMik7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMiwgZHN0NCwgZHN0NSk7CiAgICAgICAgIExEX1NINihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUpOwotICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIElMVlJfQjJfU0goemVybywgc3JjNCwgemVybywgc3JjNSwgZHN0NCwgZHN0NSk7Ci0KICAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKLSAgICAgICAgZHN0NCA8PD0gNjsKLSAgICAgICAgZHN0NSA8PD0gNjsKLSAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLSAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVAyKGRzdDQsIGRzdDUsIGluNCwgaW41LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfciwgZHN0NV9yLCBkc3Q0X2wsIGRzdDVfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IxMihkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yKTsKLSAgICAgICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFNMTElfMlYoZHN0NCwgZHN0NSwgNik7CisgICAgICAgIEhFVkNfQklXX1JORF9DTElQNF9NQVhfU0FUVShkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBpbjAsIGluMSwgaW4yLCBpbjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLCBkc3QwLCBkc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgICAgIEhFVkNfQklXX1JORF9DTElQMl9NQVhfU0FUVShkc3Q0LCBkc3Q1LCBpbjQsIGluNSwgd2VpZ2h0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIGRzdDQsIGRzdDUpOworICAgICAgICBQQ0tFVl9CM19VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBvdXQwLCBvdXQxLCBvdXQyKTsKKyAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIFNUOHgyX1VCKGRzdDJfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgNCkgewogICAgICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwotICAgICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotICAgICAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKIAogICAgICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgICAgICBMRDQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CiAgICAgICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9TQih0cDIsIHRwMywgc3JjMSk7CisgICAgICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOwogICAgICAgICAgICAgTERfU0g0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKICAgICAgICAgICAgIHNyYzFfcHRyICs9ICg0ICogc3JjMl9zdHJpZGUpOwotICAgICAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKIAogICAgICAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKLSAgICAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDRfTUFYX1NBVFUoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgaW4wLCBpbjEsIGluMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjMsIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTM0NSwxMSArMzI0LDEwIEBACiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKICAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MjsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIGRzdDRfbCwgZHN0NV9sOwogICAgIHY0aTMyIG9mZnNldF92ZWMsIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CkBAIC0zNzcsMTA4ICszNTUsMTcgQEAKIAogICAgICAgICBkc3Q0IDw8PSA2OwogICAgICAgICBkc3Q1IDw8PSA2OwotICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDIoZHN0NCwgZHN0NSwgaW40LCBpbjUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjEyKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IpOwotICAgICAgICBTVDEyeDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0X01BWF9TQVRVKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGluMCwgaW4xLCBpbjIsIGluMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QzKTsKKyAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVAyX01BWF9TQVRVKGRzdDQsIGRzdDUsIGluNCwgaW41LCB3ZWlnaHRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgZHN0NCwgZHN0NSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBTVDEyeDRfVUIob3V0MCwgb3V0MSwgb3V0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBoZXZjX2Jpd2d0X2NvcHlfMTZtdWx0eDRtdWx0X21zYSh1aW50OF90ICpzcmMwX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzFfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCkKLXsKLSAgICB1aW50MzJfdCBsb29wX2NudCwgY250OwotICAgIHVpbnQ4X3QgKnNyYzBfcHRyX3RtcDsKLSAgICBpbnQxNl90ICpzcmMxX3B0cl90bXA7Ci0gICAgdWludDhfdCAqZHN0X3RtcDsKLSAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OwotICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKLSAgICB2NGkzMiBvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjLCBybmRfdmVjOwotCi0gICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwotICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKLSAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOwotCi0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwotICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKLQotICAgIGZvciAoY250ID0gKHdpZHRoID4+IDQpOyBjbnQtLTspIHsKLSAgICAgICAgc3JjMF9wdHJfdG1wID0gc3JjMF9wdHI7Ci0gICAgICAgIHNyYzFfcHRyX3RtcCA9IHNyYzFfcHRyOwotICAgICAgICBkc3RfdG1wID0gZHN0OwotCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICAgICAgICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwotICAgICAgICAgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKLSAgICAgICAgICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKLSAgICAgICAgICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKLQotICAgICAgICAgICAgTERfU0I0KHNyYzBfcHRyX3RtcCwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBzcmMwX3B0cl90bXAgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIExEX1NINChzcmMxX3B0cl90bXAsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOwotICAgICAgICAgICAgTERfU0g0KHNyYzFfcHRyX3RtcCArIDgsIHNyYzJfc3RyaWRlLCBpbjQsIGluNSwgaW42LCBpbjcpOwotICAgICAgICAgICAgc3JjMV9wdHJfdG1wICs9ICg0ICogc3JjMl9zdHJpZGUpOwotCi0gICAgICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOwotICAgICAgICAgICAgSUxWTF9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgICAgICB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3KTsKLQotICAgICAgICAgICAgU0xMSV80Vih0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA2KTsKLSAgICAgICAgICAgIFNMTElfNFYodG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgNik7Ci0gICAgICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wNCwgdG1wNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW40LCBpbjUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QyX2wsIGRzdDJfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxX2wsIGRzdDFfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNCh0bXAyLCB0bXAzLCB0bXA2LCB0bXA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMiwgaW4zLCBpbjYsIGluNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDJfbCwgZHN0Ml9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDFfbCwgZHN0MV9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdF90bXAgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNyYzBfcHRyICs9IDE2OwotICAgICAgICBzcmMxX3B0ciArPSAxNjsKLSAgICAgICAgZHN0ICs9IDE2OwotICAgIH0KLX0KLQogc3RhdGljIHZvaWQgaGV2Y19iaXdndF9jb3B5XzE2d19tc2EodWludDhfdCAqc3JjMF9wdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmMxX3B0ciwKQEAgLTQ5MiwxMCArMzc5LDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y19iaXdndF9jb3B5XzE2bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LCB3ZWlnaHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwsIDE2KTsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggemVybyA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB2NGkzMiBvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjLCBybmRfdmVjOworCisgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOworICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworCisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgICAgICBMRF9TSDQoc3JjMV9wdHIgKyA4LCBzcmMyX3N0cmlkZSwgaW40LCBpbjUsIGluNiwgaW43KTsKKyAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CisgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywgdG1wMCwgdG1wMSwKKyAgICAgICAgICAgICAgICAgICB0bXAyLCB0bXAzKTsKKyAgICAgICAgSUxWTF9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLCB0bXA0LCB0bXA1LAorICAgICAgICAgICAgICAgICAgIHRtcDYsIHRtcDcpOworICAgICAgICBTTExJXzRWKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDYpOworICAgICAgICBTTExJXzRWKHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIDYpOworICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDRfTUFYX1NBVFUodG1wMCwgdG1wMSwgdG1wNCwgdG1wNSwgaW4wLCBpbjEsIGluNCwgaW41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywgdG1wMCwgdG1wMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDQsIHRtcDUpOworICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDRfTUFYX1NBVFUodG1wMiwgdG1wMywgdG1wNiwgdG1wNywgaW4yLCBpbjMsIGluNiwgaW43LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywgdG1wMiwgdG1wMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDYsIHRtcDcpOworICAgICAgICBQQ0tFVl9CMl9VQih0bXA0LCB0bXAwLCB0bXA1LCB0bXAxLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wNiwgdG1wMiwgdG1wNywgdG1wMywgb3V0Miwgb3V0Myk7CisgICAgICAgIFNUX1VCNChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfYml3Z3RfY29weV8yNHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNTExLDE0ICs0MzQsNTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBoZXZjX2Jpd2d0X2NvcHlfMTZtdWx0eDRtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQsIHdlaWdodDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCwgMTYpOwotICAgIGhldmNfYml3Z3RfY29weV84d19tc2Eoc3JjMF9wdHIgKyAxNiwgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFfcHRyICsgMTYsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgMTYsIGRzdF9zdHJpZGUsIGhlaWdodCwgd2VpZ2h0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCB6ZXJvID0geyAwIH07CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0OCwgZHN0OSwgZHN0MTA7CisgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIGluOCwgaW45LCBpbjEwLCBpbjExLCBkc3QxMTsKKyAgICB2NGkzMiBvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjLCBybmRfdmVjOworCisgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOworICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworCisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKKworICAgIGZvciAobG9vcF9jbnQgPSA4OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzQsIHNyYzUpOworICAgICAgICBMRF9TQjQoc3JjMF9wdHIgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMiwgc3JjMywgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYzBfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIExEX1NINChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7CisgICAgICAgIExEX1NINChzcmMxX3B0ciArIDgsIHNyYzJfc3RyaWRlLCBpbjQsIGluNSwgaW42LCBpbjcpOworICAgICAgICBMRF9TSDQoc3JjMV9wdHIgKyAxNiwgc3JjMl9zdHJpZGUsIGluOCwgaW45LCBpbjEwLCBpbjExKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CisKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOworICAgICAgICBJTFZSX0IyX1NIKHplcm8sIHNyYzIsIHplcm8sIHNyYzMsIGRzdDQsIGRzdDUpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmM0LCBkc3Q2LCBkc3Q3KTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjNSwgZHN0OCwgZHN0OSk7CisgICAgICAgIElMVlJfQjJfU0goemVybywgc3JjNiwgemVybywgc3JjNywgZHN0MTAsIGRzdDExKTsKKyAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICAgICAgU0xMSV80Vihkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA2KTsKKyAgICAgICAgU0xMSV80Vihkc3Q4LCBkc3Q5LCBkc3QxMCwgZHN0MTEsIDYpOworICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDRfTUFYX1NBVFUoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgaW4wLCBpbjQsIGluMSwgaW41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywgZHN0MCwgZHN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDMpOworICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDRfTUFYX1NBVFUoZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgaW44LCBpbjksIGluMiwgaW42LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywgZHN0NCwgZHN0NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDYsIGRzdDcpOworICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDRfTUFYX1NBVFUoZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExLCBpbjMsIGluNywgaW4xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMTEsIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q4LCBkc3Q5LCBkc3QxMCwgZHN0MTEpOworICAgICAgICBQQ0tFVl9CM19VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBvdXQwLCBvdXQxLCBvdXQyKTsKKyAgICAgICAgUENLRVZfQjNfVUIoZHN0NywgZHN0NiwgZHN0OSwgZHN0OCwgZHN0MTEsIGRzdDEwLCBvdXQzLCBvdXQ0LCBvdXQ1KTsKKyAgICAgICAgU1RfVUI0KG91dDAsIG91dDEsIG91dDMsIG91dDQsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFNUOHg0X1VCKG91dDIsIG91dDUsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2Jpd2d0X2NvcHlfMzJ3X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTUzNCwxMCArNDk4LDUyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y19iaXdndF9jb3B5XzE2bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LCB3ZWlnaHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwsIDMyKTsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggemVybyA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB2NGkzMiBvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjLCBybmRfdmVjOworCisgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOworICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworCisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjIoc3JjMF9wdHIsIDE2LCBzcmMwLCBzcmMxKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfU0IyKHNyYzBfcHRyLCAxNiwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYzBfcHRyICs9IHNyY19zdHJpZGU7CisgICAgICAgIExEX1NINChzcmMxX3B0ciwgOCwgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisgICAgICAgIExEX1NINChzcmMxX3B0ciwgOCwgaW40LCBpbjUsIGluNiwgaW43KTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgdG1wMCwgdG1wNCk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIHRtcDEsIHRtcDUpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCB0bXAyLCB0bXA2KTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMywgdG1wMywgdG1wNyk7CisgICAgICAgIFNMTElfNFYodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNik7CisgICAgICAgIFNMTElfNFYodG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgNik7CisgICAgICAgIEhFVkNfQklXX1JORF9DTElQNF9NQVhfU0FUVSh0bXAwLCB0bXA0LCB0bXAxLCB0bXA1LCBpbjAsIGluMSwgaW4yLCBpbjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLCB0bXAwLCB0bXA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMSwgdG1wNSk7CisgICAgICAgIEhFVkNfQklXX1JORF9DTElQNF9NQVhfU0FUVSh0bXAyLCB0bXA2LCB0bXAzLCB0bXA3LCBpbjQsIGluNSwgaW42LCBpbjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLCB0bXAyLCB0bXA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMywgdG1wNyk7CisgICAgICAgIFBDS0VWX0IyX1VCKHRtcDQsIHRtcDAsIHRtcDUsIHRtcDEsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQih0bXA2LCB0bXAyLCB0bXA3LCB0bXAzLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1RfVUIyKG91dDAsIG91dDEsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU1RfVUIyKG91dDIsIG91dDMsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfYml3Z3RfY29weV80OHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNTUzLDEwICs1NTksNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBoZXZjX2Jpd2d0X2NvcHlfMTZtdWx0eDRtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQsIHdlaWdodDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCwgNDgpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MjsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyOworICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41OworICAgIHY0aTMyIG9mZnNldF92ZWMsIHdlaWdodF92ZWMsIHJuZF92ZWM7CisKKyAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CisgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOworICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CisgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOworICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworCisgICAgZm9yIChsb29wX2NudCA9IDY0OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjMoc3JjMF9wdHIsIDE2LCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfU0g2KHNyYzFfcHRyLCA4LCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41KTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICAgICAgU0xMSV8yVihkc3Q0LCBkc3Q1LCA2KTsKKyAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0X01BWF9TQVRVKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGluMCwgaW4xLCBpbjIsIGluMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QzKTsKKyAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVAyX01BWF9TQVRVKGRzdDQsIGRzdDUsIGluNCwgaW41LCB3ZWlnaHRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgZHN0NCwgZHN0NSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBTVF9VQjIob3V0MCwgb3V0MSwgZHN0LCAxNik7CisgICAgICAgIFNUX1VCKG91dDIsIGRzdCArIDMyKTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2Jpd2d0X2NvcHlfNjR3X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTU3MiwxMCArNjExLDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y19iaXdndF9jb3B5XzE2bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LCB3ZWlnaHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwsIDY0KTsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggemVybyA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB2NGkzMiBvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjLCBybmRfdmVjOworCisgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOworICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworCisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKKworICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMwX3B0ciwgMTYsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBzcmMwX3B0ciArPSBzcmNfc3RyaWRlOworICAgICAgICBMRF9TSDgoc3JjMV9wdHIsIDgsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43KTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisKKyAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLCB0bXAwLCB0bXAxLAorICAgICAgICAgICAgICAgICAgIHRtcDIsIHRtcDMpOworICAgICAgICBJTFZMX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsIHRtcDQsIHRtcDUsCisgICAgICAgICAgICAgICAgICAgdG1wNiwgdG1wNyk7CisgICAgICAgIFNMTElfNFYodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNik7CisgICAgICAgIFNMTElfNFYodG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgNik7CisgICAgICAgIEhFVkNfQklXX1JORF9DTElQNF9NQVhfU0FUVSh0bXAwLCB0bXA0LCB0bXAxLCB0bXA1LCBpbjAsIGluMSwgaW4yLCBpbjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLCB0bXAwLCB0bXA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMSwgdG1wNSk7CisgICAgICAgIEhFVkNfQklXX1JORF9DTElQNF9NQVhfU0FUVSh0bXAyLCB0bXA2LCB0bXAzLCB0bXA3LCBpbjQsIGluNSwgaW42LCBpbjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLCB0bXAyLCB0bXA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMywgdG1wNyk7CisgICAgICAgIFBDS0VWX0IyX1VCKHRtcDQsIHRtcDAsIHRtcDUsIHRtcDEsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQih0bXA2LCB0bXAyLCB0bXA3LCB0bXAzLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1RfVUI0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHpfYml3Z3RfOHRfNHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNTkzLDE3ICs2NjgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQsIGNvbnN0YW50OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwogICAgIHY4aTE2IGRzdDAsIGRzdDE7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbDsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgb3V0MCwgb3V0MTsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzE2XSk7CiAKICAgICBzcmMwX3B0ciAtPSAzOwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwpAQCAtNjE2LDkgKzY5MCwxMCBAQAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTYzMywyMSArNzA4LDE5IEBACiAKICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVAyKGRzdDAsIGRzdDEsIGluMCwgaW4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxKTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjQoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QwX3IpOwotICAgICAgICBTVDR4NF9VQihkc3QwX3IsIGRzdDBfciwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgb3V0MCA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIG91dDEsICh2MTZpOCkgb3V0MCk7CisgICAgICAgIFNUNHg0X1VCKG91dDAsIG91dDAsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KQEAgLTY2NywyNSArNzQwLDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfciwgZHN0M19yLCBkc3QyX2wsIGRzdDNfbDsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAKICAgICBzcmMwX3B0ciAtPSAzOwogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTcwNiwzNCArNzc5LDI4IEBACiAKICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUOHg0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9TSChvdXQxLCBvdXQwLCBvdXQzLCBvdXQyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQpAQCAtNzUyLDEyICs4MTksODUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGhldmNfaHpfYml3Z3RfOHRfOHdfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQwLCB3ZWlnaHQxLCBvZmZzZXQwLCBvZmZzZXQxLCBybmRfdmFsKTsKLSAgICBoZXZjX2h6X2Jpd2d0Xzh0XzR3X21zYShzcmMwX3B0ciArIDgsIHNyY19zdHJpZGUsIHNyYzFfcHRyICsgOCwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgOCwgZHN0X3N0cmlkZSwgZmlsdGVyLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCk7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodCwgY29uc3RhbnQ7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazc7CisgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgaW4wLCBpbjEsIGluMiwgaW4zLCBmaWx0ZXJfdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisKKyAgICBzcmMwX3B0ciAtPSAzOworCisgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOworICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CisKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CisgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOworICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CisgICAgU1BMQVRJX0g0X1NIKGZpbHRlcl92ZWMsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKworICAgIG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOworICAgIG1hc2sxID0gbWFzazAgKyAyOworICAgIG1hc2syID0gbWFzazAgKyA0OworICAgIG1hc2szID0gbWFzazAgKyA2OworICAgIG1hc2s0ID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMTZdKTsKKyAgICBtYXNrNSA9IG1hc2s0ICsgMjsKKyAgICBtYXNrNiA9IG1hc2s0ICsgNDsKKyAgICBtYXNrNyA9IG1hc2s0ICsgNjsKKworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwKKyAgICAgICAgICAgICAgICAgICB2ZWMzKTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEsIHZlYzIsCisgICAgICAgICAgICAgICAgICAgdmVjMyk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwKKyAgICAgICAgICAgICAgICAgICB2ZWMzKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIEhFVkNfQklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBpbjAsIGluMSwgaW4yLCBpbjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLCBvdXQwLCBvdXQxLCBvdXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Myk7CisgICAgICAgIFBDS0VWX0IyX1NIKG91dDEsIG91dDAsIG91dDMsIG91dDIsIG91dDAsIG91dDEpOworICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOworCisgICAgICAgIExEX1NCNChzcmMwX3B0ciArIDgsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBMRF9TSDQoc3JjMV9wdHIgKyA4LCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gKDQgKiBzcmMyX3N0cmlkZSk7CisgICAgICAgIElMVlJfRDJfU0goaW4xLCBpbjAsIGluMywgaW4yLCBpbjAsIGluMSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzEsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMzLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjMCwgdmVjMSwgdmVjMiwKKyAgICAgICAgICAgICAgICAgICB2ZWMzKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIEhFVkNfQklXX1JORF9DTElQMihkc3QwLCBkc3QxLCBpbjAsIGluMSwgd2VpZ2h0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIG91dDAsIG91dDEpOworICAgICAgICBvdXQwID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb3V0MSwgKHYxNmk4KSBvdXQwKTsKKyAgICAgICAgU1Q0eDRfVUIob3V0MCwgb3V0MCwgMCwgMSwgMiwgMywgZHN0ICsgOCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19oel9iaXdndF84dF8xNndfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNzc1LDE1ICs5MTUsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwogICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CiAKQEAgLTc5MSw5ICs5MzAsMTAgQEAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC04MTgsMzQgKzk1OCwyOCBAQAogCiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDAsIGRzdDAsIGRzdDApOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QyLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDMsIGRzdDMsIGRzdDMsIGRzdDMpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKIAogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IyX1NIKG91dDEsIG91dDAsIG91dDMsIG91dDIsIG91dDAsIG91dDEpOworICAgICAgICBTVF9TSDIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICgyICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQpAQCAtODY2LDI1ICsxMDAwLDI2IEBACiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdWludDY0X3QgZHN0X3ZhbDA7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjI7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazc7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2w7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY0aTMyIGRzdDJfciwgZHN0Ml9sOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIG91dDAsIG91dDEsIG91dDI7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogCiAgICAgc3JjMF9wdHIgPSBzcmMwX3B0ciAtIDM7CiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtOTAwLDMzICsxMDM1LDMwIEBACiAgICAgbWFzazYgPSBtYXNrMCArIDEyOwogICAgIG1hc2s3ID0gbWFzazAgKyAxNDsKIAotICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQ7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCMihzcmMwX3B0ciwgMTYsIHNyYzAsIHNyYzEpOwotICAgICAgICBzcmMwX3B0ciArPSBzcmNfc3RyaWRlOwotICAgICAgICBMRF9TSDIoc3JjMV9wdHIsIDgsIGluMCwgaW4xKTsKLSAgICAgICAgaW4yID0gTERfU0goc3JjMV9wdHIgKyAxNik7Ci0gICAgICAgIHNyYzFfcHRyICs9IHNyYzJfc3RyaWRlOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMwLCBzcmMxKTsKKyAgICBMRF9TQjIoc3JjMF9wdHIsIDE2LCBzcmMwLCBzcmMxKTsKKyAgICBzcmMwX3B0ciArPSBzcmNfc3RyaWRlOworICAgIExEX1NIMihzcmMxX3B0ciwgOCwgaW4wLCBpbjEpOworICAgIGluMiA9IExEX1NIKHNyYzFfcHRyICsgMTYpOworICAgIHNyYzFfcHRyICs9IHNyYzJfc3RyaWRlOworICAgIFhPUklfQjJfMTI4X1NCKHNyYzAsIHNyYzEpOwogCisgICAgZm9yIChsb29wX2NudCA9IDMxOyBsb29wX2NudC0tOykgewogICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMSwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQMihkc3QwLCBkc3QxLCBpbjAsIGluMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSk7CiAKICAgICAgICAgSUxWUkxfSDJfU1coZHN0MiwgaW4yLCBkc3QyX3IsIGRzdDJfbCk7CiAgICAgICAgIGRzdDJfciA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIGRzdDJfciwKQEAgLTkzNCwxNiArMTA2Niw0NCBAQAogICAgICAgICBkc3QyX2wgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3QyX2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYpIHdlaWdodF92ZWMpOwogICAgICAgICBTUkFSX1cyX1NXKGRzdDJfciwgZHN0Ml9sLCBybmRfdmVjKTsKLSAgICAgICAgZHN0Ml9yID0gQ0xJUF9TV18wXzI1NShkc3QyX3IpOwotICAgICAgICBkc3QyX2wgPSBDTElQX1NXXzBfMjU1KGRzdDJfbCk7CisgICAgICAgIGRzdDJfciA9ICh2NGkzMikgX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDJfbCwgKHY4aTE2KSBkc3QyX3IpOworICAgICAgICBvdXQyID0gQ0xJUF9TSF8wXzI1NShkc3QyX3IpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCNChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDBfcik7Ci0gICAgICAgIEhFVkNfUENLX1NXX1NCMihkc3QyX2wsIGRzdDJfciwgZHN0Ml9yKTsKLSAgICAgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDJfciwgMCk7Ci0gICAgICAgIFNUX1NXKGRzdDBfciwgZHN0KTsKKyAgICAgICAgTERfU0IyKHNyYzBfcHRyLCAxNiwgc3JjMCwgc3JjMSk7CisgICAgICAgIHNyYzBfcHRyICs9IHNyY19zdHJpZGU7CisgICAgICAgIExEX1NIMihzcmMxX3B0ciwgOCwgaW4wLCBpbjEpOworICAgICAgICBpbjIgPSBMRF9TSChzcmMxX3B0ciArIDE2KTsKKyAgICAgICAgc3JjMV9wdHIgKz0gc3JjMl9zdHJpZGU7CisgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzAsIHNyYzEpOworICAgICAgICBQQ0tFVl9CMl9TSChvdXQxLCBvdXQwLCBvdXQyLCBvdXQyLCBvdXQwLCBvdXQyKTsKKyAgICAgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIG91dDIsIDApOworICAgICAgICBTVF9TSChvdXQwLCBkc3QpOwogICAgICAgICBTRChkc3RfdmFsMCwgZHN0ICsgMTYpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICB9CisKKyAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMSwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBIRVZDX0JJV19STkRfQ0xJUDIoZHN0MCwgZHN0MSwgaW4wLCBpbjEsIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEpOworICAgIElMVlJMX0gyX1NXKGRzdDIsIGluMiwgZHN0Ml9yLCBkc3QyX2wpOworICAgIGRzdDJfciA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIGRzdDJfciwgKHY4aTE2KSB3ZWlnaHRfdmVjKTsKKyAgICBkc3QyX2wgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3QyX2wsICh2OGkxNikgd2VpZ2h0X3ZlYyk7CisgICAgU1JBUl9XMl9TVyhkc3QyX3IsIGRzdDJfbCwgcm5kX3ZlYyk7CisgICAgZHN0Ml9yID0gKHY0aTMyKSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0Ml9sLCAodjhpMTYpIGRzdDJfcik7CisgICAgb3V0MiA9IENMSVBfU0hfMF8yNTUoZHN0Ml9yKTsKKyAgICBQQ0tFVl9CMl9TSChvdXQxLCBvdXQwLCBvdXQyLCBvdXQyLCBvdXQwLCBvdXQyKTsKKyAgICBkc3RfdmFsMCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgb3V0MiwgMCk7CisgICAgU1RfU0gob3V0MCwgZHN0KTsKKyAgICBTRChkc3RfdmFsMCwgZHN0ICsgMTYpOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h6X2Jpd2d0Xzh0XzMyd19tc2EodWludDhfdCAqc3JjMF9wdHIsCkBAIC05NjEsMjUgKzExMjEsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazMsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3OwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gMzsKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC0xMDA2LDM0ICsxMTY2LDI4IEBACiAKICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzEsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0LCAxNik7CisgICAgICAgIFBDS0VWX0IyX1NIKG91dDEsIG91dDAsIG91dDMsIG91dDIsIG91dDAsIG91dDEpOworICAgICAgICBTVF9TSDIob3V0MCwgb3V0MSwgZHN0LCAxNik7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwogICAgIH0KIH0KQEAgLTEwNTMsMjcgKzEyMDcsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKLSAgICB1aW50NjRfdCBkc3RfdmFsMDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjU7CisgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodCwgY29uc3RhbnQ7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKKyAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0NF9yLCBkc3Q1X3I7Ci0gICAgdjRpMzIgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCBkc3Q0X2wsIGRzdDVfbDsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIG91dDAsIG91dDEsIG91dDIsIG91dDM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IDM7CiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtMTA4OSw4NiArMTI0MSw1NyBAQAogICAgIG1hc2s2ID0gbWFzazAgKyAxMjsKICAgICBtYXNrNyA9IG1hc2swICsgMTQ7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0OyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjMoc3JjMF9wdHIsIDE2LCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICAgICAgc3JjMyA9IExEX1NCKHNyYzBfcHRyICsgNDApOworICAgIGZvciAobG9vcF9jbnQgPSA2NDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0IyKHNyYzBfcHRyLCAxNiwgc3JjMCwgc3JjMSk7CisgICAgICAgIHNyYzIgPSBMRF9TQihzcmMwX3B0ciArIDI0KTsKKyAgICAgICAgTERfU0g0KHNyYzFfcHRyLCA4LCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgICAgTERfU0IyKHNyYzBfcHRyICsgMzIsIDgsIHNyYzMsIHNyYzQpOwogICAgICAgICBzcmMwX3B0ciArPSBzcmNfc3RyaWRlOwotICAgICAgICBMRF9TSDIoc3JjMV9wdHIsIDgsIGluMCwgaW4xKTsKLSAgICAgICAgaW4yID0gTERfU0goc3JjMV9wdHIgKyAxNik7Ci0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKIAogICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMSwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMiwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDMsIGRzdDMsIGRzdDMsIGRzdDMpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NCwgZHN0NCwgZHN0NCk7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDUsIGRzdDUsIGRzdDUsIGRzdDUpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKIAotICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDIoZHN0MCwgZHN0MSwgaW4wLCBpbjEsCisgICAgICAgIEhFVkNfQklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwogCi0gICAgICAgIElMVlJMX0gyX1NXKGRzdDIsIGluMiwgZHN0Ml9yLCBkc3QyX2wpOwotICAgICAgICBkc3QyX3IgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYpIHdlaWdodF92ZWMpOwotICAgICAgICBkc3QyX2wgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3QyX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYpIHdlaWdodF92ZWMpOwotICAgICAgICBTUkFSX1cyX1NXKGRzdDJfciwgZHN0Ml9sLCBybmRfdmVjKTsKLSAgICAgICAgZHN0Ml9yID0gQ0xJUF9TV18wXzI1NShkc3QyX3IpOwotICAgICAgICBkc3QyX2wgPSBDTElQX1NXXzBfMjU1KGRzdDJfbCk7CisgICAgICAgIFBDS0VWX0IyX1NIKG91dDEsIG91dDAsIG91dDMsIG91dDIsIG91dDAsIG91dDEpOworICAgICAgICBTVF9TSDIob3V0MCwgb3V0MSwgZHN0LCAxNik7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IyKGRzdDJfbCwgZHN0Ml9yLCBkc3QyX3IpOwotICAgICAgICBkc3RfdmFsMCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0Ml9yLCAwKTsKLSAgICAgICAgU1RfU1coZHN0MF9yLCBkc3QpOwotICAgICAgICBTRChkc3RfdmFsMCwgZHN0ICsgMTYpOwotCi0gICAgICAgIExEX1NIMihzcmMxX3B0ciArIDI0LCA4LCBpbjMsIGluNCk7Ci0gICAgICAgIGluNSA9IExEX1NIKHNyYzFfcHRyICsgNDApOworICAgICAgICBMRF9TSDIoc3JjMV9wdHIgKyAzMiwgOCwgaW4yLCBpbjMpOwogICAgICAgICBzcmMxX3B0ciArPSBzcmMyX3N0cmlkZTsKIAotICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDIoZHN0MywgZHN0NCwgaW4zLCBpbjQsCisgICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCisgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKworICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDIoZHN0MCwgZHN0MSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0M19yLCBkc3Q0X3IsIGRzdDNfbCwgZHN0NF9sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEpOwogCi0gICAgICAgIElMVlJMX0gyX1NXKGRzdDUsIGluNSwgZHN0NV9yLCBkc3Q1X2wpOwotICAgICAgICBkc3Q1X3IgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3Q1X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYpIHdlaWdodF92ZWMpOwotICAgICAgICBkc3Q1X2wgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3Q1X2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYpIHdlaWdodF92ZWMpOwotICAgICAgICBTUkFSX1cyX1NXKGRzdDVfciwgZHN0NV9sLCBybmRfdmVjKTsKLSAgICAgICAgZHN0NV9yID0gQ0xJUF9TV18wXzI1NShkc3Q1X3IpOwotICAgICAgICBkc3Q1X2wgPSBDTElQX1NXXzBfMjU1KGRzdDVfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwgZHN0NF9yKTsKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IyKGRzdDNfbCwgZHN0M19yLCBkc3QzX3IpOwotICAgICAgICBkc3RfdmFsMCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0M19yLCAwKTsKLSAgICAgICAgU0QoZHN0X3ZhbDAsIGRzdCArIDI0KTsKLSAgICAgICAgU1RfU1coZHN0NF9yLCBkc3QgKyAzMik7CisgICAgICAgIG91dDAgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBvdXQxLCAodjE2aTgpIG91dDApOworICAgICAgICBTVF9TSChvdXQwLCBkc3QgKyAzMik7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwogICAgIH0KIH0KQEAgLTExOTEsMjUgKzEzMTQsMjUgQEAKICAgICB1aW50OF90ICpkc3RfdG1wOwogICAgIGludDE2X3QgKnNyYzFfcHRyX3RtcDsKICAgICB1aW50MzJfdCBsb29wX2NudCwgY250OwotICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodCwgY29uc3RhbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMjsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIG91dDAsIG91dDEsIG91dDIsIG91dDM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IDM7CiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtMTI0MCwzNCArMTM2MywyOCBAQAogCiAgICAgICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7CisgICAgICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CiAgICAgICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzEsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LAogICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7CisgICAgICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CiAgICAgICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7CisgICAgICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CiAgICAgICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CiAKICAgICAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwogCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3RfdG1wLCAxNik7CisgICAgICAgICAgICBQQ0tFVl9CMl9TSChvdXQxLCBvdXQwLCBvdXQzLCBvdXQyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFNUX1NIMihvdXQwLCBvdXQxLCBkc3RfdG1wLCAxNik7CiAgICAgICAgICAgICBkc3RfdG1wICs9IDMyOwogICAgICAgICB9CiAKQEAgLTEzMDMsMjIgKzE0MjAsMjIgQEAKICAgICB2MTZpOCBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5ODsKICAgICB2MTZpOCBzcmMxMjExMTExMCwgc3JjMTQxMzEzMTI7CiAgICAgdjhpMTYgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzY7Ci0gICAgdjRpMzIgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKLSAgICB2NGkzMiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3Q3Nl9sOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgd2VpZ2h0MV92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsIGNvbnN0X3ZlYzsKIAogICAgIHNyYzBfcHRyIC09ICgzICogc3JjX3N0cmlkZSk7CiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKKyAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfdygxMjgpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworICAgIHdlaWdodDFfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodDEpOworICAgIG9mZnNldF92ZWMgKz0gY29uc3RfdmVjICogd2VpZ2h0MV92ZWM7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwpAQCAtMTM1MSwyOCArMTQ2OCwyMiBAQAogICAgICAgICAgICAgICAgICAgIHNyYzg3NzYsIHNyYzEwOTk4LCBzcmMxMjExMTExMCwgc3JjMTQxMzEzMTIpOwogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM4Nzc2LCBzcmMxMDk5OCwgc3JjMTIxMTExMTAsIHNyYzE0MTMxMzEyKTsKIAotICAgICAgICBkc3QxMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0MywgZHN0MTAsIGRzdDEwLCBkc3QxMCwgZHN0MTApOwotICAgICAgICBkc3QzMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4LAotICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIGRzdDMyLCBkc3QzMiwgZHN0MzIsIGRzdDMyKTsKLSAgICAgICAgZHN0NTQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5OCwgc3JjMTIxMTExMTAsCi0gICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0NTQsIGRzdDU0LCBkc3Q1NCwgZHN0NTQpOwotICAgICAgICBkc3Q3NiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzg3NzYsIHNyYzEwOTk4LCBzcmMxMjExMTExMCwgc3JjMTQxMzEzMTIsCi0gICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0NzYsIGRzdDc2LCBkc3Q3NiwgZHN0NzYpOworICAgICAgICBET1RQX1NCNF9TSChzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDAsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYpOworICAgICAgICBEUEFERF9TQjRfU0goc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3Niwgc3JjMTA5OTgsIGZpbHQxLCBmaWx0MSwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYpOworICAgICAgICBEUEFERF9TQjRfU0goc3JjNjU1NCwgc3JjODc3Niwgc3JjMTA5OTgsIHNyYzEyMTExMTEwLCBmaWx0MiwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDIsIGRzdDEwLCBkc3QzMiwgZHN0NTQsIGRzdDc2KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHNyYzg3NzYsIHNyYzEwOTk4LCBzcmMxMjExMTExMCwgc3JjMTQxMzEzMTIsIGZpbHQzLCBmaWx0MywKKyAgICAgICAgICAgICAgICAgICAgIGZpbHQzLCBmaWx0MywgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYpOwogCiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNChkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3Q3NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0NzZfbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MTBfbCwgZHN0MTBfciwgZHN0MzJfbCwgZHN0MzJfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDU0X2wsIGRzdDU0X3IsIGRzdDc2X2wsIGRzdDc2X3IsIGRzdDEwX3IsIGRzdDU0X3IpOwotICAgICAgICBTVDR4OF9VQihkc3QxMF9yLCBkc3Q1NF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9TSChvdXQxLCBvdXQwLCBvdXQzLCBvdXQyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgU1Q0eDhfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CiAKICAgICAgICAgc3JjMjExMCA9IHNyYzEwOTk4OwpAQCAtMTQwNSwyMCArMTUxNiwyMSBAQAogICAgIHYxNmk4IHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIHNyYzEwOV9yOwogICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCB3ZWlnaHQxX3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgY29uc3RfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gKDMgKiBzcmNfc3RyaWRlKTsKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV93KDEyOCk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CisgICAgd2VpZ2h0MV92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0MSk7CisgICAgb2Zmc2V0X3ZlYyArPSBjb25zdF92ZWMgKiB3ZWlnaHQxX3ZlYzsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CkBAIC0xNDQxLDI4ICsxNTUzLDIyIEBACiAgICAgICAgIElMVlJfQjRfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksCiAgICAgICAgICAgICAgICAgICAgc3JjNzZfciwgc3JjODdfciwgc3JjOThfciwgc3JjMTA5X3IpOwogCi0gICAgICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLAotICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIHRtcDAsIHRtcDAsIHRtcDAsIHRtcDApOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAxLCB0bXAxLCB0bXAxLCB0bXAxKTsKLSAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3IsCi0gICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgdG1wMiwgdG1wMiwgdG1wMiwgdG1wMik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAzLCB0bXAzLCB0bXAzLCB0bXAzKTsKKyAgICAgICAgRE9UUF9TQjRfU0goc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQwLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgZmlsdDAsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBEUEFERF9TQjRfU0goc3JjMzJfciwgc3JjNDNfciwgc3JjNTRfciwgc3JjNjVfciwgZmlsdDEsIGZpbHQxLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHNyYzU0X3IsIHNyYzY1X3IsIHNyYzc2X3IsIHNyYzg3X3IsIGZpbHQyLCBmaWx0MiwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIERQQUREX1NCNF9TSChzcmM3Nl9yLCBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfciwgZmlsdDMsIGZpbHQzLCBmaWx0MywKKyAgICAgICAgICAgICAgICAgICAgIGZpbHQzLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKIAogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVDh4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfU0gob3V0MSwgb3V0MCwgb3V0Mywgb3V0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIHNyYzEwX3IgPSBzcmM1NF9yOwpAQCAtMTUwMCwyMCArMTYwNiwyMiBAQAogICAgIHYxNmk4IHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2w7CiAgICAgdjE2aTggc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbDsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHY4aTE2IG91dDAsIG91dDEsIG91dDIsIGZpbHRlcl92ZWM7CisgICAgdjRpMzIgZHN0Ml9yLCBkc3QyX2w7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgd2VpZ2h0MV92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsIGNvbnN0X3ZlYzsKIAogICAgIHNyYzBfcHRyIC09ICgzICogc3JjX3N0cmlkZSk7CiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKKyAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfdygxMjgpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworICAgIHdlaWdodDFfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodDEpOworICAgIG9mZnNldF92ZWMgKz0gY29uc3RfdmVjICogd2VpZ2h0MV92ZWM7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwpAQCAtMTUzMSw3ICsxNjM5LDcgQEAKICAgICBJTFZSX0QzX1NCKHNyYzIxX2wsIHNyYzEwX2wsIHNyYzQzX2wsIHNyYzMyX2wsIHNyYzY1X2wsIHNyYzU0X2wsCiAgICAgICAgICAgICAgICBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0KTsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgIGZvciAobG9vcF9jbnQgPSA4OyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgpOwogICAgICAgICBzcmMwX3B0ciArPSAoMiAqIHNyY19zdHJpZGUpOwogICAgICAgICBMRF9TSDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7CkBAIC0xNTQ0LDE5ICsxNjUyLDE4IEBACiAgICAgICAgIElMVkxfQjJfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNzZfbCwgc3JjODdfbCk7CiAgICAgICAgIHNyYzg3NzYgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzg3X2wsICh2Mmk2NCkgc3JjNzZfbCk7CiAKLSAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsCi0gICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgdG1wMCwgdG1wMCwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLAotICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIHRtcDEsIHRtcDEsIHRtcDEsIHRtcDEpOwotICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NiwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAyLCB0bXAyLCB0bXAyLCB0bXAyKTsKKyAgICAgICAgRE9UUF9TQjNfU0goc3JjMTBfciwgc3JjMjFfciwgc3JjMjExMCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMik7CisgICAgICAgIERQQUREX1NCMl9TSChzcmMzMl9yLCBzcmM0M19yLCBmaWx0MSwgZmlsdDEsIHRtcDAsIHRtcDEpOworICAgICAgICB0bXAyID0gX19tc2FfZHBhZGRfc19oKHRtcDIsIHNyYzQzMzIsICh2MTZpOCkgZmlsdDEpOworICAgICAgICBEUEFERF9TQjJfU0goc3JjNTRfciwgc3JjNjVfciwgZmlsdDIsIGZpbHQyLCB0bXAwLCB0bXAxKTsKKyAgICAgICAgdG1wMiA9IF9fbXNhX2RwYWRkX3NfaCh0bXAyLCBzcmM2NTU0LCAodjE2aTgpIGZpbHQyKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHNyYzc2X3IsIHNyYzg3X3IsIGZpbHQzLCBmaWx0MywgdG1wMCwgdG1wMSk7CisgICAgICAgIHRtcDIgPSBfX21zYV9kcGFkZF9zX2godG1wMiwgc3JjODc3NiwgKHYxNmk4KSBmaWx0Myk7CiAKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVAyKHRtcDAsIHRtcDEsIGluMCwgaW4xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxKTsKIAogICAgICAgICBJTFZSTF9IMl9TVyh0bXAyLCBpbjIsIGRzdDJfciwgZHN0Ml9sKTsKICAgICAgICAgZHN0Ml9yID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsICh2OGkxNikgZHN0Ml9yLApAQCAtMTU2NCwxMyArMTY3MSwxMSBAQAogICAgICAgICBkc3QyX2wgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3QyX2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjhpMTYpIHdlaWdodF92ZWMpOwogICAgICAgICBTUkFSX1cyX1NXKGRzdDJfciwgZHN0Ml9sLCBybmRfdmVjKTsKLSAgICAgICAgZHN0Ml9yID0gQ0xJUF9TV18wXzI1NShkc3QyX3IpOwotICAgICAgICBkc3QyX2wgPSBDTElQX1NXXzBfMjU1KGRzdDJfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IyKGRzdDJfbCwgZHN0Ml9yLCBkc3QyX3IpOwotICAgICAgICBTVDh4Ml9VQihkc3QwX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIFNUNHgyX1VCKGRzdDJfciwgZHN0ICsgOCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdDJfciA9ICh2NGkzMikgX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDJfbCwgKHY4aTE2KSBkc3QyX3IpOworICAgICAgICBvdXQyID0gQ0xJUF9TSF8wXzI1NShkc3QyX3IpOworICAgICAgICBQQ0tFVl9CMl9TSChvdXQxLCBvdXQwLCBvdXQyLCBvdXQyLCBvdXQwLCBvdXQyKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0MCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q0eDJfVUIob3V0MiwgZHN0ICsgOCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIHNyYzEwX3IgPSBzcmMzMl9yOwpAQCAtMTYxNCw5ICsxNzE5LDkgQEAKICAgICB2MTZpOCBzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sOwogICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKKyAgICB2OGkxNiBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHdlaWdodDFfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLCBjb25zdF92ZWM7CiAKICAgICBzcmMwX3B0ciAtPSAoMyAqIHNyY19zdHJpZGUpOwogCkBAIC0xNjI0LDExICsxNzI5LDEzIEBACiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV93KDEyOCk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CisgICAgd2VpZ2h0MV92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0MSk7CisgICAgb2Zmc2V0X3ZlYyArPSBjb25zdF92ZWMgKiB3ZWlnaHQxX3ZlYzsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CkBAIC0xNjYxLDI4ICsxNzY4LDIyIEBACiAgICAgICAgICAgICBJTFZSX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzc2X3IsIHNyYzg3X3IpOwogICAgICAgICAgICAgSUxWTF9CMl9TQihzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM3Nl9sLCBzcmM4N19sKTsKIAotICAgICAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAwLCB0bXAwLCB0bXAwLCB0bXAwKTsKLSAgICAgICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgdG1wMSwgdG1wMSwgdG1wMSwgdG1wMSk7Ci0gICAgICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0I0X1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIHRtcDIsIHRtcDIsIHRtcDIsIHRtcDIpOwotICAgICAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAzLCB0bXAzLCB0bXAzLCB0bXAzKTsKKyAgICAgICAgICAgIERPVFBfU0I0X1NIKHNyYzEwX3IsIHNyYzIxX3IsIHNyYzEwX2wsIHNyYzIxX2wsIGZpbHQwLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MCwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgICAgICBEUEFERF9TQjRfU0goc3JjMzJfciwgc3JjNDNfciwgc3JjMzJfbCwgc3JjNDNfbCwgZmlsdDEsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MSwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgICAgICBEUEFERF9TQjRfU0goc3JjNTRfciwgc3JjNjVfciwgc3JjNTRfbCwgc3JjNjVfbCwgZmlsdDIsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0MiwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgICAgICBEUEFERF9TQjRfU0goc3JjNzZfciwgc3JjODdfciwgc3JjNzZfbCwgc3JjODdfbCwgZmlsdDMsIGZpbHQzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzLCBmaWx0MywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CiAKICAgICAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwogCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDJfbCwgZHN0Ml9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDFfbCwgZHN0MV9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFBDS0VWX0IyX1NIKG91dDIsIG91dDAsIG91dDMsIG91dDEsIG91dDAsIG91dDEpOworICAgICAgICAgICAgU1RfU0gyKG91dDAsIG91dDEsIGRzdF90bXAsIGRzdF9zdHJpZGUpOwogICAgICAgICAgICAgZHN0X3RtcCArPSAoMiAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgICAgICBzcmMxMF9yID0gc3JjMzJfcjsKQEAgLTE4MzEsMjMgKzE5MzIsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQzMl90IG9mZnNldDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwotICAgIHY4aTE2IGluMCwgaW4xOworICAgIHVpbnQ2NF90IHRwMCwgdHAxOworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgdjE2dTggb3V0OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHY4aTE2IGluMCA9IHsgMCB9LCBpbjEgPSB7IDAgfTsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDM7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlYzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OwogICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CiAgICAgdjhpMTYgZHN0MzAsIGRzdDQxLCBkc3Q1MiwgZHN0NjMsIGRzdDY2LCBkc3Q4NzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfcjsKLSAgICB2NGkzMiB0bXAxLCB0bXAyOwotICAgIHY0aTMyIHdlaWdodF92ZWMwLCB3ZWlnaHRfdmVjMSwgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yOwotICAgIHY4aTE2IGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3I7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCB9OwotICAgIHY4dTE2IG1hc2s0ID0geyAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IH07CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiBkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3Q3NjsKKyAgICB2OGkxNiBkc3QyMSwgZHN0NDMsIGRzdDY1LCBkc3Q5NywgZHN0MTA4LCBkc3QxMDksIGRzdDk4OworICAgIHY0aTMyIG9mZnNldF92ZWMsIHJuZF92ZWMsIGNvbnN0X3ZlYywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAKICAgICBzcmMwX3B0ciAtPSAoKDMgKiBzcmNfc3RyaWRlKSArIDMpOwogCkBAIC0xODU1LDEwICsxOTU2LDkgQEAKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1c0X1NXKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgIFNQTEFUSV9XNF9TSChmaWx0ZXJfdmVjLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2syID0gbWFzazAgKyA0OwpAQCAtMTg2NiwxMyArMTk2NiwxNCBAQAogCiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKKyAgICBjb25zdF92ZWMgPSBfX21zYV9maWxsX3coKDEyOCAqIHdlaWdodDEpKTsKICAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwotICAgIHdlaWdodF92ZWMwID0gX19tc2FfZmlsbF93KHdlaWdodDApOwotICAgIHdlaWdodF92ZWMxID0gX19tc2FfZmlsbF93KHdlaWdodDEpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworICAgIG9mZnNldF92ZWMgKz0gY29uc3RfdmVjOworICAgIHdlaWdodF92ZWMgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogCiAgICAgTERfU0I3KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKICAgICBzcmMwX3B0ciArPSAoNyAqIHNyY19zdHJpZGUpOwpAQCAtMTg4Niw3MCArMTk4Nyw3NyBAQAogICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSk7CiAKLSAgICBkc3QzMCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgIGRzdDMwLCBkc3QzMCwgZHN0MzAsIGRzdDMwKTsKLSAgICBkc3Q0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgIGRzdDQxLCBkc3Q0MSwgZHN0NDEsIGRzdDQxKTsKLSAgICBkc3Q1MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgZHN0NTIsIGRzdDUyLCBkc3Q1MiwgZHN0NTIpOwotICAgIGRzdDYzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCNF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgIGRzdDYzLCBkc3Q2MywgZHN0NjMsIGRzdDYzKTsKKyAgICBkc3QzMCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0NDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDUyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDYzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAKLSAgICBJTFZSX0gzX1NIKGRzdDQxLCBkc3QzMCwgZHN0NTIsIGRzdDQxLCBkc3Q2MywgZHN0NTIsCi0gICAgICAgICAgICAgICBkc3QxMF9yLCBkc3QyMV9yLCBkc3QzMl9yKTsKLSAgICBkc3Q0M19yID0gX19tc2FfaWx2bF9oKGRzdDQxLCBkc3QzMCk7Ci0gICAgZHN0NTRfciA9IF9fbXNhX2lsdmxfaChkc3Q1MiwgZHN0NDEpOwotICAgIGRzdDY1X3IgPSBfX21zYV9pbHZsX2goZHN0NjMsIGRzdDUyKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q0MSwgZHN0MzAsIGRzdDEwLCBkc3Q0Myk7CisgICAgSUxWUkxfSDJfU0goZHN0NTIsIGRzdDQxLCBkc3QyMSwgZHN0NTQpOworICAgIElMVlJMX0gyX1NIKGRzdDYzLCBkc3Q1MiwgZHN0MzIsIGRzdDY1KTsKKwogICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDYzLCAxKTsKIAotICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4KTsKLSAgICAgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgTERfU0gyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEpOworICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMjsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgICAgIHNyYzBfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4wKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gKDIgKiBzcmMyX3N0cmlkZSk7CisgICAgICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjEpOwogICAgICAgICBzcmMxX3B0ciArPSAoMiAqIHNyYzJfc3RyaWRlKTsKIAotICAgICAgICBpbjAgPSAodjhpMTYpIF9fbXNhX2lsdnJfZCgodjJpNjQpIGluMSwgKHYyaTY0KSBpbjApOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM3LCBzcmM4KTsKLQotICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzksIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3Q4NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0ODcsIGRzdDg3LCBkc3Q4NywgZHN0ODcpOwotICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDg3LCBkc3Q2Nik7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF84VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwotICAgICAgICBkc3Q4N19yID0gX19tc2FfdnNoZl9oKCh2OGkxNikgbWFzazQsIGRzdDg3LCBkc3Q4Nyk7Ci0gICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF84VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzEwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0OTcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MTA4ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCi0gICAgICAgIGRzdDBfciA+Pj0gNjsKLSAgICAgICAgZHN0MV9yID4+PSA2OworICAgICAgICBkc3Q3NiA9IF9fbXNhX2lsdnJfaChkc3Q5NywgZHN0NjYpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDgsIGRzdDk3LCBkc3Q4NywgZHN0MTA5KTsKKyAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0OTcsIDEpOworICAgICAgICBkc3Q5OCA9IF9fbXNhX2lsdnJfaChkc3Q2NiwgZHN0MTA4KTsKIAotICAgICAgICBJTFZSTF9IMl9TVyhpbjAsIGluMCwgdG1wMSwgdG1wMik7Ci0gICAgICAgIHRtcDEgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSB0bXAxLCAodjhpMTYpIHdlaWdodF92ZWMwKTsKLSAgICAgICAgdG1wMiA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIHRtcDIsICh2OGkxNikgd2VpZ2h0X3ZlYzApOwotICAgICAgICB0bXAxICs9IGRzdDBfciAqIHdlaWdodF92ZWMxOwotICAgICAgICB0bXAyICs9IGRzdDFfciAqIHdlaWdodF92ZWMxOwotICAgICAgICBTUkFSX1cyX1NXKHRtcDEsIHRtcDIsIHJuZF92ZWMpOwotICAgICAgICB0bXAxID0gQ0xJUF9TV18wXzI1NSh0bXAxKTsKLSAgICAgICAgdG1wMiA9IENMSVBfU1dfMF8yNTUodG1wMik7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3Q3NiwgZmlsdF9oMCwgZmlsdF9oMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVAoZHN0MjEsIGRzdDQzLCBkc3Q2NSwgZHN0ODcsIGZpbHRfaDAsIGZpbHRfaDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQKGRzdDMyLCBkc3Q1NCwgZHN0NzYsIGRzdDk4LCBmaWx0X2gwLCBmaWx0X2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfOFRBUChkc3Q0MywgZHN0NjUsIGRzdDg3LCBkc3QxMDksIGZpbHRfaDAsIGZpbHRfaDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgU1JBXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOworICAgICAgICBQQ0tFVl9IMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCB0bXAxLCB0bXAzKTsKKyAgICAgICAgSUxWUkxfSDJfU0godG1wMSwgaW4wLCB0bXAwLCB0bXAxKTsKKyAgICAgICAgSUxWUkxfSDJfU0godG1wMywgaW4xLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAwLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgZHN0MSA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAxLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgZHN0MiA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAyLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgZHN0MyA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAzLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgU1JBUl9XNF9TVyhkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBybmRfdmVjKTsKKyAgICAgICAgQ0xJUF9TVzRfMF8yNTVfTUFYX1NBVFUoZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFBDS0VWX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIHRtcDAsIHRtcDEpOworICAgICAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAxLCAodjE2aTgpIHRtcDApOworICAgICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IyKHRtcDIsIHRtcDEsIHRtcDEpOwotICAgICAgICBTVDR4Ml9VQih0bXAxLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBkc3QxMF9yID0gZHN0MzJfcjsKLSAgICAgICAgZHN0MzJfciA9IGRzdDU0X3I7Ci0gICAgICAgIGRzdDU0X3IgPSBkc3Q3Nl9yOwotICAgICAgICBkc3QyMV9yID0gZHN0NDNfcjsKLSAgICAgICAgZHN0NDNfciA9IGRzdDY1X3I7Ci0gICAgICAgIGRzdDY1X3IgPSBkc3Q4N19yOwotICAgICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q4NywgMSk7CisgICAgICAgIGRzdDEwID0gZHN0NTQ7CisgICAgICAgIGRzdDMyID0gZHN0NzY7CisgICAgICAgIGRzdDU0ID0gZHN0OTg7CisgICAgICAgIGRzdDIxID0gZHN0NjU7CisgICAgICAgIGRzdDQzID0gZHN0ODc7CisgICAgICAgIGRzdDY1ID0gZHN0MTA5OworICAgICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QxMDgsIDEpOwogICAgIH0KIH0KIApAQCAtMTk2Nyw1NyArMjA3NSw1OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGg4bXVsdCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudCwgY250OwotICAgIGludDMyX3Qgb2Zmc2V0OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CiAgICAgdWludDhfdCAqc3JjMF9wdHJfdG1wOwogICAgIGludDE2X3QgKnNyYzFfcHRyX3RtcDsKICAgICB1aW50OF90ICpkc3RfdG1wOworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwogICAgIHY4aTE2IGluMCwgaW4xOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlYzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OwogICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0ODsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2w7Ci0gICAgdjRpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwogICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3I7CiAgICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0NzZfbDsKICAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yOwogICAgIHY4aTE2IGRzdDIxX2wsIGRzdDQzX2wsIGRzdDY1X2wsIGRzdDg3X2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYzAsIHdlaWdodF92ZWMxLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHY0aTMyIG9mZnNldF92ZWMsIHJuZF92ZWMsIGNvbnN0X3ZlYzsKIAogICAgIHNyYzBfcHRyIC09ICgoMyAqIHNyY19zdHJpZGUpICsgMyk7CiAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOworICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2ZpbGxfdygoMTI4ICogd2VpZ2h0MSkpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7Ci0gICAgd2VpZ2h0X3ZlYzAgPSBfX21zYV9maWxsX3cod2VpZ2h0MCk7Ci0gICAgd2VpZ2h0X3ZlYzEgPSBfX21zYV9maWxsX3cod2VpZ2h0MSk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CisgICAgb2Zmc2V0X3ZlYyArPSBjb25zdF92ZWM7CisgICAgd2VpZ2h0X3ZlYyA9ICh2OGkxNikgX19tc2FfZmlsbF93KHdlaWdodCk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3gpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzRfU1coZmlsdGVyX3ZlYywgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgU1BMQVRJX1c0X1NIKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAgICAgbWFzazIgPSBtYXNrMCArIDQ7CiAgICAgbWFzazMgPSBtYXNrMCArIDY7CiAKLSAgICBmb3IgKGNudCA9IHdpZHRoID4+IDM7IGNudC0tOykgeworICAgIGZvciAoY250ID0gd2lkdGg4bXVsdDsgY250LS07KSB7CiAgICAgICAgIHNyYzBfcHRyX3RtcCA9IHNyYzBfcHRyOwogICAgICAgICBzcmMxX3B0cl90bXAgPSBzcmMxX3B0cjsKICAgICAgICAgZHN0X3RtcCA9IGRzdDsKQEAgLTIwMzgsMTggKzIxNDcsMTQgQEAKICAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSk7CiAKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOwogCiAgICAgICAgIC8qIHJvdyA0IHJvdyA1IHJvdyA2ICovCiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCkBAIC0yMDU5LDIyICsyMTY0LDEyIEBACiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExKTsKIAotICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q0LCBkc3Q0LCBkc3Q0LCBkc3Q0KTsKLSAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NSwgZHN0NSwgZHN0NSwgZHN0NSk7Ci0gICAgICAgIGRzdDYgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NiwgZHN0NiwgZHN0NiwgZHN0Nik7Ci0KLSAgICAgICAgSUxWUl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3QyLCBkc3QxLAotICAgICAgICAgICAgICAgICAgIGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDIxX3IpOwotICAgICAgICBJTFZSX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDYsIGRzdDUsIGRzdDQzX3IsIGRzdDY1X3IpOwotICAgICAgICBJTFZMX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDIsIGRzdDEsCi0gICAgICAgICAgICAgICAgICAgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCk7Ci0gICAgICAgIElMVkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NiwgZHN0NSwgZHN0NDNfbCwgZHN0NjVfbCk7CisgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0NiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKIAogICAgICAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDE7IGxvb3BfY250LS07KSB7CiAgICAgICAgICAgICBMRF9TQjIoc3JjMF9wdHJfdG1wLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4KTsKQEAgLTIwODQsMTEgKzIxNzksMTcgQEAKICAgICAgICAgICAgIExEX1NIMihzcmMxX3B0cl90bXAsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7CiAgICAgICAgICAgICBzcmMxX3B0cl90bXAgKz0gKDIgKiBzcmMyX3N0cmlkZSk7CiAKKyAgICAgICAgICAgIElMVlJfSDRfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0MiwgZHN0MSwgZHN0MTBfciwKKyAgICAgICAgICAgICAgICAgICAgICAgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfcik7CisgICAgICAgICAgICBJTFZMX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDIsIGRzdDEsIGRzdDEwX2wsCisgICAgICAgICAgICAgICAgICAgICAgIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDIxX2wpOworICAgICAgICAgICAgSUxWUl9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q2LCBkc3Q1LCBkc3Q0M19yLCBkc3Q2NV9yKTsKKyAgICAgICAgICAgIElMVkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NiwgZHN0NSwgZHN0NDNfbCwgZHN0NjVfbCk7CisKICAgICAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICAgICAgZHN0NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q3LCBkc3Q3LCBkc3Q3LCBkc3Q3KTsKKyAgICAgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKIAogICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NywgZHN0NiwgZHN0NzZfciwgZHN0NzZfbCk7CiAgICAgICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLApAQCAtMjEwMiwxMCArMjIwMyw4IEBACiAgICAgICAgICAgICAvKiByb3cgOCAqLwogICAgICAgICAgICAgVlNIRl9CNF9TQihzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0KLSAgICAgICAgICAgIGRzdDggPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0OCwgZHN0OCwgZHN0OCwgZHN0OCk7CisgICAgICAgICAgICBkc3Q4ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CiAKICAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOwogICAgICAgICAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfciwKQEAgLTIxMTYsNDMgKzIyMTUsMjYgQEAKICAgICAgICAgICAgIGRzdDFfciA+Pj0gNjsKICAgICAgICAgICAgIGRzdDFfbCA+Pj0gNjsKIAotICAgICAgICAgICAgSUxWUkxfSDJfU1coaW4wLCBpbjAsIHRtcDAsIHRtcDEpOwotICAgICAgICAgICAgSUxWUkxfSDJfU1coaW4xLCBpbjEsIHRtcDIsIHRtcDMpOwotICAgICAgICAgICAgdG1wMCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIHRtcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNikgd2VpZ2h0X3ZlYzApOwotICAgICAgICAgICAgdG1wMSA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIHRtcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNikgd2VpZ2h0X3ZlYzApOwotICAgICAgICAgICAgdG1wMiA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIHRtcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNikgd2VpZ2h0X3ZlYzApOwotICAgICAgICAgICAgdG1wMyA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIHRtcDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2OGkxNikgd2VpZ2h0X3ZlYzApOwotCi0gICAgICAgICAgICB0bXAwICs9IChkc3QwX3IgKiB3ZWlnaHRfdmVjMSk7Ci0gICAgICAgICAgICB0bXAxICs9IChkc3QwX2wgKiB3ZWlnaHRfdmVjMSk7Ci0gICAgICAgICAgICB0bXAyICs9IChkc3QxX3IgKiB3ZWlnaHRfdmVjMSk7Ci0gICAgICAgICAgICB0bXAzICs9IChkc3QxX2wgKiB3ZWlnaHRfdmVjMSk7Ci0KLSAgICAgICAgICAgIFNSQVJfVzRfU1codG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgcm5kX3ZlYyk7Ci0gICAgICAgICAgICB0bXAwID0gQ0xJUF9TV18wXzI1NSh0bXAwKTsKLSAgICAgICAgICAgIHRtcDEgPSBDTElQX1NXXzBfMjU1KHRtcDEpOwotICAgICAgICAgICAgdG1wMiA9IENMSVBfU1dfMF8yNTUodG1wMik7Ci0gICAgICAgICAgICB0bXAzID0gQ0xJUF9TV18wXzI1NSh0bXAzKTsKLSAgICAgICAgICAgIEhFVkNfUENLX1NXX1NCNCh0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCBkc3QwX3IpOwotICAgICAgICAgICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFBDS0VWX0gyX1NIKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgdG1wMSwgdG1wMyk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSCh0bXAxLCBpbjAsIHRtcDAsIHRtcDEpOworICAgICAgICAgICAgSUxWUkxfSDJfU0godG1wMywgaW4xLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgICAgIGRzdDBfciA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAwLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgICAgIGRzdDBfbCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAxLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgICAgIGRzdDFfciA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAyLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgICAgIGRzdDFfbCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAzLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgICAgIFNSQVJfVzRfU1coZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBybmRfdmVjKTsKKyAgICAgICAgICAgIENMSVBfU1c0XzBfMjU1X01BWF9TQVRVKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfcik7CisgICAgICAgICAgICBQQ0tFVl9IMl9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIHRtcDAsIHRtcDEpOworICAgICAgICAgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wMSwgKHYxNmk4KSB0bXAwKTsKKyAgICAgICAgICAgIFNUOHgyX1VCKG91dCwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7CiAgICAgICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgICAgIGRzdDEwX3IgPSBkc3QzMl9yOwotICAgICAgICAgICAgZHN0MzJfciA9IGRzdDU0X3I7Ci0gICAgICAgICAgICBkc3Q1NF9yID0gZHN0NzZfcjsKLSAgICAgICAgICAgIGRzdDEwX2wgPSBkc3QzMl9sOwotICAgICAgICAgICAgZHN0MzJfbCA9IGRzdDU0X2w7Ci0gICAgICAgICAgICBkc3Q1NF9sID0gZHN0NzZfbDsKLSAgICAgICAgICAgIGRzdDIxX3IgPSBkc3Q0M19yOwotICAgICAgICAgICAgZHN0NDNfciA9IGRzdDY1X3I7Ci0gICAgICAgICAgICBkc3Q2NV9yID0gZHN0ODdfcjsKLSAgICAgICAgICAgIGRzdDIxX2wgPSBkc3Q0M19sOwotICAgICAgICAgICAgZHN0NDNfbCA9IGRzdDY1X2w7Ci0gICAgICAgICAgICBkc3Q2NV9sID0gZHN0ODdfbDsKKyAgICAgICAgICAgIGRzdDAgPSBkc3QyOworICAgICAgICAgICAgZHN0MSA9IGRzdDM7CisgICAgICAgICAgICBkc3QyID0gZHN0NDsKKyAgICAgICAgICAgIGRzdDMgPSBkc3Q1OworICAgICAgICAgICAgZHN0NCA9IGRzdDY7CisgICAgICAgICAgICBkc3Q1ID0gZHN0NzsKICAgICAgICAgICAgIGRzdDYgPSBkc3Q4OwogICAgICAgICB9CiAKQEAgLTIxODEsNyArMjI2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsLCAxKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF84dF8xMndfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMjE5OSwxNiArMjI4MSwyMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGhldmNfaHZfYml3Z3RfOHRfOG11bHR4Mm11bHRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0MSwgcm5kX3ZhbCwgOCk7Ci0gICAgaGV2Y19odl9iaXdndF84dF80d19tc2Eoc3JjMF9wdHIgKyA4LCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFfcHRyICsgOCwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgOCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsKTsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB1aW50OF90ICpzcmMwX3B0cl90bXAsICpkc3RfdG1wOworICAgIGludDE2X3QgKnNyYzFfcHRyX3RtcDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIHVpbnQ2NF90IHRwMCwgdHAxOworICAgIHYxNnU4IG91dDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CisgICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3OworICAgIHY4aTE2IGluMCA9IHsgMCB9LCBpbjEgPSB7IDAgfTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOworICAgIHY4aTE2IGRzdGgwLCBkc3RoMSwgZHN0aDIsIGRzdGgzLCBkc3RoNCwgZHN0aDUsIGRzdGg2LCBkc3RoNywgZHN0aDg7CisgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfcjsKKyAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3Q3Nl9sLCBkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sOworICAgIHY4aTE2IGRzdDMwLCBkc3Q0MSwgZHN0NTIsIGRzdDYzLCBkc3Q2NiwgZHN0ODcsIGRzdDEwLCBkc3QzMiwgZHN0NTQsIGRzdDc2OworICAgIHY4aTE2IGRzdDIxLCBkc3Q0MywgZHN0NjUsIGRzdDk3LCBkc3QxMDgsIGRzdDEwOSwgZHN0OTgsIGRzdDg3X3IsIGRzdDg3X2w7CisgICAgdjRpMzIgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgY29uc3RfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworCisgICAgc3JjMF9wdHIgLT0gKCgzICogc3JjX3N0cmlkZSkgKyAzKTsKKworICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKKyAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CisgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2ZpbGxfdygoMTI4ICogd2VpZ2h0MSkpOworICAgIGNvbnN0X3ZlYyA8PD0gNjsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CisgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CisgICAgb2Zmc2V0X3ZlYyArPSBjb25zdF92ZWM7CisgICAgd2VpZ2h0X3ZlYyA9ICh2OGkxNikgX19tc2FfZmlsbF93KHdlaWdodCk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3gpOworICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CisKKyAgICBTUExBVElfVzRfU0goZmlsdGVyX3ZlYywgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisKKyAgICBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOworICAgIG1hc2sxID0gbWFzazAgKyAyOworICAgIG1hc2syID0gbWFzazAgKyA0OworICAgIG1hc2szID0gbWFzazAgKyA2OworCisgICAgc3JjMF9wdHJfdG1wID0gc3JjMF9wdHI7CisgICAgc3JjMV9wdHJfdG1wID0gc3JjMV9wdHI7CisgICAgZHN0X3RtcCA9IGRzdDsKKworICAgIExEX1NCNyhzcmMwX3B0cl90bXAsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgIHNyYzBfcHRyX3RtcCArPSAoNyAqIHNyY19zdHJpZGUpOworICAgIFhPUklfQjdfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworCisgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjOCwgdmVjOSwgdmVjMTAsCisgICAgICAgICAgICAgICB2ZWMxMSk7CisgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMTIsIHZlYzEzLCB2ZWMxNCwKKyAgICAgICAgICAgICAgIHZlYzE1KTsKKyAgICBkc3RoMCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0aDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdGgyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdGgzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CisgICAgVlNIRl9CNF9TQihzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CNF9TQihzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CNF9TQihzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjOCwgdmVjOSwgdmVjMTAsCisgICAgICAgICAgICAgICB2ZWMxMSk7CisgICAgZHN0aDQgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdGg1ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3RoNiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKworICAgIGZvciAobG9vcF9jbnQgPSA4OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjIoc3JjMF9wdHJfdG1wLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4KTsKKyAgICAgICAgc3JjMF9wdHJfdG1wICs9ICgyICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzcsIHNyYzgpOworCisgICAgICAgIExEX1NIMihzcmMxX3B0cl90bXAsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7CisgICAgICAgIHNyYzFfcHRyX3RtcCArPSAoMiAqIHNyYzJfc3RyaWRlKTsKKworICAgICAgICBJTFZSX0g0X1NIKGRzdGgxLCBkc3RoMCwgZHN0aDMsIGRzdGgyLCBkc3RoNSwgZHN0aDQsIGRzdGgyLCBkc3RoMSwKKyAgICAgICAgICAgICAgICAgICBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3QyMV9yKTsKKyAgICAgICAgSUxWTF9INF9TSChkc3RoMSwgZHN0aDAsIGRzdGgzLCBkc3RoMiwgZHN0aDUsIGRzdGg0LCBkc3RoMiwgZHN0aDEsCisgICAgICAgICAgICAgICAgICAgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCk7CisgICAgICAgIElMVlJfSDJfU0goZHN0aDQsIGRzdGgzLCBkc3RoNiwgZHN0aDUsIGRzdDQzX3IsIGRzdDY1X3IpOworICAgICAgICBJTFZMX0gyX1NIKGRzdGg0LCBkc3RoMywgZHN0aDYsIGRzdGg1LCBkc3Q0M19sLCBkc3Q2NV9sKTsKKworICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBkc3RoNyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworCisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg3LCBkc3RoNiwgZHN0NzZfciwgZHN0NzZfbCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3Q3Nl9sLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDAgPj49IDY7CisgICAgICAgIGRzdDEgPj49IDY7CisKKyAgICAgICAgVlNIRl9CNF9TQihzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwKKyAgICAgICAgICAgICAgICAgICB2ZWMzKTsKKyAgICAgICAgZHN0aDggPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKworICAgICAgICBJTFZSTF9IMl9TSChkc3RoOCwgZHN0aDcsIGRzdDg3X3IsIGRzdDg3X2wpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVAoZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbCwgZHN0ODdfbCwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QyID4+PSA2OworICAgICAgICBkc3QzID4+PSA2OworCisgICAgICAgIFBDS0VWX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIHRtcDEsIHRtcDMpOworICAgICAgICBJTFZSTF9IMl9TSCh0bXAxLCBpbjAsIHRtcDAsIHRtcDEpOworICAgICAgICBJTFZSTF9IMl9TSCh0bXAzLCBpbjEsIHRtcDIsIHRtcDMpOworICAgICAgICBkc3QwID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDAsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QxID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDEsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QyID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDIsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QzID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDMsIHdlaWdodF92ZWMpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIHJuZF92ZWMpOworICAgICAgICBDTElQX1NXNF8wXzI1NV9NQVhfU0FUVShkc3QxLCBkc3QwLCBkc3QzLCBkc3QyKTsKKyAgICAgICAgUENLRVZfSDJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMCwgdG1wMSk7CisgICAgICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHRtcDEsICh2MTZpOCkgdG1wMCk7CisgICAgICAgIFNUOHgyX1VCKG91dCwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdF90bXAgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKKworICAgICAgICBkc3RoMCA9IGRzdGgyOworICAgICAgICBkc3RoMSA9IGRzdGgzOworICAgICAgICBkc3RoMiA9IGRzdGg0OworICAgICAgICBkc3RoMyA9IGRzdGg1OworICAgICAgICBkc3RoNCA9IGRzdGg2OworICAgICAgICBkc3RoNSA9IGRzdGg3OworICAgICAgICBkc3RoNiA9IGRzdGg4OworICAgIH0KKworICAgIHNyYzBfcHRyICs9IDg7CisgICAgc3JjMV9wdHIgKz0gODsKKyAgICBkc3QgKz0gODsKKworICAgIG1hc2s0ID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKKyAgICBtYXNrNSA9IG1hc2s0ICsgMjsKKyAgICBtYXNrNiA9IG1hc2s0ICsgNDsKKyAgICBtYXNrNyA9IG1hc2s0ICsgNjsKKworICAgIExEX1NCNyhzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgc3JjMF9wdHIgKz0gKDcgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0I3XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKworICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjNCwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjRfU0Ioc3JjMiwgc3JjNSwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzgsIHZlYzksIHZlYzEwLAorICAgICAgICAgICAgICAgdmVjMTEpOworICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjNiwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzEyLCB2ZWMxMywgdmVjMTQsCisgICAgICAgICAgICAgICB2ZWMxNSk7CisgICAgZHN0MzAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDQxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q1MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q2MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIElMVlJMX0gyX1NIKGRzdDQxLCBkc3QzMCwgZHN0MTAsIGRzdDQzKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q1MiwgZHN0NDEsIGRzdDIxLCBkc3Q1NCk7CisgICAgSUxWUkxfSDJfU0goZHN0NjMsIGRzdDUyLCBkc3QzMiwgZHN0NjUpOworCisgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0NjMsIDEpOworCisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisKKyAgICAgICAgTEQyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHAwLCB0cDEpOworICAgICAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMCk7CisgICAgICAgIHNyYzFfcHRyICs9ICgyICogc3JjMl9zdHJpZGUpOworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4xKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gKDIgKiBzcmMyX3N0cmlkZSk7CisKKyAgICAgICAgVlNIRl9CNF9TQihzcmM3LCBzcmM5LCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjMCwgdmVjMSwgdmVjMiwKKyAgICAgICAgICAgICAgICAgICB2ZWMzKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmM4LCBzcmMxMCwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzQsIHZlYzUsIHZlYzYsCisgICAgICAgICAgICAgICAgICAgdmVjNyk7CisgICAgICAgIGRzdDk3ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDEwOCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKworICAgICAgICBkc3Q3NiA9IF9fbXNhX2lsdnJfaChkc3Q5NywgZHN0NjYpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDgsIGRzdDk3LCBkc3Q4NywgZHN0MTA5KTsKKyAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0OTcsIDEpOworICAgICAgICBkc3Q5OCA9IF9fbXNhX2lsdnJfaChkc3Q2NiwgZHN0MTA4KTsKKworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVAoZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYsIGZpbHRfaDAsIGZpbHRfaDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQKGRzdDIxLCBkc3Q0MywgZHN0NjUsIGRzdDg3LCBmaWx0X2gwLCBmaWx0X2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUChkc3QzMiwgZHN0NTQsIGRzdDc2LCBkc3Q5OCwgZmlsdF9oMCwgZmlsdF9oMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVAoZHN0NDMsIGRzdDY1LCBkc3Q4NywgZHN0MTA5LCBmaWx0X2gwLCBmaWx0X2gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIFNSQV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICAgICAgUENLRVZfSDJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMSwgdG1wMyk7CisgICAgICAgIElMVlJMX0gyX1NIKHRtcDEsIGluMCwgdG1wMCwgdG1wMSk7CisgICAgICAgIElMVlJMX0gyX1NIKHRtcDMsIGluMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIGRzdDAgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMCwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDEgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMSwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMiwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDMgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMywgd2VpZ2h0X3ZlYyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgcm5kX3ZlYyk7CisgICAgICAgIENMSVBfU1c0XzBfMjU1X01BWF9TQVRVKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBQQ0tFVl9IMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCB0bXAwLCB0bXAxKTsKKyAgICAgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wMSwgKHYxNmk4KSB0bXAwKTsKKyAgICAgICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwID0gZHN0NTQ7CisgICAgICAgIGRzdDMyID0gZHN0NzY7CisgICAgICAgIGRzdDU0ID0gZHN0OTg7CisgICAgICAgIGRzdDIxID0gZHN0NjU7CisgICAgICAgIGRzdDQzID0gZHN0ODc7CisgICAgICAgIGRzdDY1ID0gZHN0MTA5OworICAgICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QxMDgsIDEpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF84dF8xNndfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMjIzMCw3ICsyNTM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB3ZWlnaHQwLCB3ZWlnaHQxLCBvZmZzZXQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDEsIHJuZF92YWwsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsLCAyKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF84dF8yNHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMjI1Miw3ICsyNTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB3ZWlnaHQwLCB3ZWlnaHQxLCBvZmZzZXQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDEsIHJuZF92YWwsIDI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsLCAzKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF84dF8zMndfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMjI3NCw3ICsyNTc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB3ZWlnaHQwLCB3ZWlnaHQxLCBvZmZzZXQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDEsIHJuZF92YWwsIDMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsLCA0KTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF84dF80OHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMjI5Niw3ICsyNjAxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB3ZWlnaHQwLCB3ZWlnaHQxLCBvZmZzZXQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDEsIHJuZF92YWwsIDQ4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsLCA2KTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF84dF82NHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMjMxOCw3ICsyNjIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB3ZWlnaHQwLCB3ZWlnaHQxLCBvZmZzZXQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDEsIHJuZF92YWwsIDY0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsLCA4KTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19oel9iaXdndF80dF80eDJfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMjMyOCwyMiArMjYzMywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQsIGNvbnN0YW50OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxOwogICAgIHY4aTE2IGluMCwgaW4xOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzE2XSk7CiAgICAgdjE2aTggbWFzazEsIHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgZHN0MDsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbDsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgb3V0MCwgZmlsdGVyX3ZlYzsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gMTsKQEAgLTIzNTYsOSArMjY2MCwxMCBAQAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTIzNjksMTggKzI2NzQsMTYgQEAKICAgICBYT1JJX0IyXzEyOF9TQihzcmMwLCBzcmMxKTsKIAogICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgSUxWUkxfSDJfU1coZHN0MCwgaW4wLCBkc3QwX3IsIGRzdDBfbCk7CiAgICAgZHN0MF9yID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsICh2OGkxNikgZHN0MF9yLCAodjhpMTYpIHdlaWdodF92ZWMpOwogICAgIGRzdDBfbCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIGRzdDBfbCwgKHY4aTE2KSB3ZWlnaHRfdmVjKTsKICAgICBTUkFSX1cyX1NXKGRzdDBfciwgZHN0MF9sLCBybmRfdmVjKTsKLSAgICBkc3QwX3IgPSBDTElQX1NXXzBfMjU1KGRzdDBfcik7Ci0gICAgZHN0MF9sID0gQ0xJUF9TV18wXzI1NShkc3QwX2wpOwotCi0gICAgSEVWQ19QQ0tfU1dfU0IyKGRzdDBfbCwgZHN0MF9yLCBkc3QwX3IpOwotICAgIFNUNHgyX1VCKGRzdDBfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QwX3IgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QwX2wsICh2OGkxNikgZHN0MF9yKTsKKyAgICBvdXQwID0gQ0xJUF9TSF8wXzI1NShkc3QwX3IpOworICAgIG91dDAgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBvdXQwLCAodjE2aTgpIG91dDApOworICAgIFNUNHgyX1VCKG91dDAsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHpfYml3Z3RfNHRfNHg0X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTIzOTAsMjMgKzI2OTMsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwIH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclsxNl0pOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHY4aTE2IGRzdDAsIGRzdDE7CiAgICAgdjE2aTggdmVjMCwgdmVjMTsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOwogICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMwX3B0ciAtPSAxOwpAQCAtMjQyMCw5ICsyNzIxLDEwIEBACiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtMjQzMywxNyArMjczNSwxNSBAQAogICAgIElMVlJfRDJfU0goaW4xLCBpbjAsIGluMywgaW4yLCBpbjAsIGluMSk7CiAKICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICBIRVZDX0JJV19STkRfQ0xJUDIoZHN0MCwgZHN0MSwgaW4wLCBpbjEsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7CisgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEpOwogCi0gICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICBTVDR4NF9VQihkc3QwX3IsIGRzdDBfciwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QwID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MSwgKHYxNmk4KSBkc3QwKTsKKyAgICBTVDR4NF9VQihkc3QwLCBkc3QwLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h6X2Jpd2d0XzR0XzR4OG11bHRpcGxlX21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTI0NjEsMTYgKzI3NjEsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQzMl90IHdlaWdodCwgb2Zmc2V0OworICAgIGludDMyX3Qgd2VpZ2h0LCBvZmZzZXQsIGNvbnN0YW50OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzE2XSk7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjE2aTggdmVjMCwgdmVjMTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOwogICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMwX3B0ciAtPSAxOwpAQCAtMjQ4MSw5ICsyNzgwLDEwIEBACiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtMjUwMywyNiArMjgwMywyMCBAQAogICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKIAogICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMzLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzcsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1Q0eDhfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDEpOworICAgICAgICBTVDR4OF9VQihkc3QwLCBkc3QxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC0yNTQzLDExICsyODM3LDExIEBACiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfaHpfYml3Z3RfNHRfNHgyX21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h6X2Jpd2d0XzR0XzR4NF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwpOwogICAgIH0gZWxzZSBpZiAoMCA9PSAoaGVpZ2h0ICUgOCkpIHsKICAgICAgICAgaGV2Y19oel9iaXdndF80dF80eDhtdWx0aXBsZV9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCkBAIC0yNTczLDE2ICsyODY3LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHYxNmk4IHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IDE7CkBAIC0yNTkzLDE2ICsyODg2LDE3IEBACiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKKyAgICBmb3IgKGxvb3BfY250ID0gMjsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0I0KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICAgICAgc3JjMF9wdHIgKz0gKDQgKiBzcmNfc3RyaWRlKTsKICAgICAgICAgTERfU0g0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKQEAgLTI2MTAsMjcgKzI5MDQsMjEgQEAKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1Q2eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDEpOworICAgICAgICBTVDZ4NF9VQihkc3QwLCBkc3QxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC0yNjQyLDIyICsyOTMwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodCwgY29uc3RhbnQ7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzE7CiAgICAgdjhpMTYgaW4wLCBpbjE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMSwgdmVjMCwgdmVjMTsKICAgICB2OGkxNiBkc3QwLCBkc3QxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2w7CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gMTsKQEAgLTI2NjgsOSArMjk1NCwxMCBAQAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTI2ODEsMTcgKzI5NjgsMTUgQEAKICAgICBMRF9TSDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7CiAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMCwgc3JjMSk7CiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7CisgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgSEVWQ19CSVdfUk5EX0NMSVAyKGRzdDAsIGRzdDEsIGluMCwgaW4xLAogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOworICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxKTsKIAotICAgIEhFVkNfUENLX1NXX1NCNChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDBfcik7Ci0gICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIGRzdDAgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxLCAodjE2aTgpIGRzdDApOworICAgIFNUOHgyX1VCKGRzdDAsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHpfYml3Z3RfNHRfOHg2X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTI3MDEsMjQgKzI5ODYsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaW50MzJfdCB3ZWlnaHQsIG9mZnNldDsKKyAgICBpbnQzMl90IHdlaWdodCwgb2Zmc2V0LCBjb25zdGFudDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41OwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjE2aTggdmVjMCwgdmVjMTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgZHN0NF9sLCBkc3Q1X2w7CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gMTsKQEAgLTI3MjksOSArMzAxMSwxMCBAQAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTI3NDUsMzggKzMwMjgsMzAgQEAKICAgICBMRF9TSDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjQsIGluNSk7CiAgICAgWE9SSV9CNl8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSk7CiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7CisgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7CisgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7CisgICAgZHN0NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCiAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKICAgICBIRVZDX0JJV19STkRfQ0xJUDIoZHN0NCwgZHN0NSwgaW40LCBpbjUsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDRfciwgZHN0NV9yLCBkc3Q0X2wsIGRzdDVfbCk7CisgICAgICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUpOwogCi0gICAgSEVWQ19QQ0tfU1dfU0IxMihkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q0X2wsIGRzdDRfciwgZHN0NV9sLCBkc3Q1X3IsIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IpOwotICAgIFNUOHg0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFBDS0VWX0IyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDEpOworICAgIGRzdDMgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3Q1LCAodjE2aTgpIGRzdDQpOworICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgU1Q4eDJfVUIoZHN0Ml9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFNUOHgyX1VCKGRzdDMsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHpfYml3Z3RfNHRfOHg0bXVsdGlwbGVfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMjc5NCwxNiArMzA2OSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodCwgY29uc3RhbnQ7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHYxNmk4IHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IDE7CkBAIC0yODE0LDkgKzMwODgsMTAgQEAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC0yODMxLDI2ICszMTA2LDIwIEBACiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogCiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVDh4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7CisgICAgICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KQEAgLTI4NzEsMTEgKzMxNDAsMTEgQEAKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19oel9iaXdndF80dF84eDJfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQwLCB3ZWlnaHQxLCBvZmZzZXQwLCBvZmZzZXQxLCBybmRfdmFsKTsKICAgICB9IGVsc2UgaWYgKDYgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfaHpfYml3Z3RfNHRfOHg2X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSA0KSkgewogICAgICAgICBoZXZjX2h6X2Jpd2d0XzR0Xzh4NG11bHRpcGxlX21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwKQEAgLTI5MDEsMjAgKzMxNzAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHYxNmk4IG1hc2syID0gewogICAgICAgICA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LCAyOAogICAgIH07CiAgICAgdjE2aTggbWFzazEsIG1hc2szOwogICAgIHYxNmk4IHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIGRzdDRfbCwgZHN0NV9sOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IDE7CkBAIC0yOTI1LDkgKzMxOTIsMTAgQEAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC0yOTM1LDcgKzMyMDMsNyBAQAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2szID0gbWFzazIgKyAyOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgICAgIHNyYzBfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7CiAgICAgICAgIExEX1NINChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7CkBAIC0yOTQ1LDM4ICszMjEzLDI5IEBACiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogCiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMzLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDIoZHN0NCwgZHN0NSwgaW40LCBpbjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCMTIoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X2wsIGRzdDRfciwgZHN0NV9sLCBkc3Q1X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfcik7Ci0gICAgICAgIFNUMTJ4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgZHN0MyA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDUsICh2MTZpOCkgZHN0NCk7CisgICAgICAgIFNUMTJ4NF9VQihkc3QwLCBkc3QxLCBkc3QzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC0yOTk2LDE2ICszMjU1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodCwgY29uc3RhbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogICAgIHYxNmk4IHZlYzAsIHZlYzE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IDE7CkBAIC0zMDE2LDkgKzMyNzQsMTAgQEAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC0zMDM1LDQ5ICszMjk0LDM3IEBACiAgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwogCiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NiwgZHN0Nik7CisgICAgICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDcgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDcsIGRzdDcpOworICAgICAgICBkc3Q3ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgU1RfU0gyKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW40LCBpbjUsIGluNiwgaW43LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7CisgICAgICAgIFNUX1NIMihkc3QwLCBkc3QxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC0zMDk3LDE3ICszMzQ0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7Ci0gICAgdWludDhfdCAqZHN0X3RtcCA9IGRzdCArIDE2OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQsIGNvbnN0YW50OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gMTsKQEAgLTMxMTgsOSArMzM2MywxMCBAQAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTMxMjksNyArMzM3NSw3IEBACiAgICAgbWFzazIgPSBtYXNrMCArIDg7CiAgICAgbWFzazMgPSBtYXNrMCArIDEwOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMSk7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDE2OyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzIpOwogICAgICAgICBMRF9TQjIoc3JjMF9wdHIgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMSwgc3JjMyk7CiAgICAgICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7CkBAIC0zMTQwLDQxICszMzg2LDMzIEBACiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogCiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgU1RfU0gyKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CisKICAgICAgICAgLyogOCB3aWR0aCAqLwogICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQMihkc3QwLCBkc3QxLCBpbjQsIGluNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICAgICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0X3RtcCArPSAoMiAqIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QwID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MSwgKHYxNmk4KSBkc3QwKTsKKyAgICAgICAgU1Q4eDJfVUIoZHN0MCwgKGRzdCArIDE2KSwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KIApAQCAtMzE5MywxNiArMzQzMSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQsIGNvbnN0YW50OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzI7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogICAgIHYxNmk4IHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOwogICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMwX3B0ciAtPSAxOwpAQCAtMzIxMyw5ICszNDUwLDEwIEBACiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtMzIzMywyNiArMzQ3MSwyMCBAQAogICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKIAogICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3QsIDE2KTsKKyAgICAgICAgUENLRVZfQjJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7CisgICAgICAgIFNUX1NIMihkc3QwLCBkc3QxLCBkc3QsIDE2KTsKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CiAgICAgfQogfQpAQCAtMzI2NCwyMCArMzQ5NiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBpbnQzMl90IHdlaWdodCwgb2Zmc2V0OworICAgIGludDMyX3Qgd2VpZ2h0LCBvZmZzZXQsIGNvbnN0YW50OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGRzdDEwOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3IsIHNyYzIxMTAsIHNyYzQzMzI7CiAgICAgdjRpMzIgZHN0MTBfciwgZHN0MTBfbDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIG91dDsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gc3JjX3N0cmlkZTsKQEAgLTMyODUsOSArMzUxNiwxMCBAQAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTMzMTAsMTggKzM1NDIsMTYgQEAKICAgICBzcmM0MzMyID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmM0M19yLCAodjJpNjQpIHNyYzMyX3IpOwogICAgIHNyYzQzMzIgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzQzMzIsIDEyOCk7CiAKLSAgICBkc3QxMCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxLCBkc3QxMCwgZHN0MTApOworICAgIGRzdDEwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxKTsKIAogICAgIElMVlJMX0gyX1NXKGRzdDEwLCBpbjAsIGRzdDEwX3IsIGRzdDEwX2wpOwogICAgIGRzdDEwX3IgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3QxMF9yLCAodjhpMTYpIHdlaWdodF92ZWMpOwogICAgIGRzdDEwX2wgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgKHY4aTE2KSBkc3QxMF9sLCAodjhpMTYpIHdlaWdodF92ZWMpOwogICAgIFNSQVJfVzJfU1coZHN0MTBfciwgZHN0MTBfbCwgcm5kX3ZlYyk7Ci0gICAgZHN0MTBfciA9IENMSVBfU1dfMF8yNTUoZHN0MTBfcik7Ci0gICAgZHN0MTBfbCA9IENMSVBfU1dfMF8yNTUoZHN0MTBfbCk7Ci0KLSAgICBIRVZDX1BDS19TV19TQjIoZHN0MTBfbCwgZHN0MTBfciwgZHN0MTBfcik7Ci0gICAgU1Q0eDJfVUIoZHN0MTBfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QxMF9yID0gKHY0aTMyKSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MTBfbCwgKHY4aTE2KSBkc3QxMF9yKTsKKyAgICBvdXQgPSBDTElQX1NIXzBfMjU1KGRzdDEwX3IpOworICAgIG91dCA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIG91dCwgKHYxNmk4KSBvdXQpOworICAgIFNUNHgyX1VCKG91dCwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y192dF9iaXdndF80dF80eDRfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMzMzMSwyMiArMzU2MSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBpbnQzMl90IHdlaWdodCwgb2Zmc2V0OworICAgIGludDMyX3Qgd2VpZ2h0LCBvZmZzZXQsIGNvbnN0YW50OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzY7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3I7CiAgICAgdjE2aTggc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NDsKICAgICB2OGkxNiBkc3QxMCwgZHN0MzI7Ci0gICAgdjRpMzIgZHN0MTBfciwgZHN0MzJfciwgZHN0MTBfbCwgZHN0MzJfbDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IHNyY19zdHJpZGU7CkBAIC0zMzU0LDkgKzM1ODIsMTAgQEAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC0zMzgwLDE3ICszNjA5LDE1IEBACiAgICAgSUxWUl9EMl9TQihzcmM0M19yLCBzcmMzMl9yLCBzcmM2NV9yLCBzcmM1NF9yLCBzcmM0MzMyLCBzcmM2NTU0KTsKICAgICBYT1JJX0IyXzEyOF9TQihzcmM0MzMyLCBzcmM2NTU0KTsKIAotICAgIGRzdDEwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSChzcmMyMTEwLCBzcmM0MzMyLCBmaWx0MCwgZmlsdDEsIGRzdDEwLCBkc3QxMCk7Ci0gICAgZHN0MzIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQwLCBmaWx0MSwgZHN0MzIsIGRzdDMyKTsKKyAgICBkc3QxMCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MzIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0MzMyLCBzcmM2NTU0LCBmaWx0MCwgZmlsdDEpOwogCiAgICAgSEVWQ19CSVdfUk5EX0NMSVAyKGRzdDEwLCBkc3QzMiwgaW4wLCBpbjEsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDEwX3IsIGRzdDMyX3IsIGRzdDEwX2wsIGRzdDMyX2wpOworICAgICAgICAgICAgICAgICAgICAgICBkc3QxMCwgZHN0MzIpOwogCi0gICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDEwX2wsIGRzdDEwX3IsIGRzdDMyX2wsIGRzdDMyX3IsIGRzdDEwX3IpOwotICAgIFNUNHg0X1VCKGRzdDEwX3IsIGRzdDEwX3IsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgZHN0MTAgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QzMiwgKHYxNmk4KSBkc3QxMCk7CisgICAgU1Q0eDRfVUIoZHN0MTAsIGRzdDEwLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogfQogCkBAIC0zNDA5LDE3ICszNjM2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCB3ZWlnaHQsIG9mZnNldDsKKyAgICBpbnQzMl90IHdlaWdodCwgb2Zmc2V0LCBjb25zdGFudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5OwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3I7CiAgICAgdjE2aTggc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3I7CiAgICAgdjE2aTggc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NjsKICAgICB2OGkxNiBkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3Q3NjsKLSAgICB2NGkzMiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yOwotICAgIHY0aTMyIGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDc2X2w7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOwogICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMwX3B0ciAtPSBzcmNfc3RyaWRlOwpAQCAtMzQyNyw5ICszNjUyLDEwIEBACiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtMzQ1OSwxMiArMzY4NSw5IEBACiAgICAgICAgICAgICAgICAgICAgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3Nik7CiAgICAgICAgIFhPUklfQjNfMTI4X1NCKHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYpOwogCi0gICAgICAgIGRzdDEwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxLCBkc3QxMCwgZHN0MTApOwotICAgICAgICBkc3QzMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQwLCBmaWx0MSwgZHN0MzIsIGRzdDMyKTsKLSAgICAgICAgZHN0NTQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGRzdDU0LCBkc3Q1NCk7CisgICAgICAgIGRzdDEwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MzIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0MzMyLCBzcmM2NTU0LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q1NCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSk7CiAKICAgICAgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM5LCBzcmMyKTsKICAgICAgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKQEAgLTM0NzIsMTcgKzM2OTUsMTQgQEAKICAgICAgICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjMTA5X3IsICh2Mmk2NCkgc3JjOThfcik7CiAgICAgICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzIxMTAsIDEyOCk7CiAKLSAgICAgICAgZHN0NzYgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM4Nzc2LCBzcmMyMTEwLCBmaWx0MCwgZmlsdDEsIGRzdDc2LCBkc3Q3Nik7CisgICAgICAgIGRzdDc2ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjODc3Niwgc3JjMjExMCwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KGRzdDEwLCBkc3QzMiwgZHN0NTQsIGRzdDc2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3Q3Nl9sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDEwLCBkc3QzMiwgZHN0NTQsIGRzdDc2KTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MTBfbCwgZHN0MTBfciwgZHN0MzJfbCwgZHN0MzJfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDU0X2wsIGRzdDU0X3IsIGRzdDc2X2wsIGRzdDc2X3IsIGRzdDEwX3IsIGRzdDU0X3IpOwotICAgICAgICBTVDR4OF9VQihkc3QxMF9yLCBkc3Q1NF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9TSChkc3QzMiwgZHN0MTAsIGRzdDc2LCBkc3Q1NCwgZHN0MTAsIGRzdDMyKTsKKyAgICAgICAgU1Q0eDhfVUIoZHN0MTAsIGRzdDMyLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC0zNTAzLDExICszNzIzLDExIEBACiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfdnRfYml3Z3RfNHRfNHgyX21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewogICAgICAgICBoZXZjX3Z0X2Jpd2d0XzR0XzR4NF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwpOwogICAgIH0gZWxzZSBpZiAoMCA9PSAoaGVpZ2h0ICUgOCkpIHsKICAgICAgICAgaGV2Y192dF9iaXdndF80dF80eDhtdWx0aXBsZV9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCkBAIC0zNTMzLDI0ICszNzUzLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yOwogICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOwogICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7CiAKICAgICBzcmMwX3B0ciAtPSBzcmNfc3RyaWRlOwogCiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtMzU3MSwyOSArMzc5MSwyMyBAQAogICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKICAgICAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKIAotICAgICAgICB0bXAwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxLCB0bXAwLCB0bXAwKTsKLSAgICAgICAgdG1wMSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSwgdG1wMSwgdG1wMSk7CisgICAgICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXAxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKIAogICAgICAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzIpOwogICAgICAgICBzcmMwX3B0ciArPSAoMiAqIHNyY19zdHJpZGUpOwogICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMxLCBzcmMyKTsKICAgICAgICAgSUxWUl9CMl9TQihzcmMxLCBzcmM0LCBzcmMyLCBzcmMxLCBzcmMxMF9yLCBzcmMyMV9yKTsKIAotICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMzJfciwgc3JjMTBfciwgZmlsdDAsIGZpbHQxLCB0bXAyLCB0bXAyKTsKLSAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzX3IsIHNyYzIxX3IsIGZpbHQwLCBmaWx0MSwgdG1wMywgdG1wMyk7CisgICAgICAgIHRtcDIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmMxMF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXAzID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfciwgc3JjMjFfciwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1Q2eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IyX1NIKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHRtcDAsIHRtcDEpOworICAgICAgICBTVDZ4NF9VQih0bXAwLCB0bXAxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC0zNjA1LDMwICszODE5LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodCwgY29uc3RhbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKICAgICB2OGkxNiBpbjAsIGluMSwgdG1wMCwgdG1wMTsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKICAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbDsKIAogICAgIHNyYzBfcHRyIC09IHNyY19zdHJpZGU7CiAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC0zNjQ2LDE2ICszODU5LDE0IEBACiAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7CiAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKIAotICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgdG1wMSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKKyAgICB0bXAwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICB0bXAxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKICAgICBIRVZDX0JJV19STkRfQ0xJUDIodG1wMCwgdG1wMSwgaW4wLCBpbjEsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7CisgICAgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEpOwogCi0gICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICBTVDh4Ml9VQihkc3QwX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgdG1wMCA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIHRtcDEsICh2MTZpOCkgdG1wMCk7CisgICAgU1Q4eDJfVUIodG1wMCwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y192dF9iaXdndF80dF84eDZfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtMzY2NSwzMyArMzg3NiwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQsIGNvbnN0YW50OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNTsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yOwogICAgIHYxNmk4IHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3I7CiAgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgZHN0NF9sLCBkc3Q1X2w7CiAKICAgICBzcmMwX3B0ciAtPSBzcmNfc3RyaWRlOwogCiAgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOwogICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworICAgIGNvbnN0YW50ID0gMTI4ICogd2VpZ2h0MTsKKyAgICBjb25zdGFudCA8PD0gNjsKKyAgICBvZmZzZXQgKz0gY29uc3RhbnQ7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOwpAQCAtMzcxMSwzMyArMzkyMCwyNSBAQAogICAgICAgICAgICAgICAgc3JjMzJfciwgc3JjNDNfciwgc3JjNTRfciwgc3JjNjVfcik7CiAgICAgSUxWUl9CMl9TQihzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM3Nl9yLCBzcmM4N19yKTsKIAotICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgdG1wMSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKLSAgICB0bXAyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIHRtcDIsIHRtcDIpOwotICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgdG1wMywgdG1wMyk7Ci0gICAgdG1wNCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0goc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxLCB0bXA0LCB0bXA0KTsKLSAgICB0bXA1ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSChzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEsIHRtcDUsIHRtcDUpOworICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgIHRtcDEgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEpOworICAgIHRtcDIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEpOworICAgIHRtcDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEpOworICAgIHRtcDQgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEpOworICAgIHRtcDUgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEpOwogICAgIEhFVkNfQklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAogICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CiAgICAgSEVWQ19CSVdfUk5EX0NMSVAyKHRtcDQsIHRtcDUsIGluNCwgaW41LAogICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X3IsIGRzdDVfciwgZHN0NF9sLCBkc3Q1X2wpOworICAgICAgICAgICAgICAgICAgICAgICB0bXA0LCB0bXA1KTsKIAotICAgIEhFVkNfUENLX1NXX1NCMTIoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLCBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yKTsKLSAgICBTVDh4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBQQ0tFVl9CMl9TSCh0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0bXAwLCB0bXAxKTsKKyAgICB0bXAzID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wNSwgKHYxNmk4KSB0bXA0KTsKKyAgICBTVDh4NF9VQih0bXAwLCB0bXAxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIFNUOHgyX1VCKGRzdDJfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDh4Ml9VQih0bXAzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX3Z0X2Jpd2d0XzR0Xzh4NG11bHRpcGxlX21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTM3NTUsMjQgKzM5NTYsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQsIGNvbnN0YW50OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7CiAgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKIAogICAgIHNyYzBfcHRyIC09IHNyY19zdHJpZGU7CiAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC0zNzkzLDI5ICszOTk0LDIzIEBACiAgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzMsIHNyYzQpOwogICAgICAgICBJTFZSX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX3IsIHNyYzQzX3IpOwogCi0gICAgICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEsIHRtcDAsIHRtcDApOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKKyAgICAgICAgdG1wMCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDEgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMSwgc3JjMik7CiAgICAgICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7CiAgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzEsIHNyYzIpOwogICAgICAgICBJTFZSX0IyX1NCKHNyYzEsIHNyYzQsIHNyYzIsIHNyYzEsIHNyYzEwX3IsIHNyYzIxX3IpOwogCi0gICAgICAgIHRtcDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMzMl9yLCBzcmMxMF9yLCBmaWx0MCwgZmlsdDEsIHRtcDIsIHRtcDIpOwotICAgICAgICB0bXAzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNDNfciwgc3JjMjFfciwgZmlsdDAsIGZpbHQxLCB0bXAzLCB0bXAzKTsKKyAgICAgICAgdG1wMiA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzMyX3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVDh4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfU0godG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgdG1wMCwgdG1wMSk7CisgICAgICAgIFNUOHg0X1VCKHRtcDAsIHRtcDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KQEAgLTM4MzYsMTEgKzQwMzEsMTEgQEAKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y192dF9iaXdndF80dF84eDJfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQwLCB3ZWlnaHQxLCBvZmZzZXQwLCBvZmZzZXQxLCBybmRfdmFsKTsKICAgICB9IGVsc2UgaWYgKDYgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfdnRfYml3Z3RfNHRfOHg2X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaGV2Y192dF9iaXdndF80dF84eDRtdWx0aXBsZV9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCkBAIC0zODY2LDcgKzQwNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQsIGNvbnN0YW50OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzU7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CiAgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjMjFfciwgc3JjNDNfcjsKQEAgLTM4NzQsMTkgKzQwNjksMTggQEAKICAgICB2MTZpOCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sOwogICAgIHYxNmk4IHNyYzIxMTAsIHNyYzQzMzI7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOwogICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIGRzdDRfbCwgZHN0NV9sOwogCiAgICAgc3JjMF9wdHIgLT0gKDEgKiBzcmNfc3RyaWRlKTsKIAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTM5MTQsMTIgKzQxMDgsOSBAQAogICAgICAgICBJTFZMX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX2wsIHNyYzQzX2wpOwogICAgICAgICBzcmM0MzMyID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmM0M19sLCAodjJpNjQpIHNyYzMyX2wpOwogCi0gICAgICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEsIHRtcDAsIHRtcDApOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKLSAgICAgICAgdG1wNCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSwgdG1wNCwgdG1wNCk7CisgICAgICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXAxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wNCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSk7CiAKICAgICAgICAgTERfU0IyKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmMyKTsKICAgICAgICAgc3JjMF9wdHIgKz0gKDIgKiBzcmNfc3RyaWRlKTsKQEAgLTM5MjgsMjYgKzQxMTksMjAgQEAKICAgICAgICAgSUxWTF9CMl9TQihzcmM1LCBzcmM0LCBzcmMyLCBzcmM1LCBzcmM1NF9sLCBzcmM2NV9sKTsKICAgICAgICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjNjVfbCwgKHYyaTY0KSBzcmM1NF9sKTsKIAotICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMzJfciwgc3JjMTBfciwgZmlsdDAsIGZpbHQxLCB0bXAyLCB0bXAyKTsKLSAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzX3IsIHNyYzIxX3IsIGZpbHQwLCBmaWx0MSwgdG1wMywgdG1wMyk7Ci0gICAgICAgIHRtcDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0MzMyLCBzcmMyMTEwLCBmaWx0MCwgZmlsdDEsIHRtcDUsIHRtcDUpOworICAgICAgICB0bXAyID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMzJfciwgc3JjMTBfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wMyA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzQzX3IsIHNyYzIxX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDUgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0MzMyLCBzcmMyMTEwLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQMih0bXA0LCB0bXA1LCBpbjQsIGluNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X3IsIGRzdDVfciwgZHN0NF9sLCBkc3Q1X2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wNCwgdG1wNSk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IxMihkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yKTsKLSAgICAgICAgU1QxMng0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IyX1NIKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHRtcDAsIHRtcDEpOworICAgICAgICB0bXAyID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wNSwgKHYxNmk4KSB0bXA0KTsKKyAgICAgICAgU1QxMng0X1VCKHRtcDAsIHRtcDEsIHRtcDIsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KQEAgLTM5NjcsMjUgKzQxNTIsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1OwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yOwogICAgIHYxNmk4IHNyYzEwX2wsIHNyYzMyX2wsIHNyYzIxX2wsIHNyYzQzX2w7CiAgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKIAogICAgIHNyYzBfcHRyIC09IHNyY19zdHJpZGU7CiAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC00MDA5LDIzICs0MTk0LDE3IEBACiAgICAgICAgIElMVlJfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfciwgc3JjNDNfcik7CiAgICAgICAgIElMVkxfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfbCwgc3JjNDNfbCk7CiAKLSAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEsIHRtcDEsIHRtcDEpOwotICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMTBfbCwgc3JjMzJfbCwgZmlsdDAsIGZpbHQxLCB0bXAyLCB0bXAyKTsKLSAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxX2wsIHNyYzQzX2wsIGZpbHQwLCBmaWx0MSwgdG1wMywgdG1wMyk7CisgICAgICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXAxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wMiA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwX2wsIHNyYzMyX2wsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9sLCBzcmM0M19sLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4wLCBpbjEsIGluMiwgaW4zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QxX2wsIGRzdDFfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFBDS0VWX0IyX1NIKHRtcDIsIHRtcDAsIHRtcDMsIHRtcDEsIHRtcDAsIHRtcDEpOworICAgICAgICBTVF9TSDIodG1wMCwgdG1wMSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICgyICogZHN0X3N0cmlkZSk7CiAgICAgICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjNSwgc3JjMik7CiAgICAgICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7CkBAIC00MDM3LDIzICs0MjE2LDE3IEBACiAgICAgICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjMTBfciwgc3JjMjFfcik7CiAgICAgICAgIElMVkxfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjMTBfbCwgc3JjMjFfbCk7CiAKLSAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEsIHRtcDEsIHRtcDEpOwotICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMzJfbCwgc3JjMTBfbCwgZmlsdDAsIGZpbHQxLCB0bXAyLCB0bXAyKTsKLSAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzX2wsIHNyYzIxX2wsIGZpbHQwLCBmaWx0MSwgdG1wMywgdG1wMyk7CisgICAgICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmMxMF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXAxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfciwgc3JjMjFfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wMiA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzMyX2wsIHNyYzEwX2wsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19sLCBzcmMyMV9sLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QyX2wsIGRzdDJfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDFfbCwgZHN0MV9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IyX1NIKHRtcDIsIHRtcDAsIHRtcDMsIHRtcDEsIHRtcDAsIHRtcDEpOworICAgICAgICBTVF9TSDIodG1wMCwgdG1wMSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICgyICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQpAQCAtNDA3Myw3ICs0MjQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKKyAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0LCBjb25zdGFudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1OwogICAgIHYxNmk4IHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMTsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41OwpAQCAtNDA4MiwxOSArNDI1NSwxOCBAQAogICAgIHYxNmk4IHNyYzIxX3IsIHNyYzQzX3IsIHNyYzg3X3IsIHNyYzEwOV9yOwogICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDU7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOwogICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIGRzdDRfbCwgZHN0NV9sOwogCiAgICAgc3JjMF9wdHIgLT0gc3JjX3N0cmlkZTsKIAogICAgIG9mZnNldCA9IChvZmZzZXQwICsgb2Zmc2V0MSkgPDwgcm5kX3ZhbDsKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKKyAgICBjb25zdGFudCA9IDEyOCAqIHdlaWdodDE7CisgICAgY29uc3RhbnQgPDw9IDY7CisgICAgb2Zmc2V0ICs9IGNvbnN0YW50OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKQEAgLTQxMzAsMzYgKzQzMDIsMjggQEAKICAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjOSwgc3JjMTApOwogICAgICAgICBJTFZSX0IyX1NCKHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM5OF9yLCBzcmMxMDlfcik7CiAgICAgICAgIC8qIDE2d2lkdGggKi8KLSAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIHRtcDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMxMF9sLCBzcmMzMl9sLCBmaWx0MCwgZmlsdDEsIHRtcDQsIHRtcDQpOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKLSAgICAgICAgdG1wNSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxX2wsIHNyYzQzX2wsIGZpbHQwLCBmaWx0MSwgdG1wNSwgdG1wNSk7CisgICAgICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXA0ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfbCwgc3JjMzJfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wMSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDUgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9sLCBzcmM0M19sLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICAvKiA4d2lkdGggKi8KLSAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzc2X3IsIHNyYzk4X3IsIGZpbHQwLCBmaWx0MSwgdG1wMiwgdG1wMik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsIGZpbHQxLCB0bXAzLCB0bXAzKTsKKyAgICAgICAgdG1wMiA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzc2X3IsIHNyYzk4X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgLyogMTZ3aWR0aCAqLwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wNCwgdG1wNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wNCwgdG1wNSk7CiAgICAgICAgIC8qIDh3aWR0aCAqLwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDIodG1wMiwgdG1wMywgaW40LCBpbjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIsIHRtcDMpOwogICAgICAgICAvKiAxNndpZHRoICovCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QxX2wsIGRzdDFfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKKyAgICAgICAgUENLRVZfQjJfU0godG1wNCwgdG1wMCwgdG1wNSwgdG1wMSwgdG1wMCwgdG1wMSk7CiAgICAgICAgIC8qIDh3aWR0aCAqLwotICAgICAgICBIRVZDX1BDS19TV19TQjQoZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLCBkc3Q0X3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIFNUOHgyX1VCKGRzdDRfciwgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOworICAgICAgICB0bXAyID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wMywgKHYxNmk4KSB0bXAyKTsKKyAgICAgICAgU1RfU0gyKHRtcDAsIHRtcDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFNUOHgyX1VCKHRtcDIsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICgyICogZHN0X3N0cmlkZSk7CiAKICAgICAgICAgLyogMTZ3aWR0aCAqLwpAQCAtNDE3NywzNyArNDM0MSwyOSBAQAogICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMxMSwgc3JjOCk7CiAgICAgICAgIElMVlJfQjJfU0Ioc3JjMTEsIHNyYzEwLCBzcmM4LCBzcmMxMSwgc3JjNzZfciwgc3JjODdfcik7CiAgICAgICAgIC8qIDE2d2lkdGggKi8KLSAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIHRtcDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMzMl9sLCBzcmMxMF9sLCBmaWx0MCwgZmlsdDEsIHRtcDQsIHRtcDQpOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNDNfciwgc3JjMjFfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKLSAgICAgICAgdG1wNSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzX2wsIHNyYzIxX2wsIGZpbHQwLCBmaWx0MSwgdG1wNSwgdG1wNSk7CisgICAgICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmMxMF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXA0ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMzJfbCwgc3JjMTBfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wMSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzQzX3IsIHNyYzIxX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDUgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19sLCBzcmMyMV9sLCBmaWx0MCwgZmlsdDEpOwogICAgICAgICAvKiA4d2lkdGggKi8KLSAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzk4X3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgdG1wMiwgdG1wMik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMxMDlfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCB0bXAzLCB0bXAzKTsKKyAgICAgICAgdG1wMiA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzk4X3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMDlfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgLyogMTZ3aWR0aCAqLwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wNCwgdG1wNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wNCwgdG1wNSk7CiAgICAgICAgIC8qIDh3aWR0aCAqLwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDIodG1wMiwgdG1wMywgaW40LCBpbjUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIsIHRtcDMpOwogICAgICAgICAvKiAxNndpZHRoICovCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QxX2wsIGRzdDFfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKKyAgICAgICAgUENLRVZfQjJfU0godG1wNCwgdG1wMCwgdG1wNSwgdG1wMSwgdG1wMCwgdG1wMSk7CiAKICAgICAgICAgLyogOHdpZHRoICovCi0gICAgICAgIEhFVkNfUENLX1NXX1NCNChkc3Q0X2wsIGRzdDRfciwgZHN0NV9sLCBkc3Q1X3IsIGRzdDRfcik7Ci0gICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgU1Q4eDJfVUIoZHN0NF9yLCBkc3QgKyAxNiwgZHN0X3N0cmlkZSk7CisgICAgICAgIHRtcDIgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAzLCAodjE2aTgpIHRtcDIpOworICAgICAgICBTVF9TSDIodG1wMCwgdG1wMSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q4eDJfVUIodG1wMiwgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC00MjI4LDcgKzQzODQsNyBAQAogewogICAgIHVpbnQzMl90IGxvb3BfY250OwogICAgIHVpbnQ4X3QgKmRzdF90bXAgPSBkc3QgKyAxNjsKLSAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQsIGNvbnN0YW50OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43OwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzc2X3IsIHNyYzk4X3I7CkBAIC00MjM3LDE5ICs0MzkzLDE4IEBACiAgICAgdjE2aTggc3JjMTBfbCwgc3JjMzJfbCwgc3JjNzZfbCwgc3JjOThfbDsKICAgICB2MTZpOCBzcmMyMV9sLCBzcmM0M19sLCBzcmM4N19sLCBzcmMxMDlfbDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIGRzdDRfbCwgZHN0NV9sLCBkc3Q2X2wsIGRzdDdfbDsKIAogICAgIHNyYzBfcHRyIC09IHNyY19zdHJpZGU7CiAKICAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisgICAgY29uc3RhbnQgPSAxMjggKiB3ZWlnaHQxOworICAgIGNvbnN0YW50IDw8PSA2OworICAgIG9mZnNldCArPSBjb25zdGFudDsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CkBAIC00Mjc5LDI0ICs0NDM0LDE4IEBACiAgICAgICAgIElMVkxfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfbCwgc3JjNDNfbCk7CiAKICAgICAgICAgLyogMTZ3aWR0aCAqLwotICAgICAgICB0bXAwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxLCB0bXAwLCB0bXAwKTsKLSAgICAgICAgdG1wNCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzEwX2wsIHNyYzMyX2wsIGZpbHQwLCBmaWx0MSwgdG1wNCwgdG1wNCk7Ci0gICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEsIHRtcDEsIHRtcDEpOwotICAgICAgICB0bXA1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfbCwgc3JjNDNfbCwgZmlsdDAsIGZpbHQxLCB0bXA1LCB0bXA1KTsKKyAgICAgICAgdG1wMCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIHRtcDQgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9sLCBzcmMzMl9sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXAxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wNSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX2wsIHNyYzQzX2wsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIC8qIDE2d2lkdGggKi8KICAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KHRtcDAsIHRtcDEsIHRtcDQsIHRtcDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDQsIHRtcDUpOwogICAgICAgICAvKiAxNndpZHRoICovCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QxX2wsIGRzdDFfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9TSCh0bXA0LCB0bXAwLCB0bXA1LCB0bXAxLCB0bXAwLCB0bXAxKTsKKyAgICAgICAgU1RfU0gyKHRtcDAsIHRtcDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIHNyYzEwX3IgPSBzcmMzMl9yOwpAQCAtNDMxNSwyNSArNDQ2NCwxOSBAQAogICAgICAgICBJTFZSX0IyX1NCKHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM5OF9yLCBzcmMxMDlfcik7CiAgICAgICAgIElMVkxfQjJfU0Ioc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzk4X2wsIHNyYzEwOV9sKTsKICAgICAgICAgLyogbmV4dCAxNndpZHRoICovCi0gICAgICAgIHRtcDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEsIHRtcDIsIHRtcDIpOwotICAgICAgICB0bXA2ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNzZfbCwgc3JjOThfbCwgZmlsdDAsIGZpbHQxLCB0bXA2LCB0bXA2KTsKLSAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEsIHRtcDMsIHRtcDMpOwotICAgICAgICB0bXA3ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjODdfbCwgc3JjMTA5X2wsIGZpbHQwLCBmaWx0MSwgdG1wNywgdG1wNyk7CisgICAgICAgIHRtcDIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXA2ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNzZfbCwgc3JjOThfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wMyA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXA3ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjODdfbCwgc3JjMTA5X2wsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgIC8qIG5leHQgMTZ3aWR0aCAqLwogICAgICAgICBIRVZDX0JJV19STkRfQ0xJUDQodG1wMiwgdG1wMywgdG1wNiwgdG1wNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluNCwgaW41LCBpbjYsIGluNywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X2wsIGRzdDVfbCwgZHN0Nl9sLCBkc3Q3X2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMiwgdG1wMywgdG1wNiwgdG1wNyk7CiAKICAgICAgICAgLyogbmV4dCAxNndpZHRoICovCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3Q0X2wsIGRzdDRfciwgZHN0Nl9sLCBkc3Q2X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3Q1X2wsIGRzdDVfciwgZHN0N19sLCBkc3Q3X3IsIGRzdDRfciwgZHN0NV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDRfciwgZHN0NV9yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfU0godG1wNiwgdG1wMiwgdG1wNywgdG1wMywgdG1wMiwgdG1wMyk7CisgICAgICAgIFNUX1NIMih0bXAyLCB0bXAzLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0X3RtcCArPSAoMiAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIHNyYzc2X3IgPSBzcmM5OF9yOwpAQCAtNDM1MiwyNiArNDQ5NSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKKyAgICB1aW50NjRfdCB0cDAsIHRwMTsKICAgICBpbnQzMl90IG9mZnNldCwgd2VpZ2h0OwotICAgIHY4aTE2IGluMCwgaW4xOworICAgIHY4aTE2IGluMCA9IHsgMCB9OworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHRtcCwgd2VpZ2h0X3ZlYzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQ7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbDsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZHN0MjAsIGRzdDMxLCBkc3Q0MiwgZHN0MTAsIGRzdDMyLCBkc3QyMSwgZHN0NDMsIHRtcDAsIHRtcDE7CisgICAgdjRpMzIgZHN0MCwgZHN0MSwgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgY29uc3RfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gKHNyY19zdHJpZGUgKyAxKTsKIApAQCAtNDM3OSwxMCArNDUyMSw5IEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKQEAgLTQzOTAsNTYgKzQ1MzEsNDQgQEAKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjID0gX19tc2FfZmlsbF93KCgxMjggKiB3ZWlnaHQxKSk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKLSAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgd2VpZ2h0X3ZlYyA9ICh2OGkxNikgX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CisgICAgb2Zmc2V0X3ZlYyArPSBjb25zdF92ZWM7CiAKLSAgICBMRF9TQjMoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYzBfcHRyICs9ICgzICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisgICAgTERfU0I1KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKIAotICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7Ci0gICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgIElMVlJfSDJfU0goZHN0MSwgZHN0MCwgZHN0MiwgZHN0MSwgZHN0MTBfciwgZHN0MjFfcik7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMyLCBzcmMwLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMywgc3JjMSwgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzQsIHNyYzIsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CiAKLSAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwotICAgIExEX1NIMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xKTsKLSAgICBpbjAgPSAodjhpMTYpIF9fbXNhX2lsdnJfZCgodjJpNjQpIGluMSwgKHYyaTY0KSBpbjApOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzMsIHNyYzQpOwotICAgIC8qIHJvdyAzICovCi0gICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0gICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3QzLCBkc3QyKTsKLSAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QwX3IgPj49IDY7Ci0gICAgLyogcm93IDQgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLSAgICBkc3Q0M19yID0gX19tc2FfaWx2cl9oKGRzdDQsIGRzdDMpOwotICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDFfciA+Pj0gNjsKLSAgICBkc3QxX3IgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QxX3IsICh2OGkxNikgZHN0MF9yKTsKKyAgICBkc3QyMCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MzEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDQyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKIAotICAgIElMVlJMX0gyX1NXKGRzdDFfciwgaW4wLCBkc3QwX3IsIGRzdDBfbCk7Ci0gICAgZHN0MF9yID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsICh2OGkxNikgZHN0MF9yLCAodjhpMTYpIHdlaWdodF92ZWMpOwotICAgIGRzdDBfbCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCAodjhpMTYpIGRzdDBfbCwgKHY4aTE2KSB3ZWlnaHRfdmVjKTsKLSAgICBTUkFSX1cyX1NXKGRzdDBfciwgZHN0MF9sLCBybmRfdmVjKTsKLSAgICBkc3QwX3IgPSBDTElQX1NXXzBfMjU1KGRzdDBfcik7Ci0gICAgZHN0MF9sID0gQ0xJUF9TV18wXzI1NShkc3QwX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDMxLCBkc3QyMCwgZHN0MTAsIGRzdDMyKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q0MiwgZHN0MzEsIGRzdDIxLCBkc3Q0Myk7CiAKLSAgICBIRVZDX1BDS19TV19TQjIoZHN0MF9sLCBkc3QwX3IsIGRzdDBfcik7Ci0gICAgU1Q0eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMCwgZHN0MzIsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMSwgZHN0NDMsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDAgPj49IDY7CisgICAgZHN0MSA+Pj0gNjsKKyAgICBkc3QwID0gKHY0aTMyKSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MSwgKHY4aTE2KSBkc3QwKTsKKworICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMCk7CisKKyAgICBJTFZSTF9IMl9TSChkc3QwLCBpbjAsIHRtcDAsIHRtcDEpOworICAgIGRzdDAgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMCwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0MSA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAxLCB3ZWlnaHRfdmVjKTsKKyAgICBTUkFSX1cyX1NXKGRzdDAsIGRzdDEsIHJuZF92ZWMpOworICAgIHRtcCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QxLCAodjhpMTYpIGRzdDApOworICAgIHRtcCA9IENMSVBfU0hfMF8yNTVfTUFYX1NBVFUodG1wKTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAsICh2MTZpOCkgdG1wKTsKKyAgICBTVDR4Ml9VQihvdXQsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfYml3Z3RfNHRfNHg0X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTQ0NTAsMjggKzQ1NzksMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CisgICAgdWludDY0X3QgdHAwLCB0cDE7CiAgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKLSAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7CisgICAgdjE2dTggb3V0OworICAgIHY4aTE2IGluMCA9IHsgMCB9LCBpbjEgPSB7IDAgfTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICB2OGkxNiB0bXAwLCB0bXAxOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlYzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdjhpMTYgZHN0MzAsIGRzdDQxLCBkc3Q1MiwgZHN0NjM7CisgICAgdjhpMTYgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0MjEsIGRzdDQzLCBkc3Q2NTsKKyAgICB2NGkzMiBvZmZzZXRfdmVjLCBybmRfdmVjLCBjb25zdF92ZWM7CisgICAgdjRpMzIgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKIAogICAgIHNyYzBfcHRyIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTQ0NzksMTAgKzQ2MDgsOSBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCkBAIC00NDkwLDY2ICs0NjE4LDU0IEBACiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2ZpbGxfdygoMTI4ICogd2VpZ2h0MSkpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7Ci0gICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOworICAgIHdlaWdodF92ZWMgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworICAgIG9mZnNldF92ZWMgKz0gY29uc3RfdmVjOwogCi0gICAgTERfU0IzKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBzcmMwX3B0ciArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEX1NCNyhzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwotICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICBJTFZSX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDIsIGRzdDEsIGRzdDEwX3IsIGRzdDIxX3IpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMywgc3JjMCwgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzQsIHNyYzEsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmM1LCBzcmMyLCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjNiwgc3JjMywgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKIAotICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7Ci0gICAgTERfU0g0KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zKTsKLSAgICBJTFZSX0QyX1NIKGluMSwgaW4wLCBpbjMsIGluMiwgaW4wLCBpbjEpOwotICAgIFhPUklfQjRfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwotICAgIC8qIHJvdyAzICovCi0gICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0gICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3QzLCBkc3QyKTsKLSAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QwX3IgPj49IDY7Ci0gICAgLyogcm93IDQgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLSAgICBkc3Q0M19yID0gX19tc2FfaWx2cl9oKGRzdDQsIGRzdDMpOwotICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDFfciA+Pj0gNjsKLSAgICAvKiByb3cgNSAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotICAgIGRzdDEwX3IgPSBfX21zYV9pbHZyX2goZHN0NSwgZHN0NCk7Ci0gICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0MTBfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0Ml9yID4+PSA2OwotICAgIC8qIHJvdyA2ICovCi0gICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0gICAgZHN0MjFfciA9IF9fbXNhX2lsdnJfaChkc3QyLCBkc3Q1KTsKLSAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3QyMV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QzX3IgPj49IDY7Ci0gICAgUENLRVZfSDJfU0goZHN0MV9yLCBkc3QwX3IsIGRzdDNfciwgZHN0Ml9yLCB0bXAwLCB0bXAxKTsKLSAgICBIRVZDX0JJV19STkRfQ0xJUDIodG1wMCwgdG1wMSwgaW4wLCBpbjEsCi0gICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7CisgICAgZHN0MzAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDQxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q1MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NjMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICBTVDR4NF9VQihkc3QwX3IsIGRzdDBfciwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q0MSwgZHN0MzAsIGRzdDEwLCBkc3Q0Myk7CisgICAgSUxWUkxfSDJfU0goZHN0NTIsIGRzdDQxLCBkc3QyMSwgZHN0NTQpOworICAgIElMVlJMX0gyX1NIKGRzdDYzLCBkc3Q1MiwgZHN0MzIsIGRzdDY1KTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVAoZHN0MTAsIGRzdDMyLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVAoZHN0MjEsIGRzdDQzLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVAoZHN0MzIsIGRzdDU0LCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVAoZHN0NDMsIGRzdDY1LCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUkFfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgUENLRVZfSDJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMSwgdG1wMyk7CisKKyAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjApOworICAgIHNyYzFfcHRyICs9ICgyICogc3JjMl9zdHJpZGUpOworICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMSk7CisKKyAgICBJTFZSTF9IMl9TSCh0bXAxLCBpbjAsIHRtcDAsIHRtcDEpOworICAgIElMVlJMX0gyX1NIKHRtcDMsIGluMSwgdG1wMiwgdG1wMyk7CisKKyAgICBkc3QwID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDAsIHdlaWdodF92ZWMpOworICAgIGRzdDEgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMSwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0MiA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAyLCB3ZWlnaHRfdmVjKTsKKyAgICBkc3QzID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDMsIHdlaWdodF92ZWMpOworICAgIFNSQVJfVzRfU1coZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgcm5kX3ZlYyk7CisgICAgUENLRVZfSDJfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMCwgdG1wMSk7CisgICAgQ0xJUF9TSDJfMF8yNTVfTUFYX1NBVFUodG1wMCwgdG1wMSk7CisgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wMSwgKHYxNmk4KSB0bXAwKTsKKyAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF80dF80bXVsdHg4bXVsdF9tc2EodWludDhfdCAqc3JjMF9wdHIsCkBAIC00NTY4LDIyICs0Njg0LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDY0X3QgdHAwLCB0cDE7CiAgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKLSAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHY4aTE2IGluMCA9IHsgMCB9LCBpbjEgPSB7IDAgfSwgaW4yID0geyAwIH0sIGluMyA9IHsgMCB9OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBkc3Q4LCBkc3Q5OwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKLSAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHdlaWdodF92ZWM7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB2OGkxNiBkc3QxMCwgZHN0MjEsIGRzdDIyLCBkc3Q3MywgZHN0ODQsIGRzdDk1LCBkc3QxMDY7CiAgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKICAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZHN0OThfciwgZHN0MTA5X3I7CisgICAgdjRpMzIgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2NGkzMiBvZmZzZXRfdmVjLCBybmRfdmVjLCBjb25zdF92ZWM7CiAKICAgICBzcmMwX3B0ciAtPSAoc3JjX3N0cmlkZSArIDEpOwogCkBAIC00NTkxLDEwICs0NzA5LDkgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIApAQCAtNDYwMiwxMDAgKzQ3MTksOTYgQEAKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjID0gX19tc2FfZmlsbF93KCgxMjggKiB3ZWlnaHQxKSk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKLSAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgd2VpZ2h0X3ZlYyA9ICh2OGkxNikgX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CisgICAgb2Zmc2V0X3ZlYyArPSBjb25zdF92ZWM7CiAKICAgICBMRF9TQjMoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIHNyYzBfcHRyICs9ICgzICogc3JjX3N0cmlkZSk7CiAgICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwotICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICBJTFZSX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDIsIGRzdDEsIGRzdDEwX3IsIGRzdDIxX3IpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzIsIHNyYzEsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgZHN0MTAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBJTFZSTF9IMl9TSChkc3QyMSwgZHN0MTAsIGRzdDEwX3IsIGRzdDIxX3IpOworICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDIxLCAxKTsKIAogICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMzsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0I4KHNyYzBfcHRyLCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogICAgICAgICBzcmMwX3B0ciArPSAoOCAqIHNyY19zdHJpZGUpOwotICAgICAgICBMRF9TSDgoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7Ci0gICAgICAgIHNyYzFfcHRyICs9ICg4ICogc3JjMl9zdHJpZGUpOwotICAgICAgICBJTFZSX0QyX1NIKGluMSwgaW4wLCBpbjMsIGluMiwgaW4wLCBpbjEpOwotICAgICAgICBJTFZSX0QyX1NIKGluNSwgaW40LCBpbjcsIGluNiwgaW4yLCBpbjMpOwogICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7Ci0gICAgICAgIC8qIHJvdyAzICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0gICAgICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0MywgZHN0Mik7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QwX3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA0ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0gICAgICAgIGRzdDQzX3IgPSBfX21zYV9pbHZyX2goZHN0NCwgZHN0Myk7Ci0gICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QxX3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA1ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7Ci0gICAgICAgIGRzdDU0X3IgPSBfX21zYV9pbHZyX2goZHN0NSwgZHN0NCk7Ci0gICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QyX3IgPj49IDY7Ci0gICAgICAgIC8qIHJvdyA2ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NiwgZHN0Nik7Ci0gICAgICAgIGRzdDY1X3IgPSBfX21zYV9pbHZyX2goZHN0NiwgZHN0NSk7Ci0gICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QzX3IgPj49IDY7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NywgZHN0Nyk7Ci0gICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0NywgZHN0Nik7Ci0gICAgICAgIGRzdDRfciA9IEhFVkNfRklMVF80VEFQKGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q0X3IgPj49IDY7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0OCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0OCwgZHN0OCk7Ci0gICAgICAgIGRzdDg3X3IgPSBfX21zYV9pbHZyX2goZHN0OCwgZHN0Nyk7Ci0gICAgICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q1X3IgPj49IDY7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjOSwgc3JjOSwgc3JjOSwgc3JjOSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0OSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0OSwgZHN0OSk7Ci0gICAgICAgIGRzdDEwX3IgPSBfX21zYV9pbHZyX2goZHN0OSwgZHN0OCk7Ci0gICAgICAgIGRzdDZfciA9IEhFVkNfRklMVF80VEFQKGRzdDc2X3IsIGRzdDEwX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q2X3IgPj49IDY7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMTAsIHNyYzEwLCBzcmMxMCwgc3JjMTAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgICAgICBkc3QyMV9yID0gX19tc2FfaWx2cl9oKGRzdDIsIGRzdDkpOwotICAgICAgICBkc3Q3X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QyMV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0N19yID4+PSA2OwotICAgICAgICBQQ0tFVl9INF9TSChkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgIGRzdDVfciwgZHN0NF9yLCBkc3Q3X3IsIGRzdDZfciwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7Ci0gICAgICAgIEhFVkNfQklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4wLCBpbjEsIGluMiwgaW4zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjNywgc3JjMywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM4LCBzcmM0LCBzcmM4LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzksIHNyYzUsIHNyYzksIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjMTAsIHNyYzYsIHNyYzEwLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1Q0eDhfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdDczID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0ODQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q5NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEwNiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisKKyAgICAgICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3Q3MywgZHN0MjIpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q4NCwgZHN0NzMsIGRzdDQzX3IsIGRzdDg3X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q5NSwgZHN0ODQsIGRzdDU0X3IsIGRzdDk4X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDYsIGRzdDk1LCBkc3Q2NV9yLCBkc3QxMDlfcik7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDczLCAxKTsKKyAgICAgICAgZHN0NzZfciA9IF9fbXNhX2lsdnJfaChkc3QyMiwgZHN0MTA2KTsKKworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIHNyYzFfcHRyICs9IDIgKiBzcmMyX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjApOworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIHNyYzFfcHRyICs9IDIgKiBzcmMyX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjEpOworCisgICAgICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gMiAqIHNyYzJfc3RyaWRlOworICAgICAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMik7CisgICAgICAgIExEMihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgc3JjMV9wdHIgKz0gMiAqIHNyYzJfc3RyaWRlOworICAgICAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMyk7CisKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVAoZHN0NTRfciwgZHN0NzZfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUChkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NiA9IEhFVkNfRklMVF80VEFQKGRzdDc2X3IsIGRzdDk4X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q3ID0gSEVWQ19GSUxUXzRUQVAoZHN0ODdfciwgZHN0MTA5X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBTUkFfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFNSQV80Vihkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA2KTsKKyAgICAgICAgUENLRVZfSDRfU1coZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0NywgZHN0NiwgZHN0MCwgZHN0MSwKKyAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDAsIGluMCwgdG1wMCwgdG1wMSk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEsIGluMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGluMiwgdG1wNCwgdG1wNSk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDMsIGluMywgdG1wNiwgdG1wNyk7CisgICAgICAgIGRzdDAgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMCwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDEgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMSwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMiwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDMgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMywgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDQgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNCwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDUgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNSwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDYgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNiwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDcgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNywgd2VpZ2h0X3ZlYyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgcm5kX3ZlYyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgcm5kX3ZlYyk7CisgICAgICAgIFBDS0VWX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsIHRtcDAsIHRtcDEsCisgICAgICAgICAgICAgICAgICAgIHRtcDIsIHRtcDMpOworICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwX3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QyMV9yID0gZHN0MTA5X3I7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDEwNiwgMSk7CiAgICAgfQogfQogCkBAIC00NzE3LDEzICs0ODMwLDExIEBACiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfaHZfYml3Z3RfNHRfNHgyX21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwpOwogICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19odl9iaXdndF80dF80eDRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSA4KSkgewogICAgICAgICBoZXZjX2h2X2Jpd2d0XzR0XzRtdWx0eDhtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLApAQCAtNDc0OCwyMiArNDg1OSwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQzMl90IHRwdzAsIHRwdzEsIHRwdzIsIHRwdzM7CisgICAgdWludDY0X3QgdHAwLCB0cDE7CiAgICAgaW50MzJfdCBvZmZzZXQsIHdlaWdodDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwotICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHY4aTE2IGluMCA9IHsgMCB9LCBpbjEgPSB7IDAgfSwgaW4yID0geyAwIH0sIGluMyA9IHsgMCB9OworICAgIHY4aTE2IGluNCA9IHsgMCB9LCBpbjUgPSB7IDAgfTsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRlcl92ZWM7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7CisgICAgdjhpMTYgZHN0aDAsIGRzdGgxLCBkc3RoMiwgZHN0aDMsIGRzdGg0LCBkc3RoNSwgZHN0aDYsIGRzdGg3LCBkc3RoOCwgZHN0aDk7CisgICAgdjhpMTYgZHN0aDEwLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCB3ZWlnaHRfdmVjOworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGRzdDk4X3IsIGRzdDIxX3IsIGRzdDQzX3I7CisgICAgdjhpMTYgZHN0NjVfciwgZHN0ODdfciwgZHN0MTA5X3IsIGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDc2X2w7CisgICAgdjhpMTYgZHN0OThfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbCwgZHN0ODdfbCwgZHN0MTA5X2w7CisgICAgdjhpMTYgZHN0MTAyMV9sLCBkc3QzMjQzX2wsIGRzdDU0NjVfbCwgZHN0NzY4N19sLCBkc3Q5ODEwOV9sOwogICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOwotICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7Ci0gICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0MjFfciwgZHN0NDNfcjsKLSAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3QyMV9sLCBkc3Q0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjRpMzIgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2NGkzMiBkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3I7CisgICAgdjRpMzIgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgY29uc3RfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gKHNyY19zdHJpZGUgKyAxKTsKIApAQCAtNDc3MSwxMCArNDg4OCw5IEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKQEAgLTQ3ODIsMTEgKzQ4OTgsMTIgQEAKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjID0gX19tc2FfZmlsbF93KCgxMjggKiB3ZWlnaHQxKSk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKLSAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgd2VpZ2h0X3ZlYyA9ICh2OGkxNikgX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CisgICAgb2Zmc2V0X3ZlYyArPSBjb25zdF92ZWM7CiAKICAgICBMRF9TQjMoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIHNyYzBfcHRyICs9ICgzICogc3JjX3N0cmlkZSk7CkBAIC00Nzk1LDc0ICs0OTEyLDEyMCBAQAogICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOworICAgIGRzdGgwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDEsIGRzdGgwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMiwgZHN0aDEsIGRzdDIxX3IsIGRzdDIxX2wpOwogCi0gICAgZm9yIChsb29wX2NudCA9IGhlaWdodCA+PiAyOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwotICAgICAgICBzcmMwX3B0ciArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICBMRF9TSDQoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSwgaW4yLCBpbjMpOwotICAgICAgICBzcmMxX3B0ciArPSAoNCAqIHNyYzJfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgTERfU0I4KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LAorICAgICAgICAgICBzcmMxMCk7CisgICAgWE9SSV9COF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOwogCi0gICAgICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOwotICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDBfciA+Pj0gNjsKLSAgICAgICAgZHN0MF9sID4+PSA2OworICAgIGRzdGgzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoNCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGg2ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOworICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmM5LCBzcmM5LCBzcmM5LCBzcmM5LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjMTAsIHNyYzEwLCBzcmMxMCwgc3JjMTAsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CiAKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7Ci0gICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MV9yID4+PSA2OwotICAgICAgICBkc3QxX2wgPj49IDY7CisgICAgZHN0aDcgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGg4ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoOSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDEwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOworICAgIElMVlJMX0gyX1NIKGRzdGgzLCBkc3RoMiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDQsIGRzdGgzLCBkc3Q0M19yLCBkc3Q0M19sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoNSwgZHN0aDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg2LCBkc3RoNSwgZHN0NjVfciwgZHN0NjVfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDcsIGRzdGg2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoOCwgZHN0aDcsIGRzdDg3X3IsIGRzdDg3X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg5LCBkc3RoOCwgZHN0OThfciwgZHN0OThfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDEwLCBkc3RoOSwgZHN0MTA5X3IsIGRzdDEwOV9sKTsKKyAgICBQQ0tFVl9EMl9TSChkc3QyMV9sLCBkc3QxMF9sLCBkc3Q0M19sLCBkc3QzMl9sLCBkc3QxMDIxX2wsIGRzdDMyNDNfbCk7CisgICAgUENLRVZfRDJfU0goZHN0NjVfbCwgZHN0NTRfbCwgZHN0ODdfbCwgZHN0NzZfbCwgZHN0NTQ2NV9sLCBkc3Q3Njg3X2wpOworICAgIGRzdDk4MTA5X2wgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2QoKHYyaTY0KSBkc3QxMDlfbCwgKHYyaTY0KSBkc3Q5OF9sKTsKIAotICAgICAgICBJTFZSTF9IMl9TSChkc3Q1LCBkc3Q0LCBkc3QxMF9yLCBkc3QxMF9sKTsKLSAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0MTBfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDEwX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QyX3IgPj49IDY7Ci0gICAgICAgIGRzdDJfbCA+Pj0gNjsKLSAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q1X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q2X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Nl9yLCBkc3Q5OF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q3X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTAyMV9sLCBkc3QzMjQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyNDNfbCwgZHN0NTQ2NV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NDY1X2wsIGRzdDc2ODdfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NzY4N19sLCBkc3Q5ODEwOV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKKyAgICBTUkFfNFYoZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yLCA2KTsKKyAgICBTUkFfNFYoZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCA2KTsKKyAgICBQQ0tFVl9IMl9TVyhkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIGRzdDAsIGRzdDEpOworICAgIFBDS0VWX0gyX1NXKGRzdDVfciwgZHN0NF9yLCBkc3Q3X3IsIGRzdDZfciwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0NSwgZHN0MjFfciwgZHN0MjFfbCk7Ci0gICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDIxX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19sLCBkc3QyMV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0M19yID4+PSA2OwotICAgICAgICBkc3QzX2wgPj49IDY7Ci0gICAgICAgIFBDS0VWX0g0X1NIKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKLSAgICAgICAgSEVWQ19CSVdfUk5EX0NMSVA0KHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbjAsIGluMSwgaW4yLCBpbjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjApOworICAgIExEMihzcmMxX3B0ciArIDIgKiBzcmMyX3N0cmlkZSwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMSk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVDZ4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgfQorICAgIExEMihzcmMxX3B0ciArIDQgKiBzcmMyX3N0cmlkZSwgc3JjMl9zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICBJTlNFUlRfRDJfU0godHAwLCB0cDEsIGluMik7CisgICAgTEQyKHNyYzFfcHRyICsgNiAqIHNyYzJfc3RyaWRlLCBzcmMyX3N0cmlkZSwgdHAwLCB0cDEpOworICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4zKTsKKworICAgIElMVlJMX0gyX1NIKGRzdDAsIGluMCwgdG1wMCwgdG1wMSk7CisgICAgSUxWUkxfSDJfU0goZHN0MSwgaW4xLCB0bXAyLCB0bXAzKTsKKyAgICBJTFZSTF9IMl9TSChkc3QyLCBpbjIsIHRtcDQsIHRtcDUpOworICAgIElMVlJMX0gyX1NIKGRzdDMsIGluMywgdG1wNiwgdG1wNyk7CisgICAgZHN0MCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAwLCB3ZWlnaHRfdmVjKTsKKyAgICBkc3QxID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDEsIHdlaWdodF92ZWMpOworICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMiwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0MyA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAzLCB3ZWlnaHRfdmVjKTsKKyAgICBkc3Q0ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDQsIHdlaWdodF92ZWMpOworICAgIGRzdDUgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNSwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0NiA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXA2LCB3ZWlnaHRfdmVjKTsKKyAgICBkc3Q3ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDcsIHdlaWdodF92ZWMpOworICAgIFNSQVJfVzRfU1coZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgcm5kX3ZlYyk7CisgICAgU1JBUl9XNF9TVyhkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBybmRfdmVjKTsKKyAgICBQQ0tFVl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCB0bXAwLCB0bXAxLAorICAgICAgICAgICAgICAgIHRtcDIsIHRtcDMpOworICAgIENMSVBfU0g0XzBfMjU1X01BWF9TQVRVKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIFBDS0VWX0IyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIG91dDAsIG91dDEpOworICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisKKyAgICBQQ0tFVl9IMl9TVyhkc3QxX2wsIGRzdDBfbCwgZHN0M19sLCBkc3QyX2wsIGRzdDQsIGRzdDUpOworCisgICAgTFc0KHNyYzFfcHRyICsgNCwgc3JjMl9zdHJpZGUsIHRwdzAsIHRwdzEsIHRwdzIsIHRwdzMpOworICAgIHNyYzFfcHRyICs9ICg0ICogc3JjMl9zdHJpZGUpOworICAgIElOU0VSVF9XNF9TSCh0cHcwLCB0cHcxLCB0cHcyLCB0cHczLCBpbjQpOworICAgIExXNChzcmMxX3B0ciArIDQsIHNyYzJfc3RyaWRlLCB0cHcwLCB0cHcxLCB0cHcyLCB0cHczKTsKKyAgICBJTlNFUlRfVzRfU0godHB3MCwgdHB3MSwgdHB3MiwgdHB3MywgaW41KTsKKworICAgIElMVlJMX0gyX1NIKGRzdDQsIGluNCwgdG1wMCwgdG1wMSk7CisgICAgSUxWUkxfSDJfU0goZHN0NSwgaW41LCB0bXAyLCB0bXAzKTsKKworICAgIGRzdDAgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMCwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0MSA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAxLCB3ZWlnaHRfdmVjKTsKKyAgICBkc3QyID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDIsIHdlaWdodF92ZWMpOworICAgIGRzdDMgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMywgd2VpZ2h0X3ZlYyk7CisgICAgU1JBUl9XNF9TVyhkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBybmRfdmVjKTsKKyAgICBQQ0tFVl9IMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCB0bXA0LCB0bXA1KTsKKworICAgIENMSVBfU0gyXzBfMjU1X01BWF9TQVRVKHRtcDQsIHRtcDUpOworICAgIG91dDIgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXA1LCAodjE2aTgpIHRtcDQpOworICAgIFNUMng0X1VCKG91dDIsIDAsIGRzdCArIDQsIGRzdF9zdHJpZGUpOworICAgIGRzdCArPSA0ICogZHN0X3N0cmlkZTsKKyAgICBTVDJ4NF9VQihvdXQyLCA0LCBkc3QgKyA0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF80dF84eDJfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNDg3Myw3ICs1MDM2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQwLApAQCAtNDg4MSwyMCArNTA0MywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICBpbnQzMl90IHdlaWdodCwgb2Zmc2V0OworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHdlaWdodF92ZWM7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgdmVjOCwgdmVjOTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0OwogICAgIHY4aTE2IGluMCwgaW4xOwogICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbDsKICAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwogICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDIxX2wsIGRzdDQzX2w7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMTsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdjRpMzIgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgY29uc3RfdmVjOwogCiAgICAgc3JjMF9wdHIgLT0gKHNyY19zdHJpZGUgKyAxKTsKIApAQCAtNDkwMiwxMCArNTA2NSw5IEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKQEAgLTQ5MTMsNjEgKzUwNzUsMTc3IEBACiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2ZpbGxfdygoMTI4ICogd2VpZ2h0MSkpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7Ci0gICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOworICAgIHdlaWdodF92ZWMgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworICAgIG9mZnNldF92ZWMgKz0gY29uc3RfdmVjOwogCi0gICAgTERfU0IzKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBzcmMwX3B0ciArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEX1NCNShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisKKyAgICBMRF9TSDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7CiAKICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwogICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzgsIHZlYzkpOworCisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzgsIHZlYzksIGZpbHQwLCBmaWx0MSk7CiAKICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKICAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3QxLCBkc3QyMV9yLCBkc3QyMV9sKTsKLQotICAgIExEX1NCMihzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0KLSAgICBMRF9TSDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCBpbjAsIGluMSk7Ci0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQogICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOwogICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDBfciA+Pj0gNjsKLSAgICBkc3QwX2wgPj49IDY7Ci0gICAgdG1wMCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QwX2wsICh2OGkxNikgZHN0MF9yKTsKLQotICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotCi0gICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CiAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MV9yID4+PSA2OwotICAgIGRzdDFfbCA+Pj0gNjsKLSAgICB0bXAxID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDFfbCwgKHY4aTE2KSBkc3QxX3IpOworICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgIFBDS0VWX0gyX1NIKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgdG1wMSwgdG1wMyk7CiAKLSAgICBIRVZDX0JJV19STkRfQ0xJUDIodG1wMCwgdG1wMSwgaW4wLCBpbjEsCi0gICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIHJuZF92ZWMsIG9mZnNldF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7Ci0gICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICBTVDh4Ml9VQihkc3QwX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgSUxWUkxfSDJfU0godG1wMSwgaW4wLCB0bXAwLCB0bXAxKTsKKyAgICBJTFZSTF9IMl9TSCh0bXAzLCBpbjEsIHRtcDIsIHRtcDMpOworCisgICAgZHN0MF9yID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDAsIHdlaWdodF92ZWMpOworICAgIGRzdDBfbCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAxLCB3ZWlnaHRfdmVjKTsKKyAgICBkc3QxX3IgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMiwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0MV9sID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDMsIHdlaWdodF92ZWMpOworICAgIFNSQVJfVzRfU1coZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBybmRfdmVjKTsKKyAgICBQQ0tFVl9IMl9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIHRtcDAsIHRtcDEpOworICAgIENMSVBfU0gyXzBfMjU1X01BWF9TQVRVKHRtcDAsIHRtcDEpOworICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHRtcDEsICh2MTZpOCkgdG1wMCk7CisgICAgU1Q4eDJfVUIob3V0LCBkc3QsIGRzdF9zdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBoZXZjX2h2X2Jpd2d0XzR0XzhtdWx0eDRfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNyYzFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyYzJfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGg4bXVsdCkKK3sKKyAgICBpbnQzMl90IHdlaWdodCwgb2Zmc2V0OworICAgIHVpbnQzMl90IGNudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIG1hc2swLCBtYXNrMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlYzsKKyAgICB2OGkxNiBkc3RoMCwgZHN0aDEsIGRzdGgyLCBkc3RoMywgZHN0aDQsIGRzdGg1LCBkc3RoNjsKKyAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3LCBpbjAsIGluMSwgaW4yLCBpbjM7CisgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfcjsKKyAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sOworICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOworICAgIHY0aTMyIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjRpMzIgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgY29uc3RfdmVjOworCisgICAgc3JjMF9wdHIgLT0gKHNyY19zdHJpZGUgKyAxKTsKKworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeCk7CisgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CisKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisKKyAgICBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOworICAgIG1hc2sxID0gbWFzazAgKyAyOworCisgICAgb2Zmc2V0ID0gKG9mZnNldDAgKyBvZmZzZXQxKSA8PCBybmRfdmFsOworICAgIHdlaWdodDAgPSB3ZWlnaHQwICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHQgPSB3ZWlnaHQwIHwgKHdlaWdodDEgPDwgMTYpOworCisgICAgY29uc3RfdmVjID0gX19tc2FfZmlsbF93KCgxMjggKiB3ZWlnaHQxKSk7CisgICAgY29uc3RfdmVjIDw8PSA2OworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwgKyAxKTsKKyAgICBvZmZzZXRfdmVjICs9IGNvbnN0X3ZlYzsKKyAgICB3ZWlnaHRfdmVjID0gKHY4aTE2KSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKworICAgIGZvciAoY250ID0gd2lkdGg4bXVsdDsgY250LS07KSB7CisgICAgICAgIExEX1NCNyhzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgICAgIHNyYzBfcHRyICs9IDg7CisgICAgICAgIFhPUklfQjdfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworCisgICAgICAgIExEX1NINChzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7CisgICAgICAgIHNyYzFfcHRyICs9IDg7CisKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKworICAgICAgICBkc3RoMCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdGgxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0aDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworCisgICAgICAgIElMVlJMX0gyX1NIKGRzdGgxLCBkc3RoMCwgZHN0MTBfciwgZHN0MTBfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGgyLCBkc3RoMSwgZHN0MjFfciwgZHN0MjFfbCk7CisKKyAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworCisgICAgICAgIGRzdGgzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0aDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3RoNSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdGg2ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKworICAgICAgICBJTFZSTF9IMl9TSChkc3RoMywgZHN0aDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoNCwgZHN0aDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoNSwgZHN0aDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoNiwgZHN0aDUsIGRzdDY1X3IsIGRzdDY1X2wpOworCisgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QwX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9sLCBkc3QzMl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0Ml9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfbCwgZHN0NTRfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19sLCBkc3Q2NV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKworICAgICAgICBTUkFfNFYoZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKKyAgICAgICAgU1JBXzRWKGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbCwgNik7CisgICAgICAgIFBDS0VWX0g0X1NXKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwKKyAgICAgICAgICAgICAgICAgICAgZHN0M19yLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKworICAgICAgICBJTFZSTF9IMl9TSChkc3QwLCBpbjAsIHRtcDAsIHRtcDEpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxLCBpbjEsIHRtcDIsIHRtcDMpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QyLCBpbjIsIHRtcDQsIHRtcDUpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBpbjMsIHRtcDYsIHRtcDcpOworICAgICAgICBkc3QwID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDAsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QxID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDEsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QyID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDIsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QzID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDMsIHdlaWdodF92ZWMpOworICAgICAgICBkc3Q0ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDQsIHdlaWdodF92ZWMpOworICAgICAgICBkc3Q1ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDUsIHdlaWdodF92ZWMpOworICAgICAgICBkc3Q2ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDYsIHdlaWdodF92ZWMpOworICAgICAgICBkc3Q3ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDcsIHdlaWdodF92ZWMpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHJuZF92ZWMpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIHJuZF92ZWMpOworICAgICAgICBQQ0tFVl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LAorICAgICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTVfTUFYX1NBVFUodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFBDS0VWX0IyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIG91dDAsIG91dDEpOworICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gODsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfYml3Z3RfNHRfOHg2X21zYSh1aW50OF90ICpzcmMwX3B0ciwKQEAgLTQ5NzgsNyArNTI1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0MCwKQEAgLTQ5ODYsMTQgKzUyNjMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MjsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdDg7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlYzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5OworICAgIHYxNmk4IHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIHZlYzE2LCB2ZWMxNzsKKyAgICB2OGkxNiBkc3RoMCwgZHN0aDEsIGRzdGgyLCBkc3RoMywgZHN0aDQsIGRzdGg1LCBkc3RoNiwgZHN0aDcsIGRzdGg4OwogICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOwogICAgIHY0aTMyIGRzdDRfciwgZHN0NF9sLCBkc3Q1X3IsIGRzdDVfbDsKICAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QxMF9sLCBkc3QzMl9sOwpAQCAtNTAwMSw4ICs1MjgwLDkgQEAKICAgICB2OGkxNiBkc3Q1NF9yLCBkc3Q1NF9sLCBkc3Q2NV9yLCBkc3Q2NV9sOwogICAgIHY4aTE2IGRzdDc2X3IsIGRzdDc2X2wsIGRzdDg3X3IsIGRzdDg3X2w7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNTsKLSAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNSwgdG1wNiwgdG1wNzsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworICAgIHY0aTMyIG9mZnNldF92ZWMsIHJuZF92ZWMsIGNvbnN0X3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTUwMTAsMTAgKzUyOTAsOSBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCkBAIC01MDIxLDEyMyArNTMwMCwxMDMgQEAKICAgICB3ZWlnaHQwID0gd2VpZ2h0MCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0MCB8ICh3ZWlnaHQxIDw8IDE2KTsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjID0gX19tc2FfZmlsbF93KCgxMjggKiB3ZWlnaHQxKSk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKLSAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgd2VpZ2h0X3ZlYyA9ICh2OGkxNikgX19tc2FfZmlsbF93KHdlaWdodCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsICsgMSk7CisgICAgb2Zmc2V0X3ZlYyArPSBjb25zdF92ZWM7CiAKLSAgICBMRF9TQjMoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYzBfcHRyICs9ICgzICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisgICAgTERfU0I1KHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMwX3B0ciArPSAoNSAqIHNyY19zdHJpZGUpOworICAgIExEX1NCNChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CisKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIExEX1NINihzcmMxX3B0ciwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUpOwogCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWM4LCB2ZWM5KTsKKyAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMTAsIHZlYzExKTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMTIsIHZlYzEzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMTQsIHZlYzE1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMTYsIHZlYzE3KTsKIAotICAgIElMVlJMX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDEwX3IsIGRzdDEwX2wpOwotICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDEsIGRzdDIxX3IsIGRzdDIxX2wpOworICAgIGRzdGgwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGgzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoNCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzgsIHZlYzksIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxMiwgdmVjMTMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDcgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDggPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxNiwgdmVjMTcsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwotICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7Ci0gICAgTERfU0g2KHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSk7Ci0gICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgSUxWUkxfSDJfU0goZHN0aDEsIGRzdGgwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMiwgZHN0aDEsIGRzdDIxX3IsIGRzdDIxX2wpOworICAgIElMVlJMX0gyX1NIKGRzdGgzLCBkc3RoMiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDQsIGRzdGgzLCBkc3Q0M19yLCBkc3Q0M19sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoNSwgZHN0aDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg2LCBkc3RoNSwgZHN0NjVfciwgZHN0NjVfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDcsIGRzdGg2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoOCwgZHN0aDcsIGRzdDg3X3IsIGRzdDg3X2wpOwogCi0gICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CiAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MF9yID4+PSA2OwotICAgIGRzdDBfbCA+Pj0gNjsKLSAgICB0bXAwID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDBfbCwgKHY4aTE2KSBkc3QwX3IpOwotCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0KLSAgICBJTFZSTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q0M19yLCBkc3Q0M19sKTsKICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QxX3IgPj49IDY7Ci0gICAgZHN0MV9sID4+PSA2OwotICAgIHRtcDEgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MV9sLCAodjhpMTYpIGRzdDFfcik7Ci0KLSAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYpOwotICAgIHNyYzBfcHRyICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKLQotICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOwogICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDU0X2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDJfciA+Pj0gNjsKLSAgICBkc3QyX2wgPj49IDY7Ci0gICAgdG1wMiA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QyX2wsICh2OGkxNikgZHN0Ml9yKTsKLQotICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q2ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDYsIGRzdDYpOwotCi0gICAgSUxWUkxfSDJfU0goZHN0NiwgZHN0NSwgZHN0NjVfciwgZHN0NjVfbCk7CiAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0M19yID4+PSA2OwotICAgIGRzdDNfbCA+Pj0gNjsKLSAgICB0bXAzID0gX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDNfbCwgKHY4aTE2KSBkc3QzX3IpOwotCi0gICAgSEVWQ19CSVdfUk5EX0NMSVA0KHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsCi0gICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICBMRF9TQjIoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgpOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzcsIHNyYzgpOwotCi0gICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDcgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NywgZHN0Nyk7Ci0KLSAgICBJTFZSTF9IMl9TSChkc3Q3LCBkc3Q2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKICAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3Q0X2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9sLCBkc3Q3Nl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3Q0X3IgPj49IDY7Ci0gICAgZHN0NF9sID4+PSA2OwotICAgIHRtcDQgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0NF9sLCAodjhpMTYpIGRzdDRfcik7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0OCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q4LCBkc3Q4KTsKLQotICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOwogICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDVfbCA9IEhFVkNfRklMVF80VEFQKGRzdDY1X2wsIGRzdDg3X2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDVfciA+Pj0gNjsKLSAgICBkc3Q1X2wgPj49IDY7Ci0gICAgdG1wNSA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3Q1X2wsICh2OGkxNikgZHN0NV9yKTsKIAotICAgIEhFVkNfQklXX1JORF9DTElQMih0bXA0LCB0bXA1LCBpbjQsIGluNSwKLSAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgcm5kX3ZlYywgb2Zmc2V0X3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKKyAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICBTUkFfNFYoZHN0NF9yLCBkc3Q0X2wsIGRzdDVfciwgZHN0NV9sLCA2KTsKKyAgICBQQ0tFVl9INF9TVyhkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwKKyAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKIAotICAgIEhFVkNfUENLX1NXX1NCNChkc3Q0X2wsIGRzdDRfciwgZHN0NV9sLCBkc3Q1X3IsIGRzdDJfcik7Ci0gICAgU1Q4eDJfVUIoZHN0Ml9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIElMVlJMX0gyX1NIKGRzdDAsIGluMCwgdG1wMCwgdG1wMSk7CisgICAgSUxWUkxfSDJfU0goZHN0MSwgaW4xLCB0bXAyLCB0bXAzKTsKKyAgICBJTFZSTF9IMl9TSChkc3QyLCBpbjIsIHRtcDQsIHRtcDUpOworICAgIElMVlJMX0gyX1NIKGRzdDMsIGluMywgdG1wNiwgdG1wNyk7CisgICAgZHN0MCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAwLCB3ZWlnaHRfdmVjKTsKKyAgICBkc3QxID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDEsIHdlaWdodF92ZWMpOworICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMiwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0MyA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAzLCB3ZWlnaHRfdmVjKTsKKyAgICBkc3Q0ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDQsIHdlaWdodF92ZWMpOworICAgIGRzdDUgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNSwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0NiA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXA2LCB3ZWlnaHRfdmVjKTsKKyAgICBkc3Q3ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDcsIHdlaWdodF92ZWMpOworICAgIFNSQVJfVzRfU1coZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgcm5kX3ZlYyk7CisgICAgU1JBUl9XNF9TVyhkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBybmRfdmVjKTsKKyAgICBQQ0tFVl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LAorICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIENMSVBfU0g0XzBfMjU1X01BWF9TQVRVKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgIFBDS0VWX0IyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIG91dDAsIG91dDEpOworCisgICAgUENLRVZfSDJfU1coZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLCBkc3QwLCBkc3QxKTsKKyAgICBJTFZSTF9IMl9TSChkc3QwLCBpbjQsIHRtcDAsIHRtcDEpOworICAgIElMVlJMX0gyX1NIKGRzdDEsIGluNSwgdG1wMiwgdG1wMyk7CisgICAgZHN0MCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAwLCB3ZWlnaHRfdmVjKTsKKyAgICBkc3QxID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDEsIHdlaWdodF92ZWMpOworICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMiwgd2VpZ2h0X3ZlYyk7CisgICAgZHN0MyA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAzLCB3ZWlnaHRfdmVjKTsKKyAgICBTUkFSX1c0X1NXKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHJuZF92ZWMpOworICAgIFBDS0VWX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIHRtcDQsIHRtcDUpOworICAgIENMSVBfU0gyXzBfMjU1X01BWF9TQVRVKHRtcDQsIHRtcDUpOworICAgIG91dDIgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXA1LCAodjE2aTgpIHRtcDQpOworICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgU1Q4eDJfVUIob3V0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF80dF84bXVsdHg0bXVsdF9tc2EodWludDhfdCAqc3JjMF9wdHIsCkBAIC01MTYyLDIwICs1NDIxLDIyIEBACiAgICAgdWludDhfdCAqc3JjMF9wdHJfdG1wOwogICAgIGludDE2X3QgKnNyYzFfcHRyX3RtcDsKICAgICB1aW50OF90ICpkc3RfdG1wOworICAgIHYxNnU4IG91dDAsIG91dDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjhpMTYgZHN0aDAsIGRzdGgxLCBkc3RoMiwgZHN0aDMsIGRzdGg0LCBkc3RoNSwgZHN0aDY7CiAgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2w7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwotICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDIxX2wsIGRzdDQzX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIHY0aTMyIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfcjsKKyAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sLCB3ZWlnaHRfdmVjOworICAgIHY0aTMyIG9mZnNldF92ZWMsIHJuZF92ZWMsIGNvbnN0X3ZlYzsKIAogICAgIHNyYzBfcHRyIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTUxODMsMTAgKzU0NDQsOSBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCkBAIC01MTk0LDExICs1NDU0LDEyIEBACiAgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2ZpbGxfdygoMTI4ICogd2VpZ2h0MSkpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7Ci0gICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOworICAgIHdlaWdodF92ZWMgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworICAgIG9mZnNldF92ZWMgKz0gY29uc3RfdmVjOwogCiAgICAgZm9yIChjbnQgPSB3aWR0aCA+PiAzOyBjbnQtLTspIHsKICAgICAgICAgc3JjMF9wdHJfdG1wID0gc3JjMF9wdHI7CkBAIC01MjEyLDE1ICs1NDczLDEyIEBACiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgICAgIGRzdGgwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0aDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3RoMiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDEsIGRzdDIxX3IsIGRzdDIxX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoMSwgZHN0aDAsIGRzdDEwX3IsIGRzdDEwX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoMiwgZHN0aDEsIGRzdDIxX3IsIGRzdDIxX2wpOwogCiAgICAgICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMjsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgICAgIExEX1NCNChzcmMwX3B0cl90bXAsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwpAQCAtNTIzMCw1NyArNTQ4OCw1OSBAQAogICAgICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CiAKICAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKIAotICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgICAgICBkc3RoMyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgICAgICBkc3RoNCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgICAgICBkc3RoNSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgICAgICBkc3RoNiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdGgzLCBkc3RoMiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3RoNCwgZHN0aDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0aDUsIGRzdGg0LCBkc3Q1NF9yLCBkc3Q1NF9sKTsKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdGg2LCBkc3RoNSwgZHN0NjVfciwgZHN0NjVfbCk7CisKICAgICAgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgICAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgICAgICBkc3QwX3IgPj49IDY7Ci0gICAgICAgICAgICBkc3QwX2wgPj49IDY7Ci0KLSAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLQotICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CiAgICAgICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICAgICAgICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0MV9yID4+PSA2OwotICAgICAgICAgICAgZHN0MV9sID4+PSA2OworICAgICAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKLSAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKLQotICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgICAgICAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3QxMF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDEwX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0Ml9yID4+PSA2OwotICAgICAgICAgICAgZHN0Ml9sID4+PSA2OwotCi0gICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0KLSAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDUsIGRzdDIxX3IsIGRzdDIxX2wpOwotICAgICAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0MjFfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgICAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19sLCBkc3QyMV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgICAgIGRzdDNfciA+Pj0gNjsKLSAgICAgICAgICAgIGRzdDNfbCA+Pj0gNjsKLQotICAgICAgICAgICAgUENLRVZfSDRfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKLSAgICAgICAgICAgIEhFVkNfQklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBybmRfdmVjLCBvZmZzZXRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdF90bXAsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgU1JBXzRWKGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgNik7CisgICAgICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICAgICAgICAgIFBDS0VWX0g0X1NXKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdDNfciwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QwLCBpbjAsIHRtcDAsIHRtcDEpOworICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0MSwgaW4xLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGluMiwgdG1wNCwgdG1wNSk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBpbjMsIHRtcDYsIHRtcDcpOworICAgICAgICAgICAgZHN0MCA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAwLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgICAgIGRzdDEgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMSwgd2VpZ2h0X3ZlYyk7CisgICAgICAgICAgICBkc3QyID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDIsIHdlaWdodF92ZWMpOworICAgICAgICAgICAgZHN0MyA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXAzLCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgICAgIGRzdDQgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNCwgd2VpZ2h0X3ZlYyk7CisgICAgICAgICAgICBkc3Q1ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDUsIHdlaWdodF92ZWMpOworICAgICAgICAgICAgZHN0NiA9IF9fbXNhX2RwYWRkX3NfdyhvZmZzZXRfdmVjLCB0bXA2LCB3ZWlnaHRfdmVjKTsKKyAgICAgICAgICAgIGRzdDcgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNywgd2VpZ2h0X3ZlYyk7CisgICAgICAgICAgICBTUkFSX1c0X1NXKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHJuZF92ZWMpOworICAgICAgICAgICAgU1JBUl9XNF9TVyhkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBybmRfdmVjKTsKKyAgICAgICAgICAgIFBDS0VWX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgICAgIENMSVBfU0g0XzBfMjU1X01BWF9TQVRVKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKICAgICAgICAgICAgIGRzdF90bXAgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKworICAgICAgICAgICAgZHN0MTBfciA9IGRzdDU0X3I7CisgICAgICAgICAgICBkc3QxMF9sID0gZHN0NTRfbDsKKyAgICAgICAgICAgIGRzdDIxX3IgPSBkc3Q2NV9yOworICAgICAgICAgICAgZHN0MjFfbCA9IGRzdDY1X2w7CisgICAgICAgICAgICBkc3RoMiA9IGRzdGg2OwogICAgICAgICB9CiAKICAgICAgICAgc3JjMF9wdHIgKz0gODsKQEAgLTUzMDcsMTMgKzU1NjcsMTYgQEAKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19odl9iaXdndF80dF84eDJfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcl94LCBmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBoZXZjX2h2X2Jpd2d0XzR0XzhtdWx0eDRfbXNhKHNyYzBfcHRyLCBzcmNfc3RyaWRlLCBzcmMxX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeSwgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsLCAxKTsKICAgICB9IGVsc2UgaWYgKDYgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfaHZfYml3Z3RfNHRfOHg2X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsIHNyYzJfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwgZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwpOwogICAgIH0gZWxzZSBpZiAoMCA9PSAoaGVpZ2h0ICUgNCkpIHsKICAgICAgICAgaGV2Y19odl9iaXdndF80dF84bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwKQEAgLTUzMzgsMTYgKzU2MDEsMjI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBoZXZjX2h2X2Jpd2d0XzR0XzhtdWx0eDRtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCB3ZWlnaHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwsIDgpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQ2NF90IHRwMCwgdHAxOworICAgIGludDMyX3Qgb2Zmc2V0LCB3ZWlnaHQ7CisgICAgdWludDhfdCAqc3JjMF9wdHJfdG1wLCAqZHN0X3RtcDsKKyAgICBpbnQxNl90ICpzcmMxX3B0cl90bXA7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szOworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdGVyX3ZlYzsKKyAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICAgIHY4aTE2IGRzdGgwLCBkc3RoMSwgZHN0aDIsIGRzdGgzLCBkc3RoNCwgZHN0aDUsIGRzdGg2LCB3ZWlnaHRfdmVjOworICAgIHY4aTE2IGRzdDEwLCBkc3QyMSwgZHN0MjIsIGRzdDczLCBkc3Q4NCwgZHN0OTUsIGRzdDEwNjsKKyAgICB2OGkxNiBkc3Q3Nl9yLCBkc3Q5OF9yLCBkc3Q4N19yLCBkc3QxMDlfcjsKKyAgICB2OGkxNiBpbjAgPSB7IDAgfSwgaW4xID0geyAwIH0sIGluMiA9IHsgMCB9LCBpbjMgPSB7IDAgfTsKKyAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yOworICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDIxX2wsIGRzdDQzX2wsIGRzdDY1X2w7CisgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2w7CisgICAgdjRpMzIgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2NGkzMiBvZmZzZXRfdmVjLCBybmRfdmVjLCBjb25zdF92ZWM7CiAKLSAgICBoZXZjX2h2X2Jpd2d0XzR0XzR3X21zYShzcmMwX3B0ciArIDgsIHNyY19zdHJpZGUsIHNyYzFfcHRyICsgOCwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgOCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsIGZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBybmRfdmFsKTsKKyAgICBzcmMwX3B0ciAtPSAoc3JjX3N0cmlkZSArIDEpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKKyAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKKworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKKworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKworICAgIG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CisgICAgbWFzazEgPSBtYXNrMCArIDI7CisKKyAgICBvZmZzZXQgPSAob2Zmc2V0MCArIG9mZnNldDEpIDw8IHJuZF92YWw7CisgICAgd2VpZ2h0MCA9IHdlaWdodDAgJiAweDAwMDBGRkZGOworICAgIHdlaWdodCA9IHdlaWdodDAgfCAod2VpZ2h0MSA8PCAxNik7CisKKyAgICBjb25zdF92ZWMgPSBfX21zYV9maWxsX3coKDEyOCAqIHdlaWdodDEpKTsKKyAgICBjb25zdF92ZWMgPDw9IDY7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOworICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCArIDEpOworICAgIG9mZnNldF92ZWMgKz0gY29uc3RfdmVjOworICAgIHdlaWdodF92ZWMgPSAodjhpMTYpIF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOworCisgICAgc3JjMF9wdHJfdG1wID0gc3JjMF9wdHI7CisgICAgZHN0X3RtcCA9IGRzdDsKKyAgICBzcmMxX3B0cl90bXAgPSBzcmMxX3B0cjsKKworICAgIExEX1NCMyhzcmMwX3B0cl90bXAsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgIHNyYzBfcHRyX3RtcCArPSAoMyAqIHNyY19zdHJpZGUpOworCisgICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKworICAgIGRzdGgwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworCisgICAgSUxWUkxfSDJfU0goZHN0aDEsIGRzdGgwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMiwgZHN0aDEsIGRzdDIxX3IsIGRzdDIxX2wpOworCisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMwX3B0cl90bXAsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgICAgICBzcmMwX3B0cl90bXAgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisKKyAgICAgICAgTERfU0g0KHNyYzFfcHRyX3RtcCwgc3JjMl9zdHJpZGUsIGluMCwgaW4xLCBpbjIsIGluMyk7CisgICAgICAgIHNyYzFfcHRyX3RtcCArPSAoNCAqIHNyYzJfc3RyaWRlKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisKKyAgICAgICAgZHN0aDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3RoNCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdGg1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0aDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworCisgICAgICAgIElMVlJMX0gyX1NIKGRzdGgzLCBkc3RoMiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg0LCBkc3RoMywgZHN0NDNfciwgZHN0NDNfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg1LCBkc3RoNCwgZHN0NTRfciwgZHN0NTRfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg2LCBkc3RoNSwgZHN0NjVfciwgZHN0NjVfbCk7CisKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDNfbCA9IEhFVkNfRklMVF80VEFQKGRzdDQzX2wsIGRzdDY1X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICAgICAgUENLRVZfSDRfU1coZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QyX2wsIGRzdDJfciwgZHN0M19sLAorICAgICAgICAgICAgICAgICAgICBkc3QzX3IsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QwLCBpbjAsIHRtcDAsIHRtcDEpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxLCBpbjEsIHRtcDIsIHRtcDMpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QyLCBpbjIsIHRtcDQsIHRtcDUpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBpbjMsIHRtcDYsIHRtcDcpOworICAgICAgICBkc3QwID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDAsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QxID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDEsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QyID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDIsIHdlaWdodF92ZWMpOworICAgICAgICBkc3QzID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDMsIHdlaWdodF92ZWMpOworICAgICAgICBkc3Q0ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDQsIHdlaWdodF92ZWMpOworICAgICAgICBkc3Q1ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDUsIHdlaWdodF92ZWMpOworICAgICAgICBkc3Q2ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDYsIHdlaWdodF92ZWMpOworICAgICAgICBkc3Q3ID0gX19tc2FfZHBhZGRfc193KG9mZnNldF92ZWMsIHRtcDcsIHdlaWdodF92ZWMpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHJuZF92ZWMpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIHJuZF92ZWMpOworICAgICAgICBQQ0tFVl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LAorICAgICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTVfTUFYX1NBVFUodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFBDS0VWX0IyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIG91dDAsIG91dDEpOworICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0X3RtcCArPSAoNCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwX3IgPSBkc3Q1NF9yOworICAgICAgICBkc3QxMF9sID0gZHN0NTRfbDsKKyAgICAgICAgZHN0MjFfciA9IGRzdDY1X3I7CisgICAgICAgIGRzdDIxX2wgPSBkc3Q2NV9sOworICAgICAgICBkc3RoMiA9IGRzdGg2OworICAgIH0KKworICAgIHNyYzBfcHRyICs9IDg7CisgICAgZHN0ICs9IDg7CisgICAgc3JjMV9wdHIgKz0gODsKKworICAgIG1hc2syID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKKyAgICBtYXNrMyA9IG1hc2syICsgMjsKKworICAgIExEX1NCMyhzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgc3JjMF9wdHIgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMyLCBzcmMxLCBzcmMyLCBtYXNrMiwgbWFzazMsIHZlYzIsIHZlYzMpOworCisgICAgZHN0MTAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKworICAgIElMVlJMX0gyX1NIKGRzdDIxLCBkc3QxMCwgZHN0MTBfciwgZHN0MjFfcik7CisgICAgZHN0MjIgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MjEsIDEpOworCisgICAgZm9yIChsb29wX2NudCA9IDI7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCOChzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwKKyAgICAgICAgICAgICAgIHNyYzEwKTsKKyAgICAgICAgc3JjMF9wdHIgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzcsIHNyYzMsIHNyYzcsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjOCwgc3JjNCwgc3JjOCwgbWFzazIsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM5LCBzcmM1LCBzcmM5LCBtYXNrMiwgbWFzazMsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzEwLCBzcmM2LCBzcmMxMCwgbWFzazIsIG1hc2szLCB2ZWM2LCB2ZWM3KTsKKworICAgICAgICBkc3Q3MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDg0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0OTUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxMDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworCisgICAgICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0NzMsIGRzdDIyKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0ODQsIGRzdDczLCBkc3Q0M19yLCBkc3Q4N19yKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0OTUsIGRzdDg0LCBkc3Q1NF9yLCBkc3Q5OF9yKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MTA2LCBkc3Q5NSwgZHN0NjVfciwgZHN0MTA5X3IpOworICAgICAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q3MywgMSk7CisgICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0MjIsIGRzdDEwNik7CisKKyAgICAgICAgTEQyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHAwLCB0cDEpOworICAgICAgICBzcmMxX3B0ciArPSAyICogc3JjMl9zdHJpZGU7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4wKTsKKyAgICAgICAgTEQyKHNyYzFfcHRyLCBzcmMyX3N0cmlkZSwgdHAwLCB0cDEpOworICAgICAgICBzcmMxX3B0ciArPSAyICogc3JjMl9zdHJpZGU7CisgICAgICAgIElOU0VSVF9EMl9TSCh0cDAsIHRwMSwgaW4xKTsKKworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIHNyYzFfcHRyICs9IDIgKiBzcmMyX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjIpOworICAgICAgICBMRDIoc3JjMV9wdHIsIHNyYzJfc3RyaWRlLCB0cDAsIHRwMSk7CisgICAgICAgIHNyYzFfcHRyICs9IDIgKiBzcmMyX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NIKHRwMCwgdHAxLCBpbjMpOworCisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQKGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVAoZHN0NjVfciwgZHN0ODdfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Nl9yLCBkc3Q5OF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQKGRzdDg3X3IsIGRzdDEwOV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKworICAgICAgICBTUkFfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFNSQV80Vihkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA2KTsKKyAgICAgICAgUENLRVZfSDRfU1coZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0NywgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDAsIGluMCwgdG1wMCwgdG1wMSk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEsIGluMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGluMiwgdG1wNCwgdG1wNSk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDMsIGluMywgdG1wNiwgdG1wNyk7CisgICAgICAgIGRzdDAgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMCwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDEgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMSwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDIgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMiwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDMgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wMywgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDQgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNCwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDUgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNSwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDYgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNiwgd2VpZ2h0X3ZlYyk7CisgICAgICAgIGRzdDcgPSBfX21zYV9kcGFkZF9zX3cob2Zmc2V0X3ZlYywgdG1wNywgd2VpZ2h0X3ZlYyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgcm5kX3ZlYyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgcm5kX3ZlYyk7CisgICAgICAgIFBDS0VWX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsCisgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwX3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QyMV9yID0gZHN0MTA5X3I7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDEwNiwgMSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X2Jpd2d0XzR0XzE2d19tc2EodWludDhfdCAqc3JjMF9wdHIsCkBAIC01MzY1LDExICs1ODQwLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBoZXZjX2h2X2Jpd2d0XzR0XzhtdWx0eDRtdWx0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxX3B0ciwgc3JjMl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCB3ZWlnaHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDEsIG9mZnNldDAsIG9mZnNldDEsIHJuZF92YWwsIDE2KTsKKyAgICBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgaGV2Y19odl9iaXdndF80dF84bXVsdHg0X21zYShzcmMwX3B0ciwgc3JjX3N0cmlkZSwgc3JjMV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMl9zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3ksIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0MSwgcm5kX3ZhbCwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaGV2Y19odl9iaXdndF80dF84bXVsdHg0bXVsdF9tc2Eoc3JjMF9wdHIsIHNyY19zdHJpZGUsIHNyYzFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgcm5kX3ZhbCwgMTYpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl9iaXdndF80dF8yNHdfbXNhKHVpbnQ4X3QgKnNyYzBfcHRyLApAQCAtNTQ1MywzNSArNTkzNCwzMiBAQAogCiAjdW5kZWYgQklfV19NQ19DT1BZCiAKLSNkZWZpbmUgQklfV19NQyhQRUwsIERJUiwgV0lEVEgsIFRBUCwgRElSMSwgRklMVF9ESVIpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi12b2lkIGZmX2hldmNfcHV0X2hldmNfYmlfd18jI1BFTCMjXyMjRElSIyNXSURUSCMjXzhfbXNhKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RyaWRlLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjXzE2Yml0LCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVub20sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodDAsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQxLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MCwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDEsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciA9IGZmX2hldmNfIyNQRUwjI19maWx0ZXJzW0ZJTFRfRElSIC0gMV07ICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBzaGlmdCA9IDE0ICsgMSAtIDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgbG9nMldkID0gZGVub20gKyBzaGlmdCAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGhldmNfIyNESVIxIyNfYml3Z3RfIyNUQVAjI3RfIyNXSURUSCMjd19tc2Eoc3JjLCBzcmNfc3RyaWRlLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY18xNmJpdCwgTUFYX1BCX1NJWkUsICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUsICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBoZWlnaHQsICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodDAsIHdlaWdodDEsIG9mZnNldDAsICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQxLCBsb2cyV2QpOyAgICAgICAgICAgICAgXAorI2RlZmluZSBCSV9XX01DKFBFTCwgRElSLCBXSURUSCwgVEFQLCBESVIxLCBGSUxUX0RJUikgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjX2JpX3dfIyNQRUwjI18jI0RJUiMjV0lEVEgjI184X21zYSh1aW50OF90ICpkc3QsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RyaWRlLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmNfMTZiaXQsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVub20sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0MCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0MSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDhfdCAqZmlsdGVyID0gZmZfaGV2Y18jI1BFTCMjX2ZpbHRlcnNbRklMVF9ESVIgLSAxXTsgICAgICAgICAgICAgXAorICAgIGludCBsb2cyV2QgPSBkZW5vbSArIDE0IC0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhldmNfIyNESVIxIyNfYml3Z3RfIyNUQVAjI3RfIyNXSURUSCMjd19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBzcmNfMTZiaXQsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BCX1NJWkUsIGRzdCwgZHN0X3N0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBoZWlnaHQsIHdlaWdodDAsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MSwgb2Zmc2V0MCwgb2Zmc2V0MSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nMldkKTsgICAgICAgICAgICAgICAgICAgICAgXAogfQogCiBCSV9XX01DKHFwZWwsIGgsIDQsIDgsIGh6LCBteCk7CkBAIC01NTIwLDUzICs1OTk4LDQ4IEBACiAKICN1bmRlZiBCSV9XX01DCiAKLSNkZWZpbmUgQklfV19NQ19IVihQRUwsIERJUiwgV0lEVEgsIFRBUCwgRElSMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi12b2lkIGZmX2hldmNfcHV0X2hldmNfYmlfd18jI1BFTCMjXyMjRElSIyNXSURUSCMjXzhfbXNhKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RyaWRlLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc3RyaWRlLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjXzE2Yml0LCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVub20sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodDAsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQxLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MCwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDEsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94ID0gZmZfaGV2Y18jI1BFTCMjX2ZpbHRlcnNbbXggLSAxXTsgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSA9IGZmX2hldmNfIyNQRUwjI19maWx0ZXJzW215IC0gMV07ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgc2hpZnQgPSAxNCArIDEgLSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGxvZzJXZCA9IGRlbm9tICsgc2hpZnQgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBoZXZjXyMjRElSMSMjX2Jpd2d0XyMjVEFQIyN0XyMjV0lEVEgjI3dfbXNhKHNyYywgc3JjX3N0cmlkZSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfMTZiaXQsIE1BWF9QQl9TSVpFLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHdlaWdodDAsIHdlaWdodDEsICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0MCwgb2Zmc2V0MSwgbG9nMldkKTsgICAgIFwKKyNkZWZpbmUgQklfV19NQ19IVihQRUwsIFdJRFRILCBUQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2hldmNfcHV0X2hldmNfYmlfd18jI1BFTCMjX2h2IyNXSURUSCMjXzhfbXNhKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzcmNfMTZiaXQsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZW5vbSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0MCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodDEsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQwLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXgsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG15LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCA9IGZmX2hldmNfIyNQRUwjI19maWx0ZXJzW214IC0gMV07ICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kgPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteSAtIDFdOyAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbG9nMldkID0gZGVub20gKyAxNCAtIDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhldmNfaHZfYml3Z3RfIyNUQVAjI3RfIyNXSURUSCMjd19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBzcmNfMTZiaXQsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQl9TSVpFLCBkc3QsIGRzdF9zdHJpZGUsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0MCwgd2VpZ2h0MSwgb2Zmc2V0MCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldDEsIGxvZzJXZCk7ICAgICAgICAgICAgICAgICBcCiB9CiAKLUJJX1dfTUNfSFYocXBlbCwgaHYsIDQsIDgsIGh2KTsKLUJJX1dfTUNfSFYocXBlbCwgaHYsIDgsIDgsIGh2KTsKLUJJX1dfTUNfSFYocXBlbCwgaHYsIDEyLCA4LCBodik7Ci1CSV9XX01DX0hWKHFwZWwsIGh2LCAxNiwgOCwgaHYpOwotQklfV19NQ19IVihxcGVsLCBodiwgMjQsIDgsIGh2KTsKLUJJX1dfTUNfSFYocXBlbCwgaHYsIDMyLCA4LCBodik7Ci1CSV9XX01DX0hWKHFwZWwsIGh2LCA0OCwgOCwgaHYpOwotQklfV19NQ19IVihxcGVsLCBodiwgNjQsIDgsIGh2KTsKK0JJX1dfTUNfSFYocXBlbCwgNCwgOCk7CitCSV9XX01DX0hWKHFwZWwsIDgsIDgpOworQklfV19NQ19IVihxcGVsLCAxMiwgOCk7CitCSV9XX01DX0hWKHFwZWwsIDE2LCA4KTsKK0JJX1dfTUNfSFYocXBlbCwgMjQsIDgpOworQklfV19NQ19IVihxcGVsLCAzMiwgOCk7CitCSV9XX01DX0hWKHFwZWwsIDQ4LCA4KTsKK0JJX1dfTUNfSFYocXBlbCwgNjQsIDgpOwogCi1CSV9XX01DX0hWKGVwZWwsIGh2LCA0LCA0LCBodik7Ci1CSV9XX01DX0hWKGVwZWwsIGh2LCA4LCA0LCBodik7Ci1CSV9XX01DX0hWKGVwZWwsIGh2LCA2LCA0LCBodik7Ci1CSV9XX01DX0hWKGVwZWwsIGh2LCAxMiwgNCwgaHYpOwotQklfV19NQ19IVihlcGVsLCBodiwgMTYsIDQsIGh2KTsKLUJJX1dfTUNfSFYoZXBlbCwgaHYsIDI0LCA0LCBodik7Ci1CSV9XX01DX0hWKGVwZWwsIGh2LCAzMiwgNCwgaHYpOworQklfV19NQ19IVihlcGVsLCA0LCA0KTsKK0JJX1dfTUNfSFYoZXBlbCwgOCwgNCk7CitCSV9XX01DX0hWKGVwZWwsIDYsIDQpOworQklfV19NQ19IVihlcGVsLCAxMiwgNCk7CitCSV9XX01DX0hWKGVwZWwsIDE2LCA0KTsKK0JJX1dfTUNfSFYoZXBlbCwgMjQsIDQpOworQklfV19NQ19IVihlcGVsLCAzMiwgNCk7CiAKICN1bmRlZiBCSV9XX01DX0hWCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaGV2Y19tY191bmlfbXNhLmMgYi9saWJhdmNvZGVjL21pcHMvaGV2Y19tY191bmlfbXNhLmMKaW5kZXggNzU0ZmJkYi4uNzQwYzk3MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2hldmNfbWNfdW5pX21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oZXZjX21jX3VuaV9tc2EuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWFub2prdW1hciBCaG9zYWxlIChNYW5vamt1bWFyLkJob3NhbGVAaW1ndGVjLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAxNSAtIDIwMTcgTWFub2prdW1hciBCaG9zYWxlIChNYW5vamt1bWFyLkJob3NhbGVAaW1ndGVjLmNvbSkKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMjIsMjM0ICsyMiw3IEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy9taXBzL2hldmNkc3BfbWlwcy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvbWlwcy9oZXZjX21hY3Jvc19tc2EuaCIKIAotc3RhdGljIHZvaWQgY29weV93aWR0aDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQotewotICAgIGludDMyX3QgY250OwotICAgIHVpbnQ2NF90IG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDc7Ci0gICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKLQotICAgIGlmICgwID09IGhlaWdodCAlIDEyKSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCAvIDEyKTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMSwgMCk7Ci0gICAgICAgICAgICBvdXQyID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMyLCAwKTsKLSAgICAgICAgICAgIG91dDMgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzMsIDApOwotICAgICAgICAgICAgb3V0NCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNCwgMCk7Ci0gICAgICAgICAgICBvdXQ1ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM1LCAwKTsKLSAgICAgICAgICAgIG91dDYgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzYsIDApOwotICAgICAgICAgICAgb3V0NyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNywgMCk7Ci0KLSAgICAgICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTRDQob3V0NCwgb3V0NSwgb3V0Niwgb3V0NywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgICAgICBvdXQwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMwLCAwKTsKLSAgICAgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzEsIDApOwotICAgICAgICAgICAgb3V0MiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMiwgMCk7Ci0gICAgICAgICAgICBvdXQzID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMzLCAwKTsKLQotICAgICAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSA4KSB7Ci0gICAgICAgIGZvciAoY250ID0gaGVpZ2h0ID4+IDM7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgICAgICBvdXQwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMwLCAwKTsKLSAgICAgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzEsIDApOwotICAgICAgICAgICAgb3V0MiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMiwgMCk7Ci0gICAgICAgICAgICBvdXQzID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMzLCAwKTsKLSAgICAgICAgICAgIG91dDQgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzQsIDApOwotICAgICAgICAgICAgb3V0NSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNSwgMCk7Ci0gICAgICAgICAgICBvdXQ2ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM2LCAwKTsKLSAgICAgICAgICAgIG91dDcgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzcsIDApOwotCi0gICAgICAgICAgICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgU0Q0KG91dDQsIG91dDUsIG91dDYsIG91dDcsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSA0KSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCAvIDQpOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgICAgICBvdXQwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMwLCAwKTsKLSAgICAgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzEsIDApOwotICAgICAgICAgICAgb3V0MiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMiwgMCk7Ci0gICAgICAgICAgICBvdXQzID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMzLCAwKTsKLQotICAgICAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSAyKSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCAvIDIpOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCMihzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEpOwotICAgICAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgICAgICAgICBvdXQwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMwLCAwKTsKLSAgICAgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzEsIDApOwotCi0gICAgICAgICAgICBTRChvdXQwLCBkc3QpOwotICAgICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgICAgICBTRChvdXQxLCBkc3QpOwotICAgICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfd2lkdGgxMl9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKLXsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotCi0gICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0gICAgU1QxMng4X1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7Ci0gICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgU1QxMng4X1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgZHN0X3N0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfMTZtdWx0eDhtdWx0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwgaW50MzJfdCB3aWR0aCkKLXsKLSAgICBpbnQzMl90IGNudCwgbG9vcF9jbnQ7Ci0gICAgdWludDhfdCAqc3JjX3RtcCwgKmRzdF90bXA7Ci0gICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKLQotICAgIGZvciAoY250ID0gKHdpZHRoID4+IDQpOyBjbnQtLTspIHsKLSAgICAgICAgc3JjX3RtcCA9IHNyYzsKLSAgICAgICAgZHN0X3RtcCA9IGRzdDsKLQotICAgICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAzKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCOChzcmNfdG1wLCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICAgICAgc3JjX3RtcCArPSAoOCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgICAgICBTVF9VQjgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywKLSAgICAgICAgICAgICAgICAgICBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdF90bXAgKz0gKDggKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNyYyArPSAxNjsKLSAgICAgICAgZHN0ICs9IDE2OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weV93aWR0aDE2X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQotewotICAgIGludDMyX3QgY250OwotICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7Ci0KLSAgICBpZiAoMCA9PSBoZWlnaHQgJSAxMikgewotICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyAxMik7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI4KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsCi0gICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSA4KSB7Ci0gICAgICAgIGNvcHlfMTZtdWx0eDhtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LCAxNik7Ci0gICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDQpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0ID4+IDIpOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIFNUX1VCNChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfd2lkdGgyNF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKLXsKLSAgICBjb3B5XzE2bXVsdHg4bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwgMTYpOwotICAgIGNvcHlfd2lkdGg4X21zYShzcmMgKyAxNiwgc3JjX3N0cmlkZSwgZHN0ICsgMTYsIGRzdF9zdHJpZGUsIGhlaWdodCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlfd2lkdGgzMl9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKLXsKLSAgICBpbnQzMl90IGNudDsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotCi0gICAgaWYgKDAgPT0gaGVpZ2h0ICUgMTIpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gMTIpOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgOCkgewotICAgICAgICBjb3B5XzE2bXVsdHg4bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwgMzIpOwotICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSA0KSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCA+PiAyKTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIExEX1VCNChzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIFNUX1VCNChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI0KHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5X3dpZHRoNDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCi17Ci0gICAgY29weV8xNm11bHR4OG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQsIDQ4KTsKLX0KLQotc3RhdGljIHZvaWQgY29weV93aWR0aDY0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQotewotICAgIGNvcHlfMTZtdWx0eDhtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LCA2NCk7Ci19Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IG1jX2ZpbHRfbWFza19hcnJbMTYgKiAzXSA9IHsKK3N0YXRpYyBjb25zdCB1aW50OF90IGZmX2hldmNfbWFza19hcnJbMTYgKiAzXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDB4NDApKSkgPSB7CiAgICAgLyogOCB3aWR0aCBjYXNlcyAqLwogICAgIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsCiAgICAgLyogNCB3aWR0aCBjYXNlcyAqLwpAQCAtMjU4LDM3ICszMSwyMSBAQAogICAgIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsIDI4CiB9OwogCi0jZGVmaW5lIEZJTFRfOFRBUF9EUEFERF9TX0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKSAgICAgICAgIFwKLSggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjhpMTYgdG1wMCwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXAwID0gX19tc2FfZG90cF9zX2goKHYxNmk4KSB2ZWMwLCAodjE2aTgpIGZpbHQwKTsgICAgICAgICBcCi0gICAgdG1wMCA9IF9fbXNhX2RwYWRkX3NfaCh0bXAwLCAodjE2aTgpIHZlYzEsICh2MTZpOCkgZmlsdDEpOyAgXAotICAgIHRtcDEgPSBfX21zYV9kb3RwX3NfaCgodjE2aTgpIHZlYzIsICh2MTZpOCkgZmlsdDIpOyAgICAgICAgIFwKLSAgICB0bXAxID0gX19tc2FfZHBhZGRfc19oKHRtcDEsICh2MTZpOCkgdmVjMywgKHYxNmk4KSBmaWx0Myk7ICBcCi0gICAgdG1wMCA9IF9fbXNhX2FkZHNfc19oKHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19ICkKLQogI2RlZmluZSBIT1JJWl84VEFQXzRXSURfNFZFQ1NfRklMVChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgdjE2aTggdmVjMF9tLCB2ZWMxX20sIHZlYzJfbSwgdmVjM19tLCAgdmVjNF9tLCB2ZWM1X20sIHZlYzZfbSwgdmVjN19tOyAgXAotICAgIHY4aTE2IHJlczBfbSwgcmVzMV9tLCByZXMyX20sIHJlczNfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzBfbSwgdmVjMV9tKTsgICAgICAgXAotICAgIERPVFBfU0IyX1NIKHZlYzBfbSwgdmVjMV9tLCBmaWx0MCwgZmlsdDAsIHJlczBfbSwgcmVzMV9tKTsgICAgICAgICAgICAgIFwKKyAgICBET1RQX1NCMl9TSCh2ZWMwX20sIHZlYzFfbSwgZmlsdDAsIGZpbHQwLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzJfbSwgdmVjM19tKTsgICAgICAgXAotICAgIERQQUREX1NCMl9TSCh2ZWMyX20sIHZlYzNfbSwgZmlsdDEsIGZpbHQxLCByZXMwX20sIHJlczFfbSk7ICAgICAgICAgICAgIFwKKyAgICBEUEFERF9TQjJfU0godmVjMl9tLCB2ZWMzX20sIGZpbHQxLCBmaWx0MSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzRfbSwgdmVjNV9tKTsgICAgICAgXAotICAgIERPVFBfU0IyX1NIKHZlYzRfbSwgdmVjNV9tLCBmaWx0MiwgZmlsdDIsIHJlczJfbSwgcmVzM19tKTsgICAgICAgICAgICAgIFwKKyAgICBEUEFERF9TQjJfU0godmVjNF9tLCB2ZWM1X20sIGZpbHQyLCBmaWx0Miwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMywgbWFzazMsIHZlYzZfbSwgdmVjN19tKTsgICAgICAgXAotICAgIERQQUREX1NCMl9TSCh2ZWM2X20sIHZlYzdfbSwgZmlsdDMsIGZpbHQzLCByZXMyX20sIHJlczNfbSk7ICAgICAgICAgICAgIFwKLSAgICBBRERTX1NIMl9TSChyZXMwX20sIHJlczJfbSwgcmVzMV9tLCByZXMzX20sIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICBcCisgICAgRFBBRERfU0IyX1NIKHZlYzZfbSwgdmVjN19tLCBmaWx0MywgZmlsdDMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgXAogfQogCiAjZGVmaW5lIEhPUklaXzhUQVBfOFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsICAgICAgICAgICAgICAgICAgICBcCkBAIC0yOTcsMzggKzU0LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgdjE2aTggdmVjMF9tLCB2ZWMxX20sIHZlYzJfbSwgdmVjM19tLCB2ZWM0X20sIHZlYzVfbSwgdmVjNl9tLCB2ZWM3X207ICAgICBcCi0gICAgdjhpMTYgcmVzMF9tLCByZXMxX20sIHJlczJfbSwgcmVzM19tLCByZXM0X20sIHJlczVfbSwgcmVzNl9tLCByZXM3X207ICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIHZlYzBfbSwgdmVjMV9tKTsgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazAsIHZlYzJfbSwgdmVjM19tKTsgICAgICAgICBcCiAgICAgRE9UUF9TQjRfU0godmVjMF9tLCB2ZWMxX20sIHZlYzJfbSwgdmVjM19tLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgICBcCi0gICAgICAgICAgICAgICAgcmVzMF9tLCByZXMxX20sIHJlczJfbSwgcmVzM19tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzBfbSwgdmVjMV9tKTsgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzJfbSwgdmVjM19tKTsgICAgICAgICBcCi0gICAgRE9UUF9TQjRfU0godmVjMF9tLCB2ZWMxX20sIHZlYzJfbSwgdmVjM19tLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0MiwgICBcCi0gICAgICAgICAgICAgICAgcmVzNF9tLCByZXM1X20sIHJlczZfbSwgcmVzN19tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRFBBRERfU0I0X1NIKHZlYzBfbSwgdmVjMV9tLCB2ZWMyX20sIHZlYzNfbSwgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZmlsdDIsICBcCisgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzRfbSwgdmVjNV9tKTsgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzZfbSwgdmVjN19tKTsgICAgICAgICBcCiAgICAgRFBBRERfU0I0X1NIKHZlYzRfbSwgdmVjNV9tLCB2ZWM2X20sIHZlYzdfbSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsICBcCi0gICAgICAgICAgICAgICAgIHJlczBfbSwgcmVzMV9tLCByZXMyX20sIHJlczNfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMywgbWFzazMsIHZlYzRfbSwgdmVjNV9tKTsgICAgICAgICBcCiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMywgbWFzazMsIHZlYzZfbSwgdmVjN19tKTsgICAgICAgICBcCiAgICAgRFBBRERfU0I0X1NIKHZlYzRfbSwgdmVjNV9tLCB2ZWM2X20sIHZlYzdfbSwgZmlsdDMsIGZpbHQzLCBmaWx0MywgZmlsdDMsICBcCi0gICAgICAgICAgICAgICAgIHJlczRfbSwgcmVzNV9tLCByZXM2X20sIHJlczdfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQUREU19TSDRfU0gocmVzMF9tLCByZXM0X20sIHJlczFfbSwgcmVzNV9tLCByZXMyX20sIHJlczZfbSwgcmVzM19tLCAgICAgICBcCi0gICAgICAgICAgICAgICAgcmVzN19tLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLSNkZWZpbmUgRklMVF80VEFQX0RQQUREX1NfSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpICAgICAgICAgICBcCi0oIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHY4aTE2IHRtcDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wMCA9IF9fbXNhX2RvdHBfc19oKCh2MTZpOCkgdmVjMCwgKHYxNmk4KSBmaWx0MCk7ICAgICAgICAgXAotICAgIHRtcDAgPSBfX21zYV9kcGFkZF9zX2godG1wMCwgKHYxNmk4KSB2ZWMxLCAodjE2aTgpIGZpbHQxKTsgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSApCi0KICNkZWZpbmUgSE9SSVpfNFRBUF80V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMCwgbWFzazEsIGZpbHQwLCBmaWx0MSwgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEpICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM1NywxOCArMTAxLDE5OCBAQAogICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCitzdGF0aWMgdm9pZCBjb3B5X3dpZHRoOF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCit7CisgICAgaW50MzJfdCBjbnQ7CisgICAgdWludDY0X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgb3V0Niwgb3V0NzsKKworICAgIGlmICgyID09IGhlaWdodCkgeworICAgICAgICBMRDIoc3JjLCBzcmNfc3RyaWRlLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgU0Qob3V0MCwgZHN0KTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgIFNEKG91dDEsIGRzdCk7CisgICAgfSBlbHNlIGlmICg2ID09IGhlaWdodCkgeworICAgICAgICBMRDQoc3JjLCBzcmNfc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgTEQyKHNyYywgc3JjX3N0cmlkZSwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNEKG91dDAsIGRzdCk7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTRChvdXQxLCBkc3QpOworICAgIH0gZWxzZSBpZiAoMCA9PSAoaGVpZ2h0ICUgOCkpIHsKKyAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0ID4+IDMpOyBjbnQtLTspIHsKKyAgICAgICAgICAgIExENChzcmMsIHNyY19zdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgICAgICBMRDQoc3JjLCBzcmNfc3RyaWRlLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFNENChvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3LCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKDAgPT0gKGhlaWdodCAlIDQpKSB7CisgICAgICAgIGZvciAoY250ID0gKGhlaWdodCA+PiAyKTsgY250LS07KSB7CisgICAgICAgICAgICBMRDQoc3JjLCBzcmNfc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weV93aWR0aDEyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQoreworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisKKyAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICBTVDEyeDhfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKKyAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICBTVDEyeDhfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0LCBkc3Rfc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgY29weV93aWR0aDE2X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQoreworICAgIGludDMyX3QgY250OworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisKKyAgICBpZiAoMTIgPT0gaGVpZ2h0KSB7CisgICAgICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgU1RfVUI4KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFNUX1VCNChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYgKDAgPT0gKGhlaWdodCAlIDgpKSB7CisgICAgICAgIGZvciAoY250ID0gKGhlaWdodCA+PiAzKTsgY250LS07KSB7CisgICAgICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LAorICAgICAgICAgICAgICAgICAgIHNyYzcpOworICAgICAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7CisgICAgICAgICAgICBTVF9VQjgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0LAorICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKDAgPT0gKGhlaWdodCAlIDQpKSB7CisgICAgICAgIGZvciAoY250ID0gKGhlaWdodCA+PiAyKTsgY250LS07KSB7CisgICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworCisgICAgICAgICAgICBTVF9VQjQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5X3dpZHRoMjRfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCit7CisgICAgaW50MzJfdCBjbnQ7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB1aW50NjRfdCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3OworCisgICAgZm9yIChjbnQgPSA0OyBjbnQtLTspIHsKKyAgICAgICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIExENChzcmMgKyAxNiwgc3JjX3N0cmlkZSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBMRDQoc3JjICsgMTYsIHNyY19zdHJpZGUsIG91dDQsIG91dDUsIG91dDYsIG91dDcpOworICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKworICAgICAgICBTVF9VQjgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIFNENChvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3LCBkc3QgKyAxNiwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weV93aWR0aDMyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQoreworICAgIGludDMyX3QgY250OworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisKKyAgICBmb3IgKGNudCA9IChoZWlnaHQgPj4gMik7IGNudC0tOykgeworICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFNUX1VCNChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlfd2lkdGg0OF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3sKKyAgICBpbnQzMl90IGNudDsKKyAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZ1OCBzcmMxMTsKKworICAgIGZvciAoY250ID0gKGhlaWdodCA+PiAyKTsgY250LS07KSB7CisgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBMRF9VQjQoc3JjICsgMTYsIHNyY19zdHJpZGUsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBMRF9VQjQoc3JjICsgMzIsIHNyY19zdHJpZGUsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSk7CisgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworCisgICAgICAgIFNUX1VCNChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOworICAgICAgICBTVF9VQjQoc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBkc3QgKyAzMiwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29weV93aWR0aDY0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQoreworICAgIGludDMyX3QgY250OworICAgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2dTggc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMsIHNyYzE0LCBzcmMxNTsKKworICAgIGZvciAoY250ID0gKGhlaWdodCA+PiAyKTsgY250LS07KSB7CisgICAgICAgIExEX1VCNChzcmMsIDE2LCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIExEX1VCNChzcmMsIDE2LCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIExEX1VCNChzcmMsIDE2LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEpOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfVUI0KHNyYywgMTYsIHNyYzEyLCBzcmMxMywgc3JjMTQsIHNyYzE1KTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisKKyAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU1RfVUI0KHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU1RfVUI0KHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSwgZHN0LCAxNik7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTVF9VQjQoc3JjMTIsIHNyYzEzLCBzcmMxNCwgc3JjMTUsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9Cit9CisKIHN0YXRpYyB2b2lkIGNvbW1vbl9oel84dF80eDRfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CiAgICAgdjE2dTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxOwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1VCKCZtY19maWx0X21hc2tfYXJyWzE2XSk7CisgICAgbWFzazAgPSBMRF9VQigmZmZfaGV2Y19tYXNrX2FyclsxNl0pOwogICAgIHNyYyAtPSAzOwotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CiAKICAgICAvKiByZWFycmFuZ2luZyBmaWx0ZXIgKi8KICAgICBmaWx0ID0gTERfU0goZmlsdGVyKTsKQEAgLTM4Miw3ICszMDYsNyBAQAogICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogICAgIEhPUklaXzhUQVBfNFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBvdXQwLCBvdXQxKTsKLSAgICBTUkFSX0gyX1NIKG91dDAsIG91dDEsIHJuZF92ZWMpOworICAgIFNSQVJJX0gyX1NIKG91dDAsIG91dDEsIDYpOwogICAgIFNBVF9TSDJfU0gob3V0MCwgb3V0MSwgNyk7CiAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKQEAgLTM5MCwxNyArMzE0LDE1IEBACiAKIHN0YXRpYyB2b2lkIGNvbW1vbl9oel84dF80eDhfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CiAgICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2MTZ1OCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgb3V0OwogICAgIHY4aTE2IGZpbHQsIG91dDAsIG91dDEsIG91dDIsIG91dDM7Ci0gICAgdjhpMTYgcm5kX3ZlYzsKIAotICAgIG1hc2swID0gTERfVUIoJm1jX2ZpbHRfbWFza19hcnJbMTZdKTsKKyAgICBtYXNrMCA9IExEX1VCKCZmZl9oZXZjX21hc2tfYXJyWzE2XSk7CiAgICAgc3JjIC09IDM7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIC8qIHJlYXJyYW5naW5nIGZpbHRlciAqLwogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwpAQCAtNDE5LDcgKzM0MSw3IEBACiAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgSE9SSVpfOFRBUF80V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIG91dDIsIG91dDMpOwotICAgIFNSQVJfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgcm5kX3ZlYyk7CisgICAgU1JBUklfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNik7CiAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwogICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwpAQCAtNDMwLDE2ICszNTIsMTQgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX2h6Xzh0XzR4MTZfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CiAgICAgdjE2dTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1VCKCZtY19maWx0X21hc2tfYXJyWzE2XSk7CisgICAgbWFzazAgPSBMRF9VQigmZmZfaGV2Y19tYXNrX2FyclsxNl0pOwogICAgIHNyYyAtPSAzOwotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CiAKICAgICAvKiByZWFycmFuZ2luZyBmaWx0ZXIgKi8KICAgICBmaWx0ID0gTERfU0goZmlsdGVyKTsKQEAgLTQ1OSw3ICszNzksNyBAQAogICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwogICAgIEhPUklaXzhUQVBfNFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBvdXQyLCBvdXQzKTsKLSAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOworICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDYpOwogICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7CiAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKQEAgLTQ3OSw3ICszOTksNyBAQAogICAgIEhPUklaXzhUQVBfNFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBvdXQyLCBvdXQzKTsKIAotICAgIFNSQVJfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgcm5kX3ZlYyk7CisgICAgU1JBUklfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNik7CiAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwogICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwpAQCAtNDkwLDY1ICs0MTAsMjkgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX2h6Xzh0XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaWYgKDQgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGNvbW1vbl9oel84dF80eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIHJuZF92YWwpOworICAgICAgICBjb21tb25faHpfOHRfNHg0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyKTsKICAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGNvbW1vbl9oel84dF80eDhfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIHJuZF92YWwpOworICAgICAgICBjb21tb25faHpfOHRfNHg4X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyKTsKICAgICB9IGVsc2UgaWYgKDE2ID09IGhlaWdodCkgewotICAgICAgICBjb21tb25faHpfOHRfNHgxNl9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWwpOworICAgICAgICBjb21tb25faHpfOHRfNHgxNl9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcik7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb21tb25faHpfOHRfOHg0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIHVpbnQ4X3Qgcm5kX3ZhbCkKLXsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2MTZ1OCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdG1wMCwgdG1wMTsKLSAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHY4aTE2IHJuZF92ZWM7Ci0KLSAgICBtYXNrMCA9IExEX1VCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKLSAgICBzcmMgLT0gMzsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwotCi0gICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCi0gICAgZmlsdCA9IExEX1NIKGZpbHRlcik7Ci0gICAgU1BMQVRJX0g0X1NCKGZpbHQsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLQotICAgIG1hc2sxID0gbWFzazAgKyAyOwotICAgIG1hc2syID0gbWFzazAgKyA0OwotICAgIG1hc2szID0gbWFzazAgKyA2OwotCi0gICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgSE9SSVpfOFRBUF84V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIG91dDAsIG91dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Miwgb3V0Myk7Ci0gICAgU1JBUl9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBybmRfdmVjKTsKLSAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwotICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwotICAgIHRtcDEgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDIsIG91dDMpOwotICAgIFNUOHg0X1VCKHRtcDAsIHRtcDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbW1vbl9oel84dF84eDhtdWx0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorc3RhdGljIHZvaWQgY29tbW9uX2h6Xzh0Xzh3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2MTZ1OCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdG1wMCwgdG1wMTsKKyAgICB2MTZpOCB2ZWMwX20sIHZlYzFfbSwgdmVjMl9tLCB2ZWMzX20sIHZlYzRfbSwgdmVjNV9tLCB2ZWM2X20sIHZlYzdfbTsKICAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1VCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMCA9IExEX1VCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBzcmMgLT0gMzsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC01NjIsMTAgKzQ0NiwyNSBAQAogICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICBIT1JJWl84VEFQXzhXSURfNFZFQ1NfRklMVChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIG91dDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDEsIG91dDIsIG91dDMpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOworCisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2swLCB2ZWMwX20sIHZlYzFfbSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyX20sIHZlYzNfbSk7CisgICAgICAgIERPVFBfU0I0X1NIKHZlYzBfbSwgdmVjMV9tLCB2ZWMyX20sIHZlYzNfbSwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjMF9tLCB2ZWMxX20pOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjMl9tLCB2ZWMzX20pOworICAgICAgICBEUEFERF9TQjRfU0godmVjMF9tLCB2ZWMxX20sIHZlYzJfbSwgdmVjM19tLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjNF9tLCB2ZWM1X20pOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2sxLCBtYXNrMSwgdmVjNl9tLCB2ZWM3X20pOworICAgICAgICBEUEFERF9TQjRfU0godmVjNF9tLCB2ZWM1X20sIHZlYzZfbSwgdmVjN19tLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2szLCBtYXNrMywgdmVjNF9tLCB2ZWM1X20pOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2szLCBtYXNrMywgdmVjNl9tLCB2ZWM3X20pOworICAgICAgICBEUEFERF9TQjRfU0godmVjNF9tLCB2ZWM1X20sIHZlYzZfbSwgdmVjN19tLCBmaWx0MywgZmlsdDMsIGZpbHQzLCBmaWx0MywKKyAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworCisgICAgICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDYpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwogICAgICAgICB0bXAwID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKICAgICAgICAgdG1wMSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Miwgb3V0Myk7CkBAIC01NzQsNDAgKzQ3MywyMiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29tbW9uX2h6Xzh0Xzh3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQotewotICAgIGlmICg0ID09IGhlaWdodCkgewotICAgICAgICBjb21tb25faHpfOHRfOHg0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLCBybmRfdmFsKTsKLSAgICB9IGVsc2UgewotICAgICAgICBjb21tb25faHpfOHRfOHg4bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcm5kX3ZhbCk7Ci0gICAgfQotfQotCiBzdGF0aWMgdm9pZCBjb21tb25faHpfOHRfMTJ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewotICAgIHVpbnQ4X3QgKnNyYzFfcHRyLCAqZHN0MTsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHYxNnU4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrMDAsIHRtcDAsIHRtcDE7Ci0gICAgdjhpMTYgcm5kX3ZlYzsKKyAgICB2MTZ1OCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazAwOworICAgIHYxNnU4IHRtcDAsIHRtcDEsIHRtcDI7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOworICAgIHY4aTE2IGZpbHQsIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7CiAKLSAgICBtYXNrMDAgPSBMRF9VQigmbWNfZmlsdF9tYXNrX2FyclswXSk7Ci0gICAgbWFzazAgPSBMRF9VQigmbWNfZmlsdF9tYXNrX2FyclsxNl0pOwotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CisgICAgbWFzazAwID0gTERfVUIoJmZmX2hldmNfbWFza19hcnJbMF0pOworICAgIG1hc2swID0gTERfVUIoJmZmX2hldmNfbWFza19hcnJbMTZdKTsKIAotICAgIHNyYzFfcHRyID0gc3JjIC0gMzsKLSAgICBkc3QxID0gZHN0OwotCi0gICAgZHN0ID0gZHN0MSArIDg7Ci0gICAgc3JjID0gc3JjMV9wdHIgKyA4OworICAgIHNyYyA9IHNyYyAtIDM7CiAKICAgICAvKiByZWFycmFuZ2luZyBmaWx0ZXIgKi8KICAgICBmaWx0ID0gTERfU0goZmlsdGVyKTsKQEAgLTYyMCw1MCArNTAxLDY5IEBACiAgICAgbWFzazUgPSBtYXNrMCArIDQ7CiAgICAgbWFzazYgPSBtYXNrMCArIDY7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKKyAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgLyogOCB3aWR0aCAqLwotICAgICAgICBMRF9TQjQoc3JjMV9wdHIsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgLyogNCB3aWR0aCAqLworICAgICAgICBMRF9TQjQoc3JjICsgOCwgc3JjX3N0cmlkZSwgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIHNyYzFfcHRyICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIEhPUklaXzhUQVBfOFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swMCwgbWFzazEsIG1hc2syLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIG91dDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDEsIG91dDIsIG91dDMpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOwotICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwotICAgICAgICB0bXAwID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKLSAgICAgICAgdG1wMSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Miwgb3V0Myk7Ci0gICAgICAgIFNUOHg0X1VCKHRtcDAsIHRtcDEsIGRzdDEsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QxICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swMCwgbWFzazAwLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMDAsIG1hc2swMCwgdmVjMiwgdmVjMyk7CisgICAgICAgIERPVFBfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBvdXQwLAorICAgICAgICAgICAgICAgICAgICBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0Miwgb3V0MCwKKyAgICAgICAgICAgICAgICAgICAgIG91dDEsIG91dDIsIG91dDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBvdXQwLAorICAgICAgICAgICAgICAgICAgICAgb3V0MSwgb3V0Miwgb3V0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazMsIG1hc2szLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMywgbWFzazMsIHZlYzYsIHZlYzcpOworICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIG91dDAsCisgICAgICAgICAgICAgICAgICAgICBvdXQxLCBvdXQyLCBvdXQzKTsKIAogICAgICAgICAvKiA0IHdpZHRoICovCi0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIEhPUklaXzhUQVBfNFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrNCwgbWFzazUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s2LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Mywgb3V0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MSk7Ci0gICAgICAgIFNSQVJfSDJfU0gob3V0MCwgb3V0MSwgcm5kX3ZlYyk7Ci0gICAgICAgIFNBVF9TSDJfU0gob3V0MCwgb3V0MSwgNyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgRE9UUF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQwLCBvdXQ0LCBvdXQ1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrNCwgbWFzazQsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBvdXQ0LCBvdXQ1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrNSwgbWFzazUsIHZlYzQsIHZlYzUpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDIsIGZpbHQyLCBvdXQ0LCBvdXQ1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrNiwgbWFzazYsIHZlYzYsIHZlYzcpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNiwgdmVjNywgZmlsdDMsIGZpbHQzLCBvdXQ0LCBvdXQ1KTsKKworICAgICAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA2KTsKKyAgICAgICAgU1JBUklfSDJfU0gob3V0NCwgb3V0NSwgNik7CisgICAgICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7CisgICAgICAgIFNBVF9TSDJfU0gob3V0NCwgb3V0NSwgNyk7CiAgICAgICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwotICAgICAgICBTVDR4NF9VQih0bXAwLCB0bXAwLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICB0bXAxID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKKyAgICAgICAgdG1wMiA9IFBDS0VWX1hPUkkxMjhfVUIob3V0NCwgb3V0NSk7CisKKyAgICAgICAgU1Q4eDRfVUIodG1wMCwgdG1wMSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q0eDRfVUIodG1wMiwgdG1wMiwgMCwgMSwgMiwgMywgZHN0ICsgOCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KIAogc3RhdGljIHZvaWQgY29tbW9uX2h6Xzh0XzE2d19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2MTZ1OCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgb3V0OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CiAgICAgdjhpMTYgZmlsdCwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2OGkxNiBybmRfdmVjOwogCi0gICAgbWFzazAgPSBMRF9VQigmbWNfZmlsdF9tYXNrX2FyclswXSk7CisgICAgbWFzazAgPSBMRF9VQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgc3JjIC09IDM7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIC8qIHJlYXJyYW5naW5nIGZpbHRlciAqLwogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwpAQCAtNjczLDE1ICs1NzMsMzMgQEAKICAgICBtYXNrMiA9IG1hc2swICsgNDsKICAgICBtYXNrMyA9IG1hc2swICsgNjsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMyKTsKICAgICAgICAgTERfU0IyKHNyYyArIDgsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzMpOwotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7CisKKyAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjNCwgc3JjNik7CisgICAgICAgIExEX1NCMihzcmMgKyA4LCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM3KTsKKyAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7CisKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwogICAgICAgICBIT1JJWl84VEFQXzhXSURfNFZFQ1NfRklMVChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIG91dDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDEsIG91dDIsIG91dDMpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA2KTsKKyAgICAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKKyAgICAgICAgU1RfVUIob3V0LCBkc3QpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKKyAgICAgICAgU1RfVUIob3V0LCBkc3QpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKworICAgICAgICBIT1JJWl84VEFQXzhXSURfNFZFQ1NfRklMVChzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIG91dDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDEsIG91dDIsIG91dDMpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA2KTsKICAgICAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKICAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKICAgICAgICAgU1RfVUIob3V0LCBkc3QpOwpAQCAtNjk0LDIxICs2MTIsMTcgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX2h6Xzh0XzI0d19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2MTZ1OCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIG91dDsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5LCB2ZWMxMDsKICAgICB2MTZpOCB2ZWMxMTsKLSAgICB2OGkxNiBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3LCBvdXQ4LCBvdXQ5LCBvdXQxMDsKLSAgICB2OGkxNiBvdXQxMSwgZmlsdDsKLSAgICB2OGkxNiBybmRfdmVjOworICAgIHY4aTE2IG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDgsIG91dDksIGZpbHQ7CiAKLSAgICBtYXNrMCA9IExEX1VCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMCA9IExEX1VCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBzcmMgLT0gMzsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC03MjIsNyArNjM2LDcgQEAKICAgICBtYXNrNiA9IG1hc2swICsgMTI7CiAgICAgbWFzazcgPSBtYXNrMCArIDE0OwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMSk7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDE2OyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMyKTsKICAgICAgICAgTERfU0IyKHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMzKTsKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CkBAIC03MzYsOSArNjUwLDkgQEAKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzAsIHZlYzgpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjOSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazYsIG1hc2s2LCB2ZWMxLCB2ZWMzKTsKLSAgICAgICAgRE9UUF9TQjRfU0godmVjMCwgdmVjOCwgdmVjMiwgdmVjOSwgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIG91dDQsCi0gICAgICAgICAgICAgICAgICAgIG91dDEwLCBvdXQ2LCBvdXQxMSk7Ci0gICAgICAgIERPVFBfU0IyX1NIKHZlYzEsIHZlYzMsIGZpbHQyLCBmaWx0Miwgb3V0NSwgb3V0Nyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWM4LCB2ZWMyLCB2ZWM5LCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDgsIG91dDIsIG91dDkpOworICAgICAgICBEUEFERF9TQjJfU0godmVjMSwgdmVjMywgZmlsdDIsIGZpbHQyLCBvdXQxLCBvdXQzKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzQsIHZlYzEwKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzExKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrNSwgbWFzazUsIHZlYzUsIHZlYzcpOwpAQCAtNzQ5LDEzICs2NjMsMTAgQEAKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMywgbWFzazMsIHZlYzYsIHZlYzExKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrNywgbWFzazcsIHZlYzUsIHZlYzcpOwogICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjMTAsIHZlYzYsIHZlYzExLCBmaWx0MywgZmlsdDMsIGZpbHQzLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIG91dDQsIG91dDEwLCBvdXQ2LCBvdXQxMSk7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWM1LCB2ZWM3LCBmaWx0MywgZmlsdDMsIG91dDUsIG91dDcpOwotICAgICAgICBBRERTX1NINF9TSChvdXQwLCBvdXQ0LCBvdXQ4LCBvdXQxMCwgb3V0Miwgb3V0Niwgb3V0OSwgb3V0MTEsIG91dDAsCi0gICAgICAgICAgICAgICAgICAgIG91dDgsIG91dDIsIG91dDkpOwotICAgICAgICBBRERTX1NIMl9TSChvdXQxLCBvdXQ1LCBvdXQzLCBvdXQ3LCBvdXQxLCBvdXQzKTsKLSAgICAgICAgU1JBUl9INF9TSChvdXQwLCBvdXQ4LCBvdXQyLCBvdXQ5LCBybmRfdmVjKTsKLSAgICAgICAgU1JBUl9IMl9TSChvdXQxLCBvdXQzLCBybmRfdmVjKTsKKyAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDgsIG91dDIsIG91dDkpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNSwgdmVjNywgZmlsdDMsIGZpbHQzLCBvdXQxLCBvdXQzKTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MCwgb3V0OCwgb3V0Miwgb3V0OSwgNik7CisgICAgICAgIFNSQVJJX0gyX1NIKG91dDEsIG91dDMsIDYpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDgsIG91dDIsIG91dDksIDcpOwogICAgICAgICBTQVRfU0gyX1NIKG91dDEsIG91dDMsIDcpOwogICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDgsIG91dDkpOwpAQCAtNzcxLDE4ICs2ODIsMTYgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX2h6Xzh0XzMyd19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2MTZ1OCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgb3V0OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2aTggZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CiAgICAgdjhpMTYgZmlsdCwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2OGkxNiBybmRfdmVjOwogCi0gICAgbWFzazAgPSBMRF9VQigmbWNfZmlsdF9tYXNrX2FyclswXSk7CisgICAgbWFzazAgPSBMRF9VQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgc3JjIC09IDM7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIC8qIHJlYXJyYW5naW5nIGZpbHRlciAqLwogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwpAQCAtNzk0LDM0ICs3MDMsMzUgQEAKIAogICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgewogICAgICAgICBzcmMwID0gTERfU0Ioc3JjKTsKKyAgICAgICAgc3JjMSA9IExEX1NCKHNyYyArIDgpOwogICAgICAgICBzcmMyID0gTERfU0Ioc3JjICsgMTYpOwogICAgICAgICBzcmMzID0gTERfU0Ioc3JjICsgMjQpOwotICAgICAgICBzcmMxID0gX19tc2Ffc2xkaV9iKHNyYzIsIHNyYzAsIDgpOwogICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisKKyAgICAgICAgc3JjNCA9IExEX1NCKHNyYyk7CisgICAgICAgIHNyYzUgPSBMRF9TQihzcmMgKyA4KTsKKyAgICAgICAgc3JjNiA9IExEX1NCKHNyYyArIDE2KTsKKyAgICAgICAgc3JjNyA9IExEX1NCKHNyYyArIDI0KTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworCiAgICAgICAgIEhPUklaXzhUQVBfOFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2szLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Mywgb3V0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MSwgb3V0Miwgb3V0Myk7Ci0gICAgICAgIFNSQVJfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgcm5kX3ZlYyk7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDYpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwogCi0gICAgICAgIHNyYzAgPSBMRF9TQihzcmMpOwotICAgICAgICBzcmMyID0gTERfU0Ioc3JjICsgMTYpOwotICAgICAgICBzcmMzID0gTERfU0Ioc3JjICsgMjQpOwotICAgICAgICBzcmMxID0gX19tc2Ffc2xkaV9iKHNyYzIsIHNyYzAsIDgpOwotICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLQogICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwogICAgICAgICBTVF9VQihvdXQsIGRzdCk7CiAgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Miwgb3V0Myk7CiAgICAgICAgIFNUX1VCKG91dCwgZHN0ICsgMTYpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKIAotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgSE9SSVpfOFRBUF84V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwKKyAgICAgICAgSE9SSVpfOFRBUF84V0lEXzRWRUNTX0ZJTFQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBvdXQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQxLCBvdXQyLCBvdXQzKTsKLSAgICAgICAgU1JBUl9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBybmRfdmVjKTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNik7CiAgICAgICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7CiAgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CiAgICAgICAgIFNUX1VCKG91dCwgZHN0KTsKQEAgLTgzMywxOCArNzQzLDE2IEBACiAKIHN0YXRpYyB2b2lkIGNvbW1vbl9oel84dF80OHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIHZlYzAsIHZlYzEsIHZlYzI7CisgICAgdjE2aTggc3JjNDsKICAgICB2MTZ1OCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIG91dDsKLSAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2OwotICAgIHY4aTE2IHJuZF92ZWM7CisgICAgdjhpMTYgZmlsdCwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKIAotICAgIG1hc2swID0gTERfVUIoJm1jX2ZpbHRfbWFza19hcnJbMF0pOworICAgIG1hc2swID0gTERfVUIoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHNyYyAtPSAzOwotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CiAKICAgICAvKiByZWFycmFuZ2luZyBmaWx0ZXIgKi8KICAgICBmaWx0ID0gTERfU0goZmlsdGVyKTsKQEAgLTg1OCwxMSArNzY2LDE3IEBACiAgICAgbWFzazYgPSBtYXNrMCArIDEyOwogICAgIG1hc2s3ID0gbWFzazAgKyAxNDsKIAotICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQ7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCMyhzcmMsIDE2LCBzcmMwLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjMSA9IF9fbXNhX3NsZGlfYihzcmMyLCBzcmMwLCA4KTsKKyAgICBmb3IgKGxvb3BfY250ID0gNjQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIHNyYzAgPSBMRF9TQihzcmMpOworICAgICAgICBzcmMxID0gTERfU0Ioc3JjICsgOCk7CisgICAgICAgIHNyYzIgPSBMRF9TQihzcmMgKyAxNik7CisgICAgICAgIHNyYzMgPSBMRF9TQihzcmMgKyAzMik7CisgICAgICAgIHNyYzQgPSBMRF9TQihzcmMgKyA0MCk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwogCiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBzcmM0ID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBzcmM0LCAxMjgpOworCiAgICAgICAgIFZTSEZfQjNfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2swLCBtYXNrMCwKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyKTsKICAgICAgICAgRE9UUF9TQjNfU0godmVjMCwgdmVjMSwgdmVjMiwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgb3V0MCwgb3V0MSwgb3V0Mik7CkBAIC04NzIsNDQgKzc4Niw0MiBAQAogICAgICAgICBvdXQyID0gX19tc2FfZHBhZGRfc19oKG91dDIsIHZlYzIsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CM19TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBzcmMyLCBzcmMyLCBtYXNrMiwgbWFzazIsIG1hc2syLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIpOwotICAgICAgICBET1RQX1NCM19TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBvdXQzLCBvdXQ0LCBvdXQ1KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQyLCBmaWx0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgIG91dDIgPSBfX21zYV9kcGFkZF9zX2gob3V0MiwgdmVjMiwgZmlsdDIpOworCiAgICAgICAgIFZTSEZfQjNfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazMsIG1hc2szLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyKTsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQzLCBmaWx0Mywgb3V0Mywgb3V0NCk7Ci0gICAgICAgIG91dDUgPSBfX21zYV9kcGFkZF9zX2gob3V0NSwgdmVjMiwgZmlsdDMpOwotICAgICAgICBBRERTX1NIMl9TSChvdXQwLCBvdXQzLCBvdXQxLCBvdXQ0LCBvdXQwLCBvdXQxKTsKLSAgICAgICAgb3V0MiA9IF9fbXNhX2FkZHNfc19oKG91dDIsIG91dDUpOwotICAgICAgICBTUkFSX0gyX1NIKG91dDAsIG91dDEsIHJuZF92ZWMpOwotICAgICAgICBvdXQ2ID0gX19tc2Ffc3Jhcl9oKG91dDIsIHJuZF92ZWMpOwotICAgICAgICBTQVRfU0gzX1NIKG91dDAsIG91dDEsIG91dDYsIDcpOworICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDMsIGZpbHQzLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgb3V0MiA9IF9fbXNhX2RwYWRkX3NfaChvdXQyLCB2ZWMyLCBmaWx0Myk7CisKKyAgICAgICAgU1JBUklfSDJfU0gob3V0MCwgb3V0MSwgNik7CisgICAgICAgIG91dDMgPSBfX21zYV9zcmFyaV9oKG91dDIsIDYpOworICAgICAgICBTQVRfU0gzX1NIKG91dDAsIG91dDEsIG91dDMsIDcpOwogICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwogICAgICAgICBTVF9VQihvdXQsIGRzdCk7CiAKLSAgICAgICAgc3JjMSA9IExEX1NCKHNyYyArIDQwKTsKLSAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0gICAgICAgIHNyYzEgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzEsIDEyOCk7Ci0KLSAgICAgICAgVlNIRl9CM19TQihzcmMyLCBzcmMzLCBzcmMzLCBzcmMzLCBzcmMxLCBzcmMxLCBtYXNrNCwgbWFzazAsIG1hc2swLAorICAgICAgICBWU0hGX0IzX1NCKHNyYzIsIHNyYzMsIHNyYzMsIHNyYzMsIHNyYzQsIHNyYzQsIG1hc2s0LCBtYXNrMCwgbWFzazAsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMik7CiAgICAgICAgIERPVFBfU0IzX1NIKHZlYzAsIHZlYzEsIHZlYzIsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIG91dDAsIG91dDEsIG91dDIpOwotICAgICAgICBWU0hGX0IzX1NCKHNyYzIsIHNyYzMsIHNyYzMsIHNyYzMsIHNyYzEsIHNyYzEsIG1hc2s1LCBtYXNrMSwgbWFzazEsCisgICAgICAgIFZTSEZfQjNfU0Ioc3JjMiwgc3JjMywgc3JjMywgc3JjMywgc3JjNCwgc3JjNCwgbWFzazUsIG1hc2sxLCBtYXNrMSwKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyKTsKICAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQxLCBmaWx0MSwgb3V0MCwgb3V0MSk7CiAgICAgICAgIG91dDIgPSBfX21zYV9kcGFkZF9zX2gob3V0MiwgdmVjMiwgZmlsdDEpOwotICAgICAgICBWU0hGX0IzX1NCKHNyYzIsIHNyYzMsIHNyYzMsIHNyYzMsIHNyYzEsIHNyYzEsIG1hc2s2LCBtYXNrMiwgbWFzazIsCisgICAgICAgIFZTSEZfQjNfU0Ioc3JjMiwgc3JjMywgc3JjMywgc3JjMywgc3JjNCwgc3JjNCwgbWFzazYsIG1hc2syLCBtYXNrMiwKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyKTsKLSAgICAgICAgRE9UUF9TQjNfU0godmVjMCwgdmVjMSwgdmVjMiwgZmlsdDIsIGZpbHQyLCBmaWx0Miwgb3V0Mywgb3V0NCwgb3V0NSk7Ci0gICAgICAgIFZTSEZfQjNfU0Ioc3JjMiwgc3JjMywgc3JjMywgc3JjMywgc3JjMSwgc3JjMSwgbWFzazcsIG1hc2szLCBtYXNrMywKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQyLCBmaWx0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgIG91dDIgPSBfX21zYV9kcGFkZF9zX2gob3V0MiwgdmVjMiwgZmlsdDIpOworICAgICAgICBWU0hGX0IzX1NCKHNyYzIsIHNyYzMsIHNyYzMsIHNyYzMsIHNyYzQsIHNyYzQsIG1hc2s3LCBtYXNrMywgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMik7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MywgZmlsdDMsIG91dDMsIG91dDQpOwotICAgICAgICBvdXQ1ID0gX19tc2FfZHBhZGRfc19oKG91dDUsIHZlYzIsIGZpbHQzKTsKLSAgICAgICAgQUREU19TSDJfU0gob3V0MCwgb3V0Mywgb3V0MSwgb3V0NCwgb3V0Mywgb3V0NCk7Ci0gICAgICAgIG91dDUgPSBfX21zYV9hZGRzX3NfaChvdXQyLCBvdXQ1KTsKLSAgICAgICAgU1JBUl9IM19TSChvdXQzLCBvdXQ0LCBvdXQ1LCBybmRfdmVjKTsKLSAgICAgICAgU0FUX1NIM19TSChvdXQzLCBvdXQ0LCBvdXQ1LCA3KTsKLSAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQ2LCBvdXQzKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQzLCBmaWx0Mywgb3V0MCwgb3V0MSk7CisgICAgICAgIG91dDIgPSBfX21zYV9kcGFkZF9zX2gob3V0MiwgdmVjMiwgZmlsdDMpOworCisgICAgICAgIFNSQVJJX0gyX1NIKG91dDAsIG91dDEsIDYpOworICAgICAgICBvdXQyID0gX19tc2Ffc3JhcmlfaChvdXQyLCA2KTsKKyAgICAgICAgU0FUX1NIM19TSChvdXQwLCBvdXQxLCBvdXQyLCA3KTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQzLCBvdXQwKTsKICAgICAgICAgU1RfVUIob3V0LCBkc3QgKyAxNik7Ci0gICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0NCwgb3V0NSk7CisgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MSwgb3V0Mik7CiAgICAgICAgIFNUX1VCKG91dCwgZHN0ICsgMzIpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICB9CkBAIC05MTcsMTggKzgyOSwxNyBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfOHRfNjR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewogICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CiAgICAgdjE2dTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIG91dDsKLSAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHY4aTE2IHJuZF92ZWM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOworICAgIHY4aTE2IHJlczAsIHJlczEsIHJlczIsIHJlczMsIGZpbHQ7CiAKLSAgICBtYXNrMCA9IExEX1VCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMCA9IExEX1VCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBzcmMgLT0gMzsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC05MzksMzcgKzg1MCw1NyBAQAogICAgIG1hc2szID0gbWFzazAgKyA2OwogCiAgICAgZm9yIChsb29wX2NudCA9IGhlaWdodDsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgc3JjMCA9IExEX1NCKHNyYyk7Ci0gICAgICAgIHNyYzIgPSBMRF9TQihzcmMgKyAxNik7Ci0gICAgICAgIHNyYzMgPSBMRF9TQihzcmMgKyAyNCk7Ci0gICAgICAgIHNyYzEgPSBfX21zYV9zbGRpX2Ioc3JjMiwgc3JjMCwgOCk7Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIEhPUklaXzhUQVBfOFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazIsIG1hc2szLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7Ci0gICAgICAgIFNSQVJfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgcm5kX3ZlYyk7Ci0gICAgICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7Ci0gICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7Ci0gICAgICAgIFNUX1VCKG91dCwgZHN0KTsKLSAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKLSAgICAgICAgU1RfVUIob3V0LCBkc3QgKyAxNik7Ci0KLSAgICAgICAgc3JjMCA9IExEX1NCKHNyYyArIDMyKTsKLSAgICAgICAgc3JjMiA9IExEX1NCKHNyYyArIDQ4KTsKLSAgICAgICAgc3JjMyA9IExEX1NCKHNyYyArIDU2KTsKLSAgICAgICAgc3JjMSA9IF9fbXNhX3NsZGlfYihzcmMyLCBzcmMwLCA4KTsKKyAgICAgICAgTERfU0I4KHNyYywgOCwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwogCi0gICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBIT1JJWl84VEFQXzhXSURfNFZFQ1NfRklMVChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2syLCBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOwotICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwotICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRE9UUF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIHJlczAsCisgICAgICAgICAgICAgICAgICAgIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2syLCBtYXNrMiwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCByZXMwLAorICAgICAgICAgICAgICAgICAgICAgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIHJlczAsCisgICAgICAgICAgICAgICAgICAgICByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMywgbWFzazMsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2szLCBtYXNrMywgdmVjNiwgdmVjNyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MywgZmlsdDMsIGZpbHQzLCBmaWx0MywgcmVzMCwKKyAgICAgICAgICAgICAgICAgICAgIHJlczEsIHJlczIsIHJlczMpOworCisgICAgICAgIFNSQVJJX0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDYpOworICAgICAgICBTQVRfU0g0X1NIKHJlczAsIHJlczEsIHJlczIsIHJlczMsIDcpOworICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczAsIHJlczEpOworICAgICAgICBTVF9VQihvdXQsIGRzdCk7CisgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIocmVzMiwgcmVzMyk7CisgICAgICAgIFNUX1VCKG91dCwgZHN0ICsgMTYpOworCisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2swLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazAsIHZlYzIsIHZlYzMpOworICAgICAgICBET1RQX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgcmVzMCwKKyAgICAgICAgICAgICAgICAgICAgcmVzMSwgcmVzMiwgcmVzMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNSwgc3JjNSwgbWFzazIsIG1hc2syLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMiwgbWFzazIsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIHJlczAsCisgICAgICAgICAgICAgICAgICAgICByZXMxLCByZXMyLCByZXMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMSwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2sxLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgcmVzMCwKKyAgICAgICAgICAgICAgICAgICAgIHJlczEsIHJlczIsIHJlczMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2szLCBtYXNrMywgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazMsIG1hc2szLCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGZpbHQzLCByZXMwLAorICAgICAgICAgICAgICAgICAgICAgcmVzMSwgcmVzMiwgcmVzMyk7CisKKyAgICAgICAgU1JBUklfSDRfU0gocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNik7CisgICAgICAgIFNBVF9TSDRfU0gocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgNyk7CisgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIocmVzMCwgcmVzMSk7CiAgICAgICAgIFNUX1VCKG91dCwgZHN0ICsgMzIpOwotICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDIsIG91dDMpOworICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKHJlczIsIHJlczMpOwogICAgICAgICBTVF9VQihvdXQsIGRzdCArIDQ4KTsKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CiAgICAgfQpAQCAtOTc3LDIwICs5MDgsMTkgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX3Z0Xzh0XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCBzcmMxMSwgc3JjMTIsIHNyYzEzLCBzcmMxNDsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBzcmMyMV9yLCBzcmM0M19yOwogICAgIHYxNmk4IHNyYzY1X3IsIHNyYzg3X3IsIHNyYzEwOV9yLCBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2OworICAgIHYxNmk4IHNyYzExMTBfciwgc3JjMTIxMV9yLCBzcmMxMzEyX3IsIHNyYzE0MTNfciwgc3JjMTIxMTExMTAsIHNyYzE0MTMxMzEyOwogICAgIHYxNmk4IHNyYzEwOTk4LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2MTZ1OCBvdXQ7Ci0gICAgdjhpMTYgZmlsdCwgb3V0MTAsIG91dDMyOwotICAgIHY4aTE2IHJuZF92ZWM7CisgICAgdjhpMTYgZmlsdCwgb3V0MTAsIG91dDMyLCBvdXQ1NCwgb3V0NzY7CiAKICAgICBzcmMgLT0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0g0X1NCKGZpbHQsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKQEAgLTEwMDUsMzUgKzkzNSw1MSBAQAogICAgICAgICAgICAgICAgc3JjNDMzMiwgc3JjNjU1NCk7CiAgICAgWE9SSV9CM18xMjhfU0Ioc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKKyAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAzKTsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQpOworICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKIAogICAgICAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM3Nl9yLAogICAgICAgICAgICAgICAgICAgIHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yKTsKKyAgICAgICAgSUxWUl9CNF9TQihzcmMxMSwgc3JjMTAsIHNyYzEyLCBzcmMxMSwgc3JjMTMsIHNyYzEyLCBzcmMxNCwgc3JjMTMsCisgICAgICAgICAgICAgICAgICAgc3JjMTExMF9yLCBzcmMxMjExX3IsIHNyYzEzMTJfciwgc3JjMTQxM19yKTsKICAgICAgICAgSUxWUl9EMl9TQihzcmM4N19yLCBzcmM3Nl9yLCBzcmMxMDlfciwgc3JjOThfciwgc3JjODc3Niwgc3JjMTA5OTgpOworICAgICAgICBJTFZSX0QyX1NCKHNyYzEyMTFfciwgc3JjMTExMF9yLCBzcmMxNDEzX3IsIHNyYzEzMTJfciwKKyAgICAgICAgICAgICAgICAgICBzcmMxMjExMTExMCwgc3JjMTQxMzEzMTIpOwogICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM4Nzc2LCBzcmMxMDk5OCk7Ci0gICAgICAgIG91dDEwID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwotICAgICAgICBvdXQzMiA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3Niwgc3JjMTA5OTgsIGZpbHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgIFNSQVJfSDJfU0gob3V0MTAsIG91dDMyLCBybmRfdmVjKTsKKyAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMTIxMTExMTAsIHNyYzE0MTMxMzEyKTsKKworICAgICAgICBET1RQX1NCMl9TSChzcmMyMTEwLCBzcmM0MzMyLCBmaWx0MCwgZmlsdDAsIG91dDEwLCBvdXQzMik7CisgICAgICAgIERPVFBfU0IyX1NIKHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MCwgb3V0NTQsIG91dDc2KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQxLCBmaWx0MSwgb3V0MTAsIG91dDMyKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHNyYzg3NzYsIHNyYzEwOTk4LCBmaWx0MSwgZmlsdDEsIG91dDU0LCBvdXQ3Nik7CisgICAgICAgIERQQUREX1NCMl9TSChzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MiwgZmlsdDIsIG91dDEwLCBvdXQzMik7CisgICAgICAgIERQQUREX1NCMl9TSChzcmMxMDk5OCwgc3JjMTIxMTExMTAsIGZpbHQyLCBmaWx0Miwgb3V0NTQsIG91dDc2KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHNyYzg3NzYsIHNyYzEwOTk4LCBmaWx0MywgZmlsdDMsIG91dDEwLCBvdXQzMik7CisgICAgICAgIERQQUREX1NCMl9TSChzcmMxMjExMTExMCwgc3JjMTQxMzEzMTIsIGZpbHQzLCBmaWx0Mywgb3V0NTQsIG91dDc2KTsKKyAgICAgICAgU1JBUklfSDJfU0gob3V0MTAsIG91dDMyLCA2KTsKKyAgICAgICAgU1JBUklfSDJfU0gob3V0NTQsIG91dDc2LCA2KTsKICAgICAgICAgU0FUX1NIMl9TSChvdXQxMCwgb3V0MzIsIDcpOwotICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDEwLCBvdXQzMik7Ci0gICAgICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTQVRfU0gyX1NIKG91dDU0LCBvdXQ3NiwgNyk7CisgICAgICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDEwLCBvdXQzMik7CisgICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDU0LCBvdXQ3Nik7CisgICAgICAgIFNUNHg0X1VCKG91dDAsIG91dDAsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgICAgICBTVDR4NF9VQihvdXQxLCBvdXQxLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKIAotICAgICAgICBzcmMyMTEwID0gc3JjNjU1NDsKLSAgICAgICAgc3JjNDMzMiA9IHNyYzg3NzY7Ci0gICAgICAgIHNyYzY1NTQgPSBzcmMxMDk5ODsKLSAgICAgICAgc3JjNiA9IHNyYzEwOworICAgICAgICBzcmMyMTEwID0gc3JjMTA5OTg7CisgICAgICAgIHNyYzQzMzIgPSBzcmMxMjExMTExMDsKKyAgICAgICAgc3JjNjU1NCA9IHNyYzE0MTMxMzEyOworICAgICAgICBzcmM2ID0gc3JjMTQ7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfOHRfOHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKQEAgLTEwNDEsMTAgKzk4Nyw4IEBACiAgICAgdjE2aTggc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwogICAgIHYxNnU4IHRtcDAsIHRtcDE7CiAgICAgdjhpMTYgZmlsdCwgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yOwotICAgIHY4aTE2IHJuZF92ZWM7CiAKICAgICBzcmMgLT0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0g0X1NCKGZpbHQsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKQEAgLTEwNjMsMTUgKzEwMDcsMTUgQEAKIAogICAgICAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM3Nl9yLAogICAgICAgICAgICAgICAgICAgIHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yKTsKLSAgICAgICAgb3V0MF9yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgb3V0MV9yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgb3V0Ml9yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgb3V0M19yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgIFNSQVJfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBybmRfdmVjKTsKKyAgICAgICAgRE9UUF9TQjRfU0goc3JjMTBfciwgc3JjMjFfciwgc3JjMzJfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQwLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgZmlsdDAsIG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcik7CisgICAgICAgIERQQUREX1NCNF9TSChzcmMzMl9yLCBzcmM0M19yLCBzcmM1NF9yLCBzcmM2NV9yLCBmaWx0MSwgZmlsdDEsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcik7CisgICAgICAgIERQQUREX1NCNF9TSChzcmM1NF9yLCBzcmM2NV9yLCBzcmM3Nl9yLCBzcmM4N19yLCBmaWx0MiwgZmlsdDIsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcik7CisgICAgICAgIERQQUREX1NCNF9TSChzcmM3Nl9yLCBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfciwgZmlsdDMsIGZpbHQzLCBmaWx0MywKKyAgICAgICAgICAgICAgICAgICAgIGZpbHQzLCBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDYpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7CiAgICAgICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDBfciwgb3V0MV9yKTsKICAgICAgICAgdG1wMSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Ml9yLCBvdXQzX3IpOwpAQCAtMTA5MCw2NSArMTAzNCw4MyBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfOHRfMTJ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewotICAgIGludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdWludDMyX3Qgb3V0Miwgb3V0MzsKICAgICB1aW50NjRfdCBvdXQwLCBvdXQxOwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHJlczAsIHJlczE7Ci0gICAgdjE2aTggcmVzMiwgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKLSAgICB2OGkxNiB2ZWMwMSwgdmVjMjMsIHZlYzQ1LCB2ZWM2NywgdG1wMCwgdG1wMSwgdG1wMjsKLSAgICB2OGkxNiBmaWx0LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2OGkxNiBybmRfdmVjOwotICAgIHY0aTMyIG1hc2sgPSB7IDIsIDYsIDIsIDYgfTsKKyAgICB2MTZ1OCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOworICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3IsIHNyYzIxX3IsIHNyYzQzX3I7CisgICAgdjE2aTggc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3IsIHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2w7CisgICAgdjE2aTggc3JjOThfbCwgc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgc3JjMTA5X2w7CisgICAgdjhpMTYgZmlsdCwgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2w7CiAKICAgICBzcmMgLT0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCi0gICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyX3kgKi8KICAgICBmaWx0ID0gTERfU0goZmlsdGVyKTsKLSAgICBTUExBVElfSDRfU0goZmlsdCwgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgIFNQTEFUSV9INF9TQihmaWx0LCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKICAgICBMRF9TQjcoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKICAgICBzcmMgKz0gKDcgKiBzcmNfc3RyaWRlKTsKIAogICAgIFhPUklfQjdfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwogCi0gICAgLyogNCB3aWR0aCAqLwotICAgIFZTSEZfVzJfU0Ioc3JjMCwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzaywgbWFzaywgdmVjMCwgdmVjMSk7Ci0gICAgVlNIRl9XMl9TQihzcmMyLCBzcmMzLCBzcmMzLCBzcmM0LCBtYXNrLCBtYXNrLCB2ZWMyLCB2ZWMzKTsKLSAgICBWU0hGX1cyX1NCKHNyYzQsIHNyYzUsIHNyYzUsIHNyYzYsIG1hc2ssIG1hc2ssIHZlYzQsIHZlYzUpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjNSwgc3JjNCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMzJfciwKKyAgICAgICAgICAgICAgIHNyYzU0X3IsIHNyYzIxX3IpOworICAgIElMVlJfQjJfU0Ioc3JjNCwgc3JjMywgc3JjNiwgc3JjNSwgc3JjNDNfciwgc3JjNjVfcik7CisgICAgSUxWTF9CNF9TQihzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmM1LCBzcmM0LCBzcmMyLCBzcmMxLCBzcmMxMF9sLCBzcmMzMl9sLAorICAgICAgICAgICAgICAgc3JjNTRfbCwgc3JjMjFfbCk7CisgICAgSUxWTF9CMl9TQihzcmM0LCBzcmMzLCBzcmM2LCBzcmM1LCBzcmM0M19sLCBzcmM2NV9sKTsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4KTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNywgc3JjOCk7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CiAKLSAgICAgICAgSUxWUl9CNF9TSChzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmM1LCBzcmM0LCBzcmM3LCBzcmM2LAotICAgICAgICAgICAgICAgICAgIHZlYzAxLCB2ZWMyMywgdmVjNDUsIHZlYzY3KTsKLSAgICAgICAgdG1wMCA9IEZJTFRfOFRBUF9EUEFERF9TX0godmVjMDEsIHZlYzIzLCB2ZWM0NSwgdmVjNjcsIGZpbHQwLCBmaWx0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgSUxWUl9CNF9TSChzcmMyLCBzcmMxLCBzcmM0LCBzcmMzLCBzcmM2LCBzcmM1LCBzcmM4LCBzcmM3LCB2ZWMwMSwgdmVjMjMsCi0gICAgICAgICAgICAgICAgICAgdmVjNDUsIHZlYzY3KTsKLSAgICAgICAgdG1wMSA9IEZJTFRfOFRBUF9EUEFERF9TX0godmVjMDEsIHZlYzIzLCB2ZWM0NSwgdmVjNjcsIGZpbHQwLCBmaWx0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgSUxWUl9CNF9TQihzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM5LCBzcmM4LCBzcmMxMCwgc3JjOSwgc3JjNzZfciwKKyAgICAgICAgICAgICAgICAgICBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfcik7CisgICAgICAgIElMVkxfQjRfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzc2X2wsCisgICAgICAgICAgICAgICAgICAgc3JjODdfbCwgc3JjOThfbCwgc3JjMTA5X2wpOworICAgICAgICBvdXQwX3IgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgIG91dDFfciA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgb3V0Ml9yID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjOThfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBvdXQzX3IgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBvdXQwX2wgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgIG91dDFfbCA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgb3V0Ml9sID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwgc3JjOThfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBvdXQzX2wgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLCBzcmMxMDlfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDYpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwX2wsIG91dDFfbCwgb3V0Ml9sLCBvdXQzX2wsIDYpOworICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7CisgICAgICAgIFNBVF9TSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA3KTsKKyAgICAgICAgUENLRVZfQjRfVUIob3V0MF9sLCBvdXQwX3IsIG91dDFfbCwgb3V0MV9yLCBvdXQyX2wsIG91dDJfciwgb3V0M19sLAorICAgICAgICAgICAgICAgICAgICBvdXQzX3IsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBYT1JJX0I0XzEyOF9VQih0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKIAotICAgICAgICAvKiA0IHdpZHRoICovCi0gICAgICAgIFZTSEZfVzJfU0Ioc3JjNiwgc3JjNywgc3JjNywgc3JjOCwgbWFzaywgbWFzaywgdmVjNiwgdmVjNyk7Ci0gICAgICAgIElMVlJfQjRfU0godmVjMSwgdmVjMCwgdmVjMywgdmVjMiwgdmVjNSwgdmVjNCwgdmVjNywgdmVjNiwgdmVjMDEsIHZlYzIzLAotICAgICAgICAgICAgICAgICAgIHZlYzQ1LCB2ZWM2Nyk7Ci0gICAgICAgIHRtcDIgPSBGSUxUXzhUQVBfRFBBRERfU19IKHZlYzAxLCB2ZWMyMywgdmVjNDUsIHZlYzY3LCBmaWx0MCwgZmlsdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgIFNSQVJfSDNfU0godG1wMCwgdG1wMSwgdG1wMiwgcm5kX3ZlYyk7Ci0gICAgICAgIFNBVF9TSDNfU0godG1wMCwgdG1wMSwgdG1wMiwgNyk7Ci0gICAgICAgIFBDS0VWX0IzX1NCKHRtcDAsIHRtcDAsIHRtcDEsIHRtcDEsIHRtcDIsIHRtcDIsIHJlczAsIHJlczEsIHJlczIpOwotICAgICAgICBYT1JJX0IzXzEyOF9TQihyZXMwLCByZXMxLCByZXMyKTsKLQotICAgICAgICBvdXQwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSByZXMwLCAwKTsKLSAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgcmVzMSwgMCk7Ci0gICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIHJlczIsIDApOwotICAgICAgICBvdXQzID0gX19tc2FfY29weV91X3coKHY0aTMyKSByZXMyLCAxKTsKKyAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgdG1wMCwgMCk7CisgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHRtcDEsIDApOworICAgICAgICBvdXQyID0gX19tc2FfY29weV91X3coKHY0aTMyKSB0bXAwLCAyKTsKKyAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgdG1wMSwgMik7CisgICAgICAgIFNEKG91dDAsIGRzdCk7CisgICAgICAgIFNXKG91dDIsIChkc3QgKyA4KSk7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTRChvdXQxLCBkc3QpOworICAgICAgICBTVyhvdXQzLCAoZHN0ICsgOCkpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgdG1wMiwgMCk7CisgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHRtcDMsIDApOworICAgICAgICBvdXQyID0gX19tc2FfY29weV91X3coKHY0aTMyKSB0bXAyLCAyKTsKKyAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgdG1wMywgMik7CiAgICAgICAgIFNEKG91dDAsIGRzdCk7CiAgICAgICAgIFNXKG91dDIsIChkc3QgKyA4KSk7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwpAQCAtMTE1NiwyNiArMTExOCwyNSBAQAogICAgICAgICBTVyhvdXQzLCAoZHN0ICsgOCkpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKIAotICAgICAgICBzcmMwID0gc3JjMjsKLSAgICAgICAgc3JjMSA9IHNyYzM7Ci0gICAgICAgIHNyYzIgPSBzcmM0OwotICAgICAgICBzcmMzID0gc3JjNTsKLSAgICAgICAgc3JjNCA9IHNyYzY7Ci0gICAgICAgIHNyYzUgPSBzcmM3OwotICAgICAgICBzcmM2ID0gc3JjODsKLSAgICAgICAgdmVjMCA9IHZlYzI7Ci0gICAgICAgIHZlYzEgPSB2ZWMzOwotICAgICAgICB2ZWMyID0gdmVjNDsKLSAgICAgICAgdmVjMyA9IHZlYzU7Ci0gICAgICAgIHZlYzQgPSB2ZWM2OwotICAgICAgICB2ZWM1ID0gdmVjNzsKKyAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7CisgICAgICAgIHNyYzMyX3IgPSBzcmM3Nl9yOworICAgICAgICBzcmM1NF9yID0gc3JjOThfcjsKKyAgICAgICAgc3JjMjFfciA9IHNyYzY1X3I7CisgICAgICAgIHNyYzQzX3IgPSBzcmM4N19yOworICAgICAgICBzcmM2NV9yID0gc3JjMTA5X3I7CisgICAgICAgIHNyYzEwX2wgPSBzcmM1NF9sOworICAgICAgICBzcmMzMl9sID0gc3JjNzZfbDsKKyAgICAgICAgc3JjNTRfbCA9IHNyYzk4X2w7CisgICAgICAgIHNyYzIxX2wgPSBzcmM2NV9sOworICAgICAgICBzcmM0M19sID0gc3JjODdfbDsKKyAgICAgICAgc3JjNjVfbCA9IHNyYzEwOV9sOworICAgICAgICBzcmM2ID0gc3JjMTA7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfOHRfMTZ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwpAQCAtMTE4NSwxMCArMTE0Niw4IEBACiAgICAgdjE2aTggc3JjOThfbCwgc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgc3JjMTA5X2w7CiAgICAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBmaWx0LCBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbDsKLSAgICB2OGkxNiBybmRfdmVjOwogCiAgICAgc3JjIC09ICgzICogc3JjX3N0cmlkZSk7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9INF9TQihmaWx0LCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CkBAIC0xMjEyLDI0ICsxMTcxLDI0IEBACiAgICAgICAgICAgICAgICAgICAgc3JjODdfciwgc3JjOThfciwgc3JjMTA5X3IpOwogICAgICAgICBJTFZMX0I0X1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM3Nl9sLAogICAgICAgICAgICAgICAgICAgIHNyYzg3X2wsIHNyYzk4X2wsIHNyYzEwOV9sKTsKLSAgICAgICAgb3V0MF9yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgb3V0MV9yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgb3V0Ml9yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgb3V0M19yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgIG91dDBfbCA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwgZmlsdDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgIG91dDFfbCA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgZmlsdDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgIG91dDJfbCA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwgc3JjOThfbCwgZmlsdDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgIG91dDNfbCA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgc3JjMTA5X2wsIGZpbHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgcm5kX3ZlYyk7Ci0gICAgICAgIFNSQVJfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCBybmRfdmVjKTsKKyAgICAgICAgb3V0MF9yID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBvdXQxX3IgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgIG91dDJfciA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgb3V0M19yID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgb3V0MF9sID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBvdXQxX2wgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgIG91dDJfbCA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIHNyYzk4X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgb3V0M19sID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgc3JjMTA5X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA2KTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA2KTsKICAgICAgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCwgNyk7CiAgICAgICAgIFBDS0VWX0I0X1VCKG91dDBfbCwgb3V0MF9yLCBvdXQxX2wsIG91dDFfciwgb3V0Ml9sLCBvdXQyX3IsIG91dDNfbCwKQEAgLTEyNTcsNyArMTIxNiw3IEBACiBzdGF0aWMgdm9pZCBjb21tb25fdnRfOHRfMTZ3X211bHRfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwsIGludDMyX3Qgd2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgpCiB7CiAgICAgdWludDhfdCAqc3JjX3RtcDsKICAgICB1aW50OF90ICpkc3RfdG1wOwpAQCAtMTI2OSwxMCArMTIyOCw4IEBACiAgICAgdjE2aTggc3JjOThfbCwgc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgc3JjMTA5X2w7CiAgICAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBmaWx0LCBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbDsKLSAgICB2OGkxNiBybmRfdmVjOwogCiAgICAgc3JjIC09ICgzICogc3JjX3N0cmlkZSk7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9INF9TQihmaWx0LCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CkBAIC0xMjk5LDI0ICsxMjU2LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yKTsKICAgICAgICAgICAgIElMVkxfQjRfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzc2X2wsCiAgICAgICAgICAgICAgICAgICAgICAgIHNyYzg3X2wsIHNyYzk4X2wsIHNyYzEwOV9sKTsKLSAgICAgICAgICAgIG91dDBfciA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwotICAgICAgICAgICAgb3V0MV9yID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgICAgICBvdXQyX3IgPSBGSUxUXzhUQVBfRFBBRERfU19IKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgICAgIG91dDNfciA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgICAgIG91dDBfbCA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwotICAgICAgICAgICAgb3V0MV9sID0gRklMVF84VEFQX0RQQUREX1NfSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7Ci0gICAgICAgICAgICBvdXQyX2wgPSBGSUxUXzhUQVBfRFBBRERfU19IKHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIHNyYzk4X2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgICAgIG91dDNfbCA9IEZJTFRfOFRBUF9EUEFERF9TX0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgc3JjMTA5X2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLSAgICAgICAgICAgIFNSQVJfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBybmRfdmVjKTsKLSAgICAgICAgICAgIFNSQVJfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCBybmRfdmVjKTsKKyAgICAgICAgICAgIG91dDBfciA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgICAgICBvdXQxX3IgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgb3V0Ml9yID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjOThfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgICAgIG91dDNfciA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIHNyYzEwOV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgb3V0MF9sID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMTBfbCwgc3JjMzJfbCwgc3JjNTRfbCwgc3JjNzZfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgICAgIG91dDFfbCA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgICAgICBvdXQyX2wgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBzcmM5OF9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgb3V0M19sID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbCwgc3JjMTA5X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDYpOworICAgICAgICAgICAgU1JBUklfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA2KTsKICAgICAgICAgICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKICAgICAgICAgICAgIFNBVF9TSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA3KTsKICAgICAgICAgICAgIFBDS0VWX0I0X1VCKG91dDBfbCwgb3V0MF9yLCBvdXQxX2wsIG91dDFfciwgb3V0Ml9sLCBvdXQyX3IsIG91dDNfbCwKQEAgLTEzNDcsMzcgKzEzMDQsMzcgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX3Z0Xzh0XzI0d19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewogICAgIGNvbW1vbl92dF84dF8xNndfbXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kX3ZhbCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOwogCiAgICAgY29tbW9uX3Z0Xzh0Xzh3X21zYShzcmMgKyAxNiwgc3JjX3N0cmlkZSwgZHN0ICsgMTYsIGRzdF9zdHJpZGUsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcm5kX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwogfQogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfOHRfMzJ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LCB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgY29tbW9uX3Z0Xzh0XzE2d19tdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsLCAzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMik7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbW1vbl92dF84dF80OHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQsIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICBjb21tb25fdnRfOHRfMTZ3X211bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWwsIDQ4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4KTsKIH0KIAogc3RhdGljIHZvaWQgY29tbW9uX3Z0Xzh0XzY0d19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewogICAgIGNvbW1vbl92dF84dF8xNndfbXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kX3ZhbCwgNjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaV84dF80d19tc2EodWludDhfdCAqc3JjLApAQCAtMTM4OSwzNyArMTM0NiwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZpOCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQ7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMzsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKICAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OwotICAgIHY4aTE2IGRzdDMwLCBkc3Q0MSwgZHN0NTIsIGRzdDYzLCBkc3Q2NiwgZHN0ODc7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3I7Ci0gICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKLSAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKLSAgICB2OGkxNiBtYXNrNCA9IHsgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyB9OworICAgIHY4aTE2IGRzdDMwLCBkc3Q0MSwgZHN0NTIsIGRzdDYzLCBkc3Q2NiwgZHN0MTE3LCBkc3QxMjgsIGRzdDEzOSwgZHN0MTQxMDsKKyAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLCBkc3Q5OF9yLCBkc3QxMTEwX3IsIGRzdDEzMTJfcjsKKyAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yLCBkc3QxMDlfciwgZHN0MTIxMV9yLCBkc3QxNDEzX3I7CisgICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3I7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOwogCiAgICAgc3JjIC09ICgoMyAqIHNyY19zdHJpZGUpICsgMyk7CiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1c0X1NXKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgIFNQTEFUSV9XNF9TSChmaWx0ZXJfdmVjLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2syID0gbWFzazAgKyA0OwogICAgIG1hc2szID0gbWFzazAgKyA2OwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7Ci0KICAgICBMRF9TQjcoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKICAgICBzcmMgKz0gKDcgKiBzcmNfc3RyaWRlKTsKICAgICBYT1JJX0I3XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKQEAgLTE0MzEsNjEgKzEzODUsOTEgQEAKICAgICBWU0hGX0I0X1NCKHNyYzMsIHNyYzYsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUpOwogCi0gICAgZHN0MzAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICBkc3QzMCwgZHN0MzAsIGRzdDMwLCBkc3QzMCk7Ci0gICAgZHN0NDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICBkc3Q0MSwgZHN0NDEsIGRzdDQxLCBkc3Q0MSk7Ci0gICAgZHN0NTIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgIGRzdDUyLCBkc3Q1MiwgZHN0NTIsIGRzdDUyKTsKLSAgICBkc3Q2MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjRfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICBkc3Q2MywgZHN0NjMsIGRzdDYzLCBkc3Q2Myk7CisgICAgZHN0MzAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDQxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q1MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q2MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCi0gICAgSUxWUl9IM19TSChkc3Q0MSwgZHN0MzAsIGRzdDUyLCBkc3Q0MSwgZHN0NjMsIGRzdDUyLAotICAgICAgICAgICAgICAgZHN0MTBfciwgZHN0MjFfciwgZHN0MzJfcik7Ci0gICAgZHN0NDNfciA9IF9fbXNhX2lsdmxfaChkc3Q0MSwgZHN0MzApOwotICAgIGRzdDU0X3IgPSBfX21zYV9pbHZsX2goZHN0NTIsIGRzdDQxKTsKLSAgICBkc3Q2NV9yID0gX19tc2FfaWx2bF9oKGRzdDYzLCBkc3Q1Mik7CisgICAgSUxWUkxfSDJfU0goZHN0NDEsIGRzdDMwLCBkc3QxMF9yLCBkc3Q0M19yKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q1MiwgZHN0NDEsIGRzdDIxX3IsIGRzdDU0X3IpOworICAgIElMVlJMX0gyX1NIKGRzdDYzLCBkc3Q1MiwgZHN0MzJfciwgZHN0NjVfcik7CisKICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q2MywgMSk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDE7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgpOwotICAgICAgICBzcmMgKz0gMiAqIHNyY19zdHJpZGU7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzcsIHNyYzgpOworICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMzsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMsCisgICAgICAgICAgICAgICBzcmMxNCk7CisgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQpOwogCi0gICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjOCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCisgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjMTEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3Q4NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0ODcsIGRzdDg3LCBkc3Q4NywgZHN0ODcpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzEyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmM5LCBzcmMxMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCisgICAgICAgICAgICAgICAgICAgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmMxMCwgc3JjMTQsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1KTsKIAotICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDg3LCBkc3Q2Nik7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF84VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwotICAgICAgICBkc3Q4N19yID0gX19tc2FfdnNoZl9oKG1hc2s0LCBkc3Q4NywgZHN0ODcpOwotICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yLAorICAgICAgICBkc3QxMTcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDEyOCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MTM5ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CisgICAgICAgIGRzdDE0MTAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOworCisgICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0MTE3LCBkc3Q2Nik7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEyOCwgZHN0MTE3LCBkc3Q4N19yLCBkc3QxMjExX3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMzksIGRzdDEyOCwgZHN0OThfciwgZHN0MTMxMl9yKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MTQxMCwgZHN0MTM5LCBkc3QxMDlfciwgZHN0MTQxM19yKTsKKyAgICAgICAgZHN0MTE3ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDExNywgMSk7CisgICAgICAgIGRzdDExMTBfciA9IF9fbXNhX2lsdnJfaChkc3QxMTcsIGRzdDE0MTApOworCisgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF84VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZHN0OThfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF84VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsIGRzdDEwOV9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0NF9yID0gSEVWQ19GSUxUXzhUQVAoZHN0NTRfciwgZHN0NzZfciwgZHN0OThfciwgZHN0MTExMF9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0NV9yID0gSEVWQ19GSUxUXzhUQVAoZHN0NjVfciwgZHN0ODdfciwgZHN0MTA5X3IsIGRzdDEyMTFfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDZfciA9IEhFVkNfRklMVF84VEFQKGRzdDc2X3IsIGRzdDk4X3IsIGRzdDExMTBfciwgZHN0MTMxMl9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0N19yID0gSEVWQ19GSUxUXzhUQVAoZHN0ODdfciwgZHN0MTA5X3IsIGRzdDEyMTFfciwgZHN0MTQxM19yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKIAotICAgICAgICBkc3QwX3IgPj49IDY7Ci0gICAgICAgIGRzdDFfciA+Pj0gNjsKLSAgICAgICAgU1JBUklfVzJfU1coZHN0MF9yLCBkc3QxX3IsIDYpOwotICAgICAgICBkc3QwX3IgPSBDTElQX1NXXzBfMjU1KGRzdDBfcik7Ci0gICAgICAgIGRzdDFfciA9IENMSVBfU1dfMF8yNTUoZHN0MV9yKTsKKyAgICAgICAgU1JBXzRWKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgNik7CisgICAgICAgIFNSQV80Vihkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3IsIDYpOworICAgICAgICBTUkFSSV9XNF9TVyhkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIDYpOworICAgICAgICBTUkFSSV9XNF9TVyhkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3IsIDYpOworICAgICAgICBTQVRfU1c0X1NXKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgNyk7CisgICAgICAgIFNBVF9TVzRfU1coZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yLCA3KTsKKyAgICAgICAgUENLRVZfSDJfU1coZHN0MV9yLCBkc3QwX3IsIGRzdDNfciwgZHN0Ml9yLCBkc3QwX3IsIGRzdDFfcik7CisgICAgICAgIFBDS0VWX0gyX1NXKGRzdDVfciwgZHN0NF9yLCBkc3Q3X3IsIGRzdDZfciwgZHN0NF9yLCBkc3Q1X3IpOworICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihkc3QwX3IsIGRzdDFfcik7CisgICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDRfciwgZHN0NV9yKTsKKyAgICAgICAgU1Q0eDRfVUIob3V0MCwgb3V0MCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIFNUNHg0X1VCKG91dDEsIG91dDEsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogCi0gICAgICAgIEhFVkNfUENLX1NXX1NCMihkc3QxX3IsIGRzdDBfciwgZHN0MF9yKTsKLSAgICAgICAgU1Q0eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBkc3QxMF9yID0gZHN0MzJfcjsKLSAgICAgICAgZHN0MzJfciA9IGRzdDU0X3I7Ci0gICAgICAgIGRzdDU0X3IgPSBkc3Q3Nl9yOwotICAgICAgICBkc3QyMV9yID0gZHN0NDNfcjsKLSAgICAgICAgZHN0NDNfciA9IGRzdDY1X3I7Ci0gICAgICAgIGRzdDY1X3IgPSBkc3Q4N19yOwotICAgICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q4NywgMSk7CisgICAgICAgIGRzdDEwX3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QzMl9yID0gZHN0MTExMF9yOworICAgICAgICBkc3Q1NF9yID0gZHN0MTMxMl9yOworICAgICAgICBkc3QyMV9yID0gZHN0MTA5X3I7CisgICAgICAgIGRzdDQzX3IgPSBkc3QxMjExX3I7CisgICAgICAgIGRzdDY1X3IgPSBkc3QxNDEzX3I7CisgICAgICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDE0MTAsIDEpOwogICAgIH0KIH0KIApAQCAtMTUwMCwxMSArMTQ4NCwxMiBAQAogICAgIHVpbnQzMl90IGxvb3BfY250LCBjbnQ7CiAgICAgdWludDhfdCAqc3JjX3RtcDsKICAgICB1aW50OF90ICpkc3RfdG1wOworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDM7CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMzsKICAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CiAgICAgdjE2aTggdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBkc3Q4OwpAQCAtMTUxMywyMCArMTQ5OCwxNyBAQAogICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDc2X2w7CiAgICAgdjhpMTYgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfcjsKICAgICB2OGkxNiBkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sLCBkc3Q4N19sOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKIAogICAgIHNyYyAtPSAoKDMgKiBzcmNfc3RyaWRlKSArIDMpOwotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1c0X1NXKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgIFNQTEFUSV9XNF9TSChmaWx0ZXJfdmVjLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2syID0gbWFzazAgKyA0OwpAQCAtMTU0OSwxOCArMTUzMSwxNCBAQAogICAgICAgICAgICAgICAgICAgIHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUpOwotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QzLCBkc3QzLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CiAKICAgICAgICAgVlNIRl9CNF9TQihzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKQEAgLTE1NjgsMzMgKzE1NDYsMjkgQEAKICAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKICAgICAgICAgVlNIRl9CNF9TQihzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEpOwotICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q0LCBkc3Q0LCBkc3Q0LCBkc3Q0KTsKLSAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NSwgZHN0NSwgZHN0NSwgZHN0NSk7Ci0gICAgICAgIGRzdDYgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NiwgZHN0NiwgZHN0NiwgZHN0Nik7Ci0KLSAgICAgICAgSUxWUl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3QyLCBkc3QxLAotICAgICAgICAgICAgICAgICAgIGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDIxX3IpOwotICAgICAgICBJTFZSX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDYsIGRzdDUsIGRzdDQzX3IsIGRzdDY1X3IpOwotICAgICAgICBJTFZMX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDIsIGRzdDEsCi0gICAgICAgICAgICAgICAgICAgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCk7Ci0gICAgICAgIElMVkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NiwgZHN0NSwgZHN0NDNfbCwgZHN0NjVfbCk7CisgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0NiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKIAogICAgICAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDE7IGxvb3BfY250LS07KSB7CiAgICAgICAgICAgICBMRF9TQjIoc3JjX3RtcCwgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCk7CiAgICAgICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM3LCBzcmM4KTsKICAgICAgICAgICAgIHNyY190bXAgKz0gMiAqIHNyY19zdHJpZGU7CiAKKyAgICAgICAgICAgIElMVlJfSDRfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0MiwgZHN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfcik7CisgICAgICAgICAgICBJTFZMX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDIsIGRzdDEsCisgICAgICAgICAgICAgICAgICAgICAgIGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDIxX2wpOworICAgICAgICAgICAgSUxWUl9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q2LCBkc3Q1LCBkc3Q0M19yLCBkc3Q2NV9yKTsKKyAgICAgICAgICAgIElMVkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NiwgZHN0NSwgZHN0NDNfbCwgZHN0NjVfbCk7CisKICAgICAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICAgICAgZHN0NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q3LCBkc3Q3LCBkc3Q3LCBkc3Q3KTsKKyAgICAgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKIAogICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NywgZHN0NiwgZHN0NzZfciwgZHN0NzZfbCk7CiAgICAgICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLApAQCAtMTYwNiw5ICsxNTgwLDggQEAKIAogICAgICAgICAgICAgVlNIRl9CNF9TQihzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgICAgICBkc3Q4ID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDgsIGRzdDgsIGRzdDgsIGRzdDgpOworICAgICAgICAgICAgZHN0OCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOwogCiAgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3Q4LCBkc3Q3LCBkc3Q4N19yLCBkc3Q4N19sKTsKICAgICAgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF84VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsCkBAIC0xNjE4LDI3ICsxNTkxLDE5IEBACiAgICAgICAgICAgICBkc3QxX3IgPj49IDY7CiAgICAgICAgICAgICBkc3QxX2wgPj49IDY7CiAgICAgICAgICAgICBTUkFSSV9XNF9TVyhkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOwotICAgICAgICAgICAgZHN0MF9yID0gQ0xJUF9TV18wXzI1NShkc3QwX3IpOwotICAgICAgICAgICAgZHN0MF9sID0gQ0xJUF9TV18wXzI1NShkc3QwX2wpOwotICAgICAgICAgICAgZHN0MV9yID0gQ0xJUF9TV18wXzI1NShkc3QxX3IpOwotICAgICAgICAgICAgZHN0MV9sID0gQ0xJUF9TV18wXzI1NShkc3QxX2wpOworICAgICAgICAgICAgU0FUX1NXNF9TVyhkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDcpOwogCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjQoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QwX3IpOwotICAgICAgICAgICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFBDS0VWX0gyX1NIKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MCwgZHN0MSk7CisgICAgICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDEpOworICAgICAgICAgICAgU1Q4eDJfVUIob3V0LCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKICAgICAgICAgICAgIGRzdF90bXAgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKIAotICAgICAgICAgICAgZHN0MTBfciA9IGRzdDMyX3I7Ci0gICAgICAgICAgICBkc3QzMl9yID0gZHN0NTRfcjsKLSAgICAgICAgICAgIGRzdDU0X3IgPSBkc3Q3Nl9yOwotICAgICAgICAgICAgZHN0MTBfbCA9IGRzdDMyX2w7Ci0gICAgICAgICAgICBkc3QzMl9sID0gZHN0NTRfbDsKLSAgICAgICAgICAgIGRzdDU0X2wgPSBkc3Q3Nl9sOwotICAgICAgICAgICAgZHN0MjFfciA9IGRzdDQzX3I7Ci0gICAgICAgICAgICBkc3Q0M19yID0gZHN0NjVfcjsKLSAgICAgICAgICAgIGRzdDY1X3IgPSBkc3Q4N19yOwotICAgICAgICAgICAgZHN0MjFfbCA9IGRzdDQzX2w7Ci0gICAgICAgICAgICBkc3Q0M19sID0gZHN0NjVfbDsKLSAgICAgICAgICAgIGRzdDY1X2wgPSBkc3Q4N19sOworICAgICAgICAgICAgZHN0MCA9IGRzdDI7CisgICAgICAgICAgICBkc3QxID0gZHN0MzsKKyAgICAgICAgICAgIGRzdDIgPSBkc3Q0OworICAgICAgICAgICAgZHN0MyA9IGRzdDU7CisgICAgICAgICAgICBkc3Q0ID0gZHN0NjsKKyAgICAgICAgICAgIGRzdDUgPSBkc3Q3OwogICAgICAgICAgICAgZHN0NiA9IGRzdDg7CiAgICAgICAgIH0KIApAQCAtMTY2NywxMSArMTYzMiwyMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19odl91bmlfOHRfOG11bHR4Mm11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgOCk7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDhfdCAqc3JjX3RtcCwgKmRzdF90bXA7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCBzcmMxMSwgc3JjMTIsIHNyYzEzLCBzcmMxNDsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazc7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdDg7CisgICAgdjhpMTYgZHN0MzAsIGRzdDQxLCBkc3Q1MiwgZHN0NjMsIGRzdDY2LCBkc3QxMTcsIGRzdDEyOCwgZHN0MTM5LCBkc3QxNDEwOworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3I7CisgICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0NzZfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbDsKKyAgICB2OGkxNiBkc3Q4N19yLCBkc3Q5OF9yLCBkc3QxMTEwX3IsIGRzdDEzMTJfciwgZHN0MTA5X3IsIGRzdDEyMTFfcjsKKyAgICB2OGkxNiBkc3QxNDEzX3IsIGRzdDg3X2wsIGZpbHRlcl92ZWM7CisgICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3I7CisgICAgdjRpMzIgZHN0MF9sLCBkc3QxX2w7CiAKLSAgICBoZXZjX2h2X3VuaV84dF80d19tc2Eoc3JjICsgOCwgc3JjX3N0cmlkZSwgZHN0ICsgOCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOworICAgIHNyYyAtPSAoKDMgKiBzcmNfc3RyaWRlKSArIDMpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKKyAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOworCisgICAgU1BMQVRJX1c0X1NIKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworCisgICAgbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKKyAgICBtYXNrMSA9IG1hc2swICsgMjsKKyAgICBtYXNrMiA9IG1hc2swICsgNDsKKyAgICBtYXNrMyA9IG1hc2swICsgNjsKKworICAgIHNyY190bXAgPSBzcmM7CisgICAgZHN0X3RtcCA9IGRzdDsKKworICAgIExEX1NCNyhzcmNfdG1wLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICBzcmNfdG1wICs9ICg3ICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisKKyAgICAvKiByb3cgMCByb3cgMSByb3cgMiByb3cgMyAqLworICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjRfU0Ioc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzgsIHZlYzksIHZlYzEwLAorICAgICAgICAgICAgICAgdmVjMTEpOworICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzEyLCB2ZWMxMywgdmVjMTQsCisgICAgICAgICAgICAgICB2ZWMxNSk7CisgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKKworICAgIFZTSEZfQjRfU0Ioc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjRfU0Ioc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjRfU0Ioc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzgsIHZlYzksIHZlYzEwLAorICAgICAgICAgICAgICAgdmVjMTEpOworICAgIGRzdDQgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0NSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q2ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gODsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0IyKHNyY190bXAsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgpOworICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM3LCBzcmM4KTsKKyAgICAgICAgc3JjX3RtcCArPSAyICogc3JjX3N0cmlkZTsKKworICAgICAgICBJTFZSX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDIsIGRzdDEsIGRzdDEwX3IsCisgICAgICAgICAgICAgICAgICAgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfcik7CisgICAgICAgIElMVkxfSDRfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0MiwgZHN0MSwgZHN0MTBfbCwKKyAgICAgICAgICAgICAgICAgICBkc3QzMl9sLCBkc3Q1NF9sLCBkc3QyMV9sKTsKKyAgICAgICAgSUxWUl9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q2LCBkc3Q1LCBkc3Q0M19yLCBkc3Q2NV9yKTsKKyAgICAgICAgSUxWTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q2LCBkc3Q1LCBkc3Q0M19sLCBkc3Q2NV9sKTsKKworICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBkc3Q3ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKworICAgICAgICBJTFZSTF9IMl9TSChkc3Q3LCBkc3Q2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF84VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDc2X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QwX3IgPj49IDY7CisgICAgICAgIGRzdDBfbCA+Pj0gNjsKKworICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBkc3Q4ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKworICAgICAgICBJTFZSTF9IMl9TSChkc3Q4LCBkc3Q3LCBkc3Q4N19yLCBkc3Q4N19sKTsKKyAgICAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDFfbCA9IEhFVkNfRklMVF84VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGRzdDY1X2wsIGRzdDg3X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QxX3IgPj49IDY7CisgICAgICAgIGRzdDFfbCA+Pj0gNjsKKyAgICAgICAgU1JBUklfVzRfU1coZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKKyAgICAgICAgU0FUX1NXNF9TVyhkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDcpOworCisgICAgICAgIFBDS0VWX0gyX1NIKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MCwgZHN0MSk7CisgICAgICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDAsIGRzdDEpOworICAgICAgICBTVDh4Ml9VQihvdXQwLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0X3RtcCArPSAoMiAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDAgPSBkc3QyOworICAgICAgICBkc3QxID0gZHN0MzsKKyAgICAgICAgZHN0MiA9IGRzdDQ7CisgICAgICAgIGRzdDMgPSBkc3Q1OworICAgICAgICBkc3Q0ID0gZHN0NjsKKyAgICAgICAgZHN0NSA9IGRzdDc7CisgICAgICAgIGRzdDYgPSBkc3Q4OworICAgIH0KKworICAgIHNyYyArPSA4OworICAgIGRzdCArPSA4OworCisgICAgbWFzazQgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOworICAgIG1hc2s1ID0gbWFzazQgKyAyOworICAgIG1hc2s2ID0gbWFzazQgKyA0OworICAgIG1hc2s3ID0gbWFzazQgKyA2OworCisgICAgTERfU0I3KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgc3JjICs9ICg3ICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisKKyAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzMsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzQsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzUsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWM4LCB2ZWM5LCB2ZWMxMCwKKyAgICAgICAgICAgICAgIHZlYzExKTsKKyAgICBWU0hGX0I0X1NCKHNyYzMsIHNyYzYsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMxMiwgdmVjMTMsIHZlYzE0LAorICAgICAgICAgICAgICAgdmVjMTUpOworCisgICAgZHN0MzAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDQxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q1MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q2MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworCisgICAgSUxWUkxfSDJfU0goZHN0NDEsIGRzdDMwLCBkc3QxMF9yLCBkc3Q0M19yKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q1MiwgZHN0NDEsIGRzdDIxX3IsIGRzdDU0X3IpOworICAgIElMVlJMX0gyX1NIKGRzdDYzLCBkc3Q1MiwgZHN0MzJfciwgZHN0NjVfcik7CisKKyAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q2MywgMSk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gMjsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMsCisgICAgICAgICAgICAgICBzcmMxNCk7CisgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQpOworCisgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjMTEsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzEyLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjNCwgdmVjNSwgdmVjNiwKKyAgICAgICAgICAgICAgICAgICB2ZWM3KTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmM5LCBzcmMxMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzgsIHZlYzksIHZlYzEwLAorICAgICAgICAgICAgICAgICAgIHZlYzExKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmMxMCwgc3JjMTQsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMxMiwgdmVjMTMsCisgICAgICAgICAgICAgICAgICAgdmVjMTQsIHZlYzE1KTsKKworICAgICAgICBkc3QxMTcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDEyOCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MTM5ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CisgICAgICAgIGRzdDE0MTAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOworCisgICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0MTE3LCBkc3Q2Nik7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEyOCwgZHN0MTE3LCBkc3Q4N19yLCBkc3QxMjExX3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMzksIGRzdDEyOCwgZHN0OThfciwgZHN0MTMxMl9yKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MTQxMCwgZHN0MTM5LCBkc3QxMDlfciwgZHN0MTQxM19yKTsKKyAgICAgICAgZHN0MTE3ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDExNywgMSk7CisgICAgICAgIGRzdDExMTBfciA9IF9fbXNhX2lsdnJfaChkc3QxMTcsIGRzdDE0MTApOworCisgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF84VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZHN0OThfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF84VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsIGRzdDEwOV9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0NF9yID0gSEVWQ19GSUxUXzhUQVAoZHN0NTRfciwgZHN0NzZfciwgZHN0OThfciwgZHN0MTExMF9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0NV9yID0gSEVWQ19GSUxUXzhUQVAoZHN0NjVfciwgZHN0ODdfciwgZHN0MTA5X3IsIGRzdDEyMTFfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDZfciA9IEhFVkNfRklMVF84VEFQKGRzdDc2X3IsIGRzdDk4X3IsIGRzdDExMTBfciwgZHN0MTMxMl9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0N19yID0gSEVWQ19GSUxUXzhUQVAoZHN0ODdfciwgZHN0MTA5X3IsIGRzdDEyMTFfciwgZHN0MTQxM19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKworICAgICAgICBTUkFfNFYoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKKyAgICAgICAgU1JBXzRWKGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfciwgNik7CisgICAgICAgIFNSQVJJX1c0X1NXKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgNik7CisgICAgICAgIFNSQVJJX1c0X1NXKGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfciwgNik7CisgICAgICAgIFNBVF9TVzRfU1coZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA3KTsKKyAgICAgICAgU0FUX1NXNF9TVyhkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3IsIDcpOworICAgICAgICBQQ0tFVl9IMl9TVyhkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIGRzdDBfciwgZHN0MV9yKTsKKyAgICAgICAgUENLRVZfSDJfU1coZHN0NV9yLCBkc3Q0X3IsIGRzdDdfciwgZHN0Nl9yLCBkc3Q0X3IsIGRzdDVfcik7CisgICAgICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDBfciwgZHN0MV9yKTsKKyAgICAgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0NF9yLCBkc3Q1X3IpOworICAgICAgICBTVDR4NF9VQihvdXQwLCBvdXQwLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q0eDRfVUIob3V0MSwgb3V0MSwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgZHN0MTBfciA9IGRzdDk4X3I7CisgICAgICAgIGRzdDMyX3IgPSBkc3QxMTEwX3I7CisgICAgICAgIGRzdDU0X3IgPSBkc3QxMzEyX3I7CisgICAgICAgIGRzdDIxX3IgPSBkc3QxMDlfcjsKKyAgICAgICAgZHN0NDNfciA9IGRzdDEyMTFfcjsKKyAgICAgICAgZHN0NjVfciA9IGRzdDE0MTNfcjsKKyAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MTQxMCwgMSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaV84dF8xNndfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTE3MzYsMTYgKzE5MjIsMTQgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX2h6XzR0XzR4Ml9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcikKIHsKICAgICB2MTZpOCBmaWx0MCwgZmlsdDEsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMTsKICAgICB2MTZ1OCBvdXQ7CiAgICAgdjhpMTYgZmlsdCwgcmVzMDsKLSAgICB2OGkxNiBybmRfdmVjOwogCi0gICAgbWFzazAgPSBMRF9TQigmbWNfZmlsdF9tYXNrX2FyclsxNl0pOworICAgIG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMTZdKTsKICAgICBzcmMgLT0gMTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC0xNzU2LDggKzE5NDAsOCBAQAogICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEpOwogICAgIFhPUklfQjJfMTI4X1NCKHNyYzAsIHNyYzEpOwogICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICByZXMwID0gRklMVF80VEFQX0RQQUREX1NfSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOwotICAgIHJlczAgPSBfX21zYV9zcmFyX2gocmVzMCwgcm5kX3ZlYyk7CisgICAgcmVzMCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgcmVzMCA9IF9fbXNhX3NyYXJpX2gocmVzMCwgNik7CiAgICAgcmVzMCA9IF9fbXNhX3NhdF9zX2gocmVzMCwgNyk7CiAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihyZXMwLCByZXMwKTsKICAgICBTVDR4Ml9VQihvdXQsIGRzdCwgZHN0X3N0cmlkZSk7CkBAIC0xNzY1LDE2ICsxOTQ5LDE0IEBACiAKIHN0YXRpYyB2b2lkIGNvbW1vbl9oel80dF80eDRfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZmlsdDAsIGZpbHQxLCBtYXNrMCwgbWFzazE7CiAgICAgdjhpMTYgZmlsdCwgb3V0MCwgb3V0MTsKICAgICB2MTZ1OCBvdXQ7Ci0gICAgdjhpMTYgcm5kX3ZlYzsKIAotICAgIG1hc2swID0gTERfU0IoJm1jX2ZpbHRfbWFza19hcnJbMTZdKTsKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzE2XSk7CiAgICAgc3JjIC09IDE7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIC8qIHJlYXJyYW5naW5nIGZpbHRlciAqLwogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwpAQCAtMTc4Niw3ICsxOTY4LDcgQEAKICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICBIT1JJWl80VEFQXzRXSURfNFZFQ1NfRklMVChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBvdXQwLCBvdXQxKTsKLSAgICBTUkFSX0gyX1NIKG91dDAsIG91dDEsIHJuZF92ZWMpOworICAgIFNSQVJJX0gyX1NIKG91dDAsIG91dDEsIDYpOwogICAgIFNBVF9TSDJfU0gob3V0MCwgb3V0MSwgNyk7CiAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKQEAgLTE3OTQsMTYgKzE5NzYsMTQgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX2h6XzR0XzR4OF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcikKIHsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIG1hc2swLCBtYXNrMTsKICAgICB2MTZ1OCBvdXQ7CiAgICAgdjhpMTYgZmlsdCwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKLSAgICB2OGkxNiBybmRfdmVjOwogCi0gICAgbWFzazAgPSBMRF9TQigmbWNfZmlsdF9tYXNrX2FyclsxNl0pOworICAgIG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMTZdKTsKICAgICBzcmMgLT0gMTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC0xODIxLDcgKzIwMDEsNyBAQAogICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogICAgIEhPUklaXzRUQVBfNFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIG91dDIsIG91dDMpOwotICAgIFNSQVJfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgcm5kX3ZlYyk7CisgICAgU1JBUklfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNik7CiAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwogICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwpAQCAtMTgzMiwxNyArMjAxMiwxNSBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfNHRfNHgxNl9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcikKIHsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwogICAgIHYxNmk4IGZpbHQwLCBmaWx0MSwgbWFzazAsIG1hc2sxOwogICAgIHYxNnU4IG91dDsKICAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1NCKCZtY19maWx0X21hc2tfYXJyWzE2XSk7CisgICAgbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclsxNl0pOwogICAgIHNyYyAtPSAxOwotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CiAKICAgICAvKiByZWFycmFuZ2luZyBmaWx0ZXIgKi8KICAgICBmaWx0ID0gTERfU0goZmlsdGVyKTsKQEAgLTE4NTcsNyArMjAzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBvdXQwLCBvdXQxKTsKICAgICBIT1JJWl80VEFQXzRXSURfNFZFQ1NfRklMVChzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBvdXQyLCBvdXQzKTsKLSAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOworICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDYpOwogICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7CiAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKQEAgLTE4NzMsNyArMjA1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBvdXQwLCBvdXQxKTsKICAgICBIT1JJWl80VEFQXzRXSURfNFZFQ1NfRklMVChzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBvdXQyLCBvdXQzKTsKLSAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOworICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDYpOwogICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7CiAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKQEAgLTE4ODQsMzUgKzIwNjIsMjkgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX2h6XzR0XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGNvbW1vbl9oel80dF80eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIHJuZF92YWwpOworICAgICAgICBjb21tb25faHpfNHRfNHgyX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyKTsKICAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGNvbW1vbl9oel80dF80eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIHJuZF92YWwpOworICAgICAgICBjb21tb25faHpfNHRfNHg0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyKTsKICAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGNvbW1vbl9oel80dF80eDhfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIHJuZF92YWwpOworICAgICAgICBjb21tb25faHpfNHRfNHg4X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyKTsKICAgICB9IGVsc2UgaWYgKDE2ID09IGhlaWdodCkgewotICAgICAgICBjb21tb25faHpfNHRfNHgxNl9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWwpOworICAgICAgICBjb21tb25faHpfNHRfNHgxNl9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcik7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfNHRfNndfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIG1hc2swLCBtYXNrMTsKICAgICB2MTZ1OCBvdXQ0LCBvdXQ1OwogICAgIHY4aTE2IGZpbHQsIG91dDAsIG91dDEsIG91dDIsIG91dDM7Ci0gICAgdjhpMTYgcm5kX3ZlYzsKIAotICAgIG1hc2swID0gTERfU0IoJm1jX2ZpbHRfbWFza19hcnJbMF0pOworICAgIG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHNyYyAtPSAxOwotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CiAKICAgICAvKiByZWFycmFuZ2luZyBmaWx0ZXIgKi8KICAgICBmaWx0ID0gTERfU0goZmlsdGVyKTsKQEAgLTE5MjAsMzcgKzIwOTIsNDQgQEAKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKIAotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgSE9SSVpfNFRBUF84V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBmaWx0MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOwotICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIEhPUklaXzRUQVBfOFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDYpOworICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7CisgICAgb3V0NCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CisgICAgb3V0NSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Miwgb3V0Myk7CisgICAgU1Q2eDRfVUIob3V0NCwgb3V0NSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKIAotICAgICAgICBvdXQ0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwLCBvdXQxKTsKLSAgICAgICAgb3V0NSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Miwgb3V0Myk7Ci0gICAgICAgIFNUNng0X1VCKG91dDQsIG91dDUsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKworICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIEhPUklaXzRUQVBfOFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDYpOworICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7CisgICAgb3V0NCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CisgICAgb3V0NSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Miwgb3V0Myk7CisgICAgU1Q2eDRfVUIob3V0NCwgb3V0NSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgY29tbW9uX2h6XzR0Xzh4Mm11bHRfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIGZpbHQwLCBmaWx0MSwgbWFzazAsIG1hc2sxOwogICAgIHYxNnU4IG91dDsKICAgICB2OGkxNiBmaWx0LCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1NCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBzcmMgLT0gMTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0gyX1NCKGZpbHQsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CkBAIC0xOTY2LDcgKzIxNDUsNyBAQAogICAgICAgICBET1RQX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDAsIHZlYzAsIHZlYzEpOwogICAgICAgICBWU0hGX0IyX1NIKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2sxLCBtYXNrMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MSwgZmlsdDEsIHZlYzAsIHZlYzEpOwotICAgICAgICBTUkFSX0gyX1NIKHZlYzAsIHZlYzEsIHJuZF92ZWMpOworICAgICAgICBTUkFSSV9IMl9TSCh2ZWMwLCB2ZWMxLCA2KTsKICAgICAgICAgU0FUX1NIMl9TSCh2ZWMwLCB2ZWMxLCA3KTsKICAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQih2ZWMwLCB2ZWMxKTsKICAgICAgICAgU1Q4eDJfVUIob3V0LCBkc3QsIGRzdF9zdHJpZGUpOwpAQCAtMTk3NiwxOCArMjE1NSwxNSBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfNHRfOHg0bXVsdF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZmlsdDAsIGZpbHQxLCBtYXNrMCwgbWFzazE7CiAgICAgdjE2dTggdG1wMCwgdG1wMTsKICAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1NCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBzcmMgLT0gMTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC0yMDAyLDcgKzIxNzgsNyBAQAogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICAgICAgSE9SSVpfNFRBUF84V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBmaWx0MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA2KTsKICAgICAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKICAgICAgICAgdG1wMCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CiAgICAgICAgIHRtcDEgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDIsIG91dDMpOwpAQCAtMjAxMywyMiArMjE4OSwyMCBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfNHRfOHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICBpZiAoKDIgPT0gaGVpZ2h0KSB8fCAoNiA9PSBoZWlnaHQpKSB7CiAgICAgICAgIGNvbW1vbl9oel80dF84eDJtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBybmRfdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgY29tbW9uX2h6XzR0Xzh4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHJuZF92YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0KTsKICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGNvbW1vbl9oel80dF8xMndfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZmlsdDAsIGZpbHQxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMzsKQEAgLTIwMzYsMTAgKzIyMTAsOSBAQAogICAgIHYxNmk4IHZlYzEwLCB2ZWMxMTsKICAgICB2MTZ1OCB0bXAwLCB0bXAxOwogICAgIHY4aTE2IGZpbHQsIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7Ci0gICAgdjhpMTYgcm5kX3ZlYzsKIAotICAgIG1hc2swID0gTERfU0IoJm1jX2ZpbHRfbWFza19hcnJbMF0pOwotICAgIG1hc2syID0gTERfU0IoJm1jX2ZpbHRfbWFza19hcnJbMzJdKTsKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMiA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzMyXSk7CiAKICAgICBzcmMgLT0gMTsKIApAQCAtMjA1MCw1MyArMjIyMyw1MCBAQAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2szID0gbWFzazIgKyAyOwogCi0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKLQotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgeworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CiAKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazIsIG1hc2syLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgRE9UUF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQwLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMywgbWFzazMsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgU1JBUklfSDJfU0gob3V0MCwgb3V0MSwgNik7CisgICAgICAgIFNBVF9TSDJfU0gob3V0MCwgb3V0MSwgNyk7CisgICAgICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOworICAgICAgICBTVDR4NF9VQih0bXAwLCB0bXAwLCAwLCAxLCAyLCAzLCBkc3QgKyA4LCBkc3Rfc3RyaWRlKTsKKwogICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjNCwgdmVjNSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWM2LCB2ZWM3KTsKLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazIsIHZlYzAsIHZlYzEpOwogICAgICAgICBET1RQX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwKICAgICAgICAgICAgICAgICAgICAgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSk7Ci0gICAgICAgIERPVFBfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MCwgb3V0MCwgb3V0MSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWM4LCB2ZWM5KTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzEwLCB2ZWMxMSk7Ci0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazMsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsCiAgICAgICAgICAgICAgICAgICAgICBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1KTsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQxLCBmaWx0MSwgb3V0MCwgb3V0MSk7Ci0gICAgICAgIFNSQVJfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgcm5kX3ZlYyk7Ci0gICAgICAgIFNSQVJfSDJfU0gob3V0NCwgb3V0NSwgcm5kX3ZlYyk7Ci0gICAgICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7Ci0gICAgICAgIFNBVF9TSDJfU0gob3V0NCwgb3V0NSwgNyk7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDIsIG91dDMsIG91dDQsIG91dDUsIDYpOworICAgICAgICBTQVRfU0g0X1NIKG91dDIsIG91dDMsIG91dDQsIG91dDUsIDcpOwogICAgICAgICB0bXAwID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKICAgICAgICAgdG1wMSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0NCwgb3V0NSk7CiAgICAgICAgIFNUOHg0X1VCKHRtcDAsIHRtcDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwotICAgICAgICBTVDR4NF9VQih0bXAwLCB0bXAwLCAwLCAxLCAyLCAzLCBkc3QgKyA4LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfNHRfMTZ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CiAgICAgdjE2aTggZmlsdDAsIGZpbHQxLCBtYXNrMCwgbWFzazE7CisgICAgdjE2aTggdmVjMF9tLCB2ZWMxX20sIHZlYzJfbSwgdmVjM19tOwogICAgIHY4aTE2IGZpbHQsIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDc7CiAgICAgdjE2dTggb3V0OwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1NCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBzcmMgLT0gMTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC0yMTEwLDIwICsyMjgwLDM0IEBACiAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwogCiAgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICBIT1JJWl80VEFQXzhXSURfNFZFQ1NfRklMVChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIGZpbHQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7Ci0gICAgICAgIEhPUklaXzRUQVBfOFdJRF80VkVDU19GSUxUKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMSwgZmlsdDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsKLSAgICAgICAgU1JBUl9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBybmRfdmVjKTsKLSAgICAgICAgU1JBUl9INF9TSChvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3LCBybmRfdmVjKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMF9tLCB2ZWMxX20pOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMl9tLCB2ZWMzX20pOworICAgICAgICBET1RQX1NCNF9TSCh2ZWMwX20sIHZlYzFfbSwgdmVjMl9tLCB2ZWMzX20sIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzBfbSwgdmVjMV9tKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzJfbSwgdmVjM19tKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzBfbSwgdmVjMV9tLCB2ZWMyX20sIHZlYzNfbSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNik7CiAgICAgICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7Ci0gICAgICAgIFNBVF9TSDRfU0gob3V0NCwgb3V0NSwgb3V0Niwgb3V0NywgNyk7CiAgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CiAgICAgICAgIFNUX1VCKG91dCwgZHN0KTsKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CiAgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Miwgb3V0Myk7CiAgICAgICAgIFNUX1VCKG91dCwgZHN0KTsKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazAsIHZlYzBfbSwgdmVjMV9tKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazAsIHZlYzJfbSwgdmVjM19tKTsKKyAgICAgICAgRE9UUF9TQjRfU0godmVjMF9tLCB2ZWMxX20sIHZlYzJfbSwgdmVjM19tLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgb3V0NCwgb3V0NSwgb3V0Niwgb3V0Nyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNSwgc3JjNSwgbWFzazEsIG1hc2sxLCB2ZWMwX20sIHZlYzFfbSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNywgc3JjNywgbWFzazEsIG1hc2sxLCB2ZWMyX20sIHZlYzNfbSk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwX20sIHZlYzFfbSwgdmVjMl9tLCB2ZWMzX20sIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgb3V0NCwgb3V0NSwgb3V0Niwgb3V0Nyk7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDQsIG91dDUsIG91dDYsIG91dDcsIDYpOworICAgICAgICBTQVRfU0g0X1NIKG91dDQsIG91dDUsIG91dDYsIG91dDcsIDcpOwogICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDQsIG91dDUpOwogICAgICAgICBTVF9VQihvdXQsIGRzdCk7CiAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwpAQCAtMjEzNSw4ICsyMzE5LDcgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX2h6XzR0XzI0d19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50OF90ICpkc3QxID0gZHN0ICsgMTY7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CkBAIC0yMTQ1LDExICsyMzI4LDkgQEAKICAgICB2MTZpOCBmaWx0MCwgZmlsdDEsIG1hc2swLCBtYXNrMSwgbWFzazAwLCBtYXNrMTE7CiAgICAgdjhpMTYgZmlsdCwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKICAgICB2MTZ1OCB0bXAwLCB0bXAxOwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1NCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBzcmMgLT0gMTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC0yMTU5LDcgKzIzNDAsNyBAQAogICAgIG1hc2swMCA9IG1hc2swICsgODsKICAgICBtYXNrMTEgPSBtYXNrMCArIDEwOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDg7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzIsIHNyYzQsIHNyYzYpOwogICAgICAgICBMRF9TQjQoc3JjICsgMTYsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzMsIHNyYzUsIHNyYzcpOwogICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKQEAgLTIxNzMsNyArMjM1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwogICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsCiAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKLSAgICAgICAgU1JBUl9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBybmRfdmVjKTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNik7CiAgICAgICAgIFNBVF9TSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNyk7CiAgICAgICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwogICAgICAgICBTVF9VQih0bXAwLCBkc3QpOwpAQCAtMjE5MCw3ICsyMzcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CiAgICAgICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwKICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA2KTsKICAgICAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKICAgICAgICAgdG1wMCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CiAgICAgICAgIFNUX1VCKHRtcDAsIGRzdCk7CkBAIC0yMjEwLDcgKzIzOTEsNyBAQAogICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsCiAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKIAotICAgICAgICBTUkFSX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHJuZF92ZWMpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA2KTsKICAgICAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKICAgICAgICAgdG1wMCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7CiAgICAgICAgIHRtcDEgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDIsIG91dDMpOwpAQCAtMjIyMSwxOSArMjQwMiwxNyBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfNHRfMzJ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CiAgICAgdjE2aTggZmlsdDAsIGZpbHQxLCBtYXNrMCwgbWFzazE7CiAgICAgdjE2dTggb3V0OworICAgIHYxNmk4IHZlYzBfbSwgdmVjMV9tLCB2ZWMyX20sIHZlYzNfbTsKICAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3OwotICAgIHY4aTE2IHJuZF92ZWM7CiAKLSAgICBtYXNrMCA9IExEX1NCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBzcmMgLT0gMTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC0yMjQzLDIyICsyNDIyLDM3IEBACiAKICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAxKTsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgc3JjMCA9IExEX1NCKHNyYyk7CisgICAgICAgIHNyYzEgPSBMRF9TQihzcmMgKyA4KTsKICAgICAgICAgc3JjMiA9IExEX1NCKHNyYyArIDE2KTsKICAgICAgICAgc3JjMyA9IExEX1NCKHNyYyArIDI0KTsKICAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CiAgICAgICAgIHNyYzQgPSBMRF9TQihzcmMpOworICAgICAgICBzcmM1ID0gTERfU0Ioc3JjICsgOCk7CiAgICAgICAgIHNyYzYgPSBMRF9TQihzcmMgKyAxNik7CiAgICAgICAgIHNyYzcgPSBMRF9TQihzcmMgKyAyNCk7Ci0gICAgICAgIFNMRElfQjJfU0Ioc3JjMiwgc3JjNiwgc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgOCk7CiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwogCiAgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICBIT1JJWl80VEFQXzhXSURfNFZFQ1NfRklMVChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7Ci0gICAgICAgIEhPUklaXzRUQVBfOFdJRF80VkVDU19GSUxUKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsKLSAgICAgICAgU1JBUl9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBybmRfdmVjKTsKLSAgICAgICAgU1JBUl9INF9TSChvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3LCBybmRfdmVjKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMF9tLCB2ZWMxX20pOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMCwgdmVjMl9tLCB2ZWMzX20pOworICAgICAgICBET1RQX1NCNF9TSCh2ZWMwX20sIHZlYzFfbSwgdmVjMl9tLCB2ZWMzX20sIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMSwgbWFzazEsIHZlYzBfbSwgdmVjMV9tKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzJfbSwgdmVjM19tKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzBfbSwgdmVjMV9tLCB2ZWMyX20sIHZlYzNfbSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMCwgdmVjMF9tLCB2ZWMxX20pOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMCwgdmVjMl9tLCB2ZWMzX20pOworICAgICAgICBET1RQX1NCNF9TSCh2ZWMwX20sIHZlYzFfbSwgdmVjMl9tLCB2ZWMzX20sIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM1LCBzcmM1LCBtYXNrMSwgbWFzazEsIHZlYzBfbSwgdmVjMV9tKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM3LCBzcmM3LCBtYXNrMSwgbWFzazEsIHZlYzJfbSwgdmVjM19tKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzBfbSwgdmVjMV9tLCB2ZWMyX20sIHZlYzNfbSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgNik7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDQsIG91dDUsIG91dDYsIG91dDcsIDYpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDQsIG91dDUsIG91dDYsIG91dDcsIDcpOwogICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDAsIG91dDEpOwpAQCAtMjI3NiwxNiArMjQ3MCwxNCBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfNHgyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyKQogewogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7CiAgICAgdjE2aTggc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxOwogICAgIHYxNnU4IG91dDsKICAgICB2OGkxNiBmaWx0LCBvdXQxMDsKLSAgICB2OGkxNiBybmRfdmVjOwogCiAgICAgc3JjIC09IHNyY19zdHJpZGU7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9IMl9TQihmaWx0LCAwLCAxLCBmaWx0MCwgZmlsdDEpOwpAQCAtMjMwMCw4ICsyNDkyLDggQEAKICAgICBJTFZSX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX3IsIHNyYzQzX3IpOwogICAgIHNyYzQzMzIgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzQzX3IsICh2Mmk2NCkgc3JjMzJfcik7CiAgICAgc3JjNDMzMiA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjNDMzMiwgMTI4KTsKLSAgICBvdXQxMCA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxKTsKLSAgICBvdXQxMCA9IF9fbXNhX3NyYXJfaChvdXQxMCwgcm5kX3ZlYyk7CisgICAgb3V0MTAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMTEwLCBzcmM0MzMyLCBmaWx0MCwgZmlsdDEpOworICAgIG91dDEwID0gX19tc2Ffc3JhcmlfaChvdXQxMCwgNik7CiAgICAgb3V0MTAgPSBfX21zYV9zYXRfc19oKG91dDEwLCA3KTsKICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDEwLCBvdXQxMCk7CiAgICAgU1Q0eDJfVUIob3V0LCBkc3QsIGRzdF9zdHJpZGUpOwpAQCAtMjMwOSw4ICsyNTAxLDcgQEAKIAogc3RhdGljIHZvaWQgY29tbW9uX3Z0XzR0XzR4NG11bHRpcGxlX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKQEAgLTIzMTgsMTAgKzI1MDksOCBAQAogICAgIHYxNmk4IHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MTsKICAgICB2OGkxNiBmaWx0LCBvdXQxMCwgb3V0MzI7CiAgICAgdjE2dTggb3V0OwotICAgIHY4aTE2IHJuZF92ZWM7CiAKICAgICBzcmMgLT0gc3JjX3N0cmlkZTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0gyX1NCKGZpbHQsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CkBAIC0yMzQwLDE1ICsyNTI5LDE1IEBACiAgICAgICAgIElMVlJfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfciwgc3JjNDNfcik7CiAgICAgICAgIHNyYzQzMzIgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzQzX3IsICh2Mmk2NCkgc3JjMzJfcik7CiAgICAgICAgIHNyYzQzMzIgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzQzMzIsIDEyOCk7Ci0gICAgICAgIG91dDEwID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMyMTEwLCBzcmM0MzMyLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQxMCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSk7CiAKICAgICAgICAgc3JjMiA9IExEX1NCKHNyYyk7CiAgICAgICAgIHNyYyArPSAoc3JjX3N0cmlkZSk7CiAgICAgICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjNTRfciwgc3JjNjVfcik7CiAgICAgICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzY1X3IsICh2Mmk2NCkgc3JjNTRfcik7CiAgICAgICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzIxMTAsIDEyOCk7Ci0gICAgICAgIG91dDMyID0gRklMVF80VEFQX0RQQUREX1NfSChzcmM0MzMyLCBzcmMyMTEwLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBTUkFSX0gyX1NIKG91dDEwLCBvdXQzMiwgcm5kX3ZlYyk7CisgICAgICAgIG91dDMyID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDMzMiwgc3JjMjExMCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgU1JBUklfSDJfU0gob3V0MTAsIG91dDMyLCA2KTsKICAgICAgICAgU0FUX1NIMl9TSChvdXQxMCwgb3V0MzIsIDcpOwogICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDEwLCBvdXQzMik7CiAgICAgICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwpAQCAtMjM1OCw4MiArMjU0Nyw5MCBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfNHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKLSAgICAgICAgY29tbW9uX3Z0XzR0XzR4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgcm5kX3ZhbCk7CisgICAgICAgIGNvbW1vbl92dF80dF80eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbW1vbl92dF80dF80eDRtdWx0aXBsZV9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHJuZF92YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfNndfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBvdXQwLCBvdXQxOwotICAgIHY4aTE2IHZlYzAxLCB2ZWMxMiwgdmVjMjMsIHZlYzMwLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwotICAgIHY4aTE2IGZpbHQsIGZpbHQwLCBmaWx0MTsKLSAgICB2OGkxNiBybmRfdmVjOworICAgIHYxNnU4IG91dDAsIG91dDE7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM1NF9yLCBzcmM2NV9yOworICAgIHY4aTE2IGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZmlsdDAsIGZpbHQxLCBmaWx0ZXJfdmVjOwogCiAgICAgc3JjIC09IHNyY19zdHJpZGU7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAotICAgIC8qIHJlYXJyYW5naW5nIGZpbHRlcl95ICovCi0gICAgZmlsdCA9IExEX1NIKGZpbHRlcik7Ci0gICAgU1BMQVRJX0gyX1NIKGZpbHQsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CisgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICBMRF9VQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKICAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBJTFZSX0IyX1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzEwX3IsIHNyYzIxX3IpOwogCi0gICAgdmVjMCA9ICh2MTZ1OCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjMCwgMTI4KTsKLSAgICB2ZWMxID0gKHYxNnU4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBzcmMxLCAxMjgpOwotICAgIHZlYzIgPSAodjE2dTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzIsIDEyOCk7CisgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7CisgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEpOwogCi0gICAgICAgIHZlYzMgPSAodjE2dTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzMsIDEyOCk7Ci0gICAgICAgIElMVlJfQjJfU0godmVjMSwgdmVjMCwgdmVjMywgdmVjMiwgdmVjMDEsIHZlYzIzKTsKLSAgICAgICAgdG1wMCA9IEZJTFRfNFRBUF9EUEFERF9TX0godmVjMDEsIHZlYzIzLCBmaWx0MCwgZmlsdDEpOworICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYpOworICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOworICAgIFhPUklfQjJfMTI4X1NCKHNyYzUsIHNyYzYpOworICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNTRfciwgc3JjNjVfcik7CiAKLSAgICAgICAgdmVjMCA9IF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzAsIDEyOCk7Ci0gICAgICAgIElMVlJfQjJfU0godmVjMiwgdmVjMSwgdmVjMCwgdmVjMywgdmVjMTIsIHZlYzMwKTsKLSAgICAgICAgdG1wMSA9IEZJTFRfNFRBUF9EUEFERF9TX0godmVjMTIsIHZlYzMwLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxKTsKIAotICAgICAgICB2ZWMxID0gX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjMSwgMTI4KTsKLSAgICAgICAgdmVjMDEgPSAodjhpMTYpIF9fbXNhX2lsdnJfYigodjE2aTgpIHZlYzEsICh2MTZpOCkgdmVjMCk7Ci0gICAgICAgIHRtcDIgPSBGSUxUXzRUQVBfRFBBRERfU19IKHZlYzIzLCB2ZWMwMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBTUkFSSV9INF9TSChkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIDYpOworICAgIFNBVF9TSDRfU0goZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA3KTsKKyAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihkc3QwX3IsIGRzdDFfcik7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0Ml9yLCBkc3QzX3IpOworICAgIFNUNng0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgdmVjMiA9IF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzIsIDEyOCk7Ci0gICAgICAgIHZlYzEyID0gKHY4aTE2KSBfX21zYV9pbHZyX2IoKHYxNmk4KSB2ZWMyLCAodjE2aTgpIHZlYzEpOwotICAgICAgICB0bXAzID0gRklMVF80VEFQX0RQQUREX1NfSCh2ZWMzMCwgdmVjMTIsIGZpbHQwLCBmaWx0MSk7CisgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7CisgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7CisgICAgSUxWUl9CMl9TQihzcmMzLCBzcmM2LCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKIAotICAgICAgICBTUkFSX0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHJuZF92ZWMpOwotICAgICAgICBTQVRfU0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOwotICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQih0bXAwLCB0bXAxKTsKLSAgICAgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMiwgdG1wMyk7Ci0gICAgICAgIFNUNng0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM1NF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzY1X3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSk7CisKKyAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2KTsKKyAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0IyXzEyOF9TQihzcmM1LCBzcmM2KTsKKyAgICBJTFZSX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzU0X3IsIHNyYzY1X3IpOworCisgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMzJfciwgc3JjNTRfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEpOworCisgICAgU1JBUklfSDRfU0goZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKKyAgICBTQVRfU0g0X1NIKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgNyk7CisgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIoZHN0MF9yLCBkc3QxX3IpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDJfciwgZHN0M19yKTsKKyAgICBTVDZ4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfOHgyX21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyKQogewogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7CiAgICAgdjhpMTYgc3JjMDEsIHNyYzEyLCBzcmMyMywgc3JjMzQsIHRtcDAsIHRtcDEsIGZpbHQsIGZpbHQwLCBmaWx0MTsKICAgICB2MTZ1OCBvdXQ7Ci0gICAgdjhpMTYgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSBzcmNfc3RyaWRlOwotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CiAKICAgICAvKiByZWFycmFuZ2luZyBmaWx0ZXJfeSAqLwogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwpAQCAtMjQ0MiwxMCArMjYzOSwxMCBAQAogICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwogICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwogICAgIElMVlJfQjJfU0goc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjMDEsIHNyYzIzKTsKLSAgICB0bXAwID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMwMSwgc3JjMjMsIGZpbHQwLCBmaWx0MSk7CisgICAgdG1wMCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzAxLCBzcmMyMywgZmlsdDAsIGZpbHQxKTsKICAgICBJTFZSX0IyX1NIKHNyYzIsIHNyYzEsIHNyYzQsIHNyYzMsIHNyYzEyLCBzcmMzNCk7Ci0gICAgdG1wMSA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjMTIsIHNyYzM0LCBmaWx0MCwgZmlsdDEpOwotICAgIFNSQVJfSDJfU0godG1wMCwgdG1wMSwgcm5kX3ZlYyk7CisgICAgdG1wMSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEyLCBzcmMzNCwgZmlsdDAsIGZpbHQxKTsKKyAgICBTUkFSSV9IMl9TSCh0bXAwLCB0bXAxLCA2KTsKICAgICBTQVRfU0gyX1NIKHRtcDAsIHRtcDEsIDcpOwogICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CiAgICAgU1Q4eDJfVUIob3V0LCBkc3QsIGRzdF9zdHJpZGUpOwpAQCAtMjQ1MywxNyArMjY1MCwxNSBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfOHg2X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwogICAgIHVpbnQ2NF90IG91dDAsIG91dDEsIG91dDI7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKICAgICB2OGkxNiB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB0bXAwLCB0bXAxLCB0bXAyOwogICAgIHY4aTE2IGZpbHQsIGZpbHQwLCBmaWx0MTsKLSAgICB2OGkxNiBybmRfdmVjOwogCiAgICAgc3JjIC09IHNyY19zdHJpZGU7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIC8qIHJlYXJyYW5naW5nIGZpbHRlcl95ICovCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CkBAIC0yNDgxLDEwICsyNjc2LDExIEBACiAKICAgICAgICAgWE9SSV9CM18xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSk7CiAgICAgICAgIElMVlJfQjNfU0goc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjNSwgc3JjNCwgdmVjMSwgdmVjMywgdmVjNCk7Ci0gICAgICAgIHRtcDAgPSBGSUxUXzRUQVBfRFBBRERfU19IKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIHRtcDEgPSBGSUxUXzRUQVBfRFBBRERfU19IKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIHRtcDIgPSBGSUxUXzRUQVBfRFBBRERfU19IKHZlYzEsIHZlYzQsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIFNSQVJfSDNfU0godG1wMCwgdG1wMSwgdG1wMiwgcm5kX3ZlYyk7CisgICAgICAgIHRtcDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICB0bXAxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgdG1wMiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzEsIHZlYzQsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIFNSQVJJX0gyX1NIKHRtcDAsIHRtcDEsIDYpOworICAgICAgICB0bXAyID0gX19tc2Ffc3JhcmlfaCh0bXAyLCA2KTsKICAgICAgICAgU0FUX1NIM19TSCh0bXAwLCB0bXAxLCB0bXAyLCA3KTsKICAgICAgICAgUENLRVZfQjJfU0godG1wMSwgdG1wMCwgdG1wMiwgdG1wMiwgdG1wMCwgdG1wMik7CiAgICAgICAgIFhPUklfQjJfMTI4X1NIKHRtcDAsIHRtcDIpOwpAQCAtMjUwNywxOCArMjcwMywxNSBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfOHg0bXVsdF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm5kX3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CiAgICAgdjE2aTggc3JjMTBfciwgc3JjNzJfciwgc3JjOThfciwgc3JjMjFfciwgc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MTsKICAgICB2MTZ1OCB0bXAwLCB0bXAxOwogICAgIHY4aTE2IGZpbHQsIG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcjsKLSAgICB2OGkxNiBybmRfdmVjOwogCiAgICAgc3JjIC09IHNyY19zdHJpZGU7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9IMl9TQihmaWx0LCAwLCAxLCBmaWx0MCwgZmlsdDEpOwpAQCAtMjUzNiwxMSArMjcyOSwxMSBAQAogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CiAgICAgICAgIElMVlJfQjRfU0Ioc3JjNywgc3JjMiwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksCiAgICAgICAgICAgICAgICAgICAgc3JjNzJfciwgc3JjODdfciwgc3JjOThfciwgc3JjMTA5X3IpOwotICAgICAgICBvdXQwX3IgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzEwX3IsIHNyYzcyX3IsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIG91dDFfciA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjMjFfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgb3V0Ml9yID0gRklMVF80VEFQX0RQQUREX1NfSChzcmM3Ml9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBvdXQzX3IgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgcm5kX3ZlYyk7CisgICAgICAgIG91dDBfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwX3IsIHNyYzcyX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIG91dDFfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX3IsIHNyYzg3X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIG91dDJfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzcyX3IsIHNyYzk4X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIG91dDNfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBTUkFSSV9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDYpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7CiAgICAgICAgIHRtcDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDBfciwgb3V0MV9yKTsKICAgICAgICAgdG1wMSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Ml9yLCBvdXQzX3IpOwpAQCAtMjU1NSw4OCArMjc0OCw4NCBAQAogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfOHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKLSAgICAgICAgY29tbW9uX3Z0XzR0Xzh4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgcm5kX3ZhbCk7CisgICAgICAgIGNvbW1vbl92dF80dF84eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIpOwogICAgIH0gZWxzZSBpZiAoNiA9PSBoZWlnaHQpIHsKLSAgICAgICAgY29tbW9uX3Z0XzR0Xzh4Nl9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgcm5kX3ZhbCk7CisgICAgICAgIGNvbW1vbl92dF80dF84eDZfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbW1vbl92dF80dF84eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCBybmRfdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0KTsKICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGNvbW1vbl92dF80dF8xMndfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwogICAgIHYxNnU4IG91dDAsIG91dDE7Ci0gICAgdjhpMTYgc3JjMTAsIHNyYzIxLCBzcmMzMiwgc3JjNDMsIHNyYzU0LCBzcmM2NSwgc3JjODcsIHNyYzEwOSwgc3JjMTIxMTsKLSAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCBmaWx0LCBmaWx0MCwgZmlsdDE7Ci0gICAgdjR1MzIgbWFzayA9IHsgMiwgNiwgMiwgNiB9OwotICAgIHY4aTE2IHJuZF92ZWM7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNTRfciwgc3JjNjVfcjsKKyAgICB2MTZpOCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sOworICAgIHYxNmk4IHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQ7CisgICAgdjhpMTYgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZmlsdDAsIGZpbHQxOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAKLSAgICAvKiByZWFycmFuZ2luZyBmaWx0ZXJfeSAqLwotICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwotICAgIFNQTEFUSV9IMl9TSChmaWx0LCAwLCAxLCBmaWx0MCwgZmlsdDEpOworICAgIHNyYyAtPSAoMSAqIHNyY19zdHJpZGUpOwogCi0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKLQotICAgIHNyYyAtPSBzcmNfc3RyaWRlOworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOworICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CiAgICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CiAKICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBWU0hGX1cyX1NCKHNyYzAsIHNyYzEsIHNyYzEsIHNyYzIsIG1hc2ssIG1hc2ssIHZlYzAsIHZlYzEpOworICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7CisgICAgSUxWTF9CMl9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMxMF9sLCBzcmMyMV9sKTsKKyAgICBzcmMyMTEwID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmMyMV9sLCAodjJpNjQpIHNyYzEwX2wpOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwogICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKIAogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKLSAgICAgICAgSUxWUl9CMl9TSChzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmMxMCwgc3JjMzIpOwotICAgICAgICBWU0hGX1cyX1NCKHNyYzIsIHNyYzMsIHNyYzMsIHNyYzQsIG1hc2ssIG1hc2ssIHZlYzIsIHZlYzMpOwotICAgICAgICBWU0hGX1cyX1NCKHNyYzQsIHNyYzUsIHNyYzUsIHNyYzYsIG1hc2ssIG1hc2ssIHZlYzQsIHZlYzUpOwotICAgICAgICB0bXAwID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMxMCwgc3JjMzIsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIElMVlJfQjRfU0goc3JjMiwgc3JjMSwgc3JjNCwgc3JjMywgc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwKLSAgICAgICAgICAgICAgICAgICBzcmMyMSwgc3JjNDMsIHNyYzU0LCBzcmM2NSk7Ci0gICAgICAgIHRtcDEgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzIxLCBzcmM0MywgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgdG1wMiA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjMzIsIHNyYzU0LCBmaWx0MCwgZmlsdDEpOwotICAgICAgICB0bXAzID0gRklMVF80VEFQX0RQQUREX1NfSChzcmM0Mywgc3JjNjUsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIElMVlJfQjNfU0godmVjMSwgdmVjMCwgdmVjMywgdmVjMiwgdmVjNSwgdmVjNCwgc3JjODcsIHNyYzEwOSwgc3JjMTIxMSk7Ci0gICAgICAgIHRtcDQgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzg3LCBzcmMxMDksIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIHRtcDUgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzEwOSwgc3JjMTIxMSwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgU1JBUl9INF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBybmRfdmVjKTsKLSAgICAgICAgU1JBUl9IMl9TSCh0bXA0LCB0bXA1LCBybmRfdmVjKTsKLSAgICAgICAgU0FUX1NINF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKLSAgICAgICAgU0FUX1NIMl9TSCh0bXA0LCB0bXA1LCA3KTsKLSAgICAgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7Ci0gICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDIsIHRtcDMpOworICAgICAgICBJTFZSX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX3IsIHNyYzQzX3IpOworICAgICAgICBJTFZMX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX2wsIHNyYzQzX2wpOworICAgICAgICBzcmM0MzMyID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmM0M19sLCAodjJpNjQpIHNyYzMyX2wpOworICAgICAgICBJTFZSX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzU0X3IsIHNyYzY1X3IpOworICAgICAgICBJTFZMX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzU0X2wsIHNyYzY1X2wpOworICAgICAgICBzcmM2NTU0ID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmM2NV9sLCAodjJpNjQpIHNyYzU0X2wpOworCisgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQwLCBmaWx0MSk7CisKKyAgICAgICAgU1JBUklfSDRfU0goZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKKyAgICAgICAgU1JBUklfSDJfU0goZHN0MF9sLCBkc3QxX2wsIDYpOworICAgICAgICBTQVRfU0g0X1NIKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgNyk7CisgICAgICAgIFNBVF9TSDJfU0goZHN0MF9sLCBkc3QxX2wsIDcpOworICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihkc3QwX3IsIGRzdDFfcik7CisgICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDJfciwgZHN0M19yKTsKICAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wNCwgdG1wNSk7CisgICAgICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKGRzdDBfbCwgZHN0MV9sKTsKICAgICAgICAgU1Q0eDRfVUIob3V0MCwgb3V0MCwgMCwgMSwgMiwgMywgZHN0ICsgOCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogCi0gICAgICAgIHNyYzAgPSBzcmM0OwotICAgICAgICBzcmMxID0gc3JjNTsKICAgICAgICAgc3JjMiA9IHNyYzY7Ci0gICAgICAgIHZlYzAgPSB2ZWM0OwotICAgICAgICB2ZWMxID0gdmVjNTsKLSAgICAgICAgc3JjMiA9IHNyYzY7CisgICAgICAgIHNyYzEwX3IgPSBzcmM1NF9yOworICAgICAgICBzcmMyMV9yID0gc3JjNjVfcjsKKyAgICAgICAgc3JjMjExMCA9IHNyYzY1NTQ7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfMTZ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzY7CkBAIC0yNjQ0LDEwICsyODMzLDggQEAKICAgICB2MTZpOCBzcmMzMl9sLCBzcmM1NF9sLCBzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBmaWx0MCwgZmlsdDE7CiAgICAgdjE2dTggdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBmaWx0LCBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbDsKLSAgICB2OGkxNiBybmRfdmVjOwogCiAgICAgc3JjIC09IHNyY19zdHJpZGU7Ci0gICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKIAogICAgIGZpbHQgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9IMl9TQihmaWx0LCAwLCAxLCBmaWx0MCwgZmlsdDEpOwpAQCAtMjY2OCwxNiArMjg1NSwxNiBAQAogICAgICAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IsIHNyYzU0X3IsIHNyYzY1X3IpOwogICAgICAgICBJTFZMX0I0X1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsCiAgICAgICAgICAgICAgICAgICAgc3JjMzJfbCwgc3JjNDNfbCwgc3JjNTRfbCwgc3JjNjVfbCk7Ci0gICAgICAgIG91dDBfciA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgb3V0MV9yID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBvdXQyX3IgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIG91dDNfciA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgb3V0MF9sID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMxMF9sLCBzcmMzMl9sLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBvdXQxX2wgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzIxX2wsIHNyYzQzX2wsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIG91dDJfbCA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgb3V0M19sID0gRklMVF80VEFQX0RQQUREX1NfSChzcmM0M19sLCBzcmM2NV9sLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBTUkFSX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgcm5kX3ZlYyk7Ci0gICAgICAgIFNSQVJfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCBybmRfdmVjKTsKKyAgICAgICAgb3V0MF9yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0MV9yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0Ml9yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMzJfciwgc3JjNTRfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0M19yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0MF9sID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfbCwgc3JjMzJfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0MV9sID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfbCwgc3JjNDNfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0Ml9sID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0M19sID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfbCwgc3JjNjVfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA2KTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sLCA2KTsKICAgICAgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDBfbCwgb3V0MV9sLCBvdXQyX2wsIG91dDNfbCwgNyk7CiAgICAgICAgIFBDS0VWX0I0X1VCKG91dDBfbCwgb3V0MF9yLCBvdXQxX2wsIG91dDFfciwgb3V0Ml9sLCBvdXQyX3IsIG91dDNfbCwKQEAgLTI2OTYsOCArMjg4Myw3IEBACiAKIHN0YXRpYyB2b2lkIGNvbW1vbl92dF80dF8yNHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJuZF92YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdWludDY0X3Qgb3V0MCwgb3V0MTsKQEAgLTI3MDcsMTUgKzI4OTMsMTIgQEAKICAgICB2MTZpOCBzcmMxMDlfciwgc3JjMTBfbCwgc3JjMzJfbCwgc3JjMjFfbCwgc3JjNDNfbDsKICAgICB2MTZ1OCBvdXQ7CiAgICAgdjhpMTYgZmlsdCwgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBvdXQwX2wsIG91dDFfbDsKLSAgICB2OGkxNiBybmRfdmVjOwogCiAgICAgc3JjIC09IHNyY19zdHJpZGU7CiAKICAgICBmaWx0ID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDJfU0IoZmlsdCwgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7Ci0KICAgICAvKiAxNiB3aWR0aCAqLwogICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwpAQCAtMjcyOCw3ICsyOTExLDcgQEAKICAgICBYT1JJX0IzXzEyOF9TQihzcmM2LCBzcmM3LCBzcmM4KTsKICAgICBJTFZSX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzc2X3IsIHNyYzg3X3IpOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDg7IGxvb3BfY250LS07KSB7CiAgICAgICAgIC8qIDE2IHdpZHRoICovCiAgICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwogICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKQEAgLTI3NDIsMTggKzI5MjUsMTggQEAKICAgICAgICAgSUxWUl9CMl9TQihzcmM5LCBzcmM4LCBzcmMxMCwgc3JjOSwgc3JjOThfciwgc3JjMTA5X3IpOwogCiAgICAgICAgIC8qIDE2IHdpZHRoICovCi0gICAgICAgIG91dDBfciA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgb3V0MF9sID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMxMF9sLCBzcmMzMl9sLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBvdXQxX3IgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIG91dDFfbCA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjMjFfbCwgc3JjNDNfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0MF9yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0MF9sID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfbCwgc3JjMzJfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0MV9yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0MV9sID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfbCwgc3JjNDNfbCwgZmlsdDAsIGZpbHQxKTsKIAogICAgICAgICAvKiA4IHdpZHRoICovCi0gICAgICAgIG91dDJfciA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgb3V0M19yID0gRklMVF80VEFQX0RQQUREX1NfSChzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0Ml9yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgb3V0M19yID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSk7CiAKICAgICAgICAgLyogMTYgKyA4IHdpZHRoICovCi0gICAgICAgIFNSQVJfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCBybmRfdmVjKTsKLSAgICAgICAgU1JBUl9IMl9TSChvdXQwX2wsIG91dDFfbCwgcm5kX3ZlYyk7CisgICAgICAgIFNSQVJJX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNik7CisgICAgICAgIFNSQVJJX0gyX1NIKG91dDBfbCwgb3V0MV9sLCA2KTsKICAgICAgICAgU0FUX1NINF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIDcpOwogICAgICAgICBTQVRfU0gyX1NIKG91dDBfbCwgb3V0MV9sLCA3KTsKICAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwX3IsIG91dDBfbCk7CkBAIC0yNzgyLDE4ICsyOTY1LDE4IEBACiAgICAgICAgIElMVlJfQjJfU0Ioc3JjMTEsIHNyYzEwLCBzcmM4LCBzcmMxMSwgc3JjNzZfciwgc3JjODdfcik7CiAKICAgICAgICAgLyogMTYgd2lkdGggKi8KLSAgICAgICAgb3V0MF9yID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMzMl9yLCBzcmMxMF9yLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBvdXQwX2wgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzMyX2wsIHNyYzEwX2wsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgIG91dDFfciA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjNDNfciwgc3JjMjFfciwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgb3V0MV9sID0gRklMVF80VEFQX0RQQUREX1NfSChzcmM0M19sLCBzcmMyMV9sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQwX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmMxMF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQwX2wgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9sLCBzcmMxMF9sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQxX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQxX2wgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19sLCBzcmMyMV9sLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgICAgIC8qIDggd2lkdGggKi8KLSAgICAgICAgb3V0Ml9yID0gRklMVF80VEFQX0RQQUREX1NfSChzcmM5OF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICBvdXQzX3IgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzEwOV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQyX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM5OF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQzX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMDlfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxKTsKIAogICAgICAgICAvKiAxNiArIDggd2lkdGggKi8KLSAgICAgICAgU1JBUl9INF9TSChvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsIHJuZF92ZWMpOwotICAgICAgICBTUkFSX0gyX1NIKG91dDBfbCwgb3V0MV9sLCBybmRfdmVjKTsKKyAgICAgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA2KTsKKyAgICAgICAgU1JBUklfSDJfU0gob3V0MF9sLCBvdXQxX2wsIDYpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNyk7CiAgICAgICAgIFNBVF9TSDJfU0gob3V0MF9sLCBvdXQxX2wsIDcpOwogICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDBfciwgb3V0MF9sKTsKQEAgLTI4MDksMTMgKzI5OTIsMTEgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvbW1vbl92dF80dF8zMndfbXVsdF9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgcm5kX3ZhbCwgaW50MzJfdCB3aWR0aCkKK3N0YXRpYyB2b2lkIGNvbW1vbl92dF80dF8zMndfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgdWludDMyX3QgbG9vcF9jbnQsIGNudDsKLSAgICB1aW50OF90ICpkc3RfdG1wLCAqc3JjX3RtcDsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM3Nl9yLCBzcmM5OF9yOwogICAgIHYxNmk4IHNyYzIxX3IsIHNyYzQzX3IsIHNyYzg3X3IsIHNyYzEwOV9yOwpAQCAtMjgyNCwxMjMgKzMwMDUsMTAzIEBACiAgICAgdjE2aTggc3JjMjFfbCwgc3JjNDNfbCwgc3JjODdfbCwgc3JjMTA5X2w7CiAgICAgdjhpMTYgZmlsdDsKICAgICB2MTZpOCBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgcm5kX3ZlYzsKICAgICB2MTZ1OCBvdXQ7CiAKICAgICBzcmMgLT0gc3JjX3N0cmlkZTsKLSAgICBybmRfdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOwogCiAgICAgZmlsdCA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0gyX1NCKGZpbHQsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICBmb3IgKGNudCA9ICh3aWR0aCA+PiA1KTsgY250LS07KSB7Ci0gICAgICAgIGRzdF90bXAgPSBkc3Q7Ci0gICAgICAgIHNyY190bXAgPSBzcmM7CisgICAgLyogMTYgd2lkdGggKi8KKyAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKworICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7CisgICAgSUxWTF9CMl9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMxMF9sLCBzcmMyMV9sKTsKKworICAgIC8qIG5leHQgMTYgd2lkdGggKi8KKyAgICBMRF9TQjMoc3JjICsgMTYsIHNyY19zdHJpZGUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOworCisgICAgWE9SSV9CM18xMjhfU0Ioc3JjNiwgc3JjNywgc3JjOCk7CisgICAgSUxWUl9CMl9TQihzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICBJTFZMX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzc2X2wsIHNyYzg3X2wpOworCisgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMSk7IGxvb3BfY250LS07KSB7CisgICAgICAgIC8qIDE2IHdpZHRoICovCisgICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOworICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKKyAgICAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICAgICAgSUxWTF9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9sLCBzcmM0M19sKTsKIAogICAgICAgICAvKiAxNiB3aWR0aCAqLwotICAgICAgICBMRF9TQjMoc3JjX3RtcCwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7Ci0gICAgICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgICAgICBvdXQwX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQwX2wgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9sLCBzcmMzMl9sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQxX3IgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQxX2wgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9sLCBzcmM0M19sLCBmaWx0MCwgZmlsdDEpOwogCi0gICAgICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7Ci0gICAgICAgIElMVkxfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfbCwgc3JjMjFfbCk7CisgICAgICAgIC8qIDE2IHdpZHRoICovCisgICAgICAgIFNSQVJJX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQwX2wsIG91dDFfbCwgNik7CisgICAgICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDBfbCwgb3V0MV9sLCA3KTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwX3IsIG91dDBfbCk7CisgICAgICAgIFNUX1VCKG91dCwgZHN0KTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQxX3IsIG91dDFfbCk7CisgICAgICAgIFNUX1VCKG91dCwgZHN0ICsgZHN0X3N0cmlkZSk7CisKKyAgICAgICAgc3JjMTBfciA9IHNyYzMyX3I7CisgICAgICAgIHNyYzIxX3IgPSBzcmM0M19yOworICAgICAgICBzcmMxMF9sID0gc3JjMzJfbDsKKyAgICAgICAgc3JjMjFfbCA9IHNyYzQzX2w7CisgICAgICAgIHNyYzIgPSBzcmM0OwogCiAgICAgICAgIC8qIG5leHQgMTYgd2lkdGggKi8KLSAgICAgICAgTERfU0IzKHNyY190bXAgKyAxNiwgc3JjX3N0cmlkZSwgc3JjNiwgc3JjNywgc3JjOCk7Ci0gICAgICAgIHNyY190bXAgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgTERfU0IyKHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM5LCBzcmMxMCk7CisgICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM5LCBzcmMxMCk7CisgICAgICAgIElMVlJfQjJfU0Ioc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzk4X3IsIHNyYzEwOV9yKTsKKyAgICAgICAgSUxWTF9CMl9TQihzcmM5LCBzcmM4LCBzcmMxMCwgc3JjOSwgc3JjOThfbCwgc3JjMTA5X2wpOwogCi0gICAgICAgIFhPUklfQjNfMTI4X1NCKHNyYzYsIHNyYzcsIHNyYzgpOwotICAgICAgICBJTFZSX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzc2X3IsIHNyYzg3X3IpOwotICAgICAgICBJTFZMX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzc2X2wsIHNyYzg3X2wpOworICAgICAgICAvKiBuZXh0IDE2IHdpZHRoICovCisgICAgICAgIG91dDJfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzc2X3IsIHNyYzk4X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIG91dDJfbCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzc2X2wsIHNyYzk4X2wsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIG91dDNfciA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBvdXQzX2wgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM4N19sLCBzcmMxMDlfbCwgZmlsdDAsIGZpbHQxKTsKIAotICAgICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAxKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgICAgIC8qIDE2IHdpZHRoICovCi0gICAgICAgICAgICBMRF9TQjIoc3JjX3RtcCwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLSAgICAgICAgICAgIElMVlJfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfciwgc3JjNDNfcik7Ci0gICAgICAgICAgICBJTFZMX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX2wsIHNyYzQzX2wpOworICAgICAgICAvKiBuZXh0IDE2IHdpZHRoICovCisgICAgICAgIFNSQVJJX0g0X1NIKG91dDJfciwgb3V0M19yLCBvdXQyX2wsIG91dDNfbCwgNik7CisgICAgICAgIFNBVF9TSDRfU0gob3V0Ml9yLCBvdXQzX3IsIG91dDJfbCwgb3V0M19sLCA3KTsKKyAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQyX3IsIG91dDJfbCk7CisgICAgICAgIFNUX1VCKG91dCwgZHN0ICsgMTYpOworICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDNfciwgb3V0M19sKTsKKyAgICAgICAgU1RfVUIob3V0LCBkc3QgKyAxNiArIGRzdF9zdHJpZGUpOwogCi0gICAgICAgICAgICAvKiAxNiB3aWR0aCAqLwotICAgICAgICAgICAgb3V0MF9yID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICAgICAgb3V0MF9sID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMxMF9sLCBzcmMzMl9sLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICAgICAgb3V0MV9yID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEpOwotICAgICAgICAgICAgb3V0MV9sID0gRklMVF80VEFQX0RQQUREX1NfSChzcmMyMV9sLCBzcmM0M19sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QgKz0gMiAqIGRzdF9zdHJpZGU7CiAKLSAgICAgICAgICAgIC8qIDE2IHdpZHRoICovCi0gICAgICAgICAgICBTUkFSX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQwX2wsIG91dDFfbCwgcm5kX3ZlYyk7Ci0gICAgICAgICAgICBTQVRfU0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQwX2wsIG91dDFfbCwgNyk7Ci0gICAgICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDBfciwgb3V0MF9sKTsKLSAgICAgICAgICAgIFNUX1VCKG91dCwgZHN0X3RtcCk7Ci0gICAgICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDFfciwgb3V0MV9sKTsKLSAgICAgICAgICAgIFNUX1VCKG91dCwgZHN0X3RtcCArIGRzdF9zdHJpZGUpOwotCi0gICAgICAgICAgICBzcmMxMF9yID0gc3JjMzJfcjsKLSAgICAgICAgICAgIHNyYzIxX3IgPSBzcmM0M19yOwotICAgICAgICAgICAgc3JjMTBfbCA9IHNyYzMyX2w7Ci0gICAgICAgICAgICBzcmMyMV9sID0gc3JjNDNfbDsKLSAgICAgICAgICAgIHNyYzIgPSBzcmM0OwotCi0gICAgICAgICAgICAvKiBuZXh0IDE2IHdpZHRoICovCi0gICAgICAgICAgICBMRF9TQjIoc3JjX3RtcCArIDE2LCBzcmNfc3RyaWRlLCBzcmM5LCBzcmMxMCk7Ci0gICAgICAgICAgICBzcmNfdG1wICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM5LCBzcmMxMCk7Ci0gICAgICAgICAgICBJTFZSX0IyX1NCKHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM5OF9yLCBzcmMxMDlfcik7Ci0gICAgICAgICAgICBJTFZMX0IyX1NCKHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM5OF9sLCBzcmMxMDlfbCk7Ci0KLSAgICAgICAgICAgIC8qIG5leHQgMTYgd2lkdGggKi8KLSAgICAgICAgICAgIG91dDJfciA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgICAgIG91dDJfbCA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjNzZfbCwgc3JjOThfbCwgZmlsdDAsIGZpbHQxKTsKLSAgICAgICAgICAgIG91dDNfciA9IEZJTFRfNFRBUF9EUEFERF9TX0goc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSk7Ci0gICAgICAgICAgICBvdXQzX2wgPSBGSUxUXzRUQVBfRFBBRERfU19IKHNyYzg3X2wsIHNyYzEwOV9sLCBmaWx0MCwgZmlsdDEpOwotCi0gICAgICAgICAgICAvKiBuZXh0IDE2IHdpZHRoICovCi0gICAgICAgICAgICBTUkFSX0g0X1NIKG91dDJfciwgb3V0M19yLCBvdXQyX2wsIG91dDNfbCwgcm5kX3ZlYyk7Ci0gICAgICAgICAgICBTQVRfU0g0X1NIKG91dDJfciwgb3V0M19yLCBvdXQyX2wsIG91dDNfbCwgNyk7Ci0gICAgICAgICAgICBvdXQgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDJfciwgb3V0Ml9sKTsKLSAgICAgICAgICAgIFNUX1VCKG91dCwgZHN0X3RtcCArIDE2KTsKLSAgICAgICAgICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0M19yLCBvdXQzX2wpOwotICAgICAgICAgICAgU1RfVUIob3V0LCBkc3RfdG1wICsgMTYgKyBkc3Rfc3RyaWRlKTsKLQotICAgICAgICAgICAgZHN0X3RtcCArPSAyICogZHN0X3N0cmlkZTsKLQotICAgICAgICAgICAgc3JjNzZfciA9IHNyYzk4X3I7Ci0gICAgICAgICAgICBzcmM4N19yID0gc3JjMTA5X3I7Ci0gICAgICAgICAgICBzcmM3Nl9sID0gc3JjOThfbDsKLSAgICAgICAgICAgIHNyYzg3X2wgPSBzcmMxMDlfbDsKLSAgICAgICAgICAgIHNyYzggPSBzcmMxMDsKLSAgICAgICAgfQotCi0gICAgICAgIHNyYyArPSAzMjsKLSAgICAgICAgZHN0ICs9IDMyOworICAgICAgICBzcmM3Nl9yID0gc3JjOThfcjsKKyAgICAgICAgc3JjODdfciA9IHNyYzEwOV9yOworICAgICAgICBzcmM3Nl9sID0gc3JjOThfbDsKKyAgICAgICAgc3JjODdfbCA9IHNyYzEwOV9sOworICAgICAgICBzcmM4ID0gc3JjMTA7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb21tb25fdnRfNHRfMzJ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBybmRfdmFsKQotewotICAgIGNvbW1vbl92dF80dF8zMndfbXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGhlaWdodCwgcm5kX3ZhbCwgMzIpOwotfQotCiBzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaV80dF80eDJfbXNhKHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kpCiB7CisgICAgdjE2dTggb3V0OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgdG1wOwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NDsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfcjsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOworICAgIHY4aTE2IGRzdDIwLCBkc3QzMSwgZHN0NDIsIGRzdDEwLCBkc3QzMiwgZHN0MjEsIGRzdDQzOworICAgIHY0aTMyIGRzdDAsIGRzdDE7CiAKICAgICBzcmMgLT0gKHNyY19zdHJpZGUgKyAxKTsKIApAQCAtMjk0OCw2MCArMzEwOSwzNSBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CisgICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CiAKLSAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzIsIHNyYzAsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMzLCBzcmMxLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjNCwgc3JjMiwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKIAotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIGRzdDIwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKLSAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgSUxWUkxfSDJfU0goZHN0MzEsIGRzdDIwLCBkc3QxMCwgZHN0MzIpOworICAgIElMVlJMX0gyX1NIKGRzdDQyLCBkc3QzMSwgZHN0MjEsIGRzdDQzKTsKIAotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgSUxWUl9IMl9TSChkc3QxLCBkc3QwLCBkc3QyLCBkc3QxLCBkc3QxMF9yLCBkc3QyMV9yKTsKLSAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLQotICAgIC8qIHJvdyAzICovCi0gICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0KLSAgICBkc3QzMl9yID0gX19tc2FfaWx2cl9oKGRzdDMsIGRzdDIpOwotICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDBfciA+Pj0gNjsKLQotICAgIC8qIHJvdyA0ICovCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0KLSAgICBkc3Q0M19yID0gX19tc2FfaWx2cl9oKGRzdDQsIGRzdDMpOwotICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDFfciA+Pj0gNjsKLQotICAgIGRzdDBfciA9ICh2NGkzMikgX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDFfciwgKHY4aTE2KSBkc3QwX3IpOwotICAgIGRzdDBfciA9ICh2NGkzMikgX19tc2Ffc3JhcmlfaCgodjhpMTYpIGRzdDBfciwgNik7Ci0gICAgZHN0MF9yID0gKHY0aTMyKSBDTElQX1NIXzBfMjU1KGRzdDBfcik7Ci0gICAgZHN0MF9yID0gKHY0aTMyKSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MF9yLCAodjE2aTgpIGRzdDBfcik7Ci0KLSAgICBTVDR4Ml9VQihkc3QwX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQKGRzdDEwLCBkc3QzMiwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQKGRzdDIxLCBkc3Q0MywgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MCA+Pj0gNjsKKyAgICBkc3QxID4+PSA2OworICAgIHRtcCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QxLCAodjhpMTYpIGRzdDApOworICAgIHRtcCA9IF9fbXNhX3NyYXJpX2godG1wLCA2KTsKKyAgICB0bXAgPSBfX21zYV9zYXRfc19oKHRtcCwgNyk7CisgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQih0bXAsIHRtcCk7CisgICAgU1Q0eDJfVUIob3V0LCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaV80dF80eDRfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTMwMDksMjAgKzMxNDUsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95KQogeworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3I7Ci0gICAgdjhpMTYgb3V0MF9yLCBvdXQxX3I7Ci0gICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0MjFfciwgZHN0NDNfcjsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHRtcDAsIHRtcDE7CisgICAgdjhpMTYgZHN0MzAsIGRzdDQxLCBkc3Q1MiwgZHN0NjM7CisgICAgdjhpMTYgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0MjEsIGRzdDQzLCBkc3Q2NTsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogCiAgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTMwMzAsNzggKzMxNjUsMzggQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OworICAgIExEX1NCNyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgIFhPUklfQjdfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwogCi0gICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7Ci0gICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMzLCBzcmMwLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjNCwgc3JjMSwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzUsIHNyYzIsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmM2LCBzcmMzLCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOwogCi0gICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisgICAgZHN0MzAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDQxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q1MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NjMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKLSAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0KLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLQotICAgIElMVlJfSDJfU0goZHN0MSwgZHN0MCwgZHN0MiwgZHN0MSwgZHN0MTBfciwgZHN0MjFfcik7Ci0gICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7Ci0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7Ci0KLSAgICAvKiByb3cgMyAqLwotICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3QzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotCi0gICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3QzLCBkc3QyKTsKLSAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QwX3IgPj49IDY7Ci0KLSAgICAvKiByb3cgNCAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotCi0gICAgZHN0NDNfciA9IF9fbXNhX2lsdnJfaChkc3Q0LCBkc3QzKTsKLSAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QxX3IgPj49IDY7Ci0KLSAgICAvKiByb3cgNSAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotCi0gICAgZHN0MTBfciA9IF9fbXNhX2lsdnJfaChkc3Q1LCBkc3Q0KTsKLSAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3QxMF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QyX3IgPj49IDY7Ci0KLSAgICAvKiByb3cgNiAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgZHN0MjFfciA9IF9fbXNhX2lsdnJfaChkc3QyLCBkc3Q1KTsKLSAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3QyMV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QzX3IgPj49IDY7Ci0KLSAgICBQQ0tFVl9IMl9TSChkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIG91dDBfciwgb3V0MV9yKTsKLSAgICBTUkFSSV9IMl9TSChvdXQwX3IsIG91dDFfciwgNik7Ci0gICAgQ0xJUF9TSDJfMF8yNTUob3V0MF9yLCBvdXQxX3IpOwotICAgIG91dDBfciA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIG91dDFfciwgKHYxNmk4KSBvdXQwX3IpOwotCi0gICAgU1Q0eDRfVUIob3V0MF9yLCBvdXQwX3IsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgSUxWUkxfSDJfU0goZHN0NDEsIGRzdDMwLCBkc3QxMCwgZHN0NDMpOworICAgIElMVlJMX0gyX1NIKGRzdDUyLCBkc3Q0MSwgZHN0MjEsIGRzdDU0KTsKKyAgICBJTFZSTF9IMl9TSChkc3Q2MywgZHN0NTIsIGRzdDMyLCBkc3Q2NSk7CisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQKGRzdDEwLCBkc3QzMiwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQKGRzdDIxLCBkc3Q0MywgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQKGRzdDMyLCBkc3Q1NCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQKGRzdDQzLCBkc3Q2NSwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1JBXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOworICAgIFBDS0VWX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIHRtcDAsIHRtcDEpOworICAgIFNSQVJJX0gyX1NIKHRtcDAsIHRtcDEsIDYpOworICAgIFNBVF9TSDJfU0godG1wMCwgdG1wMSwgNyk7CisgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQih0bXAwLCB0bXAxKTsKKyAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl91bmlfNHRfNG11bHR4OG11bHRfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTMxMTMsMTkgKzMyMDgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzU7CiAgICAgdjE2aTggc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBkc3Q4LCBkc3Q5OworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2OGkxNiBkc3QxMCwgZHN0MjEsIGRzdDIyLCBkc3Q3MywgZHN0ODQsIGRzdDk1LCBkc3QxMDY7CiAgICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3I7CiAgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKICAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yOwotICAgIHY4aTE2IG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcjsKKyAgICB2OGkxNiBkc3Q5OF9yLCBkc3QxMDlfcjsKIAogICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOwogCkBAIC0zMTMzLDMzICszMjI5LDIzIEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKLQogICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwogCiAgICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwotICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLQotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgSUxWUl9IMl9TSChkc3QxLCBkc3QwLCBkc3QyLCBkc3QxLCBkc3QxMF9yLCBkc3QyMV9yKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMyLCBzcmMxLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIGRzdDEwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgSUxWUkxfSDJfU0goZHN0MjEsIGRzdDEwLCBkc3QxMF9yLCBkc3QyMV9yKTsKKyAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QyMSwgMSk7CiAKICAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDM7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsCkBAIC0zMTY4LDg4ICszMjU0LDQ2IEBACiAKICAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogCi0gICAgICAgIC8qIHJvdyAzICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjNywgc3JjMywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM4LCBzcmM0LCBzcmM4LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzksIHNyYzUsIHNyYzksIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjMTAsIHNyYzYsIHNyYzEwLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOwogCi0gICAgICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0MywgZHN0Mik7CisgICAgICAgIGRzdDczID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0ODQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q5NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEwNiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisKKyAgICAgICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3Q3MywgZHN0MjIpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q4NCwgZHN0NzMsIGRzdDQzX3IsIGRzdDg3X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q5NSwgZHN0ODQsIGRzdDU0X3IsIGRzdDk4X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDYsIGRzdDk1LCBkc3Q2NV9yLCBkc3QxMDlfcik7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDczLCAxKTsKKyAgICAgICAgZHN0NzZfciA9IF9fbXNhX2lsdnJfaChkc3QyMiwgZHN0MTA2KTsKKwogICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MF9yID4+PSA2OwotCi0gICAgICAgIC8qIHJvdyA0ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0KLSAgICAgICAgZHN0NDNfciA9IF9fbXNhX2lsdnJfaChkc3Q0LCBkc3QzKTsKICAgICAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDFfciA+Pj0gNjsKLQotICAgICAgICAvKiByb3cgNSAqLwotICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotCi0gICAgICAgIGRzdDU0X3IgPSBfX21zYV9pbHZyX2goZHN0NSwgZHN0NCk7CiAgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QyX3IgPj49IDY7Ci0KLSAgICAgICAgLyogcm93IDYgKi8KLSAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q2ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q2LCBkc3Q2KTsKLQotICAgICAgICBkc3Q2NV9yID0gX19tc2FfaWx2cl9oKGRzdDYsIGRzdDUpOwogICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0M19yID4+PSA2OwotCi0gICAgICAgIC8qIHJvdyA3ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NywgZHN0Nyk7Ci0KLSAgICAgICAgZHN0NzZfciA9IF9fbXNhX2lsdnJfaChkc3Q3LCBkc3Q2KTsKICAgICAgICAgZHN0NF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0NTRfciwgZHN0NzZfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDRfciA+Pj0gNjsKLQotICAgICAgICAvKiByb3cgOCAqLwotICAgICAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDggPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDgsIGRzdDgpOwotCi0gICAgICAgIGRzdDg3X3IgPSBfX21zYV9pbHZyX2goZHN0OCwgZHN0Nyk7CiAgICAgICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q1X3IgPj49IDY7Ci0KLSAgICAgICAgLyogcm93IDkgKi8KLSAgICAgICAgVlNIRl9CMl9TQihzcmM5LCBzcmM5LCBzcmM5LCBzcmM5LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q5ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q5LCBkc3Q5KTsKLQotICAgICAgICBkc3QxMF9yID0gX19tc2FfaWx2cl9oKGRzdDksIGRzdDgpOwotICAgICAgICBkc3Q2X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Nl9yLCBkc3QxMF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0Nl9yID4+PSA2OwotCi0gICAgICAgIC8qIHJvdyAxMCAqLwotICAgICAgICBWU0hGX0IyX1NCKHNyYzEwLCBzcmMxMCwgc3JjMTAsIHNyYzEwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLQotICAgICAgICBkc3QyMV9yID0gX19tc2FfaWx2cl9oKGRzdDIsIGRzdDkpOwotICAgICAgICBkc3Q3X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QyMV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0N19yID4+PSA2OwotCisgICAgICAgIGRzdDZfciA9IEhFVkNfRklMVF80VEFQKGRzdDc2X3IsIGRzdDk4X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q3X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIDYpOworICAgICAgICBTUkFfNFYoZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yLCA2KTsKICAgICAgICAgUENLRVZfSDRfU0goZHN0MV9yLCBkc3QwX3IsIGRzdDNfciwgZHN0Ml9yLAogICAgICAgICAgICAgICAgICAgICBkc3Q1X3IsIGRzdDRfciwgZHN0N19yLCBkc3Q2X3IsCi0gICAgICAgICAgICAgICAgICAgIG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcik7Ci0KLSAgICAgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA2KTsKLSAgICAgICAgQ0xJUF9TSDRfMF8yNTUob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yKTsKLQotICAgICAgICBQQ0tFVl9CMl9TSChvdXQxX3IsIG91dDBfciwgb3V0M19yLCBvdXQyX3IsIG91dDBfciwgb3V0MV9yKTsKLSAgICAgICAgU1Q0eDhfVUIob3V0MF9yLCBvdXQxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBTUkFSSV9INF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA2KTsKKyAgICAgICAgU0FUX1NINF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKKyAgICAgICAgb3V0MCA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMCwgdG1wMSk7CisgICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDIsIHRtcDMpOworICAgICAgICBTVDR4OF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKKworICAgICAgICBkc3QxMF9yID0gZHN0OThfcjsKKyAgICAgICAgZHN0MjFfciA9IGRzdDEwOV9yOworICAgICAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QxMDYsIDEpOwogICAgIH0KIH0KIApAQCAtMzI2MywxMCArMzMwNywxMCBAQAogewogICAgIGlmICgyID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h2X3VuaV80dF80eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3kpOwogICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19odl91bmlfNHRfNHg0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95KTsKICAgICB9IGVsc2UgaWYgKDAgPT0gKGhlaWdodCAlIDgpKSB7CiAgICAgICAgIGhldmNfaHZfdW5pXzR0XzRtdWx0eDhtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0KTsKQEAgLTMyODEsMTkgKzMzMjUsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKKyAgICB2MTZpOCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRlcl92ZWM7CisgICAgdjhpMTYgZHN0aDAsIGRzdGgxLCBkc3RoMiwgZHN0aDMsIGRzdGg0LCBkc3RoNSwgZHN0aDYsIGRzdGg3LCBkc3RoOCwgZHN0aDk7CisgICAgdjhpMTYgZHN0aDEwLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OwogICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOworICAgIHY0aTMyIGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfcjsKICAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwogICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDIxX2wsIGRzdDQzX2w7Ci0gICAgdjhpMTYgb3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yOworICAgIHY4aTE2IGRzdDU0X3IsIGRzdDc2X3IsIGRzdDk4X3IsIGRzdDY1X3IsIGRzdDg3X3IsIGRzdDEwOV9yOworICAgIHY4aTE2IGRzdDk4X2wsIGRzdDY1X2wsIGRzdDU0X2wsIGRzdDc2X2wsIGRzdDg3X2wsIGRzdDEwOV9sOworICAgIHY4aTE2IGRzdDEwMjFfbCwgZHN0MzI0M19sLCBkc3Q1NDY1X2wsIGRzdDc2ODdfbCwgZHN0OTgxMDlfbDsKIAogICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOwogCkBAIC0zMzAxLDE2ICszMzQ5LDEyIEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKLQogICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwogCkBAIC0zMzIwLDc5ICszMzY0LDc4IEBACiAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwogICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKIAotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOworICAgIGRzdGgwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDEsIGRzdGgwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMiwgZHN0aDEsIGRzdDIxX3IsIGRzdDIxX2wpOwogCi0gICAgZm9yIChsb29wX2NudCA9IGhlaWdodCA+PiAyOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgIFhPUklfQjhfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKIAotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CiAKLSAgICAgICAgLyogcm93IDMgKi8KLSAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKKyAgICBkc3RoMyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGg1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoNiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QwX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9sLCBkc3QzMl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MF9yID4+PSA2OwotICAgICAgICBkc3QwX2wgPj49IDY7CisgICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzksIHNyYzksIHNyYzksIHNyYzksIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMxMCwgc3JjMTAsIHNyYzEwLCBzcmMxMCwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKIAotICAgICAgICAvKiByb3cgNCAqLwotICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOworICAgIGRzdGg3ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoOCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDkgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGgxMCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7Ci0gICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MV9yID4+PSA2OwotICAgICAgICBkc3QxX2wgPj49IDY7CisgICAgSUxWUkxfSDJfU0goZHN0aDMsIGRzdGgyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoNCwgZHN0aDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg1LCBkc3RoNCwgZHN0NTRfciwgZHN0NTRfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDYsIGRzdGg1LCBkc3Q2NV9yLCBkc3Q2NV9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoNywgZHN0aDYsIGRzdDc2X3IsIGRzdDc2X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg4LCBkc3RoNywgZHN0ODdfciwgZHN0ODdfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDksIGRzdGg4LCBkc3Q5OF9yLCBkc3Q5OF9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMTAsIGRzdGg5LCBkc3QxMDlfciwgZHN0MTA5X2wpOwogCi0gICAgICAgIC8qIHJvdyA1ICovCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7CisgICAgUENLRVZfRDJfU0goZHN0MjFfbCwgZHN0MTBfbCwgZHN0NDNfbCwgZHN0MzJfbCwgZHN0MTAyMV9sLCBkc3QzMjQzX2wpOworICAgIFBDS0VWX0QyX1NIKGRzdDY1X2wsIGRzdDU0X2wsIGRzdDg3X2wsIGRzdDc2X2wsIGRzdDU0NjVfbCwgZHN0NzY4N19sKTsKKyAgICBkc3Q5ODEwOV9sID0gKHY4aTE2KSBfX21zYV9wY2tldl9kKCh2Mmk2NCkgZHN0MTA5X2wsICh2Mmk2NCkgZHN0OThfbCk7CiAKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDEwX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3QxMF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLQotICAgICAgICBkc3QyX3IgPj49IDY7Ci0gICAgICAgIGRzdDJfbCA+Pj0gNjsKLQotICAgICAgICAvKiByb3cgNiAqLwotICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDUsIGRzdDIxX3IsIGRzdDIxX2wpOwotICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3QyMV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0MjFfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0KLSAgICAgICAgZHN0M19yID4+PSA2OwotICAgICAgICBkc3QzX2wgPj49IDY7Ci0KLSAgICAgICAgUENLRVZfSDRfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgIG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcik7Ci0KLSAgICAgICAgU1JBUklfSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA2KTsKLSAgICAgICAgQ0xJUF9TSDRfMF8yNTUob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yKTsKLQotICAgICAgICBQQ0tFVl9CMl9TSChvdXQxX3IsIG91dDBfciwgb3V0M19yLCBvdXQyX3IsIG91dDBfciwgb3V0MV9yKTsKLSAgICAgICAgU1Q2eDRfVUIob3V0MF9yLCBvdXQxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q1X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q2X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Nl9yLCBkc3Q5OF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q3X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTAyMV9sLCBkc3QzMjQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyNDNfbCwgZHN0NTQ2NV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NDY1X2wsIGRzdDc2ODdfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NzY4N19sLCBkc3Q5ODEwOV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKKyAgICBTUkFfNFYoZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yLCA2KTsKKyAgICBTUkFfNFYoZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCA2KTsKKyAgICBQQ0tFVl9IMl9TSChkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIHRtcDAsIHRtcDEpOworICAgIFBDS0VWX0gyX1NIKGRzdDVfciwgZHN0NF9yLCBkc3Q3X3IsIGRzdDZfciwgdG1wMiwgdG1wMyk7CisgICAgUENLRVZfSDJfU0goZHN0MV9sLCBkc3QwX2wsIGRzdDNfbCwgZHN0Ml9sLCB0bXA0LCB0bXA1KTsKKyAgICBTUkFSSV9INF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA2KTsKKyAgICBTUkFSSV9IMl9TSCh0bXA0LCB0bXA1LCA2KTsKKyAgICBTQVRfU0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsNyk7CisgICAgU0FUX1NIMl9TSCh0bXA0LCB0bXA1LDcpOworICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDAsIHRtcDEpOworICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDIsIHRtcDMpOworICAgIG91dDIgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDQsIHRtcDUpOworICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgU1QyeDRfVUIob3V0MiwgMCwgZHN0ICsgNCwgZHN0X3N0cmlkZSk7CisgICAgZHN0ICs9IDQgKiBkc3Rfc3RyaWRlOworICAgIFNUMng0X1VCKG91dDIsIDQsIGRzdCArIDQsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaV80dF84eDJfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTM0MDAsMTYgKzM0NDMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95KQogeworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdGVyX3ZlYzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzk7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NDsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2w7CiAgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0MjFfciwgZHN0NDNfcjsKQEAgLTM0MjIsNjYgKzM0NjQsMTI1IEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKLQotICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwotCi0gICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisgICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CiAKICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwogICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzgsIHZlYzkpOwogCi0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0KKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjOCwgdmVjOSwgZmlsdDAsIGZpbHQxKTsKICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKICAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3QxLCBkc3QyMV9yLCBkc3QyMV9sKTsKLQotICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzMsIHNyYzQpOwotCi0gICAgLyogcm93IDMgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQogICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOwogICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDBfciA+Pj0gNjsKLSAgICBkc3QwX2wgPj49IDY7Ci0KLSAgICAvKiByb3cgNCAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotCi0gICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CiAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MV9yID4+PSA2OwotICAgIGRzdDFfbCA+Pj0gNjsKLQorICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOwogICAgIFBDS0VWX0gyX1NIKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgb3V0MF9yLCBvdXQxX3IpOwogICAgIFNSQVJJX0gyX1NIKG91dDBfciwgb3V0MV9yLCA2KTsKLSAgICBDTElQX1NIMl8wXzI1NShvdXQwX3IsIG91dDFfcik7Ci0gICAgb3V0MF9yID0gKHY4aTE2KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgb3V0MV9yLCAodjE2aTgpIG91dDBfcik7CisgICAgU0FUX1NIMl9TSChvdXQwX3IsIG91dDFfciwgNyk7CisgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQwX3IsIG91dDFfcik7CisgICAgU1Q4eDJfVUIob3V0LCBkc3QsIGRzdF9zdHJpZGUpOworfQogCi0gICAgU1Q4eDJfVUIob3V0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOworc3RhdGljIHZvaWQgaGV2Y19odl91bmlfNHRfOG11bHR4NF9tc2EodWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoOG11bHQpCit7CisgICAgdWludDMyX3QgY250OworICAgIHYxNnU4IG91dDAsIG91dDE7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgbWFzazAsIG1hc2sxOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0ZXJfdmVjOworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2w7CisgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfcjsKKyAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sOworCisgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3gpOworICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOworCisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKKyAgICBtYXNrMSA9IG1hc2swICsgMjsKKworICAgIGZvciAoY250ID0gd2lkdGg4bXVsdDsgY250LS07KSB7CisgICAgICAgIExEX1NCNyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgICAgICBzcmMgKz0gODsKKyAgICAgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworCisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDEwX3IsIGRzdDEwX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3QxLCBkc3QyMV9yLCBkc3QyMV9sKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q1LCBkc3Q0LCBkc3Q1NF9yLCBkc3Q1NF9sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0NiwgZHN0NSwgZHN0NjVfciwgZHN0NjVfbCk7CisKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDNfbCA9IEhFVkNfRklMVF80VEFQKGRzdDQzX2wsIGRzdDY1X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKworICAgICAgICBQQ0tFVl9INF9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsCisgICAgICAgICAgICAgICAgICAgIGRzdDNfciwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFNSQVJJX0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDYpOworICAgICAgICBTQVRfU0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOworICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQih0bXAwLCB0bXAxKTsKKyAgICAgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMiwgdG1wMyk7CisgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSA4OworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl91bmlfNHRfOHg2X21zYSh1aW50OF90ICpzcmMsCkBAIC0zNDg5LDE2ICszNTkwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSkKIHsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzg7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0ZXJfdmVjOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgdmVjOCwgdmVjOTsKKyAgICB2MTZpOCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCB2ZWMxNiwgdmVjMTc7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0ODsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKICAgICB2NGkzMiBkc3Q0X3IsIGRzdDRfbCwgZHN0NV9yLCBkc3Q1X2w7CkBAIC0zNTE0LDE1NyArMzYxNSwxMDQgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OworICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOworICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwogCi0gICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7Ci0gICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7Ci0KLSAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBYT1JJX0I1XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKIAogICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjOCwgdmVjOSk7CisgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzEwLCB2ZWMxMSk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzEyLCB2ZWMxMyk7CisgICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzE0LCB2ZWMxNSk7CisgICAgVlNIRl9CMl9TQihzcmM4LCBzcmM4LCBzcmM4LCBzcmM4LCBtYXNrMCwgbWFzazEsIHZlYzE2LCB2ZWMxNyk7CiAKLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjOCwgdmVjOSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxMiwgdmVjMTMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q4ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMTYsIHZlYzE3LCBmaWx0MCwgZmlsdDEpOwogCiAgICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7CiAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7Ci0KLSAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLQotICAgIFhPUklfQjJfMTI4X1NCKHNyYzMsIHNyYzQpOwotCi0gICAgLyogcm93IDMgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQogICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDYsIGRzdDUsIGRzdDY1X3IsIGRzdDY1X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDcsIGRzdDYsIGRzdDc2X3IsIGRzdDc2X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOworCiAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0KLSAgICBkc3QwX3IgPj49IDY7Ci0gICAgZHN0MF9sID4+PSA2OwotCi0gICAgLyogcm93IDQgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLQotICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOwogICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDFfciA+Pj0gNjsKLSAgICBkc3QxX2wgPj49IDY7Ci0KLSAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2KTsKLSAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLQotICAgIFhPUklfQjJfMTI4X1NCKHNyYzUsIHNyYzYpOwotCi0gICAgLyogcm93IDUgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKLQotICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOwogICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDU0X2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDJfciA+Pj0gNjsKLSAgICBkc3QyX2wgPj49IDY7Ci0KLSAgICAvKiByb3cgNiAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q2ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDYsIGRzdDYpOwotCi0gICAgSUxWUkxfSDJfU0goZHN0NiwgZHN0NSwgZHN0NjVfciwgZHN0NjVfbCk7CiAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0M19yID4+PSA2OwotICAgIGRzdDNfbCA+Pj0gNjsKLQotICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgpOwotICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotCi0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjNywgc3JjOCk7Ci0KLSAgICAvKiByb3cgNyAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q3ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDcsIGRzdDcpOwotCi0gICAgSUxWUkxfSDJfU0goZHN0NywgZHN0NiwgZHN0NzZfciwgZHN0NzZfbCk7CiAgICAgZHN0NF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0NTRfciwgZHN0NzZfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0NF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0NTRfbCwgZHN0NzZfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0KLSAgICBkc3Q0X3IgPj49IDY7Ci0gICAgZHN0NF9sID4+PSA2OwotCi0gICAgLyogcm93IDggKi8KLSAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0OCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q4LCBkc3Q4KTsKLQotICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOwogICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDVfbCA9IEhFVkNfRklMVF80VEFQKGRzdDY1X2wsIGRzdDg3X2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDVfciA+Pj0gNjsKLSAgICBkc3Q1X2wgPj49IDY7CiAKKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKKyAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICBTUkFfNFYoZHN0NF9yLCBkc3Q0X2wsIGRzdDVfciwgZHN0NV9sLCA2KTsKICAgICBQQ0tFVl9INF9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCiAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IpOwogICAgIFBDS0VWX0gyX1NIKGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwgb3V0NF9yLCBvdXQ1X3IpOwogICAgIFNSQVJJX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNik7CiAgICAgU1JBUklfSDJfU0gob3V0NF9yLCBvdXQ1X3IsIDYpOwotICAgIENMSVBfU0g0XzBfMjU1KG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcik7Ci0gICAgQ0xJUF9TSDJfMF8yNTUob3V0NF9yLCBvdXQ1X3IpOworICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKKyAgICBTQVRfU0gyX1NIKG91dDRfciwgb3V0NV9yLCA3KTsKKyAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQihvdXQwX3IsIG91dDFfcik7CisgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIob3V0Ml9yLCBvdXQzX3IpOworICAgIG91dDIgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDRfciwgb3V0NV9yKTsKIAotICAgIFBDS0VWX0IyX1NIKG91dDFfciwgb3V0MF9yLCBvdXQzX3IsIG91dDJfciwgb3V0MF9yLCBvdXQxX3IpOwotICAgIG91dDJfciA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIG91dDVfciwgKHYxNmk4KSBvdXQ0X3IpOwotCi0gICAgU1Q4eDRfVUIob3V0MF9yLCBvdXQxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICBTVDh4Ml9VQihvdXQyX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgU1Q4eDJfVUIob3V0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgaGV2Y19odl91bmlfNHRfOHdfbXVsdF9tc2EodWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgpCitzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaV80dF84bXVsdHg0bXVsdF9tc2EodWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoOG11bHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQsIGNudDsKICAgICB1aW50OF90ICpzcmNfdG1wOwogICAgIHVpbnQ4X3QgKmRzdF90bXA7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdGVyX3ZlYzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKICAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwogICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDIxX2wsIGRzdDQzX2w7CisgICAgdjhpMTYgZHN0NTRfciwgZHN0NTRfbCwgZHN0NjVfciwgZHN0NjVfbCwgZHN0NjsKICAgICB2OGkxNiBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3I7CiAKICAgICBzcmMgLT0gKHNyY19zdHJpZGUgKyAxKTsKQEAgLTM2NzMsMTcgKzM3MjEsMTMgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwotCi0gICAgZm9yIChjbnQgPSB3aWR0aCA+PiAzOyBjbnQtLTspIHsKKyAgICBmb3IgKGNudCA9IHdpZHRoOG11bHQ7IGNudC0tOykgewogICAgICAgICBzcmNfdG1wID0gc3JjOwogICAgICAgICBkc3RfdG1wID0gZHN0OwogCkBAIC0zNjk2LDc5ICszNzQwLDYyIEBACiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwogCi0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CiAKICAgICAgICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7CiAgICAgICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDEsIGRzdDIxX3IsIGRzdDIxX2wpOwogCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMjsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CiAgICAgICAgICAgICBMRF9TQjQoc3JjX3RtcCwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CiAgICAgICAgICAgICBzcmNfdG1wICs9ICg0ICogc3JjX3N0cmlkZSk7CiAKICAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwogCi0gICAgICAgICAgICAvKiByb3cgMyAqLwogICAgICAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworCisgICAgICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICAgICAgZHN0NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKIAogICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q0M19yLCBkc3Q0M19sKTsKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NiwgZHN0NSwgZHN0NjVfciwgZHN0NjVfbCk7CisKICAgICAgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgICAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0KLSAgICAgICAgICAgIGRzdDBfciA+Pj0gNjsKLSAgICAgICAgICAgIGRzdDBfbCA+Pj0gNjsKLQotICAgICAgICAgICAgLyogcm93IDQgKi8KLSAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLQotICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CiAgICAgICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICAgICAgICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0MV9yID4+PSA2OwotICAgICAgICAgICAgZHN0MV9sID4+PSA2OworICAgICAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKLSAgICAgICAgICAgIC8qIHJvdyA1ICovCi0gICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7Ci0KLSAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDEwX3IsIGRzdDEwX2wpOwotICAgICAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0MTBfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3QxMF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLQotICAgICAgICAgICAgZHN0Ml9yID4+PSA2OwotICAgICAgICAgICAgZHN0Ml9sID4+PSA2OwotCi0gICAgICAgICAgICAvKiByb3cgNiAqLwotICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3Q1LCBkc3QyMV9yLCBkc3QyMV9sKTsKLSAgICAgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDIxX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0MjFfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0KLSAgICAgICAgICAgIGRzdDNfciA+Pj0gNjsKLSAgICAgICAgICAgIGRzdDNfbCA+Pj0gNjsKKyAgICAgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICAgICAgU1JBXzRWKGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbCwgNik7CiAKICAgICAgICAgICAgIFBDS0VWX0g0X1NIKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwKICAgICAgICAgICAgICAgICAgICAgICAgIG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfcik7CiAKICAgICAgICAgICAgIFNSQVJJX0g0X1NIKG91dDBfciwgb3V0MV9yLCBvdXQyX3IsIG91dDNfciwgNik7Ci0gICAgICAgICAgICBDTElQX1NINF8wXzI1NShvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IpOwotCi0gICAgICAgICAgICBQQ0tFVl9CMl9TSChvdXQxX3IsIG91dDBfciwgb3V0M19yLCBvdXQyX3IsIG91dDBfciwgb3V0MV9yKTsKLSAgICAgICAgICAgIFNUOHg0X1VCKG91dDBfciwgb3V0MV9yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFNBVF9TSDRfU0gob3V0MF9yLCBvdXQxX3IsIG91dDJfciwgb3V0M19yLCA3KTsKKyAgICAgICAgICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDBfciwgb3V0MV9yKTsKKyAgICAgICAgICAgIG91dDEgPSBQQ0tFVl9YT1JJMTI4X1VCKG91dDJfciwgb3V0M19yKTsKKyAgICAgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdF90bXAsIGRzdF9zdHJpZGUpOwogICAgICAgICAgICAgZHN0X3RtcCArPSAoNCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgICAgICBkc3QxMF9yID0gZHN0NTRfcjsKKyAgICAgICAgICAgIGRzdDEwX2wgPSBkc3Q1NF9sOworICAgICAgICAgICAgZHN0MjFfciA9IGRzdDY1X3I7CisgICAgICAgICAgICBkc3QyMV9sID0gZHN0NjVfbDsKKyAgICAgICAgICAgIGRzdDIgPSBkc3Q2OwogICAgICAgICB9CiAKICAgICAgICAgc3JjICs9IDg7CkBAIC0zNzg2LDEzICszODEzLDE2IEBACiB7CiAgICAgaWYgKDIgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfaHZfdW5pXzR0Xzh4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBoZXZjX2h2X3VuaV80dF84bXVsdHg0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCAxKTsKICAgICB9IGVsc2UgaWYgKDYgPT0gaGVpZ2h0KSB7CiAgICAgICAgIGhldmNfaHZfdW5pXzR0Xzh4Nl9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSk7CiAgICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSA0KSkgewotICAgICAgICBoZXZjX2h2X3VuaV80dF84d19tdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDgpOworICAgICAgICBoZXZjX2h2X3VuaV80dF84bXVsdHg0bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgMSk7CiAgICAgfQogfQogCkBAIC0zODA0LDExICszODM0LDE2NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2X3VuaV80dF84d19tdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgOCk7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDhfdCAqc3JjX3RtcCwgKmRzdF90bXA7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szOworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdGVyX3ZlYywgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2OGkxNiBkc3RoMCwgZHN0aDEsIGRzdGgyLCBkc3RoMywgZHN0aDQsIGRzdGg1LCBkc3RoNjsKKyAgICB2OGkxNiBkc3QxMCwgZHN0MjEsIGRzdDIyLCBkc3Q3MywgZHN0ODQsIGRzdDk1LCBkc3QxMDY7CisgICAgdjhpMTYgZHN0NzZfciwgZHN0OThfciwgZHN0ODdfciwgZHN0MTA5X3I7CisgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfcjsKKyAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sOworICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOworICAgIHY0aTMyIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CiAKLSAgICBoZXZjX2h2X3VuaV80dF80d19tc2Eoc3JjICsgOCwgc3JjX3N0cmlkZSwgZHN0ICsgOCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOworICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKKyAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKKworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKKworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKworICAgIG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CisgICAgbWFzazEgPSBtYXNrMCArIDI7CisKKyAgICBzcmNfdG1wID0gc3JjOworICAgIGRzdF90bXAgPSBkc3Q7CisKKyAgICBMRF9TQjMoc3JjX3RtcCwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgc3JjX3RtcCArPSAoMyAqIHNyY19zdHJpZGUpOworCisgICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKworICAgIGRzdGgwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworCisgICAgSUxWUkxfSDJfU0goZHN0aDEsIGRzdGgwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMiwgZHN0aDEsIGRzdDIxX3IsIGRzdDIxX2wpOworCisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmNfdG1wLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjX3RtcCArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisKKyAgICAgICAgZHN0aDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3RoNCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdGg1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0aDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworCisgICAgICAgIElMVlJMX0gyX1NIKGRzdGgzLCBkc3RoMiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg0LCBkc3RoMywgZHN0NDNfciwgZHN0NDNfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg1LCBkc3RoNCwgZHN0NTRfciwgZHN0NTRfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdGg2LCBkc3RoNSwgZHN0NjVfciwgZHN0NjVfbCk7CisKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDNfbCA9IEhFVkNfRklMVF80VEFQKGRzdDQzX2wsIGRzdDY1X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKworICAgICAgICBQQ0tFVl9INF9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsCisgICAgICAgICAgICAgICAgICAgIGRzdDNfciwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFNSQVJJX0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDYpOworICAgICAgICBTQVRfU0g0X1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOworICAgICAgICBvdXQwID0gUENLRVZfWE9SSTEyOF9VQih0bXAwLCB0bXAxKTsKKyAgICAgICAgb3V0MSA9IFBDS0VWX1hPUkkxMjhfVUIodG1wMiwgdG1wMyk7CisgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdF90bXAsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3RfdG1wICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgZHN0MTBfciA9IGRzdDU0X3I7CisgICAgICAgIGRzdDEwX2wgPSBkc3Q1NF9sOworICAgICAgICBkc3QyMV9yID0gZHN0NjVfcjsKKyAgICAgICAgZHN0MjFfbCA9IGRzdDY1X2w7CisgICAgICAgIGRzdGgyID0gZHN0aDY7CisgICAgfQorCisgICAgc3JjICs9IDg7CisgICAgZHN0ICs9IDg7CisKKyAgICBtYXNrMiA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CisgICAgbWFzazMgPSBtYXNrMiArIDI7CisKKyAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMyLCBzcmMxLCBzcmMyLCBtYXNrMiwgbWFzazMsIHZlYzIsIHZlYzMpOworCisgICAgZHN0MTAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKworICAgIElMVlJMX0gyX1NIKGRzdDIxLCBkc3QxMCwgZHN0MTBfciwgZHN0MjFfcik7CisgICAgZHN0MjIgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MjEsIDEpOworCisgICAgZm9yIChsb29wX2NudCA9IDI7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjNywgc3JjMywgc3JjNywgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM4LCBzcmM0LCBzcmM4LCBtYXNrMiwgbWFzazMsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzksIHNyYzUsIHNyYzksIG1hc2syLCBtYXNrMywgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjMTAsIHNyYzYsIHNyYzEwLCBtYXNrMiwgbWFzazMsIHZlYzYsIHZlYzcpOworCisgICAgICAgIGRzdDczID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0ODQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q5NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEwNiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisKKyAgICAgICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3Q3MywgZHN0MjIpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q4NCwgZHN0NzMsIGRzdDQzX3IsIGRzdDg3X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q5NSwgZHN0ODQsIGRzdDU0X3IsIGRzdDk4X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDYsIGRzdDk1LCBkc3Q2NV9yLCBkc3QxMDlfcik7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDczLCAxKTsKKyAgICAgICAgZHN0NzZfciA9IF9fbXNhX2lsdnJfaChkc3QyMiwgZHN0MTA2KTsKKworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVAoZHN0NzZfciwgZHN0OThfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIFNSQV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICAgICAgU1JBXzRWKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIDYpOworICAgICAgICBQQ0tFVl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LAorICAgICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgU1JBUklfSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNik7CisgICAgICAgIFNBVF9TSDRfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CisgICAgICAgIG91dDAgPSBQQ0tFVl9YT1JJMTI4X1VCKHRtcDAsIHRtcDEpOworICAgICAgICBvdXQxID0gUENLRVZfWE9SSTEyOF9VQih0bXAyLCB0bXAzKTsKKyAgICAgICAgU1Q0eDhfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgZHN0MTBfciA9IGRzdDk4X3I7CisgICAgICAgIGRzdDIxX3IgPSBkc3QxMDlfcjsKKyAgICAgICAgZHN0MjIgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MTA2LCAxKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfdW5pXzR0XzE2d19tc2EodWludDhfdCAqc3JjLApAQCAtMzgxOSw4ICs0MDAyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfaHZfdW5pXzR0Xzh3X211bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCAxNik7CisgICAgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIGhldmNfaHZfdW5pXzR0XzhtdWx0eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3ksIDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGhldmNfaHZfdW5pXzR0XzhtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCAyKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfdW5pXzR0XzI0d19tc2EodWludDhfdCAqc3JjLApAQCAtMzgzMSw4ICs0MDE5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19odl91bmlfNHRfOHdfbXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDI0KTsKKyAgICBoZXZjX2h2X3VuaV80dF84bXVsdHg0bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCAzKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl91bmlfNHRfMzJ3X21zYSh1aW50OF90ICpzcmMsCkBAIC0zODQzLDggKzQwMzEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2X3VuaV80dF84d19tdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgMzIpOworICAgIGhldmNfaHZfdW5pXzR0XzhtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDQpOwogfQogCiAjZGVmaW5lIFVOSV9NQ19DT1BZKFdJRFRIKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zODcyLDIwICs0MDYwLDE4IEBACiAKICNkZWZpbmUgVU5JX01DKFBFTCwgRElSLCBXSURUSCwgVEFQLCBESVIxLCBGSUxUX0RJUikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB2b2lkIGZmX2hldmNfcHV0X2hldmNfdW5pXyMjUEVMIyNfIyNESVIjI1dJRFRIIyNfOF9tc2EodWludDhfdCAqZHN0LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUsICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUsICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXgsICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG15LCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY19zdHJpZGUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIgPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tGSUxUX0RJUiAtIDFdOyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjb21tb25fIyNESVIxIyNfIyNUQVAjI3RfIyNXSURUSCMjd19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCA2KTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGhlaWdodCk7ICAgICAgICAgICAgICAgICAgIFwKIH0KIAogVU5JX01DKHFwZWwsIGgsIDQsIDgsIGh6LCBteCk7CkBAIC0zOTI0LDQxICs0MTEwLDM4IEBACiAKICN1bmRlZiBVTklfTUMKIAotI2RlZmluZSBVTklfTUNfSFYoUEVMLCBESVIsIFdJRFRILCBUQVAsIERJUjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdm9pZCBmZl9oZXZjX3B1dF9oZXZjX3VuaV8jI1BFTCMjXyMjRElSIyNXSURUSCMjXzhfbXNhKHVpbnQ4X3QgKmRzdCwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0cmlkZSwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXgsICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXksICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ggPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteCAtIDFdOyAgICAgICAgICAgXAotICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kgPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteSAtIDFdOyAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGhldmNfIyNESVIxIyNfdW5pXyMjVEFQIyN0XyMjV0lEVEgjI3dfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUsIGZpbHRlcl94LCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl95LCBoZWlnaHQpOyAgICAgICAgXAorI2RlZmluZSBVTklfTUNfSFYoUEVMLCBXSURUSCwgVEFQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjX3VuaV8jI1BFTCMjX2h2IyNXSURUSCMjXzhfbXNhKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG15LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ggPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteCAtIDFdOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kgPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteSAtIDFdOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhldmNfaHZfdW5pXyMjVEFQIyN0XyMjV0lEVEgjI3dfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0KTsgICAgICAgXAogfQogCi1VTklfTUNfSFYocXBlbCwgaHYsIDQsIDgsIGh2KTsKLVVOSV9NQ19IVihxcGVsLCBodiwgOCwgOCwgaHYpOwotVU5JX01DX0hWKHFwZWwsIGh2LCAxMiwgOCwgaHYpOwotVU5JX01DX0hWKHFwZWwsIGh2LCAxNiwgOCwgaHYpOwotVU5JX01DX0hWKHFwZWwsIGh2LCAyNCwgOCwgaHYpOwotVU5JX01DX0hWKHFwZWwsIGh2LCAzMiwgOCwgaHYpOwotVU5JX01DX0hWKHFwZWwsIGh2LCA0OCwgOCwgaHYpOwotVU5JX01DX0hWKHFwZWwsIGh2LCA2NCwgOCwgaHYpOworVU5JX01DX0hWKHFwZWwsIDQsIDgpOworVU5JX01DX0hWKHFwZWwsIDgsIDgpOworVU5JX01DX0hWKHFwZWwsIDEyLCA4KTsKK1VOSV9NQ19IVihxcGVsLCAxNiwgOCk7CitVTklfTUNfSFYocXBlbCwgMjQsIDgpOworVU5JX01DX0hWKHFwZWwsIDMyLCA4KTsKK1VOSV9NQ19IVihxcGVsLCA0OCwgOCk7CitVTklfTUNfSFYocXBlbCwgNjQsIDgpOwogCi1VTklfTUNfSFYoZXBlbCwgaHYsIDQsIDQsIGh2KTsKLVVOSV9NQ19IVihlcGVsLCBodiwgNiwgNCwgaHYpOwotVU5JX01DX0hWKGVwZWwsIGh2LCA4LCA0LCBodik7Ci1VTklfTUNfSFYoZXBlbCwgaHYsIDEyLCA0LCBodik7Ci1VTklfTUNfSFYoZXBlbCwgaHYsIDE2LCA0LCBodik7Ci1VTklfTUNfSFYoZXBlbCwgaHYsIDI0LCA0LCBodik7Ci1VTklfTUNfSFYoZXBlbCwgaHYsIDMyLCA0LCBodik7CitVTklfTUNfSFYoZXBlbCwgNCwgNCk7CitVTklfTUNfSFYoZXBlbCwgNiwgNCk7CitVTklfTUNfSFYoZXBlbCwgOCwgNCk7CitVTklfTUNfSFYoZXBlbCwgMTIsIDQpOworVU5JX01DX0hWKGVwZWwsIDE2LCA0KTsKK1VOSV9NQ19IVihlcGVsLCAyNCwgNCk7CitVTklfTUNfSFYoZXBlbCwgMzIsIDQpOwogCiAjdW5kZWYgVU5JX01DX0hWCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaGV2Y19tY191bml3X21zYS5jIGIvbGliYXZjb2RlYy9taXBzL2hldmNfbWNfdW5pd19tc2EuYwppbmRleCBjZTEwZjQxLi5mOWVjYjQxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaGV2Y19tY191bml3X21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oZXZjX21jX3VuaXdfbXNhLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgLSAyMDE3IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIyLDQ0ICsyMiwzNiBAQAogI2luY2x1ZGUgImxpYmF2Y29kZWMvbWlwcy9oZXZjZHNwX21pcHMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL21pcHMvaGV2Y19tYWNyb3NfbXNhLmgiCiAKLSNkZWZpbmUgSEVWQ19IVl9VTklXX1JORF9DTElQNChpbjAsIGluMSwgaW4yLCBpbjMsIHdndCwgb2Zmc2V0LCBybmQsICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBjb25zdCB1aW50OF90IGZmX2hldmNfbWFza19hcnJbMTYgKiAyXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDB4NDApKSkgPSB7CisgICAgLyogOCB3aWR0aCBjYXNlcyAqLworICAgIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsCisgICAgLyogNCB3aWR0aCBjYXNlcyAqLworICAgIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMAorfTsKKworI2RlZmluZSBIRVZDX1VOSVdfUk5EX0NMSVAyX01BWF9TQVRVX0goaW4wX2gsIGluMV9oLCB3Z3Rfdywgb2Zmc2V0X2gsIHJuZF93LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MF9oLCBvdXQxX2gpICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHY0aTMyIGluMF9yX20sIGluMF9sX20sIGluMV9yX20sIGluMV9sX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElMVlJMX0gyX1NXKGluMF9oLCBpbjBfaCwgaW4wX3JfbSwgaW4wX2xfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElMVlJMX0gyX1NXKGluMV9oLCBpbjFfaCwgaW4xX3JfbSwgaW4xX2xfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERPVFBfU0g0X1NXKGluMF9yX20sIGluMV9yX20sIGluMF9sX20sIGluMV9sX20sIHdndF93LCB3Z3Rfdywgd2d0X3csICAgICAgXAorICAgICAgICAgICAgICAgIHdndF93LCBpbjBfcl9tLCBpbjFfcl9tLCBpbjBfbF9tLCBpbjFfbF9tKTsgICAgICAgICAgICAgICAgICAgXAorICAgIFNSQVJfVzRfU1coaW4wX3JfbSwgaW4xX3JfbSwgaW4wX2xfbSwgaW4xX2xfbSwgcm5kX3cpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIFBDS0VWX0gyX1NIKGluMF9sX20sIGluMF9yX20sIGluMV9sX20sIGluMV9yX20sIG91dDBfaCwgb3V0MV9oKTsgICAgICAgICAgXAorICAgIEFERFNfU0gyX1NIKG91dDBfaCwgb2Zmc2V0X2gsIG91dDFfaCwgb2Zmc2V0X2gsIG91dDBfaCwgb3V0MV9oKTsgICAgICAgICAgXAorICAgIENMSVBfU0gyXzBfMjU1X01BWF9TQVRVKG91dDBfaCwgb3V0MV9oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChpbjBfaCwgaW4xX2gsIGluMl9oLCBpbjNfaCwgd2d0X3csICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfaCwgcm5kX3csIG91dDBfaCwgb3V0MV9oLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQyX2gsIG91dDNfaCkgICAgICAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTVVMNChpbjAsIHdndCwgaW4xLCB3Z3QsIGluMiwgd2d0LCBpbjMsIHdndCwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7ICBcCi0gICAgU1JBUl9XNF9TVyhvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBybmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQURENChvdXQwLCBvZmZzZXQsIG91dDEsIG9mZnNldCwgb3V0Miwgb2Zmc2V0LCBvdXQzLCBvZmZzZXQsICAgICAgICAgICBcCi0gICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MCA9IENMSVBfU1dfMF8yNTUob3V0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MSA9IENMSVBfU1dfMF8yNTUob3V0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MiA9IENMSVBfU1dfMF8yNTUob3V0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MyA9IENMSVBfU1dfMF8yNTUob3V0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgSEVWQ19VTklXX1JORF9DTElQMihpbjAsIGluMSwgd2d0LCBvZmZzZXQsIHJuZCwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwX3IsIG91dDFfciwgb3V0MF9sLCBvdXQxX2wpICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBJTFZSX0gyX1NXKGluMCwgaW4wLCBpbjEsIGluMSwgb3V0MF9yLCBvdXQxX3IpOyAgICAgICAgICAgICAgICAgIFwKLSAgICBJTFZMX0gyX1NXKGluMCwgaW4wLCBpbjEsIGluMSwgb3V0MF9sLCBvdXQxX2wpOyAgICAgICAgICAgICAgICAgIFwKLSAgICBET1RQX1NINF9TVyhvdXQwX3IsIG91dDFfciwgb3V0MF9sLCBvdXQxX2wsIHdndCwgd2d0LCB3Z3QsIHdndCwgIFwKLSAgICAgICAgICAgICAgICBvdXQwX3IsIG91dDFfciwgb3V0MF9sLCBvdXQxX2wpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTUkFSX1c0X1NXKG91dDBfciwgb3V0MV9yLCBvdXQwX2wsIG91dDFfbCwgcm5kKTsgICAgICAgICAgICAgICAgIFwKLSAgICBBREQ0KG91dDBfciwgb2Zmc2V0LCBvdXQxX3IsIG9mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIG91dDBfbCwgb2Zmc2V0LCBvdXQxX2wsIG9mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIG91dDBfciwgb3V0MV9yLCBvdXQwX2wsIG91dDFfbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvdXQwX3IgPSBDTElQX1NXXzBfMjU1KG91dDBfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvdXQxX3IgPSBDTElQX1NXXzBfMjU1KG91dDFfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvdXQwX2wgPSBDTElQX1NXXzBfMjU1KG91dDBfbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvdXQxX2wgPSBDTElQX1NXXzBfMjU1KG91dDFfbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBIRVZDX1VOSVdfUk5EX0NMSVA0KGluMCwgaW4xLCBpbjIsIGluMywgd2d0LCBvZmZzZXQsIHJuZCwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQwX3IsIG91dDFfciwgb3V0Ml9yLCBvdXQzX3IsICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MF9sLCBvdXQxX2wsIG91dDJfbCwgb3V0M19sKSAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBIRVZDX1VOSVdfUk5EX0NMSVAyKGluMCwgaW4xLCB3Z3QsIG9mZnNldCwgcm5kLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXQwX3IsIG91dDFfciwgb3V0MF9sLCBvdXQxX2wpOyAgICAgICAgICAgXAotICAgIEhFVkNfVU5JV19STkRfQ0xJUDIoaW4yLCBpbjMsIHdndCwgb2Zmc2V0LCBybmQsICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dDJfciwgb3V0M19yLCBvdXQyX2wsIG91dDNfbCk7ICAgICAgICAgICBcCisgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGluMF9oLCBpbjFfaCwgd2d0X3csIG9mZnNldF9oLCBybmRfdywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDBfaCwgb3V0MV9oKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGluMl9oLCBpbjNfaCwgd2d0X3csIG9mZnNldF9oLCBybmRfdywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDJfaCwgb3V0M19oKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfdW5pd2d0X2NvcHlfNHdfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTcxLDc2ICs2Myw2MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CisgICAgdWludDMyX3QgbG9vcF9jbnQsIHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIG9mZnNldF92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAogICAgIGlmICgyID09IGhlaWdodCkgewotICAgICAgICB2MTZpOCBzcmMwLCBzcmMxOwotICAgICAgICB2OGkxNiBkc3QwOwogICAgICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbDsKIAotICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgc3JjMCA9ICh2MTZpOCkgX19tc2FfaWx2cl93KCh2NGkzMikgc3JjMSwgKHY0aTMyKSBzcmMwKTsKKyAgICAgICAgTFcyKHNyYywgc3JjX3N0cmlkZSwgdHAwLCB0cDEpOworICAgICAgICBJTlNFUlRfVzJfU0IodHAwLCB0cDEsIHNyYzApOwogICAgICAgICBkc3QwID0gKHY4aTE2KSBfX21zYV9pbHZyX2IoemVybywgc3JjMCk7CiAgICAgICAgIGRzdDAgPDw9IDY7CiAKICAgICAgICAgSUxWUkxfSDJfU1coZHN0MCwgZHN0MCwgZHN0MF9yLCBkc3QwX2wpOwogICAgICAgICBET1RQX1NIMl9TVyhkc3QwX3IsIGRzdDBfbCwgd2VpZ2h0X3ZlYywgd2VpZ2h0X3ZlYywgZHN0MF9yLCBkc3QwX2wpOwogICAgICAgICBTUkFSX1cyX1NXKGRzdDBfciwgZHN0MF9sLCBybmRfdmVjKTsKLSAgICAgICAgQUREMihkc3QwX3IsIG9mZnNldF92ZWMsIGRzdDBfbCwgb2Zmc2V0X3ZlYywgZHN0MF9yLCBkc3QwX2wpOwotICAgICAgICBkc3QwX3IgPSBDTElQX1NXXzBfMjU1KGRzdDBfcik7Ci0gICAgICAgIGRzdDBfbCA9IENMSVBfU1dfMF8yNTUoZHN0MF9sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjIoZHN0MF9sLCBkc3QwX3IsIGRzdDBfcik7Ci0gICAgICAgIFNUNHgyX1VCKGRzdDBfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QwX2wsICh2OGkxNikgZHN0MF9yKTsKKyAgICAgICAgZHN0MCArPSBvZmZzZXRfdmVjOworICAgICAgICBkc3QwID0gQ0xJUF9TSF8wXzI1NV9NQVhfU0FUVShkc3QwKTsKKyAgICAgICAgb3V0MCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDAsICh2MTZpOCkgZHN0MCk7CisgICAgICAgIFNUNHgyX1VCKG91dDAsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewotICAgICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgICAgICB2OGkxNiBkc3QwLCBkc3QxOwotICAgICAgICB2NGkzMiBkc3QwX3IsIGRzdDFfcjsKLSAgICAgICAgdjRpMzIgZHN0MF9sLCBkc3QxX2w7Ci0KLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgIElMVlJfVzJfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgZHN0MCwgZHN0MSk7Ci0gICAgICAgIGRzdDAgPDw9IDY7Ci0gICAgICAgIGRzdDEgPDw9IDY7Ci0KLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMihkc3QwLCBkc3QxLCB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICAgICAgU1Q0eDRfVUIoZHN0MF9yLCBkc3QwX3IsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDgpIHsKLSAgICAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7Ci0gICAgICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKLSAgICAgICAgdjRpMzIgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotCisgICAgICAgIExXNChzcmMsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9XNF9TQih0cDAsIHRwMSwgdHAyLCB0cDMsIHNyYzApOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgU0xMSV8yVihkc3QwLCBkc3QxLCA2KTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgb3V0MCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDEsICh2MTZpOCkgZHN0MCk7CisgICAgICAgIFNUNHg0X1VCKG91dDAsIG91dDAsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSA4KSkgewogICAgICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAzKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIElMVlJfVzRfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjNSwgc3JjNCwgc3JjNywgc3JjNiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotCisgICAgICAgICAgICBMVzQoc3JjLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICAgICAgc3JjICs9IDQgKiBzcmNfc3RyaWRlOworICAgICAgICAgICAgSU5TRVJUX1c0X1NCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMCk7CisgICAgICAgICAgICBMVzQoc3JjLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICAgICAgc3JjICs9IDQgKiBzcmNfc3RyaWRlOworICAgICAgICAgICAgSU5TRVJUX1c0X1NCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMSk7CisgICAgICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOwogICAgICAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKLSAgICAgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1Q0eDhfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7CisgICAgICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBkc3QgKz0gOCAqIGRzdF9zdHJpZGU7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xNTUsNDYgKzEzMSw0OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgb2Zmc2V0X3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCiAgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMyk7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzQsIHplcm8sIHNyYzUsIHplcm8sIHNyYzYsIHplcm8sIHNyYzcsCi0gICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgIExENChzcmMsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBJTlNFUlRfRDJfU0IodHAwLCB0cDEsIHNyYzApOworICAgICAgICBJTlNFUlRfRDJfU0IodHAyLCB0cDMsIHNyYzEpOworICAgICAgICBMRDQoc3JjLCBzcmNfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMyKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMiwgdHAzLCBzcmMzKTsKKworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMSwgZHN0MiwgZHN0Myk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzIsIGRzdDQsIGRzdDUpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMzLCBkc3Q2LCBkc3Q3KTsKIAogICAgICAgICBTTExJXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOwogICAgICAgICBTTExJXzRWKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIDYpOwotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUNng0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3Q0LCBkc3Q1LCBkc3Q2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Nyk7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBvdXQyLCBvdXQzKTsKKworICAgICAgICBTVDZ4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUNng0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTVDZ4NF9VQihvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC0yMDgsNzggKzE4Niw4OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNmk4IHNyYzAgPSB7IDAgfSwgc3JjMSA9IHsgMCB9LCBzcmMyID0geyAwIH0sIHNyYzMgPSB7IDAgfTsKICAgICB2MTZpOCB6ZXJvID0geyAwIH07Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIG9mZnNldF92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAogICAgIGlmICgyID09IGhlaWdodCkgewotICAgICAgICB2MTZpOCBzcmMwLCBzcmMxOwotICAgICAgICB2OGkxNiBkc3QwLCBkc3QxOwotICAgICAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2w7Ci0KLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgZHN0MCwgZHN0MSk7Ci0KLSAgICAgICAgZHN0MCA8PD0gNjsKLSAgICAgICAgZHN0MSA8PD0gNjsKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMihkc3QwLCBkc3QxLCB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICAgICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgIH0gZWxzZSBpZiAoNiA9PSBoZWlnaHQpIHsKLSAgICAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKLSAgICAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICAgICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfcjsKLSAgICAgICAgdjRpMzIgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCBkc3Q0X2wsIGRzdDVfbDsKLQotICAgICAgICBMRF9TQjYoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1KTsKLSAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgICAgICBJTFZSX0IyX1NIKHplcm8sIHNyYzQsIHplcm8sIHNyYzUsIGRzdDQsIGRzdDUpOwotCisgICAgICAgIExEMihzcmMsIHNyY19zdHJpZGUsIHRwMCwgdHAxKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIFNMTElfMlYoZHN0MCwgZHN0MSwgNik7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDJfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kX3ZlYywgZHN0MCwgZHN0MSk7CisgICAgICAgIG91dDAgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxLCAodjE2aTgpIGRzdDApOworICAgICAgICBTVDh4Ml9VQihvdXQwLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgTEQ0KHNyYywgc3JjX3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMiwgdHAzLCBzcmMxKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMCwgZHN0MCwgZHN0MSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzEsIGRzdDIsIGRzdDMpOwogICAgICAgICBTTExJXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOwotICAgICAgICBkc3Q0IDw8PSA2OwotICAgICAgICBkc3Q1IDw8PSA2OwotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMihkc3Q0LCBkc3Q1LCB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfciwgZHN0NV9yLCBkc3Q0X2wsIGRzdDVfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IxMihkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yKTsKLSAgICAgICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0MCwgZHN0MSwgZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDMpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYgKDYgPT0gaGVpZ2h0KSB7CisgICAgICAgIExENChzcmMsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIHNyYyArPSA0ICogc3JjX3N0cmlkZTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgSU5TRVJUX0QyX1NCKHRwMiwgdHAzLCBzcmMxKTsKKyAgICAgICAgTEQyKHNyYywgc3JjX3N0cmlkZSwgdHAwLCB0cDEpOworICAgICAgICBJTlNFUlRfRDJfU0IodHAwLCB0cDEsIHNyYzIpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMSwgZHN0MiwgZHN0Myk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzIsIGRzdDQsIGRzdDUpOworICAgICAgICBTTExJXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOworICAgICAgICBTTExJXzJWKGRzdDQsIGRzdDUsIDYpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgUENLRVZfQjNfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgb3V0MCwgb3V0MSwgb3V0Mik7CisgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICBTVDh4Ml9VQihkc3QyX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDQpIHsKLSAgICAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOworICAgICAgICBTVDh4Ml9VQihvdXQyLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSA4KSB7CisgICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDMpOyBsb29wX2NudC0tOykgeworICAgICAgICAgICAgTEQ0KHNyYywgc3JjX3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgICAgIHNyYyArPSA0ICogc3JjX3N0cmlkZTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9TQih0cDAsIHRwMSwgc3JjMCk7CisgICAgICAgICAgICBJTlNFUlRfRDJfU0IodHAyLCB0cDMsIHNyYzEpOworICAgICAgICAgICAgTEQ0KHNyYywgc3JjX3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgICAgIHNyYyArPSA0ICogc3JjX3N0cmlkZTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9TQih0cDAsIHRwMSwgc3JjMik7CisgICAgICAgICAgICBJTlNFUlRfRDJfU0IodHAyLCB0cDMsIHNyYzMpOwogCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KKyAgICAgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMSwgZHN0MiwgZHN0Myk7CisgICAgICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMyLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzMsIGRzdDYsIGRzdDcpOwogICAgICAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKLSAgICAgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBTTExJXzRWKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIDYpOworICAgICAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0MCwgZHN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDQsIGRzdDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NiwgZHN0Nyk7CisgICAgICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFBDS0VWX0IyX1VCKGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsIG91dDIsIG91dDMpOworICAgICAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgU1Q4eDRfVUIob3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMjk1LDExMiArMjg0LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0NF9yLCBkc3Q1X3I7Ci0gICAgdjRpMzIgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCBkc3Q0X2wsIGRzdDVfbDsKKyAgICB2OGkxNiBvZmZzZXRfdmVjOwogICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKKyAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwogICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsCiAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKICAgICAgICAgSUxWTF9XMl9TQihzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmMwLCBzcmMxKTsKICAgICAgICAgSUxWUl9CMl9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCBkc3Q0LCBkc3Q1KTsKLSAgICAgICAgZHN0NCA8PD0gNjsKLSAgICAgICAgZHN0NSA8PD0gNjsKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDIoZHN0NCwgZHN0NSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X3IsIGRzdDVfciwgZHN0NF9sLCBkc3Q1X2wpOworICAgICAgICBTTExJXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOworICAgICAgICBTTExJXzJWKGRzdDQsIGRzdDUsIDYpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3Q0LCBkc3Q1KTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjEyKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IpOwotICAgICAgICBTVDEyeDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjNfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgb3V0MCwgb3V0MSwgb3V0Mik7CisgICAgICAgIFNUMTJ4NF9VQihvdXQwLCBvdXQxLCBvdXQyLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGhldmNfdW5pd2d0X2NvcHlfMTZtdWx0eDRtdWx0X21zYSh1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgpCi17Ci0gICAgdWludDMyX3QgbG9vcF9jbnQsIGNudDsKLSAgICB1aW50OF90ICpzcmNfdG1wOwotICAgIHVpbnQ4X3QgKmRzdF90bXA7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwotCi0gICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKLSAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwotICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7Ci0KLSAgICBmb3IgKGNudCA9IHdpZHRoID4+IDQ7IGNudC0tOykgewotICAgICAgICBzcmNfdG1wID0gc3JjOwotICAgICAgICBkc3RfdG1wID0gZHN0OwotCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMjsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgICAgIExEX1NCNChzcmNfdG1wLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIHNyY190bXAgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgdG1wMCwgdG1wMSk7Ci0gICAgICAgICAgICBJTFZMX0IyX1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHRtcDIsIHRtcDMpOwotCi0gICAgICAgICAgICBTTExJXzRWKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDYpOwotICAgICAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MV9sLCBkc3QxX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0KLSAgICAgICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMiwgemVybywgc3JjMywgdG1wMCwgdG1wMSk7Ci0gICAgICAgICAgICBJTFZMX0IyX1NIKHplcm8sIHNyYzIsIHplcm8sIHNyYzMsIHRtcDIsIHRtcDMpOwotCi0gICAgICAgICAgICBTTExJXzRWKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDYpOwotICAgICAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MV9sLCBkc3QxX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0KLSAgICAgICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmMgKz0gMTY7Ci0gICAgICAgIGRzdCArPSAxNjsKLSAgICB9Ci19Ci0KIHN0YXRpYyB2b2lkIGhldmNfdW5pd2d0X2NvcHlfMTZ3X21zYSh1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKQEAgLTQxMCw4ICszMjcsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y191bml3Z3RfY29weV8xNm11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHdlaWdodCwgb2Zmc2V0LCBybmRfdmFsLCAxNik7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOworICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBvZmZzZXRfdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CisKKyAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKKworICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMjsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMSwgZHN0MiwgZHN0Myk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzIsIGRzdDQsIGRzdDUpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMzLCBkc3Q2LCBkc3Q3KTsKKyAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICAgICAgU0xMSV80Vihkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA2KTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0NCwgZHN0NSwgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDcpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0NSwgZHN0NCwgZHN0NywgZHN0Niwgb3V0Miwgb3V0Myk7CisgICAgICAgIFNUX1VCNChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfdW5pd2d0X2NvcHlfMjR3X21zYSh1aW50OF90ICpzcmMsCkBAIC00MjMsMTEgKzM3MCw0OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBoZXZjX3VuaXdndF9jb3B5XzE2bXVsdHg0bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgd2VpZ2h0LCBvZmZzZXQsIHJuZF92YWwsIDE2KTsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2aTggemVybyA9IHsgMCB9OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIG9mZnNldF92ZWM7CisgICAgdjhpMTYgZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKLSAgICBoZXZjX3VuaXdndF9jb3B5Xzh3X21zYShzcmMgKyAxNiwgc3JjX3N0cmlkZSwgZHN0ICsgMTYsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjNCwgc3JjNSk7CisgICAgICAgIExEX1NCNChzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMiwgc3JjMywgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworCisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgSUxWUl9CMl9TSCh6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjNCwgZHN0NiwgZHN0Nyk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzUsIGRzdDgsIGRzdDkpOworICAgICAgICBJTFZSX0IyX1NIKHplcm8sIHNyYzYsIHplcm8sIHNyYzcsIGRzdDEwLCBkc3QxMSk7CisgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFNMTElfNFYoZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgNik7CisgICAgICAgIFNMTElfNFYoZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExLCA2KTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0NCwgZHN0NSwgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDcpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0OCwgZHN0OSwgZHN0MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxMSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBQQ0tFVl9CM19VQihkc3Q3LCBkc3Q2LCBkc3Q5LCBkc3Q4LCBkc3QxMSwgZHN0MTAsIG91dDMsIG91dDQsIG91dDUpOworICAgICAgICBTVF9VQjQob3V0MCwgb3V0MSwgb3V0Mywgb3V0NCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q4eDRfVUIob3V0Miwgb3V0NSwgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfdW5pd2d0X2NvcHlfMzJ3X21zYSh1aW50OF90ICpzcmMsCkBAIC00MzksOCArNDIzLDQxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGhldmNfdW5pd2d0X2NvcHlfMTZtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCwgMzIpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKKyAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgb2Zmc2V0X3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOworCisgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAxKTsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSk7CisgICAgICAgIExEX1NCMihzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOworCisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMiwgZHN0NCwgZHN0NSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzMsIGRzdDYsIGRzdDcpOworICAgICAgICBTTExJXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOworICAgICAgICBTTExJXzRWKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIDYpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3Q0LCBkc3Q1LCBkc3Q2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Nyk7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1RfVUIyKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFNUX1VCMihvdXQyLCBvdXQzLCBkc3QgKyAxNiwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y191bml3Z3RfY29weV80OHdfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTQ1Miw4ICs0NjksNTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y191bml3Z3RfY29weV8xNm11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHdlaWdodCwgb2Zmc2V0LCBybmRfdmFsLCA0OCk7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1OworICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBvZmZzZXRfdmVjOworICAgIHY4aTE2IGRzdDYsIGRzdDcsIGRzdDgsIGRzdDksIGRzdDEwLCBkc3QxMTsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOworCisgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKKyAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAxKTsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0IzKHNyYywgMTYsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfU0IzKHNyYywgMTYsIHNyYzMsIHNyYzQsIHNyYzUpOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMwLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMSwgZHN0MiwgZHN0Myk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzIsIGRzdDQsIGRzdDUpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMzLCBkc3Q2LCBkc3Q3KTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjNCwgZHN0OCwgZHN0OSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzUsIGRzdDEwLCBkc3QxMSk7CisgICAgICAgIFNMTElfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFNMTElfNFYoZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgNik7CisgICAgICAgIFNMTElfNFYoZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExLCA2KTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0NCwgZHN0NSwgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDcpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0OCwgZHN0OSwgZHN0MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxMSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBQQ0tFVl9CM19VQihkc3Q3LCBkc3Q2LCBkc3Q5LCBkc3Q4LCBkc3QxMSwgZHN0MTAsIG91dDMsIG91dDQsIG91dDUpOworICAgICAgICBTVF9VQjIob3V0MCwgb3V0MSwgZHN0LCAxNik7CisgICAgICAgIFNUX1VCKG91dDIsIGRzdCArIDMyKTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgIFNUX1VCMihvdXQzLCBvdXQ0LCBkc3QsIDE2KTsKKyAgICAgICAgU1RfVUIob3V0NSwgZHN0ICsgMzIpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfdW5pd2d0X2NvcHlfNjR3X21zYSh1aW50OF90ICpzcmMsCkBAIC00NjUsOCArNTI2LDU4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGhldmNfdW5pd2d0X2NvcHlfMTZtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCwgNjQpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDc7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgb2Zmc2V0X3ZlYzsKKyAgICB2OGkxNiBkc3Q4LCBkc3Q5LCBkc3QxMCwgZHN0MTEsIGRzdDEyLCBkc3QxMywgZHN0MTQsIGRzdDE1OworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CisKKyAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjLCAxNiwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBMRF9TQjQoc3JjLCAxNiwgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworCisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIGRzdDAsIGRzdDEpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmMxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjMiwgZHN0NCwgZHN0NSk7CisgICAgICAgIElMVlJMX0IyX1NIKHplcm8sIHNyYzMsIGRzdDYsIGRzdDcpOworICAgICAgICBJTFZSTF9CMl9TSCh6ZXJvLCBzcmM0LCBkc3Q4LCBkc3Q5KTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjNSwgZHN0MTAsIGRzdDExKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjNiwgZHN0MTIsIGRzdDEzKTsKKyAgICAgICAgSUxWUkxfQjJfU0goemVybywgc3JjNywgZHN0MTQsIGRzdDE1KTsKKyAgICAgICAgU0xMSV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICAgICAgU0xMSV80Vihkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA2KTsKKyAgICAgICAgU0xMSV80Vihkc3Q4LCBkc3Q5LCBkc3QxMCwgZHN0MTEsIDYpOworICAgICAgICBTTExJXzRWKGRzdDEyLCBkc3QxMywgZHN0MTQsIGRzdDE1LCA2KTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0NCwgZHN0NSwgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDcpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0OCwgZHN0OSwgZHN0MTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxMSk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QxMiwgZHN0MTMsIGRzdDE0LCBkc3QxNSwgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDEyLCBkc3QxMywgZHN0MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxNSk7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBvdXQyLCBvdXQzKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0OSwgZHN0OCwgZHN0MTEsIGRzdDEwLCBvdXQ0LCBvdXQ1KTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0MTMsIGRzdDEyLCBkc3QxNSwgZHN0MTQsIG91dDYsIG91dDcpOworICAgICAgICBTVF9VQjQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCAxNik7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTVF9VQjQob3V0NCwgb3V0NSwgb3V0Niwgb3V0NywgZHN0LCAxNik7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19oel91bml3Z3RfOHRfNHdfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTQ4MCwyOCArNTkxLDM1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDE7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKLSAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwIH07CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgdmVjOCwgdmVjOSwgdmVjMTA7CisgICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzExLCB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCBkc3QwMSwgZHN0MjMsIGRzdDQ1LCBkc3Q2NzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IDM7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCisgICAgbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclsxNl0pOwogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2syID0gbWFzazAgKyA0OwogICAgIG1hc2szID0gbWFzazAgKyA2OwpAQCAtNTEzLDM0ICs2MzEsMjcgQEAKIAogICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotCi0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDAsIGRzdDAsIGRzdDApOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKICAgICAgICAgVlNIRl9CNF9TQihzcmM0LCBzcmM1LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7CisgICAgICAgICAgICAgICAgICAgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgICAgICAgICAgICAgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUpOworICAgICAgICBkc3QwMSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QyMyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3Q0NSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDY3ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOwogCi0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MDEsIGRzdDIzLCBkc3Q0NSwgZHN0NjcsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVDR4OF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KQEAgLTU1NiwyOCArNjY3LDM3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gMzsKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICBtYXNrMSA9IG1hc2swICsgMjsKICAgICBtYXNrMiA9IG1hc2swICsgNDsKICAgICBtYXNrMyA9IG1hc2swICsgNjsKQEAgLTU4OSwzMyArNzA5LDI3IEBACiAKICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOworICAgICAgICAgICAgICAgICAgIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QyLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgICAgICAgICAgICB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QzLCBkc3QzLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgICAgICAgICAgICB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOwogCi0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUOHg0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQpAQCAtNjMwLDEwICs3NDQsODggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBoZXZjX2h6X3VuaXdndF84dF84d19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7Ci0gICAgaGV2Y19oel91bml3Z3RfOHRfNHdfbXNhKHNyYyArIDgsIHNyY19zdHJpZGUsIGRzdCArIDgsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MjsKKyAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKKyAgICB2OGkxNiBkc3QwMSwgZHN0MjMsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7CisgICAgdjhpMTYgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKKworICAgIHNyYyAtPSAzOworICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CisKKyAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKKworICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKKyAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworCisgICAgbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CisgICAgbWFzazEgPSBtYXNrMCArIDI7CisgICAgbWFzazIgPSBtYXNrMCArIDQ7CisgICAgbWFzazMgPSBtYXNrMCArIDY7CisgICAgbWFzazQgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclsxNl0pOworICAgIG1hc2s1ID0gbWFzazQgKyAyOworICAgIG1hc2s2ID0gbWFzazQgKyA0OworICAgIG1hc2s3ID0gbWFzazQgKyA2OworCisgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBMRF9TQjQoc3JjICsgOCwgc3JjX3N0cmlkZSwgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKworICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSk7CisgICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCisgICAgICAgICAgICAgICAgICAgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmM0LCBzcmM1LCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKKyAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmM2LCBzcmM3LCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0MDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MjMgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDAxLCBkc3QyMywgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92ZWMsIGRzdDQsIGRzdDUpOworCisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTVDR4NF9VQihvdXQyLCBvdXQyLCAwLCAxLCAyLCAzLCBkc3QgKyA4LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h6X3VuaXdndF84dF8xNndfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTY0NywyOCArODM5LDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjE2aTggdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IDM7Ci0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAKLSAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCisgICAgbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAgICAgbWFzazIgPSBtYXNrMCArIDQ7CiAgICAgbWFzazMgPSBtYXNrMCArIDY7CkBAIC02ODEsMzMgKzg4MSwyNyBAQAogCiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDAsIGRzdDAsIGRzdDApOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7CisgICAgICAgICAgICAgICAgICAgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgICAgICAgICAgICAgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKIAotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBTVF9VQjIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICgyICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQpAQCAtNzIzLDI5ICs5MTcsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIGRzdDRfbCwgZHN0NV9sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IDM7Ci0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAKLSAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCisgICAgbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAgICAgbWFzazIgPSBtYXNrMCArIDQ7CiAgICAgbWFzazMgPSBtYXNrMCArIDY7CkBAIC03NTQsNyArOTU0LDcgQEAKICAgICBtYXNrNiA9IG1hc2swICsgMTI7CiAgICAgbWFzazcgPSBtYXNrMCArIDE0OwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMSk7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDE2OyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjMCwgc3JjMSk7CiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwogICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjMiwgc3JjMyk7CkBAIC03NjIsNDggKzk2MiwzOSBAQAogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLQotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMxLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7CisgICAgICAgICAgICAgICAgICAgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNyk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOworICAgICAgICAgICAgICAgICAgIHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDMsIGRzdDMsIGRzdDMsIGRzdDMpOworICAgICAgICAgICAgICAgICAgIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1KTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CisKICAgICAgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMzLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NCwgZHN0NCwgZHN0NCk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDUsIGRzdDUsIGRzdDUsIGRzdDUpOworICAgICAgICAgICAgICAgICAgIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CiAKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDIoZHN0NCwgZHN0NSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X3IsIGRzdDVfciwgZHN0NF9sLCBkc3Q1X2wpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3Q0LCBkc3Q1KTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0M19sLCBkc3QzX3IsIGRzdDRfbCwgZHN0NF9yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIEhFVkNfUENLX1NXX1NCNChkc3QyX2wsIGRzdDJfciwgZHN0NV9sLCBkc3Q1X3IsIGRzdDJfcik7Ci0gICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgU1Q4eDJfVUIoZHN0Ml9yLCBkc3QgKyAxNiwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDQsIGRzdDMsIGRzdDUsIGRzdDIsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBTVF9VQjIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0MiwgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CkBAIC04MTksNzEgKzEwMTAsOTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzI7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwotICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazMsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3OwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjE2aTggdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjhpMTYgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSAzOwotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogCi0gICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKKyAgICB3ZWlnaHQgKj0gMTI4OworICAgIHJuZF92YWwgLT0gNjsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX2ZpbGxfaCh3ZWlnaHQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9zcmFyX2god2VpZ2h0X3ZlY19oLCBkZW5vbV92ZWMpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9hZGRzX3NfaChvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjX2gpOworCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0g0X1NIKGZpbHRlcl92ZWMsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKIAorICAgIG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2syID0gbWFzazAgKyA0OwogICAgIG1hc2szID0gbWFzazAgKyA2OwotICAgIG1hc2s0ID0gbWFzazAgKyA4OwotICAgIG1hc2s1ID0gbWFzazAgKyAxMDsKLSAgICBtYXNrNiA9IG1hc2swICsgMTI7Ci0gICAgbWFzazcgPSBtYXNrMCArIDE0OwogCi0gICAgZm9yIChsb29wX2NudCA9IGhlaWdodDsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYywgMTYsIHNyYzAsIHNyYzEpOwotICAgICAgICBzcmMyID0gTERfU0Ioc3JjICsgMjQpOworICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMTsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYywgOCwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgICAgTERfU0I0KHNyYywgOCwgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKIAogICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMxLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOworICAgICAgICAgICAgICAgICAgIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSk7CisgICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCisgICAgICAgICAgICAgICAgICAgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKKworICAgICAgICBWU0hGX0I0X1NCKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QzLCBkc3QzLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgVlNIRl9CNF9TQihzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1KTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3Q3ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CiAKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0MCwgZHN0MSwgZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDMpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDQsIGRzdDUsIGRzdDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q3KTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0LCAxNik7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1RfVUIyKG91dDAsIG91dDEsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU1RfVUIyKG91dDIsIG91dDMsIGRzdCwgMTYpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICB9CiB9CkBAIC04OTksMjkgKzExMTIsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2MTZpOCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIGRzdDRfbCwgZHN0NV9sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IDM7Ci0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCisgICAgbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAgICAgbWFzazIgPSBtYXNrMCArIDQ7CiAgICAgbWFzazMgPSBtYXNrMCArIDY7CkBAIC05MzAsNyArMTE1MCw3IEBACiAgICAgbWFzazYgPSBtYXNrMCArIDEyOwogICAgIG1hc2s3ID0gbWFzazAgKyAxNDsKIAotICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQ7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDY0OyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjMoc3JjLCAxNiwgc3JjMCwgc3JjMSwgc3JjMik7CiAgICAgICAgIHNyYzMgPSBMRF9TQihzcmMgKyA0MCk7CiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwpAQCAtOTM4LDQ5ICsxMTU4LDM5IEBACiAKICAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7CiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMSwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOworICAgICAgICAgICAgICAgICAgIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QyLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgICAgICAgICAgICB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzIsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QzLCBkc3QzLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgICAgICAgICAgICB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOworCiAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDQsIGRzdDQsIGRzdDQpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q1LCBkc3Q1LCBkc3Q1LCBkc3Q1KTsKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCi0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3Q0LCBkc3Q1KTsKIAotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVAyKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjEyKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgMTYpOwotICAgICAgICBTVF9TVyhkc3QyX3IsIGRzdCArIDMyKTsKKyAgICAgICAgUENLRVZfQjNfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgb3V0MCwgb3V0MSwgb3V0Mik7CisgICAgICAgIFNUX1VCMihvdXQwLCBvdXQxLCBkc3QsIDE2KTsKKyAgICAgICAgU1RfVUIob3V0MiwgZHN0ICsgMzIpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICB9CiB9CkBAIC05OTgsMjggKzEyMDgsMzUgQEAKICAgICB1aW50OF90ICpzcmNfdG1wOwogICAgIHVpbnQ4X3QgKmRzdF90bXA7CiAgICAgdWludDMyX3QgbG9vcF9jbnQsIGNudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzI7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazc7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazc7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IDM7Ci0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAKLSAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCisgICAgbWFzazAgPSBMRF9TQigmZmZfaGV2Y19tYXNrX2FyclswXSk7CiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAgICAgbWFzazIgPSBtYXNrMCArIDQ7CiAgICAgbWFzazMgPSBtYXNrMCArIDY7CkBAIC0xMDQwLDMzICsxMjU3LDI3IEBACiAKICAgICAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKICAgICAgICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMSwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsCi0gICAgICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNyk7CiAgICAgICAgICAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7CisgICAgICAgICAgICAgICAgICAgICAgIHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSk7CiAgICAgICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7CisgICAgICAgICAgICAgICAgICAgICAgIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1KTsKKyAgICAgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKIAotICAgICAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7CisgICAgICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDMpOwogCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3RfdG1wLCAxNik7CisgICAgICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFNUX1VCMihvdXQwLCBvdXQxLCBkc3RfdG1wLCAxNik7CiAgICAgICAgICAgICBkc3RfdG1wICs9IDMyOwogICAgICAgICB9CiAKQEAgLTEwODYsNiArMTI5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIGludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwogICAgIHYxNmk4IHNyYzksIHNyYzEwLCBzcmMxMSwgc3JjMTIsIHNyYzEzLCBzcmMxNDsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmM5OF9yOwpAQCAtMTA5MywyMSArMTMwNSwyNyBAQAogICAgIHYxNmk4IHNyYzExMTBfciwgc3JjMTIxMV9yLCBzcmMxMzEyX3IsIHNyYzE0MTNfcjsKICAgICB2MTZpOCBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5ODsKICAgICB2MTZpOCBzcmMxMjExMTExMCwgc3JjMTQxMzEzMTI7Ci0gICAgdjhpMTYgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzY7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgZHN0MDEsIGRzdDIzLCBkc3Q0NSwgZHN0Njc7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogCi0gICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKKwogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCkBAIC0xMTM2LDI4ICsxMzU0LDIxIEBACiAgICAgICAgICAgICAgICAgICAgc3JjMTQxM19yLCBzcmMxMzEyX3IsCiAgICAgICAgICAgICAgICAgICAgc3JjODc3Niwgc3JjMTA5OTgsIHNyYzEyMTExMTEwLCBzcmMxNDEzMTMxMik7CiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzg3NzYsIHNyYzEwOTk4LCBzcmMxMjExMTExMCwgc3JjMTQxMzEzMTIpOworICAgICAgICBkc3QwMSA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBkc3QyMyA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4LCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgZHN0NDUgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5OCwgc3JjMTIxMTExMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBkc3Q2NyA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzg3NzYsIHNyYzEwOTk4LCBzcmMxMjExMTExMCwgc3JjMTQxMzEzMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCi0gICAgICAgIGRzdDEwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NiwgZmlsdDAsIGZpbHQxLAotICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzLCBkc3QxMCwgZHN0MTAsIGRzdDEwLCBkc3QxMCk7Ci0gICAgICAgIGRzdDMyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0goc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3Niwgc3JjMTA5OTgsCi0gICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0MzIsIGRzdDMyLCBkc3QzMiwgZHN0MzIpOwotICAgICAgICBkc3Q1NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4LCBzcmMxMjExMTExMCwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBkc3Q1NCwgZHN0NTQsIGRzdDU0LCBkc3Q1NCk7Ci0gICAgICAgIGRzdDc2ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0goc3JjODc3Niwgc3JjMTA5OTgsIHNyYzEyMTExMTEwLCBzcmMxNDEzMTMxMiwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBkc3Q3NiwgZHN0NzYsIGRzdDc2LCBkc3Q3Nik7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwMSwgZHN0MjMsIGRzdDQ1LCBkc3Q2Nywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKIAotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDEwLCBkc3QzMiwgZHN0NTQsIGRzdDc2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVDR4OF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIHNyYzIxMTAgPSBzcmMxMDk5ODsKQEAgLTExNzgsMjQgKzEzODksMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgaW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3I7CiAgICAgdjE2aTggc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3I7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjOworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAotICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKQEAgLTEyMTMsMjggKzE0MzAsMjEgQEAKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogICAgICAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LAogICAgICAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yKTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjOThfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCi0gICAgICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLAotICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIHRtcDAsIHRtcDAsIHRtcDAsIHRtcDApOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAxLCB0bXAxLCB0bXAxLCB0bXAxKTsKLSAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3IsCi0gICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgdG1wMiwgdG1wMiwgdG1wMiwgdG1wMik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAzLCB0bXAzLCB0bXAzLCB0bXAzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CiAKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVDh4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIHNyYzEwX3IgPSBzcmM1NF9yOwpAQCAtMTI1OCwyOCArMTQ2OCwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgaW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3I7CiAgICAgdjE2aTggc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3I7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKICAgICB2MTZpOCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmM3Nl9sLCBzcmM5OF9sOwogICAgIHYxNmk4IHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsIHNyYzEwOV9sOwogICAgIHYxNmk4IHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgZHN0NF9sLCBkc3Q1X2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OworICAgIHY4aTE2IHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjLCBmaWx0ZXJfdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAogICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKQEAgLTEyOTYsNyArMTUxMiw3IEBACiAgICAgSUxWUl9EM19TQihzcmMyMV9sLCBzcmMxMF9sLCBzcmM0M19sLCBzcmMzMl9sLCBzcmM2NV9sLCBzcmM1NF9sLAogICAgICAgICAgICAgICAgc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKKyAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwpAQCAtMTMwNywzNyArMTUyMywyOCBAQAogICAgICAgICAgICAgICAgICAgIHNyYzc2X2wsIHNyYzg3X2wsIHNyYzk4X2wsIHNyYzEwOV9sKTsKICAgICAgICAgSUxWUl9EMl9TQihzcmM4N19sLCBzcmM3Nl9sLCBzcmMxMDlfbCwgc3JjOThfbCwgc3JjODc3Niwgc3JjMTA5OTgpOwogCi0gICAgICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLAotICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIHRtcDAsIHRtcDAsIHRtcDAsIHRtcDApOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAxLCB0bXAxLCB0bXAxLCB0bXAxKTsKLSAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3IsCi0gICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgdG1wMiwgdG1wMiwgdG1wMiwgdG1wMik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAzLCB0bXAzLCB0bXAzLCB0bXAzKTsKLSAgICAgICAgdG1wNCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsCi0gICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgdG1wNCwgdG1wNCwgdG1wNCwgdG1wNCk7Ci0gICAgICAgIHRtcDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSChzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5OCwKLSAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXA1LCB0bXA1LCB0bXA1LCB0bXA1KTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjOThfciwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzhUQVBfU0goc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NiwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4LCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCi0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVAyKHRtcDQsIHRtcDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDJfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kX3ZlYywgZHN0NCwgZHN0NSk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IxMihkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yKTsKLSAgICAgICAgU1QxMng0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTVDR4NF9VQihvdXQyLCBvdXQyLCAwLCAxLCAyLCAzLCBkc3QgKyA4LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKICAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7CkBAIC0xMzUzLDcgKzE1NjAsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaGV2Y192dF91bml3Z3RfOHRfMTZtdWx0eDJtdWx0X21zYSh1aW50OF90ICpzcmMsCitzdGF0aWMgdm9pZCBoZXZjX3Z0X3VuaXdndF84dF8xNm11bHR4NG11bHRfbXNhKHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKQEAgLTEzNjIsOTEgKzE1NjksMTAxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodG11bDE2KQogewogICAgIHVpbnQ4X3QgKnNyY190bXA7CiAgICAgdWludDhfdCAqZHN0X3RtcDsKICAgICBpbnQzMl90IGxvb3BfY250LCBjbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3I7CiAgICAgdjE2aTggc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfcjsKLSAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwogICAgIHYxNmk4IHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2w7CiAgICAgdjE2aTggc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbDsKKyAgICB2MTZpOCBzcmM5OF9yLCBzcmMxMDlfciwgc3JjOThfbCwgc3JjMTA5X2w7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworICAgIHY4aTE2IHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAotICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKLSAgICBmb3IgKGNudCA9ICh3aWR0aCA+PiA0KTsgY250LS07KSB7CisgICAgZm9yIChjbnQgPSB3ZWlnaHRtdWwxNjsgY250LS07KSB7CiAgICAgICAgIHNyY190bXAgPSBzcmM7CiAgICAgICAgIGRzdF90bXAgPSBkc3Q7CiAKICAgICAgICAgTERfU0I3KHNyY190bXAsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwogICAgICAgICBzcmNfdG1wICs9ICg3ICogc3JjX3N0cmlkZSk7CiAgICAgICAgIFhPUklfQjdfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwotICAgICAgICBJTFZSX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzMsIHNyYzIsIHNyYzUsIHNyYzQsIHNyYzIsIHNyYzEsCi0gICAgICAgICAgICAgICAgICAgc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjMjFfcik7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjNCwgc3JjMywgc3JjNiwgc3JjNSwgc3JjNDNfciwgc3JjNjVfcik7Ci0gICAgICAgIElMVkxfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjNSwgc3JjNCwgc3JjMiwgc3JjMSwKLSAgICAgICAgICAgICAgICAgICBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmMyMV9sKTsKLSAgICAgICAgSUxWTF9CMl9TQihzcmM0LCBzcmMzLCBzcmM2LCBzcmM1LCBzcmM0M19sLCBzcmM2NV9sKTsKIAotICAgICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAxKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgICAgIExEX1NCMihzcmNfdG1wLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4KTsKLSAgICAgICAgICAgIHNyY190bXAgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzcsIHNyYzgpOwotICAgICAgICAgICAgSUxWUl9CMl9TQihzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM3Nl9yLCBzcmM4N19yKTsKLSAgICAgICAgICAgIElMVkxfQjJfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNzZfbCwgc3JjODdfbCk7CisgICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgeworICAgICAgICAgICAgTERfU0I0KHNyY190bXAsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICAgICAgICAgIHNyY190bXAgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKIAotICAgICAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSChzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAwLCB0bXAwLCB0bXAwLCB0bXAwKTsKLSAgICAgICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0goc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgdG1wMSwgdG1wMSwgdG1wMSwgdG1wMSk7Ci0gICAgICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0I0X1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIHRtcDIsIHRtcDIsIHRtcDIsIHRtcDIpOwotICAgICAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSChzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCB0bXAzLCB0bXAzLCB0bXAzLCB0bXAzKTsKKyAgICAgICAgICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMywgc3JjMiwgc3JjNSwgc3JjNCwgc3JjMiwgc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjMjFfcik7CisgICAgICAgICAgICBJTFZSX0IyX1NCKHNyYzQsIHNyYzMsIHNyYzYsIHNyYzUsIHNyYzQzX3IsIHNyYzY1X3IpOworICAgICAgICAgICAgSUxWTF9CNF9TQihzcmMxLCBzcmMwLCBzcmMzLCBzcmMyLCBzcmM1LCBzcmM0LCBzcmMyLCBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmMyMV9sKTsKKyAgICAgICAgICAgIElMVkxfQjJfU0Ioc3JjNCwgc3JjMywgc3JjNiwgc3JjNSwgc3JjNDNfbCwgc3JjNjVfbCk7CisgICAgICAgICAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LAorICAgICAgICAgICAgICAgICAgICAgICBzcmM3Nl9yLCBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfcik7CisgICAgICAgICAgICBJTFZMX0I0X1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LAorICAgICAgICAgICAgICAgICAgICAgICBzcmM3Nl9sLCBzcmM4N19sLCBzcmM5OF9sLCBzcmMxMDlfbCk7CiAKLSAgICAgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgZHN0MCA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgZHN0MyA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2wsIHNyYzg3X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgZHN0NCA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3IsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgZHN0NSA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzMyX2wsIHNyYzU0X2wsIHNyYzc2X2wsIHNyYzk4X2wsIGZpbHQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworICAgICAgICAgICAgZHN0NiA9IEhFVkNfRklMVF84VEFQX1NIKHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKyAgICAgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfOFRBUF9TSChzcmM0M19sLCBzcmM2NV9sLCBzcmM4N19sLCBzcmMxMDlfbCwgZmlsdDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKLSAgICAgICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MV9sLCBkc3QxX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdF90bXAsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0X3RtcCArPSAoMiAqIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0MCwgZHN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDQsIGRzdDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NiwgZHN0Nyk7CisgICAgICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFBDS0VWX0IyX1VCKGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsIG91dDIsIG91dDMpOworICAgICAgICAgICAgU1RfVUI0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdF90bXAsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgZHN0X3RtcCArPSAoNCAqIGRzdF9zdHJpZGUpOwogCi0gICAgICAgICAgICBzcmMxMF9yID0gc3JjMzJfcjsKLSAgICAgICAgICAgIHNyYzMyX3IgPSBzcmM1NF9yOwotICAgICAgICAgICAgc3JjNTRfciA9IHNyYzc2X3I7Ci0gICAgICAgICAgICBzcmMyMV9yID0gc3JjNDNfcjsKLSAgICAgICAgICAgIHNyYzQzX3IgPSBzcmM2NV9yOwotICAgICAgICAgICAgc3JjNjVfciA9IHNyYzg3X3I7Ci0gICAgICAgICAgICBzcmMxMF9sID0gc3JjMzJfbDsKLSAgICAgICAgICAgIHNyYzMyX2wgPSBzcmM1NF9sOwotICAgICAgICAgICAgc3JjNTRfbCA9IHNyYzc2X2w7Ci0gICAgICAgICAgICBzcmMyMV9sID0gc3JjNDNfbDsKLSAgICAgICAgICAgIHNyYzQzX2wgPSBzcmM2NV9sOwotICAgICAgICAgICAgc3JjNjVfbCA9IHNyYzg3X2w7Ci0gICAgICAgICAgICBzcmM2ID0gc3JjODsKKyAgICAgICAgICAgIHNyYzAgPSBzcmM0OworICAgICAgICAgICAgc3JjMSA9IHNyYzU7CisgICAgICAgICAgICBzcmMyID0gc3JjNjsKKyAgICAgICAgICAgIHNyYzMgPSBzcmM3OworICAgICAgICAgICAgc3JjNCA9IHNyYzg7CisgICAgICAgICAgICBzcmM1ID0gc3JjOTsKKyAgICAgICAgICAgIHNyYzYgPSBzcmMxMDsKICAgICAgICAgfQogCiAgICAgICAgIHNyYyArPSAxNjsKQEAgLTE0NjQsOSArMTY4MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y192dF91bml3Z3RfOHRfMTZtdWx0eDJtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICBoZXZjX3Z0X3VuaXdndF84dF8xNm11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBoZWlnaHQsIHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcm5kX3ZhbCwgMTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBybmRfdmFsLCAxKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y192dF91bml3Z3RfOHRfMjR3X21zYSh1aW50OF90ICpzcmMsCkBAIC0xNDc5LDEyICsxNjk2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y192dF91bml3Z3RfOHRfMTZtdWx0eDJtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwsIDE2KTsKKyAgICBoZXZjX3Z0X3VuaXdndF84dF8xNm11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCAzMiwgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBybmRfdmFsLCAxKTsKIAogICAgIGhldmNfdnRfdW5pd2d0Xzh0Xzh3X21zYShzcmMgKyAxNiwgc3JjX3N0cmlkZSwgZHN0ICsgMTYsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgMzIsIHdlaWdodCwgb2Zmc2V0LCBybmRfdmFsKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y192dF91bml3Z3RfOHRfMzJ3X21zYSh1aW50OF90ICpzcmMsCkBAIC0xNDk3LDkgKzE3MTQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGhldmNfdnRfdW5pd2d0Xzh0XzE2bXVsdHgybXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgaGV2Y192dF91bml3Z3RfOHRfMTZtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwsIDMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcm5kX3ZhbCwgMik7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfdnRfdW5pd2d0Xzh0XzQ4d19tc2EodWludDhfdCAqc3JjLApAQCAtMTUxMiw5ICsxNzI5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICBoZXZjX3Z0X3VuaXdndF84dF8xNm11bHR4Mm11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBoZWlnaHQsIHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcm5kX3ZhbCwgNDgpOworICAgIGhldmNfdnRfdW5pd2d0Xzh0XzE2bXVsdHg0bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIDY0LCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwsIDMpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX3Z0X3VuaXdndF84dF82NHdfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTE1MjcsOSArMTc0NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y192dF91bml3Z3RfOHRfMTZtdWx0eDJtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICBoZXZjX3Z0X3VuaXdndF84dF8xNm11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBoZWlnaHQsIHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcm5kX3ZhbCwgNjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBybmRfdmFsLCA0KTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl91bml3Z3RfOHRfNHdfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTE1NDQsNDAgKzE3NjEsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICB2MTZ1OCBvdXQ7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMzsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOworICAgIHY4aTE2IGZpbHRlcl92ZWM7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKICAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OwotICAgIHY4aTE2IGRzdDMwLCBkc3Q0MSwgZHN0NTIsIGRzdDYzLCBkc3Q2NiwgZHN0ODc7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKLSAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKLSAgICB2OHUxNiBtYXNrNCA9IHsgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyB9OworICAgIHY4aTE2IGRzdDMwLCBkc3Q0MSwgZHN0NTIsIGRzdDYzLCBkc3Q2NiwgZHN0OTcsIGRzdDEwODsKKyAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLCBkc3Q5OF9yOworICAgIHY4aTE2IGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsIGRzdDEwOV9yOworICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLCBjb25zdF8xMjgsIGRlbm9tX3ZlYzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAKICAgICBzcmMgLT0gKCgzICogc3JjX3N0cmlkZSkgKyAzKTsKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3gpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzRfU1coZmlsdGVyX3ZlYywgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgU1BMQVRJX1c0X1NIKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAgICAgbWFzazIgPSBtYXNrMCArIDQ7CiAgICAgbWFzazMgPSBtYXNrMCArIDY7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKLQogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKICAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKKyAgICBkZW5vbV92ZWMgPSBybmRfdmVjIC0gNjsKKworICAgIGNvbnN0XzEyOCA9IF9fbXNhX2xkaV93KDEyOCk7CisgICAgY29uc3RfMTI4ICo9IHdlaWdodF92ZWM7CisgICAgb2Zmc2V0X3ZlYyArPSBfX21zYV9zcmFyX3coY29uc3RfMTI4LCBkZW5vbV92ZWMpOwogCiAgICAgTERfU0I3KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CiAgICAgc3JjICs9ICg3ICogc3JjX3N0cmlkZSk7CkBAIC0xNTkwLDY0ICsxODA5LDY4IEBACiAgICAgICAgICAgICAgICB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEpOwogICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSk7Ci0gICAgZHN0MzAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICBkc3QzMCwgZHN0MzAsIGRzdDMwLCBkc3QzMCk7Ci0gICAgZHN0NDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICBkc3Q0MSwgZHN0NDEsIGRzdDQxLCBkc3Q0MSk7Ci0gICAgZHN0NTIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgIGRzdDUyLCBkc3Q1MiwgZHN0NTIsIGRzdDUyKTsKLSAgICBkc3Q2MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjRfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICBkc3Q2MywgZHN0NjMsIGRzdDYzLCBkc3Q2Myk7CisgICAgZHN0MzAgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDQxID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q1MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q2MyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCi0gICAgSUxWUl9IM19TSChkc3Q0MSwgZHN0MzAsIGRzdDUyLCBkc3Q0MSwgZHN0NjMsIGRzdDUyLAotICAgICAgICAgICAgICAgZHN0MTBfciwgZHN0MjFfciwgZHN0MzJfcik7Ci0KLSAgICBkc3Q0M19yID0gX19tc2FfaWx2bF9oKGRzdDQxLCBkc3QzMCk7Ci0gICAgZHN0NTRfciA9IF9fbXNhX2lsdmxfaChkc3Q1MiwgZHN0NDEpOwotICAgIGRzdDY1X3IgPSBfX21zYV9pbHZsX2goZHN0NjMsIGRzdDUyKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q0MSwgZHN0MzAsIGRzdDEwX3IsIGRzdDQzX3IpOworICAgIElMVlJMX0gyX1NIKGRzdDUyLCBkc3Q0MSwgZHN0MjFfciwgZHN0NTRfcik7CisgICAgSUxWUkxfSDJfU0goZHN0NjMsIGRzdDUyLCBkc3QzMl9yLCBkc3Q2NV9yKTsKIAogICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDYzLCAxKTsKIAotICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCk7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM3LCBzcmM4KTsKKyAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDI7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKIAotICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzksIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3Q4NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0ODcsIGRzdDg3LCBkc3Q4NywgZHN0ODcpOwotICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDg3LCBkc3Q2Nik7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF84VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwotICAgICAgICBkc3Q4N19yID0gX19tc2FfdnNoZl9oKCh2OGkxNikgbWFzazQsIGRzdDg3LCBkc3Q4Nyk7Ci0gICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF84VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzEwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKKyAgICAgICAgICAgICAgICAgICB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0OTcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MTA4ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCi0gICAgICAgIGRzdDBfciA+Pj0gNjsKLSAgICAgICAgZHN0MV9yID4+PSA2OworICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDk3LCBkc3Q2Nik7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEwOCwgZHN0OTcsIGRzdDg3X3IsIGRzdDEwOV9yKTsKKyAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0OTcsIDEpOworICAgICAgICBkc3Q5OF9yID0gX19tc2FfaWx2cl9oKGRzdDY2LCBkc3QxMDgpOworCisgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF84VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZHN0OThfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF84VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsIGRzdDEwOV9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKworICAgICAgICBTUkFfNFYoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKICAgICAgICAgTVVMMihkc3QwX3IsIHdlaWdodF92ZWMsIGRzdDFfciwgd2VpZ2h0X3ZlYywgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTUkFSX1cyX1NXKGRzdDBfciwgZHN0MV9yLCBybmRfdmVjKTsKKyAgICAgICAgTVVMMihkc3QyX3IsIHdlaWdodF92ZWMsIGRzdDNfciwgd2VpZ2h0X3ZlYywgZHN0Ml9yLCBkc3QzX3IpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgcm5kX3ZlYyk7CiAgICAgICAgIEFERDIoZHN0MF9yLCBvZmZzZXRfdmVjLCBkc3QxX3IsIG9mZnNldF92ZWMsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgZHN0MF9yID0gQ0xJUF9TV18wXzI1NShkc3QwX3IpOwotICAgICAgICBkc3QxX3IgPSBDTElQX1NXXzBfMjU1KGRzdDFfcik7CisgICAgICAgIEFERDIoZHN0Ml9yLCBvZmZzZXRfdmVjLCBkc3QzX3IsIG9mZnNldF92ZWMsIGRzdDJfciwgZHN0M19yKTsKKyAgICAgICAgQ0xJUF9TVzRfMF8yNTVfTUFYX1NBVFUoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yKTsKKyAgICAgICAgUENLRVZfSDJfU1coZHN0MV9yLCBkc3QwX3IsIGRzdDNfciwgZHN0Ml9yLCBkc3QwX3IsIGRzdDFfcik7CisgICAgICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDFfciwgKHYxNmk4KSBkc3QwX3IpOworICAgICAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0IyKGRzdDFfciwgZHN0MF9yLCBkc3QwX3IpOwotICAgICAgICBTVDR4Ml9VQihkc3QwX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIGRzdDEwX3IgPSBkc3QzMl9yOwotICAgICAgICBkc3QzMl9yID0gZHN0NTRfcjsKLSAgICAgICAgZHN0NTRfciA9IGRzdDc2X3I7Ci0gICAgICAgIGRzdDIxX3IgPSBkc3Q0M19yOwotICAgICAgICBkc3Q0M19yID0gZHN0NjVfcjsKLSAgICAgICAgZHN0NjVfciA9IGRzdDg3X3I7Ci0gICAgICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDg3LCAxKTsKKyAgICAgICAgZHN0MTBfciA9IGRzdDU0X3I7CisgICAgICAgIGRzdDMyX3IgPSBkc3Q3Nl9yOworICAgICAgICBkc3Q1NF9yID0gZHN0OThfcjsKKyAgICAgICAgZHN0MjFfciA9IGRzdDY1X3I7CisgICAgICAgIGRzdDQzX3IgPSBkc3Q4N19yOworICAgICAgICBkc3Q2NV9yID0gZHN0MTA5X3I7CisgICAgICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDEwOCwgMSk7CiAgICAgfQogfQogCkBAIC0xNjcwLDcgKzE4OTMsNyBAQAogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwogICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDM7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OwogICAgIHYxNmk4IHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTU7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0ODsKQEAgLTE2NzksMjMgKzE5MDIsMjUgQEAKICAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3Q3Nl9sOwogICAgIHY4aTE2IGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3I7CiAgICAgdjhpMTYgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbCwgZHN0ODdfbDsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgY29uc3RfMTI4LCBkZW5vbV92ZWM7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKIAogICAgIHNyYyAtPSAoKDMgKiBzcmNfc3RyaWRlKSArIDMpOwotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwogICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOworICAgIGRlbm9tX3ZlYyA9IHJuZF92ZWMgLSA2OworCisgICAgY29uc3RfMTI4ID0gX19tc2FfbGRpX3coMTI4KTsKKyAgICBjb25zdF8xMjggKj0gd2VpZ2h0X3ZlYzsKKyAgICBvZmZzZXRfdmVjICs9IF9fbXNhX3NyYXJfdyhjb25zdF8xMjgsIGRlbm9tX3ZlYyk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3gpOwogICAgIFNQTEFUSV9INF9TSChmaWx0ZXJfdmVjLCAwLCAxLCAyLCAzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Myk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAgICAgU1BMQVRJX1c0X1NXKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CkBAIC0xNzE4LDE4ICsxOTQzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExKTsKICAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDAsIGRzdDAsIGRzdDApOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QyLCBkc3QyLCBkc3QyKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDMsIGRzdDMsIGRzdDMsIGRzdDMpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKIAogICAgICAgICBWU0hGX0I0X1NCKHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwpAQCAtMTczNywxNSArMTk1OCwxMiBAQAogICAgICAgICAgICAgICAgICAgIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOwogICAgICAgICBWU0hGX0I0X1NCKHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgIHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDQsIGRzdDQsIGRzdDQpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q1LCBkc3Q1LCBkc3Q1LCBkc3Q1KTsKLSAgICAgICAgZHN0NiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q2LCBkc3Q2LCBkc3Q2LCBkc3Q2KTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOwogCiAgICAgICAgIElMVlJfSDRfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0MiwgZHN0MSwKICAgICAgICAgICAgICAgICAgICBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3QyMV9yKTsKQEAgLTE3NjEsOSArMTk3OSw4IEBACiAKICAgICAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICAgICAgZHN0NyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q3LCBkc3Q3LCBkc3Q3LCBkc3Q3KTsKKyAgICAgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDIsIGZpbHQzKTsKIAogICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NywgZHN0NiwgZHN0NzZfciwgZHN0NzZfbCk7CiAgICAgICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLApAQCAtMTc3Niw5ICsxOTkzLDggQEAKICAgICAgICAgICAgIC8qIHJvdyA4ICovCiAgICAgICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgICAgIGRzdDggPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0OCwgZHN0OCwgZHN0OCwgZHN0OCk7CisgICAgICAgICAgICBkc3Q4ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQyLCBmaWx0Myk7CiAKICAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOwogICAgICAgICAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfciwKQEAgLTE3ODgsMTEgKzIwMDQsMTUgQEAKICAgICAgICAgICAgIGRzdDFfciA+Pj0gNjsKICAgICAgICAgICAgIGRzdDFfbCA+Pj0gNjsKIAotICAgICAgICAgICAgSEVWQ19IVl9VTklXX1JORF9DTElQNChkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCk7CisgICAgICAgICAgICBNVUwyKGRzdDBfciwgd2VpZ2h0X3ZlYywgZHN0MF9sLCB3ZWlnaHRfdmVjLCBkc3QwX3IsIGRzdDBfbCk7CisgICAgICAgICAgICBNVUwyKGRzdDFfciwgd2VpZ2h0X3ZlYywgZHN0MV9sLCB3ZWlnaHRfdmVjLCBkc3QxX3IsIGRzdDFfbCk7CisgICAgICAgICAgICBTUkFSX1c0X1NXKGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCwgcm5kX3ZlYyk7CisgICAgICAgICAgICBBREQyKGRzdDBfciwgb2Zmc2V0X3ZlYywgZHN0MF9sLCBvZmZzZXRfdmVjLCBkc3QwX3IsIGRzdDBfbCk7CisgICAgICAgICAgICBBREQyKGRzdDFfciwgb2Zmc2V0X3ZlYywgZHN0MV9sLCBvZmZzZXRfdmVjLCBkc3QxX3IsIGRzdDFfbCk7CisgICAgICAgICAgICBDTElQX1NXNF8wXzI1NV9NQVhfU0FUVShkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOwogCi0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjQoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QwX3IpOworICAgICAgICAgICAgUENLRVZfSDJfU1coZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QwX3IsIGRzdDFfcik7CisgICAgICAgICAgICBkc3QwX3IgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxX3IsICh2MTZpOCkgZHN0MF9yKTsKICAgICAgICAgICAgIFNUOHgyX1VCKGRzdDBfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7CiAgICAgICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7CiAKQEAgLTE4NDMsMTIgKzIwNjMsMTk4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y19odl91bml3Z3RfOHRfOG11bHR4Mm11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwsIDgpOwotICAgIGhldmNfaHZfdW5pd2d0Xzh0XzR3X21zYShzcmMgKyA4LCBzcmNfc3RyaWRlLCBkc3QgKyA4LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0LCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWwpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQ4X3QgKnNyY190bXAsICpkc3RfdG1wOworICAgIHYxNnU4IG91dDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazc7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjhpMTYgZHN0MzAsIGRzdDQxLCBkc3Q1MiwgZHN0NjMsIGRzdDY2LCBkc3Q5NywgZHN0MTA4OworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2w7CisgICAgdjhpMTYgZHN0OThfciwgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfciwgZHN0MTA5X3I7CisgICAgdjhpMTYgZHN0NzZfbCwgZmlsdGVyX3ZlYzsKKyAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLCBjb25zdF8xMjgsIGRlbm9tX3ZlYzsKKworICAgIHNyYyAtPSAoKDMgKiBzcmNfc3RyaWRlKSArIDMpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKKyAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOworCisgICAgU1BMQVRJX1c0X1NIKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworCisgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOworICAgIGRlbm9tX3ZlYyA9IHJuZF92ZWMgLSA2OworCisgICAgY29uc3RfMTI4ID0gX19tc2FfbGRpX3coMTI4KTsKKyAgICBjb25zdF8xMjggKj0gd2VpZ2h0X3ZlYzsKKyAgICBvZmZzZXRfdmVjICs9IF9fbXNhX3NyYXJfdyhjb25zdF8xMjgsIGRlbm9tX3ZlYyk7CisKKyAgICBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOworICAgIG1hc2sxID0gbWFzazAgKyAyOworICAgIG1hc2syID0gbWFzazAgKyA0OworICAgIG1hc2szID0gbWFzazAgKyA2OworCisgICAgc3JjX3RtcCA9IHNyYzsKKyAgICBkc3RfdG1wID0gZHN0OworCisgICAgTERfU0I3KHNyY190bXAsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgIHNyY190bXAgKz0gKDcgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0I3XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKworICAgIC8qIHJvdyAwIHJvdyAxIHJvdyAyIHJvdyAzICovCisgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjOCwgdmVjOSwgdmVjMTAsCisgICAgICAgICAgICAgICB2ZWMxMSk7CisgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMTIsIHZlYzEzLCB2ZWMxNCwKKyAgICAgICAgICAgICAgIHZlYzE1KTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0MiA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDMgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0MiwgZmlsdDMpOworICAgIFZTSEZfQjRfU0Ioc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjRfU0Ioc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjRfU0Ioc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzgsIHZlYzksIHZlYzEwLAorICAgICAgICAgICAgICAgdmVjMTEpOworICAgIGRzdDQgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0NSA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQzKTsKKyAgICBkc3Q2ID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gMTY7IGxvb3BfY250LS07KSB7CisgICAgICAgIHNyYzcgPSBMRF9TQihzcmNfdG1wKTsKKyAgICAgICAgc3JjNyA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjNywgMTI4KTsKKyAgICAgICAgc3JjX3RtcCArPSBzcmNfc3RyaWRlOworCisgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEsIHZlYzIsCisgICAgICAgICAgICAgICAgICAgdmVjMyk7CisgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q3LCBkc3Q2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKKworICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzhUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0NzZfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDBfciA+Pj0gNjsKKyAgICAgICAgZHN0MF9sID4+PSA2OworCisgICAgICAgIE1VTDIoZHN0MF9yLCB3ZWlnaHRfdmVjLCBkc3QwX2wsIHdlaWdodF92ZWMsIGRzdDBfciwgZHN0MF9sKTsKKyAgICAgICAgU1JBUl9XMl9TVyhkc3QwX3IsIGRzdDBfbCwgcm5kX3ZlYyk7CisgICAgICAgIEFERDIoZHN0MF9yLCBvZmZzZXRfdmVjLCBkc3QwX2wsIG9mZnNldF92ZWMsIGRzdDBfciwgZHN0MF9sKTsKKyAgICAgICAgQ0xJUF9TVzJfMF8yNTVfTUFYX1NBVFUoZHN0MF9yLCBkc3QwX2wpOworICAgICAgICBkc3QwX3IgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QwX2wsICh2OGkxNikgZHN0MF9yKTsKKyAgICAgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MF9yLCAodjE2aTgpIGRzdDBfcik7CisgICAgICAgIFNUOHgxX1VCKG91dCwgZHN0X3RtcCk7CisgICAgICAgIGRzdF90bXAgKz0gZHN0X3N0cmlkZTsKKworICAgICAgICBkc3QwID0gZHN0MTsKKyAgICAgICAgZHN0MSA9IGRzdDI7CisgICAgICAgIGRzdDIgPSBkc3QzOworICAgICAgICBkc3QzID0gZHN0NDsKKyAgICAgICAgZHN0NCA9IGRzdDU7CisgICAgICAgIGRzdDUgPSBkc3Q2OworICAgICAgICBkc3Q2ID0gZHN0NzsKKyAgICB9CisKKyAgICBzcmMgKz0gODsKKyAgICBkc3QgKz0gODsKKworICAgIG1hc2s0ID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKKyAgICBtYXNrNSA9IG1hc2s0ICsgMjsKKyAgICBtYXNrNiA9IG1hc2s0ICsgNDsKKyAgICBtYXNrNyA9IG1hc2s0ICsgNjsKKworICAgIExEX1NCNyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgIHNyYyArPSAoNyAqIHNyY19zdHJpZGUpOworICAgIFhPUklfQjdfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworCisgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMzLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CNF9TQihzcmMxLCBzcmM0LCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CNF9TQihzcmMyLCBzcmM1LCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjOCwgdmVjOSwgdmVjMTAsCisgICAgICAgICAgICAgICB2ZWMxMSk7CisgICAgVlNIRl9CNF9TQihzcmMzLCBzcmM2LCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjMTIsIHZlYzEzLCB2ZWMxNCwKKyAgICAgICAgICAgICAgIHZlYzE1KTsKKyAgICBkc3QzMCA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgZHN0NDEgPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDUyID0gSEVWQ19GSUxUXzhUQVBfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgIGRzdDYzID0gSEVWQ19GSUxUXzhUQVBfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisgICAgSUxWUkxfSDJfU0goZHN0NDEsIGRzdDMwLCBkc3QxMF9yLCBkc3Q0M19yKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q1MiwgZHN0NDEsIGRzdDIxX3IsIGRzdDU0X3IpOworICAgIElMVlJMX0gyX1NIKGRzdDYzLCBkc3Q1MiwgZHN0MzJfciwgZHN0NjVfcik7CisKKyAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q2MywgMSk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gNDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworCisgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjOSwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsIHZlYzAsIHZlYzEsIHZlYzIsCisgICAgICAgICAgICAgICAgICAgdmVjMyk7CisgICAgICAgIFZTSEZfQjRfU0Ioc3JjOCwgc3JjMTAsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWM0LCB2ZWM1LCB2ZWM2LAorICAgICAgICAgICAgICAgICAgIHZlYzcpOworICAgICAgICBkc3Q5NyA9IEhFVkNfRklMVF84VEFQX1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdDMpOworICAgICAgICBkc3QxMDggPSBIRVZDX0ZJTFRfOFRBUF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0Myk7CisKKyAgICAgICAgZHN0NzZfciA9IF9fbXNhX2lsdnJfaChkc3Q5NywgZHN0NjYpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDgsIGRzdDk3LCBkc3Q4N19yLCBkc3QxMDlfcik7CisgICAgICAgIGRzdDY2ID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDk3LCAxKTsKKyAgICAgICAgZHN0OThfciA9IF9fbXNhX2lsdnJfaChkc3Q2NiwgZHN0MTA4KTsKKworICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF84VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGRzdDk4X3IsIGZpbHRfaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisKKyAgICAgICAgU1JBXzRWKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgNik7CisgICAgICAgIE1VTDIoZHN0MF9yLCB3ZWlnaHRfdmVjLCBkc3QxX3IsIHdlaWdodF92ZWMsIGRzdDBfciwgZHN0MV9yKTsKKyAgICAgICAgTVVMMihkc3QyX3IsIHdlaWdodF92ZWMsIGRzdDNfciwgd2VpZ2h0X3ZlYywgZHN0Ml9yLCBkc3QzX3IpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgcm5kX3ZlYyk7CisgICAgICAgIEFERDIoZHN0MF9yLCBvZmZzZXRfdmVjLCBkc3QxX3IsIG9mZnNldF92ZWMsIGRzdDBfciwgZHN0MV9yKTsKKyAgICAgICAgQUREMihkc3QyX3IsIG9mZnNldF92ZWMsIGRzdDNfciwgb2Zmc2V0X3ZlYywgZHN0Ml9yLCBkc3QzX3IpOworICAgICAgICBDTElQX1NXNF8wXzI1NV9NQVhfU0FUVShkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IpOworICAgICAgICBQQ0tFVl9IMl9TVyhkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIGRzdDBfciwgZHN0MV9yKTsKKyAgICAgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MV9yLCAodjE2aTgpIGRzdDBfcik7CisgICAgICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKworICAgICAgICBkc3QxMF9yID0gZHN0NTRfcjsKKyAgICAgICAgZHN0MzJfciA9IGRzdDc2X3I7CisgICAgICAgIGRzdDU0X3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QyMV9yID0gZHN0NjVfcjsKKyAgICAgICAgZHN0NDNfciA9IGRzdDg3X3I7CisgICAgICAgIGRzdDY1X3IgPSBkc3QxMDlfcjsKKyAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MTA4LCAxKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfdW5pd2d0Xzh0XzE2d19tc2EodWludDhfdCAqc3JjLApAQCAtMTkzNiwxOSArMjM0MiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKKyAgICB2MTZ1OCBvdXQ7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHZlYzAsIHZlYzE7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjhpMTYgZHN0MDsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbDsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwIH07CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzE2XSk7CiAKICAgICBzcmMgLT0gMTsKIApAQCAtMTk1OSwyOSArMjM2NSwzMyBAQAogCiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwotCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEpOwogICAgIFhPUklfQjJfMTI4X1NCKHNyYzAsIHNyYzEpOwogCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBJTFZSTF9IMl9TVyhkc3QwLCBkc3QwLCBkc3QwX3IsIGRzdDBfbCk7CiAgICAgRE9UUF9TSDJfU1coZHN0MF9yLCBkc3QwX2wsIHdlaWdodF92ZWMsIHdlaWdodF92ZWMsIGRzdDBfciwgZHN0MF9sKTsKICAgICBTUkFSX1cyX1NXKGRzdDBfciwgZHN0MF9sLCBybmRfdmVjKTsKLSAgICBBREQyKGRzdDBfciwgb2Zmc2V0X3ZlYywgZHN0MF9sLCBvZmZzZXRfdmVjLCBkc3QwX3IsIGRzdDBfbCk7Ci0gICAgZHN0MF9yID0gQ0xJUF9TV18wXzI1NShkc3QwX3IpOwotICAgIGRzdDBfbCA9IENMSVBfU1dfMF8yNTUoZHN0MF9sKTsKLQotICAgIEhFVkNfUENLX1NXX1NCMihkc3QwX2wsIGRzdDBfciwgZHN0MF9yKTsKLSAgICBTVDR4Ml9VQihkc3QwX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgZHN0MCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QwX2wsICh2OGkxNikgZHN0MF9yKTsKKyAgICBkc3QwID0gX19tc2FfYWRkc19zX2goZHN0MCwgb2Zmc2V0X3ZlYyk7CisgICAgZHN0MCA9IENMSVBfU0hfMF8yNTVfTUFYX1NBVFUoZHN0MCk7CisgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgZHN0MCwgKHYxNmk4KSBkc3QwKTsKKyAgICBTVDR4Ml9VQihvdXQsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiB9CiAKQEAgLTE5OTAsMTkgKzI0MDAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CisgICAgdjE2dTggb3V0OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwotICAgIHYxNmk4IG1hc2sxLCB2ZWMwLCB2ZWMxOworICAgIHYxNmk4IG1hc2sxLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwogICAgIHY4aTE2IGRzdDAsIGRzdDE7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMTZdKTsKIAogICAgIHNyYyAtPSAxOwogCkBAIC0yMDE0LDI5ICsyNDIzLDMyIEBACiAKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7Ci0KICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKKyAgICB3ZWlnaHQgKj0gMTI4OworICAgIHJuZF92YWwgLT0gNjsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX2ZpbGxfaCh3ZWlnaHQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9zcmFyX2god2VpZ2h0X3ZlY19oLCBkZW5vbV92ZWMpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9hZGRzX3NfaChvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjX2gpOworCiAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAKICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICBIRVZDX1VOSVdfUk5EX0NMSVAyX01BWF9TQVRVX0goZHN0MCwgZHN0MSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSk7CiAKLSAgICBIRVZDX1VOSVdfUk5EX0NMSVAyKGRzdDAsIGRzdDEsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOwotCi0gICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICBTVDR4NF9VQihkc3QwX3IsIGRzdDBfciwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxLCAodjE2aTgpIGRzdDApOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogfQogCkBAIC0yMDUxLDE0ICsyNDYzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDE7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7Ci0gICAgdjE2aTggbWFzazEsIHZlYzAsIHZlYzE7CisgICAgdjE2aTggbWFzazEsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwIH07CisgICAgdjhpMTYgZmlsdGVyX3ZlYzsKKyAgICB2OGkxNiB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMTZdKTsKIAogICAgIHNyYyAtPSAxOwogCkBAIC0yMDY2LDEzICsyNDc5LDIwIEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCiAgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMyk7IGxvb3BfY250LS07KSB7CkBAIC0yMDgyLDI5ICsyNTAyLDIwIEBACiAgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwogCiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM0LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzcsIHNyYzYsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNCwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM3LCBzcmM2LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUNHg4X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgU1Q0eDhfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQpAQCAtMjEyMSwxMCArMjUzMiwxMCBAQAogewogICAgIGlmICgyID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h6X3VuaXdndF80dF80eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h6X3VuaXdndF80dF80eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICg4ID09IGhlaWdodCB8fCAxNiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19oel91bml3Z3RfNHRfNHg4bXVsdGlwbGVfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBoZWlnaHQsIHdlaWdodCwKQEAgLTIxNDIsMTYgKzI1NTMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxOwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gMTsKIApAQCAtMjE1OSw0OCArMjU2OSw1MyBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q3ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKIAotICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0KLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotCi0gICAgICAgIFNUNng0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICB9CisgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgb3V0MCwgb3V0MSk7CisgICAgUENLRVZfQjJfVUIoZHN0NSwgZHN0NCwgZHN0NywgZHN0Niwgb3V0Miwgb3V0Myk7CisgICAgU1Q2eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICBTVDZ4NF9VQihvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h6X3VuaXdndF80dF84eDJfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTIyMDgsMTkgKzI2MjMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CisgICAgdjE2dTggb3V0OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MTsKICAgICB2MTZpOCBzcmMwLCBzcmMxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gMTsKIApAQCAtMjIyOCw1MiArMjY0Miw1MiBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAogICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEpOwogICAgIFhPUklfQjJfMTI4X1NCKHNyYzAsIHNyYzEpOwogCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOwogCi0gICAgSEVWQ19VTklXX1JORF9DTElQMihkc3QwLCBkc3QxLCB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sKTsKKyAgICBIRVZDX1VOSVdfUk5EX0NMSVAyX01BWF9TQVRVX0goZHN0MCwgZHN0MSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSk7CiAKLSAgICBIRVZDX1BDS19TV19TQjQoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QwX3IpOwotICAgIFNUOHgyX1VCKGRzdDBfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxLCAodjE2aTgpIGRzdDApOworICAgIFNUOHgyX1VCKG91dCwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgaGV2Y19oel91bml3Z3RfNHRfOHg2X21zYSh1aW50OF90ICpzcmMsCitzdGF0aWMgdm9pZCBoZXZjX2h6X3VuaXdndF80dF84eDRfbXNhKHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OwotICAgIHYxNmk4IG1hc2sxOwotICAgIHYxNmk4IHZlYzAsIHZlYzE7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfcjsKLSAgICB2NGkzMiBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wsIGRzdDRfbCwgZHN0NV9sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSAxOwogCkBAIC0yMjgxLDYxICsyNjk1LDExMyBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKKyAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7CisgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKKworICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKKyAgICBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKKyAgICBtYXNrMSA9IG1hc2swICsgMjsKKworICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKworICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKworICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIGhldmNfaHpfdW5pd2d0XzR0Xzh4Nl9tc2EodWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCit7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MjsKKyAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKKyAgICB2MTZpOCBtYXNrMTsKKyAgICB2MTZpOCB2ZWMxMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5LCB2ZWMxMDsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CisKKyAgICBzcmMgLT0gMTsKKworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOworICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOworCisgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAogICAgIExEX1NCNihzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUpOwotICAgIExEX1NCNihzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUpOwogICAgIFhPUklfQjZfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUpOwogCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzgsIHZlYzkpOworICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMxMCwgdmVjMTEpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM4LCB2ZWM5LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICBIRVZDX1VOSVdfUk5EX0NMSVAyX01BWF9TQVRVX0goZHN0NCwgZHN0NSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSk7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQotICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotCi0gICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7Ci0KLSAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgIEhFVkNfVU5JV19STkRfQ0xJUDIoZHN0NCwgZHN0NSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfciwgZHN0NV9yLCBkc3Q0X2wsIGRzdDVfbCk7Ci0KLSAgICBIRVZDX1BDS19TV19TQjEyKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgIGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwgZHN0MF9yLCBkc3QxX3IsIGRzdDJfcik7Ci0KLSAgICBTVDh4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBQQ0tFVl9CM19VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBvdXQwLCBvdXQxLCBvdXQyKTsKKyAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIFNUOHgyX1VCKGRzdDJfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDh4Ml9VQihvdXQyLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBoZXZjX2h6X3VuaXdndF80dF84eDRtdWx0aXBsZV9tc2EodWludDhfdCAqc3JjLAorc3RhdGljIHZvaWQgaGV2Y19oel91bml3Z3RfNHRfOHg4bXVsdGlwbGVfbXNhKHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKQEAgLTIzNDcsMTQgKzI4MTMsMTQgQEAKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxOwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gMTsKIApAQCAtMjM2Miw0NyArMjgyOCw1NiBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMyk7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CiAKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0KLSAgICAgICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0NSwgZHN0NCwgZHN0NywgZHN0Niwgb3V0Miwgb3V0Myk7CisgICAgICAgIFNUOHg4X1VCKG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KIApAQCAtMjQxOCwxMiArMjg5MywxNSBAQAogewogICAgIGlmICgyID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h6X3VuaXdndF80dF84eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBoZXZjX2h6X3VuaXdndF80dF84eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgd2VpZ2h0LCBvZmZzZXQsIHJuZF92YWwpOwogICAgIH0gZWxzZSBpZiAoNiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19oel91bml3Z3RfNHRfOHg2X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGhlaWdodCwgd2VpZ2h0LCBvZmZzZXQsIHJuZF92YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgd2VpZ2h0LCBvZmZzZXQsIHJuZF92YWwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGhldmNfaHpfdW5pd2d0XzR0Xzh4NG11bHRpcGxlX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICAgICAgaGV2Y19oel91bml3Z3RfNHRfOHg4bXVsdGlwbGVfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBoZWlnaHQsIHdlaWdodCwgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kX3ZhbCk7CiAgICAgfQpAQCAtMjQ0MCwxOSArMjkxOCwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHYxNmk4IG1hc2syID0geyA4LCA5LCA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDI0LCAyNSwgMjUsIDI2LCAyNiwgMjcsIDI3LCAyOAogICAgIH07CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjE2aTggdmVjMCwgdmVjMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5LCB2ZWMxMDsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCBtYXNrMzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgZHN0NF9sLCBkc3Q1X2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2MTZpOCBtYXNrMywgdmVjMTE7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSAxOwogCkBAIC0yNDYwLDYwICsyOTM3LDUxIEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2szID0gbWFzazIgKyAyOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKIAogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKIAogICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrMywgdmVjOCwgdmVjOSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMiwgc3JjMywgbWFzazIsIG1hc2szLCB2ZWMxMCwgdmVjMTEpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzgsIHZlYzksIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3Q0LCBkc3Q1KTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMzLCBzcmMyLCBzcmMzLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKLQotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVAyKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjEyKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IpOwotCi0gICAgICAgIFNUMTJ4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9CM19VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBvdXQwLCBvdXQxLCBvdXQyKTsKKyAgICAgICAgU1QxMng0X1VCKG91dDAsIG91dDEsIG91dDIsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KQEAgLTI1MjksMTUgKzI5OTcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKCZmZl9oZXZjX21hc2tfYXJyWzBdKTsKICAgICB2MTZpOCBtYXNrMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7Ci0gICAgdjE2aTggdmVjMCwgdmVjMTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IDE7CiAKQEAgLTI1NDUsMTMgKzMwMTMsMjAgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7Ci0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKKyAgICB3ZWlnaHQgKj0gMTI4OworICAgIHJuZF92YWwgLT0gNjsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX2ZpbGxfaCh3ZWlnaHQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9zcmFyX2god2VpZ2h0X3ZlY19oLCBkZW5vbV92ZWMpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9hZGRzX3NfaChvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjX2gpOworCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKQEAgLTI1NjIsNTYgKzMwMzcsMzUgQEAKICAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CiAKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQorICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKICAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNywgc3JjNywgc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q2ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q2LCBkc3Q2KTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q3ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q3LCBkc3Q3KTsKKyAgICAgICAgUENLRVZfQjRfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0NywgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CiAKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQoZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1RfVUI0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KIApAQCAtMjYyNiwxNiArMzA4MCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdWludDhfdCAqZHN0X3RtcCA9IGRzdCArIDE2OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OwotICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSAxOwogCkBAIC0yNjQzLDE5ICszMDk1LDI1IEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwotCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKworICAgIG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2syID0gbWFzazAgKyA4OwogICAgIG1hc2szID0gbWFzazAgKyAxMDsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgewotICAgICAgICAvKiAxNiB3aWR0aCAqLworICAgIGZvciAobG9vcF9jbnQgPSAxNjsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMik7CiAgICAgICAgIExEX1NCMihzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMSwgc3JjMyk7CiAgICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwpAQCAtMjY2Myw0NiArMzEyMSwyOSBAQAogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKIAogICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotCi0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICAvKiA4IHdpZHRoICovCisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzIsIHNyYzMsIG1hc2syLCBtYXNrMywgdmVjNiwgdmVjNyk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKIAotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVAyKGRzdDAsIGRzdDEsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3Q0LCBkc3Q1KTsKIAotICAgICAgICBIRVZDX1BDS19TV19TQjQoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QwX3IpOwotICAgICAgICBTVDh4Ml9VQihkc3QwX3IsIGRzdF90bXAsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7CisgICAgICAgIFBDS0VWX0IzX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIG91dDAsIG91dDEsIG91dDIpOworICAgICAgICBTVF9VQjIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgU1Q4eDJfVUIob3V0MiwgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CiAKQEAgLTI3MTcsMTUgKzMxNTgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzI7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoJmZmX2hldmNfbWFza19hcnJbMF0pOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IDE7CiAKQEAgLTI3MzMsMTMgKzMxNzQsMjAgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7Ci0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKKyAgICB3ZWlnaHQgKj0gMTI4OworICAgIHJuZF92YWwgLT0gNjsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX2ZpbGxfaCh3ZWlnaHQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9zcmFyX2god2VpZ2h0X3ZlY19oLCBkZW5vbV92ZWMpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9hZGRzX3NfaChvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjX2gpOworCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAgICAgbWFzazIgPSBtYXNrMCArIDg7CiAgICAgbWFzazMgPSBtYXNrMCArIDEwOwpAQCAtMjc0OCw2NSArMzE5Niw0MCBAQAogICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjMCwgc3JjMSk7CiAgICAgICAgIHNyYzIgPSBMRF9TQihzcmMgKyAyNCk7CiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotCi0gICAgICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0KLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgMTYpOwotICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLQotICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIHNyYzIgPSBMRF9TQihzcmMgKyAyNCk7CisgICAgICAgIExEX1NCMihzcmMsIDE2LCBzcmMzLCBzcmM0KTsKKyAgICAgICAgc3JjNSA9IExEX1NCKHNyYyArIDI0KTsKICAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7Ci0KLSAgICAgICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7Ci0KKyAgICAgICAgWE9SSV9CNl8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjNCwgc3JjMywgc3JjNCwgbWFzazIsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0KLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgMTYpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0NSwgZHN0NCwgZHN0NywgZHN0Niwgb3V0Miwgb3V0Myk7CisgICAgICAgIFNUX1VCMihvdXQwLCBvdXQxLCBkc3QsIDE2KTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgIFNUX1VCMihvdXQyLCBvdXQzLCBkc3QsIDE2KTsKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CiAgICAgfQogfQpAQCAtMjgxNiw1NSArMzIzOSw1NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKKyAgICB2MTZ1OCBvdXQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yOwogICAgIHYxNmk4IHNyYzIxMTAsIHNyYzQzMzI7Ci0gICAgdjhpMTYgZHN0MTA7CisgICAgdjhpMTYgZHN0MDsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSBzcmNfc3RyaWRlOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAotICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOworICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwogICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7Ci0gICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjMjFfciwgKHYyaTY0KSBzcmMxMF9yKTsKLSAgICBzcmMyMTEwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBzcmMyMTEwLCAxMjgpOwotICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwogICAgIElMVlJfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfciwgc3JjNDNfcik7Ci0gICAgc3JjNDMzMiA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjNDNfciwgKHYyaTY0KSBzcmMzMl9yKTsKLSAgICBzcmM0MzMyID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBzcmM0MzMyLCAxMjgpOwotCi0gICAgZHN0MTAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSwgZHN0MTAsIGRzdDEwKTsKLQotICAgIElMVlJMX0gyX1NXKGRzdDEwLCBkc3QxMCwgZHN0MF9yLCBkc3QwX2wpOworICAgIElMVlJfRDJfU0Ioc3JjMjFfciwgc3JjMTBfciwgc3JjNDNfciwgc3JjMzJfciwgc3JjMjExMCwgc3JjNDMzMik7CisgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMjExMCwgc3JjNDMzMik7CisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSk7CisgICAgSUxWUkxfSDJfU1coZHN0MCwgZHN0MCwgZHN0MF9yLCBkc3QwX2wpOwogICAgIERPVFBfU0gyX1NXKGRzdDBfciwgZHN0MF9sLCB3ZWlnaHRfdmVjLCB3ZWlnaHRfdmVjLCBkc3QwX3IsIGRzdDBfbCk7CiAgICAgU1JBUl9XMl9TVyhkc3QwX3IsIGRzdDBfbCwgcm5kX3ZlYyk7Ci0gICAgQUREMihkc3QwX3IsIG9mZnNldF92ZWMsIGRzdDBfbCwgb2Zmc2V0X3ZlYywgZHN0MF9yLCBkc3QwX2wpOwotICAgIGRzdDBfciA9IENMSVBfU1dfMF8yNTUoZHN0MF9yKTsKLSAgICBkc3QwX2wgPSBDTElQX1NXXzBfMjU1KGRzdDBfbCk7Ci0KLSAgICBIRVZDX1BDS19TV19TQjIoZHN0MF9sLCBkc3QwX3IsIGRzdDBfcik7Ci0gICAgU1Q0eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIGRzdDAgPSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MF9sLCAodjhpMTYpIGRzdDBfcik7CisgICAgZHN0MCA9IF9fbXNhX2FkZHNfc19oKGRzdDAsIG9mZnNldF92ZWMpOworICAgIGRzdDAgPSBDTElQX1NIXzBfMjU1X01BWF9TQVRVKGRzdDApOworICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDAsICh2MTZpOCkgZHN0MCk7CisgICAgU1Q0eDJfVUIob3V0LCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX3Z0X3VuaXdndF80dF80eDRfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTI4NzIsNTUgKzMyOTQsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7CisgICAgdjE2dTggb3V0OwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzY7CiAgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKICAgICB2MTZpOCBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0OwotICAgIHY4aTE2IGRzdDEwLCBkc3QzMjsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2w7CisgICAgdjhpMTYgZHN0MCwgZHN0MTsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSBzcmNfc3RyaWRlOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAotICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOworICAgIExEX1NCNyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwogICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7Ci0gICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjMjFfciwgKHYyaTY0KSBzcmMxMF9yKTsKLSAgICBzcmMyMTEwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBzcmMyMTEwLCAxMjgpOwotCi0gICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CiAgICAgSUxWUl9CNF9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LAogICAgICAgICAgICAgICAgc3JjMzJfciwgc3JjNDNfciwgc3JjNTRfciwgc3JjNjVfcik7Ci0gICAgSUxWUl9EMl9TQihzcmM0M19yLCBzcmMzMl9yLCBzcmM2NV9yLCBzcmM1NF9yLCBzcmM0MzMyLCBzcmM2NTU0KTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmM0MzMyLCBzcmM2NTU0KTsKKyAgICBJTFZSX0QzX1NCKHNyYzIxX3IsIHNyYzEwX3IsIHNyYzQzX3IsIHNyYzMyX3IsIHNyYzY1X3IsIHNyYzU0X3IsCisgICAgICAgICAgICAgICBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0KTsKKyAgICBYT1JJX0IzXzEyOF9TQihzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0KTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxKTsKKyAgICBIRVZDX1VOSVdfUk5EX0NMSVAyX01BWF9TQVRVX0goZHN0MCwgZHN0MSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSk7CiAKLSAgICBkc3QxMCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxLCBkc3QxMCwgZHN0MTApOwotICAgIGRzdDMyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSChzcmM0MzMyLCBzcmM2NTU0LCBmaWx0MCwgZmlsdDEsIGRzdDMyLCBkc3QzMik7Ci0gICAgSEVWQ19VTklXX1JORF9DTElQMihkc3QxMCwgZHN0MzIsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOwotCi0gICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yKTsKLSAgICBTVDR4NF9VQihkc3QwX3IsIGRzdDBfciwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBkc3QxLCAodjE2aTgpIGRzdDApOworICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX3Z0X3VuaXdndF80dF80eDhtdWx0aXBsZV9tc2EodWludDhfdCAqc3JjLApAQCAtMjkzNCwyNiArMzM1NCwzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICBpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzk7CisgICAgdjE2dTggb3V0MCwgb3V0MTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmM5OF9yOwogICAgIHYxNmk4IHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3IsIHNyYzEwOV9yOwogICAgIHYxNmk4IHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzY7Ci0gICAgdjhpMTYgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzY7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7Ci0gICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHYxNmk4IHNyYzEwOTk4OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGZpbHQwLCBmaWx0MTsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IHNyY19zdHJpZGU7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwogCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCkBAIC0yOTY0LDM5ICszMzkxLDMxIEBACiAgICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjMjExMCwgMTI4KTsKIAogICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDMpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjYoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICAgICAgc3JjICs9ICg2ICogc3JjX3N0cmlkZSk7CisgICAgICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOwogICAgICAgICBJTFZSX0I0X1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsCiAgICAgICAgICAgICAgICAgICAgc3JjMzJfciwgc3JjNDNfciwgc3JjNTRfciwgc3JjNjVfcik7CiAgICAgICAgIElMVlJfQjJfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNzZfciwgc3JjODdfcik7Ci0gICAgICAgIElMVlJfRDNfU0Ioc3JjNDNfciwgc3JjMzJfciwgc3JjNjVfciwgc3JjNTRfciwgc3JjODdfciwgc3JjNzZfciwKLSAgICAgICAgICAgICAgICAgICBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2KTsKLSAgICAgICAgWE9SSV9CM18xMjhfU0Ioc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3Nik7CisgICAgICAgIElMVlJfQjJfU0Ioc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzk4X3IsIHNyYzEwOV9yKTsKKyAgICAgICAgSUxWUl9ENF9TQihzcmM0M19yLCBzcmMzMl9yLCBzcmM2NV9yLCBzcmM1NF9yLCBzcmM4N19yLCBzcmM3Nl9yLAorICAgICAgICAgICAgICAgICAgIHNyYzEwOV9yLCBzcmM5OF9yLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5OCk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4KTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0MzMyLCBzcmM2NTU0LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNjU1NCwgc3JjODc3NiwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzg3NzYsIHNyYzEwOTk4LCBmaWx0MCwgZmlsdDEpOwogCi0gICAgICAgIGRzdDEwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxLCBkc3QxMCwgZHN0MTApOwotICAgICAgICBkc3QzMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQwLCBmaWx0MSwgZHN0MzIsIGRzdDMyKTsKLSAgICAgICAgZHN0NTQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGRzdDU0LCBkc3Q1NCk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogCi0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzksIHNyYzIpOwotICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgSUxWUl9CMl9TQihzcmM5LCBzcmM4LCBzcmMyLCBzcmM5LCBzcmM5OF9yLCBzcmMxMDlfcik7Ci0gICAgICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzEwOV9yLCAodjJpNjQpIHNyYzk4X3IpOwotICAgICAgICBzcmMyMTEwID0gKHYxNmk4KSBfX21zYV94b3JpX2IoKHYxNnU4KSBzcmMyMTEwLCAxMjgpOwotCi0gICAgICAgIGRzdDc2ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjODc3Niwgc3JjMjExMCwgZmlsdDAsIGZpbHQxLCBkc3Q3NiwgZHN0NzYpOwotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KGRzdDEwLCBkc3QzMiwgZHN0NTQsIGRzdDc2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVDR4OF9VQihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIHNyYzIgPSBzcmMxMDsKKyAgICAgICAgc3JjMjExMCA9IHNyYzEwOTk4OwogICAgIH0KIH0KIApAQCAtMzAxMiwxMCArMzQzMSwxMCBAQAogewogICAgIGlmICgyID09IGhlaWdodCkgewogICAgICAgICBoZXZjX3Z0X3VuaXdndF80dF80eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewogICAgICAgICBoZXZjX3Z0X3VuaXdndF80dF80eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSA4KSkgewogICAgICAgICBoZXZjX3Z0X3VuaXdndF80dF80eDhtdWx0aXBsZV9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGhlaWdodCwgd2VpZ2h0LCBvZmZzZXQsCkBAIC0zMDMzLDY0ICszNDUyLDY2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2MTZpOCBzcmM1NF9yLCBzcmM2NV9yLCBzcmM3Nl9yLCBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfcjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2w7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2OGkxNiBmaWx0ZXJfdmVjLCB3ZWlnaHRfdmVjX2gsIG9mZnNldF92ZWMsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IHNyY19zdHJpZGU7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKICAgICB3ZWlnaHQgPSB3ZWlnaHQgJiAweDAwMDBGRkZGOwogCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CiAgICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CisgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIFhPUklfQjhfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKICAgICBJTFZSX0IyX1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzEwX3IsIHNyYzIxX3IpOworICAgIElMVlJfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfciwgc3JjNDNfcik7CisgICAgSUxWUl9CMl9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM1NF9yLCBzcmM2NV9yKTsKKyAgICBJTFZSX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzc2X3IsIHNyYzg3X3IpOworICAgIElMVlJfQjJfU0Ioc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzk4X3IsIHNyYzEwOV9yKTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMzJfciwgc3JjNTRfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNjVfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q3ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLSAgICAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOwogCi0gICAgICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEsIHRtcDAsIHRtcDApOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKLQotICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMyKTsKLSAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzEsIHNyYzIpOwotICAgICAgICBJTFZSX0IyX1NCKHNyYzEsIHNyYzQsIHNyYzIsIHNyYzEsIHNyYzEwX3IsIHNyYzIxX3IpOwotCi0gICAgICAgIHRtcDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMzMl9yLCBzcmMxMF9yLCBmaWx0MCwgZmlsdDEsIHRtcDIsIHRtcDIpOwotICAgICAgICB0bXAzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNDNfciwgc3JjMjFfciwgZmlsdDAsIGZpbHQxLCB0bXAzLCB0bXAzKTsKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotCi0gICAgICAgIFNUNng0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICB9CisgICAgUENLRVZfQjJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0Miwgb3V0MCwgb3V0MSk7CisgICAgUENLRVZfQjJfVUIoZHN0NSwgZHN0NCwgZHN0NywgZHN0Niwgb3V0Miwgb3V0Myk7CisgICAgU1Q2eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICBTVDZ4NF9VQihvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX3Z0X3VuaXdndF80dF84eDJfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTMwOTgsNDkgKzM1MTksMTA1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogeworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMTsKKyAgICB2OGkxNiBkc3QwLCBkc3QxOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2w7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSBzcmNfc3RyaWRlOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAotICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwogICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7Ci0gICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7CiAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKIAotICAgIHRtcDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgdG1wMSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKLSAgICBIRVZDX1VOSVdfUk5EX0NMSVAyKHRtcDAsIHRtcDEsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOworICAgIEhFVkNfVU5JV19STkRfQ0xJUDJfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxKTsKIAotICAgIEhFVkNfUENLX1NXX1NCNChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDBfcik7Ci0gICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIGRzdDEsICh2MTZpOCkgZHN0MCk7CisgICAgU1Q4eDJfVUIob3V0LCBkc3QsIGRzdF9zdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBoZXZjX3Z0X3VuaXdndF80dF84eDRfbXNhKHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQoreworICAgIHYxNnU4IG91dDAsIG91dDE7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yOworICAgIHYxNmk4IHNyYzUsIHNyYzYsIHNyYzU0X3IsIHNyYzY1X3I7CisgICAgdjhpMTYgZmlsdDAsIGZpbHQxOworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKKworICAgIHNyYyAtPSBzcmNfc3RyaWRlOworCisgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKKworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOworCisgICAgd2VpZ2h0ICo9IDEyODsKKyAgICBybmRfdmFsIC09IDY7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9maWxsX2god2VpZ2h0KTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwpOworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2Ffc3Jhcl9oKHdlaWdodF92ZWNfaCwgZGVub21fdmVjKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfYWRkc19zX2gob2Zmc2V0X3ZlYywgd2VpZ2h0X3ZlY19oKTsKKworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOworICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOworCisgICAgTERfU0I3KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgSUxWUl9CMl9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMxMF9yLCBzcmMyMV9yKTsKKyAgICBJTFZSX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNTRfciwgc3JjNjVfcik7CisgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDMpOworICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfdnRfdW5pd2d0XzR0Xzh4Nl9tc2EodWludDhfdCAqc3JjLApAQCAtMzE0OCwxMDEgKzM2MjUsMTAyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogeworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yOwogICAgIHYxNmk4IHNyYzIxX3IsIHNyYzQzX3IsIHNyYzY1X3IsIHNyYzg3X3I7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgZHN0NF9sLCBkc3Q1X2w7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSBzcmNfc3RyaWRlOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7Ci0KICAgICBMRF9TQjYoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKKworICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIFhPUklfQjZfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwotICAgIElMVlJfQjRfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwKLSAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IsIHNyYzU0X3IsIHNyYzY1X3IpOwotICAgIElMVlJfQjJfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNzZfciwgc3JjODdfcik7Ci0KLSAgICB0bXAwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEsIHRtcDAsIHRtcDApOwotICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSwgdG1wMSwgdG1wMSk7Ci0gICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0goc3JjMzJfciwgc3JjNTRfciwgZmlsdDAsIGZpbHQxLCB0bXAyLCB0bXAyKTsKLSAgICB0bXAzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEsIHRtcDMsIHRtcDMpOwotICAgIHRtcDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHNyYzU0X3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgdG1wNCwgdG1wNCk7Ci0gICAgdG1wNSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0goc3JjNjVfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCB0bXA1LCB0bXA1KTsKLSAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsCi0gICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLSAgICBIRVZDX1VOSVdfUk5EX0NMSVAyKHRtcDQsIHRtcDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X3IsIGRzdDVfciwgZHN0NF9sLCBkc3Q1X2wpOwotCi0gICAgSEVWQ19QQ0tfU1dfU0IxMihkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q0X2wsIGRzdDRfciwgZHN0NV9sLCBkc3Q1X3IsIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IpOwotICAgIFNUOHg0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMTBfciwgc3JjMjFfciwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IpOworICAgIElMVlJfQjRfU0Ioc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNTRfciwgc3JjNjVfciwKKyAgICAgICAgICAgICAgIHNyYzc2X3IsIHNyYzg3X3IpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM1NF9yLCBzcmM3Nl9yLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEpOworICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICBIRVZDX1VOSVdfUk5EX0NMSVAyX01BWF9TQVRVX0goZHN0NCwgZHN0NSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSk7CisgICAgUENLRVZfQjNfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgb3V0MCwgb3V0MSwgb3V0Mik7CisgICAgU1Q4eDRfVUIob3V0MCwgb3V0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICBTVDh4Ml9VQihkc3QyX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgU1Q4eDJfVUIob3V0MiwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgaGV2Y192dF91bml3Z3RfNHRfOHg0bXVsdGlwbGVfbXNhKHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCitzdGF0aWMgdm9pZCBoZXZjX3Z0X3VuaXdndF80dF84eDhtdWx0X21zYSh1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICBpbnQzMl90IGxvb3BfY250OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7CisgICAgdjE2dTggb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yOwotICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdjE2aTggc3JjNTRfciwgc3JjNjVfciwgc3JjNzZfciwgc3JjODdfciwgc3JjOThfciwgc3JjMTA5X3I7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sOworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSBzcmNfc3RyaWRlOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIApAQCAtMzI1MSwzNSArMzcyOSwzNyBAQAogICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKKyAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAzKTsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKICAgICAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKKyAgICAgICAgSUxWUl9CMl9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM1NF9yLCBzcmM2NV9yKTsKKyAgICAgICAgSUxWUl9CMl9TQihzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM3Nl9yLCBzcmM4N19yKTsKKyAgICAgICAgSUxWUl9CMl9TQihzcmM5LCBzcmM4LCBzcmMxMCwgc3JjOSwgc3JjOThfciwgc3JjMTA5X3IpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzU0X3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM2NV9yLCBzcmM4N19yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3Q0LCBkc3Q1LCBkc3Q2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Nyk7CisgICAgICAgIFBDS0VWX0IyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIG91dDAsIG91dDEpOworICAgICAgICBQQ0tFVl9CMl9VQihkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1Q4eDhfVUIob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEsIHRtcDEsIHRtcDEpOwotCi0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzIpOwotICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMSwgc3JjMik7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjNCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7Ci0KLSAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSwgdG1wMiwgdG1wMik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEsIHRtcDMsIHRtcDMpOwotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLQotICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0Ml9sLCBkc3QyX3IsIGRzdDNfbCwgZHN0M19yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgICAgIFNUOHg0X1VCKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgc3JjMiA9IHNyYzEwOworICAgICAgICBzcmMxMF9yID0gc3JjOThfcjsKKyAgICAgICAgc3JjMjFfciA9IHNyYzEwOV9yOwogICAgIH0KIH0KIApAQCAtMzI5NSwxNCArMzc3NSwxNyBAQAogewogICAgIGlmICgyID09IGhlaWdodCkgewogICAgICAgICBoZXZjX3Z0X3VuaXdndF80dF84eDJfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCB3ZWlnaHQsIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBoZXZjX3Z0X3VuaXdndF80dF84eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgd2VpZ2h0LCBvZmZzZXQsIHJuZF92YWwpOwogICAgIH0gZWxzZSBpZiAoNiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y192dF91bml3Z3RfNHRfOHg2X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGhlaWdodCwgd2VpZ2h0LCBvZmZzZXQsIHJuZF92YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgd2VpZ2h0LCBvZmZzZXQsIHJuZF92YWwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGhldmNfdnRfdW5pd2d0XzR0Xzh4NG11bHRpcGxlX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgaGVpZ2h0LCB3ZWlnaHQsIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZF92YWwpOworICAgICAgICBoZXZjX3Z0X3VuaXdndF80dF84eDhtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCBoZWlnaHQsIHdlaWdodCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsKTsKICAgICB9CiB9CiAKQEAgLTMzMTcsMjcgKzM4MDAsMzUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKICAgICB2MTZpOCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sOwogICAgIHYxNmk4IHNyYzIxMTAsIHNyYzQzMzI7CisgICAgdjE2aTggc3JjNTRfciwgc3JjNzZfciwgc3JjOThfciwgc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3I7CisgICAgdjE2aTggc3JjNzZfbCwgc3JjOThfbCwgc3JjODdfbCwgc3JjMTA5X2wsIHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgZHN0NF9sLCBkc3Q1X2w7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0ODsKKyAgICB2OGkxNiBkc3Q5LCBkc3QxMCwgZHN0MTEsIGZpbHRlcl92ZWMsIHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gKDEgKiBzcmNfc3RyaWRlKTsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CiAKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKKyAgICB3ZWlnaHQgKj0gMTI4OworICAgIHJuZF92YWwgLT0gNjsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX2ZpbGxfaCh3ZWlnaHQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9zcmFyX2god2VpZ2h0X3ZlY19oLCBkZW5vbV92ZWMpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9hZGRzX3NfaChvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjX2gpOworCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKQEAgLTMzNDgsNDcgKzM4MzksNTYgQEAKICAgICBJTFZMX0IyX1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzEwX2wsIHNyYzIxX2wpOwogICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzIxX2wsICh2Mmk2NCkgc3JjMTBfbCk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLSAgICAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKLSAgICAgICAgSUxWTF9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9sLCBzcmM0M19sKTsKKyAgICBmb3IgKGxvb3BfY250ID0gMjsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgICAgICBJTFZSTF9CMl9TQihzcmMzLCBzcmMyLCBzcmMzMl9yLCBzcmMzMl9sKTsKKyAgICAgICAgSUxWUkxfQjJfU0Ioc3JjNCwgc3JjMywgc3JjNDNfciwgc3JjNDNfbCk7CisgICAgICAgIElMVlJMX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzU0X3IsIHNyYzU0X2wpOworICAgICAgICBJTFZSTF9CMl9TQihzcmM2LCBzcmM1LCBzcmM2NV9yLCBzcmM2NV9sKTsKICAgICAgICAgc3JjNDMzMiA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjNDNfbCwgKHYyaTY0KSBzcmMzMl9sKTsKLQotICAgICAgICB0bXAwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxLCB0bXAwLCB0bXAwKTsKLSAgICAgICAgdG1wMSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSwgdG1wMSwgdG1wMSk7Ci0gICAgICAgIHRtcDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMyMTEwLCBzcmM0MzMyLCBmaWx0MCwgZmlsdDEsIHRtcDQsIHRtcDQpOwotCi0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzIpOwotICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjMik7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjMTBfciwgc3JjMjFfcik7Ci0gICAgICAgIElMVkxfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjNTRfbCwgc3JjNjVfbCk7Ci0gICAgICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzY1X2wsICh2Mmk2NCkgc3JjNTRfbCk7Ci0KLSAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSwgdG1wMiwgdG1wMik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEsIHRtcDMsIHRtcDMpOwotICAgICAgICB0bXA1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNDMzMiwgc3JjMjExMCwgZmlsdDAsIGZpbHQxLCB0bXA1LCB0bXA1KTsKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDIodG1wNCwgdG1wNSwgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X3IsIGRzdDVfciwgZHN0NF9sLCBkc3Q1X2wpOwotCi0gICAgICAgIEhFVkNfUENLX1NXX1NCMTIoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X2wsIGRzdDRfciwgZHN0NV9sLCBkc3Q1X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfcik7Ci0gICAgICAgIFNUMTJ4NF9VQihkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBzcmM2NTU0ID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmM2NV9sLCAodjJpNjQpIHNyYzU0X2wpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0MzMyLCBzcmM2NTU0LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDAsIGRzdDEsIGRzdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMl9NQVhfU0FUVV9IKGRzdDQsIGRzdDUsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgUENLRVZfQjNfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgb3V0MCwgb3V0MSwgb3V0Mik7CisgICAgICAgIFNUMTJ4NF9VQihvdXQwLCBvdXQxLCBvdXQyLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKworICAgICAgICBJTFZSTF9CMl9TQihzcmM3LCBzcmM2LCBzcmM3Nl9yLCBzcmM3Nl9sKTsKKyAgICAgICAgSUxWUkxfQjJfU0Ioc3JjOCwgc3JjNywgc3JjODdfciwgc3JjODdfbCk7CisgICAgICAgIElMVlJMX0IyX1NCKHNyYzksIHNyYzgsIHNyYzk4X3IsIHNyYzk4X2wpOworICAgICAgICBJTFZSTF9CMl9TQihzcmMxMCwgc3JjOSwgc3JjMTA5X3IsIHNyYzEwOV9sKTsKKyAgICAgICAgc3JjODc3NiA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjODdfbCwgKHYyaTY0KSBzcmM3Nl9sKTsKKyAgICAgICAgc3JjMTA5OTggPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzEwOV9sLCAodjJpNjQpIHNyYzk4X2wpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNTRfciwgc3JjNzZfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzY1X3IsIHNyYzg3X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDggPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q5ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNjU1NCwgc3JjODc3NiwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MTEgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM4Nzc2LCBzcmMxMDk5OCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDYsIGRzdDcsIGRzdDgsIGRzdDksIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3Q2LCBkc3Q3LCBkc3Q4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0OSk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDJfTUFYX1NBVFVfSChkc3QxMCwgZHN0MTEsIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmVjLCBkc3QxMCwgZHN0MTEpOworICAgICAgICBQQ0tFVl9CM19VQihkc3Q3LCBkc3Q2LCBkc3Q5LCBkc3Q4LCBkc3QxMSwgZHN0MTAsIG91dDMsIG91dDQsIG91dDUpOworICAgICAgICBTVDEyeDRfVUIob3V0Mywgb3V0NCwgb3V0NSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgc3JjMiA9IHNyYzEwOworICAgICAgICBzcmMxMF9yID0gc3JjOThfcjsKKyAgICAgICAgc3JjMjFfciA9IHNyYzEwOV9yOworICAgICAgICBzcmMyMTEwID0gc3JjMTA5OTg7CiAgICAgfQogfQogCkBAIC0zNDAzLDI1ICszOTAzLDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKICAgICBpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yOwogICAgIHYxNmk4IHNyYzEwX2wsIHNyYzMyX2wsIHNyYzIxX2wsIHNyYzQzX2w7Ci0gICAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgICB2MTZpOCBzcmM1NF9yLCBzcmM1NF9sLCBzcmM2NV9yLCBzcmM2NV9sLCBzcmM2OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworICAgIHY4aTE2IGZpbHRlcl92ZWMsIHdlaWdodF92ZWNfaCwgb2Zmc2V0X3ZlYywgZGVub21fdmVjOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gc3JjX3N0cmlkZTsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CiAKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKKyAgICB3ZWlnaHQgKj0gMTI4OworICAgIHJuZF92YWwgLT0gNjsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX2ZpbGxfaCh3ZWlnaHQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9zcmFyX2god2VpZ2h0X3ZlY19oLCBkZW5vbV92ZWMpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9hZGRzX3NfaChvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjX2gpOworCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKQEAgLTM0MzIsNTMgKzM5NDAsMzcgQEAKICAgICBJTFZMX0IyX1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzEwX2wsIHNyYzIxX2wpOwogCiAgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwotICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfciwgc3JjNDNfcik7Ci0gICAgICAgIElMVkxfQjJfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjMzJfbCwgc3JjNDNfbCk7CisgICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgICAgIElMVlJMX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzMyX3IsIHNyYzMyX2wpOworICAgICAgICBJTFZSTF9CMl9TQihzcmM0LCBzcmMzLCBzcmM0M19yLCBzcmM0M19sKTsKKyAgICAgICAgSUxWUkxfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjNTRfciwgc3JjNTRfbCk7CisgICAgICAgIElMVlJMX0IyX1NCKHNyYzYsIHNyYzUsIHNyYzY1X3IsIHNyYzY1X2wpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfciwgc3JjNjVfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwX2wsIHNyYzMyX2wsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9sLCBzcmM0M19sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMzJfbCwgc3JjNTRfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzQzX2wsIHNyYzY1X2wsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0MCwgZHN0MSwgZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDMpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDQsIGRzdDUsIGRzdDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q3KTsKKyAgICAgICAgUENLRVZfQjRfVUIoZHN0NCwgZHN0MCwgZHN0NSwgZHN0MSwgZHN0NiwgZHN0MiwgZHN0NywgZHN0Mywgb3V0MCwgb3V0MSwKKyAgICAgICAgICAgICAgICAgICAgb3V0Miwgb3V0Myk7CisgICAgICAgIFNUX1VCNChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKIAotICAgICAgICB0bXAwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxLCB0bXAwLCB0bXAwKTsKLSAgICAgICAgdG1wMSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxX3IsIHNyYzQzX3IsIGZpbHQwLCBmaWx0MSwgdG1wMSwgdG1wMSk7Ci0gICAgICAgIHRtcDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMxMF9sLCBzcmMzMl9sLCBmaWx0MCwgZmlsdDEsIHRtcDIsIHRtcDIpOwotICAgICAgICB0bXAzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfbCwgc3JjNDNfbCwgZmlsdDAsIGZpbHQxLCB0bXAzLCB0bXAzKTsKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QyX2wsIGRzdDJfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDFfbCwgZHN0MV9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzIpOwotICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjMik7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjMTBfciwgc3JjMjFfcik7Ci0gICAgICAgIElMVkxfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjMTBfbCwgc3JjMjFfbCk7Ci0KLSAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEsIHRtcDEsIHRtcDEpOwotICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMzJfbCwgc3JjMTBfbCwgZmlsdDAsIGZpbHQxLCB0bXAyLCB0bXAyKTsKLSAgICAgICAgdG1wMyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzX2wsIHNyYzIxX2wsIGZpbHQwLCBmaWx0MSwgdG1wMywgdG1wMyk7Ci0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX2wsIGRzdDFfbCwgZHN0Ml9sLCBkc3QzX2wpOwotCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QxX2wsIGRzdDFfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgc3JjMiA9IHNyYzY7CisgICAgICAgIHNyYzEwX3IgPSBzcmM1NF9yOworICAgICAgICBzcmMyMV9yID0gc3JjNjVfcjsKKyAgICAgICAgc3JjMTBfbCA9IHNyYzU0X2w7CisgICAgICAgIHNyYzIxX2wgPSBzcmM2NV9sOwogICAgIH0KIH0KIApAQCAtMzQ5MywxMTMgKzM5ODUsOTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDU7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKLSAgICB2MTZpOCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTE7Ci0gICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNzZfciwgc3JjOThfcjsKLSAgICB2MTZpOCBzcmMyMV9yLCBzcmM0M19yLCBzcmM4N19yLCBzcmMxMDlfcjsKLSAgICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OwotICAgIHYxNmk4IHNyYzEwX2wsIHNyYzMyX2wsIHNyYzIxX2wsIHNyYzQzX2w7CisgICAgdjE2aTggc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTM7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfcjsKKyAgICB2MTZpOCBzcmMxMF9sLCBzcmMzMl9sLCBzcmM1NF9sLCBzcmMyMV9sLCBzcmM0M19sLCBzcmM2NV9sOworICAgIHYxNmk4IHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yLCBzcmMxMTEwX3IsIHNyYzEyMTFfciwgc3JjMTMxMl9yOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yOwotICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgZHN0NF9sLCBkc3Q1X2w7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0OCwgZHN0OSwgZHN0MTA7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWMsIGRzdDExOworICAgIHY0aTMyIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gc3JjX3N0cmlkZTsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwogICAgIHdlaWdodCA9IHdlaWdodCAmIDB4MDAwMEZGRkY7CiAKICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKKyAgICB3ZWlnaHQgKj0gMTI4OworICAgIHJuZF92YWwgLT0gNjsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX2ZpbGxfaCh3ZWlnaHQpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCk7CisKKyAgICB3ZWlnaHRfdmVjX2ggPSBfX21zYV9zcmFyX2god2VpZ2h0X3ZlY19oLCBkZW5vbV92ZWMpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9hZGRzX3NfaChvZmZzZXRfdmVjLCB3ZWlnaHRfdmVjX2gpOworCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBMRF9TQjMoc3JjICsgMTYsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzkpOworICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwogICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIFhPUklfQjNfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzkpOwogICAgIElMVlJfQjJfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMTBfciwgc3JjMjFfcik7CiAgICAgSUxWTF9CMl9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMxMF9sLCBzcmMyMV9sKTsKKyAgICBJTFZSX0IyX1NCKHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzg3X3IsIHNyYzk4X3IpOwogCi0gICAgTERfU0IzKHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBYT1JJX0IzXzEyOF9TQihzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICBJTFZSX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzc2X3IsIHNyYzg3X3IpOwotCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKKyAgICBmb3IgKGxvb3BfY250ID0gODsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgICAgIExEX1NCNChzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMTAsIHNyYzExLCBzcmMxMiwgc3JjMTMpOworICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzEwLCBzcmMxMSwgc3JjMTIsIHNyYzEzKTsKICAgICAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKICAgICAgICAgSUxWTF9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9sLCBzcmM0M19sKTsKLSAgICAgICAgTERfU0IyKHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM5LCBzcmMxMCk7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM5LCBzcmMxMCk7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzk4X3IsIHNyYzEwOV9yKTsKKyAgICAgICAgSUxWUkxfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjNTRfciwgc3JjNTRfbCk7CisgICAgICAgIElMVlJMX0IyX1NCKHNyYzYsIHNyYzUsIHNyYzY1X3IsIHNyYzY1X2wpOworICAgICAgICBJTFZSX0IyX1NCKHNyYzEwLCBzcmM5LCBzcmMxMSwgc3JjMTAsIHNyYzEwOV9yLCBzcmMxMTEwX3IpOworICAgICAgICBJTFZSX0IyX1NCKHNyYzEyLCBzcmMxMSwgc3JjMTMsIHNyYzEyLCBzcmMxMjExX3IsIHNyYzEzMTJfcik7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTBfbCwgc3JjMzJfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzIxX2wsIHNyYzQzX2wsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMzMl9sLCBzcmM1NF9sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q3ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNDNfbCwgc3JjNjVfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0OCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q5ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjOThfciwgc3JjMTExMF9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxMCA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwOV9yLCBzcmMxMjExX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDExID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMTExMF9yLCBzcmMxMzEyX3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0MCwgZHN0MSwgZHN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDMpOworICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0X01BWF9TQVRVX0goZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDQsIGRzdDUsIGRzdDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q3KTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDgsIGRzdDksIGRzdDEwLCBkc3QxMSwgd2VpZ2h0X3ZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldF92ZWMsIHJuZF92ZWMsIGRzdDgsIGRzdDksIGRzdDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MTEpOworICAgICAgICBQQ0tFVl9CNF9VQihkc3Q0LCBkc3QwLCBkc3Q1LCBkc3QxLCBkc3Q2LCBkc3QyLCBkc3Q3LCBkc3QzLCBvdXQwLCBvdXQxLAorICAgICAgICAgICAgICAgICAgICBvdXQyLCBvdXQzKTsKKyAgICAgICAgUENLRVZfQjJfVUIoZHN0OSwgZHN0OCwgZHN0MTEsIGRzdDEwLCBvdXQ0LCBvdXQ1KTsKKyAgICAgICAgU1RfVUI0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFNUOHg0X1VCKG91dDQsIG91dDUsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgdG1wMCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzEwX3IsIHNyYzMyX3IsIGZpbHQwLCBmaWx0MSwgdG1wMCwgdG1wMCk7Ci0gICAgICAgIHRtcDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMxMF9sLCBzcmMzMl9sLCBmaWx0MCwgZmlsdDEsIHRtcDQsIHRtcDQpOwotICAgICAgICB0bXAxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCB0bXAxLCB0bXAxKTsKLSAgICAgICAgdG1wNSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzIxX2wsIHNyYzQzX2wsIGZpbHQwLCBmaWx0MSwgdG1wNSwgdG1wNSk7Ci0gICAgICAgIHRtcDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM3Nl9yLCBzcmM5OF9yLCBmaWx0MCwgZmlsdDEsIHRtcDIsIHRtcDIpOwotICAgICAgICB0bXAzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjODdfciwgc3JjMTA5X3IsIGZpbHQwLCBmaWx0MSwgdG1wMywgdG1wMyk7Ci0KLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNCh0bXAwLCB0bXAxLCB0bXA0LCB0bXA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCk7Ci0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDIodG1wMiwgdG1wMywgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X3IsIGRzdDVfciwgZHN0NF9sLCBkc3Q1X2wpOwotCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0Ml9sLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QxX2wsIGRzdDFfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwgZHN0NF9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDBfciwgZHN0MV9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBTVDh4Ml9VQihkc3Q0X3IsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICgyICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjNSwgc3JjMik7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzUsIHNyYzIpOwotICAgICAgICBJTFZSX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzIsIHNyYzUsIHNyYzEwX3IsIHNyYzIxX3IpOwotICAgICAgICBJTFZMX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzIsIHNyYzUsIHNyYzEwX2wsIHNyYzIxX2wpOwotICAgICAgICBMRF9TQjIoc3JjICsgMTYsIHNyY19zdHJpZGUsIHNyYzExLCBzcmM4KTsKLSAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzExLCBzcmM4KTsKLSAgICAgICAgSUxWUl9CMl9TQihzcmMxMSwgc3JjMTAsIHNyYzgsIHNyYzExLCBzcmM3Nl9yLCBzcmM4N19yKTsKLQotICAgICAgICB0bXAwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMzJfciwgc3JjMTBfciwgZmlsdDAsIGZpbHQxLCB0bXAwLCB0bXAwKTsKLSAgICAgICAgdG1wNCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX2wsIHNyYzEwX2wsIGZpbHQwLCBmaWx0MSwgdG1wNCwgdG1wNCk7Ci0gICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEsIHRtcDEsIHRtcDEpOwotICAgICAgICB0bXA1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNDNfbCwgc3JjMjFfbCwgZmlsdDAsIGZpbHQxLCB0bXA1LCB0bXA1KTsKLSAgICAgICAgdG1wMiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzk4X3IsIHNyYzc2X3IsIGZpbHQwLCBmaWx0MSwgdG1wMiwgdG1wMik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMxMDlfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxLCB0bXAzLCB0bXAzKTsKLQotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KHRtcDAsIHRtcDEsIHRtcDQsIHRtcDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLSAgICAgICAgSEVWQ19VTklXX1JORF9DTElQMih0bXAyLCB0bXAzLCB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfciwgZHN0NV9yLCBkc3Q0X2wsIGRzdDVfbCk7Ci0KLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QyX2wsIGRzdDJfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDFfbCwgZHN0MV9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBIRVZDX1BDS19TV19TQjQoZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLCBkc3Q0X3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIFNUOHgyX1VCKGRzdDRfciwgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDIgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgc3JjMiA9IHNyYzY7CisgICAgICAgIHNyYzkgPSBzcmMxMzsKKyAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7CisgICAgICAgIHNyYzIxX3IgPSBzcmM2NV9yOworICAgICAgICBzcmMxMF9sID0gc3JjNTRfbDsKKyAgICAgICAgc3JjMjFfbCA9IHNyYzY1X2w7CisgICAgICAgIHNyYzg3X3IgPSBzcmMxMjExX3I7CisgICAgICAgIHNyYzk4X3IgPSBzcmMxMzEyX3I7CiAgICAgfQogfQogCkBAIC0zNjEzLDEwNCArNDA4Niw4NyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdWludDhfdCAqZHN0X3RtcCA9IGRzdCArIDE2OwotICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOTsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM3Nl9yLCBzcmM5OF9yOwotICAgIHYxNmk4IHNyYzIxX3IsIHNyYzQzX3IsIHNyYzg3X3IsIHNyYzEwOV9yOwotICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgICAgdjE2aTggc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfcjsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogICAgIHYxNmk4IHNyYzEwX2wsIHNyYzMyX2wsIHNyYzc2X2wsIHNyYzk4X2w7Ci0gICAgdjE2aTggc3JjMjFfbCwgc3JjNDNfbCwgc3JjODdfbCwgc3JjMTA5X2w7CisgICAgdjE2aTggc3JjMjFfbCwgc3JjNDNfbCwgc3JjNjVfbCwgc3JjODdfbDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3I7Ci0gICAgdjRpMzIgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCBkc3Q0X2wsIGRzdDVfbCwgZHN0Nl9sLCBkc3Q3X2w7CisgICAgdjhpMTYgZmlsdGVyX3ZlYywgd2VpZ2h0X3ZlY19oLCBvZmZzZXRfdmVjLCBkZW5vbV92ZWM7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSBzcmNfc3RyaWRlOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7CiAgICAgd2VpZ2h0ID0gd2VpZ2h0ICYgMHgwMDAwRkZGRjsKIAogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIHdlaWdodCAqPSAxMjg7CisgICAgcm5kX3ZhbCAtPSA2OworCisgICAgd2VpZ2h0X3ZlY19oID0gX19tc2FfZmlsbF9oKHdlaWdodCk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsKTsKKworICAgIHdlaWdodF92ZWNfaCA9IF9fbXNhX3NyYXJfaCh3ZWlnaHRfdmVjX2gsIGRlbm9tX3ZlYyk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2FkZHNfc19oKG9mZnNldF92ZWMsIHdlaWdodF92ZWNfaCk7CisKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEX1NCMyhzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CNl8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjNSwgc3JjNiwgc3JjNyk7CiAgICAgSUxWUl9CMl9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMxMF9yLCBzcmMyMV9yKTsKICAgICBJTFZMX0IyX1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzEwX2wsIHNyYzIxX2wpOwotCi0gICAgTERfU0IzKHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBYT1JJX0IzXzEyOF9TQihzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICBJTFZSX0IyX1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzc2X3IsIHNyYzg3X3IpOwotICAgIElMVkxfQjJfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjNzZfbCwgc3JjODdfbCk7CisgICAgSUxWUl9CMl9TQihzcmM2LCBzcmM1LCBzcmM3LCBzcmM2LCBzcmM2NV9yLCBzcmM3Nl9yKTsKKyAgICBJTFZMX0IyX1NCKHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzY1X2wsIHNyYzc2X2wpOwogCiAgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMSk7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKKyAgICAgICAgTERfU0IyKHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM4LCBzcmM5KTsKKyAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzgsIHNyYzkpOwogICAgICAgICBJTFZSX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX3IsIHNyYzQzX3IpOwogICAgICAgICBJTFZMX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX2wsIHNyYzQzX2wpOworICAgICAgICBJTFZSTF9CMl9TQihzcmM4LCBzcmM3LCBzcmM4N19yLCBzcmM4N19sKTsKKyAgICAgICAgSUxWUkxfQjJfU0Ioc3JjOSwgc3JjOCwgc3JjOThfciwgc3JjOThfbCk7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzEwX2wsIHNyYzMyX2wsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmMyMV9sLCBzcmM0M19sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNjVfciwgc3JjODdfciwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF80VEFQX1NIKHNyYzc2X3IsIHNyYzk4X3IsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUF9TSChzcmM2NV9sLCBzcmM4N19sLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q3ID0gSEVWQ19GSUxUXzRUQVBfU0goc3JjNzZfbCwgc3JjOThfbCwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgSEVWQ19VTklXX1JORF9DTElQNF9NQVhfU0FUVV9IKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfdmVjLCBybmRfdmVjLCBkc3QwLCBkc3QxLCBkc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0Myk7CisgICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDRfTUFYX1NBVFVfSChkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3ZlYywgcm5kX3ZlYywgZHN0NCwgZHN0NSwgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDcpOworICAgICAgICBQQ0tFVl9CNF9VQihkc3QyLCBkc3QwLCBkc3QzLCBkc3QxLCBkc3Q2LCBkc3Q0LCBkc3Q3LCBkc3Q1LCBvdXQwLCBvdXQxLAorICAgICAgICAgICAgICAgICAgICBvdXQyLCBvdXQzKTsKKyAgICAgICAgU1RfVUIyKG91dDAsIG91dDIsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU1RfVUIyKG91dDEsIG91dDMsIGRzdCwgMTYpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKIAotICAgICAgICB0bXAwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMTBfciwgc3JjMzJfciwgZmlsdDAsIGZpbHQxLCB0bXAwLCB0bXAwKTsKLSAgICAgICAgdG1wNCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzEwX2wsIHNyYzMyX2wsIGZpbHQwLCBmaWx0MSwgdG1wNCwgdG1wNCk7Ci0gICAgICAgIHRtcDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMyMV9yLCBzcmM0M19yLCBmaWx0MCwgZmlsdDEsIHRtcDEsIHRtcDEpOwotICAgICAgICB0bXA1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfbCwgc3JjNDNfbCwgZmlsdDAsIGZpbHQxLCB0bXA1LCB0bXA1KTsKLQotICAgICAgICBIRVZDX1VOSVdfUk5EX0NMSVA0KHRtcDAsIHRtcDEsIHRtcDQsIHRtcDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sKTsKLSAgICAgICAgSEVWQ19QQ0tfU1dfU0I4KGRzdDBfbCwgZHN0MF9yLCBkc3QyX2wsIGRzdDJfciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdDFfbCwgZHN0MV9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICBTVF9TVzIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwotCisgICAgICAgIHNyYzIgPSBzcmM0OworICAgICAgICBzcmM3ID0gc3JjOTsKICAgICAgICAgc3JjMTBfciA9IHNyYzMyX3I7CiAgICAgICAgIHNyYzIxX3IgPSBzcmM0M19yOwogICAgICAgICBzcmMxMF9sID0gc3JjMzJfbDsKICAgICAgICAgc3JjMjFfbCA9IHNyYzQzX2w7Ci0gICAgICAgIHNyYzIgPSBzcmM0OwotCi0gICAgICAgIExEX1NCMihzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjOSwgc3JjMTApOwotICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjOSwgc3JjMTApOwotICAgICAgICBJTFZSX0IyX1NCKHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM5OF9yLCBzcmMxMDlfcik7Ci0gICAgICAgIElMVkxfQjJfU0Ioc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzk4X2wsIHNyYzEwOV9sKTsKLQotICAgICAgICB0bXAyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNzZfciwgc3JjOThfciwgZmlsdDAsIGZpbHQxLCB0bXAyLCB0bXAyKTsKLSAgICAgICAgdG1wNiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzc2X2wsIHNyYzk4X2wsIGZpbHQwLCBmaWx0MSwgdG1wNiwgdG1wNik7Ci0gICAgICAgIHRtcDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM4N19yLCBzcmMxMDlfciwgZmlsdDAsIGZpbHQxLCB0bXAzLCB0bXAzKTsKLSAgICAgICAgdG1wNyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzg3X2wsIHNyYzEwOV9sLCBmaWx0MCwgZmlsdDEsIHRtcDcsIHRtcDcpOwotCi0gICAgICAgIEhFVkNfVU5JV19STkRfQ0xJUDQodG1wMiwgdG1wMywgdG1wNiwgdG1wNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q0X2wsIGRzdDVfbCwgZHN0Nl9sLCBkc3Q3X2wpOwotCi0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3Q0X2wsIGRzdDRfciwgZHN0Nl9sLCBkc3Q2X3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3Q1X2wsIGRzdDVfciwgZHN0N19sLCBkc3Q3X3IsIGRzdDRfciwgZHN0NV9yKTsKLSAgICAgICAgU1RfU1cyKGRzdDRfciwgZHN0NV9yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0X3RtcCArPSAoMiAqIGRzdF9zdHJpZGUpOwotCisgICAgICAgIHNyYzY1X3IgPSBzcmM4N19yOwogICAgICAgICBzcmM3Nl9yID0gc3JjOThfcjsKLSAgICAgICAgc3JjODdfciA9IHNyYzEwOV9yOworICAgICAgICBzcmM2NV9sID0gc3JjODdfbDsKICAgICAgICAgc3JjNzZfbCA9IHNyYzk4X2w7Ci0gICAgICAgIHNyYzg3X2wgPSBzcmMxMDlfbDsKLSAgICAgICAgc3JjOCA9IHNyYzEwOwogICAgIH0KIH0KIApAQCAtMzcyMCwyMiArNDE3NiwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKKyAgICB2MTZ1OCBvdXQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdGVyX3ZlYywgdG1wOwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NDsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgZHN0MjAsIGRzdDMxLCBkc3Q0MiwgZHN0MTAsIGRzdDMyLCBkc3QyMSwgZHN0NDM7CisgICAgdjhpMTYgb2Zmc2V0X3ZlYywgY29uc3RfMTI4LCBkZW5vbV92ZWM7CisgICAgdjRpMzIgZHN0MCwgZHN0MSwgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOwogCkBAIC0zNzQzLDYzICs0MTk3LDQxIEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKLQogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAotICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCAtIDYpOworICAgIGNvbnN0XzEyOCA9IF9fbXNhX2ZpbGxfaCgoMTI4ICogd2VpZ2h0KSk7CisgICAgb2Zmc2V0X3ZlYyArPSBfX21zYV9zcmFyX2goY29uc3RfMTI4LCBkZW5vbV92ZWMpOwogCi0gICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKLSAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0KLSAgICBJTFZSX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDIsIGRzdDEsIGRzdDEwX3IsIGRzdDIxX3IpOwotICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzMsIHNyYzQpOwotCi0gICAgLyogcm93IDMgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQotICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0MywgZHN0Mik7Ci0gICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MF9yID4+PSA2OwotCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0KLSAgICBkc3Q0M19yID0gX19tc2FfaWx2cl9oKGRzdDQsIGRzdDMpOwotICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDFfciA+Pj0gNjsKLQotICAgIE1VTDIoZHN0MF9yLCB3ZWlnaHRfdmVjLCBkc3QxX3IsIHdlaWdodF92ZWMsIGRzdDBfciwgZHN0MV9yKTsKLSAgICBTUkFSX1cyX1NXKGRzdDBfciwgZHN0MV9yLCBybmRfdmVjKTsKLSAgICBBREQyKGRzdDBfciwgb2Zmc2V0X3ZlYywgZHN0MV9yLCBvZmZzZXRfdmVjLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgZHN0MF9yID0gQ0xJUF9TV18wXzI1NShkc3QwX3IpOwotICAgIGRzdDFfciA9IENMSVBfU1dfMF8yNTUoZHN0MV9yKTsKLQotICAgIEhFVkNfUENLX1NXX1NCMihkc3QxX3IsIGRzdDBfciwgZHN0MF9yKTsKLSAgICBTVDR4Ml9VQihkc3QwX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMyLCBzcmMwLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMywgc3JjMSwgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzQsIHNyYzIsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgZHN0MjAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDMxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q0MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgSUxWUkxfSDJfU0goZHN0MzEsIGRzdDIwLCBkc3QxMCwgZHN0MzIpOworICAgIElMVlJMX0gyX1NIKGRzdDQyLCBkc3QzMSwgZHN0MjEsIGRzdDQzKTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVAoZHN0MTAsIGRzdDMyLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVAoZHN0MjEsIGRzdDQzLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QwID4+PSA2OworICAgIGRzdDEgPj49IDY7CisgICAgTVVMMihkc3QwLCB3ZWlnaHRfdmVjLCBkc3QxLCB3ZWlnaHRfdmVjLCBkc3QwLCBkc3QxKTsKKyAgICBTUkFSX1cyX1NXKGRzdDAsIGRzdDEsIHJuZF92ZWMpOworICAgIHRtcCA9IF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QxLCAodjhpMTYpIGRzdDApOworICAgIHRtcCArPSBvZmZzZXRfdmVjOworICAgIHRtcCA9IENMSVBfU0hfMF8yNTVfTUFYX1NBVFUodG1wKTsKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAsICh2MTZpOCkgdG1wKTsKKyAgICBTVDR4Ml9VQihvdXQsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfdW5pd2d0XzR0XzR4NF9tc2EodWludDhfdCAqc3JjLApAQCAtMzgwOCwyMiArNDI0MCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKKyAgICB2MTZ1OCBvdXQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRlcl92ZWMsIHRtcDAsIHRtcDE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yOwotICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDIxX3IsIGRzdDQzX3I7Ci0gICAgdjRpMzIgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHY4aTE2IGRzdDMwLCBkc3Q0MSwgZHN0NTIsIGRzdDYzLCBkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3QyMSwgZHN0NDMsIGRzdDY1OworICAgIHY4aTE2IG9mZnNldF92ZWMsIGNvbnN0XzEyOCwgZGVub21fdmVjOworICAgIHY0aTMyIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAKICAgICBzcmMgLT0gKHNyY19zdHJpZGUgKyAxKTsKIApAQCAtMzgzMSw3NiArNDI2MSw0NiBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCi0gICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKLSAgICBjb25zdF92ZWMgPDw9IDY7Ci0KICAgICB3ZWlnaHRfdmVjID0gX19tc2FfZmlsbF93KHdlaWdodCk7Ci0gICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfdyhvZmZzZXQpOwogICAgIHJuZF92ZWMgPSBfX21zYV9maWxsX3cocm5kX3ZhbCk7CiAKLSAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKLSAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF9oKG9mZnNldCk7CisgICAgZGVub21fdmVjID0gX19tc2FfZmlsbF9oKHJuZF92YWwgLSA2KTsKKyAgICBjb25zdF8xMjggPSBfX21zYV9maWxsX2goKDEyOCAqIHdlaWdodCkpOworICAgIG9mZnNldF92ZWMgKz0gX19tc2Ffc3Jhcl9oKGNvbnN0XzEyOCwgZGVub21fdmVjKTsKIAotICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7Ci0gICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgSUxWUl9IMl9TSChkc3QxLCBkc3QwLCBkc3QyLCBkc3QxLCBkc3QxMF9yLCBkc3QyMV9yKTsKLQotICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwotICAgIFhPUklfQjRfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwotCi0gICAgLyogcm93IDMgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLSAgICBkc3QzMl9yID0gX19tc2FfaWx2cl9oKGRzdDMsIGRzdDIpOwotICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDBfciA+Pj0gNjsKLQotICAgIC8qIHJvdyA0ICovCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0gICAgZHN0NDNfciA9IF9fbXNhX2lsdnJfaChkc3Q0LCBkc3QzKTsKLSAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QxX3IgPj49IDY7Ci0KLSAgICAvKiByb3cgNSAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotICAgIGRzdDEwX3IgPSBfX21zYV9pbHZyX2goZHN0NSwgZHN0NCk7Ci0gICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0MTBfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0Ml9yID4+PSA2OwotCi0gICAgLyogcm93IDYgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICBkc3QyMV9yID0gX19tc2FfaWx2cl9oKGRzdDIsIGRzdDUpOwotICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDIxX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDNfciA+Pj0gNjsKLQotICAgIEhFVkNfSFZfVU5JV19STkRfQ0xJUDQoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7Ci0gICAgSEVWQ19QQ0tfU1dfU0I0KGRzdDFfciwgZHN0MF9yLCBkc3QzX3IsIGRzdDJfciwgZHN0MF9yKTsKLSAgICBTVDR4NF9VQihkc3QwX3IsIGRzdDBfciwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBMRF9TQjcoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICBYT1JJX0I3XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzMsIHNyYzAsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmM0LCBzcmMxLCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjNSwgc3JjMiwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzYsIHNyYzMsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgZHN0MzAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDQxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q1MiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NjMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgIElMVlJMX0gyX1NIKGRzdDQxLCBkc3QzMCwgZHN0MTAsIGRzdDQzKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q1MiwgZHN0NDEsIGRzdDIxLCBkc3Q1NCk7CisgICAgSUxWUkxfSDJfU0goZHN0NjMsIGRzdDUyLCBkc3QzMiwgZHN0NjUpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMCwgZHN0MzIsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMSwgZHN0NDMsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMiwgZHN0NTQsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0MywgZHN0NjUsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNSQV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICBNVUwyKGRzdDAsIHdlaWdodF92ZWMsIGRzdDEsIHdlaWdodF92ZWMsIGRzdDAsIGRzdDEpOworICAgIE1VTDIoZHN0Miwgd2VpZ2h0X3ZlYywgZHN0Mywgd2VpZ2h0X3ZlYywgZHN0MiwgZHN0Myk7CisgICAgU1JBUl9XNF9TVyhkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBybmRfdmVjKTsKKyAgICBQQ0tFVl9IMl9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCB0bXAwLCB0bXAxKTsKKyAgICBBREQyKHRtcDAsIG9mZnNldF92ZWMsIHRtcDEsIG9mZnNldF92ZWMsIHRtcDAsIHRtcDEpOworICAgIENMSVBfU0gyXzBfMjU1X01BWF9TQVRVKHRtcDAsIHRtcDEpOworICAgIG91dCA9ICh2MTZ1OCkgX19tc2FfcGNrZXZfYigodjE2aTgpIHRtcDEsICh2MTZpOCkgdG1wMCk7CisgICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfdW5pd2d0XzR0XzRtdWx0eDhtdWx0X21zYSh1aW50OF90ICpzcmMsCkBAIC0zOTE1LDE4ICs0MzE1LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNnU4IG91dDAsIG91dDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0OCwgZHN0OTsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfcjsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0ZXJfdmVjLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjhpMTYgZHN0MTAsIGRzdDIxLCBkc3QyMiwgZHN0NzMsIGRzdDg0LCBkc3Q5NSwgZHN0MTA2OwogICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3I7CiAgICAgdjhpMTYgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfcjsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHY4aTE2IGRzdDk4X3IsIGRzdDEwOV9yLCBvZmZzZXRfdmVjLCBjb25zdF8xMjgsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTM5MzQsMzQgKzQzMzQsMzAgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwotCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsIC0gNik7CisgICAgY29uc3RfMTI4ID0gX19tc2FfZmlsbF9oKCgxMjggKiB3ZWlnaHQpKTsKKyAgICBvZmZzZXRfdmVjICs9IF9fbXNhX3NyYXJfaChjb25zdF8xMjgsIGRlbm9tX3ZlYyk7CisKICAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKICAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKIAotICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7Ci0gICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgIElMVlJfSDJfU0goZHN0MSwgZHN0MCwgZHN0MiwgZHN0MSwgZHN0MTBfciwgZHN0MjFfcik7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMiwgc3JjMSwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBkc3QxMCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0MjEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIElMVlJMX0gyX1NIKGRzdDIxLCBkc3QxMCwgZHN0MTBfciwgZHN0MjFfcik7CisgICAgZHN0MjIgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MjEsIDEpOwogCiAgICAgZm9yIChsb29wX2NudCA9IGhlaWdodCA+PiAzOyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjgoc3JjLCBzcmNfc3RyaWRlLApAQCAtMzk2OSw3NSArNDM2NSw0OCBAQAogICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKICAgICAgICAgWE9SSV9COF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0gICAgICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0MywgZHN0Mik7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QwX3IgPj49IDY7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjNywgc3JjMywgc3JjNywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM4LCBzcmM0LCBzcmM4LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzksIHNyYzUsIHNyYzksIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjMTAsIHNyYzYsIHNyYzEwLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgICAgICBkc3Q3MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDg0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0OTUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QxMDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QzMl9yID0gX19tc2FfaWx2cl9oKGRzdDczLCBkc3QyMik7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDg0LCBkc3Q3MywgZHN0NDNfciwgZHN0ODdfcik7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDk1LCBkc3Q4NCwgZHN0NTRfciwgZHN0OThfcik7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEwNiwgZHN0OTUsIGRzdDY1X3IsIGRzdDEwOV9yKTsKKyAgICAgICAgZHN0MjIgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0NzMsIDEpOworICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDIyLCBkc3QxMDYpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MiA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NSA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q2ID0gSEVWQ19GSUxUXzRUQVAoZHN0NzZfciwgZHN0OThfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDcgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIFNSQV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICAgICAgU1JBXzRWKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIDYpOworICAgICAgICBNVUwyKGRzdDAsIHdlaWdodF92ZWMsIGRzdDEsIHdlaWdodF92ZWMsIGRzdDAsIGRzdDEpOworICAgICAgICBNVUwyKGRzdDIsIHdlaWdodF92ZWMsIGRzdDMsIHdlaWdodF92ZWMsIGRzdDIsIGRzdDMpOworICAgICAgICBNVUwyKGRzdDQsIHdlaWdodF92ZWMsIGRzdDUsIHdlaWdodF92ZWMsIGRzdDQsIGRzdDUpOworICAgICAgICBNVUwyKGRzdDYsIHdlaWdodF92ZWMsIGRzdDcsIHdlaWdodF92ZWMsIGRzdDYsIGRzdDcpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHJuZF92ZWMpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIHJuZF92ZWMpOworICAgICAgICBQQ0tFVl9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCB0bXAwLCB0bXAxLAorICAgICAgICAgICAgICAgICAgICB0bXAyLCB0bXAzKTsKKyAgICAgICAgQUREMih0bXAwLCBvZmZzZXRfdmVjLCB0bXAxLCBvZmZzZXRfdmVjLCB0bXAwLCB0bXAxKTsKKyAgICAgICAgQUREMih0bXAyLCBvZmZzZXRfdmVjLCB0bXAzLCBvZmZzZXRfdmVjLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgQ0xJUF9TSDRfMF8yNTVfTUFYX1NBVFUodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgIFBDS0VWX0IyX1VCKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIG91dDAsIG91dDEpOworICAgICAgICBTVDR4OF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotICAgICAgICBkc3Q0M19yID0gX19tc2FfaWx2cl9oKGRzdDQsIGRzdDMpOwotICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MV9yID4+PSA2OwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7Ci0gICAgICAgIGRzdDU0X3IgPSBfX21zYV9pbHZyX2goZHN0NSwgZHN0NCk7Ci0gICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QyX3IgPj49IDY7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q2ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q2LCBkc3Q2KTsKLSAgICAgICAgZHN0NjVfciA9IF9fbXNhX2lsdnJfaChkc3Q2LCBkc3Q1KTsKLSAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDNfciA+Pj0gNjsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDcgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDcsIGRzdDcpOwotICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDcsIGRzdDYpOwotICAgICAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0NF9yID4+PSA2OwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0OCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0OCwgZHN0OCk7Ci0gICAgICAgIGRzdDg3X3IgPSBfX21zYV9pbHZyX2goZHN0OCwgZHN0Nyk7Ci0gICAgICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q1X3IgPj49IDY7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmM5LCBzcmM5LCBzcmM5LCBzcmM5LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q5ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q5LCBkc3Q5KTsKLSAgICAgICAgZHN0MTBfciA9IF9fbXNhX2lsdnJfaChkc3Q5LCBkc3Q4KTsKLSAgICAgICAgZHN0Nl9yID0gSEVWQ19GSUxUXzRUQVAoZHN0NzZfciwgZHN0MTBfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDZfciA+Pj0gNjsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzEwLCBzcmMxMCwgc3JjMTAsIHNyYzEwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICAgICAgZHN0MjFfciA9IF9fbXNhX2lsdnJfaChkc3QyLCBkc3Q5KTsKLSAgICAgICAgZHN0N19yID0gSEVWQ19GSUxUXzRUQVAoZHN0ODdfciwgZHN0MjFfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDdfciA+Pj0gNjsKLQotICAgICAgICBIRVZDX0hWX1VOSVdfUk5EX0NMSVA0KGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7Ci0gICAgICAgIEhFVkNfUENLX1NXX1NCNChkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIGRzdDBfcik7Ci0gICAgICAgIFNUNHg0X1VCKGRzdDBfciwgZHN0MF9yLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgICAgICBIRVZDX0hWX1VOSVdfUk5EX0NMSVA0KGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfcik7Ci0gICAgICAgIEhFVkNfUENLX1NXX1NCNChkc3Q1X3IsIGRzdDRfciwgZHN0N19yLCBkc3Q2X3IsIGRzdDBfcik7Ci0gICAgICAgIFNUNHg0X1VCKGRzdDBfciwgZHN0MF9yLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0MTBfciA9IGRzdDk4X3I7CisgICAgICAgIGRzdDIxX3IgPSBkc3QxMDlfcjsKKyAgICAgICAgZHN0MjIgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MTA2LCAxKTsKICAgICB9CiB9CiAKQEAgLTQwNTQsMTEgKzQ0MjMsMTEgQEAKIHsKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19odl91bml3Z3RfNHRfNHgyX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h2X3VuaXdndF80dF80eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsZmlsdGVyX3ksIHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwpOwogICAgIH0gZWxzZSBpZiAoMCA9PSAoaGVpZ2h0ICUgOCkpIHsKICAgICAgICAgaGV2Y19odl91bml3Z3RfNHRfNG11bHR4OG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLApAQCAtNDA3OCwyMCArNDQ0NywyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCkKIHsKLSAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7Ci0gICAgdjRpMzIgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOwotICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDIxX3IsIGRzdDQzX3I7Ci0gICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0MjFfbCwgZHN0NDNfbDsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0ZXJfdmVjOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjhpMTYgZHN0aDAsIGRzdGgxLCBkc3RoMiwgZHN0aDMsIGRzdGg0LCBkc3RoNSwgZHN0aDYsIGRzdGg3LCBkc3RoOCwgZHN0aDk7CisgICAgdjhpMTYgZHN0aDEwLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGRzdDk4X3IsIGRzdDIxX3IsIGRzdDQzX3I7CisgICAgdjhpMTYgZHN0NjVfciwgZHN0ODdfciwgZHN0MTA5X3IsIGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDc2X2w7CisgICAgdjhpMTYgZHN0OThfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbCwgZHN0ODdfbCwgZHN0MTA5X2w7CisgICAgdjhpMTYgZHN0MTAyMV9sLCBkc3QzMjQzX2wsIGRzdDU0NjVfbCwgZHN0NzY4N19sLCBkc3Q5ODEwOV9sOworICAgIHY4aTE2IG9mZnNldF92ZWMsIGNvbnN0XzEyOCwgZGVub21fdmVjOworICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yOworICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbCwgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOwogCkBAIC00MDk5LDIwICs0NDcwLDIwIEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKLQogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAorICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCAtIDYpOworICAgIGNvbnN0XzEyOCA9IF9fbXNhX2ZpbGxfaCgoMTI4ICogd2VpZ2h0KSk7CisgICAgb2Zmc2V0X3ZlYyArPSBfX21zYV9zcmFyX2goY29uc3RfMTI4LCBkZW5vbV92ZWMpOworCiAgICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CiAgICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CiAgICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CkBAIC00MTIwLDcyICs0NDkxLDc4IEBACiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgZHN0aDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGgxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgSUxWUkxfSDJfU0goZHN0aDEsIGRzdGgwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMiwgZHN0aDEsIGRzdDIxX3IsIGRzdDIxX2wpOwogCi0gICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7Ci0KLSAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDI7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7Ci0KLSAgICAgICAgLyogcm93IDMgKi8KLSAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7Ci0gICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QwX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9sLCBkc3QzMl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MF9yID4+PSA2OwotICAgICAgICBkc3QwX2wgPj49IDY7Ci0KLSAgICAgICAgLyogcm93IDQgKi8KLSAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7Ci0gICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MV9yID4+PSA2OwotICAgICAgICBkc3QxX2wgPj49IDY7Ci0KLSAgICAgICAgLyogcm93IDUgKi8KLSAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDEwX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3QxMF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0Ml9yID4+PSA2OwotICAgICAgICBkc3QyX2wgPj49IDY7Ci0KLSAgICAgICAgLyogcm93IDYgKi8KLSAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLSAgICAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0NSwgZHN0MjFfciwgZHN0MjFfbCk7Ci0gICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDIxX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19sLCBkc3QyMV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0M19yID4+PSA2OwotICAgICAgICBkc3QzX2wgPj49IDY7Ci0KLSAgICAgICAgSEVWQ19IVl9VTklXX1JORF9DTElQNChkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOwotICAgICAgICBIRVZDX0hWX1VOSVdfUk5EX0NMSVA0KGRzdDJfciwgZHN0M19yLCBkc3QyX2wsIGRzdDNfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfciwgZHN0M19yLCBkc3QyX2wsIGRzdDNfbCk7Ci0gICAgICAgIEhFVkNfUENLX1NXX1NCOChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yKTsKLSAgICAgICAgU1Q2eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIH0KKyAgICBMRF9TQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgWE9SSV9COF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBkc3RoMyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGg1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoNiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisgICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzksIHNyYzksIHNyYzksIHNyYzksIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMxMCwgc3JjMTAsIHNyYzEwLCBzcmMxMCwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICBkc3RoNyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDggPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdGg5ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMTAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgIElMVlJMX0gyX1NIKGRzdGgzLCBkc3RoMiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDQsIGRzdGgzLCBkc3Q0M19yLCBkc3Q0M19sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoNSwgZHN0aDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg2LCBkc3RoNSwgZHN0NjVfciwgZHN0NjVfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDcsIGRzdGg2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoOCwgZHN0aDcsIGRzdDg3X3IsIGRzdDg3X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg5LCBkc3RoOCwgZHN0OThfciwgZHN0OThfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDEwLCBkc3RoOSwgZHN0MTA5X3IsIGRzdDEwOV9sKTsKKyAgICBQQ0tFVl9EMl9TSChkc3QyMV9sLCBkc3QxMF9sLCBkc3Q0M19sLCBkc3QzMl9sLCBkc3QxMDIxX2wsIGRzdDMyNDNfbCk7CisgICAgUENLRVZfRDJfU0goZHN0NjVfbCwgZHN0NTRfbCwgZHN0ODdfbCwgZHN0NzZfbCwgZHN0NTQ2NV9sLCBkc3Q3Njg3X2wpOworICAgIGRzdDk4MTA5X2wgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2QoKHYyaTY0KSBkc3QxMDlfbCwgKHYyaTY0KSBkc3Q5OF9sKTsKKyAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q1X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q2X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Nl9yLCBkc3Q5OF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q3X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTAyMV9sLCBkc3QzMjQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyNDNfbCwgZHN0NTQ2NV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NDY1X2wsIGRzdDc2ODdfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NzY4N19sLCBkc3Q5ODEwOV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKKyAgICBTUkFfNFYoZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yLCA2KTsKKyAgICBTUkFfNFYoZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCA2KTsKKyAgICBNVUwyKGRzdDBfciwgd2VpZ2h0X3ZlYywgZHN0MV9yLCB3ZWlnaHRfdmVjLCBkc3QwX3IsIGRzdDFfcik7CisgICAgTVVMMihkc3QyX3IsIHdlaWdodF92ZWMsIGRzdDNfciwgd2VpZ2h0X3ZlYywgZHN0Ml9yLCBkc3QzX3IpOworICAgIE1VTDIoZHN0NF9yLCB3ZWlnaHRfdmVjLCBkc3Q1X3IsIHdlaWdodF92ZWMsIGRzdDRfciwgZHN0NV9yKTsKKyAgICBNVUwyKGRzdDZfciwgd2VpZ2h0X3ZlYywgZHN0N19yLCB3ZWlnaHRfdmVjLCBkc3Q2X3IsIGRzdDdfcik7CisgICAgTVVMMihkc3QwX2wsIHdlaWdodF92ZWMsIGRzdDFfbCwgd2VpZ2h0X3ZlYywgZHN0MF9sLCBkc3QxX2wpOworICAgIE1VTDIoZHN0Ml9sLCB3ZWlnaHRfdmVjLCBkc3QzX2wsIHdlaWdodF92ZWMsIGRzdDJfbCwgZHN0M19sKTsKKyAgICBTUkFSX1c0X1NXKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgcm5kX3ZlYyk7CisgICAgU1JBUl9XNF9TVyhkc3Q0X3IsIGRzdDVfciwgZHN0Nl9yLCBkc3Q3X3IsIHJuZF92ZWMpOworICAgIFNSQVJfVzRfU1coZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCBybmRfdmVjKTsKKyAgICBQQ0tFVl9IMl9TSChkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIHRtcDAsIHRtcDEpOworICAgIFBDS0VWX0gyX1NIKGRzdDVfciwgZHN0NF9yLCBkc3Q3X3IsIGRzdDZfciwgdG1wMiwgdG1wMyk7CisgICAgUENLRVZfSDJfU0goZHN0MV9sLCBkc3QwX2wsIGRzdDNfbCwgZHN0Ml9sLCB0bXA0LCB0bXA1KTsKKyAgICBBREQyKHRtcDAsIG9mZnNldF92ZWMsIHRtcDEsIG9mZnNldF92ZWMsIHRtcDAsIHRtcDEpOworICAgIEFERDIodG1wMiwgb2Zmc2V0X3ZlYywgdG1wMywgb2Zmc2V0X3ZlYywgdG1wMiwgdG1wMyk7CisgICAgQUREMih0bXA0LCBvZmZzZXRfdmVjLCB0bXA1LCBvZmZzZXRfdmVjLCB0bXA0LCB0bXA1KTsKKyAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICBDTElQX1NIMl8wXzI1NV9NQVhfU0FUVSh0bXA0LCB0bXA1KTsKKyAgICBQQ0tFVl9CM19VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0bXA1LCB0bXA0LCBvdXQwLCBvdXQxLCBvdXQyKTsKKyAgICBTVDR4OF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFNUMng0X1VCKG91dDIsIDAsIGRzdCArIDQsIGRzdF9zdHJpZGUpOworICAgIGRzdCArPSA0ICogZHN0X3N0cmlkZTsKKyAgICBTVDJ4NF9VQihvdXQyLCA0LCBkc3QgKyA0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl91bml3Z3RfNHRfOHgyX21zYSh1aW50OF90ICpzcmMsCkBAIC00MTk0LDIzICs0NTcxLDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogeworICAgIHYxNnU4IG91dDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdGVyX3ZlYzsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwotICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzk7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NDsKICAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2w7CiAgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0MjFfciwgZHN0NDNfcjsKICAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3QyMV9sLCBkc3Q0M19sOwotICAgIHY0aTMyIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWM7CisgICAgdjhpMTYgdG1wMCwgdG1wMTsKKyAgICB2OGkxNiBvZmZzZXRfdmVjLCBjb25zdF8xMjgsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOwogCiAgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTQyMTgsNjUgKzQ1OTYsMTQ0IEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKLQogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAotICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX2gob2Zmc2V0KTsKKyAgICBkZW5vbV92ZWMgPSBfX21zYV9maWxsX2gocm5kX3ZhbCAtIDYpOworICAgIGNvbnN0XzEyOCA9IF9fbXNhX2ZpbGxfaCgoMTI4ICogd2VpZ2h0KSk7CisgICAgb2Zmc2V0X3ZlYyArPSBfX21zYV9zcmFyX2goY29uc3RfMTI4LCBkZW5vbV92ZWMpOwogCisgICAgTERfU0I1KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CisgICAgWE9SSV9CNV8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCk7CiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0KKyAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzgsIHZlYzkpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM4LCB2ZWM5LCBmaWx0MCwgZmlsdDEpOwogICAgIElMVlJMX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDEwX3IsIGRzdDEwX2wpOwogICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDEsIGRzdDIxX3IsIGRzdDIxX2wpOwotCi0gICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKICAgICBJTFZSTF9IMl9TSChkc3QzLCBkc3QyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q0M19yLCBkc3Q0M19sKTsKICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3QwX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9sLCBkc3QzMl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QwX3IgPj49IDY7Ci0gICAgZHN0MF9sID4+PSA2OwotCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0gICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CiAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MV9yID4+PSA2OwotICAgIGRzdDFfbCA+Pj0gNjsKKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKKyAgICBNVUwyKGRzdDBfciwgd2VpZ2h0X3ZlYywgZHN0MV9yLCB3ZWlnaHRfdmVjLCBkc3QwX3IsIGRzdDFfcik7CisgICAgTVVMMihkc3QwX2wsIHdlaWdodF92ZWMsIGRzdDFfbCwgd2VpZ2h0X3ZlYywgZHN0MF9sLCBkc3QxX2wpOworICAgIFNSQVJfVzRfU1coZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBybmRfdmVjKTsKKyAgICBQQ0tFVl9IMl9TSChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIHRtcDAsIHRtcDEpOworICAgIEFERDIodG1wMCwgb2Zmc2V0X3ZlYywgdG1wMSwgb2Zmc2V0X3ZlYywgdG1wMCwgdG1wMSk7CisgICAgQ0xJUF9TSDJfMF8yNTVfTUFYX1NBVFUodG1wMCwgdG1wMSk7CisgICAgb3V0ID0gKHYxNnU4KSBfX21zYV9wY2tldl9iKCh2MTZpOCkgdG1wMSwgKHYxNmk4KSB0bXAwKTsKKyAgICBTVDh4Ml9VQihvdXQsIGRzdCwgZHN0X3N0cmlkZSk7Cit9CiAKLSAgICBIRVZDX0hWX1VOSVdfUk5EX0NMSVA0KGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOwotICAgIEhFVkNfUENLX1NXX1NCNChkc3QwX2wsIGRzdDBfciwgZHN0MV9sLCBkc3QxX3IsIGRzdDBfcik7Ci0gICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOworc3RhdGljIHZvaWQgaGV2Y19odl91bml3Z3RfNHRfOG11bHR4NF9tc2EodWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoOG11bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQoreworICAgIHVpbnQzMl90IGNudDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIG1hc2swLCBtYXNrMTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdGVyX3ZlYzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3I7CisgICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbDsKKyAgICB2OGkxNiBvZmZzZXRfdmVjLCBjb25zdF8xMjgsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKKyAgICB2NGkzMiB3ZWlnaHRfdmVjLCBybmRfdmVjOworCisgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3gpOworICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOworCisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKKyAgICBtYXNrMSA9IG1hc2swICsgMjsKKworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOworCisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsIC0gNik7CisgICAgY29uc3RfMTI4ID0gX19tc2FfZmlsbF9oKCgxMjggKiB3ZWlnaHQpKTsKKyAgICBvZmZzZXRfdmVjICs9IF9fbXNhX3NyYXJfaChjb25zdF8xMjgsIGRlbm9tX3ZlYyk7CisKKyAgICBmb3IgKGNudCA9IHdpZHRoOG11bHQ7IGNudC0tOykgeworICAgICAgICBMRF9TQjcoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjICs9IDg7CisgICAgICAgIFhPUklfQjdfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0NiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q0M19yLCBkc3Q0M19sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0NTRfciwgZHN0NTRfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDYsIGRzdDUsIGRzdDY1X3IsIGRzdDY1X2wpOworICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDU0X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICAgICAgTVVMMihkc3QwX3IsIHdlaWdodF92ZWMsIGRzdDFfciwgd2VpZ2h0X3ZlYywgZHN0MF9yLCBkc3QxX3IpOworICAgICAgICBNVUwyKGRzdDJfciwgd2VpZ2h0X3ZlYywgZHN0M19yLCB3ZWlnaHRfdmVjLCBkc3QyX3IsIGRzdDNfcik7CisgICAgICAgIE1VTDIoZHN0MF9sLCB3ZWlnaHRfdmVjLCBkc3QxX2wsIHdlaWdodF92ZWMsIGRzdDBfbCwgZHN0MV9sKTsKKyAgICAgICAgTVVMMihkc3QyX2wsIHdlaWdodF92ZWMsIGRzdDNfbCwgd2VpZ2h0X3ZlYywgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgcm5kX3ZlYyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCBybmRfdmVjKTsKKyAgICAgICAgUENLRVZfSDRfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QyX2wsIGRzdDJfciwgZHN0M19sLAorICAgICAgICAgICAgICAgICAgICBkc3QzX3IsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBBREQyKHRtcDAsIG9mZnNldF92ZWMsIHRtcDEsIG9mZnNldF92ZWMsIHRtcDAsIHRtcDEpOworICAgICAgICBBREQyKHRtcDIsIG9mZnNldF92ZWMsIHRtcDMsIG9mZnNldF92ZWMsIHRtcDIsIHRtcDMpOworICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSA4OworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl91bml3Z3RfNHRfOHg2X21zYSh1aW50OF90ICpzcmMsCkBAIC00Mjg1LDI2ICs0NzQyLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogeworICAgIHYxNnU4IG91dDAsIG91dDEsIG91dDI7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRlcl92ZWM7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKICAgICB2MTZpOCBtYXNrMTsKLSAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5OworICAgIHYxNmk4IHZlYzEwLCB2ZWMxMSwgdmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIHZlYzE2LCB2ZWMxNzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBkc3Q4OwogICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOwotICAgIHY0aTMyIGRzdDRfciwgZHN0NF9sLCBkc3Q1X3IsIGRzdDVfbDsKKyAgICB2NGkzMiBkc3Q0X3IsIGRzdDRfbCwgZHN0NV9yLCBkc3Q1X2wsIHdlaWdodF92ZWMsIHJuZF92ZWM7CiAgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0MTBfbCwgZHN0MzJfbDsKICAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3QyMV9sLCBkc3Q0M19sOwogICAgIHY4aTE2IGRzdDU0X3IsIGRzdDU0X2wsIGRzdDY1X3IsIGRzdDY1X2w7CiAgICAgdjhpMTYgZHN0NzZfciwgZHN0NzZfbCwgZHN0ODdfciwgZHN0ODdfbDsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDU7CisgICAgdjhpMTYgb2Zmc2V0X3ZlYywgY29uc3RfMTI4LCBkZW5vbV92ZWM7CiAKICAgICBzcmMgLT0gKHNyY19zdHJpZGUgKyAxKTsKIApAQCAtNDMxMiwxMjYgKzQ3NzAsODcgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAotICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7Ci0gICAgY29uc3RfdmVjIDw8PSA2OwotCiAgICAgd2VpZ2h0X3ZlYyA9IF9fbXNhX2ZpbGxfdyh3ZWlnaHQpOwotICAgIG9mZnNldF92ZWMgPSBfX21zYV9maWxsX3cob2Zmc2V0KTsKICAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOwogCi0gICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7Ci0gICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsIC0gNik7CisgICAgY29uc3RfMTI4ID0gX19tc2FfZmlsbF9oKCgxMjggKiB3ZWlnaHQpKTsKKyAgICBvZmZzZXRfdmVjICs9IF9fbXNhX3NyYXJfaChjb25zdF8xMjgsIGRlbm9tX3ZlYyk7CiAKLSAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKLQorICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOworICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwogICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWM4LCB2ZWM5KTsKKyAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMTAsIHZlYzExKTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMTIsIHZlYzEzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMTQsIHZlYzE1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMTYsIHZlYzE3KTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QzID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjOCwgdmVjOSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEpOworICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMxMiwgdmVjMTMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzE0LCB2ZWMxNSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3Q4ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMTYsIHZlYzE3LCBmaWx0MCwgZmlsdDEpOwogICAgIElMVlJMX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDEwX3IsIGRzdDEwX2wpOwogICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDEsIGRzdDIxX3IsIGRzdDIxX2wpOwotCi0gICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCk7Ci0gICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjMywgc3JjNCk7Ci0KLSAgICAvKiByb3cgMyAqLwotICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3QzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwogICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDYsIGRzdDUsIGRzdDY1X3IsIGRzdDY1X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDcsIGRzdDYsIGRzdDc2X3IsIGRzdDc2X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOwogICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDBfciA+Pj0gNjsKLSAgICBkc3QwX2wgPj49IDY7Ci0KLSAgICAvKiByb3cgNCAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOwogICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDFfciA+Pj0gNjsKLSAgICBkc3QxX2wgPj49IDY7Ci0KLSAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2KTsKLSAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmM1LCBzcmM2KTsKLQotICAgIC8qIHJvdyA1ICovCi0gICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7Ci0gICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0NTRfciwgZHN0NTRfbCk7CiAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0Ml9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfbCwgZHN0NTRfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0Ml9yID4+PSA2OwotICAgIGRzdDJfbCA+Pj0gNjsKLQotICAgIC8qIHJvdyA2ICovCi0gICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDYgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NiwgZHN0Nik7Ci0gICAgSUxWUkxfSDJfU0goZHN0NiwgZHN0NSwgZHN0NjVfciwgZHN0NjVfbCk7CiAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0M19yID4+PSA2OwotICAgIGRzdDNfbCA+Pj0gNjsKLQotICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgpOwotICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjJfMTI4X1NCKHNyYzcsIHNyYzgpOwotCi0gICAgLyogcm93IDcgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q3LCBkc3Q3KTsKLSAgICBJTFZSTF9IMl9TSChkc3Q3LCBkc3Q2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKICAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3Q0X2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9sLCBkc3Q3Nl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLQotICAgIGRzdDRfciA+Pj0gNjsKLSAgICBkc3Q0X2wgPj49IDY7Ci0KLSAgICAvKiByb3cgOCAqLwotICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q4ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDgsIGRzdDgpOwotICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOwogICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDVfbCA9IEhFVkNfRklMVF80VEFQKGRzdDY1X2wsIGRzdDg3X2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDVfciA+Pj0gNjsKLSAgICBkc3Q1X2wgPj49IDY7Ci0KLSAgICBIRVZDX0hWX1VOSVdfUk5EX0NMSVA0KGRzdDBfciwgZHN0MV9yLCBkc3QwX2wsIGRzdDFfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOwotICAgIEhFVkNfSFZfVU5JV19STkRfQ0xJUDQoZHN0Ml9yLCBkc3QzX3IsIGRzdDJfbCwgZHN0M19sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3ZlYywgb2Zmc2V0X3ZlYywgcm5kX3ZlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfciwgZHN0M19yLCBkc3QyX2wsIGRzdDNfbCk7Ci0gICAgSEVWQ19IVl9VTklXX1JORF9DTElQNChkc3Q0X3IsIGRzdDVfciwgZHN0NF9sLCBkc3Q1X2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NF9yLCBkc3Q1X3IsIGRzdDRfbCwgZHN0NV9sKTsKLSAgICBIRVZDX1BDS19TV19TQjEyKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKLSAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwKLSAgICAgICAgICAgICAgICAgICAgIGRzdDRfbCwgZHN0NF9yLCBkc3Q1X2wsIGRzdDVfciwgZHN0MF9yLCBkc3QxX3IsIGRzdDJfcik7Ci0gICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgU1JBXzRWKGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgNik7CisgICAgU1JBXzRWKGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbCwgNik7CisgICAgU1JBXzRWKGRzdDRfciwgZHN0NF9sLCBkc3Q1X3IsIGRzdDVfbCwgNik7CisgICAgTVVMMihkc3QwX3IsIHdlaWdodF92ZWMsIGRzdDFfciwgd2VpZ2h0X3ZlYywgZHN0MF9yLCBkc3QxX3IpOworICAgIE1VTDIoZHN0Ml9yLCB3ZWlnaHRfdmVjLCBkc3QzX3IsIHdlaWdodF92ZWMsIGRzdDJfciwgZHN0M19yKTsKKyAgICBNVUwyKGRzdDRfciwgd2VpZ2h0X3ZlYywgZHN0NV9yLCB3ZWlnaHRfdmVjLCBkc3Q0X3IsIGRzdDVfcik7CisgICAgTVVMMihkc3QwX2wsIHdlaWdodF92ZWMsIGRzdDFfbCwgd2VpZ2h0X3ZlYywgZHN0MF9sLCBkc3QxX2wpOworICAgIE1VTDIoZHN0Ml9sLCB3ZWlnaHRfdmVjLCBkc3QzX2wsIHdlaWdodF92ZWMsIGRzdDJfbCwgZHN0M19sKTsKKyAgICBNVUwyKGRzdDRfbCwgd2VpZ2h0X3ZlYywgZHN0NV9sLCB3ZWlnaHRfdmVjLCBkc3Q0X2wsIGRzdDVfbCk7CisgICAgU1JBUl9XNF9TVyhkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIHJuZF92ZWMpOworICAgIFNSQVJfVzRfU1coZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCBybmRfdmVjKTsKKyAgICBTUkFSX1c0X1NXKGRzdDRfciwgZHN0NF9sLCBkc3Q1X3IsIGRzdDVfbCwgcm5kX3ZlYyk7CisgICAgUENLRVZfSDRfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCisgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgUENLRVZfSDJfU0goZHN0NF9sLCBkc3Q0X3IsIGRzdDVfbCwgZHN0NV9yLCB0bXA0LCB0bXA1KTsKKyAgICBBREQyKHRtcDAsIG9mZnNldF92ZWMsIHRtcDEsIG9mZnNldF92ZWMsIHRtcDAsIHRtcDEpOworICAgIEFERDIodG1wMiwgb2Zmc2V0X3ZlYywgdG1wMywgb2Zmc2V0X3ZlYywgdG1wMiwgdG1wMyk7CisgICAgQUREMih0bXA0LCBvZmZzZXRfdmVjLCB0bXA1LCBvZmZzZXRfdmVjLCB0bXA0LCB0bXA1KTsKKyAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICBDTElQX1NIMl8wXzI1NV9NQVhfU0FUVSh0bXA0LCB0bXA1KTsKKyAgICBQQ0tFVl9CM19VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0bXA1LCB0bXA0LCBvdXQwLCBvdXQxLCBvdXQyKTsKKyAgICBTVDh4NF9VQihvdXQwLCBvdXQxLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIFNUOHgyX1VCKGRzdDJfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBTVDh4Ml9VQihvdXQyLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaXdndF80dF84bXVsdHg0bXVsdF9tc2EodWludDhfdCAqc3JjLApAQCAtNDQ0NCwyNCArNDg2MywyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm5kX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGg4bXVsdCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudCwgY250OwogICAgIHVpbnQ4X3QgKnNyY190bXA7CiAgICAgdWludDhfdCAqZHN0X3RtcDsKKyAgICB2MTZ1OCBvdXQwLCBvdXQxOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzY7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0ZXJfdmVjOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazE7Ci0gICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0MjFfciwgZHN0NDNfciwgZHN0NjVfcjsKKyAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sOwogICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbDsKLSAgICB2NGkzMiB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjOworICAgIHY4aTE2IG9mZnNldF92ZWMsIGNvbnN0XzEyOCwgZGVub21fdmVjOwogICAgIHY0aTMyIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3QyMV9yLCBkc3Q0M19yOwotICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDIxX2wsIGRzdDQzX2w7CisgICAgdjRpMzIgd2VpZ2h0X3ZlYywgcm5kX3ZlYzsKIAogICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOwogCkBAIC00NDY5LDIxICs0ODg5LDIxIEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKLSAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwotICAgIGNvbnN0X3ZlYyA8PD0gNjsKLQogICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKLSAgICBvZmZzZXRfdmVjID0gX19tc2FfZmlsbF93KG9mZnNldCk7CiAgICAgcm5kX3ZlYyA9IF9fbXNhX2ZpbGxfdyhybmRfdmFsKTsKIAotICAgIGZvciAoY250ID0gd2lkdGggPj4gMzsgY250LS07KSB7CisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsIC0gNik7CisgICAgY29uc3RfMTI4ID0gX19tc2FfZmlsbF9oKCgxMjggKiB3ZWlnaHQpKTsKKyAgICBvZmZzZXRfdmVjICs9IF9fbXNhX3NyYXJfaChjb25zdF8xMjgsIGRlbm9tX3ZlYyk7CisKKyAgICBmb3IgKGNudCA9IHdpZHRoOG11bHQ7IGNudC0tOykgewogICAgICAgICBzcmNfdG1wID0gc3JjOwogICAgICAgICBkc3RfdG1wID0gZHN0OwogCkBAIC00NDk0LDEyICs0OTE0LDkgQEAKICAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKIAogICAgICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKICAgICAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7CkBAIC00NTEwLDUxICs0OTI3LDQ3IEBACiAgICAgICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKIAogICAgICAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgICAgICAgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgICAgICAgICAgZHN0NiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CiAgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBkc3QyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0NTRfciwgZHN0NTRfbCk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3Q2LCBkc3Q1LCBkc3Q2NV9yLCBkc3Q2NV9sKTsKICAgICAgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgICAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgICAgICBkc3QwX3IgPj49IDY7Ci0gICAgICAgICAgICBkc3QwX2wgPj49IDY7Ci0KLSAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLSAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOwogICAgICAgICAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgICAgICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgICAgIGRzdDFfciA+Pj0gNjsKLSAgICAgICAgICAgIGRzdDFfbCA+Pj0gNjsKLQotICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0MTBfciwgZHN0MTBfbCk7Ci0gICAgICAgICAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3QxMF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDEwX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0Ml9yID4+PSA2OwotICAgICAgICAgICAgZHN0Ml9sID4+PSA2OwotCi0gICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0gICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3Q1LCBkc3QyMV9yLCBkc3QyMV9sKTsKLSAgICAgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDIxX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0MjFfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgICAgICBkc3QzX3IgPj49IDY7Ci0gICAgICAgICAgICBkc3QzX2wgPj49IDY7Ci0KLSAgICAgICAgICAgIEhFVkNfSFZfVU5JV19STkRfQ0xJUDQoZHN0MF9yLCBkc3QxX3IsIGRzdDBfbCwgZHN0MV9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRfdmVjLCBvZmZzZXRfdmVjLCBybmRfdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QwX3IsIGRzdDFfciwgZHN0MF9sLCBkc3QxX2wpOwotICAgICAgICAgICAgSEVWQ19IVl9VTklXX1JORF9DTElQNChkc3QyX3IsIGRzdDNfciwgZHN0Ml9sLCBkc3QzX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodF92ZWMsIG9mZnNldF92ZWMsIHJuZF92ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfciwgZHN0M19yLCBkc3QyX2wsIGRzdDNfbCk7Ci0gICAgICAgICAgICBIRVZDX1BDS19TV19TQjgoZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0MF9yLCBkc3QxX3IpOwotICAgICAgICAgICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdF90bXAsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgICAgICBTUkFfNFYoZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKKyAgICAgICAgICAgIFNSQV80Vihkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2wsIDYpOworICAgICAgICAgICAgTVVMMihkc3QwX3IsIHdlaWdodF92ZWMsIGRzdDFfciwgd2VpZ2h0X3ZlYywgZHN0MF9yLCBkc3QxX3IpOworICAgICAgICAgICAgTVVMMihkc3QyX3IsIHdlaWdodF92ZWMsIGRzdDNfciwgd2VpZ2h0X3ZlYywgZHN0Ml9yLCBkc3QzX3IpOworICAgICAgICAgICAgTVVMMihkc3QwX2wsIHdlaWdodF92ZWMsIGRzdDFfbCwgd2VpZ2h0X3ZlYywgZHN0MF9sLCBkc3QxX2wpOworICAgICAgICAgICAgTVVMMihkc3QyX2wsIHdlaWdodF92ZWMsIGRzdDNfbCwgd2VpZ2h0X3ZlYywgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICAgICAgU1JBUl9XNF9TVyhkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIHJuZF92ZWMpOworICAgICAgICAgICAgU1JBUl9XNF9TVyhkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2wsIHJuZF92ZWMpOworICAgICAgICAgICAgUENLRVZfSDRfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QyX2wsIGRzdDJfciwgZHN0M19sLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0M19yLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgICAgIEFERDIodG1wMCwgb2Zmc2V0X3ZlYywgdG1wMSwgb2Zmc2V0X3ZlYywgdG1wMCwgdG1wMSk7CisgICAgICAgICAgICBBREQyKHRtcDIsIG9mZnNldF92ZWMsIHRtcDMsIG9mZnNldF92ZWMsIHRtcDIsIHRtcDMpOworICAgICAgICAgICAgQ0xJUF9TSDRfMF8yNTVfTUFYX1NBVFUodG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CisgICAgICAgICAgICBQQ0tFVl9CMl9VQih0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCBvdXQwLCBvdXQxKTsKKyAgICAgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdF90bXAsIGRzdF9zdHJpZGUpOwogICAgICAgICAgICAgZHN0X3RtcCArPSAoNCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgICAgICBkc3QxMF9yID0gZHN0NTRfcjsKKyAgICAgICAgICAgIGRzdDEwX2wgPSBkc3Q1NF9sOworICAgICAgICAgICAgZHN0MjFfciA9IGRzdDY1X3I7CisgICAgICAgICAgICBkc3QyMV9sID0gZHN0NjVfbDsKKyAgICAgICAgICAgIGRzdDIgPSBkc3Q2OwogICAgICAgICB9CiAKICAgICAgICAgc3JjICs9IDg7CkBAIC00NTc2LDE2ICs0OTg5LDIwIEBACiAKICAgICBpZiAoMiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19odl91bml3Z3RfNHRfOHgyX21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcm5kX3ZhbCk7CisgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgeworICAgICAgICBoZXZjX2h2X3VuaXdndF80dF84bXVsdHg0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCAxLCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcm5kX3ZhbCk7CiAgICAgfSBlbHNlIGlmICg2ID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h2X3VuaXdndF80dF84eDZfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCB3ZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBybmRfdmFsKTsKICAgICB9IGVsc2UgaWYgKDAgPT0gKGhlaWdodCAlIDQpKSB7CiAgICAgICAgIGhldmNfaHZfdW5pd2d0XzR0XzhtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwsIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBybmRfdmFsLCAxKTsKICAgICB9CiB9CiAKQEAgLTQ2MDAsMTIgKzUwMTcsMTcwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJuZF92YWwpCiB7Ci0gICAgaGV2Y19odl91bml3Z3RfNHRfOG11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwsIDgpOwotICAgIGhldmNfaHZfdW5pd2d0XzR0XzR3X21zYShzcmMgKyA4LCBzcmNfc3RyaWRlLCBkc3QgKyA4LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQ4X3QgKnNyY190bXAsICpkc3RfdG1wOworICAgIHYxNnU4IG91dDAsIG91dDE7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMzsKKyAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRlcl92ZWMsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CisgICAgdjhpMTYgZHN0aDAsIGRzdGgxLCBkc3RoMiwgZHN0aDMsIGRzdGg0LCBkc3RoNSwgZHN0aDY7CisgICAgdjhpMTYgZHN0MTAsIGRzdDIxLCBkc3QyMiwgZHN0NzMsIGRzdDg0LCBkc3Q5NSwgZHN0MTA2OworICAgIHY4aTE2IGRzdDc2X3IsIGRzdDk4X3IsIGRzdDg3X3IsIGRzdDEwOV9yOworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3I7CisgICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbDsKKyAgICB2OGkxNiBvZmZzZXRfdmVjLCBjb25zdF8xMjgsIGRlbm9tX3ZlYzsKKyAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCB3ZWlnaHRfdmVjLCBybmRfdmVjOworCisgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CisKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3gpOworICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOworCisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKKyAgICBtYXNrMSA9IG1hc2swICsgMjsKKworICAgIHdlaWdodF92ZWMgPSBfX21zYV9maWxsX3cod2VpZ2h0KTsKKyAgICBybmRfdmVjID0gX19tc2FfZmlsbF93KHJuZF92YWwpOworCisgICAgb2Zmc2V0X3ZlYyA9IF9fbXNhX2ZpbGxfaChvZmZzZXQpOworICAgIGRlbm9tX3ZlYyA9IF9fbXNhX2ZpbGxfaChybmRfdmFsIC0gNik7CisgICAgY29uc3RfMTI4ID0gX19tc2FfZmlsbF9oKCgxMjggKiB3ZWlnaHQpKTsKKyAgICBvZmZzZXRfdmVjICs9IF9fbXNhX3NyYXJfaChjb25zdF8xMjgsIGRlbm9tX3ZlYyk7CisKKyAgICBzcmNfdG1wID0gc3JjOworICAgIGRzdF90bXAgPSBkc3Q7CisKKyAgICBMRF9TQjMoc3JjX3RtcCwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgc3JjX3RtcCArPSAoMyAqIHNyY19zdHJpZGUpOworICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIGRzdGgwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3RoMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgZHN0aDIgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEpOworICAgIElMVlJMX0gyX1NIKGRzdGgxLCBkc3RoMCwgZHN0MTBfciwgZHN0MTBfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDIsIGRzdGgxLCBkc3QyMV9yLCBkc3QyMV9sKTsKKworICAgIGZvciAobG9vcF9jbnQgPSA0OyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjX3RtcCwgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgICAgIHNyY190bXAgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKKyAgICAgICAgZHN0aDMgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3RoNCA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdGg1ID0gSEVWQ19GSUxUXzRUQVBfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0aDYgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoMywgZHN0aDIsIGRzdDMyX3IsIGRzdDMyX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoNCwgZHN0aDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoNSwgZHN0aDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3RoNiwgZHN0aDUsIGRzdDY1X3IsIGRzdDY1X2wpOworICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9sLCBkc3Q0M19sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDU0X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICAgICAgTVVMMihkc3QwX3IsIHdlaWdodF92ZWMsIGRzdDFfciwgd2VpZ2h0X3ZlYywgZHN0MF9yLCBkc3QxX3IpOworICAgICAgICBNVUwyKGRzdDJfciwgd2VpZ2h0X3ZlYywgZHN0M19yLCB3ZWlnaHRfdmVjLCBkc3QyX3IsIGRzdDNfcik7CisgICAgICAgIE1VTDIoZHN0MF9sLCB3ZWlnaHRfdmVjLCBkc3QxX2wsIHdlaWdodF92ZWMsIGRzdDBfbCwgZHN0MV9sKTsKKyAgICAgICAgTVVMMihkc3QyX2wsIHdlaWdodF92ZWMsIGRzdDNfbCwgd2VpZ2h0X3ZlYywgZHN0Ml9sLCBkc3QzX2wpOworICAgICAgICBTUkFSX1c0X1NXKGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgcm5kX3ZlYyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCBybmRfdmVjKTsKKyAgICAgICAgUENLRVZfSDRfU0goZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QyX2wsIGRzdDJfciwgZHN0M19sLAorICAgICAgICAgICAgICAgICAgICBkc3QzX3IsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOworICAgICAgICBBREQyKHRtcDAsIG9mZnNldF92ZWMsIHRtcDEsIG9mZnNldF92ZWMsIHRtcDAsIHRtcDEpOworICAgICAgICBBREQyKHRtcDIsIG9mZnNldF92ZWMsIHRtcDMsIG9mZnNldF92ZWMsIHRtcDIsIHRtcDMpOworICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUOHg0X1VCKG91dDAsIG91dDEsIGRzdF90bXAsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3RfdG1wICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgZHN0MTBfciA9IGRzdDU0X3I7CisgICAgICAgIGRzdDEwX2wgPSBkc3Q1NF9sOworICAgICAgICBkc3QyMV9yID0gZHN0NjVfcjsKKyAgICAgICAgZHN0MjFfbCA9IGRzdDY1X2w7CisgICAgICAgIGRzdGgyID0gZHN0aDY7CisgICAgfQorCisgICAgc3JjICs9IDg7CisgICAgZHN0ICs9IDg7CisKKyAgICBtYXNrMiA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CisgICAgbWFzazMgPSBtYXNrMiArIDI7CisKKyAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzEsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMyLCBzcmMxLCBzcmMyLCBtYXNrMiwgbWFzazMsIHZlYzIsIHZlYzMpOworICAgIGRzdDEwID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICBkc3QyMSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSk7CisgICAgSUxWUkxfSDJfU0goZHN0MjEsIGRzdDEwLCBkc3QxMF9yLCBkc3QyMV9yKTsKKyAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QyMSwgMSk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gMjsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwKKyAgICAgICAgICAgICAgIHNyYzEwKTsKKyAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmM3LCBzcmMzLCBzcmM3LCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzgsIHNyYzQsIHNyYzgsIG1hc2syLCBtYXNrMywgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjOSwgc3JjNSwgc3JjOSwgbWFzazIsIG1hc2szLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmMxMCwgc3JjNiwgc3JjMTAsIG1hc2syLCBtYXNrMywgdmVjNiwgdmVjNyk7CisgICAgICAgIGRzdDczID0gSEVWQ19GSUxUXzRUQVBfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxKTsKKyAgICAgICAgZHN0ODQgPSBIRVZDX0ZJTFRfNFRBUF9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEpOworICAgICAgICBkc3Q5NSA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDEwNiA9IEhFVkNfRklMVF80VEFQX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSk7CisgICAgICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0NzMsIGRzdDIyKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0ODQsIGRzdDczLCBkc3Q0M19yLCBkc3Q4N19yKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0OTUsIGRzdDg0LCBkc3Q1NF9yLCBkc3Q5OF9yKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MTA2LCBkc3Q5NSwgZHN0NjVfciwgZHN0MTA5X3IpOworICAgICAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q3MywgMSk7CisgICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0MjIsIGRzdDEwNik7CisgICAgICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MSA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NCA9IEhFVkNfRklMVF80VEFQKGRzdDU0X3IsIGRzdDc2X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q1ID0gSEVWQ19GSUxUXzRUQVAoZHN0NjVfciwgZHN0ODdfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDYgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Nl9yLCBkc3Q5OF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NyA9IEhFVkNfRklMVF80VEFQKGRzdDg3X3IsIGRzdDEwOV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgU1JBXzRWKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIDYpOworICAgICAgICBTUkFfNFYoZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgNik7CisgICAgICAgIE1VTDIoZHN0MCwgd2VpZ2h0X3ZlYywgZHN0MSwgd2VpZ2h0X3ZlYywgZHN0MCwgZHN0MSk7CisgICAgICAgIE1VTDIoZHN0Miwgd2VpZ2h0X3ZlYywgZHN0Mywgd2VpZ2h0X3ZlYywgZHN0MiwgZHN0Myk7CisgICAgICAgIE1VTDIoZHN0NCwgd2VpZ2h0X3ZlYywgZHN0NSwgd2VpZ2h0X3ZlYywgZHN0NCwgZHN0NSk7CisgICAgICAgIE1VTDIoZHN0Niwgd2VpZ2h0X3ZlYywgZHN0Nywgd2VpZ2h0X3ZlYywgZHN0NiwgZHN0Nyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgcm5kX3ZlYyk7CisgICAgICAgIFNSQVJfVzRfU1coZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nywgcm5kX3ZlYyk7CisgICAgICAgIFBDS0VWX0g0X1NIKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsIHRtcDAsIHRtcDEsCisgICAgICAgICAgICAgICAgICAgIHRtcDIsIHRtcDMpOworICAgICAgICBBREQyKHRtcDAsIG9mZnNldF92ZWMsIHRtcDEsIG9mZnNldF92ZWMsIHRtcDAsIHRtcDEpOworICAgICAgICBBREQyKHRtcDIsIG9mZnNldF92ZWMsIHRtcDMsIG9mZnNldF92ZWMsIHRtcDIsIHRtcDMpOworICAgICAgICBDTElQX1NINF8wXzI1NV9NQVhfU0FUVSh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKKyAgICAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgb3V0MCwgb3V0MSk7CisgICAgICAgIFNUNHg4X1VCKG91dDAsIG91dDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgIGRzdDEwX3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QyMV9yID0gZHN0MTA5X3I7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDEwNiwgMSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaXdndF80dF8xNndfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTQ2MTksOSArNTE5NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBybmRfdmFsKQogewotICAgIGhldmNfaHZfdW5pd2d0XzR0XzhtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBybmRfdmFsLCAxNik7CisgICAgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIGhldmNfaHZfdW5pd2d0XzR0XzhtdWx0eDRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIDIsIHdlaWdodCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmRfdmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoZXZjX2h2X3VuaXdndF80dF84bXVsdHg0bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBybmRfdmFsLCAyKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfdW5pd2d0XzR0XzI0d19tc2EodWludDhfdCAqc3JjLApAQCAtNDYzNyw3ICs1MjE4LDcgQEAKIHsKICAgICBoZXZjX2h2X3VuaXdndF80dF84bXVsdHg0bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgcm5kX3ZhbCwgMjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwsIDMpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2X3VuaXdndF80dF8zMndfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTQ2NTMsNyArNTIzNCw3IEBACiB7CiAgICAgaGV2Y19odl91bml3Z3RfNHRfOG11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIHJuZF92YWwsIDMyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBybmRfdmFsLCA0KTsKIH0KIAogI2RlZmluZSBVTklXR1RfTUNfQ09QWShXSURUSCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC00Njg4LDE4ICs1MjY5LDE4IEBACiAKICNkZWZpbmUgVU5JX1dfTUMoUEVMLCBESVIsIFdJRFRILCBUQVAsIERJUjEsIEZJTFRfRElSKSAgICAgICAgICAgICAgICAgICAgICAgIFwKIHZvaWQgZmZfaGV2Y19wdXRfaGV2Y191bmlfd18jI1BFTCMjXyMjRElSIyNXSURUSCMjXzhfbXNhKHVpbnQ4X3QgKmRzdCwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0cmlkZSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbm9tLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXgsICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXksICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zdHJpZGUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZW5vbSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG15LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciA9IGZmX2hldmNfIyNQRUwjI19maWx0ZXJzW0ZJTFRfRElSIC0gMV07ICAgICAgICAgICAgIFwKICAgICBpbnQgc2hpZnQgPSBkZW5vbSArIDE0IC0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQ3NDUsNDYgKzUzMjYsNDMgQEAKIAogI3VuZGVmIFVOSV9XX01DCiAKLSNkZWZpbmUgVU5JX1dfTUNfSFYoUEVMLCBESVIsIFdJRFRILCBUQVAsIERJUjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdm9pZCBmZl9oZXZjX3B1dF9oZXZjX3VuaV93XyMjUEVMIyNfIyNESVIjI1dJRFRIIyNfOF9tc2EodWludDhfdCAqZHN0LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0cmlkZSwgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3N0cmlkZSwgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZW5vbSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXksICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94ID0gZmZfaGV2Y18jI1BFTCMjX2ZpbHRlcnNbbXggLSAxXTsgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kgPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteSAtIDFdOyAgICAgICAgICAgICAgICBcCi0gICAgaW50IHNoaWZ0ID0gZGVub20gKyAxNCAtIDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGhldmNfIyNESVIxIyNfdW5pd2d0XyMjVEFQIyN0XyMjV0lEVEgjI3dfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0cmlkZSwgZmlsdGVyX3gsICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeSwgIGhlaWdodCwgd2VpZ2h0LCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCwgc2hpZnQpOyAgICAgICAgICAgICBcCisjZGVmaW5lIFVOSV9XX01DX0hWKFBFTCwgV0lEVEgsIFRBUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2hldmNfcHV0X2hldmNfdW5pX3dfIyNQRUwjI19odiMjV0lEVEgjI184X21zYSh1aW50OF90ICpkc3QsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVub20sICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCA9IGZmX2hldmNfIyNQRUwjI19maWx0ZXJzW214IC0gMV07ICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSA9IGZmX2hldmNfIyNQRUwjI19maWx0ZXJzW215IC0gMV07ICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNoaWZ0ID0gZGVub20gKyAxNCAtIDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGV2Y19odl91bml3Z3RfIyNUQVAjI3RfIyNXSURUSCMjd19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCAgaGVpZ2h0LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0LCBvZmZzZXQsIHNoaWZ0KTsgICAgICAgICAgICBcCiB9CiAKLVVOSV9XX01DX0hWKHFwZWwsIGh2LCA0LCA4LCBodik7Ci1VTklfV19NQ19IVihxcGVsLCBodiwgOCwgOCwgaHYpOwotVU5JX1dfTUNfSFYocXBlbCwgaHYsIDEyLCA4LCBodik7Ci1VTklfV19NQ19IVihxcGVsLCBodiwgMTYsIDgsIGh2KTsKLVVOSV9XX01DX0hWKHFwZWwsIGh2LCAyNCwgOCwgaHYpOwotVU5JX1dfTUNfSFYocXBlbCwgaHYsIDMyLCA4LCBodik7Ci1VTklfV19NQ19IVihxcGVsLCBodiwgNDgsIDgsIGh2KTsKLVVOSV9XX01DX0hWKHFwZWwsIGh2LCA2NCwgOCwgaHYpOworVU5JX1dfTUNfSFYocXBlbCwgNCwgOCk7CitVTklfV19NQ19IVihxcGVsLCA4LCA4KTsKK1VOSV9XX01DX0hWKHFwZWwsIDEyLCA4KTsKK1VOSV9XX01DX0hWKHFwZWwsIDE2LCA4KTsKK1VOSV9XX01DX0hWKHFwZWwsIDI0LCA4KTsKK1VOSV9XX01DX0hWKHFwZWwsIDMyLCA4KTsKK1VOSV9XX01DX0hWKHFwZWwsIDQ4LCA4KTsKK1VOSV9XX01DX0hWKHFwZWwsIDY0LCA4KTsKIAotVU5JX1dfTUNfSFYoZXBlbCwgaHYsIDQsIDQsIGh2KTsKLVVOSV9XX01DX0hWKGVwZWwsIGh2LCA2LCA0LCBodik7Ci1VTklfV19NQ19IVihlcGVsLCBodiwgOCwgNCwgaHYpOwotVU5JX1dfTUNfSFYoZXBlbCwgaHYsIDEyLCA0LCBodik7Ci1VTklfV19NQ19IVihlcGVsLCBodiwgMTYsIDQsIGh2KTsKLVVOSV9XX01DX0hWKGVwZWwsIGh2LCAyNCwgNCwgaHYpOwotVU5JX1dfTUNfSFYoZXBlbCwgaHYsIDMyLCA0LCBodik7CitVTklfV19NQ19IVihlcGVsLCA0LCA0KTsKK1VOSV9XX01DX0hWKGVwZWwsIDYsIDQpOworVU5JX1dfTUNfSFYoZXBlbCwgOCwgNCk7CitVTklfV19NQ19IVihlcGVsLCAxMiwgNCk7CitVTklfV19NQ19IVihlcGVsLCAxNiwgNCk7CitVTklfV19NQ19IVihlcGVsLCAyNCwgNCk7CitVTklfV19NQ19IVihlcGVsLCAzMiwgNCk7CiAKICN1bmRlZiBVTklfV19NQ19IVgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2hldmNkc3BfaW5pdF9taXBzLmMgYi9saWJhdmNvZGVjL21pcHMvaGV2Y2RzcF9pbml0X21pcHMuYwppbmRleCAzNjc1YjkzLi43NzZkMTNlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaGV2Y2RzcF9pbml0X21pcHMuYworKysgYi9saWJhdmNvZGVjL21pcHMvaGV2Y2RzcF9pbml0X21pcHMuYwpAQCAtNDM3LDExICs0MzcsMTEgQEAKICAgICAgICAgYy0+aWRjdF9kY1sxXSA9IGZmX2hldmNfaWRjdF9kY184eDhfbXNhOwogICAgICAgICBjLT5pZGN0X2RjWzJdID0gZmZfaGV2Y19pZGN0X2RjXzE2eDE2X21zYTsKICAgICAgICAgYy0+aWRjdF9kY1szXSA9IGZmX2hldmNfaWRjdF9kY18zMngzMl9tc2E7Ci0gICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbMF0gPSBmZl9oZXZjX2FkZGJsa180eDRfbXNhOwotICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzFdID0gZmZfaGV2Y19hZGRibGtfOHg4X21zYTsKLSAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsyXSA9IGZmX2hldmNfYWRkYmxrXzE2eDE2X21zYTsKLSAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFszXSA9IGZmX2hldmNfYWRkYmxrXzMyeDMyX21zYTsKLSAgICAgICAgYy0+aWRjdF80eDRfbHVtYSA9IGZmX2hldmNfaWRjdF9sdW1hXzR4NF9tc2E7CisgICAgICAgIGMtPmFkZF9yZXNpZHVhbFswXSA9IGZmX2hldmNfYWRkYmxrXzR4NF9tc2E7CisgICAgICAgIGMtPmFkZF9yZXNpZHVhbFsxXSA9IGZmX2hldmNfYWRkYmxrXzh4OF9tc2E7CisgICAgICAgIGMtPmFkZF9yZXNpZHVhbFsyXSA9IGZmX2hldmNfYWRkYmxrXzE2eDE2X21zYTsKKyAgICAgICAgYy0+YWRkX3Jlc2lkdWFsWzNdID0gZmZfaGV2Y19hZGRibGtfMzJ4MzJfbXNhOworICAgICAgICBjLT50cmFuc2Zvcm1fNHg0X2x1bWEgPSBmZl9oZXZjX2lkY3RfbHVtYV80eDRfbXNhOwogICAgIH0KIH0KICNlbmRpZiAgLy8gI2lmIEhBVkVfTVNBCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaGV2Y2RzcF9tc2EuYyBiL2xpYmF2Y29kZWMvbWlwcy9oZXZjZHNwX21zYS5jCmluZGV4IGYyYmM3NDguLjgxZGI2MmIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9oZXZjZHNwX21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oZXZjZHNwX21zYS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSBNYW5vamt1bWFyIEJob3NhbGUgKE1hbm9qa3VtYXIuQmhvc2FsZUBpbWd0ZWMuY29tKQorICogQ29weXJpZ2h0IChjKSAyMDE1IC0gMjAxNyBNYW5vamt1bWFyIEJob3NhbGUgKE1hbm9qa3VtYXIuQmhvc2FsZUBpbWd0ZWMuY29tKQogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0yMiw2ICsyMiwxMyBAQAogI2luY2x1ZGUgImxpYmF2Y29kZWMvbWlwcy9oZXZjZHNwX21pcHMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL21pcHMvaGV2Y19tYWNyb3NfbXNhLmgiCiAKK3N0YXRpYyBjb25zdCB1aW50OF90IGZmX2hldmNfbWFza19hcnJbMTYgKiAyXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDB4NDApKSkgPSB7CisgICAgLyogOCB3aWR0aCBjYXNlcyAqLworICAgIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsCisgICAgLyogNCB3aWR0aCBjYXNlcyAqLworICAgIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMAorfTsKKwogc3RhdGljIHZvaWQgaGV2Y19jb3B5XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQpAQCAtMTkyLDU2ICsxOTksNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgaGV2Y19jb3B5XzE2bXVsdHg4bXVsdF9tc2EodWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoKQotewotICAgIHVpbnQ4X3QgKnNyY190bXA7Ci0gICAgaW50MTZfdCAqZHN0X3RtcDsKLSAgICB1aW50MzJfdCBsb29wX2NudCwgY250OwotICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotICAgIHY4aTE2IGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yOwotICAgIHY4aTE2IGluMF9sLCBpbjFfbCwgaW4yX2wsIGluM19sOwotCi0gICAgZm9yIChjbnQgPSAod2lkdGggPj4gNCk7IGNudC0tOykgewotICAgICAgICBzcmNfdG1wID0gc3JjOwotICAgICAgICBkc3RfdG1wID0gZHN0OwotCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDMpOyBsb29wX2NudC0tOykgewotICAgICAgICAgICAgTERfU0I4KHNyY190bXAsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmNfdG1wICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKLSAgICAgICAgICAgICAgICAgICAgICAgaW4wX3IsIGluMV9yLCBpbjJfciwgaW4zX3IpOwotICAgICAgICAgICAgSUxWTF9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAotICAgICAgICAgICAgICAgICAgICAgICBpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCk7Ci0gICAgICAgICAgICBTTExJXzRWKGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCA2KTsKLSAgICAgICAgICAgIFNMTElfNFYoaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2wsIDYpOwotICAgICAgICAgICAgU1RfU0g0KGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIFNUX1NINChpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCwgKGRzdF90bXAgKyA4KSwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3RfdG1wICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjNCwgemVybywgc3JjNSwgemVybywgc3JjNiwgemVybywgc3JjNywKLSAgICAgICAgICAgICAgICAgICAgICAgaW4wX3IsIGluMV9yLCBpbjJfciwgaW4zX3IpOwotICAgICAgICAgICAgSUxWTF9CNF9TSCh6ZXJvLCBzcmM0LCB6ZXJvLCBzcmM1LCB6ZXJvLCBzcmM2LCB6ZXJvLCBzcmM3LAotICAgICAgICAgICAgICAgICAgICAgICBpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCk7Ci0gICAgICAgICAgICBTTExJXzRWKGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCA2KTsKLSAgICAgICAgICAgIFNMTElfNFYoaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2wsIDYpOwotICAgICAgICAgICAgU1RfU0g0KGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCBkc3RfdG1wLCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIFNUX1NINChpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCwgKGRzdF90bXAgKyA4KSwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3RfdG1wICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzcmMgKz0gMTY7Ci0gICAgICAgIGRzdCArPSAxNjsKLSAgICB9Ci19Ci0KIHN0YXRpYyB2b2lkIGhldmNfY29weV8xNndfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKQEAgLTMwMiw4ICsyNTksMzQgQEAKICAgICAgICAgU1RfU0g0KGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBTVF9TSDQoaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2wsIChkc3QgKyA4KSwgZHN0X3N0cmlkZSk7CiAgICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSA4KSkgewotICAgICAgICBoZXZjX2NvcHlfMTZtdWx0eDhtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAxNik7CisgICAgICAgIHVpbnQzMl90IGxvb3BfY250OworICAgICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgICAgICB2OGkxNiBpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2w7CisKKyAgICAgICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMyk7IGxvb3BfY250LS07KSB7CisgICAgICAgICAgICBMRF9TQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LAorICAgICAgICAgICAgICAgICAgIHNyYzcpOworICAgICAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7CisgICAgICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzAsIHplcm8sIHNyYzEsIHplcm8sIHNyYzIsIHplcm8sIHNyYzMsIGluMF9yLAorICAgICAgICAgICAgICAgICAgICAgICBpbjFfciwgaW4yX3IsIGluM19yKTsKKyAgICAgICAgICAgIElMVkxfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywgaW4wX2wsCisgICAgICAgICAgICAgICAgICAgICAgIGluMV9sLCBpbjJfbCwgaW4zX2wpOworICAgICAgICAgICAgU0xMSV80VihpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgNik7CisgICAgICAgICAgICBTTExJXzRWKGluMF9sLCBpbjFfbCwgaW4yX2wsIGluM19sLCA2KTsKKyAgICAgICAgICAgIFNUX1NINChpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFNUX1NINChpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCwgKGRzdCArIDgpLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzQsIHplcm8sIHNyYzUsIHplcm8sIHNyYzYsIHplcm8sIHNyYzcsIGluMF9yLAorICAgICAgICAgICAgICAgICAgICAgICBpbjFfciwgaW4yX3IsIGluM19yKTsKKyAgICAgICAgICAgIElMVkxfQjRfU0goemVybywgc3JjNCwgemVybywgc3JjNSwgemVybywgc3JjNiwgemVybywgc3JjNywgaW4wX2wsCisgICAgICAgICAgICAgICAgICAgICAgIGluMV9sLCBpbjJfbCwgaW4zX2wpOworICAgICAgICAgICAgU0xMSV80VihpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgNik7CisgICAgICAgICAgICBTTExJXzRWKGluMF9sLCBpbjFfbCwgaW4yX2wsIGluM19sLCA2KTsKKyAgICAgICAgICAgIFNUX1NINChpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFNUX1NINChpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCwgKGRzdCArIDgpLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0zMTEsMjkgKzI5NCwxNTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19jb3B5XzE2bXVsdHg4bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwgMTYpOwotICAgIGhldmNfY29weV84d19tc2Eoc3JjICsgMTYsIHNyY19zdHJpZGUsIGRzdCArIDE2LCBkc3Rfc3RyaWRlLCBoZWlnaHQpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHY4aTE2IGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCBpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbDsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgTERfU0I0KChzcmMgKyAxNiksIHNyY19zdHJpZGUsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLCBpbjBfciwgaW4xX3IsCisgICAgICAgICAgICAgICAgICAgaW4yX3IsIGluM19yKTsKKyAgICAgICAgSUxWTF9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLCBpbjBfbCwgaW4xX2wsCisgICAgICAgICAgICAgICAgICAgaW4yX2wsIGluM19sKTsKKyAgICAgICAgU0xMSV80VihpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgNik7CisgICAgICAgIFNMTElfNFYoaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2wsIDYpOworICAgICAgICBTVF9TSDQoaW4wX3IsIGluMV9yLCBpbjJfciwgaW4zX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIFNUX1NINChpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCwgKGRzdCArIDgpLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmM0LCB6ZXJvLCBzcmM1LCB6ZXJvLCBzcmM2LCB6ZXJvLCBzcmM3LCBpbjBfciwgaW4xX3IsCisgICAgICAgICAgICAgICAgICAgaW4yX3IsIGluM19yKTsKKyAgICAgICAgU0xMSV80VihpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgNik7CisgICAgICAgIFNUX1NINChpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgKGRzdCArIDE2KSwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19jb3B5XzMyd19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfY29weV8xNm11bHR4OG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQsIDMyKTsKKyAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICB2MTZpOCB6ZXJvID0geyAwIH07CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB2OGkxNiBpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2w7CisKKyAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMiwgc3JjNCwgc3JjNik7CisgICAgICAgIExEX1NCNCgoc3JjICsgMTYpLCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMzLCBzcmM1LCBzcmM3KTsKKyAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisKKyAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLCBpbjBfciwgaW4xX3IsCisgICAgICAgICAgICAgICAgICAgaW4yX3IsIGluM19yKTsKKyAgICAgICAgSUxWTF9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLCBpbjBfbCwgaW4xX2wsCisgICAgICAgICAgICAgICAgICAgaW4yX2wsIGluM19sKTsKKyAgICAgICAgU0xMSV80VihpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgNik7CisgICAgICAgIFNMTElfNFYoaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2wsIDYpOworICAgICAgICBTVF9TSDQoaW4wX3IsIGluMF9sLCBpbjFfciwgaW4xX2wsIGRzdCwgOCk7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTVF9TSDQoaW4yX3IsIGluMl9sLCBpbjNfciwgaW4zX2wsIGRzdCwgOCk7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworCisgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjNCwgemVybywgc3JjNSwgemVybywgc3JjNiwgemVybywgc3JjNywgaW4wX3IsIGluMV9yLAorICAgICAgICAgICAgICAgICAgIGluMl9yLCBpbjNfcik7CisgICAgICAgIElMVkxfQjRfU0goemVybywgc3JjNCwgemVybywgc3JjNSwgemVybywgc3JjNiwgemVybywgc3JjNywgaW4wX2wsIGluMV9sLAorICAgICAgICAgICAgICAgICAgIGluMl9sLCBpbjNfbCk7CisgICAgICAgIFNMTElfNFYoaW4wX3IsIGluMV9yLCBpbjJfciwgaW4zX3IsIDYpOworICAgICAgICBTTExJXzRWKGluMF9sLCBpbjFfbCwgaW4yX2wsIGluM19sLCA2KTsKKyAgICAgICAgU1RfU0g0KGluMF9yLCBpbjBfbCwgaW4xX3IsIGluMV9sLCBkc3QsIDgpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU1RfU0g0KGluMl9yLCBpbjJfbCwgaW4zX3IsIGluM19sLCBkc3QsIDgpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfY29weV80OHdfbXNhKHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2NvcHlfMTZtdWx0eDhtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LCA0OCk7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdjE2aTggemVybyA9IHsgMCB9OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CisgICAgdjE2aTggc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExOworICAgIHY4aTE2IGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCBpbjRfciwgaW41X3I7CisgICAgdjhpMTYgaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2wsIGluNF9sLCBpbjVfbDsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjMoc3JjLCAxNiwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBMRF9TQjMoc3JjLCAxNiwgc3JjMywgc3JjNCwgc3JjNSk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBMRF9TQjMoc3JjLCAxNiwgc3JjNiwgc3JjNywgc3JjOCk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBMRF9TQjMoc3JjLCAxNiwgc3JjOSwgc3JjMTAsIHNyYzExKTsKKyAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CisKKyAgICAgICAgSUxWUl9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAorICAgICAgICAgICAgICAgICAgIGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yKTsKKyAgICAgICAgSUxWTF9CNF9TSCh6ZXJvLCBzcmMwLCB6ZXJvLCBzcmMxLCB6ZXJvLCBzcmMyLCB6ZXJvLCBzcmMzLAorICAgICAgICAgICAgICAgICAgIGluMF9sLCBpbjFfbCwgaW4yX2wsIGluM19sKTsKKyAgICAgICAgSUxWUl9CMl9TSCh6ZXJvLCBzcmM0LCB6ZXJvLCBzcmM1LCBpbjRfciwgaW41X3IpOworICAgICAgICBJTFZMX0IyX1NIKHplcm8sIHNyYzQsIHplcm8sIHNyYzUsIGluNF9sLCBpbjVfbCk7CisgICAgICAgIFNMTElfNFYoaW4wX3IsIGluMV9yLCBpbjJfciwgaW4zX3IsIDYpOworICAgICAgICBTTExJXzRWKGluMF9sLCBpbjFfbCwgaW4yX2wsIGluM19sLCA2KTsKKyAgICAgICAgU0xMSV80VihpbjRfciwgaW41X3IsIGluNF9sLCBpbjVfbCwgNik7CisgICAgICAgIFNUX1NINihpbjBfciwgaW4wX2wsIGluMV9yLCBpbjFfbCwgaW4yX3IsIGluMl9sLCBkc3QsIDgpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgICAgICAgU1RfU0g2KGluM19yLCBpbjNfbCwgaW40X3IsIGluNF9sLCBpbjVfciwgaW41X2wsIGRzdCwgOCk7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworCisgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjNiwgemVybywgc3JjNywgemVybywgc3JjOCwgemVybywgc3JjOSwKKyAgICAgICAgICAgICAgICAgICBpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfcik7CisgICAgICAgIElMVkxfQjRfU0goemVybywgc3JjNiwgemVybywgc3JjNywgemVybywgc3JjOCwgemVybywgc3JjOSwKKyAgICAgICAgICAgICAgICAgICBpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCk7CisgICAgICAgIElMVlJfQjJfU0goemVybywgc3JjMTAsIHplcm8sIHNyYzExLCBpbjRfciwgaW41X3IpOworICAgICAgICBJTFZMX0IyX1NIKHplcm8sIHNyYzEwLCB6ZXJvLCBzcmMxMSwgaW40X2wsIGluNV9sKTsKKyAgICAgICAgU0xMSV80VihpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfciwgNik7CisgICAgICAgIFNMTElfNFYoaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2wsIDYpOworICAgICAgICBTTExJXzRWKGluNF9yLCBpbjVfciwgaW40X2wsIGluNV9sLCA2KTsKKyAgICAgICAgU1RfU0g2KGluMF9yLCBpbjBfbCwgaW4xX3IsIGluMV9sLCBpbjJfciwgaW4yX2wsIGRzdCwgOCk7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTVF9TSDYoaW4zX3IsIGluM19sLCBpbjRfciwgaW40X2wsIGluNV9yLCBpbjVfbCwgZHN0LCA4KTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2NvcHlfNjR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19jb3B5XzE2bXVsdHg4bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwgNjQpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHY4aTE2IGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCBpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbDsKKworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjLCAxNiwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBMRF9TQjQoc3JjLCAxNiwgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworCisgICAgICAgIElMVlJfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKKyAgICAgICAgICAgICAgICAgICBpbjBfciwgaW4xX3IsIGluMl9yLCBpbjNfcik7CisgICAgICAgIElMVkxfQjRfU0goemVybywgc3JjMCwgemVybywgc3JjMSwgemVybywgc3JjMiwgemVybywgc3JjMywKKyAgICAgICAgICAgICAgICAgICBpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCk7CisgICAgICAgIFNMTElfNFYoaW4wX3IsIGluMV9yLCBpbjJfciwgaW4zX3IsIDYpOworICAgICAgICBTTExJXzRWKGluMF9sLCBpbjFfbCwgaW4yX2wsIGluM19sLCA2KTsKKyAgICAgICAgU1RfU0g0KGluMF9yLCBpbjBfbCwgaW4xX3IsIGluMV9sLCBkc3QsIDgpOworICAgICAgICBTVF9TSDQoaW4yX3IsIGluMl9sLCBpbjNfciwgaW4zX2wsIChkc3QgKyAzMiksIDgpOworICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKworICAgICAgICBJTFZSX0I0X1NIKHplcm8sIHNyYzQsIHplcm8sIHNyYzUsIHplcm8sIHNyYzYsIHplcm8sIHNyYzcsCisgICAgICAgICAgICAgICAgICAgaW4wX3IsIGluMV9yLCBpbjJfciwgaW4zX3IpOworICAgICAgICBJTFZMX0I0X1NIKHplcm8sIHNyYzQsIHplcm8sIHNyYzUsIHplcm8sIHNyYzYsIHplcm8sIHNyYzcsCisgICAgICAgICAgICAgICAgICAgaW4wX2wsIGluMV9sLCBpbjJfbCwgaW4zX2wpOworICAgICAgICBTTExJXzRWKGluMF9yLCBpbjFfciwgaW4yX3IsIGluM19yLCA2KTsKKyAgICAgICAgU0xMSV80VihpbjBfbCwgaW4xX2wsIGluMl9sLCBpbjNfbCwgNik7CisgICAgICAgIFNUX1NINChpbjBfciwgaW4wX2wsIGluMV9yLCBpbjFfbCwgZHN0LCA4KTsKKyAgICAgICAgU1RfU0g0KGluMl9yLCBpbjJfbCwgaW4zX3IsIGluM19sLCAoZHN0ICsgMzIpLCA4KTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h6Xzh0XzR3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKQEAgLTM0Nyw3ICs0NTYsNyBAQAogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKIAogICAgIHNyYyAtPSAzOwogICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CkBAIC00MDIsNyArNTExLDcgQEAKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKIAogICAgIHNyYyAtPSAzOwogICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CkBAIC00NTAsOCArNTU5LDc1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfaHpfOHRfOHdfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIGhlaWdodCk7Ci0gICAgaGV2Y19oel84dF80d19tc2Eoc3JjICsgOCwgc3JjX3N0cmlkZSwgZHN0ICsgOCwgZHN0X3N0cmlkZSwgZmlsdGVyLCBoZWlnaHQpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIGludDY0X3QgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHYxNmk4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OworICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKworICAgIHNyYyAtPSAzOworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjIDw8PSA2OworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CisgICAgU1BMQVRJX0g0X1NIKGZpbHRlcl92ZWMsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKKworICAgIG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CisgICAgbWFzazEgPSBtYXNrMCArIDI7CisgICAgbWFzazIgPSBtYXNrMCArIDQ7CisgICAgbWFzazMgPSBtYXNrMCArIDY7CisgICAgbWFzazQgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOworICAgIG1hc2s1ID0gbWFzazQgKyAyOworICAgIG1hc2s2ID0gbWFzazQgKyA0OworICAgIG1hc2s3ID0gbWFzazQgKyA2OworCisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBMRF9TQjQoc3JjICsgOCwgc3JjX3N0cmlkZSwgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKworICAgICAgICBkc3QwID0gY29uc3RfdmVjOworICAgICAgICBkc3QxID0gY29uc3RfdmVjOworICAgICAgICBkc3QyID0gY29uc3RfdmVjOworICAgICAgICBkc3QzID0gY29uc3RfdmVjOworICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOworICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrNCwgbWFzazQsIHZlYzQsIHZlYzUpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MCwgZHN0NCwgZHN0NSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2s1LCBtYXNrNSwgdmVjNCwgdmVjNSk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDEsIGZpbHQxLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgbWFzazYsIG1hc2s2LCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MiwgZmlsdDIsIGRzdDQsIGRzdDUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2szLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazMsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBtYXNrNywgbWFzazcsIHZlYzQsIHZlYzUpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQzLCBmaWx0MywgZHN0NCwgZHN0NSk7CisKKyAgICAgICAgcmVzMCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCkgZHN0NCwgMCk7CisgICAgICAgIHJlczEgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpIGRzdDQsIDEpOworICAgICAgICByZXMyID0gX19tc2FfY29weV9zX2QoKHYyaTY0KSBkc3Q1LCAwKTsKKyAgICAgICAgcmVzMyA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCkgZHN0NSwgMSk7CisgICAgICAgIFNUX1NINChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTRDQocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgKGRzdCArIDgpLCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h6Xzh0XzE2d19tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCkBAIC00NTksMTMgKzYzNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogCiAgICAgc3JjIC09IDM7CiAgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKQEAgLTQ3OCw1NiArNjU0LDM2IEBACiAgICAgbWFzazIgPSBtYXNrMCArIDQ7CiAgICAgbWFzazMgPSBtYXNrMCArIDY7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAyKTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMiwgc3JjNCwgc3JjNik7Ci0gICAgICAgIExEX1NCNChzcmMgKyA4LCBzcmNfc3RyaWRlLCBzcmMxLCBzcmMzLCBzcmM1LCBzcmM3KTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDEpOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMyKTsKKyAgICAgICAgTERfU0IyKHNyYyArIDgsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzMpOworICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAKLSAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCwgZHN0MCwgZHN0MCk7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEsIGRzdDEsIGRzdDEpOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QyLCBkc3QyLCBkc3QyLCBkc3QyKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0MywgZHN0Myk7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDQsIGRzdDQsIGRzdDQpOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwotICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q1LCBkc3Q1LCBkc3Q1LCBkc3Q1KTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0NiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NiwgZHN0NiwgZHN0NiwgZHN0Nik7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7Ci0gICAgICAgIGRzdDcgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDcsIGRzdDcsIGRzdDcsIGRzdDcpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzazEsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMzLCBzcmMzLCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMiwgbWFzazIsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzMsIHNyYzMsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBmaWx0MiwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2szLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazMsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGZpbHQzLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CiAKLSAgICAgICAgU1RfU0g0KGRzdDAsIGRzdDIsIGRzdDQsIGRzdDYsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIFNUX1NINChkc3QxLCBkc3QzLCBkc3Q1LCBkc3Q3LCBkc3QgKyA4LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIFNUX1NIMihkc3QwLCBkc3QyLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBTVF9TSDIoZHN0MSwgZHN0MywgZHN0ICsgOCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KIApAQCAtNTM5LDEwICs2OTUsMTAgQEAKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazMsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3OwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAKICAgICBzcmMgLT0gMzsKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyKTsKQEAgLTU2NiwzNiArNzIyLDM2IEBACiAgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKIAotICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QwID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QwLCBkc3QwLCBkc3QwKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMxLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MSwgZHN0MSwgZHN0MSk7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIsIGRzdDIpOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QzLCBkc3QzLCBkc3QzLCBkc3QzKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMzLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NCwgZHN0NCwgZHN0NCk7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDUgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDUsIGRzdDUsIGRzdDUsIGRzdDUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2swLCBtYXNrNCwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2swLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrNCwgbWFzazAsIHZlYzQsIHZlYzUpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MCwgZHN0NCwgZHN0NSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazEsIG1hc2s1LCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMyLCBzcmMyLCBtYXNrMSwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2s1LCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDEsIGZpbHQxLCBkc3Q0LCBkc3Q1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazYsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzIsIHNyYzIsIG1hc2syLCBtYXNrMiwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMywgc3JjMywgc3JjMywgbWFzazYsIG1hc2syLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MiwgZmlsdDIsIGRzdDQsIGRzdDUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2szLCBtYXNrNywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazMsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrNywgbWFzazMsIHZlYzQsIHZlYzUpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQzLCBmaWx0MywgZHN0NCwgZHN0NSk7CiAKICAgICAgICAgU1RfU0gyKGRzdDAsIGRzdDEsIGRzdCwgOCk7CiAgICAgICAgIFNUX1NIKGRzdDIsIGRzdCArIDE2KTsKQEAgLTYxNyw3ICs3NzMsNyBAQAogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogCiAgICAgc3JjIC09IDM7CiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CkBAIC02NzQsMTAgKzgzMCwxMCBAQAogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazc7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKIAogICAgIHNyYyAtPSAzOwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXIpOwpAQCAtNzAwLDM4ICs4NTYsMzkgQEAKICAgICAgICAgc3JjICs9IHNyY19zdHJpZGU7CiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogCi0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDAsIGRzdDAsIGRzdDApOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzEsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QxLCBkc3QxLCBkc3QxKTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0MiwgZHN0MiwgZHN0MiwgZHN0Mik7Ci0gICAgICAgIFZTSEZfQjRfU0Ioc3JjMSwgc3JjMiwgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazcsCi0gICAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKLSAgICAgICAgICAgICAgICAgICAgIGRzdDMsIGRzdDMsIGRzdDMsIGRzdDMpOwotICAgICAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwogICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q0LCBkc3Q0LCBkc3Q0LCBkc3Q0KTsKLSAgICAgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKLSAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAotICAgICAgICAgICAgICAgICAgICAgZHN0NSwgZHN0NSwgZHN0NSwgZHN0NSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazAsIG1hc2s0LCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMyLCBtYXNrMCwgbWFzazQsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMSwgbWFzazUsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzIsIG1hc2sxLCBtYXNrNSwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBmaWx0MSwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2syLCBtYXNrNiwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMiwgbWFzazIsIG1hc2s2LCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQyLCBmaWx0MiwgZmlsdDIsIGZpbHQyLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMSwgbWFzazMsIG1hc2s3LCB2ZWMwLCB2ZWMxKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMyLCBtYXNrMywgbWFzazcsIHZlYzIsIHZlYzMpOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDMsIGZpbHQzLCBmaWx0MywgZmlsdDMsIGRzdDAsCisgICAgICAgICAgICAgICAgICAgICBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgU1RfU0g0KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdCwgOCk7CiAKLSAgICAgICAgU1RfU0g2KGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdCwgOCk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazAsIG1hc2swLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MCwgZHN0NCwgZHN0NSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazEsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQxLCBmaWx0MSwgZHN0NCwgZHN0NSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazIsIG1hc2syLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQyLCBmaWx0MiwgZHN0NCwgZHN0NSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMywgc3JjMywgbWFzazMsIG1hc2szLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQzLCBmaWx0MywgZHN0NCwgZHN0NSk7CisgICAgICAgIFNUX1NIMihkc3Q0LCBkc3Q1LCAoZHN0ICsgMzIpLCA4KTsKICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CiAgICAgfQogfQpAQCAtNzQ3LDcgKzkwNCw3IEBACiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMzsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAKICAgICBzcmMgLT0gMzsKIApAQCAtMTIwNiwzMSArMTM2MywyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjODsKKyAgICBpbnQzMl90IGRzdF9zdHJpZGVfaW5fYnl0ZXMgPSAyICogZHN0X3N0cmlkZTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDM7CiAgICAgdjE2aTggbWFzazEsIG1hc2syLCBtYXNrMzsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKICAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OwotICAgIHY4aTE2IGRzdDMwLCBkc3Q0MSwgZHN0NTIsIGRzdDYzLCBkc3Q2NiwgZHN0ODc7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QxX3I7Ci0gICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKLSAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yOwotICAgIHYxNmk4IG1hc2swID0gewotICAgICAgICAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAKLSAgICB9OwotICAgIHY4dTE2IG1hc2s0ID0geyAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IH07CisgICAgdjhpMTYgZHN0MzAsIGRzdDQxLCBkc3Q1MiwgZHN0NjMsIGRzdDY2LCBkc3Q5NywgZHN0MTA4OworICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKKyAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLCBkc3Q5OF9yOworICAgIHY4aTE2IGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsIGRzdDEwOV9yOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKIAogICAgIHNyYyAtPSAoKDMgKiBzcmNfc3RyaWRlKSArIDMpOwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeCk7CiAgICAgU1BMQVRJX0g0X1NIKGZpbHRlcl92ZWMsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XNF9TVyhmaWx0ZXJfdmVjLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICBTUExBVElfVzRfU0goZmlsdGVyX3ZlYywgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKICAgICBtYXNrMiA9IG1hc2swICsgNDsKQEAgLTEyNjIsNDcgKzE0MTYsNTYgQEAKICAgICBEUEFERF9TQjRfU0godmVjMTIsIHZlYzEzLCB2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAogICAgICAgICAgICAgICAgICBkc3Q2MywgZHN0NjMsIGRzdDYzLCBkc3Q2Myk7CiAKLSAgICBJTFZSX0gzX1NIKGRzdDQxLCBkc3QzMCwgZHN0NTIsIGRzdDQxLCBkc3Q2MywgZHN0NTIsCi0gICAgICAgICAgICAgICBkc3QxMF9yLCBkc3QyMV9yLCBkc3QzMl9yKTsKLSAgICBkc3Q0M19yID0gX19tc2FfaWx2bF9oKGRzdDQxLCBkc3QzMCk7Ci0gICAgZHN0NTRfciA9IF9fbXNhX2lsdmxfaChkc3Q1MiwgZHN0NDEpOwotICAgIGRzdDY1X3IgPSBfX21zYV9pbHZsX2goZHN0NjMsIGRzdDUyKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q0MSwgZHN0MzAsIGRzdDEwX3IsIGRzdDQzX3IpOworICAgIElMVlJMX0gyX1NIKGRzdDUyLCBkc3Q0MSwgZHN0MjFfciwgZHN0NTRfcik7CisgICAgSUxWUkxfSDJfU0goZHN0NjMsIGRzdDUyLCBkc3QzMl9yLCBkc3Q2NV9yKTsKICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q2MywgMSk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDE7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgpOwotICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNywgc3JjOCk7CisgICAgZm9yIChsb29wX2NudCA9IGhlaWdodCA+PiAyOyBsb29wX2NudC0tOykgeworICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CisgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CiAKLSAgICAgICAgVlNIRl9CNF9TQihzcmM3LCBzcmM4LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKKyAgICAgICAgVlNIRl9CNF9TQihzcmM3LCBzcmM5LCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywKICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgZHN0ODcgPSBjb25zdF92ZWM7CisgICAgICAgIFZTSEZfQjRfU0Ioc3JjOCwgc3JjMTAsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAorICAgICAgICAgICAgICAgICAgIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgICAgICBkc3Q5NyA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0MTA4ID0gY29uc3RfdmVjOwogICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICBkc3Q4NywgZHN0ODcsIGRzdDg3LCBkc3Q4Nyk7Ci0gICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0ODcsIGRzdDY2KTsKKyAgICAgICAgICAgICAgICAgICAgIGRzdDk3LCBkc3Q5NywgZHN0OTcsIGRzdDk3KTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLAorICAgICAgICAgICAgICAgICAgICAgZHN0MTA4LCBkc3QxMDgsIGRzdDEwOCwgZHN0MTA4KTsKKworICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDk3LCBkc3Q2Nik7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEwOCwgZHN0OTcsIGRzdDg3X3IsIGRzdDEwOV9yKTsKKyAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0OTcsIDEpOworICAgICAgICBkc3Q5OF9yID0gX19tc2FfaWx2cl9oKGRzdDY2LCBkc3QxMDgpOworCiAgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF84VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwotICAgICAgICBkc3Q4N19yID0gX19tc2FfdnNoZl9oKCh2OGkxNikgbWFzazQsIGRzdDg3LCBkc3Q4Nyk7CiAgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF84VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOwotICAgICAgICBkc3QwX3IgPj49IDY7Ci0gICAgICAgIGRzdDFfciA+Pj0gNjsKKyAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZHN0OThfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF84VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsIGRzdDEwOV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgU1JBXzRWKGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgNik7CisgICAgICAgIFBDS0VWX0gyX1NXKGRzdDFfciwgZHN0MF9yLCBkc3QzX3IsIGRzdDJfciwgZHN0MF9yLCBkc3QyX3IpOworICAgICAgICBTVDh4NF9VQihkc3QwX3IsIGRzdDJfciwgZHN0LCBkc3Rfc3RyaWRlX2luX2J5dGVzKTsKKyAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgZHN0MF9yID0gKHY0aTMyKSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MV9yLCAodjhpMTYpIGRzdDBfcik7Ci0gICAgICAgIFNUOHgyX1VCKGRzdDBfciwgZHN0LCAoMiAqIGRzdF9zdHJpZGUpKTsKLSAgICAgICAgZHN0ICs9ICgyICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgZHN0MTBfciA9IGRzdDMyX3I7Ci0gICAgICAgIGRzdDMyX3IgPSBkc3Q1NF9yOwotICAgICAgICBkc3Q1NF9yID0gZHN0NzZfcjsKLSAgICAgICAgZHN0MjFfciA9IGRzdDQzX3I7Ci0gICAgICAgIGRzdDQzX3IgPSBkc3Q2NV9yOwotICAgICAgICBkc3Q2NV9yID0gZHN0ODdfcjsKLSAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0ODcsIDEpOworICAgICAgICBkc3QxMF9yID0gZHN0NTRfcjsKKyAgICAgICAgZHN0MzJfciA9IGRzdDc2X3I7CisgICAgICAgIGRzdDU0X3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QyMV9yID0gZHN0NjVfcjsKKyAgICAgICAgZHN0NDNfciA9IGRzdDg3X3I7CisgICAgICAgIGRzdDY1X3IgPSBkc3QxMDlfcjsKKyAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MTA4LCAxKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGhldmNfaHZfOHRfOG11bHR4Mm11bHRfbXNhKHVpbnQ4X3QgKnNyYywKK3N0YXRpYyB2b2lkIGhldmNfaHZfOHRfOG11bHR4MW11bHRfbXNhKHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKQEAgLTEzMTMsMTkgKzE0NzYsMTcgQEAKICAgICB1aW50MzJfdCBsb29wX2NudCwgY250OwogICAgIHVpbnQ4X3QgKnNyY190bXA7CiAgICAgaW50MTZfdCAqZHN0X3RtcDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMzsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CiAgICAgdjE2aTggdmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNTsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBkc3Q4OworICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CiAgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2w7CiAgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfcjsKICAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3Q3Nl9sOwotICAgIHY4aTE2IGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3I7Ci0gICAgdjhpMTYgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbCwgZHN0ODdfbDsKICAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OwogCiAgICAgc3JjIC09ICgoMyAqIHNyY19zdHJpZGUpICsgMyk7CkBAIC0xMzMzLDEwICsxNDk0LDkgQEAKICAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1c0X1NXKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgIFNQTEFUSV9XNF9TSChmaWx0ZXJfdmVjLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogICAgIG1hc2syID0gbWFzazAgKyA0OwpAQCAtMTM5MiwxNyArMTU1MiwxMCBAQAogICAgICAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKICAgICAgICAgICAgICAgICAgICAgIGRzdDYsIGRzdDYsIGRzdDYsIGRzdDYpOwogCi0gICAgICAgIElMVlJfSDRfU0goZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0MiwgZHN0MSwKLSAgICAgICAgICAgICAgICAgICBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3QyMV9yKTsKLSAgICAgICAgSUxWUl9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q2LCBkc3Q1LCBkc3Q0M19yLCBkc3Q2NV9yKTsKLSAgICAgICAgSUxWTF9INF9TSChkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3QyLCBkc3QxLAotICAgICAgICAgICAgICAgICAgIGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDIxX2wpOwotICAgICAgICBJTFZMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDYsIGRzdDUsIGRzdDQzX2wsIGRzdDY1X2wpOwotCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSBoZWlnaHQgPj4gMTsgbG9vcF9jbnQtLTspIHsKLSAgICAgICAgICAgIExEX1NCMihzcmNfdG1wLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4KTsKLSAgICAgICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzcsIHNyYzgpOwotICAgICAgICAgICAgc3JjX3RtcCArPSAyICogc3JjX3N0cmlkZTsKKyAgICAgICAgZm9yIChsb29wX2NudCA9IGhlaWdodDsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgICAgIHNyYzcgPSBMRF9TQihzcmNfdG1wKTsKKyAgICAgICAgICAgIHNyYzcgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzcsIDEyOCk7CisgICAgICAgICAgICBzcmNfdG1wICs9IHNyY19zdHJpZGU7CiAKICAgICAgICAgICAgIFZTSEZfQjRfU0Ioc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwpAQCAtMTQxMCw2ICsxNTYzLDkgQEAKICAgICAgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywKICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Q3LCBkc3Q3LCBkc3Q3LCBkc3Q3KTsKIAorICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBkc3QyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOwogICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NywgZHN0NiwgZHN0NzZfciwgZHN0NzZfbCk7CiAgICAgICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CkBAIC0xNDIyLDM3ICsxNTc4LDEzIEBACiAgICAgICAgICAgICBTVF9TVyhkc3QwX3IsIGRzdF90bXApOwogICAgICAgICAgICAgZHN0X3RtcCArPSBkc3Rfc3RyaWRlOwogCi0gICAgICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAotICAgICAgICAgICAgICAgICAgICAgICB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKLSAgICAgICAgICAgIGRzdDggPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0OCwgZHN0OCwgZHN0OCwgZHN0OCk7Ci0KLSAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOwotICAgICAgICAgICAgZHN0NiA9IGRzdDg7Ci0gICAgICAgICAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7Ci0gICAgICAgICAgICBkc3QwX2wgPSBIRVZDX0ZJTFRfOFRBUChkc3QyMV9sLCBkc3Q0M19sLCBkc3Q2NV9sLCBkc3Q4N19sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMCwgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7Ci0gICAgICAgICAgICBkc3QwX3IgPj49IDY7Ci0gICAgICAgICAgICBkc3QwX2wgPj49IDY7Ci0KLSAgICAgICAgICAgIGRzdDBfciA9ICh2NGkzMikgX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDBfbCwgKHY4aTE2KSBkc3QwX3IpOwotICAgICAgICAgICAgU1RfU1coZHN0MF9yLCBkc3RfdG1wKTsKLSAgICAgICAgICAgIGRzdF90bXAgKz0gZHN0X3N0cmlkZTsKLQotICAgICAgICAgICAgZHN0MTBfciA9IGRzdDMyX3I7Ci0gICAgICAgICAgICBkc3QzMl9yID0gZHN0NTRfcjsKLSAgICAgICAgICAgIGRzdDU0X3IgPSBkc3Q3Nl9yOwotICAgICAgICAgICAgZHN0MTBfbCA9IGRzdDMyX2w7Ci0gICAgICAgICAgICBkc3QzMl9sID0gZHN0NTRfbDsKLSAgICAgICAgICAgIGRzdDU0X2wgPSBkc3Q3Nl9sOwotICAgICAgICAgICAgZHN0MjFfciA9IGRzdDQzX3I7Ci0gICAgICAgICAgICBkc3Q0M19yID0gZHN0NjVfcjsKLSAgICAgICAgICAgIGRzdDY1X3IgPSBkc3Q4N19yOwotICAgICAgICAgICAgZHN0MjFfbCA9IGRzdDQzX2w7Ci0gICAgICAgICAgICBkc3Q0M19sID0gZHN0NjVfbDsKLSAgICAgICAgICAgIGRzdDY1X2wgPSBkc3Q4N19sOworICAgICAgICAgICAgZHN0MCA9IGRzdDE7CisgICAgICAgICAgICBkc3QxID0gZHN0MjsKKyAgICAgICAgICAgIGRzdDIgPSBkc3QzOworICAgICAgICAgICAgZHN0MyA9IGRzdDQ7CisgICAgICAgICAgICBkc3Q0ID0gZHN0NTsKKyAgICAgICAgICAgIGRzdDUgPSBkc3Q2OworICAgICAgICAgICAgZHN0NiA9IGRzdDc7CiAgICAgICAgIH0KIAogICAgICAgICBzcmMgKz0gODsKQEAgLTE0NjUsNyArMTU5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LCBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19odl84dF84bXVsdHgybXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgaGV2Y19odl84dF84bXVsdHgxbXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDgpOwogfQogCkBAIC0xNDc0LDExICsxNjA2LDE5NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19odl84dF84bXVsdHgybXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDgpOworICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIGludDMyX3QgZHN0X3N0cmlkZV9pbl9ieXRlcyA9IDIgKiBkc3Rfc3RyaWRlOworICAgIHVpbnQ4X3QgKnNyY190bXA7CisgICAgaW50MTZfdCAqZHN0X3RtcDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKKyAgICB2MTZpOCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgbWFzazQsIG1hc2s1LCBtYXNrNiwgbWFzazc7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2MTZpOCB2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1OworICAgIHY4aTE2IGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzOworICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworICAgIHY4aTE2IGRzdDMwLCBkc3Q0MSwgZHN0NTIsIGRzdDYzLCBkc3Q2NiwgZHN0OTcsIGRzdDEwODsKKyAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLCBkc3Q5OF9yLCBkc3QyMV9yLCBkc3Q0M19yOworICAgIHY4aTE2IGRzdDY1X3IsIGRzdDg3X3IsIGRzdDEwOV9yLCBkc3QxMF9sLCBkc3QzMl9sLCBkc3Q1NF9sLCBkc3Q3Nl9sOworICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yOwogCi0gICAgaGV2Y19odl84dF80d19tc2Eoc3JjICsgOCwgc3JjX3N0cmlkZSwgZHN0ICsgOCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCk7CisgICAgc3JjIC09ICgoMyAqIHNyY19zdHJpZGUpICsgMyk7CisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKKyAgICBTUExBVElfSDRfU0goZmlsdGVyX3ZlYywgMCwgMSwgMiwgMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOworCisgICAgU1BMQVRJX1c0X1NIKGZpbHRlcl92ZWMsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworCisgICAgbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKKyAgICBtYXNrMSA9IG1hc2swICsgMjsKKyAgICBtYXNrMiA9IG1hc2swICsgNDsKKyAgICBtYXNrMyA9IG1hc2swICsgNjsKKworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjIDw8PSA2OworCisgICAgc3JjX3RtcCA9IHNyYzsKKyAgICBkc3RfdG1wID0gZHN0OworCisgICAgTERfU0I3KHNyY190bXAsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgIHNyY190bXAgKz0gKDcgKiBzcmNfc3RyaWRlKTsKKyAgICBYT1JJX0I3XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKworICAgIC8qIHJvdyAwIHJvdyAxIHJvdyAyIHJvdyAzICovCisgICAgVlNIRl9CNF9TQihzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CNF9TQihzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNyk7CisgICAgVlNIRl9CNF9TQihzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjOCwgdmVjOSwgdmVjMTAsCisgICAgICAgICAgICAgICB2ZWMxMSk7CisgICAgVlNIRl9CNF9TQihzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdmVjMTIsIHZlYzEzLCB2ZWMxNCwKKyAgICAgICAgICAgICAgIHZlYzE1KTsKKyAgICBkc3QwID0gY29uc3RfdmVjOworICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0MCwgZHN0MCwKKyAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MCk7CisgICAgZHN0MSA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIGRzdDEsIGRzdDEsCisgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDEpOworICAgIGRzdDIgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0I0X1NIKHZlYzgsIHZlYzksIHZlYzEwLCB2ZWMxMSwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIGRzdDIsCisgICAgICAgICAgICAgICAgIGRzdDIsIGRzdDIsIGRzdDIpOworICAgIGRzdDMgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0I0X1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0MywKKyAgICAgICAgICAgICAgICAgZHN0MywgZHN0MywgZHN0Myk7CisKKyAgICAvKiByb3cgNCByb3cgNSByb3cgNiAqLworICAgIFZTSEZfQjRfU0Ioc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjRfU0Ioc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjRfU0Ioc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIHZlYzgsIHZlYzksIHZlYzEwLAorICAgICAgICAgICAgICAgdmVjMTEpOworICAgIGRzdDQgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBkc3Q0LCBkc3Q0LAorICAgICAgICAgICAgICAgICBkc3Q0LCBkc3Q0KTsKKyAgICBkc3Q1ID0gY29uc3RfdmVjOworICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0NSwgZHN0NSwKKyAgICAgICAgICAgICAgICAgZHN0NSwgZHN0NSk7CisgICAgZHN0NiA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjRfU0godmVjOCwgdmVjOSwgdmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0NiwKKyAgICAgICAgICAgICAgICAgZHN0NiwgZHN0NiwgZHN0Nik7CisKKyAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0OyBsb29wX2NudC0tOykgeworICAgICAgICBzcmM3ID0gTERfU0Ioc3JjX3RtcCk7CisgICAgICAgIHNyYzcgPSAodjE2aTgpIF9fbXNhX3hvcmlfYigodjE2dTgpIHNyYzcsIDEyOCk7CisgICAgICAgIHNyY190bXAgKz0gc3JjX3N0cmlkZTsKKworICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBkc3Q3ID0gY29uc3RfdmVjOworICAgICAgICBEUEFERF9TQjRfU0godmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIGRzdDcsCisgICAgICAgICAgICAgICAgICAgICBkc3Q3LCBkc3Q3LCBkc3Q3KTsKKworICAgICAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q3LCBkc3Q2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF84VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDc2X2wsIGZpbHRfaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QwX3IgPj49IDY7CisgICAgICAgIGRzdDBfbCA+Pj0gNjsKKworICAgICAgICBkc3QwX3IgPSAodjRpMzIpIF9fbXNhX3Bja2V2X2goKHY4aTE2KSBkc3QwX2wsICh2OGkxNikgZHN0MF9yKTsKKyAgICAgICAgU1RfU1coZHN0MF9yLCBkc3RfdG1wKTsKKyAgICAgICAgZHN0X3RtcCArPSBkc3Rfc3RyaWRlOworCisgICAgICAgIGRzdDAgPSBkc3QxOworICAgICAgICBkc3QxID0gZHN0MjsKKyAgICAgICAgZHN0MiA9IGRzdDM7CisgICAgICAgIGRzdDMgPSBkc3Q0OworICAgICAgICBkc3Q0ID0gZHN0NTsKKyAgICAgICAgZHN0NSA9IGRzdDY7CisgICAgICAgIGRzdDYgPSBkc3Q3OworICAgIH0KKworICAgIHNyYyArPSA4OworICAgIGRzdCArPSA4OworCisgICAgbWFzazQgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOworICAgIG1hc2s1ID0gbWFzazQgKyAyOworICAgIG1hc2s2ID0gbWFzazQgKyA0OworICAgIG1hc2s3ID0gbWFzazQgKyA2OworCisgICAgTERfU0I3KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgc3JjICs9ICg3ICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisKKyAgICBWU0hGX0I0X1NCKHNyYzAsIHNyYzMsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0I0X1NCKHNyYzEsIHNyYzQsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3KTsKKyAgICBWU0hGX0I0X1NCKHNyYzIsIHNyYzUsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWM4LCB2ZWM5LCB2ZWMxMCwKKyAgICAgICAgICAgICAgIHZlYzExKTsKKyAgICBWU0hGX0I0X1NCKHNyYzMsIHNyYzYsIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMxMiwgdmVjMTMsIHZlYzE0LAorICAgICAgICAgICAgICAgdmVjMTUpOworICAgIGRzdDMwID0gY29uc3RfdmVjOworICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0MzAsCisgICAgICAgICAgICAgICAgIGRzdDMwLCBkc3QzMCwgZHN0MzApOworICAgIGRzdDQxID0gY29uc3RfdmVjOworICAgIERQQUREX1NCNF9TSCh2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0NDEsCisgICAgICAgICAgICAgICAgIGRzdDQxLCBkc3Q0MSwgZHN0NDEpOworICAgIGRzdDUyID0gY29uc3RfdmVjOworICAgIERQQUREX1NCNF9TSCh2ZWM4LCB2ZWM5LCB2ZWMxMCwgdmVjMTEsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBkc3Q1MiwKKyAgICAgICAgICAgICAgICAgZHN0NTIsIGRzdDUyLCBkc3Q1Mik7CisgICAgZHN0NjMgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0I0X1NIKHZlYzEyLCB2ZWMxMywgdmVjMTQsIHZlYzE1LCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MywgZHN0NjMsCisgICAgICAgICAgICAgICAgIGRzdDYzLCBkc3Q2MywgZHN0NjMpOworCisgICAgSUxWUkxfSDJfU0goZHN0NDEsIGRzdDMwLCBkc3QxMF9yLCBkc3Q0M19yKTsKKyAgICBJTFZSTF9IMl9TSChkc3Q1MiwgZHN0NDEsIGRzdDIxX3IsIGRzdDU0X3IpOworICAgIElMVlJMX0gyX1NIKGRzdDYzLCBkc3Q1MiwgZHN0MzJfciwgZHN0NjVfcik7CisKKyAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q2MywgMSk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDI7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKworICAgICAgICBWU0hGX0I0X1NCKHNyYzcsIHNyYzksIG1hc2s0LCBtYXNrNSwgbWFzazYsIG1hc2s3LCB2ZWMwLCB2ZWMxLCB2ZWMyLAorICAgICAgICAgICAgICAgICAgIHZlYzMpOworICAgICAgICBWU0hGX0I0X1NCKHNyYzgsIHNyYzEwLCBtYXNrNCwgbWFzazUsIG1hc2s2LCBtYXNrNywgdmVjNCwgdmVjNSwgdmVjNiwKKyAgICAgICAgICAgICAgICAgICB2ZWM3KTsKKyAgICAgICAgZHN0OTcgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDEwOCA9IGNvbnN0X3ZlYzsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBkc3Q5NywKKyAgICAgICAgICAgICAgICAgICAgIGRzdDk3LCBkc3Q5NywgZHN0OTcpOworICAgICAgICBEUEFERF9TQjRfU0godmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIGRzdDEwOCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEwOCwgZHN0MTA4LCBkc3QxMDgpOworCisgICAgICAgIGRzdDc2X3IgPSBfX21zYV9pbHZyX2goZHN0OTcsIGRzdDY2KTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MTA4LCBkc3Q5NywgZHN0ODdfciwgZHN0MTA5X3IpOworICAgICAgICBkc3Q2NiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3Q5NywgMSk7CisgICAgICAgIGRzdDk4X3IgPSBfX21zYV9pbHZyX2goZHN0NjYsIGRzdDEwOCk7CisKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzhUQVAoZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZmlsdF9oMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oMSwgZmlsdF9oMiwgZmlsdF9oMyk7CisgICAgICAgIGRzdDFfciA9IEhFVkNfRklMVF84VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfOFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yLCBkc3Q5OF9yLCBmaWx0X2gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0X2gxLCBmaWx0X2gyLCBmaWx0X2gzKTsKKyAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzhUQVAoZHN0NDNfciwgZHN0NjVfciwgZHN0ODdfciwgZHN0MTA5X3IsIGZpbHRfaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaDEsIGZpbHRfaDIsIGZpbHRfaDMpOworICAgICAgICBTUkFfNFYoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKKyAgICAgICAgUENLRVZfSDJfU1coZHN0MV9yLCBkc3QwX3IsIGRzdDNfciwgZHN0Ml9yLCBkc3QwX3IsIGRzdDJfcik7CisgICAgICAgIFNUOHg0X1VCKGRzdDBfciwgZHN0Ml9yLCBkc3QsIGRzdF9zdHJpZGVfaW5fYnl0ZXMpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKworICAgICAgICBkc3QxMF9yID0gZHN0NTRfcjsKKyAgICAgICAgZHN0MzJfciA9IGRzdDc2X3I7CisgICAgICAgIGRzdDU0X3IgPSBkc3Q5OF9yOworICAgICAgICBkc3QyMV9yID0gZHN0NjVfcjsKKyAgICAgICAgZHN0NDNfciA9IGRzdDg3X3I7CisgICAgICAgIGRzdDY1X3IgPSBkc3QxMDlfcjsKKyAgICAgICAgZHN0NjYgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MTA4LCAxKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfOHRfMTZ3X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKQEAgLTE0ODYsNyArMTgwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2Xzh0XzhtdWx0eDJtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICBoZXZjX2h2Xzh0XzhtdWx0eDFtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgMTYpOwogfQogCkBAIC0xNDk1LDcgKzE4MTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19odl84dF84bXVsdHgybXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgaGV2Y19odl84dF84bXVsdHgxbXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDI0KTsKIH0KIApAQCAtMTUwNCw3ICsxODIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LCBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfaHZfOHRfOG11bHR4Mm11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAorICAgIGhldmNfaHZfOHRfOG11bHR4MW11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCAzMik7CiB9CiAKQEAgLTE1MTMsNyArMTgyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2Xzh0XzhtdWx0eDJtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICBoZXZjX2h2Xzh0XzhtdWx0eDFtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgNDgpOwogfQogCkBAIC0xNTIyLDcgKzE4MzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaGV2Y19odl84dF84bXVsdHgybXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgaGV2Y19odl84dF84bXVsdHgxbXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDY0KTsKIH0KIApAQCAtMTUzNyw3ICsxODUzLDcgQEAKICAgICB2MTZpOCBtYXNrMSwgdmVjMCwgdmVjMTsKICAgICB2OGkxNiBkc3QwOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwIH07CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOwogCiAgICAgc3JjIC09IDE7CiAKQEAgLTE1NzAsNyArMTg4Niw3IEBACiAgICAgdjE2aTggbWFzazEsIHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgZHN0MCwgZHN0MTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKIAogICAgIHNyYyAtPSAxOwogCkBAIC0xNjA5LDcgKzE5MjUsNyBAQAogICAgIHYxNmk4IG1hc2sxLCB2ZWMwLCB2ZWMxOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAgfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAKICAgICBzcmMgLT0gMTsKIApAQCAtMTY3NCw3ICsxOTkwLDcgQEAKICAgICB1aW50MzJfdCBkc3RfdmFsX2ludDAsIGRzdF92YWxfaW50MSwgZHN0X3ZhbF9pbnQyLCBkc3RfdmFsX2ludDM7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzM7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHYxNmk4IHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwpAQCAtMTY4OSw3ICsyMDA1LDcgQEAKICAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgeworICAgIGZvciAobG9vcF9jbnQgPSAyOyBsb29wX2NudC0tOykgewogICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CiAKQEAgLTE3NDMsNyArMjA1OSw3IEBACiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QxOwogICAgIHYxNmk4IHNyYzAsIHNyYzE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHYxNmk4IHZlYzAsIHZlYzE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwpAQCAtMTc4Nyw3ICsyMTAzLDcgQEAKICAgICB1aW50MzJfdCBsb29wX2NudDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjE2aTggdmVjMCwgdmVjMTsKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwpAQCAtMTg2MSw3ICsyMTc3LDcgQEAKICAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1OwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKICAgICB2MTZpOCBtYXNrMzsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazIgPSB7CiAgICAgICAgIDgsIDksIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsIDI4CiAgICAgfTsKQEAgLTE5MTgsNyArMjIzNCw3IEBACiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKICAgICB2MTZpOCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxOwpAQCAtMTk5MCw3ICsyMzA2LDcgQEAKICAgICBpbnQxNl90ICpkc3RfdG1wID0gZHN0ICsgMTY7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMDAsIG1hc2sxMTsKICAgICB2MTZpOCB2ZWMwLCB2ZWMxOwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CkBAIC0yMDkwLDEwICsyNDA2LDEwIEBACiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxLCBtYXNrMiwgbWFzazM7CiAgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogCiAgICAgc3JjIC09IDE7CkBAIC0yMTA4LDU0ICsyNDI0LDI1IEBACiAgICAgbWFzazIgPSBtYXNrMCArIDg7CiAgICAgbWFzazMgPSBtYXNrMCArIDEwOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMSk7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IGhlaWdodDsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfU0IyKHNyYywgMTYsIHNyYzAsIHNyYzEpOwogICAgICAgICBzcmMyID0gTERfU0Ioc3JjICsgMjQpOwogICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKIAogICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMSwgc3JjMCwgc3JjMSwgbWFzazIsIG1hc2szLCB2ZWMwLCB2ZWMxKTsKICAgICAgICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgICAgICBkc3QyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CiAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotCi0gICAgICAgIFNUX1NINChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIDgpOwotICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLQotICAgICAgICBMRF9TQjIoc3JjLCAxNiwgc3JjMCwgc3JjMSk7Ci0gICAgICAgIHNyYzIgPSBMRF9TQihzcmMgKyAyNCk7Ci0gICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotCi0gICAgICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMCwgc3JjMCwgc3JjMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QxID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7Ci0KKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMxLCBtYXNrMCwgbWFzazIsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMCwgdmVjMiwgdmVjMyk7CisgICAgICAgIERQQUREX1NCNF9TSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzEsIG1hc2sxLCBtYXNrMywgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMiwgc3JjMiwgbWFzazEsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgRFBBRERfU0I0X1NIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQxLCBmaWx0MSwgZmlsdDEsIGZpbHQxLCBkc3QwLAorICAgICAgICAgICAgICAgICAgICAgZHN0MSwgZHN0MiwgZHN0Myk7CiAgICAgICAgIFNUX1NINChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIDgpOwogICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKICAgICB9CkBAIC0yMjMxLDE4ICsyNTE4LDE3IEBACiAgICAgU1Q4eDRfVUIoZHN0MTAsIGRzdDMyLCBkc3QsIDIgKiBkc3Rfc3RyaWRlKTsKIH0KIAotc3RhdGljIHZvaWQgaGV2Y192dF80dF80eDhtdWx0aXBsZV9tc2EodWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKK3N0YXRpYyB2b2lkIGhldmNfdnRfNHRfNHg4X21zYSh1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7Ci0gICAgaW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5OworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzU0X3IsIHNyYzc2X3IsIHNyYzk4X3I7CiAgICAgdjE2aTggc3JjMjFfciwgc3JjNDNfciwgc3JjNjVfciwgc3JjODdfciwgc3JjMTA5X3I7Ci0gICAgdjE2aTggc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NjsKKyAgICB2MTZpOCBzcmMyMTEwLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5ODsKICAgICB2OGkxNiBkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3Q3NjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwpAQCAtMjI2MSwzNSArMjU0Nyw5NiBAQAogICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzIxX3IsICh2Mmk2NCkgc3JjMTBfcik7CiAgICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjMjExMCwgMTI4KTsKIAotICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDMpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjYoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKLSAgICAgICAgc3JjICs9ICg2ICogc3JjX3N0cmlkZSk7CisgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOworICAgIElMVlJfQjRfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwKKyAgICAgICAgICAgICAgIHNyYzMyX3IsIHNyYzQzX3IsIHNyYzU0X3IsIHNyYzY1X3IpOworICAgIElMVlJfQjRfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksCisgICAgICAgICAgICAgICBzcmM3Nl9yLCBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfcik7CisgICAgSUxWUl9ENF9TQihzcmM0M19yLCBzcmMzMl9yLCBzcmM2NV9yLCBzcmM1NF9yLCBzcmM4N19yLCBzcmM3Nl9yLCBzcmMxMDlfciwKKyAgICAgICAgICAgICAgIHNyYzk4X3IsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5OCk7CisgICAgZHN0MTAgPSBjb25zdF92ZWM7CisgICAgZHN0MzIgPSBjb25zdF92ZWM7CisgICAgZHN0NTQgPSBjb25zdF92ZWM7CisgICAgZHN0NzYgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSwgZHN0MTAsIGRzdDEwKTsKKyAgICBEUEFERF9TQjJfU0goc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBkc3QzMiwgZHN0MzIpOworICAgIERQQUREX1NCMl9TSChzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGRzdDU0LCBkc3Q1NCk7CisgICAgRFBBRERfU0IyX1NIKHNyYzg3NzYsIHNyYzEwOTk4LCBmaWx0MCwgZmlsdDEsIGRzdDc2LCBkc3Q3Nik7CisgICAgU1Q4eDhfVUIoZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYsIGRzdCwgMiAqIGRzdF9zdHJpZGUpOworICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworfQogCi0gICAgICAgIElMVlJfQjRfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwKLSAgICAgICAgICAgICAgICAgICBzcmMzMl9yLCBzcmM0M19yLCBzcmM1NF9yLCBzcmM2NV9yKTsKLSAgICAgICAgSUxWUl9CMl9TQihzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM3Nl9yLCBzcmM4N19yKTsKLSAgICAgICAgSUxWUl9EM19TQihzcmM0M19yLCBzcmMzMl9yLCBzcmM2NV9yLCBzcmM1NF9yLCBzcmM4N19yLCBzcmM3Nl9yLAotICAgICAgICAgICAgICAgICAgIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYpOwotICAgICAgICBYT1JJX0IzXzEyOF9TQihzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2KTsKK3N0YXRpYyB2b2lkIGhldmNfdnRfNHRfNHgxNl9tc2EodWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciwgaW50MzJfdCBoZWlnaHQpCit7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTA7CisgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjOThfciwgc3JjMjFfciwgc3JjNDNfcjsKKyAgICB2MTZpOCBzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwgc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NjsKKyAgICB2MTZpOCBzcmMxMDk5ODsKKyAgICB2OGkxNiBkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3Q3NiwgZmlsdDAsIGZpbHQxLCBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CiAKLSAgICAgICAgZHN0MTAgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmMyMTEwLCBzcmM0MzMyLCBmaWx0MCwgZmlsdDEsIGRzdDEwLCBkc3QxMCk7Ci0gICAgICAgIGRzdDMyID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBkc3QzMiwgZHN0MzIpOwotICAgICAgICBkc3Q1NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwgZHN0NTQsIGRzdDU0KTsKKyAgICBzcmMgLT0gc3JjX3N0cmlkZTsKKyAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOworICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAotICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmM5LCBzcmMyKTsKLSAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjOSwgc3JjOCwgc3JjMiwgc3JjOSwgc3JjOThfciwgc3JjMTA5X3IpOwotICAgICAgICBzcmMyMTEwID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmMxMDlfciwgKHYyaTY0KSBzcmM5OF9yKTsKLSAgICAgICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjMjExMCwgMTI4KTsKLSAgICAgICAgZHN0NzYgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM4Nzc2LCBzcmMyMTEwLCBmaWx0MCwgZmlsdDEsIGRzdDc2LCBkc3Q3Nik7CisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcik7CisgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKLSAgICAgICAgU1Q4eDhfVUIoZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYsIGRzdCwgMiAqIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKLSAgICB9CisgICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CisKKyAgICBJTFZSX0IyX1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzEwX3IsIHNyYzIxX3IpOworICAgIHNyYzIxMTAgPSAodjE2aTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHNyYzIxX3IsICh2Mmk2NCkgc3JjMTBfcik7CisgICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKCh2MTZ1OCkgc3JjMjExMCwgMTI4KTsKKworICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICBJTFZSX0I0X1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzMyX3IsIHNyYzQzX3IsCisgICAgICAgICAgICAgICBzcmM1NF9yLCBzcmM2NV9yKTsKKyAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM3Nl9yLAorICAgICAgICAgICAgICAgc3JjODdfciwgc3JjOThfciwgc3JjMTA5X3IpOworICAgIElMVlJfRDRfU0Ioc3JjNDNfciwgc3JjMzJfciwgc3JjNjVfciwgc3JjNTRfciwgc3JjODdfciwgc3JjNzZfciwgc3JjMTA5X3IsCisgICAgICAgICAgICAgICBzcmM5OF9yLCBzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5OCk7CisgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3Niwgc3JjMTA5OTgpOworCisgICAgZHN0MTAgPSBjb25zdF92ZWM7CisgICAgZHN0MzIgPSBjb25zdF92ZWM7CisgICAgZHN0NTQgPSBjb25zdF92ZWM7CisgICAgZHN0NzYgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHNyYzIxMTAsIHNyYzQzMzIsIGZpbHQwLCBmaWx0MSwgZHN0MTAsIGRzdDEwKTsKKyAgICBEUEFERF9TQjJfU0goc3JjNDMzMiwgc3JjNjU1NCwgZmlsdDAsIGZpbHQxLCBkc3QzMiwgZHN0MzIpOworICAgIERQQUREX1NCMl9TSChzcmM2NTU0LCBzcmM4Nzc2LCBmaWx0MCwgZmlsdDEsIGRzdDU0LCBkc3Q1NCk7CisgICAgRFBBRERfU0IyX1NIKHNyYzg3NzYsIHNyYzEwOTk4LCBmaWx0MCwgZmlsdDEsIGRzdDc2LCBkc3Q3Nik7CisgICAgU1Q4eDhfVUIoZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0NzYsIGRzdCwgMiAqIGRzdF9zdHJpZGUpOworICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworCisgICAgc3JjMiA9IHNyYzEwOworICAgIHNyYzIxMTAgPSBzcmMxMDk5ODsKKworICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKKworICAgIElMVlJfQjRfU0Ioc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgc3JjNSwgc3JjNCwgc3JjNiwgc3JjNSwgc3JjMzJfciwgc3JjNDNfciwKKyAgICAgICAgICAgICAgIHNyYzU0X3IsIHNyYzY1X3IpOworICAgIElMVlJfQjRfU0Ioc3JjNywgc3JjNiwgc3JjOCwgc3JjNywgc3JjOSwgc3JjOCwgc3JjMTAsIHNyYzksIHNyYzc2X3IsCisgICAgICAgICAgICAgICBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfcik7CisgICAgSUxWUl9ENF9TQihzcmM0M19yLCBzcmMzMl9yLCBzcmM2NV9yLCBzcmM1NF9yLCBzcmM4N19yLCBzcmM3Nl9yLCBzcmMxMDlfciwKKyAgICAgICAgICAgICAgIHNyYzk4X3IsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIHNyYzEwOTk4KTsKKyAgICBYT1JJX0I0XzEyOF9TQihzcmM0MzMyLCBzcmM2NTU0LCBzcmM4Nzc2LCBzcmMxMDk5OCk7CisKKyAgICBkc3QxMCA9IGNvbnN0X3ZlYzsKKyAgICBkc3QzMiA9IGNvbnN0X3ZlYzsKKyAgICBkc3Q1NCA9IGNvbnN0X3ZlYzsKKyAgICBkc3Q3NiA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxLCBkc3QxMCwgZHN0MTApOworICAgIERQQUREX1NCMl9TSChzcmM0MzMyLCBzcmM2NTU0LCBmaWx0MCwgZmlsdDEsIGRzdDMyLCBkc3QzMik7CisgICAgRFBBRERfU0IyX1NIKHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwLCBmaWx0MSwgZHN0NTQsIGRzdDU0KTsKKyAgICBEUEFERF9TQjJfU0goc3JjODc3Niwgc3JjMTA5OTgsIGZpbHQwLCBmaWx0MSwgZHN0NzYsIGRzdDc2KTsKKyAgICBTVDh4OF9VQihkc3QxMCwgZHN0MzIsIGRzdDU0LCBkc3Q3NiwgZHN0LCAyICogZHN0X3N0cmlkZSk7CisgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfdnRfNHRfNHdfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTIzMDMsOSArMjY1MCwxMCBAQAogICAgICAgICBoZXZjX3Z0XzR0XzR4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlcik7CiAgICAgfSBlbHNlIGlmICg0ID09IGhlaWdodCkgewogICAgICAgICBoZXZjX3Z0XzR0XzR4NF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgaGVpZ2h0KTsKLSAgICB9IGVsc2UgaWYgKDAgPT0gKGhlaWdodCAlIDgpKSB7Ci0gICAgICAgIGhldmNfdnRfNHRfNHg4bXVsdGlwbGVfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGhlaWdodCk7CisgICAgfSBlbHNlIGlmICg4ID09IGhlaWdodCkgeworICAgICAgICBoZXZjX3Z0XzR0XzR4OF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGZpbHRlciwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgaWYgKDE2ID09IGhlaWdodCkgeworICAgICAgICBoZXZjX3Z0XzR0XzR4MTZfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIsIGhlaWdodCk7CiAgICAgfQogfQogCkBAIC0yNDg4LDkgKzI4MzYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaW50MzJfdCBsb29wX2NudDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1OwotICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7Ci0gICAgdjhpMTYgZHN0MF9yLCBkc3QxX3I7CisgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKKyAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM1NF9yLCBzcmM2NV9yOworICAgIHY4aTE2IGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwogCkBAIC0yNTA3LDI5ICsyODU1LDI1IEBACiAgICAgSUxWUl9CMl9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMxMF9yLCBzcmMyMV9yKTsKIAogICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDIpOyBsb29wX2NudC0tOykgewotICAgICAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKLSAgICAgICAgc3JjICs9ICgyICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIFhPUklfQjJfMTI4X1NCKHNyYzMsIHNyYzQpOworICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwogICAgICAgICBJTFZSX0IyX1NCKHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzMyX3IsIHNyYzQzX3IpOworICAgICAgICBJTFZSX0IyX1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzU0X3IsIHNyYzY1X3IpOwogICAgICAgICBkc3QwX3IgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDFfciA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0Ml9yID0gY29uc3RfdmVjOworICAgICAgICBkc3QzX3IgPSBjb25zdF92ZWM7CiAgICAgICAgIERQQUREX1NCMl9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEsIGRzdDBfciwgZHN0MF9yKTsKLSAgICAgICAgZHN0MV9yID0gY29uc3RfdmVjOwogICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCBkc3QxX3IsIGRzdDFfcik7CisgICAgICAgIERQQUREX1NCMl9TSChzcmMzMl9yLCBzcmM1NF9yLCBmaWx0MCwgZmlsdDEsIGRzdDJfciwgZHN0Ml9yKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzX3IsIHNyYzY1X3IsIGZpbHQwLCBmaWx0MSwgZHN0M19yLCBkc3QzX3IpOworICAgICAgICBTVF9TSDQoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKIAotICAgICAgICBTVF9TSDIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzIpOwotICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjMik7Ci0gICAgICAgIElMVlJfQjJfU0Ioc3JjNSwgc3JjNCwgc3JjMiwgc3JjNSwgc3JjMTBfciwgc3JjMjFfcik7Ci0gICAgICAgIGRzdDBfciA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzEwX3IsIGZpbHQwLCBmaWx0MSwgZHN0MF9yLCBkc3QwX3IpOwotICAgICAgICBkc3QxX3IgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmMyMV9yLCBmaWx0MCwgZmlsdDEsIGRzdDFfciwgZHN0MV9yKTsKLQotICAgICAgICBTVF9TSDIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoMiAqIGRzdF9zdHJpZGUpOworICAgICAgICBzcmMyID0gc3JjNjsKKyAgICAgICAgc3JjMTBfciA9IHNyYzU0X3I7CisgICAgICAgIHNyYzIxX3IgPSBzcmM2NV9yOwogICAgIH0KIH0KIApAQCAtMjU1OCwxMSArMjkwMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIGludDMyX3QgbG9vcF9jbnQ7Ci0gICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNTsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7CiAgICAgdjhpMTYgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yOwogICAgIHYxNmk4IHNyYzEwX2wsIHNyYzMyX2wsIHNyYzU0X2wsIHNyYzIxX2wsIHNyYzQzX2wsIHNyYzY1X2w7CiAgICAgdjE2aTggc3JjMjExMCwgc3JjNDMzMjsKKyAgICB2MTZpOCBzcmM1NF9yLCBzcmM2NV9yLCBzcmM2NTU0OwogICAgIHY4aTE2IGRzdDBfbCwgZHN0MV9sOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CkBAIC0yNTgxLDM2ICsyOTI2LDQyIEBACiAgICAgSUxWTF9CMl9TQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMxMF9sLCBzcmMyMV9sKTsKICAgICBzcmMyMTEwID0gKHYxNmk4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSBzcmMyMV9sLCAodjJpNjQpIHNyYzEwX2wpOwogCi0gICAgZm9yIChsb29wX2NudCA9IChoZWlnaHQgPj4gMik7IGxvb3BfY250LS07KSB7CisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQpOwogICAgICAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjNSwgc3JjNik7CisgICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwogICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKKyAgICAgICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7CisKICAgICAgICAgSUxWUl9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9yLCBzcmM0M19yKTsKICAgICAgICAgSUxWTF9CMl9TQihzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLCBzcmMzMl9sLCBzcmM0M19sKTsKICAgICAgICAgc3JjNDMzMiA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjNDNfbCwgKHYyaTY0KSBzcmMzMl9sKTsKKyAgICAgICAgSUxWUl9CMl9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM1NF9yLCBzcmM2NV9yKTsKKyAgICAgICAgSUxWTF9CMl9TQihzcmM1LCBzcmM0LCBzcmM2LCBzcmM1LCBzcmM1NF9sLCBzcmM2NV9sKTsKKyAgICAgICAgc3JjNjU1NCA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjNjVfbCwgKHYyaTY0KSBzcmM1NF9sKTsKKwogICAgICAgICBkc3QwX3IgPSBjb25zdF92ZWM7CiAgICAgICAgIERQQUREX1NCMl9TSChzcmMxMF9yLCBzcmMzMl9yLCBmaWx0MCwgZmlsdDEsIGRzdDBfciwgZHN0MF9yKTsKICAgICAgICAgZHN0MV9yID0gY29uc3RfdmVjOwogICAgICAgICBEUEFERF9TQjJfU0goc3JjMjFfciwgc3JjNDNfciwgZmlsdDAsIGZpbHQxLCBkc3QxX3IsIGRzdDFfcik7CisgICAgICAgIGRzdDJfciA9IGNvbnN0X3ZlYzsKKyAgICAgICAgRFBBRERfU0IyX1NIKHNyYzMyX3IsIHNyYzU0X3IsIGZpbHQwLCBmaWx0MSwgZHN0Ml9yLCBkc3QyX3IpOworICAgICAgICBkc3QzX3IgPSBjb25zdF92ZWM7CisgICAgICAgIERQQUREX1NCMl9TSChzcmM0M19yLCBzcmM2NV9yLCBmaWx0MCwgZmlsdDEsIGRzdDNfciwgZHN0M19yKTsKICAgICAgICAgZHN0MF9sID0gY29uc3RfdmVjOwogICAgICAgICBEUEFERF9TQjJfU0goc3JjMjExMCwgc3JjNDMzMiwgZmlsdDAsIGZpbHQxLCBkc3QwX2wsIGRzdDBfbCk7Ci0KLSAgICAgICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjNSwgc3JjMik7Ci0gICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgICAgICBYT1JJX0IyXzEyOF9TQihzcmM1LCBzcmMyKTsKLSAgICAgICAgSUxWUl9CMl9TQihzcmM1LCBzcmM0LCBzcmMyLCBzcmM1LCBzcmMxMF9yLCBzcmMyMV9yKTsKLSAgICAgICAgSUxWTF9CMl9TQihzcmM1LCBzcmM0LCBzcmMyLCBzcmM1LCBzcmM1NF9sLCBzcmM2NV9sKTsKLSAgICAgICAgc3JjMjExMCA9ICh2MTZpOCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgc3JjNjVfbCwgKHYyaTY0KSBzcmM1NF9sKTsKLSAgICAgICAgZHN0Ml9yID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0goc3JjMzJfciwgc3JjMTBfciwgZmlsdDAsIGZpbHQxLCBkc3QyX3IsIGRzdDJfcik7Ci0gICAgICAgIGRzdDNfciA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzX3IsIHNyYzIxX3IsIGZpbHQwLCBmaWx0MSwgZHN0M19yLCBkc3QzX3IpOwogICAgICAgICBkc3QxX2wgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSChzcmM0MzMyLCBzcmMyMTEwLCBmaWx0MCwgZmlsdDEsIGRzdDFfbCwgZHN0MV9sKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHNyYzQzMzIsIHNyYzY1NTQsIGZpbHQwLCBmaWx0MSwgZHN0MV9sLCBkc3QxX2wpOwogCiAgICAgICAgIFNUX1NINChkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIFNUOHg0X1VCKGRzdDBfbCwgZHN0MV9sLCBkc3QgKyA4LCAoMiAqIGRzdF9zdHJpZGUpKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgc3JjMiA9IHNyYzY7CisgICAgICAgIHNyYzEwX3IgPSBzcmM1NF9yOworICAgICAgICBzcmMyMV9yID0gc3JjNjVfcjsKKyAgICAgICAgc3JjMjExMCA9IHNyYzY1NTQ7CiAgICAgfQogfQogCkBAIC0yODkyLDY5ICszMjQzLDUyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95KQogeworICAgIGludDMyX3QgZHN0X3N0cmlkZV9pbl9ieXRlcyA9IDIgKiBkc3Rfc3RyaWRlOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7CiAgICAgdjhpMTYgZmlsdDAsIGZpbHQxOwotICAgIHY0aTMyIGZpbHRfaDAsIGZpbHRfaDE7Ci0gICAgdjE2aTggbWFzazAgPSB7IDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDggfTsKKyAgICB2OGkxNiBmaWx0X2gwLCBmaWx0X2gxOworICAgIHYxNmk4IG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2FyciArIDE2KTsKICAgICB2MTZpOCBtYXNrMTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CiAgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKLSAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0OwotICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yOwotICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDIxX3IsIGRzdDQzX3I7CisgICAgdjhpMTYgZHN0MjAsIGRzdDMxLCBkc3Q0MiwgZHN0MTAsIGRzdDMyLCBkc3QyMSwgZHN0NDM7CisgICAgdjRpMzIgZHN0MCwgZHN0MTsKIAogICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeCk7CiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKICAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAotICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFZTSEZfQjJfU0Ioc3JjMCwgc3JjMiwgc3JjMCwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzMsIHNyYzEsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmMyLCBzcmM0LCBzcmMyLCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwogCi0gICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKLSAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgZHN0MjAgPSBjb25zdF92ZWM7CisgICAgZHN0MzEgPSBjb25zdF92ZWM7CisgICAgZHN0NDIgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MjAsIGRzdDIwKTsKKyAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QzMSwgZHN0MzEpOworICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDQyLCBkc3Q0Mik7CisgICAgSUxWUkxfSDJfU0goZHN0MzEsIGRzdDIwLCBkc3QxMCwgZHN0MzIpOworICAgIElMVlJMX0gyX1NIKGRzdDQyLCBkc3QzMSwgZHN0MjEsIGRzdDQzKTsKIAotICAgIGRzdDAgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKLSAgICBkc3QyID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotICAgIElMVlJfSDJfU0goZHN0MSwgZHN0MCwgZHN0MiwgZHN0MSwgZHN0MTBfciwgZHN0MjFfcik7Ci0KLSAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLQotICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3QzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotCi0gICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3QzLCBkc3QyKTsKLSAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QwX3IgPj49IDY7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLQotICAgIGRzdDQzX3IgPSBfX21zYV9pbHZyX2goZHN0NCwgZHN0Myk7Ci0gICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MV9yID4+PSA2OwotCi0gICAgZHN0MF9yID0gKHY0aTMyKSBfX21zYV9wY2tldl9oKCh2OGkxNikgZHN0MV9yLCAodjhpMTYpIGRzdDBfcik7Ci0gICAgU1Q4eDJfVUIoZHN0MF9yLCBkc3QsIDIgKiBkc3Rfc3RyaWRlKTsKKyAgICBkc3QwID0gSEVWQ19GSUxUXzRUQVAoZHN0MTAsIGRzdDMyLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVAoZHN0MjEsIGRzdDQzLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QwID4+PSA2OworICAgIGRzdDEgPj49IDY7CisgICAgZHN0MCA9ICh2NGkzMikgX19tc2FfcGNrZXZfaCgodjhpMTYpIGRzdDEsICh2OGkxNikgZHN0MCk7CisgICAgU1Q4eDJfVUIoZHN0MCwgZHN0LCBkc3Rfc3RyaWRlX2luX2J5dGVzKTsKIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl80dF80eDRfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTI5NjQsMTYgKzMyOTgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kpCiB7CisgICAgaW50MzJfdCBkc3Rfc3RyaWRlX2luX2J5dGVzID0gMiAqIGRzdF9zdHJpZGU7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNjsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOwogICAgIHYxNmk4IG1hc2sxOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NTsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3I7Ci0gICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0MjFfciwgZHN0NDNfcjsKKyAgICB2OGkxNiBkc3QzMCwgZHN0NDEsIGRzdDUyLCBkc3Q2MywgZHN0MTAsIGRzdDMyLCBkc3Q1NCwgZHN0MjEsIGRzdDQzLCBkc3Q2NTsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwogCiAgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CiAKQEAgLTI5ODEsNzEgKzMzMTUsNDMgQEAKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIAogICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CiAgICAgY29uc3RfdmVjIDw8PSA2OwogCi0gICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7Ci0gICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CisgICAgTERfU0I3KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CiAKLSAgICBYT1JJX0IzXzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzMsIHNyYzAsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgVlNIRl9CMl9TQihzcmMxLCBzcmM0LCBzcmMxLCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOworICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjNSwgc3JjMiwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzYsIHNyYzMsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CiAKLSAgICBWU0hGX0IyX1NCKHNyYzAsIHNyYzAsIHNyYzAsIHNyYzAsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgVlNIRl9CMl9TQihzcmMxLCBzcmMxLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzIsIHZlYzMpOwotICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICBkc3QzMCA9IGNvbnN0X3ZlYzsKKyAgICBkc3Q0MSA9IGNvbnN0X3ZlYzsKKyAgICBkc3Q1MiA9IGNvbnN0X3ZlYzsKKyAgICBkc3Q2MyA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzMCwgZHN0MzApOworICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDQxLCBkc3Q0MSk7CisgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0NTIsIGRzdDUyKTsKKyAgICBEUEFERF9TQjJfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBkc3Q2MywgZHN0NjMpOwogCi0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgSUxWUkxfSDJfU0goZHN0NDEsIGRzdDMwLCBkc3QxMCwgZHN0NDMpOworICAgIElMVlJMX0gyX1NIKGRzdDUyLCBkc3Q0MSwgZHN0MjEsIGRzdDU0KTsKKyAgICBJTFZSTF9IMl9TSChkc3Q2MywgZHN0NTIsIGRzdDMyLCBkc3Q2NSk7CiAKLSAgICBJTFZSX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDIsIGRzdDEsIGRzdDEwX3IsIGRzdDIxX3IpOwotCi0gICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7Ci0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQotICAgIGRzdDMyX3IgPSBfX21zYV9pbHZyX2goZHN0MywgZHN0Mik7Ci0gICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MF9yID4+PSA2OwotCi0gICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7Ci0KLSAgICBkc3Q0M19yID0gX19tc2FfaWx2cl9oKGRzdDQsIGRzdDMpOwotICAgIGRzdDFfciA9IEhFVkNfRklMVF80VEFQKGRzdDIxX3IsIGRzdDQzX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDFfciA+Pj0gNjsKLQotICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotCi0gICAgZHN0MTBfciA9IF9fbXNhX2lsdnJfaChkc3Q1LCBkc3Q0KTsKLSAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3QxMF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QyX3IgPj49IDY7Ci0KLSAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLQotICAgIGRzdDIxX3IgPSBfX21zYV9pbHZyX2goZHN0MiwgZHN0NSk7Ci0gICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0MjFfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0M19yID4+PSA2OwotCi0gICAgUENLRVZfSDJfU1coZHN0MV9yLCBkc3QwX3IsIGRzdDNfciwgZHN0Ml9yLCBkc3QwX3IsIGRzdDFfcik7Ci0gICAgU1Q4eDRfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdCwgMiAqIGRzdF9zdHJpZGUpOworICAgIGRzdDAgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMCwgZHN0MzIsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDEgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMSwgZHN0NDMsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMiwgZHN0NTQsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDMgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0MywgZHN0NjUsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNSQV80Vihkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCA2KTsKKyAgICBQQ0tFVl9IMl9TVyhkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QyKTsKKyAgICBTVDh4NF9VQihkc3QwLCBkc3QyLCBkc3QsIGRzdF9zdHJpZGVfaW5fYnl0ZXMpOwogfQogCiAKQEAgLTMwNjEsMjUgKzMzNjcsMjQgQEAKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwogICAgIHYxNmk4IHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIgKyAxNik7CiAgICAgdjE2aTggbWFzazE7CiAgICAgdjhpMTYgZmlsdGVyX3ZlYywgY29uc3RfdmVjOwotICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzU7Ci0gICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0OCwgZHN0OTsKLSAgICB2NGkzMiBkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdDRfciwgZHN0NV9yLCBkc3Q2X3IsIGRzdDdfcjsKLSAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3Q3Nl9yOwotICAgIHY4aTE2IGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3IsIGRzdDg3X3I7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2OGkxNiBkc3QxMCwgZHN0MjEsIGRzdDIyLCBkc3Q3MywgZHN0ODQsIGRzdDk1LCBkc3QxMDY7CisgICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0NTRfciwgZHN0NzZfciwgZHN0OThfcjsKKyAgICB2OGkxNiBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yLCBkc3Q4N19yLCBkc3QxMDlfcjsKKyAgICB2NGkzMiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogCiAgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKICAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKIAogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7Ci0gICAgdmVjMCA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgZmlsdGVyX3ZlYywgMCk7Ci0gICAgZmlsdGVyX3ZlYyA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHZlYzAsICh2MTZpOCkgZmlsdGVyX3ZlYyk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKIAotICAgIFNQTEFUSV9XMl9TVyhmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUExBVElfVzJfU0goZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKICAgICBtYXNrMSA9IG1hc2swICsgMjsKIApAQCAtMzA4OSwxOSArMzM5NCwxNCBAQAogICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwogICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwogICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOwotCi0gICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKLSAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7Ci0KLSAgICBkc3QwID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDAsIGRzdDApOwotICAgIGRzdDEgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKLQotICAgIElMVlJfSDJfU0goZHN0MSwgZHN0MCwgZHN0MiwgZHN0MSwgZHN0MTBfciwgZHN0MjFfcik7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMiwgc3JjMSwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBkc3QxMCA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxMCwgZHN0MTApOworICAgIGRzdDIxID0gY29uc3RfdmVjOworICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDIxLCBkc3QyMSk7CisgICAgSUxWUkxfSDJfU0goZHN0MjEsIGRzdDEwLCBkc3QxMF9yLCBkc3QyMV9yKTsKKyAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QyMSwgMSk7CiAKICAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDM7IGxvb3BfY250LS07KSB7CiAgICAgICAgIExEX1NCOChzcmMsIHNyY19zdHJpZGUsCkBAIC0zMTA5LDc1ICszNDA5LDQ1IEBACiAgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOwogICAgICAgICBYT1JJX0I4XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3QzID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmM3LCBzcmMzLCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzgsIHNyYzQsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjOSwgc3JjNSwgc3JjOSwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmMxMCwgc3JjNiwgc3JjMTAsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CiAKLSAgICAgICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3QzLCBkc3QyKTsKLSAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDBfciA+Pj0gNjsKKyAgICAgICAgZHN0NzMgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDg0ID0gY29uc3RfdmVjOworICAgICAgICBkc3Q5NSA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0MTA2ID0gY29uc3RfdmVjOworICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q3MywgZHN0NzMpOworICAgICAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3Q4NCwgZHN0ODQpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3Q5NSwgZHN0OTUpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBkc3QxMDYsIGRzdDEwNik7CiAKLSAgICAgICAgVlNIRl9CMl9TQihzcmM0LCBzcmM0LCBzcmM0LCBzcmM0LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKKyAgICAgICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3Q3MywgZHN0MjIpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q4NCwgZHN0NzMsIGRzdDQzX3IsIGRzdDg3X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q5NSwgZHN0ODQsIGRzdDU0X3IsIGRzdDk4X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDYsIGRzdDk1LCBkc3Q2NV9yLCBkc3QxMDlfcik7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDczLCAxKTsKKyAgICAgICAgZHN0NzZfciA9IF9fbXNhX2lsdnJfaChkc3QyMiwgZHN0MTA2KTsKIAotICAgICAgICBkc3Q0M19yID0gX19tc2FfaWx2cl9oKGRzdDQsIGRzdDMpOwotICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0MV9yID4+PSA2OwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7Ci0KLSAgICAgICAgZHN0NTRfciA9IF9fbXNhX2lsdnJfaChkc3Q1LCBkc3Q0KTsKLSAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDJfciA+Pj0gNjsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDYgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDYsIGRzdDYpOwotCi0gICAgICAgIGRzdDY1X3IgPSBfX21zYV9pbHZyX2goZHN0NiwgZHN0NSk7Ci0gICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QzX3IgPj49IDY7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICBkc3Q3ID0gY29uc3RfdmVjOwotICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q3LCBkc3Q3KTsKLQotICAgICAgICBkc3Q3Nl9yID0gX19tc2FfaWx2cl9oKGRzdDcsIGRzdDYpOwotICAgICAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0NF9yID4+PSA2OwotCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0OCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0OCwgZHN0OCk7Ci0KLSAgICAgICAgZHN0ODdfciA9IF9fbXNhX2lsdnJfaChkc3Q4LCBkc3Q3KTsKLSAgICAgICAgZHN0NV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0NjVfciwgZHN0ODdfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDVfciA+Pj0gNjsKLQotICAgICAgICBWU0hGX0IyX1NCKHNyYzksIHNyYzksIHNyYzksIHNyYzksIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDkgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDksIGRzdDkpOwotCi0gICAgICAgIGRzdDEwX3IgPSBfX21zYV9pbHZyX2goZHN0OSwgZHN0OCk7Ci0gICAgICAgIGRzdDZfciA9IEhFVkNfRklMVF80VEFQKGRzdDc2X3IsIGRzdDEwX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3Q2X3IgPj49IDY7Ci0KLSAgICAgICAgVlNIRl9CMl9TQihzcmMxMCwgc3JjMTAsIHNyYzEwLCBzcmMxMCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0KLSAgICAgICAgZHN0MjFfciA9IF9fbXNhX2lsdnJfaChkc3QyLCBkc3Q5KTsKLSAgICAgICAgZHN0N19yID0gSEVWQ19GSUxUXzRUQVAoZHN0ODdfciwgZHN0MjFfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDdfciA+Pj0gNjsKLQotICAgICAgICBQQ0tFVl9INF9TVyhkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsCi0gICAgICAgICAgICAgICAgICAgIGRzdDVfciwgZHN0NF9yLCBkc3Q3X3IsIGRzdDZfciwKLSAgICAgICAgICAgICAgICAgICAgZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yKTsKLSAgICAgICAgU1Q4eDhfVUIoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCBkc3QsIDIgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0MCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDIgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MyA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q0ID0gSEVWQ19GSUxUXzRUQVAoZHN0NTRfciwgZHN0NzZfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDUgPSBIRVZDX0ZJTFRfNFRBUChkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0NiA9IEhFVkNfRklMVF80VEFQKGRzdDc2X3IsIGRzdDk4X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3Q3ID0gSEVWQ19GSUxUXzRUQVAoZHN0ODdfciwgZHN0MTA5X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBTUkFfNFYoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgNik7CisgICAgICAgIFNSQV80Vihkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCA2KTsKKyAgICAgICAgUENLRVZfSDRfU1coZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0NSwgZHN0NCwgZHN0NywgZHN0NiwKKyAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIFNUOHg4X1VCKGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdCwgMiAqIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKKworICAgICAgICBkc3QxMF9yID0gZHN0OThfcjsKKyAgICAgICAgZHN0MjFfciA9IGRzdDEwOV9yOworICAgICAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QxMDYsIDEpOwogICAgIH0KIH0KIApAQCAtMzIwOSwzMCArMzQ3OSwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIHVpbnQzMl90IGxvb3BfY250OwotICAgIHVpbnQ2NF90IGRzdF92YWwwLCBkc3RfdmFsMSwgZHN0X3ZhbDIsIGRzdF92YWwzOwotICAgIHVpbnQzMl90IGRzdF92YWxfaW50MCwgZHN0X3ZhbF9pbnQxLCBkc3RfdmFsX2ludDIsIGRzdF92YWxfaW50MzsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OworICAgIGludDMyX3QgZHN0X3N0cmlkZV9pbl9ieXRlcyA9IDIgKiBkc3Rfc3RyaWRlOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7Ci0gICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2w7Ci0gICAgdjhpMTYgZHN0MTBfciwgZHN0MzJfciwgZHN0MjFfciwgZHN0NDNfcjsKLSAgICB2OGkxNiBkc3QxMF9sLCBkc3QzMl9sLCBkc3QyMV9sLCBkc3Q0M19sOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjhpMTYgZHN0aDAsIGRzdGgxLCBkc3RoMiwgZHN0aDMsIGRzdGg0LCBkc3RoNSwgZHN0aDYsIGRzdGg3LCBkc3RoOCwgZHN0aDk7CisgICAgdjhpMTYgZHN0aDEwLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDc2X3IsIGRzdDk4X3IsIGRzdDIxX3IsIGRzdDQzX3I7CisgICAgdjhpMTYgZHN0NjVfciwgZHN0ODdfciwgZHN0MTA5X3IsIGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDc2X2w7CisgICAgdjhpMTYgZHN0OThfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbCwgZHN0ODdfbCwgZHN0MTA5X2w7CisgICAgdjhpMTYgZHN0MTAyMV9sLCBkc3QzMjQzX2wsIGRzdDU0NjVfbCwgZHN0NzY4N19sLCBkc3Q5ODEwOV9sOworICAgIHY0aTMyIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yOworICAgIHY0aTMyIGRzdDBfbCwgZHN0MV9sLCBkc3QyX2wsIGRzdDNfbDsKIAogICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOwogICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeCk7CiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKQEAgLTMyNDcsODkgKzM1MTgsODMgQEAKICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CiAgICAgVlNIRl9CMl9TQihzcmMyLCBzcmMyLCBzcmMyLCBzcmMyLCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOwogCi0gICAgZHN0MCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKLSAgICBkc3QxID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwotICAgIGRzdDIgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgZHN0aDAgPSBjb25zdF92ZWM7CisgICAgZHN0aDEgPSBjb25zdF92ZWM7CisgICAgZHN0aDIgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0aDAsIGRzdGgwKTsKKyAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3RoMSwgZHN0aDEpOworICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdGgyLCBkc3RoMik7CiAKLSAgICBJTFZSTF9IMl9TSChkc3QxLCBkc3QwLCBkc3QxMF9yLCBkc3QxMF9sKTsKLSAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3QxLCBkc3QyMV9yLCBkc3QyMV9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMSwgZHN0aDAsIGRzdDEwX3IsIGRzdDEwX2wpOworICAgIElMVlJMX0gyX1NIKGRzdGgyLCBkc3RoMSwgZHN0MjFfciwgZHN0MjFfbCk7CiAKLSAgICBmb3IgKGxvb3BfY250ID0gaGVpZ2h0ID4+IDI7IGxvb3BfY250LS07KSB7Ci0gICAgICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOworICAgIFhPUklfQjhfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKIAotICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgIGRzdDMgPSBjb25zdF92ZWM7Ci0gICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKKyAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKIAotICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBkc3QyLCBkc3QzMl9yLCBkc3QzMl9sKTsKLSAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QwX3IgPj49IDY7Ci0gICAgICAgIGRzdDBfbCA+Pj0gNjsKKyAgICBkc3RoMyA9IGNvbnN0X3ZlYzsKKyAgICBkc3RoNCA9IGNvbnN0X3ZlYzsKKyAgICBkc3RoNSA9IGNvbnN0X3ZlYzsKKyAgICBkc3RoNiA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3RoMywgZHN0aDMpOworICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdGg0LCBkc3RoNCk7CisgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0aDUsIGRzdGg1KTsKKyAgICBEUEFERF9TQjJfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBkc3RoNiwgZHN0aDYpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7CisgICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjOCwgc3JjOCwgc3JjOCwgc3JjOCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzksIHNyYzksIHNyYzksIHNyYzksIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMxMCwgc3JjMTAsIHNyYzEwLCBzcmMxMCwgbWFzazAsIG1hc2sxLCB2ZWM2LCB2ZWM3KTsKIAotICAgICAgICBJTFZSTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q0M19yLCBkc3Q0M19sKTsKLSAgICAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QxX3IgPj49IDY7Ci0gICAgICAgIGRzdDFfbCA+Pj0gNjsKKyAgICBkc3RoNyA9IGNvbnN0X3ZlYzsKKyAgICBkc3RoOCA9IGNvbnN0X3ZlYzsKKyAgICBkc3RoOSA9IGNvbnN0X3ZlYzsKKyAgICBkc3RoMTAgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0aDcsIGRzdGg3KTsKKyAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3RoOCwgZHN0aDgpOworICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdGg5LCBkc3RoOSk7CisgICAgRFBBRERfU0IyX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZHN0aDEwLCBkc3RoMTApOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7CisgICAgSUxWUkxfSDJfU0goZHN0aDMsIGRzdGgyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoNCwgZHN0aDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg1LCBkc3RoNCwgZHN0NTRfciwgZHN0NTRfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDYsIGRzdGg1LCBkc3Q2NV9yLCBkc3Q2NV9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoNywgZHN0aDYsIGRzdDc2X3IsIGRzdDc2X2wpOworICAgIElMVlJMX0gyX1NIKGRzdGg4LCBkc3RoNywgZHN0ODdfciwgZHN0ODdfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0aDksIGRzdGg4LCBkc3Q5OF9yLCBkc3Q5OF9sKTsKKyAgICBJTFZSTF9IMl9TSChkc3RoMTAsIGRzdGg5LCBkc3QxMDlfciwgZHN0MTA5X2wpOwogCi0gICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDEwX3IsIGRzdDEwX2wpOwotICAgICAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3QxMF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0Ml9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfbCwgZHN0MTBfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgIGRzdDJfciA+Pj0gNjsKLSAgICAgICAgZHN0Ml9sID4+PSA2OworICAgIFBDS0VWX0QyX1NIKGRzdDIxX2wsIGRzdDEwX2wsIGRzdDQzX2wsIGRzdDMyX2wsIGRzdDEwMjFfbCwgZHN0MzI0M19sKTsKKyAgICBQQ0tFVl9EMl9TSChkc3Q2NV9sLCBkc3Q1NF9sLCBkc3Q4N19sLCBkc3Q3Nl9sLCBkc3Q1NDY1X2wsIGRzdDc2ODdfbCk7CisgICAgZHN0OTgxMDlfbCA9ICh2OGkxNikgX19tc2FfcGNrZXZfZCgodjJpNjQpIGRzdDEwOV9sLCAodjJpNjQpIGRzdDk4X2wpOwogCi0gICAgICAgIFZTSEZfQjJfU0Ioc3JjNiwgc3JjNiwgc3JjNiwgc3JjNiwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7Ci0KLSAgICAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0NSwgZHN0MjFfciwgZHN0MjFfbCk7Ci0gICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDIxX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19sLCBkc3QyMV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICAgICAgZHN0M19yID4+PSA2OwotICAgICAgICBkc3QzX2wgPj49IDY7Ci0KLSAgICAgICAgUENLRVZfSDRfU1coZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLAotICAgICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsCi0gICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7Ci0KLSAgICAgICAgZHN0X3ZhbDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDBfciwgMCk7Ci0gICAgICAgIGRzdF92YWwxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QxX3IsIDApOwotICAgICAgICBkc3RfdmFsMiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0Ml9yLCAwKTsKLSAgICAgICAgZHN0X3ZhbDMgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDNfciwgMCk7Ci0KLSAgICAgICAgZHN0X3ZhbF9pbnQwID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QwX3IsIDIpOwotICAgICAgICBkc3RfdmFsX2ludDEgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDFfciwgMik7Ci0gICAgICAgIGRzdF92YWxfaW50MiA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0Ml9yLCAyKTsKLSAgICAgICAgZHN0X3ZhbF9pbnQzID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QzX3IsIDIpOwotCi0gICAgICAgIFNEKGRzdF92YWwwLCBkc3QpOwotICAgICAgICBTVyhkc3RfdmFsX2ludDAsIGRzdCArIDQpOwotICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgICAgICAgU0QoZHN0X3ZhbDEsIGRzdCk7Ci0gICAgICAgIFNXKGRzdF92YWxfaW50MSwgZHN0ICsgNCk7Ci0gICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICBTRChkc3RfdmFsMiwgZHN0KTsKLSAgICAgICAgU1coZHN0X3ZhbF9pbnQyLCBkc3QgKyA0KTsKLSAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgIFNEKGRzdF92YWwzLCBkc3QpOwotICAgICAgICBTVyhkc3RfdmFsX2ludDMsIGRzdCArIDQpOwotICAgICAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLQotICAgIH0KKyAgICBkc3QwX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QxMF9yLCBkc3QzMl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9yLCBkc3Q1NF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q1X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q2NV9yLCBkc3Q4N19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q2X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q3Nl9yLCBkc3Q5OF9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3Q3X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTAyMV9sLCBkc3QzMjQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyNDNfbCwgZHN0NTQ2NV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NDY1X2wsIGRzdDc2ODdfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NzY4N19sLCBkc3Q5ODEwOV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QxX3IsIGRzdDJfciwgZHN0M19yLCA2KTsKKyAgICBTUkFfNFYoZHN0NF9yLCBkc3Q1X3IsIGRzdDZfciwgZHN0N19yLCA2KTsKKyAgICBTUkFfNFYoZHN0MF9sLCBkc3QxX2wsIGRzdDJfbCwgZHN0M19sLCA2KTsKKyAgICBQQ0tFVl9IMl9TSChkc3QxX3IsIGRzdDBfciwgZHN0M19yLCBkc3QyX3IsIHRtcDAsIHRtcDEpOworICAgIFBDS0VWX0gyX1NIKGRzdDVfciwgZHN0NF9yLCBkc3Q3X3IsIGRzdDZfciwgdG1wMiwgdG1wMyk7CisgICAgUENLRVZfSDJfU0goZHN0MV9sLCBkc3QwX2wsIGRzdDNfbCwgZHN0Ml9sLCB0bXA0LCB0bXA1KTsKKyAgICBTVDh4NF9VQih0bXAwLCB0bXAxLCBkc3QsIGRzdF9zdHJpZGVfaW5fYnl0ZXMpOworICAgIFNUNHg0X1VCKHRtcDQsIHRtcDQsIDAsIDEsIDIsIDMsIGRzdCArIDQsIGRzdF9zdHJpZGVfaW5fYnl0ZXMpOworICAgIGRzdCArPSA0ICogZHN0X3N0cmlkZTsKKyAgICBTVDh4NF9VQih0bXAyLCB0bXAzLCBkc3QsIGRzdF9zdHJpZGVfaW5fYnl0ZXMpOworICAgIFNUNHg0X1VCKHRtcDUsIHRtcDUsIDAsIDEsIDIsIDMsIGRzdCArIDQsIGRzdF9zdHJpZGVfaW5fYnl0ZXMpOwogfQogCiBzdGF0aWMgdm9pZCBoZXZjX2h2XzR0Xzh4Ml9tc2EodWludDhfdCAqc3JjLApAQCAtMzMzNywxNiArMzYwMiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kpCiB7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKICAgICB2OGkxNiBmaWx0MCwgZmlsdDE7Ci0gICAgdjRpMzIgZmlsdF9oMCwgZmlsdF9oMTsKLSAgICB2MTZpOCBtYXNrMCA9IHsgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCB9OworICAgIHY4aTE2IGZpbHRfaDAsIGZpbHRfaDE7CisgICAgdjE2aTggbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKICAgICB2MTZpOCBtYXNrMTsKICAgICB2OGkxNiBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7Ci0gICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNTsKKyAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCB2ZWM4LCB2ZWM5OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQ7CiAgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sOwogICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDIxX3IsIGRzdDQzX3I7CkBAIC0zMzU4LDIzICszNjIyLDIzIEBACiAgICAgU1BMQVRJX0gyX1NIKGZpbHRlcl92ZWMsIDAsIDEsIGZpbHQwLCBmaWx0MSk7CiAKICAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3kpOwotICAgIHZlYzAgPSBfX21zYV9jbHRpX3NfYigodjE2aTgpIGZpbHRlcl92ZWMsIDApOwotICAgIGZpbHRlcl92ZWMgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih2ZWMwLCAodjE2aTgpIGZpbHRlcl92ZWMpOworICAgIFVOUENLX1JfU0JfU0goZmlsdGVyX3ZlYywgZmlsdGVyX3ZlYyk7CiAKLSAgICBTUExBVElfVzJfU1coZmlsdGVyX3ZlYywgMCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOwogCiAgICAgbWFzazEgPSBtYXNrMCArIDI7CiAKICAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOwogICAgIGNvbnN0X3ZlYyA8PD0gNjsKIAotICAgIExEX1NCMyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOwotICAgIHNyYyArPSAoMyAqIHNyY19zdHJpZGUpOwotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwogCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWM4LCB2ZWM5KTsKIAogICAgIGRzdDAgPSBjb25zdF92ZWM7CiAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CkBAIC0zMzgyLDUzICszNjQ2LDEyMyBAQAogICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDEsIGRzdDEpOwogICAgIGRzdDIgPSBjb25zdF92ZWM7CiAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0MiwgZHN0Mik7CisgICAgZHN0MyA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKKyAgICBkc3Q0ID0gY29uc3RfdmVjOworICAgIERQQUREX1NCMl9TSCh2ZWM4LCB2ZWM5LCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwogCiAgICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7CiAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7Ci0KLSAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLSAgICBYT1JJX0IyXzEyOF9TQihzcmMzLCBzcmM0KTsKLQotICAgIFZTSEZfQjJfU0Ioc3JjMywgc3JjMywgc3JjMywgc3JjMywgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3QzID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOwotCiAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CiAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MF9yID4+PSA2OwotICAgIGRzdDBfbCA+Pj0gNjsKLQotICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q0ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOwotCi0gICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CiAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MV9yID4+PSA2OwotICAgIGRzdDFfbCA+Pj0gNjsKLQorICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOwogICAgIFBDS0VWX0gyX1NXKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwgZHN0MF9yLCBkc3QxX3IpOwogICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAorc3RhdGljIHZvaWQgaGV2Y19odl80dF84bXVsdHg0X21zYSh1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksIGludDMyX3Qgd2lkdGg4bXVsdCkKK3sKKyAgICBpbnQzMl90IGNudDsKKyAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBtYXNrMCwgbWFzazE7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2OGkxNiBmaWx0MCwgZmlsdDEsIGZpbHRfaDAsIGZpbHRfaDEsIGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2OworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3I7CisgICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbDsKKyAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKKworICAgIHNyYyAtPSAoc3JjX3N0cmlkZSArIDEpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl94KTsKKyAgICBTUExBVElfSDJfU0goZmlsdGVyX3ZlYywgMCwgMSwgZmlsdDAsIGZpbHQxKTsKKworICAgIGZpbHRlcl92ZWMgPSBMRF9TSChmaWx0ZXJfeSk7CisgICAgVU5QQ0tfUl9TQl9TSChmaWx0ZXJfdmVjLCBmaWx0ZXJfdmVjKTsKKworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKKworICAgIG1hc2swID0gTERfU0IoZmZfaGV2Y19tYXNrX2Fycik7CisgICAgbWFzazEgPSBtYXNrMCArIDI7CisKKyAgICBjb25zdF92ZWMgPSBfX21zYV9sZGlfaCgxMjgpOworICAgIGNvbnN0X3ZlYyA8PD0gNjsKKworICAgIGZvciAoY250ID0gd2lkdGg4bXVsdDsgY250LS07KSB7CisgICAgICAgIExEX1NCNyhzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOworICAgICAgICBzcmMgKz0gODsKKyAgICAgICAgWE9SSV9CN18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNik7CisKKyAgICAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzEsIHNyYzEsIHNyYzEsIHNyYzEsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjMiwgc3JjMiwgc3JjMiwgc3JjMiwgbWFzazAsIG1hc2sxLCB2ZWM0LCB2ZWM1KTsKKworICAgICAgICBkc3QwID0gY29uc3RfdmVjOworICAgICAgICBkc3QxID0gY29uc3RfdmVjOworICAgICAgICBkc3QyID0gY29uc3RfdmVjOworICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7CisgICAgICAgIERQQUREX1NCMl9TSCh2ZWM0LCB2ZWM1LCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOworCisgICAgICAgIElMVlJMX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDEwX3IsIGRzdDEwX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3QxLCBkc3QyMV9yLCBkc3QyMV9sKTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDQgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDUgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDYgPSBjb25zdF92ZWM7CisgICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgICAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7CisgICAgICAgIERQQUREX1NCMl9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGRzdDYsIGRzdDYpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QzLCBkc3QyLCBkc3QzMl9yLCBkc3QzMl9sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q2LCBkc3Q1LCBkc3Q2NV9yLCBkc3Q2NV9sKTsKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisKKyAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfbCA9IEhFVkNfRklMVF80VEFQKGRzdDMyX2wsIGRzdDU0X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICAgICAgUENLRVZfSDJfU1coZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QwX3IsIGRzdDFfcik7CisgICAgICAgIFBDS0VWX0gyX1NXKGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwgZHN0Ml9yLCBkc3QzX3IpOworCisgICAgICAgIFNUX1NXNChkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSA4OworICAgIH0KK30KKwogc3RhdGljIHZvaWQgaGV2Y19odl80dF84eDZfbXNhKHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSkKIHsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIHZlYzgsIHZlYzk7CisgICAgdjE2aTggdmVjMTAsIHZlYzExLCB2ZWMxMiwgdmVjMTMsIHZlYzE0LCB2ZWMxNSwgdmVjMTYsIHZlYzE3OwogICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdDg7CiAgICAgdjRpMzIgZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCBkc3QyX3IsIGRzdDJfbCwgZHN0M19yLCBkc3QzX2w7CiAgICAgdjRpMzIgZHN0NF9yLCBkc3Q0X2wsIGRzdDVfciwgZHN0NV9sOwpAQCAtMzQ0MywyNCArMzc3NywzMSBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCiAgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKICAgICBjb25zdF92ZWMgPDw9IDY7CiAKLSAgICBMRF9TQjMoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyKTsKLSAgICBzcmMgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKyAgICBMRF9TQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKKyAgICBzcmMgKz0gKDUgKiBzcmNfc3RyaWRlKTsKKyAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4KTsKIAotICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIFhPUklfQjVfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOworICAgIFhPUklfQjRfMTI4X1NCKHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgpOwogCiAgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwogICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKICAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgVlNIRl9CMl9TQihzcmMzLCBzcmMzLCBzcmMzLCBzcmMzLCBtYXNrMCwgbWFzazEsIHZlYzYsIHZlYzcpOworICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWM4LCB2ZWM5KTsKKyAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMTAsIHZlYzExKTsKKyAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjMTIsIHZlYzEzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzcsIHNyYzcsIHNyYzcsIHNyYzcsIG1hc2swLCBtYXNrMSwgdmVjMTQsIHZlYzE1KTsKKyAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMTYsIHZlYzE3KTsKIAogICAgIGRzdDAgPSBjb25zdF92ZWM7CiAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MCwgZHN0MCk7CkBAIC0zNDY4LDkxICszODA5LDQ0IEBACiAgICAgRFBBRERfU0IyX1NIKHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MSwgZHN0MSwgZHN0MSk7CiAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKyAgICBkc3QzID0gY29uc3RfdmVjOworICAgIERQQUREX1NCMl9TSCh2ZWM2LCB2ZWM3LCBmaWx0MCwgZmlsdDEsIGRzdDMsIGRzdDMpOworICAgIGRzdDQgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHZlYzgsIHZlYzksIGZpbHQwLCBmaWx0MSwgZHN0NCwgZHN0NCk7CisgICAgZHN0NSA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0godmVjMTAsIHZlYzExLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOworICAgIGRzdDYgPSBjb25zdF92ZWM7CisgICAgRFBBRERfU0IyX1NIKHZlYzEyLCB2ZWMxMywgZmlsdDAsIGZpbHQxLCBkc3Q2LCBkc3Q2KTsKKyAgICBkc3Q3ID0gY29uc3RfdmVjOworICAgIERQQUREX1NCMl9TSCh2ZWMxNCwgdmVjMTUsIGZpbHQwLCBmaWx0MSwgZHN0NywgZHN0Nyk7CisgICAgZHN0OCA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0godmVjMTYsIHZlYzE3LCBmaWx0MCwgZmlsdDEsIGRzdDgsIGRzdDgpOwogCiAgICAgSUxWUkxfSDJfU0goZHN0MSwgZHN0MCwgZHN0MTBfciwgZHN0MTBfbCk7CiAgICAgSUxWUkxfSDJfU0goZHN0MiwgZHN0MSwgZHN0MjFfciwgZHN0MjFfbCk7Ci0KLSAgICBMRF9TQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0KTsKLSAgICBzcmMgKz0gKDIgKiBzcmNfc3RyaWRlKTsKLQotICAgIFhPUklfQjJfMTI4X1NCKHNyYzMsIHNyYzQpOwotCi0gICAgLyogcm93IDMgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0MyA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKLQogICAgIElMVlJMX0gyX1NIKGRzdDMsIGRzdDIsIGRzdDMyX3IsIGRzdDMyX2wpOwotICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotCi0gICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0KLSAgICBkc3QwX3IgPj49IDY7Ci0gICAgZHN0MF9sID4+PSA2OwotCi0gICAgLyogcm93IDQgKi8KLSAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0NCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLQogICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDYsIGRzdDUsIGRzdDY1X3IsIGRzdDY1X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDcsIGRzdDYsIGRzdDc2X3IsIGRzdDc2X2wpOworICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOworCisgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MV9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfciwgZHN0NDNfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0MV9yID4+PSA2OwotICAgIGRzdDFfbCA+Pj0gNjsKLQotICAgIExEX1NCMihzcmMsIHNyY19zdHJpZGUsIHNyYzUsIHNyYzYpOwotICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotCi0gICAgWE9SSV9CMl8xMjhfU0Ioc3JjNSwgc3JjNik7Ci0KLSAgICAvKiByb3cgNSAqLwotICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjNSwgc3JjNSwgc3JjNSwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDUsIGRzdDUpOwotCi0gICAgSUxWUkxfSDJfU0goZHN0NSwgZHN0NCwgZHN0NTRfciwgZHN0NTRfbCk7CiAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CiAgICAgZHN0Ml9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfbCwgZHN0NTRfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgZHN0Ml9yID4+PSA2OwotICAgIGRzdDJfbCA+Pj0gNjsKLQotICAgIC8qIHJvdyA2ICovCi0gICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDYgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NiwgZHN0Nik7Ci0KLSAgICBJTFZSTF9IMl9TSChkc3Q2LCBkc3Q1LCBkc3Q2NV9yLCBkc3Q2NV9sKTsKICAgICBkc3QzX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19yLCBkc3Q2NV9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3QzX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q0M19sLCBkc3Q2NV9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3QzX3IgPj49IDY7Ci0gICAgZHN0M19sID4+PSA2OwotCi0gICAgTERfU0IyKHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCk7Ci0KLSAgICBYT1JJX0IyXzEyOF9TQihzcmM3LCBzcmM4KTsKLQotICAgIC8qIHJvdyA3ICovCi0gICAgVlNIRl9CMl9TQihzcmM3LCBzcmM3LCBzcmM3LCBzcmM3LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgIGRzdDcgPSBjb25zdF92ZWM7Ci0gICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NywgZHN0Nyk7Ci0KLSAgICBJTFZSTF9IMl9TSChkc3Q3LCBkc3Q2LCBkc3Q3Nl9yLCBkc3Q3Nl9sKTsKICAgICBkc3Q0X3IgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICBkc3Q0X2wgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9sLCBkc3Q3Nl9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLSAgICBkc3Q0X3IgPj49IDY7Ci0gICAgZHN0NF9sID4+PSA2OwotCi0gICAgLyogcm93IDggKi8KLSAgICBWU0hGX0IyX1NCKHNyYzgsIHNyYzgsIHNyYzgsIHNyYzgsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgZHN0OCA9IGNvbnN0X3ZlYzsKLSAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q4LCBkc3Q4KTsKLQotICAgIElMVlJMX0gyX1NIKGRzdDgsIGRzdDcsIGRzdDg3X3IsIGRzdDg3X2wpOwogICAgIGRzdDVfciA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgIGRzdDVfbCA9IEhFVkNfRklMVF80VEFQKGRzdDY1X2wsIGRzdDg3X2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgIGRzdDVfciA+Pj0gNjsKLSAgICBkc3Q1X2wgPj49IDY7CisKKyAgICBTUkFfNFYoZHN0MF9yLCBkc3QwX2wsIGRzdDFfciwgZHN0MV9sLCA2KTsKKyAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICBTUkFfNFYoZHN0NF9yLCBkc3Q0X2wsIGRzdDVfciwgZHN0NV9sLCA2KTsKIAogICAgIFBDS0VWX0g0X1NXKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKICAgICAgICAgICAgICAgICBkc3QyX2wsIGRzdDJfciwgZHN0M19sLCBkc3QzX3IsIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7CkBAIC0zNTcyLDIyICszODY2LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl94LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGg4bXVsdCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudCwgY250OwogICAgIHVpbnQ4X3QgKnNyY190bXA7CiAgICAgaW50MTZfdCAqZHN0X3RtcDsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2OwogICAgIHY4aTE2IGZpbHQwLCBmaWx0MTsKLSAgICB2NGkzMiBmaWx0X2gwLCBmaWx0X2gxOwotICAgIHYxNmk4IG1hc2swID0geyAwLCAxLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3LCA4IH07CisgICAgdjhpMTYgZmlsdF9oMCwgZmlsdF9oMTsKKyAgICB2MTZpOCBtYXNrMCA9IExEX1NCKGZmX2hldmNfbWFza19hcnIpOwogICAgIHYxNmk4IG1hc2sxOwogICAgIHY4aTE2IGZpbHRlcl92ZWMsIGNvbnN0X3ZlYzsKLSAgICB2MTZpOCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1OwotICAgIHY4aTE2IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDU7CisgICAgdjE2aTggdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNCwgdmVjNSwgdmVjNiwgdmVjNzsKKyAgICB2OGkxNiBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2OwogICAgIHY0aTMyIGRzdDBfciwgZHN0MF9sLCBkc3QxX3IsIGRzdDFfbCwgZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sOwotICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDIxX3IsIGRzdDQzX3I7Ci0gICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0MjFfbCwgZHN0NDNfbDsKKyAgICB2OGkxNiBkc3QxMF9yLCBkc3QzMl9yLCBkc3Q1NF9yLCBkc3QyMV9yLCBkc3Q0M19yLCBkc3Q2NV9yOworICAgIHY4aTE2IGRzdDEwX2wsIGRzdDMyX2wsIGRzdDU0X2wsIGRzdDIxX2wsIGRzdDQzX2wsIGRzdDY1X2w7CiAKICAgICBzcmMgLT0gKHNyY19zdHJpZGUgKyAxKTsKIApAQCAtMzU5NSwxNyArMzg4OSwxNiBAQAogICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOwogCiAgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKLSAgICB2ZWMwID0gX19tc2FfY2x0aV9zX2IoKHYxNmk4KSBmaWx0ZXJfdmVjLCAwKTsKLSAgICBmaWx0ZXJfdmVjID0gKHY4aTE2KSBfX21zYV9pbHZyX2IodmVjMCwgKHYxNmk4KSBmaWx0ZXJfdmVjKTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOwogCi0gICAgU1BMQVRJX1cyX1NXKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgIFNQTEFUSV9XMl9TSChmaWx0ZXJfdmVjLCAwLCBmaWx0X2gwLCBmaWx0X2gxKTsKIAogICAgIG1hc2sxID0gbWFzazAgKyAyOwogCiAgICAgY29uc3RfdmVjID0gX19tc2FfbGRpX2goMTI4KTsKICAgICBjb25zdF92ZWMgPDw9IDY7CiAKLSAgICBmb3IgKGNudCA9IHdpZHRoID4+IDM7IGNudC0tOykgeworICAgIGZvciAoY250ID0gd2lkdGg4bXVsdDsgY250LS07KSB7CiAgICAgICAgIHNyY190bXAgPSBzcmM7CiAgICAgICAgIGRzdF90bXAgPSBkc3Q7CiAKQEAgLTM2MzQsNTkgKzM5MjcsNDggQEAKICAgICAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYpOwogCiAgICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzQsIHNyYzQsIHNyYzQsIG1hc2swLCBtYXNrMSwgdmVjMiwgdmVjMyk7CisgICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisgICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisKICAgICAgICAgICAgIGRzdDMgPSBjb25zdF92ZWM7CisgICAgICAgICAgICBkc3Q0ID0gY29uc3RfdmVjOworICAgICAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKKyAgICAgICAgICAgIGRzdDYgPSBjb25zdF92ZWM7CiAgICAgICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QzLCBkc3QzKTsKKyAgICAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOworICAgICAgICAgICAgRFBBRERfU0IyX1NIKHZlYzQsIHZlYzUsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7CisgICAgICAgICAgICBEUEFERF9TQjJfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBkc3Q2LCBkc3Q2KTsKIAogICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgICAgICBJTFZSTF9IMl9TSChkc3Q0LCBkc3QzLCBkc3Q0M19yLCBkc3Q0M19sKTsKKyAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDU0X3IsIGRzdDU0X2wpOworICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NiwgZHN0NSwgZHN0NjVfciwgZHN0NjVfbCk7CisKICAgICAgICAgICAgIGRzdDBfciA9IEhFVkNfRklMVF80VEFQKGRzdDEwX3IsIGRzdDMyX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwogICAgICAgICAgICAgZHN0MF9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfbCwgZHN0MzJfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0KLSAgICAgICAgICAgIGRzdDBfciA+Pj0gNjsKLSAgICAgICAgICAgIGRzdDBfbCA+Pj0gNjsKLQotICAgICAgICAgICAgLyogcm93IDQgKi8KLSAgICAgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMwLCB2ZWMxKTsKLSAgICAgICAgICAgIGRzdDQgPSBjb25zdF92ZWM7Ci0gICAgICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q0LCBkc3Q0KTsKLQotICAgICAgICAgICAgSUxWUkxfSDJfU0goZHN0NCwgZHN0MywgZHN0NDNfciwgZHN0NDNfbCk7CiAgICAgICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKICAgICAgICAgICAgIGRzdDFfbCA9IEhFVkNfRklMVF80VEFQKGRzdDIxX2wsIGRzdDQzX2wsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0MV9yID4+PSA2OwotICAgICAgICAgICAgZHN0MV9sID4+PSA2OworICAgICAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0NTRfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDY1X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0NjVfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CiAKLSAgICAgICAgICAgIC8qIHJvdyA1ICovCi0gICAgICAgICAgICBWU0hGX0IyX1NCKHNyYzUsIHNyYzUsIHNyYzUsIHNyYzUsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7Ci0gICAgICAgICAgICBkc3Q1ID0gY29uc3RfdmVjOwotICAgICAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0NSwgZHN0NSk7Ci0KLSAgICAgICAgICAgIElMVlJMX0gyX1NIKGRzdDUsIGRzdDQsIGRzdDEwX3IsIGRzdDEwX2wpOwotICAgICAgICAgICAgZHN0Ml9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MzJfciwgZHN0MTBfciwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0gICAgICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3QxMF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKLQotICAgICAgICAgICAgZHN0Ml9yID4+PSA2OwotICAgICAgICAgICAgZHN0Ml9sID4+PSA2OwotCi0gICAgICAgICAgICAvKiByb3cgNiAqLwotICAgICAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmM2LCBzcmM2LCBzcmM2LCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOwotICAgICAgICAgICAgZHN0MiA9IGNvbnN0X3ZlYzsKLSAgICAgICAgICAgIERQQUREX1NCMl9TSCh2ZWMwLCB2ZWMxLCBmaWx0MCwgZmlsdDEsIGRzdDIsIGRzdDIpOwotCi0gICAgICAgICAgICBJTFZSTF9IMl9TSChkc3QyLCBkc3Q1LCBkc3QyMV9yLCBkc3QyMV9sKTsKLSAgICAgICAgICAgIGRzdDNfciA9IEhFVkNfRklMVF80VEFQKGRzdDQzX3IsIGRzdDIxX3IsIGZpbHRfaDAsIGZpbHRfaDEpOwotICAgICAgICAgICAgZHN0M19sID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfbCwgZHN0MjFfbCwgZmlsdF9oMCwgZmlsdF9oMSk7Ci0KLSAgICAgICAgICAgIGRzdDNfciA+Pj0gNjsKLSAgICAgICAgICAgIGRzdDNfbCA+Pj0gNjsKKyAgICAgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICAgICAgU1JBXzRWKGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbCwgNik7CiAKICAgICAgICAgICAgIFBDS0VWX0g0X1NXKGRzdDBfbCwgZHN0MF9yLCBkc3QxX2wsIGRzdDFfciwKICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDJfbCwgZHN0Ml9yLCBkc3QzX2wsIGRzdDNfciwKICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7CiAKLSAgICAgICAgICAgIFNUX1NXMihkc3QwX3IsIGRzdDFfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3RfdG1wICs9ICgyICogZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9TVzIoZHN0Ml9yLCBkc3QzX3IsIGRzdF90bXAsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0X3RtcCArPSAoMiAqIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgU1RfU1c0KGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfciwgZHN0X3RtcCwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBkc3RfdG1wICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgICAgIGRzdDEwX3IgPSBkc3Q1NF9yOworICAgICAgICAgICAgZHN0MTBfbCA9IGRzdDU0X2w7CisgICAgICAgICAgICBkc3QyMV9yID0gZHN0NjVfcjsKKyAgICAgICAgICAgIGRzdDIxX2wgPSBkc3Q2NV9sOworICAgICAgICAgICAgZHN0MiA9IGRzdDY7CiAgICAgICAgIH0KIAogICAgICAgICBzcmMgKz0gODsKQEAgLTM3MDUsMTMgKzM5ODcsMTYgQEAKIAogICAgIGlmICgyID09IGhlaWdodCkgewogICAgICAgICBoZXZjX2h2XzR0Xzh4Ml9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3kpOworICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgaGV2Y19odl80dF84bXVsdHg0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIDEpOwogICAgIH0gZWxzZSBpZiAoNiA9PSBoZWlnaHQpIHsKICAgICAgICAgaGV2Y19odl80dF84eDZfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95KTsKICAgICB9IGVsc2UgaWYgKDAgPT0gKGhlaWdodCAlIDQpKSB7CiAgICAgICAgIGhldmNfaHZfNHRfOG11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCAxKTsKICAgICB9CiB9CiAKQEAgLTM3MjMsMTIgKzQwMDgsMTY5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKLSAgICBoZXZjX2h2XzR0XzhtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgOCk7CisgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDhfdCAqc3JjX3RtcDsKKyAgICBpbnQxNl90ICpkc3RfdG1wOworICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOworICAgIHYxNmk4IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIHZlYzUsIHZlYzYsIHZlYzc7CisgICAgdjE2aTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazM7CisgICAgdjhpMTYgZmlsdDAsIGZpbHQxLCBmaWx0X2gwLCBmaWx0X2gxLCBmaWx0ZXJfdmVjLCBjb25zdF92ZWM7CisgICAgdjhpMTYgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0MTAsIGRzdDIxLCBkc3QyMiwgZHN0NzM7CisgICAgdjhpMTYgZHN0ODQsIGRzdDk1LCBkc3QxMDYsIGRzdDc2X3IsIGRzdDk4X3IsIGRzdDg3X3IsIGRzdDEwOV9yOworICAgIHY4aTE2IGRzdDEwX3IsIGRzdDMyX3IsIGRzdDU0X3IsIGRzdDIxX3IsIGRzdDQzX3IsIGRzdDY1X3I7CisgICAgdjhpMTYgZHN0MTBfbCwgZHN0MzJfbCwgZHN0NTRfbCwgZHN0MjFfbCwgZHN0NDNfbCwgZHN0NjVfbDsKKyAgICB2NGkzMiBkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIGRzdDJfciwgZHN0Ml9sLCBkc3QzX3IsIGRzdDNfbDsKKyAgICB2NGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwogCi0gICAgaGV2Y19odl80dF80d19tc2Eoc3JjICsgOCwgc3JjX3N0cmlkZSwgZHN0ICsgOCwgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCk7CisgICAgc3JjIC09IChzcmNfc3RyaWRlICsgMSk7CiAKKyAgICBmaWx0ZXJfdmVjID0gTERfU0goZmlsdGVyX3gpOworICAgIFNQTEFUSV9IMl9TSChmaWx0ZXJfdmVjLCAwLCAxLCBmaWx0MCwgZmlsdDEpOworCisgICAgZmlsdGVyX3ZlYyA9IExEX1NIKGZpbHRlcl95KTsKKyAgICBVTlBDS19SX1NCX1NIKGZpbHRlcl92ZWMsIGZpbHRlcl92ZWMpOworCisgICAgU1BMQVRJX1cyX1NIKGZpbHRlcl92ZWMsIDAsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgbWFzazAgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyKTsKKyAgICBtYXNrMSA9IG1hc2swICsgMjsKKworICAgIGNvbnN0X3ZlYyA9IF9fbXNhX2xkaV9oKDEyOCk7CisgICAgY29uc3RfdmVjIDw8PSA2OworCisgICAgc3JjX3RtcCA9IHNyYzsKKyAgICBkc3RfdG1wID0gZHN0OworCisgICAgTERfU0IzKHNyY190bXAsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIpOworICAgIHNyY190bXAgKz0gKDMgKiBzcmNfc3RyaWRlKTsKKworICAgIFhPUklfQjNfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIpOworCisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMwLCBzcmMwLCBzcmMwLCBtYXNrMCwgbWFzazEsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMSwgc3JjMSwgc3JjMSwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICBWU0hGX0IyX1NCKHNyYzIsIHNyYzIsIHNyYzIsIHNyYzIsIG1hc2swLCBtYXNrMSwgdmVjNCwgdmVjNSk7CisKKyAgICBkc3QwID0gY29uc3RfdmVjOworICAgIGRzdDEgPSBjb25zdF92ZWM7CisgICAgZHN0MiA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QwLCBkc3QwKTsKKyAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3QxLCBkc3QxKTsKKyAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3QyLCBkc3QyKTsKKworICAgIElMVlJMX0gyX1NIKGRzdDEsIGRzdDAsIGRzdDEwX3IsIGRzdDEwX2wpOworICAgIElMVlJMX0gyX1NIKGRzdDIsIGRzdDEsIGRzdDIxX3IsIGRzdDIxX2wpOworCisgICAgZm9yIChsb29wX2NudCA9IDQ7IGxvb3BfY250LS07KSB7CisgICAgICAgIExEX1NCNChzcmNfdG1wLCBzcmNfc3RyaWRlLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKyAgICAgICAgc3JjX3RtcCArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmMzLCBzcmM0LCBzcmM1LCBzcmM2KTsKKworICAgICAgICBWU0hGX0IyX1NCKHNyYzMsIHNyYzMsIHNyYzMsIHNyYzMsIG1hc2swLCBtYXNrMSwgdmVjMCwgdmVjMSk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNCwgc3JjNCwgc3JjNCwgc3JjNCwgbWFzazAsIG1hc2sxLCB2ZWMyLCB2ZWMzKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM1LCBzcmM1LCBzcmM1LCBzcmM1LCBtYXNrMCwgbWFzazEsIHZlYzQsIHZlYzUpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzYsIHNyYzYsIHNyYzYsIHNyYzYsIG1hc2swLCBtYXNrMSwgdmVjNiwgdmVjNyk7CisKKyAgICAgICAgZHN0MyA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0NCA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0NSA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0NiA9IGNvbnN0X3ZlYzsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzAsIHZlYzEsIGZpbHQwLCBmaWx0MSwgZHN0MywgZHN0Myk7CisgICAgICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDQsIGRzdDQpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3Q1LCBkc3Q1KTsKKyAgICAgICAgRFBBRERfU0IyX1NIKHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MSwgZHN0NiwgZHN0Nik7CisKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0MywgZHN0MiwgZHN0MzJfciwgZHN0MzJfbCk7CisgICAgICAgIElMVlJMX0gyX1NIKGRzdDQsIGRzdDMsIGRzdDQzX3IsIGRzdDQzX2wpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q1LCBkc3Q0LCBkc3Q1NF9yLCBkc3Q1NF9sKTsKKyAgICAgICAgSUxWUkxfSDJfU0goZHN0NiwgZHN0NSwgZHN0NjVfciwgZHN0NjVfbCk7CisKKyAgICAgICAgZHN0MF9yID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDBfbCA9IEhFVkNfRklMVF80VEFQKGRzdDEwX2wsIGRzdDMyX2wsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QxX3IgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0MV9sID0gSEVWQ19GSUxUXzRUQVAoZHN0MjFfbCwgZHN0NDNfbCwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDJfciA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICBkc3QyX2wgPSBIRVZDX0ZJTFRfNFRBUChkc3QzMl9sLCBkc3Q1NF9sLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgZHN0M19yID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIGRzdDNfbCA9IEhFVkNfRklMVF80VEFQKGRzdDQzX2wsIGRzdDY1X2wsIGZpbHRfaDAsIGZpbHRfaDEpOworCisgICAgICAgIFNSQV80Vihkc3QwX3IsIGRzdDBfbCwgZHN0MV9yLCBkc3QxX2wsIDYpOworICAgICAgICBTUkFfNFYoZHN0Ml9yLCBkc3QyX2wsIGRzdDNfciwgZHN0M19sLCA2KTsKKyAgICAgICAgUENLRVZfSDRfU1coZHN0MF9sLCBkc3QwX3IsIGRzdDFfbCwgZHN0MV9yLCBkc3QyX2wsIGRzdDJfciwgZHN0M19sLAorICAgICAgICAgICAgICAgICAgICBkc3QzX3IsIGRzdDBfciwgZHN0MV9yLCBkc3QyX3IsIGRzdDNfcik7CisgICAgICAgIFNUX1NXNChkc3QwX3IsIGRzdDFfciwgZHN0Ml9yLCBkc3QzX3IsIGRzdF90bXAsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3RfdG1wICs9ICg0ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgZHN0MTBfciA9IGRzdDU0X3I7CisgICAgICAgIGRzdDEwX2wgPSBkc3Q1NF9sOworICAgICAgICBkc3QyMV9yID0gZHN0NjVfcjsKKyAgICAgICAgZHN0MjFfbCA9IGRzdDY1X2w7CisgICAgICAgIGRzdDIgPSBkc3Q2OworICAgIH0KKworICAgIHNyYyArPSA4OworICAgIGRzdCArPSA4OworCisgICAgbWFzazIgPSBMRF9TQihmZl9oZXZjX21hc2tfYXJyICsgMTYpOworICAgIG1hc2szID0gbWFzazIgKyAyOworCisgICAgTERfU0IzKHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgc3JjICs9ICgzICogc3JjX3N0cmlkZSk7CisgICAgWE9SSV9CM18xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMik7CisgICAgVlNIRl9CMl9TQihzcmMwLCBzcmMxLCBzcmMwLCBzcmMxLCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOworICAgIFZTSEZfQjJfU0Ioc3JjMSwgc3JjMiwgc3JjMSwgc3JjMiwgbWFzazIsIG1hc2szLCB2ZWMyLCB2ZWMzKTsKKyAgICBkc3QxMCA9IGNvbnN0X3ZlYzsKKyAgICBkc3QyMSA9IGNvbnN0X3ZlYzsKKyAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3QxMCwgZHN0MTApOworICAgIERQQUREX1NCMl9TSCh2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDEsIGRzdDIxLCBkc3QyMSk7CisgICAgSUxWUkxfSDJfU0goZHN0MjEsIGRzdDEwLCBkc3QxMF9yLCBkc3QyMV9yKTsKKyAgICBkc3QyMiA9ICh2OGkxNikgX19tc2Ffc3BsYXRpX2QoKHYyaTY0KSBkc3QyMSwgMSk7CisKKyAgICBmb3IgKGxvb3BfY250ID0gMjsgbG9vcF9jbnQtLTspIHsKKyAgICAgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjOSwKKyAgICAgICAgICAgICAgIHNyYzEwKTsKKyAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFhPUklfQjhfMTI4X1NCKHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmMzLCBzcmM3LCBzcmMzLCBzcmM3LCBtYXNrMiwgbWFzazMsIHZlYzAsIHZlYzEpOworICAgICAgICBWU0hGX0IyX1NCKHNyYzQsIHNyYzgsIHNyYzQsIHNyYzgsIG1hc2syLCBtYXNrMywgdmVjMiwgdmVjMyk7CisgICAgICAgIFZTSEZfQjJfU0Ioc3JjNSwgc3JjOSwgc3JjNSwgc3JjOSwgbWFzazIsIG1hc2szLCB2ZWM0LCB2ZWM1KTsKKyAgICAgICAgVlNIRl9CMl9TQihzcmM2LCBzcmMxMCwgc3JjNiwgc3JjMTAsIG1hc2syLCBtYXNrMywgdmVjNiwgdmVjNyk7CisKKyAgICAgICAgZHN0NzMgPSBjb25zdF92ZWM7CisgICAgICAgIGRzdDg0ID0gY29uc3RfdmVjOworICAgICAgICBkc3Q5NSA9IGNvbnN0X3ZlYzsKKyAgICAgICAgZHN0MTA2ID0gY29uc3RfdmVjOworICAgICAgICBEUEFERF9TQjJfU0godmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQxLCBkc3Q3MywgZHN0NzMpOworICAgICAgICBEUEFERF9TQjJfU0godmVjMiwgdmVjMywgZmlsdDAsIGZpbHQxLCBkc3Q4NCwgZHN0ODQpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNCwgdmVjNSwgZmlsdDAsIGZpbHQxLCBkc3Q5NSwgZHN0OTUpOworICAgICAgICBEUEFERF9TQjJfU0godmVjNiwgdmVjNywgZmlsdDAsIGZpbHQxLCBkc3QxMDYsIGRzdDEwNik7CisKKyAgICAgICAgZHN0MzJfciA9IF9fbXNhX2lsdnJfaChkc3Q3MywgZHN0MjIpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q4NCwgZHN0NzMsIGRzdDQzX3IsIGRzdDg3X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3Q5NSwgZHN0ODQsIGRzdDU0X3IsIGRzdDk4X3IpOworICAgICAgICBJTFZSTF9IMl9TSChkc3QxMDYsIGRzdDk1LCBkc3Q2NV9yLCBkc3QxMDlfcik7CisgICAgICAgIGRzdDIyID0gKHY4aTE2KSBfX21zYV9zcGxhdGlfZCgodjJpNjQpIGRzdDczLCAxKTsKKyAgICAgICAgZHN0NzZfciA9IF9fbXNhX2lsdnJfaChkc3QyMiwgZHN0MTA2KTsKKworICAgICAgICB0bXAwID0gSEVWQ19GSUxUXzRUQVAoZHN0MTBfciwgZHN0MzJfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIHRtcDEgPSBIRVZDX0ZJTFRfNFRBUChkc3QyMV9yLCBkc3Q0M19yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgdG1wMiA9IEhFVkNfRklMVF80VEFQKGRzdDMyX3IsIGRzdDU0X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICB0bXAzID0gSEVWQ19GSUxUXzRUQVAoZHN0NDNfciwgZHN0NjVfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIHRtcDQgPSBIRVZDX0ZJTFRfNFRBUChkc3Q1NF9yLCBkc3Q3Nl9yLCBmaWx0X2gwLCBmaWx0X2gxKTsKKyAgICAgICAgdG1wNSA9IEhFVkNfRklMVF80VEFQKGRzdDY1X3IsIGRzdDg3X3IsIGZpbHRfaDAsIGZpbHRfaDEpOworICAgICAgICB0bXA2ID0gSEVWQ19GSUxUXzRUQVAoZHN0NzZfciwgZHN0OThfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisgICAgICAgIHRtcDcgPSBIRVZDX0ZJTFRfNFRBUChkc3Q4N19yLCBkc3QxMDlfciwgZmlsdF9oMCwgZmlsdF9oMSk7CisKKyAgICAgICAgU1JBXzRWKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDYpOworICAgICAgICBTUkFfNFYodG1wNCwgdG1wNSwgdG1wNiwgdG1wNywgNik7CisgICAgICAgIFBDS0VWX0g0X1NXKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDIsIHRtcDUsIHRtcDQsIHRtcDcsIHRtcDYsIHRtcDAsIHRtcDEsCisgICAgICAgICAgICAgICAgICAgIHRtcDIsIHRtcDMpOworICAgICAgICBTVDh4OF9VQih0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBkc3QsIDIgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CisKKyAgICAgICAgZHN0MTBfciA9IGRzdDk4X3I7CisgICAgICAgIGRzdDIxX3IgPSBkc3QxMDlfcjsKKyAgICAgICAgZHN0MjIgPSAodjhpMTYpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgZHN0MTA2LCAxKTsKKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfNHRfMTZ3X21zYSh1aW50OF90ICpzcmMsCkBAIC0zNzM5LDggKzQxODEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGhldmNfaHZfNHRfOG11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCAxNik7CisgICAgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIGhldmNfaHZfNHRfOG11bHR4NF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoZXZjX2h2XzR0XzhtdWx0eDRtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDIpOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgaGV2Y19odl80dF8yNHdfbXNhKHVpbnQ4X3QgKnNyYywKQEAgLTM3NTIsNyArNDE5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaGV2Y19odl80dF84bXVsdHg0bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfeCwgZmlsdGVyX3ksIGhlaWdodCwgMyk7CiB9CiAKIHN0YXRpYyB2b2lkIGhldmNfaHZfNHRfMzJ3X21zYSh1aW50OF90ICpzcmMsCkBAIC0zNzY0LDcgKzQyMTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIGhldmNfaHZfNHRfOG11bHR4NG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl94LCBmaWx0ZXJfeSwgaGVpZ2h0LCAzMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQsIDQpOwogfQogCiAjZGVmaW5lIE1DX0NPUFkoV0lEVEgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTM3OTEsMTkgKzQyMzgsMTkgQEAKIAogI3VuZGVmIE1DX0NPUFkKIAotI2RlZmluZSBNQyhQRUwsIERJUiwgV0lEVEgsIFRBUCwgRElSMSwgRklMVF9ESVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXZvaWQgZmZfaGV2Y19wdXRfaGV2Y18jI1BFTCMjXyMjRElSIyNXSURUSCMjXzhfbXNhKGludDE2X3QgKmRzdCwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG14LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludDhfdCAqZmlsdGVyID0gZmZfaGV2Y18jI1BFTCMjX2ZpbHRlcnNbRklMVF9ESVIgLSAxXTsgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaGV2Y18jI0RJUjEjI18jI1RBUCMjdF8jI1dJRFRIIyN3X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1BCX1NJWkUsIGZpbHRlciwgaGVpZ2h0KTsgICAgIFwKKyNkZWZpbmUgTUMoUEVMLCBESVIsIFdJRFRILCBUQVAsIERJUjEsIEZJTFRfRElSKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjXyMjUEVMIyNfIyNESVIjI1dJRFRIIyNfOF9tc2EoaW50MTZfdCAqZHN0LCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IG15LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQ4X3QgKmZpbHRlciA9IGZmX2hldmNfIyNQRUwjI19maWx0ZXJzW0ZJTFRfRElSIC0gMV07ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaGV2Y18jI0RJUjEjI18jI1RBUCMjdF8jI1dJRFRIIyN3X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9QQl9TSVpFLCBmaWx0ZXIsIGhlaWdodCk7ICAgXAogfQogCiBNQyhxcGVsLCBoLCA0LCA4LCBoeiwgbXgpOwpAQCAtMzg0MiwzNyArNDI4OSwzNyBAQAogCiAjdW5kZWYgTUMKIAotI2RlZmluZSBNQ19IVihQRUwsIERJUiwgV0lEVEgsIFRBUCwgRElSMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdm9pZCBmZl9oZXZjX3B1dF9oZXZjXyMjUEVMIyNfIyNESVIjI1dJRFRIIyNfOF9tc2EoaW50MTZfdCAqZHN0LCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteCwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBteSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgpICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ggPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteCAtIDFdOyAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kgPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteSAtIDFdOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGhldmNfIyNESVIxIyNfIyNUQVAjI3RfIyNXSURUSCMjd19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIE1BWF9QQl9TSVpFLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOyAgICAgICAgXAorI2RlZmluZSBNQ19IVihQRUwsIFdJRFRILCBUQVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9oZXZjX3B1dF9oZXZjXyMjUEVMIyNfaHYjI1dJRFRIIyNfOF9tc2EoaW50MTZfdCAqZHN0LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY19zdHJpZGUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXgsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbXksICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ggPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteCAtIDFdOyAgICAgICAgICAgXAorICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3kgPSBmZl9oZXZjXyMjUEVMIyNfZmlsdGVyc1tteSAtIDFdOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGhldmNfaHZfIyNUQVAjI3RfIyNXSURUSCMjd19tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIE1BWF9QQl9TSVpFLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGZpbHRlcl95LCBoZWlnaHQpOyAgXAogfQogCi1NQ19IVihxcGVsLCBodiwgNCwgOCwgaHYpOwotTUNfSFYocXBlbCwgaHYsIDgsIDgsIGh2KTsKLU1DX0hWKHFwZWwsIGh2LCAxMiwgOCwgaHYpOwotTUNfSFYocXBlbCwgaHYsIDE2LCA4LCBodik7Ci1NQ19IVihxcGVsLCBodiwgMjQsIDgsIGh2KTsKLU1DX0hWKHFwZWwsIGh2LCAzMiwgOCwgaHYpOwotTUNfSFYocXBlbCwgaHYsIDQ4LCA4LCBodik7Ci1NQ19IVihxcGVsLCBodiwgNjQsIDgsIGh2KTsKK01DX0hWKHFwZWwsIDQsIDgpOworTUNfSFYocXBlbCwgOCwgOCk7CitNQ19IVihxcGVsLCAxMiwgOCk7CitNQ19IVihxcGVsLCAxNiwgOCk7CitNQ19IVihxcGVsLCAyNCwgOCk7CitNQ19IVihxcGVsLCAzMiwgOCk7CitNQ19IVihxcGVsLCA0OCwgOCk7CitNQ19IVihxcGVsLCA2NCwgOCk7CiAKLU1DX0hWKGVwZWwsIGh2LCA0LCA0LCBodik7Ci1NQ19IVihlcGVsLCBodiwgNiwgNCwgaHYpOwotTUNfSFYoZXBlbCwgaHYsIDgsIDQsIGh2KTsKLU1DX0hWKGVwZWwsIGh2LCAxMiwgNCwgaHYpOwotTUNfSFYoZXBlbCwgaHYsIDE2LCA0LCBodik7Ci1NQ19IVihlcGVsLCBodiwgMjQsIDQsIGh2KTsKLU1DX0hWKGVwZWwsIGh2LCAzMiwgNCwgaHYpOworTUNfSFYoZXBlbCwgNCwgNCk7CitNQ19IVihlcGVsLCA2LCA0KTsKK01DX0hWKGVwZWwsIDgsIDQpOworTUNfSFYoZXBlbCwgMTIsIDQpOworTUNfSFYoZXBlbCwgMTYsIDQpOworTUNfSFYoZXBlbCwgMjQsIDQpOworTUNfSFYoZXBlbCwgMzIsIDQpOwogCiAjdW5kZWYgTUNfSFYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9oZXZjcHJlZF9pbml0X21pcHMuYyBiL2xpYmF2Y29kZWMvbWlwcy9oZXZjcHJlZF9pbml0X21pcHMuYwppbmRleCAzMzFjZmFjLi5lOTg3Njk4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaGV2Y3ByZWRfaW5pdF9taXBzLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2hldmNwcmVkX2luaXRfbWlwcy5jCkBAIC0xOCw3ICsxOCw4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgImxpYmF2Y29kZWMvaGV2Yy5oIgorI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9taXBzL2hldmNwcmVkX21pcHMuaCIKIAogI2lmIEhBVkVfTVNBCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaGV2Y3ByZWRfbWlwcy5oIGIvbGliYXZjb2RlYy9taXBzL2hldmNwcmVkX21pcHMuaAppbmRleCAxMmY1N2EyLi5mMjJmZWZmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaGV2Y3ByZWRfbWlwcy5oCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oZXZjcHJlZF9taXBzLmgKQEAgLTIxLDcgKzIxLDcgQEAKICNpZm5kZWYgQVZDT0RFQ19NSVBTX0hFVkNQUkVEX01JUFNfSAogI2RlZmluZSBBVkNPREVDX01JUFNfSEVWQ1BSRURfTUlQU19ICiAKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2hldmNkc3AuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2hldmNwcmVkLmgiCiAKIHZvaWQgZmZfaGV2Y19pbnRyYV9wcmVkX3BsYW5hcl8wX21zYSh1aW50OF90ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3RvcCwKQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBjX2lkeCwgaW50IG1vZGUpOwogCi12b2lkIGZmX2ludHJhX3ByZWRfOF8xNngxNl9tc2EoSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgY19pZHgpOwotdm9pZCBmZl9pbnRyYV9wcmVkXzhfMzJ4MzJfbXNhKEhFVkNDb250ZXh0ICpzLCBpbnQgeDAsIGludCB5MCwgaW50IGNfaWR4KTsKK3ZvaWQgZmZfaW50cmFfcHJlZF84XzE2eDE2X21zYShzdHJ1Y3QgSEVWQ0NvbnRleHQgKnMsIGludCB4MCwgaW50IHkwLCBpbnQgY19pZHgpOwordm9pZCBmZl9pbnRyYV9wcmVkXzhfMzJ4MzJfbXNhKHN0cnVjdCBIRVZDQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCBjX2lkeCk7CiAKICNlbmRpZiAgLy8gI2lmbmRlZiBBVkNPREVDX01JUFNfSEVWQ1BSRURfTUlQU19ICmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaGV2Y3ByZWRfbXNhLmMgYi9saWJhdmNvZGVjL21pcHMvaGV2Y3ByZWRfbXNhLmMKaW5kZXggNmEzYjI4MS4uOTYzYzY0YyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2hldmNwcmVkX21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9oZXZjcHJlZF9tc2EuYwpAQCAtMTgsNyArMTgsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2hldmMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2hldmNkZWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9nZW5lcmljX21hY3Jvc19tc2EuaCIKICNpbmNsdWRlICJoZXZjcHJlZF9taXBzLmgiCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9ocGVsZHNwX2luaXRfbWlwcy5jIGIvbGliYXZjb2RlYy9taXBzL2hwZWxkc3BfaW5pdF9taXBzLmMKaW5kZXggODJmMjMxMC4uMzYzYTA0NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL2hwZWxkc3BfaW5pdF9taXBzLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL2hwZWxkc3BfaW5pdF9taXBzLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDE1IFBhcmFnIFNhbGFzYWthciAoUGFyYWcuU2FsYXNha2FyQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgWmhvdSBYaWFveW9uZyA8emhvdXhpYW95b25nQGxvb25nc29uLmNuPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC02NSw5ICs2Niw1NyBAQAogfQogI2VuZGlmICAvLyAjaWYgSEFWRV9NU0EKIAorI2lmIEhBVkVfTU1JCitzdGF0aWMgdm9pZCBmZl9ocGVsZHNwX2luaXRfbW1pKEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpCit7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMF0gPSBmZl9wdXRfcGl4ZWxzMTZfOF9tbWk7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMV0gPSBmZl9wdXRfcGl4ZWxzMTZfeDJfOF9tbWk7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMl0gPSBmZl9wdXRfcGl4ZWxzMTZfeTJfOF9tbWk7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bM10gPSBmZl9wdXRfcGl4ZWxzMTZfeHkyXzhfbW1pOworCisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bMF0gPSBmZl9wdXRfcGl4ZWxzOF84X21taTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9waXhlbHM4X3gyXzhfbW1pOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X3BpeGVsczhfeTJfOF9tbWk7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMV1bM10gPSBmZl9wdXRfcGl4ZWxzOF94eTJfOF9tbWk7CisKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsyXVswXSA9IGZmX3B1dF9waXhlbHM0XzhfbW1pOworICAgIGMtPnB1dF9waXhlbHNfdGFiWzJdWzFdID0gZmZfcHV0X3BpeGVsczRfeDJfOF9tbWk7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMl1bMl0gPSBmZl9wdXRfcGl4ZWxzNF95Ml84X21taTsKKyAgICBjLT5wdXRfcGl4ZWxzX3RhYlsyXVszXSA9IGZmX3B1dF9waXhlbHM0X3h5Ml84X21taTsKKworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVswXSA9IGZmX3B1dF9waXhlbHMxNl84X21taTsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bMV0gPSBmZl9wdXRfbm9fcm5kX3BpeGVsczE2X3gyXzhfbW1pOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlswXVsyXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfeTJfOF9tbWk7CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzNdID0gZmZfcHV0X25vX3JuZF9waXhlbHMxNl94eTJfOF9tbWk7CisKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMF0gPSBmZl9wdXRfcGl4ZWxzOF84X21taTsKKyAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMV0gPSBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeDJfOF9tbWk7CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyXzhfbW1pOworICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVszXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94eTJfOF9tbWk7CisKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVswXSA9IGZmX2F2Z19waXhlbHMxNl84X21taTsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsxXSA9IGZmX2F2Z19waXhlbHMxNl94Ml84X21taTsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsyXSA9IGZmX2F2Z19waXhlbHMxNl95Ml84X21taTsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVszXSA9IGZmX2F2Z19waXhlbHMxNl94eTJfOF9tbWk7CisKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVswXSA9IGZmX2F2Z19waXhlbHM4XzhfbW1pOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzFdID0gZmZfYXZnX3BpeGVsczhfeDJfOF9tbWk7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMV1bMl0gPSBmZl9hdmdfcGl4ZWxzOF95Ml84X21taTsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVszXSA9IGZmX2F2Z19waXhlbHM4X3h5Ml84X21taTsKKworICAgIGMtPmF2Z19waXhlbHNfdGFiWzJdWzBdID0gZmZfYXZnX3BpeGVsczRfOF9tbWk7CisgICAgYy0+YXZnX3BpeGVsc190YWJbMl1bMV0gPSBmZl9hdmdfcGl4ZWxzNF94Ml84X21taTsKKyAgICBjLT5hdmdfcGl4ZWxzX3RhYlsyXVsyXSA9IGZmX2F2Z19waXhlbHM0X3kyXzhfbW1pOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzJdWzNdID0gZmZfYXZnX3BpeGVsczRfeHkyXzhfbW1pOworfQorI2VuZGlmICAvLyAjaWYgSEFWRV9NTUkKKwogdm9pZCBmZl9ocGVsZHNwX2luaXRfbWlwcyhIcGVsRFNQQ29udGV4dCAqYywgaW50IGZsYWdzKQogewogI2lmIEhBVkVfTVNBCiAgICAgZmZfaHBlbGRzcF9pbml0X21zYShjLCBmbGFncyk7CiAjZW5kaWYgIC8vICNpZiBIQVZFX01TQQorI2lmIEhBVkVfTU1JCisgICAgZmZfaHBlbGRzcF9pbml0X21taShjLCBmbGFncyk7CisjZW5kaWYgIC8vICNpZiBIQVZFX01NSQogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2hwZWxkc3BfbWlwcy5oIGIvbGliYXZjb2RlYy9taXBzL2hwZWxkc3BfbWlwcy5oCmluZGV4IGY0YWI1M2UuLmY1MjdjMWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9ocGVsZHNwX21pcHMuaAorKysgYi9saWJhdmNvZGVjL21pcHMvaHBlbGRzcF9taXBzLmgKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDE1IFBhcmFnIFNhbGFzYWthciAoUGFyYWcuU2FsYXNha2FyQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgWmhvdSBYaWFveW9uZyA8emhvdXhpYW95b25nQGxvb25nc29uLmNuPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC04NCw0ICs4NSw5MCBAQAogdm9pZCBmZl9hdmdfcGl4ZWxzNF94eTJfbXNhKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKIAordm9pZCBmZl9wdXRfcGl4ZWxzMTZfbDJfOF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBkc3Rfc3RyaWRlLCBpbnQgc3JjX3N0cmlkZTEsIGludCBzcmNfc3RyaWRlMiwKKyAgICBpbnQgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHM4X2wyXzhfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUxLCBpbnQgc3JjX3N0cmlkZTIsCisgICAgaW50IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzNF9sMl84X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAorICAgIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X2wyXzhfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUxLCBpbnQgc3JjX3N0cmlkZTIsCisgICAgaW50IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzOF9sMl84X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAorICAgIGludCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczRfbDJfOF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBkc3Rfc3RyaWRlLCBpbnQgc3JjX3N0cmlkZTEsIGludCBzcmNfc3RyaWRlMiwKKyAgICBpbnQgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfbDJfOF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBkc3Rfc3RyaWRlLCBpbnQgc3JjX3N0cmlkZTEsIGludCBzcmNfc3RyaWRlMiwKKyAgICBpbnQgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF9sMl84X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAorICAgIGludCBoKTsKKwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfeDJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfeTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzMTZfeHkyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzOF94Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDMyX3QgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHM4X3kyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczhfeHkyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczRfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9wdXRfcGl4ZWxzNF94Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDMyX3QgaCk7Cit2b2lkIGZmX3B1dF9waXhlbHM0X3kyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfcHV0X3BpeGVsczRfeHkyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHMxNl94Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDMyX3QgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzMTZfeTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczE2X3h5Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDMyX3QgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDMyX3QgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDMyX3QgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94eTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfeDJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfeTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfeHkyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczhfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzOF94Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDMyX3QgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHM4X3kyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczhfeHkyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczRfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQzMl90IGgpOwordm9pZCBmZl9hdmdfcGl4ZWxzNF94Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDMyX3QgaCk7Cit2b2lkIGZmX2F2Z19waXhlbHM0X3kyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKK3ZvaWQgZmZfYXZnX3BpeGVsczRfeHkyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MzJfdCBoKTsKKwogI2VuZGlmICAvLyAjaWZuZGVmIEFWQ09ERUNfTUlQU19IUEVMRFNQX01JUFNfSApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL2hwZWxkc3BfbW1pLmMgYi9saWJhdmNvZGVjL21pcHMvaHBlbGRzcF9tbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGJlZjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9taXBzL2hwZWxkc3BfbW1pLmMKQEAgLTAsMCArMSwxMTkwIEBACisvKgorICogTG9vbmdzb24gU0lNRCBvcHRpbWl6ZWQgcXBlbGRzcAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBMb29uZ3NvbiBUZWNobm9sb2d5IENvcnBvcmF0aW9uIExpbWl0ZWQKKyAqIENvcHlyaWdodCAoYykgMjAxNiBaaG91IFhpYW95b25nIDx6aG91eGlhb3lvbmdAbG9vbmdzb24uY24+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJocGVsZHNwX21pcHMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2JpdF9kZXB0aF90ZW1wbGF0ZS5jIgorI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL21taXV0aWxzLmgiCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCisKK3ZvaWQgZmZfcHV0X3BpeGVsczRfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBkb3VibGUgZnRtcFsyXTsKKyAgICBtaXBzX3JlZyBhZGRyWzJdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbbGluZV9zaXplXSwgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtwaXhlbHNdLCAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAwXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TV1hDMSglW2Z0bXAxXSwgJVtibG9ja10sICVbbGluZV9zaXplXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtwaXhlbHNdLCAgJVtwaXhlbHNdLCAgICAgICVbYWRkcjFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYmxvY2tdLCAgICVbYmxvY2tdLCAgICAgICAlW2FkZHIxXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbcGl4ZWxzXSwgICAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMF0sICVbcGl4ZWxzXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfU1dYQzEoJVtmdG1wMV0sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4ZWxzXSwgICVbcGl4ZWxzXSwgICAgICAlW2FkZHIxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2Jsb2NrXSwgICAlW2Jsb2NrXSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQURESSAgICIlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDQgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFtibG9ja10iKyZyIihibG9jayksICAgICAgICAgICAgICBbcGl4ZWxzXSIrJnIiKHBpeGVscyksCisgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbbGluZV9zaXplXSJyIigobWlwc19yZWcpbGluZV9zaXplKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKwordm9pZCBmZl9wdXRfcGl4ZWxzOF84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGRvdWJsZSBmdG1wWzJdOworICAgIG1pcHNfcmVnIGFkZHJbM107CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtsaW5lX3NpemVdLCAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMF0sICVbcGl4ZWxzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtwaXhlbHNdLCAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVtibG9ja10sICAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2FkZHIyXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtwaXhlbHNdLCAgJVtwaXhlbHNdLCAgICAgICVbYWRkcjFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYmxvY2tdLCAgICVbYmxvY2tdLCAgICAgICAlW2FkZHIxXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3BpeGVsc10sICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIyXSwgICAlW2Jsb2NrXSwgICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbYWRkcjJdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3BpeGVsc10sICAlW3BpeGVsc10sICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtibG9ja10sICAgJVtibG9ja10sICAgICAgICVbYWRkcjFdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFRSX0FEREkgICAiJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDA0ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKSwKKyAgICAgICAgICBbYWRkcjJdIj0mciIoYWRkclsyXSksCisgICAgICAgICAgW2Jsb2NrXSIrJnIiKGJsb2NrKSwgICAgICAgICAgICAgIFtwaXhlbHNdIismciIocGl4ZWxzKSwKKyAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtsaW5lX3NpemVdInIiKChtaXBzX3JlZylsaW5lX3NpemUpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCit2b2lkIGZmX3B1dF9waXhlbHMxNl84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGRvdWJsZSBmdG1wWzRdOworICAgIG1pcHNfcmVnIGFkZHJbMl07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisgICAgREVDTEFSRV9WQVJfQUREUlQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtsaW5lX3NpemVdLCAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3BpeGVsc10sICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3BpeGVsc10sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtwaXhlbHNdLCAweDA4KQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wM10sICVbYWRkcjBdLCAweDA4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAxXSwgJVtibG9ja10sICVbbGluZV9zaXplXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDA4KQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wM10sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0sIDB4MDgpCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4ZWxzXSwgICVbcGl4ZWxzXSwgICAgICAlW2FkZHIxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2Jsb2NrXSwgICAlW2Jsb2NrXSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3BpeGVsc10sICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3BpeGVsc10sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtwaXhlbHNdLCAweDA4KQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wM10sICVbYWRkcjBdLCAweDA4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAxXSwgJVtibG9ja10sICVbbGluZV9zaXplXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDA4KQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wM10sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0sIDB4MDgpCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4ZWxzXSwgICVbcGl4ZWxzXSwgICAgICAlW2FkZHIxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2Jsb2NrXSwgICAlW2Jsb2NrXSwgICAgICAgJVthZGRyMV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQURESSAgICIlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDQgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSksCisgICAgICAgICAgW2Jsb2NrXSIrJnIiKGJsb2NrKSwgICAgICAgICAgICAgIFtwaXhlbHNdIismciIocGl4ZWxzKSwKKyAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtsaW5lX3NpemVdInIiKChtaXBzX3JlZylsaW5lX3NpemUpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCit2b2lkIGZmX2F2Z19waXhlbHM0XzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZG91YmxlIGZ0bXBbNF07CisgICAgbWlwc19yZWcgYWRkclszXTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIyXSwgICAlW2xpbmVfc2l6ZV0sICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbcGl4ZWxzXSwgICAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMF0sICVbcGl4ZWxzXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtibG9ja10sICAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfU1dYQzEoJVtmdG1wMV0sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4ZWxzXSwgICVbcGl4ZWxzXSwgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2Jsb2NrXSwgICAlW2Jsb2NrXSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3BpeGVsc10sICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDBdLCAlW3BpeGVsc10sIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbYmxvY2tdLCAgICAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbYWRkcjFdLCAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX1NXWEMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgJVtsaW5lX3NpemVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3BpeGVsc10sICAlW3BpeGVsc10sICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtibG9ja10sICAgJVtibG9ja10sICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFRSX0FEREkgICAiJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDA0ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFthZGRyMl0iPSZyIihhZGRyWzJdKSwKKyAgICAgICAgICBbYmxvY2tdIismciIoYmxvY2spLCAgICAgICAgICAgICAgW3BpeGVsc10iKyZyIihwaXhlbHMpLAorICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgIDogW2xpbmVfc2l6ZV0iciIoKG1pcHNfcmVnKWxpbmVfc2l6ZSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3ZvaWQgZmZfYXZnX3BpeGVsczhfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBkb3VibGUgZnRtcFs0XTsKKyAgICBtaXBzX3JlZyBhZGRyWzNdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjJdLCAgICVbbGluZV9zaXplXSwgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3BpeGVsc10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbcGl4ZWxzXSwgICAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW2Jsb2NrXSwgICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAxXSwgJVtibG9ja10sICVbbGluZV9zaXplXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtwaXhlbHNdLCAgJVtwaXhlbHNdLCAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYmxvY2tdLCAgICVbYmxvY2tdLCAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3BpeGVsc10sICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtibG9ja10sICAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wMV0sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4ZWxzXSwgICVbcGl4ZWxzXSwgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2Jsb2NrXSwgICAlW2Jsb2NrXSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQURESSAgICIlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDQgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSksCisgICAgICAgICAgW2FkZHIyXSI9JnIiKGFkZHJbMl0pLAorICAgICAgICAgIFtibG9ja10iKyZyIihibG9jayksICAgICAgICAgICAgICBbcGl4ZWxzXSIrJnIiKHBpeGVscyksCisgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbbGluZV9zaXplXSJyIigobWlwc19yZWcpbGluZV9zaXplKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBkb3VibGUgZnRtcFs4XTsKKyAgICBtaXBzX3JlZyBhZGRyWzNdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjJdLCAgICVbbGluZV9zaXplXSwgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3BpeGVsc10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbcGl4ZWxzXSwgICAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNF0sICVbcGl4ZWxzXSwgMHgwOCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtibG9ja10sICAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA1XSwgJVthZGRyMF0sIDB4MDgpCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA2XSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA3XSwgJVthZGRyMV0sIDB4MDgpCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAxXSwgJVtibG9ja10sICVbbGluZV9zaXplXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbYmxvY2tdLCAweDA4KQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wNV0sICVbYmxvY2tdLCAlW2xpbmVfc2l6ZV0sIDB4MDgpCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4ZWxzXSwgICVbcGl4ZWxzXSwgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2Jsb2NrXSwgICAlW2Jsb2NrXSwgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMF0sICVbcGl4ZWxzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtwaXhlbHNdLCAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA0XSwgJVtwaXhlbHNdLCAweDA4KQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW2Jsb2NrXSwgICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDVdLCAlW2FkZHIwXSwgMHgwOCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDZdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDddLCAlW2FkZHIxXSwgMHgwOCkKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgJVtsaW5lX3NpemVdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA1XSwgJVtibG9ja10sICVbbGluZV9zaXplXSwgMHgwOCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtwaXhlbHNdLCAgJVtwaXhlbHNdLCAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYmxvY2tdLCAgICVbYmxvY2tdLCAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIFBUUl9BRERJICAgIiVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwNCAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSksCisgICAgICAgICAgW2FkZHIyXSI9JnIiKGFkZHJbMl0pLAorICAgICAgICAgIFtibG9ja10iKyZyIihibG9jayksICAgICAgICAgICAgICBbcGl4ZWxzXSIrJnIiKHBpeGVscyksCisgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbbGluZV9zaXplXSJyIigobWlwc19yZWcpbGluZV9zaXplKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKworaW5saW5lIHZvaWQgZmZfcHV0X3BpeGVsczRfbDJfOF9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLAorICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBkc3Rfc3RyaWRlLCBpbnQgc3JjX3N0cmlkZTEsIGludCBzcmNfc3RyaWRlMiwKKyAgICBpbnQgaCkKK3sKKyAgICBkb3VibGUgZnRtcFs0XTsKKyAgICBtaXBzX3JlZyBhZGRyWzVdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjJdLCAgICVbc3JjX3N0cmlkZTFdLCAlW3NyY19zdHJpZGUxXSAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW3NyY19zdHJpZGUyXSwgJVtzcmNfc3RyaWRlMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVtkc3Rfc3RyaWRlXSwgICVbZHN0X3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyYzFdLCAgICAgICAgJVtzcmNfc3RyaWRlMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDBdLCAlW3NyYzFdLCAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMl0sICVbc3JjMl0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbc3JjMl0sICAgICAgICAlW3NyY19zdHJpZGUyXSAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbYWRkcjFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfU1dYQzEoJVtmdG1wMV0sICVbZHN0XSwgJVtkc3Rfc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmMyXSwgICAgJVtzcmMyXSwgICAgICAgICVbYWRkcjNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2FkZHI0XSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3JjMV0sICAgICAgICAlW3NyY19zdHJpZGUxXSAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMF0sICVbc3JjMV0sIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAyXSwgJVtzcmMyXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtzcmMyXSwgICAgICAgICVbc3JjX3N0cmlkZTJdICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMV0sICAgICVbc3JjMV0sICAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9TV1hDMSglW2Z0bXAxXSwgJVtkc3RdLCAlW2RzdF9zdHJpZGVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzJdLCAgICAlW3NyYzJdLCAgICAgICAgJVthZGRyM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbYWRkcjRdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFRSX0FEREkgICAiJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDA0ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFthZGRyMl0iPSZyIihhZGRyWzJdKSwgICAgICAgICAgICBbYWRkcjNdIj0mciIoYWRkclszXSksCisgICAgICAgICAgW2FkZHI0XSI9JnIiKGFkZHJbNF0pLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjMV0iKyZyIihzcmMxKSwKKyAgICAgICAgICBbc3JjMl0iKyZyIihzcmMyKSwgICAgICAgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbZHN0X3N0cmlkZV0iciIoKG1pcHNfcmVnKWRzdF9zdHJpZGUpLAorICAgICAgICAgIFtzcmNfc3RyaWRlMV0iciIoKG1pcHNfcmVnKXNyY19zdHJpZGUxKSwKKyAgICAgICAgICBbc3JjX3N0cmlkZTJdInIiKChtaXBzX3JlZylzcmNfc3RyaWRlMikKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK2lubGluZSB2b2lkIGZmX3B1dF9waXhlbHM4X2wyXzhfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUxLCBpbnQgc3JjX3N0cmlkZTIsCisgICAgaW50IGgpCit7CisgICAgZG91YmxlIGZ0bXBbNF07CisgICAgbWlwc19yZWcgYWRkcls1XTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIyXSwgICAlW3NyY19zdHJpZGUxXSwgJVtzcmNfc3RyaWRlMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVtzcmNfc3RyaWRlMl0sICVbc3JjX3N0cmlkZTJdICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjRdLCAgICVbZHN0X3N0cmlkZV0sICAlW2RzdF9zdHJpZGVdICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMF0sICVbc3JjMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3JjMV0sICAgICAgICAlW3NyY19zdHJpZGUxXSAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMl0sICVbc3JjMl0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbc3JjMl0sICAgICAgICAlW3NyY19zdHJpZGUyXSAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wM10sICVbYWRkcjFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wMV0sICVbZHN0XSwgJVtkc3Rfc3RyaWRlXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmMyXSwgICAgJVtzcmMyXSwgICAgICAgICVbYWRkcjNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2FkZHI0XSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVtzcmMxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzcmMxXSwgICAgICAgICVbc3JjX3N0cmlkZTFdICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtzcmMyXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtzcmMyXSwgICAgICAgICVbc3JjX3N0cmlkZTJdICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMV0sICAgICVbc3JjMV0sICAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAxXSwgJVtkc3RdLCAlW2RzdF9zdHJpZGVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzJdLCAgICAlW3NyYzJdLCAgICAgICAgJVthZGRyM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbYWRkcjRdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFRSX0FEREkgICAiJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDA0ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFthZGRyMl0iPSZyIihhZGRyWzJdKSwgICAgICAgICAgICBbYWRkcjNdIj0mciIoYWRkclszXSksCisgICAgICAgICAgW2FkZHI0XSI9JnIiKGFkZHJbNF0pLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjMV0iKyZyIihzcmMxKSwKKyAgICAgICAgICBbc3JjMl0iKyZyIihzcmMyKSwgICAgICAgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbZHN0X3N0cmlkZV0iciIoKG1pcHNfcmVnKWRzdF9zdHJpZGUpLAorICAgICAgICAgIFtzcmNfc3RyaWRlMV0iciIoKG1pcHNfcmVnKXNyY19zdHJpZGUxKSwKKyAgICAgICAgICBbc3JjX3N0cmlkZTJdInIiKChtaXBzX3JlZylzcmNfc3RyaWRlMikKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK2lubGluZSB2b2lkIGZmX3B1dF9waXhlbHMxNl9sMl84X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAorICAgIGludCBoKQoreworICAgIGRvdWJsZSBmdG1wWzhdOworICAgIG1pcHNfcmVnIGFkZHJbNV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisgICAgREVDTEFSRV9WQVJfQUREUlQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVtzcmNfc3RyaWRlMV0sICVbc3JjX3N0cmlkZTFdICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbc3JjX3N0cmlkZTJdLCAlW3NyY19zdHJpZGUyXSAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI0XSwgICAlW2RzdF9zdHJpZGVdLCAgJVtkc3Rfc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3NyYzFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyYzFdLCAgICAgICAgJVtzcmNfc3RyaWRlMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDRdLCAlW3NyYzFdLCAweDA4KQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNV0sICVbYWRkcjBdLCAweDA4KQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMl0sICVbc3JjMl0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbc3JjMl0sICAgICAgICAlW3NyY19zdHJpZGUyXSAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNl0sICVbc3JjMl0sIDB4MDgpCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMV0sICAgICVbc3JjMV0sICAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wN10sICVbYWRkcjFdLCAweDA4KQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDFdLCAlW2RzdF0sICVbZHN0X3N0cmlkZV0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDRdLCAlW2RzdF0sIDB4MDgpCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA1XSwgJVtkc3RdLCAlW2RzdF9zdHJpZGVdLCAweDA4KQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzJdLCAgICAlW3NyYzJdLCAgICAgICAgJVthZGRyM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbYWRkcjRdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3NyYzFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyYzFdLCAgICAgICAgJVtzcmNfc3RyaWRlMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDRdLCAlW3NyYzFdLCAweDA4KQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNV0sICVbYWRkcjBdLCAweDA4KQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMl0sICVbc3JjMl0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjFdLCAgICVbc3JjMl0sICAgICAgICAlW3NyY19zdHJpZGUyXSAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wNl0sICVbc3JjMl0sIDB4MDgpCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMV0sICAgICVbc3JjMV0sICAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wN10sICVbYWRkcjFdLCAweDA4KQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDFdLCAlW2RzdF0sICVbZHN0X3N0cmlkZV0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDRdLCAlW2RzdF0sIDB4MDgpCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA1XSwgJVtkc3RdLCAlW2RzdF9zdHJpZGVdLCAweDA4KQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzJdLCAgICAlW3NyYzJdLCAgICAgICAgJVthZGRyM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbYWRkcjRdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFRSX0FEREkgICAiJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDA0ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKSwKKyAgICAgICAgICBbYWRkcjJdIj0mciIoYWRkclsyXSksICAgICAgICAgICAgW2FkZHIzXSI9JnIiKGFkZHJbM10pLAorICAgICAgICAgIFthZGRyNF0iPSZyIihhZGRyWzRdKSwKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyYzFdIismciIoc3JjMSksCisgICAgICAgICAgW3NyYzJdIismciIoc3JjMiksICAgICAgICAgICAgICAgIFtoXSIrJnIiKGgpCisgICAgICAgIDogW2RzdF9zdHJpZGVdInIiKChtaXBzX3JlZylkc3Rfc3RyaWRlKSwKKyAgICAgICAgICBbc3JjX3N0cmlkZTFdInIiKChtaXBzX3JlZylzcmNfc3RyaWRlMSksCisgICAgICAgICAgW3NyY19zdHJpZGUyXSJyIigobWlwc19yZWcpc3JjX3N0cmlkZTIpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCitpbmxpbmUgdm9pZCBmZl9hdmdfcGl4ZWxzNF9sMl84X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAorICAgIGludCBoKQoreworICAgIGRvdWJsZSBmdG1wWzZdOworICAgIG1pcHNfcmVnIGFkZHJbNl07CisgICAgREVDTEFSRV9WQVJfTE9XMzI7CisgICAgREVDTEFSRV9WQVJfQUREUlQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMl0sICAgJVtzcmNfc3RyaWRlMV0sICVbc3JjX3N0cmlkZTFdICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjNdLCAgICVbc3JjX3N0cmlkZTJdLCAlW3NyY19zdHJpZGUyXSAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI0XSwgICAlW2RzdF9zdHJpZGVdLCAgJVtkc3Rfc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzcmMxXSwgICAgICAgICVbc3JjX3N0cmlkZTFdICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAwXSwgJVtzcmMxXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW3NyYzJdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW3NyYzJdLCAgICAgICAgJVtzcmNfc3RyaWRlMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDNdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVtkc3RdLCAgICAgICAgICVbZHN0X3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA0XSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNV0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9TV1hDMSglW2Z0bXAxXSwgJVtkc3RdLCAlW2RzdF9zdHJpZGVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzJdLCAgICAlW3NyYzJdLCAgICAgICAgJVthZGRyM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbYWRkcjRdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzcmMxXSwgICAgICAgICVbc3JjX3N0cmlkZTFdICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAwXSwgJVtzcmMxXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW3NyYzJdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW3NyYzJdLCAgICAgICAgJVtzcmNfc3RyaWRlMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDNdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNV0sICAgJVtkc3RdLCAgICAgICAgICVbZHN0X3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXA0XSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wNV0sICVbYWRkcjVdLCAweDAwKQorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9TV1hDMSglW2Z0bXAxXSwgJVtkc3RdLCAlW2RzdF9zdHJpZGVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzJdLCAgICAlW3NyYzJdLCAgICAgICAgJVthZGRyM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbYWRkcjRdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFRSX0FEREkgICAiJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDA0ICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSksCisgICAgICAgICAgW2FkZHIyXSI9JnIiKGFkZHJbMl0pLCAgICAgICAgICAgIFthZGRyM10iPSZyIihhZGRyWzNdKSwKKyAgICAgICAgICBbYWRkcjRdIj0mciIoYWRkcls0XSksICAgICAgICAgICAgW2FkZHI1XSI9JnIiKGFkZHJbNV0pLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjMV0iKyZyIihzcmMxKSwKKyAgICAgICAgICBbc3JjMl0iKyZyIihzcmMyKSwgICAgICAgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbZHN0X3N0cmlkZV0iciIoKG1pcHNfcmVnKWRzdF9zdHJpZGUpLAorICAgICAgICAgIFtzcmNfc3RyaWRlMV0iciIoKG1pcHNfcmVnKXNyY19zdHJpZGUxKSwKKyAgICAgICAgICBbc3JjX3N0cmlkZTJdInIiKChtaXBzX3JlZylzcmNfc3RyaWRlMikKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK2lubGluZSB2b2lkIGZmX2F2Z19waXhlbHM4X2wyXzhfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUxLCBpbnQgc3JjX3N0cmlkZTIsCisgICAgaW50IGgpCit7CisgICAgZG91YmxlIGZ0bXBbNl07CisgICAgbWlwc19yZWcgYWRkcls2XTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIyXSwgICAlW3NyY19zdHJpZGUxXSwgJVtzcmNfc3RyaWRlMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyM10sICAgJVtzcmNfc3RyaWRlMl0sICVbc3JjX3N0cmlkZTJdICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjRdLCAgICVbZHN0X3N0cmlkZV0sICAlW2RzdF9zdHJpZGVdICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMF0sICVbc3JjMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3JjMV0sICAgICAgICAlW3NyY19zdHJpZGUxXSAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW3NyYzJdLCAgICAgICAgJVtzcmNfc3RyaWRlMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3NyYzJdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wM10sICVbYWRkcjFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2RzdF0sICAgICAgICAgJVtkc3Rfc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDRdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA1XSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDFdLCAlW2RzdF0sICVbZHN0X3N0cmlkZV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMl0sICAgICVbc3JjMl0sICAgICAgICAlW2FkZHIzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVthZGRyNF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMF0sICVbc3JjMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3JjMV0sICAgICAgICAlW3NyY19zdHJpZGUxXSAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW3NyYzJdLCAgICAgICAgJVtzcmNfc3RyaWRlMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3NyYzJdLCAweDAwKQorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wM10sICVbYWRkcjFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzFdLCAgICAlW3NyYzFdLCAgICAgICAgJVthZGRyMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHI1XSwgICAlW2RzdF0sICAgICAgICAgJVtkc3Rfc3RyaWRlXSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDRdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA1XSwgJVthZGRyNV0sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDFdLCAlW2RzdF0sICVbZHN0X3N0cmlkZV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMl0sICAgICVbc3JjMl0sICAgICAgICAlW2FkZHIzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVthZGRyNF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQURESSAgICIlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDQgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLCAgICAgICAgICAgIFthZGRyMV0iPSZyIihhZGRyWzFdKSwKKyAgICAgICAgICBbYWRkcjJdIj0mciIoYWRkclsyXSksICAgICAgICAgICAgW2FkZHIzXSI9JnIiKGFkZHJbM10pLAorICAgICAgICAgIFthZGRyNF0iPSZyIihhZGRyWzRdKSwgICAgICAgICAgICBbYWRkcjVdIj0mciIoYWRkcls1XSksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmMxXSIrJnIiKHNyYzEpLAorICAgICAgICAgIFtzcmMyXSIrJnIiKHNyYzIpLCAgICAgICAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtkc3Rfc3RyaWRlXSJyIigobWlwc19yZWcpZHN0X3N0cmlkZSksCisgICAgICAgICAgW3NyY19zdHJpZGUxXSJyIigobWlwc19yZWcpc3JjX3N0cmlkZTEpLAorICAgICAgICAgIFtzcmNfc3RyaWRlMl0iciIoKG1pcHNfcmVnKXNyY19zdHJpZGUyKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKworaW5saW5lIHZvaWQgZmZfYXZnX3BpeGVsczE2X2wyXzhfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwKKyAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgZHN0X3N0cmlkZSwgaW50IHNyY19zdHJpZGUxLCBpbnQgc3JjX3N0cmlkZTIsCisgICAgaW50IGgpCit7CisgICAgZmZfYXZnX3BpeGVsczhfbDJfOF9tbWkoZHN0LCBzcmMxLCBzcmMyLCBkc3Rfc3RyaWRlLCBzcmNfc3RyaWRlMSwKKyAgICAgICAgICAgIHNyY19zdHJpZGUyLCBoKTsKKyAgICBmZl9hdmdfcGl4ZWxzOF9sMl84X21taShkc3QgKyA4LCBzcmMxICsgOCwgc3JjMiArIDgsIGRzdF9zdHJpZGUsCisgICAgICAgICAgICBzcmNfc3RyaWRlMSwgc3JjX3N0cmlkZTIsIGgpOworfQorCit2b2lkIGZmX3B1dF9waXhlbHM0X3gyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZmZfcHV0X3BpeGVsczRfbDJfOF9tbWkoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgMSwgbGluZV9zaXplLCBsaW5lX3NpemUsCisgICAgICAgICAgICBsaW5lX3NpemUsIGgpOworfQorCit2b2lkIGZmX3B1dF9waXhlbHM4X3gyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZmZfcHV0X3BpeGVsczhfbDJfOF9tbWkoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgMSwgbGluZV9zaXplLCBsaW5lX3NpemUsCisgICAgICAgICAgICBsaW5lX3NpemUsIGgpOworfQorCit2b2lkIGZmX3B1dF9waXhlbHMxNl94Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGZmX3B1dF9waXhlbHMxNl9sMl84X21taShibG9jaywgcGl4ZWxzLCBwaXhlbHMgKyAxLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwKKyAgICAgICAgICAgIGxpbmVfc2l6ZSwgaCk7Cit9CisKK3ZvaWQgZmZfYXZnX3BpeGVsczRfeDJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBmZl9hdmdfcGl4ZWxzNF9sMl84X21taShibG9jaywgcGl4ZWxzLCBwaXhlbHMgKyAxLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwKKyAgICAgICAgICAgIGxpbmVfc2l6ZSwgaCk7Cit9CisKK3ZvaWQgZmZfYXZnX3BpeGVsczhfeDJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBmZl9hdmdfcGl4ZWxzOF9sMl84X21taShibG9jaywgcGl4ZWxzLCBwaXhlbHMgKyAxLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwKKyAgICAgICAgICAgIGxpbmVfc2l6ZSwgaCk7Cit9CisKK3ZvaWQgZmZfYXZnX3BpeGVsczE2X3gyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZmZfYXZnX3BpeGVsczhfeDJfOF9tbWkoYmxvY2ssIHBpeGVscywgbGluZV9zaXplLCBoKTsKKyAgICBmZl9hdmdfcGl4ZWxzOF94Ml84X21taShibG9jayArIDgsIHBpeGVscyArIDgsIGxpbmVfc2l6ZSwgaCk7Cit9CisKK2lubGluZSB2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF9sMl84X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IGRzdF9zdHJpZGUsIGludCBzcmNfc3RyaWRlMSwgaW50IHNyY19zdHJpZGUyLAorICAgIGludCBoKQoreworICAgIGRvdWJsZSBmdG1wWzVdOworICAgIG1pcHNfcmVnIGFkZHJbNV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisgICAgREVDTEFSRV9WQVJfQUREUlQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInBjbXBlcWIgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjJdLCAgICVbc3JjX3N0cmlkZTFdLCAlW3NyY19zdHJpZGUxXSAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIzXSwgICAlW3NyY19zdHJpZGUyXSwgJVtzcmNfc3RyaWRlMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyNF0sICAgJVtkc3Rfc3RyaWRlXSwgICVbZHN0X3N0cmlkZV0gICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVtzcmMxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtzcmMxXSwgICAgICAgICVbc3JjX3N0cmlkZTFdICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtzcmMyXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtzcmMyXSwgICAgICAgICVbc3JjX3N0cmlkZTJdICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAzXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMV0sICAgICVbc3JjMV0sICAgICAgICAlW2FkZHIyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAxXSwgJVtkc3RdLCAlW2RzdF9zdHJpZGVdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyYzJdLCAgICAlW3NyYzJdLCAgICAgICAgJVthZGRyM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbYWRkcjRdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDBdLCAlW3NyYzFdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyYzFdLCAgICAgICAgJVtzcmNfc3RyaWRlMV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDJdLCAlW3NyYzJdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW3NyYzJdLCAgICAgICAgJVtzcmNfc3RyaWRlMl0gICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW2FkZHIxXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgICAgICVbYWRkcjJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGF2Z2IgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDFdLCAlW2RzdF0sICVbZHN0X3N0cmlkZV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMl0sICAgICVbc3JjMl0sICAgICAgICAlW2FkZHIzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVthZGRyNF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBQVFJfQURESSAgICIlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDQgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFthZGRyMl0iPSZyIihhZGRyWzJdKSwgICAgICAgICAgICBbYWRkcjNdIj0mciIoYWRkclszXSksCisgICAgICAgICAgW2FkZHI0XSI9JnIiKGFkZHJbNF0pLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjMV0iKyZyIihzcmMxKSwKKyAgICAgICAgICBbc3JjMl0iKyZyIihzcmMyKSwgICAgICAgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbZHN0X3N0cmlkZV0iciIoKG1pcHNfcmVnKWRzdF9zdHJpZGUpLAorICAgICAgICAgIFtzcmNfc3RyaWRlMV0iciIoKG1pcHNfcmVnKXNyY19zdHJpZGUxKSwKKyAgICAgICAgICBbc3JjX3N0cmlkZTJdInIiKChtaXBzX3JlZylzcmNfc3RyaWRlMikKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZmZfcHV0X25vX3JuZF9waXhlbHM4X2wyXzhfbW1pKGJsb2NrLCBwaXhlbHMsIHBpeGVscyArIDEsIGxpbmVfc2l6ZSwKKyAgICAgICAgICAgIGxpbmVfc2l6ZSwgbGluZV9zaXplLCBoKTsKK30KKwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczE2X3gyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyXzhfbW1pKGJsb2NrLCBwaXhlbHMsIGxpbmVfc2l6ZSwgaCk7CisgICAgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyXzhfbW1pKGJsb2NrICsgOCwgcGl4ZWxzICsgOCwgbGluZV9zaXplLCBoKTsKK30KKwordm9pZCBmZl9wdXRfcGl4ZWxzNF95Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGZmX3B1dF9waXhlbHM0X2wyXzhfbW1pKGJsb2NrLCBwaXhlbHMsIHBpeGVscyArIGxpbmVfc2l6ZSwgbGluZV9zaXplLAorICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGgpOworfQorCit2b2lkIGZmX3B1dF9waXhlbHM4X3kyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZmZfcHV0X3BpeGVsczhfbDJfOF9tbWkoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgbGluZV9zaXplLCBsaW5lX3NpemUsCisgICAgICAgICAgICBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7Cit9CisKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X3kyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZmZfcHV0X3BpeGVsczE2X2wyXzhfbW1pKGJsb2NrLCBwaXhlbHMsIHBpeGVscyArIGxpbmVfc2l6ZSwgbGluZV9zaXplLAorICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGgpOworfQorCit2b2lkIGZmX2F2Z19waXhlbHM0X3kyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgZmZfYXZnX3BpeGVsczRfbDJfOF9tbWkoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgbGluZV9zaXplLCBsaW5lX3NpemUsCisgICAgICAgICAgICBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7Cit9CisKK3ZvaWQgZmZfYXZnX3BpeGVsczhfeTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBmZl9hdmdfcGl4ZWxzOF9sMl84X21taShibG9jaywgcGl4ZWxzLCBwaXhlbHMgKyBsaW5lX3NpemUsIGxpbmVfc2l6ZSwKKyAgICAgICAgICAgIGxpbmVfc2l6ZSwgbGluZV9zaXplLCBoKTsKK30KKwordm9pZCBmZl9hdmdfcGl4ZWxzMTZfeTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBmZl9hdmdfcGl4ZWxzOF95Ml84X21taShibG9jaywgcGl4ZWxzLCBsaW5lX3NpemUsIGgpOworICAgIGZmX2F2Z19waXhlbHM4X3kyXzhfbW1pKGJsb2NrICsgOCwgcGl4ZWxzICsgOCwgbGluZV9zaXplLCBoKTsKK30KKwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBmZl9wdXRfbm9fcm5kX3BpeGVsczhfbDJfOF9tbWkoYmxvY2ssIHBpeGVscywgcGl4ZWxzICsgbGluZV9zaXplLAorICAgICAgICAgICAgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgaCk7Cit9CisKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHMxNl95Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml84X21taShibG9jaywgcGl4ZWxzLCBsaW5lX3NpemUsIGgpOworICAgIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml84X21taShibG9jayArIDggLCBwaXhlbHMgKyA4LCBsaW5lX3NpemUsIGgpOworfQorCit2b2lkIGZmX3B1dF9waXhlbHM0X3h5Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIC8qIEZJWE1FIEhJR0ggQklUIERFUFRIICovCisgICAgaW50IGk7CisgICAgY29uc3QgdWludDMyX3QgYSA9IEFWX1JOMzIocGl4ZWxzKTsKKyAgICBjb25zdCB1aW50MzJfdCBiID0gQVZfUk4zMihwaXhlbHMgKyAxKTsKKyAgICB1aW50MzJfdCBsMCA9IChhICYgMHgwMzAzMDMwM1VMKSArCisgICAgICAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCkgKworICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIwMjAyVUw7CisgICAgdWludDMyX3QgaDAgPSAoKGEgJiAweEZDRkNGQ0ZDVUwpID4+IDIpICsKKyAgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgdWludDMyX3QgbDEsIGgxOworCisgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90IGEgPSBBVl9STjMyKHBpeGVscyk7CisgICAgICAgIHVpbnQzMl90IGIgPSBBVl9STjMyKHBpeGVscyArIDEpOworICAgICAgICBsMSA9IChhICYgMHgwMzAzMDMwM1VMKSArCisgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpOworICAgICAgICBoMSA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKworICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgICAgICooKHVpbnQzMl90ICopIGJsb2NrKSA9IGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCk7CisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7CisgICAgICAgIGEgID0gQVZfUk4zMihwaXhlbHMpOworICAgICAgICBiICA9IEFWX1JOMzIocGl4ZWxzICsgMSk7CisgICAgICAgIGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCkgKworICAgICAgICAgICAgICAgICAgMHgwMjAyMDIwMlVMOworICAgICAgICBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKworICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgICAgICooKHVpbnQzMl90ICopIGJsb2NrKSA9IGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCk7CisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7CisgICAgfQorfQorCit2b2lkIGZmX3B1dF9waXhlbHM4X3h5Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworI2lmIDEKKyAgICBkb3VibGUgZnRtcFsxMF07CisgICAgbWlwc19yZWcgYWRkclsyXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVthZGRyMF0sICAgMHgwZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXF3ICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW2FkZHIwXSwgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVthZGRyMF0sICAgMHgwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW2FkZHIwXSwgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzbGxoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgImRsaSAgICAgICAgJVthZGRyMF0sICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXRjMSAgICAgICVbYWRkcjBdLCAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMF0sICVbcGl4ZWxzXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDRdLCAlW3BpeGVsc10sIDB4MDEpCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNoICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzaCAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4ZWxzXSwgICVbcGl4ZWxzXSwgICAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICAiLnAyYWxpZ24gICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtwaXhlbHNdLCAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVthZGRyMV0sIDB4MDEpCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNoICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzaCAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2ggICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNoICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzaCAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2ggICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA0XSwgJVtibG9ja10sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMV0sICAgJVtwaXhlbHNdLCAgICAgICVbYWRkcjBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA0XSwgJVthZGRyMV0sIDB4MDEpCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNoICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzaCAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2ggICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNoICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHVzaCAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2ggICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAwXSwgJVtibG9ja10sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAyICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFtoXSIrJnIiKGgpLCAgICAgICAgICAgICAgICAgICAgICBbcGl4ZWxzXSIrJnIiKHBpeGVscykKKyAgICAgICAgOiBbYmxvY2tdInIiKGJsb2NrKSwgICAgICAgICAgICAgICAgW2xpbmVfc2l6ZV0iciIoKG1pcHNfcmVnKWxpbmVfc2l6ZSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIC8qIEZJWE1FIEhJR0ggQklUIERFUFRIICovCisgICAgaW50IGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgIGludCBpOworICAgICAgICBjb25zdCB1aW50MzJfdCBhID0gQVZfUk4zMihwaXhlbHMpOworICAgICAgICBjb25zdCB1aW50MzJfdCBiID0gQVZfUk4zMihwaXhlbHMgKyAxKTsKKyAgICAgICAgdWludDMyX3QgbDAgPSAoYSAmIDB4MDMwMzAzMDNVTCkgKworICAgICAgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDIwMjAyVUw7CisgICAgICAgIHVpbnQzMl90IGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArCisgICAgICAgICAgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsKKyAgICAgICAgdWludDMyX3QgbDEsIGgxOworCisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IGEgPSBBVl9STjMyKHBpeGVscyk7CisgICAgICAgICAgICB1aW50MzJfdCBiID0gQVZfUk4zMihwaXhlbHMgKyAxKTsKKyAgICAgICAgICAgIGwxID0gKGEgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpOworICAgICAgICAgICAgaDEgPSAoKGEgJiAweEZDRkNGQ0ZDVUwpID4+IDIpICsKKyAgICAgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopIGJsb2NrKSA9IGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCk7CisgICAgICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgICAgICAgICAgYmxvY2sgICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgICAgIGEgID0gQVZfUk4zMihwaXhlbHMpOworICAgICAgICAgICAgYiAgPSBBVl9STjMyKHBpeGVscyArIDEpOworICAgICAgICAgICAgbDAgPSAoYSAmIDB4MDMwMzAzMDNVTCkgKworICAgICAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCkgKworICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMjAyMDJVTDsKKyAgICAgICAgICAgIGgwID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArCisgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKSBibG9jaykgPSBoMCArIGgxICsgKCgobDAgKyBsMSkgPj4gMikgJiAweDBGMEYwRjBGVUwpOworICAgICAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgcGl4ZWxzICs9IDQgLSBsaW5lX3NpemUgKiAoaCArIDEpOworICAgICAgICBibG9jayAgKz0gNCAtIGxpbmVfc2l6ZSAqIGg7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3BpeGVsczE2X3h5Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGZmX3B1dF9waXhlbHM4X3h5Ml84X21taShibG9jaywgcGl4ZWxzLCBsaW5lX3NpemUsIGgpOworICAgIGZmX3B1dF9waXhlbHM4X3h5Ml84X21taShibG9jayArIDgsIHBpeGVscyArIDgsIGxpbmVfc2l6ZSwgaCk7Cit9CisKK3ZvaWQgZmZfYXZnX3BpeGVsczRfeHkyXzhfbW1pKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCisgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCit7CisgICAgLyogRklYTUUgSElHSCBCSVQgREVQVEggKi8KKyAgICBpbnQgaTsKKyAgICBjb25zdCB1aW50MzJfdCBhID0gQVZfUk4zMihwaXhlbHMpOworICAgIGNvbnN0IHVpbnQzMl90IGIgPSBBVl9STjMyKHBpeGVscyArIDEpOworICAgIHVpbnQzMl90IGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKSArCisgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMjAyMDJVTDsKKyAgICB1aW50MzJfdCBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKworICAgICAgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsKKyAgICB1aW50MzJfdCBsMSwgaDE7CisKKyAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpICs9IDIpIHsKKyAgICAgICAgdWludDMyX3QgYSA9IEFWX1JOMzIocGl4ZWxzKTsKKyAgICAgICAgdWludDMyX3QgYiA9IEFWX1JOMzIocGl4ZWxzICsgMSk7CisgICAgICAgIGwxID0gKGEgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCk7CisgICAgICAgIGgxID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArCisgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsKKyAgICAgICAgKigodWludDMyX3QgKikgYmxvY2spID0gcm5kX2F2ZzMyKCooKHVpbnQzMl90ICopIGJsb2NrKSwgaDAgKyBoMSArICgoKGwwICsgbDEpID4+IDIpICYgMHgwRjBGMEYwRlVMKSk7CisgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7CisgICAgICAgIGEgID0gQVZfUk4zMihwaXhlbHMpOworICAgICAgICBiICA9IEFWX1JOMzIocGl4ZWxzICsgMSk7CisgICAgICAgIGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCkgKworICAgICAgICAgICAgICAgICAgMHgwMjAyMDIwMlVMOworICAgICAgICBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKworICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgICAgICooKHVpbnQzMl90ICopIGJsb2NrKSA9IHJuZF9hdmczMigqKCh1aW50MzJfdCAqKSBibG9jayksIGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOworICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgICAgICBibG9jayAgKz0gbGluZV9zaXplOworICAgIH0KK30KKwordm9pZCBmZl9hdmdfcGl4ZWxzOF94eTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICAvKiBGSVhNRSBISUdIIEJJVCBERVBUSCAqLworICAgIGludCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYSA9IEFWX1JOMzIocGl4ZWxzKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYiA9IEFWX1JOMzIocGl4ZWxzICsgMSk7CisgICAgICAgIHVpbnQzMl90IGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyMDIwMlVMOworICAgICAgICB1aW50MzJfdCBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKworICAgICAgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgICAgIHVpbnQzMl90IGwxLCBoMTsKKworICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSArPSAyKSB7CisgICAgICAgICAgICB1aW50MzJfdCBhID0gQVZfUk4zMihwaXhlbHMpOworICAgICAgICAgICAgdWludDMyX3QgYiA9IEFWX1JOMzIocGl4ZWxzICsgMSk7CisgICAgICAgICAgICBsMSA9IChhICYgMHgwMzAzMDMwM1VMKSArCisgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKTsKKyAgICAgICAgICAgIGgxID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArCisgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKSBibG9jaykgPSBybmRfYXZnMzIoKigodWludDMyX3QgKikgYmxvY2spLCBoMCArIGgxICsgKCgobDAgKyBsMSkgPj4gMikgJiAweDBGMEYwRjBGVUwpKTsKKyAgICAgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgICAgICAgICBibG9jayAgKz0gbGluZV9zaXplOworICAgICAgICAgICAgYSAgPSBBVl9STjMyKHBpeGVscyk7CisgICAgICAgICAgICBiICA9IEFWX1JOMzIocGl4ZWxzICsgMSk7CisgICAgICAgICAgICBsMCA9IChhICYgMHgwMzAzMDMwM1VMKSArCisgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKSArCisgICAgICAgICAgICAgICAgICAgICAgMHgwMjAyMDIwMlVMOworICAgICAgICAgICAgaDAgPSAoKGEgJiAweEZDRkNGQ0ZDVUwpID4+IDIpICsKKyAgICAgICAgICAgICAgICAgKChiICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKTsKKyAgICAgICAgICAgICooKHVpbnQzMl90ICopIGJsb2NrKSA9IHJuZF9hdmczMigqKCh1aW50MzJfdCAqKSBibG9jayksIGgwICsgaDEgKyAoKChsMCArIGwxKSA+PiAyKSAmIDB4MEYwRjBGMEZVTCkpOworICAgICAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgcGl4ZWxzICs9IDQgLSBsaW5lX3NpemUgKiAoaCArIDEpOworICAgICAgICBibG9jayAgKz0gNCAtIGxpbmVfc2l6ZSAqIGg7CisgICAgfQorfQorCit2b2lkIGZmX2F2Z19waXhlbHMxNl94eTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICBmZl9hdmdfcGl4ZWxzOF94eTJfOF9tbWkoYmxvY2ssIHBpeGVscywgbGluZV9zaXplLCBoKTsKKyAgICBmZl9hdmdfcGl4ZWxzOF94eTJfOF9tbWkoYmxvY2sgKyA4LCBwaXhlbHMgKyA4LCBsaW5lX3NpemUsIGgpOworfQorCit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94eTJfOF9tbWkodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKK3sKKyAgICAvKiBGSVhNRSBISUdIIEJJVCBERVBUSCAqLworICAgIGludCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYSA9IEFWX1JOMzIocGl4ZWxzKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgYiA9IEFWX1JOMzIocGl4ZWxzICsgMSk7CisgICAgICAgIHVpbnQzMl90IGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAgICAgICAgICAoYiAmIDB4MDMwMzAzMDNVTCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxMDEwMVVMOworICAgICAgICB1aW50MzJfdCBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKworICAgICAgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgICAgIHVpbnQzMl90IGwxLCBoMTsKKworICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSArPSAyKSB7CisgICAgICAgICAgICB1aW50MzJfdCBhID0gQVZfUk4zMihwaXhlbHMpOworICAgICAgICAgICAgdWludDMyX3QgYiA9IEFWX1JOMzIocGl4ZWxzICsgMSk7CisgICAgICAgICAgICBsMSA9IChhICYgMHgwMzAzMDMwM1VMKSArCisgICAgICAgICAgICAgICAgIChiICYgMHgwMzAzMDMwM1VMKTsKKyAgICAgICAgICAgIGgxID0gKChhICYgMHhGQ0ZDRkNGQ1VMKSA+PiAyKSArCisgICAgICAgICAgICAgICAgICgoYiAmIDB4RkNGQ0ZDRkNVTCkgPj4gMik7CisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKSBibG9jaykgPSBoMCArIGgxICsgKCgobDAgKyBsMSkgPj4gMikgJiAweDBGMEYwRjBGVUwpOworICAgICAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgICAgIGJsb2NrICArPSBsaW5lX3NpemU7CisgICAgICAgICAgICBhICA9IEFWX1JOMzIocGl4ZWxzKTsKKyAgICAgICAgICAgIGIgID0gQVZfUk4zMihwaXhlbHMgKyAxKTsKKyAgICAgICAgICAgIGwwID0gKGEgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAgICAgKGIgJiAweDAzMDMwMzAzVUwpICsKKyAgICAgICAgICAgICAgICAgICAgICAweDAxMDEwMTAxVUw7CisgICAgICAgICAgICBoMCA9ICgoYSAmIDB4RkNGQ0ZDRkNVTCkgPj4gMikgKworICAgICAgICAgICAgICAgICAoKGIgJiAweEZDRkNGQ0ZDVUwpID4+IDIpOworICAgICAgICAgICAgKigodWludDMyX3QgKikgYmxvY2spID0gaDAgKyBoMSArICgoKGwwICsgbDEpID4+IDIpICYgMHgwRjBGMEYwRlVMKTsKKyAgICAgICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgICAgICAgICBibG9jayAgKz0gbGluZV9zaXplOworICAgICAgICB9CisgICAgICAgIHBpeGVscyArPSA0IC0gbGluZV9zaXplICogKGggKyAxKTsKKyAgICAgICAgYmxvY2sgICs9IDQgLSBsaW5lX3NpemUgKiBoOworICAgIH0KK30KKwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczE2X3h5Ml84X21taSh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQoreworICAgIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94eTJfOF9tbWkoYmxvY2ssIHBpeGVscywgbGluZV9zaXplLCBoKTsKKyAgICBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeHkyXzhfbW1pKGJsb2NrICsgOCwgcGl4ZWxzICsgOCwgbGluZV9zaXplLCBoKTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9pZGN0ZHNwX21pcHMuaCBiL2xpYmF2Y29kZWMvbWlwcy9pZGN0ZHNwX21pcHMuaAppbmRleCAxOTI2N2U2Li43Y2E3YzFjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvaWRjdGRzcF9taXBzLmgKKysrIGIvbGliYXZjb2RlYy9taXBzL2lkY3Rkc3BfbWlwcy5oCkBAIC0zNCwxMSArMzQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CiB2b2lkIGZmX2pfcmV2X2RjdF9tc2EoaW50MTZfdCAqZGF0YSk7Ci12b2lkIGZmX2pyZWZfaWRjdF9wdXRfbXNhKHVpbnQ4X3QgKmRlc3QsIGludDMyX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX2pyZWZfaWRjdF9hZGRfbXNhKHVpbnQ4X3QgKmRlc3QsIGludDMyX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX2pyZWZfaWRjdF9wdXRfbXNhKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfanJlZl9pZGN0X2FkZF9tc2EodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOwogdm9pZCBmZl9zaW1wbGVfaWRjdF9tc2EoaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfbXNhKHVpbnQ4X3QgKmRlc3QsIGludDMyX3Qgc3RyaWRlX2RzdCwgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfbXNhKHVpbnQ4X3QgKmRlc3QsIGludDMyX3Qgc3RyaWRlX2RzdCwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfbXNhKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGVfZHN0LCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9tc2EodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZV9kc3QsIGludDE2X3QgKmJsb2NrKTsKIAogdm9pZCBmZl9wdXRfcGl4ZWxzX2NsYW1wZWRfbW1pKGNvbnN0IGludDE2X3QgKmJsb2NrLAogICAgICAgICB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUpOwpAQCAtNDcsNyArNDcsNyBAQAogdm9pZCBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfbW1pKGNvbnN0IGludDE2X3QgKmJsb2NrLAogICAgICAgICB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUpOwogdm9pZCBmZl9zaW1wbGVfaWRjdF9tbWkoaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfbW1pKHVpbnQ4X3QgKmRlc3QsIGludDMyX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9tbWkodWludDhfdCAqZGVzdCwgaW50MzJfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X21taSh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9tbWkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwogCiAjZW5kaWYgIC8vICNpZm5kZWYgQVZDT0RFQ19NSVBTX0lEQ1REU1BfTUlQU19ICmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaWRjdGRzcF9tbWkuYyBiL2xpYmF2Y29kZWMvbWlwcy9pZGN0ZHNwX21taS5jCmluZGV4IDI1NDc2ZjMuLmI3OTc5NjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9pZGN0ZHNwX21taS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9pZGN0ZHNwX21taS5jCkBAIC0yMyw2MyArMjMsODEgQEAKIAogI2luY2x1ZGUgImlkY3Rkc3BfbWlwcy5oIgogI2luY2x1ZGUgImNvbnN0YW50cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL21taXV0aWxzLmgiCiAKIHZvaWQgZmZfcHV0X3BpeGVsc19jbGFtcGVkX21taShjb25zdCBpbnQxNl90ICpibG9jaywKICAgICAgICAgdWludDhfdCAqYXZfcmVzdHJpY3QgcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplKQogewotICAgIGNvbnN0IGludDE2X3QgKnA7Ci0gICAgdWludDhfdCAqcGl4OwotCi0gICAgcCA9IGJsb2NrOwotICAgIHBpeCA9IHBpeGVsczsKKyAgICBkb3VibGUgZnRtcFs4XTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJsZGMxICRmMCwgMCslMyAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYyLCA4KyUzICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDE2KyUzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNiwgMjQrJTMgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGY4LCAzMislMyAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEwLCA0MCslMyAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMTIsIDQ4KyUzICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYxNCwgNTYrJTMgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZCAkMTAsICUwLCAlMSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjAsICRmMCwgJGYyICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmNCwgJGY0LCAkZjYgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGY4LCAkZjgsICRmMTAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjEyLCAkZjEyLCAkZjE0ICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYwLCAwKCUwKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDAoJDEwKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmOCwgMCgkMTAsICUxKSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2R4YzEgJGYxMiwgMCglMCwgJTIpICAgICAgICBcclxuIgotICAgICAgICA6OiJyIihwaXgpLCJyIigoaW50KWxpbmVfc2l6ZSksCi0gICAgICAgICAgInIiKChpbnQpbGluZV9zaXplKjMpLCJtIigqcCkKLSAgICAgICAgOiAiJDEwIiwibWVtb3J5IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4MTgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW2Jsb2NrXSwgMHgyMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNV0sICVbYmxvY2tdLCAweDI4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXA2XSwgJVtibG9ja10sIDB4MzApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDddLCAlW2Jsb2NrXSwgMHgzOCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtwaXhlbHNdLCAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA0XSwgJVthZGRyMF0sICVbbGluZV9zaXplXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDZdLCAlW3BpeGVsc10sICVbbGluZV9zaXpleDNdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgIFtwaXhlbHNdIismciIocGl4ZWxzKQorICAgICAgICA6IFtsaW5lX3NpemVdInIiKChtaXBzX3JlZylsaW5lX3NpemUpLAorICAgICAgICAgIFtsaW5lX3NpemV4M10iciIoKG1pcHNfcmVnKShsaW5lX3NpemUqMykpLAorICAgICAgICAgIFtibG9ja10iciIoYmxvY2spCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogCi0gICAgcGl4ICs9IGxpbmVfc2l6ZSo0OwotICAgIHAgKz0gMzI7CisgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZSo0OworICAgIGJsb2NrICs9IDMyOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJsZGMxICRmMCwgMCslMyAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYyLCA4KyUzICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjQsIDE2KyUzICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNiwgMjQrJTMgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGY4LCAzMislMyAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAibGRjMSAkZjEwLCA0MCslMyAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMTIsIDQ4KyUzICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImxkYzEgJGYxNCwgNTYrJTMgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZGFkZCAkMTAsICUwLCAlMSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjAsICRmMCwgJGYyICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2t1c2hiICRmNCwgJGY0LCAkZjYgICAgICAgICBcclxuIgotICAgICAgICAicGFja3VzaGIgJGY4LCAkZjgsICRmMTAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrdXNoYiAkZjEyLCAkZjEyLCAkZjE0ICAgICAgXHJcbiIKLSAgICAgICAgInNkYzEgJGYwLCAwKCUwKSAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAic2RjMSAkZjQsIDAoJDEwKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmOCwgMCgkMTAsICUxKSAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2R4YzEgJGYxMiwgMCglMCwgJTIpICAgICAgICBcclxuIgotICAgICAgICA6OiJyIihwaXgpLCJyIigoaW50KWxpbmVfc2l6ZSksCi0gICAgICAgICAgInIiKChpbnQpbGluZV9zaXplKjMpLCJtIigqcCkKLSAgICAgICAgOiAiJDEwIiwibWVtb3J5IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4MTgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW2Jsb2NrXSwgMHgyMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNV0sICVbYmxvY2tdLCAweDI4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXA2XSwgJVtibG9ja10sIDB4MzApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDddLCAlW2Jsb2NrXSwgMHgzOCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtwaXhlbHNdLCAgICAgICVbbGluZV9zaXplXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA0XSwgJVthZGRyMF0sICVbbGluZV9zaXplXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDZdLCAlW3BpeGVsc10sICVbbGluZV9zaXpleDNdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgIFtwaXhlbHNdIismciIocGl4ZWxzKQorICAgICAgICA6IFtsaW5lX3NpemVdInIiKChtaXBzX3JlZylsaW5lX3NpemUpLAorICAgICAgICAgIFtsaW5lX3NpemV4M10iciIoKG1pcHNfcmVnKShsaW5lX3NpemUqMykpLAorICAgICAgICAgIFtibG9ja10iciIoYmxvY2spCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCkBAIC04NywxMDQgKzEwNSwxMjAgQEAKICAgICB1aW50OF90ICphdl9yZXN0cmljdCBwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUpCiB7CiAgICAgaW50NjRfdCBsaW5lX3NraXAgPSBsaW5lX3NpemU7Ci0gICAgaW50NjRfdCBsaW5lX3NraXAzOworICAgIGludDY0X3QgbGluZV9za2lwMyA9IDA7CisgICAgZG91YmxlIGZ0bXBbNV07CisgICAgbWlwc19yZWcgYWRkclsxXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAiZG10YzEgJTQsICRmMCAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJkYWRkdSAlMSwgJTMsICUzICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxkYzEgJGYyLCAwKCUyKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGRjMSAkZjEwLCA4KCUyKSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwYWNrc3NoYiAkZjIsICRmMiwgJGYxMCAgICAgICAgXG5cdCIKLSAgICAgICAgImxkYzEgJGY0LCAxNiglMikgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGRjMSAkZjEwLCAyNCglMikgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwYWNrc3NoYiAkZjQsICRmNCwgJGYxMCAgICAgICAgXG5cdCIKLSAgICAgICAgImxkYzEgJGY2LCAzMiglMikgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGRjMSAkZjEwLCA0MCglMikgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwYWNrc3NoYiAkZjYsICRmNiwgJGYxMCAgICAgICAgXG5cdCIKLSAgICAgICAgImxkYzEgJGY4LCA0OCglMikgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGRjMSAkZjEwLCA1NiglMikgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwYWNrc3NoYiAkZjgsICRmOCwgJGYxMCAgICAgICAgXG5cdCIKLSAgICAgICAgInBhZGRiICRmMiwgJGYyLCAkZjAgICAgICAgICAgICBcblx0IgotICAgICAgICAicGFkZGIgJGY0LCAkZjQsICRmMCAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwYWRkYiAkZjYsICRmNiwgJGYwICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInBhZGRiICRmOCwgJGY4LCAkZjAgICAgICAgICAgICBcblx0IgotICAgICAgICAic2RjMSAkZjIsIDAoJTApICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJnc3NkeGMxICRmNCwgMCglMCwgJTMpICAgICAgICAgXG5cdCIKLSAgICAgICAgImdzc2R4YzEgJGY2LCAwKCUwLCAlMSkgICAgICAgICBcblx0IgotICAgICAgICAiZGFkZHUgJTEsICUxLCAlMyAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJnc3NkeGMxICRmOCwgMCglMCwgJTEpICAgICAgICAgXG5cdCIKLSAgICAgICAgImRhZGR1ICQxMCwgJTEsICUzICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiZGFkZHUgJTAsICUwLCAkMTAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZGMxICRmMiwgNjQoJTIpICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxkYzEgJGYxMCwgOCs2NCglMikgICAgICAgICAgICBcblx0IgotICAgICAgICAicGFja3NzaGIgICRmMiwgJGYyLCAkZjEwICAgICAgIFxuXHQiCi0gICAgICAgICJsZGMxICRmNCwgMTYrNjQoJTIpICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxkYzEgJGYxMCwgMjQrNjQoJTIpICAgICAgICAgICBcblx0IgotICAgICAgICAicGFja3NzaGIgJGY0LCAkZjQsICRmMTAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZGMxICRmNiwgMzIrNjQoJTIpICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxkYzEgJGYxMCwgNDArNjQoJTIpICAgICAgICAgICBcblx0IgotICAgICAgICAicGFja3NzaGIgJGY2LCAkZjYsICRmMTAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZGMxICRmOCwgNDgrNjQoJTIpICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxkYzEgJGYxMCwgNTYrNjQoJTIpICAgICAgICAgICBcblx0IgotICAgICAgICAicGFja3NzaGIgJGY4LCAkZjgsICRmMTAgICAgICAgIFxuXHQiCi0gICAgICAgICJwYWRkYiAkZjIsICRmMiwgJGYwICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInBhZGRiICRmNCwgJGY0LCAkZjAgICAgICAgICAgICBcblx0IgotICAgICAgICAicGFkZGIgJGY2LCAkZjYsICRmMCAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwYWRkYiAkZjgsICRmOCwgJGYwICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNkYzEgJGYyLCAwKCUwKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiZ3NzZHhjMSAkZjQsIDAoJTAsICUzKSAgICAgICAgIFxuXHQiCi0gICAgICAgICJkYWRkdSAkMTAsICUzLCAlMyAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImdzc2R4YzEgJGY2LCAwKCUwLCAkMTApICAgICAgICBcblx0IgotICAgICAgICAiZ3NzZHhjMSAkZjgsIDAoJTAsICUxKSAgICAgICAgIFxuXHQiCi0gICAgICAgIDogIismciIocGl4ZWxzKSwiPSZyIihsaW5lX3NraXAzKQotICAgICAgICA6ICJyIihibG9jayksInIiKGxpbmVfc2tpcCksInIiKGZmX3BiXzgwKQotICAgICAgICA6ICIkMTAiLCJtZW1vcnkiCisgICAgICAgIFBUUl9BRERVICAgIiVbbGluZV9za2lwM10sICAlW2xpbmVfc2tpcF0sICAgJVtsaW5lX3NraXBdICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgInBhY2tzc2hiICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgxMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDE4KQorICAgICAgICAicGFja3NzaGIgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDIwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MjgpCisgICAgICAgICJwYWNrc3NoYiAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4MzApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgzOCkKKyAgICAgICAgInBhY2tzc2hiICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAxXSwgICAgICAgJVtmZl9wYl84MF0gICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgICAgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMl0sICAgICAgICVbZmZfcGJfODBdICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wM10sICAgICAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3BiXzgwXSAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA0XSwgICAgICAgJVtmZl9wYl84MF0gICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wMl0sICVbcGl4ZWxzXSwgJVtsaW5lX3NraXBdLCAweDAwKQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wM10sICVbcGl4ZWxzXSwgJVtsaW5lX3NraXAzXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtsaW5lX3NraXAzXSwgICVbbGluZV9za2lwM10sICAlW2xpbmVfc2tpcF0gICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA0XSwgJVtwaXhlbHNdLCAlW2xpbmVfc2tpcDNdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAgICAgJVtsaW5lX3NraXAzXSwgICVbbGluZV9za2lwXSAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtwaXhlbHNdLCAgICAgICVbcGl4ZWxzXSwgICAgICAlW2FkZHIwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgMHg0MCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDQ4KQorICAgICAgICAicGFja3NzaGIgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDUwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4NTgpCisgICAgICAgICJwYWNrc3NoYiAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4NjApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHg2OCkKKyAgICAgICAgInBhY2tzc2hiICAgJVtmdG1wM10sICAgICAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW2Jsb2NrXSwgMHg3MCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDc4KQorICAgICAgICAicGFja3NzaGIgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3BiXzgwXSAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkYiAgICAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSwgICAgICAgJVtmZl9wYl84MF0gICAgICAgICBcblx0IgorICAgICAgICAicGFkZGIgICAgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wM10sICAgICAgICVbZmZfcGJfODBdICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICAgICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3BiXzgwXSAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW3BpeGVsc10sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXAyXSwgJVtwaXhlbHNdLCAlW2xpbmVfc2tpcF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICAgICAlW2xpbmVfc2tpcF0sICAgJVtsaW5lX3NraXBdICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wM10sICVbcGl4ZWxzXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA0XSwgJVtwaXhlbHNdLCAlW2xpbmVfc2tpcDNdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgIFtwaXhlbHNdIismciIocGl4ZWxzKSwgICAgICAgICAgICBbbGluZV9za2lwM10iKyZyIihsaW5lX3NraXAzKQorICAgICAgICA6IFtibG9ja10iciIoYmxvY2spLAorICAgICAgICAgIFtsaW5lX3NraXBdInIiKChtaXBzX3JlZylsaW5lX3NraXApLAorICAgICAgICAgIFtmZl9wYl84MF0iZiIoZmZfcGJfODApCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCiB2b2lkIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9tbWkoY29uc3QgaW50MTZfdCAqYmxvY2ssCiAgICAgICAgIHVpbnQ4X3QgKmF2X3Jlc3RyaWN0IHBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSkKIHsKLSAgICBjb25zdCBpbnQxNl90ICpwOwotICAgIHVpbnQ4X3QgKnBpeDsKLSAgICBpbnQgaSA9IDQ7Ci0KLSAgICBwID0gYmxvY2s7Ci0gICAgcGl4ID0gcGl4ZWxzOworICAgIGRvdWJsZSBmdG1wWzhdOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ4b3IgJGYxNCwgJGYxNCwgJGYxNCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgOjoKKyAgICAgICAgImxpICAgICAgICAgJVt0bXAwXSwgICAgMHgwNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDNdLCAlW2Jsb2NrXSwgMHgxMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICVbYmxvY2tdLCAweDE4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXA1XSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wNl0sICVbcGl4ZWxzXSwgJVtsaW5lX3NpemVdLCAweDAwKQorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDddLCAgICVbZnRtcDZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wM10sICVbcGl4ZWxzXSwgJVtsaW5lX3NpemVdLCAweDAwKQorICAgICAgICAiYWRkaSAgICAgICAlW3RtcDBdLCAgICAlW3RtcDBdLCAgICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERElVICAiJVtibG9ja10sICAgJVtibG9ja10sICAgICAgIDB4MjAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbcGl4ZWxzXSwgICVbcGl4ZWxzXSwgICAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3BpeGVsc10sICAlW3BpeGVsc10sICAgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVt0bXAwXSwgICAgMWIiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwKKyAgICAgICAgICBbcGl4ZWxzXSIrJnIiKHBpeGVscyksICAgICAgICAgICAgW2Jsb2NrXSIrJnIiKGJsb2NrKQorICAgICAgICA6IFtsaW5lX3NpemVdInIiKChtaXBzX3JlZylsaW5lX3NpemUpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwotCi0gICAgZG8gewotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgICAgICJsZGMxICRmMCwgMCslMiAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgImxkYzEgJGYyLCA4KyUyICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibGRjMSAkZjQsIDE2KyUyICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJsZGMxICRmNiwgMjQrJTIgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgImxkYzEgJGY4LCAlMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICAibGRjMSAkZjEyLCAlMSAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJtb3YuZCAkZjEwLCAkZjggICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInB1bnBja2xiaCAkZjgsICRmOCwgJGYxNCAgIFxyXG4iCi0gICAgICAgICAgICAicHVucGNraGJoICRmMTAsICRmMTAsICRmMTQgXHJcbiIKLSAgICAgICAgICAgICJwYWRkc2ggJGYwLCAkZjAsICRmOCAgICAgICBcclxuIgotICAgICAgICAgICAgInBhZGRzaCAkZjIsICRmMiwgJGYxMCAgICAgIFxyXG4iCi0gICAgICAgICAgICAibW92LmQgJGYxMCwgJGYxMiAgICAgICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwdW5wY2tsYmggJGYxMiwgJGYxMiwgJGYxNCBcclxuIgotICAgICAgICAgICAgInB1bnBja2hiaCAkZjEwLCAkZjEwLCAkZjE0IFxyXG4iCi0gICAgICAgICAgICAicGFkZHNoICRmNCwgJGY0LCAkZjEyICAgICAgXHJcbiIKLSAgICAgICAgICAgICJwYWRkc2ggJGY2LCAkZjYsICRmMTAgICAgICBcclxuIgotICAgICAgICAgICAgInBhY2t1c2hiICRmMCwgJGYwLCAkZjIgICAgIFxyXG4iCi0gICAgICAgICAgICAicGFja3VzaGIgJGY0LCAkZjQsICRmNiAgICAgXHJcbiIKLSAgICAgICAgICAgICJzZGMxICRmMCwgJTAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAgICAgInNkYzEgJGY0LCAlMSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICAgICA6ICIrbSIoKnBpeCksIittIigqKHBpeCtsaW5lX3NpemUpKQotICAgICAgICAgICAgOiAibSIoKnApCi0gICAgICAgICAgICA6ICJtZW1vcnkiCi0gICAgICAgICk7Ci0KLSAgICAgICAgcGl4ICs9IGxpbmVfc2l6ZSoyOwotICAgICAgICBwICs9IDE2OwotICAgIH0gd2hpbGUgKC0taSk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvaWlyZmlsdGVyX21pcHMuYyBiL2xpYmF2Y29kZWMvbWlwcy9paXJmaWx0ZXJfbWlwcy5jCmluZGV4IGE1NjQ2Y2QuLjNhMTM1MmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9paXJmaWx0ZXJfbWlwcy5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9paXJmaWx0ZXJfbWlwcy5jCkBAIC01Miw5ICs1MiwxMSBAQAogICogUmVmZXJlbmNlOiBsaWJhdmNvZGVjL2lpcmZpbHRlci5jCiAgKi8KIAorI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvaWlyZmlsdGVyLmgiCiAKICNpZiBIQVZFX0lOTElORV9BU00KKyNpZiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNgogdHlwZWRlZiBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgewogICAgIGludCAgIG9yZGVyOwogICAgIGZsb2F0IGdhaW47CkBAIC02Niw5ICs2OCw5IEBACiAgICAgZmxvYXQgeFsxXTsKIH0gRkZJSVJGaWx0ZXJTdGF0ZTsKIAotc3RhdGljIHZvaWQgZmZfaWlyX2ZpbHRlcl9mbHRfbWlwcyhjb25zdCBzdHJ1Y3QgRkZJSVJGaWx0ZXJDb2VmZnMgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGRklJUkZpbHRlclN0YXRlICpzLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYywgaW50IHNzdGVwLCBmbG9hdCAqZHN0LCBpbnQgZHN0ZXApCitzdGF0aWMgdm9pZCBpaXJfZmlsdGVyX2ZsdF9taXBzKGNvbnN0IHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZGSUlSRmlsdGVyU3RhdGUgKnMsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjLCBwdHJkaWZmX3Qgc3N0ZXAsIGZsb2F0ICpkc3QsIHB0cmRpZmZfdCBkc3RlcCkKIHsKICAgICBpZiAoYy0+b3JkZXIgPT0gMikgewogICAgICAgICBpbnQgaTsKQEAgLTE5NSwxMCArMTk3LDEzIEBACiAgICAgICAgIH0KICAgICB9CiB9CisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIAogdm9pZCBmZl9paXJfZmlsdGVyX2luaXRfbWlwcyhGRklJUkZpbHRlckNvbnRleHQgKmYpIHsKICNpZiBIQVZFX0lOTElORV9BU00KLSAgICBmLT5maWx0ZXJfZmx0ID0gZmZfaWlyX2ZpbHRlcl9mbHRfbWlwczsKKyNpZiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNgorICAgIGYtPmZpbHRlcl9mbHQgPSBpaXJfZmlsdGVyX2ZsdF9taXBzOworI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvbHNwX21pcHMuaCBiL2xpYmF2Y29kZWMvbWlwcy9sc3BfbWlwcy5oCmluZGV4IDFlODk5YmMuLjYyMTljNWEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9sc3BfbWlwcy5oCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9sc3BfbWlwcy5oCkBAIC01NSw2ICs1NSw3IEBACiAjZGVmaW5lIEFWQ09ERUNfTUlQU19MU1BfTUlQU19ICiAKICNpZiBIQVZFX01JUFNGUFUgJiYgSEFWRV9JTkxJTkVfQVNNCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKICNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9hc21kZWZzLmgiCiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfbHNwMnBvbHlmX21pcHMoY29uc3QgZG91YmxlICpsc3AsIGRvdWJsZSAqZiwgaW50IGxwX2hhbGZfb3JkZXIpCkBAIC0xMDcsNSArMTA4LDYgQEAKICAgICB9CiB9CiAjZGVmaW5lIGZmX2xzcDJwb2x5ZiBmZl9sc3AycG9seWZfbWlwcworI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCiAjZW5kaWYgLyogSEFWRV9NSVBTRlBVICYmIEhBVkVfSU5MSU5FX0FTTSAqLwogI2VuZGlmIC8qIEFWQ09ERUNfTUlQU19MU1BfTUlQU19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvbXBlZ2F1ZGlvZHNwX21pcHNfZml4ZWQuYyBiL2xpYmF2Y29kZWMvbWlwcy9tcGVnYXVkaW9kc3BfbWlwc19maXhlZC5jCmluZGV4IDkyZDI2MGIuLjFjOWM2OGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9tcGVnYXVkaW9kc3BfbWlwc19maXhlZC5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9tcGVnYXVkaW9kc3BfbWlwc19maXhlZC5jCkBAIC01Nyw4ICs1NywxMSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL2FzbWRlZnMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWdhdWRpb2RzcC5oIgogCisjaWYgSEFWRV9JTkxJTkVfQVNNCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKKwogc3RhdGljIHZvaWQgZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19taXBzX2ZpeGVkKGludDMyX3QgKnN5bnRoX2J1ZiwgaW50MzJfdCAqd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBpbnQxNl90ICpzYW1wbGVzLCBpbnQgaW5jcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpdGhlcl9zdGF0ZSwgaW50MTZfdCAqc2FtcGxlcywgcHRyZGlmZl90IGluY3IpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgaW50MzJfdCAqdywgKncyLCAqcDsKICAgICBpbnQgajsKQEAgLTkwMSw4ICs5MDQsMTUgQEAKICAgICB9CiB9CiAKKyNlbmRpZiAvKiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNiAqLworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCiB2b2lkIGZmX21wYWRzcF9pbml0X21pcHNkc3AoTVBBRFNQQ29udGV4dCAqcykKIHsKKyNpZiBIQVZFX0lOTElORV9BU00KKyNpZiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNgogICAgIHMtPmFwcGx5X3dpbmRvd19maXhlZCAgID0gZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19taXBzX2ZpeGVkOwogICAgIHMtPmltZGN0MzZfYmxvY2tzX2ZpeGVkID0gZmZfaW1kY3QzNl9ibG9ja3NfbWlwc19maXhlZDsKKyNlbmRpZgorI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvbXBlZ2F1ZGlvZHNwX21pcHNfZmxvYXQuYyBiL2xpYmF2Y29kZWMvbWlwcy9tcGVnYXVkaW9kc3BfbWlwc19mbG9hdC5jCmluZGV4IGJkMzY4OTQuLjQ4MWI2OWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9tcGVnYXVkaW9kc3BfbWlwc19mbG9hdC5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9tcGVnYXVkaW9kc3BfbWlwc19mbG9hdC5jCkBAIC01OCw4ICs1OCwxMSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL2FzbWRlZnMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWdhdWRpb2RzcC5oIgogCisjaWYgSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfTUlQU0ZQVQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CisKIHN0YXRpYyB2b2lkIGZmX21wYWRzcF9hcHBseV93aW5kb3dfbWlwc19mbG9hdChmbG9hdCAqc3ludGhfYnVmLCBmbG9hdCAqd2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBmbG9hdCAqc2FtcGxlcywgaW50IGluY3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXRoZXJfc3RhdGUsIGZsb2F0ICpzYW1wbGVzLCBwdHJkaWZmX3QgaW5jcikKIHsKICAgICByZWdpc3RlciBjb25zdCBmbG9hdCAqdywgKncyLCAqcDsKICAgICBpbnQgajsKQEAgLTEyNDMsOSArMTI0NiwxNiBAQAogICAgIH0KIH0KIAorI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCisjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfTUlQU0ZQVSAqLworCiB2b2lkIGZmX21wYWRzcF9pbml0X21pcHNmcHUoTVBBRFNQQ29udGV4dCAqcykKIHsKKyNpZiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV9NSVBTRlBVCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKICAgICBzLT5hcHBseV93aW5kb3dfZmxvYXQgICA9IGZmX21wYWRzcF9hcHBseV93aW5kb3dfbWlwc19mbG9hdDsKICAgICBzLT5pbWRjdDM2X2Jsb2Nrc19mbG9hdCA9IGZmX2ltZGN0MzZfYmxvY2tzX21pcHNfZmxvYXQ7CiAgICAgcy0+ZGN0MzJfZmxvYXQgICAgICAgICAgPSBmZl9kY3QzMl9taXBzX2Zsb2F0OworI2VuZGlmCisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9tcGVndmlkZW9fbW1pLmMgYi9saWJhdmNvZGVjL21pcHMvbXBlZ3ZpZGVvX21taS5jCmluZGV4IDk0NzgxZTYuLjE4MDU4ZTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9tcGVndmlkZW9fbW1pLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL21wZWd2aWRlb19tbWkuYwpAQCAtMjMsMTEgKzIzLDE1IEBACiAgKi8KIAogI2luY2x1ZGUgIm1wZWd2aWRlb19taXBzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21pcHMvbW1pdXRpbHMuaCIKIAogdm9pZCBmZl9kY3RfdW5xdWFudGl6ZV9oMjYzX2ludHJhX21taShNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssCiAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKQogewogICAgIGludDY0X3QgbGV2ZWwsIHFtdWwsIHFhZGQsIG5Db2VmZnM7CisgICAgZG91YmxlIGZ0bXBbNl07CisgICAgbWlwc19yZWcgYWRkclsxXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKIAogICAgIHFtdWwgPSBxc2NhbGUgPDwgMTsKICAgICBhdl9hc3NlcnQyKHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0+PTAgfHwgcy0+aDI2M19haWMpOwpAQCAtNDksNDggKzUzLDQ4IEBACiAgICAgICAgIG5Db2VmZnMgPSBzLT5pbnRlcl9zY2FudGFibGUucmFzdGVyX2VuZFtzLT5ibG9ja19sYXN0X2luZGV4W25dXTsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAieG9yICRmMTIsICRmMTIsICRmMTIgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmMTIsICUxICAgICAgICAgICAgICAgICAgXG5cciIKLSAgICAgICAgInhvciAkZjEwLCAkZjEwLCAkZjEwICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjEwLCAlMiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxNCwgJGYxNCwgJGYxNCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmMTIsICRmMTIsICRmMTIgICAgICBcclxuIgotICAgICAgICAicGFja3Nzd2ggJGYxMiwgJGYxMiwgJGYxMiAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrc3N3aCAkZjEwLCAkZjEwLCAkZjEwICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmMTAsICRmMTAsICRmMTAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxNCwgJGYxNCwgJGYxMCAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmOCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJTAsICUzICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYwLCA3KCQ4KSAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjAsIDAoJDgpICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgMTUoJDgpICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyLCA4KCQ4KSAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGY0LCAkZjAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjYsICRmMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjAsICRmMCwgJGYxMiAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjEyICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZ3RoICRmNCwgJGY0LCAkZjggICAgICAgICAgXHJcbiIKLSAgICAgICAgInBjbXBndGggJGY2LCAkZjYsICRmOCAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYyLCAkZjIsICRmNiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjE0ICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY0LCAkZjQsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGNtcGVxaCAkZjAsICRmMCwgJGYxNCAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFoICRmMiwgJGYyLCAkZjE0ICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhbmRuICRmMCwgJGYwLCAkZjQgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFuZG4gJGYyLCAkZjIsICRmNiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmMCwgNygkOCkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYwLCAwKCQ4KSAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIsIDE1KCQ4KSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkcmMxICRmMiwgOCgkOCkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImFkZGkgJTMsICUzLCAxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYmxleiAlMywgMWIgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6InIiKGJsb2NrK25Db2VmZnMpLCJtIihxbXVsKSwibSIocWFkZCksInIiKDIqKC1uQ29lZmZzKSkKLSAgICAgICAgOiIkOCIsIm1lbW9yeSIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrc3N3aCAgICVbcW11bF0sICAgICVbcW11bF0sICAgICAgICAlW3FtdWxdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2ggICAlW3FtdWxdLCAgICAlW3FtdWxdLCAgICAgICAgJVtxbXVsXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2tzc3doICAgJVtxYWRkXSwgICAgJVtxYWRkXSwgICAgICAgICVbcWFkZF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrc3N3aCAgICVbcWFkZF0sICAgICVbcWFkZF0sICAgICAgICAlW3FhZGRdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtxYWRkXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIucDJhbGlnbiAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2Jsb2NrXSwgICAgICAgJVtuQ29lZmZzXSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVthZGRyMF0sIDB4MDgpCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbcW11bF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW3FtdWxdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0aCAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGggICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFoICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxaCAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmRuICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kbiAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW25Db2VmZnNdLCAlW25Db2VmZnNdLCAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVthZGRyMF0sIDB4MDgpCisgICAgICAgICJibGV6ICAgICAgICVbbkNvZWZmc10sIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKQorICAgICAgICA6IFtibG9ja10iciIoKG1pcHNfcmVnKShibG9jaytuQ29lZmZzKSksCisgICAgICAgICAgW25Db2VmZnNdInIiKChtaXBzX3JlZykoMiooLW5Db2VmZnMpKSksCisgICAgICAgICAgW3FtdWxdImYiKHFtdWwpLCAgICAgICAgICAgICAgICAgIFtxYWRkXSJmIihxYWRkKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIAogICAgIGJsb2NrWzBdID0gbGV2ZWw7CkBAIC0xMDAsNiArMTA0LDkgQEAKICAgICAgICAgaW50IG4sIGludCBxc2NhbGUpCiB7CiAgICAgaW50NjRfdCBxbXVsLCBxYWRkLCBuQ29lZmZzOworICAgIGRvdWJsZSBmdG1wWzZdOworICAgIG1pcHNfcmVnIGFkZHJbMV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CiAKICAgICBxbXVsID0gcXNjYWxlIDw8IDE7CiAgICAgcWFkZCA9IChxc2NhbGUgLSAxKSB8IDE7CkBAIC0xMDcsNDggKzExNCw0NyBAQAogICAgIG5Db2VmZnMgPSBzLT5pbnRlcl9zY2FudGFibGUucmFzdGVyX2VuZFtzLT5ibG9ja19sYXN0X2luZGV4W25dXTsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAieG9yICRmMTIsICRmMTIsICRmMTIgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmMTIsICUxICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjEwLCAkZjEwLCAkZjEwICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjEwLCAlMiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrc3N3aCAkZjEyLCAkZjEyLCAkZjEyICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmMTIsICRmMTIsICRmMTIgICAgICBcclxuIgotICAgICAgICAieG9yICRmMTQsICRmMTQsICRmMTQgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrc3N3aCAkZjEwLCAkZjEwLCAkZjEwICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmMTAsICRmMTAsICRmMTAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYxNCwgJGYxNCwgJGYxMCAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmOCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkdSAkOCwgJTAsICUzICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRsYzEgJGYwLCA3KCQ4KSAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHJjMSAkZjAsIDAoJDgpICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkbGMxICRmMiwgMTUoJDgpICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGRyYzEgJGYyLCA4KCQ4KSAgICAgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGY0LCAkZjAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjYsICRmMiAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjAsICRmMCwgJGYxMiAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMiwgJGYyLCAkZjEyICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZ3RoICRmNCwgJGY0LCAkZjggICAgICAgICAgXHJcbiIKLSAgICAgICAgInBjbXBndGggJGY2LCAkZjYsICRmOCAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYyLCAkZjIsICRmNiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjE0ICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMTQgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY0LCAkZjQsICRmMCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGNtcGVxaCAkZjAsICRmMCwgJGYxNCAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFoICRmMiwgJGYyLCAkZjE0ICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhbmRuICRmMCwgJGYwLCAkZjQgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFuZG4gJGYyLCAkZjIsICRmNiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkbGMxICRmMCwgNygkOCkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2RyYzEgJGYwLCAwKCQ4KSAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZGxjMSAkZjIsIDE1KCQ4KSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkcmMxICRmMiwgOCgkOCkgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImFkZGkgJTMsICUzLCAxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiYmxleiAlMywgMWIgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6InIiKGJsb2NrK25Db2VmZnMpLCJtIihxbXVsKSwibSIocWFkZCksInIiKDIqKC1uQ29lZmZzKSkKLSAgICAgICAgOiAiJDgiLCJtZW1vcnkiCisgICAgICAgICJwYWNrc3N3aCAgICVbcW11bF0sICAgICVbcW11bF0sICAgICAgICAlW3FtdWxdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2ggICAlW3FtdWxdLCAgICAlW3FtdWxdLCAgICAgICAgJVtxbXVsXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrc3N3aCAgICVbcWFkZF0sICAgICVbcWFkZF0sICAgICAgICAlW3FhZGRdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2ggICAlW3FhZGRdLCAgICAlW3FhZGRdLCAgICAgICAgJVtxYWRkXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbcWFkZF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiLnAyYWxpZ24gICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYmxvY2tdLCAgICAgICAlW25Db2VmZnNdICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgMHgwOCkKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wM10sICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtxbXVsXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbcW11bF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RoICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0aCAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWggICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFoICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFuZG4gICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmRuICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbbkNvZWZmc10sICVbbkNvZWZmc10sICAgICAweDEwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgMHgwOCkKKyAgICAgICAgImJsZXogICAgICAgJVtuQ29lZmZzXSwgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pCisgICAgICAgIDogW2Jsb2NrXSJyIigobWlwc19yZWcpKGJsb2NrK25Db2VmZnMpKSwKKyAgICAgICAgICBbbkNvZWZmc10iciIoKG1pcHNfcmVnKSgyKigtbkNvZWZmcykpKSwKKyAgICAgICAgICBbcW11bF0iZiIocW11bCksICAgICAgICAgICAgICAgICAgW3FhZGRdImYiKHFhZGQpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogfQogCkBAIC0xNTgsNiArMTY0LDExIEBACiAgICAgaW50NjRfdCBuQ29lZmZzOwogICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXg7CiAgICAgaW50IGJsb2NrMDsKKyAgICBkb3VibGUgZnRtcFsxMF07CisgICAgdWludDY0X3QgdG1wWzFdOworICAgIG1pcHNfcmVnIGFkZHJbMV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisgICAgREVDTEFSRV9WQVJfQUREUlQ7CiAKICAgICBhdl9hc3NlcnQyKHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0+PTApOwogICAgIG5Db2VmZnMgPSBzLT5pbnRyYV9zY2FudGFibGUucmFzdGVyX2VuZFtzLT5ibG9ja19sYXN0X2luZGV4W25dXSArIDE7CkBAIC0xNzEsNjAgKzE4Miw3MSBAQAogICAgIHF1YW50X21hdHJpeCA9IHMtPmludHJhX21hdHJpeDsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICAgICAicGNtcGVxaCAkZjE0LCAkZjE0LCAkZjE0ICAgICAgIFxyXG4iCi0gICAgICAgICJkbGkgJDEwLCAxNSAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImRtdGMxICQxMCwgJGYxNiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMTIsICRmMTIsICRmMTIgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmMTIsICUyICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmxoICRmMTQsICRmMTQsICRmMTYgICAgICAgICBcclxuIgotICAgICAgICAicGFja3Nzd2ggJGYxMiwgJGYxMiwgJGYxMiAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrc3N3aCAkZjEyLCAkZjEyLCAkZjEyICAgICAgXHJcbiIKLSAgICAgICAgIm9yICQ4LCAlMywgJDAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGR4YzEgJGYwLCAwKCQ4LCAlMCkgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHhjMSAkZjIsIDgoJDgsICUwKSAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjE2LCAkZjAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIm1vdi5kICRmMTgsICRmMiAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHhjMSAkZjgsIDAoJDgsICUxKSAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMTAsIDgoJDgsICUxKSAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjgsICRmOCwgJGYxMiAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMTAsICRmMTAsICRmMTIgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY0LCAkZjQsICRmNCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjYsICRmNiwgJGY2ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGNtcGd0aCAkZjQsICRmNCwgJGYwICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZ3RoICRmNiwgJGY2LCAkZjIgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMiwgJGYyLCAkZjYgICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMCwgJGYwLCAkZjggICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyLCAkZjIsICRmMTAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjgsICRmOCwgJGY4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMTAsICRmMTAsICRmMTAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFoICRmOCwgJGY4LCAkZjE2ICAgICAgICAgXHJcbiIKLSAgICAgICAgInBjbXBlcWggJGYxMCwgJGYxMCwgJGYxOCAgICAgICBcclxuIgotICAgICAgICAiZGxpICQxMCwgMyAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTAsICRmMTYgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMCwgJGYwLCAkZjE2ICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMTYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGYxNCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMiwgJGYyLCAkZjE0ICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJGYwLCAkZjAsICRmMTQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjIsICRmMiwgJGYxNCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMiwgJGYyLCAkZjYgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFuZG4gJGY4LCAkZjgsICRmMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYW5kbiAkZjEwLCAkZjEwLCAkZjIgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2R4YzEgJGY4LCAwKCQ4LCAlMCkgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHhjMSAkZjEwLCA4KCQ4LCAlMCkgICAgICAgIFxyXG4iCi0gICAgICAgICJhZGRpICQ4LCAkOCwgMTYgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJsdHogJDgsIDFiICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OiJyIihibG9jaytuQ29lZmZzKSwiciIocXVhbnRfbWF0cml4K25Db2VmZnMpLCJtIihxc2NhbGUpLAotICAgICAgICAgICJnIigtMipuQ29lZmZzKQotICAgICAgICA6ICIkOCIsIiQxMCIsIm1lbW9yeSIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFoICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVtxc2NhbGVdLCAgJVtmdG1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2ggICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2tzc3doICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbYWRkcjBdLCAgICVbbkNvZWZmc10sICAgICAkMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiLnAyYWxpZ24gICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXAzXSwgJVthZGRyMF0sICVbYmxvY2tdLCAweDA4KQorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wNV0sICAgJVtmdG1wM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXA2XSwgJVthZGRyMF0sICVbcXVhbnRdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wN10sICVbYWRkcjBdLCAlW3F1YW50XSwgMHgwOCkKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RoICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0aCAgICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxaCAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRsaSAgICAgICAgJVt0bXAwXSwgICAgMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFoICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZG10YzEgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJvciAgICAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYW5kbiAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFuZG4gICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDZdLCAlW2FkZHIwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA3XSwgJVthZGRyMF0sICVbYmxvY2tdLCAweDA4KQorICAgICAgICBQVFJfQURESVUgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgMHgxMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJsdHogICAgICAgJVthZGRyMF0sICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pCisgICAgICAgIDogW2Jsb2NrXSJyIigobWlwc19yZWcpKGJsb2NrK25Db2VmZnMpKSwKKyAgICAgICAgICBbcXVhbnRdInIiKChtaXBzX3JlZykocXVhbnRfbWF0cml4K25Db2VmZnMpKSwKKyAgICAgICAgICBbbkNvZWZmc10iciIoKG1pcHNfcmVnKSgyKigtbkNvZWZmcykpKSwKKyAgICAgICAgICBbcXNjYWxlXSJyIihxc2NhbGUpCisgICAgICAgIDogIm1lbW9yeSIKICAgICApOwogCiAgICAgYmxvY2tbMF0gPSBibG9jazA7CkBAIC0yMzUsMTMyICsyNTcsODYgQEAKIHsKICAgICBpbnQ2NF90IG5Db2VmZnM7CiAgICAgY29uc3QgdWludDE2X3QgKnF1YW50X21hdHJpeDsKKyAgICBkb3VibGUgZnRtcFsxMF07CisgICAgdWludDY0X3QgdG1wWzFdOworICAgIG1pcHNfcmVnIGFkZHJbMV07CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisgICAgREVDTEFSRV9WQVJfQUREUlQ7CiAKICAgICBhdl9hc3NlcnQyKHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPj0gMCk7CiAgICAgbkNvZWZmcyA9IHMtPmludHJhX3NjYW50YWJsZS5yYXN0ZXJfZW5kW3MtPmJsb2NrX2xhc3RfaW5kZXhbbl1dICsgMTsKICAgICBxdWFudF9tYXRyaXggPSBzLT5pbnRlcl9tYXRyaXg7CiAKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgInBjbXBlcWggJGYxNCwgJGYxNCwgJGYxNCAgICAgICBcclxuIgotICAgICAgICAiZGxpICQxMCwgMTUgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTAsICRmMTYgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjEyLCAkZjEyLCAkZjEyICAgICAgICAgICBcclxuIgotICAgICAgICAibHdjMSAkZjEyLCAlMiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjE0LCAkZjE0LCAkZjE2ICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhY2tzc3doICRmMTIsICRmMTIsICRmMTIgICAgICBcclxuIgotICAgICAgICAicGFja3Nzd2ggJGYxMiwgJGYxMiwgJGYxMiAgICAgIFxyXG4iCi0gICAgICAgICJvciAkOCwgJTMsICQwICAgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMCwgMCgkOCwgJTApICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGR4YzEgJGYyLCA4KCQ4LCAlMCkgICAgICAgICBcclxuIgotICAgICAgICAibW92LmQgJGYxNiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjE4LCAkZjIgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzbGR4YzEgJGY4LCAwKCQ4LCAlMSkgICAgICAgICBcclxuIgotICAgICAgICAiZ3NsZHhjMSAkZjEwLCA4KCQ4LCAlMSkgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGY4LCAkZjgsICRmMTIgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBtdWxsaCAkZjEwLCAkZjEwLCAkZjEyICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmNCwgJGY0LCAkZjQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY2LCAkZjYsICRmNiAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBjbXBndGggJGY0LCAkZjQsICRmMCAgICAgICAgICBcclxuIgotICAgICAgICAicGNtcGd0aCAkZjYsICRmNiwgJGYyICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjIsICRmMiwgJGY2ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmNCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjIsICRmMiwgJGY2ICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMCwgJGYwLCAkZjAgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFkZGggJGYyLCAkZjIsICRmMiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkaCAkZjAsICRmMCwgJGYxNCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBhZGRoICRmMiwgJGYyLCAkZjE0ICAgICAgICAgICBcclxuIgotICAgICAgICAicG11bGxoICRmMCwgJGYwLCAkZjggICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyLCAkZjIsICRmMTAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjgsICRmOCwgJGY4ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMTAsICRmMTAsICRmMTAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFoICRmOCwgJGY4LCAkZjE2ICAgICAgICAgXHJcbiIKLSAgICAgICAgInBjbXBlcWggJGYxMCwgJGYxMCwgJGYxOCAgICAgICBcclxuIgotICAgICAgICAiZGxpICQxMCwgNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTAsICRmMTYgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzcmFoICRmMCwgJGYwLCAkZjE2ICAgICAgICAgICBcclxuIgotICAgICAgICAicHNyYWggJGYyLCAkZjIsICRmMTYgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGYxNCAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMiwgJGYyLCAkZjE0ICAgICAgICAgICBcclxuIgotICAgICAgICAib3IgJGYwLCAkZjAsICRmMTQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkZjIsICRmMiwgJGYxNCAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICBcclxuIgotICAgICAgICAieG9yICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgInBzdWJoICRmMiwgJGYyLCAkZjYgICAgICAgICAgICBcclxuIgotICAgICAgICAicGFuZG4gJGY4LCAkZjgsICRmMCAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYW5kbiAkZjEwLCAkZjEwLCAkZjIgICAgICAgICAgXHJcbiIKLSAgICAgICAgImdzc2R4YzEgJGY4LCAwKCQ4LCAlMCkgICAgICAgICBcclxuIgotICAgICAgICAiZ3NzZHhjMSAkZjEwLCA4KCQ4LCAlMCkgICAgICAgIFxyXG4iCi0gICAgICAgICJhZGRpICQ4LCAkOCwgMTYgICAgICAgICAgICAgICAgXHJcbiIKLSAgICAgICAgImJsdHogJDgsIDFiICAgICAgICAgICAgICAgICAgICBcclxuIgotICAgICAgICA6OiJyIihibG9jaytuQ29lZmZzKSwiciIocXVhbnRfbWF0cml4K25Db2VmZnMpLCJtIihxc2NhbGUpLAotICAgICAgICAgICJnIigtMipuQ29lZmZzKQotICAgICAgICA6IiQ4IiwiJDEwIiwibWVtb3J5IgotICAgICk7Ci19CisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxaCAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbXRjMSAgICAgICVbcXNjYWxlXSwgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNybGggICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2tzc3doICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrc3N3aCAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2FkZHIwXSwgICAlW25Db2VmZnNdLCAgICAgJDAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIi5wMmFsaWduICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLXZvaWQgZmZfZGVub2lzZV9kY3RfbW1pKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaykKLXsKLSAgICBjb25zdCBpbnQgaW50cmEgPSBzLT5tYl9pbnRyYTsKLSAgICBpbnQgKnN1bSA9IHMtPmRjdF9lcnJvcl9zdW1baW50cmFdOwotICAgIHVpbnQxNl90ICpvZmZzZXQgPSBzLT5kY3Rfb2Zmc2V0W2ludHJhXTsKLQotICAgIHMtPmRjdF9jb3VudFtpbnRyYV0rKzsKLQotICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICJ4b3IgJGYxNCwgJGYxNCwgJGYxNCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNCwgMCglW2Jsb2NrXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmNiwgOCglW2Jsb2NrXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYyLCAkZjIsICRmMiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZ3RoICRmMCwgJGYwLCAkZjQgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZ3RoICRmMiwgJGYyLCAkZjYgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY0LCAkZjQsICRmMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY2LCAkZjYsICRmMiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjQsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMTIsIDAoJVtvZmZzZXRdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjgsICRmNCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNoICRmNCwgJGY0LCAkZjEyICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMTIsIDgoJVtvZmZzZXRdKSAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjEwLCAkZjYgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3VidXNoICRmNiwgJGY2LCAkZjEyICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY0LCAkZjQsICRmMCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY2LCAkZjYsICRmMiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjQsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjYsICRmNiwgJGYyICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgMCglW2Jsb2NrXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNiwgOCglW2Jsb2NrXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjQsICRmOCAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjYsICRmMTAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGY4LCAkZjgsICRmMTQgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY0LCAkZjQsICRmMTQgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2tsaHcgJGYxMCwgJGYxMCwgJGYxNCAgICAgICAgIFxyXG4iCi0gICAgICAgICJwdW5wY2toaHcgJGY2LCAkZjYsICRmMTQgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMCwgMCglW3N1bV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdyAkZjgsICRmOCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMCwgOCglW3N1bV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdyAkZjQsICRmNCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMCwgMTYoJVtzdW1dKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdyAkZjEwLCAkZjEwLCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsZGMxICRmMCwgMjQoJVtzdW1dKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWRkdyAkZjYsICRmNiwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmOCwgMCglW3N1bV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNCwgOCglW3N1bV0pICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmMTAsIDE2KCVbc3VtXSkgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJzZGMxICRmNiwgMjQoJVtzdW1dKSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVtibG9ja10sICVbYmxvY2tdLCAxNiAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVtzdW1dLCAlW3N1bV0sIDMyICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJVtvZmZzZXRdLCAlW29mZnNldF0sIDE2ICAgIFxyXG4iCi0gICAgICAgICJkc3VidSAkOCwgJVtibG9jazFdLCAlW2Jsb2NrXSAgICAgIFxyXG4iCi0gICAgICAgICJiZ3R6ICQ4LCAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDogW2Jsb2NrXSIrciIoYmxvY2spLFtzdW1dIityIihzdW0pLFtvZmZzZXRdIityIihvZmZzZXQpCi0gICAgICAgIDogW2Jsb2NrMV0iciIoYmxvY2srNjQpCi0gICAgICAgIDogIiQ4IiwiJGYwIiwiJGYyIiwiJGY0IiwiJGY2IiwiJGY4IiwiJGYxMCIsIiRmMTIiLCIkZjE0IgorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXAzXSwgJVthZGRyMF0sICVbYmxvY2tdLCAweDA4KQorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wNV0sICAgJVtmdG1wM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXA2XSwgJVthZGRyMF0sICVbcXVhbnRdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wN10sICVbYWRkcjBdLCAlW3F1YW50XSwgMHgwOCkKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RoICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0aCAgICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWggICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJkbGkgICAgICAgICVbdG1wMF0sICAgIDB4MDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGVxaCAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImRtdGMxICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAib3IgICAgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFuZG4gICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmRuICAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TRFhDMSglW2Z0bXA2XSwgJVthZGRyMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wN10sICVbYWRkcjBdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgUFRSX0FERElVICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibHR6ICAgICAgICVbYWRkcjBdLCAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKQorICAgICAgICA6IFtibG9ja10iciIoKG1pcHNfcmVnKShibG9jaytuQ29lZmZzKSksCisgICAgICAgICAgW3F1YW50XSJyIigobWlwc19yZWcpKHF1YW50X21hdHJpeCtuQ29lZmZzKSksCisgICAgICAgICAgW25Db2VmZnNdInIiKChtaXBzX3JlZykoMiooLW5Db2VmZnMpKSksCisgICAgICAgICAgW3FzY2FsZV0iciIocXNjYWxlKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIApAQCAtMzcwLDYgKzM0NiwxMSBAQAogICAgIHVpbnQ2NF90IG5Db2VmZnM7CiAgICAgY29uc3QgdWludDE2X3QgKnF1YW50X21hdHJpeDsKICAgICBpbnQgYmxvY2swOworICAgIGRvdWJsZSBmdG1wWzEwXTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgbWlwc19yZWcgYWRkclsxXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKIAogICAgIGFzc2VydChzLT5ibG9ja19sYXN0X2luZGV4W25dPj0wKTsKIApAQCAtMzg2LDU4ICszNjcsMTQwIEBACiAgICAgcXVhbnRfbWF0cml4ID0gcy0+aW50cmFfbWF0cml4OwogCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJwY21wZXFoICRmMTQsICRmMTQsICRmMTQgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbGkgJDEwLCAxNSAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTAsICRmMTYgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMiwgJGYxMiwgJGYxMiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJsd2MxICRmMTIsICVbcXNjYWxlXSAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JsaCAkZjE0LCAkZjE0LCAkZjE2ICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrc3N3aCAkZjEyLCAkZjEyLCAkZjEyICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYWNrc3N3aCAkZjEyLCAkZjEyLCAkZjEyICAgICAgICAgIFxyXG4iCi0gICAgICAgICJvciAkOCwgJVtuY29lZmZzXSwgJDAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMCwgMCgkOCwgJVtibG9ja10pICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMiwgOCgkOCwgJVtibG9ja10pICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjE2LCAkZjAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJtb3YuZCAkZjE4LCAkZjIgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmOCwgMCgkOCwgJVtxdWFudF0pICAgICAgIFxyXG4iCi0gICAgICAgICJnc2xkeGMxICRmMTAsIDAoJDgsICVbcXVhbnRdKSAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGY4LCAkZjgsICRmMTIgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYxMCwgJGYxMCwgJGYxMiAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY0LCAkZjQsICRmNCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY2LCAkZjYsICRmNiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZ3RoICRmNCwgJGY0LCAkZjAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZ3RoICRmNiwgJGY2LCAkZjIgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYyLCAkZjIsICRmNiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjIsICRmMiwgJGY2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYwLCAkZjAsICRmOCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwbXVsbGggJGYyLCAkZjIsICRmMTAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGY4LCAkZjgsICRmOCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYxMCwgJGYxMCwgJGYxMCAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFoICRmOCwgJGY4LCAkZjE2ICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwY21wZXFoICRmMTAgLCRmMTAsICRmMTggICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbGkgJDEwLCAzICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJkbXRjMSAkMTAsICRmMTYgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjAsICRmMCwgJGYxNiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3JhaCAkZjIsICRmMiwgJGYxNiAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYwLCAkZjAsICRmNCAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJ4b3IgJGYyLCAkZjIsICRmNiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjAsICRmMCwgJGY0ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwc3ViaCAkZjIsICRmMiwgJGY2ICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYW5kbiAkZjgsICRmOCwgJGYwICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJwYW5kbiAkZjEwLCAkZjEwLCAkZjIgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmOCwgMCgkOCwgJVtibG9ja10pICAgICAgIFxyXG4iCi0gICAgICAgICJnc3NkeGMxICRmMTAsIDgoJDgsICVbYmxvY2tdKSAgICAgIFxyXG4iCi0gICAgICAgICJkYWRkaXUgJDgsICQ4LCAxNiAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgICJibGV6ICQ4LCAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4iCi0gICAgICAgIDo6W2Jsb2NrXSJyIihibG9jaytuQ29lZmZzKSxbcXVhbnRdInIiKHF1YW50X21hdHJpeCtuQ29lZmZzKSwKLSAgICAgICAgICBbcXNjYWxlXSJtIihxc2NhbGUpLFtuY29lZmZzXSJnIigtMipuQ29lZmZzKQotICAgICAgICA6ICIkOCIsIiQxMCIsIiRmMCIsIiRmMiIsIiRmNCIsIiRmNiIsIiRmOCIsIiRmMTAiLCIkZjEyIiwiJGYxNCIsIiRmMTYiLAotICAgICAgICAgICIkZjE4IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWggICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3FzY2FsZV0sICAlW2Z0bXA5XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrc3N3aCAgICVbZnRtcDldLCAgICVbZnRtcDldLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3Nzd2ggICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm9yICAgICAgICAgJVthZGRyMF0sICAgJVtuQ29lZmZzXSwgICAgICQwICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIucDJhbGlnbiAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERYQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA0XSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEWEMxKCVbZnRtcDVdLCAlW2FkZHIwXSwgJVtxdWFudF0sIDB4MDApCisgICAgICAgIE1NSV9MRFhDMSglW2Z0bXA2XSwgJVthZGRyMF0sICVbcXVhbnRdLCAweDA4KQorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGggICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZ3RoICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwY21wZXFoICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiZGxpICAgICAgICAlW3RtcDBdLCAgICAweDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBlcWggICAgJVtmdG1wNl0gLCAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFuZG4gICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhbmRuICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICAgICAweDEwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RYQzEoJVtmdG1wNV0sICVbYWRkcjBdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEWEMxKCVbZnRtcDZdLCAlW2FkZHIwXSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgICJibGV6ICAgICAgICVbYWRkcjBdLCAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKQorICAgICAgICA6IFtibG9ja10iciIoKG1pcHNfcmVnKShibG9jaytuQ29lZmZzKSksCisgICAgICAgICAgW3F1YW50XSJyIigobWlwc19yZWcpKHF1YW50X21hdHJpeCtuQ29lZmZzKSksCisgICAgICAgICAgW25Db2VmZnNdInIiKChtaXBzX3JlZykoMiooLW5Db2VmZnMpKSksCisgICAgICAgICAgW3FzY2FsZV0iciIocXNjYWxlKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIAogICAgIGJsb2NrWzBdPSBibG9jazA7CiB9CisKK3ZvaWQgZmZfZGVub2lzZV9kY3RfbW1pKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBjb25zdCBpbnQgaW50cmEgPSBzLT5tYl9pbnRyYTsKKyAgICBpbnQgKnN1bSA9IHMtPmRjdF9lcnJvcl9zdW1baW50cmFdOworICAgIHVpbnQxNl90ICpvZmZzZXQgPSBzLT5kY3Rfb2Zmc2V0W2ludHJhXTsKKyAgICBkb3VibGUgZnRtcFs4XTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgcy0+ZGN0X2NvdW50W2ludHJhXSsrOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGNtcGd0aCAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBjbXBndGggICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXA2XSwgJVtvZmZzZXRdLCAweDAwKQorICAgICAgICAibW92LmQgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJ1c2ggICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDZdLCAlW29mZnNldF0sIDB4MDgpCisgICAgICAgICJtb3YuZCAgICAgICVbZnRtcDddLCAgICVbZnRtcDNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YnVzaCAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDA4KQorICAgICAgICAibW92LmQgICAgICAlW2Z0bXAxXSwgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdi5kICAgICAgJVtmdG1wM10sICAgJVtmdG1wN10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsaHcgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGh3ICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xodyAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toaHcgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtzdW1dLCAweDAwKQorICAgICAgICAicGFkZHcgICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbc3VtXSwgMHgwOCkKKyAgICAgICAgInBhZGR3ICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW3N1bV0sIDB4MTApCisgICAgICAgICJwYWRkdyAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtzdW1dLCAweDE4KQorICAgICAgICAicGFkZHcgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNV0sICVbc3VtXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbc3VtXSwgMHgwOCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wN10sICVbc3VtXSwgMHgxMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbc3VtXSwgMHgxOCkKKyAgICAgICAgUFRSX0FERElVICAiJVtibG9ja10sICAgJVtibG9ja10sICAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbc3VtXSwgICAgICVbc3VtXSwgICAgICAgICAweDIwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfU1VCVSAgICIlW2FkZHIwXSwgICAlW2Jsb2NrMV0sICAgICAgJVtibG9ja10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERElVICAiJVtvZmZzZXRdLCAgJVtvZmZzZXRdLCAgICAgIDB4MTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJiZ3R6ICAgICAgICVbYWRkcjBdLCAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2FkZHIwXSI9JnIiKGFkZHJbMF0pLAorICAgICAgICAgIFtibG9ja10iKyZyIihibG9jayksICAgICAgICAgICAgICBbc3VtXSIrJnIiKHN1bSksCisgICAgICAgICAgW29mZnNldF0iKyZyIihvZmZzZXQpCisgICAgICAgIDogW2Jsb2NrMV0iciIoYmxvY2srNjQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3BpeGJsb2NrZHNwX21pcHMuaCBiL2xpYmF2Y29kZWMvbWlwcy9waXhibG9ja2RzcF9taXBzLmgKaW5kZXggN2Y4Y2M5Ni4uYTEyYjFhNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL3BpeGJsb2NrZHNwX21pcHMuaAorKysgYi9saWJhdmNvZGVjL21pcHMvcGl4YmxvY2tkc3BfbWlwcy5oCkBAIC0yNSwxNSArMjUsMTUgQEAKICNpbmNsdWRlICIuLi9tcGVndmlkZW8uaCIKIAogdm9pZCBmZl9kaWZmX3BpeGVsc19tc2EoaW50MTZfdCAqYXZfcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUpOwogdm9pZCBmZl9nZXRfcGl4ZWxzXzE2X21zYShpbnQxNl90ICpyZXN0cmljdCBkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CiB2b2lkIGZmX2dldF9waXhlbHNfOF9tc2EoaW50MTZfdCAqcmVzdHJpY3QgZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CiAKIHZvaWQgZmZfZ2V0X3BpeGVsc184X21taShpbnQxNl90ICphdl9yZXN0cmljdCBibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAotICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKIHZvaWQgZmZfZGlmZl9waXhlbHNfbW1pKGludDE2X3QgKmF2X3Jlc3RyaWN0IGJsb2NrLCBjb25zdCB1aW50OF90ICpzcmMxLAotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBpbnQgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUpOwogCiAjZW5kaWYgIC8vICNpZm5kZWYgQVZDT0RFQ19NSVBTX1BJWEJMT0NLRFNQX01JUFNfSApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3BpeGJsb2NrZHNwX21taS5jIGIvbGliYXZjb2RlYy9taXBzL3BpeGJsb2NrZHNwX21taS5jCmluZGV4IDMwNjMxZDguLmE5MTVhM2MgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy9waXhibG9ja2RzcF9tbWkuYworKysgYi9saWJhdmNvZGVjL21pcHMvcGl4YmxvY2tkc3BfbW1pLmMKQEAgLTIyLDU4ICsyMiwxMTQgQEAKICAqLwogCiAjaW5jbHVkZSAicGl4YmxvY2tkc3BfbWlwcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL2FzbWRlZnMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9tbWl1dGlscy5oIgogCiB2b2lkIGZmX2dldF9waXhlbHNfOF9tbWkoaW50MTZfdCAqYXZfcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKLSAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogeworICAgIGRvdWJsZSBmdG1wWzddOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJtb3ZlICQ4LCAkMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInhvciAkZjAsICRmMCwgJGYwICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJnc2xkbGMxICRmMiwgNyglMSkgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImdzbGRyYzEgJGYyLCAwKCUxKSAgICAgICAgICAgICBcblx0IgotICAgICAgICAicHVucGNrbGJoICRmNCwgJGYyLCAkZjAgICAgICAgIFxuXHQiCi0gICAgICAgICJwdW5wY2toYmggJGY2LCAkZjIsICRmMCAgICAgICAgXG5cdCIKLSAgICAgICAgImdzc2R4YzEgJGY0LCAwKCUwLCAkOCkgICAgICAgICBcblx0IgotICAgICAgICAiZ3NzZHhjMSAkZjYsIDgoJTAsICQ4KSAgICAgICAgIFxuXHQiCi0gICAgICAgICJkYWRkaXUgJDgsICQ4LCAxNiAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImRhZGR1ICUxLCAlMSwgJTIgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiZGFkZGkgJTMsICUzLCAtMSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJibmV6ICUzLCAxYiAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgOjoiciIoKHVpbnQ4X3QgKilibG9jayksInIiKHBpeGVscyksInIiKGxpbmVfc2l6ZSksInIiKDgpCi0gICAgICAgIDogIiQ4IiwibWVtb3J5IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wMl0sICVbcGl4ZWxzXSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNF0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW2Jsb2NrXSwgMHgxMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbYmxvY2tdLCAweDE4KQorICAgICAgICBQVFJfQUREVSAgICIlW3BpeGVsc10sICAlW3BpeGVsc10sICAgICAgJVtzdHJpZGVfeDJdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wMl0sICVbcGl4ZWxzXSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNF0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDIwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4MjgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW2Jsb2NrXSwgMHgzMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbYmxvY2tdLCAweDM4KQorICAgICAgICBQVFJfQUREVSAgICIlW3BpeGVsc10sICAlW3BpeGVsc10sICAgICAgJVtzdHJpZGVfeDJdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wMl0sICVbcGl4ZWxzXSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNF0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDQwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4NDgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW2Jsb2NrXSwgMHg1MCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbYmxvY2tdLCAweDU4KQorICAgICAgICBQVFJfQUREVSAgICIlW3BpeGVsc10sICAlW3BpeGVsc10sICAgICAgJVtzdHJpZGVfeDJdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtwaXhlbHNdLCAweDAwKQorICAgICAgICBNTUlfTERYQzEoJVtmdG1wMl0sICVbcGl4ZWxzXSwgJVtzdHJpZGVdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNF0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA2XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDYwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4NjgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW2Jsb2NrXSwgMHg3MCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbYmxvY2tdLCAweDc4KQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbcGl4ZWxzXSIrJnIiKHBpeGVscykKKyAgICAgICAgOiBbYmxvY2tdInIiKChtaXBzX3JlZylibG9jayksICAgICAgW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSksCisgICAgICAgICAgW3N0cmlkZV94Ml0iciIoKG1pcHNfcmVnKShzdHJpZGU8PDEpKQorICAgICAgICA6ICJtZW1vcnkiCiAgICAgKTsKIH0KIAogdm9pZCBmZl9kaWZmX3BpeGVsc19tbWkoaW50MTZfdCAqYXZfcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBzdHJpZGUpCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUpCiB7CisgICAgZG91YmxlIGZ0bXBbNV07CisgICAgbWlwc19yZWcgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJkbGkgJDIsIDggICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAieG9yICRmMTQsICRmMTQsICRmMTQgICAgICAgICAgXG5cdCIKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJnc2xkbGMxICRmMCwgNyglMSkgICAgICAgICAgICBcblx0IgotICAgICAgICAiZ3NsZHJjMSAkZjAsIDAoJTEpICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm9yICRmMiwgJGYwLCAkZjAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJnc2xkbGMxICRmNCwgNyglMikgICAgICAgICAgICBcblx0IgotICAgICAgICAiZ3NsZHJjMSAkZjQsIDAoJTIpICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm9yICRmNiwgJGY0LCAkZjQgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwdW5wY2tsYmggJGYwLCAkZjAsICRmMTQgICAgICBcblx0IgotICAgICAgICAicHVucGNraGJoICRmMiwgJGYyLCAkZjE0ICAgICAgXG5cdCIKLSAgICAgICAgInB1bnBja2xiaCAkZjQsICRmNCwgJGYxNCAgICAgIFxuXHQiCi0gICAgICAgICJwdW5wY2toYmggJGY2LCAkZjYsICRmMTQgICAgICBcblx0IgotICAgICAgICAicHN1YmggJGYwLCAkZjAsICRmNCAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInBzdWJoICRmMiwgJGYyLCAkZjYgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJnc3NkbGMxICRmMCwgNyglMCkgICAgICAgICAgICBcblx0IgotICAgICAgICAiZ3NzZHJjMSAkZjAsIDAoJTApICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImdzc2RsYzEgJGYyLCAxNSglMCkgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJnc3NkcmMxICRmMiwgOCglMCkgICAgICAgICAgICBcblx0IgotICAgICAgICAiZGFkZGkgJTAsICUwLCAxNiAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImRhZGR1ICUxLCAlMSwgJTMgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJkYWRkdSAlMiwgJTIsICUzICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiZGFkZGkgJDIsICQyLCAtMSAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImJndHogJDIsIDFiICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIDo6InIiKGJsb2NrKSwiciIoc3JjMSksInIiKHNyYzIpLCJyIihzdHJpZGUpCi0gICAgICAgIDogIiQyIiwibWVtb3J5IgorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVtzcmMxXSwgMHgwMCkKKyAgICAgICAgIm9yICAgICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW3NyYzJdLCAweDAwKQorICAgICAgICAib3IgICAgICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHN1YmggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIFBUUl9BRERJICAgIiVbdG1wMF0sICAgICVbdG1wMF0sIC0weDAxICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW2Jsb2NrXSwgICAlW2Jsb2NrXSwgMHgxMCAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjMl0sICAgICVbc3JjMl0sICAgICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYmd0eiAgICAgICAlW3RtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2Jsb2NrXSIrJnIiKGJsb2NrKSwgICAgICAgICAgICAgIFtzcmMxXSIrJnIiKHNyYzEpLAorICAgICAgICAgIFtzcmMyXSIrJnIiKHNyYzIpCisgICAgICAgIDogW3N0cmlkZV0iciIoKG1pcHNfcmVnKXN0cmlkZSkKKyAgICAgICAgOiAibWVtb3J5IgogICAgICk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvcGl4YmxvY2tkc3BfbXNhLmMgYi9saWJhdmNvZGVjL21pcHMvcGl4YmxvY2tkc3BfbXNhLmMKaW5kZXggOTY2ZTExYS4uODZhNDU3NiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL3BpeGJsb2NrZHNwX21zYS5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy9waXhibG9ja2RzcF9tc2EuYwpAQCAtMTM3LDcgKzEzNyw3IEBACiB9CiAKIHZvaWQgZmZfZGlmZl9waXhlbHNfbXNhKGludDE2X3QgKmF2X3Jlc3RyaWN0IGJsb2NrLCBjb25zdCB1aW50OF90ICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50IHN0cmlkZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIHB0cmRpZmZfdCBzdHJpZGUpCiB7CiAgICAgZGlmZl9waXhlbHNfbXNhKGJsb2NrLCBzcmMxLCBzcmMyLCBzdHJpZGUpOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3NicmRzcF9taXBzLmMgYi9saWJhdmNvZGVjL21pcHMvc2JyZHNwX21pcHMuYwppbmRleCBjMjAzMDk1Li4xYjBhMTA2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvc2JyZHNwX21pcHMuYworKysgYi9saWJhdmNvZGVjL21pcHMvc2JyZHNwX21pcHMuYwpAQCAtMTY2LDYgKzE2Niw3IEBACiB9CiAKICNpZiBIQVZFX01JUFNGUFUKKyNpZiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNgogc3RhdGljIHZvaWQgc2JyX3N1bTY0eDVfbWlwcyhmbG9hdCAqeikKIHsKICAgICBpbnQgazsKQEAgLTg4Miw2ICs4ODMsNyBAQAogICAgICAgIHBoaV9zaWduID0gLXBoaV9zaWduOwogICAgIH0KIH0KKyNlbmRpZiAvKiAhSEFWRV9NSVBTMzJSNiAmJiAhSEFWRV9NSVBTNjRSNiAqLwogI2VuZGlmIC8qIEhBVkVfTUlQU0ZQVSAqLwogI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLwogCkBAIC04OTEsNiArODkzLDcgQEAKICAgICBzLT5xbWZfcHJlX3NodWZmbGUgPSBzYnJfcW1mX3ByZV9zaHVmZmxlX21pcHM7CiAgICAgcy0+cW1mX3Bvc3Rfc2h1ZmZsZSA9IHNicl9xbWZfcG9zdF9zaHVmZmxlX21pcHM7CiAjaWYgSEFWRV9NSVBTRlBVCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKICAgICBzLT5zdW02NHg1ID0gc2JyX3N1bTY0eDVfbWlwczsKICAgICBzLT5zdW1fc3F1YXJlID0gc2JyX3N1bV9zcXVhcmVfbWlwczsKICAgICBzLT5xbWZfZGVpbnRfYmZseSA9IHNicl9xbWZfZGVpbnRfYmZseV9taXBzOwpAQCAtOTAyLDYgKzkwNSw3IEBACiAgICAgcy0+aGZfYXBwbHlfbm9pc2VbMV0gPSBzYnJfaGZfYXBwbHlfbm9pc2VfMV9taXBzOwogICAgIHMtPmhmX2FwcGx5X25vaXNlWzJdID0gc2JyX2hmX2FwcGx5X25vaXNlXzJfbWlwczsKICAgICBzLT5oZl9hcHBseV9ub2lzZVszXSA9IHNicl9oZl9hcHBseV9ub2lzZV8zX21pcHM7CisjZW5kaWYgLyogIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYgKi8KICNlbmRpZiAvKiBIQVZFX01JUFNGUFUgKi8KICNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy9zaW1wbGVfaWRjdF9tc2EuYyBiL2xpYmF2Y29kZWMvbWlwcy9zaW1wbGVfaWRjdF9tc2EuYwppbmRleCBiZDhiMzEwLi44YTcyMzU5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvc2ltcGxlX2lkY3RfbXNhLmMKKysrIGIvbGliYXZjb2RlYy9taXBzL3NpbXBsZV9pZGN0X21zYS5jCkBAIC01NjIsMTIgKzU2MiwxMiBAQAogICAgIHNpbXBsZV9pZGN0X21zYShibG9jayk7CiB9CiAKLXZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X21zYSh1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwgaW50MTZfdCAqYmxvY2spCit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9tc2EodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgc2ltcGxlX2lkY3RfcHV0X21zYShkc3QsIGRzdF9zdHJpZGUsIGJsb2NrKTsKIH0KIAotdm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfbXNhKHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLCBpbnQxNl90ICpibG9jaykKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLCBpbnQxNl90ICpibG9jaykKIHsKICAgICBzaW1wbGVfaWRjdF9hZGRfbXNhKGRzdCwgZHN0X3N0cmlkZSwgYmxvY2spOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3ZjMWRzcF9pbml0X21pcHMuYyBiL2xpYmF2Y29kZWMvbWlwcy92YzFkc3BfaW5pdF9taXBzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkYzllMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbWlwcy92YzFkc3BfaW5pdF9taXBzLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgWmhvdSBYaWFveW9uZyA8emhvdXhpYW95b25nQGxvb25nc29uLmNuPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3ZjMWRzcC5oIgorI2luY2x1ZGUgInZjMWRzcF9taXBzLmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX01NSQorc3RhdGljIGF2X2NvbGQgdm9pZCB2YzFkc3BfaW5pdF9tbWkoVkMxRFNQQ29udGV4dCAqZHNwKQoreworI2lmIF9NSVBTX1NJTSAhPSBfQUJJTzMyCisgICAgZHNwLT52YzFfaW52X3RyYW5zXzh4OCAgICA9IGZmX3ZjMV9pbnZfdHJhbnNfOHg4X21taTsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfNHg4ICAgID0gZmZfdmMxX2ludl90cmFuc180eDhfbW1pOworICAgIGRzcC0+dmMxX2ludl90cmFuc184eDQgICAgPSBmZl92YzFfaW52X3RyYW5zXzh4NF9tbWk7CisjZW5kaWYKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfNHg0ICAgID0gZmZfdmMxX2ludl90cmFuc180eDRfbW1pOworICAgIGRzcC0+dmMxX2ludl90cmFuc184eDhfZGMgPSBmZl92YzFfaW52X3RyYW5zXzh4OF9kY19tbWk7CisgICAgZHNwLT52YzFfaW52X3RyYW5zXzR4OF9kYyA9IGZmX3ZjMV9pbnZfdHJhbnNfNHg4X2RjX21taTsKKyAgICBkc3AtPnZjMV9pbnZfdHJhbnNfOHg0X2RjID0gZmZfdmMxX2ludl90cmFuc184eDRfZGNfbW1pOworICAgIGRzcC0+dmMxX2ludl90cmFuc180eDRfZGMgPSBmZl92YzFfaW52X3RyYW5zXzR4NF9kY19tbWk7CisKKyAgICBkc3AtPnZjMV9oX292ZXJsYXAgICAgICAgID0gZmZfdmMxX2hfb3ZlcmxhcF9tbWk7CisgICAgZHNwLT52YzFfdl9vdmVybGFwICAgICAgICA9IGZmX3ZjMV92X292ZXJsYXBfbW1pOworICAgIGRzcC0+dmMxX2hfc19vdmVybGFwICAgICAgPSBmZl92YzFfaF9zX292ZXJsYXBfbW1pOworICAgIGRzcC0+dmMxX3Zfc19vdmVybGFwICAgICAgPSBmZl92YzFfdl9zX292ZXJsYXBfbW1pOworCisgICAgZHNwLT52YzFfdl9sb29wX2ZpbHRlcjQgID0gZmZfdmMxX3ZfbG9vcF9maWx0ZXI0X21taTsKKyAgICBkc3AtPnZjMV9oX2xvb3BfZmlsdGVyNCAgPSBmZl92YzFfaF9sb29wX2ZpbHRlcjRfbW1pOworICAgIGRzcC0+dmMxX3ZfbG9vcF9maWx0ZXI4ICA9IGZmX3ZjMV92X2xvb3BfZmlsdGVyOF9tbWk7CisgICAgZHNwLT52YzFfaF9sb29wX2ZpbHRlcjggID0gZmZfdmMxX2hfbG9vcF9maWx0ZXI4X21taTsKKyAgICBkc3AtPnZjMV92X2xvb3BfZmlsdGVyMTYgPSBmZl92YzFfdl9sb29wX2ZpbHRlcjE2X21taTsKKyAgICBkc3AtPnZjMV9oX2xvb3BfZmlsdGVyMTYgPSBmZl92YzFfaF9sb29wX2ZpbHRlcjE2X21taTsKKworI2RlZmluZSBGTl9BU1NJR04oT1AsIFgsIFksIElOU04pIFwKKyAgICBkc3AtPk9QIyN2YzFfbXNwZWxfcGl4ZWxzX3RhYlsxXVtYKzQqWV0gPSBmZl8jI09QIyN2YzFfbXNwZWxfbWMjI1gjI1kjI0lOU047IFwKKyAgICBkc3AtPk9QIyN2YzFfbXNwZWxfcGl4ZWxzX3RhYlswXVtYKzQqWV0gPSBmZl8jI09QIyN2YzFfbXNwZWxfbWMjI1gjI1kjI18xNiMjSU5TTgorCisgICAgRk5fQVNTSUdOKHB1dF8sIDAsIDAsIF9tbWkpOworICAgIEZOX0FTU0lHTihwdXRfLCAwLCAxLCBfbW1pKTsKKyAgICBGTl9BU1NJR04ocHV0XywgMCwgMiwgX21taSk7CisgICAgRk5fQVNTSUdOKHB1dF8sIDAsIDMsIF9tbWkpOworCisgICAgRk5fQVNTSUdOKHB1dF8sIDEsIDAsIF9tbWkpOworICAgIC8vRk5fQVNTSUdOKHB1dF8sIDEsIDEsIF9tbWkpOy8vRklYTUUKKyAgICAvL0ZOX0FTU0lHTihwdXRfLCAxLCAyLCBfbW1pKTsvL0ZJWE1FCisgICAgLy9GTl9BU1NJR04ocHV0XywgMSwgMywgX21taSk7Ly9GSVhNRQorCisgICAgRk5fQVNTSUdOKHB1dF8sIDIsIDAsIF9tbWkpOworICAgIC8vRk5fQVNTSUdOKHB1dF8sIDIsIDEsIF9tbWkpOy8vRklYTUUKKyAgICAvL0ZOX0FTU0lHTihwdXRfLCAyLCAyLCBfbW1pKTsvL0ZJWE1FCisgICAgLy9GTl9BU1NJR04ocHV0XywgMiwgMywgX21taSk7Ly9GSVhNRQorCisgICAgRk5fQVNTSUdOKHB1dF8sIDMsIDAsIF9tbWkpOworICAgIC8vRk5fQVNTSUdOKHB1dF8sIDMsIDEsIF9tbWkpOy8vRklYTUUKKyAgICAvL0ZOX0FTU0lHTihwdXRfLCAzLCAyLCBfbW1pKTsvL0ZJWE1FCisgICAgLy9GTl9BU1NJR04ocHV0XywgMywgMywgX21taSk7Ly9GSVhNRQorCisgICAgRk5fQVNTSUdOKGF2Z18sIDAsIDAsIF9tbWkpOworICAgIEZOX0FTU0lHTihhdmdfLCAwLCAxLCBfbW1pKTsKKyAgICBGTl9BU1NJR04oYXZnXywgMCwgMiwgX21taSk7CisgICAgRk5fQVNTSUdOKGF2Z18sIDAsIDMsIF9tbWkpOworCisgICAgRk5fQVNTSUdOKGF2Z18sIDEsIDAsIF9tbWkpOworICAgIC8vRk5fQVNTSUdOKGF2Z18sIDEsIDEsIF9tbWkpOy8vRklYTUUKKyAgICAvL0ZOX0FTU0lHTihhdmdfLCAxLCAyLCBfbW1pKTsvL0ZJWE1FCisgICAgLy9GTl9BU1NJR04oYXZnXywgMSwgMywgX21taSk7Ly9GSVhNRQorCisgICAgRk5fQVNTSUdOKGF2Z18sIDIsIDAsIF9tbWkpOworICAgIC8vRk5fQVNTSUdOKGF2Z18sIDIsIDEsIF9tbWkpOy8vRklYTUUKKyAgICAvL0ZOX0FTU0lHTihhdmdfLCAyLCAyLCBfbW1pKTsvL0ZJWE1FCisgICAgLy9GTl9BU1NJR04oYXZnXywgMiwgMywgX21taSk7Ly9GSVhNRQorCisgICAgRk5fQVNTSUdOKGF2Z18sIDMsIDAsIF9tbWkpOworICAgIC8vRk5fQVNTSUdOKGF2Z18sIDMsIDEsIF9tbWkpOy8vRklYTUUKKyAgICAvL0ZOX0FTU0lHTihhdmdfLCAzLCAyLCBfbW1pKTsvL0ZJWE1FCisgICAgLy9GTl9BU1NJR04oYXZnXywgMywgMywgX21taSk7Ly9GSVhNRQorCisgICAgZHNwLT5wdXRfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX3B1dF9ub19ybmRfdmMxX2Nocm9tYV9tYzhfbW1pOworICAgIGRzcC0+YXZnX25vX3JuZF92YzFfY2hyb21hX3BpeGVsc190YWJbMF0gPSBmZl9hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfbWM4X21taTsKKyAgICBkc3AtPnB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzFdID0gZmZfcHV0X25vX3JuZF92YzFfY2hyb21hX21jNF9tbWk7CisgICAgZHNwLT5hdmdfbm9fcm5kX3ZjMV9jaHJvbWFfcGl4ZWxzX3RhYlsxXSA9IGZmX2F2Z19ub19ybmRfdmMxX2Nocm9tYV9tYzRfbW1pOworfQorI2VuZGlmIC8qIEhBVkVfTU1JICovCisKK2F2X2NvbGQgdm9pZCBmZl92YzFkc3BfaW5pdF9taXBzKFZDMURTUENvbnRleHQgKmRzcCkKK3sKKyNpZiBIQVZFX01NSQorICAgIHZjMWRzcF9pbml0X21taShkc3ApOworI2VuZGlmIC8qIEhBVkVfTU1JICovCit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvdmMxZHNwX21pcHMuaCBiL2xpYmF2Y29kZWMvbWlwcy92YzFkc3BfbWlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjA3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21pcHMvdmMxZHNwX21pcHMuaApAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBaaG91IFhpYW95b25nIDx6aG91eGlhb3lvbmdAbG9vbmdzb24uY24+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19NSVBTX1ZDMURTUF9NSVBTX0gKKyNkZWZpbmUgQVZDT0RFQ19NSVBTX1ZDMURTUF9NSVBTX0gKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvdmMxZHNwLmgiCisKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzAwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzAxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzAyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzAzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzEwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzExX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzEyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzEzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzIwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzIxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzIyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzIzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzMwX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzMxX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzMyX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzMzX21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKKwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMTBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMTFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMTJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMTNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMjBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMjFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMjJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMjNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMzBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMzFfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMzJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMzNfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOworCisKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzAwXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzAxXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzAyXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzAzXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzEwXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzExXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzEyXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzEzXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzIwXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzIxXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzIyXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzIzXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzMwXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzMxXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzMyXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYzMzXzE2X21taSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcm5kKTsKKwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDBfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDFfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDJfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDNfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMTBfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMTFfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMTJfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMTNfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMjBfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMjFfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMjJfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMjNfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMzBfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMzFfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMzJfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOwordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMzNfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpOworCit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfOHg4X21taShpbnQxNl90IGJsb2NrWzY0XSk7Cit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfOHg0X21taSh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfdmMxX2ludl90cmFuc180eDhfbW1pKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92YzFfaW52X3RyYW5zXzR4NF9tbWkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfdmMxX2ludl90cmFuc180eDRfZGNfbW1pKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92YzFfaW52X3RyYW5zXzR4OF9kY19tbWkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfOHg0X2RjX21taSh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfdmMxX2ludl90cmFuc184eDhfZGNfbW1pKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spOworCit2b2lkIGZmX3ZjMV92X292ZXJsYXBfbW1pKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSk7Cit2b2lkIGZmX3ZjMV9oX292ZXJsYXBfbW1pKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSk7Cit2b2lkIGZmX3ZjMV92X3Nfb3ZlcmxhcF9tbWkoaW50MTZfdCAqdG9wLCBpbnQxNl90ICpib3R0b20pOwordm9pZCBmZl92YzFfaF9zX292ZXJsYXBfbW1pKGludDE2X3QgKmxlZnQsIGludDE2X3QgKnJpZ2h0KTsKKwordm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjRfbW1pKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKTsKK3ZvaWQgZmZfdmMxX2hfbG9vcF9maWx0ZXI0X21taSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSk7Cit2b2lkIGZmX3ZjMV92X2xvb3BfZmlsdGVyOF9tbWkodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpOwordm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjhfbW1pKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKTsKK3ZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXIxNl9tbWkodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpOwordm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjE2X21taSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSk7CisKK3ZvaWQgZmZfcHV0X25vX3JuZF92YzFfY2hyb21hX21jOF9tbWkodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfcHV0X25vX3JuZF92YzFfY2hyb21hX21jNF9tbWkodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX25vX3JuZF92YzFfY2hyb21hX21jOF9tbWkodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKK3ZvaWQgZmZfYXZnX25vX3JuZF92YzFfY2hyb21hX21jNF9tbWkodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUlQU19WQzFEU1BfTUlQU19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvdmMxZHNwX21taS5jIGIvbGliYXZjb2RlYy9taXBzL3ZjMWRzcF9tbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWU3ZjlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9taXBzL3ZjMWRzcF9tbWkuYwpAQCAtMCwwICsxLDIwODEgQEAKKy8qCisgKiBWQy0xIGFuZCBXTVYzIC0gRFNQIGZ1bmN0aW9ucyBMb29uZ3NvbiBNTUktb3B0aW1pemVkCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFpob3UgWGlhb3lvbmcgPHpob3V4aWFveW9uZ0Bsb29uZ3Nvbi5jbj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdmMxZHNwLmgiCisjaW5jbHVkZSAiY29uc3RhbnRzLmgiCisjaW5jbHVkZSAidmMxZHNwX21pcHMuaCIKKyNpbmNsdWRlICJocGVsZHNwX21pcHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9tbWl1dGlscy5oIgorCisKKyNkZWZpbmUgVkMxX0lOVl9UUkFOQ1NfOF9TVEVQMV9NTUkoZnAxLCAgIGZwMiwgICBmcDMsICAgZnA0LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8xLCAgICBvMiwgICAgbzMsICAgIG80LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSwgICAgdDIsICAgIHQzLCAgICB0NCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfcDEsIGZmX3AyLCBmZl9wMywgZmZfcDQpICAgICAgICAgICAgICBcCisgICAgICAgICJwbXVsbGggICAgICIjdDEiICAgLCAgICIjZnAxIiAgLCAgICIjZmZfcDEiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAiI3QyIiAgICwgICAiI2ZwMiIgICwgICAiI2ZmX3AyIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiN0MyIgICAsICAgIiNmcDMiICAsICAgIiNmZl9wMyIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICIjdDQiICAgLCAgICIjZnA0IiAgLCAgICIjZmZfcDQiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAiI28xIiAgICwgICAiI3QxIiAgICwgICAiI3QyIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNvMSIgICAsICAgIiNvMSIgICAsICAgIiN0MyIgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkaCAgICAgICIjbzEiICAgLCAgICIjbzEiICAgLCAgICIjdDQiICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiN0MSIgICAsICAgIiNmcDEiICAsICAgIiNmZl9wMiIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICIjdDIiICAgLCAgICIjZnAyIiAgLCAgICIjZmZfcDQiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAiI3QzIiAgICwgICAiI2ZwMyIgICwgICAiI2ZmX3AxIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiN0NCIgICAsICAgIiNmcDQiICAsICAgIiNmZl9wMyIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3ViaCAgICAgICIjbzIiICAgLCAgICIjdDEiICAgLCAgICIjdDIiICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YmggICAgICAiI28yIiAgICwgICAiI28yIiAgICwgICAiI3QzIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJoICAgICAgIiNvMiIgICAsICAgIiNvMiIgICAsICAgIiN0NCIgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicG11bGxoICAgICAiI3QxIiAgICwgICAiI2ZwMSIgICwgICAiI2ZmX3AzIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiN0MiIgICAsICAgIiNmcDIiICAsICAgIiNmZl9wMSIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICIjdDMiICAgLCAgICIjZnAzIiAgLCAgICIjZmZfcDQiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAiI3Q0IiAgICwgICAiI2ZwNCIgICwgICAiI2ZmX3AyIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJoICAgICAgIiNvMyIgICAsICAgIiN0MSIgICAsICAgIiN0MiIgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkaCAgICAgICIjbzMiICAgLCAgICIjbzMiICAgLCAgICIjdDMiICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAiI28zIiAgICwgICAiI28zIiAgICwgICAiI3Q0IiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwbXVsbGggICAgICIjdDEiICAgLCAgICIjZnAxIiAgLCAgICIjZmZfcDQiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAiI3QyIiAgICwgICAiI2ZwMiIgICwgICAiI2ZmX3AzIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiN0MyIgICAsICAgIiNmcDMiICAsICAgIiNmZl9wMiIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICIjdDQiICAgLCAgICIjZnA0IiAgLCAgICIjZmZfcDEiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YmggICAgICAiI280IiAgICwgICAiI3QxIiAgICwgICAiI3QyIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNvNCIgICAsICAgIiNvNCIgICAsICAgIiN0MyIgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3ViaCAgICAgICIjbzQiICAgLCAgICIjbzQiICAgLCAgICIjdDQiICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKworI2RlZmluZSBWQzFfSU5WX1RSQU5DU184X1NURVAyX01NSShmcDEsICAgZnAyLCAgIGZwMywgICBmcDQsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnA1LCAgIGZwNiwgICBmcDcsICAgZnA4LCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8xLCAgICBvMiwgICAgbzMsICAgIG80LCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9wMSwgZmZfcDIsIGZmX3AzLCBmZl9wdykgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNmcDUiICAsICAgIiNmcDEiICAsICAgIiNmcDIiICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3ViaCAgICAgICIjZnA2IiAgLCAgICIjZnAxIiAgLCAgICIjZnAyIiAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAiI2ZwNSIgICwgICAiI2ZwNSIgICwgICAiI2ZmX3AxIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiNmcDYiICAsICAgIiNmcDYiICAsICAgIiNmZl9wMSIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkaCAgICAgICIjZnA1IiAgLCAgICIjZnA1IiAgLCAgICIjZmZfcHciICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAiI2ZwNiIgICwgICAiI2ZwNiIgICwgICAiI2ZmX3B3IiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwbXVsbGggICAgICIjZnAxIiAgLCAgICIjZnAzIiAgLCAgICIjZmZfcDIiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAiI2ZwMiIgICwgICAiI2ZwNCIgICwgICAiI2ZmX3AzIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiNmcDMiICAsICAgIiNmcDMiICAsICAgIiNmZl9wMyIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICIjZnA0IiAgLCAgICIjZnA0IiAgLCAgICIjZmZfcDIiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAiI2ZwNyIgICwgICAiI2ZwMSIgICwgICAiI2ZwMiIgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJoICAgICAgIiNmcDgiICAsICAgIiNmcDMiICAsICAgIiNmcDQiICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZGggICAgICAiI2ZwMSIgICwgICAiI2ZwNSIgICwgICAiI2ZwNyIgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNmcDIiICAsICAgIiNmcDYiICAsICAgIiNmcDgiICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3ViaCAgICAgICIjZnAzIiAgLCAgICIjZnA2IiAgLCAgICIjZnA4IiAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YmggICAgICAiI2ZwNCIgICwgICAiI2ZwNSIgICwgICAiI2ZwNyIgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkaCAgICAgICIjZnA1IiAgLCAgICIjZnAxIiAgLCAgICIjbzEiICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAiI2ZwNiIgICwgICAiI2ZwMiIgICwgICAiI28yIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNmcDciICAsICAgIiNmcDMiICAsICAgIiNvMyIgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkaCAgICAgICIjZnA4IiAgLCAgICIjZnA0IiAgLCAgICIjbzQiICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzdWJoICAgICAgIiNmcDQiICAsICAgIiNmcDQiICAsICAgIiNvNCIgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3ViaCAgICAgICIjZnAzIiAgLCAgICIjZnAzIiAgLCAgICIjbzMiICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YmggICAgICAiI2ZwMiIgICwgICAiI2ZwMiIgICwgICAiI28yIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJoICAgICAgIiNmcDEiICAsICAgIiNmcDEiICAsICAgIiNvMSIgICAgICAgICAgICAgICAgICAgXG5cdCIKKworCisjZGVmaW5lIFZDMV9JTlZfVFJBTkNTXzRfU1RFUDFfTU1JKGZwMSwgICBmcDIsICAgZnAzLCAgIGZwNCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcDUsICAgZnA2LCAgIGZwNywgICBmcDgsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfcDEsIGZmX3AyLCBmZl9wMywgZmZfcHcpICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkaCAgICAgICIjZnA1IiAgLCAgICIjZnAxIiAgLCAgICIjZnAyIiAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YmggICAgICAiI2ZwNiIgICwgICAiI2ZwMSIgICwgICAiI2ZwMiIgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiNmcDUiICAsICAgIiNmcDUiICAsICAgIiNmZl9wMSIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICIjZnA2IiAgLCAgICIjZnA2IiAgLCAgICIjZmZfcDEiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAiI2ZwNSIgICwgICAiI2ZwNSIgICwgICAiI2ZmX3B3IiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNmcDYiICAsICAgIiNmcDYiICAsICAgIiNmZl9wdyIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicG11bGxoICAgICAiI2ZwMSIgICwgICAiI2ZwMyIgICwgICAiI2ZmX3AyIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgIiNmcDIiICAsICAgIiNmcDQiICAsICAgIiNmZl9wMyIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICIjZnAzIiAgLCAgICIjZnAzIiAgLCAgICIjZmZfcDMiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAiI2ZwNCIgICwgICAiI2ZwNCIgICwgICAiI2ZmX3AyIiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNmcDciICAsICAgIiNmcDEiICAsICAgIiNmcDIiICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3ViaCAgICAgICIjZnA4IiAgLCAgICIjZnAzIiAgLCAgICIjZnA0IiAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNmcDEiICAsICAgIiNmcDUiICAsICAgIiNmcDciICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3ViaCAgICAgICIjZnAyIiAgLCAgICIjZnA2IiAgLCAgICIjZnA4IiAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAiI2ZwMyIgICwgICAiI2ZwNiIgICwgICAiI2ZwOCIgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJoICAgICAgIiNmcDQiICAsICAgIiNmcDUiICAsICAgIiNmcDciICAgICAgICAgICAgICAgICAgXG5cdCIKKworCisjZGVmaW5lIFZDMV9JTlZfVFJBTkNTXzRfU1RFUDJfTU1JKGZwMSwgZnAyLCBmcDMsIGZwNCwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcDUsIGZwNiwgZnA3LCBmcDgsIHplcm8pICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgIiNmcDUiICAsICAgIiNmcDUiICAsICAgIiN6ZXJvIiAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2tsYmggICIjZnA2IiAgLCAgICIjZnA2IiAgLCAgICIjemVybyIgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNrbGJoICAiI2ZwNyIgICwgICAiI2ZwNyIgICwgICAiI3plcm8iICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgIiNmcDgiICAsICAgIiNmcDgiICAsICAgIiN6ZXJvIiAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZGggICAgICAiI2ZwMSIgICwgICAiI2ZwMSIgICwgICAiI2ZwNSIgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgIiNmcDIiICAsICAgIiNmcDIiICAsICAgIiNmcDYiICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkaCAgICAgICIjZnAzIiAgLCAgICIjZnAzIiAgLCAgICIjZnA3IiAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAiI2ZwNCIgICwgICAiI2ZwNCIgICwgICAiI2ZwOCIgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWNrdXNoYiAgICIjZnAxIiAgLCAgICIjZnAxIiAgLCAgICIjemVybyIgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFja3VzaGIgICAiI2ZwMiIgICwgICAiI2ZwMiIgICwgICAiI3plcm8iICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhY2t1c2hiICAgIiNmcDMiICAsICAgIiNmcDMiICAsICAgIiN6ZXJvIiAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWNrdXNoYiAgICIjZnA0IiAgLCAgICIjZnA0IiAgLCAgICIjemVybyIgICAgICAgICAgICAgICAgIFxuXHQiCisKKworLyogRG8gaW52ZXJzZSB0cmFuc2Zvcm0gb24gOHg4IGJsb2NrICovCit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfOHg4X2RjX21taSh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBkYyA9IGJsb2NrWzBdOworICAgIGRvdWJsZSBmdG1wWzldOworICAgIG1pcHNfcmVnIGFkZHJbMV07CisgICAgaW50IGNvdW50OworCisgICAgZGMgPSAoMyAqIGRjICsgIDEpID4+IDE7CisgICAgZGMgPSAoMyAqIGRjICsgMTYpID4+IDU7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtkY10sICAgICAgJVtkY10sICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbY291bnRdLCAgIDB4MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtkZXN0XSwgICAgICAgICVbbGluZXNpemVdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbbGluZXNpemVdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDNdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgICAgICVbbGluZXNpemVdICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW2FkZHIwXSwgMHgwMCkKKworICAgICAgICAicHVucGNraGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wN10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDddICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2Rlc3RdLCAgICAgICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAgICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbYWRkcjBdLCAweDAwKQorCisgICAgICAgICJhZGRpdSAgICAgICVbY291bnRdLCAgICVbY291bnRdLCAgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2Rlc3RdLCAgICAlW2FkZHIwXSwgICAgICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtjb3VudF0sICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksCisgICAgICAgICAgW2NvdW50XSI9JnIiKGNvdW50KSwgICAgICAgICAgW2Rlc3RdIismciIoZGVzdCkKKyAgICAgICAgOiBbbGluZXNpemVdInIiKChtaXBzX3JlZylsaW5lc2l6ZSksCisgICAgICAgICAgW2RjXSJmIihkYykKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKKyNpZiBfTUlQU19TSU0gIT0gX0FCSU8zMgordm9pZCBmZl92YzFfaW52X3RyYW5zXzh4OF9tbWkoaW50MTZfdCBibG9ja1s2NF0pCit7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCB0ZW1wWzY0XSk7CisgICAgaW50MTZfdCAqc3JjID0gYmxvY2s7CisgICAgaW50MTZfdCAqZHN0ID0gdGVtcDsKKyAgICBkb3VibGUgZnRtcFsxNl07CisgICAgdWludDMyX3QgY291bnQsIHRtcFsxXTsKKworICAgIC8vIDFzdCBsb29wCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICAgJVtjb3VudF0sICAgMHgwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAlW3NyY10sIDB4MTApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDZdLCAlW3NyY10sIDB4MzApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDddLCAlW3NyY10sIDB4NTApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDhdLCAlW3NyY10sIDB4NzApCisKKyAgICAgICAgVkMxX0lOVl9UUkFOQ1NfOF9TVEVQMV9NTUkoJVtmdG1wNV0sICVbZnRtcDZdLCAlW2Z0bXA3XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDldLCAlW2Z0bXAxMF0sICVbZnRtcDExXSwgJVtmdG1wMTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXAxXSwgJVtmdG1wMl0sICVbZnRtcDNdLCAlW2Z0bXA0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd18xNl0sICVbZmZfcHdfMTVdLCAlW2ZmX3B3XzldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2ZmX3B3XzRdKQorCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW3NyY10sIDB4NDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDNdLCAlW3NyY10sIDB4MjApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW3NyY10sIDB4NjApCisKKyAgICAgICAgVkMxX0lOVl9UUkFOQ1NfOF9TVEVQMl9NTUkoJVtmdG1wMV0sICVbZnRtcDJdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA5XSwgJVtmdG1wMTBdLCAlW2Z0bXAxMV0sICVbZnRtcDEyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd18xMl0sICVbZmZfcHdfMTZdLCAlW2ZmX3B3XzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2ZmX3B3XzRdKQorCisKKyAgICAgICAgUFNSQUhfOF9NTUkoJVtmdG1wNV0sICVbZnRtcDZdLCAlW2Z0bXA3XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICVbZnRtcDRdLCAlW2Z0bXAzXSwgJVtmdG1wMl0sICVbZnRtcDFdLCAlW2Z0bXAwXSkKKworICAgICAgICBUUkFOU1BPU0VfNEgoJVtmdG1wNV0sICVbZnRtcDZdLCAlW2Z0bXA3XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA5XSwgJVtmdG1wMTBdLCAlW2Z0bXAxMV0sICVbZnRtcDEyXSwKKyAgICAgICAgICAgICAgICAgICAgICVbZnRtcDEzXSwgJVt0bXAwXSwgICVbZnRtcDE0XSwgJVtmdG1wMTVdKQorCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDZdLCAlW2RzdF0sIDB4MTApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDddLCAlW2RzdF0sIDB4MjApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDhdLCAlW2RzdF0sIDB4MzApCisKKyAgICAgICAgVFJBTlNQT1NFXzRIKCVbZnRtcDRdLCAlW2Z0bXAzXSwgJVtmdG1wMl0sICVbZnRtcDFdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0sICVbZnRtcDEwXSwgJVtmdG1wMTFdLCAlW2Z0bXAxMl0sCisgICAgICAgICAgICAgICAgICAgICAlW2Z0bXAxM10sICVbdG1wMF0sICAlW2Z0bXAxNF0sICVbZnRtcDE1XSkKKworICAgICAgICBNTUlfU0RDMSglW2Z0bXA0XSwgJVtkc3RdLCAweDA4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDE4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtkc3RdLCAweDI4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtkc3RdLCAweDM4KQorCisgICAgICAgICJhZGRpdSAgICAgICVbY291bnRdLCAgICVbY291bnRdLCAgLTB4MDEgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW3NyY10sICAgICAlW3NyY10sICAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERElVICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgMHg0MCAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbY291bnRdLCAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW2Z0bXAxMF0iPSZmIihmdG1wWzEwXSksICAgICAgW2Z0bXAxMV0iPSZmIihmdG1wWzExXSksCisgICAgICAgICAgW2Z0bXAxMl0iPSZmIihmdG1wWzEyXSksICAgICAgW2Z0bXAxM10iPSZmIihmdG1wWzEzXSksCisgICAgICAgICAgW2Z0bXAxNF0iPSZmIihmdG1wWzE0XSksICAgICAgW2Z0bXAxNV0iPSZmIihmdG1wWzE1XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBbY291bnRdIj0mciIoY291bnQpLAorICAgICAgICAgIFtzcmNdIismciIoc3JjKSwgICAgICAgICAgICAgIFtkc3RdIismciIoZHN0KQorICAgICAgICA6IFtmZl9wd180XSJmIihmZl9wd180KSwgICAgICAgIFtmZl9wd182XSJmIihmZl9wd182KSwKKyAgICAgICAgICBbZmZfcHdfOV0iZiIoZmZfcHdfOSksICAgICAgICBbZmZfcHdfMTJdImYiKGZmX3B3XzEyKSwKKyAgICAgICAgICBbZmZfcHdfMTVdImYiKGZmX3B3XzE1KSwgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKworICAgIHNyYyA9IHRlbXA7CisgICAgZHN0ID0gYmxvY2s7CisKKyAgICAvLyAybmQgbG9vcAorICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbY291bnRdLCAgIDB4MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXA1XSwgJVtzcmNdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA2XSwgJVtzcmNdLCAweDMwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA3XSwgJVtzcmNdLCAweDUwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA4XSwgJVtzcmNdLCAweDcwKQorCisgICAgICAgIFZDMV9JTlZfVFJBTkNTXzhfU1RFUDFfTU1JKCVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA5XSwgJVtmdG1wMTBdLCAlW2Z0bXAxMV0sICVbZnRtcDEyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wMV0sICVbZnRtcDJdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZmZfcHdfMTZdLCAlW2ZmX3B3XzE1XSwgJVtmZl9wd185XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd180XSkKKworICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDQwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDIwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDYwKQorCisgICAgICAgIFZDMV9JTlZfVFJBTkNTXzhfU1RFUDJfTU1JKCVbZnRtcDFdLCAlW2Z0bXAyXSwgJVtmdG1wM10sICVbZnRtcDRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA1XSwgJVtmdG1wNl0sICVbZnRtcDddLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0sICVbZnRtcDEwXSwgJVtmdG1wMTFdLCAlW2Z0bXAxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZmZfcHdfMTJdLCAlW2ZmX3B3XzE2XSwgJVtmZl9wd182XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd182NF0pCisKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICVbZmZfcHdfMV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAlW2ZmX3B3XzFdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgUFNSQUhfOF9NTUkoJVtmdG1wNV0sICVbZnRtcDZdLCAlW2Z0bXA3XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICVbZnRtcDRdLCAlW2Z0bXAzXSwgJVtmdG1wMl0sICVbZnRtcDFdLCAlW2Z0bXAwXSkKKworICAgICAgICBNTUlfU0RDMSglW2Z0bXA1XSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVtkc3RdLCAweDEwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA3XSwgJVtkc3RdLCAweDIwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA4XSwgJVtkc3RdLCAweDMwKQorCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDRdLCAlW2RzdF0sIDB4NDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDNdLCAlW2RzdF0sIDB4NTApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2RzdF0sIDB4NjApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2RzdF0sIDB4NzApCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtjb3VudF0sICAgJVtjb3VudF0sICAtMHgwMSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgIDB4MDggICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAweDA4ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtjb3VudF0sICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbZnRtcDEwXSI9JmYiKGZ0bXBbMTBdKSwgICAgICBbZnRtcDExXSI9JmYiKGZ0bXBbMTFdKSwKKyAgICAgICAgICBbZnRtcDEyXSI9JmYiKGZ0bXBbMTJdKSwgICAgICBbZnRtcDEzXSI9JmYiKGZ0bXBbMTNdKSwKKyAgICAgICAgICBbZnRtcDE0XSI9JmYiKGZ0bXBbMTRdKSwgICAgICBbZnRtcDE1XSI9JmYiKGZ0bXBbMTVdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFtjb3VudF0iPSZyIihjb3VudCksCisgICAgICAgICAgW3NyY10iKyZyIihzcmMpLCAgICAgICAgICAgICAgW2RzdF0iKyZyIihkc3QpCisgICAgICAgIDogW2ZmX3B3XzFdImYiKGZmX3B3XzEpLCAgICAgICAgW2ZmX3B3XzRdImYiKGZmX3B3XzQpLAorICAgICAgICAgIFtmZl9wd182XSJmIihmZl9wd182KSwgICAgICAgIFtmZl9wd185XSJmIihmZl9wd185KSwKKyAgICAgICAgICBbZmZfcHdfMTJdImYiKGZmX3B3XzEyKSwgICAgICBbZmZfcHdfMTVdImYiKGZmX3B3XzE1KSwKKyAgICAgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KSwgICAgICBbZmZfcHdfNjRdImYiKGZmX3B3XzY0KQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKyNlbmRpZgorCisvKiBEbyBpbnZlcnNlIHRyYW5zZm9ybSBvbiA4eDQgcGFydCBvZiBibG9jayAqLwordm9pZCBmZl92YzFfaW52X3RyYW5zXzh4NF9kY19tbWkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgZGMgPSBibG9ja1swXTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKworICAgIGRjID0gKCAzICogZGMgKyAgMSkgPj4gMTsKKyAgICBkYyA9ICgxNyAqIGRjICsgNjQpID4+IDc7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtkY10sICAgICAgJVtkY10sICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbZGVzdDBdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtkZXN0MV0sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDNdLCAlW2Rlc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICVbZGVzdDNdLCAweDAwKQorCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDVdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wNl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA3XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDhdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZGVzdDBdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtkZXN0MV0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDNdLCAlW2Rlc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbZGVzdDNdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSkKKyAgICAgICAgOiBbZGVzdDBdInIiKGRlc3QrMCpsaW5lc2l6ZSksICBbZGVzdDFdInIiKGRlc3QrMSpsaW5lc2l6ZSksCisgICAgICAgICAgW2Rlc3QyXSJyIihkZXN0KzIqbGluZXNpemUpLCAgW2Rlc3QzXSJyIihkZXN0KzMqbGluZXNpemUpLAorICAgICAgICAgIFtkY10iZiIoZGMpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorCisjaWYgX01JUFNfU0lNICE9IF9BQklPMzIKK3ZvaWQgZmZfdmMxX2ludl90cmFuc184eDRfbW1pKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgaW50MTZfdCAqc3JjID0gYmxvY2s7CisgICAgaW50MTZfdCAqZHN0ID0gYmxvY2s7CisgICAgZG91YmxlIGZ0bXBbMTZdOworICAgIHVpbnQzMl90IHRtcFsxXTsKKyAgICBtaXBzX3JlZyBhZGRyWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworCisgICAgLy8gMXN0IGxvb3AKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbc3JjXSwgMHgwOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbc3JjXSwgMHgxMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICVbc3JjXSwgMHgxOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNV0sICVbc3JjXSwgMHgyMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNl0sICVbc3JjXSwgMHgyOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wN10sICVbc3JjXSwgMHgzMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wOF0sICVbc3JjXSwgMHgzOCkKKworICAgICAgICAvLyAgICAgICAgICAgICBhMSAgICAgICAgYjEgICAgICAgIGEzICAgICAgICBiMgorICAgICAgICBUUkFOU1BPU0VfNEgoJVtmdG1wMV0sICVbZnRtcDNdLCAlW2Z0bXA1XSwgJVtmdG1wN10sCisgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA5XSwgJVtmdG1wMTBdLCAlW2Z0bXAxMV0sICVbZnRtcDEyXSwKKyAgICAgICAgICAgICAgICAgICAgICVbZnRtcDEzXSwgJVt0bXAwXSwgICVbZnRtcDE0XSwgJVtmdG1wMTVdKQorCisgICAgICAgIC8vICAgICAgICAgICAgIGEyICAgICAgICBiMyAgICAgICAgYTQgICAgICAgIGI0CisgICAgICAgIFRSQU5TUE9TRV80SCglW2Z0bXAyXSwgJVtmdG1wNF0sICVbZnRtcDZdLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICVbZnRtcDldLCAlW2Z0bXAxMF0sICVbZnRtcDExXSwgJVtmdG1wMTJdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wMTNdLCAlW3RtcDBdLCAgJVtmdG1wMTRdLCAlW2Z0bXAxNV0pCisKKyAgICAgICAgLy8gaW5wdXQgYjEgYjIgYjMgYjQKKyAgICAgICAgVkMxX0lOVl9UUkFOQ1NfOF9TVEVQMV9NTUkoJVtmdG1wM10sICVbZnRtcDddLCAlW2Z0bXA0XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDldLCAlW2Z0bXAxMF0sICVbZnRtcDExXSwgJVtmdG1wMTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXAwXSwgJVtmdG1wMTNdLCAlW2Z0bXAxNF0sICVbZnRtcDE1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd18xNl0sICVbZmZfcHdfMTVdLCAlW2ZmX3B3XzldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2ZmX3B3XzRdKQorICAgICAgICAvLyBpbnB1dCBhMSBhMiBhMyBhNAorICAgICAgICBWQzFfSU5WX1RSQU5DU184X1NURVAyX01NSSglW2Z0bXAxXSwgJVtmdG1wMl0sICVbZnRtcDVdLCAlW2Z0bXA2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wM10sICVbZnRtcDddLCAlW2Z0bXA0XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDldLCAlW2Z0bXAxMF0sICVbZnRtcDExXSwgJVtmdG1wMTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2ZmX3B3XzEyXSwgJVtmZl9wd18xNl0sICVbZmZfcHdfNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZmZfcHdfNF0pCisKKyAgICAgICAgImxpICAgICAgICAgJVt0bXAwXSwgICAgMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIFBTUkFIXzhfTU1JKCVbZnRtcDNdLCAlW2Z0bXA3XSwgJVtmdG1wNF0sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAlW2Z0bXA2XSwgJVtmdG1wNV0sICVbZnRtcDJdLCAlW2Z0bXAxXSwgJVtmdG1wMF0pCisKKyAgICAgICAgVFJBTlNQT1NFXzRIKCVbZnRtcDNdLCAlW2Z0bXA3XSwgJVtmdG1wNF0sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0sICVbZnRtcDEwXSwgJVtmdG1wMTFdLCAlW2Z0bXAxMl0sCisgICAgICAgICAgICAgICAgICAgICAlW2Z0bXAxM10sICVbdG1wMF0sICAlW2Z0bXAxNF0sICVbZnRtcDE1XSkKKworICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA3XSwgJVtkc3RdLCAweDEwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA0XSwgJVtkc3RdLCAweDIwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA4XSwgJVtkc3RdLCAweDMwKQorCisgICAgICAgIFRSQU5TUE9TRV80SCglW2Z0bXA2XSwgJVtmdG1wNV0sICVbZnRtcDJdLCAlW2Z0bXAxXSwKKyAgICAgICAgICAgICAgICAgICAgICVbZnRtcDldLCAlW2Z0bXAxMF0sICVbZnRtcDExXSwgJVtmdG1wMTJdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wMTNdLCAlW3RtcDBdLCAgJVtmdG1wMTRdLCAlW2Z0bXAxNV0pCisKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNl0sICVbZHN0XSwgMHgwOCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNV0sICVbZHN0XSwgMHgxOCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgyOCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgzOCkKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLCAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLCAgICAgIFtmdG1wMTFdIj0mZiIoZnRtcFsxMV0pLAorICAgICAgICAgIFtmdG1wMTJdIj0mZiIoZnRtcFsxMl0pLCAgICAgIFtmdG1wMTNdIj0mZiIoZnRtcFsxM10pLAorICAgICAgICAgIFtmdG1wMTRdIj0mZiIoZnRtcFsxNF0pLCAgICAgIFtmdG1wMTVdIj0mZiIoZnRtcFsxNV0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSkKKyAgICAgICAgOiBbc3JjXSJyIihzcmMpLCAgICAgICAgICAgICAgICBbZHN0XSJyIihkc3QpLAorICAgICAgICAgIFtmZl9wd180XSJmIihmZl9wd180KSwgICAgICAgIFtmZl9wd182XSJmIihmZl9wd182KSwKKyAgICAgICAgICBbZmZfcHdfOV0iZiIoZmZfcHdfOSksICAgICAgICBbZmZfcHdfMTJdImYiKGZmX3B3XzEyKSwKKyAgICAgICAgICBbZmZfcHdfMTVdImYiKGZmX3B3XzE1KSwgICAgICBbZmZfcHdfMTZdImYiKGZmX3B3XzE2KQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKworICAgIHNyYyA9IGJsb2NrOworCisgICAgLy8gMm5kIGxvb3AKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpICAgICAgICAgJVt0bXAwXSwgICAgMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvLyBkZXN0IGxvdyAzMmJpdAorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDIwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDMwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDEwKQorCisgICAgICAgIFZDMV9JTlZfVFJBTkNTXzRfU1RFUDFfTU1JKCVbZnRtcDFdLCAlW2Z0bXAyXSwgJVtmdG1wM10sICVbZnRtcDRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA1XSwgJVtmdG1wNl0sICVbZnRtcDddLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd18xN10sICVbZmZfcHdfMTBdLCAlW2ZmX3B3XzIyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd182NF0pCisKKyAgICAgICAgUFNSQUhfNF9NTUkoJVtmdG1wMV0sICVbZnRtcDJdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sICVbZnRtcDldKQorCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDVdLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2Rlc3RdLCAgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wN10sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wOF0sICVbYWRkcjBdLCAweDAwKQorCisgICAgICAgIFZDMV9JTlZfVFJBTkNTXzRfU1RFUDJfTU1JKCVbZnRtcDFdLCAlW2Z0bXAyXSwgJVtmdG1wM10sICVbZnRtcDRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA1XSwgJVtmdG1wNl0sICVbZnRtcDddLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wMF0pCisKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZGVzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbZGVzdF0sICAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAyXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAzXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXA0XSwgJVthZGRyMF0sIDB4MDApCisKKyAgICAgICAgLy8gZGVzdCBoaWdoIDMyYml0CisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW3NyY10sIDB4MjgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDNdLCAlW3NyY10sIDB4MzgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW3NyY10sIDB4MTgpCisKKyAgICAgICAgVkMxX0lOVl9UUkFOQ1NfNF9TVEVQMV9NTUkoJVtmdG1wMV0sICVbZnRtcDJdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2ZmX3B3XzE3XSwgJVtmZl9wd18xMF0sICVbZmZfcHdfMjJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2ZmX3B3XzY0XSkKKworICAgICAgICBQU1JBSF80X01NSSglW2Z0bXAxXSwgJVtmdG1wMl0sICVbZnRtcDNdLCAlW2Z0bXA0XSwgJVtmdG1wOV0pCisKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wNV0sICVbZGVzdF0sIDB4MDQpCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbZGVzdF0sICAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXA2XSwgJVthZGRyMF0sIDB4MDQpCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXA3XSwgJVthZGRyMF0sIDB4MDQpCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXA4XSwgJVthZGRyMF0sIDB4MDQpCisKKyAgICAgICAgVkMxX0lOVl9UUkFOQ1NfNF9TVEVQMl9NTUkoJVtmdG1wMV0sICVbZnRtcDJdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXAwXSkKKworICAgICAgICBNTUlfU1dDMSglW2Z0bXAxXSwgJVtkZXN0XSwgMHgwNCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVtkZXN0XSwgICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDJdLCAlW2FkZHIwXSwgMHgwNCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDNdLCAlW2FkZHIwXSwgMHgwNCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDRdLCAlW2FkZHIwXSwgMHgwNCkKKworICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSkKKyAgICAgICAgOiBbc3JjXSJyIihzcmMpLCAgICAgICAgICAgICAgICBbZGVzdF0iciIoZGVzdCksCisgICAgICAgICAgW2xpbmVzaXplXSJyIigobWlwc19yZWcpbGluZXNpemUpLAorICAgICAgICAgIFtmZl9wd18xN10iZiIoZmZfcHdfMTcpLCAgICAgIFtmZl9wd18yMl0iZiIoZmZfcHdfMjIpLAorICAgICAgICAgIFtmZl9wd18xMF0iZiIoZmZfcHdfMTApLCAgICAgIFtmZl9wd182NF0iZiIoZmZfcHdfNjQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorI2VuZGlmCisKKy8qIERvIGludmVyc2UgdHJhbnNmb3JtIG9uIDR4OCBwYXJ0cyBvZiBibG9jayAqLwordm9pZCBmZl92YzFfaW52X3RyYW5zXzR4OF9kY19tbWkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQgZGMgPSBibG9ja1swXTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKworICAgIGRjID0gKDE3ICogZGMgKyAgNCkgPj4gMzsKKyAgICBkYyA9ICgxMiAqIGRjICsgNjQpID4+IDc7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtkY10sICAgICAgJVtkY10sICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMV0sICVbZGVzdDBdLCAweDAwKQorICAgICAgICBNTUlfTFdDMSglW2Z0bXAyXSwgJVtkZXN0MV0sIDB4MDApCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDNdLCAlW2Rlc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wNF0sICVbZGVzdDNdLCAweDAwKQorICAgICAgICBNTUlfTFdDMSglW2Z0bXA1XSwgJVtkZXN0NF0sIDB4MDApCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDZdLCAlW2Rlc3Q1XSwgMHgwMCkKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wN10sICVbZGVzdDZdLCAweDAwKQorICAgICAgICBNTUlfTFdDMSglW2Z0bXA4XSwgJVtkZXN0N10sIDB4MDApCisKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDhdLCAgICVbZnRtcDhdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZGVzdDBdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXAyXSwgJVtkZXN0MV0sIDB4MDApCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDNdLCAlW2Rlc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNF0sICVbZGVzdDNdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXA1XSwgJVtkZXN0NF0sIDB4MDApCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDZdLCAlW2Rlc3Q1XSwgMHgwMCkKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wN10sICVbZGVzdDZdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXA4XSwgJVtkZXN0N10sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKQorICAgICAgICA6IFtkZXN0MF0iciIoZGVzdCswKmxpbmVzaXplKSwgIFtkZXN0MV0iciIoZGVzdCsxKmxpbmVzaXplKSwKKyAgICAgICAgICBbZGVzdDJdInIiKGRlc3QrMipsaW5lc2l6ZSksICBbZGVzdDNdInIiKGRlc3QrMypsaW5lc2l6ZSksCisgICAgICAgICAgW2Rlc3Q0XSJyIihkZXN0KzQqbGluZXNpemUpLCAgW2Rlc3Q1XSJyIihkZXN0KzUqbGluZXNpemUpLAorICAgICAgICAgIFtkZXN0Nl0iciIoZGVzdCs2KmxpbmVzaXplKSwgIFtkZXN0N10iciIoZGVzdCs3KmxpbmVzaXplKSwKKyAgICAgICAgICBbZGNdImYiKGRjKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKworI2lmIF9NSVBTX1NJTSAhPSBfQUJJTzMyCit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfNHg4X21taSh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludDE2X3QgKnNyYyA9IGJsb2NrOworICAgIGludDE2X3QgKmRzdCA9IGJsb2NrOworICAgIGRvdWJsZSBmdG1wWzE2XTsKKyAgICB1aW50MzJfdCBjb3VudCwgdG1wWzFdOworICAgIG1pcHNfcmVnIGFkZHJbMV07CisgICAgREVDTEFSRV9WQVJfTE9XMzI7CisKKyAgICAvLyAxc3QgbG9vcAorICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgICAlW2NvdW50XSwgICAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICAgJVt0bXAwXSwgICAgMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDIwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDMwKQorCisgICAgICAgIFRSQU5TUE9TRV80SCglW2Z0bXAxXSwgJVtmdG1wMl0sICVbZnRtcDNdLCAlW2Z0bXA0XSwKKyAgICAgICAgICAgICAgICAgICAgICVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0sICVbdG1wMF0sICAlW2Z0bXAxMF0sICVbZnRtcDExXSkKKworICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxICAgICAgICB0MiAgICAgICAgdDMgICAgICAgIHQ0CisgICAgICAgIFZDMV9JTlZfVFJBTkNTXzRfU1RFUDFfTU1JKCVbZnRtcDFdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sICVbZnRtcDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA1XSwgJVtmdG1wNl0sICVbZnRtcDddLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd18xN10sICVbZmZfcHdfMTBdLCAlW2ZmX3B3XzIyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd180XSkKKworICAgICAgICBQU1JBSF80X01NSSglW2Z0bXAxXSwgJVtmdG1wM10sICVbZnRtcDRdLCAlW2Z0bXAyXSwgJVtmdG1wMF0pCisKKyAgICAgICAgVFJBTlNQT1NFXzRIKCVbZnRtcDFdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sICVbZnRtcDJdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wNV0sICVbZnRtcDZdLCAlW2Z0bXA3XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA5XSwgJVt0bXAwXSwgICVbZnRtcDEwXSwgJVtmdG1wMTFdKQorCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDNdLCAlW2RzdF0sIDB4MTApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDRdLCAlW2RzdF0sIDB4MjApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2RzdF0sIDB4MzApCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtjb3VudF0sICAgJVtjb3VudF0sICAtMHgwMSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgIDB4NDAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAweDQwICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtjb3VudF0sICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbZnRtcDEwXSI9JmYiKGZ0bXBbMTBdKSwgICAgICBbZnRtcDExXSI9JmYiKGZ0bXBbMTFdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFtjb3VudF0iPSZyIihjb3VudCksCisgICAgICAgICAgW3NyY10iKyZyIihzcmMpLCAgICAgICAgICAgICAgW2RzdF0iKyZyIihkc3QpCisgICAgICAgIDogW2ZmX3B3XzE3XSJmIihmZl9wd18xNyksICAgICAgW2ZmX3B3XzEwXSJmIihmZl9wd18xMCksCisgICAgICAgICAgW2ZmX3B3XzIyXSJmIihmZl9wd18yMiksICAgICAgW2ZmX3B3XzRdImYiKGZmX3B3XzQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworCisgICAgc3JjID0gYmxvY2s7CisKKyAgICAvLyAybmQgbG9vcAorICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNV0sICVbc3JjXSwgMHgxMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNl0sICVbc3JjXSwgMHgzMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wN10sICVbc3JjXSwgMHg1MCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wOF0sICVbc3JjXSwgMHg3MCkKKworICAgICAgICBWQzFfSU5WX1RSQU5DU184X1NURVAxX01NSSglW2Z0bXA1XSwgJVtmdG1wNl0sICVbZnRtcDddLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0sICVbZnRtcDEwXSwgJVtmdG1wMTFdLCAlW2Z0bXAxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDFdLCAlW2Z0bXAyXSwgJVtmdG1wM10sICVbZnRtcDRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2ZmX3B3XzE2XSwgJVtmZl9wd18xNV0sICVbZmZfcHdfOV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZmZfcHdfNF0pCisKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbc3JjXSwgMHg0MCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbc3JjXSwgMHgyMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICVbc3JjXSwgMHg2MCkKKworICAgICAgICBWQzFfSU5WX1RSQU5DU184X1NURVAyX01NSSglW2Z0bXAxXSwgJVtmdG1wMl0sICVbZnRtcDNdLCAlW2Z0bXA0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wNV0sICVbZnRtcDZdLCAlW2Z0bXA3XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDldLCAlW2Z0bXAxMF0sICVbZnRtcDExXSwgJVtmdG1wMTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2ZmX3B3XzEyXSwgJVtmZl9wd18xNl0sICVbZmZfcHdfNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZmZfcHdfNjRdKQorCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICVbZmZfcHdfMV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAlW2ZmX3B3XzFdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgJVtmZl9wd18xXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICVbZmZfcHdfMV0gICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIFBTUkFIXzhfTU1JKCVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAlW2Z0bXA0XSwgJVtmdG1wM10sICVbZnRtcDJdLCAlW2Z0bXAxXSwgJVtmdG1wMF0pCisKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLy8gZGVzdCBsb3cKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wOV0sICVbZGVzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbZGVzdF0sICAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXAxMF0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMTFdLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDEyXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIFZDMV9JTlZfVFJBTkNTXzRfU1RFUDJfTU1JKCVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA5XSwgJVtmdG1wMTBdLCAlW2Z0bXAxMV0sICVbZnRtcDEyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wMF0pCisKKyAgICAgICAgLy8gZGVzdCBoaWdoCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDldLCAlW2FkZHIwXSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVthZGRyMF0sICAgJVthZGRyMF0sICAgJVtsaW5lc2l6ZV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDEwXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXAxMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMTJdLCAlW2FkZHIwXSwgMHgwMCkKKworICAgICAgICBWQzFfSU5WX1RSQU5DU180X1NURVAyX01NSSglW2Z0bXA0XSwgJVtmdG1wM10sICVbZnRtcDJdLCAlW2Z0bXAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0sICVbZnRtcDEwXSwgJVtmdG1wMTFdLCAlW2Z0bXAxMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZnRtcDBdKQorCisgICAgICAgIC8vIGRlc3QgbG93CisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDVdLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2Rlc3RdLCAgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wN10sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wOF0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvLyBkZXN0IGhpZ2gKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNF0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wM10sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW2Z0bXAxMF0iPSZmIihmdG1wWzEwXSksICAgICAgW2Z0bXAxMV0iPSZmIihmdG1wWzExXSksCisgICAgICAgICAgW2Z0bXAxMl0iPSZmIihmdG1wWzEyXSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksCisgICAgICAgICAgW2Rlc3RdIismciIoZGVzdCkKKyAgICAgICAgOiBbc3JjXSJyIihzcmMpLCAgICAgICAgICAgICAgICBbbGluZXNpemVdInIiKGxpbmVzaXplKSwKKyAgICAgICAgICBbZmZfcHdfMV0iZiIoZmZfcHdfMSksICAgICAgICBbZmZfcHdfNF0iZiIoZmZfcHdfNCksCisgICAgICAgICAgW2ZmX3B3XzZdImYiKGZmX3B3XzYpLCAgICAgICAgW2ZmX3B3XzldImYiKGZmX3B3XzkpLAorICAgICAgICAgIFtmZl9wd18xMl0iZiIoZmZfcHdfMTIpLCAgICAgIFtmZl9wd18xNV0iZiIoZmZfcHdfMTUpLAorICAgICAgICAgIFtmZl9wd18xNl0iZiIoZmZfcHdfMTYpLCAgICAgIFtmZl9wd182NF0iZiIoZmZfcHdfNjQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQorI2VuZGlmCisKKy8qIERvIGludmVyc2UgdHJhbnNmb3JtIG9uIDR4NCBwYXJ0IG9mIGJsb2NrICovCit2b2lkIGZmX3ZjMV9pbnZfdHJhbnNfNHg0X2RjX21taSh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIGludCBkYyA9IGJsb2NrWzBdOworICAgIGRvdWJsZSBmdG1wWzVdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworCisgICAgZGMgPSAoMTcgKiBkYyArICA0KSA+PiAzOworICAgIGRjID0gKDE3ICogZGMgKyA2NCkgPj4gNzsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2RjXSwgICAgICAlW2RjXSwgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfTFdDMSglW2Z0bXAxXSwgJVtkZXN0MF0sIDB4MDApCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDJdLCAlW2Rlc3QxXSwgMHgwMCkKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wM10sICVbZGVzdDJdLCAweDAwKQorICAgICAgICBNTUlfTFdDMSglW2Z0bXA0XSwgJVtkZXN0M10sIDB4MDApCisKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2RjXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtkY10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZGNdICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZGVzdDBdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXAyXSwgJVtkZXN0MV0sIDB4MDApCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDNdLCAlW2Rlc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNF0sICVbZGVzdDNdLCAweDAwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pCisgICAgICAgIDogW2Rlc3QwXSJyIihkZXN0KzAqbGluZXNpemUpLCAgW2Rlc3QxXSJyIihkZXN0KzEqbGluZXNpemUpLAorICAgICAgICAgIFtkZXN0Ml0iciIoZGVzdCsyKmxpbmVzaXplKSwgIFtkZXN0M10iciIoZGVzdCszKmxpbmVzaXplKSwKKyAgICAgICAgICBbZGNdImYiKGRjKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKK30KKwordm9pZCBmZl92YzFfaW52X3RyYW5zXzR4NF9tbWkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK3sKKyAgICBpbnQxNl90ICpzcmMgPSBibG9jazsKKyAgICBpbnQxNl90ICpkc3QgPSBibG9jazsKKyAgICBkb3VibGUgZnRtcFsxMl07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIG1pcHNfcmVnIGFkZHJbMV07CisgICAgREVDTEFSRV9WQVJfTE9XMzI7CisKKyAgICAvLyAxc3QgbG9vcAorICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbc3JjXSwgMHgxMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbc3JjXSwgMHgyMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNF0sICVbc3JjXSwgMHgzMCkKKworICAgICAgICBUUkFOU1BPU0VfNEgoJVtmdG1wMV0sICVbZnRtcDJdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sCisgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA1XSwgJVtmdG1wNl0sICVbZnRtcDddLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICVbZnRtcDldLCAlW3RtcDBdLCAgJVtmdG1wMTBdLCAlW2Z0bXAxMV0pCisKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSAgICAgICAgdDIgICAgICAgIHQzICAgICAgICB0NAorICAgICAgICBWQzFfSU5WX1RSQU5DU180X1NURVAxX01NSSglW2Z0bXAxXSwgJVtmdG1wM10sICVbZnRtcDRdLCAlW2Z0bXAyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wNV0sICVbZnRtcDZdLCAlW2Z0bXA3XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZmZfcHdfMTddLCAlW2ZmX3B3XzEwXSwgJVtmZl9wd18yMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVbZmZfcHdfNF0pCisKKyAgICAgICAgUFNSQUhfNF9NTUkoJVtmdG1wMV0sICVbZnRtcDNdLCAlW2Z0bXA0XSwgJVtmdG1wMl0sICVbZnRtcDBdKQorCisgICAgICAgIFRSQU5TUE9TRV80SCglW2Z0bXAxXSwgJVtmdG1wM10sICVbZnRtcDRdLCAlW2Z0bXAyXSwKKyAgICAgICAgICAgICAgICAgICAgICVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0sICVbdG1wMF0sICAlW2Z0bXAxMF0sICVbZnRtcDExXSkKKworICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtkc3RdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJVtkc3RdLCAweDEwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXA0XSwgJVtkc3RdLCAweDIwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtkc3RdLCAweDMwKQorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW2Z0bXAxMF0iPSZmIihmdG1wWzEwXSksICAgICAgW2Z0bXAxMV0iPSZmIihmdG1wWzExXSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksICAgICAgICAgICAgICBbZHN0XSIrJnIiKGRzdCkKKyAgICAgICAgOiBbZmZfcHdfMTddImYiKGZmX3B3XzE3KSwgICAgICBbZmZfcHdfMTBdImYiKGZmX3B3XzEwKSwKKyAgICAgICAgICBbZmZfcHdfMjJdImYiKGZmX3B3XzIyKSwgICAgICBbZmZfcHdfNF0iZiIoZmZfcHdfNCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisKKyAgICBzcmMgPSBibG9jazsKKworICAgIC8vIDJuZCBsb29wCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvLyBkZXN0IGxvdyAzMmJpdAorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtzcmNdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDIwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtzcmNdLCAweDMwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDEwKQorCisgICAgICAgIFZDMV9JTlZfVFJBTkNTXzRfU1RFUDFfTU1JKCVbZnRtcDFdLCAlW2Z0bXAyXSwgJVtmdG1wM10sICVbZnRtcDRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA1XSwgJVtmdG1wNl0sICVbZnRtcDddLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd18xN10sICVbZmZfcHdfMTBdLCAlW2ZmX3B3XzIyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmZl9wd182NF0pCisKKyAgICAgICAgUFNSQUhfNF9NTUkoJVtmdG1wMV0sICVbZnRtcDJdLCAlW2Z0bXAzXSwgJVtmdG1wNF0sICVbZnRtcDBdKQorCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDVdLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2Rlc3RdLCAgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wNl0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wN10sICVbYWRkcjBdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW2FkZHIwXSwgICAlW2xpbmVzaXplXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wOF0sICVbYWRkcjBdLCAweDAwKQorCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDldLCAgICVbZnRtcDldLCAgJVtmdG1wOV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIFZDMV9JTlZfVFJBTkNTXzRfU1RFUDJfTU1JKCVbZnRtcDFdLCAlW2Z0bXAyXSwgJVtmdG1wM10sICVbZnRtcDRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA1XSwgJVtmdG1wNl0sICVbZnRtcDddLCAlW2Z0bXA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0pCisKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZGVzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbZGVzdF0sICAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAyXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAzXSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbYWRkcjBdLCAgICVbbGluZXNpemVdICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXA0XSwgJVthZGRyMF0sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKQorICAgICAgICA6IFtzcmNdInIiKHNyYyksICAgICAgICAgICAgICAgIFtkZXN0XSJyIihkZXN0KSwKKyAgICAgICAgICBbbGluZXNpemVdInIiKChtaXBzX3JlZylsaW5lc2l6ZSksCisgICAgICAgICAgW2ZmX3B3XzE3XSJmIihmZl9wd18xNyksICAgICAgW2ZmX3B3XzIyXSJmIihmZl9wd18yMiksCisgICAgICAgICAgW2ZmX3B3XzEwXSJmIihmZl9wd18xMCksICAgICAgW2ZmX3B3XzY0XSJmIihmZl9wd182NCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKKy8qIEFwcGx5IG92ZXJsYXAgdHJhbnNmb3JtIHRvIGhvcml6b250YWwgZWRnZSAqLwordm9pZCBmZl92YzFfaF9vdmVybGFwX21taSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCit7CisgICAgaW50IGk7CisgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgaW50IGQxLCBkMjsKKyAgICBpbnQgcm5kID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGEgID0gc3JjWy0yXTsKKyAgICAgICAgYiAgPSBzcmNbLTFdOworICAgICAgICBjICA9IHNyY1swXTsKKyAgICAgICAgZCAgPSBzcmNbMV07CisgICAgICAgIGQxID0gKGEgLSBkICsgMyArIHJuZCkgPj4gMzsKKyAgICAgICAgZDIgPSAoYSAtIGQgKyBiIC0gYyArIDQgLSBybmQpID4+IDM7CisKKyAgICAgICAgc3JjWy0yXSA9IGEgLSBkMTsKKyAgICAgICAgc3JjWy0xXSA9IGF2X2NsaXBfdWludDgoYiAtIGQyKTsKKyAgICAgICAgc3JjWzBdICA9IGF2X2NsaXBfdWludDgoYyArIGQyKTsKKyAgICAgICAgc3JjWzFdICA9IGQgKyBkMTsKKyAgICAgICAgc3JjICAgICs9IHN0cmlkZTsKKyAgICAgICAgcm5kICAgICA9ICFybmQ7CisgICAgfQorfQorCit2b2lkIGZmX3ZjMV9oX3Nfb3ZlcmxhcF9tbWkoaW50MTZfdCAqbGVmdCwgaW50MTZfdCAqcmlnaHQpCit7CisgICAgaW50IGk7CisgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgaW50IGQxLCBkMjsKKyAgICBpbnQgcm5kMSA9IDQsIHJuZDIgPSAzOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgYSAgPSBsZWZ0WzZdOworICAgICAgICBiICA9IGxlZnRbN107CisgICAgICAgIGMgID0gcmlnaHRbMF07CisgICAgICAgIGQgID0gcmlnaHRbMV07CisgICAgICAgIGQxID0gYSAtIGQ7CisgICAgICAgIGQyID0gYSAtIGQgKyBiIC0gYzsKKworICAgICAgICBsZWZ0WzZdICA9ICgoYSA8PCAzKSAtIGQxICsgcm5kMSkgPj4gMzsKKyAgICAgICAgbGVmdFs3XSAgPSAoKGIgPDwgMykgLSBkMiArIHJuZDIpID4+IDM7CisgICAgICAgIHJpZ2h0WzBdID0gKChjIDw8IDMpICsgZDIgKyBybmQxKSA+PiAzOworICAgICAgICByaWdodFsxXSA9ICgoZCA8PCAzKSArIGQxICsgcm5kMikgPj4gMzsKKworICAgICAgICByaWdodCArPSA4OworICAgICAgICBsZWZ0ICArPSA4OworICAgICAgICBybmQyICAgPSA3IC0gcm5kMjsKKyAgICAgICAgcm5kMSAgID0gNyAtIHJuZDE7CisgICAgfQorfQorCisvKiBBcHBseSBvdmVybGFwIHRyYW5zZm9ybSB0byB2ZXJ0aWNhbCBlZGdlICovCit2b2lkIGZmX3ZjMV92X292ZXJsYXBfbW1pKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgYSwgYiwgYywgZDsKKyAgICBpbnQgZDEsIGQyOworICAgIGludCBybmQgPSAxOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgYSAgPSBzcmNbLTIgKiBzdHJpZGVdOworICAgICAgICBiICA9IHNyY1stc3RyaWRlXTsKKyAgICAgICAgYyAgPSBzcmNbMF07CisgICAgICAgIGQgID0gc3JjW3N0cmlkZV07CisgICAgICAgIGQxID0gKGEgLSBkICsgMyArIHJuZCkgPj4gMzsKKyAgICAgICAgZDIgPSAoYSAtIGQgKyBiIC0gYyArIDQgLSBybmQpID4+IDM7CisKKyAgICAgICAgc3JjWy0yICogc3RyaWRlXSA9IGEgLSBkMTsKKyAgICAgICAgc3JjWy1zdHJpZGVdICAgICA9IGF2X2NsaXBfdWludDgoYiAtIGQyKTsKKyAgICAgICAgc3JjWzBdICAgICAgICAgICA9IGF2X2NsaXBfdWludDgoYyArIGQyKTsKKyAgICAgICAgc3JjW3N0cmlkZV0gICAgICA9IGQgKyBkMTsKKyAgICAgICAgc3JjKys7CisgICAgICAgIHJuZCA9ICFybmQ7CisgICAgfQorfQorCit2b2lkIGZmX3ZjMV92X3Nfb3ZlcmxhcF9tbWkoaW50MTZfdCAqdG9wLCBpbnQxNl90ICpib3R0b20pCit7CisgICAgaW50IGk7CisgICAgaW50IGEsIGIsIGMsIGQ7CisgICAgaW50IGQxLCBkMjsKKyAgICBpbnQgcm5kMSA9IDQsIHJuZDIgPSAzOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgYSAgPSB0b3BbNDhdOworICAgICAgICBiICA9IHRvcFs1Nl07CisgICAgICAgIGMgID0gYm90dG9tWzBdOworICAgICAgICBkICA9IGJvdHRvbVs4XTsKKyAgICAgICAgZDEgPSBhIC0gZDsKKyAgICAgICAgZDIgPSBhIC0gZCArIGIgLSBjOworCisgICAgICAgIHRvcFs0OF0gICA9ICgoYSA8PCAzKSAtIGQxICsgcm5kMSkgPj4gMzsKKyAgICAgICAgdG9wWzU2XSAgID0gKChiIDw8IDMpIC0gZDIgKyBybmQyKSA+PiAzOworICAgICAgICBib3R0b21bMF0gPSAoKGMgPDwgMykgKyBkMiArIHJuZDEpID4+IDM7CisgICAgICAgIGJvdHRvbVs4XSA9ICgoZCA8PCAzKSArIGQxICsgcm5kMikgPj4gMzsKKworICAgICAgICBib3R0b20rKzsKKyAgICAgICAgdG9wKys7CisgICAgICAgIHJuZDIgPSA3IC0gcm5kMjsKKyAgICAgICAgcm5kMSA9IDcgLSBybmQxOworICAgIH0KK30KKworLyoqCisgKiBWQy0xIGluLWxvb3AgZGVibG9ja2luZyBmaWx0ZXIgZm9yIG9uZSBsaW5lCisgKiBAcGFyYW0gc3JjIHNvdXJjZSBibG9jayB0eXBlCisgKiBAcGFyYW0gc3RyaWRlIGJsb2NrIHN0cmlkZQorICogQHBhcmFtIHBxIGJsb2NrIHF1YW50aXplcgorICogQHJldHVybiB3aGV0aGVyIG90aGVyIDMgcGFpcnMgc2hvdWxkIGJlIGZpbHRlcmVkIG9yIG5vdAorICogQHNlZSA4LjYKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHZjMV9maWx0ZXJfbGluZSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKK3sKKyAgICBpbnQgYTAgPSAoMiAqIChzcmNbLTIgKiBzdHJpZGVdIC0gc3JjWzEgKiBzdHJpZGVdKSAtCisgICAgICAgICAgICAgIDUgKiAoc3JjWy0xICogc3RyaWRlXSAtIHNyY1swICogc3RyaWRlXSkgKyA0KSA+PiAzOworICAgIGludCBhMF9zaWduID0gYTAgPj4gMzE7ICAgICAgICAvKiBTdG9yZSBzaWduICovCisKKyAgICBhMCA9IChhMCBeIGEwX3NpZ24pIC0gYTBfc2lnbjsgLyogYTAgPSBGRkFCUyhhMCk7ICovCisgICAgaWYgKGEwIDwgcHEpIHsKKyAgICAgICAgaW50IGExID0gRkZBQlMoKDIgKiAoc3JjWy00ICogc3RyaWRlXSAtIHNyY1stMSAqIHN0cmlkZV0pIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIDUgKiAoc3JjWy0zICogc3RyaWRlXSAtIHNyY1stMiAqIHN0cmlkZV0pICsgNCkgPj4gMyk7CisgICAgICAgIGludCBhMiA9IEZGQUJTKCgyICogKHNyY1sgMCAqIHN0cmlkZV0gLSBzcmNbIDMgKiBzdHJpZGVdKSAtCisgICAgICAgICAgICAgICAgICAgICAgICA1ICogKHNyY1sgMSAqIHN0cmlkZV0gLSBzcmNbIDIgKiBzdHJpZGVdKSArIDQpID4+IDMpOworICAgICAgICBpZiAoYTEgPCBhMCB8fCBhMiA8IGEwKSB7CisgICAgICAgICAgICBpbnQgY2xpcCAgICAgID0gc3JjWy0xICogc3RyaWRlXSAtIHNyY1swICogc3RyaWRlXTsKKyAgICAgICAgICAgIGludCBjbGlwX3NpZ24gPSBjbGlwID4+IDMxOworCisgICAgICAgICAgICBjbGlwID0gKChjbGlwIF4gY2xpcF9zaWduKSAtIGNsaXBfc2lnbikgPj4gMTsKKyAgICAgICAgICAgIGlmIChjbGlwKSB7CisgICAgICAgICAgICAgICAgaW50IGEzICAgICA9IEZGTUlOKGExLCBhMik7CisgICAgICAgICAgICAgICAgaW50IGQgICAgICA9IDUgKiAoYTMgLSBhMCk7CisgICAgICAgICAgICAgICAgaW50IGRfc2lnbiA9IChkID4+IDMxKTsKKworICAgICAgICAgICAgICAgIGQgICAgICAgPSAoKGQgXiBkX3NpZ24pIC0gZF9zaWduKSA+PiAzOworICAgICAgICAgICAgICAgIGRfc2lnbiBePSBhMF9zaWduOworCisgICAgICAgICAgICAgICAgaWYgKGRfc2lnbiBeIGNsaXBfc2lnbikKKyAgICAgICAgICAgICAgICAgICAgZCA9IDA7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGQgPSBGRk1JTihkLCBjbGlwKTsKKyAgICAgICAgICAgICAgICAgICAgZCA9IChkIF4gZF9zaWduKSAtIGRfc2lnbjsgLyogUmVzdG9yZSBzaWduICovCisgICAgICAgICAgICAgICAgICAgIHNyY1stMSAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KHNyY1stMSAqIHN0cmlkZV0gLSBkKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjWyAwICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoc3JjWyAwICogc3RyaWRlXSArIGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBWQy0xIGluLWxvb3AgZGVibG9ja2luZyBmaWx0ZXIKKyAqIEBwYXJhbSBzcmMgc291cmNlIGJsb2NrIHR5cGUKKyAqIEBwYXJhbSBzdGVwIGRpc3RhbmNlIGJldHdlZW4gaG9yaXpvbnRhbGx5IGFkamFjZW50IGVsZW1lbnRzCisgKiBAcGFyYW0gc3RyaWRlIGRpc3RhbmNlIGJldHdlZW4gdmVydGljYWxseSBhZGphY2VudCBlbGVtZW50cworICogQHBhcmFtIGxlbiBlZGdlIGxlbmd0aCB0byBmaWx0ZXIgKDQgb3IgOCBwaXhlbHMpCisgKiBAcGFyYW0gcHEgYmxvY2sgcXVhbnRpemVyCisgKiBAc2VlIDguNgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdmMxX2xvb3BfZmlsdGVyKHVpbnQ4X3QgKnNyYywgaW50IHN0ZXAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBwcSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgZmlsdDM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHsKKyAgICAgICAgZmlsdDMgPSB2YzFfZmlsdGVyX2xpbmUoc3JjICsgMiAqIHN0ZXAsIHN0cmlkZSwgcHEpOworICAgICAgICBpZiAoZmlsdDMpIHsKKyAgICAgICAgICAgIHZjMV9maWx0ZXJfbGluZShzcmMgKyAwICogc3RlcCwgc3RyaWRlLCBwcSk7CisgICAgICAgICAgICB2YzFfZmlsdGVyX2xpbmUoc3JjICsgMSAqIHN0ZXAsIHN0cmlkZSwgcHEpOworICAgICAgICAgICAgdmMxX2ZpbHRlcl9saW5lKHNyYyArIDMgKiBzdGVwLCBzdHJpZGUsIHBxKTsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gc3RlcCAqIDQ7CisgICAgfQorfQorCit2b2lkIGZmX3ZjMV92X2xvb3BfZmlsdGVyNF9tbWkodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCit7CisgICAgdmMxX2xvb3BfZmlsdGVyKHNyYywgMSwgc3RyaWRlLCA0LCBwcSk7Cit9CisKK3ZvaWQgZmZfdmMxX2hfbG9vcF9maWx0ZXI0X21taSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKK3sKKyAgICB2YzFfbG9vcF9maWx0ZXIoc3JjLCBzdHJpZGUsIDEsIDQsIHBxKTsKK30KKwordm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjhfbW1pKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQoreworICAgIHZjMV9sb29wX2ZpbHRlcihzcmMsIDEsIHN0cmlkZSwgOCwgcHEpOworfQorCit2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9tbWkodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCit7CisgICAgdmMxX2xvb3BfZmlsdGVyKHNyYywgc3RyaWRlLCAxLCA4LCBwcSk7Cit9CisKK3ZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXIxNl9tbWkodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCit7CisgICAgdmMxX2xvb3BfZmlsdGVyKHNyYywgMSwgc3RyaWRlLCAxNiwgcHEpOworfQorCit2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyMTZfbW1pKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQoreworICAgIHZjMV9sb29wX2ZpbHRlcihzcmMsIHN0cmlkZSwgMSwgMTYsIHBxKTsKK30KKwordm9pZCBmZl9wdXRfdmMxX21zcGVsX21jMDBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpCit7CisgICAgZmZfcHV0X3BpeGVsczhfOF9tbWkoZHN0LCBzcmMsIHN0cmlkZSwgOCk7Cit9Cit2b2lkIGZmX3B1dF92YzFfbXNwZWxfbWMwMF8xNl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IHJuZCkKK3sKKyAgICBmZl9wdXRfcGl4ZWxzMTZfOF9tbWkoZHN0LCBzcmMsIHN0cmlkZSwgMTYpOworfQordm9pZCBmZl9hdmdfdmMxX21zcGVsX21jMDBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBybmQpCit7CisgICAgZmZfYXZnX3BpeGVsczhfOF9tbWkoZHN0LCBzcmMsIHN0cmlkZSwgOCk7Cit9Cit2b2lkIGZmX2F2Z192YzFfbXNwZWxfbWMwMF8xNl9tbWkodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IHJuZCkKK3sKKyAgICBmZl9hdmdfcGl4ZWxzMTZfOF9tbWkoZHN0LCBzcmMsIHN0cmlkZSwgMTYpOworfQorCisjZGVmaW5lIE9QX1BVVChTLCBEKQorI2RlZmluZSBPUF9BVkcoUywgRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibGRjMSAgICAgICAkZjE2LCAgICIjUyIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgInBhdmdiICAgICAgIiNEIiwgICAiI0QiLCAgICRmMTYgICAgICAgICAgICAgICAgXG5cdCIKKworLyoqIEFkZCByb3VuZGVyIGZyb20gJGYxNCB0byAkZjYgYW5kIHBhY2sgcmVzdWx0IGF0IGRlc3RpbmF0aW9uICovCisjZGVmaW5lIE5PUk1BTElaRV9NTUkoU0hJRlQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkaCAgICAgICRmNiwgICAgJGY2LCAgICAkZjE0ICAgICAgICAgICAgICAgIFxuXHQiIC8qICtiaWFzLXIgKi8gICAgIFwKKyAgICAicGFkZGggICAgICAkZjgsICAgICRmOCwgICAgJGYxNCAgICAgICAgICAgICAgICBcblx0IiAvKiArYmlhcy1yICovICAgICBcCisgICAgInBzcmFoICAgICAgJGY2LCAgICAkZjYsICAgICJTSElGVCIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICJwc3JhaCAgICAgICRmOCwgICAgJGY4LCAgICAiU0hJRlQiICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgVFJBTlNGRVJfRE9fUEFDSyhPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBhY2t1c2hiICAgJGY2LCAgICAkZjYsICAgICRmOCAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgIE9QKCglW2RzdF0pLCAkZjYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2RjMSAgICAgICAkZjYsICAgIDB4MDAoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIFRSQU5TRkVSX0RPTlRfUEFDSyhPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBPUCgwKCVbZHN0XSksICRmNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgT1AoOCglW2RzdF0pLCAkZjgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICJzZGMxICAgICAgJGY2LCAgICAweDAwKCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAic2RjMSAgICAgICRmOCwgICAgMHgwOCglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisKKy8qKiBAc2VlIE1TUEVMX0ZJTFRFUjEzX0NPUkUgZm9yIHVzZSBhcyBVTlBBQ0sgbWFjcm8gKi8KKyNkZWZpbmUgRE9fVU5QQUNLKHJlZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInB1bnBja2xiaCAgInJlZyIsICAicmVnIiwgICRmMCAgICAgICAgICAgICAgICAgXG5cdCIKKyNkZWZpbmUgRE9OVF9VTlBBQ0socmVnKQorCisvKiogQ29tcHV0ZSB0aGUgcm91bmRlciAzMi1yIG9yIDgtciBhbmQgdW5wYWNrcyBpdCB0byAkZjE0ICovCisjZGVmaW5lIExPQURfUk9VTkRFUl9NTUkoUk9VTkQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJsd2MxICAgICAgICRmMTQsICAgIlJPVU5EIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbGh3ICAkZjE0LCAgICRmMTQsICAgJGYxNCAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgInB1bnBja2x3ZCAgJGYxNCwgICAkZjE0LCAgICRmMTQgICAgICAgICAgICAgICAgXG5cdCIKKworCisjZGVmaW5lIFNISUZUMl9MSU5FKE9GRiwgUjAsIFIxLCBSMiwgUjMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkaCAgICAgICIjUjEiLCAgICAgICIjUjEiLCAgIiNSMiIgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVFJfQUREVSAgICAiJDksICAgICAgICAlW3NyY10sICVbc3RyaWRlMV0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgTU1JX1VMV0MxKFIwLCAkOSwgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbXVsbGggICAgICIjUjEiLCAgICAgICIjUjEiLCAgJGY2ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHVucGNrbGJoICAiI1IwIiwgICAgICAiI1IwIiwgICRmMCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgUFRSX0FERFUgICAgIiQ5LCAgICAgICAgJVtzcmNdLCAlW3N0cmlkZV0gICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgIE1NSV9VTFdDMShSMywgJDksIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YmggICAgICAiI1IxIiwgICAgICAiI1IxIiwgICIjUjAiICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgInB1bnBja2xiaCAgIiNSMyIsICAgICAgIiNSMyIsICAkZjAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICJwYWRkaCAgICAgICIjUjEiLCAgICAgICIjUjEiLCAgJGYxNCAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAicHN1YmggICAgICAiI1IxIiwgICAgICAiI1IxIiwgICIjUjMiICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgInBzcmFoICAgICAgIiNSMSIsICAgICAgIiNSMSIsICAlW3NoaWZ0XSAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgIE1NSV9TREMxKFIxLCAlW2RzdF0sIE9GRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVFJfQUREVSAgICAiJVtzcmNdLCAgICAlW3NyY10sICVbc3RyaWRlXSAgICAgICBcblx0IgorCisvKiogU2FjcmlmaWNpbmcgJGYxMiBtYWtlcyBpdCBwb3NzaWJsZSB0byBwaXBlbGluZSBsb2FkcyBmcm9tIHNyYyAqLworc3RhdGljIHZvaWQgdmMxX3B1dF92ZXJfMTZiX3NoaWZ0Ml9tbWkoaW50MTZfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBtaXBzX3JlZyBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm5kLCBpbnQ2NF90IHNoaWZ0KQoreworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgInhvciAgICAgICAgJGYwLCAgICAkZjAsICAgICRmMCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgICAkOCwgICAgIDB4MDMgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIExPQURfUk9VTkRFUl9NTUkoIiVbcm5kXSIpCisgICAgICAgICJsZGMxICAgICAgICRmMTIsICAgJVtmZl9wd185XSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJGY0LCAlW3NyY10sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgJVtzcmNdLCAlW3N0cmlkZV0gICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMV0MxKCRmNiwgJVtzcmNdLCAweDAwKQorICAgICAgICAicHVucGNrbGJoICAkZjQsICAgICRmNCwgICAgJGYwICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICRmNiwgICAgJGY2LCAgICAkZjAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgU0hJRlQyX0xJTkUoICAwLCAkZjIsICRmNCwgJGY2LCAkZjgpCisgICAgICAgIFNISUZUMl9MSU5FKCAyNCwgJGY0LCAkZjYsICRmOCwgJGYyKQorICAgICAgICBTSElGVDJfTElORSggNDgsICRmNiwgJGY4LCAkZjIsICRmNCkKKyAgICAgICAgU0hJRlQyX0xJTkUoIDcyLCAkZjgsICRmMiwgJGY0LCAkZjYpCisgICAgICAgIFNISUZUMl9MSU5FKCA5NiwgJGYyLCAkZjQsICRmNiwgJGY4KQorICAgICAgICBTSElGVDJfTElORSgxMjAsICRmNCwgJGY2LCAkZjgsICRmMikKKyAgICAgICAgU0hJRlQyX0xJTkUoMTQ0LCAkZjYsICRmOCwgJGYyLCAkZjQpCisgICAgICAgIFNISUZUMl9MSU5FKDE2OCwgJGY4LCAkZjIsICRmNCwgJGY2KQorICAgICAgICBQVFJfU1VCVSAgICIlW3NyY10sICVbc3JjXSwgJVtzdHJpZGUyXSAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbZHN0XSwgJVtkc3RdLCAweDA4ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICAgJDgsICAgICAkOCwgICAgLTB4MDEgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAkOCwgICAgIDFiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogUkVTVFJJQ1RfQVNNX0xPVzMyICAgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUCisgICAgICAgICAgW3NyY10iK3IiKHNyYyksICAgICAgICAgICAgICAgW2RzdF0iK3IiKGRzdCkKKyAgICAgICAgOiBbc3RyaWRlXSJyIihzdHJpZGUpLCAgICAgICAgICBbc3RyaWRlMV0iciIoLTIqc3RyaWRlKSwKKyAgICAgICAgICBbc2hpZnRdImYiKHNoaWZ0KSwgICAgICAgICAgICBbcm5kXSJtIihybmQpLAorICAgICAgICAgIFtzdHJpZGUyXSJyIig5KnN0cmlkZS00KSwgICAgIFtmZl9wd185XSJtIihmZl9wd185KQorICAgICAgICA6ICIkOCIsICIkOSIsICIkZjAiLCAiJGYyIiwgIiRmNCIsICIkZjYiLCAiJGY4IiwgIiRmMTAiLCAiJGYxMiIsCisgICAgICAgICAgIiRmMTQiLCAiJGYxNiIsICJtZW1vcnkiCisgICAgKTsKK30KKworLyoqCisgKiBEYXRhIGlzIGFscmVhZHkgdW5wYWNrZWQsIHNvIHNvbWUgb3BlcmF0aW9ucyBjYW4gZGlyZWN0bHkgYmUgbWFkZSBmcm9tCisgKiBtZW1vcnkuCisgKi8KKyNkZWZpbmUgVkMxX0hPUl8xNkJfU0hJRlQyKE9QLCBPUE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgdmMxX2hvcl8xNmJfc2hpZnQyX21taSh1aW50OF90ICpkc3QsIG1pcHNfcmVnIHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgcm5kKSAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGggPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFQ0xBUkVfVkFSX0FMTDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyAtPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBybmQgLT0gKC0xKzkrOS0xKSoxMDI0OyAvKiBBZGQgLTEwMjQgYmlhcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9BRF9ST1VOREVSX01NSSgiJVtybmRdIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsZGMxICAgICAgICRmMTIsICAgJVtmZl9wd18xMjhdICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGRjMSAgICAgICAkZjEwLCAgICVbZmZfcHdfOV0gICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSgkZjIsICVbc3JjXSwgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxEQzEoJGY0LCAlW3NyY10sIDB4MDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMREMxKCRmNiwgJVtzcmNdLCAweDAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSgkZjgsICVbc3JjXSwgMHgwYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxEQzEoJGYwLCAlW3NyY10sIDB4MDYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJGYyLCAgICAkZjIsICAgICRmMCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSgkZjAsICVbc3JjXSwgMHgwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZGggICAgICAkZjQsICAgICRmNCwgICAgJGYwICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMREMxKCRmMCwgJVtzcmNdLCAweDA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkaCAgICAgICRmNiwgICAgJGY2LCAgICAkZjAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxEQzEoJGYwLCAlW3NyY10sIDB4MGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJGY4LCAgICAkZjgsICAgICRmMCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwbXVsbGggICAgICRmNiwgICAgJGY2LCAgICAkZjEwICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicG11bGxoICAgICAkZjgsICAgICRmOCwgICAgJGYxMCAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzdWJoICAgICAgJGY2LCAgICAkZjYsICAgICRmMiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwc3ViaCAgICAgICRmOCwgICAgJGY4LCAgICAkZjQgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGkgICAgICAgICAkOCwgICAgIDB4MDcgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm10YzEgICAgICAgJDgsICAgICAkZjE2ICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE5PUk1BTElaRV9NTUkoIiRmMTYiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBSZW1vdmUgYmlhcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJGY2LCAgICAkZjYsICAgICRmMTIgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkaCAgICAgICRmOCwgICAgJGY4LCAgICAkZjEyICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUUkFOU0ZFUl9ET19QQUNLKE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAlW2hdLCAgLTB4MDEgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9BRERJVSAgIiVbc3JjXSwgJVtzcmNdLCAweDE4ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICVbZHN0XSwgJVtzdHJpZGVdICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAxYiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogUkVTVFJJQ1RfQVNNX0FMTDY0ICAgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFtoXSIrciIoaCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBbc3JjXSIrciIoc3JjKSwgICAgICAgICAgICAgICBbZHN0XSIrciIoZHN0KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogW3N0cmlkZV0iciIoc3RyaWRlKSwgICAgICAgICAgW3JuZF0ibSIocm5kKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFtmZl9wd185XSJtIihmZl9wd185KSwgICAgICAgIFtmZl9wd18xMjhdIm0iKGZmX3B3XzEyOCkgICAgICAgICAgIFwKKyAgICAgICAgOiAiJDgiLCAiJGYwIiwgIiRmMiIsICIkZjQiLCAiJGY2IiwgIiRmOCIsICIkZjEwIiwgIiRmMTIiLCAiJGYxNCIsICBcCisgICAgICAgICAgIiRmMTYiLCAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVkMxX0hPUl8xNkJfU0hJRlQyKE9QX1BVVCwgcHV0XykKK1ZDMV9IT1JfMTZCX1NISUZUMihPUF9BVkcsIGF2Z18pCisKKy8qKgorICogUHVyZWx5IHZlcnRpY2FsIG9yIGhvcml6b250YWwgMS8yIHNoaWZ0IGludGVycG9sYXRpb24uCisgKiBTYWNyaWZ5ICRmMTIgZm9yICo5IGZhY3Rvci4KKyAqLworI2RlZmluZSBWQzFfU0hJRlQyKE9QLCBPUE5BTUUpXAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHZjMV9zaGlmdDJfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzX3JlZyBzdHJpZGUsIGludCBybmQsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlwc19yZWcgb2Zmc2V0KSAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVDTEFSRV9WQVJfQUREUlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBybmQgPSA4IC0gcm5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInhvciAgICAgICAgJGYwLCAgICAkZjAsICAgICRmMCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsaSAgICAgICAgICQxMCwgICAgMHgwOCAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0FEX1JPVU5ERVJfTU1JKCIlW3JuZF0iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxkYzEgICAgICAgJGYxMiwgICAlW2ZmX3B3XzldICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxXQzEoJGY2LCAlW3NyY10sIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCRmOCwgJVtzcmNdLCAweDA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9BRERVICAgIiQ5LCAgICAgJVtzcmNdLCAlW29mZnNldF0gICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxXQzEoJGYyLCAkOSwgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCRmNCwgJDksIDB4MDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgJVtzcmNdLCAlW29mZnNldF0gICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAkZjYsICAgICRmNiwgICAgJGYwICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJGY4LCAgICAkZjgsICAgICRmMCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICRmMiwgICAgJGYyLCAgICAkZjAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAkZjQsICAgICRmNCwgICAgJGYwICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJGY2LCAgICAkZjYsICAgICRmMiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkaCAgICAgICRmOCwgICAgJGY4LCAgICAkZjQgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIkOSwgICAgICVbc3JjXSwgJVtvZmZzZXRfeDJuXSAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCRmMiwgJDksIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSgkZjQsICQ5LCAweDA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicG11bGxoICAgICAkZjYsICAgICRmNiwgICAgJGYxMiAgICAgICAgICAgIFxuXHQiIC8qIDAsOSw5LDAqLyAgICAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJGY4LCAgICAkZjgsICAgICRmMTIgICAgICAgICAgICBcblx0IiAvKiAwLDksOSwwKi8gICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICRmMiwgICAgJGYyLCAgICAkZjAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAkZjQsICAgICRmNCwgICAgJGYwICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzdWJoICAgICAgJGY2LCAgICAkZjYsICAgICRmMiAgICAgICAgICAgICBcblx0IiAvKi0xLDksOSwwKi8gICAgICBcCisgICAgICAgICJwc3ViaCAgICAgICRmOCwgICAgJGY4LCAgICAkZjQgICAgICAgICAgICAgXG5cdCIgLyotMSw5LDksMCovICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIkOSwgICAgICVbc3JjXSwgJVtvZmZzZXRdICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCRmMiwgJDksIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSgkZjQsICQ5LCAweDA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAkZjIsICAgICRmMiwgICAgJGYwICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJGY0LCAgICAkZjQsICAgICRmMCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwc3ViaCAgICAgICRmNiwgICAgJGY2LCAgICAkZjIgICAgICAgICAgICAgXG5cdCIgLyotMSw5LDksLTEqLyAgICAgXAorICAgICAgICAicHN1YmggICAgICAkZjgsICAgICRmOCwgICAgJGY0ICAgICAgICAgICAgIFxuXHQiIC8qLTEsOSw5LC0xKi8gICAgIFwKKyAgICAgICAgImxpICAgICAgICAgJDgsICAgICAweDA0ICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJtdGMxICAgICAgICQ4LCAgICAgJGYxNiAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBOT1JNQUxJWkVfTU1JKCIkZjE2IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhY2t1c2hiICAgJGY2LCAgICAkZjYsICAgICRmOCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QKCglW2RzdF0pLCAkZjYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2RjMSAgICAgICAkZjYsICAgIDB4MDAoJVtkc3RdKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZGl1ICAgICAgJDEwLCAgICAkMTAsICAgLTB4MDEgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgJVtzcmNdLCAlW3N0cmlkZTFdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICVbZHN0XSwgJVtzdHJpZGVdICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImJuZXogICAgICAgJDEwLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogUkVTVFJJQ1RfQVNNX0xPVzMyICAgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFtzcmNdIityIihzcmMpLCAgICAgICAgICAgICAgIFtkc3RdIityIihkc3QpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgOiBbb2Zmc2V0XSJyIihvZmZzZXQpLCAgICAgICAgICBbb2Zmc2V0X3gybl0iciIoLTIqb2Zmc2V0KSwgICAgICAgICBcCisgICAgICAgICAgW3N0cmlkZV0iZyIoc3RyaWRlKSwgICAgICAgICAgW3JuZF0ibSIocm5kKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFtzdHJpZGUxXSJnIihzdHJpZGUtb2Zmc2V0KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBbZmZfcHdfOV0ibSIoZmZfcHdfOSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogIiQ4IiwgIiQ5IiwgIiQxMCIsICIkZjAiLCAiJGYyIiwgIiRmNCIsICIkZjYiLCAiJGY4IiwgIiRmMTAiLCAgICAgXAorICAgICAgICAgICIkZjEyIiwgIiRmMTQiLCAiJGYxNiIsICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1ZDMV9TSElGVDIoT1BfUFVULCBwdXRfKQorVkMxX1NISUZUMihPUF9BVkcsIGF2Z18pCisKKy8qKgorICogQ29yZSBvZiB0aGUgMS80IGFuZCAzLzQgc2hpZnQgYmljdWJpYyBpbnRlcnBvbGF0aW9uLgorICoKKyAqIEBwYXJhbSBVTlBBQ0sgIE1hY3JvIHVucGFja2luZyBhcmd1bWVudHMgZnJvbSA4IHRvIDE2Yml0cyAoY2FuIGJlIGVtcHR5KS4KKyAqIEBwYXJhbSBMT0FEICAgICJNTUlfVUxXQzEiIG9yICJNTUlfVUxEQzEiLCBpZiBkYXRhIHJlYWQgaXMgYWxyZWFkeSB1bnBhY2tlZC4KKyAqIEBwYXJhbSBNICAgICAgICIxIiBmb3IgTU1JX1VMV0MxLCAiMiIgZm9yIE1NSV9VTERDMS4KKyAqIEBwYXJhbSBBMSAgICAgIFN0cmlkZSBhZGRyZXNzIG9mIDFzdCB0YXAgKGJld2FyZSBvZiB1bnBhY2tlZC9wYWNrZWQpLgorICogQHBhcmFtIEEyICAgICAgU3RyaWRlIGFkZHJlc3Mgb2YgMm5kIHRhcAorICogQHBhcmFtIEEzICAgICAgU3RyaWRlIGFkZHJlc3Mgb2YgM3JkIHRhcAorICogQHBhcmFtIEE0ICAgICAgU3RyaWRlIGFkZHJlc3Mgb2YgNHRoIHRhcAorICovCisjZGVmaW5lIE1TUEVMX0ZJTFRFUjEzX0NPUkUoVU5QQUNLLCBMT0FELCBNLCBBMSwgQTIsIEEzLCBBNCkgICAgICAgICAgICAgICAgXAorICAgIFBUUl9BRERVICAgIiQ5LCAgICAgJVtzcmNdLCAiI0ExIiAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0FEKCRmMiwgJDksIE0qMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9BRCgkZjQsICQ5LCBNKjQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVOUEFDSygiJGYyIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTlBBQ0soIiRmNCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtdWxsaCAgICAgJGYyLCAgICAkZjIsICAgICVbZmZfcHdfM10gICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbXVsbGggICAgICRmNCwgICAgJGY0LCAgICAlW2ZmX3B3XzNdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVFJfQUREVSAgICIkOSwgICAgICVbc3JjXSwgIiNBMiIgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9BRCgkZjYsICQ5LCBNKjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExPQUQoJGY4LCAkOSwgTSo0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTlBBQ0soIiRmNiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVU5QQUNLKCIkZjgiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJwbXVsbGggICAgICRmNiwgICAgJGY2LCAgICAkZjEyICAgICAgICAgICAgXG5cdCIgLyogKjE4ICovICAgICAgICAgICAgIFwKKyAgICAicG11bGxoICAgICAkZjgsICAgICRmOCwgICAgJGYxMiAgICAgICAgICAgIFxuXHQiIC8qICoxOCAqLyAgICAgICAgICAgICBcCisgICAgInBzdWJoICAgICAgJGY2LCAgICAkZjYsICAgICRmMiAgICAgICAgICAgICBcblx0IiAvKiAqMTgsIC0zICovICAgICAgICAgXAorICAgICJwc3ViaCAgICAgICRmOCwgICAgJGY4LCAgICAkZjQgICAgICAgICAgICAgXG5cdCIgLyogKjE4LCAtMyAqLyAgICAgICAgIFwKKyAgICBQVFJfQUREVSAgICIkOSwgICAgICVbc3JjXSwgIiNBNCIgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9BRCgkZjIsICQ5LCBNKjApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExPQUQoJGY0LCAkOSwgTSo0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTlBBQ0soIiRmMiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVU5QQUNLKCIkZjQiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJsaSAgICAgICAgICQ4LCAgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibXRjMSAgICAgICAkOCwgICAgICRmMTYgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBzbGxoICAgICAgJGYyLCAgICAkZjIsICAgICRmMTYgICAgICAgICAgICBcblx0IiAvKiA0KiAqLyAgICAgICAgICAgICAgXAorICAgICJwc2xsaCAgICAgICRmNCwgICAgJGY0LCAgICAkZjE2ICAgICAgICAgICAgXG5cdCIgLyogNCogKi8gICAgICAgICAgICAgIFwKKyAgICAicHN1YmggICAgICAkZjYsICAgICRmNiwgICAgJGYyICAgICAgICAgICAgIFxuXHQiIC8qIC00LDE4LC0zICovICAgICAgICBcCisgICAgInBzdWJoICAgICAgJGY4LCAgICAkZjgsICAgICRmNCAgICAgICAgICAgICBcblx0IiAvKiAtNCwxOCwtMyAqLyAgICAgICAgXAorICAgIFBUUl9BRERVICAgIiQ5LCAgICAgJVtzcmNdLCAiI0EzIiAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMT0FEKCRmMiwgJDksIE0qMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9BRCgkZjQsICQ5LCBNKjQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVOUEFDSygiJGYyIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVTlBBQ0soIiRmNCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInBtdWxsaCAgICAgJGYyLCAgICAkZjIsICAgICRmMTAgICAgICAgICAgICBcblx0IiAvKiAqNTMgKi8gICAgICAgICAgICAgXAorICAgICJwbXVsbGggICAgICRmNCwgICAgJGY0LCAgICAkZjEwICAgICAgICAgICAgXG5cdCIgLyogKjUzICovICAgICAgICAgICAgIFwKKyAgICAicGFkZGggICAgICAkZjYsICAgICRmNiwgICAgJGYyICAgICAgICAgICAgIFxuXHQiIC8qIDQsNTMsMTgsLTMgKi8gICAgICBcCisgICAgInBhZGRoICAgICAgJGY4LCAgICAkZjgsICAgICRmNCAgICAgICAgICAgICBcblx0IiAvKiA0LDUzLDE4LC0zICovCisKKy8qKgorICogTWFjcm8gdG8gYnVpbGQgdGhlIHZlcnRpY2FsIDE2Yml0cyB2ZXJzaW9uIG9mIHZjMV9wdXRfc2hpZnRbMTNdLgorICogSGVyZSwgb2Zmc2V0PXNyY19zdHJpZGUuIFBhcmFtZXRlcnMgcGFzc2VkIEExIHRvIEE0IG11c3QgdXNlCisgKiAlMyAoc3JjX3N0cmlkZSksICU0ICgyKnNyY19zdHJpZGUpIGFuZCAlNSAoMypzcmNfc3RyaWRlKS4KKyAqCisgKiBAcGFyYW0gIE5BTUUgICBFaXRoZXIgMSBvciAzCisgKiBAc2VlIE1TUEVMX0ZJTFRFUjEzX0NPUkUgZm9yIGluZm9ybWF0aW9uIG9uIEExLT5BNAorICovCisjZGVmaW5lIE1TUEVMX0ZJTFRFUjEzX1ZFUl8xNkIoTkFNRSwgQTEsIEEyLCBBMywgQTQpICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZjMV9wdXRfdmVyXzE2Yl8gIyMgTkFNRSAjIyBfbW1pKGludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzX3JlZyBzcmNfc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJuZCwgaW50NjRfdCBzaGlmdCkgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGggPSA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFQ0xBUkVfVkFSX0xPVzMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyAtPSBzcmNfc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAieG9yICAgICAgICAkZjAsICAgICRmMCwgICAgJGYwICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9BRF9ST1VOREVSX01NSSgiJVtybmRdIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsZGMxICAgICAgICRmMTAsICAgJVtmZl9wd181M10gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGRjMSAgICAgICAkZjEyLCAgICVbZmZfcHdfMThdICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNU1BFTF9GSUxURVIxM19DT1JFKERPX1VOUEFDSywgTU1JX1VMV0MxLCAxLCBBMSwgQTIsIEEzLCBBNCkgICAgICAgIFwKKyAgICAgICAgTk9STUFMSVpFX01NSSgiJVtzaGlmdF0iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRSQU5TRkVSX0RPTlRfUEFDSyhPUF9QVVQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBMYXN0IDMgKGluIGZhY3QgNCkgYnl0ZXMgb24gdGhlIGxpbmUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFRSX0FERFUgICAiJDksICAgICAlW3NyY10sICIjQTEiICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSgkZjIsICQ5LCAweDA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBET19VTlBBQ0soIiRmMiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm1vdi5kICAgICAgJGY2LCAgICAkZjIgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkaCAgICAgICRmMiwgICAgJGYyLCAgICAkZjIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZGggICAgICAkZjIsICAgICRmMiwgICAgJGY2ICAgICAgICAgICAgIFxuXHQiIC8qIDMqICovICAgICAgICAgIFwKKyAgICAgICAgUFRSX0FERFUgICAiJDksICAgICAlW3NyY10sICIjQTIiICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSgkZjYsICQ5LCAweDA4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBET19VTlBBQ0soIiRmNiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJGY2LCAgICAkZjYsICAgICRmMTIgICAgICAgICAgICBcblx0IiAvKiAqMTggKi8gICAgICAgICBcCisgICAgICAgICJwc3ViaCAgICAgICRmNiwgICAgJGY2LCAgICAkZjIgICAgICAgICAgICAgXG5cdCIgLyogKjE4LC0zICovICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIkOSwgICAgICVbc3JjXSwgIiNBMyIgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCRmMiwgJDksIDB4MDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIERPX1VOUEFDSygiJGYyIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicG11bGxoICAgICAkZjIsICAgICRmMiwgICAgJGYxMCAgICAgICAgICAgIFxuXHQiIC8qICo1MyAqLyAgICAgICAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJGY2LCAgICAkZjYsICAgICRmMiAgICAgICAgICAgICBcblx0IiAvKiAqNTMsMTgsLTMgKi8gICBcCisgICAgICAgIFBUUl9BRERVICAgIiQ5LCAgICAgJVtzcmNdLCAiI0E0IiAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxXQzEoJGYyLCAkOSwgMHgwOCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRE9fVU5QQUNLKCIkZjIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsaSAgICAgICAgICQ4LCAgICAgMHgwMiAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibXRjMSAgICAgICAkOCwgICAgICRmMTYgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzbGxoICAgICAgJGYyLCAgICAkZjIsICAgICRmMTYgICAgICAgICAgICBcblx0IiAvKiA0KiAqLyAgICAgICAgICBcCisgICAgICAgICJwc3ViaCAgICAgICRmNiwgICAgJGY2LCAgICAkZjIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZGggICAgICAkZjYsICAgICRmNiwgICAgJGYxNCAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxpICAgICAgICAgJDgsICAgICAweDA2ICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJtdGMxICAgICAgICQ4LCAgICAgJGYxNiAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHNyYWggICAgICAkZjYsICAgICRmNiwgICAgJGYxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNkYzEgICAgICAgJGY2LCAgICAweDEwKCVbZHN0XSkgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRpdSAgICAgICVbaF0sICAgJVtoXSwgIC0weDAxICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICVbc3JjXSwgJVtzdHJpZGVfeDFdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFRSX0FERElVICAiJVtkc3RdLCAlW2RzdF0sIDB4MTggICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgMWIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6IFJFU1RSSUNUX0FTTV9MT1czMiAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBbaF0iK3IiKGgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgW3NyY10iK3IiKHNyYyksICAgICAgICAgICAgICAgW2RzdF0iK3IiKGRzdCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6IFtzdHJpZGVfeDFdInIiKHNyY19zdHJpZGUpLCAgIFtzdHJpZGVfeDJdInIiKDIqc3JjX3N0cmlkZSksICAgICAgIFwKKyAgICAgICAgICBbc3RyaWRlX3gzXSJyIigzKnNyY19zdHJpZGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgW3JuZF0ibSIocm5kKSwgICAgICAgICAgICAgICAgW3NoaWZ0XSJmIihzaGlmdCksICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFtmZl9wd181M10ibSIoZmZfcHdfNTMpLCAgICAgIFtmZl9wd18xOF0ibSIoZmZfcHdfMTgpLCAgICAgICAgICAgIFwKKyAgICAgICAgICBbZmZfcHdfM10iZiIoZmZfcHdfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogIiQ4IiwgIiQ5IiwgIiRmMCIsICIkZjIiLCAiJGY0IiwgIiRmNiIsICIkZjgiLCAiJGYxMCIsICIkZjEyIiwgICAgXAorICAgICAgICAgICIkZjE0IiwgIiRmMTYiLCAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qKgorICogTWFjcm8gdG8gYnVpbGQgdGhlIGhvcml6b250YWwgMTZiaXRzIHZlcnNpb24gb2YgdmMxX3B1dF9zaGlmdFsxM10uCisgKiBIZXJlLCBvZmZzZXQ9MTZiaXRzLCBzbyBwYXJhbWV0ZXJzIHBhc3NlZCBBMSB0byBBNCBzaG91bGQgYmUgc2ltcGxlLgorICoKKyAqIEBwYXJhbSAgTkFNRSAgIEVpdGhlciAxIG9yIDMKKyAqIEBzZWUgTVNQRUxfRklMVEVSMTNfQ09SRSBmb3IgaW5mb3JtYXRpb24gb24gQTEtPkE0CisgKi8KKyNkZWZpbmUgTVNQRUxfRklMVEVSMTNfSE9SXzE2QihOQU1FLCBBMSwgQTIsIEEzLCBBNCwgT1AsIE9QTkFNRSkgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorT1BOQU1FICMjIHZjMV9ob3JfMTZiXyAjIyBOQU1FICMjIF9tbWkodWludDhfdCAqZHN0LCBtaXBzX3JlZyBzdHJpZGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnNyYywgaW50IHJuZCkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBoID0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVDTEFSRV9WQVJfQUREUlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMgLT0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcm5kIC09ICgtNCs1OCsxMy0zKSoyNTY7IC8qIEFkZCAtMjU2IGJpYXMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJ4b3IgICAgICAgICRmMCwgICAgJGYwLCAgICAkZjAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBMT0FEX1JPVU5ERVJfTU1JKCIlW3JuZF0iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxkYzEgICAgICAgJGYxMCwgICAlW2ZmX3B3XzUzXSAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsZGMxICAgICAgICRmMTIsICAgJVtmZl9wd18xOF0gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiLnAyYWxpZ24gMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1TUEVMX0ZJTFRFUjEzX0NPUkUoRE9OVF9VTlBBQ0ssIE1NSV9VTERDMSwgMiwgQTEsIEEyLCBBMywgQTQpICAgICAgXAorICAgICAgICAibGkgICAgICAgICAkOCwgICAgIDB4MDcgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIm10YzEgICAgICAgJDgsICAgICAkZjE2ICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE5PUk1BTElaRV9NTUkoIiRmMTYiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBSZW1vdmUgYmlhcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJGY2LCAgICAkZjYsICAgICVbZmZfcHdfMTI4XSAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkaCAgICAgICRmOCwgICAgJGY4LCAgICAlW2ZmX3B3XzEyOF0gICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUUkFOU0ZFUl9ET19QQUNLKE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAlW2hdLCAgLTB4MDEgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgJVtzcmNdLCAweDE4ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICVbZHN0XSwgJVtzdHJpZGVdICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAxYiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogUkVTVFJJQ1RfQVNNX0FMTDY0ICAgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FERFJUICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFtoXSIrciIoaCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBbc3JjXSIrciIoc3JjKSwgICAgICAgICAgICAgICBbZHN0XSIrciIoZHN0KSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogW3N0cmlkZV0iciIoc3RyaWRlKSwgICAgICAgICAgW3JuZF0ibSIocm5kKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFtmZl9wd181M10ibSIoZmZfcHdfNTMpLCAgICAgIFtmZl9wd18xOF0ibSIoZmZfcHdfMTgpLCAgICAgICAgICAgIFwKKyAgICAgICAgICBbZmZfcHdfM10iZiIoZmZfcHdfMyksICAgICAgICBbZmZfcHdfMTI4XSJmIihmZl9wd18xMjgpICAgICAgICAgICBcCisgICAgICAgIDogIiQ4IiwgIiQ5IiwgIiRmMCIsICIkZjIiLCAiJGY0IiwgIiRmNiIsICIkZjgiLCAiJGYxMCIsICIkZjEyIiwgICAgXAorICAgICAgICAgICIkZjE0IiwgIiRmMTYiLCAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qKgorICogTWFjcm8gdG8gYnVpbGQgdGhlIDhiaXRzLCBhbnkgZGlyZWN0aW9uLCB2ZXJzaW9uIG9mIHZjMV9wdXRfc2hpZnRbMTNdLgorICogSGVyZSwgb2Zmc2V0PXNyY19zdHJpZGUuIFBhcmFtZXRlcnMgcGFzc2VkIEExIHRvIEE0IG11c3QgdXNlCisgKiAlMyAob2Zmc2V0KSwgJTQgKDIqb2Zmc2V0KSBhbmQgJTUgKDMqb2Zmc2V0KS4KKyAqCisgKiBAcGFyYW0gIE5BTUUgICBFaXRoZXIgMSBvciAzCisgKiBAc2VlIE1TUEVMX0ZJTFRFUjEzX0NPUkUgZm9yIGluZm9ybWF0aW9uIG9uIEExLT5BNAorICovCisjZGVmaW5lIE1TUEVMX0ZJTFRFUjEzXzhCKE5BTUUsIEExLCBBMiwgQTMsIEE0LCBPUCwgT1BOQU1FKSAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK09QTkFNRSAjIyB2YzFfIyMgTkFNRSAjIyBfbW1pKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXBzX3JlZyBzdHJpZGUsIGludCBybmQsIG1pcHNfcmVnIG9mZnNldCkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaCA9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVDTEFSRV9WQVJfTE9XMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIERFQ0xBUkVfVkFSX0FERFJUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjIC09IG9mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJuZCA9IDMyLXJuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAieG9yICAgICAgICAkZjAsICAgICRmMCwgICAgJGYwICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTE9BRF9ST1VOREVSX01NSSgiJVtybmRdIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsZGMxICAgICAgICRmMTAsICAgJVtmZl9wd181M10gICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGRjMSAgICAgICAkZjEyLCAgICVbZmZfcHdfMThdICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNU1BFTF9GSUxURVIxM19DT1JFKERPX1VOUEFDSywgTU1JX1VMV0MxLCAxLCBBMSwgQTIsIEEzLCBBNCkgICAgICAgIFwKKyAgICAgICAgImxpICAgICAgICAgJDgsICAgICAweDA2ICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJtdGMxICAgICAgICQ4LCAgICAgJGYxNiAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBOT1JNQUxJWkVfTU1JKCIkZjE2IikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFJBTlNGRVJfRE9fUEFDSyhPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRpdSAgICAgICVbaF0sICAgJVtoXSwgICAgICAtMHgwMSAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICVbc3JjXSwgICAgICVbc3RyaWRlXSAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAlW2RzdF0sICAgICAlW3N0cmlkZV0gICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgMWIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6IFJFU1RSSUNUX0FTTV9MT1czMiAgICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBbaF0iK3IiKGgpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgW3NyY10iK3IiKHNyYyksICAgICAgICAgICAgICAgW2RzdF0iK3IiKGRzdCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6IFtvZmZzZXRfeDFdInIiKG9mZnNldCksICAgICAgIFtvZmZzZXRfeDJdInIiKDIqb2Zmc2V0KSwgICAgICAgICAgIFwKKyAgICAgICAgICBbb2Zmc2V0X3gzXSJyIigzKm9mZnNldCksICAgICBbc3RyaWRlXSJnIihzdHJpZGUpLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgW3JuZF0ibSIocm5kKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIFtmZl9wd181M10ibSIoZmZfcHdfNTMpLCAgICAgIFtmZl9wd18xOF0ibSIoZmZfcHdfMTgpLCAgICAgICAgICAgIFwKKyAgICAgICAgICBbZmZfcHdfM10iZiIoZmZfcHdfMykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogIiQ4IiwgIiQ5IiwgIiRmMCIsICIkZjIiLCAiJGY0IiwgIiRmNiIsICIkZjgiLCAiJGYxMCIsICIkZjEyIiwgICAgXAorICAgICAgICAgICIkZjE0IiwgIiRmMTYiLCAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyoqIDEvNCBzaGlmdCBiaWN1YmljIGludGVycG9sYXRpb24gKi8KK01TUEVMX0ZJTFRFUjEzXzhCKHNoaWZ0MSwgJVtvZmZzZXRfeDNdLCAlW29mZnNldF94Ml0sICVbb2Zmc2V0X3gxXSwgJDAsIE9QX1BVVCwgcHV0XykKK01TUEVMX0ZJTFRFUjEzXzhCKHNoaWZ0MSwgJVtvZmZzZXRfeDNdLCAlW29mZnNldF94Ml0sICVbb2Zmc2V0X3gxXSwgJDAsIE9QX0FWRywgYXZnXykKK01TUEVMX0ZJTFRFUjEzX1ZFUl8xNkIoc2hpZnQxLCAlW3N0cmlkZV94M10sICVbc3RyaWRlX3gyXSwgJVtzdHJpZGVfeDFdLCAkMCkKK01TUEVMX0ZJTFRFUjEzX0hPUl8xNkIoc2hpZnQxLCA2LCA0LCAyLCAwLCBPUF9QVVQsIHB1dF8pCitNU1BFTF9GSUxURVIxM19IT1JfMTZCKHNoaWZ0MSwgNiwgNCwgMiwgMCwgT1BfQVZHLCBhdmdfKQorCisvKiogMy80IHNoaWZ0IGJpY3ViaWMgaW50ZXJwb2xhdGlvbiAqLworTVNQRUxfRklMVEVSMTNfOEIoc2hpZnQzLCAkMCwgJVtvZmZzZXRfeDFdLCAlW29mZnNldF94Ml0sICVbb2Zmc2V0X3gzXSwgT1BfUFVULCBwdXRfKQorTVNQRUxfRklMVEVSMTNfOEIoc2hpZnQzLCAkMCwgJVtvZmZzZXRfeDFdLCAlW29mZnNldF94Ml0sICVbb2Zmc2V0X3gzXSwgT1BfQVZHLCBhdmdfKQorTVNQRUxfRklMVEVSMTNfVkVSXzE2QihzaGlmdDMsICQwLCAlW3N0cmlkZV94MV0sICVbc3RyaWRlX3gyXSwgJVtzdHJpZGVfeDNdKQorTVNQRUxfRklMVEVSMTNfSE9SXzE2QihzaGlmdDMsIDAsIDIsIDQsIDYsIE9QX1BVVCwgcHV0XykKK01TUEVMX0ZJTFRFUjEzX0hPUl8xNkIoc2hpZnQzLCAwLCAyLCA0LCA2LCBPUF9BVkcsIGF2Z18pCisKK3R5cGVkZWYgdm9pZCAoKnZjMV9tc3BlbF9tY19maWx0ZXJfdmVyXzE2Yml0cykKKyAgICAgICAgICAgICAoaW50MTZfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIG1pcHNfcmVnIHNyY19zdHJpZGUsIGludCBybmQsCisgICAgICAgICAgICAgIGludDY0X3Qgc2hpZnQpOwordHlwZWRlZiB2b2lkICgqdmMxX21zcGVsX21jX2ZpbHRlcl9ob3JfMTZiaXRzKQorICAgICAgICAgICAgICh1aW50OF90ICpkc3QsIG1pcHNfcmVnIGRzdF9zdHJpZGUsIGNvbnN0IGludDE2X3QgKnNyYywgaW50IHJuZCk7Cit0eXBlZGVmIHZvaWQgKCp2YzFfbXNwZWxfbWNfZmlsdGVyXzhiaXRzKQorICAgICAgICAgICAgICh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgbWlwc19yZWcgc3RyaWRlLCBpbnQgcm5kLAorICAgICAgICAgICAgICBtaXBzX3JlZyBvZmZzZXQpOworCisvKioKKyAqIEludGVycG9sYXRlIGZyYWN0aW9uYWwgcGVsIHZhbHVlcyBieSBhcHBseWluZyBwcm9wZXIgdmVydGljYWwgdGhlbgorICogaG9yaXpvbnRhbCBmaWx0ZXIuCisgKgorICogQHBhcmFtICBkc3QgICAgIERlc3RpbmF0aW9uIGJ1ZmZlciBmb3IgaW50ZXJwb2xhdGVkIHBlbHMuCisgKiBAcGFyYW0gIHNyYyAgICAgU291cmNlIGJ1ZmZlci4KKyAqIEBwYXJhbSAgc3RyaWRlICBTdHJpZGUgZm9yIGJvdGggc3JjIGFuZCBkc3QgYnVmZmVycy4KKyAqIEBwYXJhbSAgaG1vZGUgICBIb3Jpem9udGFsIGZpbHRlciAoZXhwcmVzc2VkIGluIHF1YXJ0ZXIgcGl4ZWxzIHNoaWZ0KS4KKyAqIEBwYXJhbSAgaG1vZGUgICBWZXJ0aWNhbCBmaWx0ZXIuCisgKiBAcGFyYW0gIHJuZCAgICAgUm91bmRpbmcgYmlhcy4KKyAqLworI2RlZmluZSBWQzFfTVNQRUxfTUMoT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIE9QICMjIHZjMV9tc3BlbF9tYyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhtb2RlLCBpbnQgdm1vZGUsIGludCBybmQpICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgY29uc3QgdmMxX21zcGVsX21jX2ZpbHRlcl92ZXJfMTZiaXRzIHZjMV9wdXRfc2hpZnRfdmVyXzE2Yml0c1tdID1cCisgICAgICAgICB7IE5VTEwsIHZjMV9wdXRfdmVyXzE2Yl9zaGlmdDFfbW1pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICB2YzFfcHV0X3Zlcl8xNmJfc2hpZnQyX21taSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgdmMxX3B1dF92ZXJfMTZiX3NoaWZ0M19tbWkgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IHZjMV9tc3BlbF9tY19maWx0ZXJfaG9yXzE2Yml0cyB2YzFfcHV0X3NoaWZ0X2hvcl8xNmJpdHNbXSA9XAorICAgICAgICAgeyBOVUxMLCBPUCAjIyB2YzFfaG9yXzE2Yl9zaGlmdDFfbW1pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgT1AgIyMgdmMxX2hvcl8xNmJfc2hpZnQyX21taSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIE9QICMjIHZjMV9ob3JfMTZiX3NoaWZ0M19tbWkgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBjb25zdCB2YzFfbXNwZWxfbWNfZmlsdGVyXzhiaXRzIHZjMV9wdXRfc2hpZnRfOGJpdHNbXSA9ICAgICAgICAgIFwKKyAgICAgICAgIHsgTlVMTCwgT1AgIyMgdmMxX3NoaWZ0MV9tbWksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIE9QICMjIHZjMV9zaGlmdDJfbW1pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBPUCAjIyB2YzFfc2hpZnQzX21taSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHZtb2RlKSB7IC8qIFZlcnRpY2FsIGZpbHRlciB0byBhcHBseSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoaG1vZGUpIHsgLyogSG9yaXpvbnRhbCBmaWx0ZXIgdG8gYXBwbHksIG91dHB1dCB0byB0bXAgKi8gICAgICAgIFwKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2hpZnRfdmFsdWVbXSA9IHsgMCwgNSwgMSwgNSB9OyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgICAgc2hpZnQgPSAoc2hpZnRfdmFsdWVbaG1vZGVdK3NoaWZ0X3ZhbHVlW3Ztb2RlXSk+PjE7ICAgICAgXAorICAgICAgICAgICAgaW50ICAgIHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIExPQ0FMX0FMSUdORUQoMTYsIGludDE2X3QsIHRtcCwgWzEyKjhdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgciA9ICgxPDwoc2hpZnQtMSkpICsgcm5kLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZjMV9wdXRfc2hpZnRfdmVyXzE2Yml0c1t2bW9kZV0odG1wLCBzcmMtMSwgc3RyaWRlLCByLCBzaGlmdCk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmMxX3B1dF9zaGlmdF9ob3JfMTZiaXRzW2htb2RlXShkc3QsIHN0cmlkZSwgdG1wKzEsIDY0LXJuZCk7ICAgIFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgLyogTm8gaG9yaXpvbnRhbCBmaWx0ZXIsIG91dHB1dCA4IGxpbmVzIHRvIGRzdCAqLyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZjMV9wdXRfc2hpZnRfOGJpdHNbdm1vZGVdKGRzdCwgc3JjLCBzdHJpZGUsIDEtcm5kLCBzdHJpZGUpOyAgICBcCisgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEhvcml6b250YWwgbW9kZSB3aXRoIG5vIHZlcnRpY2FsIG1vZGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2YzFfcHV0X3NoaWZ0XzhiaXRzW2htb2RlXShkc3QsIHNyYywgc3RyaWRlLCBybmQsIDEpOyAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgT1AgIyMgdmMxX21zcGVsX21jXzE2KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaG1vZGUsIGludCB2bW9kZSwgaW50IHJuZClcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QICMjIHZjMV9tc3BlbF9tYyhkc3QgKyAwLCBzcmMgKyAwLCBzdHJpZGUsIGhtb2RlLCB2bW9kZSwgcm5kKTsgICAgICAgIFwKKyAgICBPUCAjIyB2YzFfbXNwZWxfbWMoZHN0ICsgOCwgc3JjICsgOCwgc3RyaWRlLCBobW9kZSwgdm1vZGUsIHJuZCk7ICAgICAgICBcCisgICAgZHN0ICs9IDgqc3RyaWRlOyBzcmMgKz0gOCpzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QICMjIHZjMV9tc3BlbF9tYyhkc3QgKyAwLCBzcmMgKyAwLCBzdHJpZGUsIGhtb2RlLCB2bW9kZSwgcm5kKTsgICAgICAgIFwKKyAgICBPUCAjIyB2YzFfbXNwZWxfbWMoZHN0ICsgOCwgc3JjICsgOCwgc3RyaWRlLCBobW9kZSwgdm1vZGUsIHJuZCk7ICAgICAgICBcCit9CisKK1ZDMV9NU1BFTF9NQyhwdXRfKQorVkMxX01TUEVMX01DKGF2Z18pCisKKy8qKiBNYWNybyB0byBlYXNlIGJpY3ViaWMgZmlsdGVyIGludGVycG9sYXRpb24gZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyAqLworI2RlZmluZSBERUNMQVJFX0ZVTkNUSU9OKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfcHV0X3ZjMV9tc3BlbF9tYyAjIyBhICMjIGIgIyMgX21taSh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm5kKSAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBwdXRfdmMxX21zcGVsX21jKGRzdCwgc3JjLCBzdHJpZGUsIGEsIGIsIHJuZCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2F2Z192YzFfbXNwZWxfbWMgIyMgYSAjIyBiICMjIF9tbWkodWludDhfdCAqZHN0LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJuZCkgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgYXZnX3ZjMV9tc3BlbF9tYyhkc3QsIHNyYywgc3RyaWRlLCBhLCBiLCBybmQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9wdXRfdmMxX21zcGVsX21jICMjIGEgIyMgYiAjIyBfMTZfbW1pKHVpbnQ4X3QgKmRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBybmQpICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIHB1dF92YzFfbXNwZWxfbWNfMTYoZHN0LCBzcmMsIHN0cmlkZSwgYSwgYiwgcm5kKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfYXZnX3ZjMV9tc3BlbF9tYyAjIyBhICMjIGIgIyMgXzE2X21taSh1aW50OF90ICpkc3QsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm5kKSAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICBhdmdfdmMxX21zcGVsX21jXzE2KGRzdCwgc3JjLCBzdHJpZGUsIGEsIGIsIHJuZCk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVDTEFSRV9GVU5DVElPTigwLCAxKQorREVDTEFSRV9GVU5DVElPTigwLCAyKQorREVDTEFSRV9GVU5DVElPTigwLCAzKQorCitERUNMQVJFX0ZVTkNUSU9OKDEsIDApCitERUNMQVJFX0ZVTkNUSU9OKDEsIDEpCitERUNMQVJFX0ZVTkNUSU9OKDEsIDIpCitERUNMQVJFX0ZVTkNUSU9OKDEsIDMpCisKK0RFQ0xBUkVfRlVOQ1RJT04oMiwgMCkKK0RFQ0xBUkVfRlVOQ1RJT04oMiwgMSkKK0RFQ0xBUkVfRlVOQ1RJT04oMiwgMikKK0RFQ0xBUkVfRlVOQ1RJT04oMiwgMykKKworREVDTEFSRV9GVU5DVElPTigzLCAwKQorREVDTEFSRV9GVU5DVElPTigzLCAxKQorREVDTEFSRV9GVU5DVElPTigzLCAyKQorREVDTEFSRV9GVU5DVElPTigzLCAzKQorCisjZGVmaW5lIENIUk9NQV9NQ184X01NSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDZdLCAgICVbZnRtcDJdLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wN10sICAgJVtmdG1wM10sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXA4XSwgICAlW2Z0bXA0XSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAlW0FdICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgJVtBXSAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICVbQl0gICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAlW0JdICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgJVtDXSAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICVbQ10gICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAlW0RdICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgJVtEXSAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAlW2ZmX3B3XzI4XSAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICVbZnRtcDZdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAlW2Z0bXA4XSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgJVtmdG1wN10gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICVbZmZfcHdfMjhdICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBzcmxoICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICVbZnRtcDldICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAlW2Z0bXA1XSAgICAgICAgICAgICAgICBcblx0IgorCisKKyNkZWZpbmUgQ0hST01BX01DXzRfTU1JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgJVtBXSAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICVbQl0gICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAlW0NdICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgJVtEXSAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAlW2Z0bXAyXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICVbZnRtcDNdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAlW2ZmX3B3XzI4XSAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwc3JsaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICVbZnRtcDVdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICBcblx0IgorCisKK3ZvaWQgZmZfcHV0X25vX3JuZF92YzFfY2hyb21hX21jOF9tbWkodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KQoreworICAgIGNvbnN0IGludCBBID0gKDggLSB4KSAqICg4IC0geSk7CisgICAgY29uc3QgaW50IEIgPSAgICAgKHgpICogKDggLSB5KTsKKyAgICBjb25zdCBpbnQgQyA9ICg4IC0geCkgKiAgICAgKHkpOworICAgIGNvbnN0IGludCBEID0gICAgICh4KSAqICAgICAoeSk7CisgICAgZG91YmxlIGZ0bXBbMTBdOworICAgIHVpbnQzMl90IHRtcFsxXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKKworICAgIGF2X2Fzc2VydDIoeCA8IDggJiYgeSA8IDggJiYgeCA+PSAwICYmIHkgPj0gMCk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW0FdLCAgICAgICAlW0FdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtCXSwgICAgICAgJVtCXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbQ10sICAgICAgICVbQ10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW0RdLCAgICAgICAlW0RdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAxKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDAxKQorCisgICAgICAgIENIUk9NQV9NQ184X01NSQorCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICJhZGRpdSAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUREUlQKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFtzcmNdIismciIoc3JjKSwgICAgICAgICAgICAgIFtkc3RdIismciIoZHN0KSwKKyAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLAorICAgICAgICAgIFtBXSJmIihBKSwgICAgICAgICAgICAgICAgICAgIFtCXSJmIihCKSwKKyAgICAgICAgICBbQ10iZiIoQyksICAgICAgICAgICAgICAgICAgICBbRF0iZiIoRCksCisgICAgICAgICAgW2ZmX3B3XzI4XSJmIihmZl9wd18yOCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3ZvaWQgZmZfcHV0X25vX3JuZF92YzFfY2hyb21hX21jNF9tbWkodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KQoreworICAgIGNvbnN0IGludCBBID0gKDggLSB4KSAqICg4IC0geSk7CisgICAgY29uc3QgaW50IEIgPSAgICAgKHgpICogKDggLSB5KTsKKyAgICBjb25zdCBpbnQgQyA9ICg4IC0geCkgKiAgICAgKHkpOworICAgIGNvbnN0IGludCBEID0gICAgICh4KSAqICAgICAoeSk7CisgICAgZG91YmxlIGZ0bXBbNl07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCisgICAgYXZfYXNzZXJ0Mih4IDwgOCAmJiB5IDwgOCAmJiB4ID49IDAgJiYgeSA+PSAwKTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbQV0sICAgICAgICVbQV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW0JdLCAgICAgICAlW0JdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtDXSwgICAgICAgJVtDXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbRF0sICAgICAgICVbRF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDEpCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDRdLCAlW3NyY10sIDB4MDEpCisKKyAgICAgICAgQ0hST01BX01DXzRfTU1JCisKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFtzcmNdIismciIoc3JjKSwgICAgICAgICAgICAgIFtkc3RdIismciIoZHN0KSwKKyAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLAorICAgICAgICAgIFtBXSJmIihBKSwgICAgICAgICAgICAgICAgICAgIFtCXSJmIihCKSwKKyAgICAgICAgICBbQ10iZiIoQyksICAgICAgICAgICAgICAgICAgICBbRF0iZiIoRCksCisgICAgICAgICAgW2ZmX3B3XzI4XSJmIihmZl9wd18yOCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3ZvaWQgZmZfYXZnX25vX3JuZF92YzFfY2hyb21hX21jOF9tbWkodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KQoreworICAgIGNvbnN0IGludCBBID0gKDggLSB4KSAqICg4IC0geSk7CisgICAgY29uc3QgaW50IEIgPSAgICAgKHgpICogKDggLSB5KTsKKyAgICBjb25zdCBpbnQgQyA9ICg4IC0geCkgKiAgICAgKHkpOworICAgIGNvbnN0IGludCBEID0gICAgICh4KSAqICAgICAoeSk7CisgICAgZG91YmxlIGZ0bXBbMTBdOworICAgIHVpbnQzMl90IHRtcFsxXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKyAgICBERUNMQVJFX1ZBUl9BRERSVDsKKworICAgIGF2X2Fzc2VydDIoeCA8IDggJiYgeSA8IDggJiYgeCA+PSAwICYmIHkgPj0gMCk7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW0FdLCAgICAgICAlW0FdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtCXSwgICAgICAgJVtCXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbQ10sICAgICAgICVbQ10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW0RdLCAgICAgICAlW0RdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAyXSwgJVtzcmNdLCAweDAxKQorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDNdLCAlW3NyY10sIDB4MDApCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXA0XSwgJVtzcmNdLCAweDAxKQorCisgICAgICAgIENIUk9NQV9NQ184X01NSQorCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICJwYXZnYiAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICVbZnRtcDJdICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2RzdF0sIDB4MDApCisgICAgICAgICJhZGRpdSAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgLTB4MDEgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAlW3N0cmlkZV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgIFtmdG1wOV0iPSZmIihmdG1wWzldKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFtzcmNdIismciIoc3JjKSwgICAgICAgICAgICAgIFtkc3RdIismciIoZHN0KSwKKyAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLAorICAgICAgICAgIFtBXSJmIihBKSwgICAgICAgICAgICAgICAgICAgIFtCXSJmIihCKSwKKyAgICAgICAgICBbQ10iZiIoQyksICAgICAgICAgICAgICAgICAgICBbRF0iZiIoRCksCisgICAgICAgICAgW2ZmX3B3XzI4XSJmIihmZl9wd18yOCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3ZvaWQgZmZfYXZnX25vX3JuZF92YzFfY2hyb21hX21jNF9tbWkodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KQoreworICAgIGNvbnN0IGludCBBID0gKDggLSB4KSAqICg4IC0geSk7CisgICAgY29uc3QgaW50IEIgPSAoICAgIHgpICogKDggLSB5KTsKKyAgICBjb25zdCBpbnQgQyA9ICg4IC0geCkgKiAoICAgIHkpOworICAgIGNvbnN0IGludCBEID0gKCAgICB4KSAqICggICAgeSk7CisgICAgZG91YmxlIGZ0bXBbNl07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FERFJUOworCisgICAgYXZfYXNzZXJ0Mih4IDwgOCAmJiB5IDwgOCAmJiB4ID49IDAgJiYgeSA+PSAwKTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbQV0sICAgICAgICVbQV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW0JdLCAgICAgICAlW0JdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtDXSwgICAgICAgJVtDXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbRF0sICAgICAgICVbRF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDJdLCAlW3NyY10sIDB4MDEpCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wM10sICVbc3JjXSwgMHgwMCkKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDRdLCAlW3NyY10sIDB4MDEpCisKKyAgICAgICAgQ0hST01BX01DXzRfTU1JCisKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wMl0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgInBhdmdiICAgICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0XSwgMHgwMCkKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAtMHgwMSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BRERSVAorICAgICAgICAgIFtzcmNdIismciIoc3JjKSwgICAgICAgICAgICAgIFtkc3RdIismciIoZHN0KSwKKyAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtzdHJpZGVdInIiKChtaXBzX3JlZylzdHJpZGUpLAorICAgICAgICAgIFtBXSJmIihBKSwgICAgICAgICAgICAgICAgICAgIFtCXSJmIihCKSwKKyAgICAgICAgICBbQ10iZiIoQyksICAgICAgICAgICAgICAgICAgICBbRF0iZiIoRCksCisgICAgICAgICAgW2ZmX3B3XzI4XSJmIihmZl9wd18yOCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvdmlkZW9kc3BfaW5pdC5jIGIvbGliYXZjb2RlYy9taXBzL3ZpZGVvZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTcwNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9taXBzL3ZpZGVvZHNwX2luaXQuYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IEthdXN0dWJoIFJhc3RlIChrYXVzdHViaC5yYXN0ZUBpbWd0ZWMuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWlwcy9hc21kZWZzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92aWRlb2RzcC5oIgorCisjaWYgSEFWRV9NU0EKK3N0YXRpYyB2b2lkIHByZWZldGNoX21pcHModWludDhfdCAqbWVtLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCkKK3sKKyAgICByZWdpc3RlciBjb25zdCB1aW50OF90ICpwID0gbWVtOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHJlZiAgICAgICAgICA0LCAgMCglW3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInByZWYgICAgICAgICAgNCwgIDMyKCVbcF0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSIgICVbaF0sICAlW2hdLCAgICAgLTEgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAiICAlW3BdLCAgJVtwXSwgICAgICVbc3RyaWRlXSAgXG5cdCIKKworICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgMWIgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICA6IFtwXSAiK3IiIChwKSwgW2hdICIrciIgKGgpCisgICAgICAgIDogW3N0cmlkZV0gInIiIChzdHJpZGUpCisgICAgKTsKK30KKyNlbmRpZiAgLy8gI2lmIEhBVkVfTVNBCisKK2F2X2NvbGQgdm9pZCBmZl92aWRlb2RzcF9pbml0X21pcHMoVmlkZW9EU1BDb250ZXh0ICpjdHgsIGludCBicGMpCit7CisjaWYgSEFWRV9NU0EKKyAgICBjdHgtPnByZWZldGNoID0gcHJlZmV0Y2hfbWlwczsKKyNlbmRpZiAgLy8gI2lmIEhBVkVfTVNBCit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvdnA4ZHNwX2luaXRfbWlwcy5jIGIvbGliYXZjb2RlYy9taXBzL3ZwOGRzcF9pbml0X21pcHMuYwppbmRleCA1OGQxYjZjLi4zZmM1ZjhlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvdnA4ZHNwX2luaXRfbWlwcy5jCisrKyBiL2xpYmF2Y29kZWMvbWlwcy92cDhkc3BfaW5pdF9taXBzLmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDE1IE1hbm9qa3VtYXIgQmhvc2FsZSAoTWFub2prdW1hci5CaG9zYWxlQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgWmhvdSBYaWFveW9uZyA8emhvdXhpYW95b25nQGxvb25nc29uLmNuPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0xMDUsOSArMTA2LDk3IEBACiB9CiAjZW5kaWYgIC8vICNpZiBIQVZFX01TQQogCisjaWYgSEFWRV9NTUkKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnA4ZHNwX2luaXRfbW1pKFZQOERTUENvbnRleHQgKmRzcCkKK3sKKyAgICBkc3AtPnZwOF9sdW1hX2RjX3dodCAgICA9IGZmX3ZwOF9sdW1hX2RjX3dodF9tbWk7CisgICAgZHNwLT52cDhfbHVtYV9kY193aHRfZGMgPSBmZl92cDhfbHVtYV9kY193aHRfZGNfbW1pOworICAgIGRzcC0+dnA4X2lkY3RfYWRkICAgICAgID0gZmZfdnA4X2lkY3RfYWRkX21taTsKKyAgICBkc3AtPnZwOF9pZGN0X2RjX2FkZCAgICA9IGZmX3ZwOF9pZGN0X2RjX2FkZF9tbWk7CisgICAgZHNwLT52cDhfaWRjdF9kY19hZGQ0eSAgPSBmZl92cDhfaWRjdF9kY19hZGQ0eV9tbWk7CisgICAgZHNwLT52cDhfaWRjdF9kY19hZGQ0dXYgPSBmZl92cDhfaWRjdF9kY19hZGQ0dXZfbW1pOworCisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlswXVswXVsxXSA9IGZmX3B1dF92cDhfZXBlbDE2X2g0X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzBdWzJdID0gZmZfcHV0X3ZwOF9lcGVsMTZfaDZfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMF1bMV1bMF0gPSBmZl9wdXRfdnA4X2VwZWwxNl92NF9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlswXVsxXVsxXSA9IGZmX3B1dF92cDhfZXBlbDE2X2g0djRfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMF1bMV1bMl0gPSBmZl9wdXRfdnA4X2VwZWwxNl9oNnY0X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzJdWzBdID0gZmZfcHV0X3ZwOF9lcGVsMTZfdjZfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMF1bMl1bMV0gPSBmZl9wdXRfdnA4X2VwZWwxNl9oNHY2X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzBdWzJdWzJdID0gZmZfcHV0X3ZwOF9lcGVsMTZfaDZ2Nl9tbWk7CisKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzBdWzFdID0gZmZfcHV0X3ZwOF9lcGVsOF9oNF9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVswXVsyXSA9IGZmX3B1dF92cDhfZXBlbDhfaDZfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMV1bMV1bMF0gPSBmZl9wdXRfdnA4X2VwZWw4X3Y0X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzFdWzFdID0gZmZfcHV0X3ZwOF9lcGVsOF9oNHY0X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzFdWzJdID0gZmZfcHV0X3ZwOF9lcGVsOF9oNnY0X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzFdWzJdWzBdID0gZmZfcHV0X3ZwOF9lcGVsOF92Nl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsyXVsxXSA9IGZmX3B1dF92cDhfZXBlbDhfaDR2Nl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsxXVsyXVsyXSA9IGZmX3B1dF92cDhfZXBlbDhfaDZ2Nl9tbWk7CisKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzBdWzFdID0gZmZfcHV0X3ZwOF9lcGVsNF9oNF9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVswXVsyXSA9IGZmX3B1dF92cDhfZXBlbDRfaDZfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMl1bMV1bMF0gPSBmZl9wdXRfdnA4X2VwZWw0X3Y0X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzFdWzFdID0gZmZfcHV0X3ZwOF9lcGVsNF9oNHY0X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzFdWzJdID0gZmZfcHV0X3ZwOF9lcGVsNF9oNnY0X21taTsKKyAgICBkc3AtPnB1dF92cDhfZXBlbF9waXhlbHNfdGFiWzJdWzJdWzBdID0gZmZfcHV0X3ZwOF9lcGVsNF92Nl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsyXVsxXSA9IGZmX3B1dF92cDhfZXBlbDRfaDR2Nl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlsyXVsyXVsyXSA9IGZmX3B1dF92cDhfZXBlbDRfaDZ2Nl9tbWk7CisKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVswXVsxXSA9IGZmX3B1dF92cDhfYmlsaW5lYXIxNl9oX21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVswXVsyXSA9IGZmX3B1dF92cDhfYmlsaW5lYXIxNl9oX21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVsxXVswXSA9IGZmX3B1dF92cDhfYmlsaW5lYXIxNl92X21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVsxXVsxXSA9IGZmX3B1dF92cDhfYmlsaW5lYXIxNl9odl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMF1bMV1bMl0gPSBmZl9wdXRfdnA4X2JpbGluZWFyMTZfaHZfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzJdWzBdID0gZmZfcHV0X3ZwOF9iaWxpbmVhcjE2X3ZfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzBdWzJdWzFdID0gZmZfcHV0X3ZwOF9iaWxpbmVhcjE2X2h2X21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlswXVsyXVsyXSA9IGZmX3B1dF92cDhfYmlsaW5lYXIxNl9odl9tbWk7CisKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVswXVsxXSA9IGZmX3B1dF92cDhfYmlsaW5lYXI4X2hfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzFdWzBdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbmVhcjhfaF9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMV1bMV1bMF0gPSBmZl9wdXRfdnA4X2JpbGluZWFyOF92X21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVsxXVsxXSA9IGZmX3B1dF92cDhfYmlsaW5lYXI4X2h2X21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVsxXVsyXSA9IGZmX3B1dF92cDhfYmlsaW5lYXI4X2h2X21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVsyXVswXSA9IGZmX3B1dF92cDhfYmlsaW5lYXI4X3ZfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzFdWzJdWzFdID0gZmZfcHV0X3ZwOF9iaWxpbmVhcjhfaHZfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzFdWzJdWzJdID0gZmZfcHV0X3ZwOF9iaWxpbmVhcjhfaHZfbW1pOworCisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMF1bMV0gPSBmZl9wdXRfdnA4X2JpbGluZWFyNF9oX21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsyXVswXVsyXSA9IGZmX3B1dF92cDhfYmlsaW5lYXI0X2hfbW1pOworICAgIGRzcC0+cHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzJdWzFdWzBdID0gZmZfcHV0X3ZwOF9iaWxpbmVhcjRfdl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMV1bMV0gPSBmZl9wdXRfdnA4X2JpbGluZWFyNF9odl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMV1bMl0gPSBmZl9wdXRfdnA4X2JpbGluZWFyNF9odl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMl1bMl1bMF0gPSBmZl9wdXRfdnA4X2JpbGluZWFyNF92X21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsyXVsyXVsxXSA9IGZmX3B1dF92cDhfYmlsaW5lYXI0X2h2X21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsyXVsyXVsyXSA9IGZmX3B1dF92cDhfYmlsaW5lYXI0X2h2X21taTsKKworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMF1bMF1bMF0gICAgID0gZmZfcHV0X3ZwOF9waXhlbHMxNl9tbWk7CisgICAgZHNwLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMF1bMF1bMF0gPSBmZl9wdXRfdnA4X3BpeGVsczE2X21taTsKKworICAgIGRzcC0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbMV1bMF1bMF0gICAgID0gZmZfcHV0X3ZwOF9waXhlbHM4X21taTsKKyAgICBkc3AtPnB1dF92cDhfYmlsaW5lYXJfcGl4ZWxzX3RhYlsxXVswXVswXSA9IGZmX3B1dF92cDhfcGl4ZWxzOF9tbWk7CisKKyAgICBkc3AtPnZwOF92X2xvb3BfZmlsdGVyMTZ5ID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXIxNl9tbWk7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjE2eSA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZfbW1pOworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXI4dXYgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjh1dl9tbWk7CisgICAgZHNwLT52cDhfaF9sb29wX2ZpbHRlcjh1diA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyOHV2X21taTsKKworICAgIGRzcC0+dnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2X2lubmVyX21taTsKKyAgICBkc3AtPnZwOF9oX2xvb3BfZmlsdGVyMTZ5X2lubmVyID0gZmZfdnA4X2hfbG9vcF9maWx0ZXIxNl9pbm5lcl9tbWk7CisgICAgZHNwLT52cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lciA9IGZmX3ZwOF92X2xvb3BfZmlsdGVyOHV2X2lubmVyX21taTsKKyAgICBkc3AtPnZwOF9oX2xvb3BfZmlsdGVyOHV2X2lubmVyID0gZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXJfbW1pOworCisgICAgZHNwLT52cDhfdl9sb29wX2ZpbHRlcl9zaW1wbGUgPSBmZl92cDhfdl9sb29wX2ZpbHRlcl9zaW1wbGVfbW1pOworICAgIGRzcC0+dnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlID0gZmZfdnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlX21taTsKK30KKyNlbmRpZiAvKiBIQVZFX01NSSAqLworCiBhdl9jb2xkIHZvaWQgZmZfdnA4ZHNwX2luaXRfbWlwcyhWUDhEU1BDb250ZXh0ICpkc3ApCiB7CiAjaWYgSEFWRV9NU0EKICAgICB2cDhkc3BfaW5pdF9tc2EoZHNwKTsKICNlbmRpZiAgLy8gI2lmIEhBVkVfTVNBCisjaWYgSEFWRV9NTUkKKyAgICB2cDhkc3BfaW5pdF9tbWkoZHNwKTsKKyNlbmRpZiAvKiBIQVZFX01NSSAqLwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3ZwOGRzcF9taXBzLmggYi9saWJhdmNvZGVjL21pcHMvdnA4ZHNwX21pcHMuaAppbmRleCA4ZTcxNWI1Li4wNzY2NmFiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvdnA4ZHNwX21pcHMuaAorKysgYi9saWJhdmNvZGVjL21pcHMvdnA4ZHNwX21pcHMuaApAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWFub2prdW1hciBCaG9zYWxlIChNYW5vamt1bWFyLkJob3NhbGVAaW1ndGVjLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAxNiBaaG91IFhpYW95b25nIDx6aG91eGlhb3lvbmdAbG9vbmdzb24uY24+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIxLDYgKzIyLDExIEBACiAjaWZuZGVmIEFWQ09ERUNfTUlQU19WUDhEU1BfTUlQU19ICiAjZGVmaW5lIEFWQ09ERUNfTUlQU19WUDhEU1BfTUlQU19ICiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDhkc3AuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21hdGhvcHMuaCIKKyNpbmNsdWRlICJjb25zdGFudHMuaCIKKwogdm9pZCBmZl9wdXRfdnA4X3BpeGVsczRfbXNhKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCB4LCBpbnQgeSk7CkBAIC0xNjksNCArMTc1LDExNSBAQAogdm9pZCBmZl92cDhfaWRjdF9kY19hZGQ0eV9tc2EodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOwogCit2b2lkIGZmX3ZwOF9sdW1hX2RjX3dodF9tbWkoaW50MTZfdCBibG9ja1s0XVs0XVsxNl0sIGludDE2X3QgZGNbMTZdKTsKK3ZvaWQgZmZfdnA4X2x1bWFfZGNfd2h0X2RjX21taShpbnQxNl90IGJsb2NrWzRdWzRdWzE2XSwgaW50MTZfdCBkY1sxNl0pOwordm9pZCBmZl92cDhfaWRjdF9hZGRfbW1pKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl92cDhfaWRjdF9kY19hZGRfbW1pKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1sxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl92cDhfaWRjdF9kY19hZGQ0eV9tbWkodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZDR1dl9tbWkodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CisKK3ZvaWQgZmZfcHV0X3ZwOF9waXhlbHM0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7Cit2b2lkIGZmX3B1dF92cDhfcGl4ZWxzOF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl9wdXRfdnA4X3BpeGVsczE2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsMTZfaDRfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWwxNl9oNl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfZXBlbDE2X3Y0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsMTZfdjZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWwxNl9oNHY0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsMTZfaDZ2NF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfZXBlbDE2X2g0djZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWwxNl9oNnY2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKKwordm9pZCBmZl9wdXRfdnA4X2VwZWw4X2g0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfZXBlbDhfdjRfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw4X3Y2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNHY0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNnY0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNHY2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNnY2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKKwordm9pZCBmZl9wdXRfdnA4X2VwZWw0X2g0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsNF9oNl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfZXBlbDRfdjRfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwKKyAgICAgICAgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpOwordm9pZCBmZl9wdXRfdnA4X2VwZWw0X3Y2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsNF9oNHY0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsNF9oNnY0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsNF9oNHY2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsNF9oNnY2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKKwordm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyMTZfaF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXIxNl92X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjE2X2h2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKKwordm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyOF9oX21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjhfdl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXI4X2h2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKKwordm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyNF9oX21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjRfdl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLAorICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSk7Cit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXI0X2h2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsCisgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KTsKKworLy8gbG9vcCBmaWx0ZXIgYXBwbGllZCB0byBlZGdlcyBiZXR3ZWVuIG1hY3JvYmxvY2tzCit2b2lkIGZmX3ZwOF92X2xvb3BfZmlsdGVyMTZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW1fRSwKKyAgICAgICAgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpOwordm9pZCBmZl92cDhfaF9sb29wX2ZpbHRlcjE2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmbGltX0UsCisgICAgICAgIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKK3ZvaWQgZmZfdnA4X3ZfbG9vcF9maWx0ZXI4dXZfbW1pKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKK3ZvaWQgZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfbW1pKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKKworLy8gbG9vcCBmaWx0ZXIgYXBwbGllZCB0byBpbm5lciBtYWNyb2Jsb2NrIGVkZ2VzCit2b2lkIGZmX3ZwOF92X2xvb3BfZmlsdGVyMTZfaW5uZXJfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpOwordm9pZCBmZl92cDhfaF9sb29wX2ZpbHRlcjE2X2lubmVyX21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKK3ZvaWQgZmZfdnA4X3ZfbG9vcF9maWx0ZXI4dXZfaW5uZXJfbW1pKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKK3ZvaWQgZmZfdnA4X2hfbG9vcF9maWx0ZXI4dXZfaW5uZXJfbW1pKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKTsKKwordm9pZCBmZl92cDhfdl9sb29wX2ZpbHRlcl9zaW1wbGVfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW0pOwordm9pZCBmZl92cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGVfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW0pOworCiAjZW5kaWYgIC8vICNpZm5kZWYgQVZDT0RFQ19NSVBTX1ZQOERTUF9NSVBTX0gKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWlwcy92cDhkc3BfbW1pLmMgYi9saWJhdmNvZGVjL21pcHMvdnA4ZHNwX21taS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzI2MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21pcHMvdnA4ZHNwX21taS5jCkBAIC0wLDAgKzEsMzA1MiBAQAorLyoKKyAqIExvb25nc29uIFNJTUQgb3B0aW1pemVkIHZwOGRzcAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBMb29uZ3NvbiBUZWNobm9sb2d5IENvcnBvcmF0aW9uIExpbWl0ZWQKKyAqIENvcHlyaWdodCAoYykgMjAxNiBaaG91IFhpYW95b25nIDx6aG91eGlhb3lvbmdAbG9vbmdzb24uY24+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJ2cDhkc3BfbWlwcy5oIgorI2luY2x1ZGUgImNvbnN0YW50cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL21taXV0aWxzLmgiCisKKyNkZWZpbmUgUFVUX1ZQOF9FUEVMNF9INl9NTUkoc3JjLCBkc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyMl0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sIHNyYywgLTB4MDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjFdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjLCAtMHgwMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyMF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDVdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMsIDB4MDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIzXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjLCAweDAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyNF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMsIDB4MDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXI1XSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfNjRdICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDFdLCBkc3QsIDB4MDApCisKKworI2RlZmluZSBQVVRfVlA4X0VQRUw0X0g0X01NSShzcmMsIGRzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMsIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIyXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjLCAtMHgwMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyMV0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDVdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMsIDB4MDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIzXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjLCAweDAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyNF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDVdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd182NF0gICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sIGRzdCwgMHgwMCkKKworCisjZGVmaW5lIFBVVF9WUDhfRVBFTDRfVjZfTU1JKHNyYywgc3JjMSwgZHN0LCBzcmNzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sIHNyYywgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjJdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFRSX1NVQlUgICAiIiNzcmMxIiwgICAgIiNzcmMiLCAgICAgICAgICIjc3Jjc3RyaWRlIiAgICAgICAgXG5cdCIgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjMSwgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyMV0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFRSX1NVQlUgICAiIiNzcmMxIiwgICAgIiNzcmMxIiwgICAgICAgICIjc3Jjc3RyaWRlIiAgICAgICAgXG5cdCIgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjMSwgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyMF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDVdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUFRSX0FERFUgICAiIiNzcmMxIiwgICAgIiNzcmMiLCAgICAgICAgICIjc3Jjc3RyaWRlIiAgICAgICAgXG5cdCIgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjMSwgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyM10gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIiI3NyYzEiLCAgICAiI3NyYzEiLCAgICAgICAgIiNzcmNzdHJpZGUiICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXI0XSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIiI3NyYzEiLCAgICAiI3NyYzEiLCAgICAgICAgIiNzcmNzdHJpZGUiICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXI1XSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzY0XSAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHNyYWggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfU1dDMSglW2Z0bXAxXSwgZHN0LCAweDAwKQorCisKKyNkZWZpbmUgUFVUX1ZQOF9FUEVMNF9WNF9NTUkoc3JjLCBzcmMxLCBkc3QsIHNyY3N0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyMl0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfU1VCVSAgICIiI3NyYzEiLCAgICAiI3NyYyIsICAgICAgICAgIiNzcmNzdHJpZGUiICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIxXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIiI3NyYzEiLCAgICAiI3NyYyIsICAgICAgICAgIiNzcmNzdHJpZGUiICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIzXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9BRERVICAgIiIjc3JjMSIsICAgICIjc3JjMSIsICAgICAgICAiI3NyY3N0cmlkZSIgICAgICAgIFxuXHQiICAgXAorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sIHNyYzEsIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjRdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA1XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmZfcHdfNjRdICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDFdLCBkc3QsIDB4MDApCisKKworI2RlZmluZSBQVVRfVlA4X0VQRUw4X0g2X01NSShzcmMsIGRzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMsIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyMl0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZpbHRlcjJdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMsIC0weDAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyMV0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZpbHRlcjFdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sIHNyYywgLTB4MDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIwXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmlsdGVyMF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDddLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgc3JjLCAweDAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjNdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmaWx0ZXIzXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgc3JjLCAweDAyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjRdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmaWx0ZXI0XSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMsIDB4MDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyNV0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZpbHRlcjVdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd182NF0gICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNjRdICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgZHN0LCAweDAwKQorCisKKyNkZWZpbmUgUFVUX1ZQOF9FUEVMOF9INF9NTUkoc3JjLCBkc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgc3JjLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjJdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmaWx0ZXIyXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgc3JjLCAtMHgwMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjFdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmaWx0ZXIxXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wN10sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDhdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMsIDB4MDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyM10gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDZdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZpbHRlcjNdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMsIDB4MDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyNF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZpbHRlcjRdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd182NF0gICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNjRdICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgZHN0LCAweDAwKQorCisKKyNkZWZpbmUgUFVUX1ZQOF9FUEVMOF9WNl9NTUkoc3JjLCBzcmMxLCBkc3QsIHNyY3N0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgc3JjLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjJdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmaWx0ZXIyXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9TVUJVICAgIiIjc3JjMSIsICAgICIjc3JjIiwgICAgICAgICAiI3NyY3N0cmlkZSIgICAgICAgIFxuXHQiICAgXAorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sIHNyYzEsIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIxXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmlsdGVyMV0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9TVUJVICAgIiIjc3JjMSIsICAgICIjc3JjMSIsICAgICAgICAiI3NyY3N0cmlkZSIgICAgICAgIFxuXHQiICAgXAorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sIHNyYzEsIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIwXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmlsdGVyMF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDddLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9BRERVICAgIiIjc3JjMSIsICAgICIjc3JjIiwgICAgICAgICAiI3NyY3N0cmlkZSIgICAgICAgIFxuXHQiICAgXAorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sIHNyYzEsIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIzXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wM10sICAgICAgICVbZmlsdGVyM10gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIiI3NyYzEiLCAgICAiI3NyYzEiLCAgICAgICAgIiNzcmNzdHJpZGUiICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyNF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZpbHRlcjRdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIiI3NyYzEiLCAgICAiI3NyYzEiLCAgICAgICAgIiNzcmNzdHJpZGUiICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyNV0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZpbHRlcjVdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd182NF0gICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNjRdICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgZHN0LCAweDAwKQorCisKKyNkZWZpbmUgUFVUX1ZQOF9FUEVMOF9WNF9NTUkoc3JjLCBzcmMxLCBkc3QsIHNyY3N0cmlkZSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgc3JjLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZpbHRlcjJdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAzXSwgICAgICAgJVtmaWx0ZXIyXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9TVUJVICAgIiIjc3JjMSIsICAgICIjc3JjIiwgICAgICAgICAiI3NyY3N0cmlkZSIgICAgICAgIFxuXHQiICAgXAorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sIHNyYzEsIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIxXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZmlsdGVyMV0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDddLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFBUUl9BRERVICAgIiIjc3JjMSIsICAgICIjc3JjIiwgICAgICAgICAiI3NyY3N0cmlkZSIgICAgICAgIFxuXHQiICAgXAorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sIHNyYzEsIDB4MDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXAyXSwgICAgICAgJVtmaWx0ZXIzXSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wM10sICAgICAgICVbZmlsdGVyM10gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIiI3NyYzEiLCAgICAiI3NyYzEiLCAgICAgICAgIiNzcmNzdHJpZGUiICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZmlsdGVyNF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZpbHRlcjRdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHN1YnNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzdWJzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDhdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd182NF0gICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNjRdICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDZdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgZHN0LCAweDAwKQorCisKKyNkZWZpbmUgUFVUX1ZQOF9CSUxJTkVBUjhfSF9NTUkoc3JjLCBkc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgc3JjLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDVdLCAgICVbZnRtcDJdLCAgICAgICAlW2FdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAzXSwgICAgICAgJVthXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAxXSwgc3JjLCAweDAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wM10sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2JdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtiXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZmZfcHdfNF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICAgICAlW2ZmX3B3XzRdICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sIGRzdCwgMHgwMCkKKworCisjZGVmaW5lIFBVVF9WUDhfQklMSU5FQVI0X0hfTU1JKHNyYywgZHN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxXQzEoJVtmdG1wMV0sIHNyYywgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDJdLCAgICAgICAlW2FdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMsIDB4MDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtiXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd180XSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sIGRzdCwgMHgwMCkKKworCisjZGVmaW5lIFBVVF9WUDhfQklMSU5FQVI4X1ZfTU1JKHNyYywgc3JjMSwgZHN0LCBzc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sIHNyYywgMHgwMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wMl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDNdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXAyXSwgICAgICAgJVtjXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wM10sICAgICAgICVbY10gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIiI3NyYzEiLCAgICAiI3NyYyIsICAgICAgICAgIiNzc3RyaWRlIiAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMREMxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgICAgICVbZF0gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwbXVsbGggICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2RdICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmZl9wd180XSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZmZfcHdfNF0gICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHNyYWggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgZHN0LCAweDAwKQorCisKKyNkZWZpbmUgUFVUX1ZQOF9CSUxJTkVBUjRfVl9NTUkoc3JjLCBzcmMxLCBkc3QsIHNzdHJpZGUpICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1NSV9VTFdDMSglW2Z0bXAxXSwgc3JjLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBtdWxsaCAgICAgJVtmdG1wM10sICAgJVtmdG1wMl0sICAgICAgICVbY10gICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQVFJfQUREVSAgICIiI3NyYzEiLCAgICAiI3NyYyIsICAgICAgICAgIiNzc3RyaWRlIiAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1VMV0MxKCVbZnRtcDFdLCBzcmMxLCAweDAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDJdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicG11bGxoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtkXSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBhZGRzaCAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmZl9wd180XSAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzcmFoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgICAgICVbZnRtcDRdICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sIGRzdCwgMHgwMCkKKworCitERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIGNvbnN0IHVpbnQ2NF90LCBmb3VydGFwX3N1YnBlbF9maWx0ZXJzWzddWzZdKSA9IHsKKyAgIHsweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwNjAwMDYwMDA2MDAwNiwgMHgwMDdiMDA3YjAwN2IwMDdiLAorICAgIDB4MDAwYzAwMGMwMDBjMDAwYywgMHgwMDAxMDAwMTAwMDEwMDAxLCAweDAwMDAwMDAwMDAwMDAwMDB9LAorCisgICB7MHgwMDAyMDAwMjAwMDIwMDAyLCAweDAwMGIwMDBiMDAwYjAwMGIsIDB4MDA2YzAwNmMwMDZjMDA2YywKKyAgICAweDAwMjQwMDI0MDAyNDAwMjQsIDB4MDAwODAwMDgwMDA4MDAwOCwgMHgwMDAxMDAwMTAwMDEwMDAxfSwKKworICAgezB4MDAwMDAwMDAwMDAwMDAwMCwgMHgwMDA5MDAwOTAwMDkwMDA5LCAweDAwNWQwMDVkMDA1ZDAwNWQsCisgICAgMHgwMDMyMDAzMjAwMzIwMDMyLCAweDAwMDYwMDA2MDAwNjAwMDYsIDB4MDAwMDAwMDAwMDAwMDAwMH0sCisKKyAgIHsweDAwMDMwMDAzMDAwMzAwMDMsIDB4MDAxMDAwMTAwMDEwMDAxMCwgMHgwMDRkMDA0ZDAwNGQwMDRkLAorICAgIDB4MDA0ZDAwNGQwMDRkMDA0ZCwgMHgwMDEwMDAxMDAwMTAwMDEwLCAweDAwMDMwMDAzMDAwMzAwMDN9LAorCisgICB7MHgwMDAwMDAwMDAwMDAwMDAwLCAweDAwMDYwMDA2MDAwNjAwMDYsIDB4MDAzMjAwMzIwMDMyMDAzMiwKKyAgICAweDAwNWQwMDVkMDA1ZDAwNWQsIDB4MDAwOTAwMDkwMDA5MDAwOSwgMHgwMDAwMDAwMDAwMDAwMDAwfSwKKworICAgezB4MDAwMTAwMDEwMDAxMDAwMSwgMHgwMDA4MDAwODAwMDgwMDA4LCAweDAwMjQwMDI0MDAyNDAwMjQsCisgICAgMHgwMDZjMDA2YzAwNmMwMDZjLCAweDAwMGIwMDBiMDAwYjAwMGIsIDB4MDAwMjAwMDIwMDAyMDAwMn0sCisKKyAgIHsweDAwMDAwMDAwMDAwMDAwMDAsIDB4MDAwMTAwMDEwMDAxMDAwMSwgMHgwMDBjMDAwYzAwMGMwMDBjLAorICAgIDB4MDA3YjAwN2IwMDdiMDA3YiwgMHgwMDA2MDAwNjAwMDYwMDA2LCAweDAwMDAwMDAwMDAwMDAwMDB9Cit9OworCisjaWYgMAorI2RlZmluZSBGSUxURVJfNlRBUChzcmMsIEYsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNtWyhGWzJdICogc3JjW3ggKyAwICogc3RyaWRlXSAtIEZbMV0gKiBzcmNbeCAtIDEgKiBzdHJpZGVdICsgICAgICAgICAgICAgXAorICAgICAgICBGWzBdICogc3JjW3ggLSAyICogc3RyaWRlXSArIEZbM10gKiBzcmNbeCArIDEgKiBzdHJpZGVdIC0gICAgICAgICAgICAgXAorICAgICAgICBGWzRdICogc3JjW3ggKyAyICogc3RyaWRlXSArIEZbNV0gKiBzcmNbeCArIDMgKiBzdHJpZGVdICsgNjQpID4+IDddCisKKyNkZWZpbmUgRklMVEVSXzRUQVAoc3JjLCBGLCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjbVsoRlsyXSAqIHNyY1t4ICsgMCAqIHN0cmlkZV0gLSBGWzFdICogc3JjW3ggLSAxICogc3RyaWRlXSArICAgICAgICAgICAgIFwKKyAgICAgICAgRlszXSAqIHNyY1t4ICsgMSAqIHN0cmlkZV0gLSBGWzRdICogc3JjW3ggKyAyICogc3RyaWRlXSArIDY0KSA+PiA3XQorCitzdGF0aWMgY29uc3QgdWludDhfdCBzdWJwZWxfZmlsdGVyc1s3XVs2XSA9IHsKKyAgICB7IDAsICA2LCAxMjMsICAxMiwgIDEsIDAgfSwKKyAgICB7IDIsIDExLCAxMDgsICAzNiwgIDgsIDEgfSwKKyAgICB7IDAsICA5LCAgOTMsICA1MCwgIDYsIDAgfSwKKyAgICB7IDMsIDE2LCAgNzcsICA3NywgMTYsIDMgfSwKKyAgICB7IDAsICA2LCAgNTAsICA5MywgIDksIDAgfSwKKyAgICB7IDEsICA4LCAgMzYsIDEwOCwgMTEsIDIgfSwKKyAgICB7IDAsICAxLCAgMTIsIDEyMywgIDYsIDAgfSwKK307CisKKyNkZWZpbmUgTVVMXzIwMDkxKGEpICgoKChhKSAqIDIwMDkxKSA+PiAxNikgKyAoYSkpCisjZGVmaW5lIE1VTF8zNTQ2OChhKSAgKCgoYSkgKiAzNTQ2OCkgPj4gMTYpCisjZW5kaWYKKworI2RlZmluZSBjbGlwX2ludDgobikgKGNtWyhuKSArIDB4ODBdIC0gMHg4MCkKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgdnA4X2ZpbHRlcl9jb21tb25faXM0dGFwKHVpbnQ4X3QgKnAsCisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGF2X3VudXNlZCBwMSA9IHBbLTIgKiBzdHJpZGVdOworICAgIGludCBhdl91bnVzZWQgcDAgPSBwWy0xICogc3RyaWRlXTsKKyAgICBpbnQgYXZfdW51c2VkIHEwID0gcFsgMCAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBxMSA9IHBbIDEgKiBzdHJpZGVdOworICAgIGludCBhLCBmMSwgZjI7CisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKworICAgIGEgPSAzICogKHEwIC0gcDApOworICAgIGEgKz0gY2xpcF9pbnQ4KHAxIC0gcTEpOworICAgIGEgPSBjbGlwX2ludDgoYSk7CisKKyAgICAvLyBXZSBkZXZpYXRlIGZyb20gdGhlIHNwZWMgaGVyZSB3aXRoIGMoYSszKSA+PiAzCisgICAgLy8gc2luY2UgdGhhdCdzIHdoYXQgbGlidnB4IGRvZXMuCisgICAgZjEgPSBGRk1JTihhICsgNCwgMTI3KSA+PiAzOworICAgIGYyID0gRkZNSU4oYSArIDMsIDEyNykgPj4gMzsKKworICAgIC8vIERlc3BpdGUgd2hhdCB0aGUgc3BlYyBzYXlzLCB3ZSBkbyBuZWVkIHRvIGNsYW1wIGhlcmUgdG8KKyAgICAvLyBiZSBiaXRleGFjdCB3aXRoIGxpYnZweC4KKyAgICBwWy0xICogc3RyaWRlXSA9IGNtW3AwICsgZjJdOworICAgIHBbIDAgKiBzdHJpZGVdID0gY21bcTAgLSBmMV07Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgdnA4X2ZpbHRlcl9jb21tb25faXNub3Q0dGFwKHVpbnQ4X3QgKnAsCisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGF2X3VudXNlZCBwMSA9IHBbLTIgKiBzdHJpZGVdOworICAgIGludCBhdl91bnVzZWQgcDAgPSBwWy0xICogc3RyaWRlXTsKKyAgICBpbnQgYXZfdW51c2VkIHEwID0gcFsgMCAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBxMSA9IHBbIDEgKiBzdHJpZGVdOworICAgIGludCBhLCBmMSwgZjI7CisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKworICAgIGEgPSAzICogKHEwIC0gcDApOworICAgIGEgPSBjbGlwX2ludDgoYSk7CisKKyAgICAvLyBXZSBkZXZpYXRlIGZyb20gdGhlIHNwZWMgaGVyZSB3aXRoIGMoYSszKSA+PiAzCisgICAgLy8gc2luY2UgdGhhdCdzIHdoYXQgbGlidnB4IGRvZXMuCisgICAgZjEgPSBGRk1JTihhICsgNCwgMTI3KSA+PiAzOworICAgIGYyID0gRkZNSU4oYSArIDMsIDEyNykgPj4gMzsKKworICAgIC8vIERlc3BpdGUgd2hhdCB0aGUgc3BlYyBzYXlzLCB3ZSBkbyBuZWVkIHRvIGNsYW1wIGhlcmUgdG8KKyAgICAvLyBiZSBiaXRleGFjdCB3aXRoIGxpYnZweC4KKyAgICBwWy0xICogc3RyaWRlXSA9IGNtW3AwICsgZjJdOworICAgIHBbIDAgKiBzdHJpZGVdID0gY21bcTAgLSBmMV07CisgICAgYSAgICAgICAgICAgICAgPSAoZjEgKyAxKSA+PiAxOworICAgIHBbLTIgKiBzdHJpZGVdID0gY21bcDEgKyBhXTsKKyAgICBwWyAxICogc3RyaWRlXSA9IGNtW3ExIC0gYV07Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB2cDhfc2ltcGxlX2xpbWl0KHVpbnQ4X3QgKnAsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgIGludCBmbGltKQoreworICAgIGludCBhdl91bnVzZWQgcDEgPSBwWy0yICogc3RyaWRlXTsKKyAgICBpbnQgYXZfdW51c2VkIHAwID0gcFstMSAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBxMCA9IHBbIDAgKiBzdHJpZGVdOworICAgIGludCBhdl91bnVzZWQgcTEgPSBwWyAxICogc3RyaWRlXTsKKworICAgIHJldHVybiAyICogRkZBQlMocDAgLSBxMCkgKyAoRkZBQlMocDEgLSBxMSkgPj4gMSkgPD0gZmxpbTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGhldih1aW50OF90ICpwLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgdGhyZXNoKQoreworICAgIGludCBhdl91bnVzZWQgcDEgPSBwWy0yICogc3RyaWRlXTsKKyAgICBpbnQgYXZfdW51c2VkIHAwID0gcFstMSAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBxMCA9IHBbIDAgKiBzdHJpZGVdOworICAgIGludCBhdl91bnVzZWQgcTEgPSBwWyAxICogc3RyaWRlXTsKKworICAgIHJldHVybiBGRkFCUyhwMSAtIHAwKSA+IHRocmVzaCB8fCBGRkFCUyhxMSAtIHEwKSA+IHRocmVzaDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmaWx0ZXJfbWJlZGdlKHVpbnQ4X3QgKnAsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50IGEwLCBhMSwgYTIsIHc7CisgICAgY29uc3QgdWludDhfdCAqY20gPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKworICAgIGludCBhdl91bnVzZWQgcDIgPSBwWy0zICogc3RyaWRlXTsKKyAgICBpbnQgYXZfdW51c2VkIHAxID0gcFstMiAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBwMCA9IHBbLTEgKiBzdHJpZGVdOworICAgIGludCBhdl91bnVzZWQgcTAgPSBwWyAwICogc3RyaWRlXTsKKyAgICBpbnQgYXZfdW51c2VkIHExID0gcFsgMSAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBxMiA9IHBbIDIgKiBzdHJpZGVdOworCisgICAgdyA9IGNsaXBfaW50OChwMSAtIHExKTsKKyAgICB3ID0gY2xpcF9pbnQ4KHcgKyAzICogKHEwIC0gcDApKTsKKworICAgIGEwID0gKDI3ICogdyArIDYzKSA+PiA3OworICAgIGExID0gKDE4ICogdyArIDYzKSA+PiA3OworICAgIGEyID0gICg5ICogdyArIDYzKSA+PiA3OworCisgICAgcFstMyAqIHN0cmlkZV0gPSBjbVtwMiArIGEyXTsKKyAgICBwWy0yICogc3RyaWRlXSA9IGNtW3AxICsgYTFdOworICAgIHBbLTEgKiBzdHJpZGVdID0gY21bcDAgKyBhMF07CisgICAgcFsgMCAqIHN0cmlkZV0gPSBjbVtxMCAtIGEwXTsKKyAgICBwWyAxICogc3RyaWRlXSA9IGNtW3ExIC0gYTFdOworICAgIHBbIDIgKiBzdHJpZGVdID0gY21bcTIgLSBhMl07Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB2cDhfbm9ybWFsX2xpbWl0KHVpbnQ4X3QgKnAsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgIGludCBFLCBpbnQgSSkKK3sKKyAgICBpbnQgYXZfdW51c2VkIHAzID0gcFstNCAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBwMiA9IHBbLTMgKiBzdHJpZGVdOworICAgIGludCBhdl91bnVzZWQgcDEgPSBwWy0yICogc3RyaWRlXTsKKyAgICBpbnQgYXZfdW51c2VkIHAwID0gcFstMSAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBxMCA9IHBbIDAgKiBzdHJpZGVdOworICAgIGludCBhdl91bnVzZWQgcTEgPSBwWyAxICogc3RyaWRlXTsKKyAgICBpbnQgYXZfdW51c2VkIHEyID0gcFsgMiAqIHN0cmlkZV07CisgICAgaW50IGF2X3VudXNlZCBxMyA9IHBbIDMgKiBzdHJpZGVdOworCisgICAgcmV0dXJuIHZwOF9zaW1wbGVfbGltaXQocCwgc3RyaWRlLCBFKSAmJgorICAgICAgICAgICBGRkFCUyhwMyAtIHAyKSA8PSBJICYmIEZGQUJTKHAyIC0gcDEpIDw9IEkgJiYKKyAgICAgICAgICAgRkZBQlMocDEgLSBwMCkgPD0gSSAmJiBGRkFCUyhxMyAtIHEyKSA8PSBJICYmCisgICAgICAgICAgIEZGQUJTKHEyIC0gcTEpIDw9IEkgJiYgRkZBQlMocTEgLSBxMCkgPD0gSTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB2cDhfdl9sb29wX2ZpbHRlcjhfbW1pKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBpZiAodnA4X25vcm1hbF9saW1pdChkc3QgKyBpICogMSwgc3RyaWRlLCBmbGltX0UsIGZsaW1fSSkpIHsKKyAgICAgICAgICAgIGlmIChoZXYoZHN0ICsgaSAqIDEsIHN0cmlkZSwgaGV2X3RocmVzaCkpCisgICAgICAgICAgICAgICAgdnA4X2ZpbHRlcl9jb21tb25faXM0dGFwKGRzdCArIGkgKiAxLCBzdHJpZGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZpbHRlcl9tYmVkZ2UoZHN0ICsgaSAqIDEsIHN0cmlkZSk7CisgICAgICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB2cDhfdl9sb29wX2ZpbHRlcjhfaW5uZXJfbW1pKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBpZiAodnA4X25vcm1hbF9saW1pdChkc3QgKyBpICogMSwgc3RyaWRlLCBmbGltX0UsIGZsaW1fSSkpIHsKKyAgICAgICAgICAgIGludCBodiA9IGhldihkc3QgKyBpICogMSwgc3RyaWRlLCBoZXZfdGhyZXNoKTsKKyAgICAgICAgICAgIGlmIChodikKKyAgICAgICAgICAgICAgICB2cDhfZmlsdGVyX2NvbW1vbl9pczR0YXAoZHN0ICsgaSAqIDEsIHN0cmlkZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdnA4X2ZpbHRlcl9jb21tb25faXNub3Q0dGFwKGRzdCArIGkgKiAxLCBzdHJpZGUpOworICAgICAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgdnA4X2hfbG9vcF9maWx0ZXI4X21taSh1aW50OF90ICpkc3QsCisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgaWYgKHZwOF9ub3JtYWxfbGltaXQoZHN0ICsgaSAqIHN0cmlkZSwgMSwgZmxpbV9FLCBmbGltX0kpKSB7CisgICAgICAgICAgICBpZiAoaGV2KGRzdCArIGkgKiBzdHJpZGUsIDEsIGhldl90aHJlc2gpKQorICAgICAgICAgICAgICAgIHZwOF9maWx0ZXJfY29tbW9uX2lzNHRhcChkc3QgKyBpICogc3RyaWRlLCAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbWJlZGdlKGRzdCArIGkgKiBzdHJpZGUsIDEpOworICAgICAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgdnA4X2hfbG9vcF9maWx0ZXI4X2lubmVyX21taSh1aW50OF90ICpkc3QsCisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgaWYgKHZwOF9ub3JtYWxfbGltaXQoZHN0ICsgaSAqIHN0cmlkZSwgMSwgZmxpbV9FLCBmbGltX0kpKSB7CisgICAgICAgICAgICBpbnQgaHYgPSBoZXYoZHN0ICsgaSAqIHN0cmlkZSwgMSwgaGV2X3RocmVzaCk7CisgICAgICAgICAgICBpZiAoaHYpCisgICAgICAgICAgICAgICAgdnA4X2ZpbHRlcl9jb21tb25faXM0dGFwKGRzdCArIGkgKiBzdHJpZGUsIDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHZwOF9maWx0ZXJfY29tbW9uX2lzbm90NHRhcChkc3QgKyBpICogc3RyaWRlLCAxKTsKKyAgICAgICAgfQorfQorCit2b2lkIGZmX3ZwOF9sdW1hX2RjX3dodF9tbWkoaW50MTZfdCBibG9ja1s0XVs0XVsxNl0sIGludDE2X3QgZGNbMTZdKQoreworI2lmIDEKKyAgICBkb3VibGUgZnRtcFs4XTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICBNTUlfTERDMSglW2Z0bXAwXSwgJVtkY10sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW2RjXSwgMHgwOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbZGNdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtkY10sIDB4MTgpCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDRdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDVdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAzXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDZdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDddLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAyXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDBdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkc2ggICAgICVbZnRtcDFdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDJdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA2XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3Vic2ggICAgICVbZnRtcDNdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2RjXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMV0sICVbZGNdLCAweDA4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAyXSwgJVtkY10sIDB4MTApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDNdLCAlW2RjXSwgMHgxOCkKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pCisgICAgICAgIDogW2RjXSJyIigodWludDhfdCopZGMpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworCisgICAgYmxvY2tbMF1bMF1bMF0gPSAoZGNbMF0gKyBkY1szXSArIDMgKyBkY1sxXSArIGRjWzJdKSA+PiAzOworICAgIGJsb2NrWzBdWzFdWzBdID0gKGRjWzBdIC0gZGNbM10gKyAzICsgZGNbMV0gLSBkY1syXSkgPj4gMzsKKyAgICBibG9ja1swXVsyXVswXSA9IChkY1swXSArIGRjWzNdICsgMyAtIGRjWzFdIC0gZGNbMl0pID4+IDM7CisgICAgYmxvY2tbMF1bM11bMF0gPSAoZGNbMF0gLSBkY1szXSArIDMgLSBkY1sxXSArIGRjWzJdKSA+PiAzOworCisgICAgYmxvY2tbMV1bMF1bMF0gPSAoZGNbNF0gKyBkY1s3XSArIDMgKyBkY1s1XSArIGRjWzZdKSA+PiAzOworICAgIGJsb2NrWzFdWzFdWzBdID0gKGRjWzRdIC0gZGNbN10gKyAzICsgZGNbNV0gLSBkY1s2XSkgPj4gMzsKKyAgICBibG9ja1sxXVsyXVswXSA9IChkY1s0XSArIGRjWzddICsgMyAtIGRjWzVdIC0gZGNbNl0pID4+IDM7CisgICAgYmxvY2tbMV1bM11bMF0gPSAoZGNbNF0gLSBkY1s3XSArIDMgLSBkY1s1XSArIGRjWzZdKSA+PiAzOworCisgICAgYmxvY2tbMl1bMF1bMF0gPSAoZGNbOF0gKyBkY1sxMV0gKyAzICsgZGNbOV0gKyBkY1sxMF0pID4+IDM7CisgICAgYmxvY2tbMl1bMV1bMF0gPSAoZGNbOF0gLSBkY1sxMV0gKyAzICsgZGNbOV0gLSBkY1sxMF0pID4+IDM7CisgICAgYmxvY2tbMl1bMl1bMF0gPSAoZGNbOF0gKyBkY1sxMV0gKyAzIC0gZGNbOV0gLSBkY1sxMF0pID4+IDM7CisgICAgYmxvY2tbMl1bM11bMF0gPSAoZGNbOF0gLSBkY1sxMV0gKyAzIC0gZGNbOV0gKyBkY1sxMF0pID4+IDM7CisKKyAgICBibG9ja1szXVswXVswXSA9IChkY1sxMl0gKyBkY1sxNV0gKyAzICsgZGNbMTNdICsgZGNbMTRdKSA+PiAzOworICAgIGJsb2NrWzNdWzFdWzBdID0gKGRjWzEyXSAtIGRjWzE1XSArIDMgKyBkY1sxM10gLSBkY1sxNF0pID4+IDM7CisgICAgYmxvY2tbM11bMl1bMF0gPSAoZGNbMTJdICsgZGNbMTVdICsgMyAtIGRjWzEzXSAtIGRjWzE0XSkgPj4gMzsKKyAgICBibG9ja1szXVszXVswXSA9IChkY1sxMl0gLSBkY1sxNV0gKyAzIC0gZGNbMTNdICsgZGNbMTRdKSA+PiAzOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2RjXSwgMHgwMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbZGNdLCAweDA4KQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtkY10sIDB4MTApCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2RjXSwgMHgxOCkKKyAgICAgICAgOiBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbZnRtcDBdIj0mZiIoZnRtcFswXSkKKyAgICAgICAgOiBbZGNdInIiKCh1aW50OF90ICopZGMpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBpbnQgdDAwLCB0MDEsIHQwMiwgdDAzLCB0MTAsIHQxMSwgdDEyLCB0MTMsIHQyMCwgdDIxLCB0MjIsIHQyMywgdDMwLCB0MzEsIHQzMiwgdDMzOworCisgICAgdDAwID0gZGNbMF0gKyBkY1sxMl07CisgICAgdDEwID0gZGNbMV0gKyBkY1sxM107CisgICAgdDIwID0gZGNbMl0gKyBkY1sxNF07CisgICAgdDMwID0gZGNbM10gKyBkY1sxNV07CisKKyAgICB0MDMgPSBkY1swXSAtIGRjWzEyXTsKKyAgICB0MTMgPSBkY1sxXSAtIGRjWzEzXTsKKyAgICB0MjMgPSBkY1syXSAtIGRjWzE0XTsKKyAgICB0MzMgPSBkY1szXSAtIGRjWzE1XTsKKworICAgIHQwMSA9IGRjWzRdICsgZGNbIDhdOworICAgIHQxMSA9IGRjWzVdICsgZGNbIDldOworICAgIHQyMSA9IGRjWzZdICsgZGNbMTBdOworICAgIHQzMSA9IGRjWzddICsgZGNbMTFdOworCisgICAgdDAyID0gZGNbNF0gLSBkY1sgOF07CisgICAgdDEyID0gZGNbNV0gLSBkY1sgOV07CisgICAgdDIyID0gZGNbNl0gLSBkY1sxMF07CisgICAgdDMyID0gZGNbN10gLSBkY1sxMV07CisKKyAgICBkY1sgMF0gPSB0MDAgKyB0MDE7CisgICAgZGNbIDFdID0gdDEwICsgdDExOworICAgIGRjWyAyXSA9IHQyMCArIHQyMTsKKyAgICBkY1sgM10gPSB0MzAgKyB0MzE7CisKKyAgICBkY1sgNF0gPSB0MDMgKyB0MDI7CisgICAgZGNbIDVdID0gdDEzICsgdDEyOworICAgIGRjWyA2XSA9IHQyMyArIHQyMjsKKyAgICBkY1sgN10gPSB0MzMgKyB0MzI7CisKKyAgICBkY1sgOF0gPSB0MDAgLSB0MDE7CisgICAgZGNbIDldID0gdDEwIC0gdDExOworICAgIGRjWzEwXSA9IHQyMCAtIHQyMTsKKyAgICBkY1sxMV0gPSB0MzAgLSB0MzE7CisKKyAgICBkY1sxMl0gPSB0MDMgLSB0MDI7CisgICAgZGNbMTNdID0gdDEzIC0gdDEyOworICAgIGRjWzE0XSA9IHQyMyAtIHQyMjsKKyAgICBkY1sxNV0gPSB0MzMgLSB0MzI7CisKKyAgICBibG9ja1swXVswXVswXSA9IChkY1swXSArIGRjWzNdICsgMyArIGRjWzFdICsgZGNbMl0pID4+IDM7CisgICAgYmxvY2tbMF1bMV1bMF0gPSAoZGNbMF0gLSBkY1szXSArIDMgKyBkY1sxXSAtIGRjWzJdKSA+PiAzOworICAgIGJsb2NrWzBdWzJdWzBdID0gKGRjWzBdICsgZGNbM10gKyAzIC0gZGNbMV0gLSBkY1syXSkgPj4gMzsKKyAgICBibG9ja1swXVszXVswXSA9IChkY1swXSAtIGRjWzNdICsgMyAtIGRjWzFdICsgZGNbMl0pID4+IDM7CisKKyAgICBibG9ja1sxXVswXVswXSA9IChkY1s0XSArIGRjWzddICsgMyArIGRjWzVdICsgZGNbNl0pID4+IDM7CisgICAgYmxvY2tbMV1bMV1bMF0gPSAoZGNbNF0gLSBkY1s3XSArIDMgKyBkY1s1XSAtIGRjWzZdKSA+PiAzOworICAgIGJsb2NrWzFdWzJdWzBdID0gKGRjWzRdICsgZGNbN10gKyAzIC0gZGNbNV0gLSBkY1s2XSkgPj4gMzsKKyAgICBibG9ja1sxXVszXVswXSA9IChkY1s0XSAtIGRjWzddICsgMyAtIGRjWzVdICsgZGNbNl0pID4+IDM7CisKKyAgICBibG9ja1syXVswXVswXSA9IChkY1s4XSArIGRjWzExXSArIDMgKyBkY1s5XSArIGRjWzEwXSkgPj4gMzsKKyAgICBibG9ja1syXVsxXVswXSA9IChkY1s4XSAtIGRjWzExXSArIDMgKyBkY1s5XSAtIGRjWzEwXSkgPj4gMzsKKyAgICBibG9ja1syXVsyXVswXSA9IChkY1s4XSArIGRjWzExXSArIDMgLSBkY1s5XSAtIGRjWzEwXSkgPj4gMzsKKyAgICBibG9ja1syXVszXVswXSA9IChkY1s4XSAtIGRjWzExXSArIDMgLSBkY1s5XSArIGRjWzEwXSkgPj4gMzsKKworICAgIGJsb2NrWzNdWzBdWzBdID0gKGRjWzEyXSArIGRjWzE1XSArIDMgKyBkY1sxM10gKyBkY1sxNF0pID4+IDM7CisgICAgYmxvY2tbM11bMV1bMF0gPSAoZGNbMTJdIC0gZGNbMTVdICsgMyArIGRjWzEzXSAtIGRjWzE0XSkgPj4gMzsKKyAgICBibG9ja1szXVsyXVswXSA9IChkY1sxMl0gKyBkY1sxNV0gKyAzIC0gZGNbMTNdIC0gZGNbMTRdKSA+PiAzOworICAgIGJsb2NrWzNdWzNdWzBdID0gKGRjWzEyXSAtIGRjWzE1XSArIDMgLSBkY1sxM10gKyBkY1sxNF0pID4+IDM7CisKKyAgICBBVl9aRVJPNjQoZGMgKyAwKTsKKyAgICBBVl9aRVJPNjQoZGMgKyA0KTsKKyAgICBBVl9aRVJPNjQoZGMgKyA4KTsKKyAgICBBVl9aRVJPNjQoZGMgKyAxMik7CisjZW5kaWYKK30KKwordm9pZCBmZl92cDhfbHVtYV9kY193aHRfZGNfbW1pKGludDE2X3QgYmxvY2tbNF1bNF1bMTZdLCBpbnQxNl90IGRjWzE2XSkKK3sKKyAgICBpbnQgdmFsID0gKGRjWzBdICsgMykgPj4gMzsKKworICAgIGRjWzBdID0gMDsKKworICAgIGJsb2NrWzBdWzBdWzBdID0gdmFsOworICAgIGJsb2NrWzBdWzFdWzBdID0gdmFsOworICAgIGJsb2NrWzBdWzJdWzBdID0gdmFsOworICAgIGJsb2NrWzBdWzNdWzBdID0gdmFsOworICAgIGJsb2NrWzFdWzBdWzBdID0gdmFsOworICAgIGJsb2NrWzFdWzFdWzBdID0gdmFsOworICAgIGJsb2NrWzFdWzJdWzBdID0gdmFsOworICAgIGJsb2NrWzFdWzNdWzBdID0gdmFsOworICAgIGJsb2NrWzJdWzBdWzBdID0gdmFsOworICAgIGJsb2NrWzJdWzFdWzBdID0gdmFsOworICAgIGJsb2NrWzJdWzJdWzBdID0gdmFsOworICAgIGJsb2NrWzJdWzNdWzBdID0gdmFsOworICAgIGJsb2NrWzNdWzBdWzBdID0gdmFsOworICAgIGJsb2NrWzNdWzFdWzBdID0gdmFsOworICAgIGJsb2NrWzNdWzJdWzBdID0gdmFsOworICAgIGJsb2NrWzNdWzNdWzBdID0gdmFsOworfQorCit2b2lkIGZmX3ZwOF9pZGN0X2FkZF9tbWkodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyNpZiAxCisgICAgREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBmZl9waF80ZTdiKSA9IHsweDRlN2I0ZTdiNGU3YjRlN2JVTEx9OworICAgIERFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfcGhfMjJhMykgPSB7MHgyMmEzMjJhMzIyYTMyMmEzVUxMfTsKKyAgICBkb3VibGUgZnRtcFsxMl07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDA4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4MTApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW2Jsb2NrXSwgMHgxOCkKKworICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXAxMV0gICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIC8vIGJsb2NrWzAuLi4zXSArIGJsb2NrWzguLi4xMV0KKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8gYmxvY2tbMC4uLjNdIC0gYmxvY2tbOC4uLjExXQorICAgICAgICAicHN1YmggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAvLyBNVUxfMzU0NjgoYmxvY2tbMTIuLi4xNV0pCisgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDldLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsaGggICAgICVbZnRtcDddLCAgICVbZnRtcDldLCAgICAgICAlW2ZmX3BoXzIyYTNdICAgICAgIFxuXHQiCisgICAgICAgIC8vIE1VTF8zNTQ2OChibG9ja1s0Li4uN10pCisgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDldLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsaGggICAgICVbZnRtcDhdLCAgICVbZnRtcDldLCAgICAgICAlW2ZmX3BoXzIyYTNdICAgICAgIFxuXHQiCisgICAgICAgIC8vIE1VTF8yMDA5MShibG9ja1s0Li4uN10KKyAgICAgICAgInBtdWxoaCAgICAgJVtmdG1wOV0sICAgJVtmdG1wMl0sICAgICAgICVbZmZfcGhfNGU3Yl0gICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgICAgICVbZnRtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8gTVVMXzIwMDkxKGJsb2NrWzEyLi4uMTVdKQorICAgICAgICAicG11bGhoICAgICAlW2Z0bXAxMF0sICAlW2Z0bXA0XSwgICAgICAgJVtmZl9waF80ZTdiXSAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxMF0sICAlW2Z0bXAxMF0sICAgICAgJVtmdG1wNF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgIC8vIHRtcFswIDQgIDggMTJdCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIHRtcFsxIDUgIDkgMTNdCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIHRtcFsyIDYgMTAgMTRdCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIHRtcFszIDcgMTEgMTVdCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXA5XSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDBdLCAlW2Jsb2NrXSwgMHgxMCkKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDE4KQorCisgICAgICAgIFRSQU5TUE9TRV80SCglW2Z0bXAxXSwgJVtmdG1wMl0sICVbZnRtcDNdLCAlW2Z0bXA0XSwKKyAgICAgICAgICAgICAgICAgICAgICVbZnRtcDVdLCAlW2Z0bXA2XSwgJVtmdG1wN10sICVbZnRtcDhdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wOV0sICVbdG1wMF0sICAlW2Z0bXAwXSwgJVtmdG1wMTBdKQorCisgICAgICAgIC8vIHRbMCA0ICA4IDEyXQorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA1XSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wM10gICAgICAgICAgICBcblx0IgorICAgICAgICAvLyB0WzEgNSAgOSAxM10KKyAgICAgICAgInBzdWJoICAgICAgJVtmdG1wNl0sICAgJVtmdG1wMV0sICAgICAgICVbZnRtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8gdFsyIDYgMTAgMTRdCisgICAgICAgICJwc2xsaCAgICAgICVbZnRtcDldLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsaGggICAgICVbZnRtcDldLCAgICVbZnRtcDldLCAgICAgICAlW2ZmX3BoXzIyYTNdICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDldLCAgICAgICAlW2Z0bXA0XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbXVsaGggICAgICVbZnRtcDEwXSwgICVbZnRtcDRdLCAgICAgICAlW2ZmX3BoXzRlN2JdICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICAgICAlW2Z0bXAxMF0gICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIHRbMyA3IDExIDE1XQorICAgICAgICAicHNsbGggICAgICAlW2Z0bXA5XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMTFdICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGhoICAgICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmZl9waF8yMmEzXSAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA5XSwgICAgICAgJVtmdG1wMl0gICAgICAgICAgICBcblx0IgorICAgICAgICAicG11bGhoICAgICAlW2Z0bXAxMF0sICAlW2Z0bXAyXSwgICAgICAgJVtmZl9waF80ZTdiXSAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAgICAgJVtmdG1wMTBdICAgICAgICAgICBcblx0IgorCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDExXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2ZmX3B3XzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2ZmX3B3XzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDZdLCAgICAgICAlW2Z0bXA3XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2ZmX3B3XzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3ViaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDVdLCAgICAgICAlW2Z0bXA4XSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2ZmX3B3XzRdICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc3JhaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAxMV0gICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgVFJBTlNQT1NFXzRIKCVbZnRtcDFdLCAlW2Z0bXAyXSwgJVtmdG1wM10sICVbZnRtcDRdLAorICAgICAgICAgICAgICAgICAgICAgJVtmdG1wNV0sICVbZnRtcDZdLCAlW2Z0bXA3XSwgJVtmdG1wOF0sCisgICAgICAgICAgICAgICAgICAgICAlW2Z0bXA5XSwgJVt0bXAwXSwgICVbZnRtcDBdLCAlW2Z0bXAxMF0pCisKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wNV0sICVbZHN0MF0sIDB4MDApCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDZdLCAlW2RzdDFdLCAweDAwKQorICAgICAgICBNTUlfTFdDMSglW2Z0bXA3XSwgJVtkc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wOF0sICVbZHN0M10sIDB4MDApCisKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wNl0sICAgJVtmdG1wNl0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNl0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wN10gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wOF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDJdLCAgICVbZnRtcDJdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMV0sICVbZHN0MF0sIDB4MDApCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDJdLCAlW2RzdDFdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXAzXSwgJVtkc3QyXSwgMHgwMCkKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wNF0sICVbZHN0M10sIDB4MDApCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksICAgICAgICAgICAgW2Z0bXA5XSI9JmYiKGZ0bXBbOV0pLAorICAgICAgICAgIFtmdG1wMTBdIj0mZiIoZnRtcFsxMF0pLCAgICAgICAgICBbZnRtcDExXSI9JmYiKGZ0bXBbMTFdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fTE9XMzIKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pCisgICAgICAgIDogW2RzdDBdInIiKGRzdCksICAgICAgICAgICAgICAgICAgIFtkc3QxXSJyIihkc3Qrc3RyaWRlKSwKKyAgICAgICAgICBbZHN0Ml0iciIoZHN0KzIqc3RyaWRlKSwgICAgICAgICAgW2RzdDNdInIiKGRzdCszKnN0cmlkZSksCisgICAgICAgICAgW2Jsb2NrXSJyIihibG9jayksICAgICAgICAgICAgICAgIFtmZl9wd180XSJmIihmZl9wd180KSwKKyAgICAgICAgICBbZmZfcGhfNGU3Yl0iZiIoZmZfcGhfNGU3YiksICAgICAgW2ZmX3BoXzIyYTNdImYiKGZmX3BoXzIyYTMpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBpbnQgaSwgdDAsIHQxLCB0MiwgdDM7CisgICAgaW50MTZfdCB0bXBbMTZdOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICB0MCA9IGJsb2NrWzAgKyBpXSArIGJsb2NrWzggKyBpXTsKKyAgICAgICAgdDEgPSBibG9ja1swICsgaV0gLSBibG9ja1s4ICsgaV07CisgICAgICAgIHQyID0gTVVMXzM1NDY4KGJsb2NrWzQgKyBpXSkgLSBNVUxfMjAwOTEoYmxvY2tbMTIgKyBpXSk7CisgICAgICAgIHQzID0gTVVMXzIwMDkxKGJsb2NrWzQgKyBpXSkgKyBNVUxfMzU0NjgoYmxvY2tbMTIgKyBpXSk7CisgICAgICAgIGJsb2NrWyAwICsgaV0gPSAwOworICAgICAgICBibG9ja1sgNCArIGldID0gMDsKKyAgICAgICAgYmxvY2tbIDggKyBpXSA9IDA7CisgICAgICAgIGJsb2NrWzEyICsgaV0gPSAwOworCisgICAgICAgIHRtcFtpICogNCArIDBdID0gdDAgKyB0MzsKKyAgICAgICAgdG1wW2kgKiA0ICsgMV0gPSB0MSArIHQyOworICAgICAgICB0bXBbaSAqIDQgKyAyXSA9IHQxIC0gdDI7CisgICAgICAgIHRtcFtpICogNCArIDNdID0gdDAgLSB0MzsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHQwID0gdG1wWzAgKyBpXSArIHRtcFs4ICsgaV07CisgICAgICAgIHQxID0gdG1wWzAgKyBpXSAtIHRtcFs4ICsgaV07CisgICAgICAgIHQyID0gTVVMXzM1NDY4KHRtcFs0ICsgaV0pIC0gTVVMXzIwMDkxKHRtcFsxMiArIGldKTsKKyAgICAgICAgdDMgPSBNVUxfMjAwOTEodG1wWzQgKyBpXSkgKyBNVUxfMzU0NjgodG1wWzEyICsgaV0pOworCisgICAgICAgIGRzdFswXSA9IGF2X2NsaXBfdWludDgoZHN0WzBdICsgKCh0MCArIHQzICsgNCkgPj4gMykpOworICAgICAgICBkc3RbMV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFsxXSArICgodDEgKyB0MiArIDQpID4+IDMpKTsKKyAgICAgICAgZHN0WzJdID0gYXZfY2xpcF91aW50OChkc3RbMl0gKyAoKHQxIC0gdDIgKyA0KSA+PiAzKSk7CisgICAgICAgIGRzdFszXSA9IGF2X2NsaXBfdWludDgoZHN0WzNdICsgKCh0MCAtIHQzICsgNCkgPj4gMykpOworICAgICAgICBkc3QgICArPSBzdHJpZGU7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkX21taSh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworI2lmIDEKKyAgICBpbnQgZGMgPSAoYmxvY2tbMF0gKyA0KSA+PiAzOworICAgIGRvdWJsZSBmdG1wWzZdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworCisgICAgYmxvY2tbMF0gPSAwOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbZGNdLCAgICAgICVbZnRtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDFdLCAlW2RzdDBdLCAweDAwKQorICAgICAgICBNTUlfTFdDMSglW2Z0bXAyXSwgJVtkc3QxXSwgMHgwMCkKKyAgICAgICAgTU1JX0xXQzEoJVtmdG1wM10sICVbZHN0Ml0sIDB4MDApCisgICAgICAgIE1NSV9MV0MxKCVbZnRtcDRdLCAlW2RzdDNdLCAweDAwKQorICAgICAgICAicHNodWZoICAgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZHNoICAgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wNV0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA0XSwgICAlW2Z0bXA0XSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAxXSwgJVtkc3QwXSwgMHgwMCkKKyAgICAgICAgTU1JX1NXQzEoJVtmdG1wMl0sICVbZHN0MV0sIDB4MDApCisgICAgICAgIE1NSV9TV0MxKCVbZnRtcDNdLCAlW2RzdDJdLCAweDAwKQorICAgICAgICBNTUlfU1dDMSglW2Z0bXA0XSwgJVtkc3QzXSwgMHgwMCkKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKQorICAgICAgICA6IFtkc3QwXSJyIihkc3QpLCAgICAgICAgICAgICAgICAgICBbZHN0MV0iciIoZHN0K3N0cmlkZSksCisgICAgICAgICAgW2RzdDJdInIiKGRzdCsyKnN0cmlkZSksICAgICAgICAgIFtkc3QzXSJyIihkc3QrMypzdHJpZGUpLAorICAgICAgICAgIFtkY10iciIoZGMpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBpbnQgaSwgZGMgPSAoYmxvY2tbMF0gKyA0KSA+PiAzOworCisgICAgYmxvY2tbMF0gPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBkc3RbMF0gPSBhdl9jbGlwX3VpbnQ4KGRzdFswXSArIGRjKTsKKyAgICAgICAgZHN0WzFdID0gYXZfY2xpcF91aW50OChkc3RbMV0gKyBkYyk7CisgICAgICAgIGRzdFsyXSA9IGF2X2NsaXBfdWludDgoZHN0WzJdICsgZGMpOworICAgICAgICBkc3RbM10gPSBhdl9jbGlwX3VpbnQ4KGRzdFszXSArIGRjKTsKKyAgICAgICAgZHN0ICAgKz0gc3RyaWRlOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZDR5X21taSh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbNF1bMTZdLAorICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIGZmX3ZwOF9pZGN0X2RjX2FkZF9tbWkoZHN0ICsgIDAsIGJsb2NrWzBdLCBzdHJpZGUpOworICAgIGZmX3ZwOF9pZGN0X2RjX2FkZF9tbWkoZHN0ICsgIDQsIGJsb2NrWzFdLCBzdHJpZGUpOworICAgIGZmX3ZwOF9pZGN0X2RjX2FkZF9tbWkoZHN0ICsgIDgsIGJsb2NrWzJdLCBzdHJpZGUpOworICAgIGZmX3ZwOF9pZGN0X2RjX2FkZF9tbWkoZHN0ICsgMTIsIGJsb2NrWzNdLCBzdHJpZGUpOworfQorCit2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZDR1dl9tbWkodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzRdWzE2XSwKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBmZl92cDhfaWRjdF9kY19hZGRfbW1pKGRzdCArIHN0cmlkZSAqIDAgKyAwLCBibG9ja1swXSwgc3RyaWRlKTsKKyAgICBmZl92cDhfaWRjdF9kY19hZGRfbW1pKGRzdCArIHN0cmlkZSAqIDAgKyA0LCBibG9ja1sxXSwgc3RyaWRlKTsKKyAgICBmZl92cDhfaWRjdF9kY19hZGRfbW1pKGRzdCArIHN0cmlkZSAqIDQgKyAwLCBibG9ja1syXSwgc3RyaWRlKTsKKyAgICBmZl92cDhfaWRjdF9kY19hZGRfbW1pKGRzdCArIHN0cmlkZSAqIDQgKyA0LCBibG9ja1szXSwgc3RyaWRlKTsKK30KKworLy8gbG9vcCBmaWx0ZXIgYXBwbGllZCB0byBlZGdlcyBiZXR3ZWVuIG1hY3JvYmxvY2tzCit2b2lkIGZmX3ZwOF92X2xvb3BfZmlsdGVyMTZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW1fRSwKKyAgICAgICAgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgaWYgKHZwOF9ub3JtYWxfbGltaXQoZHN0ICsgaSAqIDEsIHN0cmlkZSwgZmxpbV9FLCBmbGltX0kpKSB7CisgICAgICAgICAgICBpZiAoaGV2KGRzdCArIGkgKiAxLCBzdHJpZGUsIGhldl90aHJlc2gpKQorICAgICAgICAgICAgICAgIHZwOF9maWx0ZXJfY29tbW9uX2lzNHRhcChkc3QgKyBpICogMSwgc3RyaWRlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmaWx0ZXJfbWJlZGdlKGRzdCArIGkgKiAxLCBzdHJpZGUpOworICAgICAgICB9Cit9CisKK3ZvaWQgZmZfdnA4X2hfbG9vcF9maWx0ZXIxNl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgZmxpbV9FLAorICAgICAgICBpbnQgZmxpbV9JLCBpbnQgaGV2X3RocmVzaCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICBpZiAodnA4X25vcm1hbF9saW1pdChkc3QgKyBpICogc3RyaWRlLCAxLCBmbGltX0UsIGZsaW1fSSkpIHsKKyAgICAgICAgICAgIGlmIChoZXYoZHN0ICsgaSAqIHN0cmlkZSwgMSwgaGV2X3RocmVzaCkpCisgICAgICAgICAgICAgICAgdnA4X2ZpbHRlcl9jb21tb25faXM0dGFwKGRzdCArIGkgKiBzdHJpZGUsIDEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZpbHRlcl9tYmVkZ2UoZHN0ICsgaSAqIHN0cmlkZSwgMSk7CisgICAgICAgIH0KK30KKwordm9pZCBmZl92cDhfdl9sb29wX2ZpbHRlcjh1dl9tbWkodWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpCit7CisgICAgdnA4X3ZfbG9vcF9maWx0ZXI4X21taShkc3RVLCBzdHJpZGUsIGZsaW1fRSwgZmxpbV9JLCBoZXZfdGhyZXNoKTsKKyAgICB2cDhfdl9sb29wX2ZpbHRlcjhfbW1pKGRzdFYsIHN0cmlkZSwgZmxpbV9FLCBmbGltX0ksIGhldl90aHJlc2gpOworfQorCit2b2lkIGZmX3ZwOF9oX2xvb3BfZmlsdGVyOHV2X21taSh1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICBpbnQgZmxpbV9FLCBpbnQgZmxpbV9JLCBpbnQgaGV2X3RocmVzaCkKK3sKKyAgICB2cDhfaF9sb29wX2ZpbHRlcjhfbW1pKGRzdFUsIHN0cmlkZSwgZmxpbV9FLCBmbGltX0ksIGhldl90aHJlc2gpOworICAgIHZwOF9oX2xvb3BfZmlsdGVyOF9tbWkoZHN0Viwgc3RyaWRlLCBmbGltX0UsIGZsaW1fSSwgaGV2X3RocmVzaCk7Cit9CisKKy8vIGxvb3AgZmlsdGVyIGFwcGxpZWQgdG8gaW5uZXIgbWFjcm9ibG9jayBlZGdlcwordm9pZCBmZl92cDhfdl9sb29wX2ZpbHRlcjE2X2lubmVyX21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGlmICh2cDhfbm9ybWFsX2xpbWl0KGRzdCArIGkgKiAxLCBzdHJpZGUsIGZsaW1fRSwgZmxpbV9JKSkgeworICAgICAgICAgICAgaW50IGh2ID0gaGV2KGRzdCArIGkgKiAxLCBzdHJpZGUsIGhldl90aHJlc2gpOworICAgICAgICAgICAgaWYgKGh2KQorICAgICAgICAgICAgICAgIHZwOF9maWx0ZXJfY29tbW9uX2lzNHRhcChkc3QgKyBpICogMSwgc3RyaWRlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2cDhfZmlsdGVyX2NvbW1vbl9pc25vdDR0YXAoZHN0ICsgaSAqIDEsIHN0cmlkZSk7CisgICAgICAgIH0KK30KKwordm9pZCBmZl92cDhfaF9sb29wX2ZpbHRlcjE2X2lubmVyX21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgIGludCBmbGltX0UsIGludCBmbGltX0ksIGludCBoZXZfdGhyZXNoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGlmICh2cDhfbm9ybWFsX2xpbWl0KGRzdCArIGkgKiBzdHJpZGUsIDEsIGZsaW1fRSwgZmxpbV9JKSkgeworICAgICAgICAgICAgaW50IGh2ID0gaGV2KGRzdCArIGkgKiBzdHJpZGUsIDEsIGhldl90aHJlc2gpOworICAgICAgICAgICAgaWYgKGh2KQorICAgICAgICAgICAgICAgIHZwOF9maWx0ZXJfY29tbW9uX2lzNHRhcChkc3QgKyBpICogc3RyaWRlLCAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB2cDhfZmlsdGVyX2NvbW1vbl9pc25vdDR0YXAoZHN0ICsgaSAqIHN0cmlkZSwgMSk7CisgICAgICAgIH0KK30KKwordm9pZCBmZl92cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lcl9tbWkodWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwgaW50IGhldl90aHJlc2gpCit7CisgICAgdnA4X3ZfbG9vcF9maWx0ZXI4X2lubmVyX21taShkc3RVLCBzdHJpZGUsIGZsaW1fRSwgZmxpbV9JLCBoZXZfdGhyZXNoKTsKKyAgICB2cDhfdl9sb29wX2ZpbHRlcjhfaW5uZXJfbW1pKGRzdFYsIHN0cmlkZSwgZmxpbV9FLCBmbGltX0ksIGhldl90aHJlc2gpOworfQorCit2b2lkIGZmX3ZwOF9oX2xvb3BfZmlsdGVyOHV2X2lubmVyX21taSh1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgZmxpbV9FLCBpbnQgZmxpbV9JLCBpbnQgaGV2X3RocmVzaCkKK3sKKyAgICB2cDhfaF9sb29wX2ZpbHRlcjhfaW5uZXJfbW1pKGRzdFUsIHN0cmlkZSwgZmxpbV9FLCBmbGltX0ksIGhldl90aHJlc2gpOworICAgIHZwOF9oX2xvb3BfZmlsdGVyOF9pbm5lcl9tbWkoZHN0Viwgc3RyaWRlLCBmbGltX0UsIGZsaW1fSSwgaGV2X3RocmVzaCk7Cit9CisKK3ZvaWQgZmZfdnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlX21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludCBmbGltKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgIGlmICh2cDhfc2ltcGxlX2xpbWl0KGRzdCArIGksIHN0cmlkZSwgZmxpbSkpCisgICAgICAgICAgICB2cDhfZmlsdGVyX2NvbW1vbl9pczR0YXAoZHN0ICsgaSwgc3RyaWRlKTsKK30KKwordm9pZCBmZl92cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGVfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW0pCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgaWYgKHZwOF9zaW1wbGVfbGltaXQoZHN0ICsgaSAqIHN0cmlkZSwgMSwgZmxpbSkpCisgICAgICAgICAgICB2cDhfZmlsdGVyX2NvbW1vbl9pczR0YXAoZHN0ICsgaSAqIHN0cmlkZSwgMSk7Cit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9waXhlbHMxNl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpCit7CisjaWYgMQorICAgIGRvdWJsZSBmdG1wWzJdOworICAgIHVpbnQ2NF90IHRtcFsyXTsKKyAgICBtaXBzX3JlZyBhZGRyWzJdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3JjXSwgICAgICAgICAlW3NyY3N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAibGRsICAgICAgICAlW3RtcDBdLCAgICAweDBmKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGRyICAgICAgICAlW3RtcDBdLCAgICAweDA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfVUxEQzEoJVtmdG1wMV0sICVbYWRkcjBdLCAweDAwKQorICAgICAgICAibGRsICAgICAgICAlW3RtcDFdLCAgICAweDBmKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGRyICAgICAgICAlW3RtcDFdLCAgICAweDA4KCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW2RzdF0sICAgICAgICAgJVtkc3RzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAic2RsICAgICAgICAlW3RtcDBdLCAgICAweDBmKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2RyICAgICAgICAlW3RtcDBdLCAgICAweDA4KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVthZGRyMV0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbYWRkcjBdLCAgICAgICAlW3NyY3N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICJzZGwgICAgICAgICVbdG1wMV0sICAgIDB4MGYoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzZHIgICAgICAgICVbdG1wMV0sICAgIDB4MDgoJVthZGRyMV0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbYWRkcjFdLCAgICAgICAlW2RzdHN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLCAgICAgICAgICAgICAgW3RtcDFdIj0mciIodG1wWzFdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbYWRkcjBdIj0mciIoYWRkclswXSksICAgICAgICAgICAgW2FkZHIxXSI9JnIiKGFkZHJbMV0pLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgW2hdIismciIoaCkKKyAgICAgICAgOiBbZHN0c3RyaWRlXSJyIigobWlwc19yZWcpZHN0c3RyaWRlKSwKKyAgICAgICAgICBbc3Jjc3RyaWRlXSJyIigobWlwc19yZWcpc3Jjc3RyaWRlKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKyNlbHNlCisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrLCBkc3QgKz0gZHN0c3RyaWRlLCBzcmMgKz0gc3Jjc3RyaWRlKQorICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIDE2KTsKKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfcGl4ZWxzOF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpCit7CisjaWYgMQorICAgIGRvdWJsZSBmdG1wWzFdOworICAgIHVpbnQ2NF90IHRtcFsxXTsKKyAgICBtaXBzX3JlZyBhZGRyWzJdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbYWRkcjBdLCAgICVbc3JjXSwgICAgICAgICAlW3NyY3N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9VTERDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAibGRsICAgICAgICAlW3RtcDBdLCAgICAweDA3KCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGRyICAgICAgICAlW3RtcDBdLCAgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW2RzdF0sICAgICAgICAgJVtkc3RzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2RsICAgICAgICAlW3RtcDBdLCAgICAweDA3KCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2RyICAgICAgICAlW3RtcDBdLCAgICAweDAwKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW2FkZHIwXSwgICAgICAgJVtzcmNzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2FkZHIxXSwgICAgICAgJVtkc3RzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKSwKKyAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtkc3RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RzdHJpZGUpLAorICAgICAgICAgIFtzcmNzdHJpZGVdInIiKChtaXBzX3JlZylzcmNzdHJpZGUpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyssIGRzdCArPSBkc3RzdHJpZGUsIHNyYyArPSBzcmNzdHJpZGUpCisgICAgICAgIG1lbWNweShkc3QsIHNyYywgOCk7CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X3BpeGVsczRfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KQoreworI2lmIDEKKyAgICBkb3VibGUgZnRtcFsxXTsKKyAgICB1aW50NjRfdCB0bXBbMV07CisgICAgbWlwc19yZWcgYWRkclsyXTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIwXSwgICAlW3NyY10sICAgICAgICAgJVtzcmNzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBNTUlfTFdDMSglW2Z0bXAwXSwgJVtzcmNdLCAweDAwKQorICAgICAgICAibHdsICAgICAgICAlW3RtcDBdLCAgICAweDAzKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHdyICAgICAgICAlW3RtcDBdLCAgICAweDAwKCVbYWRkcjBdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2FkZHIxXSwgICAlW2RzdF0sICAgICAgICAgJVtkc3RzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBNTUlfU1dDMSglW2Z0bXAwXSwgJVtkc3RdLCAweDAwKQorICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3dsICAgICAgICAlW3RtcDBdLCAgICAweDAzKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3dyICAgICAgICAlW3RtcDBdLCAgICAweDAwKCVbYWRkcjFdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW2FkZHIwXSwgICAgICAgJVtzcmNzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2FkZHIxXSwgICAgICAgJVtkc3RzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFthZGRyMF0iPSZyIihhZGRyWzBdKSwgICAgICAgICAgICBbYWRkcjFdIj0mciIoYWRkclsxXSksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKSwKKyAgICAgICAgICBbaF0iKyZyIihoKQorICAgICAgICA6IFtkc3RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RzdHJpZGUpLAorICAgICAgICAgIFtzcmNzdHJpZGVdInIiKChtaXBzX3JlZylzcmNzdHJpZGUpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyssIGRzdCArPSBkc3RzdHJpZGUsIHNyYyArPSBzcmNzdHJpZGUpCisgICAgICAgIG1lbWNweShkc3QsIHNyYywgNCk7CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2VwZWwxNl9oNF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgY29uc3QgdWludDY0X3QgKmZpbHRlciA9IGZvdXJ0YXBfc3VicGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICB1aW50MzJfdCB0bXBbMV07CisgICAgbWlwc19yZWcgc3JjMSwgZHN0MTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIC8qCisgICAgZHN0WzBdID0gY21bKGZpbHRlclsyXSAqIHNyY1swXSAtIGZpbHRlclsxXSAqIHNyY1stMV0gKyBmaWx0ZXJbM10gKiBzcmNbMV0gLSBmaWx0ZXJbNF0gKiBzcmNbMl0gKyA2NCkgPj4gN107CisgICAgZHN0WzFdID0gY21bKGZpbHRlclsyXSAqIHNyY1sxXSAtIGZpbHRlclsxXSAqIHNyY1sgMF0gKyBmaWx0ZXJbM10gKiBzcmNbMl0gLSBmaWx0ZXJbNF0gKiBzcmNbM10gKyA2NCkgPj4gN107CisgICAgZHN0WzJdID0gY21bKGZpbHRlclsyXSAqIHNyY1syXSAtIGZpbHRlclsxXSAqIHNyY1sgMV0gKyBmaWx0ZXJbM10gKiBzcmNbM10gLSBmaWx0ZXJbNF0gKiBzcmNbNF0gKyA2NCkgPj4gN107CisgICAgZHN0WzNdID0gY21bKGZpbHRlclsyXSAqIHNyY1szXSAtIGZpbHRlclsxXSAqIHNyY1sgMl0gKyBmaWx0ZXJbM10gKiBzcmNbNF0gLSBmaWx0ZXJbNF0gKiBzcmNbNV0gKyA2NCkgPj4gN107CisgICAgZHN0WzRdID0gY21bKGZpbHRlclsyXSAqIHNyY1s0XSAtIGZpbHRlclsxXSAqIHNyY1sgM10gKyBmaWx0ZXJbM10gKiBzcmNbNV0gLSBmaWx0ZXJbNF0gKiBzcmNbNl0gKyA2NCkgPj4gN107CisgICAgZHN0WzVdID0gY21bKGZpbHRlclsyXSAqIHNyY1s1XSAtIGZpbHRlclsxXSAqIHNyY1sgNF0gKyBmaWx0ZXJbM10gKiBzcmNbNl0gLSBmaWx0ZXJbNF0gKiBzcmNbN10gKyA2NCkgPj4gN107CisgICAgZHN0WzZdID0gY21bKGZpbHRlclsyXSAqIHNyY1s2XSAtIGZpbHRlclsxXSAqIHNyY1sgNV0gKyBmaWx0ZXJbM10gKiBzcmNbN10gLSBmaWx0ZXJbNF0gKiBzcmNbOF0gKyA2NCkgPj4gN107CisgICAgZHN0WzddID0gY21bKGZpbHRlclsyXSAqIHNyY1s3XSAtIGZpbHRlclsxXSAqIHNyY1sgNl0gKyBmaWx0ZXJbM10gKiBzcmNbOF0gLSBmaWx0ZXJbNF0gKiBzcmNbOV0gKyA2NCkgPj4gN107CisKKyAgICBkc3RbIDhdID0gY21bKGZpbHRlclsyXSAqIHNyY1sgOF0gLSBmaWx0ZXJbMV0gKiBzcmNbIDddICsgZmlsdGVyWzNdICogc3JjWyA5XSAtIGZpbHRlcls0XSAqIHNyY1sxMF0gKyA2NCkgPj4gN107CisgICAgZHN0WyA5XSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbIDldIC0gZmlsdGVyWzFdICogc3JjWyA4XSArIGZpbHRlclszXSAqIHNyY1sxMF0gLSBmaWx0ZXJbNF0gKiBzcmNbMTFdICsgNjQpID4+IDddOworICAgIGRzdFsxMF0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzEwXSAtIGZpbHRlclsxXSAqIHNyY1sgOV0gKyBmaWx0ZXJbM10gKiBzcmNbMTFdIC0gZmlsdGVyWzRdICogc3JjWzEyXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMTFdID0gY21bKGZpbHRlclsyXSAqIHNyY1sxMV0gLSBmaWx0ZXJbMV0gKiBzcmNbMTBdICsgZmlsdGVyWzNdICogc3JjWzEyXSAtIGZpbHRlcls0XSAqIHNyY1sxM10gKyA2NCkgPj4gN107CisgICAgZHN0WzEyXSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbMTJdIC0gZmlsdGVyWzFdICogc3JjWzExXSArIGZpbHRlclszXSAqIHNyY1sxM10gLSBmaWx0ZXJbNF0gKiBzcmNbMTRdICsgNjQpID4+IDddOworICAgIGRzdFsxM10gPSBjbVsoZmlsdGVyWzJdICogc3JjWzEzXSAtIGZpbHRlclsxXSAqIHNyY1sxMl0gKyBmaWx0ZXJbM10gKiBzcmNbMTRdIC0gZmlsdGVyWzRdICogc3JjWzE1XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMTRdID0gY21bKGZpbHRlclsyXSAqIHNyY1sxNF0gLSBmaWx0ZXJbMV0gKiBzcmNbMTNdICsgZmlsdGVyWzNdICogc3JjWzE1XSAtIGZpbHRlcls0XSAqIHNyY1sxNl0gKyA2NCkgPj4gN107CisgICAgZHN0WzE1XSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbMTVdIC0gZmlsdGVyWzFdICogc3JjWzE0XSArIGZpbHRlclszXSAqIHNyY1sxNl0gLSBmaWx0ZXJbNF0gKiBzcmNbMTddICsgNjQpID4+IDddOworICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8gMCAtIDcKKyAgICAgICAgUFVUX1ZQOF9FUEVMOF9INF9NTUkoJVtzcmNdLCAlW2RzdF0pCisgICAgICAgIFBUUl9BRERJVSAgIiVbc3JjMV0sICAgICVbc3JjXSwgICAgICAgICAweDA4ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbZHN0MV0sICAgICVbZHN0XSwgICAgICAgICAweDA4ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIDggLSAxNQorICAgICAgICBQVVRfVlA4X0VQRUw4X0g0X01NSSglW3NyYzFdLCAlW2RzdDFdKQorCisgICAgICAgICJhZGRpdSAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY3N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdHN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbZHN0MV0iPSZyIihkc3QxKSwgICAgICAgICAgICAgICAgW3NyYzFdIj0mciIoc3JjMSksCisgICAgICAgICAgW2hdIismciIoaCksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFtmZl9wd182NF0iZiIoZmZfcHdfNjQpLAorICAgICAgICAgIFtzcmNzdHJpZGVdInIiKChtaXBzX3JlZylzcmNzdHJpZGUpLAorICAgICAgICAgIFtkc3RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RzdHJpZGUpLAorICAgICAgICAgIFtmaWx0ZXIxXSJmIihmaWx0ZXJbMV0pLCAgICAgICAgICBbZmlsdGVyMl0iZiIoZmlsdGVyWzJdKSwKKyAgICAgICAgICBbZmlsdGVyM10iZiIoZmlsdGVyWzNdKSwgICAgICAgICAgW2ZpbHRlcjRdImYiKGZpbHRlcls0XSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXzRUQVAoc3JjLCBmaWx0ZXIsIDEpOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDhfaDRfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIGNvbnN0IHVpbnQ2NF90ICpmaWx0ZXIgPSBmb3VydGFwX3N1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgZG91YmxlIGZ0bXBbOV07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgLyoKKyAgICBkc3RbMF0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzBdIC0gZmlsdGVyWzFdICogc3JjWy0xXSArIGZpbHRlclszXSAqIHNyY1sxXSAtIGZpbHRlcls0XSAqIHNyY1syXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMV0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzFdIC0gZmlsdGVyWzFdICogc3JjWyAwXSArIGZpbHRlclszXSAqIHNyY1syXSAtIGZpbHRlcls0XSAqIHNyY1szXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMl0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzJdIC0gZmlsdGVyWzFdICogc3JjWyAxXSArIGZpbHRlclszXSAqIHNyY1szXSAtIGZpbHRlcls0XSAqIHNyY1s0XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbM10gPSBjbVsoZmlsdGVyWzJdICogc3JjWzNdIC0gZmlsdGVyWzFdICogc3JjWyAyXSArIGZpbHRlclszXSAqIHNyY1s0XSAtIGZpbHRlcls0XSAqIHNyY1s1XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbNF0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzRdIC0gZmlsdGVyWzFdICogc3JjWyAzXSArIGZpbHRlclszXSAqIHNyY1s1XSAtIGZpbHRlcls0XSAqIHNyY1s2XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbNV0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzVdIC0gZmlsdGVyWzFdICogc3JjWyA0XSArIGZpbHRlclszXSAqIHNyY1s2XSAtIGZpbHRlcls0XSAqIHNyY1s3XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbNl0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzZdIC0gZmlsdGVyWzFdICogc3JjWyA1XSArIGZpbHRlclszXSAqIHNyY1s3XSAtIGZpbHRlcls0XSAqIHNyY1s4XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbN10gPSBjbVsoZmlsdGVyWzJdICogc3JjWzddIC0gZmlsdGVyWzFdICogc3JjWyA2XSArIGZpbHRlclszXSAqIHNyY1s4XSAtIGZpbHRlcls0XSAqIHNyY1s5XSArIDY0KSA+PiA3XTsKKyAgICAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBVVF9WUDhfRVBFTDhfSDRfTU1JKCVbc3JjXSwgJVtkc3RdKQorCisgICAgICAgICJhZGRpdSAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY3N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdHN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbaF0iKyZyIihoKSwKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpCisgICAgICAgIDogW2ZmX3B3XzY0XSJmIihmZl9wd182NCksCisgICAgICAgICAgW3NyY3N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY3N0cmlkZSksCisgICAgICAgICAgW2RzdHN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdHN0cmlkZSksCisgICAgICAgICAgW2ZpbHRlcjFdImYiKGZpbHRlclsxXSksICAgICAgICAgIFtmaWx0ZXIyXSJmIihmaWx0ZXJbMl0pLAorICAgICAgICAgIFtmaWx0ZXIzXSJmIihmaWx0ZXJbM10pLCAgICAgICAgICBbZmlsdGVyNF0iZiIoZmlsdGVyWzRdKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl80VEFQKHNyYywgZmlsdGVyLCAxKTsKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2VwZWw0X2g0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworI2lmIDEKKyAgICBjb25zdCB1aW50NjRfdCAqZmlsdGVyID0gZm91cnRhcF9zdWJwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGRvdWJsZSBmdG1wWzZdOworICAgIHVpbnQzMl90IHRtcFsxXTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKworICAgIC8qCisgICAgZHN0WzBdID0gY21bKGZpbHRlclsyXSAqIHNyY1swXSAtIGZpbHRlclsxXSAqIHNyY1stMV0gKyBmaWx0ZXJbM10gKiBzcmNbMV0gLSBmaWx0ZXJbNF0gKiBzcmNbMl0gKyA2NCkgPj4gN107CisgICAgZHN0WzFdID0gY21bKGZpbHRlclsyXSAqIHNyY1sxXSAtIGZpbHRlclsxXSAqIHNyY1sgMF0gKyBmaWx0ZXJbM10gKiBzcmNbMl0gLSBmaWx0ZXJbNF0gKiBzcmNbM10gKyA2NCkgPj4gN107CisgICAgZHN0WzJdID0gY21bKGZpbHRlclsyXSAqIHNyY1syXSAtIGZpbHRlclsxXSAqIHNyY1sgMV0gKyBmaWx0ZXJbM10gKiBzcmNbM10gLSBmaWx0ZXJbNF0gKiBzcmNbNF0gKyA2NCkgPj4gN107CisgICAgZHN0WzNdID0gY21bKGZpbHRlclsyXSAqIHNyY1szXSAtIGZpbHRlclsxXSAqIHNyY1sgMl0gKyBmaWx0ZXJbM10gKiBzcmNbNF0gLSBmaWx0ZXJbNF0gKiBzcmNbNV0gKyA2NCkgPj4gN107CisgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICAgJVt0bXAwXSwgICAgMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVVRfVlA4X0VQRUw0X0g0X01NSSglW3NyY10sICVbZHN0XSkKKworICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgW2hdIismciIoaCksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFtmZl9wd182NF0iZiIoZmZfcHdfNjQpLAorICAgICAgICAgIFtzcmNzdHJpZGVdInIiKChtaXBzX3JlZylzcmNzdHJpZGUpLAorICAgICAgICAgIFtkc3RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RzdHJpZGUpLAorICAgICAgICAgIFtmaWx0ZXIxXSJmIihmaWx0ZXJbMV0pLCAgICAgICAgICBbZmlsdGVyMl0iZiIoZmlsdGVyWzJdKSwKKyAgICAgICAgICBbZmlsdGVyM10iZiIoZmlsdGVyWzNdKSwgICAgICAgICAgW2ZpbHRlcjRdImYiKGZpbHRlcls0XSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfNFRBUChzcmMsIGZpbHRlciwgMSk7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsMTZfaDZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIGNvbnN0IHVpbnQ2NF90ICpmaWx0ZXIgPSBmb3VydGFwX3N1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgZG91YmxlIGZ0bXBbOV07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIG1pcHNfcmVnIHNyYzEsIGRzdDE7CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKKyAgICAvKgorICAgIGRzdFsgMF0gPSBjbVsoZmlsdGVyWzJdKnNyY1sgMF0gLSBmaWx0ZXJbMV0qc3JjWy0xXSArIGZpbHRlclswXSpzcmNbLTJdICsgZmlsdGVyWzNdKnNyY1sgMV0gLSBmaWx0ZXJbNF0qc3JjWyAyXSArIGZpbHRlcls1XSpzcmNbIDNdICsgNjQpID4+IDddOworICAgIGRzdFsgMV0gPSBjbVsoZmlsdGVyWzJdKnNyY1sgMV0gLSBmaWx0ZXJbMV0qc3JjWyAwXSArIGZpbHRlclswXSpzcmNbLTFdICsgZmlsdGVyWzNdKnNyY1sgMl0gLSBmaWx0ZXJbNF0qc3JjWyAzXSArIGZpbHRlcls1XSpzcmNbIDRdICsgNjQpID4+IDddOworICAgIGRzdFsgMl0gPSBjbVsoZmlsdGVyWzJdKnNyY1sgMl0gLSBmaWx0ZXJbMV0qc3JjWyAxXSArIGZpbHRlclswXSpzcmNbIDBdICsgZmlsdGVyWzNdKnNyY1sgM10gLSBmaWx0ZXJbNF0qc3JjWyA0XSArIGZpbHRlcls1XSpzcmNbIDVdICsgNjQpID4+IDddOworICAgIGRzdFsgM10gPSBjbVsoZmlsdGVyWzJdKnNyY1sgM10gLSBmaWx0ZXJbMV0qc3JjWyAyXSArIGZpbHRlclswXSpzcmNbIDFdICsgZmlsdGVyWzNdKnNyY1sgNF0gLSBmaWx0ZXJbNF0qc3JjWyA1XSArIGZpbHRlcls1XSpzcmNbIDZdICsgNjQpID4+IDddOworICAgIGRzdFsgNF0gPSBjbVsoZmlsdGVyWzJdKnNyY1sgNF0gLSBmaWx0ZXJbMV0qc3JjWyAzXSArIGZpbHRlclswXSpzcmNbIDJdICsgZmlsdGVyWzNdKnNyY1sgNV0gLSBmaWx0ZXJbNF0qc3JjWyA2XSArIGZpbHRlcls1XSpzcmNbIDddICsgNjQpID4+IDddOworICAgIGRzdFsgNV0gPSBjbVsoZmlsdGVyWzJdKnNyY1sgNV0gLSBmaWx0ZXJbMV0qc3JjWyA0XSArIGZpbHRlclswXSpzcmNbIDNdICsgZmlsdGVyWzNdKnNyY1sgNl0gLSBmaWx0ZXJbNF0qc3JjWyA3XSArIGZpbHRlcls1XSpzcmNbIDhdICsgNjQpID4+IDddOworICAgIGRzdFsgNl0gPSBjbVsoZmlsdGVyWzJdKnNyY1sgNl0gLSBmaWx0ZXJbMV0qc3JjWyA1XSArIGZpbHRlclswXSpzcmNbIDRdICsgZmlsdGVyWzNdKnNyY1sgN10gLSBmaWx0ZXJbNF0qc3JjWyA4XSArIGZpbHRlcls1XSpzcmNbIDldICsgNjQpID4+IDddOworICAgIGRzdFsgN10gPSBjbVsoZmlsdGVyWzJdKnNyY1sgN10gLSBmaWx0ZXJbMV0qc3JjWyA2XSArIGZpbHRlclswXSpzcmNbIDVdICsgZmlsdGVyWzNdKnNyY1sgOF0gLSBmaWx0ZXJbNF0qc3JjWyA5XSArIGZpbHRlcls1XSpzcmNbMTBdICsgNjQpID4+IDddOworCisgICAgZHN0WyA4XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWyA4XSAtIGZpbHRlclsxXSpzcmNbIDddICsgZmlsdGVyWzBdKnNyY1sgNl0gKyBmaWx0ZXJbM10qc3JjWyA5XSAtIGZpbHRlcls0XSpzcmNbMTBdICsgZmlsdGVyWzVdKnNyY1sxMV0gKyA2NCkgPj4gN107CisgICAgZHN0WyA5XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWyA5XSAtIGZpbHRlclsxXSpzcmNbIDhdICsgZmlsdGVyWzBdKnNyY1sgN10gKyBmaWx0ZXJbM10qc3JjWzEwXSAtIGZpbHRlcls0XSpzcmNbMTFdICsgZmlsdGVyWzVdKnNyY1sxMl0gKyA2NCkgPj4gN107CisgICAgZHN0WzEwXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzEwXSAtIGZpbHRlclsxXSpzcmNbIDldICsgZmlsdGVyWzBdKnNyY1sgOF0gKyBmaWx0ZXJbM10qc3JjWzExXSAtIGZpbHRlcls0XSpzcmNbMTJdICsgZmlsdGVyWzVdKnNyY1sxM10gKyA2NCkgPj4gN107CisgICAgZHN0WzExXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzExXSAtIGZpbHRlclsxXSpzcmNbMTBdICsgZmlsdGVyWzBdKnNyY1sgOV0gKyBmaWx0ZXJbM10qc3JjWzEyXSAtIGZpbHRlcls0XSpzcmNbMTNdICsgZmlsdGVyWzVdKnNyY1sxNF0gKyA2NCkgPj4gN107CisgICAgZHN0WzEyXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzEyXSAtIGZpbHRlclsxXSpzcmNbMTFdICsgZmlsdGVyWzBdKnNyY1sxMF0gKyBmaWx0ZXJbM10qc3JjWzEzXSAtIGZpbHRlcls0XSpzcmNbMTRdICsgZmlsdGVyWzVdKnNyY1sxNV0gKyA2NCkgPj4gN107CisgICAgZHN0WzEzXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzEzXSAtIGZpbHRlclsxXSpzcmNbMTJdICsgZmlsdGVyWzBdKnNyY1sxMV0gKyBmaWx0ZXJbM10qc3JjWzE0XSAtIGZpbHRlcls0XSpzcmNbMTVdICsgZmlsdGVyWzVdKnNyY1sxNl0gKyA2NCkgPj4gN107CisgICAgZHN0WzE0XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzE0XSAtIGZpbHRlclsxXSpzcmNbMTNdICsgZmlsdGVyWzBdKnNyY1sxMl0gKyBmaWx0ZXJbM10qc3JjWzE1XSAtIGZpbHRlcls0XSpzcmNbMTZdICsgZmlsdGVyWzVdKnNyY1sxN10gKyA2NCkgPj4gN107CisgICAgZHN0WzE1XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzE1XSAtIGZpbHRlclsxXSpzcmNbMTRdICsgZmlsdGVyWzBdKnNyY1sxM10gKyBmaWx0ZXJbM10qc3JjWzE2XSAtIGZpbHRlcls0XSpzcmNbMTddICsgZmlsdGVyWzVdKnNyY1sxOF0gKyA2NCkgPj4gN107CisgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICAgJVt0bXAwXSwgICAgMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAvLyAwIC0gNworICAgICAgICBQVVRfVlA4X0VQRUw4X0g2X01NSSglW3NyY10sICVbZHN0XSkKKyAgICAgICAgUFRSX0FERElVICAiJVtzcmMxXSwgICAgJVtzcmNdLCAgICAgICAgIDB4MDggICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERElVICAiJVtkc3QxXSwgICAgJVtkc3RdLCAgICAgICAgIDB4MDggICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8gOCAtIDE1CisgICAgICAgIFBVVF9WUDhfRVBFTDhfSDZfTU1JKCVbc3JjMV0sICVbZHN0MV0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3Jjc3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0c3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtkc3QxXSI9JnIiKGRzdDEpLCAgICAgICAgICAgICAgICBbc3JjMV0iPSZyIihzcmMxKSwKKyAgICAgICAgICBbaF0iKyZyIihoKSwKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpCisgICAgICAgIDogW2ZmX3B3XzY0XSJmIihmZl9wd182NCksCisgICAgICAgICAgW3NyY3N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY3N0cmlkZSksCisgICAgICAgICAgW2RzdHN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdHN0cmlkZSksCisgICAgICAgICAgW2ZpbHRlcjBdImYiKGZpbHRlclswXSksICAgICAgICAgIFtmaWx0ZXIxXSJmIihmaWx0ZXJbMV0pLAorICAgICAgICAgIFtmaWx0ZXIyXSJmIihmaWx0ZXJbMl0pLCAgICAgICAgICBbZmlsdGVyM10iZiIoZmlsdGVyWzNdKSwKKyAgICAgICAgICBbZmlsdGVyNF0iZiIoZmlsdGVyWzRdKSwgICAgICAgICAgW2ZpbHRlcjVdImYiKGZpbHRlcls1XSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXzZUQVAoc3JjLCBmaWx0ZXIsIDEpOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDhfaDZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIGNvbnN0IHVpbnQ2NF90ICpmaWx0ZXIgPSBmb3VydGFwX3N1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgZG91YmxlIGZ0bXBbOV07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgLyoKKyAgICBkc3RbMF0gPSBjbVsoZmlsdGVyWzJdKnNyY1swXSAtIGZpbHRlclsxXSpzcmNbLTFdICsgZmlsdGVyWzBdKnNyY1stMl0gKyBmaWx0ZXJbM10qc3JjWzFdIC0gZmlsdGVyWzRdKnNyY1syXSArIGZpbHRlcls1XSpzcmNbIDNdICsgNjQpID4+IDddOworICAgIGRzdFsxXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzFdIC0gZmlsdGVyWzFdKnNyY1sgMF0gKyBmaWx0ZXJbMF0qc3JjWy0xXSArIGZpbHRlclszXSpzcmNbMl0gLSBmaWx0ZXJbNF0qc3JjWzNdICsgZmlsdGVyWzVdKnNyY1sgNF0gKyA2NCkgPj4gN107CisgICAgZHN0WzJdID0gY21bKGZpbHRlclsyXSpzcmNbMl0gLSBmaWx0ZXJbMV0qc3JjWyAxXSArIGZpbHRlclswXSpzcmNbIDBdICsgZmlsdGVyWzNdKnNyY1szXSAtIGZpbHRlcls0XSpzcmNbNF0gKyBmaWx0ZXJbNV0qc3JjWyA1XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbM10gPSBjbVsoZmlsdGVyWzJdKnNyY1szXSAtIGZpbHRlclsxXSpzcmNbIDJdICsgZmlsdGVyWzBdKnNyY1sgMV0gKyBmaWx0ZXJbM10qc3JjWzRdIC0gZmlsdGVyWzRdKnNyY1s1XSArIGZpbHRlcls1XSpzcmNbIDZdICsgNjQpID4+IDddOworICAgIGRzdFs0XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzRdIC0gZmlsdGVyWzFdKnNyY1sgM10gKyBmaWx0ZXJbMF0qc3JjWyAyXSArIGZpbHRlclszXSpzcmNbNV0gLSBmaWx0ZXJbNF0qc3JjWzZdICsgZmlsdGVyWzVdKnNyY1sgN10gKyA2NCkgPj4gN107CisgICAgZHN0WzVdID0gY21bKGZpbHRlclsyXSpzcmNbNV0gLSBmaWx0ZXJbMV0qc3JjWyA0XSArIGZpbHRlclswXSpzcmNbIDNdICsgZmlsdGVyWzNdKnNyY1s2XSAtIGZpbHRlcls0XSpzcmNbN10gKyBmaWx0ZXJbNV0qc3JjWyA4XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbNl0gPSBjbVsoZmlsdGVyWzJdKnNyY1s2XSAtIGZpbHRlclsxXSpzcmNbIDVdICsgZmlsdGVyWzBdKnNyY1sgNF0gKyBmaWx0ZXJbM10qc3JjWzddIC0gZmlsdGVyWzRdKnNyY1s4XSArIGZpbHRlcls1XSpzcmNbIDldICsgNjQpID4+IDddOworICAgIGRzdFs3XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzddIC0gZmlsdGVyWzFdKnNyY1sgNl0gKyBmaWx0ZXJbMF0qc3JjWyA1XSArIGZpbHRlclszXSpzcmNbOF0gLSBmaWx0ZXJbNF0qc3JjWzldICsgZmlsdGVyWzVdKnNyY1sxMF0gKyA2NCkgPj4gN107CisgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICAgJVt0bXAwXSwgICAgMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVVRfVlA4X0VQRUw4X0g2X01NSSglW3NyY10sICVbZHN0XSkKKworICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwgICAgICAgICAgICBbZnRtcDddIj0mZiIoZnRtcFs3XSksCisgICAgICAgICAgW2Z0bXA4XSI9JmYiKGZ0bXBbOF0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW2hdIismciIoaCksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFtmZl9wd182NF0iZiIoZmZfcHdfNjQpLAorICAgICAgICAgIFtzcmNzdHJpZGVdInIiKChtaXBzX3JlZylzcmNzdHJpZGUpLAorICAgICAgICAgIFtkc3RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RzdHJpZGUpLAorICAgICAgICAgIFtmaWx0ZXIwXSJmIihmaWx0ZXJbMF0pLCAgICAgICAgICBbZmlsdGVyMV0iZiIoZmlsdGVyWzFdKSwKKyAgICAgICAgICBbZmlsdGVyMl0iZiIoZmlsdGVyWzJdKSwgICAgICAgICAgW2ZpbHRlcjNdImYiKGZpbHRlclszXSksCisgICAgICAgICAgW2ZpbHRlcjRdImYiKGZpbHRlcls0XSksICAgICAgICAgIFtmaWx0ZXI1XSJmIihmaWx0ZXJbNV0pCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBjb25zdCB1aW50OF90ICpmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGNvbnN0IHVpbnQ4X3QgKmNtICAgICA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXzZUQVAoc3JjLCBmaWx0ZXIsIDEpOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDRfaDZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIGNvbnN0IHVpbnQ2NF90ICpmaWx0ZXIgPSBmb3VydGFwX3N1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgZG91YmxlIGZ0bXBbNl07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworCisgICAgLyoKKyAgICBkc3RbMF0gPSBjbVsoZmlsdGVyWzJdKnNyY1swXSAtIGZpbHRlclsxXSpzcmNbLTFdICsgZmlsdGVyWzBdKnNyY1stMl0gKyBmaWx0ZXJbM10qc3JjWzFdIC0gZmlsdGVyWzRdKnNyY1syXSArIGZpbHRlcls1XSpzcmNbIDNdICsgNjQpID4+IDddOworICAgIGRzdFsxXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzFdIC0gZmlsdGVyWzFdKnNyY1sgMF0gKyBmaWx0ZXJbMF0qc3JjWy0xXSArIGZpbHRlclszXSpzcmNbMl0gLSBmaWx0ZXJbNF0qc3JjWzNdICsgZmlsdGVyWzVdKnNyY1sgNF0gKyA2NCkgPj4gN107CisgICAgZHN0WzJdID0gY21bKGZpbHRlclsyXSpzcmNbMl0gLSBmaWx0ZXJbMV0qc3JjWyAxXSArIGZpbHRlclswXSpzcmNbIDBdICsgZmlsdGVyWzNdKnNyY1szXSAtIGZpbHRlcls0XSpzcmNbNF0gKyBmaWx0ZXJbNV0qc3JjWyA1XSArIDY0KSA+PiA3XTsKKyAgICBkc3RbM10gPSBjbVsoZmlsdGVyWzJdKnNyY1szXSAtIGZpbHRlclsxXSpzcmNbIDJdICsgZmlsdGVyWzBdKnNyY1sgMV0gKyBmaWx0ZXJbM10qc3JjWzRdIC0gZmlsdGVyWzRdKnNyY1s1XSArIGZpbHRlcls1XSpzcmNbIDZdICsgNjQpID4+IDddOworICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFVUX1ZQOF9FUEVMNF9INl9NTUkoJVtzcmNdLCAlW2RzdF0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3Jjc3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0c3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFtoXSIrJnIiKGgpLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbZmZfcHdfNjRdImYiKGZmX3B3XzY0KSwKKyAgICAgICAgICBbc3Jjc3RyaWRlXSJyIigobWlwc19yZWcpc3Jjc3RyaWRlKSwKKyAgICAgICAgICBbZHN0c3RyaWRlXSJyIigobWlwc19yZWcpZHN0c3RyaWRlKSwKKyAgICAgICAgICBbZmlsdGVyMF0iZiIoZmlsdGVyWzBdKSwgICAgICAgICAgW2ZpbHRlcjFdImYiKGZpbHRlclsxXSksCisgICAgICAgICAgW2ZpbHRlcjJdImYiKGZpbHRlclsyXSksICAgICAgICAgIFtmaWx0ZXIzXSJmIihmaWx0ZXJbM10pLAorICAgICAgICAgIFtmaWx0ZXI0XSJmIihmaWx0ZXJbNF0pLCAgICAgICAgICBbZmlsdGVyNV0iZiIoZmlsdGVyWzVdKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl82VEFQKHNyYywgZmlsdGVyLCAxKTsKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2VwZWwxNl92NF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgY29uc3QgdWludDY0X3QgKmZpbHRlciA9IGZvdXJ0YXBfc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICB1aW50MzJfdCB0bXBbMV07CisgICAgbWlwc19yZWcgc3JjMCwgc3JjMSwgZHN0MDsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIC8qCisgICAgZHN0WzBdID0gY21bKGZpbHRlclsyXSAqIHNyY1swXSAtIGZpbHRlclsxXSAqIHNyY1sgLXNyY3N0cmlkZV0gKyBmaWx0ZXJbM10gKiBzcmNbICBzcmNzdHJpZGVdIC0gZmlsdGVyWzRdICogc3JjWyAgMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxXSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbMV0gLSBmaWx0ZXJbMV0gKiBzcmNbMS1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzErc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSAqIHNyY1sxKzIqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMl0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzJdIC0gZmlsdGVyWzFdICogc3JjWzItc3Jjc3RyaWRlXSArIGZpbHRlclszXSAqIHNyY1syK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMisyKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzNdID0gY21bKGZpbHRlclsyXSAqIHNyY1szXSAtIGZpbHRlclsxXSAqIHNyY1szLXNyY3N0cmlkZV0gKyBmaWx0ZXJbM10gKiBzcmNbMytzcmNzdHJpZGVdIC0gZmlsdGVyWzRdICogc3JjWzMrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFs0XSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbNF0gLSBmaWx0ZXJbMV0gKiBzcmNbNC1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzQrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSAqIHNyY1s0KzIqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbNV0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzVdIC0gZmlsdGVyWzFdICogc3JjWzUtc3Jjc3RyaWRlXSArIGZpbHRlclszXSAqIHNyY1s1K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbNSsyKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzZdID0gY21bKGZpbHRlclsyXSAqIHNyY1s2XSAtIGZpbHRlclsxXSAqIHNyY1s2LXNyY3N0cmlkZV0gKyBmaWx0ZXJbM10gKiBzcmNbNitzcmNzdHJpZGVdIC0gZmlsdGVyWzRdICogc3JjWzYrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFs3XSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbN10gLSBmaWx0ZXJbMV0gKiBzcmNbNy1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzcrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSAqIHNyY1s3KzIqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKworICAgIGRzdFsgOF0gPSBjbVsoZmlsdGVyWzJdICogc3JjWyA4XSAtIGZpbHRlclsxXSAqIHNyY1sgOC1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWyA4K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbIDgrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsgOV0gPSBjbVsoZmlsdGVyWzJdICogc3JjWyA5XSAtIGZpbHRlclsxXSAqIHNyY1sgOS1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWyA5K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbIDkrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxMF0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzEwXSAtIGZpbHRlclsxXSAqIHNyY1sxMC1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzEwK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMTArMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxMV0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzExXSAtIGZpbHRlclsxXSAqIHNyY1sxMS1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzExK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMTErMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxMl0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzEyXSAtIGZpbHRlclsxXSAqIHNyY1sxMi1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzEyK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMTIrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxM10gPSBjbVsoZmlsdGVyWzJdICogc3JjWzEzXSAtIGZpbHRlclsxXSAqIHNyY1sxMy1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzEzK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMTMrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxNF0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzE0XSAtIGZpbHRlclsxXSAqIHNyY1sxNC1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzE0K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMTQrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxNV0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzE1XSAtIGZpbHRlclsxXSAqIHNyY1sxNS1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzE1K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMTUrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8gMCAtIDcKKyAgICAgICAgUFVUX1ZQOF9FUEVMOF9WNF9NTUkoJVtzcmNdLCAlW3NyYzFdLCAlW2RzdF0sICVbc3Jjc3RyaWRlXSkKKyAgICAgICAgUFRSX0FERElVICAiJVtzcmMwXSwgICAgJVtzcmNdLCAgICAgICAgIDB4MDggICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERElVICAiJVtkc3QwXSwgICAgJVtkc3RdLCAgICAgICAgIDB4MDggICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgLy8gOCAtIDE1CisgICAgICAgIFBVVF9WUDhfRVBFTDhfVjRfTU1JKCVbc3JjMF0sICVbc3JjMV0sICVbZHN0XSwgJVtzcmNzdHJpZGVdKQorCisgICAgICAgICJhZGRpdSAgICAgICVbaF0sICAgICAgICVbaF0sICAgICAgICAgICAtMHgwMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbc3JjXSwgICAgICVbc3JjXSwgICAgICAgICAlW3NyY3N0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERVICAgIiVbZHN0XSwgICAgICVbZHN0XSwgICAgICAgICAlW2RzdHN0cmlkZV0gICAgICAgIFxuXHQiCisgICAgICAgICJibmV6ICAgICAgICVbaF0sICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW2Z0bXAwXSI9JmYiKGZ0bXBbMF0pLCAgICAgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgICAgICBbZnRtcDVdIj0mZiIoZnRtcFs1XSksCisgICAgICAgICAgW2Z0bXA2XSI9JmYiKGZ0bXBbNl0pLCAgICAgICAgICAgIFtmdG1wN10iPSZmIihmdG1wWzddKSwKKyAgICAgICAgICBbZnRtcDhdIj0mZiIoZnRtcFs4XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbc3JjMF0iPSZyIihzcmMwKSwgICAgICAgICAgICAgICAgW2RzdDBdIj0mciIoZHN0MCksCisgICAgICAgICAgW3NyYzFdIj0mciIoc3JjMSksCisgICAgICAgICAgW2hdIismciIoaCksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFtmZl9wd182NF0iZiIoZmZfcHdfNjQpLAorICAgICAgICAgIFtzcmNzdHJpZGVdInIiKChtaXBzX3JlZylzcmNzdHJpZGUpLAorICAgICAgICAgIFtkc3RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RzdHJpZGUpLAorICAgICAgICAgIFtmaWx0ZXIxXSJmIihmaWx0ZXJbMV0pLCAgICAgICAgICBbZmlsdGVyMl0iZiIoZmlsdGVyWzJdKSwKKyAgICAgICAgICBbZmlsdGVyM10iZiIoZmlsdGVyWzNdKSwgICAgICAgICAgW2ZpbHRlcjRdImYiKGZpbHRlcls0XSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW215IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXzRUQVAoc3JjLCBmaWx0ZXIsIHNyY3N0cmlkZSk7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF92NF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgY29uc3QgdWludDY0X3QgKmZpbHRlciA9IGZvdXJ0YXBfc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICB1aW50MzJfdCB0bXBbMV07CisgICAgbWlwc19yZWcgc3JjMTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIC8qCisgICAgZHN0WzBdID0gY21bKGZpbHRlclsyXSAqIHNyY1swXSAtIGZpbHRlclsxXSAqIHNyY1sgLXNyY3N0cmlkZV0gKyBmaWx0ZXJbM10gKiBzcmNbICBzcmNzdHJpZGVdIC0gZmlsdGVyWzRdICogc3JjWyAgMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxXSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbMV0gLSBmaWx0ZXJbMV0gKiBzcmNbMS1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzErc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSAqIHNyY1sxKzIqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMl0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzJdIC0gZmlsdGVyWzFdICogc3JjWzItc3Jjc3RyaWRlXSArIGZpbHRlclszXSAqIHNyY1syK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMisyKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzNdID0gY21bKGZpbHRlclsyXSAqIHNyY1szXSAtIGZpbHRlclsxXSAqIHNyY1szLXNyY3N0cmlkZV0gKyBmaWx0ZXJbM10gKiBzcmNbMytzcmNzdHJpZGVdIC0gZmlsdGVyWzRdICogc3JjWzMrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFs0XSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbNF0gLSBmaWx0ZXJbMV0gKiBzcmNbNC1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzQrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSAqIHNyY1s0KzIqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbNV0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzVdIC0gZmlsdGVyWzFdICogc3JjWzUtc3Jjc3RyaWRlXSArIGZpbHRlclszXSAqIHNyY1s1K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbNSsyKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzZdID0gY21bKGZpbHRlclsyXSAqIHNyY1s2XSAtIGZpbHRlclsxXSAqIHNyY1s2LXNyY3N0cmlkZV0gKyBmaWx0ZXJbM10gKiBzcmNbNitzcmNzdHJpZGVdIC0gZmlsdGVyWzRdICogc3JjWzYrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFs3XSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbN10gLSBmaWx0ZXJbMV0gKiBzcmNbNy1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzcrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSAqIHNyY1s3KzIqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBVVF9WUDhfRVBFTDhfVjRfTU1JKCVbc3JjXSwgJVtzcmMxXSwgJVtkc3RdLCAlW3NyY3N0cmlkZV0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3Jjc3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0c3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtzcmMxXSI9JnIiKHNyYzEpLAorICAgICAgICAgIFtoXSIrJnIiKGgpLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbZmZfcHdfNjRdImYiKGZmX3B3XzY0KSwKKyAgICAgICAgICBbc3Jjc3RyaWRlXSJyIigobWlwc19yZWcpc3Jjc3RyaWRlKSwKKyAgICAgICAgICBbZHN0c3RyaWRlXSJyIigobWlwc19yZWcpZHN0c3RyaWRlKSwKKyAgICAgICAgICBbZmlsdGVyMV0iZiIoZmlsdGVyWzFdKSwgICAgICAgICAgW2ZpbHRlcjJdImYiKGZpbHRlclsyXSksCisgICAgICAgICAgW2ZpbHRlcjNdImYiKGZpbHRlclszXSksICAgICAgICAgIFtmaWx0ZXI0XSJmIihmaWx0ZXJbNF0pCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBjb25zdCB1aW50OF90ICpmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteSAtIDFdOworICAgIGNvbnN0IHVpbnQ4X3QgKmNtICAgICA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXzRUQVAoc3JjLCBmaWx0ZXIsIHNyY3N0cmlkZSk7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsNF92NF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgY29uc3QgdWludDY0X3QgKmZpbHRlciA9IGZvdXJ0YXBfc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKyAgICBkb3VibGUgZnRtcFs2XTsKKyAgICB1aW50MzJfdCB0bXBbMV07CisgICAgbWlwc19yZWcgc3JjMTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKworICAgIC8qCisgICAgZHN0WzBdID0gY21bKGZpbHRlclsyXSAqIHNyY1swXSAtIGZpbHRlclsxXSAqIHNyY1sgLXNyY3N0cmlkZV0gKyBmaWx0ZXJbM10gKiBzcmNbICBzcmNzdHJpZGVdIC0gZmlsdGVyWzRdICogc3JjWyAgMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxXSA9IGNtWyhmaWx0ZXJbMl0gKiBzcmNbMV0gLSBmaWx0ZXJbMV0gKiBzcmNbMS1zcmNzdHJpZGVdICsgZmlsdGVyWzNdICogc3JjWzErc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSAqIHNyY1sxKzIqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMl0gPSBjbVsoZmlsdGVyWzJdICogc3JjWzJdIC0gZmlsdGVyWzFdICogc3JjWzItc3Jjc3RyaWRlXSArIGZpbHRlclszXSAqIHNyY1syK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0gKiBzcmNbMisyKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzNdID0gY21bKGZpbHRlclsyXSAqIHNyY1szXSAtIGZpbHRlclsxXSAqIHNyY1szLXNyY3N0cmlkZV0gKyBmaWx0ZXJbM10gKiBzcmNbMytzcmNzdHJpZGVdIC0gZmlsdGVyWzRdICogc3JjWzMrMipzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFVUX1ZQOF9FUEVMNF9WNF9NTUkoJVtzcmNdLCAlW3NyYzFdLCAlW2RzdF0sICVbc3Jjc3RyaWRlXSkKKworICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzcmNzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RzdHJpZGVdICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgICAgIFtmdG1wM10iPSZmIihmdG1wWzNdKSwKKyAgICAgICAgICBbZnRtcDRdIj0mZiIoZnRtcFs0XSksICAgICAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgW3NyYzFdIj0mciIoc3JjMSksCisgICAgICAgICAgW2hdIismciIoaCksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKQorICAgICAgICA6IFtmZl9wd182NF0iZiIoZmZfcHdfNjQpLAorICAgICAgICAgIFtzcmNzdHJpZGVdInIiKChtaXBzX3JlZylzcmNzdHJpZGUpLAorICAgICAgICAgIFtkc3RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RzdHJpZGUpLAorICAgICAgICAgIFtmaWx0ZXIxXSJmIihmaWx0ZXJbMV0pLCAgICAgICAgICBbZmlsdGVyMl0iZiIoZmlsdGVyWzJdKSwKKyAgICAgICAgICBbZmlsdGVyM10iZiIoZmlsdGVyWzNdKSwgICAgICAgICAgW2ZpbHRlcjRdImYiKGZpbHRlcls0XSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW215IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfNFRBUChzcmMsIGZpbHRlciwgc3Jjc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2VwZWwxNl92Nl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgY29uc3QgdWludDY0X3QgKmZpbHRlciA9IGZvdXJ0YXBfc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICB1aW50MzJfdCB0bXBbMV07CisgICAgbWlwc19yZWcgc3JjMCwgc3JjMSwgZHN0MDsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIC8qCisgICAgZHN0WzBdID0gY21bKGZpbHRlclsyXSpzcmNbMF0gLSBmaWx0ZXJbMV0qc3JjWzAtc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbMC0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzArc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbMCsyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzArMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzFdIC0gZmlsdGVyWzFdKnNyY1sxLXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzEtMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1sxK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzErMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1sxKzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMl0gPSBjbVsoZmlsdGVyWzJdKnNyY1syXSAtIGZpbHRlclsxXSpzcmNbMi1zcmNzdHJpZGVdICsgZmlsdGVyWzBdKnNyY1syLTIqc3Jjc3RyaWRlXSArIGZpbHRlclszXSpzcmNbMitzcmNzdHJpZGVdIC0gZmlsdGVyWzRdKnNyY1syKzIqc3Jjc3RyaWRlXSArIGZpbHRlcls1XSpzcmNbMiszKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzNdID0gY21bKGZpbHRlclsyXSpzcmNbM10gLSBmaWx0ZXJbMV0qc3JjWzMtc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbMy0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzMrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbMysyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzMrMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFs0XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzRdIC0gZmlsdGVyWzFdKnNyY1s0LXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzQtMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1s0K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzQrMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1s0KzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbNV0gPSBjbVsoZmlsdGVyWzJdKnNyY1s1XSAtIGZpbHRlclsxXSpzcmNbNS1zcmNzdHJpZGVdICsgZmlsdGVyWzBdKnNyY1s1LTIqc3Jjc3RyaWRlXSArIGZpbHRlclszXSpzcmNbNStzcmNzdHJpZGVdIC0gZmlsdGVyWzRdKnNyY1s1KzIqc3Jjc3RyaWRlXSArIGZpbHRlcls1XSpzcmNbNSszKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzZdID0gY21bKGZpbHRlclsyXSpzcmNbNl0gLSBmaWx0ZXJbMV0qc3JjWzYtc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbNi0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzYrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbNisyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzYrMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFs3XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzddIC0gZmlsdGVyWzFdKnNyY1s3LXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzctMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1s3K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzcrMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1s3KzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKworICAgIGRzdFsgOF0gPSBjbVsoZmlsdGVyWzJdKnNyY1sgOF0gLSBmaWx0ZXJbMV0qc3JjWyA4LXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWyA4LTIqc3Jjc3RyaWRlXSArIGZpbHRlclszXSpzcmNbIDgrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbIDgrMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1sgOCszKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WyA5XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWyA5XSAtIGZpbHRlclsxXSpzcmNbIDktc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbIDktMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1sgOStzcmNzdHJpZGVdIC0gZmlsdGVyWzRdKnNyY1sgOSsyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWyA5KzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMTBdID0gY21bKGZpbHRlclsyXSpzcmNbMTBdIC0gZmlsdGVyWzFdKnNyY1sxMC1zcmNzdHJpZGVdICsgZmlsdGVyWzBdKnNyY1sxMC0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzEwK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzEwKzIqc3Jjc3RyaWRlXSArIGZpbHRlcls1XSpzcmNbMTArMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxMV0gPSBjbVsoZmlsdGVyWzJdKnNyY1sxMV0gLSBmaWx0ZXJbMV0qc3JjWzExLXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzExLTIqc3Jjc3RyaWRlXSArIGZpbHRlclszXSpzcmNbMTErc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbMTErMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1sxMSszKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzEyXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzEyXSAtIGZpbHRlclsxXSpzcmNbMTItc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbMTItMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1sxMitzcmNzdHJpZGVdIC0gZmlsdGVyWzRdKnNyY1sxMisyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzEyKzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMTNdID0gY21bKGZpbHRlclsyXSpzcmNbMTNdIC0gZmlsdGVyWzFdKnNyY1sxMy1zcmNzdHJpZGVdICsgZmlsdGVyWzBdKnNyY1sxMy0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzEzK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzEzKzIqc3Jjc3RyaWRlXSArIGZpbHRlcls1XSpzcmNbMTMrMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxNF0gPSBjbVsoZmlsdGVyWzJdKnNyY1sxNF0gLSBmaWx0ZXJbMV0qc3JjWzE0LXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzE0LTIqc3Jjc3RyaWRlXSArIGZpbHRlclszXSpzcmNbMTQrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbMTQrMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1sxNCszKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzE1XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzE1XSAtIGZpbHRlclsxXSpzcmNbMTUtc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbMTUtMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1sxNStzcmNzdHJpZGVdIC0gZmlsdGVyWzRdKnNyY1sxNSsyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzE1KzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIDAgLSA3CisgICAgICAgIFBVVF9WUDhfRVBFTDhfVjZfTU1JKCVbc3JjXSwgJVtzcmMxXSwgJVtkc3RdLCAlW3NyY3N0cmlkZV0pCisgICAgICAgIFBUUl9BRERJVSAgIiVbc3JjMF0sICAgICVbc3JjXSwgICAgICAgICAweDA4ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBUUl9BRERJVSAgIiVbZHN0MF0sICAgICVbZHN0XSwgICAgICAgICAweDA4ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIDggLSAxNQorICAgICAgICBQVVRfVlA4X0VQRUw4X1Y2X01NSSglW3NyYzBdLCAlW3NyYzFdLCAlW2RzdDBdLCAlW3NyY3N0cmlkZV0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3Jjc3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0c3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtzcmMwXSI9JnIiKHNyYzApLCAgICAgICAgICAgICAgICBbZHN0MF0iPSZyIihkc3QwKSwKKyAgICAgICAgICBbc3JjMV0iPSZyIihzcmMxKSwKKyAgICAgICAgICBbaF0iKyZyIihoKSwKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpCisgICAgICAgIDogW2ZmX3B3XzY0XSJmIihmZl9wd182NCksCisgICAgICAgICAgW3NyY3N0cmlkZV0iciIoKG1pcHNfcmVnKXNyY3N0cmlkZSksCisgICAgICAgICAgW2RzdHN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdHN0cmlkZSksCisgICAgICAgICAgW2ZpbHRlcjBdImYiKGZpbHRlclswXSksICAgICAgICAgIFtmaWx0ZXIxXSJmIihmaWx0ZXJbMV0pLAorICAgICAgICAgIFtmaWx0ZXIyXSJmIihmaWx0ZXJbMl0pLCAgICAgICAgICBbZmlsdGVyM10iZiIoZmlsdGVyWzNdKSwKKyAgICAgICAgICBbZmlsdGVyNF0iZiIoZmlsdGVyWzRdKSwgICAgICAgICAgW2ZpbHRlcjVdImYiKGZpbHRlcls1XSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW215IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXzZUQVAoc3JjLCBmaWx0ZXIsIHNyY3N0cmlkZSk7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF92Nl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgY29uc3QgdWludDY0X3QgKmZpbHRlciA9IGZvdXJ0YXBfc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKyAgICBkb3VibGUgZnRtcFs5XTsKKyAgICB1aW50MzJfdCB0bXBbMV07CisgICAgbWlwc19yZWcgc3JjMTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIC8qCisgICAgZHN0WzBdID0gY21bKGZpbHRlclsyXSpzcmNbMF0gLSBmaWx0ZXJbMV0qc3JjWzAtc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbMC0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzArc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbMCsyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzArMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFsxXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzFdIC0gZmlsdGVyWzFdKnNyY1sxLXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzEtMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1sxK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzErMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1sxKzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMl0gPSBjbVsoZmlsdGVyWzJdKnNyY1syXSAtIGZpbHRlclsxXSpzcmNbMi1zcmNzdHJpZGVdICsgZmlsdGVyWzBdKnNyY1syLTIqc3Jjc3RyaWRlXSArIGZpbHRlclszXSpzcmNbMitzcmNzdHJpZGVdIC0gZmlsdGVyWzRdKnNyY1syKzIqc3Jjc3RyaWRlXSArIGZpbHRlcls1XSpzcmNbMiszKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzNdID0gY21bKGZpbHRlclsyXSpzcmNbM10gLSBmaWx0ZXJbMV0qc3JjWzMtc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbMy0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzMrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbMysyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzMrMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFs0XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzRdIC0gZmlsdGVyWzFdKnNyY1s0LXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzQtMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1s0K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzQrMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1s0KzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbNV0gPSBjbVsoZmlsdGVyWzJdKnNyY1s1XSAtIGZpbHRlclsxXSpzcmNbNS1zcmNzdHJpZGVdICsgZmlsdGVyWzBdKnNyY1s1LTIqc3Jjc3RyaWRlXSArIGZpbHRlclszXSpzcmNbNStzcmNzdHJpZGVdIC0gZmlsdGVyWzRdKnNyY1s1KzIqc3Jjc3RyaWRlXSArIGZpbHRlcls1XSpzcmNbNSszKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzZdID0gY21bKGZpbHRlclsyXSpzcmNbNl0gLSBmaWx0ZXJbMV0qc3JjWzYtc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbNi0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzYrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbNisyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzYrMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFs3XSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzddIC0gZmlsdGVyWzFdKnNyY1s3LXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzctMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1s3K3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzcrMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1s3KzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBVVF9WUDhfRVBFTDhfVjZfTU1JKCVbc3JjXSwgJVtzcmMxXSwgJVtkc3RdLCAlW3NyY3N0cmlkZV0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3Jjc3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0c3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtzcmMxXSI9JnIiKHNyYzEpLAorICAgICAgICAgIFtoXSIrJnIiKGgpLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbZmZfcHdfNjRdImYiKGZmX3B3XzY0KSwKKyAgICAgICAgICBbc3Jjc3RyaWRlXSJyIigobWlwc19yZWcpc3Jjc3RyaWRlKSwKKyAgICAgICAgICBbZHN0c3RyaWRlXSJyIigobWlwc19yZWcpZHN0c3RyaWRlKSwKKyAgICAgICAgICBbZmlsdGVyMF0iZiIoZmlsdGVyWzBdKSwgICAgICAgICAgW2ZpbHRlcjFdImYiKGZpbHRlclsxXSksCisgICAgICAgICAgW2ZpbHRlcjJdImYiKGZpbHRlclsyXSksICAgICAgICAgIFtmaWx0ZXIzXSJmIihmaWx0ZXJbM10pLAorICAgICAgICAgIFtmaWx0ZXI0XSJmIihmaWx0ZXJbNF0pLCAgICAgICAgICBbZmlsdGVyNV0iZiIoZmlsdGVyWzVdKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl82VEFQKHNyYywgZmlsdGVyLCBzcmNzdHJpZGUpOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDRfdjZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIGNvbnN0IHVpbnQ2NF90ICpmaWx0ZXIgPSBmb3VydGFwX3N1YnBlbF9maWx0ZXJzW215IC0gMV07CisgICAgZG91YmxlIGZ0bXBbNl07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIG1pcHNfcmVnIHNyYzE7CisgICAgREVDTEFSRV9WQVJfTE9XMzI7CisKKyAgICAvKgorICAgIGRzdFswXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzBdIC0gZmlsdGVyWzFdKnNyY1swLXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzAtMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1swK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzArMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1swKzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICBkc3RbMV0gPSBjbVsoZmlsdGVyWzJdKnNyY1sxXSAtIGZpbHRlclsxXSpzcmNbMS1zcmNzdHJpZGVdICsgZmlsdGVyWzBdKnNyY1sxLTIqc3Jjc3RyaWRlXSArIGZpbHRlclszXSpzcmNbMStzcmNzdHJpZGVdIC0gZmlsdGVyWzRdKnNyY1sxKzIqc3Jjc3RyaWRlXSArIGZpbHRlcls1XSpzcmNbMSszKnNyY3N0cmlkZV0gKyA2NCkgPj4gN107CisgICAgZHN0WzJdID0gY21bKGZpbHRlclsyXSpzcmNbMl0gLSBmaWx0ZXJbMV0qc3JjWzItc3Jjc3RyaWRlXSArIGZpbHRlclswXSpzcmNbMi0yKnNyY3N0cmlkZV0gKyBmaWx0ZXJbM10qc3JjWzIrc3Jjc3RyaWRlXSAtIGZpbHRlcls0XSpzcmNbMisyKnNyY3N0cmlkZV0gKyBmaWx0ZXJbNV0qc3JjWzIrMypzcmNzdHJpZGVdICsgNjQpID4+IDddOworICAgIGRzdFszXSA9IGNtWyhmaWx0ZXJbMl0qc3JjWzNdIC0gZmlsdGVyWzFdKnNyY1szLXNyY3N0cmlkZV0gKyBmaWx0ZXJbMF0qc3JjWzMtMipzcmNzdHJpZGVdICsgZmlsdGVyWzNdKnNyY1szK3NyY3N0cmlkZV0gLSBmaWx0ZXJbNF0qc3JjWzMrMipzcmNzdHJpZGVdICsgZmlsdGVyWzVdKnNyY1szKzMqc3Jjc3RyaWRlXSArIDY0KSA+PiA3XTsKKyAgICAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBVVF9WUDhfRVBFTDRfVjZfTU1JKCVbc3JjXSwgJVtzcmMxXSwgJVtkc3RdLCAlW3NyY3N0cmlkZV0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3Jjc3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0c3RyaWRlXSAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFtzcmMxXSI9JnIiKHNyYzEpLAorICAgICAgICAgIFtoXSIrJnIiKGgpLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYykKKyAgICAgICAgOiBbZmZfcHdfNjRdImYiKGZmX3B3XzY0KSwKKyAgICAgICAgICBbc3Jjc3RyaWRlXSJyIigobWlwc19yZWcpc3Jjc3RyaWRlKSwKKyAgICAgICAgICBbZHN0c3RyaWRlXSJyIigobWlwc19yZWcpZHN0c3RyaWRlKSwKKyAgICAgICAgICBbZmlsdGVyMF0iZiIoZmlsdGVyWzBdKSwgICAgICAgICAgW2ZpbHRlcjFdImYiKGZpbHRlclsxXSksCisgICAgICAgICAgW2ZpbHRlcjJdImYiKGZpbHRlclsyXSksICAgICAgICAgIFtmaWx0ZXIzXSJmIihmaWx0ZXJbM10pLAorICAgICAgICAgIFtmaWx0ZXI0XSJmIihmaWx0ZXJbNF0pLCAgICAgICAgICBbZmlsdGVyNV0iZiIoZmlsdGVyWzVdKQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl82VEFQKHNyYywgZmlsdGVyLCBzcmNzdHJpZGUpOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDE2X2g0djRfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCB0bXBfYXJyYXlbNTYwXSk7CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgc3JjIC09IHNyY3N0cmlkZTsKKyAgICBmZl9wdXRfdnA4X2VwZWwxNl9oNF9tbWkodG1wLCAxNiwgc3JjLCBzcmNzdHJpZGUsIGggKyAzLCBteCwgbXkpOworICAgIHRtcCA9IHRtcF9hcnJheSArIDE2OworICAgIGZmX3B1dF92cDhfZXBlbDE2X3Y0X21taShkc3QsIGRzdHN0cmlkZSwgdG1wLCAxNiwgaCwgbXgsIG15KTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKyAgICB1aW50OF90IHRtcF9hcnJheVs1NjBdOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSBzcmNzdHJpZGU7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaCArIDM7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IEZJTFRFUl80VEFQKHNyYywgZmlsdGVyLCAxKTsKKyAgICAgICAgdG1wICs9IDE2OworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIDE2OworICAgIGZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW215IC0gMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gRklMVEVSXzRUQVAodG1wLCBmaWx0ZXIsIDE2KTsKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICAgICAgdG1wICs9IDE2OworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDhfaDR2NF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIHRtcF9hcnJheVsxNTJdKTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBzcmMgLT0gc3Jjc3RyaWRlOworICAgIGZmX3B1dF92cDhfZXBlbDhfaDRfbW1pKHRtcCwgOCwgc3JjLCBzcmNzdHJpZGUsIGggKyAzLCBteCwgbXkpOworICAgIHRtcCA9IHRtcF9hcnJheSArIDg7CisgICAgZmZfcHV0X3ZwOF9lcGVsOF92NF9tbWkoZHN0LCBkc3RzdHJpZGUsIHRtcCwgOCwgaCwgbXgsIG15KTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKyAgICB1aW50OF90IHRtcF9hcnJheVsxNTJdOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSBzcmNzdHJpZGU7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaCArIDM7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgdG1wW3hdID0gRklMVEVSXzRUQVAoc3JjLCBmaWx0ZXIsIDEpOworICAgICAgICB0bXAgKz0gODsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICB9CisKKyAgICB0bXAgICAgPSB0bXBfYXJyYXkgKyA4OworICAgIGZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW215IC0gMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfNFRBUCh0bXAsIGZpbHRlciwgOCk7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHRtcCArPSA4OworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDRfaDR2NF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgREVDTEFSRV9BTElHTkVEKDQsIHVpbnQ4X3QsIHRtcF9hcnJheVs0NF0pOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSBzcmNzdHJpZGU7CisgICAgZmZfcHV0X3ZwOF9lcGVsNF9oNF9tbWkodG1wLCA0LCBzcmMsIHNyY3N0cmlkZSwgaCArIDMsIG14LCBteSk7CisgICAgdG1wID0gdG1wX2FycmF5ICsgNDsKKyAgICBmZl9wdXRfdnA4X2VwZWw0X3Y0X21taShkc3QsIGRzdHN0cmlkZSwgdG1wLCA0LCBoLCBteCwgbXkpOworI2Vsc2UKKyAgICBjb25zdCB1aW50OF90ICpmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGNvbnN0IHVpbnQ4X3QgKmNtICAgICA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCB4LCB5OworICAgIHVpbnQ4X3QgdG1wX2FycmF5WzQ0XTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBzcmMgLT0gc3Jjc3RyaWRlOworCisgICAgZm9yICh5ID0gMDsgeSA8IGggKyAzOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IEZJTFRFUl80VEFQKHNyYywgZmlsdGVyLCAxKTsKKyAgICAgICAgdG1wICs9IDQ7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorICAgIHRtcCAgICA9IHRtcF9hcnJheSArIDQ7CisgICAgZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl80VEFQKHRtcCwgZmlsdGVyLCA0KTsKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICAgICAgdG1wICs9IDQ7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsMTZfaDR2Nl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIHRtcF9hcnJheVs1OTJdKTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBzcmMgLT0gMiAqIHNyY3N0cmlkZTsKKyAgICBmZl9wdXRfdnA4X2VwZWwxNl9oNF9tbWkodG1wLCAxNiwgc3JjLCBzcmNzdHJpZGUsIGggKyA1LCBteCwgbXkpOworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIDMyOworICAgIGZmX3B1dF92cDhfZXBlbDE2X3Y2X21taShkc3QsIGRzdHN0cmlkZSwgdG1wLCAxNiwgaCwgbXgsIG15KTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKyAgICB1aW50OF90IHRtcF9hcnJheVs1OTJdOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSAyICogc3Jjc3RyaWRlOworCisgICAgZm9yICh5ID0gMDsgeSA8IGggKyA1OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCisgICAgICAgICAgICB0bXBbeF0gPSBGSUxURVJfNFRBUChzcmMsIGZpbHRlciwgMSk7CisgICAgICAgIHRtcCArPSAxNjsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICB9CisKKyAgICB0bXAgICAgPSB0bXBfYXJyYXkgKyAzMjsKKyAgICBmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteSAtIDFdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl82VEFQKHRtcCwgZmlsdGVyLCAxNik7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHRtcCArPSAxNjsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2VwZWw4X2g0djZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCB0bXBfYXJyYXlbMTY4XSk7CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgc3JjIC09IDIgKiBzcmNzdHJpZGU7CisgICAgZmZfcHV0X3ZwOF9lcGVsOF9oNF9tbWkodG1wLCA4LCBzcmMsIHNyY3N0cmlkZSwgaCArIDUsIG14LCBteSk7CisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgMTY7CisgICAgZmZfcHV0X3ZwOF9lcGVsOF92Nl9tbWkoZHN0LCBkc3RzdHJpZGUsIHRtcCwgOCwgaCwgbXgsIG15KTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKyAgICB1aW50OF90IHRtcF9hcnJheVsxNjhdOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSAyICogc3Jjc3RyaWRlOworCisgICAgZm9yICh5ID0gMDsgeSA8IGggKyA1OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IEZJTFRFUl80VEFQKHNyYywgZmlsdGVyLCAxKTsKKyAgICAgICAgdG1wICs9IDg7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorCisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgMTY7CisgICAgZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl82VEFQKHRtcCwgZmlsdGVyLCA4KTsKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICAgICAgdG1wICs9IDg7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsNF9oNHY2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworI2lmIDEKKyAgICBERUNMQVJFX0FMSUdORUQoNCwgdWludDhfdCwgdG1wX2FycmF5WzUyXSk7CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgc3JjIC09IDIgKiBzcmNzdHJpZGU7CisgICAgZmZfcHV0X3ZwOF9lcGVsNF9oNF9tbWkodG1wLCA0LCBzcmMsIHNyY3N0cmlkZSwgaCArIDUsIG14LCBteSk7CisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgODsKKyAgICBmZl9wdXRfdnA4X2VwZWw0X3Y2X21taShkc3QsIGRzdHN0cmlkZSwgdG1wLCA0LCBoLCBteCwgbXkpOworI2Vsc2UKKyAgICBjb25zdCB1aW50OF90ICpmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGNvbnN0IHVpbnQ4X3QgKmNtICAgICA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCB4LCB5OworICAgIHVpbnQ4X3QgdG1wX2FycmF5WzUyXTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBzcmMgLT0gMiAqIHNyY3N0cmlkZTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoICsgNTsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICB0bXBbeF0gPSBGSUxURVJfNFRBUChzcmMsIGZpbHRlciwgMSk7CisgICAgICAgIHRtcCArPSA0OworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIDg7CisgICAgZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl82VEFQKHRtcCwgZmlsdGVyLCA0KTsKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICAgICAgdG1wICs9IDQ7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsMTZfaDZ2NF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIHRtcF9hcnJheVs1NjBdKTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBzcmMgLT0gc3Jjc3RyaWRlOworICAgIGZmX3B1dF92cDhfZXBlbDE2X2g2X21taSh0bXAsIDE2LCBzcmMsIHNyY3N0cmlkZSwgaCArIDMsIG14LCBteSk7CisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgMTY7CisgICAgZmZfcHV0X3ZwOF9lcGVsMTZfdjRfbW1pKGRzdCwgZHN0c3RyaWRlLCB0bXAsIDE2LCBoLCBteCwgbXkpOworI2Vsc2UKKyAgICBjb25zdCB1aW50OF90ICpmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGNvbnN0IHVpbnQ4X3QgKmNtICAgICA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCB4LCB5OworICAgIHVpbnQ4X3QgdG1wX2FycmF5WzU2MF07CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgc3JjIC09IHNyY3N0cmlkZTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoICsgMzsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgdG1wW3hdID0gRklMVEVSXzZUQVAoc3JjLCBmaWx0ZXIsIDEpOworICAgICAgICB0bXAgKz0gMTY7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorCisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgMTY7CisgICAgZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfNFRBUCh0bXAsIGZpbHRlciwgMTYpOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgICAgICB0bXAgKz0gMTY7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNnY0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworI2lmIDEKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgdG1wX2FycmF5WzE1Ml0pOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSBzcmNzdHJpZGU7CisgICAgZmZfcHV0X3ZwOF9lcGVsOF9oNl9tbWkodG1wLCA4LCBzcmMsIHNyY3N0cmlkZSwgaCArIDMsIG14LCBteSk7CisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgODsKKyAgICBmZl9wdXRfdnA4X2VwZWw4X3Y0X21taShkc3QsIGRzdHN0cmlkZSwgdG1wLCA4LCBoLCBteCwgbXkpOworI2Vsc2UKKyAgICBjb25zdCB1aW50OF90ICpmaWx0ZXIgPSBzdWJwZWxfZmlsdGVyc1tteCAtIDFdOworICAgIGNvbnN0IHVpbnQ4X3QgKmNtICAgICA9IGZmX2Nyb3BfdGFiICsgTUFYX05FR19DUk9QOworICAgIGludCB4LCB5OworICAgIHVpbnQ4X3QgdG1wX2FycmF5WzE1Ml07CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgc3JjIC09IHNyY3N0cmlkZTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoICsgMzsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICB0bXBbeF0gPSBGSUxURVJfNlRBUChzcmMsIGZpbHRlciwgMSk7CisgICAgICAgIHRtcCArPSA4OworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIDg7CisgICAgZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IEZJTFRFUl80VEFQKHRtcCwgZmlsdGVyLCA4KTsKKyAgICAgICAgZHN0ICs9IGRzdHN0cmlkZTsKKyAgICAgICAgdG1wICs9IDg7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsNF9oNnY0X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworI2lmIDEKKyAgICBERUNMQVJFX0FMSUdORUQoNCwgdWludDhfdCwgdG1wX2FycmF5WzQ0XSk7CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgc3JjIC09IHNyY3N0cmlkZTsKKyAgICBmZl9wdXRfdnA4X2VwZWw0X2g2X21taSh0bXAsIDQsIHNyYywgc3Jjc3RyaWRlLCBoICsgMywgbXgsIG15KTsKKyAgICB0bXAgICAgPSB0bXBfYXJyYXkgKyA0OworICAgIGZmX3B1dF92cDhfZXBlbDRfdjRfbW1pKGRzdCwgZHN0c3RyaWRlLCB0bXAsIDQsIGgsIG14LCBteSk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisgICAgdWludDhfdCB0bXBfYXJyYXlbNDRdOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSBzcmNzdHJpZGU7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaCArIDM7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQorICAgICAgICAgICAgdG1wW3hdID0gRklMVEVSXzZUQVAoc3JjLCBmaWx0ZXIsIDEpOworICAgICAgICB0bXAgKz0gNDsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICB9CisKKyAgICB0bXAgICAgPSB0bXBfYXJyYXkgKyA0OworICAgIGZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW215IC0gMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfNFRBUCh0bXAsIGZpbHRlciwgNCk7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHRtcCArPSA0OworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDE2X2g2djZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCB0bXBfYXJyYXlbNTkyXSk7CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgc3JjIC09IDIgKiBzcmNzdHJpZGU7CisgICAgZmZfcHV0X3ZwOF9lcGVsMTZfaDZfbW1pKHRtcCwgMTYsIHNyYywgc3Jjc3RyaWRlLCBoICsgNSwgbXgsIG15KTsKKyAgICB0bXAgICAgPSB0bXBfYXJyYXkgKyAzMjsKKyAgICBmZl9wdXRfdnA4X2VwZWwxNl92Nl9tbWkoZHN0LCBkc3RzdHJpZGUsIHRtcCwgMTYsIGgsIG14LCBteSk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisgICAgdWludDhfdCB0bXBfYXJyYXlbNTkyXTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBzcmMgLT0gMiAqIHNyY3N0cmlkZTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoICsgNTsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgdG1wW3hdID0gRklMVEVSXzZUQVAoc3JjLCBmaWx0ZXIsIDEpOworICAgICAgICB0bXAgKz0gMTY7CisgICAgICAgIHNyYyArPSBzcmNzdHJpZGU7CisgICAgfQorCisgICAgdG1wICAgID0gdG1wX2FycmF5ICsgMzI7CisgICAgZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXkgLSAxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfNlRBUCh0bXAsIGZpbHRlciwgMTYpOworICAgICAgICBkc3QgKz0gZHN0c3RyaWRlOworICAgICAgICB0bXAgKz0gMTY7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9lcGVsOF9oNnY2X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNyY3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworI2lmIDEKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgdG1wX2FycmF5WzE2OF0pOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSAyICogc3Jjc3RyaWRlOworICAgIGZmX3B1dF92cDhfZXBlbDhfaDZfbW1pKHRtcCwgOCwgc3JjLCBzcmNzdHJpZGUsIGggKyA1LCBteCwgbXkpOworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIDE2OworICAgIGZmX3B1dF92cDhfZXBlbDhfdjZfbW1pKGRzdCwgZHN0c3RyaWRlLCB0bXAsIDgsIGgsIG14LCBteSk7CisjZWxzZQorICAgIGNvbnN0IHVpbnQ4X3QgKmZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW214IC0gMV07CisgICAgY29uc3QgdWludDhfdCAqY20gICAgID0gZmZfY3JvcF90YWIgKyBNQVhfTkVHX0NST1A7CisgICAgaW50IHgsIHk7CisgICAgdWludDhfdCB0bXBfYXJyYXlbMTY4XTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBzcmMgLT0gMiAqIHNyY3N0cmlkZTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoICsgNTsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICB0bXBbeF0gPSBGSUxURVJfNlRBUChzcmMsIGZpbHRlciwgMSk7CisgICAgICAgIHRtcCArPSA4OworICAgICAgICBzcmMgKz0gc3Jjc3RyaWRlOworICAgIH0KKworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIDE2OworICAgIGZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW215IC0gMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfNlRBUCh0bXAsIGZpbHRlciwgOCk7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHRtcCArPSA4OworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfZXBlbDRfaDZ2Nl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0c3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgREVDTEFSRV9BTElHTkVEKDQsIHVpbnQ4X3QsIHRtcF9hcnJheVs1Ml0pOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIHNyYyAtPSAyICogc3Jjc3RyaWRlOworICAgIGZmX3B1dF92cDhfZXBlbDRfaDZfbW1pKHRtcCwgNCwgc3JjLCBzcmNzdHJpZGUsIGggKyA1LCBteCwgbXkpOworICAgIHRtcCAgICA9IHRtcF9hcnJheSArIDg7CisgICAgZmZfcHV0X3ZwOF9lcGVsNF92Nl9tbWkoZHN0LCBkc3RzdHJpZGUsIHRtcCwgNCwgaCwgbXgsIG15KTsKKyNlbHNlCisgICAgY29uc3QgdWludDhfdCAqZmlsdGVyID0gc3VicGVsX2ZpbHRlcnNbbXggLSAxXTsKKyAgICBjb25zdCB1aW50OF90ICpjbSAgICAgPSBmZl9jcm9wX3RhYiArIE1BWF9ORUdfQ1JPUDsKKyAgICBpbnQgeCwgeTsKKyAgICB1aW50OF90IHRtcF9hcnJheVs1Ml07CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgc3JjIC09IDIgKiBzcmNzdHJpZGU7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaCArIDU7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQorICAgICAgICAgICAgdG1wW3hdID0gRklMVEVSXzZUQVAoc3JjLCBmaWx0ZXIsIDEpOworICAgICAgICB0bXAgKz0gNDsKKyAgICAgICAgc3JjICs9IHNyY3N0cmlkZTsKKyAgICB9CisKKyAgICB0bXAgICAgPSB0bXBfYXJyYXkgKyA4OworICAgIGZpbHRlciA9IHN1YnBlbF9maWx0ZXJzW215IC0gMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBGSUxURVJfNlRBUCh0bXAsIGZpbHRlciwgNCk7CisgICAgICAgIGRzdCArPSBkc3RzdHJpZGU7CisgICAgICAgIHRtcCArPSA0OworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXIxNl9oX21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIGludCBhID0gOCAtIG14LCBiID0gbXg7CisgICAgZG91YmxlIGZ0bXBbN107CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIG1pcHNfcmVnIGRzdDAsIHNyYzA7CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKKyAgICAvKgorICAgIGRzdFswXSA9IChhICogc3JjWzBdICsgYiAqIHNyY1sxXSArIDQpID4+IDM7CisgICAgZHN0WzFdID0gKGEgKiBzcmNbMV0gKyBiICogc3JjWzJdICsgNCkgPj4gMzsKKyAgICBkc3RbMl0gPSAoYSAqIHNyY1syXSArIGIgKiBzcmNbM10gKyA0KSA+PiAzOworICAgIGRzdFszXSA9IChhICogc3JjWzNdICsgYiAqIHNyY1s0XSArIDQpID4+IDM7CisgICAgZHN0WzRdID0gKGEgKiBzcmNbNF0gKyBiICogc3JjWzVdICsgNCkgPj4gMzsKKyAgICBkc3RbNV0gPSAoYSAqIHNyY1s1XSArIGIgKiBzcmNbNl0gKyA0KSA+PiAzOworICAgIGRzdFs2XSA9IChhICogc3JjWzZdICsgYiAqIHNyY1s3XSArIDQpID4+IDM7CisgICAgZHN0WzddID0gKGEgKiBzcmNbN10gKyBiICogc3JjWzhdICsgNCkgPj4gMzsKKworICAgIGRzdFsgOF0gPSAoYSAqIHNyY1sgOF0gKyBiICogc3JjWyA5XSArIDQpID4+IDM7CisgICAgZHN0WyA5XSA9IChhICogc3JjWyA5XSArIGIgKiBzcmNbMTBdICsgNCkgPj4gMzsKKyAgICBkc3RbMTBdID0gKGEgKiBzcmNbMTBdICsgYiAqIHNyY1sxMV0gKyA0KSA+PiAzOworICAgIGRzdFsxMV0gPSAoYSAqIHNyY1sxMV0gKyBiICogc3JjWzEyXSArIDQpID4+IDM7CisgICAgZHN0WzEyXSA9IChhICogc3JjWzEyXSArIGIgKiBzcmNbMTNdICsgNCkgPj4gMzsKKyAgICBkc3RbMTNdID0gKGEgKiBzcmNbMTNdICsgYiAqIHNyY1sxNF0gKyA0KSA+PiAzOworICAgIGRzdFsxNF0gPSAoYSAqIHNyY1sxNF0gKyBiICogc3JjWzE1XSArIDQpID4+IDM7CisgICAgZHN0WzE1XSA9IChhICogc3JjWzE1XSArIGIgKiBzcmNbMTZdICsgNCkgPj4gMzsKKyAgICAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2FdLCAgICAgICAlW2FdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2JdLCAgICAgICAlW2JdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIDAgLSA3CisgICAgICAgIFBVVF9WUDhfQklMSU5FQVI4X0hfTU1JKCVbc3JjXSwgJVtkc3RdKQorICAgICAgICBQVFJfQURESVUgICIlW3NyYzBdLCAgICAlW3NyY10sICAgICAgICAgMHgwOCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW2RzdDBdLCAgICAlW2RzdF0sICAgICAgICAgMHgwOCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAvLyA4IC0gMTUKKyAgICAgICAgUFVUX1ZQOF9CSUxJTkVBUjhfSF9NTUkoJVtzcmMwXSwgJVtkc3QwXSkKKworICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzc3RyaWRlXSAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RyaWRlXSAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtkc3QwXSI9JnIiKGRzdDApLCAgICAgICAgICAgIFtzcmMwXSI9JnIiKHNyYzApLAorICAgICAgICAgIFtoXSIrJnIiKGgpLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKSwKKyAgICAgICAgICBbYV0iKyZmIihhKSwgICAgICAgICAgICAgICAgICBbYl0iKyZmIihiKQorICAgICAgICA6IFtzc3RyaWRlXSJyIigobWlwc19yZWcpc3N0cmlkZSksCisgICAgICAgICAgW2RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RyaWRlKSwKKyAgICAgICAgICBbZmZfcHdfNF0iZiIoZmZfcHdfNCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGludCBhID0gOCAtIG14LCBiID0gbXg7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gKGEgKiBzcmNbeF0gKyBiICogc3JjW3ggKyAxXSArIDQpID4+IDM7CisgICAgICAgIGRzdCArPSBkc3RyaWRlOworICAgICAgICBzcmMgKz0gc3N0cmlkZTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyMTZfdl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworI2lmIDEKKyAgICBpbnQgYyA9IDggLSBteSwgZCA9IG15OworICAgIGRvdWJsZSBmdG1wWzddOworICAgIHVpbnQzMl90IHRtcFsxXTsKKyAgICBtaXBzX3JlZyBzcmMwLCBzcmMxLCBkc3QwOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgLyoKKyAgICBkc3RbMF0gPSAoYyAqIHNyY1swXSArIGQgKiBzcmNbICAgIHNzdHJpZGVdICsgNCkgPj4gMzsKKyAgICBkc3RbMV0gPSAoYyAqIHNyY1sxXSArIGQgKiBzcmNbMSArIHNzdHJpZGVdICsgNCkgPj4gMzsKKyAgICBkc3RbMl0gPSAoYyAqIHNyY1syXSArIGQgKiBzcmNbMiArIHNzdHJpZGVdICsgNCkgPj4gMzsKKyAgICBkc3RbM10gPSAoYyAqIHNyY1szXSArIGQgKiBzcmNbMyArIHNzdHJpZGVdICsgNCkgPj4gMzsKKyAgICBkc3RbNF0gPSAoYyAqIHNyY1s0XSArIGQgKiBzcmNbNCArIHNzdHJpZGVdICsgNCkgPj4gMzsKKyAgICBkc3RbNV0gPSAoYyAqIHNyY1s1XSArIGQgKiBzcmNbNSArIHNzdHJpZGVdICsgNCkgPj4gMzsKKyAgICBkc3RbNl0gPSAoYyAqIHNyY1s2XSArIGQgKiBzcmNbNiArIHNzdHJpZGVdICsgNCkgPj4gMzsKKyAgICBkc3RbN10gPSAoYyAqIHNyY1s3XSArIGQgKiBzcmNbNyArIHNzdHJpZGVdICsgNCkgPj4gMzsKKyAgICAqLworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgICAlW3RtcDBdLCAgICAweDAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXRjMSAgICAgICAlW3RtcDBdLCAgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2NdLCAgICAgICAlW2NdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorICAgICAgICAicHNodWZoICAgICAlW2RdLCAgICAgICAlW2RdLCAgICAgICAgICAgJVtmdG1wMF0gICAgICAgICAgICBcblx0IgorCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIC8vIDAgLSA3CisgICAgICAgIFBVVF9WUDhfQklMSU5FQVI4X1ZfTU1JKCVbc3JjXSwgJVtzcmMxXSwgJVtkc3RdLCAlW3NzdHJpZGVdKQorICAgICAgICBQVFJfQURESVUgICIlW3NyYzBdLCAgICAlW3NyY10sICAgICAgICAgMHgwOCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQURESVUgICIlW2RzdDBdLCAgICAlW2RzdF0sICAgICAgICAgMHgwOCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAvLyA4IC0gMTUKKyAgICAgICAgUFVUX1ZQOF9CSUxJTkVBUjhfVl9NTUkoJVtzcmMwXSwgJVtzcmMxXSwgJVtkc3QwXSwgJVtzc3RyaWRlXSkKKworICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzc3RyaWRlXSAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RyaWRlXSAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgW2Z0bXA1XSI9JmYiKGZ0bXBbNV0pLAorICAgICAgICAgIFtmdG1wNl0iPSZmIihmdG1wWzZdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtzcmMwXSI9JnIiKHNyYzApLCAgICAgICAgICAgIFtkc3QwXSI9JnIiKGRzdDApLAorICAgICAgICAgIFtzcmMxXSI9JnIiKHNyYzEpLAorICAgICAgICAgIFtoXSIrJnIiKGgpLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKSwKKyAgICAgICAgICBbY10iKyZmIihjKSwgICAgICAgICAgICAgICAgICBbZF0iKyZmIihkKQorICAgICAgICA6IFtzc3RyaWRlXSJyIigobWlwc19yZWcpc3N0cmlkZSksCisgICAgICAgICAgW2RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RyaWRlKSwKKyAgICAgICAgICBbZmZfcHdfNF0iZiIoZmZfcHdfNCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGludCBjID0gOCAtIG15LCBkID0gbXk7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gKGMgKiBzcmNbeF0gKyBkICogc3JjW3ggKyBzc3RyaWRlXSArIDQpID4+IDM7CisgICAgICAgIGRzdCArPSBkc3RyaWRlOworICAgICAgICBzcmMgKz0gc3N0cmlkZTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyMTZfaHZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIHRtcF9hcnJheVs1MjhdKTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBmZl9wdXRfdnA4X2JpbGluZWFyMTZfaF9tbWkodG1wLCAxNiwgc3JjLCBzc3RyaWRlLCBoICsgMSwgbXgsIG15KTsKKyAgICBmZl9wdXRfdnA4X2JpbGluZWFyMTZfdl9tbWkoZHN0LCBkc3RyaWRlLCB0bXAsIDE2LCBoLCBteCwgbXkpOworI2Vsc2UKKyAgICBpbnQgYSA9IDggLSBteCwgYiA9IG14OworICAgIGludCBjID0gOCAtIG15LCBkID0gbXk7CisgICAgaW50IHgsIHk7CisgICAgdWludDhfdCB0bXBfYXJyYXlbNTI4XTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaCArIDE7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IChhICogc3JjW3hdICsgYiAqIHNyY1t4ICsgMV0gKyA0KSA+PiAzOworICAgICAgICB0bXAgKz0gMTY7CisgICAgICAgIHNyYyArPSBzc3RyaWRlOworICAgIH0KKworICAgIHRtcCA9IHRtcF9hcnJheTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSAoYyAqIHRtcFt4XSArIGQgKiB0bXBbeCArIDE2XSArIDQpID4+IDM7CisgICAgICAgIGRzdCArPSBkc3RyaWRlOworICAgICAgICB0bXAgKz0gMTY7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjhfaF9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworI2lmIDEKKyAgICBpbnQgYSA9IDggLSBteCwgYiA9IG14OworICAgIGRvdWJsZSBmdG1wWzddOworICAgIHVpbnQzMl90IHRtcFsxXTsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIC8qCisgICAgZHN0WzBdID0gKGEgKiBzcmNbMF0gKyBiICogc3JjWzFdICsgNCkgPj4gMzsKKyAgICBkc3RbMV0gPSAoYSAqIHNyY1sxXSArIGIgKiBzcmNbMl0gKyA0KSA+PiAzOworICAgIGRzdFsyXSA9IChhICogc3JjWzJdICsgYiAqIHNyY1szXSArIDQpID4+IDM7CisgICAgZHN0WzNdID0gKGEgKiBzcmNbM10gKyBiICogc3JjWzRdICsgNCkgPj4gMzsKKyAgICBkc3RbNF0gPSAoYSAqIHNyY1s0XSArIGIgKiBzcmNbNV0gKyA0KSA+PiAzOworICAgIGRzdFs1XSA9IChhICogc3JjWzVdICsgYiAqIHNyY1s2XSArIDQpID4+IDM7CisgICAgZHN0WzZdID0gKGEgKiBzcmNbNl0gKyBiICogc3JjWzddICsgNCkgPj4gMzsKKyAgICBkc3RbN10gPSAoYSAqIHNyY1s3XSArIGIgKiBzcmNbOF0gKyA0KSA+PiAzOworICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbYV0sICAgICAgICVbYV0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbYl0sICAgICAgICVbYl0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFVUX1ZQOF9CSUxJTkVBUjhfSF9NTUkoJVtzcmNdLCAlW2RzdF0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3N0cmlkZV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0cmlkZV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbaF0iKyZyIihoKSwKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgW2FdIismZiIoYSksICAgICAgICAgICAgICAgICAgW2JdIismZiIoYikKKyAgICAgICAgOiBbc3N0cmlkZV0iciIoKG1pcHNfcmVnKXNzdHJpZGUpLAorICAgICAgICAgIFtkc3RyaWRlXSJyIigobWlwc19yZWcpZHN0cmlkZSksCisgICAgICAgICAgW2ZmX3B3XzRdImYiKGZmX3B3XzQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBpbnQgYSA9IDggLSBteCwgYiA9IG14OworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gKGEgKiBzcmNbeF0gKyBiICogc3JjW3ggKyAxXSArIDQpID4+IDM7CisgICAgICAgIGRzdCArPSBkc3RyaWRlOworICAgICAgICBzcmMgKz0gc3N0cmlkZTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyOF92X21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIGludCBjID0gOCAtIG15LCBkID0gbXk7CisgICAgZG91YmxlIGZ0bXBbN107CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIG1pcHNfcmVnIHNyYzE7CisgICAgREVDTEFSRV9WQVJfQUxMNjQ7CisKKyAgICAvKgorICAgIGRzdFswXSA9IChjICogc3JjWzBdICsgZCAqIHNyY1sgICAgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgIGRzdFsxXSA9IChjICogc3JjWzFdICsgZCAqIHNyY1sxICsgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgIGRzdFsyXSA9IChjICogc3JjWzJdICsgZCAqIHNyY1syICsgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgIGRzdFszXSA9IChjICogc3JjWzNdICsgZCAqIHNyY1szICsgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgIGRzdFs0XSA9IChjICogc3JjWzRdICsgZCAqIHNyY1s0ICsgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgIGRzdFs1XSA9IChjICogc3JjWzVdICsgZCAqIHNyY1s1ICsgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgIGRzdFs2XSA9IChjICogc3JjWzZdICsgZCAqIHNyY1s2ICsgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgIGRzdFs3XSA9IChjICogc3JjWzddICsgZCAqIHNyY1s3ICsgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbY10sICAgICAgICVbY10sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbZF0sICAgICAgICVbZF0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFVUX1ZQOF9CSUxJTkVBUjhfVl9NTUkoJVtzcmNdLCAlW3NyYzFdLCAlW2RzdF0sICVbc3N0cmlkZV0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3N0cmlkZV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0cmlkZV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksCisgICAgICAgICAgW3RtcDBdIj0mciIodG1wWzBdKSwKKyAgICAgICAgICBSRVNUUklDVF9BU01fQUxMNjQKKyAgICAgICAgICBbc3JjMV0iPSZyIihzcmMxKSwKKyAgICAgICAgICBbaF0iKyZyIihoKSwKKyAgICAgICAgICBbZHN0XSIrJnIiKGRzdCksICAgICAgICAgICAgICBbc3JjXSIrJnIiKHNyYyksCisgICAgICAgICAgW2NdIismZiIoYyksICAgICAgICAgICAgICAgICAgW2RdIismZiIoZCkKKyAgICAgICAgOiBbc3N0cmlkZV0iciIoKG1pcHNfcmVnKXNzdHJpZGUpLAorICAgICAgICAgIFtkc3RyaWRlXSJyIigobWlwc19yZWcpZHN0cmlkZSksCisgICAgICAgICAgW2ZmX3B3XzRdImYiKGZmX3B3XzQpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworI2Vsc2UKKyAgICBpbnQgYyA9IDggLSBteSwgZCA9IG15OworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gKGMgKiBzcmNbeF0gKyBkICogc3JjW3ggKyBzc3RyaWRlXSArIDQpID4+IDM7CisgICAgICAgIGRzdCArPSBkc3RyaWRlOworICAgICAgICBzcmMgKz0gc3N0cmlkZTsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyOF9odl9tbWkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0cmlkZSwgdWludDhfdCAqc3JjLAorICAgICAgICBwdHJkaWZmX3Qgc3N0cmlkZSwgaW50IGgsIGludCBteCwgaW50IG15KQoreworI2lmIDEKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgdG1wX2FycmF5WzEzNl0pOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIGZmX3B1dF92cDhfYmlsaW5lYXI4X2hfbW1pKHRtcCwgOCwgc3JjLCBzc3RyaWRlLCBoICsgMSwgbXgsIG15KTsKKyAgICBmZl9wdXRfdnA4X2JpbGluZWFyOF92X21taShkc3QsIGRzdHJpZGUsIHRtcCwgOCwgaCwgbXgsIG15KTsKKyNlbHNlCisgICAgaW50IGEgPSA4IC0gbXgsIGIgPSBteDsKKyAgICBpbnQgYyA9IDggLSBteSwgZCA9IG15OworICAgIGludCB4LCB5OworICAgIHVpbnQ4X3QgdG1wX2FycmF5WzEzNl07CisgICAgdWludDhfdCAqdG1wID0gdG1wX2FycmF5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGggKyAxOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykKKyAgICAgICAgICAgIHRtcFt4XSA9IChhICogc3JjW3hdICsgYiAqIHNyY1t4ICsgMV0gKyA0KSA+PiAzOworICAgICAgICB0bXAgKz0gODsKKyAgICAgICAgc3JjICs9IHNzdHJpZGU7CisgICAgfQorCisgICAgdG1wID0gdG1wX2FycmF5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgODsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gKGMgKiB0bXBbeF0gKyBkICogdG1wW3ggKyA4XSArIDQpID4+IDM7CisgICAgICAgIGRzdCArPSBkc3RyaWRlOworICAgICAgICB0bXAgKz0gODsKKyAgICB9CisjZW5kaWYKK30KKwordm9pZCBmZl9wdXRfdnA4X2JpbGluZWFyNF9oX21taSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RyaWRlLCB1aW50OF90ICpzcmMsCisgICAgICAgIHB0cmRpZmZfdCBzc3RyaWRlLCBpbnQgaCwgaW50IG14LCBpbnQgbXkpCit7CisjaWYgMQorICAgIGludCBhID0gOCAtIG14LCBiID0gbXg7CisgICAgZG91YmxlIGZ0bXBbNV07CisgICAgdWludDMyX3QgdG1wWzFdOworICAgIERFQ0xBUkVfVkFSX0xPVzMyOworICAgIERFQ0xBUkVfVkFSX0FMTDY0OworCisgICAgLyoKKyAgICBkc3RbMF0gPSAoYSAqIHNyY1swXSArIGIgKiBzcmNbMV0gKyA0KSA+PiAzOworICAgIGRzdFsxXSA9IChhICogc3JjWzFdICsgYiAqIHNyY1syXSArIDQpID4+IDM7CisgICAgZHN0WzJdID0gKGEgKiBzcmNbMl0gKyBiICogc3JjWzNdICsgNCkgPj4gMzsKKyAgICBkc3RbM10gPSAoYSAqIHNyY1szXSArIGIgKiBzcmNbNF0gKyA0KSA+PiAzOworICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJ4b3IgICAgICAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsaSAgICAgICAgICVbdG1wMF0sICAgIDB4MDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdGMxICAgICAgICVbdG1wMF0sICAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbYV0sICAgICAgICVbYV0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwc2h1ZmggICAgICVbYl0sICAgICAgICVbYl0sICAgICAgICAgICAlW2Z0bXAwXSAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFVUX1ZQOF9CSUxJTkVBUjRfSF9NTUkoJVtzcmNdLCAlW2RzdF0pCisKKyAgICAgICAgImFkZGl1ICAgICAgJVtoXSwgICAgICAgJVtoXSwgICAgICAgICAgIC0weDAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtzcmNdLCAgICAgJVtzcmNdLCAgICAgICAgICVbc3N0cmlkZV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkc3RdLCAgICAgJVtkc3RdLCAgICAgICAgICVbZHN0cmlkZV0gICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZXogICAgICAgJVtoXSwgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICBbZnRtcDFdIj0mZiIoZnRtcFsxXSksCisgICAgICAgICAgW2Z0bXAyXSI9JmYiKGZ0bXBbMl0pLCAgICAgICAgW2Z0bXAzXSI9JmYiKGZ0bXBbM10pLAorICAgICAgICAgIFtmdG1wNF0iPSZmIihmdG1wWzRdKSwKKyAgICAgICAgICBbdG1wMF0iPSZyIih0bXBbMF0pLAorICAgICAgICAgIFJFU1RSSUNUX0FTTV9MT1czMgorICAgICAgICAgIFJFU1RSSUNUX0FTTV9BTEw2NAorICAgICAgICAgIFtoXSIrJnIiKGgpLAorICAgICAgICAgIFtkc3RdIismciIoZHN0KSwgICAgICAgICAgICAgIFtzcmNdIismciIoc3JjKSwKKyAgICAgICAgICBbYV0iKyZmIihhKSwgICAgICAgICAgICAgICAgICBbYl0iKyZmIihiKQorICAgICAgICA6IFtzc3RyaWRlXSJyIigobWlwc19yZWcpc3N0cmlkZSksCisgICAgICAgICAgW2RzdHJpZGVdInIiKChtaXBzX3JlZylkc3RyaWRlKSwKKyAgICAgICAgICBbZmZfcHdfNF0iZiIoZmZfcHdfNCkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisjZWxzZQorICAgIGludCBhID0gOCAtIG14LCBiID0gbXg7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSAoYSAqIHNyY1t4XSArIGIgKiBzcmNbeCArIDFdICsgNCkgPj4gMzsKKyAgICAgICAgZHN0ICs9IGRzdHJpZGU7CisgICAgICAgIHNyYyArPSBzc3RyaWRlOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkIGZmX3B1dF92cDhfYmlsaW5lYXI0X3ZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgaW50IGMgPSA4IC0gbXksIGQgPSBteTsKKyAgICBkb3VibGUgZnRtcFs3XTsKKyAgICB1aW50MzJfdCB0bXBbMV07CisgICAgbWlwc19yZWcgc3JjMTsKKyAgICBERUNMQVJFX1ZBUl9MT1czMjsKKyAgICBERUNMQVJFX1ZBUl9BTEw2NDsKKworICAgIC8qCisgICAgZHN0WzBdID0gKGMgKiBzcmNbMF0gKyBkICogc3JjWyAgICBzc3RyaWRlXSArIDQpID4+IDM7CisgICAgZHN0WzFdID0gKGMgKiBzcmNbMV0gKyBkICogc3JjWzEgKyBzc3RyaWRlXSArIDQpID4+IDM7CisgICAgZHN0WzJdID0gKGMgKiBzcmNbMl0gKyBkICogc3JjWzIgKyBzc3RyaWRlXSArIDQpID4+IDM7CisgICAgZHN0WzNdID0gKGMgKiBzcmNbM10gKyBkICogc3JjWzMgKyBzc3RyaWRlXSArIDQpID4+IDM7CisgICAgKi8KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInhvciAgICAgICAgJVtmdG1wMF0sICAgJVtmdG1wMF0sICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICAgJVt0bXAwXSwgICAgMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm10YzEgICAgICAgJVt0bXAwXSwgICAgJVtmdG1wNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtjXSwgICAgICAgJVtjXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzaHVmaCAgICAgJVtkXSwgICAgICAgJVtkXSwgICAgICAgICAgICVbZnRtcDBdICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVVRfVlA4X0JJTElORUFSNF9WX01NSSglW3NyY10sICVbc3JjMV0sICVbZHN0XSwgJVtzc3RyaWRlXSkKKworICAgICAgICAiYWRkaXUgICAgICAlW2hdLCAgICAgICAlW2hdLCAgICAgICAgICAgLTB4MDEgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW3NyY10sICAgICAlW3NyY10sICAgICAgICAgJVtzc3RyaWRlXSAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2RzdF0sICAgICAlW2RzdF0sICAgICAgICAgJVtkc3RyaWRlXSAgICAgICAgICBcblx0IgorICAgICAgICAiYm5leiAgICAgICAlW2hdLCAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFtmdG1wMF0iPSZmIihmdG1wWzBdKSwgICAgICAgIFtmdG1wMV0iPSZmIihmdG1wWzFdKSwKKyAgICAgICAgICBbZnRtcDJdIj0mZiIoZnRtcFsyXSksICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLAorICAgICAgICAgIFt0bXAwXSI9JnIiKHRtcFswXSksCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0xPVzMyCisgICAgICAgICAgUkVTVFJJQ1RfQVNNX0FMTDY0CisgICAgICAgICAgW3NyYzFdIj0mciIoc3JjMSksCisgICAgICAgICAgW2hdIismciIoaCksCisgICAgICAgICAgW2RzdF0iKyZyIihkc3QpLCAgICAgICAgICAgICAgW3NyY10iKyZyIihzcmMpLAorICAgICAgICAgIFtjXSIrJmYiKGMpLCAgICAgICAgICAgICAgICAgIFtkXSIrJmYiKGQpCisgICAgICAgIDogW3NzdHJpZGVdInIiKChtaXBzX3JlZylzc3RyaWRlKSwKKyAgICAgICAgICBbZHN0cmlkZV0iciIoKG1pcHNfcmVnKWRzdHJpZGUpLAorICAgICAgICAgIFtmZl9wd180XSJmIihmZl9wd180KQorICAgICAgICA6ICJtZW1vcnkiCisgICAgKTsKKyNlbHNlCisgICAgaW50IGMgPSA4IC0gbXksIGQgPSBteTsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSA9IChjICogc3JjW3hdICsgZCAqIHNyY1t4ICsgc3N0cmlkZV0gKyA0KSA+PiAzOworICAgICAgICBkc3QgKz0gZHN0cmlkZTsKKyAgICAgICAgc3JjICs9IHNzdHJpZGU7CisgICAgfQorI2VuZGlmCit9CisKK3ZvaWQgZmZfcHV0X3ZwOF9iaWxpbmVhcjRfaHZfbW1pKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdHJpZGUsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgcHRyZGlmZl90IHNzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKK3sKKyNpZiAxCisgICAgREVDTEFSRV9BTElHTkVEKDQsIHVpbnQ4X3QsIHRtcF9hcnJheVszNl0pOworICAgIHVpbnQ4X3QgKnRtcCA9IHRtcF9hcnJheTsKKworICAgIGZmX3B1dF92cDhfYmlsaW5lYXI0X2hfbW1pKHRtcCwgNCwgc3JjLCBzc3RyaWRlLCBoICsgMSwgbXgsIG15KTsKKyAgICBmZl9wdXRfdnA4X2JpbGluZWFyNF92X21taShkc3QsIGRzdHJpZGUsIHRtcCwgNCwgaCwgbXgsIG15KTsKKyNlbHNlCisgICAgaW50IGEgPSA4IC0gbXgsIGIgPSBteDsKKyAgICBpbnQgYyA9IDggLSBteSwgZCA9IG15OworICAgIGludCB4LCB5OworICAgIHVpbnQ4X3QgdG1wX2FycmF5WzM2XTsKKyAgICB1aW50OF90ICp0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaCArIDE7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKQorICAgICAgICAgICAgdG1wW3hdID0gKGEgKiBzcmNbeF0gKyBiICogc3JjW3ggKyAxXSArIDQpID4+IDM7CisgICAgICAgIHRtcCArPSA0OworICAgICAgICBzcmMgKz0gc3N0cmlkZTsKKyAgICB9CisKKyAgICB0bXAgPSB0bXBfYXJyYXk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSAoYyAqIHRtcFt4XSArIGQgKiB0bXBbeCArIDRdICsgNCkgPj4gMzsKKyAgICAgICAgZHN0ICs9IGRzdHJpZGU7CisgICAgICAgIHRtcCArPSA0OworICAgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3ZwOV9pZGN0X21zYS5jIGIvbGliYXZjb2RlYy9taXBzL3ZwOV9pZGN0X21zYS5jCmluZGV4IDI1ZWExNmMuLmJkNzYyZjIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWlwcy92cDlfaWRjdF9tc2EuYworKysgYi9saWJhdmNvZGVjL21pcHMvdnA5X2lkY3RfbXNhLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1IFNoaXZyYWogUGF0aWwgKFNoaXZyYWouUGF0aWxAaW1ndGVjLmNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAxNSAtIDIwMTcgU2hpdnJhaiBQYXRpbCAoU2hpdnJhai5QYXRpbEBpbWd0ZWMuY29tKQogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0zNTIsNiArMzUyLDcgQEAKICAgICBvdXQgPSBST1VORF9QT1dFUl9PRl9UV08oKG91dCAqIGNvc3BpXzE2XzY0KSwgVlA5X0RDVF9DT05TVF9CSVRTKTsKICAgICBvdXQgPSBST1VORF9QT1dFUl9PRl9UV08ob3V0LCA0KTsKICAgICB2ZWMgPSBfX21zYV9maWxsX2gob3V0KTsKKyAgICBpbnB1dFswXSA9IDA7CiAKICAgICBBRERCTEtfU1Q0eDRfVUIodmVjLCB2ZWMsIHZlYywgdmVjLCBkc3QsIGRzdF9zdHJpZGUpOwogfQpAQCAtMzYwLDkgKzM2MSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlKQogewogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKKyAgICB2OGkxNiB6ZXJvID0geyAwIH07CiAKICAgICAvKiBsb2FkIHZlY3RvciBlbGVtZW50cyBvZiA0eDQgYmxvY2sgKi8KICAgICBMRDR4NF9TSChpbnB1dCwgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgICBTVF9TSDIoemVybywgemVybywgaW5wdXQsIDgpOwogICAgIC8qIHJvd3MgKi8KICAgICBWUDlfSURDVDR4NChpbjAsIGluMSwgaW4yLCBpbjMsIGluMCwgaW4xLCBpbjIsIGluMyk7CiAgICAgLyogY29sdW1ucyAqLwpAQCAtMzc3LDkgKzM4MCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSkKIHsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjM7CisgICAgdjhpMTYgemVybyA9IHsgMCB9OwogCiAgICAgLyogbG9hZCB2ZWN0b3IgZWxlbWVudHMgb2YgNHg0IGJsb2NrICovCiAgICAgTEQ0eDRfU0goaW5wdXQsIGluMCwgaW4xLCBpbjIsIGluMyk7CisgICAgU1RfU0gyKHplcm8sIHplcm8sIGlucHV0LCA4KTsKICAgICAvKiByb3dzICovCiAgICAgVlA5X0lBRFNUNHg0KGluMCwgaW4xLCBpbjIsIGluMywgaW4wLCBpbjEsIGluMiwgaW4zKTsKICAgICAvKiBjb2x1bW5zICovCkBAIC0zOTQsOSArMzk5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsIGludDMyX3QgZW9iKQogewogICAgIHY4aTE2IGluMCwgaW4xLCBpbjIsIGluMzsKKyAgICB2OGkxNiB6ZXJvID0geyAwIH07CiAKICAgICAvKiBsb2FkIHZlY3RvciBlbGVtZW50cyBvZiA0eDQgYmxvY2sgKi8KICAgICBMRDR4NF9TSChpbnB1dCwgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgICBTVF9TSDIoemVybywgemVybywgaW5wdXQsIDgpOwogICAgIC8qIGNvbHMgKi8KICAgICBWUDlfSUFEU1Q0eDQoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjAsIGluMSwgaW4yLCBpbjMpOwogICAgIC8qIGNvbHVtbnMgKi8KQEAgLTQxMSw5ICs0MTgsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwgaW50MzJfdCBlb2IpCiB7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zOworICAgIHY4aTE2IHplcm8gPSB7IDAgfTsKIAogICAgIC8qIGxvYWQgdmVjdG9yIGVsZW1lbnRzIG9mIDR4NCBibG9jayAqLwogICAgIExENHg0X1NIKGlucHV0LCBpbjAsIGluMSwgaW4yLCBpbjMpOworICAgIFNUX1NIMih6ZXJvLCB6ZXJvLCBpbnB1dCwgOCk7CiAgICAgLyogY29scyAqLwogICAgIFZQOV9JRENUNHg0KGluMCwgaW4xLCBpbjIsIGluMywgaW4wLCBpbjEsIGluMiwgaW4zKTsKICAgICAvKiBjb2x1bW5zICovCkBAIC01ODUsNiArNTk0LDcgQEAKICAgICBvdXQgPSBST1VORF9QT1dFUl9PRl9UV08oKG91dCAqIGNvc3BpXzE2XzY0KSwgVlA5X0RDVF9DT05TVF9CSVRTKTsKICAgICB2YWwgPSBST1VORF9QT1dFUl9PRl9UV08ob3V0LCA1KTsKICAgICB2ZWMgPSBfX21zYV9maWxsX2godmFsKTsKKyAgICBpbnB1dFswXSA9IDA7CiAKICAgICBWUDlfQUREQkxLX1NUOHg0X1VCKGRzdCwgZHN0X3N0cmlkZSwgdmVjLCB2ZWMsIHZlYywgdmVjKTsKICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKQEAgLTYwMSw5ICs2MTEsOSBAQAogCiAgICAgLyogbG9hZCB2ZWN0b3IgZWxlbWVudHMgb2YgOHg4IGJsb2NrICovCiAgICAgTERfU0g4KGlucHV0LCA4LCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7CisgICAgU1RfU0g4KHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIGlucHV0LCA4KTsKICAgICBJTFZSX0QyX1NIKGluMSwgaW4wLCBpbjMsIGluMiwgaW4wLCBpbjEpOwogICAgIElMVlJfRDJfU0goaW41LCBpbjQsIGluNywgaW42LCBpbjIsIGluMyk7Ci0gICAgLy9UUkFOU1BPU0U4WDRfU0hfU0goaW4wLCBpbjEsIGluMiwgaW4zLCBpbjAsIGluMSwgaW4yLCBpbjMpOwogCiAgICAgLyogc3RhZ2UxICovCiAgICAgSUxWTF9IMl9TSChpbjMsIGluMCwgaW4yLCBpbjEsIHMwLCBzMSk7CkBAIC02NTksOSArNjY5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUpCiB7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CisgICAgdjhpMTYgemVybyA9IHsgMCB9OwogCiAgICAgLyogbG9hZCB2ZWN0b3IgZWxlbWVudHMgb2YgOHg4IGJsb2NrICovCiAgICAgTERfU0g4KGlucHV0LCA4LCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7CisgICAgU1RfU0g4KHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIGlucHV0LCA4KTsKICAgICAvKiAxRCBpZGN0OHg4ICovCiAgICAgVlA5X0lEQ1Q4eDhfMUQoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsCiAgICAgICAgICAgICAgICAgICAgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcpOwpAQCAtNjg5LDEwICs3MDEsMTEgQEAKICAgICB2OGkxNiBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3OwogICAgIHY4aTE2IGNuc3QwLCBjbnN0MSwgY25zdDIsIGNuc3QzLCBjbnN0NDsKICAgICB2OGkxNiB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgczAsIHMxOwotICAgIHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICB2OGkxNiB6ZXJvID0geyAwIH07CiAKICAgICAvKiBsb2FkIHZlY3RvciBlbGVtZW50cyBvZiA4eDggYmxvY2sgKi8KICAgICBMRF9TSDgoaW5wdXQsIDgsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43KTsKKyAgICBTVF9TSDgoemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgaW5wdXQsIDgpOwogCiAgICAgLyogMUQgYWRzdDh4OCAqLwogICAgIFZQOV9BRFNUOChpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywKQEAgLTczNiwxMyArNzQ5LDEzIEBACiAgICAgZHN0MCA9IExEX1VCKGRzdCArIDAgKiBkc3Rfc3RyaWRlKTsKICAgICBkc3Q3ID0gTERfVUIoZHN0ICsgNyAqIGRzdF9zdHJpZGUpOwogCi0gICAgcmVzMCA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOCkgZHN0MCk7CisgICAgcmVzMCA9ICh2OGkxNikgX19tc2FfaWx2cl9iKCh2MTZpOCkgemVybywgKHYxNmk4KSBkc3QwKTsKICAgICByZXMwICs9IG91dDA7CiAgICAgcmVzMCA9IENMSVBfU0hfMF8yNTUocmVzMCk7CiAgICAgcmVzMCA9ICh2OGkxNikgX19tc2FfcGNrZXZfYigodjE2aTgpIHJlczAsICh2MTZpOCkgcmVzMCk7CiAgICAgU1Q4eDFfVUIocmVzMCwgZHN0KTsKIAotICAgIHJlczcgPSAodjhpMTYpIF9fbXNhX2lsdnJfYih6ZXJvLCAodjE2aTgpIGRzdDcpOworICAgIHJlczcgPSAodjhpMTYpIF9fbXNhX2lsdnJfYigodjE2aTgpIHplcm8sICh2MTZpOCkgZHN0Nyk7CiAgICAgcmVzNyArPSBvdXQ3OwogICAgIHJlczcgPSBDTElQX1NIXzBfMjU1KHJlczcpOwogICAgIHJlczcgPSAodjhpMTYpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSByZXM3LCAodjE2aTgpIHJlczcpOwpAQCAtODA5LDkgKzgyMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlLCBpbnQzMl90IGVvYikKIHsKICAgICB2OGkxNiBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNzsKKyAgICB2OGkxNiB6ZXJvID0geyAwIH07CiAKICAgICAvKiBsb2FkIHZlY3RvciBlbGVtZW50cyBvZiA4eDggYmxvY2sgKi8KICAgICBMRF9TSDgoaW5wdXQsIDgsIGluMSwgaW42LCBpbjMsIGluNCwgaW41LCBpbjIsIGluNywgaW4wKTsKKyAgICBTVF9TSDgoemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgaW5wdXQsIDgpOwogICAgIC8qIDFEIGlkY3Q4eDggKi8KICAgICBWUDlfSUFEU1Q4eDhfMUQoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsCiAgICAgICAgICAgICAgICAgICAgIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43KTsKQEAgLTgzNCw5ICs4NDksMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZSwgaW50MzJfdCBlb2IpCiB7CiAgICAgdjhpMTYgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjc7CisgICAgdjhpMTYgemVybyA9IHsgMCB9OwogCiAgICAgLyogbG9hZCB2ZWN0b3IgZWxlbWVudHMgb2YgOHg4IGJsb2NrICovCiAgICAgTERfU0g4KGlucHV0LCA4LCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNyk7CisgICAgU1RfU0g4KHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIGlucHV0LCA4KTsKIAogICAgIC8qIDFEIGlkY3Q4eDggKi8KICAgICBWUDlfSURDVDh4OF8xRChpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywKQEAgLTkzNywxMiArOTU0LDE2IEBACiAgICAgdjhpMTYgcmVnMCwgcmVnMiwgcmVnNCwgcmVnNiwgcmVnOCwgcmVnMTAsIHJlZzEyLCByZWcxNDsKICAgICB2OGkxNiByZWczLCByZWcxMywgcmVnMTEsIHJlZzUsIHJlZzcsIHJlZzksIHJlZzEsIHJlZzE1OwogICAgIHY4aTE2IHRtcDUsIHRtcDYsIHRtcDc7CisgICAgdjhpMTYgemVybyA9IHsgMCB9OwogCi0gICAgLyogbG9hZCB1cCA4eDggKi8KLSAgICBMRF9TSDgoaW5wdXQsIDE2LCByZWcwLCByZWcxLCByZWcyLCByZWczLCByZWc0LCByZWc1LCByZWc2LCByZWc3KTsKKyAgICAvKiBsb2FkIHVwIDh4MTYgKi8KKyAgICBMRF9TSDE2KGlucHV0LCAxNiwKKyAgICAgICAgICAgIHJlZzAsIHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQsIHJlZzUsIHJlZzYsIHJlZzcsCisgICAgICAgICAgICByZWc4LCByZWc5LCByZWcxMCwgcmVnMTEsIHJlZzEyLCByZWcxMywgcmVnMTQsIHJlZzE1KTsKKworICAgIFNUX1NIOCh6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCBpbnB1dCwgMTYpOwogICAgIGlucHV0ICs9IDggKiAxNjsKLSAgICAvKiBsb2FkIGJvdHRvbSA4eDggKi8KLSAgICBMRF9TSDgoaW5wdXQsIDE2LCByZWc4LCByZWc5LCByZWcxMCwgcmVnMTEsIHJlZzEyLCByZWcxMywgcmVnMTQsIHJlZzE1KTsKKyAgICBTVF9TSDgoemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgaW5wdXQsIDE2KTsKIAogICAgIFZQOV9ET1RQX0NPTlNUX1BBSVIocmVnMiwgcmVnMTQsIGNvc3BpXzI4XzY0LCBjb3NwaV80XzY0LCByZWcyLCByZWcxNCk7CiAgICAgVlA5X0RPVFBfQ09OU1RfUEFJUihyZWcxMCwgcmVnNiwgY29zcGlfMTJfNjQsIGNvc3BpXzIwXzY0LCByZWcxMCwgcmVnNik7CkBAIC0xMDM2LDEyICsxMDU3LDE2IEBACiAgICAgdjhpMTYgcmVnMCwgcmVnMiwgcmVnNCwgcmVnNiwgcmVnOCwgcmVnMTAsIHJlZzEyLCByZWcxNDsKICAgICB2OGkxNiByZWczLCByZWcxMywgcmVnMTEsIHJlZzUsIHJlZzcsIHJlZzksIHJlZzEsIHJlZzE1OwogICAgIHY4aTE2IHRtcDUsIHRtcDYsIHRtcDc7CisgICAgdjhpMTYgemVybyA9IHsgMCB9OwogCi0gICAgLyogbG9hZCB1cCA4eDggKi8KLSAgICBMRF9TSDgoaW5wdXQsIDE2LCByZWcwLCByZWcxLCByZWcyLCByZWczLCByZWc0LCByZWc1LCByZWc2LCByZWc3KTsKLSAgICBpbnB1dCArPSA4ICogMTY7Ci0gICAgLyogbG9hZCBib3R0b20gOHg4ICovCi0gICAgTERfU0g4KGlucHV0LCAxNiwgcmVnOCwgcmVnOSwgcmVnMTAsIHJlZzExLCByZWcxMiwgcmVnMTMsIHJlZzE0LCByZWcxNSk7CisgICAgLyogbG9hZCB1cCA4eDE2ICovCisgICAgTERfU0gxNihpbnB1dCwgMTYsCisgICAgICAgICAgICByZWcwLCByZWcxLCByZWcyLCByZWczLCByZWc0LCByZWc1LCByZWc2LCByZWc3LAorICAgICAgICAgICAgcmVnOCwgcmVnOSwgcmVnMTAsIHJlZzExLCByZWcxMiwgcmVnMTMsIHJlZzE0LCByZWcxNSk7CisKKyAgICBTVF9TSDgoemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgemVybywgaW5wdXQsIDE2KTsKKyAgICBpbnB1dCArPSAxNiAqIDg7CisgICAgU1RfU0g4KHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIGlucHV0LCAxNik7CiAKICAgICBWUDlfRE9UUF9DT05TVF9QQUlSKHJlZzIsIHJlZzE0LCBjb3NwaV8yOF82NCwgY29zcGlfNF82NCwgcmVnMiwgcmVnMTQpOwogICAgIFZQOV9ET1RQX0NPTlNUX1BBSVIocmVnMTAsIHJlZzYsIGNvc3BpXzEyXzY0LCBjb3NwaV8yMF82NCwgcmVnMTAsIHJlZzYpOwpAQCAtMTE0MSwxMSArMTE2NiwxMSBAQAogICAgIG91dCA9IFJPVU5EX1BPV0VSX09GX1RXTygoaW5wdXRbMF0gKiBjb3NwaV8xNl82NCksIFZQOV9EQ1RfQ09OU1RfQklUUyk7CiAgICAgb3V0ID0gUk9VTkRfUE9XRVJfT0ZfVFdPKChvdXQgKiBjb3NwaV8xNl82NCksIFZQOV9EQ1RfQ09OU1RfQklUUyk7CiAgICAgb3V0ID0gUk9VTkRfUE9XRVJfT0ZfVFdPKG91dCwgNik7CisgICAgaW5wdXRbMF0gPSAwOwogCiAgICAgdmVjID0gX19tc2FfZmlsbF9oKG91dCk7CiAKLSAgICBmb3IgKGkgPSA0OyBpLS07KQotICAgIHsKKyAgICBmb3IgKGkgPSA0OyBpLS07KSB7CiAgICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwogICAgICAgICBVTlBDS19VQl9TSChkc3QwLCByZXMwLCByZXM0KTsKICAgICAgICAgVU5QQ0tfVUJfU0goZHN0MSwgcmVzMSwgcmVzNSk7CkBAIC0xMjI5LDEyICsxMjU0LDE3IEBACiB7CiAgICAgdjhpMTYgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3LCByOCwgcjksIHIxMCwgcjExLCByMTIsIHIxMywgcjE0LCByMTU7CiAgICAgdjhpMTYgbDAsIGwxLCBsMiwgbDMsIGw0LCBsNSwgbDYsIGw3LCBsOCwgbDksIGwxMCwgbDExLCBsMTIsIGwxMywgbDE0LCBsMTU7CisgICAgdjhpMTYgemVybyA9IHsgMCB9OwogCiAgICAgLyogbG9hZCBpbnB1dCBkYXRhICovCiAgICAgTERfU0gxNihpbnB1dCwgMTYsCiAgICAgICAgICAgICBsMCwgbDEsIGwyLCBsMywgbDQsIGw1LCBsNiwgbDcsCiAgICAgICAgICAgICBsOCwgbDksIGwxMCwgbDExLCBsMTIsIGwxMywgbDE0LCBsMTUpOwogCisgICAgU1RfU0g4KHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIHplcm8sIGlucHV0LCAxNik7CisgICAgaW5wdXQgKz0gMTYgKiA4OworICAgIFNUX1NIOCh6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCBpbnB1dCwgMTYpOworCiAgICAgLyogQURTVCBpbiBob3Jpem9udGFsICovCiAgICAgVlA5X0lBRFNUOHgxNl8xRChsMCwgbDEsIGwyLCBsMywgbDQsIGw1LCBsNiwgbDcsCiAgICAgICAgICAgICAgICAgICAgICBsOCwgbDksIGwxMCwgbDExLCBsMTIsIGwxMywgbDE0LCBsMTUsCkBAIC0xNTkxLDkgKzE2MjEsMTEgQEAKICAgICB2OGkxNiB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBsb2MwLCBsb2MxLCBsb2MyLCBsb2MzOwogICAgIHY4aTE2IHJlZzAsIHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQsIHJlZzUsIHJlZzYsIHJlZzc7CiAgICAgdjhpMTYgc3RwMCwgc3RwMSwgc3RwMiwgc3RwMywgc3RwNCwgc3RwNSwgc3RwNiwgc3RwNzsKKyAgICB2OGkxNiB6ZXJvID0geyAwIH07CiAKICAgICAvKiBFdmVuIHN0YWdlIDEgKi8KICAgICBMRF9TSDgodG1wX2J1ZiwgKDQgKiAzMiksIHJlZzAsIHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQsIHJlZzUsIHJlZzYsIHJlZzcpOworICAgIFNUX1NIOCh6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB0bXBfYnVmLCAoNCAqIDMyKSk7CiAgICAgdG1wX2J1ZiArPSAoMiAqIDMyKTsKIAogICAgIFZQOV9ET1RQX0NPTlNUX1BBSVIocmVnMSwgcmVnNywgY29zcGlfMjhfNjQsIGNvc3BpXzRfNjQsIHJlZzEsIHJlZzcpOwpAQCAtMTYxMyw2ICsxNjQ1LDcgQEAKICAgICAvKiBFdmVuIHN0YWdlIDIgKi8KICAgICAvKiBMb2FkIDggKi8KICAgICBMRF9TSDgodG1wX2J1ZiwgKDQgKiAzMiksIHJlZzAsIHJlZzEsIHJlZzIsIHJlZzMsIHJlZzQsIHJlZzUsIHJlZzYsIHJlZzcpOworICAgIFNUX1NIOCh6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB0bXBfYnVmLCAoNCAqIDMyKSk7CiAKICAgICBWUDlfRE9UUF9DT05TVF9QQUlSKHJlZzAsIHJlZzcsIGNvc3BpXzMwXzY0LCBjb3NwaV8yXzY0LCByZWcwLCByZWc3KTsKICAgICBWUDlfRE9UUF9DT05TVF9QQUlSKHJlZzQsIHJlZzMsIGNvc3BpXzE0XzY0LCBjb3NwaV8xOF82NCwgcmVnNCwgcmVnMyk7CkBAIC0xNjcxLDYgKzE3MDQsNyBAQAogewogICAgIHY4aTE2IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGxvYzAsIGxvYzEsIGxvYzIsIGxvYzM7CiAgICAgdjhpMTYgcmVnMCwgcmVnMSwgcmVnMiwgcmVnMywgcmVnNCwgcmVnNSwgcmVnNiwgcmVnNzsKKyAgICB2OGkxNiB6ZXJvID0geyAwIH07CiAKICAgICAvKiBPZGQgc3RhZ2UgMSAqLwogICAgIHJlZzAgPSBMRF9TSCh0bXBfYnVmICsgMzIpOwpAQCAtMTY4Miw2ICsxNzE2LDE1IEBACiAgICAgcmVnNiA9IExEX1NIKHRtcF9idWYgKyAyNSAqIDMyKTsKICAgICByZWc3ID0gTERfU0godG1wX2J1ZiArIDMxICogMzIpOwogCisgICAgU1RfU0goemVybywgdG1wX2J1ZiArIDMyKTsKKyAgICBTVF9TSCh6ZXJvLCB0bXBfYnVmICsgNyAqIDMyKTsKKyAgICBTVF9TSCh6ZXJvLCB0bXBfYnVmICsgOSAqIDMyKTsKKyAgICBTVF9TSCh6ZXJvLCB0bXBfYnVmICsgMTUgKiAzMik7CisgICAgU1RfU0goemVybywgdG1wX2J1ZiArIDE3ICogMzIpOworICAgIFNUX1NIKHplcm8sIHRtcF9idWYgKyAyMyAqIDMyKTsKKyAgICBTVF9TSCh6ZXJvLCB0bXBfYnVmICsgMjUgKiAzMik7CisgICAgU1RfU0goemVybywgdG1wX2J1ZiArIDMxICogMzIpOworCiAgICAgVlA5X0RPVFBfQ09OU1RfUEFJUihyZWcwLCByZWc3LCBjb3NwaV8zMV82NCwgY29zcGlfMV82NCwgcmVnMCwgcmVnNyk7CiAgICAgVlA5X0RPVFBfQ09OU1RfUEFJUihyZWc0LCByZWczLCBjb3NwaV8xNV82NCwgY29zcGlfMTdfNjQsIHJlZzMsIHJlZzQpOwogICAgIFZQOV9ET1RQX0NPTlNUX1BBSVIocmVnMiwgcmVnNSwgY29zcGlfMjNfNjQsIGNvc3BpXzlfNjQsIHJlZzIsIHJlZzUpOwpAQCAtMTcyMyw2ICsxNzY2LDE1IEBACiAgICAgcmVnNiA9IExEX1NIKHRtcF9idWYgKyAyNyAqIDMyKTsKICAgICByZWc3ID0gTERfU0godG1wX2J1ZiArIDI5ICogMzIpOwogCisgICAgU1RfU0goemVybywgdG1wX2J1ZiArIDMgKiAzMik7CisgICAgU1RfU0goemVybywgdG1wX2J1ZiArIDUgKiAzMik7CisgICAgU1RfU0goemVybywgdG1wX2J1ZiArIDExICogMzIpOworICAgIFNUX1NIKHplcm8sIHRtcF9idWYgKyAxMyAqIDMyKTsKKyAgICBTVF9TSCh6ZXJvLCB0bXBfYnVmICsgMTkgKiAzMik7CisgICAgU1RfU0goemVybywgdG1wX2J1ZiArIDIxICogMzIpOworICAgIFNUX1NIKHplcm8sIHRtcF9idWYgKyAyNyAqIDMyKTsKKyAgICBTVF9TSCh6ZXJvLCB0bXBfYnVmICsgMjkgKiAzMik7CisKICAgICBWUDlfRE9UUF9DT05TVF9QQUlSKHJlZzEsIHJlZzYsIGNvc3BpXzI3XzY0LCBjb3NwaV81XzY0LCByZWcxLCByZWc2KTsKICAgICBWUDlfRE9UUF9DT05TVF9QQUlSKHJlZzUsIHJlZzIsIGNvc3BpXzExXzY0LCBjb3NwaV8yMV82NCwgcmVnMiwgcmVnNSk7CiAgICAgVlA5X0RPVFBfQ09OU1RfUEFJUihyZWczLCByZWc0LCBjb3NwaV8xOV82NCwgY29zcGlfMTNfNjQsIHJlZzMsIHJlZzQpOwpAQCAtMTkwMSwxMSArMTk1MywxMSBAQAogICAgIG91dCA9IFJPVU5EX1BPV0VSX09GX1RXTygoaW5wdXRbMF0gKiBjb3NwaV8xNl82NCksIFZQOV9EQ1RfQ09OU1RfQklUUyk7CiAgICAgb3V0ID0gUk9VTkRfUE9XRVJfT0ZfVFdPKChvdXQgKiBjb3NwaV8xNl82NCksIFZQOV9EQ1RfQ09OU1RfQklUUyk7CiAgICAgb3V0ID0gUk9VTkRfUE9XRVJfT0ZfVFdPKG91dCwgNik7CisgICAgaW5wdXRbMF0gPSAwOwogCiAgICAgdmVjID0gX19tc2FfZmlsbF9oKG91dCk7CiAKLSAgICBmb3IgKGkgPSAxNjsgaS0tOykKLSAgICB7CisgICAgZm9yIChpID0gMTY7IGktLTspIHsKICAgICAgICAgTERfVUIyKGRzdCwgMTYsIGRzdDAsIGRzdDEpOwogICAgICAgICBMRF9VQjIoZHN0ICsgZHN0X3N0cmlkZSwgMTYsIGRzdDIsIGRzdDMpOwogCkBAIC0yMDA0LDExICsyMDU2LDkgQEAKIHsKICAgICBpZiAoZW9iID4gMSkgewogICAgICAgICB2cDlfaWRjdDR4NF9jb2xjb2xfYWRkYmxrX21zYShibG9jaywgZHN0LCBzdHJpZGUpOwotICAgICAgICBtZW1zZXQoYmxvY2ssIDAsIDQgKiA0ICogc2l6ZW9mKCpibG9jaykpOwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICAgdnA5X2lkY3Q0eDRfMV9hZGRfbXNhKGJsb2NrLCBkc3QsIHN0cmlkZSk7Ci0gICAgICAgIGJsb2NrWzBdID0gMDsKICAgICB9CiB9CiAKQEAgLTIwMTcsNjAgKzIwNjcsNDEgQEAKIHsKICAgICBpZiAoZW9iID09IDEpIHsKICAgICAgICAgdnA5X2lkY3Q4eDhfMV9hZGRfbXNhKGJsb2NrLCBkc3QsIHN0cmlkZSk7Ci0gICAgICAgIGJsb2NrWzBdID0gMDsKICAgICB9CiAgICAgZWxzZSBpZiAoZW9iIDw9IDEyKSB7CiAgICAgICAgIHZwOV9pZGN0OHg4XzEyX2NvbGNvbF9hZGRibGtfbXNhKGJsb2NrLCBkc3QsIHN0cmlkZSk7Ci0gICAgICAgIG1lbXNldChibG9jaywgMCwgNCAqIDggKiBzaXplb2YoKmJsb2NrKSk7CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICB2cDlfaWRjdDh4OF9jb2xjb2xfYWRkYmxrX21zYShibG9jaywgZHN0LCBzdHJpZGUpOwotICAgICAgICBtZW1zZXQoYmxvY2ssIDAsIDggKiA4ICogc2l6ZW9mKCpibG9jaykpOwogICAgIH0KIH0KIAogdm9pZCBmZl9pZGN0X2lkY3RfMTZ4MTZfYWRkX21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgZW9iKQogewotICAgIGludCBpOwotCiAgICAgaWYgKGVvYiA9PSAxKSB7CiAgICAgICAgIC8qIERDIG9ubHkgRENUIGNvZWZmaWNpZW50LiAqLwogICAgICAgICB2cDlfaWRjdDE2eDE2XzFfYWRkX21zYShibG9jaywgZHN0LCBzdHJpZGUpOwotICAgICAgICBibG9ja1swXSA9IDA7CiAgICAgfQogICAgIGVsc2UgaWYgKGVvYiA8PSAxMCkgewogICAgICAgICB2cDlfaWRjdDE2eDE2XzEwX2NvbGNvbF9hZGRibGtfbXNhKGJsb2NrLCBkc3QsIHN0cmlkZSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICAgICAgICAgIG1lbXNldChibG9jaywgMCwgNCAqIHNpemVvZigqYmxvY2spKTsKLSAgICAgICAgICAgIGJsb2NrICs9IDE2OwotICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICB2cDlfaWRjdDE2eDE2X2NvbGNvbF9hZGRibGtfbXNhKGJsb2NrLCBkc3QsIHN0cmlkZSk7Ci0gICAgICAgIG1lbXNldChibG9jaywgMCwgMTYgKiAxNiAqIHNpemVvZigqYmxvY2spKTsKICAgICB9CiB9CiAKIHZvaWQgZmZfaWRjdF9pZGN0XzMyeDMyX2FkZF9tc2EodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IGVvYikKIHsKLSAgICBpbnQgaTsKLQogICAgIGlmIChlb2IgPT0gMSkgewogICAgICAgICB2cDlfaWRjdDMyeDMyXzFfYWRkX21zYShibG9jaywgZHN0LCBzdHJpZGUpOwotICAgICAgICBibG9ja1swXSA9IDA7CiAgICAgfQogICAgIGVsc2UgaWYgKGVvYiA8PSAzNCkgewogICAgICAgICB2cDlfaWRjdDMyeDMyXzM0X2NvbGNvbF9hZGRibGtfbXNhKGJsb2NrLCBkc3QsIHN0cmlkZSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKLSAgICAgICAgICAgIG1lbXNldChibG9jaywgMCwgOCAqIHNpemVvZigqYmxvY2spKTsKLSAgICAgICAgICAgIGJsb2NrICs9IDMyOwotICAgICAgICB9CiAgICAgfQogICAgIGVsc2UgewogICAgICAgICB2cDlfaWRjdDMyeDMyX2NvbGNvbF9hZGRibGtfbXNhKGJsb2NrLCBkc3QsIHN0cmlkZSk7Ci0gICAgICAgIG1lbXNldChibG9jaywgMCwgMzIgKiAzMiAqIHNpemVvZigqYmxvY2spKTsKICAgICB9CiB9CiAKQEAgLTIwNzgsNjEgKzIxMDksNTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpCiB7CiAgICAgdnA5X2lhZHN0NHg0X2NvbGNvbF9hZGRibGtfbXNhKGJsb2NrLCBkc3QsIHN0cmlkZSk7Ci0gICAgbWVtc2V0KGJsb2NrLCAwLCA0ICogNCAqIHNpemVvZigqYmxvY2spKTsKIH0KIAogdm9pZCBmZl9pYWRzdF9pYWRzdF84eDhfYWRkX21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgZW9iKQogewogICAgIHZwOV9pYWRzdDh4OF9jb2xjb2xfYWRkYmxrX21zYShibG9jaywgZHN0LCBzdHJpZGUpOwotICAgIG1lbXNldChibG9jaywgMCwgOCAqIDggKiBzaXplb2YoKmJsb2NrKSk7CiB9CiAKIHZvaWQgZmZfaWFkc3RfaWFkc3RfMTZ4MTZfYWRkX21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpCiB7CiAgICAgdnA5X2lhZHN0MTZ4MTZfY29sY29sX2FkZGJsa19tc2EoYmxvY2ssIGRzdCwgc3RyaWRlKTsKLSAgICBtZW1zZXQoYmxvY2ssIDAsIDE2ICogMTYgKiBzaXplb2YoKmJsb2NrKSk7CiB9CiAKIHZvaWQgZmZfaWRjdF9pYWRzdF80eDRfYWRkX21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpCiB7CiAgICAgdnA5X2lkY3RfaWFkc3RfNHg0X2FkZF9tc2EoYmxvY2ssIGRzdCwgc3RyaWRlLCBlb2IpOwotICAgIG1lbXNldChibG9jaywgMCwgNCAqIDQgKiBzaXplb2YoKmJsb2NrKSk7CiB9CiAKIHZvaWQgZmZfaWRjdF9pYWRzdF84eDhfYWRkX21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpCiB7CiAgICAgdnA5X2lkY3RfaWFkc3RfOHg4X2FkZF9tc2EoYmxvY2ssIGRzdCwgc3RyaWRlLCBlb2IpOwotICAgIG1lbXNldChibG9jaywgMCwgOCAqIDggKiBzaXplb2YoKmJsb2NrKSk7CiB9CiAKIHZvaWQgZmZfaWRjdF9pYWRzdF8xNngxNl9hZGRfbXNhKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgZW9iKQogewogICAgIHZwOV9pZGN0X2lhZHN0XzE2eDE2X2FkZF9tc2EoYmxvY2ssIGRzdCwgc3RyaWRlLCBlb2IpOwotICAgIG1lbXNldChibG9jaywgMCwgMTYgKiAxNiAqIHNpemVvZigqYmxvY2spKTsKIH0KIAogdm9pZCBmZl9pYWRzdF9pZGN0XzR4NF9hZGRfbXNhKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IGVvYikKIHsKICAgICB2cDlfaWFkc3RfaWRjdF80eDRfYWRkX21zYShibG9jaywgZHN0LCBzdHJpZGUsIGVvYik7Ci0gICAgbWVtc2V0KGJsb2NrLCAwLCA0ICogNCAqIHNpemVvZigqYmxvY2spKTsKIH0KIAogdm9pZCBmZl9pYWRzdF9pZGN0Xzh4OF9hZGRfbXNhKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IGVvYikKIHsKICAgICB2cDlfaWFkc3RfaWRjdF84eDhfYWRkX21zYShibG9jaywgZHN0LCBzdHJpZGUsIGVvYik7Ci0gICAgbWVtc2V0KGJsb2NrLCAwLCA4ICogOCAqIHNpemVvZigqYmxvY2spKTsKIH0KIAogdm9pZCBmZl9pYWRzdF9pZGN0XzE2eDE2X2FkZF9tc2EodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBlb2IpCiB7CiAgICAgdnA5X2lhZHN0X2lkY3RfMTZ4MTZfYWRkX21zYShibG9jaywgZHN0LCBzdHJpZGUsIGVvYik7Ci0gICAgbWVtc2V0KGJsb2NrLCAwLCAxNiAqIDE2ICogc2l6ZW9mKCpibG9jaykpOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3ZwOV9scGZfbXNhLmMgYi9saWJhdmNvZGVjL21pcHMvdnA5X2xwZl9tc2EuYwppbmRleCBlZWY4YWZjLi5jODJhOWU5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21pcHMvdnA5X2xwZl9tc2EuYworKysgYi9saWJhdmNvZGVjL21pcHMvdnA5X2xwZl9tc2EuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTUgU2hpdnJhaiBQYXRpbCAoU2hpdnJhai5QYXRpbEBpbWd0ZWMuY29tKQorICogQ29weXJpZ2h0IChjKSAyMDE1IC0gMjAxNyBTaGl2cmFqIFBhdGlsIChTaGl2cmFqLlBhdGlsQGltZ3RlYy5jb20pCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIyLDYzICsyMiwxMiBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL2dlbmVyaWNfbWFjcm9zX21zYS5oIgogI2luY2x1ZGUgInZwOWRzcF9taXBzLmgiCiAKLSNkZWZpbmUgVlA5X0xQRl9GSUxURVI0XzhXKHAxX2luLCBwMF9pbiwgcTBfaW4sIHExX2luLCBtYXNrX2luLCBoZXZfaW4sICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwMV9vdXQsIHAwX291dCwgcTBfb3V0LCBxMV9vdXQpICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2MTZpOCBwMV9tLCBwMF9tLCBxMF9tLCBxMV9tLCBxMF9zdWJfcDAsIGZpbHRfc2lnbjsgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2aTggZmlsdCwgZmlsdDEsIGZpbHQyLCBjbnN0NGIsIGNuc3QzYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHY4aTE2IHEwX3N1Yl9wMF9yLCBmaWx0X3IsIGNuc3QzaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcDFfbSA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKHAxX2luLCAweDgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHAwX20gPSAodjE2aTgpIF9fbXNhX3hvcmlfYihwMF9pbiwgMHg4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBxMF9tID0gKHYxNmk4KSBfX21zYV94b3JpX2IocTBfaW4sIDB4ODApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcTFfbSA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKHExX2luLCAweDgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0ID0gX19tc2Ffc3Vic19zX2IocDFfbSwgcTFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmlsdCA9IGZpbHQgJiAodjE2aTgpIGhldl9pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHEwX3N1Yl9wMCA9IHEwX20gLSBwMF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0X3NpZ24gPSBfX21zYV9jbHRpX3NfYihmaWx0LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNuc3QzaCA9IF9fbXNhX2xkaV9oKDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBxMF9zdWJfcDBfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHEwX3N1Yl9wMCwgcTBfc3ViX3AwKTsgICAgICAgICAgICBcCi0gICAgcTBfc3ViX3AwX3IgPSBfX21zYV9kb3RwX3NfaCgodjE2aTgpIHEwX3N1Yl9wMF9yLCAodjE2aTgpIGNuc3QzaCk7ICAgXAotICAgIGZpbHRfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKGZpbHRfc2lnbiwgZmlsdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0X3IgKz0gcTBfc3ViX3AwX3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmlsdF9yID0gX19tc2Ffc2F0X3NfaChmaWx0X3IsIDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvKiBjb21iaW5lIGxlZnQgYW5kIHJpZ2h0IHBhcnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmlsdCA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KSBmaWx0X3IsICh2MTZpOCkgZmlsdF9yKTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0ID0gZmlsdCAmICh2MTZpOCkgbWFza19pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY25zdDRiID0gX19tc2FfbGRpX2IoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZpbHQxID0gX19tc2FfYWRkc19zX2IoZmlsdCwgY25zdDRiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0MSA+Pj0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNuc3QzYiA9IF9fbXNhX2xkaV9iKDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0MiA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIGNuc3QzYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmlsdDIgPj49IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBxMF9tID0gX19tc2Ffc3Vic19zX2IocTBfbSwgZmlsdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcTBfb3V0ID0gX19tc2FfeG9yaV9iKCh2MTZ1OCkgcTBfbSwgMHg4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHAwX20gPSBfX21zYV9hZGRzX3NfYihwMF9tLCBmaWx0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwMF9vdXQgPSBfX21zYV94b3JpX2IoKHYxNnU4KSBwMF9tLCAweDgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZpbHQgPSBfX21zYV9zcmFyaV9iKGZpbHQxLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBoZXZfaW4gPSBfX21zYV94b3JpX2IoKHYxNnU4KSBoZXZfaW4sIDB4ZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmlsdCA9IGZpbHQgJiAodjE2aTgpIGhldl9pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBxMV9tID0gX19tc2Ffc3Vic19zX2IocTFfbSwgZmlsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcTFfb3V0ID0gX19tc2FfeG9yaV9iKCh2MTZ1OCkgcTFfbSwgMHg4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHAxX20gPSBfX21zYV9hZGRzX3NfYihwMV9tLCBmaWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwMV9vdXQgPSBfX21zYV94b3JpX2IoKHYxNnU4KSBwMV9tLCAweDgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KICNkZWZpbmUgVlA5X0xQRl9GSUxURVI0XzRXKHAxX2luLCBwMF9pbiwgcTBfaW4sIHExX2luLCBtYXNrX2luLCBoZXZfaW4sICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMV9vdXQsIHAwX291dCwgcTBfb3V0LCBxMV9vdXQpICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2MTZpOCBwMV9tLCBwMF9tLCBxMF9tLCBxMV9tLCBxMF9zdWJfcDAsIGZpbHRfc2lnbjsgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2aTggZmlsdCwgZmlsdDEsIGZpbHQyLCBjbnN0NGIsIGNuc3QzYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHY4aTE2IHEwX3N1Yl9wMF9yLCBxMF9zdWJfcDBfbCwgZmlsdF9sLCBmaWx0X3IsIGNuc3QzaDsgICAgICAgICAgICAgIFwKKyAgICB2MTZpOCBwMV9tLCBwMF9tLCBxMF9tLCBxMV9tLCBxMF9zdWJfcDAsIGZpbHQsIGZpbHQxLCBmaWx0MjsgICAgICAgICBcCisgICAgY29uc3QgdjE2aTggY25zdDRiID0gX19tc2FfbGRpX2IoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHYxNmk4IGNuc3QzYiA9IF9fbXNhX2xkaV9iKDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgcDFfbSA9ICh2MTZpOCkgX19tc2FfeG9yaV9iKHAxX2luLCAweDgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHAwX20gPSAodjE2aTgpIF9fbXNhX3hvcmlfYihwMF9pbiwgMHg4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTg5LDMwICszOCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBmaWx0ID0gZmlsdCAmICh2MTZpOCkgaGV2X2luOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHEwX3N1Yl9wMCA9IHEwX20gLSBwMF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0X3NpZ24gPSBfX21zYV9jbHRpX3NfYihmaWx0LCAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNuc3QzaCA9IF9fbXNhX2xkaV9oKDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBxMF9zdWJfcDBfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKHEwX3N1Yl9wMCwgcTBfc3ViX3AwKTsgICAgICAgICAgICBcCi0gICAgcTBfc3ViX3AwX3IgPSBfX21zYV9kb3RwX3NfaCgodjE2aTgpIHEwX3N1Yl9wMF9yLCAodjE2aTgpIGNuc3QzaCk7ICAgXAotICAgIGZpbHRfciA9ICh2OGkxNikgX19tc2FfaWx2cl9iKGZpbHRfc2lnbiwgZmlsdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0X3IgKz0gcTBfc3ViX3AwX3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmlsdF9yID0gX19tc2Ffc2F0X3NfaChmaWx0X3IsIDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBxMF9zdWJfcDBfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKHEwX3N1Yl9wMCwgcTBfc3ViX3AwKTsgICAgICAgICAgICBcCi0gICAgcTBfc3ViX3AwX2wgPSBfX21zYV9kb3RwX3NfaCgodjE2aTgpIHEwX3N1Yl9wMF9sLCAodjE2aTgpIGNuc3QzaCk7ICAgXAotICAgIGZpbHRfbCA9ICh2OGkxNikgX19tc2FfaWx2bF9iKGZpbHRfc2lnbiwgZmlsdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0X2wgKz0gcTBfc3ViX3AwX2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmlsdF9sID0gX19tc2Ffc2F0X3NfaChmaWx0X2wsIDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmaWx0ID0gX19tc2FfcGNrZXZfYigodjE2aTgpIGZpbHRfbCwgKHYxNmk4KSBmaWx0X3IpOyAgICAgICAgICAgICAgICBcCisgICAgcTBfc3ViX3AwID0gX19tc2Ffc3Vic19zX2IocTBfbSwgcDBfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZpbHQgPSBfX21zYV9hZGRzX3NfYihmaWx0LCBxMF9zdWJfcDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0ID0gX19tc2FfYWRkc19zX2IoZmlsdCwgcTBfc3ViX3AwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmlsdCA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIHEwX3N1Yl9wMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGZpbHQgPSBmaWx0ICYgKHYxNmk4KSBtYXNrX2luOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY25zdDRiID0gX19tc2FfbGRpX2IoNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGZpbHQxID0gX19tc2FfYWRkc19zX2IoZmlsdCwgY25zdDRiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBmaWx0MSA+Pj0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNuc3QzYiA9IF9fbXNhX2xkaV9iKDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBmaWx0MiA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIGNuc3QzYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZmlsdDIgPj49IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI3Nyw3ICsyMTEsNyBAQAogCiAgICAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQsIGJfbGltaXQsIHRocmVzaCwKICAgICAgICAgICAgICAgICAgaGV2LCBtYXNrLCBmbGF0KTsKLSAgICBWUDlfTFBGX0ZJTFRFUjRfOFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldiwgcDFfb3V0LCBwMF9vdXQsIHEwX291dCwKKyAgICBWUDlfTFBGX0ZJTFRFUjRfNFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldiwgcDFfb3V0LCBwMF9vdXQsIHEwX291dCwKICAgICAgICAgICAgICAgICAgICAgICAgcTFfb3V0KTsKIAogICAgIHAxX2QgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHAxX291dCwgMCk7CkBAIC0zNDIsNyArMjc2LDcgQEAKICAgICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdCwgYl9saW1pdCwgdGhyZXNoLAogICAgICAgICAgICAgICAgICBoZXYsIG1hc2ssIGZsYXQpOwogICAgIFZQOV9GTEFUNChwMywgcDIsIHAwLCBxMCwgcTIsIHEzLCBmbGF0KTsKLSAgICBWUDlfTFBGX0ZJTFRFUjRfOFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldiwgcDFfb3V0LCBwMF9vdXQsIHEwX291dCwKKyAgICBWUDlfTFBGX0ZJTFRFUjRfNFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldiwgcDFfb3V0LCBwMF9vdXQsIHEwX291dCwKICAgICAgICAgICAgICAgICAgICAgICAgcTFfb3V0KTsKIAogICAgIGZsYXQgPSAodjE2dTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIHplcm8sICh2Mmk2NCkgZmxhdCk7CkBAIC0xMDY1LDcgKzk5OSw3IEBACiAgICAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQsIGJfbGltaXQsIHRocmVzaCwKICAgICAgICAgICAgICAgICAgaGV2LCBtYXNrLCBmbGF0KTsKICAgICBWUDlfRkxBVDQocDMsIHAyLCBwMCwgcTAsIHEyLCBxMywgZmxhdCk7Ci0gICAgVlA5X0xQRl9GSUxURVI0XzhXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYsIHAxX291dCwgcDBfb3V0LCBxMF9vdXQsCisgICAgVlA5X0xQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYsIHAxX291dCwgcDBfb3V0LCBxMF9vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHExX291dCk7CiAKICAgICBmbGF0ID0gKHYxNnU4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSB6ZXJvLCAodjJpNjQpIGZsYXQpOwpAQCAtMTI4MCw3ICsxMjE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzKTsKICAgICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdCwgYl9saW1pdCwgdGhyZXNoLAogICAgICAgICAgICAgICAgICBoZXYsIG1hc2ssIGZsYXQpOwotICAgIFZQOV9MUEZfRklMVEVSNF84VyhwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2LCBwMSwgcDAsIHEwLCBxMSk7CisgICAgVlA5X0xQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYsIHAxLCBwMCwgcTAsIHExKTsKICAgICBJTFZSX0IyX1NIKHAwLCBwMSwgcTEsIHEwLCB2ZWMwLCB2ZWMxKTsKICAgICBJTFZSTF9IMl9TSCh2ZWMxLCB2ZWMwLCB2ZWMyLCB2ZWMzKTsKIApAQCAtMTM2Nyw3ICsxMzAxLDcgQEAKICAgICAvKiBmbGF0NCAqLwogICAgIFZQOV9GTEFUNChwMywgcDIsIHAwLCBxMCwgcTIsIHEzLCBmbGF0KTsKICAgICAvKiBmaWx0ZXI0ICovCi0gICAgVlA5X0xQRl9GSUxURVI0XzhXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYsIHAxX291dCwgcDBfb3V0LCBxMF9vdXQsCisgICAgVlA5X0xQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYsIHAxX291dCwgcDBfb3V0LCBxMF9vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHExX291dCk7CiAKICAgICBmbGF0ID0gKHYxNnU4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSB6ZXJvLCAodjJpNjQpIGZsYXQpOwpAQCAtMTg2OCw3ICsxODAyLDcgQEAKICAgICAvKiBmbGF0NCAqLwogICAgIFZQOV9GTEFUNChwMywgcDIsIHAwLCBxMCwgcTIsIHEzLCBmbGF0KTsKICAgICAvKiBmaWx0ZXI0ICovCi0gICAgVlA5X0xQRl9GSUxURVI0XzhXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYsIHAxX291dCwgcDBfb3V0LCBxMF9vdXQsCisgICAgVlA5X0xQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYsIHAxX291dCwgcDBfb3V0LCBxMF9vdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHExX291dCk7CiAKICAgICBmbGF0ID0gKHYxNnU4KSBfX21zYV9pbHZyX2QoKHYyaTY0KSB6ZXJvLCAodjJpNjQpIGZsYXQpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3ZwOV9tY19tc2EuYyBiL2xpYmF2Y29kZWMvbWlwcy92cDlfbWNfbXNhLmMKaW5kZXggMTY3MWQ5Ny4uNzQ5ZThjYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9taXBzL3ZwOV9tY19tc2EuYworKysgYi9saWJhdmNvZGVjL21pcHMvdnA5X21jX21zYS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSBTaGl2cmFqIFBhdGlsIChTaGl2cmFqLlBhdGlsQGltZ3RlYy5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgLSAyMDE3IFNoaXZyYWogUGF0aWwgKFNoaXZyYWouUGF0aWxAaW1ndGVjLmNvbSkKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMTQ1LDE2ICsxNDUsMTUgQEAKICAgICBTVF9VQih0bXBfbSwgKHBkc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCi0jZGVmaW5lIFBDS0VWX0FWR19TVDh4NF9VQihpbjEsIGRzdDAsIGluMiwgZHN0MSwgaW4zLCBkc3QyLCBpbjQsIGRzdDMsICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwZHN0LCBzdHJpZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2dTggdG1wMF9tLCB0bXAxX20sIHRtcDJfbSwgdG1wM19tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDhfdCAqcGRzdF9tID0gKHVpbnQ4X3QgKikgKHBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUENLRVZfQjJfVUIoaW4yLCBpbjEsIGluNCwgaW4zLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgUENLRVZfRDJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMl9tLCB0bXAzX20pOyAgICAgICAgICAgICAgICBcCi0gICAgQVZFUl9VQjJfVUIodG1wMF9tLCB0bXAyX20sIHRtcDFfbSwgdG1wM19tLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICBcCi0gICAgU1Q4eDRfVUIodG1wMF9tLCB0bXAxX20sIHBkc3RfbSwgc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFBDS0VWX0FWR19TVDh4NF9VQihpbjAsIGluMSwgaW4yLCBpbjMsICBkc3QwLCBkc3QxLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkc3QsIHN0cmlkZSkgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjE2dTggdG1wMF9tLCB0bXAxX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90ICpwZHN0X20gPSAodWludDhfdCAqKSAocGRzdCk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUENLRVZfQjJfVUIoaW4xLCBpbjAsIGluMywgaW4yLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgIFwKKyAgICBBVkVSX1VCMl9VQih0bXAwX20sIGRzdDAsIHRtcDFfbSwgZHN0MSwgdG1wMF9tLCB0bXAxX20pOyAgXAorICAgIFNUOHg0X1VCKHRtcDBfbSwgdG1wMV9tLCBwZHN0X20sIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCiB9CiAKIHN0YXRpYyB2b2lkIGNvbW1vbl9oel84dF80eDRfbXNhKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50MzJfdCBzcmNfc3RyaWRlLApAQCAtMjI0LDY0ICsyMjMsNiBAQAogICAgIFNUNHg0X1VCKG91dCwgb3V0LCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCi1zdGF0aWMgdm9pZCBjb21tb25faHpfOHRfNHgxNl9tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCi17Ci0gICAgdjE2dTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsIG91dDsKLSAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKLSAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwotCi0gICAgbWFzazAgPSBMRF9VQigmbWNfZmlsdF9tYXNrX2FyclsxNl0pOwotICAgIHNyYyAtPSAzOwotCi0gICAgLyogcmVhcnJhbmdpbmcgZmlsdGVyICovCi0gICAgZmlsdCA9IExEX1NIKGZpbHRlcik7Ci0gICAgU1BMQVRJX0g0X1NCKGZpbHQsIDAsIDEsIDIsIDMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzKTsKLQotICAgIG1hc2sxID0gbWFzazAgKyAyOwotICAgIG1hc2syID0gbWFzazAgKyA0OwotICAgIG1hc2szID0gbWFzazAgKyA2OwotCi0gICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgSE9SSVpfOFRBUF80V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIG91dDAsIG91dDEpOwotICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgIEhPUklaXzhUQVBfNFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBvdXQyLCBvdXQzKTsKLSAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKLSAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwotICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7Ci0gICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKLSAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLQotICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgIEhPUklaXzhUQVBfNFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBvdXQwLCBvdXQxKTsKLSAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICBYT1JJX0I0XzEyOF9TQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICBIT1JJWl84VEFQXzRXSURfNFZFQ1NfRklMVChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrMCwgbWFzazEsIG1hc2syLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2szLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0Mywgb3V0Miwgb3V0Myk7Ci0KLSAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKLSAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwotICAgIG91dCA9IFBDS0VWX1hPUkkxMjhfVUIob3V0MCwgb3V0MSk7Ci0gICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQyLCBvdXQzKTsKLSAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKLX0KLQogc3RhdGljIHZvaWQgY29tbW9uX2h6Xzh0XzR3X21zYShjb25zdCB1aW50OF90ICpzcmMsIGludDMyX3Qgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyLCBpbnQzMl90IGhlaWdodCkKQEAgLTI5MCw4ICsyMzEsNiBAQAogICAgICAgICBjb21tb25faHpfOHRfNHg0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyKTsKICAgICB9IGVsc2UgaWYgKDggPT0gaGVpZ2h0KSB7CiAgICAgICAgIGNvbW1vbl9oel84dF80eDhfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBmaWx0ZXIpOwotICAgIH0gZWxzZSBpZiAoMTYgPT0gaGVpZ2h0KSB7Ci0gICAgICAgIGNvbW1vbl9oel84dF80eDE2X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgZmlsdGVyKTsKICAgICB9CiB9CiAKQEAgLTEwNTAsOCArOTg5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcikKIHsKKyAgICB1aW50MzJfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgcmVzMiwgcmVzMzsKKyAgICB2MTZ1OCBkc3QwLCByZXM7CiAgICAgdjE2dTggbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazM7CiAgICAgdjhpMTYgZmlsdCwgcmVzMCwgcmVzMTsKIApAQCAtMTA3MCwxNCArMTAxMCwxMyBAQAogICAgIFhPUklfQjRfMTI4X1NCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogICAgIEhPUklaXzhUQVBfNFdJRF80VkVDU19GSUxUKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2swLCBtYXNrMSwgbWFzazIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCByZXMwLCByZXMxKTsKLSAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICBMVzQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOwogICAgIFNSQVJJX0gyX1NIKHJlczAsIHJlczEsIDcpOwogICAgIFNBVF9TSDJfU0gocmVzMCwgcmVzMSwgNyk7Ci0gICAgUENLRVZfQjJfVUIocmVzMCwgcmVzMCwgcmVzMSwgcmVzMSwgcmVzMiwgcmVzMyk7Ci0gICAgSUxWUl9XMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QyKTsKLSAgICBYT1JJX0IyXzEyOF9VQihyZXMyLCByZXMzKTsKLSAgICBBVkVSX1VCMl9VQihyZXMyLCBkc3QwLCByZXMzLCBkc3QyLCByZXMyLCByZXMzKTsKLSAgICBTVDR4NF9VQihyZXMyLCByZXMzLCAwLCAxLCAwLCAxLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIHJlcyA9IFBDS0VWX1hPUkkxMjhfVUIocmVzMCwgcmVzMSk7CisgICAgcmVzID0gKHYxNnU4KSBfX21zYV9hdmVyX3VfYihyZXMsIGRzdDApOworICAgIFNUNHg0X1VCKHJlcywgcmVzLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfOHRfYW5kX2F2ZXJfZHN0XzR4OF9tc2EoY29uc3QgdWludDhfdCAqc3JjLApAQCAtMTA4NSw5ICsxMDI0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwogICAgIHYxNnU4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCByZXMwLCByZXMxLCByZXMyLCByZXMzOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdjE2dTggZHN0MCwgZHN0MTsKICAgICB2OGkxNiBmaWx0LCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOwogCiAgICAgbWFzazAgPSBMRF9VQigmbWNfZmlsdF9tYXNrX2FyclsxNl0pOwpAQCAtMTEwNCw3ICsxMDQ0LDEwIEBACiAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgTERfVUI4KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgTFc0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICBMVzQoZHN0ICsgNCAqIGRzdF9zdHJpZGUsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MSk7CiAgICAgSE9SSVpfOFRBUF80V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMywgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDMsIHZlYzAsIHZlYzEpOwogICAgIExEX1NCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwpAQCAtMTExNywxMCArMTA2MCw3IEBACiAgICAgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CiAgICAgSUxWUl9EMl9VQihyZXMxLCByZXMwLCByZXMzLCByZXMyLCByZXMwLCByZXMyKTsKICAgICBYT1JJX0IyXzEyOF9VQihyZXMwLCByZXMyKTsKLSAgICBJTFZSX1c0X1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsCi0gICAgICAgICAgICAgICBkc3QwLCBkc3QyLCBkc3Q0LCBkc3Q2KTsKLSAgICBJTFZSX0QyX1VCKGRzdDIsIGRzdDAsIGRzdDYsIGRzdDQsIGRzdDAsIGRzdDQpOwotICAgIEFWRVJfVUIyX1VCKHJlczAsIGRzdDAsIHJlczIsIGRzdDQsIHJlczAsIHJlczIpOworICAgIEFWRVJfVUIyX1VCKHJlczAsIGRzdDAsIHJlczIsIGRzdDEsIHJlczAsIHJlczIpOwogICAgIFNUNHg4X1VCKHJlczAsIHJlczIsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKQEAgLTExNDYsOCArMTA4Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICBpbnQzMl90IGxvb3BfY250OworICAgIGludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzOwotICAgIHYxNnU4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHYxNnU4IG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLCBkc3QwLCBkc3QxOwogICAgIHY4aTE2IGZpbHQsIG91dDAsIG91dDEsIG91dDIsIG91dDM7CiAKICAgICBtYXNrMCA9IExEX1VCKCZtY19maWx0X21hc2tfYXJyWzBdKTsKQEAgLTExNjgsMTAgKzExMDksMTIgQEAKICAgICAgICAgSE9SSVpfOFRBUF84V0lEXzRWRUNTX0ZJTFQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzazAsIG1hc2sxLCBtYXNrMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazMsIGZpbHQwLCBmaWx0MSwgZmlsdDIsIGZpbHQzLCBvdXQwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQxLCBvdXQyLCBvdXQzKTsKLSAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIExENChkc3QsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CiAgICAgICAgIFNSQVJJX0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwogICAgICAgICBTQVRfU0g0X1NIKG91dDAsIG91dDEsIG91dDIsIG91dDMsIDcpOwotICAgICAgICBDT05WRVJUX1VCX0FWR19TVDh4NF9VQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLAorICAgICAgICBDT05WRVJUX1VCX0FWR19TVDh4NF9VQihvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QwLCBkc3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKICAgICB9CkBAIC0xMzYzLDggKzEzMDYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIG91dDsKKyAgICB2MTZ1OCBkc3QwLCBvdXQ7CiAgICAgdjE2aTggc3JjMTBfciwgc3JjMzJfciwgc3JjNTRfciwgc3JjNzZfciwgc3JjOThfciwgc3JjMjFfciwgc3JjNDNfcjsKICAgICB2MTZpOCBzcmM2NV9yLCBzcmM4N19yLCBzcmMxMDlfciwgc3JjMjExMCwgc3JjNDMzMiwgc3JjNjU1NCwgc3JjODc3NjsKICAgICB2MTZpOCBzcmMxMDk5OCwgZmlsdDAsIGZpbHQxLCBmaWx0MiwgZmlsdDM7CkBAIC0xMzg5LDcgKzEzMzMsOCBAQAogICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CiAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwogCi0gICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBMVzQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKICAgICAgICAgSUxWUl9CNF9TQihzcmM3LCBzcmM2LCBzcmM4LCBzcmM3LCBzcmM5LCBzcmM4LCBzcmMxMCwgc3JjOSwgc3JjNzZfciwKICAgICAgICAgICAgICAgICAgICBzcmM4N19yLCBzcmM5OF9yLCBzcmMxMDlfcik7CiAgICAgICAgIElMVlJfRDJfU0Ioc3JjODdfciwgc3JjNzZfciwgc3JjMTA5X3IsIHNyYzk4X3IsIHNyYzg3NzYsIHNyYzEwOTk4KTsKQEAgLTE0MDEsOSArMTM0Niw2IEBACiAgICAgICAgIFNSQVJJX0gyX1NIKG91dDEwLCBvdXQzMiwgNyk7CiAgICAgICAgIFNBVF9TSDJfU0gob3V0MTAsIG91dDMyLCA3KTsKICAgICAgICAgb3V0ID0gUENLRVZfWE9SSTEyOF9VQihvdXQxMCwgb3V0MzIpOwotICAgICAgICBJTFZSX1cyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDIpOwotCi0gICAgICAgIGRzdDAgPSAodjE2dTgpIF9fbXNhX2lsdnJfZCgodjJpNjQpIGRzdDIsICh2Mmk2NCkgZHN0MCk7CiAgICAgICAgIG91dCA9IF9fbXNhX2F2ZXJfdV9iKG91dCwgZHN0MCk7CiAKICAgICAgICAgU1Q0eDRfVUIob3V0LCBvdXQsIDAsIDEsIDIsIDMsIGRzdCwgZHN0X3N0cmlkZSk7CkBAIC0xNDIzLDggKzEzNjUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgdWludDMyX3QgbG9vcF9jbnQ7CisgICAgdWludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwOwotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2dTggZHN0MCwgZHN0MTsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmM5OF9yLCBzcmMyMV9yLCBzcmM0M19yOwogICAgIHYxNmk4IHNyYzY1X3IsIHNyYzg3X3IsIHNyYzEwOV9yLCBmaWx0MCwgZmlsdDEsIGZpbHQyLCBmaWx0MzsKICAgICB2OGkxNiBmaWx0LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOwpAQCAtMTQ0Niw3ICsxMzg5LDkgQEAKICAgICAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKIAotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgTEQ0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKICAgICAgICAgWE9SSV9CNF8xMjhfU0Ioc3JjNywgc3JjOCwgc3JjOSwgc3JjMTApOwogICAgICAgICBJTFZSX0I0X1NCKHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzksIHNyYzgsIHNyYzEwLCBzcmM5LCBzcmM3Nl9yLAogICAgICAgICAgICAgICAgICAgIHNyYzg3X3IsIHNyYzk4X3IsIHNyYzEwOV9yKTsKQEAgLTE0NjAsNyArMTQwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHQxLCBmaWx0MiwgZmlsdDMpOwogICAgICAgICBTUkFSSV9INF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKICAgICAgICAgU0FUX1NINF9TSChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCA3KTsKLSAgICAgICAgQ09OVkVSVF9VQl9BVkdfU1Q4eDRfVUIob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgQ09OVkVSVF9VQl9BVkdfU1Q4eDRfVUIob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0MCwgZHN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKQEAgLTE2MTAsOCArMTU1NSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMywgdG1wMCwgdG1wMTsKKyAgICB2MTZ1OCBkc3QwLCByZXMsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szOwogICAgIHYxNmk4IGZpbHRfaHowLCBmaWx0X2h6MSwgZmlsdF9oejIsIGZpbHRfaHozOwogICAgIHY4aTE2IGh6X291dDAsIGh6X291dDEsIGh6X291dDIsIGh6X291dDMsIGh6X291dDQsIGh6X291dDUsIGh6X291dDY7CiAgICAgdjhpMTYgaHpfb3V0NywgaHpfb3V0OCwgaHpfb3V0OSwgcmVzMCwgcmVzMSwgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgdmVjNDsKQEAgLTE2NTMsNyArMTU5OSw4IEBACiAgICAgICAgIFhPUklfQjRfMTI4X1NCKHNyYzcsIHNyYzgsIHNyYzksIHNyYzEwKTsKICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CiAKLSAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgIExXNChkc3QsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOwogICAgICAgICBoel9vdXQ3ID0gSE9SSVpfOFRBUF9GSUxUKHNyYzcsIHNyYzgsIG1hc2swLCBtYXNrMSwgbWFzazIsIG1hc2szLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRfaHowLCBmaWx0X2h6MSwgZmlsdF9oejIsIGZpbHRfaHozKTsKICAgICAgICAgaHpfb3V0NiA9ICh2OGkxNikgX19tc2Ffc2xkaV9iKCh2MTZpOCkgaHpfb3V0NywgKHYxNmk4KSBoel9vdXQ1LCA4KTsKQEAgLTE2NjcsMTQgKzE2MTQsMTIgQEAKICAgICAgICAgdmVjNCA9ICh2OGkxNikgX19tc2FfaWx2ZXZfYigodjE2aTgpIGh6X291dDksICh2MTZpOCkgaHpfb3V0OCk7CiAgICAgICAgIHJlczEgPSBGSUxUXzhUQVBfRFBBRERfU19IKHZlYzEsIHZlYzIsIHZlYzMsIHZlYzQsIGZpbHRfdnQwLCBmaWx0X3Z0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF92dDIsIGZpbHRfdnQzKTsKLSAgICAgICAgSUxWUl9XMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QyKTsKIAogICAgICAgICBTUkFSSV9IMl9TSChyZXMwLCByZXMxLCA3KTsKICAgICAgICAgU0FUX1NIMl9TSChyZXMwLCByZXMxLCA3KTsKLSAgICAgICAgUENLRVZfQjJfVUIocmVzMCwgcmVzMCwgcmVzMSwgcmVzMSwgdG1wMCwgdG1wMSk7Ci0gICAgICAgIFhPUklfQjJfMTI4X1VCKHRtcDAsIHRtcDEpOwotICAgICAgICBBVkVSX1VCMl9VQih0bXAwLCBkc3QwLCB0bXAxLCBkc3QyLCB0bXAwLCB0bXAxKTsKLSAgICAgICAgU1Q0eDRfVUIodG1wMCwgdG1wMSwgMCwgMSwgMCwgMSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgcmVzID0gUENLRVZfWE9SSTEyOF9VQihyZXMwLCByZXMxKTsKKyAgICAgICAgcmVzID0gKHYxNnU4KSBfX21zYV9hdmVyX3VfYihyZXMsIGRzdDApOworICAgICAgICBTVDR4NF9VQihyZXMsIHJlcywgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKICAgICAgICAgaHpfb3V0NSA9IGh6X291dDk7CkBAIC0xNjkzLDEwICsxNjM4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMDsKICAgICB2MTZpOCBmaWx0X2h6MCwgZmlsdF9oejEsIGZpbHRfaHoyLCBmaWx0X2h6MzsKICAgICB2OGkxNiBmaWx0LCBmaWx0X3Z0MCwgZmlsdF92dDEsIGZpbHRfdnQyLCBmaWx0X3Z0MzsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMzsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxLCBtYXNrMCwgbWFzazEsIG1hc2syLCBtYXNrMzsKICAgICB2OGkxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2OwogICAgIHY4aTE2IGh6X291dDcsIGh6X291dDgsIGh6X291dDksIGh6X291dDEwLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwogICAgIHY4aTE2IG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDcsIG91dDgsIG91dDk7CkBAIC0xNzQzLDcgKzE2ODksOSBAQAogICAgICAgICBYT1JJX0I0XzEyOF9TQihzcmM3LCBzcmM4LCBzcmM5LCBzcmMxMCk7CiAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwogCi0gICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBMRDQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOwogCiAgICAgICAgIGh6X291dDcgPSBIT1JJWl84VEFQX0ZJTFQoc3JjNywgc3JjNywgbWFzazAsIG1hc2sxLCBtYXNrMiwgbWFzazMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdF9oejAsIGZpbHRfaHoxLCBmaWx0X2h6MiwgZmlsdF9oejMpOwpAQCAtMTc3MSw3ICsxNzE5LDcgQEAKIAogICAgICAgICBTUkFSSV9INF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKICAgICAgICAgU0FUX1NINF9TSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKLSAgICAgICAgQ09OVkVSVF9VQl9BVkdfU1Q4eDRfVUIodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKKyAgICAgICAgQ09OVkVSVF9VQl9BVkdfU1Q4eDRfVUIodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZHN0MCwgZHN0MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKQEAgLTI4NzMsOCArMjgyMSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2s7Ci0gICAgdjE2dTggZmlsdDAsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIHZlYzAsIHZlYzEsIHJlczAsIHJlczE7CisgICAgdjE2dTggZmlsdDAsIGRzdDAsIHZlYzAsIHZlYzEsIHJlczsKICAgICB2OHUxNiB2ZWMyLCB2ZWMzLCBmaWx0OwogCiAgICAgbWFzayA9IExEX1NCKCZtY19maWx0X21hc2tfYXJyWzE2XSk7CkBAIC0yODg0LDE0ICsyODMzLDE2IEBACiAgICAgZmlsdDAgPSAodjE2dTgpIF9fbXNhX3NwbGF0aV9oKCh2OGkxNikgZmlsdCwgMCk7CiAKICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICBMVzQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOwogICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgbWFzaywgbWFzaywgdmVjMCwgdmVjMSk7CiAgICAgRE9UUF9VQjJfVUgodmVjMCwgdmVjMSwgZmlsdDAsIGZpbHQwLCB2ZWMyLCB2ZWMzKTsKICAgICBTUkFSSV9IMl9VSCh2ZWMyLCB2ZWMzLCA3KTsKLSAgICBQQ0tFVl9CMl9VQih2ZWMyLCB2ZWMyLCB2ZWMzLCB2ZWMzLCByZXMwLCByZXMxKTsKLSAgICBJTFZSX1cyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDIpOwotICAgIEFWRVJfVUIyX1VCKHJlczAsIGRzdDAsIHJlczEsIGRzdDIsIHJlczAsIHJlczEpOwotICAgIFNUNHg0X1VCKHJlczAsIHJlczEsIDAsIDEsIDAsIDEsIGRzdCwgZHN0X3N0cmlkZSk7CisKKyAgICByZXMgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB2ZWMzLCAodjE2aTgpIHZlYzIpOworICAgIHJlcyA9ICh2MTZ1OCkgX19tc2FfYXZlcl91X2IocmVzLCBkc3QwKTsKKworICAgIFNUNHg0X1VCKHJlcywgcmVzLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogfQogCiBzdGF0aWMgdm9pZCBjb21tb25faHpfMnRfYW5kX2F2ZXJfZHN0XzR4OF9tc2EoY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjg5OSw5ICsyODUwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2s7CiAgICAgdjE2dTggZmlsdDAsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHJlczAsIHJlczEsIHJlczIsIHJlczM7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NzsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxOwogICAgIHY4dTE2IHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQ7CiAKICAgICBtYXNrID0gTERfU0IoJm1jX2ZpbHRfbWFza19hcnJbMTZdKTsKQEAgLTI5MTEsNyArMjg2MywxMCBAQAogICAgIGZpbHQwID0gKHYxNnU4KSBfX21zYV9zcGxhdGlfaCgodjhpMTYpIGZpbHQsIDApOwogCiAgICAgTERfU0I4KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgTERfVUI4KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgTFc0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICBMVzQoZHN0ICsgNCAqIGRzdF9zdHJpZGUsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MSk7CiAgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrLCBtYXNrLCB2ZWMwLCB2ZWMxKTsKICAgICBWU0hGX0IyX1VCKHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIG1hc2ssIG1hc2ssIHZlYzIsIHZlYzMpOwogICAgIERPVFBfVUI0X1VIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCB2ZWM0LCB2ZWM1LApAQCAtMjkxOSwxMyArMjg3NCw5IEBACiAgICAgU1JBUklfSDRfVUgodmVjNCwgdmVjNSwgdmVjNiwgdmVjNywgNyk7CiAgICAgUENLRVZfQjRfVUIodmVjNCwgdmVjNCwgdmVjNSwgdmVjNSwgdmVjNiwgdmVjNiwgdmVjNywgdmVjNywgcmVzMCwgcmVzMSwKICAgICAgICAgICAgICAgICByZXMyLCByZXMzKTsKLSAgICBJTFZSX1c0X1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDUsIGRzdDQsIGRzdDcsIGRzdDYsIGRzdDAsIGRzdDIsCi0gICAgICAgICAgICAgICBkc3Q0LCBkc3Q2KTsKLSAgICBBVkVSX1VCNF9VQihyZXMwLCBkc3QwLCByZXMxLCBkc3QyLCByZXMyLCBkc3Q0LCByZXMzLCBkc3Q2LCByZXMwLCByZXMxLAotICAgICAgICAgICAgICAgIHJlczIsIHJlczMpOwotICAgIFNUNHg0X1VCKHJlczAsIHJlczEsIDAsIDEsIDAsIDEsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgU1Q0eDRfVUIocmVzMiwgcmVzMywgMCwgMSwgMCwgMSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBJTFZSX0QyX1VCKHJlczEsIHJlczAsIHJlczMsIHJlczIsIHJlczAsIHJlczIpOworICAgIEFWRVJfVUIyX1VCKHJlczAsIGRzdDAsIHJlczIsIGRzdDEsIHJlczAsIHJlczIpOworICAgIFNUNHg4X1VCKHJlczAsIHJlczIsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHZvaWQgZmZfYXZnX2JpbGluXzRoX21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLApAQCAtMjk0OCw4ICsyODk5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcikKIHsKKyAgICBpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBtYXNrOwotICAgIHYxNnU4IGZpbHQwLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHYxNnU4IGZpbHQwLCBkc3QwLCBkc3QxOwogICAgIHY4dTE2IHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQ7CiAKICAgICBtYXNrID0gTERfU0IoJm1jX2ZpbHRfbWFza19hcnJbMF0pOwpAQCAtMjk2NCw5ICsyOTE2LDEwIEBACiAgICAgRE9UUF9VQjRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsCiAgICAgICAgICAgICAgICAgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgU1JBUklfSDRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgNyk7Ci0gICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgUENLRVZfQVZHX1NUOHg0X1VCKHZlYzAsIGRzdDAsIHZlYzEsIGRzdDEsIHZlYzIsIGRzdDIsIHZlYzMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgTEQ0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgUENLRVZfQVZHX1NUOHg0X1VCKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbW1vbl9oel8ydF9hbmRfYXZlcl9kc3RfOHg4bXVsdF9tc2EoY29uc3QgdWludDhfdCAqc3JjLApAQCAtMjk3Niw4ICsyOTI5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogeworICAgIGludDY0X3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIG1hc2s7Ci0gICAgdjE2dTggZmlsdDAsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2dTggZmlsdDAsIGRzdDAsIGRzdDE7CiAgICAgdjh1MTYgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDsKIAogICAgIG1hc2sgPSBMRF9TQigmbWNfZmlsdF9tYXNrX2FyclswXSk7CkBAIC0yOTkzLDExICsyOTQ3LDEyIEBACiAgICAgRE9UUF9VQjRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIHZlYzAsIHZlYzEsCiAgICAgICAgICAgICAgICAgdmVjMiwgdmVjMyk7CiAgICAgU1JBUklfSDRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgNyk7Ci0gICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgTEQ0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CiAgICAgTERfU0I0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CiAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgUENLRVZfQVZHX1NUOHg0X1VCKHZlYzAsIGRzdDAsIHZlYzEsIGRzdDEsIHZlYzIsIGRzdDIsIHZlYzMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgUENLRVZfQVZHX1NUOHg0X1VCKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKICAgICBWU0hGX0IyX1VIKHNyYzAsIHNyYzAsIHNyYzEsIHNyYzEsIG1hc2ssIG1hc2ssIHZlYzAsIHZlYzEpOwpAQCAtMzAwNSw5ICsyOTYwLDEwIEBACiAgICAgRE9UUF9VQjRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIHZlYzAsIHZlYzEsCiAgICAgICAgICAgICAgICAgdmVjMiwgdmVjMyk7CiAgICAgU1JBUklfSDRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgNyk7Ci0gICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgUENLRVZfQVZHX1NUOHg0X1VCKHZlYzAsIGRzdDAsIHZlYzEsIGRzdDEsIHZlYzIsIGRzdDIsIHZlYzMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgTEQ0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CisgICAgUENLRVZfQVZHX1NUOHg0X1VCKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKICAgICBpZiAoMTYgPT0gaGVpZ2h0KSB7CkBAIC0zMDE5LDEwICsyOTc1LDExIEBACiAgICAgICAgIERPVFBfVUI0X1VIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCB2ZWMwLAogICAgICAgICAgICAgICAgICAgICB2ZWMxLCB2ZWMyLCB2ZWMzKTsKICAgICAgICAgU1JBUklfSDRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgNyk7Ci0gICAgICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICBMRDQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOwogICAgICAgICBMRF9TQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgUENLRVZfQVZHX1NUOHg0X1VCKHZlYzAsIGRzdDAsIHZlYzEsIGRzdDEsIHZlYzIsIGRzdDIsIHZlYzMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBQQ0tFVl9BVkdfU1Q4eDRfVUIodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZHN0MCwgZHN0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKICAgICAgICAgVlNIRl9CMl9VSChzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrLCBtYXNrLCB2ZWMwLCB2ZWMxKTsKQEAgLTMwMzAsOSArMjk4NywxMCBAQAogICAgICAgICBET1RQX1VCNF9VSCh2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MCwgZmlsdDAsIGZpbHQwLCBmaWx0MCwgdmVjMCwKICAgICAgICAgICAgICAgICAgICAgdmVjMSwgdmVjMiwgdmVjMyk7CiAgICAgICAgIFNSQVJJX0g0X1VIKHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIDcpOwotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgUENLRVZfQVZHX1NUOHg0X1VCKHZlYzAsIGRzdDAsIHZlYzEsIGRzdDEsIHZlYzIsIGRzdDIsIHZlYzMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBMRDQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworICAgICAgICBQQ0tFVl9BVkdfU1Q4eDRfVUIodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZHN0MCwgZHN0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICB9CiB9CiAKQEAgLTMyMTYsOCArMzE3NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQ7Ci0gICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0Mywgb3V0LCBmaWx0MCwgc3JjMjExMCwgc3JjNDMzMjsKKyAgICB2MTZ1OCBkc3QwLCBvdXQsIGZpbHQwLCBzcmMyMTEwLCBzcmM0MzMyOwogICAgIHYxNmk4IHNyYzEwX3IsIHNyYzMyX3IsIHNyYzIxX3IsIHNyYzQzX3I7CiAgICAgdjhpMTYgZmlsdDsKICAgICB2OHUxNiB0bXAwLCB0bXAxOwpAQCAtMzIzMSw5ICszMTkwLDggQEAKICAgICBzcmM0ID0gTERfU0Ioc3JjKTsKICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKIAotICAgIExEX1VCNChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMpOwotICAgIElMVlJfVzJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgZHN0MCwgZHN0MSk7Ci0gICAgZHN0MCA9ICh2MTZ1OCkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgZHN0MSwgKHYyaTY0KSBkc3QwKTsKKyAgICBMVzQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOwogICAgIElMVlJfQjRfU0Ioc3JjMSwgc3JjMCwgc3JjMiwgc3JjMSwgc3JjMywgc3JjMiwgc3JjNCwgc3JjMywKICAgICAgICAgICAgICAgIHNyYzEwX3IsIHNyYzIxX3IsIHNyYzMyX3IsIHNyYzQzX3IpOwogICAgIElMVlJfRDJfVUIoc3JjMjFfciwgc3JjMTBfciwgc3JjNDNfciwgc3JjMzJfciwgc3JjMjExMCwgc3JjNDMzMik7CkBAIC0zMjUyLDcgKzMyMTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50MzJfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyKQogewotICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDc7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOworICAgIHYxNnU4IGRzdDAsIGRzdDE7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCwgc3JjODdfcjsKICAgICB2MTZpOCBzcmMxMF9yLCBzcmMzMl9yLCBzcmM1NF9yLCBzcmM3Nl9yLCBzcmMyMV9yLCBzcmM0M19yLCBzcmM2NV9yOwogICAgIHYxNnU4IHNyYzIxMTAsIHNyYzQzMzIsIHNyYzY1NTQsIHNyYzg3NzYsIGZpbHQwOwpAQCAtMzI2NiwxMCArMzIyNSwxMCBAQAogICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOwogICAgIHNyYzggPSBMRF9TQihzcmMpOwogCi0gICAgTERfVUI4KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7Ci0gICAgSUxWUl9XNF9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBkc3QwLCBkc3QxLAotICAgICAgICAgICAgICAgZHN0MiwgZHN0Myk7Ci0gICAgSUxWUl9EMl9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3QwLCBkc3QxKTsKKyAgICBMVzQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOworICAgIExXNChkc3QgKyA0ICogZHN0X3N0cmlkZSwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QxKTsKICAgICBJTFZSX0I0X1NCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHNyYzMsIHNyYzIsIHNyYzQsIHNyYzMsIHNyYzEwX3IsIHNyYzIxX3IsCiAgICAgICAgICAgICAgICBzcmMzMl9yLCBzcmM0M19yKTsKICAgICBJTFZSX0I0X1NCKHNyYzUsIHNyYzQsIHNyYzYsIHNyYzUsIHNyYzcsIHNyYzYsIHNyYzgsIHNyYzcsIHNyYzU0X3IsIHNyYzY1X3IsCkBAIC0zMjgyLDkgKzMyNDEsNyBAQAogICAgIFNBVF9VSDRfVUgodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CiAgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgc3JjMjExMCwgc3JjNDMzMik7CiAgICAgQVZFUl9VQjJfVUIoc3JjMjExMCwgZHN0MCwgc3JjNDMzMiwgZHN0MSwgc3JjMjExMCwgc3JjNDMzMik7Ci0gICAgU1Q0eDRfVUIoc3JjMjExMCwgc3JjMjExMCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICBTVDR4NF9VQihzcmM0MzMyLCBzcmM0MzMyLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgIFNUNHg4X1VCKHNyYzIxMTAsIHNyYzQzMzIsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHZvaWQgZmZfYXZnX2JpbGluXzR2X21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLApAQCAtMzMwOCw4ICszMjY1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXIpCiB7CisgICAgaW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNDsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MDsKKyAgICB2MTZ1OCBkc3QwLCBkc3QxLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCBmaWx0MDsKICAgICB2OHUxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwogICAgIHY4aTE2IGZpbHQ7CiAKQEAgLTMzMTgsMTUgKzMyNzYsMTYgQEAKICAgICBmaWx0MCA9ICh2MTZ1OCkgX19tc2Ffc3BsYXRpX2goZmlsdCwgMCk7CiAKICAgICBMRF9VQjUoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0KTsKLSAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICBMRDQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0MCk7CisgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKICAgICBJTFZSX0IyX1VCKHNyYzEsIHNyYzAsIHNyYzIsIHNyYzEsIHZlYzAsIHZlYzEpOwogICAgIElMVlJfQjJfVUIoc3JjMywgc3JjMiwgc3JjNCwgc3JjMywgdmVjMiwgdmVjMyk7CiAgICAgRE9UUF9VQjRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdDAsIGZpbHQwLCBmaWx0MCwgZmlsdDAsCiAgICAgICAgICAgICAgICAgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7CiAgICAgU1JBUklfSDRfVUgodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CiAgICAgU0FUX1VINF9VSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKLSAgICBQQ0tFVl9BVkdfU1Q4eDRfVUIodG1wMCwgZHN0MCwgdG1wMSwgZHN0MSwgdG1wMiwgZHN0MiwgdG1wMywgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICBQQ0tFVl9BVkdfU1Q4eDRfVUIodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZHN0MCwgZHN0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgY29tbW9uX3Z0XzJ0X2FuZF9hdmVyX2RzdF84eDhtdWx0X21zYShjb25zdCB1aW50OF90ICpzcmMsCkBAIC0zMzM3LDggKzMyOTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBsb29wX2NudDsKKyAgICBpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBzcmM4OwotICAgIHYxNnU4IGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcsIGRzdDg7CisgICAgdjE2dTggZHN0MCwgZHN0MSwgZHN0MiwgZHN0MzsKICAgICB2MTZ1OCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzLCB2ZWM0LCB2ZWM1LCB2ZWM2LCB2ZWM3LCBmaWx0MDsKICAgICB2OHUxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwogICAgIHY4aTE2IGZpbHQ7CkBAIC0zMzUzLDcgKzMzMTMsMTMgQEAKICAgICBmb3IgKGxvb3BfY250ID0gKGhlaWdodCA+PiAzKTsgbG9vcF9jbnQtLTspIHsKICAgICAgICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgc3JjOCk7CiAgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOwotICAgICAgICBMRF9VQjgoZHN0LCBkc3Rfc3RyaWRlLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3LCBkc3Q4KTsKKworICAgICAgICBMRDQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworICAgICAgICBMRDQoZHN0ICsgNCAqIGRzdF9zdHJpZGUsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDAsIHRwMSwgZHN0Mik7CisgICAgICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0Myk7CiAKICAgICAgICAgSUxWUl9CNF9VQihzcmMxLCBzcmMwLCBzcmMyLCBzcmMxLCBzcmMzLCBzcmMyLCBzcmM0LCBzcmMzLAogICAgICAgICAgICAgICAgICAgIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMpOwpAQCAtMzM2MywxNiArMzMyOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKICAgICAgICAgU1JBUklfSDRfVUgodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CiAgICAgICAgIFNBVF9VSDRfVUgodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7Ci0gICAgICAgIFBDS0VWX0FWR19TVDh4NF9VQih0bXAwLCBkc3QxLCB0bXAxLCBkc3QyLCB0bXAyLCBkc3QzLCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQVZHX1NUOHg0X1VCKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIERPVFBfVUI0X1VIKHZlYzQsIHZlYzUsIHZlYzYsIHZlYzcsIGZpbHQwLCBmaWx0MCwgZmlsdDAsIGZpbHQwLAogICAgICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKICAgICAgICAgU1JBUklfSDRfVUgodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7CiAgICAgICAgIFNBVF9VSDRfVUgodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7Ci0gICAgICAgIFBDS0VWX0FWR19TVDh4NF9VQih0bXAwLCBkc3Q1LCB0bXAxLCBkc3Q2LCB0bXAyLCBkc3Q3LCB0bXAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0OCwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgUENLRVZfQVZHX1NUOHg0X1VCKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIGRzdDIsIGRzdDMsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwogCiAgICAgICAgIHNyYzAgPSBzcmM4OwpAQCAtMzYyMiw5ICszNTg2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl9ob3JpeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ZlcnQpCiB7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIG1hc2s7CiAgICAgdjE2dTggZmlsdF9oeiwgZmlsdF92dCwgdmVjMCwgdmVjMTsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCByZXMwLCByZXMxOworICAgIHYxNnU4IGRzdDAsIG91dDsKICAgICB2OHUxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCB0bXAwLCB0bXAxLCBmaWx0OwogCiAgICAgbWFzayA9IExEX1NCKCZtY19maWx0X21hc2tfYXJyWzE2XSk7CkBAIC0zNjQ1LDE0ICszNjEwLDE3IEBACiAgICAgaHpfb3V0MyA9ICh2OHUxNikgX19tc2FfcGNrb2RfZCgodjJpNjQpIGh6X291dDQsICh2Mmk2NCkgaHpfb3V0Mik7CiAgICAgSUxWRVZfQjJfVUIoaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgdmVjMCwgdmVjMSk7CiAKLSAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICBJTFZSX1cyX1VCKGRzdDEsIGRzdDAsIGRzdDMsIGRzdDIsIGRzdDAsIGRzdDIpOworICAgIExXNChkc3QsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MCk7CisKICAgICBET1RQX1VCMl9VSCh2ZWMwLCB2ZWMxLCBmaWx0X3Z0LCBmaWx0X3Z0LCB0bXAwLCB0bXAxKTsKICAgICBTUkFSSV9IMl9VSCh0bXAwLCB0bXAxLCA3KTsKICAgICBTQVRfVUgyX1VIKHRtcDAsIHRtcDEsIDcpOwotICAgIFBDS0VWX0IyX1VCKHRtcDAsIHRtcDAsIHRtcDEsIHRtcDEsIHJlczAsIHJlczEpOwotICAgIEFWRVJfVUIyX1VCKHJlczAsIGRzdDAsIHJlczEsIGRzdDIsIHJlczAsIHJlczEpOwotICAgIFNUNHg0X1VCKHJlczAsIHJlczEsIDAsIDEsIDAsIDEsIGRzdCwgZHN0X3N0cmlkZSk7CisKKyAgICBvdXQgPSAodjE2dTgpIF9fbXNhX3Bja2V2X2IoKHYxNmk4KSB0bXAxLCAodjE2aTgpIHRtcDApOworICAgIG91dCA9IF9fbXNhX2F2ZXJfdV9iKG91dCwgZHN0MCk7CisKKyAgICBTVDR4NF9VQihvdXQsIG91dCwgMCwgMSwgMiwgMywgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAogc3RhdGljIHZvaWQgY29tbW9uX2h2XzJodF8ydnRfYW5kX2F2ZXJfZHN0XzR4OF9tc2EoY29uc3QgdWludDhfdCAqc3JjLApAQCAtMzY2Miw5ICszNjMwLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgKmZpbHRlcl9ob3JpeiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX3ZlcnQpCiB7CisgICAgdWludDMyX3QgdHAwLCB0cDEsIHRwMiwgdHAzOwogICAgIHYxNmk4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIHNyYzgsIG1hc2s7Ci0gICAgdjE2dTggZmlsdF9oeiwgZmlsdF92dCwgdmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OworICAgIHYxNnU4IGZpbHRfaHosIGZpbHRfdnQsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzMsIHJlczAsIHJlczE7CisgICAgdjE2dTggZHN0MCwgZHN0MTsKICAgICB2OHUxNiBoel9vdXQwLCBoel9vdXQxLCBoel9vdXQyLCBoel9vdXQzLCBoel9vdXQ0LCBoel9vdXQ1LCBoel9vdXQ2OwogICAgIHY4dTE2IGh6X291dDcsIGh6X291dDgsIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7CiAgICAgdjhpMTYgZmlsdDsKQEAgLTM2OTEsMjIgKzM2NjAsMTkgQEAKICAgICAgICAgICAgICAgIGh6X291dDMsIGh6X291dDUsIDgpOwogICAgIGh6X291dDcgPSAodjh1MTYpIF9fbXNhX3Bja29kX2QoKHYyaTY0KSBoel9vdXQ4LCAodjJpNjQpIGh6X291dDYpOwogCi0gICAgTERfVUI4KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7Ci0gICAgSUxWUl9XNF9VQihkc3QxLCBkc3QwLCBkc3QzLCBkc3QyLCBkc3Q1LCBkc3Q0LCBkc3Q3LCBkc3Q2LCBkc3QwLCBkc3QyLAotICAgICAgICAgICAgICAgZHN0NCwgZHN0Nik7CisgICAgTFc0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICBMVzQoZHN0ICsgNCAqIGRzdF9zdHJpZGUsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgZHN0MSk7CiAgICAgSUxWRVZfQjJfVUIoaHpfb3V0MCwgaHpfb3V0MSwgaHpfb3V0MiwgaHpfb3V0MywgdmVjMCwgdmVjMSk7CiAgICAgSUxWRVZfQjJfVUIoaHpfb3V0NCwgaHpfb3V0NSwgaHpfb3V0NiwgaHpfb3V0NywgdmVjMiwgdmVjMyk7CiAgICAgRE9UUF9VQjRfVUgodmVjMCwgdmVjMSwgdmVjMiwgdmVjMywgZmlsdF92dCwgZmlsdF92dCwgZmlsdF92dCwgZmlsdF92dCwKICAgICAgICAgICAgICAgICB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzKTsKICAgICBTUkFSSV9INF9VSCh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCA3KTsKICAgICBTQVRfVUg0X1VIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOwotICAgIFBDS0VWX0I0X1VCKHRtcDAsIHRtcDAsIHRtcDEsIHRtcDEsIHRtcDIsIHRtcDIsIHRtcDMsIHRtcDMsIHJlczAsIHJlczEsCi0gICAgICAgICAgICAgICAgcmVzMiwgcmVzMyk7Ci0gICAgQVZFUl9VQjRfVUIocmVzMCwgZHN0MCwgcmVzMSwgZHN0MiwgcmVzMiwgZHN0NCwgcmVzMywgZHN0NiwgcmVzMCwgcmVzMSwKLSAgICAgICAgICAgICAgICByZXMyLCByZXMzKTsKLSAgICBTVDR4NF9VQihyZXMwLCByZXMxLCAwLCAxLCAwLCAxLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgIFNUNHg0X1VCKHJlczIsIHJlczMsIDAsIDEsIDAsIDEsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgUENLRVZfQjJfVUIodG1wMSwgdG1wMCwgdG1wMywgdG1wMiwgcmVzMCwgcmVzMSk7CisgICAgQVZFUl9VQjJfVUIocmVzMCwgZHN0MCwgcmVzMSwgZHN0MSwgcmVzMCwgcmVzMSk7CisgICAgU1Q0eDhfVUIocmVzMCwgcmVzMSwgZHN0LCBkc3Rfc3RyaWRlKTsKIH0KIAogdm9pZCBmZl9hdmdfYmlsaW5fNGh2X21zYSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLApAQCAtMzczMiw4ICszNjk4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqZmlsdGVyX2hvcml6LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90ICpmaWx0ZXJfdmVydCkKIHsKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDM7CiAgICAgdjE2aTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgbWFzazsKLSAgICB2MTZ1OCBmaWx0X2h6LCBmaWx0X3Z0LCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCB2ZWMwLCB2ZWMxLCB2ZWMyLCB2ZWMzOworICAgIHYxNnU4IGZpbHRfaHosIGZpbHRfdnQsIGRzdDAsIGRzdDEsIHZlYzAsIHZlYzEsIHZlYzIsIHZlYzM7CiAgICAgdjh1MTYgaHpfb3V0MCwgaHpfb3V0MSwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKICAgICB2OGkxNiBmaWx0OwogCkBAIC0zNzQ5LDcgKzM3MTYsOSBAQAogICAgIExEX1NCNShzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQpOwogICAgIHNyYyArPSAoNSAqIHNyY19zdHJpZGUpOwogCi0gICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgTEQ0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgZHN0MSk7CiAgICAgaHpfb3V0MCA9IEhPUklaXzJUQVBfRklMVF9VSChzcmMwLCBzcmMwLCBtYXNrLCBmaWx0X2h6LCA3KTsKICAgICBoel9vdXQxID0gSE9SSVpfMlRBUF9GSUxUX1VIKHNyYzEsIHNyYzEsIG1hc2ssIGZpbHRfaHosIDcpOwogICAgIHZlYzAgPSAodjE2dTgpIF9fbXNhX2lsdmV2X2IoKHYxNmk4KSBoel9vdXQxLCAodjE2aTgpIGh6X291dDApOwpAQCAtMzc2OSw4ICszNzM4LDcgQEAKIAogICAgIFNSQVJJX0g0X1VIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIDcpOwogICAgIFNBVF9VSDRfVUgodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgNyk7Ci0gICAgUENLRVZfQVZHX1NUOHg0X1VCKHRtcDAsIGRzdDAsIHRtcDEsIGRzdDEsIHRtcDIsIGRzdDIsIHRtcDMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgUENLRVZfQVZHX1NUOHg0X1VCKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNvbW1vbl9odl8yaHRfMnZ0X2FuZF9hdmVyX2RzdF84eDhtdWx0X21zYShjb25zdCB1aW50OF90ICpzcmMsCkBAIC0zNzgyLDggKzM3NTAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewogICAgIHVpbnQzMl90IGxvb3BfY250OworICAgIHVpbnQ2NF90IHRwMCwgdHAxLCB0cDIsIHRwMzsKICAgICB2MTZpOCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBtYXNrOwotICAgIHYxNnU4IGZpbHRfaHosIGZpbHRfdnQsIHZlYzAsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgdjE2dTggZmlsdF9oeiwgZmlsdF92dCwgdmVjMCwgZHN0MCwgZHN0MTsKICAgICB2OHUxNiBoel9vdXQwLCBoel9vdXQxLCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOwogICAgIHY4aTE2IGZpbHQ7CiAKQEAgLTM4MjYsOSArMzc5NSwxMCBAQAogCiAgICAgICAgIFNSQVJJX0gyX1VIKHRtcDIsIHRtcDMsIDcpOwogICAgICAgICBTQVRfVUgyX1VIKHRtcDIsIHRtcDMsIDcpOwotICAgICAgICBMRF9VQjQoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLSAgICAgICAgUENLRVZfQVZHX1NUOHg0X1VCKHRtcDAsIGRzdDAsIHRtcDEsIGRzdDEsIHRtcDIsIGRzdDIsIHRtcDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBMRDQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgICAgICBJTlNFUlRfRDJfVUIodHAyLCB0cDMsIGRzdDEpOworICAgICAgICBQQ0tFVl9BVkdfU1Q4eDRfVUIodG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgZHN0MCwgZHN0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgfQogfQpAQCAtMzk1Niw1MyArMzkyNiwxMyBAQAogewogICAgIGludDMyX3QgY250OwogICAgIHVpbnQ2NF90IG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDc7Ci0gICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKIAotICAgIGlmICgwID09IGhlaWdodCAlIDEyKSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCAvIDEyKTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMSwgMCk7Ci0gICAgICAgICAgICBvdXQyID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMyLCAwKTsKLSAgICAgICAgICAgIG91dDMgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzMsIDApOwotICAgICAgICAgICAgb3V0NCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNCwgMCk7Ci0gICAgICAgICAgICBvdXQ1ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM1LCAwKTsKLSAgICAgICAgICAgIG91dDYgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzYsIDApOwotICAgICAgICAgICAgb3V0NyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNywgMCk7Ci0KLSAgICAgICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTRDQob3V0NCwgb3V0NSwgb3V0Niwgb3V0NywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotCi0gICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgICAgICBvdXQwID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMwLCAwKTsKLSAgICAgICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzEsIDApOwotICAgICAgICAgICAgb3V0MiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMiwgMCk7Ci0gICAgICAgICAgICBvdXQzID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMzLCAwKTsKLQotICAgICAgICAgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSA4KSB7CisgICAgaWYgKDAgPT0gaGVpZ2h0ICUgOCkgewogICAgICAgICBmb3IgKGNudCA9IGhlaWdodCA+PiAzOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMxLCAwKTsKLSAgICAgICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzIsIDApOwotICAgICAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMywgMCk7Ci0gICAgICAgICAgICBvdXQ0ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM0LCAwKTsKLSAgICAgICAgICAgIG91dDUgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzUsIDApOwotICAgICAgICAgICAgb3V0NiA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjNiwgMCk7Ci0gICAgICAgICAgICBvdXQ3ID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmM3LCAwKTsKKyAgICAgICAgICAgIExENChzcmMsIHNyY19zdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgICAgICBMRDQoc3JjLCBzcmNfc3RyaWRlLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwogCiAgICAgICAgICAgICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKICAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwpAQCAtNDAxMSw1NiArMzk0MSwxMiBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDQpIHsKICAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gNCk7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgICAgICAgICBMRDQoc3JjLCBzcmNfc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKICAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMxLCAwKTsKLSAgICAgICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIHNyYzIsIDApOwotICAgICAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMywgMCk7CiAKICAgICAgICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgMikgewotICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyAyKTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgc3JjMCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBzcmMxLCAwKTsKLQotICAgICAgICAgICAgU0Qob3V0MCwgZHN0KTsKLSAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICAgICAgU0Qob3V0MSwgZHN0KTsKLSAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5XzE2bXVsdHg4bXVsdF9tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgpCi17Ci0gICAgaW50MzJfdCBjbnQsIGxvb3BfY250OwotICAgIGNvbnN0IHVpbnQ4X3QgKnNyY190bXA7Ci0gICAgdWludDhfdCAqZHN0X3RtcDsKLSAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwotCi0gICAgZm9yIChjbnQgPSAod2lkdGggPj4gNCk7IGNudC0tOykgewotICAgICAgICBzcmNfdG1wID0gc3JjOwotICAgICAgICBkc3RfdG1wID0gZHN0OwotCi0gICAgICAgIGZvciAobG9vcF9jbnQgPSAoaGVpZ2h0ID4+IDMpOyBsb29wX2NudC0tOykgewotICAgICAgICAgICAgTERfVUI4KHNyY190bXAsIHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7Ci0gICAgICAgICAgICBzcmNfdG1wICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIFNUX1VCOChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LAotICAgICAgICAgICAgICAgICAgIGRzdF90bXAsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0X3RtcCArPSAoOCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjICs9IDE2OwotICAgICAgICBkc3QgKz0gMTY7CiAgICAgfQogfQogCkBAIC00MDcxLDI3ICszOTU3LDM3IEBACiAgICAgaW50MzJfdCBjbnQ7CiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKIAotICAgIGlmICgwID09IGhlaWdodCAlIDEyKSB7Ci0gICAgICAgIGZvciAoY250ID0gKGhlaWdodCAvIDEyKTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOwotICAgICAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywKLSAgICAgICAgICAgICAgICAgICBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDgpIHsKLSAgICAgICAgY29weV8xNm11bHR4OG11bHRfbXNhKHNyYywgc3JjX3N0cmlkZSwgZHN0LCBkc3Rfc3RyaWRlLCBoZWlnaHQsIDE2KTsKKyAgICBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIFNUX1VCOChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBkc3QsIGRzdF9zdHJpZGUpOworICAgIH0gZWxzZSBpZiAoMTYgPT0gaGVpZ2h0KSB7CisgICAgICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgU1RfVUI4KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFNUX1VCOChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYgKDMyID09IGhlaWdodCkgeworICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7CisgICAgICAgIFNUX1VCOChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3LCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICBkc3QgKz0gKDggKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOworICAgICAgICBTVF9VQjgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CisgICAgICAgIExEX1VCOChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gKDggKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgU1RfVUI4KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgZHN0X3N0cmlkZSk7CisgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgU1RfVUI4KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgfSBlbHNlIGlmICgwID09IGhlaWdodCAlIDQpIHsKICAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0ID4+IDIpOyBjbnQtLTspIHsKICAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwogICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0KICAgICAgICAgICAgIFNUX1VCNChzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CiAgICAgICAgIH0KQEAgLTQxMDUsMzEgKzQwMDEsMTcgQEAKICAgICBpbnQzMl90IGNudDsKICAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OwogCi0gICAgaWYgKDAgPT0gaGVpZ2h0ICUgMTIpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gMTIpOyBjbnQtLTspIHsKLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7Ci0KLSAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOwotICAgICAgICAgICAgU1RfVUI0KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0ICsgMTYsIGRzdF9zdHJpZGUpOwotICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgaWYgKDAgPT0gaGVpZ2h0ICUgOCkgeworICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgPj4gMyk7IGNudC0tOykgeworICAgICAgICAgICAgTERfVUI4KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgICAgICAgICAgICBTVF9VQjgoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIExEX1VCOChzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwKKyAgICAgICAgICAgICAgICAgICBzcmM3KTsKKyAgICAgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOworICAgICAgICAgICAgU1RfVUI4KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcsIGRzdCArIDE2LAorICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKDAgPT0gaGVpZ2h0ICUgOCkgewotICAgICAgICBjb3B5XzE2bXVsdHg4bXVsdF9tc2Eoc3JjLCBzcmNfc3RyaWRlLCBkc3QsIGRzdF9zdHJpZGUsIGhlaWdodCwgMzIpOwogICAgIH0gZWxzZSBpZiAoMCA9PSBoZWlnaHQgJSA0KSB7CiAgICAgICAgIGZvciAoY250ID0gKGhlaWdodCA+PiAyKTsgY250LS07KSB7CiAgICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKQEAgLTQxNDYsNTEgKzQwMjgsNTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQzMl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGNvcHlfMTZtdWx0eDhtdWx0X21zYShzcmMsIHNyY19zdHJpZGUsIGRzdCwgZHN0X3N0cmlkZSwgaGVpZ2h0LCA2NCk7CisgICAgaW50MzJfdCBjbnQ7CisgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgICB2MTZ1OCBzcmM4LCBzcmM5LCBzcmMxMCwgc3JjMTEsIHNyYzEyLCBzcmMxMywgc3JjMTQsIHNyYzE1OworCisgICAgZm9yIChjbnQgPSAoaGVpZ2h0ID4+IDIpOyBjbnQtLTspIHsKKyAgICAgICAgTERfVUI0KHNyYywgMTYsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfVUI0KHNyYywgMTYsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKyAgICAgICAgTERfVUI0KHNyYywgMTYsIHNyYzgsIHNyYzksIHNyYzEwLCBzcmMxMSk7CisgICAgICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICAgICBMRF9VQjQoc3JjLCAxNiwgc3JjMTIsIHNyYzEzLCBzcmMxNCwgc3JjMTUpOworICAgICAgICBzcmMgKz0gc3JjX3N0cmlkZTsKKworICAgICAgICBTVF9VQjQoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZHN0LCAxNik7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTVF9VQjQoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgZHN0LCAxNik7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgICAgICBTVF9VQjQoc3JjOCwgc3JjOSwgc3JjMTAsIHNyYzExLCBkc3QsIDE2KTsKKyAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgICAgIFNUX1VCNChzcmMxMiwgc3JjMTMsIHNyYzE0LCBzcmMxNSwgZHN0LCAxNik7CisgICAgICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICAgIH0KIH0KIAogc3RhdGljIHZvaWQgYXZnX3dpZHRoNF9tc2EoY29uc3QgdWludDhfdCAqc3JjLCBpbnQzMl90IHNyY19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludDMyX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KQogewotICAgIGludDMyX3QgY250OwotICAgIHVpbnQzMl90IG91dDAsIG91dDEsIG91dDIsIG91dDM7Ci0gICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKLSAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOworICAgIHVpbnQzMl90IHRwMCwgdHAxLCB0cDIsIHRwMzsKKyAgICB2MTZ1OCBzcmMwID0geyAwIH0sIHNyYzEgPSB7IDAgfSwgZHN0MCA9IHsgMCB9LCBkc3QxID0geyAwIH07CiAKLSAgICBpZiAoMCA9PSAoaGVpZ2h0ICUgNCkpIHsKLSAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gNCk7IGNudC0tOykgewotICAgICAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7Ci0gICAgICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLQotICAgICAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgICAgIEFWRVJfVUI0X1VCKHNyYzAsIGRzdDAsIHNyYzEsIGRzdDEsIHNyYzIsIGRzdDIsIHNyYzMsIGRzdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKLQotICAgICAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MCwgMCk7Ci0gICAgICAgICAgICBvdXQxID0gX19tc2FfY29weV91X3coKHY0aTMyKSBkc3QxLCAwKTsKLSAgICAgICAgICAgIG91dDIgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDIsIDApOwotICAgICAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MywgMCk7Ci0gICAgICAgICAgICBTVzQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSAyKSkgewotICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyAyKTsgY250LS07KSB7Ci0gICAgICAgICAgICBMRF9VQjIoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxKTsKLSAgICAgICAgICAgIHNyYyArPSAoMiAqIHNyY19zdHJpZGUpOwotCi0gICAgICAgICAgICBMRF9VQjIoZHN0LCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QxKTsKLQotICAgICAgICAgICAgQVZFUl9VQjJfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgZHN0MCwgZHN0MSk7Ci0KLSAgICAgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3VfdygodjRpMzIpIGRzdDAsIDApOwotICAgICAgICAgICAgb3V0MSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgZHN0MSwgMCk7Ci0gICAgICAgICAgICBTVyhvdXQwLCBkc3QpOwotICAgICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgICAgICBTVyhvdXQxLCBkc3QpOwotICAgICAgICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgICAgIH0KKyAgICBpZiAoOCA9PSBoZWlnaHQpIHsKKyAgICAgICAgTFc0KHNyYywgc3JjX3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgc3JjICs9IDQgKiBzcmNfc3RyaWRlOworICAgICAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBzcmMwKTsKKyAgICAgICAgTFc0KHNyYywgc3JjX3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgSU5TRVJUX1c0X1VCKHRwMCwgdHAxLCB0cDIsIHRwMywgc3JjMSk7CisgICAgICAgIExXNChkc3QsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDApOworICAgICAgICBMVzQoZHN0ICsgNCAqIGRzdF9zdHJpZGUsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIGRzdDEpOworICAgICAgICBBVkVSX1VCMl9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBkc3QwLCBkc3QxKTsKKyAgICAgICAgU1Q0eDhfVUIoZHN0MCwgZHN0MSwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICB9IGVsc2UgaWYgKDQgPT0gaGVpZ2h0KSB7CisgICAgICAgIExXNChzcmMsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgIElOU0VSVF9XNF9VQih0cDAsIHRwMSwgdHAyLCB0cDMsIHNyYzApOworICAgICAgICBMVzQoZHN0LCBkc3Rfc3RyaWRlLCB0cDAsIHRwMSwgdHAyLCB0cDMpOworICAgICAgICBJTlNFUlRfVzRfVUIodHAwLCB0cDEsIHRwMiwgdHAzLCBkc3QwKTsKKyAgICAgICAgZHN0MCA9IF9fbXNhX2F2ZXJfdV9iKHNyYzAsIGRzdDApOworICAgICAgICBTVDR4NF9VQihkc3QwLCBkc3QwLCAwLCAxLCAyLCAzLCBkc3QsIGRzdF9zdHJpZGUpOwogICAgIH0KIH0KIApAQCAtNDE5OSwyNCArNDA4Nyw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpCiB7CiAgICAgaW50MzJfdCBjbnQ7Ci0gICAgdWludDY0X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICB1aW50NjRfdCB0cDAsIHRwMSwgdHAyLCB0cDMsIHRwNCwgdHA1LCB0cDYsIHRwNzsKICAgICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzOwogICAgIHYxNnU4IGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CiAKLSAgICBmb3IgKGNudCA9IChoZWlnaHQgLyA0KTsgY250LS07KSB7Ci0gICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgQVZFUl9VQjRfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgc3JjMiwgZHN0Miwgc3JjMywgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0KLSAgICAgICAgb3V0MCA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MCwgMCk7Ci0gICAgICAgIG91dDEgPSBfX21zYV9jb3B5X3VfZCgodjJpNjQpIGRzdDEsIDApOwotICAgICAgICBvdXQyID0gX19tc2FfY29weV91X2QoKHYyaTY0KSBkc3QyLCAwKTsKLSAgICAgICAgb3V0MyA9IF9fbXNhX2NvcHlfdV9kKCh2Mmk2NCkgZHN0MywgMCk7Ci0gICAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIGRzdF9zdHJpZGUpOwotICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICBpZiAoMCA9PSAoaGVpZ2h0ICUgOCkpIHsKKyAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0ID4+IDMpOyBjbnQtLTspIHsKKyAgICAgICAgICAgIExENChzcmMsIHNyY19zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgICAgICBzcmMgKz0gNCAqIHNyY19zdHJpZGU7CisgICAgICAgICAgICBMRDQoc3JjLCBzcmNfc3RyaWRlLCB0cDQsIHRwNSwgdHA2LCB0cDcpOworICAgICAgICAgICAgc3JjICs9IDQgKiBzcmNfc3RyaWRlOworICAgICAgICAgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9VQih0cDIsIHRwMywgc3JjMSk7CisgICAgICAgICAgICBJTlNFUlRfRDJfVUIodHA0LCB0cDUsIHNyYzIpOworICAgICAgICAgICAgSU5TRVJUX0QyX1VCKHRwNiwgdHA3LCBzcmMzKTsKKyAgICAgICAgICAgIExENChkc3QsIGRzdF9zdHJpZGUsIHRwMCwgdHAxLCB0cDIsIHRwMyk7CisgICAgICAgICAgICBMRDQoZHN0ICsgNCAqIGRzdF9zdHJpZGUsIGRzdF9zdHJpZGUsIHRwNCwgdHA1LCB0cDYsIHRwNyk7CisgICAgICAgICAgICBJTlNFUlRfRDJfVUIodHAwLCB0cDEsIGRzdDApOworICAgICAgICAgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICAgICAgICAgIElOU0VSVF9EMl9VQih0cDQsIHRwNSwgZHN0Mik7CisgICAgICAgICAgICBJTlNFUlRfRDJfVUIodHA2LCB0cDcsIGRzdDMpOworICAgICAgICAgICAgQVZFUl9VQjRfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgc3JjMiwgZHN0Miwgc3JjMywgZHN0MywgZHN0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdDEsIGRzdDIsIGRzdDMpOworICAgICAgICAgICAgU1Q4eDhfVUIoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSA4ICogZHN0X3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoNCA9PSBoZWlnaHQpIHsKKyAgICAgICAgTEQ0KHNyYywgc3JjX3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBzcmMwKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBzcmMxKTsKKyAgICAgICAgTEQ0KGRzdCwgZHN0X3N0cmlkZSwgdHAwLCB0cDEsIHRwMiwgdHAzKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMCwgdHAxLCBkc3QwKTsKKyAgICAgICAgSU5TRVJUX0QyX1VCKHRwMiwgdHAzLCBkc3QxKTsKKyAgICAgICAgQVZFUl9VQjJfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgZHN0MCwgZHN0MSk7CisgICAgICAgIFNUOHg0X1VCKGRzdDAsIGRzdDEsIGRzdCwgZHN0X3N0cmlkZSk7CiAgICAgfQogfQogCkBAIC00MjI4LDE3ICs0MTMyLDMwIEBACiAgICAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKICAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogCi0gICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gOCk7IGNudC0tOykgewotICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKLSAgICAgICAgc3JjICs9ICg4ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIExEX1VCOChkc3QsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDMsIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOworICAgIGlmICgwID09IChoZWlnaHQgJSA4KSkgeworICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyA4KTsgY250LS07KSB7CisgICAgICAgICAgICBMRF9VQjgoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3KTsKKyAgICAgICAgICAgIHNyYyArPSAoOCAqIHNyY19zdHJpZGUpOworICAgICAgICAgICAgTERfVUI4KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CiAKLSAgICAgICAgQVZFUl9VQjRfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgc3JjMiwgZHN0Miwgc3JjMywgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIEFWRVJfVUI0X1VCKHNyYzQsIGRzdDQsIHNyYzUsIGRzdDUsIHNyYzYsIGRzdDYsIHNyYzcsIGRzdDcsCi0gICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOwotICAgICAgICBTVF9VQjgoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg4ICogZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBBVkVSX1VCNF9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBzcmMzLCBkc3QzLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgICAgICBBVkVSX1VCNF9VQihzcmM0LCBkc3Q0LCBzcmM1LCBkc3Q1LCBzcmM2LCBkc3Q2LCBzcmM3LCBkc3Q3LAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgICAgICBTVF9VQjgoZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgZHN0NCwgZHN0NSwgZHN0NiwgZHN0NywgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoOCAqIGRzdF9zdHJpZGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSA0KSkgeworICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyA0KTsgY250LS07KSB7CisgICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICAgICAgTERfVUI0KGRzdCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisKKyAgICAgICAgICAgIEFWRVJfVUI0X1VCKHNyYzAsIGRzdDAsIHNyYzEsIGRzdDEsIHNyYzIsIGRzdDIsIHNyYzMsIGRzdDMsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzKTsKKyAgICAgICAgICAgIFNUX1VCNChkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTQyNTMsMzUgKzQxNzAsNTUgQEAKICAgICB2MTZ1OCBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzLCBkc3Q0LCBkc3Q1LCBkc3Q2LCBkc3Q3OwogICAgIHYxNnU4IGRzdDgsIGRzdDksIGRzdDEwLCBkc3QxMSwgZHN0MTIsIGRzdDEzLCBkc3QxNCwgZHN0MTU7CiAKLSAgICBmb3IgKGNudCA9IChoZWlnaHQgLyA4KTsgY250LS07KSB7Ci0gICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzAsIHNyYzIsIHNyYzQsIHNyYzYpOwotICAgICAgICBMRF9VQjQoc3JjICsgMTYsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzMsIHNyYzUsIHNyYzcpOwotICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKLSAgICAgICAgTERfVUI0KGRzdF9kdXAsIGRzdF9zdHJpZGUsIGRzdDAsIGRzdDIsIGRzdDQsIGRzdDYpOwotICAgICAgICBMRF9VQjQoZHN0X2R1cCArIDE2LCBkc3Rfc3RyaWRlLCBkc3QxLCBkc3QzLCBkc3Q1LCBkc3Q3KTsKLSAgICAgICAgZHN0X2R1cCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmM4LCBzcmMxMCwgc3JjMTIsIHNyYzE0KTsKLSAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM5LCBzcmMxMSwgc3JjMTMsIHNyYzE1KTsKLSAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7Ci0gICAgICAgIExEX1VCNChkc3RfZHVwLCBkc3Rfc3RyaWRlLCBkc3Q4LCBkc3QxMCwgZHN0MTIsIGRzdDE0KTsKLSAgICAgICAgTERfVUI0KGRzdF9kdXAgKyAxNiwgZHN0X3N0cmlkZSwgZHN0OSwgZHN0MTEsIGRzdDEzLCBkc3QxNSk7Ci0gICAgICAgIGRzdF9kdXAgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICBpZiAoMCA9PSAoaGVpZ2h0ICUgOCkpIHsKKyAgICAgICAgZm9yIChjbnQgPSAoaGVpZ2h0IC8gOCk7IGNudC0tOykgeworICAgICAgICAgICAgTERfVUI0KHNyYywgc3JjX3N0cmlkZSwgc3JjMCwgc3JjMiwgc3JjNCwgc3JjNik7CisgICAgICAgICAgICBMRF9VQjQoc3JjICsgMTYsIHNyY19zdHJpZGUsIHNyYzEsIHNyYzMsIHNyYzUsIHNyYzcpOworICAgICAgICAgICAgc3JjICs9ICg0ICogc3JjX3N0cmlkZSk7CisgICAgICAgICAgICBMRF9VQjQoZHN0X2R1cCwgZHN0X3N0cmlkZSwgZHN0MCwgZHN0MiwgZHN0NCwgZHN0Nik7CisgICAgICAgICAgICBMRF9VQjQoZHN0X2R1cCArIDE2LCBkc3Rfc3RyaWRlLCBkc3QxLCBkc3QzLCBkc3Q1LCBkc3Q3KTsKKyAgICAgICAgICAgIGRzdF9kdXAgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIExEX1VCNChzcmMsIHNyY19zdHJpZGUsIHNyYzgsIHNyYzEwLCBzcmMxMiwgc3JjMTQpOworICAgICAgICAgICAgTERfVUI0KHNyYyArIDE2LCBzcmNfc3RyaWRlLCBzcmM5LCBzcmMxMSwgc3JjMTMsIHNyYzE1KTsKKyAgICAgICAgICAgIHNyYyArPSAoNCAqIHNyY19zdHJpZGUpOworICAgICAgICAgICAgTERfVUI0KGRzdF9kdXAsIGRzdF9zdHJpZGUsIGRzdDgsIGRzdDEwLCBkc3QxMiwgZHN0MTQpOworICAgICAgICAgICAgTERfVUI0KGRzdF9kdXAgKyAxNiwgZHN0X3N0cmlkZSwgZHN0OSwgZHN0MTEsIGRzdDEzLCBkc3QxNSk7CisgICAgICAgICAgICBkc3RfZHVwICs9ICg0ICogZHN0X3N0cmlkZSk7CiAKLSAgICAgICAgQVZFUl9VQjRfVUIoc3JjMCwgZHN0MCwgc3JjMSwgZHN0MSwgc3JjMiwgZHN0Miwgc3JjMywgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7Ci0gICAgICAgIEFWRVJfVUI0X1VCKHNyYzQsIGRzdDQsIHNyYzUsIGRzdDUsIHNyYzYsIGRzdDYsIHNyYzcsIGRzdDcsCi0gICAgICAgICAgICAgICAgICAgIGRzdDQsIGRzdDUsIGRzdDYsIGRzdDcpOwotICAgICAgICBBVkVSX1VCNF9VQihzcmM4LCBkc3Q4LCBzcmM5LCBkc3Q5LCBzcmMxMCwgZHN0MTAsIHNyYzExLCBkc3QxMSwKLSAgICAgICAgICAgICAgICAgICAgZHN0OCwgZHN0OSwgZHN0MTAsIGRzdDExKTsKLSAgICAgICAgQVZFUl9VQjRfVUIoc3JjMTIsIGRzdDEyLCBzcmMxMywgZHN0MTMsIHNyYzE0LCBkc3QxNCwgc3JjMTUsIGRzdDE1LAotICAgICAgICAgICAgICAgICAgICBkc3QxMiwgZHN0MTMsIGRzdDE0LCBkc3QxNSk7CisgICAgICAgICAgICBBVkVSX1VCNF9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBzcmMzLCBkc3QzLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgICAgICBBVkVSX1VCNF9VQihzcmM0LCBkc3Q0LCBzcmM1LCBkc3Q1LCBzcmM2LCBkc3Q2LCBzcmM3LCBkc3Q3LAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisgICAgICAgICAgICBBVkVSX1VCNF9VQihzcmM4LCBkc3Q4LCBzcmM5LCBkc3Q5LCBzcmMxMCwgZHN0MTAsIHNyYzExLCBkc3QxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdDgsIGRzdDksIGRzdDEwLCBkc3QxMSk7CisgICAgICAgICAgICBBVkVSX1VCNF9VQihzcmMxMiwgZHN0MTIsIHNyYzEzLCBkc3QxMywgc3JjMTQsIGRzdDE0LCBzcmMxNSwgZHN0MTUsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3QxMiwgZHN0MTMsIGRzdDE0LCBkc3QxNSk7CiAKLSAgICAgICAgU1RfVUI0KGRzdDAsIGRzdDIsIGRzdDQsIGRzdDYsIGRzdCwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIFNUX1VCNChkc3QxLCBkc3QzLCBkc3Q1LCBkc3Q3LCBkc3QgKyAxNiwgZHN0X3N0cmlkZSk7Ci0gICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOwotICAgICAgICBTVF9VQjQoZHN0OCwgZHN0MTAsIGRzdDEyLCBkc3QxNCwgZHN0LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgU1RfVUI0KGRzdDksIGRzdDExLCBkc3QxMywgZHN0MTUsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKLSAgICAgICAgZHN0ICs9ICg0ICogZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBTVF9VQjQoZHN0MCwgZHN0MiwgZHN0NCwgZHN0NiwgZHN0LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFNUX1VCNChkc3QxLCBkc3QzLCBkc3Q1LCBkc3Q3LCBkc3QgKyAxNiwgZHN0X3N0cmlkZSk7CisgICAgICAgICAgICBkc3QgKz0gKDQgKiBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIFNUX1VCNChkc3Q4LCBkc3QxMCwgZHN0MTIsIGRzdDE0LCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgU1RfVUI0KGRzdDksIGRzdDExLCBkc3QxMywgZHN0MTUsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgwID09IChoZWlnaHQgJSA0KSkgeworICAgICAgICBmb3IgKGNudCA9IChoZWlnaHQgLyA0KTsgY250LS07KSB7CisgICAgICAgICAgICBMRF9VQjQoc3JjLCBzcmNfc3RyaWRlLCBzcmMwLCBzcmMyLCBzcmM0LCBzcmM2KTsKKyAgICAgICAgICAgIExEX1VCNChzcmMgKyAxNiwgc3JjX3N0cmlkZSwgc3JjMSwgc3JjMywgc3JjNSwgc3JjNyk7CisgICAgICAgICAgICBzcmMgKz0gKDQgKiBzcmNfc3RyaWRlKTsKKyAgICAgICAgICAgIExEX1VCNChkc3RfZHVwLCBkc3Rfc3RyaWRlLCBkc3QwLCBkc3QyLCBkc3Q0LCBkc3Q2KTsKKyAgICAgICAgICAgIExEX1VCNChkc3RfZHVwICsgMTYsIGRzdF9zdHJpZGUsIGRzdDEsIGRzdDMsIGRzdDUsIGRzdDcpOworICAgICAgICAgICAgZHN0X2R1cCArPSAoNCAqIGRzdF9zdHJpZGUpOworCisgICAgICAgICAgICBBVkVSX1VCNF9VQihzcmMwLCBkc3QwLCBzcmMxLCBkc3QxLCBzcmMyLCBkc3QyLCBzcmMzLCBkc3QzLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0Myk7CisgICAgICAgICAgICBBVkVSX1VCNF9VQihzcmM0LCBkc3Q0LCBzcmM1LCBkc3Q1LCBzcmM2LCBkc3Q2LCBzcmM3LCBkc3Q3LAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0NCwgZHN0NSwgZHN0NiwgZHN0Nyk7CisKKyAgICAgICAgICAgIFNUX1VCNChkc3QwLCBkc3QyLCBkc3Q0LCBkc3Q2LCBkc3QsIGRzdF9zdHJpZGUpOworICAgICAgICAgICAgU1RfVUI0KGRzdDEsIGRzdDMsIGRzdDUsIGRzdDcsIGRzdCArIDE2LCBkc3Rfc3RyaWRlKTsKKyAgICAgICAgICAgIGRzdCArPSAoNCAqIGRzdF9zdHJpZGUpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC00NDEzLDggKzQzNTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3Jjc3RyaWRlLCAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KSAgICAgICAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IHVpbnQ4X3QgKmhmaWx0ZXIgPSB2cDlfc3VicGVsX2ZpbHRlcnNfbXNhW3R5cGVfaWR4XVtteC0xXTsgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50OF90ICp2ZmlsdGVyID0gdnA5X3N1YnBlbF9maWx0ZXJzX21zYVt0eXBlX2lkeF1bbXktMV07ICAgICAgICAgICBcCisgICAgY29uc3QgaW50OF90ICpoZmlsdGVyID0gdnA5X3N1YnBlbF9maWx0ZXJzX21zYVt0eXBlX2lkeF1bbXgtMV07ICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDhfdCAqdmZpbHRlciA9IHZwOV9zdWJwZWxfZmlsdGVyc19tc2FbdHlwZV9pZHhdW215LTFdOyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgY29tbW9uX2h2XzhodF84dnRfIyNTSVpFIyN3X21zYShzcmMsIHNyY3N0cmlkZSwgZHN0LCBkc3RzdHJpZGUsIGhmaWx0ZXIsICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmZpbHRlciwgaCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQ0NDcsOCArNDM4NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmNzdHJpZGUsICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpICAgICAgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDhfdCAqaGZpbHRlciA9IHZwOV9zdWJwZWxfZmlsdGVyc19tc2FbdHlwZV9pZHhdW214LTFdOyAgICAgICAgICAgXAotICAgIGNvbnN0IHVpbnQ4X3QgKnZmaWx0ZXIgPSB2cDlfc3VicGVsX2ZpbHRlcnNfbXNhW3R5cGVfaWR4XVtteS0xXTsgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQ4X3QgKmhmaWx0ZXIgPSB2cDlfc3VicGVsX2ZpbHRlcnNfbXNhW3R5cGVfaWR4XVtteC0xXTsgICAgICAgICAgICBcCisgICAgY29uc3QgaW50OF90ICp2ZmlsdGVyID0gdnA5X3N1YnBlbF9maWx0ZXJzX21zYVt0eXBlX2lkeF1bbXktMV07ICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjb21tb25faHZfOGh0Xzh2dF9hbmRfYXZlcl9kc3RfIyNTSVpFIyN3X21zYShzcmMsIHNyY3N0cmlkZSwgZHN0LCAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0c3RyaWRlLCBoZmlsdGVyLCAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3dtdjJkc3BfaW5pdF9taXBzLmMgYi9saWJhdmNvZGVjL21pcHMvd212MmRzcF9pbml0X21pcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWRkMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9taXBzL3dtdjJkc3BfaW5pdF9taXBzLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBaaG91IFhpYW95b25nIDx6aG91eGlhb3lvbmdAbG9vbmdzb24uY24+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgIndtdjJkc3BfbWlwcy5oIgorCisjaWYgSEFWRV9NTUkKK3N0YXRpYyBhdl9jb2xkIHZvaWQgd212MmRzcF9pbml0X21taShXTVYyRFNQQ29udGV4dCAqYykKK3sKKyAgICBjLT5pZGN0X2FkZCAgPSBmZl93bXYyX2lkY3RfYWRkX21taTsKKyAgICBjLT5pZGN0X3B1dCAgPSBmZl93bXYyX2lkY3RfcHV0X21taTsKK30KKyNlbmRpZiAvKiBIQVZFX01NSSAqLworCithdl9jb2xkIHZvaWQgZmZfd212MmRzcF9pbml0X21pcHMoV01WMkRTUENvbnRleHQgKmMpCit7CisjaWYgSEFWRV9NTUkKKyAgICB3bXYyZHNwX2luaXRfbW1pKGMpOworI2VuZGlmIC8qIEhBVkVfTU1JICovCit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21pcHMvd212MmRzcF9taXBzLmggYi9saWJhdmNvZGVjL21pcHMvd212MmRzcF9taXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4OTRjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbWlwcy93bXYyZHNwX21pcHMuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFpob3UgWGlhb3lvbmcgPHpob3V4aWFveW9uZ0Bsb29uZ3Nvbi5jbj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01JUFNfV01WMkRTUF9NSVBTX0gKKyNkZWZpbmUgQVZDT0RFQ19NSVBTX1dNVjJEU1BfTUlQU19ICisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3dtdjJkc3AuaCIKKwordm9pZCBmZl93bXYyX2lkY3RfYWRkX21taSh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3dtdjJfaWRjdF9wdXRfbW1pKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTUlQU19XTVYyRFNQX01JUFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9taXBzL3dtdjJkc3BfbW1pLmMgYi9saWJhdmNvZGVjL21pcHMvd212MmRzcF9tbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjZjY2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9taXBzL3dtdjJkc3BfbW1pLmMKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBXTVYyIC0gRFNQIGZ1bmN0aW9ucyBMb29uZ3NvbiBNTUktb3B0aW1pemVkCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFpob3UgWGlhb3lvbmcgPHpob3V4aWFveW9uZ0Bsb29uZ3Nvbi5jbj4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImNvbnN0YW50cy5oIgorI2luY2x1ZGUgIndtdjJkc3BfbWlwcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9taXBzL21taXV0aWxzLmgiCisKKyNkZWZpbmUgVzAgMjA0OAorI2RlZmluZSBXMSAyODQxIC8qIDIwNDgqc3FydCAoMikqY29zICgxKnBpLzE2KSAqLworI2RlZmluZSBXMiAyNjc2IC8qIDIwNDgqc3FydCAoMikqY29zICgyKnBpLzE2KSAqLworI2RlZmluZSBXMyAyNDA4IC8qIDIwNDgqc3FydCAoMikqY29zICgzKnBpLzE2KSAqLworI2RlZmluZSBXNCAyMDQ4IC8qIDIwNDgqc3FydCAoMikqY29zICg0KnBpLzE2KSAqLworI2RlZmluZSBXNSAxNjA5IC8qIDIwNDgqc3FydCAoMikqY29zICg1KnBpLzE2KSAqLworI2RlZmluZSBXNiAxMTA4IC8qIDIwNDgqc3FydCAoMikqY29zICg2KnBpLzE2KSAqLworI2RlZmluZSBXNyA1NjUgIC8qIDIwNDgqc3FydCAoMikqY29zICg3KnBpLzE2KSAqLworCitzdGF0aWMgdm9pZCB3bXYyX2lkY3Rfcm93X21taShzaG9ydCAqIGIpCit7CisgICAgaW50IHMxLCBzMjsKKyAgICBpbnQgYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3OworCisgICAgLyogc3RlcCAxICovCisgICAgYTAgPSBXMCAqIGJbMF0gKyBXMCAqIGJbNF07CisgICAgYTEgPSBXMSAqIGJbMV0gKyBXNyAqIGJbN107CisgICAgYTIgPSBXMiAqIGJbMl0gKyBXNiAqIGJbNl07CisgICAgYTMgPSBXMyAqIGJbNV0gLSBXNSAqIGJbM107CisgICAgYTQgPSBXMCAqIGJbMF0gLSBXMCAqIGJbNF07CisgICAgYTUgPSBXNSAqIGJbNV0gKyBXMyAqIGJbM107CisgICAgYTYgPSBXNiAqIGJbMl0gLSBXMiAqIGJbNl07CisgICAgYTcgPSBXNyAqIGJbMV0gLSBXMSAqIGJbN107CisKKyAgICAvKiBzdGVwIDIgKi8KKyAgICBzMSA9ICgxODEgKiAoYTEgLSBhNSArIGE3IC0gYTMpICsgMTI4KSA+PiA4OyAvLyAxLCAzLCA1LCA3CisgICAgczIgPSAoMTgxICogKGExIC0gYTUgLSBhNyArIGEzKSArIDEyOCkgPj4gODsKKworICAgIC8qIHN0ZXAgMyAqLworICAgIGJbMF0gPSAoYTAgKyBhMiArIGExICsgYTUgKyAxMjgpID4+IDg7CisgICAgYlsxXSA9IChhNCArIGE2ICsgczEgICAgICArIDEyOCkgPj4gODsKKyAgICBiWzJdID0gKGE0IC0gYTYgKyBzMiAgICAgICsgMTI4KSA+PiA4OworICAgIGJbM10gPSAoYTAgLSBhMiArIGE3ICsgYTMgKyAxMjgpID4+IDg7CisgICAgYls0XSA9IChhMCAtIGEyIC0gYTcgLSBhMyArIDEyOCkgPj4gODsKKyAgICBiWzVdID0gKGE0IC0gYTYgLSBzMiAgICAgICsgMTI4KSA+PiA4OworICAgIGJbNl0gPSAoYTQgKyBhNiAtIHMxICAgICAgKyAxMjgpID4+IDg7CisgICAgYls3XSA9IChhMCArIGEyIC0gYTEgLSBhNSArIDEyOCkgPj4gODsKK30KKworc3RhdGljIHZvaWQgd212Ml9pZGN0X2NvbF9tbWkoc2hvcnQgKiBiKQoreworICAgIGludCBzMSwgczI7CisgICAgaW50IGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNzsKKworICAgIC8qIHN0ZXAgMSwgd2l0aCBleHRlbmRlZCBwcmVjaXNpb24gKi8KKyAgICBhMCA9IChXMCAqIGJbIDBdICsgVzAgKiBiWzMyXSAgICApID4+IDM7CisgICAgYTEgPSAoVzEgKiBiWyA4XSArIFc3ICogYls1Nl0gKyA0KSA+PiAzOworICAgIGEyID0gKFcyICogYlsxNl0gKyBXNiAqIGJbNDhdICsgNCkgPj4gMzsKKyAgICBhMyA9IChXMyAqIGJbNDBdIC0gVzUgKiBiWzI0XSArIDQpID4+IDM7CisgICAgYTQgPSAoVzAgKiBiWyAwXSAtIFcwICogYlszMl0gICAgKSA+PiAzOworICAgIGE1ID0gKFc1ICogYls0MF0gKyBXMyAqIGJbMjRdICsgNCkgPj4gMzsKKyAgICBhNiA9IChXNiAqIGJbMTZdIC0gVzIgKiBiWzQ4XSArIDQpID4+IDM7CisgICAgYTcgPSAoVzcgKiBiWyA4XSAtIFcxICogYls1Nl0gKyA0KSA+PiAzOworCisgICAgLyogc3RlcCAyICovCisgICAgczEgPSAoMTgxICogKGExIC0gYTUgKyBhNyAtIGEzKSArIDEyOCkgPj4gODsKKyAgICBzMiA9ICgxODEgKiAoYTEgLSBhNSAtIGE3ICsgYTMpICsgMTI4KSA+PiA4OworCisgICAgLyogc3RlcCAzICovCisgICAgYlsgMF0gPSAoYTAgKyBhMiArIGExICsgYTUgKyA4MTkyKSA+PiAxNDsKKyAgICBiWyA4XSA9IChhNCArIGE2ICsgczEgICAgICArIDgxOTIpID4+IDE0OworICAgIGJbMTZdID0gKGE0IC0gYTYgKyBzMiAgICAgICsgODE5MikgPj4gMTQ7CisgICAgYlsyNF0gPSAoYTAgLSBhMiArIGE3ICsgYTMgKyA4MTkyKSA+PiAxNDsKKworICAgIGJbMzJdID0gKGEwIC0gYTIgLSBhNyAtIGEzICsgODE5MikgPj4gMTQ7CisgICAgYls0MF0gPSAoYTQgLSBhNiAtIHMyICAgICAgKyA4MTkyKSA+PiAxNDsKKyAgICBiWzQ4XSA9IChhNCArIGE2IC0gczEgICAgICArIDgxOTIpID4+IDE0OworICAgIGJbNTZdID0gKGEwICsgYTIgLSBhMSAtIGE1ICsgODE5MikgPj4gMTQ7Cit9CisKK3ZvaWQgZmZfd212Ml9pZGN0X2FkZF9tbWkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIGZ0bXBbMTFdOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpICs9IDgpCisgICAgICAgIHdtdjJfaWRjdF9yb3dfbW1pKGJsb2NrICsgaSk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgd212Ml9pZGN0X2NvbF9tbWkoYmxvY2sgKyBpKTsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAieG9yICAgICAgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvLyBsb3cgNCBsb29wCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDFdLCAlW2Jsb2NrXSwgMHgwMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMl0sICVbYmxvY2tdLCAweDA4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXAzXSwgJVtibG9ja10sIDB4MTApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDRdLCAlW2Jsb2NrXSwgMHgxOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNV0sICVbYmxvY2tdLCAweDIwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA2XSwgJVtibG9ja10sIDB4MjgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDddLCAlW2Jsb2NrXSwgMHgzMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wOF0sICVbYmxvY2tdLCAweDM4KQorCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDldLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxMF0sICAlW2Z0bXA5XSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wMV0sICAgJVtmdG1wMV0sICAgJVtmdG1wMl0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDFdLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2Rlc3RdLCAgICAlW2Rlc3RdLCAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfTERDMSglW2Z0bXA5XSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMTBdLCAgJVtmdG1wOV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDldLCAgICVbZnRtcDldLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDNdLCAgICVbZnRtcDNdLCAgICVbZnRtcDRdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAzXSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkZXN0XSwgICAgJVtkZXN0XSwgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wOV0sICVbZGVzdF0sIDB4MDApCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDEwXSwgICVbZnRtcDldLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICVbZnRtcDEwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXA1XSwgICAlW2Z0bXA1XSwgICAlW2Z0bXA2XSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNV0sICVbZGVzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbZGVzdF0sICAgICVbZGVzdF0sICAgICVbbGluZV9zaXplXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDldLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxMF0sICAlW2Z0bXA5XSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA4XSwgICAlW2Z0bXA4XSwgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wN10sICAgJVtmdG1wN10sICAgJVtmdG1wOF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDddLCAlW2Rlc3RdLCAweDAwKQorCisgICAgICAgIFBUUl9BRERJVSAgIiVbYmxvY2tdLCAgICVbYmxvY2tdLCAgIDB4NDAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQVFJfQUREVSAgICIlW2Rlc3RdLCAgICAlW2Rlc3RdLCAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAvLyBoaWdoIDQgbG9vcAorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtibG9ja10sIDB4MDApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgwOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDEwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4MTgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAlW2Jsb2NrXSwgMHgyMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNl0sICVbYmxvY2tdLCAweDI4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXA3XSwgJVtibG9ja10sIDB4MzApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDhdLCAlW2Jsb2NrXSwgMHgzOCkKKworICAgICAgICBNTUlfTERDMSglW2Z0bXA5XSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMTBdLCAgJVtmdG1wOV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDldLCAgICVbZnRtcDldLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXAxXSwgICAlW2Z0bXAxXSwgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wMl0sICAgJVtmdG1wMl0sICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDFdLCAgICVbZnRtcDFdLCAgICVbZnRtcDJdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAxXSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkZXN0XSwgICAgJVtkZXN0XSwgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wOV0sICVbZGVzdF0sIDB4MDApCisgICAgICAgICJwdW5wY2toYmggICVbZnRtcDEwXSwgICVbZnRtcDldLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVucGNrbGJoICAlW2Z0bXA5XSwgICAlW2Z0bXA5XSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wM10sICAgJVtmdG1wM10sICAgJVtmdG1wOV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDRdLCAgICVbZnRtcDRdLCAgICVbZnRtcDEwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAzXSwgICAlW2Z0bXAzXSwgICAlW2Z0bXA0XSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wM10sICVbZGVzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbZGVzdF0sICAgICVbZGVzdF0sICAgICVbbGluZV9zaXplXSAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDldLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICAicHVucGNraGJoICAlW2Z0bXAxMF0sICAlW2Z0bXA5XSwgICAlW2Z0bXAwXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInB1bnBja2xiaCAgJVtmdG1wOV0sICAgJVtmdG1wOV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWRkaCAgICAgICVbZnRtcDVdLCAgICVbZnRtcDVdLCAgICVbZnRtcDldICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA2XSwgICAlW2Z0bXA2XSwgICAlW2Z0bXAxMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNV0sICAgJVtmdG1wNV0sICAgJVtmdG1wNl0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDVdLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2Rlc3RdLCAgICAlW2Rlc3RdLCAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBNTUlfTERDMSglW2Z0bXA5XSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgInB1bnBja2hiaCAgJVtmdG1wMTBdLCAgJVtmdG1wOV0sICAgJVtmdG1wMF0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwdW5wY2tsYmggICVbZnRtcDldLCAgICVbZnRtcDldLCAgICVbZnRtcDBdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFkZGggICAgICAlW2Z0bXA3XSwgICAlW2Z0bXA3XSwgICAlW2Z0bXA5XSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRoICAgICAgJVtmdG1wOF0sICAgJVtmdG1wOF0sICAgJVtmdG1wMTBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDddLCAgICVbZnRtcDddLCAgICVbZnRtcDhdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA3XSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtmdG1wOF0iPSZmIihmdG1wWzhdKSwgICAgICAgICAgICBbZnRtcDldIj0mZiIoZnRtcFs5XSksCisgICAgICAgICAgW2Z0bXAxMF0iPSZmIihmdG1wWzEwXSksCisgICAgICAgICAgW2Jsb2NrXSIrJnIiKGJsb2NrKSwgICAgICAgICAgICAgIFtkZXN0XSIrJnIiKGRlc3QpCisgICAgICAgIDogW2xpbmVfc2l6ZV0iciIoKG1pcHNfcmVnKWxpbmVfc2l6ZSkKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7Cit9CisKK3ZvaWQgZmZfd212Ml9pZGN0X3B1dF9tbWkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIGZ0bXBbOF07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkgKz0gOCkKKyAgICAgICAgd212Ml9pZGN0X3Jvd19tbWkoYmxvY2sgKyBpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICB3bXYyX2lkY3RfY29sX21taShibG9jayArIGkpOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgIC8vIGxvdyA0IGxvb3AKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgxMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDE4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4MjApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAlW2Jsb2NrXSwgMHgyOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNl0sICVbYmxvY2tdLCAweDMwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA3XSwgJVtibG9ja10sIDB4MzgpCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICVbZnRtcDddICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkZXN0XSwgICAgJVtkZXN0XSwgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2Rlc3RdLCAgICAlW2Rlc3RdLCAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbZGVzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbZGVzdF0sICAgICVbZGVzdF0sICAgICVbbGluZV9zaXplXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVtkZXN0XSwgMHgwMCkKKworICAgICAgICBQVFJfQURESVUgICIlW2Jsb2NrXSwgICAlW2Jsb2NrXSwgICAweDQwICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFRSX0FERFUgICAiJVtkZXN0XSwgICAgJVtkZXN0XSwgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgLy8gaGlnaCA0IGxvb3AKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wMF0sICVbYmxvY2tdLCAweDAwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXAxXSwgJVtibG9ja10sIDB4MDgpCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDJdLCAlW2Jsb2NrXSwgMHgxMCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wM10sICVbYmxvY2tdLCAweDE4KQorICAgICAgICBNTUlfTERDMSglW2Z0bXA0XSwgJVtibG9ja10sIDB4MjApCisgICAgICAgIE1NSV9MREMxKCVbZnRtcDVdLCAlW2Jsb2NrXSwgMHgyOCkKKyAgICAgICAgTU1JX0xEQzEoJVtmdG1wNl0sICVbYmxvY2tdLCAweDMwKQorICAgICAgICBNTUlfTERDMSglW2Z0bXA3XSwgJVtibG9ja10sIDB4MzgpCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDBdLCAgICVbZnRtcDBdLCAgICVbZnRtcDFdICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicGFja3VzaGIgICAlW2Z0bXAyXSwgICAlW2Z0bXAyXSwgICAlW2Z0bXAzXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhY2t1c2hiICAgJVtmdG1wNF0sICAgJVtmdG1wNF0sICAgJVtmdG1wNV0gICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwYWNrdXNoYiAgICVbZnRtcDZdLCAgICVbZnRtcDZdLCAgICVbZnRtcDddICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXAwXSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgUFRSX0FERFUgICAiJVtkZXN0XSwgICAgJVtkZXN0XSwgICAgJVtsaW5lX3NpemVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIE1NSV9TREMxKCVbZnRtcDJdLCAlW2Rlc3RdLCAweDAwKQorICAgICAgICBQVFJfQUREVSAgICIlW2Rlc3RdLCAgICAlW2Rlc3RdLCAgICAlW2xpbmVfc2l6ZV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgTU1JX1NEQzEoJVtmdG1wNF0sICVbZGVzdF0sIDB4MDApCisgICAgICAgIFBUUl9BRERVICAgIiVbZGVzdF0sICAgICVbZGVzdF0sICAgICVbbGluZV9zaXplXSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBNTUlfU0RDMSglW2Z0bXA2XSwgJVtkZXN0XSwgMHgwMCkKKyAgICAgICAgOiBbZnRtcDBdIj0mZiIoZnRtcFswXSksICAgICAgICAgICAgW2Z0bXAxXSI9JmYiKGZ0bXBbMV0pLAorICAgICAgICAgIFtmdG1wMl0iPSZmIihmdG1wWzJdKSwgICAgICAgICAgICBbZnRtcDNdIj0mZiIoZnRtcFszXSksCisgICAgICAgICAgW2Z0bXA0XSI9JmYiKGZ0bXBbNF0pLCAgICAgICAgICAgIFtmdG1wNV0iPSZmIihmdG1wWzVdKSwKKyAgICAgICAgICBbZnRtcDZdIj0mZiIoZnRtcFs2XSksICAgICAgICAgICAgW2Z0bXA3XSI9JmYiKGZ0bXBbN10pLAorICAgICAgICAgIFtibG9ja10iKyZyIihibG9jayksICAgICAgICAgICAgICBbZGVzdF0iKyZyIihkZXN0KQorICAgICAgICA6IFtsaW5lX3NpemVdInIiKChtaXBzX3JlZylsaW5lX3NpemUpCisgICAgICAgIDogIm1lbW9yeSIKKyAgICApOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tanBlZzJqcGVnX2JzZi5jIGIvbGliYXZjb2RlYy9tanBlZzJqcGVnX2JzZi5jCmluZGV4IDkyZGMzY2EuLjZmMDJiYzAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbWpwZWcyanBlZ19ic2YuYworKysgYi9saWJhdmNvZGVjL21qcGVnMmpwZWdfYnNmLmMKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAjaW5jbHVkZSAianBlZ3RhYmxlcy5oIgogI2luY2x1ZGUgIm1qcGVnLmgiCiAKQEAgLTc3LDQ2ICs3OCw2NiBAQAogICAgIHJldHVybiBidWY7CiB9CiAKLXN0YXRpYyBpbnQgbWpwZWcyanBlZ19maWx0ZXIoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlmcmFtZSkKK3N0YXRpYyBpbnQgbWpwZWcyanBlZ19maWx0ZXIoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpvdXQpCiB7CisgICAgQVZQYWNrZXQgKmluOworICAgIGludCByZXQgPSAwOwogICAgIGludCBpbnB1dF9za2lwLCBvdXRwdXRfc2l6ZTsKLSAgICB1aW50OF90ICpvdXRwdXQsICpvdXQ7CisgICAgdWludDhfdCAqb3V0cHV0OwogCi0gICAgaWYgKGJ1Zl9zaXplIDwgMTIpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCBpcyB0cnVuY2F0ZWRcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICByZXQgPSBmZl9ic2ZfZ2V0X3BhY2tldChjdHgsICZpbik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoaW4tPnNpemUgPCAxMikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCBpcyB0cnVuY2F0ZWRcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQotICAgIGlmIChBVl9SQjE2KGJ1ZikgIT0gMHhmZmQ4KSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW5wdXQgaXMgbm90IE1KUEVHXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKEFWX1JCMTYoaW4tPmRhdGEpICE9IDB4ZmZkOCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCBpcyBub3QgTUpQRUdcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQotICAgIGlmIChidWZbMl0gPT0gMHhmZiAmJiBidWZbM10gPT0gQVBQMCkgewotICAgICAgICBpbnB1dF9za2lwID0gKGJ1Zls0XSA8PCA4KSArIGJ1Zls1XSArIDQ7CisgICAgaWYgKGluLT5kYXRhWzJdID09IDB4ZmYgJiYgaW4tPmRhdGFbM10gPT0gQVBQMCkgeworICAgICAgICBpbnB1dF9za2lwID0gKGluLT5kYXRhWzRdIDw8IDgpICsgaW4tPmRhdGFbNV0gKyA0OwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlucHV0X3NraXAgPSAyOwogICAgIH0KLSAgICBpZiAoYnVmX3NpemUgPCBpbnB1dF9za2lwKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW5wdXQgaXMgdHJ1bmNhdGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKGluLT5zaXplIDwgaW5wdXRfc2tpcCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCBpcyB0cnVuY2F0ZWRcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQotICAgIG91dHB1dF9zaXplID0gYnVmX3NpemUgLSBpbnB1dF9za2lwICsKKyAgICBvdXRwdXRfc2l6ZSA9IGluLT5zaXplIC0gaW5wdXRfc2tpcCArCiAgICAgICAgICAgICAgICAgICBzaXplb2YoanBlZ19oZWFkZXIpICsgZGh0X3NlZ21lbnRfc2l6ZTsKLSAgICBvdXRwdXQgPSBvdXQgPSBhdl9tYWxsb2Mob3V0cHV0X3NpemUpOwotICAgIGlmICghb3V0cHV0KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIG91dCA9IGFwcGVuZChvdXQsIGpwZWdfaGVhZGVyLCBzaXplb2YoanBlZ19oZWFkZXIpKTsKLSAgICBvdXQgPSBhcHBlbmRfZGh0X3NlZ21lbnQob3V0KTsKLSAgICBvdXQgPSBhcHBlbmQob3V0LCBidWYgKyBpbnB1dF9za2lwLCBidWZfc2l6ZSAtIGlucHV0X3NraXApOwotICAgICpwb3V0YnVmID0gb3V0cHV0OwotICAgICpwb3V0YnVmX3NpemUgPSBvdXRwdXRfc2l6ZTsKLSAgICByZXR1cm4gMTsKKyAgICByZXQgPSBhdl9uZXdfcGFja2V0KG91dCwgb3V0cHV0X3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBvdXRwdXQgPSBvdXQtPmRhdGE7CisKKyAgICBvdXRwdXQgPSBhcHBlbmQob3V0cHV0LCBqcGVnX2hlYWRlciwgc2l6ZW9mKGpwZWdfaGVhZGVyKSk7CisgICAgb3V0cHV0ID0gYXBwZW5kX2RodF9zZWdtZW50KG91dHB1dCk7CisgICAgb3V0cHV0ID0gYXBwZW5kKG91dHB1dCwgaW4tPmRhdGEgKyBpbnB1dF9za2lwLCBpbi0+c2l6ZSAtIGlucHV0X3NraXApOworCisgICAgcmV0ID0gYXZfcGFja2V0X2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworZmFpbDoKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKG91dCk7CisgICAgYXZfcGFja2V0X2ZyZWUoJmluKTsKKyAgICByZXR1cm4gcmV0OwogfQogCi1BVkJpdFN0cmVhbUZpbHRlciBmZl9tanBlZzJqcGVnX2JzZiA9IHsKK3N0YXRpYyBjb25zdCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZHNbXSA9IHsKKyAgICBBVl9DT0RFQ19JRF9NSlBFRywgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX21qcGVnMmpwZWdfYnNmID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJtanBlZzJqcGVnIiwKICAgICAuZmlsdGVyICAgICAgICAgPSBtanBlZzJqcGVnX2ZpbHRlciwKKyAgICAuY29kZWNfaWRzICAgICAgPSBjb2RlY19pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tanBlZ19wYXJzZXIuYyBiL2xpYmF2Y29kZWMvbWpwZWdfcGFyc2VyLmMKaW5kZXggZTU0OGIwMC4uMDdhNmIyYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tanBlZ19wYXJzZXIuYworKysgYi9saWJhdmNvZGVjL21qcGVnX3BhcnNlci5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogCiBBVkNvZGVjUGFyc2VyIGZmX21qcGVnX3BhcnNlciA9IHsKLSAgICAuY29kZWNfaWRzICAgICAgPSB7IEFWX0NPREVDX0lEX01KUEVHIH0sCisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9NSlBFRywgQVZfQ09ERUNfSURfSlBFR0xTIH0sCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1KUEVHUGFyc2VyQ29udGV4dCksCiAgICAgLnBhcnNlcl9wYXJzZSAgID0ganBlZ19wYXJzZSwKICAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWpwZWdhX2R1bXBfaGVhZGVyX2JzZi5jIGIvbGliYXZjb2RlYy9tanBlZ2FfZHVtcF9oZWFkZXJfYnNmLmMKaW5kZXggZDZkNDFlNi4uY2E1ZmIzYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tanBlZ2FfZHVtcF9oZWFkZXJfYnNmLmMKKysrIGIvbGliYXZjb2RlYy9tanBlZ2FfZHVtcF9oZWFkZXJfYnNmLmMKQEAgLTI2LDcwICsyNiw4MyBAQAogICovCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgIm1qcGVnLmgiCiAKIAotc3RhdGljIGludCBtanBlZ2FfZHVtcF9oZWFkZXIoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IGtleWZyYW1lKQorc3RhdGljIGludCBtanBlZ2FfZHVtcF9oZWFkZXIoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpvdXQpCiB7Ci0gICAgdWludDhfdCAqcG91dGJ1ZnA7CisgICAgQVZQYWNrZXQgKmluOworICAgIHVpbnQ4X3QgKm91dF9idWY7CiAgICAgdW5zaWduZWQgZHF0ID0gMCwgZGh0ID0gMCwgc29mMCA9IDA7Ci0gICAgaW50IGk7CisgICAgaW50IHJldCA9IDAsIGk7CiAKLSAgICBpZiAoYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01KUEVHKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibWpwZWdhIGJpdHN0cmVhbSBmaWx0ZXIgb25seSBhcHBsaWVzIHRvIG1qcGVnIGNvZGVjXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHJldCA9IGZmX2JzZl9nZXRfcGFja2V0KGN0eCwgJmluKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICpwb3V0YnVmX3NpemUgPSAwOwotICAgICpwb3V0YnVmID0gYXZfbWFsbG9jKGJ1Zl9zaXplICsgNDQgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICBpZiAoISpwb3V0YnVmKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHBvdXRidWZwID0gKnBvdXRidWY7Ci0gICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcG91dGJ1ZnAsIDB4ZmYpOwotICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnBvdXRidWZwLCBTT0kpOwotICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnBvdXRidWZwLCAweGZmKTsKLSAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwb3V0YnVmcCwgQVBQMSk7Ci0gICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcG91dGJ1ZnAsIDQyKTsgLyogc2l6ZSAqLwotICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnBvdXRidWZwLCAwKTsKLSAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnBvdXRidWZwLCAibWpwZyIsIDQpOwotICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnBvdXRidWZwLCBidWZfc2l6ZSArIDQ0KTsgLyogZmllbGQgc2l6ZSAqLwotICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnBvdXRidWZwLCBidWZfc2l6ZSArIDQ0KTsgLyogcGFkIGZpZWxkIHNpemUgKi8KLSAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwb3V0YnVmcCwgMCk7ICAgICAgICAgICAgIC8qIG5leHQgcHRyICovCisgICAgcmV0ID0gYXZfbmV3X3BhY2tldChvdXQsIGluLT5zaXplICsgNDQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemUgLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKGJ1ZltpXSA9PSAweGZmKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGJ1ZltpICsgMV0pIHsKKyAgICByZXQgPSBhdl9wYWNrZXRfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgb3V0X2J1ZiA9IG91dC0+ZGF0YTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZvdXRfYnVmLCAweGZmKTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZvdXRfYnVmLCBTT0kpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJm91dF9idWYsIDB4ZmYpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJm91dF9idWYsIEFQUDEpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJm91dF9idWYsIDQyKTsgLyogc2l6ZSAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJm91dF9idWYsIDApOworICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmb3V0X2J1ZiwgIm1qcGciLCA0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZvdXRfYnVmLCBpbi0+c2l6ZSArIDQ0KTsgLyogZmllbGQgc2l6ZSAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJm91dF9idWYsIGluLT5zaXplICsgNDQpOyAvKiBwYWQgZmllbGQgc2l6ZSAqLworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJm91dF9idWYsIDApOyAgICAgICAgICAgICAvKiBuZXh0IHB0ciAqLworCisgICAgZm9yIChpID0gMDsgaSA8IGluLT5zaXplIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChpbi0+ZGF0YVtpXSA9PSAweGZmKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGluLT5kYXRhW2kgKyAxXSkgewogICAgICAgICAgICAgY2FzZSBEUVQ6ICBkcXQgID0gaSArIDQ2OyBicmVhazsKICAgICAgICAgICAgIGNhc2UgREhUOiAgZGh0ICA9IGkgKyA0NjsgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIFNPRjA6IHNvZjAgPSBpICsgNDY7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSBTT1M6Ci0gICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcG91dGJ1ZnAsIGRxdCk7IC8qIHF1YW50IG9mZiAqLwotICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnBvdXRidWZwLCBkaHQpOyAvKiBodWZmIG9mZiAqLwotICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnBvdXRidWZwLCBzb2YwKTsgLyogaW1hZ2Ugb2ZmICovCi0gICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcG91dGJ1ZnAsIGkgKyA0Nik7IC8qIHNjYW4gb2ZmICovCi0gICAgICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcG91dGJ1ZnAsIGkgKyA0NiArIEFWX1JCMTYoYnVmICsgaSArIDIpKTsgLyogZGF0YSBvZmYgKi8KLSAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnBvdXRidWZwLCBidWYgKyAyLCBidWZfc2l6ZSAtIDIpOyAvKiBza2lwIGFscmVhZHkgd3JpdHRlbiBTT0kgKi8KLSAgICAgICAgICAgICAgICAqcG91dGJ1Zl9zaXplID0gcG91dGJ1ZnAgLSAqcG91dGJ1ZjsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZvdXRfYnVmLCBkcXQpOyAvKiBxdWFudCBvZmYgKi8KKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZvdXRfYnVmLCBkaHQpOyAvKiBodWZmIG9mZiAqLworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJm91dF9idWYsIHNvZjApOyAvKiBpbWFnZSBvZmYgKi8KKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZvdXRfYnVmLCBpICsgNDYpOyAvKiBzY2FuIG9mZiAqLworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJm91dF9idWYsIGkgKyA0NiArIEFWX1JCMTYoaW4tPmRhdGEgKyBpICsgMikpOyAvKiBkYXRhIG9mZiAqLworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmb3V0X2J1ZiwgaW4tPmRhdGEgKyAyLCBpbi0+c2l6ZSAtIDIpOyAvKiBza2lwIGFscmVhZHkgd3JpdHRlbiBTT0kgKi8KKworICAgICAgICAgICAgICAgIG91dC0+c2l6ZSA9IG91dF9idWYgLSBvdXQtPmRhdGE7CisgICAgICAgICAgICAgICAgYXZfcGFja2V0X2ZyZWUoJmluKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIGNhc2UgQVBQMToKLSAgICAgICAgICAgICAgICBpZiAoaSArIDggPCBidWZfc2l6ZSAmJiBBVl9STDMyKGJ1ZiArIGkgKyA4KSA9PSBBVl9STDMyKCJtanBnIikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJiaXRzdHJlYW0gYWxyZWFkeSBmb3JtYXR0ZWRcbiIpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKnBvdXRidWYsIGJ1ZiwgYnVmX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIGlmIChpICsgOCA8IGluLT5zaXplICYmIEFWX1JMMzIoaW4tPmRhdGEgKyBpICsgOCkgPT0gQVZfUkwzMigibWpwZyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImJpdHN0cmVhbSBhbHJlYWR5IGZvcm1hdHRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgICAgICAgICAgICAgICAgICBhdl9wYWNrZXRfbW92ZV9yZWYob3V0LCBpbik7CisgICAgICAgICAgICAgICAgICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBhdl9mcmVlcChwb3V0YnVmKTsKLSAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBmaW5kIFNPUyBtYXJrZXIgaW4gYml0c3RyZWFtXG4iKTsKLSAgICByZXR1cm4gMDsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZmluZCBTT1MgbWFya2VyIGluIGJpdHN0cmVhbVxuIik7CitmYWlsOgorICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiB9CiAKLUFWQml0U3RyZWFtRmlsdGVyIGZmX21qcGVnYV9kdW1wX2hlYWRlcl9ic2YgPSB7Ci0gICAgLm5hbWUgICA9ICJtanBlZ2FkdW1wIiwKLSAgICAuZmlsdGVyID0gbWpwZWdhX2R1bXBfaGVhZGVyLAorc3RhdGljIGNvbnN0IGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkc1tdID0geworICAgIEFWX0NPREVDX0lEX01KUEVHLCBBVl9DT0RFQ19JRF9OT05FLAorfTsKKworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfbWpwZWdhX2R1bXBfaGVhZGVyX2JzZiA9IHsKKyAgICAubmFtZSAgICAgID0gIm1qcGVnYWR1bXAiLAorICAgIC5maWx0ZXIgICAgPSBtanBlZ2FfZHVtcF9oZWFkZXIsCisgICAgLmNvZGVjX2lkcyA9IGNvZGVjX2lkcywKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21qcGVnYmRlYy5jIGIvbGliYXZjb2RlYy9tanBlZ2JkZWMuYwppbmRleCBhODU4NzA3Li44NTgzZmNiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21qcGVnYmRlYy5jCisrKyBiL2xpYmF2Y29kZWMvbWpwZWdiZGVjLmMKQEAgLTcwLDggKzcwLDcgQEAKIAogICAgIHNraXBfYml0cygmaGdiLCAzMik7IC8qIHJlc2VydmVkIHplcm9zICovCiAKLSAgICBpZiAoZ2V0X2JpdHNfbG9uZygmaGdiLCAzMikgIT0gTUtCRVRBRygnbScsJ2onLCdwJywnZycpKQotICAgIHsKKyAgICBpZiAoZ2V0X2JpdHNfbG9uZygmaGdiLCAzMikgIT0gTUtCRVRBRygnbScsJ2onLCdwJywnZycpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJub3QgbWpwZWctYiAoYmFkIGZvdXJjYylcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC04NSwxOSArODQsMTcgQEAKIAogICAgIGRxdF9vZmZzID0gcmVhZF9vZmZzKGF2Y3R4LCAmaGdiLCBidWZfZW5kIC0gYnVmX3B0ciwgImRxdCBpcyAlZCBhbmQgc2l6ZSBpcyAlZFxuIik7CiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJkcXQgb2ZmczogMHglIlBSSXgzMiJcbiIsIGRxdF9vZmZzKTsKLSAgICBpZiAoZHF0X29mZnMpCi0gICAgeworICAgIGlmIChkcXRfb2ZmcykgewogICAgICAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmX3B0citkcXRfb2ZmcywgKGJ1Zl9lbmQgLSAoYnVmX3B0citkcXRfb2ZmcykpKjgpOwogICAgICAgICBzLT5zdGFydF9jb2RlID0gRFFUOwogICAgICAgICBpZiAoZmZfbWpwZWdfZGVjb2RlX2RxdChzKSA8IDAgJiYKICAgICAgICAgICAgIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCi0gICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKICAgICBkaHRfb2ZmcyA9IHJlYWRfb2ZmcyhhdmN0eCwgJmhnYiwgYnVmX2VuZCAtIGJ1Zl9wdHIsICJkaHQgaXMgJWQgYW5kIHNpemUgaXMgJWRcbiIpOwogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZGh0IG9mZnM6IDB4JSJQUkl4MzIiXG4iLCBkaHRfb2Zmcyk7Ci0gICAgaWYgKGRodF9vZmZzKQotICAgIHsKKyAgICBpZiAoZGh0X29mZnMpIHsKICAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1Zl9wdHIrZGh0X29mZnMsIChidWZfZW5kIC0gKGJ1Zl9wdHIrZGh0X29mZnMpKSo4KTsKICAgICAgICAgcy0+c3RhcnRfY29kZSA9IERIVDsKICAgICAgICAgZmZfbWpwZWdfZGVjb2RlX2RodChzKTsKQEAgLTEwNSw4ICsxMDIsNyBAQAogCiAgICAgc29mX29mZnMgPSByZWFkX29mZnMoYXZjdHgsICZoZ2IsIGJ1Zl9lbmQgLSBidWZfcHRyLCAic29mIGlzICVkIGFuZCBzaXplIGlzICVkXG4iKTsKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNvZiBvZmZzOiAweCUiUFJJeDMyIlxuIiwgc29mX29mZnMpOwotICAgIGlmIChzb2Zfb2ZmcykKLSAgICB7CisgICAgaWYgKHNvZl9vZmZzKSB7CiAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWZfcHRyK3NvZl9vZmZzLCAoYnVmX2VuZCAtIChidWZfcHRyK3NvZl9vZmZzKSkqOCk7CiAgICAgICAgIHMtPnN0YXJ0X2NvZGUgPSBTT0YwOwogICAgICAgICBpZiAoZmZfbWpwZWdfZGVjb2RlX3NvZihzKSA8IDApCkBAIC0xMTcsMjUgKzExMywyMyBAQAogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAic29zIG9mZnM6IDB4JSJQUkl4MzIiXG4iLCBzb3Nfb2Zmcyk7CiAgICAgc29kX29mZnMgPSByZWFkX29mZnMoYXZjdHgsICZoZ2IsIGJ1Zl9lbmQgLSBidWZfcHRyLCAic29mIGlzICVkIGFuZCBzaXplIGlzICVkXG4iKTsKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNvZCBvZmZzOiAweCUiUFJJeDMyIlxuIiwgc29kX29mZnMpOwotICAgIGlmIChzb3Nfb2ZmcykKLSAgICB7CisgICAgaWYgKHNvc19vZmZzKSB7CiAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWZfcHRyICsgc29zX29mZnMsCiAgICAgICAgICAgICAgICAgICAgICAgOCAqIEZGTUlOKGZpZWxkX3NpemUsIGJ1Zl9lbmQgLSBidWZfcHRyIC0gc29zX29mZnMpKTsKICAgICAgICAgcy0+bWpwYl9za2lwdG9zb2QgPSAoc29kX29mZnMgLSBzb3Nfb2ZmcyAtIHNob3dfYml0cygmcy0+Z2IsIDE2KSk7CiAgICAgICAgIHMtPnN0YXJ0X2NvZGUgPSBTT1M7CiAgICAgICAgIGlmIChmZl9tanBlZ19kZWNvZGVfc29zKHMsIE5VTEwsIDAsIE5VTEwpIDwgMCAmJgogICAgICAgICAgICAgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKLSAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAogICAgIGlmIChzLT5pbnRlcmxhY2VkKSB7CiAgICAgICAgIHMtPmJvdHRvbV9maWVsZCBePSAxOwogICAgICAgICAvKiBpZiBub3QgYm90dG9tIGZpZWxkLCBkbyBub3Qgb3V0cHV0IGltYWdlIHlldCAqLwotICAgICAgICBpZiAocy0+Ym90dG9tX2ZpZWxkICE9IHMtPmludGVybGFjZV9wb2xhcml0eSAmJiBzZWNvbmRfZmllbGRfb2ZmcykKLSAgICAgICAgeworICAgICAgICBpZiAocy0+Ym90dG9tX2ZpZWxkICE9IHMtPmludGVybGFjZV9wb2xhcml0eSAmJiBzZWNvbmRfZmllbGRfb2ZmcykgewogICAgICAgICAgICAgYnVmX3B0ciA9IGJ1ZiArIHNlY29uZF9maWVsZF9vZmZzOwogICAgICAgICAgICAgZ290byByZWFkX2hlYWRlcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vWFhYIEZJWE1FIGZhY3Rvcml6ZSwgdGhpcyBsb29rcyB2ZXJ5IHNpbWlsYXIgdG8gdGhlIEVPSSBjb2RlCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21qcGVnZGVjLmMgYi9saWJhdmNvZGVjL21qcGVnZGVjLmMKaW5kZXggNjljOWNmMy4uNThjNGMwNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tanBlZ2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvbWpwZWdkZWMuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJibG9ja2RzcC5oIgogI2luY2x1ZGUgImNvcHlfYmxvY2suaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCiAjaW5jbHVkZSAiaWRjdGRzcC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAianBlZ3RhYmxlcy5oIgpAQCAtNzEsMjAgKzcyLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmX2NvZGUsIDIsIDIsIGh1ZmZfc3ltLCAyLCAyLCB1c2Vfc3RhdGljKTsKIH0KIAotc3RhdGljIHZvaWQgYnVpbGRfYmFzaWNfbWpwZWdfdmxjKE1KcGVnRGVjb2RlQ29udGV4dCAqcykKK3N0YXRpYyBpbnQgYnVpbGRfYmFzaWNfbWpwZWdfdmxjKE1KcGVnRGVjb2RlQ29udGV4dCAqcykKIHsKLSAgICBidWlsZF92bGMoJnMtPnZsY3NbMF1bMF0sIGF2cHJpdl9tanBlZ19iaXRzX2RjX2x1bWluYW5jZSwKLSAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYywgMTIsIDAsIDApOwotICAgIGJ1aWxkX3ZsYygmcy0+dmxjc1swXVsxXSwgYXZwcml2X21qcGVnX2JpdHNfZGNfY2hyb21pbmFuY2UsCi0gICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfZGMsIDEyLCAwLCAwKTsKLSAgICBidWlsZF92bGMoJnMtPnZsY3NbMV1bMF0sIGF2cHJpdl9tanBlZ19iaXRzX2FjX2x1bWluYW5jZSwKLSAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19sdW1pbmFuY2UsIDI1MSwgMCwgMSk7Ci0gICAgYnVpbGRfdmxjKCZzLT52bGNzWzFdWzFdLCBhdnByaXZfbWpwZWdfYml0c19hY19jaHJvbWluYW5jZSwKLSAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19jaHJvbWluYW5jZSwgMjUxLCAwLCAxKTsKLSAgICBidWlsZF92bGMoJnMtPnZsY3NbMl1bMF0sIGF2cHJpdl9tanBlZ19iaXRzX2FjX2x1bWluYW5jZSwKLSAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19sdW1pbmFuY2UsIDI1MSwgMCwgMCk7Ci0gICAgYnVpbGRfdmxjKCZzLT52bGNzWzJdWzFdLCBhdnByaXZfbWpwZWdfYml0c19hY19jaHJvbWluYW5jZSwKLSAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19jaHJvbWluYW5jZSwgMjUxLCAwLCAwKTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBidWlsZF92bGMoJnMtPnZsY3NbMF1bMF0sIGF2cHJpdl9tanBlZ19iaXRzX2RjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2RjLCAxMiwgMCwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gYnVpbGRfdmxjKCZzLT52bGNzWzBdWzFdLCBhdnByaXZfbWpwZWdfYml0c19kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2RjLCAxMiwgMCwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gYnVpbGRfdmxjKCZzLT52bGNzWzFdWzBdLCBhdnByaXZfbWpwZWdfYml0c19hY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19sdW1pbmFuY2UsIDI1MSwgMCwgMSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gYnVpbGRfdmxjKCZzLT52bGNzWzFdWzFdLCBhdnByaXZfbWpwZWdfYml0c19hY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2Nocm9taW5hbmNlLCAyNTEsIDAsIDEpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGJ1aWxkX3ZsYygmcy0+dmxjc1syXVswXSwgYXZwcml2X21qcGVnX2JpdHNfYWNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfYWNfbHVtaW5hbmNlLCAyNTEsIDAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGJ1aWxkX3ZsYygmcy0+dmxjc1syXVsxXSwgYXZwcml2X21qcGVnX2JpdHNfYWNfY2hyb21pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19jaHJvbWluYW5jZSwgMjUxLCAwLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgcGFyc2VfYXZpZChNSnBlZ0RlY29kZUNvbnRleHQgKnMsIHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKQEAgLTExMCw2ICsxMjcsNyBAQAogYXZfY29sZCBpbnQgZmZfbWpwZWdfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIE1KcGVnRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKIAogICAgIGlmICghcy0+cGljdHVyZV9wdHIpIHsKICAgICAgICAgcy0+cGljdHVyZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CkBAIC0xMzAsMTIgKzE0OCwxNSBAQAogICAgIHMtPm9yZ19oZWlnaHQgICAgPSBhdmN0eC0+Y29kZWRfaGVpZ2h0OwogICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX0NFTlRFUjsKICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOworICAgIHMtPmh3YWNjZWxfcGl4X2ZtdCA9IHMtPmh3YWNjZWxfc3dfcGl4X2ZtdCA9IEFWX1BJWF9GTVRfTk9ORTsKIAotICAgIGJ1aWxkX2Jhc2ljX21qcGVnX3ZsYyhzKTsKKyAgICBpZiAoKHJldCA9IGJ1aWxkX2Jhc2ljX21qcGVnX3ZsYyhzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgaWYgKHMtPmV4dGVybl9odWZmKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJ1c2luZyBleHRlcm5hbCBodWZmbWFuIHRhYmxlXG4iKTsKLSAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAqIDgpOworICAgICAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKiA4KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgaWYgKGZmX21qcGVnX2RlY29kZV9kaHQocykpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJlcnJvciB1c2luZyBleHRlcm5hbCBodWZmbWFuIHRhYmxlLCBzd2l0Y2hpbmcgYmFjayB0byBpbnRlcm5hbFxuIik7CkBAIC0xNjYsNyArMTg3LDcgQEAKIC8qIHF1YW50aXplIHRhYmxlcyAqLwogaW50IGZmX21qcGVnX2RlY29kZV9kcXQoTUpwZWdEZWNvZGVDb250ZXh0ICpzKQogewotICAgIGludCBsZW4sIGluZGV4LCBpLCBqOworICAgIGludCBsZW4sIGluZGV4LCBpOwogCiAgICAgbGVuID0gZ2V0X2JpdHMoJnMtPmdiLCAxNikgLSAyOwogCkBAIC0xODcsMTMgKzIwOCwxNiBAQAogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgImluZGV4PSVkXG4iLCBpbmRleCk7CiAgICAgICAgIC8qIHJlYWQgcXVhbnQgdGFibGUgKi8KICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKLSAgICAgICAgICAgIGogPSBzLT5zY2FudGFibGUucGVybXV0YXRlZFtpXTsKLSAgICAgICAgICAgIHMtPnF1YW50X21hdHJpeGVzW2luZGV4XVtqXSA9IGdldF9iaXRzKCZzLT5nYiwgcHIgPyAxNiA6IDgpOworICAgICAgICAgICAgcy0+cXVhbnRfbWF0cml4ZXNbaW5kZXhdW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCBwciA/IDE2IDogOCk7CisgICAgICAgICAgICBpZiAocy0+cXVhbnRfbWF0cml4ZXNbaW5kZXhdW2ldID09IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImRxdDogMCBxdWFudCB2YWx1ZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBYWFggRklYTUUgZmluZXR1bmUsIGFuZCBwZXJoYXBzIGFkZCBkYyB0b28KLSAgICAgICAgcy0+cXNjYWxlW2luZGV4XSA9IEZGTUFYKHMtPnF1YW50X21hdHJpeGVzW2luZGV4XVtzLT5zY2FudGFibGUucGVybXV0YXRlZFsxXV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5xdWFudF9tYXRyaXhlc1tpbmRleF1bcy0+c2NhbnRhYmxlLnBlcm11dGF0ZWRbOF1dKSA+PiAxOworICAgICAgICAvLyBYWFggRklYTUUgZmluZS10dW5lLCBhbmQgcGVyaGFwcyBhZGQgZGMgdG9vCisgICAgICAgIHMtPnFzY2FsZVtpbmRleF0gPSBGRk1BWChzLT5xdWFudF9tYXRyaXhlc1tpbmRleF1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5xdWFudF9tYXRyaXhlc1tpbmRleF1bOF0pID4+IDE7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicXNjYWxlWyVkXTogJWRcbiIsCiAgICAgICAgICAgICAgICBpbmRleCwgcy0+cXNjYWxlW2luZGV4XSk7CiAgICAgICAgIGxlbiAtPSAxICsgNjQgKiAoMStwcik7CkBAIC0yNTcsMTMgKzI4MSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9tYXggKyAxLCAwLCAwKSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgICAgIHMtPnJhd19odWZmbWFuX2xlbmd0aHNbY2xhc3NdW2luZGV4XVtpXSA9IGJpdHNfdGFibGVbaSArIDFdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBzLT5yYXdfaHVmZm1hbl92YWx1ZXNbY2xhc3NdW2luZGV4XVtpXSA9IHZhbF90YWJsZVtpXTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKIGludCBmZl9tanBlZ19kZWNvZGVfc29mKE1KcGVnRGVjb2RlQ29udGV4dCAqcykKIHsKLSAgICBpbnQgbGVuLCBuYl9jb21wb25lbnRzLCBpLCB3aWR0aCwgaGVpZ2h0LCBiaXRzLCByZXQ7CisgICAgaW50IGxlbiwgbmJfY29tcG9uZW50cywgaSwgd2lkdGgsIGhlaWdodCwgYml0cywgcmV0LCBzaXplX2NoYW5nZTsKICAgICB1bnNpZ25lZCBwaXhfZm10X2lkOwogICAgIGludCBoX2NvdW50W01BWF9DT01QT05FTlRTXSA9IHsgMCB9OwogICAgIGludCB2X2NvdW50W01BWF9DT01QT05FTlRTXSA9IHsgMCB9OwpAQCAtMjgyLDcgKzMxMSw3IEBACiAgICAgfQogCiAgICAgaWYgKHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICE9IGJpdHMpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIkNoYW5naW5nIGJwcyB0byAlZFxuIiwgYml0cyk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPiAwID8gQVZfTE9HX0lORk8gOiBBVl9MT0dfREVCVUcsICJDaGFuZ2luZyBicHMgZnJvbSAlZCB0byAlZFxuIiwgcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUsIGJpdHMpOwogICAgICAgICBzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IGJpdHM7CiAgICAgICAgIGluaXRfaWRjdChzLT5hdmN0eCk7CiAgICAgfQpAQCAtMzA0LDcgKzMzMyw5IEBACiAgICAgICAgIGhlaWdodD0gcy0+aGVpZ2h0OwogCiAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzb2YwOiBwaWN0dXJlOiAlZHglZFxuIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUod2lkdGgsIGhlaWdodCwgMCwgcy0+YXZjdHgpKQorICAgIGlmIChhdl9pbWFnZV9jaGVja19zaXplKHdpZHRoLCBoZWlnaHQsIDAsIHMtPmF2Y3R4KSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChzLT5idWZfc2l6ZSAmJiAod2lkdGggKyA3KSAvIDggKiAoKGhlaWdodCArIDcpIC8gOCkgPiBzLT5idWZfc2l6ZSAqIDRMTCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBuYl9jb21wb25lbnRzID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKQEAgLTM3MCw2ICs0MDEsNyBAQAogICAgIGlmICh3aWR0aCAhPSBzLT53aWR0aCB8fCBoZWlnaHQgIT0gcy0+aGVpZ2h0IHx8IGJpdHMgIT0gcy0+Yml0cyB8fAogICAgICAgICBtZW1jbXAocy0+aF9jb3VudCwgaF9jb3VudCwgc2l6ZW9mKGhfY291bnQpKSAgICAgICAgICAgICAgICB8fAogICAgICAgICBtZW1jbXAocy0+dl9jb3VudCwgdl9jb3VudCwgc2l6ZW9mKHZfY291bnQpKSkgeworICAgICAgICBzaXplX2NoYW5nZSA9IDE7CiAKICAgICAgICAgcy0+d2lkdGggICAgICA9IHdpZHRoOwogICAgICAgICBzLT5oZWlnaHQgICAgID0gaGVpZ2h0OwpAQCAtMzk2LDYgKzQyOCw4IEBACiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgIHMtPmZpcnN0X3BpY3R1cmUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfY2hhbmdlID0gMDsKICAgICB9CiAKICAgICBpZiAocy0+Z290X3BpY3R1cmUgJiYgcy0+aW50ZXJsYWNlZCAmJiAocy0+Ym90dG9tX2ZpZWxkID09ICFzLT5pbnRlcmxhY2VfcG9sYXJpdHkpKSB7CkBAIC01ODMsMTMgKzYxNywxNyBAQAogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogdW5rX3BpeGZtdDoKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmhhbmRsZWQgcGl4ZWwgZm9ybWF0IDB4JXggYml0czolZFxuIiwgcGl4X2ZtdF9pZCwgcy0+Yml0cyk7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiUGl4ZWwgZm9ybWF0IDB4JXggYml0czolZCIsIHBpeF9mbXRfaWQsIHMtPmJpdHMpOwogICAgICAgICBtZW1zZXQocy0+dXBzY2FsZV9oLCAwLCBzaXplb2Yocy0+dXBzY2FsZV9oKSk7CiAgICAgICAgIG1lbXNldChzLT51cHNjYWxlX3YsIDAsIHNpemVvZihzLT51cHNjYWxlX3YpKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KICAgICBpZiAoKEFWX1JCMzIocy0+dXBzY2FsZV9oKSB8fCBBVl9SQjMyKHMtPnVwc2NhbGVfdikpICYmIHMtPmF2Y3R4LT5sb3dyZXMpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJsb3dyZXMgbm90IHN1cHBvcnRlZCBmb3Igd2VpcmQgc3Vic2FtcGxpbmdcbiIpOworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIkxvd3JlcyBmb3Igd2VpcmQgc3Vic2FtcGxpbmciKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKyAgICBpZiAoKEFWX1JCMzIocy0+dXBzY2FsZV9oKSB8fCBBVl9SQjMyKHMtPnVwc2NhbGVfdikpICYmIHMtPnByb2dyZXNzaXZlICYmIHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSUCkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgInByb2dyZXNzaXZlIGZvciB3ZWlyZCBzdWJzYW1wbGluZyIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogICAgIGlmIChzLT5scykgewpAQCAtNjE0LDYgKzY1MiwzNCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CiAgICAgfQogCisgICAgaWYgKHMtPmF2Y3R4LT5waXhfZm10ID09IHMtPmh3YWNjZWxfc3dfcGl4X2ZtdCAmJiAhc2l6ZV9jaGFuZ2UpIHsKKyAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBzLT5od2FjY2VsX3BpeF9mbXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisjaWYgQ09ORklHX01KUEVHX05WREVDX0hXQUNDRUwKKyAgICAgICAgICAgIEFWX1BJWF9GTVRfQ1VEQSwKKyNlbmRpZgorI2lmIENPTkZJR19NSlBFR19WQUFQSV9IV0FDQ0VMCisgICAgICAgICAgICBBVl9QSVhfRk1UX1ZBQVBJLAorI2VuZGlmCisgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCwKKyAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICAgICAgfTsKKyAgICAgICAgcy0+aHdhY2NlbF9waXhfZm10ID0gZmZfZ2V0X2Zvcm1hdChzLT5hdmN0eCwgcGl4X2ZtdHMpOworICAgICAgICBpZiAocy0+aHdhY2NlbF9waXhfZm10IDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgcy0+aHdhY2NlbF9zd19waXhfZm10ID0gcy0+YXZjdHgtPnBpeF9mbXQ7CisgICAgICAgIHMtPmF2Y3R4LT5waXhfZm10ICAgICA9IHMtPmh3YWNjZWxfcGl4X2ZtdDsKKyAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPnNraXBfZnJhbWUgPT0gQVZESVNDQVJEX0FMTCkgeworICAgICAgICBzLT5waWN0dXJlX3B0ci0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIHMtPnBpY3R1cmVfcHRyLT5rZXlfZnJhbWUgPSAxOworICAgICAgICBzLT5nb3RfcGljdHVyZSAgICAgICAgICAgID0gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgYXZfZnJhbWVfdW5yZWYocy0+cGljdHVyZV9wdHIpOwogICAgIGlmIChmZl9nZXRfYnVmZmVyKHMtPmF2Y3R4LCBzLT5waWN0dXJlX3B0ciwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikgPCAwKQogICAgICAgICByZXR1cm4gLTE7CkBAIC02NTQsNiArNzIwLDE5IEBACiAgICAgICAgIH0KICAgICAgICAgbWVtc2V0KHMtPmNvZWZzX2ZpbmlzaGVkLCAwLCBzaXplb2Yocy0+Y29lZnNfZmluaXNoZWQpKTsKICAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgcy0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGUgPQorICAgICAgICAgICAgYXZfbWFsbG9jeihzLT5hdmN0eC0+aHdhY2NlbC0+ZnJhbWVfcHJpdl9kYXRhX3NpemUpOworICAgICAgICBpZiAoIXMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICByZXQgPSBzLT5hdmN0eC0+aHdhY2NlbC0+c3RhcnRfZnJhbWUocy0+YXZjdHgsIHMtPnJhd19pbWFnZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yYXdfaW1hZ2VfYnVmZmVyX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTY3Niw3ICs3NTUsNyBAQAogCiAvKiBkZWNvZGUgYmxvY2sgYW5kIGRlcXVhbnRpemUgKi8KIHN0YXRpYyBpbnQgZGVjb2RlX2Jsb2NrKE1KcGVnRGVjb2RlQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssIGludCBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGNfaW5kZXgsIGludCBhY19pbmRleCwgaW50MTZfdCAqcXVhbnRfbWF0cml4KQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRjX2luZGV4LCBpbnQgYWNfaW5kZXgsIHVpbnQxNl90ICpxdWFudF9tYXRyaXgpCiB7CiAgICAgaW50IGNvZGUsIGksIGosIGxldmVsLCB2YWw7CiAKQEAgLTY4Niw4ICs3NjUsOCBAQAogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGRjXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIHZhbCA9IHZhbCAqIHF1YW50X21hdHJpeFswXSArIHMtPmxhc3RfZGNbY29tcG9uZW50XTsKLSAgICB2YWwgPSBGRk1JTih2YWwsIDMyNzY3KTsKKyAgICB2YWwgPSB2YWwgKiAodW5zaWduZWQpcXVhbnRfbWF0cml4WzBdICsgcy0+bGFzdF9kY1tjb21wb25lbnRdOworICAgIHZhbCA9IGF2X2NsaXBfaW50MTYodmFsKTsKICAgICBzLT5sYXN0X2RjW2NvbXBvbmVudF0gPSB2YWw7CiAgICAgYmxvY2tbMF0gPSB2YWw7CiAgICAgLyogQUMgY29lZnMgKi8KQEAgLTcxNiw3ICs3OTUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaiAgICAgICAgPSBzLT5zY2FudGFibGUucGVybXV0YXRlZFtpXTsKLSAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWwgKiBxdWFudF9tYXRyaXhbal07CisgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsICogcXVhbnRfbWF0cml4W2ldOwogICAgICAgICB9CiAgICAgfSB3aGlsZSAoaSA8IDYzKTsKICAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7fQpAQCAtNzI2LDkgKzgwNSw5IEBACiAKIHN0YXRpYyBpbnQgZGVjb2RlX2RjX3Byb2dyZXNzaXZlKE1KcGVnRGVjb2RlQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgZGNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpxdWFudF9tYXRyaXgsIGludCBBbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpxdWFudF9tYXRyaXgsIGludCBBbCkKIHsKLSAgICBpbnQgdmFsOworICAgIHVuc2lnbmVkIHZhbDsKICAgICBzLT5iZHNwLmNsZWFyX2Jsb2NrKGJsb2NrKTsKICAgICB2YWwgPSBtanBlZ19kZWNvZGVfZGMocywgZGNfaW5kZXgpOwogICAgIGlmICh2YWwgPT0gMHhmZmZmZikgewpAQCAtNzQ0LDEwICs4MjMsMTEgQEAKIC8qIGRlY29kZSBibG9jayBhbmQgZGVxdWFudGl6ZSAtIHByb2dyZXNzaXZlIEpQRUcgdmVyc2lvbiAqLwogc3RhdGljIGludCBkZWNvZGVfYmxvY2tfcHJvZ3Jlc3NpdmUoTUpwZWdEZWNvZGVDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmxhc3Rfbm56LCBpbnQgYWNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpxdWFudF9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcXVhbnRfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNzLCBpbnQgc2UsIGludCBBbCwgaW50ICpFT0JSVU4pCiB7Ci0gICAgaW50IGNvZGUsIGksIGosIGxldmVsLCB2YWwsIHJ1bjsKKyAgICBpbnQgY29kZSwgaSwgaiwgdmFsLCBydW47CisgICAgdW5zaWduZWQgbGV2ZWw7CiAKICAgICBpZiAoKkVPQlJVTikgewogICAgICAgICAoKkVPQlJVTiktLTsKQEAgLTc3OCwxNCArODU4LDE0IEBACiAgICAgICAgICAgICAgICAgaWYgKGkgPj0gc2UpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBzLT5zY2FudGFibGUucGVybXV0YXRlZFtzZV07Ci0gICAgICAgICAgICAgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsICogKHF1YW50X21hdHJpeFtqXSA8PCBBbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsICogKHF1YW50X21hdHJpeFtzZV0gPDwgQWwpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBjb3VudDogJWRcbiIsIGkpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaiA9IHMtPnNjYW50YWJsZS5wZXJtdXRhdGVkW2ldOwotICAgICAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWwgKiAocXVhbnRfbWF0cml4W2pdIDw8IEFsKTsKKyAgICAgICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsICogKHF1YW50X21hdHJpeFtpXSA8PCBBbCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChydW4gPT0gMHhGKSB7Ly8gWlJMIC0gc2tpcCAxNSBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAgICAgaSArPSAxNTsKQEAgLTgxOCw3ICs4OTgsNyBAQAogICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgc2lnbiA9IGJsb2NrW2pdID4+IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBibG9ja1tqXSArPSBTSE9XX1VCSVRTKHJlLCAmcy0+Z2IsIDEpICogICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICgocXVhbnRfbWF0cml4W2pdIF4gc2lnbikgLSBzaWduKSA8PCBBbDsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChxdWFudF9tYXRyaXhbaV0gXiBzaWduKSAtIHNpZ24pIDw8IEFsOyAgICAgICAgICAgIFwKICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfQogCkBAIC04NDIsNyArOTIyLDcgQEAKIC8qIGRlY29kZSBibG9jayBhbmQgZGVxdWFudGl6ZSAtIHByb2dyZXNzaXZlIEpQRUcgcmVmaW5lbWVudCBwYXNzICovCiBzdGF0aWMgaW50IGRlY29kZV9ibG9ja19yZWZpbmVtZW50KE1KcGVnRGVjb2RlQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmxhc3Rfbm56LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNfaW5kZXgsIGludDE2X3QgKnF1YW50X21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjX2luZGV4LCB1aW50MTZfdCAqcXVhbnRfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3MsIGludCBzZSwgaW50IEFsLCBpbnQgKkVPQlJVTikKIHsKICAgICBpbnQgY29kZSwgaSA9IHNzLCBqLCBzaWduLCB2YWwsIHJ1bjsKQEAgLTg2NCw3ICs5NDQsNyBAQAogICAgICAgICAgICAgICAgIFpFUk9fUlVOOwogICAgICAgICAgICAgICAgIGogPSBzLT5zY2FudGFibGUucGVybXV0YXRlZFtpXTsKICAgICAgICAgICAgICAgICB2YWwtLTsKLSAgICAgICAgICAgICAgICBibG9ja1tqXSA9ICgocXVhbnRfbWF0cml4W2pdIDw8IEFsKSBeIHZhbCkgLSB2YWw7CisgICAgICAgICAgICAgICAgYmxvY2tbal0gPSAoKHF1YW50X21hdHJpeFtpXSA8PCBBbCkgXiB2YWwpIC0gdmFsOwogICAgICAgICAgICAgICAgIGlmIChpID09IHNlKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpID4gKmxhc3Rfbm56KQogICAgICAgICAgICAgICAgICAgICAgICAgKmxhc3Rfbm56ID0gaTsKQEAgLTk1OSw2ICsxMDM5LDkgQEAKIAogICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT5sanBlZ19idWZmZXIsICZzLT5sanBlZ19idWZmZXJfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcy0+bWJfd2lkdGggKiA0ICogc2l6ZW9mKHMtPmxqcGVnX2J1ZmZlclswXVswXSkpOworICAgIGlmICghcy0+bGpwZWdfYnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCiAgICAgYnVmZmVyID0gcy0+bGpwZWdfYnVmZmVyOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKQEAgLTk3Niw2ICsxMDU5LDExIEBACiAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CiAgICAgICAgICAgICBpbnQgbW9kaWZpZWRfcHJlZGljdG9yID0gcHJlZGljdG9yOwogCisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0c3RyZWFtIGVuZCBpbiByZ2Jfc2NhblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChzLT5yZXN0YXJ0X2ludGVydmFsICYmICFzLT5yZXN0YXJ0X2NvdW50KXsKICAgICAgICAgICAgICAgICBzLT5yZXN0YXJ0X2NvdW50ID0gcy0+cmVzdGFydF9pbnRlcnZhbDsKICAgICAgICAgICAgICAgICByZXN5bmNfbWJfeCA9IG1iX3g7CkBAIC05OTksNyArMTA4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAogICAgICAgICAgICAgICAgIGxlZnRbaV0gPSBidWZmZXJbbWJfeF1baV0gPQotICAgICAgICAgICAgICAgICAgICBtYXNrICYgKHByZWQgKyAoZGMgKiAoMSA8PCBwb2ludF90cmFuc2Zvcm0pKSk7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgJiAocHJlZCArICh1bnNpZ25lZCkoZGMgKiAoMSA8PCBwb2ludF90cmFuc2Zvcm0pKSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChzLT5yZXN0YXJ0X2ludGVydmFsICYmICEtLXMtPnJlc3RhcnRfY291bnQpIHsKQEAgLTEwNzYsNiArMTE2NCwxMCBAQAogCiAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKSB7CiAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0c3RyZWFtIGVuZCBpbiB5dXZfc2NhblxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocy0+cmVzdGFydF9pbnRlcnZhbCAmJiAhcy0+cmVzdGFydF9jb3VudCl7CiAgICAgICAgICAgICAgICAgcy0+cmVzdGFydF9jb3VudCA9IHMtPnJlc3RhcnRfaW50ZXJ2YWw7CiAgICAgICAgICAgICAgICAgcmVzeW5jX21iX3ggPSBtYl94OwpAQCAtMTEwOSwyNSArMTIwMSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHYgKiBtYl95ICsgeSA+PSBzLT5oZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpdHM8PTgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHMtPnBpY3R1cmVfcHRyLT5kYXRhW2NdICsgKGxpbmVzaXplICogKHYgKiBtYl95ICsgeSkpICsgKGggKiBtYl94ICsgeCk7IC8vRklYTUUgb3B0aW1pemUgdGhpcyBjcmFwCi0gICAgICAgICAgICAgICAgICAgICAgICBpZih5PT0wICYmIHRvcHJvdyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeD09MCAmJiBsZWZ0Y29sKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZD0gMSA8PCAoYml0cyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHMtPnBpY3R1cmVfcHRyLT5kYXRhW2NdICsgKGxpbmVzaXplICogKHYgKiBtYl95ICsgeSkpICsgKGggKiBtYl94ICsgeCk7IC8vRklYTUUgb3B0aW1pemUgdGhpcyBjcmFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeT09MCAmJiB0b3Byb3cpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih4PT0wICYmIGxlZnRjb2wpeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZD0gMSA8PCAoYml0cyAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQ9IHB0clstMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZD0gcHRyWy0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeD09MCAmJiBsZWZ0Y29sKXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQ9IHB0clstbGluZXNpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1QocHJlZCwgcHRyWy1saW5lc2l6ZS0xXSwgcHRyWy1saW5lc2l6ZV0sIHB0clstMV0sIHByZWRpY3Rvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih4PT0wICYmIGxlZnRjb2wpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkPSBwdHJbLWxpbmVzaXplXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRElDVChwcmVkLCBwdHJbLWxpbmVzaXplLTFdLCBwdHJbLWxpbmVzaXplXSwgcHRyWy0xXSwgcHJlZGljdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5pbnRlcmxhY2VkICYmIHMtPmJvdHRvbV9maWVsZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gbGluZXNpemUgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByZWQgJj0gbWFzazsKLSAgICAgICAgICAgICAgICAgICAgICAgICpwdHI9IHByZWQgKyAoZGMgPDwgcG9pbnRfdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+aW50ZXJsYWNlZCAmJiBzLT5ib3R0b21fZmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQgJj0gbWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyPSBwcmVkICsgKCh1bnNpZ25lZClkYyA8PCBwb2ludF90cmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyMTYgPSAodWludDE2X3QqKShzLT5waWN0dXJlX3B0ci0+ZGF0YVtjXSArIDIqKGxpbmVzaXplICogKHYgKiBtYl95ICsgeSkpICsgMiooaCAqIG1iX3ggKyB4KSk7IC8vRklYTUUgb3B0aW1pemUgdGhpcyBjcmFwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoeT09MCAmJiB0b3Byb3cpewpAQCAtMTE0Nyw3ICsxMjM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+aW50ZXJsYWNlZCAmJiBzLT5ib3R0b21fZmllbGQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cjE2ICs9IGxpbmVzaXplID4+IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZCAmPSBtYXNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIxNj0gcHJlZCArIChkYyA8PCBwb2ludF90cmFuc2Zvcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIxNj0gcHJlZCArICgodW5zaWduZWQpZGMgPDwgcG9pbnRfdHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3ggPT0gaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSAwOwpAQCAtMTE4NiwxMyArMTI3OCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1QocHJlZCwgcHRyWy1saW5lc2l6ZS0xXSwgcHRyWy1saW5lc2l6ZV0sIHB0clstMV0sIHByZWRpY3Rvcik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkICY9IG1hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9IHByZWQgKyAoZGMgPDwgcG9pbnRfdHJhbnNmb3JtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gcHJlZCArICgodW5zaWduZWQpZGMgPDwgcG9pbnRfdHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cjE2ID0gKHVpbnQxNl90Kikocy0+cGljdHVyZV9wdHItPmRhdGFbY10gKyAyKihsaW5lc2l6ZSAqICh2ICogbWJfeSArIHkpKSArIDIqKGggKiBtYl94ICsgeCkpOyAvL0ZJWE1FIG9wdGltaXplIHRoaXMgY3JhcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSRURJQ1QocHJlZCwgcHRyMTZbLWxpbmVzaXplLTFdLCBwdHIxNlstbGluZXNpemVdLCBwdHIxNlstMV0sIHByZWRpY3Rvcik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkICY9IG1hc2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cjE2PSBwcmVkICsgKGRjIDw8IHBvaW50X3RyYW5zZm9ybSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cjE2PSBwcmVkICsgKCh1bnNpZ25lZClkYyA8PCBwb2ludF90cmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKyt4ID09IGgpIHsKQEAgLTEzNjksMTEgKzE0NjEsNyBAQAogICAgIGludCBtYl94LCBtYl95OwogICAgIGludCBFT0JSVU4gPSAwOwogICAgIGludCBjID0gcy0+Y29tcF9pbmRleFswXTsKLSAgICB1aW50OF90ICpkYXRhID0gcy0+cGljdHVyZV9wdHItPmRhdGFbY107Ci0gICAgaW50IGxpbmVzaXplICA9IHMtPmxpbmVzaXplW2NdOwotICAgIGludCBsYXN0X3NjYW4gPSAwOwotICAgIGludDE2X3QgKnF1YW50X21hdHJpeCA9IHMtPnF1YW50X21hdHJpeGVzW3MtPnF1YW50X3NpbmRleFswXV07Ci0gICAgaW50IGJ5dGVzX3Blcl9waXhlbCA9IDEgKyAocy0+Yml0cyA+IDgpOworICAgIHVpbnQxNl90ICpxdWFudF9tYXRyaXggPSBzLT5xdWFudF9tYXRyaXhlc1tzLT5xdWFudF9zaW5kZXhbMF1dOwogCiAgICAgYXZfYXNzZXJ0MChzcz49MCAmJiBBaD49MCAmJiBBbD49MCk7CiAgICAgaWYgKHNlIDwgc3MgfHwgc2UgPiA2MykgewpAQCAtMTM4MSwyMyArMTQ2OSwyMCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBpZiAoIUFsKSB7Ci0gICAgICAgIC8vIHMtPmNvZWZzX2ZpbmlzaGVkIGlzIGEgYml0bWFzayBmb3IgY29lZmZpY2llbnRzIGNvZGVkCi0gICAgICAgIC8vIHNzIGFuZCBzZSBhcmUgcGFyYW1ldGVycyB0ZWxsaW5nIHN0YXJ0IGFuZCBlbmQgY29lZmZpY2llbnRzCi0gICAgICAgIHMtPmNvZWZzX2ZpbmlzaGVkW2NdIHw9ICgyVUxMIDw8IHNlKSAtICgxVUxMIDw8IHNzKTsKLSAgICAgICAgbGFzdF9zY2FuID0gIX5zLT5jb2Vmc19maW5pc2hlZFtjXTsKLSAgICB9Ci0KLSAgICBpZiAocy0+aW50ZXJsYWNlZCAmJiBzLT5ib3R0b21fZmllbGQpCi0gICAgICAgIGRhdGEgKz0gbGluZXNpemUgPj4gMTsKKyAgICAvLyBzLT5jb2Vmc19maW5pc2hlZCBpcyBhIGJpdG1hc2sgZm9yIGNvZWZmaWNpZW50cyBjb2RlZAorICAgIC8vIHNzIGFuZCBzZSBhcmUgcGFyYW1ldGVycyB0ZWxsaW5nIHN0YXJ0IGFuZCBlbmQgY29lZmZpY2llbnRzCisgICAgcy0+Y29lZnNfZmluaXNoZWRbY10gfD0gKDJVTEwgPDwgc2UpIC0gKDFVTEwgPDwgc3MpOwogCiAgICAgcy0+cmVzdGFydF9jb3VudCA9IDA7CiAKICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgcy0+bWJfaGVpZ2h0OyBtYl95KyspIHsKLSAgICAgICAgdWludDhfdCAqcHRyICAgICA9IGRhdGEgKyAobWJfeSAqIGxpbmVzaXplICogOCA+PiBzLT5hdmN0eC0+bG93cmVzKTsKICAgICAgICAgaW50IGJsb2NrX2lkeCAgICA9IG1iX3kgKiBzLT5ibG9ja19zdHJpZGVbY107CiAgICAgICAgIGludDE2X3QgKCpibG9jaylbNjRdID0gJnMtPmJsb2Nrc1tjXVtibG9ja19pZHhdOwogICAgICAgICB1aW50OF90ICpsYXN0X25ueiAgICA9ICZzLT5sYXN0X25ueltjXVtibG9ja19pZHhdOworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0c3RyZWFtIHRydW5jYXRlZCBpbiBtanBlZ19kZWNvZGVfc2Nhbl9wcm9ncmVzc2l2ZV9hY1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKywgYmxvY2srKywgbGFzdF9ubnorKykgewogICAgICAgICAgICAgICAgIGludCByZXQ7CiAgICAgICAgICAgICAgICAgaWYgKHMtPnJlc3RhcnRfaW50ZXJ2YWwgJiYgIXMtPnJlc3RhcnRfY291bnQpCkBAIC0xNDE1LDEyICsxNTAwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobGFzdF9zY2FuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQocHRyLCBsaW5lc2l6ZSwgKmJsb2NrKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmJpdHMgJiA3KQotICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRfb3V0cHV0KHMsIHB0ciwgbGluZXNpemUpOwotICAgICAgICAgICAgICAgICAgICBwdHIgKz0gYnl0ZXNfcGVyX3BpeGVsKjggPj4gcy0+YXZjdHgtPmxvd3JlczsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChoYW5kbGVfcnN0bihzLCAwKSkKICAgICAgICAgICAgICAgICBFT0JSVU4gPSAwOwogICAgICAgICB9CkBAIC0xNDI4LDYgKzE1MDcsNDEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbWpwZWdfaWRjdF9zY2FuX3Byb2dyZXNzaXZlX2FjKE1KcGVnRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgbWJfeCwgbWJfeTsKKyAgICBpbnQgYzsKKyAgICBjb25zdCBpbnQgYnl0ZXNfcGVyX3BpeGVsID0gMSArIChzLT5iaXRzID4gOCk7CisgICAgY29uc3QgaW50IGJsb2NrX3NpemUgPSBzLT5sb3NzbGVzcyA/IDEgOiA4OworCisgICAgZm9yIChjID0gMDsgYyA8IHMtPm5iX2NvbXBvbmVudHM7IGMrKykgeworICAgICAgICB1aW50OF90ICpkYXRhID0gcy0+cGljdHVyZV9wdHItPmRhdGFbY107CisgICAgICAgIGludCBsaW5lc2l6ZSAgPSBzLT5saW5lc2l6ZVtjXTsKKyAgICAgICAgaW50IGggPSBzLT5oX21heCAvIHMtPmhfY291bnRbY107CisgICAgICAgIGludCB2ID0gcy0+dl9tYXggLyBzLT52X2NvdW50W2NdOworICAgICAgICBpbnQgbWJfd2lkdGggICAgID0gKHMtPndpZHRoICArIGggKiBibG9ja19zaXplIC0gMSkgLyAoaCAqIGJsb2NrX3NpemUpOworICAgICAgICBpbnQgbWJfaGVpZ2h0ICAgID0gKHMtPmhlaWdodCArIHYgKiBibG9ja19zaXplIC0gMSkgLyAodiAqIGJsb2NrX3NpemUpOworCisgICAgICAgIGlmICh+cy0+Y29lZnNfZmluaXNoZWRbY10pCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiY29tcG9uZW50ICVkIGlzIGluY29tcGxldGVcbiIsIGMpOworCisgICAgICAgIGlmIChzLT5pbnRlcmxhY2VkICYmIHMtPmJvdHRvbV9maWVsZCkKKyAgICAgICAgICAgIGRhdGEgKz0gbGluZXNpemUgPj4gMTsKKworICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgbWJfaGVpZ2h0OyBtYl95KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciAgICAgPSBkYXRhICsgKG1iX3kgKiBsaW5lc2l6ZSAqIDggPj4gcy0+YXZjdHgtPmxvd3Jlcyk7CisgICAgICAgICAgICBpbnQgYmxvY2tfaWR4ICAgID0gbWJfeSAqIHMtPmJsb2NrX3N0cmlkZVtjXTsKKyAgICAgICAgICAgIGludDE2X3QgKCpibG9jaylbNjRdID0gJnMtPmJsb2Nrc1tjXVtibG9ja19pZHhdOworICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IG1iX3dpZHRoOyBtYl94KyssIGJsb2NrKyspIHsKKyAgICAgICAgICAgICAgICBzLT5pZHNwLmlkY3RfcHV0KHB0ciwgbGluZXNpemUsICpibG9jayk7CisgICAgICAgICAgICAgICAgaWYgKHMtPmJpdHMgJiA3KQorICAgICAgICAgICAgICAgICAgICBzaGlmdF9vdXRwdXQocywgcHRyLCBsaW5lc2l6ZSk7CisgICAgICAgICAgICAgICAgcHRyICs9IGJ5dGVzX3Blcl9waXhlbCo4ID4+IHMtPmF2Y3R4LT5sb3dyZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIGludCBmZl9tanBlZ19kZWNvZGVfc29zKE1KcGVnRGVjb2RlQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqbWJfYml0bWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl9iaXRtYXNrX3NpemUsIGNvbnN0IEFWRnJhbWUgKnJlZmVyZW5jZSkKIHsKQEAgLTE0NDIsMTMgKzE1NTYsMjIgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGF2X2Fzc2VydDAocy0+cGljdHVyZV9wdHItPmRhdGFbMF0pOworICAgIGlmIChyZWZlcmVuY2UpIHsKKyAgICAgICAgaWYgKHJlZmVyZW5jZS0+d2lkdGggICE9IHMtPnBpY3R1cmVfcHRyLT53aWR0aCAgfHwKKyAgICAgICAgICAgIHJlZmVyZW5jZS0+aGVpZ2h0ICE9IHMtPnBpY3R1cmVfcHRyLT5oZWlnaHQgfHwKKyAgICAgICAgICAgIHJlZmVyZW5jZS0+Zm9ybWF0ICE9IHMtPnBpY3R1cmVfcHRyLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVmZXJlbmNlIG1pc21hdGNoaW5nXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCiAgICAgLyogWFhYOiB2ZXJpZnkgbGVuIGZpZWxkIHZhbGlkaXR5ICovCiAgICAgbGVuID0gZ2V0X2JpdHMoJnMtPmdiLCAxNik7CiAgICAgbmJfY29tcG9uZW50cyA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CiAgICAgaWYgKG5iX2NvbXBvbmVudHMgPT0gMCB8fCBuYl9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiZGVjb2RlX3NvczogbmJfY29tcG9uZW50cyAoJWQpIHVuc3VwcG9ydGVkXG4iLCBuYl9jb21wb25lbnRzKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWNvZGVfc29zOiBuYl9jb21wb25lbnRzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9jb21wb25lbnRzKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KICAgICBpZiAobGVuICE9IDYgKyAyICogbmJfY29tcG9uZW50cykgewpAQCAtMTUzMSw3ICsxNjU0LDE4IEBACiAgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvbmVudHM7IGkrKykKICAgICAgICAgcy0+bGFzdF9kY1tpXSA9ICg0IDw8IHMtPmJpdHMpOwogCi0gICAgaWYgKHMtPmxvc3NsZXNzKSB7CisgICAgaWYgKHMtPmF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgIGludCBieXRlc190b19zdGFydCA9IGdldF9iaXRzX2NvdW50KCZzLT5nYikgLyA4OworICAgICAgICBhdl9hc3NlcnQwKGJ5dGVzX3RvX3N0YXJ0ID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICBzLT5yYXdfc2Nhbl9idWZmZXJfc2l6ZSA+PSBieXRlc190b19zdGFydCk7CisKKyAgICAgICAgcmV0ID0gcy0+YXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZShzLT5hdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yYXdfc2Nhbl9idWZmZXIgICAgICArIGJ5dGVzX3RvX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJhd19zY2FuX2J1ZmZlcl9zaXplIC0gYnl0ZXNfdG9fc3RhcnQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB9IGVsc2UgaWYgKHMtPmxvc3NsZXNzKSB7CiAgICAgICAgIGF2X2Fzc2VydDAocy0+cGljdHVyZV9wdHIgPT0gcy0+cGljdHVyZSk7CiAgICAgICAgIGlmIChDT05GSUdfSlBFR0xTX0RFQ09ERVIgJiYgcy0+bHMpIHsKIC8vICAgICAgICAgICAgZm9yICgpIHsKQEAgLTE2MTMsMTEgKzE3NDcsOSBAQAogICAgIGlkICAgPSBnZXRfYml0c19sb25nKCZzLT5nYiwgMzIpOwogICAgIGxlbiAtPSA2OwogCi0gICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1NUQVJUQ09ERSkgewotICAgICAgICBjaGFyIGlkX3N0clszMl07Ci0gICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKGlkX3N0ciwgc2l6ZW9mKGlkX3N0ciksIGF2X2Jzd2FwMzIoaWQpKTsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJBUFB4ICglcyAvICU4WCkgbGVuPSVkXG4iLCBpZF9zdHIsIGlkLCBsZW4pOwotICAgIH0KKyAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfU1RBUlRDT0RFKQorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgIkFQUHggKCVzIC8gJThYKSBsZW49JWRcbiIsCisgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKGF2X2Jzd2FwMzIoaWQpKSwgaWQsIGxlbik7CiAKICAgICAvKiBCdWdneSBBVklELCBpdCBwdXRzIEVPSSBvbmx5IGF0IGV2ZXJ5IDEwdGggZnJhbWUuICovCiAgICAgLyogQWxzbywgdGhpcyBmb3VyY2MgaXMgdXNlZCBieSBub24tYXZpZCBmaWxlcyB0b28sIGl0IGhvbGRzIHNvbWUKQEAgLTE2MzMsMTkgKzE3NjUsMTMgQEAKICAgICAgICAgICAgIHMtPmJ1Z2d5X2F2aWQgPSAxOwogICAgICAgICBpID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsgbGVuLS07CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicG9sYXJpdHkgJWRcbiIsIGkpOwotI2lmIDAKLSAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgOCk7Ci0gICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsKLSAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMzIpOwotICAgICAgICBsZW4gLT0gMTA7Ci0jZW5kaWYKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQogCi0vLyAgICBsZW4gLT0gMjsKLQogICAgIGlmIChpZCA9PSBBVl9SQjMyKCJKRklGIikpIHsKICAgICAgICAgaW50IHRfdywgdF9oLCB2MSwgdjI7CisgICAgICAgIGlmIChsZW4gPCA4KQorICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDgpOyAvKiB0aGUgdHJhaWxpbmcgemVyby1ieXRlICovCiAgICAgICAgIHYxID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKICAgICAgICAgdjIgPSBnZXRfYml0cygmcy0+Z2IsIDgpOwpAQCAtMTY2NiwxOCArMTc5MiwyNSBAQAogICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOwogCi0gICAgICAgIHRfdyA9IGdldF9iaXRzKCZzLT5nYiwgOCk7Ci0gICAgICAgIHRfaCA9IGdldF9iaXRzKCZzLT5nYiwgOCk7Ci0gICAgICAgIGlmICh0X3cgJiYgdF9oKSB7Ci0gICAgICAgICAgICAvKiBza2lwIHRodW1ibmFpbCAqLwotICAgICAgICAgICAgaWYgKGxlbiAtMTAgLSAodF93ICogdF9oICogMykgPiAwKQotICAgICAgICAgICAgICAgIGxlbiAtPSB0X3cgKiB0X2ggKiAzOworICAgICAgICBsZW4gLT0gODsKKyAgICAgICAgaWYgKGxlbiA+PSAyKSB7CisgICAgICAgICAgICB0X3cgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICAgICAgdF9oID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgICAgIGlmICh0X3cgJiYgdF9oKSB7CisgICAgICAgICAgICAgICAgLyogc2tpcCB0aHVtYm5haWwgKi8KKyAgICAgICAgICAgICAgICBpZiAobGVuIC0xMCAtICh0X3cgKiB0X2ggKiAzKSA+IDApCisgICAgICAgICAgICAgICAgICAgIGxlbiAtPSB0X3cgKiB0X2ggKiAzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuIC09IDI7CiAgICAgICAgIH0KLSAgICAgICAgbGVuIC09IDEwOwogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKLSAgICBpZiAoaWQgPT0gQVZfUkIzMigiQWRvYiIpICYmIChnZXRfYml0cygmcy0+Z2IsIDgpID09ICdlJykpIHsKKyAgICBpZiAoICAgaWQgPT0gQVZfUkIzMigiQWRvYiIpCisgICAgICAgICYmIGxlbiA+PSA3CisgICAgICAgICYmIHNob3dfYml0cygmcy0+Z2IsIDgpID09ICdlJworICAgICAgICAmJiBzaG93X2JpdHNfbG9uZygmcy0+Z2IsIDMyKSAhPSBBVl9SQjMyKCJlX0NNIikpIHsKKyAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgIDgpOyAvKiAnZScgKi8KICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMTYpOyAvKiB2ZXJzaW9uICovCiAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDE2KTsgLyogZmxhZ3MwICovCiAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDE2KTsgLyogZmxhZ3MxICovCkBAIC0xNzk5LDcgKzE5MzIsNyBAQAogCiAgICAgICAgICAgICAvLyByZWFkIDB0aCBJRkQgYW5kIHN0b3JlIHRoZSBtZXRhZGF0YQogICAgICAgICAgICAgLy8gKHJldHVybiB2YWx1ZXMgPiAwIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiBzdWJpbWFnZSBtZXRhZGF0YSkKLSAgICAgICAgICAgIHJldCA9IGF2cHJpdl9leGlmX2RlY29kZV9pZmQocy0+YXZjdHgsICZnYnl0ZXMsIGxlLCAwLCAmcy0+ZXhpZl9tZXRhZGF0YSk7CisgICAgICAgICAgICByZXQgPSBmZl9leGlmX2RlY29kZV9pZmQocy0+YXZjdHgsICZnYnl0ZXMsIGxlLCAwLCAmcy0+ZXhpZl9tZXRhZGF0YSk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWpwZWc6IGVycm9yIGRlY29kaW5nIEVYSUYgZGF0YVxuIik7CiAgICAgICAgICAgICB9CkBAIC0xODE4LDIxICsxOTUxLDg3IEBACiAgICAgICAgIGxlbiAtPSA0OwogICAgICAgICAvKiBBcHBsZSBNSlBFRy1BICovCiAgICAgICAgIGlmIChpZCA9PSBBVl9SQjMyKCJtanBnIikpIHsKLSNpZiAwCi0gICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7IC8qIGZpZWxkIHNpemUgKi8KLSAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsgLyogcGFkIGZpZWxkIHNpemUgKi8KLSAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsgLyogbmV4dCBvZmYgKi8KLSAgICAgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDMyKTsgLyogcXVhbnQgb2ZmICovCi0gICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7IC8qIGh1ZmYgb2ZmICovCi0gICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7IC8qIGltYWdlIG9mZiAqLwotICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMzIpOyAvKiBzY2FuIG9mZiAqLwotICAgICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMzIpOyAvKiBkYXRhIG9mZiAqLwotI2VuZGlmCisgICAgICAgICAgICAvKiBzdHJ1Y3R1cmU6CisgICAgICAgICAgICAgICAgNGJ5dGVzICAgICAgZmllbGQgc2l6ZQorICAgICAgICAgICAgICAgIDRieXRlcyAgICAgIHBhZCBmaWVsZCBzaXplCisgICAgICAgICAgICAgICAgNGJ5dGVzICAgICAgbmV4dCBvZmYKKyAgICAgICAgICAgICAgICA0Ynl0ZXMgICAgICBxdWFudCBvZmYKKyAgICAgICAgICAgICAgICA0Ynl0ZXMgICAgICBodWZmIG9mZgorICAgICAgICAgICAgICAgIDRieXRlcyAgICAgIGltYWdlIG9mZgorICAgICAgICAgICAgICAgIDRieXRlcyAgICAgIHNjYW4gb2ZmCisgICAgICAgICAgICAgICAgNGJ5dGVzICAgICAgZGF0YSBvZmYKKyAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJtanBlZzogQXBwbGUgTUpQRUctQSBoZWFkZXIgZm91bmRcbiIpOwogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKHMtPnN0YXJ0X2NvZGUgPT0gQVBQMiAmJiBpZCA9PSBBVl9SQjMyKCJJQ0NfIikgJiYgbGVuID49IDEwKSB7CisgICAgICAgIGludCBpZDI7CisgICAgICAgIHVuc2lnbmVkIHNlcW5vOworICAgICAgICB1bnNpZ25lZCBudW1tYXJrZXJzOworCisgICAgICAgIGlkICAgPSBnZXRfYml0c19sb25nKCZzLT5nYiwgMzIpOworICAgICAgICBpZDIgID0gZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDI0KTsKKyAgICAgICAgbGVuIC09IDc7CisgICAgICAgIGlmIChpZCAhPSBBVl9SQjMyKCJQUk9GIikgfHwgaWQyICE9IEFWX1JCMjQoIklMRSIpKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBJQ0NfUFJPRklMRSBoZWFkZXIgaW4gQVBQMlxuIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHNraXBfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBzZXFubyAgPSBnZXRfYml0cygmcy0+Z2IsIDgpOworICAgICAgICBsZW4gICAtPSAyOworICAgICAgICBpZiAoc2Vxbm8gPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgc2VxdWVuY2UgbnVtYmVyIGluIEFQUDJcbiIpOworICAgICAgICAgICAgZ290byBvdXQ7CisgICAgICAgIH0KKworICAgICAgICBudW1tYXJrZXJzICA9IGdldF9iaXRzKCZzLT5nYiwgOCk7CisgICAgICAgIGxlbiAgICAgICAgLT0gMTsKKyAgICAgICAgaWYgKG51bW1hcmtlcnMgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgbnVtYmVyIG9mIG1hcmtlcnMgY29kZWQgaW4gQVBQMlxuIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5pY2NudW0gIT0gMCAmJiBudW1tYXJrZXJzICE9IHMtPmljY251bSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIk1pc3RtYXRjaCBpbiBjb2RlZCBudW1iZXIgb2YgSUNDIG1hcmtlcnMgYmV0d2VlbiBtYXJrZXJzXG4iKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9IGVsc2UgaWYgKHNlcW5vID4gbnVtbWFya2VycykgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIk1pc21hdGNoaW5nIHNlcXVlbmNlIG51bWJlciBhbmQgY29kZWQgbnVtYmVyIG9mIElDQyBtYXJrZXJzXG4iKTsKKyAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisKKyAgICAgICAgLyogQWxsb2NhdGUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgQVBQMiB3ZSd2ZSBzZWVuLiAqLworICAgICAgICBpZiAocy0+aWNjbnVtID09IDApIHsKKyAgICAgICAgICAgIHMtPmljY2RhdGEgICAgID0gYXZfbWFsbG9jeihudW1tYXJrZXJzICogc2l6ZW9mKCoocy0+aWNjZGF0YSkpKTsKKyAgICAgICAgICAgIHMtPmljY2RhdGFsZW5zID0gYXZfbWFsbG9jeihudW1tYXJrZXJzICogc2l6ZW9mKCoocy0+aWNjZGF0YWxlbnMpKSk7CisgICAgICAgICAgICBpZiAoIXMtPmljY2RhdGEgfHwgIXMtPmljY2RhdGFsZW5zKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgSUNDIGRhdGEgYXJyYXlzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+aWNjbnVtID0gbnVtbWFya2VyczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5pY2NkYXRhW3NlcW5vIC0gMV0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEdXBsaWNhdGUgSUNDIHNlcXVlbmNlIG51bWJlclxuIik7CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmljY2RhdGFsZW5zW3NlcW5vIC0gMV0gID0gbGVuOworICAgICAgICBzLT5pY2NkYXRhW3NlcW5vIC0gMV0gICAgICA9IGF2X21hbGxvYyhsZW4pOworICAgICAgICBpZiAoIXMtPmljY2RhdGFbc2Vxbm8gLSAxXSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgSUNDIGRhdGEgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkocy0+aWNjZGF0YVtzZXFubyAtIDFdLCBhbGlnbl9nZXRfYml0cygmcy0+Z2IpLCBsZW4pOworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCBsZW4gPDwgMyk7CisgICAgICAgIGxlbiA9IDA7CisgICAgICAgIHMtPmljY3JlYWQrKzsKKworICAgICAgICBpZiAocy0+aWNjcmVhZCA+IHMtPmljY251bSkKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJSZWFkIG1vcmUgSUNDIG1hcmtlcnMgdGhhbiBhcmUgc3VwcG9zZWQgdG8gYmUgY29kZWRcbiIpOworICAgIH0KKwogb3V0OgogICAgIC8qIHNsb3cgYnV0IG5lZWRlZCBmb3IgZXh0cmVtZSBhZG9iZSBqcGVncyAqLwogICAgIGlmIChsZW4gPCAwKQpAQCAtMTg0OCwzMiArMjA0NywzNSBAQAogewogICAgIGludCBsZW4gPSBnZXRfYml0cygmcy0+Z2IsIDE2KTsKICAgICBpZiAobGVuID49IDIgJiYgOCAqIGxlbiAtIDE2IDw9IGdldF9iaXRzX2xlZnQoJnMtPmdiKSkgeworICAgICAgICBpbnQgaTsKICAgICAgICAgY2hhciAqY2J1ZiA9IGF2X21hbGxvYyhsZW4gLSAxKTsKLSAgICAgICAgaWYgKGNidWYpIHsKLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbiAtIDI7IGkrKykKLSAgICAgICAgICAgICAgICBjYnVmW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKLSAgICAgICAgICAgIGlmIChpID4gMCAmJiBjYnVmW2kgLSAxXSA9PSAnXG4nKQotICAgICAgICAgICAgICAgIGNidWZbaSAtIDFdID0gMDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjYnVmW2ldID0gMDsKKyAgICAgICAgaWYgKCFjYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1BJQ1RfSU5GTykKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiY29tbWVudDogJyVzJ1xuIiwgY2J1Zik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAyOyBpKyspCisgICAgICAgICAgICBjYnVmW2ldID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKKyAgICAgICAgaWYgKGkgPiAwICYmIGNidWZbaSAtIDFdID09ICdcbicpCisgICAgICAgICAgICBjYnVmW2kgLSAxXSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNidWZbaV0gPSAwOwogCi0gICAgICAgICAgICAvKiBidWdneSBhdmlkLCBpdCBwdXRzIEVPSSBvbmx5IGF0IGV2ZXJ5IDEwdGggZnJhbWUgKi8KLSAgICAgICAgICAgIGlmICghc3RybmNtcChjYnVmLCAiQVZJRCIsIDQpKSB7Ci0gICAgICAgICAgICAgICAgcGFyc2VfYXZpZChzLCBjYnVmLCBsZW4pOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGNidWYsICJDUz1JVFU2MDEiKSkKLSAgICAgICAgICAgICAgICBzLT5jc19pdHU2MDEgPSAxOwotICAgICAgICAgICAgZWxzZSBpZiAoKCFzdHJuY21wKGNidWYsICJJbnRlbChSKSBKUEVHIExpYnJhcnksIHZlcnNpb24gMSIsIDMyKSAmJiBzLT5hdmN0eC0+Y29kZWNfdGFnKSB8fAotICAgICAgICAgICAgICAgICAgICAgKCFzdHJuY21wKGNidWYsICJNZXRhc29mdCBNSlBFRyBDb2RlYyIsIDIwKSkpCi0gICAgICAgICAgICAgICAgcy0+ZmxpcHBlZCA9IDE7Ci0gICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGNidWYsICJNVUxUSVNDT1BFIElJIikpCi0gICAgICAgICAgICAgICAgcy0+bXVsdGlzY29wZSA9IDI7CisgICAgICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19QSUNUX0lORk8pCisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiY29tbWVudDogJyVzJ1xuIiwgY2J1Zik7CiAKLSAgICAgICAgICAgIGF2X2ZyZWUoY2J1Zik7CisgICAgICAgIC8qIGJ1Z2d5IGF2aWQsIGl0IHB1dHMgRU9JIG9ubHkgYXQgZXZlcnkgMTB0aCBmcmFtZSAqLworICAgICAgICBpZiAoIXN0cm5jbXAoY2J1ZiwgIkFWSUQiLCA0KSkgeworICAgICAgICAgICAgcGFyc2VfYXZpZChzLCBjYnVmLCBsZW4pOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY2J1ZiwgIkNTPUlUVTYwMSIpKQorICAgICAgICAgICAgcy0+Y3NfaXR1NjAxID0gMTsKKyAgICAgICAgZWxzZSBpZiAoKCFzdHJuY21wKGNidWYsICJJbnRlbChSKSBKUEVHIExpYnJhcnksIHZlcnNpb24gMSIsIDMyKSAmJiBzLT5hdmN0eC0+Y29kZWNfdGFnKSB8fAorICAgICAgICAgICAgICAgICAoIXN0cm5jbXAoY2J1ZiwgIk1ldGFzb2Z0IE1KUEVHIENvZGVjIiwgMjApKSkKKyAgICAgICAgICAgIHMtPmZsaXBwZWQgPSAxOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGNidWYsICJNVUxUSVNDT1BFIElJIikpIHsKKyAgICAgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsgMSwgMiB9OworICAgICAgICAgICAgcy0+bXVsdGlzY29wZSA9IDI7CiAgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlKGNidWYpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMjAyNiw2ICsyMjI4LDIwIEBACiAgICAgcmV0dXJuIHN0YXJ0X2NvZGU7CiB9CiAKK3N0YXRpYyB2b2lkIHJlc2V0X2ljY19wcm9maWxlKE1KcGVnRGVjb2RlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChzLT5pY2NkYXRhKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+aWNjbnVtOyBpKyspCisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+aWNjZGF0YVtpXSk7CisgICAgYXZfZnJlZXAoJnMtPmljY2RhdGEpOworICAgIGF2X2ZyZWVwKCZzLT5pY2NkYXRhbGVucyk7CisKKyAgICBzLT5pY2NyZWFkID0gMDsKKyAgICBzLT5pY2NudW0gID0gMDsKK30KKwogaW50IGZmX21qcGVnX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCiB7CkBAIC0yMDQyLDEwICsyMjU4LDE1IEBACiAgICAgaW50IHJldCA9IDA7CiAgICAgaW50IGlzMTZiaXQ7CiAKKyAgICBzLT5idWZfc2l6ZSA9IGJ1Zl9zaXplOworCiAgICAgYXZfZGljdF9mcmVlKCZzLT5leGlmX21ldGFkYXRhKTsKICAgICBhdl9mcmVlcCgmcy0+c3RlcmVvM2QpOwogICAgIHMtPmFkb2JlX3RyYW5zZm9ybSA9IC0xOwogCisgICAgaWYgKHMtPmljY251bSAhPSAwKQorICAgICAgICByZXNldF9pY2NfcHJvZmlsZShzKTsKKwogICAgIGJ1Zl9wdHIgPSBidWY7CiAgICAgYnVmX2VuZCA9IGJ1ZiArIGJ1Zl9zaXplOwogICAgIHdoaWxlIChidWZfcHRyIDwgYnVmX2VuZCkgewpAQCAtMjA3NywxNSArMjI5OCwyNCBAQAogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJzdGFydGNvZGU6ICVYXG4iLCBzdGFydF9jb2RlKTsKIAogICAgICAgICAvKiBwcm9jZXNzIG1hcmtlcnMgKi8KLSAgICAgICAgaWYgKHN0YXJ0X2NvZGUgPj0gMHhkMCAmJiBzdGFydF9jb2RlIDw9IDB4ZDcpCisgICAgICAgIGlmIChzdGFydF9jb2RlID49IDB4ZDAgJiYgc3RhcnRfY29kZSA8PSAweGQ3KSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKICAgICAgICAgICAgICAgICAgICAicmVzdGFydCBtYXJrZXI6ICVkXG4iLCBzdGFydF9jb2RlICYgMHgwZik7CiAgICAgICAgICAgICAvKiBBUFAgZmllbGRzICovCi0gICAgICAgIGVsc2UgaWYgKHN0YXJ0X2NvZGUgPj0gQVBQMCAmJiBzdGFydF9jb2RlIDw9IEFQUDE1KQotICAgICAgICAgICAgbWpwZWdfZGVjb2RlX2FwcChzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydF9jb2RlID49IEFQUDAgJiYgc3RhcnRfY29kZSA8PSBBUFAxNSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBtanBlZ19kZWNvZGVfYXBwKHMpKSA8IDApCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bmFibGUgdG8gZGVjb2RlIEFQUCBmaWVsZHM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOwogICAgICAgICAgICAgLyogQ29tbWVudCAqLwotICAgICAgICBlbHNlIGlmIChzdGFydF9jb2RlID09IENPTSkKLSAgICAgICAgICAgIG1qcGVnX2RlY29kZV9jb20ocyk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRfY29kZSA9PSBDT00pIHsKKyAgICAgICAgICAgIHJldCA9IG1qcGVnX2RlY29kZV9jb20ocyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0X2NvZGUgPT0gRFFUKSB7CisgICAgICAgICAgICByZXQgPSBmZl9tanBlZ19kZWNvZGVfZHF0KHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCiAgICAgICAgIHJldCA9IC0xOwogCkBAIC0yMTE1LDExICsyMzQ1LDEwIEBACiAgICAgICAgIGNhc2UgU09JOgogICAgICAgICAgICAgcy0+cmVzdGFydF9pbnRlcnZhbCA9IDA7CiAgICAgICAgICAgICBzLT5yZXN0YXJ0X2NvdW50ICAgID0gMDsKKyAgICAgICAgICAgIHMtPnJhd19pbWFnZV9idWZmZXIgICAgICA9IGJ1Zl9wdHI7CisgICAgICAgICAgICBzLT5yYXdfaW1hZ2VfYnVmZmVyX3NpemUgPSBidWZfZW5kIC0gYnVmX3B0cjsKICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gb24gU09JICovCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEUVQ6Ci0gICAgICAgICAgICBmZl9tanBlZ19kZWNvZGVfZHF0KHMpOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgREhUOgogICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9tanBlZ19kZWNvZGVfZGh0KHMpKSA8IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImh1ZmZtYW4gdGFibGUgZGVjb2RlIGVycm9yXG4iKTsKQEAgLTIxMjgsNiArMjM1NywxMCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU09GMDoKICAgICAgICAgY2FzZSBTT0YxOgorICAgICAgICAgICAgaWYgKHN0YXJ0X2NvZGUgPT0gU09GMCkKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9CQVNFTElORV9EQ1Q7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX01KUEVHX0hVRkZNQU5fRVhURU5ERURfU0VRVUVOVElBTF9EQ1Q7CiAgICAgICAgICAgICBzLT5sb3NzbGVzcyAgICA9IDA7CiAgICAgICAgICAgICBzLT5scyAgICAgICAgICA9IDA7CiAgICAgICAgICAgICBzLT5wcm9ncmVzc2l2ZSA9IDA7CkBAIC0yMTM1LDYgKzIzNjgsNyBAQAogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNPRjI6CisgICAgICAgICAgICBzLT5hdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfTUpQRUdfSFVGRk1BTl9QUk9HUkVTU0lWRV9EQ1Q7CiAgICAgICAgICAgICBzLT5sb3NzbGVzcyAgICA9IDA7CiAgICAgICAgICAgICBzLT5scyAgICAgICAgICA9IDA7CiAgICAgICAgICAgICBzLT5wcm9ncmVzc2l2ZSA9IDE7CkBAIC0yMTQyLDYgKzIzNzYsNyBAQAogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFNPRjM6CisgICAgICAgICAgICBzLT5hdmN0eC0+cHJvZmlsZSAgICAgPSBGRl9QUk9GSUxFX01KUEVHX0hVRkZNQU5fTE9TU0xFU1M7CiAgICAgICAgICAgICBzLT5hdmN0eC0+cHJvcGVydGllcyB8PSBGRl9DT0RFQ19QUk9QRVJUWV9MT1NTTEVTUzsKICAgICAgICAgICAgIHMtPmxvc3NsZXNzICAgID0gMTsKICAgICAgICAgICAgIHMtPmxzICAgICAgICAgID0gMDsKQEAgLTIxNTAsNiArMjM4NSw3IEBACiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgU09GNDg6CisgICAgICAgICAgICBzLT5hdmN0eC0+cHJvZmlsZSAgICAgPSBGRl9QUk9GSUxFX01KUEVHX0pQRUdfTFM7CiAgICAgICAgICAgICBzLT5hdmN0eC0+cHJvcGVydGllcyB8PSBGRl9DT0RFQ19QUk9QRVJUWV9MT1NTTEVTUzsKICAgICAgICAgICAgIHMtPmxvc3NsZXNzICAgID0gMTsKICAgICAgICAgICAgIHMtPmxzICAgICAgICAgID0gMTsKQEAgLTIxNjQsNiArMjQwMCw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBFT0k6CiBlb2lfcGFyc2VyOgorICAgICAgICAgICAgaWYgKCFhdmN0eC0+aHdhY2NlbCAmJiBhdmN0eC0+c2tpcF9mcmFtZSAhPSBBVkRJU0NBUkRfQUxMICYmCisgICAgICAgICAgICAgICAgcy0+cHJvZ3Jlc3NpdmUgJiYgcy0+Y3VyX3NjYW4gJiYgcy0+Z290X3BpY3R1cmUpCisgICAgICAgICAgICAgICAgbWpwZWdfaWRjdF9zY2FuX3Byb2dyZXNzaXZlX2FjKHMpOwogICAgICAgICAgICAgcy0+Y3VyX3NjYW4gPSAwOwogICAgICAgICAgICAgaWYgKCFzLT5nb3RfcGljdHVyZSkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCkBAIC0yMTgwLDYgKzI0MTksMTMgQEAKICAgICAgICAgICAgICAgICBzLT5nb3RfcGljdHVyZSA9IDA7CiAgICAgICAgICAgICAgICAgZ290byB0aGVfZW5kX25vX3BpY3R1cmU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBzLT5hdmN0eC0+aHdhY2NlbC0+ZW5kX2ZyYW1lKHMtPmF2Y3R4KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihmcmFtZSwgcy0+cGljdHVyZV9wdHIpKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICpnb3RfZnJhbWUgPSAxOwpAQCAtMjIwMiwxNiArMjQ0OCwyMiBAQAogCiAgICAgICAgICAgICBnb3RvIHRoZV9lbmQ7CiAgICAgICAgIGNhc2UgU09TOgorICAgICAgICAgICAgcy0+cmF3X3NjYW5fYnVmZmVyICAgICAgPSBidWZfcHRyOworICAgICAgICAgICAgcy0+cmF3X3NjYW5fYnVmZmVyX3NpemUgPSBidWZfZW5kIC0gYnVmX3B0cjsKKwogICAgICAgICAgICAgcy0+Y3VyX3NjYW4rKzsKLSAgICAgICAgICAgIGlmIChhdmN0eC0+c2tpcF9mcmFtZSA9PSBBVkRJU0NBUkRfQUxMKQorICAgICAgICAgICAgaWYgKGF2Y3R4LT5za2lwX2ZyYW1lID09IEFWRElTQ0FSRF9BTEwpIHsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCBnZXRfYml0c19sZWZ0KCZzLT5nYikpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX21qcGVnX2RlY29kZV9zb3MocywgTlVMTCwgMCwgTlVMTCkpIDwgMCAmJgogICAgICAgICAgICAgICAgIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkpCiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRFJJOgotICAgICAgICAgICAgbWpwZWdfZGVjb2RlX2RyaShzKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gbWpwZWdfZGVjb2RlX2RyaShzKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTT0Y1OgogICAgICAgICBjYXNlIFNPRjY6CkBAIC0yMjYzLDggKzI1MTUsMTIgQEAKICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HQlJBUAogICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUocy0+YXZjdHgtPnBpeF9mbXQsICZoc2hpZnQsICZ2c2hpZnQpOwotICAgICAgICBmb3IgKHAgPSAwOyBwPDQ7IHArKykgeworICAgICAgICByZXQgPSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShzLT5hdmN0eC0+cGl4X2ZtdCwgJmhzaGlmdCwgJnZzaGlmdCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGF2X2Fzc2VydDAocy0+bmJfY29tcG9uZW50cyA9PSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhzLT5waWN0dXJlX3B0ci0+Zm9ybWF0KSk7CisgICAgICAgIGZvciAocCA9IDA7IHA8cy0+bmJfY29tcG9uZW50czsgcCsrKSB7CiAgICAgICAgICAgICB1aW50OF90ICpsaW5lID0gcy0+cGljdHVyZV9wdHItPmRhdGFbcF07CiAgICAgICAgICAgICBpbnQgdyA9IHMtPndpZHRoOwogICAgICAgICAgICAgaW50IGggPSBzLT5oZWlnaHQ7CkBAIC0yMzIxLDggKzI1NzcsMTIgQEAKICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0dCUlAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HQlJBUAogICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHMtPmF2Y3R4LT5waXhfZm10LCAmaHNoaWZ0LCAmdnNoaWZ0KTsKLSAgICAgICAgZm9yIChwID0gMDsgcCA8IDQ7IHArKykgeworICAgICAgICByZXQgPSBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShzLT5hdmN0eC0+cGl4X2ZtdCwgJmhzaGlmdCwgJnZzaGlmdCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGF2X2Fzc2VydDAocy0+bmJfY29tcG9uZW50cyA9PSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhzLT5waWN0dXJlX3B0ci0+Zm9ybWF0KSk7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl9jb21wb25lbnRzOyBwKyspIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdDsKICAgICAgICAgICAgIGludCB3ID0gcy0+d2lkdGg7CiAgICAgICAgICAgICBpbnQgaCA9IHMtPmhlaWdodDsKQEAgLTIzNDYsMTAgKzI2MDYsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocy0+ZmxpcHBlZCkgeworICAgIGlmIChzLT5mbGlwcGVkICYmICFzLT5yZ2IpIHsKICAgICAgICAgaW50IGo7Ci0gICAgICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHMtPmF2Y3R4LT5waXhfZm10LCAmaHNoaWZ0LCAmdnNoaWZ0KTsKLSAgICAgICAgZm9yIChpbmRleD0wOyBpbmRleDw0OyBpbmRleCsrKSB7CisgICAgICAgIHJldCA9IGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHMtPmF2Y3R4LT5waXhfZm10LCAmaHNoaWZ0LCAmdnNoaWZ0KTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgYXZfYXNzZXJ0MChzLT5uYl9jb21wb25lbnRzID09IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKHMtPnBpY3R1cmVfcHRyLT5mb3JtYXQpKTsKKyAgICAgICAgZm9yIChpbmRleD0wOyBpbmRleDxzLT5uYl9jb21wb25lbnRzOyBpbmRleCsrKSB7CiAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBzLT5waWN0dXJlX3B0ci0+ZGF0YVtpbmRleF07CiAgICAgICAgICAgICBpbnQgdyA9IHMtPnBpY3R1cmVfcHRyLT53aWR0aDsKICAgICAgICAgICAgIGludCBoID0gcy0+cGljdHVyZV9wdHItPmhlaWdodDsKQEAgLTIzNzEsNiArMjYzNSw3IEBACiAgICAgaWYgKHMtPmFkb2JlX3RyYW5zZm9ybSA9PSAwICYmIHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSQVApIHsKICAgICAgICAgaW50IHcgPSBzLT5waWN0dXJlX3B0ci0+d2lkdGg7CiAgICAgICAgIGludCBoID0gcy0+cGljdHVyZV9wdHItPmhlaWdodDsKKyAgICAgICAgYXZfYXNzZXJ0MChzLT5uYl9jb21wb25lbnRzID09IDQpOwogICAgICAgICBmb3IgKGk9MDsgaTxoOyBpKyspIHsKICAgICAgICAgICAgIGludCBqOwogICAgICAgICAgICAgdWludDhfdCAqZHN0WzRdOwpAQCAtMjM5Myw2ICsyNjU4LDcgQEAKICAgICBpZiAocy0+YWRvYmVfdHJhbnNmb3JtID09IDIgJiYgcy0+YXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDQ0UCkgewogICAgICAgICBpbnQgdyA9IHMtPnBpY3R1cmVfcHRyLT53aWR0aDsKICAgICAgICAgaW50IGggPSBzLT5waWN0dXJlX3B0ci0+aGVpZ2h0OworICAgICAgICBhdl9hc3NlcnQwKHMtPm5iX2NvbXBvbmVudHMgPT0gNCk7CiAgICAgICAgIGZvciAoaT0wOyBpPGg7IGkrKykgewogICAgICAgICAgICAgaW50IGo7CiAgICAgICAgICAgICB1aW50OF90ICpkc3RbNF07CkBAIC0yNDIyLDcgKzI2ODgsMzAgQEAKICAgICAgICAgYXZfZnJlZXAoJnMtPnN0ZXJlbzNkKTsKICAgICB9CiAKLSAgICBhdl9kaWN0X2NvcHkoYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoZGF0YSksIHMtPmV4aWZfbWV0YWRhdGEsIDApOworICAgIGlmIChzLT5pY2NudW0gIT0gMCAmJiBzLT5pY2NudW0gPT0gcy0+aWNjcmVhZCkgeworICAgICAgICBBVkZyYW1lU2lkZURhdGEgKnNkOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IHRvdGFsX3NpemUgPSAwOworICAgICAgICBpbnQgaTsKKworICAgICAgICAvKiBTdW0gc2l6ZSBvZiBhbGwgcGFydHMuICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5pY2NudW07IGkrKykKKyAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gcy0+aWNjZGF0YWxlbnNbaV07CisKKyAgICAgICAgc2QgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKGRhdGEsIEFWX0ZSQU1FX0RBVEFfSUNDX1BST0ZJTEUsIHRvdGFsX3NpemUpOworICAgICAgICBpZiAoIXNkKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmcmFtZSBzaWRlIGRhdGFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFJlYXNzZW1ibGUgdGhlIHBhcnRzLCB3aGljaCBhcmUgbm93IGluLW9yZGVyLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+aWNjbnVtOyBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShzZC0+ZGF0YSArIG9mZnNldCwgcy0+aWNjZGF0YVtpXSwgcy0+aWNjZGF0YWxlbnNbaV0pOworICAgICAgICAgICAgb2Zmc2V0ICs9IHMtPmljY2RhdGFsZW5zW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZGljdF9jb3B5KCYoKEFWRnJhbWUgKikgZGF0YSktPm1ldGFkYXRhLCBzLT5leGlmX21ldGFkYXRhLCAwKTsKICAgICBhdl9kaWN0X2ZyZWUoJnMtPmV4aWZfbWV0YWRhdGEpOwogCiB0aGVfZW5kX25vX3BpY3R1cmU6CkBAIC0yNDYxLDYgKzI3NTAsMTEgQEAKICAgICAgICAgYXZfZnJlZXAoJnMtPmxhc3Rfbm56W2ldKTsKICAgICB9CiAgICAgYXZfZGljdF9mcmVlKCZzLT5leGlmX21ldGFkYXRhKTsKKworICAgIHJlc2V0X2ljY19wcm9maWxlKHMpOworCisgICAgYXZfZnJlZXAoJnMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlKTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNTAxLDYgKzI3OTUsMTUgQEAKICAgICAucHJpdl9jbGFzcyAgICAgPSAmbWpwZWdkZWNfY2xhc3MsCiAgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8CiAgICAgICAgICAgICAgICAgICAgICAgRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSwKKyAgICAuaHdfY29uZmlncyAgICAgPSAoY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwqW10pIHsKKyNpZiBDT05GSUdfTUpQRUdfTlZERUNfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9OVkRFQyhtanBlZyksCisjZW5kaWYKKyNpZiBDT05GSUdfTUpQRUdfVkFBUElfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9WQUFQSShtanBlZyksCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgfSwKIH07CiAjZW5kaWYKICNpZiBDT05GSUdfVEhQX0RFQ09ERVIKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWpwZWdkZWMuaCBiL2xpYmF2Y29kZWMvbWpwZWdkZWMuaAppbmRleCBmYjgxMTI5Li42NTNmZTdjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21qcGVnZGVjLmgKKysrIGIvbGliYXZjb2RlYy9tanBlZ2RlYy5oCkBAIC0zOSwxOCArMzksMjEgQEAKICNpbmNsdWRlICJocGVsZHNwLmgiCiAjaW5jbHVkZSAiaWRjdGRzcC5oIgogCisjdW5kZWYgbmVhciAvKiBUaGlzIGZpbGUgdXNlcyBzdHJ1Y3QgbWVtYmVyICduZWFyJyB3aGljaCBpbiB3aW5kb3dzLmggaXMgZGVmaW5lZCBhcyBlbXB0eS4gKi8KKwogI2RlZmluZSBNQVhfQ09NUE9ORU5UUyA0CiAKIHR5cGVkZWYgc3RydWN0IE1KcGVnRGVjb2RlQ29udGV4dCB7CiAgICAgQVZDbGFzcyAqY2xhc3M7CiAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwogICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IGJ1Zl9zaXplOwogCiAgICAgaW50IHN0YXJ0X2NvZGU7IC8qIGN1cnJlbnQgc3RhcnQgY29kZSAqLwogICAgIGludCBidWZmZXJfc2l6ZTsKICAgICB1aW50OF90ICpidWZmZXI7CiAKLSAgICBpbnQxNl90IHF1YW50X21hdHJpeGVzWzRdWzY0XTsKKyAgICB1aW50MTZfdCBxdWFudF9tYXRyaXhlc1s0XVs2NF07CiAgICAgVkxDIHZsY3NbM11bNF07CiAgICAgaW50IHFzY2FsZVs0XTsgICAgICAvLy88IHF1YW50aXplciBzY2FsZSBjYWxjdWxhdGVkIGZyb20gcXVhbnRfbWF0cml4ZXMKIApAQCAtOTgsNyArMTAxLDcgQEAKICAgICBpbnQgZ290X3BpY3R1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHdlIGZvdW5kIGEgU09GIGFuZCBwaWN0dXJlIGlzIHZhbGlkLCB0b28uCiAgICAgaW50IGxpbmVzaXplW01BWF9DT01QT05FTlRTXTsgICAgICAgICAgICAgICAgICAgLy8vPCBsaW5lc2l6ZSA8PCBpbnRlcmxhY2VkCiAgICAgaW50OF90ICpxc2NhbGVfdGFibGU7Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBibG9jaylbNjRdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50MTZfdCwgYmxvY2spWzY0XTsKICAgICBpbnQxNl90ICgqYmxvY2tzW01BWF9DT01QT05FTlRTXSlbNjRdOyAvLy88IGludGVybWVkaWF0ZSBzdW1zIChwcm9ncmVzc2l2ZSBtb2RlKQogICAgIHVpbnQ4X3QgKmxhc3Rfbm56W01BWF9DT01QT05FTlRTXTsKICAgICB1aW50NjRfdCBjb2Vmc19maW5pc2hlZFtNQVhfQ09NUE9ORU5UU107IC8vLzwgYml0bWFzayBvZiB3aGljaCBjb2VmcyBoYXZlIGJlZW4gY29tcGxldGVseSBkZWNvZGVkIChwcm9ncmVzc2l2ZSBtb2RlKQpAQCAtMTMwLDYgKzEzMywyNCBAQAogICAgIEFWU3RlcmVvM0QgKnN0ZXJlbzNkOyAvLy8hPCBzdGVyZW9zY29waWMgaW5mb3JtYXRpb24gKGNhY2hlZCwgc2luY2UgaXQgaXMgcmVhZCBiZWZvcmUgZnJhbWUgYWxsb2NhdGlvbikKIAogICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2M7CisKKyAgICB1aW50OF90ICoqaWNjZGF0YTsKKyAgICBpbnQgKmljY2RhdGFsZW5zOworICAgIGludCBpY2NudW07CisgICAgaW50IGljY3JlYWQ7CisKKyAgICAvLyBSYXcgc3RyZWFtIGRhdGEgZm9yIGh3YWNjZWwgdXNlLgorICAgIGNvbnN0IHVpbnQ4X3QgKnJhd19pbWFnZV9idWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgcmF3X2ltYWdlX2J1ZmZlcl9zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKnJhd19zY2FuX2J1ZmZlcjsKKyAgICBzaXplX3QgICAgICAgICByYXdfc2Nhbl9idWZmZXJfc2l6ZTsKKworICAgIHVpbnQ4X3QgcmF3X2h1ZmZtYW5fbGVuZ3Roc1syXVs0XVsxNl07CisgICAgdWludDhfdCByYXdfaHVmZm1hbl92YWx1ZXNbMl1bNF1bMjU2XTsKKworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBod2FjY2VsX3N3X3BpeF9mbXQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGh3YWNjZWxfcGl4X2ZtdDsKKyAgICB2b2lkICpod2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKIH0gTUpwZWdEZWNvZGVDb250ZXh0OwogCiBpbnQgZmZfbWpwZWdfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWpwZWdlbmMuYyBiL2xpYmF2Y29kZWMvbWpwZWdlbmMuYwppbmRleCAzZDExMzc3Li5kMmZjYjhlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21qcGVnZW5jLmMKKysrIGIvbGliYXZjb2RlYy9tanBlZ2VuYy5jCkBAIC0zOSw1MiArMzksNTUgQEAKICNpbmNsdWRlICJtanBlZy5oIgogI2luY2x1ZGUgIm1qcGVnZW5jLmgiCiAKLXN0YXRpYyB1aW50OF90IHVuaV9hY192bGNfbGVuWzY0ICogNjQgKiAyXTsKLXN0YXRpYyB1aW50OF90IHVuaV9jaHJvbWFfYWNfdmxjX2xlbls2NCAqIDY0ICogMl07Ci0KLXN0YXRpYyBhdl9jb2xkIHZvaWQgaW5pdF91bmlfYWNfdmxjKGNvbnN0IHVpbnQ4X3QgaHVmZl9zaXplX2FjWzI1Nl0sIHVpbnQ4X3QgKnVuaV9hY192bGNfbGVuKQorc3RhdGljIGludCBhbGxvY19odWZmbWFuKE1wZWdFbmNDb250ZXh0ICpzKQogewotICAgIGludCBpOworICAgIE1KcGVnQ29udGV4dCAqbSA9IHMtPm1qcGVnX2N0eDsKKyAgICBzaXplX3QgbnVtX21icywgbnVtX2Jsb2NrcywgbnVtX2NvZGVzOworICAgIGludCBibG9ja3NfcGVyX21iOwogCi0gICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7Ci0gICAgICAgIGludCBsZXZlbCA9IGkgLSA2NDsKLSAgICAgICAgaW50IHJ1bjsKLSAgICAgICAgaWYgKCFsZXZlbCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBmb3IgKHJ1biA9IDA7IHJ1biA8IDY0OyBydW4rKykgewotICAgICAgICAgICAgaW50IGxlbiwgY29kZSwgbmJpdHM7Ci0gICAgICAgICAgICBpbnQgYWxldmVsID0gRkZBQlMobGV2ZWwpOworICAgIC8vIFdlIG5lZWQgdG8gaW5pdCB0aGlzIGhlcmUgYXMgdGhlIG1qcGVnIGluaXQgaXMgY2FsbGVkIGJlZm9yZSB0aGUgY29tbW9uIGluaXQsCisgICAgcy0+bWJfd2lkdGggID0gKHMtPndpZHRoICArIDE1KSAvIDE2OworICAgIHMtPm1iX2hlaWdodCA9IChzLT5oZWlnaHQgKyAxNSkgLyAxNjsKIAotICAgICAgICAgICAgbGVuID0gKHJ1biA+PiA0KSAqIGh1ZmZfc2l6ZV9hY1sweGYwXTsKKyAgICBzd2l0Y2ggKHMtPmNocm9tYV9mb3JtYXQpIHsKKyAgICBjYXNlIENIUk9NQV80MjA6IGJsb2Nrc19wZXJfbWIgPSAgNjsgYnJlYWs7CisgICAgY2FzZSBDSFJPTUFfNDIyOiBibG9ja3NfcGVyX21iID0gIDg7IGJyZWFrOworICAgIGNhc2UgQ0hST01BXzQ0NDogYmxvY2tzX3Blcl9tYiA9IDEyOyBicmVhazsKKyAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOworICAgIH07CiAKLSAgICAgICAgICAgIG5iaXRzPSBhdl9sb2cyXzE2Yml0KGFsZXZlbCkgKyAxOwotICAgICAgICAgICAgY29kZSA9ICgoMTUmcnVuKSA8PCA0KSB8IG5iaXRzOworICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSB0byBob2xkIHRoaXMgZnJhbWUuCisgICAgbnVtX21icyA9IHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0OworICAgIG51bV9ibG9ja3MgPSBudW1fbWJzICogYmxvY2tzX3Blcl9tYjsKKyAgICBudW1fY29kZXMgPSBudW1fYmxvY2tzICogNjQ7CiAKLSAgICAgICAgICAgIGxlbiArPSBodWZmX3NpemVfYWNbY29kZV0gKyBuYml0czsKLQotICAgICAgICAgICAgdW5pX2FjX3ZsY19sZW5bVU5JX0FDX0VOQ19JTkRFWChydW4sIGkpXSA9IGxlbjsKLSAgICAgICAgICAgIC8vIFdlIGlnbm9yZSBFT0IgYXMgaXRzIGp1c3QgYSBjb25zdGFudCB3aGljaCBkb2VzIG5vdCBjaGFuZ2UgZ2VuZXJhbGx5Ci0gICAgICAgIH0KLSAgICB9CisgICAgbS0+aHVmZl9idWZmZXIgPSBhdl9tYWxsb2NfYXJyYXkobnVtX2NvZGVzLCBzaXplb2YoTUpwZWdIdWZmbWFuQ29kZSkpOworICAgIGlmICghbS0+aHVmZl9idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIDA7CiB9CiAKIGF2X2NvbGQgaW50IGZmX21qcGVnX2VuY29kZV9pbml0KE1wZWdFbmNDb250ZXh0ICpzKQogewogICAgIE1KcGVnQ29udGV4dCAqbTsKIAorICAgIGF2X2Fzc2VydDAocy0+c2xpY2VfY29udGV4dF9jb3VudCA9PSAxKTsKKwogICAgIGlmIChzLT53aWR0aCA+IDY1NTAwIHx8IHMtPmhlaWdodCA+IDY1NTAwKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJKUEVHIGRvZXMgbm90IHN1cHBvcnQgcmVzb2x1dGlvbnMgYWJvdmUgNjU1MDB4NjU1MDBcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIG0gPSBhdl9tYWxsb2Moc2l6ZW9mKE1KcGVnQ29udGV4dCkpOworICAgIG0gPSBhdl9tYWxsb2N6KHNpemVvZihNSnBlZ0NvbnRleHQpKTsKICAgICBpZiAoIW0pCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBzLT5taW5fcWNvZWZmPS0xMDIzOwogICAgIHMtPm1heF9xY29lZmY9IDEwMjM7CiAKLSAgICAvKiBidWlsZCBhbGwgdGhlIGh1ZmZtYW4gdGFibGVzICovCisgICAgLy8gQnVpbGQgZGVmYXVsdCBIdWZmbWFuIHRhYmxlcy4KKyAgICAvLyBUaGVzZSBtYXkgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIgd2l0aCBtb3JlIG9wdGltYWwgSHVmZm1hbiB0YWJsZXMsIGJ1dAorICAgIC8vIHRoZXkgYXJlIG5lZWRlZCBhdCBsZWFzdCByaWdodCBub3cgZm9yIHNvbWUgcHJvY2Vzc2VzIGxpa2UgdHJlbGxpcy4KICAgICBmZl9tanBlZ19idWlsZF9odWZmbWFuX2NvZGVzKG0tPmh1ZmZfc2l6ZV9kY19sdW1pbmFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5odWZmX2NvZGVfZGNfbHVtaW5hbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlLApAQCAtMTAyLDIyICsxMDUsMTIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfYml0c19hY19jaHJvbWluYW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfYWNfY2hyb21pbmFuY2UpOwogCi0gICAgaW5pdF91bmlfYWNfdmxjKG0tPmh1ZmZfc2l6ZV9hY19sdW1pbmFuY2UsICAgdW5pX2FjX3ZsY19sZW4pOwotICAgIGluaXRfdW5pX2FjX3ZsYyhtLT5odWZmX3NpemVfYWNfY2hyb21pbmFuY2UsIHVuaV9jaHJvbWFfYWNfdmxjX2xlbik7CisgICAgZmZfaW5pdF91bmlfYWNfdmxjKG0tPmh1ZmZfc2l6ZV9hY19sdW1pbmFuY2UsICAgbS0+dW5pX2FjX3ZsY19sZW4pOworICAgIGZmX2luaXRfdW5pX2FjX3ZsYyhtLT5odWZmX3NpemVfYWNfY2hyb21pbmFuY2UsIG0tPnVuaV9jaHJvbWFfYWNfdmxjX2xlbik7CiAgICAgcy0+aW50cmFfYWNfdmxjX2xlbmd0aCAgICAgID0KLSAgICBzLT5pbnRyYV9hY192bGNfbGFzdF9sZW5ndGggPSB1bmlfYWNfdmxjX2xlbjsKKyAgICBzLT5pbnRyYV9hY192bGNfbGFzdF9sZW5ndGggPSBtLT51bmlfYWNfdmxjX2xlbjsKICAgICBzLT5pbnRyYV9jaHJvbWFfYWNfdmxjX2xlbmd0aCAgICAgID0KLSAgICBzLT5pbnRyYV9jaHJvbWFfYWNfdmxjX2xhc3RfbGVuZ3RoID0gdW5pX2Nocm9tYV9hY192bGNfbGVuOworICAgIHMtPmludHJhX2Nocm9tYV9hY192bGNfbGFzdF9sZW5ndGggPSBtLT51bmlfY2hyb21hX2FjX3ZsY19sZW47CiAKKyAgICAvLyBCdWZmZXJzIHN0YXJ0IG91dCBlbXB0eS4KKyAgICBtLT5odWZmX25jb2RlID0gMDsKICAgICBzLT5tanBlZ19jdHggPSBtOworCisgICAgaWYocy0+aHVmZm1hbiA9PSBIVUZGTUFOX1RBQkxFX09QVElNQUwpCisgICAgICAgIHJldHVybiBhbGxvY19odWZmbWFuKHMpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKIGF2X2NvbGQgdm9pZCBmZl9tanBlZ19lbmNvZGVfY2xvc2UoTXBlZ0VuY0NvbnRleHQgKnMpCiB7CisgICAgYXZfZnJlZXAoJnMtPm1qcGVnX2N0eC0+aHVmZl9idWZmZXIpOwogICAgIGF2X2ZyZWVwKCZzLT5tanBlZ19jdHgpOwogfQogCisvKioKKyAqIEFkZCBjb2RlIGFuZCB0YWJsZV9pZCB0byB0aGUgSlBFRyBidWZmZXIuCisgKgorICogQHBhcmFtIHMgVGhlIE1KcGVnQ29udGV4dCB3aGljaCBjb250YWlucyB0aGUgSlBFRyBidWZmZXIuCisgKiBAcGFyYW0gdGFibGVfaWQgV2hpY2ggSHVmZm1hbiB0YWJsZSB0aGUgY29kZSBiZWxvbmdzIHRvLgorICogQHBhcmFtIGNvZGUgVGhlIGVuY29kZWQgZXhwb25lbnQgb2YgdGhlIGNvZWZmaWNpZW50cyBhbmQgdGhlIHJ1bi1iaXRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmZfbWpwZWdfZW5jb2RlX2NvZGUoTUpwZWdDb250ZXh0ICpzLCB1aW50OF90IHRhYmxlX2lkLCBpbnQgY29kZSkKK3sKKyAgICBNSnBlZ0h1ZmZtYW5Db2RlICpjID0gJnMtPmh1ZmZfYnVmZmVyW3MtPmh1ZmZfbmNvZGUrK107CisgICAgYy0+dGFibGVfaWQgPSB0YWJsZV9pZDsKKyAgICBjLT5jb2RlID0gY29kZTsKK30KKworLyoqCisgKiBBZGQgdGhlIGNvZWZmaWNpZW50J3MgZGF0YSB0byB0aGUgSlBFRyBidWZmZXIuCisgKgorICogQHBhcmFtIHMgVGhlIE1KcGVnQ29udGV4dCB3aGljaCBjb250YWlucyB0aGUgSlBFRyBidWZmZXIuCisgKiBAcGFyYW0gdGFibGVfaWQgV2hpY2ggSHVmZm1hbiB0YWJsZSB0aGUgY29kZSBiZWxvbmdzIHRvLgorICogQHBhcmFtIHZhbCBUaGUgY29lZmZpY2llbnQuCisgKiBAcGFyYW0gcnVuIFRoZSBydW4tYml0cy4KKyAqLworc3RhdGljIHZvaWQgZmZfbWpwZWdfZW5jb2RlX2NvZWYoTUpwZWdDb250ZXh0ICpzLCB1aW50OF90IHRhYmxlX2lkLCBpbnQgdmFsLCBpbnQgcnVuKQoreworICAgIGludCBtYW50LCBjb2RlOworCisgICAgaWYgKHZhbCA9PSAwKSB7CisgICAgICAgIGF2X2Fzc2VydDAocnVuID09IDApOworICAgICAgICBmZl9tanBlZ19lbmNvZGVfY29kZShzLCB0YWJsZV9pZCwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWFudCA9IHZhbDsKKyAgICAgICAgaWYgKHZhbCA8IDApIHsKKyAgICAgICAgICAgIHZhbCA9IC12YWw7CisgICAgICAgICAgICBtYW50LS07CisgICAgICAgIH0KKworICAgICAgICBjb2RlID0gKHJ1biA8PCA0KSB8IChhdl9sb2cyXzE2Yml0KHZhbCkgKyAxKTsKKworICAgICAgICBzLT5odWZmX2J1ZmZlcltzLT5odWZmX25jb2RlXS5tYW50ID0gbWFudDsKKyAgICAgICAgZmZfbWpwZWdfZW5jb2RlX2NvZGUocywgdGFibGVfaWQsIGNvZGUpOworICAgIH0KK30KKworLyoqCisgKiBBZGQgdGhlIGJsb2NrJ3MgZGF0YSBpbnRvIHRoZSBKUEVHIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcyBUaGUgTUpwZWdFbmNDb250ZXh0IHRoYXQgY29udGFpbnMgdGhlIEpQRUcgYnVmZmVyLgorICogQHBhcmFtIGJsb2NrIFRoZSBibG9jay4KKyAqIEBwYXJhbSBuIFRoZSBibG9jaydzIGluZGV4IG9yIG51bWJlci4KKyAqLworc3RhdGljIHZvaWQgcmVjb3JkX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywgaW50IG4pCit7CisgICAgaW50IGksIGosIHRhYmxlX2lkOworICAgIGludCBjb21wb25lbnQsIGRjLCBsYXN0X2luZGV4LCB2YWwsIHJ1bjsKKyAgICBNSnBlZ0NvbnRleHQgKm0gPSBzLT5tanBlZ19jdHg7CisKKyAgICAvKiBEQyBjb2VmICovCisgICAgY29tcG9uZW50ID0gKG4gPD0gMyA/IDAgOiAobiYxKSArIDEpOworICAgIHRhYmxlX2lkID0gKG4gPD0gMyA/IDAgOiAxKTsKKyAgICBkYyA9IGJsb2NrWzBdOyAvKiBvdmVyZmxvdyBpcyBpbXBvc3NpYmxlICovCisgICAgdmFsID0gZGMgLSBzLT5sYXN0X2RjW2NvbXBvbmVudF07CisKKyAgICBmZl9tanBlZ19lbmNvZGVfY29lZihtLCB0YWJsZV9pZCwgdmFsLCAwKTsKKworICAgIHMtPmxhc3RfZGNbY29tcG9uZW50XSA9IGRjOworCisgICAgLyogQUMgY29lZnMgKi8KKworICAgIHJ1biA9IDA7CisgICAgbGFzdF9pbmRleCA9IHMtPmJsb2NrX2xhc3RfaW5kZXhbbl07CisgICAgdGFibGVfaWQgfD0gMjsKKworICAgIGZvcihpPTE7aTw9bGFzdF9pbmRleDtpKyspIHsKKyAgICAgICAgaiA9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkW2ldOworICAgICAgICB2YWwgPSBibG9ja1tqXTsKKworICAgICAgICBpZiAodmFsID09IDApIHsKKyAgICAgICAgICAgIHJ1bisrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2hpbGUgKHJ1biA+PSAxNikgeworICAgICAgICAgICAgICAgIGZmX21qcGVnX2VuY29kZV9jb2RlKG0sIHRhYmxlX2lkLCAweGYwKTsKKyAgICAgICAgICAgICAgICBydW4gLT0gMTY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl9tanBlZ19lbmNvZGVfY29lZihtLCB0YWJsZV9pZCwgdmFsLCBydW4pOworICAgICAgICAgICAgcnVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG91dHB1dCBFT0Igb25seSBpZiBub3QgYWxyZWFkeSA2NCB2YWx1ZXMgKi8KKyAgICBpZiAobGFzdF9pbmRleCA8IDYzIHx8IHJ1biAhPSAwKQorICAgICAgICBmZl9tanBlZ19lbmNvZGVfY29kZShtLCB0YWJsZV9pZCwgMCk7Cit9CisKIHN0YXRpYyB2b2lkIGVuY29kZV9ibG9jayhNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2ssIGludCBuKQogewogICAgIGludCBtYW50LCBuYml0cywgY29kZSwgaSwgajsKQEAgLTE3OSw0MyArMjgyLDc0IEBACiB2b2lkIGZmX21qcGVnX2VuY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1sxMl1bNjRdKQogewogICAgIGludCBpOwotICAgIGlmIChzLT5jaHJvbWFfZm9ybWF0ID09IENIUk9NQV80NDQpIHsKLSAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzBdLCAwKTsKLSAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzJdLCAyKTsKLSAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzRdLCA0KTsKLSAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzhdLCA4KTsKLSAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzVdLCA1KTsKLSAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzldLCA5KTsKKyAgICBpZiAocy0+aHVmZm1hbiA9PSBIVUZGTUFOX1RBQkxFX09QVElNQUwpIHsKKyAgICAgICAgaWYgKHMtPmNocm9tYV9mb3JtYXQgPT0gQ0hST01BXzQ0NCkgeworICAgICAgICAgICAgcmVjb3JkX2Jsb2NrKHMsIGJsb2NrWzBdLCAwKTsKKyAgICAgICAgICAgIHJlY29yZF9ibG9jayhzLCBibG9ja1syXSwgMik7CisgICAgICAgICAgICByZWNvcmRfYmxvY2socywgYmxvY2tbNF0sIDQpOworICAgICAgICAgICAgcmVjb3JkX2Jsb2NrKHMsIGJsb2NrWzhdLCA4KTsKKyAgICAgICAgICAgIHJlY29yZF9ibG9jayhzLCBibG9ja1s1XSwgNSk7CisgICAgICAgICAgICByZWNvcmRfYmxvY2socywgYmxvY2tbOV0sIDkpOwogCi0gICAgICAgIGlmICgxNipzLT5tYl94KzggPCBzLT53aWR0aCkgewotICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzFdLCAxKTsKLSAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1szXSwgMyk7Ci0gICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbNl0sIDYpOwotICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzEwXSwgMTApOwotICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzddLCA3KTsKLSAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1sxMV0sIDExKTsKKyAgICAgICAgICAgIGlmICgxNipzLT5tYl94KzggPCBzLT53aWR0aCkgeworICAgICAgICAgICAgICAgIHJlY29yZF9ibG9jayhzLCBibG9ja1sxXSwgMSk7CisgICAgICAgICAgICAgICAgcmVjb3JkX2Jsb2NrKHMsIGJsb2NrWzNdLCAzKTsKKyAgICAgICAgICAgICAgICByZWNvcmRfYmxvY2socywgYmxvY2tbNl0sIDYpOworICAgICAgICAgICAgICAgIHJlY29yZF9ibG9jayhzLCBibG9ja1sxMF0sIDEwKTsKKyAgICAgICAgICAgICAgICByZWNvcmRfYmxvY2socywgYmxvY2tbN10sIDcpOworICAgICAgICAgICAgICAgIHJlY29yZF9ibG9jayhzLCBibG9ja1sxMV0sIDExKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcihpPTA7aTw1O2krKykgeworICAgICAgICAgICAgICAgIHJlY29yZF9ibG9jayhzLCBibG9ja1tpXSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+Y2hyb21hX2Zvcm1hdCA9PSBDSFJPTUFfNDIwKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkX2Jsb2NrKHMsIGJsb2NrWzVdLCA1KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVjb3JkX2Jsb2NrKHMsIGJsb2NrWzZdLCA2KTsKKyAgICAgICAgICAgICAgICByZWNvcmRfYmxvY2socywgYmxvY2tbNV0sIDUpOworICAgICAgICAgICAgICAgIHJlY29yZF9ibG9jayhzLCBibG9ja1s3XSwgNyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IoaT0wO2k8NTtpKyspIHsKLSAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1tpXSwgaSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMtPmNocm9tYV9mb3JtYXQgPT0gQ0hST01BXzQyMCkgeworICAgICAgICBpZiAocy0+Y2hyb21hX2Zvcm1hdCA9PSBDSFJPTUFfNDQ0KSB7CisgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbMF0sIDApOworICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzJdLCAyKTsKKyAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1s0XSwgNCk7CisgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbOF0sIDgpOwogICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzVdLCA1KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1s2XSwgNik7Ci0gICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbNV0sIDUpOwotICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzddLCA3KTsKLSAgICAgICAgfQotICAgIH0KKyAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1s5XSwgOSk7CiAKLSAgICBzLT5pX3RleF9iaXRzICs9IGdldF9iaXRzX2RpZmYocyk7CisgICAgICAgICAgICBpZiAoMTYqcy0+bWJfeCs4IDwgcy0+d2lkdGgpIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbMV0sIDEpOworICAgICAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1szXSwgMyk7CisgICAgICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzZdLCA2KTsKKyAgICAgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbMTBdLCAxMCk7CisgICAgICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzddLCA3KTsKKyAgICAgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbMTFdLCAxMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IoaT0wO2k8NTtpKyspIHsKKyAgICAgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbaV0sIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmNocm9tYV9mb3JtYXQgPT0gQ0hST01BXzQyMCkgeworICAgICAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1s1XSwgNSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVuY29kZV9ibG9jayhzLCBibG9ja1s2XSwgNik7CisgICAgICAgICAgICAgICAgZW5jb2RlX2Jsb2NrKHMsIGJsb2NrWzVdLCA1KTsKKyAgICAgICAgICAgICAgICBlbmNvZGVfYmxvY2socywgYmxvY2tbN10sIDcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+aV90ZXhfYml0cyArPSBnZXRfYml0c19kaWZmKHMpOworICAgIH0KIH0KIAorI2lmIENPTkZJR19BTVZfRU5DT0RFUgogLy8gbWF4aW11bSBvdmVyIHMtPm1qcGVnX3ZzYW1wbGVbaV0KICNkZWZpbmUgVl9NQVggMgogc3RhdGljIGludCBhbXZfZW5jb2RlX3BpY3R1cmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljX2FyZywgaW50ICpnb3RfcGFja2V0KQotCiB7CiAgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFWRnJhbWUgKnBpYzsKQEAgLTIyNCwxMiArMzU4LDYgQEAKIAogICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LCAmY2hyb21hX2hfc2hpZnQsICZjaHJvbWFfdl9zaGlmdCk7CiAKLSNpZiBGRl9BUElfRU1VX0VER0UKLSAgICAvL0NPREVDX0ZMQUdfRU1VX0VER0UgaGF2ZSB0byBiZSBjbGVhcmVkCi0gICAgaWYocy0+YXZjdHgtPmZsYWdzICYgQ09ERUNfRkxBR19FTVVfRURHRSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSNlbmRpZgotCiAgICAgaWYgKChhdmN0eC0+aGVpZ2h0ICYgMTUpICYmIGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiSGVpZ2h0cyB3aGljaCBhcmUgbm90IGEgbXVsdGlwbGUgb2YgMTYgbWlnaHQgZmFpbCB3aXRoIHNvbWUgZGVjb2RlcnMsICIKQEAgLTI1Miw2ICszODAsNyBAQAogICAgIGF2X2ZyYW1lX2ZyZWUoJnBpYyk7CiAgICAgcmV0dXJuIHJldDsKIH0KKyNlbmRpZgogCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNcGVnRW5jQ29udGV4dCwgeCkKICNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQpAQCAtMjYxLDEyICszOTAsMTMgQEAKICAgICB7ICJsZWZ0IiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgInByZWQiIH0sCiAgICAgeyAicGxhbmUiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDIgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJwcmVkIiB9LAogICAgIHsgIm1lZGlhbiIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAzIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAicHJlZCIgfSwKLQoreyAiaHVmZm1hbiIsICJIdWZmbWFuIHRhYmxlIHN0cmF0ZWd5IiwgT0ZGU0VUKGh1ZmZtYW4pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEhVRkZNQU5fVEFCTEVfT1BUSU1BTCB9LCAwLCBOQl9IVUZGTUFOX1RBQkxFX09QVElPTiAtIDEsIFZFLCAiaHVmZm1hbiIgfSwKKyAgICB7ICJkZWZhdWx0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEhVRkZNQU5fVEFCTEVfREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImh1ZmZtYW4iIH0sCisgICAgeyAib3B0aW1hbCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBIVUZGTUFOX1RBQkxFX09QVElNQUwgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJodWZmbWFuIiB9LAogeyBOVUxMfSwKIH07CiAKICNpZiBDT05GSUdfTUpQRUdfRU5DT0RFUgotCiBzdGF0aWMgY29uc3QgQVZDbGFzcyBtanBlZ19jbGFzcyA9IHsKICAgICAuY2xhc3NfbmFtZSA9ICJtanBlZyBlbmNvZGVyIiwKICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLApAQCAtMjg0LDEyICs0MTQsMTMgQEAKICAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9tcHZfZW5jb2RlX3BpY3R1cmUsCiAgICAgLmNsb3NlICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9lbmQsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IEFWX0NPREVDX0NBUF9JTlRSQV9PTkxZLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CiAgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfTk9ORQogICAgIH0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJm1qcGVnX2NsYXNzLAogfTsKICNlbmRpZgorCiAjaWYgQ09ORklHX0FNVl9FTkNPREVSCiBzdGF0aWMgY29uc3QgQVZDbGFzcyBhbXZfY2xhc3MgPSB7CiAgICAgLmNsYXNzX25hbWUgPSAiYW12IGVuY29kZXIiLApAQCAtMzA3LDcgKzQzOCw3IEBACiAgICAgLmluaXQgICAgICAgICAgID0gZmZfbXB2X2VuY29kZV9pbml0LAogICAgIC5lbmNvZGUyICAgICAgICA9IGFtdl9lbmNvZGVfcGljdHVyZSwKICAgICAuY2xvc2UgICAgICAgICAgPSBmZl9tcHZfZW5jb2RlX2VuZCwKLSAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peworICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgewogICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX05PTkUKICAgICB9LAogICAgIC5wcml2X2NsYXNzICAgICA9ICZhbXZfY2xhc3MsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21qcGVnZW5jLmggYi9saWJhdmNvZGVjL21qcGVnZW5jLmgKaW5kZXggNGQ3N2UxNi4uZDdkZGMzNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tanBlZ2VuYy5oCisrKyBiL2xpYmF2Y29kZWMvbWpwZWdlbmMuaApAQCAtMzksMTggKzM5LDY1IEBACiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAicHV0X2JpdHMuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgTUpwZWdDb250ZXh0IHsKLSAgICB1aW50OF90IGh1ZmZfc2l6ZV9kY19sdW1pbmFuY2VbMTJdOyAvL0ZJWE1FIHVzZSBhcnJheSBbM10gaW5zdGVhZCBvZiBsdW1pIC8gY2hyb20sIGZvciBlYXNpZXIgYWRkcmVzc2luZwotICAgIHVpbnQxNl90IGh1ZmZfY29kZV9kY19sdW1pbmFuY2VbMTJdOwotICAgIHVpbnQ4X3QgaHVmZl9zaXplX2RjX2Nocm9taW5hbmNlWzEyXTsKLSAgICB1aW50MTZfdCBodWZmX2NvZGVfZGNfY2hyb21pbmFuY2VbMTJdOworLyoqCisgKiBCdWZmZXIgb2YgSlBFRyBmcmFtZSBkYXRhLgorICoKKyAqIE9wdGltYWwgSHVmZm1hbiB0YWJsZSBnZW5lcmF0aW9uIHJlcXVpcmVzIHRoZSBmcmFtZSBkYXRhIHRvIGJlIGxvYWRlZCBpbnRvCisgKiBhIGJ1ZmZlciBzbyB0aGF0IHRoZSB0YWJsZXMgY2FuIGJlIGNvbXB1dGVkLgorICogVGhlcmUgYXJlIGF0IG1vc3QgbWJfd2lkdGgqbWJfaGVpZ2h0KjEyKjY0IG9mIHRoZXNlIHBlciBmcmFtZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTUpwZWdIdWZmbWFuQ29kZSB7CisgICAgLy8gMD1EQyBsdW0sIDE9REMgY2hyb20sIDI9QUMgbHVtLCAzPUFDIGNocm9tCisgICAgdWludDhfdCB0YWJsZV9pZDsgLy8vPCBUaGUgSHVmZm1hbiB0YWJsZSBpZCBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEuCisgICAgdWludDhfdCBjb2RlOyAgICAgLy8vPCBUaGUgZXhwb25lbnQuCisgICAgdWludDE2X3QgbWFudDsgICAgLy8vPCBUaGUgbWFudGlzc2EuCit9IE1KcGVnSHVmZm1hbkNvZGU7CiAKLSAgICB1aW50OF90IGh1ZmZfc2l6ZV9hY19sdW1pbmFuY2VbMjU2XTsKLSAgICB1aW50MTZfdCBodWZmX2NvZGVfYWNfbHVtaW5hbmNlWzI1Nl07Ci0gICAgdWludDhfdCBodWZmX3NpemVfYWNfY2hyb21pbmFuY2VbMjU2XTsKLSAgICB1aW50MTZfdCBodWZmX2NvZGVfYWNfY2hyb21pbmFuY2VbMjU2XTsKKy8qKgorICogSG9sZHMgSlBFRyBmcmFtZSBkYXRhIGFuZCBIdWZmbWFuIHRhYmxlIGRhdGEuCisgKi8KK3R5cGVkZWYgc3RydWN0IE1KcGVnQ29udGV4dCB7CisgICAgLy9GSVhNRSB1c2UgYXJyYXkgWzNdIGluc3RlYWQgb2YgbHVtaSAvIGNocm9tYSwgZm9yIGVhc2llciBhZGRyZXNzaW5nCisgICAgdWludDhfdCBodWZmX3NpemVfZGNfbHVtaW5hbmNlWzEyXTsgICAgIC8vLzwgREMgbHVtaW5hbmNlIEh1ZmZtYW4gdGFibGUgc2l6ZS4KKyAgICB1aW50MTZfdCBodWZmX2NvZGVfZGNfbHVtaW5hbmNlWzEyXTsgICAgLy8vPCBEQyBsdW1pbmFuY2UgSHVmZm1hbiB0YWJsZSBjb2Rlcy4KKyAgICB1aW50OF90IGh1ZmZfc2l6ZV9kY19jaHJvbWluYW5jZVsxMl07ICAgLy8vPCBEQyBjaHJvbWluYW5jZSBIdWZmbWFuIHRhYmxlIHNpemUuCisgICAgdWludDE2X3QgaHVmZl9jb2RlX2RjX2Nocm9taW5hbmNlWzEyXTsgIC8vLzwgREMgY2hyb21pbmFuY2UgSHVmZm1hbiB0YWJsZSBjb2Rlcy4KKworICAgIHVpbnQ4X3QgaHVmZl9zaXplX2FjX2x1bWluYW5jZVsyNTZdOyAgICAvLy88IEFDIGx1bWluYW5jZSBIdWZmbWFuIHRhYmxlIHNpemUuCisgICAgdWludDE2X3QgaHVmZl9jb2RlX2FjX2x1bWluYW5jZVsyNTZdOyAgIC8vLzwgQUMgbHVtaW5hbmNlIEh1ZmZtYW4gdGFibGUgY29kZXMuCisgICAgdWludDhfdCBodWZmX3NpemVfYWNfY2hyb21pbmFuY2VbMjU2XTsgIC8vLzwgQUMgY2hyb21pbmFuY2UgSHVmZm1hbiB0YWJsZSBzaXplLgorICAgIHVpbnQxNl90IGh1ZmZfY29kZV9hY19jaHJvbWluYW5jZVsyNTZdOyAvLy88IEFDIGNocm9taW5hbmNlIEh1ZmZtYW4gdGFibGUgY29kZXMuCisKKyAgICAvKiogU3RvcmFnZSBmb3IgQUMgbHVtaW5hbmNlIFZMQyAoaW4gTXBlZ0VuY0NvbnRleHQpICovCisgICAgdWludDhfdCB1bmlfYWNfdmxjX2xlbls2NCAqIDY0ICogMl07CisgICAgLyoqIFN0b3JhZ2UgZm9yIEFDIGNocm9taW5hbmNlIFZMQyAoaW4gTXBlZ0VuY0NvbnRleHQpICovCisgICAgdWludDhfdCB1bmlfY2hyb21hX2FjX3ZsY19sZW5bNjQgKiA2NCAqIDJdOworCisgICAgLy8gRGVmYXVsdCBEQyB0YWJsZXMgaGF2ZSBleGFjdGx5IDEyIHZhbHVlcworICAgIHVpbnQ4X3QgYml0c19kY19sdW1pbmFuY2VbMTddOyAgIC8vLzwgREMgbHVtaW5hbmNlIEh1ZmZtYW4gYml0cy4KKyAgICB1aW50OF90IHZhbF9kY19sdW1pbmFuY2VbMTJdOyAgICAvLy88IERDIGx1bWluYW5jZSBIdWZmbWFuIHZhbHVlcy4KKyAgICB1aW50OF90IGJpdHNfZGNfY2hyb21pbmFuY2VbMTddOyAvLy88IERDIGNocm9taW5hbmNlIEh1ZmZtYW4gYml0cy4KKyAgICB1aW50OF90IHZhbF9kY19jaHJvbWluYW5jZVsxMl07ICAvLy88IERDIGNocm9taW5hbmNlIEh1ZmZtYW4gdmFsdWVzLgorCisgICAgLy8gOC1iaXQgSlBFRyBoYXMgbWF4IDI1NiB2YWx1ZXMKKyAgICB1aW50OF90IGJpdHNfYWNfbHVtaW5hbmNlWzE3XTsgICAvLy88IEFDIGx1bWluYW5jZSBIdWZmbWFuIGJpdHMuCisgICAgdWludDhfdCB2YWxfYWNfbHVtaW5hbmNlWzI1Nl07ICAgLy8vPCBBQyBsdW1pbmFuY2UgSHVmZm1hbiB2YWx1ZXMuCisgICAgdWludDhfdCBiaXRzX2FjX2Nocm9taW5hbmNlWzE3XTsgLy8vPCBBQyBjaHJvbWluYW5jZSBIdWZmbWFuIGJpdHMuCisgICAgdWludDhfdCB2YWxfYWNfY2hyb21pbmFuY2VbMjU2XTsgLy8vPCBBQyBjaHJvbWluYW5jZSBIdWZmbWFuIHZhbHVlcy4KKworICAgIHNpemVfdCBodWZmX25jb2RlOyAgICAgICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIGN1cnJlbnQgZW50cmllcyBpbiB0aGUgYnVmZmVyLgorICAgIE1KcGVnSHVmZm1hbkNvZGUgKmh1ZmZfYnVmZmVyOyAgIC8vLzwgQnVmZmVyIGZvciBIdWZmbWFuIGNvZGUgdmFsdWVzLgogfSBNSnBlZ0NvbnRleHQ7CiAKKy8qKgorICogRW51bSBmb3IgdGhlIEh1ZmZtYW4gZW5jb2Rpbmcgc3RyYXRlZ3kuCisgKi8KK2VudW0gSHVmZm1hblRhYmxlT3B0aW9uIHsKKyAgICBIVUZGTUFOX1RBQkxFX0RFRkFVTFQgPSAwLCAvLy88IFVzZSB0aGUgZGVmYXVsdCBIdWZmbWFuIHRhYmxlcy4KKyAgICBIVUZGTUFOX1RBQkxFX09QVElNQUwgPSAxLCAvLy88IENvbXB1dGUgYW5kIHVzZSBvcHRpbWFsIEh1ZmZtYW4gdGFibGVzLgorICAgIE5CX0hVRkZNQU5fVEFCTEVfT1BUSU9OID0gMgorfTsKKwogc3RhdGljIGlubGluZSB2b2lkIHB1dF9tYXJrZXIoUHV0Qml0Q29udGV4dCAqcCwgZW51bSBKcGVnTWFya2VyIGNvZGUpCiB7CiAgICAgcHV0X2JpdHMocCwgOCwgMHhmZik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21qcGVnZW5jX2NvbW1vbi5jIGIvbGliYXZjb2RlYy9tanBlZ2VuY19jb21tb24uYwppbmRleCAwOTlkODE3Li4zMTg2OGM5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21qcGVnZW5jX2NvbW1vbi5jCisrKyBiL2xpYmF2Y29kZWMvbWpwZWdlbmNfY29tbW9uLmMKQEAgLTMzLDggKzMzLDM1IEBACiAjaW5jbHVkZSAicHV0X2JpdHMuaCIKICNpbmNsdWRlICJtanBlZ2VuYy5oIgogI2luY2x1ZGUgIm1qcGVnZW5jX2NvbW1vbi5oIgorI2luY2x1ZGUgIm1qcGVnZW5jX2h1ZmZtYW4uaCIKICNpbmNsdWRlICJtanBlZy5oIgogCithdl9jb2xkIHZvaWQgZmZfaW5pdF91bmlfYWNfdmxjKGNvbnN0IHVpbnQ4X3QgaHVmZl9zaXplX2FjWzI1Nl0sIHVpbnQ4X3QgKnVuaV9hY192bGNfbGVuKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIGludCBsZXZlbCA9IGkgLSA2NDsKKyAgICAgICAgaW50IHJ1bjsKKyAgICAgICAgaWYgKCFsZXZlbCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKHJ1biA9IDA7IHJ1biA8IDY0OyBydW4rKykgeworICAgICAgICAgICAgaW50IGxlbiwgY29kZSwgbmJpdHM7CisgICAgICAgICAgICBpbnQgYWxldmVsID0gRkZBQlMobGV2ZWwpOworCisgICAgICAgICAgICBsZW4gPSAocnVuID4+IDQpICogaHVmZl9zaXplX2FjWzB4ZjBdOworCisgICAgICAgICAgICBuYml0cz0gYXZfbG9nMl8xNmJpdChhbGV2ZWwpICsgMTsKKyAgICAgICAgICAgIGNvZGUgPSAoKDE1JnJ1bikgPDwgNCkgfCBuYml0czsKKworICAgICAgICAgICAgbGVuICs9IGh1ZmZfc2l6ZV9hY1tjb2RlXSArIG5iaXRzOworCisgICAgICAgICAgICB1bmlfYWNfdmxjX2xlbltVTklfQUNfRU5DX0lOREVYKHJ1biwgaSldID0gbGVuOworICAgICAgICAgICAgLy8gV2UgaWdub3JlIEVPQiBhcyBpdHMganVzdCBhIGNvbnN0YW50IHdoaWNoIGRvZXMgbm90IGNoYW5nZSBnZW5lcmFsbHkKKyAgICAgICAgfQorICAgIH0KK30KKwogLyogdGFibGVfY2xhc3M6IDAgPSBEQyBjb2VmLCAxID0gQUMgY29lZnMgKi8KIHN0YXRpYyBpbnQgcHV0X2h1ZmZtYW5fdGFibGUoUHV0Qml0Q29udGV4dCAqcCwgaW50IHRhYmxlX2NsYXNzLCBpbnQgdGFibGVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJpdHNfdGFibGUsIGNvbnN0IHVpbnQ4X3QgKnZhbHVlX3RhYmxlKQpAQCAtNjQsMTMgKzkxLDE3IEBACiB7CiAgICAgaW50IGksIGosIHNpemU7CiAgICAgdWludDhfdCAqcHRyOwotICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IE5VTEw7CisKKyAgICAvKiBTaW5jZSBhdmN0eC0+cHJpdl9kYXRhIHdpbGwgcG9pbnQgdG8gTEpwZWdFbmNDb250ZXh0IGluIHRoaXMgY2FzZSAqLworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTEpQRUcpCisgICAgICAgIHMgPSBhdmN0eC0+cHJpdl9kYXRhOwogCiAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9MSlBFRykgewogICAgICAgICBpbnQgbWF0cml4X2NvdW50ID0gMSArICEhbWVtY21wKGx1bWFfaW50cmFfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNocm9tYV9pbnRyYV9tYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGx1bWFfaW50cmFfbWF0cml4WzBdKSAqIDY0KTsKLSAgICBpZiAocy0+Zm9yY2VfZHVwbGljYXRlZF9tYXRyaXgpCisgICAgaWYgKHMgJiYgcy0+Zm9yY2VfZHVwbGljYXRlZF9tYXRyaXgpCiAgICAgICAgIG1hdHJpeF9jb3VudCA9IDI7CiAgICAgLyogcXVhbnQgbWF0cml4ZXMgKi8KICAgICBwdXRfbWFya2VyKHAsIERRVCk7CkBAIC0xMDQsMTUgKzEzNSwzMCBAQAogICAgIHB0ciA9IHB1dF9iaXRzX3B0cihwKTsKICAgICBwdXRfYml0cyhwLCAxNiwgMCk7IC8qIHBhdGNoZWQgbGF0ZXIgKi8KICAgICBzaXplID0gMjsKLSAgICBzaXplICs9IHB1dF9odWZmbWFuX3RhYmxlKHAsIDAsIDAsIGF2cHJpdl9tanBlZ19iaXRzX2RjX2x1bWluYW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfZGMpOwotICAgIHNpemUgKz0gcHV0X2h1ZmZtYW5fdGFibGUocCwgMCwgMSwgYXZwcml2X21qcGVnX2JpdHNfZGNfY2hyb21pbmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2RjKTsKIAotICAgIHNpemUgKz0gcHV0X2h1ZmZtYW5fdGFibGUocCwgMSwgMCwgYXZwcml2X21qcGVnX2JpdHNfYWNfbHVtaW5hbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19sdW1pbmFuY2UpOwotICAgIHNpemUgKz0gcHV0X2h1ZmZtYW5fdGFibGUocCwgMSwgMSwgYXZwcml2X21qcGVnX2JpdHNfYWNfY2hyb21pbmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2Nocm9taW5hbmNlKTsKKyAgICAvLyBPbmx5IE1KUEVHIGNhbiBoYXZlIGEgdmFyaWFibGUgSHVmZm1hbiB2YXJpYWJsZS4gQWxsIG90aGVyCisgICAgLy8gZm9ybWF0cyB1c2UgdGhlIGRlZmF1bHQgSHVmZm1hbiB0YWJsZS4KKyAgICBpZiAocyAmJiBzLT5odWZmbWFuID09IEhVRkZNQU5fVEFCTEVfT1BUSU1BTCkgeworICAgICAgICBzaXplICs9IHB1dF9odWZmbWFuX3RhYmxlKHAsIDAsIDAsIHMtPm1qcGVnX2N0eC0+Yml0c19kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWpwZWdfY3R4LT52YWxfZGNfbHVtaW5hbmNlKTsKKyAgICAgICAgc2l6ZSArPSBwdXRfaHVmZm1hbl90YWJsZShwLCAwLCAxLCBzLT5tanBlZ19jdHgtPmJpdHNfZGNfY2hyb21pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWpwZWdfY3R4LT52YWxfZGNfY2hyb21pbmFuY2UpOworCisgICAgICAgIHNpemUgKz0gcHV0X2h1ZmZtYW5fdGFibGUocCwgMSwgMCwgcy0+bWpwZWdfY3R4LT5iaXRzX2FjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tanBlZ19jdHgtPnZhbF9hY19sdW1pbmFuY2UpOworICAgICAgICBzaXplICs9IHB1dF9odWZmbWFuX3RhYmxlKHAsIDEsIDEsIHMtPm1qcGVnX2N0eC0+Yml0c19hY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tanBlZ19jdHgtPnZhbF9hY19jaHJvbWluYW5jZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZSArPSBwdXRfaHVmZm1hbl90YWJsZShwLCAwLCAwLCBhdnByaXZfbWpwZWdfYml0c19kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYyk7CisgICAgICAgIHNpemUgKz0gcHV0X2h1ZmZtYW5fdGFibGUocCwgMCwgMSwgYXZwcml2X21qcGVnX2JpdHNfZGNfY2hyb21pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYyk7CisKKyAgICAgICAgc2l6ZSArPSBwdXRfaHVmZm1hbl90YWJsZShwLCAxLCAwLCBhdnByaXZfbWpwZWdfYml0c19hY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19sdW1pbmFuY2UpOworICAgICAgICBzaXplICs9IHB1dF9odWZmbWFuX3RhYmxlKHAsIDEsIDEsIGF2cHJpdl9tanBlZ19iaXRzX2FjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ192YWxfYWNfY2hyb21pbmFuY2UpOworICAgIH0KICAgICBBVl9XQjE2KHB0ciwgc2l6ZSk7CiB9CiAKQEAgLTEyMiw2ICsxNjgsMTYgQEAKICAgICB1aW50OF90ICpwdHI7CiAKICAgICBpZiAoYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID4gMCAmJiBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPiAwKSB7CisgICAgICAgIEFWUmF0aW9uYWwgc2FyID0gYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICAgICAgaWYgKHNhci5udW0gPiA2NTUzNSB8fCBzYXIuZGVuID4gNjU1MzUpIHsKKyAgICAgICAgICAgIGlmICghYXZfcmVkdWNlKCZzYXIubnVtLCAmc2FyLmRlbiwgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sIDY1NTM1KSkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHN0b3JlIGV4YWN0IGFzcGVjdCByYXRpbyAlZDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICB9CisKICAgICAgICAgLyogSkZJRiBoZWFkZXIgKi8KICAgICAgICAgcHV0X21hcmtlcihwLCBBUFAwKTsKICAgICAgICAgcHV0X2JpdHMocCwgMTYsIDE2KTsKQEAgLTEzMSw4ICsxODcsOCBAQAogICAgICAgICAgKiByZWxlYXNlZCByZXZpc2lvbi4gKi8KICAgICAgICAgcHV0X2JpdHMocCwgMTYsIDB4MDEwMik7CiAgICAgICAgIHB1dF9iaXRzKHAsICA4LCAwKTsgICAgICAgICAgICAgIC8qIHVuaXRzIHR5cGU6IDAgLSBhc3BlY3QgcmF0aW8gKi8KLSAgICAgICAgcHV0X2JpdHMocCwgMTYsIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSk7Ci0gICAgICAgIHB1dF9iaXRzKHAsIDE2LCBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICBwdXRfYml0cyhwLCAxNiwgc2FyLm51bSk7CisgICAgICAgIHB1dF9iaXRzKHAsIDE2LCBzYXIuZGVuKTsKICAgICAgICAgcHV0X2JpdHMocCwgOCwgMCk7IC8qIHRodW1ibmFpbCB3aWR0aCAqLwogICAgICAgICBwdXRfYml0cyhwLCA4LCAwKTsgLyogdGh1bWJuYWlsIGhlaWdodCAqLwogICAgIH0KQEAgLTMwMyw2ICszNTksNTQgQEAKICAgICB9CiB9CiAKKy8qKgorICogRW5jb2RlcyBhbmQgb3V0cHV0cyB0aGUgZW50aXJlIGZyYW1lIGluIHRoZSBKUEVHIGZvcm1hdC4KKyAqCisgKiBAcGFyYW0gcyBUaGUgTXBlZ0VuY0NvbnRleHQuCisgKi8KK3ZvaWQgZmZfbWpwZWdfZW5jb2RlX3BpY3R1cmVfZnJhbWUoTXBlZ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGksIG5iaXRzLCBjb2RlLCB0YWJsZV9pZDsKKyAgICBNSnBlZ0NvbnRleHQgKm0gPSBzLT5tanBlZ19jdHg7CisgICAgdWludDhfdCAqaHVmZl9zaXplWzRdID0ge20tPmh1ZmZfc2l6ZV9kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPmh1ZmZfc2l6ZV9kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+aHVmZl9zaXplX2FjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+aHVmZl9zaXplX2FjX2Nocm9taW5hbmNlfTsKKyAgICB1aW50MTZfdCAqaHVmZl9jb2RlWzRdID0ge20tPmh1ZmZfY29kZV9kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5odWZmX2NvZGVfZGNfY2hyb21pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5odWZmX2NvZGVfYWNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+aHVmZl9jb2RlX2FjX2Nocm9taW5hbmNlfTsKKyAgICBzaXplX3QgdG90YWxfYml0cyA9IDA7CisgICAgc2l6ZV90IGJ5dGVzX25lZWRlZDsKKworICAgIHMtPmhlYWRlcl9iaXRzID0gZ2V0X2JpdHNfZGlmZihzKTsKKyAgICAvLyBFc3RpbWF0ZSB0aGUgdG90YWwgc2l6ZSBmaXJzdAorICAgIGZvciAoaSA9IDA7IGkgPCBtLT5odWZmX25jb2RlOyBpKyspIHsKKyAgICAgICAgdGFibGVfaWQgPSBtLT5odWZmX2J1ZmZlcltpXS50YWJsZV9pZDsKKyAgICAgICAgY29kZSA9IG0tPmh1ZmZfYnVmZmVyW2ldLmNvZGU7CisgICAgICAgIG5iaXRzID0gY29kZSAmIDB4ZjsKKworICAgICAgICB0b3RhbF9iaXRzICs9IGh1ZmZfc2l6ZVt0YWJsZV9pZF1bY29kZV0gKyBuYml0czsKKyAgICB9CisKKyAgICBieXRlc19uZWVkZWQgPSAodG90YWxfYml0cyArIDcpIC8gODsKKyAgICBmZl9tcHZfcmVhbGxvY2F0ZV9wdXRiaXRidWZmZXIocywgYnl0ZXNfbmVlZGVkLCBieXRlc19uZWVkZWQpOworCisgICAgZm9yIChpID0gMDsgaSA8IG0tPmh1ZmZfbmNvZGU7IGkrKykgeworICAgICAgICB0YWJsZV9pZCA9IG0tPmh1ZmZfYnVmZmVyW2ldLnRhYmxlX2lkOworICAgICAgICBjb2RlID0gbS0+aHVmZl9idWZmZXJbaV0uY29kZTsKKyAgICAgICAgbmJpdHMgPSBjb2RlICYgMHhmOworCisgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgaHVmZl9zaXplW3RhYmxlX2lkXVtjb2RlXSwgaHVmZl9jb2RlW3RhYmxlX2lkXVtjb2RlXSk7CisgICAgICAgIGlmIChuYml0cyAhPSAwKSB7CisgICAgICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCBuYml0cywgbS0+aHVmZl9idWZmZXJbaV0ubWFudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtLT5odWZmX25jb2RlID0gMDsKKyAgICBzLT5pX3RleF9iaXRzID0gZ2V0X2JpdHNfZGlmZihzKTsKK30KKwogdm9pZCBmZl9tanBlZ19lc2NhcGVfRkYoUHV0Qml0Q29udGV4dCAqcGIsIGludCBzdGFydCkKIHsKICAgICBpbnQgc2l6ZTsKQEAgLTM2MiwxNCArNDY2LDEwNiBAQAogICAgIH0KIH0KIAorLyoqCisgKiBCdWlsZHMgYWxsIDQgb3B0aW1hbCBIdWZmbWFuIHRhYmxlcy4KKyAqCisgKiBVc2VzIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgSlBFRyBidWZmZXIgdG8gY29tcHV0ZSB0aGUgdGFibGVzLgorICogU3RvcmVzIHRoZSBIdWZmbWFuIHRhYmxlcyBpbiB0aGUgYml0c18qIGFuZCB2YWxfKiBhcnJheXMgaW4gdGhlIE1KcGVnQ29udGV4dC4KKyAqCisgKiBAcGFyYW0gbSBNSnBlZ0NvbnRleHQgY29udGFpbmluZyB0aGUgSlBFRyBidWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGZmX21qcGVnX2J1aWxkX29wdGltYWxfaHVmZm1hbihNSnBlZ0NvbnRleHQgKm0pCit7CisgICAgaW50IGksIHRhYmxlX2lkLCBjb2RlOworCisgICAgTUpwZWdFbmNIdWZmbWFuQ29udGV4dCBkY19sdW1pbmFuY2VfY3R4OworICAgIE1KcGVnRW5jSHVmZm1hbkNvbnRleHQgZGNfY2hyb21pbmFuY2VfY3R4OworICAgIE1KcGVnRW5jSHVmZm1hbkNvbnRleHQgYWNfbHVtaW5hbmNlX2N0eDsKKyAgICBNSnBlZ0VuY0h1ZmZtYW5Db250ZXh0IGFjX2Nocm9taW5hbmNlX2N0eDsKKyAgICBNSnBlZ0VuY0h1ZmZtYW5Db250ZXh0ICpjdHhbNF0gPSB7JmRjX2x1bWluYW5jZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkY19jaHJvbWluYW5jZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY19sdW1pbmFuY2VfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNfY2hyb21pbmFuY2VfY3R4fTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGZmX21qcGVnX2VuY29kZV9odWZmbWFuX2luaXQoY3R4W2ldKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG0tPmh1ZmZfbmNvZGU7IGkrKykgeworICAgICAgICB0YWJsZV9pZCA9IG0tPmh1ZmZfYnVmZmVyW2ldLnRhYmxlX2lkOworICAgICAgICBjb2RlID0gbS0+aHVmZl9idWZmZXJbaV0uY29kZTsKKworICAgICAgICBmZl9tanBlZ19lbmNvZGVfaHVmZm1hbl9pbmNyZW1lbnQoY3R4W3RhYmxlX2lkXSwgY29kZSk7CisgICAgfQorCisgICAgZmZfbWpwZWdfZW5jb2RlX2h1ZmZtYW5fY2xvc2UoJmRjX2x1bWluYW5jZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+Yml0c19kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+dmFsX2RjX2x1bWluYW5jZSwgMTIpOworICAgIGZmX21qcGVnX2VuY29kZV9odWZmbWFuX2Nsb3NlKCZkY19jaHJvbWluYW5jZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+Yml0c19kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT52YWxfZGNfY2hyb21pbmFuY2UsIDEyKTsKKyAgICBmZl9tanBlZ19lbmNvZGVfaHVmZm1hbl9jbG9zZSgmYWNfbHVtaW5hbmNlX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5iaXRzX2FjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT52YWxfYWNfbHVtaW5hbmNlLCAyNTYpOworICAgIGZmX21qcGVnX2VuY29kZV9odWZmbWFuX2Nsb3NlKCZhY19jaHJvbWluYW5jZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+Yml0c19hY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT52YWxfYWNfY2hyb21pbmFuY2UsIDI1Nik7CisKKyAgICBmZl9tanBlZ19idWlsZF9odWZmbWFuX2NvZGVzKG0tPmh1ZmZfc2l6ZV9kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5odWZmX2NvZGVfZGNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+Yml0c19kY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT52YWxfZGNfbHVtaW5hbmNlKTsKKyAgICBmZl9tanBlZ19idWlsZF9odWZmbWFuX2NvZGVzKG0tPmh1ZmZfc2l6ZV9kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPmh1ZmZfY29kZV9kY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPmJpdHNfZGNfY2hyb21pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT52YWxfZGNfY2hyb21pbmFuY2UpOworICAgIGZmX21qcGVnX2J1aWxkX2h1ZmZtYW5fY29kZXMobS0+aHVmZl9zaXplX2FjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPmh1ZmZfY29kZV9hY19sdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT5iaXRzX2FjX2x1bWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPnZhbF9hY19sdW1pbmFuY2UpOworICAgIGZmX21qcGVnX2J1aWxkX2h1ZmZtYW5fY29kZXMobS0+aHVmZl9zaXplX2FjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+aHVmZl9jb2RlX2FjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS0+Yml0c19hY19jaHJvbWluYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0tPnZhbF9hY19jaHJvbWluYW5jZSk7Cit9CisKKy8qKgorICogV3JpdGVzIHRoZSBjb21wbGV0ZSBKUEVHIGZyYW1lIHdoZW4gb3B0aW1hbCBodWZmbWFuIHRhYmxlcyBhcmUgZW5hYmxlZCwKKyAqIG90aGVyd2lzZSB3cml0ZXMgdGhlIHN0dWZmaW5nLgorICoKKyAqIEhlYWRlciArIHZhbHVlcyArIHN0dWZmaW5nLgorICoKKyAqIEBwYXJhbSBzIFRoZSBNcGVnRW5jQ29udGV4dC4KKyAqIEByZXR1cm4gaW50IEVycm9yIGNvZGUsIDAgaWYgc3VjY2Vzc2Z1bC4KKyAqLwogaW50IGZmX21qcGVnX2VuY29kZV9zdHVmZmluZyhNcGVnRW5jQ29udGV4dCAqcykKIHsKICAgICBpbnQgaTsKICAgICBQdXRCaXRDb250ZXh0ICpwYmMgPSAmcy0+cGI7CiAgICAgaW50IG1iX3kgPSBzLT5tYl95IC0gIXMtPm1iX3g7CisgICAgaW50IHJldDsKKyAgICBNSnBlZ0NvbnRleHQgKm07CiAKLSAgICBpbnQgcmV0ID0gZmZfbXB2X3JlYWxsb2NhdGVfcHV0Yml0YnVmZmVyKHMsIHB1dF9iaXRzX2NvdW50KCZzLT5wYikgLyA4ICsgMTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHNfY291bnQoJnMtPnBiKSAvIDQgKyAxMDAwKTsKKyAgICBtID0gcy0+bWpwZWdfY3R4OworCisgICAgaWYgKHMtPmh1ZmZtYW4gPT0gSFVGRk1BTl9UQUJMRV9PUFRJTUFMKSB7CisgICAgICAgIGZmX21qcGVnX2J1aWxkX29wdGltYWxfaHVmZm1hbihtKTsKKworICAgICAgICAvLyBSZXBsYWNlIHRoZSBWTENzIHdpdGggdGhlIG9wdGltYWwgb25lcy4KKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgb25lcyBtYXkgYmUgdXNlZCBmb3IgdHJlbGxpcyBkdXJpbmcgcXVhbnRpemF0aW9uLgorICAgICAgICBmZl9pbml0X3VuaV9hY192bGMobS0+aHVmZl9zaXplX2FjX2x1bWluYW5jZSwgICBtLT51bmlfYWNfdmxjX2xlbik7CisgICAgICAgIGZmX2luaXRfdW5pX2FjX3ZsYyhtLT5odWZmX3NpemVfYWNfY2hyb21pbmFuY2UsIG0tPnVuaV9jaHJvbWFfYWNfdmxjX2xlbik7CisgICAgICAgIHMtPmludHJhX2FjX3ZsY19sZW5ndGggICAgICA9CisgICAgICAgIHMtPmludHJhX2FjX3ZsY19sYXN0X2xlbmd0aCA9IG0tPnVuaV9hY192bGNfbGVuOworICAgICAgICBzLT5pbnRyYV9jaHJvbWFfYWNfdmxjX2xlbmd0aCAgICAgID0KKyAgICAgICAgcy0+aW50cmFfY2hyb21hX2FjX3ZsY19sYXN0X2xlbmd0aCA9IG0tPnVuaV9jaHJvbWFfYWNfdmxjX2xlbjsKKworICAgICAgICBmZl9tanBlZ19lbmNvZGVfcGljdHVyZV9oZWFkZXIocy0+YXZjdHgsICZzLT5wYiwgJnMtPmludHJhX3NjYW50YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByZWQsIHMtPmludHJhX21hdHJpeCwgcy0+Y2hyb21hX2ludHJhX21hdHJpeCk7CisgICAgICAgIGZmX21qcGVnX2VuY29kZV9waWN0dXJlX2ZyYW1lKHMpOworICAgIH0KKworICAgIHJldCA9IGZmX21wdl9yZWFsbG9jYXRlX3B1dGJpdGJ1ZmZlcihzLCBwdXRfYml0c19jb3VudCgmcy0+cGIpIC8gOCArIDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHNfY291bnQoJnMtPnBiKSAvIDQgKyAxMDAwKTsKKwogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQnVmZmVyIHJlYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogICAgICAgICBnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21qcGVnZW5jX2NvbW1vbi5oIGIvbGliYXZjb2RlYy9tanBlZ2VuY19jb21tb24uaAppbmRleCA2ZTUxY2EwLi5lODY5OGQxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21qcGVnZW5jX2NvbW1vbi5oCisrKyBiL2xpYmF2Y29kZWMvbWpwZWdlbmNfY29tbW9uLmgKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW5UYWJsZSAqaW50cmFfc2NhbnRhYmxlLCBpbnQgcHJlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGx1bWFfaW50cmFfbWF0cml4WzY0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNocm9tYV9pbnRyYV9tYXRyaXhbNjRdKTsKK3ZvaWQgZmZfbWpwZWdfZW5jb2RlX3BpY3R1cmVfZnJhbWUoTXBlZ0VuY0NvbnRleHQgKnMpOwogdm9pZCBmZl9tanBlZ19lbmNvZGVfcGljdHVyZV90cmFpbGVyKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgaGVhZGVyX2JpdHMpOwogdm9pZCBmZl9tanBlZ19lc2NhcGVfRkYoUHV0Qml0Q29udGV4dCAqcGIsIGludCBzdGFydCk7CiBpbnQgZmZfbWpwZWdfZW5jb2RlX3N0dWZmaW5nKE1wZWdFbmNDb250ZXh0ICpzKTsKQEAgLTQwLDQgKzQxLDYgQEAKIHZvaWQgZmZfbWpwZWdfZW5jb2RlX2RjKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgdmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaHVmZl9zaXplLCB1aW50MTZfdCAqaHVmZl9jb2RlKTsKIAorYXZfY29sZCB2b2lkIGZmX2luaXRfdW5pX2FjX3ZsYyhjb25zdCB1aW50OF90IGh1ZmZfc2l6ZV9hY1syNTZdLCB1aW50OF90ICp1bmlfYWNfdmxjX2xlbik7CisKICNlbmRpZiAvKiBBVkNPREVDX01KUEVHRU5DX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21qcGVnZW5jX2h1ZmZtYW4uYyBiL2xpYmF2Y29kZWMvbWpwZWdlbmNfaHVmZm1hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjNmODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21qcGVnZW5jX2h1ZmZtYW4uYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIE1KUEVHIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBXaWxsaWFtIE1hLCBUZWQgWWluZywgSmVycnkgSmlhbmcKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcXNvcnQuaCIKKyNpbmNsdWRlICJtanBlZ2VuY19odWZmbWFuLmgiCisKKy8qKgorICogQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgdHdvIFBUYWJsZXMgYnkgcHJvYgorICoKKyAqIEBwYXJhbSBhIEZpcnN0IFBUYWJsZSB0byBjb21wYXJlCisgKiBAcGFyYW0gYiBTZWNvbmQgUFRhYmxlIHRvIGNvbXBhcmUKKyAqIEByZXR1cm4gPCAwIGZvciBsZXNzIHRoYW4sIDAgZm9yIGVxdWFscywgPiAwIGZvciBncmVhdGVyIHRoYW4KKyAqLworc3RhdGljIGludCBjb21wYXJlX2J5X3Byb2IoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBQVGFibGUgYV92YWwgPSAqKFBUYWJsZSAqKSBhOworICAgIFBUYWJsZSBiX3ZhbCA9ICooUFRhYmxlICopIGI7CisgICAgcmV0dXJuIGFfdmFsLnByb2IgLSBiX3ZhbC5wcm9iOworfQorCisvKioKKyAqIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHR3byBIdWZmVGFibGVzIGJ5IGxlbmd0aAorICoKKyAqIEBwYXJhbSBhIEZpcnN0IEh1ZmZUYWJsZSB0byBjb21wYXJlCisgKiBAcGFyYW0gYiBTZWNvbmQgSHVmZlRhYmxlIHRvIGNvbXBhcmUKKyAqIEByZXR1cm4gPCAwIGZvciBsZXNzIHRoYW4sIDAgZm9yIGVxdWFscywgPiAwIGZvciBncmVhdGVyIHRoYW4KKyAqLworc3RhdGljIGludCBjb21wYXJlX2J5X2xlbmd0aChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIEh1ZmZUYWJsZSBhX3ZhbCA9ICooSHVmZlRhYmxlICopIGE7CisgICAgSHVmZlRhYmxlIGJfdmFsID0gKihIdWZmVGFibGUgKikgYjsKKyAgICByZXR1cm4gYV92YWwubGVuZ3RoIC0gYl92YWwubGVuZ3RoOworfQorCisvKioKKyAqIENvbXB1dGVzIHRoZSBsZW5ndGggb2YgdGhlIEh1ZmZtYW4gZW5jb2RpbmcgZm9yIGVhY2ggZGlzdGluY3QgaW5wdXQgdmFsdWUuCisgKiBVc2VzIHBhY2thZ2UgbWVyZ2UgYWxnb3JpdGhtIGFzIGZvbGxvd3M6CisgKiAxLiBzdGFydCB3aXRoIGFuIGVtcHR5IGxpc3QsIGxldHMgY2FsbCBpdCBsaXN0KDApLCBzZXQgaSA9IDAKKyAqIDIuIGFkZCAxIGVudHJ5IHRvIGxpc3QoaSkgZm9yIGVhY2ggc3ltYm9sIHdlIGhhdmUgYW5kIGdpdmUgZWFjaCBhIHNjb3JlIGVxdWFsIHRvIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgcmVzcGVjdGl2ZSBzeW1ib2wKKyAqIDMuIG1lcmdlIHRoZSAyIHN5bWJvbHMgb2YgbGVhc3Qgc2NvcmUgYW5kIHB1dCB0aGVtIGluIGxpc3QoaSsxKSwgYW5kIHJlbW92ZSB0aGVtIGZyb20gbGlzdChpKS4gVGhlIG5ldyBzY29yZSB3aWxsIGJlIHRoZSBzdW0gb2YgdGhlIDIgc2NvcmVzCisgKiA0LiBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gMSBzeW1ib2wgbGVmdCBpbiB0aGUgY3VycmVudCBsaXN0KGkpLCB0aGVuIGdvdG8gMworICogNS4gaSsrCisgKiA2LiBpZiBpIDwgMTYgZ290byAyCisgKiA3LiBzZWxlY3QgdGhlIG4tMSBlbGVtZW50cyBpbiB0aGUgbGFzdCBsaXN0IHdpdGggdGhlIGxvd2VzdCBzY29yZSAobiA9IHRoZSBudW1iZXIgb2Ygc3ltYm9scykKKyAqIDguIHRoZSBsZW5ndGggb2YgdGhlIGh1ZmZtYW4gY29kZSBmb3Igc3ltYm9sIHMgd2lsbCBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzeW1ib2wgb2NjdXJzIGluIHRoZSBzZWxlY3QgZWxlbWVudHMKKyAqIEdvIHRvIGd1cnUubXVsdGltZWRpYS5jeC9zbWFsbC10YXNrcy1mb3ItZmZtcGVnLyBmb3IgbW9yZSBkZXRhaWxzCisgKgorICogQWxsIHByb2JhYmlsaXRpZXMgc2hvdWxkIGJlIHBvc2l0aXZlIGludGVnZXJzLiBUaGUgb3V0cHV0IGlzIHNvcnRlZCBieSBjb2RlLAorICogbm90IGJ5IGxlbmd0aC4KKyAqCisgKiBAcGFyYW0gcHJvYl90YWJsZSBpbnB1dCBhcnJheSBvZiBhIFBUYWJsZSBmb3IgZWFjaCBkaXN0aW5jdCBpbnB1dCB2YWx1ZQorICogQHBhcmFtIGRpc3RpbmN0cyAgb3V0cHV0IGFycmF5IG9mIGEgSHVmZlRhYmxlIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgYnkgdGhpcyBmdW5jdGlvbgorICogQHBhcmFtIHNpemUgICAgICAgc2l6ZSBvZiB0aGUgcHJvYl90YWJsZSBhcnJheQorICogQHBhcmFtIG1heF9sZW5ndGggbWF4IGxlbmd0aCBvZiBhbiBlbmNvZGluZworICovCit2b2lkIGZmX21qcGVnZW5jX2h1ZmZtYW5fY29tcHV0ZV9iaXRzKFBUYWJsZSAqcHJvYl90YWJsZSwgSHVmZlRhYmxlICpkaXN0aW5jdHMsIGludCBzaXplLCBpbnQgbWF4X2xlbmd0aCkKK3sKKyAgICBQYWNrYWdlTWVyZ2VyTGlzdCBsaXN0X2EsIGxpc3RfYiwgKnRvID0gJmxpc3RfYSwgKmZyb20gPSAmbGlzdF9iLCAqdGVtcDsKKworICAgIGludCB0aW1lcywgaSwgaiwgazsKKworICAgIGludCBuYml0c1syNTddID0gezB9OworCisgICAgaW50IG1pbjsKKworICAgIGF2X2Fzc2VydDAobWF4X2xlbmd0aCA+IDApOworCisgICAgdG8tPm5pdGVtcyA9IDA7CisgICAgZnJvbS0+bml0ZW1zID0gMDsKKyAgICB0by0+aXRlbV9pZHhbMF0gPSAwOworICAgIGZyb20tPml0ZW1faWR4WzBdID0gMDsKKyAgICBBVl9RU09SVChwcm9iX3RhYmxlLCBzaXplLCBQVGFibGUsIGNvbXBhcmVfYnlfcHJvYik7CisKKyAgICBmb3IgKHRpbWVzID0gMDsgdGltZXMgPD0gbWF4X2xlbmd0aDsgdGltZXMrKykgeworICAgICAgICB0by0+bml0ZW1zID0gMDsKKyAgICAgICAgdG8tPml0ZW1faWR4WzBdID0gMDsKKworICAgICAgICBqID0gMDsKKyAgICAgICAgayA9IDA7CisKKyAgICAgICAgaWYgKHRpbWVzIDwgbWF4X2xlbmd0aCkgeworICAgICAgICAgICAgaSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGkgPCBzaXplIHx8IGogKyAxIDwgZnJvbS0+bml0ZW1zKSB7CisgICAgICAgICAgICB0by0+bml0ZW1zKys7CisgICAgICAgICAgICB0by0+aXRlbV9pZHhbdG8tPm5pdGVtc10gPSB0by0+aXRlbV9pZHhbdG8tPm5pdGVtcyAtIDFdOworICAgICAgICAgICAgaWYgKGkgPCBzaXplICYmCisgICAgICAgICAgICAgICAgKGogKyAxID49IGZyb20tPm5pdGVtcyB8fAorICAgICAgICAgICAgICAgICBwcm9iX3RhYmxlW2ldLnByb2IgPAorICAgICAgICAgICAgICAgICAgICAgZnJvbS0+cHJvYmFiaWxpdHlbal0gKyBmcm9tLT5wcm9iYWJpbGl0eVtqICsgMV0pKSB7CisgICAgICAgICAgICAgICAgdG8tPml0ZW1zW3RvLT5pdGVtX2lkeFt0by0+bml0ZW1zXSsrXSA9IHByb2JfdGFibGVbaV0udmFsdWU7CisgICAgICAgICAgICAgICAgdG8tPnByb2JhYmlsaXR5W3RvLT5uaXRlbXMgLSAxXSA9IHByb2JfdGFibGVbaV0ucHJvYjsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoayA9IGZyb20tPml0ZW1faWR4W2pdOyBrIDwgZnJvbS0+aXRlbV9pZHhbaiArIDJdOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdG8tPml0ZW1zW3RvLT5pdGVtX2lkeFt0by0+bml0ZW1zXSsrXSA9IGZyb20tPml0ZW1zW2tdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0by0+cHJvYmFiaWxpdHlbdG8tPm5pdGVtcyAtIDFdID0KKyAgICAgICAgICAgICAgICAgICAgZnJvbS0+cHJvYmFiaWxpdHlbal0gKyBmcm9tLT5wcm9iYWJpbGl0eVtqICsgMV07CisgICAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRlbXAgPSB0bzsKKyAgICAgICAgdG8gPSBmcm9tOworICAgICAgICBmcm9tID0gdGVtcDsKKyAgICB9CisKKyAgICBtaW4gPSAoc2l6ZSAtIDEgPCBmcm9tLT5uaXRlbXMpID8gc2l6ZSAtIDEgOiBmcm9tLT5uaXRlbXM7CisgICAgZm9yIChpID0gMDsgaSA8IGZyb20tPml0ZW1faWR4W21pbl07IGkrKykgeworICAgICAgICBuYml0c1tmcm9tLT5pdGVtc1tpXV0rKzsKKyAgICB9CisgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byByZXR1cm4gdGhlIDI1NiBiaXQgY291bnQgKGl0IHdhcyBqdXN0IGluIGhlcmUgdG8gcHJldmVudAorICAgIC8vIGFsbCAxcyBlbmNvZGluZykKKyAgICBqID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgaWYgKG5iaXRzW2ldID4gMCkgeworICAgICAgICAgICAgZGlzdGluY3RzW2pdLmNvZGUgPSBpOworICAgICAgICAgICAgZGlzdGluY3RzW2pdLmxlbmd0aCA9IG5iaXRzW2ldOworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX21qcGVnX2VuY29kZV9odWZmbWFuX2luaXQoTUpwZWdFbmNIdWZmbWFuQ29udGV4dCAqcykKK3sKKyAgICBtZW1zZXQocy0+dmFsX2NvdW50LCAwLCBzaXplb2Yocy0+dmFsX2NvdW50KSk7Cit9CisKKy8qKgorICogUHJvZHVjZXMgYSBIdWZmbWFuIGVuY29kaW5nIHdpdGggYSBnaXZlbiBpbnB1dAorICoKKyAqIEBwYXJhbSBzICAgICAgICAgaW5wdXQgdG8gZW5jb2RlCisgKiBAcGFyYW0gYml0cyAgICAgIG91dHB1dCBhcnJheSB3aGVyZSB0aGUgaXRoIGNoYXJhY3RlciByZXByZXNlbnRzIGhvdyBtYW55IGlucHV0IHZhbHVlcyBoYXZlIGkgbGVuZ3RoIGVuY29kaW5nCisgKiBAcGFyYW0gdmFsICAgICAgIG91dHB1dCBhcnJheSBvZiBpbnB1dCB2YWx1ZXMgc29ydGVkIGJ5IHRoZWlyIGVuY29kZWQgbGVuZ3RoCisgKiBAcGFyYW0gbWF4X252YWwgIG1heGltdW0gbnVtYmVyIG9mIGRpc3RpbmN0IGlucHV0IHZhbHVlcworICovCit2b2lkIGZmX21qcGVnX2VuY29kZV9odWZmbWFuX2Nsb3NlKE1KcGVnRW5jSHVmZm1hbkNvbnRleHQgKnMsIHVpbnQ4X3QgYml0c1sxN10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdmFsW10sIGludCBtYXhfbnZhbCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgbnZhbCA9IDA7CisgICAgUFRhYmxlIHZhbF9jb3VudHNbMjU3XTsKKyAgICBIdWZmVGFibGUgZGlzdGluY3RzWzI1Nl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgaWYgKHMtPnZhbF9jb3VudFtpXSkgbnZhbCsrOworICAgIH0KKyAgICBhdl9hc3NlcnQwIChudmFsIDw9IG1heF9udmFsKTsKKworICAgIGogPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBpZiAocy0+dmFsX2NvdW50W2ldKSB7CisgICAgICAgICAgICB2YWxfY291bnRzW2pdLnZhbHVlID0gaTsKKyAgICAgICAgICAgIHZhbF9jb3VudHNbal0ucHJvYiA9IHMtPnZhbF9jb3VudFtpXTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKyAgICB2YWxfY291bnRzW2pdLnZhbHVlID0gMjU2OworICAgIHZhbF9jb3VudHNbal0ucHJvYiA9IDA7CisgICAgZmZfbWpwZWdlbmNfaHVmZm1hbl9jb21wdXRlX2JpdHModmFsX2NvdW50cywgZGlzdGluY3RzLCBudmFsICsgMSwgMTYpOworICAgIEFWX1FTT1JUKGRpc3RpbmN0cywgbnZhbCwgSHVmZlRhYmxlLCBjb21wYXJlX2J5X2xlbmd0aCk7CisKKyAgICBtZW1zZXQoYml0cywgMCwgc2l6ZW9mKGJpdHNbMF0pICogMTcpOworICAgIGZvciAoaSA9IDA7IGkgPCBudmFsOyBpKyspIHsKKyAgICAgICAgdmFsW2ldID0gZGlzdGluY3RzW2ldLmNvZGU7CisgICAgICAgIGJpdHNbZGlzdGluY3RzW2ldLmxlbmd0aF0rKzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21qcGVnZW5jX2h1ZmZtYW4uaCBiL2xpYmF2Y29kZWMvbWpwZWdlbmNfaHVmZm1hbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTY1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21qcGVnZW5jX2h1ZmZtYW4uaApAQCAtMCwwICsxLDc2IEBACisvKgorICogTUpQRUcgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDE2IFdpbGxpYW0gTWEsIFRlZCBZaW5nLCBKZXJyeSBKaWFuZworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBIdWZmbWFuIHRhYmxlIGdlbmVyYXRpb24gZm9yIE1KUEVHIGVuY29kZXIuCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01KUEVHRU5DX0hVRkZNQU5fSAorI2RlZmluZSBBVkNPREVDX01KUEVHRU5DX0hVRkZNQU5fSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IE1KcGVnRW5jSHVmZm1hbkNvbnRleHQgeworICAgIGludCB2YWxfY291bnRbMjU2XTsKK30gTUpwZWdFbmNIdWZmbWFuQ29udGV4dDsKKworLy8gVXNlcyB0aGUgcGFja2FnZSBtZXJnZSBhbGdvcml0aG0gdG8gY29tcHV0ZSB0aGUgSHVmZm1hbiB0YWJsZS4KK3ZvaWQgZmZfbWpwZWdfZW5jb2RlX2h1ZmZtYW5faW5pdChNSnBlZ0VuY0h1ZmZtYW5Db250ZXh0ICpzKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBmZl9tanBlZ19lbmNvZGVfaHVmZm1hbl9pbmNyZW1lbnQoTUpwZWdFbmNIdWZmbWFuQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2YWwpCit7CisgICAgcy0+dmFsX2NvdW50W3ZhbF0rKzsKK30KK3ZvaWQgZmZfbWpwZWdfZW5jb2RlX2h1ZmZtYW5fY2xvc2UoTUpwZWdFbmNIdWZmbWFuQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiaXRzWzE3XSwgdWludDhfdCB2YWxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9udmFsKTsKKworCisvKioKKyAqIFVzZWQgdG8gYXNzaWduIGEgb2NjdXJyZW5jZSBjb3VudCBvciAicHJvYmFiaWxpdHkiIHRvIGFuIGlucHV0IHZhbHVlCisgKi8KK3R5cGVkZWYgc3RydWN0IFBUYWJsZSB7CisgICAgaW50IHZhbHVlOyAgLy8vPCBpbnB1dCB2YWx1ZQorICAgIGludCBwcm9iOyAgIC8vLzwgbnVtYmVyIG9mIG9jY3VyZW5jZXMgb2YgdGhpcyB2YWx1ZSBpbiBpbnB1dAorfSBQVGFibGU7CisKKy8qKgorICogVXNlZCB0byBzdG9yZSBpbnRlcm1lZGlhdGUgbGlzdHMgaW4gdGhlIHBhY2thZ2UgbWVyZ2UgYWxnb3JpdGhtCisgKi8KK3R5cGVkZWYgc3RydWN0IFBhY2thZ2VNZXJnZXJMaXN0IHsKKyAgICBpbnQgbml0ZW1zOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdCBhbmQgcHJvYmFiaWxpdHkgICAgICBleC4gNAorICAgIGludCBpdGVtX2lkeFs1MTVdOyAgICAgIC8vLzwgaW5kZXggcmFuZ2UgZm9yIGVhY2ggaXRlbSBpbiBpdGVtcyAgICAgICAgICAgICAgICAgICAwLCAyLCA1LCA5LCAxMworICAgIGludCBwcm9iYWJpbGl0eVs1MTRdOyAgIC8vLzwgcHJvYmFiaWxpdHkgb2YgZWFjaCBpdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCA4LCAxOCwgNDYKKyAgICBpbnQgaXRlbXNbMjU3ICogMTZdOyAgICAvLy88IGNoYWluIG9mIGFsbCBpbmRpdmlkdWFsIHZhbHVlcyB0aGF0IG1ha2UgdXAgaXRlbXMgICAgQSwgQiwgQSwgQiwgQywgQSwgQiwgQywgRCwgQywgRCwgRCwgRQorfSBQYWNrYWdlTWVyZ2VyTGlzdDsKKworLyoqCisgKiBVc2VkIHRvIHN0b3JlIG9wdGltYWwgaHVmZm1hbiBlbmNvZGluZyByZXN1bHRzCisgKi8KK3R5cGVkZWYgc3RydWN0IEh1ZmZUYWJsZSB7CisgICAgaW50IGNvZGU7ICAgICAgIC8vLzwgY29kZSBpcyB0aGUgaW5wdXQgdmFsdWUKKyAgICBpbnQgbGVuZ3RoOyAgICAgLy8vPCBsZW5ndGggb2YgdGhlIGVuY29kaW5nCit9IEh1ZmZUYWJsZTsKKwordm9pZCBmZl9tanBlZ2VuY19odWZmbWFuX2NvbXB1dGVfYml0cyhQVGFibGUgKnByb2JfdGFibGUsIEh1ZmZUYWJsZSAqZGlzdGluY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IG1heF9sZW5ndGgpOworI2VuZGlmIC8qIEFWQ09ERUNfTUpQRUdFTkNfSFVGRk1BTl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21scC5jIGIvbGliYXZjb2RlYy9tbHAuYwppbmRleCA4N2Y3Yzc3Li5kZGJhYjYwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21scC5jCisrKyBiL2xpYmF2Y29kZWMvbWxwLmMKQEAgLTQxLDYgKzQxLDI3IEBACiAgICAgfQogfTsKIAorY29uc3QgQ2hhbm5lbEluZm9ybWF0aW9uIGZmX21scF9jaF9pbmZvWzIxXSA9IHsKKyAgICB7IDB4MDEsIDB4MDEsIDB4MDAsIDB4MWYgfSwgeyAweDAzLCAweDAyLCAweDAwLCAweDFiIH0sCisgICAgeyAweDA3LCAweDAyLCAweDAxLCAweDFmIH0sIHsgMHgwRiwgMHgwMiwgMHgwMiwgMHgxOSB9LAorICAgIHsgMHgwNywgMHgwMiwgMHgwMSwgMHgwMyB9LCB7IDB4MEYsIDB4MDIsIDB4MDIsIDB4MWYgfSwKKyAgICB7IDB4MUYsIDB4MDIsIDB4MDMsIDB4MDEgfSwgeyAweDA3LCAweDAyLCAweDAxLCAweDFhIH0sCisgICAgeyAweDBGLCAweDAyLCAweDAyLCAweDFmIH0sIHsgMHgxRiwgMHgwMiwgMHgwMywgMHgxOCB9LAorICAgIHsgMHgwRiwgMHgwMiwgMHgwMiwgMHgwMiB9LCB7IDB4MUYsIDB4MDIsIDB4MDMsIDB4MWYgfSwKKyAgICB7IDB4M0YsIDB4MDIsIDB4MDQsIDB4MDAgfSwgeyAweDBGLCAweDAzLCAweDAxLCAweDFmIH0sCisgICAgeyAweDFGLCAweDAzLCAweDAyLCAweDE4IH0sIHsgMHgwRiwgMHgwMywgMHgwMSwgMHgwMiB9LAorICAgIHsgMHgxRiwgMHgwMywgMHgwMiwgMHgxZiB9LCB7IDB4M0YsIDB4MDMsIDB4MDMsIDB4MDAgfSwKKyAgICB7IDB4MUYsIDB4MDQsIDB4MDEsIDB4MDEgfSwgeyAweDFGLCAweDA0LCAweDAxLCAweDE4IH0sCisgICAgeyAweDNGLCAweDA0LCAweDAyLCAweDAwIH0sCit9OworCitjb25zdCB1aW50NjRfdCBmZl9tbHBfY2hhbm5lbF9sYXlvdXRzWzEyXSA9IHsKKyAgICBBVl9DSF9MQVlPVVRfTU9OTywgQVZfQ0hfTEFZT1VUX1NURVJFTywgQVZfQ0hfTEFZT1VUXzJfMSwKKyAgICBBVl9DSF9MQVlPVVRfUVVBRCwgQVZfQ0hfTEFZT1VUXzJQT0lOVDEsIEFWX0NIX0xBWU9VVF9TVVJST1VORCwKKyAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCwgQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSywgQVZfQ0hfTEFZT1VUXzNQT0lOVDEsCisgICAgQVZfQ0hfTEFZT1VUXzRQT0lOVDEsIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0ssIDAsCit9OworCiBzdGF0aWMgaW50IGNyY19pbml0ID0gMDsKICNpZiBDT05GSUdfU01BTEwKICNkZWZpbmUgQ1JDX1RBQkxFX1NJWkUgMjU3CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21scC5oIGIvbGliYXZjb2RlYy9tbHAuaAppbmRleCAwNWQ4ZGJhLi40MWE0NWEzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21scC5oCisrKyBiL2xpYmF2Y29kZWMvbWxwLmgKQEAgLTc2LDYgKzc2LDkgQEAKICAgICB1aW50OF90ICAgICBzaGlmdDsgLy8vPCBSaWdodCBzaGlmdCB0byBhcHBseSB0byBvdXRwdXQgb2YgZmlsdGVyLgogCiAgICAgaW50MzJfdCAgICAgc3RhdGVbTUFYX0ZJUl9PUkRFUl07CisKKyAgICBpbnQgY29lZmZfYml0czsKKyAgICBpbnQgY29lZmZfc2hpZnQ7CiB9IEZpbHRlclBhcmFtczsKIAogLyoqIHNhbXBsZSBkYXRhIGNvZGluZyBpbmZvcm1hdGlvbiAqLwpAQCAtOTYsNiArOTksNDMgQEAKICAqLwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfbWxwX2h1ZmZtYW5fdGFibGVzWzNdWzE4XVsyXTsKIAordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgY2hhbm5lbF9vY2N1cGFuY3k7CisgICAgdWludDhfdCBncm91cDFfY2hhbm5lbHM7CisgICAgdWludDhfdCBncm91cDJfY2hhbm5lbHM7CisgICAgdWludDhfdCBzdW1tYXJ5X2luZm87Cit9IENoYW5uZWxJbmZvcm1hdGlvbjsKKworLyoqIFRhYmxlcyBkZWZpbmluZyBjaGFubmVsIGluZm9ybWF0aW9uLgorICoKKyAqICBQb3NzaWJsZSBjaGFubmVsIGFycmFuZ2VtZW50cyBhcmU6CisgKgorICogIChHcm91cCAxKSAgIEMKKyAqICAoR3JvdXAgMSkgICBMLCAgUgorICogIChHcm91cCAxKSAgIExmLCBSZiAgICAgICAgICAvICAoR3JvdXAgMikgICBTCisgKiAgKEdyb3VwIDEpICAgTGYsIFJmICAgICAgICAgIC8gIChHcm91cCAyKSAgIExzLCBScworICogIChHcm91cCAxKSAgIExmLCBSZiAgICAgICAgICAvICAoR3JvdXAgMikgICBMRkUKKyAqICAoR3JvdXAgMSkgICBMZiwgUmYgICAgICAgICAgLyAgKEdyb3VwIDIpICAgTEZFLCBTCisgKiAgKEdyb3VwIDEpICAgTGYsIFJmICAgICAgICAgIC8gIChHcm91cCAyKSAgIExGRSwgTHMsIFJzCisgKiAgKEdyb3VwIDEpICAgTGYsIFJmICAgICAgICAgIC8gIChHcm91cCAyKSAgIEMKKyAqICAoR3JvdXAgMSkgICBMZiwgUmYgICAgICAgICAgLyAgKEdyb3VwIDIpICAgQywgUworICogIChHcm91cCAxKSAgIExmLCBSZiAgICAgICAgICAvICAoR3JvdXAgMikgICBDLCBMcywgUnMKKyAqICAoR3JvdXAgMSkgICBMZiwgUmYgICAgICAgICAgLyAgKEdyb3VwIDIpICAgQywgTEZFCisgKiAgKEdyb3VwIDEpICAgTGYsIFJmICAgICAgICAgIC8gIChHcm91cCAyKSAgIEMsIExGRSwgUworICogIChHcm91cCAxKSAgIExmLCBSZiAgICAgICAgICAvICAoR3JvdXAgMikgICBDLCBMRkUsIExzLCAgUnMKKyAqICAoR3JvdXAgMSkgICBMZiwgUmYgIEMgICAgICAgLyAgKEdyb3VwIDIpICAgUworICogIChHcm91cCAxKSAgIExmLCBSZiAgQyAgICAgICAvICAoR3JvdXAgMikgICBMcywgUnMKKyAqICAoR3JvdXAgMSkgICBMZiwgUmYgIEMgICAgICAgLyAgKEdyb3VwIDIpICAgTEZFCisgKiAgKEdyb3VwIDEpICAgTGYsIFJmICBDICAgICAgIC8gIChHcm91cCAyKSAgIExGRSwgUworICogIChHcm91cCAxKSAgIExmLCBSZiAgQyAgICAgICAvICAoR3JvdXAgMikgICBMRkUsIExzLCBScworICogIChHcm91cCAxKSAgIExmLCBSZiAgTHMgIFJzICAvICAoR3JvdXAgMikgICBMRkUKKyAqICAoR3JvdXAgMSkgICBMZiwgUmYgIExzICBScyAgLyAgKEdyb3VwIDIpICAgQworICogIChHcm91cCAxKSAgIExmLCBSZiwgTHMsIFJzICAvICAoR3JvdXAgMikgICBDLCBMRkUKKyAqLworZXh0ZXJuIGNvbnN0IENoYW5uZWxJbmZvcm1hdGlvbiBmZl9tbHBfY2hfaW5mb1syMV07CisKK2V4dGVybiBjb25zdCB1aW50NjRfdCBmZl9tbHBfY2hhbm5lbF9sYXlvdXRzWzEyXTsKKwogLyoqIE1MUCB1c2VzIGNoZWNrc3VtcyB0aGF0IHNlZW0gdG8gYmUgYmFzZWQgb24gdGhlIHN0YW5kYXJkIENSQyBhbGdvcml0aG0sIGJ1dAogICogIGFyZSBub3QgKGluIGltcGxlbWVudGF0aW9uIHRlcm1zLCB0aGUgdGFibGUgbG9va3VwIGFuZCBYT1IgYXJlIHJldmVyc2VkKS4KICAqICBXZSBjYW4gaW1wbGVtZW50IHRoaXMgYmVoYXZpb3IgdXNpbmcgYSBzdGFuZGFyZCBhdl9jcmMgb24gYWxsIGJ1dCB0aGUKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWxwX3BhcnNlci5jIGIvbGliYXZjb2RlYy9tbHBfcGFyc2VyLmMKaW5kZXggMjM2MDFjOC4uZWIzNDM1YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tbHBfcGFyc2VyLmMKKysrIGIvbGliYXZjb2RlYy9tbHBfcGFyc2VyLmMKQEAgLTExOSw3ICsxMTksNyBAQAogICAgIHJldHVybiBsYXlvdXQ7CiB9CiAKLXN0YXRpYyBpbnQgZmZfbWxwX2dldF9tYWpvcl9zeW5jX3NpemUoY29uc3QgdWludDhfdCAqIGJ1ZiwgaW50IGJ1ZnNpemUpCitzdGF0aWMgaW50IG1scF9nZXRfbWFqb3Jfc3luY19zaXplKGNvbnN0IHVpbnQ4X3QgKiBidWYsIGludCBidWZzaXplKQogewogICAgIGludCBoYXNfZXh0ZW5zaW9uLCBleHRlbnNpb25zID0gMDsKICAgICBpbnQgc2l6ZSA9IDI4OwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAKICAgICBhdl9hc3NlcnQxKGdldF9iaXRzX2NvdW50KGdiKSA9PSAwKTsKIAotICAgIGhlYWRlcl9zaXplID0gZmZfbWxwX2dldF9tYWpvcl9zeW5jX3NpemUoZ2ItPmJ1ZmZlciwgZ2ItPnNpemVfaW5fYml0cyA+PiAzKTsKKyAgICBoZWFkZXJfc2l6ZSA9IG1scF9nZXRfbWFqb3Jfc3luY19zaXplKGdiLT5idWZmZXIsIGdiLT5zaXplX2luX2JpdHMgPj4gMyk7CiAgICAgaWYgKGhlYWRlcl9zaXplIDwgMCB8fCBnYi0+c2l6ZV9pbl9iaXRzIDwgaGVhZGVyX3NpemUgPDwgMykgewogICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfRVJST1IsICJwYWNrZXQgdG9vIHNob3J0LCB1bmFibGUgdG8gcmVhZCBtYWpvciBzeW5jXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjU2LDY3ICsyNTYsNzEgQEAKICAgICBpZiAoYnVmX3NpemUgPT0gMCkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoIW1wLT5pbl9zeW5jKSB7Ci0gICAgICAgIC8vIE5vdCBpbiBzeW5jIC0gZmluZCBhIG1ham9yIHN5bmMgaGVhZGVyCi0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zl9zaXplOyBpKyspIHsKLSAgICAgICAgICAgIG1wLT5wYy5zdGF0ZSA9IChtcC0+cGMuc3RhdGUgPDwgOCkgfCBidWZbaV07Ci0gICAgICAgICAgICBpZiAoKG1wLT5wYy5zdGF0ZSAmIDB4ZmZmZmZmZmUpID09IDB4Zjg3MjZmYmEgJiYKLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgaWYgd2UgZG8gbm90IGhhdmUgdGhlIGRhdGEgZm9yIHRoZSBzdGFydCBvZiBoZWFkZXIKLSAgICAgICAgICAgICAgICBtcC0+cGMuaW5kZXggKyBpID49IDcpIHsKLSAgICAgICAgICAgICAgICBtcC0+aW5fc3luYyA9IDE7Ci0gICAgICAgICAgICAgICAgbXAtPmJ5dGVzX2xlZnQgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICBpZiAocy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVMpIHsKKyAgICAgICAgbmV4dCA9IGJ1Zl9zaXplOworICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghbXAtPmluX3N5bmMpIHsKLSAgICAgICAgICAgIGlmIChmZl9jb21iaW5lX2ZyYW1lKCZtcC0+cGMsIEVORF9OT1RfRk9VTkQsICZidWYsICZidWZfc2l6ZSkgIT0gLTEpCisgICAgICAgICAgICAvLyBOb3QgaW4gc3luYyAtIGZpbmQgYSBtYWpvciBzeW5jIGhlYWRlcgorCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgIG1wLT5wYy5zdGF0ZSA9IChtcC0+cGMuc3RhdGUgPDwgOCkgfCBidWZbaV07CisgICAgICAgICAgICAgICAgaWYgKChtcC0+cGMuc3RhdGUgJiAweGZmZmZmZmZlKSA9PSAweGY4NzI2ZmJhICYmCisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB3ZSBkbyBub3QgaGF2ZSB0aGUgZGF0YSBmb3IgdGhlIHN0YXJ0IG9mIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICBtcC0+cGMuaW5kZXggKyBpID49IDcpIHsKKyAgICAgICAgICAgICAgICAgICAgbXAtPmluX3N5bmMgPSAxOworICAgICAgICAgICAgICAgICAgICBtcC0+Ynl0ZXNfbGVmdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtcC0+aW5fc3luYykgeworICAgICAgICAgICAgICAgIGlmIChmZl9jb21iaW5lX2ZyYW1lKCZtcC0+cGMsIEVORF9OT1RfRk9VTkQsICZidWYsICZidWZfc2l6ZSkgIT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJmZl9jb21iaW5lX2ZyYW1lIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2NvbWJpbmVfZnJhbWUoJm1wLT5wYywgaSAtIDcsICZidWYsICZidWZfc2l6ZSkpIDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJmZl9jb21iaW5lX2ZyYW1lIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGkgLSA3OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1wLT5ieXRlc19sZWZ0ID09IDApIHsKKyAgICAgICAgICAgIC8vIEZpbmQgbGVuZ3RoIG9mIHRoaXMgcGFja2V0CisKKyAgICAgICAgICAgIC8qIENvcHkgb3ZlcnJlYWQgYnl0ZXMgZnJvbSBsYXN0IGZyYW1lIGludG8gYnVmZmVyLiAqLworICAgICAgICAgICAgZm9yKDsgbXAtPnBjLm92ZXJyZWFkPjA7IG1wLT5wYy5vdmVycmVhZC0tKSB7CisgICAgICAgICAgICAgICAgbXAtPnBjLmJ1ZmZlclttcC0+cGMuaW5kZXgrK109IG1wLT5wYy5idWZmZXJbbXAtPnBjLm92ZXJyZWFkX2luZGV4KytdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXAtPnBjLmluZGV4ICsgYnVmX3NpemUgPCAyKSB7CisgICAgICAgICAgICAgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUoJm1wLT5wYywgRU5EX05PVF9GT1VORCwgJmJ1ZiwgJmJ1Zl9zaXplKSAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImZmX2NvbWJpbmVfZnJhbWUgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1wLT5ieXRlc19sZWZ0ID0gKChtcC0+cGMuaW5kZXggPiAwID8gbXAtPnBjLmJ1ZmZlclswXSA6IGJ1ZlswXSkgPDwgOCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIChtcC0+cGMuaW5kZXggPiAxID8gbXAtPnBjLmJ1ZmZlclsxXSA6IGJ1ZlsxLW1wLT5wYy5pbmRleF0pOworICAgICAgICAgICAgbXAtPmJ5dGVzX2xlZnQgPSAobXAtPmJ5dGVzX2xlZnQgJiAweGZmZikgKiAyOworICAgICAgICAgICAgaWYgKG1wLT5ieXRlc19sZWZ0IDw9IDApIHsgLy8gcHJldmVudCBpbmZpbml0ZSBsb29wCisgICAgICAgICAgICAgICAgZ290byBsb3N0X3N5bmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtcC0+Ynl0ZXNfbGVmdCAtPSBtcC0+cGMuaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBuZXh0ID0gKG1wLT5ieXRlc19sZWZ0ID4gYnVmX3NpemUpID8gRU5EX05PVF9GT1VORCA6IG1wLT5ieXRlc19sZWZ0OworCisgICAgICAgIGlmIChmZl9jb21iaW5lX2ZyYW1lKCZtcC0+cGMsIG5leHQsICZidWYsICZidWZfc2l6ZSkgPCAwKSB7CisgICAgICAgICAgICBtcC0+Ynl0ZXNfbGVmdCAtPSBidWZfc2l6ZTsKICAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICgocmV0ID0gZmZfY29tYmluZV9mcmFtZSgmbXAtPnBjLCBpIC0gNywgJmJ1ZiwgJmJ1Zl9zaXplKSkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZmZfY29tYmluZV9mcmFtZSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpIC0gNzsKKyAgICAgICAgbXAtPmJ5dGVzX2xlZnQgPSAwOwogICAgIH0KIAotICAgIGlmIChtcC0+Ynl0ZXNfbGVmdCA9PSAwKSB7Ci0gICAgICAgIC8vIEZpbmQgbGVuZ3RoIG9mIHRoaXMgcGFja2V0Ci0KLSAgICAgICAgLyogQ29weSBvdmVycmVhZCBieXRlcyBmcm9tIGxhc3QgZnJhbWUgaW50byBidWZmZXIuICovCi0gICAgICAgIGZvcig7IG1wLT5wYy5vdmVycmVhZD4wOyBtcC0+cGMub3ZlcnJlYWQtLSkgewotICAgICAgICAgICAgbXAtPnBjLmJ1ZmZlclttcC0+cGMuaW5kZXgrK109IG1wLT5wYy5idWZmZXJbbXAtPnBjLm92ZXJyZWFkX2luZGV4KytdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1wLT5wYy5pbmRleCArIGJ1Zl9zaXplIDwgMikgewotICAgICAgICAgICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUoJm1wLT5wYywgRU5EX05PVF9GT1VORCwgJmJ1ZiwgJmJ1Zl9zaXplKSAhPSAtMSkKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZmZfY29tYmluZV9mcmFtZSBmYWlsZWRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgbXAtPmJ5dGVzX2xlZnQgPSAoKG1wLT5wYy5pbmRleCA+IDAgPyBtcC0+cGMuYnVmZmVyWzBdIDogYnVmWzBdKSA8PCA4KQotICAgICAgICAgICAgICAgICAgICAgICB8ICAobXAtPnBjLmluZGV4ID4gMSA/IG1wLT5wYy5idWZmZXJbMV0gOiBidWZbMS1tcC0+cGMuaW5kZXhdKTsKLSAgICAgICAgbXAtPmJ5dGVzX2xlZnQgPSAobXAtPmJ5dGVzX2xlZnQgJiAweGZmZikgKiAyOwotICAgICAgICBpZiAobXAtPmJ5dGVzX2xlZnQgPD0gMCkgeyAvLyBwcmV2ZW50IGluZmluaXRlIGxvb3AKLSAgICAgICAgICAgIGdvdG8gbG9zdF9zeW5jOwotICAgICAgICB9Ci0gICAgICAgIG1wLT5ieXRlc19sZWZ0IC09IG1wLT5wYy5pbmRleDsKLSAgICB9Ci0KLSAgICBuZXh0ID0gKG1wLT5ieXRlc19sZWZ0ID4gYnVmX3NpemUpID8gRU5EX05PVF9GT1VORCA6IG1wLT5ieXRlc19sZWZ0OwotCi0gICAgaWYgKGZmX2NvbWJpbmVfZnJhbWUoJm1wLT5wYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKLSAgICAgICAgbXAtPmJ5dGVzX2xlZnQgLT0gYnVmX3NpemU7Ci0gICAgICAgIHJldHVybiBidWZfc2l6ZTsKLSAgICB9Ci0KLSAgICBtcC0+Ynl0ZXNfbGVmdCA9IDA7Ci0KLSAgICBzeW5jX3ByZXNlbnQgPSAoQVZfUkIzMihidWYgKyA0KSAmIDB4ZmZmZmZmZmUpID09IDB4Zjg3MjZmYmE7CisgICAgc3luY19wcmVzZW50ID0gYnVmX3NpemUgPj0gOCAmJiAoQVZfUkIzMihidWYgKyA0KSAmIDB4ZmZmZmZmZmUpID09IDB4Zjg3MjZmYmE7CiAKICAgICBpZiAoIXN5bmNfcHJlc2VudCkgewogICAgICAgICAvKiBUaGUgZmlyc3QgbmliYmxlIG9mIGEgZnJhbWUgaXMgYSBwYXJpdHkgY2hlY2sgb2YgdGhlIDQtYnl0ZQpAQCAtMzU3LDI4ICszNjEsMTEgQEAKICAgICAgICAgaWYoIWF2Y3R4LT5jaGFubmVscyB8fCAhYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSB7CiAgICAgICAgIGlmIChtaC5zdHJlYW1fdHlwZSA9PSAweGJiKSB7CiAgICAgICAgICAgICAvKiBNTFAgc3RyZWFtICovCi0gICAgICAgICAgICBpZiAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiYKLSAgICAgICAgICAgICAgICAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiBBVl9DSF9MQVlPVVRfU1RFUkVPKSA9PQotICAgICAgICAgICAgICAgIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ICYmCi0gICAgICAgICAgICAgICAgbWgubnVtX3N1YnN0cmVhbXMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgICAgICAgPSBtaC5jaGFubmVsc19tbHA7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gbWguY2hhbm5lbF9sYXlvdXRfbWxwOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gbWguY2hhbm5lbHNfbWxwOworICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gbWguY2hhbm5lbF9sYXlvdXRfbWxwOwogICAgICAgICB9IGVsc2UgeyAvKiBtaC5zdHJlYW1fdHlwZSA9PSAweGJhICovCiAgICAgICAgICAgICAvKiBUcnVlSEQgc3RyZWFtICovCi0gICAgICAgICAgICBpZiAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiYKLSAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ICYgQVZfQ0hfTEFZT1VUX1NURVJFTykgPT0KLSAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiYKLSAgICAgICAgICAgICAgICAgICAgbWgubnVtX3N1YnN0cmVhbXMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbWguY2hhbm5lbHNfdGhkX3N0cmVhbTIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiBtaC5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMSkgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0KSkgeworICAgICAgICAgICAgaWYgKCFtaC5jaGFubmVsc190aGRfc3RyZWFtMikgewogICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyAgICAgICA9IG1oLmNoYW5uZWxzX3RoZF9zdHJlYW0xOwogICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0xOwogICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWxwX3BhcnNlci5oIGIvbGliYXZjb2RlYy9tbHBfcGFyc2VyLmgKaW5kZXggMGMwMTA5ZS4uYzVhMjg4MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tbHBfcGFyc2VyLmgKKysrIGIvbGliYXZjb2RlYy9tbHBfcGFyc2VyLmgKQEAgLTQyLDkgKzQyLDkgQEAKIAogICAgIGludCBjaGFubmVsX2FycmFuZ2VtZW50OwogCi0gICAgaW50IGNoYW5uZWxfbW9kaWZpZXJfdGhkX3N0cmVhbTA7ICAgICAgIC8vLzwgQ2hhbm5lbCBtb2RpZmllciBmb3Igc3Vic3RyZWFtIDAgb2YgVHJ1ZUhEIHNyZWFtcyAoIjItY2hhbm5lbCBwcmVzZW50YXRpb24iKQotICAgIGludCBjaGFubmVsX21vZGlmaWVyX3RoZF9zdHJlYW0xOyAgICAgICAvLy88IENoYW5uZWwgbW9kaWZpZXIgZm9yIHN1YnN0cmVhbSAxIG9mIFRydWVIRCBzcmVhbXMgKCI2LWNoYW5uZWwgcHJlc2VudGF0aW9uIikKLSAgICBpbnQgY2hhbm5lbF9tb2RpZmllcl90aGRfc3RyZWFtMjsgICAgICAgLy8vPCBDaGFubmVsIG1vZGlmaWVyIGZvciBzdWJzdHJlYW0gMiBvZiBUcnVlSEQgc3JlYW1zICgiOC1jaGFubmVsIHByZXNlbnRhdGlvbiIpCisgICAgaW50IGNoYW5uZWxfbW9kaWZpZXJfdGhkX3N0cmVhbTA7ICAgICAgIC8vLzwgQ2hhbm5lbCBtb2RpZmllciBmb3Igc3Vic3RyZWFtIDAgb2YgVHJ1ZUhEIHN0cmVhbXMgKCIyLWNoYW5uZWwgcHJlc2VudGF0aW9uIikKKyAgICBpbnQgY2hhbm5lbF9tb2RpZmllcl90aGRfc3RyZWFtMTsgICAgICAgLy8vPCBDaGFubmVsIG1vZGlmaWVyIGZvciBzdWJzdHJlYW0gMSBvZiBUcnVlSEQgc3RyZWFtcyAoIjYtY2hhbm5lbCBwcmVzZW50YXRpb24iKQorICAgIGludCBjaGFubmVsX21vZGlmaWVyX3RoZF9zdHJlYW0yOyAgICAgICAvLy88IENoYW5uZWwgbW9kaWZpZXIgZm9yIHN1YnN0cmVhbSAyIG9mIFRydWVIRCBzdHJlYW1zICgiOC1jaGFubmVsIHByZXNlbnRhdGlvbiIpCiAKICAgICBpbnQgY2hhbm5lbHNfbWxwOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBDaGFubmVsIGNvdW50IGZvciBNTFAgc3RyZWFtcwogICAgIGludCBjaGFubmVsc190aGRfc3RyZWFtMTsgICAgICAgICAgICAgICAvLy88IENoYW5uZWwgY291bnQgZm9yIHN1YnN0cmVhbSAxIG9mIFRydWVIRCBzdHJlYW1zICgiNi1jaGFubmVsIHByZXNlbnRhdGlvbiIpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21scGRlYy5jIGIvbGliYXZjb2RlYy9tbHBkZWMuYwppbmRleCBjOTNiMDU4Li4zMTM5YTAxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21scGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvbWxwZGVjLmMKQEAgLTY2LDcgKzY2LDcgQEAKICAgICAvLy8gRm9yIGVhY2ggY2hhbm5lbCBvdXRwdXQgYnkgdGhlIG1hdHJpeCwgdGhlIG91dHB1dCBjaGFubmVsIHRvIG1hcCBpdCB0bwogICAgIHVpbnQ4X3QgICAgIGNoX2Fzc2lnbltNQVhfQ0hBTk5FTFNdOwogICAgIC8vLyBUaGUgY2hhbm5lbCBsYXlvdXQgZm9yIHRoaXMgc3Vic3RyZWFtCi0gICAgdWludDY0X3QgICAgY2hfbGF5b3V0OworICAgIHVpbnQ2NF90ICAgIG1hc2s7CiAgICAgLy8vIFRoZSBtYXRyaXggZW5jb2RpbmcgbW9kZSBmb3IgdGhpcyBzdWJzdHJlYW0KICAgICBlbnVtIEFWTWF0cml4RW5jb2RpbmcgbWF0cml4X2VuY29kaW5nOwogCkBAIC0xODAsNiArMTgwLDExIEBACiAgICAgQVZfQ0hfTE9XX0ZSRVFVRU5DWV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTEZFMgogfTsKIAorc3RhdGljIGludCBtbHBfY2hhbm5lbF9sYXlvdXRfc3Vic2V0KHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0LCB1aW50NjRfdCBtYXNrKQoreworICAgIHJldHVybiBjaGFubmVsX2xheW91dCAmJiAoKGNoYW5uZWxfbGF5b3V0ICYgbWFzaykgPT0gY2hhbm5lbF9sYXlvdXQpOworfQorCiBzdGF0aWMgdWludDY0X3QgdGhkX2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbCh1aW50NjRfdCBjaGFubmVsX2xheW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkKIHsKQEAgLTI2NCw3ICsyNjksNyBAQAogICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCBsc2JfYml0cykgKyBnZXRfYml0cyhnYnAsIGxzYl9iaXRzKTsKIAogICAgICAgICByZXN1bHQgICs9IGNwLT5zaWduX2h1ZmZfb2Zmc2V0OwotICAgICAgICByZXN1bHQgPDw9IHF1YW50X3N0ZXBfc2l6ZTsKKyAgICAgICAgcmVzdWx0ICo9IDEgPDwgcXVhbnRfc3RlcF9zaXplOwogCiAgICAgICAgIG0tPnNhbXBsZV9idWZmZXJbcG9zICsgcy0+YmxvY2twb3NdW2NoYW5uZWxdID0gcmVzdWx0OwogICAgIH0KQEAgLTM5MCw4ICszOTUsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9CiAgICAgICAgIGlmICgoc3Vic3RyID0gKG1oLm51bV9zdWJzdHJlYW1zID4gMSkpKQotICAgICAgICAgICAgbS0+c3Vic3RyZWFtWzBdLmNoX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87Ci0gICAgICAgIG0tPnN1YnN0cmVhbVtzdWJzdHJdLmNoX2xheW91dCA9IG1oLmNoYW5uZWxfbGF5b3V0X21scDsKKyAgICAgICAgICAgIG0tPnN1YnN0cmVhbVswXS5tYXNrID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgbS0+c3Vic3RyZWFtW3N1YnN0cl0ubWFzayA9IG1oLmNoYW5uZWxfbGF5b3V0X21scDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAobWguc3RyZWFtX3R5cGUgIT0gMHhiYSkgewogICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKG0tPmF2Y3R4LApAQCAtNDAwLDE1ICs0MDUsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgfQogICAgICAgICBpZiAoKHN1YnN0ciA9IChtaC5udW1fc3Vic3RyZWFtcyA+IDEpKSkKLSAgICAgICAgICAgIG0tPnN1YnN0cmVhbVswXS5jaF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgbS0+c3Vic3RyZWFtWzBdLm1hc2sgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwogICAgICAgICBpZiAobWgubnVtX3N1YnN0cmVhbXMgPiAyKQogICAgICAgICAgICAgaWYgKG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0yKQotICAgICAgICAgICAgICAgIG0tPnN1YnN0cmVhbVsyXS5jaF9sYXlvdXQgPSBtaC5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMjsKKyAgICAgICAgICAgICAgICBtLT5zdWJzdHJlYW1bMl0ubWFzayA9IG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0yOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG0tPnN1YnN0cmVhbVsyXS5jaF9sYXlvdXQgPSBtaC5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMTsKLSAgICAgICAgbS0+c3Vic3RyZWFtW3N1YnN0cl0uY2hfbGF5b3V0ID0gbWguY2hhbm5lbF9sYXlvdXRfdGhkX3N0cmVhbTE7CisgICAgICAgICAgICAgICAgbS0+c3Vic3RyZWFtWzJdLm1hc2sgPSBtaC5jaGFubmVsX2xheW91dF90aGRfc3RyZWFtMTsKKyAgICAgICAgbS0+c3Vic3RyZWFtW3N1YnN0cl0ubWFzayA9IG1oLmNoYW5uZWxfbGF5b3V0X3RoZF9zdHJlYW0xOwogCi0gICAgICAgIGlmIChtLT5hdmN0eC0+Y2hhbm5lbHM8PTIgJiYgbS0+c3Vic3RyZWFtW3N1YnN0cl0uY2hfbGF5b3V0ID09IEFWX0NIX0xBWU9VVF9NT05PICYmIG0tPm1heF9kZWNvZGVkX3N1YnN0cmVhbSA9PSAxKSB7CisgICAgICAgIGlmIChtLT5hdmN0eC0+Y2hhbm5lbHM8PTIgJiYgbS0+c3Vic3RyZWFtW3N1YnN0cl0ubWFzayA9PSBBVl9DSF9MQVlPVVRfTU9OTyAmJiBtLT5tYXhfZGVjb2RlZF9zdWJzdHJlYW0gPT0gMSkgewogICAgICAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJNb25vIHN0cmVhbSB3aXRoIDIgc3Vic3RyZWFtcywgaWdub3JpbmcgMm5kXG4iKTsKICAgICAgICAgICAgIG0tPm1heF9kZWNvZGVkX3N1YnN0cmVhbSA9IDA7CiAgICAgICAgICAgICBpZiAobS0+YXZjdHgtPmNoYW5uZWxzPT0yKQpAQCAtNDc0LDcgKzQ3OSw3IEBACiAgICAgdWludDhfdCBjaGVja3N1bTsKICAgICB1aW50OF90IGxvc3NsZXNzX2NoZWNrOwogICAgIGludCBzdGFydF9jb3VudCA9IGdldF9iaXRzX2NvdW50KGdicCk7Ci0gICAgaW50IG1pbl9jaGFubmVsLCBtYXhfY2hhbm5lbCwgbWF4X21hdHJpeF9jaGFubmVsOworICAgIGludCBtaW5fY2hhbm5lbCwgbWF4X2NoYW5uZWwsIG1heF9tYXRyaXhfY2hhbm5lbCwgbm9pc2VfdHlwZTsKICAgICBjb25zdCBpbnQgc3RkX21heF9tYXRyaXhfY2hhbm5lbCA9IG0tPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NTFAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1BWF9NQVRSSVhfQ0hBTk5FTF9NTFAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1BWF9NQVRSSVhfQ0hBTk5FTF9UUlVFSEQ7CkBAIC00ODcsOSArNDkyLDkgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgcy0+bm9pc2VfdHlwZSA9IGdldF9iaXRzMShnYnApOworICAgIG5vaXNlX3R5cGUgPSBnZXRfYml0czEoZ2JwKTsKIAotICAgIGlmIChtLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUxQICYmIHMtPm5vaXNlX3R5cGUpIHsKKyAgICBpZiAobS0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01MUCAmJiBub2lzZV90eXBlKSB7CiAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTUxQIG11c3QgaGF2ZSAweDMxZWEgc3luYyB3b3JkLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KQEAgLTUxNSw3ICs1MjAsNyBAQAogCiAgICAgLyogVGhpcyBzaG91bGQgaGFwcGVuIGZvciBUcnVlSEQgc3RyZWFtcyB3aXRoID42IGNoYW5uZWxzIGFuZCBNTFAncyBub2lzZQogICAgICAqIHR5cGUuIEl0IGlzIG5vdCB5ZXQga25vd24gaWYgdGhpcyBpcyBhbGxvd2VkLiAqLwotICAgIGlmIChtYXhfY2hhbm5lbCA+IE1BWF9NQVRSSVhfQ0hBTk5FTF9NTFAgJiYgIXMtPm5vaXNlX3R5cGUpIHsKKyAgICBpZiAobWF4X2NoYW5uZWwgPiBNQVhfTUFUUklYX0NIQU5ORUxfTUxQICYmICFub2lzZV90eXBlKSB7CiAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShtLT5hdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBjaGFubmVscyAobW9yZSB0aGFuIHRoZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4aW11bSBzdXBwb3J0ZWQgYnkgdGhlIGRlY29kZXIpIiwKQEAgLTUzMiwxMyArNTM3LDE0IEBACiAgICAgcy0+bWluX2NoYW5uZWwgICAgICAgID0gbWluX2NoYW5uZWw7CiAgICAgcy0+bWF4X2NoYW5uZWwgICAgICAgID0gbWF4X2NoYW5uZWw7CiAgICAgcy0+bWF4X21hdHJpeF9jaGFubmVsID0gbWF4X21hdHJpeF9jaGFubmVsOworICAgIHMtPm5vaXNlX3R5cGUgICAgICAgICA9IG5vaXNlX3R5cGU7CiAKLSAgICBpZiAobS0+YXZjdHgtPnJlcXVlc3RfY2hhbm5lbF9sYXlvdXQgJiYgKHMtPmNoX2xheW91dCAmIG0tPmF2Y3R4LT5yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0KSA9PQotICAgICAgICBtLT5hdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCAmJiBtLT5tYXhfZGVjb2RlZF9zdWJzdHJlYW0gPiBzdWJzdHIpIHsKKyAgICBpZiAobWxwX2NoYW5uZWxfbGF5b3V0X3N1YnNldChtLT5hdmN0eC0+cmVxdWVzdF9jaGFubmVsX2xheW91dCwgcy0+bWFzaykgJiYKKyAgICAgICAgbS0+bWF4X2RlY29kZWRfc3Vic3RyZWFtID4gc3Vic3RyKSB7CiAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAogICAgICAgICAgICAgICAgIkV4dHJhY3RpbmcgJWQtY2hhbm5lbCBkb3dubWl4ICgweCUiUFJJeDY0IikgZnJvbSBzdWJzdHJlYW0gJWQuICIKICAgICAgICAgICAgICAgICJGdXJ0aGVyIHN1YnN0cmVhbXMgd2lsbCBiZSBza2lwcGVkLlxuIiwKLSAgICAgICAgICAgICAgIHMtPm1heF9jaGFubmVsICsgMSwgcy0+Y2hfbGF5b3V0LCBzdWJzdHIpOworICAgICAgICAgICAgICAgcy0+bWF4X2NoYW5uZWwgKyAxLCBzLT5tYXNrLCBzdWJzdHIpOwogICAgICAgICBtLT5tYXhfZGVjb2RlZF9zdWJzdHJlYW0gPSBzdWJzdHI7CiAgICAgfQogCkBAIC01NjUsOSArNTcxLDkgQEAKICAgICBmb3IgKGNoID0gMDsgY2ggPD0gcy0+bWF4X21hdHJpeF9jaGFubmVsOyBjaCsrKSB7CiAgICAgICAgIGludCBjaF9hc3NpZ24gPSBnZXRfYml0cyhnYnAsIDYpOwogICAgICAgICBpZiAobS0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RSVUVIRCkgewotICAgICAgICAgICAgdWludDY0X3QgY2hhbm5lbCA9IHRoZF9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwocy0+Y2hfbGF5b3V0LAorICAgICAgICAgICAgdWludDY0X3QgY2hhbm5lbCA9IHRoZF9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwocy0+bWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX2Fzc2lnbik7Ci0gICAgICAgICAgICBjaF9hc3NpZ24gPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfY2hhbm5lbF9pbmRleChzLT5jaF9sYXlvdXQsCisgICAgICAgICAgICBjaF9hc3NpZ24gPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfY2hhbm5lbF9pbmRleChzLT5tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGNoX2Fzc2lnbiA8IDAgfHwgY2hfYXNzaWduID4gcy0+bWF4X21hdHJpeF9jaGFubmVsKSB7CkBAIC02MDksNyArNjE1LDcgQEAKIAogICAgIGlmIChzdWJzdHIgPT0gbS0+bWF4X2RlY29kZWRfc3Vic3RyZWFtKSB7CiAgICAgICAgIG0tPmF2Y3R4LT5jaGFubmVscyAgICAgICA9IHMtPm1heF9tYXRyaXhfY2hhbm5lbCArIDE7Ci0gICAgICAgIG0tPmF2Y3R4LT5jaGFubmVsX2xheW91dCA9IHMtPmNoX2xheW91dDsKKyAgICAgICAgbS0+YXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gcy0+bWFzazsKICAgICAgICAgbS0+ZHNwLm1scF9wYWNrX291dHB1dCA9IG0tPmRzcC5tbHBfc2VsZWN0X3BhY2tfb3V0cHV0KHMtPmNoX2Fzc2lnbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9zaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1heF9tYXRyaXhfY2hhbm5lbCwKQEAgLTY4NCw3ICs2OTAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspCi0gICAgICAgICAgICBmY29lZmZbaV0gPSBnZXRfc2JpdHMoZ2JwLCBjb2VmZl9iaXRzKSA8PCBjb2VmZl9zaGlmdDsKKyAgICAgICAgICAgIGZjb2VmZltpXSA9IGdldF9zYml0cyhnYnAsIGNvZWZmX2JpdHMpICogKDEgPDwgY29lZmZfc2hpZnQpOwogCiAgICAgICAgIGlmIChnZXRfYml0czEoZ2JwKSkgewogICAgICAgICAgICAgaW50IHN0YXRlX2JpdHMsIHN0YXRlX3NoaWZ0OwpAQCAtNzAxLDcgKzcwNyw3IEBACiAgICAgICAgICAgICAvKiBUT0RPOiBDaGVjayB2YWxpZGl0eSBvZiBzdGF0ZSBkYXRhLiAqLwogCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3JkZXI7IGkrKykKLSAgICAgICAgICAgICAgICBmcC0+c3RhdGVbaV0gPSBzdGF0ZV9iaXRzID8gZ2V0X3NiaXRzKGdicCwgc3RhdGVfYml0cykgPDwgc3RhdGVfc2hpZnQgOiAwOworICAgICAgICAgICAgICAgIGZwLT5zdGF0ZVtpXSA9IHN0YXRlX2JpdHMgPyBnZXRfc2JpdHMoZ2JwLCBzdGF0ZV9iaXRzKSAqICgxIDw8IHN0YXRlX3NoaWZ0KSA6IDA7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTcyOSw3ICs3MzUsNyBAQAogICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgcHJpbWl0aXZlIG1hdHJpY2VzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJWQuXG4iLAogICAgICAgICAgICAgICAgbWF4X3ByaW1pdGl2ZV9tYXRyaWNlcyk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIGZvciAobWF0ID0gMDsgbWF0IDwgcy0+bnVtX3ByaW1pdGl2ZV9tYXRyaWNlczsgbWF0KyspIHsKQEAgLTc0MiwxMiArNzQ4LDEyIEBACiAgICAgICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2hhbm5lbCAlZCBzcGVjaWZpZWQgYXMgb3V0cHV0IGZyb20gbWF0cml4LlxuIiwKICAgICAgICAgICAgICAgICAgICAgcy0+bWF0cml4X291dF9jaFttYXRdKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgICAgICBpZiAoZnJhY19iaXRzID4gMTQpIHsKICAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAiVG9vIG1hbnkgZnJhY3Rpb25hbCBiaXRzIHNwZWNpZmllZC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CiAKICAgICAgICAgbWF4X2NoYW4gPSBzLT5tYXhfbWF0cml4X2NoYW5uZWw7CkBAIC03NTksNyArNzY1LDcgQEAKICAgICAgICAgICAgIGlmIChnZXRfYml0czEoZ2JwKSkKICAgICAgICAgICAgICAgICBjb2VmZl92YWwgPSBnZXRfc2JpdHMoZ2JwLCBmcmFjX2JpdHMgKyAyKTsKIAotICAgICAgICAgICAgcy0+bWF0cml4X2NvZWZmW21hdF1bY2hdID0gY29lZmZfdmFsIDw8ICgxNCAtIGZyYWNfYml0cyk7CisgICAgICAgICAgICBzLT5tYXRyaXhfY29lZmZbbWF0XVtjaF0gPSBjb2VmZl92YWwgKiAoMSA8PCAoMTQgLSBmcmFjX2JpdHMpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzLT5ub2lzZV90eXBlKQpAQCAtNzY5LDYgKzc3NSwxMSBAQAogICAgIH0KIAogICAgIHJldHVybiAwOworZXJyb3I6CisgICAgcy0+bnVtX3ByaW1pdGl2ZV9tYXRyaWNlcyA9IDA7CisgICAgbWVtc2V0KHMtPm1hdHJpeF9vdXRfY2gsIDAsIHNpemVvZihzLT5tYXRyaXhfb3V0X2NoKSk7CisKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIH0KIAogLyoqIFJlYWQgY2hhbm5lbCBwYXJhbWV0ZXJzLiAqLwpAQCAtODI0LDggKzgzNSw2IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGNwLT5zaWduX2h1ZmZfb2Zmc2V0ID0gY2FsY3VsYXRlX3NpZ25faHVmZihtLCBzdWJzdHIsIGNoKTsKLQogICAgIHJldHVybiAwOwogfQogCkBAIC04MzcsNyArODQ2LDggQEAKIHsKICAgICBTdWJTdHJlYW0gKnMgPSAmbS0+c3Vic3RyZWFtW3N1YnN0cl07CiAgICAgdW5zaWduZWQgaW50IGNoOwotICAgIGludCByZXQ7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgcmVjb21wdXRlX3NobyA9IDA7CiAKICAgICBpZiAocy0+cGFyYW1fcHJlc2VuY2VfZmxhZ3MgJiBQQVJBTV9QUkVTRU5DRSkKICAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKQpAQCAtODYwLDggKzg3MCwxMyBAQAogCiAgICAgaWYgKHMtPnBhcmFtX3ByZXNlbmNlX2ZsYWdzICYgUEFSQU1fT1VUU0hJRlQpCiAgICAgICAgIGlmIChnZXRfYml0czEoZ2JwKSkgewotICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDw9IHMtPm1heF9tYXRyaXhfY2hhbm5lbDsgY2grKykKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8PSBzLT5tYXhfbWF0cml4X2NoYW5uZWw7IGNoKyspIHsKICAgICAgICAgICAgICAgICBzLT5vdXRwdXRfc2hpZnRbY2hdID0gZ2V0X3NiaXRzKGdicCwgNCk7CisgICAgICAgICAgICAgICAgaWYgKHMtPm91dHB1dF9zaGlmdFtjaF0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShtLT5hdmN0eCwgIk5lZ2F0aXZlIG91dHB1dF9zaGlmdCIpOworICAgICAgICAgICAgICAgICAgICBzLT5vdXRwdXRfc2hpZnRbY2hdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc3Vic3RyID09IG0tPm1heF9kZWNvZGVkX3N1YnN0cmVhbSkKICAgICAgICAgICAgICAgICBtLT5kc3AubWxwX3BhY2tfb3V0cHV0ID0gbS0+ZHNwLm1scF9zZWxlY3RfcGFja19vdXRwdXQocy0+Y2hfYXNzaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXRwdXRfc2hpZnQsCkBAIC04NzIsMTkgKzg4NywzNiBAQAogICAgIGlmIChzLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAmIFBBUkFNX1FVQU5UU1RFUCkKICAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKQogICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDw9IHMtPm1heF9jaGFubmVsOyBjaCsrKSB7Ci0gICAgICAgICAgICAgICAgQ2hhbm5lbFBhcmFtcyAqY3AgPSAmcy0+Y2hhbm5lbF9wYXJhbXNbY2hdOwotCiAgICAgICAgICAgICAgICAgcy0+cXVhbnRfc3RlcF9zaXplW2NoXSA9IGdldF9iaXRzKGdicCwgNCk7CiAKLSAgICAgICAgICAgICAgICBjcC0+c2lnbl9odWZmX29mZnNldCA9IGNhbGN1bGF0ZV9zaWduX2h1ZmYobSwgc3Vic3RyLCBjaCk7CisgICAgICAgICAgICAgICAgcmVjb21wdXRlX3NobyB8PSAxPDxjaDsKICAgICAgICAgICAgIH0KIAogICAgIGZvciAoY2ggPSBzLT5taW5fY2hhbm5lbDsgY2ggPD0gcy0+bWF4X2NoYW5uZWw7IGNoKyspCi0gICAgICAgIGlmIChnZXRfYml0czEoZ2JwKSkKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYnApKSB7CisgICAgICAgICAgICByZWNvbXB1dGVfc2hvIHw9IDE8PGNoOwogICAgICAgICAgICAgaWYgKChyZXQgPSByZWFkX2NoYW5uZWxfcGFyYW1zKG0sIHN1YnN0ciwgZ2JwLCBjaCkpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQogCi0gICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZm9yIChjaCA9IDA7IGNoIDw9IHMtPm1heF9jaGFubmVsOyBjaCsrKSB7CisgICAgICAgIGlmIChyZWNvbXB1dGVfc2hvICYgKDE8PGNoKSkgeworICAgICAgICAgICAgQ2hhbm5lbFBhcmFtcyAqY3AgPSAmcy0+Y2hhbm5lbF9wYXJhbXNbY2hdOworCisgICAgICAgICAgICBpZiAoY3AtPmNvZGVib29rID4gMCAmJiBjcC0+aHVmZl9sc2JzIDwgcy0+cXVhbnRfc3RlcF9zaXplW2NoXSkgeworICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobS0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInF1YW50X3N0ZXBfc2l6ZSBsYXJnZXIgdGhhbiBodWZmX2xzYnNcbiIpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzLT5xdWFudF9zdGVwX3NpemVbY2hdID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3AtPnNpZ25faHVmZl9vZmZzZXQgPSBjYWxjdWxhdGVfc2lnbl9odWZmKG0sIHN1YnN0ciwgY2gpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiAKICNkZWZpbmUgTVNCX01BU0soYml0cykgICgtMXUgPDwgKGJpdHMpKQpAQCAtOTk5LDggKzEwMzEsOCBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2NrcG9zOyBpKyspIHsKICAgICAgICAgdWludDE2X3Qgc2VlZF9zaHI3ID0gc2VlZCA+PiA3OwotICAgICAgICBtLT5zYW1wbGVfYnVmZmVyW2ldW21heGNoYW4rMV0gPSAoKGludDhfdCkoc2VlZCA+PiAxNSkpIDw8IHMtPm5vaXNlX3NoaWZ0OwotICAgICAgICBtLT5zYW1wbGVfYnVmZmVyW2ldW21heGNoYW4rMl0gPSAoKGludDhfdCkgc2VlZF9zaHI3KSAgIDw8IHMtPm5vaXNlX3NoaWZ0OworICAgICAgICBtLT5zYW1wbGVfYnVmZmVyW2ldW21heGNoYW4rMV0gPSAoKGludDhfdCkoc2VlZCA+PiAxNSkpICogKDEgPDwgcy0+bm9pc2Vfc2hpZnQpOworICAgICAgICBtLT5zYW1wbGVfYnVmZmVyW2ldW21heGNoYW4rMl0gPSAoKGludDhfdCkgc2VlZF9zaHI3KSAgICogKDEgPDwgcy0+bm9pc2Vfc2hpZnQpOwogCiAgICAgICAgIHNlZWQgPSAoc2VlZCA8PCAxNikgXiBzZWVkX3NocjcgXiAoc2VlZF9zaHI3IDw8IDUpOwogICAgIH0KQEAgLTExNjIsNiArMTE5NCwxMSBAQAogICAgICAgICAgICAgc3Vic3RyX2hlYWRlcl9zaXplICs9IDI7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobGVuZ3RoIDwgaGVhZGVyX3NpemUgKyBzdWJzdHJfaGVhZGVyX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGRhdGEgZm9yIGhlYWRlcnNcbiIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICghKG5vbnJlc3RhcnRfc3Vic3RyIF4gbS0+aXNfbWFqb3Jfc3luY191bml0KSkgewogICAgICAgICAgICAgYXZfbG9nKG0tPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG5vbnJlc3RhcnRfc3Vic3RyLlxuIik7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tbHBkc3AuYyBiL2xpYmF2Y29kZWMvbWxwZHNwLmMKaW5kZXggM2FlOGMzNy4uMzJhNDUwMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tbHBkc3AuYworKysgYi9saWJhdmNvZGVjL21scGRzcC5jCkBAIC0xMTMsMTEgKzExMywxMSBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3BvczsgaSsrKSB7CiAgICAgICAgIGZvciAob3V0X2NoID0gMDsgb3V0X2NoIDw9IG1heF9tYXRyaXhfY2hhbm5lbDsgb3V0X2NoKyspIHsKICAgICAgICAgICAgIGludCBtYXRfY2ggPSBjaF9hc3NpZ25bb3V0X2NoXTsKLSAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlID0gc2FtcGxlX2J1ZmZlcltpXVttYXRfY2hdCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDw8IG91dHB1dF9zaGlmdFttYXRfY2hdOworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGUgPSBzYW1wbGVfYnVmZmVyW2ldW21hdF9jaF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAoMVUgPDwgb3V0cHV0X3NoaWZ0W21hdF9jaF0pOwogICAgICAgICAgICAgbG9zc2xlc3NfY2hlY2tfZGF0YSBePSAoc2FtcGxlICYgMHhmZmZmZmYpIDw8IG1hdF9jaDsKICAgICAgICAgICAgIGlmIChpczMyKQotICAgICAgICAgICAgICAgICpkYXRhXzMyKysgPSBzYW1wbGUgPDwgODsKKyAgICAgICAgICAgICAgICAqZGF0YV8zMisrID0gc2FtcGxlICogMjU2VTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAqZGF0YV8xNisrID0gc2FtcGxlID4+IDg7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbWxwZW5jLmMgYi9saWJhdmNvZGVjL21scGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MzZkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21scGVuYy5jCkBAIC0wLDAgKzEsMjQxNiBAQAorLyoqCisgKiBNTFAgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDA4IFJhbWlybyBQb2xsYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJhdWRpb19mcmFtZV9xdWV1ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCisjaW5jbHVkZSAibWxwLmgiCisjaW5jbHVkZSAibHBjLmgiCisKKyNkZWZpbmUgTUFKT1JfSEVBREVSX0lOVEVSVkFMIDE2CisKKyNkZWZpbmUgTUxQX01JTl9MUENfT1JERVIgICAgICAxCisjZGVmaW5lIE1MUF9NQVhfTFBDX09SREVSICAgICAgOAorI2RlZmluZSBNTFBfTUlOX0xQQ19TSElGVCAgICAgIDgKKyNkZWZpbmUgTUxQX01BWF9MUENfU0hJRlQgICAgIDE1CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50OF90ICAgICAgICAgbWluX2NoYW5uZWw7ICAgICAgICAgLy8vPCBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYW5uZWwgY29kZWQgaW4gdGhpcyBzdWJzdHJlYW0uCisgICAgdWludDhfdCAgICAgICAgIG1heF9jaGFubmVsOyAgICAgICAgIC8vLzwgVGhlIGluZGV4IG9mIHRoZSBsYXN0IGNoYW5uZWwgY29kZWQgaW4gdGhpcyBzdWJzdHJlYW0uCisgICAgdWludDhfdCAgICAgICAgIG1heF9tYXRyaXhfY2hhbm5lbDsgIC8vLzwgVGhlIG51bWJlciBvZiBjaGFubmVscyBpbnB1dCBpbnRvIHRoZSByZW1hdHJpeCBzdGFnZS4KKworICAgIHVpbnQ4X3QgICAgICAgICBub2lzZV9zaGlmdDsgICAgICAgICAvLy88IFRoZSBsZWZ0IHNoaWZ0IGFwcGxpZWQgdG8gcmFuZG9tIG5vaXNlIGluIDB4MzFlYSBzdWJzdHJlYW1zLgorICAgIHVpbnQzMl90ICAgICAgICBub2lzZWdlbl9zZWVkOyAgICAgICAvLy88IFRoZSBjdXJyZW50IHNlZWQgdmFsdWUgZm9yIHRoZSBwc2V1ZG9yYW5kb20gbm9pc2UgZ2VuZXJhdG9yKHMpLgorCisgICAgaW50ICAgICAgICAgICAgIGRhdGFfY2hlY2tfcHJlc2VudDsgIC8vLzwgU2V0IGlmIHRoZSBzdWJzdHJlYW0gY29udGFpbnMgZXh0cmEgaW5mbyB0byBjaGVjayB0aGUgc2l6ZSBvZiBWTEMgYmxvY2tzLgorCisgICAgaW50MzJfdCAgICAgICAgIGxvc3NsZXNzX2NoZWNrX2RhdGE7IC8vLzwgWE9SIG9mIGFsbCBvdXRwdXQgc2FtcGxlcworCisgICAgdWludDhfdCAgICAgICAgIG1heF9odWZmX2xzYnM7ICAgICAgIC8vLzwgbGFyZ2VzdCBodWZmX2xzYnMKKyAgICB1aW50OF90ICAgICAgICAgbWF4X291dHB1dF9iaXRzOyAgICAgLy8vPCBsYXJnZXN0IG91dHB1dCBiaXQtZGVwdGgKK30gUmVzdGFydEhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQ4X3QgICAgICAgICBjb3VudDsgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBtYXRyaWNlcyB0byBhcHBseQorCisgICAgdWludDhfdCAgICAgICAgIG91dGNoW01BWF9NQVRSSUNFU107ICAgIC8vLzwgb3V0cHV0IGNoYW5uZWwgZm9yIGVhY2ggbWF0cml4CisgICAgaW50MzJfdCAgICAgICAgIGZvcmNvW01BWF9NQVRSSUNFU11bTUFYX0NIQU5ORUxTKzJdOyAgICAvLy88IGZvcndhcmQgY29lZmZpY2llbnRzCisgICAgaW50MzJfdCAgICAgICAgIGNvZWZmW01BWF9NQVRSSUNFU11bTUFYX0NIQU5ORUxTKzJdOyAgICAvLy88IGRlY29kaW5nIGNvZWZmaWNpZW50cworICAgIHVpbnQ4X3QgICAgICAgICBmYml0c1tNQVhfQ0hBTk5FTFNdOyAgICAvLy88IGZyYWN0aW9uIGJpdHMKKworICAgIGludDhfdCAgICAgICAgICBzaGlmdFtNQVhfQ0hBTk5FTFNdOyAgICAvLy88IExlZnQgc2hpZnQgdG8gYXBwbHkgdG8gZGVjb2RlZCBQQ00gdmFsdWVzIHRvIGdldCBmaW5hbCAyNC1iaXQgb3V0cHV0LgorfSBNYXRyaXhQYXJhbXM7CisKK2VudW0gUGFyYW1GbGFncyB7CisgICAgUEFSQU1TX0RFRkFVTFQgICAgICAgPSAweGZmLAorICAgIFBBUkFNX1BSRVNFTkNFX0ZMQUdTID0gMSA8PCA4LAorICAgIFBBUkFNX0JMT0NLU0laRSAgICAgID0gMSA8PCA3LAorICAgIFBBUkFNX01BVFJJWCAgICAgICAgID0gMSA8PCA2LAorICAgIFBBUkFNX09VVFNISUZUICAgICAgID0gMSA8PCA1LAorICAgIFBBUkFNX1FVQU5UU1RFUCAgICAgID0gMSA8PCA0LAorICAgIFBBUkFNX0ZJUiAgICAgICAgICAgID0gMSA8PCAzLAorICAgIFBBUkFNX0lJUiAgICAgICAgICAgID0gMSA8PCAyLAorICAgIFBBUkFNX0hVRkZPRkZTRVQgICAgID0gMSA8PCAxLAorICAgIFBBUkFNX1BSRVNFTlQgICAgICAgID0gMSA8PCAwLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVpbnQxNl90ICAgICAgICBibG9ja3NpemU7ICAgICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgUENNIHNhbXBsZXMgaW4gY3VycmVudCBhdWRpbyBibG9jaworICAgIHVpbnQ4X3QgICAgICAgICBxdWFudF9zdGVwX3NpemVbTUFYX0NIQU5ORUxTXTsgIC8vLzwgbGVmdCBzaGlmdCB0byBhcHBseSB0byBIdWZmbWFuLWRlY29kZWQgcmVzaWR1YWxzCisKKyAgICBNYXRyaXhQYXJhbXMgICAgbWF0cml4X3BhcmFtczsKKworICAgIHVpbnQ4X3QgICAgICAgICBwYXJhbV9wcmVzZW5jZV9mbGFnczsgICAgICAgLy8vPCBCaXRtYXNrIG9mIHdoaWNoIHBhcmFtZXRlciBzZXRzIGFyZSBjb252ZXllZCBpbiBhIGRlY29kaW5nIHBhcmFtZXRlciBibG9jay4KK30gRGVjb2RpbmdQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IEJlc3RPZmZzZXQgeworICAgIGludDE2X3Qgb2Zmc2V0OworICAgIGludCBiaXRjb3VudDsKKyAgICBpbnQgbHNiX2JpdHM7CisgICAgaW50MTZfdCBtaW47CisgICAgaW50MTZfdCBtYXg7Cit9IEJlc3RPZmZzZXQ7CisKKyNkZWZpbmUgSFVGRl9PRkZTRVRfTUlOICAgIC0xNjM4NAorI2RlZmluZSBIVUZGX09GRlNFVF9NQVggICAgIDE2MzgzCisKKy8qKiBOdW1iZXIgb2YgcG9zc2libGUgY29kZWJvb2tzIChjb3VudGluZyAibm8gY29kZWJvb2tzIikgKi8KKyNkZWZpbmUgTlVNX0NPREVCT09LUyAgICAgICA0CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBpbnQgICAgICAgICAgICAgbnVtX3N1YnN0cmVhbXM7ICAgICAgICAgLy8vPCBOdW1iZXIgb2Ygc3Vic3RyZWFtcyBjb250YWluZWQgd2l0aGluIHRoaXMgc3RyZWFtLgorCisgICAgaW50ICAgICAgICAgICAgIG51bV9jaGFubmVsczsgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiBtYWpvcl9zY3JhdGNoX2J1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgTm9ybWFsIGNoYW5uZWxzICsgbm9pc2UgY2hhbm5lbHMuICovCisKKyAgICBpbnQgICAgICAgICAgICAgY29kZWRfc2FtcGxlX2ZtdCBbMl07ICAgLy8vPCBzYW1wbGUgZm9ybWF0IGVuY29kZWQgZm9yIE1MUAorICAgIGludCAgICAgICAgICAgICBjb2RlZF9zYW1wbGVfcmF0ZVsyXTsgICAvLy88IHNhbXBsZSByYXRlIGVuY29kZWQgZm9yIE1MUAorICAgIGludCAgICAgICAgICAgICBjb2RlZF9wZWFrX2JpdHJhdGU7ICAgICAvLy88IHBlYWsgYml0cmF0ZSBmb3IgdGhpcyBtYWpvciBzeW5jIGhlYWRlcgorCisgICAgaW50ICAgICAgICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgICAgIC8vLzwgbWFqb3Igc3luYyBpbmZvIGZsYWdzCisKKyAgICAvKiBjaGFubmVsX21lYW5pbmcgKi8KKyAgICBpbnQgICAgICAgICAgICAgc3Vic3RyZWFtX2luZm87CisgICAgaW50ICAgICAgICAgICAgIGZzOworICAgIGludCAgICAgICAgICAgICB3b3JkbGVuZ3RoOworICAgIGludCAgICAgICAgICAgICBjaGFubmVsX29jY3VwYW5jeTsKKyAgICBpbnQgICAgICAgICAgICAgc3VtbWFyeV9pbmZvOworCisgICAgaW50MzJfdCAgICAgICAgKmlub3V0X2J1ZmZlcjsgICAgICAgICAgIC8vLzwgUG9pbnRlciB0byBkYXRhIGN1cnJlbnRseSBiZWluZyByZWFkIGZyb20gbGF2YyBvciB3cml0dGVuIHRvIGJpdHN0cmVhbS4KKyAgICBpbnQzMl90ICAgICAgICAqbWFqb3JfaW5vdXRfYnVmZmVyOyAgICAgLy8vPCBCdWZmZXIgd2l0aCBhbGwgaW4vb3V0IGRhdGEgZm9yIG9uZSBlbnRpcmUgbWFqb3IgZnJhbWUgaW50ZXJ2YWwuCisgICAgaW50MzJfdCAgICAgICAgKndyaXRlX2J1ZmZlcjsgICAgICAgICAgIC8vLzwgUG9pbnRlciB0byBkYXRhIGN1cnJlbnRseSBiZWluZyB3cml0dGVuIHRvIGJpdHN0cmVhbS4KKyAgICBpbnQzMl90ICAgICAgICAqc2FtcGxlX2J1ZmZlcjsgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIGN1cnJlbnQgYWNjZXNzIHVuaXQgc2FtcGxlcy4KKyAgICBpbnQzMl90ICAgICAgICAqbWFqb3Jfc2NyYXRjaF9idWZmZXI7ICAgLy8vPCBTY3JhdGNoIGJ1ZmZlciBiaWcgZW5vdWdoIHRvIGZpdCBhbGwgZGF0YSBmb3Igb25lIGVudGlyZSBtYWpvciBmcmFtZSBpbnRlcnZhbC4KKyAgICBpbnQzMl90ICAgICAgICAqbGFzdF9mcmFtZTsgICAgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIGxhc3QgZnJhbWUgd2l0aCBkYXRhIHRvIGVuY29kZS4KKworICAgIGludDMyX3QgICAgICAgICpscGNfc2FtcGxlX2J1ZmZlcjsKKworICAgIHVuc2lnbmVkIGludCAgICBtYWpvcl9udW1iZXJfb2ZfZnJhbWVzOworICAgIHVuc2lnbmVkIGludCAgICBuZXh0X21ham9yX251bWJlcl9vZl9mcmFtZXM7CisKKyAgICB1bnNpZ25lZCBpbnQgICAgbWFqb3JfZnJhbWVfc2l6ZTsgICAgICAgLy8vPCBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBjdXJyZW50IG1ham9yIGZyYW1lIGJlaW5nIGVuY29kZWQuCisgICAgdW5zaWduZWQgaW50ICAgIG5leHRfbWFqb3JfZnJhbWVfc2l6ZTsgIC8vLzwgQ291bnRlciBvZiBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgbmV4dCBtYWpvciBmcmFtZS4KKworICAgIGludDMyX3QgICAgICAgICpsb3NzbGVzc19jaGVja19kYXRhOyAgICAvLy88IEFycmF5IHdpdGggbG9zc2xlc3NfY2hlY2tfZGF0YSBmb3IgZWFjaCBhY2Nlc3MgdW5pdC4KKworICAgIHVuc2lnbmVkIGludCAgICptYXhfb3V0cHV0X2JpdHM7ICAgICAgICAvLy88IGxhcmdlc3Qgb3V0cHV0IGJpdC1kZXB0aAorICAgIHVuc2lnbmVkIGludCAgICpmcmFtZV9zaXplOyAgICAgICAgICAgICAvLy88IEFycmF5IHdpdGggbnVtYmVyIG9mIHNhbXBsZXMvY2hhbm5lbCBpbiBlYWNoIGFjY2VzcyB1bml0LgorICAgIHVuc2lnbmVkIGludCAgICBmcmFtZV9pbmRleDsgICAgICAgICAgICAvLy88IEluZGV4IG9mIGN1cnJlbnQgZnJhbWUgYmVpbmcgZW5jb2RlZC4KKworICAgIHVuc2lnbmVkIGludCAgICBvbmVfc2FtcGxlX2J1ZmZlcl9zaXplOyAvLy88IE51bWJlciBvZiBzYW1wbGVzKmNoYW5uZWwgZm9yIG9uZSBhY2Nlc3MgdW5pdC4KKworICAgIHVuc2lnbmVkIGludCAgICBtYXhfcmVzdGFydF9pbnRlcnZhbDsgICAvLy88IE1heCBpbnRlcnZhbCBvZiBhY2Nlc3MgdW5pdHMgaW4gYmV0d2VlbiB0d28gbWFqb3IgZnJhbWVzLgorICAgIHVuc2lnbmVkIGludCAgICBtaW5fcmVzdGFydF9pbnRlcnZhbDsgICAvLy88IE1pbiBpbnRlcnZhbCBvZiBhY2Nlc3MgdW5pdHMgaW4gYmV0d2VlbiB0d28gbWFqb3IgZnJhbWVzLgorICAgIHVuc2lnbmVkIGludCAgICByZXN0YXJ0X2ludGVydmFsczsgICAgICAvLy88IE51bWJlciBvZiBwb3NzaWJsZSBtYWpvciBmcmFtZSBzaXplcy4KKworICAgIHVpbnQxNl90ICAgICAgICB0aW1lc3RhbXA7ICAgICAgICAgICAgICAvLy88IFRpbWVzdGFtcCBvZiBjdXJyZW50IGFjY2VzcyB1bml0LgorICAgIHVpbnQxNl90ICAgICAgICBkdHM7ICAgICAgICAgICAgICAgICAgICAvLy88IERlY29kaW5nIHRpbWVzdGFtcCBvZiBjdXJyZW50IGFjY2VzcyB1bml0LgorCisgICAgdWludDhfdCAgICAgICAgIGNoYW5uZWxfYXJyYW5nZW1lbnQ7ICAgIC8vLzwgY2hhbm5lbCBhcnJhbmdlbWVudCBmb3IgTUxQIHN0cmVhbXMKKworICAgIHVpbnQ4X3QgICAgICAgICBjaF9tb2RpZmllcl90aGQwOyAgICAgICAvLy88IGNoYW5uZWwgbW9kaWZpZXIgZm9yIFRydWVIRCBzdHJlYW0gMAorICAgIHVpbnQ4X3QgICAgICAgICBjaF9tb2RpZmllcl90aGQxOyAgICAgICAvLy88IGNoYW5uZWwgbW9kaWZpZXIgZm9yIFRydWVIRCBzdHJlYW0gMQorICAgIHVpbnQ4X3QgICAgICAgICBjaF9tb2RpZmllcl90aGQyOyAgICAgICAvLy88IGNoYW5uZWwgbW9kaWZpZXIgZm9yIFRydWVIRCBzdHJlYW0gMgorCisgICAgdW5zaWduZWQgaW50ICAgIHNlcV9zaXplICBbTUFKT1JfSEVBREVSX0lOVEVSVkFMXTsKKyAgICB1bnNpZ25lZCBpbnQgICAgc2VxX29mZnNldFtNQUpPUl9IRUFERVJfSU5URVJWQUxdOworICAgIHVuc2lnbmVkIGludCAgICBzZXF1ZW5jZV9zaXplOworCisgICAgQ2hhbm5lbFBhcmFtcyAgKmNoYW5uZWxfcGFyYW1zOworCisgICAgQmVzdE9mZnNldCAgICAgIGJlc3Rfb2Zmc2V0W01BSk9SX0hFQURFUl9JTlRFUlZBTCsxXVtNQVhfQ0hBTk5FTFNdW05VTV9DT0RFQk9PS1NdOworCisgICAgRGVjb2RpbmdQYXJhbXMgKmRlY29kaW5nX3BhcmFtczsKKyAgICBSZXN0YXJ0SGVhZGVyICAgcmVzdGFydF9oZWFkZXIgW01BWF9TVUJTVFJFQU1TXTsKKworICAgIENoYW5uZWxQYXJhbXMgICBtYWpvcl9jaGFubmVsX3BhcmFtc1tNQUpPUl9IRUFERVJfSU5URVJWQUwrMV1bTUFYX0NIQU5ORUxTXTsgICAgICAgLy8vPCBDaGFubmVsUGFyYW1zIHRvIGJlIHdyaXR0ZW4gdG8gYml0c3RyZWFtLgorICAgIERlY29kaW5nUGFyYW1zICBtYWpvcl9kZWNvZGluZ19wYXJhbXNbTUFKT1JfSEVBREVSX0lOVEVSVkFMKzFdW01BWF9TVUJTVFJFQU1TXTsgICAgLy8vPCBEZWNvZGluZ1BhcmFtcyB0byBiZSB3cml0dGVuIHRvIGJpdHN0cmVhbS4KKyAgICBpbnQgICAgICAgICAgICAgbWFqb3JfcGFyYW1zX2NoYW5nZWRbTUFKT1JfSEVBREVSX0lOVEVSVkFMKzFdW01BWF9TVUJTVFJFQU1TXTsgICAgIC8vLzwgcGFyYW1zX2NoYW5nZWQgdG8gYmUgd3JpdHRlbiB0byBiaXRzdHJlYW0uCisKKyAgICB1bnNpZ25lZCBpbnQgICAgbWFqb3JfY3VyX3N1YmJsb2NrX2luZGV4OworICAgIHVuc2lnbmVkIGludCAgICBtYWpvcl9maWx0ZXJfc3RhdGVfc3ViYmxvY2s7CisgICAgdW5zaWduZWQgaW50ICAgIG1ham9yX251bWJlcl9vZl9zdWJibG9ja3M7CisKKyAgICBCZXN0T2Zmc2V0ICAgICgqY3VyX2Jlc3Rfb2Zmc2V0KVtOVU1fQ09ERUJPT0tTXTsKKyAgICBDaGFubmVsUGFyYW1zICAqY3VyX2NoYW5uZWxfcGFyYW1zOworICAgIERlY29kaW5nUGFyYW1zICpjdXJfZGVjb2RpbmdfcGFyYW1zOworICAgIFJlc3RhcnRIZWFkZXIgICpjdXJfcmVzdGFydF9oZWFkZXI7CisKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworCisgICAgLyogQW5hbHlzaXMgc3RhZ2UuICovCisgICAgdW5zaWduZWQgaW50ICAgIHN0YXJ0aW5nX2ZyYW1lX2luZGV4OworICAgIHVuc2lnbmVkIGludCAgICBudW1iZXJfb2ZfZnJhbWVzOworICAgIHVuc2lnbmVkIGludCAgICBudW1iZXJfb2Zfc2FtcGxlczsKKyAgICB1bnNpZ25lZCBpbnQgICAgbnVtYmVyX29mX3N1YmJsb2NrczsKKyAgICB1bnNpZ25lZCBpbnQgICAgc2VxX2luZGV4OyAgICAgICAgICAgICAgLy8vPCBTZXF1ZW5jZSBpbmRleCBmb3IgaGlnaCBjb21wcmVzc2lvbiBsZXZlbHMuCisKKyAgICBDaGFubmVsUGFyYW1zICAqcHJldl9jaGFubmVsX3BhcmFtczsKKyAgICBEZWNvZGluZ1BhcmFtcyAqcHJldl9kZWNvZGluZ19wYXJhbXM7CisKKyAgICBDaGFubmVsUGFyYW1zICAqc2VxX2NoYW5uZWxfcGFyYW1zOworICAgIERlY29kaW5nUGFyYW1zICpzZXFfZGVjb2RpbmdfcGFyYW1zOworCisgICAgdW5zaWduZWQgaW50ICAgIG1heF9jb2RlYm9va19zZWFyY2g7CisKKyAgICBMUENDb250ZXh0ICAgICAgbHBjX2N0eDsKK30gTUxQRW5jb2RlQ29udGV4dDsKKworc3RhdGljIENoYW5uZWxQYXJhbXMgICByZXN0YXJ0X2NoYW5uZWxfcGFyYW1zW01BWF9DSEFOTkVMU107CitzdGF0aWMgRGVjb2RpbmdQYXJhbXMgIHJlc3RhcnRfZGVjb2RpbmdfcGFyYW1zW01BWF9TVUJTVFJFQU1TXTsKK3N0YXRpYyBCZXN0T2Zmc2V0ICAgICAgcmVzdGFydF9iZXN0X29mZnNldFtOVU1fQ09ERUJPT0tTXSA9IHt7MH19OworCisjZGVmaW5lIFNZTkNfTUFKT1IgICAgICAweGY4NzI2ZgorI2RlZmluZSBNQUpPUl9TWU5DX0lORk9fU0lHTkFUVVJFICAgMHhCNzUyCisKKyNkZWZpbmUgU1lOQ19NTFAgICAgICAgIDB4YmIKKyNkZWZpbmUgU1lOQ19UUlVFSEQgICAgIDB4YmEKKworLyogbXVzdCBiZSBzZXQgZm9yIERWRC1BICovCisjZGVmaW5lIEZMQUdTX0RWREEgICAgICAweDQwMDAKKy8qIEZJRk8gZGVsYXkgbXVzdCBiZSBjb25zdGFudCAqLworI2RlZmluZSBGTEFHU19DT05TVCAgICAgMHg4MDAwCisKKyNkZWZpbmUgU1VCU1RSRUFNX0lORk9fTUFYXzJfQ0hBTiAgIDB4MDEKKyNkZWZpbmUgU1VCU1RSRUFNX0lORk9fSElHSF9SQVRFICAgIDB4MDIKKyNkZWZpbmUgU1VCU1RSRUFNX0lORk9fQUxXQVlTX1NFVCAgIDB4MDQKKyNkZWZpbmUgU1VCU1RSRUFNX0lORk9fMl9TVUJTVFJFQU1TIDB4MDgKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKiogRnVuY3Rpb25zIHRoYXQgY29weSwgY2xlYXIsIG9yIGNvbXBhcmUgcGFyYW1ldGVycyAqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIENvbXBhcmVzIHR3byBGaWx0ZXJQYXJhbXMgc3RydWN0dXJlcyBhbmQgcmV0dXJucyAxIGlmIGFueXRoaW5nIGhhcworICogIGNoYW5nZWQuIFJldHVybnMgMCBpZiB0aGV5IGFyZSBib3RoIGVxdWFsLgorICovCitzdGF0aWMgaW50IGNvbXBhcmVfZmlsdGVyX3BhcmFtcyhjb25zdCBDaGFubmVsUGFyYW1zICpwcmV2X2NwLCBjb25zdCBDaGFubmVsUGFyYW1zICpjcCwgaW50IGZpbHRlcikKK3sKKyAgICBjb25zdCBGaWx0ZXJQYXJhbXMgKnByZXYgPSAmcHJldl9jcC0+ZmlsdGVyX3BhcmFtc1tmaWx0ZXJdOworICAgIGNvbnN0IEZpbHRlclBhcmFtcyAqZnAgPSAmY3AtPmZpbHRlcl9wYXJhbXNbZmlsdGVyXTsKKyAgICBpbnQgaTsKKworICAgIGlmIChwcmV2LT5vcmRlciAhPSBmcC0+b3JkZXIpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKCFwcmV2LT5vcmRlcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocHJldi0+c2hpZnQgIT0gZnAtPnNoaWZ0KQorICAgICAgICByZXR1cm4gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmcC0+b3JkZXI7IGkrKykKKyAgICAgICAgaWYgKHByZXZfY3AtPmNvZWZmW2ZpbHRlcl1baV0gIT0gY3AtPmNvZWZmW2ZpbHRlcl1baV0pCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCisvKiogQ29tcGFyZSB0d28gcHJpbWl0aXZlIG1hdHJpY2VzIGFuZCByZXR1cm5zIDEgaWYgYW55dGhpbmcgaGFzIGNoYW5nZWQuCisgKiAgUmV0dXJucyAwIGlmIHRoZXkgYXJlIGJvdGggZXF1YWwuCisgKi8KK3N0YXRpYyBpbnQgY29tcGFyZV9tYXRyaXhfcGFyYW1zKE1MUEVuY29kZUNvbnRleHQgKmN0eCwgY29uc3QgTWF0cml4UGFyYW1zICpwcmV2LCBjb25zdCBNYXRyaXhQYXJhbXMgKm1wKQoreworICAgIFJlc3RhcnRIZWFkZXIgKnJoID0gY3R4LT5jdXJfcmVzdGFydF9oZWFkZXI7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWwsIG1hdDsKKworICAgIGlmIChwcmV2LT5jb3VudCAhPSBtcC0+Y291bnQpCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYgKCFwcmV2LT5jb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGNoYW5uZWwgPSByaC0+bWluX2NoYW5uZWw7IGNoYW5uZWwgPD0gcmgtPm1heF9jaGFubmVsOyBjaGFubmVsKyspCisgICAgICAgIGlmIChwcmV2LT5mYml0c1tjaGFubmVsXSAhPSBtcC0+ZmJpdHNbY2hhbm5lbF0pCisgICAgICAgICAgICByZXR1cm4gMTsKKworICAgIGZvciAobWF0ID0gMDsgbWF0IDwgbXAtPmNvdW50OyBtYXQrKykgeworICAgICAgICBpZiAocHJldi0+b3V0Y2hbbWF0XSAhPSBtcC0+b3V0Y2hbbWF0XSkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjdHgtPm51bV9jaGFubmVsczsgY2hhbm5lbCsrKQorICAgICAgICAgICAgaWYgKHByZXYtPmNvZWZmW21hdF1bY2hhbm5lbF0gIT0gbXAtPmNvZWZmW21hdF1bY2hhbm5lbF0pCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBDb21wYXJlcyB0d28gRGVjb2RpbmdQYXJhbXMgYW5kIENoYW5uZWxQYXJhbXMgc3RydWN0dXJlcyB0byBkZWNpZGUgaWYgYQorICogIG5ldyBkZWNvZGluZyBwYXJhbXMgaGVhZGVyIGhhcyB0byBiZSB3cml0dGVuLgorICovCitzdGF0aWMgaW50IGNvbXBhcmVfZGVjb2RpbmdfcGFyYW1zKE1MUEVuY29kZUNvbnRleHQgKmN0eCkKK3sKKyAgICBEZWNvZGluZ1BhcmFtcyAqcHJldiA9IGN0eC0+cHJldl9kZWNvZGluZ19wYXJhbXM7CisgICAgRGVjb2RpbmdQYXJhbXMgKmRwID0gY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zOworICAgIE1hdHJpeFBhcmFtcyAqcHJldl9tcCA9ICZwcmV2LT5tYXRyaXhfcGFyYW1zOworICAgIE1hdHJpeFBhcmFtcyAqbXAgPSAmZHAtPm1hdHJpeF9wYXJhbXM7CisgICAgUmVzdGFydEhlYWRlciAgKnJoID0gY3R4LT5jdXJfcmVzdGFydF9oZWFkZXI7CisgICAgdW5zaWduZWQgaW50IGNoOworICAgIGludCByZXR2YWwgPSAwOworCisgICAgaWYgKHByZXYtPnBhcmFtX3ByZXNlbmNlX2ZsYWdzICE9IGRwLT5wYXJhbV9wcmVzZW5jZV9mbGFncykKKyAgICAgICAgcmV0dmFsIHw9IFBBUkFNX1BSRVNFTkNFX0ZMQUdTOworCisgICAgaWYgKHByZXYtPmJsb2Nrc2l6ZSAhPSBkcC0+YmxvY2tzaXplKQorICAgICAgICByZXR2YWwgfD0gUEFSQU1fQkxPQ0tTSVpFOworCisgICAgaWYgKGNvbXBhcmVfbWF0cml4X3BhcmFtcyhjdHgsIHByZXZfbXAsIG1wKSkKKyAgICAgICAgcmV0dmFsIHw9IFBBUkFNX01BVFJJWDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8PSByaC0+bWF4X21hdHJpeF9jaGFubmVsOyBjaCsrKQorICAgICAgICBpZiAocHJldl9tcC0+c2hpZnRbY2hdICE9IG1wLT5zaGlmdFtjaF0pIHsKKyAgICAgICAgICAgIHJldHZhbCB8PSBQQVJBTV9PVVRTSElGVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPD0gcmgtPm1heF9jaGFubmVsOyBjaCsrKQorICAgICAgICBpZiAocHJldi0+cXVhbnRfc3RlcF9zaXplW2NoXSAhPSBkcC0+cXVhbnRfc3RlcF9zaXplW2NoXSkgeworICAgICAgICAgICAgcmV0dmFsIHw9IFBBUkFNX1FVQU5UU1RFUDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBmb3IgKGNoID0gcmgtPm1pbl9jaGFubmVsOyBjaCA8PSByaC0+bWF4X2NoYW5uZWw7IGNoKyspIHsKKyAgICAgICAgQ2hhbm5lbFBhcmFtcyAqcHJldl9jcCA9ICZjdHgtPnByZXZfY2hhbm5lbF9wYXJhbXNbY2hdOworICAgICAgICBDaGFubmVsUGFyYW1zICpjcCA9ICZjdHgtPmN1cl9jaGFubmVsX3BhcmFtc1tjaF07CisKKyAgICAgICAgaWYgKCEocmV0dmFsICYgUEFSQU1fRklSKSAmJgorICAgICAgICAgICAgY29tcGFyZV9maWx0ZXJfcGFyYW1zKHByZXZfY3AsIGNwLCBGSVIpKQorICAgICAgICAgICAgcmV0dmFsIHw9IFBBUkFNX0ZJUjsKKworICAgICAgICBpZiAoIShyZXR2YWwgJiBQQVJBTV9JSVIpICYmCisgICAgICAgICAgICBjb21wYXJlX2ZpbHRlcl9wYXJhbXMocHJldl9jcCwgY3AsIElJUikpCisgICAgICAgICAgICByZXR2YWwgfD0gUEFSQU1fSUlSOworCisgICAgICAgIGlmIChwcmV2X2NwLT5odWZmX29mZnNldCAhPSBjcC0+aHVmZl9vZmZzZXQpCisgICAgICAgICAgICByZXR2YWwgfD0gUEFSQU1fSFVGRk9GRlNFVDsKKworICAgICAgICBpZiAocHJldl9jcC0+Y29kZWJvb2sgICAgIT0gY3AtPmNvZGVib29rICB8fAorICAgICAgICAgICAgcHJldl9jcC0+aHVmZl9sc2JzICAgIT0gY3AtPmh1ZmZfbHNicyAgKQorICAgICAgICAgICAgcmV0dmFsIHw9IDB4MTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCBjb3B5X2ZpbHRlcl9wYXJhbXMoQ2hhbm5lbFBhcmFtcyAqZHN0X2NwLCBDaGFubmVsUGFyYW1zICpzcmNfY3AsIGludCBmaWx0ZXIpCit7CisgICAgRmlsdGVyUGFyYW1zICpkc3QgPSAmZHN0X2NwLT5maWx0ZXJfcGFyYW1zW2ZpbHRlcl07CisgICAgRmlsdGVyUGFyYW1zICpzcmMgPSAmc3JjX2NwLT5maWx0ZXJfcGFyYW1zW2ZpbHRlcl07CisgICAgdW5zaWduZWQgaW50IG9yZGVyOworCisgICAgZHN0LT5vcmRlciA9IHNyYy0+b3JkZXI7CisKKyAgICBpZiAoZHN0LT5vcmRlcikgeworICAgICAgICBkc3QtPnNoaWZ0ID0gc3JjLT5zaGlmdDsKKworICAgICAgICBkc3QtPmNvZWZmX3NoaWZ0ID0gc3JjLT5jb2VmZl9zaGlmdDsKKyAgICAgICAgZHN0LT5jb2VmZl9iaXRzID0gc3JjLT5jb2VmZl9iaXRzOworICAgIH0KKworICAgIGZvciAob3JkZXIgPSAwOyBvcmRlciA8IGRzdC0+b3JkZXI7IG9yZGVyKyspCisgICAgICAgIGRzdF9jcC0+Y29lZmZbZmlsdGVyXVtvcmRlcl0gPSBzcmNfY3AtPmNvZWZmW2ZpbHRlcl1bb3JkZXJdOworfQorCitzdGF0aWMgdm9pZCBjb3B5X21hdHJpeF9wYXJhbXMoTWF0cml4UGFyYW1zICpkc3QsIE1hdHJpeFBhcmFtcyAqc3JjKQoreworICAgIGRzdC0+Y291bnQgPSBzcmMtPmNvdW50OworCisgICAgaWYgKGRzdC0+Y291bnQpIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwsIGNvdW50OworCisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBNQVhfQ0hBTk5FTFM7IGNoYW5uZWwrKykgeworCisgICAgICAgICAgICBkc3QtPmZiaXRzW2NoYW5uZWxdID0gc3JjLT5mYml0c1tjaGFubmVsXTsKKyAgICAgICAgICAgIGRzdC0+c2hpZnRbY2hhbm5lbF0gPSBzcmMtPnNoaWZ0W2NoYW5uZWxdOworCisgICAgICAgICAgICBmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNQVhfTUFUUklDRVM7IGNvdW50KyspCisgICAgICAgICAgICAgICAgZHN0LT5jb2VmZltjb3VudF1bY2hhbm5lbF0gPSBzcmMtPmNvZWZmW2NvdW50XVtjaGFubmVsXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY291bnQgPSAwOyBjb3VudCA8IE1BWF9NQVRSSUNFUzsgY291bnQrKykKKyAgICAgICAgICAgIGRzdC0+b3V0Y2hbY291bnRdID0gc3JjLT5vdXRjaFtjb3VudF07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5X3Jlc3RhcnRfZnJhbWVfcGFyYW1zKE1MUEVuY29kZUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN1YnN0cikKK3sKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjdHgtPm51bWJlcl9vZl9zdWJibG9ja3M7IGluZGV4KyspIHsKKyAgICAgICAgRGVjb2RpbmdQYXJhbXMgKmRwID0gY3R4LT5zZXFfZGVjb2RpbmdfcGFyYW1zICsgaW5kZXgqKGN0eC0+bnVtX3N1YnN0cmVhbXMpICsgc3Vic3RyOworICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKworICAgICAgICBjb3B5X21hdHJpeF9wYXJhbXMoJmRwLT5tYXRyaXhfcGFyYW1zLCAmY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zLT5tYXRyaXhfcGFyYW1zKTsKKworICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY3R4LT5hdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgQ2hhbm5lbFBhcmFtcyAqY3AgPSBjdHgtPnNlcV9jaGFubmVsX3BhcmFtcyArIGluZGV4KihjdHgtPmF2Y3R4LT5jaGFubmVscykgKyBjaGFubmVsOworICAgICAgICAgICAgdW5zaWduZWQgaW50IGZpbHRlcjsKKworICAgICAgICAgICAgZHAtPnF1YW50X3N0ZXBfc2l6ZVtjaGFubmVsXSA9IGN0eC0+Y3VyX2RlY29kaW5nX3BhcmFtcy0+cXVhbnRfc3RlcF9zaXplW2NoYW5uZWxdOworICAgICAgICAgICAgZHAtPm1hdHJpeF9wYXJhbXMuc2hpZnRbY2hhbm5lbF0gPSBjdHgtPmN1cl9kZWNvZGluZ19wYXJhbXMtPm1hdHJpeF9wYXJhbXMuc2hpZnRbY2hhbm5lbF07CisKKyAgICAgICAgICAgIGlmIChpbmRleCkKKyAgICAgICAgICAgICAgICBmb3IgKGZpbHRlciA9IDA7IGZpbHRlciA8IE5VTV9GSUxURVJTOyBmaWx0ZXIrKykKKyAgICAgICAgICAgICAgICAgICAgY29weV9maWx0ZXJfcGFyYW1zKGNwLCAmY3R4LT5jdXJfY2hhbm5lbF9wYXJhbXNbY2hhbm5lbF0sIGZpbHRlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKiBDbGVhcnMgYSBEZWNvZGluZ1BhcmFtcyBzdHJ1Y3QgdGhlIHdheSBpdCBzaG91bGQgYmUgYWZ0ZXIgYSByZXN0YXJ0IGhlYWRlci4gKi8KK3N0YXRpYyB2b2lkIGNsZWFyX2RlY29kaW5nX3BhcmFtcyhNTFBFbmNvZGVDb250ZXh0ICpjdHgsIERlY29kaW5nUGFyYW1zIGRlY29kaW5nX3BhcmFtc1tNQVhfU1VCU1RSRUFNU10pCit7CisgICAgdW5zaWduZWQgaW50IHN1YnN0cjsKKworICAgIGZvciAoc3Vic3RyID0gMDsgc3Vic3RyIDwgY3R4LT5udW1fc3Vic3RyZWFtczsgc3Vic3RyKyspIHsKKyAgICAgICAgRGVjb2RpbmdQYXJhbXMgKmRwID0gJmRlY29kaW5nX3BhcmFtc1tzdWJzdHJdOworCisgICAgICAgIGRwLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAgID0gMHhmZjsKKyAgICAgICAgZHAtPmJsb2Nrc2l6ZSAgICAgICAgICAgICAgPSA4OworCisgICAgICAgIG1lbXNldCgmZHAtPm1hdHJpeF9wYXJhbXMgLCAwLCBzaXplb2YoTWF0cml4UGFyYW1zICAgICAgICkpOworICAgICAgICBtZW1zZXQoZHAtPnF1YW50X3N0ZXBfc2l6ZSwgMCwgc2l6ZW9mKGRwLT5xdWFudF9zdGVwX3NpemUpKTsKKyAgICB9Cit9CisKKy8qKiBDbGVhcnMgYSBDaGFubmVsUGFyYW1zIHN0cnVjdCB0aGUgd2F5IGl0IHNob3VsZCBiZSBhZnRlciBhIHJlc3RhcnQgaGVhZGVyLiAqLworc3RhdGljIHZvaWQgY2xlYXJfY2hhbm5lbF9wYXJhbXMoTUxQRW5jb2RlQ29udGV4dCAqY3R4LCBDaGFubmVsUGFyYW1zIGNoYW5uZWxfcGFyYW1zW01BWF9DSEFOTkVMU10pCit7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWw7CisKKyAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY3R4LT5hdmN0eC0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICBDaGFubmVsUGFyYW1zICpjcCA9ICZjaGFubmVsX3BhcmFtc1tjaGFubmVsXTsKKworICAgICAgICBtZW1zZXQoJmNwLT5maWx0ZXJfcGFyYW1zLCAwLCBzaXplb2YoY3AtPmZpbHRlcl9wYXJhbXMpKTsKKworICAgICAgICAvKiBEZWZhdWx0IGF1ZGlvIGNvZGluZyBpcyAyNC1iaXQgcmF3IFBDTS4gKi8KKyAgICAgICAgY3AtPmh1ZmZfb2Zmc2V0ICAgICAgPSAgMDsKKyAgICAgICAgY3AtPmNvZGVib29rICAgICAgICAgPSAgMDsKKyAgICAgICAgY3AtPmh1ZmZfbHNicyAgICAgICAgPSAyNDsKKyAgICB9Cit9CisKKy8qKiBTZXRzIGRlZmF1bHQgdmFsZXMgaW4gb3VyIGVuY29kZXIgZm9yIGEgRGVjb2RpbmdQYXJhbXMgc3RydWN0LiAqLworc3RhdGljIHZvaWQgZGVmYXVsdF9kZWNvZGluZ19wYXJhbXMoTUxQRW5jb2RlQ29udGV4dCAqY3R4LAorICAgICBEZWNvZGluZ1BhcmFtcyBkZWNvZGluZ19wYXJhbXNbTUFYX1NVQlNUUkVBTVNdKQoreworICAgIHVuc2lnbmVkIGludCBzdWJzdHI7CisKKyAgICBjbGVhcl9kZWNvZGluZ19wYXJhbXMoY3R4LCBkZWNvZGluZ19wYXJhbXMpOworCisgICAgZm9yIChzdWJzdHIgPSAwOyBzdWJzdHIgPCBjdHgtPm51bV9zdWJzdHJlYW1zOyBzdWJzdHIrKykgeworICAgICAgICBEZWNvZGluZ1BhcmFtcyAqZHAgPSAmZGVjb2RpbmdfcGFyYW1zW3N1YnN0cl07CisgICAgICAgIHVpbnQ4X3QgcGFyYW1fcHJlc2VuY2VfZmxhZ3MgPSAwOworCisgICAgICAgIHBhcmFtX3ByZXNlbmNlX2ZsYWdzIHw9IFBBUkFNX0JMT0NLU0laRTsKKyAgICAgICAgcGFyYW1fcHJlc2VuY2VfZmxhZ3MgfD0gUEFSQU1fTUFUUklYOworICAgICAgICBwYXJhbV9wcmVzZW5jZV9mbGFncyB8PSBQQVJBTV9PVVRTSElGVDsKKyAgICAgICAgcGFyYW1fcHJlc2VuY2VfZmxhZ3MgfD0gUEFSQU1fUVVBTlRTVEVQOworICAgICAgICBwYXJhbV9wcmVzZW5jZV9mbGFncyB8PSBQQVJBTV9GSVI7CisvKiAgICAgIHBhcmFtX3ByZXNlbmNlX2ZsYWdzIHw9IFBBUkFNX0lJUjsgKi8KKyAgICAgICAgcGFyYW1fcHJlc2VuY2VfZmxhZ3MgfD0gUEFSQU1fSFVGRk9GRlNFVDsKKyAgICAgICAgcGFyYW1fcHJlc2VuY2VfZmxhZ3MgfD0gUEFSQU1fUFJFU0VOVDsKKworICAgICAgICBkcC0+cGFyYW1fcHJlc2VuY2VfZmxhZ3MgPSBwYXJhbV9wcmVzZW5jZV9mbGFnczsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQ2FsY3VsYXRlcyB0aGUgc21hbGxlc3QgbnVtYmVyIG9mIGJpdHMgaXQgdGFrZXMgdG8gZW5jb2RlIGEgZ2l2ZW4gc2lnbmVkCisgKiAgdmFsdWUgaW4gdHdvJ3MgY29tcGxlbWVudC4KKyAqLworc3RhdGljIGludCBpbmxpbmUgbnVtYmVyX3NiaXRzKGludCBudW1iZXIpCit7CisgICAgaWYgKG51bWJlciA8IDApCisgICAgICAgIG51bWJlcisrOworCisgICAgcmV0dXJuIGF2X2xvZzIoRkZBQlMobnVtYmVyKSkgKyAxICsgISFudW1iZXI7Cit9CisKK2VudW0gSW5wdXRCaXREZXB0aCB7CisgICAgQklUU18xNiwKKyAgICBCSVRTXzIwLAorICAgIEJJVFNfMjQsCit9OworCitzdGF0aWMgaW50IG1scF9wZWFrX2JpdHJhdGUoaW50IHBlYWtfYml0cmF0ZSwgaW50IHNhbXBsZV9yYXRlKQoreworICAgIHJldHVybiAoKHBlYWtfYml0cmF0ZSA8PCA0KSAtIDgpIC8gc2FtcGxlX3JhdGU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBtbHBfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1MUEVuY29kZUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdW5zaWduZWQgaW50IHN1YnN0ciwgaW5kZXg7CisgICAgdW5zaWduZWQgaW50IHN1bSA9IDA7CisgICAgdW5zaWduZWQgaW50IHNpemU7CisgICAgaW50IHJldDsKKworICAgIGN0eC0+YXZjdHggPSBhdmN0eDsKKworICAgIHN3aXRjaCAoYXZjdHgtPnNhbXBsZV9yYXRlKSB7CisgICAgY2FzZSA0NDEwMCA8PCAwOgorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSAgICAgICAgID0gNDAgIDw8IDA7CisgICAgICAgIGN0eC0+Y29kZWRfc2FtcGxlX3JhdGVbMF0gPSAweDA4ICsgMDsKKyAgICAgICAgY3R4LT5mcyAgICAgICAgICAgICAgICAgICA9IDB4MDggKyAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ0MTAwIDw8IDE6CisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplICAgICAgICAgPSA0MCAgPDwgMTsKKyAgICAgICAgY3R4LT5jb2RlZF9zYW1wbGVfcmF0ZVswXSA9IDB4MDggKyAxOworICAgICAgICBjdHgtPmZzICAgICAgICAgICAgICAgICAgID0gMHgwQyArIDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDQxMDAgPDwgMjoKKyAgICAgICAgY3R4LT5zdWJzdHJlYW1faW5mbyAgICAgIHw9IFNVQlNUUkVBTV9JTkZPX0hJR0hfUkFURTsKKyAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUgICAgICAgICA9IDQwICA8PCAyOworICAgICAgICBjdHgtPmNvZGVkX3NhbXBsZV9yYXRlWzBdID0gMHgwOCArIDI7CisgICAgICAgIGN0eC0+ZnMgICAgICAgICAgICAgICAgICAgPSAweDEwICsgMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0ODAwMCA8PCAwOgorICAgICAgICBhdmN0eC0+ZnJhbWVfc2l6ZSAgICAgICAgID0gNDAgIDw8IDA7CisgICAgICAgIGN0eC0+Y29kZWRfc2FtcGxlX3JhdGVbMF0gPSAweDAwICsgMDsKKyAgICAgICAgY3R4LT5mcyAgICAgICAgICAgICAgICAgICA9IDB4MDggKyAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDAwIDw8IDE6CisgICAgICAgIGF2Y3R4LT5mcmFtZV9zaXplICAgICAgICAgPSA0MCAgPDwgMTsKKyAgICAgICAgY3R4LT5jb2RlZF9zYW1wbGVfcmF0ZVswXSA9IDB4MDAgKyAxOworICAgICAgICBjdHgtPmZzICAgICAgICAgICAgICAgICAgID0gMHgwQyArIDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwMDAgPDwgMjoKKyAgICAgICAgY3R4LT5zdWJzdHJlYW1faW5mbyAgICAgIHw9IFNVQlNUUkVBTV9JTkZPX0hJR0hfUkFURTsKKyAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUgICAgICAgICA9IDQwICA8PCAyOworICAgICAgICBjdHgtPmNvZGVkX3NhbXBsZV9yYXRlWzBdID0gMHgwMCArIDI7CisgICAgICAgIGN0eC0+ZnMgICAgICAgICAgICAgICAgICAgPSAweDEwICsgMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZSAlZC4gU3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlIHJhdGVzIGFyZSA0NDEwMCwgODgyMDAsIDE3NjQwMCwgNDgwMDAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOTYwMDAsIGFuZCAxOTIwMDAuXG4iLCBhdmN0eC0+c2FtcGxlX3JhdGUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGN0eC0+Y29kZWRfc2FtcGxlX3JhdGVbMV0gPSAtMSAmIDB4ZjsKKworICAgIC8qIFRPRE8gS2VlcCBjb3VudCBvZiBiaXRyYXRlIGFuZCBjYWxjdWxhdGUgcmVhbCB2YWx1ZS4gKi8KKyAgICBjdHgtPmNvZGVkX3BlYWtfYml0cmF0ZSA9IG1scF9wZWFrX2JpdHJhdGUoOTYwMDAwMCwgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKworICAgIC8qIFRPRE8gc3VwcG9ydCBtb3JlIGNoYW5uZWxzLiAqLworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiT25seSBtb25vIGFuZCBzdGVyZW8gYXJlIHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50LlxuIik7CisgICAgfQorCisgICAgY3R4LT5zdWJzdHJlYW1faW5mbyB8PSBTVUJTVFJFQU1fSU5GT19BTFdBWVNfU0VUOworICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPD0gMikgeworICAgICAgICBjdHgtPnN1YnN0cmVhbV9pbmZvIHw9IFNVQlNUUkVBTV9JTkZPX01BWF8yX0NIQU47CisgICAgfQorCisgICAgc3dpdGNoIChhdmN0eC0+c2FtcGxlX2ZtdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6CisgICAgICAgIGN0eC0+Y29kZWRfc2FtcGxlX2ZtdFswXSA9IEJJVFNfMTY7CisgICAgICAgIGN0eC0+d29yZGxlbmd0aCA9IDE2OworICAgICAgICBhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9IDE2OworICAgICAgICBicmVhazsKKyAgICAvKiBUT0RPIDIwIGJpdHM6ICovCisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMjoKKyAgICAgICAgY3R4LT5jb2RlZF9zYW1wbGVfZm10WzBdID0gQklUU18yNDsKKyAgICAgICAgY3R4LT53b3JkbGVuZ3RoID0gMjQ7CisgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMjQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2FtcGxlIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiAiCisgICAgICAgICAgICAgICAiT25seSAxNi0gYW5kIDI0LWJpdCBzYW1wbGVzIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjdHgtPmNvZGVkX3NhbXBsZV9mbXRbMV0gPSAtMSAmIDB4ZjsKKworICAgIGN0eC0+ZHRzID0gLWF2Y3R4LT5mcmFtZV9zaXplOworCisgICAgY3R4LT5udW1fY2hhbm5lbHMgPSBhdmN0eC0+Y2hhbm5lbHMgKyAyOyAvKiArMiBub2lzZSBjaGFubmVscyAqLworICAgIGN0eC0+b25lX3NhbXBsZV9idWZmZXJfc2l6ZSA9IGF2Y3R4LT5mcmFtZV9zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY3R4LT5udW1fY2hhbm5lbHM7CisgICAgLyogVE9ETyBMZXQgdXNlciBwYXNzIG1ham9yIGhlYWRlciBpbnRlcnZhbCBhcyBwYXJhbWV0ZXIuICovCisgICAgY3R4LT5tYXhfcmVzdGFydF9pbnRlcnZhbCA9IE1BSk9SX0hFQURFUl9JTlRFUlZBTDsKKworICAgIGN0eC0+bWF4X2NvZGVib29rX3NlYXJjaCA9IDM7CisgICAgY3R4LT5taW5fcmVzdGFydF9pbnRlcnZhbCA9IE1BSk9SX0hFQURFUl9JTlRFUlZBTDsKKyAgICBjdHgtPnJlc3RhcnRfaW50ZXJ2YWxzID0gY3R4LT5tYXhfcmVzdGFydF9pbnRlcnZhbCAvIGN0eC0+bWluX3Jlc3RhcnRfaW50ZXJ2YWw7CisKKyAgICAvKiBUT0RPIExldCB1c2VyIHBhc3MgcGFyYW1ldGVycyBmb3IgTFBDIGZpbHRlci4gKi8KKworICAgIHNpemUgPSBhdmN0eC0+ZnJhbWVfc2l6ZSAqIGN0eC0+bWF4X3Jlc3RhcnRfaW50ZXJ2YWw7CisKKyAgICBjdHgtPmxwY19zYW1wbGVfYnVmZmVyID0gYXZfbWFsbG9jX2FycmF5KHNpemUsIHNpemVvZihpbnQzMl90KSk7CisgICAgaWYgKCFjdHgtPmxwY19zYW1wbGVfYnVmZmVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBidWZmZXJpbmcgc2FtcGxlcy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHNpemUgPSBjdHgtPm9uZV9zYW1wbGVfYnVmZmVyX3NpemUgKiBjdHgtPm1heF9yZXN0YXJ0X2ludGVydmFsOworCisgICAgY3R4LT5tYWpvcl9zY3JhdGNoX2J1ZmZlciA9IGF2X21hbGxvY19hcnJheShzaXplLCBzaXplb2YoaW50MzJfdCkpOworICAgIGlmICghY3R4LT5tYWpvcl9zY3JhdGNoX2J1ZmZlcikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgYnVmZmVyaW5nIHNhbXBsZXMuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBjdHgtPm1ham9yX2lub3V0X2J1ZmZlciA9IGF2X21hbGxvY19hcnJheShzaXplLCBzaXplb2YoaW50MzJfdCkpOworICAgIGlmICghY3R4LT5tYWpvcl9pbm91dF9idWZmZXIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGJ1ZmZlcmluZyBzYW1wbGVzLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZmZfbWxwX2luaXRfY3JjKCk7CisKKyAgICBjdHgtPm51bV9zdWJzdHJlYW1zID0gMTsgLy8gVE9ETzogY2hhbmdlIHRoaXMgYWZ0ZXIgYWRkaW5nIG11bHRpLWNoYW5uZWwgc3VwcG9ydCBmb3IgVHJ1ZUhECisKKyAgICBpZiAoY3R4LT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUxQKSB7CisgICAgICAgIC8qIE1MUCAqLworICAgICAgICBzd2l0Y2goYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUX01PTk86CisgICAgICAgICAgICBjdHgtPmNoYW5uZWxfYXJyYW5nZW1lbnQgPSAwOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfU1RFUkVPOgorICAgICAgICAgICAgY3R4LT5jaGFubmVsX2FycmFuZ2VtZW50ID0gMTsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzJfMToKKyAgICAgICAgICAgIGN0eC0+Y2hhbm5lbF9hcnJhbmdlbWVudCA9IDI7IGJyZWFrOworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF9RVUFEOgorICAgICAgICAgICAgY3R4LT5jaGFubmVsX2FycmFuZ2VtZW50ID0gMzsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzJQT0lOVDE6CisgICAgICAgICAgICBjdHgtPmNoYW5uZWxfYXJyYW5nZW1lbnQgPSA0OyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfU1VSUk9VTkQ6CisgICAgICAgICAgICBjdHgtPmNoYW5uZWxfYXJyYW5nZW1lbnQgPSA3OyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfNFBPSU5UMDoKKyAgICAgICAgICAgIGN0eC0+Y2hhbm5lbF9hcnJhbmdlbWVudCA9IDg7IGJyZWFrOworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0s6CisgICAgICAgICAgICBjdHgtPmNoYW5uZWxfYXJyYW5nZW1lbnQgPSA5OyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfM1BPSU5UMToKKyAgICAgICAgICAgIGN0eC0+Y2hhbm5lbF9hcnJhbmdlbWVudCA9IDEwOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfNFBPSU5UMToKKyAgICAgICAgICAgIGN0eC0+Y2hhbm5lbF9hcnJhbmdlbWVudCA9IDExOyBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLOgorICAgICAgICAgICAgY3R4LT5jaGFubmVsX2FycmFuZ2VtZW50ID0gMTI7IGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjaGFubmVsIGFycmFuZ2VtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBjdHgtPmZsYWdzID0gRkxBR1NfRFZEQTsKKyAgICAgICAgY3R4LT5jaGFubmVsX29jY3VwYW5jeSA9IGZmX21scF9jaF9pbmZvW2N0eC0+Y2hhbm5lbF9hcnJhbmdlbWVudF0uY2hhbm5lbF9vY2N1cGFuY3k7CisgICAgICAgIGN0eC0+c3VtbWFyeV9pbmZvICAgICAgPSBmZl9tbHBfY2hfaW5mb1tjdHgtPmNoYW5uZWxfYXJyYW5nZW1lbnRdLnN1bW1hcnlfaW5mbyAgICAgOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRydWVIRCAqLworICAgICAgICBzd2l0Y2goYXZjdHgtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUX1NURVJFTzoKKyAgICAgICAgICAgIGN0eC0+Y2hfbW9kaWZpZXJfdGhkMCAgICA9IDA7CisgICAgICAgICAgICBjdHgtPmNoX21vZGlmaWVyX3RoZDEgICAgPSAwOworICAgICAgICAgICAgY3R4LT5jaF9tb2RpZmllcl90aGQyICAgID0gMDsKKyAgICAgICAgICAgIGN0eC0+Y2hhbm5lbF9hcnJhbmdlbWVudCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLOgorICAgICAgICAgICAgY3R4LT5jaF9tb2RpZmllcl90aGQwICAgID0gMTsKKyAgICAgICAgICAgIGN0eC0+Y2hfbW9kaWZpZXJfdGhkMSAgICA9IDE7CisgICAgICAgICAgICBjdHgtPmNoX21vZGlmaWVyX3RoZDIgICAgPSAxOworICAgICAgICAgICAgY3R4LT5jaGFubmVsX2FycmFuZ2VtZW50ID0gMTE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLOgorICAgICAgICAgICAgY3R4LT5jaF9tb2RpZmllcl90aGQwICAgID0gMjsKKyAgICAgICAgICAgIGN0eC0+Y2hfbW9kaWZpZXJfdGhkMSAgICA9IDE7CisgICAgICAgICAgICBjdHgtPmNoX21vZGlmaWVyX3RoZDIgICAgPSAyOworICAgICAgICAgICAgY3R4LT5jaGFubmVsX2FycmFuZ2VtZW50ID0gMTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY2hhbm5lbCBhcnJhbmdlbWVudFxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5mbGFncyA9IDA7CisgICAgICAgIGN0eC0+Y2hhbm5lbF9vY2N1cGFuY3kgPSAwOworICAgICAgICBjdHgtPnN1bW1hcnlfaW5mbyA9IDA7CisgICAgfQorCisgICAgc2l6ZSA9IHNpemVvZih1bnNpZ25lZCBpbnQpICogY3R4LT5tYXhfcmVzdGFydF9pbnRlcnZhbDsKKworICAgIGN0eC0+ZnJhbWVfc2l6ZSA9IGF2X21hbGxvYyhzaXplKTsKKyAgICBpZiAoIWN0eC0+ZnJhbWVfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+bWF4X291dHB1dF9iaXRzID0gYXZfbWFsbG9jKHNpemUpOworICAgIGlmICghY3R4LT5tYXhfb3V0cHV0X2JpdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzaXplID0gc2l6ZW9mKGludDMyX3QpCisgICAgICAgICAqIGN0eC0+bnVtX3N1YnN0cmVhbXMgKiBjdHgtPm1heF9yZXN0YXJ0X2ludGVydmFsOworCisgICAgY3R4LT5sb3NzbGVzc19jaGVja19kYXRhID0gYXZfbWFsbG9jKHNpemUpOworICAgIGlmICghY3R4LT5sb3NzbGVzc19jaGVja19kYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3R4LT5yZXN0YXJ0X2ludGVydmFsczsgaW5kZXgrKykgeworICAgICAgICBjdHgtPnNlcV9vZmZzZXRbaW5kZXhdID0gc3VtOworICAgICAgICBjdHgtPnNlcV9zaXplICBbaW5kZXhdID0gKChpbmRleCArIDEpICogY3R4LT5taW5fcmVzdGFydF9pbnRlcnZhbCkgKyAxOworICAgICAgICBzdW0gKz0gY3R4LT5zZXFfc2l6ZVtpbmRleF07CisgICAgfQorICAgIGN0eC0+c2VxdWVuY2Vfc2l6ZSA9IHN1bTsKKyAgICBzaXplID0gc2l6ZW9mKENoYW5uZWxQYXJhbXMpCisgICAgICAgICAqIGN0eC0+cmVzdGFydF9pbnRlcnZhbHMgKiBjdHgtPnNlcXVlbmNlX3NpemUgKiBjdHgtPmF2Y3R4LT5jaGFubmVsczsKKyAgICBjdHgtPmNoYW5uZWxfcGFyYW1zID0gYXZfbWFsbG9jKHNpemUpOworICAgIGlmICghY3R4LT5jaGFubmVsX3BhcmFtcykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgYW5hbHlzaXMgY29udGV4dC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHNpemUgPSBzaXplb2YoRGVjb2RpbmdQYXJhbXMpCisgICAgICAgICAqIGN0eC0+cmVzdGFydF9pbnRlcnZhbHMgKiBjdHgtPnNlcXVlbmNlX3NpemUgKiBjdHgtPm51bV9zdWJzdHJlYW1zOworICAgIGN0eC0+ZGVjb2RpbmdfcGFyYW1zID0gYXZfbWFsbG9jKHNpemUpOworICAgIGlmICghY3R4LT5kZWNvZGluZ19wYXJhbXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGFuYWx5c2lzIGNvbnRleHQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmb3IgKHN1YnN0ciA9IDA7IHN1YnN0ciA8IGN0eC0+bnVtX3N1YnN0cmVhbXM7IHN1YnN0cisrKSB7CisgICAgICAgIFJlc3RhcnRIZWFkZXIgICpyaCA9ICZjdHgtPnJlc3RhcnRfaGVhZGVyIFtzdWJzdHJdOworCisgICAgICAgIC8qIFRPRE8gc2VlIGlmIG5vaXNlZ2VuX3NlZWQgaXMgcmVhbGx5IHdvcnRoIGl0LiAqLworICAgICAgICByaC0+bm9pc2VnZW5fc2VlZCAgICAgID0gMDsKKworICAgICAgICByaC0+bWluX2NoYW5uZWwgICAgICAgID0gMDsKKyAgICAgICAgcmgtPm1heF9jaGFubmVsICAgICAgICA9IGF2Y3R4LT5jaGFubmVscyAtIDE7CisgICAgICAgIC8qIEZJWE1FOiB0aGlzIHdvcmtzIGZvciAxIGFuZCAyIGNoYW5uZWxzLCBidXQgY2hlY2sgZm9yIG1vcmUgKi8KKyAgICAgICAgcmgtPm1heF9tYXRyaXhfY2hhbm5lbCA9IHJoLT5tYXhfY2hhbm5lbDsKKyAgICB9CisKKyAgICBjbGVhcl9jaGFubmVsX3BhcmFtcyhjdHgsIHJlc3RhcnRfY2hhbm5lbF9wYXJhbXMpOworICAgIGNsZWFyX2RlY29kaW5nX3BhcmFtcyhjdHgsIHJlc3RhcnRfZGVjb2RpbmdfcGFyYW1zKTsKKworICAgIGlmICgocmV0ID0gZmZfbHBjX2luaXQoJmN0eC0+bHBjX2N0eCwgY3R4LT5udW1iZXJfb2Zfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgTUxQX01BWF9MUENfT1JERVIsIEZGX0xQQ19UWVBFX0xFVklOU09OKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBMUEMgY29udGV4dC5cbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGZmX2FmX3F1ZXVlX2luaXQoYXZjdHgsICZjdHgtPmFmcSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKiogRnVuY3Rpb25zIHRoYXQgd3JpdGUgdG8gdGhlIGJpdHN0cmVhbSAqKioqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqIFdyaXRlcyBhIG1ham9yIHN5bmMgaGVhZGVyIHRvIHRoZSBiaXRzdHJlYW0uICovCitzdGF0aWMgdm9pZCB3cml0ZV9tYWpvcl9zeW5jKE1MUEVuY29kZUNvbnRleHQgKmN0eCwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKworICAgIGluaXRfcHV0X2JpdHMoJnBiLCBidWYsIGJ1Zl9zaXplKTsKKworICAgIHB1dF9iaXRzKCZwYiwgMjQsIFNZTkNfTUFKT1IgICAgICAgICAgICAgICApOworCisgICAgaWYgKGN0eC0+YXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01MUCkgeworICAgICAgICBwdXRfYml0cygmcGIsICA4LCBTWU5DX01MUCAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAgNCwgY3R4LT5jb2RlZF9zYW1wbGVfZm10IFswXSk7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgIDQsIGN0eC0+Y29kZWRfc2FtcGxlX2ZtdCBbMV0pOworICAgICAgICBwdXRfYml0cygmcGIsICA0LCBjdHgtPmNvZGVkX3NhbXBsZV9yYXRlWzBdKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAgNCwgY3R4LT5jb2RlZF9zYW1wbGVfcmF0ZVsxXSk7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgIDQsIDAgICAgICAgICAgICAgICAgICAgICAgICApOyAvKiBpZ25vcmVkICovCisgICAgICAgIHB1dF9iaXRzKCZwYiwgIDQsIDAgICAgICAgICAgICAgICAgICAgICAgICApOyAvKiBtdWx0aV9jaGFubmVsX3R5cGUgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiLCAgMywgMCAgICAgICAgICAgICAgICAgICAgICAgICk7IC8qIGlnbm9yZWQgKi8KKyAgICAgICAgcHV0X2JpdHMoJnBiLCAgNSwgY3R4LT5jaGFubmVsX2FycmFuZ2VtZW50ICk7CisgICAgfSBlbHNlIGlmIChjdHgtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9UUlVFSEQpIHsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAgOCwgU1lOQ19UUlVFSEQgICAgICAgICAgICAgICk7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgIDQsIGN0eC0+Y29kZWRfc2FtcGxlX3JhdGVbMF0pOworICAgICAgICBwdXRfYml0cygmcGIsICA0LCAwICAgICAgICAgICAgICAgICAgICAgICAgKTsgLyogaWdub3JlZCAqLworICAgICAgICBwdXRfYml0cygmcGIsICAyLCBjdHgtPmNoX21vZGlmaWVyX3RoZDAgICAgKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAgMiwgY3R4LT5jaF9tb2RpZmllcl90aGQxICAgICk7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgIDUsIGN0eC0+Y2hhbm5lbF9hcnJhbmdlbWVudCApOworICAgICAgICBwdXRfYml0cygmcGIsICAyLCBjdHgtPmNoX21vZGlmaWVyX3RoZDIgICAgKTsKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxMywgY3R4LT5jaGFubmVsX2FycmFuZ2VtZW50ICk7CisgICAgfQorCisgICAgcHV0X2JpdHMoJnBiLCAxNiwgTUFKT1JfU1lOQ19JTkZPX1NJR05BVFVSRSk7CisgICAgcHV0X2JpdHMoJnBiLCAxNiwgY3R4LT5mbGFncyAgICAgICAgICAgICAgICk7CisgICAgcHV0X2JpdHMoJnBiLCAxNiwgMCAgICAgICAgICAgICAgICAgICAgICAgICk7IC8qIGlnbm9yZWQgKi8KKyAgICBwdXRfYml0cygmcGIsICAxLCAxICAgICAgICAgICAgICAgICAgICAgICAgKTsgLyogaXNfdmJyICovCisgICAgcHV0X2JpdHMoJnBiLCAxNSwgY3R4LT5jb2RlZF9wZWFrX2JpdHJhdGUgICk7CisgICAgcHV0X2JpdHMoJnBiLCAgNCwgMSAgICAgICAgICAgICAgICAgICAgICAgICk7IC8qIG51bV9zdWJzdHJlYW1zICovCisgICAgcHV0X2JpdHMoJnBiLCAgNCwgMHgxICAgICAgICAgICAgICAgICAgICAgICk7IC8qIGlnbm9yZWQgKi8KKworICAgIC8qIGNoYW5uZWxfbWVhbmluZyAqLworICAgIHB1dF9iaXRzKCZwYiwgIDgsIGN0eC0+c3Vic3RyZWFtX2luZm8gICAgICApOworICAgIHB1dF9iaXRzKCZwYiwgIDUsIGN0eC0+ZnMgICAgICAgICAgICAgICAgICApOworICAgIHB1dF9iaXRzKCZwYiwgIDUsIGN0eC0+d29yZGxlbmd0aCAgICAgICAgICApOworICAgIHB1dF9iaXRzKCZwYiwgIDYsIGN0eC0+Y2hhbm5lbF9vY2N1cGFuY3kgICApOworICAgIHB1dF9iaXRzKCZwYiwgIDMsIDAgICAgICAgICAgICAgICAgICAgICAgICApOyAvKiBpZ25vcmVkICovCisgICAgcHV0X2JpdHMoJnBiLCAxMCwgMCAgICAgICAgICAgICAgICAgICAgICAgICk7IC8qIHNwZWFrZXJfbGF5b3V0ICovCisgICAgcHV0X2JpdHMoJnBiLCAgMywgMCAgICAgICAgICAgICAgICAgICAgICAgICk7IC8qIGNvcHlfcHJvdGVjdGlvbiAqLworICAgIHB1dF9iaXRzKCZwYiwgMTYsIDB4ODA4MCAgICAgICAgICAgICAgICAgICApOyAvKiBpZ25vcmVkICovCisgICAgcHV0X2JpdHMoJnBiLCAgNywgMCAgICAgICAgICAgICAgICAgICAgICAgICk7IC8qIGlnbm9yZWQgKi8KKyAgICBwdXRfYml0cygmcGIsICA0LCAwICAgICAgICAgICAgICAgICAgICAgICAgKTsgLyogc291cmNlX2Zvcm1hdCAqLworICAgIHB1dF9iaXRzKCZwYiwgIDUsIGN0eC0+c3VtbWFyeV9pbmZvICAgICAgICApOworCisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKworICAgIEFWX1dMMTYoYnVmKzI2LCBmZl9tbHBfY2hlY2tzdW0xNihidWYsIDI2KSk7Cit9CisKKy8qKiBXcml0ZXMgYSByZXN0YXJ0IGhlYWRlciB0byB0aGUgYml0c3RyZWFtLiBEYW1hZ2VkIHN0cmVhbXMgY2FuIHN0YXJ0IGJlaW5nCisgKiAgZGVjb2RlZCBsb3NzbGVzc2x5IGFnYWluIGFmdGVyIHN1Y2ggYSBoZWFkZXIgYW5kIHRoZSBzdWJzZXF1ZW50IGRlY29kaW5nCisgKiAgcGFyYW1zIGhlYWRlci4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfcmVzdGFydF9oZWFkZXIoTUxQRW5jb2RlQ29udGV4dCAqY3R4LCBQdXRCaXRDb250ZXh0ICpwYikKK3sKKyAgICBSZXN0YXJ0SGVhZGVyICpyaCA9IGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyOworICAgIGludDMyX3QgbG9zc2xlc3NfY2hlY2sgPSB4b3JfMzJfdG9fOChyaC0+bG9zc2xlc3NfY2hlY2tfZGF0YSk7CisgICAgdW5zaWduZWQgaW50IHN0YXJ0X2NvdW50ID0gcHV0X2JpdHNfY291bnQocGIpOworICAgIFB1dEJpdENvbnRleHQgdG1wYjsKKyAgICB1aW50OF90IGNoZWNrc3VtOworICAgIHVuc2lnbmVkIGludCBjaDsKKworICAgIHB1dF9iaXRzKHBiLCAxNCwgMHgzMWVhICAgICAgICAgICAgICAgICk7IC8qIFRPRE8gMHgzMWViICovCisgICAgcHV0X2JpdHMocGIsIDE2LCBjdHgtPnRpbWVzdGFtcCAgICAgICAgKTsKKyAgICBwdXRfYml0cyhwYiwgIDQsIHJoLT5taW5fY2hhbm5lbCAgICAgICApOworICAgIHB1dF9iaXRzKHBiLCAgNCwgcmgtPm1heF9jaGFubmVsICAgICAgICk7CisgICAgcHV0X2JpdHMocGIsICA0LCByaC0+bWF4X21hdHJpeF9jaGFubmVsKTsKKyAgICBwdXRfYml0cyhwYiwgIDQsIHJoLT5ub2lzZV9zaGlmdCAgICAgICApOworICAgIHB1dF9iaXRzKHBiLCAyMywgcmgtPm5vaXNlZ2VuX3NlZWQgICAgICk7CisgICAgcHV0X2JpdHMocGIsICA0LCAwICAgICAgICAgICAgICAgICAgICAgKTsgLyogVE9ETyBtYXhfc2hpZnQgKi8KKyAgICBwdXRfYml0cyhwYiwgIDUsIHJoLT5tYXhfaHVmZl9sc2JzICAgICApOworICAgIHB1dF9iaXRzKHBiLCAgNSwgcmgtPm1heF9vdXRwdXRfYml0cyAgICk7CisgICAgcHV0X2JpdHMocGIsICA1LCByaC0+bWF4X291dHB1dF9iaXRzICAgKTsKKyAgICBwdXRfYml0cyhwYiwgIDEsIHJoLT5kYXRhX2NoZWNrX3ByZXNlbnQpOworICAgIHB1dF9iaXRzKHBiLCAgOCwgbG9zc2xlc3NfY2hlY2sgICAgICAgICk7CisgICAgcHV0X2JpdHMocGIsIDE2LCAwICAgICAgICAgICAgICAgICAgICAgKTsgLyogaWdub3JlZCAqLworCisgICAgZm9yIChjaCA9IDA7IGNoIDw9IHJoLT5tYXhfbWF0cml4X2NoYW5uZWw7IGNoKyspCisgICAgICAgIHB1dF9iaXRzKHBiLCA2LCBjaCk7CisKKyAgICAvKiBEYXRhIG11c3QgYmUgZmx1c2hlZCBmb3IgdGhlIGNoZWNrc3VtIHRvIGJlIGNvcnJlY3QuICovCisgICAgdG1wYiA9ICpwYjsKKyAgICBmbHVzaF9wdXRfYml0cygmdG1wYik7CisKKyAgICBjaGVja3N1bSA9IGZmX21scF9yZXN0YXJ0X2NoZWNrc3VtKHBiLT5idWYsIHB1dF9iaXRzX2NvdW50KHBiKSAtIHN0YXJ0X2NvdW50KTsKKworICAgIHB1dF9iaXRzKHBiLCAgOCwgY2hlY2tzdW0pOworfQorCisvKiogV3JpdGVzIG1hdHJpeCBwYXJhbXMgZm9yIGFsbCBwcmltaXRpdmUgbWF0cmljZXMgdG8gdGhlIGJpdHN0cmVhbS4gKi8KK3N0YXRpYyB2b2lkIHdyaXRlX21hdHJpeF9wYXJhbXMoTUxQRW5jb2RlQ29udGV4dCAqY3R4LCBQdXRCaXRDb250ZXh0ICpwYikKK3sKKyAgICBEZWNvZGluZ1BhcmFtcyAqZHAgPSBjdHgtPmN1cl9kZWNvZGluZ19wYXJhbXM7CisgICAgTWF0cml4UGFyYW1zICptcCA9ICZkcC0+bWF0cml4X3BhcmFtczsKKyAgICB1bnNpZ25lZCBpbnQgbWF0OworCisgICAgcHV0X2JpdHMocGIsIDQsIG1wLT5jb3VudCk7CisKKyAgICBmb3IgKG1hdCA9IDA7IG1hdCA8IG1wLT5jb3VudDsgbWF0KyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWw7CisKKyAgICAgICAgcHV0X2JpdHMocGIsIDQsIG1wLT5vdXRjaFttYXRdKTsgLyogbWF0cml4X291dF9jaCAqLworICAgICAgICBwdXRfYml0cyhwYiwgNCwgbXAtPmZiaXRzW21hdF0pOworICAgICAgICBwdXRfYml0cyhwYiwgMSwgMCAgICAgICAgICAgICApOyAvKiBsc2JfYnlwYXNzICovCisKKyAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGN0eC0+bnVtX2NoYW5uZWxzOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgY29lZmYgPSBtcC0+Y29lZmZbbWF0XVtjaGFubmVsXTsKKworICAgICAgICAgICAgaWYgKGNvZWZmKSB7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIDEpOworCisgICAgICAgICAgICAgICAgY29lZmYgPj49IDE0IC0gbXAtPmZiaXRzW21hdF07CisKKyAgICAgICAgICAgICAgICBwdXRfc2JpdHMocGIsIG1wLT5mYml0c1ttYXRdICsgMiwgY29lZmYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKiBXcml0ZXMgZmlsdGVyIHBhcmFtZXRlcnMgZm9yIG9uZSBmaWx0ZXIgdG8gdGhlIGJpdHN0cmVhbS4gKi8KK3N0YXRpYyB2b2lkIHdyaXRlX2ZpbHRlcl9wYXJhbXMoTUxQRW5jb2RlQ29udGV4dCAqY3R4LCBQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwsIHVuc2lnbmVkIGludCBmaWx0ZXIpCit7CisgICAgRmlsdGVyUGFyYW1zICpmcCA9ICZjdHgtPmN1cl9jaGFubmVsX3BhcmFtc1tjaGFubmVsXS5maWx0ZXJfcGFyYW1zW2ZpbHRlcl07CisKKyAgICBwdXRfYml0cyhwYiwgNCwgZnAtPm9yZGVyKTsKKworICAgIGlmIChmcC0+b3JkZXIgPiAwKSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQzMl90ICpmY29lZmYgPSBjdHgtPmN1cl9jaGFubmVsX3BhcmFtc1tjaGFubmVsXS5jb2VmZltmaWx0ZXJdOworCisgICAgICAgIHB1dF9iaXRzKHBiLCA0LCBmcC0+c2hpZnQgICAgICApOworICAgICAgICBwdXRfYml0cyhwYiwgNSwgZnAtPmNvZWZmX2JpdHMgKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIDMsIGZwLT5jb2VmZl9zaGlmdCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZwLT5vcmRlcjsgaSsrKSB7CisgICAgICAgICAgICBwdXRfc2JpdHMocGIsIGZwLT5jb2VmZl9iaXRzLCBmY29lZmZbaV0gPj4gZnAtPmNvZWZmX3NoaWZ0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRPRE8gc3RhdGUgZGF0YSBmb3IgSUlSIGZpbHRlci4gKi8KKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworICAgIH0KK30KKworLyoqIFdyaXRlcyBkZWNvZGluZyBwYXJhbWV0ZXJzIHRvIHRoZSBiaXRzdHJlYW0uIFRoZXNlIGNoYW5nZSB2ZXJ5IG9mdGVuLAorICogIHVzdWFsbHkgYXQgYWxtb3N0IGV2ZXJ5IGZyYW1lLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9kZWNvZGluZ19wYXJhbXMoTUxQRW5jb2RlQ29udGV4dCAqY3R4LCBQdXRCaXRDb250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW1zX2NoYW5nZWQpCit7CisgICAgRGVjb2RpbmdQYXJhbXMgKmRwID0gY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zOworICAgIFJlc3RhcnRIZWFkZXIgICpyaCA9IGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyOworICAgIE1hdHJpeFBhcmFtcyAqbXAgPSAmZHAtPm1hdHJpeF9wYXJhbXM7CisgICAgdW5zaWduZWQgaW50IGNoOworCisgICAgaWYgKGRwLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAhPSBQQVJBTVNfREVGQVVMVCAmJgorICAgICAgICBwYXJhbXNfY2hhbmdlZCAmIFBBUkFNX1BSRVNFTkNFX0ZMQUdTKSB7CisgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAxKTsKKyAgICAgICAgcHV0X2JpdHMocGIsIDgsIGRwLT5wYXJhbV9wcmVzZW5jZV9mbGFncyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworICAgIH0KKworICAgIGlmIChkcC0+cGFyYW1fcHJlc2VuY2VfZmxhZ3MgJiBQQVJBTV9CTE9DS1NJWkUpIHsKKyAgICAgICAgaWYgKHBhcmFtc19jaGFuZ2VkICAgICAgICYgUEFSQU1fQkxPQ0tTSVpFKSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgOSwgZHAtPmJsb2Nrc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZHAtPnBhcmFtX3ByZXNlbmNlX2ZsYWdzICYgUEFSQU1fTUFUUklYKSB7CisgICAgICAgIGlmIChwYXJhbXNfY2hhbmdlZCAgICAgICAmIFBBUkFNX01BVFJJWCkgeworICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIDEpOworICAgICAgICAgICAgd3JpdGVfbWF0cml4X3BhcmFtcyhjdHgsIHBiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkcC0+cGFyYW1fcHJlc2VuY2VfZmxhZ3MgJiBQQVJBTV9PVVRTSElGVCkgeworICAgICAgICBpZiAocGFyYW1zX2NoYW5nZWQgICAgICAgJiBQQVJBTV9PVVRTSElGVCkgeworICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIDEpOworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDw9IHJoLT5tYXhfbWF0cml4X2NoYW5uZWw7IGNoKyspCisgICAgICAgICAgICAgICAgcHV0X3NiaXRzKHBiLCA0LCBtcC0+c2hpZnRbY2hdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkcC0+cGFyYW1fcHJlc2VuY2VfZmxhZ3MgJiBQQVJBTV9RVUFOVFNURVApIHsKKyAgICAgICAgaWYgKHBhcmFtc19jaGFuZ2VkICAgICAgICYgUEFSQU1fUVVBTlRTVEVQKSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPD0gcmgtPm1heF9jaGFubmVsOyBjaCsrKQorICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCA0LCBkcC0+cXVhbnRfc3RlcF9zaXplW2NoXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNoID0gcmgtPm1pbl9jaGFubmVsOyBjaCA8PSByaC0+bWF4X2NoYW5uZWw7IGNoKyspIHsKKyAgICAgICAgQ2hhbm5lbFBhcmFtcyAqY3AgPSAmY3R4LT5jdXJfY2hhbm5lbF9wYXJhbXNbY2hdOworCisgICAgICAgIGlmIChkcC0+cGFyYW1fcHJlc2VuY2VfZmxhZ3MgJiAweEYpIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAxKTsKKworICAgICAgICAgICAgaWYgKGRwLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAmIFBBUkFNX0ZJUikgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbXNfY2hhbmdlZCAgICAgICAmIFBBUkFNX0ZJUikgeworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2ZpbHRlcl9wYXJhbXMoY3R4LCBwYiwgY2gsIEZJUik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRwLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAmIFBBUkFNX0lJUikgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbXNfY2hhbmdlZCAgICAgICAmIFBBUkFNX0lJUikgeworICAgICAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgMSwgMSk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlX2ZpbHRlcl9wYXJhbXMoY3R4LCBwYiwgY2gsIElJUik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMocGIsIDEsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRwLT5wYXJhbV9wcmVzZW5jZV9mbGFncyAmIFBBUkFNX0hVRkZPRkZTRVQpIHsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1zX2NoYW5nZWQgICAgICAgJiBQQVJBTV9IVUZGT0ZGU0VUKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzIChwYiwgIDEsIDEpOworICAgICAgICAgICAgICAgICAgICBwdXRfc2JpdHMocGIsIDE1LCBjcC0+aHVmZl9vZmZzZXQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAyLCBjcC0+Y29kZWJvb2sgKTsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCA1LCBjcC0+aHVmZl9sc2JzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqIFdyaXRlcyB0aGUgcmVzaWR1YWxzIHRvIHRoZSBiaXRzdHJlYW0uIFRoYXQgaXMsIHRoZSBWTEMgY29kZXMgZnJvbSB0aGUKKyAqICBjb2RlYm9va3MgKGlmIGFueSBpcyB1c2VkKSwgYW5kIHRoZW4gdGhlIHJlc2lkdWFsLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9ibG9ja19kYXRhKE1MUEVuY29kZUNvbnRleHQgKmN0eCwgUHV0Qml0Q29udGV4dCAqcGIpCit7CisgICAgRGVjb2RpbmdQYXJhbXMgKmRwID0gY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zOworICAgIFJlc3RhcnRIZWFkZXIgICpyaCA9IGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyOworICAgIGludDMyX3QgKnNhbXBsZV9idWZmZXIgPSBjdHgtPndyaXRlX2J1ZmZlcjsKKyAgICBpbnQzMl90IHNpZ25faHVmZl9vZmZzZXRbTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQgY29kZWJvb2tfaW5kZXggICAgICBbTUFYX0NIQU5ORUxTXTsKKyAgICBpbnQgbHNiX2JpdHMgICAgICAgICAgICBbTUFYX0NIQU5ORUxTXTsKKyAgICB1bnNpZ25lZCBpbnQgaSwgY2g7CisKKyAgICBmb3IgKGNoID0gcmgtPm1pbl9jaGFubmVsOyBjaCA8PSByaC0+bWF4X2NoYW5uZWw7IGNoKyspIHsKKyAgICAgICAgQ2hhbm5lbFBhcmFtcyAqY3AgPSAmY3R4LT5jdXJfY2hhbm5lbF9wYXJhbXNbY2hdOworICAgICAgICBpbnQgc2lnbl9zaGlmdDsKKworICAgICAgICBsc2JfYml0cyAgICAgICAgW2NoXSA9IGNwLT5odWZmX2xzYnMgLSBkcC0+cXVhbnRfc3RlcF9zaXplW2NoXTsKKyAgICAgICAgY29kZWJvb2tfaW5kZXggIFtjaF0gPSBjcC0+Y29kZWJvb2sgIC0gMTsKKyAgICAgICAgc2lnbl9odWZmX29mZnNldFtjaF0gPSBjcC0+aHVmZl9vZmZzZXQ7CisKKyAgICAgICAgc2lnbl9zaGlmdCA9IGxzYl9iaXRzW2NoXSAtIDE7CisKKyAgICAgICAgaWYgKGNwLT5jb2RlYm9vayA+IDApIHsKKyAgICAgICAgICAgIHNpZ25faHVmZl9vZmZzZXRbY2hdIC09IDcgPDwgbHNiX2JpdHNbY2hdOworICAgICAgICAgICAgc2lnbl9zaGlmdCArPSAzIC0gY3AtPmNvZGVib29rOworICAgICAgICB9CisKKyAgICAgICAgLyogVW5zaWduIGlmIG5lZWRlZC4gKi8KKyAgICAgICAgaWYgKHNpZ25fc2hpZnQgPj0gMCkKKyAgICAgICAgICAgIHNpZ25faHVmZl9vZmZzZXRbY2hdIC09IDEgPDwgc2lnbl9zaGlmdDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHAtPmJsb2Nrc2l6ZTsgaSsrKSB7CisgICAgICAgIGZvciAoY2ggPSByaC0+bWluX2NoYW5uZWw7IGNoIDw9IHJoLT5tYXhfY2hhbm5lbDsgY2grKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGUgPSAqc2FtcGxlX2J1ZmZlcisrID4+IGRwLT5xdWFudF9zdGVwX3NpemVbY2hdOworCisgICAgICAgICAgICBzYW1wbGUgLT0gc2lnbl9odWZmX29mZnNldFtjaF07CisKKyAgICAgICAgICAgIGlmIChjb2RlYm9va19pbmRleFtjaF0gPj0gMCkgeworICAgICAgICAgICAgICAgIGludCB2bGMgPSBzYW1wbGUgPj4gbHNiX2JpdHNbY2hdOworICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCBmZl9tbHBfaHVmZm1hbl90YWJsZXNbY29kZWJvb2tfaW5kZXhbY2hdXVt2bGNdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9tbHBfaHVmZm1hbl90YWJsZXNbY29kZWJvb2tfaW5kZXhbY2hdXVt2bGNdWzBdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHV0X3NiaXRzKHBiLCBsc2JfYml0c1tjaF0sIHNhbXBsZSk7CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxlX2J1ZmZlciArPSAyOyAvKiBub2lzZSBjaGFubmVscyAqLworICAgIH0KKworICAgIGN0eC0+d3JpdGVfYnVmZmVyID0gc2FtcGxlX2J1ZmZlcjsKK30KKworLyoqIFdyaXRlcyB0aGUgc3Vic3RyZWFtcyBkYXRhIHRvIHRoZSBiaXRzdHJlYW0uICovCitzdGF0aWMgdWludDhfdCAqd3JpdGVfc3Vic3RycyhNTFBFbmNvZGVDb250ZXh0ICpjdHgsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3RhcnRfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzdWJzdHJlYW1fZGF0YV9sZW5bTUFYX1NVQlNUUkVBTVNdKQoreworICAgIGludDMyX3QgKmxvc3NsZXNzX2NoZWNrX2RhdGEgPSBjdHgtPmxvc3NsZXNzX2NoZWNrX2RhdGE7CisgICAgdW5zaWduZWQgaW50IHN1YnN0cjsKKyAgICBpbnQgZW5kID0gMDsKKworICAgIGxvc3NsZXNzX2NoZWNrX2RhdGEgKz0gY3R4LT5mcmFtZV9pbmRleCAqIGN0eC0+bnVtX3N1YnN0cmVhbXM7CisKKyAgICBmb3IgKHN1YnN0ciA9IDA7IHN1YnN0ciA8IGN0eC0+bnVtX3N1YnN0cmVhbXM7IHN1YnN0cisrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBjdXJfc3ViYmxvY2tfaW5kZXggPSBjdHgtPm1ham9yX2N1cl9zdWJibG9ja19pbmRleDsKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zdWJibG9ja3MgPSBjdHgtPm1ham9yX2ZpbHRlcl9zdGF0ZV9zdWJibG9jazsKKyAgICAgICAgdW5zaWduZWQgaW50IHN1YmJsb2NrOworICAgICAgICBSZXN0YXJ0SGVhZGVyICAqcmggPSAmY3R4LT5yZXN0YXJ0X2hlYWRlciBbc3Vic3RyXTsKKyAgICAgICAgaW50IHN1YnN0cl9yZXN0YXJ0X2ZyYW1lID0gcmVzdGFydF9mcmFtZTsKKyAgICAgICAgdWludDhfdCBwYXJpdHksIGNoZWNrc3VtOworICAgICAgICBQdXRCaXRDb250ZXh0IHBiLCB0bXBiOworICAgICAgICBpbnQgcGFyYW1zX2NoYW5nZWQ7CisKKyAgICAgICAgY3R4LT5jdXJfcmVzdGFydF9oZWFkZXIgPSByaDsKKworICAgICAgICBpbml0X3B1dF9iaXRzKCZwYiwgYnVmLCBidWZfc2l6ZSk7CisKKyAgICAgICAgZm9yIChzdWJibG9jayA9IDA7IHN1YmJsb2NrIDw9IG51bV9zdWJibG9ja3M7IHN1YmJsb2NrKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdWJibG9ja19pbmRleDsKKworICAgICAgICAgICAgc3ViYmxvY2tfaW5kZXggPSBjdXJfc3ViYmxvY2tfaW5kZXgrKzsKKworICAgICAgICAgICAgY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zID0gJmN0eC0+bWFqb3JfZGVjb2RpbmdfcGFyYW1zW3N1YmJsb2NrX2luZGV4XVtzdWJzdHJdOworICAgICAgICAgICAgY3R4LT5jdXJfY2hhbm5lbF9wYXJhbXMgPSBjdHgtPm1ham9yX2NoYW5uZWxfcGFyYW1zW3N1YmJsb2NrX2luZGV4XTsKKworICAgICAgICAgICAgcGFyYW1zX2NoYW5nZWQgPSBjdHgtPm1ham9yX3BhcmFtc19jaGFuZ2VkW3N1YmJsb2NrX2luZGV4XVtzdWJzdHJdOworCisgICAgICAgICAgICBpZiAoc3Vic3RyX3Jlc3RhcnRfZnJhbWUgfHwgcGFyYW1zX2NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGIsIDEsIDEpOworCisgICAgICAgICAgICAgICAgaWYgKHN1YnN0cl9yZXN0YXJ0X2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfcmVzdGFydF9oZWFkZXIoY3R4LCAmcGIpOworICAgICAgICAgICAgICAgICAgICByaC0+bG9zc2xlc3NfY2hlY2tfZGF0YSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB3cml0ZV9kZWNvZGluZ19wYXJhbXMoY3R4LCAmcGIsIHBhcmFtc19jaGFuZ2VkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3JpdGVfYmxvY2tfZGF0YShjdHgsICZwYik7CisKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgIXN1YnN0cl9yZXN0YXJ0X2ZyYW1lKTsKKworICAgICAgICAgICAgc3Vic3RyX3Jlc3RhcnRfZnJhbWUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAoLXB1dF9iaXRzX2NvdW50KCZwYikpICYgMTUsIDApOworCisgICAgICAgIHJoLT5sb3NzbGVzc19jaGVja19kYXRhIF49ICpsb3NzbGVzc19jaGVja19kYXRhKys7CisKKyAgICAgICAgaWYgKGN0eC0+bGFzdF9mcmFtZSA9PSBjdHgtPmlub3V0X2J1ZmZlcikgeworICAgICAgICAgICAgLyogVE9ETyBmaW5kIGEgc2FtcGxlIGFuZCBpbXBsZW1lbnQgc2hvcnRlbl9ieS4gKi8KKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMzIsIEVORF9PRl9TVFJFQU0pOworICAgICAgICB9CisKKyAgICAgICAgLyogRGF0YSBtdXN0IGJlIGZsdXNoZWQgZm9yIHRoZSBjaGVja3N1bSBhbmQgcGFyaXR5IHRvIGJlIGNvcnJlY3QuICovCisgICAgICAgIHRtcGIgPSBwYjsKKyAgICAgICAgZmx1c2hfcHV0X2JpdHMoJnRtcGIpOworCisgICAgICAgIHBhcml0eSAgID0gZmZfbWxwX2NhbGN1bGF0ZV9wYXJpdHkoYnVmLCBwdXRfYml0c19jb3VudCgmcGIpID4+IDMpIF4gMHhhOTsKKyAgICAgICAgY2hlY2tzdW0gPSBmZl9tbHBfY2hlY2tzdW04ICAgICAgIChidWYsIHB1dF9iaXRzX2NvdW50KCZwYikgPj4gMyk7CisKKyAgICAgICAgcHV0X2JpdHMoJnBiLCA4LCBwYXJpdHkgICk7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgOCwgY2hlY2tzdW0pOworCisgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CisKKyAgICAgICAgZW5kICs9IHB1dF9iaXRzX2NvdW50KCZwYikgPj4gMzsKKyAgICAgICAgc3Vic3RyZWFtX2RhdGFfbGVuW3N1YnN0cl0gPSBlbmQ7CisKKyAgICAgICAgYnVmICs9IHB1dF9iaXRzX2NvdW50KCZwYikgPj4gMzsKKyAgICB9CisKKyAgICBjdHgtPm1ham9yX2N1cl9zdWJibG9ja19pbmRleCArPSBjdHgtPm1ham9yX2ZpbHRlcl9zdGF0ZV9zdWJibG9jayArIDE7CisgICAgY3R4LT5tYWpvcl9maWx0ZXJfc3RhdGVfc3ViYmxvY2sgPSAwOworCisgICAgcmV0dXJuIGJ1ZjsKK30KKworLyoqIFdyaXRlcyB0aGUgYWNjZXNzIHVuaXQgYW5kIHN1YnN0cmVhbSBoZWFkZXJzIHRvIHRoZSBiaXRzdHJlYW0uICovCitzdGF0aWMgdm9pZCB3cml0ZV9mcmFtZV9oZWFkZXJzKE1MUEVuY29kZUNvbnRleHQgKmN0eCwgdWludDhfdCAqZnJhbWVfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzdWJzdHJlYW1faGVhZGVycywgdW5zaWduZWQgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3RhcnRfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN1YnN0cmVhbV9kYXRhX2xlbltNQVhfU1VCU1RSRUFNU10pCit7CisgICAgdWludDE2X3QgYWNjZXNzX3VuaXRfaGVhZGVyID0gMDsKKyAgICB1aW50MTZfdCBwYXJpdHlfbmliYmxlID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc3Vic3RyOworCisgICAgcGFyaXR5X25pYmJsZSAgPSBjdHgtPmR0czsKKyAgICBwYXJpdHlfbmliYmxlIF49IGxlbmd0aDsKKworICAgIGZvciAoc3Vic3RyID0gMDsgc3Vic3RyIDwgY3R4LT5udW1fc3Vic3RyZWFtczsgc3Vic3RyKyspIHsKKyAgICAgICAgdWludDE2X3Qgc3Vic3RyX2hkciA9IDA7CisKKyAgICAgICAgc3Vic3RyX2hkciB8PSAoMCA8PCAxNSk7IC8qIGV4dHJhd29yZCAqLworICAgICAgICBzdWJzdHJfaGRyIHw9ICghcmVzdGFydF9mcmFtZSA8PCAxNCk7IC8qICFyZXN0YXJ0X2ZyYW1lICovCisgICAgICAgIHN1YnN0cl9oZHIgfD0gKDEgPDwgMTMpOyAvKiBjaGVja2RhdGEgKi8KKyAgICAgICAgc3Vic3RyX2hkciB8PSAoMCA8PCAxMik7IC8qID8/PyAqLworICAgICAgICBzdWJzdHJfaGRyIHw9IChzdWJzdHJlYW1fZGF0YV9sZW5bc3Vic3RyXSAvIDIpICYgMHgwRkZGOworCisgICAgICAgIEFWX1dCMTYoc3Vic3RyZWFtX2hlYWRlcnMsIHN1YnN0cl9oZHIpOworCisgICAgICAgIHBhcml0eV9uaWJibGUgXj0gKnN1YnN0cmVhbV9oZWFkZXJzKys7CisgICAgICAgIHBhcml0eV9uaWJibGUgXj0gKnN1YnN0cmVhbV9oZWFkZXJzKys7CisgICAgfQorCisgICAgcGFyaXR5X25pYmJsZSBePSBwYXJpdHlfbmliYmxlID4+IDg7CisgICAgcGFyaXR5X25pYmJsZSBePSBwYXJpdHlfbmliYmxlID4+IDQ7CisgICAgcGFyaXR5X25pYmJsZSAmPSAweEY7CisKKyAgICBhY2Nlc3NfdW5pdF9oZWFkZXIgfD0gKHBhcml0eV9uaWJibGUgXiAweEYpIDw8IDEyOworICAgIGFjY2Vzc191bml0X2hlYWRlciB8PSBsZW5ndGggJiAweEZGRjsKKworICAgIEFWX1dCMTYoZnJhbWVfaGVhZGVyICAsIGFjY2Vzc191bml0X2hlYWRlcik7CisgICAgQVZfV0IxNihmcmFtZV9oZWFkZXIrMiwgY3R4LT5kdHMgICAgICAgICAgKTsKK30KKworLyoqIFdyaXRlcyBhbiBlbnRpcmUgYWNjZXNzIHVuaXQgdG8gdGhlIGJpdHN0cmVhbS4gKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgd3JpdGVfYWNjZXNzX3VuaXQoTUxQRW5jb2RlQ29udGV4dCAqY3R4LCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgaW50IHJlc3RhcnRfZnJhbWUpCit7CisgICAgdWludDE2X3Qgc3Vic3RyZWFtX2RhdGFfbGVuW01BWF9TVUJTVFJFQU1TXTsKKyAgICB1aW50OF90ICpidWYxLCAqYnVmMCA9IGJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgc3Vic3RyOworICAgIGludCB0b3RhbF9sZW5ndGg7CisKKyAgICBpZiAoYnVmX3NpemUgPCA0KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiBGcmFtZSBoZWFkZXIgd2lsbCBiZSB3cml0dGVuIGF0IHRoZSBlbmQuICovCisgICAgYnVmICAgICAgKz0gNDsKKyAgICBidWZfc2l6ZSAtPSA0OworCisgICAgaWYgKHJlc3RhcnRfZnJhbWUpIHsKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgMjgpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHdyaXRlX21ham9yX3N5bmMoY3R4LCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgYnVmICAgICAgKz0gMjg7CisgICAgICAgIGJ1Zl9zaXplIC09IDI4OworICAgIH0KKworICAgIGJ1ZjEgPSBidWY7CisKKyAgICAvKiBTdWJzdHJlYW0gaGVhZGVycyB3aWxsIGJlIHdyaXR0ZW4gYXQgdGhlIGVuZC4gKi8KKyAgICBmb3IgKHN1YnN0ciA9IDA7IHN1YnN0ciA8IGN0eC0+bnVtX3N1YnN0cmVhbXM7IHN1YnN0cisrKSB7CisgICAgICAgIGJ1ZiAgICAgICs9IDI7CisgICAgICAgIGJ1Zl9zaXplIC09IDI7CisgICAgfQorCisgICAgYnVmID0gd3JpdGVfc3Vic3RycyhjdHgsIGJ1ZiwgYnVmX3NpemUsIHJlc3RhcnRfZnJhbWUsIHN1YnN0cmVhbV9kYXRhX2xlbik7CisKKyAgICB0b3RhbF9sZW5ndGggPSBidWYgLSBidWYwOworCisgICAgd3JpdGVfZnJhbWVfaGVhZGVycyhjdHgsIGJ1ZjAsIGJ1ZjEsIHRvdGFsX2xlbmd0aCAvIDIsIHJlc3RhcnRfZnJhbWUsIHN1YnN0cmVhbV9kYXRhX2xlbik7CisKKyAgICByZXR1cm4gdG90YWxfbGVuZ3RoOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKioqKioqKioqKiBGdW5jdGlvbnMgdGhhdCBpbnB1dCBkYXRhIHRvIGNvbnRleHQgKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogSW5wdXRzIGRhdGEgZnJvbSB0aGUgc2FtcGxlcyBwYXNzZWQgYnkgbGF2YyBpbnRvIHRoZSBjb250ZXh0LCBzaGlmdHMgdGhlbQorICogIGFwcHJvcHJpYXRlbHkgZGVwZW5kaW5nIG9uIHRoZSBiaXQtZGVwdGgsIGFuZCBjYWxjdWxhdGVzIHRoZQorICogIGxvc3NsZXNzX2NoZWNrX2RhdGEgdGhhdCB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIHJlc3RhcnQgaGVhZGVyLgorICovCitzdGF0aWMgdm9pZCBpbnB1dF9kYXRhX2ludGVybmFsKE1MUEVuY29kZUNvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzMjQpCit7CisgICAgaW50MzJfdCAqbG9zc2xlc3NfY2hlY2tfZGF0YSA9IGN0eC0+bG9zc2xlc3NfY2hlY2tfZGF0YTsKKyAgICBjb25zdCBpbnQzMl90ICpzYW1wbGVzXzMyID0gKGNvbnN0IGludDMyX3QgKikgc2FtcGxlczsKKyAgICBjb25zdCBpbnQxNl90ICpzYW1wbGVzXzE2ID0gKGNvbnN0IGludDE2X3QgKikgc2FtcGxlczsKKyAgICB1bnNpZ25lZCBpbnQgc3Vic3RyOworCisgICAgbG9zc2xlc3NfY2hlY2tfZGF0YSArPSBjdHgtPmZyYW1lX2luZGV4ICogY3R4LT5udW1fc3Vic3RyZWFtczsKKworICAgIGZvciAoc3Vic3RyID0gMDsgc3Vic3RyIDwgY3R4LT5udW1fc3Vic3RyZWFtczsgc3Vic3RyKyspIHsKKyAgICAgICAgUmVzdGFydEhlYWRlciAgKnJoID0gJmN0eC0+cmVzdGFydF9oZWFkZXIgW3N1YnN0cl07CisgICAgICAgIGludDMyX3QgKnNhbXBsZV9idWZmZXIgPSBjdHgtPmlub3V0X2J1ZmZlcjsKKyAgICAgICAgaW50MzJfdCB0ZW1wX2xvc3NsZXNzX2NoZWNrX2RhdGEgPSAwOworICAgICAgICB1aW50MzJfdCBncmVhdGVzdCA9IDA7CisgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5mcmFtZV9zaXplW2N0eC0+ZnJhbWVfaW5kZXhdOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gcmgtPm1heF9jaGFubmVsOyBjaGFubmVsKyspIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBhYnNfc2FtcGxlOworICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlOworCisgICAgICAgICAgICAgICAgc2FtcGxlID0gaXMyNCA/ICpzYW1wbGVzXzMyKysgPj4gOCA6ICpzYW1wbGVzXzE2KysgPDwgODsKKworICAgICAgICAgICAgICAgIC8qIFRPRE8gRmluZCBvdXQgaWYgbnVtYmVyX3NiaXRzIGNhbiBiZSB1c2VkIGZvciBuZWdhdGl2ZSB2YWx1ZXMuICovCisgICAgICAgICAgICAgICAgYWJzX3NhbXBsZSA9IEZGQUJTKHNhbXBsZSk7CisgICAgICAgICAgICAgICAgaWYgKGdyZWF0ZXN0IDwgYWJzX3NhbXBsZSkKKyAgICAgICAgICAgICAgICAgICAgZ3JlYXRlc3QgPSBhYnNfc2FtcGxlOworCisgICAgICAgICAgICAgICAgdGVtcF9sb3NzbGVzc19jaGVja19kYXRhIF49IChzYW1wbGUgJiAweDAwZmZmZmZmKSA8PCBjaGFubmVsOworICAgICAgICAgICAgICAgICpzYW1wbGVfYnVmZmVyKysgPSBzYW1wbGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNhbXBsZV9idWZmZXIgKz0gMjsgLyogbm9pc2UgY2hhbm5lbHMgKi8KKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+bWF4X291dHB1dF9iaXRzW2N0eC0+ZnJhbWVfaW5kZXhdID0gbnVtYmVyX3NiaXRzKGdyZWF0ZXN0KTsKKworICAgICAgICAqbG9zc2xlc3NfY2hlY2tfZGF0YSsrID0gdGVtcF9sb3NzbGVzc19jaGVja19kYXRhOworICAgIH0KK30KKworLyoqIFdyYXBwZXIgZnVuY3Rpb24gZm9yIGlucHV0dGluZyBkYXRhIGluIHR3byBkaWZmZXJlbnQgYml0LWRlcHRocy4gKi8KK3N0YXRpYyB2b2lkIGlucHV0X2RhdGEoTUxQRW5jb2RlQ29udGV4dCAqY3R4LCB2b2lkICpzYW1wbGVzKQoreworICAgIGlmIChjdHgtPmF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyKQorICAgICAgICBpbnB1dF9kYXRhX2ludGVybmFsKGN0eCwgc2FtcGxlcywgMSk7CisgICAgZWxzZQorICAgICAgICBpbnB1dF9kYXRhX2ludGVybmFsKGN0eCwgc2FtcGxlcywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGlucHV0X3RvX3NhbXBsZV9idWZmZXIoTUxQRW5jb2RlQ29udGV4dCAqY3R4KQoreworICAgIGludDMyX3QgKnNhbXBsZV9idWZmZXIgPSBjdHgtPnNhbXBsZV9idWZmZXI7CisgICAgdW5zaWduZWQgaW50IGluZGV4OworCisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3R4LT5udW1iZXJfb2ZfZnJhbWVzOyBpbmRleCsrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBjdXJfaW5kZXggPSAoY3R4LT5zdGFydGluZ19mcmFtZV9pbmRleCArIGluZGV4KSAlIGN0eC0+bWF4X3Jlc3RhcnRfaW50ZXJ2YWw7CisgICAgICAgIGludDMyX3QgKmlucHV0X2J1ZmZlciA9IGN0eC0+aW5vdXRfYnVmZmVyICsgY3VyX2luZGV4ICogY3R4LT5vbmVfc2FtcGxlX2J1ZmZlcl9zaXplOworICAgICAgICB1bnNpZ25lZCBpbnQgaSwgY2hhbm5lbDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5mcmFtZV9zaXplW2N1cl9pbmRleF07IGkrKykgeworICAgICAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGN0eC0+YXZjdHgtPmNoYW5uZWxzOyBjaGFubmVsKyspCisgICAgICAgICAgICAgICAgKnNhbXBsZV9idWZmZXIrKyA9ICppbnB1dF9idWZmZXIrKzsKKyAgICAgICAgICAgIHNhbXBsZV9idWZmZXIgKz0gMjsgLyogbm9pc2VfY2hhbm5lbHMgKi8KKyAgICAgICAgICAgIGlucHV0X2J1ZmZlciArPSAyOyAvKiBub2lzZV9jaGFubmVscyAqLworICAgICAgICB9CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoqKioqKioqKiBGdW5jdGlvbnMgdGhhdCBhbmFseXplIHRoZSBkYXRhIGFuZCBzZXQgdGhlIHBhcmFtZXRlcnMgKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiogQ291bnRzIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgemVyb2VzIGluIGEgdmFsdWUgKi8KK3N0YXRpYyBpbnQgbnVtYmVyX3RyYWlsaW5nX3plcm9lcyhpbnQzMl90IHNhbXBsZSkKK3sKKyAgICBpbnQgYml0czsKKworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPCAyNCAmJiAhKHNhbXBsZSAmICgxPDxiaXRzKSk7IGJpdHMrKyk7CisKKyAgICAvKiBBbGwgc2FtcGxlcyBhcmUgMC4gVE9ETyBSZXR1cm4gcHJldmlvdXMgcXVhbnRfc3RlcF9zaXplIHRvIGF2b2lkCisgICAgICogd3JpdGluZyBhIG5ldyBoZWFkZXIuICovCisgICAgaWYgKGJpdHMgPT0gMjQpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGJpdHM7Cit9CisKKy8qKiBEZXRlcm1pbmVzIGhvdyBtYW55IGJpdHMgYXJlIHplcm8gYXQgdGhlIGVuZCBvZiBhbGwgc2FtcGxlcyBzbyB0aGV5IGNhbiBiZQorICogIHNoaWZ0ZWQgb3V0LgorICovCitzdGF0aWMgdm9pZCBkZXRlcm1pbmVfcXVhbnRfc3RlcF9zaXplKE1MUEVuY29kZUNvbnRleHQgKmN0eCkKK3sKKyAgICBEZWNvZGluZ1BhcmFtcyAqZHAgPSBjdHgtPmN1cl9kZWNvZGluZ19wYXJhbXM7CisgICAgUmVzdGFydEhlYWRlciAgKnJoID0gY3R4LT5jdXJfcmVzdGFydF9oZWFkZXI7CisgICAgTWF0cml4UGFyYW1zICptcCA9ICZkcC0+bWF0cml4X3BhcmFtczsKKyAgICBpbnQzMl90ICpzYW1wbGVfYnVmZmVyID0gY3R4LT5zYW1wbGVfYnVmZmVyOworICAgIGludDMyX3Qgc2FtcGxlX21hc2tbTUFYX0NIQU5ORUxTXTsKKyAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKyAgICBpbnQgaTsKKworICAgIG1lbXNldChzYW1wbGVfbWFzaywgMHgwMCwgc2l6ZW9mKHNhbXBsZV9tYXNrKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5udW1iZXJfb2Zfc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gcmgtPm1heF9jaGFubmVsOyBjaGFubmVsKyspCisgICAgICAgICAgICBzYW1wbGVfbWFza1tjaGFubmVsXSB8PSAqc2FtcGxlX2J1ZmZlcisrOworCisgICAgICAgIHNhbXBsZV9idWZmZXIgKz0gMjsgLyogbm9pc2UgY2hhbm5lbHMgKi8KKyAgICB9CisKKyAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDw9IHJoLT5tYXhfY2hhbm5lbDsgY2hhbm5lbCsrKQorICAgICAgICBkcC0+cXVhbnRfc3RlcF9zaXplW2NoYW5uZWxdID0gbnVtYmVyX3RyYWlsaW5nX3plcm9lcyhzYW1wbGVfbWFza1tjaGFubmVsXSkgLSBtcC0+c2hpZnRbY2hhbm5lbF07Cit9CisKKy8qKiBEZXRlcm1pbmVzIHRoZSBzbWFsbGVzdCBudW1iZXIgb2YgYml0cyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBmaWx0ZXIKKyAqICBjb2VmZmljaWVudHMsIGFuZCBpZiBpdCdzIHBvc3NpYmxlIHRvIHJpZ2h0LXNoaWZ0IHRoZWlyIHZhbHVlcyB3aXRob3V0CisgKiAgbG9zaW5nIGFueSBwcmVjaXNpb24uCisgKi8KK3N0YXRpYyB2b2lkIGNvZGVfZmlsdGVyX2NvZWZmcyhNTFBFbmNvZGVDb250ZXh0ICpjdHgsIEZpbHRlclBhcmFtcyAqZnAsIGludDMyX3QgKmZjb2VmZikKK3sKKyAgICBpbnQgbWluID0gSU5UX01BWCwgbWF4ID0gSU5UX01JTjsKKyAgICBpbnQgYml0cywgc2hpZnQ7CisgICAgaW50IGNvZWZmX21hc2sgPSAwOworICAgIGludCBvcmRlcjsKKworICAgIGZvciAob3JkZXIgPSAwOyBvcmRlciA8IGZwLT5vcmRlcjsgb3JkZXIrKykgeworICAgICAgICBpbnQgY29lZmYgPSBmY29lZmZbb3JkZXJdOworCisgICAgICAgIGlmIChjb2VmZiA8IG1pbikKKyAgICAgICAgICAgIG1pbiA9IGNvZWZmOworICAgICAgICBpZiAoY29lZmYgPiBtYXgpCisgICAgICAgICAgICBtYXggPSBjb2VmZjsKKworICAgICAgICBjb2VmZl9tYXNrIHw9IGNvZWZmOworICAgIH0KKworICAgIGJpdHMgPSBGRk1BWChudW1iZXJfc2JpdHMobWluKSwgbnVtYmVyX3NiaXRzKG1heCkpOworCisgICAgZm9yIChzaGlmdCA9IDA7IHNoaWZ0IDwgNyAmJiBiaXRzICsgc2hpZnQgPCAxNiAmJiAhKGNvZWZmX21hc2sgJiAoMTw8c2hpZnQpKTsgc2hpZnQrKyk7CisKKyAgICBmcC0+Y29lZmZfYml0cyAgPSBiaXRzOworICAgIGZwLT5jb2VmZl9zaGlmdCA9IHNoaWZ0OworfQorCisvKiogRGV0ZXJtaW5lcyB0aGUgYmVzdCBmaWx0ZXIgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIGRhdGEgYW5kIHdyaXRlcyB0aGUKKyAqICBuZWNlc3NhcnkgaW5mb3JtYXRpb24gdG8gdGhlIGNvbnRleHQuCisgKiAgVE9ETyBBZGQgSUlSIGZpbHRlciBwcmVkaWN0b3IhCisgKi8KK3N0YXRpYyB2b2lkIHNldF9maWx0ZXJfcGFyYW1zKE1MUEVuY29kZUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsLCB1bnNpZ25lZCBpbnQgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsZWFyX2ZpbHRlcikKK3sKKyAgICBDaGFubmVsUGFyYW1zICpjcCA9ICZjdHgtPmN1cl9jaGFubmVsX3BhcmFtc1tjaGFubmVsXTsKKyAgICBGaWx0ZXJQYXJhbXMgKmZwID0gJmNwLT5maWx0ZXJfcGFyYW1zW2ZpbHRlcl07CisKKyAgICBpZiAoKGZpbHRlciA9PSBJSVIgJiYgY3R4LT5zdWJzdHJlYW1faW5mbyAmIFNVQlNUUkVBTV9JTkZPX0hJR0hfUkFURSkgfHwKKyAgICAgICAgY2xlYXJfZmlsdGVyKSB7CisgICAgICAgIGZwLT5vcmRlciA9IDA7CisgICAgfSBlbHNlIGlmIChmaWx0ZXIgPT0gSUlSKSB7CisgICAgICAgIGZwLT5vcmRlciA9IDA7CisgICAgfSBlbHNlIGlmIChmaWx0ZXIgPT0gRklSKSB7CisgICAgICAgIGNvbnN0IGludCBtYXhfb3JkZXIgPSAoY3R4LT5zdWJzdHJlYW1faW5mbyAmIFNVQlNUUkVBTV9JTkZPX0hJR0hfUkFURSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gNCA6IE1MUF9NQVhfTFBDX09SREVSOworICAgICAgICBpbnQzMl90ICpzYW1wbGVfYnVmZmVyID0gY3R4LT5zYW1wbGVfYnVmZmVyICsgY2hhbm5lbDsKKyAgICAgICAgaW50MzJfdCBjb2Vmc1tNQVhfTFBDX09SREVSXVtNQVhfTFBDX09SREVSXTsKKyAgICAgICAgaW50MzJfdCAqbHBjX3NhbXBsZXMgPSBjdHgtPmxwY19zYW1wbGVfYnVmZmVyOworICAgICAgICBpbnQzMl90ICpmY29lZmYgPSBjdHgtPmN1cl9jaGFubmVsX3BhcmFtc1tjaGFubmVsXS5jb2VmZltmaWx0ZXJdOworICAgICAgICBpbnQgc2hpZnRbTUxQX01BWF9MUENfT1JERVJdOworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgaW50IG9yZGVyOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bWJlcl9vZl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICpscGNfc2FtcGxlcysrID0gKnNhbXBsZV9idWZmZXI7CisgICAgICAgICAgICBzYW1wbGVfYnVmZmVyICs9IGN0eC0+bnVtX2NoYW5uZWxzOworICAgICAgICB9CisKKyAgICAgICAgb3JkZXIgPSBmZl9scGNfY2FsY19jb2VmcygmY3R4LT5scGNfY3R4LCBjdHgtPmxwY19zYW1wbGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bnVtYmVyX29mX3NhbXBsZXMsIE1MUF9NSU5fTFBDX09SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9vcmRlciwgMTEsIGNvZWZzLCBzaGlmdCwgRkZfTFBDX1RZUEVfTEVWSU5TT04sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1JERVJfTUVUSE9EX0VTVCwgTUxQX01JTl9MUENfU0hJRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUxQX01BWF9MUENfU0hJRlQsIE1MUF9NSU5fTFBDX1NISUZUKTsKKworICAgICAgICBmcC0+b3JkZXIgPSBvcmRlcjsKKyAgICAgICAgZnAtPnNoaWZ0ID0gc2hpZnRbb3JkZXItMV07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspCisgICAgICAgICAgICBmY29lZmZbaV0gPSBjb2Vmc1tvcmRlci0xXVtpXTsKKworICAgICAgICBjb2RlX2ZpbHRlcl9jb2VmZnMoY3R4LCBmcCwgZmNvZWZmKTsKKyAgICB9Cit9CisKKy8qKiBUcmllcyB0byBkZXRlcm1pbmUgYSBnb29kIHByZWRpY3Rpb24gZmlsdGVyLCBhbmQgYXBwbGllcyBpdCB0byB0aGUgc2FtcGxlcworICogIGJ1ZmZlciBpZiB0aGUgZmlsdGVyIGlzIGdvb2QgZW5vdWdoLiBTZXRzIHRoZSBmaWx0ZXIgZGF0YSB0byBiZSBjbGVhcmVkIGlmCisgKiAgbm8gZ29vZCBmaWx0ZXIgd2FzIGZvdW5kLgorICovCitzdGF0aWMgdm9pZCBkZXRlcm1pbmVfZmlsdGVycyhNTFBFbmNvZGVDb250ZXh0ICpjdHgpCit7CisgICAgUmVzdGFydEhlYWRlciAqcmggPSBjdHgtPmN1cl9yZXN0YXJ0X2hlYWRlcjsKKyAgICBpbnQgY2hhbm5lbCwgZmlsdGVyOworCisgICAgZm9yIChjaGFubmVsID0gcmgtPm1pbl9jaGFubmVsOyBjaGFubmVsIDw9IHJoLT5tYXhfY2hhbm5lbDsgY2hhbm5lbCsrKSB7CisgICAgICAgIGZvciAoZmlsdGVyID0gMDsgZmlsdGVyIDwgTlVNX0ZJTFRFUlM7IGZpbHRlcisrKQorICAgICAgICAgICAgc2V0X2ZpbHRlcl9wYXJhbXMoY3R4LCBjaGFubmVsLCBmaWx0ZXIsIDApOworICAgIH0KK30KKworZW51bSBNTFBDaE1vZGUgeworICAgIE1MUF9DSE1PREVfTEVGVF9SSUdIVCwKKyAgICBNTFBfQ0hNT0RFX0xFRlRfU0lERSwKKyAgICBNTFBfQ0hNT0RFX1JJR0hUX1NJREUsCisgICAgTUxQX0NITU9ERV9NSURfU0lERSwKK307CisKK3N0YXRpYyBlbnVtIE1MUENoTW9kZSBlc3RpbWF0ZV9zdGVyZW9fbW9kZShNTFBFbmNvZGVDb250ZXh0ICpjdHgpCit7CisgICAgdWludDY0X3Qgc2NvcmVbNF0sIHN1bVs0XSA9IHsgMCwgMCwgMCwgMCwgfTsKKyAgICBpbnQzMl90ICpyaWdodF9jaCA9IGN0eC0+c2FtcGxlX2J1ZmZlciArIDE7CisgICAgaW50MzJfdCAqbGVmdF9jaCAgPSBjdHgtPnNhbXBsZV9idWZmZXI7CisgICAgaW50IGk7CisgICAgZW51bSBNTFBDaE1vZGUgYmVzdCA9IDA7CisKKyAgICBmb3IoaSA9IDI7IGkgPCBjdHgtPm51bWJlcl9vZl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgaW50MzJfdCBsZWZ0ICA9IGxlZnRfY2ggW2kgKiBjdHgtPm51bV9jaGFubmVsc10gLSAyICogbGVmdF9jaCBbKGkgLSAxKSAqIGN0eC0+bnVtX2NoYW5uZWxzXSArIGxlZnRfY2ggWyhpIC0gMikgKiBjdHgtPm51bV9jaGFubmVsc107CisgICAgICAgIGludDMyX3QgcmlnaHQgPSByaWdodF9jaFtpICogY3R4LT5udW1fY2hhbm5lbHNdIC0gMiAqIHJpZ2h0X2NoWyhpIC0gMSkgKiBjdHgtPm51bV9jaGFubmVsc10gKyByaWdodF9jaFsoaSAtIDIpICogY3R4LT5udW1fY2hhbm5lbHNdOworCisgICAgICAgIHN1bVswXSArPSBGRkFCUyggbGVmdCAgICAgICAgKTsKKyAgICAgICAgc3VtWzFdICs9IEZGQUJTKCAgICAgICAgcmlnaHQpOworICAgICAgICBzdW1bMl0gKz0gRkZBQlMoKGxlZnQgKyByaWdodCkgPj4gMSk7CisgICAgICAgIHN1bVszXSArPSBGRkFCUyggbGVmdCAtIHJpZ2h0KTsKKyAgICB9CisKKyAgICBzY29yZVtNTFBfQ0hNT0RFX0xFRlRfUklHSFRdID0gc3VtWzBdICsgc3VtWzFdOworICAgIHNjb3JlW01MUF9DSE1PREVfTEVGVF9TSURFXSAgPSBzdW1bMF0gKyBzdW1bM107CisgICAgc2NvcmVbTUxQX0NITU9ERV9SSUdIVF9TSURFXSA9IHN1bVsxXSArIHN1bVszXTsKKyAgICBzY29yZVtNTFBfQ0hNT0RFX01JRF9TSURFXSAgID0gc3VtWzJdICsgc3VtWzNdOworCisgICAgZm9yKGkgPSAxOyBpIDwgMzsgaSsrKQorICAgICAgICBpZihzY29yZVtpXSA8IHNjb3JlW2Jlc3RdKQorICAgICAgICAgICAgYmVzdCA9IGk7CisKKyAgICByZXR1cm4gYmVzdDsKK30KKworLyoqIERldGVybWluZXMgaG93IG1hbnkgZnJhY3Rpb25hbCBiaXRzIGFyZSBuZWVkZWQgdG8gZW5jb2RlIG1hdHJpeAorICogIGNvZWZmaWNpZW50cy4gQWxzbyBzaGlmdHMgdGhlIGNvZWZmaWNpZW50cyB0byBmaXQgd2l0aGluIDIuMTQgYml0cy4KKyAqLworc3RhdGljIHZvaWQgY29kZV9tYXRyaXhfY29lZmZzKE1MUEVuY29kZUNvbnRleHQgKmN0eCwgdW5zaWduZWQgaW50IG1hdCkKK3sKKyAgICBEZWNvZGluZ1BhcmFtcyAqZHAgPSBjdHgtPmN1cl9kZWNvZGluZ19wYXJhbXM7CisgICAgTWF0cml4UGFyYW1zICptcCA9ICZkcC0+bWF0cml4X3BhcmFtczsKKyAgICBpbnQzMl90IGNvZWZmX21hc2sgPSAwOworICAgIHVuc2lnbmVkIGludCBjaGFubmVsOworICAgIHVuc2lnbmVkIGludCBiaXRzOworCisgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IGN0eC0+bnVtX2NoYW5uZWxzOyBjaGFubmVsKyspIHsKKyAgICAgICAgaW50MzJfdCBjb2VmZiA9IG1wLT5jb2VmZlttYXRdW2NoYW5uZWxdOworICAgICAgICBjb2VmZl9tYXNrIHw9IGNvZWZmOworICAgIH0KKworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPCAxNCAmJiAhKGNvZWZmX21hc2sgJiAoMTw8Yml0cykpOyBiaXRzKyspOworCisgICAgbXAtPmZiaXRzICAgW21hdF0gPSAxNCAtIGJpdHM7Cit9CisKKy8qKiBEZXRlcm1pbmVzIGJlc3QgY29lZmZpY2llbnRzIHRvIHVzZSBmb3IgdGhlIGxvc3NsZXNzIG1hdHJpeC4gKi8KK3N0YXRpYyB2b2lkIGxvc3NsZXNzX21hdHJpeF9jb2VmZnMoTUxQRW5jb2RlQ29udGV4dCAqY3R4KQoreworICAgIERlY29kaW5nUGFyYW1zICpkcCA9IGN0eC0+Y3VyX2RlY29kaW5nX3BhcmFtczsKKyAgICBNYXRyaXhQYXJhbXMgKm1wID0gJmRwLT5tYXRyaXhfcGFyYW1zOworICAgIHVuc2lnbmVkIGludCBzaGlmdCA9IDA7CisgICAgdW5zaWduZWQgaW50IGNoYW5uZWw7CisgICAgaW50IG1hdDsKKyAgICBlbnVtIE1MUENoTW9kZSBtb2RlOworCisgICAgLyogTm8gZGVjb3JyZWxhdGlvbiBmb3Igbm9uLXN0ZXJlby4gKi8KKyAgICBpZiAoY3R4LT5udW1fY2hhbm5lbHMgLSAyICE9IDIpIHsKKyAgICAgICAgbXAtPmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1vZGUgPSBlc3RpbWF0ZV9zdGVyZW9fbW9kZShjdHgpOworCisgICAgc3dpdGNoKG1vZGUpIHsKKyAgICAgICAgLyogVE9ETzogYWRkIG1hdHJpeCBmb3IgTUlEX1NJREUgKi8KKyAgICAgICAgY2FzZSBNTFBfQ0hNT0RFX01JRF9TSURFOgorICAgICAgICBjYXNlIE1MUF9DSE1PREVfTEVGVF9SSUdIVDoKKyAgICAgICAgICAgIG1wLT5jb3VudCAgICA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNTFBfQ0hNT0RFX0xFRlRfU0lERToKKyAgICAgICAgICAgIG1wLT5jb3VudCAgICA9IDE7CisgICAgICAgICAgICBtcC0+b3V0Y2hbMF0gPSAxOworICAgICAgICAgICAgbXAtPmNvZWZmWzBdWzBdID0gIDEgPDwgMTQ7IG1wLT5jb2VmZlswXVsxXSA9IC0oMSA8PCAxNCk7CisgICAgICAgICAgICBtcC0+Y29lZmZbMF1bMl0gPSAgMCA8PCAxNDsgbXAtPmNvZWZmWzBdWzJdID0gICAwIDw8IDE0OworICAgICAgICAgICAgbXAtPmZvcmNvWzBdWzBdID0gIDEgPDwgMTQ7IG1wLT5mb3Jjb1swXVsxXSA9IC0oMSA8PCAxNCk7CisgICAgICAgICAgICBtcC0+Zm9yY29bMF1bMl0gPSAgMCA8PCAxNDsgbXAtPmZvcmNvWzBdWzJdID0gICAwIDw8IDE0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUxQX0NITU9ERV9SSUdIVF9TSURFOgorICAgICAgICAgICAgbXAtPmNvdW50ICAgID0gMTsKKyAgICAgICAgICAgIG1wLT5vdXRjaFswXSA9IDA7CisgICAgICAgICAgICBtcC0+Y29lZmZbMF1bMF0gPSAgMSA8PCAxNDsgbXAtPmNvZWZmWzBdWzFdID0gICAxIDw8IDE0OworICAgICAgICAgICAgbXAtPmNvZWZmWzBdWzJdID0gIDAgPDwgMTQ7IG1wLT5jb2VmZlswXVsyXSA9ICAgMCA8PCAxNDsKKyAgICAgICAgICAgIG1wLT5mb3Jjb1swXVswXSA9ICAxIDw8IDE0OyBtcC0+Zm9yY29bMF1bMV0gPSAtKDEgPDwgMTQpOworICAgICAgICAgICAgbXAtPmZvcmNvWzBdWzJdID0gIDAgPDwgMTQ7IG1wLT5mb3Jjb1swXVsyXSA9ICAgMCA8PCAxNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvciAobWF0ID0gMDsgbWF0IDwgbXAtPmNvdW50OyBtYXQrKykKKyAgICAgICAgY29kZV9tYXRyaXhfY29lZmZzKGN0eCwgbWF0KTsKKworICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjdHgtPm51bV9jaGFubmVsczsgY2hhbm5lbCsrKQorICAgICAgICBtcC0+c2hpZnRbY2hhbm5lbF0gPSBzaGlmdDsKK30KKworLyoqIE1pbiBhbmQgbWF4IHZhbHVlcyB0aGF0IGNhbiBiZSBlbmNvZGVkIHdpdGggZWFjaCBjb2RlYm9vay4gVGhlIHZhbHVlcyBmb3IKKyAqICB0aGUgdGhpcmQgY29kZWJvb2sgdGFrZSBpbnRvIGFjY291bnQgdGhlIGZhY3QgdGhhdCB0aGUgc2lnbiBzaGlmdCBmb3IgdGhpcworICogIGNvZGVib29rIGlzIG91dHNpZGUgdGhlIGNvZGVkIHZhbHVlLCBzbyBpdCBoYXMgb25lIG1vcmUgYml0IG9mIHByZWNpc2lvbi4KKyAqICBJdCBzaG91bGQgYWN0dWFsbHkgYmUgLTcgLT4gNywgc2hpZnRlZCBkb3duIGJ5IDAuNS4KKyAqLworc3RhdGljIGNvbnN0IGludCBjb2RlYm9va19leHRyZW1lc1szXVsyXSA9IHsKKyAgICB7LTksIDh9LCB7LTgsIDd9LCB7LTE1LCAxNH0sCit9OworCisvKiogRGV0ZXJtaW5lcyB0aGUgYW1vdW50IG9mIGJpdHMgbmVlZGVkIHRvIGVuY29kZSB0aGUgc2FtcGxlcyB1c2luZyBubworICogIGNvZGVib29rcyBhbmQgYSBzcGVjaWZpZWQgb2Zmc2V0LgorICovCitzdGF0aWMgdm9pZCBub19jb2RlYm9va19iaXRzX29mZnNldChNTFBFbmNvZGVDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCwgaW50MTZfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbiwgaW50MzJfdCBtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZXN0T2Zmc2V0ICpibykKK3sKKyAgICBEZWNvZGluZ1BhcmFtcyAqZHAgPSBjdHgtPmN1cl9kZWNvZGluZ19wYXJhbXM7CisgICAgaW50MzJfdCB1bnNpZ247CisgICAgaW50IGxzYl9iaXRzOworCisgICAgbWluIC09IG9mZnNldDsKKyAgICBtYXggLT0gb2Zmc2V0OworCisgICAgbHNiX2JpdHMgPSBGRk1BWChudW1iZXJfc2JpdHMobWluKSwgbnVtYmVyX3NiaXRzKG1heCkpIC0gMTsKKworICAgIGxzYl9iaXRzICs9ICEhbHNiX2JpdHM7CisKKyAgICB1bnNpZ24gPSAxIDw8IChsc2JfYml0cyAtIDEpOworCisgICAgYm8tPm9mZnNldCAgID0gb2Zmc2V0OworICAgIGJvLT5sc2JfYml0cyA9IGxzYl9iaXRzOworICAgIGJvLT5iaXRjb3VudCA9IGxzYl9iaXRzICogZHAtPmJsb2Nrc2l6ZTsKKyAgICBiby0+bWluICAgICAgPSBvZmZzZXQgLSB1bnNpZ24gKyAxOworICAgIGJvLT5tYXggICAgICA9IG9mZnNldCArIHVuc2lnbjsKK30KKworLyoqIERldGVybWluZXMgdGhlIGxlYXN0IGFtb3VudCBvZiBiaXRzIG5lZWRlZCB0byBlbmNvZGUgdGhlIHNhbXBsZXMgdXNpbmcgbm8KKyAqICBjb2RlYm9va3MuCisgKi8KK3N0YXRpYyB2b2lkIG5vX2NvZGVib29rX2JpdHMoTUxQRW5jb2RlQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZXN0T2Zmc2V0ICpibykKK3sKKyAgICBEZWNvZGluZ1BhcmFtcyAqZHAgPSBjdHgtPmN1cl9kZWNvZGluZ19wYXJhbXM7CisgICAgaW50MTZfdCBvZmZzZXQ7CisgICAgaW50MzJfdCB1bnNpZ247CisgICAgdWludDMyX3QgZGlmZjsKKyAgICBpbnQgbHNiX2JpdHM7CisKKyAgICAvKiBTZXQgb2Zmc2V0IGluc2lkZSBodWZmb2Zmc2V0J3MgYm91bmRhcmllcyBieSBhZGp1c3RpbmcgZXh0cmVtZXMKKyAgICAgKiBzbyB0aGF0IG1vcmUgYml0cyBhcmUgdXNlZCwgdGh1cyBzaGlmdGluZyB0aGUgb2Zmc2V0LiAqLworICAgIGlmIChtaW4gPCBIVUZGX09GRlNFVF9NSU4pCisgICAgICAgIG1heCA9IEZGTUFYKG1heCwgMiAqIEhVRkZfT0ZGU0VUX01JTiAtIG1pbiArIDEpOworICAgIGlmIChtYXggPiBIVUZGX09GRlNFVF9NQVgpCisgICAgICAgIG1pbiA9IEZGTUlOKG1pbiwgMiAqIEhVRkZfT0ZGU0VUX01BWCAtIG1heCAtIDEpOworCisgICAgLyogRGV0ZXJtaW5lIG9mZnNldCBhbmQgbWluaW11bSBudW1iZXIgb2YgYml0cy4gKi8KKyAgICBkaWZmID0gbWF4IC0gbWluOworCisgICAgbHNiX2JpdHMgPSBudW1iZXJfc2JpdHMoZGlmZikgLSAxOworCisgICAgdW5zaWduID0gMSA8PCAobHNiX2JpdHMgLSAxKTsKKworICAgIC8qIElmIGFsbCBzYW1wbGVzIGFyZSB0aGUgc2FtZSAobHNiX2JpdHMgPT0gMCksIG9mZnNldCBtdXN0IGJlCisgICAgICogYWRqdXN0ZWQgYmVjYXVzZSBvZiBzaWduX3NoaWZ0LiAqLworICAgIG9mZnNldCA9IG1pbiArIGRpZmYgLyAyICsgISFsc2JfYml0czsKKworICAgIGJvLT5vZmZzZXQgICA9IG9mZnNldDsKKyAgICBiby0+bHNiX2JpdHMgPSBsc2JfYml0czsKKyAgICBiby0+Yml0Y291bnQgPSBsc2JfYml0cyAqIGRwLT5ibG9ja3NpemU7CisgICAgYm8tPm1pbiAgICAgID0gbWF4IC0gdW5zaWduICsgMTsKKyAgICBiby0+bWF4ICAgICAgPSBtaW4gKyB1bnNpZ247Cit9CisKKy8qKiBEZXRlcm1pbmVzIHRoZSBsZWFzdCBhbW91bnQgb2YgYml0cyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBzYW1wbGVzIHVzaW5nIGEKKyAqICBnaXZlbiBjb2RlYm9vayBhbmQgYSBnaXZlbiBvZmZzZXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBjb2RlYm9va19iaXRzX29mZnNldChNTFBFbmNvZGVDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwsIGludCBjb2RlYm9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZV9taW4sIGludDMyX3Qgc2FtcGxlX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IG9mZnNldCwgQmVzdE9mZnNldCAqYm8pCit7CisgICAgaW50MzJfdCBjb2RlYm9va19taW4gPSBjb2RlYm9va19leHRyZW1lc1tjb2RlYm9va11bMF07CisgICAgaW50MzJfdCBjb2RlYm9va19tYXggPSBjb2RlYm9va19leHRyZW1lc1tjb2RlYm9va11bMV07CisgICAgaW50MzJfdCAqc2FtcGxlX2J1ZmZlciA9IGN0eC0+c2FtcGxlX2J1ZmZlciArIGNoYW5uZWw7CisgICAgRGVjb2RpbmdQYXJhbXMgKmRwID0gY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zOworICAgIGludCBjb2RlYm9va19vZmZzZXQgID0gNyArICgyIC0gY29kZWJvb2spOworICAgIGludDMyX3QgdW5zaWduX29mZnNldCA9IG9mZnNldDsKKyAgICBpbnQgbHNiX2JpdHMgPSAwLCBiaXRjb3VudCA9IDA7CisgICAgaW50IG9mZnNldF9taW4gPSBJTlRfTUFYLCBvZmZzZXRfbWF4ID0gSU5UX01BWDsKKyAgICBpbnQgdW5zaWduLCBtYXNrOworICAgIGludCBpOworCisgICAgc2FtcGxlX21pbiAtPSBvZmZzZXQ7CisgICAgc2FtcGxlX21heCAtPSBvZmZzZXQ7CisKKyAgICB3aGlsZSAoc2FtcGxlX21pbiA8IGNvZGVib29rX21pbiB8fCBzYW1wbGVfbWF4ID4gY29kZWJvb2tfbWF4KSB7CisgICAgICAgIGxzYl9iaXRzKys7CisgICAgICAgIHNhbXBsZV9taW4gPj49IDE7CisgICAgICAgIHNhbXBsZV9tYXggPj49IDE7CisgICAgfQorCisgICAgdW5zaWduID0gMSA8PCBsc2JfYml0czsKKyAgICBtYXNrICAgPSB1bnNpZ24gLSAxOworCisgICAgaWYgKGNvZGVib29rID09IDIpIHsKKyAgICAgICAgdW5zaWduX29mZnNldCAtPSB1bnNpZ247CisgICAgICAgIGxzYl9iaXRzKys7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGRwLT5ibG9ja3NpemU7IGkrKykgeworICAgICAgICBpbnQzMl90IHNhbXBsZSA9ICpzYW1wbGVfYnVmZmVyID4+IGRwLT5xdWFudF9zdGVwX3NpemVbY2hhbm5lbF07CisgICAgICAgIGludCB0ZW1wX21pbiwgdGVtcF9tYXg7CisKKyAgICAgICAgc2FtcGxlIC09IHVuc2lnbl9vZmZzZXQ7CisKKyAgICAgICAgdGVtcF9taW4gPSBzYW1wbGUgJiBtYXNrOworICAgICAgICBpZiAodGVtcF9taW4gPCBvZmZzZXRfbWluKQorICAgICAgICAgICAgb2Zmc2V0X21pbiA9IHRlbXBfbWluOworCisgICAgICAgIHRlbXBfbWF4ID0gdW5zaWduIC0gdGVtcF9taW4gLSAxOworICAgICAgICBpZiAodGVtcF9tYXggPCBvZmZzZXRfbWF4KQorICAgICAgICAgICAgb2Zmc2V0X21heCA9IHRlbXBfbWF4OworCisgICAgICAgIHNhbXBsZSA+Pj0gbHNiX2JpdHM7CisKKyAgICAgICAgYml0Y291bnQgKz0gZmZfbWxwX2h1ZmZtYW5fdGFibGVzW2NvZGVib29rXVtzYW1wbGUgKyBjb2RlYm9va19vZmZzZXRdWzFdOworCisgICAgICAgIHNhbXBsZV9idWZmZXIgKz0gY3R4LT5udW1fY2hhbm5lbHM7CisgICAgfQorCisgICAgYm8tPm9mZnNldCAgID0gb2Zmc2V0OworICAgIGJvLT5sc2JfYml0cyA9IGxzYl9iaXRzOworICAgIGJvLT5iaXRjb3VudCA9IGxzYl9iaXRzICogZHAtPmJsb2Nrc2l6ZSArIGJpdGNvdW50OworICAgIGJvLT5taW4gICAgICA9IEZGTUFYKG9mZnNldCAtIG9mZnNldF9taW4sIEhVRkZfT0ZGU0VUX01JTik7CisgICAgYm8tPm1heCAgICAgID0gRkZNSU4ob2Zmc2V0ICsgb2Zmc2V0X21heCwgSFVGRl9PRkZTRVRfTUFYKTsKK30KKworLyoqIERldGVybWluZXMgdGhlIGxlYXN0IGFtb3VudCBvZiBiaXRzIG5lZWRlZCB0byBlbmNvZGUgdGhlIHNhbXBsZXMgdXNpbmcgYQorICogIGdpdmVuIGNvZGVib29rLiBTZWFyY2hlcyBmb3IgdGhlIGJlc3Qgb2Zmc2V0IHRvIG1pbmltaXplIHRoZSBiaXRzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29kZWJvb2tfYml0cyhNTFBFbmNvZGVDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCwgaW50IGNvZGVib29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVzdE9mZnNldCAqYm8sIGludCBkaXJlY3Rpb24pCit7CisgICAgaW50IHByZXZpb3VzX2NvdW50ID0gSU5UX01BWDsKKyAgICBpbnQgb2Zmc2V0X21pbiwgb2Zmc2V0X21heDsKKyAgICBpbnQgaXNfZ3JlYXRlciA9IDA7CisKKyAgICBvZmZzZXRfbWluID0gRkZNQVgobWluLCBIVUZGX09GRlNFVF9NSU4pOworICAgIG9mZnNldF9tYXggPSBGRk1JTihtYXgsIEhVRkZfT0ZGU0VUX01BWCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEJlc3RPZmZzZXQgdGVtcF9ibzsKKworICAgICAgICBjb2RlYm9va19iaXRzX29mZnNldChjdHgsIGNoYW5uZWwsIGNvZGVib29rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4sIG1heCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcF9ibyk7CisKKyAgICAgICAgaWYgKHRlbXBfYm8uYml0Y291bnQgPCBwcmV2aW91c19jb3VudCkgeworICAgICAgICAgICAgaWYgKHRlbXBfYm8uYml0Y291bnQgPCBiby0+Yml0Y291bnQpCisgICAgICAgICAgICAgICAgKmJvID0gdGVtcF9ibzsKKworICAgICAgICAgICAgaXNfZ3JlYXRlciA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoKytpc19ncmVhdGVyID49IGN0eC0+bWF4X2NvZGVib29rX3NlYXJjaCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHByZXZpb3VzX2NvdW50ID0gdGVtcF9iby5iaXRjb3VudDsKKworICAgICAgICBpZiAoZGlyZWN0aW9uKSB7CisgICAgICAgICAgICBvZmZzZXQgPSB0ZW1wX2JvLm1heCArIDE7CisgICAgICAgICAgICBpZiAob2Zmc2V0ID4gb2Zmc2V0X21heCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9mZnNldCA9IHRlbXBfYm8ubWluIC0gMTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBvZmZzZXRfbWluKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisvKiogRGV0ZXJtaW5lcyB0aGUgbGVhc3QgYW1vdW50IG9mIGJpdHMgbmVlZGVkIHRvIGVuY29kZSB0aGUgc2FtcGxlcyB1c2luZworICogIGFueSBvciBubyBjb2RlYm9vay4KKyAqLworc3RhdGljIHZvaWQgZGV0ZXJtaW5lX2JpdHMoTUxQRW5jb2RlQ29udGV4dCAqY3R4KQoreworICAgIERlY29kaW5nUGFyYW1zICpkcCA9IGN0eC0+Y3VyX2RlY29kaW5nX3BhcmFtczsKKyAgICBSZXN0YXJ0SGVhZGVyICAqcmggPSBjdHgtPmN1cl9yZXN0YXJ0X2hlYWRlcjsKKyAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKworICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPD0gcmgtPm1heF9jaGFubmVsOyBjaGFubmVsKyspIHsKKyAgICAgICAgQ2hhbm5lbFBhcmFtcyAqY3AgPSAmY3R4LT5jdXJfY2hhbm5lbF9wYXJhbXNbY2hhbm5lbF07CisgICAgICAgIGludDMyX3QgKnNhbXBsZV9idWZmZXIgPSBjdHgtPnNhbXBsZV9idWZmZXIgKyBjaGFubmVsOworICAgICAgICBpbnQzMl90IG1pbiA9IElOVDMyX01BWCwgbWF4ID0gSU5UMzJfTUlOOworICAgICAgICBpbnQgbm9fZmlsdGVyc191c2VkID0gIWNwLT5maWx0ZXJfcGFyYW1zW0ZJUl0ub3JkZXI7CisgICAgICAgIGludCBhdmVyYWdlID0gMDsKKyAgICAgICAgaW50IG9mZnNldCA9IDA7CisgICAgICAgIGludCBpOworCisgICAgICAgIC8qIERldGVybWluZSBleHRyZW1lcyBhbmQgYXZlcmFnZS4gKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGRwLT5ibG9ja3NpemU7IGkrKykgeworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGUgPSAqc2FtcGxlX2J1ZmZlciA+PiBkcC0+cXVhbnRfc3RlcF9zaXplW2NoYW5uZWxdOworICAgICAgICAgICAgaWYgKHNhbXBsZSA8IG1pbikKKyAgICAgICAgICAgICAgICBtaW4gPSBzYW1wbGU7CisgICAgICAgICAgICBpZiAoc2FtcGxlID4gbWF4KQorICAgICAgICAgICAgICAgIG1heCA9IHNhbXBsZTsKKyAgICAgICAgICAgIGF2ZXJhZ2UgKz0gc2FtcGxlOworICAgICAgICAgICAgc2FtcGxlX2J1ZmZlciArPSBjdHgtPm51bV9jaGFubmVsczsKKyAgICAgICAgfQorICAgICAgICBhdmVyYWdlIC89IGRwLT5ibG9ja3NpemU7CisKKyAgICAgICAgLyogSWYgZmlsdGVyaW5nIGlzIHVzZWQsIHdlIGFsd2F5cyBzZXQgdGhlIG9mZnNldCB0byB6ZXJvLCBvdGhlcndpc2UKKyAgICAgICAgICogd2Ugc2VhcmNoIGZvciB0aGUgb2Zmc2V0IHRoYXQgbWluaW1pemVzIHRoZSBiaXRjb3VudC4gKi8KKyAgICAgICAgaWYgKG5vX2ZpbHRlcnNfdXNlZCkgeworICAgICAgICAgICAgbm9fY29kZWJvb2tfYml0cyhjdHgsIGNoYW5uZWwsIG1pbiwgbWF4LCAmY3R4LT5jdXJfYmVzdF9vZmZzZXRbY2hhbm5lbF1bMF0pOworICAgICAgICAgICAgb2Zmc2V0ID0gYXZfY2xpcChhdmVyYWdlLCBIVUZGX09GRlNFVF9NSU4sIEhVRkZfT0ZGU0VUX01BWCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBub19jb2RlYm9va19iaXRzX29mZnNldChjdHgsIGNoYW5uZWwsIG9mZnNldCwgbWluLCBtYXgsICZjdHgtPmN1cl9iZXN0X29mZnNldFtjaGFubmVsXVswXSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgTlVNX0NPREVCT09LUzsgaSsrKSB7CisgICAgICAgICAgICBCZXN0T2Zmc2V0IHRlbXBfYm8gPSB7IDAsIElOVF9NQVgsIDAsIDAsIDAsIH07CisgICAgICAgICAgICBpbnQxNl90IG9mZnNldF9tYXg7CisKKyAgICAgICAgICAgIGNvZGVib29rX2JpdHNfb2Zmc2V0KGN0eCwgY2hhbm5lbCwgaSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4sIG1heCwgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlbXBfYm8pOworCisgICAgICAgICAgICBpZiAobm9fZmlsdGVyc191c2VkKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0X21heCA9IHRlbXBfYm8ubWF4OworCisgICAgICAgICAgICAgICAgY29kZWJvb2tfYml0cyhjdHgsIGNoYW5uZWwsIGkgLSAxLCB0ZW1wX2JvLm1pbiAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluLCBtYXgsICZ0ZW1wX2JvLCAwKTsKKyAgICAgICAgICAgICAgICBjb2RlYm9va19iaXRzKGN0eCwgY2hhbm5lbCwgaSAtIDEsIG9mZnNldF9tYXggKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiwgbWF4LCAmdGVtcF9ibywgMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN0eC0+Y3VyX2Jlc3Rfb2Zmc2V0W2NoYW5uZWxdW2ldID0gdGVtcF9ibzsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKiogRnVuY3Rpb25zIHRoYXQgcHJvY2VzcyB0aGUgZGF0YSBpbiBzb21lIHdheSAqKioqKioqKioqKioqKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTQU1QTEVfTUFYKGJpdGRlcHRoKSAoKDEgPDwgKGJpdGRlcHRoIC0gMSkpIC0gMSkKKyNkZWZpbmUgU0FNUExFX01JTihiaXRkZXB0aCkgKH5TQU1QTEVfTUFYKGJpdGRlcHRoKSkKKworI2RlZmluZSBNU0JfTUFTSyhiaXRzKSAgKC0xdSA8PCBiaXRzKQorCisvKiogQXBwbGllcyB0aGUgZmlsdGVyIHRvIHRoZSBjdXJyZW50IHNhbXBsZXMsIGFuZCBzYXZlcyB0aGUgcmVzaWR1YWwgYmFjaworICogIGludG8gdGhlIHNhbXBsZXMgYnVmZmVyLiBJZiB0aGUgZmlsdGVyIGlzIHRvbyBiYWQgYW5kIG92ZXJmbG93cyB0aGUKKyAqICBtYXhpbXVtIGFtb3VudCBvZiBiaXRzIGFsbG93ZWQgKDE2IG9yIDI0KSwgdGhlIHNhbXBsZXMgYnVmZmVyIGlzIGxlZnQgYXMgaXMgYW5kCisgKiAgdGhlIGZ1bmN0aW9uIHJldHVybnMgLTEuCisgKi8KK3N0YXRpYyBpbnQgYXBwbHlfZmlsdGVyKE1MUEVuY29kZUNvbnRleHQgKmN0eCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisgICAgRmlsdGVyUGFyYW1zICpmcFtOVU1fRklMVEVSU10gPSB7ICZjdHgtPmN1cl9jaGFubmVsX3BhcmFtc1tjaGFubmVsXS5maWx0ZXJfcGFyYW1zW0ZJUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPmN1cl9jaGFubmVsX3BhcmFtc1tjaGFubmVsXS5maWx0ZXJfcGFyYW1zW0lJUl0sIH07CisgICAgaW50MzJfdCAqZmlsdGVyX3N0YXRlX2J1ZmZlcltOVU1fRklMVEVSU107CisgICAgaW50MzJfdCBtYXNrID0gTVNCX01BU0soY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zLT5xdWFudF9zdGVwX3NpemVbY2hhbm5lbF0pOworICAgIGludDMyX3QgKnNhbXBsZV9idWZmZXIgPSBjdHgtPnNhbXBsZV9idWZmZXIgKyBjaGFubmVsOworICAgIHVuc2lnbmVkIGludCBudW1iZXJfb2Zfc2FtcGxlcyA9IGN0eC0+bnVtYmVyX29mX3NhbXBsZXM7CisgICAgdW5zaWduZWQgaW50IGZpbHRlcl9zaGlmdCA9IGZwW0ZJUl0tPnNoaWZ0OworICAgIGludCBmaWx0ZXI7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0ZJTFRFUlM7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IGN0eC0+bnVtYmVyX29mX3NhbXBsZXM7CisgICAgICAgIGZpbHRlcl9zdGF0ZV9idWZmZXJbaV0gPSBhdl9tYWxsb2Moc2l6ZSpzaXplb2YoaW50MzJfdCkpOworICAgICAgICBpZiAoIWZpbHRlcl9zdGF0ZV9idWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBhcHBseWluZyBmaWx0ZXJzLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGZpbHRlcl9zdGF0ZV9idWZmZXJbRklSXVtpXSA9ICpzYW1wbGVfYnVmZmVyOworICAgICAgICBmaWx0ZXJfc3RhdGVfYnVmZmVyW0lJUl1baV0gPSAqc2FtcGxlX2J1ZmZlcjsKKworICAgICAgICBzYW1wbGVfYnVmZmVyICs9IGN0eC0+bnVtX2NoYW5uZWxzOworICAgIH0KKworICAgIGZvciAoaSA9IDg7IGkgPCBudW1iZXJfb2Zfc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlID0gKnNhbXBsZV9idWZmZXI7CisgICAgICAgIHVuc2lnbmVkIGludCBvcmRlcjsKKyAgICAgICAgaW50NjRfdCBhY2N1bSA9IDA7CisgICAgICAgIGludDMyX3QgcmVzaWR1YWw7CisKKyAgICAgICAgZm9yIChmaWx0ZXIgPSAwOyBmaWx0ZXIgPCBOVU1fRklMVEVSUzsgZmlsdGVyKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgKmZjb2VmZiA9IGN0eC0+Y3VyX2NoYW5uZWxfcGFyYW1zW2NoYW5uZWxdLmNvZWZmW2ZpbHRlcl07CisgICAgICAgICAgICBmb3IgKG9yZGVyID0gMDsgb3JkZXIgPCBmcFtmaWx0ZXJdLT5vcmRlcjsgb3JkZXIrKykKKyAgICAgICAgICAgICAgICBhY2N1bSArPSAoaW50NjRfdClmaWx0ZXJfc3RhdGVfYnVmZmVyW2ZpbHRlcl1baSAtIDEgLSBvcmRlcl0gKgorICAgICAgICAgICAgICAgICAgICAgICAgIGZjb2VmZltvcmRlcl07CisgICAgICAgIH0KKworICAgICAgICBhY2N1bSAgPj49IGZpbHRlcl9zaGlmdDsKKyAgICAgICAgcmVzaWR1YWwgPSBzYW1wbGUgLSAoYWNjdW0gJiBtYXNrKTsKKworICAgICAgICBpZiAocmVzaWR1YWwgPCBTQU1QTEVfTUlOKGN0eC0+d29yZGxlbmd0aCkgfHwgcmVzaWR1YWwgPiBTQU1QTEVfTUFYKGN0eC0+d29yZGxlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgZmlsdGVyX3N0YXRlX2J1ZmZlcltGSVJdW2ldID0gc2FtcGxlOworICAgICAgICBmaWx0ZXJfc3RhdGVfYnVmZmVyW0lJUl1baV0gPSByZXNpZHVhbDsKKworICAgICAgICBzYW1wbGVfYnVmZmVyICs9IGN0eC0+bnVtX2NoYW5uZWxzOworICAgIH0KKworICAgIHNhbXBsZV9idWZmZXIgPSBjdHgtPnNhbXBsZV9idWZmZXIgKyBjaGFubmVsOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2Zfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICpzYW1wbGVfYnVmZmVyID0gZmlsdGVyX3N0YXRlX2J1ZmZlcltJSVJdW2ldOworCisgICAgICAgIHNhbXBsZV9idWZmZXIgKz0gY3R4LT5udW1fY2hhbm5lbHM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9GSUxURVJTOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJmZpbHRlcl9zdGF0ZV9idWZmZXJbaV0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcHBseV9maWx0ZXJzKE1MUEVuY29kZUNvbnRleHQgKmN0eCkKK3sKKyAgICBSZXN0YXJ0SGVhZGVyICpyaCA9IGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyOworICAgIGludCBjaGFubmVsOworCisgICAgZm9yIChjaGFubmVsID0gcmgtPm1pbl9jaGFubmVsOyBjaGFubmVsIDw9IHJoLT5tYXhfY2hhbm5lbDsgY2hhbm5lbCsrKSB7CisgICAgICAgIGlmIChhcHBseV9maWx0ZXIoY3R4LCBjaGFubmVsKSA8IDApIHsKKyAgICAgICAgICAgIC8qIEZpbHRlciBpcyBob3JyaWJseSB3cm9uZy4KKyAgICAgICAgICAgICAqIENsZWFyIGZpbHRlciBwYXJhbXMgYW5kIHVwZGF0ZSBzdGF0ZS4gKi8KKyAgICAgICAgICAgIHNldF9maWx0ZXJfcGFyYW1zKGN0eCwgY2hhbm5lbCwgRklSLCAxKTsKKyAgICAgICAgICAgIHNldF9maWx0ZXJfcGFyYW1zKGN0eCwgY2hhbm5lbCwgSUlSLCAxKTsKKyAgICAgICAgICAgIGFwcGx5X2ZpbHRlcihjdHgsIGNoYW5uZWwpOworICAgICAgICB9CisgICAgfQorfQorCisvKiogR2VuZXJhdGVzIHR3byBub2lzZSBjaGFubmVscyB3b3J0aCBvZiBkYXRhLiAqLworc3RhdGljIHZvaWQgZ2VuZXJhdGVfMl9ub2lzZV9jaGFubmVscyhNTFBFbmNvZGVDb250ZXh0ICpjdHgpCit7CisgICAgaW50MzJfdCAqc2FtcGxlX2J1ZmZlciA9IGN0eC0+c2FtcGxlX2J1ZmZlciArIGN0eC0+bnVtX2NoYW5uZWxzIC0gMjsKKyAgICBSZXN0YXJ0SGVhZGVyICpyaCA9IGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyOworICAgIHVuc2lnbmVkIGludCBpOworICAgIHVpbnQzMl90IHNlZWQgPSByaC0+bm9pc2VnZW5fc2VlZDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bWJlcl9vZl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgdWludDE2X3Qgc2VlZF9zaHI3ID0gc2VlZCA+PiA3OworICAgICAgICAqc2FtcGxlX2J1ZmZlcisrID0gKChpbnQ4X3QpKHNlZWQgPj4gMTUpKSA8PCByaC0+bm9pc2Vfc2hpZnQ7CisgICAgICAgICpzYW1wbGVfYnVmZmVyKysgPSAoKGludDhfdCkgc2VlZF9zaHI3KSAgIDw8IHJoLT5ub2lzZV9zaGlmdDsKKworICAgICAgICBzZWVkID0gKHNlZWQgPDwgMTYpIF4gc2VlZF9zaHI3IF4gKHNlZWRfc2hyNyA8PCA1KTsKKworICAgICAgICBzYW1wbGVfYnVmZmVyICs9IGN0eC0+bnVtX2NoYW5uZWxzIC0gMjsKKyAgICB9CisKKyAgICByaC0+bm9pc2VnZW5fc2VlZCA9IHNlZWQgJiAoKDEgPDwgMjQpLTEpOworfQorCisvKiogUmVtYXRyaXhlcyBhbGwgY2hhbm5lbHMgdXNpbmcgY2hvc2VuIGNvZWZmaWNpZW50cy4gKi8KK3N0YXRpYyB2b2lkIHJlbWF0cml4X2NoYW5uZWxzKE1MUEVuY29kZUNvbnRleHQgKmN0eCkKK3sKKyAgICBEZWNvZGluZ1BhcmFtcyAqZHAgPSBjdHgtPmN1cl9kZWNvZGluZ19wYXJhbXM7CisgICAgTWF0cml4UGFyYW1zICptcCA9ICZkcC0+bWF0cml4X3BhcmFtczsKKyAgICBpbnQzMl90ICpzYW1wbGVfYnVmZmVyID0gY3R4LT5zYW1wbGVfYnVmZmVyOworICAgIHVuc2lnbmVkIGludCBtYXQsIGksIG1heGNoYW47CisKKyAgICBtYXhjaGFuID0gY3R4LT5udW1fY2hhbm5lbHM7CisKKyAgICBmb3IgKG1hdCA9IDA7IG1hdCA8IG1wLT5jb3VudDsgbWF0KyspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IG1zYl9tYXNrX2JpdHMgPSAoY3R4LT5hdmN0eC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNiA/IDggOiAwKSAtIG1wLT5zaGlmdFttYXRdOworICAgICAgICBpbnQzMl90IG1hc2sgPSBNU0JfTUFTSyhtc2JfbWFza19iaXRzKTsKKyAgICAgICAgdW5zaWduZWQgaW50IG91dGNoID0gbXAtPm91dGNoW21hdF07CisKKyAgICAgICAgc2FtcGxlX2J1ZmZlciA9IGN0eC0+c2FtcGxlX2J1ZmZlcjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtYmVyX29mX3NhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IHNyY19jaDsKKyAgICAgICAgICAgIGludDY0X3QgYWNjdW0gPSAwOworCisgICAgICAgICAgICBmb3IgKHNyY19jaCA9IDA7IHNyY19jaCA8IG1heGNoYW47IHNyY19jaCsrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGUgPSAqKHNhbXBsZV9idWZmZXIgKyBzcmNfY2gpOworICAgICAgICAgICAgICAgIGFjY3VtICs9IChpbnQ2NF90KSBzYW1wbGUgKiBtcC0+Zm9yY29bbWF0XVtzcmNfY2hdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FtcGxlX2J1ZmZlcltvdXRjaF0gPSAoYWNjdW0gPj4gMTQpICYgbWFzazsKKworICAgICAgICAgICAgc2FtcGxlX2J1ZmZlciArPSBjdHgtPm51bV9jaGFubmVsczsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqIEZ1bmN0aW9ucyB0aGF0IGRlYWwgd2l0aCBkZXRlcm1pbmluZyB0aGUgYmVzdCBwYXJhbWV0ZXJzIGFuZCBvdXRwdXQgKioqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgcGF0aFtNQUpPUl9IRUFERVJfSU5URVJWQUwgKyAzXTsKKyAgICBpbnQgICAgIGJpdGNvdW50OworfSBQYXRoQ291bnRlcjsKKworc3RhdGljIGNvbnN0IGNoYXIgKnBhdGhfY291bnRlcl9jb2RlYm9va1tdID0geyAiMCIsICIxIiwgIjIiLCAiMyIsIH07CisKKyNkZWZpbmUgWkVST19QQVRIICAgICAgICAgICAgICAgJzAnCisjZGVmaW5lIENPREVCT09LX0NIQU5HRV9CSVRTICAgIDIxCisKK3N0YXRpYyB2b2lkIGNsZWFyX3BhdGhfY291bnRlcihQYXRoQ291bnRlciAqcGF0aF9jb3VudGVyKQoreworICAgIHVuc2lnbmVkIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9DT0RFQk9PS1MgKyAxOyBpKyspIHsKKyAgICAgICAgcGF0aF9jb3VudGVyW2ldLnBhdGhbMF0gID0gWkVST19QQVRIOworICAgICAgICBwYXRoX2NvdW50ZXJbaV0ucGF0aFsxXSAgPSAgICAgIDB4MDA7CisgICAgICAgIHBhdGhfY291bnRlcltpXS5iaXRjb3VudCA9ICAgICAgICAgMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29tcGFyZV9iZXN0X29mZnNldChCZXN0T2Zmc2V0ICpwcmV2LCBCZXN0T2Zmc2V0ICpjdXIpCit7CisgICAgaWYgKHByZXYtPmxzYl9iaXRzICE9IGN1ci0+bHNiX2JpdHMpCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmVzdF9jb2RlYm9va19wYXRoX2Nvc3QoTUxQRW5jb2RlQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aENvdW50ZXIgKnNyYywgaW50IGN1cl9jb2RlYm9vaykKK3sKKyAgICBCZXN0T2Zmc2V0ICpjdXJfYm8sICpwcmV2X2JvID0gcmVzdGFydF9iZXN0X29mZnNldDsKKyAgICBpbnQgYml0Y291bnQgPSBzcmMtPmJpdGNvdW50OworICAgIGNoYXIgKnBhdGggPSBzcmMtPnBhdGggKyAxOworICAgIGludCBwcmV2X2NvZGVib29rOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgcGF0aFtpXTsgaSsrKQorICAgICAgICBwcmV2X2JvID0gY3R4LT5iZXN0X29mZnNldFtpXVtjaGFubmVsXTsKKworICAgIHByZXZfY29kZWJvb2sgPSBwYXRoW2kgLSAxXSAtIFpFUk9fUEFUSDsKKworICAgIGN1cl9ibyA9IGN0eC0+YmVzdF9vZmZzZXRbaV1bY2hhbm5lbF07CisKKyAgICBiaXRjb3VudCArPSBjdXJfYm9bY3VyX2NvZGVib29rXS5iaXRjb3VudDsKKworICAgIGlmIChwcmV2X2NvZGVib29rICE9IGN1cl9jb2RlYm9vayB8fAorICAgICAgICBjb21wYXJlX2Jlc3Rfb2Zmc2V0KCZwcmV2X2JvW3ByZXZfY29kZWJvb2tdLCAmY3VyX2JvW2N1cl9jb2RlYm9va10pKQorICAgICAgICBiaXRjb3VudCArPSBDT0RFQk9PS19DSEFOR0VfQklUUzsKKworICAgIHJldHVybiBiaXRjb3VudDsKK30KKworc3RhdGljIHZvaWQgc2V0X2Jlc3RfY29kZWJvb2soTUxQRW5jb2RlQ29udGV4dCAqY3R4KQoreworICAgIERlY29kaW5nUGFyYW1zICpkcCA9IGN0eC0+Y3VyX2RlY29kaW5nX3BhcmFtczsKKyAgICBSZXN0YXJ0SGVhZGVyICpyaCA9IGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyOworICAgIHVuc2lnbmVkIGludCBjaGFubmVsOworCisgICAgZm9yIChjaGFubmVsID0gcmgtPm1pbl9jaGFubmVsOyBjaGFubmVsIDw9IHJoLT5tYXhfY2hhbm5lbDsgY2hhbm5lbCsrKSB7CisgICAgICAgIEJlc3RPZmZzZXQgKmN1cl9ibywgKnByZXZfYm8gPSByZXN0YXJ0X2Jlc3Rfb2Zmc2V0OworICAgICAgICBQYXRoQ291bnRlciBwYXRoX2NvdW50ZXJbTlVNX0NPREVCT09LUyArIDFdOworICAgICAgICB1bnNpZ25lZCBpbnQgYmVzdF9jb2RlYm9vazsKKyAgICAgICAgdW5zaWduZWQgaW50IGluZGV4OworICAgICAgICBjaGFyICpiZXN0X3BhdGg7CisKKyAgICAgICAgY2xlYXJfcGF0aF9jb3VudGVyKHBhdGhfY291bnRlcik7CisKKyAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3R4LT5udW1iZXJfb2Zfc3ViYmxvY2tzOyBpbmRleCsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmVzdF9iaXRjb3VudCA9IElOVF9NQVg7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29kZWJvb2s7CisKKyAgICAgICAgICAgIGN1cl9ibyA9IGN0eC0+YmVzdF9vZmZzZXRbaW5kZXhdW2NoYW5uZWxdOworCisgICAgICAgICAgICBmb3IgKGNvZGVib29rID0gMDsgY29kZWJvb2sgPCBOVU1fQ09ERUJPT0tTOyBjb2RlYm9vaysrKSB7CisgICAgICAgICAgICAgICAgaW50IHByZXZfYmVzdF9iaXRjb3VudCA9IElOVF9NQVg7CisgICAgICAgICAgICAgICAgaW50IGxhc3RfYmVzdDsKKworICAgICAgICAgICAgICAgIGZvciAobGFzdF9iZXN0ID0gMDsgbGFzdF9iZXN0IDwgMjsgbGFzdF9iZXN0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgUGF0aENvdW50ZXIgKmRzdF9wYXRoID0gJnBhdGhfY291bnRlcltjb2RlYm9va107CisgICAgICAgICAgICAgICAgICAgIFBhdGhDb3VudGVyICpzcmNfcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgaW50ICB0ZW1wX2JpdGNvdW50OworCisgICAgICAgICAgICAgICAgICAgIC8qIEZpcnN0IHRlc3QgbGFzdCBwYXRoIHdpdGggc2FtZSBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgKiB0aGVuIHdpdGggbGFzdCBiZXN0LiAqLworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdF9iZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcGF0aCA9ICZwYXRoX2NvdW50ZXJbTlVNX0NPREVCT09LU107CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZV9iZXN0X29mZnNldCgmcHJldl9ib1tjb2RlYm9va10sICZjdXJfYm9bY29kZWJvb2tdKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcGF0aCA9ICZwYXRoX2NvdW50ZXJbY29kZWJvb2tdOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9iaXRjb3VudCA9IGJlc3RfY29kZWJvb2tfcGF0aF9jb3N0KGN0eCwgY2hhbm5lbCwgc3JjX3BhdGgsIGNvZGVib29rKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcF9iaXRjb3VudCA8IGJlc3RfYml0Y291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfYml0Y291bnQgPSB0ZW1wX2JpdGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9jb2RlYm9vayA9IGNvZGVib29rOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBfYml0Y291bnQgPCBwcmV2X2Jlc3RfYml0Y291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfYmVzdF9iaXRjb3VudCA9IHRlbXBfYml0Y291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX3BhdGggIT0gZHN0X3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdF9wYXRoLCBzcmNfcGF0aCwgc2l6ZW9mKFBhdGhDb3VudGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9zdHJsY2F0KGRzdF9wYXRoLT5wYXRoLCBwYXRoX2NvdW50ZXJfY29kZWJvb2tbY29kZWJvb2tdLCBzaXplb2YoZHN0X3BhdGgtPnBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9wYXRoLT5iaXRjb3VudCA9IHRlbXBfYml0Y291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByZXZfYm8gPSBjdXJfYm87CisKKyAgICAgICAgICAgIG1lbWNweSgmcGF0aF9jb3VudGVyW05VTV9DT0RFQk9PS1NdLCAmcGF0aF9jb3VudGVyW2Jlc3RfY29kZWJvb2tdLCBzaXplb2YoUGF0aENvdW50ZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJlc3RfcGF0aCA9IHBhdGhfY291bnRlcltOVU1fQ09ERUJPT0tTXS5wYXRoICsgMTsKKworICAgICAgICAvKiBVcGRhdGUgY29udGV4dC4gKi8KKyAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3R4LT5udW1iZXJfb2Zfc3ViYmxvY2tzOyBpbmRleCsrKSB7CisgICAgICAgICAgICBDaGFubmVsUGFyYW1zICpjcCA9IGN0eC0+c2VxX2NoYW5uZWxfcGFyYW1zICsgaW5kZXgqKGN0eC0+YXZjdHgtPmNoYW5uZWxzKSArIGNoYW5uZWw7CisKKyAgICAgICAgICAgIGJlc3RfY29kZWJvb2sgPSAqYmVzdF9wYXRoKysgLSBaRVJPX1BBVEg7CisgICAgICAgICAgICBjdXJfYm8gPSAmY3R4LT5iZXN0X29mZnNldFtpbmRleF1bY2hhbm5lbF1bYmVzdF9jb2RlYm9va107CisKKyAgICAgICAgICAgIGNwLT5odWZmX29mZnNldCA9IGN1cl9iby0+b2Zmc2V0OworICAgICAgICAgICAgY3AtPmh1ZmZfbHNicyAgID0gY3VyX2JvLT5sc2JfYml0cyArIGRwLT5xdWFudF9zdGVwX3NpemVbY2hhbm5lbF07CisgICAgICAgICAgICBjcC0+Y29kZWJvb2sgICAgPSBiZXN0X2NvZGVib29rOworICAgICAgICB9CisgICAgfQorfQorCisvKiogQW5hbHl6ZXMgYWxsIGNvbGxlY3RlZCBiaXRjb3VudHMgYW5kIHNlbGVjdHMgdGhlIGJlc3QgcGFyYW1ldGVycyBmb3IgZWFjaAorICogIGluZGl2aWR1YWwgYWNjZXNzIHVuaXQuCisgKiAgVE9ETyBUaGlzIGlzIGp1c3QgYSBzdHViIQorICovCitzdGF0aWMgdm9pZCBzZXRfbWFqb3JfcGFyYW1zKE1MUEVuY29kZUNvbnRleHQgKmN0eCkKK3sKKyAgICBSZXN0YXJ0SGVhZGVyICpyaCA9IGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyOworICAgIHVuc2lnbmVkIGludCBpbmRleDsKKyAgICB1bnNpZ25lZCBpbnQgc3Vic3RyOworICAgIHVpbnQ4X3QgbWF4X2h1ZmZfbHNicyA9IDA7CisgICAgdWludDhfdCBtYXhfb3V0cHV0X2JpdHMgPSAwOworCisgICAgZm9yIChzdWJzdHIgPSAwOyBzdWJzdHIgPCBjdHgtPm51bV9zdWJzdHJlYW1zOyBzdWJzdHIrKykgeworICAgICAgICBEZWNvZGluZ1BhcmFtcyAqc2VxX2RwID0gKERlY29kaW5nUGFyYW1zICopIGN0eC0+ZGVjb2RpbmdfcGFyYW1zKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eC0+cmVzdGFydF9pbnRlcnZhbHMgLSAxKSooY3R4LT5zZXF1ZW5jZV9zaXplKSooY3R4LT5hdmN0eC0+Y2hhbm5lbHMpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjdHgtPnNlcV9vZmZzZXRbY3R4LT5yZXN0YXJ0X2ludGVydmFscyAtIDFdKSooY3R4LT5hdmN0eC0+Y2hhbm5lbHMpOworCisgICAgICAgIENoYW5uZWxQYXJhbXMgKnNlcV9jcCA9IChDaGFubmVsUGFyYW1zICopIGN0eC0+Y2hhbm5lbF9wYXJhbXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5yZXN0YXJ0X2ludGVydmFscyAtIDEpKihjdHgtPnNlcXVlbmNlX3NpemUpKihjdHgtPmF2Y3R4LT5jaGFubmVscykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5zZXFfb2Zmc2V0W2N0eC0+cmVzdGFydF9pbnRlcnZhbHMgLSAxXSkqKGN0eC0+YXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWw7CisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGN0eC0+c2VxX3NpemVbY3R4LT5yZXN0YXJ0X2ludGVydmFscy0xXTsgaW5kZXgrKykgeworICAgICAgICAgICAgbWVtY3B5KCZjdHgtPm1ham9yX2RlY29kaW5nX3BhcmFtc1tpbmRleF1bc3Vic3RyXSwgc2VxX2RwICsgaW5kZXgqKGN0eC0+bnVtX3N1YnN0cmVhbXMpICsgc3Vic3RyLCBzaXplb2YoRGVjb2RpbmdQYXJhbXMpKTsKKyAgICAgICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjdHgtPmF2Y3R4LT5jaGFubmVsczsgY2hhbm5lbCsrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBodWZmX2xzYnMgPSAoc2VxX2NwICsgaW5kZXgqKGN0eC0+YXZjdHgtPmNoYW5uZWxzKSArIGNoYW5uZWwpLT5odWZmX2xzYnM7CisgICAgICAgICAgICAgICAgaWYgKG1heF9odWZmX2xzYnMgPCBodWZmX2xzYnMpCisgICAgICAgICAgICAgICAgICAgIG1heF9odWZmX2xzYnMgPSBodWZmX2xzYnM7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjdHgtPm1ham9yX2NoYW5uZWxfcGFyYW1zW2luZGV4XVtjaGFubmVsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHNlcV9jcCArIGluZGV4KihjdHgtPmF2Y3R4LT5jaGFubmVscykgKyBjaGFubmVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENoYW5uZWxQYXJhbXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJoLT5tYXhfaHVmZl9sc2JzID0gbWF4X2h1ZmZfbHNiczsKKworICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGN0eC0+bnVtYmVyX29mX2ZyYW1lczsgaW5kZXgrKykKKyAgICAgICAgaWYgKG1heF9vdXRwdXRfYml0cyA8IGN0eC0+bWF4X291dHB1dF9iaXRzW2luZGV4XSkKKyAgICAgICAgICAgIG1heF9vdXRwdXRfYml0cyA9IGN0eC0+bWF4X291dHB1dF9iaXRzW2luZGV4XTsKKyAgICByaC0+bWF4X291dHB1dF9iaXRzID0gbWF4X291dHB1dF9iaXRzOworCisgICAgZm9yIChzdWJzdHIgPSAwOyBzdWJzdHIgPCBjdHgtPm51bV9zdWJzdHJlYW1zOyBzdWJzdHIrKykgeworCisgICAgICAgIGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyID0gJmN0eC0+cmVzdGFydF9oZWFkZXJbc3Vic3RyXTsKKworICAgICAgICBjdHgtPnByZXZfZGVjb2RpbmdfcGFyYW1zID0gJnJlc3RhcnRfZGVjb2RpbmdfcGFyYW1zW3N1YnN0cl07CisgICAgICAgIGN0eC0+cHJldl9jaGFubmVsX3BhcmFtcyA9IHJlc3RhcnRfY2hhbm5lbF9wYXJhbXM7CisKKyAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgTUFKT1JfSEVBREVSX0lOVEVSVkFMICsgMTsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGN0eC0+Y3VyX2RlY29kaW5nX3BhcmFtcyA9ICZjdHgtPm1ham9yX2RlY29kaW5nX3BhcmFtc1tpbmRleF1bc3Vic3RyXTsKKyAgICAgICAgICAgICAgICBjdHgtPmN1cl9jaGFubmVsX3BhcmFtcyA9IGN0eC0+bWFqb3JfY2hhbm5lbF9wYXJhbXNbaW5kZXhdOworCisgICAgICAgICAgICAgICAgY3R4LT5tYWpvcl9wYXJhbXNfY2hhbmdlZFtpbmRleF1bc3Vic3RyXSA9IGNvbXBhcmVfZGVjb2RpbmdfcGFyYW1zKGN0eCk7CisKKyAgICAgICAgICAgICAgICBjdHgtPnByZXZfZGVjb2RpbmdfcGFyYW1zID0gY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zOworICAgICAgICAgICAgICAgIGN0eC0+cHJldl9jaGFubmVsX3BhcmFtcyA9IGN0eC0+Y3VyX2NoYW5uZWxfcGFyYW1zOworICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5tYWpvcl9udW1iZXJfb2Zfc3ViYmxvY2tzID0gY3R4LT5udW1iZXJfb2Zfc3ViYmxvY2tzOworICAgIGN0eC0+bWFqb3JfZmlsdGVyX3N0YXRlX3N1YmJsb2NrID0gMTsKKyAgICBjdHgtPm1ham9yX2N1cl9zdWJibG9ja19pbmRleCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGFuYWx5emVfc2FtcGxlX2J1ZmZlcihNTFBFbmNvZGVDb250ZXh0ICpjdHgpCit7CisgICAgQ2hhbm5lbFBhcmFtcyAqc2VxX2NwID0gY3R4LT5zZXFfY2hhbm5lbF9wYXJhbXM7CisgICAgRGVjb2RpbmdQYXJhbXMgKnNlcV9kcCA9IGN0eC0+c2VxX2RlY29kaW5nX3BhcmFtczsKKyAgICB1bnNpZ25lZCBpbnQgaW5kZXg7CisgICAgdW5zaWduZWQgaW50IHN1YnN0cjsKKworICAgIGZvciAoc3Vic3RyID0gMDsgc3Vic3RyIDwgY3R4LT5udW1fc3Vic3RyZWFtczsgc3Vic3RyKyspIHsKKworICAgICAgICBjdHgtPmN1cl9yZXN0YXJ0X2hlYWRlciA9ICZjdHgtPnJlc3RhcnRfaGVhZGVyW3N1YnN0cl07CisgICAgICAgIGN0eC0+Y3VyX2RlY29kaW5nX3BhcmFtcyA9IHNlcV9kcCArIDEqKGN0eC0+bnVtX3N1YnN0cmVhbXMpICsgc3Vic3RyOworICAgICAgICBjdHgtPmN1cl9jaGFubmVsX3BhcmFtcyA9IHNlcV9jcCArIDEqKGN0eC0+YXZjdHgtPmNoYW5uZWxzKTsKKworICAgICAgICBkZXRlcm1pbmVfcXVhbnRfc3RlcF9zaXplKGN0eCk7CisgICAgICAgIGdlbmVyYXRlXzJfbm9pc2VfY2hhbm5lbHMoY3R4KTsKKyAgICAgICAgbG9zc2xlc3NfbWF0cml4X2NvZWZmcyAgIChjdHgpOworICAgICAgICByZW1hdHJpeF9jaGFubmVscyAgICAgICAgKGN0eCk7CisgICAgICAgIGRldGVybWluZV9maWx0ZXJzICAgICAgICAoY3R4KTsKKyAgICAgICAgYXBwbHlfZmlsdGVycyAgICAgICAgICAgIChjdHgpOworCisgICAgICAgIGNvcHlfcmVzdGFydF9mcmFtZV9wYXJhbXMoY3R4LCBzdWJzdHIpOworCisgICAgICAgIC8qIENvcHkgZnJhbWVfc2l6ZSBmcm9tIGZyYW1lcyAwLi4ubWF4IHRvIGRlY29kaW5nX3BhcmFtcyAxLi4ubWF4ICsgMQorICAgICAgICAgKiBkZWNvZGluZ19wYXJhbXNbMF0gaXMgZm9yIHRoZSBmaWx0ZXIgc3RhdGUgc3ViYmxvY2suCisgICAgICAgICAqLworICAgICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBjdHgtPm51bWJlcl9vZl9mcmFtZXM7IGluZGV4KyspIHsKKyAgICAgICAgICAgIERlY29kaW5nUGFyYW1zICpkcCA9IHNlcV9kcCArIChpbmRleCArIDEpKihjdHgtPm51bV9zdWJzdHJlYW1zKSArIHN1YnN0cjsKKyAgICAgICAgICAgIGRwLT5ibG9ja3NpemUgPSBjdHgtPmZyYW1lX3NpemVbaW5kZXhdOworICAgICAgICB9CisgICAgICAgIC8qIFRoZSBvZmZpY2lhbCBlbmNvZGVyIHNlZW1zIHRvIGFsd2F5cyBlbmNvZGUgYSBmaWx0ZXIgc3RhdGUgc3ViYmxvY2sKKyAgICAgICAgICogZXZlbiBpZiB0aGVyZSBhcmUgbm8gZmlsdGVycy4gVE9ETyBjaGVjayBpZiBpdCBpcyBwb3NzaWJsZSB0byBza2lwCisgICAgICAgICAqIHRoZSBmaWx0ZXIgc3RhdGUgc3ViYmxvY2sgZm9yIG5vIGZpbHRlcnMuCisgICAgICAgICAqLworICAgICAgICAoc2VxX2RwICsgc3Vic3RyKS0+YmxvY2tzaXplICA9IDg7CisgICAgICAgIChzZXFfZHAgKyAxKihjdHgtPm51bV9zdWJzdHJlYW1zKSArIHN1YnN0ciktPmJsb2Nrc2l6ZSAtPSA4OworCisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGN0eC0+bnVtYmVyX29mX3N1YmJsb2NrczsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGN0eC0+Y3VyX2RlY29kaW5nX3BhcmFtcyA9IHNlcV9kcCArIGluZGV4KihjdHgtPm51bV9zdWJzdHJlYW1zKSArIHN1YnN0cjsKKyAgICAgICAgICAgICAgICBjdHgtPmN1cl9jaGFubmVsX3BhcmFtcyA9IHNlcV9jcCArIGluZGV4KihjdHgtPmF2Y3R4LT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgY3R4LT5jdXJfYmVzdF9vZmZzZXQgPSBjdHgtPmJlc3Rfb2Zmc2V0W2luZGV4XTsKKyAgICAgICAgICAgICAgICBkZXRlcm1pbmVfYml0cyhjdHgpOworICAgICAgICAgICAgICAgIGN0eC0+c2FtcGxlX2J1ZmZlciArPSBjdHgtPmN1cl9kZWNvZGluZ19wYXJhbXMtPmJsb2Nrc2l6ZSAqIGN0eC0+bnVtX2NoYW5uZWxzOworICAgICAgICB9CisKKyAgICAgICAgc2V0X2Jlc3RfY29kZWJvb2soY3R4KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfbWFqb3JfZnJhbWUoTUxQRW5jb2RlQ29udGV4dCAqY3R4KQoreworICAgIHVuc2lnbmVkIGludCBzdWJzdHI7CisKKyAgICBjdHgtPnNhbXBsZV9idWZmZXIgPSBjdHgtPm1ham9yX2lub3V0X2J1ZmZlcjsKKworICAgIGN0eC0+c3RhcnRpbmdfZnJhbWVfaW5kZXggPSAwOworICAgIGN0eC0+bnVtYmVyX29mX2ZyYW1lcyA9IGN0eC0+bWFqb3JfbnVtYmVyX29mX2ZyYW1lczsKKyAgICBjdHgtPm51bWJlcl9vZl9zYW1wbGVzID0gY3R4LT5tYWpvcl9mcmFtZV9zaXplOworCisgICAgZm9yIChzdWJzdHIgPSAwOyBzdWJzdHIgPCBjdHgtPm51bV9zdWJzdHJlYW1zOyBzdWJzdHIrKykgeworICAgICAgICBSZXN0YXJ0SGVhZGVyICpyaCA9IGN0eC0+Y3VyX3Jlc3RhcnRfaGVhZGVyOworICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKworICAgICAgICBjdHgtPmN1cl9yZXN0YXJ0X2hlYWRlciA9ICZjdHgtPnJlc3RhcnRfaGVhZGVyW3N1YnN0cl07CisKKyAgICAgICAgY3R4LT5jdXJfZGVjb2RpbmdfcGFyYW1zID0gJmN0eC0+bWFqb3JfZGVjb2RpbmdfcGFyYW1zWzFdW3N1YnN0cl07CisgICAgICAgIGN0eC0+Y3VyX2NoYW5uZWxfcGFyYW1zID0gY3R4LT5tYWpvcl9jaGFubmVsX3BhcmFtc1sxXTsKKworICAgICAgICBnZW5lcmF0ZV8yX25vaXNlX2NoYW5uZWxzKGN0eCk7CisgICAgICAgIHJlbWF0cml4X2NoYW5uZWxzICAgICAgICAoY3R4KTsKKworICAgICAgICBmb3IgKGNoYW5uZWwgPSByaC0+bWluX2NoYW5uZWw7IGNoYW5uZWwgPD0gcmgtPm1heF9jaGFubmVsOyBjaGFubmVsKyspCisgICAgICAgICAgICBhcHBseV9maWx0ZXIoY3R4LCBjaGFubmVsKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IG1scF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldCkKK3sKKyAgICBNTFBFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIGludCBieXRlc193cml0dGVuID0gMDsKKyAgICBpbnQgcmVzdGFydF9mcmFtZSwgcmV0OworICAgIHVpbnQ4X3QgKmRhdGE7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCA4NzUwMCAqIGF2Y3R4LT5jaGFubmVscywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVybiAxOworCisgICAgLyogYWRkIGN1cnJlbnQgZnJhbWUgdG8gcXVldWUgKi8KKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9hZl9xdWV1ZV9hZGQoJmN0eC0+YWZxLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZGF0YSA9IGZyYW1lLT5kYXRhWzBdOworCisgICAgY3R4LT5mcmFtZV9pbmRleCA9IGF2Y3R4LT5mcmFtZV9udW1iZXIgJSBjdHgtPm1heF9yZXN0YXJ0X2ludGVydmFsOworCisgICAgY3R4LT5pbm91dF9idWZmZXIgPSBjdHgtPm1ham9yX2lub3V0X2J1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICsgY3R4LT5mcmFtZV9pbmRleCAqIGN0eC0+b25lX3NhbXBsZV9idWZmZXJfc2l6ZTsKKworICAgIGlmIChjdHgtPmxhc3RfZnJhbWUgPT0gY3R4LT5pbm91dF9idWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY3R4LT5zYW1wbGVfYnVmZmVyID0gY3R4LT5tYWpvcl9zY3JhdGNoX2J1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICArIGN0eC0+ZnJhbWVfaW5kZXggKiBjdHgtPm9uZV9zYW1wbGVfYnVmZmVyX3NpemU7CisKKyAgICBjdHgtPndyaXRlX2J1ZmZlciA9IGN0eC0+aW5vdXRfYnVmZmVyOworCisgICAgaWYgKGF2Y3R4LT5mcmFtZV9udW1iZXIgPCBjdHgtPm1heF9yZXN0YXJ0X2ludGVydmFsKSB7CisgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICBnb3RvIGlucHV0X2FuZF9yZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBUaGVyZSBhcmUgbGVzcyBmcmFtZXMgdGhhbiB0aGUgcmVxdWVzdGVkIG1ham9yIGhlYWRlciBpbnRlcnZhbC4KKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgY29udGV4dCB0byByZWZsZWN0IHRoaXMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGN0eC0+bWF4X3Jlc3RhcnRfaW50ZXJ2YWwgPSBhdmN0eC0+ZnJhbWVfbnVtYmVyOworICAgICAgICAgICAgY3R4LT5mcmFtZV9pbmRleCA9IDA7CisKKyAgICAgICAgICAgIGN0eC0+c2FtcGxlX2J1ZmZlciA9IGN0eC0+bWFqb3Jfc2NyYXRjaF9idWZmZXI7CisgICAgICAgICAgICBjdHgtPmlub3V0X2J1ZmZlciA9IGN0eC0+bWFqb3JfaW5vdXRfYnVmZmVyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN0eC0+ZnJhbWVfc2l6ZVtjdHgtPmZyYW1lX2luZGV4XSA+IE1BWF9CTE9DS1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGZyYW1lIHNpemUgKCVkID4gJWQpXG4iLAorICAgICAgICAgICAgICAgY3R4LT5mcmFtZV9zaXplW2N0eC0+ZnJhbWVfaW5kZXhdLCBNQVhfQkxPQ0tTSVpFKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJlc3RhcnRfZnJhbWUgPSAhY3R4LT5mcmFtZV9pbmRleDsKKworICAgIGlmIChyZXN0YXJ0X2ZyYW1lKSB7CisgICAgICAgIHNldF9tYWpvcl9wYXJhbXMoY3R4KTsKKyAgICAgICAgaWYgKGN0eC0+bWluX3Jlc3RhcnRfaW50ZXJ2YWwgIT0gY3R4LT5tYXhfcmVzdGFydF9pbnRlcnZhbCkKKyAgICAgICAgcHJvY2Vzc19tYWpvcl9mcmFtZShjdHgpOworICAgIH0KKworICAgIGlmIChjdHgtPm1pbl9yZXN0YXJ0X2ludGVydmFsID09IGN0eC0+bWF4X3Jlc3RhcnRfaW50ZXJ2YWwpCisgICAgICAgIGN0eC0+d3JpdGVfYnVmZmVyID0gY3R4LT5zYW1wbGVfYnVmZmVyOworCisgICAgYnl0ZXNfd3JpdHRlbiA9IHdyaXRlX2FjY2Vzc191bml0KGN0eCwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplLCByZXN0YXJ0X2ZyYW1lKTsKKworICAgIGN0eC0+dGltZXN0YW1wICs9IGN0eC0+ZnJhbWVfc2l6ZVtjdHgtPmZyYW1lX2luZGV4XTsKKyAgICBjdHgtPmR0cyAgICAgICArPSBjdHgtPmZyYW1lX3NpemVbY3R4LT5mcmFtZV9pbmRleF07CisKK2lucHV0X2FuZF9yZXR1cm46CisKKyAgICBpZiAoZGF0YSkgeworICAgICAgICBjdHgtPmZyYW1lX3NpemVbY3R4LT5mcmFtZV9pbmRleF0gPSBhdmN0eC0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgY3R4LT5uZXh0X21ham9yX2ZyYW1lX3NpemUgKz0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgICAgIGN0eC0+bmV4dF9tYWpvcl9udW1iZXJfb2ZfZnJhbWVzKys7CisgICAgICAgIGlucHV0X2RhdGEoY3R4LCBkYXRhKTsKKyAgICB9IGVsc2UgaWYgKCFjdHgtPmxhc3RfZnJhbWUpIHsKKyAgICAgICAgY3R4LT5sYXN0X2ZyYW1lID0gY3R4LT5pbm91dF9idWZmZXI7CisgICAgfQorCisgICAgcmVzdGFydF9mcmFtZSA9IChjdHgtPmZyYW1lX2luZGV4ICsgMSkgJSBjdHgtPm1pbl9yZXN0YXJ0X2ludGVydmFsOworCisgICAgaWYgKCFyZXN0YXJ0X2ZyYW1lKSB7CisgICAgICAgIGludCBzZXFfaW5kZXg7CisKKyAgICAgICAgZm9yIChzZXFfaW5kZXggPSAwOworICAgICAgICAgICAgIHNlcV9pbmRleCA8IGN0eC0+cmVzdGFydF9pbnRlcnZhbHMgJiYgKHNlcV9pbmRleCAqIGN0eC0+bWluX3Jlc3RhcnRfaW50ZXJ2YWwpIDw9IGN0eC0+YXZjdHgtPmZyYW1lX251bWJlcjsKKyAgICAgICAgICAgICBzZXFfaW5kZXgrKykgeworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bWJlcl9vZl9zYW1wbGVzID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbmRleDsKKworICAgICAgICAgICAgY3R4LT5zYW1wbGVfYnVmZmVyID0gY3R4LT5tYWpvcl9zY3JhdGNoX2J1ZmZlcjsKKyAgICAgICAgICAgIGN0eC0+aW5vdXRfYnVmZmVyID0gY3R4LT5tYWpvcl9pbm91dF9idWZmZXI7CisgICAgICAgICAgICBjdHgtPnNlcV9pbmRleCA9IHNlcV9pbmRleDsKKworICAgICAgICAgICAgY3R4LT5zdGFydGluZ19mcmFtZV9pbmRleCA9IChjdHgtPmF2Y3R4LT5mcmFtZV9udW1iZXIgLSAoY3R4LT5hdmN0eC0+ZnJhbWVfbnVtYmVyICUgY3R4LT5taW5fcmVzdGFydF9pbnRlcnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoc2VxX2luZGV4ICogY3R4LT5taW5fcmVzdGFydF9pbnRlcnZhbCkpICUgY3R4LT5tYXhfcmVzdGFydF9pbnRlcnZhbDsKKyAgICAgICAgICAgIGN0eC0+bnVtYmVyX29mX2ZyYW1lcyA9IGN0eC0+bmV4dF9tYWpvcl9udW1iZXJfb2ZfZnJhbWVzOworICAgICAgICAgICAgY3R4LT5udW1iZXJfb2Zfc3ViYmxvY2tzID0gY3R4LT5uZXh0X21ham9yX251bWJlcl9vZl9mcmFtZXMgKyAxOworCisgICAgICAgICAgICBjdHgtPnNlcV9jaGFubmVsX3BhcmFtcyA9IChDaGFubmVsUGFyYW1zICopIGN0eC0+Y2hhbm5lbF9wYXJhbXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5mcmFtZV9pbmRleCAvIGN0eC0+bWluX3Jlc3RhcnRfaW50ZXJ2YWwpKihjdHgtPnNlcXVlbmNlX3NpemUpKihjdHgtPmF2Y3R4LT5jaGFubmVscykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5zZXFfb2Zmc2V0W3NlcV9pbmRleF0pKihjdHgtPmF2Y3R4LT5jaGFubmVscyk7CisKKyAgICAgICAgICAgIGN0eC0+c2VxX2RlY29kaW5nX3BhcmFtcyA9IChEZWNvZGluZ1BhcmFtcyAqKSBjdHgtPmRlY29kaW5nX3BhcmFtcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5mcmFtZV9pbmRleCAvIGN0eC0+bWluX3Jlc3RhcnRfaW50ZXJ2YWwpKihjdHgtPnNlcXVlbmNlX3NpemUpKihjdHgtPm51bV9zdWJzdHJlYW1zKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5zZXFfb2Zmc2V0W3NlcV9pbmRleF0pKihjdHgtPm51bV9zdWJzdHJlYW1zKTsKKworICAgICAgICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY3R4LT5udW1iZXJfb2ZfZnJhbWVzOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgbnVtYmVyX29mX3NhbXBsZXMgKz0gY3R4LT5mcmFtZV9zaXplWyhjdHgtPnN0YXJ0aW5nX2ZyYW1lX2luZGV4ICsgaW5kZXgpICUgY3R4LT5tYXhfcmVzdGFydF9pbnRlcnZhbF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdHgtPm51bWJlcl9vZl9zYW1wbGVzID0gbnVtYmVyX29mX3NhbXBsZXM7CisKKyAgICAgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGN0eC0+c2VxX3NpemVbc2VxX2luZGV4XTsgaW5kZXgrKykgeworICAgICAgICAgICAgICAgIGNsZWFyX2NoYW5uZWxfcGFyYW1zKGN0eCwgY3R4LT5zZXFfY2hhbm5lbF9wYXJhbXMgKyBpbmRleCooY3R4LT5hdmN0eC0+Y2hhbm5lbHMpKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0X2RlY29kaW5nX3BhcmFtcyhjdHgsIGN0eC0+c2VxX2RlY29kaW5nX3BhcmFtcyArIGluZGV4KihjdHgtPm51bV9zdWJzdHJlYW1zKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0X3RvX3NhbXBsZV9idWZmZXIoY3R4KTsKKworICAgICAgICAgICAgYW5hbHl6ZV9zYW1wbGVfYnVmZmVyKGN0eCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3R4LT5mcmFtZV9pbmRleCA9PSAoY3R4LT5tYXhfcmVzdGFydF9pbnRlcnZhbCAtIDEpKSB7CisgICAgICAgICAgICBjdHgtPm1ham9yX2ZyYW1lX3NpemUgPSBjdHgtPm5leHRfbWFqb3JfZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIGN0eC0+bmV4dF9tYWpvcl9mcmFtZV9zaXplID0gMDsKKyAgICAgICAgICAgIGN0eC0+bWFqb3JfbnVtYmVyX29mX2ZyYW1lcyA9IGN0eC0+bmV4dF9tYWpvcl9udW1iZXJfb2ZfZnJhbWVzOworICAgICAgICAgICAgY3R4LT5uZXh0X21ham9yX251bWJlcl9vZl9mcmFtZXMgPSAwOworCisgICAgICAgICAgICBpZiAoIWN0eC0+bWFqb3JfZnJhbWVfc2l6ZSkKKyAgICAgICAgICAgICAgICBnb3RvIG5vX2RhdGFfbGVmdDsKKyAgICAgICAgfQorICAgIH0KKworbm9fZGF0YV9sZWZ0OgorCisgICAgZmZfYWZfcXVldWVfcmVtb3ZlKCZjdHgtPmFmcSwgYXZjdHgtPmZyYW1lX3NpemUsICZhdnBrdC0+cHRzLAorICAgICAgICAgICAgICAgICAgICAgICAmYXZwa3QtPmR1cmF0aW9uKTsKKyAgICBhdnBrdC0+c2l6ZSA9IGJ5dGVzX3dyaXR0ZW47CisgICAgKmdvdF9wYWNrZXQgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgbWxwX2VuY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTUxQRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGZmX2xwY19lbmQoJmN0eC0+bHBjX2N0eCk7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5sb3NzbGVzc19jaGVja19kYXRhKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5tYWpvcl9zY3JhdGNoX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJmN0eC0+bWFqb3JfaW5vdXRfYnVmZmVyKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5scGNfc2FtcGxlX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJmN0eC0+ZGVjb2RpbmdfcGFyYW1zKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5jaGFubmVsX3BhcmFtcyk7CisgICAgYXZfZnJlZXAoJmN0eC0+ZnJhbWVfc2l6ZSk7CisgICAgZmZfYWZfcXVldWVfY2xvc2UoJmN0eC0+YWZxKTsKKworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX01MUF9FTkNPREVSCitBVkNvZGVjIGZmX21scF9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgID0ibWxwIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNTFAgKE1lcmlkaWFuIExvc3NsZXNzIFBhY2tpbmcpIiksCisgICAgLnR5cGUgICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NTFAsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICAgPSBzaXplb2YoTUxQRW5jb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICAgPSBtbHBfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICAgPSBtbHBfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgID0gbWxwX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgICA9IEFWX0NPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FIHwgQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCwKKyAgICAuc2FtcGxlX2ZtdHMgICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHtBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9OT05FfSwKKyAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzICA9IChjb25zdCBpbnRbXSkgezQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMH0sCisgICAgLmNoYW5uZWxfbGF5b3V0cyAgICAgICAgPSBmZl9tbHBfY2hhbm5lbF9sYXlvdXRzLAorfTsKKyNlbmRpZgorI2lmIENPTkZJR19UUlVFSERfRU5DT0RFUgorQVZDb2RlYyBmZl90cnVlaGRfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgICA9InRydWVoZCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVHJ1ZUhEIiksCisgICAgLnR5cGUgICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9UUlVFSEQsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICAgPSBzaXplb2YoTUxQRW5jb2RlQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgICAgICAgPSBtbHBfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICAgPSBtbHBfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgID0gbWxwX2VuY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgICA9IEFWX0NPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FIHwgQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCwKKyAgICAuc2FtcGxlX2ZtdHMgICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHtBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9OT05FfSwKKyAgICAuc3VwcG9ydGVkX3NhbXBsZXJhdGVzICA9IChjb25zdCBpbnRbXSkgezQ0MTAwLCA0ODAwMCwgODgyMDAsIDk2MDAwLCAxNzY0MDAsIDE5MjAwMCwgMH0sCisgICAgLmNoYW5uZWxfbGF5b3V0cyAgICAgICAgPSAoY29uc3QgdWludDY0X3RbXSkge0FWX0NIX0xBWU9VVF9TVEVSRU8sIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0ssIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0ssIDB9LAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tbHouYyBiL2xpYmF2Y29kZWMvbWx6LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjZTc5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbWx6LmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVW1haXIgS2hhbiA8b21lcmplcmtAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibWx6LmgiCisKK2F2X2NvbGQgdm9pZCBmZl9tbHpfaW5pdF9kaWN0KHZvaWQqIGNvbnRleHQsIE1MWiAqbWx6KSB7CisgICAgbWx6LT5kaWN0ID0gYXZfbWFsbG9jel9hcnJheShUQUJMRV9TSVpFLCBzaXplb2YoKm1sei0+ZGljdCkpOworCisgICAgbWx6LT5mbHVzaF9jb2RlICAgICAgICAgICAgPSBGTFVTSF9DT0RFOworICAgIG1sei0+Y3VycmVudF9kaWNfaW5kZXhfbWF4ID0gRElDX0lOREVYX0lOSVQ7CisgICAgbWx6LT5kaWNfY29kZV9iaXQgICAgICAgICAgPSBDT0RFX0JJVF9JTklUOworICAgIG1sei0+YnVtcF9jb2RlICAgICAgICAgICAgID0gKERJQ19JTkRFWF9JTklUIC0gMSk7CisgICAgbWx6LT5uZXh0X2NvZGUgICAgICAgICAgICAgPSBGSVJTVF9DT0RFOworICAgIG1sei0+ZnJlZXplX2ZsYWcgICAgICAgICAgID0gMDsKKyAgICBtbHotPmNvbnRleHQgICAgICAgICAgICAgICA9IGNvbnRleHQ7Cit9CisKK2F2X2NvbGQgdm9pZCBmZl9tbHpfZmx1c2hfZGljdChNTFogKm1seikgeworICAgIE1MWkRpY3QgKmRpY3QgPSBtbHotPmRpY3Q7CisgICAgaW50IGk7CisgICAgZm9yICggaSA9IDA7IGkgPCBUQUJMRV9TSVpFOyBpKysgKSB7CisgICAgICAgIGRpY3RbaV0uc3RyaW5nX2NvZGUgPSBDT0RFX1VOU0VUOworICAgICAgICBkaWN0W2ldLnBhcmVudF9jb2RlID0gQ09ERV9VTlNFVDsKKyAgICAgICAgZGljdFtpXS5tYXRjaF9sZW4gPSAwOworICAgIH0KKyAgICBtbHotPmN1cnJlbnRfZGljX2luZGV4X21heCA9IERJQ19JTkRFWF9JTklUOworICAgIG1sei0+ZGljX2NvZGVfYml0ICAgICAgICAgID0gQ09ERV9CSVRfSU5JVDsgIC8vIERpY0NvZGVCaXRJbml0OworICAgIG1sei0+YnVtcF9jb2RlICAgICAgICAgICAgID0gbWx6LT5jdXJyZW50X2RpY19pbmRleF9tYXggLSAxOworICAgIG1sei0+bmV4dF9jb2RlICAgICAgICAgICAgID0gRklSU1RfQ09ERTsKKyAgICBtbHotPmZyZWV6ZV9mbGFnICAgICAgICAgICA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9uZXdfZW50cnlfZGljdChNTFpEaWN0KiBkaWN0LCBpbnQgc3RyaW5nX2NvZGUsIGludCBwYXJlbnRfY29kZSwgaW50IGNoYXJfY29kZSkgeworICAgIGRpY3Rbc3RyaW5nX2NvZGVdLnBhcmVudF9jb2RlID0gcGFyZW50X2NvZGU7CisgICAgZGljdFtzdHJpbmdfY29kZV0uc3RyaW5nX2NvZGUgPSBzdHJpbmdfY29kZTsKKyAgICBkaWN0W3N0cmluZ19jb2RlXS5jaGFyX2NvZGUgICA9IGNoYXJfY29kZTsKKyAgICBpZiAocGFyZW50X2NvZGUgPCBGSVJTVF9DT0RFKSB7CisgICAgICAgIGRpY3Rbc3RyaW5nX2NvZGVdLm1hdGNoX2xlbiA9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGljdFtzdHJpbmdfY29kZV0ubWF0Y2hfbGVuID0gKGRpY3RbcGFyZW50X2NvZGVdLm1hdGNoX2xlbikgKyAxOworICAgIH0KK30KKworc3RhdGljIGludCBkZWNvZGVfc3RyaW5nKE1MWiogbWx6LCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgc3RyaW5nX2NvZGUsIGludCAqZmlyc3RfY2hhcl9jb2RlLCB1bnNpZ25lZCBsb25nIGJ1ZnNpemUpIHsKKyAgICBNTFpEaWN0KiBkaWN0ID0gbWx6LT5kaWN0OworICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIG9mZnNldDsKKyAgICBpbnQgY3VycmVudF9jb2RlLCBwYXJlbnRfY29kZSwgdG1wX2NvZGU7CisKKyAgICBjb3VudCAgICAgICAgICAgID0gMDsKKyAgICBjdXJyZW50X2NvZGUgICAgID0gc3RyaW5nX2NvZGU7CisgICAgKmZpcnN0X2NoYXJfY29kZSA9IENPREVfVU5TRVQ7CisKKyAgICB3aGlsZSAoY291bnQgPCBidWZzaXplKSB7CisgICAgICAgIHN3aXRjaCAoY3VycmVudF9jb2RlKSB7CisgICAgICAgIGNhc2UgQ09ERV9VTlNFVDoKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaWYgKGN1cnJlbnRfY29kZSA8IEZJUlNUX0NPREUpIHsKKyAgICAgICAgICAgICAgICAqZmlyc3RfY2hhcl9jb2RlID0gY3VycmVudF9jb2RlOworICAgICAgICAgICAgICAgIGJ1ZmZbMF0gPSBjdXJyZW50X2NvZGU7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldCAgPSBkaWN0W2N1cnJlbnRfY29kZV0ubWF0Y2hfbGVuIC0gMTsKKyAgICAgICAgICAgICAgICB0bXBfY29kZSA9IGRpY3RbY3VycmVudF9jb2RlXS5jaGFyX2NvZGU7CisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBidWZzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtbHotPmNvbnRleHQsIEFWX0xPR19FUlJPUiwgIk1MWiBvZmZzZXQgZXJyb3IuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmW29mZnNldF0gPSB0bXBfY29kZTsKKyAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudF9jb2RlID0gZGljdFtjdXJyZW50X2NvZGVdLnBhcmVudF9jb2RlOworICAgICAgICAgICAgaWYgKChjdXJyZW50X2NvZGUgPCAwKSB8fCAoY3VycmVudF9jb2RlID4gKERJQ19JTkRFWF9NQVggLSAxKSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobWx6LT5jb250ZXh0LCBBVl9MT0dfRVJST1IsICJNTFogZGljIGluZGV4IGVycm9yLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN1cnJlbnRfY29kZSA+IEZJUlNUX0NPREUpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnRfY29kZSA9IGRpY3RbY3VycmVudF9jb2RlXS5wYXJlbnRfY29kZTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAoZGljdFtjdXJyZW50X2NvZGVdLm1hdGNoX2xlbikgLSAxOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfY29kZSA8IDAgfHwgcGFyZW50X2NvZGUgPiBESUNfSU5ERVhfTUFYLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG1sei0+Y29udGV4dCwgQVZfTE9HX0VSUk9SLCAiTUxaIGRpYyBpbmRleCBlcnJvci5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgoIG9mZnNldCA+IChESUNfSU5ERVhfTUFYIC0gMSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtbHotPmNvbnRleHQsIEFWX0xPR19FUlJPUiwgIk1MWiBkaWMgb2Zmc2V0IGVycm9yLlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgaW5wdXRfY29kZShHZXRCaXRDb250ZXh0KiBnYiwgaW50IGxlbikgeworICAgIGludCB0bXBfY29kZSA9IDA7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHRtcF9jb2RlIHw9IGdldF9iaXRzMShnYikgPDwgaTsKKyAgICB9CisgICAgcmV0dXJuIHRtcF9jb2RlOworfQorCitpbnQgZmZfbWx6X2RlY29tcHJlc3Npb24oTUxaKiBtbHosIEdldEJpdENvbnRleHQqIGdiLCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqYnVmZikgeworICAgIE1MWkRpY3QgKmRpY3QgPSBtbHotPmRpY3Q7CisgICAgdW5zaWduZWQgbG9uZyBvdXRwdXRfY2hhcnM7CisgICAgaW50IHN0cmluZ19jb2RlLCBsYXN0X3N0cmluZ19jb2RlLCBjaGFyX2NvZGU7CisKKyAgICBzdHJpbmdfY29kZSA9IDA7CisgICAgY2hhcl9jb2RlICAgPSAtMTsKKyAgICBsYXN0X3N0cmluZ19jb2RlID0gLTE7CisgICAgb3V0cHV0X2NoYXJzID0gMDsKKworICAgIHdoaWxlIChvdXRwdXRfY2hhcnMgPCBzaXplKSB7CisgICAgICAgIHN0cmluZ19jb2RlID0gaW5wdXRfY29kZShnYiwgbWx6LT5kaWNfY29kZV9iaXQpOworICAgICAgICBzd2l0Y2ggKHN0cmluZ19jb2RlKSB7CisgICAgICAgICAgICBjYXNlIEZMVVNIX0NPREU6CisgICAgICAgICAgICBjYXNlIE1BWF9DT0RFOgorICAgICAgICAgICAgICAgIGZmX21sel9mbHVzaF9kaWN0KG1seik7CisgICAgICAgICAgICAgICAgY2hhcl9jb2RlID0gLTE7CisgICAgICAgICAgICAgICAgbGFzdF9zdHJpbmdfY29kZSA9IC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGUkVFWkVfQ09ERToKKyAgICAgICAgICAgICAgICBtbHotPmZyZWV6ZV9mbGFnID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZ19jb2RlID4gbWx6LT5jdXJyZW50X2RpY19pbmRleF9tYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG1sei0+Y29udGV4dCwgQVZfTE9HX0VSUk9SLCAiU3RyaW5nIGNvZGUgJWQgZXhjZWVkcyBtYXhpbXVtIHZhbHVlIG9mICVkLlxuIiwgc3RyaW5nX2NvZGUsIG1sei0+Y3VycmVudF9kaWNfaW5kZXhfbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dF9jaGFyczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZ19jb2RlID09IChpbnQpIG1sei0+YnVtcF9jb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICsrbWx6LT5kaWNfY29kZV9iaXQ7CisgICAgICAgICAgICAgICAgICAgIG1sei0+Y3VycmVudF9kaWNfaW5kZXhfbWF4ICo9IDI7CisgICAgICAgICAgICAgICAgICAgIG1sei0+YnVtcF9jb2RlID0gbWx6LT5jdXJyZW50X2RpY19pbmRleF9tYXggLSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJpbmdfY29kZSA+PSBtbHotPm5leHRfY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJldCA9IGRlY29kZV9zdHJpbmcobWx6LCAmYnVmZltvdXRwdXRfY2hhcnNdLCBsYXN0X3N0cmluZ19jb2RlLCAmY2hhcl9jb2RlLCBzaXplIC0gb3V0cHV0X2NoYXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwIHx8IHJldCA+IHNpemUgLSBvdXRwdXRfY2hhcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cobWx6LT5jb250ZXh0LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgY2hhcnMgb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRfY2hhcnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY2hhcnMgKz0gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3N0cmluZyhtbHosICZidWZmW291dHB1dF9jaGFyc10sIGNoYXJfY29kZSwgJmNoYXJfY29kZSwgc2l6ZSAtIG91dHB1dF9jaGFycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCB8fCByZXQgPiBzaXplIC0gb3V0cHV0X2NoYXJzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG1sei0+Y29udGV4dCwgQVZfTE9HX0VSUk9SLCAib3V0cHV0IGNoYXJzIG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0X2NoYXJzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2NoYXJzICs9IHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9uZXdfZW50cnlfZGljdChkaWN0LCBtbHotPm5leHRfY29kZSwgbGFzdF9zdHJpbmdfY29kZSwgY2hhcl9jb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtbHotPm5leHRfY29kZSA+PSBUQUJMRV9TSVpFIC0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtbHotPmNvbnRleHQsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IE1MWiBjb2Rlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dF9jaGFyczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1sei0+bmV4dF9jb2RlKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZGVjb2RlX3N0cmluZyhtbHosICZidWZmW291dHB1dF9jaGFyc10sIHN0cmluZ19jb2RlLCAmY2hhcl9jb2RlLCBzaXplIC0gb3V0cHV0X2NoYXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwIHx8IHJldCA+IHNpemUgLSBvdXRwdXRfY2hhcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cobWx6LT5jb250ZXh0LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgY2hhcnMgb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRfY2hhcnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY2hhcnMgKz0gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dF9jaGFycyA8PSBzaXplICYmICFtbHotPmZyZWV6ZV9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3Rfc3RyaW5nX2NvZGUgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X25ld19lbnRyeV9kaWN0KGRpY3QsIG1sei0+bmV4dF9jb2RlLCBsYXN0X3N0cmluZ19jb2RlLCBjaGFyX2NvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWx6LT5uZXh0X2NvZGUgPj0gVEFCTEVfU0laRSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtbHotPmNvbnRleHQsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IE1MWiBjb2Rlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0X2NoYXJzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1sei0+bmV4dF9jb2RlKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsYXN0X3N0cmluZ19jb2RlID0gc3RyaW5nX2NvZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRwdXRfY2hhcnM7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21sei5oIGIvbGliYXZjb2RlYy9tbHouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2RmNTJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9tbHouaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFVtYWlyIEtoYW4gPG9tZXJqZXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX01MWl9ICisjZGVmaW5lIEFWQ09ERUNfTUxaX0gKKworI2luY2x1ZGUgImdldF9iaXRzLmgiCisKKyNkZWZpbmUgQ09ERV9VTlNFVCAgICAgICAgICAtMQorI2RlZmluZSBDT0RFX0JJVF9JTklUICAgICAgIDkKKyNkZWZpbmUgRElDX0lOREVYX0lOSVQgICAgICA1MTIgICAgIC8vIDJeOQorI2RlZmluZSBESUNfSU5ERVhfTUFYICAgICAgIDMyNzY4ICAgLy8gMl4xNQorI2RlZmluZSBGTFVTSF9DT0RFICAgICAgICAgIDI1NgorI2RlZmluZSBGUkVFWkVfQ09ERSAgICAgICAgIDI1NworI2RlZmluZSBGSVJTVF9DT0RFICAgICAgICAgIDI1OAorI2RlZmluZSBNQVhfQ09ERSAgICAgICAgICAgIDMyNzY3CisjZGVmaW5lIFRBQkxFX1NJWkUgICAgICAgICAgMzUwMjMgICAvLyBUQUJMRV9TSVpFIG11c3QgYmUgYSBwcmltZSBudW1iZXIKKworLyoqIERpY3Rpb25hcnkgc3RydWN0dXJlIGZvciBtbHogZGVjb21wcmVzc2lvbgorICovCit0eXBlZGVmIHN0cnVjdCBNTFpEaWN0IHsKKyAgICBpbnQgIHN0cmluZ19jb2RlOworICAgIGludCAgcGFyZW50X2NvZGU7CisgICAgaW50ICBjaGFyX2NvZGU7CisgICAgaW50ICBtYXRjaF9sZW47Cit9IE1MWkRpY3Q7CisKKy8qKiBNTFogZGF0YSBzdHJ1Y3VyZQorICovCit0eXBlZGVmIHN0cnVjdCBNTFogeworICAgIGludCBkaWNfY29kZV9iaXQ7CisgICAgaW50IGN1cnJlbnRfZGljX2luZGV4X21heDsKKyAgICB1bnNpZ25lZCBpbnQgYnVtcF9jb2RlOworICAgIHVuc2lnbmVkIGludCBmbHVzaF9jb2RlOworICAgIGludCBuZXh0X2NvZGU7CisgICAgaW50IGZyZWV6ZV9mbGFnOworICAgIE1MWkRpY3QqIGRpY3Q7CisgICAgdm9pZCogY29udGV4dDsKK30gTUxaOworCisvKiogSW5pdGlhbGl6ZSB0aGUgZGljdGlvbmFyeQorICovCit2b2lkIGZmX21sel9pbml0X2RpY3Qodm9pZCogY29udGV4dCwgTUxaICptbHopOworCisvKiogRmx1c2ggdGhlIGRpY3Rpb25hcnkKKyAqLwordm9pZCBmZl9tbHpfZmx1c2hfZGljdChNTFogKmRpY3QpOworCisvKiogUnVuIG1seiBkZWNvbXByZXNzaW9uIG9uIHRoZSBuZXh0IHNpemUgYml0cyBhbmQgdGhlIG91dHB1dCB3aWxsIGJlIHN0b3JlZCBpbiBidWZmCisgKi8KK2ludCBmZl9tbHpfZGVjb21wcmVzc2lvbihNTFoqIG1seiwgR2V0Qml0Q29udGV4dCogZ2IsIGludCBzaXplLCB1bnNpZ25lZCBjaGFyICpidWZmKTsKKworI2VuZGlmIC8qQVZDT0RFQ19NTFpfSCovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21tYWxkZWMuYyBiL2xpYmF2Y29kZWMvbW1hbGRlYy5jCmluZGV4IDMwODYxZDkuLjY0N2EyMmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbW1hbGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvbW1hbGRlYy5jCkBAIC0zMSwxMyArMzEsMTUgQEAKICNpbmNsdWRlIDxpbnRlcmZhY2UvbW1hbC91dGlsL21tYWxfdXRpbF9wYXJhbXMuaD4KICNpbmNsdWRlIDxpbnRlcmZhY2UvbW1hbC91dGlsL21tYWxfZGVmYXVsdF9jb21wb25lbnRzLmg+CiAjaW5jbHVkZSA8aW50ZXJmYWNlL21tYWwvdmMvbW1hbF92Y19hcGkuaD4KKyNpbmNsdWRlIDxzdGRhdG9taWMuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXRvbWljLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgogCkBAIC01NCw3ICs1Niw3IEBACiAvLyByZWZjb3VudGluZyBmb3IgQVZGcmFtZXMsIHdlIGNhbiBmcmVlIHRoZSBNTUFMX1BPT0xfVCBvbmx5IGFmdGVyIGFsbCBBVkZyYW1lcwogLy8gaGF2ZSBiZWVuIHVucmVmZXJlbmNlZC4KIHR5cGVkZWYgc3RydWN0IEZGUG9vbFJlZiB7Ci0gICAgdm9sYXRpbGUgaW50IHJlZmNvdW50OworICAgIGF0b21pY19pbnQgcmVmY291bnQ7CiAgICAgTU1BTF9QT09MX1QgKnBvb2w7CiB9IEZGUG9vbFJlZjsKIApAQCAtODIsMTEgKzg0LDEzIEBACiAgICAgRkZCdWZmZXJFbnRyeSAqd2FpdGluZ19idWZmZXJzLCAqd2FpdGluZ19idWZmZXJzX3RhaWw7CiAKICAgICBpbnQ2NF90IHBhY2tldHNfc2VudDsKLSAgICB2b2xhdGlsZSBpbnQgcGFja2V0c19idWZmZXJlZDsKKyAgICBhdG9taWNfaW50IHBhY2tldHNfYnVmZmVyZWQ7CiAgICAgaW50NjRfdCBmcmFtZXNfb3V0cHV0OwogICAgIGludCBlb3NfcmVjZWl2ZWQ7CiAgICAgaW50IGVvc19zZW50OwogICAgIGludCBleHRyYWRhdGFfc2VudDsKKyAgICBpbnQgaW50ZXJsYWNlZF9mcmFtZTsKKyAgICBpbnQgdG9wX2ZpZWxkX2ZpcnN0OwogfSBNTUFMRGVjb2RlQ29udGV4dDsKIAogLy8gQXNzdW1lIGRlY29kZXIgaXMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIG91dHB1dCBhZnRlciBhdCBsZWFzdCB0aGlzIG1hbnkKQEAgLTk1LDcgKzk5LDggQEAKIAogc3RhdGljIHZvaWQgZmZtbWFsX3Bvb2xyZWZfdW5yZWYoRkZQb29sUmVmICpyZWYpCiB7Ci0gICAgaWYgKHJlZiAmJiBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZyZWYtPnJlZmNvdW50LCAtMSkgPT0gMCkgeworICAgIGlmIChyZWYgJiYKKyAgICAgICAgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgmcmVmLT5yZWZjb3VudCwgLTEsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKSA9PSAxKSB7CiAgICAgICAgIG1tYWxfcG9vbF9kZXN0cm95KHJlZi0+cG9vbCk7CiAgICAgICAgIGF2X2ZyZWUocmVmKTsKICAgICB9CkBAIC0xMzEsNyArMTM2LDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAKLSAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZyZWYtPnBvb2wtPnJlZmNvdW50LCAxKTsKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCZyZWYtPnBvb2wtPnJlZmNvdW50LCAxLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CiAgICAgbW1hbF9idWZmZXJfaGVhZGVyX2FjcXVpcmUoYnVmZmVyKTsKIAogICAgIGZyYW1lLT5mb3JtYXQgPSBBVl9QSVhfRk1UX01NQUw7CkBAIC0xNjIsMTQgKzE2NywxNCBAQAogICAgICAgICBjdHgtPndhaXRpbmdfYnVmZmVycyA9IGJ1ZmZlci0+bmV4dDsKIAogICAgICAgICBpZiAoYnVmZmVyLT5mbGFncyAmIE1NQUxfQlVGRkVSX0hFQURFUl9GTEFHX0ZSQU1FX0VORCkKLSAgICAgICAgICAgIGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJmN0eC0+cGFja2V0c19idWZmZXJlZCwgLTEpOworICAgICAgICAgICAgYXRvbWljX2ZldGNoX2FkZCgmY3R4LT5wYWNrZXRzX2J1ZmZlcmVkLCAtMSk7CiAKICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZidWZmZXItPnJlZik7CiAgICAgICAgIGF2X2ZyZWUoYnVmZmVyKTsKICAgICB9CiAgICAgY3R4LT53YWl0aW5nX2J1ZmZlcnNfdGFpbCA9IE5VTEw7CiAKLSAgICBhdl9hc3NlcnQwKGF2cHJpdl9hdG9taWNfaW50X2dldCgmY3R4LT5wYWNrZXRzX2J1ZmZlcmVkKSA9PSAwKTsKKyAgICBhdl9hc3NlcnQwKGF0b21pY19sb2FkKCZjdHgtPnBhY2tldHNfYnVmZmVyZWQpID09IDApOwogCiAgICAgY3R4LT5mcmFtZXNfb3V0cHV0ID0gY3R4LT5lb3NfcmVjZWl2ZWQgPSBjdHgtPmVvc19zZW50ID0gY3R4LT5wYWNrZXRzX3NlbnQgPSBjdHgtPmV4dHJhZGF0YV9zZW50ID0gMDsKIH0KQEAgLTIwMSw3ICsyMDYsNyBAQAogICAgICAgICBGRkJ1ZmZlckVudHJ5ICplbnRyeSA9IGJ1ZmZlci0+dXNlcl9kYXRhOwogICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmVudHJ5LT5yZWYpOwogICAgICAgICBpZiAoZW50cnktPmZsYWdzICYgTU1BTF9CVUZGRVJfSEVBREVSX0ZMQUdfRlJBTUVfRU5EKQotICAgICAgICAgICAgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCgmY3R4LT5wYWNrZXRzX2J1ZmZlcmVkLCAtMSk7CisgICAgICAgICAgICBhdG9taWNfZmV0Y2hfYWRkKCZjdHgtPnBhY2tldHNfYnVmZmVyZWQsIC0xKTsKICAgICAgICAgYXZfZnJlZShlbnRyeSk7CiAgICAgfQogICAgIG1tYWxfYnVmZmVyX2hlYWRlcl9yZWxlYXNlKGJ1ZmZlcik7CkBAIC0yMjQsOSArMjI5LDggQEAKICAgICAgICAgc3RhdHVzID0gKih1aW50MzJfdCAqKWJ1ZmZlci0+ZGF0YTsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNTUFMIGVycm9yICVkIG9uIGNvbnRyb2wgcG9ydFxuIiwgKGludClzdGF0dXMpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoYXIgc1syMF07Ci0gICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKHMsIHNpemVvZihzKSwgYnVmZmVyLT5jbWQpOwotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBNTUFMIGV2ZW50ICVzIG9uIGNvbnRyb2wgcG9ydFxuIiwgcyk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIE1NQUwgZXZlbnQgJXMgb24gY29udHJvbCBwb3J0XG4iLAorICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cihidWZmZXItPmNtZCkpOwogICAgIH0KIAogICAgIG1tYWxfYnVmZmVyX2hlYWRlcl9yZWxlYXNlKGJ1ZmZlcik7CkBAIC0yNzMsMTMgKzI3NywxNCBAQAogICAgIGludCByZXQgPSAwOwogICAgIE1NQUxfQ09NUE9ORU5UX1QgKmRlY29kZXIgPSBjdHgtPmRlY29kZXI7CiAgICAgTU1BTF9FU19GT1JNQVRfVCAqZm9ybWF0X291dCA9IGRlY29kZXItPm91dHB1dFswXS0+Zm9ybWF0OworICAgIE1NQUxfUEFSQU1FVEVSX1ZJREVPX0lOVEVSTEFDRV9UWVBFX1QgaW50ZXJsYWNlX3R5cGU7CiAKICAgICBmZm1tYWxfcG9vbHJlZl91bnJlZihjdHgtPnBvb2xfb3V0KTsKICAgICBpZiAoIShjdHgtPnBvb2xfb3V0ID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eC0+cG9vbF9vdXQpKSkpIHsKICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQotICAgIGN0eC0+cG9vbF9vdXQtPnJlZmNvdW50ID0gMTsKKyAgICBhdG9taWNfaW5pdCgmY3R4LT5wb29sX291dC0+cmVmY291bnQsIDEpOwogCiAgICAgaWYgKCFmb3JtYXRfb3V0KQogICAgICAgICBnb3RvIGZhaWw7CkBAIC0yOTksNiArMzA0LDE2IEBACiAgICAgaWYgKChzdGF0dXMgPSBtbWFsX3BvcnRfZm9ybWF0X2NvbW1pdChkZWNvZGVyLT5vdXRwdXRbMF0pKSkKICAgICAgICAgZ290byBmYWlsOwogCisgICAgaW50ZXJsYWNlX3R5cGUuaGRyLmlkID0gTU1BTF9QQVJBTUVURVJfVklERU9fSU5URVJMQUNFX1RZUEU7CisgICAgaW50ZXJsYWNlX3R5cGUuaGRyLnNpemUgPSBzaXplb2YoTU1BTF9QQVJBTUVURVJfVklERU9fSU5URVJMQUNFX1RZUEVfVCk7CisgICAgc3RhdHVzID0gbW1hbF9wb3J0X3BhcmFtZXRlcl9nZXQoZGVjb2Rlci0+b3V0cHV0WzBdLCAmaW50ZXJsYWNlX3R5cGUuaGRyKTsKKyAgICBpZiAoc3RhdHVzICE9IE1NQUxfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCByZWFkIE1NQUwgaW50ZXJsYWNlIGluZm9ybWF0aW9uIVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5pbnRlcmxhY2VkX2ZyYW1lID0gKGludGVybGFjZV90eXBlLmVNb2RlICE9IE1NQUxfSW50ZXJsYWNlUHJvZ3Jlc3NpdmUpOworICAgICAgICBjdHgtPnRvcF9maWVsZF9maXJzdCA9IChpbnRlcmxhY2VfdHlwZS5lTW9kZSA9PSBNTUFMX0ludGVybGFjZUZpZWxkc0ludGVybGVhdmVkVXBwZXJGaXJzdCk7CisgICAgfQorCiAgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgZm9ybWF0X291dC0+ZXMtPnZpZGVvLmNyb3AueCArIGZvcm1hdF9vdXQtPmVzLT52aWRlby5jcm9wLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9vdXQtPmVzLT52aWRlby5jcm9wLnkgKyBmb3JtYXRfb3V0LT5lcy0+dmlkZW8uY3JvcC5oZWlnaHQpKSA8IDApCiAgICAgICAgIGdvdG8gZmFpbDsKQEAgLTMwNyw2ICszMjIsMTAgQEAKICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gZm9ybWF0X291dC0+ZXMtPnZpZGVvLnBhci5udW07CiAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IGZvcm1hdF9vdXQtPmVzLT52aWRlby5wYXIuZGVuOwogICAgIH0KKyAgICBpZiAoZm9ybWF0X291dC0+ZXMtPnZpZGVvLmZyYW1lX3JhdGUubnVtICYmIGZvcm1hdF9vdXQtPmVzLT52aWRlby5mcmFtZV9yYXRlLmRlbikgeworICAgICAgICBhdmN0eC0+ZnJhbWVyYXRlLm51bSA9IGZvcm1hdF9vdXQtPmVzLT52aWRlby5mcmFtZV9yYXRlLm51bTsKKyAgICAgICAgYXZjdHgtPmZyYW1lcmF0ZS5kZW4gPSBmb3JtYXRfb3V0LT5lcy0+dmlkZW8uZnJhbWVfcmF0ZS5kZW47CisgICAgfQogCiAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBmZm1tYWxfY3NwX3RvX2F2X2NzcChmb3JtYXRfb3V0LT5lcy0+dmlkZW8uY29sb3Jfc3BhY2UpOwogCkBAIC0zMzMsNyArMzUyLDYgQEAKICAgICBNTUFMX1NUQVRVU19UIHN0YXR1czsKICAgICBNTUFMX0VTX0ZPUk1BVF9UICpmb3JtYXRfaW47CiAgICAgTU1BTF9DT01QT05FTlRfVCAqZGVjb2RlcjsKLSAgICBjaGFyIHRtcFszMl07CiAgICAgaW50IHJldCA9IDA7CiAKICAgICBiY21faG9zdF9pbml0KCk7CkBAIC0zNTYsMTkgKzM3NCwxOSBAQAogICAgIGZvcm1hdF9pbiA9IGRlY29kZXItPmlucHV0WzBdLT5mb3JtYXQ7CiAgICAgZm9ybWF0X2luLT50eXBlID0gTU1BTF9FU19UWVBFX1ZJREVPOwogICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX2lkKSB7Ci0gICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKLSAgICAgICAgICAgIGZvcm1hdF9pbi0+ZW5jb2RpbmcgPSBNTUFMX0VOQ09ESU5HX01QMlY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHNDoKLSAgICAgICAgICAgIGZvcm1hdF9pbi0+ZW5jb2RpbmcgPSBNTUFMX0VOQ09ESU5HX01QNFY7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9WQzE6Ci0gICAgICAgICAgICBmb3JtYXRfaW4tPmVuY29kaW5nID0gTU1BTF9FTkNPRElOR19XVkMxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZvcm1hdF9pbi0+ZW5jb2RpbmcgPSBNTUFMX0VOQ09ESU5HX0gyNjQ7Ci0gICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86CisgICAgICAgIGZvcm1hdF9pbi0+ZW5jb2RpbmcgPSBNTUFMX0VOQ09ESU5HX01QMlY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisgICAgICAgIGZvcm1hdF9pbi0+ZW5jb2RpbmcgPSBNTUFMX0VOQ09ESU5HX01QNFY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfVkMxOgorICAgICAgICBmb3JtYXRfaW4tPmVuY29kaW5nID0gTU1BTF9FTkNPRElOR19XVkMxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgZm9ybWF0X2luLT5lbmNvZGluZyA9IE1NQUxfRU5DT0RJTkdfSDI2NDsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGZvcm1hdF9pbi0+ZXMtPnZpZGVvLndpZHRoID0gRkZBTElHTihhdmN0eC0+d2lkdGgsIDMyKTsKICAgICBmb3JtYXRfaW4tPmVzLT52aWRlby5oZWlnaHQgPSBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQsIDE2KTsKQEAgLTM4MCwxMyArMzk4LDE1IEBACiAgICAgZm9ybWF0X2luLT5lcy0+dmlkZW8ucGFyLmRlbiA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbjsKICAgICBmb3JtYXRfaW4tPmZsYWdzID0gTU1BTF9FU19GT1JNQVRfRkxBR19GUkFNRUQ7CiAKLSAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyh0bXAsIHNpemVvZih0bXApLCBmb3JtYXRfaW4tPmVuY29kaW5nKTsKLSAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlVzaW5nIE1NQUwgJXMgZW5jb2RpbmcuXG4iLCB0bXApOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVXNpbmcgTU1BTCAlcyBlbmNvZGluZy5cbiIsCisgICAgICAgICAgIGF2X2ZvdXJjYzJzdHIoZm9ybWF0X2luLT5lbmNvZGluZykpOwogCisjaWYgSEFWRV9NTUFMX1BBUkFNRVRFUl9WSURFT19NQVhfTlVNX0NBTExCQUNLUwogICAgIGlmIChtbWFsX3BvcnRfcGFyYW1ldGVyX3NldF91aW50MzIoZGVjb2Rlci0+aW5wdXRbMF0sIE1NQUxfUEFSQU1FVEVSX1ZJREVPX01BWF9OVU1fQ0FMTEJBQ0tTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgLSBjdHgtPmV4dHJhX2RlY29kZXJfYnVmZmVycykpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNvdWxkIG5vdCBzZXQgaW5wdXQgYnVmZmVyaW5nIGxpbWl0LlxuIik7CiAgICAgfQorI2VuZGlmCiAKICAgICBpZiAoKHN0YXR1cyA9IG1tYWxfcG9ydF9mb3JtYXRfY29tbWl0KGRlY29kZXItPmlucHV0WzBdKSkpCiAgICAgICAgIGdvdG8gZmFpbDsKQEAgLTUyMiw3ICs1NDIsNyBAQAogCiAgICAgICAgIGlmICghc2l6ZSkgewogICAgICAgICAgICAgYnVmZmVyLT5mbGFncyB8PSBNTUFMX0JVRkZFUl9IRUFERVJfRkxBR19GUkFNRV9FTkQ7Ci0gICAgICAgICAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZjdHgtPnBhY2tldHNfYnVmZmVyZWQsIDEpOworICAgICAgICAgICAgYXRvbWljX2ZldGNoX2FkZCgmY3R4LT5wYWNrZXRzX2J1ZmZlcmVkLCAxKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghYnVmZmVyLT5sZW5ndGgpIHsKQEAgLTU4Nyw3ICs2MDcsNyBAQAogICAgICAgICAgICAgbW1hbF9idWZmZXJfaGVhZGVyX3JlbGVhc2UobWJ1ZmZlcik7CiAgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmJ1ZmZlci0+cmVmKTsKICAgICAgICAgICAgIGlmIChidWZmZXItPmZsYWdzICYgTU1BTF9CVUZGRVJfSEVBREVSX0ZMQUdfRlJBTUVfRU5EKQotICAgICAgICAgICAgICAgIGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJmN0eC0+cGFja2V0c19idWZmZXJlZCwgLTEpOworICAgICAgICAgICAgICAgIGF0b21pY19mZXRjaF9hZGQoJmN0eC0+cGFja2V0c19idWZmZXJlZCwgLTEpOwogICAgICAgICAgICAgYXZfZnJlZShidWZmZXIpOwogICAgICAgICB9CiAKQEAgLTYwNiw2ICs2MjYsOSBAQAogICAgIE1NQUxEZWNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGludCByZXQgPSAwOwogCisgICAgZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSBjdHgtPmludGVybGFjZWRfZnJhbWU7CisgICAgZnJhbWUtPnRvcF9maWVsZF9maXJzdCA9IGN0eC0+dG9wX2ZpZWxkX2ZpcnN0OworCiAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTU1BTCkgewogICAgICAgICBpZiAoIWN0eC0+cG9vbF9vdXQpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOyAvLyBmb3JtYXQgY2hhbmdlIGNvZGUgZmFpbGVkIHdpdGggT09NIHByZXZpb3VzbHkKQEAgLTYxOCwyNyArNjQxLDI1IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50IHcgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMzIpOwogICAgICAgICBpbnQgaCA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgMTYpOwotICAgICAgICBjaGFyICpwdHI7Ci0gICAgICAgIGludCBwbGFuZTsKLSAgICAgICAgaW50IGk7CisgICAgICAgIHVpbnQ4X3QgKnNyY1s0XTsKKyAgICAgICAgaW50IGxpbmVzaXplWzRdOwogCiAgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCiAgICAgICAgICAgICBnb3RvIGRvbmU7CiAKLSAgICAgICAgcHRyID0gYnVmZmVyLT5kYXRhICsgYnVmZmVyLT50eXBlLT52aWRlby5vZmZzZXRbMF07Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspCi0gICAgICAgICAgICBtZW1jcHkoZnJhbWUtPmRhdGFbMF0gKyBmcmFtZS0+bGluZXNpemVbMF0gKiBpLCBwdHIgKyB3ICogaSwgYXZjdHgtPndpZHRoKTsKLQotICAgICAgICBwdHIgKz0gdyAqIGg7Ci0KLSAgICAgICAgZm9yIChwbGFuZSA9IDE7IHBsYW5lIDwgMzsgcGxhbmUrKykgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5oZWlnaHQgLyAyOyBpKyspCi0gICAgICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhW3BsYW5lXSArIGZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKiBpLCBwdHIgKyB3IC8gMiAqIGksIChhdmN0eC0+d2lkdGggKyAxKSAvIDIpOwotICAgICAgICAgICAgcHRyICs9IHcgLyAyICogaCAvIDI7Ci0gICAgICAgIH0KKyAgICAgICAgYXZfaW1hZ2VfZmlsbF9hcnJheXMoc3JjLCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhICsgYnVmZmVyLT50eXBlLT52aWRlby5vZmZzZXRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10LCB3LCBoLCAxKTsKKyAgICAgICAgYXZfaW1hZ2VfY29weShmcmFtZS0+ZGF0YSwgZnJhbWUtPmxpbmVzaXplLCBzcmMsIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOwogICAgIH0KIAotICAgIGZyYW1lLT5wa3RfcHRzID0gYnVmZmVyLT5wdHMgPT0gTU1BTF9USU1FX1VOS05PV04gPyBBVl9OT1BUU19WQUxVRSA6IGJ1ZmZlci0+cHRzOworICAgIGZyYW1lLT5wdHMgPSBidWZmZXItPnB0cyA9PSBNTUFMX1RJTUVfVU5LTk9XTiA/IEFWX05PUFRTX1ZBTFVFIDogYnVmZmVyLT5wdHM7CisjaWYgRkZfQVBJX1BLVF9QVFMKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBmcmFtZS0+cGt0X3B0cyA9IGZyYW1lLT5wdHM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogICAgIGZyYW1lLT5wa3RfZHRzID0gQVZfTk9QVFNfVkFMVUU7CiAKIGRvbmU6CkBAIC02NjQsMTEgKzY4NSwxMSBAQAogICAgICAgICAvLyBiZWluZyBidXN5IGZyb20gZGVjb2RlciB3YWl0aW5nIGZvciBpbnB1dC4gU28ganVzdCBwb2xsIGF0IHRoZSBzdGFydCBhbmQKICAgICAgICAgLy8ga2VlcCBmZWVkaW5nIG5ldyBkYXRhIHRvIHRoZSBidWZmZXIuCiAgICAgICAgIC8vIFdlIGFyZSBwcmV0dHkgc3VyZSB0aGUgZGVjb2RlciB3aWxsIHByb2R1Y2Ugb3V0cHV0IGlmIHdlIHNlbnQgbW9yZSBpbnB1dAotICAgICAgICAvLyBmcmFtZXMgdGhhbiB3aGF0IGEgaDI2NCBkZWNvZGVyIGNvdWxkIGxvZ2ljYWxseSBkZWxheS4gVGhpcyBhdm9pZHMgdG9vCisgICAgICAgIC8vIGZyYW1lcyB0aGFuIHdoYXQgYSBILjI2NCBkZWNvZGVyIGNvdWxkIGxvZ2ljYWxseSBkZWxheS4gVGhpcyBhdm9pZHMgdG9vCiAgICAgICAgIC8vIGV4Y2Vzc2l2ZSBidWZmZXJpbmcuCiAgICAgICAgIC8vIFdlIGFsc28gd2FpdCBpZiB3ZSBzZW50IGVvcywgYnV0IGRpZG4ndCByZWNlaXZlIGl0IHlldCAodGhpbmsgb2YgZGVjb2RpbmcKICAgICAgICAgLy8gc3RyZWFtIHdpdGggYSB2ZXJ5IGxvdyBudW1iZXIgb2YgZnJhbWVzKS4KLSAgICAgICAgaWYgKGF2cHJpdl9hdG9taWNfaW50X2dldCgmY3R4LT5wYWNrZXRzX2J1ZmZlcmVkKSA+IE1BWF9ERUxBWUVEX0ZSQU1FUyB8fAorICAgICAgICBpZiAoYXRvbWljX2xvYWQoJmN0eC0+cGFja2V0c19idWZmZXJlZCkgPiBNQVhfREVMQVlFRF9GUkFNRVMgfHwKICAgICAgICAgICAgIChjdHgtPnBhY2tldHNfc2VudCAmJiBjdHgtPmVvc19zZW50KSkgewogICAgICAgICAgICAgLy8gTU1BTCB3aWxsIGlnbm9yZSBicm9rZW4gaW5wdXQgcGFja2V0cywgd2hpY2ggbWVhbnMgdGhlIGZyYW1lIHdlCiAgICAgICAgICAgICAvLyBleHBlY3QgaGVyZSBtYXkgbmV2ZXIgYXJyaXZlLiBEZWFsaW5nIHdpdGggdGhpcyBjb3JyZWN0bHkgaXMKQEAgLTcyMCw5ICs3NDEsOCBAQAogICAgICAgICAgICAgbW1hbF9idWZmZXJfaGVhZGVyX3JlbGVhc2UoYnVmZmVyKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+Y21kKSB7Ci0gICAgICAgICAgICBjaGFyIHNbMjBdOwotICAgICAgICAgICAgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcocywgc2l6ZW9mKHMpLCBidWZmZXItPmNtZCk7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBNTUFMIGV2ZW50ICVzIG9uIG91dHB1dCBwb3J0XG4iLCBzKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIE1NQUwgZXZlbnQgJXMgb24gb3V0cHV0IHBvcnRcbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cihidWZmZXItPmNtZCkpOwogICAgICAgICAgICAgZ290byBkb25lOwogICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci0+bGVuZ3RoID09IDApIHsKICAgICAgICAgICAgIC8vIFVudXNlZCBvdXRwdXQgYnVmZmVyIHRoYXQgZ290IGRyYWluZWQgYWZ0ZXIgZm9ybWF0IGNoYW5nZS4KQEAgLTc4OCwzMiArODA4LDkgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1BVkhXQWNjZWwgZmZfaDI2NF9tbWFsX2h3YWNjZWwgPSB7Ci0gICAgLm5hbWUgICAgICAgPSAiaDI2NF9tbWFsIiwKLSAgICAudHlwZSAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCi0gICAgLnBpeF9mbXQgICAgPSBBVl9QSVhfRk1UX01NQUwsCi19OwotCi1BVkhXQWNjZWwgZmZfbXBlZzJfbW1hbF9od2FjY2VsID0gewotICAgIC5uYW1lICAgICAgID0gIm1wZWcyX21tYWwiLAotICAgIC50eXBlICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTywKLSAgICAucGl4X2ZtdCAgICA9IEFWX1BJWF9GTVRfTU1BTCwKLX07Ci0KLUFWSFdBY2NlbCBmZl9tcGVnNF9tbWFsX2h3YWNjZWwgPSB7Ci0gICAgLm5hbWUgICAgICAgPSAibXBlZzRfbW1hbCIsCi0gICAgLnR5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKLSAgICAucGl4X2ZtdCAgICA9IEFWX1BJWF9GTVRfTU1BTCwKLX07Ci0KLUFWSFdBY2NlbCBmZl92YzFfbW1hbF9od2FjY2VsID0gewotICAgIC5uYW1lICAgICAgID0gInZjMV9tbWFsIiwKLSAgICAudHlwZSAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKLSAgICAucGl4X2ZtdCAgICA9IEFWX1BJWF9GTVRfTU1BTCwKK3N0YXRpYyBjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCAqbW1hbF9od19jb25maWdzW10gPSB7CisgICAgSFdfQ09ORklHX0lOVEVSTkFMKE1NQUwpLAorICAgIE5VTEwKIH07CiAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW109ewpAQCAtODI1LDYgKzgyMiw3IEBACiAjZGVmaW5lIEZGTU1BTF9ERUNfQ0xBU1MoTkFNRSkgXAogICAgIHN0YXRpYyBjb25zdCBBVkNsYXNzIGZmbW1hbF8jI05BTUUjI19kZWNfY2xhc3MgPSB7IFwKICAgICAgICAgLmNsYXNzX25hbWUgPSAibW1hbF8iICNOQU1FICJfZGVjIiwgXAorICAgICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLCBcCiAgICAgICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywgXAogICAgICAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwgXAogICAgIH07CkBAIC04NDIsMTEgKzg0MCwxMyBAQAogICAgICAgICAuZGVjb2RlICAgICAgICAgPSBmZm1tYWxfZGVjb2RlLCBcCiAgICAgICAgIC5mbHVzaCAgICAgICAgICA9IGZmbW1hbF9mbHVzaCwgXAogICAgICAgICAucHJpdl9jbGFzcyAgICAgPSAmZmZtbWFsXyMjTkFNRSMjX2RlY19jbGFzcywgXAotICAgICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVksIFwKKyAgICAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0hBUkRXQVJFLCBcCiAgICAgICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9TRVRTX1BLVF9EVFMsIFwKICAgICAgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfTU1BTCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkV9LCBcCisgICAgICAgIC5od19jb25maWdzICAgICA9IG1tYWxfaHdfY29uZmlncywgXAorICAgICAgICAud3JhcHBlcl9uYW1lICAgPSAibW1hbCIsIFwKICAgICB9OwogCiBGRk1NQUxfREVDKGgyNjQsIEFWX0NPREVDX0lEX0gyNjQpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21vdGlvbi10ZXN0LmMgYi9saWJhdmNvZGVjL21vdGlvbi10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2Y0YWEuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9tb3Rpb24tdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qCi0gKiAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogbW90aW9uIHRlc3QuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJtZV9jbXAuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCi0KLSN1bmRlZiBwcmludGYKLQotI2RlZmluZSBXSURUSCA2NAotI2RlZmluZSBIRUlHSFQgNjQKLQotc3RhdGljIHVpbnQ4X3QgaW1nMVtXSURUSCAqIEhFSUdIVF07Ci1zdGF0aWMgdWludDhfdCBpbWcyW1dJRFRIICogSEVJR0hUXTsKLQotc3RhdGljIHZvaWQgZmlsbF9yYW5kb20odWludDhfdCAqdGFiLCBpbnQgc2l6ZSkKLXsKLSAgICBpbnQgaTsKLSAgICBBVkxGRyBwcm5nOwotCi0gICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOwotICAgIGZvcihpPTA7aTxzaXplO2krKykgewotICAgICAgICB0YWJbaV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDI1NjsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGhlbHAodm9pZCkKLXsKLSAgICBwcmludGYoIm1vdGlvbi10ZXN0IFstaF1cbiIKLSAgICAgICAgICAgInRlc3QgbW90aW9uIGltcGxlbWVudGF0aW9uc1xuIik7Ci19Ci0KLSNkZWZpbmUgTkJfSVRTIDUwMAotCi1pbnQgZHVtbXk7Ci0KLXN0YXRpYyB2b2lkIHRlc3RfbW90aW9uKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgIG1lX2NtcF9mdW5jIHRlc3RfZnVuYywgbWVfY21wX2Z1bmMgcmVmX2Z1bmMpCi17Ci0gICAgaW50IHgsIHksIGQxLCBkMiwgaXQ7Ci0gICAgdWludDhfdCAqcHRyOwotICAgIGludDY0X3QgdGk7Ci0gICAgcHJpbnRmKCJ0ZXN0aW5nICclcydcbiIsIG5hbWUpOwotCi0gICAgLyogdGVzdCBjb3JyZWN0bmVzcyAqLwotICAgIGZvcihpdD0wO2l0PDIwO2l0KyspIHsKLQotICAgICAgICBmaWxsX3JhbmRvbShpbWcxLCBXSURUSCAqIEhFSUdIVCk7Ci0gICAgICAgIGZpbGxfcmFuZG9tKGltZzIsIFdJRFRIICogSEVJR0hUKTsKLQotICAgICAgICBmb3IoeT0wO3k8SEVJR0hULTE3O3krKykgewotICAgICAgICAgICAgZm9yKHg9MDt4PFdJRFRILTE3O3grKykgewotICAgICAgICAgICAgICAgIHB0ciA9IGltZzIgKyB5ICogV0lEVEggKyB4OwotICAgICAgICAgICAgICAgIGQxID0gdGVzdF9mdW5jKE5VTEwsIGltZzEsIHB0ciwgV0lEVEgsIDgpOwotICAgICAgICAgICAgICAgIGQyID0gcmVmX2Z1bmMoTlVMTCwgaW1nMSwgcHRyLCBXSURUSCwgOCk7Ci0gICAgICAgICAgICAgICAgaWYgKGQxICE9IGQyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3I6IG1teD0lZCBjPSVkXG4iLCBkMSwgZDIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbW1zX2MoKTsKLQotICAgIC8qIHNwZWVkIHRlc3QgKi8KLSAgICB0aSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKLSAgICBkMSA9IDA7Ci0gICAgZm9yKGl0PTA7aXQ8TkJfSVRTO2l0KyspIHsKLSAgICAgICAgZm9yKHk9MDt5PEhFSUdIVC0xNzt5KyspIHsKLSAgICAgICAgICAgIGZvcih4PTA7eDxXSURUSC0xNzt4KyspIHsKLSAgICAgICAgICAgICAgICBwdHIgPSBpbWcyICsgeSAqIFdJRFRIICsgeDsKLSAgICAgICAgICAgICAgICBkMSArPSB0ZXN0X2Z1bmMoTlVMTCwgaW1nMSwgcHRyLCBXSURUSCwgOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZW1tc19jKCk7Ci0gICAgZHVtbXkgPSBkMTsgLyogYXZvaWQgb3B0aW1pemF0aW9uICovCi0gICAgdGkgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSB0aTsKLQotICAgIHByaW50ZigiICAlMC4wZiBrb3Avc1xuIiwKLSAgICAgICAgICAgKGRvdWJsZSlOQl9JVFMgKiAoV0lEVEggLSAxNikgKiAoSEVJR0hUIC0gMTYpIC8KLSAgICAgICAgICAgKGRvdWJsZSkodGkgLyAxMDAwLjApKTsKLX0KLQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgQVZDb2RlY0NvbnRleHQgKmN0eDsKLSAgICBpbnQgYzsKLSAgICBNRUNtcENvbnRleHQgY2N0eCwgbW14Y3R4OwotICAgIGludCBmbGFnc1syXSA9IHsgQVZfQ1BVX0ZMQUdfTU1YLCBBVl9DUFVfRkxBR19NTVhFWFQgfTsKLSAgICBpbnQgZmxhZ3Nfc2l6ZSA9IEhBVkVfTU1YRVhUID8gMiA6IDE7Ci0KLSAgICBpZiAoYXJnYyA+IDEpIHsKLSAgICAgICAgaGVscCgpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBwcmludGYoImZmbXBlZyBtb3Rpb24gdGVzdFxuIik7Ci0KLSAgICBjdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOwotICAgIGN0eC0+ZmxhZ3MgfD0gQVZfQ09ERUNfRkxBR19CSVRFWEFDVDsKLSAgICBhdl9mb3JjZV9jcHVfZmxhZ3MoMCk7Ci0gICAgbWVtc2V0KCZjY3R4LCAwLCBzaXplb2YoY2N0eCkpOwotICAgIGZmX21lX2NtcF9pbml0KCZjY3R4LCBjdHgpOwotICAgIGZvciAoYyA9IDA7IGMgPCBmbGFnc19zaXplOyBjKyspIHsKLSAgICAgICAgaW50IHg7Ci0gICAgICAgIGF2X2ZvcmNlX2NwdV9mbGFncyhmbGFnc1tjXSk7Ci0gICAgICAgIG1lbXNldCgmbW14Y3R4LCAwLCBzaXplb2YobW14Y3R4KSk7Ci0gICAgICAgIGZmX21lX2NtcF9pbml0KCZtbXhjdHgsIGN0eCk7Ci0KLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgewotICAgICAgICAgICAgcHJpbnRmKCIlcyBmb3IgJWR4JWQgcGl4ZWxzXG4iLCBjID8gIm1teDIiIDogIm1teCIsCi0gICAgICAgICAgICAgICAgICAgeCA/IDggOiAxNiwgeCA/IDggOiAxNik7Ci0gICAgICAgICAgICB0ZXN0X21vdGlvbigibW14IiwgICAgIG1teGN0eC5waXhfYWJzW3hdWzBdLCBjY3R4LnBpeF9hYnNbeF1bMF0pOwotICAgICAgICAgICAgdGVzdF9tb3Rpb24oIm1teF94MiIsICBtbXhjdHgucGl4X2Fic1t4XVsxXSwgY2N0eC5waXhfYWJzW3hdWzFdKTsKLSAgICAgICAgICAgIHRlc3RfbW90aW9uKCJtbXhfeTIiLCAgbW14Y3R4LnBpeF9hYnNbeF1bMl0sIGNjdHgucGl4X2Fic1t4XVsyXSk7Ci0gICAgICAgICAgICB0ZXN0X21vdGlvbigibW14X3h5MiIsIG1teGN0eC5waXhfYWJzW3hdWzNdLCBjY3R4LnBpeF9hYnNbeF1bM10pOwotICAgICAgICB9Ci0gICAgfQotICAgIGF2X2ZyZWUoY3R4KTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tb3Rpb25fZXN0LmMgYi9saWJhdmNvZGVjL21vdGlvbl9lc3QuYwppbmRleCA1MjM2OTM4Li44YjVjZTIxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21vdGlvbl9lc3QuYworKysgYi9saWJhdmNvZGVjL21vdGlvbl9lc3QuYwpAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgIGN4PSAoY3g+PjEpfChjeCYxKTsKICAgICAgICAgICAgICAgICAgICAgY3k9IChjeT4+MSl8KGN5JjEpOwogICAgICAgICAgICAgICAgICAgICB1dmR4eT0gKGN4JjEpICsgMiooY3kmMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vRklYTUUgeC95IHdyb25nLCBidXQgbXBlZzQgcXBlbCBpcyBzaWNrIGFueXdheSwgd2Ugc2hvdWxkIGRyb3AgYXMgbXVjaCBvZiBpdCBhcyBwb3NzaWJsZSBpbiBmYXZvciBmb3IgaDI2NAorICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB4L3kgd3JvbmcsIGJ1dCBNUEVHLTQgcXBlbCBpcyBzaWNrIGFueXdheSwgd2Ugc2hvdWxkIGRyb3AgYXMgbXVjaCBvZiBpdCBhcyBwb3NzaWJsZSBpbiBmYXZvciBmb3IgSC4yNjQKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICBjLT5ocGVsX3B1dFtzaXplXVtkeHldKGMtPnRlbXAsIHJlZlswXSArIHggKyB5KnN0cmlkZSwgc3RyaWRlLCBoKTsKQEAgLTMxMywyNiArMzEzLDYgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi0gICAgLy9zcGVjaWFsIGNhc2Ugb2Ygc25vdyBpcyBuZWVkZWQgYmVjYXVzZSBzbm93IHVzZXMgaXRzIG93biBpdGVyYXRpdmUgTUUgY29kZQotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGlmIChzLT5tb3Rpb25fZXN0ID09IEZGX01FX0VQWlMpIHsKLSAgICAgICAgaWYgKHMtPm1lX21ldGhvZCA9PSBNRV9aRVJPKQotICAgICAgICAgICAgcy0+bW90aW9uX2VzdCA9IEZGX01FX1pFUk87Ci0gICAgICAgIGVsc2UgaWYgKHMtPm1lX21ldGhvZCA9PSBNRV9FUFpTKQotICAgICAgICAgICAgcy0+bW90aW9uX2VzdCA9IEZGX01FX0VQWlM7Ci0gICAgICAgIGVsc2UgaWYgKHMtPm1lX21ldGhvZCA9PSBNRV9YMSkKLSAgICAgICAgICAgIHMtPm1vdGlvbl9lc3QgPSBGRl9NRV9YT05FOwotICAgICAgICBlbHNlIGlmIChzLT5hdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfU05PVykgewotICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIm1lX21ldGhvZCBpcyBvbmx5IGFsbG93ZWQgdG8gYmUgc2V0IHRvIHplcm8gYW5kIGVwenM7ICIKLSAgICAgICAgICAgICAgICAgICAiZm9yIGhleCx1bWgsZnVsbCBhbmQgb3RoZXJzIHNlZSBkaWFfc2l6ZVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci1GRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgotCiAgICAgYy0+YXZjdHg9IHMtPmF2Y3R4OwogCiAgICAgaWYocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2MSkKQEAgLTU1Niw3ICs1MzYsNyBAQAogICAgICAgICBjLT54bWF4ID0gLSB4ICsgcy0+d2lkdGg7CiAgICAgICAgIGMtPnltYXggPSAtIHkgKyBzLT5oZWlnaHQ7CiAgICAgfSBlbHNlIGlmIChzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYxKXsKLSAgICAgICAgLy8gU2VhcmNoIHJhbmdlIG9mIEgyNjEgaXMgZGlmZmVyZW50IGZyb20gb3RoZXIgY29kZWMgc3RhbmRhcmRzCisgICAgICAgIC8vIFNlYXJjaCByYW5nZSBvZiBILjI2MSBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBjb2RlYyBzdGFuZGFyZHMKICAgICAgICAgYy0+eG1pbiA9ICh4ID4gMTUpID8gLSAxNSA6IDA7CiAgICAgICAgIGMtPnltaW4gPSAoeSA+IDE1KSA/IC0gMTUgOiAwOwogICAgICAgICBjLT54bWF4ID0gKHggPCBzLT5tYl93aWR0aCAqIDE2IC0gMTYpID8gMTUgOiAwOwpAQCAtODk3LDYgKzg3Nyw3IEBACiAgICAgY2FzZSBGRl9DTVBfTlNTRToKICAgICAgICAgcmV0dXJuIGxhbWJkYTI+PkZGX0xBTUJEQV9TSElGVDsKICAgICBjYXNlIEZGX0NNUF9CSVQ6CisgICAgY2FzZSBGRl9DTVBfTUVESUFOX1NBRDoKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogfQpAQCAtOTU1LDEwICs5MzYsMTAgQEAKICAgICAgICAgICAgIFBfVE9QUklHSFRbMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUubW90aW9uX3ZhbFswXVttb3RfeHkgLSBtb3Rfc3RyaWRlICsgMl1bMV07CiAgICAgICAgICAgICBpZiAoUF9UT1BbMV0gPiAoYy0+eW1heCA8PCBzaGlmdCkpCiAgICAgICAgICAgICAgICAgUF9UT1BbMV0gPSAgYy0+eW1heCA8PCBzaGlmdDsKLSAgICAgICAgICAgIGlmIChQX1RPUFJJR0hUWzBdIDwgKGMtPnhtaW4gPDwgc2hpZnQpKQotICAgICAgICAgICAgICAgIFBfVE9QUklHSFRbMF0gPSAgYy0+eG1pbiA8PCBzaGlmdDsKLSAgICAgICAgICAgIGlmIChQX1RPUFJJR0hUWzFdID4gKGMtPnltYXggPDwgc2hpZnQpKQotICAgICAgICAgICAgICAgIFBfVE9QUklHSFRbMV0gPSAgYy0+eW1heCA8PCBzaGlmdDsKKyAgICAgICAgICAgIGlmIChQX1RPUFJJR0hUWzBdIDwgKGMtPnhtaW4gKiAoMSA8PCBzaGlmdCkpKQorICAgICAgICAgICAgICAgIFBfVE9QUklHSFRbMF0gPSAgYy0+eG1pbiAqICgxIDw8IHNoaWZ0KTsKKyAgICAgICAgICAgIGlmIChQX1RPUFJJR0hUWzFdID4gKGMtPnltYXggKiAoMSA8PCBzaGlmdCkpKQorICAgICAgICAgICAgICAgIFBfVE9QUklHSFRbMV0gPSAgYy0+eW1heCAqICgxIDw8IHNoaWZ0KTsKIAogICAgICAgICAgICAgUF9NRURJQU5bMF0gPSBtaWRfcHJlZChQX0xFRlRbMF0sIFBfVE9QWzBdLCBQX1RPUFJJR0hUWzBdKTsKICAgICAgICAgICAgIFBfTUVESUFOWzFdID0gbWlkX3ByZWQoUF9MRUZUWzFdLCBQX1RPUFsxXSwgUF9UT1BSSUdIVFsxXSk7CkBAIC05NjYsNyArOTQ3LDcgQEAKICAgICAgICAgICAgIGlmIChzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzKSB7CiAgICAgICAgICAgICAgICAgYy0+cHJlZF94ID0gUF9NRURJQU5bMF07CiAgICAgICAgICAgICAgICAgYy0+cHJlZF95ID0gUF9NRURJQU5bMV07Ci0gICAgICAgICAgICB9IGVsc2UgeyAvKiBtcGVnMSBhdCBsZWFzdCAqLworICAgICAgICAgICAgfSBlbHNlIHsgLyogTVBFRy0xIGF0IGxlYXN0ICovCiAgICAgICAgICAgICAgICAgYy0+cHJlZF94ID0gUF9MRUZUWzBdOwogICAgICAgICAgICAgICAgIGMtPnByZWRfeSA9IFBfTEVGVFsxXTsKICAgICAgICAgICAgIH0KQEAgLTE1MzYsNyArMTUxNyw3IEBACiAgICAgICAgIGRtaW49IGRpcmVjdF9zZWFyY2gocywgbWJfeCwgbWJfeSk7CiAgICAgZWxzZQogICAgICAgICBkbWluPSBJTlRfTUFYOwotLy9GSVhNRSBwZW5hbHR5IHN0dWZmIGZvciBub24gbXBlZzQKKy8vIEZJWE1FIHBlbmFsdHkgc3R1ZmYgZm9yIG5vbi1NUEVHLTQKICAgICBjLT5za2lwPTA7CiAgICAgZm1pbiA9IGVzdGltYXRlX21vdGlvbl9iKHMsIG1iX3gsIG1iX3ksIHMtPmJfZm9yd19tdl90YWJsZSwgMCwgcy0+Zl9jb2RlKSArCiAgICAgICAgICAgIDMgKiBwZW5hbHR5X2ZhY3RvcjsKQEAgLTE3MTQsNyArMTY5NSw2IEBACiB9CiAKIC8qKgotICoKICAqIEBwYXJhbSB0cnVuY2F0ZSAxIGZvciB0cnVuY2F0aW9uLCAwIGZvciB1c2luZyBpbnRyYQogICovCiB2b2lkIGZmX2ZpeF9sb25nX212cyhNcGVnRW5jQ29udGV4dCAqIHMsIHVpbnQ4X3QgKmZpZWxkX3NlbGVjdF90YWJsZSwgaW50IGZpZWxkX3NlbGVjdCwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbW90aW9uX2VzdF90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9tb3Rpb25fZXN0X3RlbXBsYXRlLmMKaW5kZXggMzI3YTI0Yi4uMGMyMWJiZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tb3Rpb25fZXN0X3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9tb3Rpb25fZXN0X3RlbXBsYXRlLmMKQEAgLTI5OSw3ICsyOTksNyBAQAogICAgICAgICAgICAgY29uc3QgaW50IGN5Mj0gYiArIHQgLSAyKmM7CiAgICAgICAgICAgICBpbnQgY3h5OwogCi0gICAgICAgICAgICBpZihtYXBbKGluZGV4LSgxPDxNRV9NQVBfU0hJRlQpLTEpJihNRV9NQVBfU0laRS0xKV0gPT0gKG15PDxNRV9NQVBfTVZfQklUUykgKyBteCArIG1hcF9nZW5lcmF0aW9uICYmIDApeyAvL0ZJWE1FCisgICAgICAgICAgICBpZihtYXBbKGluZGV4LSgxPDxNRV9NQVBfU0hJRlQpLTEpJihNRV9NQVBfU0laRS0xKV0gPT0gKChteS0xKTw8TUVfTUFQX01WX0JJVFMpICsgKG14LTEpICsgbWFwX2dlbmVyYXRpb24pewogICAgICAgICAgICAgICAgIHRsPSBzY29yZV9tYXBbKGluZGV4LSgxPDxNRV9NQVBfU0hJRlQpLTEpJihNRV9NQVBfU0laRS0xKV07CiAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICB0bD0gY21wKHMsIG14LTEsIG15LTEsIDAsIDAsIHNpemUsIGgsIHJlZl9pbmRleCwgc3JjX2luZGV4LCBjbXBmLCBjaHJvbWFfY21wZiwgZmxhZ3MpOy8vRklYTUUgd3JvbmcgaWYgY2hyb21hIG1lIGlzIGRpZmZlcmVudApAQCAtNDEzLDcgKzQxMyw3IEBACiAgICAgY29uc3QgaW50IHNoaWZ0PSAxK3FwZWw7XAogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgc21hbGxfZGlhbW9uZF9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgKmJlc3QsIGludCBkbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50IGNvbnN0IHBlbmFsdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgY29uc3QgaW50IHBlbmFsdHlfZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBoLCBpbnQgZmxhZ3MpCiB7CiAgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKQEAgLTQyOSw3ICs0MjksNyBAQAogICAgIHsgLyogZW5zdXJlIHRoYXQgdGhlIGJlc3QgcG9pbnQgaXMgaW4gdGhlIE1BUCBhcyBoL3FwZWwgcmVmaW5lbWVudCBuZWVkcyBpdCAqLwogICAgICAgICBjb25zdCB1bnNpZ25lZCBrZXkgPSAoKHVuc2lnbmVkKWJlc3RbMV08PE1FX01BUF9NVl9CSVRTKSArIGJlc3RbMF0gKyBtYXBfZ2VuZXJhdGlvbjsKICAgICAgICAgY29uc3QgaW50IGluZGV4PSAoKCh1bnNpZ25lZCliZXN0WzFdPDxNRV9NQVBfU0hJRlQpICsgYmVzdFswXSkmKE1FX01BUF9TSVpFLTEpOwotICAgICAgICBpZihtYXBbaW5kZXhdIT1rZXkpeyAvL3RoaXMgd2lsbCBiZSBleGVjdXRlZCBvbmx5IHZlcnkgcmFyZXkKKyAgICAgICAgaWYgKG1hcFtpbmRleF0gIT0ga2V5KSB7IC8vIHRoaXMgd2lsbCBiZSBleGVjdXRlZCBvbmx5IHZlcnkgcmFyZWx5CiAgICAgICAgICAgICBzY29yZV9tYXBbaW5kZXhdPSBjbXAocywgYmVzdFswXSwgYmVzdFsxXSwgMCwgMCwgc2l6ZSwgaCwgcmVmX2luZGV4LCBzcmNfaW5kZXgsIGNtcGYsIGNocm9tYV9jbXBmLCBmbGFncyk7CiAgICAgICAgICAgICBtYXBbaW5kZXhdPSBrZXk7CiAgICAgICAgIH0KQEAgLTQ1NCw3ICs0NTQsNyBAQAogfQogCiBzdGF0aWMgaW50IGZ1bm55X2RpYW1vbmRfc2VhcmNoKE1wZWdFbmNDb250ZXh0ICogcywgaW50ICpiZXN0LCBpbnQgZG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGludCBjb25zdCBwZW5hbHR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGNvbnN0IGludCBwZW5hbHR5X2ZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCwgaW50IGZsYWdzKQogewogICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CkBAIC00OTYsNyArNDk2LDcgQEAKIH0KIAogc3RhdGljIGludCBoZXhfc2VhcmNoKE1wZWdFbmNDb250ZXh0ICogcywgaW50ICpiZXN0LCBpbnQgZG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGludCBjb25zdCBwZW5hbHR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGNvbnN0IGludCBwZW5hbHR5X2ZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCwgaW50IGZsYWdzLCBpbnQgZGlhX3NpemUpCiB7CiAgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKQEAgLTUzMCw3ICs1MzAsNyBAQAogfQogCiBzdGF0aWMgaW50IGwyc19kaWFfc2VhcmNoKE1wZWdFbmNDb250ZXh0ICogcywgaW50ICpiZXN0LCBpbnQgZG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGludCBjb25zdCBwZW5hbHR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGNvbnN0IGludCBwZW5hbHR5X2ZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCwgaW50IGZsYWdzKQogewogICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CkBAIC01NjgsNyArNTY4LDcgQEAKIH0KIAogc3RhdGljIGludCB1bWhfc2VhcmNoKE1wZWdFbmNDb250ZXh0ICogcywgaW50ICpiZXN0LCBpbnQgZG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGludCBjb25zdCBwZW5hbHR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfaW5kZXgsIGludCByZWZfaW5kZXgsIGNvbnN0IGludCBwZW5hbHR5X2ZhY3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgaCwgaW50IGZsYWdzKQogewogICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CkBAIC02MTUsNyArNjE1LDcgQEAKIH0KIAogc3RhdGljIGludCBmdWxsX3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsIGludCAqYmVzdCwgaW50IGRtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBpbnQgY29uc3QgcGVuYWx0eV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBjb25zdCBpbnQgcGVuYWx0eV9mYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGgsIGludCBmbGFncykKIHsKICAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOwpAQCAtNjc4LDcgKzY3OCw3IEBACiAKICNkZWZpbmUgTUFYX1NBQl9TSVpFIE1FX01BUF9TSVpFCiBzdGF0aWMgaW50IHNhYl9kaWFtb25kX3NlYXJjaChNcGVnRW5jQ29udGV4dCAqIHMsIGludCAqYmVzdCwgaW50IGRtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBpbnQgY29uc3QgcGVuYWx0eV9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LCBjb25zdCBpbnQgcGVuYWx0eV9mYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGgsIGludCBmbGFncykKIHsKICAgICBNb3Rpb25Fc3RDb250ZXh0ICogY29uc3QgYz0gJnMtPm1lOwpAQCAtNzU4LDcgKzc1OCw3IEBACiAgICAgaWYoICAgYmVzdFswXSA8IHhtYXggJiYgYmVzdFswXSA+IHhtaW4KICAgICAgICAmJiBiZXN0WzFdIDwgeW1heCAmJiBiZXN0WzFdID4geW1pbil7CiAgICAgICAgIGludCBkOwotICAgICAgICAvL2Vuc3VyZSB0aGF0IHRoZSByZWZlcm5lY2Ugc2FtcGxlcyBmb3IgaHBlbCByZWZpbmVtZW50IGFyZSBpbiB0aGUgbWFwCisgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSByZWZlcmVuY2Ugc2FtcGxlcyBmb3IgaHBlbCByZWZpbmVtZW50IGFyZSBpbiB0aGUgbWFwCiAgICAgICAgIENIRUNLX01WKGJlc3RbMF0tMSwgYmVzdFsxXSkKICAgICAgICAgQ0hFQ0tfTVYoYmVzdFswXSsxLCBiZXN0WzFdKQogICAgICAgICBDSEVDS19NVihiZXN0WzBdLCBiZXN0WzFdLTEpCkBAIC03NjgsNyArNzY4LDcgQEAKIH0KIAogc3RhdGljIGludCB2YXJfZGlhbW9uZF9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgKmJlc3QsIGludCBkbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50IGNvbnN0IHBlbmFsdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgY29uc3QgaW50IHBlbmFsdHlfZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBoLCBpbnQgZmxhZ3MpCiB7CiAgICAgTW90aW9uRXN0Q29udGV4dCAqIGNvbnN0IGM9ICZzLT5tZTsKQEAgLTgyOSw3ICs4MjksNyBAQAogfQogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGlhbW9uZF9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKiBzLCBpbnQgKmJlc3QsIGludCBkbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgaW50IGNvbnN0IHBlbmFsdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19pbmRleCwgaW50IHJlZl9pbmRleCwgY29uc3QgaW50IHBlbmFsdHlfZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCBoLCBpbnQgZmxhZ3MpewogICAgIE1vdGlvbkVzdENvbnRleHQgKiBjb25zdCBjPSAmcy0+bWU7CiAgICAgaWYoYy0+ZGlhX3NpemU9PS0xKQpAQCAtODcxLDcgKzg3MSw3IEBACiAgICAgdW5zaWduZWQgbWFwX2dlbmVyYXRpb247CiAgICAgaW50IHBlbmFsdHlfZmFjdG9yOwogICAgIGNvbnN0IGludCByZWZfbXZfc3RyaWRlPSBzLT5tYl9zdHJpZGU7IC8vcGFzcyBhcyBhcmcgIEZJWE1FCi0gICAgY29uc3QgaW50IHJlZl9tdl94eT0gcy0+bWJfeCArIHMtPm1iX3kqcmVmX212X3N0cmlkZTsgLy9hZGQgdG8gbGFzdF9tdiBiZWZvcmVwYXNzaW5nIEZJWE1FCisgICAgY29uc3QgaW50IHJlZl9tdl94eSA9IHMtPm1iX3ggKyBzLT5tYl95ICogcmVmX212X3N0cmlkZTsgLy8gYWRkIHRvIGxhc3RfbXYgYmVmb3JlIHBhc3NpbmcgRklYTUUKICAgICBtZV9jbXBfZnVuYyBjbXBmLCBjaHJvbWFfY21wZjsKIAogICAgIExPQURfQ09NTU9OCkBAIC05NzIsNyArOTcyLDcgQEAKICAgICByZXR1cm4gZG1pbjsKIH0KIAotLy90aGlzIGZ1bmN0aW9uIGlzIGRlZGljYXRlZCB0byB0aGUgYnJhaW5kYW1hZ2VkIGdjYworLy90aGlzIGZ1bmN0aW9uIGlzIGRlZGljYXRlZCB0byB0aGUgYnJhaW4gZGFtYWdlZCBnY2MKIGludCBmZl9lcHpzX21vdGlvbl9zZWFyY2goTXBlZ0VuY0NvbnRleHQgKnMsIGludCAqbXhfcHRyLCBpbnQgKm15X3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFBbMTBdWzJdLCBpbnQgc3JjX2luZGV4LCBpbnQgcmVmX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICgqbGFzdF9tdilbMl0sIGludCByZWZfbXZfc2NhbGUsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21vdGlvbnBpeGVsc190YWJsZWdlbi5jIGIvbGliYXZjb2RlYy9tb3Rpb25waXhlbHNfdGFibGVnZW4uYwppbmRleCAxNGI3YjliLi4xYmViYWYxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21vdGlvbnBpeGVsc190YWJsZWdlbi5jCisrKyBiL2xpYmF2Y29kZWMvbW90aW9ucGl4ZWxzX3RhYmxlZ2VuLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogR2VuZXJhdGUgYSBoZWFkZXIgZmlsZSBmb3IgaGFyZGNvZGVkIG1vdGlvbnBpeGVscyBSR0IgdG8gWVVWIHRhYmxlCisgKiBHZW5lcmF0ZSBhIGhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgbW90aW9uIHBpeGVscyBSR0IgdG8gWVVWIHRhYmxlCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA5IFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CiAgKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tb3Rpb25waXhlbHNfdGFibGVnZW4uaCBiL2xpYmF2Y29kZWMvbW90aW9ucGl4ZWxzX3RhYmxlZ2VuLmgKaW5kZXggNGZmZTc0Yy4uOTIzOWI2YSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tb3Rpb25waXhlbHNfdGFibGVnZW4uaAorKysgYi9saWJhdmNvZGVjL21vdGlvbnBpeGVsc190YWJsZWdlbi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIEhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgbW90aW9ucGl4ZWxzIFJHQiB0byBZVVYgdGFibGUKKyAqIEhlYWRlciBmaWxlIGZvciBoYXJkY29kZWQgbW90aW9uIHBpeGVscyBSR0IgdG8gWVVWIHRhYmxlCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA5IFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CiAgKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tb3ZzdWJfYnNmLmMgYi9saWJhdmNvZGVjL21vdnN1Yl9ic2YuYwppbmRleCA4ZWU3YTNhLi41ODc4NjA3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21vdnN1Yl9ic2YuYworKysgYi9saWJhdmNvZGVjL21vdnN1Yl9ic2YuYwpAQCAtMjEsMzkgKzIxLDY3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAKK3N0YXRpYyBpbnQgdGV4dDJtb3ZzdWIoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpvdXQpCit7CisgICAgQVZQYWNrZXQgKmluOworICAgIGludCByZXQgPSAwOwogCi1zdGF0aWMgaW50IHRleHQybW92c3ViKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSl7Ci0gICAgaWYgKGJ1Zl9zaXplID4gMHhmZmZmKSByZXR1cm4gMDsKLSAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemUgKyAyOwotICAgICpwb3V0YnVmID0gYXZfbWFsbG9jKCpwb3V0YnVmX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICBpZiAoISpwb3V0YnVmKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIEFWX1dCMTYoKnBvdXRidWYsIGJ1Zl9zaXplKTsKLSAgICBtZW1jcHkoKnBvdXRidWYgKyAyLCBidWYsIGJ1Zl9zaXplKTsKLSAgICByZXR1cm4gMTsKKyAgICByZXQgPSBmZl9ic2ZfZ2V0X3BhY2tldChjdHgsICZpbik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoaW4tPnNpemUgPiAweGZmZmYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IGF2X25ld19wYWNrZXQob3V0LCBpbi0+c2l6ZSArIDIpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IGF2X3BhY2tldF9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBBVl9XQjE2KG91dC0+ZGF0YSwgaW4tPnNpemUpOworICAgIG1lbWNweShvdXQtPmRhdGEgKyAyLCBpbi0+ZGF0YSwgaW4tPnNpemUpOworCitmYWlsOgorICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYob3V0KTsKKyAgICBhdl9wYWNrZXRfZnJlZSgmaW4pOworICAgIHJldHVybiByZXQ7CiB9CiAKLUFWQml0U3RyZWFtRmlsdGVyIGZmX3RleHQybW92c3ViX2JzZj17Citjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl90ZXh0Mm1vdnN1Yl9ic2YgPSB7CiAgICAgLm5hbWUgICA9ICJ0ZXh0Mm1vdnN1YiIsCiAgICAgLmZpbHRlciA9IHRleHQybW92c3ViLAogfTsKIAotc3RhdGljIGludCBtb3YydGV4dHN1YihBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQga2V5ZnJhbWUpewotICAgIGlmIChidWZfc2l6ZSA8IDIpIHJldHVybiAwOwotICAgICpwb3V0YnVmX3NpemUgPSBGRk1JTihidWZfc2l6ZSAtIDIsIEFWX1JCMTYoYnVmKSk7Ci0gICAgKnBvdXRidWYgPSBhdl9tYWxsb2MoKnBvdXRidWZfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGlmICghKnBvdXRidWYpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgbWVtY3B5KCpwb3V0YnVmLCBidWYgKyAyLCAqcG91dGJ1Zl9zaXplKTsKLSAgICByZXR1cm4gMTsKK3N0YXRpYyBpbnQgbW92MnRleHRzdWIoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICByZXQgPSBmZl9ic2ZfZ2V0X3BhY2tldF9yZWYoY3R4LCBwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHBrdC0+c2l6ZSA8IDIpIHsKKyAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBwa3QtPmRhdGEgKz0gMjsKKyAgICBwa3QtPnNpemUgID0gRkZNSU4ocGt0LT5zaXplIC0gMiwgQVZfUkIxNihwa3QtPmRhdGEpKTsKKworICAgIHJldHVybiAwOwogfQogCi1BVkJpdFN0cmVhbUZpbHRlciBmZl9tb3YydGV4dHN1Yl9ic2Y9eworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfbW92MnRleHRzdWJfYnNmID0gewogICAgIC5uYW1lICAgPSAibW92MnRleHRzdWIiLAogICAgIC5maWx0ZXIgPSBtb3YydGV4dHN1YiwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21vdnRleHRkZWMuYyBiL2xpYmF2Y29kZWMvbW92dGV4dGRlYy5jCmluZGV4IDhkMGU4MTQuLmMzOGM1ZWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbW92dGV4dGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvbW92dGV4dGRlYy5jCkBAIC05OSw2ICs5OSw3IEBACiAgICAgdWludDY0X3QgdHJhY2tzaXplOwogICAgIGludCBzaXplX3ZhcjsKICAgICBpbnQgY291bnRfcywgY291bnRfZjsKKyAgICBpbnQgcmVhZG9yZGVyOwogfSBNb3ZUZXh0Q29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTE1LDYgKzExNiw4IEBACiAgICAgICAgICAgICBhdl9mcmVlcCgmbS0+c1tpXSk7CiAgICAgICAgIH0KICAgICAgICAgYXZfZnJlZXAoJm0tPnMpOworICAgICAgICBtLT5jb3VudF9zID0gMDsKKyAgICAgICAgbS0+c3R5bGVfZW50cmllcyA9IDA7CiAgICAgfQogfQogCkBAIC0yNzgsMTIgKzI4MSwxNCBAQAogc3RhdGljIGludCBkZWNvZGVfc3R5bChjb25zdCB1aW50OF90ICp0c21iLCBNb3ZUZXh0Q29udGV4dCAqbSwgQVZQYWNrZXQgKmF2cGt0KQogewogICAgIGludCBpOwotICAgIG0tPnN0eWxlX2VudHJpZXMgPSBBVl9SQjE2KHRzbWIpOworICAgIGludCBzdHlsZV9lbnRyaWVzID0gQVZfUkIxNih0c21iKTsKICAgICB0c21iICs9IDI7CiAgICAgLy8gQSBzaW5nbGUgc3R5bGUgcmVjb3JkIGlzIG9mIGxlbmd0aCAxMiBieXRlcy4KLSAgICBpZiAobS0+dHJhY2tzaXplICsgbS0+c2l6ZV92YXIgKyAyICsgbS0+c3R5bGVfZW50cmllcyAqIDEyID4gYXZwa3QtPnNpemUpCisgICAgaWYgKG0tPnRyYWNrc2l6ZSArIG0tPnNpemVfdmFyICsgMiArIHN0eWxlX2VudHJpZXMgKiAxMiA+IGF2cGt0LT5zaXplKQogICAgICAgICByZXR1cm4gLTE7CiAKKyAgICBtLT5zdHlsZV9lbnRyaWVzID0gc3R5bGVfZW50cmllczsKKwogICAgIG0tPmJveF9mbGFncyB8PSBTVFlMX0JPWDsKICAgICBmb3IoaSA9IDA7IGkgPCBtLT5zdHlsZV9lbnRyaWVzOyBpKyspIHsKICAgICAgICAgbS0+c190ZW1wID0gYXZfbWFsbG9jKHNpemVvZigqbS0+c190ZW1wKSk7CkBAIC0yOTQsNiArMjk5LDE0IEBACiAgICAgICAgIG0tPnNfdGVtcC0+c3R5bGVfc3RhcnQgPSBBVl9SQjE2KHRzbWIpOwogICAgICAgICB0c21iICs9IDI7CiAgICAgICAgIG0tPnNfdGVtcC0+c3R5bGVfZW5kID0gQVZfUkIxNih0c21iKTsKKworICAgICAgICBpZiAoICAgbS0+c190ZW1wLT5zdHlsZV9lbmQgPCBtLT5zX3RlbXAtPnN0eWxlX3N0YXJ0CisgICAgICAgICAgICB8fCAobS0+Y291bnRfcyAmJiBtLT5zX3RlbXAtPnN0eWxlX3N0YXJ0IDwgbS0+c1ttLT5jb3VudF9zIC0gMV0tPnN0eWxlX2VuZCkpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZtLT5zX3RlbXApOworICAgICAgICAgICAgbW92X3RleHRfY2xlYW51cChtKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKwogICAgICAgICB0c21iICs9IDI7CiAgICAgICAgIG0tPnNfdGVtcC0+c3R5bGVfZm9udElEID0gQVZfUkIxNih0c21iKTsKICAgICAgICAgdHNtYiArPSAyOwpAQCAtMzIxLDkgKzMzNCwyNCBAQAogCiBjb25zdCBzdGF0aWMgc2l6ZV90IGJveF9jb3VudCA9IEZGX0FSUkFZX0VMRU1TKGJveF90eXBlcyk7CiAKLXN0YXRpYyBpbnQgdGV4dF90b19hc3MoQVZCUHJpbnQgKmJ1ZiwgY29uc3QgY2hhciAqdGV4dCwgY29uc3QgY2hhciAqdGV4dF9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBNb3ZUZXh0Q29udGV4dCAqbSkKKy8vIFJldHVybiBieXRlIGxlbmd0aCBvZiB0aGUgVVRGLTggc2VxdWVuY2Ugc3RhcnRpbmcgYXQgdGV4dFswXS4gMCBvbiBlcnJvci4KK3N0YXRpYyBpbnQgZ2V0X3V0ZjhfbGVuZ3RoX2F0KGNvbnN0IGNoYXIgKnRleHQsIGNvbnN0IGNoYXIgKnRleHRfZW5kKQogeworICAgIGNvbnN0IGNoYXIgKnN0YXJ0ID0gdGV4dDsKKyAgICBpbnQgZXJyID0gMDsKKyAgICB1aW50MzJfdCBjOworICAgIEdFVF9VVEY4KGMsIHRleHQgPCB0ZXh0X2VuZCA/ICh1aW50OF90KSp0ZXh0KysgOiAoZXJyID0gMSwgMCksIGdvdG8gZXJyb3I7KTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHJldHVybiB0ZXh0IC0gc3RhcnQ7CitlcnJvcjoKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXh0X3RvX2FzcyhBVkJQcmludCAqYnVmLCBjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBjaGFyICp0ZXh0X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1vdlRleHRDb250ZXh0ICptID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBpbnQgaSA9IDA7CiAgICAgaW50IGogPSAwOwogICAgIGludCB0ZXh0X3BvcyA9IDA7CkBAIC0zMzcsNiArMzY1LDggQEAKICAgICB9CiAKICAgICB3aGlsZSAodGV4dCA8IHRleHRfZW5kKSB7CisgICAgICAgIGludCBsZW47CisKICAgICAgICAgaWYgKG0tPmJveF9mbGFncyAmIFNUWUxfQk9YKSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbS0+c3R5bGVfZW50cmllczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKG0tPnNbaV0tPnN0eWxlX2ZsYWcgJiYgdGV4dF9wb3MgPT0gbS0+c1tpXS0+c3R5bGVfZW5kKSB7CkBAIC0zODMsMTcgKzQxMywyNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3dpdGNoICgqdGV4dCkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgYXZfYnByaW50ZihidWYsICJcXE4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGJ1ZiwgKnRleHQsIDEpOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGxlbiA9IGdldF91dGY4X2xlbmd0aF9hdCh0ZXh0LCB0ZXh0X2VuZCk7CisgICAgICAgIGlmIChsZW4gPCAxKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgVVRGLTggYnl0ZSBpbiBzdWJ0aXRsZVxuIik7CisgICAgICAgICAgICBsZW4gPSAxOwogICAgICAgICB9Ci0gICAgICAgIHRleHQrKzsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCp0ZXh0KSB7CisgICAgICAgICAgICBjYXNlICdccic6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdcbic6CisgICAgICAgICAgICAgICAgYXZfYnByaW50ZihidWYsICJcXE4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKGJ1ZiwgKnRleHQsIDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGV4dCsrOworICAgICAgICB9CiAgICAgICAgIHRleHRfcG9zKys7CiAgICAgfQogCkBAIC00MjQsMTMgKzQ2MSwxNCBAQAogewogICAgIEFWU3VidGl0bGUgKnN1YiA9IGRhdGE7CiAgICAgTW92VGV4dENvbnRleHQgKm0gPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGludCByZXQsIHRzX3N0YXJ0LCB0c19lbmQ7CisgICAgaW50IHJldDsKICAgICBBVkJQcmludCBidWY7CiAgICAgY2hhciAqcHRyID0gYXZwa3QtPmRhdGE7CiAgICAgY2hhciAqZW5kOwogICAgIGludCB0ZXh0X2xlbmd0aCwgdHNtYl90eXBlLCByZXRfdHNtYjsKICAgICB1aW50NjRfdCB0c21iX3NpemU7CiAgICAgY29uc3QgdWludDhfdCAqdHNtYjsKKyAgICBzaXplX3QgaTsKIAogICAgIGlmICghcHRyIHx8IGF2cGt0LT5zaXplIDwgMikKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC00NTQsMTIgKzQ5Miw3IEBACiAgICAgZW5kID0gcHRyICsgRkZNSU4oMiArIHRleHRfbGVuZ3RoLCBhdnBrdC0+c2l6ZSk7CiAgICAgcHRyICs9IDI7CiAKLSAgICB0c19zdGFydCA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsMTAwfSk7Ci0gICAgdHNfZW5kICAgPSBhdl9yZXNjYWxlX3EoYXZwa3QtPnB0cyArIGF2cGt0LT5kdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLDEwMH0pOworICAgIG1vdl90ZXh0X2NsZWFudXAobSk7CiAKICAgICB0c21iX3NpemUgPSAwOwogICAgIG0tPnRyYWNrc2l6ZSA9IDIgKyB0ZXh0X2xlbmd0aDsKQEAgLTQ4NywxMCArNTIwLDE1IEBACiAgICAgICAgICAgICAgICAgbS0+c2l6ZV92YXIgPSA4OwogICAgICAgICAgICAgLy9zaXplX3ZhciBpcyBlcXVhbCB0byA4IG9yIDE2IGRlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiBib3gKIAotICAgICAgICAgICAgaWYgKG0tPnRyYWNrc2l6ZSArIHRzbWJfc2l6ZSA+IGF2cGt0LT5zaXplKQorICAgICAgICAgICAgaWYgKHRzbWJfc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ0c21iX3NpemUgaXMgMFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0c21iX3NpemUgPiBhdnBrdC0+c2l6ZSAtIG0tPnRyYWNrc2l6ZSkKICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBib3hfY291bnQ7IGkrKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJveF9jb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHRzbWJfdHlwZSA9PSBib3hfdHlwZXNbaV0udHlwZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobS0+dHJhY2tzaXplICsgbS0+c2l6ZV92YXIgKyBib3hfdHlwZXNbaV0uYmFzZV9zaXplID4gYXZwa3QtPnNpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTUwMSwxMiArNTM5LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtLT50cmFja3NpemUgPSBtLT50cmFja3NpemUgKyB0c21iX3NpemU7CiAgICAgICAgIH0KLSAgICAgICAgdGV4dF90b19hc3MoJmJ1ZiwgcHRyLCBlbmQsIG0pOworICAgICAgICB0ZXh0X3RvX2FzcygmYnVmLCBwdHIsIGVuZCwgYXZjdHgpOwogICAgICAgICBtb3ZfdGV4dF9jbGVhbnVwKG0pOwogICAgIH0gZWxzZQotICAgICAgICB0ZXh0X3RvX2FzcygmYnVmLCBwdHIsIGVuZCwgbSk7CisgICAgICAgIHRleHRfdG9fYXNzKCZidWYsIHB0ciwgZW5kLCBhdmN0eCk7CiAKLSAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3RfYnByaW50KHN1YiwgJmJ1ZiwgdHNfc3RhcnQsIHRzX2VuZCAtIHRzX3N0YXJ0KTsKKyAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3Qoc3ViLCBidWYuc3RyLCBtLT5yZWFkb3JkZXIrKywgMCwgTlVMTCwgTlVMTCk7CiAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtNTE4LDkgKzU1NiwxNyBAQAogewogICAgIE1vdlRleHRDb250ZXh0ICptID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBtb3ZfdGV4dF9jbGVhbnVwX2Z0YWIobSk7CisgICAgbW92X3RleHRfY2xlYW51cChtKTsKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbW92X3RleHRfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1vdlRleHRDb250ZXh0ICptID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpZiAoIShhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfUk9fRkxVU0hfTk9PUCkpCisgICAgICAgIG0tPnJlYWRvcmRlciA9IDA7Cit9CisKIEFWQ29kZWMgZmZfbW92dGV4dF9kZWNvZGVyID0gewogICAgIC5uYW1lICAgICAgICAgPSAibW92X3RleHQiLAogICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiM0dQUCBUaW1lZCBUZXh0IHN1YnRpdGxlIiksCkBAIC01MzAsNCArNTc2LDUgQEAKICAgICAuaW5pdCAgICAgICAgID0gbW92X3RleHRfaW5pdCwKICAgICAuZGVjb2RlICAgICAgID0gbW92X3RleHRfZGVjb2RlX2ZyYW1lLAogICAgIC5jbG9zZSAgICAgICAgPSBtb3ZfdGV4dF9kZWNvZGVfY2xvc2UsCisgICAgLmZsdXNoICAgICAgICA9IG1vdl90ZXh0X2ZsdXNoLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbW92dGV4dGVuYy5jIGIvbGliYXZjb2RlYy9tb3Z0ZXh0ZW5jLmMKaW5kZXggNmQ0MmQ1Zi4uYzE5ZWYzOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tb3Z0ZXh0ZW5jLmMKKysrIGIvbGliYXZjb2RlYy9tb3Z0ZXh0ZW5jLmMKQEAgLTU3LDYgKzU3LDggQEAKIH0gSGlsaWdodGNvbG9yQm94OwogCiB0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworCiAgICAgQVNTU3BsaXRDb250ZXh0ICphc3NfY3R4OwogICAgIEFWQlByaW50IGJ1ZmZlcjsKICAgICBTdHlsZUJveCAqKnN0eWxlX2F0dHJpYnV0ZXM7CkBAIC03MCw2ICs3Miw3IEBACiAgICAgdWludDhfdCBzdHlsZV9mb250c2l6ZTsKICAgICB1aW50MzJfdCBzdHlsZV9jb2xvcjsKICAgICB1aW50MTZfdCB0ZXh0X3BvczsKKyAgICB1aW50MTZfdCBieXRlX2NvdW50OwogfSBNb3ZUZXh0Q29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMTg3LDYgKzE5MCw3IEBACiAgICAgfTsKIAogICAgIE1vdlRleHRDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OwogCiAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gc2l6ZW9mIHRleHRfc2FtcGxlX2VudHJ5OwogICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwpAQCAtMjQ3LDYgKzI1MSw5IEBACiAgICAgICAgICAgICBzLT5zdHlsZV9hdHRyaWJ1dGVzX3RlbXAtPnN0eWxlX2ZsYWcgfD0gU1RZTEVfRkxBR19VTkRFUkxJTkU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXMtPnN0eWxlX2F0dHJpYnV0ZXNfdGVtcCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSWdub3JpbmcgdW5tYXRjaGVkIGNsb3NlIHRhZ1xuIik7CisgICAgICAgIHJldHVybjsKICAgICB9IGVsc2UgewogICAgICAgICBzLT5zdHlsZV9hdHRyaWJ1dGVzX3RlbXAtPnN0eWxlX2VuZCA9IEFWX1JCMTYoJnMtPnRleHRfcG9zKTsKICAgICAgICAgYXZfZHluYXJyYXlfYWRkKCZzLT5zdHlsZV9hdHRyaWJ1dGVzLCAmcy0+Y291bnQsIHMtPnN0eWxlX2F0dHJpYnV0ZXNfdGVtcCk7CkBAIC0yOTgsMTEgKzMwNSwzNCBAQAogICAgICAqLwogfQogCitzdGF0aWMgdWludDE2X3QgdXRmOF9zdHJsZW4oY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbikKK3sKKyAgICB1aW50MTZfdCBpID0gMCwgcmV0ID0gMDsKKyAgICB3aGlsZSAoaSA8IGxlbikgeworICAgICAgICBjaGFyIGMgPSB0ZXh0W2ldOworICAgICAgICBpZiAoKGMgJiAweDgwKSA9PSAwKQorICAgICAgICAgICAgaSArPSAxOworICAgICAgICBlbHNlIGlmICgoYyAmIDB4RTApID09IDB4QzApCisgICAgICAgICAgICBpICs9IDI7CisgICAgICAgIGVsc2UgaWYgKChjICYgMHhGMCkgPT0gMHhFMCkKKyAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgZWxzZSBpZiAoKGMgJiAweEY4KSA9PSAweEYwKQorICAgICAgICAgICAgaSArPSA0OworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0Kys7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKIHN0YXRpYyB2b2lkIG1vdl90ZXh0X3RleHRfY2Iodm9pZCAqcHJpdiwgY29uc3QgY2hhciAqdGV4dCwgaW50IGxlbikKIHsKKyAgICB1aW50MTZfdCB1dGY4X2xlbiA9IHV0Zjhfc3RybGVuKHRleHQsIGxlbik7CiAgICAgTW92VGV4dENvbnRleHQgKnMgPSBwcml2OwogICAgIGF2X2JwcmludF9hcHBlbmRfZGF0YSgmcy0+YnVmZmVyLCB0ZXh0LCBsZW4pOwotICAgIHMtPnRleHRfcG9zICs9IGxlbjsKKyAgICAvLyBJZiBpdCdzIG5vdCB1dGYtOCwganVzdCB1c2UgdGhlIGJ5dGUgbGVuZ3RoCisgICAgcy0+dGV4dF9wb3MgKz0gdXRmOF9sZW4gPyB1dGY4X2xlbiA6IGxlbjsKKyAgICBzLT5ieXRlX2NvdW50ICs9IGxlbjsKIH0KIAogc3RhdGljIHZvaWQgbW92X3RleHRfbmV3X2xpbmVfY2Iodm9pZCAqcHJpdiwgaW50IGZvcmNlZCkKQEAgLTMxMCw2ICszNDAsNyBAQAogICAgIE1vdlRleHRDb250ZXh0ICpzID0gcHJpdjsKICAgICBhdl9icHJpbnRfYXBwZW5kX2RhdGEoJnMtPmJ1ZmZlciwgIlxuIiwgMSk7CiAgICAgcy0+dGV4dF9wb3MgKz0gMTsKKyAgICBzLT5ieXRlX2NvdW50ICs9IDE7CiB9CiAKIHN0YXRpYyBjb25zdCBBU1NDb2Rlc0NhbGxiYWNrcyBtb3ZfdGV4dF9jYWxsYmFja3MgPSB7CkBAIC0zMjQsMzEgKzM1NSw0NiBAQAogewogICAgIE1vdlRleHRDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBBU1NEaWFsb2cgKmRpYWxvZzsKLSAgICBpbnQgaSwgbnVtLCBsZW5ndGg7CisgICAgaW50IGksIGxlbmd0aDsKICAgICBzaXplX3QgajsKIAorICAgIHMtPmJ5dGVfY291bnQgPSAwOwogICAgIHMtPnRleHRfcG9zID0gMDsKICAgICBzLT5jb3VudCA9IDA7CiAgICAgcy0+Ym94X2ZsYWdzID0gMDsKICAgICBzLT5zdHlsZV9lbnRyaWVzID0gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgc3ViLT5udW1fcmVjdHM7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICphc3MgPSBzdWItPnJlY3RzW2ldLT5hc3M7CiAKICAgICAgICAgaWYgKHN1Yi0+cmVjdHNbaV0tPnR5cGUgIT0gU1VCVElUTEVfQVNTKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgU1VCVElUTEVfQVNTIHR5cGUgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogICAgICAgICB9CiAKLSAgICAgICAgZGlhbG9nID0gZmZfYXNzX3NwbGl0X2RpYWxvZyhzLT5hc3NfY3R4LCBzdWItPnJlY3RzW2ldLT5hc3MsIDAsICZudW0pOwotICAgICAgICBmb3IgKDsgZGlhbG9nICYmIG51bS0tOyBkaWFsb2crKykgeworI2lmIEZGX0FQSV9BU1NfVElNSU5HCisgICAgICAgIGlmICghc3RybmNtcChhc3MsICJEaWFsb2d1ZTogIiwgMTApKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgZGlhbG9nID0gZmZfYXNzX3NwbGl0X2RpYWxvZyhzLT5hc3NfY3R4LCBhc3MsIDAsICZudW0pOworICAgICAgICAgICAgZm9yICg7IGRpYWxvZyAmJiBudW0tLTsgZGlhbG9nKyspIHsKKyAgICAgICAgICAgICAgICBmZl9hc3Nfc3BsaXRfb3ZlcnJpZGVfY29kZXMoJm1vdl90ZXh0X2NhbGxiYWNrcywgcywgZGlhbG9nLT50ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICAgICAgZGlhbG9nID0gZmZfYXNzX3NwbGl0X2RpYWxvZzIocy0+YXNzX2N0eCwgYXNzKTsKKyAgICAgICAgICAgIGlmICghZGlhbG9nKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBmZl9hc3Nfc3BsaXRfb3ZlcnJpZGVfY29kZXMoJm1vdl90ZXh0X2NhbGxiYWNrcywgcywgZGlhbG9nLT50ZXh0KTsKKyAgICAgICAgICAgIGZmX2Fzc19mcmVlX2RpYWxvZygmZGlhbG9nKTsKKyNpZiBGRl9BUElfQVNTX1RJTUlORwogICAgICAgICB9CisjZW5kaWYKIAogICAgICAgICBmb3IgKGogPSAwOyBqIDwgYm94X2NvdW50OyBqKyspIHsKICAgICAgICAgICAgIGJveF90eXBlc1tqXS5lbmNvZGUocywgYm94X3R5cGVzW2pdLnR5cGUpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgQVZfV0IxNihidWYsIHMtPnRleHRfcG9zKTsKKyAgICBBVl9XQjE2KGJ1Ziwgcy0+Ynl0ZV9jb3VudCk7CiAgICAgYnVmICs9IDI7CiAKICAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmcy0+YnVmZmVyKSkgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcDNfaGVhZGVyX2RlY29tcHJlc3NfYnNmLmMgYi9saWJhdmNvZGVjL21wM19oZWFkZXJfZGVjb21wcmVzc19ic2YuYwppbmRleCA5NWMwYjViLi4yOTQ4NTg5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wM19oZWFkZXJfZGVjb21wcmVzc19ic2YuYworKysgYi9saWJhdmNvZGVjL21wM19oZWFkZXJfZGVjb21wcmVzc19ic2YuYwpAQCAtMjEsMzIgKzIxLDQzIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAjaW5jbHVkZSAibXBlZ2F1ZGlvZGVjaGVhZGVyLmgiCiAjaW5jbHVkZSAibXBlZ2F1ZGlvZGF0YS5oIgogCiAKLXN0YXRpYyBpbnQgbXAzX2hlYWRlcl9kZWNvbXByZXNzKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSl7CitzdGF0aWMgaW50IG1wM19oZWFkZXJfZGVjb21wcmVzcyhBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKm91dCkKK3sKKyAgICBBVlBhY2tldCAqaW47CiAgICAgdWludDMyX3QgaGVhZGVyOwotICAgIGludCBzYW1wbGVfcmF0ZT0gYXZjdHgtPnNhbXBsZV9yYXRlOworICAgIGludCBzYW1wbGVfcmF0ZT0gY3R4LT5wYXJfaW4tPnNhbXBsZV9yYXRlOwogICAgIGludCBzYW1wbGVfcmF0ZV9pbmRleD0wOwotICAgIGludCBsc2YsIG1wZWcyNSwgYml0cmF0ZV9pbmRleCwgZnJhbWVfc2l6ZTsKKyAgICBpbnQgbHNmLCBtcGVnMjUsIGJpdHJhdGVfaW5kZXgsIGZyYW1lX3NpemUsIHJldDsKKyAgICB1aW50OF90ICpidWY7CisgICAgaW50IGJ1Zl9zaXplOworCisgICAgcmV0ID0gZmZfYnNmX2dldF9wYWNrZXQoY3R4LCAmaW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnVmICAgICAgPSBpbi0+ZGF0YTsKKyAgICBidWZfc2l6ZSA9IGluLT5zaXplOwogCiAgICAgaGVhZGVyID0gQVZfUkIzMihidWYpOwogICAgIGlmKGZmX21wYV9jaGVja19oZWFkZXIoaGVhZGVyKSA+PSAwKXsKLSAgICAgICAgKnBvdXRidWY9ICh1aW50OF90ICopIGJ1ZjsKLSAgICAgICAgKnBvdXRidWZfc2l6ZT0gYnVmX3NpemU7CisgICAgICAgIGF2X3BhY2tldF9tb3ZlX3JlZihvdXQsIGluKTsKKyAgICAgICAgYXZfcGFja2V0X2ZyZWUoJmluKTsKIAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBpZihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgIT0gMTUgfHwgc3RyY21wKGF2Y3R4LT5leHRyYWRhdGEsICJGRkNNUDMgMC4wIikpewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4dHJhZGF0YSBpbnZhbGlkICVkXG4iLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgaWYoY3R4LT5wYXJfaW4tPmV4dHJhZGF0YV9zaXplICE9IDE1IHx8IHN0cmNtcChjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhLCAiRkZDTVAzIDAuMCIpKXsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXh0cmFkYXRhIGludmFsaWQgJWRcbiIsIGN0eC0+cGFyX2luLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAotICAgIGhlYWRlcj0gQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhKzExKSAmIE1QM19NQVNLOworICAgIGhlYWRlcj0gQVZfUkIzMihjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhKzExKSAmIE1QM19NQVNLOwogCiAgICAgbHNmICAgICA9IHNhbXBsZV9yYXRlIDwgKDI0MDAwKzMyMDAwKS8yOwogICAgIG1wZWcyNSAgPSBzYW1wbGVfcmF0ZSA8ICgxMjAwMCsxNjAwMCkvMjsKQEAgLTYyLDIwICs3MywyNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmKGJpdHJhdGVfaW5kZXggPT0gMzApewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBmaW5kIGJpdHJhdGVfaW5kZXguXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZmluZCBiaXRyYXRlX2luZGV4LlxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAogICAgIGhlYWRlciB8PSAoYml0cmF0ZV9pbmRleCYxKTw8OTsKICAgICBoZWFkZXIgfD0gKGJpdHJhdGVfaW5kZXg+PjEpPDwxMjsKICAgICBoZWFkZXIgfD0gKGZyYW1lX3NpemUgPT0gYnVmX3NpemUgKyA0KTw8MTY7IC8vRklYTUUgYWN0dWFsbHkgc2V0IGEgY29ycmVjdCBjcmMgaW5zdGVhZCBvZiAwCiAKLSAgICAqcG91dGJ1Zl9zaXplPSBmcmFtZV9zaXplOwotICAgICpwb3V0YnVmPSBhdl9tYWxsb2MoZnJhbWVfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIG1lbWNweSgqcG91dGJ1ZiArIGZyYW1lX3NpemUgLSBidWZfc2l6ZSwgYnVmLCBidWZfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIHJldCA9IGF2X25ld19wYWNrZXQob3V0LCBmcmFtZV9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIHJldCA9IGF2X3BhY2tldF9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIG1lbWNweShvdXQtPmRhdGEgKyBmcmFtZV9zaXplIC0gYnVmX3NpemUsIGJ1ZiwgYnVmX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKIAotICAgIGlmKGF2Y3R4LT5jaGFubmVscz09Mil7Ci0gICAgICAgIHVpbnQ4X3QgKnA9ICpwb3V0YnVmICsgZnJhbWVfc2l6ZSAtIGJ1Zl9zaXplOworICAgIGlmKGN0eC0+cGFyX2luLT5jaGFubmVscz09Mil7CisgICAgICAgIHVpbnQ4X3QgKnA9IG91dC0+ZGF0YSArIGZyYW1lX3NpemUgLSBidWZfc2l6ZTsKICAgICAgICAgaWYobHNmKXsKICAgICAgICAgICAgIEZGU1dBUChpbnQsIHBbMV0sIHBbMl0pOwogICAgICAgICAgICAgaGVhZGVyIHw9IChwWzFdICYgMHhDMCk+PjI7CkBAIC04NiwxMiArMTA0LDIxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBVl9XQjMyKCpwb3V0YnVmLCBoZWFkZXIpOworICAgIEFWX1dCMzIob3V0LT5kYXRhLCBoZWFkZXIpOwogCi0gICAgcmV0dXJuIDE7CisgICAgcmV0ID0gMDsKKworZmFpbDoKKyAgICBhdl9wYWNrZXRfZnJlZSgmaW4pOworICAgIHJldHVybiByZXQ7CiB9CiAKLUFWQml0U3RyZWFtRmlsdGVyIGZmX21wM19oZWFkZXJfZGVjb21wcmVzc19ic2Y9ewotICAgIC5uYW1lICAgPSAibXAzZGVjb21wIiwKLSAgICAuZmlsdGVyID0gbXAzX2hlYWRlcl9kZWNvbXByZXNzLAorc3RhdGljIGNvbnN0IGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkc1tdID0geworICAgIEFWX0NPREVDX0lEX01QMywgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX21wM19oZWFkZXJfZGVjb21wcmVzc19ic2YgPSB7CisgICAgLm5hbWUgICAgICA9ICJtcDNkZWNvbXAiLAorICAgIC5maWx0ZXIgICAgPSBtcDNfaGVhZGVyX2RlY29tcHJlc3MsCisgICAgLmNvZGVjX2lkcyA9IGNvZGVjX2lkcywKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wYy5jIGIvbGliYXZjb2RlYy9tcGMuYwppbmRleCA3YWYzMGJkLi42Y2Y5YjlkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wYy5jCisrKyBiL2xpYmF2Y29kZWMvbXBjLmMKQEAgLTI4LDcgKzI4LDYgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAibXBlZ2F1ZGlvZHNwLmgiCiAjaW5jbHVkZSAibXBlZ2F1ZGlvLmgiCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBjLmggYi9saWJhdmNvZGVjL21wYy5oCmluZGV4IDRjYjg1NzQuLmRmNDYyYWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBjLmgKKysrIGIvbGliYXZjb2RlYy9tcGMuaApAQCAtMzAsOSArMzAsOSBAQAogI2RlZmluZSBBVkNPREVDX01QQ19ICiAKICNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiYnN3YXBkc3AuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgIm1wZWdhdWRpby5oIgogI2luY2x1ZGUgIm1wZWdhdWRpb2RzcC5oIgogCkBAIC01Miw3ICs1Miw2IEBACiB0eXBlZGVmIHN0cnVjdCBNUENDb250ZXh0IHsKICAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKICAgICBNUEFEU1BDb250ZXh0IG1wYWRzcDsKLSAgICBHZXRCaXRDb250ZXh0IGdiOwogICAgIGludCBJUywgTVNTLCBnYXBsZXNzOwogICAgIGludCBsYXN0ZnJhbWVsZW47CiAgICAgaW50IG1heGJhbmRzLCBsYXN0X21heF9iYW5kOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGM3LmMgYi9saWJhdmNvZGVjL21wYzcuYwppbmRleCBkMzhiMjJhLi5lMDlmMWI2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wYzcuYworKysgYi9saWJhdmNvZGVjL21wYzcuYwpAQCAtNDcsNyArNDcsNyBAQAogCiBzdGF0aWMgYXZfY29sZCBpbnQgbXBjN19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqIGF2Y3R4KQogewotICAgIGludCBpLCBqOworICAgIGludCBpLCBqLCByZXQ7CiAgICAgTVBDQ29udGV4dCAqYyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgR2V0Qml0Q29udGV4dCBnYjsKICAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGJ1ZiwgWzE2XSk7CkBAIC02Niw3ICs2Niw3IEBACiAKICAgICBpZihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCAxNil7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNtYWxsIGV4dHJhZGF0YSBzaXplICglaSkhXG4iLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBtZW1zZXQoYy0+b2xkRFNDRiwgMCwgc2l6ZW9mKGMtPm9sZERTQ0YpKTsKICAgICBhdl9sZmdfaW5pdCgmYy0+cm5kLCAweERFQURCRUVGKTsKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBjLT5tYXhiYW5kcyA9IGdldF9iaXRzKCZnYiwgNik7CiAgICAgaWYoYy0+bWF4YmFuZHMgPj0gQkFORFMpewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBtYW55IGJhbmRzOiAlaVxuIiwgYy0+bWF4YmFuZHMpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDg4KTsKICAgICBjLT5nYXBsZXNzID0gZ2V0X2JpdHMxKCZnYik7CkBAIC05NywzNyArOTcsMzcgQEAKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkluaXRpbmcgVkxDXG4iKTsKICAgICBzY2ZpX3ZsYy50YWJsZSA9IHNjZmlfdGFibGU7CiAgICAgc2NmaV92bGMudGFibGVfYWxsb2NhdGVkID0gMSA8PCBNUEM3X1NDRklfQklUUzsKLSAgICBpZihpbml0X3ZsYygmc2NmaV92bGMsIE1QQzdfU0NGSV9CSVRTLCBNUEM3X1NDRklfU0laRSwKKyAgICBpZiAoKHJldCA9IGluaXRfdmxjKCZzY2ZpX3ZsYywgTVBDN19TQ0ZJX0JJVFMsIE1QQzdfU0NGSV9TSVpFLAogICAgICAgICAgICAgICAgICZtcGM3X3NjZmlbMV0sIDIsIDEsCi0gICAgICAgICAgICAgICAgJm1wYzdfc2NmaVswXSwgMiwgMSwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpKXsKKyAgICAgICAgICAgICAgICAmbXBjN19zY2ZpWzBdLCAyLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQykpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGluaXQgU0NGSSBWTENcbiIpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGRzY2ZfdmxjLnRhYmxlID0gZHNjZl90YWJsZTsKICAgICBkc2NmX3ZsYy50YWJsZV9hbGxvY2F0ZWQgPSAxIDw8IE1QQzdfRFNDRl9CSVRTOwotICAgIGlmKGluaXRfdmxjKCZkc2NmX3ZsYywgTVBDN19EU0NGX0JJVFMsIE1QQzdfRFNDRl9TSVpFLAorICAgIGlmICgocmV0ID0gaW5pdF92bGMoJmRzY2ZfdmxjLCBNUEM3X0RTQ0ZfQklUUywgTVBDN19EU0NGX1NJWkUsCiAgICAgICAgICAgICAgICAgJm1wYzdfZHNjZlsxXSwgMiwgMSwKLSAgICAgICAgICAgICAgICAmbXBjN19kc2NmWzBdLCAyLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQykpeworICAgICAgICAgICAgICAgICZtcGM3X2RzY2ZbMF0sIDIsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKSkpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgaW5pdCBEU0NGIFZMQ1xuIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgaGRyX3ZsYy50YWJsZSA9IGhkcl90YWJsZTsKICAgICBoZHJfdmxjLnRhYmxlX2FsbG9jYXRlZCA9IDEgPDwgTVBDN19IRFJfQklUUzsKLSAgICBpZihpbml0X3ZsYygmaGRyX3ZsYywgTVBDN19IRFJfQklUUywgTVBDN19IRFJfU0laRSwKKyAgICBpZiAoKHJldCA9IGluaXRfdmxjKCZoZHJfdmxjLCBNUEM3X0hEUl9CSVRTLCBNUEM3X0hEUl9TSVpFLAogICAgICAgICAgICAgICAgICZtcGM3X2hkclsxXSwgMiwgMSwKLSAgICAgICAgICAgICAgICAmbXBjN19oZHJbMF0sIDIsIDEsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKSl7CisgICAgICAgICAgICAgICAgJm1wYzdfaGRyWzBdLCAyLCAxLCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQykpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGluaXQgSERSIFZMQ1xuIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgZm9yKGkgPSAwOyBpIDwgTVBDN19RVUFOVF9WTENfVEFCTEVTOyBpKyspewogICAgICAgICBmb3IoaiA9IDA7IGogPCAyOyBqKyspewogICAgICAgICAgICAgcXVhbnRfdmxjW2ldW2pdLnRhYmxlID0gJnF1YW50X3RhYmxlc1txdWFudF9vZmZzZXRzW2kqMiArIGpdXTsKICAgICAgICAgICAgIHF1YW50X3ZsY1tpXVtqXS50YWJsZV9hbGxvY2F0ZWQgPSBxdWFudF9vZmZzZXRzW2kqMiArIGogKyAxXSAtIHF1YW50X29mZnNldHNbaSoyICsgal07Ci0gICAgICAgICAgICBpZihpbml0X3ZsYygmcXVhbnRfdmxjW2ldW2pdLCA5LCBtcGM3X3F1YW50X3ZsY19zaXplc1tpXSwKKyAgICAgICAgICAgIGlmICgocmV0ID0gaW5pdF92bGMoJnF1YW50X3ZsY1tpXVtqXSwgOSwgbXBjN19xdWFudF92bGNfc2l6ZXNbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAmbXBjN19xdWFudF92bGNbaV1bal1bMV0sIDQsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbXBjN19xdWFudF92bGNbaV1bal1bMF0sIDQsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKSl7CisgICAgICAgICAgICAgICAgICAgICAgICAmbXBjN19xdWFudF92bGNbaV1bal1bMF0sIDQsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKSkpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBpbml0IFFVQU5UIFZMQyAlaSwlaVxuIixpLGopOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjMxLDcgKzIzMSw4IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYy0+YmRzcC5ic3dhcF9idWYoKHVpbnQzMl90ICopIGMtPmJpdHMsIChjb25zdCB1aW50MzJfdCAqKSBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUgPj4gMik7Ci0gICAgaW5pdF9nZXRfYml0cygmZ2IsIGMtPmJpdHMsIGJ1Zl9zaXplICogOCk7CisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGMtPmJpdHMsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogICAgIHNraXBfYml0c19sb25nKCZnYiwgc2tpcCk7CiAKICAgICAvKiByZWFkIHN1YmJhbmQgaW5kZXhlcyAqLwpAQCAtMjk4LDcgKzI5OSw3IEBACiAgICAgYml0c19hdmFpbCA9IGJ1Zl9zaXplICogODsKICAgICBpZiAoIWxhc3RfZnJhbWUgJiYgKChiaXRzX2F2YWlsIDwgYml0c191c2VkKSB8fCAoYml0c191c2VkICsgMzIgPD0gYml0c19hdmFpbCkpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZGVjb2RpbmcgZnJhbWU6IHVzZWQgJWkgb2YgJWkgYml0c1xuIiwgYml0c191c2VkLCBiaXRzX2F2YWlsKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAgICAgaWYoYy0+ZnJhbWVzX3RvX3NraXApewogICAgICAgICBjLT5mcmFtZXNfdG9fc2tpcC0tOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGM4LmMgYi9saWJhdmNvZGVjL21wYzguYwppbmRleCBhOGZlYjZjLi4zYmUyZjc5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wYzguYworKysgYi9saWJhdmNvZGVjL21wYzguYwpAQCAtMjUwLDE4ICsyNTAsMTUgQEAKICAgICBpbnQgbWF4YmFuZCwga2V5ZnJhbWU7CiAgICAgaW50IGxhc3RbMl07CiAKLSAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLwotICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gTVBDX0ZSQU1FX1NJWkU7Ci0gICAgaWYgKChyZXMgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJlczsKLQogICAgIGtleWZyYW1lID0gYy0+Y3VyX2ZyYW1lID09IDA7CiAKICAgICBpZihrZXlmcmFtZSl7CiAgICAgICAgIG1lbXNldChjLT5RLCAwLCBzaXplb2YoYy0+USkpOwogICAgICAgICBjLT5sYXN0X2JpdHNfdXNlZCA9IDA7CiAgICAgfQotICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGJ1ZiwgYnVmX3NpemUgKiA4KTsKKyAgICBpZiAoKHJlcyA9IGluaXRfZ2V0X2JpdHM4KGdiLCBidWYsIGJ1Zl9zaXplKSkgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCiAgICAgc2tpcF9iaXRzKGdiLCBjLT5sYXN0X2JpdHNfdXNlZCAmIDcpOwogCiAgICAgaWYoa2V5ZnJhbWUpCkBAIC0yNzEsNiArMjY4LDExIEBACiAgICAgICAgIGlmKG1heGJhbmQgPiAzMikgbWF4YmFuZCAtPSAzMzsKICAgICB9CiAKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CisgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKwogICAgIGlmKG1heGJhbmQgPiBjLT5tYXhiYW5kcyArIDEpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtYXhiYW5kICVkIHRvbyBsYXJnZVxuIixtYXhiYW5kKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC00MDgsNiArNDEwLDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IE1QQ19GUkFNRV9TSVpFOworICAgIGlmICgocmVzID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKICAgICBmZl9tcGNfZGVxdWFudGl6ZV9hbmRfc3ludGgoYywgbWF4YmFuZCAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpOwpAQCAtNDE1LDEwICs0MjEsMTQgQEAKICAgICBjLT5jdXJfZnJhbWUrKzsKIAogICAgIGMtPmxhc3RfYml0c191c2VkID0gZ2V0X2JpdHNfY291bnQoZ2IpOwotICAgIGlmKGdldF9iaXRzX2xlZnQoZ2IpIDwgOCkgLy8gd2UgaGF2ZSBvbmx5IHBhZGRpbmcgbGVmdAotICAgICAgICBjLT5sYXN0X2JpdHNfdXNlZCA9IGJ1Zl9zaXplIDw8IDM7CiAgICAgaWYoYy0+Y3VyX2ZyYW1lID49IGMtPmZyYW1lcykKICAgICAgICAgYy0+Y3VyX2ZyYW1lID0gMDsKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT3ZlcnJlYWQgJWRcbiIsIC1nZXRfYml0c19sZWZ0KGdiKSk7CisgICAgICAgIGMtPmxhc3RfYml0c191c2VkID0gYnVmX3NpemUgPDwgMzsKKyAgICB9IGVsc2UgaWYgKGMtPmN1cl9mcmFtZSA9PSAwICYmIGdldF9iaXRzX2xlZnQoZ2IpIDwgOCkgey8vIHdlIGhhdmUgb25seSBwYWRkaW5nIGxlZnQKKyAgICAgICAgYy0+bGFzdF9iaXRzX3VzZWQgPSBidWZfc2l6ZSA8PCAzOworICAgIH0KIAogICAgICpnb3RfZnJhbWVfcHRyID0gMTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnMTIuYyBiL2xpYmF2Y29kZWMvbXBlZzEyLmMKaW5kZXggZThhNDA0OC4uYWI2YzE5YyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnMTIuYworKysgYi9saWJhdmNvZGVjL21wZWcxMi5jCkBAIC0zOSw3ICszOSw2IEBACiAjaW5jbHVkZSAibXBlZzEyZGF0YS5oIgogI2luY2x1ZGUgIm1wZWd2aWRlb2RhdGEuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCi0jaW5jbHVkZSAidmRwYXVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKIAogdWludDhfdCBmZl9tcGVnMTJfc3RhdGljX3JsX3RhYmxlX3N0b3JlWzJdWzJdWzIqTUFYX1JVTiArIE1BWF9MRVZFTCArIDNdOwpAQCAtNjgsMjAgKzY3LDEzIEBACiAgICAgeyAyLCA1IH0sIC8vIDB4MUUgTUJfUVVBTlR8TUJfRk9SfE1CX0JBQ0t8TUJfUEFUCiB9OwogCi0jZGVmaW5lIElOSVRfMkRfVkxDX1JMKHJsLCBzdGF0aWNfc2l6ZSlcCi17XAotICAgIHN0YXRpYyBSTF9WTENfRUxFTSBybF92bGNfdGFibGVbc3RhdGljX3NpemVdO1wKLSAgICBybC5ybF92bGNbMF0gPSBybF92bGNfdGFibGU7XAotICAgIGluaXRfMmRfdmxjX3JsKCZybCwgc3RhdGljX3NpemUpO1wKLX0KLQotc3RhdGljIGF2X2NvbGQgdm9pZCBpbml0XzJkX3ZsY19ybChSTFRhYmxlICpybCwgdW5zaWduZWQgc3RhdGljX3NpemUpCithdl9jb2xkIHZvaWQgZmZfaW5pdF8yZF92bGNfcmwoUkxUYWJsZSAqcmwsIHVuc2lnbmVkIHN0YXRpY19zaXplLCBpbnQgZmxhZ3MpCiB7CiAgICAgaW50IGk7CiAgICAgVkxDX1RZUEUgdGFibGVbNjgwXVsyXSA9IHt7MH19OwogICAgIFZMQyB2bGMgPSB7IC50YWJsZSA9IHRhYmxlLCAudGFibGVfYWxsb2NhdGVkID0gc3RhdGljX3NpemUgfTsKICAgICBhdl9hc3NlcnQwKHN0YXRpY19zaXplIDw9IEZGX0FSUkFZX0VMRU1TKHRhYmxlKSk7Ci0gICAgaW5pdF92bGMoJnZsYywgVEVYX1ZMQ19CSVRTLCBybC0+biArIDIsICZybC0+dGFibGVfdmxjWzBdWzFdLCA0LCAyLCAmcmwtPnRhYmxlX3ZsY1swXVswXSwgNCwgMiwgSU5JVF9WTENfVVNFX05FV19TVEFUSUMpOworICAgIGluaXRfdmxjKCZ2bGMsIFRFWF9WTENfQklUUywgcmwtPm4gKyAyLCAmcmwtPnRhYmxlX3ZsY1swXVsxXSwgNCwgMiwgJnJsLT50YWJsZV92bGNbMF1bMF0sIDQsIDIsIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIHwgZmxhZ3MpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHZsYy50YWJsZV9zaXplOyBpKyspIHsKICAgICAgICAgaW50IGNvZGUgPSB2bGMudGFibGVbaV1bMF07CkBAIC0xNzQsOCArMTY2LDggQEAKICAgICAgICAgZmZfcmxfaW5pdCgmZmZfcmxfbXBlZzEsIGZmX21wZWcxMl9zdGF0aWNfcmxfdGFibGVfc3RvcmVbMF0pOwogICAgICAgICBmZl9ybF9pbml0KCZmZl9ybF9tcGVnMiwgZmZfbXBlZzEyX3N0YXRpY19ybF90YWJsZV9zdG9yZVsxXSk7CiAKLSAgICAgICAgSU5JVF8yRF9WTENfUkwoZmZfcmxfbXBlZzEsIDY4MCk7Ci0gICAgICAgIElOSVRfMkRfVkxDX1JMKGZmX3JsX21wZWcyLCA2NzQpOworICAgICAgICBJTklUXzJEX1ZMQ19STChmZl9ybF9tcGVnMSwgNjgwLCAwKTsKKyAgICAgICAgSU5JVF8yRF9WTENfUkwoZmZfcmxfbXBlZzIsIDY3NCwgMCk7CiAgICAgfQogfQogCkBAIC0yNDMsMyArMjM1LDk4IEBACiAgICAgcmV0dXJuIEVORF9OT1RfRk9VTkQ7CiB9CiAKKyNkZWZpbmUgTUFYX0lOREVYICg2NCAtIDEpCisKK2ludCBmZl9tcGVnMV9kZWNvZGVfYmxvY2tfaW50cmEoR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpxdWFudF9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IHNjYW50YWJsZSwgaW50IGxhc3RfZGNbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgaW5kZXgsIGludCBxc2NhbGUpCit7CisgICAgaW50IGRjLCBkaWZmLCBpID0gMCwgY29tcG9uZW50OworICAgIFJMVGFibGUgKnJsID0gJmZmX3JsX21wZWcxOworCisgICAgLyogREMgY29lZmZpY2llbnQgKi8KKyAgICBjb21wb25lbnQgPSBpbmRleCA8PSAzID8gMCA6IGluZGV4IC0gNCArIDE7CisKKyAgICBkaWZmID0gZGVjb2RlX2RjKGdiLCBjb21wb25lbnQpOworICAgIGlmIChkaWZmID49IDB4ZmZmZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBkYyAgPSBsYXN0X2RjW2NvbXBvbmVudF07CisgICAgZGMgKz0gZGlmZjsKKyAgICBsYXN0X2RjW2NvbXBvbmVudF0gPSBkYzsKKworICAgIGJsb2NrWzBdID0gZGMgKiBxdWFudF9tYXRyaXhbMF07CisKKyAgICB7CisgICAgICAgIE9QRU5fUkVBREVSKHJlLCBnYik7CisgICAgICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOworICAgICAgICBpZiAoKChpbnQzMl90KUdFVF9DQUNIRShyZSwgZ2IpKSA8PSAoaW50MzJfdCkweEJGRkZGRkZGKQorICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgLyogbm93IHF1YW50aWZ5ICYgZW5jb2RlIEFDIGNvZWZmaWNpZW50cyAqLworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgaW50IGxldmVsLCBydW4sIGo7CisKKyAgICAgICAgICAgIEdFVF9STF9WTEMobGV2ZWwsIHJ1biwgcmUsIGdiLCBybC0+cmxfdmxjWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBURVhfVkxDX0JJVFMsIDIsIDApOworCisgICAgICAgICAgICBpZiAobGV2ZWwgIT0gMCkgeworICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGlmIChpID4gTUFYX0lOREVYKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGogPSBzY2FudGFibGVbaV07CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDQ7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBTSE9XX1NCSVRTKHJlLCBnYiwgMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNIT1dfU0JJVFMocmUsIGdiLCAxKTsKKyAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsIGdiLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZXNjYXBlICovCisgICAgICAgICAgICAgICAgcnVuID0gU0hPV19VQklUUyhyZSwgZ2IsIDYpICsgMTsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDYpOworICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOworICAgICAgICAgICAgICAgIGxldmVsID0gU0hPV19TQklUUyhyZSwgZ2IsIDgpOworICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgZ2IsIDgpOworCisgICAgICAgICAgICAgICAgaWYgKGxldmVsID09IC0xMjgpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1VCSVRTKHJlLCBnYiwgOCkgLSAyNTY7CisgICAgICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgZ2IsIDgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfVUJJVFMocmUsIGdiLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgOCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaSArPSBydW47CisgICAgICAgICAgICAgICAgaWYgKGkgPiBNQVhfSU5ERVgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gLWxldmVsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiA0OworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAtIDEpIHwgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJsb2NrW2pdID0gbGV2ZWw7CisgICAgICAgICAgICBpZiAoKChpbnQzMl90KUdFVF9DQUNIRShyZSwgZ2IpKSA8PSAoaW50MzJfdCkweEJGRkZGRkZGKQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgZ2IpOworICAgICAgICB9CitlbmQ6CisgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCBnYiwgMik7CisgICAgICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworICAgIH0KKworICAgIGlmIChpID4gTUFYX0lOREVYKQorICAgICAgICBpID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHJldHVybiBpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnMTIuaCBiL2xpYmF2Y29kZWMvbXBlZzEyLmgKaW5kZXggMTZjYTE5NS4uMWVjOTlmMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnMTIuaAorKysgYi9saWJhdmNvZGVjL21wZWcxMi5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QRUcxLzIgY29tbW9uIGNvZGUKKyAqIE1QRUctMS8yIGNvbW1vbiBjb2RlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KQEAgLTI5LDYgKzI5LDE1IEBACiAKIHZvaWQgZmZfbXBlZzEyX2NvbW1vbl9pbml0KE1wZWdFbmNDb250ZXh0ICpzKTsKIAorI2RlZmluZSBJTklUXzJEX1ZMQ19STChybCwgc3RhdGljX3NpemUsIGZsYWdzKVwKK3tcCisgICAgc3RhdGljIFJMX1ZMQ19FTEVNIHJsX3ZsY190YWJsZVtzdGF0aWNfc2l6ZV07XAorICAgIHJsLnJsX3ZsY1swXSA9IHJsX3ZsY190YWJsZTtcCisgICAgZmZfaW5pdF8yZF92bGNfcmwoJnJsLCBzdGF0aWNfc2l6ZSwgZmxhZ3MpO1wKK30KKwordm9pZCBmZl9pbml0XzJkX3ZsY19ybChSTFRhYmxlICpybCwgdW5zaWduZWQgc3RhdGljX3NpemUsIGludCBmbGFncyk7CisKIHN0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9kYyhHZXRCaXRDb250ZXh0ICpnYiwgaW50IGNvbXBvbmVudCkKIHsKICAgICBpbnQgY29kZSwgZGlmZjsKQEAgLTUwLDcgKzU5LDExIEBACiAgICAgcmV0dXJuIGRpZmY7CiB9CiAKLWludCBmZl9tcGVnMV9kZWNvZGVfYmxvY2tfaW50cmEoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgKmJsb2NrLCBpbnQgbik7CitpbnQgZmZfbXBlZzFfZGVjb2RlX2Jsb2NrX2ludHJhKEdldEJpdENvbnRleHQgKmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqcXVhbnRfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBzY2FudGFibGUsIGludCBsYXN0X2RjWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IGluZGV4LCBpbnQgcXNjYWxlKTsKKwogdm9pZCBmZl9tcGVnMV9jbGVhbl9idWZmZXJzKE1wZWdFbmNDb250ZXh0ICpzKTsKIGludCBmZl9tcGVnMV9maW5kX2ZyYW1lX2VuZChQYXJzZUNvbnRleHQgKnBjLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgQVZDb2RlY1BhcnNlckNvbnRleHQgKnMpOwogCkBAIC02MCw0ICs3Myw4IEBACiB2b2lkIGZmX21wZWcxX2VuY29kZV9pbml0KE1wZWdFbmNDb250ZXh0ICpzKTsKIHZvaWQgZmZfbXBlZzFfZW5jb2RlX3NsaWNlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqcyk7CiAKK3ZvaWQgZmZfbXBlZzEyX2ZpbmRfYmVzdF9mcmFtZV9yYXRlKEFWUmF0aW9uYWwgZnJhbWVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29kZSwgaW50ICpleHRfbiwgaW50ICpleHRfZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub25zdGFuZGFyZCk7CisKICNlbmRpZiAvKiBBVkNPREVDX01QRUcxMl9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWcxMmRhdGEuYyBiL2xpYmF2Y29kZWMvbXBlZzEyZGF0YS5jCmluZGV4IGU4YzRhNWQuLjRkYTk2ZDcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZzEyZGF0YS5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZzEyZGF0YS5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QRUcxLzIgdGFibGVzCisgKiBNUEVHLTEvMiB0YWJsZXMKICAqIGNvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAogICogY29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIE1QRUcxLzIgdGFibGVzLgorICogTVBFRy0xLzIgdGFibGVzLgogICovCiAKICNpbmNsdWRlICJtcGVnMTJkYXRhLmgiCkBAIC0zMDUsMjYgKzMwNSw2IEBACiB7IDB4YywgMTAgfSwKIH07CiAKLWNvbnN0IEFWUmF0aW9uYWwgZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiWzE2XSA9IHsKLSAgICB7ICAgIDAsICAgIDB9LAotICAgIHsyNDAwMCwgMTAwMX0sCi0gICAgeyAgIDI0LCAgICAxfSwKLSAgICB7ICAgMjUsICAgIDF9LAotICAgIHszMDAwMCwgMTAwMX0sCi0gICAgeyAgIDMwLCAgICAxfSwKLSAgICB7ICAgNTAsICAgIDF9LAotICAgIHs2MDAwMCwgMTAwMX0sCi0gICAgeyAgIDYwLCAgICAxfSwKLSAgLy8gWGluZydzIDE1ZnBzOiAoOSkKLSAgICB7ICAgMTUsICAgIDF9LAotICAvLyBsaWJtcGVnMydzICJVbm9mZmljaWFsIGVjb25vbXkgcmF0ZXMiOiAoMTAtMTMpCi0gICAgeyAgICA1LCAgICAxfSwKLSAgICB7ICAgMTAsICAgIDF9LAotICAgIHsgICAxMiwgICAgMX0sCi0gICAgeyAgIDE1LCAgICAxfSwKLSAgICB7ICAgIDAsICAgIDB9LAotfTsKLQogY29uc3QgQVZSYXRpb25hbCBmZl9tcGVnMl9mcmFtZV9yYXRlX3RhYltdID0gewogICAgIHsgICAgICAxLCAgICAgMX0sCiAgICAgeyAgICAgIDIsICAgICAxfSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZzEyZGF0YS5oIGIvbGliYXZjb2RlYy9tcGVnMTJkYXRhLmgKaW5kZXggNjViOTQ4NS4uZjUxZmFmNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnMTJkYXRhLmgKKysrIGIvbGliYXZjb2RlYy9tcGVnMTJkYXRhLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTVBFRzEvMiB0YWJsZXMKKyAqIE1QRUctMS8yIHRhYmxlcwogICogY29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCiAgKiBjb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICoKQEAgLTIyLDcgKzIyLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogTVBFRzEvMiB0YWJsZXMuCisgKiBNUEVHLTEvMiB0YWJsZXMuCiAgKi8KIAogI2lmbmRlZiBBVkNPREVDX01QRUcxMkRBVEFfSApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnMTJkZWMuYyBiL2xpYmF2Y29kZWMvbXBlZzEyZGVjLmMKaW5kZXggY2M4YWNlOC4uODNlNTM3OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnMTJkZWMuYworKysgYi9saWJhdmNvZGVjL21wZWcxMmRlYy5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJlcnJvcl9yZXNpbGllbmNlLmgiCisjaW5jbHVkZSAiaHdhY2NlbC5oIgogI2luY2x1ZGUgImlkY3Rkc3AuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1wZWdfZXIuaCIKQEAgLTQ3LDcgKzQ4LDYgQEAKICNpbmNsdWRlICJwcm9maWxlcy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgogI2luY2x1ZGUgInZlcnNpb24uaCIKLSNpbmNsdWRlICJ2ZHBhdV9jb21wYXQuaCIKICNpbmNsdWRlICJ4dm1jX2ludGVybmFsLmgiCiAKIHR5cGVkZWYgc3RydWN0IE1wZWcxQ29udGV4dCB7CkBAIC0xMjQsMTAzICsxMjQsMTYgQEAKICAgICByZXR1cm4gc2lnbl9leHRlbmQodmFsLCA1ICsgc2hpZnQpOwogfQogCisjZGVmaW5lIE1BWF9JTkRFWCAoNjQgLSAxKQogI2RlZmluZSBjaGVja19zY2FudGFibGVfaW5kZXgoY3R4LCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoKHgpID4gNjMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHgpID4gTUFYX0lOREVYKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImFjLXRleCBkYW1hZ2VkIGF0ICVkICVkXG4iLCAgICAgXAogICAgICAgICAgICAgICAgICAgIGN0eC0+bWJfeCwgY3R4LT5tYl95KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLXN0YXRpYyBpbmxpbmUgaW50IG1wZWcxX2RlY29kZV9ibG9ja19pbnRyYShNcGVnRW5jQ29udGV4dCAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4pCi17Ci0gICAgaW50IGxldmVsLCBkYywgZGlmZiwgaSwgaiwgcnVuOwotICAgIGludCBjb21wb25lbnQ7Ci0gICAgUkxUYWJsZSAqcmwgICAgICAgICAgICAgICAgICA9ICZmZl9ybF9tcGVnMTsKLSAgICB1aW50OF90ICpjb25zdCBzY2FudGFibGUgICAgID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7Ci0gICAgY29uc3QgdWludDE2X3QgKnF1YW50X21hdHJpeCA9IHMtPmludHJhX21hdHJpeDsKLSAgICBjb25zdCBpbnQgcXNjYWxlICAgICAgICAgICAgID0gcy0+cXNjYWxlOwotCi0gICAgLyogREMgY29lZmZpY2llbnQgKi8KLSAgICBjb21wb25lbnQgPSAobiA8PSAzID8gMCA6IG4gLSA0ICsgMSk7Ci0gICAgZGlmZiA9IGRlY29kZV9kYygmcy0+Z2IsIGNvbXBvbmVudCk7Ci0gICAgaWYgKGRpZmYgPj0gMHhmZmZmKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBkYyAgPSBzLT5sYXN0X2RjW2NvbXBvbmVudF07Ci0gICAgZGMgKz0gZGlmZjsKLSAgICBzLT5sYXN0X2RjW2NvbXBvbmVudF0gPSBkYzsKLSAgICBibG9ja1swXSA9IGRjICogcXVhbnRfbWF0cml4WzBdOwotICAgIGZmX3Rsb2cocy0+YXZjdHgsICJkYz0lZCBkaWZmPSVkXG4iLCBkYywgZGlmZik7Ci0gICAgaSA9IDA7Ci0gICAgewotICAgICAgICBPUEVOX1JFQURFUihyZSwgJnMtPmdiKTsKLSAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOwotICAgICAgICBpZiAoKChpbnQzMl90KUdFVF9DQUNIRShyZSwgJnMtPmdiKSkgPD0gKGludDMyX3QpMHhCRkZGRkZGRikKLSAgICAgICAgICAgIGdvdG8gZW5kOwotCi0gICAgICAgIC8qIG5vdyBxdWFudGlmeSAmIGVuY29kZSBBQyBjb2VmZmljaWVudHMgKi8KLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgR0VUX1JMX1ZMQyhsZXZlbCwgcnVuLCByZSwgJnMtPmdiLCBybC0+cmxfdmxjWzBdLAotICAgICAgICAgICAgICAgICAgICAgICBURVhfVkxDX0JJVFMsIDIsIDApOwotCi0gICAgICAgICAgICBpZiAobGV2ZWwgIT0gMCkgewotICAgICAgICAgICAgICAgIGkgKz0gcnVuOwotICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKLSAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOwotICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiA0OwotICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIC0gMSkgfCAxOwotICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLQotICAgICAgICAgICAgICAgICAgICAgICAgU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKTsKLSAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIGVzY2FwZSAqLwotICAgICAgICAgICAgICAgIHJ1biA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgNikgKyAxOwotICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDYpOwotICAgICAgICAgICAgICAgIFVQREFURV9DQUNIRShyZSwgJnMtPmdiKTsKLSAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfU0JJVFMocmUsICZzLT5nYiwgOCk7Ci0gICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDgpOwotICAgICAgICAgICAgICAgIGlmIChsZXZlbCA9PSAtMTI4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxldmVsID0gU0hPV19VQklUUyhyZSwgJnMtPmdiLCA4KSAtIDI1NjsKLSAgICAgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfVUJJVFMocmUsICZzLT5nYiwgOCk7Ci0gICAgICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCA4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaSArPSBydW47Ci0gICAgICAgICAgICAgICAgY2hlY2tfc2NhbnRhYmxlX2luZGV4KHMsIGkpOwotICAgICAgICAgICAgICAgIGogPSBzY2FudGFibGVbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIC0gMSkgfCAxOwotICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBibG9ja1tqXSA9IGxldmVsOwotICAgICAgICAgICAgaWYgKCgoaW50MzJfdClHRVRfQ0FDSEUocmUsICZzLT5nYikpIDw9IChpbnQzMl90KTB4QkZGRkZGRkYpCi0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgVVBEQVRFX0NBQ0hFKHJlLCAmcy0+Z2IpOwotICAgICAgICB9Ci1lbmQ6Ci0gICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDIpOwotICAgICAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7Ci0gICAgfQotICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgZmZfbXBlZzFfZGVjb2RlX2Jsb2NrX2ludHJhKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jaywgaW50IG4pCi17Ci0gICAgcmV0dXJuIG1wZWcxX2RlY29kZV9ibG9ja19pbnRyYShzLCBibG9jaywgbik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG1wZWcxX2RlY29kZV9ibG9ja19pbnRlcihNcGVnRW5jQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IG4pCiB7CkBAIC0yNTMsNyArMTY2LDggQEAKIAogICAgICAgICAgICAgaWYgKGxldmVsICE9IDApIHsKICAgICAgICAgICAgICAgICBpICs9IHJ1bjsKLSAgICAgICAgICAgICAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBNQVhfSU5ERVgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGogPSBzY2FudGFibGVbaV07CiAgICAgICAgICAgICAgICAgbGV2ZWwgPSAoKGxldmVsICogMiArIDEpICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiA1OwogICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIC0gMSkgfCAxOwpAQCAtMjc1LDcgKzE4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCA4KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaSArPSBydW47Ci0gICAgICAgICAgICAgICAgY2hlY2tfc2NhbnRhYmxlX2luZGV4KHMsIGkpOworICAgICAgICAgICAgICAgIGlmIChpID4gTUFYX0lOREVYKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAtbGV2ZWw7CkBAIC0yOTcsNiArMjEyLDkgQEAKICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgMik7CiAgICAgICAgIENMT1NFX1JFQURFUihyZSwgJnMtPmdiKTsKICAgICB9CisKKyAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisKICAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTMzOCw3ICsyNTYsOCBAQAogCiAgICAgICAgICAgICBpZiAobGV2ZWwgIT0gMCkgewogICAgICAgICAgICAgICAgIGkgKz0gcnVuOwotICAgICAgICAgICAgICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IE1BWF9JTkRFWCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpXTsKICAgICAgICAgICAgICAgICBsZXZlbCA9ICgobGV2ZWwgKiAyICsgMSkgKiBxc2NhbGUpID4+IDE7CiAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgLSAxKSB8IDE7CkBAIC0zNjAsNyArMjc5LDggQEAKICAgICAgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpICs9IHJ1bjsKLSAgICAgICAgICAgICAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBNQVhfSU5ERVgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGogPSBzY2FudGFibGVbaV07CiAgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IC1sZXZlbDsKQEAgLTM4Miw2ICszMDIsOSBAQAogICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAyKTsKICAgICAgICAgQ0xPU0VfUkVBREVSKHJlLCAmcy0+Z2IpOwogICAgIH0KKworICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKwogICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOwogICAgIHJldHVybiAwOwogfQpAQCAtNDI3LDcgKzM1MCw4IEBACiAKICAgICAgICAgICAgIGlmIChsZXZlbCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgaSArPSBydW47Ci0gICAgICAgICAgICAgICAgY2hlY2tfc2NhbnRhYmxlX2luZGV4KHMsIGkpOworICAgICAgICAgICAgICAgIGlmIChpID4gTUFYX0lOREVYKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOwogICAgICAgICAgICAgICAgIGxldmVsID0gKChsZXZlbCAqIDIgKyAxKSAqIHFzY2FsZSAqIHF1YW50X21hdHJpeFtqXSkgPj4gNTsKICAgICAgICAgICAgICAgICBsZXZlbCA9IChsZXZlbCBeIFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMSkpIC0KQEAgLTQ0Miw3ICszNjYsOCBAQAogICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCAxMik7CiAKICAgICAgICAgICAgICAgICBpICs9IHJ1bjsKLSAgICAgICAgICAgICAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBNQVhfSU5ERVgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGogPSBzY2FudGFibGVbaV07CiAgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICgoLWxldmVsICogMiArIDEpICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiA1OwpAQCAtNDY0LDYgKzM4OSw4IEBACiAgICAgfQogICAgIGJsb2NrWzYzXSBePSAobWlzbWF0Y2ggJiAxKTsKIAorICAgIGNoZWNrX3NjYW50YWJsZV9pbmRleChzLCBpKTsKKwogICAgIHMtPmJsb2NrX2xhc3RfaW5kZXhbbl0gPSBpOwogICAgIHJldHVybiAwOwogfQpAQCAtNTAyLDYgKzQyOSw4IEBACiAKICAgICAgICAgaWYgKGxldmVsICE9IDApIHsKICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgaWYgKGkgPiBNQVhfSU5ERVgpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOwogICAgICAgICAgICAgbGV2ZWwgPSAoKGxldmVsICogMiArIDEpICogcXNjYWxlKSA+PiAxOwogICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpKSAtCkBAIC01MTYsNiArNDQ1LDggQEAKICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCAxMik7CiAKICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgaWYgKGkgPiBNQVhfSU5ERVgpCisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOwogICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkgewogICAgICAgICAgICAgICAgIGxldmVsID0gKCgtbGV2ZWwgKiAyICsgMSkgKiBxc2NhbGUpID4+IDE7CkBAIC01MzQsNiArNDY1LDkgQEAKIGVuZDoKICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAyKTsKICAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7CisKKyAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisKICAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTU2Myw3ICs0OTcsNyBAQAogICAgIGRjICA9IHMtPmxhc3RfZGNbY29tcG9uZW50XTsKICAgICBkYyArPSBkaWZmOwogICAgIHMtPmxhc3RfZGNbY29tcG9uZW50XSA9IGRjOwotICAgIGJsb2NrWzBdID0gZGMgPDwgKDMgLSBzLT5pbnRyYV9kY19wcmVjaXNpb24pOworICAgIGJsb2NrWzBdID0gZGMgKiAoMSA8PCAoMyAtIHMtPmludHJhX2RjX3ByZWNpc2lvbikpOwogICAgIGZmX3Rsb2cocy0+YXZjdHgsICJkYz0lZFxuIiwgYmxvY2tbMF0pOwogICAgIG1pc21hdGNoID0gYmxvY2tbMF0gXiAxOwogICAgIGkgPSAwOwpAQCAtNTg0LDcgKzUxOCw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsICE9IDApIHsKICAgICAgICAgICAgICAgICBpICs9IHJ1bjsKLSAgICAgICAgICAgICAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBNQVhfSU5ERVgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGogPSBzY2FudGFibGVbaV07CiAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgKiBxc2NhbGUgKiBxdWFudF9tYXRyaXhbal0pID4+IDQ7CiAgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpKSAtCkBAIC01OTgsNyArNTMzLDggQEAKICAgICAgICAgICAgICAgICBsZXZlbCA9IFNIT1dfU0JJVFMocmUsICZzLT5nYiwgMTIpOwogICAgICAgICAgICAgICAgIFNLSVBfQklUUyhyZSwgJnMtPmdiLCAxMik7CiAgICAgICAgICAgICAgICAgaSArPSBydW47Ci0gICAgICAgICAgICAgICAgY2hlY2tfc2NhbnRhYmxlX2luZGV4KHMsIGkpOworICAgICAgICAgICAgICAgIGlmIChpID4gTUFYX0lOREVYKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBqID0gc2NhbnRhYmxlW2ldOwogICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSAoLWxldmVsICogcXNjYWxlICogcXVhbnRfbWF0cml4W2pdKSA+PiA0OwpAQCAtNjE1LDYgKzU1MSw4IEBACiAgICAgfQogICAgIGJsb2NrWzYzXSBePSBtaXNtYXRjaCAmIDE7CiAKKyAgICBjaGVja19zY2FudGFibGVfaW5kZXgocywgaSk7CisKICAgICBzLT5ibG9ja19sYXN0X2luZGV4W25dID0gaTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTY5NCw2ICs2MzIsOCBAQAogICAgICAgICBDTE9TRV9SRUFERVIocmUsICZzLT5nYik7CiAgICAgfQogCisgICAgY2hlY2tfc2NhbnRhYmxlX2luZGV4KHMsIGkpOworCiAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSA9IGk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC03MDksMTYgKzY0OSw2IEBACiAgICAgICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBnZXRfcXNjYWxlKE1wZWdFbmNDb250ZXh0ICpzKQotewotICAgIGludCBxc2NhbGUgPSBnZXRfYml0cygmcy0+Z2IsIDUpOwotICAgIGlmIChzLT5xX3NjYWxlX3R5cGUpCi0gICAgICAgIHJldHVybiBmZl9tcGVnMl9ub25fbGluZWFyX3FzY2FsZVtxc2NhbGVdOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIHFzY2FsZSA8PCAxOwotfQotCi0KIC8qIG1vdGlvbiB0eXBlIChmb3IgTVBFRy0yKSAqLwogI2RlZmluZSBNVF9GSUVMRCAxCiAjZGVmaW5lIE1UX0ZSQU1FIDIKQEAgLTc2OCw3ICs2OTgsNyBAQAogICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikgPT0gMCkgewogICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpID09IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbWIgdHlwZSBpbiBJIEZyYW1lIGF0ICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBtYiB0eXBlIGluIEktZnJhbWUgYXQgJWQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3gsIHMtPm1iX3kpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQpAQCAtNzgxLDcgKzcxMSw3IEBACiAgICAgICAgIG1iX3R5cGUgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21iX3B0eXBlX3ZsYy50YWJsZSwgTUJfUFRZUEVfVkxDX0JJVFMsIDEpOwogICAgICAgICBpZiAobWJfdHlwZSA8IDApIHsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG1iIHR5cGUgaW4gUCBGcmFtZSBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbWIgdHlwZSBpbiBQLWZyYW1lIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgICAgIG1iX3R5cGUgPSBwdHlwZTJtYl90eXBlW21iX3R5cGVdOwpAQCAtNzkwLDcgKzcyMCw3IEBACiAgICAgICAgIG1iX3R5cGUgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX21iX2J0eXBlX3ZsYy50YWJsZSwgTUJfQlRZUEVfVkxDX0JJVFMsIDEpOwogICAgICAgICBpZiAobWJfdHlwZSA8IDApIHsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIG1iIHR5cGUgaW4gQiBGcmFtZSBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7CisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbWIgdHlwZSBpbiBCLWZyYW1lIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgICAgIG1iX3R5cGUgPSBidHlwZTJtYl90eXBlW21iX3R5cGVdOwpAQCAtODExLDcgKzc0MSw3IEBACiAgICAgICAgICAgICBzLT5pbnRlcmxhY2VkX2RjdCA9IGdldF9iaXRzMSgmcy0+Z2IpOwogCiAgICAgICAgIGlmIChJU19RVUFOVChtYl90eXBlKSkKLSAgICAgICAgICAgIHMtPnFzY2FsZSA9IGdldF9xc2NhbGUocyk7CisgICAgICAgICAgICBzLT5xc2NhbGUgPSBtcGVnX2dldF9xc2NhbGUocyk7CiAKICAgICAgICAgaWYgKHMtPmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzKSB7CiAgICAgICAgICAgICAvKiBqdXN0IHBhcnNlIHRoZW0gKi8KQEAgLTgyNyw3ICs3NTcsNyBAQAogICAgICAgICAgICAgcy0+bGFzdF9tdlswXVsxXVsxXSA9IG1wZWdfZGVjb2RlX21vdGlvbihzLCBzLT5tcGVnX2ZfY29kZVswXVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9tdlswXVswXVsxXSk7CiAKLSAgICAgICAgICAgIGNoZWNrX21hcmtlcigmcy0+Z2IsICJhZnRlciBjb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycyIpOworICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCAmcy0+Z2IsICJhZnRlciBjb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycyIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogcmVzZXQgbXYgcHJlZGljdGlvbiAqLwogICAgICAgICAgICAgbWVtc2V0KHMtPmxhc3RfbXYsIDAsIHNpemVvZihzLT5sYXN0X212KSk7CkBAIC04NDcsOSArNzc3LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAoKHJldCA9IG1wZWcxX2RlY29kZV9ibG9ja19pbnRyYShzLCAqcy0+cGJsb2Nrc1tpXSwgaSkpIDwgMCkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9tcGVnMV9kZWNvZGVfYmxvY2tfaW50cmEoJnMtPmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnRyYV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X2RjLCAqcy0+cGJsb2Nrc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcy0+cXNjYWxlKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImFjLXRleCBkYW1hZ2VkIGF0ICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcy0+YmxvY2tfbGFzdF9pbmRleFtpXSA9IHJldDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtYl90eXBlICYgTUJfVFlQRV9aRVJPX01WKSB7CkBAIC04NjgsNyArODA5LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKElTX1FVQU5UKG1iX3R5cGUpKQotICAgICAgICAgICAgICAgIHMtPnFzY2FsZSA9IGdldF9xc2NhbGUocyk7CisgICAgICAgICAgICAgICAgcy0+cXNjYWxlID0gbXBlZ19nZXRfcXNjYWxlKHMpOwogCiAgICAgICAgICAgICBzLT5sYXN0X212WzBdWzBdWzBdID0gMDsKICAgICAgICAgICAgIHMtPmxhc3RfbXZbMF1bMF1bMV0gPSAwOwpAQCAtODg5LDcgKzgzMCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChJU19RVUFOVChtYl90eXBlKSkKLSAgICAgICAgICAgICAgICBzLT5xc2NhbGUgPSBnZXRfcXNjYWxlKHMpOworICAgICAgICAgICAgICAgIHMtPnFzY2FsZSA9IG1wZWdfZ2V0X3FzY2FsZShzKTsKIAogICAgICAgICAgICAgLyogbW90aW9uIHZlY3RvcnMgKi8KICAgICAgICAgICAgIHMtPm12X2RpciA9IChtYl90eXBlID4+IDEzKSAmIDM7CkBAIC05MTQsOCArODU1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMF1bMV0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1bGxfcGVsOiBvbmx5IGZvciBNUEVHLTEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+ZnVsbF9wZWxbaV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbaV1bMF1bMF0gPDw9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldWzBdWzFdIDw8PSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltpXVswXVswXSAqPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tdltpXVswXVsxXSAqPSAyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTk3LDggKzkzOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkbXkgPSBnZXRfZG12KHMpOwogCiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMF1bMV0gPSBteSA8PCBteV9zaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMV1bMV0gPSBteSA8PCBteV9zaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMF1bMV0gPSBteSAqICgxIDw8IG15X3NoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfbXZbaV1bMV1bMV0gPSBteSAqICgxIDw8IG15X3NoaWZ0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbaV1bMF1bMF0gPSBteDsKICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2ldWzBdWzFdID0gbXk7CkBAIC0xMDQzLDcgKzk4NCw3IEBACiAKICAgICAgICAgICAgIGNicCA9IGdldF92bGMyKCZzLT5nYiwgZmZfbWJfcGF0X3ZsYy50YWJsZSwgTUJfUEFUX1ZMQ19CSVRTLCAxKTsKICAgICAgICAgICAgIGlmIChtYl9ibG9ja19jb3VudCA+IDYpIHsKLSAgICAgICAgICAgICAgICBjYnAgPDw9IG1iX2Jsb2NrX2NvdW50IC0gNjsKKyAgICAgICAgICAgICAgICBjYnAgKj0gMSA8PCBtYl9ibG9ja19jb3VudCAtIDY7CiAgICAgICAgICAgICAgICAgY2JwICB8PSBnZXRfYml0cygmcy0+Z2IsIG1iX2Jsb2NrX2NvdW50IC0gNik7CiAgICAgICAgICAgICAgICAgcy0+YmRzcC5jbGVhcl9ibG9ja3Mocy0+YmxvY2tbNl0pOwogICAgICAgICAgICAgfQpAQCAtMTE4MCwxMiArMTEyMSwxMiBAQAogfQogCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG1wZWcxX2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwW10gPSB7CisjaWYgQ09ORklHX01QRUcxX05WREVDX0hXQUNDRUwKKyAgICBBVl9QSVhfRk1UX0NVREEsCisjZW5kaWYKICNpZiBDT05GSUdfTVBFRzFfWFZNQ19IV0FDQ0VMCiAgICAgQVZfUElYX0ZNVF9YVk1DLAogI2VuZGlmCi0jaWYgQ09ORklHX01QRUcxX1ZEUEFVX0RFQ09ERVIgJiYgRkZfQVBJX1ZEUEFVCi0gICAgQVZfUElYX0ZNVF9WRFBBVV9NUEVHMSwKLSNlbmRpZgogI2lmIENPTkZJR19NUEVHMV9WRFBBVV9IV0FDQ0VMCiAgICAgQVZfUElYX0ZNVF9WRFBBVSwKICNlbmRpZgpAQCAtMTE5NCwxMiArMTEzNSwxMiBAQAogfTsKIAogc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBtcGVnMl9od2FjY2VsX3BpeGZtdF9saXN0XzQyMFtdID0geworI2lmIENPTkZJR19NUEVHMl9OVkRFQ19IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9DVURBLAorI2VuZGlmCiAjaWYgQ09ORklHX01QRUcyX1hWTUNfSFdBQ0NFTAogICAgIEFWX1BJWF9GTVRfWFZNQywKICNlbmRpZgotI2lmIENPTkZJR19NUEVHX1ZEUEFVX0RFQ09ERVIgJiYgRkZfQVBJX1ZEUEFVCi0gICAgQVZfUElYX0ZNVF9WRFBBVV9NUEVHMiwKLSNlbmRpZgogI2lmIENPTkZJR19NUEVHMl9WRFBBVV9IV0FDQ0VMCiAgICAgQVZfUElYX0ZNVF9WRFBBVSwKICNlbmRpZgpAQCAtMTIwOCw2ICsxMTQ5LDcgQEAKICNlbmRpZgogI2lmIENPTkZJR19NUEVHMl9EM0QxMVZBX0hXQUNDRUwKICAgICBBVl9QSVhfRk1UX0QzRDExVkFfVkxELAorICAgIEFWX1BJWF9GTVRfRDNEMTEsCiAjZW5kaWYKICNpZiBDT05GSUdfTVBFRzJfVkFBUElfSFdBQ0NFTAogICAgIEFWX1BJWF9GTVRfVkFBUEksCkBAIC0xMjI5LDEyICsxMTcxLDYgQEAKICAgICBBVl9QSVhfRk1UX05PTkUKIH07CiAKLSNpZiBGRl9BUElfVkRQQVUKLXN0YXRpYyBpbmxpbmUgaW50IHVzZXNfdmRwYXUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KSB7Ci0gICAgcmV0dXJuIGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfVkRQQVVfTVBFRzEgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9WRFBBVV9NUEVHMjsKLX0KLSNlbmRpZgotCiBzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IG1wZWdfZ2V0X3BpeGVsZm9ybWF0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBNcGVnMUNvbnRleHQgKnMxICA9IGF2Y3R4LT5wcml2X2RhdGE7CkBAIC0xMjU5LDI0ICsxMTk1LDE1IEBACiBzdGF0aWMgdm9pZCBzZXR1cF9od2FjY2VsX2Zvcl9waXhmbXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIC8vIHVudGlsIHRoZW4gcGl4X2ZtdCBtYXkgYmUgY2hhbmdlZCByaWdodCBhZnRlciBjb2RlYyBpbml0Ci0gICAgaWYgKGF2Y3R4LT5od2FjY2VsCi0jaWYgRkZfQVBJX1ZEUEFVCi0gICAgICAgIHx8IHVzZXNfdmRwYXUoYXZjdHgpCi0jZW5kaWYKLSAgICAgICAgKQorICAgIGlmIChhdmN0eC0+aHdhY2NlbCkKICAgICAgICAgaWYgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9BVVRPKQotICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9IEZGX0lEQ1RfU0lNUExFOworICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9IEZGX0lEQ1RfTk9ORTsKIAogICAgIGlmIChhdmN0eC0+aHdhY2NlbCAmJiBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1hWTUMpIHsKICAgICAgICAgTXBlZzFDb250ZXh0ICpzMSA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJnMxLT5tcGVnX2VuY19jdHg7CiAKICAgICAgICAgcy0+cGFja19wYmxvY2tzID0gMTsKLSNpZiBGRl9BUElfWFZNQwotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgICAgICBhdmN0eC0+eHZtY19hY2NlbGVyYXRpb24gPSAyOwotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KICAgICB9CiB9CiAKQEAgLTEyOTEsNyArMTIxOCw4IEBACiAKICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8pIHsKICAgICAgICAgLy8gTVBFRy0xIGFzcGVjdAotICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2X2QycSgxLjAgLyBmZl9tcGVnMV9hc3BlY3Rbcy0+YXNwZWN0X3JhdGlvX2luZm9dLCAyNTUpOworICAgICAgICBBVlJhdGlvbmFsIGFzcGVjdF9pbnYgPSBhdl9kMnEoZmZfbXBlZzFfYXNwZWN0W3MtPmFzcGVjdF9yYXRpb19pbmZvXSwgMjU1KTsKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCkgeyBhc3BlY3RfaW52LmRlbiwgYXNwZWN0X2ludi5udW0gfTsKICAgICB9IGVsc2UgeyAvLyBNUEVHLTIKICAgICAgICAgLy8gTVBFRy0yIGFzcGVjdAogICAgICAgICBpZiAocy0+YXNwZWN0X3JhdGlvX2luZm8gPiAxKSB7CkBAIC0xNDg4LDcgKzE0MTYsNyBAQAogICAgIHMtPmhlaWdodCB8PSAodmVydF9zaXplX2V4dCAgPDwgMTIpOwogICAgIGJpdF9yYXRlX2V4dCA9IGdldF9iaXRzKCZzLT5nYiwgMTIpOyAgLyogWFhYOiBoYW5kbGUgaXQgKi8KICAgICBzLT5iaXRfcmF0ZSArPSAoYml0X3JhdGVfZXh0IDw8IDE4KSAqIDQwMExMOwotICAgIGNoZWNrX21hcmtlcigmcy0+Z2IsICJhZnRlciBiaXQgcmF0ZSBleHRlbnNpb24iKTsKKyAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsICZzLT5nYiwgImFmdGVyIGJpdCByYXRlIGV4dGVuc2lvbiIpOwogICAgIHMtPmF2Y3R4LT5yY19idWZmZXJfc2l6ZSArPSBnZXRfYml0cygmcy0+Z2IsIDgpICogMTAyNCAqIDE2IDw8IDEwOwogCiAgICAgcy0+bG93X2RlbGF5ID0gZ2V0X2JpdHMxKCZzLT5nYik7CkBAIC0xNzA0LDcgKzE2MzIsNiBAQAogICAgICAgICAgICAgaWYgKHNkKQogICAgICAgICAgICAgICAgIG1lbWNweShzZC0+ZGF0YSwgczEtPmE1M19jYXB0aW9uLCBzMS0+YTUzX2NhcHRpb25fc2l6ZSk7CiAgICAgICAgICAgICBhdl9mcmVlcCgmczEtPmE1M19jYXB0aW9uKTsKLSAgICAgICAgICAgIGF2Y3R4LT5wcm9wZXJ0aWVzIHw9IEZGX0NPREVDX1BST1BFUlRZX0NMT1NFRF9DQVBUSU9OUzsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzMS0+aGFzX3N0ZXJlbzNkKSB7CkBAIC0xNzkxLDcgKzE3MTgsNyBAQAogICAgIGZmX21wZWcxX2NsZWFuX2J1ZmZlcnMocyk7CiAgICAgcy0+aW50ZXJsYWNlZF9kY3QgPSAwOwogCi0gICAgcy0+cXNjYWxlID0gZ2V0X3FzY2FsZShzKTsKKyAgICBzLT5xc2NhbGUgPSBtcGVnX2dldF9xc2NhbGUocyk7CiAKICAgICBpZiAocy0+cXNjYWxlID09IDApIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJxc2NhbGUgPT0gMFxuIik7CkBAIC0xOTE2LDEwICsxODQzLDExIEBACiAgICAgICAgIHMtPmRlc3RbMV0gKz0oMTYgPj4gbG93cmVzKSA+PiBzLT5jaHJvbWFfeF9zaGlmdDsKICAgICAgICAgcy0+ZGVzdFsyXSArPSgxNiA+PiBsb3dyZXMpID4+IHMtPmNocm9tYV94X3NoaWZ0OwogCi0gICAgICAgIGZmX21wdl9kZWNvZGVfbWIocywgcy0+YmxvY2spOworICAgICAgICBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIocywgcy0+YmxvY2spOwogCiAgICAgICAgIGlmICgrK3MtPm1iX3ggPj0gcy0+bWJfd2lkdGgpIHsKICAgICAgICAgICAgIGNvbnN0IGludCBtYl9zaXplID0gMTYgPj4gcy0+YXZjdHgtPmxvd3JlczsKKyAgICAgICAgICAgIGludCBsZWZ0OwogCiAgICAgICAgICAgICBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChzLCBtYl9zaXplICogKHMtPm1iX3kgPj4gZmllbGRfcGljKSwgbWJfc2l6ZSk7CiAgICAgICAgICAgICBmZl9tcHZfcmVwb3J0X2RlY29kZV9wcm9ncmVzcyhzKTsKQEAgLTE5NDQsMTMgKzE4NzIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW52YWxpZCBNWEYgZGF0YSBmb3VuZCBpbiB2aWRlbyBzdHJlYW1cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaXNfZDEwID0gMTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCA+IDMyICYmIHNob3dfYml0c19sb25nKCZnYiwgMzIpID09IDB4MjAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNraXBwaW5nIG03MDQgYWxwaGEgKHVuc3VwcG9ydGVkKVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVvczsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChsZWZ0IDwgMCB8fAogICAgICAgICAgICAgICAgICAgICAobGVmdCAmJiBzaG93X2JpdHMoJnMtPmdiLCBGRk1JTihsZWZ0LCAyMykpICYmICFpc19kMTApIHx8CiAgICAgICAgICAgICAgICAgICAgICgoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIChBVl9FRl9CSVRTVFJFQU0gfCBBVl9FRl9BR0dSRVNTSVZFKSkgJiYgbGVmdCA+IDgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5kIG1pc21hdGNoIGxlZnQ9JWQgJTBYXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwgbGVmdD4wID8gc2hvd19iaXRzKCZzLT5nYiwgRkZNSU4obGVmdCwgMjMpKSA6IDApOworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVuZCBtaXNtYXRjaCBsZWZ0PSVkICUwWCBhdCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsIGxlZnQ+MCA/IHNob3dfYml0cygmcy0+Z2IsIEZGTUlOKGxlZnQsIDIzKSkgOiAwLCBzLT5tYl94LCBzLT5tYl95KTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW9zOwpAQCAtMTk1OSwxMiArMTg5MSwxMyBAQAogICAgICAgICAgICAgLy8gaW4gY2FzZXMgd2hlcmUgdGhlIHNsaWNlIGlzIGNvbXBsZXRlbHkgb3V0c2lkZSB0aGUgdmlzaWJsZQogICAgICAgICAgICAgLy8gYXJlYSwgd2UgZGV0ZWN0IHRoaXMgaGVyZSBpbnN0ZWFkIG9mIHJ1bm5pbmcgaW50byB0aGUgZW5kIGV4cGVjdGluZwogICAgICAgICAgICAgLy8gbW9yZSBkYXRhCisgICAgICAgICAgICBsZWZ0ID0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpOwogICAgICAgICAgICAgaWYgKHMtPm1iX3kgPj0gKChzLT5oZWlnaHQgKyAxNSkgPj4gNCkgJiYKICAgICAgICAgICAgICAgICAhcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UgJiYKLSAgICAgICAgICAgICAgICBnZXRfYml0c19sZWZ0KCZzLT5nYikgPD0gOCAmJgotICAgICAgICAgICAgICAgIGdldF9iaXRzX2xlZnQoJnMtPmdiKSA+PSAwICYmCisgICAgICAgICAgICAgICAgbGVmdCA8PSAyNSAmJgorICAgICAgICAgICAgICAgIGxlZnQgPj0gMCAmJgogICAgICAgICAgICAgICAgIHMtPm1iX3NraXBfcnVuID09IC0xICYmCi0gICAgICAgICAgICAgICAgc2hvd19iaXRzKCZzLT5nYiwgOCkgPT0gMCkKKyAgICAgICAgICAgICAgICAoIWxlZnQgfHwgc2hvd19iaXRzKCZzLT5nYiwgbGVmdCkgPT0gMCkpCiAgICAgICAgICAgICAgICAgZ290byBlb3M7CiAKICAgICAgICAgICAgIGZmX2luaXRfYmxvY2tfaW5kZXgocyk7CkBAIC0yMDAxLDcgKzE5MzQsNyBAQAogICAgICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAic2tpcHBlZCBNQiBpbiBJIGZyYW1lIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJza2lwcGVkIE1CIGluIEktZnJhbWUgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTIwMjYsNiArMTk1OSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzFdID0gcy0+bGFzdF9tdlswXVswXVsxXTsKICAgICAgICAgICAgICAgICAgICAgcy0+bXZbMV1bMF1bMF0gPSBzLT5sYXN0X212WzFdWzBdWzBdOwogICAgICAgICAgICAgICAgICAgICBzLT5tdlsxXVswXVsxXSA9IHMtPmxhc3RfbXZbMV1bMF1bMV07CisgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX3NlbGVjdFswXVswXSA9IChzLT5waWN0dXJlX3N0cnVjdHVyZSAtIDEpICYgMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZmllbGRfc2VsZWN0WzFdWzBdID0gKHMtPnBpY3R1cmVfc3RydWN0dXJlIC0gMSkgJiAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjE3Myw3ICsyMTA4LDcgQEAKICAgICAgICAgcy0+ZnJhbWVfcmF0ZV9pbmRleCA9IDE7CiAgICAgfQogICAgIHMtPmJpdF9yYXRlID0gZ2V0X2JpdHMoJnMtPmdiLCAxOCkgKiA0MDBMTDsKLSAgICBpZiAoY2hlY2tfbWFya2VyKCZzLT5nYiwgImluIHNlcXVlbmNlIGhlYWRlciIpID09IDApIHsKKyAgICBpZiAoY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCAmcy0+Z2IsICJpbiBzZXF1ZW5jZSBoZWFkZXIiKSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIApAQCAtMjI5OSwxNyArMjIzNCw4NiBAQAogICAgICAgICAgICAgYXZfZnJlZXAoJnMxLT5hNTNfY2FwdGlvbik7CiAgICAgICAgICAgICBzMS0+YTUzX2NhcHRpb25fc2l6ZSA9IGNjX2NvdW50ICogMzsKICAgICAgICAgICAgIHMxLT5hNTNfY2FwdGlvbiAgICAgID0gYXZfbWFsbG9jKHMxLT5hNTNfY2FwdGlvbl9zaXplKTsKLSAgICAgICAgICAgIGlmIChzMS0+YTUzX2NhcHRpb24pCisgICAgICAgICAgICBpZiAoIXMxLT5hNTNfY2FwdGlvbikgeworICAgICAgICAgICAgICAgIHMxLT5hNTNfY2FwdGlvbl9zaXplID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KHMxLT5hNTNfY2FwdGlvbiwgcCArIDcsIHMxLT5hNTNfY2FwdGlvbl9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2Y3R4LT5wcm9wZXJ0aWVzIHw9IEZGX0NPREVDX1BST1BFUlRZX0NMT1NFRF9DQVBUSU9OUzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgaWYgKGJ1Zl9zaXplID49IDIgJiYKKyAgICAgICAgICAgICAgIHBbMF0gPT0gMHgwMyAmJiAocFsxXSYweDdmKSA9PSAweDAxKSB7CisgICAgICAgIC8qIGV4dHJhY3QgU0NURS0yMCBDQyBkYXRhICovCisgICAgICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgICAgIGludCBjY19jb3VudCA9IDA7CisgICAgICAgIGludCBpOworCisgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBwICsgMiwgYnVmX3NpemUgLSAyKTsKKyAgICAgICAgY2NfY291bnQgPSBnZXRfYml0cygmZ2IsIDUpOworICAgICAgICBpZiAoY2NfY291bnQgPiAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmczEtPmE1M19jYXB0aW9uKTsKKyAgICAgICAgICAgIHMxLT5hNTNfY2FwdGlvbl9zaXplID0gY2NfY291bnQgKiAzOworICAgICAgICAgICAgczEtPmE1M19jYXB0aW9uICAgICAgPSBhdl9tYWxsb2N6KHMxLT5hNTNfY2FwdGlvbl9zaXplKTsKKyAgICAgICAgICAgIGlmICghczEtPmE1M19jYXB0aW9uKSB7CisgICAgICAgICAgICAgICAgczEtPmE1M19jYXB0aW9uX3NpemUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IGZpZWxkLCBjYzEsIGNjMjsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpjYXAgPSBzMS0+YTUzX2NhcHRpb247CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNjX2NvdW50ICYmIGdldF9iaXRzX2xlZnQoJmdiKSA+PSAyNjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIDIpOyAvLyBwcmlvcml0eQorICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGdldF9iaXRzKCZnYiwgMik7CisgICAgICAgICAgICAgICAgICAgIHNraXBfYml0cygmZ2IsIDUpOyAvLyBsaW5lX29mZnNldAorICAgICAgICAgICAgICAgICAgICBjYzEgPSBnZXRfYml0cygmZ2IsIDgpOworICAgICAgICAgICAgICAgICAgICBjYzIgPSBnZXRfYml0cygmZ2IsIDgpOworICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmdiLCAxKTsgLy8gbWFya2VyCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZCkgeyAvLyBmb3JiaWRkZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcFswXSA9IGNhcFsxXSA9IGNhcFsyXSA9IDB4MDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IChmaWVsZCA9PSAyID8gMSA6IDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzMS0+bXBlZ19lbmNfY3R4LnRvcF9maWVsZF9maXJzdCkgZmllbGQgPSAhZmllbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBbMF0gPSAweDA0IHwgZmllbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBbMV0gPSBmZl9yZXZlcnNlW2NjMV07CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBbMl0gPSBmZl9yZXZlcnNlW2NjMl07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FwICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZjdHgtPnByb3BlcnRpZXMgfD0gRkZfQ09ERUNfUFJPUEVSVFlfQ0xPU0VEX0NBUFRJT05TOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAxOwogICAgIH0gZWxzZSBpZiAoYnVmX3NpemUgPj0gMTEgJiYKICAgICAgICAgICAgICAgIHBbMF0gPT0gJ0MnICYmIHBbMV0gPT0gJ0MnICYmIHBbMl0gPT0gMHgwMSAmJiBwWzNdID09IDB4ZjgpIHsKLSAgICAgICAgLyogZXh0cmFjdCBEVkQgQ0MgZGF0YSAqLworICAgICAgICAvKiBleHRyYWN0IERWRCBDQyBkYXRhCisgICAgICAgICAqCisgICAgICAgICAqIHVpbnQzMl90ICAgdXNlcl9kYXRhX3N0YXJ0X2NvZGUgICAgICAgIDB4MDAwMDAxQjIgICAgKGJpZyBlbmRpYW4pCisgICAgICAgICAqIHVpbnQxNl90ICAgdXNlcl9pZGVudGlmaWVyICAgICAgICAgICAgIDB4NDM0MyAiQ0MiCisgICAgICAgICAqIHVpbnQ4X3QgICAgdXNlcl9kYXRhX3R5cGVfY29kZSAgICAgICAgIDB4MDEKKyAgICAgICAgICogdWludDhfdCAgICBjYXB0aW9uX2Jsb2NrX3NpemUgICAgICAgICAgMHhGOAorICAgICAgICAgKiB1aW50OF90CisgICAgICAgICAqICAgYml0IDcgICAgY2FwdGlvbl9vZGRfZmllbGRfZmlyc3QgICAgIDE9b2RkIGZpZWxkIChDQzEvQ0MyKSBmaXJzdCAgMD1ldmVuIGZpZWxkIChDQzMvQ0M0KSBmaXJzdAorICAgICAgICAgKiAgIGJpdCA2ICAgIGNhcHRpb25fZmlsbGVyICAgICAgICAgICAgICAwCisgICAgICAgICAqICAgYml0IDU6MSAgY2FwdGlvbl9ibG9ja19jb3VudCAgICAgICAgIG51bWJlciBvZiBjYXB0aW9uIGJsb2NrcyAocGFpcnMgb2YgY2FwdGlvbiB3b3JkcyA9IGZyYW1lcykuIE1vc3QgRFZEcyB1c2UgMTUgcGVyIHN0YXJ0IG9mIEdPUC4KKyAgICAgICAgICogICBiaXQgMCAgICBjYXB0aW9uX2V4dHJhX2ZpZWxkX2FkZGVkICAgMT1vbmUgYWRkaXRpb25hbCBjYXB0aW9uIHdvcmQKKyAgICAgICAgICoKKyAgICAgICAgICogc3RydWN0IGNhcHRpb25fZmllbGRfYmxvY2sgeworICAgICAgICAgKiAgIHVpbnQ4X3QKKyAgICAgICAgICogICAgIGJpdCA3OjEgY2FwdGlvbl9maWxsZXIgICAgICAgICAgICAgMHg3RiAoYWxsIDFzKQorICAgICAgICAgKiAgICAgYml0IDAgICBjYXB0aW9uX2ZpZWxkX29kZCAgICAgICAgICAxPW9kZCBmaWVsZCAodGhpcyBpcyBDQzEvQ0MyKSAgMD1ldmVuIGZpZWxkICh0aGlzIGlzIENDMy9DQzQpCisgICAgICAgICAqICAgdWludDhfdCAgIGNhcHRpb25fZmlyc3RfYnl0ZQorICAgICAgICAgKiAgIHVpbnQ4X3QgICBjYXB0aW9uX3NlY29uZF9ieXRlCisgICAgICAgICAqIH0gY2FwdGlvbl9ibG9ja1soY2FwdGlvbl9ibG9ja19jb3VudCAqIDIpICsgY2FwdGlvbl9leHRyYV9maWVsZF9hZGRlZF07CisgICAgICAgICAqCisgICAgICAgICAqIFNvbWUgRFZEcyBlbmNvZGUgY2FwdGlvbiBkYXRhIGZvciBib3RoIGZpZWxkcyB3aXRoIGNhcHRpb25fZmllbGRfb2RkPTEuIFRoZSBvbmx5IHdheSB0byBkZWNvZGUgdGhlIGZpZWxkcworICAgICAgICAgKiBjb3JyZWN0bHkgaXMgdG8gc3RhcnQgb24gdGhlIGZpZWxkIGluZGljYXRlZCBieSBjYXB0aW9uX29kZF9maWVsZF9maXJzdCBhbmQgY291bnQgYmV0d2VlbiBvZGQvZXZlbiBmaWVsZHMuCisgICAgICAgICAqIERvbid0IGFzc3VtZSB0aGF0IHRoZSBmaXJzdCBjYXB0aW9uIHdvcmQgaXMgdGhlIG9kZCBmaWVsZC4gVGhlcmUgZG8gZXhpc3QgTVBFRyBmaWxlcyBpbiB0aGUgd2lsZCB0aGF0IHN0YXJ0CisgICAgICAgICAqIG9uIHRoZSBldmVuIGZpZWxkLiBUaGVyZSBhbHNvIGV4aXN0IERWRHMgaW4gdGhlIHdpbGQgdGhhdCBlbmNvZGUgYW4gb2RkIGZpZWxkIGNvdW50IGFuZCB0aGUKKyAgICAgICAgICogY2FwdGlvbl9leHRyYV9maWVsZF9hZGRlZC9jYXB0aW9uX29kZF9maWVsZF9maXJzdCBiaXRzIGNoYW5nZSBwZXIgcGFja2V0IHRvIGFsbG93IHRoYXQuICovCiAgICAgICAgIGludCBjY19jb3VudCA9IDA7CiAgICAgICAgIGludCBpOwogICAgICAgICAvLyBUaGVyZSBpcyBhIGNhcHRpb24gY291bnQgZmllbGQgaW4gdGhlIGRhdGEsIGJ1dCBpdCBpcyBvZnRlbgotICAgICAgICAvLyBpbmNvcmVjdC4gIFNvIGNvdW50IHRoZSBudW1iZXIgb2YgY2FwdGlvbnMgcHJlc2VudC4KKyAgICAgICAgLy8gaW5jb3JyZWN0LiAgU28gY291bnQgdGhlIG51bWJlciBvZiBjYXB0aW9ucyBwcmVzZW50LgogICAgICAgICBmb3IgKGkgPSA1OyBpICsgNiA8PSBidWZfc2l6ZSAmJiAoKHBbaV0gJiAweGZlKSA9PSAweGZlKTsgaSArPSA2KQogICAgICAgICAgICAgY2NfY291bnQrKzsKICAgICAgICAgLy8gVHJhbnNmb3JtIHRoZSBEVkQgZm9ybWF0IGludG8gQTUzIFBhcnQgNCBmb3JtYXQKQEAgLTIzMTcsNyArMjMyMSw5IEBACiAgICAgICAgICAgICBhdl9mcmVlcCgmczEtPmE1M19jYXB0aW9uKTsKICAgICAgICAgICAgIHMxLT5hNTNfY2FwdGlvbl9zaXplID0gY2NfY291bnQgKiA2OwogICAgICAgICAgICAgczEtPmE1M19jYXB0aW9uICAgICAgPSBhdl9tYWxsb2MoczEtPmE1M19jYXB0aW9uX3NpemUpOwotICAgICAgICAgICAgaWYgKHMxLT5hNTNfY2FwdGlvbikgeworICAgICAgICAgICAgaWYgKCFzMS0+YTUzX2NhcHRpb24pIHsKKyAgICAgICAgICAgICAgICBzMS0+YTUzX2NhcHRpb25fc2l6ZSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmllbGQxID0gISEocFs0XSAmIDB4ODApOwogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNhcCA9IHMxLT5hNTNfY2FwdGlvbjsKICAgICAgICAgICAgICAgICBwICs9IDU7CkBAIC0yMzMyLDYgKzIzMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICBwICs9IDY7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZjdHgtPnByb3BlcnRpZXMgfD0gRkZfQ09ERUNfUFJPUEVSVFlfQ0xPU0VEX0NBUFRJT05TOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTIzNzIsMTEgKzIzNzksNiBAQAogICAgICAgICBpZiAoZmxhZ3MgJiAweDQwKSB7CiAgICAgICAgICAgICBpZiAoYnVmX2VuZCAtIHAgPCAxKQogICAgICAgICAgICAgICAgIHJldHVybjsKLSNpZiBGRl9BUElfQUZECi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgICAgICAgICBhdmN0eC0+ZHRnX2FjdGl2ZV9mb3JtYXQgPSBwWzBdICYgMHgwZjsKLUZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotI2VuZGlmIC8qIEZGX0FQSV9BRkQgKi8KICAgICAgICAgICAgIHMxLT5oYXNfYWZkID0gMTsKICAgICAgICAgICAgIHMxLT5hZmQgICAgID0gcFswXSAmIDB4MGY7CiAgICAgICAgIH0KQEAgLTI0MzIsNyArMjQzNCw3IEBACiAjZW5kaWYKIAogICAgIHMtPmNsb3NlZF9nb3AgPSBnZXRfYml0czEoJnMtPmdiKTsKLSAgICAvKiBicm9rZW5fbGluayBpbmRpY2F0ZSB0aGF0IGFmdGVyIGVkaXRpbmcgdGhlCisgICAgLyogYnJva2VuX2xpbmsgaW5kaWNhdGVzIHRoYXQgYWZ0ZXIgZWRpdGluZyB0aGUKICAgICAgKiByZWZlcmVuY2UgZnJhbWVzIG9mIHRoZSBmaXJzdCBCLUZyYW1lcyBhZnRlciBHT1AgSS1GcmFtZQogICAgICAqIGFyZSBtaXNzaW5nIChvcGVuIGdvcCkgKi8KICAgICBicm9rZW5fbGluayA9IGdldF9iaXRzMSgmcy0+Z2IpOwpAQCAtMjQ3NiwxMiArMjQ3OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzMi0+ZXIuZXJyb3JfY291bnQgKz0gczItPnRocmVhZF9jb250ZXh0W2ldLT5lci5lcnJvcl9jb3VudDsKICAgICAgICAgICAgICAgICB9CiAKLSNpZiBGRl9BUElfVkRQQVUKLSAgICAgICAgICAgICAgICBpZiAoKENPTkZJR19NUEVHX1ZEUEFVX0RFQ09ERVIgfHwgQ09ORklHX01QRUcxX1ZEUEFVX0RFQ09ERVIpCi0gICAgICAgICAgICAgICAgICAgICYmIHVzZXNfdmRwYXUoYXZjdHgpKQotICAgICAgICAgICAgICAgICAgICBmZl92ZHBhdV9tcGVnX3BpY3R1cmVfY29tcGxldGUoczIsIGJ1ZiwgYnVmX3NpemUsIHMtPnNsaWNlX2NvdW50KTsKLSNlbmRpZgotCiAgICAgICAgICAgICAgICAgcmV0ID0gc2xpY2VfZW5kKGF2Y3R4LCBwaWN0dXJlKTsKICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTI2NzgsNiArMjY3NCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChzMi0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMyLT5jbG9zZWRfZ29wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9mcmFtZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMyLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgQiBzbGljZSBkdWUgdG8gb3BlbiBHT1BcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNjg5LDYgKzI2ODcsOCBAQAogICAgICAgICAgICAgICAgICAgICAgKiB3ZSBoYXZlIGFuIGludmFsaWQgaGVhZGVyLiAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoczItPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCAmJiAhcy0+c3luYykgewogICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9mcmFtZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coczItPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIFAgc2xpY2UgZHVlIHRvICFzeW5jXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjcyOSwxMyArMjcyOSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgIH0KIAotI2lmIEZGX0FQSV9WRFBBVQotICAgICAgICAgICAgICAgIGlmICh1c2VzX3ZkcGF1KGF2Y3R4KSkgewotICAgICAgICAgICAgICAgICAgICBzLT5zbGljZV9jb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQogICAgICAgICAgICAgICAgIGlmIChIQVZFX1RIUkVBRFMgJiYKICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpICYmCiAgICAgICAgICAgICAgICAgICAgICFhdmN0eC0+aHdhY2NlbCkgewpAQCAtMjgyNyw2ICsyODIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOwogICAgICAgICBpZiAoKmdvdF9vdXRwdXQpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGljdHVyZSBpbiBleHRyYWRhdGFcbiIpOworICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocGljdHVyZSk7CiAgICAgICAgICAgICAqZ290X291dHB1dCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgcy0+ZXh0cmFkYXRhX2RlY29kZWQgPSAxOwpAQCAtMjg4Niw5ICsyODgwLDI1IEBACiAgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IEFWX0NPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBBVl9DT0RFQ19DQVBfRFIxIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX1RSVU5DQVRFRCB8IEFWX0NPREVDX0NBUF9ERUxBWSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5jYXBzX2ludGVybmFsICAgICAgICAgPSBGRl9DT0RFQ19DQVBfU0tJUF9GUkFNRV9GSUxMX1BBUkFNLAogICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSBmbHVzaCwKICAgICAubWF4X2xvd3JlcyAgICAgICAgICAgID0gMywKLSAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQobXBlZ19kZWNvZGVfdXBkYXRlX3RocmVhZF9jb250ZXh0KQorICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChtcGVnX2RlY29kZV91cGRhdGVfdGhyZWFkX2NvbnRleHQpLAorICAgIC5od19jb25maWdzICAgICAgICAgICAgPSAoY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwqW10pIHsKKyNpZiBDT05GSUdfTVBFRzFfTlZERUNfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfTlZERUMobXBlZzEpLAorI2VuZGlmCisjaWYgQ09ORklHX01QRUcxX1ZEUEFVX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZEUEFVKG1wZWcxKSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHMV9WSURFT1RPT0xCT1hfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfVklERU9UT09MQk9YKG1wZWcxKSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHMV9YVk1DX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1hWTUMobXBlZzEpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKIH07CiAKIEFWQ29kZWMgZmZfbXBlZzJ2aWRlb19kZWNvZGVyID0gewpAQCAtMjkwMyw5ICsyOTEzLDM3IEBACiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IEFWX0NPREVDX0NBUF9EUjEgfAogICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9UUlVOQ0FURUQgfCBBVl9DT0RFQ19DQVBfREVMQVkgfAogICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9TS0lQX0ZSQU1FX0ZJTExfUEFSQU0sCiAgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCiAgICAgLm1heF9sb3dyZXMgICAgID0gMywKICAgICAucHJvZmlsZXMgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl9tcGVnMl92aWRlb19wcm9maWxlcyksCisgICAgLmh3X2NvbmZpZ3MgICAgID0gKGNvbnN0IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsKltdKSB7CisjaWYgQ09ORklHX01QRUcyX0RYVkEyX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfRFhWQTIobXBlZzIpLAorI2VuZGlmCisjaWYgQ09ORklHX01QRUcyX0QzRDExVkFfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9EM0QxMVZBKG1wZWcyKSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHMl9EM0QxMVZBMl9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX0QzRDExVkEyKG1wZWcyKSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHMl9OVkRFQ19IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX05WREVDKG1wZWcyKSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHMl9WQUFQSV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZBQVBJKG1wZWcyKSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHMl9WRFBBVV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZEUEFVKG1wZWcyKSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHMl9WSURFT1RPT0xCT1hfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9WSURFT1RPT0xCT1gobXBlZzIpLAorI2VuZGlmCisjaWYgQ09ORklHX01QRUcyX1hWTUNfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9YVk1DKG1wZWcyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICB9LAogfTsKIAogLy9sZWdhY3kgZGVjb2RlcgpAQCAtMjkxOSw3NiArMjk1Nyw3IEBACiAgICAgLmNsb3NlICAgICAgICAgID0gbXBlZ19kZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICA9IG1wZWdfZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUkFXX0hPUklaX0JBTkQgfCBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX1RSVU5DQVRFRCB8IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9TS0lQX0ZSQU1FX0ZJTExfUEFSQU0sCiAgICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCiAgICAgLm1heF9sb3dyZXMgICAgID0gMywKIH07Ci0KLSNpZiBGRl9BUElfWFZNQwotI2lmIENPTkZJR19NUEVHX1hWTUNfREVDT0RFUgotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotc3RhdGljIGF2X2NvbGQgaW50IG1wZWdfbWNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIGlmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKCEoYXZjdHgtPnNsaWNlX2ZsYWdzICYgU0xJQ0VfRkxBR19DT0RFRF9PUkRFUikpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoIShhdmN0eC0+c2xpY2VfZmxhZ3MgJiBTTElDRV9GTEFHX0FMTE9XX0ZJRUxEKSkgewotICAgICAgICBmZl9kbG9nKGF2Y3R4LCAibXBlZzEyLmM6IFh2TUMgZGVjb2RlciB3aWxsIHdvcmsgYmV0dGVyIGlmIFNMSUNFX0ZMQUdfQUxMT1dfRklFTEQgaXMgc2V0XG4iKTsKLSAgICB9Ci0gICAgbXBlZ19kZWNvZGVfaW5pdChhdmN0eCk7Ci0KLSAgICBhdmN0eC0+cGl4X2ZtdCAgICAgICAgICAgPSBBVl9QSVhfRk1UX1hWTUNfTVBFRzJfSURDVDsKLSAgICBhdmN0eC0+eHZtY19hY2NlbGVyYXRpb24gPSAyOyAvLyAyIC0gdGhlIGJsb2NrcyBhcmUgcGFja2VkIQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLUFWQ29kZWMgZmZfbXBlZ194dm1jX2RlY29kZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gIm1wZWd2aWRlb194dm1jIiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy0xLzIgdmlkZW8gWHZNQyAoWC1WaWRlbyBNb3Rpb24gQ29tcGVuc2F0aW9uKSIpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPX1hWTUMsCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE1wZWcxQ29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgID0gbXBlZ19tY19kZWNvZGVfaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgPSBtcGVnX2RlY29kZV9lbmQsCi0gICAgLmRlY29kZSAgICAgICAgID0gbXBlZ19kZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IEFWX0NPREVDX0NBUF9EUjEgfAotICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9UUlVOQ0FURUQgfCBDT0RFQ19DQVBfSFdBQ0NFTCB8Ci0gICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX0RFTEFZLAotICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAotfTsKLUZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotI2VuZGlmCi0jZW5kaWYgLyogRkZfQVBJX1hWTUMgKi8KLQotI2lmIENPTkZJR19NUEVHX1ZEUEFVX0RFQ09ERVIgJiYgRkZfQVBJX1ZEUEFVCi1BVkNvZGVjIGZmX21wZWdfdmRwYXVfZGVjb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAibXBlZ3ZpZGVvX3ZkcGF1IiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy0xLzIgdmlkZW8gKFZEUEFVIGFjY2VsZXJhdGlvbikiKSwKLSAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTywKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZzFDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBtcGVnX2RlY29kZV9pbml0LAotICAgIC5jbG9zZSAgICAgICAgICA9IG1wZWdfZGVjb2RlX2VuZCwKLSAgICAuZGVjb2RlICAgICAgICAgPSBtcGVnX2RlY29kZV9mcmFtZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX1RSVU5DQVRFRCB8Ci0gICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUgfCBBVl9DT0RFQ19DQVBfREVMQVksCi0gICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCi19OwotI2VuZGlmCi0KLSNpZiBDT05GSUdfTVBFRzFfVkRQQVVfREVDT0RFUiAmJiBGRl9BUElfVkRQQVUKLUFWQ29kZWMgZmZfbXBlZzFfdmRwYXVfZGVjb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzF2aWRlb192ZHBhdSIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMSB2aWRlbyAoVkRQQVUgYWNjZWxlcmF0aW9uKSIpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNcGVnMUNvbnRleHQpLAotICAgIC5pbml0ICAgICAgICAgICA9IG1wZWdfZGVjb2RlX2luaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gbXBlZ19kZWNvZGVfZW5kLAotICAgIC5kZWNvZGUgICAgICAgICA9IG1wZWdfZGVjb2RlX2ZyYW1lLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfVFJVTkNBVEVEIHwKLSAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSB8IEFWX0NPREVDX0NBUF9ERUxBWSwKLSAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZzEyZW5jLmMgYi9saWJhdmNvZGVjL21wZWcxMmVuYy5jCmluZGV4IGVhNDVjMDcuLmQwYjQ1OGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZzEyZW5jLmMKKysrIGIvbGliYXZjb2RlYy9tcGVnMTJlbmMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBNUEVHMS8yIGVuY29kZXIKKyAqIE1QRUctMS8yIGVuY29kZXIKICAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIE1QRUcxLzIgZW5jb2RlcgorICogTVBFRy0xLzIgZW5jb2RlcgogICovCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTE0NCwxMiArMTQ0LDEyIEBACiAKICAgICBpZiAoZmluZF9mcmFtZV9yYXRlX2luZGV4KHMpIDwgMCkgewogICAgICAgICBpZiAocy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVBFRzEvMiBkb2VzIG5vdCBzdXBwb3J0ICVkLyVkIGZwc1xuIiwKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVBFRy0xLzIgZG9lcyBub3Qgc3VwcG9ydCAlZC8lZCBmcHNcbiIsCiAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRpbWVfYmFzZS5kZW4sIGF2Y3R4LT50aW1lX2Jhc2UubnVtKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgICAgIk1QRUcxLzIgZG9lcyBub3Qgc3VwcG9ydCAlZC8lZCBmcHMsIHRoZXJlIG1heSBiZSBBViBzeW5jIGlzc3Vlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAiTVBFRy0xLzIgZG9lcyBub3Qgc3VwcG9ydCAlZC8lZCBmcHMsIHRoZXJlIG1heSBiZSBBViBzeW5jIGlzc3Vlc1xuIiwKICAgICAgICAgICAgICAgICAgICBhdmN0eC0+dGltZV9iYXNlLmRlbiwgYXZjdHgtPnRpbWVfYmFzZS5udW0pOwogICAgICAgICB9CiAgICAgfQpAQCAtMjQ5LDcgKzI0OSw3IEBACiAgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZS5mLT5rZXlfZnJhbWUpIHsKICAgICAgICAgQVZSYXRpb25hbCBmcmFtZXJhdGUgPSBmZl9tcGVnMTJfZnJhbWVfcmF0ZV90YWJbcy0+ZnJhbWVfcmF0ZV9pbmRleF07CiAKLSAgICAgICAgLyogbXBlZzEgaGVhZGVyIHJlcGVhdGVkIGV2ZXJ5IGdvcCAqLworICAgICAgICAvKiBNUEVHLTEgaGVhZGVyIHJlcGVhdGVkIGV2ZXJ5IEdPUCAqLwogICAgICAgICBwdXRfaGVhZGVyKHMsIFNFUV9TVEFSVF9DT0RFKTsKIAogICAgICAgICBwdXRfc2JpdHMoJnMtPnBiLCAxMiwgcy0+d2lkdGggICYgMHhGRkYpOwpAQCAtMzQ4LDEyICszNDgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICE9IHMtPmhlaWdodCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Y29sb3JfcHJpbWFyaWVzICE9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Y29sb3JfdHJjICE9IEFWQ09MX1RSQ19VTlNQRUNJRklFRCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Y29sb3JzcGFjZSAhPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Y29sb3JzcGFjZSAhPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dmlkZW9fZm9ybWF0ICE9IFZJREVPX0ZPUk1BVF9VTlNQRUNJRklFRCk7CiAKICAgICAgICAgICAgIGlmIChzLT5zZXFfZGlzcF9leHQgPT0gMSB8fCAocy0+c2VxX2Rpc3BfZXh0ID09IC0xICYmIHVzZV9zZXFfZGlzcF9leHQpKSB7CiAgICAgICAgICAgICAgICAgcHV0X2hlYWRlcihzLCBFWFRfU1RBUlRfQ09ERSk7CiAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnMtPnBiLCA0LCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VxdWVuY2UgZGlzcGxheSBleHRlbnNpb24KLSAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDMsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2aWRlb19mb3JtYXQ6IDAgaXMgY29tcG9uZW50cworICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMywgcy0+dmlkZW9fZm9ybWF0KTsgICAgICAgICAgIC8vIHZpZGVvX2Zvcm1hdAogICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgMSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG91cl9kZXNjcmlwdGlvbgogICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZzLT5wYiwgOCwgcy0+YXZjdHgtPmNvbG9yX3ByaW1hcmllcyk7IC8vIGNvbG91cl9wcmltYXJpZXMKICAgICAgICAgICAgICAgICBwdXRfYml0cygmcy0+cGIsIDgsIHMtPmF2Y3R4LT5jb2xvcl90cmMpOyAgICAgICAvLyB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MKQEAgLTQyMyw3ICs0MjQsNyBAQAogICAgIEFWRnJhbWVTaWRlRGF0YSAqc2lkZV9kYXRhOwogICAgIG1wZWcxX2VuY29kZV9zZXF1ZW5jZV9oZWFkZXIocyk7CiAKLSAgICAvKiBtcGVnMSBwaWN0dXJlIGhlYWRlciAqLworICAgIC8qIE1QRUctMSBwaWN0dXJlIGhlYWRlciAqLwogICAgIHB1dF9oZWFkZXIocywgUElDVFVSRV9TVEFSVF9DT0RFKTsKICAgICAvKiB0ZW1wb3JhbCByZWZlcmVuY2UgKi8KIApAQCAtMTEyNSw2ICsxMTI2LDEzIEBACiAgICAgeyAgICAgImF1dG8iLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSAtMX0sICAwLCAwLCBWRSwgInNlcV9kaXNwX2V4dCIgfSwKICAgICB7ICAgICAibmV2ZXIiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IDAgfSwgIDAsIDAsIFZFLCAic2VxX2Rpc3BfZXh0IiB9LAogICAgIHsgICAgICJhbHdheXMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gMSB9LCAgMCwgMCwgVkUsICJzZXFfZGlzcF9leHQiIH0sCisgICAgeyAidmlkZW9fZm9ybWF0IiwgICAgICJWaWRlb19mb3JtYXQgaW4gdGhlIHNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uIGluZGljYXRpbmcgdGhlIHNvdXJjZSBvZiB0aGUgdmlkZW8uIiwgT0ZGU0VUKHZpZGVvX2Zvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gVklERU9fRk9STUFUX1VOU1BFQ0lGSUVEIH0sIDAsIDcsIFZFLCAidmlkZW9fZm9ybWF0IiB9LAorICAgIHsgICAgICJjb21wb25lbnQiLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVklERU9fRk9STUFUX0NPTVBPTkVOVCAgfSwgIDAsIDAsIFZFLCAidmlkZW9fZm9ybWF0IiB9LAorICAgIHsgICAgICJwYWwiLCAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVklERU9fRk9STUFUX1BBTCAgICAgICAgfSwgIDAsIDAsIFZFLCAidmlkZW9fZm9ybWF0IiB9LAorICAgIHsgICAgICJudHNjIiwgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVklERU9fRk9STUFUX05UU0MgICAgICAgfSwgIDAsIDAsIFZFLCAidmlkZW9fZm9ybWF0IiB9LAorICAgIHsgICAgICJzZWNhbSIsICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVklERU9fRk9STUFUX1NFQ0FNICAgICAgfSwgIDAsIDAsIFZFLCAidmlkZW9fZm9ybWF0IiB9LAorICAgIHsgICAgICJtYWMiLCAgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVklERU9fRk9STUFUX01BQyAgICAgICAgfSwgIDAsIDAsIFZFLCAidmlkZW9fZm9ybWF0IiB9LAorICAgIHsgICAgICJ1bnNwZWNpZmllZCIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gVklERU9fRk9STUFUX1VOU1BFQ0lGSUVEfSwgIDAsIDAsIFZFLCAidmlkZW9fZm9ybWF0IiB9LAogICAgIEZGX01QVl9DT01NT05fT1BUUwogICAgIHsgTlVMTCB9LAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZzEyZnJhbWVyYXRlLmMgYi9saWJhdmNvZGVjL21wZWcxMmZyYW1lcmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiM2QzNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL21wZWcxMmZyYW1lcmF0ZS5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmF0aW9uYWwuaCIKKworI2luY2x1ZGUgIm1wZWcxMi5oIgorI2luY2x1ZGUgIm1wZWcxMmRhdGEuaCIKKworY29uc3QgQVZSYXRpb25hbCBmZl9tcGVnMTJfZnJhbWVfcmF0ZV90YWJbMTZdID0geworICAgIHsgICAgMCwgICAgMH0sCisgICAgezI0MDAwLCAxMDAxfSwKKyAgICB7ICAgMjQsICAgIDF9LAorICAgIHsgICAyNSwgICAgMX0sCisgICAgezMwMDAwLCAxMDAxfSwKKyAgICB7ICAgMzAsICAgIDF9LAorICAgIHsgICA1MCwgICAgMX0sCisgICAgezYwMDAwLCAxMDAxfSwKKyAgICB7ICAgNjAsICAgIDF9LAorICAvLyBYaW5nJ3MgMTVmcHM6ICg5KQorICAgIHsgICAxNSwgICAgMX0sCisgIC8vIGxpYm1wZWczJ3MgIlVub2ZmaWNpYWwgZWNvbm9teSByYXRlcyI6ICgxMC0xMykKKyAgICB7ICAgIDUsICAgIDF9LAorICAgIHsgICAxMCwgICAgMX0sCisgICAgeyAgIDEyLCAgICAxfSwKKyAgICB7ICAgMTUsICAgIDF9LAorICAgIHsgICAgMCwgICAgMH0sCit9OworCit2b2lkIGZmX21wZWcxMl9maW5kX2Jlc3RfZnJhbWVfcmF0ZShBVlJhdGlvbmFsIGZyYW1lX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvZGUsIGludCAqZXh0X24sIGludCAqZXh0X2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm9uc3RhbmRhcmQpCit7CisgICAgaW50IG1wZWcyID0gZXh0X24gJiYgZXh0X2Q7CisgICAgaW50IG1heF9jb2RlID0gbm9uc3RhbmRhcmQgPyAxMiA6IDg7CisgICAgaW50IGMsIG4sIGQsIGJlc3RfYywgYmVzdF9uLCBiZXN0X2Q7CisgICAgQVZSYXRpb25hbCBiZXN0X2Vycm9yID0geyBJTlRfTUFYLCAxIH07CisKKyAgICAvLyBEZWZhdWx0IHRvIE5UU0MgaWYgdGhlIGlucHV0cyBtYWtlIG5vIHNlbnNlLgorICAgIGJlc3RfYyA9IDQ7CisgICAgYmVzdF9uID0gYmVzdF9kID0gMTsKKworICAgIGZvciAoYyA9IDE7IGMgPD0gbWF4X2NvZGU7IGMrKykgeworICAgICAgICBpZiAoYXZfY21wX3EoZnJhbWVfcmF0ZSwgZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiW2NdKSA9PSAwKSB7CisgICAgICAgICAgICBiZXN0X2MgPSBjOworICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYyA9IDE7IGMgPD0gbWF4X2NvZGU7IGMrKykgeworICAgICAgICBmb3IgKG4gPSAxOyBuIDw9IChtcGVnMiA/IDQgOiAxKTsgbisrKSB7CisgICAgICAgICAgICBmb3IgKGQgPSAxOyBkIDw9IChtcGVnMiA/IDMyIDogMSk7IGQrKykgeworICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgdGVzdCwgZXJyb3I7CisgICAgICAgICAgICAgICAgaW50IGNtcDsKKworICAgICAgICAgICAgICAgIHRlc3QgPSBhdl9tdWxfcShmZl9tcGVnMTJfZnJhbWVfcmF0ZV90YWJbY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKSB7IG4sIGQgfSk7CisKKyAgICAgICAgICAgICAgICBjbXAgPSBhdl9jbXBfcSh0ZXN0LCBmcmFtZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoY21wID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9jID0gYzsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9uID0gbjsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9kID0gZDsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmb3VuZDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY21wIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBhdl9kaXZfcShmcmFtZV9yYXRlLCB0ZXN0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gYXZfZGl2X3EodGVzdCwgZnJhbWVfcmF0ZSk7CisKKyAgICAgICAgICAgICAgICBjbXAgPSBhdl9jbXBfcShlcnJvciwgYmVzdF9lcnJvcik7CisgICAgICAgICAgICAgICAgaWYgKGNtcCA8IDAgfHwgKGNtcCA9PSAwICYmIG4gPT0gMSAmJiBkID09IDEpKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfYyA9IGM7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfbiA9IG47CisgICAgICAgICAgICAgICAgICAgIGJlc3RfZCA9IGQ7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfZXJyb3IgPSBlcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK2ZvdW5kOgorICAgICpjb2RlID0gYmVzdF9jOworICAgIGlmIChtcGVnMikgeworICAgICAgICAqZXh0X24gPSBiZXN0X24gLSAxOworICAgICAgICAqZXh0X2QgPSBiZXN0X2QgLSAxOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZzEydmxjLmggYi9saWJhdmNvZGVjL21wZWcxMnZsYy5oCmluZGV4IDMxODg4ZmQuLmM1YWJhZTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZzEydmxjLmgKKysrIGIvbGliYXZjb2RlYy9tcGVnMTJ2bGMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBNUEVHMS8yIFZMQworICogTVBFRy0xLzIgVkxDCiAgKiBjb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKICAqIGNvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKgpAQCAtMjIsMTMgKzIyLDEzIEBACiAKIC8qKgogICogQGZpbGUKLSAqIE1QRUcxLzIgVkxDLgorICogTVBFRy0xLzIgVkxDLgogICovCiAKICNpZm5kZWYgQVZDT0RFQ19NUEVHMTJWTENfSAogI2RlZmluZSBBVkNPREVDX01QRUcxMlZMQ19ICiAKLSNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInZsYy5oIgogCiAjZGVmaW5lIERDX1ZMQ19CSVRTIDkKICNkZWZpbmUgTVZfVkxDX0JJVFMgOQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnMl9tZXRhZGF0YV9ic2YuYyBiL2xpYmF2Y29kZWMvbXBlZzJfbWV0YWRhdGFfYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc4N2NiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbXBlZzJfbWV0YWRhdGFfYnNmLmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJic2YuaCIKKyNpbmNsdWRlICJjYnMuaCIKKyNpbmNsdWRlICJjYnNfbXBlZzIuaCIKKyNpbmNsdWRlICJtcGVnMTIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTVBFRzJNZXRhZGF0YUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQ29kZWRCaXRzdHJlYW1Db250ZXh0ICpjYmM7CisgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCBmcmFnbWVudDsKKworICAgIE1QRUcyUmF3RXh0ZW5zaW9uRGF0YSBzZXF1ZW5jZV9kaXNwbGF5X2V4dGVuc2lvbjsKKworICAgIEFWUmF0aW9uYWwgZGlzcGxheV9hc3BlY3RfcmF0aW87CisKKyAgICBBVlJhdGlvbmFsIGZyYW1lX3JhdGU7CisKKyAgICBpbnQgdmlkZW9fZm9ybWF0OworICAgIGludCBjb2xvdXJfcHJpbWFyaWVzOworICAgIGludCB0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3M7CisgICAgaW50IG1hdHJpeF9jb2VmZmljaWVudHM7CisKKyAgICBpbnQgbXBlZzFfd2FybmVkOworfSBNUEVHMk1ldGFkYXRhQ29udGV4dDsKKworCitzdGF0aWMgaW50IG1wZWcyX21ldGFkYXRhX3VwZGF0ZV9mcmFnbWVudChBVkJTRkNvbnRleHQgKmJzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcpCit7CisgICAgTVBFRzJNZXRhZGF0YUNvbnRleHQgICAgICAgICAgICAgKmN0eCA9IGJzZi0+cHJpdl9kYXRhOworICAgIE1QRUcyUmF3U2VxdWVuY2VIZWFkZXIgICAgICAgICAgICAqc2ggPSBOVUxMOworICAgIE1QRUcyUmF3U2VxdWVuY2VFeHRlbnNpb24gICAgICAgICAqc2UgPSBOVUxMOworICAgIE1QRUcyUmF3U2VxdWVuY2VEaXNwbGF5RXh0ZW5zaW9uICpzZGUgPSBOVUxMOworICAgIGludCBpLCBzZV9wb3MsIGFkZF9zZGUgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGZyYWctPm5iX3VuaXRzOyBpKyspIHsKKyAgICAgICAgaWYgKGZyYWctPnVuaXRzW2ldLnR5cGUgPT0gTVBFRzJfU1RBUlRfU0VRVUVOQ0VfSEVBREVSKSB7CisgICAgICAgICAgICBzaCA9IGZyYWctPnVuaXRzW2ldLmNvbnRlbnQ7CisgICAgICAgIH0gZWxzZSBpZiAoZnJhZy0+dW5pdHNbaV0udHlwZSA9PSBNUEVHMl9TVEFSVF9FWFRFTlNJT04pIHsKKyAgICAgICAgICAgIE1QRUcyUmF3RXh0ZW5zaW9uRGF0YSAqZXh0ID0gZnJhZy0+dW5pdHNbaV0uY29udGVudDsKKyAgICAgICAgICAgIGlmIChleHQtPmV4dGVuc2lvbl9zdGFydF9jb2RlX2lkZW50aWZpZXIgPT0KKyAgICAgICAgICAgICAgICBNUEVHMl9FWFRFTlNJT05fU0VRVUVOQ0UpIHsKKyAgICAgICAgICAgICAgICBzZSA9ICZleHQtPmRhdGEuc2VxdWVuY2U7CisgICAgICAgICAgICAgICAgc2VfcG9zID0gaTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXh0LT5leHRlbnNpb25fc3RhcnRfY29kZV9pZGVudGlmaWVyID09CisgICAgICAgICAgICAgICAgTVBFRzJfRVhURU5TSU9OX1NFUVVFTkNFX0RJU1BMQVkpIHsKKyAgICAgICAgICAgICAgICBzZGUgPSAmZXh0LT5kYXRhLnNlcXVlbmNlX2Rpc3BsYXk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXNoIHx8ICFzZSkgeworICAgICAgICAvLyBObyBzZXF1ZW5jZSBoZWFkZXIgYW5kIHNlcXVlbmNlIGV4dGVuc2lvbjogbm90IGFuIE1QRUctMiB2aWRlbworICAgICAgICAvLyBzZXF1ZW5jZS4KKyAgICAgICAgaWYgKHNoICYmICFjdHgtPm1wZWcxX3dhcm5lZCkgeworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX1dBUk5JTkcsICJTdHJlYW0gY29udGFpbnMgYSBzZXF1ZW5jZSAiCisgICAgICAgICAgICAgICAgICAgImhlYWRlciBidXQgbm90IGEgc2VxdWVuY2UgZXh0ZW5zaW9uOiBtYXliZSBpdCdzICIKKyAgICAgICAgICAgICAgICAgICAiYWN0dWFsbHkgTVBFRy0xP1xuIik7CisgICAgICAgICAgICBjdHgtPm1wZWcxX3dhcm5lZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZGlzcGxheV9hc3BlY3RfcmF0aW8ubnVtICYmIGN0eC0+ZGlzcGxheV9hc3BlY3RfcmF0aW8uZGVuKSB7CisgICAgICAgIGludCBudW0sIGRlbjsKKworICAgICAgICBhdl9yZWR1Y2UoJm51bSwgJmRlbiwgY3R4LT5kaXNwbGF5X2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICBjdHgtPmRpc3BsYXlfYXNwZWN0X3JhdGlvLmRlbiwgNjU1MzUpOworCisgICAgICAgIGlmIChudW0gPT0gNCAmJiBkZW4gPT0gMykKKyAgICAgICAgICAgIHNoLT5hc3BlY3RfcmF0aW9faW5mb3JtYXRpb24gPSAyOworICAgICAgICBlbHNlIGlmIChudW0gPT0gMTYgJiYgZGVuID09IDkpCisgICAgICAgICAgICBzaC0+YXNwZWN0X3JhdGlvX2luZm9ybWF0aW9uID0gMzsKKyAgICAgICAgZWxzZSBpZiAobnVtID09IDIyMSAmJiBkZW4gPT0gMTAwKQorICAgICAgICAgICAgc2gtPmFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbiA9IDQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNoLT5hc3BlY3RfcmF0aW9faW5mb3JtYXRpb24gPSAxOworICAgIH0KKworICAgIGlmIChjdHgtPmZyYW1lX3JhdGUubnVtICYmIGN0eC0+ZnJhbWVfcmF0ZS5kZW4pIHsKKyAgICAgICAgaW50IGNvZGUsIGV4dF9uLCBleHRfZDsKKworICAgICAgICBmZl9tcGVnMTJfZmluZF9iZXN0X2ZyYW1lX3JhdGUoY3R4LT5mcmFtZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGUsICZleHRfbiwgJmV4dF9kLCAwKTsKKworICAgICAgICBzaC0+ZnJhbWVfcmF0ZV9jb2RlICAgICAgICA9IGNvZGU7CisgICAgICAgIHNlLT5mcmFtZV9yYXRlX2V4dGVuc2lvbl9uID0gZXh0X247CisgICAgICAgIHNlLT5mcmFtZV9yYXRlX2V4dGVuc2lvbl9kID0gZXh0X2Q7CisgICAgfQorCisgICAgaWYgKGN0eC0+dmlkZW9fZm9ybWF0ICAgICAgICAgICAgID49IDAgfHwKKyAgICAgICAgY3R4LT5jb2xvdXJfcHJpbWFyaWVzICAgICAgICAgPj0gMCB8fAorICAgICAgICBjdHgtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA+PSAwIHx8CisgICAgICAgIGN0eC0+bWF0cml4X2NvZWZmaWNpZW50cyAgICAgID49IDApIHsKKyAgICAgICAgaWYgKCFzZGUpIHsKKyAgICAgICAgICAgIGFkZF9zZGUgPSAxOworICAgICAgICAgICAgY3R4LT5zZXF1ZW5jZV9kaXNwbGF5X2V4dGVuc2lvbi5leHRlbnNpb25fc3RhcnRfY29kZSA9CisgICAgICAgICAgICAgICAgTVBFRzJfU1RBUlRfRVhURU5TSU9OOworICAgICAgICAgICAgY3R4LT5zZXF1ZW5jZV9kaXNwbGF5X2V4dGVuc2lvbi5leHRlbnNpb25fc3RhcnRfY29kZV9pZGVudGlmaWVyID0KKyAgICAgICAgICAgICAgICBNUEVHMl9FWFRFTlNJT05fU0VRVUVOQ0VfRElTUExBWTsKKyAgICAgICAgICAgIHNkZSA9ICZjdHgtPnNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uLmRhdGEuc2VxdWVuY2VfZGlzcGxheTsKKworICAgICAgICAgICAgKnNkZSA9IChNUEVHMlJhd1NlcXVlbmNlRGlzcGxheUV4dGVuc2lvbikgeworICAgICAgICAgICAgICAgIC52aWRlb19mb3JtYXQgPSA1LAorCisgICAgICAgICAgICAgICAgLmNvbG91cl9kZXNjcmlwdGlvbiAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgLmNvbG91cl9wcmltYXJpZXMgICAgICAgICA9IDIsCisgICAgICAgICAgICAgICAgLnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9IDIsCisgICAgICAgICAgICAgICAgLm1hdHJpeF9jb2VmZmljaWVudHMgICAgICA9IDIsCisKKyAgICAgICAgICAgICAgICAuZGlzcGxheV9ob3Jpem9udGFsX3NpemUgPQorICAgICAgICAgICAgICAgICAgICBzZS0+aG9yaXpvbnRhbF9zaXplX2V4dGVuc2lvbiA8PCAxMiB8IHNoLT5ob3Jpem9udGFsX3NpemVfdmFsdWUsCisgICAgICAgICAgICAgICAgLmRpc3BsYXlfdmVydGljYWxfc2l6ZSA9CisgICAgICAgICAgICAgICAgICAgIHNlLT52ZXJ0aWNhbF9zaXplX2V4dGVuc2lvbiA8PCAxMiB8IHNoLT52ZXJ0aWNhbF9zaXplX3ZhbHVlLAorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdHgtPnZpZGVvX2Zvcm1hdCA+PSAwKQorICAgICAgICAgICAgc2RlLT52aWRlb19mb3JtYXQgPSBjdHgtPnZpZGVvX2Zvcm1hdDsKKworICAgICAgICBpZiAoY3R4LT5jb2xvdXJfcHJpbWFyaWVzICAgICAgICAgPj0gMCB8fAorICAgICAgICAgICAgY3R4LT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPj0gMCB8fAorICAgICAgICAgICAgY3R4LT5tYXRyaXhfY29lZmZpY2llbnRzICAgICAgPj0gMCkgeworICAgICAgICAgICAgc2RlLT5jb2xvdXJfZGVzY3JpcHRpb24gPSAxOworCisgICAgICAgICAgICBpZiAoY3R4LT5jb2xvdXJfcHJpbWFyaWVzID49IDApCisgICAgICAgICAgICAgICAgc2RlLT5jb2xvdXJfcHJpbWFyaWVzID0gY3R4LT5jb2xvdXJfcHJpbWFyaWVzOworICAgICAgICAgICAgZWxzZSBpZiAoYWRkX3NkZSkKKyAgICAgICAgICAgICAgICBzZGUtPmNvbG91cl9wcmltYXJpZXMgPSAyOworCisgICAgICAgICAgICBpZiAoY3R4LT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPj0gMCkKKyAgICAgICAgICAgICAgICBzZGUtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9IGN0eC0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgZWxzZSBpZiAoYWRkX3NkZSkKKyAgICAgICAgICAgICAgICBzZGUtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9IDI7CisKKyAgICAgICAgICAgIGlmIChjdHgtPm1hdHJpeF9jb2VmZmljaWVudHMgPj0gMCkKKyAgICAgICAgICAgICAgICBzZGUtPm1hdHJpeF9jb2VmZmljaWVudHMgPSBjdHgtPm1hdHJpeF9jb2VmZmljaWVudHM7CisgICAgICAgICAgICBlbHNlIGlmIChhZGRfc2RlKQorICAgICAgICAgICAgICAgIHNkZS0+bWF0cml4X2NvZWZmaWNpZW50cyA9IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWRkX3NkZSkgeworICAgICAgICBpbnQgZXJyOworCisgICAgICAgIGVyciA9IGZmX2Nic19pbnNlcnRfdW5pdF9jb250ZW50KGN0eC0+Y2JjLCBmcmFnLCBzZV9wb3MgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHMl9TVEFSVF9FWFRFTlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbnNlcnQgbmV3IHNlcXVlbmNlICIKKyAgICAgICAgICAgICAgICAgICAiZGlzcGxheSBleHRlbnNpb24uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVnMl9tZXRhZGF0YV9maWx0ZXIoQVZCU0ZDb250ZXh0ICpic2YsIEFWUGFja2V0ICpvdXQpCit7CisgICAgTVBFRzJNZXRhZGF0YUNvbnRleHQgKmN0eCA9IGJzZi0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0ICppbiA9IE5VTEw7CisgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZyA9ICZjdHgtPmZyYWdtZW50OworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBmZl9ic2ZfZ2V0X3BhY2tldChic2YsICZpbik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBmZl9jYnNfcmVhZF9wYWNrZXQoY3R4LT5jYmMsIGZyYWcsIGluKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBwYWNrZXQuXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IG1wZWcyX21ldGFkYXRhX3VwZGF0ZV9mcmFnbWVudChic2YsIGZyYWcpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB1cGRhdGUgZnJhbWUgZnJhZ21lbnQuXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IGZmX2Nic193cml0ZV9wYWNrZXQoY3R4LT5jYmMsIG91dCwgZnJhZyk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIHBhY2tldC5cbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZXJyID0gYXZfcGFja2V0X2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IDA7CitmYWlsOgorICAgIGZmX2Nic19mcmFnbWVudF91bmluaXQoY3R4LT5jYmMsIGZyYWcpOworCisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1wZWcyX21ldGFkYXRhX2luaXQoQVZCU0ZDb250ZXh0ICpic2YpCit7CisgICAgTVBFRzJNZXRhZGF0YUNvbnRleHQgKmN0eCA9IGJzZi0+cHJpdl9kYXRhOworICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcgPSAmY3R4LT5mcmFnbWVudDsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gZmZfY2JzX2luaXQoJmN0eC0+Y2JjLCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBic2YpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgaWYgKGJzZi0+cGFyX2luLT5leHRyYWRhdGEpIHsKKyAgICAgICAgZXJyID0gZmZfY2JzX3JlYWRfZXh0cmFkYXRhKGN0eC0+Y2JjLCBmcmFnLCBic2YtPnBhcl9pbik7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IG1wZWcyX21ldGFkYXRhX3VwZGF0ZV9mcmFnbWVudChic2YsIGZyYWcpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHVwZGF0ZSBtZXRhZGF0YSBmcmFnbWVudC5cbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZmZfY2JzX3dyaXRlX2V4dHJhZGF0YShjdHgtPmNiYywgYnNmLT5wYXJfb3V0LCBmcmFnKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB3cml0ZSBleHRyYWRhdGEuXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVyciA9IDA7CitmYWlsOgorICAgIGZmX2Nic19mcmFnbWVudF91bmluaXQoY3R4LT5jYmMsIGZyYWcpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG1wZWcyX21ldGFkYXRhX2Nsb3NlKEFWQlNGQ29udGV4dCAqYnNmKQoreworICAgIE1QRUcyTWV0YWRhdGFDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBmZl9jYnNfY2xvc2UoJmN0eC0+Y2JjKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTVBFRzJNZXRhZGF0YUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19CU0ZfUEFSQU0pCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbXBlZzJfbWV0YWRhdGFfb3B0aW9uc1tdID0geworICAgIHsgImRpc3BsYXlfYXNwZWN0X3JhdGlvIiwgIlNldCBkaXNwbGF5IGFzcGVjdCByYXRpbyAodGFibGUgNi0zKSIsCisgICAgICAgIE9GRlNFVChkaXNwbGF5X2FzcGVjdF9yYXRpbyksIEFWX09QVF9UWVBFX1JBVElPTkFMLAorICAgICAgICB7IC5kYmwgPSAwLjAgfSwgMCwgNjU1MzUsIEZMQUdTIH0sCisKKyAgICB7ICJmcmFtZV9yYXRlIiwgIlNldCBmcmFtZSByYXRlIiwKKyAgICAgICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwKKyAgICAgICAgeyAuZGJsID0gMC4wIH0sIDAsIFVJTlRfTUFYLCBGTEFHUyB9LAorCisgICAgeyAidmlkZW9fZm9ybWF0IiwgIlNldCB2aWRlbyBmb3JtYXQgKHRhYmxlIDYtNikiLAorICAgICAgICBPRkZTRVQodmlkZW9fZm9ybWF0KSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgNywgRkxBR1MgfSwKKyAgICB7ICJjb2xvdXJfcHJpbWFyaWVzIiwgIlNldCBjb2xvdXIgcHJpbWFyaWVzICh0YWJsZSA2LTcpIiwKKyAgICAgICAgT0ZGU0VUKGNvbG91cl9wcmltYXJpZXMpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAyNTUsIEZMQUdTIH0sCisgICAgeyAidHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzIiwgIlNldCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MgKHRhYmxlIDYtOCkiLAorICAgICAgICBPRkZTRVQodHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMjU1LCBGTEFHUyB9LAorICAgIHsgIm1hdHJpeF9jb2VmZmljaWVudHMiLCAiU2V0IG1hdHJpeCBjb2VmZmljaWVudHMgKHRhYmxlIDYtOSkiLAorICAgICAgICBPRkZTRVQobWF0cml4X2NvZWZmaWNpZW50cyksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDI1NSwgRkxBR1MgfSwKKworICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBtcGVnMl9tZXRhZGF0YV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJtcGVnMl9tZXRhZGF0YV9ic2YiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBtcGVnMl9tZXRhZGF0YV9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZDb2RlY0lEIG1wZWcyX21ldGFkYXRhX2NvZGVjX2lkc1tdID0geworICAgIEFWX0NPREVDX0lEX01QRUcyVklERU8sIEFWX0NPREVDX0lEX05PTkUsCit9OworCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9tcGVnMl9tZXRhZGF0YV9ic2YgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWcyX21ldGFkYXRhIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTVBFRzJNZXRhZGF0YUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZtcGVnMl9tZXRhZGF0YV9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICAgPSAmbXBlZzJfbWV0YWRhdGFfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSAmbXBlZzJfbWV0YWRhdGFfY2xvc2UsCisgICAgLmZpbHRlciAgICAgICAgID0gJm1wZWcyX21ldGFkYXRhX2ZpbHRlciwKKyAgICAuY29kZWNfaWRzICAgICAgPSBtcGVnMl9tZXRhZGF0YV9jb2RlY19pZHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnNF91bnBhY2tfYmZyYW1lc19ic2YuYyBiL2xpYmF2Y29kZWMvbXBlZzRfdW5wYWNrX2JmcmFtZXNfYnNmLmMKaW5kZXggZGY0OWQzZi4uM2EwYmExMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnNF91bnBhY2tfYmZyYW1lc19ic2YuYworKysgYi9saWJhdmNvZGVjL21wZWc0X3VucGFja19iZnJhbWVzX2JzZi5jCkBAIC0yMCwxMiArMjAsMTIgQEAKICAqLwogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzZi5oIgogI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKIAogdHlwZWRlZiBzdHJ1Y3QgVW5wYWNrQkZyYW1lc0JTRkNvbnRleHQgewogICAgIHVpbnQ4X3QgKmJfZnJhbWVfYnVmOwogICAgIGludCAgICAgIGJfZnJhbWVfYnVmX3NpemU7Ci0gICAgaW50ICAgICAgdXBkYXRlZF9leHRyYWRhdGE7CiB9IFVucGFja0JGcmFtZXNCU0ZDb250ZXh0OwogCiAvKiBzZWFyY2ggbmV4dCBzdGFydCBjb2RlICovCkBAIC04MywxMTIgKzgzLDEyMiBAQAogICAgIHJldHVybiBkc3Q7CiB9CiAKLXN0YXRpYyBpbnQgbXBlZzRfdW5wYWNrX2JmcmFtZXNfZmlsdGVyKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgY2hhciAqYXJncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCAgICAgIGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleWZyYW1lKQorc3RhdGljIGludCBtcGVnNF91bnBhY2tfYmZyYW1lc19maWx0ZXIoQVZCU0ZDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpvdXQpCiB7Ci0gICAgVW5wYWNrQkZyYW1lc0JTRkNvbnRleHQgKmN0eCA9IGJzZmMtPnByaXZfZGF0YTsKKyAgICBVbnBhY2tCRnJhbWVzQlNGQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOwogICAgIGludCBwb3NfcCA9IC0xLCBuYl92b3AgPSAwLCBwb3Nfdm9wMiA9IC0xLCByZXQgPSAwOworICAgIEFWUGFja2V0ICppbjsKIAotICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiVGhlIG1wZWc0X3VucGFja19iZnJhbWVzIGJpdHN0cmVhbSBmaWx0ZXIgaXMgb25seSB1c2VmdWwgZm9yIG1wZWc0LlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQorICAgIHJldCA9IGZmX2JzZl9nZXRfcGFja2V0KGN0eCwgJmluKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIGlmICghY3R4LT51cGRhdGVkX2V4dHJhZGF0YSAmJiBhdmN0eC0+ZXh0cmFkYXRhKSB7Ci0gICAgICAgIGludCBwb3NfcF9leHQgPSAtMTsKLSAgICAgICAgc2Nhbl9idWZmZXIoYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplLCAmcG9zX3BfZXh0LCBOVUxMLCBOVUxMKTsKLSAgICAgICAgaWYgKHBvc19wX2V4dCA+PSAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKLSAgICAgICAgICAgICAgICAgICAiVXBkYXRpbmcgRGl2WCB1c2VyZGF0YSAocmVtb3ZlIHRyYWlsaW5nICdwJykgaW4gZXh0cmFkYXRhLlxuIik7Ci0gICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhW3Bvc19wX2V4dF0gPSAnXDAnOwotICAgICAgICB9Ci0gICAgICAgIGN0eC0+dXBkYXRlZF9leHRyYWRhdGEgPSAxOwotICAgIH0KLQotICAgIHNjYW5fYnVmZmVyKGJ1ZiwgYnVmX3NpemUsICZwb3NfcCwgJm5iX3ZvcCwgJnBvc192b3AyKTsKLSAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkZvdW5kICVkIFZPUCBzdGFydGNvZGUocykgaW4gdGhpcyBwYWNrZXQuXG4iLCBuYl92b3ApOworICAgIHNjYW5fYnVmZmVyKGluLT5kYXRhLCBpbi0+c2l6ZSwgJnBvc19wLCAmbmJfdm9wLCAmcG9zX3ZvcDIpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkZvdW5kICVkIFZPUCBzdGFydGNvZGUocykgaW4gdGhpcyBwYWNrZXQuXG4iLCBuYl92b3ApOwogCiAgICAgaWYgKHBvc192b3AyID49IDApIHsKLSAgICAgICAgaWYgKGN0eC0+Yl9mcmFtZV9idWYpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgIGlmIChzLT5iX2ZyYW1lX2J1ZikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgIk1pc3Npbmcgb25lIE4tVk9QIHBhY2tldCwgZGlzY2FyZGluZyBvbmUgQi1mcmFtZS5cbiIpOwotICAgICAgICAgICAgYXZfZnJlZXAoJmN0eC0+Yl9mcmFtZV9idWYpOwotICAgICAgICAgICAgY3R4LT5iX2ZyYW1lX2J1Zl9zaXplID0gMDsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5iX2ZyYW1lX2J1Zik7CisgICAgICAgICAgICBzLT5iX2ZyYW1lX2J1Zl9zaXplID0gMDsKICAgICAgICAgfQogICAgICAgICAvKiBzdG9yZSB0aGUgcGFja2VkIEItZnJhbWUgaW4gdGhlIEJTRkNvbnRleHQgKi8KLSAgICAgICAgY3R4LT5iX2ZyYW1lX2J1Zl9zaXplID0gYnVmX3NpemUgLSBwb3Nfdm9wMjsKLSAgICAgICAgY3R4LT5iX2ZyYW1lX2J1ZiAgICAgID0gY3JlYXRlX25ld19idWZmZXIoYnVmICsgcG9zX3ZvcDIsIGN0eC0+Yl9mcmFtZV9idWZfc2l6ZSk7Ci0gICAgICAgIGlmICghY3R4LT5iX2ZyYW1lX2J1ZikgewotICAgICAgICAgICAgY3R4LT5iX2ZyYW1lX2J1Zl9zaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPmJfZnJhbWVfYnVmX3NpemUgPSBpbi0+c2l6ZSAtIHBvc192b3AyOworICAgICAgICBzLT5iX2ZyYW1lX2J1ZiAgICAgID0gY3JlYXRlX25ld19idWZmZXIoaW4tPmRhdGEgKyBwb3Nfdm9wMiwgcy0+Yl9mcmFtZV9idWZfc2l6ZSk7CisgICAgICAgIGlmICghcy0+Yl9mcmFtZV9idWYpIHsKKyAgICAgICAgICAgIHMtPmJfZnJhbWVfYnVmX3NpemUgPSAwOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG5iX3ZvcCA+IDIpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgIkZvdW5kICVkIFZPUCBoZWFkZXJzIGluIG9uZSBwYWNrZXQsIG9ubHkgdW5wYWNraW5nIG9uZS5cbiIsIG5iX3ZvcCk7CiAgICAgfQogCi0gICAgaWYgKG5iX3ZvcCA9PSAxICYmIGN0eC0+Yl9mcmFtZV9idWYpIHsKKyAgICBpZiAobmJfdm9wID09IDEgJiYgcy0+Yl9mcmFtZV9idWYpIHsKICAgICAgICAgLyogdXNlIGZyYW1lIGZyb20gQlNGQ29udGV4dCAqLwotICAgICAgICAqcG91dGJ1ZiAgICAgID0gY3R4LT5iX2ZyYW1lX2J1ZjsKLSAgICAgICAgKnBvdXRidWZfc2l6ZSA9IGN0eC0+Yl9mcmFtZV9idWZfc2l6ZTsKLSAgICAgICAgLyogdGhlIG91dHB1dCBidWZmZXIgaXMgZGlzdGluY3QgZnJvbSB0aGUgaW5wdXQgYnVmZmVyICovCi0gICAgICAgIHJldCA9IDE7Ci0gICAgICAgIGlmIChidWZfc2l6ZSA8PSBNQVhfTlZPUF9TSVpFKSB7CisgICAgICAgIHJldCA9IGF2X3BhY2tldF9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZfcGFja2V0X2Zyb21fZGF0YShvdXQsIHMtPmJfZnJhbWVfYnVmLCBzLT5iX2ZyYW1lX2J1Zl9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW4tPnNpemUgPD0gTUFYX05WT1BfU0laRSkgewogICAgICAgICAgICAgLyogTi1WT1AgKi8KLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU2tpcHBpbmcgTi1WT1AuXG4iKTsKLSAgICAgICAgICAgIGN0eC0+Yl9mcmFtZV9idWYgICAgICA9IE5VTEw7Ci0gICAgICAgICAgICBjdHgtPmJfZnJhbWVfYnVmX3NpemUgPSAwOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiU2tpcHBpbmcgTi1WT1AuXG4iKTsKKyAgICAgICAgICAgIHMtPmJfZnJhbWVfYnVmICAgICAgPSBOVUxMOworICAgICAgICAgICAgcy0+Yl9mcmFtZV9idWZfc2l6ZSA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBjb3B5IHBhY2tldCBpbnRvIEJTRkNvbnRleHQgKi8KLSAgICAgICAgICAgIGN0eC0+Yl9mcmFtZV9idWZfc2l6ZSA9IGJ1Zl9zaXplOwotICAgICAgICAgICAgY3R4LT5iX2ZyYW1lX2J1ZiAgICAgID0gY3JlYXRlX25ld19idWZmZXIoYnVmICwgYnVmX3NpemUpOwotICAgICAgICAgICAgaWYgKCFjdHgtPmJfZnJhbWVfYnVmKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5iX2ZyYW1lX2J1Zl9zaXplID0gMDsKLSAgICAgICAgICAgICAgICBhdl9mcmVlcChwb3V0YnVmKTsKLSAgICAgICAgICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgcy0+Yl9mcmFtZV9idWZfc2l6ZSA9IGluLT5zaXplOworICAgICAgICAgICAgcy0+Yl9mcmFtZV9idWYgICAgICA9IGNyZWF0ZV9uZXdfYnVmZmVyKGluLT5kYXRhLCBpbi0+c2l6ZSk7CisgICAgICAgICAgICBpZiAoIXMtPmJfZnJhbWVfYnVmKSB7CisgICAgICAgICAgICAgICAgcy0+Yl9mcmFtZV9idWZfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobmJfdm9wID49IDIpIHsKICAgICAgICAgLyogdXNlIGZpcnN0IGZyYW1lIG9mIHRoZSBwYWNrZXQgKi8KLSAgICAgICAgKnBvdXRidWYgICAgICA9ICh1aW50OF90ICopIGJ1ZjsKLSAgICAgICAgKnBvdXRidWZfc2l6ZSA9IHBvc192b3AyOworICAgICAgICBhdl9wYWNrZXRfbW92ZV9yZWYob3V0LCBpbik7CisgICAgICAgIG91dC0+c2l6ZSA9IHBvc192b3AyOwogICAgIH0gZWxzZSBpZiAocG9zX3AgPj0gMCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlVwZGF0aW5nIERpdlggdXNlcmRhdGEgKHJlbW92ZSB0cmFpbGluZyAncCcpLlxuIik7Ci0gICAgICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKLSAgICAgICAgKnBvdXRidWYgICAgICA9IGNyZWF0ZV9uZXdfYnVmZmVyKGJ1ZiwgYnVmX3NpemUpOwotICAgICAgICBpZiAoISpwb3V0YnVmKSB7Ci0gICAgICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0ID0gYXZfcGFja2V0X21ha2Vfd3JpdGFibGUoaW4pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiVXBkYXRpbmcgRGl2WCB1c2VyZGF0YSAocmVtb3ZlIHRyYWlsaW5nICdwJykuXG4iKTsKKyAgICAgICAgYXZfcGFja2V0X21vdmVfcmVmKG91dCwgaW4pOwogICAgICAgICAvKiByZW1vdmUgJ3AnIChwYWNrZWQpIGZyb20gdGhlIGVuZCBvZiB0aGUgKERpdlgpIHVzZXJkYXRhIHN0cmluZyAqLwotICAgICAgICAoKnBvdXRidWYpW3Bvc19wXSA9ICdcMCc7Ci0gICAgICAgIC8qIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGRpc3RpbmN0IGZyb20gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgICAgICByZXQgPSAxOworICAgICAgICBvdXQtPmRhdGFbcG9zX3BdID0gJ1wwJzsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBjb3B5IHBhY2tldCAqLwotICAgICAgICAqcG91dGJ1ZiAgICAgID0gKHVpbnQ4X3QgKikgYnVmOwotICAgICAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CisgICAgICAgIGF2X3BhY2tldF9tb3ZlX3JlZihvdXQsIGluKTsKICAgICB9CiAKK2ZhaWw6CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihvdXQpOworICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBtcGVnNF91bnBhY2tfYmZyYW1lc19jbG9zZShBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMpCitzdGF0aWMgaW50IG1wZWc0X3VucGFja19iZnJhbWVzX2luaXQoQVZCU0ZDb250ZXh0ICpjdHgpCit7CisgICAgaWYgKGN0eC0+cGFyX2luLT5leHRyYWRhdGEpIHsKKyAgICAgICAgaW50IHBvc19wX2V4dCA9IC0xOworICAgICAgICBzY2FuX2J1ZmZlcihjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhLCBjdHgtPnBhcl9pbi0+ZXh0cmFkYXRhX3NpemUsICZwb3NfcF9leHQsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAocG9zX3BfZXh0ID49IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICAgICAiVXBkYXRpbmcgRGl2WCB1c2VyZGF0YSAocmVtb3ZlIHRyYWlsaW5nICdwJykgaW4gZXh0cmFkYXRhLlxuIik7CisgICAgICAgICAgICBjdHgtPnBhcl9vdXQtPmV4dHJhZGF0YVtwb3NfcF9leHRdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtcGVnNF91bnBhY2tfYmZyYW1lc19jbG9zZShBVkJTRkNvbnRleHQgKmJzZmMpCiB7CiAgICAgVW5wYWNrQkZyYW1lc0JTRkNvbnRleHQgKmN0eCA9IGJzZmMtPnByaXZfZGF0YTsKICAgICBhdl9mcmVlcCgmY3R4LT5iX2ZyYW1lX2J1Zik7CiB9CiAKLUFWQml0U3RyZWFtRmlsdGVyIGZmX21wZWc0X3VucGFja19iZnJhbWVzX2JzZiA9IHsKK3N0YXRpYyBjb25zdCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZHNbXSA9IHsKKyAgICBBVl9DT0RFQ19JRF9NUEVHNCwgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX21wZWc0X3VucGFja19iZnJhbWVzX2JzZiA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzRfdW5wYWNrX2JmcmFtZXMiLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihVbnBhY2tCRnJhbWVzQlNGQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gbXBlZzRfdW5wYWNrX2JmcmFtZXNfaW5pdCwKICAgICAuZmlsdGVyICAgICAgICAgPSBtcGVnNF91bnBhY2tfYmZyYW1lc19maWx0ZXIsCi0gICAgLmNsb3NlICAgICAgICAgID0gbXBlZzRfdW5wYWNrX2JmcmFtZXNfY2xvc2UKKyAgICAuY2xvc2UgICAgICAgICAgPSBtcGVnNF91bnBhY2tfYmZyYW1lc19jbG9zZSwKKyAgICAuY29kZWNfaWRzICAgICAgPSBjb2RlY19pZHMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnNGF1ZGlvLmMgYi9saWJhdmNvZGVjL21wZWc0YXVkaW8uYwppbmRleCAxODhkODQzLi4yMTk3MTQ3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWc0YXVkaW8uYworKysgYi9saWJhdmNvZGVjL21wZWc0YXVkaW8uYwpAQCAtMzMsMTUgKzMzLDIwIEBACiBzdGF0aWMgaW50IHBhcnNlX2NvbmZpZ19BTFMoR2V0Qml0Q29udGV4dCAqZ2IsIE1QRUc0QXVkaW9Db25maWcgKmMpCiB7CiAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMTEyKQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgaWYgKGdldF9iaXRzX2xvbmcoZ2IsIDMyKSAhPSBNS0JFVEFHKCdBJywnTCcsJ1MnLCdcMCcpKQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgLy8gb3ZlcnJpZGUgQXVkaW9TcGVjaWZpY0NvbmZpZyBjaGFubmVsIGNvbmZpZ3VyYXRpb24gYW5kIHNhbXBsZSByYXRlCiAgICAgLy8gd2hpY2ggYXJlIGJ1Z2d5IGluIG9sZCBBTFMgY29uZm9ybWFuY2UgZmlsZXMKICAgICBjLT5zYW1wbGVfcmF0ZSA9IGdldF9iaXRzX2xvbmcoZ2IsIDMyKTsKIAorICAgIGlmIChjLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlICVkXG4iLCBjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIC8vIHNraXAgbnVtYmVyIG9mIHNhbXBsZXMKICAgICBza2lwX2JpdHNfbG9uZyhnYiwgMzIpOwogCkBAIC03OCw2OSArODMsNjIgQEAKICAgICAgICAgYXZwcml2X21wZWc0YXVkaW9fc2FtcGxlX3JhdGVzWyppbmRleF07CiB9CiAKLWludCBhdnByaXZfbXBlZzRhdWRpb19nZXRfY29uZmlnKE1QRUc0QXVkaW9Db25maWcgKmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRfc2l6ZSwgaW50IHN5bmNfZXh0ZW5zaW9uKQoraW50IGZmX21wZWc0YXVkaW9fZ2V0X2NvbmZpZ19nYihNUEVHNEF1ZGlvQ29uZmlnICpjLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5bmNfZXh0ZW5zaW9uKQogewotICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgaW50IHNwZWNpZmljX2NvbmZpZ19iaXRpbmRleCwgcmV0OwotCi0gICAgaWYgKGJpdF9zaXplIDw9IDApCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotCi0gICAgcmV0ID0gaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgYml0X3NpemUpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgYy0+b2JqZWN0X3R5cGUgPSBnZXRfb2JqZWN0X3R5cGUoJmdiKTsKLSAgICBjLT5zYW1wbGVfcmF0ZSA9IGdldF9zYW1wbGVfcmF0ZSgmZ2IsICZjLT5zYW1wbGluZ19pbmRleCk7Ci0gICAgYy0+Y2hhbl9jb25maWcgPSBnZXRfYml0cygmZ2IsIDQpOworICAgIGludCBzdGFydF9iaXRfaW5kZXggPSBnZXRfYml0c19jb3VudChnYik7CisgICAgYy0+b2JqZWN0X3R5cGUgPSBnZXRfb2JqZWN0X3R5cGUoZ2IpOworICAgIGMtPnNhbXBsZV9yYXRlID0gZ2V0X3NhbXBsZV9yYXRlKGdiLCAmYy0+c2FtcGxpbmdfaW5kZXgpOworICAgIGMtPmNoYW5fY29uZmlnID0gZ2V0X2JpdHMoZ2IsIDQpOwogICAgIGlmIChjLT5jaGFuX2NvbmZpZyA8IEZGX0FSUkFZX0VMRU1TKGZmX21wZWc0YXVkaW9fY2hhbm5lbHMpKQogICAgICAgICBjLT5jaGFubmVscyA9IGZmX21wZWc0YXVkaW9fY2hhbm5lbHNbYy0+Y2hhbl9jb25maWddOwogICAgIGMtPnNiciA9IC0xOwogICAgIGMtPnBzICA9IC0xOwogICAgIGlmIChjLT5vYmplY3RfdHlwZSA9PSBBT1RfU0JSIHx8IChjLT5vYmplY3RfdHlwZSA9PSBBT1RfUFMgJiYKICAgICAgICAgLy8gY2hlY2sgZm9yIFc2MTMyIEFubmV4IFlZWVkgZHJhZnQgTVAzb25NUDQKLSAgICAgICAgIShzaG93X2JpdHMoJmdiLCAzKSAmIDB4MDMgJiYgIShzaG93X2JpdHMoJmdiLCA5KSAmIDB4M0YpKSkpIHsKKyAgICAgICAgIShzaG93X2JpdHMoZ2IsIDMpICYgMHgwMyAmJiAhKHNob3dfYml0cyhnYiwgOSkgJiAweDNGKSkpKSB7CiAgICAgICAgIGlmIChjLT5vYmplY3RfdHlwZSA9PSBBT1RfUFMpCiAgICAgICAgICAgICBjLT5wcyA9IDE7CiAgICAgICAgIGMtPmV4dF9vYmplY3RfdHlwZSA9IEFPVF9TQlI7CiAgICAgICAgIGMtPnNiciA9IDE7Ci0gICAgICAgIGMtPmV4dF9zYW1wbGVfcmF0ZSA9IGdldF9zYW1wbGVfcmF0ZSgmZ2IsICZjLT5leHRfc2FtcGxpbmdfaW5kZXgpOwotICAgICAgICBjLT5vYmplY3RfdHlwZSA9IGdldF9vYmplY3RfdHlwZSgmZ2IpOworICAgICAgICBjLT5leHRfc2FtcGxlX3JhdGUgPSBnZXRfc2FtcGxlX3JhdGUoZ2IsICZjLT5leHRfc2FtcGxpbmdfaW5kZXgpOworICAgICAgICBjLT5vYmplY3RfdHlwZSA9IGdldF9vYmplY3RfdHlwZShnYik7CiAgICAgICAgIGlmIChjLT5vYmplY3RfdHlwZSA9PSBBT1RfRVJfQlNBQykKLSAgICAgICAgICAgIGMtPmV4dF9jaGFuX2NvbmZpZyA9IGdldF9iaXRzKCZnYiwgNCk7CisgICAgICAgICAgICBjLT5leHRfY2hhbl9jb25maWcgPSBnZXRfYml0cyhnYiwgNCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYy0+ZXh0X29iamVjdF90eXBlID0gQU9UX05VTEw7CiAgICAgICAgIGMtPmV4dF9zYW1wbGVfcmF0ZSA9IDA7CiAgICAgfQotICAgIHNwZWNpZmljX2NvbmZpZ19iaXRpbmRleCA9IGdldF9iaXRzX2NvdW50KCZnYik7CisgICAgc3BlY2lmaWNfY29uZmlnX2JpdGluZGV4ID0gZ2V0X2JpdHNfY291bnQoZ2IpOwogCiAgICAgaWYgKGMtPm9iamVjdF90eXBlID09IEFPVF9BTFMpIHsKLSAgICAgICAgc2tpcF9iaXRzKCZnYiwgNSk7Ci0gICAgICAgIGlmIChzaG93X2JpdHNfbG9uZygmZ2IsIDI0KSAhPSBNS0JFVEFHKCdcMCcsJ0EnLCdMJywnUycpKQotICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCAyNCk7CisgICAgICAgIHNraXBfYml0cyhnYiwgNSk7CisgICAgICAgIGlmIChzaG93X2JpdHNfbG9uZyhnYiwgMjQpICE9IE1LQkVUQUcoJ1wwJywnQScsJ0wnLCdTJykpCisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgMjQpOwogCi0gICAgICAgIHNwZWNpZmljX2NvbmZpZ19iaXRpbmRleCA9IGdldF9iaXRzX2NvdW50KCZnYik7CisgICAgICAgIHNwZWNpZmljX2NvbmZpZ19iaXRpbmRleCA9IGdldF9iaXRzX2NvdW50KGdiKTsKIAotICAgICAgICBpZiAocGFyc2VfY29uZmlnX0FMUygmZ2IsIGMpKQotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXQgPSBwYXJzZV9jb25maWdfQUxTKGdiLCBjKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIGlmIChjLT5leHRfb2JqZWN0X3R5cGUgIT0gQU9UX1NCUiAmJiBzeW5jX2V4dGVuc2lvbikgewotICAgICAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdCgmZ2IpID4gMTUpIHsKLSAgICAgICAgICAgIGlmIChzaG93X2JpdHMoJmdiLCAxMSkgPT0gMHgyYjcpIHsgLy8gc3luYyBleHRlbnNpb24KLSAgICAgICAgICAgICAgICBnZXRfYml0cygmZ2IsIDExKTsKLSAgICAgICAgICAgICAgICBjLT5leHRfb2JqZWN0X3R5cGUgPSBnZXRfb2JqZWN0X3R5cGUoJmdiKTsKLSAgICAgICAgICAgICAgICBpZiAoYy0+ZXh0X29iamVjdF90eXBlID09IEFPVF9TQlIgJiYgKGMtPnNiciA9IGdldF9iaXRzMSgmZ2IpKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMtPmV4dF9zYW1wbGVfcmF0ZSA9IGdldF9zYW1wbGVfcmF0ZSgmZ2IsICZjLT5leHRfc2FtcGxpbmdfaW5kZXgpOworICAgICAgICB3aGlsZSAoZ2V0X2JpdHNfbGVmdChnYikgPiAxNSkgeworICAgICAgICAgICAgaWYgKHNob3dfYml0cyhnYiwgMTEpID09IDB4MmI3KSB7IC8vIHN5bmMgZXh0ZW5zaW9uCisgICAgICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDExKTsKKyAgICAgICAgICAgICAgICBjLT5leHRfb2JqZWN0X3R5cGUgPSBnZXRfb2JqZWN0X3R5cGUoZ2IpOworICAgICAgICAgICAgICAgIGlmIChjLT5leHRfb2JqZWN0X3R5cGUgPT0gQU9UX1NCUiAmJiAoYy0+c2JyID0gZ2V0X2JpdHMxKGdiKSkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBjLT5leHRfc2FtcGxlX3JhdGUgPSBnZXRfc2FtcGxlX3JhdGUoZ2IsICZjLT5leHRfc2FtcGxpbmdfaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYy0+ZXh0X3NhbXBsZV9yYXRlID09IGMtPnNhbXBsZV9yYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2JyID0gLTE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPiAxMSAmJiBnZXRfYml0cygmZ2IsIDExKSA9PSAweDU0OCkKLSAgICAgICAgICAgICAgICAgICAgYy0+cHMgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPiAxMSAmJiBnZXRfYml0cyhnYiwgMTEpID09IDB4NTQ4KQorICAgICAgICAgICAgICAgICAgICBjLT5wcyA9IGdldF9iaXRzMShnYik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBnZXRfYml0czEoJmdiKTsgLy8gc2tpcCAxIGJpdAorICAgICAgICAgICAgICAgIGdldF9iaXRzMShnYik7IC8vIHNraXAgMSBiaXQKICAgICAgICAgfQogICAgIH0KIApAQCAtMTUxLDQ1ICsxNDksMjEgQEAKICAgICBpZiAoKGMtPnBzID09IC0xICYmIGMtPm9iamVjdF90eXBlICE9IEFPVF9BQUNfTEMpIHx8IGMtPmNoYW5uZWxzICYgfjB4MDEpCiAgICAgICAgIGMtPnBzID0gMDsKIAotICAgIHJldHVybiBzcGVjaWZpY19jb25maWdfYml0aW5kZXg7CisgICAgcmV0dXJuIHNwZWNpZmljX2NvbmZpZ19iaXRpbmRleCAtIHN0YXJ0X2JpdF9pbmRleDsKIH0KIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IGNvcHlfYml0cyhQdXRCaXRDb250ZXh0ICpwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzKQoraW50IGF2cHJpdl9tcGVnNGF1ZGlvX2dldF9jb25maWcoTVBFRzRBdWRpb0NvbmZpZyAqYywgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdF9zaXplLCBpbnQgc3luY19leHRlbnNpb24pCiB7Ci0gICAgdW5zaWduZWQgaW50IGVsID0gZ2V0X2JpdHMoZ2IsIGJpdHMpOwotICAgIHB1dF9iaXRzKHBiLCBiaXRzLCBlbCk7Ci0gICAgcmV0dXJuIGVsOwotfQorICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHJldDsKIAotaW50IGF2cHJpdl9jb3B5X3BjZV9kYXRhKFB1dEJpdENvbnRleHQgKnBiLCBHZXRCaXRDb250ZXh0ICpnYikKLXsKLSAgICBpbnQgZml2ZV9iaXRfY2gsIGZvdXJfYml0X2NoLCBjb21tZW50X3NpemUsIGJpdHM7Ci0gICAgaW50IG9mZnNldCA9IHB1dF9iaXRzX2NvdW50KHBiKTsKKyAgICBpZiAoYml0X3NpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBjb3B5X2JpdHMocGIsIGdiLCAxMCk7ICAgICAgICAgICAgICAgICAgLy9UYWcsIE9iamVjdCBUeXBlLCBGcmVxdWVuY3kKLSAgICBmaXZlX2JpdF9jaCAgPSBjb3B5X2JpdHMocGIsIGdiLCA0KTsgICAgLy9Gcm9udAotICAgIGZpdmVfYml0X2NoICs9IGNvcHlfYml0cyhwYiwgZ2IsIDQpOyAgICAvL1NpZGUKLSAgICBmaXZlX2JpdF9jaCArPSBjb3B5X2JpdHMocGIsIGdiLCA0KTsgICAgLy9CYWNrCi0gICAgZm91cl9iaXRfY2ggID0gY29weV9iaXRzKHBiLCBnYiwgMik7ICAgIC8vTEZFCi0gICAgZm91cl9iaXRfY2ggKz0gY29weV9iaXRzKHBiLCBnYiwgMyk7ICAgIC8vRGF0YQotICAgIGZpdmVfYml0X2NoICs9IGNvcHlfYml0cyhwYiwgZ2IsIDQpOyAgICAvL0NvdXBsaW5nCi0gICAgaWYgKGNvcHlfYml0cyhwYiwgZ2IsIDEpKSAgICAgICAgICAgICAgIC8vTW9ubyBNaXhkb3duCi0gICAgICAgIGNvcHlfYml0cyhwYiwgZ2IsIDQpOwotICAgIGlmIChjb3B5X2JpdHMocGIsIGdiLCAxKSkgICAgICAgICAgICAgICAvL1N0ZXJlbyBNaXhkb3duCi0gICAgICAgIGNvcHlfYml0cyhwYiwgZ2IsIDQpOwotICAgIGlmIChjb3B5X2JpdHMocGIsIGdiLCAxKSkgICAgICAgICAgICAgICAvL01hdHJpeCBNaXhkb3duCi0gICAgICAgIGNvcHlfYml0cyhwYiwgZ2IsIDMpOwotICAgIGZvciAoYml0cyA9IGZpdmVfYml0X2NoKjUrZm91cl9iaXRfY2gqNDsgYml0cyA+IDE2OyBiaXRzIC09IDE2KQotICAgICAgICBjb3B5X2JpdHMocGIsIGdiLCAxNik7Ci0gICAgaWYgKGJpdHMpCi0gICAgICAgIGNvcHlfYml0cyhwYiwgZ2IsIGJpdHMpOwotICAgIGF2cHJpdl9hbGlnbl9wdXRfYml0cyhwYik7Ci0gICAgYWxpZ25fZ2V0X2JpdHMoZ2IpOwotICAgIGNvbW1lbnRfc2l6ZSA9IGNvcHlfYml0cyhwYiwgZ2IsIDgpOwotICAgIGZvciAoOyBjb21tZW50X3NpemUgPiAwOyBjb21tZW50X3NpemUtLSkKLSAgICAgICAgY29weV9iaXRzKHBiLCBnYiwgOCk7CisgICAgcmV0ID0gaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgYml0X3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgcmV0dXJuIHB1dF9iaXRzX2NvdW50KHBiKSAtIG9mZnNldDsKKyAgICByZXR1cm4gZmZfbXBlZzRhdWRpb19nZXRfY29uZmlnX2diKGMsICZnYiwgc3luY19leHRlbnNpb24pOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnNGF1ZGlvLmggYi9saWJhdmNvZGVjL21wZWc0YXVkaW8uaAppbmRleCA4MjM5MDgxLi5iOWNlYThhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWc0YXVkaW8uaAorKysgYi9saWJhdmNvZGVjL21wZWc0YXVkaW8uaApAQCAtMjMsNyArMjMsMTEgQEAKICNkZWZpbmUgQVZDT0RFQ19NUEVHNEFVRElPX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKwogI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJwdXRfYml0cy5oIgogCiB0eXBlZGVmIHN0cnVjdCBNUEVHNEF1ZGlvQ29uZmlnIHsKQEAgLTQxLDExICs0NSwyMSBAQAogICAgIGludCBmcmFtZV9sZW5ndGhfc2hvcnQ7CiB9IE1QRUc0QXVkaW9Db25maWc7CiAKLWV4dGVybiBhdl9leHBvcnQgY29uc3QgaW50IGF2cHJpdl9tcGVnNGF1ZGlvX3NhbXBsZV9yYXRlc1sxNl07CitleHRlcm4gYXZfZXhwb3J0X2F2Y29kZWMgY29uc3QgaW50IGF2cHJpdl9tcGVnNGF1ZGlvX3NhbXBsZV9yYXRlc1sxNl07CiBleHRlcm4gY29uc3QgdWludDhfdCBmZl9tcGVnNGF1ZGlvX2NoYW5uZWxzWzhdOwogCiAvKioKLSAqIFBhcnNlIE1QRUctNCBzeXN0ZW1zIGV4dHJhZGF0YSB0byByZXRyaWV2ZSBhdWRpbyBjb25maWd1cmF0aW9uLgorICogUGFyc2UgTVBFRy00IHN5c3RlbXMgZXh0cmFkYXRhIGZyb20gYSBwb3RlbnRpYWxseSB1bmFsaWduZWQgR2V0Qml0Q29udGV4dCB0byByZXRyaWV2ZSBhdWRpbyBjb25maWd1cmF0aW9uLgorICogQHBhcmFtW2luXSBjICAgICAgICBNUEVHNEF1ZGlvQ29uZmlnIHN0cnVjdHVyZSB0byBmaWxsLgorICogQHBhcmFtW2luXSBnYiAgICAgICBFeHRyYWRhdGEgZnJvbSBjb250YWluZXIuCisgKiBAcGFyYW1baW5dIHN5bmNfZXh0ZW5zaW9uIGxvb2sgZm9yIGEgc3luYyBleHRlbnNpb24gYWZ0ZXIgY29uZmlnIGlmIHRydWUuCisgKiBAcmV0dXJuIE9uIGVycm9yIC0xIGlzIHJldHVybmVkLCBvbiBzdWNjZXNzIEF1ZGlvU3BlY2lmaWNDb25maWcgYml0IGluZGV4IGluIGV4dHJhZGF0YS4KKyAqLworaW50IGZmX21wZWc0YXVkaW9fZ2V0X2NvbmZpZ19nYihNUEVHNEF1ZGlvQ29uZmlnICpjLCBHZXRCaXRDb250ZXh0ICpnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5bmNfZXh0ZW5zaW9uKTsKKworLyoqCisgKiBQYXJzZSBNUEVHLTQgc3lzdGVtcyBleHRyYWRhdGEgZnJvbSBhIHJhdyBidWZmZXIgdG8gcmV0cmlldmUgYXVkaW8gY29uZmlndXJhdGlvbi4KICAqIEBwYXJhbVtpbl0gYyAgICAgICAgTVBFRzRBdWRpb0NvbmZpZyBzdHJ1Y3R1cmUgdG8gZmlsbC4KICAqIEBwYXJhbVtpbl0gYnVmICAgICAgRXh0cmFkYXRhIGZyb20gY29udGFpbmVyLgogICogQHBhcmFtW2luXSBiaXRfc2l6ZSBFeHRyYWRhdGEgc2l6ZSBpbiBiaXRzLgpAQCAtMTA1LDYgKzExOSw0NCBAQAogI2RlZmluZSBNQVhfUENFX1NJWkUgMzIwIC8vLzxNYXhpbXVtIHNpemUgb2YgYSBQQ0UgaW5jbHVkaW5nIHRoZSAzLWJpdCBJRF9QQ0UKICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88bWFya2VyIGFuZCB0aGUgY29tbWVudAogCi1pbnQgYXZwcml2X2NvcHlfcGNlX2RhdGEoUHV0Qml0Q29udGV4dCAqcGIsIEdldEJpdENvbnRleHQgKmdiKTsKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBmZl9wY2VfY29weV9iaXRzKFB1dEJpdENvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCAqZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cykKK3sKKyAgICB1bnNpZ25lZCBpbnQgZWwgPSBnZXRfYml0cyhnYiwgYml0cyk7CisgICAgcHV0X2JpdHMocGIsIGJpdHMsIGVsKTsKKyAgICByZXR1cm4gZWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZmX2NvcHlfcGNlX2RhdGEoUHV0Qml0Q29udGV4dCAqcGIsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBmaXZlX2JpdF9jaCwgZm91cl9iaXRfY2gsIGNvbW1lbnRfc2l6ZSwgYml0czsKKyAgICBpbnQgb2Zmc2V0ID0gcHV0X2JpdHNfY291bnQocGIpOworCisgICAgZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDEwKTsgICAgICAgICAgICAgICAvLyBUYWcsIE9iamVjdCBUeXBlLCBGcmVxdWVuY3kKKyAgICBmaXZlX2JpdF9jaCAgPSBmZl9wY2VfY29weV9iaXRzKHBiLCBnYiwgNCk7IC8vIEZyb250CisgICAgZml2ZV9iaXRfY2ggKz0gZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDQpOyAvLyBTaWRlCisgICAgZml2ZV9iaXRfY2ggKz0gZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDQpOyAvLyBCYWNrCisgICAgZm91cl9iaXRfY2ggID0gZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDIpOyAvLyBMRkUKKyAgICBmb3VyX2JpdF9jaCArPSBmZl9wY2VfY29weV9iaXRzKHBiLCBnYiwgMyk7IC8vIERhdGEKKyAgICBmaXZlX2JpdF9jaCArPSBmZl9wY2VfY29weV9iaXRzKHBiLCBnYiwgNCk7IC8vIENvdXBsaW5nCisgICAgaWYgKGZmX3BjZV9jb3B5X2JpdHMocGIsIGdiLCAxKSkgICAgICAgICAgICAvLyBNb25vIE1peGRvd24KKyAgICAgICAgZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDQpOworICAgIGlmIChmZl9wY2VfY29weV9iaXRzKHBiLCBnYiwgMSkpICAgICAgICAgICAgLy8gU3RlcmVvIE1peGRvd24KKyAgICAgICAgZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDQpOworICAgIGlmIChmZl9wY2VfY29weV9iaXRzKHBiLCBnYiwgMSkpICAgICAgICAgICAgLy8gTWF0cml4IE1peGRvd24KKyAgICAgICAgZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDMpOworICAgIGZvciAoYml0cyA9IGZpdmVfYml0X2NoKjUrZm91cl9iaXRfY2gqNDsgYml0cyA+IDE2OyBiaXRzIC09IDE2KQorICAgICAgICBmZl9wY2VfY29weV9iaXRzKHBiLCBnYiwgMTYpOworICAgIGlmIChiaXRzKQorICAgICAgICBmZl9wY2VfY29weV9iaXRzKHBiLCBnYiwgYml0cyk7CisgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKHBiKTsKKyAgICBhbGlnbl9nZXRfYml0cyhnYik7CisgICAgY29tbWVudF9zaXplID0gZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDgpOworICAgIGZvciAoOyBjb21tZW50X3NpemUgPiAwOyBjb21tZW50X3NpemUtLSkKKyAgICAgICAgZmZfcGNlX2NvcHlfYml0cyhwYiwgZ2IsIDgpOworCisgICAgcmV0dXJuIHB1dF9iaXRzX2NvdW50KHBiKSAtIG9mZnNldDsKK30KIAogI2VuZGlmIC8qIEFWQ09ERUNfTVBFRzRBVURJT19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWc0ZGF0YS5oIGIvbGliYXZjb2RlYy9tcGVnNGRhdGEuaAppbmRleCAxYWM1ODQwLi40NzU2ZTllIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWc0ZGF0YS5oCisrKyBiL2xpYmF2Y29kZWMvbXBlZzRkYXRhLmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogY29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCi0gKiBIMjYzKyBzdXBwb3J0CisgKiBILjI2Mysgc3VwcG9ydAogICogY29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8qKgogICogQGZpbGUKLSAqIG1wZWc0IHRhYmxlcy4KKyAqIE1QRUctNCB0YWJsZXMuCiAgKi8KIAogI2lmbmRlZiBBVkNPREVDX01QRUc0REFUQV9ICkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAKLS8qIGRjIGVuY29kaW5nIGZvciBtcGVnNCAqLworLyogZGMgZW5jb2RpbmcgZm9yIE1QRUctNCAqLwogY29uc3QgdWludDhfdCBmZl9tcGVnNF9EQ3RhYl9sdW1bMTNdWzJdID0KIHsKICAgICB7MywzfSwgezMsMn0sIHsyLDJ9LCB7MiwzfSwgezEsM30sIHsxLDR9LCB7MSw1fSwgezEsNn0sIHsxLDd9LApAQCAtMzczLDQgKzM3MywxMjAgQEAKICAgICA5OSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMywgMAogfTsKIAorLyogTm90ZSB0aGVzZSBhcmUgZGlmZmVyZW50IGluIHN0dWRpbyBtb2RlICovCitjb25zdCB1aW50MTZfdCBmZl9tcGVnNF9zdHVkaW9fZGNfbHVtYVsxOV1bMl09eworICAgIHsweDBlLCAgNn0sIHsweDA2LCAgNX0sIHsweDAwLCAgNH0sIHsweDAyLCAgNH0sCisgICAgezB4MDcsICAzfSwgezB4MDUsICAzfSwgezB4MDMsICAzfSwgezB4MDIsICAzfSwKKyAgICB7MHgwNCwgIDN9LCB7MHgwNiwgIDN9LCB7MHgwMSwgIDR9LCB7MHgxZSwgIDd9LAorICAgIHsweDNlLCAgOH0sIHsweDdlLCAgOX0sIHsweGZlLCAxMH0sIHsweDFmZSwgMTF9LAorICAgIHsweDNmZSwgMTJ9LCB7MHg3ZmUsIDEzfSwgezB4N2ZmLCAxM30KK307CisKK2NvbnN0IHVpbnQxNl90IGZmX21wZWc0X3N0dWRpb19kY19jaHJvbWFbMTldWzJdPXsKKyAgICB7MHgwMCwgIDR9LCB7MHgwMiwgIDR9LCB7MHgwNywgIDN9LCB7MHgwNSwgIDN9LAorICAgIHsweDAzLCAgM30sIHsweDAyLCAgM30sIHsweDA0LCAgM30sIHsweDA2LCAgM30sCisgICAgezB4MDEsICA0fSwgezB4MDYsICA1fSwgezB4MGUsICA2fSwgezB4MWUsICA3fSwKKyAgICB7MHgzZSwgIDh9LCB7MHg3ZSwgIDl9LCB7MHhmZSwgMTB9LCB7MHgxZmUsIDExfSwKKyAgICB7MHgzZmUsIDEyfSwgezB4N2ZlLCAxM30sIHsweDdmZiwgMTN9Cit9OworCitjb25zdCB1aW50MTZfdCBmZl9tcGVnNF9zdHVkaW9faW50cmFbMTJdWzIyXVsyXT17CisgICAgeworICAgICAgICB7MHgwNSwgIDR9LCB7MHgwNCwgIDR9LCB7MHgwNSwgIDd9LCB7MHgwOSwgIDl9LAorICAgICAgICB7MHgyMSwgMTF9LCB7MHg0MSwgMTJ9LCB7MHg4MSwgMTN9LCB7MHgwMywgIDR9LAorICAgICAgICB7MHgwMywgIDV9LCB7MHgwNSwgIDZ9LCB7MHgwNCwgIDd9LCB7MHgwMywgIDd9LAorICAgICAgICB7MHgwNSwgIDh9LCB7MHgwMywgIDJ9LCB7MHgwNSwgIDN9LCB7MHgwNCwgIDN9LAorICAgICAgICB7MHgwMywgIDN9LCB7MHgwMiwgIDR9LCB7MHgwNCwgIDZ9LCB7MHgwMywgIDZ9LAorICAgICAgICB7MHgxMSwgMTB9LCB7MHg4MCwgMTN9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sCisgICAgICAgIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sCisgICAgICAgIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sCisgICAgICAgIHsweDAwLCAgMH0sIHsweDAwLCAgMH0sIHsweDAxLCAgMX0sIHsweDAxLCAgMn0sCisgICAgICAgIHsweDAxLCAgM30sIHsweDAxLCAgNH0sIHsweDAxLCAgNX0sIHsweDAzLCAgN30sCisgICAgICAgIHsweDA1LCAgOH0sIHsweDA0LCAgOH0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MDUsICAzfSwgIHsweDAzLCAgNX0sICB7MHgwMiwgIDV9LCAgezB4MDMsICA3fSwKKyAgICAgICAgezB4MDksICA5fSwgIHsweDEwMywgMTR9LCB7MHgxMDIsIDE0fSwgezB4MDQsICAzfSwKKyAgICAgICAgezB4MDMsICAzfSwgIHsweDAzLCAgNH0sICB7MHgwMiwgIDR9LCAgezB4MDMsICA2fSwKKyAgICAgICAgezB4MTEsIDEwfSwgIHsweDAzLCAgMn0sICB7MHgwMiwgIDN9LCAgezB4MDIsICA2fSwKKyAgICAgICAgezB4MDUsICA4fSwgIHsweDIxLCAxMX0sICB7MHg4MywgMTN9LCAgezB4MTAxLCAxNH0sCisgICAgICAgIHsweDIwMSwgMTV9LCB7MHg4MiwgMTN9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDA1LCAgNX0sIHsweDA1LCAgNH0sIHsweDA0LCAgNX0sIHsweDAzLCAgNn0sCisgICAgICAgIHsweDA5LCAgOX0sIHsweDgzLCAxM30sIHsweDgyLCAxM30sIHsweDAzLCAgM30sCisgICAgICAgIHsweDA0LCAgNH0sIHsweDAzLCAgNH0sIHsweDAzLCAgNX0sIHsweDA1LCAgOH0sCisgICAgICAgIHsweDgxLCAxM30sIHsweDAzLCAgMn0sIHsweDAyLCAgMn0sIHsweDAyLCAgNX0sCisgICAgICAgIHsweDAyLCAgNn0sIHsweDAzLCAgN30sIHsweDExLCAxMH0sIHsweDQzLCAxMn0sCisgICAgICAgIHsweDgwLCAxM30sIHsweDQyLCAxMn0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MDUsICA3fSwgIHsweDAzLCAgNH0sIHsweDAzLCAgNX0sICB7MHgwNCwgIDd9LAorICAgICAgICB7MHgwOSwgIDl9LCAgezB4ODMsIDEzfSwgezB4MTAxLCAxNH0sIHsweDAzLCAgM30sCisgICAgICAgIHsweDAyLCAgNH0sICB7MHgwNSwgIDZ9LCB7MHgwMywgIDd9LCAgezB4MTEsIDEwfSwKKyAgICAgICAgezB4MjAxLCAxNX0sIHsweDAzLCAgMn0sIHsweDAyLCAgMn0sICB7MHgwMiwgIDN9LAorICAgICAgICB7MHgwNCwgIDZ9LCAgezB4MDMsICA2fSwgezB4MDUsICA4fSwgIHsweDIxLCAxMX0sCisgICAgICAgIHsweDgyLCAxM30sICB7MHg4MSwgMTN9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDEzLCAxMH0sICB7MHgwMywgIDV9LCB7MHgwNSwgIDd9LCB7MHgxMiwgMTB9LAorICAgICAgICB7MHg0MywgMTJ9LCAgezB4ODMsIDEzfSwgezB4ODIsIDEzfSwgezB4MDIsICA1fSwKKyAgICAgICAgezB4MDQsICA3fSwgIHsweDA1LCAgOH0sIHsweDIzLCAxMX0sIHsweDgxLCAxM30sCisgICAgICAgIHsweDEwMSwgMTR9LCB7MHgwMywgIDJ9LCB7MHgwMiwgIDJ9LCB7MHgwMSwgIDJ9LAorICAgICAgICB7MHgwMSwgIDN9LCAgezB4MDMsICA2fSwgezB4MDMsICA3fSwgezB4MjIsIDExfSwKKyAgICAgICAgezB4MjAxLCAxNX0sIHsweDQyLCAxMn0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MjMsIDExfSwgIHsweDAxLCAgNH0sICB7MHgwNywgIDh9LCAgezB4MTMsIDEwfSwKKyAgICAgICAgezB4MjIsIDExfSwgIHsweDEwMywgMTR9LCB7MHgxMDIsIDE0fSwgezB4MDMsICA2fSwKKyAgICAgICAgezB4MDYsICA4fSwgIHsweDEyLCAxMH0sICB7MHg0MywgMTJ9LCAgezB4MTAxLCAxNH0sCisgICAgICAgIHsweDIwMSwgMTV9LCB7MHgwMywgIDN9LCAgezB4MDIsICAzfSwgIHsweDAzLCAgMn0sCisgICAgICAgIHsweDAyLCAgMn0sICB7MHgwMSwgIDN9LCAgezB4MDIsICA2fSwgIHsweDA1LCAgOH0sCisgICAgICAgIHsweDQyLCAxMn0sICB7MHg0MSwgMTJ9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDBiLCAgOX0sIHsweDAzLCAgNX0sIHsweDA3LCAgOH0sIHsweDA3LCAgN30sCisgICAgICAgIHsweDA2LCAgN30sIHsweDIzLCAxMX0sIHsweDQxLCAxMn0sIHsweDA1LCAgN30sCisgICAgICAgIHsweDA2LCAgOH0sIHsweDBhLCAgOX0sIHsweDEzLCAxMH0sIHsweDIyLCAxMX0sCisgICAgICAgIHsweDQwLCAxMn0sIHsweDAzLCAgNH0sIHsweDAyLCAgNH0sIHsweDAzLCAgMn0sCisgICAgICAgIHsweDAyLCAgMn0sIHsweDAxLCAgMn0sIHsweDAyLCAgNX0sIHsweDA0LCAgN30sCisgICAgICAgIHsweDEyLCAxMH0sIHsweDIxLCAxMX0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MTUsIDEwfSwgezB4MDMsICA2fSwgezB4MTQsIDEwfSwgezB4MjMsIDExfSwKKyAgICAgICAgezB4MDcsICA4fSwgezB4NDMsIDEyfSwgezB4ODEsIDEzfSwgezB4MDYsICA4fSwKKyAgICAgICAgezB4MGIsICA5fSwgezB4MTMsIDEwfSwgezB4MTIsIDEwfSwgezB4NDIsIDEyfSwKKyAgICAgICAgezB4ODAsIDEzfSwgezB4MDEsICA0fSwgezB4MDMsICAzfSwgezB4MDIsICAzfSwKKyAgICAgICAgezB4MDMsICAyfSwgezB4MDIsICAyfSwgezB4MDEsICAzfSwgezB4MDIsICA2fSwKKyAgICAgICAgezB4MjIsIDExfSwgezB4NDEsIDEyfQorICAgIH0sCisgICAgeworICAgICAgICB7MHg0MywgMTJ9LCB7MHgwNSwgIDZ9LCB7MHgwNywgIDh9LCB7MHgwNCwgIDZ9LAorICAgICAgICB7MHgwMywgIDZ9LCB7MHgxMywgMTB9LCB7MHg0MiwgMTJ9LCB7MHgwNSwgIDd9LAorICAgICAgICB7MHgwNCwgIDd9LCB7MHgwNiwgIDh9LCB7MHgxMiwgMTB9LCB7MHg0MSwgMTJ9LAorICAgICAgICB7MHg0MCwgMTJ9LCB7MHgwMywgIDV9LCB7MHgwMywgIDR9LCB7MHgwMywgIDN9LAorICAgICAgICB7MHgwMiwgIDN9LCB7MHgwMywgIDJ9LCB7MHgwMiwgIDJ9LCB7MHgwMiwgIDR9LAorICAgICAgICB7MHgwNSwgIDh9LCB7MHgxMSwgMTB9CisgICAgfSwKKyAgICB7CisgICAgICAgIHsweDgzLCAxM30sIHsweDA1LCAgN30sIHsweDA3LCAgOH0sIHsweDAzLCAgNH0sCisgICAgICAgIHsweDIxLCAxMX0sIHsweDgyLCAxM30sIHsweDgxLCAxM30sIHsweDA0LCAgN30sCisgICAgICAgIHsweDA2LCAgOH0sIHsweDBiLCAgOX0sIHsweDBhLCAgOX0sIHsweDExLCAxMH0sCisgICAgICAgIHsweDgwLCAxM30sIHsweDAzLCAgNX0sIHsweDAyLCAgNX0sIHsweDAyLCAgNH0sCisgICAgICAgIHsweDAzLCAgM30sIHsweDAyLCAgM30sIHsweDAzLCAgMn0sIHsweDAyLCAgMn0sCisgICAgICAgIHsweDAzLCAgNn0sIHsweDA5LCAgOX0KKyAgICB9LAorICAgIHsKKyAgICAgICAgezB4MTMsIDEwfSwgezB4MDMsICA1fSwgezB4MDMsICA2fSwgezB4MGQsICA5fSwKKyAgICAgICAgezB4MGMsICA5fSwgezB4MjEsIDExfSwgezB4MjAsIDExfSwgezB4MDIsICA1fSwKKyAgICAgICAgezB4MDIsICA2fSwgezB4MDcsICA4fSwgezB4MGIsICA5fSwgezB4MTIsIDEwfSwKKyAgICAgICAgezB4MTEsIDEwfSwgezB4MDUsICAzfSwgezB4MDQsICAzfSwgezB4MDUsICA0fSwKKyAgICAgICAgezB4MDQsICA0fSwgezB4MDMsICA0fSwgezB4MDIsICA0fSwgezB4MDMsICAzfSwKKyAgICAgICAgezB4MDMsICAyfSwgezB4MGEsICA5fQorICAgIH0KK307CisKICNlbmRpZiAvKiBBVkNPREVDX01QRUc0REFUQV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWc0dmlkZW8uYyBiL2xpYmF2Y29kZWMvbXBlZzR2aWRlby5jCmluZGV4IGQ3YzZmZTcuLjJhYWE5ZjcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZzR2aWRlby5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZzR2aWRlby5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QRUc0IGRlY29kZXIgLyBlbmNvZGVyIGNvbW1vbiBjb2RlLgorICogTVBFRy00IGRlY29kZXIgLyBlbmNvZGVyIGNvbW1vbiBjb2RlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKgpAQCAtNTcsNyArNTcsNyBAQAogICAgIG1lbXNldChzLT5hY192YWxbMl0gKyBjX3h5LCAwLCAoY193cmFwICAgICArIDEpICogMTYgKiBzaXplb2YoaW50MTZfdCkpOwogCiAgICAgLyogY2xlYW4gTVYgKi8KLSAgICAvLyB3ZSBjYW4ndCBjbGVhciB0aGUgTVZzIGFzIHRoZXkgbWlnaHQgYmUgbmVlZGVkIGJ5IGEgYiBmcmFtZQorICAgIC8vIHdlIGNhbid0IGNsZWFyIHRoZSBNVnMgYXMgdGhleSBtaWdodCBiZSBuZWVkZWQgYnkgYSBCLWZyYW1lCiAgICAgcy0+bGFzdF9tdlswXVswXVswXSA9CiAgICAgcy0+bGFzdF9tdlswXVswXVsxXSA9CiAgICAgcy0+bGFzdF9tdlsxXVswXVswXSA9CkBAIC02Nyw3ICs2Nyw3IEBACiAjZGVmaW5lIHRhYl9zaXplICgoc2lnbmVkKUZGX0FSUkFZX0VMRU1TKHMtPmRpcmVjdF9zY2FsZV9tdlswXSkpCiAjZGVmaW5lIHRhYl9iaWFzICh0YWJfc2l6ZSAvIDIpCiAKLS8vIHVzZWQgYnkgbXBlZzQgYW5kIHJ2MTAgZGVjb2RlcgorLy8gdXNlZCBieSBNUEVHLTQgYW5kIHJ2MTAgZGVjb2Rlcgogdm9pZCBmZl9tcGVnNF9pbml0X2RpcmVjdF9tdihNcGVnRW5jQ29udGV4dCAqcykKIHsKICAgICBpbnQgaTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZzR2aWRlby5oIGIvbGliYXZjb2RlYy9tcGVnNHZpZGVvLmgKaW5kZXggNTk5OGM3MS4uZGQwYTU5MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnNHZpZGVvLmgKKysrIGIvbGliYXZjb2RlYy9tcGVnNHZpZGVvLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTVBFRzQgZW5jb2Rlci9kZWNvZGVyIGludGVybmFsIGhlYWRlci4KKyAqIE1QRUctNCBlbmNvZGVyL2RlY29kZXIgaW50ZXJuYWwgaGVhZGVyLgogICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICoKQEAgLTQxLDggKzQxLDEzIEBACiAjZGVmaW5lIE5CSVRfVk9fVFlQRSAgICAgICAgICAgICA1CiAjZGVmaW5lIEFSVFNfVk9fVFlQRSAgICAgICAgICAgIDEwCiAjZGVmaW5lIEFDRV9WT19UWVBFICAgICAgICAgICAgIDEyCisjZGVmaW5lIFNJTVBMRV9TVFVESU9fVk9fVFlQRSAgIDE0CisjZGVmaW5lIENPUkVfU1RVRElPX1ZPX1RZUEUgICAgIDE1CiAjZGVmaW5lIEFEVl9TSU1QTEVfVk9fVFlQRSAgICAgIDE3CiAKKyNkZWZpbmUgVk9UX1ZJREVPX0lEIDEKKyNkZWZpbmUgVk9UX1NUSUxMX1RFWFRVUkVfSUQgMgorCiAvLyBhc3BlY3RfcmF0aW9faW5mbwogI2RlZmluZSBFWFRFTkRFRF9QQVIgMTUKIApAQCAtNTgsNiArNjMsMTAgQEAKICNkZWZpbmUgR09QX1NUQVJUQ09ERSAgICAgICAgMHgxQjMKICNkZWZpbmUgVklTVUFMX09CSl9TVEFSVENPREUgMHgxQjUKICNkZWZpbmUgVk9QX1NUQVJUQ09ERSAgICAgICAgMHgxQjYKKyNkZWZpbmUgU0xJQ0VfU1RBUlRDT0RFICAgICAgMHgxQjcKKyNkZWZpbmUgRVhUX1NUQVJUQ09ERSAgICAgICAgMHgxQjgKKworI2RlZmluZSBRVUFOVF9NQVRSSVhfRVhUX0lEICAweDMKIAogLyogc21hbGxlciBwYWNrZXRzIGxpa2VseSBkb24ndCBjb250YWluIGEgcmVhbCBmcmFtZSAqLwogI2RlZmluZSBNQVhfTlZPUF9TSVpFIDE5CkBAIC0xMDUsOSArMTE0LDE3IEBACiAgICAgaW50IGNwbHhfZXN0aW1hdGlvbl90cmFzaF9pOwogICAgIGludCBjcGx4X2VzdGltYXRpb25fdHJhc2hfcDsKICAgICBpbnQgY3BseF9lc3RpbWF0aW9uX3RyYXNoX2I7CisKKyAgICBWTEMgc3R1ZGlvX2ludHJhX3RhYlsxMl07CisgICAgVkxDIHN0dWRpb19sdW1hX2RjOworICAgIFZMQyBzdHVkaW9fY2hyb21hX2RjOworCisgICAgaW50IHJnYjsKIH0gTXBlZzREZWNDb250ZXh0OwogCi0vKiBkYyBlbmNvZGluZyBmb3IgbXBlZzQgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IG1wZWc0X2Jsb2NrX2NvdW50WzRdID0gezAsIDYsIDgsIDEyfTsKKworLyogZGMgZW5jb2RpbmcgZm9yIE1QRUctNCAqLwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfbXBlZzRfREN0YWJfbHVtWzEzXVsyXTsKIGV4dGVybiBjb25zdCB1aW50OF90IGZmX21wZWc0X0RDdGFiX2Nocm9tWzEzXVsyXTsKIApAQCAtMTM0LDYgKzE1MSwxMCBAQAogCiBleHRlcm4gY29uc3QgdWludDhfdCBmZl9tcGVnNF9kY190aHJlc2hvbGRbOF07CiAKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9tcGVnNF9zdHVkaW9fZGNfbHVtYVsxOV1bMl07CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfbXBlZzRfc3R1ZGlvX2RjX2Nocm9tYVsxOV1bMl07CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfbXBlZzRfc3R1ZGlvX2ludHJhWzEyXVsyMl1bMl07CisKIHZvaWQgZmZfbXBlZzRfZW5jb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBibG9ja1s2XVs2NF0sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3gsIGludCBtb3Rpb25feSk7CkBAIC0xNTIsMTMgKzE3MywxMyBAQAogaW50IGZmX21wZWc0X2RlY29kZV9wYXJ0aXRpb25zKE1wZWc0RGVjQ29udGV4dCAqY3R4KTsKIGludCBmZl9tcGVnNF9nZXRfdmlkZW9fcGFja2V0X3ByZWZpeF9sZW5ndGgoTXBlZ0VuY0NvbnRleHQgKnMpOwogaW50IGZmX21wZWc0X2RlY29kZV92aWRlb19wYWNrZXRfaGVhZGVyKE1wZWc0RGVjQ29udGV4dCAqY3R4KTsKK2ludCBmZl9tcGVnNF9kZWNvZGVfc3R1ZGlvX3NsaWNlX2hlYWRlcihNcGVnNERlY0NvbnRleHQgKmN0eCk7CiB2b2lkIGZmX21wZWc0X2luaXRfZGlyZWN0X212KE1wZWdFbmNDb250ZXh0ICpzKTsKIHZvaWQgZmZfbXBlZzR2aWRlb2RlY19zdGF0aWNfaW5pdCh2b2lkKTsKIGludCBmZl9tcGVnNF93b3JrYXJvdW5kX2J1Z3MoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKIGludCBmZl9tcGVnNF9mcmFtZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7CiAKIC8qKgotICoKICAqIEByZXR1cm4gdGhlIG1iX3R5cGUKICAqLwogaW50IGZmX21wZWc0X3NldF9kaXJlY3RfbXYoTXBlZ0VuY0NvbnRleHQgKnMsIGludCBteCwgaW50IG15KTsKQEAgLTIzNywxMiArMjU4LDEyIEBACiAgICAgICAgICAgICBpZiAobGV2ZWwgPCAwKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJkYzwwIGF0ICVkeCVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobGV2ZWwgPiAyMDQ4ICsgc2NhbGUpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgImRjIG92ZXJmbG93IGF0ICVkeCVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxldmVsIDwgMCkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZzR2aWRlb19wYXJzZXIuYyBiL2xpYmF2Y29kZWMvbXBlZzR2aWRlb19wYXJzZXIuYwppbmRleCBhYTVlODdhLi45ZWJiMDlhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWc0dmlkZW9fcGFyc2VyLmMKKysrIGIvbGliYXZjb2RlYy9tcGVnNHZpZGVvX3BhcnNlci5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QRUc0IFZpZGVvIGZyYW1lIGV4dHJhY3Rpb24KKyAqIE1QRUctNCB2aWRlbyBmcmFtZSBleHRyYWN0aW9uCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllcgogICoKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICBpZiAoIXZvcF9mb3VuZCkgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmX3NpemU7IGkrKykgewogICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBidWZbaV07Ci0gICAgICAgICAgICBpZiAoc3RhdGUgPT0gMHgxQjYpIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSBWT1BfU1RBUlRDT0RFKSB7CiAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgIHZvcF9mb3VuZCA9IDE7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC02MSw2ICs2MSw4IEBACiAgICAgICAgIGZvciAoOyBpIDwgYnVmX3NpemU7IGkrKykgewogICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBidWZbaV07CiAgICAgICAgICAgICBpZiAoKHN0YXRlICYgMHhGRkZGRkYwMCkgPT0gMHgxMDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU0xJQ0VfU1RBUlRDT0RFIHx8IHN0YXRlID09IEVYVF9TVEFSVENPREUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIHBjLT5mcmFtZV9zdGFydF9mb3VuZCA9IDA7CiAgICAgICAgICAgICAgICAgcGMtPnN0YXRlICAgICAgICAgICAgID0gLTE7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGkgLSAzOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnNHZpZGVvX3BhcnNlci5oIGIvbGliYXZjb2RlYy9tcGVnNHZpZGVvX3BhcnNlci5oCmluZGV4IDUwZjhiNDQuLjgwMDhlNjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZzR2aWRlb19wYXJzZXIuaAorKysgYi9saWJhdmNvZGVjL21wZWc0dmlkZW9fcGFyc2VyLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTVBFRzQgdmlkZW8gcGFyc2VyIHByb3RvdHlwZXMKKyAqIE1QRUctNCB2aWRlbyBwYXJzZXIgcHJvdG90eXBlcwogICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAogICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIKICAqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWc0dmlkZW9kZWMuYyBiL2xpYmF2Y29kZWMvbXBlZzR2aWRlb2RlYy5jCmluZGV4IDUyN2NiZTkuLmM5ODIzODAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZzR2aWRlb2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZzR2aWRlb2RlYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QRUc0IGRlY29kZXIuCisgKiBNUEVHLTQgZGVjb2RlcgogICogQ29weXJpZ2h0IChjKSAyMDAwLDIwMDEgRmFicmljZSBCZWxsYXJkCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxMCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgogICoKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAiZXJyb3JfcmVzaWxpZW5jZS5oIgorI2luY2x1ZGUgImh3YWNjZWwuaCIKICNpbmNsdWRlICJpZGN0ZHNwLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKQEAgLTQzLDYgKzQ0LDkgQEAKICNkZWZpbmUgU1BSSVRFX1RSQUpfVkxDX0JJVFMgNgogI2RlZmluZSBEQ19WTENfQklUUyA5CiAjZGVmaW5lIE1CX1RZUEVfQl9WTENfQklUUyA0CisjZGVmaW5lIFNUVURJT19JTlRSQV9CSVRTIDkKKworc3RhdGljIGludCBkZWNvZGVfc3R1ZGlvX3ZvbF9oZWFkZXIoTXBlZzREZWNDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKTsKIAogc3RhdGljIFZMQyBkY19sdW0sIGRjX2Nocm9tOwogc3RhdGljIFZMQyBzcHJpdGVfdHJhamVjdG9yeTsKQEAgLTE3MSwxMyArMTc1LDE1IEBACiAgICAgaW50IGEgICAgID0gMiA8PCBzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeTsKICAgICBpbnQgcmhvICAgPSAzICAtIHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5OwogICAgIGludCByICAgICA9IDE2IC8gYTsKLSAgICBpbnQgYWxwaGEgPSAwOworICAgIGludCBhbHBoYSA9IDE7CiAgICAgaW50IGJldGEgID0gMDsKICAgICBpbnQgdyAgICAgPSBzLT53aWR0aDsKICAgICBpbnQgaCAgICAgPSBzLT5oZWlnaHQ7CiAgICAgaW50IG1pbl9hYiwgaSwgdzIsIGgyLCB3MywgaDM7CiAgICAgaW50IHNwcml0ZV9yZWZbNF1bMl07CiAgICAgaW50IHZpcnR1YWxfcmVmWzJdWzJdOworICAgIGludDY0X3Qgc3ByaXRlX29mZnNldFsyXVsyXTsKKyAgICBpbnQ2NF90IHNwcml0ZV9kZWx0YVsyXVsyXTsKIAogICAgIC8vIG9ubHkgdHJ1ZSBmb3IgcmVjdGFuZ2xlIHNoYXBlcwogICAgIGNvbnN0IGludCB2b3BfcmVmWzRdWzJdID0geyB7IDAsIDAgfSwgICAgICAgICB7IHMtPndpZHRoLCAwIH0sCkBAIC0xODcsNiArMTkzLDEwIEBACiAgICAgaWYgKHcgPD0gMCB8fCBoIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCisgICAgLyogdGhlIGRlY29kZXIgd2FzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCBhbmQgd2UgY2Fubm90IGNvbnRpbnVlICovCisgICAgaWYgKHNwcml0ZV90cmFqZWN0b3J5LnRhYmxlID09IE5VTEwpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50czsgaSsrKSB7CiAgICAgICAgIGludCBsZW5ndGg7CiAgICAgICAgIGludCB4ID0gMCwgeSA9IDA7CkBAIC0xOTYsMTMgKzIwNiwxMyBAQAogICAgICAgICAgICAgeCA9IGdldF94Yml0cyhnYiwgbGVuZ3RoKTsKIAogICAgICAgICBpZiAoIShjdHgtPmRpdnhfdmVyc2lvbiA9PSA1MDAgJiYgY3R4LT5kaXZ4X2J1aWxkID09IDQxMykpCi0gICAgICAgICAgICBjaGVja19tYXJrZXIoZ2IsICJiZWZvcmUgc3ByaXRlX3RyYWplY3RvcnkiKTsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJiZWZvcmUgc3ByaXRlX3RyYWplY3RvcnkiKTsKIAogICAgICAgICBsZW5ndGggPSBnZXRfdmxjMihnYiwgc3ByaXRlX3RyYWplY3RvcnkudGFibGUsIFNQUklURV9UUkFKX1ZMQ19CSVRTLCAzKTsKICAgICAgICAgaWYgKGxlbmd0aCA+IDApCiAgICAgICAgICAgICB5ID0gZ2V0X3hiaXRzKGdiLCBsZW5ndGgpOwogCi0gICAgICAgIGNoZWNrX21hcmtlcihnYiwgImFmdGVyIHNwcml0ZV90cmFqZWN0b3J5Iik7CisgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJhZnRlciBzcHJpdGVfdHJhamVjdG9yeSIpOwogICAgICAgICBjdHgtPnNwcml0ZV90cmFqW2ldWzBdID0gZFtpXVswXSA9IHg7CiAgICAgICAgIGN0eC0+c3ByaXRlX3RyYWpbaV1bMV0gPSBkW2ldWzFdID0geTsKICAgICB9CkBAIC0yMTIsNyArMjIyLDcgQEAKICAgICB3aGlsZSAoKDEgPDwgYWxwaGEpIDwgdykKICAgICAgICAgYWxwaGErKzsKICAgICB3aGlsZSAoKDEgPDwgYmV0YSkgPCBoKQotICAgICAgICBiZXRhKys7ICAvKiB0eXBvIGluIHRoZSBtcGVnNCBzdGQgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHcnIGFuZCBoJyAqLworICAgICAgICBiZXRhKys7ICAvKiB0eXBvIGluIHRoZSBNUEVHLTQgc3RkIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB3JyBhbmQgaCcgKi8KICAgICB3MiA9IDEgPDwgYWxwaGE7CiAgICAgaDIgPSAxIDw8IGJldGE7CiAKQEAgLTIzNSw3OCArMjQ1LDc4IEBACiAgICAgLyogc3ByaXRlX3JlZlszXVswXSA9IChhID4+IDEpICogKDIgKiB2b3BfcmVmWzNdWzBdICsgZFswXVswXSArIGRbMV1bMF0gKyBkWzJdWzBdICsgZFszXVswXSk7CiAgICAgICogc3ByaXRlX3JlZlszXVsxXSA9IChhID4+IDEpICogKDIgKiB2b3BfcmVmWzNdWzFdICsgZFswXVsxXSArIGRbMV1bMV0gKyBkWzJdWzFdICsgZFszXVsxXSk7ICovCiAKLSAgICAvKiB0aGlzIGlzIG1vc3RseSBpZGVudGljYWwgdG8gdGhlIG1wZWc0IHN0ZCAoYW5kIGlzIHRvdGFsbHkgdW5yZWFkYWJsZQorICAgIC8qIFRoaXMgaXMgbW9zdGx5IGlkZW50aWNhbCB0byB0aGUgTVBFRy00IHN0ZCAoYW5kIGlzIHRvdGFsbHkgdW5yZWFkYWJsZQogICAgICAqIGJlY2F1c2Ugb2YgdGhhdC4uLikuIFBlcmhhcHMgaXQgc2hvdWxkIGJlIHJlb3JkZXJlZCB0byBiZSBtb3JlIHJlYWRhYmxlLgogICAgICAqIFRoZSBpZGVhIGJlaGluZCB0aGlzIHZpcnR1YWxfcmVmIG1lc3MgaXMgdG8gYmUgYWJsZSB0byB1c2Ugc2hpZnRzIGxhdGVyCiAgICAgICogcGVyIHBpeGVsIGluc3RlYWQgb2YgZGl2aWRlcyBzbyB0aGUgZGlzdGFuY2UgYmV0d2VlbiBwb2ludHMgaXMgY29udmVydGVkCiAgICAgICogZnJvbSB3JmggYmFzZWQgdG8gdzImaDIgYmFzZWQgd2hpY2ggYXJlIG9mIHRoZSAyXnggZm9ybS4gKi8KICAgICB2aXJ0dWFsX3JlZlswXVswXSA9IDE2ICogKHZvcF9yZWZbMF1bMF0gKyB3MikgKwogICAgICAgICAgICAgICAgICAgICAgICAgIFJPVU5ERURfRElWKCgodyAtIHcyKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyICogc3ByaXRlX3JlZlswXVswXSAtIDE2ICogdm9wX3JlZlswXVswXSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3MiAqIChyICogc3ByaXRlX3JlZlsxXVswXSAtIDE2ICogdm9wX3JlZlsxXVswXSkpLCB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociAqIHNwcml0ZV9yZWZbMF1bMF0gLSAxNkxMICogdm9wX3JlZlswXVswXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3MiAqIChyICogc3ByaXRlX3JlZlsxXVswXSAtIDE2TEwgKiB2b3BfcmVmWzFdWzBdKSksIHcpOwogICAgIHZpcnR1YWxfcmVmWzBdWzFdID0gMTYgKiB2b3BfcmVmWzBdWzFdICsKICAgICAgICAgICAgICAgICAgICAgICAgIFJPVU5ERURfRElWKCgodyAtIHcyKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIgKiBzcHJpdGVfcmVmWzBdWzFdIC0gMTYgKiB2b3BfcmVmWzBdWzFdKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdzIgKiAociAqIHNwcml0ZV9yZWZbMV1bMV0gLSAxNiAqIHZvcF9yZWZbMV1bMV0pKSwgdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAociAqIHNwcml0ZV9yZWZbMF1bMV0gLSAxNkxMICogdm9wX3JlZlswXVsxXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcyICogKHIgKiBzcHJpdGVfcmVmWzFdWzFdIC0gMTZMTCAqIHZvcF9yZWZbMV1bMV0pKSwgdyk7CiAgICAgdmlydHVhbF9yZWZbMV1bMF0gPSAxNiAqIHZvcF9yZWZbMF1bMF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgUk9VTkRFRF9ESVYoKChoIC0gaDIpICogKHIgKiBzcHJpdGVfcmVmWzBdWzBdIC0gMTYgKiB2b3BfcmVmWzBdWzBdKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDIgKiAociAqIHNwcml0ZV9yZWZbMl1bMF0gLSAxNiAqIHZvcF9yZWZbMl1bMF0pKSwgaCk7CisgICAgICAgICAgICAgICAgICAgICAgICBST1VOREVEX0RJVigoKGggLSBoMikgKiAociAqIHNwcml0ZV9yZWZbMF1bMF0gLSAxNkxMICogdm9wX3JlZlswXVswXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyICogKHIgKiBzcHJpdGVfcmVmWzJdWzBdIC0gMTZMTCAqIHZvcF9yZWZbMl1bMF0pKSwgaCk7CiAgICAgdmlydHVhbF9yZWZbMV1bMV0gPSAxNiAqICh2b3BfcmVmWzBdWzFdICsgaDIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJPVU5ERURfRElWKCgoaCAtIGgyKSAqIChyICogc3ByaXRlX3JlZlswXVsxXSAtIDE2ICogdm9wX3JlZlswXVsxXSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyICogKHIgKiBzcHJpdGVfcmVmWzJdWzFdIC0gMTYgKiB2b3BfcmVmWzJdWzFdKSksIGgpOworICAgICAgICAgICAgICAgICAgICAgICAgUk9VTkRFRF9ESVYoKChoIC0gaDIpICogKHIgKiBzcHJpdGVfcmVmWzBdWzFdIC0gMTZMTCAqIHZvcF9yZWZbMF1bMV0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMiAqIChyICogc3ByaXRlX3JlZlsyXVsxXSAtIDE2TEwgKiB2b3BfcmVmWzJdWzFdKSksIGgpOwogCiAgICAgc3dpdGNoIChjdHgtPm51bV9zcHJpdGVfd2FycGluZ19wb2ludHMpIHsKICAgICBjYXNlIDA6Ci0gICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMF0gPQotICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzBdWzFdID0KLSAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVswXSA9Ci0gICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMV1bMV0gPSAwOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMF0gID0gYTsKLSAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzBdWzFdICA9Ci0gICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSAgPSAwOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMV0gID0gYTsKKyAgICAgICAgc3ByaXRlX29mZnNldFswXVswXSAgICA9CisgICAgICAgIHNwcml0ZV9vZmZzZXRbMF1bMV0gICAgPQorICAgICAgICBzcHJpdGVfb2Zmc2V0WzFdWzBdICAgID0KKyAgICAgICAgc3ByaXRlX29mZnNldFsxXVsxXSAgICA9IDA7CisgICAgICAgIHNwcml0ZV9kZWx0YVswXVswXSAgICAgPSBhOworICAgICAgICBzcHJpdGVfZGVsdGFbMF1bMV0gICAgID0KKyAgICAgICAgc3ByaXRlX2RlbHRhWzFdWzBdICAgICA9IDA7CisgICAgICAgIHNwcml0ZV9kZWx0YVsxXVsxXSAgICAgPSBhOwogICAgICAgICBjdHgtPnNwcml0ZV9zaGlmdFswXSAgID0KICAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMV0gICA9IDA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTogICAgIC8vIEdNQyBvbmx5Ci0gICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMF0gPSBzcHJpdGVfcmVmWzBdWzBdIC0gYSAqIHZvcF9yZWZbMF1bMF07Ci0gICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMV0gPSBzcHJpdGVfcmVmWzBdWzFdIC0gYSAqIHZvcF9yZWZbMF1bMV07Ci0gICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMV1bMF0gPSAoKHNwcml0ZV9yZWZbMF1bMF0gPj4gMSkgfCAoc3ByaXRlX3JlZlswXVswXSAmIDEpKSAtCisgICAgICAgIHNwcml0ZV9vZmZzZXRbMF1bMF0gICAgPSBzcHJpdGVfcmVmWzBdWzBdIC0gYSAqIHZvcF9yZWZbMF1bMF07CisgICAgICAgIHNwcml0ZV9vZmZzZXRbMF1bMV0gICAgPSBzcHJpdGVfcmVmWzBdWzFdIC0gYSAqIHZvcF9yZWZbMF1bMV07CisgICAgICAgIHNwcml0ZV9vZmZzZXRbMV1bMF0gICAgPSAoKHNwcml0ZV9yZWZbMF1bMF0gPj4gMSkgfCAoc3ByaXRlX3JlZlswXVswXSAmIDEpKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICogKHZvcF9yZWZbMF1bMF0gLyAyKTsKLSAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVsxXSA9ICgoc3ByaXRlX3JlZlswXVsxXSA+PiAxKSB8IChzcHJpdGVfcmVmWzBdWzFdICYgMSkpIC0KKyAgICAgICAgc3ByaXRlX29mZnNldFsxXVsxXSAgICA9ICgoc3ByaXRlX3JlZlswXVsxXSA+PiAxKSB8IChzcHJpdGVfcmVmWzBdWzFdICYgMSkpIC0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgKiAodm9wX3JlZlswXVsxXSAvIDIpOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMF0gID0gYTsKLSAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzBdWzFdICA9Ci0gICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSAgPSAwOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMV0gID0gYTsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzBdWzBdICAgICA9IGE7CisgICAgICAgIHNwcml0ZV9kZWx0YVswXVsxXSAgICAgPQorICAgICAgICBzcHJpdGVfZGVsdGFbMV1bMF0gICAgID0gMDsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzFdWzFdICAgICA9IGE7CiAgICAgICAgIGN0eC0+c3ByaXRlX3NoaWZ0WzBdICAgPQogICAgICAgICBjdHgtPnNwcml0ZV9zaGlmdFsxXSAgID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyOgotICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzBdWzBdID0gKHNwcml0ZV9yZWZbMF1bMF0gPDwgKGFscGhhICsgcmhvKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzBdWzBdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXZvcF9yZWZbMF1bMF0pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyICogc3ByaXRlX3JlZlswXVsxXSAtIHZpcnR1YWxfcmVmWzBdWzFdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXZvcF9yZWZbMF1bMV0pICsgKDEgPDwgKGFscGhhICsgcmhvIC0gMSkpOwotICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzBdWzFdID0gKHNwcml0ZV9yZWZbMF1bMV0gPDwgKGFscGhhICsgcmhvKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVsxXSArIHZpcnR1YWxfcmVmWzBdWzFdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXZvcF9yZWZbMF1bMF0pICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC12b3BfcmVmWzBdWzFdKSArICgxIDw8IChhbHBoYSArIHJobyAtIDEpKTsKLSAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVswXSA9ICgoLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIgKiB2b3BfcmVmWzBdWzBdICsgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyICogc3ByaXRlX3JlZlswXVsxXSAtIHZpcnR1YWxfcmVmWzBdWzFdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yICogdm9wX3JlZlswXVsxXSArIDEpICsgMiAqIHcyICogciAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX3JlZlswXVswXSAtIDE2ICogdzIgKyAoMSA8PCAoYWxwaGEgKyByaG8gKyAxKSkpOwotICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzFdWzFdID0gKCgtciAqIHNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlswXVsxXSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMiAqIHZvcF9yZWZbMF1bMF0gKyAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzBdWzBdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yICogdm9wX3JlZlswXVsxXSArIDEpICsgMiAqIHcyICogciAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaXRlX3JlZlswXVsxXSAtIDE2ICogdzIgKyAoMSA8PCAoYWxwaGEgKyByaG8gKyAxKSkpOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMF0gPSAoLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMV0gPSAoK3IgKiBzcHJpdGVfcmVmWzBdWzFdIC0gdmlydHVhbF9yZWZbMF1bMV0pOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMF0gPSAoLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMF1bMV0pOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMV0gPSAoLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pOworICAgICAgICBzcHJpdGVfb2Zmc2V0WzBdWzBdICAgID0gKChpbnQ2NF90KSAgICAgIHNwcml0ZV9yZWZbMF1bMF0gKiAoMSA8PCBhbHBoYSArIHJobykpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCkgLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCkgICAgICAgIC12b3BfcmVmWzBdWzBdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpICByICogc3ByaXRlX3JlZlswXVsxXSAtIHZpcnR1YWxfcmVmWzBdWzFdKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpICAgICAgICAtdm9wX3JlZlswXVsxXSkgKyAoMSA8PCAoYWxwaGEgKyByaG8gLSAxKSk7CisgICAgICAgIHNwcml0ZV9vZmZzZXRbMF1bMV0gICAgPSAoKGludDY0X3QpICAgICAgc3ByaXRlX3JlZlswXVsxXSAqICgxIDw8IGFscGhhICsgcmhvKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KSAtciAqIHNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlswXVsxXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KSAgICAgICAgLXZvcF9yZWZbMF1bMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCkgLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCkgICAgICAgIC12b3BfcmVmWzBdWzFdKSArICgxIDw8IChhbHBoYSArIHJobyAtIDEpKTsKKyAgICAgICAgc3ByaXRlX29mZnNldFsxXVswXSAgICA9ICgoKGludDY0X3QpLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpLTIgKiAgICB2b3BfcmVmWzBdWzBdICsgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCkgciAqIHNwcml0ZV9yZWZbMF1bMV0gLSB2aXJ0dWFsX3JlZlswXVsxXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCktMiAqICAgIHZvcF9yZWZbMF1bMV0gKyAxKSArIDIgKiB3MiAqIHIgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCkgICAgIHNwcml0ZV9yZWZbMF1bMF0gLSAxNiAqIHcyICsgKDEgPDwgKGFscGhhICsgcmhvICsgMSkpKTsKKyAgICAgICAgc3ByaXRlX29mZnNldFsxXVsxXSAgICA9ICgoKGludDY0X3QpLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMF1bMV0pICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpLTIgKiAgICB2b3BfcmVmWzBdWzBdICsgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCktciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCktMiAqICAgIHZvcF9yZWZbMF1bMV0gKyAxKSArIDIgKiB3MiAqIHIgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSAgICAgIHNwcml0ZV9yZWZbMF1bMV0gLSAxNiAqIHcyICsgKDEgPDwgKGFscGhhICsgcmhvICsgMSkpKTsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzBdWzBdID0gKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzBdWzBdKTsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzBdWzFdID0gKCtyICogc3ByaXRlX3JlZlswXVsxXSAtIHZpcnR1YWxfcmVmWzBdWzFdKTsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzFdWzBdID0gKC1yICogc3ByaXRlX3JlZlswXVsxXSArIHZpcnR1YWxfcmVmWzBdWzFdKTsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzFdWzFdID0gKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzBdWzBdKTsKIAogICAgICAgICBjdHgtPnNwcml0ZV9zaGlmdFswXSAgPSBhbHBoYSArIHJobzsKICAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMV0gID0gYWxwaGEgKyByaG8gKyAyOwpAQCAtMzE1LDc4ICszMjUsMTE1IEBACiAgICAgICAgIG1pbl9hYiA9IEZGTUlOKGFscGhhLCBiZXRhKTsKICAgICAgICAgdzMgICAgID0gdzIgPj4gbWluX2FiOwogICAgICAgICBoMyAgICAgPSBoMiA+PiBtaW5fYWI7Ci0gICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMF0gPSAoc3ByaXRlX3JlZlswXVswXSA8PCAoYWxwaGEgKyBiZXRhICsgcmhvIC0gbWluX2FiKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzBdWzBdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMyAqICgtdm9wX3JlZlswXVswXSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzFdWzBdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3MyAqICgtdm9wX3JlZlswXVsxXSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYiAtIDEpKTsKLSAgICAgICAgcy0+c3ByaXRlX29mZnNldFswXVsxXSA9IChzcHJpdGVfcmVmWzBdWzFdIDw8IChhbHBoYSArIGJldGEgKyByaG8gLSBtaW5fYWIpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMF1bMV0pICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgzICogKC12b3BfcmVmWzBdWzBdKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMV1bMV0pICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHczICogKC12b3BfcmVmWzBdWzFdKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCAoYWxwaGEgKyBiZXRhICsgcmhvIC0gbWluX2FiIC0gMSkpOwotICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzFdWzBdID0gKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzBdWzBdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMyAqICgtMiAqIHZvcF9yZWZbMF1bMF0gKyAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMV1bMF0pICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHczICogKC0yICogdm9wX3JlZlswXVsxXSArIDEpICsgMiAqIHcyICogaDMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAqIHNwcml0ZV9yZWZbMF1bMF0gLSAxNiAqIHcyICogaDMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYiArIDEpKTsKLSAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVsxXSA9ICgtciAqIHNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlswXVsxXSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDMgKiAoLTIgKiB2b3BfcmVmWzBdWzBdICsgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC1yICogc3ByaXRlX3JlZlswXVsxXSArIHZpcnR1YWxfcmVmWzFdWzFdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3MyAqICgtMiAqIHZvcF9yZWZbMF1bMV0gKyAxKSArIDIgKiB3MiAqIGgzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgKiBzcHJpdGVfcmVmWzBdWzFdIC0gMTYgKiB3MiAqIGgzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IChhbHBoYSArIGJldGEgKyByaG8gLSBtaW5fYWIgKyAxKSk7Ci0gICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVswXSA9ICgtciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSkgKiBoMzsKLSAgICAgICAgcy0+c3ByaXRlX2RlbHRhWzBdWzFdID0gKC1yICogc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzFdWzBdKSAqIHczOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMF0gPSAoLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMF1bMV0pICogaDM7Ci0gICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVsxXSA9ICgtciAqIHNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlsxXVsxXSkgKiB3MzsKKyAgICAgICAgc3ByaXRlX29mZnNldFswXVswXSAgICA9ICgoaW50NjRfdClzcHJpdGVfcmVmWzBdWzBdICogKDEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYikpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMF1bMF0pICogaDMgKiAoLXZvcF9yZWZbMF1bMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCktciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlsxXVswXSkgKiB3MyAqICgtdm9wX3JlZlswXVsxXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KTEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYiAtIDEpKTsKKyAgICAgICAgc3ByaXRlX29mZnNldFswXVsxXSAgICA9ICgoaW50NjRfdClzcHJpdGVfcmVmWzBdWzFdICogKDEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYikpKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMF1bMV0pICogaDMgKiAoLXZvcF9yZWZbMF1bMF0pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCktciAqIHNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlsxXVsxXSkgKiB3MyAqICgtdm9wX3JlZlswXVsxXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KTEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYiAtIDEpKTsKKyAgICAgICAgc3ByaXRlX29mZnNldFsxXVswXSAgICA9ICgoaW50NjRfdCktciAqIHNwcml0ZV9yZWZbMF1bMF0gKyB2aXJ0dWFsX3JlZlswXVswXSkgKiBoMyAqICgtMiAqIHZvcF9yZWZbMF1bMF0gKyAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpLXIgKiBzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMV1bMF0pICogdzMgKiAoLTIgKiB2b3BfcmVmWzBdWzFdICsgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KTIgKiB3MiAqIGgzICogciAqIHNwcml0ZV9yZWZbMF1bMF0gLSAxNiAqIHcyICogaDMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KTEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYiArIDEpKTsKKyAgICAgICAgc3ByaXRlX29mZnNldFsxXVsxXSAgICA9ICgoaW50NjRfdCktciAqIHNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlswXVsxXSkgKiBoMyAqICgtMiAqIHZvcF9yZWZbMF1bMF0gKyAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3QpLXIgKiBzcHJpdGVfcmVmWzBdWzFdICsgdmlydHVhbF9yZWZbMV1bMV0pICogdzMgKiAoLTIgKiB2b3BfcmVmWzBdWzFdICsgMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KTIgKiB3MiAqIGgzICogciAqIHNwcml0ZV9yZWZbMF1bMV0gLSAxNiAqIHcyICogaDMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQ2NF90KTEgPDwgKGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYiArIDEpKTsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzBdWzBdID0gKC1yICogKGludDY0X3Qpc3ByaXRlX3JlZlswXVswXSArIHZpcnR1YWxfcmVmWzBdWzBdKSAqIGgzOworICAgICAgICBzcHJpdGVfZGVsdGFbMF1bMV0gPSAoLXIgKiAoaW50NjRfdClzcHJpdGVfcmVmWzBdWzBdICsgdmlydHVhbF9yZWZbMV1bMF0pICogdzM7CisgICAgICAgIHNwcml0ZV9kZWx0YVsxXVswXSA9ICgtciAqIChpbnQ2NF90KXNwcml0ZV9yZWZbMF1bMV0gKyB2aXJ0dWFsX3JlZlswXVsxXSkgKiBoMzsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzFdWzFdID0gKC1yICogKGludDY0X3Qpc3ByaXRlX3JlZlswXVsxXSArIHZpcnR1YWxfcmVmWzFdWzFdKSAqIHczOwogCiAgICAgICAgIGN0eC0+c3ByaXRlX3NoaWZ0WzBdICA9IGFscGhhICsgYmV0YSArIHJobyAtIG1pbl9hYjsKICAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMV0gID0gYWxwaGEgKyBiZXRhICsgcmhvIC0gbWluX2FiICsgMjsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIC8qIHRyeSB0byBzaW1wbGlmeSB0aGUgc2l0dWF0aW9uICovCi0gICAgaWYgKHMtPnNwcml0ZV9kZWx0YVswXVswXSA9PSBhIDw8IGN0eC0+c3ByaXRlX3NoaWZ0WzBdICYmCi0gICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVsxXSA9PSAwICYmCi0gICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVswXSA9PSAwICYmCi0gICAgICAgIHMtPnNwcml0ZV9kZWx0YVsxXVsxXSA9PSBhIDw8IGN0eC0+c3ByaXRlX3NoaWZ0WzBdKSB7Ci0gICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMF1bMF0gPj49IGN0eC0+c3ByaXRlX3NoaWZ0WzBdOwotICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzBdWzFdID4+PSBjdHgtPnNwcml0ZV9zaGlmdFswXTsKLSAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVswXSA+Pj0gY3R4LT5zcHJpdGVfc2hpZnRbMV07Ci0gICAgICAgIHMtPnNwcml0ZV9vZmZzZXRbMV1bMV0gPj49IGN0eC0+c3ByaXRlX3NoaWZ0WzFdOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMF0gPSBhOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMF1bMV0gPSAwOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMF0gPSAwOwotICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1bMV0gPSBhOworICAgIGlmIChzcHJpdGVfZGVsdGFbMF1bMF0gPT0gYSA8PCBjdHgtPnNwcml0ZV9zaGlmdFswXSAmJgorICAgICAgICBzcHJpdGVfZGVsdGFbMF1bMV0gPT0gMCAmJgorICAgICAgICBzcHJpdGVfZGVsdGFbMV1bMF0gPT0gMCAmJgorICAgICAgICBzcHJpdGVfZGVsdGFbMV1bMV0gPT0gYSA8PCBjdHgtPnNwcml0ZV9zaGlmdFswXSkgeworICAgICAgICBzcHJpdGVfb2Zmc2V0WzBdWzBdID4+PSBjdHgtPnNwcml0ZV9zaGlmdFswXTsKKyAgICAgICAgc3ByaXRlX29mZnNldFswXVsxXSA+Pj0gY3R4LT5zcHJpdGVfc2hpZnRbMF07CisgICAgICAgIHNwcml0ZV9vZmZzZXRbMV1bMF0gPj49IGN0eC0+c3ByaXRlX3NoaWZ0WzFdOworICAgICAgICBzcHJpdGVfb2Zmc2V0WzFdWzFdID4+PSBjdHgtPnNwcml0ZV9zaGlmdFsxXTsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzBdWzBdID0gYTsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzBdWzFdID0gMDsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzFdWzBdID0gMDsKKyAgICAgICAgc3ByaXRlX2RlbHRhWzFdWzFdID0gYTsKICAgICAgICAgY3R4LT5zcHJpdGVfc2hpZnRbMF0gPSAwOwogICAgICAgICBjdHgtPnNwcml0ZV9zaGlmdFsxXSA9IDA7CiAgICAgICAgIHMtPnJlYWxfc3ByaXRlX3dhcnBpbmdfcG9pbnRzID0gMTsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgc2hpZnRfeSA9IDE2IC0gY3R4LT5zcHJpdGVfc2hpZnRbMF07CiAgICAgICAgIGludCBzaGlmdF9jID0gMTYgLSBjdHgtPnNwcml0ZV9zaGlmdFsxXTsKKwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0WzBdW2ldIDw8PSBzaGlmdF95OwotICAgICAgICAgICAgcy0+c3ByaXRlX29mZnNldFsxXVtpXSA8PD0gc2hpZnRfYzsKLSAgICAgICAgICAgIHMtPnNwcml0ZV9kZWx0YVswXVtpXSAgPDw9IHNoaWZ0X3k7Ci0gICAgICAgICAgICBzLT5zcHJpdGVfZGVsdGFbMV1baV0gIDw8PSBzaGlmdF95OworICAgICAgICAgICAgaWYgKHNoaWZ0X2MgPCAwIHx8IHNoaWZ0X3kgPCAwIHx8CisgICAgICAgICAgICAgICAgRkZBQlMoICBzcHJpdGVfb2Zmc2V0WzBdW2ldKSA+PSBJTlRfTUFYID4+IHNoaWZ0X3kgIHx8CisgICAgICAgICAgICAgICAgRkZBQlMoICBzcHJpdGVfb2Zmc2V0WzFdW2ldKSA+PSBJTlRfTUFYID4+IHNoaWZ0X2MgIHx8CisgICAgICAgICAgICAgICAgRkZBQlMoICAgc3ByaXRlX2RlbHRhWzBdW2ldKSA+PSBJTlRfTUFYID4+IHNoaWZ0X3kgIHx8CisgICAgICAgICAgICAgICAgRkZBQlMoICAgc3ByaXRlX2RlbHRhWzFdW2ldKSA+PSBJTlRfTUFYID4+IHNoaWZ0X3kKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlRvbyBsYXJnZSBzcHJpdGUgc2hpZnQsIGRlbHRhIG9yIG9mZnNldCIpOworICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBzcHJpdGVfb2Zmc2V0WzBdW2ldICAgICo9IDEgPDwgc2hpZnRfeTsKKyAgICAgICAgICAgIHNwcml0ZV9vZmZzZXRbMV1baV0gICAgKj0gMSA8PCBzaGlmdF9jOworICAgICAgICAgICAgc3ByaXRlX2RlbHRhWzBdW2ldICAgICAqPSAxIDw8IHNoaWZ0X3k7CisgICAgICAgICAgICBzcHJpdGVfZGVsdGFbMV1baV0gICAgICo9IDEgPDwgc2hpZnRfeTsKICAgICAgICAgICAgIGN0eC0+c3ByaXRlX3NoaWZ0W2ldICAgICA9IDE2OworCisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgaW50NjRfdCBzZFsyXSA9IHsKKyAgICAgICAgICAgICAgICBzcHJpdGVfZGVsdGFbaV1bMF0gLSBhICogKDFMTDw8MTYpLAorICAgICAgICAgICAgICAgIHNwcml0ZV9kZWx0YVtpXVsxXSAtIGEgKiAoMUxMPDwxNikKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGlmIChsbGFicyhzcHJpdGVfb2Zmc2V0WzBdW2ldICsgc3ByaXRlX2RlbHRhW2ldWzBdICogKHcrMTZMTCkpID49IElOVF9NQVggfHwKKyAgICAgICAgICAgICAgICBsbGFicyhzcHJpdGVfb2Zmc2V0WzBdW2ldICsgc3ByaXRlX2RlbHRhW2ldWzFdICogKGgrMTZMTCkpID49IElOVF9NQVggfHwKKyAgICAgICAgICAgICAgICBsbGFicyhzcHJpdGVfb2Zmc2V0WzBdW2ldICsgc3ByaXRlX2RlbHRhW2ldWzBdICogKHcrMTZMTCkgKyBzcHJpdGVfZGVsdGFbaV1bMV0gKiAoaCsxNkxMKSkgPj0gSU5UX01BWCB8fAorICAgICAgICAgICAgICAgIGxsYWJzKHNwcml0ZV9kZWx0YVtpXVswXSAqICh3KzE2TEwpKSA+PSBJTlRfTUFYIHx8CisgICAgICAgICAgICAgICAgbGxhYnMoc3ByaXRlX2RlbHRhW2ldWzFdICogKGgrMTZMTCkpID49IElOVF9NQVggfHwKKyAgICAgICAgICAgICAgICBsbGFicyhzZFswXSkgPj0gSU5UX01BWCB8fAorICAgICAgICAgICAgICAgIGxsYWJzKHNkWzFdKSA+PSBJTlRfTUFYIHx8CisgICAgICAgICAgICAgICAgbGxhYnMoc3ByaXRlX29mZnNldFswXVtpXSArIHNkWzBdICogKHcrMTZMTCkpID49IElOVF9NQVggfHwKKyAgICAgICAgICAgICAgICBsbGFicyhzcHJpdGVfb2Zmc2V0WzBdW2ldICsgc2RbMV0gKiAoaCsxNkxMKSkgPj0gSU5UX01BWCB8fAorICAgICAgICAgICAgICAgIGxsYWJzKHNwcml0ZV9vZmZzZXRbMF1baV0gKyBzZFswXSAqICh3KzE2TEwpICsgc2RbMV0gKiAoaCsxNkxMKSkgPj0gSU5UX01BWAorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiT3ZlcmZsb3cgb24gc3ByaXRlIHBvaW50cyIpOworICAgICAgICAgICAgICAgIGdvdG8gb3ZlcmZsb3c7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcy0+cmVhbF9zcHJpdGVfd2FycGluZ19wb2ludHMgPSBjdHgtPm51bV9zcHJpdGVfd2FycGluZ19wb2ludHM7CiAgICAgfQogCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBzLT5zcHJpdGVfb2Zmc2V0W2kmMV1baT4+MV0gPSBzcHJpdGVfb2Zmc2V0W2kmMV1baT4+MV07CisgICAgICAgIHMtPnNwcml0ZV9kZWx0YSBbaSYxXVtpPj4xXSA9IHNwcml0ZV9kZWx0YSBbaSYxXVtpPj4xXTsKKyAgICB9CisKICAgICByZXR1cm4gMDsKK292ZXJmbG93OgorICAgIG1lbXNldChzLT5zcHJpdGVfb2Zmc2V0LCAwLCBzaXplb2Yocy0+c3ByaXRlX29mZnNldCkpOworICAgIG1lbXNldChzLT5zcHJpdGVfZGVsdGEsIDAsIHNpemVvZihzLT5zcHJpdGVfZGVsdGEpKTsKKyAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiB9CiAKIHN0YXRpYyBpbnQgZGVjb2RlX25ld19wcmVkKE1wZWc0RGVjQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYikgeworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKICAgICBpbnQgbGVuID0gRkZNSU4oY3R4LT50aW1lX2luY3JlbWVudF9iaXRzICsgMywgMTUpOwogCiAgICAgZ2V0X2JpdHMoZ2IsIGxlbik7CiAgICAgaWYgKGdldF9iaXRzMShnYikpCiAgICAgICAgIGdldF9iaXRzKGdiLCBsZW4pOwotICAgIGNoZWNrX21hcmtlcihnYiwgImFmdGVyIG5ld19wcmVkIik7CisgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIG5ld19wcmVkIik7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTQwNCw3ICs0NTEsNyBAQAogCiAgICAgLyogaXMgdGhlcmUgZW5vdWdoIHNwYWNlIGxlZnQgZm9yIGEgdmlkZW8gcGFja2V0ICsgaGVhZGVyICovCiAgICAgaWYgKGdldF9iaXRzX2NvdW50KCZzLT5nYikgPiBzLT5nYi5zaXplX2luX2JpdHMgLSAyMCkKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIGZvciAobGVuID0gMDsgbGVuIDwgMzI7IGxlbisrKQogICAgICAgICBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpCkBAIC00MTIsNyArNDU5LDcgQEAKIAogICAgIGlmIChsZW4gIT0gZmZfbXBlZzRfZ2V0X3ZpZGVvX3BhY2tldF9wcmVmaXhfbGVuZ3RoKHMpKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibWFya2VyIGRvZXMgbm90IG1hdGNoIGZfY29kZVxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgaWYgKGN0eC0+c2hhcGUgIT0gUkVDVF9TSEFQRSkgewpAQCAtNDIxLDEwICs0NjgsMTAgQEAKICAgICB9CiAKICAgICBtYl9udW0gPSBnZXRfYml0cygmcy0+Z2IsIG1iX251bV9iaXRzKTsKLSAgICBpZiAobWJfbnVtID49IHMtPm1iX251bSkgeworICAgIGlmIChtYl9udW0gPj0gcy0+bWJfbnVtIHx8ICFtYl9udW0pIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiaWxsZWdhbCBtYl9udW0gaW4gdmlkZW8gcGFja2V0ICglZCAlZCkgXG4iLCBtYl9udW0sIHMtPm1iX251bSk7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgcy0+bWJfeCA9IG1iX251bSAlIHMtPm1iX3dpZHRoOwpAQCAtNDQ1LDkgKzQ5Miw5IEBACiAgICAgICAgIHdoaWxlIChnZXRfYml0czEoJnMtPmdiKSAhPSAwKQogICAgICAgICAgICAgdGltZV9pbmNyKys7CiAKLSAgICAgICAgY2hlY2tfbWFya2VyKCZzLT5nYiwgImJlZm9yZSB0aW1lX2luY3JlbWVudCBpbiB2aWRlbyBwYWNrZWQgaGVhZGVyIik7CisgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgJnMtPmdiLCAiYmVmb3JlIHRpbWVfaW5jcmVtZW50IGluIHZpZGVvIHBhY2tlZCBoZWFkZXIiKTsKICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzKTsgICAgICAvKiB0aW1lX2luY3JlbWVudCAqLwotICAgICAgICBjaGVja19tYXJrZXIoJnMtPmdiLCAiYmVmb3JlIHZvcF9jb2RpbmdfdHlwZSBpbiB2aWRlbyBwYWNrZWQgaGVhZGVyIik7CisgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgJnMtPmdiLCAiYmVmb3JlIHZvcF9jb2RpbmdfdHlwZSBpbiB2aWRlbyBwYWNrZWQgaGVhZGVyIik7CiAKICAgICAgICAgc2tpcF9iaXRzKCZzLT5nYiwgMik7IC8qIHZvcCBjb2RpbmcgdHlwZSAqLwogICAgICAgICAvLyBGSVhNRSBub3QgcmVjdCBzdHVmZiBoZXJlCkBAIC00ODQsNiArNTMxLDU1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHJlc2V0X3N0dWRpb19kY19wcmVkaWN0b3JzKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIC8qIFJlc2V0IERDIFByZWRpY3RvcnMgKi8KKyAgICBzLT5sYXN0X2RjWzBdID0KKyAgICBzLT5sYXN0X2RjWzFdID0KKyAgICBzLT5sYXN0X2RjWzJdID0gMSA8PCAocy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgKyBzLT5kY3RfcHJlY2lzaW9uICsgcy0+aW50cmFfZGNfcHJlY2lzaW9uIC0gMSk7Cit9CisKKy8qKgorICogRGVjb2RlIHRoZSBuZXh0IHZpZGVvIHBhY2tldC4KKyAqIEByZXR1cm4gPDAgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworaW50IGZmX21wZWc0X2RlY29kZV9zdHVkaW9fc2xpY2VfaGVhZGVyKE1wZWc0RGVjQ29udGV4dCAqY3R4KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICB1bnNpZ25lZCB2bGNfbGVuOworICAgIHVpbnQxNl90IG1iX251bTsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA+PSAzMiAmJiBnZXRfYml0c19sb25nKGdiLCAzMikgPT0gU0xJQ0VfU1RBUlRfQ09ERSkgeworICAgICAgICB2bGNfbGVuID0gYXZfbG9nMihzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodCkgKyAxOworICAgICAgICBtYl9udW0gPSBnZXRfYml0cyhnYiwgdmxjX2xlbik7CisKKyAgICAgICAgaWYgKG1iX251bSA+PSBzLT5tYl9udW0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBzLT5tYl94ID0gbWJfbnVtICUgcy0+bWJfd2lkdGg7CisgICAgICAgIHMtPm1iX3kgPSBtYl9udW0gLyBzLT5tYl93aWR0aDsKKworICAgICAgICBpZiAoY3R4LT5zaGFwZSAhPSBCSU5fT05MWV9TSEFQRSkKKyAgICAgICAgICAgIHMtPnFzY2FsZSA9IG1wZWdfZ2V0X3FzY2FsZShzKTsKKworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAgLyogc2xpY2VfZXh0ZW5zaW9uX2ZsYWcgKi8KKyAgICAgICAgICAgIHNraXBfYml0czEoZ2IpOyAgIC8qIGludHJhX3NsaWNlICovCisgICAgICAgICAgICBza2lwX2JpdHMxKGdiKTsgICAvKiBzbGljZV9WT1BfaWRfZW5hYmxlICovCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDYpOyAvKiBzbGljZV9WT1BfaWQgKi8KKyAgICAgICAgICAgIHdoaWxlIChnZXRfYml0czEoZ2IpKSAvKiBleHRyYV9iaXRfc2xpY2UgKi8KKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDgpOyAvKiBleHRyYV9pbmZvcm1hdGlvbl9zbGljZSAqLworICAgICAgICB9CisKKyAgICAgICAgcmVzZXRfc3R1ZGlvX2RjX3ByZWRpY3RvcnMocyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogLyoqCiAgKiBHZXQgdGhlIGF2ZXJhZ2UgbW90aW9uIHZlY3RvciBmb3IgYSBHTUMgTUIuCiAgKiBAcGFyYW0gbiBlaXRoZXIgMCBmb3IgdGhlIHggY29tcG9uZW50IG9yIDEgZm9yIHkKQEAgLTUwMCwxMCArNTk2LDEwIEBACiAgICAgICAgIGxlbiA+Pj0gcy0+cXVhcnRlcl9zYW1wbGU7CiAKICAgICBpZiAocy0+cmVhbF9zcHJpdGVfd2FycGluZ19wb2ludHMgPT0gMSkgewotICAgICAgICBpZiAoY3R4LT5kaXZ4X3ZlcnNpb24gPT0gNTAwICYmIGN0eC0+ZGl2eF9idWlsZCA9PSA0MTMpCisgICAgICAgIGlmIChjdHgtPmRpdnhfdmVyc2lvbiA9PSA1MDAgJiYgY3R4LT5kaXZ4X2J1aWxkID09IDQxMyAmJiBhID49IHMtPnF1YXJ0ZXJfc2FtcGxlKQogICAgICAgICAgICAgc3VtID0gcy0+c3ByaXRlX29mZnNldFswXVtuXSAvICgxIDw8IChhIC0gcy0+cXVhcnRlcl9zYW1wbGUpKTsKICAgICAgICAgZWxzZQotICAgICAgICAgICAgc3VtID0gUlNISUZUKHMtPnNwcml0ZV9vZmZzZXRbMF1bbl0gPDwgcy0+cXVhcnRlcl9zYW1wbGUsIGEpOworICAgICAgICAgICAgc3VtID0gUlNISUZUKHMtPnNwcml0ZV9vZmZzZXRbMF1bbl0gKiAoMSA8PCBzLT5xdWFydGVyX3NhbXBsZSksIGEpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGR4ICAgID0gcy0+c3ByaXRlX2RlbHRhW25dWzBdOwogICAgICAgICBkeSAgICA9IHMtPnNwcml0ZV9kZWx0YVtuXVsxXTsKQEAgLTU1Myw3ICs2NDksNyBAQAogCiAgICAgaWYgKGNvZGUgPCAwIHx8IGNvZGUgPiA5IC8qICYmIHMtPm5iaXQgPCA5ICovKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBkYyB2bGNcbiIpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAogICAgIGlmIChjb2RlID09IDApIHsKQEAgLTU3Niw3ICs2NzIsNyBAQAogICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpID09IDApIHsgLyogbWFya2VyICovCiAgICAgICAgICAgICAgICAgaWYgKHMtPmF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiAoQVZfRUZfQklUU1RSRUFNfEFWX0VGX0NPTVBMSUFOVCkpIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJkYyBtYXJrZXIgYml0IG1pc3NpbmdcbiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjIwLDcgKzcxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChjYnBjIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1jYnBjIGNvcnJ1cHRlZCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNicGMgPT0gOCk7CiAKQEAgLTY0MCw3ICs3MzYsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoZGMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiREMgY29ycnVwdGVkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYzsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBkaXIgPDw9IDE7CiAgICAgICAgICAgICAgICAgICAgIGlmIChkY19wcmVkX2RpcikKQEAgLTY5Miw3ICs3ODgsNyBAQAogICAgICAgICAgICAgICAgIGlmIChjYnBjIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtY2JwYyBjb3JydXB0ZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoY2JwYyA9PSAyMCkKICAgICAgICAgICAgICAgICAgICAgZ290byB0cnlfYWdhaW47CkBAIC03MzAsMTEgKzgyNiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzLT5tY3NlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeCwgcy0+Zl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXggPj0gMHhmZmZmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95LCBzLT5mX2NvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteSA+PSAweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLm1iX3R5cGVbeHldID0gTUJfVFlQRV8xNngxNiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV9MMDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC03NjEsMTEgKzg1NywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKm1vdF92YWwgPSBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIGksIDAsICZwcmVkX3gsICZwcmVkX3kpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeCwgcy0+Zl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXggPj0gMHhmZmZmKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95LCBzLT5mX2NvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChteSA+PSAweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90X3ZhbFswXSA9IG14OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdF92YWxbMV0gPSBteTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTgwNiw3ICs5MDIsNyBAQAogICAgICAgICAgICAgICAgIGlmIChjYnB5IDwgMCkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYnB5IGNvcnJ1cHRlZCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcy0+Y2JwX3RhYmxlW3h5XSAgICAgICAgICAgICAgIHw9IGNicHkgPDwgMjsKQEAgLTgyMSw3ICs5MTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoY2JweSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJIGNicHkgY29ycnVwdGVkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmNicF90YWJsZVt4eV0gJiA4KQpAQCAtODM0LDcgKzkzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEQyBjb3JydXB0ZWQgYXQgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGM7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPDw9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGNfcHJlZF9kaXIpCkBAIC04NTMsNyArOTQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGNicHkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUCBjYnB5IGNvcnJ1cHRlZCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5jYnBfdGFibGVbeHldICYgOCkKQEAgLTg4MCw2ICs5NzYsNyBAQAogewogICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKICAgICBpbnQgbWJfbnVtOworICAgIGludCByZXQ7CiAgICAgY29uc3QgaW50IHBhcnRfYV9lcnJvciA9IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/IChFUl9EQ19FUlJPUiB8IEVSX01WX0VSUk9SKSA6IEVSX01WX0VSUk9SOwogICAgIGNvbnN0IGludCBwYXJ0X2FfZW5kICAgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgPyAoRVJfRENfRU5EICAgfCBFUl9NVl9FTkQpICAgOiBFUl9NVl9FTkQ7CiAKQEAgLTg4NywxNCArOTg0LDE0IEBACiAgICAgaWYgKG1iX251bSA8PSAwKSB7CiAgICAgICAgIGZmX2VyX2FkZF9zbGljZSgmcy0+ZXIsIHMtPnJlc3luY19tYl94LCBzLT5yZXN5bmNfbWJfeSwKICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3gsIHMtPm1iX3ksIHBhcnRfYV9lcnJvcik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIG1iX251bSA/IG1iX251bSA6IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgaWYgKHMtPnJlc3luY19tYl94ICsgcy0+cmVzeW5jX21iX3kgKiBzLT5tYl93aWR0aCArIG1iX251bSA+IHMtPm1iX251bSkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInNsaWNlIGJlbG93IG1vbml0b3IgLi4uXG4iKTsKICAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LAogICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSwgcGFydF9hX2Vycm9yKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKICAgICBzLT5tYl9udW1fbGVmdCA9IG1iX251bTsKQEAgLTkwNiw3ICsxMDAzLDcgQEAKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJtYXJrZXIgbWlzc2luZyBhZnRlciBmaXJzdCBJIHBhcnRpdGlvbiBhdCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgd2hpbGUgKHNob3dfYml0cygmcy0+Z2IsIDEwKSA9PSAxKQpAQCAtOTE1LDE3ICsxMDEyLDE4IEBACiAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAibWFya2VyIG1pc3NpbmcgYWZ0ZXIgZmlyc3QgUCBwYXJ0aXRpb24gYXQgJWQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogICAgIH0KICAgICBmZl9lcl9hZGRfc2xpY2UoJnMtPmVyLCBzLT5yZXN5bmNfbWJfeCwgcy0+cmVzeW5jX21iX3ksCiAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3ggLSAxLCBzLT5tYl95LCBwYXJ0X2FfZW5kKTsKIAotICAgIGlmIChtcGVnNF9kZWNvZGVfcGFydGl0aW9uX2IocywgbWJfbnVtKSA8IDApIHsKKyAgICByZXQgPSBtcGVnNF9kZWNvZGVfcGFydGl0aW9uX2IocywgbWJfbnVtKTsKKyAgICBpZiAocmV0IDwgMCkgewogICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKQogICAgICAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZzLT5lciwgcy0+cmVzeW5jX21iX3gsIHMtPnJlc3luY19tYl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1iX3gsIHMtPm1iX3ksIEVSX0RDX0VSUk9SKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApCiAgICAgICAgICAgICBmZl9lcl9hZGRfc2xpY2UoJnMtPmVyLCBzLT5yZXN5bmNfbWJfeCwgcy0+cmVzeW5jX21iX3ksCkBAIC05NjQsNyArMTA2Miw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxldmVsID0gbXBlZzRfZGVjb2RlX2RjKHMsIG4sICZkY19wcmVkX2Rpcik7CiAgICAgICAgICAgICAgICAgaWYgKGxldmVsIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBibG9ja1swXSA9IGxldmVsOwogICAgICAgICAgICAgaSAgICAgICAgPSAwOwpAQCAtMTAzMiw3ICsxMTMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfVUJJVFMocmUsICZzLT5nYiwgMSkgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEuIG1hcmtlciBiaXQgbWlzc2luZyBpbiBydmxjIGVzY1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBTS0lQX0NBQ0hFKHJlLCAmcy0+Z2IsIDEpOwogCkBAIC0xMDQ1LDcgKzExNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoU0hPV19VQklUUyhyZSwgJnMtPmdiLCAxKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMi4gbWFya2VyIGJpdCBtaXNzaW5nIGluIHJ2bGMgZXNjXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIFNLSVBfQ0FDSEUocmUsICZzLT5nYiwgMSk7CiAKQEAgLTEwNTQsNyArMTE1Miw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKFNIT1dfVUJJVFMocmUsICZzLT5nYiwgNSkgIT0gMHgxMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZXZlcnNlIGVzYyBtaXNzaW5nXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIFNLSVBfQ0FDSEUocmUsICZzLT5nYiwgNSk7CiAKQEAgLTEwOTAsNyArMTE4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMS4gbWFya2VyIGJpdCBtaXNzaW5nIGluIDMuIGVzY1xuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfSUdOT1JFX0VSUikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNLSVBfQ0FDSEUocmUsICZzLT5nYiwgMSk7CiAKQEAgLTExMDEsNyArMTE5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMi4gbWFya2VyIGJpdCBtaXNzaW5nIGluIDMuIGVzY1xuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfSUdOT1JFX0VSUikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0tJUF9DT1VOVEVSKHJlLCAmcy0+Z2IsIDEgKyAxMiArIDEpOwpAQCAtMTExNCwxNiArMTIxMiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHJ1bjE9IHJ1biAtIHJsLT5tYXhfcnVuW2xhc3RdW2Fic19sZXZlbF0gLSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFic19sZXZlbCA8PSBybC0+bWF4X2xldmVsW2xhc3RdW3J1bl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgMy4gZXNjLCB2bGMgZW5jb2RpbmcgcG9zc2libGVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiA+IEZGX0VSX0NPTVBMSUFOVCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYnNfbGV2ZWwgPD0gcmwtPm1heF9sZXZlbFtsYXN0XVtydW5dKjIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIDMuIGVzYywgZXNjIDEgZW5jb2RpbmcgcG9zc2libGVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuMSA+PSAwICYmIGFic19sZXZlbCA8PSBybC0+bWF4X2xldmVsW2xhc3RdW3J1bjFdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCAzLiBlc2MsIGVzYyAyIGVuY29kaW5nIHBvc3NpYmxlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTExNDAsNyArMTIzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8bGV2ZWx8IG92ZXJmbG93IGluIDMuIGVzYywgcXA9JWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnFzY2FsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgPCAwID8gLTIwNDggOiAyMDQ3OwpAQCAtMTE3OCw3ICsxMjc2LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoaSAmICh+NjMpKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjLXRleCBkYW1hZ2VkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBibG9ja1tzY2FuX3RhYmxlW2ldXSA9IGxldmVsOwpAQCAtMTIxMiwxMCArMTMxMCwxMiBAQAogICovCiBzdGF0aWMgaW50IG1wZWc0X2RlY29kZV9wYXJ0aXRpb25lZF9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1s2XVs2NF0pCiB7Ci0gICAgTXBlZzREZWNDb250ZXh0ICpjdHggPSAoTXBlZzREZWNDb250ZXh0ICopczsKKyAgICBNcGVnNERlY0NvbnRleHQgKmN0eCA9IHMtPmF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IGNicCwgbWJfdHlwZTsKICAgICBjb25zdCBpbnQgeHkgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKIAorICAgIGF2X2Fzc2VydDIocyA9PSAodm9pZCopY3R4KTsKKwogICAgIG1iX3R5cGUgPSBzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVt4eV07CiAgICAgY2JwICAgICA9IHMtPmNicF90YWJsZVt4eV07CiAKQEAgLTEyNzMsNyArMTM3Myw3IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXh0dXJlIGNvcnJ1cHRlZCBhdCAlZCAlZCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfeCwgcy0+bWJfeSwgcy0+bWJfaW50cmEpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNicCArPSBjYnA7CiAgICAgICAgIH0KQEAgLTEyOTcsMTIgKzEzOTcsMTMgQEAKIAogc3RhdGljIGludCBtcGVnNF9kZWNvZGVfbWIoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbNl1bNjRdKQogewotICAgIE1wZWc0RGVjQ29udGV4dCAqY3R4ID0gKE1wZWc0RGVjQ29udGV4dCAqKXM7CisgICAgTXBlZzREZWNDb250ZXh0ICpjdHggPSBzLT5hdmN0eC0+cHJpdl9kYXRhOwogICAgIGludCBjYnBjLCBjYnB5LCBpLCBjYnAsIHByZWRfeCwgcHJlZF95LCBteCwgbXksIGRxdWFudDsKICAgICBpbnQxNl90ICptb3RfdmFsOwogICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgcXVhbnRfdGFiWzRdID0geyAtMSwgLTIsIDEsIDIgfTsKICAgICBjb25zdCBpbnQgeHkgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKIAorICAgIGF2X2Fzc2VydDIocyA9PSAgKHZvaWQqKWN0eCk7CiAgICAgYXZfYXNzZXJ0MihzLT5oMjYzX3ByZWQpOwogCiAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fApAQCAtMTM0MCw3ICsxNDQxLDcgQEAKICAgICAgICAgICAgIGlmIChjYnBjIDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAibWNicGMgZGFtYWdlZCBhdCAlZCAlZFxuIiwgcy0+bWJfeCwgcy0+bWJfeSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogICAgICAgICB9IHdoaWxlIChjYnBjID09IDIwKTsKIApAQCAtMTM5NiwxMSArMTQ5NywxMSBAQAogICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF94LCBzLT5mX2NvZGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAobXggPj0gMHhmZmZmKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgICAgICAgICAgICAgbXkgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF95IC8gMiwgcy0+Zl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzBdID0gbXg7CiAgICAgICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzFdID0gbXk7CkBAIC0xNDEzLDEyICsxNTE0LDEyIEBACiAgICAgICAgICAgICAgICAgbXggPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF94LCBzLT5mX2NvZGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKG14ID49IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgICAgICAgICAgICAgIG15ID0gZmZfaDI2M19kZWNvZGVfbW90aW9uKHMsIHByZWRfeSwgcy0+Zl9jb2RlKTsKIAogICAgICAgICAgICAgICAgIGlmIChteSA+PSAweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgcy0+bXZbMF1bMF1bMF0gPSBteDsKICAgICAgICAgICAgICAgICBzLT5tdlswXVswXVsxXSA9IG15OwogICAgICAgICAgICAgfQpAQCAtMTQyOSwxMSArMTUzMCwxMSBAQAogICAgICAgICAgICAgICAgIG1vdF92YWwgPSBmZl9oMjYzX3ByZWRfbW90aW9uKHMsIGksIDAsICZwcmVkX3gsICZwcmVkX3kpOwogICAgICAgICAgICAgICAgIG14ICAgICAgPSBmZl9oMjYzX2RlY29kZV9tb3Rpb24ocywgcHJlZF94LCBzLT5mX2NvZGUpOwogICAgICAgICAgICAgICAgIGlmIChteCA+PSAweGZmZmYpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgICAgICAgICBteSA9IGZmX2gyNjNfZGVjb2RlX21vdGlvbihzLCBwcmVkX3ksIHMtPmZfY29kZSk7CiAgICAgICAgICAgICAgICAgaWYgKG15ID49IDB4ZmZmZikKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBzLT5tdlswXVtpXVswXSA9IG14OwogICAgICAgICAgICAgICAgIHMtPm12WzBdW2ldWzFdID0gbXk7CiAgICAgICAgICAgICAgICAgbW90X3ZhbFswXSAgICAgPSBteDsKQEAgLTE0NTksNyArMTU2MCw3IEBACiAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnMtPm5leHRfcGljdHVyZV9wdHItPnRmLCBzLT5tYl95LCAwKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qIGlmIHdlIHNraXBwZWQgaXQgaW4gdGhlIGZ1dHVyZSBQIEZyYW1lIHRoYW4gc2tpcCBpdCBub3cgdG9vICovCisgICAgICAgIC8qIGlmIHdlIHNraXBwZWQgaXQgaW4gdGhlIGZ1dHVyZSBQLWZyYW1lIHRoYW4gc2tpcCBpdCBub3cgdG9vICovCiAgICAgICAgIHMtPm1iX3NraXBwZWQgPSBzLT5uZXh0X3BpY3R1cmUubWJza2lwX3RhYmxlW3MtPm1iX3kgKiBzLT5tYl9zdHJpZGUgKyBzLT5tYl94XTsgIC8vIE5vdGUsIHNraXB0YWI9MCBpZiBsYXN0IHdhcyBHTUMKIAogICAgICAgICBpZiAocy0+bWJfc2tpcHBlZCkgewpAQCAtMTQ4OSw3ICsxNTkwLDcgQEAKICAgICAgICAgICAgIG1iX3R5cGUgPSBnZXRfdmxjMigmcy0+Z2IsIG1iX3R5cGVfYl92bGMudGFibGUsIE1CX1RZUEVfQl9WTENfQklUUywgMSk7CiAgICAgICAgICAgICBpZiAobWJfdHlwZSA8IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgTUJfdHlwZVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbWJfdHlwZSA9IG1iX3R5cGVfYl9tYXBbbWJfdHlwZV07CiAgICAgICAgICAgICBpZiAobW9kYjIpIHsKQEAgLTE2MDAsNyArMTcwMSw3IEBACiAgICAgICAgICAgICBpZiAoY2JwYyA8IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIkkgY2JwYyBkYW1hZ2VkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gd2hpbGUgKGNicGMgPT0gOCk7CiAKQEAgLTE2MTgsNyArMTcxOSw3IEBACiAgICAgICAgIGlmIChjYnB5IDwgMCkgewogICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIkkgY2JweSBkYW1hZ2VkIGF0ICVkICVkXG4iLCBzLT5tYl94LCBzLT5tYl95KTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgICAgIGNicCA9IChjYnBjICYgMykgfCAoY2JweSA8PCAyKTsKIApAQCAtMTYzNCw3ICsxNzM1LDcgQEAKICAgICAgICAgLyogZGVjb2RlIGVhY2ggYmxvY2sgKi8KICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgICAgICAgaWYgKG1wZWc0X2RlY29kZV9ibG9jayhjdHgsIGJsb2NrW2ldLCBpLCBjYnAgJiAzMiwgMSwgMCkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGNicCArPSBjYnA7CiAgICAgICAgIH0KICAgICAgICAgZ290byBlbmQ7CkBAIC0xNjQzLDcgKzE3NDQsNyBAQAogICAgIC8qIGRlY29kZSBlYWNoIGJsb2NrICovCiAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgICBpZiAobXBlZzRfZGVjb2RlX2Jsb2NrKGN0eCwgYmxvY2tbaV0sIGksIGNicCAmIDMyLCAwLCAwKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgY2JwICs9IGNicDsKICAgICB9CiAKQEAgLTE2NTMsNyArMTc1NCw3IEBACiAgICAgICAgIGludCBuZXh0ID0gbXBlZzRfaXNfcmVzeW5jKGN0eCk7CiAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICBpZiAgICAgICAgKHMtPm1iX3ggKyBzLT5tYl95KnMtPm1iX3dpZHRoICsgMSA+ICBuZXh0ICYmIChzLT5hdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfQUdHUkVTU0lWRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPm1iX3ggKyBzLT5tYl95KnMtPm1iX3dpZHRoICsgMSA+PSBuZXh0KQogICAgICAgICAgICAgICAgIHJldHVybiBTTElDRV9FTkQ7CiAKQEAgLTE2NzQsMTggKzE3NzUsMjE1IEBACiAgICAgcmV0dXJuIFNMSUNFX09LOwogfQogCisvKiBBcyBwZXIgc3BlYywgc3R1ZGlvIHN0YXJ0IGNvZGUgc2VhcmNoIGlzbid0IHRoZSBzYW1lIGFzIHRoZSBvbGQgdHlwZSBvZiBzdGFydCBjb2RlICovCitzdGF0aWMgdm9pZCBuZXh0X3N0YXJ0X2NvZGVfc3R1ZGlvKEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGFsaWduX2dldF9iaXRzKGdiKTsKKworICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KGdiKSA+PSAyNCAmJiBzaG93X2JpdHNfbG9uZyhnYiwgMjQpICE9IDB4MSkgeworICAgICAgICBnZXRfYml0cyhnYiwgOCk7CisgICAgfQorfQorCisvKiBhZGRpdGlvbmFsX2NvZGUsIHZsYyBpbmRleCAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWNfc3RhdGVfdGFiWzIyXVsyXSA9Cit7CisgICAgezAsIDB9LAorICAgIHswLCAxfSwKKyAgICB7MSwgMX0sCisgICAgezIsIDF9LAorICAgIHszLCAxfSwKKyAgICB7NCwgMX0sCisgICAgezUsIDF9LAorICAgIHsxLCAyfSwKKyAgICB7MiwgMn0sCisgICAgezMsIDJ9LAorICAgIHs0LCAyfSwKKyAgICB7NSwgMn0sCisgICAgezYsIDJ9LAorICAgIHsxLCAzfSwKKyAgICB7MiwgNH0sCisgICAgezMsIDV9LAorICAgIHs0LCA2fSwKKyAgICB7NSwgN30sCisgICAgezYsIDh9LAorICAgIHs3LCA5fSwKKyAgICB7OCwgMTB9LAorICAgIHswLCAxMX0KK307CisKK3N0YXRpYyBpbnQgbXBlZzRfZGVjb2RlX3N0dWRpb19ibG9jayhNcGVnRW5jQ29udGV4dCAqcywgaW50MzJfdCBibG9ja1s2NF0sIGludCBuKQoreworICAgIE1wZWc0RGVjQ29udGV4dCAqY3R4ID0gcy0+YXZjdHgtPnByaXZfZGF0YTsKKworICAgIGludCBjYywgZGN0X2RjX3NpemUsIGRjdF9kaWZmLCBjb2RlLCBqLCBpZHggPSAxLCBncm91cCA9IDAsIHJ1biA9IDAsCisgICAgICAgIGFkZGl0aW9uYWxfY29kZV9sZW4sIHNpZ24sIG1pc21hdGNoOworICAgIFZMQyAqY3VyX3ZsYyA9ICZjdHgtPnN0dWRpb19pbnRyYV90YWJbMF07CisgICAgdWludDhfdCAqY29uc3Qgc2NhbnRhYmxlID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgY29uc3QgdWludDE2X3QgKnF1YW50X21hdHJpeDsKKyAgICB1aW50MzJfdCBmbGM7CisgICAgY29uc3QgaW50IG1pbiA9IC0xICogICgxIDw8IChzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSArIDYpKTsKKyAgICBjb25zdCBpbnQgbWF4ID0gICAgICAoKDEgPDwgKHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICsgNikpIC0gMSk7CisKKyAgICBtaXNtYXRjaCA9IDE7CisKKyAgICBtZW1zZXQoYmxvY2ssIDAsIDY0ICogc2l6ZW9mKGludDMyX3QpKTsKKworICAgIGlmIChuIDwgNCkgeworICAgICAgICBjYyA9IDA7CisgICAgICAgIGRjdF9kY19zaXplID0gZ2V0X3ZsYzIoJnMtPmdiLCBjdHgtPnN0dWRpb19sdW1hX2RjLnRhYmxlLCBTVFVESU9fSU5UUkFfQklUUywgMik7CisgICAgICAgIHF1YW50X21hdHJpeCA9IHMtPmludHJhX21hdHJpeDsKKyAgICB9IGVsc2UgeworICAgICAgICBjYyA9IChuICYgMSkgKyAxOworICAgICAgICBpZiAoY3R4LT5yZ2IpCisgICAgICAgICAgICBkY3RfZGNfc2l6ZSA9IGdldF92bGMyKCZzLT5nYiwgY3R4LT5zdHVkaW9fbHVtYV9kYy50YWJsZSwgU1RVRElPX0lOVFJBX0JJVFMsIDIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkY3RfZGNfc2l6ZSA9IGdldF92bGMyKCZzLT5nYiwgY3R4LT5zdHVkaW9fY2hyb21hX2RjLnRhYmxlLCBTVFVESU9fSU5UUkFfQklUUywgMik7CisgICAgICAgIHF1YW50X21hdHJpeCA9IHMtPmNocm9tYV9pbnRyYV9tYXRyaXg7CisgICAgfQorCisgICAgaWYgKGRjdF9kY19zaXplIDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgZGN0X2RjX3NpemUgdmxjXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfSBlbHNlIGlmIChkY3RfZGNfc2l6ZSA9PSAwKSB7CisgICAgICAgIGRjdF9kaWZmID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBkY3RfZGlmZiA9IGdldF94Yml0cygmcy0+Z2IsIGRjdF9kY19zaXplKTsKKworICAgICAgICBpZiAoZGN0X2RjX3NpemUgPiA4KSB7CisgICAgICAgICAgICBpZighY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCAmcy0+Z2IsICJkY3RfZGNfc2l6ZSA+IDgiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcy0+bGFzdF9kY1tjY10gKz0gZGN0X2RpZmY7CisKKyAgICBpZiAocy0+bXBlZ19xdWFudCkKKyAgICAgICAgYmxvY2tbMF0gPSBzLT5sYXN0X2RjW2NjXSAqICg4ID4+IHMtPmludHJhX2RjX3ByZWNpc2lvbik7CisgICAgZWxzZQorICAgICAgICBibG9ja1swXSA9IHMtPmxhc3RfZGNbY2NdICogKDggPj4gcy0+aW50cmFfZGNfcHJlY2lzaW9uKSAqICg4ID4+IHMtPmRjdF9wcmVjaXNpb24pOworICAgIC8qIFRPRE86IHN1cHBvcnQgbXBlZ19xdWFudCBmb3IgQUMgY29lZmZpY2llbnRzICovCisKKyAgICBibG9ja1swXSA9IGF2X2NsaXAoYmxvY2tbMF0sIG1pbiwgbWF4KTsKKyAgICBtaXNtYXRjaCBePSBibG9ja1swXTsKKworICAgIC8qIEFDIENvZWZmaWNpZW50cyAqLworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGdyb3VwID0gZ2V0X3ZsYzIoJnMtPmdiLCBjdXJfdmxjLT50YWJsZSwgU1RVRElPX0lOVFJBX0JJVFMsIDIpOworCisgICAgICAgIGlmIChncm91cCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBhYyBjb2VmZmljaWVudCBncm91cCB2bGNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBhZGRpdGlvbmFsX2NvZGVfbGVuID0gYWNfc3RhdGVfdGFiW2dyb3VwXVswXTsKKyAgICAgICAgY3VyX3ZsYyA9ICZjdHgtPnN0dWRpb19pbnRyYV90YWJbYWNfc3RhdGVfdGFiW2dyb3VwXVsxXV07CisKKyAgICAgICAgaWYgKGdyb3VwID09IDApIHsKKyAgICAgICAgICAgIC8qIEVuZCBvZiBCbG9jayAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXAgPj0gMSAmJiBncm91cCA8PSA2KSB7CisgICAgICAgICAgICAvKiBaZXJvIHJ1biBsZW5ndGggKFRhYmxlIEIuNDcpICovCisgICAgICAgICAgICBydW4gPSAxIDw8IGFkZGl0aW9uYWxfY29kZV9sZW47CisgICAgICAgICAgICBpZiAoYWRkaXRpb25hbF9jb2RlX2xlbikKKyAgICAgICAgICAgICAgICBydW4gKz0gZ2V0X2JpdHMoJnMtPmdiLCBhZGRpdGlvbmFsX2NvZGVfbGVuKTsKKyAgICAgICAgICAgIGlkeCArPSBydW47CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChncm91cCA+PSA3ICYmIGdyb3VwIDw9IDEyKSB7CisgICAgICAgICAgICAvKiBaZXJvIHJ1biBsZW5ndGggYW5kICsvLTEgbGV2ZWwgKFRhYmxlIEIuNDgpICovCisgICAgICAgICAgICBjb2RlID0gZ2V0X2JpdHMoJnMtPmdiLCBhZGRpdGlvbmFsX2NvZGVfbGVuKTsKKyAgICAgICAgICAgIHNpZ24gPSBjb2RlICYgMTsKKyAgICAgICAgICAgIGNvZGUgPj49IDE7CisgICAgICAgICAgICBydW4gPSAoMSA8PCAoYWRkaXRpb25hbF9jb2RlX2xlbiAtIDEpKSArIGNvZGU7CisgICAgICAgICAgICBpZHggKz0gcnVuOworICAgICAgICAgICAgaWYgKGlkeCA+IDYzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpZHgrK107CisgICAgICAgICAgICBibG9ja1tqXSA9IHNpZ24gPyAxIDogLTE7CisgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXAgPj0gMTMgJiYgZ3JvdXAgPD0gMjApIHsKKyAgICAgICAgICAgIC8qIExldmVsIHZhbHVlIChUYWJsZSBCLjQ5KSAqLworICAgICAgICAgICAgaWYgKGlkeCA+IDYzKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgaiA9IHNjYW50YWJsZVtpZHgrK107CisgICAgICAgICAgICBibG9ja1tqXSA9IGdldF94Yml0cygmcy0+Z2IsIGFkZGl0aW9uYWxfY29kZV9sZW4pOworICAgICAgICB9IGVsc2UgaWYgKGdyb3VwID09IDIxKSB7CisgICAgICAgICAgICAvKiBFc2NhcGUgKi8KKyAgICAgICAgICAgIGlmIChpZHggPiA2MykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGogPSBzY2FudGFibGVbaWR4KytdOworICAgICAgICAgICAgYWRkaXRpb25hbF9jb2RlX2xlbiA9IHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICsgcy0+ZGN0X3ByZWNpc2lvbiArIDQ7CisgICAgICAgICAgICBmbGMgPSBnZXRfYml0cygmcy0+Z2IsIGFkZGl0aW9uYWxfY29kZV9sZW4pOworICAgICAgICAgICAgaWYgKGZsYyA+PiAoYWRkaXRpb25hbF9jb2RlX2xlbi0xKSkKKyAgICAgICAgICAgICAgICBibG9ja1tqXSA9IC0xICogKCggZmxjIF4gKCgxIDw8IGFkZGl0aW9uYWxfY29kZV9sZW4pIC0xKSkgKyAxKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBibG9ja1tqXSA9IGZsYzsKKyAgICAgICAgfQorICAgICAgICBibG9ja1tqXSA9ICgoOCAqIDIgKiBibG9ja1tqXSAqIHF1YW50X21hdHJpeFtqXSAqIHMtPnFzY2FsZSkgPj4gcy0+ZGN0X3ByZWNpc2lvbikgLyAzMjsKKyAgICAgICAgYmxvY2tbal0gPSBhdl9jbGlwKGJsb2NrW2pdLCBtaW4sIG1heCk7CisgICAgICAgIG1pc21hdGNoIF49IGJsb2NrW2pdOworICAgIH0KKworICAgIGJsb2NrWzYzXSBePSBtaXNtYXRjaCAmIDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVnNF9kZWNvZGVfc3R1ZGlvX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrX1sxMl1bNjRdKQoreworICAgIGludCBpOworCisgICAgLyogU3R1ZGlvTWFjcm9ibG9jayAqLworICAgIC8qIEFzc3VtZXMgSS1WT1AgKi8KKyAgICBzLT5tYl9pbnRyYSA9IDE7CisgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7IC8qIGNvbXByZXNzaW9uX21vZGUgKi8KKyAgICAgICAgLyogRENUICovCisgICAgICAgIC8qIG1hY3JvYmxvY2tfdHlwZSwgMSBvciAyLWJpdCBWTEMgKi8KKyAgICAgICAgaWYgKCFnZXRfYml0czEoJnMtPmdiKSkgeworICAgICAgICAgICAgc2tpcF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgcy0+cXNjYWxlID0gbXBlZ19nZXRfcXNjYWxlKHMpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1wZWc0X2Jsb2NrX2NvdW50W3MtPmNocm9tYV9mb3JtYXRdOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtcGVnNF9kZWNvZGVfc3R1ZGlvX2Jsb2NrKHMsICgqcy0+YmxvY2szMilbaV0sIGkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIERQQ00gKi8KKyAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCAmcy0+Z2IsICJEUENNIGJsb2NrIHN0YXJ0Iik7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIkRQQ00gZW5jb2RlZCBibG9jayIpOworICAgICAgICBuZXh0X3N0YXJ0X2NvZGVfc3R1ZGlvKCZzLT5nYik7CisgICAgICAgIHJldHVybiBTTElDRV9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID49IDI0ICYmIHNob3dfYml0cygmcy0+Z2IsIDIzKSA9PSAwKSB7CisgICAgICAgIG5leHRfc3RhcnRfY29kZV9zdHVkaW8oJnMtPmdiKTsKKyAgICAgICAgcmV0dXJuIFNMSUNFX0VORDsKKyAgICB9CisKKyAgICAvL3Zjb24tc3RwOUwxLmJpdHMgKGZpcnN0IGZyYW1lKQorICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPT0gMCkKKyAgICAgICAgcmV0dXJuIFNMSUNFX0VORDsKKworICAgIC8vdmNvbi1zdHAyTDEuYml0cywgdmNvbi1zdHAzTDEuYml0cywgdmNvbi1zdHA2TDEuYml0cywgdmNvbi1zdHA3TDEuYml0cywgdmNvbi1zdHA4TDEuYml0cywgdmNvbi1zdHAxMEwxLmJpdHMgKGZpcnN0IGZyYW1lKQorICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCA4VSAmJiBzaG93X2JpdHMoJnMtPmdiLCBnZXRfYml0c19sZWZ0KCZzLT5nYikpID09IDApCisgICAgICAgIHJldHVybiBTTElDRV9FTkQ7CisKKyAgICByZXR1cm4gU0xJQ0VfT0s7Cit9CisKIHN0YXRpYyBpbnQgbXBlZzRfZGVjb2RlX2dvcF9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQogewogICAgIGludCBob3VycywgbWludXRlcywgc2Vjb25kczsKIAogICAgIGlmICghc2hvd19iaXRzKGdiLCAyMykpIHsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkdPUCBoZWFkZXIgaW52YWxpZFxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgaG91cnMgICA9IGdldF9iaXRzKGdiLCA1KTsKICAgICBtaW51dGVzID0gZ2V0X2JpdHMoZ2IsIDYpOwotICAgIGNoZWNrX21hcmtlcihnYiwgImluIGdvcF9oZWFkZXIiKTsKKyAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiaW4gZ29wX2hlYWRlciIpOwogICAgIHNlY29uZHMgPSBnZXRfYml0cyhnYiwgNik7CiAKICAgICBzLT50aW1lX2Jhc2UgPSBzZWNvbmRzICsgNjAqKG1pbnV0ZXMgKyA2MCpob3Vycyk7CkBAIC0xNjk2LDIwICsxOTk0LDY5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXBlZzRfZGVjb2RlX3Byb2ZpbGVfbGV2ZWwoTXBlZ0VuY0NvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQorc3RhdGljIGludCBtcGVnNF9kZWNvZGVfcHJvZmlsZV9sZXZlbChNcGVnRW5jQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IsIGludCAqcHJvZmlsZSwgaW50ICpsZXZlbCkKIHsKIAotICAgIHMtPmF2Y3R4LT5wcm9maWxlID0gZ2V0X2JpdHMoZ2IsIDQpOwotICAgIHMtPmF2Y3R4LT5sZXZlbCAgID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICpwcm9maWxlID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICpsZXZlbCAgID0gZ2V0X2JpdHMoZ2IsIDQpOwogCiAgICAgLy8gZm9yIFNpbXBsZSBwcm9maWxlLCBsZXZlbCAwCi0gICAgaWYgKHMtPmF2Y3R4LT5wcm9maWxlID09IDAgJiYgcy0+YXZjdHgtPmxldmVsID09IDgpIHsKLSAgICAgICAgcy0+YXZjdHgtPmxldmVsID0gMDsKKyAgICBpZiAoKnByb2ZpbGUgPT0gMCAmJiAqbGV2ZWwgPT0gOCkgeworICAgICAgICAqbGV2ZWwgPSAwOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1wZWc0X2RlY29kZV92aXN1YWxfb2JqZWN0KE1wZWdFbmNDb250ZXh0ICpzLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgdmlzdWFsX29iamVjdF90eXBlOworICAgIGludCBpc192aXN1YWxfb2JqZWN0X2lkZW50aWZpZXIgPSBnZXRfYml0czEoZ2IpOworCisgICAgaWYgKGlzX3Zpc3VhbF9vYmplY3RfaWRlbnRpZmllcikgeworICAgICAgICBza2lwX2JpdHMoZ2IsIDQrMyk7CisgICAgfQorICAgIHZpc3VhbF9vYmplY3RfdHlwZSA9IGdldF9iaXRzKGdiLCA0KTsKKworICAgIGlmICh2aXN1YWxfb2JqZWN0X3R5cGUgPT0gVk9UX1ZJREVPX0lEIHx8CisgICAgICAgIHZpc3VhbF9vYmplY3RfdHlwZSA9PSBWT1RfU1RJTExfVEVYVFVSRV9JRCkgeworICAgICAgICBpbnQgdmlkZW9fc2lnbmFsX3R5cGUgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBpZiAodmlkZW9fc2lnbmFsX3R5cGUpIHsKKyAgICAgICAgICAgIGludCB2aWRlb19yYW5nZSwgY29sb3JfZGVzY3JpcHRpb247CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDMpOyAvLyB2aWRlb19mb3JtYXQKKyAgICAgICAgICAgIHZpZGVvX3JhbmdlID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgICAgIGNvbG9yX2Rlc2NyaXB0aW9uID0gZ2V0X2JpdHMxKGdiKTsKKworICAgICAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3JhbmdlID0gdmlkZW9fcmFuZ2UgPyBBVkNPTF9SQU5HRV9KUEVHIDogQVZDT0xfUkFOR0VfTVBFRzsKKworICAgICAgICAgICAgaWYgKGNvbG9yX2Rlc2NyaXB0aW9uKSB7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmNvbG9yX3ByaW1hcmllcyA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Y29sb3JfdHJjICAgICAgID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5jb2xvcnNwYWNlICAgICAgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXBlZzRfbG9hZF9kZWZhdWx0X21hdHJpY2VzKE1wZWdFbmNDb250ZXh0ICpzKQoreworICAgIGludCBpLCB2OworCisgICAgLyogbG9hZCBkZWZhdWx0IG1hdHJpY2VzICovCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgaW50IGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV07CisgICAgICAgIHYgPSBmZl9tcGVnNF9kZWZhdWx0X2ludHJhX21hdHJpeFtpXTsKKyAgICAgICAgcy0+aW50cmFfbWF0cml4W2pdICAgICAgICA9IHY7CisgICAgICAgIHMtPmNocm9tYV9pbnRyYV9tYXRyaXhbal0gPSB2OworCisgICAgICAgIHYgPSBmZl9tcGVnNF9kZWZhdWx0X25vbl9pbnRyYV9tYXRyaXhbaV07CisgICAgICAgIHMtPmludGVyX21hdHJpeFtqXSAgICAgICAgPSB2OworICAgICAgICBzLT5jaHJvbWFfaW50ZXJfbWF0cml4W2pdID0gdjsKKyAgICB9Cit9CisKIHN0YXRpYyBpbnQgZGVjb2RlX3ZvbF9oZWFkZXIoTXBlZzREZWNDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKQogewogICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKQEAgLTE3MTgsNiArMjA2NSwyMyBAQAogICAgIC8qIHZvbCBoZWFkZXIgKi8KICAgICBza2lwX2JpdHMoZ2IsIDEpOyAgICAgICAgICAgICAgICAgICAvKiByYW5kb20gYWNjZXNzICovCiAgICAgcy0+dm9fdHlwZSA9IGdldF9iaXRzKGdiLCA4KTsKKworICAgIC8qIElmIHdlIGFyZSBpbiBzdHVkaW8gcHJvZmlsZSAocGVyIHZvX3R5cGUpLCBjaGVjayBpZiBpdHMgYWxsIGNvbnNpc3RlbnQKKyAgICAgKiBhbmQgaWYgc28gY29udGludWUgcGFzcyBjb250cm9sIHRvIGRlY29kZV9zdHVkaW9fdm9sX2hlYWRlcigpLgorICAgICAqIGVsSWYgc29tZXRoaW5nIGlzIGluY29uc2lzdGVudCwgZXJyb3Igb3V0CisgICAgICogZWxzZSBjb250aW51ZSB3aXRoIChub24gc3R1ZGlvKSB2b2wgaGVhZGVyIGRlY3BvZGluZy4KKyAgICAgKi8KKyAgICBpZiAocy0+dm9fdHlwZSA9PSBDT1JFX1NUVURJT19WT19UWVBFIHx8CisgICAgICAgIHMtPnZvX3R5cGUgPT0gU0lNUExFX1NUVURJT19WT19UWVBFKSB7CisgICAgICAgIGlmIChzLT5hdmN0eC0+cHJvZmlsZSAhPSBGRl9QUk9GSUxFX1VOS05PV04gJiYgcy0+YXZjdHgtPnByb2ZpbGUgIT0gRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfU1RVRElPKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHMtPnN0dWRpb19wcm9maWxlID0gMTsKKyAgICAgICAgcy0+YXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX01QRUc0X1NJTVBMRV9TVFVESU87CisgICAgICAgIHJldHVybiBkZWNvZGVfc3R1ZGlvX3ZvbF9oZWFkZXIoY3R4LCBnYik7CisgICAgfSBlbHNlIGlmIChzLT5zdHVkaW9fcHJvZmlsZSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCiAgICAgaWYgKGdldF9iaXRzMShnYikgIT0gMCkgeyAgICAgICAgICAgLyogaXNfb2xfaWQgKi8KICAgICAgICAgdm9fdmVyX2lkID0gZ2V0X2JpdHMoZ2IsIDQpOyAgICAvKiB2b192ZXJfaWQgKi8KICAgICAgICAgc2tpcF9iaXRzKGdiLCAzKTsgICAgICAgICAgICAgICAvKiB2b19wcmlvcml0eSAqLwpAQCAtMTc0MCwyMiArMjEwNCwzMCBAQAogICAgICAgICBzLT5sb3dfZGVsYXkgPSBnZXRfYml0czEoZ2IpOwogICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAgICAvKiB2YnYgcGFyYW1ldGVycyAqLwogICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDE1KTsgICAvKiBmaXJzdF9oYWxmX2JpdHJhdGUgKi8KLSAgICAgICAgICAgIGNoZWNrX21hcmtlcihnYiwgImFmdGVyIGZpcnN0X2hhbGZfYml0cmF0ZSIpOworICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIGZpcnN0X2hhbGZfYml0cmF0ZSIpOwogICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDE1KTsgICAvKiBsYXR0ZXJfaGFsZl9iaXRyYXRlICovCi0gICAgICAgICAgICBjaGVja19tYXJrZXIoZ2IsICJhZnRlciBsYXR0ZXJfaGFsZl9iaXRyYXRlIik7CisgICAgICAgICAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYWZ0ZXIgbGF0dGVyX2hhbGZfYml0cmF0ZSIpOwogICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDE1KTsgICAvKiBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSAqLwotICAgICAgICAgICAgY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgZmlyc3RfaGFsZl92YnZfYnVmZmVyX3NpemUiKTsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJhZnRlciBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSIpOwogICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDMpOyAgICAvKiBsYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUgKi8KICAgICAgICAgICAgIGdldF9iaXRzKGdiLCAxMSk7ICAgLyogZmlyc3RfaGFsZl92YnZfb2NjdXBhbmN5ICovCi0gICAgICAgICAgICBjaGVja19tYXJrZXIoZ2IsICJhZnRlciBmaXJzdF9oYWxmX3Zidl9vY2N1cGFuY3kiKTsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJhZnRlciBmaXJzdF9oYWxmX3Zidl9vY2N1cGFuY3kiKTsKICAgICAgICAgICAgIGdldF9iaXRzKGdiLCAxNSk7ICAgLyogbGF0dGVyX2hhbGZfdmJ2X29jY3VwYW5jeSAqLwotICAgICAgICAgICAgY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgbGF0dGVyX2hhbGZfdmJ2X29jY3VwYW5jeSIpOworICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kiKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIGlzIHNldHRpbmcgbG93IGRlbGF5IGZsYWcgb25seSBvbmNlIHRoZSBzbWFydGVzdCB0aGluZyB0byBkbz8KLSAgICAgICAgICogbG93IGRlbGF5IGRldGVjdGlvbiB3b24ndCBiZSBvdmVycmlkZGVuLiAqLwotICAgICAgICBpZiAocy0+cGljdHVyZV9udW1iZXIgPT0gMCkKLSAgICAgICAgICAgIHMtPmxvd19kZWxheSA9IDA7CisgICAgICAgICAqIGxvdyBkZWxheSBkZXRlY3Rpb24gd2lsbCBub3QgYmUgb3ZlcnJpZGRlbi4gKi8KKyAgICAgICAgaWYgKHMtPnBpY3R1cmVfbnVtYmVyID09IDApIHsKKyAgICAgICAgICAgIHN3aXRjaChzLT52b190eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNJTVBMRV9WT19UWVBFOgorICAgICAgICAgICAgY2FzZSBBRFZfU0lNUExFX1ZPX1RZUEU6CisgICAgICAgICAgICAgICAgcy0+bG93X2RlbGF5ID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcy0+bG93X2RlbGF5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIGN0eC0+c2hhcGUgPSBnZXRfYml0cyhnYiwgMik7IC8qIHZvbCBzaGFwZSAqLwpAQCAtMTc2Niw3ICsyMTM4LDcgQEAKICAgICAgICAgc2tpcF9iaXRzKGdiLCA0KTsgIC8qIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZV9leHRlbnNpb24gKi8KICAgICB9CiAKLSAgICBjaGVja19tYXJrZXIoZ2IsICJiZWZvcmUgdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiIpOworICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJiZWZvcmUgdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiIpOwogCiAgICAgcy0+YXZjdHgtPmZyYW1lcmF0ZS5udW0gPSBnZXRfYml0cyhnYiwgMTYpOwogICAgIGlmICghcy0+YXZjdHgtPmZyYW1lcmF0ZS5udW0pIHsKQEAgLTE3NzgsNyArMjE1MCw3IEBACiAgICAgaWYgKGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyA8IDEpCiAgICAgICAgIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyA9IDE7CiAKLSAgICBjaGVja19tYXJrZXIoZ2IsICJiZWZvcmUgZml4ZWRfdm9wX3JhdGUiKTsKKyAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYmVmb3JlIGZpeGVkX3ZvcF9yYXRlIik7CiAKICAgICBpZiAoZ2V0X2JpdHMxKGdiKSAhPSAwKSAgICAgLyogZml4ZWRfdm9wX3JhdGUgICovCiAgICAgICAgIHMtPmF2Y3R4LT5mcmFtZXJhdGUuZGVuID0gZ2V0X2JpdHMoZ2IsIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cyk7CkBAIC0xNzkxLDExICsyMTYzLDExIEBACiAKICAgICBpZiAoY3R4LT5zaGFwZSAhPSBCSU5fT05MWV9TSEFQRSkgewogICAgICAgICBpZiAoY3R4LT5zaGFwZSA9PSBSRUNUX1NIQVBFKSB7Ci0gICAgICAgICAgICBjaGVja19tYXJrZXIoZ2IsICJiZWZvcmUgd2lkdGgiKTsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJiZWZvcmUgd2lkdGgiKTsKICAgICAgICAgICAgIHdpZHRoID0gZ2V0X2JpdHMoZ2IsIDEzKTsKLSAgICAgICAgICAgIGNoZWNrX21hcmtlcihnYiwgImJlZm9yZSBoZWlnaHQiKTsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJiZWZvcmUgaGVpZ2h0Iik7CiAgICAgICAgICAgICBoZWlnaHQgPSBnZXRfYml0cyhnYiwgMTMpOwotICAgICAgICAgICAgY2hlY2tfbWFya2VyKGdiLCAiYWZ0ZXIgaGVpZ2h0Iik7CisgICAgICAgICAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYWZ0ZXIgaGVpZ2h0Iik7CiAgICAgICAgICAgICBpZiAod2lkdGggJiYgaGVpZ2h0ICYmICAvKiB0aGV5IHNob3VsZCBiZSBub24gemVybyBidXQgd2hvIGtub3dzICovCiAgICAgICAgICAgICAgICAgIShzLT53aWR0aCAmJiBzLT5jb2RlY190YWcgPT0gQVZfUkwzMigiTVA0UyIpKSkgewogICAgICAgICAgICAgICAgIGlmIChzLT53aWR0aCAmJiBzLT5oZWlnaHQgJiYKQEAgLTE4MTEsNyArMjE4Myw3IEBACiAgICAgICAgIHMtPmludGVybGFjZWRfZGN0ICAgICAgICA9IDA7CiAgICAgICAgIGlmICghZ2V0X2JpdHMxKGdiKSAmJiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKSkKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICAgICAgICAgICAvKiBPQk1DIERpc2FibGUgKi8KLSAgICAgICAgICAgICAgICAgICAiTVBFRzQgT0JNQyBub3Qgc3VwcG9ydGVkICh2ZXJ5IGxpa2VseSBidWdneSBlbmNvZGVyKVxuIik7CisgICAgICAgICAgICAgICAgICAgIk1QRUctNCBPQk1DIG5vdCBzdXBwb3J0ZWQgKHZlcnkgbGlrZWx5IGJ1Z2d5IGVuY29kZXIpXG4iKTsKICAgICAgICAgaWYgKHZvX3Zlcl9pZCA9PSAxKQogICAgICAgICAgICAgY3R4LT52b2xfc3ByaXRlX3VzYWdlID0gZ2V0X2JpdHMxKGdiKTsgICAgLyogdm9sX3Nwcml0ZV91c2FnZSAqLwogICAgICAgICBlbHNlCkBAIC0xODIzLDEzICsyMTk1LDEzIEBACiAgICAgICAgICAgICBjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gR01DX1NQUklURSkgewogICAgICAgICAgICAgaWYgKGN0eC0+dm9sX3Nwcml0ZV91c2FnZSA9PSBTVEFUSUNfU1BSSVRFKSB7CiAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxMyk7IC8vIHNwcml0ZV93aWR0aAotICAgICAgICAgICAgICAgIGNoZWNrX21hcmtlcihnYiwgImFmdGVyIHNwcml0ZV93aWR0aCIpOworICAgICAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJhZnRlciBzcHJpdGVfd2lkdGgiKTsKICAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDEzKTsgLy8gc3ByaXRlX2hlaWdodAotICAgICAgICAgICAgICAgIGNoZWNrX21hcmtlcihnYiwgImFmdGVyIHNwcml0ZV9oZWlnaHQiKTsKKyAgICAgICAgICAgICAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYWZ0ZXIgc3ByaXRlX2hlaWdodCIpOwogICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTMpOyAvLyBzcHJpdGVfbGVmdAotICAgICAgICAgICAgICAgIGNoZWNrX21hcmtlcihnYiwgImFmdGVyIHNwcml0ZV9sZWZ0Iik7CisgICAgICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIHNwcml0ZV9sZWZ0Iik7CiAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxMyk7IC8vIHNwcml0ZV90b3AKLSAgICAgICAgICAgICAgICBjaGVja19tYXJrZXIoZ2IsICJhZnRlciBzcHJpdGVfdG9wIik7CisgICAgICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIHNwcml0ZV90b3AiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGN0eC0+bnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50cyA9IGdldF9iaXRzKGdiLCA2KTsKICAgICAgICAgICAgIGlmIChjdHgtPm51bV9zcHJpdGVfd2FycGluZ19wb2ludHMgPiAzKSB7CkBAIC0xODY1LDE3ICsyMjM3LDcgQEAKICAgICAgICAgaWYgKChzLT5tcGVnX3F1YW50ID0gZ2V0X2JpdHMxKGdiKSkpIHsgLyogdm9sX3F1YW50X3R5cGUgKi8KICAgICAgICAgICAgIGludCBpLCB2OwogCi0gICAgICAgICAgICAvKiBsb2FkIGRlZmF1bHQgbWF0cml4ZXMgKi8KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25baV07Ci0gICAgICAgICAgICAgICAgdiA9IGZmX21wZWc0X2RlZmF1bHRfaW50cmFfbWF0cml4W2ldOwotICAgICAgICAgICAgICAgIHMtPmludHJhX21hdHJpeFtqXSAgICAgICAgPSB2OwotICAgICAgICAgICAgICAgIHMtPmNocm9tYV9pbnRyYV9tYXRyaXhbal0gPSB2OwotCi0gICAgICAgICAgICAgICAgdiA9IGZmX21wZWc0X2RlZmF1bHRfbm9uX2ludHJhX21hdHJpeFtpXTsKLSAgICAgICAgICAgICAgICBzLT5pbnRlcl9tYXRyaXhbal0gICAgICAgID0gdjsKLSAgICAgICAgICAgICAgICBzLT5jaHJvbWFfaW50ZXJfbWF0cml4W2pdID0gdjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1wZWc0X2xvYWRfZGVmYXVsdF9tYXRyaWNlcyhzKTsKIAogICAgICAgICAgICAgLyogbG9hZCBjdXN0b20gaW50cmEgbWF0cml4ICovCiAgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgewpAQCAtMTk1NCw3ICsyMzE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGludHJhX2NhZSAqLwogICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaW50ZXJfY2FlICovCiAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBub191cGRhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIHVwYW1wbGluZyAqLworICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9pICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogdXBzYW1wbGluZyAqLwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIWdldF9iaXRzMShnYikpIHsKICAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfaSArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGludHJhX2Jsb2NrcyAqLwpAQCAtMTk2Miw3ICsyMzI0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY3R4LT5jcGx4X2VzdGltYXRpb25fdHJhc2hfcCArPSA4ICogZ2V0X2JpdHMxKGdiKTsgIC8qIGludGVyNHZfYmxvY2tzICovCiAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX2kgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBub3QgY29kZWQgYmxvY2tzICovCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghY2hlY2tfbWFya2VyKGdiLCAiaW4gY29tcGxleGl0eSBlc3RpbWF0aW9uIHBhcnQgMSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiaW4gY29tcGxleGl0eSBlc3RpbWF0aW9uIHBhcnQgMSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCBwb3MgLSBnZXRfYml0c19jb3VudChnYikpOwogICAgICAgICAgICAgICAgICAgICBnb3RvIG5vX2NwbHhfZXN0OwogICAgICAgICAgICAgICAgIH0KQEAgLTE5ODAsNyArMjM0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y3BseF9lc3RpbWF0aW9uX3RyYXNoX3AgKz0gOCAqIGdldF9iaXRzMShnYik7ICAvKiBoYWxmcGVsMiAqLwogICAgICAgICAgICAgICAgICAgICBjdHgtPmNwbHhfZXN0aW1hdGlvbl90cmFzaF9wICs9IDggKiBnZXRfYml0czEoZ2IpOyAgLyogaGFsZnBlbDQgKi8KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFjaGVja19tYXJrZXIoZ2IsICJpbiBjb21wbGV4aXR5IGVzdGltYXRpb24gcGFydCAyIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJpbiBjb21wbGV4aXR5IGVzdGltYXRpb24gcGFydCAyIikpIHsKICAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIHBvcyAtIGdldF9iaXRzX2NvdW50KGdiKSk7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gbm9fY3BseF9lc3Q7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjA1MiwxMSArMjQxNCwxMiBAQAogICAgIH0KIAogICAgIGlmIChzLT5hdmN0eC0+ZGVidWcmRkZfREVCVUdfUElDVF9JTkZPKSB7Ci0gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAidGIgJWQvJWQsIHRpbmNyYml0czolZCwgcXBfcHJlYzolZCwgcHM6JWQsICAlcyVzJXMlc1xuIiwKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJ0YiAlZC8lZCwgdGluY3JiaXRzOiVkLCBxcF9wcmVjOiVkLCBwczolZCwgbG93X2RlbGF5OiVkICAlcyVzJXMlc1xuIiwKICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5mcmFtZXJhdGUuZGVuLCBzLT5hdmN0eC0+ZnJhbWVyYXRlLm51bSwKICAgICAgICAgICAgICAgIGN0eC0+dGltZV9pbmNyZW1lbnRfYml0cywKICAgICAgICAgICAgICAgIHMtPnF1YW50X3ByZWNpc2lvbiwKICAgICAgICAgICAgICAgIHMtPnByb2dyZXNzaXZlX3NlcXVlbmNlLAorICAgICAgICAgICAgICAgcy0+bG93X2RlbGF5LAogICAgICAgICAgICAgICAgY3R4LT5zY2FsYWJpbGl0eSA/ICJzY2FsYWJpbGl0eSAiIDoiIiAsIHMtPnF1YXJ0ZXJfc2FtcGxlID8gInFwZWwgIiA6ICIiLAogICAgICAgICAgICAgICAgcy0+ZGF0YV9wYXJ0aXRpb25pbmcgPyAicGFydGl0aW9uICIgOiAiIiwgY3R4LT5ydmxjID8gInJ2bGMgIiA6ICIiCiAgICAgICAgICk7CkBAIC0yMTAxLDggKzI0NjQsMTUgQEAKICAgICAgICAgZSA9IHNzY2FuZihidWYsICJGRm1wZWcgdiVkLiVkLiVkIC8gbGliYXZjb2RlYyBidWlsZDogJWQiLCAmdmVyLCAmdmVyMiwgJnZlcjMsICZidWlsZCk7CiAgICAgaWYgKGUgIT0gNCkgewogICAgICAgICBlID0gc3NjYW5mKGJ1ZiwgIkxhdmMlZC4lZC4lZCIsICZ2ZXIsICZ2ZXIyLCAmdmVyMykgKyAxOwotICAgICAgICBpZiAoZSA+IDEpCi0gICAgICAgICAgICBidWlsZCA9ICh2ZXIgPDwgMTYpICsgKHZlcjIgPDwgOCkgKyB2ZXIzOworICAgICAgICBpZiAoZSA+IDEpIHsKKyAgICAgICAgICAgIGlmICh2ZXIgPiAweEZGVSB8fCB2ZXIyID4gMHhGRlUgfHwgdmVyMyA+IDB4RkZVKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICJVbmtub3duIExhdmMgdmVyc2lvbiBzdHJpbmcgZW5jb3VudGVyZWQsICVkLiVkLiVkOyAiCisgICAgICAgICAgICAgICAgICAgICAiY2xhbXBpbmcgc3ViLXZlcnNpb24gdmFsdWVzIHRvIDgtYml0cy5cbiIsCisgICAgICAgICAgICAgICAgICAgICB2ZXIsIHZlcjIsIHZlcjMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGQgPSAoKHZlciAmIDB4RkYpIDw8IDE2KSArICgodmVyMiAmIDB4RkYpIDw8IDgpICsgKHZlcjMgJiAweEZGKTsKKyAgICAgICAgfQogICAgIH0KICAgICBpZiAoZSAhPSA0KSB7CiAgICAgICAgIGlmIChzdHJjbXAoYnVmLCAiZmZtcGVnIikgPT0gMCkKQEAgLTIxODUsNiArMjU1NSwxMyBAQAogICAgICAgICBpZiAoY3R4LT5sYXZjX2J1aWxkIDw9IDQ3MTJVKQogICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19EQ19DTElQOwogCisgICAgICAgIGlmICgoY3R4LT5sYXZjX2J1aWxkJjB4RkYpID49IDEwMCkgeworICAgICAgICAgICAgaWYgKGN0eC0+bGF2Y19idWlsZCA+IDM2MjE0NzYgJiYgY3R4LT5sYXZjX2J1aWxkIDwgMzc1MjU1MiAmJgorICAgICAgICAgICAgICAgKGN0eC0+bGF2Y19idWlsZCA8IDM3NTIwMzcgfHwgY3R4LT5sYXZjX2J1aWxkID4gMzc1MjE5MSkgLy8gMy4yLjErCisgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19JRURHRTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChjdHgtPmRpdnhfdmVyc2lvbiA+PSAwKQogICAgICAgICAgICAgcy0+d29ya2Fyb3VuZF9idWdzIHw9IEZGX0JVR19ESVJFQ1RfQkxPQ0tTSVpFOwogICAgICAgICBpZiAoY3R4LT5kaXZ4X3ZlcnNpb24gPT0gNTAxICYmIGN0eC0+ZGl2eF9idWlsZCA9PSAyMDAyMDQxNikKQEAgLTIyMzYsNiArMjYxMyw3IEBACiAgICAgaW50IHRpbWVfaW5jciwgdGltZV9pbmNyZW1lbnQ7CiAgICAgaW50NjRfdCBwdHM7CiAKKyAgICBzLT5tY3NlbCAgICAgICA9IDA7CiAgICAgcy0+cGljdF90eXBlID0gZ2V0X2JpdHMoZ2IsIDIpICsgQVZfUElDVFVSRV9UWVBFX0k7ICAgICAgICAvKiBwaWN0IHR5cGU6IEkgPSAwICwgUCA9IDEgKi8KICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmIHMtPmxvd19kZWxheSAmJgogICAgICAgICBjdHgtPnZvbF9jb250cm9sX3BhcmFtZXRlcnMgPT0gMCAmJiAhKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfTE9XX0RFTEFZKSkgewpAQCAtMjI1Myw3ICsyNjMxLDcgQEAKICAgICB3aGlsZSAoZ2V0X2JpdHMxKGdiKSAhPSAwKQogICAgICAgICB0aW1lX2luY3IrKzsKIAotICAgIGNoZWNrX21hcmtlcihnYiwgImJlZm9yZSB0aW1lX2luY3JlbWVudCIpOworICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJiZWZvcmUgdGltZV9pbmNyZW1lbnQiKTsKIAogICAgIGlmIChjdHgtPnRpbWVfaW5jcmVtZW50X2JpdHMgPT0gMCB8fAogICAgICAgICAhKHNob3dfYml0cyhnYiwgY3R4LT50aW1lX2luY3JlbWVudF9iaXRzICsgMSkgJiAxKSkgewpAQCAtMjI4OCw3ICsyNjY2LDcgQEAKICAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CiAgICAgICAgIHMtPmxhc3RfdGltZV9iYXNlID0gcy0+dGltZV9iYXNlOwogICAgICAgICBzLT50aW1lX2Jhc2UgICAgICs9IHRpbWVfaW5jcjsKLSAgICAgICAgcy0+dGltZSA9IHMtPnRpbWVfYmFzZSAqIHMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtICsgdGltZV9pbmNyZW1lbnQ7CisgICAgICAgIHMtPnRpbWUgPSBzLT50aW1lX2Jhc2UgKiAoaW50NjRfdClzLT5hdmN0eC0+ZnJhbWVyYXRlLm51bSArIHRpbWVfaW5jcmVtZW50OwogICAgICAgICBpZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX1VNUDQpIHsKICAgICAgICAgICAgIGlmIChzLT50aW1lIDwgcy0+bGFzdF9ub25fYl90aW1lKSB7CiAgICAgICAgICAgICAgICAgLyogaGVhZGVyIGlzIG5vdCBtcGVnLTQtY29tcGF0aWJsZSwgYnJva2VuIGVuY29kZXIsCkBAIC0yMzAwLDEyICsyNjc4LDEyIEBACiAgICAgICAgIHMtPnBwX3RpbWUgICAgICAgICA9IHMtPnRpbWUgLSBzLT5sYXN0X25vbl9iX3RpbWU7CiAgICAgICAgIHMtPmxhc3Rfbm9uX2JfdGltZSA9IHMtPnRpbWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcy0+dGltZSAgICA9IChzLT5sYXN0X3RpbWVfYmFzZSArIHRpbWVfaW5jcikgKiBzLT5hdmN0eC0+ZnJhbWVyYXRlLm51bSArIHRpbWVfaW5jcmVtZW50OworICAgICAgICBzLT50aW1lICAgID0gKHMtPmxhc3RfdGltZV9iYXNlICsgdGltZV9pbmNyKSAqIChpbnQ2NF90KXMtPmF2Y3R4LT5mcmFtZXJhdGUubnVtICsgdGltZV9pbmNyZW1lbnQ7CiAgICAgICAgIHMtPnBiX3RpbWUgPSBzLT5wcF90aW1lIC0gKHMtPmxhc3Rfbm9uX2JfdGltZSAtIHMtPnRpbWUpOwogICAgICAgICBpZiAocy0+cHBfdGltZSA8PSBzLT5wYl90aW1lIHx8CiAgICAgICAgICAgICBzLT5wcF90aW1lIDw9IHMtPnBwX3RpbWUgLSBzLT5wYl90aW1lIHx8CiAgICAgICAgICAgICBzLT5wcF90aW1lIDw9IDApIHsKLSAgICAgICAgICAgIC8qIG1lc3NlZCB1cCBvcmRlciwgbWF5YmUgYWZ0ZXIgc2Vla2luZz8gc2tpcHBpbmcgY3VycmVudCBiLWZyYW1lICovCisgICAgICAgICAgICAvKiBtZXNzZWQgdXAgb3JkZXIsIG1heWJlIGFmdGVyIHNlZWtpbmc/IHNraXBwaW5nIGN1cnJlbnQgQi1mcmFtZSAqLwogICAgICAgICAgICAgcmV0dXJuIEZSQU1FX1NLSVBQRUQ7CiAgICAgICAgIH0KICAgICAgICAgZmZfbXBlZzRfaW5pdF9kaXJlY3RfbXYocyk7CkBAIC0yMzMyLDcgKzI3MTAsNyBAQAogICAgICAgICBwdHMgPSBBVl9OT1BUU19WQUxVRTsKICAgICBmZl9kbG9nKHMtPmF2Y3R4LCAiTVBFRzQgUFRTOiAlIlBSSWQ2NCJcbiIsIHB0cyk7CiAKLSAgICBjaGVja19tYXJrZXIoZ2IsICJiZWZvcmUgdm9wX2NvZGVkIik7CisgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImJlZm9yZSB2b3BfY29kZWQiKTsKIAogICAgIC8qIHZvcCBjb2RlZCAqLwogICAgIGlmIChnZXRfYml0czEoZ2IpICE9IDEpIHsKQEAgLTIzNTcsMTEgKzI3MzUsMTEgQEAKICAgICBpZiAoY3R4LT5zaGFwZSAhPSBSRUNUX1NIQVBFKSB7CiAgICAgICAgIGlmIChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgIT0gMSB8fCBzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTMpOyAgLyogd2lkdGggKi8KLSAgICAgICAgICAgIGNoZWNrX21hcmtlcihnYiwgImFmdGVyIHdpZHRoIik7CisgICAgICAgICAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYWZ0ZXIgd2lkdGgiKTsKICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTMpOyAgLyogaGVpZ2h0ICovCi0gICAgICAgICAgICBjaGVja19tYXJrZXIoZ2IsICJhZnRlciBoZWlnaHQiKTsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJhZnRlciBoZWlnaHQiKTsKICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTMpOyAgLyogaG9yX3NwYXRfcmVmICovCi0gICAgICAgICAgICBjaGVja19tYXJrZXIoZ2IsICJhZnRlciBob3Jfc3BhdF9yZWYiKTsKKyAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJhZnRlciBob3Jfc3BhdF9yZWYiKTsKICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTMpOyAgLyogdmVyX3NwYXRfcmVmICovCiAgICAgICAgIH0KICAgICAgICAgc2tpcF9iaXRzMShnYik7ICAgICAgICAgLyogY2hhbmdlX0NSX2Rpc2FibGUgKi8KQEAgLTI0MDMsMjMgKzI3ODEsMjcgQEAKICAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfdl9zY2FudGFibGUsIGZmX2FsdGVybmF0ZV92ZXJ0aWNhbF9zY2FuKTsKICAgICB9CiAKLSAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TICYmCi0gICAgICAgIChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gU1RBVElDX1NQUklURSB8fAotICAgICAgICAgY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IEdNQ19TUFJJVEUpKSB7Ci0gICAgICAgIGlmIChtcGVnNF9kZWNvZGVfc3ByaXRlX3RyYWplY3RvcnkoY3R4LCBnYikgPCAwKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIGlmIChjdHgtPnNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSkKLSAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJzcHJpdGVfYnJpZ2h0bmVzc19jaGFuZ2Ugbm90IHN1cHBvcnRlZFxuIik7Ci0gICAgICAgIGlmIChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gU1RBVElDX1NQUklURSkKLSAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3RhdGljIHNwcml0ZSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9TKSB7CisgICAgICAgIGlmKChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gU1RBVElDX1NQUklURSB8fAorICAgICAgICAgICAgY3R4LT52b2xfc3ByaXRlX3VzYWdlID09IEdNQ19TUFJJVEUpKSB7CisgICAgICAgICAgICBpZiAobXBlZzRfZGVjb2RlX3Nwcml0ZV90cmFqZWN0b3J5KGN0eCwgZ2IpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmIChjdHgtPnNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgInNwcml0ZV9icmlnaHRuZXNzX2NoYW5nZSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIGlmIChjdHgtPnZvbF9zcHJpdGVfdXNhZ2UgPT0gU1RBVElDX1NQUklURSkKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInN0YXRpYyBzcHJpdGUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQocy0+c3ByaXRlX29mZnNldCwgMCwgc2l6ZW9mKHMtPnNwcml0ZV9vZmZzZXQpKTsKKyAgICAgICAgICAgIG1lbXNldChzLT5zcHJpdGVfZGVsdGEsIDAsIHNpemVvZihzLT5zcHJpdGVfZGVsdGEpKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChjdHgtPnNoYXBlICE9IEJJTl9PTkxZX1NIQVBFKSB7CiAgICAgICAgIHMtPmNocm9tYV9xc2NhbGUgPSBzLT5xc2NhbGUgPSBnZXRfYml0cyhnYiwgcy0+cXVhbnRfcHJlY2lzaW9uKTsKICAgICAgICAgaWYgKHMtPnFzY2FsZSA9PSAwKSB7CiAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiRXJyb3IsIGhlYWRlciBkYW1hZ2VkIG9yIG5vdCBNUEVHNCBoZWFkZXIgKHFzY2FsZT0wKVxuIik7CisgICAgICAgICAgICAgICAgICAgIkVycm9yLCBoZWFkZXIgZGFtYWdlZCBvciBub3QgTVBFRy00IGhlYWRlciAocXNjYWxlPTApXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAgLy8gbWFrZXMgbm8gc2Vuc2UgdG8gY29udGludWUsIGFzIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCBmcm9tIHRoZSBpbWFnZSB0aGVuCiAgICAgICAgIH0KIApAQCAtMjQyNyw3ICsyODA5LDcgQEAKICAgICAgICAgICAgIHMtPmZfY29kZSA9IGdldF9iaXRzKGdiLCAzKTsgICAgICAgIC8qIGZjb2RlX2ZvciAqLwogICAgICAgICAgICAgaWYgKHMtPmZfY29kZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJFcnJvciwgaGVhZGVyIGRhbWFnZWQgb3Igbm90IE1QRUc0IGhlYWRlciAoZl9jb2RlPTApXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yLCBoZWFkZXIgZGFtYWdlZCBvciBub3QgTVBFRy00IGhlYWRlciAoZl9jb2RlPTApXG4iKTsKICAgICAgICAgICAgICAgICBzLT5mX2NvZGUgPSAxOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAgLy8gbWFrZXMgbm8gc2Vuc2UgdG8gY29udGludWUsIGFzIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCBmcm9tIHRoZSBpbWFnZSB0aGVuCiAgICAgICAgICAgICB9CkBAIC0yNDc3LDcgKzI4NTksNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8qIGRldGVjdCBidWdneSBlbmNvZGVycyB3aGljaCBkb24ndCBzZXQgdGhlIGxvd19kZWxheSBmbGFnCi0gICAgICogKGRpdng0L3h2aWQvb3BlbmRpdngpLiBOb3RlIHdlIGNhbm5vdCBkZXRlY3QgZGl2eDUgd2l0aG91dCBiLWZyYW1lcworICAgICAqIChkaXZ4NC94dmlkL29wZW5kaXZ4KS4gTm90ZSB3ZSBjYW5ub3QgZGV0ZWN0IGRpdng1IHdpdGhvdXQgQi1mcmFtZXMKICAgICAgKiBlYXNpbHkgKGFsdGhvdWdoIGl0J3MgYnVnZ3kgdG9vKSAqLwogICAgIGlmIChzLT52b190eXBlID09IDAgJiYgY3R4LT52b2xfY29udHJvbF9wYXJhbWV0ZXJzID09IDAgJiYKICAgICAgICAgY3R4LT5kaXZ4X3ZlcnNpb24gPT0gLTEgJiYgcy0+cGljdHVyZV9udW1iZXIgPT0gMCkgewpAQCAtMjQ5OSw4ICsyODgxLDI0NSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJlYWRfcXVhbnRfbWF0cml4X2V4dChNcGVnRW5jQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgaW50IGksIGosIHY7CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA2NCo4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIC8qIGludHJhX3F1YW50aXNlcl9tYXRyaXggKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIHYgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBqID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworICAgICAgICAgICAgcy0+aW50cmFfbWF0cml4W2pdICAgICAgICA9IHY7CisgICAgICAgICAgICBzLT5jaHJvbWFfaW50cmFfbWF0cml4W2pdID0gdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDY0KjgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgLyogbm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXggKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDY0KjgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgLyogY2hyb21hX2ludHJhX3F1YW50aXNlcl9tYXRyaXggKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgIHYgPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBqID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOworICAgICAgICAgICAgcy0+Y2hyb21hX2ludHJhX21hdHJpeFtqXSA9IHY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA2NCo4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIC8qIGNocm9tYV9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICB9CisgICAgfQorCisgICAgbmV4dF9zdGFydF9jb2RlX3N0dWRpbyhnYik7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4dGVuc2lvbl9hbmRfdXNlcl9kYXRhKE1wZWdFbmNDb250ZXh0ICpzLCBHZXRCaXRDb250ZXh0ICpnYiwgaW50IGlkKQoreworICAgIHVpbnQzMl90IHN0YXJ0Y29kZTsKKyAgICB1aW50OF90IGV4dGVuc2lvbl90eXBlOworCisgICAgc3RhcnRjb2RlID0gc2hvd19iaXRzX2xvbmcoZ2IsIDMyKTsKKyAgICBpZiAoc3RhcnRjb2RlID09IFVTRVJfREFUQV9TVEFSVENPREUgfHwgc3RhcnRjb2RlID09IEVYVF9TVEFSVENPREUpIHsKKworICAgICAgICBpZiAoKGlkID09IDIgfHwgaWQgPT0gNCkgJiYgc3RhcnRjb2RlID09IEVYVF9TVEFSVENPREUpIHsKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCAzMik7CisgICAgICAgICAgICBleHRlbnNpb25fdHlwZSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgICAgIGlmIChleHRlbnNpb25fdHlwZSA9PSBRVUFOVF9NQVRSSVhfRVhUX0lEKQorICAgICAgICAgICAgICAgIHJlYWRfcXVhbnRfbWF0cml4X2V4dChzLCBnYik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9zbXB0ZV90YyhNcGVnNERlY0NvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworCisgICAgc2tpcF9iaXRzKGdiLCAxNik7IC8qIFRpbWVfY29kZVs2My4uNDhdICovCisgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIFRpbWVfY29kZVs2My4uNDhdIik7CisgICAgc2tpcF9iaXRzKGdiLCAxNik7IC8qIFRpbWVfY29kZVs0Ny4uMzJdICovCisgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIFRpbWVfY29kZVs0Ny4uMzJdIik7CisgICAgc2tpcF9iaXRzKGdiLCAxNik7IC8qIFRpbWVfY29kZVszMS4uMTZdICovCisgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIFRpbWVfY29kZVszMS4uMTZdIik7CisgICAgc2tpcF9iaXRzKGdiLCAxNik7IC8qIFRpbWVfY29kZVsxNS4uMF0gKi8KKyAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYWZ0ZXIgVGltZV9jb2RlWzE1Li4wXSIpOworICAgIHNraXBfYml0cyhnYiwgNCk7IC8qIHJlc2VydmVkX2JpdHMgKi8KK30KKwogLyoqCi0gKiBEZWNvZGUgbXBlZzQgaGVhZGVycy4KKyAqIERlY29kZSB0aGUgbmV4dCBzdHVkaW8gdm9wIGhlYWRlci4KKyAqIEByZXR1cm4gPDAgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAqLworc3RhdGljIGludCBkZWNvZGVfc3R1ZGlvX3ZvcF9oZWFkZXIoTXBlZzREZWNDb250ZXh0ICpjdHgsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJmN0eC0+bTsKKworICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8PSAzMikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzLT5wYXJ0aXRpb25lZF9mcmFtZSA9IDA7CisgICAgcy0+aW50ZXJsYWNlZF9kY3QgPSAwOworICAgIHMtPmRlY29kZV9tYiA9IG1wZWc0X2RlY29kZV9zdHVkaW9fbWI7CisKKyAgICBkZWNvZGVfc21wdGVfdGMoY3R4LCBnYik7CisKKyAgICBza2lwX2JpdHMoZ2IsIDEwKTsgLyogdGVtcG9yYWxfcmVmZXJlbmNlICovCisgICAgc2tpcF9iaXRzKGdiLCAyKTsgLyogdm9wX3N0cnVjdHVyZSAqLworICAgIHMtPnBpY3RfdHlwZSA9IGdldF9iaXRzKGdiLCAyKSArIEFWX1BJQ1RVUkVfVFlQRV9JOyAvKiB2b3BfY29kaW5nX3R5cGUgKi8KKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeyAvKiB2b3BfY29kZWQgKi8KKyAgICAgICAgc2tpcF9iaXRzMShnYik7IC8qIHRvcF9maWVsZF9maXJzdCAqLworICAgICAgICBza2lwX2JpdHMxKGdiKTsgLyogcmVwZWF0X2ZpcnN0X2ZpZWxkICovCisgICAgICAgIHMtPnByb2dyZXNzaXZlX2ZyYW1lID0gZ2V0X2JpdHMxKGdiKSBeIDE7IC8qIHByb2dyZXNzaXZlX2ZyYW1lICovCisgICAgfQorCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkKKyAgICAgICAgICAgIHJlc2V0X3N0dWRpb19kY19wcmVkaWN0b3JzKHMpOworICAgIH0KKworICAgIGlmIChjdHgtPnNoYXBlICE9IEJJTl9PTkxZX1NIQVBFKSB7CisgICAgICAgIHMtPmFsdGVybmF0ZV9zY2FuID0gZ2V0X2JpdHMxKGdiKTsKKyAgICAgICAgcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QgPSBnZXRfYml0czEoZ2IpOworICAgICAgICBzLT5kY3RfcHJlY2lzaW9uID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICBzLT5pbnRyYV9kY19wcmVjaXNpb24gPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIHMtPnFfc2NhbGVfdHlwZSA9IGdldF9iaXRzMShnYik7CisgICAgfQorCisgICAgaWYgKHMtPmFsdGVybmF0ZV9zY2FuKSB7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludGVyX3NjYW50YWJsZSwgICBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX3NjYW50YWJsZSwgICBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX2hfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX3Zfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfdmVydGljYWxfc2Nhbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50ZXJfc2NhbnRhYmxlLCAgIGZmX3ppZ3phZ19kaXJlY3QpOworICAgICAgICBmZl9pbml0X3NjYW50YWJsZShzLT5pZHNwLmlkY3RfcGVybXV0YXRpb24sICZzLT5pbnRyYV9zY2FudGFibGUsICAgZmZfemlnemFnX2RpcmVjdCk7CisgICAgICAgIGZmX2luaXRfc2NhbnRhYmxlKHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbiwgJnMtPmludHJhX2hfc2NhbnRhYmxlLCBmZl9hbHRlcm5hdGVfaG9yaXpvbnRhbF9zY2FuKTsKKyAgICAgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfdl9zY2FudGFibGUsIGZmX2FsdGVybmF0ZV92ZXJ0aWNhbF9zY2FuKTsKKyAgICB9CisKKyAgICBtcGVnNF9sb2FkX2RlZmF1bHRfbWF0cmljZXMocyk7CisKKyAgICBuZXh0X3N0YXJ0X2NvZGVfc3R1ZGlvKGdiKTsKKyAgICBleHRlbnNpb25fYW5kX3VzZXJfZGF0YShzLCBnYiwgNCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfc3R1ZGlvdmlzdWFsb2JqZWN0KE1wZWc0RGVjQ29udGV4dCAqY3R4LCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisgICAgaW50IHZpc3VhbF9vYmplY3RfdHlwZTsKKworICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOyAvKiB2aXN1YWxfb2JqZWN0X3ZlcmlkICovCisgICAgICAgIHZpc3VhbF9vYmplY3RfdHlwZSA9IGdldF9iaXRzKGdiLCA0KTsKKyAgICAgICAgaWYgKHZpc3VhbF9vYmplY3RfdHlwZSAhPSBWT1RfVklERU9fSUQpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlZPIHR5cGUgJXUiLCB2aXN1YWxfb2JqZWN0X3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisKKyAgICAgICAgbmV4dF9zdGFydF9jb2RlX3N0dWRpbyhnYik7CisgICAgICAgIGV4dGVuc2lvbl9hbmRfdXNlcl9kYXRhKHMsIGdiLCAxKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9zdHVkaW9fdm9sX2hlYWRlcihNcGVnNERlY0NvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGludCBiaXRzX3Blcl9yYXdfc2FtcGxlOworCisgICAgICAgICAgICAvLyByYW5kb21fYWNjZXNzaWJsZV92b2wgYW5kIHZpZGVvX29iamVjdF90eXBlX2luZGljYXRpb24gaGF2ZSBhbHJlYWR5CisgICAgICAgICAgICAvLyBiZWVuIHJlYWQgYnkgdGhlIGNhbGxlciBkZWNvZGVfdm9sX2hlYWRlcigpCisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOyAvKiB2aWRlb19vYmplY3RfbGF5ZXJfdmVyaWQgKi8KKyAgICAgICAgICAgIGN0eC0+c2hhcGUgPSBnZXRfYml0cyhnYiwgMik7IC8qIHZpZGVvX29iamVjdF9sYXllcl9zaGFwZSAqLworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA0KTsgLyogdmlkZW9fb2JqZWN0X2xheWVyX3NoYXBlX2V4dGVuc2lvbiAqLworICAgICAgICAgICAgc2tpcF9iaXRzMShnYik7IC8qIHByb2dyZXNzaXZlX3NlcXVlbmNlICovCisgICAgICAgICAgICBpZiAoY3R4LT5zaGFwZSAhPSBCSU5fT05MWV9TSEFQRSkgeworICAgICAgICAgICAgICAgIGN0eC0+cmdiID0gZ2V0X2JpdHMxKGdiKTsgLyogcmdiX2NvbXBvbmVudHMgKi8KKyAgICAgICAgICAgICAgICBzLT5jaHJvbWFfZm9ybWF0ID0gZ2V0X2JpdHMoZ2IsIDIpOyAvKiBjaHJvbWFfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgaWYgKCFzLT5jaHJvbWFfZm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBjaHJvbWEgZm9ybWF0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYml0c19wZXJfcmF3X3NhbXBsZSA9IGdldF9iaXRzKGdiLCA0KTsgLyogYml0X2RlcHRoICovCisgICAgICAgICAgICAgICAgaWYgKGJpdHNfcGVyX3Jhd19zYW1wbGUgPT0gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+cmdiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDEwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnBpeF9mbXQgPSBzLT5jaHJvbWFfZm9ybWF0ID09IENIUk9NQV80MjIgPyBBVl9QSVhfRk1UX1lVVjQyMlAxMCA6IEFWX1BJWF9GTVRfWVVWNDQ0UDEwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJNUEVHLTQgU3R1ZGlvIHByb2ZpbGUgYml0LWRlcHRoICV1IiwgYml0c19wZXJfcmF3X3NhbXBsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSBiaXRzX3Blcl9yYXdfc2FtcGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGN0eC0+c2hhcGUgPT0gUkVDVF9TSEFQRSkgeworICAgICAgICAgICAgICAgIGNoZWNrX21hcmtlcihzLT5hdmN0eCwgZ2IsICJiZWZvcmUgdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoIik7CisgICAgICAgICAgICAgICAgd2lkdGggPSBnZXRfYml0cyhnYiwgMTQpOyAvKiB2aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggKi8KKyAgICAgICAgICAgICAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYmVmb3JlIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQiKTsKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBnZXRfYml0cyhnYiwgMTQpOyAvKiB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ICovCisgICAgICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIHZpZGVvX29iamVjdF9sYXllcl9oZWlnaHQiKTsKKworICAgICAgICAgICAgICAgIC8qIERvIHRoZSBzYW1lIGNoZWNrIGFzIG5vbi1zdHVkaW8gcHJvZmlsZSAqLworICAgICAgICAgICAgICAgIGlmICh3aWR0aCAmJiBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPndpZHRoICYmIHMtPmhlaWdodCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHMtPndpZHRoICE9IHdpZHRoIHx8IHMtPmhlaWdodCAhPSBoZWlnaHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29udGV4dF9yZWluaXQgPSAxOworICAgICAgICAgICAgICAgICAgICBzLT53aWR0aCAgPSB3aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgcy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmFzcGVjdF9yYXRpb19pbmZvID0gZ2V0X2JpdHMoZ2IsIDQpOworICAgICAgICAgICAgaWYgKHMtPmFzcGVjdF9yYXRpb19pbmZvID09IEZGX0FTUEVDVF9FWFRFTkRFRCkgeworICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA9IGdldF9iaXRzKGdiLCA4KTsgIC8vIHBhcl93aWR0aAorICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IGdldF9iaXRzKGdiLCA4KTsgIC8vIHBhcl9oZWlnaHQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBmZl9oMjYzX3BpeGVsX2FzcGVjdFtzLT5hc3BlY3RfcmF0aW9faW5mb107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDQpOyAvKiBmcmFtZV9yYXRlX2NvZGUgKi8KKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTUpOyAvKiBmaXJzdF9oYWxmX2JpdF9yYXRlICovCisgICAgICAgICAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYWZ0ZXIgZmlyc3RfaGFsZl9iaXRfcmF0ZSIpOworICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAxNSk7IC8qIGxhdHRlcl9oYWxmX2JpdF9yYXRlICovCisgICAgICAgICAgICBjaGVja19tYXJrZXIocy0+YXZjdHgsIGdiLCAiYWZ0ZXIgbGF0dGVyX2hhbGZfYml0X3JhdGUiKTsKKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTUpOyAvKiBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSAqLworICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIGZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplIik7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDMpOyAvKiBsYXR0ZXJfaGFsZl92YnZfYnVmZmVyX3NpemUgKi8KKyAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMTEpOyAvKiBmaXJzdF9oYWxmX3Zidl9idWZmZXJfc2l6ZSAqLworICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIGZpcnN0X2hhbGZfdmJ2X2J1ZmZlcl9zaXplIik7CisgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDE1KTsgLyogbGF0dGVyX2hhbGZfdmJ2X29jY3VwYW5jeSAqLworICAgICAgICAgICAgY2hlY2tfbWFya2VyKHMtPmF2Y3R4LCBnYiwgImFmdGVyIGxhdHRlcl9oYWxmX3Zidl9vY2N1cGFuY3kiKTsKKyAgICAgICAgICAgIHMtPmxvd19kZWxheSA9IGdldF9iaXRzMShnYik7CisgICAgICAgICAgICBzLT5tcGVnX3F1YW50ID0gZ2V0X2JpdHMxKGdiKTsgLyogbXBlZzJfc3RyZWFtICovCisKKyAgICAgICAgICAgIG5leHRfc3RhcnRfY29kZV9zdHVkaW8oZ2IpOworICAgICAgICAgICAgZXh0ZW5zaW9uX2FuZF91c2VyX2RhdGEocywgZ2IsIDIpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogRGVjb2RlIE1QRUctNCBoZWFkZXJzLgogICogQHJldHVybiA8MCBpZiBubyBWT1AgZm91bmQgKG9yIGEgZGFtYWdlZCBvbmUpCiAgKiAgICAgICAgIEZSQU1FX1NLSVBQRUQgaWYgYSBub3QgY29kZWQgVk9QIGlzIGZvdW5kCiAgKiAgICAgICAgIDAgaWYgYSBWT1AgaXMgZm91bmQKQEAgLTI1MTAsMTAgKzMxMjksMTcgQEAKICAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CiAgICAgdW5zaWduZWQgc3RhcnRjb2RlLCB2OwogICAgIGludCByZXQ7CisgICAgaW50IHZvbCA9IDA7CiAKICAgICAvKiBzZWFyY2ggbmV4dCBzdGFydCBjb2RlICovCiAgICAgYWxpZ25fZ2V0X2JpdHMoZ2IpOwogCisgICAgLy8gSWYgd2UgaGF2ZSBub3Qgc3dpdGNoZWQgdG8gc3R1ZGlvIHByb2ZpbGUgdGhhbiB3ZSBhbHNvIGRpZCBub3Qgc3dpdGNoIGJwcworICAgIC8vIHRoYXQgbWVhbnMgc29tZXRoaW5nIGVsc2UgKGxpa2UgYSBwcmV2aW91cyBpbnN0YW5jZSkgb3V0c2lkZSBzZXQgYnBzIHdoaWNoCisgICAgLy8gd291bGQgYmUgaW5jb25zaXN0YW50IHdpdGggdGhlIGN1cnJlY3Qgc3RhdGUsIHRodXMgcmVzZXQgaXQKKyAgICBpZiAoIXMtPnN0dWRpb19wcm9maWxlICYmIHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlICE9IDgpCisgICAgICAgIHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMDsKKwogICAgIGlmIChzLT5jb2RlY190YWcgPT0gQVZfUkwzMigiV1YxRiIpICYmIHNob3dfYml0cyhnYiwgMjQpID09IDB4NTc1NjMwKSB7CiAgICAgICAgIHNraXBfYml0cyhnYiwgMjQpOwogICAgICAgICBpZiAoZ2V0X2JpdHMoZ2IsIDgpID09IDB4RjApCkBAIC0yNTI4LDcgKzMxNTQsNyBAQAogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJmcmFtZSBza2lwICVkXG4iLCBnYi0+c2l6ZV9pbl9iaXRzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRlJBTUVfU0tJUFBFRDsgIC8vIGRpdnggYnVnCiAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7ICAvLyBlbmQgb2Ygc3RyZWFtCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7ICAvLyBlbmQgb2Ygc3RyZWFtCiAgICAgICAgIH0KIAogICAgICAgICAvKiB1c2UgdGhlIGJpdHMgYWZ0ZXIgdGhlIHRlc3QgKi8KQEAgLTI1OTgsNiArMzIyNCwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKHN0YXJ0Y29kZSA+PSAweDEyMCAmJiBzdGFydGNvZGUgPD0gMHgxMkYpIHsKKyAgICAgICAgICAgIGlmICh2b2wpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSWdub3JpbmcgbXVsdGlwbGUgVk9MIGhlYWRlcnNcbiIpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9sKys7CiAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV92b2xfaGVhZGVyKGN0eCwgZ2IpKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPT0gVVNFUl9EQVRBX1NUQVJUQ09ERSkgewpAQCAtMjYwNSw3ICszMjM2LDI1IEBACiAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRjb2RlID09IEdPUF9TVEFSVENPREUpIHsKICAgICAgICAgICAgIG1wZWc0X2RlY29kZV9nb3BfaGVhZGVyKHMsIGdiKTsKICAgICAgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPT0gVk9TX1NUQVJUQ09ERSkgewotICAgICAgICAgICAgbXBlZzRfZGVjb2RlX3Byb2ZpbGVfbGV2ZWwocywgZ2IpOworICAgICAgICAgICAgaW50IHByb2ZpbGUsIGxldmVsOworICAgICAgICAgICAgbXBlZzRfZGVjb2RlX3Byb2ZpbGVfbGV2ZWwocywgZ2IsICZwcm9maWxlLCAmbGV2ZWwpOworICAgICAgICAgICAgaWYgKHByb2ZpbGUgPT0gRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfU1RVRElPICYmCisgICAgICAgICAgICAgICAgKGxldmVsID4gMCAmJiBsZXZlbCA8IDkpKSB7CisgICAgICAgICAgICAgICAgcy0+c3R1ZGlvX3Byb2ZpbGUgPSAxOworICAgICAgICAgICAgICAgIG5leHRfc3RhcnRfY29kZV9zdHVkaW8oZ2IpOworICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9hbmRfdXNlcl9kYXRhKHMsIGdiLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3R1ZGlvX3Byb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJNaXhlcyBzdHVkaW8gYW5kIG5vbiBzdHVkaW8gcHJvZmlsZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+YXZjdHgtPnByb2ZpbGUgPSBwcm9maWxlOworICAgICAgICAgICAgcy0+YXZjdHgtPmxldmVsICAgPSBsZXZlbDsKKyAgICAgICAgfSBlbHNlIGlmIChzdGFydGNvZGUgPT0gVklTVUFMX09CSl9TVEFSVENPREUpIHsKKyAgICAgICAgICAgIGlmIChzLT5zdHVkaW9fcHJvZmlsZSkgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX3N0dWRpb3Zpc3VhbG9iamVjdChjdHgsIGdiKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgbXBlZzRfZGVjb2RlX3Zpc3VhbF9vYmplY3QocywgZ2IpOwogICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0Y29kZSA9PSBWT1BfU1RBUlRDT0RFKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjYxOSw3ICszMjY4LDE0IEBACiAgICAgICAgIHMtPmxvd19kZWxheSA9IDE7CiAgICAgcy0+YXZjdHgtPmhhc19iX2ZyYW1lcyA9ICFzLT5sb3dfZGVsYXk7CiAKLSAgICByZXR1cm4gZGVjb2RlX3ZvcF9oZWFkZXIoY3R4LCBnYik7CisgICAgaWYgKHMtPnN0dWRpb19wcm9maWxlKSB7CisgICAgICAgIGlmICghcy0+YXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBWT0wgaGVhZGVyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWNvZGVfc3R1ZGlvX3ZvcF9oZWFkZXIoY3R4LCBnYik7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBkZWNvZGVfdm9wX2hlYWRlcihjdHgsIGdiKTsKIH0KIAogYXZfY29sZCB2b2lkIGZmX21wZWc0dmlkZW9kZWNfc3RhdGljX2luaXQodm9pZCkgewpAQCAtMjcxOSw2ICszMzc1LDM3IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGF2X2NvbGQgaW50IGluaXRfc3R1ZGlvX3ZsY3MoTXBlZzREZWNDb250ZXh0ICpjdHgpCit7CisgICAgaW50IGksIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgIHJldCA9IGluaXRfdmxjKCZjdHgtPnN0dWRpb19pbnRyYV90YWJbaV0sIFNUVURJT19JTlRSQV9CSVRTLCAyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmZmX21wZWc0X3N0dWRpb19pbnRyYVtpXVswXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgJmZmX21wZWc0X3N0dWRpb19pbnRyYVtpXVswXVswXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IGluaXRfdmxjKCZjdHgtPnN0dWRpb19sdW1hX2RjLCBTVFVESU9fSU5UUkFfQklUUywgMTksCisgICAgICAgICAgICAgICAgICAgJmZmX21wZWc0X3N0dWRpb19kY19sdW1hWzBdWzFdLCA0LCAyLAorICAgICAgICAgICAgICAgICAgICZmZl9tcGVnNF9zdHVkaW9fZGNfbHVtYVswXVswXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGluaXRfdmxjKCZjdHgtPnN0dWRpb19jaHJvbWFfZGMsIFNUVURJT19JTlRSQV9CSVRTLCAxOSwKKyAgICAgICAgICAgICAgICAgICAmZmZfbXBlZzRfc3R1ZGlvX2RjX2Nocm9tYVswXVsxXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgICAmZmZfbXBlZzRfc3R1ZGlvX2RjX2Nocm9tYVswXVswXSwgNCwgMiwKKyAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIE1wZWc0RGVjQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKQEAgLTI3MzQsNiArMzQyMSw4IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBmZl9tcGVnNHZpZGVvZGVjX3N0YXRpY19pbml0KCk7CisgICAgaWYgKChyZXQgPSBpbml0X3N0dWRpb192bGNzKGN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIHMtPmgyNjNfcHJlZCA9IDE7CiAgICAgcy0+bG93X2RlbGF5ID0gMDsgLyogZGVmYXVsdCwgbWlnaHQgYmUgb3ZlcnJpZGRlbiBpbiB0aGUgdm9sIGhlYWRlciBkdXJpbmcgaGVhZGVyIHBhcnNpbmcgKi8KQEAgLTI3NDYsNiArMzQzNSwyMiBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXBlZzREZWNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYgKCFhdmN0eC0+aW50ZXJuYWwtPmlzX2NvcHkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspCisgICAgICAgICAgICBmZl9mcmVlX3ZsYygmY3R4LT5zdHVkaW9faW50cmFfdGFiW2ldKTsKKworICAgICAgICBmZl9mcmVlX3ZsYygmY3R4LT5zdHVkaW9fbHVtYV9kYyk7CisgICAgICAgIGZmX2ZyZWVfdmxjKCZjdHgtPnN0dWRpb19jaHJvbWFfZGMpOworICAgIH0KKworICAgIHJldHVybiBmZl9oMjYzX2RlY29kZV9lbmQoYXZjdHgpOworfQorCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gbXBlZzRfb3B0aW9uc1tdID0gewogICAgIHsicXVhcnRlcl9zYW1wbGUiLCAiMS80IHN1YnBlbCBNQyIsIG9mZnNldG9mKE1wZWdFbmNDb250ZXh0LCBxdWFydGVyX3NhbXBsZSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIDAsIDEsIDB9LAogICAgIHsiZGl2eF9wYWNrZWQiLCAiZGl2eCBzdHlsZSBwYWNrZWQgYiBmcmFtZXMiLCBvZmZzZXRvZihNcGVnRW5jQ29udGV4dCwgZGl2eF9wYWNrZWQpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDB9LCAwLCAxLCAwfSwKQEAgLTI3NTMsMTAgKzM0NTgsMTAgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBBVkNsYXNzIG1wZWc0X2NsYXNzID0gewotICAgICJNUEVHNCBWaWRlbyBEZWNvZGVyIiwKLSAgICBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKLSAgICBtcGVnNF9vcHRpb25zLAotICAgIExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2xhc3NfbmFtZSA9ICJNUEVHNCBWaWRlbyBEZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gbXBlZzRfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKIH07CiAKIEFWQ29kZWMgZmZfbXBlZzRfZGVjb2RlciA9IHsKQEAgLTI3NjYsNDEgKzM0NzEsMzEgQEAKICAgICAuaWQgICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzQsCiAgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihNcGVnNERlY0NvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZW5kLAorICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSBkZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IEFWX0NPREVDX0NBUF9EUjEgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19DQVBfVFJVTkNBVEVEIHwgQVZfQ09ERUNfQ0FQX0RFTEFZIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgICA9IEZGX0NPREVDX0NBUF9TS0lQX0ZSQU1FX0ZJTExfUEFSQU0sCiAgICAgLmZsdXNoICAgICAgICAgICAgICAgICA9IGZmX21wZWdfZmx1c2gsCiAgICAgLm1heF9sb3dyZXMgICAgICAgICAgICA9IDMsCiAgICAgLnBpeF9mbXRzICAgICAgICAgICAgICA9IGZmX2gyNjNfaHdhY2NlbF9waXhmbXRfbGlzdF80MjAsCiAgICAgLnByb2ZpbGVzICAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX21wZWc0X3ZpZGVvX3Byb2ZpbGVzKSwKICAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQobXBlZzRfdXBkYXRlX3RocmVhZF9jb250ZXh0KSwKICAgICAucHJpdl9jbGFzcyA9ICZtcGVnNF9jbGFzcywKLX07Ci0KLQotI2lmIENPTkZJR19NUEVHNF9WRFBBVV9ERUNPREVSICYmIEZGX0FQSV9WRFBBVQotc3RhdGljIGNvbnN0IEFWQ2xhc3MgbXBlZzRfdmRwYXVfY2xhc3MgPSB7Ci0gICAgIk1QRUc0IFZpZGVvIFZEUEFVIERlY29kZXIiLAotICAgIGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIG1wZWc0X29wdGlvbnMsCi0gICAgTElCQVZVVElMX1ZFUlNJT05fSU5ULAotfTsKLQotQVZDb2RlYyBmZl9tcGVnNF92ZHBhdV9kZWNvZGVyID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnNF92ZHBhdSIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctNCBwYXJ0IDIgKFZEUEFVKSIpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXBlZzREZWNDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCi0gICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9UUlVOQ0FURUQgfCBBVl9DT0RFQ19DQVBfREVMQVkgfAotICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1ZEUEFVX01QRUc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfSwKLSAgICAucHJpdl9jbGFzcyAgICAgPSAmbXBlZzRfdmRwYXVfY2xhc3MsCi19OworICAgIC5od19jb25maWdzICAgICAgICAgICAgPSAoY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwqW10pIHsKKyNpZiBDT05GSUdfTVBFRzRfTlZERUNfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfTlZERUMobXBlZzQpLAogI2VuZGlmCisjaWYgQ09ORklHX01QRUc0X1ZBQVBJX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZBQVBJKG1wZWc0KSwKKyNlbmRpZgorI2lmIENPTkZJR19NUEVHNF9WRFBBVV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9WRFBBVShtcGVnNCksCisjZW5kaWYKKyNpZiBDT05GSUdfTVBFRzRfVklERU9UT09MQk9YX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZJREVPVE9PTEJPWChtcGVnNCksCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZzR2aWRlb2VuYy5jIGIvbGliYXZjb2RlYy9tcGVnNHZpZGVvZW5jLmMKaW5kZXggMWJhOTIzOC4uZjZhNTk5MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnNHZpZGVvZW5jLmMKKysrIGIvbGliYXZjb2RlYy9tcGVnNHZpZGVvZW5jLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogTVBFRzQgZW5jb2Rlci4KKyAqIE1QRUctNCBlbmNvZGVyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDEwIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKgpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKIAogLyogVGhlIHVuaV9EQ3RhYl8qIHRhYmxlcyBiZWxvdyBjb250YWluIHVuaWZpZWQgYml0cytsZW5ndGggdGFibGVzIHRvIGVuY29kZSBEQwotICogZGlmZmVyZW5jZXMgaW4gbXBlZzQuIFVuaWZpZWQgaW4gdGhlIHNlbnNlIHRoYXQgdGhlIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzCisgKiBkaWZmZXJlbmNlcyBpbiBNUEVHLTQuIFVuaWZpZWQgaW4gdGhlIHNlbnNlIHRoYXQgdGhlIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzCiAgKiB0aGlzIGVuY29kaW5nIGluIHNldmVyYWwgc3RlcHMuICovCiBzdGF0aWMgdWludDhfdCAgdW5pX0RDdGFiX2x1bV9sZW5bNTEyXTsKIHN0YXRpYyB1aW50OF90ICB1bmlfREN0YWJfY2hyb21fbGVuWzUxMl07CkBAIC00Nyw3ICs0Nyw3IEBACiAvLyNkZWZpbmUgVU5JX01QRUc0X0VOQ19JTkRFWChsYXN0LCBydW4sIGxldmVsKSAoKGxhc3QpICogMTI4ICogNjQgKyAocnVuKSArIChsZXZlbCkgKiA2NCkKICNkZWZpbmUgVU5JX01QRUc0X0VOQ19JTkRFWChsYXN0LCBydW4sIGxldmVsKSAoKGxhc3QpICogMTI4ICogNjQgKyAocnVuKSAqIDEyOCArIChsZXZlbCkpCiAKLS8qIG1wZWc0CisvKiBNUEVHLTQKICAqIGludGVyCiAgKiBtYXggbGV2ZWw6IDI0LzYKICAqIG1heCBydW46IDUzLzYzCkBAIC0xMjAsNyArMTIwLDcgQEAKIH0KIAogLyoqCi0gKiBSZXR1cm4gdGhlIG9wdGltYWwgdmFsdWUgKDAgb3IgMSkgZm9yIHRoZSBhY19wcmVkIGVsZW1lbnQgZm9yIHRoZSBnaXZlbiBNQiBpbiBtcGVnNC4KKyAqIFJldHVybiB0aGUgb3B0aW1hbCB2YWx1ZSAoMCBvciAxKSBmb3IgdGhlIGFjX3ByZWQgZWxlbWVudCBmb3IgdGhlIGdpdmVuIE1CIGluIE1QRUctNC4KICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIHVwZGF0ZSBzLT5ibG9ja19sYXN0X2luZGV4IGFuZCBzLT5hY192YWwuCiAgKiBAcGFyYW1baW4sb3V0XSBibG9jayBNQiBjb2VmZmljaWVudHMsIHRoZXNlIHdpbGwgYmUgdXBkYXRlZCBpZiAxIGlzIHJldHVybmVkCiAgKiBAcGFyYW1baW5dIGRpciBhYyBwcmVkaWN0aW9uIGRpcmVjdGlvbiBmb3IgZWFjaCA4eDggYmxvY2sKQEAgLTIwOCw3ICsyMDgsNyBAQAogfQogCiAvKioKLSAqIG1vZGlmeSBtYl90eXBlICYgcXNjYWxlIHNvIHRoYXQgZW5jb2RpbmcgaXMgYWN0dWFsbHkgcG9zc2libGUgaW4gbXBlZzQKKyAqIG1vZGlmeSBtYl90eXBlICYgcXNjYWxlIHNvIHRoYXQgZW5jb2RpbmcgaXMgYWN0dWFsbHkgcG9zc2libGUgaW4gTVBFRy00CiAgKi8KIHZvaWQgZmZfY2xlYW5fbXBlZzRfcXNjYWxlcyhNcGVnRW5jQ29udGV4dCAqcykKIHsKQEAgLTIyMCw3ICsyMjAsNyBAQAogICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKICAgICAgICAgaW50IG9kZCA9IDA7CiAgICAgICAgIC8qIG9rLCBjb21lIG9uLCB0aGlzIGlzbid0IGZ1bm55IGFueW1vcmUsIHRoZXJlJ3MgbW9yZSBjb2RlIGZvcgotICAgICAgICAgKiBoYW5kbGluZyB0aGlzIG1wZWc0IG1lc3MgdGhhbiBmb3IgdGhlIGFjdHVhbCBhZGFwdGl2ZSBxdWFudGl6YXRpb24gKi8KKyAgICAgICAgICogaGFuZGxpbmcgdGhpcyBNUEVHLTQgbWVzcyB0aGFuIGZvciB0aGUgYWN0dWFsIGFkYXB0aXZlIHF1YW50aXphdGlvbiAqLwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgewogICAgICAgICAgICAgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07CkBAIC0yNTYsNyArMjU2LDYgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIG1wZWc0X2VuY29kZV9kYyhQdXRCaXRDb250ZXh0ICpzLCBpbnQgbGV2ZWwsIGludCBuKQogewotI2lmIDEKICAgICAvKiBEQyB3aWxsIG92ZXJmbG93IGlmIGxldmVsIGlzIG91dHNpZGUgdGhlIFstMjU1LDI1NV0gcmFuZ2UuICovCiAgICAgbGV2ZWwgKz0gMjU2OwogICAgIGlmIChuIDwgNCkgewpAQCAtMjY2LDMzICsyNjUsNiBAQAogICAgICAgICAvKiBjaHJvbWluYW5jZSAqLwogICAgICAgICBwdXRfYml0cyhzLCB1bmlfREN0YWJfY2hyb21fbGVuW2xldmVsXSwgdW5pX0RDdGFiX2Nocm9tX2JpdHNbbGV2ZWxdKTsKICAgICB9Ci0jZWxzZQotICAgIGludCBzaXplLCB2OwotICAgIC8qIGZpbmQgbnVtYmVyIG9mIGJpdHMgKi8KLSAgICBzaXplID0gMDsKLSAgICB2ICAgID0gYWJzKGxldmVsKTsKLSAgICB3aGlsZSAodikgewotICAgICAgICB2ID4+PSAxOwotICAgICAgICBzaXplKys7Ci0gICAgfQotCi0gICAgaWYgKG4gPCA0KSB7Ci0gICAgICAgIC8qIGx1bWluYW5jZSAqLwotICAgICAgICBwdXRfYml0cyhzLCBmZl9tcGVnNF9EQ3RhYl9sdW1bc2l6ZV1bMV0sIGZmX21wZWc0X0RDdGFiX2x1bVtzaXplXVswXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLyogY2hyb21pbmFuY2UgKi8KLSAgICAgICAgcHV0X2JpdHMocywgZmZfbXBlZzRfREN0YWJfY2hyb21bc2l6ZV1bMV0sIGZmX21wZWc0X0RDdGFiX2Nocm9tW3NpemVdWzBdKTsKLSAgICB9Ci0KLSAgICAvKiBlbmNvZGUgcmVtYWluaW5nIGJpdHMgKi8KLSAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgaWYgKGxldmVsIDwgMCkKLSAgICAgICAgICAgIGxldmVsID0gKC1sZXZlbCkgXiAoKDEgPDwgc2l6ZSkgLSAxKTsKLSAgICAgICAgcHV0X2JpdHMocywgc2l6ZSwgbGV2ZWwpOwotICAgICAgICBpZiAoc2l6ZSA+IDgpCi0gICAgICAgICAgICBwdXRfYml0cyhzLCAxLCAxKTsKLSAgICB9Ci0jZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbXBlZzRfZ2V0X2RjX2xlbmd0aChpbnQgbGV2ZWwsIGludCBuKQpAQCAtMzE4LDcgKzI5MCw3IEBACiAgICAgY29uc3QgaW50IGxhc3RfaW5kZXggPSBzLT5ibG9ja19sYXN0X2luZGV4W25dOwogCiAgICAgaWYgKHMtPm1iX2ludHJhKSB7ICAvLyBOb3RlIGdjYyAoMy4yLjEgYXQgbGVhc3QpIHdpbGwgb3B0aW1pemUgdGhpcyBhd2F5Ci0gICAgICAgIC8qIG1wZWc0IGJhc2VkIERDIHByZWRpY3RvciAqLworICAgICAgICAvKiBNUEVHLTQgYmFzZWQgREMgcHJlZGljdG9yICovCiAgICAgICAgIG1wZWc0X2VuY29kZV9kYyhkY19wYiwgaW50cmFfZGMsIG4pOwogICAgICAgICBpZiAobGFzdF9pbmRleCA8IDEpCiAgICAgICAgICAgICByZXR1cm47CkBAIC0zNzgsNyArMzUwLDcgQEAKICAgICBpbnQgbGVuID0gMDsKIAogICAgIGlmIChzLT5tYl9pbnRyYSkgeyAgLy8gTm90ZSBnY2MgKDMuMi4xIGF0IGxlYXN0KSB3aWxsIG9wdGltaXplIHRoaXMgYXdheQotICAgICAgICAvKiBtcGVnNCBiYXNlZCBEQyBwcmVkaWN0b3IgKi8KKyAgICAgICAgLyogTVBFRy00IGJhc2VkIERDIHByZWRpY3RvciAqLwogICAgICAgICBsZW4gKz0gbXBlZzRfZ2V0X2RjX2xlbmd0aChpbnRyYV9kYywgbik7CiAgICAgICAgIGlmIChsYXN0X2luZGV4IDwgMSkKICAgICAgICAgICAgIHJldHVybiBsZW47CkBAIC01MjksNyArNTAxLDcgQEAKICAgICAgICAgICAgIGF2X2Fzc2VydDIoKHMtPmRxdWFudCAmIDEpID09IDApOwogICAgICAgICAgICAgYXZfYXNzZXJ0MihtYl90eXBlID49IDApOwogCi0gICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvIGlmIHRoaXMgTUIgd2FzIHNraXBwZWQgaW4gdGhlIG5leHQgUCBGcmFtZSAqLworICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyBpZiB0aGlzIE1CIHdhcyBza2lwcGVkIGluIHRoZSBuZXh0IFAtZnJhbWUgKi8KICAgICAgICAgICAgIGlmIChzLT5uZXh0X3BpY3R1cmUubWJza2lwX3RhYmxlW3MtPm1iX3kgKiBzLT5tYl9zdHJpZGUgKyBzLT5tYl94XSkgeyAgLy8gRklYTUUgYXZvaWQgRENUICYgLi4uCiAgICAgICAgICAgICAgICAgcy0+c2tpcF9jb3VudCsrOwogICAgICAgICAgICAgICAgIHMtPm12WzBdWzBdWzBdID0KQEAgLTY1OSw3ICs2MzEsNyBAQAogCiAgICAgICAgICAgICBpZiAoKGNicCB8IG1vdGlvbl94IHwgbW90aW9uX3kgfCBzLT5kcXVhbnQpID09IDAgJiYKICAgICAgICAgICAgICAgICBzLT5tdl90eXBlID09IE1WX1RZUEVfMTZYMTYpIHsKLSAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiB0aGUgQiBmcmFtZXMgY2FuIHNraXAgaXQgdG9vLCBhcyB3ZSBtdXN0IHNraXAgaXQKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgQi1mcmFtZXMgY2FuIHNraXAgaXQgdG9vLCBhcyB3ZSBtdXN0IHNraXAgaXQKICAgICAgICAgICAgICAgICAgKiBpZiB3ZSBza2lwIGhlcmUgd2h5IGRpZG4ndCB0aGV5IGp1c3QgY29tcHJlc3MKICAgICAgICAgICAgICAgICAgKiB0aGUgc2tpcC1tYiBiaXRzIGluc3RlYWQgb2YgcmV1c2luZyB0aGVtID8hICovCiAgICAgICAgICAgICAgICAgaWYgKHMtPm1heF9iX2ZyYW1lcyA+IDApIHsKQEAgLTg4Niw3ICs4NTgsNyBAQAogfQogCiAvKioKLSAqIGFkZCBtcGVnNCBzdHVmZmluZyBiaXRzICgwMS4uLjEpCisgKiBhZGQgTVBFRy00IHN0dWZmaW5nIGJpdHMgKDAxLi4uMSkKICAqLwogdm9pZCBmZl9tcGVnNF9zdHVmZmluZyhQdXRCaXRDb250ZXh0ICpwYmMpCiB7CkBAIC05MTAsNyArODgyLDcgQEAKIAogc3RhdGljIHZvaWQgbXBlZzRfZW5jb2RlX2dvcF9oZWFkZXIoTXBlZ0VuY0NvbnRleHQgKnMpCiB7Ci0gICAgaW50IGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzOworICAgIGludDY0X3QgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHM7CiAgICAgaW50NjRfdCB0aW1lOwogCiAgICAgcHV0X2JpdHMoJnMtPnBiLCAxNiwgMCk7CkBAIC0xMDU0LDcgKzEwMjYsNyBAQAogICAgICAgICBwdXRfYml0cygmcy0+cGIsIDIsIDApOyAgICAgICAvKiBzcHJpdGUgZW5hYmxlICovCiAKICAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgICAgICAgICAvKiBub3QgOCBiaXQgPT0gZmFsc2UgKi8KLSAgICBwdXRfYml0cygmcy0+cGIsIDEsIHMtPm1wZWdfcXVhbnQpOyAvKiBxdWFudCB0eXBlPSAoMD1oMjYzIHN0eWxlKSovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5tcGVnX3F1YW50KTsgLyogcXVhbnQgdHlwZSA9ICgwID0gSC4yNjMgc3R5bGUpICovCiAKICAgICBpZiAocy0+bXBlZ19xdWFudCkgewogICAgICAgICBmZl93cml0ZV9xdWFudF9tYXRyaXgoJnMtPnBiLCBzLT5hdmN0eC0+aW50cmFfbWF0cml4KTsKQEAgLTEwODUsNyArMTA1Nyw3IEBACiAgICAgfQogfQogCi0vKiB3cml0ZSBtcGVnNCBWT1AgaGVhZGVyICovCisvKiB3cml0ZSBNUEVHLTQgVk9QIGhlYWRlciAqLwogaW50IGZmX21wZWc0X2VuY29kZV9waWN0dXJlX2hlYWRlcihNcGVnRW5jQ29udGV4dCAqcywgaW50IHBpY3R1cmVfbnVtYmVyKQogewogICAgIHVpbnQ2NF90IHRpbWVfaW5jcjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZ19lci5jIGIvbGliYXZjb2RlYy9tcGVnX2VyLmMKaW5kZXggZGQ4N2FlOS4uYWRhMWExNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnX2VyLmMKKysrIGIvbGliYXZjb2RlYy9tcGVnX2VyLmMKQEAgLTcxLDYgKzcxLDcgQEAKICAgICBzLT5tYl9za2lwcGVkID0gbWJfc2tpcHBlZDsKICAgICBzLT5tYl94ICAgICAgID0gbWJfeDsKICAgICBzLT5tYl95ICAgICAgID0gbWJfeTsKKyAgICBzLT5tY3NlbCAgICAgID0gMDsKICAgICBtZW1jcHkocy0+bXYsIG12LCBzaXplb2YoKm12KSk7CiAKICAgICBmZl9pbml0X2Jsb2NrX2luZGV4KHMpOwpAQCAtOTEsNyArOTIsNyBAQAogICAgIGlmIChyZWYpCiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAogICAgICAgICAgICAgICAgIkludGVybGFjZWQgZXJyb3IgY29uY2VhbG1lbnQgaXMgbm90IGZ1bGx5IGltcGxlbWVudGVkXG4iKTsKLSAgICBmZl9tcHZfZGVjb2RlX21iKHMsIHMtPmJsb2NrKTsKKyAgICBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIocywgcy0+YmxvY2spOwogfQogCiBpbnQgZmZfbXBlZ19lcl9pbml0KE1wZWdFbmNDb250ZXh0ICpzKQpAQCAtMTA5LDcgKzExMCw3IEBACiAgICAgZXItPm1iX3N0cmlkZSAgID0gcy0+bWJfc3RyaWRlOwogICAgIGVyLT5iOF9zdHJpZGUgICA9IHMtPmI4X3N0cmlkZTsKIAotICAgIGVyLT5lcl90ZW1wX2J1ZmZlciAgICAgPSBhdl9tYWxsb2Mocy0+bWJfaGVpZ2h0ICogcy0+bWJfc3RyaWRlKTsKKyAgICBlci0+ZXJfdGVtcF9idWZmZXIgICAgID0gYXZfbWFsbG9jKHMtPm1iX2hlaWdodCAqIHMtPm1iX3N0cmlkZSAqICg0KnNpemVvZihpbnQpICsgMSkpOwogICAgIGVyLT5lcnJvcl9zdGF0dXNfdGFibGUgPSBhdl9tYWxsb2N6KG1iX2FycmF5X3NpemUpOwogICAgIGlmICghZXItPmVyX3RlbXBfYnVmZmVyIHx8ICFlci0+ZXJyb3Jfc3RhdHVzX3RhYmxlKQogICAgICAgICBnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWdhdWRpby5oIGIvbGliYXZjb2RlYy9tcGVnYXVkaW8uaAppbmRleCAxNTkxYTE3Li43NDU5MGE4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWdhdWRpby5oCisrKyBiL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvLmgKQEAgLTMxLDYgKzMxLDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAKIC8qIG1heCBmcmFtZSBzaXplLCBpbiBzYW1wbGVzICovCiAjZGVmaW5lIE1QQV9GUkFNRV9TSVpFIDExNTIKQEAgLTYwLDE0ICs2MSwxNyBAQAogCiAjaWYgVVNFX0ZMT0FUUwogIyAgIGRlZmluZSBJTlRGTE9BVCBmbG9hdAorIyAgIGRlZmluZSBTVUlOVEZMT0FUIGZsb2F0CiB0eXBlZGVmIGZsb2F0IE1QQV9JTlQ7CiB0eXBlZGVmIGZsb2F0IE9VVF9JTlQ7CiAjZWxpZiBGUkFDX0JJVFMgPD0gMTUKICMgICBkZWZpbmUgSU5URkxPQVQgaW50CisjICAgZGVmaW5lIFNVSU5URkxPQVQgU1VJTlQKIHR5cGVkZWYgaW50MTZfdCBNUEFfSU5UOwogdHlwZWRlZiBpbnQxNl90IE9VVF9JTlQ7CiAjZWxzZQogIyAgIGRlZmluZSBJTlRGTE9BVCBpbnQKKyMgICBkZWZpbmUgU1VJTlRGTE9BVCBTVUlOVAogdHlwZWRlZiBpbnQzMl90IE1QQV9JTlQ7CiB0eXBlZGVmIGludDE2X3QgT1VUX0lOVDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnYXVkaW9fcGFyc2VyLmMgYi9saWJhdmNvZGVjL21wZWdhdWRpb19wYXJzZXIuYwppbmRleCA4NzNmOTQxLi4xMDA1ZTg5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWdhdWRpb19wYXJzZXIuYworKysgYi9saWJhdmNvZGVjL21wZWdhdWRpb19wYXJzZXIuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgInBhcnNlci5oIgogI2luY2x1ZGUgIm1wZWdhdWRpb2RlY2hlYWRlci5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hcGV0YWcuaCIgLy8gZm9yIEFQRSB0YWcuCiAjaW5jbHVkZSAibGliYXZmb3JtYXQvaWQzdjEuaCIgLy8gZm9yIElEM3YxX1RBR19TSVpFCiAKIHR5cGVkZWYgc3RydWN0IE1wZWdBdWRpb1BhcnNlQ29udGV4dCB7CkBAIC05OCw3ICs5OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzQURVKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTVAzQURVIGZ1bGwgcGFyc2VyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG91dGJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsgLyogcGFyc2VycyBtdXN0IG5vdCByZXR1cm4gZXJyb3IgY29kZXMgKi8KICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIwLDYgKzEyMywxMiBAQAogICAgICAgICByZXR1cm4gbmV4dDsKICAgICB9CiAKKyAgICBpZiAoZmx1c2ggJiYgYnVmX3NpemUgPj0gQVBFX1RBR19GT09URVJfQllURVMgJiYgbWVtY21wKGJ1ZiwgQVBFX1RBR19QUkVBTUJMRSwgOCkgPT0gMCkgeworICAgICAgICAqcG91dGJ1ZiA9IE5VTEw7CisgICAgICAgICpwb3V0YnVmX3NpemUgPSAwOworICAgICAgICByZXR1cm4gbmV4dDsKKyAgICB9CisKICAgICAqcG91dGJ1ZiA9IGJ1ZjsKICAgICAqcG91dGJ1Zl9zaXplID0gYnVmX3NpemU7CiAgICAgcmV0dXJuIG5leHQ7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWdhdWRpb2RhdGEuaCBiL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGF0YS5oCmluZGV4IDI5YTI2NTguLmExODgxNTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGF0YS5oCisrKyBiL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGF0YS5oCkBAIC0yOSwxMyArMjksMTMgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBNT0RFX0VYVF9NU19TVEVSRU8gMgogI2RlZmluZSBNT0RFX0VYVF9JX1NURVJFTyAgMQogCi1leHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQxNl90IGF2cHJpdl9tcGFfYml0cmF0ZV90YWJbMl1bM11bMTVdOwotZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50MTZfdCBhdnByaXZfbXBhX2ZyZXFfdGFiWzNdOworZXh0ZXJuIGF2X2V4cG9ydF9hdmNvZGVjIGNvbnN0IHVpbnQxNl90IGF2cHJpdl9tcGFfYml0cmF0ZV90YWJbMl1bM11bMTVdOworZXh0ZXJuIGF2X2V4cG9ydF9hdmNvZGVjIGNvbnN0IHVpbnQxNl90IGF2cHJpdl9tcGFfZnJlcV90YWJbM107CiBleHRlcm4gY29uc3QgaW50IGZmX21wYV9zYmxpbWl0X3RhYmxlWzVdOwogZXh0ZXJuIGNvbnN0IGludCBmZl9tcGFfcXVhbnRfc3RlcHNbMTddOwogZXh0ZXJuIGNvbnN0IGludCBmZl9tcGFfcXVhbnRfYml0c1sxN107CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWdhdWRpb2RlY19maXhlZC5jIGIvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNfZml4ZWQuYwppbmRleCA5NDIxZmZiLi5hZDdjZWIyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWdhdWRpb2RlY19maXhlZC5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjX2ZpeGVkLmMKQEAgLTI1LDEzICsyNSwxMyBAQAogCiAjaW5jbHVkZSAibXBlZ2F1ZGlvLmgiCiAKLSNkZWZpbmUgU0hSKGEsYikgICAgICAgKChhKT4+KGIpKQorI2RlZmluZSBTSFIoYSxiKSAgICAgICAoKChpbnQpKGEpKT4+KGIpKQogLyogV0FSTklORzogb25seSBjb3JyZWN0IGZvciBwb3NpdGl2ZSBudW1iZXJzICovCiAjZGVmaW5lIEZJWFJfT0xEKGEpICAgICgoaW50KSgoYSkgKiBGUkFDX09ORSArIDAuNSkpCiAjZGVmaW5lIEZJWFIoYSkgICAgICAgICgoaW50KSgoYSkgKiBGUkFDX09ORSArIDAuNSkpCiAjZGVmaW5lIEZJWEhSKGEpICAgICAgICgoaW50KSgoYSkgKiAoMUxMPDwzMikgKyAwLjUpKQogI2RlZmluZSBNVUxIMyh4LCB5LCBzKSBNVUxIKChzKSooeCksIHkpCi0jZGVmaW5lIE1VTEx4KHgsIHksIHMpIE1VTEwoeCx5LHMpCisjZGVmaW5lIE1VTEx4KHgsIHksIHMpIE1VTEwoKGludCkoeCksKHkpLHMpCiAjZGVmaW5lIFJFTkFNRShhKSAgICAgIGEgIyMgX2ZpeGVkCiAjZGVmaW5lIE9VVF9GTVQgICBBVl9TQU1QTEVfRk1UX1MxNgogI2RlZmluZSBPVVRfRk1UX1AgQVZfU0FNUExFX0ZNVF9TMTZQCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWdhdWRpb2RlY190ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNfdGVtcGxhdGUuYwppbmRleCA1ZTNmZTdlLi45Y2NlODhlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWdhdWRpb2RlY190ZW1wbGF0ZS5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjX3RlbXBsYXRlLmMKQEAgLTcxLDYgKzcxLDcgQEAKICAgICBNUEFfREVDT0RFX0hFQURFUgogICAgIHVpbnQ4X3QgbGFzdF9idWZbTEFTVF9CVUZfU0laRV07CiAgICAgaW50IGxhc3RfYnVmX3NpemU7CisgICAgaW50IGV4dHJhc2l6ZTsKICAgICAvKiBuZXh0IGhlYWRlciAodXNlZCBpbiBmcmVlIGZvcm1hdCBwYXJzaW5nKSAqLwogICAgIHVpbnQzMl90IGZyZWVfZm9ybWF0X25leHRfaGVhZGVyOwogICAgIEdldEJpdENvbnRleHQgZ2I7CkBAIC0yNTAsOSArMjUxLDkgQEAKICAgICBpZihlIDwgMSkKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAibDNfdW5zY2FsZTogZSBpcyAlZFxuIiwgZSk7CiAjZW5kaWYKLSAgICBpZiAoZSA+IDMxKQorICAgIGlmIChlID4gKFNVSU5UKTMxKQogICAgICAgICByZXR1cm4gMDsKLSAgICBtID0gKG0gKyAoMSA8PCAoZSAtIDEpKSkgPj4gZTsKKyAgICBtID0gKG0gKyAoKDFVIDw8IGUpPj4xKSkgPj4gZTsKIAogICAgIHJldHVybiBtOwogfQpAQCAtMjc5LDcgKzI4MCw4IEBACiAgICAgICAgIHNjYWxlX2ZhY3Rvcl9tdWx0W2ldWzBdID0gTVVMTHgobm9ybSwgRklYUigxLjAgICAgICAgICAgKiAyLjApLCBGUkFDX0JJVFMpOwogICAgICAgICBzY2FsZV9mYWN0b3JfbXVsdFtpXVsxXSA9IE1VTEx4KG5vcm0sIEZJWFIoMC43OTM3MDA1MjU5ICogMi4wKSwgRlJBQ19CSVRTKTsKICAgICAgICAgc2NhbGVfZmFjdG9yX211bHRbaV1bMl0gPSBNVUxMeChub3JtLCBGSVhSKDAuNjI5OTYwNTI0OSAqIDIuMCksIEZSQUNfQklUUyk7Ci0gICAgICAgIGZmX2Rsb2coTlVMTCwgIiVkOiBub3JtPSV4IHM9JXggJXggJXhcbiIsIGksIG5vcm0sCisgICAgICAgIGZmX2Rsb2coTlVMTCwgIiVkOiBub3JtPSV4IHM9JSJQUkl4MzIiICUiUFJJeDMyIiAlIlBSSXgzMiJcbiIsIGksCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW5vcm0sCiAgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX211bHRbaV1bMF0sCiAgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX211bHRbaV1bMV0sCiAgICAgICAgICAgICAgICAgc2NhbGVfZmFjdG9yX211bHRbaV1bMl0pOwpAQCAtNDU2LDkgKzQ1OCw5IEBACiAKIC8qIDEyIHBvaW50cyBJTURDVC4gV2UgY29tcHV0ZSBpdCAiYnkgaGFuZCIgYnkgZmFjdG9yaXppbmcgb2J2aW91cwogICAgY2FzZXMuICovCi1zdGF0aWMgdm9pZCBpbWRjdDEyKElOVEZMT0FUICpvdXQsIElOVEZMT0FUICppbikKK3N0YXRpYyB2b2lkIGltZGN0MTIoSU5URkxPQVQgKm91dCwgU1VJTlRGTE9BVCAqaW4pCiB7Ci0gICAgSU5URkxPQVQgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgdDEsIHQyOworICAgIFNVSU5URkxPQVQgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgdDEsIHQyOwogCiAgICAgaW4wICA9IGluWzAqM107CiAgICAgaW4xICA9IGluWzEqM10gKyBpblswKjNdOwpAQCAtODE5LDkgKzgyMSwxMCBAQAogc3RhdGljIHZvaWQgc3dpdGNoX2J1ZmZlcihNUEFEZWNvZGVDb250ZXh0ICpzLCBpbnQgKnBvcywgaW50ICplbmRfcG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVuZF9wb3MyKQogewotICAgIGlmIChzLT5pbl9nYi5idWZmZXIgJiYgKnBvcyA+PSBzLT5nYi5zaXplX2luX2JpdHMpIHsKKyAgICBpZiAocy0+aW5fZ2IuYnVmZmVyICYmICpwb3MgPj0gcy0+Z2Iuc2l6ZV9pbl9iaXRzIC0gcy0+ZXh0cmFzaXplICogOCkgewogICAgICAgICBzLT5nYiAgICAgICAgICAgPSBzLT5pbl9nYjsKICAgICAgICAgcy0+aW5fZ2IuYnVmZmVyID0gTlVMTDsKKyAgICAgICAgcy0+ZXh0cmFzaXplICAgID0gMDsKICAgICAgICAgYXZfYXNzZXJ0MigoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAmIDcpID09IDApOwogICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsICpwb3MgLSAqZW5kX3Bvcyk7CiAgICAgICAgICplbmRfcG9zMiA9CkBAIC04MzAsNyArODMzLDcgQEAKICAgICB9CiB9CiAKLS8qIEZvbGxvd2luZyBpcyBhIG9wdGltaXplZCBjb2RlIGZvcgorLyogRm9sbG93aW5nIGlzIGFuIG9wdGltaXplZCBjb2RlIGZvcgogICAgICAgICAgICAgSU5URkxPQVQgdiA9ICpzcmMKICAgICAgICAgICAgIGlmKGdldF9iaXRzMSgmcy0+Z2IpKQogICAgICAgICAgICAgICAgIHYgPSAtdjsKQEAgLTg1Myw3ICs4NTYsNyBAQAogICAgIGludCBpOwogICAgIGludCBsYXN0X3BvcywgYml0c19sZWZ0OwogICAgIFZMQyAqdmxjOwotICAgIGludCBlbmRfcG9zID0gRkZNSU4oZW5kX3BvczIsIHMtPmdiLnNpemVfaW5fYml0cyk7CisgICAgaW50IGVuZF9wb3MgPSBGRk1JTihlbmRfcG9zMiwgcy0+Z2Iuc2l6ZV9pbl9iaXRzIC0gcy0+ZXh0cmFzaXplICogOCk7CiAKICAgICAvKiBsb3cgZnJlcXVlbmNpZXMgKGNhbGxlZCBiaWcgdmFsdWVzKSAqLwogICAgIHNfaW5kZXggPSAwOwpAQCAtODk2LDggKzg5OSw4IEBACiAKICAgICAgICAgICAgIGV4cG9uZW50PSBleHBvbmVudHNbc19pbmRleF07CiAKLSAgICAgICAgICAgIGZmX2Rsb2cocy0+YXZjdHgsICJyZWdpb249JWQgbj0lZCB4PSVkIHk9JWQgZXhwPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICBpLCBnLT5yZWdpb25fc2l6ZVtpXSAtIGosIHgsIHksIGV4cG9uZW50KTsKKyAgICAgICAgICAgIGZmX2Rsb2cocy0+YXZjdHgsICJyZWdpb249JWQgbj0lZCB5PSVkIGV4cD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgZy0+cmVnaW9uX3NpemVbaV0gLSBqLCB5LCBleHBvbmVudCk7CiAgICAgICAgICAgICBpZiAoeSAmIDE2KSB7CiAgICAgICAgICAgICAgICAgeCA9IHkgPj4gNTsKICAgICAgICAgICAgICAgICB5ID0geSAmIDB4MGY7CkBAIC0xMDM2LDcgKzEwMzksOCBAQAogewogICAgIGludCBpLCBqLCBrLCBsOwogICAgIGludCBzZl9tYXgsIHNmLCBsZW4sIG5vbl96ZXJvX2ZvdW5kOwotICAgIElOVEZMT0FUICgqaXNfdGFiKVsxNl0sICp0YWIwLCAqdGFiMSwgdG1wMCwgdG1wMSwgdjEsIHYyOworICAgIElOVEZMT0FUICgqaXNfdGFiKVsxNl0sICp0YWIwLCAqdGFiMSwgdjEsIHYyOworICAgIFNVSU5URkxPQVQgdG1wMCwgdG1wMTsKICAgICBpbnQgbm9uX3plcm9fZm91bmRfc2hvcnRbM107CiAKICAgICAvKiBpbnRlbnNpdHkgc3RlcmVvICovCkBAIC0xMTgwLDkgKzExODQsOSBAQAogICAgIH0gd2hpbGUgKDApCiAjZWxzZQogI2RlZmluZSBBQShqKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaW50IHRtcDAgPSBwdHJbLTEtal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCB0bXAxID0gcHRyWyAgIGpdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpbnQgdG1wMiA9IE1VTEgodG1wMCArIHRtcDEsIGNzYV90YWJsZVtqXVswXSk7ICAgICAgICAgIFwKKyAgICAgICAgU1VJTlQgdG1wMCA9IHB0clstMS1qXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU1VJTlQgdG1wMSA9IHB0clsgICBqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU1VJTlQgdG1wMiA9IE1VTEgodG1wMCArIHRtcDEsIGNzYV90YWJsZVtqXVswXSk7ICAgICAgICAgIFwKICAgICAgICAgcHRyWy0xLWpdID0gNCAqICh0bXAyIC0gTVVMSCh0bXAxLCBjc2FfdGFibGVbal1bMl0pKTsgICBcCiAgICAgICAgIHB0clsgICBqXSA9IDQgKiAodG1wMiArIE1VTEgodG1wMCwgY3NhX3RhYmxlW2pdWzNdKSk7ICAgXAogICAgIH0gd2hpbGUgKDApCkBAIC0xMzg3LDE4ICsxMzkxLDE2IEBACiAgICAgaWYgKCFzLT5hZHVfbW9kZSkgewogICAgICAgICBpbnQgc2tpcDsKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gcy0+Z2IuYnVmZmVyICsgKGdldF9iaXRzX2NvdW50KCZzLT5nYik+PjMpOwotICAgICAgICBpbnQgZXh0cmFzaXplID0gYXZfY2xpcChnZXRfYml0c19sZWZ0KCZzLT5nYikgPj4gMywgMCwgRVhUUkFCWVRFUyk7CisgICAgICAgIHMtPmV4dHJhc2l6ZSA9IGF2X2NsaXAoKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA+PiAzKSAtIHMtPmV4dHJhc2l6ZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1BWCgwLCBMQVNUX0JVRl9TSVpFIC0gcy0+bGFzdF9idWZfc2l6ZSkpOwogICAgICAgICBhdl9hc3NlcnQxKChnZXRfYml0c19jb3VudCgmcy0+Z2IpICYgNykgPT0gMCk7CiAgICAgICAgIC8qIG5vdyB3ZSBnZXQgYml0cyBmcm9tIHRoZSBtYWluX2RhdGFfYmVnaW4gb2Zmc2V0ICovCiAgICAgICAgIGZmX2Rsb2cocy0+YXZjdHgsICJzZWVrYmFjazolZCwgbGFzdGJ1ZjolZFxuIiwKICAgICAgICAgICAgICAgICBtYWluX2RhdGFfYmVnaW4sIHMtPmxhc3RfYnVmX3NpemUpOwogCi0gICAgICAgIG1lbWNweShzLT5sYXN0X2J1ZiArIHMtPmxhc3RfYnVmX3NpemUsIHB0ciwgZXh0cmFzaXplKTsKKyAgICAgICAgbWVtY3B5KHMtPmxhc3RfYnVmICsgcy0+bGFzdF9idWZfc2l6ZSwgcHRyLCBzLT5leHRyYXNpemUpOwogICAgICAgICBzLT5pbl9nYiA9IHMtPmdiOwotICAgICAgICBpbml0X2dldF9iaXRzKCZzLT5nYiwgcy0+bGFzdF9idWYsIHMtPmxhc3RfYnVmX3NpemUqOCk7Ci0jaWYgIVVOQ0hFQ0tFRF9CSVRTVFJFQU1fUkVBREVSCi0gICAgICAgIHMtPmdiLnNpemVfaW5fYml0c19wbHVzOCArPSBGRk1BWChleHRyYXNpemUsIExBU1RfQlVGX1NJWkUgLSBzLT5sYXN0X2J1Zl9zaXplKSAqIDg7Ci0jZW5kaWYKKyAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIHMtPmxhc3RfYnVmLCAocy0+bGFzdF9idWZfc2l6ZSArIHMtPmV4dHJhc2l6ZSkgKiA4KTsKICAgICAgICAgcy0+bGFzdF9idWZfc2l6ZSA8PD0gMzsKICAgICAgICAgZm9yIChnciA9IDA7IGdyIDwgbmJfZ3JhbnVsZXMgJiYgKHMtPmxhc3RfYnVmX3NpemUgPj4gMykgPCBtYWluX2RhdGFfYmVnaW47IGdyKyspIHsKICAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CkBAIC0xNDA5LDE1ICsxNDExLDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc2tpcCA9IHMtPmxhc3RfYnVmX3NpemUgLSA4ICogbWFpbl9kYXRhX2JlZ2luOwotICAgICAgICBpZiAoc2tpcCA+PSBzLT5nYi5zaXplX2luX2JpdHMgJiYgcy0+aW5fZ2IuYnVmZmVyKSB7Ci0gICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+aW5fZ2IsIHNraXAgLSBzLT5nYi5zaXplX2luX2JpdHMpOworICAgICAgICBpZiAoc2tpcCA+PSBzLT5nYi5zaXplX2luX2JpdHMgLSBzLT5leHRyYXNpemUgKiA4ICYmIHMtPmluX2diLmJ1ZmZlcikgeworICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmluX2diLCBza2lwIC0gcy0+Z2Iuc2l6ZV9pbl9iaXRzICsgcy0+ZXh0cmFzaXplICogOCk7CiAgICAgICAgICAgICBzLT5nYiAgICAgICAgICAgPSBzLT5pbl9nYjsKICAgICAgICAgICAgIHMtPmluX2diLmJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBzLT5leHRyYXNpemUgICAgPSAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoJnMtPmdiLCBza2lwKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGdyID0gMDsKKyAgICAgICAgcy0+ZXh0cmFzaXplID0gMDsKICAgICB9CiAKICAgICBmb3IgKDsgZ3IgPCBuYl9ncmFudWxlczsgZ3IrKykgewpAQCAtMTQyOSw3ICsxNDMzLDcgQEAKICAgICAgICAgICAgICAgICB1aW50OF90ICpzYzsKICAgICAgICAgICAgICAgICBpbnQgc2xlbiwgc2xlbjEsIHNsZW4yOwogCi0gICAgICAgICAgICAgICAgLyogTVBFRzEgc2NhbGUgZmFjdG9ycyAqLworICAgICAgICAgICAgICAgIC8qIE1QRUctMSBzY2FsZSBmYWN0b3JzICovCiAgICAgICAgICAgICAgICAgc2xlbjEgPSBzbGVuX3RhYmxlWzBdW2ctPnNjYWxlZmFjX2NvbXByZXNzXTsKICAgICAgICAgICAgICAgICBzbGVuMiA9IHNsZW5fdGFibGVbMV1bZy0+c2NhbGVmYWNfY29tcHJlc3NdOwogICAgICAgICAgICAgICAgIGZmX2Rsb2cocy0+YXZjdHgsICJzbGVuMT0lZCBzbGVuMj0lZFxuIiwgc2xlbjEsIHNsZW4yKTsKQEAgLTE1ODIsNyArMTU4Niw3IEBACiAgICAgICAgIHMtPmxhc3RfYnVmX3NpemU9MDsKICAgICAgICAgaWYgKHMtPmluX2diLmJ1ZmZlcikgewogICAgICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKLSAgICAgICAgICAgIGkgPSBnZXRfYml0c19sZWZ0KCZzLT5nYik+PjM7CisgICAgICAgICAgICBpID0gKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA+PiAzKSAtIHMtPmV4dHJhc2l6ZTsKICAgICAgICAgICAgIGlmIChpID49IDAgJiYgaSA8PSBCQUNLU1RFUF9TSVpFKSB7CiAgICAgICAgICAgICAgICAgbWVtbW92ZShzLT5sYXN0X2J1Ziwgcy0+Z2IuYnVmZmVyICsgKGdldF9iaXRzX2NvdW50KCZzLT5nYik+PjMpLCBpKTsKICAgICAgICAgICAgICAgICBzLT5sYXN0X2J1Zl9zaXplPWk7CkBAIC0xNTkwLDEyICsxNTk0LDEyIEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG9sZCBiYWNrc3RlcCAlZFxuIiwgaSk7CiAgICAgICAgICAgICBzLT5nYiAgICAgICAgICAgPSBzLT5pbl9nYjsKICAgICAgICAgICAgIHMtPmluX2diLmJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICBzLT5leHRyYXNpemUgICAgPSAwOwogICAgICAgICB9CiAKICAgICAgICAgYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKICAgICAgICAgYXZfYXNzZXJ0MSgoZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAmIDcpID09IDApOwotICAgICAgICBpID0gZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpID4+IDM7Ci0KKyAgICAgICAgaSA9IChnZXRfYml0c19sZWZ0KCZzLT5nYikgPj4gMykgLSBzLT5leHRyYXNpemU7CiAgICAgICAgIGlmIChpIDwgMCB8fCBpID4gQkFDS1NURVBfU0laRSB8fCBuYl9mcmFtZXMgPCAwKSB7CiAgICAgICAgICAgICBpZiAoaSA8IDApCiAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG5ldyBiYWNrc3RlcCAlZFxuIiwgaSk7CkBAIC0xNjYzLDcgKzE2NjcsNyBAQAogICAgIGhlYWRlciA9IEFWX1JCMzIoYnVmKTsKICAgICBpZiAoaGVhZGVyPj44ID09IEFWX1JCMzIoIlRBRyIpPj44KSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZGlzY2FyZGluZyBJRDMgdGFnXG4iKTsKLSAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgICAgICByZXR1cm4gYnVmX3NpemUgKyBza2lwcGVkOwogICAgIH0KICAgICByZXQgPSBhdnByaXZfbXBlZ2F1ZGlvX2RlY29kZV9oZWFkZXIoKE1QQURlY29kZUhlYWRlciAqKXMsIGhlYWRlcik7CiAgICAgaWYgKHJldCA8IDApIHsKQEAgLTE4MjYsNiArMTgzMCw5IEBACiAgICAgTVAzT240RGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IGk7CiAKKyAgICBpZiAocy0+bXAzZGVjY3R4WzBdKQorICAgICAgICBhdl9mcmVlcCgmcy0+bXAzZGVjY3R4WzBdLT5mZHNwKTsKKwogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mcmFtZXM7IGkrKykKICAgICAgICAgYXZfZnJlZXAoJnMtPm1wM2RlY2N0eFtpXSk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjaGVhZGVyLmMgYi9saWJhdmNvZGVjL21wZWdhdWRpb2RlY2hlYWRlci5jCmluZGV4IGFlODZiMDguLjZjYzc5ZjEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjaGVhZGVyLmMKKysrIGIvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNoZWFkZXIuYwpAQCAtMTUyLDE1ICsxNTIsMyBAQAogICAgICpiaXRfcmF0ZSA9IHMtPmJpdF9yYXRlOwogICAgIHJldHVybiBzLT5mcmFtZV9zaXplOwogfQotCi0jaWYgTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgKLWludCBhdnByaXZfbXBhX2RlY29kZV9oZWFkZXIyKHVpbnQzMl90IGhlYWQsIGludCAqc2FtcGxlX3JhdGUsIGludCAqY2hhbm5lbHMsIGludCAqZnJhbWVfc2l6ZSwgaW50ICpiaXRfcmF0ZSwgZW51bSBBVkNvZGVjSUQgKmNvZGVjX2lkKQotewotICAgIHJldHVybiBmZl9tcGFfZGVjb2RlX2hlYWRlcihoZWFkLCBzYW1wbGVfcmF0ZSwgY2hhbm5lbHMsIGZyYW1lX3NpemUsIGJpdF9yYXRlLCBjb2RlY19pZCk7Ci19Ci0KLWludCBhdnByaXZfbXBhX2RlY29kZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50MzJfdCBoZWFkLCBpbnQgKnNhbXBsZV9yYXRlLCBpbnQgKmNoYW5uZWxzLCBpbnQgKmZyYW1lX3NpemUsIGludCAqYml0X3JhdGUpCi17Ci0gICAgcmV0dXJuIGZmX21wYV9kZWNvZGVfaGVhZGVyKGhlYWQsIHNhbXBsZV9yYXRlLCBjaGFubmVscywgZnJhbWVfc2l6ZSwgYml0X3JhdGUsICZhdmN0eC0+Y29kZWNfaWQpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWdhdWRpb2RlY2hlYWRlci5oIGIvbGliYXZjb2RlYy9tcGVnYXVkaW9kZWNoZWFkZXIuaAppbmRleCA1NWQ1YTE1Li4xY2I5MjE2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWdhdWRpb2RlY2hlYWRlci5oCisrKyBiL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjaGVhZGVyLmgKQEAgLTUyLDE2ICs1MiwxMSBAQAogICAgdGhhdCB0aGUgZnJhbWUgc2l6ZSBtdXN0IGJlIGNvbXB1dGVkIGV4dGVybmFsbHkgKi8KIGludCBhdnByaXZfbXBlZ2F1ZGlvX2RlY29kZV9oZWFkZXIoTVBBRGVjb2RlSGVhZGVyICpzLCB1aW50MzJfdCBoZWFkZXIpOwogCi0vKiB1c2VmdWwgaGVscGVyIHRvIGdldCBtcGVnIGF1ZGlvIHN0cmVhbSBpbmZvcy4gUmV0dXJuIC0xIGlmIGVycm9yIGluCisvKiB1c2VmdWwgaGVscGVyIHRvIGdldCBNUEVHIGF1ZGlvIHN0cmVhbSBpbmZvLiBSZXR1cm4gLTEgaWYgZXJyb3IgaW4KICAgIGhlYWRlciwgb3RoZXJ3aXNlIHRoZSBjb2RlZCBmcmFtZSBzaXplIGluIGJ5dGVzICovCiBpbnQgZmZfbXBhX2RlY29kZV9oZWFkZXIodWludDMyX3QgaGVhZCwgaW50ICpzYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNoYW5uZWxzLCBpbnQgKmZyYW1lX3NpemUsIGludCAqYml0cmF0ZSwgZW51bSBBVkNvZGVjSUQgKmNvZGVjX2lkKTsKIAotI2lmIExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4Ci1pbnQgYXZwcml2X21wYV9kZWNvZGVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDMyX3QgaGVhZCwgaW50ICpzYW1wbGVfcmF0ZSwgaW50ICpjaGFubmVscywgaW50ICpmcmFtZV9zaXplLCBpbnQgKmJpdHJhdGUpOwotaW50IGF2cHJpdl9tcGFfZGVjb2RlX2hlYWRlcjIodWludDMyX3QgaGVhZCwgaW50ICpzYW1wbGVfcmF0ZSwgaW50ICpjaGFubmVscywgaW50ICpmcmFtZV9zaXplLCBpbnQgKmJpdHJhdGUsIGVudW0gQVZDb2RlY0lEICpjb2RlY19pZCk7Ci0jZW5kaWYKLQogLyogZmFzdCBoZWFkZXIgY2hlY2sgZm9yIHJlc3luYyAqLwogc3RhdGljIGlubGluZSBpbnQgZmZfbXBhX2NoZWNrX2hlYWRlcih1aW50MzJfdCBoZWFkZXIpewogICAgIC8qIGhlYWRlciAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnYXVkaW9kc3AuYyBiL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwLmMKaW5kZXggYTVkMjBkZi4uM2NhZmNhMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnYXVkaW9kc3AuYworKysgYi9saWJhdmNvZGVjL21wZWdhdWRpb2RzcC5jCkBAIC0yMCwxNyArMjAsMjEgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgogI2luY2x1ZGUgIm1wZWdhdWRpb2RzcC5oIgogI2luY2x1ZGUgImRjdC5oIgogI2luY2x1ZGUgImRjdDMyLmgiCiAKK3N0YXRpYyBBVk9uY2UgbXBhZHNwX2Zsb2F0X3RhYmxlX2luaXQgPSBBVl9PTkNFX0lOSVQ7CitzdGF0aWMgQVZPbmNlIG1wYWRzcF9maXhlZF90YWJsZV9pbml0ID0gQVZfT05DRV9JTklUOworCiBhdl9jb2xkIHZvaWQgZmZfbXBhZHNwX2luaXQoTVBBRFNQQ29udGV4dCAqcykKIHsKICAgICBEQ1RDb250ZXh0IGRjdDsKIAogICAgIGZmX2RjdF9pbml0KCZkY3QsIDUsIERDVF9JSSk7Ci0gICAgZmZfaW5pdF9tcGFkc3BfdGFic19mbG9hdCgpOwotICAgIGZmX2luaXRfbXBhZHNwX3RhYnNfZml4ZWQoKTsKKyAgICBmZl90aHJlYWRfb25jZSgmbXBhZHNwX2Zsb2F0X3RhYmxlX2luaXQsICZmZl9pbml0X21wYWRzcF90YWJzX2Zsb2F0KTsKKyAgICBmZl90aHJlYWRfb25jZSgmbXBhZHNwX2ZpeGVkX3RhYmxlX2luaXQsICZmZl9pbml0X21wYWRzcF90YWJzX2ZpeGVkKTsKIAogICAgIHMtPmFwcGx5X3dpbmRvd19mbG9hdCA9IGZmX21wYWRzcF9hcHBseV93aW5kb3dfZmxvYXQ7CiAgICAgcy0+YXBwbHlfd2luZG93X2ZpeGVkID0gZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19maXhlZDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwLmggYi9saWJhdmNvZGVjL21wZWdhdWRpb2RzcC5oCmluZGV4IGI4MjcxNjMuLjBlNDM1MmQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwLmgKKysrIGIvbGliYXZjb2RlYy9tcGVnYXVkaW9kc3AuaApAQCAtMTksMTQgKzE5LDE4IEBACiAjaWZuZGVmIEFWQ09ERUNfTVBFR0FVRElPRFNQX0gKICNkZWZpbmUgQVZDT0RFQ19NUEVHQVVESU9EU1BfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CisKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCiAKIHR5cGVkZWYgc3RydWN0IE1QQURTUENvbnRleHQgewogICAgIHZvaWQgKCphcHBseV93aW5kb3dfZmxvYXQpKGZsb2F0ICpzeW50aF9idWYsIGZsb2F0ICp3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXRoZXJfc3RhdGUsIGZsb2F0ICpzYW1wbGVzLCBpbnQgaW5jcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXRoZXJfc3RhdGUsIGZsb2F0ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbmNyKTsKICAgICB2b2lkICgqYXBwbHlfd2luZG93X2ZpeGVkKShpbnQzMl90ICpzeW50aF9idWYsIGludDMyX3QgKndpbmRvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmRpdGhlcl9zdGF0ZSwgaW50MTZfdCAqc2FtcGxlcywgaW50IGluY3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBpbnQxNl90ICpzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbmNyKTsKICAgICB2b2lkICgqZGN0MzJfZmxvYXQpKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMpOwogICAgIHZvaWQgKCpkY3QzMl9maXhlZCkoaW50ICpkc3QsIGNvbnN0IGludCAqc3JjKTsKIApAQCAtNDYsMTMgKzUwLDEzIEBACiB2b2lkIGZmX21wYV9zeW50aF9maWx0ZXJfZml4ZWQoTVBBRFNQQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpzeW50aF9idWZfcHRyLCBpbnQgKnN5bnRoX2J1Zl9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqd2luZG93LCBpbnQgKmRpdGhlcl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzYW1wbGVzLCBpbnQgaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpzYW1wbGVzLCBwdHJkaWZmX3QgaW5jciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpzYl9zYW1wbGVzKTsKIAogdm9pZCBmZl9tcGFfc3ludGhfZmlsdGVyX2Zsb2F0KE1QQURTUENvbnRleHQgKnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnN5bnRoX2J1Zl9wdHIsIGludCAqc3ludGhfYnVmX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqd2luZG93LCBpbnQgKmRpdGhlcl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc2FtcGxlcywgaW50IGluY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnNhbXBsZXMsIHB0cmRpZmZfdCBpbmNyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpzYl9zYW1wbGVzKTsKIAogdm9pZCBmZl9tcGFkc3BfaW5pdF9hYXJjaDY0KE1QQURTUENvbnRleHQgKnMpOwpAQCAtNjcsMTAgKzcxLDEwIEBACiAKIHZvaWQgZmZfbXBhZHNwX2FwcGx5X3dpbmRvd19mbG9hdChmbG9hdCAqc3ludGhfYnVmLCBmbG9hdCAqd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBmbG9hdCAqc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGluY3IpOwogdm9pZCBmZl9tcGFkc3BfYXBwbHlfd2luZG93X2ZpeGVkKGludDMyX3QgKnN5bnRoX2J1ZiwgaW50MzJfdCAqd2luZG93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGl0aGVyX3N0YXRlLCBpbnQxNl90ICpzYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmNyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgaW5jcik7CiAKIHZvaWQgZmZfaW1kY3QzNl9ibG9ja3NfZmxvYXQoZmxvYXQgKm91dCwgZmxvYXQgKmJ1ZiwgZmxvYXQgKmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBzd2l0Y2hfcG9pbnQsIGludCBibG9ja190eXBlKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL21wZWdhdWRpb2RzcF90ZW1wbGF0ZS5jCmluZGV4IDYyNDU0Y2EuLmU1MzFmOGEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZHNwX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9tcGVnYXVkaW9kc3BfdGVtcGxhdGUuYwpAQCAtNjMsOCArNjMsOCBAQAogIyAgIGRlZmluZSBNQUNTKHJ0LCByYSwgcmIpIE1BQzY0KHJ0LCByYSwgcmIpCiAjICAgZGVmaW5lIE1MU1MocnQsIHJhLCByYikgTUxTNjQocnQsIHJhLCByYikKICMgICBkZWZpbmUgTVVMSDMoeCwgeSwgcykgTVVMSCgocykqKHgpLCB5KQotIyAgIGRlZmluZSBNVUxMeCh4LCB5LCBzKSBNVUxMKHgseSxzKQotIyAgIGRlZmluZSBTSFIoYSxiKSAgICAgICAoKGEpPj4oYikpCisjICAgZGVmaW5lIE1VTEx4KHgsIHksIHMpIE1VTEwoKGludCkoeCksKHkpLHMpCisjICAgZGVmaW5lIFNIUihhLGIpICAgICAgICgoKGludCkoYSkpPj4oYikpCiAjICAgZGVmaW5lIEZJWFIoYSkgICAgICAgICgoaW50KSgoYSkgKiBGUkFDX09ORSArIDAuNSkpCiAjICAgZGVmaW5lIEZJWEhSKGEpICAgICAgICgoaW50KSgoYSkgKiAoMUxMPDwzMikgKyAwLjUpKQogI2VuZGlmCkBAIC0xMjAsNyArMTIwLDcgQEAKIAogdm9pZCBSRU5BTUUoZmZfbXBhZHNwX2FwcGx5X3dpbmRvdykoTVBBX0lOVCAqc3ludGhfYnVmLCBNUEFfSU5UICp3aW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkaXRoZXJfc3RhdGUsIE9VVF9JTlQgKnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluY3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGluY3IpCiB7CiAgICAgcmVnaXN0ZXIgY29uc3QgTVBBX0lOVCAqdywgKncyLCAqcDsKICAgICBpbnQgajsKQEAgLTE3Niw3ICsxNzYsNyBAQAogdm9pZCBSRU5BTUUoZmZfbXBhX3N5bnRoX2ZpbHRlcikoTVBBRFNQQ29udGV4dCAqcywgTVBBX0lOVCAqc3ludGhfYnVmX3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3ludGhfYnVmX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QQV9JTlQgKndpbmRvdywgaW50ICpkaXRoZXJfc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRfSU5UICpzYW1wbGVzLCBpbnQgaW5jciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9VVF9JTlQgKnNhbXBsZXMsIHB0cmRpZmZfdCBpbmNyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBX0lOVCAqc2Jfc2FtcGxlcykKIHsKICAgICBNUEFfSU5UICpzeW50aF9idWY7CkBAIC0zMDAsMTEgKzMwMCwxMSBAQAogfTsKIAogLyogdXNpbmcgTGVlIGxpa2UgZGVjb21wb3NpdGlvbiBmb2xsb3dlZCBieSBoYW5kIGNvZGVkIDkgcG9pbnRzIERDVCAqLwotc3RhdGljIHZvaWQgaW1kY3QzNihJTlRGTE9BVCAqb3V0LCBJTlRGTE9BVCAqYnVmLCBJTlRGTE9BVCAqaW4sIElOVEZMT0FUICp3aW4pCitzdGF0aWMgdm9pZCBpbWRjdDM2KElOVEZMT0FUICpvdXQsIElOVEZMT0FUICpidWYsIFNVSU5URkxPQVQgKmluLCBJTlRGTE9BVCAqd2luKQogewogICAgIGludCBpLCBqOwotICAgIElOVEZMT0FUIHQwLCB0MSwgdDIsIHQzLCBzMCwgczEsIHMyLCBzMzsKLSAgICBJTlRGTE9BVCB0bXBbMThdLCAqdG1wMSwgKmluMTsKKyAgICBTVUlOVEZMT0FUIHQwLCB0MSwgdDIsIHQzLCBzMCwgczEsIHMyLCBzMzsKKyAgICBTVUlOVEZMT0FUIHRtcFsxOF0sICp0bXAxLCAqaW4xOwogCiAgICAgZm9yIChpID0gMTc7IGkgPj0gMTsgaS0tKQogICAgICAgICBpbltpXSArPSBpbltpLTFdOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVnYXVkaW9lbmNfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvbXBlZ2F1ZGlvZW5jX3RlbXBsYXRlLmMKaW5kZXggYjkxZDBhOC4uOTMzNjNmZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVnYXVkaW9lbmNfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL21wZWdhdWRpb2VuY190ZW1wbGF0ZS5jCkBAIC01OTksNyArNTk5LDcgQEAKIH0KIAogLyoKLSAqIE91dHB1dCB0aGUgbXBlZyBhdWRpbyBsYXllciAyIGZyYW1lLiBOb3RlIGhvdyB0aGUgY29kZSBpcyBzbWFsbAorICogT3V0cHV0IHRoZSBNUEVHIGF1ZGlvIGxheWVyIDIgZnJhbWUuIE5vdGUgaG93IHRoZSBjb2RlIGlzIHNtYWxsCiAgKiBjb21wYXJlZCB0byBvdGhlciBlbmNvZGVycyA6LSkKICAqLwogc3RhdGljIHZvaWQgZW5jb2RlX2ZyYW1lKE1wZWdBdWRpb0NvbnRleHQgKnMsCkBAIC02MTQsNyArNjE0LDcgQEAKICAgICAvKiBoZWFkZXIgKi8KIAogICAgIHB1dF9iaXRzKHAsIDEyLCAweGZmZik7Ci0gICAgcHV0X2JpdHMocCwgMSwgMSAtIHMtPmxzZik7IC8qIDEgPSBtcGVnMSBJRCwgMCA9IG1wZWcyIGxzZiBJRCAqLworICAgIHB1dF9iaXRzKHAsIDEsIDEgLSBzLT5sc2YpOyAvKiAxID0gTVBFRy0xIElELCAwID0gTVBFRy0yIGxzZiBJRCAqLwogICAgIHB1dF9iaXRzKHAsIDIsIDQtMik7ICAvKiBsYXllciAyICovCiAgICAgcHV0X2JpdHMocCwgMSwgMSk7IC8qIG5vIGVycm9yIHByb3RlY3Rpb24gKi8KICAgICBwdXRfYml0cyhwLCA0LCBzLT5iaXRyYXRlX2luZGV4KTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZ3BpY3R1cmUuYyBiL2xpYmF2Y29kZWMvbXBlZ3BpY3R1cmUuYwppbmRleCAxNmI4ZjUyLi5lY2JkNzdkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWdwaWN0dXJlLmMKKysrIGIvbGliYXZjb2RlYy9tcGVncGljdHVyZS5jCkBAIC0yMiw2ICsyMiw4IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJtb3Rpb25fZXN0LmgiCkBAIC01NiwxMyArNTgsMTAgQEAKIGludCBmZl9tcGVnX2ZyYW1lc2l6ZV9hbGxvYyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIE1vdGlvbkVzdENvbnRleHQgKm1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjcmF0Y2hwYWRDb250ZXh0ICpzYywgaW50IGxpbmVzaXplKQogeworIyAgIGRlZmluZSBFTVVfRURHRV9IRUlHSFQgKDQgKiA3MCkKICAgICBpbnQgYWxsb2Nfc2l6ZSA9IEZGQUxJR04oRkZBQlMobGluZXNpemUpICsgNjQsIDMyKTsKIAotICAgIGlmIChhdmN0eC0+aHdhY2NlbAotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICAgICAgfHwgYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVQotI2VuZGlmCi0gICAgICAgICkKKyAgICBpZiAoYXZjdHgtPmh3YWNjZWwpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgaWYgKGxpbmVzaXplIDwgMjQpIHsKQEAgLTcwLDEzICs2OSwxNiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCisgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUyKGFsbG9jX3NpemUsIEVNVV9FREdFX0hFSUdIVCwgYXZjdHgtPm1heF9waXhlbHMsIEFWX1BJWF9GTVRfTk9ORSwgMCwgYXZjdHgpIDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKwogICAgIC8vIGVkZ2UgZW11IG5lZWRzIGJsb2Nrc2l6ZSArIGZpbHRlciBsZW5ndGggLSAxCi0gICAgLy8gKD0gMTd4MTcgZm9yICBoYWxmcGVsIC8gMjF4MjEgZm9yICBoMjY0KQotICAgIC8vIFZDMSBjb21wdXRlcyBsdW1hIGFuZCBjaHJvbWEgc2ltdWx0YW5lb3VzbHkgYW5kIG5lZWRzIDE5WDE5ICsgOXg5CisgICAgLy8gKD0gMTd4MTcgZm9yICBoYWxmcGVsIC8gMjF4MjEgZm9yIEguMjY0KQorICAgIC8vIFZDLTEgY29tcHV0ZXMgbHVtYSBhbmQgY2hyb21hIHNpbXVsdGFuZW91c2x5IGFuZCBuZWVkcyAxOVgxOSArIDl4OQogICAgIC8vIGF0IHV2bGluZXNpemUuIEl0IHN1cHBvcnRzIG9ubHkgWVVWNDIwIHNvIDI0eDI0IGlzIGVub3VnaAogICAgIC8vIGxpbmVzaXplICogaW50ZXJsYWNlZCAqIE1Cc2l6ZQogICAgIC8vIHdlIGFsc28gdXNlIHRoaXMgYnVmZmVyIGZvciBlbmNvZGluZyBpbiBlbmNvZGVfbWJfaW50ZXJuYWwoKSBuZWVkaWcgYW4gYWRkaXRpb25hbCAzMiBsaW5lcwotICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGF2Y3R4LCBzYy0+ZWRnZV9lbXVfYnVmZmVyLCBhbGxvY19zaXplLCA0ICogNjgsCisgICAgRkZfQUxMT0NaX0FSUkFZX09SX0dPVE8oYXZjdHgsIHNjLT5lZGdlX2VtdV9idWZmZXIsIGFsbG9jX3NpemUsIEVNVV9FREdFX0hFSUdIVCwKICAgICAgICAgICAgICAgICAgICAgICBmYWlsKTsKIAogICAgIEZGX0FMTE9DWl9BUlJBWV9PUl9HT1RPKGF2Y3R4LCBtZS0+c2NyYXRjaHBhZCwgYWxsb2Nfc2l6ZSwgNCAqIDE2ICogMiwKQEAgLTE1MSwxNSArMTUzLDE4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobGluZXNpemUgJiYgKGxpbmVzaXplICAgIT0gcGljLT5mLT5saW5lc2l6ZVswXSB8fAotICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSAhPSBwaWMtPmYtPmxpbmVzaXplWzFdKSkgeworICAgIGlmICgobGluZXNpemUgICAmJiAgIGxpbmVzaXplICE9IHBpYy0+Zi0+bGluZXNpemVbMF0pIHx8CisgICAgICAgICh1dmxpbmVzaXplICYmIHV2bGluZXNpemUgIT0gcGljLT5mLT5saW5lc2l6ZVsxXSkpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiZ2V0X2J1ZmZlcigpIGZhaWxlZCAoc3RyaWRlIGNoYW5nZWQpXG4iKTsKKyAgICAgICAgICAgICAgICJnZXRfYnVmZmVyKCkgZmFpbGVkIChzdHJpZGUgY2hhbmdlZDogbGluZXNpemU9JWQvJWQgdXZsaW5lc2l6ZT0lZC8lZClcbiIsCisgICAgICAgICAgICAgICBsaW5lc2l6ZSwgICBwaWMtPmYtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwgcGljLT5mLT5saW5lc2l6ZVsxXSk7CiAgICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShhdmN0eCwgcGljKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChwaWMtPmYtPmxpbmVzaXplWzFdICE9IHBpYy0+Zi0+bGluZXNpemVbMl0pIHsKKyAgICBpZiAoYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMocGljLT5mLT5mb3JtYXQpID4gMiAmJgorICAgICAgICBwaWMtPmYtPmxpbmVzaXplWzFdICE9IHBpYy0+Zi0+bGluZXNpemVbMl0pIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiZ2V0X2J1ZmZlcigpIGZhaWxlZCAodXYgc3RyaWRlIG1pc21hdGNoKVxuIik7CiAgICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShhdmN0eCwgcGljKTsKQEAgLTIwMiw3ICsyMDcsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCi0gICAgaWYgKG91dF9mb3JtYXQgPT0gRk1UX0gyNjMgfHwgZW5jb2RpbmcgfHwgYXZjdHgtPmRlYnVnX212IHx8CisgICAgaWYgKG91dF9mb3JtYXQgPT0gRk1UX0gyNjMgfHwgZW5jb2RpbmcgfHwKKyNpZiBGRl9BUElfREVCVUdfTVYKKyAgICAgICAgYXZjdHgtPmRlYnVnX212IHx8CisjZW5kaWYKICAgICAgICAgKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9FWFBPUlRfTVZTKSkgewogICAgICAgICBpbnQgbXZfc2l6ZSAgICAgICAgPSAyICogKGI4X2FycmF5X3NpemUgKyA0KSAqIHNpemVvZihpbnQxNl90KTsKICAgICAgICAgaW50IHJlZl9pbmRleF9zaXplID0gNCAqIG1iX2FycmF5X3NpemU7CkBAIC0zNzQsOCArMzgyLDEwIEBACiAKICAgICBpZiAoc3JjLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSkgewogICAgICAgICBkc3QtPmh3YWNjZWxfcHJpdl9idWYgPSBhdl9idWZmZXJfcmVmKHNyYy0+aHdhY2NlbF9wcml2X2J1Zik7Ci0gICAgICAgIGlmICghZHN0LT5od2FjY2VsX3ByaXZfYnVmKQorICAgICAgICBpZiAoIWRzdC0+aHdhY2NlbF9wcml2X2J1ZikgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CiAgICAgICAgIGRzdC0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGUgPSBkc3QtPmh3YWNjZWxfcHJpdl9idWYtPmRhdGE7CiAgICAgfQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWd1dGlscy5jIGIvbGliYXZjb2RlYy9tcGVndXRpbHMuYwppbmRleCA2MmNjMzZhLi4zZjk0NTQwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWd1dGlscy5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZ3V0aWxzLmMKQEAgLTIzLDEwICsyMywzMSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tb3Rpb25fdmVjdG9yLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCiAKK3N0YXRpYyBpbnQgYWRkX21iKEFWTW90aW9uVmVjdG9yICptYiwgdWludDMyX3QgbWJfdHlwZSwKKyAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LAorICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3ksIGludCBtb3Rpb25fc2NhbGUsCisgICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQoreworICAgIG1iLT53ID0gSVNfOFg4KG1iX3R5cGUpIHx8IElTXzhYMTYobWJfdHlwZSkgPyA4IDogMTY7CisgICAgbWItPmggPSBJU184WDgobWJfdHlwZSkgfHwgSVNfMTZYOChtYl90eXBlKSA/IDggOiAxNjsKKyAgICBtYi0+bW90aW9uX3ggPSBtb3Rpb25feDsKKyAgICBtYi0+bW90aW9uX3kgPSBtb3Rpb25feTsKKyAgICBtYi0+bW90aW9uX3NjYWxlID0gbW90aW9uX3NjYWxlOworICAgIG1iLT5kc3RfeCA9IGRzdF94OworICAgIG1iLT5kc3RfeSA9IGRzdF95OworICAgIG1iLT5zcmNfeCA9IGRzdF94ICsgbW90aW9uX3ggLyBtb3Rpb25fc2NhbGU7CisgICAgbWItPnNyY195ID0gZHN0X3kgKyBtb3Rpb25feSAvIG1vdGlvbl9zY2FsZTsKKyAgICBtYi0+c291cmNlID0gZGlyZWN0aW9uID8gMSA6IC0xOworICAgIG1iLT5mbGFncyA9IDA7IC8vIFhYWDogZG9lcyBtYl90eXBlIGNvbnRhaW4gZXh0cmEgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSBleHBvcnRlZCBoZXJlPworICAgIHJldHVybiAxOworfQorCiB2b2lkIGZmX2RyYXdfaG9yaXpfYmFuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpjdXIsIEFWRnJhbWUgKmxhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwgaW50IGgsIGludCBwaWN0dXJlX3N0cnVjdHVyZSwKQEAgLTc4LDMgKzk5LDI5NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksIHBpY3R1cmVfc3RydWN0dXJlLCBoKTsKICAgICB9CiB9CisKK3ZvaWQgZmZfcHJpbnRfZGVidWdfaW5mbzIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWN0LCB1aW50OF90ICptYnNraXBfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1idHlwZV90YWJsZSwgaW50OF90ICpxc2NhbGVfdGFibGUsIGludDE2X3QgKCptb3Rpb25fdmFsWzJdKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxvd19kZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfd2lkdGgsIGludCBtYl9oZWlnaHQsIGludCBtYl9zdHJpZGUsIGludCBxdWFydGVyX3NhbXBsZSkKK3sKKyAgICBpZiAoKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9FWFBPUlRfTVZTKSAmJiBtYnR5cGVfdGFibGUgJiYgbW90aW9uX3ZhbFswXSkgeworICAgICAgICBjb25zdCBpbnQgc2hpZnQgPSAxICsgcXVhcnRlcl9zYW1wbGU7CisgICAgICAgIGNvbnN0IGludCBzY2FsZSA9IDEgPDwgc2hpZnQ7CisgICAgICAgIGNvbnN0IGludCBtdl9zYW1wbGVfbG9nMiA9IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlEzID8gMiA6IDE7CisgICAgICAgIGNvbnN0IGludCBtdl9zdHJpZGUgICAgICA9IChtYl93aWR0aCA8PCBtdl9zYW1wbGVfbG9nMikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ID8gMCA6IDEpOworICAgICAgICBpbnQgbWJfeCwgbWJfeSwgbWJjb3VudCA9IDA7CisKKyAgICAgICAgLyogc2l6ZSBpcyB3aWR0aCAqIGhlaWdodCAqIDIgKiA0IHdoZXJlIDIgaXMgZm9yIGRpcmVjdGlvbnMgYW5kIDQgaXMKKyAgICAgICAgICogZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBNQiAoNCBNQiBpbiBjYXNlIG9mIElTXzh4OCkgKi8KKyAgICAgICAgQVZNb3Rpb25WZWN0b3IgKm12cyA9IGF2X21hbGxvY19hcnJheShtYl93aWR0aCAqIG1iX2hlaWdodCwgMiAqIDQgKiBzaXplb2YoQVZNb3Rpb25WZWN0b3IpKTsKKyAgICAgICAgaWYgKCFtdnMpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IG1iX2hlaWdodDsgbWJfeSsrKSB7CisgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgbWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgIGludCBpLCBkaXJlY3Rpb24sIG1iX3R5cGUgPSBtYnR5cGVfdGFibGVbbWJfeCArIG1iX3kgKiBtYl9zdHJpZGVdOworICAgICAgICAgICAgICAgIGZvciAoZGlyZWN0aW9uID0gMDsgZGlyZWN0aW9uIDwgMjsgZGlyZWN0aW9uKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFVU0VTX0xJU1QobWJfdHlwZSwgZGlyZWN0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoSVNfOFg4KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN4ID0gbWJfeCAqIDE2ICsgNCArIDggKiAoaSAmIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeSA9IG1iX3kgKiAxNiArIDQgKyA4ICogKGkgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHh5ID0gKG1iX3ggKiAyICsgKGkgJiAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYl95ICogMiArIChpID4+IDEpKSAqIG12X3N0cmlkZSkgPDwgKG12X3NhbXBsZV9sb2cyIC0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14ID0gbW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXkgPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1iY291bnQgKz0gYWRkX21iKG12cyArIG1iY291bnQsIG1iX3R5cGUsIHN4LCBzeSwgbXgsIG15LCBzY2FsZSwgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU18xNlg4KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN4ID0gbWJfeCAqIDE2ICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA0ICsgOCAqIGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHh5ID0gKG1iX3ggKiAyICsgKG1iX3kgKiAyICsgaSkgKiBtdl9zdHJpZGUpIDw8IChtdl9zYW1wbGVfbG9nMiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCA9IG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG15ID0gbW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVsxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAqPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJjb3VudCArPSBhZGRfbWIobXZzICsgbWJjb3VudCwgbWJfdHlwZSwgc3gsIHN5LCBteCwgbXksIHNjYWxlLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTXzhYMTYobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA0ICsgOCAqIGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5ID0gbWJfeSAqIDE2ICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCAqIDIgKyBpICsgbWJfeSAqIDIgKiBtdl9zdHJpZGUpIDw8IChtdl9zYW1wbGVfbG9nMiAtIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCA9IG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG15ID0gbW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVsxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAqPSAyOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJjb3VudCArPSBhZGRfbWIobXZzICsgbWJjb3VudCwgbWJfdHlwZSwgc3gsIHN5LCBteCwgbXksIHNjYWxlLCBkaXJlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA4OworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCArIG1iX3kgKiBtdl9zdHJpZGUpIDw8IG12X3NhbXBsZV9sb2cyOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXggPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXkgPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgICBtYmNvdW50ICs9IGFkZF9tYihtdnMgKyBtYmNvdW50LCBtYl90eXBlLCBzeCwgc3ksIG14LCBteSwgc2NhbGUsIGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobWJjb3VudCkgeworICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZDsKKworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJBZGRpbmcgJWQgTVZzIGluZm8gdG8gZnJhbWUgJWRcbiIsIG1iY291bnQsIGF2Y3R4LT5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgc2QgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKHBpY3QsIEFWX0ZSQU1FX0RBVEFfTU9USU9OX1ZFQ1RPUlMsIG1iY291bnQgKiBzaXplb2YoQVZNb3Rpb25WZWN0b3IpKTsKKyAgICAgICAgICAgIGlmICghc2QpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmbXZzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoc2QtPmRhdGEsIG12cywgbWJjb3VudCAqIHNpemVvZihBVk1vdGlvblZlY3RvcikpOworICAgICAgICB9CisKKyAgICAgICAgYXZfZnJlZXAoJm12cyk7CisgICAgfQorCisgICAgLyogVE9ETzogZXhwb3J0IGFsbCB0aGUgZm9sbG93aW5nIHRvIG1ha2UgdGhlbSBhY2Nlc3NpYmxlIGZvciB1c2VycyAoYW5kIGZpbHRlcnMpICovCisgICAgaWYgKGF2Y3R4LT5od2FjY2VsIHx8ICFtYnR5cGVfdGFibGUpCisgICAgICAgIHJldHVybjsKKworCisgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIChGRl9ERUJVR19TS0lQIHwgRkZfREVCVUdfUVAgfCBGRl9ERUJVR19NQl9UWVBFKSkgeworICAgICAgICBpbnQgeCx5OworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiTmV3IGZyYW1lLCB0eXBlOiAlY1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihwaWN0LT5waWN0X3R5cGUpKTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IG1iX2hlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbWJfd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19TS0lQKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IG1ic2tpcF90YWJsZSA/IG1ic2tpcF90YWJsZVt4ICsgeSAqIG1iX3N0cmlkZV0gOiAwOworICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPiA5KQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSA5OworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiUxZCIsIGNvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1FQKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiJTJkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHFzY2FsZV90YWJsZVt4ICsgeSAqIG1iX3N0cmlkZV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfTUJfVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdHlwZSA9IG1idHlwZV90YWJsZVt4ICsgeSAqIG1iX3N0cmlkZV07CisgICAgICAgICAgICAgICAgICAgIC8vIFR5cGUgJiBNViBkaXJlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKElTX1BDTShtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUCIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19JTlRSQShtYl90eXBlKSAmJiBJU19BQ1BSRUQobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkEiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfSU5UUkE0eDQobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImkiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfSU5UUkExNngxNihtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSSIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19ESVJFQ1QobWJfdHlwZSkgJiYgSVNfU0tJUChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZCIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19ESVJFQ1QobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkQiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfR01DKG1iX3R5cGUpICYmIElTX1NLSVAobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImciKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfR01DKG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJHIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX1NLSVAobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlMiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIVVTRVNfTElTVChtYl90eXBlLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiPiIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghVVNFU19MSVNUKG1iX3R5cGUsIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICI8Iik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihVU0VTX0xJU1QobWJfdHlwZSwgMCkgJiYgVVNFU19MSVNUKG1iX3R5cGUsIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiWCIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VnbWVudGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGlmIChJU184WDgobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIisiKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfMTZYOChtYl90eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiLSIpOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU184WDE2KG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJ8Iik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX0lOVFJBKG1iX3R5cGUpIHx8IElTXzE2WDE2KG1iX3R5cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgIik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiPyIpOworCisKKyAgICAgICAgICAgICAgICAgICAgaWYgKElTX0lOVEVSTEFDRUQobWJfdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIj0iKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgICAgICB9CisgICAgfQorCisjaWYgRkZfQVBJX0RFQlVHX01WCisgICAgaWYgKChhdmN0eC0+ZGVidWcgJiAoRkZfREVCVUdfVklTX1FQIHwgRkZfREVCVUdfVklTX01CX1RZUEUpKSB8fAorICAgICAgICAoYXZjdHgtPmRlYnVnX212KSkgeworICAgICAgICBpbnQgbWJfeTsKKyAgICAgICAgaW50IGksIHJldDsKKyAgICAgICAgaW50IGhfY2hyb21hX3NoaWZ0LCB2X2Nocm9tYV9zaGlmdCwgYmxvY2tfaGVpZ2h0OworICAgICAgICBjb25zdCBpbnQgbXZfc2FtcGxlX2xvZzIgPSBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1ZRMyA/IDIgOiAxOworICAgICAgICBjb25zdCBpbnQgbXZfc3RyaWRlICAgICAgPSAobWJfd2lkdGggPDwgbXZfc2FtcGxlX2xvZzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2NCA/IDAgOiAxKTsKKworICAgICAgICBpZiAobG93X2RlbGF5KQorICAgICAgICAgICAgKmxvd19kZWxheSA9IDA7IC8vIG5lZWRlZCB0byBzZWUgdGhlIHZlY3RvcnMgd2l0aG91dCB0cmFzaGluZyB0aGUgYnVmZmVycworCisgICAgICAgIHJldCA9IGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlIChhdmN0eC0+cGl4X2ZtdCwgJmhfY2hyb21hX3NoaWZ0LCAmdl9jaHJvbWFfc2hpZnQpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKHBpY3QpOworCisgICAgICAgIHBpY3QtPm9wYXF1ZSA9IE5VTEw7CisgICAgICAgIGJsb2NrX2hlaWdodCA9IDE2ID4+IHZfY2hyb21hX3NoaWZ0OworCisgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBtYl9oZWlnaHQ7IG1iX3krKykgeworICAgICAgICAgICAgaW50IG1iX3g7CisgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgbWJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYl9pbmRleCA9IG1iX3ggKyBtYl95ICogbWJfc3RyaWRlOworICAgICAgICAgICAgICAgIGlmICgoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfVklTX1FQKSkgeworICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjID0gKHFzY2FsZV90YWJsZVttYl9pbmRleF0gKiAxMjggLyAzMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMTAxMDEwMTAxMDEwMTAxVUxMOworICAgICAgICAgICAgICAgICAgICBpbnQgeTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGJsb2NrX2hlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQ2NF90ICopKHBpY3QtPmRhdGFbMV0gKyA4ICogbWJfeCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibG9ja19oZWlnaHQgKiBtYl95ICsgeSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5saW5lc2l6ZVsxXSkgPSBjOworICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50NjRfdCAqKShwaWN0LT5kYXRhWzJdICsgOCAqIG1iX3ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tfaGVpZ2h0ICogbWJfeSArIHkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+bGluZXNpemVbMl0pID0gYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1ZJU19NQl9UWVBFKSAmJgorICAgICAgICAgICAgICAgICAgICBtb3Rpb25fdmFsWzBdKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlID0gbWJ0eXBlX3RhYmxlW21iX2luZGV4XTsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdSx2OworICAgICAgICAgICAgICAgICAgICBpbnQgeTsKKyNkZWZpbmUgQ09MT1IodGhldGEsIHIpIFwKKyAgICB1ID0gKGludCkoMTI4ICsgciAqIGNvcyh0aGV0YSAqIE1fUEkgLyAxODApKTsgXAorICAgIHYgPSAoaW50KSgxMjggKyByICogc2luKHRoZXRhICogTV9QSSAvIDE4MCkpOworCisKKyAgICAgICAgICAgICAgICAgICAgdSA9IHYgPSAxMjg7CisgICAgICAgICAgICAgICAgICAgIGlmIChJU19QQ00obWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDEyMCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKElTX0lOVFJBKG1iX3R5cGUpICYmIElTX0FDUFJFRChtYl90eXBlKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJU19JTlRSQTE2eDE2KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigzMCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfSU5UUkE0eDQobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDkwLCA0OCkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU19ESVJFQ1QobWJfdHlwZSkgJiYgSVNfU0tJUChtYl90eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ09MT1IoMTIwLCA0OCkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU19ESVJFQ1QobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDE1MCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfR01DKG1iX3R5cGUpICYmIElTX1NLSVAobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDE3MCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfR01DKG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigxOTAsIDQ4KQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTX1NLSVAobWJfdHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENPTE9SKDE4MCwgNDgpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIVVTRVNfTElTVChtYl90eXBlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1IoMjQwLCA0OCkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghVVNFU19MSVNUKG1iX3R5cGUsIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigwLCA0OCkKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIoVVNFU19MSVNUKG1iX3R5cGUsIDApICYmIFVTRVNfTElTVChtYl90eXBlLCAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigzMDAsNDgpCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB1ICo9IDB4MDEwMTAxMDEwMTAxMDEwMVVMTDsKKyAgICAgICAgICAgICAgICAgICAgdiAqPSAweDAxMDEwMTAxMDEwMTAxMDFVTEw7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBibG9ja19oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50NjRfdCAqKShwaWN0LT5kYXRhWzFdICsgOCAqIG1iX3ggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tfaGVpZ2h0ICogbWJfeSArIHkpICogcGljdC0+bGluZXNpemVbMV0pID0gdTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVsyXSArIDggKiBtYl94ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrX2hlaWdodCAqIG1iX3kgKyB5KSAqIHBpY3QtPmxpbmVzaXplWzJdKSA9IHY7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKElTXzhYOChtYl90eXBlKSB8fCBJU18xNlg4KG1iX3R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQ2NF90ICopKHBpY3QtPmRhdGFbMF0gKyAxNiAqIG1iX3ggKyAwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE2ICogbWJfeSArIDgpICogcGljdC0+bGluZXNpemVbMF0pIF49IDB4ODA4MDgwODA4MDgwODA4MFVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVswXSArIDE2ICogbWJfeCArIDggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTYgKiBtYl95ICsgOCkgKiBwaWN0LT5saW5lc2l6ZVswXSkgXj0gMHg4MDgwODA4MDgwODA4MDgwVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChJU184WDgobWJfdHlwZSkgfHwgSVNfOFgxNihtYl90eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDE2OyB5KyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+ZGF0YVswXVsxNiAqIG1iX3ggKyA4ICsgKDE2ICogbWJfeSArIHkpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmxpbmVzaXplWzBdXSBePSAweDgwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChJU184WDgobWJfdHlwZSkgJiYgbXZfc2FtcGxlX2xvZzIgPj0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRtID0gMSA8PCAobXZfc2FtcGxlX2xvZzIgLSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA4ICogKGkgJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA4ICogKGkgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHh5ID0gKG1iX3ggKiAyICsgKGkgJiAxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX3kgKiAyICsgKGkgPj4gMSkpICogbXZfc3RyaWRlKSA8PCAobXZfc2FtcGxlX2xvZzIgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBiaWRpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKm12ID0gKGludDMyX3QgKikgJm1vdGlvbl92YWxbMF1beHldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdlswXSAhPSBtdltkbV0gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZbZG0gKiBtdl9zdHJpZGVdICE9IG12W2RtICogKG12X3N0cmlkZSArIDEpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmRhdGFbMF1bc3ggKyA0ICsgKHN5ICsgeSkgKiBwaWN0LT5saW5lc2l6ZVswXV0gXj0gMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXZbMF0gIT0gbXZbZG0gKiBtdl9zdHJpZGVdIHx8IG12W2RtXSAhPSBtdltkbSAqIChtdl9zdHJpZGUgKyAxKV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVswXSArIHN4ICsgKHN5ICsgNCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmxpbmVzaXplWzBdKSBePSAweDgwODA4MDgwODA4MDgwODBVTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoSVNfSU5URVJMQUNFRChtYl90eXBlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBobW0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWJza2lwX3RhYmxlKQorICAgICAgICAgICAgICAgICAgICBtYnNraXBfdGFibGVbbWJfaW5kZXhdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVndXRpbHMuaCBiL2xpYmF2Y29kZWMvbXBlZ3V0aWxzLmgKaW5kZXggOWNmYWRmYy4uMWVkMjFjMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVndXRpbHMuaAorKysgYi9saWJhdmNvZGVjL21wZWd1dGlscy5oCkBAIC00OCw3ICs0OCw2IEBACiAjZGVmaW5lIE1BWF9GQ09ERSAgICAgICAgNwogCiAvKiBNQiB0eXBlcyAqLwotI2lmICFGRl9BUElfTUJfVFlQRQogI2RlZmluZSBNQl9UWVBFX0lOVFJBNHg0ICAgKDEgPDwgIDApCiAjZGVmaW5lIE1CX1RZUEVfSU5UUkExNngxNiAoMSA8PCAgMSkgLy8gRklYTUUgSC4yNjQtc3BlY2lmaWMKICNkZWZpbmUgTUJfVFlQRV9JTlRSQV9QQ00gICgxIDw8ICAyKSAvLyBGSVhNRSBILjI2NC1zcGVjaWZpYwpAQCAtNzAsNyArNjksNiBAQAogI2RlZmluZSBNQl9UWVBFX0wwTDEgICAgICAgKE1CX1RZUEVfTDAgICB8IE1CX1RZUEVfTDEpCiAjZGVmaW5lIE1CX1RZUEVfUVVBTlQgICAgICAoMSA8PCAxNikKICNkZWZpbmUgTUJfVFlQRV9DQlAgICAgICAgICgxIDw8IDE3KQotI2VuZGlmCiAKICNkZWZpbmUgTUJfVFlQRV9JTlRSQSAgICBNQl9UWVBFX0lOVFJBNHg0IC8vIGRlZmF1bHQgbWJfdHlwZSBpZiB0aGVyZSBpcyBqdXN0IG9uZSB0eXBlCiAKQEAgLTEzOSw0ICsxMzcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LCBpbnQgaCwgaW50IHBpY3R1cmVfc3RydWN0dXJlLCBpbnQgZmlyc3RfZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2RlbGF5KTsKIAorLyoqCisgKiBQcmludCBkZWJ1Z2dpbmcgaW5mbyBmb3IgdGhlIGdpdmVuIHBpY3R1cmUuCisgKi8KK3ZvaWQgZmZfcHJpbnRfZGVidWdfaW5mbzIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWN0LCB1aW50OF90ICptYnNraXBfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm1idHlwZV90YWJsZSwgaW50OF90ICpxc2NhbGVfdGFibGUsIGludDE2X3QgKCptb3Rpb25fdmFsWzJdKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxvd19kZWxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJfd2lkdGgsIGludCBtYl9oZWlnaHQsIGludCBtYl9zdHJpZGUsIGludCBxdWFydGVyX3NhbXBsZSk7CisKICNlbmRpZiAvKiBBVkNPREVDX01QRUdVVElMU19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWd2aWRlby5jIGIvbGliYXZjb2RlYy9tcGVndmlkZW8uYwppbmRleCAyMzY5ODdiLi5mNzVjMGZkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWd2aWRlby5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvLmMKQEAgLTU5LDcgKzU5LDcgQEAKICAgICBuQ29lZmZzPSBzLT5ibG9ja19sYXN0X2luZGV4W25dOwogCiAgICAgYmxvY2tbMF0gKj0gbiA8IDQgPyBzLT55X2RjX3NjYWxlIDogcy0+Y19kY19zY2FsZTsKLSAgICAvKiBYWFg6IG9ubHkgbXBlZzEgKi8KKyAgICAvKiBYWFg6IG9ubHkgTVBFRy0xICovCiAgICAgcXVhbnRfbWF0cml4ID0gcy0+aW50cmFfbWF0cml4OwogICAgIGZvcihpPTE7aTw9bkNvZWZmcztpKyspIHsKICAgICAgICAgaW50IGo9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkW2ldOwpAQCAtMjI1LDcgKzIyNSw3IEBACiAgICAgaWYocy0+YWNfcHJlZCkKICAgICAgICAgbkNvZWZmcz02MzsKICAgICBlbHNlCi0gICAgICAgIG5Db2VmZnM9IHMtPmludGVyX3NjYW50YWJsZS5yYXN0ZXJfZW5kWyBzLT5ibG9ja19sYXN0X2luZGV4W25dIF07CisgICAgICAgIG5Db2VmZnM9IHMtPmludHJhX3NjYW50YWJsZS5yYXN0ZXJfZW5kWyBzLT5ibG9ja19sYXN0X2luZGV4W25dIF07CiAKICAgICBmb3IoaT0xOyBpPD1uQ29lZmZzOyBpKyspIHsKICAgICAgICAgbGV2ZWwgPSBibG9ja1tpXTsKQEAgLTMyOSw2ICszMjksOCBAQAogCiBhdl9jb2xkIHZvaWQgZmZfbXB2X2lkY3RfaW5pdChNcGVnRW5jQ29udGV4dCAqcykKIHsKKyAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpCisgICAgICAgIHMtPmlkc3AubXBlZzRfc3R1ZGlvX3Byb2ZpbGUgPSBzLT5zdHVkaW9fcHJvZmlsZTsKICAgICBmZl9pZGN0ZHNwX2luaXQoJnMtPmlkc3AsIHMtPmF2Y3R4KTsKIAogICAgIC8qIGxvYWQgJiBwZXJtdXRhdGUgc2NhbnRhYmxlcwpAQCAtMzg2LDYgKzM4OCw5IEBACiAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKICAgICAgICAgcy0+cGJsb2Nrc1tpXSA9ICZzLT5ibG9ja1tpXTsKICAgICB9CisKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+YmxvY2szMiwgc2l6ZW9mKCpzLT5ibG9jazMyKSwgZmFpbCkKKwogICAgIGlmIChzLT5hdmN0eC0+Y29kZWNfdGFnID09IEFWX1JMMzIoIlZDUjIiKSkgewogICAgICAgICAvLyBleGNoYW5nZSB1dgogICAgICAgICBGRlNXQVAodm9pZCAqLCBzLT5wYmxvY2tzWzRdLCBzLT5wYmxvY2tzWzVdKTsKQEAgLTQyMSw2ICs0MjYsNyBAQAogICAgIGF2X2ZyZWVwKCZzLT5tZS5tYXApOwogICAgIGF2X2ZyZWVwKCZzLT5tZS5zY29yZV9tYXApOwogICAgIGF2X2ZyZWVwKCZzLT5ibG9ja3MpOworICAgIGF2X2ZyZWVwKCZzLT5ibG9jazMyKTsKICAgICBhdl9mcmVlcCgmcy0+YWNfdmFsX2Jhc2UpOwogICAgIHMtPmJsb2NrID0gTlVMTDsKIH0KQEAgLTQzOCw2ICs0NDQsNyBAQAogICAgIENPUFkobWUuc2NvcmVfbWFwKTsKICAgICBDT1BZKGJsb2Nrcyk7CiAgICAgQ09QWShibG9jayk7CisgICAgQ09QWShibG9jazMyKTsKICAgICBDT1BZKHN0YXJ0X21iX3kpOwogICAgIENPUFkoZW5kX21iX3kpOwogICAgIENPUFkobWUubWFwX2dlbmVyYXRpb24pOwpAQCAtNTY3LDcgKzU3NCw3IEBACiAgICAgcy0+d29ya2Fyb3VuZF9idWdzICAgICAgPSBzMS0+d29ya2Fyb3VuZF9idWdzOwogICAgIHMtPnBhZGRpbmdfYnVnX3Njb3JlICAgID0gczEtPnBhZGRpbmdfYnVnX3Njb3JlOwogCi0gICAgLy8gTVBFRzQgdGltaW5nIGluZm8KKyAgICAvLyBNUEVHLTQgdGltaW5nIGluZm8KICAgICBtZW1jcHkoJnMtPmxhc3RfdGltZV9iYXNlLCAmczEtPmxhc3RfdGltZV9iYXNlLAogICAgICAgICAgICAoY2hhciAqKSAmczEtPnBiX2ZpZWxkX3RpbWUgKyBzaXplb2YoczEtPnBiX2ZpZWxkX3RpbWUpIC0KICAgICAgICAgICAgKGNoYXIgKikgJnMxLT5sYXN0X3RpbWVfYmFzZSk7CkBAIC01OTgsNyArNjA1LDcgQEAKICAgICAgICAgICAgICAgIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgIH0KIAotICAgIC8vIGxpbmVzaXplIGRlcGVuZGVuZCBzY3JhdGNoIGJ1ZmZlciBhbGxvY2F0aW9uCisgICAgLy8gbGluZXNpemUtZGVwZW5kZW50IHNjcmF0Y2ggYnVmZmVyIGFsbG9jYXRpb24KICAgICBpZiAoIXMtPnNjLmVkZ2VfZW11X2J1ZmZlcikKICAgICAgICAgaWYgKHMxLT5saW5lc2l6ZSkgewogICAgICAgICAgICAgaWYgKGZmX21wZWdfZnJhbWVzaXplX2FsbG9jKHMtPmF2Y3R4LCAmcy0+bWUsCkBAIC02MTIsNyArNjE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAiYmUgYWxsb2NhdGVkIGR1ZSB0byB1bmtub3duIHNpemUuXG4iKTsKICAgICAgICAgfQogCi0gICAgLy8gTVBFRzIvaW50ZXJsYWNpbmcgaW5mbworICAgIC8vIE1QRUctMi9pbnRlcmxhY2luZyBpbmZvCiAgICAgbWVtY3B5KCZzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSwgJnMxLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSwKICAgICAgICAgICAgKGNoYXIgKikgJnMxLT5ydHBfbW9kZSAtIChjaGFyICopICZzMS0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpOwogCkBAIC03MDUsNyArNzEyLDggQEAKICAgICBpZiAocy0+bWJfaGVpZ2h0ICYgMSkKICAgICAgICAgeWNfc2l6ZSArPSAyKnMtPmI4X3N0cmlkZSArIDIqcy0+bWJfc3RyaWRlOwogCi0gICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPm1iX2luZGV4Mnh5LCAocy0+bWJfbnVtICsgMSkgKiBzaXplb2YoaW50KSwgZmFpbCk7IC8vIGVycm9yIHJlc3NpbGllbmNlIGNvZGUgbG9va3MgY2xlYW5lciB3aXRoIHRoaXMKKyAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+bWJfaW5kZXgyeHksIChzLT5tYl9udW0gKyAxKSAqIHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgICAgICAgIGZhaWwpOyAvLyBlcnJvciByZXNpbGllbmNlIGNvZGUgbG9va3MgY2xlYW5lciB3aXRoIHRoaXMKICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+bWJfaGVpZ2h0OyB5KyspCiAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5tYl93aWR0aDsgeCsrKQogICAgICAgICAgICAgcy0+bWJfaW5kZXgyeHlbeCArIHkgKiBzLT5tYl93aWR0aF0gPSB4ICsgeSAqIHMtPm1iX3N0cmlkZTsKQEAgLTc3Miw3ICs3ODAsNyBAQAogCiAgICAgaWYgKHMtPmgyNjNfcHJlZCB8fCBzLT5oMjYzX3BsdXMgfHwgIXMtPmVuY29kaW5nKSB7CiAgICAgICAgIC8qIGRjIHZhbHVlcyAqLwotICAgICAgICAvLyBNTjogd2UgbmVlZCB0aGVzZSBmb3IgIGVycm9yIHJlc2lsaWVuY2Ugb2YgaW50cmEtZnJhbWVzCisgICAgICAgIC8vIE1OOiB3ZSBuZWVkIHRoZXNlIGZvciBlcnJvciByZXNpbGllbmNlIG9mIGludHJhLWZyYW1lcwogICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhzLT5hdmN0eCwgcy0+ZGNfdmFsX2Jhc2UsIHljX3NpemUgKiBzaXplb2YoaW50MTZfdCksIGZhaWwpOwogICAgICAgICBzLT5kY192YWxbMF0gPSBzLT5kY192YWxfYmFzZSArIHMtPmI4X3N0cmlkZSArIDE7CiAgICAgICAgIHMtPmRjX3ZhbFsxXSA9IHMtPmRjX3ZhbF9iYXNlICsgeV9zaXplICsgcy0+bWJfc3RyaWRlICsgMTsKQEAgLTc4MSwxMyArNzg5LDEzIEBACiAgICAgICAgICAgICBzLT5kY192YWxfYmFzZVtpXSA9IDEwMjQ7CiAgICAgfQogCi0gICAgLyogd2hpY2ggbWIgaXMgYSBpbnRyYSBibG9jayAqLworICAgIC8qIHdoaWNoIG1iIGlzIGFuIGludHJhIGJsb2NrICovCiAgICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPm1iaW50cmFfdGFibGUsIG1iX2FycmF5X3NpemUsIGZhaWwpOwogICAgIG1lbXNldChzLT5tYmludHJhX3RhYmxlLCAxLCBtYl9hcnJheV9zaXplKTsKIAogICAgIC8qIGluaXQgbWFjcm9ibG9jayBza2lwIHRhYmxlICovCiAgICAgRkZfQUxMT0NaX09SX0dPVE8ocy0+YXZjdHgsIHMtPm1ic2tpcF90YWJsZSwgbWJfYXJyYXlfc2l6ZSArIDIsIGZhaWwpOwotICAgIC8vIE5vdGUgdGhlICsgMSBpcyBmb3IgIGEgcXVpY2tlciBtcGVnNCBzbGljZV9lbmQgZGV0ZWN0aW9uCisgICAgLy8gTm90ZSB0aGUgKyAxIGlzIGZvciBhIHF1aWNrZXIgTVBFRy00IHNsaWNlX2VuZCBkZXRlY3Rpb24KIAogICAgIHJldHVybiBmZl9tcGVnX2VyX2luaXQocyk7CiBmYWlsOgpAQCAtODEwLDYgKzgxOCw3IEBACiAgICAgcy0+ZGN0X2Vycm9yX3N1bSA9IE5VTEw7CiAgICAgcy0+YmxvY2sgPSBOVUxMOwogICAgIHMtPmJsb2NrcyA9IE5VTEw7CisgICAgcy0+YmxvY2szMiA9IE5VTEw7CiAgICAgbWVtc2V0KHMtPnBibG9ja3MsIDAsIHNpemVvZihzLT5wYmxvY2tzKSk7CiAgICAgcy0+YWNfdmFsX2Jhc2UgPSBOVUxMOwogICAgIHMtPmFjX3ZhbFswXSA9CkBAIC04MjIsOSArODMxLDcgQEAKICAgICBzLT5zYy5iX3NjcmF0Y2hwYWQgPQogICAgIHMtPnNjLm9ibWNfc2NyYXRjaHBhZCA9IE5VTEw7CiAKLSAgICBzLT5wYXJzZV9jb250ZXh0LmJ1ZmZlciA9IE5VTEw7Ci0gICAgcy0+cGFyc2VfY29udGV4dC5idWZmZXJfc2l6ZSA9IDA7Ci0gICAgcy0+cGFyc2VfY29udGV4dC5vdmVycmVhZCA9IDA7CisKICAgICBzLT5iaXRzdHJlYW1fYnVmZmVyID0gTlVMTDsKICAgICBzLT5hbGxvY2F0ZWRfYml0c3RyZWFtX2J1ZmZlcl9zaXplID0gMDsKICAgICBzLT5waWN0dXJlICAgICAgICAgID0gTlVMTDsKQEAgLTg3Nyw3ICs4ODQsNyBAQAogICovCiBhdl9jb2xkIGludCBmZl9tcHZfY29tbW9uX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpCiB7Ci0gICAgaW50IGk7CisgICAgaW50IGksIHJldDsKICAgICBpbnQgbmJfc2xpY2VzID0gKEhBVkVfVEhSRUFEUyAmJgogICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSkgPwogICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+dGhyZWFkX2NvdW50IDogMTsKQEAgLTkxNiwxMCArOTIzLDExIEBACiAgICAgZGN0X2luaXQocyk7CiAKICAgICAvKiBzZXQgY2hyb21hIHNoaWZ0cyAqLwotICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHMtPmF2Y3R4LT5waXhfZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jaHJvbWFfeF9zaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+Y2hyb21hX3lfc2hpZnQpOwotCisgICAgcmV0ID0gYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUocy0+YXZjdHgtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmNocm9tYV94X3NoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5jaHJvbWFfeV9zaGlmdCk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIEZGX0FMTE9DWl9PUl9HT1RPKHMtPmF2Y3R4LCBzLT5waWN0dXJlLAogICAgICAgICAgICAgICAgICAgICAgIE1BWF9QSUNUVVJFX0NPVU5UICogc2l6ZW9mKFBpY3R1cmUpLCBmYWlsKTsKQEAgLTk0MSwzNyArOTQ5LDM3IEBACiAgICAgaWYgKCFzLT5uZXdfcGljdHVyZS5mKQogICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICAgICAgaWYgKGluaXRfY29udGV4dF9mcmFtZShzKSkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoaW5pdF9jb250ZXh0X2ZyYW1lKHMpKQorICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICAgICAgcy0+cGFyc2VfY29udGV4dC5zdGF0ZSA9IC0xOworICAgIHMtPnBhcnNlX2NvbnRleHQuc3RhdGUgPSAtMTsKIAotICAgICAgICBzLT5jb250ZXh0X2luaXRpYWxpemVkID0gMTsKLSAgICAgICAgbWVtc2V0KHMtPnRocmVhZF9jb250ZXh0LCAwLCBzaXplb2Yocy0+dGhyZWFkX2NvbnRleHQpKTsKLSAgICAgICAgcy0+dGhyZWFkX2NvbnRleHRbMF0gICA9IHM7CisgICAgcy0+Y29udGV4dF9pbml0aWFsaXplZCA9IDE7CisgICAgbWVtc2V0KHMtPnRocmVhZF9jb250ZXh0LCAwLCBzaXplb2Yocy0+dGhyZWFkX2NvbnRleHQpKTsKKyAgICBzLT50aHJlYWRfY29udGV4dFswXSAgID0gczsKIAogLy8gICAgIGlmIChzLT53aWR0aCAmJiBzLT5oZWlnaHQpIHsKLSAgICAgICAgaWYgKG5iX3NsaWNlcyA+IDEpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zbGljZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPnRocmVhZF9jb250ZXh0W2ldID0gYXZfbWVtZHVwKHMsIHNpemVvZihNcGVnRW5jQ29udGV4dCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPnRocmVhZF9jb250ZXh0W2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW5pdF9kdXBsaWNhdGVfY29udGV4dChzLT50aHJlYWRfY29udGV4dFtpXSkgPCAwKQorICAgIGlmIChuYl9zbGljZXMgPiAxKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zbGljZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgICBzLT50aHJlYWRfY29udGV4dFtpXSA9IGF2X21lbWR1cChzLCBzaXplb2YoTXBlZ0VuY0NvbnRleHQpKTsKKyAgICAgICAgICAgICAgICBpZiAoIXMtPnRocmVhZF9jb250ZXh0W2ldKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICAgICAgICAgIHMtPnRocmVhZF9jb250ZXh0W2ldLT5zdGFydF9tYl95ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tYl9oZWlnaHQgKiAoaSkgKyBuYl9zbGljZXMgLyAyKSAvIG5iX3NsaWNlczsKLSAgICAgICAgICAgICAgICAgICAgcy0+dGhyZWFkX2NvbnRleHRbaV0tPmVuZF9tYl95ICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1iX2hlaWdodCAqIChpICsgMSkgKyBuYl9zbGljZXMgLyAyKSAvIG5iX3NsaWNlczsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpbml0X2R1cGxpY2F0ZV9jb250ZXh0KHMpIDwgMCkKKyAgICAgICAgICAgIGlmIChpbml0X2R1cGxpY2F0ZV9jb250ZXh0KHMtPnRocmVhZF9jb250ZXh0W2ldKSA8IDApCiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgcy0+c3RhcnRfbWJfeSA9IDA7Ci0gICAgICAgICAgICBzLT5lbmRfbWJfeSAgID0gcy0+bWJfaGVpZ2h0OworICAgICAgICAgICAgcy0+dGhyZWFkX2NvbnRleHRbaV0tPnN0YXJ0X21iX3kgPQorICAgICAgICAgICAgICAgIChzLT5tYl9oZWlnaHQgKiAoaSkgKyBuYl9zbGljZXMgLyAyKSAvIG5iX3NsaWNlczsKKyAgICAgICAgICAgIHMtPnRocmVhZF9jb250ZXh0W2ldLT5lbmRfbWJfeSAgID0KKyAgICAgICAgICAgICAgICAocy0+bWJfaGVpZ2h0ICogKGkgKyAxKSArIG5iX3NsaWNlcyAvIDIpIC8gbmJfc2xpY2VzOwogICAgICAgICB9Ci0gICAgICAgIHMtPnNsaWNlX2NvbnRleHRfY291bnQgPSBuYl9zbGljZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGluaXRfZHVwbGljYXRlX2NvbnRleHQocykgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBzLT5zdGFydF9tYl95ID0gMDsKKyAgICAgICAgcy0+ZW5kX21iX3kgICA9IHMtPm1iX2hlaWdodDsKKyAgICB9CisgICAgcy0+c2xpY2VfY29udGV4dF9jb3VudCA9IG5iX3NsaWNlczsKIC8vICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTEwOTEsMTAgKzEwOTksMTAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBpbml0X2R1cGxpY2F0ZV9jb250ZXh0KHMtPnRocmVhZF9jb250ZXh0W2ldKSkgPCAwKQogICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICAgICAgICAgIHMtPnRocmVhZF9jb250ZXh0W2ldLT5zdGFydF9tYl95ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tYl9oZWlnaHQgKiAoaSkgKyBuYl9zbGljZXMgLyAyKSAvIG5iX3NsaWNlczsKLSAgICAgICAgICAgICAgICAgICAgcy0+dGhyZWFkX2NvbnRleHRbaV0tPmVuZF9tYl95ICAgPQotICAgICAgICAgICAgICAgICAgICAgICAgKHMtPm1iX2hlaWdodCAqIChpICsgMSkgKyBuYl9zbGljZXMgLyAyKSAvIG5iX3NsaWNlczsKKyAgICAgICAgICAgICAgICBzLT50aHJlYWRfY29udGV4dFtpXS0+c3RhcnRfbWJfeSA9CisgICAgICAgICAgICAgICAgICAgIChzLT5tYl9oZWlnaHQgKiAoaSkgKyBuYl9zbGljZXMgLyAyKSAvIG5iX3NsaWNlczsKKyAgICAgICAgICAgICAgICBzLT50aHJlYWRfY29udGV4dFtpXS0+ZW5kX21iX3kgICA9CisgICAgICAgICAgICAgICAgICAgIChzLT5tYl9oZWlnaHQgKiAoaSArIDEpICsgbmJfc2xpY2VzIC8gMikgLyBuYl9zbGljZXM7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlcnIgPSBpbml0X2R1cGxpY2F0ZV9jb250ZXh0KHMpOwpAQCAtMTIwNiw3ICsxMjE0LDcgQEAKICAgICB9CiAKICAgICAvKiByZWxlYXNlIGZvcmdvdHRlbiBwaWN0dXJlcyAqLwotICAgIC8qIGlmIChtcGVnMTI0L2gyNjMpICovCisgICAgLyogaWYgKE1QRUctMTI0IC8gSC4yNjMpICovCiAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QSUNUVVJFX0NPVU5UOyBpKyspIHsKICAgICAgICAgaWYgKCZzLT5waWN0dXJlW2ldICE9IHMtPmxhc3RfcGljdHVyZV9wdHIgJiYKICAgICAgICAgICAgICZzLT5waWN0dXJlW2ldICE9IHMtPm5leHRfcGljdHVyZV9wdHIgJiYKQEAgLTEyMTYsNiArMTIyNCw4IEBACiAgICAgfQogCiAgICAgZmZfbXBlZ191bnJlZl9waWN0dXJlKHMtPmF2Y3R4LCAmcy0+Y3VycmVudF9waWN0dXJlKTsKKyAgICBmZl9tcGVnX3VucmVmX3BpY3R1cmUocy0+YXZjdHgsICZzLT5sYXN0X3BpY3R1cmUpOworICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLT5hdmN0eCwgJnMtPm5leHRfcGljdHVyZSk7CiAKICAgICAvKiByZWxlYXNlIG5vbiByZWZlcmVuY2UgZnJhbWVzICovCiAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9QSUNUVVJFX0NPVU5UOyBpKyspIHsKQEAgLTEyMjQsNyArMTIzNCw3IEBACiAgICAgfQogCiAgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZV9wdHIgJiYgIXMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmJ1ZlswXSkgewotICAgICAgICAvLyB3ZSBhbHJlYWR5IGhhdmUgYSB1bnVzZWQgaW1hZ2UKKyAgICAgICAgLy8gd2UgYWxyZWFkeSBoYXZlIGFuIHVudXNlZCBpbWFnZQogICAgICAgICAvLyAobWF5YmUgaXQgd2FzIHNldCBiZWZvcmUgcmVhZGluZyB0aGUgaGVhZGVyKQogICAgICAgICBwaWMgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyOwogICAgIH0gZWxzZSB7CkBAIC0xMjgyLDggKzEyOTIsNyBAQAogICAgICAgICAgICAgcy0+cGljdF90eXBlLCBzLT5kcm9wcGFibGUpOwogCiAgICAgaWYgKCghcy0+bGFzdF9waWN0dXJlX3B0ciB8fCAhcy0+bGFzdF9waWN0dXJlX3B0ci0+Zi0+YnVmWzBdKSAmJgotICAgICAgICAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JIHx8Ci0gICAgICAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FKSkgeworICAgICAgICAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSkgewogICAgICAgICBpbnQgaF9jaHJvbWFfc2hpZnQsIHZfY2hyb21hX3NoaWZ0OwogICAgICAgICBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShzLT5hdmN0eC0+cGl4X2ZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhfY2hyb21hX3NoaWZ0LCAmdl9jaHJvbWFfc2hpZnQpOwpAQCAtMTI5Myw5ICsxMzAyLDYgQEAKICAgICAgICAgZWxzZSBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKQogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIndhcm5pbmc6IGZpcnN0IGZyYW1lIGlzIG5vIGtleWZyYW1lXG4iKTsKLSAgICAgICAgZWxzZSBpZiAocy0+cGljdHVyZV9zdHJ1Y3R1cmUgIT0gUElDVF9GUkFNRSkKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLAotICAgICAgICAgICAgICAgICAgICJhbGxvY2F0ZSBkdW1teSBsYXN0IHBpY3R1cmUgZm9yIGZpZWxkIGJhc2VkIGZpcnN0IGtleWZyYW1lXG4iKTsKIAogICAgICAgICAvKiBBbGxvY2F0ZSBhIGR1bW15IGZyYW1lICovCiAgICAgICAgIGkgPSBmZl9maW5kX3VudXNlZF9waWN0dXJlKHMtPmF2Y3R4LCBzLT5waWN0dXJlLCAwKTsKQEAgLTEzMTQsMTEgKzEzMjAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFhdmN0eC0+aHdhY2NlbAotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICAgICAgICAgICYmICEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMmQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUpCi0jZW5kaWYKLSAgICAgICAgICAgICkgeworICAgICAgICBpZiAoIWF2Y3R4LT5od2FjY2VsKSB7CiAgICAgICAgICAgICBmb3IoaT0wOyBpPGF2Y3R4LT5oZWlnaHQ7IGkrKykKICAgICAgICAgICAgICAgICBtZW1zZXQocy0+bGFzdF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSArIHMtPmxhc3RfcGljdHVyZV9wdHItPmYtPmxpbmVzaXplWzBdKmksCiAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsIGF2Y3R4LT53aWR0aCk7CkBAIC0xMzY3LDE0ICsxMzY5LDEyIEBACiAgICAgbWVtc2V0KHMtPm5leHRfcGljdHVyZS5mLT5kYXRhLCAwLCBzaXplb2Yocy0+bmV4dF9waWN0dXJlLmYtPmRhdGEpKTsKICNlbmRpZgogICAgIGlmIChzLT5sYXN0X3BpY3R1cmVfcHRyKSB7Ci0gICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLT5hdmN0eCwgJnMtPmxhc3RfcGljdHVyZSk7CiAgICAgICAgIGlmIChzLT5sYXN0X3BpY3R1cmVfcHRyLT5mLT5idWZbMF0gJiYKICAgICAgICAgICAgIChyZXQgPSBmZl9tcGVnX3JlZl9waWN0dXJlKHMtPmF2Y3R4LCAmcy0+bGFzdF9waWN0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9waWN0dXJlX3B0cikpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGlmIChzLT5uZXh0X3BpY3R1cmVfcHRyKSB7Ci0gICAgICAgIGZmX21wZWdfdW5yZWZfcGljdHVyZShzLT5hdmN0eCwgJnMtPm5leHRfcGljdHVyZSk7CiAgICAgICAgIGlmIChzLT5uZXh0X3BpY3R1cmVfcHRyLT5mLT5idWZbMF0gJiYKICAgICAgICAgICAgIChyZXQgPSBmZl9tcGVnX3JlZl9waWN0dXJlKHMtPmF2Y3R4LCAmcy0+bmV4dF9waWN0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmV4dF9waWN0dXJlX3B0cikpIDwgMCkKQEAgLTEzOTgsOCArMTM5OCw4IEBACiAgICAgfQogCiAgICAgLyogc2V0IGRlcXVhbnRpemVyLCB3ZSBjYW4ndCBkbyBpdCBkdXJpbmcgaW5pdCBhcwotICAgICAqIGl0IG1pZ2h0IGNoYW5nZSBmb3IgbXBlZzQgYW5kIHdlIGNhbid0IGRvIGl0IGluIHRoZSBoZWFkZXIKLSAgICAgKiBkZWNvZGUgYXMgaW5pdCBpcyBub3QgY2FsbGVkIGZvciBtcGVnNCB0aGVyZSB5ZXQgKi8KKyAgICAgKiBpdCBtaWdodCBjaGFuZ2UgZm9yIE1QRUctNCBhbmQgd2UgY2FuJ3QgZG8gaXQgaW4gdGhlIGhlYWRlcgorICAgICAqIGRlY29kZSBhcyBpbml0IGlzIG5vdCBjYWxsZWQgZm9yIE1QRUctNCB0aGVyZSB5ZXQgKi8KICAgICBpZiAocy0+bXBlZ19xdWFudCB8fCBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CiAgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2ludHJhID0gcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50cmE7CiAgICAgICAgIHMtPmRjdF91bnF1YW50aXplX2ludGVyID0gcy0+ZGN0X3VucXVhbnRpemVfbXBlZzJfaW50ZXI7CkBAIC0xNDI3LDUzNyArMTQyNyw2IEBACiAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPmN1cnJlbnRfcGljdHVyZV9wdHItPnRmLCBJTlRfTUFYLCAwKTsKIH0KIAotCi0jaWYgRkZfQVBJX1ZJU01WCi1zdGF0aWMgaW50IGNsaXBfbGluZShpbnQgKnN4LCBpbnQgKnN5LCBpbnQgKmV4LCBpbnQgKmV5LCBpbnQgbWF4eCkKLXsKLSAgICBpZigqc3ggPiAqZXgpCi0gICAgICAgIHJldHVybiBjbGlwX2xpbmUoZXgsIGV5LCBzeCwgc3ksIG1heHgpOwotCi0gICAgaWYgKCpzeCA8IDApIHsKLSAgICAgICAgaWYgKCpleCA8IDApCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgKnN5ID0gKmV5ICsgKCpzeSAtICpleSkgKiAoaW50NjRfdCkqZXggLyAoKmV4IC0gKnN4KTsKLSAgICAgICAgKnN4ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoKmV4ID4gbWF4eCkgewotICAgICAgICBpZiAoKnN4ID4gbWF4eCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAqZXkgPSAqc3kgKyAoKmV5IC0gKnN5KSAqIChpbnQ2NF90KShtYXh4IC0gKnN4KSAvICgqZXggLSAqc3gpOwotICAgICAgICAqZXggPSBtYXh4OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotCi0vKioKLSAqIERyYXcgYSBsaW5lIGZyb20gKGV4LCBleSkgLT4gKHN4LCBzeSkuCi0gKiBAcGFyYW0gdyB3aWR0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBoIGhlaWdodCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBzdHJpZGUgc3RyaWRlL2xpbmVzaXplIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGNvbG9yIGNvbG9yIG9mIHRoZSBhcnJvdwotICovCi1zdGF0aWMgdm9pZCBkcmF3X2xpbmUodWludDhfdCAqYnVmLCBpbnQgc3gsIGludCBzeSwgaW50IGV4LCBpbnQgZXksCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLCBpbnQgY29sb3IpCi17Ci0gICAgaW50IHgsIHksIGZyLCBmOwotCi0gICAgaWYgKGNsaXBfbGluZSgmc3gsICZzeSwgJmV4LCAmZXksIHcgLSAxKSkKLSAgICAgICAgcmV0dXJuOwotICAgIGlmIChjbGlwX2xpbmUoJnN5LCAmc3gsICZleSwgJmV4LCBoIC0gMSkpCi0gICAgICAgIHJldHVybjsKLQotICAgIHN4ID0gYXZfY2xpcChzeCwgMCwgdyAtIDEpOwotICAgIHN5ID0gYXZfY2xpcChzeSwgMCwgaCAtIDEpOwotICAgIGV4ID0gYXZfY2xpcChleCwgMCwgdyAtIDEpOwotICAgIGV5ID0gYXZfY2xpcChleSwgMCwgaCAtIDEpOwotCi0gICAgYnVmW3N5ICogc3RyaWRlICsgc3hdICs9IGNvbG9yOwotCi0gICAgaWYgKEZGQUJTKGV4IC0gc3gpID4gRkZBQlMoZXkgLSBzeSkpIHsKLSAgICAgICAgaWYgKHN4ID4gZXgpIHsKLSAgICAgICAgICAgIEZGU1dBUChpbnQsIHN4LCBleCk7Ci0gICAgICAgICAgICBGRlNXQVAoaW50LCBzeSwgZXkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZiArPSBzeCArIHN5ICogc3RyaWRlOwotICAgICAgICBleCAgLT0gc3g7Ci0gICAgICAgIGYgICAgPSAoKGV5IC0gc3kpIDw8IDE2KSAvIGV4OwotICAgICAgICBmb3IgKHggPSAwOyB4IDw9IGV4OyB4KyspIHsKLSAgICAgICAgICAgIHkgID0gKHggKiBmKSA+PiAxNjsKLSAgICAgICAgICAgIGZyID0gKHggKiBmKSAmIDB4RkZGRjsKLSAgICAgICAgICAgIGJ1Zlt5ICogc3RyaWRlICsgeF0gICAgICAgKz0gKGNvbG9yICogKDB4MTAwMDAgLSBmcikpID4+IDE2OwotICAgICAgICAgICAgaWYoZnIpIGJ1ZlsoeSArIDEpICogc3RyaWRlICsgeF0gKz0gKGNvbG9yICogICAgICAgICAgICBmciApID4+IDE2OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHN5ID4gZXkpIHsKLSAgICAgICAgICAgIEZGU1dBUChpbnQsIHN4LCBleCk7Ci0gICAgICAgICAgICBGRlNXQVAoaW50LCBzeSwgZXkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZiArPSBzeCArIHN5ICogc3RyaWRlOwotICAgICAgICBleSAgLT0gc3k7Ci0gICAgICAgIGlmIChleSkKLSAgICAgICAgICAgIGYgPSAoKGV4IC0gc3gpIDw8IDE2KSAvIGV5OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmID0gMDsKLSAgICAgICAgZm9yKHk9IDA7IHkgPD0gZXk7IHkrKyl7Ci0gICAgICAgICAgICB4ICA9ICh5KmYpID4+IDE2OwotICAgICAgICAgICAgZnIgPSAoeSpmKSAmIDB4RkZGRjsKLSAgICAgICAgICAgIGJ1Zlt5ICogc3RyaWRlICsgeF0gICAgICs9IChjb2xvciAqICgweDEwMDAwIC0gZnIpKSA+PiAxNjsKLSAgICAgICAgICAgIGlmKGZyKSBidWZbeSAqIHN0cmlkZSArIHggKyAxXSArPSAoY29sb3IgKiAgICAgICAgICAgIGZyICkgPj4gMTY7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qKgotICogRHJhdyBhbiBhcnJvdyBmcm9tIChleCwgZXkpIC0+IChzeCwgc3kpLgotICogQHBhcmFtIHcgd2lkdGggb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gaCBoZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gc3RyaWRlIHN0cmlkZS9saW5lc2l6ZSBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBjb2xvciBjb2xvciBvZiB0aGUgYXJyb3cKLSAqLwotc3RhdGljIHZvaWQgZHJhd19hcnJvdyh1aW50OF90ICpidWYsIGludCBzeCwgaW50IHN5LCBpbnQgZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBleSwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlLCBpbnQgY29sb3IsIGludCB0YWlsLCBpbnQgZGlyZWN0aW9uKQotewotICAgIGludCBkeCxkeTsKLQotICAgIGlmIChkaXJlY3Rpb24pIHsKLSAgICAgICAgRkZTV0FQKGludCwgc3gsIGV4KTsKLSAgICAgICAgRkZTV0FQKGludCwgc3ksIGV5KTsKLSAgICB9Ci0KLSAgICBzeCA9IGF2X2NsaXAoc3gsIC0xMDAsIHcgKyAxMDApOwotICAgIHN5ID0gYXZfY2xpcChzeSwgLTEwMCwgaCArIDEwMCk7Ci0gICAgZXggPSBhdl9jbGlwKGV4LCAtMTAwLCB3ICsgMTAwKTsKLSAgICBleSA9IGF2X2NsaXAoZXksIC0xMDAsIGggKyAxMDApOwotCi0gICAgZHggPSBleCAtIHN4OwotICAgIGR5ID0gZXkgLSBzeTsKLQotICAgIGlmIChkeCAqIGR4ICsgZHkgKiBkeSA+IDMgKiAzKSB7Ci0gICAgICAgIGludCByeCA9ICBkeCArIGR5OwotICAgICAgICBpbnQgcnkgPSAtZHggKyBkeTsKLSAgICAgICAgaW50IGxlbmd0aCA9IGZmX3NxcnQoKHJ4ICogcnggKyByeSAqIHJ5KSA8PCA4KTsKLQotICAgICAgICAvLyBGSVhNRSBzdWJwaXhlbCBhY2N1cmFjeQotICAgICAgICByeCA9IFJPVU5ERURfRElWKHJ4ICogMyA8PCA0LCBsZW5ndGgpOwotICAgICAgICByeSA9IFJPVU5ERURfRElWKHJ5ICogMyA8PCA0LCBsZW5ndGgpOwotCi0gICAgICAgIGlmICh0YWlsKSB7Ci0gICAgICAgICAgICByeCA9IC1yeDsKLSAgICAgICAgICAgIHJ5ID0gLXJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBzeCArIHJ4LCBzeSArIHJ5LCB3LCBoLCBzdHJpZGUsIGNvbG9yKTsKLSAgICAgICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBzeCAtIHJ5LCBzeSArIHJ4LCB3LCBoLCBzdHJpZGUsIGNvbG9yKTsKLSAgICB9Ci0gICAgZHJhd19saW5lKGJ1Ziwgc3gsIHN5LCBleCwgZXksIHcsIGgsIHN0cmlkZSwgY29sb3IpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgYWRkX21iKEFWTW90aW9uVmVjdG9yICptYiwgdWludDMyX3QgbWJfdHlwZSwKLSAgICAgICAgICAgICAgICAgIGludCBkc3RfeCwgaW50IGRzdF95LAotICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3ksIGludCBtb3Rpb25fc2NhbGUsCi0gICAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKQotewotICAgIG1iLT53ID0gSVNfOFg4KG1iX3R5cGUpIHx8IElTXzhYMTYobWJfdHlwZSkgPyA4IDogMTY7Ci0gICAgbWItPmggPSBJU184WDgobWJfdHlwZSkgfHwgSVNfMTZYOChtYl90eXBlKSA/IDggOiAxNjsKLSAgICBtYi0+bW90aW9uX3ggPSBtb3Rpb25feDsKLSAgICBtYi0+bW90aW9uX3kgPSBtb3Rpb25feTsKLSAgICBtYi0+bW90aW9uX3NjYWxlID0gbW90aW9uX3NjYWxlOwotICAgIG1iLT5kc3RfeCA9IGRzdF94OwotICAgIG1iLT5kc3RfeSA9IGRzdF95OwotICAgIG1iLT5zcmNfeCA9IGRzdF94ICsgbW90aW9uX3ggLyBtb3Rpb25fc2NhbGU7Ci0gICAgbWItPnNyY195ID0gZHN0X3kgKyBtb3Rpb25feSAvIG1vdGlvbl9zY2FsZTsKLSAgICBtYi0+c291cmNlID0gZGlyZWN0aW9uID8gMSA6IC0xOwotICAgIG1iLT5mbGFncyA9IDA7IC8vIFhYWDogZG9lcyBtYl90eXBlIGNvbnRhaW4gZXh0cmEgaW5mb3JtYXRpb24gdGhhdCBjb3VsZCBiZSBleHBvcnRlZCBoZXJlPwotICAgIHJldHVybiAxOwotfQotCi0vKioKLSAqIFByaW50IGRlYnVnZ2luZyBpbmZvIGZvciB0aGUgZ2l2ZW4gcGljdHVyZS4KLSAqLwotdm9pZCBmZl9wcmludF9kZWJ1Z19pbmZvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpY3QsIHVpbnQ4X3QgKm1ic2tpcF90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbWJ0eXBlX3RhYmxlLCBpbnQ4X3QgKnFzY2FsZV90YWJsZSwgaW50MTZfdCAoKm1vdGlvbl92YWxbMl0pWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbG93X2RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl93aWR0aCwgaW50IG1iX2hlaWdodCwgaW50IG1iX3N0cmlkZSwgaW50IHF1YXJ0ZXJfc2FtcGxlKQotewotICAgIGlmICgoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX0VYUE9SVF9NVlMpICYmIG1idHlwZV90YWJsZSAmJiBtb3Rpb25fdmFsWzBdKSB7Ci0gICAgICAgIGNvbnN0IGludCBzaGlmdCA9IDEgKyBxdWFydGVyX3NhbXBsZTsKLSAgICAgICAgY29uc3QgaW50IHNjYWxlID0gMSA8PCBzaGlmdDsKLSAgICAgICAgY29uc3QgaW50IG12X3NhbXBsZV9sb2cyID0gYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NWUTMgPyAyIDogMTsKLSAgICAgICAgY29uc3QgaW50IG12X3N0cmlkZSAgICAgID0gKG1iX3dpZHRoIDw8IG12X3NhbXBsZV9sb2cyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0gyNjQgPyAwIDogMSk7Ci0gICAgICAgIGludCBtYl94LCBtYl95LCBtYmNvdW50ID0gMDsKLQotICAgICAgICAvKiBzaXplIGlzIHdpZHRoICogaGVpZ2h0ICogMiAqIDQgd2hlcmUgMiBpcyBmb3IgZGlyZWN0aW9ucyBhbmQgNCBpcwotICAgICAgICAgKiBmb3IgdGhlIG1heGltdW0gbnVtYmVyIG9mIE1CICg0IE1CIGluIGNhc2Ugb2YgSVNfOHg4KSAqLwotICAgICAgICBBVk1vdGlvblZlY3RvciAqbXZzID0gYXZfbWFsbG9jX2FycmF5KG1iX3dpZHRoICogbWJfaGVpZ2h0LCAyICogNCAqIHNpemVvZihBVk1vdGlvblZlY3RvcikpOwotICAgICAgICBpZiAoIW12cykKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgbWJfaGVpZ2h0OyBtYl95KyspIHsKLSAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBtYl93aWR0aDsgbWJfeCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGksIGRpcmVjdGlvbiwgbWJfdHlwZSA9IG1idHlwZV90YWJsZVttYl94ICsgbWJfeSAqIG1iX3N0cmlkZV07Ci0gICAgICAgICAgICAgICAgZm9yIChkaXJlY3Rpb24gPSAwOyBkaXJlY3Rpb24gPCAyOyBkaXJlY3Rpb24rKykgewotICAgICAgICAgICAgICAgICAgICBpZiAoIVVTRVNfTElTVChtYl90eXBlLCBkaXJlY3Rpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJU184WDgobWJfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA0ICsgOCAqIChpICYgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5ID0gbWJfeSAqIDE2ICsgNCArIDggKiAoaSA+PiAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCAqIDIgKyAoaSAmIDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX3kgKiAyICsgKGkgPj4gMSkpICogbXZfc3RyaWRlKSA8PCAobXZfc2FtcGxlX2xvZzIgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXggPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJjb3VudCArPSBhZGRfbWIobXZzICsgbWJjb3VudCwgbWJfdHlwZSwgc3gsIHN5LCBteCwgbXksIHNjYWxlLCBkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTXzE2WDgobWJfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeSA9IG1iX3kgKiAxNiArIDQgKyA4ICogaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCAqIDIgKyAobWJfeSAqIDIgKyBpKSAqIG12X3N0cmlkZSkgPDwgKG12X3NhbXBsZV9sb2cyIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14ID0gbW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXkgPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX0lOVEVSTEFDRUQobWJfdHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICo9IDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmNvdW50ICs9IGFkZF9tYihtdnMgKyBtYmNvdW50LCBtYl90eXBlLCBzeCwgc3ksIG14LCBteSwgc2NhbGUsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfOFgxNihtYl90eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeCA9IG1iX3ggKiAxNiArIDQgKyA4ICogaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eSA9IChtYl94ICogMiArIGkgKyBtYl95ICogMiAqIG12X3N0cmlkZSkgPDwgKG12X3NhbXBsZV9sb2cyIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14ID0gbW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXkgPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElTX0lOVEVSTEFDRUQobWJfdHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICo9IDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYmNvdW50ICs9IGFkZF9tYihtdnMgKyBtYmNvdW50LCBtYl90eXBlLCBzeCwgc3ksIG14LCBteSwgc2NhbGUsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeCA9IG1iX3ggKiAxNiArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeSA9IG1iX3kgKiAxNiArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eSA9IChtYl94ICsgbWJfeSAqIG12X3N0cmlkZSkgPDwgbXZfc2FtcGxlX2xvZzI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCA9IG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIG1iY291bnQgKz0gYWRkX21iKG12cyArIG1iY291bnQsIG1iX3R5cGUsIHN4LCBzeSwgbXgsIG15LCBzY2FsZSwgZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtYmNvdW50KSB7Ci0gICAgICAgICAgICBBVkZyYW1lU2lkZURhdGEgKnNkOwotCi0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkFkZGluZyAlZCBNVnMgaW5mbyB0byBmcmFtZSAlZFxuIiwgbWJjb3VudCwgYXZjdHgtPmZyYW1lX251bWJlcik7Ci0gICAgICAgICAgICBzZCA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEocGljdCwgQVZfRlJBTUVfREFUQV9NT1RJT05fVkVDVE9SUywgbWJjb3VudCAqIHNpemVvZihBVk1vdGlvblZlY3RvcikpOwotICAgICAgICAgICAgaWYgKCFzZCkgewotICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZtdnMpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZC0+ZGF0YSwgbXZzLCBtYmNvdW50ICogc2l6ZW9mKEFWTW90aW9uVmVjdG9yKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9mcmVlcCgmbXZzKTsKLSAgICB9Ci0KLSAgICAvKiBUT0RPOiBleHBvcnQgYWxsIHRoZSBmb2xsb3dpbmcgdG8gbWFrZSB0aGVtIGFjY2Vzc2libGUgZm9yIHVzZXJzIChhbmQgZmlsdGVycykgKi8KLSAgICBpZiAoYXZjdHgtPmh3YWNjZWwgfHwgIW1idHlwZV90YWJsZQotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICAgICAgfHwgKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzJkFWX0NPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVKQotI2VuZGlmCi0gICAgICAgICkKLSAgICAgICAgcmV0dXJuOwotCi0KLSAgICBpZiAoYXZjdHgtPmRlYnVnICYgKEZGX0RFQlVHX1NLSVAgfCBGRl9ERUJVR19RUCB8IEZGX0RFQlVHX01CX1RZUEUpKSB7Ci0gICAgICAgIGludCB4LHk7Ci0KLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJOZXcgZnJhbWUsIHR5cGU6ICVjXG4iLAotICAgICAgICAgICAgICAgYXZfZ2V0X3BpY3R1cmVfdHlwZV9jaGFyKHBpY3QtPnBpY3RfdHlwZSkpOwotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgbWJfaGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBtYl93aWR0aDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1NLSVApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbWJza2lwX3RhYmxlID8gbWJza2lwX3RhYmxlW3ggKyB5ICogbWJfc3RyaWRlXSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA+IDkpCi0gICAgICAgICAgICAgICAgICAgICAgICBjb3VudCA9IDk7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiJTFkIiwgY291bnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUVApIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIlMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcXNjYWxlX3RhYmxlW3ggKyB5ICogbWJfc3RyaWRlXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19NQl9UWVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlID0gbWJ0eXBlX3RhYmxlW3ggKyB5ICogbWJfc3RyaWRlXTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVHlwZSAmIE1WIGRpcmVjdGlvbgotICAgICAgICAgICAgICAgICAgICBpZiAoSVNfUENNKG1iX3R5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJQIik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX0lOVFJBKG1iX3R5cGUpICYmIElTX0FDUFJFRChtYl90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiQSIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19JTlRSQTR4NChtYl90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiaSIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19JTlRSQTE2eDE2KG1iX3R5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJJIik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX0RJUkVDVChtYl90eXBlKSAmJiBJU19TS0lQKG1iX3R5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJkIik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTX0RJUkVDVChtYl90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRCIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19HTUMobWJfdHlwZSkgJiYgSVNfU0tJUChtYl90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiZyIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU19HTUMobWJfdHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkciKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfU0tJUChtYl90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUyIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghVVNFU19MSVNUKG1iX3R5cGUsIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICI+Iik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFVU0VTX0xJU1QobWJfdHlwZSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIjwiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKFVTRVNfTElTVChtYl90eXBlLCAwKSAmJiBVU0VTX0xJU1QobWJfdHlwZSwgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJYIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBzZWdtZW50YXRpb24KLSAgICAgICAgICAgICAgICAgICAgaWYgKElTXzhYOChtYl90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiKyIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChJU18xNlg4KG1iX3R5cGUpKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICItIik7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKElTXzhYMTYobWJfdHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInwiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoSVNfSU5UUkEobWJfdHlwZSkgfHwgSVNfMTZYMTYobWJfdHlwZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAiKTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICI/Iik7Ci0KLQotICAgICAgICAgICAgICAgICAgICBpZiAoSVNfSU5URVJMQUNFRChtYl90eXBlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiPSIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKGF2Y3R4LT5kZWJ1ZyAmIChGRl9ERUJVR19WSVNfUVAgfCBGRl9ERUJVR19WSVNfTUJfVFlQRSkpIHx8Ci0gICAgICAgIChhdmN0eC0+ZGVidWdfbXYpKSB7Ci0gICAgICAgIGludCBtYl95OwotICAgICAgICBpbnQgaTsKLSAgICAgICAgaW50IGhfY2hyb21hX3NoaWZ0LCB2X2Nocm9tYV9zaGlmdCwgYmxvY2tfaGVpZ2h0OwotI2lmIEZGX0FQSV9WSVNNVgotICAgICAgICBjb25zdCBpbnQgc2hpZnQgPSAxICsgcXVhcnRlcl9zYW1wbGU7Ci0gICAgICAgIHVpbnQ4X3QgKnB0cjsKLSAgICAgICAgY29uc3QgaW50IHdpZHRoICAgICAgICAgID0gYXZjdHgtPndpZHRoOwotICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ICAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OwotI2VuZGlmCi0gICAgICAgIGNvbnN0IGludCBtdl9zYW1wbGVfbG9nMiA9IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlEzID8gMiA6IDE7Ci0gICAgICAgIGNvbnN0IGludCBtdl9zdHJpZGUgICAgICA9IChtYl93aWR0aCA8PCBtdl9zYW1wbGVfbG9nMikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ID8gMCA6IDEpOwotCi0gICAgICAgICpsb3dfZGVsYXkgPSAwOyAvLyBuZWVkZWQgdG8gc2VlIHRoZSB2ZWN0b3JzIHdpdGhvdXQgdHJhc2hpbmcgdGhlIGJ1ZmZlcnMKLQotICAgICAgICBhdmNvZGVjX2dldF9jaHJvbWFfc3ViX3NhbXBsZShhdmN0eC0+cGl4X2ZtdCwgJmhfY2hyb21hX3NoaWZ0LCAmdl9jaHJvbWFfc2hpZnQpOwotCi0gICAgICAgIGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUocGljdCk7Ci0KLSAgICAgICAgcGljdC0+b3BhcXVlID0gTlVMTDsKLSNpZiBGRl9BUElfVklTTVYKLSAgICAgICAgcHRyICAgICAgICAgID0gcGljdC0+ZGF0YVswXTsKLSNlbmRpZgotICAgICAgICBibG9ja19oZWlnaHQgPSAxNiA+PiB2X2Nocm9tYV9zaGlmdDsKLQotICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgbWJfaGVpZ2h0OyBtYl95KyspIHsKLSAgICAgICAgICAgIGludCBtYl94OwotICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IG1iX3dpZHRoOyBtYl94KyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWJfaW5kZXggPSBtYl94ICsgbWJfeSAqIG1iX3N0cmlkZTsKLSNpZiBGRl9BUElfVklTTVYKLSAgICAgICAgICAgICAgICBpZiAoKGF2Y3R4LT5kZWJ1Z19tdikgJiYgbW90aW9uX3ZhbFswXSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yICh0eXBlID0gMDsgdHlwZSA8IDM7IHR5cGUrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCEoYXZjdHgtPmRlYnVnX212ICYgRkZfREVCVUdfVklTX01WX1BfRk9SKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBpY3QtPnBpY3RfdHlwZSE9IEFWX1BJQ1RVUkVfVFlQRV9QKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCEoYXZjdHgtPmRlYnVnX212ICYgRkZfREVCVUdfVklTX01WX0JfRk9SKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBpY3QtPnBpY3RfdHlwZSE9IEFWX1BJQ1RVUkVfVFlQRV9CKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCEoYXZjdHgtPmRlYnVnX212ICYgRkZfREVCVUdfVklTX01WX0JfQkFDSykpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwaWN0LT5waWN0X3R5cGUhPSBBVl9QSUNUVVJFX1RZUEVfQikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVVTRVNfTElTVChtYnR5cGVfdGFibGVbbWJfaW5kZXhdLCBkaXJlY3Rpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfOFg4KG1idHlwZV90YWJsZVttYl9pbmRleF0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ggPSBtYl94ICogMTYgKyA0ICsgOCAqIChpICYgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeSA9IG1iX3kgKiAxNiArIDQgKyA4ICogKGkgPj4gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eSA9IChtYl94ICogMiArIChpICYgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1iX3kgKiAyICsgKGkgPj4gMSkpICogbXZfc3RyaWRlKSA8PCAobXZfc2FtcGxlX2xvZzIgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14ID0gKG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF0gPj4gc2hpZnQpICsgc3g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IChtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdID4+IHNoaWZ0KSArIHN5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2Fycm93KHB0ciwgc3gsIHN5LCBteCwgbXksIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcGljdC0+bGluZXNpemVbMF0sIDEwMCwgMCwgZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTXzE2WDgobWJ0eXBlX3RhYmxlW21iX2luZGV4XSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeCA9IG1iX3ggKiAxNiArIDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeSA9IG1iX3kgKiAxNiArIDQgKyA4ICogaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHh5ID0gKG1iX3ggKiAyICsgKG1iX3kgKiAyICsgaSkgKiBtdl9zdHJpZGUpIDw8IChtdl9zYW1wbGVfbG9nMiAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXggPSAobW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVswXSA+PiBzaGlmdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteSA9IChtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdID4+IHNoaWZ0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSVNfSU5URVJMQUNFRChtYnR5cGVfdGFibGVbbWJfaW5kZXhdKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICo9IDI7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19hcnJvdyhwdHIsIHN4LCBzeSwgbXggKyBzeCwgbXkgKyBzeSwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwaWN0LT5saW5lc2l6ZVswXSwgMTAwLCAwLCBkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfOFgxNihtYnR5cGVfdGFibGVbbWJfaW5kZXhdKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN4ID0gbWJfeCAqIDE2ICsgNCArIDggKiBpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3kgPSBtYl95ICogMTYgKyA4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHkgPSAobWJfeCAqIDIgKyBpICsgbWJfeSAqIDIgKiBtdl9zdHJpZGUpIDw8IChtdl9zYW1wbGVfbG9nMiAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXggPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzBdID4+IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXkgPSBtb3Rpb25fdmFsW2RpcmVjdGlvbl1beHldWzFdID4+IHNoaWZ0OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJU19JTlRFUkxBQ0VEKG1idHlwZV90YWJsZVttYl9pbmRleF0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgKj0gMjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2Fycm93KHB0ciwgc3gsIHN5LCBteCArIHN4LCBteSArIHN5LCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsIHBpY3QtPmxpbmVzaXplWzBdLCAxMDAsIDAsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeD0gbWJfeCAqIDE2ICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzeT0gbWJfeSAqIDE2ICsgODsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eT0gKG1iX3ggKyBtYl95ICogbXZfc3RyaWRlKSA8PCBtdl9zYW1wbGVfbG9nMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteD0gKG1vdGlvbl92YWxbZGlyZWN0aW9uXVt4eV1bMF0+PnNoaWZ0KSArIHN4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG15PSAobW90aW9uX3ZhbFtkaXJlY3Rpb25dW3h5XVsxXT4+c2hpZnQpICsgc3k7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2Fycm93KHB0ciwgc3gsIHN5LCBteCwgbXksIHdpZHRoLCBoZWlnaHQsIHBpY3QtPmxpbmVzaXplWzBdLCAxMDAsIDAsIGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBpZiAoKGF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1ZJU19RUCkpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYyA9IChxc2NhbGVfdGFibGVbbWJfaW5kZXhdICogMTI4IC8gMzEpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMTAxMDEwMTAxMDEwMVVMTDsKLSAgICAgICAgICAgICAgICAgICAgaW50IHk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBibG9ja19oZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50NjRfdCAqKShwaWN0LT5kYXRhWzFdICsgOCAqIG1iX3ggKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmxvY2tfaGVpZ2h0ICogbWJfeSArIHkpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+bGluZXNpemVbMV0pID0gYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVsyXSArIDggKiBtYl94ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrX2hlaWdodCAqIG1iX3kgKyB5KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmxpbmVzaXplWzJdKSA9IGM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19WSVNfTUJfVFlQRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgbW90aW9uX3ZhbFswXSkgewotICAgICAgICAgICAgICAgICAgICBpbnQgbWJfdHlwZSA9IG1idHlwZV90YWJsZVttYl9pbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHUsdjsKLSAgICAgICAgICAgICAgICAgICAgaW50IHk7Ci0jZGVmaW5lIENPTE9SKHRoZXRhLCByKSBcCi0gICAgdSA9IChpbnQpKDEyOCArIHIgKiBjb3ModGhldGEgKiBNX1BJIC8gMTgwKSk7IFwKLSAgICB2ID0gKGludCkoMTI4ICsgciAqIHNpbih0aGV0YSAqIE1fUEkgLyAxODApKTsKLQotCi0gICAgICAgICAgICAgICAgICAgIHUgPSB2ID0gMTI4OwotICAgICAgICAgICAgICAgICAgICBpZiAoSVNfUENNKG1iX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigxMjAsIDQ4KQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChJU19JTlRSQShtYl90eXBlKSAmJiBJU19BQ1BSRUQobWJfdHlwZSkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfSU5UUkExNngxNihtYl90eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1IoMzAsIDQ4KQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTX0lOVFJBNHg0KG1iX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT0xPUig5MCwgNDgpCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfRElSRUNUKG1iX3R5cGUpICYmIElTX1NLSVAobWJfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIENPTE9SKDEyMCwgNDgpCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSVNfRElSRUNUKG1iX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigxNTAsIDQ4KQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTX0dNQyhtYl90eXBlKSAmJiBJU19TS0lQKG1iX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDT0xPUigxNzAsIDQ4KQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKElTX0dNQyhtYl90eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1IoMTkwLCA0OCkKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChJU19TS0lQKG1iX3R5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDT0xPUigxODAsIDQ4KQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFVU0VTX0xJU1QobWJfdHlwZSwgMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SKDI0MCwgNDgpCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIVVTRVNfTElTVChtYl90eXBlLCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1IoMCwgNDgpCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKFVTRVNfTElTVChtYl90eXBlLCAwKSAmJiBVU0VTX0xJU1QobWJfdHlwZSwgMSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1IoMzAwLDQ4KQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdSAqPSAweDAxMDEwMTAxMDEwMTAxMDFVTEw7Ci0gICAgICAgICAgICAgICAgICAgIHYgKj0gMHgwMTAxMDEwMTAxMDEwMTAxVUxMOwotICAgICAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYmxvY2tfaGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikocGljdC0+ZGF0YVsxXSArIDggKiBtYl94ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NrX2hlaWdodCAqIG1iX3kgKyB5KSAqIHBpY3QtPmxpbmVzaXplWzFdKSA9IHU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQ2NF90ICopKHBpY3QtPmRhdGFbMl0gKyA4ICogbWJfeCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibG9ja19oZWlnaHQgKiBtYl95ICsgeSkgKiBwaWN0LT5saW5lc2l6ZVsyXSkgPSB2OwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gc2VnbWVudGF0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChJU184WDgobWJfdHlwZSkgfHwgSVNfMTZYOChtYl90eXBlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50NjRfdCAqKShwaWN0LT5kYXRhWzBdICsgMTYgKiBtYl94ICsgMCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxNiAqIG1iX3kgKyA4KSAqIHBpY3QtPmxpbmVzaXplWzBdKSBePSAweDgwODA4MDgwODA4MDgwODBVTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQ2NF90ICopKHBpY3QtPmRhdGFbMF0gKyAxNiAqIG1iX3ggKyA4ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE2ICogbWJfeSArIDgpICogcGljdC0+bGluZXNpemVbMF0pIF49IDB4ODA4MDgwODA4MDgwODA4MFVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoSVNfOFg4KG1iX3R5cGUpIHx8IElTXzhYMTYobWJfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgeSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmRhdGFbMF1bMTYgKiBtYl94ICsgOCArICgxNiAqIG1iX3kgKyB5KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5saW5lc2l6ZVswXV0gXj0gMHg4MDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoSVNfOFg4KG1iX3R5cGUpICYmIG12X3NhbXBsZV9sb2cyID49IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkbSA9IDEgPDwgKG12X3NhbXBsZV9sb2cyIC0gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN4ID0gbWJfeCAqIDE2ICsgOCAqIChpICYgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN5ID0gbWJfeSAqIDE2ICsgOCAqIChpID4+IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4eSA9IChtYl94ICogMiArIChpICYgMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYl95ICogMiArIChpID4+IDEpKSAqIG12X3N0cmlkZSkgPDwgKG12X3NhbXBsZV9sb2cyIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgYmlkaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICptdiA9IChpbnQzMl90ICopICZtb3Rpb25fdmFsWzBdW3h5XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXZbMF0gIT0gbXZbZG1dIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG12W2RtICogbXZfc3RyaWRlXSAhPSBtdltkbSAqIChtdl9zdHJpZGUgKyAxKV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5kYXRhWzBdW3N4ICsgNCArIChzeSArIHkpICogcGljdC0+bGluZXNpemVbMF1dIF49IDB4ODA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG12WzBdICE9IG12W2RtICogbXZfc3RyaWRlXSB8fCBtdltkbV0gIT0gbXZbZG0gKiAobXZfc3RyaWRlICsgMSldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHVpbnQ2NF90ICopKHBpY3QtPmRhdGFbMF0gKyBzeCArIChzeSArIDQpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0LT5saW5lc2l6ZVswXSkgXj0gMHg4MDgwODA4MDgwODA4MDgwVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKElTX0lOVEVSTEFDRUQobWJfdHlwZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaG1tCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1ic2tpcF90YWJsZSkKLSAgICAgICAgICAgICAgICAgICAgbWJza2lwX3RhYmxlW21iX2luZGV4XSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHZvaWQgZmZfcHJpbnRfZGVidWdfaW5mbyhNcGVnRW5jQ29udGV4dCAqcywgUGljdHVyZSAqcCwgQVZGcmFtZSAqcGljdCkKIHsKICAgICBmZl9wcmludF9kZWJ1Z19pbmZvMihzLT5hdmN0eCwgcGljdCwgcy0+bWJza2lwX3RhYmxlLCBwLT5tYl90eXBlLApAQCAtMjExNiw3ICsxNTg1LDkgQEAKICAgICAgICAgcHRyX3kgPSBzLT5zYy5lZGdlX2VtdV9idWZmZXI7CiAgICAgICAgIGlmICghQ09ORklHX0dSQVkgfHwgIShzLT5hdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dSQVkpKSB7CiAgICAgICAgICAgICB1aW50OF90ICp1YnVmID0gcy0+c2MuZWRnZV9lbXVfYnVmZmVyICsgMTggKiBzLT5saW5lc2l6ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnZidWYgPXVidWYgKyA5ICogcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZidWYgPXVidWYgKyAxMCAqIHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICBpZiAocy0+d29ya2Fyb3VuZF9idWdzICYgRkZfQlVHX0lFREdFKQorICAgICAgICAgICAgICAgIHZidWYgLT0gcy0+dXZsaW5lc2l6ZTsKICAgICAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh1YnVmLCAgcHRyX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUgPj4gZmllbGRfYmFzZWQsIHV2bGluZXNpemUgPj4gZmllbGRfYmFzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgOSArIGZpZWxkX2Jhc2VkLApAQCAtMjQ2OSw3ICsxOTQwLDcgQEAKICAgIHMtPmludGVybGFjZWRfZGN0IDogdHJ1ZSBpZiBpbnRlcmxhY2VkIGRjdCB1c2VkIChtcGVnMikKICAqLwogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKLXZvaWQgbXB2X2RlY29kZV9tYl9pbnRlcm5hbChNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1sxMl1bNjRdLAordm9pZCBtcHZfcmVjb25zdHJ1Y3RfbWJfaW50ZXJuYWwoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbMTJdWzY0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93cmVzX2ZsYWcsIGludCBpc19tcGVnMTIpCiB7CiAgICAgY29uc3QgaW50IG1iX3h5ID0gcy0+bWJfeSAqIHMtPm1iX3N0cmlkZSArIHMtPm1iX3g7CkBAIC0yNjU3LDggKzIxMjgsMzEgQEAKICAgICAgICAgICAgICAgICBmZl93bXYyX2FkZF9tYihzLCBibG9jaywgZGVzdF95LCBkZXN0X2NiLCBkZXN0X2NyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIE9ubHkgTVBFRy00IFNpbXBsZSBTdHVkaW8gUHJvZmlsZSBpcyBzdXBwb3J0ZWQgaW4gPiA4LWJpdCBtb2RlLgorICAgICAgICAgICAgICAgVE9ETzogSW50ZWdyYXRlIDEwLWJpdCBwcm9wZXJseSBpbnRvIG1wZWd2aWRlby5jIHNvIHRoYXQgRVIgd29ya3MgcHJvcGVybHkgKi8KKyAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDgpeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBhY3RfYmxvY2tfc2l6ZSA9IGJsb2NrX3NpemUgKiAyOworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF95LCAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSwgKGludDE2X3QqKSgqcy0+YmxvY2szMilbMF0pOworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF95ICAgICAgICAgICAgICArIGFjdF9ibG9ja19zaXplLCBkY3RfbGluZXNpemUsIChpbnQxNl90KikoKnMtPmJsb2NrMzIpWzFdKTsKKyAgICAgICAgICAgICAgICBzLT5pZHNwLmlkY3RfcHV0KGRlc3RfeSArIGRjdF9vZmZzZXQsICAgICAgICAgICAgICBkY3RfbGluZXNpemUsIChpbnQxNl90KikoKnMtPmJsb2NrMzIpWzJdKTsKKyAgICAgICAgICAgICAgICBzLT5pZHNwLmlkY3RfcHV0KGRlc3RfeSArIGRjdF9vZmZzZXQgKyBhY3RfYmxvY2tfc2l6ZSwgZGN0X2xpbmVzaXplLCAoaW50MTZfdCopKCpzLT5ibG9jazMyKVszXSk7CisKKyAgICAgICAgICAgICAgICBkY3RfbGluZXNpemUgPSB1dmxpbmVzaXplIDw8IHMtPmludGVybGFjZWRfZGN0OworICAgICAgICAgICAgICAgIGRjdF9vZmZzZXQgICA9IHMtPmludGVybGFjZWRfZGN0ID8gdXZsaW5lc2l6ZSA6IHV2bGluZXNpemUqYmxvY2tfc2l6ZTsKKworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF9jYiwgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSwgKGludDE2X3QqKSgqcy0+YmxvY2szMilbNF0pOworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF9jciwgICAgICAgICAgICAgIGRjdF9saW5lc2l6ZSwgKGludDE2X3QqKSgqcy0+YmxvY2szMilbNV0pOworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF9jYiArIGRjdF9vZmZzZXQsIGRjdF9saW5lc2l6ZSwgKGludDE2X3QqKSgqcy0+YmxvY2szMilbNl0pOworICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF9jciArIGRjdF9vZmZzZXQsIGRjdF9saW5lc2l6ZSwgKGludDE2X3QqKSgqcy0+YmxvY2szMilbN10pOworICAgICAgICAgICAgICAgIGlmKCFzLT5jaHJvbWFfeF9zaGlmdCl7Ly9DaHJvbWE0NDQKKyAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0X3B1dChkZXN0X2NiICsgYWN0X2Jsb2NrX3NpemUsICAgICAgICAgICAgICBkY3RfbGluZXNpemUsIChpbnQxNl90KikoKnMtPmJsb2NrMzIpWzhdKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0X3B1dChkZXN0X2NyICsgYWN0X2Jsb2NrX3NpemUsICAgICAgICAgICAgICBkY3RfbGluZXNpemUsIChpbnQxNl90KikoKnMtPmJsb2NrMzIpWzldKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+aWRzcC5pZGN0X3B1dChkZXN0X2NiICsgYWN0X2Jsb2NrX3NpemUgKyBkY3Rfb2Zmc2V0LCBkY3RfbGluZXNpemUsIChpbnQxNl90KikoKnMtPmJsb2NrMzIpWzEwXSk7CisgICAgICAgICAgICAgICAgICAgIHMtPmlkc3AuaWRjdF9wdXQoZGVzdF9jciArIGFjdF9ibG9ja19zaXplICsgZGN0X29mZnNldCwgZGN0X2xpbmVzaXplLCAoaW50MTZfdCopKCpzLT5ibG9jazMyKVsxMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIGRjdCBvbmx5IGluIGludHJhIGJsb2NrICovCi0gICAgICAgICAgICBpZihzLT5lbmNvZGluZyB8fCAhKHMtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9NUEVHMVZJREVPIHx8IHMtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9NUEVHMlZJREVPKSl7CisgICAgICAgICAgICBlbHNlIGlmKHMtPmVuY29kaW5nIHx8ICEocy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUcxVklERU8gfHwgcy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX01QRUcyVklERU8pKXsKICAgICAgICAgICAgICAgICBwdXRfZGN0KHMsIGJsb2NrWzBdLCAwLCBkZXN0X3kgICAgICAgICAgICAgICAgICAgICAgICAgICwgZGN0X2xpbmVzaXplLCBzLT5xc2NhbGUpOwogICAgICAgICAgICAgICAgIHB1dF9kY3QocywgYmxvY2tbMV0sIDEsIGRlc3RfeSAgICAgICAgICAgICAgKyBibG9ja19zaXplLCBkY3RfbGluZXNpemUsIHMtPnFzY2FsZSk7CiAgICAgICAgICAgICAgICAgcHV0X2RjdChzLCBibG9ja1syXSwgMiwgZGVzdF95ICsgZGN0X29mZnNldCAgICAgICAgICAgICAsIGRjdF9saW5lc2l6ZSwgcy0+cXNjYWxlKTsKQEAgLTI3MTcsMTYgKzIyMTEsMTYgQEAKICAgICB9CiB9CiAKLXZvaWQgZmZfbXB2X2RlY29kZV9tYihNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCBibG9ja1sxMl1bNjRdKQordm9pZCBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbMTJdWzY0XSkKIHsKICNpZiAhQ09ORklHX1NNQUxMCiAgICAgaWYocy0+b3V0X2Zvcm1hdCA9PSBGTVRfTVBFRzEpIHsKLSAgICAgICAgaWYocy0+YXZjdHgtPmxvd3JlcykgbXB2X2RlY29kZV9tYl9pbnRlcm5hbChzLCBibG9jaywgMSwgMSk7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgIG1wdl9kZWNvZGVfbWJfaW50ZXJuYWwocywgYmxvY2ssIDAsIDEpOworICAgICAgICBpZihzLT5hdmN0eC0+bG93cmVzKSBtcHZfcmVjb25zdHJ1Y3RfbWJfaW50ZXJuYWwocywgYmxvY2ssIDEsIDEpOworICAgICAgICBlbHNlICAgICAgICAgICAgICAgICBtcHZfcmVjb25zdHJ1Y3RfbWJfaW50ZXJuYWwocywgYmxvY2ssIDAsIDEpOwogICAgIH0gZWxzZQogI2VuZGlmCi0gICAgaWYocy0+YXZjdHgtPmxvd3JlcykgbXB2X2RlY29kZV9tYl9pbnRlcm5hbChzLCBibG9jaywgMSwgMCk7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgIG1wdl9kZWNvZGVfbWJfaW50ZXJuYWwocywgYmxvY2ssIDAsIDApOworICAgIGlmKHMtPmF2Y3R4LT5sb3dyZXMpIG1wdl9yZWNvbnN0cnVjdF9tYl9pbnRlcm5hbChzLCBibG9jaywgMSwgMCk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgIG1wdl9yZWNvbnN0cnVjdF9tYl9pbnRlcm5hbChzLCBibG9jaywgMCwgMCk7CiB9CiAKIHZvaWQgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQoTXBlZ0VuY0NvbnRleHQgKnMsIGludCB5LCBpbnQgaCkKQEAgLTI3MzksNyArMjIzMyw4IEBACiB2b2lkIGZmX2luaXRfYmxvY2tfaW5kZXgoTXBlZ0VuY0NvbnRleHQgKnMpeyAvL0ZJWE1FIG1heWJlIHJlbmFtZQogICAgIGNvbnN0IGludCBsaW5lc2l6ZSAgID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzBdOyAvL25vdCBzLT5saW5lc2l6ZSBhcyB0aGlzIHdvdWxkIGJlIHdyb25nIGZvciBmaWVsZCBwaWNzCiAgICAgY29uc3QgaW50IHV2bGluZXNpemUgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMV07Ci0gICAgY29uc3QgaW50IG1iX3NpemU9IDQgLSBzLT5hdmN0eC0+bG93cmVzOworICAgIGNvbnN0IGludCB3aWR0aF9vZl9tYiA9ICg0ICsgKHMtPmF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID4gOCkpIC0gcy0+YXZjdHgtPmxvd3JlczsKKyAgICBjb25zdCBpbnQgaGVpZ2h0X29mX21iID0gNCAtIHMtPmF2Y3R4LT5sb3dyZXM7CiAKICAgICBzLT5ibG9ja19pbmRleFswXT0gcy0+Yjhfc3RyaWRlKihzLT5tYl95KjIgICAgKSAtIDIgKyBzLT5tYl94KjI7CiAgICAgcy0+YmxvY2tfaW5kZXhbMV09IHMtPmI4X3N0cmlkZSoocy0+bWJfeSoyICAgICkgLSAxICsgcy0+bWJfeCoyOwpAQCAtMjc0OSwyMCArMjI0NCwyMCBAQAogICAgIHMtPmJsb2NrX2luZGV4WzVdPSBzLT5tYl9zdHJpZGUqKHMtPm1iX3kgKyBzLT5tYl9oZWlnaHQgKyAyKSArIHMtPmI4X3N0cmlkZSpzLT5tYl9oZWlnaHQqMiArIHMtPm1iX3ggLSAxOwogICAgIC8vYmxvY2tfaW5kZXggaXMgbm90IHVzZWQgYnkgbXBlZzIsIHNvIGl0IGlzIG5vdCBhZmZlY3RlZCBieSBjaHJvbWFfZm9ybWF0CiAKLSAgICBzLT5kZXN0WzBdID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMF0gKyAoaW50KSgocy0+bWJfeCAtIDFVKSA8PCAgbWJfc2l6ZSk7Ci0gICAgcy0+ZGVzdFsxXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzFdICsgKGludCkoKHMtPm1iX3ggLSAxVSkgPDwgKG1iX3NpemUgLSBzLT5jaHJvbWFfeF9zaGlmdCkpOwotICAgIHMtPmRlc3RbMl0gPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVsyXSArIChpbnQpKChzLT5tYl94IC0gMVUpIDw8IChtYl9zaXplIC0gcy0+Y2hyb21hX3hfc2hpZnQpKTsKKyAgICBzLT5kZXN0WzBdID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmRhdGFbMF0gKyAoaW50KSgocy0+bWJfeCAtIDFVKSA8PCAgd2lkdGhfb2ZfbWIpOworICAgIHMtPmRlc3RbMV0gPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVsxXSArIChpbnQpKChzLT5tYl94IC0gMVUpIDw8ICh3aWR0aF9vZl9tYiAtIHMtPmNocm9tYV94X3NoaWZ0KSk7CisgICAgcy0+ZGVzdFsyXSA9IHMtPmN1cnJlbnRfcGljdHVyZS5mLT5kYXRhWzJdICsgKGludCkoKHMtPm1iX3ggLSAxVSkgPDwgKHdpZHRoX29mX21iIC0gcy0+Y2hyb21hX3hfc2hpZnQpKTsKIAogICAgIGlmKCEocy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfQiAmJiBzLT5hdmN0eC0+ZHJhd19ob3Jpel9iYW5kICYmIHMtPnBpY3R1cmVfc3RydWN0dXJlPT1QSUNUX0ZSQU1FKSkKICAgICB7CiAgICAgICAgIGlmKHMtPnBpY3R1cmVfc3RydWN0dXJlPT1QSUNUX0ZSQU1FKXsKLSAgICAgICAgcy0+ZGVzdFswXSArPSBzLT5tYl95ICogICBsaW5lc2l6ZSA8PCBtYl9zaXplOwotICAgICAgICBzLT5kZXN0WzFdICs9IHMtPm1iX3kgKiB1dmxpbmVzaXplIDw8IChtYl9zaXplIC0gcy0+Y2hyb21hX3lfc2hpZnQpOwotICAgICAgICBzLT5kZXN0WzJdICs9IHMtPm1iX3kgKiB1dmxpbmVzaXplIDw8IChtYl9zaXplIC0gcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICBzLT5kZXN0WzBdICs9IHMtPm1iX3kgKiAgIGxpbmVzaXplIDw8IGhlaWdodF9vZl9tYjsKKyAgICAgICAgcy0+ZGVzdFsxXSArPSBzLT5tYl95ICogdXZsaW5lc2l6ZSA8PCAoaGVpZ2h0X29mX21iIC0gcy0+Y2hyb21hX3lfc2hpZnQpOworICAgICAgICBzLT5kZXN0WzJdICs9IHMtPm1iX3kgKiB1dmxpbmVzaXplIDw8IChoZWlnaHRfb2ZfbWIgLSBzLT5jaHJvbWFfeV9zaGlmdCk7CiAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgcy0+ZGVzdFswXSArPSAocy0+bWJfeT4+MSkgKiAgIGxpbmVzaXplIDw8IG1iX3NpemU7Ci0gICAgICAgICAgICBzLT5kZXN0WzFdICs9IChzLT5tYl95Pj4xKSAqIHV2bGluZXNpemUgPDwgKG1iX3NpemUgLSBzLT5jaHJvbWFfeV9zaGlmdCk7Ci0gICAgICAgICAgICBzLT5kZXN0WzJdICs9IChzLT5tYl95Pj4xKSAqIHV2bGluZXNpemUgPDwgKG1iX3NpemUgLSBzLT5jaHJvbWFfeV9zaGlmdCk7CisgICAgICAgICAgICBzLT5kZXN0WzBdICs9IChzLT5tYl95Pj4xKSAqICAgbGluZXNpemUgPDwgaGVpZ2h0X29mX21iOworICAgICAgICAgICAgcy0+ZGVzdFsxXSArPSAocy0+bWJfeT4+MSkgKiB1dmxpbmVzaXplIDw8IChoZWlnaHRfb2ZfbWIgLSBzLT5jaHJvbWFfeV9zaGlmdCk7CisgICAgICAgICAgICBzLT5kZXN0WzJdICs9IChzLT5tYl95Pj4xKSAqIHV2bGluZXNpemUgPDwgKGhlaWdodF9vZl9tYiAtIHMtPmNocm9tYV95X3NoaWZ0KTsKICAgICAgICAgICAgIGF2X2Fzc2VydDEoKHMtPm1iX3kmMSkgPT0gKHMtPnBpY3R1cmVfc3RydWN0dXJlID09IFBJQ1RfQk9UVE9NX0ZJRUxEKSk7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWd2aWRlby5oIGIvbGliYXZjb2RlYy9tcGVndmlkZW8uaAppbmRleCBkZjVlNGJmLi41NDE5MDljIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWd2aWRlby5oCisrKyBiL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvLmgKQEAgLTQ1LDYgKzQ1LDcgQEAKICNpbmNsdWRlICJtcGVncGljdHVyZS5oIgogI2luY2x1ZGUgIm1wZWd2aWRlb2RzcC5oIgogI2luY2x1ZGUgIm1wZWd2aWRlb2VuY2RzcC5oIgorI2luY2x1ZGUgIm1wZWd2aWRlb2RhdGEuaCIKICNpbmNsdWRlICJwaXhibG9ja2RzcC5oIgogI2luY2x1ZGUgInB1dF9iaXRzLmgiCiAjaW5jbHVkZSAicmF0ZWNvbnRyb2wuaCIKQEAgLTcxLDYgKzcyLDggQEAKICNkZWZpbmUgU0xJQ0VfTUFYX1NUQVJUX0NPREUgICAgMHgwMDAwMDFhZgogI2RlZmluZSBFWFRfU1RBUlRfQ09ERSAgICAgICAgICAweDAwMDAwMWI1CiAjZGVmaW5lIFVTRVJfU1RBUlRfQ09ERSAgICAgICAgIDB4MDAwMDAxYjIKKyNkZWZpbmUgU0xJQ0VfU1RBUlRfQ09ERSAgICAgICAgMHgwMDAwMDFiNworCiAKIC8qKgogICogTXBlZ0VuY0NvbnRleHQuCkBAIC04MSwxNiArODQsMTYgQEAKICAgICBpbnQgeV9kY19zY2FsZSwgY19kY19zY2FsZTsKICAgICBpbnQgYWNfcHJlZDsKICAgICBpbnQgYmxvY2tfbGFzdF9pbmRleFsxMl07ICAvLy88IGxhc3Qgbm9uIHplcm8gY29lZmZpY2llbnQgaW4gYmxvY2sKLSAgICBpbnQgaDI2M19haWM7ICAgICAgICAgICAgICAvLy88IEFkdmFuZGVkIElOVFJBIENvZGluZyAoQUlDKQorICAgIGludCBoMjYzX2FpYzsgICAgICAgICAgICAgIC8vLzwgQWR2YW5jZWQgSU5UUkEgQ29kaW5nIChBSUMpCiAKICAgICAvKiBzY2FudGFibGVzICovCi0gICAgU2NhblRhYmxlIGludGVyX3NjYW50YWJsZTsgLy8vPCBpZiBpbnRlciA9PSBpbnRyYSB0aGVuIGludHJhIHNob3VsZCBiZSB1c2VkIHRvIHJlZHVjZSB0aGEgY2FjaGUgdXNhZ2UKKyAgICBTY2FuVGFibGUgaW50ZXJfc2NhbnRhYmxlOyAvLy88IGlmIGludGVyID09IGludHJhIHRoZW4gaW50cmEgc2hvdWxkIGJlIHVzZWQgdG8gcmVkdWNlIHRoZSBjYWNoZSB1c2FnZQogICAgIFNjYW5UYWJsZSBpbnRyYV9zY2FudGFibGU7CiAgICAgU2NhblRhYmxlIGludHJhX2hfc2NhbnRhYmxlOwogICAgIFNjYW5UYWJsZSBpbnRyYV92X3NjYW50YWJsZTsKIAogICAgIC8qIFdBUk5JTkc6IGNoYW5nZXMgYWJvdmUgdGhpcyBsaW5lIHJlcXVpcmUgdXBkYXRlcyB0byBoYXJkY29kZWQKLSAgICAgKiAgICAgICAgICBvZmZzZXRzIHVzZWQgaW4gYXNtLiAqLworICAgICAqICAgICAgICAgIG9mZnNldHMgdXNlZCBpbiBBU00uICovCiAKICAgICBzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwogICAgIC8qIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBlbmNvZGluZyAqLwpAQCAtOTksMjAgKzEwMiwyMCBAQAogICAgIGludCBpbnRyYV9vbmx5OyAgIC8vLzwgaWYgdHJ1ZSwgb25seSBpbnRyYSBwaWN0dXJlcyBhcmUgZ2VuZXJhdGVkCiAgICAgaW50NjRfdCBiaXRfcmF0ZTsgLy8vPCB3YW50ZWQgYml0IHJhdGUKICAgICBlbnVtIE91dHB1dEZvcm1hdCBvdXRfZm9ybWF0OyAvLy88IG91dHB1dCBmb3JtYXQKLSAgICBpbnQgaDI2M19wcmVkOyAgICAvLy88IHVzZSBtcGVnNC9oMjYzIGFjL2RjIHByZWRpY3Rpb25zCi0gICAgaW50IHBiX2ZyYW1lOyAgICAgLy8vPCBQQiBmcmFtZSBtb2RlICgwID0gbm9uZSwgMSA9IGJhc2UsIDIgPSBpbXByb3ZlZCkKKyAgICBpbnQgaDI2M19wcmVkOyAgICAvLy88IHVzZSBNUEVHLTQvSC4yNjMgYWMvZGMgcHJlZGljdGlvbnMKKyAgICBpbnQgcGJfZnJhbWU7ICAgICAvLy88IFBCLWZyYW1lIG1vZGUgKDAgPSBub25lLCAxID0gYmFzZSwgMiA9IGltcHJvdmVkKQogCiAvKiB0aGUgZm9sbG93aW5nIGNvZGVjIGlkIGZpZWxkcyBhcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBjb2RlY19pZCAqLwotICAgIGludCBoMjYzX3BsdXM7ICAgIC8vLzwgaDI2MyBwbHVzIGhlYWRlcnMKLSAgICBpbnQgaDI2M19mbHY7ICAgICAvLy88IHVzZSBmbHYgaDI2MyBoZWFkZXIKKyAgICBpbnQgaDI2M19wbHVzOyAgICAvLy88IEguMjYzKyBoZWFkZXJzCisgICAgaW50IGgyNjNfZmx2OyAgICAgLy8vPCB1c2UgZmx2IEguMjYzIGhlYWRlcgogCiAgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQ7ICAgICAvKiBzZWUgQVZfQ09ERUNfSURfeHh4ICovCiAgICAgaW50IGZpeGVkX3FzY2FsZTsgLy8vPCBmaXhlZCBxc2NhbGUgaWYgbm9uIHplcm8KICAgICBpbnQgZW5jb2Rpbmc7ICAgICAvLy88IHRydWUgaWYgd2UgYXJlIGVuY29kaW5nICh2cyBkZWNvZGluZykKLSAgICBpbnQgbWF4X2JfZnJhbWVzOyAvLy88IG1heCBudW1iZXIgb2YgYi1mcmFtZXMgZm9yIGVuY29kaW5nCisgICAgaW50IG1heF9iX2ZyYW1lczsgLy8vPCBtYXggbnVtYmVyIG9mIEItZnJhbWVzIGZvciBlbmNvZGluZwogICAgIGludCBsdW1hX2VsaW1fdGhyZXNob2xkOwogICAgIGludCBjaHJvbWFfZWxpbV90aHJlc2hvbGQ7Ci0gICAgaW50IHN0cmljdF9zdGRfY29tcGxpYW5jZTsgLy8vPCBzdHJpY3RseSBmb2xsb3cgdGhlIHN0ZCAoTVBFRzQsIC4uLikKKyAgICBpbnQgc3RyaWN0X3N0ZF9jb21wbGlhbmNlOyAvLy88IHN0cmljdGx5IGZvbGxvdyB0aGUgc3RkIChNUEVHLTQsIC4uLikKICAgICBpbnQgd29ya2Fyb3VuZF9idWdzOyAgICAgICAvLy88IHdvcmthcm91bmQgYnVncyBpbiBlbmNvZGVycyB3aGljaCBjYW5ub3QgYmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseQogICAgIGludCBjb2RlY190YWc7ICAgICAgICAgICAgIC8vLzwgaW50ZXJuYWwgY29kZWNfdGFnIHVwcGVyIGNhc2UgY29udmVydGVkIGZyb20gYXZjdHggY29kZWNfdGFnCiAgICAgLyogdGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG1hbmFnZWQgaW50ZXJuYWxseSBieSB0aGUgZW5jb2RlciAqLwpAQCAtMTMyLDcgKzEzNSw3IEBACiAgICAgcHRyZGlmZl90IHV2bGluZXNpemU7ICAgICAgLy8vPCBsaW5lIHNpemUsIGZvciBjaHJvbWEgaW4gYnl0ZXMsIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB3aWR0aAogICAgIFBpY3R1cmUgKnBpY3R1cmU7ICAgICAgICAgIC8vLzwgbWFpbiBwaWN0dXJlIGJ1ZmZlcgogICAgIFBpY3R1cmUgKippbnB1dF9waWN0dXJlOyAgIC8vLzwgbmV4dCBwaWN0dXJlcyBvbiBkaXNwbGF5IG9yZGVyIGZvciBlbmNvZGluZwotICAgIFBpY3R1cmUgKipyZW9yZGVyZWRfaW5wdXRfcGljdHVyZTsgLy8vPCBwb2ludGVyIHRvIHRoZSBuZXh0IHBpY3R1cmVzIGluIGNvZGVkb3JkZXIgZm9yIGVuY29kaW5nCisgICAgUGljdHVyZSAqKnJlb3JkZXJlZF9pbnB1dF9waWN0dXJlOyAvLy88IHBvaW50ZXIgdG8gdGhlIG5leHQgcGljdHVyZXMgaW4gY29kZWQgb3JkZXIgZm9yIGVuY29kaW5nCiAKICAgICBpbnQ2NF90IHVzZXJfc3BlY2lmaWVkX3B0czsgLy8vPCBsYXN0IG5vbi16ZXJvIHB0cyBmcm9tIEFWRnJhbWUgd2hpY2ggd2FzIHBhc3NlZCBpbnRvIGF2Y29kZWNfZW5jb2RlX3ZpZGVvMigpCiAgICAgLyoqCkBAIC0xNzksMTkgKzE4MiwxOSBAQAogICAgIFBpY3R1cmUgKmxhc3RfcGljdHVyZV9wdHI7ICAgICAvLy88IHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzIHBpY3R1cmUuCiAgICAgUGljdHVyZSAqbmV4dF9waWN0dXJlX3B0cjsgICAgIC8vLzwgcG9pbnRlciB0byB0aGUgbmV4dCBwaWN0dXJlIChmb3IgYmlkaXIgcHJlZCkKICAgICBQaWN0dXJlICpjdXJyZW50X3BpY3R1cmVfcHRyOyAgLy8vPCBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHBpY3R1cmUKLSAgICBpbnQgbGFzdF9kY1szXTsgICAgICAgICAgICAgICAgLy8vPCBsYXN0IERDIHZhbHVlcyBmb3IgTVBFRzEKKyAgICBpbnQgbGFzdF9kY1szXTsgICAgICAgICAgICAgICAgLy8vPCBsYXN0IERDIHZhbHVlcyBmb3IgTVBFRy0xCiAgICAgaW50MTZfdCAqZGNfdmFsX2Jhc2U7Ci0gICAgaW50MTZfdCAqZGNfdmFsWzNdOyAgICAgICAgICAgIC8vLzwgdXNlZCBmb3IgbXBlZzQgREMgcHJlZGljdGlvbiwgYWxsIDMgYXJyYXlzIG11c3QgYmUgY29udGludW91cworICAgIGludDE2X3QgKmRjX3ZhbFszXTsgICAgICAgICAgICAvLy88IHVzZWQgZm9yIE1QRUctNCBEQyBwcmVkaWN0aW9uLCBhbGwgMyBhcnJheXMgbXVzdCBiZSBjb250aW51b3VzCiAgICAgY29uc3QgdWludDhfdCAqeV9kY19zY2FsZV90YWJsZTsgICAgIC8vLzwgcXNjYWxlIC0+IHlfZGNfc2NhbGUgdGFibGUKICAgICBjb25zdCB1aW50OF90ICpjX2RjX3NjYWxlX3RhYmxlOyAgICAgLy8vPCBxc2NhbGUgLT4gY19kY19zY2FsZSB0YWJsZQotICAgIGNvbnN0IHVpbnQ4X3QgKmNocm9tYV9xc2NhbGVfdGFibGU7ICAvLy88IHFzY2FsZSAtPiBjaHJvbWFfcXNjYWxlIChoMjYzKQorICAgIGNvbnN0IHVpbnQ4X3QgKmNocm9tYV9xc2NhbGVfdGFibGU7ICAvLy88IHFzY2FsZSAtPiBjaHJvbWFfcXNjYWxlIChILjI2MykKICAgICB1aW50OF90ICpjb2RlZF9ibG9ja19iYXNlOwogICAgIHVpbnQ4X3QgKmNvZGVkX2Jsb2NrOyAgICAgICAgICAvLy88IHVzZWQgZm9yIGNvZGVkIGJsb2NrIHBhdHRlcm4gcHJlZGljdGlvbiAobXNtcGVnNHYzLCB3bXYxKQogICAgIGludDE2X3QgKCphY192YWxfYmFzZSlbMTZdOwotICAgIGludDE2X3QgKCphY192YWxbM10pWzE2XTsgICAgICAvLy88IHVzZWQgZm9yIG1wZWc0IEFDIHByZWRpY3Rpb24sIGFsbCAzIGFycmF5cyBtdXN0IGJlIGNvbnRpbnVvdXMKKyAgICBpbnQxNl90ICgqYWNfdmFsWzNdKVsxNl07ICAgICAgLy8vPCB1c2VkIGZvciBNUEVHLTQgQUMgcHJlZGljdGlvbiwgYWxsIDMgYXJyYXlzIG11c3QgYmUgY29udGludW91cwogICAgIGludCBtYl9za2lwcGVkOyAgICAgICAgICAgICAgICAvLy88IE1VU1QgQkUgU0VUIG9ubHkgZHVyaW5nIERFQ09ESU5HCiAgICAgdWludDhfdCAqbWJza2lwX3RhYmxlOyAgICAgICAgLyoqPCB1c2VkIHRvIGF2b2lkIGNvcHkgaWYgbWFjcm9ibG9jayBza2lwcGVkIChmb3IgYmxhY2sgcmVnaW9ucyBmb3IgZXhhbXBsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVzZWQgZm9yIGItZnJhbWUgZW5jb2RpbmcgJiBkZWNvZGluZyAoY29udGFpbnMgc2tpcCB0YWJsZSBvZiBuZXh0IFAgRnJhbWUpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB1c2VkIGZvciBCLWZyYW1lIGVuY29kaW5nICYgZGVjb2RpbmcgKGNvbnRhaW5zIHNraXAgdGFibGUgb2YgbmV4dCBQLWZyYW1lKSAqLwogICAgIHVpbnQ4X3QgKm1iaW50cmFfdGFibGU7ICAgICAgIC8vLzwgdXNlZCB0byBhdm9pZCBzZXR0aW5nIHthYywgZGMsIGNicH0tcHJlZCBzdHVmZiB0byB6ZXJvIG9uIGludGVyIE1CIGRlY29kaW5nCiAgICAgdWludDhfdCAqY2JwX3RhYmxlOyAgICAgICAgICAgLy8vPCB1c2VkIHRvIHN0b3JlIGNicCwgYWNfcHJlZCBmb3IgcGFydGl0aW9uZWQgZGVjb2RpbmcKICAgICB1aW50OF90ICpwcmVkX2Rpcl90YWJsZTsgICAgICAvLy88IHVzZWQgdG8gc3RvcmUgcHJlZF9kaXIgZm9yIHBhcnRpdGlvbmVkIGRlY29kaW5nCkBAIC0yMDAsNyArMjAzLDcgQEAKIAogICAgIGludCBxc2NhbGU7ICAgICAgICAgICAgICAgICAvLy88IFFQCiAgICAgaW50IGNocm9tYV9xc2NhbGU7ICAgICAgICAgIC8vLzwgY2hyb21hIFFQCi0gICAgdW5zaWduZWQgaW50IGxhbWJkYTsgICAgICAgIC8vLzwgbGFncmFuZ2UgbXVsdGlwbGVyIHVzZWQgaW4gcmF0ZSBkaXN0b3J0aW9uCisgICAgdW5zaWduZWQgaW50IGxhbWJkYTsgICAgICAgIC8vLzwgTGFncmFuZ2UgbXVsdGlwbGllciB1c2VkIGluIHJhdGUgZGlzdG9ydGlvbgogICAgIHVuc2lnbmVkIGludCBsYW1iZGEyOyAgICAgICAvLy88IChsYW1iZGEqbGFtYmRhKSA+PiBGRl9MQU1CREFfU0hJRlQKICAgICBpbnQgKmxhbWJkYV90YWJsZTsKICAgICBpbnQgYWRhcHRpdmVfcXVhbnQ7ICAgICAgICAgLy8vPCB1c2UgYWRhcHRpdmUgcXVhbnRpemF0aW9uCkBAIC0yMDksNyArMjEyLDcgQEAKICAgICBpbnQgcGljdF90eXBlOyAgICAgICAgICAgICAgLy8vPCBBVl9QSUNUVVJFX1RZUEVfSSwgQVZfUElDVFVSRV9UWVBFX1AsIEFWX1BJQ1RVUkVfVFlQRV9CLCAuLi4KICAgICBpbnQgdmJ2X2RlbGF5OwogICAgIGludCBsYXN0X3BpY3RfdHlwZTsgLy9GSVhNRSByZW1vdmVzCi0gICAgaW50IGxhc3Rfbm9uX2JfcGljdF90eXBlOyAgIC8vLzwgdXNlZCBmb3IgbXBlZzQgZ21jIGItZnJhbWVzICYgcmF0ZWNvbnRyb2wKKyAgICBpbnQgbGFzdF9ub25fYl9waWN0X3R5cGU7ICAgLy8vPCB1c2VkIGZvciBNUEVHLTQgZ21jIEItZnJhbWVzICYgcmF0ZWNvbnRyb2wKICAgICBpbnQgZHJvcHBhYmxlOwogICAgIGludCBmcmFtZV9yYXRlX2luZGV4OwogICAgIEFWUmF0aW9uYWwgbXBlZzJfZnJhbWVfcmF0ZV9leHQ7CkBAIC0yMTgsNyArMjIxLDcgQEAKIAogICAgIC8qIG1vdGlvbiBjb21wZW5zYXRpb24gKi8KICAgICBpbnQgdW5yZXN0cmljdGVkX212OyAgICAgICAgLy8vPCBtdiBjYW4gcG9pbnQgb3V0c2lkZSBvZiB0aGUgY29kZWQgcGljdHVyZQotICAgIGludCBoMjYzX2xvbmdfdmVjdG9yczsgICAgICAvLy88IHVzZSBob3JyaWJsZSBoMjYzdjEgbG9uZyB2ZWN0b3IgbW9kZQorICAgIGludCBoMjYzX2xvbmdfdmVjdG9yczsgICAgICAvLy88IHVzZSBob3JyaWJsZSBILjI2M3YxIGxvbmcgdmVjdG9yIG1vZGUKIAogICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOwogICAgIEZEQ1REU1BDb250ZXh0IGZkc3A7CkBAIC0yMzMsNyArMjM2LDcgQEAKICAgICBWaWRlb0RTUENvbnRleHQgdmRzcDsKICAgICBIMjYzRFNQQ29udGV4dCBoMjYzZHNwOwogICAgIGludCBmX2NvZGU7ICAgICAgICAgICAgICAgICAvLy88IGZvcndhcmQgTVYgcmVzb2x1dGlvbgotICAgIGludCBiX2NvZGU7ICAgICAgICAgICAgICAgICAvLy88IGJhY2t3YXJkIE1WIHJlc29sdXRpb24gZm9yIEIgRnJhbWVzIChtcGVnNCkKKyAgICBpbnQgYl9jb2RlOyAgICAgICAgICAgICAgICAgLy8vPCBiYWNrd2FyZCBNViByZXNvbHV0aW9uIGZvciBCLWZyYW1lcyAoTVBFRy00KQogICAgIGludDE2X3QgKCpwX212X3RhYmxlX2Jhc2UpWzJdOwogICAgIGludDE2X3QgKCpiX2ZvcndfbXZfdGFibGVfYmFzZSlbMl07CiAgICAgaW50MTZfdCAoKmJfYmFja19tdl90YWJsZV9iYXNlKVsyXTsKQEAgLTI0MiwyOSArMjQ1LDI2IEBACiAgICAgaW50MTZfdCAoKmJfZGlyZWN0X212X3RhYmxlX2Jhc2UpWzJdOwogICAgIGludDE2X3QgKCpwX2ZpZWxkX212X3RhYmxlX2Jhc2VbMl1bMl0pWzJdOwogICAgIGludDE2X3QgKCpiX2ZpZWxkX212X3RhYmxlX2Jhc2VbMl1bMl1bMl0pWzJdOwotICAgIGludDE2X3QgKCpwX212X3RhYmxlKVsyXTsgICAgICAgICAgICAvLy88IE1WIHRhYmxlICgxTVYgcGVyIE1CKSBwLWZyYW1lIGVuY29kaW5nCi0gICAgaW50MTZfdCAoKmJfZm9yd19tdl90YWJsZSlbMl07ICAgICAgIC8vLzwgTVYgdGFibGUgKDFNViBwZXIgTUIpIGZvcndhcmQgbW9kZSBiLWZyYW1lIGVuY29kaW5nCi0gICAgaW50MTZfdCAoKmJfYmFja19tdl90YWJsZSlbMl07ICAgICAgIC8vLzwgTVYgdGFibGUgKDFNViBwZXIgTUIpIGJhY2t3YXJkIG1vZGUgYi1mcmFtZSBlbmNvZGluZwotICAgIGludDE2X3QgKCpiX2JpZGlyX2ZvcndfbXZfdGFibGUpWzJdOyAvLy88IE1WIHRhYmxlICgxTVYgcGVyIE1CKSBiaWRpciBtb2RlIGItZnJhbWUgZW5jb2RpbmcKLSAgICBpbnQxNl90ICgqYl9iaWRpcl9iYWNrX212X3RhYmxlKVsyXTsgLy8vPCBNViB0YWJsZSAoMU1WIHBlciBNQikgYmlkaXIgbW9kZSBiLWZyYW1lIGVuY29kaW5nCi0gICAgaW50MTZfdCAoKmJfZGlyZWN0X212X3RhYmxlKVsyXTsgICAgIC8vLzwgTVYgdGFibGUgKDFNViBwZXIgTUIpIGRpcmVjdCBtb2RlIGItZnJhbWUgZW5jb2RpbmcKLSAgICBpbnQxNl90ICgqcF9maWVsZF9tdl90YWJsZVsyXVsyXSlbMl07ICAgLy8vPCBNViB0YWJsZSAoMk1WIHBlciBNQikgaW50ZXJsYWNlZCBwLWZyYW1lIGVuY29kaW5nCi0gICAgaW50MTZfdCAoKmJfZmllbGRfbXZfdGFibGVbMl1bMl1bMl0pWzJdOy8vLzwgTVYgdGFibGUgKDRNViBwZXIgTUIpIGludGVybGFjZWQgYi1mcmFtZSBlbmNvZGluZworICAgIGludDE2X3QgKCpwX212X3RhYmxlKVsyXTsgICAgICAgICAgICAvLy88IE1WIHRhYmxlICgxTVYgcGVyIE1CKSBQLWZyYW1lIGVuY29kaW5nCisgICAgaW50MTZfdCAoKmJfZm9yd19tdl90YWJsZSlbMl07ICAgICAgIC8vLzwgTVYgdGFibGUgKDFNViBwZXIgTUIpIGZvcndhcmQgbW9kZSBCLWZyYW1lIGVuY29kaW5nCisgICAgaW50MTZfdCAoKmJfYmFja19tdl90YWJsZSlbMl07ICAgICAgIC8vLzwgTVYgdGFibGUgKDFNViBwZXIgTUIpIGJhY2t3YXJkIG1vZGUgQi1mcmFtZSBlbmNvZGluZworICAgIGludDE2X3QgKCpiX2JpZGlyX2ZvcndfbXZfdGFibGUpWzJdOyAvLy88IE1WIHRhYmxlICgxTVYgcGVyIE1CKSBiaWRpciBtb2RlIEItZnJhbWUgZW5jb2RpbmcKKyAgICBpbnQxNl90ICgqYl9iaWRpcl9iYWNrX212X3RhYmxlKVsyXTsgLy8vPCBNViB0YWJsZSAoMU1WIHBlciBNQikgYmlkaXIgbW9kZSBCLWZyYW1lIGVuY29kaW5nCisgICAgaW50MTZfdCAoKmJfZGlyZWN0X212X3RhYmxlKVsyXTsgICAgIC8vLzwgTVYgdGFibGUgKDFNViBwZXIgTUIpIGRpcmVjdCBtb2RlIEItZnJhbWUgZW5jb2RpbmcKKyAgICBpbnQxNl90ICgqcF9maWVsZF9tdl90YWJsZVsyXVsyXSlbMl07ICAgLy8vPCBNViB0YWJsZSAoMk1WIHBlciBNQikgaW50ZXJsYWNlZCBQLWZyYW1lIGVuY29kaW5nCisgICAgaW50MTZfdCAoKmJfZmllbGRfbXZfdGFibGVbMl1bMl1bMl0pWzJdOy8vLzwgTVYgdGFibGUgKDRNViBwZXIgTUIpIGludGVybGFjZWQgQi1mcmFtZSBlbmNvZGluZwogICAgIHVpbnQ4X3QgKCpwX2ZpZWxkX3NlbGVjdF90YWJsZVsyXSk7CiAgICAgdWludDhfdCAoKmJfZmllbGRfc2VsZWN0X3RhYmxlWzJdWzJdKTsKLSNpZiBGRl9BUElfTU9USU9OX0VTVAotICAgIGludCBtZV9tZXRob2Q7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1FIGFsZ29yaXRobQotI2VuZGlmCiAgICAgaW50IG1vdGlvbl9lc3Q7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTUUgYWxnb3JpdGhtCiAgICAgaW50IG1lX3BlbmFsdHlfY29tcGVuc2F0aW9uOwogICAgIGludCBtZV9wcmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByZXBhc3MgZm9yIG1vdGlvbiBlc3RpbWF0aW9uCiAgICAgaW50IG12X2RpcjsKICNkZWZpbmUgTVZfRElSX0ZPUldBUkQgICAxCiAjZGVmaW5lIE1WX0RJUl9CQUNLV0FSRCAgMgotI2RlZmluZSBNVl9ESVJFQ1QgICAgICAgIDQgLy8vPCBiaWRpcmVjdGlvbmFsIG1vZGUgd2hlcmUgdGhlIGRpZmZlcmVuY2UgZXF1YWxzIHRoZSBNViBvZiB0aGUgbGFzdCBQL1MvSS1GcmFtZSAobXBlZzQpCisjZGVmaW5lIE1WX0RJUkVDVCAgICAgICAgNCAvLy88IGJpZGlyZWN0aW9uYWwgbW9kZSB3aGVyZSB0aGUgZGlmZmVyZW5jZSBlcXVhbHMgdGhlIE1WIG9mIHRoZSBsYXN0IFAvUy9JLUZyYW1lIChNUEVHLTQpCiAgICAgaW50IG12X3R5cGU7CiAjZGVmaW5lIE1WX1RZUEVfMTZYMTYgICAgICAgMCAgIC8vLzwgMSB2ZWN0b3IgZm9yIHRoZSB3aG9sZSBtYgotI2RlZmluZSBNVl9UWVBFXzhYOCAgICAgICAgIDEgICAvLy88IDQgdmVjdG9ycyAoaDI2MywgbXBlZzQgNE1WKQorI2RlZmluZSBNVl9UWVBFXzhYOCAgICAgICAgIDEgICAvLy88IDQgdmVjdG9ycyAoSC4yNjMsIE1QRUctNCA0TVYpCiAjZGVmaW5lIE1WX1RZUEVfMTZYOCAgICAgICAgMiAgIC8vLzwgMiB2ZWN0b3JzLCBvbmUgcGVyIDE2eDggYmxvY2sKICNkZWZpbmUgTVZfVFlQRV9GSUVMRCAgICAgICAzICAgLy8vPCAyIHZlY3RvcnMsIG9uZSBwZXIgZmllbGQKICNkZWZpbmUgTVZfVFlQRV9ETVYgICAgICAgICA0ICAgLy8vPCAyIHZlY3RvcnMsIHNwZWNpYWwgbXBlZzIgRHVhbCBQcmltZSBWZWN0b3JzCkBAIC0yNzUsMTQgKzI3NSwxNCBAQAogICAgICovCiAgICAgaW50IG12WzJdWzRdWzJdOwogICAgIGludCBmaWVsZF9zZWxlY3RbMl1bMl07Ci0gICAgaW50IGxhc3RfbXZbMl1bMl1bMl07ICAgICAgICAgICAgIC8vLzwgbGFzdCBNViwgdXNlZCBmb3IgTVYgcHJlZGljdGlvbiBpbiBNUEVHMSAmIEItZnJhbWUgTVBFRzQKKyAgICBpbnQgbGFzdF9tdlsyXVsyXVsyXTsgICAgICAgICAgICAgLy8vPCBsYXN0IE1WLCB1c2VkIGZvciBNViBwcmVkaWN0aW9uIGluIE1QRUctMSAmIEItZnJhbWUgTVBFRy00CiAgICAgdWludDhfdCAqZmNvZGVfdGFiOyAgICAgICAgICAgICAgIC8vLzwgc21hbGxlc3QgZmNvZGUgbmVlZGVkIGZvciBlYWNoIE1WCiAgICAgaW50MTZfdCBkaXJlY3Rfc2NhbGVfbXZbMl1bNjRdOyAgIC8vLzwgcHJlY29tcHV0ZWQgdG8gYXZvaWQgZGl2aXNpb25zIGluIGZmX21wZWc0X3NldF9kaXJlY3RfbXYKIAogICAgIE1vdGlvbkVzdENvbnRleHQgbWU7CiAKLSAgICBpbnQgbm9fcm91bmRpbmc7ICAvKio8IGFwcGx5IG5vIHJvdW5kaW5nIHRvIG1vdGlvbiBjb21wZW5zYXRpb24gKE1QRUc0LCBtc21wZWc0LCAuLi4pCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgYi1mcmFtZXMgcm91bmRpbmcgbW9kZSBpcyBhbHdheXMgMCAqLworICAgIGludCBub19yb3VuZGluZzsgIC8qKjwgYXBwbHkgbm8gcm91bmRpbmcgdG8gbW90aW9uIGNvbXBlbnNhdGlvbiAoTVBFRy00LCBtc21wZWc0LCAuLi4pCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgQi1mcmFtZXMgcm91bmRpbmcgbW9kZSBpcyBhbHdheXMgMCAqLwogCiAgICAgLyogbWFjcm9ibG9jayBsYXllciAqLwogICAgIGludCBtYl94LCBtYl95OwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAgICAgaW50IHJlc3luY19tYl95OyAgICAgICAgICAgICAgICAgLy8vPCB5IHBvc2l0aW9uIG9mIGxhc3QgcmVzeW5jIG1hcmtlcgogICAgIEdldEJpdENvbnRleHQgbGFzdF9yZXN5bmNfZ2I7ICAgIC8vLzwgdXNlZCB0byBzZWFyY2ggZm9yIHRoZSBuZXh0IHJlc3luYyBtYXJrZXIKICAgICBpbnQgbWJfbnVtX2xlZnQ7ICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBNQnMgbGVmdCBpbiB0aGlzIHZpZGVvIHBhY2tldCAoZm9yIHBhcnRpdGlvbmVkIFNsaWNlcyBvbmx5KQotICAgIGludCBuZXh0X3BfZnJhbWVfZGFtYWdlZDsgICAgICAgIC8vLzwgc2V0IGlmIHRoZSBuZXh0IHAgZnJhbWUgaXMgZGFtYWdlZCwgdG8gYXZvaWQgc2hvd2luZyB0cmFzaGVkIGIgZnJhbWVzCisgICAgaW50IG5leHRfcF9mcmFtZV9kYW1hZ2VkOyAgICAgICAgLy8vPCBzZXQgaWYgdGhlIG5leHQgcCBmcmFtZSBpcyBkYW1hZ2VkLCB0byBhdm9pZCBzaG93aW5nIHRyYXNoZWQgQi1mcmFtZXMKIAogICAgIFBhcnNlQ29udGV4dCBwYXJzZV9jb250ZXh0OwogCkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICBpbnQgcmNfc3RyYXRlZ3k7CiAKICAgICAvKiBILjI2Mysgc3BlY2lmaWMgKi8KLSAgICBpbnQgdW12cGx1czsgICAgICAgICAgICAgICAgICAgIC8vLzwgPT0gSDI2MysgJiYgdW5yZXN0cmljdGVkX212CisgICAgaW50IHVtdnBsdXM7ICAgICAgICAgICAgICAgICAgICAvLy88ID09IEguMjYzKyAmJiB1bnJlc3RyaWN0ZWRfbXYKICAgICBpbnQgaDI2M19haWNfZGlyOyAgICAgICAgICAgICAgIC8vLzwgQUlDIGRpcmVjdGlvbjogMCA9IGxlZnQsIDEgPSB0b3AKICAgICBpbnQgaDI2M19zbGljZV9zdHJ1Y3R1cmVkOwogICAgIGludCBhbHRfaW50ZXJfdmxjOyAgICAgICAgICAgICAgLy8vPCBhbHRlcm5hdGl2ZSBpbnRlciB2bGMKQEAgLTM4MCw3ICszODAsOSBAQAogICAgIGludCBsb29wX2ZpbHRlcjsKICAgICBpbnQgY3VzdG9tX3BjZjsKIAotICAgIC8qIG1wZWc0IHNwZWNpZmljICovCisgICAgLyogTVBFRy00IHNwZWNpZmljICovCisgICAgaW50IHN0dWRpb19wcm9maWxlOworICAgIGludCBkY3RfcHJlY2lzaW9uOwogICAgIC8vLzwgbnVtYmVyIG9mIGJpdHMgdG8gcmVwcmVzZW50IHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGltZSAoZW5jb2RlciBvbmx5KQogICAgIGludCB0aW1lX2luY3JlbWVudF9iaXRzOwogICAgIGludCBsYXN0X3RpbWVfYmFzZTsKQEAgLTQwMSwxMiArNDAzLDEyIEBACiAgICAgaW50IHNwcml0ZV93YXJwaW5nX2FjY3VyYWN5OwogICAgIGludCBkYXRhX3BhcnRpdGlvbmluZzsgICAgICAgICAgIC8vLzwgZGF0YSBwYXJ0aXRpb25pbmcgZmxhZyBmcm9tIGhlYWRlcgogICAgIGludCBwYXJ0aXRpb25lZF9mcmFtZTsgICAgICAgICAgIC8vLzwgaXMgY3VycmVudCBmcmFtZSBwYXJ0aXRpb25lZAotICAgIGludCBsb3dfZGVsYXk7ICAgICAgICAgICAgICAgICAgIC8vLzwgbm8gcmVvcmRlcmluZyBuZWVkZWQgLyBoYXMgbm8gYi1mcmFtZXMKKyAgICBpbnQgbG93X2RlbGF5OyAgICAgICAgICAgICAgICAgICAvLy88IG5vIHJlb3JkZXJpbmcgbmVlZGVkIC8gaGFzIG5vIEItZnJhbWVzCiAgICAgaW50IHZvX3R5cGU7CiAgICAgUHV0Qml0Q29udGV4dCB0ZXhfcGI7ICAgICAgICAgICAgLy8vPCB1c2VkIGZvciBkYXRhIHBhcnRpdGlvbmVkIFZPUHMKICAgICBQdXRCaXRDb250ZXh0IHBiMjsgICAgICAgICAgICAgICAvLy88IHVzZWQgZm9yIGRhdGEgcGFydGl0aW9uZWQgVk9QcwogICAgIGludCBtcGVnX3F1YW50OwotICAgIGludCBwYWRkaW5nX2J1Z19zY29yZTsgICAgICAgICAgICAgLy8vPCB1c2VkIHRvIGRldGVjdCB0aGUgVkVSWSBjb21tb24gcGFkZGluZyBidWcgaW4gTVBFRzQKKyAgICBpbnQgcGFkZGluZ19idWdfc2NvcmU7ICAgICAgICAgICAgIC8vLzwgdXNlZCB0byBkZXRlY3QgdGhlIFZFUlkgY29tbW9uIHBhZGRpbmcgYnVnIGluIE1QRUctNAogCiAgICAgLyogZGl2eCBzcGVjaWZpYywgdXNlZCB0byB3b3JrYXJvdW5kIChtYW55KSBidWdzIGluIGRpdng1ICovCiAgICAgaW50IGRpdnhfcGFja2VkOwpAQCAtNDIyLDYgKzQyNCw3IEBACiAgICAgc3RydWN0IE1KcGVnQ29udGV4dCAqbWpwZWdfY3R4OwogICAgIGludCBlc2NfcG9zOwogICAgIGludCBwcmVkOworICAgIGludCBodWZmbWFuOwogCiAgICAgLyogTVNNUEVHNCBzcGVjaWZpYyAqLwogICAgIGludCBtdl90YWJsZV9pbmRleDsKQEAgLTQzMCw3ICs0MzMsNyBAQAogICAgIGludCBkY190YWJsZV9pbmRleDsKICAgICBpbnQgdXNlX3NraXBfbWJfY29kZTsKICAgICBpbnQgc2xpY2VfaGVpZ2h0OyAgICAgIC8vLzwgaW4gbWFjcm9ibG9ja3MKLSAgICBpbnQgZmlyc3Rfc2xpY2VfbGluZTsgIC8vLzwgdXNlZCBpbiBtcGVnNCB0b28gdG8gaGFuZGxlIHJlc3luYyBtYXJrZXJzCisgICAgaW50IGZpcnN0X3NsaWNlX2xpbmU7ICAvLy88IHVzZWQgaW4gTVBFRy00IHRvbyB0byBoYW5kbGUgcmVzeW5jIG1hcmtlcnMKICAgICBpbnQgZmxpcGZsb3Bfcm91bmRpbmc7CiAgICAgaW50IG1zbXBlZzRfdmVyc2lvbjsgICAvLy88IDA9bm90IG1zbXBlZzQsIDE9bXA0MSwgMj1tcDQyLCAzPW1wNDMvZGl2eDMgND13bXYxLzcgNT13bXYyLzgKICAgICBpbnQgcGVyX21iX3JsX3RhYmxlOwpAQCAtNDQ0LDkgKzQ0Nyw5IEBACiAgICAgLyogZGVjb21wcmVzc2lvbiBzcGVjaWZpYyAqLwogICAgIEdldEJpdENvbnRleHQgZ2I7CiAKLSAgICAvKiBNcGVnMSBzcGVjaWZpYyAqLwotICAgIGludCBnb3BfcGljdHVyZV9udW1iZXI7ICAvLy88IGluZGV4IG9mIHRoZSBmaXJzdCBwaWN0dXJlIG9mIGEgR09QIGJhc2VkIG9uIGZha2VfcGljX251bSAmIG1wZWcxIHNwZWNpZmljCi0gICAgaW50IGxhc3RfbXZfZGlyOyAgICAgICAgIC8vLzwgbGFzdCBtdl9kaXIsIHVzZWQgZm9yIGIgZnJhbWUgZW5jb2RpbmcKKyAgICAvKiBNUEVHLTEgc3BlY2lmaWMgKi8KKyAgICBpbnQgZ29wX3BpY3R1cmVfbnVtYmVyOyAgLy8vPCBpbmRleCBvZiB0aGUgZmlyc3QgcGljdHVyZSBvZiBhIEdPUCBiYXNlZCBvbiBmYWtlX3BpY19udW0gJiBNUEVHLTEgc3BlY2lmaWMKKyAgICBpbnQgbGFzdF9tdl9kaXI7ICAgICAgICAgLy8vPCBsYXN0IG12X2RpciwgdXNlZCBmb3IgQi1mcmFtZSBlbmNvZGluZwogICAgIHVpbnQ4X3QgKnZidl9kZWxheV9wdHI7ICAvLy88IHBvaW50ZXIgdG8gdmJ2X2RlbGF5IGluIHRoZSBiaXRzdHJlYW0KIAogICAgIC8qIE1QRUctMi1zcGVjaWZpYyAtIEkgd2lzaGVkIG5vdCB0byBoYXZlIHRvIHN1cHBvcnQgdGhpcyBtZXNzLiAqLwpAQCAtNDY2LDYgKzQ2OSwxMyBAQAogICAgIGludCBpbnRyYV92bGNfZm9ybWF0OwogICAgIGludCBhbHRlcm5hdGVfc2NhbjsKICAgICBpbnQgc2VxX2Rpc3BfZXh0OworICAgIGludCB2aWRlb19mb3JtYXQ7CisjZGVmaW5lIFZJREVPX0ZPUk1BVF9DT01QT05FTlQgICAwCisjZGVmaW5lIFZJREVPX0ZPUk1BVF9QQUwgICAgICAgICAxCisjZGVmaW5lIFZJREVPX0ZPUk1BVF9OVFNDICAgICAgICAyCisjZGVmaW5lIFZJREVPX0ZPUk1BVF9TRUNBTSAgICAgICAzCisjZGVmaW5lIFZJREVPX0ZPUk1BVF9NQUMgICAgICAgICA0CisjZGVmaW5lIFZJREVPX0ZPUk1BVF9VTlNQRUNJRklFRCA1CiAgICAgaW50IHJlcGVhdF9maXJzdF9maWVsZDsKICAgICBpbnQgY2hyb21hXzQyMF90eXBlOwogICAgIGludCBjaHJvbWFfZm9ybWF0OwpAQCAtNDk2LDcgKzUwNiwxMCBAQAogCiAgICAgaW50MTZfdCAoKmJsb2NrKVs2NF07IC8vLzwgcG9pbnRzIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGJsb2NrcwogICAgIGludDE2X3QgKCpibG9ja3MpWzEyXVs2NF07IC8vIGZvciBIUSBtb2RlIHdlIG5lZWQgdG8ga2VlcCB0aGUgYmVzdCBibG9jawotICAgIGludCAoKmRlY29kZV9tYikoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzZdWzY0XSk7IC8vIHVzZWQgYnkgc29tZSBjb2RlY3MgdG8gYXZvaWQgYSBzd2l0Y2goKQorICAgIGludCAoKmRlY29kZV9tYikoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzEyXVs2NF0pOyAvLyB1c2VkIGJ5IHNvbWUgY29kZWNzIHRvIGF2b2lkIGEgc3dpdGNoKCkKKworICAgIGludDMyX3QgKCpibG9jazMyKVsxMl1bNjRdOworCiAjZGVmaW5lIFNMSUNFX09LICAgICAgICAgMAogI2RlZmluZSBTTElDRV9FUlJPUiAgICAgLTEKICNkZWZpbmUgU0xJQ0VfRU5EICAgICAgIC0yIC8vLzxlbmQgbWFya2VyIGZvdW5kCkBAIC01MTQsOSArNTI3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLyphbGlnbiAxNiovLCBpbnQgbiwgaW50IHFzY2FsZSk7CiAgICAgdm9pZCAoKmRjdF91bnF1YW50aXplX2gyNjNfaW50ZXIpKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLyphbGlnbiAxNiovLCBpbnQgbiwgaW50IHFzY2FsZSk7Ci0gICAgdm9pZCAoKmRjdF91bnF1YW50aXplX2ludHJhKShzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMsIC8vIHVucXVhbnRpemVyIHRvIHVzZSAobXBlZzQgY2FuIHVzZSBib3RoKQorICAgIHZvaWQgKCpkY3RfdW5xdWFudGl6ZV9pbnRyYSkoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCAvLyB1bnF1YW50aXplciB0byB1c2UgKE1QRUctNCBjYW4gdXNlIGJvdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jay8qYWxpZ24gMTYqLywgaW50IG4sIGludCBxc2NhbGUpOwotICAgIHZvaWQgKCpkY3RfdW5xdWFudGl6ZV9pbnRlcikoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCAvLyB1bnF1YW50aXplciB0byB1c2UgKG1wZWc0IGNhbiB1c2UgYm90aCkKKyAgICB2b2lkICgqZGN0X3VucXVhbnRpemVfaW50ZXIpKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgLy8gdW5xdWFudGl6ZXIgdG8gdXNlIChNUEVHLTQgY2FuIHVzZSBib3RoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2svKmFsaWduIDE2Ki8sIGludCBuLCBpbnQgcXNjYWxlKTsKICAgICBpbnQgKCpkY3RfcXVhbnRpemUpKHN0cnVjdCBNcGVnRW5jQ29udGV4dCAqcywgaW50MTZfdCAqYmxvY2svKmFsaWduIDE2Ki8sIGludCBuLCBpbnQgcXNjYWxlLCBpbnQgKm92ZXJmbG93KTsKICAgICBpbnQgKCpmYXN0X2RjdF9xdWFudGl6ZSkoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90ICpibG9jay8qYWxpZ24gMTYqLywgaW50IG4sIGludCBxc2NhbGUsIGludCAqb3ZlcmZsb3cpOwpAQCAtNTk0LDcgKzYwNyw4IEBACiB7ICJuc3NlIiwgICAiTm9pc2UgcHJlc2VydmluZyBzdW0gb2Ygc3F1YXJlZCBkaWZmZXJlbmNlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9OU1NFIH0sIElOVF9NSU4sIElOVF9NQVgsIEZGX01QVl9PUFRfRkxBR1MsICJjbXBfZnVuYyIgfSwgXAogeyAiZGN0MjY0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ01QX0RDVDI2NCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGRl9NUFZfT1BUX0ZMQUdTLCAiY21wX2Z1bmMiIH0sIFwKIHsgImRjdG1heCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9EQ1RNQVggfSwgSU5UX01JTiwgSU5UX01BWCwgRkZfTVBWX09QVF9GTEFHUywgImNtcF9mdW5jIiB9LCBcCi17ICJjaHJvbWEiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DTVBfQ0hST01BIH0sIElOVF9NSU4sIElOVF9NQVgsIEZGX01QVl9PUFRfRkxBR1MsICJjbXBfZnVuYyIgfQoreyAiY2hyb21hIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ01QX0NIUk9NQSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGRl9NUFZfT1BUX0ZMQUdTLCAiY21wX2Z1bmMiIH0sIFwKK3sgIm1zYWQiLCAgICJTdW0gb2YgYWJzb2x1dGUgZGlmZmVyZW5jZXMsIG1lZGlhbiBwcmVkaWN0ZWQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DTVBfTUVESUFOX1NBRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGRl9NUFZfT1BUX0ZMQUdTLCAiY21wX2Z1bmMiIH0KIAogI2lmbmRlZiBGRl9NUFZfT0ZGU0VUCiAjZGVmaW5lIEZGX01QVl9PRkZTRVQoeCkgb2Zmc2V0b2YoTXBlZ0VuY0NvbnRleHQsIHgpCkBAIC02NzgsNyArNjkyLDcgQEAKIAogdm9pZCBmZl9tcHZfZGVjb2RlX2RlZmF1bHRzKE1wZWdFbmNDb250ZXh0ICpzKTsKIHZvaWQgZmZfbXB2X2RlY29kZV9pbml0KE1wZWdFbmNDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwotdm9pZCBmZl9tcHZfZGVjb2RlX21iKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQxNl90IGJsb2NrWzEyXVs2NF0pOwordm9pZCBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIoTXBlZ0VuY0NvbnRleHQgKnMsIGludDE2X3QgYmxvY2tbMTJdWzY0XSk7CiB2b2lkIGZmX21wdl9yZXBvcnRfZGVjb2RlX3Byb2dyZXNzKE1wZWdFbmNDb250ZXh0ICpzKTsKIAogaW50IGZmX21wdl9mcmFtZV9zdGFydChNcGVnRW5jQ29udGV4dCAqcywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKQEAgLTY5NywxMCArNzExLDYgQEAKIHZvaWQgZmZfbXBlZ19mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwogCiB2b2lkIGZmX3ByaW50X2RlYnVnX2luZm8oTXBlZ0VuY0NvbnRleHQgKnMsIFBpY3R1cmUgKnAsIEFWRnJhbWUgKnBpY3QpOwotdm9pZCBmZl9wcmludF9kZWJ1Z19pbmZvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpY3QsIHVpbnQ4X3QgKm1ic2tpcF90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbWJ0eXBlX3RhYmxlLCBpbnQ4X3QgKnFzY2FsZV90YWJsZSwgaW50MTZfdCAoKm1vdGlvbl92YWxbMl0pWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbG93X2RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl93aWR0aCwgaW50IG1iX2hlaWdodCwgaW50IG1iX3N0cmlkZSwgaW50IHF1YXJ0ZXJfc2FtcGxlKTsKIAogaW50IGZmX21wdl9leHBvcnRfcXBfdGFibGUoTXBlZ0VuY0NvbnRleHQgKnMsIEFWRnJhbWUgKmYsIFBpY3R1cmUgKnAsIGludCBxcF90eXBlKTsKIApAQCAtNzI3LDcgKzczNyw4IEBACiAgICAgICAgICAgICAgICAgICAgcXBlbF9tY19mdW5jICgqcXBpeF9vcClbMTZdKTsKIAogc3RhdGljIGlubGluZSB2b2lkIGZmX3VwZGF0ZV9ibG9ja19pbmRleChNcGVnRW5jQ29udGV4dCAqcyl7Ci0gICAgY29uc3QgaW50IGJsb2NrX3NpemU9IDggPj4gcy0+YXZjdHgtPmxvd3JlczsKKyAgICBjb25zdCBpbnQgYnl0ZXNfcGVyX3BpeGVsID0gMSArIChzLT5hdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA+IDgpOworICAgIGNvbnN0IGludCBibG9ja19zaXplPSAoOCpieXRlc19wZXJfcGl4ZWwpID4+IHMtPmF2Y3R4LT5sb3dyZXM7CiAKICAgICBzLT5ibG9ja19pbmRleFswXSs9MjsKICAgICBzLT5ibG9ja19pbmRleFsxXSs9MjsKQEAgLTczNiw4ICs3NDcsOCBAQAogICAgIHMtPmJsb2NrX2luZGV4WzRdKys7CiAgICAgcy0+YmxvY2tfaW5kZXhbNV0rKzsKICAgICBzLT5kZXN0WzBdKz0gMipibG9ja19zaXplOwotICAgIHMtPmRlc3RbMV0rPSBibG9ja19zaXplOwotICAgIHMtPmRlc3RbMl0rPSBibG9ja19zaXplOworICAgIHMtPmRlc3RbMV0rPSAoMiA+PiBzLT5jaHJvbWFfeF9zaGlmdCkgKiBibG9ja19zaXplOworICAgIHMtPmRlc3RbMl0rPSAoMiA+PiBzLT5jaHJvbWFfeF9zaGlmdCkgKiBibG9ja19zaXplOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBnZXRfYml0c19kaWZmKE1wZWdFbmNDb250ZXh0ICpzKXsKQEAgLTc0OSw0ICs3NjAsMTMgQEAKICAgICByZXR1cm4gYml0cyAtIGxhc3Q7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1wZWdfZ2V0X3FzY2FsZShNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBpbnQgcXNjYWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKKyAgICBpZiAocy0+cV9zY2FsZV90eXBlKQorICAgICAgICByZXR1cm4gZmZfbXBlZzJfbm9uX2xpbmVhcl9xc2NhbGVbcXNjYWxlXTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBxc2NhbGUgPDwgMTsKK30KKwogI2VuZGlmIC8qIEFWQ09ERUNfTVBFR1ZJREVPX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX2VuYy5jIGIvbGliYXZjb2RlYy9tcGVndmlkZW9fZW5jLmMKaW5kZXggMjk3ZmY3OC4uOTc5ZTEzOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVndmlkZW9fZW5jLmMKKysrIGIvbGliYXZjb2RlYy9tcGVndmlkZW9fZW5jLmMKQEAgLTY0LDYgKzY0LDcgQEAKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAid212Mi5oIgogI2luY2x1ZGUgInJ2MTAuaCIKKyNpbmNsdWRlICJsaWJ4dmlkLmgiCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSAic3A1eC5oIgogCkBAIC0yNjUsNyArMjY2LDggQEAKICAgICBzLT5waWN0dXJlX2luX2dvcF9udW1iZXIgPSAwOwogfQogCi1hdl9jb2xkIGludCBmZl9kY3RfZW5jb2RlX2luaXQoTXBlZ0VuY0NvbnRleHQgKnMpIHsKK2F2X2NvbGQgaW50IGZmX2RjdF9lbmNvZGVfaW5pdChNcGVnRW5jQ29udGV4dCAqcykKK3sKICAgICBpZiAoQVJDSF9YODYpCiAgICAgICAgIGZmX2RjdF9lbmNvZGVfaW5pdF94ODYocyk7CiAKQEAgLTM5Nyw2ICszOTksOSBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAorICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1WIHx8IChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX1NMSUNFKSkKKyAgICAgICAgcy0+aHVmZm1hbiA9IDA7CisKICAgICBpZiAocy0+aW50cmFfZGNfcHJlY2lzaW9uID4gKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPID8gMyA6IDApKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW50cmEgZGMgcHJlY2lzaW9uIHRvbyBsYXJnZVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC00MTAsMjIgKzQxNSw5IEBACiAgICAgICAgIHMtPmludHJhX29ubHkgPSAwOwogICAgIH0KIAotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgcy0+bWVfbWV0aG9kID0gYXZjdHgtPm1lX21ldGhvZDsKLUZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotI2VuZGlmCi0KICAgICAvKiBGaXhlZCBRU0NBTEUgKi8KICAgICBzLT5maXhlZF9xc2NhbGUgPSAhIShhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FTQ0FMRSk7CiAKLSNpZiBGRl9BUElfTVBWX09QVAotICAgIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSAgICBpZiAoYXZjdHgtPmJvcmRlcl9tYXNraW5nICE9IDAuMCkKLSAgICAgICAgcy0+Ym9yZGVyX21hc2tpbmcgPSBhdmN0eC0+Ym9yZGVyX21hc2tpbmc7Ci0gICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKLQogICAgIHMtPmFkYXB0aXZlX3F1YW50ID0gKHMtPmF2Y3R4LT5sdW1pX21hc2tpbmcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+ZGFya19tYXNraW5nIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPnRlbXBvcmFsX2NwbHhfbWFza2luZyB8fApAQCAtNTAxLDcgKzQ5Myw3IEBACiAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSAqIGF2X3EyZChhdmN0eC0+dGltZV9iYXNlKSA+CiAgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGVfdG9sZXJhbmNlKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAiYml0cmF0ZSB0b2xlcmFuY2UgJWQgdG9vIHNtYWxsIGZvciBiaXRyYXRlICUiUFJJZDY0Iiwgb3ZlcnJpZGluZ1xuIiwgYXZjdHgtPmJpdF9yYXRlX3RvbGVyYW5jZSwgKGludDY0X3QpYXZjdHgtPmJpdF9yYXRlKTsKKyAgICAgICAgICAgICAgICJiaXRyYXRlIHRvbGVyYW5jZSAlZCB0b28gc21hbGwgZm9yIGJpdHJhdGUgJSJQUklkNjQiLCBvdmVycmlkaW5nXG4iLCBhdmN0eC0+Yml0X3JhdGVfdG9sZXJhbmNlLCBhdmN0eC0+Yml0X3JhdGUpOwogICAgICAgICBhdmN0eC0+Yml0X3JhdGVfdG9sZXJhbmNlID0gNSAqIGF2Y3R4LT5iaXRfcmF0ZSAqIGF2X3EyZChhdmN0eC0+dGltZV9iYXNlKTsKICAgICB9CiAKQEAgLTUzOCw3ICs1MzAsNyBAQAogICAgICAgICBzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHNCAgICAgICYmCiAgICAgICAgIHMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUcxVklERU8gJiYKICAgICAgICAgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImIgZnJhbWVzIG5vdCBzdXBwb3J0ZWQgYnkgY29kZWNcbiIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkItZnJhbWVzIG5vdCBzdXBwb3J0ZWQgYnkgY29kZWNcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGlmIChzLT5tYXhfYl9mcmFtZXMgPCAwKSB7CkBAIC02NDEsNiArNjMzLDE1IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKKyAgICBpZiAoKHMtPm1wdl9mbGFncyAmIEZGX01QVl9GTEFHX1FQX1JEKSAmJgorICAgICAgICAgICAgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNViB8fAorICAgICAgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01KUEVHKSkgeworICAgICAgICAvLyBVc2VkIHRvIHByb2R1Y2UgZ2FyYmFnZSB3aXRoIE1KUEVHLgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJRUCBSRCBpcyBubyBsb25nZXIgY29tcGF0aWJsZSB3aXRoIE1KUEVHIG9yIEFNVlxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKICNpZiBGRl9BUElfUFJJVkFURV9PUFQKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICAgICBpZiAoYXZjdHgtPnNjZW5lY2hhbmdlX3RocmVzaG9sZCkKQEAgLTY1NywxNCArNjU4LDE2IEBACiAgICAgfQogCiAgICAgaWYgKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfTE9XX0RFTEFZKSB7Ci0gICAgICAgIGlmIChzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgICAgIGlmIChzLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmCisgICAgICAgICAgICBzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPj0gRkZfQ09NUExJQU5DRV9OT1JNQUwpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgImxvdyBkZWxheSBmb3JjaW5nIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBtcGVnMlxuIik7CisgICAgICAgICAgICAgICAgICAgImxvdyBkZWxheSBmb3JjaW5nIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBtcGVnMiwgIgorICAgICAgICAgICAgICAgICAgICJzZXQgc3RyaWN0X3N0ZF9jb21wbGlhbmNlIHRvICd1bm9mZmljaWFsJyBvciBsb3dlciBpbiBvcmRlciB0byBhbGxvdyBpdFxuIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHMtPm1heF9iX2ZyYW1lcyAhPSAwKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiYiBmcmFtZXMgY2Fubm90IGJlIHVzZWQgd2l0aCBsb3cgZGVsYXlcbiIpOworICAgICAgICAgICAgICAgICAgICJCLWZyYW1lcyBjYW5ub3QgYmUgdXNlZCB3aXRoIGxvdyBkZWxheVxuIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICB9CkBAIC03NDQsMTUgKzc0Nyw2IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0jaWYgRkZfQVBJX1FVQU5UX0JJQVMKLUZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSAgICBpZiAoYXZjdHgtPmludHJhX3F1YW50X2JpYXMgIT0gRkZfREVGQVVMVF9RVUFOVF9CSUFTKQotICAgICAgICBzLT5pbnRyYV9xdWFudF9iaWFzID0gYXZjdHgtPmludHJhX3F1YW50X2JpYXM7Ci0gICAgaWYgKGF2Y3R4LT5pbnRlcl9xdWFudF9iaWFzICE9IEZGX0RFRkFVTFRfUVVBTlRfQklBUykKLSAgICAgICAgcy0+aW50ZXJfcXVhbnRfYmlhcyA9IGF2Y3R4LT5pbnRlcl9xdWFudF9iaWFzOwotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKLQogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiaW50cmFfcXVhbnRfYmlhcyA9ICVkIGludGVyX3F1YW50X2JpYXMgPSAlZFxuIixzLT5pbnRyYV9xdWFudF9iaWFzLHMtPmludGVyX3F1YW50X2JpYXMpOwogCiAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCAmJgpAQCAtMTAwNSw3ICs5OTksNyBAQAogICAgICAgICAgICAgcy0+aW50cmFfbWF0cml4W2pdID0KICAgICAgICAgICAgIHMtPmludGVyX21hdHJpeFtqXSA9IGZmX21wZWcxX2RlZmF1bHRfbm9uX2ludHJhX21hdHJpeFtpXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIG1wZWcxLzIgKi8KKyAgICAgICAgICAgIC8qIE1QRUctMS8yICovCiAgICAgICAgICAgICBzLT5jaHJvbWFfaW50cmFfbWF0cml4W2pdID0KICAgICAgICAgICAgIHMtPmludHJhX21hdHJpeFtqXSA9IGZmX21wZWcxX2RlZmF1bHRfaW50cmFfbWF0cml4W2ldOwogICAgICAgICAgICAgcy0+aW50ZXJfbWF0cml4W2pdID0gZmZfbXBlZzFfZGVmYXVsdF9ub25faW50cmFfbWF0cml4W2ldOwpAQCAtMTAzMCw1MiArMTAyNCwxNyBAQAogICAgIGlmIChmZl9yYXRlX2NvbnRyb2xfaW5pdChzKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKIAotI2lmIEZGX0FQSV9FUlJPUl9SQVRFCi0gICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGlmIChhdmN0eC0+ZXJyb3JfcmF0ZSkKLSAgICAgICAgcy0+ZXJyb3JfcmF0ZSA9IGF2Y3R4LT5lcnJvcl9yYXRlOwotICAgIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUzsKKyAgICBpZiAoKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzIpICYmIHMtPnJjX3N0cmF0ZWd5ID09IE1QVl9SQ19TVFJBVEVHWV9YVklEKSB7CisjaWYgQ09ORklHX0xJQlhWSUQKKyAgICAgICAgcmV0ID0gZmZfeHZpZF9yYXRlX2NvbnRyb2xfaW5pdChzKTsKKyNlbHNlCisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiWHZpZCByYXRlY29udHJvbCByZXF1aXJlcyBsaWJhdmNvZGVjIGNvbXBpbGVkIHdpdGggWHZpZCBzdXBwb3J0LlxuIik7CiAjZW5kaWYKLQotI2lmIEZGX0FQSV9OT1JNQUxJWkVfQVFQCi0gICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX05PUk1BTElaRV9BUVApCi0gICAgICAgIHMtPm1wdl9mbGFncyB8PSBGRl9NUFZfRkxBR19OQVE7Ci0gICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTOwotI2VuZGlmCi0KLSNpZiBGRl9BUElfTVYwCi0gICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBDT0RFQ19GTEFHX01WMCkKLSAgICAgICAgcy0+bXB2X2ZsYWdzIHw9IEZGX01QVl9GTEFHX01WMDsKLSAgICBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgotCi0jaWYgRkZfQVBJX01QVl9PUFQKLSAgICBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgaWYgKGF2Y3R4LT5yY19xc3F1aXNoICE9IDAuMCkKLSAgICAgICAgcy0+cmNfcXNxdWlzaCA9IGF2Y3R4LT5yY19xc3F1aXNoOwotICAgIGlmIChhdmN0eC0+cmNfcW1vZF9hbXAgIT0gMC4wKQotICAgICAgICBzLT5yY19xbW9kX2FtcCA9IGF2Y3R4LT5yY19xbW9kX2FtcDsKLSAgICBpZiAoYXZjdHgtPnJjX3Ftb2RfZnJlcSkKLSAgICAgICAgcy0+cmNfcW1vZF9mcmVxID0gYXZjdHgtPnJjX3Ftb2RfZnJlcTsKLSAgICBpZiAoYXZjdHgtPnJjX2J1ZmZlcl9hZ2dyZXNzaXZpdHkgIT0gMS4wKQotICAgICAgICBzLT5yY19idWZmZXJfYWdncmVzc2l2aXR5ID0gYXZjdHgtPnJjX2J1ZmZlcl9hZ2dyZXNzaXZpdHk7Ci0gICAgaWYgKGF2Y3R4LT5yY19pbml0aWFsX2NwbHggIT0gMC4wKQotICAgICAgICBzLT5yY19pbml0aWFsX2NwbHggPSBhdmN0eC0+cmNfaW5pdGlhbF9jcGx4OwotICAgIGlmIChhdmN0eC0+bG1pbikKLSAgICAgICAgcy0+bG1pbiA9IGF2Y3R4LT5sbWluOwotICAgIGlmIChhdmN0eC0+bG1heCkKLSAgICAgICAgcy0+bG1heCA9IGF2Y3R4LT5sbWF4OwotCi0gICAgaWYgKGF2Y3R4LT5yY19lcSkgewotICAgICAgICBhdl9mcmVlcCgmcy0+cmNfZXEpOwotICAgICAgICBzLT5yY19lcSA9IGF2X3N0cmR1cChhdmN0eC0+cmNfZXEpOwotICAgICAgICBpZiAoIXMtPnJjX2VxKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSAgICBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgogCiAjaWYgRkZfQVBJX1BSSVZBVEVfT1BUCiAgICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwpAQCAtMTEyMyw2ICsxMDgyLDEwIEBACiAgICAgaW50IGk7CiAKICAgICBmZl9yYXRlX2NvbnRyb2xfdW5pbml0KHMpOworI2lmIENPTkZJR19MSUJYVklECisgICAgaWYgKChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MyKSAmJiBzLT5yY19zdHJhdGVneSA9PSBNUFZfUkNfU1RSQVRFR1lfWFZJRCkKKyAgICAgICAgZmZfeHZpZF9yYXRlX2NvbnRyb2xfdW5pbml0KHMpOworI2VuZGlmCiAKICAgICBmZl9tcHZfY29tbW9uX2VuZChzKTsKICAgICBpZiAoQ09ORklHX01KUEVHX0VOQ09ERVIgJiYKQEAgLTEzMjAsNiArMTI4Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREdFX0JPVFRPTSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZW1tc19jKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhwaWMtPmYsIHBpY19hcmcpOwpAQCAtMTMyNyw3ICsxMjkxLDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAgICAgcGljLT5mLT5kaXNwbGF5X3BpY3R1cmVfbnVtYmVyID0gZGlzcGxheV9waWN0dXJlX251bWJlcjsKLSAgICAgICAgcGljLT5mLT5wdHMgPSBwdHM7IC8vIHdlIHNldCB0aGlzIGhlcmUgdG8gYXZvaWQgbW9kaWZpeWluZyBwaWNfYXJnCisgICAgICAgIHBpYy0+Zi0+cHRzID0gcHRzOyAvLyB3ZSBzZXQgdGhpcyBoZXJlIHRvIGF2b2lkIG1vZGlmeWluZyBwaWNfYXJnCiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogRmx1c2hpbmc6IFdoZW4gd2UgaGF2ZSBub3QgcmVjZWl2ZWQgZW5vdWdoIGlucHV0IGZyYW1lcywKICAgICAgICAgICogZW5zdXJlIHMtPmlucHV0X3BpY3R1cmVbMF0gY29udGFpbnMgdGhlIGZpcnN0IHBpY3R1cmUgKi8KQEAgLTEzOTQsMjkgKzEzNTgsMzggQEAKIHN0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICpjLCBBVkZyYW1lICpmcmFtZSkKIHsKICAgICBBVlBhY2tldCBwa3QgPSB7IDAgfTsKLSAgICBpbnQgcmV0LCBnb3Rfb3V0cHV0OworICAgIGludCByZXQ7CisgICAgaW50IHNpemUgPSAwOwogCiAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7Ci0gICAgcmV0ID0gYXZjb2RlY19lbmNvZGVfdmlkZW8yKGMsICZwa3QsIGZyYW1lLCAmZ290X291dHB1dCk7CisKKyAgICByZXQgPSBhdmNvZGVjX3NlbmRfZnJhbWUoYywgZnJhbWUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgcmV0ID0gcGt0LnNpemU7Ci0gICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwotICAgIHJldHVybiByZXQ7CisgICAgZG8geworICAgICAgICByZXQgPSBhdmNvZGVjX3JlY2VpdmVfcGFja2V0KGMsICZwa3QpOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIHNpemUgKz0gcGt0LnNpemU7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUihFQUdBSU4pICYmIHJldCAhPSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSB3aGlsZSAocmV0ID49IDApOworCisgICAgcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyBpbnQgZXN0aW1hdGVfYmVzdF9iX2NvdW50KE1wZWdFbmNDb250ZXh0ICpzKQogewotICAgIEFWQ29kZWMgKmNvZGVjICAgID0gYXZjb2RlY19maW5kX2VuY29kZXIocy0+YXZjdHgtPmNvZGVjX2lkKTsKLSAgICBBVkNvZGVjQ29udGV4dCAqYyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCk7CisgICAgY29uc3QgQVZDb2RlYyAqY29kZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2RlcihzLT5hdmN0eC0+Y29kZWNfaWQpOwogICAgIGNvbnN0IGludCBzY2FsZSA9IHMtPmJyZF9zY2FsZTsKKyAgICBpbnQgd2lkdGggID0gcy0+d2lkdGggID4+IHNjYWxlOworICAgIGludCBoZWlnaHQgPSBzLT5oZWlnaHQgPj4gc2NhbGU7CiAgICAgaW50IGksIGosIG91dF9zaXplLCBwX2xhbWJkYSwgYl9sYW1iZGEsIGxhbWJkYTI7CiAgICAgaW50NjRfdCBiZXN0X3JkICA9IElOVDY0X01BWDsKICAgICBpbnQgYmVzdF9iX2NvdW50ID0gLTE7CisgICAgaW50IHJldCA9IDA7CiAKLSAgICBpZiAoIWMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZfYXNzZXJ0MChzY2FsZSA+PSAwICYmIHNjYWxlIDw9IDMpOwogCiAgICAgLy9lbW1zX2MoKTsKQEAgLTE0MjksMjEgKzE0MDIsNiBAQAogICAgIGxhbWJkYTIgID0gKGJfbGFtYmRhICogYl9sYW1iZGEgKyAoMSA8PCBGRl9MQU1CREFfU0hJRlQpIC8gMikgPj4KICAgICAgICAgICAgICAgIEZGX0xBTUJEQV9TSElGVDsKIAotICAgIGMtPndpZHRoICAgICAgICA9IHMtPndpZHRoICA+PiBzY2FsZTsKLSAgICBjLT5oZWlnaHQgICAgICAgPSBzLT5oZWlnaHQgPj4gc2NhbGU7Ci0gICAgYy0+ZmxhZ3MgICAgICAgID0gQVZfQ09ERUNfRkxBR19RU0NBTEUgfCBBVl9DT0RFQ19GTEFHX1BTTlI7Ci0gICAgYy0+ZmxhZ3MgICAgICAgfD0gcy0+YXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19RUEVMOwotICAgIGMtPm1iX2RlY2lzaW9uICA9IHMtPmF2Y3R4LT5tYl9kZWNpc2lvbjsKLSAgICBjLT5tZV9jbXAgICAgICAgPSBzLT5hdmN0eC0+bWVfY21wOwotICAgIGMtPm1iX2NtcCAgICAgICA9IHMtPmF2Y3R4LT5tYl9jbXA7Ci0gICAgYy0+bWVfc3ViX2NtcCAgID0gcy0+YXZjdHgtPm1lX3N1Yl9jbXA7Ci0gICAgYy0+cGl4X2ZtdCAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjBQOwotICAgIGMtPnRpbWVfYmFzZSAgICA9IHMtPmF2Y3R4LT50aW1lX2Jhc2U7Ci0gICAgYy0+bWF4X2JfZnJhbWVzID0gcy0+bWF4X2JfZnJhbWVzOwotCi0gICAgaWYgKGF2Y29kZWNfb3BlbjIoYywgY29kZWMsIE5VTEwpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1heF9iX2ZyYW1lcyArIDI7IGkrKykgewogICAgICAgICBQaWN0dXJlIHByZV9pbnB1dCwgKnByZV9pbnB1dF9wdHIgPSBpID8gcy0+aW5wdXRfcGljdHVyZVtpIC0gMV0gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmV4dF9waWN0dXJlX3B0cjsKQEAgLTE0NjMsMzIgKzE0MjEsNTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF9mcmFtZXNbaV0tPmxpbmVzaXplWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9pbnB1dC5mLT5saW5lc2l6ZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPndpZHRoLCBjLT5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBzLT5tcHZlbmNkc3Auc2hyaW5rW3NjYWxlXShzLT50bXBfZnJhbWVzW2ldLT5kYXRhWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dG1wX2ZyYW1lc1tpXS0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlX2lucHV0LmYtPmxpbmVzaXplWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+d2lkdGggPj4gMSwgYy0+aGVpZ2h0ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPj4gMSwgaGVpZ2h0ID4+IDEpOwogICAgICAgICAgICAgcy0+bXB2ZW5jZHNwLnNocmlua1tzY2FsZV0ocy0+dG1wX2ZyYW1lc1tpXS0+ZGF0YVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRtcF9mcmFtZXNbaV0tPmxpbmVzaXplWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZV9pbnB1dC5mLT5saW5lc2l6ZVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPndpZHRoID4+IDEsIGMtPmhlaWdodCA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID4+IDEsIGhlaWdodCA+PiAxKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGZvciAoaiA9IDA7IGogPCBzLT5tYXhfYl9mcmFtZXMgKyAxOyBqKyspIHsKKyAgICAgICAgQVZDb2RlY0NvbnRleHQgKmM7CiAgICAgICAgIGludDY0X3QgcmQgPSAwOwogCiAgICAgICAgIGlmICghcy0+aW5wdXRfcGljdHVyZVtqXSkKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGMtPmVycm9yWzBdID0gYy0+ZXJyb3JbMV0gPSBjLT5lcnJvclsyXSA9IDA7CisgICAgICAgIGMgPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworICAgICAgICBpZiAoIWMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGMtPndpZHRoICAgICAgICA9IHdpZHRoOworICAgICAgICBjLT5oZWlnaHQgICAgICAgPSBoZWlnaHQ7CisgICAgICAgIGMtPmZsYWdzICAgICAgICA9IEFWX0NPREVDX0ZMQUdfUVNDQUxFIHwgQVZfQ09ERUNfRkxBR19QU05SOworICAgICAgICBjLT5mbGFncyAgICAgICB8PSBzLT5hdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FQRUw7CisgICAgICAgIGMtPm1iX2RlY2lzaW9uICA9IHMtPmF2Y3R4LT5tYl9kZWNpc2lvbjsKKyAgICAgICAgYy0+bWVfY21wICAgICAgID0gcy0+YXZjdHgtPm1lX2NtcDsKKyAgICAgICAgYy0+bWJfY21wICAgICAgID0gcy0+YXZjdHgtPm1iX2NtcDsKKyAgICAgICAgYy0+bWVfc3ViX2NtcCAgID0gcy0+YXZjdHgtPm1lX3N1Yl9jbXA7CisgICAgICAgIGMtPnBpeF9mbXQgICAgICA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgYy0+dGltZV9iYXNlICAgID0gcy0+YXZjdHgtPnRpbWVfYmFzZTsKKyAgICAgICAgYy0+bWF4X2JfZnJhbWVzID0gcy0+bWF4X2JfZnJhbWVzOworCisgICAgICAgIHJldCA9IGF2Y29kZWNfb3BlbjIoYywgY29kZWMsIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKIAogICAgICAgICBzLT50bXBfZnJhbWVzWzBdLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKICAgICAgICAgcy0+dG1wX2ZyYW1lc1swXS0+cXVhbGl0eSAgID0gMSAqIEZGX1FQMkxBTUJEQTsKIAogICAgICAgICBvdXRfc2l6ZSA9IGVuY29kZV9mcmFtZShjLCBzLT50bXBfZnJhbWVzWzBdKTsKKyAgICAgICAgaWYgKG91dF9zaXplIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gb3V0X3NpemU7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KIAogICAgICAgICAvL3JkICs9IChvdXRfc2l6ZSAqIGxhbWJkYTIpID4+IEZGX0xBTUJEQV9TSElGVDsKIApAQCAtMTUwMCwxNSArMTQ4MSwyMSBAQAogICAgICAgICAgICAgcy0+dG1wX2ZyYW1lc1tpICsgMV0tPnF1YWxpdHkgICA9IGlzX3AgPyBwX2xhbWJkYSA6IGJfbGFtYmRhOwogCiAgICAgICAgICAgICBvdXRfc2l6ZSA9IGVuY29kZV9mcmFtZShjLCBzLT50bXBfZnJhbWVzW2kgKyAxXSk7CisgICAgICAgICAgICBpZiAob3V0X3NpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gb3V0X3NpemU7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZCArPSAob3V0X3NpemUgKiBsYW1iZGEyKSA+PiAoRkZfTEFNQkRBX1NISUZUIC0gMyk7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBnZXQgdGhlIGRlbGF5ZWQgZnJhbWVzICovCi0gICAgICAgIHdoaWxlIChvdXRfc2l6ZSkgewotICAgICAgICAgICAgb3V0X3NpemUgPSBlbmNvZGVfZnJhbWUoYywgTlVMTCk7Ci0gICAgICAgICAgICByZCArPSAob3V0X3NpemUgKiBsYW1iZGEyKSA+PiAoRkZfTEFNQkRBX1NISUZUIC0gMyk7CisgICAgICAgIG91dF9zaXplID0gZW5jb2RlX2ZyYW1lKGMsIE5VTEwpOworICAgICAgICBpZiAob3V0X3NpemUgPCAwKSB7CisgICAgICAgICAgICByZXQgPSBvdXRfc2l6ZTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQorICAgICAgICByZCArPSAob3V0X3NpemUgKiBsYW1iZGEyKSA+PiAoRkZfTEFNQkRBX1NISUZUIC0gMyk7CiAKICAgICAgICAgcmQgKz0gYy0+ZXJyb3JbMF0gKyBjLT5lcnJvclsxXSArIGMtPmVycm9yWzJdOwogCkBAIC0xNTE2LDEwICsxNTAzLDEyIEBACiAgICAgICAgICAgICBiZXN0X3JkID0gcmQ7CiAgICAgICAgICAgICBiZXN0X2JfY291bnQgPSBqOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgYXZjb2RlY19jbG9zZShjKTsKLSAgICBhdl9mcmVlcCgmYyk7CitmYWlsOgorICAgICAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmYyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKICAgICByZXR1cm4gYmVzdF9iX2NvdW50OwogfQpAQCAtMTUzOCw3ICsxNTI3LDcgQEAKICAgICAgICAgICAgIGlmIChzLT5waWN0dXJlX2luX2dvcF9udW1iZXIgPCBzLT5nb3Bfc2l6ZSAmJgogICAgICAgICAgICAgICAgIHMtPm5leHRfcGljdHVyZV9wdHIgJiYKICAgICAgICAgICAgICAgICBza2lwX2NoZWNrKHMsIHMtPmlucHV0X3BpY3R1cmVbMF0sIHMtPm5leHRfcGljdHVyZV9wdHIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gRklYTUUgY2hlY2sgdGhhdCB0ZSBnb3AgY2hlY2sgYWJvdmUgaXMgKy0xIGNvcnJlY3QKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBjaGVjayB0aGF0IHRoZSBnb3AgY2hlY2sgYWJvdmUgaXMgKy0xIGNvcnJlY3QKICAgICAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5pbnB1dF9waWN0dXJlWzBdLT5mKTsKIAogICAgICAgICAgICAgICAgIGZmX3Zidl91cGRhdGUocywgMCk7CkBAIC0xNjAyLDYgKzE1OTEsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+Yl9mcmFtZV9zdHJhdGVneSA9PSAyKSB7CiAgICAgICAgICAgICAgICAgYl9mcmFtZXMgPSBlc3RpbWF0ZV9iZXN0X2JfY291bnQocyk7CisgICAgICAgICAgICAgICAgaWYgKGJfZnJhbWVzIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJfZnJhbWVzOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBlbW1zX2MoKTsKQEAgLTE2MTQsNyArMTYwNSw3IEBACiAgICAgICAgICAgICBpZiAocy0+aW5wdXRfcGljdHVyZVtiX2ZyYW1lc10tPmYtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJgogICAgICAgICAgICAgICAgIGJfZnJhbWVzID09IHMtPm1heF9iX2ZyYW1lcykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZywgdG9vIG1hbnkgYiBmcmFtZXMgaW4gYSByb3dcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAid2FybmluZywgdG9vIG1hbnkgQi1mcmFtZXMgaW4gYSByb3dcbiIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocy0+cGljdHVyZV9pbl9nb3BfbnVtYmVyICsgYl9mcmFtZXMgPj0gcy0+Z29wX3NpemUpIHsKQEAgLTE2NTgsNyArMTY0OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgIGlmIChzLT5yZW9yZGVyZWRfaW5wdXRfcGljdHVyZVswXS0+c2hhcmVkIHx8IHMtPmF2Y3R4LT5yY19idWZmZXJfc2l6ZSkgewotICAgICAgICAgICAgLy8gaW5wdXQgaXMgYSBzaGFyZWQgcGl4LCBzbyB3ZSBjYW4ndCBtb2RpZml5IGl0IC0+IGFsbG9jIGEgbmV3CisgICAgICAgICAgICAvLyBpbnB1dCBpcyBhIHNoYXJlZCBwaXgsIHNvIHdlIGNhbid0IG1vZGlmeSBpdCAtPiBhbGxvY2F0ZSBhIG5ldwogICAgICAgICAgICAgLy8gb25lICYgZW5zdXJlIHRoYXQgdGhlIHNoYXJlZCBvbmUgaXMgcmV1c2VhYmxlCiAKICAgICAgICAgICAgIFBpY3R1cmUgKnBpYzsKQEAgLTE3MzYsNiArMTcyNyw3IEBACiAKICNpZiBGRl9BUElfQ09ERURfRlJBTUUKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBhdl9mcmFtZV91bnJlZihzLT5hdmN0eC0+Y29kZWRfZnJhbWUpOwogICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMocy0+YXZjdHgtPmNvZGVkX2ZyYW1lLCBzLT5jdXJyZW50X3BpY3R1cmUuZik7CiBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICNlbmRpZgpAQCAtMjAwOSw3ICsyMDAxLDcgQEAKICAgICAgICAgICAgIHMtPmZyYW1lX2JpdHMgID0gcHV0X2JpdHNfY291bnQoJnMtPnBiKTsKICAgICAgICAgfQogCi0gICAgICAgIC8qIHVwZGF0ZSBtcGVnMS8yIHZidl9kZWxheSBmb3IgQ0JSICovCisgICAgICAgIC8qIHVwZGF0ZSBNUEVHLTEvMiB2YnZfZGVsYXkgZm9yIENCUiAqLwogICAgICAgICBpZiAocy0+YXZjdHgtPnJjX21heF9yYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgcy0+YXZjdHgtPnJjX21pbl9yYXRlID09IHMtPmF2Y3R4LT5yY19tYXhfcmF0ZSAmJgogICAgICAgICAgICAgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfTVBFRzEgICAgICAgICAgICAgICAgICAgICAmJgpAQCAtMjI3NSw3ICsyMjY3LDcgQEAKICAgICAgICAgICAgICAobWJfeSAqIG1iX2Jsb2NrX2hlaWdodCAqIHdyYXBfYykgKyBtYl94ICogbWJfYmxvY2tfd2lkdGg7CiAKICAgICBpZigobWJfeCAqIDE2ICsgMTYgPiBzLT53aWR0aCB8fCBtYl95ICogMTYgKyAxNiA+IHMtPmhlaWdodCkgJiYgcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQU1WKXsKLSAgICAgICAgdWludDhfdCAqZWJ1ZiA9IHMtPnNjLmVkZ2VfZW11X2J1ZmZlciArIDM2ICogd3JhcF95OworICAgICAgICB1aW50OF90ICplYnVmID0gcy0+c2MuZWRnZV9lbXVfYnVmZmVyICsgMzggKiB3cmFwX3k7CiAgICAgICAgIGludCBjdyA9IChzLT53aWR0aCAgKyBzLT5jaHJvbWFfeF9zaGlmdCkgPj4gcy0+Y2hyb21hX3hfc2hpZnQ7CiAgICAgICAgIGludCBjaCA9IChzLT5oZWlnaHQgKyBzLT5jaHJvbWFfeV9zaGlmdCkgPj4gcy0+Y2hyb21hX3lfc2hpZnQ7CiAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhlYnVmLCBwdHJfeSwKQEAgLTI2MDcsNyArMjU5OSw3IEBACiAKICAgICBtZW1jcHkoZC0+bGFzdF9tdiwgcy0+bGFzdF9tdiwgMioyKjIqc2l6ZW9mKGludCkpOyAvL0ZJWE1FIGlzIG1lbWNweSBmYXN0ZXIgdGhhbiBhIGxvb3A/CiAKLSAgICAvKiBtcGVnMSAqLworICAgIC8qIE1QRUctMSAqLwogICAgIGQtPm1iX3NraXBfcnVuPSBzLT5tYl9za2lwX3J1bjsKICAgICBmb3IoaT0wOyBpPDM7IGkrKykKICAgICAgICAgZC0+bGFzdF9kY1tpXSA9IHMtPmxhc3RfZGNbaV07CkBAIC0yNjM2LDcgKzI2MjgsNyBAQAogICAgIG1lbWNweShkLT5tdiwgcy0+bXYsIDIqNCoyKnNpemVvZihpbnQpKTsKICAgICBtZW1jcHkoZC0+bGFzdF9tdiwgcy0+bGFzdF9tdiwgMioyKjIqc2l6ZW9mKGludCkpOyAvL0ZJWE1FIGlzIG1lbWNweSBmYXN0ZXIgdGhhbiBhIGxvb3A/CiAKLSAgICAvKiBtcGVnMSAqLworICAgIC8qIE1QRUctMSAqLwogICAgIGQtPm1iX3NraXBfcnVuPSBzLT5tYl9za2lwX3J1bjsKICAgICBmb3IoaT0wOyBpPDM7IGkrKykKICAgICAgICAgZC0+bGFzdF9kY1tpXSA9IHMtPmxhc3RfZGNbaV07CkBAIC0yNzAyLDcgKzI2OTQsNyBAQAogICAgIH0KIAogICAgIGlmKHMtPmF2Y3R4LT5tYl9kZWNpc2lvbiA9PSBGRl9NQl9ERUNJU0lPTl9SRCl7Ci0gICAgICAgIGZmX21wdl9kZWNvZGVfbWIocywgcy0+YmxvY2spOworICAgICAgICBmZl9tcHZfcmVjb25zdHJ1Y3RfbWIocywgcy0+YmxvY2spOwogCiAgICAgICAgIHNjb3JlICo9IHMtPmxhbWJkYTI7CiAgICAgICAgIHNjb3JlICs9IHNzZV9tYihzKSA8PCBGRl9MQU1CREFfU0hJRlQ7CkBAIC0yNzIxLDcgKzI3MTMsNyBAQAogfQogCiBzdGF0aWMgaW50IHNzZShNcGVnRW5jQ29udGV4dCAqcywgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKXsKLSAgICB1aW50MzJfdCAqc3EgPSBmZl9zcXVhcmVfdGFiICsgMjU2OworICAgIGNvbnN0IHVpbnQzMl90ICpzcSA9IGZmX3NxdWFyZV90YWIgKyAyNTY7CiAgICAgaW50IGFjYz0wOwogICAgIGludCB4LHk7CiAKQEAgLTI5MTIsNiArMjkwNCw4IEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CiAKKyAgICAgICAgZW1tc19jKCk7CisKICAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZuZXdfYnVmZmVyLCAmbmV3X2J1ZmZlcl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlcl9zaXplICsgc2l6ZV9pbmNyZWFzZSk7CiAgICAgICAgIGlmICghbmV3X2J1ZmZlcikKQEAgLTI5MzIsNyArMjkyNiw3IEBACiAKIHN0YXRpYyBpbnQgZW5jb2RlX3RocmVhZChBVkNvZGVjQ29udGV4dCAqYywgdm9pZCAqYXJnKXsKICAgICBNcGVnRW5jQ29udGV4dCAqcz0gKih2b2lkKiopYXJnOwotICAgIGludCBtYl94LCBtYl95LCBwZGlmID0gMDsKKyAgICBpbnQgbWJfeCwgbWJfeTsKICAgICBpbnQgY2hyX2g9IDE2Pj5zLT5jaHJvbWFfeV9zaGlmdDsKICAgICBpbnQgaSwgajsKICAgICBNcGVnRW5jQ29udGV4dCBiZXN0X3MgPSB7IDAgfSwgYmFja3VwX3M7CkBAIC0zNDA1LDcgKzMzOTksNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmKHMtPmF2Y3R4LT5tYl9kZWNpc2lvbiA9PSBGRl9NQl9ERUNJU0lPTl9CSVRTKQotICAgICAgICAgICAgICAgICAgICBmZl9tcHZfZGVjb2RlX21iKHMsIHMtPmJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgZmZfbXB2X3JlY29uc3RydWN0X21iKHMsIHMtPmJsb2NrKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94ID0gMCwgbW90aW9uX3kgPSAwOwogICAgICAgICAgICAgICAgIHMtPm12X3R5cGU9TVZfVFlQRV8xNlgxNjsKQEAgLTM1MjQsMTAgKzM1MTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MyAmJiBzLT5waWN0X3R5cGUhPUFWX1BJQ1RVUkVfVFlQRV9CKQogICAgICAgICAgICAgICAgICAgICBmZl9oMjYzX3VwZGF0ZV9tb3Rpb25fdmFsKHMpOwogCi0gICAgICAgICAgICAgICAgZmZfbXB2X2RlY29kZV9tYihzLCBzLT5ibG9jayk7CisgICAgICAgICAgICAgICAgZmZfbXB2X3JlY29uc3RydWN0X21iKHMsIHMtPmJsb2NrKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLyogY2xlYW4gdGhlIE1WIHRhYmxlIGluIElQUyBmcmFtZXMgZm9yIGRpcmVjdCBtb2RlIGluIEIgZnJhbWVzICovCisgICAgICAgICAgICAvKiBjbGVhbiB0aGUgTVYgdGFibGUgaW4gSVBTIGZyYW1lcyBmb3IgZGlyZWN0IG1vZGUgaW4gQi1mcmFtZXMgKi8KICAgICAgICAgICAgIGlmKHMtPm1iX2ludHJhIC8qICYmIEksUCxTX1RZUEUgKi8pewogICAgICAgICAgICAgICAgIHMtPnBfbXZfdGFibGVbeHldWzBdPTA7CiAgICAgICAgICAgICAgICAgcy0+cF9tdl90YWJsZVt4eV1bMV09MDsKQEAgLTM1NzAsNyArMzU2NCw3IEBACiAgICAgLyogU2VuZCB0aGUgbGFzdCBHT0IgaWYgUlRQICovCiAgICAgaWYgKHMtPmF2Y3R4LT5ydHBfY2FsbGJhY2spIHsKICAgICAgICAgaW50IG51bWJlcl9tYiA9IChtYl95IC0gcy0+cmVzeW5jX21iX3kpKnMtPm1iX3dpZHRoIC0gcy0+cmVzeW5jX21iX3g7Ci0gICAgICAgIHBkaWYgPSBwdXRfYml0c19wdHIoJnMtPnBiKSAtIHMtPnB0cl9sYXN0Z29iOworICAgICAgICBpbnQgcGRpZiA9IHB1dF9iaXRzX3B0cigmcy0+cGIpIC0gcy0+cHRyX2xhc3Rnb2I7CiAgICAgICAgIC8qIENhbGwgdGhlIFJUUCBjYWxsYmFjayB0byBzZW5kIHRoZSBsYXN0IEdPQiAqLwogICAgICAgICBlbW1zX2MoKTsKICAgICAgICAgcy0+YXZjdHgtPnJ0cF9jYWxsYmFjayhzLT5hdmN0eCwgcy0+cHRyX2xhc3Rnb2IsIHBkaWYsIG51bWJlcl9tYik7CkBAIC0zNjI2LDggKzM2MjAsMTUgQEAKICAgICAgICAgcy0+Y3VycmVudF9waWN0dXJlLmYtPnF1YWxpdHkgPSBzLT5uZXh0X2xhbWJkYTsKICAgICAgICAgaWYoIWRyeV9ydW4pIHMtPm5leHRfbGFtYmRhPSAwOwogICAgIH0gZWxzZSBpZiAoIXMtPmZpeGVkX3FzY2FsZSkgeworICAgICAgICBpbnQgcXVhbGl0eTsKKyNpZiBDT05GSUdfTElCWFZJRAorICAgICAgICBpZiAoKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzIpICYmIHMtPnJjX3N0cmF0ZWd5ID09IE1QVl9SQ19TVFJBVEVHWV9YVklEKQorICAgICAgICAgICAgcXVhbGl0eSA9IGZmX3h2aWRfcmF0ZV9lc3RpbWF0ZV9xc2NhbGUocywgZHJ5X3J1bik7CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICBxdWFsaXR5ID0gZmZfcmF0ZV9lc3RpbWF0ZV9xc2NhbGUocywgZHJ5X3J1bik7CiAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPnF1YWxpdHkgPQotICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+cXVhbGl0eSA9IGZmX3JhdGVfZXN0aW1hdGVfcXNjYWxlKHMsIGRyeV9ydW4pOworICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUuZi0+cXVhbGl0eSA9IHF1YWxpdHk7CiAgICAgICAgIGlmIChzLT5jdXJyZW50X3BpY3R1cmUuZi0+cXVhbGl0eSA8IDApCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMzY4Myw3ICszNjg0LDcgQEAKICAgICBzLT5tZS5tYl92YXJfc3VtX3RlbXAgICAgPQogICAgIHMtPm1lLm1jX21iX3Zhcl9zdW1fdGVtcCA9IDA7CiAKLSAgICAvKiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgc29tZSB0aW1lIHZhcnMgYmVmb3JlIHdlIGNhbiBlbmNvZGUgYi1mcmFtZXMgKi8KKyAgICAvKiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgc29tZSB0aW1lIHZhcnMgYmVmb3JlIHdlIGNhbiBlbmNvZGUgQi1mcmFtZXMgKi8KICAgICAvLyBSQUw6IENvbmRpdGlvbiBhZGRlZCBmb3IgTVBFRzFWSURFTwogICAgIGlmIChzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPIHx8IHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gfHwgKHMtPmgyNjNfcHJlZCAmJiAhcy0+bXNtcGVnNF92ZXJzaW9uKSkKICAgICAgICAgc2V0X2ZyYW1lX2Rpc3RhbmNlcyhzKTsKQEAgLTM4OTQsNyArMzg5NSw3IEBACiAgICAgcy0+bGFzdF9iaXRzPSBwdXRfYml0c19jb3VudCgmcy0+cGIpOwogICAgIHN3aXRjaChzLT5vdXRfZm9ybWF0KSB7CiAgICAgY2FzZSBGTVRfTUpQRUc6Ci0gICAgICAgIGlmIChDT05GSUdfTUpQRUdfRU5DT0RFUikKKyAgICAgICAgaWYgKENPTkZJR19NSlBFR19FTkNPREVSICYmIHMtPmh1ZmZtYW4gIT0gSFVGRk1BTl9UQUJMRV9PUFRJTUFMKQogICAgICAgICAgICAgZmZfbWpwZWdfZW5jb2RlX3BpY3R1cmVfaGVhZGVyKHMtPmF2Y3R4LCAmcy0+cGIsICZzLT5pbnRyYV9zY2FudGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJlZCwgcy0+aW50cmFfbWF0cml4LCBzLT5jaHJvbWFfaW50cmFfbWF0cml4KTsKICAgICAgICAgYnJlYWs7CkBAIC0zOTc1LDggKzM5NzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxc2NhbGUsIGludCAqb3ZlcmZsb3cpewogICAgIGNvbnN0IGludCAqcW1hdDsKICAgICBjb25zdCB1aW50MTZfdCAqbWF0cml4OwotICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZT0gcy0+aW50cmFfc2NhbnRhYmxlLnNjYW50YWJsZTsKLSAgICBjb25zdCB1aW50OF90ICpwZXJtX3NjYW50YWJsZT0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlOworICAgIGNvbnN0IHVpbnQ4X3QgKnBlcm1fc2NhbnRhYmxlOwogICAgIGludCBtYXg9MDsKICAgICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkMSwgdGhyZXNob2xkMjsKICAgICBpbnQgYmlhcz0wOwpAQCAtNDAxMCw2ICs0MDExLDggQEAKIAogICAgIGlmIChzLT5tYl9pbnRyYSkgewogICAgICAgICBpbnQgcTsKKyAgICAgICAgc2NhbnRhYmxlPSBzLT5pbnRyYV9zY2FudGFibGUuc2NhbnRhYmxlOworICAgICAgICBwZXJtX3NjYW50YWJsZT0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CiAgICAgICAgIGlmICghcy0+aDI2M19haWMpIHsKICAgICAgICAgICAgIGlmIChuIDwgNCkKICAgICAgICAgICAgICAgICBxID0gcy0+eV9kY19zY2FsZTsKQEAgLTQwMzksNiArNDA0Miw4IEBACiAgICAgICAgICAgICBsYXN0X2xlbmd0aD0gcy0+aW50cmFfYWNfdmxjX2xhc3RfbGVuZ3RoOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgICAgc2NhbnRhYmxlPSBzLT5pbnRlcl9zY2FudGFibGUuc2NhbnRhYmxlOworICAgICAgICBwZXJtX3NjYW50YWJsZT0gcy0+aW50ZXJfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CiAgICAgICAgIHN0YXJ0X2kgPSAwOwogICAgICAgICBsYXN0X25vbl96ZXJvID0gLTE7CiAgICAgICAgIHFtYXQgPSBzLT5xX2ludGVyX21hdHJpeFtxc2NhbGVdOwpAQCAtNDEyMSw3ICs0MTI2LDcgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZihzLT5vdXRfZm9ybWF0ID09IEZNVF9NSlBFRykgewogICAgICAgICAgICAgICAgIGogPSBzLT5pZHNwLmlkY3RfcGVybXV0YXRpb25bc2NhbnRhYmxlW2ldXTsKICAgICAgICAgICAgICAgICB1bnF1YW50X2NvZWZmID0gYWxldmVsICogbWF0cml4W2pdICogODsKLSAgICAgICAgICAgIH1lbHNleyAvL01QRUcxCisgICAgICAgICAgICB9ZWxzZXsgLy8gTVBFRy0xCiAgICAgICAgICAgICAgICAgaiA9IHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltzY2FudGFibGVbaV1dOyAvLyBGSVhNRTogb3B0aW1pemUKICAgICAgICAgICAgICAgICBpZihzLT5tYl9pbnRyYSl7CiAgICAgICAgICAgICAgICAgICAgICAgICB1bnF1YW50X2NvZWZmID0gKGludCkoICBhbGV2ZWwgICogbXBlZzJfcXNjYWxlICogbWF0cml4W2pdKSA+PiA0OwpAQCAtNDE5MSw3ICs0MTk2LDcgQEAKIAogICAgICAgICBzY29yZV90YWJbaSsxXT0gYmVzdF9zY29yZTsKIAotICAgICAgICAvL05vdGU6IHRoZXJlIGlzIGEgdmxjIGNvZGUgaW4gbXBlZzQgd2hpY2ggaXMgMSBiaXQgc2hvcnRlciB0aGVuIGFub3RoZXIgb25lIHdpdGggYSBzaG9ydGVyIHJ1biBhbmQgdGhlIHNhbWUgbGV2ZWwKKyAgICAgICAgLy8gTm90ZTogdGhlcmUgaXMgYSB2bGMgY29kZSBpbiBNUEVHLTQgd2hpY2ggaXMgMSBiaXQgc2hvcnRlciB0aGVuIGFub3RoZXIgb25lIHdpdGggYSBzaG9ydGVyIHJ1biBhbmQgdGhlIHNhbWUgbGV2ZWwKICAgICAgICAgaWYobGFzdF9ub25femVybyA8PSAyNyl7CiAgICAgICAgICAgICBmb3IoOyBzdXJ2aXZvcl9jb3VudDsgc3Vydml2b3JfY291bnQtLSl7CiAgICAgICAgICAgICAgICAgaWYoc2NvcmVfdGFiWyBzdXJ2aXZvcltzdXJ2aXZvcl9jb3VudC0xXSBdIDw9IGJlc3Rfc2NvcmUpCkBAIC00MjExLDcgKzQyMTYsOCBAQAogICAgICAgICBsYXN0X3Njb3JlPSAyNTYqMjU2KjI1NioxMjA7CiAgICAgICAgIGZvcihpPSBzdXJ2aXZvclswXTsgaTw9bGFzdF9ub25femVybyArIDE7IGkrKyl7CiAgICAgICAgICAgICBpbnQgc2NvcmU9IHNjb3JlX3RhYltpXTsKLSAgICAgICAgICAgIGlmKGkpIHNjb3JlICs9IGxhbWJkYSoyOyAvL0ZJWE1FIGV4YWN0ZXI/CisgICAgICAgICAgICBpZiAoaSkKKyAgICAgICAgICAgICAgICBzY29yZSArPSBsYW1iZGEgKiAyOyAvLyBGSVhNRSBtb3JlIGV4YWN0PwogCiAgICAgICAgICAgICBpZihzY29yZSA8IGxhc3Rfc2NvcmUpewogICAgICAgICAgICAgICAgIGxhc3Rfc2NvcmU9IHNjb3JlOwpAQCAtNDI0Miw3ICs0MjQ4LDcgQEAKIAogICAgICAgICAgICAgaWYocy0+b3V0X2Zvcm1hdCA9PSBGTVRfSDI2MyB8fCBzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYxKXsKICAgICAgICAgICAgICAgICAgICAgdW5xdWFudF9jb2VmZj0gKGFsZXZlbCpxbXVsICsgcWFkZCk+PjM7Ci0gICAgICAgICAgICB9ZWxzZXsgLy9NUEVHMQorICAgICAgICAgICAgfSBlbHNleyAvLyBNUEVHLTEKICAgICAgICAgICAgICAgICAgICAgdW5xdWFudF9jb2VmZiA9ICgoKCAgYWxldmVsICA8PCAxKSArIDEpICogbXBlZzJfcXNjYWxlICogKChpbnQpIG1hdHJpeFswXSkpID4+IDU7CiAgICAgICAgICAgICAgICAgICAgIHVucXVhbnRfY29lZmYgPSAgICh1bnF1YW50X2NvZWZmIC0gMSkgfCAxOwogICAgICAgICAgICAgfQpAQCAtNDMwNSw4ICs0MzExLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgcXNjYWxlKXsKICAgICBpbnQxNl90IHJlbVs2NF07CiAgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBkMSwgWzY0XSk7Ci0gICAgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlPSBzLT5pbnRyYV9zY2FudGFibGUuc2NhbnRhYmxlOwotICAgIGNvbnN0IHVpbnQ4X3QgKnBlcm1fc2NhbnRhYmxlPSBzLT5pbnRyYV9zY2FudGFibGUucGVybXV0YXRlZDsKKyAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGU7CisgICAgY29uc3QgdWludDhfdCAqcGVybV9zY2FudGFibGU7CiAvLyAgICB1bnNpZ25lZCBpbnQgdGhyZXNob2xkMSwgdGhyZXNob2xkMjsKIC8vICAgIGludCBiaWFzPTA7CiAgICAgaW50IHJ1bl90YWJbNjVdOwpAQCAtNDMzMyw2ICs0MzM5LDggQEAKICAgICBxbXVsPSBxc2NhbGUqMjsKICAgICBxYWRkPSAocXNjYWxlLTEpfDE7CiAgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIHNjYW50YWJsZT0gcy0+aW50cmFfc2NhbnRhYmxlLnNjYW50YWJsZTsKKyAgICAgICAgcGVybV9zY2FudGFibGU9IHMtPmludHJhX3NjYW50YWJsZS5wZXJtdXRhdGVkOwogICAgICAgICBpZiAoIXMtPmgyNjNfYWljKSB7CiAgICAgICAgICAgICBpZiAobiA8IDQpCiAgICAgICAgICAgICAgICAgcSA9IHMtPnlfZGNfc2NhbGU7CkBAIC00MzU4LDYgKzQzNjYsOCBAQAogICAgICAgICAgICAgbGFzdF9sZW5ndGg9IHMtPmludHJhX2FjX3ZsY19sYXN0X2xlbmd0aDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CisgICAgICAgIHNjYW50YWJsZT0gcy0+aW50ZXJfc2NhbnRhYmxlLnNjYW50YWJsZTsKKyAgICAgICAgcGVybV9zY2FudGFibGU9IHMtPmludGVyX3NjYW50YWJsZS5wZXJtdXRhdGVkOwogICAgICAgICBkYz0gMDsKICAgICAgICAgc3RhcnRfaSA9IDA7CiAgICAgICAgIGxlbmd0aCAgICAgPSBzLT5pbnRlcl9hY192bGNfbGVuZ3RoOwpAQCAtNDM3MCw3ICs0MzgwLDcgQEAKICNlbmRpZgogICAgIGRjICs9ICgxPDwoUkVDT05fU0hJRlQtMSkpOwogICAgIGZvcihpPTA7IGk8NjQ7IGkrKyl7Ci0gICAgICAgIHJlbVtpXT0gZGMgLSAob3JpZ1tpXTw8UkVDT05fU0hJRlQpOyAvL0ZJWE1FICB1c2Ugb3JpZyBkaXJyZWN0bHkgaW5zdGVhZCBvZiBjb3B5aW5nIHRvIHJlbVtdCisgICAgICAgIHJlbVtpXSA9IGRjIC0gKG9yaWdbaV0gPDwgUkVDT05fU0hJRlQpOyAvLyBGSVhNRSB1c2Ugb3JpZyBkaXJlY3RseSBpbnN0ZWFkIG9mIGNvcHlpbmcgdG8gcmVtW10KICAgICB9CiAjaWZkZWYgUkVGSU5FX1NUQVRTCiBTVE9QX1RJTUVSKCJtZW1zZXQgcmVtW10iKX0KQEAgLTQ2ODEsNyArNDY5MSw3IEBACiB9CiAKIC8qKgotICogUGVybXV0ZSBhbiA4eDggYmxvY2sgYWNjb3JkaW5nIHRvIHBlcm11YXRhdGlvbi4KKyAqIFBlcm11dGUgYW4gOHg4IGJsb2NrIGFjY29yZGluZyB0byBwZXJtdXRhdGlvbi4KICAqIEBwYXJhbSBibG9jayB0aGUgYmxvY2sgd2hpY2ggd2lsbCBiZSBwZXJtdXRlZCBhY2NvcmRpbmcgdG8KICAqICAgICAgICAgICAgICB0aGUgZ2l2ZW4gcGVybXV0YXRpb24gdmVjdG9yCiAgKiBAcGFyYW0gcGVybXV0YXRpb24gdGhlIHBlcm11dGF0aW9uIHZlY3RvcgpAQCAtNDcyMiw3ICs0NzMyLDcgQEAKIHsKICAgICBpbnQgaSwgaiwgbGV2ZWwsIGxhc3Rfbm9uX3plcm8sIHEsIHN0YXJ0X2k7CiAgICAgY29uc3QgaW50ICpxbWF0OwotICAgIGNvbnN0IHVpbnQ4X3QgKnNjYW50YWJsZT0gcy0+aW50cmFfc2NhbnRhYmxlLnNjYW50YWJsZTsKKyAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGU7CiAgICAgaW50IGJpYXM7CiAgICAgaW50IG1heD0wOwogICAgIHVuc2lnbmVkIGludCB0aHJlc2hvbGQxLCB0aHJlc2hvbGQyOwpAQCAtNDczMyw2ICs0NzQzLDcgQEAKICAgICAgICAgcy0+ZGVub2lzZV9kY3QocywgYmxvY2spOwogCiAgICAgaWYgKHMtPm1iX2ludHJhKSB7CisgICAgICAgIHNjYW50YWJsZT0gcy0+aW50cmFfc2NhbnRhYmxlLnNjYW50YWJsZTsKICAgICAgICAgaWYgKCFzLT5oMjYzX2FpYykgewogICAgICAgICAgICAgaWYgKG4gPCA0KQogICAgICAgICAgICAgICAgIHEgPSBzLT55X2RjX3NjYWxlOwpAQCAtNDc1MCw2ICs0NzYxLDcgQEAKICAgICAgICAgcW1hdCA9IG4gPCA0ID8gcy0+cV9pbnRyYV9tYXRyaXhbcXNjYWxlXSA6IHMtPnFfY2hyb21hX2ludHJhX21hdHJpeFtxc2NhbGVdOwogICAgICAgICBiaWFzPSBzLT5pbnRyYV9xdWFudF9iaWFzKigxPDwoUU1BVF9TSElGVCAtIFFVQU5UX0JJQVNfU0hJRlQpKTsKICAgICB9IGVsc2UgeworICAgICAgICBzY2FudGFibGU9IHMtPmludGVyX3NjYW50YWJsZS5zY2FudGFibGU7CiAgICAgICAgIHN0YXJ0X2kgPSAwOwogICAgICAgICBsYXN0X25vbl96ZXJvID0gLTE7CiAgICAgICAgIHFtYXQgPSBzLT5xX2ludGVyX21hdHJpeFtxc2NhbGVdOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVndmlkZW9fbW90aW9uLmMgYi9saWJhdmNvZGVjL21wZWd2aWRlb19tb3Rpb24uYwppbmRleCA1MWJhNDM1Li41NjI0YzEwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21wZWd2aWRlb19tb3Rpb24uYworKysgYi9saWJhdmNvZGVjL21wZWd2aWRlb19tb3Rpb24uYwpAQCAtNDgsOCArNDgsOCBAQAogICAgIG1vdGlvbl95ICAgPSBzLT5zcHJpdGVfb2Zmc2V0WzBdWzFdOwogICAgIHNyY194ICAgICAgPSBzLT5tYl94ICogMTYgKyAobW90aW9uX3ggPj4gKHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5ICsgMSkpOwogICAgIHNyY195ICAgICAgPSBzLT5tYl95ICogMTYgKyAobW90aW9uX3kgPj4gKHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5ICsgMSkpOwotICAgIG1vdGlvbl94IDw8PSAoMyAtIHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5KTsKLSAgICBtb3Rpb25feSA8PD0gKDMgLSBzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeSk7CisgICAgbW90aW9uX3ggKj0gMSA8PCAoMyAtIHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5KTsKKyAgICBtb3Rpb25feSAqPSAxIDw8ICgzIC0gcy0+c3ByaXRlX3dhcnBpbmdfYWNjdXJhY3kpOwogICAgIHNyY194ICAgICAgPSBhdl9jbGlwKHNyY194LCAtMTYsIHMtPndpZHRoKTsKICAgICBpZiAoc3JjX3ggPT0gcy0+d2lkdGgpCiAgICAgICAgIG1vdGlvbl94ID0gMDsKQEAgLTk1LDggKzk1LDggQEAKICAgICBtb3Rpb25feSAgID0gcy0+c3ByaXRlX29mZnNldFsxXVsxXTsKICAgICBzcmNfeCAgICAgID0gcy0+bWJfeCAqIDggKyAobW90aW9uX3ggPj4gKHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5ICsgMSkpOwogICAgIHNyY195ICAgICAgPSBzLT5tYl95ICogOCArIChtb3Rpb25feSA+PiAocy0+c3ByaXRlX3dhcnBpbmdfYWNjdXJhY3kgKyAxKSk7Ci0gICAgbW90aW9uX3ggPDw9ICgzIC0gcy0+c3ByaXRlX3dhcnBpbmdfYWNjdXJhY3kpOwotICAgIG1vdGlvbl95IDw8PSAoMyAtIHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5KTsKKyAgICBtb3Rpb25feCAgKj0gMSA8PCAoMyAtIHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5KTsKKyAgICBtb3Rpb25feSAgKj0gMSA8PCAoMyAtIHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5KTsKICAgICBzcmNfeCAgICAgID0gYXZfY2xpcChzcmNfeCwgLTgsIHMtPndpZHRoID4+IDEpOwogICAgIGlmIChzcmNfeCA9PSBzLT53aWR0aCA+PiAxKQogICAgICAgICBtb3Rpb25feCA9IDA7CkBAIC0yMzksMjcgKzIzOSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW90aW9uX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbXBlZzEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfMTZ4OCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3kpCiB7CiAgICAgdWludDhfdCAqcHRyX3ksICpwdHJfY2IsICpwdHJfY3I7CiAgICAgaW50IGR4eSwgdXZkeHksIG14LCBteSwgc3JjX3gsIHNyY195LAotICAgICAgICB1dnNyY194LCB1dnNyY195LCB2X2VkZ2VfcG9zOworICAgICAgICB1dnNyY194LCB1dnNyY195LCB2X2VkZ2VfcG9zLCBibG9ja195X2hhbGY7CiAgICAgcHRyZGlmZl90IHV2bGluZXNpemUsIGxpbmVzaXplOwogCi0jaWYgMAotICAgIGlmIChzLT5xdWFydGVyX3NhbXBsZSkgewotICAgICAgICBtb3Rpb25feCA+Pj0gMTsKLSAgICAgICAgbW90aW9uX3kgPj49IDE7Ci0gICAgfQotI2VuZGlmCi0KICAgICB2X2VkZ2VfcG9zID0gcy0+dl9lZGdlX3BvcyA+PiBmaWVsZF9iYXNlZDsKICAgICBsaW5lc2l6ZSAgID0gcy0+Y3VycmVudF9waWN0dXJlLmYtPmxpbmVzaXplWzBdIDw8IGZpZWxkX2Jhc2VkOwogICAgIHV2bGluZXNpemUgPSBzLT5jdXJyZW50X3BpY3R1cmUuZi0+bGluZXNpemVbMV0gPDwgZmllbGRfYmFzZWQ7CisgICAgYmxvY2tfeV9oYWxmID0gKGZpZWxkX2Jhc2VkIHwgaXNfMTZ4OCk7CiAKICAgICBkeHkgICA9ICgobW90aW9uX3kgJiAxKSA8PCAxKSB8IChtb3Rpb25feCAmIDEpOwogICAgIHNyY194ID0gcy0+bWJfeCAqIDE2ICsgKG1vdGlvbl94ID4+IDEpOwotICAgIHNyY195ID0gKG1iX3kgPDwgKDQgLSBmaWVsZF9iYXNlZCkpICsgKG1vdGlvbl95ID4+IDEpOworICAgIHNyY195ID0gKG1iX3kgPDwgKDQgLSBibG9ja195X2hhbGYpKSArIChtb3Rpb25feSA+PiAxKTsKIAogICAgIGlmICghaXNfbXBlZzEyICYmIHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjMpIHsKICAgICAgICAgaWYgKChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfSFBFTF9DSFJPTUEpICYmIGZpZWxkX2Jhc2VkKSB7CkBAIC0yNjcsNyArMjYyLDcgQEAKICAgICAgICAgICAgIG15ICAgICAgPSBtb3Rpb25feSA+PiAxOwogICAgICAgICAgICAgdXZkeHkgICA9ICgobXkgJiAxKSA8PCAxKSB8IChteCAmIDEpOwogICAgICAgICAgICAgdXZzcmNfeCA9IHMtPm1iX3ggKiA4ICsgKG14ID4+IDEpOwotICAgICAgICAgICAgdXZzcmNfeSA9IChtYl95IDw8ICgzIC0gZmllbGRfYmFzZWQpKSArIChteSA+PiAxKTsKKyAgICAgICAgICAgIHV2c3JjX3kgPSAobWJfeSA8PCAoMyAtIGJsb2NrX3lfaGFsZikpICsgKG15ID4+IDEpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdXZkeHkgICA9IGR4eSB8IChtb3Rpb25feSAmIDIpIHwgKChtb3Rpb25feCAmIDIpID4+IDEpOwogICAgICAgICAgICAgdXZzcmNfeCA9IHNyY194ID4+IDE7CkBAIC0yODYsNyArMjgxLDcgQEAKICAgICAgICAgICAgIG15ICAgICAgPSBtb3Rpb25feSAvIDI7CiAgICAgICAgICAgICB1dmR4eSAgID0gKChteSAmIDEpIDw8IDEpIHwgKG14ICYgMSk7CiAgICAgICAgICAgICB1dnNyY194ID0gcy0+bWJfeCAqIDggKyAobXggPj4gMSk7Ci0gICAgICAgICAgICB1dnNyY195ID0gKG1iX3kgPDwgKDMgLSBmaWVsZF9iYXNlZCkpICsgKG15ID4+IDEpOworICAgICAgICAgICAgdXZzcmNfeSA9IChtYl95IDw8ICgzIC0gYmxvY2tfeV9oYWxmKSkgKyAobXkgPj4gMSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAocy0+Y2hyb21hX3hfc2hpZnQpIHsKICAgICAgICAgICAgICAgICAvLyBDaHJvbWE0MjIKQEAgLTMyNiw3ICszMjEsOSBAQAogICAgICAgICBwdHJfeSA9IHMtPnNjLmVkZ2VfZW11X2J1ZmZlcjsKICAgICAgICAgaWYgKCFDT05GSUdfR1JBWSB8fCAhKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKnVidWYgPSBzLT5zYy5lZGdlX2VtdV9idWZmZXIgKyAxOCAqIHMtPmxpbmVzaXplOwotICAgICAgICAgICAgdWludDhfdCAqdmJ1ZiA9IHVidWYgKyA5ICogcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZidWYgPSB1YnVmICsgMTAgKiBzLT51dmxpbmVzaXplOworICAgICAgICAgICAgaWYgKHMtPndvcmthcm91bmRfYnVncyAmIEZGX0JVR19JRURHRSkKKyAgICAgICAgICAgICAgICB2YnVmIC09IHMtPnV2bGluZXNpemU7CiAgICAgICAgICAgICB1dnNyY195ID0gKHVuc2lnbmVkKXV2c3JjX3kgPDwgZmllbGRfYmFzZWQ7CiAgICAgICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWModWJ1ZiwgcHRyX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnV2bGluZXNpemUsIHMtPnV2bGluZXNpemUsCkBAIC0zNzUsMTggKzM3MiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGVzdF95LCB1aW50OF90ICpkZXN0X2NiLCB1aW50OF90ICpkZXN0X2NyLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX3NlbGVjdCwgdWludDhfdCAqKnJlZl9waWN0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgb3BfcGl4ZWxzX2Z1bmMgKCpwaXhfb3ApWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vdGlvbl94LCBpbnQgbW90aW9uX3ksIGludCBoLCBpbnQgbWJfeSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb3Rpb25feCwgaW50IG1vdGlvbl95LCBpbnQgaCwgaW50IGlzXzE2eDgsIGludCBtYl95KQogewogI2lmICFDT05GSUdfU01BTEwKICAgICBpZiAocy0+b3V0X2Zvcm1hdCA9PSBGTVRfTVBFRzEpCiAgICAgICAgIG1wZWdfbW90aW9uX2ludGVybmFsKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfc2VsZWN0LCByZWZfcGljdHVyZSwgcGl4X29wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDEsIG1iX3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDEsIGlzXzE2eDgsIG1iX3kpOwogICAgIGVsc2UKICNlbmRpZgogICAgICAgICBtcGVnX21vdGlvbl9pbnRlcm5hbChzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3NlbGVjdCwgcmVmX3BpY3R1cmUsIHBpeF9vcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3gsIG1vdGlvbl95LCBoLCAwLCBtYl95KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uX3gsIG1vdGlvbl95LCBoLCAwLCBpc18xNng4LCBtYl95KTsKIH0KIAogc3RhdGljIHZvaWQgbXBlZ19tb3Rpb25fZmllbGQoTXBlZ0VuY0NvbnRleHQgKnMsIHVpbnQ4X3QgKmRlc3RfeSwKQEAgLTQwMCwxMiArMzk3LDEyIEBACiAgICAgaWYgKHMtPm91dF9mb3JtYXQgPT0gRk1UX01QRUcxKQogICAgICAgICBtcGVnX21vdGlvbl9pbnRlcm5hbChzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9maWVsZCwgZmllbGRfc2VsZWN0LCByZWZfcGljdHVyZSwgcGl4X29wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDEsIG1iX3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDEsIDAsIG1iX3kpOwogICAgIGVsc2UKICNlbmRpZgogICAgICAgICBtcGVnX21vdGlvbl9pbnRlcm5hbChzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9maWVsZCwgZmllbGRfc2VsZWN0LCByZWZfcGljdHVyZSwgcGl4X29wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDAsIG1iX3kpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb25feCwgbW90aW9uX3ksIGgsIDAsIDAsIG1iX3kpOwogfQogCiAvLyBGSVhNRTogU0lNRGlmeSwgYXZnIHZhcmlhbnQsIDE2eDE2IHZlcnNpb24KQEAgLTU0NCwyMSArNTQxLDIzIEBACiAgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5zYy5lZGdlX2VtdV9idWZmZXIsIHB0cl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemUsIHMtPmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcsIDE3ICsgZmllbGRfYmFzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCwgc3JjX3kgPDwgZmllbGRfYmFzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfeCwgc3JjX3kgKiAoMSA8PCBmaWVsZF9iYXNlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oX2VkZ2VfcG9zLCBzLT52X2VkZ2VfcG9zKTsKICAgICAgICAgcHRyX3kgPSBzLT5zYy5lZGdlX2VtdV9idWZmZXI7CiAgICAgICAgIGlmICghQ09ORklHX0dSQVkgfHwgIShzLT5hdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dSQVkpKSB7CiAgICAgICAgICAgICB1aW50OF90ICp1YnVmID0gcy0+c2MuZWRnZV9lbXVfYnVmZmVyICsgMTggKiBzLT5saW5lc2l6ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnZidWYgPSB1YnVmICsgOSAqIHMtPnV2bGluZXNpemU7CisgICAgICAgICAgICB1aW50OF90ICp2YnVmID0gdWJ1ZiArIDEwICogcy0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIGlmIChzLT53b3JrYXJvdW5kX2J1Z3MgJiBGRl9CVUdfSUVER0UpCisgICAgICAgICAgICAgICAgdmJ1ZiAtPSBzLT51dmxpbmVzaXplOwogICAgICAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHVidWYsIHB0cl9jYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplLCBzLT51dmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDkgKyBmaWVsZF9iYXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dnNyY194LCB1dnNyY195IDw8IGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3kgKiAoMSA8PCBmaWVsZF9iYXNlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3BvcyA+PiAxLCBzLT52X2VkZ2VfcG9zID4+IDEpOwogICAgICAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHZidWYsIHB0cl9jciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51dmxpbmVzaXplLCBzLT51dmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDksIDkgKyBmaWVsZF9iYXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dnNyY194LCB1dnNyY195IDw8IGZpZWxkX2Jhc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2c3JjX3gsIHV2c3JjX3kgKiAoMSA8PCBmaWVsZF9iYXNlZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aF9lZGdlX3BvcyA+PiAxLCBzLT52X2VkZ2VfcG9zID4+IDEpOwogICAgICAgICAgICAgcHRyX2NiID0gdWJ1ZjsKICAgICAgICAgICAgIHB0cl9jciA9IHZidWY7CkBAIC01OTEsNyArNTkwLDcgQEAKIH0KIAogLyoqCi0gKiBoMjYzIGNocm9tYSA0bXYgbW90aW9uIGNvbXBlbnNhdGlvbi4KKyAqIEguMjYzIGNocm9tYSA0bXYgbW90aW9uIGNvbXBlbnNhdGlvbi4KICAqLwogc3RhdGljIHZvaWQgY2hyb21hXzRtdl9tb3Rpb24oTXBlZ0VuY0NvbnRleHQgKnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X2NiLCB1aW50OF90ICpkZXN0X2NyLApAQCAtODczLDcgKzg3Miw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtcGVnX21vdGlvbihzLCBkZXN0X3ksIGRlc3RfY2IsIGRlc3RfY3IsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLAotICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVswXVswXSwgcy0+bXZbZGlyXVswXVsxXSwgMTYsIG1iX3kpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVswXVswXSwgcy0+bXZbZGlyXVswXVsxXSwgMTYsIDAsIG1iX3kpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTVZfVFlQRV84WDg6CkBAIC05MTAsNyArOTA5LDcgQEAKICAgICAgICAgICAgIG1wZWdfbW90aW9uKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX3NlbGVjdFtkaXJdWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3BpY3R1cmUsIHBpeF9vcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMF1bMF0sIHMtPm12W2Rpcl1bMF1bMV0sIDE2LCBtYl95ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVswXVswXSwgcy0+bXZbZGlyXVswXVsxXSwgMTYsIDAsIG1iX3kgPj4gMSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNVl9UWVBFXzE2WDg6CkBAIC05MjcsOCArOTI2LDggQEAKICAgICAgICAgICAgIG1wZWdfbW90aW9uKHMsIGRlc3RfeSwgZGVzdF9jYiwgZGVzdF9jciwKICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX3NlbGVjdFtkaXJdW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgcmVmMnBpY3R1cmUsIHBpeF9vcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1baV1bMF0sIHMtPm12W2Rpcl1baV1bMV0gKyAxNiAqIGksCi0gICAgICAgICAgICAgICAgICAgICAgICA4LCBtYl95ID4+IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXZbZGlyXVtpXVswXSwgcy0+bXZbZGlyXVtpXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsIDEsIChtYl95ICYgfjEpICsgaSk7CiAKICAgICAgICAgICAgIGRlc3RfeSAgKz0gMTYgKiBzLT5saW5lc2l6ZTsKICAgICAgICAgICAgIGRlc3RfY2IgKz0gKDE2ID4+IHMtPmNocm9tYV95X3NoaWZ0KSAqIHMtPnV2bGluZXNpemU7CkBAIC05NTUsNyArOTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBpICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfcGljdHVyZSwgcGl4X29wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12W2Rpcl1bMiAqIGldWzBdLCBzLT5tdltkaXJdWzIgKiBpXVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgbWJfeSA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMCwgbWJfeSA+PiAxKTsKIAogICAgICAgICAgICAgICAgIC8vIGFmdGVyIHB1dCB3ZSBtYWtlIGF2ZyBvZiB0aGUgc2FtZSBibG9jawogICAgICAgICAgICAgICAgIHBpeF9vcCA9IHMtPmhkc3AuYXZnX3BpeGVsc190YWI7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWd2aWRlb19wYXJzZXIuYyBiL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX3BhcnNlci5jCmluZGV4IDFmNzRiZmIuLjdhM2M3YWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX3BhcnNlci5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QRUcxIC8gTVBFRzIgdmlkZW8gcGFyc2VyCisgKiBNUEVHLTEgLyBNUEVHLTIgdmlkZW8gcGFyc2VyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAsMjAwMSBGYWJyaWNlIEJlbGxhcmQKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CiAgKgpAQCAtNjEsNyArNjEsNyBAQAogICAgICAgICAgICAgaWYgKGJ5dGVzX2xlZnQgPj0gMikgewogICAgICAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9IChidWZbMV0gPj4gMykgJiA3OwogICAgICAgICAgICAgICAgIGlmIChieXRlc19sZWZ0ID49IDQpCi0gICAgICAgICAgICAgICAgdmJ2X2RlbGF5ID0gKChidWZbMV0gJiAweDA3KSA8PCAxMykgfCAoYnVmWzJdIDw8IDUpIHwgKGJ1ZlszXSAgPj4gMyk7CisgICAgICAgICAgICAgICAgICAgIHZidl9kZWxheSA9ICgoYnVmWzFdICYgMHgwNykgPDwgMTMpIHwgKGJ1ZlsyXSA8PCA1KSB8IChidWZbM10gPj4gMyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBTRVFfU1RBUlRfQ09ERToKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGMtPnByb2dyZXNzaXZlX3NlcXVlbmNlICYmICFwcm9ncmVzc2l2ZV9mcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0b3BfZmllbGRfZmlyc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfVFQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQpAQCAtMTY4LDggKzE2OCwxMCBAQAogCiAgICAgaWYgKHBpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FKSB7CiAgICAgICAgIHMtPmZvcm1hdCA9IHBpeF9mbXQ7Ci0gICAgICAgIHMtPndpZHRoICA9IHMtPmNvZGVkX3dpZHRoICA9IHBjLT53aWR0aDsKLSAgICAgICAgcy0+aGVpZ2h0ID0gcy0+Y29kZWRfaGVpZ2h0ID0gcGMtPmhlaWdodDsKKyAgICAgICAgcy0+d2lkdGggID0gcGMtPndpZHRoOworICAgICAgICBzLT5oZWlnaHQgPSBwYy0+aGVpZ2h0OworICAgICAgICBzLT5jb2RlZF93aWR0aCAgPSBGRkFMSUdOKHBjLT53aWR0aCwgIDE2KTsKKyAgICAgICAgcy0+Y29kZWRfaGVpZ2h0ID0gRkZBTElHTihwYy0+aGVpZ2h0LCAxNik7CiAgICAgfQogCiAjaWYgRkZfQVBJX0FWQ1RYX1RJTUVCQVNFCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wZWd2aWRlb194dm1jLmMgYi9saWJhdmNvZGVjL21wZWd2aWRlb194dm1jLmMKaW5kZXggYjQ2OWM0ZS4uZjA2NTgzNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVndmlkZW9feHZtYy5jCisrKyBiL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvX3h2bWMuYwpAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBmcm9tIGZmX21wdl9kZWNvZGVfbWIoKSwgdXBkYXRlIERDIHByZWRpY3RvcnMgZm9yIFAgbWFjcm9ibG9ja3MKKyAgICAvLyBmcm9tIGZmX21wdl9yZWNvbnN0cnVjdF9tYigpLCB1cGRhdGUgREMgcHJlZGljdG9ycyBmb3IgUCBtYWNyb2Jsb2NrcwogICAgIGlmICghcy0+bWJfaW50cmEpIHsKICAgICAgICAgcy0+bGFzdF9kY1swXSA9CiAgICAgICAgIHMtPmxhc3RfZGNbMV0gPQpAQCAtMzQ4LDcgKzM0OCw3IEBACiB9CiAKICNpZiBDT05GSUdfTVBFRzFfWFZNQ19IV0FDQ0VMCi1BVkhXQWNjZWwgZmZfbXBlZzFfeHZtY19od2FjY2VsID0geworY29uc3QgQVZIV0FjY2VsIGZmX21wZWcxX3h2bWNfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzFfeHZtYyIsCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcxVklERU8sCkBAIC0zNjIsNyArMzYyLDcgQEAKICNlbmRpZgogCiAjaWYgQ09ORklHX01QRUcyX1hWTUNfSFdBQ0NFTAotQVZIV0FjY2VsIGZmX21wZWcyX3h2bWNfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl9tcGVnMl94dm1jX2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWcyX3h2bWMiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tcGVndmlkZW9lbmNkc3AuYyBiL2xpYmF2Y29kZWMvbXBlZ3ZpZGVvZW5jZHNwLmMKaW5kZXggYTdjNjEwMi4uYTM0YWIzNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tcGVndmlkZW9lbmNkc3AuYworKysgYi9saWJhdmNvZGVjL21wZWd2aWRlb2VuY2RzcC5jCkBAIC04MSwyMCArODEsMTAgQEAKIHN0YXRpYyBpbnQgcGl4X25vcm0xX2ModWludDhfdCAqcGl4LCBpbnQgbGluZV9zaXplKQogewogICAgIGludCBzID0gMCwgaSwgajsKLSAgICB1aW50MzJfdCAqc3EgPSBmZl9zcXVhcmVfdGFiICsgMjU2OworICAgIGNvbnN0IHVpbnQzMl90ICpzcSA9IGZmX3NxdWFyZV90YWIgKyAyNTY7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGogKz0gOCkgewotI2lmIDAKLSAgICAgICAgICAgIHMgKz0gc3FbcGl4WzBdXTsKLSAgICAgICAgICAgIHMgKz0gc3FbcGl4WzFdXTsKLSAgICAgICAgICAgIHMgKz0gc3FbcGl4WzJdXTsKLSAgICAgICAgICAgIHMgKz0gc3FbcGl4WzNdXTsKLSAgICAgICAgICAgIHMgKz0gc3FbcGl4WzRdXTsKLSAgICAgICAgICAgIHMgKz0gc3FbcGl4WzVdXTsKLSAgICAgICAgICAgIHMgKz0gc3FbcGl4WzZdXTsKLSAgICAgICAgICAgIHMgKz0gc3FbcGl4WzddXTsKLSNlbHNlCiAjaWYgSEFWRV9GQVNUXzY0QklUCiAgICAgICAgICAgICByZWdpc3RlciB1aW50NjRfdCB4ID0gKih1aW50NjRfdCAqKSBwaXg7CiAgICAgICAgICAgICBzICs9IHNxW3ggICAgICAgICAmIDB4ZmZdOwpAQCAtMTE3LDcgKzEwNyw2IEBACiAgICAgICAgICAgICBzICs9IHNxWyh4ID4+IDE2KSAmIDB4ZmZdOwogICAgICAgICAgICAgcyArPSBzcVsoeCA+PiAyNCkgJiAweGZmXTsKICNlbmRpZgotI2VuZGlmCiAgICAgICAgICAgICBwaXggKz0gODsKICAgICAgICAgfQogICAgICAgICBwaXggKz0gbGluZV9zaXplIC0gMTY7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21wbDJkZWMuYyBiL2xpYmF2Y29kZWMvbXBsMmRlYy5jCmluZGV4IGNhOTVkYzguLjQwOWU0YjMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXBsMmRlYy5jCisrKyBiL2xpYmF2Y29kZWMvbXBsMmRlYy5jCkBAIC02OSwxMyArNjksMTEgQEAKICAgICBBVkJQcmludCBidWY7CiAgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKICAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKLSAgICBjb25zdCBpbnQgdHNfc3RhcnQgICAgID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMsICAgICAgYXZjdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsMTAwfSk7Ci0gICAgY29uc3QgaW50IHRzX2R1cmF0aW9uICA9IGF2cGt0LT5kdXJhdGlvbiAhPSAtMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShhdnBrdC0+ZHVyYXRpb24sIGF2Y3R4LT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXsxLDEwMH0pIDogLTE7CisgICAgRkZBU1NEZWNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKICAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwogICAgIGlmIChwdHIgJiYgYXZwa3QtPnNpemUgPiAwICYmICpwdHIgJiYgIW1wbDJfZXZlbnRfdG9fYXNzKCZidWYsIHB0cikpCi0gICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmYnVmLCB0c19zdGFydCwgdHNfZHVyYXRpb24pOworICAgICAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3Qoc3ViLCBidWYuc3RyLCBzLT5yZWFkb3JkZXIrKywgMCwgTlVMTCwgTlVMTCk7CiAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtOTAsNCArODgsNiBAQAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QTDIsCiAgICAgLmRlY29kZSAgICAgICAgID0gbXBsMl9kZWNvZGVfZnJhbWUsCiAgICAgLmluaXQgICAgICAgICAgID0gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0LAorICAgIC5mbHVzaCAgICAgICAgICA9IGZmX2Fzc19kZWNvZGVyX2ZsdXNoLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRkFTU0RlY29kZXJDb250ZXh0KSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21xYy5oIGIvbGliYXZjb2RlYy9tcWMuaAppbmRleCAzOTEwNGIxLi44YmY3MjIzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21xYy5oCisrKyBiL2xpYmF2Y29kZWMvbXFjLmgKQEAgLTY2LDcgKzY2LDcgQEAKIC8qKgogICogSW5pdGlhbGl6ZSBNUS1kZWNvZGVyLgogICogQHBhcmFtIG1xYyAgIE1RIGRlY29kZXIgc3RhdGUKLSAqIEBwYXJhbSBicCAgICBieXRlIHBvaXRlcgorICogQHBhcmFtIGJwICAgIGJ5dGUgcG9pbnRlcgogICogQHBhcmFtIHJhdyAgIHJhdyBtb2RlCiAgKiBAcGFyYW0gcmVzZXQgcmVzZXQgc3RhdGVzCiAgKi8KQEAgLTc2LDcgKzc2LDcgQEAKICAqIE1RIGRlY29kZXIuCiAgKiBAcGFyYW0gbXFjICAgICAgIE1RIGRlY29kZXIgc3RhdGUKICAqIEBwYXJhbSBjeHN0YXRlICAgQ29udGV4dAotICogQHJldHVybiAgICAgICAgICBEZWNpc2lvbiAoMCBvdCAxKQorICogQHJldHVybiAgICAgICAgICBEZWNpc2lvbiAoMCB0byAxKQogICovCiBpbnQgZmZfbXFjX2RlY29kZShNcWNTdGF0ZSAqbXFjLCB1aW50OF90ICpjeHN0YXRlKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tc2NjLmMgYi9saWJhdmNvZGVjL21zY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTRkYmIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9tc2NjLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qCisgKiBNYW5kc29mdCBTY3JlZW4gQ2FwdHVyZSBDb2RlYyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgPHpsaWIuaD4KKwordHlwZWRlZiBzdHJ1Y3QgTVNDQ0NvbnRleHQgeworICAgIHVuc2lnbmVkICAgICAgICAgIGJwcDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICBkZWNvbXBfc2l6ZTsKKyAgICB1aW50OF90ICAgICAgICAgICpkZWNvbXBfYnVmOworICAgIHVuc2lnbmVkIGludCAgICAgIHVuY29tcF9zaXplOworICAgIHVpbnQ4X3QgICAgICAgICAgKnVuY29tcF9idWY7CisgICAgel9zdHJlYW0gICAgICAgICAgenN0cmVhbTsKK30gTVNDQ0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgcmxlX3VuY29tcHJlc3MoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBHZXRCeXRlQ29udGV4dCAqZ2IsIFB1dEJ5dGVDb250ZXh0ICpwYiwgaW50IGJwcCkKK3sKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICB1aW50MzJfdCBmaWxsOworICAgICAgICBpbnQgajsKKyAgICAgICAgdW5zaWduZWQgcnVuID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworCisgICAgICAgIGlmIChydW4pIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgIGZpbGwgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIGZpbGwgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgIGZpbGwgPSBieXRlc3RyZWFtMl9nZXRfbGUyNChnYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgIGZpbGwgPSBieXRlc3RyZWFtMl9nZXRfbGUzMihnYik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBydW47IGorKykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUocGIsIGZpbGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUxNihwYiwgZmlsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTI0KHBiLCBmaWxsKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMzIocGIsIGZpbGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25lZCBjb3B5ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworCisgICAgICAgICAgICBpZiAoY29weSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNvcHkgPT0gMikgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHgsIHk7CisKKyAgICAgICAgICAgICAgICB4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICAgICAgICAgIHkgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwX3AocGIsIHggKiBicHApOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXBfcChwYiwgeSAqIGJwcCAqIGF2Y3R4LT53aWR0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb3B5OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9ieXRlKHBiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wdXRfbGUxNihwYiwgYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfcHV0X2xlMjQocGIsIGJ5dGVzdHJlYW0yX2dldF9sZTI0KGdiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3B1dF9sZTMyKHBiLCBieXRlc3RyZWFtMl9nZXRfbGUzMihnYikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgTVNDQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICB1aW50OF90ICpidWYgPSBhdnBrdC0+ZGF0YTsKKyAgICBpbnQgYnVmX3NpemUgPSBhdnBrdC0+c2l6ZTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBQdXRCeXRlQ29udGV4dCBwYjsKKyAgICBpbnQgcmV0LCBqOworCisgICAgaWYgKGF2cGt0LT5zaXplIDwgMykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVNDQykgeworICAgICAgICBhdnBrdC0+ZGF0YVsyXSBePSBhdnBrdC0+ZGF0YVswXTsKKyAgICAgICAgYnVmICs9IDI7CisgICAgICAgIGJ1Zl9zaXplIC09IDI7CisgICAgfQorCisgICAgcmV0ID0gaW5mbGF0ZVJlc2V0KCZzLT56c3RyZWFtKTsKKyAgICBpZiAocmV0ICE9IFpfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmZsYXRlIHJlc2V0IGVycm9yOiAlZFxuIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgcy0+enN0cmVhbS5uZXh0X2luICAgPSBidWY7CisgICAgcy0+enN0cmVhbS5hdmFpbF9pbiAgPSBidWZfc2l6ZTsKKyAgICBzLT56c3RyZWFtLm5leHRfb3V0ICA9IHMtPmRlY29tcF9idWY7CisgICAgcy0+enN0cmVhbS5hdmFpbF9vdXQgPSBzLT5kZWNvbXBfc2l6ZTsKKyAgICByZXQgPSBpbmZsYXRlKCZzLT56c3RyZWFtLCBaX0ZJTklTSCk7CisgICAgaWYgKHJldCAhPSBaX1NUUkVBTV9FTkQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmZsYXRlIGVycm9yOiAlZFxuIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgcy0+ZGVjb21wX2J1Ziwgcy0+enN0cmVhbS50b3RhbF9vdXQpOworICAgIGJ5dGVzdHJlYW0yX2luaXRfd3JpdGVyKCZwYiwgcy0+dW5jb21wX2J1Ziwgcy0+dW5jb21wX3NpemUpOworCisgICAgcmV0ID0gcmxlX3VuY29tcHJlc3MoYXZjdHgsICZnYiwgJnBiLCBzLT5icHApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgYXZjdHgtPmhlaWdodDsgaisrKSB7CisgICAgICAgIG1lbWNweShmcmFtZS0+ZGF0YVswXSArIChhdmN0eC0+aGVpZ2h0IC0gaiAtIDEpICogZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgcy0+dW5jb21wX2J1ZiArIHMtPmJwcCAqIGogKiBhdmN0eC0+d2lkdGgsIHMtPmJwcCAqIGF2Y3R4LT53aWR0aCk7CisgICAgfQorCisgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTVNDQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCB6cmV0OworCisgICAgc3dpdGNoIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgY2FzZSAgODogYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk4OyAgYnJlYWs7CisgICAgY2FzZSAxNjogYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsgYnJlYWs7CisgICAgY2FzZSAyNDogYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OyAgYnJlYWs7CisgICAgY2FzZSAzMjogYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUkE7ICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBiaXRkZXB0aCAlaVxuIiwgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmJwcCA9IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPj4gMzsKKyAgICBtZW1zZXQoJnMtPnpzdHJlYW0sIDAsIHNpemVvZih6X3N0cmVhbSkpOworCisgICAgcy0+ZGVjb21wX3NpemUgPSA0ICogYXZjdHgtPmhlaWdodCAqICgoYXZjdHgtPndpZHRoICogYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSArIDMxKSAvIDMyKTsKKyAgICBpZiAoIShzLT5kZWNvbXBfYnVmID0gYXZfbWFsbG9jKHMtPmRlY29tcF9zaXplKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT51bmNvbXBfc2l6ZSA9IDQgKiBhdmN0eC0+aGVpZ2h0ICogKChhdmN0eC0+d2lkdGggKiBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlICsgMzEpIC8gMzIpOworICAgIGlmICghKHMtPnVuY29tcF9idWYgPSBhdl9tYWxsb2Mocy0+dW5jb21wX3NpemUpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPnpzdHJlYW0uemFsbG9jID0gWl9OVUxMOworICAgIHMtPnpzdHJlYW0uemZyZWUgPSBaX05VTEw7CisgICAgcy0+enN0cmVhbS5vcGFxdWUgPSBaX05VTEw7CisgICAgenJldCA9IGluZmxhdGVJbml0KCZzLT56c3RyZWFtKTsKKyAgICBpZiAoenJldCAhPSBaX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5mbGF0ZSBpbml0IGVycm9yOiAlZFxuIiwgenJldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1TQ0NDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZzLT5kZWNvbXBfYnVmKTsKKyAgICBzLT5kZWNvbXBfc2l6ZSA9IDA7CisgICAgYXZfZnJlZXAoJnMtPnVuY29tcF9idWYpOworICAgIHMtPnVuY29tcF9zaXplID0gMDsKKyAgICBpbmZsYXRlRW5kKCZzLT56c3RyZWFtKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX21zY2NfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJtc2NjIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNYW5kc29mdCBTY3JlZW4gQ2FwdHVyZSBDb2RlYyIpLAorICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVNDQywKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihNU0NDQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGRlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IEFWX0NPREVDX0NBUF9EUjEsCit9OworCitBVkNvZGVjIGZmX3NyZ2NfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJzcmdjIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTY3JlZW4gUmVjb3JkZXIgR29sZCBDb2RlYyIpLAorICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfU1JHQywKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihNU0NDQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGRlY29kZV9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IEFWX0NPREVDX0NBUF9EUjEsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tc2dzbWRlYy5jIGIvbGliYXZjb2RlYy9tc2dzbWRlYy5jCmluZGV4IDRjNGRkYjQuLjAwM2JjMmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXNnc21kZWMuYworKysgYi9saWJhdmNvZGVjL21zZ3NtZGVjLmMKQEAgLTIxLDggKzIxLDkgQEAKIAogI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgIm1zZ3NtZGVjLmgiCiAjaW5jbHVkZSAiZ3NtLmgiCisjaW5jbHVkZSAibXNnc21kZWMuaCIKKwogI2luY2x1ZGUgImdzbWRlY190ZW1wbGF0ZS5jIgogCiBpbnQgZmZfbXNnc21fZGVjb2RlX2Jsb2NrKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50MTZfdCAqc2FtcGxlcywKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXNtcGVnNC5jIGIvbGliYXZjb2RlYy9tc21wZWc0LmMKaW5kZXggYzlhMjEwOC4uOTIwZjUwZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tc21wZWc0LmMKKysrIGIvbGliYXZjb2RlYy9tc21wZWc0LmMKQEAgLTQwLDE0ICs0MCwxNCBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogCiAvKgotICogWW91IGNhbiBhbHNvIGNhbGwgdGhpcyBjb2RlYyA6IE1QRUc0IHdpdGggYSB0d2lzdCAhCisgKiBZb3UgY2FuIGFsc28gY2FsbCB0aGlzIGNvZGVjOiBNUEVHLTQgd2l0aCBhIHR3aXN0IQogICoKICAqIFRPRE86CiAgKiAgICAgICAgLSAoZW5jb2RpbmcpIHNlbGVjdCBiZXN0IG12IHRhYmxlICh0d28gY2hvaWNlcykKICAqICAgICAgICAtIChlbmNvZGluZykgc2VsZWN0IGJlc3QgdmxjL2RjIHRhYmxlCiAgKi8KIAotLyogVGhpcyB0YWJsZSBpcyBwcmFjdGljYWxseSBpZGVudGljYWwgdG8gdGhlIG9uZSBmcm9tIGgyNjMKKy8qIFRoaXMgdGFibGUgaXMgcHJhY3RpY2FsbHkgaWRlbnRpY2FsIHRvIHRoZSBvbmUgZnJvbSBILjI2MwogICogZXhjZXB0IHRoYXQgaXQgaXMgaW52ZXJ0ZWQuICovCiBzdGF0aWMgYXZfY29sZCB2b2lkIGluaXRfaDI2M19kY19mb3JfbXNtcGVnNCh2b2lkKQogewpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGw9IGxldmVsOwogCi0gICAgICAgICAgICAvKiBsdW1pbmFuY2UgaDI2MyAqLworICAgICAgICAgICAgLyogbHVtaW5hbmNlIEguMjYzICovCiAgICAgICAgICAgICB1bmlfY29kZT0gZmZfbXBlZzRfREN0YWJfbHVtW3NpemVdWzBdOwogICAgICAgICAgICAgdW5pX2xlbiA9IGZmX21wZWc0X0RDdGFiX2x1bVtzaXplXVsxXTsKICAgICAgICAgICAgIHVuaV9jb2RlIF49ICgxPDx1bmlfbGVuKS0xOyAvL00kIGRvZXMgbm90IGxpa2UgY29tcGF0aWJpbGl0eQpAQCAtODcsNyArODcsNyBAQAogICAgICAgICAgICAgZmZfdjJfZGNfbHVtX3RhYmxlW2xldmVsICsgMjU2XVswXSA9IHVuaV9jb2RlOwogICAgICAgICAgICAgZmZfdjJfZGNfbHVtX3RhYmxlW2xldmVsICsgMjU2XVsxXSA9IHVuaV9sZW47CiAKLSAgICAgICAgICAgIC8qIGNocm9taW5hbmNlIGgyNjMgKi8KKyAgICAgICAgICAgIC8qIGNocm9taW5hbmNlIEguMjYzICovCiAgICAgICAgICAgICB1bmlfY29kZT0gZmZfbXBlZzRfREN0YWJfY2hyb21bc2l6ZV1bMF07CiAgICAgICAgICAgICB1bmlfbGVuID0gZmZfbXBlZzRfREN0YWJfY2hyb21bc2l6ZV1bMV07CiAgICAgICAgICAgICB1bmlfY29kZSBePSAoMTw8dW5pX2xlbiktMTsgLy9NJCBkb2VzIG5vdCBsaWtlIGNvbXBhdGliaWxpdHkKQEAgLTI1Miw3ICsyNTIsNyBAQAogICAgICAgICBjID0gRkFTVERJVigoYyArIChzY2FsZSA+PiAxKSksIHNjYWxlKTsKICAgICB9CiAjZW5kaWYKLSAgICAvKiBYWFg6IFdBUk5JTkc6IHRoZXkgZGlkIG5vdCBjaG9vc2UgdGhlIHNhbWUgdGVzdCBhcyBNUEVHNC4gVGhpcworICAgIC8qIFhYWDogV0FSTklORzogdGhleSBkaWQgbm90IGNob29zZSB0aGUgc2FtZSB0ZXN0IGFzIE1QRUctNC4gVGhpcwogICAgICAgIGlzIHZlcnkgaW1wb3J0YW50ICEgKi8KICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb24+Myl7CiAgICAgICAgIGlmKHMtPmludGVyX2ludHJhX3ByZWQpewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tc21wZWc0ZGF0YS5jIGIvbGliYXZjb2RlYy9tc21wZWc0ZGF0YS5jCmluZGV4IDhlYjA3ZTkuLmI5YzFkOGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXNtcGVnNGRhdGEuYworKysgYi9saWJhdmNvZGVjL21zbXBlZzRkYXRhLmMKQEAgLTQxLDE5NTkgKzQxLDE5MjEgQEAKIAogLyogaW50cmEgcGljdHVyZSBtYWNyb2Jsb2NrIGNvZGVkIGJsb2NrIHBhdHRlcm4gKi8KIGNvbnN0IHVpbnQxNl90IGZmX21zbXA0X21iX2lfdGFibGVbNjRdWzJdID0gewoteyAgMHgxLCAxIH0seyAgMHgxNywgIDYgfSx7ICAgMHg5LCAgNSB9LHsgICAweDUsICA1IH0sCi17ICAweDYsIDUgfSx7ICAweDQ3LCAgOSB9LHsgIDB4MjAsICA3IH0seyAgMHgxMCwgIDcgfSwKLXsgIDB4MiwgNSB9LHsgIDB4N2MsICA5IH0seyAgMHgzYSwgIDcgfSx7ICAweDFkLCAgNyB9LAoteyAgMHgyLCA2IH0seyAgMHhlYywgIDkgfSx7ICAweDc3LCAgOCB9LHsgICAweDAsICA4IH0sCi17ICAweDMsIDUgfSx7ICAweGI3LCAgOSB9LHsgIDB4MmMsICA3IH0seyAgMHgxMywgIDcgfSwKLXsgIDB4MSwgNiB9LHsgMHgxNjgsIDEwIH0seyAgMHg0NiwgIDggfSx7ICAweDNmLCAgOCB9LAoteyAweDFlLCA2IH0seyAweDcxMiwgMTMgfSx7ICAweGI1LCAgOSB9LHsgIDB4NDIsICA4IH0sCi17IDB4MjIsIDcgfSx7IDB4MWM1LCAxMSB9LHsgMHgxMWUsIDEwIH0seyAgMHg4NywgIDkgfSwKLXsgIDB4NiwgNCB9LHsgICAweDMsICA5IH0seyAgMHgxZSwgIDcgfSx7ICAweDFjLCAgNiB9LAoteyAweDEyLCA3IH0seyAweDM4OCwgMTIgfSx7ICAweDQ0LCAgOSB9LHsgIDB4NzAsICA5IH0sCi17IDB4MWYsIDYgfSx7IDB4MjNlLCAxMSB9LHsgIDB4MzksICA4IH0seyAgMHg4ZSwgIDkgfSwKLXsgIDB4MSwgNyB9LHsgMHgxYzYsIDExIH0seyAgMHhiNiwgIDkgfSx7ICAweDQ1LCAgOSB9LAoteyAweDE0LCA2IH0seyAweDIzZiwgMTEgfSx7ICAweDdkLCAgOSB9LHsgIDB4MTgsICA5IH0sCi17ICAweDcsIDcgfSx7IDB4MWM3LCAxMSB9LHsgIDB4ODYsICA5IH0seyAgMHgxOSwgIDkgfSwKLXsgMHgxNSwgNiB9LHsgMHgxZGIsIDEwIH0seyAgIDB4MiwgIDkgfSx7ICAweDQ2LCAgOSB9LAoteyAgMHhkLCA4IH0seyAweDcxMywgMTMgfSx7IDB4MWRhLCAxMCB9LHsgMHgxNjksIDEwIH0sCisgICAgeyAgMHgxLCAxIH0sIHsgIDB4MTcsICA2IH0sIHsgICAweDksICA1IH0sIHsgICAweDUsICA1IH0sCisgICAgeyAgMHg2LCA1IH0sIHsgIDB4NDcsICA5IH0sIHsgIDB4MjAsICA3IH0sIHsgIDB4MTAsICA3IH0sCisgICAgeyAgMHgyLCA1IH0sIHsgIDB4N2MsICA5IH0sIHsgIDB4M2EsICA3IH0sIHsgIDB4MWQsICA3IH0sCisgICAgeyAgMHgyLCA2IH0sIHsgIDB4ZWMsICA5IH0sIHsgIDB4NzcsICA4IH0sIHsgICAweDAsICA4IH0sCisgICAgeyAgMHgzLCA1IH0sIHsgIDB4YjcsICA5IH0sIHsgIDB4MmMsICA3IH0sIHsgIDB4MTMsICA3IH0sCisgICAgeyAgMHgxLCA2IH0sIHsgMHgxNjgsIDEwIH0sIHsgIDB4NDYsICA4IH0sIHsgIDB4M2YsICA4IH0sCisgICAgeyAweDFlLCA2IH0sIHsgMHg3MTIsIDEzIH0sIHsgIDB4YjUsICA5IH0sIHsgIDB4NDIsICA4IH0sCisgICAgeyAweDIyLCA3IH0sIHsgMHgxYzUsIDExIH0sIHsgMHgxMWUsIDEwIH0sIHsgIDB4ODcsICA5IH0sCisgICAgeyAgMHg2LCA0IH0sIHsgICAweDMsICA5IH0sIHsgIDB4MWUsICA3IH0sIHsgIDB4MWMsICA2IH0sCisgICAgeyAweDEyLCA3IH0sIHsgMHgzODgsIDEyIH0sIHsgIDB4NDQsICA5IH0sIHsgIDB4NzAsICA5IH0sCisgICAgeyAweDFmLCA2IH0sIHsgMHgyM2UsIDExIH0sIHsgIDB4MzksICA4IH0sIHsgIDB4OGUsICA5IH0sCisgICAgeyAgMHgxLCA3IH0sIHsgMHgxYzYsIDExIH0sIHsgIDB4YjYsICA5IH0sIHsgIDB4NDUsICA5IH0sCisgICAgeyAweDE0LCA2IH0sIHsgMHgyM2YsIDExIH0sIHsgIDB4N2QsICA5IH0sIHsgIDB4MTgsICA5IH0sCisgICAgeyAgMHg3LCA3IH0sIHsgMHgxYzcsIDExIH0sIHsgIDB4ODYsICA5IH0sIHsgIDB4MTksICA5IH0sCisgICAgeyAweDE1LCA2IH0sIHsgMHgxZGIsIDEwIH0sIHsgICAweDIsICA5IH0sIHsgIDB4NDYsICA5IH0sCisgICAgeyAgMHhkLCA4IH0sIHsgMHg3MTMsIDEzIH0sIHsgMHgxZGEsIDEwIH0sIHsgMHgxNjksIDEwIH0sCiB9OwogCiAvKiBub24gaW50cmEgcGljdHVyZSBtYWNyb2Jsb2NrIGNvZGVkIGJsb2NrIHBhdHRlcm4gKyBtYiB0eXBlICovCiBjb25zdCB1aW50MzJfdCBmZl90YWJsZV9tYl9ub25faW50cmFbMTI4XVsyXSA9IHsKLXsgICAweDQwLCAgNyB9LHsgICAweDEzYzksIDEzIH0seyAgIDB4OWZkLCAxMiB9LHsgICAweDFmYywgMTUgfSwKLXsgIDB4OWZjLCAxMiB9LHsgICAgMHhhODMsIDE4IH0seyAweDEyZDM0LCAxNyB9LHsgIDB4ODNiYywgMTYgfSwKLXsgIDB4ODNhLCAxMiB9LHsgICAgMHg3ZjgsIDE3IH0seyAgIDB4M2ZkLCAxNiB9LHsgICAweDNmZiwgMTYgfSwKLXsgICAweDc5LCAxMyB9LHsgICAgMHhhODIsIDE4IH0seyAgMHg5NjlkLCAxNiB9LHsgICAweDJhNCwgMTYgfSwKLXsgIDB4OTc4LCAxMiB9LHsgICAgMHg1NDMsIDE3IH0seyAgMHg0MWRmLCAxNSB9LHsgICAweDdmOSwgMTcgfSwKLXsgMHgxMmYzLCAxMyB9LHsgIDB4MjVhNmIsIDE4IH0seyAweDI1ZWY5LCAxOCB9LHsgICAweDNmYSwgMTYgfSwKLXsgMHgyMGVlLCAxNCB9LHsgIDB4OTY5YWIsIDIwIH0seyAgMHg5NjljLCAxNiB9LHsgMHgyNWVmOCwgMTggfSwKLXsgMHgxMmQyLCAxMyB9LHsgICAgMHhhODUsIDE4IH0seyAgMHg5NjllLCAxNiB9LHsgIDB4NGJjOCwgMTUgfSwKLXsgICAweDNkLCAxMiB9LHsgIDB4MTJmN2YsIDE3IH0seyAgIDB4MmEyLCAxNiB9LHsgIDB4OTY5ZiwgMTYgfSwKLXsgMHgyNWVlLCAxNCB9LHsgMHgxMmQzNTUsIDIxIH0seyAweDEyZjdkLCAxNyB9LHsgMHgxMmY3ZSwgMTcgfSwKLXsgIDB4OWU1LCAxMiB9LHsgICAgMHhhODEsIDE4IH0seyAweDRiNGQ0LCAxOSB9LHsgIDB4ODNiZCwgMTYgfSwKLXsgICAweDc4LCAxMyB9LHsgICAweDk2OWIsIDE2IH0seyAgIDB4M2ZlLCAxNiB9LHsgICAweDJhNSwgMTYgfSwKLXsgICAweDdlLCAxMyB9LHsgICAgMHhhODAsIDE4IH0seyAgIDB4MmEzLCAxNiB9LHsgICAweDNmYiwgMTYgfSwKLXsgMHgxMDc2LCAxMyB9LHsgICAgMHhhODQsIDE4IH0seyAgIDB4MTUzLCAxNSB9LHsgIDB4NGJjOSwgMTUgfSwKLXsgICAweDU1LCAxMyB9LHsgMHgxMmQzNTQsIDIxIH0seyAgMHg0YmRlLCAxNSB9LHsgIDB4MjVlNSwgMTQgfSwKLXsgIDB4MjViLCAxMCB9LHsgICAweDRiNGMsIDE1IH0seyAgIDB4OTZiLCAxMiB9LHsgICAweDk2YSwgMTIgfSwKLXsgICAgMHgxLCAgMiB9LHsgICAgICAweDAsICA3IH0seyAgICAweDI2LCAgNiB9LHsgICAweDEyYiwgIDkgfSwKLXsgICAgMHg3LCAgMyB9LHsgICAgMHgyMGYsIDEwIH0seyAgICAgMHg0LCAgOSB9LHsgICAgMHgyOCwgMTIgfSwKLXsgICAgMHg2LCAgMyB9LHsgICAgMHgyMGEsIDEwIH0seyAgIDB4MTI4LCAgOSB9LHsgICAgMHgyYiwgMTIgfSwKLXsgICAweDExLCAgNSB9LHsgICAgIDB4MWIsIDExIH0seyAgIDB4MTNhLCAgOSB9LHsgICAweDRmZiwgMTEgfSwKLXsgICAgMHgzLCAgNCB9LHsgICAgMHgyNzcsIDEwIH0seyAgIDB4MTA2LCAgOSB9LHsgICAweDgzOSwgMTIgfSwKLXsgICAgMHhiLCAgNCB9LHsgICAgMHgyN2IsIDEwIH0seyAgIDB4MTJjLCAgOSB9LHsgICAweDRiZiwgMTEgfSwKLXsgICAgMHg5LCAgNiB9LHsgICAgIDB4MzUsIDEyIH0seyAgIDB4MjdlLCAxMCB9LHsgIDB4MTNjOCwgMTMgfSwKLXsgICAgMHgxLCAgNiB9LHsgICAgMHg0YWEsIDExIH0seyAgIDB4MjA4LCAxMCB9LHsgICAgMHgyOSwgMTIgfSwKLXsgICAgMHgxLCAgNCB9LHsgICAgMHgyNTQsIDEwIH0seyAgIDB4MTJlLCAgOSB9LHsgICAweDgzOCwgMTIgfSwKLXsgICAweDI0LCAgNiB9LHsgICAgMHg0ZjMsIDExIH0seyAgIDB4Mjc2LCAxMCB9LHsgIDB4MTJmNiwgMTMgfSwKLXsgICAgMHgxLCAgNSB9LHsgICAgMHgyN2EsIDEwIH0seyAgIDB4MTNlLCAgOSB9LHsgICAgMHgzZSwgMTIgfSwKLXsgICAgMHg4LCAgNiB9LHsgICAgMHg0MTMsIDExIH0seyAgICAgMHhjLCAxMCB9LHsgICAweDRiZSwgMTEgfSwKLXsgICAweDE0LCAgNSB9LHsgICAgMHg0MTIsIDExIH0seyAgIDB4MjUzLCAxMCB9LHsgICAweDk3YSwgMTIgfSwKLXsgICAweDIxLCAgNiB9LHsgICAgMHg0YWIsIDExIH0seyAgIDB4MjBiLCAxMCB9LHsgICAgMHgzNCwgMTIgfSwKLXsgICAweDE1LCAgNSB9LHsgICAgMHgyNzgsIDEwIH0seyAgIDB4MjUyLCAxMCB9LHsgICAweDk2OCwgMTIgfSwKLXsgICAgMHg1LCAgNSB9LHsgICAgICAweGIsIDEwIH0seyAgICAweDljLCAgOCB9LHsgICAgIDB4ZSwgMTAgfSwKKyAgICB7ICAgMHg0MCwgIDcgfSwgeyAgIDB4MTNjOSwgMTMgfSwgeyAgIDB4OWZkLCAxMiB9LCB7ICAgMHgxZmMsIDE1IH0sCisgICAgeyAgMHg5ZmMsIDEyIH0sIHsgICAgMHhhODMsIDE4IH0sIHsgMHgxMmQzNCwgMTcgfSwgeyAgMHg4M2JjLCAxNiB9LAorICAgIHsgIDB4ODNhLCAxMiB9LCB7ICAgIDB4N2Y4LCAxNyB9LCB7ICAgMHgzZmQsIDE2IH0sIHsgICAweDNmZiwgMTYgfSwKKyAgICB7ICAgMHg3OSwgMTMgfSwgeyAgICAweGE4MiwgMTggfSwgeyAgMHg5NjlkLCAxNiB9LCB7ICAgMHgyYTQsIDE2IH0sCisgICAgeyAgMHg5NzgsIDEyIH0sIHsgICAgMHg1NDMsIDE3IH0sIHsgIDB4NDFkZiwgMTUgfSwgeyAgIDB4N2Y5LCAxNyB9LAorICAgIHsgMHgxMmYzLCAxMyB9LCB7ICAweDI1YTZiLCAxOCB9LCB7IDB4MjVlZjksIDE4IH0sIHsgICAweDNmYSwgMTYgfSwKKyAgICB7IDB4MjBlZSwgMTQgfSwgeyAgMHg5NjlhYiwgMjAgfSwgeyAgMHg5NjljLCAxNiB9LCB7IDB4MjVlZjgsIDE4IH0sCisgICAgeyAweDEyZDIsIDEzIH0sIHsgICAgMHhhODUsIDE4IH0sIHsgIDB4OTY5ZSwgMTYgfSwgeyAgMHg0YmM4LCAxNSB9LAorICAgIHsgICAweDNkLCAxMiB9LCB7ICAweDEyZjdmLCAxNyB9LCB7ICAgMHgyYTIsIDE2IH0sIHsgIDB4OTY5ZiwgMTYgfSwKKyAgICB7IDB4MjVlZSwgMTQgfSwgeyAweDEyZDM1NSwgMjEgfSwgeyAweDEyZjdkLCAxNyB9LCB7IDB4MTJmN2UsIDE3IH0sCisgICAgeyAgMHg5ZTUsIDEyIH0sIHsgICAgMHhhODEsIDE4IH0sIHsgMHg0YjRkNCwgMTkgfSwgeyAgMHg4M2JkLCAxNiB9LAorICAgIHsgICAweDc4LCAxMyB9LCB7ICAgMHg5NjliLCAxNiB9LCB7ICAgMHgzZmUsIDE2IH0sIHsgICAweDJhNSwgMTYgfSwKKyAgICB7ICAgMHg3ZSwgMTMgfSwgeyAgICAweGE4MCwgMTggfSwgeyAgIDB4MmEzLCAxNiB9LCB7ICAgMHgzZmIsIDE2IH0sCisgICAgeyAweDEwNzYsIDEzIH0sIHsgICAgMHhhODQsIDE4IH0sIHsgICAweDE1MywgMTUgfSwgeyAgMHg0YmM5LCAxNSB9LAorICAgIHsgICAweDU1LCAxMyB9LCB7IDB4MTJkMzU0LCAyMSB9LCB7ICAweDRiZGUsIDE1IH0sIHsgIDB4MjVlNSwgMTQgfSwKKyAgICB7ICAweDI1YiwgMTAgfSwgeyAgIDB4NGI0YywgMTUgfSwgeyAgIDB4OTZiLCAxMiB9LCB7ICAgMHg5NmEsIDEyIH0sCisgICAgeyAgICAweDEsICAyIH0sIHsgICAgICAweDAsICA3IH0sIHsgICAgMHgyNiwgIDYgfSwgeyAgIDB4MTJiLCAgOSB9LAorICAgIHsgICAgMHg3LCAgMyB9LCB7ICAgIDB4MjBmLCAxMCB9LCB7ICAgICAweDQsICA5IH0sIHsgICAgMHgyOCwgMTIgfSwKKyAgICB7ICAgIDB4NiwgIDMgfSwgeyAgICAweDIwYSwgMTAgfSwgeyAgIDB4MTI4LCAgOSB9LCB7ICAgIDB4MmIsIDEyIH0sCisgICAgeyAgIDB4MTEsICA1IH0sIHsgICAgIDB4MWIsIDExIH0sIHsgICAweDEzYSwgIDkgfSwgeyAgIDB4NGZmLCAxMSB9LAorICAgIHsgICAgMHgzLCAgNCB9LCB7ICAgIDB4Mjc3LCAxMCB9LCB7ICAgMHgxMDYsICA5IH0sIHsgICAweDgzOSwgMTIgfSwKKyAgICB7ICAgIDB4YiwgIDQgfSwgeyAgICAweDI3YiwgMTAgfSwgeyAgIDB4MTJjLCAgOSB9LCB7ICAgMHg0YmYsIDExIH0sCisgICAgeyAgICAweDksICA2IH0sIHsgICAgIDB4MzUsIDEyIH0sIHsgICAweDI3ZSwgMTAgfSwgeyAgMHgxM2M4LCAxMyB9LAorICAgIHsgICAgMHgxLCAgNiB9LCB7ICAgIDB4NGFhLCAxMSB9LCB7ICAgMHgyMDgsIDEwIH0sIHsgICAgMHgyOSwgMTIgfSwKKyAgICB7ICAgIDB4MSwgIDQgfSwgeyAgICAweDI1NCwgMTAgfSwgeyAgIDB4MTJlLCAgOSB9LCB7ICAgMHg4MzgsIDEyIH0sCisgICAgeyAgIDB4MjQsICA2IH0sIHsgICAgMHg0ZjMsIDExIH0sIHsgICAweDI3NiwgMTAgfSwgeyAgMHgxMmY2LCAxMyB9LAorICAgIHsgICAgMHgxLCAgNSB9LCB7ICAgIDB4MjdhLCAxMCB9LCB7ICAgMHgxM2UsICA5IH0sIHsgICAgMHgzZSwgMTIgfSwKKyAgICB7ICAgIDB4OCwgIDYgfSwgeyAgICAweDQxMywgMTEgfSwgeyAgICAgMHhjLCAxMCB9LCB7ICAgMHg0YmUsIDExIH0sCisgICAgeyAgIDB4MTQsICA1IH0sIHsgICAgMHg0MTIsIDExIH0sIHsgICAweDI1MywgMTAgfSwgeyAgIDB4OTdhLCAxMiB9LAorICAgIHsgICAweDIxLCAgNiB9LCB7ICAgIDB4NGFiLCAxMSB9LCB7ICAgMHgyMGIsIDEwIH0sIHsgICAgMHgzNCwgMTIgfSwKKyAgICB7ICAgMHgxNSwgIDUgfSwgeyAgICAweDI3OCwgMTAgfSwgeyAgIDB4MjUyLCAxMCB9LCB7ICAgMHg5NjgsIDEyIH0sCisgICAgeyAgICAweDUsICA1IH0sIHsgICAgICAweGIsIDEwIH0sIHsgICAgMHg5YywgIDggfSwgeyAgICAgMHhlLCAxMCB9LAogfTsKIAogLyogZGMgdGFibGUgMCAqLwogCiBjb25zdCB1aW50MzJfdCBmZl90YWJsZTBfZGNfbHVtWzEyMF1bMl0gPSB7Ci17ICAgICAweDEsICAxIH0seyAgICAgIDB4MSwgMiB9LHsgICAgIDB4MSwgIDQgfSx7ICAgICAweDEsICA1IH0sCi17ICAgICAweDUsICA1IH0seyAgICAgIDB4NywgNSB9LHsgICAgIDB4OCwgIDYgfSx7ICAgICAweGMsICA2IH0sCi17ICAgICAweDAsICA3IH0seyAgICAgIDB4MiwgNyB9LHsgICAgMHgxMiwgIDcgfSx7ICAgIDB4MWEsICA3IH0sCi17ICAgICAweDMsICA4IH0seyAgICAgIDB4NywgOCB9LHsgICAgMHgyNywgIDggfSx7ICAgIDB4MzcsICA4IH0sCi17ICAgICAweDUsICA5IH0seyAgICAgMHg0YywgOSB9LHsgICAgMHg2YywgIDkgfSx7ICAgIDB4NmQsICA5IH0sCi17ICAgICAweDgsIDEwIH0seyAgICAweDE5LCAxMCB9LHsgICAgMHg5YiwgMTAgfSx7ICAgIDB4MWIsIDEwIH0sCi17ICAgIDB4OWEsIDEwIH0seyAgICAweDEzLCAxMSB9LHsgICAgMHgzNCwgMTEgfSx7ICAgIDB4MzUsIDExIH0sCi17ICAgIDB4NjEsIDEyIH0seyAgICAweDQ4LCAxMyB9LHsgICAgMHhjNCwgMTMgfSx7ICAgIDB4NGEsIDEzIH0sCi17ICAgIDB4YzYsIDEzIH0seyAgICAweGM3LCAxMyB9LHsgICAgMHg5MiwgMTQgfSx7ICAgMHgxOGIsIDE0IH0sCi17ICAgIDB4OTMsIDE0IH0seyAgIDB4MTgzLCAxNCB9LHsgICAweDE4MiwgMTQgfSx7ICAgIDB4OTYsIDE0IH0sCi17ICAgIDB4OTcsIDE0IH0seyAgIDB4MTgwLCAxNCB9LHsgICAweDMxNCwgMTUgfSx7ICAgMHgzMTUsIDE1IH0sCi17ICAgMHg2MDUsIDE2IH0seyAgIDB4NjA0LCAxNiB9LHsgICAweDYwNiwgMTYgfSx7ICAgMHhjMGUsIDE3IH0sCi17IDB4MzAzY2QsIDIzIH0seyAweDMwM2M5LCAyMyB9LHsgMHgzMDNjOCwgMjMgfSx7IDB4MzAzY2EsIDIzIH0sCi17IDB4MzAzY2IsIDIzIH0seyAweDMwM2NjLCAyMyB9LHsgMHgzMDNjZSwgMjMgfSx7IDB4MzAzY2YsIDIzIH0sCi17IDB4MzAzZDAsIDIzIH0seyAweDMwM2QxLCAyMyB9LHsgMHgzMDNkMiwgMjMgfSx7IDB4MzAzZDMsIDIzIH0sCi17IDB4MzAzZDQsIDIzIH0seyAweDMwM2Q1LCAyMyB9LHsgMHgzMDNkNiwgMjMgfSx7IDB4MzAzZDcsIDIzIH0sCi17IDB4MzAzZDgsIDIzIH0seyAweDMwM2Q5LCAyMyB9LHsgMHgzMDNkYSwgMjMgfSx7IDB4MzAzZGIsIDIzIH0sCi17IDB4MzAzZGMsIDIzIH0seyAweDMwM2RkLCAyMyB9LHsgMHgzMDNkZSwgMjMgfSx7IDB4MzAzZGYsIDIzIH0sCi17IDB4MzAzZTAsIDIzIH0seyAweDMwM2UxLCAyMyB9LHsgMHgzMDNlMiwgMjMgfSx7IDB4MzAzZTMsIDIzIH0sCi17IDB4MzAzZTQsIDIzIH0seyAweDMwM2U1LCAyMyB9LHsgMHgzMDNlNiwgMjMgfSx7IDB4MzAzZTcsIDIzIH0sCi17IDB4MzAzZTgsIDIzIH0seyAweDMwM2U5LCAyMyB9LHsgMHgzMDNlYSwgMjMgfSx7IDB4MzAzZWIsIDIzIH0sCi17IDB4MzAzZWMsIDIzIH0seyAweDMwM2VkLCAyMyB9LHsgMHgzMDNlZSwgMjMgfSx7IDB4MzAzZWYsIDIzIH0sCi17IDB4MzAzZjAsIDIzIH0seyAweDMwM2YxLCAyMyB9LHsgMHgzMDNmMiwgMjMgfSx7IDB4MzAzZjMsIDIzIH0sCi17IDB4MzAzZjQsIDIzIH0seyAweDMwM2Y1LCAyMyB9LHsgMHgzMDNmNiwgMjMgfSx7IDB4MzAzZjcsIDIzIH0sCi17IDB4MzAzZjgsIDIzIH0seyAweDMwM2Y5LCAyMyB9LHsgMHgzMDNmYSwgMjMgfSx7IDB4MzAzZmIsIDIzIH0sCi17IDB4MzAzZmMsIDIzIH0seyAweDMwM2ZkLCAyMyB9LHsgMHgzMDNmZSwgMjMgfSx7IDB4MzAzZmYsIDIzIH0sCi17IDB4NjA3ODAsIDI0IH0seyAweDYwNzgxLCAyNCB9LHsgMHg2MDc4MiwgMjQgfSx7IDB4NjA3ODMsIDI0IH0sCi17IDB4NjA3ODQsIDI0IH0seyAweDYwNzg1LCAyNCB9LHsgMHg2MDc4NiwgMjQgfSx7IDB4NjA3ODcsIDI0IH0sCi17IDB4NjA3ODgsIDI0IH0seyAweDYwNzg5LCAyNCB9LHsgMHg2MDc4YSwgMjQgfSx7IDB4NjA3OGIsIDI0IH0sCi17IDB4NjA3OGMsIDI0IH0seyAweDYwNzhkLCAyNCB9LHsgMHg2MDc4ZSwgMjQgfSx7IDB4NjA3OGYsIDI0IH0sCisgICAgeyAgICAgMHgxLCAgMSB9LCB7ICAgICAweDEsICAyIH0sIHsgICAgIDB4MSwgIDQgfSwgeyAgICAgMHgxLCAgNSB9LAorICAgIHsgICAgIDB4NSwgIDUgfSwgeyAgICAgMHg3LCAgNSB9LCB7ICAgICAweDgsICA2IH0sIHsgICAgIDB4YywgIDYgfSwKKyAgICB7ICAgICAweDAsICA3IH0sIHsgICAgIDB4MiwgIDcgfSwgeyAgICAweDEyLCAgNyB9LCB7ICAgIDB4MWEsICA3IH0sCisgICAgeyAgICAgMHgzLCAgOCB9LCB7ICAgICAweDcsICA4IH0sIHsgICAgMHgyNywgIDggfSwgeyAgICAweDM3LCAgOCB9LAorICAgIHsgICAgIDB4NSwgIDkgfSwgeyAgICAweDRjLCAgOSB9LCB7ICAgIDB4NmMsICA5IH0sIHsgICAgMHg2ZCwgIDkgfSwKKyAgICB7ICAgICAweDgsIDEwIH0sIHsgICAgMHgxOSwgMTAgfSwgeyAgICAweDliLCAxMCB9LCB7ICAgIDB4MWIsIDEwIH0sCisgICAgeyAgICAweDlhLCAxMCB9LCB7ICAgIDB4MTMsIDExIH0sIHsgICAgMHgzNCwgMTEgfSwgeyAgICAweDM1LCAxMSB9LAorICAgIHsgICAgMHg2MSwgMTIgfSwgeyAgICAweDQ4LCAxMyB9LCB7ICAgIDB4YzQsIDEzIH0sIHsgICAgMHg0YSwgMTMgfSwKKyAgICB7ICAgIDB4YzYsIDEzIH0sIHsgICAgMHhjNywgMTMgfSwgeyAgICAweDkyLCAxNCB9LCB7ICAgMHgxOGIsIDE0IH0sCisgICAgeyAgICAweDkzLCAxNCB9LCB7ICAgMHgxODMsIDE0IH0sIHsgICAweDE4MiwgMTQgfSwgeyAgICAweDk2LCAxNCB9LAorICAgIHsgICAgMHg5NywgMTQgfSwgeyAgIDB4MTgwLCAxNCB9LCB7ICAgMHgzMTQsIDE1IH0sIHsgICAweDMxNSwgMTUgfSwKKyAgICB7ICAgMHg2MDUsIDE2IH0sIHsgICAweDYwNCwgMTYgfSwgeyAgIDB4NjA2LCAxNiB9LCB7ICAgMHhjMGUsIDE3IH0sCisgICAgeyAweDMwM2NkLCAyMyB9LCB7IDB4MzAzYzksIDIzIH0sIHsgMHgzMDNjOCwgMjMgfSwgeyAweDMwM2NhLCAyMyB9LAorICAgIHsgMHgzMDNjYiwgMjMgfSwgeyAweDMwM2NjLCAyMyB9LCB7IDB4MzAzY2UsIDIzIH0sIHsgMHgzMDNjZiwgMjMgfSwKKyAgICB7IDB4MzAzZDAsIDIzIH0sIHsgMHgzMDNkMSwgMjMgfSwgeyAweDMwM2QyLCAyMyB9LCB7IDB4MzAzZDMsIDIzIH0sCisgICAgeyAweDMwM2Q0LCAyMyB9LCB7IDB4MzAzZDUsIDIzIH0sIHsgMHgzMDNkNiwgMjMgfSwgeyAweDMwM2Q3LCAyMyB9LAorICAgIHsgMHgzMDNkOCwgMjMgfSwgeyAweDMwM2Q5LCAyMyB9LCB7IDB4MzAzZGEsIDIzIH0sIHsgMHgzMDNkYiwgMjMgfSwKKyAgICB7IDB4MzAzZGMsIDIzIH0sIHsgMHgzMDNkZCwgMjMgfSwgeyAweDMwM2RlLCAyMyB9LCB7IDB4MzAzZGYsIDIzIH0sCisgICAgeyAweDMwM2UwLCAyMyB9LCB7IDB4MzAzZTEsIDIzIH0sIHsgMHgzMDNlMiwgMjMgfSwgeyAweDMwM2UzLCAyMyB9LAorICAgIHsgMHgzMDNlNCwgMjMgfSwgeyAweDMwM2U1LCAyMyB9LCB7IDB4MzAzZTYsIDIzIH0sIHsgMHgzMDNlNywgMjMgfSwKKyAgICB7IDB4MzAzZTgsIDIzIH0sIHsgMHgzMDNlOSwgMjMgfSwgeyAweDMwM2VhLCAyMyB9LCB7IDB4MzAzZWIsIDIzIH0sCisgICAgeyAweDMwM2VjLCAyMyB9LCB7IDB4MzAzZWQsIDIzIH0sIHsgMHgzMDNlZSwgMjMgfSwgeyAweDMwM2VmLCAyMyB9LAorICAgIHsgMHgzMDNmMCwgMjMgfSwgeyAweDMwM2YxLCAyMyB9LCB7IDB4MzAzZjIsIDIzIH0sIHsgMHgzMDNmMywgMjMgfSwKKyAgICB7IDB4MzAzZjQsIDIzIH0sIHsgMHgzMDNmNSwgMjMgfSwgeyAweDMwM2Y2LCAyMyB9LCB7IDB4MzAzZjcsIDIzIH0sCisgICAgeyAweDMwM2Y4LCAyMyB9LCB7IDB4MzAzZjksIDIzIH0sIHsgMHgzMDNmYSwgMjMgfSwgeyAweDMwM2ZiLCAyMyB9LAorICAgIHsgMHgzMDNmYywgMjMgfSwgeyAweDMwM2ZkLCAyMyB9LCB7IDB4MzAzZmUsIDIzIH0sIHsgMHgzMDNmZiwgMjMgfSwKKyAgICB7IDB4NjA3ODAsIDI0IH0sIHsgMHg2MDc4MSwgMjQgfSwgeyAweDYwNzgyLCAyNCB9LCB7IDB4NjA3ODMsIDI0IH0sCisgICAgeyAweDYwNzg0LCAyNCB9LCB7IDB4NjA3ODUsIDI0IH0sIHsgMHg2MDc4NiwgMjQgfSwgeyAweDYwNzg3LCAyNCB9LAorICAgIHsgMHg2MDc4OCwgMjQgfSwgeyAweDYwNzg5LCAyNCB9LCB7IDB4NjA3OGEsIDI0IH0sIHsgMHg2MDc4YiwgMjQgfSwKKyAgICB7IDB4NjA3OGMsIDI0IH0sIHsgMHg2MDc4ZCwgMjQgfSwgeyAweDYwNzhlLCAyNCB9LCB7IDB4NjA3OGYsIDI0IH0sCiB9OwogCiBjb25zdCB1aW50MzJfdCBmZl90YWJsZTBfZGNfY2hyb21hWzEyMF1bMl0gPSB7Ci17ICAgICAgMHgwLCAgMiB9LHsgICAgICAweDEsICAyIH0seyAgICAgIDB4NSwgIDMgfSx7ICAgICAgMHg5LCAgNCB9LAoteyAgICAgIDB4ZCwgIDQgfSx7ICAgICAweDExLCAgNSB9LHsgICAgIDB4MWQsICA1IH0seyAgICAgMHgxZiwgIDUgfSwKLXsgICAgIDB4MjEsICA2IH0seyAgICAgMHgzMSwgIDYgfSx7ICAgICAweDM4LCAgNiB9LHsgICAgIDB4MzMsICA2IH0sCi17ICAgICAweDM5LCAgNiB9LHsgICAgIDB4M2QsICA2IH0seyAgICAgMHg2MSwgIDcgfSx7ICAgICAweDc5LCAgNyB9LAoteyAgICAgMHg4MCwgIDggfSx7ICAgICAweGM4LCAgOCB9LHsgICAgIDB4Y2EsICA4IH0seyAgICAgMHhmMCwgIDggfSwKLXsgICAgIDB4ODEsICA4IH0seyAgICAgMHhjMCwgIDggfSx7ICAgICAweGM5LCAgOCB9LHsgICAgMHgxMDcsICA5IH0sCi17ICAgIDB4MTA2LCAgOSB9LHsgICAgMHgxOTYsICA5IH0seyAgICAweDE4MywgIDkgfSx7ICAgIDB4MWUzLCAgOSB9LAoteyAgICAweDFlMiwgIDkgfSx7ICAgIDB4MjBhLCAxMCB9LHsgICAgMHgyMGIsIDEwIH0seyAgICAweDYwOSwgMTEgfSwKLXsgICAgMHg0MTIsIDExIH0seyAgICAweDQxMywgMTEgfSx7ICAgIDB4NjBiLCAxMSB9LHsgICAgMHg0MTEsIDExIH0sCi17ICAgIDB4NjBhLCAxMSB9LHsgICAgMHg2NWYsIDExIH0seyAgICAweDQxMCwgMTEgfSx7ICAgIDB4NjVkLCAxMSB9LAoteyAgICAweDY1ZSwgMTEgfSx7ICAgIDB4Y2I4LCAxMiB9LHsgICAgMHhjMTAsIDEyIH0seyAgICAweGNiOSwgMTIgfSwKLXsgICAweDE4MjMsIDEzIH0seyAgIDB4MzA0NSwgMTQgfSx7ICAgMHg2MDg5LCAxNSB9LHsgICAweGMxMTAsIDE2IH0sCi17IDB4MzA0NDQ4LCAyMiB9LHsgMHgzMDQ0NDksIDIyIH0seyAweDMwNDQ0YSwgMjIgfSx7IDB4MzA0NDRiLCAyMiB9LAoteyAweDMwNDQ0YywgMjIgfSx7IDB4MzA0NDRkLCAyMiB9LHsgMHgzMDQ0NGUsIDIyIH0seyAweDMwNDQ0ZiwgMjIgfSwKLXsgMHgzMDQ0NTAsIDIyIH0seyAweDMwNDQ1MSwgMjIgfSx7IDB4MzA0NDUyLCAyMiB9LHsgMHgzMDQ0NTMsIDIyIH0sCi17IDB4MzA0NDU0LCAyMiB9LHsgMHgzMDQ0NTUsIDIyIH0seyAweDMwNDQ1NiwgMjIgfSx7IDB4MzA0NDU3LCAyMiB9LAoteyAweDMwNDQ1OCwgMjIgfSx7IDB4MzA0NDU5LCAyMiB9LHsgMHgzMDQ0NWEsIDIyIH0seyAweDMwNDQ1YiwgMjIgfSwKLXsgMHgzMDQ0NWMsIDIyIH0seyAweDMwNDQ1ZCwgMjIgfSx7IDB4MzA0NDVlLCAyMiB9LHsgMHgzMDQ0NWYsIDIyIH0sCi17IDB4MzA0NDYwLCAyMiB9LHsgMHgzMDQ0NjEsIDIyIH0seyAweDMwNDQ2MiwgMjIgfSx7IDB4MzA0NDYzLCAyMiB9LAoteyAweDMwNDQ2NCwgMjIgfSx7IDB4MzA0NDY1LCAyMiB9LHsgMHgzMDQ0NjYsIDIyIH0seyAweDMwNDQ2NywgMjIgfSwKLXsgMHgzMDQ0NjgsIDIyIH0seyAweDMwNDQ2OSwgMjIgfSx7IDB4MzA0NDZhLCAyMiB9LHsgMHgzMDQ0NmIsIDIyIH0sCi17IDB4MzA0NDZjLCAyMiB9LHsgMHgzMDQ0NmQsIDIyIH0seyAweDMwNDQ2ZSwgMjIgfSx7IDB4MzA0NDZmLCAyMiB9LAoteyAweDMwNDQ3MCwgMjIgfSx7IDB4MzA0NDcxLCAyMiB9LHsgMHgzMDQ0NzIsIDIyIH0seyAweDMwNDQ3MywgMjIgfSwKLXsgMHgzMDQ0NzQsIDIyIH0seyAweDMwNDQ3NSwgMjIgfSx7IDB4MzA0NDc2LCAyMiB9LHsgMHgzMDQ0NzcsIDIyIH0sCi17IDB4MzA0NDc4LCAyMiB9LHsgMHgzMDQ0NzksIDIyIH0seyAweDMwNDQ3YSwgMjIgfSx7IDB4MzA0NDdiLCAyMiB9LAoteyAweDMwNDQ3YywgMjIgfSx7IDB4MzA0NDdkLCAyMiB9LHsgMHgzMDQ0N2UsIDIyIH0seyAweDMwNDQ3ZiwgMjIgfSwKLXsgMHg2MDg4ODAsIDIzIH0seyAweDYwODg4MSwgMjMgfSx7IDB4NjA4ODgyLCAyMyB9LHsgMHg2MDg4ODMsIDIzIH0sCi17IDB4NjA4ODg0LCAyMyB9LHsgMHg2MDg4ODUsIDIzIH0seyAweDYwODg4NiwgMjMgfSx7IDB4NjA4ODg3LCAyMyB9LAoteyAweDYwODg4OCwgMjMgfSx7IDB4NjA4ODg5LCAyMyB9LHsgMHg2MDg4OGEsIDIzIH0seyAweDYwODg4YiwgMjMgfSwKLXsgMHg2MDg4OGMsIDIzIH0seyAweDYwODg4ZCwgMjMgfSx7IDB4NjA4ODhlLCAyMyB9LHsgMHg2MDg4OGYsIDIzIH0sCisgICAgeyAgICAgIDB4MCwgIDIgfSwgeyAgICAgIDB4MSwgIDIgfSwgeyAgICAgIDB4NSwgIDMgfSwgeyAgICAgIDB4OSwgIDQgfSwKKyAgICB7ICAgICAgMHhkLCAgNCB9LCB7ICAgICAweDExLCAgNSB9LCB7ICAgICAweDFkLCAgNSB9LCB7ICAgICAweDFmLCAgNSB9LAorICAgIHsgICAgIDB4MjEsICA2IH0sIHsgICAgIDB4MzEsICA2IH0sIHsgICAgIDB4MzgsICA2IH0sIHsgICAgIDB4MzMsICA2IH0sCisgICAgeyAgICAgMHgzOSwgIDYgfSwgeyAgICAgMHgzZCwgIDYgfSwgeyAgICAgMHg2MSwgIDcgfSwgeyAgICAgMHg3OSwgIDcgfSwKKyAgICB7ICAgICAweDgwLCAgOCB9LCB7ICAgICAweGM4LCAgOCB9LCB7ICAgICAweGNhLCAgOCB9LCB7ICAgICAweGYwLCAgOCB9LAorICAgIHsgICAgIDB4ODEsICA4IH0sIHsgICAgIDB4YzAsICA4IH0sIHsgICAgIDB4YzksICA4IH0sIHsgICAgMHgxMDcsICA5IH0sCisgICAgeyAgICAweDEwNiwgIDkgfSwgeyAgICAweDE5NiwgIDkgfSwgeyAgICAweDE4MywgIDkgfSwgeyAgICAweDFlMywgIDkgfSwKKyAgICB7ICAgIDB4MWUyLCAgOSB9LCB7ICAgIDB4MjBhLCAxMCB9LCB7ICAgIDB4MjBiLCAxMCB9LCB7ICAgIDB4NjA5LCAxMSB9LAorICAgIHsgICAgMHg0MTIsIDExIH0sIHsgICAgMHg0MTMsIDExIH0sIHsgICAgMHg2MGIsIDExIH0sIHsgICAgMHg0MTEsIDExIH0sCisgICAgeyAgICAweDYwYSwgMTEgfSwgeyAgICAweDY1ZiwgMTEgfSwgeyAgICAweDQxMCwgMTEgfSwgeyAgICAweDY1ZCwgMTEgfSwKKyAgICB7ICAgIDB4NjVlLCAxMSB9LCB7ICAgIDB4Y2I4LCAxMiB9LCB7ICAgIDB4YzEwLCAxMiB9LCB7ICAgIDB4Y2I5LCAxMiB9LAorICAgIHsgICAweDE4MjMsIDEzIH0sIHsgICAweDMwNDUsIDE0IH0sIHsgICAweDYwODksIDE1IH0sIHsgICAweGMxMTAsIDE2IH0sCisgICAgeyAweDMwNDQ0OCwgMjIgfSwgeyAweDMwNDQ0OSwgMjIgfSwgeyAweDMwNDQ0YSwgMjIgfSwgeyAweDMwNDQ0YiwgMjIgfSwKKyAgICB7IDB4MzA0NDRjLCAyMiB9LCB7IDB4MzA0NDRkLCAyMiB9LCB7IDB4MzA0NDRlLCAyMiB9LCB7IDB4MzA0NDRmLCAyMiB9LAorICAgIHsgMHgzMDQ0NTAsIDIyIH0sIHsgMHgzMDQ0NTEsIDIyIH0sIHsgMHgzMDQ0NTIsIDIyIH0sIHsgMHgzMDQ0NTMsIDIyIH0sCisgICAgeyAweDMwNDQ1NCwgMjIgfSwgeyAweDMwNDQ1NSwgMjIgfSwgeyAweDMwNDQ1NiwgMjIgfSwgeyAweDMwNDQ1NywgMjIgfSwKKyAgICB7IDB4MzA0NDU4LCAyMiB9LCB7IDB4MzA0NDU5LCAyMiB9LCB7IDB4MzA0NDVhLCAyMiB9LCB7IDB4MzA0NDViLCAyMiB9LAorICAgIHsgMHgzMDQ0NWMsIDIyIH0sIHsgMHgzMDQ0NWQsIDIyIH0sIHsgMHgzMDQ0NWUsIDIyIH0sIHsgMHgzMDQ0NWYsIDIyIH0sCisgICAgeyAweDMwNDQ2MCwgMjIgfSwgeyAweDMwNDQ2MSwgMjIgfSwgeyAweDMwNDQ2MiwgMjIgfSwgeyAweDMwNDQ2MywgMjIgfSwKKyAgICB7IDB4MzA0NDY0LCAyMiB9LCB7IDB4MzA0NDY1LCAyMiB9LCB7IDB4MzA0NDY2LCAyMiB9LCB7IDB4MzA0NDY3LCAyMiB9LAorICAgIHsgMHgzMDQ0NjgsIDIyIH0sIHsgMHgzMDQ0NjksIDIyIH0sIHsgMHgzMDQ0NmEsIDIyIH0sIHsgMHgzMDQ0NmIsIDIyIH0sCisgICAgeyAweDMwNDQ2YywgMjIgfSwgeyAweDMwNDQ2ZCwgMjIgfSwgeyAweDMwNDQ2ZSwgMjIgfSwgeyAweDMwNDQ2ZiwgMjIgfSwKKyAgICB7IDB4MzA0NDcwLCAyMiB9LCB7IDB4MzA0NDcxLCAyMiB9LCB7IDB4MzA0NDcyLCAyMiB9LCB7IDB4MzA0NDczLCAyMiB9LAorICAgIHsgMHgzMDQ0NzQsIDIyIH0sIHsgMHgzMDQ0NzUsIDIyIH0sIHsgMHgzMDQ0NzYsIDIyIH0sIHsgMHgzMDQ0NzcsIDIyIH0sCisgICAgeyAweDMwNDQ3OCwgMjIgfSwgeyAweDMwNDQ3OSwgMjIgfSwgeyAweDMwNDQ3YSwgMjIgfSwgeyAweDMwNDQ3YiwgMjIgfSwKKyAgICB7IDB4MzA0NDdjLCAyMiB9LCB7IDB4MzA0NDdkLCAyMiB9LCB7IDB4MzA0NDdlLCAyMiB9LCB7IDB4MzA0NDdmLCAyMiB9LAorICAgIHsgMHg2MDg4ODAsIDIzIH0sIHsgMHg2MDg4ODEsIDIzIH0sIHsgMHg2MDg4ODIsIDIzIH0sIHsgMHg2MDg4ODMsIDIzIH0sCisgICAgeyAweDYwODg4NCwgMjMgfSwgeyAweDYwODg4NSwgMjMgfSwgeyAweDYwODg4NiwgMjMgfSwgeyAweDYwODg4NywgMjMgfSwKKyAgICB7IDB4NjA4ODg4LCAyMyB9LCB7IDB4NjA4ODg5LCAyMyB9LCB7IDB4NjA4ODhhLCAyMyB9LCB7IDB4NjA4ODhiLCAyMyB9LAorICAgIHsgMHg2MDg4OGMsIDIzIH0sIHsgMHg2MDg4OGQsIDIzIH0sIHsgMHg2MDg4OGUsIDIzIH0sIHsgMHg2MDg4OGYsIDIzIH0sCiB9OwogCiAvKiBkYyB0YWJsZSAxICovCiAKIGNvbnN0IHVpbnQzMl90IGZmX3RhYmxlMV9kY19sdW1bMTIwXVsyXSA9IHsKLXsgICAgICAweDIsICAyIH0seyAgICAgIDB4MywgIDIgfSx7ICAgICAgMHgzLCAgMyB9LHsgICAgICAweDIsICA0IH0sCi17ICAgICAgMHg1LCAgNCB9LHsgICAgICAweDEsICA1IH0seyAgICAgIDB4MywgIDUgfSx7ICAgICAgMHg4LCAgNSB9LAoteyAgICAgIDB4MCwgIDYgfSx7ICAgICAgMHg1LCAgNiB9LHsgICAgICAweGQsICA2IH0seyAgICAgIDB4ZiwgIDYgfSwKLXsgICAgIDB4MTMsICA2IH0seyAgICAgIDB4OCwgIDcgfSx7ICAgICAweDE4LCAgNyB9LHsgICAgIDB4MWMsICA3IH0sCi17ICAgICAweDI0LCAgNyB9LHsgICAgICAweDQsICA4IH0seyAgICAgIDB4NiwgIDggfSx7ICAgICAweDEyLCAgOCB9LAoteyAgICAgMHgzMiwgIDggfSx7ICAgICAweDNiLCAgOCB9LHsgICAgIDB4NGEsICA4IH0seyAgICAgMHg0YiwgIDggfSwKLXsgICAgICAweGIsICA5IH0seyAgICAgMHgyNiwgIDkgfSx7ICAgICAweDI3LCAgOSB9LHsgICAgIDB4NjYsICA5IH0sCi17ICAgICAweDc0LCAgOSB9LHsgICAgIDB4NzUsICA5IH0seyAgICAgMHgxNCwgMTAgfSx7ICAgICAweDFjLCAxMCB9LAoteyAgICAgMHgxZiwgMTAgfSx7ICAgICAweDFkLCAxMCB9LHsgICAgIDB4MmIsIDExIH0seyAgICAgMHgzZCwgMTEgfSwKLXsgICAgMHgxOWQsIDExIH0seyAgICAweDE5ZiwgMTEgfSx7ICAgICAweDU0LCAxMiB9LHsgICAgMHgzMzksIDEyIH0sCi17ICAgIDB4MzM4LCAxMiB9LHsgICAgMHgzM2QsIDEyIH0seyAgICAgMHhhYiwgMTMgfSx7ICAgICAweGYxLCAxMyB9LAoteyAgICAweDY3OCwgMTMgfSx7ICAgICAweGYyLCAxMyB9LHsgICAgMHgxZTAsIDE0IH0seyAgICAweDFlMSwgMTQgfSwKLXsgICAgMHgxNTQsIDE0IH0seyAgICAweGNmMiwgMTQgfSx7ICAgIDB4M2NjLCAxNSB9LHsgICAgMHgyYWIsIDE1IH0sCi17ICAgMHgxOWU3LCAxNSB9LHsgICAgMHgzY2UsIDE1IH0seyAgIDB4MTllNiwgMTUgfSx7ICAgIDB4NTU0LCAxNiB9LAoteyAgICAweDc5ZiwgMTYgfSx7ICAgIDB4NTU1LCAxNiB9LHsgICAgMHhmM2QsIDE3IH0seyAgICAweGYzNywgMTcgfSwKLXsgICAgMHhmM2MsIDE3IH0seyAgICAweGYzNSwgMTcgfSx7ICAgMHgxZTZkLCAxOCB9LHsgICAweDFlNjgsIDE4IH0sCi17ICAgMHgzY2Q4LCAxOSB9LHsgICAweDNjZDMsIDE5IH0seyAgIDB4M2NkOSwgMTkgfSx7ICAgMHg3OWE0LCAyMCB9LAoteyAgMHhmMzRiYSwgMjUgfSx7ICAweGYzNGI0LCAyNSB9LHsgIDB4ZjM0YjUsIDI1IH0seyAgMHhmMzRiNiwgMjUgfSwKLXsgIDB4ZjM0YjcsIDI1IH0seyAgMHhmMzRiOCwgMjUgfSx7ICAweGYzNGI5LCAyNSB9LHsgIDB4ZjM0YmIsIDI1IH0sCi17ICAweGYzNGJjLCAyNSB9LHsgIDB4ZjM0YmQsIDI1IH0seyAgMHhmMzRiZSwgMjUgfSx7ICAweGYzNGJmLCAyNSB9LAoteyAweDFlNjk0MCwgMjYgfSx7IDB4MWU2OTQxLCAyNiB9LHsgMHgxZTY5NDIsIDI2IH0seyAweDFlNjk0MywgMjYgfSwKLXsgMHgxZTY5NDQsIDI2IH0seyAweDFlNjk0NSwgMjYgfSx7IDB4MWU2OTQ2LCAyNiB9LHsgMHgxZTY5NDcsIDI2IH0sCi17IDB4MWU2OTQ4LCAyNiB9LHsgMHgxZTY5NDksIDI2IH0seyAweDFlNjk0YSwgMjYgfSx7IDB4MWU2OTRiLCAyNiB9LAoteyAweDFlNjk0YywgMjYgfSx7IDB4MWU2OTRkLCAyNiB9LHsgMHgxZTY5NGUsIDI2IH0seyAweDFlNjk0ZiwgMjYgfSwKLXsgMHgxZTY5NTAsIDI2IH0seyAweDFlNjk1MSwgMjYgfSx7IDB4MWU2OTUyLCAyNiB9LHsgMHgxZTY5NTMsIDI2IH0sCi17IDB4MWU2OTU0LCAyNiB9LHsgMHgxZTY5NTUsIDI2IH0seyAweDFlNjk1NiwgMjYgfSx7IDB4MWU2OTU3LCAyNiB9LAoteyAweDFlNjk1OCwgMjYgfSx7IDB4MWU2OTU5LCAyNiB9LHsgMHgxZTY5NWEsIDI2IH0seyAweDFlNjk1YiwgMjYgfSwKLXsgMHgxZTY5NWMsIDI2IH0seyAweDFlNjk1ZCwgMjYgfSx7IDB4MWU2OTVlLCAyNiB9LHsgMHgxZTY5NWYsIDI2IH0sCi17IDB4MWU2OTYwLCAyNiB9LHsgMHgxZTY5NjEsIDI2IH0seyAweDFlNjk2MiwgMjYgfSx7IDB4MWU2OTYzLCAyNiB9LAoteyAweDFlNjk2NCwgMjYgfSx7IDB4MWU2OTY1LCAyNiB9LHsgMHgxZTY5NjYsIDI2IH0seyAweDFlNjk2NywgMjYgfSwKKyAgICB7ICAgICAgMHgyLCAgMiB9LCB7ICAgICAgMHgzLCAgMiB9LCB7ICAgICAgMHgzLCAgMyB9LCB7ICAgICAgMHgyLCAgNCB9LAorICAgIHsgICAgICAweDUsICA0IH0sIHsgICAgICAweDEsICA1IH0sIHsgICAgICAweDMsICA1IH0sIHsgICAgICAweDgsICA1IH0sCisgICAgeyAgICAgIDB4MCwgIDYgfSwgeyAgICAgIDB4NSwgIDYgfSwgeyAgICAgIDB4ZCwgIDYgfSwgeyAgICAgIDB4ZiwgIDYgfSwKKyAgICB7ICAgICAweDEzLCAgNiB9LCB7ICAgICAgMHg4LCAgNyB9LCB7ICAgICAweDE4LCAgNyB9LCB7ICAgICAweDFjLCAgNyB9LAorICAgIHsgICAgIDB4MjQsICA3IH0sIHsgICAgICAweDQsICA4IH0sIHsgICAgICAweDYsICA4IH0sIHsgICAgIDB4MTIsICA4IH0sCisgICAgeyAgICAgMHgzMiwgIDggfSwgeyAgICAgMHgzYiwgIDggfSwgeyAgICAgMHg0YSwgIDggfSwgeyAgICAgMHg0YiwgIDggfSwKKyAgICB7ICAgICAgMHhiLCAgOSB9LCB7ICAgICAweDI2LCAgOSB9LCB7ICAgICAweDI3LCAgOSB9LCB7ICAgICAweDY2LCAgOSB9LAorICAgIHsgICAgIDB4NzQsICA5IH0sIHsgICAgIDB4NzUsICA5IH0sIHsgICAgIDB4MTQsIDEwIH0sIHsgICAgIDB4MWMsIDEwIH0sCisgICAgeyAgICAgMHgxZiwgMTAgfSwgeyAgICAgMHgxZCwgMTAgfSwgeyAgICAgMHgyYiwgMTEgfSwgeyAgICAgMHgzZCwgMTEgfSwKKyAgICB7ICAgIDB4MTlkLCAxMSB9LCB7ICAgIDB4MTlmLCAxMSB9LCB7ICAgICAweDU0LCAxMiB9LCB7ICAgIDB4MzM5LCAxMiB9LAorICAgIHsgICAgMHgzMzgsIDEyIH0sIHsgICAgMHgzM2QsIDEyIH0sIHsgICAgIDB4YWIsIDEzIH0sIHsgICAgIDB4ZjEsIDEzIH0sCisgICAgeyAgICAweDY3OCwgMTMgfSwgeyAgICAgMHhmMiwgMTMgfSwgeyAgICAweDFlMCwgMTQgfSwgeyAgICAweDFlMSwgMTQgfSwKKyAgICB7ICAgIDB4MTU0LCAxNCB9LCB7ICAgIDB4Y2YyLCAxNCB9LCB7ICAgIDB4M2NjLCAxNSB9LCB7ICAgIDB4MmFiLCAxNSB9LAorICAgIHsgICAweDE5ZTcsIDE1IH0sIHsgICAgMHgzY2UsIDE1IH0sIHsgICAweDE5ZTYsIDE1IH0sIHsgICAgMHg1NTQsIDE2IH0sCisgICAgeyAgICAweDc5ZiwgMTYgfSwgeyAgICAweDU1NSwgMTYgfSwgeyAgICAweGYzZCwgMTcgfSwgeyAgICAweGYzNywgMTcgfSwKKyAgICB7ICAgIDB4ZjNjLCAxNyB9LCB7ICAgIDB4ZjM1LCAxNyB9LCB7ICAgMHgxZTZkLCAxOCB9LCB7ICAgMHgxZTY4LCAxOCB9LAorICAgIHsgICAweDNjZDgsIDE5IH0sIHsgICAweDNjZDMsIDE5IH0sIHsgICAweDNjZDksIDE5IH0sIHsgICAweDc5YTQsIDIwIH0sCisgICAgeyAgMHhmMzRiYSwgMjUgfSwgeyAgMHhmMzRiNCwgMjUgfSwgeyAgMHhmMzRiNSwgMjUgfSwgeyAgMHhmMzRiNiwgMjUgfSwKKyAgICB7ICAweGYzNGI3LCAyNSB9LCB7ICAweGYzNGI4LCAyNSB9LCB7ICAweGYzNGI5LCAyNSB9LCB7ICAweGYzNGJiLCAyNSB9LAorICAgIHsgIDB4ZjM0YmMsIDI1IH0sIHsgIDB4ZjM0YmQsIDI1IH0sIHsgIDB4ZjM0YmUsIDI1IH0sIHsgIDB4ZjM0YmYsIDI1IH0sCisgICAgeyAweDFlNjk0MCwgMjYgfSwgeyAweDFlNjk0MSwgMjYgfSwgeyAweDFlNjk0MiwgMjYgfSwgeyAweDFlNjk0MywgMjYgfSwKKyAgICB7IDB4MWU2OTQ0LCAyNiB9LCB7IDB4MWU2OTQ1LCAyNiB9LCB7IDB4MWU2OTQ2LCAyNiB9LCB7IDB4MWU2OTQ3LCAyNiB9LAorICAgIHsgMHgxZTY5NDgsIDI2IH0sIHsgMHgxZTY5NDksIDI2IH0sIHsgMHgxZTY5NGEsIDI2IH0sIHsgMHgxZTY5NGIsIDI2IH0sCisgICAgeyAweDFlNjk0YywgMjYgfSwgeyAweDFlNjk0ZCwgMjYgfSwgeyAweDFlNjk0ZSwgMjYgfSwgeyAweDFlNjk0ZiwgMjYgfSwKKyAgICB7IDB4MWU2OTUwLCAyNiB9LCB7IDB4MWU2OTUxLCAyNiB9LCB7IDB4MWU2OTUyLCAyNiB9LCB7IDB4MWU2OTUzLCAyNiB9LAorICAgIHsgMHgxZTY5NTQsIDI2IH0sIHsgMHgxZTY5NTUsIDI2IH0sIHsgMHgxZTY5NTYsIDI2IH0sIHsgMHgxZTY5NTcsIDI2IH0sCisgICAgeyAweDFlNjk1OCwgMjYgfSwgeyAweDFlNjk1OSwgMjYgfSwgeyAweDFlNjk1YSwgMjYgfSwgeyAweDFlNjk1YiwgMjYgfSwKKyAgICB7IDB4MWU2OTVjLCAyNiB9LCB7IDB4MWU2OTVkLCAyNiB9LCB7IDB4MWU2OTVlLCAyNiB9LCB7IDB4MWU2OTVmLCAyNiB9LAorICAgIHsgMHgxZTY5NjAsIDI2IH0sIHsgMHgxZTY5NjEsIDI2IH0sIHsgMHgxZTY5NjIsIDI2IH0sIHsgMHgxZTY5NjMsIDI2IH0sCisgICAgeyAweDFlNjk2NCwgMjYgfSwgeyAweDFlNjk2NSwgMjYgfSwgeyAweDFlNjk2NiwgMjYgfSwgeyAweDFlNjk2NywgMjYgfSwKIH07CiAKIGNvbnN0IHVpbnQzMl90IGZmX3RhYmxlMV9kY19jaHJvbWFbMTIwXVsyXSA9IHsKLXsgICAgICAgMHgwLCAgMiB9LHsgICAgICAgMHgxLCAgMiB9LHsgICAgICAgMHg0LCAgMyB9LHsgICAgICAgMHg3LCAgMyB9LAoteyAgICAgICAweGIsICA0IH0seyAgICAgICAweGQsICA0IH0seyAgICAgIDB4MTUsICA1IH0seyAgICAgIDB4MjgsICA2IH0sCi17ICAgICAgMHgzMCwgIDYgfSx7ICAgICAgMHgzMiwgIDYgfSx7ICAgICAgMHg1MiwgIDcgfSx7ICAgICAgMHg2MiwgIDcgfSwKLXsgICAgICAweDY2LCAgNyB9LHsgICAgICAweGE2LCAgOCB9LHsgICAgICAweGM2LCAgOCB9LHsgICAgICAweGNmLCAgOCB9LAoteyAgICAgMHgxNGYsICA5IH0seyAgICAgMHgxOGUsICA5IH0seyAgICAgMHgxOWMsICA5IH0seyAgICAgMHgyOWQsIDEwIH0sCi17ICAgICAweDMzYSwgMTAgfSx7ICAgICAweDUzOCwgMTEgfSx7ICAgICAweDYzYywgMTEgfSx7ICAgICAweDYzZSwgMTEgfSwKLXsgICAgIDB4NjNmLCAxMSB9LHsgICAgIDB4Njc2LCAxMSB9LHsgICAgIDB4YTczLCAxMiB9LHsgICAgIDB4YzdhLCAxMiB9LAoteyAgICAgMHhjZWYsIDEyIH0seyAgICAweDE0ZTUsIDEzIH0seyAgICAweDE5ZGQsIDEzIH0seyAgICAweDI5YzgsIDE0IH0sCi17ICAgIDB4MjljOSwgMTQgfSx7ICAgIDB4NjNkZCwgMTUgfSx7ICAgIDB4MzNiOCwgMTQgfSx7ICAgIDB4MzNiOSwgMTQgfSwKLXsgICAgMHhjN2I2LCAxNiB9LHsgICAgMHg2M2Q4LCAxNSB9LHsgICAgMHg2M2RmLCAxNSB9LHsgICAgMHhjN2IzLCAxNiB9LAoteyAgICAweGM3YjQsIDE2IH0seyAgICAweGM3YjUsIDE2IH0seyAgICAweDYzZGUsIDE1IH0seyAgICAweGM3YjcsIDE2IH0sCi17ICAgIDB4YzdiOCwgMTYgfSx7ICAgIDB4YzdiOSwgMTYgfSx7ICAgMHgxOGY2NSwgMTcgfSx7ICAgMHgzMWVjOCwgMTggfSwKLXsgIDB4YzdiMjQ4LCAyNCB9LHsgIDB4YzdiMjQ5LCAyNCB9LHsgIDB4YzdiMjRhLCAyNCB9LHsgIDB4YzdiMjRiLCAyNCB9LAoteyAgMHhjN2IyNGMsIDI0IH0seyAgMHhjN2IyNGQsIDI0IH0seyAgMHhjN2IyNGUsIDI0IH0seyAgMHhjN2IyNGYsIDI0IH0sCi17ICAweGM3YjI1MCwgMjQgfSx7ICAweGM3YjI1MSwgMjQgfSx7ICAweGM3YjI1MiwgMjQgfSx7ICAweGM3YjI1MywgMjQgfSwKLXsgIDB4YzdiMjU0LCAyNCB9LHsgIDB4YzdiMjU1LCAyNCB9LHsgIDB4YzdiMjU2LCAyNCB9LHsgIDB4YzdiMjU3LCAyNCB9LAoteyAgMHhjN2IyNTgsIDI0IH0seyAgMHhjN2IyNTksIDI0IH0seyAgMHhjN2IyNWEsIDI0IH0seyAgMHhjN2IyNWIsIDI0IH0sCi17ICAweGM3YjI1YywgMjQgfSx7ICAweGM3YjI1ZCwgMjQgfSx7ICAweGM3YjI1ZSwgMjQgfSx7ICAweGM3YjI1ZiwgMjQgfSwKLXsgIDB4YzdiMjYwLCAyNCB9LHsgIDB4YzdiMjYxLCAyNCB9LHsgIDB4YzdiMjYyLCAyNCB9LHsgIDB4YzdiMjYzLCAyNCB9LAoteyAgMHhjN2IyNjQsIDI0IH0seyAgMHhjN2IyNjUsIDI0IH0seyAgMHhjN2IyNjYsIDI0IH0seyAgMHhjN2IyNjcsIDI0IH0sCi17ICAweGM3YjI2OCwgMjQgfSx7ICAweGM3YjI2OSwgMjQgfSx7ICAweGM3YjI2YSwgMjQgfSx7ICAweGM3YjI2YiwgMjQgfSwKLXsgIDB4YzdiMjZjLCAyNCB9LHsgIDB4YzdiMjZkLCAyNCB9LHsgIDB4YzdiMjZlLCAyNCB9LHsgIDB4YzdiMjZmLCAyNCB9LAoteyAgMHhjN2IyNzAsIDI0IH0seyAgMHhjN2IyNzEsIDI0IH0seyAgMHhjN2IyNzIsIDI0IH0seyAgMHhjN2IyNzMsIDI0IH0sCi17ICAweGM3YjI3NCwgMjQgfSx7ICAweGM3YjI3NSwgMjQgfSx7ICAweGM3YjI3NiwgMjQgfSx7ICAweGM3YjI3NywgMjQgfSwKLXsgIDB4YzdiMjc4LCAyNCB9LHsgIDB4YzdiMjc5LCAyNCB9LHsgIDB4YzdiMjdhLCAyNCB9LHsgIDB4YzdiMjdiLCAyNCB9LAoteyAgMHhjN2IyN2MsIDI0IH0seyAgMHhjN2IyN2QsIDI0IH0seyAgMHhjN2IyN2UsIDI0IH0seyAgMHhjN2IyN2YsIDI0IH0sCi17IDB4MThmNjQ4MCwgMjUgfSx7IDB4MThmNjQ4MSwgMjUgfSx7IDB4MThmNjQ4MiwgMjUgfSx7IDB4MThmNjQ4MywgMjUgfSwKLXsgMHgxOGY2NDg0LCAyNSB9LHsgMHgxOGY2NDg1LCAyNSB9LHsgMHgxOGY2NDg2LCAyNSB9LHsgMHgxOGY2NDg3LCAyNSB9LAoteyAweDE4ZjY0ODgsIDI1IH0seyAweDE4ZjY0ODksIDI1IH0seyAweDE4ZjY0OGEsIDI1IH0seyAweDE4ZjY0OGIsIDI1IH0sCi17IDB4MThmNjQ4YywgMjUgfSx7IDB4MThmNjQ4ZCwgMjUgfSx7IDB4MThmNjQ4ZSwgMjUgfSx7IDB4MThmNjQ4ZiwgMjUgfSwKKyAgICB7ICAgICAgIDB4MCwgIDIgfSwgeyAgICAgICAweDEsICAyIH0sIHsgICAgICAgMHg0LCAgMyB9LCB7ICAgICAgIDB4NywgIDMgfSwKKyAgICB7ICAgICAgIDB4YiwgIDQgfSwgeyAgICAgICAweGQsICA0IH0sIHsgICAgICAweDE1LCAgNSB9LCB7ICAgICAgMHgyOCwgIDYgfSwKKyAgICB7ICAgICAgMHgzMCwgIDYgfSwgeyAgICAgIDB4MzIsICA2IH0sIHsgICAgICAweDUyLCAgNyB9LCB7ICAgICAgMHg2MiwgIDcgfSwKKyAgICB7ICAgICAgMHg2NiwgIDcgfSwgeyAgICAgIDB4YTYsICA4IH0sIHsgICAgICAweGM2LCAgOCB9LCB7ICAgICAgMHhjZiwgIDggfSwKKyAgICB7ICAgICAweDE0ZiwgIDkgfSwgeyAgICAgMHgxOGUsICA5IH0sIHsgICAgIDB4MTljLCAgOSB9LCB7ICAgICAweDI5ZCwgMTAgfSwKKyAgICB7ICAgICAweDMzYSwgMTAgfSwgeyAgICAgMHg1MzgsIDExIH0sIHsgICAgIDB4NjNjLCAxMSB9LCB7ICAgICAweDYzZSwgMTEgfSwKKyAgICB7ICAgICAweDYzZiwgMTEgfSwgeyAgICAgMHg2NzYsIDExIH0sIHsgICAgIDB4YTczLCAxMiB9LCB7ICAgICAweGM3YSwgMTIgfSwKKyAgICB7ICAgICAweGNlZiwgMTIgfSwgeyAgICAweDE0ZTUsIDEzIH0sIHsgICAgMHgxOWRkLCAxMyB9LCB7ICAgIDB4MjljOCwgMTQgfSwKKyAgICB7ICAgIDB4MjljOSwgMTQgfSwgeyAgICAweDYzZGQsIDE1IH0sIHsgICAgMHgzM2I4LCAxNCB9LCB7ICAgIDB4MzNiOSwgMTQgfSwKKyAgICB7ICAgIDB4YzdiNiwgMTYgfSwgeyAgICAweDYzZDgsIDE1IH0sIHsgICAgMHg2M2RmLCAxNSB9LCB7ICAgIDB4YzdiMywgMTYgfSwKKyAgICB7ICAgIDB4YzdiNCwgMTYgfSwgeyAgICAweGM3YjUsIDE2IH0sIHsgICAgMHg2M2RlLCAxNSB9LCB7ICAgIDB4YzdiNywgMTYgfSwKKyAgICB7ICAgIDB4YzdiOCwgMTYgfSwgeyAgICAweGM3YjksIDE2IH0sIHsgICAweDE4ZjY1LCAxNyB9LCB7ICAgMHgzMWVjOCwgMTggfSwKKyAgICB7ICAweGM3YjI0OCwgMjQgfSwgeyAgMHhjN2IyNDksIDI0IH0sIHsgIDB4YzdiMjRhLCAyNCB9LCB7ICAweGM3YjI0YiwgMjQgfSwKKyAgICB7ICAweGM3YjI0YywgMjQgfSwgeyAgMHhjN2IyNGQsIDI0IH0sIHsgIDB4YzdiMjRlLCAyNCB9LCB7ICAweGM3YjI0ZiwgMjQgfSwKKyAgICB7ICAweGM3YjI1MCwgMjQgfSwgeyAgMHhjN2IyNTEsIDI0IH0sIHsgIDB4YzdiMjUyLCAyNCB9LCB7ICAweGM3YjI1MywgMjQgfSwKKyAgICB7ICAweGM3YjI1NCwgMjQgfSwgeyAgMHhjN2IyNTUsIDI0IH0sIHsgIDB4YzdiMjU2LCAyNCB9LCB7ICAweGM3YjI1NywgMjQgfSwKKyAgICB7ICAweGM3YjI1OCwgMjQgfSwgeyAgMHhjN2IyNTksIDI0IH0sIHsgIDB4YzdiMjVhLCAyNCB9LCB7ICAweGM3YjI1YiwgMjQgfSwKKyAgICB7ICAweGM3YjI1YywgMjQgfSwgeyAgMHhjN2IyNWQsIDI0IH0sIHsgIDB4YzdiMjVlLCAyNCB9LCB7ICAweGM3YjI1ZiwgMjQgfSwKKyAgICB7ICAweGM3YjI2MCwgMjQgfSwgeyAgMHhjN2IyNjEsIDI0IH0sIHsgIDB4YzdiMjYyLCAyNCB9LCB7ICAweGM3YjI2MywgMjQgfSwKKyAgICB7ICAweGM3YjI2NCwgMjQgfSwgeyAgMHhjN2IyNjUsIDI0IH0sIHsgIDB4YzdiMjY2LCAyNCB9LCB7ICAweGM3YjI2NywgMjQgfSwKKyAgICB7ICAweGM3YjI2OCwgMjQgfSwgeyAgMHhjN2IyNjksIDI0IH0sIHsgIDB4YzdiMjZhLCAyNCB9LCB7ICAweGM3YjI2YiwgMjQgfSwKKyAgICB7ICAweGM3YjI2YywgMjQgfSwgeyAgMHhjN2IyNmQsIDI0IH0sIHsgIDB4YzdiMjZlLCAyNCB9LCB7ICAweGM3YjI2ZiwgMjQgfSwKKyAgICB7ICAweGM3YjI3MCwgMjQgfSwgeyAgMHhjN2IyNzEsIDI0IH0sIHsgIDB4YzdiMjcyLCAyNCB9LCB7ICAweGM3YjI3MywgMjQgfSwKKyAgICB7ICAweGM3YjI3NCwgMjQgfSwgeyAgMHhjN2IyNzUsIDI0IH0sIHsgIDB4YzdiMjc2LCAyNCB9LCB7ICAweGM3YjI3NywgMjQgfSwKKyAgICB7ICAweGM3YjI3OCwgMjQgfSwgeyAgMHhjN2IyNzksIDI0IH0sIHsgIDB4YzdiMjdhLCAyNCB9LCB7ICAweGM3YjI3YiwgMjQgfSwKKyAgICB7ICAweGM3YjI3YywgMjQgfSwgeyAgMHhjN2IyN2QsIDI0IH0sIHsgIDB4YzdiMjdlLCAyNCB9LCB7ICAweGM3YjI3ZiwgMjQgfSwKKyAgICB7IDB4MThmNjQ4MCwgMjUgfSwgeyAweDE4ZjY0ODEsIDI1IH0sIHsgMHgxOGY2NDgyLCAyNSB9LCB7IDB4MThmNjQ4MywgMjUgfSwKKyAgICB7IDB4MThmNjQ4NCwgMjUgfSwgeyAweDE4ZjY0ODUsIDI1IH0sIHsgMHgxOGY2NDg2LCAyNSB9LCB7IDB4MThmNjQ4NywgMjUgfSwKKyAgICB7IDB4MThmNjQ4OCwgMjUgfSwgeyAweDE4ZjY0ODksIDI1IH0sIHsgMHgxOGY2NDhhLCAyNSB9LCB7IDB4MThmNjQ4YiwgMjUgfSwKKyAgICB7IDB4MThmNjQ4YywgMjUgfSwgeyAweDE4ZjY0OGQsIDI1IH0sIHsgMHgxOGY2NDhlLCAyNSB9LCB7IDB4MThmNjQ4ZiwgMjUgfSwKIH07CiAKIC8qIHZsYyB0YWJsZSAwLCBmb3IgaW50cmEgbHVtYSAqLwogCiBzdGF0aWMgY29uc3QgdWludDE2X3QgdGFibGUwX3ZsY1sxMzNdWzJdID0gewoteyAgIDB4MSwgIDIgfSx7ICAgMHg2LCAgMyB9LHsgICAweGYsICA0IH0seyAgMHgxNiwgIDUgfSwKLXsgIDB4MjAsICA2IH0seyAgMHgxOCwgIDcgfSx7ICAgMHg4LCAgOCB9LHsgIDB4OWEsICA4IH0sCi17ICAweDU2LCAgOSB9LHsgMHgxM2UsICA5IH0seyAgMHhmMCwgMTAgfSx7IDB4M2E1LCAxMCB9LAoteyAgMHg3NywgMTEgfSx7IDB4MWVmLCAxMSB9LHsgIDB4OWEsIDEyIH0seyAgMHg1ZCwgMTMgfSwKLXsgICAweDEsICA0IH0seyAgMHgxMSwgIDUgfSx7ICAgMHgyLCAgNyB9LHsgICAweGIsICA4IH0sCi17ICAweDEyLCAgOSB9LHsgMHgxZDYsICA5IH0seyAweDI3ZSwgMTAgfSx7IDB4MTkxLCAxMSB9LAoteyAgMHhlYSwgMTIgfSx7IDB4M2RjLCAxMiB9LHsgMHgxM2IsIDEzIH0seyAgIDB4NCwgIDUgfSwKLXsgIDB4MTQsICA3IH0seyAgMHg5ZSwgIDggfSx7ICAgMHg5LCAxMCB9LHsgMHgxYWMsIDExIH0sCi17IDB4MWUyLCAxMSB9LHsgMHgzY2EsIDEyIH0seyAgMHg1ZiwgMTMgfSx7ICAweDE3LCAgNSB9LAoteyAgMHg0ZSwgIDcgfSx7ICAweDVlLCAgOSB9LHsgIDB4ZjMsIDEwIH0seyAweDFhZCwgMTEgfSwKLXsgIDB4ZWMsIDEyIH0seyAweDVmMCwgMTMgfSx7ICAgMHhlLCAgNiB9LHsgIDB4ZTEsICA4IH0sCi17IDB4M2E0LCAxMCB9LHsgIDB4OWMsIDEyIH0seyAweDEzZCwgMTMgfSx7ICAweDNiLCAgNiB9LAoteyAgMHgxYywgIDkgfSx7ICAweDE0LCAxMSB9LHsgMHg5YmUsIDEyIH0seyAgIDB4NiwgIDcgfSwKLXsgIDB4N2EsICA5IH0seyAweDE5MCwgMTEgfSx7IDB4MTM3LCAxMyB9LHsgIDB4MWIsICA3IH0sCi17ICAgMHg4LCAxMCB9LHsgMHg3NWMsIDExIH0seyAgMHg3MSwgIDcgfSx7ICAweGQ3LCAxMCB9LAoteyAweDliZiwgMTIgfSx7ICAgMHg3LCAgOCB9LHsgIDB4YWYsIDEwIH0seyAweDRjYywgMTEgfSwKLXsgIDB4MzQsICA4IH0seyAweDI2NSwgMTAgfSx7ICAweDlmLCAxMiB9LHsgIDB4ZTAsICA4IH0sCi17ICAweDE2LCAxMSB9LHsgMHgzMjcsIDEyIH0seyAgMHgxNSwgIDkgfSx7IDB4MTdkLCAxMSB9LAoteyAweGViYiwgMTIgfSx7ICAweDE0LCAgOSB9LHsgIDB4ZjYsIDEwIH0seyAweDFlNCwgMTEgfSwKLXsgIDB4Y2IsIDEwIH0seyAweDk5ZCwgMTIgfSx7ICAweGNhLCAxMCB9LHsgMHgyZmMsIDEyIH0sCi17IDB4MTdmLCAxMSB9LHsgMHg0Y2QsIDExIH0seyAweDJmZCwgMTIgfSx7IDB4NGZlLCAxMSB9LAoteyAweDEzYSwgMTMgfSx7ICAgMHhhLCAgNCB9LHsgIDB4NDIsICA3IH0seyAweDFkMywgIDkgfSwKLXsgMHg0ZGQsIDExIH0seyAgMHgxMiwgIDUgfSx7ICAweGU4LCAgOCB9LHsgIDB4NGMsIDExIH0sCi17IDB4MTM2LCAxMyB9LHsgIDB4MzksICA2IH0seyAweDI2NCwgMTAgfSx7IDB4ZWJhLCAxMiB9LAoteyAgIDB4MCwgIDcgfSx7ICAweGFlLCAxMCB9LHsgMHg5OWMsIDEyIH0seyAgMHgxZiwgIDcgfSwKLXsgMHg0ZGUsIDExIH0seyAgMHg0MywgIDcgfSx7IDB4NGRjLCAxMSB9LHsgICAweDMsICA4IH0sCi17IDB4M2NiLCAxMiB9LHsgICAweDYsICA4IH0seyAweDk5ZSwgMTIgfSx7ICAweDJhLCAgOCB9LAoteyAweDVmMSwgMTMgfSx7ICAgMHhmLCAgOCB9LHsgMHg5ZmUsIDEyIH0seyAgMHgzMywgIDggfSwKLXsgMHg5ZmYsIDEyIH0seyAgMHg5OCwgIDggfSx7IDB4OTlmLCAxMiB9LHsgIDB4ZWEsICA4IH0sCi17IDB4MTNjLCAxMyB9LHsgIDB4MmUsICA4IH0seyAweDE5MiwgMTEgfSx7IDB4MTM2LCAgOSB9LAoteyAgMHg2YSwgIDkgfSx7ICAweDE1LCAxMSB9LHsgMHgzYWYsIDEwIH0seyAweDFlMywgMTEgfSwKLXsgIDB4NzQsIDExIH0seyAgMHhlYiwgMTIgfSx7IDB4MmY5LCAxMiB9LHsgIDB4NWMsIDEzIH0sCi17ICAweGVkLCAxMiB9LHsgMHgzZGQsIDEyIH0seyAweDMyNiwgMTIgfSx7ICAweDVlLCAxMyB9LAoteyAgMHgxNiwgIDcgfSwKKyAgICB7ICAgMHgxLCAgMiB9LCB7ICAgMHg2LCAgMyB9LCB7ICAgMHhmLCAgNCB9LCB7ICAweDE2LCAgNSB9LAorICAgIHsgIDB4MjAsICA2IH0sIHsgIDB4MTgsICA3IH0sIHsgICAweDgsICA4IH0sIHsgIDB4OWEsICA4IH0sCisgICAgeyAgMHg1NiwgIDkgfSwgeyAweDEzZSwgIDkgfSwgeyAgMHhmMCwgMTAgfSwgeyAweDNhNSwgMTAgfSwKKyAgICB7ICAweDc3LCAxMSB9LCB7IDB4MWVmLCAxMSB9LCB7ICAweDlhLCAxMiB9LCB7ICAweDVkLCAxMyB9LAorICAgIHsgICAweDEsICA0IH0sIHsgIDB4MTEsICA1IH0sIHsgICAweDIsICA3IH0sIHsgICAweGIsICA4IH0sCisgICAgeyAgMHgxMiwgIDkgfSwgeyAweDFkNiwgIDkgfSwgeyAweDI3ZSwgMTAgfSwgeyAweDE5MSwgMTEgfSwKKyAgICB7ICAweGVhLCAxMiB9LCB7IDB4M2RjLCAxMiB9LCB7IDB4MTNiLCAxMyB9LCB7ICAgMHg0LCAgNSB9LAorICAgIHsgIDB4MTQsICA3IH0sIHsgIDB4OWUsICA4IH0sIHsgICAweDksIDEwIH0sIHsgMHgxYWMsIDExIH0sCisgICAgeyAweDFlMiwgMTEgfSwgeyAweDNjYSwgMTIgfSwgeyAgMHg1ZiwgMTMgfSwgeyAgMHgxNywgIDUgfSwKKyAgICB7ICAweDRlLCAgNyB9LCB7ICAweDVlLCAgOSB9LCB7ICAweGYzLCAxMCB9LCB7IDB4MWFkLCAxMSB9LAorICAgIHsgIDB4ZWMsIDEyIH0sIHsgMHg1ZjAsIDEzIH0sIHsgICAweGUsICA2IH0sIHsgIDB4ZTEsICA4IH0sCisgICAgeyAweDNhNCwgMTAgfSwgeyAgMHg5YywgMTIgfSwgeyAweDEzZCwgMTMgfSwgeyAgMHgzYiwgIDYgfSwKKyAgICB7ICAweDFjLCAgOSB9LCB7ICAweDE0LCAxMSB9LCB7IDB4OWJlLCAxMiB9LCB7ICAgMHg2LCAgNyB9LAorICAgIHsgIDB4N2EsICA5IH0sIHsgMHgxOTAsIDExIH0sIHsgMHgxMzcsIDEzIH0sIHsgIDB4MWIsICA3IH0sCisgICAgeyAgIDB4OCwgMTAgfSwgeyAweDc1YywgMTEgfSwgeyAgMHg3MSwgIDcgfSwgeyAgMHhkNywgMTAgfSwKKyAgICB7IDB4OWJmLCAxMiB9LCB7ICAgMHg3LCAgOCB9LCB7ICAweGFmLCAxMCB9LCB7IDB4NGNjLCAxMSB9LAorICAgIHsgIDB4MzQsICA4IH0sIHsgMHgyNjUsIDEwIH0sIHsgIDB4OWYsIDEyIH0sIHsgIDB4ZTAsICA4IH0sCisgICAgeyAgMHgxNiwgMTEgfSwgeyAweDMyNywgMTIgfSwgeyAgMHgxNSwgIDkgfSwgeyAweDE3ZCwgMTEgfSwKKyAgICB7IDB4ZWJiLCAxMiB9LCB7ICAweDE0LCAgOSB9LCB7ICAweGY2LCAxMCB9LCB7IDB4MWU0LCAxMSB9LAorICAgIHsgIDB4Y2IsIDEwIH0sIHsgMHg5OWQsIDEyIH0sIHsgIDB4Y2EsIDEwIH0sIHsgMHgyZmMsIDEyIH0sCisgICAgeyAweDE3ZiwgMTEgfSwgeyAweDRjZCwgMTEgfSwgeyAweDJmZCwgMTIgfSwgeyAweDRmZSwgMTEgfSwKKyAgICB7IDB4MTNhLCAxMyB9LCB7ICAgMHhhLCAgNCB9LCB7ICAweDQyLCAgNyB9LCB7IDB4MWQzLCAgOSB9LAorICAgIHsgMHg0ZGQsIDExIH0sIHsgIDB4MTIsICA1IH0sIHsgIDB4ZTgsICA4IH0sIHsgIDB4NGMsIDExIH0sCisgICAgeyAweDEzNiwgMTMgfSwgeyAgMHgzOSwgIDYgfSwgeyAweDI2NCwgMTAgfSwgeyAweGViYSwgMTIgfSwKKyAgICB7ICAgMHgwLCAgNyB9LCB7ICAweGFlLCAxMCB9LCB7IDB4OTljLCAxMiB9LCB7ICAweDFmLCAgNyB9LAorICAgIHsgMHg0ZGUsIDExIH0sIHsgIDB4NDMsICA3IH0sIHsgMHg0ZGMsIDExIH0sIHsgICAweDMsICA4IH0sCisgICAgeyAweDNjYiwgMTIgfSwgeyAgIDB4NiwgIDggfSwgeyAweDk5ZSwgMTIgfSwgeyAgMHgyYSwgIDggfSwKKyAgICB7IDB4NWYxLCAxMyB9LCB7ICAgMHhmLCAgOCB9LCB7IDB4OWZlLCAxMiB9LCB7ICAweDMzLCAgOCB9LAorICAgIHsgMHg5ZmYsIDEyIH0sIHsgIDB4OTgsICA4IH0sIHsgMHg5OWYsIDEyIH0sIHsgIDB4ZWEsICA4IH0sCisgICAgeyAweDEzYywgMTMgfSwgeyAgMHgyZSwgIDggfSwgeyAweDE5MiwgMTEgfSwgeyAweDEzNiwgIDkgfSwKKyAgICB7ICAweDZhLCAgOSB9LCB7ICAweDE1LCAxMSB9LCB7IDB4M2FmLCAxMCB9LCB7IDB4MWUzLCAxMSB9LAorICAgIHsgIDB4NzQsIDExIH0sIHsgIDB4ZWIsIDEyIH0sIHsgMHgyZjksIDEyIH0sIHsgIDB4NWMsIDEzIH0sCisgICAgeyAgMHhlZCwgMTIgfSwgeyAweDNkZCwgMTIgfSwgeyAweDMyNiwgMTIgfSwgeyAgMHg1ZSwgMTMgfSwKKyAgICB7ICAweDE2LCAgNyB9LAogfTsKIAogc3RhdGljIGNvbnN0IGludDhfdCB0YWJsZTBfbGV2ZWxbMTMyXSA9IHsKLSAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCi0gIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAotICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwKLSAgOSwgMTAsIDExLCAgMSwgIDIsICAzLCAgNCwgIDUsCi0gIDYsICA3LCAgOCwgIDEsICAyLCAgMywgIDQsICA1LAotICA2LCAgNywgIDEsICAyLCAgMywgIDQsICA1LCAgMSwKLSAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgNCwgIDEsCi0gIDIsICAzLCAgMSwgIDIsICAzLCAgMSwgIDIsICAzLAotICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwKLSAgMywgIDEsICAyLCAgMywgIDEsICAyLCAgMSwgIDIsCi0gIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAzLAotICA0LCAgMSwgIDIsICAzLCAgNCwgIDEsICAyLCAgMywKLSAgMSwgIDIsICAzLCAgMSwgIDIsICAxLCAgMiwgIDEsCi0gIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLAotICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwKLSAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgICAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgICAgOSwgMTAsIDExLCAgMSwgIDIsICAzLCAgNCwgIDUsCisgICAgNiwgIDcsICA4LCAgMSwgIDIsICAzLCAgNCwgIDUsCisgICAgNiwgIDcsICAxLCAgMiwgIDMsICA0LCAgNSwgIDEsCisgICAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgNCwgIDEsCisgICAgMiwgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsCisgICAgMSwgIDIsICAzLCAgMSwgIDIsICAzLCAgMSwgIDIsCisgICAgMywgIDEsICAyLCAgMywgIDEsICAyLCAgMSwgIDIsCisgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDMsCisgICAgNCwgIDEsICAyLCAgMywgIDQsICAxLCAgMiwgIDMsCisgICAgMSwgIDIsICAzLCAgMSwgIDIsICAxLCAgMiwgIDEsCisgICAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsCisgICAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsCisgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDEsICAxLCAgMSwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQ4X3QgdGFibGUwX3J1blsxMzJdID0gewotICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAxLCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMiwKLSAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywgIDMsCi0gIDMsICAzLCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LAotICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNywKLSAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksCi0gMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsIDEyLAotIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwKLSAxNiwgMTcsIDE4LCAxOSwgMjAsICAwLCAgMCwgIDAsCi0gIDAsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLAotICAzLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwKLSAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsCi0gMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LAotIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwKLSAyMywgMjQsIDI1LCAyNiwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsCisgICAgIDIsICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICAzLAorICAgICAzLCAgMywgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwKKyAgICAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsCisgICAgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LAorICAgIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwKKyAgICAxMiwgMTMsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsCisgICAgMTYsIDE3LCAxOCwgMTksIDIwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwKKyAgICAgMywgIDMsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsCisgICAgIDYsICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwKKyAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsCisgICAgMjMsIDI0LCAyNSwgMjYsCiB9OwogCiAvKiB2bGMgdGFibGUgMSwgZm9yIGludHJhIGNocm9tYSBhbmQgUCBtYWNyb2Jsb2NrcyAqLwogCiBzdGF0aWMgY29uc3QgdWludDE2X3QgdGFibGUxX3ZsY1sxNDldWzJdID0gewoteyAgICAweDQsICAzIH0seyAgIDB4MTQsICA1IH0seyAgIDB4MTcsICA3IH0seyAgIDB4N2YsICA4IH0sCi17ICAweDE1NCwgIDkgfSx7ICAweDFmMiwgMTAgfSx7ICAgMHhiZiwgMTEgfSx7ICAgMHg2NSwgMTIgfSwKLXsgIDB4YWFhLCAxMiB9LHsgIDB4NjMwLCAxMyB9LHsgMHgxNTk3LCAxMyB9LHsgIDB4M2I3LCAxNCB9LAoteyAweDJiMjIsIDE0IH0seyAgMHhiZTYsIDE1IH0seyAgICAweGIsICA0IH0seyAgIDB4MzcsICA3IH0sCi17ICAgMHg2MiwgIDkgfSx7ICAgIDB4NywgMTEgfSx7ICAweDE2NiwgMTIgfSx7ICAgMHhjZSwgMTMgfSwKLXsgMHgxNTkwLCAxMyB9LHsgIDB4NWY2LCAxNCB9LHsgIDB4YmU3LCAxNSB9LHsgICAgMHg3LCAgNSB9LAoteyAgIDB4NmQsICA4IH0seyAgICAweDMsIDExIH0seyAgMHgzMWYsIDEyIH0seyAgMHg1ZjIsIDE0IH0sCi17ICAgIDB4MiwgIDYgfSx7ICAgMHg2MSwgIDkgfSx7ICAgMHg1NSwgMTIgfSx7ICAweDFkZiwgMTQgfSwKLXsgICAweDFhLCAgNiB9LHsgICAweDFlLCAxMCB9LHsgIDB4YWM5LCAxMiB9LHsgMHgyYjIzLCAxNCB9LAoteyAgIDB4MWUsICA2IH0seyAgIDB4MWYsIDEwIH0seyAgMHhhYzMsIDEyIH0seyAweDJiMmIsIDE0IH0sCi17ICAgIDB4NiwgIDcgfSx7ICAgIDB4NCwgMTEgfSx7ICAweDJmOCwgMTMgfSx7ICAgMHgxOSwgIDcgfSwKLXsgICAgMHg2LCAxMSB9LHsgIDB4NjNkLCAxMyB9LHsgICAweDU3LCAgNyB9LHsgIDB4MTgyLCAxMSB9LAoteyAweDJhYTIsIDE0IH0seyAgICAweDQsICA4IH0seyAgMHgxODAsIDExIH0seyAgMHg1OWMsIDE0IH0sCi17ICAgMHg3ZCwgIDggfSx7ICAweDE2NCwgMTIgfSx7ICAweDc2ZCwgMTUgfSx7ICAgIDB4MiwgIDkgfSwKLXsgIDB4MThkLCAxMSB9LHsgMHgxNTgxLCAxMyB9LHsgICAweGFkLCAgOCB9LHsgICAweDYwLCAxMiB9LAoteyAgMHhjNjcsIDE0IH0seyAgIDB4MWMsICA5IH0seyAgIDB4ZWUsIDEzIH0seyAgICAweDMsICA5IH0sCi17ICAweDJjZiwgMTMgfSx7ICAgMHhkOSwgIDkgfSx7IDB4MTU4MCwgMTMgfSx7ICAgIDB4MiwgMTEgfSwKLXsgIDB4MTgzLCAxMSB9LHsgICAweDU3LCAxMiB9LHsgICAweDYxLCAxMiB9LHsgICAweDMxLCAxMSB9LAoteyAgIDB4NjYsIDEyIH0seyAgMHg2MzEsIDEzIH0seyAgMHg2MzIsIDEzIH0seyAgIDB4YWMsIDEzIH0sCi17ICAweDMxZCwgMTIgfSx7ICAgMHg3NiwgMTIgfSx7ICAgMHgzYSwgMTEgfSx7ICAweDE2NSwgMTIgfSwKLXsgIDB4YzY2LCAxNCB9LHsgICAgMHgzLCAgMiB9LHsgICAweDU0LCAgNyB9LHsgIDB4MmFiLCAxMCB9LAoteyAgIDB4MTYsIDEzIH0seyAgMHg1ZjcsIDE0IH0seyAgICAweDUsICA0IH0seyAgIDB4ZjgsICA5IH0sCi17ICAweGFhOSwgMTIgfSx7ICAgMHg1ZiwgMTUgfSx7ICAgIDB4NCwgIDQgfSx7ICAgMHgxYywgMTAgfSwKLXsgMHgxNTUwLCAxMyB9LHsgICAgMHg0LCAgNSB9LHsgICAweDc3LCAxMSB9LHsgIDB4NzZjLCAxNSB9LAoteyAgICAweGUsICA1IH0seyAgICAweGEsIDEyIH0seyAgICAweGMsICA1IH0seyAgMHg1NjIsIDExIH0sCi17ICAgIDB4NCwgIDYgfSx7ICAweDMxYywgMTIgfSx7ICAgIDB4NiwgIDYgfSx7ICAgMHhjOCwgMTMgfSwKLXsgICAgMHhkLCAgNiB9LHsgIDB4MWRhLCAxMyB9LHsgICAgMHg3LCAgNiB9LHsgICAweGM5LCAxMyB9LAoteyAgICAweDEsICA3IH0seyAgIDB4MmUsIDE0IH0seyAgIDB4MTQsICA3IH0seyAweDE1OTYsIDEzIH0sCi17ICAgIDB4YSwgIDcgfSx7ICAweGFjMiwgMTIgfSx7ICAgMHgxNiwgIDcgfSx7ICAweDE1YiwgMTQgfSwKLXsgICAweDE1LCAgNyB9LHsgIDB4MTVhLCAxNCB9LHsgICAgMHhmLCAgOCB9LHsgICAweDVlLCAxNSB9LAoteyAgIDB4N2UsICA4IH0seyAgIDB4YWIsICA4IH0seyAgIDB4MmQsICA5IH0seyAgIDB4ZDgsICA5IH0sCi17ICAgIDB4YiwgIDkgfSx7ICAgMHgxNCwgMTAgfSx7ICAweDJiMywgMTAgfSx7ICAweDFmMywgMTAgfSwKLXsgICAweDNhLCAxMCB9LHsgICAgMHgwLCAxMCB9LHsgICAweDU4LCAxMCB9LHsgICAweDJlLCAgOSB9LAoteyAgIDB4NWUsIDEwIH0seyAgMHg1NjMsIDExIH0seyAgIDB4ZWMsIDEyIH0seyAgIDB4NTQsIDEyIH0sCi17ICAweGFjMSwgMTIgfSx7IDB4MTU1NiwgMTMgfSx7ICAweDJmYSwgMTMgfSx7ICAweDE4MSwgMTEgfSwKLXsgMHgxNTU3LCAxMyB9LHsgIDB4NTlkLCAxNCB9LHsgMHgyYWEzLCAxNCB9LHsgMHgyYjJhLCAxNCB9LAoteyAgMHgxZGUsIDE0IH0seyAgMHg2M2MsIDEzIH0seyAgIDB4Y2YsIDEzIH0seyAweDE1OTQsIDEzIH0sCi17ICAgIDB4ZCwgIDkgfSwKKyAgICB7ICAgIDB4NCwgIDMgfSwgeyAgIDB4MTQsICA1IH0sIHsgICAweDE3LCAgNyB9LCB7ICAgMHg3ZiwgIDggfSwKKyAgICB7ICAweDE1NCwgIDkgfSwgeyAgMHgxZjIsIDEwIH0sIHsgICAweGJmLCAxMSB9LCB7ICAgMHg2NSwgMTIgfSwKKyAgICB7ICAweGFhYSwgMTIgfSwgeyAgMHg2MzAsIDEzIH0sIHsgMHgxNTk3LCAxMyB9LCB7ICAweDNiNywgMTQgfSwKKyAgICB7IDB4MmIyMiwgMTQgfSwgeyAgMHhiZTYsIDE1IH0sIHsgICAgMHhiLCAgNCB9LCB7ICAgMHgzNywgIDcgfSwKKyAgICB7ICAgMHg2MiwgIDkgfSwgeyAgICAweDcsIDExIH0sIHsgIDB4MTY2LCAxMiB9LCB7ICAgMHhjZSwgMTMgfSwKKyAgICB7IDB4MTU5MCwgMTMgfSwgeyAgMHg1ZjYsIDE0IH0sIHsgIDB4YmU3LCAxNSB9LCB7ICAgIDB4NywgIDUgfSwKKyAgICB7ICAgMHg2ZCwgIDggfSwgeyAgICAweDMsIDExIH0sIHsgIDB4MzFmLCAxMiB9LCB7ICAweDVmMiwgMTQgfSwKKyAgICB7ICAgIDB4MiwgIDYgfSwgeyAgIDB4NjEsICA5IH0sIHsgICAweDU1LCAxMiB9LCB7ICAweDFkZiwgMTQgfSwKKyAgICB7ICAgMHgxYSwgIDYgfSwgeyAgIDB4MWUsIDEwIH0sIHsgIDB4YWM5LCAxMiB9LCB7IDB4MmIyMywgMTQgfSwKKyAgICB7ICAgMHgxZSwgIDYgfSwgeyAgIDB4MWYsIDEwIH0sIHsgIDB4YWMzLCAxMiB9LCB7IDB4MmIyYiwgMTQgfSwKKyAgICB7ICAgIDB4NiwgIDcgfSwgeyAgICAweDQsIDExIH0sIHsgIDB4MmY4LCAxMyB9LCB7ICAgMHgxOSwgIDcgfSwKKyAgICB7ICAgIDB4NiwgMTEgfSwgeyAgMHg2M2QsIDEzIH0sIHsgICAweDU3LCAgNyB9LCB7ICAweDE4MiwgMTEgfSwKKyAgICB7IDB4MmFhMiwgMTQgfSwgeyAgICAweDQsICA4IH0sIHsgIDB4MTgwLCAxMSB9LCB7ICAweDU5YywgMTQgfSwKKyAgICB7ICAgMHg3ZCwgIDggfSwgeyAgMHgxNjQsIDEyIH0sIHsgIDB4NzZkLCAxNSB9LCB7ICAgIDB4MiwgIDkgfSwKKyAgICB7ICAweDE4ZCwgMTEgfSwgeyAweDE1ODEsIDEzIH0sIHsgICAweGFkLCAgOCB9LCB7ICAgMHg2MCwgMTIgfSwKKyAgICB7ICAweGM2NywgMTQgfSwgeyAgIDB4MWMsICA5IH0sIHsgICAweGVlLCAxMyB9LCB7ICAgIDB4MywgIDkgfSwKKyAgICB7ICAweDJjZiwgMTMgfSwgeyAgIDB4ZDksICA5IH0sIHsgMHgxNTgwLCAxMyB9LCB7ICAgIDB4MiwgMTEgfSwKKyAgICB7ICAweDE4MywgMTEgfSwgeyAgIDB4NTcsIDEyIH0sIHsgICAweDYxLCAxMiB9LCB7ICAgMHgzMSwgMTEgfSwKKyAgICB7ICAgMHg2NiwgMTIgfSwgeyAgMHg2MzEsIDEzIH0sIHsgIDB4NjMyLCAxMyB9LCB7ICAgMHhhYywgMTMgfSwKKyAgICB7ICAweDMxZCwgMTIgfSwgeyAgIDB4NzYsIDEyIH0sIHsgICAweDNhLCAxMSB9LCB7ICAweDE2NSwgMTIgfSwKKyAgICB7ICAweGM2NiwgMTQgfSwgeyAgICAweDMsICAyIH0sIHsgICAweDU0LCAgNyB9LCB7ICAweDJhYiwgMTAgfSwKKyAgICB7ICAgMHgxNiwgMTMgfSwgeyAgMHg1ZjcsIDE0IH0sIHsgICAgMHg1LCAgNCB9LCB7ICAgMHhmOCwgIDkgfSwKKyAgICB7ICAweGFhOSwgMTIgfSwgeyAgIDB4NWYsIDE1IH0sIHsgICAgMHg0LCAgNCB9LCB7ICAgMHgxYywgMTAgfSwKKyAgICB7IDB4MTU1MCwgMTMgfSwgeyAgICAweDQsICA1IH0sIHsgICAweDc3LCAxMSB9LCB7ICAweDc2YywgMTUgfSwKKyAgICB7ICAgIDB4ZSwgIDUgfSwgeyAgICAweGEsIDEyIH0sIHsgICAgMHhjLCAgNSB9LCB7ICAweDU2MiwgMTEgfSwKKyAgICB7ICAgIDB4NCwgIDYgfSwgeyAgMHgzMWMsIDEyIH0sIHsgICAgMHg2LCAgNiB9LCB7ICAgMHhjOCwgMTMgfSwKKyAgICB7ICAgIDB4ZCwgIDYgfSwgeyAgMHgxZGEsIDEzIH0sIHsgICAgMHg3LCAgNiB9LCB7ICAgMHhjOSwgMTMgfSwKKyAgICB7ICAgIDB4MSwgIDcgfSwgeyAgIDB4MmUsIDE0IH0sIHsgICAweDE0LCAgNyB9LCB7IDB4MTU5NiwgMTMgfSwKKyAgICB7ICAgIDB4YSwgIDcgfSwgeyAgMHhhYzIsIDEyIH0sIHsgICAweDE2LCAgNyB9LCB7ICAweDE1YiwgMTQgfSwKKyAgICB7ICAgMHgxNSwgIDcgfSwgeyAgMHgxNWEsIDE0IH0sIHsgICAgMHhmLCAgOCB9LCB7ICAgMHg1ZSwgMTUgfSwKKyAgICB7ICAgMHg3ZSwgIDggfSwgeyAgIDB4YWIsICA4IH0sIHsgICAweDJkLCAgOSB9LCB7ICAgMHhkOCwgIDkgfSwKKyAgICB7ICAgIDB4YiwgIDkgfSwgeyAgIDB4MTQsIDEwIH0sIHsgIDB4MmIzLCAxMCB9LCB7ICAweDFmMywgMTAgfSwKKyAgICB7ICAgMHgzYSwgMTAgfSwgeyAgICAweDAsIDEwIH0sIHsgICAweDU4LCAxMCB9LCB7ICAgMHgyZSwgIDkgfSwKKyAgICB7ICAgMHg1ZSwgMTAgfSwgeyAgMHg1NjMsIDExIH0sIHsgICAweGVjLCAxMiB9LCB7ICAgMHg1NCwgMTIgfSwKKyAgICB7ICAweGFjMSwgMTIgfSwgeyAweDE1NTYsIDEzIH0sIHsgIDB4MmZhLCAxMyB9LCB7ICAweDE4MSwgMTEgfSwKKyAgICB7IDB4MTU1NywgMTMgfSwgeyAgMHg1OWQsIDE0IH0sIHsgMHgyYWEzLCAxNCB9LCB7IDB4MmIyYSwgMTQgfSwKKyAgICB7ICAweDFkZSwgMTQgfSwgeyAgMHg2M2MsIDEzIH0sIHsgICAweGNmLCAxMyB9LCB7IDB4MTU5NCwgMTMgfSwKKyAgICB7ICAgIDB4ZCwgIDkgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQ4X3QgdGFibGUxX2xldmVsWzE0OF0gPSB7Ci0gIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAotICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsICAxLCAgMiwKLSAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEsCi0gIDIsICAzLCAgNCwgIDUsICAxLCAgMiwgIDMsICA0LAotICAxLCAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgNCwKLSAgMSwgIDIsICAzLCAgMSwgIDIsICAzLCAgMSwgIDIsCi0gIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLAotICAyLCAgMywgIDEsICAyLCAgMywgIDEsICAyLCAgMSwKLSAgMiwgIDEsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAxLCAgMSwgIDIsICAzLCAgNCwgIDUsICAxLCAgMiwKLSAgMywgIDQsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsCi0gIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLAotICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKLSAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsCi0gIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gIDEsICAxLCAgMSwgIDEsCisgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCA3LCA4LAorICAgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMSwgMiwKKyAgICAzLCAgNCwgIDUsICA2LCAgNywgIDgsIDksIDEsCisgICAgMiwgIDMsICA0LCAgNSwgIDEsICAyLCAzLCA0LAorICAgIDEsICAyLCAgMywgIDQsICAxLCAgMiwgMywgNCwKKyAgICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsIDEsIDIsCisgICAgMywgIDEsICAyLCAgMywgIDEsICAyLCAzLCAxLAorICAgIDIsICAzLCAgMSwgIDIsICAzLCAgMSwgMiwgMSwKKyAgICAyLCAgMSwgIDIsICAxLCAgMSwgIDEsIDEsIDEsCisgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxLCAxLAorICAgIDEsICAxLCAgMiwgIDMsICA0LCAgNSwgMSwgMiwKKyAgICAzLCAgNCwgIDEsICAyLCAgMywgIDEsIDIsIDMsCisgICAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAxLCAyLAorICAgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgMSwgMiwKKyAgICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsIDEsIDIsCisgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxLCAxLAorICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgMSwgMSwKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIDEsIDEsCisgICAgMSwgIDEsICAxLCAgMSwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQ4X3QgdGFibGUxX3J1blsxNDhdID0gewotICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsCi0gIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLAotICAyLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywKLSAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsCi0gIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LAotICA4LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwKLSAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsCi0gMTQsIDE1LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLAotIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwKLSAyOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsCi0gIDEsICAxLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLAotICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywKLSAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsCi0gMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LAotIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKLSAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCi0gMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LAotIDQwLCA0MSwgNDIsIDQzLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLCAgMywKKyAgICAgNCwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDUsCisgICAgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LAorICAgICA4LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwKKyAgICAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsCisgICAgMTQsIDE1LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLAorICAgIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwKKyAgICAyOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMiwgIDIsICAyLCAgMywgIDMsICAzLAorICAgICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywKKyAgICAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsCisgICAgMTIsIDEyLCAxMywgMTMsIDE0LCAxNCwgMTUsIDE1LAorICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKKyAgICAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgICAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LAorICAgIDQwLCA0MSwgNDIsIDQzLAogfTsKIAogLyogdGhpcmQgdmxjIHRhYmxlICovCiAKIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0YWJsZTJfdmxjWzE4Nl1bMl0gPSB7Ci17ICAgIDB4MSwgIDIgfSx7ICAgIDB4NSwgIDMgfSx7ICAgIDB4ZCwgIDQgfSx7ICAgMHgxMiwgIDUgfSwKLXsgICAgMHhlLCAgNiB9LHsgICAweDE1LCAgNyB9LHsgICAweDEzLCAgOCB9LHsgICAweDNmLCAgOCB9LAoteyAgIDB4NGIsICA5IH0seyAgMHgxMWYsICA5IH0seyAgIDB4YjgsIDEwIH0seyAgMHgzZTMsIDEwIH0sCi17ICAweDE3MiwgMTEgfSx7ICAweDI0ZCwgMTIgfSx7ICAweDNkYSwgMTIgfSx7ICAweDJkZCwgMTMgfSwKLXsgMHgxZjU1LCAxMyB9LHsgIDB4NWI5LCAxNCB9LHsgMHgzZWFlLCAxNCB9LHsgICAgMHgwLCAgNCB9LAoteyAgIDB4MTAsICA1IH0seyAgICAweDgsICA3IH0seyAgIDB4MjAsICA4IH0seyAgIDB4MjksICA5IH0sCi17ICAweDFmNCwgIDkgfSx7ICAweDIzMywgMTAgfSx7ICAweDFlMCwgMTEgfSx7ICAweDEyYSwgMTIgfSwKLXsgIDB4M2RkLCAxMiB9LHsgIDB4NTBhLCAxMyB9LHsgMHgxZjI5LCAxMyB9LHsgIDB4YTQyLCAxNCB9LAoteyAweDEyNzIsIDE1IH0seyAweDE3MzcsIDE1IH0seyAgICAweDMsICA1IH0seyAgIDB4MTEsICA3IH0sCi17ICAgMHhjNCwgIDggfSx7ICAgMHg0YiwgMTAgfSx7ICAgMHhiNCwgMTEgfSx7ICAweDdkNCwgMTEgfSwKLXsgIDB4MzQ1LCAxMiB9LHsgIDB4MmQ3LCAxMyB9LHsgIDB4N2JmLCAxMyB9LHsgIDB4OTM4LCAxNCB9LAoteyAgMHhiYmIsIDE0IH0seyAgMHg5NWUsIDE1IH0seyAgIDB4MTMsICA1IH0seyAgIDB4NzgsICA3IH0sCi17ICAgMHg2OSwgIDkgfSx7ICAweDIzMiwgMTAgfSx7ICAweDQ2MSwgMTEgfSx7ICAweDNlYywgMTIgfSwKLXsgIDB4NTIwLCAxMyB9LHsgMHgxZjJhLCAxMyB9LHsgMHgzZTUwLCAxNCB9LHsgMHgzZTUxLCAxNCB9LAoteyAweDE0ODYsIDE1IH0seyAgICAweGMsICA2IH0seyAgIDB4MjQsICA5IH0seyAgIDB4OTQsIDExIH0sCi17ICAweDhjMCwgMTIgfSx7ICAweGYwOSwgMTQgfSx7IDB4MWVmMCwgMTUgfSx7ICAgMHgzZCwgIDYgfSwKLXsgICAweDUzLCAgOSB9LHsgIDB4MWEwLCAxMSB9LHsgIDB4MmQ2LCAxMyB9LHsgIDB4ZjA4LCAxNCB9LAoteyAgIDB4MTMsICA3IH0seyAgIDB4N2MsICA5IH0seyAgMHg3YzEsIDExIH0seyAgMHg0YWMsIDE0IH0sCi17ICAgMHgxYiwgIDcgfSx7ICAgMHhhMCwgMTAgfSx7ICAweDM0NCwgMTIgfSx7ICAweGY3OSwgMTQgfSwKLXsgICAweDc5LCAgNyB9LHsgIDB4M2UxLCAxMCB9LHsgIDB4MmQ0LCAxMyB9LHsgMHgyMzA2LCAxNCB9LAoteyAgIDB4MjEsICA4IH0seyAgMHgyM2MsIDEwIH0seyAgMHhmYWUsIDEyIH0seyAweDIzZGUsIDE0IH0sCi17ICAgMHgzNSwgIDggfSx7ICAweDE3NSwgMTEgfSx7ICAweDdiMywgMTMgfSx7ICAgMHhjNSwgIDggfSwKLXsgIDB4MTc0LCAxMSB9LHsgIDB4Nzg1LCAxMyB9LHsgICAweDQ4LCAgOSB9LHsgIDB4MWEzLCAxMSB9LAoteyAgMHg0OWUsIDEzIH0seyAgIDB4MmMsICA5IH0seyAgIDB4ZmEsIDEwIH0seyAgMHg3ZDYsIDExIH0sCi17ICAgMHg5MiwgMTAgfSx7ICAweDVjYywgMTMgfSx7IDB4MWVmMSwgMTUgfSx7ICAgMHhhMywgMTAgfSwKLXsgIDB4M2VkLCAxMiB9LHsgIDB4OTNlLCAxNCB9LHsgIDB4MWUyLCAxMSB9LHsgMHgxMjczLCAxNSB9LAoteyAgMHg3YzQsIDExIH0seyAweDE0ODcsIDE1IH0seyAgMHgyOTEsIDEyIH0seyAgMHgyOTMsIDEyIH0sCi17ICAweGY4YSwgMTIgfSx7ICAweDUwOSwgMTMgfSx7ICAweDUwOCwgMTMgfSx7ICAweDc4ZCwgMTMgfSwKLXsgIDB4N2JlLCAxMyB9LHsgIDB4NzhjLCAxMyB9LHsgIDB4NGFlLCAxNCB9LHsgIDB4YmJhLCAxNCB9LAoteyAweDIzMDcsIDE0IH0seyAgMHhiOWEsIDE0IH0seyAweDE3MzYsIDE1IH0seyAgICAweGUsICA0IH0sCi17ICAgMHg0NSwgIDcgfSx7ICAweDFmMywgIDkgfSx7ICAweDQ3YSwgMTEgfSx7ICAweDVkYywgMTMgfSwKLXsgMHgyM2RmLCAxNCB9LHsgICAweDE5LCAgNSB9LHsgICAweDI4LCAgOSB9LHsgIDB4MTc2LCAxMSB9LAoteyAgMHg0OWQsIDEzIH0seyAweDIzZGQsIDE0IH0seyAgIDB4MzAsICA2IH0seyAgIDB4YTIsIDEwIH0sCi17ICAweDJlZiwgMTIgfSx7ICAweDViOCwgMTQgfSx7ICAgMHgzZiwgIDYgfSx7ICAgMHhhNSwgMTAgfSwKLXsgIDB4M2RiLCAxMiB9LHsgIDB4OTNmLCAxNCB9LHsgICAweDQ0LCAgNyB9LHsgIDB4N2NiLCAxMSB9LAoteyAgMHg5NWYsIDE1IH0seyAgIDB4NjMsICA3IH0seyAgMHgzYzMsIDEyIH0seyAgIDB4MTUsICA4IH0sCi17ICAweDhmNiwgMTIgfSx7ICAgMHgxNywgIDggfSx7ICAweDQ5OCwgMTMgfSx7ICAgMHgyYywgIDggfSwKLXsgIDB4N2IyLCAxMyB9LHsgICAweDJmLCAgOCB9LHsgMHgxZjU0LCAxMyB9LHsgICAweDhkLCAgOCB9LAoteyAgMHg3YmQsIDEzIH0seyAgIDB4OGUsICA4IH0seyAweDExODIsIDEzIH0seyAgIDB4ZmIsICA4IH0sCi17ICAweDUwYiwgMTMgfSx7ICAgMHgyZCwgIDggfSx7ICAweDdjMCwgMTEgfSx7ICAgMHg3OSwgIDkgfSwKLXsgMHgxZjVmLCAxMyB9LHsgICAweDdhLCAgOSB9LHsgMHgxZjU2LCAxMyB9LHsgIDB4MjMxLCAxMCB9LAoteyAgMHgzZTQsIDEwIH0seyAgMHgxYTEsIDExIH0seyAgMHgxNDMsIDExIH0seyAgMHgxZjcsIDExIH0sCi17ICAweDE2ZiwgMTIgfSx7ICAweDI5MiwgMTIgfSx7ICAweDJlNywgMTIgfSx7ICAweDE2YywgMTIgfSwKLXsgIDB4MTZkLCAxMiB9LHsgIDB4M2RjLCAxMiB9LHsgIDB4ZjhiLCAxMiB9LHsgIDB4NDk5LCAxMyB9LAoteyAgMHgzZDgsIDEyIH0seyAgMHg3OGUsIDEzIH0seyAgMHgyZDUsIDEzIH0seyAweDFmNWUsIDEzIH0sCi17IDB4MWYyYiwgMTMgfSx7ICAweDc4ZiwgMTMgfSx7ICAweDRhZCwgMTQgfSx7IDB4M2VhZiwgMTQgfSwKLXsgMHgyM2RjLCAxNCB9LHsgICAweDRhLCAgOSB9LAorICAgIHsgICAgMHgxLCAgMiB9LCB7ICAgIDB4NSwgIDMgfSwgeyAgICAweGQsICA0IH0sIHsgICAweDEyLCAgNSB9LAorICAgIHsgICAgMHhlLCAgNiB9LCB7ICAgMHgxNSwgIDcgfSwgeyAgIDB4MTMsICA4IH0sIHsgICAweDNmLCAgOCB9LAorICAgIHsgICAweDRiLCAgOSB9LCB7ICAweDExZiwgIDkgfSwgeyAgIDB4YjgsIDEwIH0sIHsgIDB4M2UzLCAxMCB9LAorICAgIHsgIDB4MTcyLCAxMSB9LCB7ICAweDI0ZCwgMTIgfSwgeyAgMHgzZGEsIDEyIH0sIHsgIDB4MmRkLCAxMyB9LAorICAgIHsgMHgxZjU1LCAxMyB9LCB7ICAweDViOSwgMTQgfSwgeyAweDNlYWUsIDE0IH0sIHsgICAgMHgwLCAgNCB9LAorICAgIHsgICAweDEwLCAgNSB9LCB7ICAgIDB4OCwgIDcgfSwgeyAgIDB4MjAsICA4IH0sIHsgICAweDI5LCAgOSB9LAorICAgIHsgIDB4MWY0LCAgOSB9LCB7ICAweDIzMywgMTAgfSwgeyAgMHgxZTAsIDExIH0sIHsgIDB4MTJhLCAxMiB9LAorICAgIHsgIDB4M2RkLCAxMiB9LCB7ICAweDUwYSwgMTMgfSwgeyAweDFmMjksIDEzIH0sIHsgIDB4YTQyLCAxNCB9LAorICAgIHsgMHgxMjcyLCAxNSB9LCB7IDB4MTczNywgMTUgfSwgeyAgICAweDMsICA1IH0sIHsgICAweDExLCAgNyB9LAorICAgIHsgICAweGM0LCAgOCB9LCB7ICAgMHg0YiwgMTAgfSwgeyAgIDB4YjQsIDExIH0sIHsgIDB4N2Q0LCAxMSB9LAorICAgIHsgIDB4MzQ1LCAxMiB9LCB7ICAweDJkNywgMTMgfSwgeyAgMHg3YmYsIDEzIH0sIHsgIDB4OTM4LCAxNCB9LAorICAgIHsgIDB4YmJiLCAxNCB9LCB7ICAweDk1ZSwgMTUgfSwgeyAgIDB4MTMsICA1IH0sIHsgICAweDc4LCAgNyB9LAorICAgIHsgICAweDY5LCAgOSB9LCB7ICAweDIzMiwgMTAgfSwgeyAgMHg0NjEsIDExIH0sIHsgIDB4M2VjLCAxMiB9LAorICAgIHsgIDB4NTIwLCAxMyB9LCB7IDB4MWYyYSwgMTMgfSwgeyAweDNlNTAsIDE0IH0sIHsgMHgzZTUxLCAxNCB9LAorICAgIHsgMHgxNDg2LCAxNSB9LCB7ICAgIDB4YywgIDYgfSwgeyAgIDB4MjQsICA5IH0sIHsgICAweDk0LCAxMSB9LAorICAgIHsgIDB4OGMwLCAxMiB9LCB7ICAweGYwOSwgMTQgfSwgeyAweDFlZjAsIDE1IH0sIHsgICAweDNkLCAgNiB9LAorICAgIHsgICAweDUzLCAgOSB9LCB7ICAweDFhMCwgMTEgfSwgeyAgMHgyZDYsIDEzIH0sIHsgIDB4ZjA4LCAxNCB9LAorICAgIHsgICAweDEzLCAgNyB9LCB7ICAgMHg3YywgIDkgfSwgeyAgMHg3YzEsIDExIH0sIHsgIDB4NGFjLCAxNCB9LAorICAgIHsgICAweDFiLCAgNyB9LCB7ICAgMHhhMCwgMTAgfSwgeyAgMHgzNDQsIDEyIH0sIHsgIDB4Zjc5LCAxNCB9LAorICAgIHsgICAweDc5LCAgNyB9LCB7ICAweDNlMSwgMTAgfSwgeyAgMHgyZDQsIDEzIH0sIHsgMHgyMzA2LCAxNCB9LAorICAgIHsgICAweDIxLCAgOCB9LCB7ICAweDIzYywgMTAgfSwgeyAgMHhmYWUsIDEyIH0sIHsgMHgyM2RlLCAxNCB9LAorICAgIHsgICAweDM1LCAgOCB9LCB7ICAweDE3NSwgMTEgfSwgeyAgMHg3YjMsIDEzIH0sIHsgICAweGM1LCAgOCB9LAorICAgIHsgIDB4MTc0LCAxMSB9LCB7ICAweDc4NSwgMTMgfSwgeyAgIDB4NDgsICA5IH0sIHsgIDB4MWEzLCAxMSB9LAorICAgIHsgIDB4NDllLCAxMyB9LCB7ICAgMHgyYywgIDkgfSwgeyAgIDB4ZmEsIDEwIH0sIHsgIDB4N2Q2LCAxMSB9LAorICAgIHsgICAweDkyLCAxMCB9LCB7ICAweDVjYywgMTMgfSwgeyAweDFlZjEsIDE1IH0sIHsgICAweGEzLCAxMCB9LAorICAgIHsgIDB4M2VkLCAxMiB9LCB7ICAweDkzZSwgMTQgfSwgeyAgMHgxZTIsIDExIH0sIHsgMHgxMjczLCAxNSB9LAorICAgIHsgIDB4N2M0LCAxMSB9LCB7IDB4MTQ4NywgMTUgfSwgeyAgMHgyOTEsIDEyIH0sIHsgIDB4MjkzLCAxMiB9LAorICAgIHsgIDB4ZjhhLCAxMiB9LCB7ICAweDUwOSwgMTMgfSwgeyAgMHg1MDgsIDEzIH0sIHsgIDB4NzhkLCAxMyB9LAorICAgIHsgIDB4N2JlLCAxMyB9LCB7ICAweDc4YywgMTMgfSwgeyAgMHg0YWUsIDE0IH0sIHsgIDB4YmJhLCAxNCB9LAorICAgIHsgMHgyMzA3LCAxNCB9LCB7ICAweGI5YSwgMTQgfSwgeyAweDE3MzYsIDE1IH0sIHsgICAgMHhlLCAgNCB9LAorICAgIHsgICAweDQ1LCAgNyB9LCB7ICAweDFmMywgIDkgfSwgeyAgMHg0N2EsIDExIH0sIHsgIDB4NWRjLCAxMyB9LAorICAgIHsgMHgyM2RmLCAxNCB9LCB7ICAgMHgxOSwgIDUgfSwgeyAgIDB4MjgsICA5IH0sIHsgIDB4MTc2LCAxMSB9LAorICAgIHsgIDB4NDlkLCAxMyB9LCB7IDB4MjNkZCwgMTQgfSwgeyAgIDB4MzAsICA2IH0sIHsgICAweGEyLCAxMCB9LAorICAgIHsgIDB4MmVmLCAxMiB9LCB7ICAweDViOCwgMTQgfSwgeyAgIDB4M2YsICA2IH0sIHsgICAweGE1LCAxMCB9LAorICAgIHsgIDB4M2RiLCAxMiB9LCB7ICAweDkzZiwgMTQgfSwgeyAgIDB4NDQsICA3IH0sIHsgIDB4N2NiLCAxMSB9LAorICAgIHsgIDB4OTVmLCAxNSB9LCB7ICAgMHg2MywgIDcgfSwgeyAgMHgzYzMsIDEyIH0sIHsgICAweDE1LCAgOCB9LAorICAgIHsgIDB4OGY2LCAxMiB9LCB7ICAgMHgxNywgIDggfSwgeyAgMHg0OTgsIDEzIH0sIHsgICAweDJjLCAgOCB9LAorICAgIHsgIDB4N2IyLCAxMyB9LCB7ICAgMHgyZiwgIDggfSwgeyAweDFmNTQsIDEzIH0sIHsgICAweDhkLCAgOCB9LAorICAgIHsgIDB4N2JkLCAxMyB9LCB7ICAgMHg4ZSwgIDggfSwgeyAweDExODIsIDEzIH0sIHsgICAweGZiLCAgOCB9LAorICAgIHsgIDB4NTBiLCAxMyB9LCB7ICAgMHgyZCwgIDggfSwgeyAgMHg3YzAsIDExIH0sIHsgICAweDc5LCAgOSB9LAorICAgIHsgMHgxZjVmLCAxMyB9LCB7ICAgMHg3YSwgIDkgfSwgeyAweDFmNTYsIDEzIH0sIHsgIDB4MjMxLCAxMCB9LAorICAgIHsgIDB4M2U0LCAxMCB9LCB7ICAweDFhMSwgMTEgfSwgeyAgMHgxNDMsIDExIH0sIHsgIDB4MWY3LCAxMSB9LAorICAgIHsgIDB4MTZmLCAxMiB9LCB7ICAweDI5MiwgMTIgfSwgeyAgMHgyZTcsIDEyIH0sIHsgIDB4MTZjLCAxMiB9LAorICAgIHsgIDB4MTZkLCAxMiB9LCB7ICAweDNkYywgMTIgfSwgeyAgMHhmOGIsIDEyIH0sIHsgIDB4NDk5LCAxMyB9LAorICAgIHsgIDB4M2Q4LCAxMiB9LCB7ICAweDc4ZSwgMTMgfSwgeyAgMHgyZDUsIDEzIH0sIHsgMHgxZjVlLCAxMyB9LAorICAgIHsgMHgxZjJiLCAxMyB9LCB7ICAweDc4ZiwgMTMgfSwgeyAgMHg0YWQsIDE0IH0sIHsgMHgzZWFmLCAxNCB9LAorICAgIHsgMHgyM2RjLCAxNCB9LCB7ICAgMHg0YSwgIDkgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQ4X3QgdGFibGUyX2xldmVsWzE4NV0gPSB7Ci0gIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAotICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKLSAxNywgMTgsIDE5LCAgMSwgIDIsICAzLCAgNCwgIDUsCi0gIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLAotIDE0LCAxNSwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwKLSAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAgMSwgIDIsCi0gIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLAotIDExLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgMSwKLSAgMiwgIDMsICA0LCAgNSwgIDEsICAyLCAgMywgIDQsCi0gIDEsICAyLCAgMywgIDQsICAxLCAgMiwgIDMsICA0LAotICAxLCAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgMSwKLSAgMiwgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsCi0gIDEsICAyLCAgMywgIDEsICAyLCAgMywgIDEsICAyLAotICAxLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gIDIsICAzLCAgNCwgIDUsICA2LCAgMSwgIDIsICAzLAotICA0LCAgNSwgIDEsICAyLCAgMywgIDQsICAxLCAgMiwKLSAgMywgIDQsICAxLCAgMiwgIDMsICAxLCAgMiwgIDEsCi0gIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLAotICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwKLSAgMiwgIDEsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgMSwKKyAgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgICAgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorICAgIDE3LCAxOCwgMTksICAxLCAgMiwgIDMsICA0LCAgNSwKKyAgICAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsCisgICAgMTQsIDE1LCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LAorICAgICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsICAxLCAgMiwKKyAgICAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsCisgICAgMTEsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICAxLAorICAgICAyLCAgMywgIDQsICA1LCAgMSwgIDIsICAzLCAgNCwKKyAgICAgMSwgIDIsICAzLCAgNCwgIDEsICAyLCAgMywgIDQsCisgICAgIDEsICAyLCAgMywgIDQsICAxLCAgMiwgIDMsICAxLAorICAgICAyLCAgMywgIDEsICAyLCAgMywgIDEsICAyLCAgMywKKyAgICAgMSwgIDIsICAzLCAgMSwgIDIsICAzLCAgMSwgIDIsCisgICAgIDEsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMiwgIDMsICA0LCAgNSwgIDYsICAxLCAgMiwgIDMsCisgICAgIDQsICA1LCAgMSwgIDIsICAzLCAgNCwgIDEsICAyLAorICAgICAzLCAgNCwgIDEsICAyLCAgMywgIDEsICAyLCAgMSwKKyAgICAgMiwgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsCisgICAgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsICAxLAorICAgICAyLCAgMSwgIDIsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLAogfTsKIAogc3RhdGljIGNvbnN0IGludDhfdCB0YWJsZTJfcnVuWzE4NV0gPSB7Ci0gIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwKLSAgMiwgIDIsICAyLCAgMiwgIDIsICAyLCAgMywgIDMsCi0gIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsICAzLAotICAzLCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwKLSAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsCi0gIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LAotICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwKLSAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsCi0gMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTYsIDE2LAotIDE3LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKLSAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgIDAsCi0gIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLAotICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywKLSAgMywgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDYsCi0gIDYsICA3LCAgNywgIDgsICA4LCAgOSwgIDksIDEwLAotIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwKLSAxNCwgMTUsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsCi0gMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LAotIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwKLSAzNywKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAzLCAgMywKKyAgICAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgMywgIDMsCisgICAgIDMsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA1LAorICAgICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwKKyAgICAgNywgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDgsCisgICAgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDExLAorICAgIDExLCAxMSwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNiwgMTYsCisgICAgMTcsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLAorICAgIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLAorICAgICAzLCAgMywgIDQsICA0LCAgNCwgIDUsICA1LCAgNiwKKyAgICAgNiwgIDcsICA3LCAgOCwgIDgsICA5LCAgOSwgMTAsCisgICAgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDE0LAorICAgIDE0LCAxNSwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwKKyAgICAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsCisgICAgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM2LAorICAgIDM3LAogfTsKIAogLyogc2Vjb25kIG5vbiBpbnRyYSB2bGMgdGFibGUgKi8KIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0YWJsZTRfdmxjWzE2OV1bMl0gPSB7Ci17ICAgIDB4MCwgIDMgfSx7ICAgIDB4MywgIDQgfSx7ICAgIDB4YiwgIDUgfSx7ICAgMHgxNCwgIDYgfSwKLXsgICAweDNmLCAgNiB9LHsgICAweDVkLCAgNyB9LHsgICAweGEyLCAgOCB9LHsgICAweGFjLCAgOSB9LAoteyAgMHgxNmUsICA5IH0seyAgMHgyMGEsIDEwIH0seyAgMHgyZTIsIDEwIH0seyAgMHg0MzIsIDExIH0sCi17ICAweDVjOSwgMTEgfSx7ICAweDgyNywgMTIgfSx7ICAweGI1NCwgMTIgfSx7ICAweDRlNiwgMTMgfSwKLXsgMHgxMDVmLCAxMyB9LHsgMHgxNzJhLCAxMyB9LHsgMHgyMGIyLCAxNCB9LHsgMHgyZDRlLCAxNCB9LAoteyAweDM5ZjAsIDE0IH0seyAweDQxNzUsIDE1IH0seyAweDVhOWUsIDE1IH0seyAgICAweDQsICA0IH0sCi17ICAgMHgxZSwgIDUgfSx7ICAgMHg0MiwgIDcgfSx7ICAgMHhiNiwgIDggfSx7ICAweDE3MywgIDkgfSwKLXsgIDB4Mzk1LCAxMCB9LHsgIDB4NzJlLCAxMSB9LHsgIDB4Yjk0LCAxMiB9LHsgMHgxNmE0LCAxMyB9LAoteyAweDIwYjMsIDE0IH0seyAweDJlNDUsIDE0IH0seyAgICAweDUsICA1IH0seyAgIDB4NDAsICA3IH0sCi17ICAgMHg0OSwgIDkgfSx7ICAweDI4ZiwgMTAgfSx7ICAweDVjYiwgMTEgfSx7ICAweDQ4YSwgMTMgfSwKLXsgIDB4OWRkLCAxNCB9LHsgMHg3M2UyLCAxNSB9LHsgICAweDE4LCAgNSB9LHsgICAweDI1LCAgOCB9LAoteyAgIDB4OGEsIDEwIH0seyAgMHg1MWIsIDExIH0seyAgMHhlNWYsIDEyIH0seyAgMHg5YzksIDE0IH0sCi17IDB4MTM5YywgMTUgfSx7ICAgMHgyOSwgIDYgfSx7ICAgMHg0ZiwgIDkgfSx7ICAweDQxMiwgMTEgfSwKLXsgIDB4NDhkLCAxMyB9LHsgMHgyZTQxLCAxNCB9LHsgICAweDM4LCAgNiB9LHsgIDB4MTBlLCAgOSB9LAoteyAgMHg1YTgsIDExIH0seyAweDEwNWMsIDEzIH0seyAweDM5ZjIsIDE0IH0seyAgIDB4NTgsICA3IH0sCi17ICAweDIxZiwgMTAgfSx7ICAweGU3ZSwgMTIgfSx7IDB4MzlmZiwgMTQgfSx7ICAgMHgyMywgIDggfSwKLXsgIDB4MmUzLCAxMCB9LHsgIDB4NGU1LCAxMyB9LHsgMHgyZTQwLCAxNCB9LHsgICAweGExLCAgOCB9LAoteyAgMHg1YmUsIDExIH0seyAgMHg5YzgsIDE0IH0seyAgIDB4ODMsICA4IH0seyAgMHgxM2EsIDExIH0sCi17IDB4MTcyMSwgMTMgfSx7ICAgMHg0NCwgIDkgfSx7ICAweDI3NiwgMTIgfSx7IDB4MzlmNiwgMTQgfSwKLXsgICAweDhiLCAxMCB9LHsgIDB4NGVmLCAxMyB9LHsgMHg1YTliLCAxNSB9LHsgIDB4MjA4LCAxMCB9LAoteyAweDFjZmUsIDEzIH0seyAgMHgzOTksIDEwIH0seyAweDFjYjQsIDEzIH0seyAgMHgzOWUsIDEwIH0sCi17IDB4MzlmMywgMTQgfSx7ICAweDVhYiwgMTEgfSx7IDB4NzNlMywgMTUgfSx7ICAweDczNywgMTEgfSwKLXsgMHg1YTlmLCAxNSB9LHsgIDB4ODJkLCAxMiB9LHsgIDB4ZTY5LCAxMiB9LHsgIDB4ZTY4LCAxMiB9LAoteyAgMHg0MzMsIDExIH0seyAgMHhiN2IsIDEyIH0seyAweDJkZjgsIDE0IH0seyAweDJlNTYsIDE0IH0sCi17IDB4MmU1NywgMTQgfSx7IDB4MzlmNywgMTQgfSx7IDB4NTFhNSwgMTUgfSx7ICAgIDB4MywgIDMgfSwKLXsgICAweDJhLCAgNiB9LHsgICAweGU0LCAgOCB9LHsgIDB4MjhlLCAxMCB9LHsgIDB4NzM1LCAxMSB9LAoteyAweDEwNTgsIDEzIH0seyAweDFjZmEsIDEzIH0seyAweDJkZjksIDE0IH0seyAweDQxNzQsIDE1IH0sCi17ICAgIDB4OSwgIDQgfSx7ICAgMHg1NCwgIDggfSx7ICAweDM5OCwgMTAgfSx7ICAweDQ4YiwgMTMgfSwKLXsgMHgxMzlkLCAxNSB9LHsgICAgMHhkLCAgNCB9LHsgICAweGFkLCAgOSB9LHsgIDB4ODI2LCAxMiB9LAoteyAweDJkNGMsIDE0IH0seyAgIDB4MTEsICA1IH0seyAgMHgxNmIsICA5IH0seyAgMHhiN2YsIDEyIH0sCi17IDB4NTFhNCwgMTUgfSx7ICAgMHgxOSwgIDUgfSx7ICAweDIxYiwgMTAgfSx7IDB4MTZmZCwgMTMgfSwKLXsgICAweDFkLCAgNSB9LHsgIDB4Mzk0LCAxMCB9LHsgMHgyOGQzLCAxNCB9LHsgICAweDJiLCAgNiB9LAoteyAgMHg1YmMsIDExIH0seyAweDVhOWEsIDE1IH0seyAgIDB4MmYsICA2IH0seyAgMHgyNDcsIDEyIH0sCi17ICAgMHgxMCwgIDcgfSx7ICAweGEzNSwgMTIgfSx7ICAgMHgzZSwgIDYgfSx7ICAweGI3YSwgMTIgfSwKLXsgICAweDU5LCAgNyB9LHsgMHgxMDVlLCAxMyB9LHsgICAweDI2LCAgOCB9LHsgIDB4OWNmLCAxNCB9LAoteyAgIDB4NTUsICA4IH0seyAweDFjYjUsIDEzIH0seyAgIDB4NTcsICA4IH0seyAgMHhlNWIsIDEyIH0sCi17ICAgMHhhMCwgIDggfSx7IDB4MTQ2OCwgMTMgfSx7ICAweDE3MCwgIDkgfSx7ICAgMHg5MCwgMTAgfSwKLXsgIDB4MWNlLCAgOSB9LHsgIDB4MjFhLCAxMCB9LHsgIDB4MjE4LCAxMCB9LHsgIDB4MTY4LCAgOSB9LAoteyAgMHgyMWUsIDEwIH0seyAgMHgyNDQsIDEyIH0seyAgMHg3MzYsIDExIH0seyAgMHgxMzgsIDExIH0sCi17ICAweDUxOSwgMTEgfSx7ICAweGU1ZSwgMTIgfSx7ICAweDcyYywgMTEgfSx7ICAweGI1NSwgMTIgfSwKLXsgIDB4OWRjLCAxNCB9LHsgMHgyMGJiLCAxNCB9LHsgIDB4NDhjLCAxMyB9LHsgMHgxNzIzLCAxMyB9LAoteyAweDJlNDQsIDE0IH0seyAweDE2YTUsIDEzIH0seyAgMHg1MTgsIDExIH0seyAweDM5ZmUsIDE0IH0sCi17ICAweDE2OSwgIDkgfSwKKyAgICB7ICAgIDB4MCwgIDMgfSwgeyAgICAweDMsICA0IH0sIHsgICAgMHhiLCAgNSB9LCB7ICAgMHgxNCwgIDYgfSwKKyAgICB7ICAgMHgzZiwgIDYgfSwgeyAgIDB4NWQsICA3IH0sIHsgICAweGEyLCAgOCB9LCB7ICAgMHhhYywgIDkgfSwKKyAgICB7ICAweDE2ZSwgIDkgfSwgeyAgMHgyMGEsIDEwIH0sIHsgIDB4MmUyLCAxMCB9LCB7ICAweDQzMiwgMTEgfSwKKyAgICB7ICAweDVjOSwgMTEgfSwgeyAgMHg4MjcsIDEyIH0sIHsgIDB4YjU0LCAxMiB9LCB7ICAweDRlNiwgMTMgfSwKKyAgICB7IDB4MTA1ZiwgMTMgfSwgeyAweDE3MmEsIDEzIH0sIHsgMHgyMGIyLCAxNCB9LCB7IDB4MmQ0ZSwgMTQgfSwKKyAgICB7IDB4MzlmMCwgMTQgfSwgeyAweDQxNzUsIDE1IH0sIHsgMHg1YTllLCAxNSB9LCB7ICAgIDB4NCwgIDQgfSwKKyAgICB7ICAgMHgxZSwgIDUgfSwgeyAgIDB4NDIsICA3IH0sIHsgICAweGI2LCAgOCB9LCB7ICAweDE3MywgIDkgfSwKKyAgICB7ICAweDM5NSwgMTAgfSwgeyAgMHg3MmUsIDExIH0sIHsgIDB4Yjk0LCAxMiB9LCB7IDB4MTZhNCwgMTMgfSwKKyAgICB7IDB4MjBiMywgMTQgfSwgeyAweDJlNDUsIDE0IH0sIHsgICAgMHg1LCAgNSB9LCB7ICAgMHg0MCwgIDcgfSwKKyAgICB7ICAgMHg0OSwgIDkgfSwgeyAgMHgyOGYsIDEwIH0sIHsgIDB4NWNiLCAxMSB9LCB7ICAweDQ4YSwgMTMgfSwKKyAgICB7ICAweDlkZCwgMTQgfSwgeyAweDczZTIsIDE1IH0sIHsgICAweDE4LCAgNSB9LCB7ICAgMHgyNSwgIDggfSwKKyAgICB7ICAgMHg4YSwgMTAgfSwgeyAgMHg1MWIsIDExIH0sIHsgIDB4ZTVmLCAxMiB9LCB7ICAweDljOSwgMTQgfSwKKyAgICB7IDB4MTM5YywgMTUgfSwgeyAgIDB4MjksICA2IH0sIHsgICAweDRmLCAgOSB9LCB7ICAweDQxMiwgMTEgfSwKKyAgICB7ICAweDQ4ZCwgMTMgfSwgeyAweDJlNDEsIDE0IH0sIHsgICAweDM4LCAgNiB9LCB7ICAweDEwZSwgIDkgfSwKKyAgICB7ICAweDVhOCwgMTEgfSwgeyAweDEwNWMsIDEzIH0sIHsgMHgzOWYyLCAxNCB9LCB7ICAgMHg1OCwgIDcgfSwKKyAgICB7ICAweDIxZiwgMTAgfSwgeyAgMHhlN2UsIDEyIH0sIHsgMHgzOWZmLCAxNCB9LCB7ICAgMHgyMywgIDggfSwKKyAgICB7ICAweDJlMywgMTAgfSwgeyAgMHg0ZTUsIDEzIH0sIHsgMHgyZTQwLCAxNCB9LCB7ICAgMHhhMSwgIDggfSwKKyAgICB7ICAweDViZSwgMTEgfSwgeyAgMHg5YzgsIDE0IH0sIHsgICAweDgzLCAgOCB9LCB7ICAweDEzYSwgMTEgfSwKKyAgICB7IDB4MTcyMSwgMTMgfSwgeyAgIDB4NDQsICA5IH0sIHsgIDB4Mjc2LCAxMiB9LCB7IDB4MzlmNiwgMTQgfSwKKyAgICB7ICAgMHg4YiwgMTAgfSwgeyAgMHg0ZWYsIDEzIH0sIHsgMHg1YTliLCAxNSB9LCB7ICAweDIwOCwgMTAgfSwKKyAgICB7IDB4MWNmZSwgMTMgfSwgeyAgMHgzOTksIDEwIH0sIHsgMHgxY2I0LCAxMyB9LCB7ICAweDM5ZSwgMTAgfSwKKyAgICB7IDB4MzlmMywgMTQgfSwgeyAgMHg1YWIsIDExIH0sIHsgMHg3M2UzLCAxNSB9LCB7ICAweDczNywgMTEgfSwKKyAgICB7IDB4NWE5ZiwgMTUgfSwgeyAgMHg4MmQsIDEyIH0sIHsgIDB4ZTY5LCAxMiB9LCB7ICAweGU2OCwgMTIgfSwKKyAgICB7ICAweDQzMywgMTEgfSwgeyAgMHhiN2IsIDEyIH0sIHsgMHgyZGY4LCAxNCB9LCB7IDB4MmU1NiwgMTQgfSwKKyAgICB7IDB4MmU1NywgMTQgfSwgeyAweDM5ZjcsIDE0IH0sIHsgMHg1MWE1LCAxNSB9LCB7ICAgIDB4MywgIDMgfSwKKyAgICB7ICAgMHgyYSwgIDYgfSwgeyAgIDB4ZTQsICA4IH0sIHsgIDB4MjhlLCAxMCB9LCB7ICAweDczNSwgMTEgfSwKKyAgICB7IDB4MTA1OCwgMTMgfSwgeyAweDFjZmEsIDEzIH0sIHsgMHgyZGY5LCAxNCB9LCB7IDB4NDE3NCwgMTUgfSwKKyAgICB7ICAgIDB4OSwgIDQgfSwgeyAgIDB4NTQsICA4IH0sIHsgIDB4Mzk4LCAxMCB9LCB7ICAweDQ4YiwgMTMgfSwKKyAgICB7IDB4MTM5ZCwgMTUgfSwgeyAgICAweGQsICA0IH0sIHsgICAweGFkLCAgOSB9LCB7ICAweDgyNiwgMTIgfSwKKyAgICB7IDB4MmQ0YywgMTQgfSwgeyAgIDB4MTEsICA1IH0sIHsgIDB4MTZiLCAgOSB9LCB7ICAweGI3ZiwgMTIgfSwKKyAgICB7IDB4NTFhNCwgMTUgfSwgeyAgIDB4MTksICA1IH0sIHsgIDB4MjFiLCAxMCB9LCB7IDB4MTZmZCwgMTMgfSwKKyAgICB7ICAgMHgxZCwgIDUgfSwgeyAgMHgzOTQsIDEwIH0sIHsgMHgyOGQzLCAxNCB9LCB7ICAgMHgyYiwgIDYgfSwKKyAgICB7ICAweDViYywgMTEgfSwgeyAweDVhOWEsIDE1IH0sIHsgICAweDJmLCAgNiB9LCB7ICAweDI0NywgMTIgfSwKKyAgICB7ICAgMHgxMCwgIDcgfSwgeyAgMHhhMzUsIDEyIH0sIHsgICAweDNlLCAgNiB9LCB7ICAweGI3YSwgMTIgfSwKKyAgICB7ICAgMHg1OSwgIDcgfSwgeyAweDEwNWUsIDEzIH0sIHsgICAweDI2LCAgOCB9LCB7ICAweDljZiwgMTQgfSwKKyAgICB7ICAgMHg1NSwgIDggfSwgeyAweDFjYjUsIDEzIH0sIHsgICAweDU3LCAgOCB9LCB7ICAweGU1YiwgMTIgfSwKKyAgICB7ICAgMHhhMCwgIDggfSwgeyAweDE0NjgsIDEzIH0sIHsgIDB4MTcwLCAgOSB9LCB7ICAgMHg5MCwgMTAgfSwKKyAgICB7ICAweDFjZSwgIDkgfSwgeyAgMHgyMWEsIDEwIH0sIHsgIDB4MjE4LCAxMCB9LCB7ICAweDE2OCwgIDkgfSwKKyAgICB7ICAweDIxZSwgMTAgfSwgeyAgMHgyNDQsIDEyIH0sIHsgIDB4NzM2LCAxMSB9LCB7ICAweDEzOCwgMTEgfSwKKyAgICB7ICAweDUxOSwgMTEgfSwgeyAgMHhlNWUsIDEyIH0sIHsgIDB4NzJjLCAxMSB9LCB7ICAweGI1NSwgMTIgfSwKKyAgICB7ICAweDlkYywgMTQgfSwgeyAweDIwYmIsIDE0IH0sIHsgIDB4NDhjLCAxMyB9LCB7IDB4MTcyMywgMTMgfSwKKyAgICB7IDB4MmU0NCwgMTQgfSwgeyAweDE2YTUsIDEzIH0sIHsgIDB4NTE4LCAxMSB9LCB7IDB4MzlmZSwgMTQgfSwKKyAgICB7ICAweDE2OSwgIDkgfSwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQ4X3QgdGFibGU0X2xldmVsWzE2OF0gPSB7Ci0gIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAotICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKLSAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgIDEsCi0gIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LAotIDEwLCAxMSwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwKLSAgNywgIDgsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsCi0gIDcsICAxLCAgMiwgIDMsICA0LCAgNSwgIDEsICAyLAotICAzLCAgNCwgIDUsICAxLCAgMiwgIDMsICA0LCAgMSwKLSAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgMSwgIDIsCi0gIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLAotICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwKLSAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gIDEsICAxLCAgMSwgIDEsICAyLCAgMywgIDQsICA1LAotICA2LCAgNywgIDgsICA5LCAgMSwgIDIsICAzLCAgNCwKLSAgNSwgIDEsICAyLCAgMywgIDQsICAxLCAgMiwgIDMsCi0gIDQsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLAotICAyLCAgMywgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKLSAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsCi0gIDEsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAotICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKLSAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorICAgICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgIDEsCisgICAgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LAorICAgIDEwLCAxMSwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwKKyAgICAgNywgIDgsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsCisgICAgIDcsICAxLCAgMiwgIDMsICA0LCAgNSwgIDEsICAyLAorICAgICAzLCAgNCwgIDUsICAxLCAgMiwgIDMsICA0LCAgMSwKKyAgICAgMiwgIDMsICA0LCAgMSwgIDIsICAzLCAgMSwgIDIsCisgICAgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLAorICAgICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwKKyAgICAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMSwgIDEsICAyLCAgMywgIDQsICA1LAorICAgICA2LCAgNywgIDgsICA5LCAgMSwgIDIsICAzLCAgNCwKKyAgICAgNSwgIDEsICAyLCAgMywgIDQsICAxLCAgMiwgIDMsCisgICAgIDQsICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLAorICAgICAyLCAgMywgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwKKyAgICAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsCisgICAgIDEsICAyLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCiB9OwogCiBzdGF0aWMgY29uc3QgaW50OF90IHRhYmxlNF9ydW5bMTY4XSA9IHsKLSAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwKLSAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCi0gIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAotICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICAzLCAgMywKLSAgMywgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsCi0gIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LAotICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwKLSAgOSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsCi0gMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE2LAotIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKLSAyNCwgMjUsIDI2LCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLAotICAxLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywKLSAgMywgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsCi0gIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LAotIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywKLSAxNCwgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsCi0gMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LAotIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDIsICAyLAorICAgICAyLCAgMiwgIDMsICAzLCAgMywgIDMsICAzLCAgMywKKyAgICAgMywgIDQsICA0LCAgNCwgIDQsICA0LCAgNSwgIDUsCisgICAgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LAorICAgICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA5LCAgOSwKKyAgICAgOSwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTIsCisgICAgMTIsIDEzLCAxMywgMTQsIDE0LCAxNSwgMTUsIDE2LAorICAgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKKyAgICAyNCwgMjUsIDI2LCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMiwgIDIsICAyLCAgMiwgIDMsICAzLCAgMywKKyAgICAgMywgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsCisgICAgIDYsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LAorICAgIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsCisgICAgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LAorICAgIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwKIH07CiAKIFJMVGFibGUgZmZfcmxfdGFibGVbTkJfUkxfVEFCTEVTXSA9IHsKICAgICAvKiBpbnRyYSBsdW1pbmFuY2UgdGFibGVzICovCiAgICAgLyogbG93IG1vdGlvbiAgKi8KLSAgICB7Ci0gICAgICAgIDEzMiwKLSAgICAgICAgODUsCi0gICAgICAgIHRhYmxlMF92bGMsCi0gICAgICAgIHRhYmxlMF9ydW4sCi0gICAgICAgIHRhYmxlMF9sZXZlbCwKLSAgICB9LAorICAgIHsgMTMyLAorICAgICAgODUsCisgICAgICB0YWJsZTBfdmxjLAorICAgICAgdGFibGUwX3J1biwKKyAgICAgIHRhYmxlMF9sZXZlbCwgfSwKICAgICAvKiBoaWdoIG1vdGlvbiAqLwotICAgIHsKLSAgICAgICAgMTg1LAotICAgICAgICAxMTksCi0gICAgICAgIHRhYmxlMl92bGMsCi0gICAgICAgIHRhYmxlMl9ydW4sCi0gICAgICAgIHRhYmxlMl9sZXZlbCwKLSAgICB9LAorICAgIHsgMTg1LAorICAgICAgMTE5LAorICAgICAgdGFibGUyX3ZsYywKKyAgICAgIHRhYmxlMl9ydW4sCisgICAgICB0YWJsZTJfbGV2ZWwsIH0sCiAgICAgLyogbWlkLXJhdGUgKi8KLSAgICB7Ci0gICAgICAgIDEwMiwKLSAgICAgICAgNjcsCi0gICAgICAgIGZmX21wZWc0X2ludHJhX3ZsYywKLSAgICAgICAgZmZfbXBlZzRfaW50cmFfcnVuLAotICAgICAgICBmZl9tcGVnNF9pbnRyYV9sZXZlbCwKLSAgICB9LAorICAgIHsgMTAyLAorICAgICAgNjcsCisgICAgICBmZl9tcGVnNF9pbnRyYV92bGMsCisgICAgICBmZl9tcGVnNF9pbnRyYV9ydW4sCisgICAgICBmZl9tcGVnNF9pbnRyYV9sZXZlbCwgfSwKICAgICAvKiBpbnRyYSBjaHJvbWluYW5jZSAvIG5vbiBpbnRyYSB0YWJsZXMgKi8KICAgICAvKiBsb3cgbW90aW9uIGludGVyICovCi0gICAgewotICAgICAgICAxNDgsCi0gICAgICAgIDgxLAotICAgICAgICB0YWJsZTFfdmxjLAotICAgICAgICB0YWJsZTFfcnVuLAotICAgICAgICB0YWJsZTFfbGV2ZWwsCi0gICAgfSwKKyAgICB7IDE0OCwKKyAgICAgIDgxLAorICAgICAgdGFibGUxX3ZsYywKKyAgICAgIHRhYmxlMV9ydW4sCisgICAgICB0YWJsZTFfbGV2ZWwsIH0sCiAgICAgLyogaGlnaCBtb3Rpb24gaW50ZXIgKi8KLSAgICB7Ci0gICAgICAgIDE2OCwKLSAgICAgICAgOTksCi0gICAgICAgIHRhYmxlNF92bGMsCi0gICAgICAgIHRhYmxlNF9ydW4sCi0gICAgICAgIHRhYmxlNF9sZXZlbCwKLSAgICB9LAorICAgIHsgMTY4LAorICAgICAgOTksCisgICAgICB0YWJsZTRfdmxjLAorICAgICAgdGFibGU0X3J1biwKKyAgICAgIHRhYmxlNF9sZXZlbCwgfSwKICAgICAvKiBtaWQgcmF0ZSBpbnRlciAqLwotICAgIHsKLSAgICAgICAgMTAyLAotICAgICAgICA1OCwKLSAgICAgICAgZmZfaW50ZXJfdmxjLAotICAgICAgICBmZl9pbnRlcl9ydW4sCi0gICAgICAgIGZmX2ludGVyX2xldmVsLAotICAgIH0sCisgICAgeyAxMDIsCisgICAgICA1OCwKKyAgICAgIGZmX2ludGVyX3ZsYywKKyAgICAgIGZmX2ludGVyX3J1biwKKyAgICAgIGZmX2ludGVyX2xldmVsLCB9LAogfTsKIAogLyogbW90aW9uIHZlY3RvciB0YWJsZSAwICovCiAKIHN0YXRpYyBjb25zdCB1aW50MTZfdCB0YWJsZTBfbXZfY29kZVsxMTAwXSA9IHsKLSAweDAwMDEsIDB4MDAwMywgMHgwMDA1LCAweDAwMDcsIDB4MDAwMywgMHgwMDA4LCAweDAwMGMsIDB4MDAwMSwKLSAweDAwMDIsIDB4MDAxYiwgMHgwMDA2LCAweDAwMGIsIDB4MDAxNSwgMHgwMDAyLCAweDAwMGUsIDB4MDAwZiwKLSAweDAwMTQsIDB4MDAyMCwgMHgwMDIyLCAweDAwMjUsIDB4MDAyNywgMHgwMDI5LCAweDAwMmQsIDB4MDA0YiwKLSAweDAwNGQsIDB4MDAwMywgMHgwMDIyLCAweDAwMjMsIDB4MDAyNSwgMHgwMDI3LCAweDAwNDIsIDB4MDA0OCwKLSAweDAwNDksIDB4MDA1MCwgMHgwMDVjLCAweDAwOTEsIDB4MDA5ZiwgMHgwMDBlLCAweDAwNDMsIDB4MDA0YywKLSAweDAwNTQsIDB4MDA1NiwgMHgwMDhjLCAweDAwOTgsIDB4MDA5YSwgMHgwMDliLCAweDAwYjEsIDB4MDBiMiwKLSAweDAxMjAsIDB4MDEyMSwgMHgwMTI2LCAweDAxMzMsIDB4MDEzOSwgMHgwMWExLCAweDAxYTQsIDB4MDFhNSwKLSAweDAxYTYsIDB4MDFhNywgMHgwMWFlLCAweDAxYWYsIDB4MDAwYiwgMHgwMDE5LCAweDAwODUsIDB4MDA5MCwKLSAweDAwOWIsIDB4MDBhYSwgMHgwMGFmLCAweDAxMGMsIDB4MDEwZSwgMHgwMTFjLCAweDAxMWUsIDB4MDEzMywKLSAweDAxNDQsIDB4MDE2MCwgMHgwMTc0LCAweDAxNzUsIDB4MDE3NywgMHgwMTc4LCAweDAyNDksIDB4MDI0YiwKLSAweDAyNTIsIDB4MDI2MSwgMHgwMjY1LCAweDAyNzAsIDB4MDM1MiwgMHgwMzUzLCAweDAzNTUsIDB4MDM1OSwKLSAweDAwMTAsIDB4MDAxMSwgMHgwMDEzLCAweDAwMzQsIDB4MDAzNSwgMHgwMDM2LCAweDAwMzcsIDB4MDAzZCwKLSAweDAwM2UsIDB4MDEwOSwgMHgwMTI2LCAweDAxNTYsIDB4MDIxYSwgMHgwMjFlLCAweDAyM2EsIDB4MDIzZSwKLSAweDAyOGUsIDB4MDI4ZiwgMHgwMmNmLCAweDA0OTEsIDB4MDQ5NCwgMHgwNDlmLCAweDA0YTAsIDB4MDRhMywKLSAweDA0YTYsIDB4MDRhNywgMHgwNGFkLCAweDA0YWUsIDB4MDRjMCwgMHgwNGM0LCAweDA0YzYsIDB4MDRjOCwKLSAweDA0YzksIDB4MDRmNSwgMHgwNGY2LCAweDA0ZjcsIDB4MDY4MCwgMHgwNjgyLCAweDA2ODMsIDB4MDY4OCwKLSAweDA2ODksIDB4MDY4ZCwgMHgwNjhlLCAweDA2OGYsIDB4MDZhMiwgMHgwNmEzLCAweDA2YTksIDB4MDZiMCwKLSAweDA2YjEsIDB4MDZiNCwgMHgwNmI1LCAweDAwMjQsIDB4MDA2MCwgMHgwMDYzLCAweDAwNzgsIDB4MDA3OSwKLSAweDAyMTEsIDB4MDI0NCwgMHgwMjQ1LCAweDAyNDcsIDB4MDI0OCwgMHgwMjQ5LCAweDAyNGEsIDB4MDI0YiwKLSAweDAyNmIsIDB4MDJhZiwgMHgwMmI4LCAweDAyYmIsIDB4MDQzNiwgMHgwNDc2LCAweDA0NzcsIDB4MDQ3ZSwKLSAweDA0YzgsIDB4MDRjOSwgMHgwNGNhLCAweDA1MTQsIDB4MDU4NiwgMHgwNTg3LCAweDA1OTgsIDB4MDU5ZCwKLSAweDA1ZDksIDB4MDVkYSwgMHgwOTIwLCAweDA5MjEsIDB4MDkzYiwgMHgwOTNjLCAweDA5M2QsIDB4MDk0MiwKLSAweDA5NDMsIDB4MDk0NCwgMHgwOTQ1LCAweDA5NTksIDB4MDk1ZSwgMHgwOTVmLCAweDA5ODIsIDB4MDk4MywKLSAweDA5OGUsIDB4MDk4ZiwgMHgwOWM0LCAweDA5ZTcsIDB4MDllOCwgMHgwOWU5LCAweDBkMDIsIDB4MGQxNywKLSAweDBkMTgsIDB4MGQxOSwgMHgwZDQxLCAweDBkNDIsIDB4MGQ0MywgMHgwZDUwLCAweDBkNWYsIDB4MGQ2ZCwKLSAweDBkNmUsIDB4MGQ2ZiwgMHgwMDUyLCAweDAwNTMsIDB4MDA1NCwgMHgwMDU1LCAweDAwNTYsIDB4MDA1NywKLSAweDAwYzIsIDB4MDBjMywgMHgwMGM0LCAweDAwYzUsIDB4MDQxZSwgMHgwNDFmLCAweDA0MjAsIDB4MDQyMSwKLSAweDA0OGMsIDB4MDQ4ZCwgMHgwNGQzLCAweDA0ZDQsIDB4MDRkNSwgMHgwNTVjLCAweDA1NWQsIDB4MDU3MiwKLSAweDA1NzMsIDB4MDU3NCwgMHgwNTc1LCAweDA4ZGUsIDB4MDhkZiwgMHgwOGZlLCAweDA4ZmYsIDB4MDk5NiwKLSAweDBhMzYsIDB4MGEzNywgMHgwYjA4LCAweDBiMDksIDB4MGIwYSwgMHgwYjBiLCAweDBiMzIsIDB4MGIzMywKLSAweDBiMzQsIDB4MGIzNSwgMHgwYjM2LCAweDBiMzcsIDB4MGIzOCwgMHgwYjM5LCAweDBiYjAsIDB4MGJmNywKLSAweDBiZjgsIDB4MGJmOSwgMHgwYmZhLCAweDBiZmIsIDB4MGJmYywgMHgwYmZkLCAweDBiZmUsIDB4MGJmZiwKLSAweDEyNTQsIDB4MTI1NSwgMHgxMjU2LCAweDEyNTcsIDB4MTI3MCwgMHgxMjcxLCAweDEyNzIsIDB4MTI3MywKLSAweDEyNzQsIDB4MTI3NSwgMHgxMmFiLCAweDEyYWMsIDB4MTJhZCwgMHgxMmFlLCAweDEyYWYsIDB4MTJiMCwKLSAweDEyYjEsIDB4MTMxNSwgMHgxMzE2LCAweDEzMTcsIDB4MTNiZiwgMHgxM2MwLCAweDEzYzEsIDB4MTNjMiwKLSAweDEzYzMsIDB4MTNjNCwgMHgxM2M1LCAweDEzYzYsIDB4MTNjNywgMHgxM2M4LCAweDEzYzksIDB4MTNjYSwKLSAweDEzY2IsIDB4MTNjYywgMHgxM2NkLCAweDFhMDYsIDB4MWEwNywgMHgxYTI4LCAweDFhMjksIDB4MWEyYSwKLSAweDFhMmIsIDB4MWEyYywgMHgxYTJkLCAweDFhODAsIDB4MWFiYiwgMHgxYWJjLCAweDFhYmQsIDB4MWFkOCwKLSAweDFhZDksIDB4MDA5NCwgMHgwMDk1LCAweDAwOTYsIDB4MDA5NywgMHgwMGEwLCAweDAwYTEsIDB4MDBhMiwKLSAweDAwYTMsIDB4MDgzMSwgMHgwODMyLCAweDA4MzMsIDB4MDgzNCwgMHgwODM1LCAweDA4MzYsIDB4MDgzNywKLSAweDA4MzgsIDB4MDgzOSwgMHgwODNhLCAweDA4M2IsIDB4MDkzOSwgMHgwOTNhLCAweDA5M2IsIDB4MDkzYywKLSAweDA5M2QsIDB4MDkzZSwgMHgwOTNmLCAweDA5YTAsIDB4MDlhMSwgMHgwOWEyLCAweDA5YTMsIDB4MDlhNCwKLSAweDA5YTUsIDB4MTFhYywgMHgxMWFkLCAweDExYWUsIDB4MTFhZiwgMHgxMWIwLCAweDExYjEsIDB4MTFiMiwKLSAweDExYjMsIDB4MTFiNCwgMHgxMWI1LCAweDExYjYsIDB4MTFiNywgMHgxMWI4LCAweDExYjksIDB4MTFiYSwKLSAweDExYmIsIDB4MTMyZiwgMHgxNDU0LCAweDE0NTUsIDB4MTQ1NiwgMHgxNDU3LCAweDE0NTgsIDB4MTQ1OSwKLSAweDE0NWEsIDB4MTQ1YiwgMHgxNDVjLCAweDE0NWQsIDB4MTQ1ZSwgMHgxNDVmLCAweDE0NjAsIDB4MTQ2MSwKLSAweDE0NjIsIDB4MTQ2MywgMHgxNDY0LCAweDE0NjUsIDB4MTQ2NiwgMHgxNDY3LCAweDE0NjgsIDB4MTQ2OSwKLSAweDE0NmEsIDB4MTQ2YiwgMHgxN2RlLCAweDE3ZGYsIDB4MTdlMCwgMHgxN2UxLCAweDE3ZTIsIDB4MTdlMywKLSAweDE3ZTQsIDB4MTdlNSwgMHgxN2U2LCAweDE3ZTcsIDB4MTdlOCwgMHgxN2U5LCAweDE3ZWEsIDB4MTdlYiwKLSAweDE3ZWMsIDB4MTdlZCwgMHgyNTQwLCAweDI1NDEsIDB4MjU0MiwgMHgyNTQzLCAweDI1NDQsIDB4MjU0NSwKLSAweDI1NDYsIDB4MjU0NywgMHgyNTQ4LCAweDI1NDksIDB4MjU0YSwgMHgyNTRiLCAweDI1NGMsIDB4MjU0ZCwKLSAweDI1NGUsIDB4MjU0ZiwgMHgyNTUwLCAweDI1NTEsIDB4MjU1MiwgMHgyNTUzLCAweDI1NTQsIDB4MjU1NSwKLSAweDI2MjgsIDB4Mjc2NiwgMHgyNzY3LCAweDI3NjgsIDB4Mjc2OSwgMHgyNzZhLCAweDI3NmIsIDB4Mjc2YywKLSAweDI3NmQsIDB4Mjc2ZSwgMHgyNzZmLCAweDI3NzAsIDB4Mjc3MSwgMHgyNzcyLCAweDI3NzMsIDB4Mjc3NCwKLSAweDI3NzUsIDB4Mjc3NiwgMHgyNzc3LCAweDI3NzgsIDB4Mjc3OSwgMHgyNzdhLCAweDI3N2IsIDB4Mjc3YywKLSAweDI3N2QsIDB4MzUwMywgMHgzNTQ0LCAweDM1NDUsIDB4MzU0NiwgMHgzNTQ3LCAweDM1NjAsIDB4MzU2MSwKLSAweDM1NjIsIDB4MzU2MywgMHgzNTY0LCAweDM1NjUsIDB4MzU2NiwgMHgzNTY3LCAweDM1NjgsIDB4MzU2OSwKLSAweDM1NmEsIDB4MzU2YiwgMHgzNTZjLCAweDM1NmQsIDB4MzU2ZSwgMHgzNTZmLCAweDM1NzAsIDB4MzU3MSwKLSAweDM1NzIsIDB4MzU3MywgMHgzNTc0LCAweDM1NzUsIDB4MDNmMCwgMHgxMDNkLCAweDEwM2UsIDB4MTAzZiwKLSAweDEwNDAsIDB4MTA0MSwgMHgxMDQyLCAweDEwNDMsIDB4MTA0NCwgMHgxMDQ1LCAweDEwNDYsIDB4MTA0NywKLSAweDEwNDgsIDB4MTA0OSwgMHgxMDRhLCAweDEwNGIsIDB4MTA0YywgMHgxMDRkLCAweDEwNGUsIDB4MTA0ZiwKLSAweDEwNTAsIDB4MTA1MSwgMHgxMDUyLCAweDEwNTMsIDB4MTA1NCwgMHgxMDU1LCAweDEwNTYsIDB4MTA1NywKLSAweDEwNTgsIDB4MTA1OSwgMHgxMDVhLCAweDEwNWIsIDB4MTA1YywgMHgxMDVkLCAweDEwNWUsIDB4MTA1ZiwKLSAweDEwNjAsIDB4MTA2MSwgMHgxMjcwLCAweDEyNzEsIDB4MjFiOCwgMHgyMWI5LCAweDIxYmEsIDB4MjFiYiwKLSAweDIxYmMsIDB4MjFiZCwgMHgyMWJlLCAweDIxYmYsIDB4MjFmMCwgMHgyMWYxLCAweDIxZjIsIDB4MjFmMywKLSAweDIxZjQsIDB4MjFmNSwgMHgyMWY2LCAweDIxZjcsIDB4MjFmOCwgMHgyMWY5LCAweDIxZmEsIDB4MjFmYiwKLSAweDIxZmMsIDB4MjFmZCwgMHgyMWZlLCAweDIxZmYsIDB4MjM0MCwgMHgyMzQxLCAweDIzNDIsIDB4MjM0MywKLSAweDIzNDQsIDB4MjM0NSwgMHgyMzQ2LCAweDIzNDcsIDB4MjM0OCwgMHgyMzQ5LCAweDIzNGEsIDB4MjM0YiwKLSAweDIzNGMsIDB4MjM0ZCwgMHgyMzRlLCAweDIzNGYsIDB4MjM1MCwgMHgyMzUxLCAweDIzNTIsIDB4MjM1MywKLSAweDIzNTQsIDB4MjM1NSwgMHgyMzU2LCAweDIzNTcsIDB4MjY1YywgMHgyZjg4LCAweDJmODksIDB4MmY4YSwKLSAweDJmOGIsIDB4MmY4YywgMHgyZjhkLCAweDJmOGUsIDB4MmY4ZiwgMHgyZjkwLCAweDJmOTEsIDB4MmY5MiwKLSAweDJmOTMsIDB4MmY5NCwgMHgyZjk1LCAweDJmOTYsIDB4MmY5NywgMHgyZjk4LCAweDJmOTksIDB4MmY5YSwKLSAweDJmOWIsIDB4MmY5YywgMHgyZjlkLCAweDJmOWUsIDB4MmY5ZiwgMHgyZmEwLCAweDJmYTEsIDB4MmZhMiwKLSAweDJmYTMsIDB4MmZhNCwgMHgyZmE1LCAweDJmYTYsIDB4MmZhNywgMHgyZmE4LCAweDJmYTksIDB4MmZhYSwKLSAweDJmYWIsIDB4MmZhYywgMHgyZmFkLCAweDJmYWUsIDB4MmZhZiwgMHgyZmIwLCAweDJmYjEsIDB4MmZiMiwKLSAweDJmYjMsIDB4MmZiNCwgMHgyZmI1LCAweDJmYjYsIDB4MmZiNywgMHgyZmI4LCAweDJmYjksIDB4MmZiYSwKLSAweDJmYmIsIDB4NGM1MiwgMHg0YzUzLCAweDRlMjgsIDB4NGUyOSwgMHg0ZTJhLCAweDRlMmIsIDB4NGUyYywKLSAweDRlMmQsIDB4NGUyZSwgMHg0ZTJmLCAweDRlMzAsIDB4NGUzMSwgMHg0ZTMyLCAweDRlMzMsIDB4NGUzNCwKLSAweDRlMzUsIDB4NGUzNiwgMHg0ZTM3LCAweDRlMzgsIDB4NGUzOSwgMHg0ZTNhLCAweDRlM2IsIDB4NGUzYywKLSAweDRlM2QsIDB4NGUzZSwgMHg0ZTNmLCAweDRlODAsIDB4NGU4MSwgMHg0ZTgyLCAweDRlODMsIDB4NGU4NCwKLSAweDRlODUsIDB4NGU4NiwgMHg0ZTg3LCAweDRlODgsIDB4NGU4OSwgMHg0ZThhLCAweDRlOGIsIDB4NGU4YywKLSAweDRlOGQsIDB4NGU4ZSwgMHg0ZThmLCAweDRlOTAsIDB4NGU5MSwgMHg0ZTkyLCAweDRlOTMsIDB4NGU5NCwKLSAweDRlOTUsIDB4NGU5NiwgMHg0ZTk3LCAweDRlOTgsIDB4NGU5OSwgMHg0ZTlhLCAweDRlOWIsIDB4NGU5YywKLSAweDRlOWQsIDB4NGU5ZSwgMHg0ZTlmLCAweDRlYTAsIDB4NGVhMSwgMHg0ZWEyLCAweDRlYTMsIDB4NGVhNCwKLSAweDRlYTUsIDB4NGVhNiwgMHg0ZWE3LCAweDRlYTgsIDB4NGVhOSwgMHg0ZWFhLCAweDRlYWIsIDB4NGVhYywKLSAweDRlYWQsIDB4NGVhZSwgMHg0ZWFmLCAweDRlYjAsIDB4NGViMSwgMHg0ZWIyLCAweDRlYjMsIDB4NGViNCwKLSAweDRlYjUsIDB4NGViNiwgMHg0ZWI3LCAweDRlYjgsIDB4NGViOSwgMHg0ZWJhLCAweDRlYmIsIDB4NGViYywKLSAweDRlYmQsIDB4NGViZSwgMHg0ZWJmLCAweDRlYzAsIDB4NGVjMSwgMHg0ZWMyLCAweDRlYzMsIDB4NGVjNCwKLSAweDRlYzUsIDB4NGVjNiwgMHg0ZWM3LCAweDRlYzgsIDB4NGVjOSwgMHg0ZWNhLCAweDRlY2IsIDB4NmEwNCwKLSAweDZhMDUsIDB4MDdlMiwgMHgwN2UzLCAweDA3ZTQsIDB4MDdlNSwgMHgwN2U2LCAweDA3ZTcsIDB4MDdlOCwKLSAweDA3ZTksIDB4MDdlYSwgMHgwN2ViLCAweDA3ZWMsIDB4MDdlZCwgMHgwN2VlLCAweDA3ZWYsIDB4MDdmMCwKLSAweDA3ZjEsIDB4MDdmMiwgMHgwN2YzLCAweDA3ZjQsIDB4MDdmNSwgMHgwN2Y2LCAweDA3ZjcsIDB4MDdmOCwKLSAweDA3ZjksIDB4MDdmYSwgMHgwN2ZiLCAweDA3ZmMsIDB4MDdmZCwgMHgwN2ZlLCAweDA3ZmYsIDB4MjAwMCwKLSAweDIwMDEsIDB4MjAwMiwgMHgyMDAzLCAweDIwMDQsIDB4MjAwNSwgMHgyMDA2LCAweDIwMDcsIDB4MjAwOCwKLSAweDIwMDksIDB4MjAwYSwgMHgyMDBiLCAweDIwMGMsIDB4MjAwZCwgMHgyMDBlLCAweDIwMGYsIDB4MjAxMCwKLSAweDIwMTEsIDB4MjAxMiwgMHgyMDEzLCAweDIwMTQsIDB4MjAxNSwgMHgyMDE2LCAweDIwMTcsIDB4MjAxOCwKLSAweDIwMTksIDB4MjAxYSwgMHgyMDFiLCAweDIwMWMsIDB4MjAxZCwgMHgyMDFlLCAweDIwMWYsIDB4MjAyMCwKLSAweDIwMjEsIDB4MjAyMiwgMHgyMDIzLCAweDIwMjQsIDB4MjAyNSwgMHgyMDI2LCAweDIwMjcsIDB4MjAyOCwKLSAweDIwMjksIDB4MjAyYSwgMHgyMDJiLCAweDIwMmMsIDB4MjAyZCwgMHgyMDJlLCAweDIwMmYsIDB4MjAzMCwKLSAweDIwMzEsIDB4MjAzMiwgMHgyMDMzLCAweDIwMzQsIDB4MjAzNSwgMHgyMDM2LCAweDIwMzcsIDB4MjAzOCwKLSAweDIwMzksIDB4MjAzYSwgMHgyMDNiLCAweDIwM2MsIDB4MjAzZCwgMHgyMDNlLCAweDIwM2YsIDB4MjA0MCwKLSAweDIwNDEsIDB4MjA0MiwgMHgyMDQzLCAweDIwNDQsIDB4MjA0NSwgMHgyMDQ2LCAweDIwNDcsIDB4MjA0OCwKLSAweDIwNDksIDB4MjA0YSwgMHgyMDRiLCAweDIwNGMsIDB4MjA0ZCwgMHgyMDRlLCAweDIwNGYsIDB4MjA1MCwKLSAweDIwNTEsIDB4MjA1MiwgMHgyMDUzLCAweDIwNTQsIDB4MjA1NSwgMHgyMDU2LCAweDIwNTcsIDB4MjA1OCwKLSAweDIwNTksIDB4MjA1YSwgMHgyMDViLCAweDIwNWMsIDB4MjA1ZCwgMHgyMDVlLCAweDIwNWYsIDB4MjA2MCwKLSAweDIwNjEsIDB4MjA2MiwgMHgyMDYzLCAweDIwNjQsIDB4MjA2NSwgMHgyMDY2LCAweDIwNjcsIDB4MjA2OCwKLSAweDIwNjksIDB4MjA2YSwgMHgyMDZiLCAweDIwNmMsIDB4MjA2ZCwgMHgyMDZlLCAweDIwNmYsIDB4MjA3MCwKLSAweDIwNzEsIDB4MjA3MiwgMHgyMDczLCAweDIwNzQsIDB4MjA3NSwgMHgyMDc2LCAweDIwNzcsIDB4MjA3OCwKLSAweDIwNzksIDB4NGNiYSwgMHg0Y2JiLCAweDVkODgsIDB4NWQ4OSwgMHg1ZDhhLCAweDVkOGIsIDB4NWQ4YywKLSAweDVkOGQsIDB4NWQ4ZSwgMHg1ZDhmLCAweDVkYjAsIDB4NWRiMSwgMHg1ZGIyLCAweDVkYjMsIDB4NWRiNCwKLSAweDVkYjUsIDB4NWRiNiwgMHg1ZGI3LCAweDVkYjgsIDB4NWRiOSwgMHg1ZGJhLCAweDVkYmIsIDB4NWRiYywKLSAweDVkYmQsIDB4NWRiZSwgMHg1ZGJmLCAweDVlNDAsIDB4NWU0MSwgMHg1ZTQyLCAweDVlNDMsIDB4NWU0NCwKLSAweDVlNDUsIDB4NWU0NiwgMHg1ZTQ3LCAweDVlNDgsIDB4NWU0OSwgMHg1ZTRhLCAweDVlNGIsIDB4NWU0YywKLSAweDVlNGQsIDB4NWU0ZSwgMHg1ZTRmLCAweDVlNTAsIDB4NWU1MSwgMHg1ZTUyLCAweDVlNTMsIDB4NWU1NCwKLSAweDVlNTUsIDB4NWU1NiwgMHg1ZTU3LCAweDVlNTgsIDB4NWU1OSwgMHg1ZTVhLCAweDVlNWIsIDB4NWU1YywKLSAweDVlNWQsIDB4NWU1ZSwgMHg1ZTVmLCAweDVlNjAsIDB4NWU2MSwgMHg1ZTYyLCAweDVlNjMsIDB4NWU2NCwKLSAweDVlNjUsIDB4NWU2NiwgMHg1ZTY3LCAweDVlNjgsIDB4NWU2OSwgMHg1ZTZhLCAweDVlNmIsIDB4NWU2YywKLSAweDVlNmQsIDB4NWU2ZSwgMHg1ZTZmLCAweDVlNzAsIDB4NWU3MSwgMHg1ZTcyLCAweDVlNzMsIDB4NWU3NCwKLSAweDVlNzUsIDB4NWU3NiwgMHg1ZTc3LCAweDVlNzgsIDB4NWU3OSwgMHg1ZTdhLCAweDVlN2IsIDB4NWU3YywKLSAweDVlN2QsIDB4NWU3ZSwgMHg1ZTdmLCAweDVlODAsIDB4NWU4MSwgMHg1ZTgyLCAweDVlODMsIDB4NWU4NCwKLSAweDVlODUsIDB4NWU4NiwgMHg1ZTg3LCAweDVlODgsIDB4NWU4OSwgMHg1ZThhLCAweDVlOGIsIDB4NWU4YywKLSAweDVlOGQsIDB4NWU4ZSwgMHg1ZThmLCAweDVlOTAsIDB4NWU5MSwgMHg1ZTkyLCAweDVlOTMsIDB4NWU5NCwKLSAweDVlOTUsIDB4NWU5NiwgMHg1ZTk3LCAweDVlOTgsIDB4NWU5OSwgMHg1ZTlhLCAweDVlOWIsIDB4NWU5YywKLSAweDVlOWQsIDB4NWU5ZSwgMHg1ZTlmLCAweDVlYTAsIDB4NWVhMSwgMHg1ZWEyLCAweDVlYTMsIDB4NWVhNCwKLSAweDVlYTUsIDB4NWVhNiwgMHg1ZWE3LCAweDVlYTgsIDB4NWVhOSwgMHg1ZWFhLCAweDVlYWIsIDB4NWVhYywKLSAweDVlYWQsIDB4NWVhZSwgMHg1ZWFmLCAweDVlYjAsIDB4NWViMSwgMHg1ZWIyLCAweDVlYjMsIDB4NWViNCwKLSAweDVlYjUsIDB4NWViNiwgMHg1ZWI3LCAweDVlYjgsIDB4NWViOSwgMHg1ZWJhLCAweDVlYmIsIDB4NWViYywKLSAweDVlYmQsIDB4NWViZSwgMHg1ZWJmLCAweDVlYzAsIDB4NWVjMSwgMHg1ZWMyLCAweDVlYzMsIDB4NWVjNCwKLSAweDVlYzUsIDB4NWVjNiwgMHg1ZWM3LCAweDVlYzgsIDB4NWVjOSwgMHg1ZWNhLCAweDVlY2IsIDB4NWVjYywKLSAweDVlY2QsIDB4NWVjZSwgMHg1ZWNmLCAweDVlZDAsIDB4NWVkMSwgMHg1ZWQyLCAweDVlZDMsIDB4NWVkNCwKLSAweDVlZDUsIDB4NWVkNiwgMHg1ZWQ3LCAweDVlZDgsIDB4NWVkOSwgMHg1ZWRhLCAweDVlZGIsIDB4NWVkYywKLSAweDVlZGQsIDB4NWVkZSwgMHg1ZWRmLCAweDVlZTAsIDB4NWVlMSwgMHg1ZWUyLCAweDVlZTMsIDB4NWVlNCwKLSAweDVlZTUsIDB4NWVlNiwgMHg1ZWU3LCAweDVlZTgsIDB4NWVlOSwgMHg1ZWVhLCAweDVlZWIsIDB4NWVlYywKLSAweDVlZWQsIDB4NWVlZSwgMHg1ZWVmLCAweDVlZjAsIDB4NWVmMSwgMHg1ZWYyLCAweDVlZjMsIDB4NWVmNCwKLSAweDVlZjUsIDB4NWVmNiwgMHg1ZWY3LCAweDVlZjgsIDB4NWVmOSwgMHg1ZWZhLCAweDVlZmIsIDB4NWVmYywKLSAweDVlZmQsIDB4NWVmZSwgMHg1ZWZmLCAweDVmMDAsIDB4NWYwMSwgMHg1ZjAyLCAweDVmMDMsIDB4NWYwNCwKLSAweDVmMDUsIDB4NWYwNiwgMHg1ZjA3LCAweDVmMDgsIDB4NWYwOSwgMHg1ZjBhLCAweDVmMGIsIDB4NWYwYywKLSAweDVmMGQsIDB4NWYwZSwgMHg1ZjBmLCAweDAwMDAsCisgICAgMHgwMDAxLCAweDAwMDMsIDB4MDAwNSwgMHgwMDA3LCAweDAwMDMsIDB4MDAwOCwgMHgwMDBjLCAweDAwMDEsCisgICAgMHgwMDAyLCAweDAwMWIsIDB4MDAwNiwgMHgwMDBiLCAweDAwMTUsIDB4MDAwMiwgMHgwMDBlLCAweDAwMGYsCisgICAgMHgwMDE0LCAweDAwMjAsIDB4MDAyMiwgMHgwMDI1LCAweDAwMjcsIDB4MDAyOSwgMHgwMDJkLCAweDAwNGIsCisgICAgMHgwMDRkLCAweDAwMDMsIDB4MDAyMiwgMHgwMDIzLCAweDAwMjUsIDB4MDAyNywgMHgwMDQyLCAweDAwNDgsCisgICAgMHgwMDQ5LCAweDAwNTAsIDB4MDA1YywgMHgwMDkxLCAweDAwOWYsIDB4MDAwZSwgMHgwMDQzLCAweDAwNGMsCisgICAgMHgwMDU0LCAweDAwNTYsIDB4MDA4YywgMHgwMDk4LCAweDAwOWEsIDB4MDA5YiwgMHgwMGIxLCAweDAwYjIsCisgICAgMHgwMTIwLCAweDAxMjEsIDB4MDEyNiwgMHgwMTMzLCAweDAxMzksIDB4MDFhMSwgMHgwMWE0LCAweDAxYTUsCisgICAgMHgwMWE2LCAweDAxYTcsIDB4MDFhZSwgMHgwMWFmLCAweDAwMGIsIDB4MDAxOSwgMHgwMDg1LCAweDAwOTAsCisgICAgMHgwMDliLCAweDAwYWEsIDB4MDBhZiwgMHgwMTBjLCAweDAxMGUsIDB4MDExYywgMHgwMTFlLCAweDAxMzMsCisgICAgMHgwMTQ0LCAweDAxNjAsIDB4MDE3NCwgMHgwMTc1LCAweDAxNzcsIDB4MDE3OCwgMHgwMjQ5LCAweDAyNGIsCisgICAgMHgwMjUyLCAweDAyNjEsIDB4MDI2NSwgMHgwMjcwLCAweDAzNTIsIDB4MDM1MywgMHgwMzU1LCAweDAzNTksCisgICAgMHgwMDEwLCAweDAwMTEsIDB4MDAxMywgMHgwMDM0LCAweDAwMzUsIDB4MDAzNiwgMHgwMDM3LCAweDAwM2QsCisgICAgMHgwMDNlLCAweDAxMDksIDB4MDEyNiwgMHgwMTU2LCAweDAyMWEsIDB4MDIxZSwgMHgwMjNhLCAweDAyM2UsCisgICAgMHgwMjhlLCAweDAyOGYsIDB4MDJjZiwgMHgwNDkxLCAweDA0OTQsIDB4MDQ5ZiwgMHgwNGEwLCAweDA0YTMsCisgICAgMHgwNGE2LCAweDA0YTcsIDB4MDRhZCwgMHgwNGFlLCAweDA0YzAsIDB4MDRjNCwgMHgwNGM2LCAweDA0YzgsCisgICAgMHgwNGM5LCAweDA0ZjUsIDB4MDRmNiwgMHgwNGY3LCAweDA2ODAsIDB4MDY4MiwgMHgwNjgzLCAweDA2ODgsCisgICAgMHgwNjg5LCAweDA2OGQsIDB4MDY4ZSwgMHgwNjhmLCAweDA2YTIsIDB4MDZhMywgMHgwNmE5LCAweDA2YjAsCisgICAgMHgwNmIxLCAweDA2YjQsIDB4MDZiNSwgMHgwMDI0LCAweDAwNjAsIDB4MDA2MywgMHgwMDc4LCAweDAwNzksCisgICAgMHgwMjExLCAweDAyNDQsIDB4MDI0NSwgMHgwMjQ3LCAweDAyNDgsIDB4MDI0OSwgMHgwMjRhLCAweDAyNGIsCisgICAgMHgwMjZiLCAweDAyYWYsIDB4MDJiOCwgMHgwMmJiLCAweDA0MzYsIDB4MDQ3NiwgMHgwNDc3LCAweDA0N2UsCisgICAgMHgwNGM4LCAweDA0YzksIDB4MDRjYSwgMHgwNTE0LCAweDA1ODYsIDB4MDU4NywgMHgwNTk4LCAweDA1OWQsCisgICAgMHgwNWQ5LCAweDA1ZGEsIDB4MDkyMCwgMHgwOTIxLCAweDA5M2IsIDB4MDkzYywgMHgwOTNkLCAweDA5NDIsCisgICAgMHgwOTQzLCAweDA5NDQsIDB4MDk0NSwgMHgwOTU5LCAweDA5NWUsIDB4MDk1ZiwgMHgwOTgyLCAweDA5ODMsCisgICAgMHgwOThlLCAweDA5OGYsIDB4MDljNCwgMHgwOWU3LCAweDA5ZTgsIDB4MDllOSwgMHgwZDAyLCAweDBkMTcsCisgICAgMHgwZDE4LCAweDBkMTksIDB4MGQ0MSwgMHgwZDQyLCAweDBkNDMsIDB4MGQ1MCwgMHgwZDVmLCAweDBkNmQsCisgICAgMHgwZDZlLCAweDBkNmYsIDB4MDA1MiwgMHgwMDUzLCAweDAwNTQsIDB4MDA1NSwgMHgwMDU2LCAweDAwNTcsCisgICAgMHgwMGMyLCAweDAwYzMsIDB4MDBjNCwgMHgwMGM1LCAweDA0MWUsIDB4MDQxZiwgMHgwNDIwLCAweDA0MjEsCisgICAgMHgwNDhjLCAweDA0OGQsIDB4MDRkMywgMHgwNGQ0LCAweDA0ZDUsIDB4MDU1YywgMHgwNTVkLCAweDA1NzIsCisgICAgMHgwNTczLCAweDA1NzQsIDB4MDU3NSwgMHgwOGRlLCAweDA4ZGYsIDB4MDhmZSwgMHgwOGZmLCAweDA5OTYsCisgICAgMHgwYTM2LCAweDBhMzcsIDB4MGIwOCwgMHgwYjA5LCAweDBiMGEsIDB4MGIwYiwgMHgwYjMyLCAweDBiMzMsCisgICAgMHgwYjM0LCAweDBiMzUsIDB4MGIzNiwgMHgwYjM3LCAweDBiMzgsIDB4MGIzOSwgMHgwYmIwLCAweDBiZjcsCisgICAgMHgwYmY4LCAweDBiZjksIDB4MGJmYSwgMHgwYmZiLCAweDBiZmMsIDB4MGJmZCwgMHgwYmZlLCAweDBiZmYsCisgICAgMHgxMjU0LCAweDEyNTUsIDB4MTI1NiwgMHgxMjU3LCAweDEyNzAsIDB4MTI3MSwgMHgxMjcyLCAweDEyNzMsCisgICAgMHgxMjc0LCAweDEyNzUsIDB4MTJhYiwgMHgxMmFjLCAweDEyYWQsIDB4MTJhZSwgMHgxMmFmLCAweDEyYjAsCisgICAgMHgxMmIxLCAweDEzMTUsIDB4MTMxNiwgMHgxMzE3LCAweDEzYmYsIDB4MTNjMCwgMHgxM2MxLCAweDEzYzIsCisgICAgMHgxM2MzLCAweDEzYzQsIDB4MTNjNSwgMHgxM2M2LCAweDEzYzcsIDB4MTNjOCwgMHgxM2M5LCAweDEzY2EsCisgICAgMHgxM2NiLCAweDEzY2MsIDB4MTNjZCwgMHgxYTA2LCAweDFhMDcsIDB4MWEyOCwgMHgxYTI5LCAweDFhMmEsCisgICAgMHgxYTJiLCAweDFhMmMsIDB4MWEyZCwgMHgxYTgwLCAweDFhYmIsIDB4MWFiYywgMHgxYWJkLCAweDFhZDgsCisgICAgMHgxYWQ5LCAweDAwOTQsIDB4MDA5NSwgMHgwMDk2LCAweDAwOTcsIDB4MDBhMCwgMHgwMGExLCAweDAwYTIsCisgICAgMHgwMGEzLCAweDA4MzEsIDB4MDgzMiwgMHgwODMzLCAweDA4MzQsIDB4MDgzNSwgMHgwODM2LCAweDA4MzcsCisgICAgMHgwODM4LCAweDA4MzksIDB4MDgzYSwgMHgwODNiLCAweDA5MzksIDB4MDkzYSwgMHgwOTNiLCAweDA5M2MsCisgICAgMHgwOTNkLCAweDA5M2UsIDB4MDkzZiwgMHgwOWEwLCAweDA5YTEsIDB4MDlhMiwgMHgwOWEzLCAweDA5YTQsCisgICAgMHgwOWE1LCAweDExYWMsIDB4MTFhZCwgMHgxMWFlLCAweDExYWYsIDB4MTFiMCwgMHgxMWIxLCAweDExYjIsCisgICAgMHgxMWIzLCAweDExYjQsIDB4MTFiNSwgMHgxMWI2LCAweDExYjcsIDB4MTFiOCwgMHgxMWI5LCAweDExYmEsCisgICAgMHgxMWJiLCAweDEzMmYsIDB4MTQ1NCwgMHgxNDU1LCAweDE0NTYsIDB4MTQ1NywgMHgxNDU4LCAweDE0NTksCisgICAgMHgxNDVhLCAweDE0NWIsIDB4MTQ1YywgMHgxNDVkLCAweDE0NWUsIDB4MTQ1ZiwgMHgxNDYwLCAweDE0NjEsCisgICAgMHgxNDYyLCAweDE0NjMsIDB4MTQ2NCwgMHgxNDY1LCAweDE0NjYsIDB4MTQ2NywgMHgxNDY4LCAweDE0NjksCisgICAgMHgxNDZhLCAweDE0NmIsIDB4MTdkZSwgMHgxN2RmLCAweDE3ZTAsIDB4MTdlMSwgMHgxN2UyLCAweDE3ZTMsCisgICAgMHgxN2U0LCAweDE3ZTUsIDB4MTdlNiwgMHgxN2U3LCAweDE3ZTgsIDB4MTdlOSwgMHgxN2VhLCAweDE3ZWIsCisgICAgMHgxN2VjLCAweDE3ZWQsIDB4MjU0MCwgMHgyNTQxLCAweDI1NDIsIDB4MjU0MywgMHgyNTQ0LCAweDI1NDUsCisgICAgMHgyNTQ2LCAweDI1NDcsIDB4MjU0OCwgMHgyNTQ5LCAweDI1NGEsIDB4MjU0YiwgMHgyNTRjLCAweDI1NGQsCisgICAgMHgyNTRlLCAweDI1NGYsIDB4MjU1MCwgMHgyNTUxLCAweDI1NTIsIDB4MjU1MywgMHgyNTU0LCAweDI1NTUsCisgICAgMHgyNjI4LCAweDI3NjYsIDB4Mjc2NywgMHgyNzY4LCAweDI3NjksIDB4Mjc2YSwgMHgyNzZiLCAweDI3NmMsCisgICAgMHgyNzZkLCAweDI3NmUsIDB4Mjc2ZiwgMHgyNzcwLCAweDI3NzEsIDB4Mjc3MiwgMHgyNzczLCAweDI3NzQsCisgICAgMHgyNzc1LCAweDI3NzYsIDB4Mjc3NywgMHgyNzc4LCAweDI3NzksIDB4Mjc3YSwgMHgyNzdiLCAweDI3N2MsCisgICAgMHgyNzdkLCAweDM1MDMsIDB4MzU0NCwgMHgzNTQ1LCAweDM1NDYsIDB4MzU0NywgMHgzNTYwLCAweDM1NjEsCisgICAgMHgzNTYyLCAweDM1NjMsIDB4MzU2NCwgMHgzNTY1LCAweDM1NjYsIDB4MzU2NywgMHgzNTY4LCAweDM1NjksCisgICAgMHgzNTZhLCAweDM1NmIsIDB4MzU2YywgMHgzNTZkLCAweDM1NmUsIDB4MzU2ZiwgMHgzNTcwLCAweDM1NzEsCisgICAgMHgzNTcyLCAweDM1NzMsIDB4MzU3NCwgMHgzNTc1LCAweDAzZjAsIDB4MTAzZCwgMHgxMDNlLCAweDEwM2YsCisgICAgMHgxMDQwLCAweDEwNDEsIDB4MTA0MiwgMHgxMDQzLCAweDEwNDQsIDB4MTA0NSwgMHgxMDQ2LCAweDEwNDcsCisgICAgMHgxMDQ4LCAweDEwNDksIDB4MTA0YSwgMHgxMDRiLCAweDEwNGMsIDB4MTA0ZCwgMHgxMDRlLCAweDEwNGYsCisgICAgMHgxMDUwLCAweDEwNTEsIDB4MTA1MiwgMHgxMDUzLCAweDEwNTQsIDB4MTA1NSwgMHgxMDU2LCAweDEwNTcsCisgICAgMHgxMDU4LCAweDEwNTksIDB4MTA1YSwgMHgxMDViLCAweDEwNWMsIDB4MTA1ZCwgMHgxMDVlLCAweDEwNWYsCisgICAgMHgxMDYwLCAweDEwNjEsIDB4MTI3MCwgMHgxMjcxLCAweDIxYjgsIDB4MjFiOSwgMHgyMWJhLCAweDIxYmIsCisgICAgMHgyMWJjLCAweDIxYmQsIDB4MjFiZSwgMHgyMWJmLCAweDIxZjAsIDB4MjFmMSwgMHgyMWYyLCAweDIxZjMsCisgICAgMHgyMWY0LCAweDIxZjUsIDB4MjFmNiwgMHgyMWY3LCAweDIxZjgsIDB4MjFmOSwgMHgyMWZhLCAweDIxZmIsCisgICAgMHgyMWZjLCAweDIxZmQsIDB4MjFmZSwgMHgyMWZmLCAweDIzNDAsIDB4MjM0MSwgMHgyMzQyLCAweDIzNDMsCisgICAgMHgyMzQ0LCAweDIzNDUsIDB4MjM0NiwgMHgyMzQ3LCAweDIzNDgsIDB4MjM0OSwgMHgyMzRhLCAweDIzNGIsCisgICAgMHgyMzRjLCAweDIzNGQsIDB4MjM0ZSwgMHgyMzRmLCAweDIzNTAsIDB4MjM1MSwgMHgyMzUyLCAweDIzNTMsCisgICAgMHgyMzU0LCAweDIzNTUsIDB4MjM1NiwgMHgyMzU3LCAweDI2NWMsIDB4MmY4OCwgMHgyZjg5LCAweDJmOGEsCisgICAgMHgyZjhiLCAweDJmOGMsIDB4MmY4ZCwgMHgyZjhlLCAweDJmOGYsIDB4MmY5MCwgMHgyZjkxLCAweDJmOTIsCisgICAgMHgyZjkzLCAweDJmOTQsIDB4MmY5NSwgMHgyZjk2LCAweDJmOTcsIDB4MmY5OCwgMHgyZjk5LCAweDJmOWEsCisgICAgMHgyZjliLCAweDJmOWMsIDB4MmY5ZCwgMHgyZjllLCAweDJmOWYsIDB4MmZhMCwgMHgyZmExLCAweDJmYTIsCisgICAgMHgyZmEzLCAweDJmYTQsIDB4MmZhNSwgMHgyZmE2LCAweDJmYTcsIDB4MmZhOCwgMHgyZmE5LCAweDJmYWEsCisgICAgMHgyZmFiLCAweDJmYWMsIDB4MmZhZCwgMHgyZmFlLCAweDJmYWYsIDB4MmZiMCwgMHgyZmIxLCAweDJmYjIsCisgICAgMHgyZmIzLCAweDJmYjQsIDB4MmZiNSwgMHgyZmI2LCAweDJmYjcsIDB4MmZiOCwgMHgyZmI5LCAweDJmYmEsCisgICAgMHgyZmJiLCAweDRjNTIsIDB4NGM1MywgMHg0ZTI4LCAweDRlMjksIDB4NGUyYSwgMHg0ZTJiLCAweDRlMmMsCisgICAgMHg0ZTJkLCAweDRlMmUsIDB4NGUyZiwgMHg0ZTMwLCAweDRlMzEsIDB4NGUzMiwgMHg0ZTMzLCAweDRlMzQsCisgICAgMHg0ZTM1LCAweDRlMzYsIDB4NGUzNywgMHg0ZTM4LCAweDRlMzksIDB4NGUzYSwgMHg0ZTNiLCAweDRlM2MsCisgICAgMHg0ZTNkLCAweDRlM2UsIDB4NGUzZiwgMHg0ZTgwLCAweDRlODEsIDB4NGU4MiwgMHg0ZTgzLCAweDRlODQsCisgICAgMHg0ZTg1LCAweDRlODYsIDB4NGU4NywgMHg0ZTg4LCAweDRlODksIDB4NGU4YSwgMHg0ZThiLCAweDRlOGMsCisgICAgMHg0ZThkLCAweDRlOGUsIDB4NGU4ZiwgMHg0ZTkwLCAweDRlOTEsIDB4NGU5MiwgMHg0ZTkzLCAweDRlOTQsCisgICAgMHg0ZTk1LCAweDRlOTYsIDB4NGU5NywgMHg0ZTk4LCAweDRlOTksIDB4NGU5YSwgMHg0ZTliLCAweDRlOWMsCisgICAgMHg0ZTlkLCAweDRlOWUsIDB4NGU5ZiwgMHg0ZWEwLCAweDRlYTEsIDB4NGVhMiwgMHg0ZWEzLCAweDRlYTQsCisgICAgMHg0ZWE1LCAweDRlYTYsIDB4NGVhNywgMHg0ZWE4LCAweDRlYTksIDB4NGVhYSwgMHg0ZWFiLCAweDRlYWMsCisgICAgMHg0ZWFkLCAweDRlYWUsIDB4NGVhZiwgMHg0ZWIwLCAweDRlYjEsIDB4NGViMiwgMHg0ZWIzLCAweDRlYjQsCisgICAgMHg0ZWI1LCAweDRlYjYsIDB4NGViNywgMHg0ZWI4LCAweDRlYjksIDB4NGViYSwgMHg0ZWJiLCAweDRlYmMsCisgICAgMHg0ZWJkLCAweDRlYmUsIDB4NGViZiwgMHg0ZWMwLCAweDRlYzEsIDB4NGVjMiwgMHg0ZWMzLCAweDRlYzQsCisgICAgMHg0ZWM1LCAweDRlYzYsIDB4NGVjNywgMHg0ZWM4LCAweDRlYzksIDB4NGVjYSwgMHg0ZWNiLCAweDZhMDQsCisgICAgMHg2YTA1LCAweDA3ZTIsIDB4MDdlMywgMHgwN2U0LCAweDA3ZTUsIDB4MDdlNiwgMHgwN2U3LCAweDA3ZTgsCisgICAgMHgwN2U5LCAweDA3ZWEsIDB4MDdlYiwgMHgwN2VjLCAweDA3ZWQsIDB4MDdlZSwgMHgwN2VmLCAweDA3ZjAsCisgICAgMHgwN2YxLCAweDA3ZjIsIDB4MDdmMywgMHgwN2Y0LCAweDA3ZjUsIDB4MDdmNiwgMHgwN2Y3LCAweDA3ZjgsCisgICAgMHgwN2Y5LCAweDA3ZmEsIDB4MDdmYiwgMHgwN2ZjLCAweDA3ZmQsIDB4MDdmZSwgMHgwN2ZmLCAweDIwMDAsCisgICAgMHgyMDAxLCAweDIwMDIsIDB4MjAwMywgMHgyMDA0LCAweDIwMDUsIDB4MjAwNiwgMHgyMDA3LCAweDIwMDgsCisgICAgMHgyMDA5LCAweDIwMGEsIDB4MjAwYiwgMHgyMDBjLCAweDIwMGQsIDB4MjAwZSwgMHgyMDBmLCAweDIwMTAsCisgICAgMHgyMDExLCAweDIwMTIsIDB4MjAxMywgMHgyMDE0LCAweDIwMTUsIDB4MjAxNiwgMHgyMDE3LCAweDIwMTgsCisgICAgMHgyMDE5LCAweDIwMWEsIDB4MjAxYiwgMHgyMDFjLCAweDIwMWQsIDB4MjAxZSwgMHgyMDFmLCAweDIwMjAsCisgICAgMHgyMDIxLCAweDIwMjIsIDB4MjAyMywgMHgyMDI0LCAweDIwMjUsIDB4MjAyNiwgMHgyMDI3LCAweDIwMjgsCisgICAgMHgyMDI5LCAweDIwMmEsIDB4MjAyYiwgMHgyMDJjLCAweDIwMmQsIDB4MjAyZSwgMHgyMDJmLCAweDIwMzAsCisgICAgMHgyMDMxLCAweDIwMzIsIDB4MjAzMywgMHgyMDM0LCAweDIwMzUsIDB4MjAzNiwgMHgyMDM3LCAweDIwMzgsCisgICAgMHgyMDM5LCAweDIwM2EsIDB4MjAzYiwgMHgyMDNjLCAweDIwM2QsIDB4MjAzZSwgMHgyMDNmLCAweDIwNDAsCisgICAgMHgyMDQxLCAweDIwNDIsIDB4MjA0MywgMHgyMDQ0LCAweDIwNDUsIDB4MjA0NiwgMHgyMDQ3LCAweDIwNDgsCisgICAgMHgyMDQ5LCAweDIwNGEsIDB4MjA0YiwgMHgyMDRjLCAweDIwNGQsIDB4MjA0ZSwgMHgyMDRmLCAweDIwNTAsCisgICAgMHgyMDUxLCAweDIwNTIsIDB4MjA1MywgMHgyMDU0LCAweDIwNTUsIDB4MjA1NiwgMHgyMDU3LCAweDIwNTgsCisgICAgMHgyMDU5LCAweDIwNWEsIDB4MjA1YiwgMHgyMDVjLCAweDIwNWQsIDB4MjA1ZSwgMHgyMDVmLCAweDIwNjAsCisgICAgMHgyMDYxLCAweDIwNjIsIDB4MjA2MywgMHgyMDY0LCAweDIwNjUsIDB4MjA2NiwgMHgyMDY3LCAweDIwNjgsCisgICAgMHgyMDY5LCAweDIwNmEsIDB4MjA2YiwgMHgyMDZjLCAweDIwNmQsIDB4MjA2ZSwgMHgyMDZmLCAweDIwNzAsCisgICAgMHgyMDcxLCAweDIwNzIsIDB4MjA3MywgMHgyMDc0LCAweDIwNzUsIDB4MjA3NiwgMHgyMDc3LCAweDIwNzgsCisgICAgMHgyMDc5LCAweDRjYmEsIDB4NGNiYiwgMHg1ZDg4LCAweDVkODksIDB4NWQ4YSwgMHg1ZDhiLCAweDVkOGMsCisgICAgMHg1ZDhkLCAweDVkOGUsIDB4NWQ4ZiwgMHg1ZGIwLCAweDVkYjEsIDB4NWRiMiwgMHg1ZGIzLCAweDVkYjQsCisgICAgMHg1ZGI1LCAweDVkYjYsIDB4NWRiNywgMHg1ZGI4LCAweDVkYjksIDB4NWRiYSwgMHg1ZGJiLCAweDVkYmMsCisgICAgMHg1ZGJkLCAweDVkYmUsIDB4NWRiZiwgMHg1ZTQwLCAweDVlNDEsIDB4NWU0MiwgMHg1ZTQzLCAweDVlNDQsCisgICAgMHg1ZTQ1LCAweDVlNDYsIDB4NWU0NywgMHg1ZTQ4LCAweDVlNDksIDB4NWU0YSwgMHg1ZTRiLCAweDVlNGMsCisgICAgMHg1ZTRkLCAweDVlNGUsIDB4NWU0ZiwgMHg1ZTUwLCAweDVlNTEsIDB4NWU1MiwgMHg1ZTUzLCAweDVlNTQsCisgICAgMHg1ZTU1LCAweDVlNTYsIDB4NWU1NywgMHg1ZTU4LCAweDVlNTksIDB4NWU1YSwgMHg1ZTViLCAweDVlNWMsCisgICAgMHg1ZTVkLCAweDVlNWUsIDB4NWU1ZiwgMHg1ZTYwLCAweDVlNjEsIDB4NWU2MiwgMHg1ZTYzLCAweDVlNjQsCisgICAgMHg1ZTY1LCAweDVlNjYsIDB4NWU2NywgMHg1ZTY4LCAweDVlNjksIDB4NWU2YSwgMHg1ZTZiLCAweDVlNmMsCisgICAgMHg1ZTZkLCAweDVlNmUsIDB4NWU2ZiwgMHg1ZTcwLCAweDVlNzEsIDB4NWU3MiwgMHg1ZTczLCAweDVlNzQsCisgICAgMHg1ZTc1LCAweDVlNzYsIDB4NWU3NywgMHg1ZTc4LCAweDVlNzksIDB4NWU3YSwgMHg1ZTdiLCAweDVlN2MsCisgICAgMHg1ZTdkLCAweDVlN2UsIDB4NWU3ZiwgMHg1ZTgwLCAweDVlODEsIDB4NWU4MiwgMHg1ZTgzLCAweDVlODQsCisgICAgMHg1ZTg1LCAweDVlODYsIDB4NWU4NywgMHg1ZTg4LCAweDVlODksIDB4NWU4YSwgMHg1ZThiLCAweDVlOGMsCisgICAgMHg1ZThkLCAweDVlOGUsIDB4NWU4ZiwgMHg1ZTkwLCAweDVlOTEsIDB4NWU5MiwgMHg1ZTkzLCAweDVlOTQsCisgICAgMHg1ZTk1LCAweDVlOTYsIDB4NWU5NywgMHg1ZTk4LCAweDVlOTksIDB4NWU5YSwgMHg1ZTliLCAweDVlOWMsCisgICAgMHg1ZTlkLCAweDVlOWUsIDB4NWU5ZiwgMHg1ZWEwLCAweDVlYTEsIDB4NWVhMiwgMHg1ZWEzLCAweDVlYTQsCisgICAgMHg1ZWE1LCAweDVlYTYsIDB4NWVhNywgMHg1ZWE4LCAweDVlYTksIDB4NWVhYSwgMHg1ZWFiLCAweDVlYWMsCisgICAgMHg1ZWFkLCAweDVlYWUsIDB4NWVhZiwgMHg1ZWIwLCAweDVlYjEsIDB4NWViMiwgMHg1ZWIzLCAweDVlYjQsCisgICAgMHg1ZWI1LCAweDVlYjYsIDB4NWViNywgMHg1ZWI4LCAweDVlYjksIDB4NWViYSwgMHg1ZWJiLCAweDVlYmMsCisgICAgMHg1ZWJkLCAweDVlYmUsIDB4NWViZiwgMHg1ZWMwLCAweDVlYzEsIDB4NWVjMiwgMHg1ZWMzLCAweDVlYzQsCisgICAgMHg1ZWM1LCAweDVlYzYsIDB4NWVjNywgMHg1ZWM4LCAweDVlYzksIDB4NWVjYSwgMHg1ZWNiLCAweDVlY2MsCisgICAgMHg1ZWNkLCAweDVlY2UsIDB4NWVjZiwgMHg1ZWQwLCAweDVlZDEsIDB4NWVkMiwgMHg1ZWQzLCAweDVlZDQsCisgICAgMHg1ZWQ1LCAweDVlZDYsIDB4NWVkNywgMHg1ZWQ4LCAweDVlZDksIDB4NWVkYSwgMHg1ZWRiLCAweDVlZGMsCisgICAgMHg1ZWRkLCAweDVlZGUsIDB4NWVkZiwgMHg1ZWUwLCAweDVlZTEsIDB4NWVlMiwgMHg1ZWUzLCAweDVlZTQsCisgICAgMHg1ZWU1LCAweDVlZTYsIDB4NWVlNywgMHg1ZWU4LCAweDVlZTksIDB4NWVlYSwgMHg1ZWViLCAweDVlZWMsCisgICAgMHg1ZWVkLCAweDVlZWUsIDB4NWVlZiwgMHg1ZWYwLCAweDVlZjEsIDB4NWVmMiwgMHg1ZWYzLCAweDVlZjQsCisgICAgMHg1ZWY1LCAweDVlZjYsIDB4NWVmNywgMHg1ZWY4LCAweDVlZjksIDB4NWVmYSwgMHg1ZWZiLCAweDVlZmMsCisgICAgMHg1ZWZkLCAweDVlZmUsIDB4NWVmZiwgMHg1ZjAwLCAweDVmMDEsIDB4NWYwMiwgMHg1ZjAzLCAweDVmMDQsCisgICAgMHg1ZjA1LCAweDVmMDYsIDB4NWYwNywgMHg1ZjA4LCAweDVmMDksIDB4NWYwYSwgMHg1ZjBiLCAweDVmMGMsCisgICAgMHg1ZjBkLCAweDVmMGUsIDB4NWYwZiwgMHgwMDAwLAogfTsKIAogc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGUwX212X2JpdHNbMTEwMF0gPSB7Ci0gIDEsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LAotICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOCwKLSAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCi0gIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAotICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwKLSAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCi0gMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAotIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwKLSAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCi0gMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAotIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKLSAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0gMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAotIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKLSAxNiwgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCi0gMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAotIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKLSAxNywgMTcsIDE3LCAgOCwKKyAgICAgMSwgIDQsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsCisgICAgIDYsICA2LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywKKyAgICAxNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsCisgICAgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE3LAorICAgIDE3LCAxNywgMTcsICA4LAogfTsKIAogc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGUwX212eFsxMDk5XSA9IHsKLSAzMiwgMzIsIDMxLCAzMiwgMzMsIDMxLCAzMywgMzEsCi0gMzMsIDMyLCAzNCwgMzIsIDMwLCAzMiwgMzEsIDM0LAotIDM1LCAzMiwgMzQsIDMzLCAyOSwgMzMsIDMwLCAzMCwKLSAzMSwgMzEsIDM1LCAyOSwgMzMsIDM1LCAzMywgMzQsCi0gMzEsIDI5LCAzMCwgMzQsIDMwLCAzNiwgMjgsIDMyLAotIDM0LCAzNywgMzAsIDI3LCAzMiwgMjUsIDM5LCAzMiwKLSAzNCwgMzIsIDM1LCAzNSwgMzUsIDMxLCAzNSwgMjksCi0gMzIsIDI5LCAzMCwgMjksIDM3LCAyNywgMzYsIDM4LAotIDM3LCAzMywgMzIsIDMxLCAyOSwgMzEsIDI4LCAzNiwKLSAzMywgMzAsIDM0LCAzMywgMzMsIDI4LCAyNywgMjUsCi0gMzEsIDI2LCAzOSwgMzIsIDMyLCAzMSwgMzMsIDM5LAotIDMxLCAzOCwgMjgsIDM2LCAyMSwgMjMsIDQzLCAzNiwKLSAzNCwgNDEsIDMwLCAyNSwgMjgsIDMxLCAzMCwgMzQsCi0gMzgsIDM1LCA2MSwgMzQsIDI4LCAzMCwgMzcsIDM3LAotIDM1LCAyNywgMzYsICAzLCA1OSwgMzgsIDM3LCAzMiwKLSAzMSwgMjksIDI2LCAzMywgMzcsIDMzLCAyNywgMjcsCi0gMzUsIDM0LCAzNCwgNDAsIDQyLCAzMywgMzIsIDI5LAotICA0LCAgNSwgMjgsIDI0LCAyNSwgMzUsIDM5LCAzOCwKLSAzMiwgMjMsIDI3LCAzMiwgMzAsIDM1LCAyNiwgMzQsCi0gNjAsIDM2LCAyOSwgMjIsIDI2LCA0MSwgIDcsIDMwLAotIDM4LCAzMCwgMzYsIDI5LCAzMCwgNDEsIDI2LCAyNSwKLSAzMiwgMzQsIDI0LCAzOSwgIDEsIDI1LCAzOSwgMzIsCi0gMjgsIDI5LCAzMiwgMzgsIDI2LCAzNiwgMjgsIDYzLAotIDI4LCAzOSwgMjMsIDIxLCAyNiwgMzUsIDMxLCAzNSwKLSA1NywgMzEsIDI5LCAyOSwgMjgsIDMwLCAyNywgMzUsCi0gIDIsIDM4LCA0MCwgMzQsIDM3LCAyOSwgMzgsIDQzLAotIDI2LCAzMiwgMzMsIDQyLCAyNCwgNDAsIDI4LCAzMiwKLSAzMiwgMzIsIDM2LCAzMiwgNDMsIDI1LCAyMSwgMzEsCi0gMzAsIDMxLCA0MSwgMjksIDMzLCAzNywgMjYsIDM3LAotIDI3LCA1OSwgMjMsIDMzLCAzNSwgMzEsIDMxLCAzNywKLSAzOCwgMzksIDMyLCAyMywgMzIsIDI3LCAzNywgMzYsCi0gMzEsIDQwLCAyNSwgMjcsIDM4LCAzMSwgMzYsIDI4LAotIDMxLCAzNiwgMjUsIDQ1LCAgMywgMzQsIDM4LCAzOSwKLSA0MCwgMzgsIDMwLCAzMiwgMTksIDI0LCAyNSwgMjYsCi0gNDUsIDIwLCAyNCwgMzMsIDMzLCAzMSwgNDEsIDM0LAotIDM5LCA0NywgNDAsIDU4LCA1OSwgNDEsIDMzLCAgMywKLSAxNywgNjEsIDQyLCAzMCwgMjYsIDI5LCAzNiwgNjEsCi0gMzMsIDM3LCA2MiwgMjgsIDI1LCAzOCwgMjUsIDM4LAotIDE3LCAyMywgMzQsIDMzLCAyMSwgMzMsIDQ5LCAyNywKLSAzMiwgMjMsIDI3LCAyMiwgMjQsIDIyLCAzOSwgNDMsCi0gMjcsIDM3LCAgNiwgNDIsIDQ3LCAyNiwgMzAsIDMxLAotIDQxLCAzOSwgMzMsIDIyLCA0NSwgMzYsIDMyLCA0NSwKLSAxOSwgMjIsIDMwLCAgNSwgIDUsIDE3LCAyOSwgMjIsCi0gMzEsIDMxLCA0MywgMzcsIDI3LCAzMiwgMzIsIDMyLAotIDMzLCAzNCwgNDMsIDM1LCAyOSwgMjYsIDIyLCAzMiwKLSAxOSwgMzIsIDI1LCAzMSwgNDEsIDQ5LCAyOCwgMzQsCi0gMjgsIDM5LCAzNCwgMTksIDM3LCAzOCwgMjksIDIxLAotIDM2LCA0MiwgMjQsIDQ4LCAxNiwgMjgsIDQ5LCAyMiwKLSAzNCwgMzEsIDM4LCAzOSwgNDQsIDExLCAzNSwgMzAsCi0gMzMsIDMzLCAyMywgMjgsIDMzLCA0NiwgMTUsIDEzLAotIDI0LCA0MSwgMjQsIDM0LCAzNCwgMzAsIDI2LCAyNCwKLSAxNCwgNjAsIDIxLCAyOSwgMzksIDIzLCAzNSwgMzcsCi0gNjMsIDQ1LCAzMywgMzQsIDQ3LCA0MSwgMjIsIDQyLAotIDM1LCAzNSwgMjMsIDMyLCAzNSwgNDMsIDMyLCAgNywKLSAzMSwgNDEsIDIwLCAzMSwgMTYsIDEzLCA2MywgMjUsCi0gMzAsIDMyLCAzNSwgMzAsIDMwLCAzMSwgNDIsIDQ3LAotIDM5LCAzOCwgNDAsIDQwLCA1MSwgNTUsIDU2LCAxOCwKLSAyMSwgMzksIDM5LCAzMywgMTcsIDQxLCAyMywgMjQsCi0gNDMsIDI1LCAzMSwgMjAsIDE5LCA0NSwgIDEsIDM0LAotIDMxLCAyMiwgMzUsIDE1LCA0NiwgNDYsIDM1LCAzMSwKLSAyOCwgMjksIDI5LCAyMywgNDEsIDI3LCAxNCwgNTMsCi0gNTMsIDI3LCAyNCwgMzIsIDU3LCAzMiwgMTcsIDQyLAotIDM3LCAyOSwgMzMsICAxLCAyNSwgMzIsIDMyLCA2MywKLSAyNiwgNDAsIDQ0LCAzNiwgMzEsIDM5LCAyMCwgMjAsCi0gNDQsIDIzLCAzMywgMzQsIDM1LCAzMywgMzMsIDI4LAotIDQxLCAyMywgNDEsIDQxLCAyOSwgMjUsIDI2LCA0OSwKLSAyOSwgMjQsIDM3LCA0OSwgNTAsIDUxLCA1MSwgMjYsCi0gMzksIDI1LCAyNiwgMTUsIDM5LCAxOCwgNDIsIDE3LAotICA0LCAzMSwgMzIsIDMyLCA2MCwgIDEsIDQyLCAzMiwKLSAgMCwgMTIsIDE5LCAzNSwgMjEsIDQxLCAxNywgMjYsCi0gMjAsIDQ1LCA0NiwgMzIsIDM3LCAyMiwgNDcsIDI5LAotIDMxLCAyNywgMjksIDMwLCAyMSwgMzMsIDM1LCAxOCwKLSAyNSwgMzMsIDUwLCA1MSwgNDIsICAyLCAxNSwgNTEsCi0gNTMsIDMzLCAyNSwgMjksIDU1LCAzNywgMzgsIDMzLAotIDM4LCA1OSwgMzgsIDMzLCAzOSwgMTMsIDMyLCA0MCwKLSA2MSwgNjEsIDMyLCAgOSwgNDQsICAzLCAzMSwgMjksCi0gMjUsIDMxLCAyNywgMjMsICA5LCAyNSwgIDksIDI5LAotIDIwLCAzMCwgMzAsIDQyLCAxOCwgMjgsIDI1LCAyOCwKLSAyOCwgMjEsIDI5LCA0MywgMjksIDQzLCAyNiwgNDQsCi0gNDQsIDIxLCAzOCwgMjEsIDI0LCA0NSwgNDUsIDM1LAotIDM5LCAyMiwgMzUsIDM2LCAzNCwgMzQsIDQ1LCAzNCwKLSAyOSwgMzEsIDQ2LCAyNSwgNDYsIDE2LCAxNywgMzEsCi0gMjAsIDMyLCA0NywgNDcsIDQ3LCAzMiwgNDksIDQ5LAotIDQ5LCAzMSwgIDEsIDI3LCAyOCwgMzksIDM5LCAyMSwKLSAzNiwgMjMsIDUxLCAgMiwgNDAsIDUxLCAzMiwgNTMsCi0gMjQsIDMwLCAyNCwgMzAsIDIxLCA0MCwgNTcsIDU3LAotIDMxLCA0MSwgNTgsIDMyLCAxMiwgIDQsIDMyLCAzNCwKLSA1OSwgMzEsIDMyLCAxMywgIDksIDM1LCAyNiwgMzUsCi0gMzcsIDYxLCAzNywgNjMsIDI2LCAyOSwgNDEsIDM4LAotIDIzLCAyMCwgNDEsIDI2LCA0MSwgNDIsIDQyLCA0MiwKLSAyNiwgMjYsIDI2LCAyNiwgIDEsIDI2LCAzNywgMzcsCi0gMzcsIDIzLCAzNCwgNDIsIDI3LCA0MywgMzQsIDI3LAotIDMxLCAyNCwgMzMsIDE2LCAgMywgMzEsIDI0LCAzMywKLSAyNCwgIDQsIDQ0LCA0NCwgMTEsIDQ0LCAzMSwgMTMsCi0gMTMsIDQ0LCA0NSwgMTMsIDI1LCAyMiwgMzgsIDI2LAotIDM4LCAzOCwgMzksIDMyLCAzMCwgMzksIDMwLCAyMiwKLSAzMiwgMjYsIDMwLCA0NywgNDcsIDQ3LCAxOSwgNDcsCi0gMzAsIDMxLCAzNSwgIDgsIDIzLCA0NywgNDcsIDI3LAotIDM1LCA0NywgMzEsIDQ4LCAzNSwgMTksIDM2LCA0OSwKLSA0OSwgMzMsIDMxLCAzOSwgMjcsIDM5LCA0OSwgNDksCi0gNTAsIDUwLCA1MCwgMzksIDMxLCA1MSwgNTEsIDM5LAotIDI4LCAzMywgMzMsIDIxLCA0MCwgMzEsIDUyLCA1MywKLSA0MCwgNTMsICA5LCAzMywgMzEsIDUzLCA1NCwgNTQsCi0gNTQsIDU1LCA1NSwgMzQsIDE1LCA1NiwgMjUsIDU2LAotIDIxLCAyMSwgNDAsIDQwLCAyNSwgNDAsIDU4LCAzNiwKLSAgNSwgNDEsIDQxLCAxMiwgNjAsIDQxLCA0MSwgMzcsCi0gMjIsIDYxLCAxOCwgMjksIDI5LCAzMCwgNjEsIDMwLAotIDYxLCA2MiwgNjIsIDMwLCAzMCwgNjMsIDE4LCAxMywKLSAzMCwgMjMsIDE5LCAyMCwgMjAsIDQxLCAxMywgIDIsCi0gIDUsICA1LCAgMSwgIDUsIDMyLCAgNiwgMzIsIDM1LAotIDIwLCAzNSwgMjcsIDM1LCAzNSwgMzYsIDM2LCAxMywKLSAzNiwgNDEsIDQxLCA0MSwgIDMsIDMwLCA0MiwgMjcsCi0gMjAsIDMwLCAyNywgMjgsIDMwLCAyMSwgMzMsIDMzLAotIDE0LCAyNCwgMzAsIDQyLCAyNCwgMzMsIDI1LCA0MiwKLSA0MywgMTQsIDQzLCA0MywgMTQsIDQzLCAgNywgMzYsCi0gMzcsIDM3LCAzNywgMzcsICA3LCAxNCwgMjUsIDQzLAotIDQzLCA0NCwgMTUsIDM3LCAgNywgIDcsICAzLCAgMSwKLSAgOCwgMTUsIDE1LCAgOCwgNDQsIDQ0LCA0NCwgNDUsCi0gNDUsIDQ1LCA0NSwgIDgsICA4LCA0NSwgMjEsIDQ1LAotIDI4LCAyOCwgMjgsIDIxLCAyOCwgMjgsIDIyLCAzNywKLSA0NiwgNDYsIDM3LCAgOCwgMjksIDM3LCAyOSwgMjIsCi0gNDYsIDM3LCAyMiwgMjksIDQ3LCA0NywgMzgsIDM4LAotIDE2LCAzOCwgMzgsIDMzLCAzOCwgMjIsIDQ3LCA0NywKLSAyOSwgMjUsIDE2LCAgMCwgNDgsICAxLCAzNCwgNDgsCi0gNDgsIDM0LCAyNSwgMjYsIDI2LCA0OSwgNDksIDI2LAotICAxLCA0OSwgIDQsIDI2LCAgNCwgNDksICAxLCAgOSwKLSA0OSwgNDksIDQ5LCAxMCwgNDksIDE3LCAzOCwgMTcsCi0gMTcsIDUwLCAzOCwgNTAsIDUwLCAyMiwgMzgsIDUxLAotIDM4LCAzOCwgNTEsIDM5LCAzOSwgMTgsIDIyLCAzOSwKLSA1MSwgMjIsIDUyLCA1MiwgNTIsIDM5LCA1MywgNTMsCi0gMTAsIDIzLCAxOCwgMjksIDEwLCA1MywgMjksIDU0LAotIDExLCA1NCwgMTEsIDExLCA1NSwgIDEsIDE4LCA1NSwKLSA1NSwgNTUsIDU1LCA1NSwgNTUsIDI5LCAzNCwgMTgsCi0gMjksIDU2LCA1NiwgMzQsIDU3LCAzNCwgMzQsIDI5LAotIDI5LCA1NywgNTcsIDM1LCAzNSwgMzUsIDM1LCAzNSwKLSAzOSwgMzUsIDU5LCA1OSwgMTgsIDU5LCAzOSwgMzAsCi0gMTgsIDQwLCA2MCwgNjAsIDYxLCAzMCwgMTgsIDYxLAotIDYxLCAxOSwgMTksCisgICAgMzIsIDMyLCAzMSwgMzIsIDMzLCAzMSwgMzMsIDMxLAorICAgIDMzLCAzMiwgMzQsIDMyLCAzMCwgMzIsIDMxLCAzNCwKKyAgICAzNSwgMzIsIDM0LCAzMywgMjksIDMzLCAzMCwgMzAsCisgICAgMzEsIDMxLCAzNSwgMjksIDMzLCAzNSwgMzMsIDM0LAorICAgIDMxLCAyOSwgMzAsIDM0LCAzMCwgMzYsIDI4LCAzMiwKKyAgICAzNCwgMzcsIDMwLCAyNywgMzIsIDI1LCAzOSwgMzIsCisgICAgMzQsIDMyLCAzNSwgMzUsIDM1LCAzMSwgMzUsIDI5LAorICAgIDMyLCAyOSwgMzAsIDI5LCAzNywgMjcsIDM2LCAzOCwKKyAgICAzNywgMzMsIDMyLCAzMSwgMjksIDMxLCAyOCwgMzYsCisgICAgMzMsIDMwLCAzNCwgMzMsIDMzLCAyOCwgMjcsIDI1LAorICAgIDMxLCAyNiwgMzksIDMyLCAzMiwgMzEsIDMzLCAzOSwKKyAgICAzMSwgMzgsIDI4LCAzNiwgMjEsIDIzLCA0MywgMzYsCisgICAgMzQsIDQxLCAzMCwgMjUsIDI4LCAzMSwgMzAsIDM0LAorICAgIDM4LCAzNSwgNjEsIDM0LCAyOCwgMzAsIDM3LCAzNywKKyAgICAzNSwgMjcsIDM2LCAgMywgNTksIDM4LCAzNywgMzIsCisgICAgMzEsIDI5LCAyNiwgMzMsIDM3LCAzMywgMjcsIDI3LAorICAgIDM1LCAzNCwgMzQsIDQwLCA0MiwgMzMsIDMyLCAyOSwKKyAgICAgNCwgIDUsIDI4LCAyNCwgMjUsIDM1LCAzOSwgMzgsCisgICAgMzIsIDIzLCAyNywgMzIsIDMwLCAzNSwgMjYsIDM0LAorICAgIDYwLCAzNiwgMjksIDIyLCAyNiwgNDEsICA3LCAzMCwKKyAgICAzOCwgMzAsIDM2LCAyOSwgMzAsIDQxLCAyNiwgMjUsCisgICAgMzIsIDM0LCAyNCwgMzksICAxLCAyNSwgMzksIDMyLAorICAgIDI4LCAyOSwgMzIsIDM4LCAyNiwgMzYsIDI4LCA2MywKKyAgICAyOCwgMzksIDIzLCAyMSwgMjYsIDM1LCAzMSwgMzUsCisgICAgNTcsIDMxLCAyOSwgMjksIDI4LCAzMCwgMjcsIDM1LAorICAgICAyLCAzOCwgNDAsIDM0LCAzNywgMjksIDM4LCA0MywKKyAgICAyNiwgMzIsIDMzLCA0MiwgMjQsIDQwLCAyOCwgMzIsCisgICAgMzIsIDMyLCAzNiwgMzIsIDQzLCAyNSwgMjEsIDMxLAorICAgIDMwLCAzMSwgNDEsIDI5LCAzMywgMzcsIDI2LCAzNywKKyAgICAyNywgNTksIDIzLCAzMywgMzUsIDMxLCAzMSwgMzcsCisgICAgMzgsIDM5LCAzMiwgMjMsIDMyLCAyNywgMzcsIDM2LAorICAgIDMxLCA0MCwgMjUsIDI3LCAzOCwgMzEsIDM2LCAyOCwKKyAgICAzMSwgMzYsIDI1LCA0NSwgIDMsIDM0LCAzOCwgMzksCisgICAgNDAsIDM4LCAzMCwgMzIsIDE5LCAyNCwgMjUsIDI2LAorICAgIDQ1LCAyMCwgMjQsIDMzLCAzMywgMzEsIDQxLCAzNCwKKyAgICAzOSwgNDcsIDQwLCA1OCwgNTksIDQxLCAzMywgIDMsCisgICAgMTcsIDYxLCA0MiwgMzAsIDI2LCAyOSwgMzYsIDYxLAorICAgIDMzLCAzNywgNjIsIDI4LCAyNSwgMzgsIDI1LCAzOCwKKyAgICAxNywgMjMsIDM0LCAzMywgMjEsIDMzLCA0OSwgMjcsCisgICAgMzIsIDIzLCAyNywgMjIsIDI0LCAyMiwgMzksIDQzLAorICAgIDI3LCAzNywgIDYsIDQyLCA0NywgMjYsIDMwLCAzMSwKKyAgICA0MSwgMzksIDMzLCAyMiwgNDUsIDM2LCAzMiwgNDUsCisgICAgMTksIDIyLCAzMCwgIDUsICA1LCAxNywgMjksIDIyLAorICAgIDMxLCAzMSwgNDMsIDM3LCAyNywgMzIsIDMyLCAzMiwKKyAgICAzMywgMzQsIDQzLCAzNSwgMjksIDI2LCAyMiwgMzIsCisgICAgMTksIDMyLCAyNSwgMzEsIDQxLCA0OSwgMjgsIDM0LAorICAgIDI4LCAzOSwgMzQsIDE5LCAzNywgMzgsIDI5LCAyMSwKKyAgICAzNiwgNDIsIDI0LCA0OCwgMTYsIDI4LCA0OSwgMjIsCisgICAgMzQsIDMxLCAzOCwgMzksIDQ0LCAxMSwgMzUsIDMwLAorICAgIDMzLCAzMywgMjMsIDI4LCAzMywgNDYsIDE1LCAxMywKKyAgICAyNCwgNDEsIDI0LCAzNCwgMzQsIDMwLCAyNiwgMjQsCisgICAgMTQsIDYwLCAyMSwgMjksIDM5LCAyMywgMzUsIDM3LAorICAgIDYzLCA0NSwgMzMsIDM0LCA0NywgNDEsIDIyLCA0MiwKKyAgICAzNSwgMzUsIDIzLCAzMiwgMzUsIDQzLCAzMiwgIDcsCisgICAgMzEsIDQxLCAyMCwgMzEsIDE2LCAxMywgNjMsIDI1LAorICAgIDMwLCAzMiwgMzUsIDMwLCAzMCwgMzEsIDQyLCA0NywKKyAgICAzOSwgMzgsIDQwLCA0MCwgNTEsIDU1LCA1NiwgMTgsCisgICAgMjEsIDM5LCAzOSwgMzMsIDE3LCA0MSwgMjMsIDI0LAorICAgIDQzLCAyNSwgMzEsIDIwLCAxOSwgNDUsICAxLCAzNCwKKyAgICAzMSwgMjIsIDM1LCAxNSwgNDYsIDQ2LCAzNSwgMzEsCisgICAgMjgsIDI5LCAyOSwgMjMsIDQxLCAyNywgMTQsIDUzLAorICAgIDUzLCAyNywgMjQsIDMyLCA1NywgMzIsIDE3LCA0MiwKKyAgICAzNywgMjksIDMzLCAgMSwgMjUsIDMyLCAzMiwgNjMsCisgICAgMjYsIDQwLCA0NCwgMzYsIDMxLCAzOSwgMjAsIDIwLAorICAgIDQ0LCAyMywgMzMsIDM0LCAzNSwgMzMsIDMzLCAyOCwKKyAgICA0MSwgMjMsIDQxLCA0MSwgMjksIDI1LCAyNiwgNDksCisgICAgMjksIDI0LCAzNywgNDksIDUwLCA1MSwgNTEsIDI2LAorICAgIDM5LCAyNSwgMjYsIDE1LCAzOSwgMTgsIDQyLCAxNywKKyAgICAgNCwgMzEsIDMyLCAzMiwgNjAsICAxLCA0MiwgMzIsCisgICAgIDAsIDEyLCAxOSwgMzUsIDIxLCA0MSwgMTcsIDI2LAorICAgIDIwLCA0NSwgNDYsIDMyLCAzNywgMjIsIDQ3LCAyOSwKKyAgICAzMSwgMjcsIDI5LCAzMCwgMjEsIDMzLCAzNSwgMTgsCisgICAgMjUsIDMzLCA1MCwgNTEsIDQyLCAgMiwgMTUsIDUxLAorICAgIDUzLCAzMywgMjUsIDI5LCA1NSwgMzcsIDM4LCAzMywKKyAgICAzOCwgNTksIDM4LCAzMywgMzksIDEzLCAzMiwgNDAsCisgICAgNjEsIDYxLCAzMiwgIDksIDQ0LCAgMywgMzEsIDI5LAorICAgIDI1LCAzMSwgMjcsIDIzLCAgOSwgMjUsICA5LCAyOSwKKyAgICAyMCwgMzAsIDMwLCA0MiwgMTgsIDI4LCAyNSwgMjgsCisgICAgMjgsIDIxLCAyOSwgNDMsIDI5LCA0MywgMjYsIDQ0LAorICAgIDQ0LCAyMSwgMzgsIDIxLCAyNCwgNDUsIDQ1LCAzNSwKKyAgICAzOSwgMjIsIDM1LCAzNiwgMzQsIDM0LCA0NSwgMzQsCisgICAgMjksIDMxLCA0NiwgMjUsIDQ2LCAxNiwgMTcsIDMxLAorICAgIDIwLCAzMiwgNDcsIDQ3LCA0NywgMzIsIDQ5LCA0OSwKKyAgICA0OSwgMzEsICAxLCAyNywgMjgsIDM5LCAzOSwgMjEsCisgICAgMzYsIDIzLCA1MSwgIDIsIDQwLCA1MSwgMzIsIDUzLAorICAgIDI0LCAzMCwgMjQsIDMwLCAyMSwgNDAsIDU3LCA1NywKKyAgICAzMSwgNDEsIDU4LCAzMiwgMTIsICA0LCAzMiwgMzQsCisgICAgNTksIDMxLCAzMiwgMTMsICA5LCAzNSwgMjYsIDM1LAorICAgIDM3LCA2MSwgMzcsIDYzLCAyNiwgMjksIDQxLCAzOCwKKyAgICAyMywgMjAsIDQxLCAyNiwgNDEsIDQyLCA0MiwgNDIsCisgICAgMjYsIDI2LCAyNiwgMjYsICAxLCAyNiwgMzcsIDM3LAorICAgIDM3LCAyMywgMzQsIDQyLCAyNywgNDMsIDM0LCAyNywKKyAgICAzMSwgMjQsIDMzLCAxNiwgIDMsIDMxLCAyNCwgMzMsCisgICAgMjQsICA0LCA0NCwgNDQsIDExLCA0NCwgMzEsIDEzLAorICAgIDEzLCA0NCwgNDUsIDEzLCAyNSwgMjIsIDM4LCAyNiwKKyAgICAzOCwgMzgsIDM5LCAzMiwgMzAsIDM5LCAzMCwgMjIsCisgICAgMzIsIDI2LCAzMCwgNDcsIDQ3LCA0NywgMTksIDQ3LAorICAgIDMwLCAzMSwgMzUsICA4LCAyMywgNDcsIDQ3LCAyNywKKyAgICAzNSwgNDcsIDMxLCA0OCwgMzUsIDE5LCAzNiwgNDksCisgICAgNDksIDMzLCAzMSwgMzksIDI3LCAzOSwgNDksIDQ5LAorICAgIDUwLCA1MCwgNTAsIDM5LCAzMSwgNTEsIDUxLCAzOSwKKyAgICAyOCwgMzMsIDMzLCAyMSwgNDAsIDMxLCA1MiwgNTMsCisgICAgNDAsIDUzLCAgOSwgMzMsIDMxLCA1MywgNTQsIDU0LAorICAgIDU0LCA1NSwgNTUsIDM0LCAxNSwgNTYsIDI1LCA1NiwKKyAgICAyMSwgMjEsIDQwLCA0MCwgMjUsIDQwLCA1OCwgMzYsCisgICAgIDUsIDQxLCA0MSwgMTIsIDYwLCA0MSwgNDEsIDM3LAorICAgIDIyLCA2MSwgMTgsIDI5LCAyOSwgMzAsIDYxLCAzMCwKKyAgICA2MSwgNjIsIDYyLCAzMCwgMzAsIDYzLCAxOCwgMTMsCisgICAgMzAsIDIzLCAxOSwgMjAsIDIwLCA0MSwgMTMsICAyLAorICAgICA1LCAgNSwgIDEsICA1LCAzMiwgIDYsIDMyLCAzNSwKKyAgICAyMCwgMzUsIDI3LCAzNSwgMzUsIDM2LCAzNiwgMTMsCisgICAgMzYsIDQxLCA0MSwgNDEsICAzLCAzMCwgNDIsIDI3LAorICAgIDIwLCAzMCwgMjcsIDI4LCAzMCwgMjEsIDMzLCAzMywKKyAgICAxNCwgMjQsIDMwLCA0MiwgMjQsIDMzLCAyNSwgNDIsCisgICAgNDMsIDE0LCA0MywgNDMsIDE0LCA0MywgIDcsIDM2LAorICAgIDM3LCAzNywgMzcsIDM3LCAgNywgMTQsIDI1LCA0MywKKyAgICA0MywgNDQsIDE1LCAzNywgIDcsICA3LCAgMywgIDEsCisgICAgIDgsIDE1LCAxNSwgIDgsIDQ0LCA0NCwgNDQsIDQ1LAorICAgIDQ1LCA0NSwgNDUsICA4LCAgOCwgNDUsIDIxLCA0NSwKKyAgICAyOCwgMjgsIDI4LCAyMSwgMjgsIDI4LCAyMiwgMzcsCisgICAgNDYsIDQ2LCAzNywgIDgsIDI5LCAzNywgMjksIDIyLAorICAgIDQ2LCAzNywgMjIsIDI5LCA0NywgNDcsIDM4LCAzOCwKKyAgICAxNiwgMzgsIDM4LCAzMywgMzgsIDIyLCA0NywgNDcsCisgICAgMjksIDI1LCAxNiwgIDAsIDQ4LCAgMSwgMzQsIDQ4LAorICAgIDQ4LCAzNCwgMjUsIDI2LCAyNiwgNDksIDQ5LCAyNiwKKyAgICAgMSwgNDksICA0LCAyNiwgIDQsIDQ5LCAgMSwgIDksCisgICAgNDksIDQ5LCA0OSwgMTAsIDQ5LCAxNywgMzgsIDE3LAorICAgIDE3LCA1MCwgMzgsIDUwLCA1MCwgMjIsIDM4LCA1MSwKKyAgICAzOCwgMzgsIDUxLCAzOSwgMzksIDE4LCAyMiwgMzksCisgICAgNTEsIDIyLCA1MiwgNTIsIDUyLCAzOSwgNTMsIDUzLAorICAgIDEwLCAyMywgMTgsIDI5LCAxMCwgNTMsIDI5LCA1NCwKKyAgICAxMSwgNTQsIDExLCAxMSwgNTUsICAxLCAxOCwgNTUsCisgICAgNTUsIDU1LCA1NSwgNTUsIDU1LCAyOSwgMzQsIDE4LAorICAgIDI5LCA1NiwgNTYsIDM0LCA1NywgMzQsIDM0LCAyOSwKKyAgICAyOSwgNTcsIDU3LCAzNSwgMzUsIDM1LCAzNSwgMzUsCisgICAgMzksIDM1LCA1OSwgNTksIDE4LCA1OSwgMzksIDMwLAorICAgIDE4LCA0MCwgNjAsIDYwLCA2MSwgMzAsIDE4LCA2MSwKKyAgICA2MSwgMTksIDE5LAogfTsKIAogc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGFibGUwX212eVsxMDk5XSA9IHsKLSAzMiwgMzEsIDMyLCAzMywgMzIsIDMxLCAzMSwgMzMsCi0gMzMsIDM0LCAzMiwgMzAsIDMyLCAzNSwgMzQsIDMxLAotIDMyLCAyOSwgMzMsIDMwLCAzMiwgMzQsIDMzLCAzMSwKLSAzMCwgMzUsIDMxLCAzMSwgMjksIDMzLCAzNSwgMzAsCi0gMjksIDMzLCAzNCwgMzQsIDMwLCAzMiwgMzIsIDM2LAotIDI5LCAzMiwgMzUsIDMyLCAyOCwgMzIsIDMyLCAyNywKLSAzNSwgMzcsIDM0LCAyOSwgMzAsIDM2LCAzNSwgMzQsCi0gMjUsIDMwLCAyOSwgMzUsIDMzLCAzMSwgMzEsIDMyLAotIDMxLCAyOCwgMzksIDI4LCAyOSwgMzcsIDMxLCAzMywKLSAyNywgMzYsIDI4LCAzNiwgMzcsIDMzLCAzMywgMzEsCi0gMjcsIDMyLCAzMSwgMzgsIDI2LCAyNSwgMjUsIDMzLAotIDM5LCAzMSwgMzQsIDMwLCAzMiwgMzIsIDMyLCAzNCwKLSAzNiwgMzIsIDI4LCAzMywgMzAsIDM4LCAzNywgMjcsCi0gMzMsIDI4LCAzMiwgMzcsIDM1LCAzOCwgMjksIDM0LAotIDI3LCAyOSwgMjksIDMyLCAzMiwgMzQsIDM1LCAgMywKLSAyNiwgMzYsIDMxLCAzOCwgMzAsIDI2LCAzNSwgMzQsCi0gMzcsIDI2LCAyNSwgMzIsIDMyLCAzOSwgMjMsIDM3LAotIDMyLCAzMiwgMjksIDMyLCAyOSwgMzYsIDI5LCAzMCwKLSA0MSwgMzEsIDMwLCAyMSwgMzksIDI1LCAzNCwgMzgsCi0gMzIsIDM1LCAzOSwgMzIsIDMzLCAzMywgMzIsIDI3LAotIDI5LCAyNSwgMjgsIDI3LCAyNiwgMzEsIDMwLCAzNSwKLSAyNCwgMjQsIDMxLCAzNCwgMzIsIDMwLCAzNSwgNDAsCi0gMjgsIDM4LCAgNSwgMzUsIDI5LCAzNiwgMzYsIDMyLAotIDM4LCAzMCwgMzMsIDMxLCAzNSwgMjYsIDIzLCAzOCwKLSAzMiwgNDEsIDI4LCAyNSwgMzcsIDQwLCAzNywgMzksCi0gMzIsIDM2LCAzMywgMzksIDI1LCAyNiwgMjgsIDMxLAotIDI4LCA0MiwgMjMsIDMxLCAzMywgMzEsIDM5LCAgMSwKLSA1OSwgMjIsIDI3LCAgNCwgMzMsIDM0LCAzMywgMjQsCi0gNDEsICAzLCAzNSwgNDEsIDQxLCAyOCwgMzYsIDM2LAotIDI4LCAzMywgMzUsIDIxLCAyMywgMjEsIDIyLCAzNywKLSAyNywgMjcsIDQzLCAyOSwgNjAsIDM5LCAyNywgMjUsCi0gNTksIDM0LCAyNywgMjcsIDI2LCA0MCwgMzcsIDI3LAotIDYxLCAyNiwgMzksIDMzLCAzMSwgMjIsIDM3LCAyNSwKLSAzMCwgMjUsIDI0LCA2MSwgMzEsIDM0LCAyNSwgMzgsCi0gMzIsIDMyLCAzMCwgIDMsIDYxLCA0MywgMjksIDIzLAotIDI4LCAzMiwgMjgsIDMyLCAzMSwgMzQsICA1LCAzMywKLSAzMiwgMzMsIDMzLCA0MiwgMzcsIDIzLCAzOCwgMzEsCi0gNDAsIDI2LCAzMiwgMjYsIDM3LCAzOCwgMzYsIDI0LAotIDI5LCAzMCwgMjAsIDIyLCAyOSwgMjQsIDMyLCA0MSwKLSAgMiwgMzQsIDI1LCAzMywgMjksIDMxLCAzOSwgMzUsCi0gMzYsIDI0LCAzMiwgMzAsIDMzLCAyNywgNDQsIDYwLAotIDMwLCAzNiwgMTksIDM0LCAzMSwgMjQsIDE2LCAzNSwKLSAzMiwgMzgsIDIxLCAzMywgMzEsIDMxLCAyMSwgMzUsCi0gIDUsIDE3LCAyOSwgMzgsIDM4LCAxOCwgNTgsIDE5LAotIDQzLCA0MSwgMzAsIDQxLCA0MywgMzksIDI5LCAgNywKLSAyOSwgMTcsIDI4LCAxOSwgMjgsIDMxLCAyNSwgMTksCi0gNDAsIDI2LCAyMSwgMzMsIDM5LCAyMywgNDAsIDMwLAotIDM5LCAzNCwgMzUsIDMyLCAzMiwgMjQsIDMzLCAzMCwKLSA0MCwgNDcsIDM5LCAzNywgMzIsIDMzLCAyNCwgMjMsCi0gNDUsIDQ3LCAyNywgMjMsIDQyLCAzMiwgMzIsIDMzLAotIDM2LCAzNywgMzcsIDE3LCAxOCwgMjIsIDQwLCAzOCwKLSAzMiwgMzEsIDM1LCAyNCwgMTcsIDI1LCAxNywgMjMsCi0gMzMsIDM0LCA1MSwgNDIsIDMxLCAzNiwgMzYsIDI5LAotIDIxLCAyMiwgMzcsIDQ0LCA0MywgMjUsIDQ3LCAzMywKLSA0NSwgMjcsIDMxLCA1OCwgMzEsIDMyLCAzMSwgMzgsCi0gNDMsIDIwLCA0NywgNDUsIDU0LCAgMSwgMjYsIDM0LAotIDM4LCAxNCwgMjIsIDI0LCAzMywgMzQsIDMyLCAzMiwKLSAzNywgMjEsIDIzLCA0OSwgMzUsIDIzLCAyOCwgMzksCi0gMzksIDIzLCA1NSwgMzMsIDMwLCAzMCwgNjMsIDE2LAotIDQyLCAyOCwgMTMsIDMzLCAzMywgMzUsIDE5LCA0NiwKLSA0MywgMTcsIDE5LCAzNiwgMzksIDI0LCAzMSwgMzIsCi0gMzMsIDI2LCAyOCwgNjIsIDMzLCA2MywgMzMsIDM5LAotIDE5LCA0OSwgMTcsIDMxLCA0MywgMTMsIDE1LCAyOSwKLSAyNSwgMzUsIDMzLCAyMywgNDksIDQxLCAyOCwgMjksCi0gMzQsIDM4LCAgNywgNjEsIDExLCA1MCwgMTMsIDQxLAotIDE5LCA0NywgMjUsIDI2LCAxNSwgNDIsIDQxLCAyOSwKLSA0NSwgMjcsIDE3LCAzNSwgMzIsIDI5LCAzMiwgMjQsCi0gMTMsIDI2LCAyNiwgMzEsIDI0LCAzMywgMjgsIDMwLAotIDMxLCAxMSwgNDUsIDQ2LCAzMywgMzMsIDM1LCA1NywKLSAzMiwgMzIsIDM1LCA0NSwgMzQsIDExLCAzNywgNDIsCi0gMzksIDM3LCAzMSwgNDksIDIxLCAyNywgMjksIDQ3LAotIDUzLCA0MCwgNTEsIDE2LCAyNiwgIDEsIDQwLCAzMCwKLSA0MSwgNDQsIDM0LCAyNSwgMjcsIDMxLCAzNSwgMzUsCi0gMzEsIDE1LCA0OSwgIDEsIDM1LCA0MCwgIDUsIDU4LAotIDIxLCAyOSwgMjIsIDU5LCA0NSwgMzEsICA5LCAyNiwKLSAgOSwgMjksIDExLCAzMiwgMzAsICAzLCAxMywgMjAsCi0gMTgsIDIwLCAxMSwgIDMsIDI5LCA0MCwgMzEsIDUzLAotIDMwLCAxNywgMjAsIDM3LCAzMSwgNDIsIDQ3LCA0NywKLSA1NCwgMzgsICA5LCAzNCwgMTMsIDM3LCAyMSwgMjUsCi0gMjcsIDQzLCA0MiwgNDUsIDQwLCAyNSwgMjcsIDQ2LAotIDIyLCAyNSwgNTMsIDIwLCAgMiwgMTQsIDM5LCAxNSwKLSAyMiwgNDQsIDM0LCAyMSwgMzgsIDMzLCAyNywgNDgsCi0gMzQsIDUyLCAzNSwgNDcsIDQ5LCA1NCwgIDIsIDEzLAotIDIzLCA1MiwgMjksIDQ1LCAyMiwgNDksIDU0LCAyMSwKLSA0MCwgNDIsIDMxLCAzMCwgMjksIDM0LCAgMCwgMjUsCi0gMjMsIDUxLCAyNCwgNTksIDI4LCAzOCwgMjksIDMxLAotICAyLCAxMywgMzEsICA4LCAzMSwgMzMsIDEyLCA0NSwKLSA0MSwgIDcsIDE0LCAzMCwgMjUsIDE4LCA0MywgMjAsCi0gNDMsIDM1LCA0NCwgIDEsIDQ5LCA0MiwgNDIsIDE4LAotIDQxLCAzOCwgNDEsIDQ0LCA1MywgMTEsIDIwLCAyNSwKLSA0NSwgNDYsIDQ3LCA0OCwgMzksIDUyLCA0NiwgNDksCi0gNjMsIDU1LCA0NCwgMzgsIDEzLCAxMywgNTcsIDIyLAotIDUxLCAxNiwgMTIsIDI4LCAzNSwgNTcsIDI1LCAyMCwKLSAyNiwgMjgsIDI4LCAyOSwgMzIsIDMxLCA2MiwgMzQsCi0gMzUsIDM1LCAxOSwgNDksIDQ4LCAzOSwgNDAsIDE4LAotIDQzLCA0NiwgMTEsICA2LCA0OCwgMTksIDQ5LCA0MSwKLSAxMCwgMjMsIDU4LCAxNywgMjEsIDIzLCAzNCwgMzAsCi0gNjAsICAwLCA0NCwgMzQsIDI2LCAzNywgNDYsIDQzLAotIDQ5LCA1OSwgIDQsIDM0LCA1OSwgMzcsIDIyLCAyNSwKLSAyOCwgNDYsICA2LCA0MCwgNTksIDQyLCAzNiwgNjEsCi0gMjgsIDMwLCAzMSwgNDMsIDEwLCAyMiwgMjMsIDQ3LAotIDIwLCA1MiwgNTUsIDM2LCAyNSwgMTYsICAxLCAxMSwKLSAyNywgMjksICA1LCA2MywgMTgsIDQxLCAzMSwgMzQsCi0gMzgsICAxLCAgNSwgMTMsIDI4LCAzMSwgMTcsIDM4LAotIDM5LCA0MSwgMzYsIDM3LCAyMiwgMzksIDMzLCA0MywKLSA0MywgMTUsIDE3LCA0OSwgMzAsIDIxLCAyMiwgMjAsCi0gMTAsIDE3LCAyNSwgNTQsIDU3LCAgMywgMzQsICA4LAotIDM2LCAyNSwgMzEsIDE0LCAxNSwgMTksIDI5LCAyNSwKLSAxOCwgMzksIDUzLCAyMiwgMjcsIDIwLCAyOSwgMzMsCi0gNDEsIDQyLCAzNSwgNjIsIDUwLCAyOSwgNTMsIDUwLAotIDM1LCA1NSwgNDIsIDYxLCA2MywgIDQsICA3LCA0MiwKLSAyMSwgNDYsIDQ3LCA0OSwgMjcsIDQ2LCAxNywgNTUsCi0gNDEsIDUwLCA2MywgIDQsIDU2LCAxOCwgIDgsIDEwLAotIDE4LCA1MSwgNjMsIDM2LCA1NSwgMTgsICA1LCA1NSwKLSAgOSwgMjksIDE3LCAyMSwgMzAsIDI3LCAgMSwgNTksCi0gIDcsIDExLCAxMiwgMTUsICA1LCA0MiwgMjQsIDQxLAotIDQzLCAgNywgMjcsIDIyLCAyNSwgMzEsIDMwLCAzNywKLSAyMiwgMzksIDUzLCAyOSwgMzYsIDM3LCA0OCwgIDAsCi0gIDUsIDEzLCAxNywgMzEsIDMyLCAyNiwgNDYsIDI4LAotIDQ0LCA0NSwgNDYsIDUzLCA0OSwgNTEsICAzLCA0MSwKLSAgMywgMjIsIDQyLCAzMywgIDUsIDQ1LCAgNywgMjIsCi0gNDAsIDUzLCAyNCwgMTQsIDI1LCAyNywgMTAsIDEyLAotIDM0LCAxNiwgMTcsIDUzLCAyMCwgMjYsIDM5LCA0NSwKLSAxOCwgNDUsIDM1LCAzMywgMzEsIDQ5LCAgNCwgMzksCi0gNDIsIDExLCA1MSwgIDUsIDEzLCAyNiwgMjcsIDE3LAotIDUyLCAzMCwgIDAsIDIyLCAxMiwgMzQsIDYyLCAzNiwKLSAzOCwgNDEsIDQ3LCAzMCwgNjMsIDM4LCA0MSwgNDMsCi0gNTksIDMzLCA0NSwgMzcsIDM4LCA0MCwgNDcsIDI0LAotIDQ4LCA0OSwgMzAsICAxLCAxMCwgMjIsIDQ5LCAxNSwKLSAzOSwgNTksIDMxLCAzMiwgMzMsIDE4LCAxMywgMTUsCi0gMzEsIDIxLCAyNywgNDQsIDQyLCAzOSwgNDYsIDE3LAotIDI2LCAzMiwgMzAsIDMxLCAgMCwgMzAsIDM0LCAgOSwKLSAxMiwgMTMsIDI1LCAzMSwgMzIsIDU1LCA0MywgMzUsCi0gNjEsIDMzLCAzNSwgNDYsIDI1LCA0NywgNDgsIDYyLAotIDYzLCAzOCwgNjEsICAxLCAgMiwgIDUsICA3LCAgOSwKLSA0NiwgMTAsIDM0LCAzNSwgMzYsIDU1LCA1MSwgIDcsCi0gNDAsIDIzLCAzNCwgMzcsICA1LCAxMywgNDIsIDE4LAotIDI1LCAyNywgMjgsCisgICAgMzIsIDMxLCAzMiwgMzMsIDMyLCAzMSwgMzEsIDMzLAorICAgIDMzLCAzNCwgMzIsIDMwLCAzMiwgMzUsIDM0LCAzMSwKKyAgICAzMiwgMjksIDMzLCAzMCwgMzIsIDM0LCAzMywgMzEsCisgICAgMzAsIDM1LCAzMSwgMzEsIDI5LCAzMywgMzUsIDMwLAorICAgIDI5LCAzMywgMzQsIDM0LCAzMCwgMzIsIDMyLCAzNiwKKyAgICAyOSwgMzIsIDM1LCAzMiwgMjgsIDMyLCAzMiwgMjcsCisgICAgMzUsIDM3LCAzNCwgMjksIDMwLCAzNiwgMzUsIDM0LAorICAgIDI1LCAzMCwgMjksIDM1LCAzMywgMzEsIDMxLCAzMiwKKyAgICAzMSwgMjgsIDM5LCAyOCwgMjksIDM3LCAzMSwgMzMsCisgICAgMjcsIDM2LCAyOCwgMzYsIDM3LCAzMywgMzMsIDMxLAorICAgIDI3LCAzMiwgMzEsIDM4LCAyNiwgMjUsIDI1LCAzMywKKyAgICAzOSwgMzEsIDM0LCAzMCwgMzIsIDMyLCAzMiwgMzQsCisgICAgMzYsIDMyLCAyOCwgMzMsIDMwLCAzOCwgMzcsIDI3LAorICAgIDMzLCAyOCwgMzIsIDM3LCAzNSwgMzgsIDI5LCAzNCwKKyAgICAyNywgMjksIDI5LCAzMiwgMzIsIDM0LCAzNSwgIDMsCisgICAgMjYsIDM2LCAzMSwgMzgsIDMwLCAyNiwgMzUsIDM0LAorICAgIDM3LCAyNiwgMjUsIDMyLCAzMiwgMzksIDIzLCAzNywKKyAgICAzMiwgMzIsIDI5LCAzMiwgMjksIDM2LCAyOSwgMzAsCisgICAgNDEsIDMxLCAzMCwgMjEsIDM5LCAyNSwgMzQsIDM4LAorICAgIDMyLCAzNSwgMzksIDMyLCAzMywgMzMsIDMyLCAyNywKKyAgICAyOSwgMjUsIDI4LCAyNywgMjYsIDMxLCAzMCwgMzUsCisgICAgMjQsIDI0LCAzMSwgMzQsIDMyLCAzMCwgMzUsIDQwLAorICAgIDI4LCAzOCwgIDUsIDM1LCAyOSwgMzYsIDM2LCAzMiwKKyAgICAzOCwgMzAsIDMzLCAzMSwgMzUsIDI2LCAyMywgMzgsCisgICAgMzIsIDQxLCAyOCwgMjUsIDM3LCA0MCwgMzcsIDM5LAorICAgIDMyLCAzNiwgMzMsIDM5LCAyNSwgMjYsIDI4LCAzMSwKKyAgICAyOCwgNDIsIDIzLCAzMSwgMzMsIDMxLCAzOSwgIDEsCisgICAgNTksIDIyLCAyNywgIDQsIDMzLCAzNCwgMzMsIDI0LAorICAgIDQxLCAgMywgMzUsIDQxLCA0MSwgMjgsIDM2LCAzNiwKKyAgICAyOCwgMzMsIDM1LCAyMSwgMjMsIDIxLCAyMiwgMzcsCisgICAgMjcsIDI3LCA0MywgMjksIDYwLCAzOSwgMjcsIDI1LAorICAgIDU5LCAzNCwgMjcsIDI3LCAyNiwgNDAsIDM3LCAyNywKKyAgICA2MSwgMjYsIDM5LCAzMywgMzEsIDIyLCAzNywgMjUsCisgICAgMzAsIDI1LCAyNCwgNjEsIDMxLCAzNCwgMjUsIDM4LAorICAgIDMyLCAzMiwgMzAsICAzLCA2MSwgNDMsIDI5LCAyMywKKyAgICAyOCwgMzIsIDI4LCAzMiwgMzEsIDM0LCAgNSwgMzMsCisgICAgMzIsIDMzLCAzMywgNDIsIDM3LCAyMywgMzgsIDMxLAorICAgIDQwLCAyNiwgMzIsIDI2LCAzNywgMzgsIDM2LCAyNCwKKyAgICAyOSwgMzAsIDIwLCAyMiwgMjksIDI0LCAzMiwgNDEsCisgICAgIDIsIDM0LCAyNSwgMzMsIDI5LCAzMSwgMzksIDM1LAorICAgIDM2LCAyNCwgMzIsIDMwLCAzMywgMjcsIDQ0LCA2MCwKKyAgICAzMCwgMzYsIDE5LCAzNCwgMzEsIDI0LCAxNiwgMzUsCisgICAgMzIsIDM4LCAyMSwgMzMsIDMxLCAzMSwgMjEsIDM1LAorICAgICA1LCAxNywgMjksIDM4LCAzOCwgMTgsIDU4LCAxOSwKKyAgICA0MywgNDEsIDMwLCA0MSwgNDMsIDM5LCAyOSwgIDcsCisgICAgMjksIDE3LCAyOCwgMTksIDI4LCAzMSwgMjUsIDE5LAorICAgIDQwLCAyNiwgMjEsIDMzLCAzOSwgMjMsIDQwLCAzMCwKKyAgICAzOSwgMzQsIDM1LCAzMiwgMzIsIDI0LCAzMywgMzAsCisgICAgNDAsIDQ3LCAzOSwgMzcsIDMyLCAzMywgMjQsIDIzLAorICAgIDQ1LCA0NywgMjcsIDIzLCA0MiwgMzIsIDMyLCAzMywKKyAgICAzNiwgMzcsIDM3LCAxNywgMTgsIDIyLCA0MCwgMzgsCisgICAgMzIsIDMxLCAzNSwgMjQsIDE3LCAyNSwgMTcsIDIzLAorICAgIDMzLCAzNCwgNTEsIDQyLCAzMSwgMzYsIDM2LCAyOSwKKyAgICAyMSwgMjIsIDM3LCA0NCwgNDMsIDI1LCA0NywgMzMsCisgICAgNDUsIDI3LCAzMSwgNTgsIDMxLCAzMiwgMzEsIDM4LAorICAgIDQzLCAyMCwgNDcsIDQ1LCA1NCwgIDEsIDI2LCAzNCwKKyAgICAzOCwgMTQsIDIyLCAyNCwgMzMsIDM0LCAzMiwgMzIsCisgICAgMzcsIDIxLCAyMywgNDksIDM1LCAyMywgMjgsIDM5LAorICAgIDM5LCAyMywgNTUsIDMzLCAzMCwgMzAsIDYzLCAxNiwKKyAgICA0MiwgMjgsIDEzLCAzMywgMzMsIDM1LCAxOSwgNDYsCisgICAgNDMsIDE3LCAxOSwgMzYsIDM5LCAyNCwgMzEsIDMyLAorICAgIDMzLCAyNiwgMjgsIDYyLCAzMywgNjMsIDMzLCAzOSwKKyAgICAxOSwgNDksIDE3LCAzMSwgNDMsIDEzLCAxNSwgMjksCisgICAgMjUsIDM1LCAzMywgMjMsIDQ5LCA0MSwgMjgsIDI5LAorICAgIDM0LCAzOCwgIDcsIDYxLCAxMSwgNTAsIDEzLCA0MSwKKyAgICAxOSwgNDcsIDI1LCAyNiwgMTUsIDQyLCA0MSwgMjksCisgICAgNDUsIDI3LCAxNywgMzUsIDMyLCAyOSwgMzIsIDI0LAorICAgIDEzLCAyNiwgMjYsIDMxLCAyNCwgMzMsIDI4LCAzMCwKKyAgICAzMSwgMTEsIDQ1LCA0NiwgMzMsIDMzLCAzNSwgNTcsCisgICAgMzIsIDMyLCAzNSwgNDUsIDM0LCAxMSwgMzcsIDQyLAorICAgIDM5LCAzNywgMzEsIDQ5LCAyMSwgMjcsIDI5LCA0NywKKyAgICA1MywgNDAsIDUxLCAxNiwgMjYsICAxLCA0MCwgMzAsCisgICAgNDEsIDQ0LCAzNCwgMjUsIDI3LCAzMSwgMzUsIDM1LAorICAgIDMxLCAxNSwgNDksICAxLCAzNSwgNDAsICA1LCA1OCwKKyAgICAyMSwgMjksIDIyLCA1OSwgNDUsIDMxLCAgOSwgMjYsCisgICAgIDksIDI5LCAxMSwgMzIsIDMwLCAgMywgMTMsIDIwLAorICAgIDE4LCAyMCwgMTEsICAzLCAyOSwgNDAsIDMxLCA1MywKKyAgICAzMCwgMTcsIDIwLCAzNywgMzEsIDQyLCA0NywgNDcsCisgICAgNTQsIDM4LCAgOSwgMzQsIDEzLCAzNywgMjEsIDI1LAorICAgIDI3LCA0MywgNDIsIDQ1LCA0MCwgMjUsIDI3LCA0NiwKKyAgICAyMiwgMjUsIDUzLCAyMCwgIDIsIDE0LCAzOSwgMTUsCisgICAgMjIsIDQ0LCAzNCwgMjEsIDM4LCAzMywgMjcsIDQ4LAorICAgIDM0LCA1MiwgMzUsIDQ3LCA0OSwgNTQsICAyLCAxMywKKyAgICAyMywgNTIsIDI5LCA0NSwgMjIsIDQ5LCA1NCwgMjEsCisgICAgNDAsIDQyLCAzMSwgMzAsIDI5LCAzNCwgIDAsIDI1LAorICAgIDIzLCA1MSwgMjQsIDU5LCAyOCwgMzgsIDI5LCAzMSwKKyAgICAgMiwgMTMsIDMxLCAgOCwgMzEsIDMzLCAxMiwgNDUsCisgICAgNDEsICA3LCAxNCwgMzAsIDI1LCAxOCwgNDMsIDIwLAorICAgIDQzLCAzNSwgNDQsICAxLCA0OSwgNDIsIDQyLCAxOCwKKyAgICA0MSwgMzgsIDQxLCA0NCwgNTMsIDExLCAyMCwgMjUsCisgICAgNDUsIDQ2LCA0NywgNDgsIDM5LCA1MiwgNDYsIDQ5LAorICAgIDYzLCA1NSwgNDQsIDM4LCAxMywgMTMsIDU3LCAyMiwKKyAgICA1MSwgMTYsIDEyLCAyOCwgMzUsIDU3LCAyNSwgMjAsCisgICAgMjYsIDI4LCAyOCwgMjksIDMyLCAzMSwgNjIsIDM0LAorICAgIDM1LCAzNSwgMTksIDQ5LCA0OCwgMzksIDQwLCAxOCwKKyAgICA0MywgNDYsIDExLCAgNiwgNDgsIDE5LCA0OSwgNDEsCisgICAgMTAsIDIzLCA1OCwgMTcsIDIxLCAyMywgMzQsIDMwLAorICAgIDYwLCAgMCwgNDQsIDM0LCAyNiwgMzcsIDQ2LCA0MywKKyAgICA0OSwgNTksICA0LCAzNCwgNTksIDM3LCAyMiwgMjUsCisgICAgMjgsIDQ2LCAgNiwgNDAsIDU5LCA0MiwgMzYsIDYxLAorICAgIDI4LCAzMCwgMzEsIDQzLCAxMCwgMjIsIDIzLCA0NywKKyAgICAyMCwgNTIsIDU1LCAzNiwgMjUsIDE2LCAgMSwgMTEsCisgICAgMjcsIDI5LCAgNSwgNjMsIDE4LCA0MSwgMzEsIDM0LAorICAgIDM4LCAgMSwgIDUsIDEzLCAyOCwgMzEsIDE3LCAzOCwKKyAgICAzOSwgNDEsIDM2LCAzNywgMjIsIDM5LCAzMywgNDMsCisgICAgNDMsIDE1LCAxNywgNDksIDMwLCAyMSwgMjIsIDIwLAorICAgIDEwLCAxNywgMjUsIDU0LCA1NywgIDMsIDM0LCAgOCwKKyAgICAzNiwgMjUsIDMxLCAxNCwgMTUsIDE5LCAyOSwgMjUsCisgICAgMTgsIDM5LCA1MywgMjIsIDI3LCAyMCwgMjksIDMzLAorICAgIDQxLCA0MiwgMzUsIDYyLCA1MCwgMjksIDUzLCA1MCwKKyAgICAzNSwgNTUsIDQyLCA2MSwgNjMsICA0LCAgNywgNDIsCisgICAgMjEsIDQ2LCA0NywgNDksIDI3LCA0NiwgMTcsIDU1LAorICAgIDQxLCA1MCwgNjMsICA0LCA1NiwgMTgsICA4LCAxMCwKKyAgICAxOCwgNTEsIDYzLCAzNiwgNTUsIDE4LCAgNSwgNTUsCisgICAgIDksIDI5LCAxNywgMjEsIDMwLCAyNywgIDEsIDU5LAorICAgICA3LCAxMSwgMTIsIDE1LCAgNSwgNDIsIDI0LCA0MSwKKyAgICA0MywgIDcsIDI3LCAyMiwgMjUsIDMxLCAzMCwgMzcsCisgICAgMjIsIDM5LCA1MywgMjksIDM2LCAzNywgNDgsICAwLAorICAgICA1LCAxMywgMTcsIDMxLCAzMiwgMjYsIDQ2LCAyOCwKKyAgICA0NCwgNDUsIDQ2LCA1MywgNDksIDUxLCAgMywgNDEsCisgICAgIDMsIDIyLCA0MiwgMzMsICA1LCA0NSwgIDcsIDIyLAorICAgIDQwLCA1MywgMjQsIDE0LCAyNSwgMjcsIDEwLCAxMiwKKyAgICAzNCwgMTYsIDE3LCA1MywgMjAsIDI2LCAzOSwgNDUsCisgICAgMTgsIDQ1LCAzNSwgMzMsIDMxLCA0OSwgIDQsIDM5LAorICAgIDQyLCAxMSwgNTEsICA1LCAxMywgMjYsIDI3LCAxNywKKyAgICA1MiwgMzAsICAwLCAyMiwgMTIsIDM0LCA2MiwgMzYsCisgICAgMzgsIDQxLCA0NywgMzAsIDYzLCAzOCwgNDEsIDQzLAorICAgIDU5LCAzMywgNDUsIDM3LCAzOCwgNDAsIDQ3LCAyNCwKKyAgICA0OCwgNDksIDMwLCAgMSwgMTAsIDIyLCA0OSwgMTUsCisgICAgMzksIDU5LCAzMSwgMzIsIDMzLCAxOCwgMTMsIDE1LAorICAgIDMxLCAyMSwgMjcsIDQ0LCA0MiwgMzksIDQ2LCAxNywKKyAgICAyNiwgMzIsIDMwLCAzMSwgIDAsIDMwLCAzNCwgIDksCisgICAgMTIsIDEzLCAyNSwgMzEsIDMyLCA1NSwgNDMsIDM1LAorICAgIDYxLCAzMywgMzUsIDQ2LCAyNSwgNDcsIDQ4LCA2MiwKKyAgICA2MywgMzgsIDYxLCAgMSwgIDIsICA1LCAgNywgIDksCisgICAgNDYsIDEwLCAzNCwgMzUsIDM2LCA1NSwgNTEsICA3LAorICAgIDQwLCAyMywgMzQsIDM3LCAgNSwgMTMsIDQyLCAxOCwKKyAgICAyNSwgMjcsIDI4LAogfTsKIAogLyogbW90aW9uIHZlY3RvciB0YWJsZSAxICovCiBzdGF0aWMgY29uc3QgdWludDE2X3QgdGFibGUxX212X2NvZGVbMTEwMF0gPSB7Ci0gMHgwMDAwLCAweDAwMDcsIDB4MDAwOSwgMHgwMDBmLCAweDAwMGEsIDB4MDAxMSwgMHgwMDFhLCAweDAwMWMsCi0gMHgwMDExLCAweDAwMzEsIDB4MDAyNSwgMHgwMDJkLCAweDAwMmYsIDB4MDA2ZiwgMHgwMDc1LCAweDAwNDEsCi0gMHgwMDRjLCAweDAwNGUsIDB4MDA1YywgMHgwMDYwLCAweDAwNjIsIDB4MDA2NiwgMHgwMDY4LCAweDAwNjksCi0gMHgwMDZiLCAweDAwYTYsIDB4MDBjMSwgMHgwMGNiLCAweDAwY2MsIDB4MDBjZSwgMHgwMGRhLCAweDAwZTgsCi0gMHgwMGVlLCAweDAwODcsIDB4MDA5MCwgMHgwMDllLCAweDAwOWYsIDB4MDBiYSwgMHgwMGNhLCAweDAwZDgsCi0gMHgwMGRiLCAweDAwZGYsIDB4MDEwNCwgMHgwMTA5LCAweDAxMGMsIDB4MDE0MywgMHgwMTQ1LCAweDAxNGEsCi0gMHgwMTU2LCAweDAxNWMsIDB4MDFiMywgMHgwMWQzLCAweDAxZGEsIDB4MDEwMywgMHgwMTA5LCAweDAxMGIsCi0gMHgwMTIyLCAweDAxMjcsIDB4MDEzNCwgMHgwMTYxLCAweDAxNjQsIDB4MDE3NiwgMHgwMTg0LCAweDAxOGQsCi0gMHgwMThlLCAweDAxOGYsIDB4MDE5MCwgMHgwMTkzLCAweDAxOTYsIDB4MDE5ZCwgMHgwMTllLCAweDAxOWYsCi0gMHgwMWE5LCAweDAxYjIsIDB4MDFiNCwgMHgwMWJhLCAweDAxYmIsIDB4MDFiYywgMHgwMjAxLCAweDAyMDIsCi0gMHgwMjA1LCAweDAyMDcsIDB4MDIwZCwgMHgwMjEwLCAweDAyMTEsIDB4MDIxNSwgMHgwMjFiLCAweDAyMWYsCi0gMHgwMjgxLCAweDAyODUsIDB4MDI5MCwgMHgwMjljLCAweDAyOWQsIDB4MDJhMiwgMHgwMmE3LCAweDAyYTgsCi0gMHgwMmFhLCAweDAyYjAsIDB4MDJiMSwgMHgwMmI0LCAweDAyYmMsIDB4MDJiZiwgMHgwMzIwLCAweDAzMjYsCi0gMHgwMzI3LCAweDAzMjksIDB4MDMyYSwgMHgwMzM2LCAweDAzNjAsIDB4MDM2MiwgMHgwMzYzLCAweDAzNzIsCi0gMHgwM2IyLCAweDAzYmMsIDB4MDNiZCwgMHgwMjAzLCAweDAyMDUsIDB4MDIxYSwgMHgwMjQ5LCAweDAyNGEsCi0gMHgwMjRjLCAweDAyYzcsIDB4MDJjYSwgMHgwMmNlLCAweDAyZWYsIDB4MDMwZCwgMHgwMzIyLCAweDAzMjUsCi0gMHgwMzM4LCAweDAzNzMsIDB4MDM3YSwgMHgwNDA5LCAweDA0MTUsIDB4MDQxNiwgMHgwNDE4LCAweDA0MjgsCi0gMHgwNDJkLCAweDA0MmYsIDB4MDQzNCwgMHgwNTA4LCAweDA1MDksIDB4MDUxMCwgMHgwNTExLCAweDA1MWMsCi0gMHgwNTFlLCAweDA1MjQsIDB4MDU0MSwgMHgwNTQzLCAweDA1NDYsIDB4MDU0NywgMHgwNTRkLCAweDA1NTcsCi0gMHgwNTVmLCAweDA1NmEsIDB4MDU2YywgMHgwNTZkLCAweDA1NmYsIDB4MDU3NiwgMHgwNTc3LCAweDA1N2EsCi0gMHgwNTdiLCAweDA1N2MsIDB4MDU3ZCwgMHgwNjAwLCAweDA2MDEsIDB4MDYwMywgMHgwNjE0LCAweDA2MTYsCi0gMHgwNjE3LCAweDA2MWMsIDB4MDYxZiwgMHgwNjQyLCAweDA2NDgsIDB4MDY0OSwgMHgwNjRhLCAweDA2NGIsCi0gMHgwNjU3LCAweDA2NjgsIDB4MDY2OSwgMHgwNjZiLCAweDA2NmUsIDB4MDY3ZiwgMHgwNmMyLCAweDA2YzgsCi0gMHgwNmNiLCAweDA2ZGUsIDB4MDZkZiwgMHgwNmUyLCAweDA2ZTMsIDB4MDZlZiwgMHgwNzQ4LCAweDA3NGIsCi0gMHgwNzZlLCAweDA3NmYsIDB4MDc3YywgMHgwNDA5LCAweDA0MjMsIDB4MDQyOCwgMHgwNDI5LCAweDA0MmEsCi0gMHgwNDJiLCAweDA0MzIsIDB4MDQzMywgMHgwNDk2LCAweDA0OWEsIDB4MDRkNSwgMHgwNGRiLCAweDA1ODEsCi0gMHgwNTgyLCAweDA1OGIsIDB4MDU4YywgMHgwNThkLCAweDA1OTgsIDB4MDU5OSwgMHgwNTlhLCAweDA1OWUsCi0gMHgwNWRkLCAweDA2MTksIDB4MDYzMiwgMHgwNjMzLCAweDA2NDgsIDB4MDY3MiwgMHgwNmExLCAweDA2YTIsCi0gMHgwNmEzLCAweDA2YWYsIDB4MDZlMiwgMHgwNmUzLCAweDA2ZTQsIDB4MDgwMCwgMHgwODAxLCAweDA4MDIsCi0gMHgwODAzLCAweDA4MWEsIDB4MDgxYiwgMHgwODI5LCAweDA4MmYsIDB4MDgzMiwgMHgwODNlLCAweDA4M2YsCi0gMHgwODUyLCAweDA4NTMsIDB4MDg1OCwgMHgwODZiLCAweDA4NzcsIDB4MDg3OCwgMHgwODc5LCAweDA4N2EsCi0gMHgwODdiLCAweDBhMDAsIDB4MGEwMSwgMHgwYTBkLCAweDBhMGUsIDB4MGEwZiwgMHgwYTI0LCAweDBhMzcsCi0gMHgwYTNhLCAweDBhM2IsIDB4MGEzZSwgMHgwYTQ2LCAweDBhNDcsIDB4MGE0YSwgMHgwYTRiLCAweDBhNWYsCi0gMHgwYTc5LCAweDBhN2EsIDB4MGE3YiwgMHgwYTgwLCAweDBhODEsIDB4MGE4NCwgMHgwYTg1LCAweDBhOTksCi0gMHgwYWE1LCAweDBhYTYsIDB4MGFiOCwgMHgwYWJhLCAweDBhYmIsIDB4MGFiYywgMHgwYWJkLCAweDBhYzgsCi0gMHgwYWNlLCAweDBhY2YsIDB4MGFkNywgMHgwYWRjLCAweDBhZWIsIDB4MGMwNCwgMHgwYzI1LCAweDBjMjYsCi0gMHgwYzI3LCAweDBjMmEsIDB4MGMyYiwgMHgwYzNhLCAweDBjM2IsIDB4MGMzYywgMHgwYzNkLCAweDBjYTAsCi0gMHgwY2FkLCAweDBjZDQsIDB4MGNkNSwgMHgwY2ZjLCAweDBjZmQsIDB4MGQ4NiwgMHgwZDkyLCAweDBkOTMsCi0gMHgwZDk0LCAweDBkOTUsIDB4MGRiMCwgMHgwZGI4LCAweDBkYjksIDB4MGRiYSwgMHgwZGJiLCAweDBkYzAsCi0gMHgwZGMyLCAweDBkYzMsIDB4MGRkYSwgMHgwZGRiLCAweDBkZGMsIDB4MGRkZCwgMHgwZTkyLCAweDBlOTMsCi0gMHgwZTk0LCAweDBlOTUsIDB4MGVjNywgMHgwZWNjLCAweDBlY2UsIDB4MGVjZiwgMHgwZWQ4LCAweDBlZDksCi0gMHgwZWRhLCAweDBlZGIsIDB4MDgwOCwgMHgwODA5LCAweDA4MGEsIDB4MDgxMCwgMHgwODExLCAweDA4NDQsCi0gMHgwODQ1LCAweDA4NjEsIDB4MDg2MiwgMHgwODYzLCAweDA4NmMsIDB4MDkyMiwgMHgwOTIzLCAweDA5MmUsCi0gMHgwOTJmLCAweDA5MzYsIDB4MDkzNywgMHgwOWIxLCAweDA5YjIsIDB4MDliMywgMHgwOWI0LCAweDA5YjUsCi0gMHgwOWI4LCAweDA5YjksIDB4MDliYSwgMHgwOWJiLCAweDA5YmMsIDB4MDliZCwgMHgwOWJlLCAweDA5YmYsCi0gMHgwYjAwLCAweDBiMTUsIDB4MGIyYywgMHgwYjJkLCAweDBiMmUsIDB4MGIyZiwgMHgwYjM2LCAweDBiYjksCi0gMHgwYzI4LCAweDBjMmEsIDB4MGMyYiwgMHgwYzJjLCAweDBjMmQsIDB4MGMyZSwgMHgwYzJmLCAweDBjMzAsCi0gMHgwYzMxLCAweDBjMzgsIDB4MGM2MCwgMHgwYzYxLCAweDBjNjIsIDB4MGM2MywgMHgwYzhkLCAweDBjOGUsCi0gMHgwYzhmLCAweDBjOTIsIDB4MGNiZSwgMHgwY2JmLCAweDBjZTYsIDB4MGNlNywgMHgwZDQwLCAweDBkNDEsCi0gMHgwZDU3LCAweDBkNTgsIDB4MGQ1OSwgMHgwZDVhLCAweDBkNWIsIDB4MGQ1YywgMHgwZDVkLCAweDBkOTgsCi0gMHgwZDk5LCAweDBkOWEsIDB4MGQ5YiwgMHgwZDljLCAweDBkOWQsIDB4MGRhZCwgMHgwZGFlLCAweDBkYWYsCi0gMHgwZGMwLCAweDBkYzEsIDB4MGRjMiwgMHgwZGMzLCAweDBkY2EsIDB4MGRjYiwgMHgwZGVjLCAweDBkZWQsCi0gMHgwZGVlLCAweDBkZWYsIDB4MTAxOCwgMHgxMDIyLCAweDEwMjMsIDB4MTAzMCwgMHgxMDMxLCAweDEwMzIsCi0gMHgxMDMzLCAweDEwNTAsIDB4MTA1MSwgMHgxMDVjLCAweDEwNzQsIDB4MTA3NSwgMHgxMDc2LCAweDEwNzcsCi0gMHgxMDc4LCAweDEwNzksIDB4MTA3YSwgMHgxMDdiLCAweDEwYjIsIDB4MTBiMywgMHgxMGI4LCAweDEwYjksCi0gMHgxMGJhLCAweDEwYmIsIDB4MTBkNCwgMHgxMGVhLCAweDEwZWIsIDB4MTBlYywgMHgxMGVkLCAweDE0MDQsCi0gMHgxNDA1LCAweDE0MDYsIDB4MTQwNywgMHgxNDEwLCAweDE0MTEsIDB4MTQxMiwgMHgxNDEzLCAweDE0MTQsCi0gMHgxNDE1LCAweDE0MTYsIDB4MTQxNywgMHgxNDE4LCAweDE0MTksIDB4MTQ2NiwgMHgxNDY3LCAweDE0NjgsCi0gMHgxNDY5LCAweDE0NmEsIDB4MTQ2YiwgMHgxNDZjLCAweDE0NmQsIDB4MTQ3ZSwgMHgxNDdmLCAweDE0ODgsCi0gMHgxNDg5LCAweDE0OGEsIDB4MTQ4YiwgMHgxNGI2LCAweDE0YjcsIDB4MTRiOCwgMHgxNGI5LCAweDE0YmEsCi0gMHgxNGJiLCAweDE0YmMsIDB4MTRiZCwgMHgxNGYwLCAweDE0ZjEsIDB4MTRmOCwgMHgxNGY5LCAweDE0ZmEsCi0gMHgxNGZiLCAweDE0ZmMsIDB4MTRmZCwgMHgxNGZlLCAweDE0ZmYsIDB4MTUyYSwgMHgxNTJiLCAweDE1MmMsCi0gMHgxNTJkLCAweDE1MmUsIDB4MTUyZiwgMHgxNTMwLCAweDE1MzEsIDB4MTU0OCwgMHgxNTQ5LCAweDE1NGUsCi0gMHgxNTRmLCAweDE1NTgsIDB4MTU1OSwgMHgxNTVhLCAweDE1NWIsIDB4MTU3MiwgMHgxNTlhLCAweDE1OWIsCi0gMHgxNWFjLCAweDE1YmEsIDB4MTViYiwgMHgxNWQwLCAweDE1ZDEsIDB4MTVkMiwgMHgxNWQzLCAweDE1ZDQsCi0gMHgxNWQ1LCAweDE4MWQsIDB4MTgxZSwgMHgxODFmLCAweDE4NDAsIDB4MTg0MSwgMHgxODQyLCAweDE4NDMsCi0gMHgxODQ0LCAweDE4NDUsIDB4MTg0NiwgMHgxODQ3LCAweDE4NDgsIDB4MTg0OSwgMHgxODYxLCAweDE4NjIsCi0gMHgxODYzLCAweDE4NjQsIDB4MTg2NSwgMHgxODY2LCAweDE4NjcsIDB4MTg2OCwgMHgxODY5LCAweDE4NmEsCi0gMHgxODZiLCAweDE4NmMsIDB4MTg2ZCwgMHgxODZlLCAweDE5MWIsIDB4MTkxYywgMHgxOTFkLCAweDE5MWUsCi0gMHgxOTFmLCAweDE5NDIsIDB4MTk0MywgMHgxOTQ0LCAweDE5NDUsIDB4MTk0NiwgMHgxOTQ3LCAweDE5NTgsCi0gMHgxOTU5LCAweDE5ZWQsIDB4MTllZSwgMHgxOWVmLCAweDE5ZjAsIDB4MTlmMSwgMHgxOWYyLCAweDE5ZjMsCi0gMHgxOWY0LCAweDE5ZjUsIDB4MTlmNiwgMHgxOWY3LCAweDFiMGUsIDB4MWIwZiwgMHgxYjYyLCAweDFiNjMsCi0gMHgxYjY0LCAweDFiNjUsIDB4MWI2NiwgMHgxYjY3LCAweDFiNjgsIDB4MWI2OSwgMHgxYjZhLCAweDFiNmIsCi0gMHgxYjZjLCAweDFiNmQsIDB4MWI2ZSwgMHgxYjZmLCAweDFiODIsIDB4MWJhOCwgMHgxYmE5LCAweDFiYWEsCi0gMHgxYmFiLCAweDFiYWMsIDB4MWJhZCwgMHgxYmFlLCAweDFiYWYsIDB4MWJiMCwgMHgxYmIxLCAweDFiYjIsCi0gMHgxYmIzLCAweDFkODAsIDB4MWQ4MSwgMHgxZDgyLCAweDFkODMsIDB4MWQ4NCwgMHgxZDg1LCAweDFkODYsCi0gMHgxZDg3LCAweDFkODgsIDB4MWQ4OSwgMHgxZDhhLCAweDFkOGIsIDB4MWQ4YywgMHgxZDhkLCAweDEwMDcsCi0gMHgxMDA4LCAweDEwMDksIDB4MTAwYSwgMHgxMDBiLCAweDEwMGMsIDB4MTAwZCwgMHgxMDBlLCAweDEwMGYsCi0gMHgxMDE2LCAweDEwODAsIDB4MTA4MSwgMHgxMDgyLCAweDEwODMsIDB4MTA4NCwgMHgxMDg1LCAweDEwODYsCi0gMHgxMDg3LCAweDEwYzAsIDB4MTIzYSwgMHgxMjNiLCAweDEyM2MsIDB4MTIzZCwgMHgxMjNlLCAweDEyM2YsCi0gMHgxMjQwLCAweDEyNDEsIDB4MTI0MiwgMHgxMjQzLCAweDEzNTAsIDB4MTM1MiwgMHgxMzUzLCAweDEzNTgsCi0gMHgxMzU5LCAweDEzNWEsIDB4MTM1YiwgMHgxMzVjLCAweDEzNWQsIDB4MTM1ZSwgMHgxMzVmLCAweDEzNjAsCi0gMHgxMzYxLCAweDE2MDIsIDB4MTYwMywgMHgxNjBjLCAweDE2MGQsIDB4MTYwZSwgMHgxNjBmLCAweDE2MjAsCi0gMHgxNjIxLCAweDE2MjIsIDB4MTYyMywgMHgxNjI0LCAweDE2MjUsIDB4MTYyNiwgMHgxNjI3LCAweDE2MjgsCi0gMHgxNjI5LCAweDE2NmUsIDB4MTY2ZiwgMHgxNjdjLCAweDE2N2QsIDB4MTY3ZSwgMHgxNjdmLCAweDE3NzAsCi0gMHgxNzcxLCAweDE4NTIsIDB4MTg1MywgMHgxODcyLCAweDE4NzMsIDB4MTg3NCwgMHgxODc1LCAweDE4NzYsCi0gMHgxODc3LCAweDE4NzgsIDB4MTg3OSwgMHgxODdhLCAweDE4N2IsIDB4MTg3YywgMHgxODdkLCAweDE4N2UsCi0gMHgxODdmLCAweDE5MTgsIDB4MTkxOSwgMHgxOTI2LCAweDE5MjcsIDB4MTk3MCwgMHgxOTcxLCAweDE5NzIsCi0gMHgxOTczLCAweDE5NzQsIDB4MTk3NSwgMHgxOTc2LCAweDE5NzcsIDB4MTk3OCwgMHgxOTc5LCAweDE5N2EsCi0gMHgxOTdiLCAweDFhYTAsIDB4MWFhMSwgMHgxYWEyLCAweDFhYTMsIDB4MWFhNCwgMHgxYWE1LCAweDFhYTYsCi0gMHgxYWE3LCAweDFhYTgsIDB4MWFhOSwgMHgxYWFhLCAweDFhYWIsIDB4MWFhYywgMHgxYWFkLCAweDFiM2MsCi0gMHgxYjNkLCAweDFiM2UsIDB4MWIzZiwgMHgxYjUwLCAweDFiNTEsIDB4MWI1MiwgMHgxYjUzLCAweDFiNTQsCi0gMHgxYjU1LCAweDFiNTYsIDB4MWI1NywgMHgxYjU4LCAweDFiNTksIDB4MjAzMiwgMHgyMDMzLCAweDIwMzQsCi0gMHgyMDM1LCAweDIwMzYsIDB4MjAzNywgMHgyMDM4LCAweDIwMzksIDB4MjAzYSwgMHgyMDNiLCAweDIwM2MsCi0gMHgyMDNkLCAweDIwM2UsIDB4MjAzZiwgMHgyMDQwLCAweDIwNDEsIDB4MjA0MiwgMHgyMDQzLCAweDIwYmEsCi0gMHgyMGJiLCAweDIwY2MsIDB4MjBjZCwgMHgyMGNlLCAweDIwY2YsIDB4MjBlMCwgMHgyMGUxLCAweDIwZTIsCi0gMHgyMGUzLCAweDIwZTQsIDB4MjBlNSwgMHgyMGU2LCAweDIwZTcsIDB4MjFhYSwgMHgyMWFiLCAweDIxYzAsCi0gMHgyMWMxLCAweDIxYzIsIDB4MjFjMywgMHgyMWM0LCAweDIxYzUsIDB4MjFjNiwgMHgyMWM3LCAweDIxYzgsCi0gMHgyMWM5LCAweDIxY2EsIDB4MjFjYiwgMHgyMWNjLCAweDIxY2QsIDB4MjFjZSwgMHgyMWNmLCAweDIxZDAsCi0gMHgyMWQxLCAweDIxZDIsIDB4MjFkMywgMHgyODk0LCAweDI4OTUsIDB4Mjg5NiwgMHgyODk3LCAweDI4OTgsCi0gMHgyODk5LCAweDI4OWEsIDB4Mjg5YiwgMHgyODljLCAweDI4OWQsIDB4Mjg5ZSwgMHgyODlmLCAweDI4YzAsCi0gMHgyOGMxLCAweDI4YzIsIDB4MjhjMywgMHgyOGM0LCAweDI4YzUsIDB4MjhjNiwgMHgyOGM3LCAweDI4YzgsCi0gMHgyOGM5LCAweDI4Y2EsIDB4MjhjYiwgMHgyOTMwLCAweDI5MzEsIDB4MjkzMiwgMHgyOTMzLCAweDI5MzQsCi0gMHgyOTM1LCAweDI5MzYsIDB4MjkzNywgMHgyOTM4LCAweDI5MzksIDB4MjkzYSwgMHgyOTNiLCAweDI5M2MsCi0gMHgyOTNkLCAweDI5M2UsIDB4MjkzZiwgMHgyOTYwLCAweDI5NjEsIDB4Mjk2MiwgMHgyOTYzLCAweDI5NjQsCi0gMHgyOTY1LCAweDI5NjYsIDB4Mjk2NywgMHgyOTY4LCAweDI5NjksIDB4Mjk2YSwgMHgyOTZiLCAweDJhNDAsCi0gMHgyYTQxLCAweDJhNDIsIDB4MmE0MywgMHgyYTQ0LCAweDJhNDUsIDB4MmE0NiwgMHgyYTQ3LCAweDJhNDgsCi0gMHgyYTQ5LCAweDJhNGEsIDB4MmE0YiwgMHgyYTRjLCAweDJhNGQsIDB4MmE0ZSwgMHgyYTRmLCAweDJhNTAsCi0gMHgyYTUxLCAweDJhNTIsIDB4MmE1MywgMHgyYWU2LCAweDJhZTcsIDB4MmIyNCwgMHgyYjI1LCAweDJiMjYsCi0gMHgyYjI3LCAweDJiMjgsIDB4MmIyOSwgMHgyYjJhLCAweDJiMmIsIDB4MmIyYywgMHgyYjJkLCAweDJiMmUsCi0gMHgyYjJmLCAweDJiMzAsIDB4MmIzMSwgMHgyYjMyLCAweDJiMzMsIDB4MmI1YSwgMHgyYjViLCAweDMwMTQsCi0gMHgzMDE1LCAweDMwMTYsIDB4MzAxNywgMHgzMDIwLCAweDMwMjEsIDB4MzAyMiwgMHgzMDIzLCAweDMwMjQsCi0gMHgzMDI1LCAweDMwMjYsIDB4MzAyNywgMHgzMDI4LCAweDMwMjksIDB4MzAyYSwgMHgzMDJiLCAweDMwMmMsCi0gMHgzMDJkLCAweDMwMmUsIDB4MzAyZiwgMHgzMDMwLCAweDMwMzEsIDB4MzAzMiwgMHgzMDMzLCAweDMwMzQsCi0gMHgzMDM1LCAweDMwMzYsIDB4MzAzNywgMHgzMDM4LCAweDMwMzksIDB4MzBjMCwgMHgzMGMxLCAweDMwZGUsCi0gMHgzMGRmLCAweDMyMTgsIDB4MzIxOSwgMHgzMjFhLCAweDMyMWIsIDB4MzIxYywgMHgzMjFkLCAweDMyMWUsCi0gMHgzMjFmLCAweDMyMjAsIDB4MzIyMSwgMHgzMjIyLCAweDMyMjMsIDB4MzIyNCwgMHgzMjI1LCAweDMyMjYsCi0gMHgzMjI3LCAweDMyMjgsIDB4MzIyOSwgMHgzMjJhLCAweDMyMmIsIDB4MzIyYywgMHgzMjJkLCAweDMyMmUsCi0gMHgzMjJmLCAweDMyMzAsIDB4MzIzMSwgMHgzMjMyLCAweDMyMzMsIDB4MzIzNCwgMHgzMjM1LCAweDMzNzgsCi0gMHgzMzc5LCAweDMzN2EsIDB4MzM3YiwgMHgzMzdjLCAweDMzN2QsIDB4MzM3ZSwgMHgzMzdmLCAweDMzYzAsCi0gMHgzM2MxLCAweDMzYzIsIDB4MzNjMywgMHgzM2M0LCAweDMzYzUsIDB4MzNjNiwgMHgzM2M3LCAweDMzYzgsCi0gMHgzM2M5LCAweDMzY2EsIDB4MzNjYiwgMHgzM2NjLCAweDMzY2QsIDB4MzNjZSwgMHgzM2NmLCAweDMzZDAsCi0gMHgzM2QxLCAweDMzZDIsIDB4MzNkMywgMHgzM2Q0LCAweDMzZDUsIDB4MzNkNiwgMHgzM2Q3LCAweDMzZDgsCi0gMHgzM2Q5LCAweDM3MDYsIDB4MzcwNywgMHgzNzMwLCAweDM3MzEsIDB4MzczMiwgMHgzNzMzLCAweDM3MzQsCi0gMHgzNzM1LCAweDM3MzYsIDB4MzczNywgMHgzNzM4LCAweDM3MzksIDB4MzczYSwgMHgzNzNiLCAweDM3M2MsCi0gMHgzNzNkLCAweDM3M2UsIDB4MzczZiwgMHgzNzQwLCAweDM3NDEsIDB4Mzc0MiwgMHgzNzQzLCAweDM3NDQsCi0gMHgzNzQ1LCAweDM3NDYsIDB4Mzc0NywgMHgzNzQ4LCAweDM3NDksIDB4Mzc0YSwgMHgzNzRiLCAweDM3NGMsCi0gMHgzNzRkLCAweDM3NGUsIDB4Mzc0ZiwgMHgzYjM0LCAweDNiMzUsIDB4M2IzNiwgMHgzYjM3LCAweDNiZTgsCi0gMHgzYmU5LCAweDNiZWEsIDB4M2JlYiwgMHgzYmVjLCAweDNiZWQsIDB4M2JlZSwgMHgzYmVmLCAweDNiZjAsCi0gMHgzYmYxLCAweDNiZjIsIDB4M2JmMywgMHgzYmY0LCAweDNiZjUsIDB4M2JmNiwgMHgzYmY3LCAweDNiZjgsCi0gMHgzYmY5LCAweDNiZmEsIDB4M2JmYiwgMHgzYmZjLCAweDNiZmQsIDB4M2JmZSwgMHgzYmZmLCAweDIwMDAsCi0gMHgyMDAxLCAweDIwMDIsIDB4MjAwMywgMHgyMDA0LCAweDIwMDUsIDB4MjAwNiwgMHgyMDA3LCAweDIwMDgsCi0gMHgyMDA5LCAweDIwMGEsIDB4MjAwYiwgMHgyMDBjLCAweDIwMGQsIDB4MjAyZSwgMHgyMDJmLCAweDIxODIsCi0gMHgyMTgzLCAweDIxYjQsIDB4MjFiNSwgMHgyMWI2LCAweDIxYjcsIDB4MjFiOCwgMHgyMWI5LCAweDIxYmEsCi0gMHgyMWJiLCAweDIxYmMsIDB4MjFiZCwgMHgyMWJlLCAweDIxYmYsIDB4MjQ2MCwgMHgyNDYxLCAweDI0NjIsCi0gMHgyNDYzLCAweDI0NjQsIDB4MjQ2NSwgMHgyNDY2LCAweDI0NjcsIDB4MjQ2OCwgMHgyNDY5LCAweDI0NmEsCi0gMHgyNDZiLCAweDI0NmMsIDB4MjQ2ZCwgMHgyNDZlLCAweDI0NmYsIDB4MjQ3MCwgMHgyNDcxLCAweDI0NzIsCi0gMHgyNDczLCAweDI2YTIsIDB4MjZhMywgMHgwMDBiLAorICAgIDB4MDAwMCwgMHgwMDA3LCAweDAwMDksIDB4MDAwZiwgMHgwMDBhLCAweDAwMTEsIDB4MDAxYSwgMHgwMDFjLAorICAgIDB4MDAxMSwgMHgwMDMxLCAweDAwMjUsIDB4MDAyZCwgMHgwMDJmLCAweDAwNmYsIDB4MDA3NSwgMHgwMDQxLAorICAgIDB4MDA0YywgMHgwMDRlLCAweDAwNWMsIDB4MDA2MCwgMHgwMDYyLCAweDAwNjYsIDB4MDA2OCwgMHgwMDY5LAorICAgIDB4MDA2YiwgMHgwMGE2LCAweDAwYzEsIDB4MDBjYiwgMHgwMGNjLCAweDAwY2UsIDB4MDBkYSwgMHgwMGU4LAorICAgIDB4MDBlZSwgMHgwMDg3LCAweDAwOTAsIDB4MDA5ZSwgMHgwMDlmLCAweDAwYmEsIDB4MDBjYSwgMHgwMGQ4LAorICAgIDB4MDBkYiwgMHgwMGRmLCAweDAxMDQsIDB4MDEwOSwgMHgwMTBjLCAweDAxNDMsIDB4MDE0NSwgMHgwMTRhLAorICAgIDB4MDE1NiwgMHgwMTVjLCAweDAxYjMsIDB4MDFkMywgMHgwMWRhLCAweDAxMDMsIDB4MDEwOSwgMHgwMTBiLAorICAgIDB4MDEyMiwgMHgwMTI3LCAweDAxMzQsIDB4MDE2MSwgMHgwMTY0LCAweDAxNzYsIDB4MDE4NCwgMHgwMThkLAorICAgIDB4MDE4ZSwgMHgwMThmLCAweDAxOTAsIDB4MDE5MywgMHgwMTk2LCAweDAxOWQsIDB4MDE5ZSwgMHgwMTlmLAorICAgIDB4MDFhOSwgMHgwMWIyLCAweDAxYjQsIDB4MDFiYSwgMHgwMWJiLCAweDAxYmMsIDB4MDIwMSwgMHgwMjAyLAorICAgIDB4MDIwNSwgMHgwMjA3LCAweDAyMGQsIDB4MDIxMCwgMHgwMjExLCAweDAyMTUsIDB4MDIxYiwgMHgwMjFmLAorICAgIDB4MDI4MSwgMHgwMjg1LCAweDAyOTAsIDB4MDI5YywgMHgwMjlkLCAweDAyYTIsIDB4MDJhNywgMHgwMmE4LAorICAgIDB4MDJhYSwgMHgwMmIwLCAweDAyYjEsIDB4MDJiNCwgMHgwMmJjLCAweDAyYmYsIDB4MDMyMCwgMHgwMzI2LAorICAgIDB4MDMyNywgMHgwMzI5LCAweDAzMmEsIDB4MDMzNiwgMHgwMzYwLCAweDAzNjIsIDB4MDM2MywgMHgwMzcyLAorICAgIDB4MDNiMiwgMHgwM2JjLCAweDAzYmQsIDB4MDIwMywgMHgwMjA1LCAweDAyMWEsIDB4MDI0OSwgMHgwMjRhLAorICAgIDB4MDI0YywgMHgwMmM3LCAweDAyY2EsIDB4MDJjZSwgMHgwMmVmLCAweDAzMGQsIDB4MDMyMiwgMHgwMzI1LAorICAgIDB4MDMzOCwgMHgwMzczLCAweDAzN2EsIDB4MDQwOSwgMHgwNDE1LCAweDA0MTYsIDB4MDQxOCwgMHgwNDI4LAorICAgIDB4MDQyZCwgMHgwNDJmLCAweDA0MzQsIDB4MDUwOCwgMHgwNTA5LCAweDA1MTAsIDB4MDUxMSwgMHgwNTFjLAorICAgIDB4MDUxZSwgMHgwNTI0LCAweDA1NDEsIDB4MDU0MywgMHgwNTQ2LCAweDA1NDcsIDB4MDU0ZCwgMHgwNTU3LAorICAgIDB4MDU1ZiwgMHgwNTZhLCAweDA1NmMsIDB4MDU2ZCwgMHgwNTZmLCAweDA1NzYsIDB4MDU3NywgMHgwNTdhLAorICAgIDB4MDU3YiwgMHgwNTdjLCAweDA1N2QsIDB4MDYwMCwgMHgwNjAxLCAweDA2MDMsIDB4MDYxNCwgMHgwNjE2LAorICAgIDB4MDYxNywgMHgwNjFjLCAweDA2MWYsIDB4MDY0MiwgMHgwNjQ4LCAweDA2NDksIDB4MDY0YSwgMHgwNjRiLAorICAgIDB4MDY1NywgMHgwNjY4LCAweDA2NjksIDB4MDY2YiwgMHgwNjZlLCAweDA2N2YsIDB4MDZjMiwgMHgwNmM4LAorICAgIDB4MDZjYiwgMHgwNmRlLCAweDA2ZGYsIDB4MDZlMiwgMHgwNmUzLCAweDA2ZWYsIDB4MDc0OCwgMHgwNzRiLAorICAgIDB4MDc2ZSwgMHgwNzZmLCAweDA3N2MsIDB4MDQwOSwgMHgwNDIzLCAweDA0MjgsIDB4MDQyOSwgMHgwNDJhLAorICAgIDB4MDQyYiwgMHgwNDMyLCAweDA0MzMsIDB4MDQ5NiwgMHgwNDlhLCAweDA0ZDUsIDB4MDRkYiwgMHgwNTgxLAorICAgIDB4MDU4MiwgMHgwNThiLCAweDA1OGMsIDB4MDU4ZCwgMHgwNTk4LCAweDA1OTksIDB4MDU5YSwgMHgwNTllLAorICAgIDB4MDVkZCwgMHgwNjE5LCAweDA2MzIsIDB4MDYzMywgMHgwNjQ4LCAweDA2NzIsIDB4MDZhMSwgMHgwNmEyLAorICAgIDB4MDZhMywgMHgwNmFmLCAweDA2ZTIsIDB4MDZlMywgMHgwNmU0LCAweDA4MDAsIDB4MDgwMSwgMHgwODAyLAorICAgIDB4MDgwMywgMHgwODFhLCAweDA4MWIsIDB4MDgyOSwgMHgwODJmLCAweDA4MzIsIDB4MDgzZSwgMHgwODNmLAorICAgIDB4MDg1MiwgMHgwODUzLCAweDA4NTgsIDB4MDg2YiwgMHgwODc3LCAweDA4NzgsIDB4MDg3OSwgMHgwODdhLAorICAgIDB4MDg3YiwgMHgwYTAwLCAweDBhMDEsIDB4MGEwZCwgMHgwYTBlLCAweDBhMGYsIDB4MGEyNCwgMHgwYTM3LAorICAgIDB4MGEzYSwgMHgwYTNiLCAweDBhM2UsIDB4MGE0NiwgMHgwYTQ3LCAweDBhNGEsIDB4MGE0YiwgMHgwYTVmLAorICAgIDB4MGE3OSwgMHgwYTdhLCAweDBhN2IsIDB4MGE4MCwgMHgwYTgxLCAweDBhODQsIDB4MGE4NSwgMHgwYTk5LAorICAgIDB4MGFhNSwgMHgwYWE2LCAweDBhYjgsIDB4MGFiYSwgMHgwYWJiLCAweDBhYmMsIDB4MGFiZCwgMHgwYWM4LAorICAgIDB4MGFjZSwgMHgwYWNmLCAweDBhZDcsIDB4MGFkYywgMHgwYWViLCAweDBjMDQsIDB4MGMyNSwgMHgwYzI2LAorICAgIDB4MGMyNywgMHgwYzJhLCAweDBjMmIsIDB4MGMzYSwgMHgwYzNiLCAweDBjM2MsIDB4MGMzZCwgMHgwY2EwLAorICAgIDB4MGNhZCwgMHgwY2Q0LCAweDBjZDUsIDB4MGNmYywgMHgwY2ZkLCAweDBkODYsIDB4MGQ5MiwgMHgwZDkzLAorICAgIDB4MGQ5NCwgMHgwZDk1LCAweDBkYjAsIDB4MGRiOCwgMHgwZGI5LCAweDBkYmEsIDB4MGRiYiwgMHgwZGMwLAorICAgIDB4MGRjMiwgMHgwZGMzLCAweDBkZGEsIDB4MGRkYiwgMHgwZGRjLCAweDBkZGQsIDB4MGU5MiwgMHgwZTkzLAorICAgIDB4MGU5NCwgMHgwZTk1LCAweDBlYzcsIDB4MGVjYywgMHgwZWNlLCAweDBlY2YsIDB4MGVkOCwgMHgwZWQ5LAorICAgIDB4MGVkYSwgMHgwZWRiLCAweDA4MDgsIDB4MDgwOSwgMHgwODBhLCAweDA4MTAsIDB4MDgxMSwgMHgwODQ0LAorICAgIDB4MDg0NSwgMHgwODYxLCAweDA4NjIsIDB4MDg2MywgMHgwODZjLCAweDA5MjIsIDB4MDkyMywgMHgwOTJlLAorICAgIDB4MDkyZiwgMHgwOTM2LCAweDA5MzcsIDB4MDliMSwgMHgwOWIyLCAweDA5YjMsIDB4MDliNCwgMHgwOWI1LAorICAgIDB4MDliOCwgMHgwOWI5LCAweDA5YmEsIDB4MDliYiwgMHgwOWJjLCAweDA5YmQsIDB4MDliZSwgMHgwOWJmLAorICAgIDB4MGIwMCwgMHgwYjE1LCAweDBiMmMsIDB4MGIyZCwgMHgwYjJlLCAweDBiMmYsIDB4MGIzNiwgMHgwYmI5LAorICAgIDB4MGMyOCwgMHgwYzJhLCAweDBjMmIsIDB4MGMyYywgMHgwYzJkLCAweDBjMmUsIDB4MGMyZiwgMHgwYzMwLAorICAgIDB4MGMzMSwgMHgwYzM4LCAweDBjNjAsIDB4MGM2MSwgMHgwYzYyLCAweDBjNjMsIDB4MGM4ZCwgMHgwYzhlLAorICAgIDB4MGM4ZiwgMHgwYzkyLCAweDBjYmUsIDB4MGNiZiwgMHgwY2U2LCAweDBjZTcsIDB4MGQ0MCwgMHgwZDQxLAorICAgIDB4MGQ1NywgMHgwZDU4LCAweDBkNTksIDB4MGQ1YSwgMHgwZDViLCAweDBkNWMsIDB4MGQ1ZCwgMHgwZDk4LAorICAgIDB4MGQ5OSwgMHgwZDlhLCAweDBkOWIsIDB4MGQ5YywgMHgwZDlkLCAweDBkYWQsIDB4MGRhZSwgMHgwZGFmLAorICAgIDB4MGRjMCwgMHgwZGMxLCAweDBkYzIsIDB4MGRjMywgMHgwZGNhLCAweDBkY2IsIDB4MGRlYywgMHgwZGVkLAorICAgIDB4MGRlZSwgMHgwZGVmLCAweDEwMTgsIDB4MTAyMiwgMHgxMDIzLCAweDEwMzAsIDB4MTAzMSwgMHgxMDMyLAorICAgIDB4MTAzMywgMHgxMDUwLCAweDEwNTEsIDB4MTA1YywgMHgxMDc0LCAweDEwNzUsIDB4MTA3NiwgMHgxMDc3LAorICAgIDB4MTA3OCwgMHgxMDc5LCAweDEwN2EsIDB4MTA3YiwgMHgxMGIyLCAweDEwYjMsIDB4MTBiOCwgMHgxMGI5LAorICAgIDB4MTBiYSwgMHgxMGJiLCAweDEwZDQsIDB4MTBlYSwgMHgxMGViLCAweDEwZWMsIDB4MTBlZCwgMHgxNDA0LAorICAgIDB4MTQwNSwgMHgxNDA2LCAweDE0MDcsIDB4MTQxMCwgMHgxNDExLCAweDE0MTIsIDB4MTQxMywgMHgxNDE0LAorICAgIDB4MTQxNSwgMHgxNDE2LCAweDE0MTcsIDB4MTQxOCwgMHgxNDE5LCAweDE0NjYsIDB4MTQ2NywgMHgxNDY4LAorICAgIDB4MTQ2OSwgMHgxNDZhLCAweDE0NmIsIDB4MTQ2YywgMHgxNDZkLCAweDE0N2UsIDB4MTQ3ZiwgMHgxNDg4LAorICAgIDB4MTQ4OSwgMHgxNDhhLCAweDE0OGIsIDB4MTRiNiwgMHgxNGI3LCAweDE0YjgsIDB4MTRiOSwgMHgxNGJhLAorICAgIDB4MTRiYiwgMHgxNGJjLCAweDE0YmQsIDB4MTRmMCwgMHgxNGYxLCAweDE0ZjgsIDB4MTRmOSwgMHgxNGZhLAorICAgIDB4MTRmYiwgMHgxNGZjLCAweDE0ZmQsIDB4MTRmZSwgMHgxNGZmLCAweDE1MmEsIDB4MTUyYiwgMHgxNTJjLAorICAgIDB4MTUyZCwgMHgxNTJlLCAweDE1MmYsIDB4MTUzMCwgMHgxNTMxLCAweDE1NDgsIDB4MTU0OSwgMHgxNTRlLAorICAgIDB4MTU0ZiwgMHgxNTU4LCAweDE1NTksIDB4MTU1YSwgMHgxNTViLCAweDE1NzIsIDB4MTU5YSwgMHgxNTliLAorICAgIDB4MTVhYywgMHgxNWJhLCAweDE1YmIsIDB4MTVkMCwgMHgxNWQxLCAweDE1ZDIsIDB4MTVkMywgMHgxNWQ0LAorICAgIDB4MTVkNSwgMHgxODFkLCAweDE4MWUsIDB4MTgxZiwgMHgxODQwLCAweDE4NDEsIDB4MTg0MiwgMHgxODQzLAorICAgIDB4MTg0NCwgMHgxODQ1LCAweDE4NDYsIDB4MTg0NywgMHgxODQ4LCAweDE4NDksIDB4MTg2MSwgMHgxODYyLAorICAgIDB4MTg2MywgMHgxODY0LCAweDE4NjUsIDB4MTg2NiwgMHgxODY3LCAweDE4NjgsIDB4MTg2OSwgMHgxODZhLAorICAgIDB4MTg2YiwgMHgxODZjLCAweDE4NmQsIDB4MTg2ZSwgMHgxOTFiLCAweDE5MWMsIDB4MTkxZCwgMHgxOTFlLAorICAgIDB4MTkxZiwgMHgxOTQyLCAweDE5NDMsIDB4MTk0NCwgMHgxOTQ1LCAweDE5NDYsIDB4MTk0NywgMHgxOTU4LAorICAgIDB4MTk1OSwgMHgxOWVkLCAweDE5ZWUsIDB4MTllZiwgMHgxOWYwLCAweDE5ZjEsIDB4MTlmMiwgMHgxOWYzLAorICAgIDB4MTlmNCwgMHgxOWY1LCAweDE5ZjYsIDB4MTlmNywgMHgxYjBlLCAweDFiMGYsIDB4MWI2MiwgMHgxYjYzLAorICAgIDB4MWI2NCwgMHgxYjY1LCAweDFiNjYsIDB4MWI2NywgMHgxYjY4LCAweDFiNjksIDB4MWI2YSwgMHgxYjZiLAorICAgIDB4MWI2YywgMHgxYjZkLCAweDFiNmUsIDB4MWI2ZiwgMHgxYjgyLCAweDFiYTgsIDB4MWJhOSwgMHgxYmFhLAorICAgIDB4MWJhYiwgMHgxYmFjLCAweDFiYWQsIDB4MWJhZSwgMHgxYmFmLCAweDFiYjAsIDB4MWJiMSwgMHgxYmIyLAorICAgIDB4MWJiMywgMHgxZDgwLCAweDFkODEsIDB4MWQ4MiwgMHgxZDgzLCAweDFkODQsIDB4MWQ4NSwgMHgxZDg2LAorICAgIDB4MWQ4NywgMHgxZDg4LCAweDFkODksIDB4MWQ4YSwgMHgxZDhiLCAweDFkOGMsIDB4MWQ4ZCwgMHgxMDA3LAorICAgIDB4MTAwOCwgMHgxMDA5LCAweDEwMGEsIDB4MTAwYiwgMHgxMDBjLCAweDEwMGQsIDB4MTAwZSwgMHgxMDBmLAorICAgIDB4MTAxNiwgMHgxMDgwLCAweDEwODEsIDB4MTA4MiwgMHgxMDgzLCAweDEwODQsIDB4MTA4NSwgMHgxMDg2LAorICAgIDB4MTA4NywgMHgxMGMwLCAweDEyM2EsIDB4MTIzYiwgMHgxMjNjLCAweDEyM2QsIDB4MTIzZSwgMHgxMjNmLAorICAgIDB4MTI0MCwgMHgxMjQxLCAweDEyNDIsIDB4MTI0MywgMHgxMzUwLCAweDEzNTIsIDB4MTM1MywgMHgxMzU4LAorICAgIDB4MTM1OSwgMHgxMzVhLCAweDEzNWIsIDB4MTM1YywgMHgxMzVkLCAweDEzNWUsIDB4MTM1ZiwgMHgxMzYwLAorICAgIDB4MTM2MSwgMHgxNjAyLCAweDE2MDMsIDB4MTYwYywgMHgxNjBkLCAweDE2MGUsIDB4MTYwZiwgMHgxNjIwLAorICAgIDB4MTYyMSwgMHgxNjIyLCAweDE2MjMsIDB4MTYyNCwgMHgxNjI1LCAweDE2MjYsIDB4MTYyNywgMHgxNjI4LAorICAgIDB4MTYyOSwgMHgxNjZlLCAweDE2NmYsIDB4MTY3YywgMHgxNjdkLCAweDE2N2UsIDB4MTY3ZiwgMHgxNzcwLAorICAgIDB4MTc3MSwgMHgxODUyLCAweDE4NTMsIDB4MTg3MiwgMHgxODczLCAweDE4NzQsIDB4MTg3NSwgMHgxODc2LAorICAgIDB4MTg3NywgMHgxODc4LCAweDE4NzksIDB4MTg3YSwgMHgxODdiLCAweDE4N2MsIDB4MTg3ZCwgMHgxODdlLAorICAgIDB4MTg3ZiwgMHgxOTE4LCAweDE5MTksIDB4MTkyNiwgMHgxOTI3LCAweDE5NzAsIDB4MTk3MSwgMHgxOTcyLAorICAgIDB4MTk3MywgMHgxOTc0LCAweDE5NzUsIDB4MTk3NiwgMHgxOTc3LCAweDE5NzgsIDB4MTk3OSwgMHgxOTdhLAorICAgIDB4MTk3YiwgMHgxYWEwLCAweDFhYTEsIDB4MWFhMiwgMHgxYWEzLCAweDFhYTQsIDB4MWFhNSwgMHgxYWE2LAorICAgIDB4MWFhNywgMHgxYWE4LCAweDFhYTksIDB4MWFhYSwgMHgxYWFiLCAweDFhYWMsIDB4MWFhZCwgMHgxYjNjLAorICAgIDB4MWIzZCwgMHgxYjNlLCAweDFiM2YsIDB4MWI1MCwgMHgxYjUxLCAweDFiNTIsIDB4MWI1MywgMHgxYjU0LAorICAgIDB4MWI1NSwgMHgxYjU2LCAweDFiNTcsIDB4MWI1OCwgMHgxYjU5LCAweDIwMzIsIDB4MjAzMywgMHgyMDM0LAorICAgIDB4MjAzNSwgMHgyMDM2LCAweDIwMzcsIDB4MjAzOCwgMHgyMDM5LCAweDIwM2EsIDB4MjAzYiwgMHgyMDNjLAorICAgIDB4MjAzZCwgMHgyMDNlLCAweDIwM2YsIDB4MjA0MCwgMHgyMDQxLCAweDIwNDIsIDB4MjA0MywgMHgyMGJhLAorICAgIDB4MjBiYiwgMHgyMGNjLCAweDIwY2QsIDB4MjBjZSwgMHgyMGNmLCAweDIwZTAsIDB4MjBlMSwgMHgyMGUyLAorICAgIDB4MjBlMywgMHgyMGU0LCAweDIwZTUsIDB4MjBlNiwgMHgyMGU3LCAweDIxYWEsIDB4MjFhYiwgMHgyMWMwLAorICAgIDB4MjFjMSwgMHgyMWMyLCAweDIxYzMsIDB4MjFjNCwgMHgyMWM1LCAweDIxYzYsIDB4MjFjNywgMHgyMWM4LAorICAgIDB4MjFjOSwgMHgyMWNhLCAweDIxY2IsIDB4MjFjYywgMHgyMWNkLCAweDIxY2UsIDB4MjFjZiwgMHgyMWQwLAorICAgIDB4MjFkMSwgMHgyMWQyLCAweDIxZDMsIDB4Mjg5NCwgMHgyODk1LCAweDI4OTYsIDB4Mjg5NywgMHgyODk4LAorICAgIDB4Mjg5OSwgMHgyODlhLCAweDI4OWIsIDB4Mjg5YywgMHgyODlkLCAweDI4OWUsIDB4Mjg5ZiwgMHgyOGMwLAorICAgIDB4MjhjMSwgMHgyOGMyLCAweDI4YzMsIDB4MjhjNCwgMHgyOGM1LCAweDI4YzYsIDB4MjhjNywgMHgyOGM4LAorICAgIDB4MjhjOSwgMHgyOGNhLCAweDI4Y2IsIDB4MjkzMCwgMHgyOTMxLCAweDI5MzIsIDB4MjkzMywgMHgyOTM0LAorICAgIDB4MjkzNSwgMHgyOTM2LCAweDI5MzcsIDB4MjkzOCwgMHgyOTM5LCAweDI5M2EsIDB4MjkzYiwgMHgyOTNjLAorICAgIDB4MjkzZCwgMHgyOTNlLCAweDI5M2YsIDB4Mjk2MCwgMHgyOTYxLCAweDI5NjIsIDB4Mjk2MywgMHgyOTY0LAorICAgIDB4Mjk2NSwgMHgyOTY2LCAweDI5NjcsIDB4Mjk2OCwgMHgyOTY5LCAweDI5NmEsIDB4Mjk2YiwgMHgyYTQwLAorICAgIDB4MmE0MSwgMHgyYTQyLCAweDJhNDMsIDB4MmE0NCwgMHgyYTQ1LCAweDJhNDYsIDB4MmE0NywgMHgyYTQ4LAorICAgIDB4MmE0OSwgMHgyYTRhLCAweDJhNGIsIDB4MmE0YywgMHgyYTRkLCAweDJhNGUsIDB4MmE0ZiwgMHgyYTUwLAorICAgIDB4MmE1MSwgMHgyYTUyLCAweDJhNTMsIDB4MmFlNiwgMHgyYWU3LCAweDJiMjQsIDB4MmIyNSwgMHgyYjI2LAorICAgIDB4MmIyNywgMHgyYjI4LCAweDJiMjksIDB4MmIyYSwgMHgyYjJiLCAweDJiMmMsIDB4MmIyZCwgMHgyYjJlLAorICAgIDB4MmIyZiwgMHgyYjMwLCAweDJiMzEsIDB4MmIzMiwgMHgyYjMzLCAweDJiNWEsIDB4MmI1YiwgMHgzMDE0LAorICAgIDB4MzAxNSwgMHgzMDE2LCAweDMwMTcsIDB4MzAyMCwgMHgzMDIxLCAweDMwMjIsIDB4MzAyMywgMHgzMDI0LAorICAgIDB4MzAyNSwgMHgzMDI2LCAweDMwMjcsIDB4MzAyOCwgMHgzMDI5LCAweDMwMmEsIDB4MzAyYiwgMHgzMDJjLAorICAgIDB4MzAyZCwgMHgzMDJlLCAweDMwMmYsIDB4MzAzMCwgMHgzMDMxLCAweDMwMzIsIDB4MzAzMywgMHgzMDM0LAorICAgIDB4MzAzNSwgMHgzMDM2LCAweDMwMzcsIDB4MzAzOCwgMHgzMDM5LCAweDMwYzAsIDB4MzBjMSwgMHgzMGRlLAorICAgIDB4MzBkZiwgMHgzMjE4LCAweDMyMTksIDB4MzIxYSwgMHgzMjFiLCAweDMyMWMsIDB4MzIxZCwgMHgzMjFlLAorICAgIDB4MzIxZiwgMHgzMjIwLCAweDMyMjEsIDB4MzIyMiwgMHgzMjIzLCAweDMyMjQsIDB4MzIyNSwgMHgzMjI2LAorICAgIDB4MzIyNywgMHgzMjI4LCAweDMyMjksIDB4MzIyYSwgMHgzMjJiLCAweDMyMmMsIDB4MzIyZCwgMHgzMjJlLAorICAgIDB4MzIyZiwgMHgzMjMwLCAweDMyMzEsIDB4MzIzMiwgMHgzMjMzLCAweDMyMzQsIDB4MzIzNSwgMHgzMzc4LAorICAgIDB4MzM3OSwgMHgzMzdhLCAweDMzN2IsIDB4MzM3YywgMHgzMzdkLCAweDMzN2UsIDB4MzM3ZiwgMHgzM2MwLAorICAgIDB4MzNjMSwgMHgzM2MyLCAweDMzYzMsIDB4MzNjNCwgMHgzM2M1LCAweDMzYzYsIDB4MzNjNywgMHgzM2M4LAorICAgIDB4MzNjOSwgMHgzM2NhLCAweDMzY2IsIDB4MzNjYywgMHgzM2NkLCAweDMzY2UsIDB4MzNjZiwgMHgzM2QwLAorICAgIDB4MzNkMSwgMHgzM2QyLCAweDMzZDMsIDB4MzNkNCwgMHgzM2Q1LCAweDMzZDYsIDB4MzNkNywgMHgzM2Q4LAorICAgIDB4MzNkOSwgMHgzNzA2LCAweDM3MDcsIDB4MzczMCwgMHgzNzMxLCAweDM3MzIsIDB4MzczMywgMHgzNzM0LAorICAgIDB4MzczNSwgMHgzNzM2LCAweDM3MzcsIDB4MzczOCwgMHgzNzM5LCAweDM3M2EsIDB4MzczYiwgMHgzNzNjLAorICAgIDB4MzczZCwgMHgzNzNlLCAweDM3M2YsIDB4Mzc0MCwgMHgzNzQxLCAweDM3NDIsIDB4Mzc0MywgMHgzNzQ0LAorICAgIDB4Mzc0NSwgMHgzNzQ2LCAweDM3NDcsIDB4Mzc0OCwgMHgzNzQ5LCAweDM3NGEsIDB4Mzc0YiwgMHgzNzRjLAorICAgIDB4Mzc0ZCwgMHgzNzRlLCAweDM3NGYsIDB4M2IzNCwgMHgzYjM1LCAweDNiMzYsIDB4M2IzNywgMHgzYmU4LAorICAgIDB4M2JlOSwgMHgzYmVhLCAweDNiZWIsIDB4M2JlYywgMHgzYmVkLCAweDNiZWUsIDB4M2JlZiwgMHgzYmYwLAorICAgIDB4M2JmMSwgMHgzYmYyLCAweDNiZjMsIDB4M2JmNCwgMHgzYmY1LCAweDNiZjYsIDB4M2JmNywgMHgzYmY4LAorICAgIDB4M2JmOSwgMHgzYmZhLCAweDNiZmIsIDB4M2JmYywgMHgzYmZkLCAweDNiZmUsIDB4M2JmZiwgMHgyMDAwLAorICAgIDB4MjAwMSwgMHgyMDAyLCAweDIwMDMsIDB4MjAwNCwgMHgyMDA1LCAweDIwMDYsIDB4MjAwNywgMHgyMDA4LAorICAgIDB4MjAwOSwgMHgyMDBhLCAweDIwMGIsIDB4MjAwYywgMHgyMDBkLCAweDIwMmUsIDB4MjAyZiwgMHgyMTgyLAorICAgIDB4MjE4MywgMHgyMWI0LCAweDIxYjUsIDB4MjFiNiwgMHgyMWI3LCAweDIxYjgsIDB4MjFiOSwgMHgyMWJhLAorICAgIDB4MjFiYiwgMHgyMWJjLCAweDIxYmQsIDB4MjFiZSwgMHgyMWJmLCAweDI0NjAsIDB4MjQ2MSwgMHgyNDYyLAorICAgIDB4MjQ2MywgMHgyNDY0LCAweDI0NjUsIDB4MjQ2NiwgMHgyNDY3LCAweDI0NjgsIDB4MjQ2OSwgMHgyNDZhLAorICAgIDB4MjQ2YiwgMHgyNDZjLCAweDI0NmQsIDB4MjQ2ZSwgMHgyNDZmLCAweDI0NzAsIDB4MjQ3MSwgMHgyNDcyLAorICAgIDB4MjQ3MywgMHgyNmEyLCAweDI2YTMsIDB4MDAwYiwKIH07CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlMV9tdl9iaXRzWzExMDBdID0gewotICAyLCAgNCwgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwKLSAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDgsCi0gIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAotICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKLSAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCi0gIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAotICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwKLSAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCi0gMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAotIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKLSAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCi0gMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAotIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKLSAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCi0gMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLAotIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKLSAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCi0gMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAotIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKLSAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCi0gMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAotIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKLSAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCi0gMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAotIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAotIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLSAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCi0gMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCi0gMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAotIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLSAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCi0gMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAotIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLSAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAotIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLSAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCi0gMTUsIDE1LCAxNSwgIDQsCisgICAgIDIsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA1LAorICAgICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LAorICAgICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAgNCwKIH07CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlMV9tdnhbMTA5OV0gPSB7Ci0gMzIsIDMxLCAzMiwgMzEsIDMzLCAzMiwgMzMsIDMzLAotIDMxLCAzNCwgMzAsIDMyLCAzMiwgMzQsIDM1LCAzMiwKLSAzNCwgMzMsIDI5LCAzMCwgMzAsIDMyLCAzMSwgMzEsCi0gMzMsIDM1LCAzNSwgMzMsIDMxLCAyOSwgMjksIDMzLAotIDM0LCAzMCwgMzEsIDI4LCAzNiwgMzAsIDM0LCAzMiwKLSAzMiwgMzcsIDMyLCAzMiwgMjUsIDI3LCAzOSwgMzIsCi0gMzIsIDMyLCAzOCwgMzUsIDM2LCAzMiwgMzcsIDYxLAotIDI2LCAzMiwgMzQsIDM1LCAgMywgMzUsIDI3LCAyOCwKLSAyOSwgMzQsIDI4LCAzNywgMzEsIDM2LCAzMiwgMjcsCi0gMzEsIDMwLCAyOSwgMzksIDMzLCAyOSwgMzMsIDM1LAotIDI1LCAyNSwgMjksIDMzLCAzMSwgMzEsIDMxLCAzMywKLSAzMiwgMzAsIDMyLCAzMiwgNDEsIDM5LCAzMywgMzYsCi0gMzIsIDI4LCAzNCwgMzYsIDM4LCAyNCwgNjAsIDMxLAotIDIzLCAyOCwgMzIsIDMzLCA1OSwgMzIsIDQwLCAzMCwKLSAgNSwgMzQsIDMyLCAzOCwgMzIsIDMwLCA0MywgIDQsCi0gMzIsIDMyLCA0MiwgMzEsIDMxLCAzMiwgMjYsIDM4LAotIDI2LCAyMiwgMjEsIDM3LCA2MSwgNjMsIDM3LCAzMSwKLSAzMiwgMzMsICAyLCAgMSwgMjMsIDMzLCA0MSwgMjcsCi0gMzUsIDMwLCAzOCwgMjMsIDMzLCAgMywgMjgsIDM0LAotIDM0LCAyNywgNDEsIDI5LCAzOSwgMzUsIDM2LCAyOSwKLSAzMiwgMjcsIDMwLCAzMiwgMjQsIDYxLCAzNywgMjYsCi0gNTksIDI1LCAzNSwgMjcsIDM2LCAzNywgMzAsIDMxLAotIDM0LCA0MCwgIDMsIDI4LCAzNCwgMzksIDMyLCAzMSwKLSAzMiwgMzAsIDI0LCAyOCwgMzUsIDM2LCAyNiwgMzIsCi0gMzEsIDMzLCAyOSwgMzMsIDM5LCAyNSwgMzAsIDI0LAotIDM1LCA1OSwgMjksIDM0LCAyNSwgMzAsIDIxLCAzNSwKLSA0MywgNDAsIDMyLCAyOSwgIDUsIDI4LCAzMSwgNjIsCi0gMzMsIDMzLCAyNSwgMzEsIDIxLCAzMSwgNDMsIDMxLAotIDM0LCAzMywgMjAsIDQwLCAzOSwgMzEsIDMxLCA1NywKLSAzOCwgMzIsIDQyLCAzMywgMzIsIDMxLCAzMiwgMjksCi0gMzAsIDQ0LCAgNSwgMzEsIDIyLCAzNCwgMzYsIDE3LAotIDM4LCA1OCwgMzgsIDM1LCAzMiwgNjAsIDM1LCAyNCwKLSAzMiwgMzgsIDE2LCA0NSwgNDIsIDMyLCAzMSwgMjksCi0gIDQsIDMwLCAxNywgNDAsIDQ2LCA0OCwgNjMsIDMyLAotIDQyLCAxOSwgNDEsIDIyLCAyOCwgMzYsIDQ1LCAzMywKLSAzMywgMzIsIDI5LCAgNywgNDEsIDQyLCAxOCwgMzMsCi0gMzMsIDMyLCAyMiwgMzcsICAxLCAyNiwgMjIsIDIzLAotIDQ5LCAyOCwgMjYsIDI3LCAzMiwgMzMsIDI3LCAyMywKLSAyOCwgMzYsIDE1LCAgNiwgMzQsIDI3LCAzMSwgMjYsCi0gMjMsICAyLCAzMywgMzIsIDM0LCA0MSwgMjgsIDMyLAotIDQxLCAgMCwgMzYsIDM4LCAzNCwgMzEsIDQ3LCAzMiwKLSAxNywgMzEsIDM5LCAzMywgMzcsIDUxLCAzMCwgNDcsCi0gMzIsIDUwLCAzMiwgMTksIDYzLCAzMCwgMjUsIDI3LAotIDMzLCA2MiwgMjQsIDMxLCAyNywgMzAsIDM3LCAzMSwKLSA0NSwgMzIsIDM5LCAyMCwgNDYsIDQ3LCAzNSwgMTksCi0gMzQsICAxLCA0OSwgMjEsIDIxLCAxNCwgNTEsIDI2LAotIDIzLCAzMSwgMzYsIDM1LCA1OCwgMjksIDI5LCAyMSwKLSAyMCwgNDIsIDEzLCAyOCwgMTIsIDQwLCAzMSwgMzMsCi0gMzksIDYwLCAzMiwgNDQsIDMzLCAzMSwgMjgsIDM3LAotIDI5LCAzMiwgMzAsIDQ5LCA0MywgMjgsIDM5LCAyNSwKLSAzMiwgNDgsICAyLCAxNSwgMjAsIDI1LCAzMSwgMjgsCi0gMjEsIDI0LCAyNSwgMTUsIDMxLCAxNywgMzcsIDQzLAotIDE4LCAzMiwgMzMsIDI0LCAzMywgMzYsIDEzLCAzMywKLSAzMSwgMzksIDExLCAzMSwgMzMsIDMyLCAzOSwgMzcsCi0gMzIsIDMyLCAyOSwgMTcsIDQ0LCA0NiwgMzYsIDM1LAotIDI2LCAzNywgNTgsIDMyLCAzNCwgMzgsICA4LCAzOCwKLSAzOCwgMjIsIDI5LCAyNSwgMTYsIDM1LCAzMiwgMzUsCi0gMzMsIDQzLCAxOCwgNDYsIDM4LCA1MCwgMzMsIDE4LAotIDUzLCA2MCwgMTMsIDMyLCAzNiwgMzMsIDUxLCAzNiwKLSA0MywgNDUsIDI3LCA0MiwgMjksIDI0LCAzMCwgMjUsCi0gMzEsIDUyLCAzMSwgMzUsIDM4LCAgOSwgMjIsIDM0LAotICA0LCAxNywgMjgsIDU1LCA0MiwgMjUsIDE3LCAyMCwKLSA0NywgMzQsIDMzLCAxNiwgNDAsIDI1LCAxNiwgMzAsCi0gNTMsIDI5LCAxMCwgMTEsIDE0LCAyNiwgMzMsICA0LAotIDM1LCA0NCwgMjYsIDE2LCAzMSwgMjYsIDM0LCAzOCwKLSAyOSwgMzEsIDMwLCAyNCwgMjIsIDYxLCAzMiwgIDksCi0gNDUsIDM0LCAzMSwgMTksICA5LCAzMSwgNDYsIDMxLAotIDM1LCA1NCwgMjksIDU3LCAzMCwgNTAsICAzLCAzMSwKLSA2MywgMzQsIDQ3LCA0MSwgNTEsIDE4LCAzMSwgMTQsCi0gMzcsIDM4LCAzMSwgMjQsIDMyLCAzMSwgNTAsIDMzLAotIDMxLCA1NCwgMjcsICA5LCAzMywgMjMsIDE5LCAzMiwKLSAyOSwgMjksIDMzLCAyOCwgNDcsIDQ5LCAzMCwgNDcsCi0gMzMsIDI3LCAyNSwgNTQsIDQ0LCA0NSwgNTAsIDU4LAotIDUxLCA0OCwgMzMsIDU5LCAzMywgMzQsIDU3LCAxMywKLSAyNiwgMzMsIDEzLCA0OCwgMzAsIDExLCAgNywgNTYsCi0gMzQsIDU1LCAyNiwgIDAsIDI2LCAzNSwgIDEsIDUxLAotIDMzLCA1MywgMzEsIDQ1LCAxMiwgMjksIDI5LCA1MSwKLSAzMSwgNDgsICAyLCAgNiwgMzQsIDMwLCAyOCwgMzMsCi0gNjAsIDQwLCAyNywgNDYsIDMxLCAgOSwgMzUsIDI5LAotIDMxLCAzOSwgNTUsIDQ2LCAxOSwgMzcsIDYyLCAzNCwKLSAzMCwgMTYsIDE5LCA0OSwgNDEsIDQxLCAzOSwgMzcsCi0gMTQsICA1LCAxMywgMzUsIDU1LCAzMCwgNDAsIDQwLAotIDQyLCAgOCwgMjAsIDI1LCA0NSwgMzUsIDMzLCAzNiwKLSA1NCwgMzgsIDI3LCAzNywgNjIsIDQwLCAxNSwgNTksCi0gNDksIDMxLCAyOSwgMzQsIDM0LCAzOSwgMjQsIDI5LAotIDI1LCAyOSwgMjEsIDI5LCAxMCwgNjEsIDMzLCA0OSwKLSAzNSwgMzQsICAzLCAzOCwgMzksIDI5LCAgNywgNDEsCi0gIDEsIDM1LCAgNCwgMjMsIDE1LCAyMywgMTEsIDM3LAotIDI4LCAzNSwgMzAsIDMwLCAyNCwgIDEsIDQzLCA1NiwKLSAgOCwgMzQsIDQyLCAyNCwgNDUsIDMwLCAyMCwgMjMsCi0gIDgsIDM4LCAyMiwgMzMsIDE3LCA1MiwgMzQsIDIyLAotIDUzLCA0MywgNDQsICAxLCAyNywgMzEsIDQxLCA0MywKLSA0MSwgMzAsIDMxLCAzNiwgMzAsICA1LCA1NSwgMzEsCi0gMzMsIDMwLCA0MCwgMjMsIDE1LCAyOSwgMzQsIDM0LAotIDU5LCAzNCwgMzAsIDExLCAxMywgMzgsICA1LCAgMCwKLSAzMCwgNDIsICA1LCAzMCwgMjksIDM0LCAxMCwgNDQsCi0gMzAsIDYzLCAzNSwgMTIsICAzLCAyNiwgMTUsIDE3LAotIDI1LCAzNCwgNDMsIDM5LCAzNCwgNTYsIDI5LCAyMywKLSAzMCwgMTIsIDMwLCAxMCwgMzUsICA5LCAyNCwgNTgsCi0gMTAsIDEyLCA1NCwgMzMsIDM3LCAyMCwgNDEsIDM1LAotIDI5LCAxOCwgNjEsIDMwLCA0MCwgMjQsIDM5LCA1MywKLSA2MiwgMjYsIDI5LCAzMywgMzQsIDUzLCA0OSwgMjEsCi0gMjcsIDExLCA2MywgMjAsIDI2LCAyMywgIDcsIDEzLAotICA2LCA0NywgMjksIDMwLCAgOSwgNTEsIDIyLCAzNCwKLSAyMSwgMjUsIDMzLCA1NiwgNTcsIDMwLCAzOCwgNTEsCi0gNTEsIDM4LCA2MywgMjgsIDQwLCAzNSwgMzMsIDE4LAotIDMzLCAzMywgMjQsIDU4LCA1OCwgMzQsIDQ5LCAyOSwKLSA0MywgIDQsICAxLCAgNCwgNDIsIDM1LCAzNSwgMzAsCi0gMTcsICA1LCA1NiwgNjEsIDI1LCAzNywgMzYsIDU1LAotIDI4LCAzNSwgMjksIDUwLCA0OCwgNTIsICAyLCA0MiwKLSAzNCwgNDAsIDQ2LCA0NiwgNDMsIDM1LCAyOSwgNDgsCi0gMjAsIDI5LCAzMSwgNDEsICA3LCAzMCwgMzUsIDE5LAotIDE0LCAyMSwgIDgsIDM5LCAzOSwgNDAsIDQ2LCA1NSwKLSAzNCwgIDYsIDMwLCAzNCwgMzcsIDI1LCAzNywgMzMsCi0gMjIsIDQ0LCA1MiwgMTcsIDM1LCAyOSwgMzYsIDM1LAotIDQwLCAzNywgMjgsIDMwLCA1MCwgMTQsIDI4LCA1NSwKLSAgNiwgMjMsIDE5LCAxNCwgMzAsICAzLCAzMCwgMjgsCi0gMjgsIDYxLCA2MSwgNDcsIDQ1LCA0OCwgNDAsIDQwLAotIDM0LCAzNCwgMjUsIDMwLCAyOSwgMzUsICA0LCAyNiwKLSA1MywgNTAsIDI2LCA0MSwgMjcsIDU5LCAyNywgMzgsCi0gMzksICAzLCA1MCwgNDMsIDQ3LCAyMywgMzMsIDU1LAotIDM1LCAyMSwgMjMsIDM1LCA2MSwgMzMsIDQ2LCA1MiwKLSAzNSwgMzQsIDI0LCAzMCwgNDMsIDE2LCAzNywgMjEsCi0gIDIsIDI0LCA0NSwgMzQsIDMwLCA1NSwgNTUsICAxLAotIDI5LCAyOSwgMjYsIDI4LCAyNSwgMzEsIDM2LCAyMiwKLSAxNywgMzAsIDUyLCAgMiwgNDQsIDQ0LCA1NywgMjYsCi0gNjIsIDQxLCAzOSwgNTcsIDI2LCA0NiwgNDksIDExLAotIDE2LCAxOSwgIDUsIDU5LCAzOCwgMzksIDU4LCAzOCwKLSAyNSwgNDksIDUwLCAyMiwgMjgsIDU5LCAgOSwgNTksCi0gIDcsIDI4LCA1NSwgMTcsICA0LCAzNSwgNTAsIDIxLAotIDI5LCA0NCwgNDcsIDE4LCAyNCwgMTksIDI1LCA0MiwKLSAzNSwgIDMsIDUxLCAzNSwgMTYsIDM1LCAzMCwgNjMsCi0gNTcsIDM5LCAzOSwgMjUsIDM1LCAzOCwgIDksIDE2LAotIDM2LCA0NSwgMzEsIDYwLCAxNCwgMzQsIDQyLCAyNCwKLSAgMCwgMzcsIDE4LCA2MSwgNTcsIDM3LCAyOCwgNTMsCi0gMjAsIDQ2LCAxNCwgNDcsIDM4LCAzOCwgMzgsICA5LAotIDM0LCAzOSwgNDMsIDE3LCAzOSwgNTksICA1LCAyNywKLSAgMCwgMTIsIDI3LAorICAgIDMyLCAzMSwgMzIsIDMxLCAzMywgMzIsIDMzLCAzMywKKyAgICAzMSwgMzQsIDMwLCAzMiwgMzIsIDM0LCAzNSwgMzIsCisgICAgMzQsIDMzLCAyOSwgMzAsIDMwLCAzMiwgMzEsIDMxLAorICAgIDMzLCAzNSwgMzUsIDMzLCAzMSwgMjksIDI5LCAzMywKKyAgICAzNCwgMzAsIDMxLCAyOCwgMzYsIDMwLCAzNCwgMzIsCisgICAgMzIsIDM3LCAzMiwgMzIsIDI1LCAyNywgMzksIDMyLAorICAgIDMyLCAzMiwgMzgsIDM1LCAzNiwgMzIsIDM3LCA2MSwKKyAgICAyNiwgMzIsIDM0LCAzNSwgIDMsIDM1LCAyNywgMjgsCisgICAgMjksIDM0LCAyOCwgMzcsIDMxLCAzNiwgMzIsIDI3LAorICAgIDMxLCAzMCwgMjksIDM5LCAzMywgMjksIDMzLCAzNSwKKyAgICAyNSwgMjUsIDI5LCAzMywgMzEsIDMxLCAzMSwgMzMsCisgICAgMzIsIDMwLCAzMiwgMzIsIDQxLCAzOSwgMzMsIDM2LAorICAgIDMyLCAyOCwgMzQsIDM2LCAzOCwgMjQsIDYwLCAzMSwKKyAgICAyMywgMjgsIDMyLCAzMywgNTksIDMyLCA0MCwgMzAsCisgICAgIDUsIDM0LCAzMiwgMzgsIDMyLCAzMCwgNDMsICA0LAorICAgIDMyLCAzMiwgNDIsIDMxLCAzMSwgMzIsIDI2LCAzOCwKKyAgICAyNiwgMjIsIDIxLCAzNywgNjEsIDYzLCAzNywgMzEsCisgICAgMzIsIDMzLCAgMiwgIDEsIDIzLCAzMywgNDEsIDI3LAorICAgIDM1LCAzMCwgMzgsIDIzLCAzMywgIDMsIDI4LCAzNCwKKyAgICAzNCwgMjcsIDQxLCAyOSwgMzksIDM1LCAzNiwgMjksCisgICAgMzIsIDI3LCAzMCwgMzIsIDI0LCA2MSwgMzcsIDI2LAorICAgIDU5LCAyNSwgMzUsIDI3LCAzNiwgMzcsIDMwLCAzMSwKKyAgICAzNCwgNDAsICAzLCAyOCwgMzQsIDM5LCAzMiwgMzEsCisgICAgMzIsIDMwLCAyNCwgMjgsIDM1LCAzNiwgMjYsIDMyLAorICAgIDMxLCAzMywgMjksIDMzLCAzOSwgMjUsIDMwLCAyNCwKKyAgICAzNSwgNTksIDI5LCAzNCwgMjUsIDMwLCAyMSwgMzUsCisgICAgNDMsIDQwLCAzMiwgMjksICA1LCAyOCwgMzEsIDYyLAorICAgIDMzLCAzMywgMjUsIDMxLCAyMSwgMzEsIDQzLCAzMSwKKyAgICAzNCwgMzMsIDIwLCA0MCwgMzksIDMxLCAzMSwgNTcsCisgICAgMzgsIDMyLCA0MiwgMzMsIDMyLCAzMSwgMzIsIDI5LAorICAgIDMwLCA0NCwgIDUsIDMxLCAyMiwgMzQsIDM2LCAxNywKKyAgICAzOCwgNTgsIDM4LCAzNSwgMzIsIDYwLCAzNSwgMjQsCisgICAgMzIsIDM4LCAxNiwgNDUsIDQyLCAzMiwgMzEsIDI5LAorICAgICA0LCAzMCwgMTcsIDQwLCA0NiwgNDgsIDYzLCAzMiwKKyAgICA0MiwgMTksIDQxLCAyMiwgMjgsIDM2LCA0NSwgMzMsCisgICAgMzMsIDMyLCAyOSwgIDcsIDQxLCA0MiwgMTgsIDMzLAorICAgIDMzLCAzMiwgMjIsIDM3LCAgMSwgMjYsIDIyLCAyMywKKyAgICA0OSwgMjgsIDI2LCAyNywgMzIsIDMzLCAyNywgMjMsCisgICAgMjgsIDM2LCAxNSwgIDYsIDM0LCAyNywgMzEsIDI2LAorICAgIDIzLCAgMiwgMzMsIDMyLCAzNCwgNDEsIDI4LCAzMiwKKyAgICA0MSwgIDAsIDM2LCAzOCwgMzQsIDMxLCA0NywgMzIsCisgICAgMTcsIDMxLCAzOSwgMzMsIDM3LCA1MSwgMzAsIDQ3LAorICAgIDMyLCA1MCwgMzIsIDE5LCA2MywgMzAsIDI1LCAyNywKKyAgICAzMywgNjIsIDI0LCAzMSwgMjcsIDMwLCAzNywgMzEsCisgICAgNDUsIDMyLCAzOSwgMjAsIDQ2LCA0NywgMzUsIDE5LAorICAgIDM0LCAgMSwgNDksIDIxLCAyMSwgMTQsIDUxLCAyNiwKKyAgICAyMywgMzEsIDM2LCAzNSwgNTgsIDI5LCAyOSwgMjEsCisgICAgMjAsIDQyLCAxMywgMjgsIDEyLCA0MCwgMzEsIDMzLAorICAgIDM5LCA2MCwgMzIsIDQ0LCAzMywgMzEsIDI4LCAzNywKKyAgICAyOSwgMzIsIDMwLCA0OSwgNDMsIDI4LCAzOSwgMjUsCisgICAgMzIsIDQ4LCAgMiwgMTUsIDIwLCAyNSwgMzEsIDI4LAorICAgIDIxLCAyNCwgMjUsIDE1LCAzMSwgMTcsIDM3LCA0MywKKyAgICAxOCwgMzIsIDMzLCAyNCwgMzMsIDM2LCAxMywgMzMsCisgICAgMzEsIDM5LCAxMSwgMzEsIDMzLCAzMiwgMzksIDM3LAorICAgIDMyLCAzMiwgMjksIDE3LCA0NCwgNDYsIDM2LCAzNSwKKyAgICAyNiwgMzcsIDU4LCAzMiwgMzQsIDM4LCAgOCwgMzgsCisgICAgMzgsIDIyLCAyOSwgMjUsIDE2LCAzNSwgMzIsIDM1LAorICAgIDMzLCA0MywgMTgsIDQ2LCAzOCwgNTAsIDMzLCAxOCwKKyAgICA1MywgNjAsIDEzLCAzMiwgMzYsIDMzLCA1MSwgMzYsCisgICAgNDMsIDQ1LCAyNywgNDIsIDI5LCAyNCwgMzAsIDI1LAorICAgIDMxLCA1MiwgMzEsIDM1LCAzOCwgIDksIDIyLCAzNCwKKyAgICAgNCwgMTcsIDI4LCA1NSwgNDIsIDI1LCAxNywgMjAsCisgICAgNDcsIDM0LCAzMywgMTYsIDQwLCAyNSwgMTYsIDMwLAorICAgIDUzLCAyOSwgMTAsIDExLCAxNCwgMjYsIDMzLCAgNCwKKyAgICAzNSwgNDQsIDI2LCAxNiwgMzEsIDI2LCAzNCwgMzgsCisgICAgMjksIDMxLCAzMCwgMjQsIDIyLCA2MSwgMzIsICA5LAorICAgIDQ1LCAzNCwgMzEsIDE5LCAgOSwgMzEsIDQ2LCAzMSwKKyAgICAzNSwgNTQsIDI5LCA1NywgMzAsIDUwLCAgMywgMzEsCisgICAgNjMsIDM0LCA0NywgNDEsIDUxLCAxOCwgMzEsIDE0LAorICAgIDM3LCAzOCwgMzEsIDI0LCAzMiwgMzEsIDUwLCAzMywKKyAgICAzMSwgNTQsIDI3LCAgOSwgMzMsIDIzLCAxOSwgMzIsCisgICAgMjksIDI5LCAzMywgMjgsIDQ3LCA0OSwgMzAsIDQ3LAorICAgIDMzLCAyNywgMjUsIDU0LCA0NCwgNDUsIDUwLCA1OCwKKyAgICA1MSwgNDgsIDMzLCA1OSwgMzMsIDM0LCA1NywgMTMsCisgICAgMjYsIDMzLCAxMywgNDgsIDMwLCAxMSwgIDcsIDU2LAorICAgIDM0LCA1NSwgMjYsICAwLCAyNiwgMzUsICAxLCA1MSwKKyAgICAzMywgNTMsIDMxLCA0NSwgMTIsIDI5LCAyOSwgNTEsCisgICAgMzEsIDQ4LCAgMiwgIDYsIDM0LCAzMCwgMjgsIDMzLAorICAgIDYwLCA0MCwgMjcsIDQ2LCAzMSwgIDksIDM1LCAyOSwKKyAgICAzMSwgMzksIDU1LCA0NiwgMTksIDM3LCA2MiwgMzQsCisgICAgMzAsIDE2LCAxOSwgNDksIDQxLCA0MSwgMzksIDM3LAorICAgIDE0LCAgNSwgMTMsIDM1LCA1NSwgMzAsIDQwLCA0MCwKKyAgICA0MiwgIDgsIDIwLCAyNSwgNDUsIDM1LCAzMywgMzYsCisgICAgNTQsIDM4LCAyNywgMzcsIDYyLCA0MCwgMTUsIDU5LAorICAgIDQ5LCAzMSwgMjksIDM0LCAzNCwgMzksIDI0LCAyOSwKKyAgICAyNSwgMjksIDIxLCAyOSwgMTAsIDYxLCAzMywgNDksCisgICAgMzUsIDM0LCAgMywgMzgsIDM5LCAyOSwgIDcsIDQxLAorICAgICAxLCAzNSwgIDQsIDIzLCAxNSwgMjMsIDExLCAzNywKKyAgICAyOCwgMzUsIDMwLCAzMCwgMjQsICAxLCA0MywgNTYsCisgICAgIDgsIDM0LCA0MiwgMjQsIDQ1LCAzMCwgMjAsIDIzLAorICAgICA4LCAzOCwgMjIsIDMzLCAxNywgNTIsIDM0LCAyMiwKKyAgICA1MywgNDMsIDQ0LCAgMSwgMjcsIDMxLCA0MSwgNDMsCisgICAgNDEsIDMwLCAzMSwgMzYsIDMwLCAgNSwgNTUsIDMxLAorICAgIDMzLCAzMCwgNDAsIDIzLCAxNSwgMjksIDM0LCAzNCwKKyAgICA1OSwgMzQsIDMwLCAxMSwgMTMsIDM4LCAgNSwgIDAsCisgICAgMzAsIDQyLCAgNSwgMzAsIDI5LCAzNCwgMTAsIDQ0LAorICAgIDMwLCA2MywgMzUsIDEyLCAgMywgMjYsIDE1LCAxNywKKyAgICAyNSwgMzQsIDQzLCAzOSwgMzQsIDU2LCAyOSwgMjMsCisgICAgMzAsIDEyLCAzMCwgMTAsIDM1LCAgOSwgMjQsIDU4LAorICAgIDEwLCAxMiwgNTQsIDMzLCAzNywgMjAsIDQxLCAzNSwKKyAgICAyOSwgMTgsIDYxLCAzMCwgNDAsIDI0LCAzOSwgNTMsCisgICAgNjIsIDI2LCAyOSwgMzMsIDM0LCA1MywgNDksIDIxLAorICAgIDI3LCAxMSwgNjMsIDIwLCAyNiwgMjMsICA3LCAxMywKKyAgICAgNiwgNDcsIDI5LCAzMCwgIDksIDUxLCAyMiwgMzQsCisgICAgMjEsIDI1LCAzMywgNTYsIDU3LCAzMCwgMzgsIDUxLAorICAgIDUxLCAzOCwgNjMsIDI4LCA0MCwgMzUsIDMzLCAxOCwKKyAgICAzMywgMzMsIDI0LCA1OCwgNTgsIDM0LCA0OSwgMjksCisgICAgNDMsICA0LCAgMSwgIDQsIDQyLCAzNSwgMzUsIDMwLAorICAgIDE3LCAgNSwgNTYsIDYxLCAyNSwgMzcsIDM2LCA1NSwKKyAgICAyOCwgMzUsIDI5LCA1MCwgNDgsIDUyLCAgMiwgNDIsCisgICAgMzQsIDQwLCA0NiwgNDYsIDQzLCAzNSwgMjksIDQ4LAorICAgIDIwLCAyOSwgMzEsIDQxLCAgNywgMzAsIDM1LCAxOSwKKyAgICAxNCwgMjEsICA4LCAzOSwgMzksIDQwLCA0NiwgNTUsCisgICAgMzQsICA2LCAzMCwgMzQsIDM3LCAyNSwgMzcsIDMzLAorICAgIDIyLCA0NCwgNTIsIDE3LCAzNSwgMjksIDM2LCAzNSwKKyAgICA0MCwgMzcsIDI4LCAzMCwgNTAsIDE0LCAyOCwgNTUsCisgICAgIDYsIDIzLCAxOSwgMTQsIDMwLCAgMywgMzAsIDI4LAorICAgIDI4LCA2MSwgNjEsIDQ3LCA0NSwgNDgsIDQwLCA0MCwKKyAgICAzNCwgMzQsIDI1LCAzMCwgMjksIDM1LCAgNCwgMjYsCisgICAgNTMsIDUwLCAyNiwgNDEsIDI3LCA1OSwgMjcsIDM4LAorICAgIDM5LCAgMywgNTAsIDQzLCA0NywgMjMsIDMzLCA1NSwKKyAgICAzNSwgMjEsIDIzLCAzNSwgNjEsIDMzLCA0NiwgNTIsCisgICAgMzUsIDM0LCAyNCwgMzAsIDQzLCAxNiwgMzcsIDIxLAorICAgICAyLCAyNCwgNDUsIDM0LCAzMCwgNTUsIDU1LCAgMSwKKyAgICAyOSwgMjksIDI2LCAyOCwgMjUsIDMxLCAzNiwgMjIsCisgICAgMTcsIDMwLCA1MiwgIDIsIDQ0LCA0NCwgNTcsIDI2LAorICAgIDYyLCA0MSwgMzksIDU3LCAyNiwgNDYsIDQ5LCAxMSwKKyAgICAxNiwgMTksICA1LCA1OSwgMzgsIDM5LCA1OCwgMzgsCisgICAgMjUsIDQ5LCA1MCwgMjIsIDI4LCA1OSwgIDksIDU5LAorICAgICA3LCAyOCwgNTUsIDE3LCAgNCwgMzUsIDUwLCAyMSwKKyAgICAyOSwgNDQsIDQ3LCAxOCwgMjQsIDE5LCAyNSwgNDIsCisgICAgMzUsICAzLCA1MSwgMzUsIDE2LCAzNSwgMzAsIDYzLAorICAgIDU3LCAzOSwgMzksIDI1LCAzNSwgMzgsICA5LCAxNiwKKyAgICAzNiwgNDUsIDMxLCA2MCwgMTQsIDM0LCA0MiwgMjQsCisgICAgIDAsIDM3LCAxOCwgNjEsIDU3LCAzNywgMjgsIDUzLAorICAgIDIwLCA0NiwgMTQsIDQ3LCAzOCwgMzgsIDM4LCAgOSwKKyAgICAzNCwgMzksIDQzLCAxNywgMzksIDU5LCAgNSwgMjcsCisgICAgIDAsIDEyLCAyNywKIH07CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlMV9tdnlbMTA5OV0gPSB7Ci0gMzIsIDMyLCAzMSwgMzEsIDMyLCAzMywgMzEsIDMzLAotIDMzLCAzMiwgMzIsIDMwLCAzNCwgMzEsIDMyLCAyOSwKLSAzMywgMzAsIDMyLCAzMywgMzEsIDM1LCAzNCwgMzAsCi0gMzQsIDMxLCAzMywgMjksIDI5LCAzMSwgMzMsIDM1LAotIDMwLCAzMCwgMzUsIDMyLCAzMiwgMzQsIDM0LCAyOCwKLSAyNSwgMzIsIDM2LCAyNywgMzIsIDMyLCAzMiwgMzcsCi0gMzksICAzLCAzMiwgMzAsIDMxLCAyNiwgMzEsIDMyLAotIDMyLCAzOCwgMjksIDI5LCAzMiwgMzQsIDMxLCAzMSwKLSAzNCwgMzUsIDMzLCAzMywgMjgsIDMzLCAgMSwgMzMsCi0gMjcsIDI5LCAzMCwgMzEsIDI4LCAyOSwgMzcsIDM1LAotIDMxLCAzMywgMzUsIDI3LCAzNiwgMzcsIDI1LCAyNSwKLSA2MSwgMzUsICA0LCAgNSwgMzIsIDMzLCAzNiwgMzAsCi0gMjMsIDMwLCAyOCwgMzQsIDMxLCAzMiwgMzIsIDM5LAotIDMyLCAzNCwgMjEsIDM5LCAzMiwgNTksIDMyLCAyOCwKLSAzMiwgMzYsIDYwLCAzMywgMjQsIDM2LCAzMiwgMzIsCi0gNDEsICAyLCAzMiwgMzgsIDI2LCAyMiwgMzMsIDMwLAotIDMxLCAzMiwgMzIsIDMwLCAzMSwgMzIsIDI5LCAgMywKLSA0MCwgMzgsIDMyLCAzMiwgMzMsIDI2LCAzMSwgMzQsCi0gMjgsIDM4LCAzNCwgMzEsICAzLCAzMSwgMzUsIDM4LAotIDI3LCAzNSwgMzMsIDI4LCAyOSwgMjcsIDI5LCAyNywKLSA0MywgMjksIDM3LCA2MywgMzEsIDMzLCAzNCwgMzAsCi0gMzEsIDMwLCAzNywgMzAsIDM1LCAzNSwgMjYsIDQxLAotIDM3LCAzMSwgMzMsIDI4LCAyNiwgMzAsIDQyLCAyNCwKLSAgNywgMjcsIDMzLCAyOSwgMzYsIDI4LCAzNCwgNTcsCi0gMjMsIDQxLCAzNiwgMjMsIDM1LCAzNCwgMjUsIDMwLAotIDI1LCAzMywgMjUsIDI1LCAyOSwgMjQsIDMzLCAzOSwKLSAzMywgMzMsICAwLCAzNywgMzEsIDM2LCAyMSwgMzIsCi0gNjEsIDI0LCAzNSwgNjEsIDMxLCAgNSwgMzEsIDU5LAotIDM5LCAyMSwgMzIsIDMwLCAzNCwgMjIsIDQwLCAzMiwKLSAyOSwgMTYsIDMxLCAgNSwgNjIsICAyLCAyMCwgMzksCi0gMzksIDMyLCAzMywgIDEsIDMxLCAyNCwgMzYsIDMyLAotIDM2LCAzMiwgMjgsIDI2LCAgNiwgMzEsIDM4LCAzNCwKLSA1OCwgMzUsIDMyLCAzMywgMzMsIDE3LCA0MywgMjYsCi0gMzEsIDQwLCAzMSwgMzQsIDMyLCAzMiwgMzEsIDE5LAotIDMwLCAzMiwgMjksIDMzLCAzOCwgMzgsIDMyLCA1OSwKLSA0MCwgMTgsIDM4LCAzMiwgMzUsIDM0LCAzMiwgMTcsCi0gIDEsIDE1LCAzMCwgMjgsIDMxLCAyOCwgMzQsIDI5LAotIDMyLCAyNywgMzUsIDI3LCA0OSwgMjIsIDM3LCAzNCwKLSAzNywgMjYsIDMyLCAzMiwgMjIsIDI4LCA0NSwgMjksCi0gMzAsIDMxLCA0MywgNDYsIDQxLCAzMCwgMjYsIDEzLAotIDM0LCAzMiwgMjcsIDM4LCA0MiwgNDIsIDMzLCA0NywKLSAzMywgNjAsIDI3LCA0MiwgMjUsIDMyLCAyMiwgMzIsCi0gNDgsIDMyLCA0NSwgMzMsIDMzLCA0MSwgMjcsIDI1LAotIDE5LCAzMSwgMzUsIDE5LCAzNiwgNDIsIDI3LCAxNywKLSAzMSwgNDQsIDI4LCAzMywgMzMsIDMxLCAyMywgMzEsCi0gNDAsIDMzLCAzMSwgMzQsIDMwLCAzMiwgMzMsIDM2LAotIDM1LCA0NywgMzcsIDQxLCAzMSwgMjMsIDQxLCAyOSwKLSAzMCwgMzUsIDMyLCAyNSwgMzIsIDI4LCA1OCwgIDIsCi0gMzcsIDMzLCAxNCwgMzMsIDQ5LCAyMCwgMzksIDM2LAotIDIxLCAgOSwgMjMsIDMzLCAzNSwgMjQsIDM5LCAzNywKLSAxMSwgMzMsIDMwLCAzMSwgMzEsIDI4LCA1MSwgNDAsCi0gMzUsIDI5LCAyNSwgMzMsIDQ2LCAzNSwgMzcsIDMwLAotIDMwLCAgOCwgNjMsIDI4LCAxNSwgNDAsIDMzLCA0NSwKLSA0OSwgMjUsIDMyLCAgNCwgNDcsIDUxLCAzNiwgMzksCi0gNTMsIDEwLCAyNCwgMjksIDMwLCAzMSwgMjUsIDQwLAotIDM4LCAzOCwgMzMsIDU2LCAyMywgMjcsIDMyLCAzNywKLSAyNiwgMjksIDQzLCAzNiwgMzMsIDI0LCA1NSwgNDMsCi0gIDksIDI5LCAzNCwgMzQsIDI0LCAzMywgMTgsIDMzLAotIDMzLCAzMCwgMzEsIDUwLCAyNCwgNjAsIDMwLCAzOSwKLSAzNCwgMzAsIDM5LCAyOCwgMjIsIDM4LCAgMiwgMjYsCi0gNjMsIDMyLCA1NywgMjEsIDM5LCAzMywgMjgsIDE4LAotIDMwLCAzNCwgMjIsIDMzLCAyOSwgNDEsIDMwLCAzNCwKLSAzNSwgMjEsIDEzLCAzNCwgMzUsIDM5LCAzMCwgNDYsCi0gMzIsIDQyLCAzMiwgMzEsIDMzLCAyNiwgMTEsIDMzLAotIDIyLCAzMSwgMjUsIDMxLCA1MywgMjcsIDQzLCAyNSwKLSA0MCwgNTAsIDIxLCAzNiwgMzgsIDMwLCAxMiwgMzEsCi0gMzQsIDIwLCAxNSwgMjksIDMyLCA2MiwgMzAsIDEzLAotIDE3LCAzMiwgMTksIDMxLCAyMCwgMzEsIDMwLCAgNywKLSAgMSwgMTcsIDM0LCAzNywgMzEsIDMxLCA0NCwgMzQsCi0gMjYsIDQwLCAxNiwgMzcsIDUyLCA0OCwgMzAsIDIwLAotIDE4LCAzMywgMzgsIDI5LCAgNywgMjUsIDMwLCA1NCwKLSA0NSwgNDcsIDQ2LCA0MSwgMjksIDI5LCAxNiwgMzAsCi0gMTQsIDI2LCAzOCwgMzQsIDM0LCAyOSwgMzQsIDMwLAotIDI5LCAzMCwgNTcsIDMwLCAgNCwgNDYsIDMzLCAyOSwKLSAzOSwgNDQsIDMwLCAzMSwgNTAsIDMzLCAzMSwgMzIsCi0gMTksIDMyLCA0MCwgMzEsIDM3LCA0NywgIDEsIDM1LAotIDE2LCAzMSwgIDAsIDM1LCAzMywgIDEsIDE3LCAzNCwKLSAgOSwgMzQsIDMzLCAzMSwgNDksIDQzLCA0MiwgNTEsCi0gMzQsIDI5LCAyMywgMjksIDE0LCAzMCwgNDUsIDQ5LAotIDExLCAyNCwgMzEsIDI4LCAzNSwgNDEsIDMwLCA0NCwKLSAxOCwgMjksIDM0LCAzNSwgMzYsIDI1LCAyNiwgMjEsCi0gMzEsIDMwLCAzNCwgMTksIDM0LCA0NCwgMzYsIDM4LAotIDI1LCAzMSwgMjgsIDIzLCAzNywgIDMsIDU1LCA0MSwKLSAzMCwgMjIsIDQxLCAyNCwgMzMsIDI2LCAzNSwgMzUsCi0gMzAsIDU1LCA1MSwgNDcsIDQ4LCAzOCwgMjQsIDE1LAotIDIxLCA1MCwgMjUsIDQ2LCAzMCwgMjksIDEwLCAzNCwKLSA0MiwgNDUsIDI5LCA0MiwgMjIsICAzLCAzMywgMjcsCi0gMzQsICAxLCAzNCwgMjgsIDM0LCAzNiwgMzUsIDIzLAotIDIzLCAxMywgNTgsICAzLCAyNiwgNjMsIDI1LCAzMSwKLSAzNCwgNjEsIDM4LCAzOSwgMjUsIDYxLCAyOSwgMzcsCi0gMzAsIDQxLCAyNiwgNDgsIDI4LCAzMywgNTAsIDM1LAotIDMwLCAzNywgMjksIDI5LCA0MCwgIDYsIDM5LCAyOCwKLSAyOCwgMTksICA4LCAyMiwgNDUsIDM0LCAzNSwgMTAsCi0gNTgsIDE3LCAzNywgMzksIDMwLCAxOCwgNTQsIDE0LAotIDI5LCAxNiwgNTksIDMwLCAzNSwgMjMsIDM1LCAzMCwKLSA0NywgMzYsIDI5LCA1NSwgMjAsIDEyLCAzMSwgMzUsCi0gMTQsIDI5LCAxOCwgMzQsIDM0LCAyNCwgMjksIDI2LAotIDIyLCAgMiwgMjcsIDIzLCAgOCwgMzAsIDU1LCAzOCwKLSA2MCwgMzEsICA0LCAzNCwgNDksIDM0LCAyNywgMzQsCi0gMzMsIDMwLCAzMSwgNTQsIDQyLCAzNSwgMzgsIDQ2LAotIDQ0LCAyNiwgMjcsICA5LCAzOSwgMjUsIDIxLCAyOSwKLSAyOCwgNDIsIDEzLCAgMCwgIDUsIDM0LCAzNywgMjgsCi0gMjQsIDI5LCA2MywgMjYsIDIyLCAyNywgMjksIDI1LAotIDMzLCAyNSwgNjEsICAwLCAzNSwgMjUsIDM2LCAxNSwKLSAyNywgNDAsIDUzLCAzMywgIDMsIDEwLCAxNiwgMzcsCi0gMzgsIDE4LCAzMCwgNDYsIDI3LCAgOSwgIDYsIDI5LAotIDYyLCAgOCwgNDIsIDI4LCAyOSwgIDMsIDI1LCAxNiwKLSAyNiwgMjksIDM1LCAyOCwgMjcsIDUxLCA2MSwgNDgsCi0gMzcsICA5LCAzNCwgIDcsIDQ5LCA0NSwgMjAsIDI5LAotIDIxLCAgNSwgIDUsIDI5LCAyOCwgMzQsIDI5LCAyNCwKLSAxMCwgMjQsIDM1LCAzNiwgMzgsIDU1LCAxMSwgMzYsCi0gMzgsIDUzLCA1NCwgMjYsIDMwLCA0OSwgMjAsIDI3LAotIDMwLCAzOSwgMzMsIDQxLCA0OSwgMjIsIDM4LCAzOCwKLSAgNCwgMzAsICA4LCAgOSwgIDMsIDI0LCAyMiwgNTAsCi0gMzcsIDM2LCAzMSwgMjcsICAyLCAgOSwgNDIsIDYzLAotIDI1LCAxOSwgNDQsICAxLCAyOCwgMjgsIDQ4LCAzMCwKLSAzNCwgNDEsIDQxLCAzOCwgMTIsIDI3LCAxNSwgIDAsCi0gMTYsIDM0LCAzNSwgMzgsIDI4LCAyOSwgNDAsIDQyLAotIDUxLCA1MiwgNDUsIDU0LCA1OSwgNTksIDQyLCA0NCwKLSAzNywgMjYsIDQ2LCAyNCwgMTUsIDM5LCAyMiwgNDYsCi0gMTksIDM1LCAzOCwgMTcsIDM3LCAyMywgNTIsIDU1LAotIDUwLCAzNywgMjYsIDExLCAzNywgMTIsIDI0LCAzMCwKLSAxNiwgMTMsIDIyLCAxMywgMzYsIDM1LCA0MCwgNDEsCi0gMzQsIDQxLCAyNiwgNTMsIDUxLCAgNSwgMjEsIDMwLAotICAyLCA2MywgNDEsIDIwLCAgMSwgNTYsIDIxLCAyNCwKLSAyNSwgIDUsIDI4LCAzNSwgMjYsIDI4LCAzMCwgMTgsCi0gMjksIDIzLCA0MCwgMzQsIDIwLCA0MiwgMzksIDM0LAotIDI4LCA2MSwgMzgsIDI3LCA2MiwgIDksIDM2LCAxNywKLSAgOSwgNDksIDI0LCAyNSwgNTQsIDM0LCAzOSwgMzcsCi0gIDMsICAxLCAyNSwgMzgsIDM4LCA0NCwgMzUsIDM2LAotIDEyLCA2MCwgMzYsIDM4LCA0MCwgMjUsIDQzLCAzOSwKLSA1MywgMjgsIDM5LCA1NywgNDYsIDEwLCA1MiwgMjcsCi0gMzUsIDQyLCA0NSwgNTksIDE1LCA2MCwgMzgsIDI0LAotIDIzLCAzOSwgMTIsIDI5LCAyNCwgIDAsIDIwLCAxNiwKLSAyOCwgNDMsIDM1LCAyOCwgIDEsIDQ5LCAgNCwgMjEsCi0gNDIsIDM5LCAyOSwgIDMsIDQ0LCAyMSwgNTMsIDU1LAotIDExLCAgNSwgIDMsIDM5LCA1MywgMjgsIDI1LCAxOSwKLSAzNCwgMjgsIDIxLAorICAgIDMyLCAzMiwgMzEsIDMxLCAzMiwgMzMsIDMxLCAzMywKKyAgICAzMywgMzIsIDMyLCAzMCwgMzQsIDMxLCAzMiwgMjksCisgICAgMzMsIDMwLCAzMiwgMzMsIDMxLCAzNSwgMzQsIDMwLAorICAgIDM0LCAzMSwgMzMsIDI5LCAyOSwgMzEsIDMzLCAzNSwKKyAgICAzMCwgMzAsIDM1LCAzMiwgMzIsIDM0LCAzNCwgMjgsCisgICAgMjUsIDMyLCAzNiwgMjcsIDMyLCAzMiwgMzIsIDM3LAorICAgIDM5LCAgMywgMzIsIDMwLCAzMSwgMjYsIDMxLCAzMiwKKyAgICAzMiwgMzgsIDI5LCAyOSwgMzIsIDM0LCAzMSwgMzEsCisgICAgMzQsIDM1LCAzMywgMzMsIDI4LCAzMywgIDEsIDMzLAorICAgIDI3LCAyOSwgMzAsIDMxLCAyOCwgMjksIDM3LCAzNSwKKyAgICAzMSwgMzMsIDM1LCAyNywgMzYsIDM3LCAyNSwgMjUsCisgICAgNjEsIDM1LCAgNCwgIDUsIDMyLCAzMywgMzYsIDMwLAorICAgIDIzLCAzMCwgMjgsIDM0LCAzMSwgMzIsIDMyLCAzOSwKKyAgICAzMiwgMzQsIDIxLCAzOSwgMzIsIDU5LCAzMiwgMjgsCisgICAgMzIsIDM2LCA2MCwgMzMsIDI0LCAzNiwgMzIsIDMyLAorICAgIDQxLCAgMiwgMzIsIDM4LCAyNiwgMjIsIDMzLCAzMCwKKyAgICAzMSwgMzIsIDMyLCAzMCwgMzEsIDMyLCAyOSwgIDMsCisgICAgNDAsIDM4LCAzMiwgMzIsIDMzLCAyNiwgMzEsIDM0LAorICAgIDI4LCAzOCwgMzQsIDMxLCAgMywgMzEsIDM1LCAzOCwKKyAgICAyNywgMzUsIDMzLCAyOCwgMjksIDI3LCAyOSwgMjcsCisgICAgNDMsIDI5LCAzNywgNjMsIDMxLCAzMywgMzQsIDMwLAorICAgIDMxLCAzMCwgMzcsIDMwLCAzNSwgMzUsIDI2LCA0MSwKKyAgICAzNywgMzEsIDMzLCAyOCwgMjYsIDMwLCA0MiwgMjQsCisgICAgIDcsIDI3LCAzMywgMjksIDM2LCAyOCwgMzQsIDU3LAorICAgIDIzLCA0MSwgMzYsIDIzLCAzNSwgMzQsIDI1LCAzMCwKKyAgICAyNSwgMzMsIDI1LCAyNSwgMjksIDI0LCAzMywgMzksCisgICAgMzMsIDMzLCAgMCwgMzcsIDMxLCAzNiwgMjEsIDMyLAorICAgIDYxLCAyNCwgMzUsIDYxLCAzMSwgIDUsIDMxLCA1OSwKKyAgICAzOSwgMjEsIDMyLCAzMCwgMzQsIDIyLCA0MCwgMzIsCisgICAgMjksIDE2LCAzMSwgIDUsIDYyLCAgMiwgMjAsIDM5LAorICAgIDM5LCAzMiwgMzMsICAxLCAzMSwgMjQsIDM2LCAzMiwKKyAgICAzNiwgMzIsIDI4LCAyNiwgIDYsIDMxLCAzOCwgMzQsCisgICAgNTgsIDM1LCAzMiwgMzMsIDMzLCAxNywgNDMsIDI2LAorICAgIDMxLCA0MCwgMzEsIDM0LCAzMiwgMzIsIDMxLCAxOSwKKyAgICAzMCwgMzIsIDI5LCAzMywgMzgsIDM4LCAzMiwgNTksCisgICAgNDAsIDE4LCAzOCwgMzIsIDM1LCAzNCwgMzIsIDE3LAorICAgICAxLCAxNSwgMzAsIDI4LCAzMSwgMjgsIDM0LCAyOSwKKyAgICAzMiwgMjcsIDM1LCAyNywgNDksIDIyLCAzNywgMzQsCisgICAgMzcsIDI2LCAzMiwgMzIsIDIyLCAyOCwgNDUsIDI5LAorICAgIDMwLCAzMSwgNDMsIDQ2LCA0MSwgMzAsIDI2LCAxMywKKyAgICAzNCwgMzIsIDI3LCAzOCwgNDIsIDQyLCAzMywgNDcsCisgICAgMzMsIDYwLCAyNywgNDIsIDI1LCAzMiwgMjIsIDMyLAorICAgIDQ4LCAzMiwgNDUsIDMzLCAzMywgNDEsIDI3LCAyNSwKKyAgICAxOSwgMzEsIDM1LCAxOSwgMzYsIDQyLCAyNywgMTcsCisgICAgMzEsIDQ0LCAyOCwgMzMsIDMzLCAzMSwgMjMsIDMxLAorICAgIDQwLCAzMywgMzEsIDM0LCAzMCwgMzIsIDMzLCAzNiwKKyAgICAzNSwgNDcsIDM3LCA0MSwgMzEsIDIzLCA0MSwgMjksCisgICAgMzAsIDM1LCAzMiwgMjUsIDMyLCAyOCwgNTgsICAyLAorICAgIDM3LCAzMywgMTQsIDMzLCA0OSwgMjAsIDM5LCAzNiwKKyAgICAyMSwgIDksIDIzLCAzMywgMzUsIDI0LCAzOSwgMzcsCisgICAgMTEsIDMzLCAzMCwgMzEsIDMxLCAyOCwgNTEsIDQwLAorICAgIDM1LCAyOSwgMjUsIDMzLCA0NiwgMzUsIDM3LCAzMCwKKyAgICAzMCwgIDgsIDYzLCAyOCwgMTUsIDQwLCAzMywgNDUsCisgICAgNDksIDI1LCAzMiwgIDQsIDQ3LCA1MSwgMzYsIDM5LAorICAgIDUzLCAxMCwgMjQsIDI5LCAzMCwgMzEsIDI1LCA0MCwKKyAgICAzOCwgMzgsIDMzLCA1NiwgMjMsIDI3LCAzMiwgMzcsCisgICAgMjYsIDI5LCA0MywgMzYsIDMzLCAyNCwgNTUsIDQzLAorICAgICA5LCAyOSwgMzQsIDM0LCAyNCwgMzMsIDE4LCAzMywKKyAgICAzMywgMzAsIDMxLCA1MCwgMjQsIDYwLCAzMCwgMzksCisgICAgMzQsIDMwLCAzOSwgMjgsIDIyLCAzOCwgIDIsIDI2LAorICAgIDYzLCAzMiwgNTcsIDIxLCAzOSwgMzMsIDI4LCAxOCwKKyAgICAzMCwgMzQsIDIyLCAzMywgMjksIDQxLCAzMCwgMzQsCisgICAgMzUsIDIxLCAxMywgMzQsIDM1LCAzOSwgMzAsIDQ2LAorICAgIDMyLCA0MiwgMzIsIDMxLCAzMywgMjYsIDExLCAzMywKKyAgICAyMiwgMzEsIDI1LCAzMSwgNTMsIDI3LCA0MywgMjUsCisgICAgNDAsIDUwLCAyMSwgMzYsIDM4LCAzMCwgMTIsIDMxLAorICAgIDM0LCAyMCwgMTUsIDI5LCAzMiwgNjIsIDMwLCAxMywKKyAgICAxNywgMzIsIDE5LCAzMSwgMjAsIDMxLCAzMCwgIDcsCisgICAgIDEsIDE3LCAzNCwgMzcsIDMxLCAzMSwgNDQsIDM0LAorICAgIDI2LCA0MCwgMTYsIDM3LCA1MiwgNDgsIDMwLCAyMCwKKyAgICAxOCwgMzMsIDM4LCAyOSwgIDcsIDI1LCAzMCwgNTQsCisgICAgNDUsIDQ3LCA0NiwgNDEsIDI5LCAyOSwgMTYsIDMwLAorICAgIDE0LCAyNiwgMzgsIDM0LCAzNCwgMjksIDM0LCAzMCwKKyAgICAyOSwgMzAsIDU3LCAzMCwgIDQsIDQ2LCAzMywgMjksCisgICAgMzksIDQ0LCAzMCwgMzEsIDUwLCAzMywgMzEsIDMyLAorICAgIDE5LCAzMiwgNDAsIDMxLCAzNywgNDcsICAxLCAzNSwKKyAgICAxNiwgMzEsICAwLCAzNSwgMzMsICAxLCAxNywgMzQsCisgICAgIDksIDM0LCAzMywgMzEsIDQ5LCA0MywgNDIsIDUxLAorICAgIDM0LCAyOSwgMjMsIDI5LCAxNCwgMzAsIDQ1LCA0OSwKKyAgICAxMSwgMjQsIDMxLCAyOCwgMzUsIDQxLCAzMCwgNDQsCisgICAgMTgsIDI5LCAzNCwgMzUsIDM2LCAyNSwgMjYsIDIxLAorICAgIDMxLCAzMCwgMzQsIDE5LCAzNCwgNDQsIDM2LCAzOCwKKyAgICAyNSwgMzEsIDI4LCAyMywgMzcsICAzLCA1NSwgNDEsCisgICAgMzAsIDIyLCA0MSwgMjQsIDMzLCAyNiwgMzUsIDM1LAorICAgIDMwLCA1NSwgNTEsIDQ3LCA0OCwgMzgsIDI0LCAxNSwKKyAgICAyMSwgNTAsIDI1LCA0NiwgMzAsIDI5LCAxMCwgMzQsCisgICAgNDIsIDQ1LCAyOSwgNDIsIDIyLCAgMywgMzMsIDI3LAorICAgIDM0LCAgMSwgMzQsIDI4LCAzNCwgMzYsIDM1LCAyMywKKyAgICAyMywgMTMsIDU4LCAgMywgMjYsIDYzLCAyNSwgMzEsCisgICAgMzQsIDYxLCAzOCwgMzksIDI1LCA2MSwgMjksIDM3LAorICAgIDMwLCA0MSwgMjYsIDQ4LCAyOCwgMzMsIDUwLCAzNSwKKyAgICAzMCwgMzcsIDI5LCAyOSwgNDAsICA2LCAzOSwgMjgsCisgICAgMjgsIDE5LCAgOCwgMjIsIDQ1LCAzNCwgMzUsIDEwLAorICAgIDU4LCAxNywgMzcsIDM5LCAzMCwgMTgsIDU0LCAxNCwKKyAgICAyOSwgMTYsIDU5LCAzMCwgMzUsIDIzLCAzNSwgMzAsCisgICAgNDcsIDM2LCAyOSwgNTUsIDIwLCAxMiwgMzEsIDM1LAorICAgIDE0LCAyOSwgMTgsIDM0LCAzNCwgMjQsIDI5LCAyNiwKKyAgICAyMiwgIDIsIDI3LCAyMywgIDgsIDMwLCA1NSwgMzgsCisgICAgNjAsIDMxLCAgNCwgMzQsIDQ5LCAzNCwgMjcsIDM0LAorICAgIDMzLCAzMCwgMzEsIDU0LCA0MiwgMzUsIDM4LCA0NiwKKyAgICA0NCwgMjYsIDI3LCAgOSwgMzksIDI1LCAyMSwgMjksCisgICAgMjgsIDQyLCAxMywgIDAsICA1LCAzNCwgMzcsIDI4LAorICAgIDI0LCAyOSwgNjMsIDI2LCAyMiwgMjcsIDI5LCAyNSwKKyAgICAzMywgMjUsIDYxLCAgMCwgMzUsIDI1LCAzNiwgMTUsCisgICAgMjcsIDQwLCA1MywgMzMsICAzLCAxMCwgMTYsIDM3LAorICAgIDM4LCAxOCwgMzAsIDQ2LCAyNywgIDksICA2LCAyOSwKKyAgICA2MiwgIDgsIDQyLCAyOCwgMjksICAzLCAyNSwgMTYsCisgICAgMjYsIDI5LCAzNSwgMjgsIDI3LCA1MSwgNjEsIDQ4LAorICAgIDM3LCAgOSwgMzQsICA3LCA0OSwgNDUsIDIwLCAyOSwKKyAgICAyMSwgIDUsICA1LCAyOSwgMjgsIDM0LCAyOSwgMjQsCisgICAgMTAsIDI0LCAzNSwgMzYsIDM4LCA1NSwgMTEsIDM2LAorICAgIDM4LCA1MywgNTQsIDI2LCAzMCwgNDksIDIwLCAyNywKKyAgICAzMCwgMzksIDMzLCA0MSwgNDksIDIyLCAzOCwgMzgsCisgICAgIDQsIDMwLCAgOCwgIDksICAzLCAyNCwgMjIsIDUwLAorICAgIDM3LCAzNiwgMzEsIDI3LCAgMiwgIDksIDQyLCA2MywKKyAgICAyNSwgMTksIDQ0LCAgMSwgMjgsIDI4LCA0OCwgMzAsCisgICAgMzQsIDQxLCA0MSwgMzgsIDEyLCAyNywgMTUsICAwLAorICAgIDE2LCAzNCwgMzUsIDM4LCAyOCwgMjksIDQwLCA0MiwKKyAgICA1MSwgNTIsIDQ1LCA1NCwgNTksIDU5LCA0MiwgNDQsCisgICAgMzcsIDI2LCA0NiwgMjQsIDE1LCAzOSwgMjIsIDQ2LAorICAgIDE5LCAzNSwgMzgsIDE3LCAzNywgMjMsIDUyLCA1NSwKKyAgICA1MCwgMzcsIDI2LCAxMSwgMzcsIDEyLCAyNCwgMzAsCisgICAgMTYsIDEzLCAyMiwgMTMsIDM2LCAzNSwgNDAsIDQxLAorICAgIDM0LCA0MSwgMjYsIDUzLCA1MSwgIDUsIDIxLCAzMCwKKyAgICAgMiwgNjMsIDQxLCAyMCwgIDEsIDU2LCAyMSwgMjQsCisgICAgMjUsICA1LCAyOCwgMzUsIDI2LCAyOCwgMzAsIDE4LAorICAgIDI5LCAyMywgNDAsIDM0LCAyMCwgNDIsIDM5LCAzNCwKKyAgICAyOCwgNjEsIDM4LCAyNywgNjIsICA5LCAzNiwgMTcsCisgICAgIDksIDQ5LCAyNCwgMjUsIDU0LCAzNCwgMzksIDM3LAorICAgICAzLCAgMSwgMjUsIDM4LCAzOCwgNDQsIDM1LCAzNiwKKyAgICAxMiwgNjAsIDM2LCAzOCwgNDAsIDI1LCA0MywgMzksCisgICAgNTMsIDI4LCAzOSwgNTcsIDQ2LCAxMCwgNTIsIDI3LAorICAgIDM1LCA0MiwgNDUsIDU5LCAxNSwgNjAsIDM4LCAyNCwKKyAgICAyMywgMzksIDEyLCAyOSwgMjQsICAwLCAyMCwgMTYsCisgICAgMjgsIDQzLCAzNSwgMjgsICAxLCA0OSwgIDQsIDIxLAorICAgIDQyLCAzOSwgMjksICAzLCA0NCwgMjEsIDUzLCA1NSwKKyAgICAxMSwgIDUsICAzLCAzOSwgNTMsIDI4LCAyNSwgMTksCisgICAgMzQsIDI4LCAyMSwKIH07CiAKIE1WVGFibGUgZmZfbXZfdGFibGVzWzJdID0gewotICAgIHsKLSAgICAgICAgMTA5OSwKLSAgICAgICAgdGFibGUwX212X2NvZGUsCi0gICAgICAgIHRhYmxlMF9tdl9iaXRzLAotICAgICAgICB0YWJsZTBfbXZ4LAotICAgICAgICB0YWJsZTBfbXZ5LAotICAgIH0sCi0gICAgewotICAgICAgICAxMDk5LAotICAgICAgICB0YWJsZTFfbXZfY29kZSwKLSAgICAgICAgdGFibGUxX212X2JpdHMsCi0gICAgICAgIHRhYmxlMV9tdngsCi0gICAgICAgIHRhYmxlMV9tdnksCi0gICAgfQorICAgIHsgMTA5OSwKKyAgICAgIHRhYmxlMF9tdl9jb2RlLAorICAgICAgdGFibGUwX212X2JpdHMsCisgICAgICB0YWJsZTBfbXZ4LAorICAgICAgdGFibGUwX212eSwgfSwKKyAgICB7IDEwOTksCisgICAgICB0YWJsZTFfbXZfY29kZSwKKyAgICAgIHRhYmxlMV9tdl9iaXRzLAorICAgICAgdGFibGUxX212eCwKKyAgICAgIHRhYmxlMV9tdnksIH0KIH07CiAKIGNvbnN0IHVpbnQ4X3QgZmZfdjJfbWJfdHlwZVs4XVsyXSA9IHsKLSB7MSwgMX0sIHswICAgLCAyfSwgezMgICAsIDN9LCB7OSAgICwgNX0sCi0gezUsIDR9LCB7MHgyMSwgN30sIHsweDIwLCA3fSwgezB4MTEsIDZ9LAorICAgIHsgMSwgMSB9LCB7ICAgIDAsIDIgfSwgeyAgICAzLCAzIH0sIHsgICAgOSwgNSB9LAorICAgIHsgNSwgNCB9LCB7IDB4MjEsIDcgfSwgeyAweDIwLCA3IH0sIHsgMHgxMSwgNiB9LAogfTsKIAogY29uc3QgdWludDhfdCBmZl92Ml9pbnRyYV9jYnBjWzRdWzJdID0gewotIHsxLCAxfSwgezAsIDN9LCB7MSwgM30sIHsxLCAyfSwKKyAgICB7IDEsIDEgfSwgeyAwLCAzIH0sIHsgMSwgMyB9LCB7IDEsIDIgfSwKIH07CiAKLWNvbnN0IHVpbnQ4X3QgZmZfd212MV95X2RjX3NjYWxlX3RhYmxlWzMyXT17Ci0vLyAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMQotICAgIDAsIDgsIDgsIDgsIDgsIDgsIDksIDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEKK2NvbnN0IHVpbnQ4X3QgZmZfd212MV95X2RjX3NjYWxlX3RhYmxlWzMyXSA9IHsKKyAgICAgMCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywKKyAgICAxNCwgMTQsIDE1LCAxNSwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMQogfTsKLWNvbnN0IHVpbnQ4X3QgZmZfd212MV9jX2RjX3NjYWxlX3RhYmxlWzMyXT17Ci0vLyAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwxMCwxMSwxMiwxMywxNCwxNSwxNiwxNywxOCwxOSwyMCwyMSwyMiwyMywyNCwyNSwyNiwyNywyOCwyOSwzMCwzMQotICAgIDAsIDgsIDgsIDgsIDgsIDksIDksMTAsMTAsMTEsMTEsMTIsMTIsMTMsMTMsMTQsMTQsMTUsMTUsMTYsMTYsMTcsMTcsMTgsMTgsMTksMTksMjAsMjAsMjEsMjEsMjIKK2NvbnN0IHVpbnQ4X3QgZmZfd212MV9jX2RjX3NjYWxlX3RhYmxlWzMyXSA9IHsKKyAgICAgMCwgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTUsIDE1LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LCAxOSwgMTksIDIwLCAyMCwgMjEsIDIxLCAyMgogfTsKIAotY29uc3QgdWludDhfdCBmZl9vbGRfZmZfeV9kY19zY2FsZV90YWJsZVszMl09ewotLy8gIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgMTAgMTEgMTIgMTMgMTQgMTUgMTYgMTcgMTggMTkgMjAgMjEgMjIgMjMgMjQgMjUgMjYgMjcgMjggMjkgMzAgMzEKLSAgICAwLCA4LCA4LCA4LCA4LDEwLDEyLDE0LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDM2LDM3LDM4LDM5Citjb25zdCB1aW50OF90IGZmX29sZF9mZl95X2RjX3NjYWxlX3RhYmxlWzMyXSA9IHsKKyAgICAgMCwgIDgsICA4LCAgOCwgIDgsIDEwLCAxMiwgMTQsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywKKyAgICAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOQogfTsKIAotY29uc3QgdWludDhfdCBmZl93bXYxX3NjYW50YWJsZVtXTVYxX1NDQU5UQUJMRV9DT1VOVF1bNjRdPXsKLSAgewotICAgIDB4MDAsIDB4MDgsIDB4MDEsIDB4MDIsIDB4MDksIDB4MTAsIDB4MTgsIDB4MTEsCi0gICAgMHgwQSwgMHgwMywgMHgwNCwgMHgwQiwgMHgxMiwgMHgxOSwgMHgyMCwgMHgyOCwKLSAgICAweDMwLCAweDM4LCAweDI5LCAweDIxLCAweDFBLCAweDEzLCAweDBDLCAweDA1LAotICAgIDB4MDYsIDB4MEQsIDB4MTQsIDB4MUIsIDB4MjIsIDB4MzEsIDB4MzksIDB4M0EsCi0gICAgMHgzMiwgMHgyQSwgMHgyMywgMHgxQywgMHgxNSwgMHgwRSwgMHgwNywgMHgwRiwKLSAgICAweDE2LCAweDFELCAweDI0LCAweDJCLCAweDMzLCAweDNCLCAweDNDLCAweDM0LAotICAgIDB4MkMsIDB4MjUsIDB4MUUsIDB4MTcsIDB4MUYsIDB4MjYsIDB4MkQsIDB4MzUsCi0gICAgMHgzRCwgMHgzRSwgMHgzNiwgMHgyRSwgMHgyNywgMHgyRiwgMHgzNywgMHgzRiwKLSAgfSwKLSAgewotICAgIDB4MDAsIDB4MDgsIDB4MDEsIDB4MDIsIDB4MDksIDB4MTAsIDB4MTgsIDB4MTEsCi0gICAgMHgwQSwgMHgwMywgMHgwNCwgMHgwQiwgMHgxMiwgMHgxOSwgMHgyMCwgMHgyOCwKLSAgICAweDIxLCAweDMwLCAweDFBLCAweDEzLCAweDBDLCAweDA1LCAweDA2LCAweDBELAotICAgIDB4MTQsIDB4MUIsIDB4MjIsIDB4MjksIDB4MzgsIDB4MzEsIDB4MzksIDB4MkEsCi0gICAgMHgyMywgMHgxQywgMHgxNSwgMHgwRSwgMHgwNywgMHgwRiwgMHgxNiwgMHgxRCwKLSAgICAweDI0LCAweDJCLCAweDMyLCAweDNBLCAweDMzLCAweDNCLCAweDJDLCAweDI1LAotICAgIDB4MUUsIDB4MTcsIDB4MUYsIDB4MjYsIDB4MkQsIDB4MzQsIDB4M0MsIDB4MzUsCi0gICAgMHgzRCwgMHgyRSwgMHgyNywgMHgyRiwgMHgzNiwgMHgzRSwgMHgzNywgMHgzRiwKLSAgfSwKLSAgewotICAgIDB4MDAsIDB4MDEsIDB4MDgsIDB4MDIsIDB4MDMsIDB4MDksIDB4MTAsIDB4MTgsCi0gICAgMHgxMSwgMHgwQSwgMHgwNCwgMHgwNSwgMHgwQiwgMHgxMiwgMHgxOSwgMHgyMCwKLSAgICAweDI4LCAweDMwLCAweDIxLCAweDFBLCAweDEzLCAweDBDLCAweDA2LCAweDA3LAotICAgIDB4MEQsIDB4MTQsIDB4MUIsIDB4MjIsIDB4MjksIDB4MzgsIDB4MzEsIDB4MzksCi0gICAgMHgyQSwgMHgyMywgMHgxQywgMHgxNSwgMHgwRSwgMHgwRiwgMHgxNiwgMHgxRCwKLSAgICAweDI0LCAweDJCLCAweDMyLCAweDNBLCAweDMzLCAweDJDLCAweDI1LCAweDFFLAotICAgIDB4MTcsIDB4MUYsIDB4MjYsIDB4MkQsIDB4MzQsIDB4M0IsIDB4M0MsIDB4MzUsCi0gICAgMHgyRSwgMHgyNywgMHgyRiwgMHgzNiwgMHgzRCwgMHgzRSwgMHgzNywgMHgzRiwKLSAgfSwKLSAgewotICAgIDB4MDAsIDB4MDgsIDB4MTAsIDB4MDEsIDB4MTgsIDB4MjAsIDB4MjgsIDB4MDksCi0gICAgMHgwMiwgMHgwMywgMHgwQSwgMHgxMSwgMHgxOSwgMHgzMCwgMHgzOCwgMHgyOSwKLSAgICAweDIxLCAweDFBLCAweDEyLCAweDBCLCAweDA0LCAweDA1LCAweDBDLCAweDEzLAotICAgIDB4MUIsIDB4MjIsIDB4MzEsIDB4MzksIDB4MzIsIDB4MkEsIDB4MjMsIDB4MUMsCi0gICAgMHgxNCwgMHgwRCwgMHgwNiwgMHgwNywgMHgwRSwgMHgxNSwgMHgxRCwgMHgyNCwKLSAgICAweDJCLCAweDMzLCAweDNBLCAweDNCLCAweDM0LCAweDJDLCAweDI1LCAweDFFLAotICAgIDB4MTYsIDB4MEYsIDB4MTcsIDB4MUYsIDB4MjYsIDB4MkQsIDB4M0MsIDB4MzUsCi0gICAgMHgyRSwgMHgyNywgMHgyRiwgMHgzNiwgMHgzRCwgMHgzRSwgMHgzNywgMHgzRiwKLSAgfQorY29uc3QgdWludDhfdCBmZl93bXYxX3NjYW50YWJsZVtXTVYxX1NDQU5UQUJMRV9DT1VOVF1bNjRdID0geworICAgIHsgMHgwMCwgMHgwOCwgMHgwMSwgMHgwMiwgMHgwOSwgMHgxMCwgMHgxOCwgMHgxMSwKKyAgICAgIDB4MEEsIDB4MDMsIDB4MDQsIDB4MEIsIDB4MTIsIDB4MTksIDB4MjAsIDB4MjgsCisgICAgICAweDMwLCAweDM4LCAweDI5LCAweDIxLCAweDFBLCAweDEzLCAweDBDLCAweDA1LAorICAgICAgMHgwNiwgMHgwRCwgMHgxNCwgMHgxQiwgMHgyMiwgMHgzMSwgMHgzOSwgMHgzQSwKKyAgICAgIDB4MzIsIDB4MkEsIDB4MjMsIDB4MUMsIDB4MTUsIDB4MEUsIDB4MDcsIDB4MEYsCisgICAgICAweDE2LCAweDFELCAweDI0LCAweDJCLCAweDMzLCAweDNCLCAweDNDLCAweDM0LAorICAgICAgMHgyQywgMHgyNSwgMHgxRSwgMHgxNywgMHgxRiwgMHgyNiwgMHgyRCwgMHgzNSwKKyAgICAgIDB4M0QsIDB4M0UsIDB4MzYsIDB4MkUsIDB4MjcsIDB4MkYsIDB4MzcsIDB4M0YsIH0sCisgICAgeyAweDAwLCAweDA4LCAweDAxLCAweDAyLCAweDA5LCAweDEwLCAweDE4LCAweDExLAorICAgICAgMHgwQSwgMHgwMywgMHgwNCwgMHgwQiwgMHgxMiwgMHgxOSwgMHgyMCwgMHgyOCwKKyAgICAgIDB4MjEsIDB4MzAsIDB4MUEsIDB4MTMsIDB4MEMsIDB4MDUsIDB4MDYsIDB4MEQsCisgICAgICAweDE0LCAweDFCLCAweDIyLCAweDI5LCAweDM4LCAweDMxLCAweDM5LCAweDJBLAorICAgICAgMHgyMywgMHgxQywgMHgxNSwgMHgwRSwgMHgwNywgMHgwRiwgMHgxNiwgMHgxRCwKKyAgICAgIDB4MjQsIDB4MkIsIDB4MzIsIDB4M0EsIDB4MzMsIDB4M0IsIDB4MkMsIDB4MjUsCisgICAgICAweDFFLCAweDE3LCAweDFGLCAweDI2LCAweDJELCAweDM0LCAweDNDLCAweDM1LAorICAgICAgMHgzRCwgMHgyRSwgMHgyNywgMHgyRiwgMHgzNiwgMHgzRSwgMHgzNywgMHgzRiwgfSwKKyAgICB7IDB4MDAsIDB4MDEsIDB4MDgsIDB4MDIsIDB4MDMsIDB4MDksIDB4MTAsIDB4MTgsCisgICAgICAweDExLCAweDBBLCAweDA0LCAweDA1LCAweDBCLCAweDEyLCAweDE5LCAweDIwLAorICAgICAgMHgyOCwgMHgzMCwgMHgyMSwgMHgxQSwgMHgxMywgMHgwQywgMHgwNiwgMHgwNywKKyAgICAgIDB4MEQsIDB4MTQsIDB4MUIsIDB4MjIsIDB4MjksIDB4MzgsIDB4MzEsIDB4MzksCisgICAgICAweDJBLCAweDIzLCAweDFDLCAweDE1LCAweDBFLCAweDBGLCAweDE2LCAweDFELAorICAgICAgMHgyNCwgMHgyQiwgMHgzMiwgMHgzQSwgMHgzMywgMHgyQywgMHgyNSwgMHgxRSwKKyAgICAgIDB4MTcsIDB4MUYsIDB4MjYsIDB4MkQsIDB4MzQsIDB4M0IsIDB4M0MsIDB4MzUsCisgICAgICAweDJFLCAweDI3LCAweDJGLCAweDM2LCAweDNELCAweDNFLCAweDM3LCAweDNGLCB9LAorICAgIHsgMHgwMCwgMHgwOCwgMHgxMCwgMHgwMSwgMHgxOCwgMHgyMCwgMHgyOCwgMHgwOSwKKyAgICAgIDB4MDIsIDB4MDMsIDB4MEEsIDB4MTEsIDB4MTksIDB4MzAsIDB4MzgsIDB4MjksCisgICAgICAweDIxLCAweDFBLCAweDEyLCAweDBCLCAweDA0LCAweDA1LCAweDBDLCAweDEzLAorICAgICAgMHgxQiwgMHgyMiwgMHgzMSwgMHgzOSwgMHgzMiwgMHgyQSwgMHgyMywgMHgxQywKKyAgICAgIDB4MTQsIDB4MEQsIDB4MDYsIDB4MDcsIDB4MEUsIDB4MTUsIDB4MUQsIDB4MjQsCisgICAgICAweDJCLCAweDMzLCAweDNBLCAweDNCLCAweDM0LCAweDJDLCAweDI1LCAweDFFLAorICAgICAgMHgxNiwgMHgwRiwgMHgxNywgMHgxRiwgMHgyNiwgMHgyRCwgMHgzQywgMHgzNSwKKyAgICAgIDB4MkUsIDB4MjcsIDB4MkYsIDB4MzYsIDB4M0QsIDB4M0UsIDB4MzcsIDB4M0YsIH0KIH07CiAKLWNvbnN0IHVpbnQ4X3QgZmZfdGFibGVfaW50ZXJfaW50cmFbNF1bMl09ewotICAgIHswLDF9IC8qTHVtYS1MZWZ0IENocm9tYS1MZWZ0Ki8sCi0gICAgezIsMn0gLypMdW1hLVRvcCAgQ2hyb21hLUxlZnQqLywKLSAgICB7NiwzfSAvKmx1bWEtTGVmdCBDaHJvbWEtVG9wICovLAotICAgIHs3LDN9IC8qbHVtYS1Ub3AgIENocm9tYS1Ub3AgKi8KK2NvbnN0IHVpbnQ4X3QgZmZfdGFibGVfaW50ZXJfaW50cmFbNF1bMl0gPSB7CisgICAgeyAwLCAxIH0gLyogTHVtYS1MZWZ0IENocm9tYS1MZWZ0ICovLAorICAgIHsgMiwgMiB9IC8qIEx1bWEtVG9wICBDaHJvbWEtTGVmdCAqLywKKyAgICB7IDYsIDMgfSAvKiBsdW1hLUxlZnQgQ2hyb21hLVRvcCAgKi8sCisgICAgeyA3LCAzIH0gLyogbHVtYS1Ub3AgIENocm9tYS1Ub3AgICovCiB9OwogCiBzdGF0aWMgY29uc3QgdWludDMyX3QgdGFibGVfbWJfbm9uX2ludHJhMlsxMjhdWzJdID0gewotezB4MDAwMEE3LCAxNH0sIHsweDAxQjJCOCwgMTh9LCB7MHgwMUIyOEUsIDE4fSwgezB4MDM2NTc1LCAxOX0sCi17MHgwMDZDQUMsIDE2fSwgezB4MDAwQTY5LCAxOH0sIHsweDAwMjkzNCwgMjB9LCB7MHgwMDUyNkIsIDIxfSwKLXsweDAwNkNBMSwgMTZ9LCB7MHgwMUIyQjksIDE4fSwgezB4MDAyOUFELCAyMH0sIHsweDAyOTM1MywgMjR9LAotezB4MDA2Q0E3LCAxNn0sIHsweDAwNkNBQiwgMTZ9LCB7MHgwMUIyQkIsIDE4fSwgezB4MDAwMjlCLCAxNn0sCi17MHgwMEQ5NDQsIDE3fSwgezB4MDAwQTZBLCAxOH0sIHsweDAxNDlBOCwgMjN9LCB7MHgwMzY1MUYsIDE5fSwKLXsweDAwNkNBRiwgMTZ9LCB7MHgwMDBBNEMsIDE4fSwgezB4MDM2NTFFLCAxOX0sIHsweDAwMEE0OCwgMTh9LAotezB4MDAyOTlDLCAyMH0sIHsweDAwMjk5RiwgMjB9LCB7MHgwMjkzNTIsIDI0fSwgezB4MDAyOUFDLCAyMH0sCi17MHgwMDAyOTYsIDE2fSwgezB4MDBEOTQ2LCAxN30sIHsweDAwMEE2OCwgMTh9LCB7MHgwMDAyOTgsIDE2fSwKLXsweDAwMDUyNywgMTd9LCB7MHgwMEQ5NEQsIDE3fSwgezB4MDAxNEQ3LCAxOX0sIHsweDAzNjU3NCwgMTl9LAotezB4MDAwQTVDLCAxOH0sIHsweDAxQjI5OSwgMTh9LCB7MHgwMDI5OUQsIDIwfSwgezB4MDAyOTlFLCAyMH0sCi17MHgwMDA1MjUsIDE3fSwgezB4MDAwQTY2LCAxOH0sIHsweDAwQTRENSwgMjJ9LCB7MHgwMDE0OUIsIDE5fSwKLXsweDAwMDI5NSwgMTZ9LCB7MHgwMDZDQUQsIDE2fSwgezB4MDAwQTQ5LCAxOH0sIHsweDAwMDUyMSwgMTd9LAotezB4MDA2Q0FBLCAxNn0sIHsweDAwRDk0NSwgMTd9LCB7MHgwMUIyOTgsIDE4fSwgezB4MDAwNTJGLCAxN30sCi17MHgwMDM2NTQsIDE1fSwgezB4MDA2Q0EwLCAxNn0sIHsweDAwMDUzMiwgMTd9LCB7MHgwMDAyOTEsIDE2fSwKLXsweDAwMzY1MiwgMTV9LCB7MHgwMDA1MjAsIDE3fSwgezB4MDAwQTVELCAxOH0sIHsweDAwMDI5NCwgMTZ9LAotezB4MDAwMDlCLCAxMX0sIHsweDAwMDZFMiwgMTJ9LCB7MHgwMDAwMjgsIDEyfSwgezB4MDAwMUIwLCAxMH0sCi17MHgwMDAwMDEsICAzfSwgezB4MDAwMDEwLCAgOH0sIHsweDAwMDAyRiwgIDZ9LCB7MHgwMDAwNEMsIDEwfSwKLXsweDAwMDAwRCwgIDR9LCB7MHgwMDAwMDAsIDEwfSwgezB4MDAwMDA2LCAgOX0sIHsweDAwMDEzNCwgMTJ9LAotezB4MDAwMDBDLCAgNH0sIHsweDAwMDAwNywgMTB9LCB7MHgwMDAwMDcsICA5fSwgezB4MDAwNkUxLCAxMn0sCi17MHgwMDAwMEUsICA1fSwgezB4MDAwMERBLCAgOX0sIHsweDAwMDAyMiwgIDl9LCB7MHgwMDAzNjQsIDExfSwKLXsweDAwMDAwRiwgIDR9LCB7MHgwMDAwMDYsIDEwfSwgezB4MDAwMDBGLCAgOX0sIHsweDAwMDEzNSwgMTJ9LAotezB4MDAwMDE0LCAgNX0sIHsweDAwMDBERCwgIDl9LCB7MHgwMDAwMDQsICA5fSwgezB4MDAwMDE1LCAxMX0sCi17MHgwMDAwMUEsICA2fSwgezB4MDAwMUIzLCAxMH0sIHsweDAwMDAwNSwgMTB9LCB7MHgwMDA2RTMsIDEyfSwKLXsweDAwMDAwQywgIDV9LCB7MHgwMDAwQjksICA4fSwgezB4MDAwMDA0LCAgOH0sIHsweDAwMDBEQiwgIDl9LAotezB4MDAwMDBFLCAgNH0sIHsweDAwMDAwQiwgMTB9LCB7MHgwMDAwMjMsICA5fSwgezB4MDAwNkNCLCAxMn0sCi17MHgwMDAwMDUsICA2fSwgezB4MDAwMUIxLCAxMH0sIHsweDAwMDAwMSwgMTB9LCB7MHgwMDA2RTAsIDEyfSwKLXsweDAwMDAxMSwgIDV9LCB7MHgwMDAwREYsICA5fSwgezB4MDAwMDBFLCAgOX0sIHsweDAwMDM3MywgMTF9LAotezB4MDAwMDAzLCAgNX0sIHsweDAwMDBCOCwgIDh9LCB7MHgwMDAwMDYsICA4fSwgezB4MDAwMTc1LCAgOX0sCi17MHgwMDAwMTUsICA1fSwgezB4MDAwMTc0LCAgOX0sIHsweDAwMDAyNywgIDl9LCB7MHgwMDAzNzIsIDExfSwKLXsweDAwMDAxMCwgIDV9LCB7MHgwMDAwQkIsICA4fSwgezB4MDAwMDA1LCAgOH0sIHsweDAwMDBERSwgIDl9LAotezB4MDAwMDBGLCAgNX0sIHsweDAwMDAwMSwgIDl9LCB7MHgwMDAwMTIsICA4fSwgezB4MDAwMDA0LCAxMH0sCi17MHgwMDAwMDIsICAzfSwgezB4MDAwMDE2LCAgNX0sIHsweDAwMDAwOSwgIDR9LCB7MHgwMDAwMDEsICA1fSwKKyAgICB7IDB4MDAwMEE3LCAxNCB9LCB7IDB4MDFCMkI4LCAxOCB9LCB7IDB4MDFCMjhFLCAxOCB9LCB7IDB4MDM2NTc1LCAxOSB9LAorICAgIHsgMHgwMDZDQUMsIDE2IH0sIHsgMHgwMDBBNjksIDE4IH0sIHsgMHgwMDI5MzQsIDIwIH0sIHsgMHgwMDUyNkIsIDIxIH0sCisgICAgeyAweDAwNkNBMSwgMTYgfSwgeyAweDAxQjJCOSwgMTggfSwgeyAweDAwMjlBRCwgMjAgfSwgeyAweDAyOTM1MywgMjQgfSwKKyAgICB7IDB4MDA2Q0E3LCAxNiB9LCB7IDB4MDA2Q0FCLCAxNiB9LCB7IDB4MDFCMkJCLCAxOCB9LCB7IDB4MDAwMjlCLCAxNiB9LAorICAgIHsgMHgwMEQ5NDQsIDE3IH0sIHsgMHgwMDBBNkEsIDE4IH0sIHsgMHgwMTQ5QTgsIDIzIH0sIHsgMHgwMzY1MUYsIDE5IH0sCisgICAgeyAweDAwNkNBRiwgMTYgfSwgeyAweDAwMEE0QywgMTggfSwgeyAweDAzNjUxRSwgMTkgfSwgeyAweDAwMEE0OCwgMTggfSwKKyAgICB7IDB4MDAyOTlDLCAyMCB9LCB7IDB4MDAyOTlGLCAyMCB9LCB7IDB4MDI5MzUyLCAyNCB9LCB7IDB4MDAyOUFDLCAyMCB9LAorICAgIHsgMHgwMDAyOTYsIDE2IH0sIHsgMHgwMEQ5NDYsIDE3IH0sIHsgMHgwMDBBNjgsIDE4IH0sIHsgMHgwMDAyOTgsIDE2IH0sCisgICAgeyAweDAwMDUyNywgMTcgfSwgeyAweDAwRDk0RCwgMTcgfSwgeyAweDAwMTRENywgMTkgfSwgeyAweDAzNjU3NCwgMTkgfSwKKyAgICB7IDB4MDAwQTVDLCAxOCB9LCB7IDB4MDFCMjk5LCAxOCB9LCB7IDB4MDAyOTlELCAyMCB9LCB7IDB4MDAyOTlFLCAyMCB9LAorICAgIHsgMHgwMDA1MjUsIDE3IH0sIHsgMHgwMDBBNjYsIDE4IH0sIHsgMHgwMEE0RDUsIDIyIH0sIHsgMHgwMDE0OUIsIDE5IH0sCisgICAgeyAweDAwMDI5NSwgMTYgfSwgeyAweDAwNkNBRCwgMTYgfSwgeyAweDAwMEE0OSwgMTggfSwgeyAweDAwMDUyMSwgMTcgfSwKKyAgICB7IDB4MDA2Q0FBLCAxNiB9LCB7IDB4MDBEOTQ1LCAxNyB9LCB7IDB4MDFCMjk4LCAxOCB9LCB7IDB4MDAwNTJGLCAxNyB9LAorICAgIHsgMHgwMDM2NTQsIDE1IH0sIHsgMHgwMDZDQTAsIDE2IH0sIHsgMHgwMDA1MzIsIDE3IH0sIHsgMHgwMDAyOTEsIDE2IH0sCisgICAgeyAweDAwMzY1MiwgMTUgfSwgeyAweDAwMDUyMCwgMTcgfSwgeyAweDAwMEE1RCwgMTggfSwgeyAweDAwMDI5NCwgMTYgfSwKKyAgICB7IDB4MDAwMDlCLCAxMSB9LCB7IDB4MDAwNkUyLCAxMiB9LCB7IDB4MDAwMDI4LCAxMiB9LCB7IDB4MDAwMUIwLCAxMCB9LAorICAgIHsgMHgwMDAwMDEsICAzIH0sIHsgMHgwMDAwMTAsICA4IH0sIHsgMHgwMDAwMkYsICA2IH0sIHsgMHgwMDAwNEMsIDEwIH0sCisgICAgeyAweDAwMDAwRCwgIDQgfSwgeyAweDAwMDAwMCwgMTAgfSwgeyAweDAwMDAwNiwgIDkgfSwgeyAweDAwMDEzNCwgMTIgfSwKKyAgICB7IDB4MDAwMDBDLCAgNCB9LCB7IDB4MDAwMDA3LCAxMCB9LCB7IDB4MDAwMDA3LCAgOSB9LCB7IDB4MDAwNkUxLCAxMiB9LAorICAgIHsgMHgwMDAwMEUsICA1IH0sIHsgMHgwMDAwREEsICA5IH0sIHsgMHgwMDAwMjIsICA5IH0sIHsgMHgwMDAzNjQsIDExIH0sCisgICAgeyAweDAwMDAwRiwgIDQgfSwgeyAweDAwMDAwNiwgMTAgfSwgeyAweDAwMDAwRiwgIDkgfSwgeyAweDAwMDEzNSwgMTIgfSwKKyAgICB7IDB4MDAwMDE0LCAgNSB9LCB7IDB4MDAwMERELCAgOSB9LCB7IDB4MDAwMDA0LCAgOSB9LCB7IDB4MDAwMDE1LCAxMSB9LAorICAgIHsgMHgwMDAwMUEsICA2IH0sIHsgMHgwMDAxQjMsIDEwIH0sIHsgMHgwMDAwMDUsIDEwIH0sIHsgMHgwMDA2RTMsIDEyIH0sCisgICAgeyAweDAwMDAwQywgIDUgfSwgeyAweDAwMDBCOSwgIDggfSwgeyAweDAwMDAwNCwgIDggfSwgeyAweDAwMDBEQiwgIDkgfSwKKyAgICB7IDB4MDAwMDBFLCAgNCB9LCB7IDB4MDAwMDBCLCAxMCB9LCB7IDB4MDAwMDIzLCAgOSB9LCB7IDB4MDAwNkNCLCAxMiB9LAorICAgIHsgMHgwMDAwMDUsICA2IH0sIHsgMHgwMDAxQjEsIDEwIH0sIHsgMHgwMDAwMDEsIDEwIH0sIHsgMHgwMDA2RTAsIDEyIH0sCisgICAgeyAweDAwMDAxMSwgIDUgfSwgeyAweDAwMDBERiwgIDkgfSwgeyAweDAwMDAwRSwgIDkgfSwgeyAweDAwMDM3MywgMTEgfSwKKyAgICB7IDB4MDAwMDAzLCAgNSB9LCB7IDB4MDAwMEI4LCAgOCB9LCB7IDB4MDAwMDA2LCAgOCB9LCB7IDB4MDAwMTc1LCAgOSB9LAorICAgIHsgMHgwMDAwMTUsICA1IH0sIHsgMHgwMDAxNzQsICA5IH0sIHsgMHgwMDAwMjcsICA5IH0sIHsgMHgwMDAzNzIsIDExIH0sCisgICAgeyAweDAwMDAxMCwgIDUgfSwgeyAweDAwMDBCQiwgIDggfSwgeyAweDAwMDAwNSwgIDggfSwgeyAweDAwMDBERSwgIDkgfSwKKyAgICB7IDB4MDAwMDBGLCAgNSB9LCB7IDB4MDAwMDAxLCAgOSB9LCB7IDB4MDAwMDEyLCAgOCB9LCB7IDB4MDAwMDA0LCAxMCB9LAorICAgIHsgMHgwMDAwMDIsICAzIH0sIHsgMHgwMDAwMTYsICA1IH0sIHsgMHgwMDAwMDksICA0IH0sIHsgMHgwMDAwMDEsICA1IH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdWludDMyX3QgdGFibGVfbWJfbm9uX2ludHJhM1sxMjhdWzJdID0gewotezB4MDAwMkExLCAxMH0sIHsweDAwNTc0MCwgMTV9LCB7MHgwMUEwQkYsIDE4fSwgezB4MDE1RDE5LCAxN30sCi17MHgwMDE1MTQsIDEzfSwgezB4MDA0NjFFLCAxNX0sIHsweDAxNTE3NiwgMTd9LCB7MHgwMTUxNzcsIDE3fSwKLXsweDAwMTFBRCwgMTN9LCB7MHgwMDY4MkUsIDE2fSwgezB4MDY4MkY5LCAyMH0sIHsweDAzNDE3RCwgMTl9LAotezB4MDAxQTM2LCAxNH0sIHsweDAwMkEyRCwgMTR9LCB7MHgwMEQwNUUsIDE3fSwgezB4MDA2ODI0LCAxNn0sCi17MHgwMDE1MTUsIDEzfSwgezB4MDA1NDVDLCAxNX0sIHsweDAyMzBFOSwgMTh9LCB7MHgwMTFBRkEsIDE3fSwKLXsweDAwMTVENywgMTN9LCB7MHgwMDU3NDcsIDE1fSwgezB4MDA4RDc5LCAxNn0sIHsweDAwNjgyNSwgMTZ9LAotezB4MDAyQkEyLCAxNH0sIHsweDAwQThCQSwgMTZ9LCB7MHgwMjM1RjYsIDE4fSwgezB4MDE1RDE4LCAxN30sCi17MHgwMDExQUUsIDEzfSwgezB4MDAzNDZGLCAxNX0sIHsweDAwOEMzQiwgMTZ9LCB7MHgwMDM0NkUsIDE1fSwKLXsweDAwMEQxQSwgMTN9LCB7MHgwMDQ2MUYsIDE1fSwgezB4MDY4MkY4LCAyMH0sIHsweDAxMTg3NSwgMTd9LAotezB4MDAyQkExLCAxNH0sIHsweDAwOEQ2MSwgMTZ9LCB7MHgwMjM1RjcsIDE4fSwgezB4MDIzMEU4LCAxOH0sCi17MHgwMDE1MTMsIDEzfSwgezB4MDA4RDdCLCAxNn0sIHsweDAxMUFGNCwgMTd9LCB7MHgwMTFBRjUsIDE3fSwKLXsweDAwMTE4NSwgMTN9LCB7MHgwMDQ2QkYsIDE1fSwgezB4MDA4RDYwLCAxNn0sIHsweDAwOEQ3QywgMTZ9LAotezB4MDAxNTEyLCAxM30sIHsweDAwNDYxQywgMTV9LCB7MHgwMEFFOEQsIDE2fSwgezB4MDA4RDc4LCAxNn0sCi17MHgwMDBEMEUsIDEzfSwgezB4MDAzNDEzLCAxNX0sIHsweDAwNDZCMSwgMTV9LCB7MHgwMDM0MTYsIDE1fSwKLXsweDAwMEFFQSwgMTJ9LCB7MHgwMDJBMkMsIDE0fSwgezB4MDA1NzQxLCAxNX0sIHsweDAwMkEyRiwgMTR9LAotezB4MDAwMTU4LCAgOX0sIHsweDAwMDhEMiwgMTJ9LCB7MHgwMDA1NEMsIDExfSwgezB4MDAwNjg2LCAxMn0sCi17MHgwMDAwMDAsICAyfSwgezB4MDAwMDY5LCAgOH0sIHsweDAwMDA2QiwgIDh9LCB7MHgwMDA2OEMsIDEyfSwKLXsweDAwMDAwNywgIDN9LCB7MHgwMDAxNUUsICA5fSwgezB4MDAwMkEzLCAxMH0sIHsweDAwMEFFOSwgMTJ9LAotezB4MDAwMDA2LCAgM30sIHsweDAwMDIzMSwgMTB9LCB7MHgwMDAyQjgsIDEwfSwgezB4MDAxQTA4LCAxNH0sCi17MHgwMDAwMTAsICA1fSwgezB4MDAwMUE5LCAxMH0sIHsweDAwMDM0MiwgMTF9LCB7MHgwMDBBODgsIDEyfSwKLXsweDAwMDAwNCwgIDR9LCB7MHgwMDAxQTIsIDEwfSwgezB4MDAwMkE0LCAxMH0sIHsweDAwMTE4NCwgMTN9LAotezB4MDAwMDEyLCAgNX0sIHsweDAwMDIzMiwgMTB9LCB7MHgwMDAyQjIsIDEwfSwgezB4MDAwNjgwLCAxMn0sCi17MHgwMDAwMUIsICA2fSwgezB4MDAwNDZBLCAxMX0sIHsweDAwMDY4RSwgMTJ9LCB7MHgwMDIzNTksIDE0fSwKLXsweDAwMDAxNiwgIDV9LCB7MHgwMDAxNUYsICA5fSwgezB4MDAwMkEwLCAxMH0sIHsweDAwMDU0RCwgMTF9LAotezB4MDAwMDA1LCAgNH0sIHsweDAwMDIzMywgMTB9LCB7MHgwMDAyQjksIDEwfSwgezB4MDAxNUQ2LCAxM30sCi17MHgwMDAwMjIsICA2fSwgezB4MDAwNDY4LCAxMX0sIHsweDAwMDY4MywgMTJ9LCB7MHgwMDFBMEEsIDE0fSwKLXsweDAwMDAxMywgIDV9LCB7MHgwMDAyMzYsIDEwfSwgezB4MDAwMkJCLCAxMH0sIHsweDAwMTE4NiwgMTN9LAotezB4MDAwMDE3LCAgNX0sIHsweDAwMDFBQiwgMTB9LCB7MHgwMDAyQTcsIDEwfSwgezB4MDAwOEQzLCAxMn0sCi17MHgwMDAwMTQsICA1fSwgezB4MDAwMjM3LCAxMH0sIHsweDAwMDQ2MCwgMTF9LCB7MHgwMDBEMEYsIDEzfSwKLXsweDAwMDAxOSwgIDZ9LCB7MHgwMDAxQUEsIDEwfSwgezB4MDAwMkIzLCAxMH0sIHsweDAwMDY4MSwgMTJ9LAotezB4MDAwMDE4LCAgNn0sIHsweDAwMDFBOCwgMTB9LCB7MHgwMDAyQTUsIDEwfSwgezB4MDAwNjhGLCAxMn0sCi17MHgwMDAwMDcsICA0fSwgezB4MDAwMDU1LCAgN30sIHsweDAwMDA0NywgIDd9LCB7MHgwMDAwQUQsICA4fSwKKyAgICB7IDB4MDAwMkExLCAxMCB9LCB7IDB4MDA1NzQwLCAxNSB9LCB7IDB4MDFBMEJGLCAxOCB9LCB7IDB4MDE1RDE5LCAxNyB9LAorICAgIHsgMHgwMDE1MTQsIDEzIH0sIHsgMHgwMDQ2MUUsIDE1IH0sIHsgMHgwMTUxNzYsIDE3IH0sIHsgMHgwMTUxNzcsIDE3IH0sCisgICAgeyAweDAwMTFBRCwgMTMgfSwgeyAweDAwNjgyRSwgMTYgfSwgeyAweDA2ODJGOSwgMjAgfSwgeyAweDAzNDE3RCwgMTkgfSwKKyAgICB7IDB4MDAxQTM2LCAxNCB9LCB7IDB4MDAyQTJELCAxNCB9LCB7IDB4MDBEMDVFLCAxNyB9LCB7IDB4MDA2ODI0LCAxNiB9LAorICAgIHsgMHgwMDE1MTUsIDEzIH0sIHsgMHgwMDU0NUMsIDE1IH0sIHsgMHgwMjMwRTksIDE4IH0sIHsgMHgwMTFBRkEsIDE3IH0sCisgICAgeyAweDAwMTVENywgMTMgfSwgeyAweDAwNTc0NywgMTUgfSwgeyAweDAwOEQ3OSwgMTYgfSwgeyAweDAwNjgyNSwgMTYgfSwKKyAgICB7IDB4MDAyQkEyLCAxNCB9LCB7IDB4MDBBOEJBLCAxNiB9LCB7IDB4MDIzNUY2LCAxOCB9LCB7IDB4MDE1RDE4LCAxNyB9LAorICAgIHsgMHgwMDExQUUsIDEzIH0sIHsgMHgwMDM0NkYsIDE1IH0sIHsgMHgwMDhDM0IsIDE2IH0sIHsgMHgwMDM0NkUsIDE1IH0sCisgICAgeyAweDAwMEQxQSwgMTMgfSwgeyAweDAwNDYxRiwgMTUgfSwgeyAweDA2ODJGOCwgMjAgfSwgeyAweDAxMTg3NSwgMTcgfSwKKyAgICB7IDB4MDAyQkExLCAxNCB9LCB7IDB4MDA4RDYxLCAxNiB9LCB7IDB4MDIzNUY3LCAxOCB9LCB7IDB4MDIzMEU4LCAxOCB9LAorICAgIHsgMHgwMDE1MTMsIDEzIH0sIHsgMHgwMDhEN0IsIDE2IH0sIHsgMHgwMTFBRjQsIDE3IH0sIHsgMHgwMTFBRjUsIDE3IH0sCisgICAgeyAweDAwMTE4NSwgMTMgfSwgeyAweDAwNDZCRiwgMTUgfSwgeyAweDAwOEQ2MCwgMTYgfSwgeyAweDAwOEQ3QywgMTYgfSwKKyAgICB7IDB4MDAxNTEyLCAxMyB9LCB7IDB4MDA0NjFDLCAxNSB9LCB7IDB4MDBBRThELCAxNiB9LCB7IDB4MDA4RDc4LCAxNiB9LAorICAgIHsgMHgwMDBEMEUsIDEzIH0sIHsgMHgwMDM0MTMsIDE1IH0sIHsgMHgwMDQ2QjEsIDE1IH0sIHsgMHgwMDM0MTYsIDE1IH0sCisgICAgeyAweDAwMEFFQSwgMTIgfSwgeyAweDAwMkEyQywgMTQgfSwgeyAweDAwNTc0MSwgMTUgfSwgeyAweDAwMkEyRiwgMTQgfSwKKyAgICB7IDB4MDAwMTU4LCAgOSB9LCB7IDB4MDAwOEQyLCAxMiB9LCB7IDB4MDAwNTRDLCAxMSB9LCB7IDB4MDAwNjg2LCAxMiB9LAorICAgIHsgMHgwMDAwMDAsICAyIH0sIHsgMHgwMDAwNjksICA4IH0sIHsgMHgwMDAwNkIsICA4IH0sIHsgMHgwMDA2OEMsIDEyIH0sCisgICAgeyAweDAwMDAwNywgIDMgfSwgeyAweDAwMDE1RSwgIDkgfSwgeyAweDAwMDJBMywgMTAgfSwgeyAweDAwMEFFOSwgMTIgfSwKKyAgICB7IDB4MDAwMDA2LCAgMyB9LCB7IDB4MDAwMjMxLCAxMCB9LCB7IDB4MDAwMkI4LCAxMCB9LCB7IDB4MDAxQTA4LCAxNCB9LAorICAgIHsgMHgwMDAwMTAsICA1IH0sIHsgMHgwMDAxQTksIDEwIH0sIHsgMHgwMDAzNDIsIDExIH0sIHsgMHgwMDBBODgsIDEyIH0sCisgICAgeyAweDAwMDAwNCwgIDQgfSwgeyAweDAwMDFBMiwgMTAgfSwgeyAweDAwMDJBNCwgMTAgfSwgeyAweDAwMTE4NCwgMTMgfSwKKyAgICB7IDB4MDAwMDEyLCAgNSB9LCB7IDB4MDAwMjMyLCAxMCB9LCB7IDB4MDAwMkIyLCAxMCB9LCB7IDB4MDAwNjgwLCAxMiB9LAorICAgIHsgMHgwMDAwMUIsICA2IH0sIHsgMHgwMDA0NkEsIDExIH0sIHsgMHgwMDA2OEUsIDEyIH0sIHsgMHgwMDIzNTksIDE0IH0sCisgICAgeyAweDAwMDAxNiwgIDUgfSwgeyAweDAwMDE1RiwgIDkgfSwgeyAweDAwMDJBMCwgMTAgfSwgeyAweDAwMDU0RCwgMTEgfSwKKyAgICB7IDB4MDAwMDA1LCAgNCB9LCB7IDB4MDAwMjMzLCAxMCB9LCB7IDB4MDAwMkI5LCAxMCB9LCB7IDB4MDAxNUQ2LCAxMyB9LAorICAgIHsgMHgwMDAwMjIsICA2IH0sIHsgMHgwMDA0NjgsIDExIH0sIHsgMHgwMDA2ODMsIDEyIH0sIHsgMHgwMDFBMEEsIDE0IH0sCisgICAgeyAweDAwMDAxMywgIDUgfSwgeyAweDAwMDIzNiwgMTAgfSwgeyAweDAwMDJCQiwgMTAgfSwgeyAweDAwMTE4NiwgMTMgfSwKKyAgICB7IDB4MDAwMDE3LCAgNSB9LCB7IDB4MDAwMUFCLCAxMCB9LCB7IDB4MDAwMkE3LCAxMCB9LCB7IDB4MDAwOEQzLCAxMiB9LAorICAgIHsgMHgwMDAwMTQsICA1IH0sIHsgMHgwMDAyMzcsIDEwIH0sIHsgMHgwMDA0NjAsIDExIH0sIHsgMHgwMDBEMEYsIDEzIH0sCisgICAgeyAweDAwMDAxOSwgIDYgfSwgeyAweDAwMDFBQSwgMTAgfSwgeyAweDAwMDJCMywgMTAgfSwgeyAweDAwMDY4MSwgMTIgfSwKKyAgICB7IDB4MDAwMDE4LCAgNiB9LCB7IDB4MDAwMUE4LCAxMCB9LCB7IDB4MDAwMkE1LCAxMCB9LCB7IDB4MDAwNjhGLCAxMiB9LAorICAgIHsgMHgwMDAwMDcsICA0IH0sIHsgMHgwMDAwNTUsICA3IH0sIHsgMHgwMDAwNDcsICA3IH0sIHsgMHgwMDAwQUQsICA4IH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdWludDMyX3QgdGFibGVfbWJfbm9uX2ludHJhNFsxMjhdWzJdID0gewotezB4MDAwMEQ0LCAgOH0sIHsweDAwMjFDNSwgMTR9LCB7MHgwMEYxOEEsIDE2fSwgezB4MDBENUJDLCAxNn0sCi17MHgwMDA4NzksIDEyfSwgezB4MDAzNTRELCAxNH0sIHsweDAxMEUzRiwgMTd9LCB7MHgwMTBGNTQsIDE3fSwKLXsweDAwMDg2NiwgMTJ9LCB7MHgwMDM1NkUsIDE0fSwgezB4MDEwRjU1LCAxN30sIHsweDAxMEUzRSwgMTd9LAotezB4MDAxMENFLCAxM30sIHsweDAwM0M4NCwgMTR9LCB7MHgwMEQ1QkQsIDE2fSwgezB4MDBGMThCLCAxNn0sCi17MHgwMDA4NjgsIDEyfSwgezB4MDA0MzhDLCAxNX0sIHsweDAwODdBQiwgMTZ9LCB7MHgwMDc5MEIsIDE1fSwKLXsweDAwMEYxMCwgMTJ9LCB7MHgwMDQzM0QsIDE1fSwgezB4MDA2QUQzLCAxNX0sIHsweDAwNzkwQSwgMTV9LAotezB4MDAxQUE3LCAxM30sIHsweDAwNDNENCwgMTV9LCB7MHgwMDg3MUUsIDE2fSwgezB4MDA2QURGLCAxNX0sCi17MHgwMDBEN0MsIDEyfSwgezB4MDAzQzk0LCAxNH0sIHsweDAwNDM4RCwgMTV9LCB7MHgwMDZBRDIsIDE1fSwKLXsweDAwMDZCQywgMTF9LCB7MHgwMDIxRTksIDE0fSwgezB4MDA2QURBLCAxNX0sIHsweDAwNkE5OSwgMTV9LAotezB4MDAxMEY3LCAxM30sIHsweDAwNDM4OSwgMTV9LCB7MHgwMDZBREIsIDE1fSwgezB4MDA3OEM0LCAxNX0sCi17MHgwMDBENTYsIDEyfSwgezB4MDAzNUY3LCAxNH0sIHsweDAwNDM4RSwgMTV9LCB7MHgwMDZBOTgsIDE1fSwKLXsweDAwMEQ1MiwgMTJ9LCB7MHgwMDNDOTUsIDE0fSwgezB4MDA0Mzg4LCAxNX0sIHsweDAwNDMzQywgMTV9LAotezB4MDAwRDU0LCAxMn0sIHsweDAwMUU0QiwgMTN9LCB7MHgwMDNDNjMsIDE0fSwgezB4MDAzQzgzLCAxNH0sCi17MHgwMDA4NjEsIDEyfSwgezB4MDAyMUVCLCAxNH0sIHsweDAwMzU2QywgMTR9LCB7MHgwMDM1RjYsIDE0fSwKLXsweDAwMDg2MywgMTJ9LCB7MHgwMDIxOUYsIDE0fSwgezB4MDAzNTY4LCAxNH0sIHsweDAwM0M4MiwgMTR9LAotezB4MDAwMUFFLCAgOX0sIHsweDAwMTBDMCwgMTN9LCB7MHgwMDBGMTEsIDEyfSwgezB4MDAxQUZBLCAxM30sCi17MHgwMDAwMDAsICAxfSwgezB4MDAwMEYwLCAgOH0sIHsweDAwMDFBRCwgIDl9LCB7MHgwMDEwQzEsIDEzfSwKLXsweDAwMDAwQSwgIDR9LCB7MHgwMDAzQzUsIDEwfSwgezB4MDAwNzg5LCAxMX0sIHsweDAwMUFCNSwgMTN9LAotezB4MDAwMDA5LCAgNH0sIHsweDAwMDQzNSwgMTF9LCB7MHgwMDA3OTMsIDExfSwgezB4MDAxRTQwLCAxM30sCi17MHgwMDAwMUQsICA1fSwgezB4MDAwM0NCLCAxMH0sIHsweDAwMDg3OCwgMTJ9LCB7MHgwMDFBQUYsIDEzfSwKLXsweDAwMDAwQiwgIDR9LCB7MHgwMDAzQzcsIDEwfSwgezB4MDAwNzkxLCAxMX0sIHsweDAwMUFBQiwgMTN9LAotezB4MDAwMDFGLCAgNX0sIHsweDAwMDQzNiwgMTF9LCB7MHgwMDA2QkYsIDExfSwgezB4MDAwRjE5LCAxMn0sCi17MHgwMDAwM0QsICA2fSwgezB4MDAwRDUxLCAxMn0sIHsweDAwMTBDNCwgMTN9LCB7MHgwMDIxRTgsIDE0fSwKLXsweDAwMDAzNiwgIDZ9LCB7MHgwMDA0MzcsIDExfSwgezB4MDAwNkFGLCAxMX0sIHsweDAwMTBDNSwgMTN9LAotezB4MDAwMDBDLCAgNH0sIHsweDAwMDQzMiwgMTF9LCB7MHgwMDA3OTQsIDExfSwgezB4MDAxRTMwLCAxM30sCi17MHgwMDAwNDIsICA3fSwgezB4MDAwODcwLCAxMn0sIHsweDAwMEYyNCwgMTJ9LCB7MHgwMDFFNDMsIDEzfSwKLXsweDAwMDAyMCwgIDZ9LCB7MHgwMDA0M0UsIDExfSwgezB4MDAwNzk1LCAxMX0sIHsweDAwMUFBQSwgMTN9LAotezB4MDAwMDM3LCAgNn0sIHsweDAwMDZBQywgMTF9LCB7MHgwMDA2QUUsIDExfSwgezB4MDAxMEY2LCAxM30sCi17MHgwMDAwMzQsICA2fSwgezB4MDAwNDNBLCAxMX0sIHsweDAwMEQ1MCwgMTJ9LCB7MHgwMDFBQUUsIDEzfSwKLXsweDAwMDAzOSwgIDZ9LCB7MHgwMDA0M0YsIDExfSwgezB4MDAwNzhELCAxMX0sIHsweDAwMTBEMiwgMTN9LAotezB4MDAwMDM4LCAgNn0sIHsweDAwMDQzQiwgMTF9LCB7MHgwMDA2QkQsIDExfSwgezB4MDAxMEQzLCAxM30sCi17MHgwMDAwMTEsICA1fSwgezB4MDAwMUFDLCAgOX0sIHsweDAwMDBGMywgIDh9LCB7MHgwMDA0MzksIDExfSwKKyAgICB7IDB4MDAwMEQ0LCAgOCB9LCB7IDB4MDAyMUM1LCAxNCB9LCB7IDB4MDBGMThBLCAxNiB9LCB7IDB4MDBENUJDLCAxNiB9LAorICAgIHsgMHgwMDA4NzksIDEyIH0sIHsgMHgwMDM1NEQsIDE0IH0sIHsgMHgwMTBFM0YsIDE3IH0sIHsgMHgwMTBGNTQsIDE3IH0sCisgICAgeyAweDAwMDg2NiwgMTIgfSwgeyAweDAwMzU2RSwgMTQgfSwgeyAweDAxMEY1NSwgMTcgfSwgeyAweDAxMEUzRSwgMTcgfSwKKyAgICB7IDB4MDAxMENFLCAxMyB9LCB7IDB4MDAzQzg0LCAxNCB9LCB7IDB4MDBENUJELCAxNiB9LCB7IDB4MDBGMThCLCAxNiB9LAorICAgIHsgMHgwMDA4NjgsIDEyIH0sIHsgMHgwMDQzOEMsIDE1IH0sIHsgMHgwMDg3QUIsIDE2IH0sIHsgMHgwMDc5MEIsIDE1IH0sCisgICAgeyAweDAwMEYxMCwgMTIgfSwgeyAweDAwNDMzRCwgMTUgfSwgeyAweDAwNkFEMywgMTUgfSwgeyAweDAwNzkwQSwgMTUgfSwKKyAgICB7IDB4MDAxQUE3LCAxMyB9LCB7IDB4MDA0M0Q0LCAxNSB9LCB7IDB4MDA4NzFFLCAxNiB9LCB7IDB4MDA2QURGLCAxNSB9LAorICAgIHsgMHgwMDBEN0MsIDEyIH0sIHsgMHgwMDNDOTQsIDE0IH0sIHsgMHgwMDQzOEQsIDE1IH0sIHsgMHgwMDZBRDIsIDE1IH0sCisgICAgeyAweDAwMDZCQywgMTEgfSwgeyAweDAwMjFFOSwgMTQgfSwgeyAweDAwNkFEQSwgMTUgfSwgeyAweDAwNkE5OSwgMTUgfSwKKyAgICB7IDB4MDAxMEY3LCAxMyB9LCB7IDB4MDA0Mzg5LCAxNSB9LCB7IDB4MDA2QURCLCAxNSB9LCB7IDB4MDA3OEM0LCAxNSB9LAorICAgIHsgMHgwMDBENTYsIDEyIH0sIHsgMHgwMDM1RjcsIDE0IH0sIHsgMHgwMDQzOEUsIDE1IH0sIHsgMHgwMDZBOTgsIDE1IH0sCisgICAgeyAweDAwMEQ1MiwgMTIgfSwgeyAweDAwM0M5NSwgMTQgfSwgeyAweDAwNDM4OCwgMTUgfSwgeyAweDAwNDMzQywgMTUgfSwKKyAgICB7IDB4MDAwRDU0LCAxMiB9LCB7IDB4MDAxRTRCLCAxMyB9LCB7IDB4MDAzQzYzLCAxNCB9LCB7IDB4MDAzQzgzLCAxNCB9LAorICAgIHsgMHgwMDA4NjEsIDEyIH0sIHsgMHgwMDIxRUIsIDE0IH0sIHsgMHgwMDM1NkMsIDE0IH0sIHsgMHgwMDM1RjYsIDE0IH0sCisgICAgeyAweDAwMDg2MywgMTIgfSwgeyAweDAwMjE5RiwgMTQgfSwgeyAweDAwMzU2OCwgMTQgfSwgeyAweDAwM0M4MiwgMTQgfSwKKyAgICB7IDB4MDAwMUFFLCAgOSB9LCB7IDB4MDAxMEMwLCAxMyB9LCB7IDB4MDAwRjExLCAxMiB9LCB7IDB4MDAxQUZBLCAxMyB9LAorICAgIHsgMHgwMDAwMDAsICAxIH0sIHsgMHgwMDAwRjAsICA4IH0sIHsgMHgwMDAxQUQsICA5IH0sIHsgMHgwMDEwQzEsIDEzIH0sCisgICAgeyAweDAwMDAwQSwgIDQgfSwgeyAweDAwMDNDNSwgMTAgfSwgeyAweDAwMDc4OSwgMTEgfSwgeyAweDAwMUFCNSwgMTMgfSwKKyAgICB7IDB4MDAwMDA5LCAgNCB9LCB7IDB4MDAwNDM1LCAxMSB9LCB7IDB4MDAwNzkzLCAxMSB9LCB7IDB4MDAxRTQwLCAxMyB9LAorICAgIHsgMHgwMDAwMUQsICA1IH0sIHsgMHgwMDAzQ0IsIDEwIH0sIHsgMHgwMDA4NzgsIDEyIH0sIHsgMHgwMDFBQUYsIDEzIH0sCisgICAgeyAweDAwMDAwQiwgIDQgfSwgeyAweDAwMDNDNywgMTAgfSwgeyAweDAwMDc5MSwgMTEgfSwgeyAweDAwMUFBQiwgMTMgfSwKKyAgICB7IDB4MDAwMDFGLCAgNSB9LCB7IDB4MDAwNDM2LCAxMSB9LCB7IDB4MDAwNkJGLCAxMSB9LCB7IDB4MDAwRjE5LCAxMiB9LAorICAgIHsgMHgwMDAwM0QsICA2IH0sIHsgMHgwMDBENTEsIDEyIH0sIHsgMHgwMDEwQzQsIDEzIH0sIHsgMHgwMDIxRTgsIDE0IH0sCisgICAgeyAweDAwMDAzNiwgIDYgfSwgeyAweDAwMDQzNywgMTEgfSwgeyAweDAwMDZBRiwgMTEgfSwgeyAweDAwMTBDNSwgMTMgfSwKKyAgICB7IDB4MDAwMDBDLCAgNCB9LCB7IDB4MDAwNDMyLCAxMSB9LCB7IDB4MDAwNzk0LCAxMSB9LCB7IDB4MDAxRTMwLCAxMyB9LAorICAgIHsgMHgwMDAwNDIsICA3IH0sIHsgMHgwMDA4NzAsIDEyIH0sIHsgMHgwMDBGMjQsIDEyIH0sIHsgMHgwMDFFNDMsIDEzIH0sCisgICAgeyAweDAwMDAyMCwgIDYgfSwgeyAweDAwMDQzRSwgMTEgfSwgeyAweDAwMDc5NSwgMTEgfSwgeyAweDAwMUFBQSwgMTMgfSwKKyAgICB7IDB4MDAwMDM3LCAgNiB9LCB7IDB4MDAwNkFDLCAxMSB9LCB7IDB4MDAwNkFFLCAxMSB9LCB7IDB4MDAxMEY2LCAxMyB9LAorICAgIHsgMHgwMDAwMzQsICA2IH0sIHsgMHgwMDA0M0EsIDExIH0sIHsgMHgwMDBENTAsIDEyIH0sIHsgMHgwMDFBQUUsIDEzIH0sCisgICAgeyAweDAwMDAzOSwgIDYgfSwgeyAweDAwMDQzRiwgMTEgfSwgeyAweDAwMDc4RCwgMTEgfSwgeyAweDAwMTBEMiwgMTMgfSwKKyAgICB7IDB4MDAwMDM4LCAgNiB9LCB7IDB4MDAwNDNCLCAxMSB9LCB7IDB4MDAwNkJELCAxMSB9LCB7IDB4MDAxMEQzLCAxMyB9LAorICAgIHsgMHgwMDAwMTEsICA1IH0sIHsgMHgwMDAxQUMsICA5IH0sIHsgMHgwMDAwRjMsICA4IH0sIHsgMHgwMDA0MzksIDExIH0sCiB9OwogCi1jb25zdCB1aW50MzJfdCAoKiBjb25zdCBmZl93bXYyX2ludGVyX3RhYmxlW1dNVjJfSU5URVJfQ0JQX1RBQkxFX0NPVU5UXSlbMl09eworY29uc3QgdWludDMyX3QgKCpjb25zdCBmZl93bXYyX2ludGVyX3RhYmxlW1dNVjJfSU5URVJfQ0JQX1RBQkxFX0NPVU5UXSlbMl0gPSB7CiAgICAgdGFibGVfbWJfbm9uX2ludHJhMiwKICAgICB0YWJsZV9tYl9ub25faW50cmEzLAogICAgIHRhYmxlX21iX25vbl9pbnRyYTQsCiAgICAgZmZfdGFibGVfbWJfbm9uX2ludHJhLAogfTsKLQotY29uc3QgdWludDhfdCBmZl93bXYyX3NjYW50YWJsZUFbNjRdPXsKLTB4MDAsIDB4MDEsIDB4MDIsIDB4MDgsIDB4MDMsIDB4MDksIDB4MEEsIDB4MTAsCi0weDA0LCAweDBCLCAweDExLCAweDE4LCAweDEyLCAweDBDLCAweDA1LCAweDEzLAotMHgxOSwgMHgwRCwgMHgxNCwgMHgxQSwgMHgxQiwgMHgwNiwgMHgxNSwgMHgxQywKLTB4MEUsIDB4MTYsIDB4MUQsIDB4MDcsIDB4MUUsIDB4MEYsIDB4MTcsIDB4MUYsCi19OwotCi1jb25zdCB1aW50OF90IGZmX3dtdjJfc2NhbnRhYmxlQls2NF09ewotMHgwMCwgMHgwOCwgMHgwMSwgMHgxMCwgMHgwOSwgMHgxOCwgMHgxMSwgMHgwMiwKLTB4MjAsIDB4MEEsIDB4MTksIDB4MjgsIDB4MTIsIDB4MzAsIDB4MjEsIDB4MUEsCi0weDM4LCAweDI5LCAweDIyLCAweDAzLCAweDMxLCAweDM5LCAweDBCLCAweDJBLAotMHgxMywgMHgzMiwgMHgxQiwgMHgzQSwgMHgyMywgMHgyQiwgMHgzMywgMHgzQiwKLX07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21zbXBlZzRkYXRhLmggYi9saWJhdmNvZGVjL21zbXBlZzRkYXRhLmgKaW5kZXggMjRhMTBkOS4uMDIxOTlkMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tc21wZWc0ZGF0YS5oCisrKyBiL2xpYmF2Y29kZWMvbXNtcGVnNGRhdGEuaApAQCAtMzEsOCArMzEsOSBAQAogI2RlZmluZSBBVkNPREVDX01TTVBFRzREQVRBX0gKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgorCiAjaW5jbHVkZSAicmwuaCIKKyNpbmNsdWRlICJ2bGMuaCIKIAogLyogbW90aW9uIHZlY3RvciB0YWJsZSAqLwogdHlwZWRlZiBzdHJ1Y3QgTVZUYWJsZSB7CkBAIC04NCw3ICs4NSw0IEBACiAjZGVmaW5lIFdNVjJfSU5URVJfQ0JQX1RBQkxFX0NPVU5UIDQKIGV4dGVybiBjb25zdCB1aW50MzJfdCAoKiBjb25zdCBmZl93bXYyX2ludGVyX3RhYmxlW1dNVjJfSU5URVJfQ0JQX1RBQkxFX0NPVU5UXSlbMl07CiAKLWV4dGVybiBjb25zdCB1aW50OF90IGZmX3dtdjJfc2NhbnRhYmxlQVs2NF07Ci1leHRlcm4gY29uc3QgdWludDhfdCBmZl93bXYyX3NjYW50YWJsZUJbNjRdOwotCiAjZW5kaWYgLyogQVZDT0RFQ19NU01QRUc0REFUQV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21zbXBlZzRkZWMuYyBiL2xpYmF2Y29kZWMvbXNtcGVnNGRlYy5jCmluZGV4IGFhYWRkOWMuLjE2YjY3MTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXNtcGVnNGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvbXNtcGVnNGRlYy5jCkBAIC0yOCw3ICsyOCw2IEBACiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAibXNtcGVnNC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCiAjaW5jbHVkZSAiaDI2My5oIgogI2luY2x1ZGUgIm1wZWc0dmlkZW8uaCIKICNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgpAQCAtNzAsNyArNjksNyBAQAogc3RhdGljIFZMQyB2Ml9tdl92bGM7CiBWTEMgZmZfaW50ZXJfaW50cmFfdmxjOwogCi0vKiBUaGlzIGlzIGlkZW50aWNhbCB0byBoMjYzIGV4Y2VwdCB0aGF0IGl0cyByYW5nZSBpcyBtdWx0aXBsaWVkIGJ5IDIuICovCisvKiBUaGlzIGlzIGlkZW50aWNhbCB0byBILjI2MyBleGNlcHQgdGhhdCBpdHMgcmFuZ2UgaXMgbXVsdGlwbGllZCBieSAyLiAqLwogc3RhdGljIGludCBtc21wZWc0djJfZGVjb2RlX21vdGlvbihNcGVnRW5jQ29udGV4dCAqIHMsIGludCBwcmVkLCBpbnQgZl9jb2RlKQogewogICAgIGludCBjb2RlLCB2YWwsIHNpZ24sIHNoaWZ0OwpAQCAtMTQxLDcgKzE0MCw3IEBACiAgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09MikKICAgICAgICAgICAgIGNicD0gZ2V0X3ZsYzIoJnMtPmdiLCB2Ml9pbnRyYV9jYnBjX3ZsYy50YWJsZSwgVjJfSU5UUkFfQ0JQQ19WTENfQklUUywgMSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNicD0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9oMjYzX2ludHJhX01DQlBDX3ZsYy50YWJsZSwgSU5UUkFfTUNCUENfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgY2JwPSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfaW50cmFfTUNCUENfdmxjLnRhYmxlLCBJTlRSQV9NQ0JQQ19WTENfQklUUywgMik7CiAgICAgICAgIGlmKGNicDwwIHx8IGNicD4zKXsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2JwYyAlZCBpbnZhbGlkIGF0ICVkICVkXG4iLCBjYnAsIHMtPm1iX3gsIHMtPm1iX3kpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTcwLDEyICsxNjksMjMgQEAKICAgICAgICAgcy0+bXZbMF1bMF1bMV0gPSBteTsKICAgICAgICAgKm1iX3R5cGVfcHRyID0gTUJfVFlQRV9MMCB8IE1CX1RZUEVfMTZ4MTY7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHY7CiAgICAgICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09Mil7CiAgICAgICAgICAgICBzLT5hY19wcmVkID0gZ2V0X2JpdHMxKCZzLT5nYik7Ci0gICAgICAgICAgICBjYnB8PSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfY2JweV92bGMudGFibGUsIENCUFlfVkxDX0JJVFMsIDEpPDwyOyAvL0ZJWE1FIGNoZWNrIGVycm9ycworICAgICAgICAgICAgdiA9IGdldF92bGMyKCZzLT5nYiwgZmZfaDI2M19jYnB5X3ZsYy50YWJsZSwgQ0JQWV9WTENfQklUUywgMSk7CisgICAgICAgICAgICBpZiAodiA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImNicHkgdmxjIGludmFsaWRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNicHw9IHY8PDI7CiAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgIHMtPmFjX3ByZWQgPSAwOwotICAgICAgICAgICAgY2JwfD0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9oMjYzX2NicHlfdmxjLnRhYmxlLCBDQlBZX1ZMQ19CSVRTLCAxKTw8MjsgLy9GSVhNRSBjaGVjayBlcnJvcnMKKyAgICAgICAgICAgIHYgPSBnZXRfdmxjMigmcy0+Z2IsIGZmX2gyNjNfY2JweV92bGMudGFibGUsIENCUFlfVkxDX0JJVFMsIDEpOworICAgICAgICAgICAgaWYgKHYgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYnB5IHZsYyBpbnZhbGlkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYnB8PSB2PDwyOwogICAgICAgICAgICAgaWYocy0+cGljdF90eXBlPT1BVl9QSUNUVVJFX1RZUEVfUCkgY2JwXj0weDNDOwogICAgICAgICB9CiAgICAgICAgICptYl90eXBlX3B0ciA9IE1CX1RZUEVfSU5UUkE7CkBAIC0xOTgsNiArMjA4LDkgQEAKICAgICB1aW50OF90ICpjb2RlZF92YWw7CiAgICAgdWludDMyX3QgKiBjb25zdCBtYl90eXBlX3B0ciA9ICZzLT5jdXJyZW50X3BpY3R1cmUubWJfdHlwZVtzLT5tYl94ICsgcy0+bWJfeSpzLT5tYl9zdHJpZGVdOwogCisgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHsKICAgICAgICAgaWYgKHMtPnVzZV9za2lwX21iX2NvZGUpIHsKICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgewpAQCAtMzk5LDYgKzQxMiwxNCBAQAogewogICAgIGludCBjb2RlOwogCisgICAgLy8gYXQgbWluaW11bSBvbmUgYml0IHBlciBtYWNyb2Jsb2NrIGlzIHJlcXVpcmVkIGF0IGxlYXN0IGluIGEgdmFsaWQgZnJhbWUsCisgICAgLy8gd2UgZGlzY2FyZCBmcmFtZXMgbXVjaCBzbWFsbGVyIHRoYW4gdGhpcy4gRnJhbWVzIHNtYWxsZXIgdGhhbiAxLzggb2YgdGhlCisgICAgLy8gc21hbGxlc3QgImJsYWNrL3NraXAiIGZyYW1lIGdlbmVyYWxseSBjb250YWluIG5vdCBtdWNoIHJlY292ZXJhYmxlIGNvbnRlbnQKKyAgICAvLyB3aGlsZSBhdCB0aGUgc2FtZSB0aW1lIHRoZXkgaGF2ZSB0aGUgaGlnaGVzdCBjb21wdXRhdGlvbmFsIHJlcXVpcmVtZW50cworICAgIC8vIHBlciBieXRlCisgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSAqIDhMTCA8IChzLT53aWR0aCsxNSkvMTYgKiAoKHMtPmhlaWdodCsxNSkvMTYpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIGlmKHMtPm1zbXBlZzRfdmVyc2lvbj09MSl7CiAgICAgICAgIGludCBzdGFydF9jb2RlID0gZ2V0X2JpdHNfbG9uZygmcy0+Z2IsIDMyKTsKICAgICAgICAgaWYoc3RhcnRfY29kZSE9MHgwMDAwMDEwMCl7CkBAIC00MTUsMTMgKzQzNiw2IEBACiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwaWN0dXJlIHR5cGVcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotI2lmIDAKLXsKLSAgICBzdGF0aWMgaW50IGhhZF9pPTA7Ci0gICAgaWYocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSBoYWRfaT0xOwotICAgIGlmKCFoYWRfaSkgcmV0dXJuIC0xOwotfQotI2VuZGlmCiAgICAgcy0+Y2hyb21hX3FzY2FsZT0gcy0+cXNjYWxlID0gZ2V0X2JpdHMoJnMtPmdiLCA1KTsKICAgICBpZihzLT5xc2NhbGU9PTApewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcXNjYWxlXG4iKTsKQEAgLTU3Miw3ICs1ODYsNyBAQAogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkkgZnJhbWUgdG9vIGxvbmcsIGlnbm9yaW5nIGV4dCBoZWFkZXJcbiIpOworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkktZnJhbWUgdG9vIGxvbmcsIGlnbm9yaW5nIGV4dCBoZWFkZXJcbiIpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtNjM5LDcgKzY1Myw2IEBACiAgICAgcmV0dXJuIGxldmVsOwogfQogCi0vLyNkZWZpbmUgRVJST1JfREVUQUlMUwogaW50IGZmX21zbXBlZzRfZGVjb2RlX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICogcywgaW50MTZfdCAqIGJsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBjb2RlZCwgY29uc3QgdWludDhfdCAqc2Nhbl90YWJsZSkKIHsKQEAgLTc2Myw0MyArNzc2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZihzaWduKSBsZXZlbD0gLWxldmVsOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSNpZiAwIC8vIHdhc3RlIG9mIHRpbWUgLyB0aGlzIHdpbGwgZGV0ZWN0IHZlcnkgZmV3IGVycm9ycwotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWJzX2xldmVsPSBGRkFCUyhsZXZlbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcnVuMT0gcnVuIC0gcmwtPm1heF9ydW5bbGFzdF1bYWJzX2xldmVsXSAtIHJ1bl9kaWZmOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWJzX2xldmVsPD1NQVhfTEVWRUwgJiYgcnVuPD1NQVhfUlVOKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhYnNfbGV2ZWwgPD0gcmwtPm1heF9sZXZlbFtsYXN0XVtydW5dKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIDMuIGVzYywgdmxjIGVuY29kaW5nIHBvc3NpYmxlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQ09ESU5HX0FDX0xPU1Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFic19sZXZlbCA8PSBybC0+bWF4X2xldmVsW2xhc3RdW3J1bl0qMil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCAzLiBlc2MsIGVzYyAxIGVuY29kaW5nIHBvc3NpYmxlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERFQ09ESU5HX0FDX0xPU1Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJ1bjE+PTAgJiYgYWJzX2xldmVsIDw9IHJsLT5tYXhfbGV2ZWxbbGFzdF1bcnVuMV0pewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgMy4gZXNjLCBlc2MgMiBlbmNvZGluZyBwb3NzaWJsZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUNPRElOR19BQ19MT1NUOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIC8vbGV2ZWwgPSBsZXZlbCAqIHFtdWwgKyAobGV2ZWw+MCkgKiBxYWRkIC0gKGxldmVsPD0wKSAqIHFhZGQgOwogICAgICAgICAgICAgICAgICAgICBpZiAobGV2ZWw+MCkgbGV2ZWw9IGxldmVsICogcW11bCArIHFhZGQ7CiAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICBsZXZlbD0gbGV2ZWwgKiBxbXVsIC0gcWFkZDsKLSNpZiAwIC8vIHdhc3RlIG9mIHRpbWUgdG9vIDooCi0gICAgICAgICAgICAgICAgICAgIGlmKGxldmVsPjIwNDggfHwgbGV2ZWw8LTIwNDgpewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJ8bGV2ZWx8IG92ZXJmbG93IGluIDMuIGVzY1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVDT0RJTkdfQUNfTE9TVDsKLSAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgIGkrPSBydW4gKyAxOwogICAgICAgICAgICAgICAgICAgICBpZihsYXN0KSBpKz0xOTI7Ci0jaWZkZWYgRVJST1JfREVUQUlMUwotICAgICAgICAgICAgICAgIGlmKHJ1bj09NjYpCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCB2bGMgY29kZSBpbiBFU0MzIGxldmVsPSVkXG4iLCBsZXZlbCk7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZigoaT42MiAmJiBpPDE5MikgfHwgaT4xOTIrNjMpCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicnVuIG92ZXJmbG93IGluIEVTQzMgaT0lZCBydW49JWQgbGV2ZWw9JWRcbiIsIGksIHJ1biwgbGV2ZWwpOwotI2VuZGlmCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyogc2Vjb25kIGVzY2FwZSAqLwogICAgICAgICAgICAgICAgICAgICBTS0lQX0JJVFMocmUsICZzLT5nYiwgMik7CkBAIC04MDcsMTIgKzc4OCw2IEBACiAgICAgICAgICAgICAgICAgICAgIGkrPSBydW4gKyBybC0+bWF4X3J1bltydW4+PjddW2xldmVsL3FtdWxdICsgcnVuX2RpZmY7IC8vRklYTUUgb3B0IGluZGV4aW5nCiAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpOwogICAgICAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgJnMtPmdiLCAxKTsKLSNpZmRlZiBFUlJPUl9ERVRBSUxTCi0gICAgICAgICAgICAgICAgaWYocnVuPT02NikKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIHZsYyBjb2RlIGluIEVTQzIgbGV2ZWw9JWRcbiIsIGxldmVsKTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmKChpPjYyICYmIGk8MTkyKSB8fCBpPjE5Mis2MykKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJydW4gb3ZlcmZsb3cgaW4gRVNDMiBpPSVkIHJ1bj0lZCBsZXZlbD0lZFxuIiwgaSwgcnVuLCBsZXZlbCk7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIGZpcnN0IGVzY2FwZSAqLwpAQCAtODIyLDIzICs3OTcsMTEgQEAKICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsICsgcmwtPm1heF9sZXZlbFtydW4+PjddWyhydW4tMSkmNjNdICogcW11bDsvL0ZJWE1FIG9wdCBpbmRleGluZwogICAgICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpOwogICAgICAgICAgICAgICAgIExBU1RfU0tJUF9CSVRTKHJlLCAmcy0+Z2IsIDEpOwotI2lmZGVmIEVSUk9SX0RFVEFJTFMKLSAgICAgICAgICAgICAgICBpZihydW49PTY2KQotICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlsbGVnYWwgdmxjIGNvZGUgaW4gRVNDMSBsZXZlbD0lZFxuIiwgbGV2ZWwpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYoKGk+NjIgJiYgaTwxOTIpIHx8IGk+MTkyKzYzKQotICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJ1biBvdmVyZmxvdyBpbiBFU0MxIGk9JWQgcnVuPSVkIGxldmVsPSVkXG4iLCBpLCBydW4sIGxldmVsKTsKLSNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaSs9IHJ1bjsKICAgICAgICAgICAgIGxldmVsID0gKGxldmVsIF4gU0hPV19TQklUUyhyZSwgJnMtPmdiLCAxKSkgLSBTSE9XX1NCSVRTKHJlLCAmcy0+Z2IsIDEpOwogICAgICAgICAgICAgTEFTVF9TS0lQX0JJVFMocmUsICZzLT5nYiwgMSk7Ci0jaWZkZWYgRVJST1JfREVUQUlMUwotICAgICAgICAgICAgICAgIGlmKHJ1bj09NjYpCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCB2bGMgY29kZSBsZXZlbD0lZFxuIiwgbGV2ZWwpOwotICAgICAgICAgICAgICAgIGVsc2UgaWYoKGk+NjIgJiYgaTwxOTIpIHx8IGk+MTkyKzYzKQotICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJ1biBvdmVyZmxvdyBpPSVkIHJ1bj0lZCBsZXZlbD0lZFxuIiwgaSwgcnVuLCBsZXZlbCk7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICBpZiAoaSA+IDYyKXsKICAgICAgICAgICAgIGktPSAxOTI7CkBAIC05MjUsNiArODg4LDcgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCiAgICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSwKICAgICAubWF4X2xvd3JlcyAgICAgPSAzLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgewogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCkBAIC05NDIsNiArOTA2LDcgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCiAgICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSwKICAgICAubWF4X2xvd3JlcyAgICAgPSAzLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgewogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCkBAIC05NTksNiArOTI0LDcgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCiAgICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSwKICAgICAubWF4X2xvd3JlcyAgICAgPSAzLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgewogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCkBAIC05NzYsNiArOTQyLDcgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBmZl9oMjYzX2RlY29kZV9lbmQsCiAgICAgLmRlY29kZSAgICAgICAgID0gZmZfaDI2M19kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSwKICAgICAubWF4X2xvd3JlcyAgICAgPSAzLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgewogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21zbXBlZzRlbmMuYyBiL2xpYmF2Y29kZWMvbXNtcGVnNGVuYy5jCmluZGV4IGUxYWRlMjQuLjE0NDQ2OGIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXNtcGVnNGVuYy5jCisrKyBiL2xpYmF2Y29kZWMvbXNtcGVnNGVuYy5jCkBAIC0yMzUsOCArMjM1LDggQEAKICAgICB9CiAKICAgICBzLT5kY190YWJsZV9pbmRleCA9IDE7Ci0gICAgcy0+bXZfdGFibGVfaW5kZXggPSAxOyAvKiBvbmx5IGlmIFAgZnJhbWUgKi8KLSAgICBzLT51c2Vfc2tpcF9tYl9jb2RlID0gMTsgLyogb25seSBpZiBQIGZyYW1lICovCisgICAgcy0+bXZfdGFibGVfaW5kZXggPSAxOyAvKiBvbmx5IGlmIFAtZnJhbWUgKi8KKyAgICBzLT51c2Vfc2tpcF9tYl9jb2RlID0gMTsgLyogb25seSBpZiBQLWZyYW1lICovCiAgICAgcy0+cGVyX21iX3JsX3RhYmxlID0gMDsKICAgICBpZihzLT5tc21wZWc0X3ZlcnNpb249PTQpCiAgICAgICAgIHMtPmludGVyX2ludHJhX3ByZWQ9IChzLT53aWR0aCpzLT5oZWlnaHQgPCAzMjAqMjQwICYmIHMtPmJpdF9yYXRlPD1JSV9CSVRSQVRFICYmIHMtPnBpY3RfdHlwZT09QVZfUElDVFVSRV9UWVBFX1ApOwpAQCAtMzE0LDExICszMTQsNiBAQAogCiAgICAgbXggKz0gMzI7CiAgICAgbXkgKz0gMzI7Ci0jaWYgMAotICAgIGlmICgodW5zaWduZWQpbXggPj0gNjQgfHwKLSAgICAgICAgKHVuc2lnbmVkKW15ID49IDY0KQotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIG14PSVkIG15PSVkXG4iLCBteCwgbXkpOwotI2VuZGlmCiAgICAgbXYgPSAmZmZfbXZfdGFibGVzW3MtPm12X3RhYmxlX2luZGV4XTsKIAogICAgIGNvZGUgPSBtdi0+dGFibGVfbXZfaW5kZXhbKG14IDw8IDYpIHwgbXldOwpAQCAtNTc3LDkgKzU3Miw4IEBACiAgICAgfQogfQogCi0vKiBFbmNvZGluZyBvZiBhIGJsb2NrLiBWZXJ5IHNpbWlsYXIgdG8gTVBFRzQgZXhjZXB0IGZvciBhIGRpZmZlcmVudAotICAgZXNjYXBlIGNvZGluZyAoc2FtZSBhcyBIMjYzKSBhbmQgbW9yZSB2bGMgdGFibGVzLgotICovCisvKiBFbmNvZGluZyBvZiBhIGJsb2NrOyB2ZXJ5IHNpbWlsYXIgdG8gTVBFRy00IGV4Y2VwdCBmb3IgYSBkaWZmZXJlbnQKKyAqIGVzY2FwZSBjb2RpbmcgKHNhbWUgYXMgSC4yNjMpIGFuZCBtb3JlIFZMQyB0YWJsZXMuICovCiB2b2lkIGZmX21zbXBlZzRfZW5jb2RlX2Jsb2NrKE1wZWdFbmNDb250ZXh0ICogcywgaW50MTZfdCAqIGJsb2NrLCBpbnQgbikKIHsKICAgICBpbnQgbGV2ZWwsIHJ1biwgbGFzdCwgaSwgaiwgbGFzdF9pbmRleDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXNybGUuYyBiL2xpYmF2Y29kZWMvbXNybGUuYwppbmRleCAzMDkwYTkxLi4xYWI4YTQxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21zcmxlLmMKKysrIGIvbGliYXZjb2RlYy9tc3JsZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIE1pY3Jvc29mdCBSTEUgdmlkZW8gZGVjb2RlcgotICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZSBGRm1wZWcgcHJvamVjdAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC05NSwxNSArOTUsMjEgQEAKICAgICBzLT5idWYgPSBidWY7CiAgICAgcy0+c2l6ZSA9IGJ1Zl9zaXplOwogCisgICAgaWYgKGJ1Zl9zaXplIDwgMikgLy9NaW5pbWFsbHkgYSBlbmQgb2YgcGljdHVyZSBjb2RlIHNob3VsZCBiZSB0aGVyZQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID4gMSAmJiBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDw9IDgpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsICZzaXplKTsKIAotICAgICAgICBpZiAocGFsKSB7CisgICAgICAgIGlmIChwYWwgJiYgc2l6ZSA9PSBBVlBBTEVUVEVfU0laRSkgewogICAgICAgICAgICAgcy0+ZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOwogICAgICAgICAgICAgbWVtY3B5KHMtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIH0gZWxzZSBpZiAocGFsKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhbGV0dGUgc2l6ZSAlZCBpcyB3cm9uZ1xuIiwgc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgLyogbWFrZSB0aGUgcGFsZXR0ZSBhdmFpbGFibGUgKi8KICAgICAgICAgbWVtY3B5KHMtPmZyYW1lLT5kYXRhWzFdLCBzLT5wYWwsIEFWUEFMRVRURV9TSVpFKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXNybGVkZWMuYyBiL2xpYmF2Y29kZWMvbXNybGVkZWMuYwppbmRleCA4MDU4MDJhLi5mMGNiZGU2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21zcmxlZGVjLmMKKysrIGIvbGliYXZjb2RlYy9tc3JsZWRlYy5jCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICAgICAgICAgc3RyZWFtX2J5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CiAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IHN0cmVhbV9ieXRlOwogICAgICAgICAgICAgICAgIHN0cmVhbV9ieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOwotICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlVudXNlZCBzdHJlYW0gYnl0ZSAlWCIsIHN0cmVhbV9ieXRlKTsKKyAgICAgICAgICAgICAgICBsaW5lIC09IHN0cmVhbV9ieXRlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBjb3B5IHBpeGVscyBmcm9tIGVuY29kZWQgc3RyZWFtCiAgICAgICAgICAgICAgICAgb2RkX3BpeGVsID0gIHN0cmVhbV9ieXRlICYgMTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXNzMTIuYyBiL2xpYmF2Y29kZWMvbXNzMTIuYwppbmRleCA2YjU4YWEyLi4zYjFhMzAyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21zczEyLmMKKysrIGIvbGliYXZjb2RlYy9tc3MxMi5jCkBAIC0xOTcsNyArMTk3LDcgQEAKIH0KIAogc3RhdGljIGludCBkZWNvZGVfcGl4ZWxfaW5fY29udGV4dChBcml0aENvZGVyICphY29kZXIsIFBpeENvbnRleHQgKnBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsIGludCB4LCBpbnQgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc19yaWdodCkKIHsKICAgICB1aW50OF90IG5laWdoYm91cnNbNF07CkBAIC0yOTAsOCArMjkwLDkgQEAKIH0KIAogc3RhdGljIGludCBkZWNvZGVfcmVnaW9uKEFyaXRoQ29kZXIgKmFjb2RlciwgdWludDhfdCAqZHN0LCB1aW50OF90ICpyZ2JfcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2Jfc3RyaWRlLCBQaXhDb250ZXh0ICpwY3R4LCBjb25zdCB1aW50MzJfdCAqcGFsKQorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCByZ2Jfc3RyaWRlLCBQaXhDb250ZXh0ICpwY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpwYWwpCiB7CiAgICAgaW50IGksIGosIHA7CiAgICAgdWludDhfdCAqcmdiX2RzdCA9IHJnYl9waWMgKyB4ICogMyArIHkgKiByZ2Jfc3RyaWRlOwpAQCAtMzY4LDggKzM2OSw4IEBACiB9CiAKIHN0YXRpYyBpbnQgZGVjb2RlX3JlZ2lvbl9tYXNrZWQoTVNTMTJDb250ZXh0IGNvbnN0ICpjLCBBcml0aENvZGVyICphY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgdWludDhfdCAqbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfc3RyaWRlLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgdWludDhfdCAqbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1hc2tfc3RyaWRlLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4Q29udGV4dCAqcGN0eCkKIHsKQEAgLTQ2Niw4ICs0NjcsOCBAQAogCiAgICAgaWYgKCFtb2RlKSB7CiAgICAgICAgIGludCBpLCBqLCBwaXgsIHJnYl9waXg7Ci0gICAgICAgIGludCBzdHJpZGUgICAgICAgPSBjLT5wYWxfc3RyaWRlOwotICAgICAgICBpbnQgcmdiX3N0cmlkZSAgID0gYy0+cmdiX3N0cmlkZTsKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSAgICAgPSBjLT5wYWxfc3RyaWRlOworICAgICAgICBwdHJkaWZmX3QgcmdiX3N0cmlkZSA9IGMtPnJnYl9zdHJpZGU7CiAgICAgICAgIHVpbnQ4X3QgKmRzdCAgICAgPSBjLT5wYWxfcGljICsgeCAgICAgKyB5ICogc3RyaWRlOwogICAgICAgICB1aW50OF90ICpyZ2JfZHN0ID0gYy0+cmdiX3BpYyArIHggKiAzICsgeSAqIHJnYl9zdHJpZGU7CiAKQEAgLTU4MSw4ICs1ODIsOCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBhdmN0eC0+Y29kZWRfd2lkdGggID0gQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgMjApOwotICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQgPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyAyNCk7CisgICAgYXZjdHgtPmNvZGVkX3dpZHRoICA9IEZGTUFYKEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDIwKSwgYXZjdHgtPndpZHRoKTsKKyAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0ID0gRkZNQVgoQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgMjQpLCBhdmN0eC0+aGVpZ2h0KTsKICAgICBpZiAoYXZjdHgtPmNvZGVkX3dpZHRoID4gNDA5NiB8fCBhdmN0eC0+Y29kZWRfaGVpZ2h0ID4gNDA5NikgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZyYW1lIGRpbWVuc2lvbnMgJWR4JWQgdG9vIGxhcmdlIiwKICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlZF93aWR0aCwgYXZjdHgtPmNvZGVkX2hlaWdodCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21zczEyLmggYi9saWJhdmNvZGVjL21zczEyLmgKaW5kZXggZjk1MzE2Ny4uNDVjNDA3NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tc3MxMi5oCisrKyBiL2xpYmF2Y29kZWMvbXNzMTIuaApAQCAtNzcsMTIgKzc3LDEyIEBACiAgICAgdWludDMyX3QgICAgICAgcGFsWzI1Nl07CiAgICAgdWludDhfdCAgICAgICAgKnBhbF9waWM7CiAgICAgdWludDhfdCAgICAgICAgKmxhc3RfcGFsX3BpYzsKLSAgICBpbnQgICAgICAgICAgICBwYWxfc3RyaWRlOworICAgIHB0cmRpZmZfdCAgICAgIHBhbF9zdHJpZGU7CiAgICAgdWludDhfdCAgICAgICAgKm1hc2s7Ci0gICAgaW50ICAgICAgICAgICAgbWFza19zdHJpZGU7CisgICAgcHRyZGlmZl90ICAgICAgbWFza19zdHJpZGU7CiAgICAgdWludDhfdCAgICAgICAgKnJnYl9waWM7CiAgICAgdWludDhfdCAgICAgICAgKmxhc3RfcmdiX3BpYzsKLSAgICBpbnQgICAgICAgICAgICByZ2Jfc3RyaWRlOworICAgIHB0cmRpZmZfdCAgICAgIHJnYl9zdHJpZGU7CiAgICAgaW50ICAgICAgICAgICAgZnJlZV9jb2xvdXJzOwogICAgIGludCAgICAgICAgICAgIGtleWZyYW1lOwogICAgIGludCAgICAgICAgICAgIG12WCwgbXZZOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tc3MyLmMgYi9saWJhdmNvZGVjL21zczIuYwppbmRleCBjNjQwOTM0Li4zMTgwYWYxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21zczIuYworKysgYi9saWJhdmNvZGVjL21zczIuYwpAQCAtMjgsOSArMjgsOSBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibXBlZ19lci5oIgogI2luY2x1ZGUgIm1zbXBlZzQuaCIKLSNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgogI2luY2x1ZGUgInFwZWxkc3AuaCIKICNpbmNsdWRlICJ2YzEuaCIKKyNpbmNsdWRlICJ3bXYyZGF0YS5oIgogI2luY2x1ZGUgIm1zczEyLmgiCiAjaW5jbHVkZSAibXNzMmRzcC5oIgogCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICByZXR1cm4gMSArIG5jb2wgKiAzOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV81NTUoR2V0Qnl0ZUNvbnRleHQgKmdCLCB1aW50MTZfdCAqZHN0LCBpbnQgc3RyaWRlLAorc3RhdGljIGludCBkZWNvZGVfNTU1KEdldEJ5dGVDb250ZXh0ICpnQiwgdWludDE2X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5ZnJhbWUsIGludCB3LCBpbnQgaCkKIHsKICAgICBpbnQgbGFzdF9zeW1ib2wgPSAwLCByZXBlYXQgPSAwLCBwcmV2X2F2YWlsID0gMDsKQEAgLTIzNyw4ICsyMzcsOCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV9ybGUoR2V0Qml0Q29udGV4dCAqZ2IsIHVpbnQ4X3QgKnBhbF9kc3QsIGludCBwYWxfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJnYl9kc3QsIGludCByZ2Jfc3RyaWRlLCB1aW50MzJfdCAqcGFsLAorc3RhdGljIGludCBkZWNvZGVfcmxlKEdldEJpdENvbnRleHQgKmdiLCB1aW50OF90ICpwYWxfZHN0LCBwdHJkaWZmX3QgcGFsX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpyZ2JfZHN0LCBwdHJkaWZmX3QgcmdiX3N0cmlkZSwgdWludDMyX3QgKnBhbCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQga2V5ZnJhbWUsIGludCBrZl9zbGlwdCwgaW50IHNsaWNlLCBpbnQgdywgaW50IGgpCiB7CiAgICAgdWludDhfdCBiaXRzWzI3MF0gPSB7IDAgfTsKQEAgLTQyMiw3ICs0MjIsMTMgQEAKIAogICAgIGZmX3ZjMV9kZWNvZGVfYmxvY2tzKHYpOwogCi0gICAgZmZfZXJfZnJhbWVfZW5kKCZzLT5lcik7CisgICAgaWYgKHYtPmVuZF9tYl94ID09IHMtPm1iX3dpZHRoICYmIHMtPmVuZF9tYl95ID09IHMtPm1iX2hlaWdodCkgeworICAgICAgICBmZl9lcl9mcmFtZV9lbmQoJnMtPmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiZGlzYWJsaW5nIGVycm9yIGNvcnJlY3Rpb24gZHVlIHRvIGJsb2NrIGNvdW50IG1pc21hdGNoICVkeCVkICE9ICVkeCVkXG4iLAorICAgICAgICAgICAgICAgdi0+ZW5kX21iX3gsIHMtPmVuZF9tYl95LCBzLT5tYl93aWR0aCwgcy0+bWJfaGVpZ2h0KTsKKyAgICB9CiAKICAgICBmZl9tcHZfZnJhbWVfZW5kKHMpOwogCkBAIC00NTgsOSArNDY0LDkgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdHlwZWRlZiBzdHJ1Y3QgUmVjdGFuZ2xlIHsKK3N0cnVjdCBSZWN0YW5nbGUgewogICAgIGludCBjb2RlZCwgeCwgeSwgdywgaDsKLX0gUmVjdGFuZ2xlOworfTsKIAogI2RlZmluZSBNQVhfV01WOV9SRUNUQU5HTEVTIDIwCiAjZGVmaW5lIEFSSVRIMl9QQURESU5HIDIKQEAgLTQ3OSwxMiArNDg1LDkgQEAKIAogICAgIGludCBrZXlmcmFtZSwgaGFzX3dtdjksIGhhc19tdiwgaXNfcmxlLCBpc181NTUsIHJldDsKIAotICAgIFJlY3RhbmdsZSB3bXY5cmVjdHNbTUFYX1dNVjlfUkVDVEFOR0xFU10sICpyOworICAgIHN0cnVjdCBSZWN0YW5nbGUgd212OXJlY3RzW01BWF9XTVY5X1JFQ1RBTkdMRVNdLCAqcjsKICAgICBpbnQgdXNlZF9yZWN0cyA9IDAsIGksIGltcGxpY2l0X3JlY3QgPSAwLCBhdl91bmluaXQod212OV9tYXNrKTsKIAotICAgIGF2X2Fzc2VydDAoQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSA+PQotICAgICAgICAgICAgICAgQVJJVEgyX1BBRERJTkcgKyAoTUlOX0NBQ0hFX0JJVFMgKyA3KSAvIDgpOwotCiAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZiwgYnVmX3NpemUpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXNzMmRzcC5jIGIvbGliYXZjb2RlYy9tc3MyZHNwLmMKaW5kZXggYzVmYzFmOC4uY2MzOWRkNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tc3MyZHNwLmMKKysrIGIvbGliYXZjb2RlYy9tc3MyZHNwLmMKQEAgLTI3LDE3ICsyNywxNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtc3MyX2JsaXRfd212OV90ZW1wbGF0ZSh1aW50OF90ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbWFza19zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmN5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY3lfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjdXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjdXZfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCiB7CiAgICAgaW50IGksIGosIGssIHIgPSAtMTsKQEAgLTY0LDEwICs2NCwxMCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgbXNzMl9ibGl0X3dtdjlfYyh1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN5LCBpbnQgc3JjeV9zdHJpZGUsCitzdGF0aWMgdm9pZCBtc3MyX2JsaXRfd212OV9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3ksIHB0cmRpZmZfdCBzcmN5X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjdSwgY29uc3QgdWludDhfdCAqc3JjdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY3V2X3N0cmlkZSwgaW50IHcsIGludCBoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjdXZfc3RyaWRlLCBpbnQgdywgaW50IGgpCiB7CiAgICAgbXNzMl9ibGl0X3dtdjlfdGVtcGxhdGUoZHN0LCBkc3Rfc3RyaWRlLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIDAsCkBAIC03NiwxMiArNzYsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoKTsKIH0KIAotc3RhdGljIHZvaWQgbXNzMl9ibGl0X3dtdjlfbWFza2VkX2ModWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIG1zczJfYmxpdF93bXY5X21hc2tlZF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza2NvbG9yLCBjb25zdCB1aW50OF90ICptYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjeSwgaW50IHNyY3lfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1hc2tfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjeSwgcHRyZGlmZl90IHNyY3lfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjdSwgY29uc3QgdWludDhfdCAqc3JjdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmN1dl9zdHJpZGUsIGludCB3LCBpbnQgaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzcmN1dl9zdHJpZGUsIGludCB3LCBpbnQgaCkKIHsKICAgICBtc3MyX2JsaXRfd212OV90ZW1wbGF0ZShkc3QsIGRzdF9zdHJpZGUsIDAsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2NvbG9yLCBtYXNrLCBtYXNrX3N0cmlkZSwKQEAgLTkwLDkgKzkwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LCBoKTsKIH0KIAotc3RhdGljIHZvaWQgbXNzMl9ncmF5X2ZpbGxfbWFza2VkX2ModWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwKK3N0YXRpYyB2b2lkIG1zczJfZ3JheV9maWxsX21hc2tlZF9jKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza2NvbG9yLCBjb25zdCB1aW50OF90ICptYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfc3RyaWRlLCBpbnQgdywgaW50IGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbWFza19zdHJpZGUsIGludCB3LCBpbnQgaCkKIHsKICAgICBtc3MyX2JsaXRfd212OV90ZW1wbGF0ZShkc3QsIGRzdF9zdHJpZGUsIDEsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza2NvbG9yLCBtYXNrLCBtYXNrX3N0cmlkZSwKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcsIGgpOwogfQogCi1zdGF0aWMgdm9pZCB1cHNhbXBsZV9wbGFuZV9jKHVpbnQ4X3QgKnBsYW5lLCBpbnQgcGxhbmVfc3RyaWRlLCBpbnQgdywgaW50IGgpCitzdGF0aWMgdm9pZCB1cHNhbXBsZV9wbGFuZV9jKHVpbnQ4X3QgKnBsYW5lLCBwdHJkaWZmX3QgcGxhbmVfc3RyaWRlLCBpbnQgdywgaW50IGgpCiB7CiAgICAgdWludDhfdCAqc3JjMSwgKnNyYzIsICpkc3QxLCAqZHN0MiwgKnAsIGEsIGI7CiAgICAgaW50IGksIGo7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21zczJkc3AuaCBiL2xpYmF2Y29kZWMvbXNzMmRzcC5oCmluZGV4IDczNjhhYmIuLmU0NGM5YWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXNzMmRzcC5oCisrKyBiL2xpYmF2Y29kZWMvbXNzMmRzcC5oCkBAIC0yNiwyMyArMjYsMjUgQEAKICNpZm5kZWYgQVZDT0RFQ19NU1MyRFNQX0gKICNkZWZpbmUgQVZDT0RFQ19NU1MyRFNQX0gKIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiB0eXBlZGVmIHN0cnVjdCBNU1MyRFNQQ29udGV4dCB7Ci0gICAgdm9pZCAoKm1zczJfYmxpdF93bXY5KSh1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjeSwgaW50IHNyY3lfc3RyaWRlLAorICAgIHZvaWQgKCptc3MyX2JsaXRfd212OSkodWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3ksIHB0cmRpZmZfdCBzcmN5X3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3UsIGNvbnN0IHVpbnQ4X3QgKnNyY3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjdXZfc3RyaWRlLCBpbnQgdywgaW50IGgpOwotICAgIHZvaWQgKCptc3MyX2JsaXRfd212OV9tYXNrZWQpKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3JjdXZfc3RyaWRlLCBpbnQgdywgaW50IGgpOworICAgIHZvaWQgKCptc3MyX2JsaXRfd212OV9tYXNrZWQpKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tjb2xvciwgY29uc3QgdWludDhfdCAqbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjeSwgaW50IHNyY3lfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBtYXNrX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmN5LCBwdHJkaWZmX3Qgc3JjeV9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjdSwgY29uc3QgdWludDhfdCAqc3JjdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjdXZfc3RyaWRlLCBpbnQgdywgaW50IGgpOwotICAgIHZvaWQgKCptc3MyX2dyYXlfZmlsbF9tYXNrZWQpKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNyY3V2X3N0cmlkZSwgaW50IHcsIGludCBoKTsKKyAgICB2b2lkICgqbXNzMl9ncmF5X2ZpbGxfbWFza2VkKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrY29sb3IsIGNvbnN0IHVpbnQ4X3QgKm1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfc3RyaWRlLCBpbnQgdywgaW50IGgpOwotICAgIHZvaWQgKCp1cHNhbXBsZV9wbGFuZSkodWludDhfdCAqcGxhbmUsIGludCBwbGFuZV9zdHJpZGUsIGludCB3LCBpbnQgaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1hc2tfc3RyaWRlLCBpbnQgdywgaW50IGgpOworICAgIHZvaWQgKCp1cHNhbXBsZV9wbGFuZSkodWludDhfdCAqcGxhbmUsIHB0cmRpZmZfdCBwbGFuZV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOwogfSBNU1MyRFNQQ29udGV4dDsKIAogdm9pZCBmZl9tc3MyZHNwX2luaXQoTVNTMkRTUENvbnRleHQgKmRzcCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21zczMuYyBiL2xpYmF2Y29kZWMvbXNzMy5jCmluZGV4IDAxOTQxOTYuLjIxMjI2ZjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXNzMy5jCisrKyBiL2xpYmF2Y29kZWMvbXNzMy5jCkBAIC05MSw3ICs5MSw3IEBACiAKIHR5cGVkZWYgc3RydWN0IERDVEJsb2NrQ29kZXIgewogICAgIGludCAgICAgICpwcmV2X2RjOwotICAgIGludCAgICAgIHByZXZfZGNfc3RyaWRlOworICAgIHB0cmRpZmZfdCBwcmV2X2RjX3N0cmlkZTsKICAgICBpbnQgICAgICBwcmV2X2RjX2hlaWdodDsKICAgICBpbnQgICAgICBxdWFsaXR5OwogICAgIHVpbnQxNl90IHFtYXRbNjRdOwpAQCAtMzU2LDggKzM1Niw5IEBACiAKIHN0YXRpYyBpbnQgcmFjX2dldF9tb2RlbF9zeW0oUmFuZ2VDb2RlciAqYywgTW9kZWwgKm0pCiB7Ci0gICAgaW50IHByb2IsIHByb2IyLCBoZWxwZXIsIHZhbDsKKyAgICBpbnQgdmFsOwogICAgIGludCBlbmQsIGVuZDI7CisgICAgdW5zaWduZWQgcHJvYiwgcHJvYjIsIGhlbHBlcjsKIAogICAgIHByb2IgICAgICAgPSAwOwogICAgIHByb2IyICAgICAgPSBjLT5yYW5nZTsKQEAgLTM4OCw5ICszODksMTAgQEAKIAogc3RhdGljIGludCByYWNfZ2V0X21vZGVsMjU2X3N5bShSYW5nZUNvZGVyICpjLCBNb2RlbDI1NiAqbSkKIHsKLSAgICBpbnQgcHJvYiwgcHJvYjIsIGhlbHBlciwgdmFsOworICAgIGludCB2YWw7CiAgICAgaW50IHN0YXJ0LCBlbmQ7CiAgICAgaW50IHNzeW07CisgICAgdW5zaWduZWQgcHJvYiwgcHJvYjIsIGhlbHBlcjsKIAogICAgIHByb2IyICAgICAgPSBjLT5yYW5nZTsKICAgICBjLT5yYW5nZSA+Pj0gTU9ERUxfU0NBTEU7CkBAIC00NTAsNyArNDUyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgZGVjb2RlX2ZpbGxfYmxvY2soUmFuZ2VDb2RlciAqYywgRmlsbEJsb2NrQ29kZXIgKmZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQgYmxvY2tfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGJsb2NrX3NpemUpCiB7CiAgICAgaW50IGk7CiAKQEAgLTQ2MSw3ICs0NjMsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBkZWNvZGVfaW1hZ2VfYmxvY2soUmFuZ2VDb2RlciAqYywgSW1hZ2VCbG9ja0NvZGVyICppYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCBibG9ja19zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGJsb2NrX3NpemUpCiB7CiAgICAgaW50IGksIGo7CiAgICAgaW50IHZlY19zaXplOwpAQCAtNTU3LDcgKzU1OSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGRlY29kZV9kY3RfYmxvY2soUmFuZ2VDb2RlciAqYywgRENUQmxvY2tDb2RlciAqYmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGJsb2NrX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGJsb2NrX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYmxvY2ssIGludCBtYl94LCBpbnQgbWJfeSkKIHsKICAgICBpbnQgaSwgajsKQEAgLTU4MCw4ICs1ODIsOCBAQAogfQogCiBzdGF0aWMgdm9pZCBkZWNvZGVfaGFhcl9ibG9jayhSYW5nZUNvZGVyICpjLCBIYWFyQmxvY2tDb2RlciAqaGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCBibG9ja19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpibG9jaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19zaXplLCBpbnQgKmJsb2NrKQogewogICAgIGNvbnN0IGludCBoc2l6ZSA9IGJsb2NrX3NpemUgPj4gMTsKICAgICBpbnQgQSwgQiwgQywgRCwgdDEsIHQyLCB0MywgdDQ7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL21zczM0ZHNwLmMgYi9saWJhdmNvZGVjL21zczM0ZHNwLmMKaW5kZXggMDM5N2FkZC4uZjM0MDU2NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9tc3MzNGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvbXNzMzRkc3AuYwpAQCAtNjIsMzIgKzYyLDMyIEBACiB9CiAKICNkZWZpbmUgRENUX1RFTVBMQVRFKGJsaywgc3RlcCwgU09QLCBzaGlmdCkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCB0MCA9IC0zOTQwOSAqIGJsa1s3ICogc3RlcF0gLSAgNTg5ODAgKiBibGtbMSAqIHN0ZXBdOyBcCi0gICAgY29uc3QgaW50IHQxID0gIDM5NDEwICogYmxrWzEgKiBzdGVwXSAtICA1ODk4MCAqIGJsa1s3ICogc3RlcF07IFwKLSAgICBjb25zdCBpbnQgdDIgPSAtMzM0MTAgKiBibGtbNSAqIHN0ZXBdIC0gMTY3OTYzICogYmxrWzMgKiBzdGVwXTsgXAotICAgIGNvbnN0IGludCB0MyA9ICAzMzQxMCAqIGJsa1szICogc3RlcF0gLSAxNjc5NjMgKiBibGtbNSAqIHN0ZXBdOyBcCi0gICAgY29uc3QgaW50IHQ0ID0gICAgICAgICAgYmxrWzMgKiBzdGVwXSArICAgICAgICAgIGJsa1s3ICogc3RlcF07IFwKLSAgICBjb25zdCBpbnQgdDUgPSAgICAgICAgICBibGtbMSAqIHN0ZXBdICsgICAgICAgICAgYmxrWzUgKiBzdGVwXTsgXAotICAgIGNvbnN0IGludCB0NiA9ICA3NzA2MiAqIHQ0ICAgICAgICAgICAgKyAgNTE0OTEgKiB0NTsgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHQ3ID0gIDc3MDYyICogdDUgICAgICAgICAgICAtICA1MTQ5MSAqIHQ0OyAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgdDggPSAgMzU0NzAgKiBibGtbMiAqIHN0ZXBdIC0gIDg1NjIzICogYmxrWzYgKiBzdGVwXTsgXAotICAgIGNvbnN0IGludCB0OSA9ICAzNTQ3MCAqIGJsa1s2ICogc3RlcF0gKyAgODU2MjMgKiBibGtbMiAqIHN0ZXBdOyBcCi0gICAgY29uc3QgaW50IHRBID0gU09QKGJsa1swICogc3RlcF0gLSBibGtbNCAqIHN0ZXBdKTsgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgdEIgPSBTT1AoYmxrWzAgKiBzdGVwXSArIGJsa1s0ICogc3RlcF0pOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVuc2lnbmVkIHQwID0tMzk0MDlVICogYmxrWzcgKiBzdGVwXSAtIDU4OTgwVSAqIGJsa1sxICogc3RlcF07IFwKKyAgICBjb25zdCB1bnNpZ25lZCB0MSA9IDM5NDEwVSAqIGJsa1sxICogc3RlcF0gLSA1ODk4MFUgKiBibGtbNyAqIHN0ZXBdOyBcCisgICAgY29uc3QgdW5zaWduZWQgdDIgPS0zMzQxMFUgKiBibGtbNSAqIHN0ZXBdIC0xNjc5NjNVICogYmxrWzMgKiBzdGVwXTsgXAorICAgIGNvbnN0IHVuc2lnbmVkIHQzID0gMzM0MTBVICogYmxrWzMgKiBzdGVwXSAtMTY3OTYzVSAqIGJsa1s1ICogc3RlcF07IFwKKyAgICBjb25zdCB1bnNpZ25lZCB0NCA9ICAgICAgICAgIGJsa1szICogc3RlcF0gKyAgICAgICAgICBibGtbNyAqIHN0ZXBdOyBcCisgICAgY29uc3QgdW5zaWduZWQgdDUgPSAgICAgICAgICBibGtbMSAqIHN0ZXBdICsgICAgICAgICAgYmxrWzUgKiBzdGVwXTsgXAorICAgIGNvbnN0IHVuc2lnbmVkIHQ2ID0gNzcwNjJVICogdDQgICAgICAgICAgICArIDUxNDkxVSAqIHQ1OyAgICAgICAgICAgIFwKKyAgICBjb25zdCB1bnNpZ25lZCB0NyA9IDc3MDYyVSAqIHQ1ICAgICAgICAgICAgLSA1MTQ5MVUgKiB0NDsgICAgICAgICAgICBcCisgICAgY29uc3QgdW5zaWduZWQgdDggPSAzNTQ3MFUgKiBibGtbMiAqIHN0ZXBdIC0gODU2MjNVICogYmxrWzYgKiBzdGVwXTsgXAorICAgIGNvbnN0IHVuc2lnbmVkIHQ5ID0gMzU0NzBVICogYmxrWzYgKiBzdGVwXSArIDg1NjIzVSAqIGJsa1syICogc3RlcF07IFwKKyAgICBjb25zdCB1bnNpZ25lZCB0QSA9IFNPUChibGtbMCAqIHN0ZXBdIC0gYmxrWzQgKiBzdGVwXSk7ICAgICAgICAgICAgICBcCisgICAgY29uc3QgdW5zaWduZWQgdEIgPSBTT1AoYmxrWzAgKiBzdGVwXSArIGJsa1s0ICogc3RlcF0pOyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmxrWzAgKiBzdGVwXSA9ICggIHQxICsgdDYgICsgdDkgKyB0QikgPj4gc2hpZnQ7ICAgICAgICAgICAgICAgIFwKLSAgICBibGtbMSAqIHN0ZXBdID0gKCAgdDMgKyB0NyAgKyB0OCArIHRBKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgXAotICAgIGJsa1syICogc3RlcF0gPSAoICB0MiArIHQ2ICAtIHQ4ICsgdEEpID4+IHNoaWZ0OyAgICAgICAgICAgICAgICBcCi0gICAgYmxrWzMgKiBzdGVwXSA9ICggIHQwICsgdDcgIC0gdDkgKyB0QikgPj4gc2hpZnQ7ICAgICAgICAgICAgICAgIFwKLSAgICBibGtbNCAqIHN0ZXBdID0gKC0odDAgKyB0NykgLSB0OSArIHRCKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgXAotICAgIGJsa1s1ICogc3RlcF0gPSAoLSh0MiArIHQ2KSAtIHQ4ICsgdEEpID4+IHNoaWZ0OyAgICAgICAgICAgICAgICBcCi0gICAgYmxrWzYgKiBzdGVwXSA9ICgtKHQzICsgdDcpICsgdDggKyB0QSkgPj4gc2hpZnQ7ICAgICAgICAgICAgICAgIFwKLSAgICBibGtbNyAqIHN0ZXBdID0gKC0odDEgKyB0NikgKyB0OSArIHRCKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgXAorICAgIGJsa1swICogc3RlcF0gPSAoaW50KSggIHQxICsgdDYgICsgdDkgKyB0QikgPj4gc2hpZnQ7ICAgICAgICAgICAgICAgIFwKKyAgICBibGtbMSAqIHN0ZXBdID0gKGludCkoICB0MyArIHQ3ICArIHQ4ICsgdEEpID4+IHNoaWZ0OyAgICAgICAgICAgICAgICBcCisgICAgYmxrWzIgKiBzdGVwXSA9IChpbnQpKCAgdDIgKyB0NiAgLSB0OCArIHRBKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgXAorICAgIGJsa1szICogc3RlcF0gPSAoaW50KSggIHQwICsgdDcgIC0gdDkgKyB0QikgPj4gc2hpZnQ7ICAgICAgICAgICAgICAgIFwKKyAgICBibGtbNCAqIHN0ZXBdID0gKGludCkoLSh0MCArIHQ3KSAtIHQ5ICsgdEIpID4+IHNoaWZ0OyAgICAgICAgICAgICAgICBcCisgICAgYmxrWzUgKiBzdGVwXSA9IChpbnQpKC0odDIgKyB0NikgLSB0OCArIHRBKSA+PiBzaGlmdDsgICAgICAgICAgICAgICAgXAorICAgIGJsa1s2ICogc3RlcF0gPSAoaW50KSgtKHQzICsgdDcpICsgdDggKyB0QSkgPj4gc2hpZnQ7ICAgICAgICAgICAgICAgIFwKKyAgICBibGtbNyAqIHN0ZXBdID0gKGludCkoLSh0MSArIHQ2KSArIHQ5ICsgdEIpID4+IHNoaWZ0OyAgICAgICAgICAgICAgICBcCiAKLSNkZWZpbmUgU09QX1JPVyhhKSAoKChhKSA8PCAxNikgKyAweDIwMDApCi0jZGVmaW5lIFNPUF9DT0woYSkgKCgoYSkgKyAzMikgPDwgMTYpCisjZGVmaW5lIFNPUF9ST1coYSkgKCgoYSkgKiAoMVUgPDwgMTYpKSArIDB4MjAwMCkKKyNkZWZpbmUgU09QX0NPTChhKSAoKChhKSArIDMyKSAqICgxVSA8PCAxNikpCiAKLXZvaWQgZmZfbXNzMzRfZGN0X3B1dCh1aW50OF90ICpkc3QsIGludCBzdHJpZGUsIGludCAqYmxvY2spCit2b2lkIGZmX21zczM0X2RjdF9wdXQodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgKmJsb2NrKQogewogICAgIGludCBpLCBqOwogICAgIGludCAqcHRyOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tc3MzNGRzcC5oIGIvbGliYXZjb2RlYy9tc3MzNGRzcC5oCmluZGV4IDJmOTgyN2QuLjI5YzYxZTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXNzMzRkc3AuaAorKysgYi9saWJhdmNvZGVjL21zczM0ZHNwLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpZm5kZWYgQVZDT0RFQ19NU1MzNERTUF9ICiAjZGVmaW5lIEFWQ09ERUNfTVNTMzREU1BfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIC8qKgpAQCAtNDAsNiArNDEsNiBAQAogICogQHBhcmFtIHN0cmlkZSAgb3V0cHV0IHBsYW5lIHN0cmlkZQogICogQHBhcmFtIGJsb2NrICAgYmxvY2sgdG8gdHJhbnNmb3JtIGFuZCBvdXRwdXQKICAqLwotdm9pZCBmZl9tc3MzNF9kY3RfcHV0KHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50ICpibG9jayk7Cit2b2lkIGZmX21zczM0X2RjdF9wdXQodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgKmJsb2NrKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfTVNTMzREU1BfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9tc3M0LmMgYi9saWJhdmNvZGVjL21zczQuYwppbmRleCA5NjM5ZmM4Li5iNThjMjFiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21zczQuYworKysgYi9saWJhdmNvZGVjL21zczQuYwpAQCAtMTM2LDcgKzEzNiw3IEBACiAgICAgdWludDE2X3QgICBxdWFudF9tYXRbMl1bNjRdOwogCiAgICAgaW50ICAgICAgICAqcHJldl9kY1szXTsKLSAgICBpbnQgICAgICAgIGRjX3N0cmlkZVszXTsKKyAgICBwdHJkaWZmX3QgIGRjX3N0cmlkZVszXTsKICAgICBpbnQgICAgICAgIGRjX2NhY2hlWzRdWzRdOwogCiAgICAgaW50ICAgICAgICBwcmV2X3ZlY1szXVs0XTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXN2aWRlbzEuYyBiL2xpYmF2Y29kZWMvbXN2aWRlbzEuYwppbmRleCA4OTE2NzVmLi5kZTA0OGQ4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL21zdmlkZW8xLmMKKysrIGIvbGliYXZjb2RlYy9tc3ZpZGVvMS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIE1pY3Jvc29mdCBWaWRlby0xIERlY29kZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMjQsNyArMjQsNiBAQAogICogTWljcm9zb2Z0IFZpZGVvLTEgRGVjb2RlciBieSBNaWtlIE1lbGFuc29uIChtZWxhbnNvbkBwY2lzeXMubmV0KQogICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIE1TIFZpZGVvLTEgZm9ybWF0LCB2aXNpdDoKICAqICAgaHR0cDovL3d3dy5wY2lzeXMubmV0L35tZWxhbnNvbi9jb2RlY3MvCi0gKgogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtNjMsNiArNjIsOSBAQAogCiAgICAgcy0+YXZjdHggPSBhdmN0eDsKIAorICAgIGlmIChhdmN0eC0+d2lkdGggPCA0IHx8IGF2Y3R4LT5oZWlnaHQgPCA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIC8qIGZpZ3VyZSBvdXQgdGhlIGNvbG9yc3BhY2UgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGEgcGFsZXR0ZSAqLwogICAgIGlmIChzLT5hdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDgpIHsKICAgICAgICAgcy0+bW9kZV84Yml0ID0gMTsKQEAgLTMwMiwxNSArMzA0LDI0IEBACiAgICAgcy0+YnVmID0gYnVmOwogICAgIHMtPnNpemUgPSBidWZfc2l6ZTsKIAorICAgIC8vIERpc2NhcmQgZnJhbWUgaWYgaXRzIHNtYWxsZXIgdGhhbiB0aGUgbWluaW11bSBmcmFtZSBzaXplCisgICAgaWYgKGJ1Zl9zaXplIDwgKGF2Y3R4LT53aWR0aC80KSAqIChhdmN0eC0+aGVpZ2h0LzQpIC8gNTEyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IGlzIHRvbyBzbWFsbFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmIChzLT5tb2RlXzhiaXQpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsICZzaXplKTsKIAotICAgICAgICBpZiAocGFsKSB7CisgICAgICAgIGlmIChwYWwgJiYgc2l6ZSA9PSBBVlBBTEVUVEVfU0laRSkgewogICAgICAgICAgICAgbWVtY3B5KHMtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CiAgICAgICAgICAgICBzLT5mcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAocGFsKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhbGV0dGUgc2l6ZSAlZCBpcyB3cm9uZ1xuIiwgc2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbXZjZGVjLmMgYi9saWJhdmNvZGVjL212Y2RlYy5jCmluZGV4IDc0ZjI3OWEuLmU1MDc2NzQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvbXZjZGVjLmMKKysrIGIvbGliYXZjb2RlYy9tdmNkZWMuYwpAQCAtMzEsNyArMzEsNiBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHR5cGVkZWYgc3RydWN0IE12Y0NvbnRleHQgewotICAgIEFWRnJhbWUgKmZyYW1lOwogICAgIGludCB2ZmxpcDsKIH0gTXZjQ29udGV4dDsKIApAQCAtNTMsMTAgKzUyLDYgQEAKIAogICAgIGF2Y3R4LT5waXhfZm10ID0gKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NVkMxKSA/IEFWX1BJWF9GTVRfUkdCNTU1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfUElYX0ZNVF9SR0IzMjsKLSAgICBzLT5mcmFtZSAgICAgICA9IGF2X2ZyYW1lX2FsbG9jKCk7Ci0gICAgaWYgKCFzLT5mcmFtZSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQogICAgIHMtPnZmbGlwID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDkgJiYKICAgICAgICAgICAgICAgICFtZW1jbXAoYXZjdHgtPmV4dHJhZGF0YSArIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIDksICJCb3R0b21VcCIsIDkpOwogICAgIHJldHVybiAwOwpAQCAtMjMxLDM5ICsyMjYsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCiB7CiAgICAgTXZjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOwogICAgIEdldEJ5dGVDb250ZXh0IGdiOwogICAgIGludCByZXQ7CiAKLSAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwogICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVZDMSkKLSAgICAgICAgcmV0ID0gZGVjb2RlX212YzEoYXZjdHgsICZnYiwgcy0+ZnJhbWUtPmRhdGFbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgcmV0ID0gZGVjb2RlX212YzEoYXZjdHgsICZnYiwgZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgZnJhbWUtPmxpbmVzaXplWzBdKTsKICAgICBlbHNlCi0gICAgICAgIHJldCA9IGRlY29kZV9tdmMyKGF2Y3R4LCAmZ2IsIHMtPmZyYW1lLT5kYXRhWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIHMtPmZyYW1lLT5saW5lc2l6ZVswXSwKKyAgICAgICAgcmV0ID0gZGVjb2RlX212YzIoYXZjdHgsICZnYiwgZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgZnJhbWUtPmxpbmVzaXplWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzLT52ZmxpcCk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKKyAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisKICAgICAqZ290X2ZyYW1lID0gMTsKLSAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5mcmFtZSkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKIH0KIAotc3RhdGljIGF2X2NvbGQgaW50IG12Y19kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBNdmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLQotICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKLQotICAgIHJldHVybiAwOwotfQotCiAjaWYgQ09ORklHX01WQzFfREVDT0RFUgogQVZDb2RlYyBmZl9tdmMxX2RlY29kZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gIm12YzEiLApAQCAtMjcyLDcgKzI2MCw2IEBACiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVZDMSwKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTXZjQ29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgID0gbXZjX2RlY29kZV9pbml0LAotICAgIC5jbG9zZSAgICAgICAgICA9IG12Y19kZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICA9IG12Y19kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKIH07CkBAIC0yODYsNyArMjczLDYgQEAKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NVkMyLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNdmNDb250ZXh0KSwKICAgICAuaW5pdCAgICAgICAgICAgPSBtdmNfZGVjb2RlX2luaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gbXZjX2RlY29kZV9lbmQsCiAgICAgLmRlY29kZSAgICAgICAgID0gbXZjX2RlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbmVsbHltb3Nlci5jIGIvbGliYXZjb2RlYy9uZWxseW1vc2VyLmMKaW5kZXggMDc0MGM3NS4uNWZmNjU4MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9uZWxseW1vc2VyLmMKKysrIGIvbGliYXZjb2RlYy9uZWxseW1vc2VyLmMKQEAgLTMxLDExICszMSwxMCBAQAogICogaW1wbGVtZW50b3JzLiBUaGUgb3JpZ2luYWwgY29kZSBpcyBhdmFpbGFibGUgZnJvbSBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvbmVsbHkycGNtLwogICovCiAKLSNpbmNsdWRlICJuZWxseW1vc2VyLmgiCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibmVsbHltb3Nlci5oIgogCiBjb25zdCBmbG9hdCBmZl9uZWxseV9kZXF1YW50aXphdGlvbl90YWJsZVsxMjddID0gewogIDAuMDAwMDAwMDAwMCwKQEAgLTg1LDcgKzg0LDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgc2lnbmVkX3NoaWZ0KGludCBpLCBpbnQgc2hpZnQpIHsKICAgICBpZiAoc2hpZnQgPiAwKQotICAgICAgICByZXR1cm4gaSA8PCBzaGlmdDsKKyAgICAgICAgcmV0dXJuICh1bnNpZ25lZClpIDw8IHNoaWZ0OwogICAgIHJldHVybiBpID4+IC1zaGlmdDsKIH0KIApAQCAtMTA5LDcgKzEwOCw3IEBACiAgICAgICAgIHJldHVybiAzMTsKICAgICB9CiAgICAgbCA9IDMwIC0gYXZfbG9nMihGRkFCUygqbGEpKTsKLSAgICAqbGEgPDw9IGw7CisgICAgKmxhICo9IDE8PGw7CiAgICAgcmV0dXJuIGw7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbmVsbHltb3NlcmRlYy5jIGIvbGliYXZjb2RlYy9uZWxseW1vc2VyZGVjLmMKaW5kZXggZTY2MjVjYi4uYjBkZWI3OSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9uZWxseW1vc2VyZGVjLmMKKysrIGIvbGliYXZjb2RlYy9uZWxseW1vc2VyZGVjLmMKQEAgLTM1LDE1ICszNSwxNSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJmZnQuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibmVsbHltb3Nlci5oIgogI2luY2x1ZGUgInNpbmV3aW4uaCIKIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKLQogCiB0eXBlZGVmIHN0cnVjdCBOZWxseU1vc2VyRGVjb2RlQ29udGV4dCB7CiAgICAgQVZDb2RlY0NvbnRleHQqIGF2Y3R4OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ub2lzZV9ic2YuYyBiL2xpYmF2Y29kZWMvbm9pc2VfYnNmLmMKaW5kZXggNTU2YWQ1Yy4uZDc5ZjYzYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9ub2lzZV9ic2YuYworKysgYi9saWJhdmNvZGVjL25vaXNlX2JzZi5jCkBAIC0yMiwzNCArMjIsNzIgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic2YuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogCit0eXBlZGVmIHN0cnVjdCBOb2lzZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBhbW91bnQ7CisgICAgaW50IGRyb3BhbW91bnQ7CisgICAgdW5zaWduZWQgaW50IHN0YXRlOworfSBOb2lzZUNvbnRleHQ7CiAKLXN0YXRpYyBpbnQgbm9pc2UoQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKmFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgaW50IGtleWZyYW1lKXsKLSAgICB1bnNpZ25lZCBpbnQgKnN0YXRlPSBic2ZjLT5wcml2X2RhdGE7Ci0gICAgaW50IGFtb3VudD0gYXJncyA/IGF0b2koYXJncykgOiAoKnN0YXRlICUgMTAwMDErMSk7Ci0gICAgaW50IGk7CitzdGF0aWMgaW50IG5vaXNlKEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIE5vaXNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBhbW91bnQgPSBzLT5hbW91bnQgPiAwID8gcy0+YW1vdW50IDogKHMtPnN0YXRlICUgMTAwMDEgKyAxKTsKKyAgICBpbnQgaSwgcmV0ID0gMDsKIAotICAgIGlmKGFtb3VudCA8PSAwKQorICAgIGlmIChhbW91bnQgPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIAotICAgICpwb3V0YnVmPSBhdl9tYWxsb2MoYnVmX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICBpZiAoISpwb3V0YnVmKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IGZmX2JzZl9nZXRfcGFja2V0X3JlZihjdHgsIHBrdCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICBtZW1jcHkoKnBvdXRidWYsIGJ1ZiwgYnVmX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICBmb3IoaT0wOyBpPGJ1Zl9zaXplOyBpKyspewotICAgICAgICAoKnN0YXRlKSArPSAoKnBvdXRidWYpW2ldICsgMTsKLSAgICAgICAgaWYoKnN0YXRlICUgYW1vdW50ID09IDApCi0gICAgICAgICAgICAoKnBvdXRidWYpW2ldID0gKnN0YXRlOworICAgIGlmIChzLT5kcm9wYW1vdW50ID4gMCAmJiBzLT5zdGF0ZSAlIHMtPmRyb3BhbW91bnQgPT0gMCkgeworICAgICAgICBzLT5zdGF0ZSsrOworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKICAgICB9Ci0gICAgcmV0dXJuIDE7CisKKyAgICByZXQgPSBhdl9wYWNrZXRfbWFrZV93cml0YWJsZShwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGt0LT5zaXplOyBpKyspIHsKKyAgICAgICAgcy0+c3RhdGUgKz0gcGt0LT5kYXRhW2ldICsgMTsKKyAgICAgICAgaWYgKHMtPnN0YXRlICUgYW1vdW50ID09IDApCisgICAgICAgICAgICBwa3QtPmRhdGFbaV0gPSBzLT5zdGF0ZTsKKyAgICB9CitmYWlsOgorICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKworICAgIHJldHVybiByZXQ7CiB9CiAKLUFWQml0U3RyZWFtRmlsdGVyIGZmX25vaXNlX2JzZj17CisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihOb2lzZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19CU0ZfUEFSQU0pCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImFtb3VudCIsIE5VTEwsIE9GRlNFVChhbW91bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJkcm9wYW1vdW50IiwgTlVMTCwgT0ZGU0VUKGRyb3BhbW91bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG5vaXNlX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm5vaXNlIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX25vaXNlX2JzZiA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibm9pc2UiLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihpbnQpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihOb2lzZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZub2lzZV9jbGFzcywKICAgICAuZmlsdGVyICAgICAgICAgPSBub2lzZSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL251bGxfYnNmLmMgYi9saWJhdmNvZGVjL251bGxfYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkMjZkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbnVsbF9ic2YuYwpAQCAtMCwwICsxLDM1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE51bGwgYml0c3RyZWFtIGZpbHRlciAtLSBwYXNzIHRoZSBpbnB1dCB0aHJvdWdoIHVuY2hhbmdlZC4KKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJzZi5oIgorCitzdGF0aWMgaW50IG51bGxfZmlsdGVyKEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIHJldHVybiBmZl9ic2ZfZ2V0X3BhY2tldF9yZWYoY3R4LCBwa3QpOworfQorCitjb25zdCBBVkJpdFN0cmVhbUZpbHRlciBmZl9udWxsX2JzZiA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibnVsbCIsCisgICAgLmZpbHRlciAgICAgICAgID0gbnVsbF9maWx0ZXIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9udXYuYyBiL2xpYmF2Y29kZWMvbnV2LmMKaW5kZXggYWRlMzMxMC4uMzJlZDY1OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9udXYuYworKysgYi9saWJhdmNvZGVjL251di5jCkBAIC0xNjEsNiArMTYxLDcgQEAKICAgICBpbnQgb3JpZ19zaXplICAgICAgPSBidWZfc2l6ZTsKICAgICBpbnQga2V5ZnJhbWUsIHJldDsKICAgICBpbnQgc2l6ZV9jaGFuZ2UgPSAwOworICAgIGludCBtaW5zaXplID0gMDsKICAgICBpbnQgcmVzdWx0LCBpbml0X2ZyYW1lID0gIWF2Y3R4LT5mcmFtZV9udW1iZXI7CiAgICAgZW51bSB7CiAgICAgICAgIE5VVl9VTkNPTVBSRVNTRUQgID0gJzAnLApAQCAtMTc5LDcgKzE4MCw3IEBACiAgICAgLy8gY29kZWMgZGF0YSAocnRqcGVnIHF1YW50IHRhYmxlcykKICAgICBpZiAoYnVmWzBdID09ICdEJyAmJiBidWZbMV0gPT0gJ1InKSB7CiAgICAgICAgIGludCByZXQ7Ci0gICAgICAgIC8vIHNraXAgcmVzdCBvZiB0aGUgZnJhbWVoZWFkZXIuCisgICAgICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lIGhlYWRlci4KICAgICAgICAgYnVmICAgICAgID0gJmJ1ZlsxMl07CiAgICAgICAgIGJ1Zl9zaXplIC09IDEyOwogICAgICAgICByZXQgICAgICAgPSBnZXRfcXVhbnQoYXZjdHgsIGMsIGJ1ZiwgYnVmX3NpemUpOwpAQCAtMTk4LDYgKzE5OSw5IEBACiAgICAgY2FzZSBOVVZfUlRKUEVHX0lOX0xaTzoKICAgICBjYXNlIE5VVl9SVEpQRUc6CiAgICAgICAgIGtleWZyYW1lID0gIWJ1ZlsyXTsKKyAgICAgICAgaWYgKGMtPndpZHRoIDwgMTYgfHwgYy0+aGVpZ2h0IDwgMTYpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTlVWX0NPUFlfTEFTVDoKICAgICAgICAga2V5ZnJhbWUgPSAwOwpAQCAtMjA2LDggKzIxMCwxOCBAQAogICAgICAgICBrZXlmcmFtZSA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBzd2l0Y2ggKGNvbXB0eXBlKSB7CisgICAgY2FzZSBOVVZfVU5DT01QUkVTU0VEOgorICAgICAgICBtaW5zaXplID0gYy0+d2lkdGggKiBjLT5oZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOVVZfUlRKUEVHOgorICAgICAgICBtaW5zaXplID0gYy0+d2lkdGgvMTYgKiAoYy0+aGVpZ2h0LzE2KSAqIDY7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYnVmX3NpemUgPCBtaW5zaXplIC8gNCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiByZXRyeToKLSAgICAvLyBza2lwIHJlc3Qgb2YgdGhlIGZyYW1laGVhZGVyLgorICAgIC8vIFNraXAgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lIGhlYWRlci4KICAgICBidWYgICAgICAgPSAmYnVmWzEyXTsKICAgICBidWZfc2l6ZSAtPSAxMjsKICAgICBpZiAoY29tcHR5cGUgPT0gTlVWX1JUSlBFR19JTl9MWk8gfHwgY29tcHR5cGUgPT0gTlVWX0xaTykgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9udmRlYy5jIGIvbGliYXZjb2RlYy9udmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiM2NiODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL252ZGVjLmMKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBIVyBkZWNvZGUgYWNjZWxlcmF0aW9uIHRocm91Z2ggTlZERUMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQW50b24gS2hpcm5vdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Vycm9yLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfY3VkYV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImRlY29kZS5oIgorI2luY2x1ZGUgIm52ZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTlZERUNEZWNvZGVyIHsKKyAgICBDVXZpZGVvZGVjb2RlciBkZWNvZGVyOworCisgICAgQVZCdWZmZXJSZWYgKmh3X2RldmljZV9yZWY7CisgICAgQ1Vjb250ZXh0ICAgIGN1ZGFfY3R4OworCisgICAgQ3VkYUZ1bmN0aW9ucyAqY3VkbDsKKyAgICBDdXZpZEZ1bmN0aW9ucyAqY3ZkbDsKK30gTlZERUNEZWNvZGVyOworCit0eXBlZGVmIHN0cnVjdCBOVkRFQ0ZyYW1lUG9vbCB7CisgICAgdW5zaWduZWQgaW50IGRwYl9zaXplOworICAgIHVuc2lnbmVkIGludCBuYl9hbGxvY2F0ZWQ7Cit9IE5WREVDRnJhbWVQb29sOworCitzdGF0aWMgaW50IG1hcF9hdmNvZGVjX2lkKGVudW0gQVZDb2RlY0lEIGlkKQoreworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6ICAgICAgIHJldHVybiBjdWRhVmlkZW9Db2RlY19IMjY0OworICAgIGNhc2UgQVZfQ09ERUNfSURfSEVWQzogICAgICAgcmV0dXJuIGN1ZGFWaWRlb0NvZGVjX0hFVkM7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NSlBFRzogICAgICByZXR1cm4gY3VkYVZpZGVvQ29kZWNfSlBFRzsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcxVklERU86IHJldHVybiBjdWRhVmlkZW9Db2RlY19NUEVHMTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86IHJldHVybiBjdWRhVmlkZW9Db2RlY19NUEVHMjsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OiAgICAgIHJldHVybiBjdWRhVmlkZW9Db2RlY19NUEVHNDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZDMTogICAgICAgIHJldHVybiBjdWRhVmlkZW9Db2RlY19WQzE7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDg6ICAgICAgICByZXR1cm4gY3VkYVZpZGVvQ29kZWNfVlA4OworICAgIGNhc2UgQVZfQ09ERUNfSURfVlA5OiAgICAgICAgcmV0dXJuIGN1ZGFWaWRlb0NvZGVjX1ZQOTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1dNVjM6ICAgICAgIHJldHVybiBjdWRhVmlkZW9Db2RlY19WQzE7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBtYXBfY2hyb21hX2Zvcm1hdChlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBpbnQgc2hpZnRfaCA9IDAsIHNoaWZ0X3YgPSAwOworCisgICAgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUocGl4X2ZtdCwgJnNoaWZ0X2gsICZzaGlmdF92KTsKKworICAgIGlmIChzaGlmdF9oID09IDEgJiYgc2hpZnRfdiA9PSAxKQorICAgICAgICByZXR1cm4gY3VkYVZpZGVvQ2hyb21hRm9ybWF0XzQyMDsKKyAgICBlbHNlIGlmIChzaGlmdF9oID09IDEgJiYgc2hpZnRfdiA9PSAwKQorICAgICAgICByZXR1cm4gY3VkYVZpZGVvQ2hyb21hRm9ybWF0XzQyMjsKKyAgICBlbHNlIGlmIChzaGlmdF9oID09IDAgJiYgc2hpZnRfdiA9PSAwKQorICAgICAgICByZXR1cm4gY3VkYVZpZGVvQ2hyb21hRm9ybWF0XzQ0NDsKKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIGludCBudmRlY190ZXN0X2NhcGFiaWxpdGllcyhOVkRFQ0RlY29kZXIgKmRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVVklEREVDT0RFQ1JFQVRFSU5GTyAqcGFyYW1zLCB2b2lkICpsb2djdHgpCit7CisgICAgQ1VyZXN1bHQgZXJyOworICAgIENVVklEREVDT0RFQ0FQUyBjYXBzID0geyAwIH07CisKKyAgICBjYXBzLmVDb2RlY1R5cGUgICAgICA9IHBhcmFtcy0+Q29kZWNUeXBlOworICAgIGNhcHMuZUNocm9tYUZvcm1hdCAgID0gcGFyYW1zLT5DaHJvbWFGb3JtYXQ7CisgICAgY2Fwcy5uQml0RGVwdGhNaW51czggPSBwYXJhbXMtPmJpdERlcHRoTWludXM4OworCisgICAgaWYgKCFkZWNvZGVyLT5jdmRsLT5jdXZpZEdldERlY29kZXJDYXBzKSB7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19XQVJOSU5HLCAiVXNlZCBOdmlkaWEgZHJpdmVyIGlzIHRvbyBvbGQgdG8gcGVyZm9ybSBhIGNhcGFiaWxpdHkgY2hlY2suXG4iKTsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGUgbWluaW11bSByZXF1aXJlZCB2ZXJzaW9uIGlzICIKKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorICAgICAgICAgICAgIjM3OC42NiIKKyNlbHNlCisgICAgICAgICAgICAiMzc4LjEzIgorI2VuZGlmCisgICAgICAgICAgICAiLiBDb250aW51aW5nIGJsaW5kLlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGVyciA9IGRlY29kZXItPmN2ZGwtPmN1dmlkR2V0RGVjb2RlckNhcHMoJmNhcHMpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCBxdWVyeWluZyBkZWNvZGVyIGNhcGFiaWxpdGllc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1ZFUkJPU0UsICJOVkRFQyBjYXBhYmlsaXRpZXM6XG4iKTsKKyAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfVkVSQk9TRSwgImZvcm1hdCBzdXBwb3J0ZWQ6ICVzLCBtYXhfbWJfY291bnQ6ICVkXG4iLAorICAgICAgICAgICBjYXBzLmJJc1N1cHBvcnRlZCA/ICJ5ZXMiIDogIm5vIiwgY2Fwcy5uTWF4TUJDb3VudCk7CisgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1ZFUkJPU0UsICJtaW5fd2lkdGg6ICVkLCBtYXhfd2lkdGg6ICVkXG4iLAorICAgICAgICAgICBjYXBzLm5NaW5XaWR0aCwgY2Fwcy5uTWF4V2lkdGgpOworICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19WRVJCT1NFLCAibWluX2hlaWdodDogJWQsIG1heF9oZWlnaHQ6ICVkXG4iLAorICAgICAgICAgICBjYXBzLm5NaW5IZWlnaHQsIGNhcHMubk1heEhlaWdodCk7CisKKyAgICBpZiAoIWNhcHMuYklzU3VwcG9ydGVkKSB7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgIkhhcmR3YXJlIGlzIGxhY2tpbmcgcmVxdWlyZWQgY2FwYWJpbGl0aWVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAocGFyYW1zLT51bFdpZHRoID4gY2Fwcy5uTWF4V2lkdGggfHwgcGFyYW1zLT51bFdpZHRoIDwgY2Fwcy5uTWluV2lkdGgpIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLCAiVmlkZW8gd2lkdGggJWQgbm90IHdpdGhpbiByYW5nZSBmcm9tICVkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgKGludClwYXJhbXMtPnVsV2lkdGgsIGNhcHMubk1pbldpZHRoLCBjYXBzLm5NYXhXaWR0aCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHBhcmFtcy0+dWxIZWlnaHQgPiBjYXBzLm5NYXhIZWlnaHQgfHwgcGFyYW1zLT51bEhlaWdodCA8IGNhcHMubk1pbkhlaWdodCkgeworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJWaWRlbyBoZWlnaHQgJWQgbm90IHdpdGhpbiByYW5nZSBmcm9tICVkIHRvICVkXG4iLAorICAgICAgICAgICAgICAgKGludClwYXJhbXMtPnVsSGVpZ2h0LCBjYXBzLm5NaW5IZWlnaHQsIGNhcHMubk1heEhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKChwYXJhbXMtPnVsV2lkdGggKiBwYXJhbXMtPnVsSGVpZ2h0KSAvIDI1NiA+IGNhcHMubk1heE1CQ291bnQpIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLCAiVmlkZW8gbWFjcm9ibG9jayBjb3VudCAlZCBleGNlZWRzIG1heGltdW0gb2YgJWRcbiIsCisgICAgICAgICAgICAgICAoaW50KShwYXJhbXMtPnVsV2lkdGggKiBwYXJhbXMtPnVsSGVpZ2h0KSAvIDI1NiwgY2Fwcy5uTWF4TUJDb3VudCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG52ZGVjX2RlY29kZXJfZnJlZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgTlZERUNEZWNvZGVyICpkZWNvZGVyID0gKE5WREVDRGVjb2RlciopZGF0YTsKKworICAgIGlmIChkZWNvZGVyLT5kZWNvZGVyKQorICAgICAgICBkZWNvZGVyLT5jdmRsLT5jdXZpZERlc3Ryb3lEZWNvZGVyKGRlY29kZXItPmRlY29kZXIpOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZkZWNvZGVyLT5od19kZXZpY2VfcmVmKTsKKworICAgIGN1dmlkX2ZyZWVfZnVuY3Rpb25zKCZkZWNvZGVyLT5jdmRsKTsKKworICAgIGF2X2ZyZWVwKCZkZWNvZGVyKTsKK30KKworc3RhdGljIGludCBudmRlY19kZWNvZGVyX2NyZWF0ZShBVkJ1ZmZlclJlZiAqKm91dCwgQVZCdWZmZXJSZWYgKmh3X2RldmljZV9yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENVVklEREVDT0RFQ1JFQVRFSU5GTyAqcGFyYW1zLCB2b2lkICpsb2djdHgpCit7CisgICAgQVZIV0RldmljZUNvbnRleHQgICpod19kZXZpY2VfY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0Kilod19kZXZpY2VfcmVmLT5kYXRhOworICAgIEFWQ1VEQURldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGh3X2RldmljZV9jdHgtPmh3Y3R4OworCisgICAgQVZCdWZmZXJSZWYgKmRlY29kZXJfcmVmOworICAgIE5WREVDRGVjb2RlciAqZGVjb2RlcjsKKworICAgIENVY29udGV4dCBkdW1teTsKKyAgICBDVXJlc3VsdCBlcnI7CisgICAgaW50IHJldDsKKworICAgIGRlY29kZXIgPSBhdl9tYWxsb2N6KHNpemVvZigqZGVjb2RlcikpOworICAgIGlmICghZGVjb2RlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGRlY29kZXJfcmVmID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCopZGVjb2Rlciwgc2l6ZW9mKCpkZWNvZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnZkZWNfZGVjb2Rlcl9mcmVlLCBOVUxMLCBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7CisgICAgaWYgKCFkZWNvZGVyX3JlZikgeworICAgICAgICBhdl9mcmVlcCgmZGVjb2Rlcik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZGVjb2Rlci0+aHdfZGV2aWNlX3JlZiA9IGF2X2J1ZmZlcl9yZWYoaHdfZGV2aWNlX3JlZik7CisgICAgaWYgKCFkZWNvZGVyLT5od19kZXZpY2VfcmVmKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBkZWNvZGVyLT5jdWRhX2N0eCA9IGRldmljZV9od2N0eC0+Y3VkYV9jdHg7CisgICAgZGVjb2Rlci0+Y3VkbCA9IGRldmljZV9od2N0eC0+aW50ZXJuYWwtPmN1ZGFfZGw7CisKKyAgICByZXQgPSBjdXZpZF9sb2FkX2Z1bmN0aW9ucygmZGVjb2Rlci0+Y3ZkbCwgbG9nY3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgbG9hZGluZyBudmN1dmlkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBkZWNvZGVyLT5jdWRsLT5jdUN0eFB1c2hDdXJyZW50KGRlY29kZXItPmN1ZGFfY3R4KTsKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBudmRlY190ZXN0X2NhcGFiaWxpdGllcyhkZWNvZGVyLCBwYXJhbXMsIGxvZ2N0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZGVjb2Rlci0+Y3VkbC0+Y3VDdHhQb3BDdXJyZW50KCZkdW1teSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBkZWNvZGVyLT5jdmRsLT5jdXZpZENyZWF0ZURlY29kZXIoJmRlY29kZXItPmRlY29kZXIsIHBhcmFtcyk7CisKKyAgICBkZWNvZGVyLT5jdWRsLT5jdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKKworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGNyZWF0aW5nIGEgTlZERUMgZGVjb2RlcjogJWRcbiIsIGVycik7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgICpvdXQgPSBkZWNvZGVyX3JlZjsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9idWZmZXJfdW5yZWYoJmRlY29kZXJfcmVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgQVZCdWZmZXJSZWYgKm52ZGVjX2RlY29kZXJfZnJhbWVfYWxsb2Modm9pZCAqb3BhcXVlLCBpbnQgc2l6ZSkKK3sKKyAgICBOVkRFQ0ZyYW1lUG9vbCAqcG9vbCA9IG9wYXF1ZTsKKyAgICBBVkJ1ZmZlclJlZiAqcmV0OworCisgICAgaWYgKHBvb2wtPm5iX2FsbG9jYXRlZCA+PSBwb29sLT5kcGJfc2l6ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXQgPSBhdl9idWZmZXJfYWxsb2Moc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICoodW5zaWduZWQgaW50KilyZXQtPmRhdGEgPSBwb29sLT5uYl9hbGxvY2F0ZWQrKzsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9udmRlY19kZWNvZGVfdW5pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBOVkRFQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5iaXRzdHJlYW0pOworICAgIGN0eC0+Yml0c3RyZWFtX2xlbiAgICAgICA9IDA7CisgICAgY3R4LT5iaXRzdHJlYW1fYWxsb2NhdGVkID0gMDsKKworICAgIGF2X2ZyZWVwKCZjdHgtPnNsaWNlX29mZnNldHMpOworICAgIGN0eC0+bmJfc2xpY2VzICAgICAgICAgICAgICAgPSAwOworICAgIGN0eC0+c2xpY2Vfb2Zmc2V0c19hbGxvY2F0ZWQgPSAwOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPmRlY29kZXJfcmVmKTsKKyAgICBhdl9idWZmZXJfcG9vbF91bmluaXQoJmN0eC0+ZGVjb2Rlcl9wb29sKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfbnZkZWNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE5WREVDQ29udGV4dCAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKworICAgIE5WREVDRnJhbWVQb29sICAgICAgKnBvb2w7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAqZnJhbWVzX2N0eDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnN3X2Rlc2M7CisKKyAgICBDVVZJRERFQ09ERUNSRUFURUlORk8gcGFyYW1zID0geyAwIH07CisKKyAgICBpbnQgY3V2aWRfY29kZWNfdHlwZSwgY3V2aWRfY2hyb21hX2Zvcm1hdDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHN3X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5zd19waXhfZm10KTsKKyAgICBpZiAoIXN3X2Rlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKworICAgIGN1dmlkX2NvZGVjX3R5cGUgPSBtYXBfYXZjb2RlY19pZChhdmN0eC0+Y29kZWNfaWQpOworICAgIGlmIChjdXZpZF9jb2RlY190eXBlIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjIElEXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIH0KKworICAgIGN1dmlkX2Nocm9tYV9mb3JtYXQgPSBtYXBfY2hyb21hX2Zvcm1hdChhdmN0eC0+c3dfcGl4X2ZtdCk7CisgICAgaWYgKGN1dmlkX2Nocm9tYV9mb3JtYXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY2hyb21hIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgaWYgKCFhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICByZXQgPSBmZl9kZWNvZGVfZ2V0X2h3X2ZyYW1lc19jdHgoYXZjdHgsIEFWX0hXREVWSUNFX1RZUEVfQ1VEQSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilhdmN0eC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKworICAgIHBhcmFtcy51bFdpZHRoICAgICAgICAgICAgID0gYXZjdHgtPmNvZGVkX3dpZHRoOworICAgIHBhcmFtcy51bEhlaWdodCAgICAgICAgICAgID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBwYXJhbXMudWxUYXJnZXRXaWR0aCAgICAgICA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICBwYXJhbXMudWxUYXJnZXRIZWlnaHQgICAgICA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisgICAgcGFyYW1zLmJpdERlcHRoTWludXM4ICAgICAgPSBzd19kZXNjLT5jb21wWzBdLmRlcHRoIC0gODsKKyAgICBwYXJhbXMuT3V0cHV0Rm9ybWF0ICAgICAgICA9IHBhcmFtcy5iaXREZXB0aE1pbnVzOCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdWRhVmlkZW9TdXJmYWNlRm9ybWF0X1AwMTYgOiBjdWRhVmlkZW9TdXJmYWNlRm9ybWF0X05WMTI7CisgICAgcGFyYW1zLkNvZGVjVHlwZSAgICAgICAgICAgPSBjdXZpZF9jb2RlY190eXBlOworICAgIHBhcmFtcy5DaHJvbWFGb3JtYXQgICAgICAgID0gY3V2aWRfY2hyb21hX2Zvcm1hdDsKKyAgICBwYXJhbXMudWxOdW1EZWNvZGVTdXJmYWNlcyA9IGZyYW1lc19jdHgtPmluaXRpYWxfcG9vbF9zaXplOworICAgIHBhcmFtcy51bE51bU91dHB1dFN1cmZhY2VzID0gMTsKKworICAgIHJldCA9IG52ZGVjX2RlY29kZXJfY3JlYXRlKCZjdHgtPmRlY29kZXJfcmVmLCBmcmFtZXNfY3R4LT5kZXZpY2VfcmVmLCAmcGFyYW1zLCBhdmN0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKHBhcmFtcy51bE51bURlY29kZVN1cmZhY2VzID4gMzIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVc2luZyBtb3JlIHRoYW4gMzIgKCVkKSBkZWNvZGUgc3VyZmFjZXMgbWlnaHQgY2F1c2UgbnZkZWMgdG8gZmFpbC5cbiIsCisgICAgICAgICAgICAgICAgICAgKGludClwYXJhbXMudWxOdW1EZWNvZGVTdXJmYWNlcyk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVHJ5IGxvd2VyaW5nIHRoZSBhbW91bnQgb2YgdGhyZWFkcy4gVXNpbmcgJWQgcmlnaHQgbm93LlxuIiwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+dGhyZWFkX2NvdW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHBvb2wgPSBhdl9tYWxsb2N6KHNpemVvZigqcG9vbCkpOworICAgIGlmICghcG9vbCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcG9vbC0+ZHBiX3NpemUgPSBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZTsKKworICAgIGN0eC0+ZGVjb2Rlcl9wb29sID0gYXZfYnVmZmVyX3Bvb2xfaW5pdDIoc2l6ZW9mKGludCksIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudmRlY19kZWNvZGVyX2ZyYW1lX2FsbG9jLCBhdl9mcmVlKTsKKyAgICBpZiAoIWN0eC0+ZGVjb2Rlcl9wb29sKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmZl9udmRlY19kZWNvZGVfdW5pbml0KGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBudmRlY19mZGRfcHJpdl9mcmVlKHZvaWQgKnByaXYpCit7CisgICAgTlZERUNGcmFtZSAqY2YgPSBwcml2OworCisgICAgaWYgKCFjZikKKyAgICAgICAgcmV0dXJuOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZjZi0+aWR4X3JlZik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZjZi0+ZGVjb2Rlcl9yZWYpOworCisgICAgYXZfZnJlZXAoJnByaXYpOworfQorCitzdGF0aWMgaW50IG52ZGVjX3JldHJpZXZlX2RhdGEodm9pZCAqbG9nY3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBGcmFtZURlY29kZURhdGEgICpmZGQgPSAoRnJhbWVEZWNvZGVEYXRhKilmcmFtZS0+cHJpdmF0ZV9yZWYtPmRhdGE7CisgICAgTlZERUNGcmFtZSAgICAgICAgKmNmID0gKE5WREVDRnJhbWUqKWZkZC0+aHdhY2NlbF9wcml2OworICAgIE5WREVDRGVjb2RlciAqZGVjb2RlciA9IChOVkRFQ0RlY29kZXIqKWNmLT5kZWNvZGVyX3JlZi0+ZGF0YTsKKworICAgIENVVklEUFJPQ1BBUkFNUyB2cHAgPSB7IC5wcm9ncmVzc2l2ZV9mcmFtZSA9IDEgfTsKKworICAgIENVcmVzdWx0IGVycjsKKyAgICBDVWNvbnRleHQgZHVtbXk7CisgICAgQ1VkZXZpY2VwdHIgZGV2cHRyOworCisgICAgdW5zaWduZWQgaW50IHBpdGNoLCBpOworICAgIHVuc2lnbmVkIGludCBvZmZzZXQgPSAwOworICAgIGludCByZXQgPSAwOworCisgICAgZXJyID0gZGVjb2Rlci0+Y3VkbC0+Y3VDdHhQdXNoQ3VycmVudChkZWNvZGVyLT5jdWRhX2N0eCk7CisgICAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisKKyAgICBlcnIgPSBkZWNvZGVyLT5jdmRsLT5jdXZpZE1hcFZpZGVvRnJhbWUoZGVjb2Rlci0+ZGVjb2RlciwgY2YtPmlkeCwgJmRldnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpdGNoLCAmdnBwKTsKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBtYXBwaW5nIGEgcGljdHVyZSB3aXRoIENVVklEOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgZnJhbWUtPmRhdGFbaV07IGkrKykgeworICAgICAgICBDVURBX01FTUNQWTJEIGNweSA9IHsKKyAgICAgICAgICAgIC5zcmNNZW1vcnlUeXBlID0gQ1VfTUVNT1JZVFlQRV9ERVZJQ0UsCisgICAgICAgICAgICAuZHN0TWVtb3J5VHlwZSA9IENVX01FTU9SWVRZUEVfREVWSUNFLAorICAgICAgICAgICAgLnNyY0RldmljZSAgICAgPSBkZXZwdHIsCisgICAgICAgICAgICAuZHN0RGV2aWNlICAgICA9IChDVWRldmljZXB0cilmcmFtZS0+ZGF0YVtpXSwKKyAgICAgICAgICAgIC5zcmNQaXRjaCAgICAgID0gcGl0Y2gsCisgICAgICAgICAgICAuZHN0UGl0Y2ggICAgICA9IGZyYW1lLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgIC5zcmNZICAgICAgICAgID0gb2Zmc2V0LAorICAgICAgICAgICAgLldpZHRoSW5CeXRlcyAgPSBGRk1JTihwaXRjaCwgZnJhbWUtPmxpbmVzaXplW2ldKSwKKyAgICAgICAgICAgIC5IZWlnaHQgICAgICAgID0gZnJhbWUtPmhlaWdodCA+PiAoaSA/IDEgOiAwKSwKKyAgICAgICAgfTsKKworICAgICAgICBlcnIgPSBkZWNvZGVyLT5jdWRsLT5jdU1lbWNweTJEKCZjcHkpOworICAgICAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY29weWluZyBkZWNvZGVkIGZyYW1lOiAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgZ290byBjb3B5X2ZhaWw7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgKz0gY3B5LkhlaWdodDsKKyAgICB9CisKK2NvcHlfZmFpbDoKKyAgICBkZWNvZGVyLT5jdmRsLT5jdXZpZFVubWFwVmlkZW9GcmFtZShkZWNvZGVyLT5kZWNvZGVyLCBkZXZwdHIpOworCitmaW5pc2g6CisgICAgZGVjb2Rlci0+Y3VkbC0+Y3VDdHhQb3BDdXJyZW50KCZkdW1teSk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX252ZGVjX3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgTlZERUNDb250ZXh0ICpjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIEZyYW1lRGVjb2RlRGF0YSAqZmRkID0gKEZyYW1lRGVjb2RlRGF0YSopZnJhbWUtPnByaXZhdGVfcmVmLT5kYXRhOworICAgIE5WREVDRnJhbWUgKmNmID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgY3R4LT5iaXRzdHJlYW1fbGVuID0gMDsKKyAgICBjdHgtPm5iX3NsaWNlcyAgICAgPSAwOworCisgICAgaWYgKGZkZC0+aHdhY2NlbF9wcml2KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNmID0gYXZfbWFsbG9jeihzaXplb2YoKmNmKSk7CisgICAgaWYgKCFjZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGNmLT5kZWNvZGVyX3JlZiA9IGF2X2J1ZmZlcl9yZWYoY3R4LT5kZWNvZGVyX3JlZik7CisgICAgaWYgKCFjZi0+ZGVjb2Rlcl9yZWYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY2YtPmlkeF9yZWYgPSBhdl9idWZmZXJfcG9vbF9nZXQoY3R4LT5kZWNvZGVyX3Bvb2wpOworICAgIGlmICghY2YtPmlkeF9yZWYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBkZWNvZGVyIHN1cmZhY2VzIGxlZnRcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgY2YtPmlkeCA9ICoodW5zaWduZWQgaW50KiljZi0+aWR4X3JlZi0+ZGF0YTsKKworICAgIGZkZC0+aHdhY2NlbF9wcml2ICAgICAgPSBjZjsKKyAgICBmZGQtPmh3YWNjZWxfcHJpdl9mcmVlID0gbnZkZWNfZmRkX3ByaXZfZnJlZTsKKyAgICBmZGQtPnBvc3RfcHJvY2VzcyAgICAgID0gbnZkZWNfcmV0cmlldmVfZGF0YTsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBudmRlY19mZGRfcHJpdl9mcmVlKGNmKTsKKyAgICByZXR1cm4gcmV0OworCit9CisKK2ludCBmZl9udmRlY19lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE5WREVDQ29udGV4dCAgICAgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgTlZERUNEZWNvZGVyICpkZWNvZGVyID0gKE5WREVDRGVjb2RlciopY3R4LT5kZWNvZGVyX3JlZi0+ZGF0YTsKKyAgICBDVVZJRFBJQ1BBUkFNUyAgICAqcHAgPSAmY3R4LT5waWNfcGFyYW1zOworCisgICAgQ1VyZXN1bHQgZXJyOworICAgIENVY29udGV4dCBkdW1teTsKKworICAgIGludCByZXQgPSAwOworCisgICAgcHAtPm5CaXRzdHJlYW1EYXRhTGVuID0gY3R4LT5iaXRzdHJlYW1fbGVuOworICAgIHBwLT5wQml0c3RyZWFtRGF0YSAgICA9IGN0eC0+Yml0c3RyZWFtOworICAgIHBwLT5uTnVtU2xpY2VzICAgICAgICA9IGN0eC0+bmJfc2xpY2VzOworICAgIHBwLT5wU2xpY2VEYXRhT2Zmc2V0cyA9IGN0eC0+c2xpY2Vfb2Zmc2V0czsKKworICAgIGVyciA9IGRlY29kZXItPmN1ZGwtPmN1Q3R4UHVzaEN1cnJlbnQoZGVjb2Rlci0+Y3VkYV9jdHgpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworCisgICAgZXJyID0gZGVjb2Rlci0+Y3ZkbC0+Y3V2aWREZWNvZGVQaWN0dXJlKGRlY29kZXItPmRlY29kZXIsICZjdHgtPnBpY19wYXJhbXMpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZGVjb2RpbmcgYSBwaWN0dXJlIHdpdGggTlZERUM6ICVkXG4iLAorICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9CisKK2ZpbmlzaDoKKyAgICBkZWNvZGVyLT5jdWRsLT5jdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9udmRlY19zaW1wbGVfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBOVkRFQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgaW50IHJldCA9IGZmX252ZGVjX2VuZF9mcmFtZShhdmN0eCk7CisgICAgY3R4LT5iaXRzdHJlYW0gPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9udmRlY19zaW1wbGVfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBOVkRFQ0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgdm9pZCAqdG1wOworCisgICAgdG1wID0gYXZfZmFzdF9yZWFsbG9jKGN0eC0+c2xpY2Vfb2Zmc2V0cywgJmN0eC0+c2xpY2Vfb2Zmc2V0c19hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjdHgtPm5iX3NsaWNlcyArIDEpICogc2l6ZW9mKCpjdHgtPnNsaWNlX29mZnNldHMpKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjdHgtPnNsaWNlX29mZnNldHMgPSB0bXA7CisKKyAgICBpZiAoIWN0eC0+Yml0c3RyZWFtKQorICAgICAgICBjdHgtPmJpdHN0cmVhbSA9ICh1aW50OF90KilidWZmZXI7CisKKyAgICBjdHgtPnNsaWNlX29mZnNldHNbY3R4LT5uYl9zbGljZXNdID0gYnVmZmVyIC0gY3R4LT5iaXRzdHJlYW07CisgICAgY3R4LT5iaXRzdHJlYW1fbGVuICs9IHNpemU7CisgICAgY3R4LT5uYl9zbGljZXMrKzsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfbnZkZWNfZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkcGJfc2l6ZSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopaHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnN3X2Rlc2M7CisgICAgaW50IGN1dmlkX2NvZGVjX3R5cGUsIGN1dmlkX2Nocm9tYV9mb3JtYXQ7CisKKyAgICBzd19kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+c3dfcGl4X2ZtdCk7CisgICAgaWYgKCFzd19kZXNjKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisKKyAgICBjdXZpZF9jb2RlY190eXBlID0gbWFwX2F2Y29kZWNfaWQoYXZjdHgtPmNvZGVjX2lkKTsKKyAgICBpZiAoY3V2aWRfY29kZWNfdHlwZSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2RlYyBJRFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisKKyAgICBjdXZpZF9jaHJvbWFfZm9ybWF0ID0gbWFwX2Nocm9tYV9mb3JtYXQoYXZjdHgtPnN3X3BpeF9mbXQpOworICAgIGlmIChjdXZpZF9jaHJvbWFfZm9ybWF0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiVW5zdXBwb3J0ZWQgY2hyb21hIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZnJhbWVzX2N0eC0+Zm9ybWF0ICAgICAgICAgICAgPSBBVl9QSVhfRk1UX0NVREE7CisgICAgZnJhbWVzX2N0eC0+d2lkdGggICAgICAgICAgICAgPSAoYXZjdHgtPmNvZGVkX3dpZHRoICsgMSkgJiB+MTsKKyAgICBmcmFtZXNfY3R4LT5oZWlnaHQgICAgICAgICAgICA9IChhdmN0eC0+Y29kZWRfaGVpZ2h0ICsgMSkgJiB+MTsKKyAgICBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSA9IGRwYl9zaXplOworCisgICAgc3dpdGNoIChzd19kZXNjLT5jb21wWzBdLmRlcHRoKSB7CisgICAgY2FzZSA4OgorICAgICAgICBmcmFtZXNfY3R4LT5zd19mb3JtYXQgPSBBVl9QSVhfRk1UX05WMTI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTA6CisgICAgICAgIGZyYW1lc19jdHgtPnN3X2Zvcm1hdCA9IEFWX1BJWF9GTVRfUDAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjoKKyAgICAgICAgZnJhbWVzX2N0eC0+c3dfZm9ybWF0ID0gQVZfUElYX0ZNVF9QMDE2OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfbnZkZWNfZ2V0X3JlZl9pZHgoQVZGcmFtZSAqZnJhbWUpCit7CisgICAgRnJhbWVEZWNvZGVEYXRhICpmZGQ7CisgICAgTlZERUNGcmFtZSAqY2Y7CisKKyAgICBpZiAoIWZyYW1lIHx8ICFmcmFtZS0+cHJpdmF0ZV9yZWYpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZkZCA9IChGcmFtZURlY29kZURhdGEqKWZyYW1lLT5wcml2YXRlX3JlZi0+ZGF0YTsKKyAgICBjZiAgPSAoTlZERUNGcmFtZSopZmRkLT5od2FjY2VsX3ByaXY7CisgICAgaWYgKCFjZikKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIGNmLT5pZHg7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL252ZGVjLmggYi9saWJhdmNvZGVjL252ZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhMGZjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbnZkZWMuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogSFcgZGVjb2RlIGFjY2VsZXJhdGlvbiB0aHJvdWdoIE5WREVDCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEFudG9uIEtoaXJub3YKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX05WREVDX0gKKyNkZWZpbmUgQVZDT0RFQ19OVkRFQ19ICisKKyNpbmNsdWRlICJjb21wYXQvY3VkYS9keW5saW5rX2xvYWRlci5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKKyNpZiBkZWZpbmVkKE5WREVDQVBJX01BSk9SX1ZFUlNJT04pICYmIGRlZmluZWQoTlZERUNBUElfTUlOT1JfVkVSU0lPTikKKyMgZGVmaW5lIE5WREVDQVBJX0NIRUNLX1ZFUlNJT04obWFqb3IsIG1pbm9yKSBcCisgICAgKChtYWpvcikgPCBOVkRFQ0FQSV9NQUpPUl9WRVJTSU9OIHx8ICgobWFqb3IpID09IE5WREVDQVBJX01BSk9SX1ZFUlNJT04gJiYgKG1pbm9yKSA8PSBOVkRFQ0FQSV9NSU5PUl9WRVJTSU9OKSkKKyNlbHNlCisvKiB2ZXJzaW9uIG1hY3JvcyB3ZXJlIGFkZGVkIGluIFNESyA4LjEgZmZudmNvZGVjICovCisjIGRlZmluZSBOVkRFQ0FQSV9DSEVDS19WRVJTSU9OKG1ham9yLCBtaW5vcikgXAorICAgICgobWFqb3IpIDwgOCB8fCAoKG1ham9yKSA9PSA4ICYmIChtaW5vcikgPD0gMCkpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgTlZERUNGcmFtZSB7CisgICAgdW5zaWduZWQgaW50IGlkeDsKKyAgICBBVkJ1ZmZlclJlZiAqaWR4X3JlZjsKKyAgICBBVkJ1ZmZlclJlZiAqZGVjb2Rlcl9yZWY7Cit9IE5WREVDRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IE5WREVDQ29udGV4dCB7CisgICAgQ1VWSURQSUNQQVJBTVMgcGljX3BhcmFtczsKKworICAgIEFWQnVmZmVyUG9vbCAqZGVjb2Rlcl9wb29sOworCisgICAgQVZCdWZmZXJSZWYgICpkZWNvZGVyX3JlZjsKKworICAgIHVpbnQ4X3QgICAgICAqYml0c3RyZWFtOworICAgIGludCAgICAgICAgICAgYml0c3RyZWFtX2xlbjsKKyAgICB1bnNpZ25lZCBpbnQgIGJpdHN0cmVhbV9hbGxvY2F0ZWQ7CisKKyAgICB1bnNpZ25lZCAgICAgKnNsaWNlX29mZnNldHM7CisgICAgaW50ICAgICAgICAgICBuYl9zbGljZXM7CisgICAgdW5zaWduZWQgaW50ICBzbGljZV9vZmZzZXRzX2FsbG9jYXRlZDsKK30gTlZERUNDb250ZXh0OworCitpbnQgZmZfbnZkZWNfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK2ludCBmZl9udmRlY19kZWNvZGVfdW5pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitpbnQgZmZfbnZkZWNfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSk7CitpbnQgZmZfbnZkZWNfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitpbnQgZmZfbnZkZWNfc2ltcGxlX2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX252ZGVjX3NpbXBsZV9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKTsKK2ludCBmZl9udmRlY19mcmFtZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRwYl9zaXplKTsKK2ludCBmZl9udmRlY19nZXRfcmVmX2lkeChBVkZyYW1lICpmcmFtZSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX05WREVDX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbnZkZWNfaDI2NC5jIGIvbGliYXZjb2RlYy9udmRlY19oMjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViMzAzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbnZkZWNfaDI2NC5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogTVBFRy00IFBhcnQgMTAgLyBBVkMgLyBILjI2NCBIVyBkZWNvZGUgYWNjZWxlcmF0aW9uIHRocm91Z2ggTlZERUMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQW50b24gS2hpcm5vdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAibnZkZWMuaCIKKyNpbmNsdWRlICJkZWNvZGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImgyNjRkZWMuaCIKKworc3RhdGljIHZvaWQgZHBiX2FkZChjb25zdCBIMjY0Q29udGV4dCAqaCwgQ1VWSURIMjY0RFBCRU5UUlkgKmRzdCwgY29uc3QgSDI2NFBpY3R1cmUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX2lkeCkKK3sKKyAgICBGcmFtZURlY29kZURhdGEgKmZkZCA9IChGcmFtZURlY29kZURhdGEqKXNyYy0+Zi0+cHJpdmF0ZV9yZWYtPmRhdGE7CisgICAgY29uc3QgTlZERUNGcmFtZSAqY2YgPSBmZGQtPmh3YWNjZWxfcHJpdjsKKworICAgIGRzdC0+UGljSWR4ICAgICAgICAgICAgID0gY2YgPyBjZi0+aWR4IDogLTE7CisgICAgZHN0LT5GcmFtZUlkeCAgICAgICAgICAgPSBmcmFtZV9pZHg7CisgICAgZHN0LT5pc19sb25nX3Rlcm0gICAgICAgPSBzcmMtPmxvbmdfcmVmOworICAgIGRzdC0+bm90X2V4aXN0aW5nICAgICAgID0gMDsKKyAgICBkc3QtPnVzZWRfZm9yX3JlZmVyZW5jZSA9IHNyYy0+cmVmZXJlbmNlICYgMzsKKyAgICBkc3QtPkZpZWxkT3JkZXJDbnRbMF0gICA9IHNyYy0+ZmllbGRfcG9jWzBdOworICAgIGRzdC0+RmllbGRPcmRlckNudFsxXSAgID0gc3JjLT5maWVsZF9wb2NbMV07Cit9CisKK3N0YXRpYyBpbnQgbnZkZWNfaDI2NF9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQoreworICAgIGNvbnN0IEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBQUFMgKnBwcyA9IGgtPnBzLnBwczsKKyAgICBjb25zdCBTUFMgKnNwcyA9IGgtPnBzLnNwczsKKworICAgIE5WREVDQ29udGV4dCAgICAgICAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBDVVZJRFBJQ1BBUkFNUyAgICAgICpwcCA9ICZjdHgtPnBpY19wYXJhbXM7CisgICAgQ1VWSURIMjY0UElDUEFSQU1TICpwcGMgPSAmcHAtPkNvZGVjU3BlY2lmaWMuaDI2NDsKKyAgICBGcmFtZURlY29kZURhdGEgKmZkZDsKKyAgICBOVkRFQ0ZyYW1lICpjZjsKKworICAgIGludCBpLCBkcGJfc2l6ZSwgcmV0OworCisgICAgcmV0ID0gZmZfbnZkZWNfc3RhcnRfZnJhbWUoYXZjdHgsIGgtPmN1cl9waWNfcHRyLT5mKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZkZCA9IChGcmFtZURlY29kZURhdGEqKWgtPmN1cl9waWNfcHRyLT5mLT5wcml2YXRlX3JlZi0+ZGF0YTsKKyAgICBjZiAgPSAoTlZERUNGcmFtZSopZmRkLT5od2FjY2VsX3ByaXY7CisKKyAgICAqcHAgPSAoQ1VWSURQSUNQQVJBTVMpIHsKKyAgICAgICAgLlBpY1dpZHRoSW5NYnMgICAgID0gaC0+bWJfd2lkdGgsCisgICAgICAgIC5GcmFtZUhlaWdodEluTWJzICA9IGgtPm1iX2hlaWdodCwKKyAgICAgICAgLkN1cnJQaWNJZHggICAgICAgID0gY2YtPmlkeCwKKyAgICAgICAgLmZpZWxkX3BpY19mbGFnICAgID0gRklFTERfUElDVFVSRShoKSwKKyAgICAgICAgLmJvdHRvbV9maWVsZF9mbGFnID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQsCisgICAgICAgIC5zZWNvbmRfZmllbGQgICAgICA9IEZJRUxEX1BJQ1RVUkUoaCkgJiYgIWgtPmZpcnN0X2ZpZWxkLAorICAgICAgICAucmVmX3BpY19mbGFnICAgICAgPSBoLT5uYWxfcmVmX2lkYyAhPSAwLAorICAgICAgICAuaW50cmFfcGljX2ZsYWcgICAgPSAxLAorCisgICAgICAgIC5Db2RlY1NwZWNpZmljLmgyNjQgPSB7CisgICAgICAgICAgICAubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAgICAgICAgICAgID0gc3BzLT5sb2cyX21heF9mcmFtZV9udW0gLSA0LAorICAgICAgICAgICAgLnBpY19vcmRlcl9jbnRfdHlwZSAgICAgICAgICAgICAgICAgICA9IHNwcy0+cG9jX3R5cGUsCisgICAgICAgICAgICAubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICAgID0gRkZNQVgoc3BzLT5sb2cyX21heF9wb2NfbHNiIC0gNCwgMCksCisgICAgICAgICAgICAuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgICAgID0gc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZywKKyAgICAgICAgICAgIC5mcmFtZV9tYnNfb25seV9mbGFnICAgICAgICAgICAgICAgICAgPSBzcHMtPmZyYW1lX21ic19vbmx5X2ZsYWcsCisgICAgICAgICAgICAuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAgICAgICAgICAgID0gc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnLAorICAgICAgICAgICAgLm51bV9yZWZfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICA9IHNwcy0+cmVmX2ZyYW1lX2NvdW50LAorICAgICAgICAgICAgLnJlc2lkdWFsX2NvbG91cl90cmFuc2Zvcm1fZmxhZyAgICAgICA9IHNwcy0+cmVzaWR1YWxfY29sb3JfdHJhbnNmb3JtX2ZsYWcsCisgICAgICAgICAgICAuYml0X2RlcHRoX2x1bWFfbWludXM4ICAgICAgICAgICAgICAgID0gc3BzLT5iaXRfZGVwdGhfbHVtYSAtIDgsCisgICAgICAgICAgICAuYml0X2RlcHRoX2Nocm9tYV9taW51czggICAgICAgICAgICAgID0gc3BzLT5iaXRfZGVwdGhfY2hyb21hIC0gOCwKKyAgICAgICAgICAgIC5xcHByaW1lX3lfemVyb190cmFuc2Zvcm1fYnlwYXNzX2ZsYWcgPSBzcHMtPnRyYW5zZm9ybV9ieXBhc3MsCisKKyAgICAgICAgICAgIC5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgICAgICAgICAgICAgICA9IHBwcy0+Y2FiYWMsCisgICAgICAgICAgICAucGljX29yZGVyX3ByZXNlbnRfZmxhZyAgICAgICAgICAgICAgICAgPSBwcHMtPnBpY19vcmRlcl9wcmVzZW50LAorICAgICAgICAgICAgLm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgICAgICAgICAgID0gcHBzLT5yZWZfY291bnRbMF0gLSAxLAorICAgICAgICAgICAgLm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgICAgICAgICAgID0gcHBzLT5yZWZfY291bnRbMV0gLSAxLAorICAgICAgICAgICAgLndlaWdodGVkX3ByZWRfZmxhZyAgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9wcmVkLAorICAgICAgICAgICAgLndlaWdodGVkX2JpcHJlZF9pZGMgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjLAorICAgICAgICAgICAgLnBpY19pbml0X3FwX21pbnVzMjYgICAgICAgICAgICAgICAgICAgID0gcHBzLT5pbml0X3FwIC0gMjYsCisgICAgICAgICAgICAuZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPSBwcHMtPmRlYmxvY2tpbmdfZmlsdGVyX3BhcmFtZXRlcnNfcHJlc2VudCwKKyAgICAgICAgICAgIC5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50X2ZsYWcgICAgICAgICA9IHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudCwKKyAgICAgICAgICAgIC50cmFuc2Zvcm1fOHg4X21vZGVfZmxhZyAgICAgICAgICAgICAgICA9IHBwcy0+dHJhbnNmb3JtXzh4OF9tb2RlLAorICAgICAgICAgICAgLk1iYWZmRnJhbWVGbGFnICAgICAgICAgICAgICAgICAgICAgICAgID0gc3BzLT5tYl9hZmYgJiYgIUZJRUxEX1BJQ1RVUkUoaCksCisgICAgICAgICAgICAuY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnICAgICAgICAgICAgPSBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWQsCisgICAgICAgICAgICAuY2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICAgICAgICAgPSBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF0sCisgICAgICAgICAgICAuc2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQgICAgICAgICAgPSBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMV0sCisgICAgICAgICAgICAucmVmX3BpY19mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5uYWxfcmVmX2lkYyAhPSAwLAorICAgICAgICAgICAgLmZyYW1lX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+cG9jLmZyYW1lX251bSwKKyAgICAgICAgICAgIC5DdXJyRmllbGRPcmRlckNudFswXSAgICAgICAgICAgICAgICAgICA9IGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2NbMF0sCisgICAgICAgICAgICAuQ3VyckZpZWxkT3JkZXJDbnRbMV0gICAgICAgICAgICAgICAgICAgPSBoLT5jdXJfcGljX3B0ci0+ZmllbGRfcG9jWzFdLAorICAgICAgICB9LAorICAgIH07CisKKyAgICBtZW1jcHkocHBjLT5XZWlnaHRTY2FsZTR4NCwgICAgcHBzLT5zY2FsaW5nX21hdHJpeDQsICAgIHNpemVvZihwcGMtPldlaWdodFNjYWxlNHg0KSk7CisgICAgbWVtY3B5KHBwYy0+V2VpZ2h0U2NhbGU4eDhbMF0sIHBwcy0+c2NhbGluZ19tYXRyaXg4WzBdLCBzaXplb2YocHBjLT5XZWlnaHRTY2FsZTh4OFswXSkpOworICAgIG1lbWNweShwcGMtPldlaWdodFNjYWxlOHg4WzFdLCBwcHMtPnNjYWxpbmdfbWF0cml4OFszXSwgc2l6ZW9mKHBwYy0+V2VpZ2h0U2NhbGU4eDhbMF0pKTsKKworICAgIGRwYl9zaXplID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaC0+c2hvcnRfcmVmX2NvdW50OyBpKyspCisgICAgICAgIGRwYl9hZGQoaCwgJnBwYy0+ZHBiW2RwYl9zaXplKytdLCBoLT5zaG9ydF9yZWZbaV0sIGgtPnNob3J0X3JlZltpXS0+ZnJhbWVfbnVtKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICBpZiAoaC0+bG9uZ19yZWZbaV0pCisgICAgICAgICAgICBkcGJfYWRkKGgsICZwcGMtPmRwYltkcGJfc2l6ZSsrXSwgaC0+bG9uZ19yZWZbaV0sIGkpOworICAgIH0KKworICAgIGZvciAoaSA9IGRwYl9zaXplOyBpIDwgRkZfQVJSQVlfRUxFTVMocHBjLT5kcGIpOyBpKyspCisgICAgICAgIHBwYy0+ZHBiW2ldLlBpY0lkeCA9IC0xOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnZkZWNfaDI2NF9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgTlZERUNDb250ZXh0ICpjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIENVVklEUElDUEFSQU1TICpwcCA9ICZjdHgtPnBpY19wYXJhbXM7CisgICAgY29uc3QgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEgyNjRTbGljZUNvbnRleHQgKnNsID0gJmgtPnNsaWNlX2N0eFswXTsKKyAgICB2b2lkICp0bXA7CisKKyAgICB0bXAgPSBhdl9mYXN0X3JlYWxsb2MoY3R4LT5iaXRzdHJlYW0sICZjdHgtPmJpdHN0cmVhbV9hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Yml0c3RyZWFtX2xlbiArIHNpemUgKyAzKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjdHgtPmJpdHN0cmVhbSA9IHRtcDsKKworICAgIHRtcCA9IGF2X2Zhc3RfcmVhbGxvYyhjdHgtPnNsaWNlX29mZnNldHMsICZjdHgtPnNsaWNlX29mZnNldHNfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5uYl9zbGljZXMgKyAxKSAqIHNpemVvZigqY3R4LT5zbGljZV9vZmZzZXRzKSk7CisgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgY3R4LT5zbGljZV9vZmZzZXRzID0gdG1wOworCisgICAgQVZfV0IyNChjdHgtPmJpdHN0cmVhbSArIGN0eC0+Yml0c3RyZWFtX2xlbiwgMSk7CisgICAgbWVtY3B5KGN0eC0+Yml0c3RyZWFtICsgY3R4LT5iaXRzdHJlYW1fbGVuICsgMywgYnVmZmVyLCBzaXplKTsKKyAgICBjdHgtPnNsaWNlX29mZnNldHNbY3R4LT5uYl9zbGljZXNdID0gY3R4LT5iaXRzdHJlYW1fbGVuIDsKKyAgICBjdHgtPmJpdHN0cmVhbV9sZW4gKz0gc2l6ZSArIDM7CisgICAgY3R4LT5uYl9zbGljZXMrKzsKKworICAgIGlmIChzbC0+c2xpY2VfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSAmJiBzbC0+c2xpY2VfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfU0kpCisgICAgICAgIHBwLT5pbnRyYV9waWNfZmxhZyA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudmRlY19oMjY0X2ZyYW1lX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4KQoreworICAgIGNvbnN0IEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBTUFMgICAgICAgKnNwcyA9IGgtPnBzLnNwczsKKyAgICByZXR1cm4gZmZfbnZkZWNfZnJhbWVfcGFyYW1zKGF2Y3R4LCBod19mcmFtZXNfY3R4LCBzcHMtPnJlZl9mcmFtZV9jb3VudCArIHNwcy0+bnVtX3Jlb3JkZXJfZnJhbWVzKTsKK30KKworY29uc3QgQVZIV0FjY2VsIGZmX2gyNjRfbnZkZWNfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAiaDI2NF9udmRlYyIsCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9DVURBLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9IG52ZGVjX2gyNjRfc3RhcnRfZnJhbWUsCisgICAgLmVuZF9mcmFtZSAgICAgICAgICAgID0gZmZfbnZkZWNfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9IG52ZGVjX2gyNjRfZGVjb2RlX3NsaWNlLAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9IG52ZGVjX2gyNjRfZnJhbWVfcGFyYW1zLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICA9IGZmX252ZGVjX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9IGZmX252ZGVjX2RlY29kZV91bmluaXQsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKE5WREVDQ29udGV4dCksCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9udmRlY19oZXZjLmMgYi9saWJhdmNvZGVjL252ZGVjX2hldmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDRhNzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9udmRlY19oZXZjLmMKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBIRVZDIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBOVkRFQworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBBbnRvbiBLaGlybm92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJudmRlYy5oIgorI2luY2x1ZGUgImRlY29kZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiaGV2Y2RlYy5oIgorI2luY2x1ZGUgImhldmNfZGF0YS5oIgorCitzdGF0aWMgdm9pZCBkcGJfYWRkKENVVklESEVWQ1BJQ1BBUkFNUyAqcHAsIGludCBpZHgsIGNvbnN0IEhFVkNGcmFtZSAqc3JjKQoreworICAgIEZyYW1lRGVjb2RlRGF0YSAqZmRkID0gKEZyYW1lRGVjb2RlRGF0YSopc3JjLT5mcmFtZS0+cHJpdmF0ZV9yZWYtPmRhdGE7CisgICAgY29uc3QgTlZERUNGcmFtZSAqY2YgPSBmZGQtPmh3YWNjZWxfcHJpdjsKKworICAgIHBwLT5SZWZQaWNJZHhbaWR4XSAgICAgID0gY2YgPyBjZi0+aWR4IDogLTE7CisgICAgcHAtPlBpY09yZGVyQ250VmFsW2lkeF0gPSBzcmMtPnBvYzsKKyAgICBwcC0+SXNMb25nVGVybVtpZHhdICAgICA9ICEhKHNyYy0+ZmxhZ3MgJiBIRVZDX0ZSQU1FX0ZMQUdfTE9OR19SRUYpOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3NjYWxpbmdfbGlzdHMoQ1VWSURIRVZDUElDUEFSQU1TICpwcGMsIGNvbnN0IEhFVkNDb250ZXh0ICpzKQoreworICAgIGNvbnN0IFNjYWxpbmdMaXN0ICpzbCA9IHMtPnBzLnBwcy0+c2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+cHMucHBzLT5zY2FsaW5nX2xpc3QgOiAmcy0+cHMuc3BzLT5zY2FsaW5nX2xpc3Q7CisgICAgaW50IGksIGosIHBvczsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKKyAgICAgICAgICAgIHBvcyA9IDQgKiBmZl9oZXZjX2RpYWdfc2NhbjR4NF95W2pdICsgZmZfaGV2Y19kaWFnX3NjYW40eDRfeFtqXTsKKyAgICAgICAgICAgIHBwYy0+U2NhbGluZ0xpc3Q0eDRbaV1bal0gPSBzbC0+c2xbMF1baV1bcG9zXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisgICAgICAgICAgICBwb3MgPSA4ICogZmZfaGV2Y19kaWFnX3NjYW44eDhfeVtqXSArIGZmX2hldmNfZGlhZ19zY2FuOHg4X3hbal07CisgICAgICAgICAgICBwcGMtPlNjYWxpbmdMaXN0OHg4W2ldW2pdICAgPSBzbC0+c2xbMV1baV1bcG9zXTsKKyAgICAgICAgICAgIHBwYy0+U2NhbGluZ0xpc3QxNngxNltpXVtqXSA9IHNsLT5zbFsyXVtpXVtwb3NdOworCisgICAgICAgICAgICBpZiAoaSA8IDIpCisgICAgICAgICAgICAgICAgcHBjLT5TY2FsaW5nTGlzdDMyeDMyW2ldW2pdID0gc2wtPnNsWzNdW2kgKiAzXVtwb3NdOworICAgICAgICB9CisKKyAgICAgICAgcHBjLT5TY2FsaW5nTGlzdERDQ29lZmYxNngxNltpXSA9IHNsLT5zbF9kY1swXVtpXTsKKyAgICAgICAgaWYgKGkgPCAyKQorICAgICAgICAgICAgcHBjLT5TY2FsaW5nTGlzdERDQ29lZmYzMngzMltpXSA9IHNsLT5zbF9kY1sxXVtpICogM107CisgICAgfQorfQorCitzdGF0aWMgaW50IG52ZGVjX2hldmNfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBjb25zdCBIRVZDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgSEVWQ1BQUyAqcHBzID0gcy0+cHMucHBzOworICAgIGNvbnN0IEhFVkNTUFMgKnNwcyA9IHMtPnBzLnNwczsKKworICAgIE5WREVDQ29udGV4dCAgICAgICAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBDVVZJRFBJQ1BBUkFNUyAgICAgICpwcCA9ICZjdHgtPnBpY19wYXJhbXM7CisgICAgQ1VWSURIRVZDUElDUEFSQU1TICpwcGMgPSAmcHAtPkNvZGVjU3BlY2lmaWMuaGV2YzsKKyAgICBGcmFtZURlY29kZURhdGEgKmZkZDsKKyAgICBOVkRFQ0ZyYW1lICpjZjsKKworICAgIGludCBpLCBqLCBkcGJfc2l6ZSwgcmV0OworCisgICAgcmV0ID0gZmZfbnZkZWNfc3RhcnRfZnJhbWUoYXZjdHgsIHMtPnJlZi0+ZnJhbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZmRkID0gKEZyYW1lRGVjb2RlRGF0YSopcy0+cmVmLT5mcmFtZS0+cHJpdmF0ZV9yZWYtPmRhdGE7CisgICAgY2YgID0gKE5WREVDRnJhbWUqKWZkZC0+aHdhY2NlbF9wcml2OworCisgICAgKnBwID0gKENVVklEUElDUEFSQU1TKSB7CisgICAgICAgIC5QaWNXaWR0aEluTWJzICAgICA9IHNwcy0+d2lkdGggIC8gMTYsCisgICAgICAgIC5GcmFtZUhlaWdodEluTWJzICA9IHNwcy0+aGVpZ2h0IC8gMTYsCisgICAgICAgIC5DdXJyUGljSWR4ICAgICAgICA9IGNmLT5pZHgsCisgICAgICAgIC5yZWZfcGljX2ZsYWcgICAgICA9IDEsCisgICAgICAgIC5pbnRyYV9waWNfZmxhZyAgICA9IElTX0lSQVAocyksCisKKyAgICAgICAgLkNvZGVjU3BlY2lmaWMuaGV2YyA9IHsKKyAgICAgICAgICAgIC5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzICAgICAgICAgICAgICAgICAgICA9IHNwcy0+d2lkdGgsCisgICAgICAgICAgICAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgICAgICAgICAgICAgICAgICAgPSBzcHMtPmhlaWdodCwKKyAgICAgICAgICAgIC5sb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyAgICAgICA9IHNwcy0+bG9nMl9taW5fY2Jfc2l6ZSAtIDMsCisgICAgICAgICAgICAubG9nMl9kaWZmX21heF9taW5fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZSAgICAgPSBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplLAorICAgICAgICAgICAgLmxvZzJfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplX21pbnVzMiAgICAgICAgID0gc3BzLT5sb2cyX21pbl90Yl9zaXplIC0gMiwKKyAgICAgICAgICAgIC5sb2cyX2RpZmZfbWF4X21pbl90cmFuc2Zvcm1fYmxvY2tfc2l6ZSAgICAgICA9IHNwcy0+bG9nMl9tYXhfdHJhZm9fc2l6ZSAtIHNwcy0+bG9nMl9taW5fdGJfc2l6ZSwKKyAgICAgICAgICAgIC5wY21fZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcy0+cGNtX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5sb2cyX21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgICA9IHNwcy0+cGNtX2VuYWJsZWRfZmxhZyA/IHNwcy0+cGNtLmxvZzJfbWluX3BjbV9jYl9zaXplIC0gMyA6IDAsCisgICAgICAgICAgICAubG9nMl9kaWZmX21heF9taW5fcGNtX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUgPSBzcHMtPnBjbS5sb2cyX21heF9wY21fY2Jfc2l6ZSAtIHNwcy0+cGNtLmxvZzJfbWluX3BjbV9jYl9zaXplLAorICAgICAgICAgICAgLnBjbV9zYW1wbGVfYml0X2RlcHRoX2x1bWFfbWludXMxICAgICAgICAgICAgID0gc3BzLT5wY21fZW5hYmxlZF9mbGFnID8gc3BzLT5wY20uYml0X2RlcHRoIC0gMSA6IDAsCisgICAgICAgICAgICAucGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hX21pbnVzMSAgICAgICAgICAgPSBzcHMtPnBjbV9lbmFibGVkX2ZsYWcgPyBzcHMtPnBjbS5iaXRfZGVwdGhfY2hyb21hIC0gMSA6IDAsCisjaWYgTlZERUNBUElfQ0hFQ0tfVkVSU0lPTig4LCAxKQorICAgICAgICAgICAgLmxvZzJfbWF4X3RyYW5zZm9ybV9za2lwX2Jsb2NrX3NpemVfbWludXMyICAgID0gcHBzLT5sb2cyX21heF90cmFuc2Zvcm1fc2tpcF9ibG9ja19zaXplIC0gMiwKKyAgICAgICAgICAgIC5sb2cyX3Nhb19vZmZzZXRfc2NhbGVfbHVtYSAgICAgICAgICAgICAgICAgICA9IHBwcy0+bG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2x1bWEsCisgICAgICAgICAgICAubG9nMl9zYW9fb2Zmc2V0X3NjYWxlX2Nocm9tYSAgICAgICAgICAgICAgICAgPSBwcHMtPmxvZzJfc2FvX29mZnNldF9zY2FsZV9jaHJvbWEsCisgICAgICAgICAgICAuaGlnaF9wcmVjaXNpb25fb2Zmc2V0c19lbmFibGVkX2ZsYWcgICAgICAgICAgPSBzcHMtPmhpZ2hfcHJlY2lzaW9uX29mZnNldHNfZW5hYmxlZF9mbGFnLAorI2VuZGlmCisgICAgICAgICAgICAucGNtX2xvb3BfZmlsdGVyX2Rpc2FibGVkX2ZsYWcgICAgICAgICAgICAgICAgPSBzcHMtPnBjbS5sb29wX2ZpbHRlcl9kaXNhYmxlX2ZsYWcsCisgICAgICAgICAgICAuc3Ryb25nX2ludHJhX3Ntb290aGluZ19lbmFibGVkX2ZsYWcgICAgICAgICAgPSBzcHMtPnNwc19zdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZV9mbGFnLAorICAgICAgICAgICAgLm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhICAgICAgICAgID0gc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYSwKKyAgICAgICAgICAgIC5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlciAgICAgICAgICA9IHNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIsCisgICAgICAgICAgICAuYW1wX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcHMtPmFtcF9lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAuc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcgICAgICAgICAgICAgICAgICAgPSBzcHMtPnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnLAorICAgICAgICAgICAgLmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCAgICAgICAgICAgID0gc3BzLT5sb2cyX21heF9wb2NfbHNiIC0gNCwKKyAgICAgICAgICAgIC5udW1fc2hvcnRfdGVybV9yZWZfcGljX3NldHMgICAgICAgICAgICAgICAgICA9IHNwcy0+bmJfc3RfcnBzLAorICAgICAgICAgICAgLmxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcgICAgICAgICAgICAgID0gc3BzLT5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzICAgICAgICAgICAgICAgICAgID0gc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwcywKKyAgICAgICAgICAgIC5zcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgICA9IHNwcy0+c3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAuc2FtcGxlX2FkYXB0aXZlX29mZnNldF9lbmFibGVkX2ZsYWcgICAgICAgICAgPSBzcHMtPnNhb19lbmFibGVkLAorICAgICAgICAgICAgLnNjYWxpbmdfbGlzdF9lbmFibGVfZmxhZyAgICAgICAgICAgICAgICAgICAgID0gc3BzLT5zY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWcsCisgICAgICAgICAgICAuSXJhcFBpY0ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJU19JUkFQKHMpLAorICAgICAgICAgICAgLklkclBpY0ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gSVNfSURSKHMpLAorICAgICAgICAgICAgLmJpdF9kZXB0aF9sdW1hX21pbnVzOCAgICAgICAgICAgICAgICAgICAgICAgID0gc3BzLT5iaXRfZGVwdGggLSA4LAorICAgICAgICAgICAgLmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICAgICAgICAgICAgICAgICAgICAgID0gc3BzLT5iaXRfZGVwdGggLSA4LAorCisgICAgICAgICAgICAuZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRzX2VuYWJsZWRfZmxhZyAgICAgICAgPSBwcHMtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50c19lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAuc2xpY2Vfc2VnbWVudF9oZWFkZXJfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZyAgPSBwcHMtPnNsaWNlX2hlYWRlcl9leHRlbnNpb25fcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLnNpZ25fZGF0YV9oaWRpbmdfZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgID0gcHBzLT5zaWduX2RhdGFfaGlkaW5nX2ZsYWcsCisgICAgICAgICAgICAuY3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgICAgICAgPSBwcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+ZGlmZl9jdV9xcF9kZWx0YV9kZXB0aCwKKyAgICAgICAgICAgIC5pbml0X3FwX21pbnVzMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+cGljX2luaXRfcXBfbWludXMyNiwKKyAgICAgICAgICAgIC5wcHNfY2JfcXBfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+Y2JfcXBfb2Zmc2V0LAorICAgICAgICAgICAgLnBwc19jcl9xcF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT5jcl9xcF9vZmZzZXQsCisgICAgICAgICAgICAuY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnICAgICAgICAgICAgICAgICAgPSBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZywKKyAgICAgICAgICAgIC53ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnLAorICAgICAgICAgICAgLndlaWdodGVkX2JpcHJlZF9mbGFnICAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZywKKyAgICAgICAgICAgIC50cmFuc2Zvcm1fc2tpcF9lbmFibGVkX2ZsYWcgICAgICAgICAgICAgICAgICA9IHBwcy0+dHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLnRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgID0gcHBzLT50cmFuc3F1YW50X2J5cGFzc19lbmFibGVfZmxhZywKKyAgICAgICAgICAgIC5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICA9IHBwcy0+ZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAubG9nMl9wYXJhbGxlbF9tZXJnZV9sZXZlbF9taW51czIgICAgICAgICAgICAgPSBwcHMtPmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWwgLSAyLAorICAgICAgICAgICAgLm51bV9leHRyYV9zbGljZV9oZWFkZXJfYml0cyAgICAgICAgICAgICAgICAgID0gcHBzLT5udW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHMsCisgICAgICAgICAgICAubG9vcF9maWx0ZXJfYWNyb3NzX3RpbGVzX2VuYWJsZWRfZmxhZyAgICAgICAgPSBwcHMtPmxvb3BfZmlsdGVyX2Fjcm9zc190aWxlc19lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAubG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgICAgICAgPSBwcHMtPnNlcV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5vdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWcgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+b3V0cHV0X2ZsYWdfcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLm51bV9yZWZfaWR4X2wwX2RlZmF1bHRfYWN0aXZlX21pbnVzMSAgICAgICAgID0gcHBzLT5udW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZSAtIDEsCisgICAgICAgICAgICAubnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxICAgICAgICAgPSBwcHMtPm51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlIC0gMSwKKyAgICAgICAgICAgIC5saXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnICAgICAgICAgICAgICA9IHBwcy0+bGlzdHNfbW9kaWZpY2F0aW9uX3ByZXNlbnRfZmxhZywKKyAgICAgICAgICAgIC5jYWJhY19pbml0X3ByZXNlbnRfZmxhZyAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+Y2FiYWNfaW5pdF9wcmVzZW50X2ZsYWcsCisgICAgICAgICAgICAucHBzX3NsaWNlX2Nocm9tYV9xcF9vZmZzZXRzX3ByZXNlbnRfZmxhZyAgICAgPSBwcHMtPnBpY19zbGljZV9sZXZlbF9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWcsCisgICAgICAgICAgICAuZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnICAgICAgPSBwcHMtPmRlYmxvY2tpbmdfZmlsdGVyX292ZXJyaWRlX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5wcHNfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyAgICAgICAgICA9IHBwcy0+ZGlzYWJsZV9kYmYsCisgICAgICAgICAgICAucHBzX2JldGFfb2Zmc2V0X2RpdjIgICAgICAgICAgICAgICAgICAgICAgICAgPSBwcHMtPmJldGFfb2Zmc2V0IC8gMiwKKyAgICAgICAgICAgIC5wcHNfdGNfb2Zmc2V0X2RpdjIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+dGNfb2Zmc2V0IC8gMiwKKyAgICAgICAgICAgIC50aWxlc19lbmFibGVkX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLnVuaWZvcm1fc3BhY2luZ19mbGFnICAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT51bmlmb3JtX3NwYWNpbmdfZmxhZywKKyAgICAgICAgICAgIC5udW1fdGlsZV9jb2x1bW5zX21pbnVzMSAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+bnVtX3RpbGVfY29sdW1ucyAtIDEsCisgICAgICAgICAgICAubnVtX3RpbGVfcm93c19taW51czEgICAgICAgICAgICAgICAgICAgICAgICAgPSBwcHMtPm51bV90aWxlX3Jvd3MgLSAxLAorCisgICAgICAgICAgICAuTnVtQml0c0ZvclNob3J0VGVybVJQU0luU2xpY2UgICAgICAgICAgICAgICAgPSBzLT5zaC5zaG9ydF90ZXJtX3JwcyA/IHMtPnNoLnNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc2l6ZSA6IDAsCisgICAgICAgICAgICAuTnVtRGVsdGFQb2NzT2ZSZWZScHNJZHggICAgICAgICAgICAgICAgICAgICAgPSBzLT5zaC5zaG9ydF90ZXJtX3JwcyA/IHMtPnNoLnNob3J0X3Rlcm1fcnBzLT5ycHNfaWR4X251bV9kZWx0YV9wb2NzIDogMCwKKyAgICAgICAgICAgIC5OdW1Qb2NUb3RhbEN1cnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGZmX2hldmNfZnJhbWVfbmJfcmVmcyhzKSwKKyAgICAgICAgICAgIC5OdW1Qb2NTdEN1cnJCZWZvcmUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnJwc1tTVF9DVVJSX0JFRl0ubmJfcmVmcywKKyAgICAgICAgICAgIC5OdW1Qb2NTdEN1cnJBZnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnJwc1tTVF9DVVJSX0FGVF0ubmJfcmVmcywKKyAgICAgICAgICAgIC5OdW1Qb2NMdEN1cnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnJwc1tMVF9DVVJSXS5uYl9yZWZzLAorICAgICAgICAgICAgLkN1cnJQaWNPcmRlckNudFZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cmVmLT5wb2MsCisgICAgICAgIH0sCisgICAgfTsKKworICAgIGlmIChwcHMtPm51bV90aWxlX2NvbHVtbnMgPiBGRl9BUlJBWV9FTEVNUyhwcGMtPmNvbHVtbl93aWR0aF9taW51czEpIHx8CisgICAgICAgIHBwcy0+bnVtX3RpbGVfcm93cyAgICA+IEZGX0FSUkFZX0VMRU1TKHBwYy0+cm93X2hlaWdodF9taW51czEpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgdGlsZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1fdGlsZV9jb2x1bW5zOyBpKyspCisgICAgICAgIHBwYy0+Y29sdW1uX3dpZHRoX21pbnVzMVtpXSA9IHBwcy0+Y29sdW1uX3dpZHRoW2ldIC0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHBzLT5udW1fdGlsZV9yb3dzOyBpKyspCisgICAgICAgIHBwYy0+cm93X2hlaWdodF9taW51czFbaV0gPSBwcHMtPnJvd19oZWlnaHRbaV0gLSAxOworCisgICAgaWYgKHMtPnJwc1tMVF9DVVJSXS5uYl9yZWZzICAgICA+IEZGX0FSUkFZX0VMRU1TKHBwYy0+UmVmUGljU2V0THRDdXJyKSAgICAgICB8fAorICAgICAgICBzLT5ycHNbU1RfQ1VSUl9CRUZdLm5iX3JlZnMgPiBGRl9BUlJBWV9FTEVNUyhwcGMtPlJlZlBpY1NldFN0Q3VyckJlZm9yZSkgfHwKKyAgICAgICAgcy0+cnBzW1NUX0NVUlJfQUZUXS5uYl9yZWZzID4gRkZfQVJSQVlfRUxFTVMocHBjLT5SZWZQaWNTZXRTdEN1cnJBZnRlcikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSByZWZlcmVuY2UgZnJhbWVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICBkcGJfc2l6ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPkRQQik7IGkrKykgeworICAgICAgICBjb25zdCBIRVZDRnJhbWUgKnJlZiA9ICZzLT5EUEJbaV07CisgICAgICAgIGlmICghKHJlZi0+ZmxhZ3MgJiAoSEVWQ19GUkFNRV9GTEFHX1NIT1JUX1JFRiB8IEhFVkNfRlJBTUVfRkxBR19MT05HX1JFRikpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChkcGJfc2l6ZSA+PSBGRl9BUlJBWV9FTEVNUyhwcGMtPlJlZlBpY0lkeCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgcmVmZXJlbmNlIGZyYW1lc1xuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBkcGJfYWRkKHBwYywgZHBiX3NpemUrKywgcmVmKTsKKworICAgIH0KKyAgICBmb3IgKGkgPSBkcGJfc2l6ZTsgaSA8IEZGX0FSUkFZX0VMRU1TKHBwYy0+UmVmUGljSWR4KTsgaSsrKQorICAgICAgICBwcGMtPlJlZlBpY0lkeFtpXSA9IC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnJwc1tTVF9DVVJSX0JFRl0ubmJfcmVmczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkcGJfc2l6ZTsgaisrKSB7CisgICAgICAgICAgICBpZiAocHBjLT5QaWNPcmRlckNudFZhbFtqXSA9PSBzLT5ycHNbU1RfQ1VSUl9CRUZdLmxpc3RbaV0pIHsKKyAgICAgICAgICAgICAgICBwcGMtPlJlZlBpY1NldFN0Q3VyckJlZm9yZVtpXSA9IGo7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHMtPnJwc1tTVF9DVVJSX0FGVF0ubmJfcmVmczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkcGJfc2l6ZTsgaisrKSB7CisgICAgICAgICAgICBpZiAocHBjLT5QaWNPcmRlckNudFZhbFtqXSA9PSBzLT5ycHNbU1RfQ1VSUl9BRlRdLmxpc3RbaV0pIHsKKyAgICAgICAgICAgICAgICBwcGMtPlJlZlBpY1NldFN0Q3VyckFmdGVyW2ldID0gajsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cnBzW0xUX0NVUlJdLm5iX3JlZnM7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZHBiX3NpemU7IGorKykgeworICAgICAgICAgICAgaWYgKHBwYy0+UGljT3JkZXJDbnRWYWxbal0gPT0gcy0+cnBzW0xUX0NVUlJdLmxpc3RbaV0pIHsKKyAgICAgICAgICAgICAgICBwcGMtPlJlZlBpY1NldEx0Q3VycltpXSA9IGo7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaWxsX3NjYWxpbmdfbGlzdHMocHBjLCBzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52ZGVjX2hldmNfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKQoreworICAgIE5WREVDQ29udGV4dCAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICB2b2lkICp0bXA7CisKKyAgICB0bXAgPSBhdl9mYXN0X3JlYWxsb2MoY3R4LT5iaXRzdHJlYW0sICZjdHgtPmJpdHN0cmVhbV9hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Yml0c3RyZWFtX2xlbiArIHNpemUgKyAzKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjdHgtPmJpdHN0cmVhbSA9IHRtcDsKKworICAgIHRtcCA9IGF2X2Zhc3RfcmVhbGxvYyhjdHgtPnNsaWNlX29mZnNldHMsICZjdHgtPnNsaWNlX29mZnNldHNfYWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5uYl9zbGljZXMgKyAxKSAqIHNpemVvZigqY3R4LT5zbGljZV9vZmZzZXRzKSk7CisgICAgaWYgKCF0bXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgY3R4LT5zbGljZV9vZmZzZXRzID0gdG1wOworCisgICAgQVZfV0IyNChjdHgtPmJpdHN0cmVhbSArIGN0eC0+Yml0c3RyZWFtX2xlbiwgMSk7CisgICAgbWVtY3B5KGN0eC0+Yml0c3RyZWFtICsgY3R4LT5iaXRzdHJlYW1fbGVuICsgMywgYnVmZmVyLCBzaXplKTsKKyAgICBjdHgtPnNsaWNlX29mZnNldHNbY3R4LT5uYl9zbGljZXNdID0gY3R4LT5iaXRzdHJlYW1fbGVuIDsKKyAgICBjdHgtPmJpdHN0cmVhbV9sZW4gKz0gc2l6ZSArIDM7CisgICAgY3R4LT5uYl9zbGljZXMrKzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52ZGVjX2hldmNfZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19jdHgpCit7CisgICAgY29uc3QgSEVWQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEhFVkNTUFMgKnNwcyA9IHMtPnBzLnNwczsKKyAgICByZXR1cm4gZmZfbnZkZWNfZnJhbWVfcGFyYW1zKGF2Y3R4LCBod19mcmFtZXNfY3R4LCBzcHMtPnRlbXBvcmFsX2xheWVyW3Nwcy0+bWF4X3N1Yl9sYXllcnMgLSAxXS5tYXhfZGVjX3BpY19idWZmZXJpbmcgKyAxKTsKK30KKworY29uc3QgQVZIV0FjY2VsIGZmX2hldmNfbnZkZWNfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAiaGV2Y19udmRlYyIsCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9DVURBLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9IG52ZGVjX2hldmNfc3RhcnRfZnJhbWUsCisgICAgLmVuZF9mcmFtZSAgICAgICAgICAgID0gZmZfbnZkZWNfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9IG52ZGVjX2hldmNfZGVjb2RlX3NsaWNlLAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9IG52ZGVjX2hldmNfZnJhbWVfcGFyYW1zLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICA9IGZmX252ZGVjX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9IGZmX252ZGVjX2RlY29kZV91bmluaXQsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKE5WREVDQ29udGV4dCksCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9udmRlY19tanBlZy5jIGIvbGliYXZjb2RlYy9udmRlY19tanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDA0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL252ZGVjX21qcGVnLmMKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIE1KUEVHIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBOVkRFQworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQaGlsaXAgTGFuZ2RhbGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1qcGVnZGVjLmgiCisjaW5jbHVkZSAibnZkZWMuaCIKKyNpbmNsdWRlICJkZWNvZGUuaCIKKworc3RhdGljIGludCBudmRlY19tanBlZ19zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBNSnBlZ0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgTlZERUNDb250ZXh0ICAgICAgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgQ1VWSURQSUNQQVJBTVMgICAgICpwcCA9ICZjdHgtPnBpY19wYXJhbXM7CisgICAgRnJhbWVEZWNvZGVEYXRhICpmZGQ7CisgICAgTlZERUNGcmFtZSAqY2Y7CisgICAgQVZGcmFtZSAqY3VyX2ZyYW1lID0gcy0+cGljdHVyZTsKKworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZl9udmRlY19zdGFydF9mcmFtZShhdmN0eCwgY3VyX2ZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZkZCA9IChGcmFtZURlY29kZURhdGEqKWN1cl9mcmFtZS0+cHJpdmF0ZV9yZWYtPmRhdGE7CisgICAgY2YgID0gKE5WREVDRnJhbWUqKWZkZC0+aHdhY2NlbF9wcml2OworCisgICAgKnBwID0gKENVVklEUElDUEFSQU1TKSB7CisgICAgICAgIC5QaWNXaWR0aEluTWJzICAgICA9IChjdXJfZnJhbWUtPndpZHRoICArIDE1KSAvIDE2LAorICAgICAgICAuRnJhbWVIZWlnaHRJbk1icyAgPSAoY3VyX2ZyYW1lLT5oZWlnaHQgKyAxNSkgLyAxNiwKKyAgICAgICAgLkN1cnJQaWNJZHggICAgICAgID0gY2YtPmlkeCwKKworICAgICAgICAuaW50cmFfcGljX2ZsYWcgICAgPSAxLAorICAgICAgICAucmVmX3BpY19mbGFnICAgICAgPSAwLAorICAgIH07CisKKyAgICByZXR1cm4gZmZfbnZkZWNfc2ltcGxlX2RlY29kZV9zbGljZShhdmN0eCwgYnVmZmVyLCBzaXplKTsKK30KKworc3RhdGljIGludCBudmRlY19tanBlZ19kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IHNpemUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnZkZWNfbWpwZWdfZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eCkKK3sKKyAgICAvLyBPbmx5IG5lZWQgc3RvcmFnZSBmb3IgdGhlIGN1cnJlbnQgZnJhbWUKKyAgICByZXR1cm4gZmZfbnZkZWNfZnJhbWVfcGFyYW1zKGF2Y3R4LCBod19mcmFtZXNfY3R4LCAxKTsKK30KKworI2lmIENPTkZJR19NSlBFR19OVkRFQ19IV0FDQ0VMCitBVkhXQWNjZWwgZmZfbWpwZWdfbnZkZWNfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAibWpwZWdfbnZkZWMiLAorICAgIC50eXBlICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NSlBFRywKKyAgICAucGl4X2ZtdCAgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX0NVREEsCisgICAgLnN0YXJ0X2ZyYW1lICAgICAgICAgID0gbnZkZWNfbWpwZWdfc3RhcnRfZnJhbWUsCisgICAgLmVuZF9mcmFtZSAgICAgICAgICAgID0gZmZfbnZkZWNfc2ltcGxlX2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgICAgICAgPSBudmRlY19tanBlZ19kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3BhcmFtcyAgICAgICAgID0gbnZkZWNfbWpwZWdfZnJhbWVfcGFyYW1zLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICA9IGZmX252ZGVjX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9IGZmX252ZGVjX2RlY29kZV91bmluaXQsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKE5WREVDQ29udGV4dCksCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL252ZGVjX21wZWcxMi5jIGIvbGliYXZjb2RlYy9udmRlY19tcGVnMTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjkzZDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9udmRlY19tcGVnMTIuYwpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIE1QRUctMS8yIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBOVkRFQworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQaGlsaXAgTGFuZ2RhbGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlICJudmRlYy5oIgorI2luY2x1ZGUgImRlY29kZS5oIgorCitzdGF0aWMgaW50IG52ZGVjX21wZWcxMl9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBOVkRFQ0NvbnRleHQgICAgICAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBDVVZJRFBJQ1BBUkFNUyAgICAgKnBwID0gJmN0eC0+cGljX3BhcmFtczsKKyAgICBDVVZJRE1QRUcyUElDUEFSQU1TICpwcGMgPSAmcHAtPkNvZGVjU3BlY2lmaWMubXBlZzI7CisgICAgRnJhbWVEZWNvZGVEYXRhICpmZGQ7CisgICAgTlZERUNGcmFtZSAqY2Y7CisgICAgQVZGcmFtZSAqY3VyX2ZyYW1lID0gcy0+Y3VycmVudF9waWN0dXJlLmY7CisKKyAgICBpbnQgcmV0LCBpOworCisgICAgcmV0ID0gZmZfbnZkZWNfc3RhcnRfZnJhbWUoYXZjdHgsIGN1cl9mcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZGQgPSAoRnJhbWVEZWNvZGVEYXRhKiljdXJfZnJhbWUtPnByaXZhdGVfcmVmLT5kYXRhOworICAgIGNmICA9IChOVkRFQ0ZyYW1lKilmZGQtPmh3YWNjZWxfcHJpdjsKKworICAgICpwcCA9IChDVVZJRFBJQ1BBUkFNUykgeworICAgICAgICAuUGljV2lkdGhJbk1icyAgICAgPSAoY3VyX2ZyYW1lLT53aWR0aCAgKyAxNSkgLyAxNiwKKyAgICAgICAgLkZyYW1lSGVpZ2h0SW5NYnMgID0gKGN1cl9mcmFtZS0+aGVpZ2h0ICsgMTUpIC8gMTYsCisgICAgICAgIC5DdXJyUGljSWR4ICAgICAgICA9IGNmLT5pZHgsCisKKyAgICAgICAgLmludHJhX3BpY19mbGFnICAgID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JLAorICAgICAgICAucmVmX3BpY19mbGFnICAgICAgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QLAorCisgICAgICAgIC5Db2RlY1NwZWNpZmljLm1wZWcyID0geworICAgICAgICAgICAgLkZvcndhcmRSZWZJZHggICAgID0gZmZfbnZkZWNfZ2V0X3JlZl9pZHgocy0+bGFzdF9waWN0dXJlLmYpLAorICAgICAgICAgICAgLkJhY2t3YXJkUmVmSWR4ICAgID0gZmZfbnZkZWNfZ2V0X3JlZl9pZHgocy0+bmV4dF9waWN0dXJlLmYpLAorCisgICAgICAgICAgICAucGljdHVyZV9jb2RpbmdfdHlwZSAgICAgICAgPSBzLT5waWN0X3R5cGUsCisgICAgICAgICAgICAuZnVsbF9wZWxfZm9yd2FyZF92ZWN0b3IgICAgPSBzLT5mdWxsX3BlbFswXSwKKyAgICAgICAgICAgIC5mdWxsX3BlbF9iYWNrd2FyZF92ZWN0b3IgICA9IHMtPmZ1bGxfcGVsWzFdLAorICAgICAgICAgICAgLmZfY29kZSAgICAgICAgICAgICAgICAgICAgID0geyB7IHMtPm1wZWdfZl9jb2RlWzBdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1wZWdfZl9jb2RlWzBdWzFdIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcy0+bXBlZ19mX2NvZGVbMV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bXBlZ19mX2NvZGVbMV1bMV0gfSB9LAorICAgICAgICAgICAgLmludHJhX2RjX3ByZWNpc2lvbiAgICAgICAgID0gcy0+aW50cmFfZGNfcHJlY2lzaW9uLAorICAgICAgICAgICAgLmZyYW1lX3ByZWRfZnJhbWVfZGN0ICAgICAgID0gcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QsCisgICAgICAgICAgICAuY29uY2VhbG1lbnRfbW90aW9uX3ZlY3RvcnMgPSBzLT5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycywKKyAgICAgICAgICAgIC5xX3NjYWxlX3R5cGUgICAgICAgICAgICAgICA9IHMtPnFfc2NhbGVfdHlwZSwKKyAgICAgICAgICAgIC5pbnRyYV92bGNfZm9ybWF0ICAgICAgICAgICA9IHMtPmludHJhX3ZsY19mb3JtYXQsCisgICAgICAgICAgICAuYWx0ZXJuYXRlX3NjYW4gICAgICAgICAgICAgPSBzLT5hbHRlcm5hdGVfc2NhbiwKKyAgICAgICAgICAgIC50b3BfZmllbGRfZmlyc3QgICAgICAgICAgICA9IHMtPnRvcF9maWVsZF9maXJzdCwKKyAgICAgICAgfQorICAgIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkgeworICAgICAgICBwcGMtPlF1YW50TWF0cml4SW50cmFbaV0gPSBzLT5pbnRyYV9tYXRyaXhbaV07CisgICAgICAgIHBwYy0+UXVhbnRNYXRyaXhJbnRlcltpXSA9IHMtPmludGVyX21hdHJpeFtpXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudmRlY19tcGVnMTJfZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eCkKK3sKKyAgICAvLyBFYWNoIGZyYW1lIGNhbiBhdCBtb3N0IGhhdmUgb25lIFAgYW5kIG9uZSBCIHJlZmVyZW5jZQorICAgIHJldHVybiBmZl9udmRlY19mcmFtZV9wYXJhbXMoYXZjdHgsIGh3X2ZyYW1lc19jdHgsIDIpOworfQorCisjaWYgQ09ORklHX01QRUcyX05WREVDX0hXQUNDRUwKK2NvbnN0IEFWSFdBY2NlbCBmZl9tcGVnMl9udmRlY19od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJtcGVnMl9udmRlYyIsCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9DVURBLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9IG52ZGVjX21wZWcxMl9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSBmZl9udmRlY19zaW1wbGVfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9IGZmX252ZGVjX3NpbXBsZV9kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3BhcmFtcyAgICAgICAgID0gbnZkZWNfbXBlZzEyX2ZyYW1lX3BhcmFtcywKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihOVkRFQ0NvbnRleHQpLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01QRUcxX05WREVDX0hXQUNDRUwKK2NvbnN0IEFWSFdBY2NlbCBmZl9tcGVnMV9udmRlY19od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJtcGVnMV9udmRlYyIsCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcxVklERU8sCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9DVURBLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9IG52ZGVjX21wZWcxMl9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSBmZl9udmRlY19zaW1wbGVfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9IGZmX252ZGVjX3NpbXBsZV9kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3BhcmFtcyAgICAgICAgID0gbnZkZWNfbXBlZzEyX2ZyYW1lX3BhcmFtcywKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihOVkRFQ0NvbnRleHQpLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9udmRlY19tcGVnNC5jIGIvbGliYXZjb2RlYy9udmRlY19tcGVnNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwN2FmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL252ZGVjX21wZWc0LmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBNUEVHLTQgUGFydCAyIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBOVkRFQworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQaGlsaXAgTGFuZ2RhbGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJtcGVnNHZpZGVvLmgiCisjaW5jbHVkZSAibnZkZWMuaCIKKyNpbmNsdWRlICJkZWNvZGUuaCIKKworc3RhdGljIGludCBudmRlY19tcGVnNF9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBNcGVnNERlY0NvbnRleHQgKm0gPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gJm0tPm07CisKKyAgICBOVkRFQ0NvbnRleHQgICAgICAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBDVVZJRFBJQ1BBUkFNUyAgICAgKnBwID0gJmN0eC0+cGljX3BhcmFtczsKKyAgICBDVVZJRE1QRUc0UElDUEFSQU1TICpwcGMgPSAmcHAtPkNvZGVjU3BlY2lmaWMubXBlZzQ7CisgICAgRnJhbWVEZWNvZGVEYXRhICpmZGQ7CisgICAgTlZERUNGcmFtZSAqY2Y7CisgICAgQVZGcmFtZSAqY3VyX2ZyYW1lID0gcy0+Y3VycmVudF9waWN0dXJlLmY7CisKKyAgICBpbnQgcmV0LCBpOworCisgICAgcmV0ID0gZmZfbnZkZWNfc3RhcnRfZnJhbWUoYXZjdHgsIGN1cl9mcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZGQgPSAoRnJhbWVEZWNvZGVEYXRhKiljdXJfZnJhbWUtPnByaXZhdGVfcmVmLT5kYXRhOworICAgIGNmICA9IChOVkRFQ0ZyYW1lKilmZGQtPmh3YWNjZWxfcHJpdjsKKworICAgICpwcCA9IChDVVZJRFBJQ1BBUkFNUykgeworICAgICAgICAuUGljV2lkdGhJbk1icyAgICAgPSAoY3VyX2ZyYW1lLT53aWR0aCAgKyAxNSkgLyAxNiwKKyAgICAgICAgLkZyYW1lSGVpZ2h0SW5NYnMgID0gKGN1cl9mcmFtZS0+aGVpZ2h0ICsgMTUpIC8gMTYsCisgICAgICAgIC5DdXJyUGljSWR4ICAgICAgICA9IGNmLT5pZHgsCisKKyAgICAgICAgLmludHJhX3BpY19mbGFnICAgID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JLAorICAgICAgICAucmVmX3BpY19mbGFnICAgICAgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUywKKworICAgICAgICAuQ29kZWNTcGVjaWZpYy5tcGVnNCA9IHsKKyAgICAgICAgICAgIC5Gb3J3YXJkUmVmSWR4ICAgICAgICAgICAgICAgID0gZmZfbnZkZWNfZ2V0X3JlZl9pZHgocy0+bGFzdF9waWN0dXJlLmYpLAorICAgICAgICAgICAgLkJhY2t3YXJkUmVmSWR4ICAgICAgICAgICAgICAgPSBmZl9udmRlY19nZXRfcmVmX2lkeChzLT5uZXh0X3BpY3R1cmUuZiksCisKKyAgICAgICAgICAgIC52aWRlb19vYmplY3RfbGF5ZXJfd2lkdGggICAgID0gcy0+d2lkdGgsCisgICAgICAgICAgICAudmlkZW9fb2JqZWN0X2xheWVyX2hlaWdodCAgICA9IHMtPmhlaWdodCwKKyAgICAgICAgICAgIC52b3BfdGltZV9pbmNyZW1lbnRfYml0Y291bnQgID0gbS0+dGltZV9pbmNyZW1lbnRfYml0cywKKyAgICAgICAgICAgIC50b3BfZmllbGRfZmlyc3QgICAgICAgICAgICAgID0gcy0+dG9wX2ZpZWxkX2ZpcnN0LAorICAgICAgICAgICAgLnJlc3luY19tYXJrZXJfZGlzYWJsZSAgICAgICAgPSAhbS0+cmVzeW5jX21hcmtlciwKKyAgICAgICAgICAgIC5xdWFudF90eXBlICAgICAgICAgICAgICAgICAgID0gcy0+bXBlZ19xdWFudCwKKyAgICAgICAgICAgIC5xdWFydGVyX3NhbXBsZSAgICAgICAgICAgICAgID0gcy0+cXVhcnRlcl9zYW1wbGUsCisgICAgICAgICAgICAuc2hvcnRfdmlkZW9faGVhZGVyICAgICAgICAgICA9IGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2MywKKyAgICAgICAgICAgIC5kaXZ4X2ZsYWdzICAgICAgICAgICAgICAgICAgID0gcy0+ZGl2eF9wYWNrZWQgPyA1IDogMCwKKworICAgICAgICAgICAgLnZvcF9jb2RpbmdfdHlwZSAgICAgICAgICAgICAgPSBzLT5waWN0X3R5cGUgLSBBVl9QSUNUVVJFX1RZUEVfSSwKKyAgICAgICAgICAgIC52b3BfY29kZWQgICAgICAgICAgICAgICAgICAgID0gMSwKKyAgICAgICAgICAgIC52b3Bfcm91bmRpbmdfdHlwZSAgICAgICAgICAgID0gcy0+bm9fcm91bmRpbmcsCisgICAgICAgICAgICAuYWx0ZXJuYXRlX3ZlcnRpY2FsX3NjYW5fZmxhZyA9IHMtPmFsdGVybmF0ZV9zY2FuLAorICAgICAgICAgICAgLmludGVybGFjZWQgICAgICAgICAgICAgICAgICAgPSAhcy0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UsCisgICAgICAgICAgICAudm9wX2Zjb2RlX2ZvcndhcmQgICAgICAgICAgICA9IHMtPmZfY29kZSwKKyAgICAgICAgICAgIC52b3BfZmNvZGVfYmFja3dhcmQgICAgICAgICAgID0gcy0+Yl9jb2RlLAorICAgICAgICAgICAgLnRyZCAgICAgICAgICAgICAgICAgICAgICAgICAgPSB7IHMtPnBwX3RpbWUsIHMtPnBwX2ZpZWxkX3RpbWUgPj4gMSB9LAorICAgICAgICAgICAgLnRyYiAgICAgICAgICAgICAgICAgICAgICAgICAgPSB7IHMtPnBiX3RpbWUsIHMtPnBiX2ZpZWxkX3RpbWUgPj4gMSB9LAorCisgICAgICAgICAgICAuZ21jX2VuYWJsZWQgICAgICAgICAgICAgICAgICA9IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLT52b2xfc3ByaXRlX3VzYWdlID09IEdNQ19TUFJJVEUsCisgICAgICAgIH0KKyAgICB9OworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyArK2kpIHsKKyAgICAgICAgcHBjLT5RdWFudE1hdHJpeEludHJhW2ldID0gcy0+aW50cmFfbWF0cml4W2ldOworICAgICAgICBwcGMtPlF1YW50TWF0cml4SW50ZXJbaV0gPSBzLT5pbnRlcl9tYXRyaXhbaV07CisgICAgfQorCisgICAgLy8gV2UgbmVlZCB0byBwYXNzIHRoZSBmdWxsIGZyYW1lIGJ1ZmZlciBhbmQgbm90IGp1c3QgdGhlIHNsaWNlCisgICAgcmV0dXJuIGZmX252ZGVjX3NpbXBsZV9kZWNvZGVfc2xpY2UoYXZjdHgsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgbnZkZWNfbXBlZzRfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52ZGVjX21wZWc0X2ZyYW1lX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19jdHgpCit7CisgICAgLy8gRWFjaCBmcmFtZSBjYW4gYXQgbW9zdCBoYXZlIG9uZSBQIGFuZCBvbmUgQiByZWZlcmVuY2UKKyAgICByZXR1cm4gZmZfbnZkZWNfZnJhbWVfcGFyYW1zKGF2Y3R4LCBod19mcmFtZXNfY3R4LCAyKTsKK30KKworY29uc3QgQVZIV0FjY2VsIGZmX21wZWc0X252ZGVjX2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgID0gIm1wZWc0X252ZGVjIiwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzQsCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9DVURBLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9IG52ZGVjX21wZWc0X3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICAgICAgICA9IGZmX252ZGVjX3NpbXBsZV9lbmRfZnJhbWUsCisgICAgLmRlY29kZV9zbGljZSAgICAgICAgID0gbnZkZWNfbXBlZzRfZGVjb2RlX3NsaWNlLAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9IG52ZGVjX21wZWc0X2ZyYW1lX3BhcmFtcywKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihOVkRFQ0NvbnRleHQpLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbnZkZWNfdmMxLmMgYi9saWJhdmNvZGVjL252ZGVjX3ZjMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTc2OTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL252ZGVjX3ZjMS5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogVkMxIEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBOVkRFQworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQaGlsaXAgTGFuZ2RhbGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJudmRlYy5oIgorI2luY2x1ZGUgImRlY29kZS5oIgorI2luY2x1ZGUgInZjMS5oIgorCitzdGF0aWMgaW50IG52ZGVjX3ZjMV9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBWQzFDb250ZXh0ICp2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworCisgICAgTlZERUNDb250ZXh0ICAgICAgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgQ1VWSURQSUNQQVJBTVMgICAgICpwcCA9ICZjdHgtPnBpY19wYXJhbXM7CisgICAgRnJhbWVEZWNvZGVEYXRhICpmZGQ7CisgICAgTlZERUNGcmFtZSAqY2Y7CisgICAgQVZGcmFtZSAqY3VyX2ZyYW1lID0gcy0+Y3VycmVudF9waWN0dXJlLmY7CisKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfbnZkZWNfc3RhcnRfZnJhbWUoYXZjdHgsIGN1cl9mcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZGQgPSAoRnJhbWVEZWNvZGVEYXRhKiljdXJfZnJhbWUtPnByaXZhdGVfcmVmLT5kYXRhOworICAgIGNmICA9IChOVkRFQ0ZyYW1lKilmZGQtPmh3YWNjZWxfcHJpdjsKKworICAgICpwcCA9IChDVVZJRFBJQ1BBUkFNUykgeworICAgICAgICAuUGljV2lkdGhJbk1icyAgICAgPSAoY3VyX2ZyYW1lLT53aWR0aCAgKyAxNSkgLyAxNiwKKyAgICAgICAgLkZyYW1lSGVpZ2h0SW5NYnMgID0gKGN1cl9mcmFtZS0+aGVpZ2h0ICsgMTUpIC8gMTYsCisgICAgICAgIC5DdXJyUGljSWR4ICAgICAgICA9IGNmLT5pZHgsCisgICAgICAgIC5maWVsZF9waWNfZmxhZyAgICA9IHYtPmZpZWxkX21vZGUsCisgICAgICAgIC5ib3R0b21fZmllbGRfZmxhZyA9IHYtPmN1cl9maWVsZF90eXBlLAorICAgICAgICAuc2Vjb25kX2ZpZWxkICAgICAgPSB2LT5zZWNvbmRfZmllbGQsCisKKyAgICAgICAgLmludHJhX3BpY19mbGFnICAgID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQkksCisgICAgICAgIC5yZWZfcGljX2ZsYWcgICAgICA9IHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AsCisKKyAgICAgICAgLkNvZGVjU3BlY2lmaWMudmMxID0geworICAgICAgICAgICAgLkZvcndhcmRSZWZJZHggICAgID0gZmZfbnZkZWNfZ2V0X3JlZl9pZHgocy0+bGFzdF9waWN0dXJlLmYpLAorICAgICAgICAgICAgLkJhY2t3YXJkUmVmSWR4ICAgID0gZmZfbnZkZWNfZ2V0X3JlZl9pZHgocy0+bmV4dF9waWN0dXJlLmYpLAorICAgICAgICAgICAgLkZyYW1lV2lkdGggICAgICAgID0gY3VyX2ZyYW1lLT53aWR0aCwKKyAgICAgICAgICAgIC5GcmFtZUhlaWdodCAgICAgICA9IGN1cl9mcmFtZS0+aGVpZ2h0LAorCisgICAgICAgICAgICAuaW50cmFfcGljX2ZsYWcgICAgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQkksCisgICAgICAgICAgICAucmVmX3BpY19mbGFnICAgICAgPSBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCwKKyAgICAgICAgICAgIC5wcm9ncmVzc2l2ZV9mY20gICA9IHYtPmZjbSA9PSAwLAorCisgICAgICAgICAgICAucHJvZmlsZSAgICAgICAgICAgPSB2LT5wcm9maWxlLAorICAgICAgICAgICAgLnBvc3Rwcm9jZmxhZyAgICAgID0gdi0+cG9zdHByb2NmbGFnLAorICAgICAgICAgICAgLnB1bGxkb3duICAgICAgICAgID0gdi0+YnJvYWRjYXN0LAorICAgICAgICAgICAgLmludGVybGFjZSAgICAgICAgID0gdi0+aW50ZXJsYWNlLAorICAgICAgICAgICAgLnRmY250cmZsYWcgICAgICAgID0gdi0+dGZjbnRyZmxhZywKKyAgICAgICAgICAgIC5maW50ZXJwZmxhZyAgICAgICA9IHYtPmZpbnRlcnBmbGFnLAorICAgICAgICAgICAgLnBzZiAgICAgICAgICAgICAgID0gdi0+cHNmLAorICAgICAgICAgICAgLm11bHRpcmVzICAgICAgICAgID0gdi0+bXVsdGlyZXMsCisgICAgICAgICAgICAuc3luY21hcmtlciAgICAgICAgPSB2LT5yZXN5bmNfbWFya2VyLAorICAgICAgICAgICAgLnJhbmdlcmVkICAgICAgICAgID0gdi0+cmFuZ2VyZWQsCisgICAgICAgICAgICAubWF4YmZyYW1lcyAgICAgICAgPSBzLT5tYXhfYl9mcmFtZXMsCisKKyAgICAgICAgICAgIC5wYW5zY2FuX2ZsYWcgICAgICA9IHYtPnBhbnNjYW5mbGFnLAorICAgICAgICAgICAgLnJlZmRpc3RfZmxhZyAgICAgID0gdi0+cmVmZGlzdF9mbGFnLAorICAgICAgICAgICAgLmV4dGVuZGVkX212ICAgICAgID0gdi0+ZXh0ZW5kZWRfbXYsCisgICAgICAgICAgICAuZHF1YW50ICAgICAgICAgICAgPSB2LT5kcXVhbnQsCisgICAgICAgICAgICAudnN0cmFuc2Zvcm0gICAgICAgPSB2LT52c3RyYW5zZm9ybSwKKyAgICAgICAgICAgIC5sb29wZmlsdGVyICAgICAgICA9IHYtPnMubG9vcF9maWx0ZXIsCisgICAgICAgICAgICAuZmFzdHV2bWMgICAgICAgICAgPSB2LT5mYXN0dXZtYywKKyAgICAgICAgICAgIC5vdmVybGFwICAgICAgICAgICA9IHYtPm92ZXJsYXAsCisgICAgICAgICAgICAucXVhbnRpemVyICAgICAgICAgPSB2LT5xdWFudGl6ZXJfbW9kZSwKKyAgICAgICAgICAgIC5leHRlbmRlZF9kbXYgICAgICA9IHYtPmV4dGVuZGVkX2RtdiwKKyAgICAgICAgICAgIC5yYW5nZV9tYXB5X2ZsYWcgICA9IHYtPnJhbmdlX21hcHlfZmxhZywKKyAgICAgICAgICAgIC5yYW5nZV9tYXB5ICAgICAgICA9IHYtPnJhbmdlX21hcHksCisgICAgICAgICAgICAucmFuZ2VfbWFwdXZfZmxhZyAgPSB2LT5yYW5nZV9tYXB1dl9mbGFnLAorICAgICAgICAgICAgLnJhbmdlX21hcHV2ICAgICAgID0gdi0+cmFuZ2VfbWFwdXYsCisgICAgICAgICAgICAucmFuZ2VyZWRmcm0gICAgICAgPSB2LT5yYW5nZXJlZGZybSwKKyAgICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudmRlY192YzFfZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eCkKK3sKKyAgICAvLyBFYWNoIGZyYW1lIGNhbiBhdCBtb3N0IGhhdmUgb25lIFAgYW5kIG9uZSBCIHJlZmVyZW5jZQorICAgIHJldHVybiBmZl9udmRlY19mcmFtZV9wYXJhbXMoYXZjdHgsIGh3X2ZyYW1lc19jdHgsIDIpOworfQorCitjb25zdCBBVkhXQWNjZWwgZmZfdmMxX252ZGVjX2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgID0gInZjMV9udmRlYyIsCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKKyAgICAucGl4X2ZtdCAgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX0NVREEsCisgICAgLnN0YXJ0X2ZyYW1lICAgICAgICAgID0gbnZkZWNfdmMxX3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICAgICAgICA9IGZmX252ZGVjX3NpbXBsZV9lbmRfZnJhbWUsCisgICAgLmRlY29kZV9zbGljZSAgICAgICAgID0gZmZfbnZkZWNfc2ltcGxlX2RlY29kZV9zbGljZSwKKyAgICAuZnJhbWVfcGFyYW1zICAgICAgICAgPSBudmRlY192YzFfZnJhbWVfcGFyYW1zLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICA9IGZmX252ZGVjX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9IGZmX252ZGVjX2RlY29kZV91bmluaXQsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKE5WREVDQ29udGV4dCksCit9OworCisjaWYgQ09ORklHX1dNVjNfTlZERUNfSFdBQ0NFTAorY29uc3QgQVZIV0FjY2VsIGZmX3dtdjNfbnZkZWNfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAid212M19udmRlYyIsCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjMsCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9DVURBLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9IG52ZGVjX3ZjMV9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSBmZl9udmRlY19zaW1wbGVfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9IGZmX252ZGVjX3NpbXBsZV9kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3BhcmFtcyAgICAgICAgID0gbnZkZWNfdmMxX2ZyYW1lX3BhcmFtcywKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihOVkRFQ0NvbnRleHQpLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9udmRlY192cDguYyBiL2xpYmF2Y29kZWMvbnZkZWNfdnA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IzNzQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvbnZkZWNfdnA4LmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBWUDggSFcgZGVjb2RlIGFjY2VsZXJhdGlvbiB0aHJvdWdoIE5WREVDCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBoaWxpcCBMYW5nZGFsZQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgIm52ZGVjLmgiCisjaW5jbHVkZSAiZGVjb2RlLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2cDguaCIKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2FmZV9nZXRfcmVmX2lkeChWUDhGcmFtZSAqZnJhbWUpCit7CisgICAgcmV0dXJuIGZyYW1lID8gZmZfbnZkZWNfZ2V0X3JlZl9pZHgoZnJhbWUtPnRmLmYpIDogMjU1OworfQorCitzdGF0aWMgaW50IG52ZGVjX3ZwOF9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBWUDhDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIE5WREVDQ29udGV4dCAgICAgICpjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIENVVklEUElDUEFSQU1TICAgICAqcHAgPSAmY3R4LT5waWNfcGFyYW1zOworICAgIEZyYW1lRGVjb2RlRGF0YSAqZmRkOworICAgIE5WREVDRnJhbWUgKmNmOworICAgIEFWRnJhbWUgKmN1cl9mcmFtZSA9IGgtPmZyYW1lcFtWUDU2X0ZSQU1FX0NVUlJFTlRdLT50Zi5mOworCisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX252ZGVjX3N0YXJ0X2ZyYW1lKGF2Y3R4LCBjdXJfZnJhbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZmRkID0gKEZyYW1lRGVjb2RlRGF0YSopY3VyX2ZyYW1lLT5wcml2YXRlX3JlZi0+ZGF0YTsKKyAgICBjZiAgPSAoTlZERUNGcmFtZSopZmRkLT5od2FjY2VsX3ByaXY7CisKKyAgICAqcHAgPSAoQ1VWSURQSUNQQVJBTVMpIHsKKyAgICAgICAgLlBpY1dpZHRoSW5NYnMgICAgID0gKGN1cl9mcmFtZS0+d2lkdGggICsgMTUpIC8gMTYsCisgICAgICAgIC5GcmFtZUhlaWdodEluTWJzICA9IChjdXJfZnJhbWUtPmhlaWdodCArIDE1KSAvIDE2LAorICAgICAgICAuQ3VyclBpY0lkeCAgICAgICAgPSBjZi0+aWR4LAorCisgICAgICAgIC5Db2RlY1NwZWNpZmljLnZwOCA9IHsKKyAgICAgICAgICAgIC53aWR0aCAgICAgICAgICAgICAgICAgICAgICAgPSBjdXJfZnJhbWUtPndpZHRoLAorICAgICAgICAgICAgLmhlaWdodCAgICAgICAgICAgICAgICAgICAgICA9IGN1cl9mcmFtZS0+aGVpZ2h0LAorCisgICAgICAgICAgICAuZmlyc3RfcGFydGl0aW9uX3NpemUgICAgICAgID0gaC0+aGVhZGVyX3BhcnRpdGlvbl9zaXplLAorCisgICAgICAgICAgICAuTGFzdFJlZklkeCAgICAgICAgICAgICAgICAgID0gc2FmZV9nZXRfcmVmX2lkeChoLT5mcmFtZXBbVlA1Nl9GUkFNRV9QUkVWSU9VU10pLAorICAgICAgICAgICAgLkdvbGRlblJlZklkeCAgICAgICAgICAgICAgICA9IHNhZmVfZ2V0X3JlZl9pZHgoaC0+ZnJhbWVwW1ZQNTZfRlJBTUVfR09MREVOXSksCisgICAgICAgICAgICAuQWx0UmVmSWR4ICAgICAgICAgICAgICAgICAgID0gc2FmZV9nZXRfcmVmX2lkeChoLT5mcmFtZXBbVlA1Nl9GUkFNRV9HT0xERU4yXSksCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRXhwbGljaXQgYnJhY2VzIGZvciBhbm9ueW1vdXMgaW5uZXJzIGFuZCB1bm5hbWVkIGZpZWxkcworICAgICAgICAgICAgICogdG8gd29yayBhcm91bmQgbGltaXRhdGlvbnMgaW4gYW5jaWVudCB2ZXJzaW9ucyBvZiBnY2MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHsgLy8gdW5pb24KKyAgICAgICAgICAgICAgICB7IC8vIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAhaC0+a2V5ZnJhbWUsICAgICAgICAgICAgIC8vIGZyYW1lX3R5cGUKKyAgICAgICAgICAgICAgICAgICAgaC0+cHJvZmlsZSwgICAgICAgICAgICAgICAvLyB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICFoLT5pbnZpc2libGUsICAgICAgICAgICAgLy8gc2hvd19mcmFtZQorICAgICAgICAgICAgICAgICAgICBoLT5zZWdtZW50YXRpb24uZW5hYmxlZCA/IC8vIHVwZGF0ZV9tYl9zZWdtZW50YXRpb25fZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgaC0+c2VnbWVudGF0aW9uLnVwZGF0ZV9mZWF0dXJlX2RhdGEgOiAwLAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudmRlY192cDhfZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eCkKK3sKKyAgICAvLyBWUDggdXNlcyBhIGZpeGVkIHNpemUgcG9vbCBvZiAzIHBvc3NpYmxlIHJlZmVyZW5jZSBmcmFtZXMKKyAgICByZXR1cm4gZmZfbnZkZWNfZnJhbWVfcGFyYW1zKGF2Y3R4LCBod19mcmFtZXNfY3R4LCAzKTsKK30KKworQVZIV0FjY2VsIGZmX3ZwOF9udmRlY19od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJ2cDhfbnZkZWMiLAorICAgIC50eXBlICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDgsCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9DVURBLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9IG52ZGVjX3ZwOF9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSBmZl9udmRlY19zaW1wbGVfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9IGZmX252ZGVjX3NpbXBsZV9kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3BhcmFtcyAgICAgICAgID0gbnZkZWNfdnA4X2ZyYW1lX3BhcmFtcywKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgICAgICAgPSBmZl9udmRlY19kZWNvZGVfdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihOVkRFQ0NvbnRleHQpLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbnZkZWNfdnA5LmMgYi9saWJhdmNvZGVjL252ZGVjX3ZwOS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNjY1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL252ZGVjX3ZwOS5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogVlA5IEhXIGRlY29kZSBhY2NlbGVyYXRpb24gdGhyb3VnaCBOVkRFQworICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBUaW1vIFJvdGhlbnBpZWxlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJudmRlYy5oIgorI2luY2x1ZGUgImRlY29kZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidnA5c2hhcmVkLmgiCisKK3N0YXRpYyBpbnQgbnZkZWNfdnA5X3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQoreworICAgIFZQOVNoYXJlZENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnN3X3BpeF9mbXQpOworCisgICAgTlZERUNDb250ZXh0ICAgICAgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgQ1VWSURQSUNQQVJBTVMgICAgICpwcCA9ICZjdHgtPnBpY19wYXJhbXM7CisgICAgQ1VWSURWUDlQSUNQQVJBTVMgKnBwYyA9ICZwcC0+Q29kZWNTcGVjaWZpYy52cDk7CisgICAgRnJhbWVEZWNvZGVEYXRhICpmZGQ7CisgICAgTlZERUNGcmFtZSAqY2Y7CisgICAgQVZGcmFtZSAqY3VyX2ZyYW1lID0gaC0+ZnJhbWVzW0NVUl9GUkFNRV0udGYuZjsKKworICAgIGludCByZXQsIGk7CisKKyAgICByZXQgPSBmZl9udmRlY19zdGFydF9mcmFtZShhdmN0eCwgY3VyX2ZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZkZCA9IChGcmFtZURlY29kZURhdGEqKWN1cl9mcmFtZS0+cHJpdmF0ZV9yZWYtPmRhdGE7CisgICAgY2YgID0gKE5WREVDRnJhbWUqKWZkZC0+aHdhY2NlbF9wcml2OworCisgICAgKnBwID0gKENVVklEUElDUEFSQU1TKSB7CisgICAgICAgIC5QaWNXaWR0aEluTWJzICAgICA9IChjdXJfZnJhbWUtPndpZHRoICArIDE1KSAvIDE2LAorICAgICAgICAuRnJhbWVIZWlnaHRJbk1icyAgPSAoY3VyX2ZyYW1lLT5oZWlnaHQgKyAxNSkgLyAxNiwKKyAgICAgICAgLkN1cnJQaWNJZHggICAgICAgID0gY2YtPmlkeCwKKworICAgICAgICAuQ29kZWNTcGVjaWZpYy52cDkgPSB7CisgICAgICAgICAgICAud2lkdGggICAgICAgICAgICAgICAgICAgID0gY3VyX2ZyYW1lLT53aWR0aCwKKyAgICAgICAgICAgIC5oZWlnaHQgICAgICAgICAgICAgICAgICAgPSBjdXJfZnJhbWUtPmhlaWdodCwKKworICAgICAgICAgICAgLkxhc3RSZWZJZHggICAgICAgICAgICAgICA9IGZmX252ZGVjX2dldF9yZWZfaWR4KGgtPnJlZnNbaC0+aC5yZWZpZHhbMF1dLmYpLAorICAgICAgICAgICAgLkdvbGRlblJlZklkeCAgICAgICAgICAgICA9IGZmX252ZGVjX2dldF9yZWZfaWR4KGgtPnJlZnNbaC0+aC5yZWZpZHhbMV1dLmYpLAorICAgICAgICAgICAgLkFsdFJlZklkeCAgICAgICAgICAgICAgICA9IGZmX252ZGVjX2dldF9yZWZfaWR4KGgtPnJlZnNbaC0+aC5yZWZpZHhbMl1dLmYpLAorCisgICAgICAgICAgICAucHJvZmlsZSAgICAgICAgICAgICAgICAgID0gaC0+aC5wcm9maWxlLAorICAgICAgICAgICAgLmZyYW1lQ29udGV4dElkeCAgICAgICAgICA9IGgtPmguZnJhbWVjdHhpZCwKKyAgICAgICAgICAgIC5mcmFtZVR5cGUgICAgICAgICAgICAgICAgPSAhaC0+aC5rZXlmcmFtZSwKKyAgICAgICAgICAgIC5zaG93RnJhbWUgICAgICAgICAgICAgICAgPSAhaC0+aC5pbnZpc2libGUsCisgICAgICAgICAgICAuZXJyb3JSZXNpbGllbnQgICAgICAgICAgID0gaC0+aC5lcnJvcnJlcywKKyAgICAgICAgICAgIC5mcmFtZVBhcmFsbGVsRGVjb2RpbmcgICAgPSBoLT5oLnBhcmFsbGVsbW9kZSwKKyAgICAgICAgICAgIC5zdWJTYW1wbGluZ1ggICAgICAgICAgICAgPSBwaXhkZXNjLT5sb2cyX2Nocm9tYV93LAorICAgICAgICAgICAgLnN1YlNhbXBsaW5nWSAgICAgICAgICAgICA9IHBpeGRlc2MtPmxvZzJfY2hyb21hX2gsCisgICAgICAgICAgICAuaW50cmFPbmx5ICAgICAgICAgICAgICAgID0gaC0+aC5pbnRyYW9ubHksCisgICAgICAgICAgICAuYWxsb3dfaGlnaF9wcmVjaXNpb25fbXYgID0gaC0+aC5rZXlmcmFtZSA/IDAgOiBoLT5oLmhpZ2hwcmVjaXNpb25tdnMsCisgICAgICAgICAgICAucmVmcmVzaEVudHJvcHlQcm9icyAgICAgID0gaC0+aC5yZWZyZXNoY3R4LAorCisgICAgICAgICAgICAuYml0RGVwdGhNaW51czhMdW1hICAgICAgID0gcGl4ZGVzYy0+Y29tcFswXS5kZXB0aCAtIDgsCisgICAgICAgICAgICAuYml0RGVwdGhNaW51czhDaHJvbWEgICAgID0gcGl4ZGVzYy0+Y29tcFsxXS5kZXB0aCAtIDgsCisKKyAgICAgICAgICAgIC5sb29wRmlsdGVyTGV2ZWwgICAgICAgICAgPSBoLT5oLmZpbHRlci5sZXZlbCwKKyAgICAgICAgICAgIC5sb29wRmlsdGVyU2hhcnBuZXNzICAgICAgPSBoLT5oLmZpbHRlci5zaGFycG5lc3MsCisgICAgICAgICAgICAubW9kZVJlZkxmRW5hYmxlZCAgICAgICAgID0gaC0+aC5sZl9kZWx0YS5lbmFibGVkLAorCisgICAgICAgICAgICAubG9nMl90aWxlX2NvbHVtbnMgICAgICAgID0gaC0+aC50aWxpbmcubG9nMl90aWxlX2NvbHMsCisgICAgICAgICAgICAubG9nMl90aWxlX3Jvd3MgICAgICAgICAgID0gaC0+aC50aWxpbmcubG9nMl90aWxlX3Jvd3MsCisKKyAgICAgICAgICAgIC5zZWdtZW50RW5hYmxlZCAgICAgICAgICAgPSBoLT5oLnNlZ21lbnRhdGlvbi5lbmFibGVkLAorICAgICAgICAgICAgLnNlZ21lbnRNYXBVcGRhdGUgICAgICAgICA9IGgtPmguc2VnbWVudGF0aW9uLnVwZGF0ZV9tYXAsCisgICAgICAgICAgICAuc2VnbWVudE1hcFRlbXBvcmFsVXBkYXRlID0gaC0+aC5zZWdtZW50YXRpb24udGVtcG9yYWwsCisgICAgICAgICAgICAuc2VnbWVudEZlYXR1cmVNb2RlICAgICAgID0gaC0+aC5zZWdtZW50YXRpb24uYWJzb2x1dGVfdmFscywKKworICAgICAgICAgICAgLnFwWUFjICAgICAgICAgICAgICAgICAgICA9IGgtPmgueWFjX3FpLAorICAgICAgICAgICAgLnFwWURjICAgICAgICAgICAgICAgICAgICA9IGgtPmgueWRjX3FkZWx0YSwKKyAgICAgICAgICAgIC5xcENoRGMgICAgICAgICAgICAgICAgICAgPSBoLT5oLnV2ZGNfcWRlbHRhLAorICAgICAgICAgICAgLnFwQ2hBYyAgICAgICAgICAgICAgICAgICA9IGgtPmgudXZhY19xZGVsdGEsCisKKyAgICAgICAgICAgIC5yZXNldEZyYW1lQ29udGV4dCAgICAgICAgPSBoLT5oLnJlc2V0Y3R4LAorICAgICAgICAgICAgLm1jb21wX2ZpbHRlcl90eXBlICAgICAgICA9IGgtPmguZmlsdGVybW9kZSBeIChoLT5oLmZpbHRlcm1vZGUgPD0gMSksCisKKyAgICAgICAgICAgIC5mcmFtZVRhZ1NpemUgICAgICAgICAgICAgPSBoLT5oLnVuY29tcHJlc3NlZF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgIC5vZmZzZXRUb0RjdFBhcnRzICAgICAgICAgPSBoLT5oLmNvbXByZXNzZWRfaGVhZGVyX3NpemUsCisKKyAgICAgICAgICAgIC5yZWZGcmFtZVNpZ25CaWFzWzBdICAgICAgPSAwLAorICAgICAgICB9CisgICAgfTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHBwYy0+bWJNb2RlTGZEZWx0YVtpXSA9IGgtPmgubGZfZGVsdGEubW9kZVtpXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHBwYy0+bWJSZWZMZkRlbHRhW2ldID0gaC0+aC5sZl9kZWx0YS5yZWZbaV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICBwcGMtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1tpXSA9IGgtPmguc2VnbWVudGF0aW9uLnByb2JbaV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIHBwYy0+YWN0aXZlUmVmSWR4W2ldID0gaC0+aC5yZWZpZHhbaV07CisgICAgICAgIHBwYy0+c2VnbWVudF9wcmVkX3Byb2JzW2ldID0gaC0+aC5zZWdtZW50YXRpb24ucHJlZF9wcm9iW2ldOworICAgICAgICBwcGMtPnJlZkZyYW1lU2lnbkJpYXNbaSArIDFdID0gaC0+aC5zaWduYmlhc1tpXTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHBwYy0+c2VnbWVudEZlYXR1cmVFbmFibGVbaV1bMF0gPSBoLT5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLnFfZW5hYmxlZDsKKyAgICAgICAgcHBjLT5zZWdtZW50RmVhdHVyZUVuYWJsZVtpXVsxXSA9IGgtPmguc2VnbWVudGF0aW9uLmZlYXRbaV0ubGZfZW5hYmxlZDsKKyAgICAgICAgcHBjLT5zZWdtZW50RmVhdHVyZUVuYWJsZVtpXVsyXSA9IGgtPmguc2VnbWVudGF0aW9uLmZlYXRbaV0ucmVmX2VuYWJsZWQ7CisgICAgICAgIHBwYy0+c2VnbWVudEZlYXR1cmVFbmFibGVbaV1bM10gPSBoLT5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLnNraXBfZW5hYmxlZDsKKworICAgICAgICBwcGMtPnNlZ21lbnRGZWF0dXJlRGF0YVtpXVswXSA9IGgtPmguc2VnbWVudGF0aW9uLmZlYXRbaV0ucV92YWw7CisgICAgICAgIHBwYy0+c2VnbWVudEZlYXR1cmVEYXRhW2ldWzFdID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5sZl92YWw7CisgICAgICAgIHBwYy0+c2VnbWVudEZlYXR1cmVEYXRhW2ldWzJdID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5yZWZfdmFsOworICAgICAgICBwcGMtPnNlZ21lbnRGZWF0dXJlRGF0YVtpXVszXSA9IDA7CisgICAgfQorCisgICAgc3dpdGNoIChhdmN0eC0+Y29sb3JzcGFjZSkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSBBVkNPTF9TUENfVU5TUEVDSUZJRUQ6CisgICAgICAgIHBwYy0+Y29sb3JTcGFjZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZDT0xfU1BDX0JUNDcwQkc6CisgICAgICAgIHBwYy0+Y29sb3JTcGFjZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZDT0xfU1BDX0JUNzA5OgorICAgICAgICBwcGMtPmNvbG9yU3BhY2UgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWQ09MX1NQQ19TTVBURTE3ME06CisgICAgICAgIHBwYy0+Y29sb3JTcGFjZSA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZDT0xfU1BDX1NNUFRFMjQwTToKKyAgICAgICAgcHBjLT5jb2xvclNwYWNlID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVkNPTF9TUENfQlQyMDIwX05DTDoKKyAgICAgICAgcHBjLT5jb2xvclNwYWNlID0gNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVkNPTF9TUENfUkVTRVJWRUQ6CisgICAgICAgIHBwYy0+Y29sb3JTcGFjZSA9IDY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZDT0xfU1BDX1JHQjoKKyAgICAgICAgcHBjLT5jb2xvclNwYWNlID0gNzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnZkZWNfdnA5X2ZyYW1lX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19jdHgpCit7CisgICAgLy8gVlA5IHVzZXMgYSBmaXhlZCBzaXplIHBvb2wgb2YgOCBwb3NzaWJsZSByZWZlcmVuY2UgZnJhbWVzCisgICAgcmV0dXJuIGZmX252ZGVjX2ZyYW1lX3BhcmFtcyhhdmN0eCwgaHdfZnJhbWVzX2N0eCwgOCk7Cit9CisKK2NvbnN0IEFWSFdBY2NlbCBmZl92cDlfbnZkZWNfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAidnA5X252ZGVjIiwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA5LAorICAgIC5waXhfZm10ICAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfQ1VEQSwKKyAgICAuc3RhcnRfZnJhbWUgICAgICAgICAgPSBudmRlY192cDlfc3RhcnRfZnJhbWUsCisgICAgLmVuZF9mcmFtZSAgICAgICAgICAgID0gZmZfbnZkZWNfc2ltcGxlX2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgICAgICAgPSBmZl9udmRlY19zaW1wbGVfZGVjb2RlX3NsaWNlLAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9IG52ZGVjX3ZwOV9mcmFtZV9wYXJhbXMsCisgICAgLmluaXQgICAgICAgICAgICAgICAgID0gZmZfbnZkZWNfZGVjb2RlX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgICAgICAgID0gZmZfbnZkZWNfZGVjb2RlX3VuaW5pdCwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgPSBzaXplb2YoTlZERUNDb250ZXh0KSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL252ZW5jLmMgYi9saWJhdmNvZGVjL252ZW5jLmMKaW5kZXggYTNiMDJmYS4uYzE0MTEyYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9udmVuYy5jCisrKyBiL2xpYmF2Y29kZWMvbnZlbmMuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBILjI2NCBoYXJkd2FyZSBlbmNvZGluZyB1c2luZyBudmlkaWEgbnZlbmMKLSAqIENvcHlyaWdodCAoYykgMjAxNCBUaW1vIFJvdGhlbnBpZWxlciA8dGltb0Byb3RoZW5waWVsZXIub3JnPgorICogSC4yNjQvSEVWQyBoYXJkd2FyZSBlbmNvZGluZyB1c2luZyBudmlkaWEgbnZlbmMKKyAqIENvcHlyaWdodCAoYykgMjAxNiBUaW1vIFJvdGhlbnBpZWxlciA8dGltb0Byb3RoZW5waWVsZXIub3JnPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0xOSw3NTMgKzE5LDgwNCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpZiBkZWZpbmVkKF9XSU4zMikKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZWxzZQotI2luY2x1ZGUgPGRsZmNuLmg+Ci0jZW5kaWYKKyNpbmNsdWRlICJjb25maWcuaCIKIAotI2luY2x1ZGUgPG52RW5jb2RlQVBJLmg+CisjaW5jbHVkZSAibnZlbmMuaCIKIAotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfY3VkYS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAidGhyZWFkLmgiCiAKLSNpZiBkZWZpbmVkKF9XSU4zMikKLSNkZWZpbmUgQ1VEQUFQSSBfX3N0ZGNhbGwKLSNlbHNlCi0jZGVmaW5lIENVREFBUEkKKyNkZWZpbmUgTlZFTkNfQ0FQIDB4MzAKKyNkZWZpbmUgSVNfQ0JSKHJjKSAocmMgPT0gTlZfRU5DX1BBUkFNU19SQ19DQlIgfHwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByYyA9PSBOVl9FTkNfUEFSQU1TX1JDX0NCUl9MT1dERUxBWV9IUSB8fCBcCisgICAgICAgICAgICAgICAgICAgIHJjID09IE5WX0VOQ19QQVJBTVNfUkNfQ0JSX0hRKQorCitjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfbnZlbmNfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgQVZfUElYX0ZNVF9OVjEyLAorICAgIEFWX1BJWF9GTVRfUDAxMCwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgQVZfUElYX0ZNVF9QMDE2LCAgICAgIC8vIFRydW5jYXRlZCB0byAxMGJpdHMKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwgLy8gVHJ1bmNhdGVkIHRvIDEwYml0cworICAgIEFWX1BJWF9GTVRfMFJHQjMyLAorICAgIEFWX1BJWF9GTVRfMEJHUjMyLAorICAgIEFWX1BJWF9GTVRfQ1VEQSwKKyNpZiBDT05GSUdfRDNEMTFWQQorICAgIEFWX1BJWF9GTVRfRDNEMTEsCiAjZW5kaWYKLQotI2lmIGRlZmluZWQoX1dJTjMyKQotI2RlZmluZSBMT0FEX0ZVTkMobCwgcykgR2V0UHJvY0FkZHJlc3MobCwgcykKLSNkZWZpbmUgRExfQ0xPU0VfRlVOQyhsKSBGcmVlTGlicmFyeShsKQotI2Vsc2UKLSNkZWZpbmUgTE9BRF9GVU5DKGwsIHMpIGRsc3ltKGwsIHMpCi0jZGVmaW5lIERMX0NMT1NFX0ZVTkMobCkgZGxjbG9zZShsKQotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSBjdWRhRXJyb3JfZW51bSB7Ci0gICAgQ1VEQV9TVUNDRVNTID0gMAotfSBDVXJlc3VsdDsKLXR5cGVkZWYgaW50IENVZGV2aWNlOwotdHlwZWRlZiB2b2lkKiBDVWNvbnRleHQ7Ci0KLXR5cGVkZWYgQ1VyZXN1bHQoQ1VEQUFQSSAqUENVSU5JVCkodW5zaWduZWQgaW50IEZsYWdzKTsKLXR5cGVkZWYgQ1VyZXN1bHQoQ1VEQUFQSSAqUENVREVWSUNFR0VUQ09VTlQpKGludCAqY291bnQpOwotdHlwZWRlZiBDVXJlc3VsdChDVURBQVBJICpQQ1VERVZJQ0VHRVQpKENVZGV2aWNlICpkZXZpY2UsIGludCBvcmRpbmFsKTsKLXR5cGVkZWYgQ1VyZXN1bHQoQ1VEQUFQSSAqUENVREVWSUNFR0VUTkFNRSkoY2hhciAqbmFtZSwgaW50IGxlbiwgQ1VkZXZpY2UgZGV2KTsKLXR5cGVkZWYgQ1VyZXN1bHQoQ1VEQUFQSSAqUENVREVWSUNFQ09NUFVURUNBUEFCSUxJVFkpKGludCAqbWFqb3IsIGludCAqbWlub3IsIENVZGV2aWNlIGRldik7Ci10eXBlZGVmIENVcmVzdWx0KENVREFBUEkgKlBDVUNUWENSRUFURSkoQ1Vjb250ZXh0ICpwY3R4LCB1bnNpZ25lZCBpbnQgZmxhZ3MsIENVZGV2aWNlIGRldik7Ci10eXBlZGVmIENVcmVzdWx0KENVREFBUEkgKlBDVUNUWFBPUENVUlJFTlQpKENVY29udGV4dCAqcGN0eCk7Ci10eXBlZGVmIENVcmVzdWx0KENVREFBUEkgKlBDVUNUWERFU1RST1kpKENVY29udGV4dCBjdHgpOwotCi10eXBlZGVmIE5WRU5DU1RBVFVTIChOVkVOQ0FQSSogUE5WRU5DT0RFQVBJQ1JFQVRFSU5TVEFOQ0UpKE5WX0VOQ09ERV9BUElfRlVOQ1RJT05fTElTVCAqZnVuY3Rpb25MaXN0KTsKLQotdHlwZWRlZiBzdHJ1Y3QgTnZlbmNJbnB1dFN1cmZhY2UKLXsKLSAgICBOVl9FTkNfSU5QVVRfUFRSIGlucHV0X3N1cmZhY2U7Ci0gICAgaW50IHdpZHRoOwotICAgIGludCBoZWlnaHQ7Ci0KLSAgICBpbnQgbG9ja0NvdW50OwotCi0gICAgTlZfRU5DX0JVRkZFUl9GT1JNQVQgZm9ybWF0OwotfSBOdmVuY0lucHV0U3VyZmFjZTsKLQotdHlwZWRlZiBzdHJ1Y3QgTnZlbmNPdXRwdXRTdXJmYWNlCi17Ci0gICAgTlZfRU5DX09VVFBVVF9QVFIgb3V0cHV0X3N1cmZhY2U7Ci0gICAgaW50IHNpemU7Ci0KLSAgICBOdmVuY0lucHV0U3VyZmFjZSogaW5wdXRfc3VyZmFjZTsKLQotICAgIGludCBidXN5OwotfSBOdmVuY091dHB1dFN1cmZhY2U7Ci0KLXR5cGVkZWYgc3RydWN0IE52ZW5jRGF0YQotewotICAgIHVuaW9uIHsKLSAgICAgICAgaW50NjRfdCB0aW1lc3RhbXA7Ci0gICAgICAgIE52ZW5jT3V0cHV0U3VyZmFjZSAqc3VyZmFjZTsKLSAgICB9IHU7Ci19IE52ZW5jRGF0YTsKLQotdHlwZWRlZiBzdHJ1Y3QgTnZlbmNEYXRhTGlzdAotewotICAgIE52ZW5jRGF0YSogZGF0YTsKLQotICAgIHVpbnQzMl90IHBvczsKLSAgICB1aW50MzJfdCBjb3VudDsKLSAgICB1aW50MzJfdCBzaXplOwotfSBOdmVuY0RhdGFMaXN0OwotCi10eXBlZGVmIHN0cnVjdCBOdmVuY0R5bkxvYWRGdW5jdGlvbnMKLXsKLSAgICBQQ1VJTklUIGN1X2luaXQ7Ci0gICAgUENVREVWSUNFR0VUQ09VTlQgY3VfZGV2aWNlX2dldF9jb3VudDsKLSAgICBQQ1VERVZJQ0VHRVQgY3VfZGV2aWNlX2dldDsKLSAgICBQQ1VERVZJQ0VHRVROQU1FIGN1X2RldmljZV9nZXRfbmFtZTsKLSAgICBQQ1VERVZJQ0VDT01QVVRFQ0FQQUJJTElUWSBjdV9kZXZpY2VfY29tcHV0ZV9jYXBhYmlsaXR5OwotICAgIFBDVUNUWENSRUFURSBjdV9jdHhfY3JlYXRlOwotICAgIFBDVUNUWFBPUENVUlJFTlQgY3VfY3R4X3BvcF9jdXJyZW50OwotICAgIFBDVUNUWERFU1RST1kgY3VfY3R4X2Rlc3Ryb3k7Ci0KLSAgICBOVl9FTkNPREVfQVBJX0ZVTkNUSU9OX0xJU1QgbnZlbmNfZnVuY3M7Ci0gICAgaW50IG52ZW5jX2RldmljZV9jb3VudDsKLSAgICBDVWRldmljZSBudmVuY19kZXZpY2VzWzE2XTsKLQotI2lmIGRlZmluZWQoX1dJTjMyKQotICAgIEhNT0RVTEUgY3VkYV9saWI7Ci0gICAgSE1PRFVMRSBudmVuY19saWI7Ci0jZWxzZQotICAgIHZvaWQqIGN1ZGFfbGliOwotICAgIHZvaWQqIG52ZW5jX2xpYjsKLSNlbmRpZgotfSBOdmVuY0R5bkxvYWRGdW5jdGlvbnM7Ci0KLXR5cGVkZWYgc3RydWN0IE52ZW5jVmFsdWVQYWlyCi17Ci0gICAgY29uc3QgY2hhciAqc3RyOwotICAgIHVpbnQzMl90IG51bTsKLX0gTnZlbmNWYWx1ZVBhaXI7Ci0KLXR5cGVkZWYgc3RydWN0IE52ZW5jQ29udGV4dAotewotICAgIEFWQ2xhc3MgKmF2Y2xhc3M7Ci0KLSAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgbnZlbmNfZGxvYWRfZnVuY3M7Ci0KLSAgICBOVl9FTkNfSU5JVElBTElaRV9QQVJBTVMgaW5pdF9lbmNvZGVfcGFyYW1zOwotICAgIE5WX0VOQ19DT05GSUcgZW5jb2RlX2NvbmZpZzsKLSAgICBDVWNvbnRleHQgY3VfY29udGV4dDsKLQotICAgIGludCBtYXhfc3VyZmFjZV9jb3VudDsKLSAgICBOdmVuY0lucHV0U3VyZmFjZSAqaW5wdXRfc3VyZmFjZXM7Ci0gICAgTnZlbmNPdXRwdXRTdXJmYWNlICpvdXRwdXRfc3VyZmFjZXM7Ci0KLSAgICBOdmVuY0RhdGFMaXN0IG91dHB1dF9zdXJmYWNlX3F1ZXVlOwotICAgIE52ZW5jRGF0YUxpc3Qgb3V0cHV0X3N1cmZhY2VfcmVhZHlfcXVldWU7Ci0gICAgTnZlbmNEYXRhTGlzdCB0aW1lc3RhbXBfbGlzdDsKLSAgICBpbnQ2NF90IGxhc3RfZHRzOwotCi0gICAgdm9pZCAqbnZlbmNvZGVyOwotCi0gICAgY2hhciAqcHJlc2V0OwotICAgIGNoYXIgKnByb2ZpbGU7Ci0gICAgY2hhciAqbGV2ZWw7Ci0gICAgY2hhciAqdGllcjsKLSAgICBpbnQgY2JyOwotICAgIGludCB0d29wYXNzOwotICAgIGludCBncHU7Ci0gICAgaW50IGJ1ZmZlcl9kZWxheTsKLX0gTnZlbmNDb250ZXh0OwotCi1zdGF0aWMgY29uc3QgTnZlbmNWYWx1ZVBhaXIgbnZlbmNfaDI2NF9sZXZlbF9wYWlyc1tdID0gewotICAgIHsgImF1dG8iLCBOVl9FTkNfTEVWRUxfQVVUT1NFTEVDVCB9LAotICAgIHsgIjEiICAgLCBOVl9FTkNfTEVWRUxfSDI2NF8xICAgICB9LAotICAgIHsgIjEuMCIgLCBOVl9FTkNfTEVWRUxfSDI2NF8xICAgICB9LAotICAgIHsgIjFiIiAgLCBOVl9FTkNfTEVWRUxfSDI2NF8xYiAgICB9LAotICAgIHsgIjEuMGIiLCBOVl9FTkNfTEVWRUxfSDI2NF8xYiAgICB9LAotICAgIHsgIjEuMSIgLCBOVl9FTkNfTEVWRUxfSDI2NF8xMSAgICB9LAotICAgIHsgIjEuMiIgLCBOVl9FTkNfTEVWRUxfSDI2NF8xMiAgICB9LAotICAgIHsgIjEuMyIgLCBOVl9FTkNfTEVWRUxfSDI2NF8xMyAgICB9LAotICAgIHsgIjIiICAgLCBOVl9FTkNfTEVWRUxfSDI2NF8yICAgICB9LAotICAgIHsgIjIuMCIgLCBOVl9FTkNfTEVWRUxfSDI2NF8yICAgICB9LAotICAgIHsgIjIuMSIgLCBOVl9FTkNfTEVWRUxfSDI2NF8yMSAgICB9LAotICAgIHsgIjIuMiIgLCBOVl9FTkNfTEVWRUxfSDI2NF8yMiAgICB9LAotICAgIHsgIjMiICAgLCBOVl9FTkNfTEVWRUxfSDI2NF8zICAgICB9LAotICAgIHsgIjMuMCIgLCBOVl9FTkNfTEVWRUxfSDI2NF8zICAgICB9LAotICAgIHsgIjMuMSIgLCBOVl9FTkNfTEVWRUxfSDI2NF8zMSAgICB9LAotICAgIHsgIjMuMiIgLCBOVl9FTkNfTEVWRUxfSDI2NF8zMiAgICB9LAotICAgIHsgIjQiICAgLCBOVl9FTkNfTEVWRUxfSDI2NF80ICAgICB9LAotICAgIHsgIjQuMCIgLCBOVl9FTkNfTEVWRUxfSDI2NF80ICAgICB9LAotICAgIHsgIjQuMSIgLCBOVl9FTkNfTEVWRUxfSDI2NF80MSAgICB9LAotICAgIHsgIjQuMiIgLCBOVl9FTkNfTEVWRUxfSDI2NF80MiAgICB9LAotICAgIHsgIjUiICAgLCBOVl9FTkNfTEVWRUxfSDI2NF81ICAgICB9LAotICAgIHsgIjUuMCIgLCBOVl9FTkNfTEVWRUxfSDI2NF81ICAgICB9LAotICAgIHsgIjUuMSIgLCBOVl9FTkNfTEVWRUxfSDI2NF81MSAgICB9LAotICAgIHsgTlVMTCB9CisgICAgQVZfUElYX0ZNVF9OT05FCiB9OwogCi1zdGF0aWMgY29uc3QgTnZlbmNWYWx1ZVBhaXIgbnZlbmNfaGV2Y19sZXZlbF9wYWlyc1tdID0gewotICAgIHsgImF1dG8iLCBOVl9FTkNfTEVWRUxfQVVUT1NFTEVDVCB9LAotICAgIHsgIjEiICAgLCBOVl9FTkNfTEVWRUxfSEVWQ18xICAgICB9LAotICAgIHsgIjEuMCIgLCBOVl9FTkNfTEVWRUxfSEVWQ18xICAgICB9LAotICAgIHsgIjIiICAgLCBOVl9FTkNfTEVWRUxfSEVWQ18yICAgICB9LAotICAgIHsgIjIuMCIgLCBOVl9FTkNfTEVWRUxfSEVWQ18yICAgICB9LAotICAgIHsgIjIuMSIgLCBOVl9FTkNfTEVWRUxfSEVWQ18yMSAgICB9LAotICAgIHsgIjMiICAgLCBOVl9FTkNfTEVWRUxfSEVWQ18zICAgICB9LAotICAgIHsgIjMuMCIgLCBOVl9FTkNfTEVWRUxfSEVWQ18zICAgICB9LAotICAgIHsgIjMuMSIgLCBOVl9FTkNfTEVWRUxfSEVWQ18zMSAgICB9LAotICAgIHsgIjQiICAgLCBOVl9FTkNfTEVWRUxfSEVWQ180ICAgICB9LAotICAgIHsgIjQuMCIgLCBOVl9FTkNfTEVWRUxfSEVWQ180ICAgICB9LAotICAgIHsgIjQuMSIgLCBOVl9FTkNfTEVWRUxfSEVWQ180MSAgICB9LAotICAgIHsgIjUiICAgLCBOVl9FTkNfTEVWRUxfSEVWQ181ICAgICB9LAotICAgIHsgIjUuMCIgLCBOVl9FTkNfTEVWRUxfSEVWQ181ICAgICB9LAotICAgIHsgIjUuMSIgLCBOVl9FTkNfTEVWRUxfSEVWQ181MSAgICB9LAotICAgIHsgIjUuMiIgLCBOVl9FTkNfTEVWRUxfSEVWQ181MiAgICB9LAotICAgIHsgIjYiICAgLCBOVl9FTkNfTEVWRUxfSEVWQ182ICAgICB9LAotICAgIHsgIjYuMCIgLCBOVl9FTkNfTEVWRUxfSEVWQ182ICAgICB9LAotICAgIHsgIjYuMSIgLCBOVl9FTkNfTEVWRUxfSEVWQ182MSAgICB9LAotICAgIHsgIjYuMiIgLCBOVl9FTkNfTEVWRUxfSEVWQ182MiAgICB9LAotICAgIHsgTlVMTCB9CisjZGVmaW5lIElTXzEwQklUKHBpeF9mbXQpICAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1AwMTAgICAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QMDE2ICAgIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UDE2KQorCisjZGVmaW5lIElTX1lVVjQ0NChwaXhfZm10KSAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFAgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQMTYpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIE5WRU5DU1RBVFVTIG52ZXJyOworICAgIGludCAgICAgICAgIGF2ZXJyOworICAgIGNvbnN0IGNoYXIgKmRlc2M7Cit9IG52ZW5jX2Vycm9yc1tdID0geworICAgIHsgTlZfRU5DX1NVQ0NFU1MsICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICJzdWNjZXNzIiAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBOVl9FTkNfRVJSX05PX0VOQ09ERV9ERVZJQ0UsICAgICAgICAgQVZFUlJPUihFTk9FTlQpLCAgIm5vIGVuY29kZSBkZXZpY2UiICAgICAgICAgfSwKKyAgICB7IE5WX0VOQ19FUlJfVU5TVVBQT1JURURfREVWSUNFLCAgICAgICBBVkVSUk9SKEVOT1NZUyksICAidW5zdXBwb3J0ZWQgZGV2aWNlIiAgICAgICB9LAorICAgIHsgTlZfRU5DX0VSUl9JTlZBTElEX0VOQ09ERVJERVZJQ0UsICAgIEFWRVJST1IoRUlOVkFMKSwgICJpbnZhbGlkIGVuY29kZXIgZGV2aWNlIiAgIH0sCisgICAgeyBOVl9FTkNfRVJSX0lOVkFMSURfREVWSUNFLCAgICAgICAgICAgQVZFUlJPUihFSU5WQUwpLCAgImludmFsaWQgZGV2aWNlIiAgICAgICAgICAgfSwKKyAgICB7IE5WX0VOQ19FUlJfREVWSUNFX05PVF9FWElTVCwgICAgICAgICBBVkVSUk9SKEVJTyksICAgICAiZGV2aWNlIGRvZXMgbm90IGV4aXN0IiAgICB9LAorICAgIHsgTlZfRU5DX0VSUl9JTlZBTElEX1BUUiwgICAgICAgICAgICAgIEFWRVJST1IoRUZBVUxUKSwgICJpbnZhbGlkIHB0ciIgICAgICAgICAgICAgIH0sCisgICAgeyBOVl9FTkNfRVJSX0lOVkFMSURfRVZFTlQsICAgICAgICAgICAgQVZFUlJPUihFSU5WQUwpLCAgImludmFsaWQgZXZlbnQiICAgICAgICAgICAgfSwKKyAgICB7IE5WX0VOQ19FUlJfSU5WQUxJRF9QQVJBTSwgICAgICAgICAgICBBVkVSUk9SKEVJTlZBTCksICAiaW52YWxpZCBwYXJhbSIgICAgICAgICAgICB9LAorICAgIHsgTlZfRU5DX0VSUl9JTlZBTElEX0NBTEwsICAgICAgICAgICAgIEFWRVJST1IoRUlOVkFMKSwgICJpbnZhbGlkIGNhbGwiICAgICAgICAgICAgIH0sCisgICAgeyBOVl9FTkNfRVJSX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgQVZFUlJPUihFTk9NRU0pLCAgIm91dCBvZiBtZW1vcnkiICAgICAgICAgICAgfSwKKyAgICB7IE5WX0VOQ19FUlJfRU5DT0RFUl9OT1RfSU5JVElBTElaRUQsICBBVkVSUk9SKEVJTlZBTCksICAiZW5jb2RlciBub3QgaW5pdGlhbGl6ZWQiICB9LAorICAgIHsgTlZfRU5DX0VSUl9VTlNVUFBPUlRFRF9QQVJBTSwgICAgICAgIEFWRVJST1IoRU5PU1lTKSwgICJ1bnN1cHBvcnRlZCBwYXJhbSIgICAgICAgIH0sCisgICAgeyBOVl9FTkNfRVJSX0xPQ0tfQlVTWSwgICAgICAgICAgICAgICAgQVZFUlJPUihFQUdBSU4pLCAgImxvY2sgYnVzeSIgICAgICAgICAgICAgICAgfSwKKyAgICB7IE5WX0VOQ19FUlJfTk9UX0VOT1VHSF9CVUZGRVIsICAgICAgICBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEwsICJub3QgZW5vdWdoIGJ1ZmZlciJ9LAorICAgIHsgTlZfRU5DX0VSUl9JTlZBTElEX1ZFUlNJT04sICAgICAgICAgIEFWRVJST1IoRUlOVkFMKSwgICJpbnZhbGlkIHZlcnNpb24iICAgICAgICAgIH0sCisgICAgeyBOVl9FTkNfRVJSX01BUF9GQUlMRUQsICAgICAgICAgICAgICAgQVZFUlJPUihFSU8pLCAgICAgIm1hcCBmYWlsZWQiICAgICAgICAgICAgICAgfSwKKyAgICB7IE5WX0VOQ19FUlJfTkVFRF9NT1JFX0lOUFVULCAgICAgICAgICBBVkVSUk9SKEVBR0FJTiksICAibmVlZCBtb3JlIGlucHV0IiAgICAgICAgICB9LAorICAgIHsgTlZfRU5DX0VSUl9FTkNPREVSX0JVU1ksICAgICAgICAgICAgIEFWRVJST1IoRUFHQUlOKSwgICJlbmNvZGVyIGJ1c3kiICAgICAgICAgICAgIH0sCisgICAgeyBOVl9FTkNfRVJSX0VWRU5UX05PVF9SRUdJU1RFUkQsICAgICAgQVZFUlJPUihFQkFERiksICAgImV2ZW50IG5vdCByZWdpc3RlcmVkIiAgICAgfSwKKyAgICB7IE5WX0VOQ19FUlJfR0VORVJJQywgICAgICAgICAgICAgICAgICBBVkVSUk9SX1VOS05PV04sICAiZ2VuZXJpYyBlcnJvciIgICAgICAgICAgICB9LAorICAgIHsgTlZfRU5DX0VSUl9JTkNPTVBBVElCTEVfQ0xJRU5UX0tFWSwgIEFWRVJST1IoRUlOVkFMKSwgICJpbmNvbXBhdGlibGUgY2xpZW50IGtleSIgIH0sCisgICAgeyBOVl9FTkNfRVJSX1VOSU1QTEVNRU5URUQsICAgICAgICAgICAgQVZFUlJPUihFTk9TWVMpLCAgInVuaW1wbGVtZW50ZWQiICAgICAgICAgICAgfSwKKyAgICB7IE5WX0VOQ19FUlJfUkVTT1VSQ0VfUkVHSVNURVJfRkFJTEVELCBBVkVSUk9SKEVJTyksICAgICAicmVzb3VyY2UgcmVnaXN0ZXIgZmFpbGVkIiB9LAorICAgIHsgTlZfRU5DX0VSUl9SRVNPVVJDRV9OT1RfUkVHSVNURVJFRCwgIEFWRVJST1IoRUJBREYpLCAgICJyZXNvdXJjZSBub3QgcmVnaXN0ZXJlZCIgIH0sCisgICAgeyBOVl9FTkNfRVJSX1JFU09VUkNFX05PVF9NQVBQRUQsICAgICAgQVZFUlJPUihFQkFERiksICAgInJlc291cmNlIG5vdCBtYXBwZWQiICAgICAgfSwKIH07CiAKLXN0YXRpYyBpbnQgaW5wdXRfc3RyaW5nX3RvX3VpbnQzMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IE52ZW5jVmFsdWVQYWlyICpwYWlyLCBjb25zdCBjaGFyICppbnB1dCwgdWludDMyX3QgKm91dHB1dCkKK3N0YXRpYyBpbnQgbnZlbmNfbWFwX2Vycm9yKE5WRU5DU1RBVFVTIGVyciwgY29uc3QgY2hhciAqKmRlc2MpCiB7Ci0gICAgZm9yICg7IHBhaXItPnN0cjsgKytwYWlyKSB7Ci0gICAgICAgIGlmICghc3RyY21wKGlucHV0LCBwYWlyLT5zdHIpKSB7Ci0gICAgICAgICAgICAqb3V0cHV0ID0gcGFpci0+bnVtOwotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKG52ZW5jX2Vycm9ycyk7IGkrKykgeworICAgICAgICBpZiAobnZlbmNfZXJyb3JzW2ldLm52ZXJyID09IGVycikgeworICAgICAgICAgICAgaWYgKGRlc2MpCisgICAgICAgICAgICAgICAgKmRlc2MgPSBudmVuY19lcnJvcnNbaV0uZGVzYzsKKyAgICAgICAgICAgIHJldHVybiBudmVuY19lcnJvcnNbaV0uYXZlcnI7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmIChkZXNjKQorICAgICAgICAqZGVzYyA9ICJ1bmtub3duIGVycm9yIjsKKyAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOwogfQogCi1zdGF0aWMgTnZlbmNEYXRhKiBkYXRhX3F1ZXVlX2RlcXVldWUoTnZlbmNEYXRhTGlzdCogcXVldWUpCitzdGF0aWMgaW50IG52ZW5jX3ByaW50X2Vycm9yKHZvaWQgKmxvZ19jdHgsIE5WRU5DU1RBVFVTIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3Jfc3RyaW5nKQogewotICAgIHVpbnQzMl90IG1hc2s7Ci0gICAgdWludDMyX3QgcmVhZF9wb3M7Ci0KLSAgICBhdl9hc3NlcnQwKHF1ZXVlKTsKLSAgICBhdl9hc3NlcnQwKHF1ZXVlLT5zaXplKTsKLSAgICBhdl9hc3NlcnQwKHF1ZXVlLT5kYXRhKTsKLQotICAgIGlmICghcXVldWUtPmNvdW50KQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIFNpemUgYWx3YXlzIGlzIGEgbXVsdGlwbGUgb2YgdHdvICovCi0gICAgbWFzayA9IHF1ZXVlLT5zaXplIC0gMTsKLSAgICByZWFkX3BvcyA9IChxdWV1ZS0+cG9zIC0gcXVldWUtPmNvdW50KSAmIG1hc2s7Ci0gICAgcXVldWUtPmNvdW50LS07Ci0KLSAgICByZXR1cm4gJnF1ZXVlLT5kYXRhW3JlYWRfcG9zXTsKKyAgICBjb25zdCBjaGFyICpkZXNjOworICAgIGludCByZXQ7CisgICAgcmV0ID0gbnZlbmNfbWFwX2Vycm9yKGVyciwgJmRlc2MpOworICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICIlczogJXMgKCVkKVxuIiwgZXJyb3Jfc3RyaW5nLCBkZXNjLCBlcnIpOworICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZGF0YV9xdWV1ZV9lbnF1ZXVlKE52ZW5jRGF0YUxpc3QqIHF1ZXVlLCBOdmVuY0RhdGEgKmRhdGEpCitzdGF0aWMgdm9pZCBudmVuY19wcmludF9kcml2ZXJfcmVxdWlyZW1lbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgbGV2ZWwpCiB7Ci0gICAgTnZlbmNEYXRhTGlzdCBuZXdfcXVldWU7Ci0gICAgTnZlbmNEYXRhKiB0bXBfZGF0YTsKLSAgICB1aW50MzJfdCBtYXNrOwotCi0gICAgaWYgKCFxdWV1ZS0+c2l6ZSkgewotICAgICAgICAvKiBzaXplIGFsd2F5cyBoYXMgdG8gYmUgYSBtdWx0aXBsZSBvZiB0d28gKi8KLSAgICAgICAgcXVldWUtPnNpemUgPSA0OwotICAgICAgICBxdWV1ZS0+cG9zID0gMDsKLSAgICAgICAgcXVldWUtPmNvdW50ID0gMDsKLQotICAgICAgICBxdWV1ZS0+ZGF0YSA9IGF2X21hbGxvYyhxdWV1ZS0+c2l6ZSAqIHNpemVvZigqKHF1ZXVlLT5kYXRhKSkpOwotCi0gICAgICAgIGlmICghcXVldWUtPmRhdGEpIHsKLSAgICAgICAgICAgIHF1ZXVlLT5zaXplID0gMDsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocXVldWUtPmNvdW50ID09IHF1ZXVlLT5zaXplKSB7Ci0gICAgICAgIG5ld19xdWV1ZS5zaXplID0gcXVldWUtPnNpemUgPDwgMTsKLSAgICAgICAgbmV3X3F1ZXVlLnBvcyA9IDA7Ci0gICAgICAgIG5ld19xdWV1ZS5jb3VudCA9IDA7Ci0gICAgICAgIG5ld19xdWV1ZS5kYXRhID0gYXZfbWFsbG9jKG5ld19xdWV1ZS5zaXplICogc2l6ZW9mKCoocXVldWUtPmRhdGEpKSk7Ci0KLSAgICAgICAgaWYgKCFuZXdfcXVldWUuZGF0YSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgd2hpbGUgKHRtcF9kYXRhID0gZGF0YV9xdWV1ZV9kZXF1ZXVlKHF1ZXVlKSkKLSAgICAgICAgICAgIGRhdGFfcXVldWVfZW5xdWV1ZSgmbmV3X3F1ZXVlLCB0bXBfZGF0YSk7Ci0KLSAgICAgICAgYXZfZnJlZShxdWV1ZS0+ZGF0YSk7Ci0gICAgICAgICpxdWV1ZSA9IG5ld19xdWV1ZTsKLSAgICB9Ci0KLSAgICBtYXNrID0gcXVldWUtPnNpemUgLSAxOwotCi0gICAgcXVldWUtPmRhdGFbcXVldWUtPnBvc10gPSAqZGF0YTsKLSAgICBxdWV1ZS0+cG9zID0gKHF1ZXVlLT5wb3MgKyAxKSAmIG1hc2s7Ci0gICAgcXVldWUtPmNvdW50Kys7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBvdXRfc3VyZl9xdWV1ZV9lbnF1ZXVlKE52ZW5jRGF0YUxpc3QqIHF1ZXVlLCBOdmVuY091dHB1dFN1cmZhY2UqIHN1cmZhY2UpCi17Ci0gICAgTnZlbmNEYXRhIGRhdGE7Ci0gICAgZGF0YS51LnN1cmZhY2UgPSBzdXJmYWNlOwotCi0gICAgcmV0dXJuIGRhdGFfcXVldWVfZW5xdWV1ZShxdWV1ZSwgJmRhdGEpOwotfQotCi1zdGF0aWMgTnZlbmNPdXRwdXRTdXJmYWNlKiBvdXRfc3VyZl9xdWV1ZV9kZXF1ZXVlKE52ZW5jRGF0YUxpc3QqIHF1ZXVlKQotewotICAgIE52ZW5jRGF0YSogcmVzID0gZGF0YV9xdWV1ZV9kZXF1ZXVlKHF1ZXVlKTsKLQotICAgIGlmICghcmVzKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiByZXMtPnUuc3VyZmFjZTsKLX0KLQotc3RhdGljIGludCB0aW1lc3RhbXBfcXVldWVfZW5xdWV1ZShOdmVuY0RhdGFMaXN0KiBxdWV1ZSwgaW50NjRfdCB0aW1lc3RhbXApCi17Ci0gICAgTnZlbmNEYXRhIGRhdGE7Ci0gICAgZGF0YS51LnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQotICAgIHJldHVybiBkYXRhX3F1ZXVlX2VucXVldWUocXVldWUsICZkYXRhKTsKLX0KLQotc3RhdGljIGludDY0X3QgdGltZXN0YW1wX3F1ZXVlX2RlcXVldWUoTnZlbmNEYXRhTGlzdCogcXVldWUpCi17Ci0gICAgTnZlbmNEYXRhKiByZXMgPSBkYXRhX3F1ZXVlX2RlcXVldWUocXVldWUpOwotCi0gICAgaWYgKCFyZXMpCi0gICAgICAgIHJldHVybiBBVl9OT1BUU19WQUxVRTsKLQotICAgIHJldHVybiByZXMtPnUudGltZXN0YW1wOwotfQotCi0jZGVmaW5lIENIRUNLX0xPQURfRlVOQyh0LCBmLCBzKSBcCi1kbyB7IFwKLSAgICAoZikgPSAodClMT0FEX0ZVTkMoZGxfZm4tPmN1ZGFfbGliLCBzKTsgXAotICAgIGlmICghKGYpKSB7IFwKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJGYWlsZWQgbG9hZGluZyAlcyBmcm9tIENVREEgbGlicmFyeVxuIiwgcyk7IFwKLSAgICAgICAgZ290byBlcnJvcjsgXAotICAgIH0gXAotfSB3aGlsZSAoMCkKLQotc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX2R5bG9hZF9jdWRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBOdmVuY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgTnZlbmNEeW5Mb2FkRnVuY3Rpb25zICpkbF9mbiA9ICZjdHgtPm52ZW5jX2Rsb2FkX2Z1bmNzOwotCi0gICAgaWYgKGRsX2ZuLT5jdWRhX2xpYikKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMikKLSAgICBkbF9mbi0+Y3VkYV9saWIgPSBMb2FkTGlicmFyeShURVhUKCJudmN1ZGEuZGxsIikpOworI2lmIE5WRU5DQVBJX0NIRUNLX1ZFUlNJT04oOCwgMSkKKyMgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyAgICBjb25zdCBjaGFyICptaW52ZXIgPSAiMzkwLjc3IjsKKyMgZWxzZQorICAgIGNvbnN0IGNoYXIgKm1pbnZlciA9ICIzOTAuMjUiOworIyBlbmRpZgogI2Vsc2UKLSAgICBkbF9mbi0+Y3VkYV9saWIgPSBkbG9wZW4oImxpYmN1ZGEuc28iLCBSVExEX0xBWlkpOworIyBpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorICAgIGNvbnN0IGNoYXIgKm1pbnZlciA9ICIzNzguNjYiOworIyBlbHNlCisgICAgY29uc3QgY2hhciAqbWludmVyID0gIjM3OC4xMyI7CisjIGVuZGlmCiAjZW5kaWYKLQotICAgIGlmICghZGxfZm4tPmN1ZGFfbGliKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiRmFpbGVkIGxvYWRpbmcgQ1VEQSBsaWJyYXJ5XG4iKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBDSEVDS19MT0FEX0ZVTkMoUENVSU5JVCwgZGxfZm4tPmN1X2luaXQsICJjdUluaXQiKTsKLSAgICBDSEVDS19MT0FEX0ZVTkMoUENVREVWSUNFR0VUQ09VTlQsIGRsX2ZuLT5jdV9kZXZpY2VfZ2V0X2NvdW50LCAiY3VEZXZpY2VHZXRDb3VudCIpOwotICAgIENIRUNLX0xPQURfRlVOQyhQQ1VERVZJQ0VHRVQsIGRsX2ZuLT5jdV9kZXZpY2VfZ2V0LCAiY3VEZXZpY2VHZXQiKTsKLSAgICBDSEVDS19MT0FEX0ZVTkMoUENVREVWSUNFR0VUTkFNRSwgZGxfZm4tPmN1X2RldmljZV9nZXRfbmFtZSwgImN1RGV2aWNlR2V0TmFtZSIpOwotICAgIENIRUNLX0xPQURfRlVOQyhQQ1VERVZJQ0VDT01QVVRFQ0FQQUJJTElUWSwgZGxfZm4tPmN1X2RldmljZV9jb21wdXRlX2NhcGFiaWxpdHksICJjdURldmljZUNvbXB1dGVDYXBhYmlsaXR5Iik7Ci0gICAgQ0hFQ0tfTE9BRF9GVU5DKFBDVUNUWENSRUFURSwgZGxfZm4tPmN1X2N0eF9jcmVhdGUsICJjdUN0eENyZWF0ZV92MiIpOwotICAgIENIRUNLX0xPQURfRlVOQyhQQ1VDVFhQT1BDVVJSRU5ULCBkbF9mbi0+Y3VfY3R4X3BvcF9jdXJyZW50LCAiY3VDdHhQb3BDdXJyZW50X3YyIik7Ci0gICAgQ0hFQ0tfTE9BRF9GVU5DKFBDVUNUWERFU1RST1ksIGRsX2ZuLT5jdV9jdHhfZGVzdHJveSwgImN1Q3R4RGVzdHJveV92MiIpOwotCi0gICAgcmV0dXJuIDE7Ci0KLWVycm9yOgotCi0gICAgaWYgKGRsX2ZuLT5jdWRhX2xpYikKLSAgICAgICAgRExfQ0xPU0VfRlVOQyhkbF9mbi0+Y3VkYV9saWIpOwotCi0gICAgZGxfZm4tPmN1ZGFfbGliID0gTlVMTDsKLQotICAgIHJldHVybiAwOworICAgIGF2X2xvZyhhdmN0eCwgbGV2ZWwsICJUaGUgbWluaW11bSByZXF1aXJlZCBOdmlkaWEgZHJpdmVyIGZvciBudmVuYyBpcyAlcyBvciBuZXdlclxuIiwgbWludmVyKTsKIH0KIAotc3RhdGljIGF2X2NvbGQgaW50IGNoZWNrX2N1ZGFfZXJyb3JzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQ1VyZXN1bHQgZXJyLCBjb25zdCBjaGFyICpmdW5jKQorc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX2xvYWRfbGlicmFyaWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKLSAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19GQVRBTCwgIj4+ICVzIC0gZmFpbGVkIHdpdGggZXJyb3IgY29kZSAweCV4XG4iLCBmdW5jLCBlcnIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0jZGVmaW5lIGNoZWNrX2N1ZGFfZXJyb3JzKGYpIGlmICghY2hlY2tfY3VkYV9lcnJvcnMoYXZjdHgsIGYsICNmKSkgZ290byBlcnJvcgotCi1zdGF0aWMgYXZfY29sZCBpbnQgbnZlbmNfY2hlY2tfY3VkYShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgaW50IGRldmljZV9jb3VudCA9IDA7Ci0gICAgQ1VkZXZpY2UgY3VfZGV2aWNlID0gMDsKLSAgICBjaGFyIGdwdV9uYW1lWzEyOF07Ci0gICAgaW50IHNtbWlub3IgPSAwLCBzbW1ham9yID0gMDsKLSAgICBpbnQgaSwgc212ZXIsIHRhcmdldF9zbXZlcjsKLQotICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBOdmVuY0NvbnRleHQgKmN0eCAgICAgICAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgKmRsX2ZuID0gJmN0eC0+bnZlbmNfZGxvYWRfZnVuY3M7CisgICAgTlZFTkNTVEFUVVMgZXJyOworICAgIHVpbnQzMl90IG52ZW5jX21heF92ZXI7CisgICAgaW50IHJldDsKIAotICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgewotICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKLSAgICAgICAgdGFyZ2V0X3NtdmVyID0gYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQID8gMHg1MiA6IDB4MzA7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NToKLSAgICAgICAgdGFyZ2V0X3NtdmVyID0gMHg1MjsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJVbmtub3duIGNvZGVjIG5hbWVcbiIpOwotICAgICAgICBnb3RvIGVycm9yOworICAgIHJldCA9IGN1ZGFfbG9hZF9mdW5jdGlvbnMoJmRsX2ZuLT5jdWRhX2RsLCBhdmN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBudmVuY19sb2FkX2Z1bmN0aW9ucygmZGxfZm4tPm52ZW5jX2RsLCBhdmN0eCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgbnZlbmNfcHJpbnRfZHJpdmVyX3JlcXVpcmVtZW50KGF2Y3R4LCBBVl9MT0dfRVJST1IpOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGlmICghbnZlbmNfZHlsb2FkX2N1ZGEoYXZjdHgpKQotICAgICAgICByZXR1cm4gMDsKKyAgICBlcnIgPSBkbF9mbi0+bnZlbmNfZGwtPk52RW5jb2RlQVBJR2V0TWF4U3VwcG9ydGVkVmVyc2lvbigmbnZlbmNfbWF4X3Zlcik7CisgICAgaWYgKGVyciAhPSBOVl9FTkNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIG52ZW5jX3ByaW50X2Vycm9yKGF2Y3R4LCBlcnIsICJGYWlsZWQgdG8gcXVlcnkgbnZlbmMgbWF4IHZlcnNpb24iKTsKIAotICAgIGlmIChkbF9mbi0+bnZlbmNfZGV2aWNlX2NvdW50ID4gMCkKLSAgICAgICAgcmV0dXJuIDE7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIkxvYWRlZCBOdmVuYyB2ZXJzaW9uICVkLiVkXG4iLCBudmVuY19tYXhfdmVyID4+IDQsIG52ZW5jX21heF92ZXIgJiAweGYpOwogCi0gICAgY2hlY2tfY3VkYV9lcnJvcnMoZGxfZm4tPmN1X2luaXQoMCkpOwotCi0gICAgY2hlY2tfY3VkYV9lcnJvcnMoZGxfZm4tPmN1X2RldmljZV9nZXRfY291bnQoJmRldmljZV9jb3VudCkpOwotCi0gICAgaWYgKCFkZXZpY2VfY291bnQpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJObyBDVURBIGNhcGFibGUgZGV2aWNlcyBmb3VuZFxuIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIiVkIENVREEgY2FwYWJsZSBkZXZpY2VzIGZvdW5kXG4iLCBkZXZpY2VfY291bnQpOwotCi0gICAgZGxfZm4tPm52ZW5jX2RldmljZV9jb3VudCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZGV2aWNlX2NvdW50OyArK2kpIHsKLSAgICAgICAgY2hlY2tfY3VkYV9lcnJvcnMoZGxfZm4tPmN1X2RldmljZV9nZXQoJmN1X2RldmljZSwgaSkpOwotICAgICAgICBjaGVja19jdWRhX2Vycm9ycyhkbF9mbi0+Y3VfZGV2aWNlX2dldF9uYW1lKGdwdV9uYW1lLCBzaXplb2YoZ3B1X25hbWUpLCBjdV9kZXZpY2UpKTsKLSAgICAgICAgY2hlY2tfY3VkYV9lcnJvcnMoZGxfZm4tPmN1X2RldmljZV9jb21wdXRlX2NhcGFiaWxpdHkoJnNtbWFqb3IsICZzbW1pbm9yLCBjdV9kZXZpY2UpKTsKLQotICAgICAgICBzbXZlciA9IChzbW1ham9yIDw8IDQpIHwgc21taW5vcjsKLQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiWyBHUFUgIyVkIC0gPCAlcyA+IGhhcyBDb21wdXRlIFNNICVkLiVkLCBOVkVOQyAlcyBdXG4iLCBpLCBncHVfbmFtZSwgc21tYWpvciwgc21taW5vciwgKHNtdmVyID49IHRhcmdldF9zbXZlcikgPyAiQXZhaWxhYmxlIiA6ICJOb3QgQXZhaWxhYmxlIik7Ci0KLSAgICAgICAgaWYgKHNtdmVyID49IHRhcmdldF9zbXZlcikKLSAgICAgICAgICAgIGRsX2ZuLT5udmVuY19kZXZpY2VzW2RsX2ZuLT5udmVuY19kZXZpY2VfY291bnQrK10gPSBjdV9kZXZpY2U7Ci0gICAgfQotCi0gICAgaWYgKCFkbF9mbi0+bnZlbmNfZGV2aWNlX2NvdW50KSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiTm8gTlZFTkMgY2FwYWJsZSBkZXZpY2VzIGZvdW5kXG4iKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLQotZXJyb3I6Ci0KLSAgICBkbF9mbi0+bnZlbmNfZGV2aWNlX2NvdW50ID0gMDsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgYXZfY29sZCBpbnQgbnZlbmNfZHlsb2FkX252ZW5jKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBQTlZFTkNPREVBUElDUkVBVEVJTlNUQU5DRSBudkVuY29kZUFQSUNyZWF0ZUluc3RhbmNlID0gMDsKLSAgICBOVkVOQ1NUQVRVUyBudnN0YXR1czsKLQotICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgKmRsX2ZuID0gJmN0eC0+bnZlbmNfZGxvYWRfZnVuY3M7Ci0KLSAgICBpZiAoIW52ZW5jX2NoZWNrX2N1ZGEoYXZjdHgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGlmIChkbF9mbi0+bnZlbmNfbGliKQotICAgICAgICByZXR1cm4gMTsKLQotI2lmIGRlZmluZWQoX1dJTjMyKQotICAgIGlmIChzaXplb2Yodm9pZCopID09IDgpIHsKLSAgICAgICAgZGxfZm4tPm52ZW5jX2xpYiA9IExvYWRMaWJyYXJ5KFRFWFQoIm52RW5jb2RlQVBJNjQuZGxsIikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRsX2ZuLT5udmVuY19saWIgPSBMb2FkTGlicmFyeShURVhUKCJudkVuY29kZUFQSS5kbGwiKSk7Ci0gICAgfQotI2Vsc2UKLSAgICBkbF9mbi0+bnZlbmNfbGliID0gZGxvcGVuKCJsaWJudmlkaWEtZW5jb2RlLnNvLjEiLCBSVExEX0xBWlkpOwotI2VuZGlmCi0KLSAgICBpZiAoIWRsX2ZuLT5udmVuY19saWIpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJGYWlsZWQgbG9hZGluZyB0aGUgbnZlbmMgbGlicmFyeVxuIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgbnZFbmNvZGVBUElDcmVhdGVJbnN0YW5jZSA9IChQTlZFTkNPREVBUElDUkVBVEVJTlNUQU5DRSlMT0FEX0ZVTkMoZGxfZm4tPm52ZW5jX2xpYiwgIk52RW5jb2RlQVBJQ3JlYXRlSW5zdGFuY2UiKTsKLQotICAgIGlmICghbnZFbmNvZGVBUElDcmVhdGVJbnN0YW5jZSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19GQVRBTCwgIkZhaWxlZCB0byBsb2FkIG52ZW5jIGVudHJ5cG9pbnRcbiIpOwotICAgICAgICBnb3RvIGVycm9yOworICAgIGlmICgoTlZFTkNBUElfTUFKT1JfVkVSU0lPTiA8PCA0IHwgTlZFTkNBUElfTUlOT1JfVkVSU0lPTikgPiBudmVuY19tYXhfdmVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVpcmVkIG52ZW5jIEFQSSB2ZXJzaW9uLiAiCisgICAgICAgICAgICAgICAiUmVxdWlyZWQ6ICVkLiVkIEZvdW5kOiAlZC4lZFxuIiwKKyAgICAgICAgICAgICAgIE5WRU5DQVBJX01BSk9SX1ZFUlNJT04sIE5WRU5DQVBJX01JTk9SX1ZFUlNJT04sCisgICAgICAgICAgICAgICBudmVuY19tYXhfdmVyID4+IDQsIG52ZW5jX21heF92ZXIgJiAweGYpOworICAgICAgICBudmVuY19wcmludF9kcml2ZXJfcmVxdWlyZW1lbnQoYXZjdHgsIEFWX0xPR19FUlJPUik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgfQogCiAgICAgZGxfZm4tPm52ZW5jX2Z1bmNzLnZlcnNpb24gPSBOVl9FTkNPREVfQVBJX0ZVTkNUSU9OX0xJU1RfVkVSOwogCi0gICAgbnZzdGF0dXMgPSBudkVuY29kZUFQSUNyZWF0ZUluc3RhbmNlKCZkbF9mbi0+bnZlbmNfZnVuY3MpOwotCi0gICAgaWYgKG52c3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiRmFpbGVkIHRvIGNyZWF0ZSBudmVuYyBpbnN0YW5jZVxuIik7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQorICAgIGVyciA9IGRsX2ZuLT5udmVuY19kbC0+TnZFbmNvZGVBUElDcmVhdGVJbnN0YW5jZSgmZGxfZm4tPm52ZW5jX2Z1bmNzKTsKKyAgICBpZiAoZXJyICE9IE5WX0VOQ19TVUNDRVNTKQorICAgICAgICByZXR1cm4gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIGVyciwgIkZhaWxlZCB0byBjcmVhdGUgbnZlbmMgaW5zdGFuY2UiKTsKIAogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJOdmVuYyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHlcbiIpOwogCi0gICAgcmV0dXJuIDE7Ci0KLWVycm9yOgotICAgIGlmIChkbF9mbi0+bnZlbmNfbGliKQotICAgICAgICBETF9DTE9TRV9GVU5DKGRsX2ZuLT5udmVuY19saWIpOwotCi0gICAgZGxfZm4tPm52ZW5jX2xpYiA9IE5VTEw7Ci0KICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGF2X2NvbGQgdm9pZCBudmVuY191bmxvYWRfbnZlbmMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQorc3RhdGljIGludCBudmVuY19wdXNoX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBOdmVuY0NvbnRleHQgKmN0eCAgICAgICAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgKmRsX2ZuID0gJmN0eC0+bnZlbmNfZGxvYWRfZnVuY3M7CisgICAgQ1VyZXN1bHQgY3VfcmVzOwogCi0gICAgRExfQ0xPU0VfRlVOQyhkbF9mbi0+bnZlbmNfbGliKTsKLSAgICBkbF9mbi0+bnZlbmNfbGliID0gTlVMTDsKKyAgICBpZiAoY3R4LT5kM2QxMV9kZXZpY2UpCisgICAgICAgIHJldHVybiAwOwogCi0gICAgZGxfZm4tPm52ZW5jX2RldmljZV9jb3VudCA9IDA7CisgICAgY3VfcmVzID0gZGxfZm4tPmN1ZGFfZGwtPmN1Q3R4UHVzaEN1cnJlbnQoY3R4LT5jdV9jb250ZXh0KTsKKyAgICBpZiAoY3VfcmVzICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImN1Q3R4UHVzaEN1cnJlbnQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQogCi0gICAgRExfQ0xPU0VfRlVOQyhkbF9mbi0+Y3VkYV9saWIpOwotICAgIGRsX2ZuLT5jdWRhX2xpYiA9IE5VTEw7Ci0KLSAgICBkbF9mbi0+Y3VfaW5pdCA9IE5VTEw7Ci0gICAgZGxfZm4tPmN1X2RldmljZV9nZXRfY291bnQgPSBOVUxMOwotICAgIGRsX2ZuLT5jdV9kZXZpY2VfZ2V0ID0gTlVMTDsKLSAgICBkbF9mbi0+Y3VfZGV2aWNlX2dldF9uYW1lID0gTlVMTDsKLSAgICBkbF9mbi0+Y3VfZGV2aWNlX2NvbXB1dGVfY2FwYWJpbGl0eSA9IE5VTEw7Ci0gICAgZGxfZm4tPmN1X2N0eF9jcmVhdGUgPSBOVUxMOwotICAgIGRsX2ZuLT5jdV9jdHhfcG9wX2N1cnJlbnQgPSBOVUxMOwotICAgIGRsX2ZuLT5jdV9jdHhfZGVzdHJveSA9IE5VTEw7Ci0KLSAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiTnZlbmMgdW5sb2FkZWRcbiIpOworICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgYXZfY29sZCBpbnQgbnZlbmNfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQorc3RhdGljIGludCBudmVuY19wb3BfY29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgTlZfRU5DX09QRU5fRU5DT0RFX1NFU1NJT05fRVhfUEFSQU1TIGVuY29kZV9zZXNzaW9uX3BhcmFtcyA9IHsgMCB9OwotICAgIE5WX0VOQ19QUkVTRVRfQ09ORklHIHByZXNldF9jb25maWcgPSB7IDAgfTsKLSAgICBDVWNvbnRleHQgY3VfY29udGV4dF9jdXJyOworICAgIE52ZW5jQ29udGV4dCAqY3R4ICAgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE52ZW5jRHluTG9hZEZ1bmN0aW9ucyAqZGxfZm4gPSAmY3R4LT5udmVuY19kbG9hZF9mdW5jczsKICAgICBDVXJlc3VsdCBjdV9yZXM7Ci0gICAgR1VJRCBlbmNvZGVyX3ByZXNldCA9IE5WX0VOQ19QUkVTRVRfSFFfR1VJRDsKLSAgICBHVUlEIGNvZGVjOwotICAgIE5WRU5DU1RBVFVTIG52X3N0YXR1cyA9IE5WX0VOQ19TVUNDRVNTOwotICAgIEFWQ1BCUHJvcGVydGllcyAqY3BiX3Byb3BzOwotICAgIGludCBzdXJmYWNlQ291bnQgPSAwOwotICAgIGludCBpLCBudW1fbWJzOwotICAgIGludCBpc0xMID0gMDsKLSAgICBpbnQgbG9zc2xlc3MgPSAwOwotICAgIGludCByZXMgPSAwOwotICAgIGludCBkdywgZGg7Ci0gICAgaW50IHFwX2ludGVyX3A7CisgICAgQ1Vjb250ZXh0IGR1bW15OwogCisgICAgaWYgKGN0eC0+ZDNkMTFfZGV2aWNlKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGN1X3JlcyA9IGRsX2ZuLT5jdWRhX2RsLT5jdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKKyAgICBpZiAoY3VfcmVzICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImN1Q3R4UG9wQ3VycmVudCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX29wZW5fc2Vzc2lvbihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTlZfRU5DX09QRU5fRU5DT0RFX1NFU1NJT05fRVhfUEFSQU1TIHBhcmFtcyA9IHsgMCB9OworICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBOVl9FTkNPREVfQVBJX0ZVTkNUSU9OX0xJU1QgKnBfbnZlbmMgPSAmY3R4LT5udmVuY19kbG9hZF9mdW5jcy5udmVuY19mdW5jczsKKyAgICBOVkVOQ1NUQVRVUyByZXQ7CisKKyAgICBwYXJhbXMudmVyc2lvbiAgICA9IE5WX0VOQ19PUEVOX0VOQ09ERV9TRVNTSU9OX0VYX1BBUkFNU19WRVI7CisgICAgcGFyYW1zLmFwaVZlcnNpb24gPSBOVkVOQ0FQSV9WRVJTSU9OOworICAgIGlmIChjdHgtPmQzZDExX2RldmljZSkgeworICAgICAgICBwYXJhbXMuZGV2aWNlICAgICA9IGN0eC0+ZDNkMTFfZGV2aWNlOworICAgICAgICBwYXJhbXMuZGV2aWNlVHlwZSA9IE5WX0VOQ19ERVZJQ0VfVFlQRV9ESVJFQ1RYOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhcmFtcy5kZXZpY2UgICAgID0gY3R4LT5jdV9jb250ZXh0OworICAgICAgICBwYXJhbXMuZGV2aWNlVHlwZSA9IE5WX0VOQ19ERVZJQ0VfVFlQRV9DVURBOworICAgIH0KKworICAgIHJldCA9IHBfbnZlbmMtPm52RW5jT3BlbkVuY29kZVNlc3Npb25FeCgmcGFyYW1zLCAmY3R4LT5udmVuY29kZXIpOworICAgIGlmIChyZXQgIT0gTlZfRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgY3R4LT5udmVuY29kZXIgPSBOVUxMOworICAgICAgICByZXR1cm4gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIHJldCwgIk9wZW5FbmNvZGVTZXNzaW9uRXggZmFpbGVkIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnZlbmNfY2hlY2tfY29kZWNfc3VwcG9ydChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggICAgICAgICAgICAgICAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBOVl9FTkNPREVfQVBJX0ZVTkNUSU9OX0xJU1QgKnBfbnZlbmMgPSAmY3R4LT5udmVuY19kbG9hZF9mdW5jcy5udmVuY19mdW5jczsKKyAgICBpbnQgaSwgcmV0LCBjb3VudCA9IDA7CisgICAgR1VJRCAqZ3VpZHMgPSBOVUxMOworCisgICAgcmV0ID0gcF9udmVuYy0+bnZFbmNHZXRFbmNvZGVHVUlEQ291bnQoY3R4LT5udmVuY29kZXIsICZjb3VudCk7CisKKyAgICBpZiAocmV0ICE9IE5WX0VOQ19TVUNDRVNTIHx8ICFjb3VudCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIGd1aWRzID0gYXZfbWFsbG9jKGNvdW50ICogc2l6ZW9mKEdVSUQpKTsKKyAgICBpZiAoIWd1aWRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gcF9udmVuYy0+bnZFbmNHZXRFbmNvZGVHVUlEcyhjdHgtPm52ZW5jb2RlciwgZ3VpZHMsIGNvdW50LCAmY291bnQpOworICAgIGlmIChyZXQgIT0gTlZfRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIGlmICghbWVtY21wKCZndWlkc1tpXSwgJmN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuY29kZUdVSUQsIHNpemVvZigqZ3VpZHMpKSkgeworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCitmYWlsOgorICAgIGF2X2ZyZWUoZ3VpZHMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBudmVuY19jaGVja19jYXAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBOVl9FTkNfQ0FQUyBjYXApCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE5WX0VOQ09ERV9BUElfRlVOQ1RJT05fTElTVCAqcF9udmVuYyA9ICZjdHgtPm52ZW5jX2Rsb2FkX2Z1bmNzLm52ZW5jX2Z1bmNzOworICAgIE5WX0VOQ19DQVBTX1BBUkFNIHBhcmFtcyAgICAgICAgPSB7IDAgfTsKKyAgICBpbnQgcmV0LCB2YWwgPSAwOworCisgICAgcGFyYW1zLnZlcnNpb24gICAgID0gTlZfRU5DX0NBUFNfUEFSQU1fVkVSOworICAgIHBhcmFtcy5jYXBzVG9RdWVyeSA9IGNhcDsKKworICAgIHJldCA9IHBfbnZlbmMtPm52RW5jR2V0RW5jb2RlQ2FwcyhjdHgtPm52ZW5jb2RlciwgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZW5jb2RlR1VJRCwgJnBhcmFtcywgJnZhbCk7CisKKyAgICBpZiAocmV0ID09IE5WX0VOQ19TVUNDRVNTKQorICAgICAgICByZXR1cm4gdmFsOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG52ZW5jX2NoZWNrX2NhcGFiaWxpdGllcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBudmVuY19jaGVja19jb2RlY19zdXBwb3J0KGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ29kZWMgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gbnZlbmNfY2hlY2tfY2FwKGF2Y3R4LCBOVl9FTkNfQ0FQU19TVVBQT1JUX1lVVjQ0NF9FTkNPREUpOworICAgIGlmIChJU19ZVVY0NDQoY3R4LT5kYXRhX3BpeF9mbXQpICYmIHJldCA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJZVVY0NDRQIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIHJldCA9IG52ZW5jX2NoZWNrX2NhcChhdmN0eCwgTlZfRU5DX0NBUFNfU1VQUE9SVF9MT1NTTEVTU19FTkNPREUpOworICAgIGlmIChjdHgtPnByZXNldCA+PSBQUkVTRVRfTE9TU0xFU1NfREVGQVVMVCAmJiByZXQgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiTG9zc2xlc3MgZW5jb2Rpbmcgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgcmV0ID0gbnZlbmNfY2hlY2tfY2FwKGF2Y3R4LCBOVl9FTkNfQ0FQU19XSURUSF9NQVgpOworICAgIGlmIChyZXQgPCBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIldpZHRoICVkIGV4Y2VlZHMgJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIHJldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgcmV0ID0gbnZlbmNfY2hlY2tfY2FwKGF2Y3R4LCBOVl9FTkNfQ0FQU19IRUlHSFRfTUFYKTsKKyAgICBpZiAocmV0IDwgYXZjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiSGVpZ2h0ICVkIGV4Y2VlZHMgJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0LCByZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIHJldCA9IG52ZW5jX2NoZWNrX2NhcChhdmN0eCwgTlZfRU5DX0NBUFNfTlVNX01BWF9CRlJBTUVTKTsKKyAgICBpZiAocmV0IDwgYXZjdHgtPm1heF9iX2ZyYW1lcykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiTWF4IEItZnJhbWVzICVkIGV4Y2VlZCAlZFxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5tYXhfYl9mcmFtZXMsIHJldCk7CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICByZXQgPSBudmVuY19jaGVja19jYXAoYXZjdHgsIE5WX0VOQ19DQVBTX1NVUFBPUlRfRklFTERfRU5DT0RJTkcpOworICAgIGlmIChyZXQgPCAxICYmIGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfSU5URVJMQUNFRF9EQ1QpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICJJbnRlcmxhY2VkIGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQuIFN1cHBvcnRlZCBsZXZlbDogJWRcbiIsCisgICAgICAgICAgICAgICByZXQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIHJldCA9IG52ZW5jX2NoZWNrX2NhcChhdmN0eCwgTlZfRU5DX0NBUFNfU1VQUE9SVF8xMEJJVF9FTkNPREUpOworICAgIGlmIChJU18xMEJJVChjdHgtPmRhdGFfcGl4X2ZtdCkgJiYgcmV0IDw9IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIjEwIGJpdCBlbmNvZGUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgcmV0ID0gbnZlbmNfY2hlY2tfY2FwKGF2Y3R4LCBOVl9FTkNfQ0FQU19TVVBQT1JUX0xPT0tBSEVBRCk7CisgICAgaWYgKGN0eC0+cmNfbG9va2FoZWFkID4gMCAmJiByZXQgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiUkMgbG9va2FoZWFkIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIHJldCA9IG52ZW5jX2NoZWNrX2NhcChhdmN0eCwgTlZfRU5DX0NBUFNfU1VQUE9SVF9URU1QT1JBTF9BUSk7CisgICAgaWYgKGN0eC0+dGVtcG9yYWxfYXEgPiAwICYmIHJldCA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJUZW1wb3JhbCBBUSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICByZXQgPSBudmVuY19jaGVja19jYXAoYXZjdHgsIE5WX0VOQ19DQVBTX1NVUFBPUlRfV0VJR0hURURfUFJFRElDVElPTik7CisgICAgaWYgKGN0eC0+d2VpZ2h0ZWRfcHJlZCA+IDAgJiYgcmV0IDw9IDApIHsKKyAgICAgICAgYXZfbG9nIChhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJXZWlnaHRlZCBQcmVkaWN0aW9uIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIHJldCA9IG52ZW5jX2NoZWNrX2NhcChhdmN0eCwgTlZfRU5DX0NBUFNfU1VQUE9SVF9DQUJBQyk7CisgICAgaWYgKGN0eC0+Y29kZXIgPT0gTlZfRU5DX0gyNjRfRU5UUk9QWV9DT0RJTkdfTU9ERV9DQUJBQyAmJiByZXQgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ0FCQUMgZW50cm9weSBjb2Rpbmcgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisjaWZkZWYgTlZFTkNfSEFWRV9CRlJBTUVfUkVGX01PREUKKyAgICByZXQgPSBudmVuY19jaGVja19jYXAoYXZjdHgsIE5WX0VOQ19DQVBTX1NVUFBPUlRfQkZSQU1FX1JFRl9NT0RFKTsKKyAgICBpZiAoY3R4LT5iX3JlZl9tb2RlID09IE5WX0VOQ19CRlJBTUVfUkVGX01PREVfRUFDSCAmJiByZXQgIT0gMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiRWFjaCBCIGZyYW1lIGFzIHJlZmVyZW5jZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9IGVsc2UgaWYgKGN0eC0+Yl9yZWZfbW9kZSAhPSBOVl9FTkNfQkZSQU1FX1JFRl9NT0RFX0RJU0FCTEVEICYmIHJldCA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJCIGZyYW1lcyBhcyByZWZlcmVuY2VzIGFyZSBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisjZWxzZQorICAgIGlmIChjdHgtPmJfcmVmX21vZGUgIT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQiBmcmFtZXMgYXMgcmVmZXJlbmNlcyBuZWVkIFNESyA4LjEgYXQgYnVpbGQgdGltZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX2NoZWNrX2RldmljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBpZHgpCit7CiAgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIE52ZW5jRHluTG9hZEZ1bmN0aW9ucyAqZGxfZm4gPSAmY3R4LT5udmVuY19kbG9hZF9mdW5jczsKICAgICBOVl9FTkNPREVfQVBJX0ZVTkNUSU9OX0xJU1QgKnBfbnZlbmMgPSAmZGxfZm4tPm52ZW5jX2Z1bmNzOworICAgIGNoYXIgbmFtZVsxMjhdID0geyAwfTsKKyAgICBpbnQgbWFqb3IsIG1pbm9yLCByZXQ7CisgICAgQ1VyZXN1bHQgY3VfcmVzOworICAgIENVZGV2aWNlIGN1X2RldmljZTsKKyAgICBpbnQgbG9nbGV2ZWwgPSBBVl9MT0dfVkVSQk9TRTsKIAotICAgIGlmICghbnZlbmNfZHlsb2FkX252ZW5jKGF2Y3R4KSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgaWYgKGN0eC0+ZGV2aWNlID09IExJU1RfREVWSUNFUykKKyAgICAgICAgbG9nbGV2ZWwgPSBBVl9MT0dfSU5GTzsKIAotICAgIGN0eC0+bGFzdF9kdHMgPSBBVl9OT1BUU19WQUxVRTsKLQotICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy52ZXJzaW9uID0gTlZfRU5DX0NPTkZJR19WRVI7Ci0gICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMudmVyc2lvbiA9IE5WX0VOQ19JTklUSUFMSVpFX1BBUkFNU19WRVI7Ci0gICAgcHJlc2V0X2NvbmZpZy52ZXJzaW9uID0gTlZfRU5DX1BSRVNFVF9DT05GSUdfVkVSOwotICAgIHByZXNldF9jb25maWcucHJlc2V0Q2ZnLnZlcnNpb24gPSBOVl9FTkNfQ09ORklHX1ZFUjsKLSAgICBlbmNvZGVfc2Vzc2lvbl9wYXJhbXMudmVyc2lvbiA9IE5WX0VOQ19PUEVOX0VOQ09ERV9TRVNTSU9OX0VYX1BBUkFNU19WRVI7Ci0gICAgZW5jb2RlX3Nlc3Npb25fcGFyYW1zLmFwaVZlcnNpb24gPSBOVkVOQ0FQSV9WRVJTSU9OOwotCi0gICAgaWYgKGN0eC0+Z3B1ID49IGRsX2ZuLT5udmVuY19kZXZpY2VfY291bnQpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJSZXF1ZXN0ZWQgR1BVICVkLCBidXQgb25seSAlZCBHUFVzIGFyZSBhdmFpbGFibGUhXG4iLCBjdHgtPmdwdSwgZGxfZm4tPm52ZW5jX2RldmljZV9jb3VudCk7Ci0gICAgICAgIHJlcyA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICBjdV9yZXMgPSBkbF9mbi0+Y3VkYV9kbC0+Y3VEZXZpY2VHZXQoJmN1X2RldmljZSwgaWR4KTsKKyAgICBpZiAoY3VfcmVzICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJDYW5ub3QgYWNjZXNzIHRoZSBDVURBIGRldmljZSAlZFxuIiwKKyAgICAgICAgICAgICAgIGlkeCk7CisgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBjdHgtPmN1X2NvbnRleHQgPSBOVUxMOwotICAgIGN1X3JlcyA9IGRsX2ZuLT5jdV9jdHhfY3JlYXRlKCZjdHgtPmN1X2NvbnRleHQsIDQsIGRsX2ZuLT5udmVuY19kZXZpY2VzW2N0eC0+Z3B1XSk7IC8vIENVX0NUWF9TQ0hFRF9CTE9DS0lOR19TWU5DPTQsIGF2b2lkIENQVSBzcGlucworICAgIGN1X3JlcyA9IGRsX2ZuLT5jdWRhX2RsLT5jdURldmljZUdldE5hbWUobmFtZSwgc2l6ZW9mKG5hbWUpLCBjdV9kZXZpY2UpOworICAgIGlmIChjdV9yZXMgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY3VEZXZpY2VHZXROYW1lIGZhaWxlZCBvbiBkZXZpY2UgJWRcbiIsIGlkeCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKKyAgICBjdV9yZXMgPSBkbF9mbi0+Y3VkYV9kbC0+Y3VEZXZpY2VDb21wdXRlQ2FwYWJpbGl0eSgmbWFqb3IsICZtaW5vciwgY3VfZGV2aWNlKTsKKyAgICBpZiAoY3VfcmVzICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImN1RGV2aWNlQ29tcHV0ZUNhcGFiaWxpdHkgZmFpbGVkIG9uIGRldmljZSAlZFxuIiwgaWR4KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgbG9nbGV2ZWwsICJbIEdQVSAjJWQgLSA8ICVzID4gaGFzIENvbXB1dGUgU00gJWQuJWQgXVxuIiwgaWR4LCBuYW1lLCBtYWpvciwgbWlub3IpOworICAgIGlmICgoKG1ham9yIDw8IDQpIHwgbWlub3IpIDwgTlZFTkNfQ0FQKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgbG9nbGV2ZWwsICJkb2VzIG5vdCBzdXBwb3J0IE5WRU5DXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChjdHgtPmRldmljZSAhPSBpZHggJiYgY3R4LT5kZXZpY2UgIT0gQU5ZX0RFVklDRSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgY3VfcmVzID0gZGxfZm4tPmN1ZGFfZGwtPmN1Q3R4Q3JlYXRlKCZjdHgtPmN1X2NvbnRleHRfaW50ZXJuYWwsIDAsIGN1X2RldmljZSk7CiAgICAgaWYgKGN1X3JlcyAhPSBDVURBX1NVQ0NFU1MpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJGYWlsZWQgY3JlYXRpbmcgQ1VEQSBjb250ZXh0IGZvciBOVkVOQzogMHgleFxuIiwgKGludCljdV9yZXMpOwotICAgICAgICByZXMgPSBBVkVSUk9SX0VYVEVSTkFMOwotICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCi0gICAgY3VfcmVzID0gZGxfZm4tPmN1X2N0eF9wb3BfY3VycmVudCgmY3VfY29udGV4dF9jdXJyKTsKKyAgICBjdHgtPmN1X2NvbnRleHQgPSBjdHgtPmN1X2NvbnRleHRfaW50ZXJuYWw7CiAKLSAgICBpZiAoY3VfcmVzICE9IENVREFfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19GQVRBTCwgIkZhaWxlZCBwb3BwaW5nIENVREEgY29udGV4dDogMHgleFxuIiwgKGludCljdV9yZXMpOwotICAgICAgICByZXMgPSBBVkVSUk9SX0VYVEVSTkFMOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KKyAgICBpZiAoKHJldCA9IG52ZW5jX3BvcF9jb250ZXh0KGF2Y3R4KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWwyOwogCi0gICAgZW5jb2RlX3Nlc3Npb25fcGFyYW1zLmRldmljZSA9IGN0eC0+Y3VfY29udGV4dDsKLSAgICBlbmNvZGVfc2Vzc2lvbl9wYXJhbXMuZGV2aWNlVHlwZSA9IE5WX0VOQ19ERVZJQ0VfVFlQRV9DVURBOworICAgIGlmICgocmV0ID0gbnZlbmNfb3Blbl9zZXNzaW9uKGF2Y3R4KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWwyOwogCi0gICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNPcGVuRW5jb2RlU2Vzc2lvbkV4KCZlbmNvZGVfc2Vzc2lvbl9wYXJhbXMsICZjdHgtPm52ZW5jb2Rlcik7Ci0gICAgaWYgKG52X3N0YXR1cyAhPSBOVl9FTkNfU1VDQ0VTUykgewotICAgICAgICBjdHgtPm52ZW5jb2RlciA9IE5VTEw7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiT3BlbkVuY29kZVNlc3Npb25FeCBmYWlsZWQ6IDB4JXhcbiIsIChpbnQpbnZfc3RhdHVzKTsKLSAgICAgICAgcmVzID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9CisgICAgaWYgKChyZXQgPSBudmVuY19jaGVja19jYXBhYmlsaXRpZXMoYXZjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDM7CiAKLSAgICBpZiAoY3R4LT5wcmVzZXQpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoY3R4LT5wcmVzZXQsICJzbG93IikpIHsKLSAgICAgICAgICAgIGVuY29kZXJfcHJlc2V0ID0gTlZfRU5DX1BSRVNFVF9IUV9HVUlEOwotICAgICAgICAgICAgY3R4LT50d29wYXNzID0gMTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGN0eC0+cHJlc2V0LCAibWVkaXVtIikpIHsKLSAgICAgICAgICAgIGVuY29kZXJfcHJlc2V0ID0gTlZfRU5DX1BSRVNFVF9IUV9HVUlEOwotICAgICAgICAgICAgY3R4LT50d29wYXNzID0gMDsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGN0eC0+cHJlc2V0LCAiZmFzdCIpKSB7Ci0gICAgICAgICAgICBlbmNvZGVyX3ByZXNldCA9IE5WX0VOQ19QUkVTRVRfSFBfR1VJRDsKLSAgICAgICAgICAgIGN0eC0+dHdvcGFzcyA9IDA7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPnByZXNldCwgImhxIikpIHsKLSAgICAgICAgICAgIGVuY29kZXJfcHJlc2V0ID0gTlZfRU5DX1BSRVNFVF9IUV9HVUlEOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5wcmVzZXQsICJocCIpKSB7Ci0gICAgICAgICAgICBlbmNvZGVyX3ByZXNldCA9IE5WX0VOQ19QUkVTRVRfSFBfR1VJRDsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGN0eC0+cHJlc2V0LCAiYmQiKSkgewotICAgICAgICAgICAgZW5jb2Rlcl9wcmVzZXQgPSBOVl9FTkNfUFJFU0VUX0JEX0dVSUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPnByZXNldCwgImxsIikpIHsKLSAgICAgICAgICAgIGVuY29kZXJfcHJlc2V0ID0gTlZfRU5DX1BSRVNFVF9MT1dfTEFURU5DWV9ERUZBVUxUX0dVSUQ7Ci0gICAgICAgICAgICBpc0xMID0gMTsKLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGN0eC0+cHJlc2V0LCAibGxocCIpKSB7Ci0gICAgICAgICAgICBlbmNvZGVyX3ByZXNldCA9IE5WX0VOQ19QUkVTRVRfTE9XX0xBVEVOQ1lfSFBfR1VJRDsKLSAgICAgICAgICAgIGlzTEwgPSAxOwotICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5wcmVzZXQsICJsbGhxIikpIHsKLSAgICAgICAgICAgIGVuY29kZXJfcHJlc2V0ID0gTlZfRU5DX1BSRVNFVF9MT1dfTEFURU5DWV9IUV9HVUlEOwotICAgICAgICAgICAgaXNMTCA9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPnByZXNldCwgImxvc3NsZXNzIikpIHsKLSAgICAgICAgICAgIGVuY29kZXJfcHJlc2V0ID0gTlZfRU5DX1BSRVNFVF9MT1NTTEVTU19ERUZBVUxUX0dVSUQ7Ci0gICAgICAgICAgICBsb3NzbGVzcyA9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPnByZXNldCwgImxvc3NsZXNzaHAiKSkgewotICAgICAgICAgICAgZW5jb2Rlcl9wcmVzZXQgPSBOVl9FTkNfUFJFU0VUX0xPU1NMRVNTX0hQX0dVSUQ7Ci0gICAgICAgICAgICBsb3NzbGVzcyA9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPnByZXNldCwgImRlZmF1bHQiKSkgewotICAgICAgICAgICAgZW5jb2Rlcl9wcmVzZXQgPSBOVl9FTkNfUFJFU0VUX0RFRkFVTFRfR1VJRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiUHJlc2V0IFwiJXNcIiBpcyB1bmtub3duISBTdXBwb3J0ZWQgcHJlc2V0czogc2xvdywgbWVkaXVtLCBoaWdoLCBocCwgaHEsIGJkLCBsbCwgbGxocCwgbGxocSwgbG9zc2xlc3MsIGxvc3NsZXNzaHAsIGRlZmF1bHRcbiIsIGN0eC0+cHJlc2V0KTsKLSAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICB9CisgICAgYXZfbG9nKGF2Y3R4LCBsb2dsZXZlbCwgInN1cHBvcnRzIE5WRU5DXG4iKTsKIAotICAgIGlmIChjdHgtPnR3b3Bhc3MgPCAwKSB7Ci0gICAgICAgIGN0eC0+dHdvcGFzcyA9IGlzTEw7Ci0gICAgfQorICAgIGRsX2ZuLT5udmVuY19kZXZpY2VfY291bnQrKzsKKworICAgIGlmIChjdHgtPmRldmljZSA9PSBpZHggfHwgY3R4LT5kZXZpY2UgPT0gQU5ZX0RFVklDRSkKKyAgICAgICAgcmV0dXJuIDA7CisKK2ZhaWwzOgorICAgIGlmICgocmV0ID0gbnZlbmNfcHVzaF9jb250ZXh0KGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcF9udmVuYy0+bnZFbmNEZXN0cm95RW5jb2RlcihjdHgtPm52ZW5jb2Rlcik7CisgICAgY3R4LT5udmVuY29kZXIgPSBOVUxMOworCisgICAgaWYgKChyZXQgPSBudmVuY19wb3BfY29udGV4dChhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworZmFpbDI6CisgICAgZGxfZm4tPmN1ZGFfZGwtPmN1Q3R4RGVzdHJveShjdHgtPmN1X2NvbnRleHRfaW50ZXJuYWwpOworICAgIGN0eC0+Y3VfY29udGV4dF9pbnRlcm5hbCA9IE5VTEw7CisKK2ZhaWw6CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX3NldHVwX2RldmljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggICAgICAgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTnZlbmNEeW5Mb2FkRnVuY3Rpb25zICpkbF9mbiA9ICZjdHgtPm52ZW5jX2Rsb2FkX2Z1bmNzOwogCiAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OgotICAgICAgICBjb2RlYyA9IE5WX0VOQ19DT0RFQ19IMjY0X0dVSUQ7CisgICAgICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuY29kZUdVSUQgPSBOVl9FTkNfQ09ERUNfSDI2NF9HVUlEOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjU6Ci0gICAgICAgIGNvZGVjID0gTlZfRU5DX0NPREVDX0hFVkNfR1VJRDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuY29kZUdVSUQgPSBOVl9FTkNfQ09ERUNfSEVWQ19HVUlEOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY29kZWMgbmFtZVxuIik7Ci0gICAgICAgIHJlcyA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOwogICAgIH0KIAotICAgIG52X3N0YXR1cyA9IHBfbnZlbmMtPm52RW5jR2V0RW5jb2RlUHJlc2V0Q29uZmlnKGN0eC0+bnZlbmNvZGVyLCBjb2RlYywgZW5jb2Rlcl9wcmVzZXQsICZwcmVzZXRfY29uZmlnKTsKLSAgICBpZiAobnZfc3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiR2V0RW5jb2RlUHJlc2V0Q29uZmlnIGZhaWxlZDogMHgleFxuIiwgKGludCludl9zdGF0dXMpOwotICAgICAgICByZXMgPSBBVkVSUk9SX0VYVEVSTkFMOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9DVURBIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTEgfHwgYXZjdHgtPmh3X2ZyYW1lc19jdHggfHwgYXZjdHgtPmh3X2RldmljZV9jdHgpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAqZnJhbWVzX2N0eDsKKyAgICAgICAgQVZIV0RldmljZUNvbnRleHQgICAqaHdkZXZfY3R4OworICAgICAgICBBVkNVREFEZXZpY2VDb250ZXh0ICpjdWRhX2RldmljZV9od2N0eCA9IE5VTEw7CisjaWYgQ09ORklHX0QzRDExVkEKKyAgICAgICAgQVZEM0QxMVZBRGV2aWNlQ29udGV4dCAqZDNkMTFfZGV2aWNlX2h3Y3R4ID0gTlVMTDsKKyNlbmRpZgorICAgICAgICBpbnQgcmV0OwogCi0gICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZW5jb2RlR1VJRCA9IGNvZGVjOwotICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuY29kZUhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7Ci0gICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZW5jb2RlV2lkdGggPSBhdmN0eC0+d2lkdGg7CisgICAgICAgIGlmIChhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICAgICAgZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgICAgICAgICBpZiAoZnJhbWVzX2N0eC0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfQ1VEQSkKKyAgICAgICAgICAgICAgICBjdWRhX2RldmljZV9od2N0eCA9IGZyYW1lc19jdHgtPmRldmljZV9jdHgtPmh3Y3R4OworI2lmIENPTkZJR19EM0QxMVZBCisgICAgICAgICAgICBlbHNlIGlmIChmcmFtZXNfY3R4LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkKKyAgICAgICAgICAgICAgICBkM2QxMV9kZXZpY2VfaHdjdHggPSBmcmFtZXNfY3R4LT5kZXZpY2VfY3R4LT5od2N0eDsKKyNlbmRpZgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmh3X2RldmljZV9jdHgpIHsKKyAgICAgICAgICAgIGh3ZGV2X2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCopYXZjdHgtPmh3X2RldmljZV9jdHgtPmRhdGE7CisgICAgICAgICAgICBpZiAoaHdkZXZfY3R4LT50eXBlID09IEFWX0hXREVWSUNFX1RZUEVfQ1VEQSkKKyAgICAgICAgICAgICAgICBjdWRhX2RldmljZV9od2N0eCA9IGh3ZGV2X2N0eC0+aHdjdHg7CisjaWYgQ09ORklHX0QzRDExVkEKKyAgICAgICAgICAgIGVsc2UgaWYgKGh3ZGV2X2N0eC0+dHlwZSA9PSBBVl9IV0RFVklDRV9UWVBFX0QzRDExVkEpCisgICAgICAgICAgICAgICAgZDNkMTFfZGV2aWNlX2h3Y3R4ID0gaHdkZXZfY3R4LT5od2N0eDsKKyNlbmRpZgorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CiAKLSAgICBpZiAoYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAmJgotICAgICAgICAoYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICE9IDEgfHwgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICE9IDEpKSB7Ci0gICAgICAgIGF2X3JlZHVjZSgmZHcsICZkaCwKLSAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgKiBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCi0gICAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCk7Ci0gICAgICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmRhckhlaWdodCA9IGRoOwotICAgICAgICBjdHgtPmluaXRfZW5jb2RlX3BhcmFtcy5kYXJXaWR0aCA9IGR3OworICAgICAgICBpZiAoY3VkYV9kZXZpY2VfaHdjdHgpIHsKKyAgICAgICAgICAgIGN0eC0+Y3VfY29udGV4dCA9IGN1ZGFfZGV2aWNlX2h3Y3R4LT5jdWRhX2N0eDsKKyAgICAgICAgfQorI2lmIENPTkZJR19EM0QxMVZBCisgICAgICAgIGVsc2UgaWYgKGQzZDExX2RldmljZV9od2N0eCkgeworICAgICAgICAgICAgY3R4LT5kM2QxMV9kZXZpY2UgPSBkM2QxMV9kZXZpY2VfaHdjdHgtPmRldmljZTsKKyAgICAgICAgICAgIElEM0QxMURldmljZV9BZGRSZWYoY3R4LT5kM2QxMV9kZXZpY2UpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICByZXQgPSBudmVuY19vcGVuX3Nlc3Npb24oYXZjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gbnZlbmNfY2hlY2tfY2FwYWJpbGl0aWVzKGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiUHJvdmlkZWQgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCByZXF1aXJlZCBOVkVOQyBmZWF0dXJlc1xuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZGFySGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKLSAgICAgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZGFyV2lkdGggPSBhdmN0eC0+d2lkdGg7Ci0gICAgfQorICAgICAgICBpbnQgaSwgbmJfZGV2aWNlcyA9IDA7CiAKLSAgICAvLyBEZS1jb21wZW5zYXRlIGZvciBoYXJkd2FyZSwgZHViaW91c2x5LCB0cnlpbmcgdG8gY29tcGVuc2F0ZSBmb3IKLSAgICAvLyBwbGF5YmFjayBhdCA3MDQgcGl4ZWwgd2lkdGguCi0gICAgaWYgKGF2Y3R4LT53aWR0aCA9PSA3MjAgJiYKLSAgICAgICAgKGF2Y3R4LT5oZWlnaHQgPT0gNDgwIHx8IGF2Y3R4LT5oZWlnaHQgPT0gNTc2KSkgewotICAgICAgICBhdl9yZWR1Y2UoJmR3LCAmZGgsCi0gICAgICAgICAgICAgICAgICBjdHgtPmluaXRfZW5jb2RlX3BhcmFtcy5kYXJXaWR0aCAqIDQ0LAotICAgICAgICAgICAgICAgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZGFySGVpZ2h0ICogNDUsCi0gICAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCk7Ci0gICAgICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmRhckhlaWdodCA9IGRoOwotICAgICAgICBjdHgtPmluaXRfZW5jb2RlX3BhcmFtcy5kYXJXaWR0aCA9IGR3OwotICAgIH0KLQotICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmZyYW1lUmF0ZU51bSA9IGF2Y3R4LT50aW1lX2Jhc2UuZGVuOwotICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmZyYW1lUmF0ZURlbiA9IGF2Y3R4LT50aW1lX2Jhc2UubnVtICogYXZjdHgtPnRpY2tzX3Blcl9mcmFtZTsKLQotICAgIG51bV9tYnMgPSAoKGF2Y3R4LT53aWR0aCArIDE1KSA+PiA0KSAqICgoYXZjdHgtPmhlaWdodCArIDE1KSA+PiA0KTsKLSAgICBjdHgtPm1heF9zdXJmYWNlX2NvdW50ID0gKG51bV9tYnMgPj0gODE2MCkgPyAzMiA6IDQ4OwotCi0gICAgaWYgKGN0eC0+YnVmZmVyX2RlbGF5ID49IGN0eC0+bWF4X3N1cmZhY2VfY291bnQpCi0gICAgICAgIGN0eC0+YnVmZmVyX2RlbGF5ID0gY3R4LT5tYXhfc3VyZmFjZV9jb3VudCAtIDE7Ci0KLSAgICBjdHgtPmluaXRfZW5jb2RlX3BhcmFtcy5lbmFibGVFbmNvZGVBc3luYyA9IDA7Ci0gICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZW5hYmxlUFREID0gMTsKLQotICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLnByZXNldEdVSUQgPSBlbmNvZGVyX3ByZXNldDsKLQotICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuY29kZUNvbmZpZyA9ICZjdHgtPmVuY29kZV9jb25maWc7Ci0gICAgbWVtY3B5KCZjdHgtPmVuY29kZV9jb25maWcsICZwcmVzZXRfY29uZmlnLnByZXNldENmZywgc2l6ZW9mKGN0eC0+ZW5jb2RlX2NvbmZpZykpOwotICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy52ZXJzaW9uID0gTlZfRU5DX0NPTkZJR19WRVI7Ci0KLSAgICBpZiAoYXZjdHgtPnJlZnMgPj0gMCkgewotICAgICAgICAvKiAwIG1lYW5zICJsZXQgdGhlIGhhcmR3YXJlIGRlY2lkZSIgKi8KLSAgICAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7Ci0gICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oMjY0Q29uZmlnLm1heE51bVJlZkZyYW1lcyA9IGF2Y3R4LT5yZWZzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NToKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oZXZjQ29uZmlnLm1heE51bVJlZkZyYW1lc0luRFBCID0gYXZjdHgtPnJlZnM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyogRWFybGllciBzd2l0Y2gvY2FzZSB3aWxsIHJldHVybiBpZiB1bmtub3duIGNvZGVjIGlzIHBhc3NlZC4gKi8KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhdmN0eC0+Z29wX3NpemUgPiAwKSB7Ci0gICAgICAgIGlmIChhdmN0eC0+bWF4X2JfZnJhbWVzID49IDApIHsKLSAgICAgICAgICAgIC8qIDAgaXMgaW50cmEtb25seSwgMSBpcyBJL1Agb25seSwgMiBpcyBvbmUgQiBGcmFtZSwgMyB0d28gQiBmcmFtZXMsIGFuZCBzbyBvbi4gKi8KLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5mcmFtZUludGVydmFsUCA9IGF2Y3R4LT5tYXhfYl9mcmFtZXMgKyAxOworICAgICAgICBpZiAoKGRsX2ZuLT5jdWRhX2RsLT5jdUluaXQoMCkpICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBpbml0IENVREFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCi0gICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5nb3BMZW5ndGggPSBhdmN0eC0+Z29wX3NpemU7Ci0gICAgICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgewotICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6Ci0gICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5pZHJQZXJpb2QgPSBhdmN0eC0+Z29wX3NpemU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY1OgotICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmhldmNDb25maWcuaWRyUGVyaW9kID0gYXZjdHgtPmdvcF9zaXplOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIC8qIEVhcmxpZXIgc3dpdGNoL2Nhc2Ugd2lsbCByZXR1cm4gaWYgdW5rbm93biBjb2RlYyBpcyBwYXNzZWQuICovCisgICAgICAgIGlmICgoZGxfZm4tPmN1ZGFfZGwtPmN1RGV2aWNlR2V0Q291bnQoJm5iX2RldmljZXMpKSAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZW51bWVyYXRlIHRoZSBDVURBIGRldmljZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXZjdHgtPmdvcF9zaXplID09IDApIHsKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmZyYW1lSW50ZXJ2YWxQID0gMDsKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmdvcExlbmd0aCA9IDE7Ci0gICAgICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgewotICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6Ci0gICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5pZHJQZXJpb2QgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NToKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oZXZjQ29uZmlnLmlkclBlcmlvZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgLyogRWFybGllciBzd2l0Y2gvY2FzZSB3aWxsIHJldHVybiBpZiB1bmtub3duIGNvZGVjIGlzIHBhc3NlZC4gKi8KKworICAgICAgICBpZiAoIW5iX2RldmljZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiTm8gQ1VEQSBjYXBhYmxlIGRldmljZXMgZm91bmRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwogICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIiVkIENVREEgY2FwYWJsZSBkZXZpY2VzIGZvdW5kXG4iLCBuYl9kZXZpY2VzKTsKKworICAgICAgICBkbF9mbi0+bnZlbmNfZGV2aWNlX2NvdW50ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2RldmljZXM7ICsraSkgeworICAgICAgICAgICAgaWYgKChudmVuY19jaGVja19kZXZpY2UoYXZjdHgsIGkpKSA+PSAwICYmIGN0eC0+ZGV2aWNlICE9IExJU1RfREVWSUNFUykKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdHgtPmRldmljZSA9PSBMSVNUX0RFVklDRVMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworCisgICAgICAgIGlmICghZGxfZm4tPm52ZW5jX2RldmljZV9jb3VudCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJObyBOVkVOQyBjYXBhYmxlIGRldmljZXMgZm91bmRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19GQVRBTCwgIlJlcXVlc3RlZCBHUFUgJWQsIGJ1dCBvbmx5ICVkIEdQVXMgYXJlIGF2YWlsYWJsZSFcbiIsIGN0eC0+ZGV2aWNlLCBuYl9kZXZpY2VzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICAvKiB3aGVuIHRoZXJlJ3JlIGIgZnJhbWVzLCBzZXQgZHRzIG9mZnNldCAqLwotICAgIGlmIChjdHgtPmVuY29kZV9jb25maWcuZnJhbWVJbnRlcnZhbFAgPj0gMikKLSAgICAgICAgY3R4LT5sYXN0X2R0cyA9IC0yOworICAgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBHVUlEVHVwbGUgeworICAgIGNvbnN0IEdVSUQgZ3VpZDsKKyAgICBpbnQgZmxhZ3M7Cit9IEdVSURUdXBsZTsKKworI2RlZmluZSBQUkVTRVRfQUxJQVMoYWxpYXMsIG5hbWUsIC4uLikgXAorICAgIFtQUkVTRVRfICMjIGFsaWFzXSA9IHsgTlZfRU5DX1BSRVNFVF8gIyMgbmFtZSAjIyBfR1VJRCwgX19WQV9BUkdTX18gfQorCisjZGVmaW5lIFBSRVNFVChuYW1lLCAuLi4pIFBSRVNFVF9BTElBUyhuYW1lLCBuYW1lLCBfX1ZBX0FSR1NfXykKKworc3RhdGljIHZvaWQgbnZlbmNfbWFwX3ByZXNldChOdmVuY0NvbnRleHQgKmN0eCkKK3sKKyAgICBHVUlEVHVwbGUgcHJlc2V0c1tdID0geworICAgICAgICBQUkVTRVQoREVGQVVMVCksCisgICAgICAgIFBSRVNFVChIUCksCisgICAgICAgIFBSRVNFVChIUSksCisgICAgICAgIFBSRVNFVChCRCksCisgICAgICAgIFBSRVNFVF9BTElBUyhTTE9XLCAgIEhRLCAgICBOVkVOQ19UV09fUEFTU0VTKSwKKyAgICAgICAgUFJFU0VUX0FMSUFTKE1FRElVTSwgSFEsICAgIE5WRU5DX09ORV9QQVNTKSwKKyAgICAgICAgUFJFU0VUX0FMSUFTKEZBU1QsICAgSFAsICAgIE5WRU5DX09ORV9QQVNTKSwKKyAgICAgICAgUFJFU0VUKExPV19MQVRFTkNZX0RFRkFVTFQsIE5WRU5DX0xPV0xBVEVOQ1kpLAorICAgICAgICBQUkVTRVQoTE9XX0xBVEVOQ1lfSFAsICAgICAgTlZFTkNfTE9XTEFURU5DWSksCisgICAgICAgIFBSRVNFVChMT1dfTEFURU5DWV9IUSwgICAgICBOVkVOQ19MT1dMQVRFTkNZKSwKKyAgICAgICAgUFJFU0VUKExPU1NMRVNTX0RFRkFVTFQsICAgIE5WRU5DX0xPU1NMRVNTKSwKKyAgICAgICAgUFJFU0VUKExPU1NMRVNTX0hQLCAgICAgICAgIE5WRU5DX0xPU1NMRVNTKSwKKyAgICB9OworCisgICAgR1VJRFR1cGxlICp0ID0gJnByZXNldHNbY3R4LT5wcmVzZXRdOworCisgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMucHJlc2V0R1VJRCA9IHQtPmd1aWQ7CisgICAgY3R4LT5mbGFncyA9IHQtPmZsYWdzOworfQorCisjdW5kZWYgUFJFU0VUCisjdW5kZWYgUFJFU0VUX0FMSUFTCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgc2V0X2NvbnN0cXAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBOVl9FTkNfUkNfUEFSQU1TICpyYyA9ICZjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXM7CisKKyAgICByYy0+cmF0ZUNvbnRyb2xNb2RlID0gTlZfRU5DX1BBUkFNU19SQ19DT05TVFFQOworCisgICAgaWYgKGN0eC0+aW5pdF9xcF9wID49IDApIHsKKyAgICAgICAgcmMtPmNvbnN0UVAucXBJbnRlclAgPSBjdHgtPmluaXRfcXBfcDsKKyAgICAgICAgaWYgKGN0eC0+aW5pdF9xcF9pID49IDAgJiYgY3R4LT5pbml0X3FwX2IgPj0gMCkgeworICAgICAgICAgICAgcmMtPmNvbnN0UVAucXBJbnRyYSA9IGN0eC0+aW5pdF9xcF9pOworICAgICAgICAgICAgcmMtPmNvbnN0UVAucXBJbnRlckIgPSBjdHgtPmluaXRfcXBfYjsKKyAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+aV9xdWFudF9mYWN0b3IgIT0gMC4wICYmIGF2Y3R4LT5iX3F1YW50X2ZhY3RvciAhPSAwLjApIHsKKyAgICAgICAgICAgIHJjLT5jb25zdFFQLnFwSW50cmEgPSBhdl9jbGlwKAorICAgICAgICAgICAgICAgIHJjLT5jb25zdFFQLnFwSW50ZXJQICogZmFicyhhdmN0eC0+aV9xdWFudF9mYWN0b3IpICsgYXZjdHgtPmlfcXVhbnRfb2Zmc2V0ICsgMC41LCAwLCA1MSk7CisgICAgICAgICAgICByYy0+Y29uc3RRUC5xcEludGVyQiA9IGF2X2NsaXAoCisgICAgICAgICAgICAgICAgcmMtPmNvbnN0UVAucXBJbnRlclAgKiBmYWJzKGF2Y3R4LT5iX3F1YW50X2ZhY3RvcikgKyBhdmN0eC0+Yl9xdWFudF9vZmZzZXQgKyAwLjUsIDAsIDUxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJjLT5jb25zdFFQLnFwSW50cmEgPSByYy0+Y29uc3RRUC5xcEludGVyUDsKKyAgICAgICAgICAgIHJjLT5jb25zdFFQLnFwSW50ZXJCID0gcmMtPmNvbnN0UVAucXBJbnRlclA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGN0eC0+Y3FwID49IDApIHsKKyAgICAgICAgcmMtPmNvbnN0UVAucXBJbnRlclAgPSByYy0+Y29uc3RRUC5xcEludGVyQiA9IHJjLT5jb25zdFFQLnFwSW50cmEgPSBjdHgtPmNxcDsKKyAgICAgICAgaWYgKGF2Y3R4LT5iX3F1YW50X2ZhY3RvciAhPSAwLjApCisgICAgICAgICAgICByYy0+Y29uc3RRUC5xcEludGVyQiA9IGF2X2NsaXAoY3R4LT5jcXAgKiBmYWJzKGF2Y3R4LT5iX3F1YW50X2ZhY3RvcikgKyBhdmN0eC0+Yl9xdWFudF9vZmZzZXQgKyAwLjUsIDAsIDUxKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5pX3F1YW50X2ZhY3RvciAhPSAwLjApCisgICAgICAgICAgICByYy0+Y29uc3RRUC5xcEludHJhID0gYXZfY2xpcChjdHgtPmNxcCAqIGZhYnMoYXZjdHgtPmlfcXVhbnRfZmFjdG9yKSArIGF2Y3R4LT5pX3F1YW50X29mZnNldCArIDAuNSwgMCwgNTEpOworICAgIH0KKworICAgIGF2Y3R4LT5xbWluID0gLTE7CisgICAgYXZjdHgtPnFtYXggPSAtMTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBzZXRfdmJyKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBOdmVuY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTlZfRU5DX1JDX1BBUkFNUyAqcmMgPSAmY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zOworICAgIGludCBxcF9pbnRlcl9wOworCisgICAgaWYgKGF2Y3R4LT5xbWluID49IDAgJiYgYXZjdHgtPnFtYXggPj0gMCkgeworICAgICAgICByYy0+ZW5hYmxlTWluUVAgPSAxOworICAgICAgICByYy0+ZW5hYmxlTWF4UVAgPSAxOworCisgICAgICAgIHJjLT5taW5RUC5xcEludGVyQiA9IGF2Y3R4LT5xbWluOworICAgICAgICByYy0+bWluUVAucXBJbnRlclAgPSBhdmN0eC0+cW1pbjsKKyAgICAgICAgcmMtPm1pblFQLnFwSW50cmEgID0gYXZjdHgtPnFtaW47CisKKyAgICAgICAgcmMtPm1heFFQLnFwSW50ZXJCID0gYXZjdHgtPnFtYXg7CisgICAgICAgIHJjLT5tYXhRUC5xcEludGVyUCA9IGF2Y3R4LT5xbWF4OworICAgICAgICByYy0+bWF4UVAucXBJbnRyYSA9IGF2Y3R4LT5xbWF4OworCisgICAgICAgIHFwX2ludGVyX3AgPSAoYXZjdHgtPnFtYXggKyAzICogYXZjdHgtPnFtaW4pIC8gNDsgLy8gYmlhc2VkIHRvd2FyZHMgUW1pbgorICAgIH0gZWxzZSBpZiAoYXZjdHgtPnFtaW4gPj0gMCkgeworICAgICAgICByYy0+ZW5hYmxlTWluUVAgPSAxOworCisgICAgICAgIHJjLT5taW5RUC5xcEludGVyQiA9IGF2Y3R4LT5xbWluOworICAgICAgICByYy0+bWluUVAucXBJbnRlclAgPSBhdmN0eC0+cW1pbjsKKyAgICAgICAgcmMtPm1pblFQLnFwSW50cmEgPSBhdmN0eC0+cW1pbjsKKworICAgICAgICBxcF9pbnRlcl9wID0gYXZjdHgtPnFtaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcXBfaW50ZXJfcCA9IDI2OyAvLyBkZWZhdWx0IHRvIDI2CisgICAgfQorCisgICAgcmMtPmVuYWJsZUluaXRpYWxSQ1FQID0gMTsKKworICAgIGlmIChjdHgtPmluaXRfcXBfcCA8IDApIHsKKyAgICAgICAgcmMtPmluaXRpYWxSQ1FQLnFwSW50ZXJQICA9IHFwX2ludGVyX3A7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMtPmluaXRpYWxSQ1FQLnFwSW50ZXJQID0gY3R4LT5pbml0X3FwX3A7CisgICAgfQorCisgICAgaWYgKGN0eC0+aW5pdF9xcF9pIDwgMCkgeworICAgICAgICBpZiAoYXZjdHgtPmlfcXVhbnRfZmFjdG9yICE9IDAuMCAmJiBhdmN0eC0+Yl9xdWFudF9mYWN0b3IgIT0gMC4wKSB7CisgICAgICAgICAgICByYy0+aW5pdGlhbFJDUVAucXBJbnRyYSA9IGF2X2NsaXAoCisgICAgICAgICAgICAgICAgcmMtPmluaXRpYWxSQ1FQLnFwSW50ZXJQICogZmFicyhhdmN0eC0+aV9xdWFudF9mYWN0b3IpICsgYXZjdHgtPmlfcXVhbnRfb2Zmc2V0ICsgMC41LCAwLCA1MSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYy0+aW5pdGlhbFJDUVAucXBJbnRyYSA9IHJjLT5pbml0aWFsUkNRUC5xcEludGVyUDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJjLT5pbml0aWFsUkNRUC5xcEludHJhID0gY3R4LT5pbml0X3FwX2k7CisgICAgfQorCisgICAgaWYgKGN0eC0+aW5pdF9xcF9iIDwgMCkgeworICAgICAgICBpZiAoYXZjdHgtPmlfcXVhbnRfZmFjdG9yICE9IDAuMCAmJiBhdmN0eC0+Yl9xdWFudF9mYWN0b3IgIT0gMC4wKSB7CisgICAgICAgICAgICByYy0+aW5pdGlhbFJDUVAucXBJbnRlckIgPSBhdl9jbGlwKAorICAgICAgICAgICAgICAgIHJjLT5pbml0aWFsUkNRUC5xcEludGVyUCAqIGZhYnMoYXZjdHgtPmJfcXVhbnRfZmFjdG9yKSArIGF2Y3R4LT5iX3F1YW50X29mZnNldCArIDAuNSwgMCwgNTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmMtPmluaXRpYWxSQ1FQLnFwSW50ZXJCID0gcmMtPmluaXRpYWxSQ1FQLnFwSW50ZXJQOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMtPmluaXRpYWxSQ1FQLnFwSW50ZXJCID0gY3R4LT5pbml0X3FwX2I7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHNldF9sb3NzbGVzcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE5WX0VOQ19SQ19QQVJBTVMgKnJjID0gJmN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtczsKKworICAgIHJjLT5yYXRlQ29udHJvbE1vZGUgPSBOVl9FTkNfUEFSQU1TX1JDX0NPTlNUUVA7CisgICAgcmMtPmNvbnN0UVAucXBJbnRlckIgPSAwOworICAgIHJjLT5jb25zdFFQLnFwSW50ZXJQID0gMDsKKyAgICByYy0+Y29uc3RRUC5xcEludHJhICA9IDA7CisKKyAgICBhdmN0eC0+cW1pbiA9IC0xOworICAgIGF2Y3R4LT5xbWF4ID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIG52ZW5jX292ZXJyaWRlX3JhdGVfY29udHJvbChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE5WX0VOQ19SQ19QQVJBTVMgKnJjID0gJmN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtczsKKworICAgIHN3aXRjaCAoY3R4LT5yYykgeworICAgIGNhc2UgTlZfRU5DX1BBUkFNU19SQ19DT05TVFFQOgorICAgICAgICBzZXRfY29uc3RxcChhdmN0eCk7CisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIE5WX0VOQ19QQVJBTVNfUkNfVkJSX01JTlFQOgorICAgICAgICBpZiAoYXZjdHgtPnFtaW4gPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJUaGUgdmFyaWFibGUgYml0cmF0ZSByYXRlLWNvbnRyb2wgcmVxdWlyZXMgIgorICAgICAgICAgICAgICAgICAgICJ0aGUgJ3FtaW4nIG9wdGlvbiBzZXQuXG4iKTsKKyAgICAgICAgICAgIHNldF92YnIoYXZjdHgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgIGNhc2UgTlZfRU5DX1BBUkFNU19SQ19WQlJfSFE6CisgICAgY2FzZSBOVl9FTkNfUEFSQU1TX1JDX1ZCUjoKKyAgICAgICAgc2V0X3ZicihhdmN0eCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlZfRU5DX1BBUkFNU19SQ19DQlI6CisgICAgY2FzZSBOVl9FTkNfUEFSQU1TX1JDX0NCUl9IUToKKyAgICBjYXNlIE5WX0VOQ19QQVJBTVNfUkNfQ0JSX0xPV0RFTEFZX0hROgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByYy0+cmF0ZUNvbnRyb2xNb2RlID0gY3R4LT5yYzsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX3JlY2FsY19zdXJmYWNlcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIC8vIGRlZmF1bHQgbWluaW11bSBvZiA0IHN1cmZhY2VzCisgICAgLy8gbXVsdGlwbHkgYnkgMiBmb3IgbnVtYmVyIG9mIE5WRU5DcyBvbiBncHUgKGhhcmRjb2RlIHRvIDIpCisgICAgLy8gYW5vdGhlciBtdWx0aXBseSBieSAyIHRvIGF2b2lkIGJsb2NraW5nIG5leHQgUEJCIGdyb3VwCisgICAgaW50IG5iX3N1cmZhY2VzID0gRkZNQVgoNCwgY3R4LT5lbmNvZGVfY29uZmlnLmZyYW1lSW50ZXJ2YWxQICogMiAqIDIpOworCisgICAgLy8gbG9va2FoZWFkIGVuYWJsZWQKKyAgICBpZiAoY3R4LT5yY19sb29rYWhlYWQgPiAwKSB7CisgICAgICAgIC8vICsxIGlzIHRvIGFjY291bnQgZm9yIGxrZF9ib3VuZCBjYWxjdWxhdGlvbiBsYXRlcgorICAgICAgICAvLyArNCBpcyB0byBhbGxvdyBzdWZmaWNpZW50IHBpcGVsaW5pbmcgd2l0aCBsb29rYWhlYWQKKyAgICAgICAgbmJfc3VyZmFjZXMgPSBGRk1BWCgxLCBGRk1BWChuYl9zdXJmYWNlcywgY3R4LT5yY19sb29rYWhlYWQgKyBjdHgtPmVuY29kZV9jb25maWcuZnJhbWVJbnRlcnZhbFAgKyAxICsgNCkpOworICAgICAgICBpZiAobmJfc3VyZmFjZXMgPiBjdHgtPm5iX3N1cmZhY2VzICYmIGN0eC0+bmJfc3VyZmFjZXMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJEZWZpbmVkIHJjX2xvb2thaGVhZCByZXF1aXJlcyBtb3JlIHN1cmZhY2VzLCAiCisgICAgICAgICAgICAgICAgICAgImluY3JlYXNpbmcgdXNlZCBzdXJmYWNlcyAlZCAtPiAlZFxuIiwgY3R4LT5uYl9zdXJmYWNlcywgbmJfc3VyZmFjZXMpOworICAgICAgICB9CisgICAgICAgIGN0eC0+bmJfc3VyZmFjZXMgPSBGRk1BWChuYl9zdXJmYWNlcywgY3R4LT5uYl9zdXJmYWNlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGN0eC0+ZW5jb2RlX2NvbmZpZy5mcmFtZUludGVydmFsUCA+IDEgJiYgY3R4LT5uYl9zdXJmYWNlcyA8IG5iX3N1cmZhY2VzICYmIGN0eC0+bmJfc3VyZmFjZXMgPiAwKQorICAgICAgICB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJEZWZpbmVkIGItZnJhbWUgcmVxdWlyZXMgbW9yZSBzdXJmYWNlcywgIgorICAgICAgICAgICAgICAgICAgICJpbmNyZWFzaW5nIHVzZWQgc3VyZmFjZXMgJWQgLT4gJWRcbiIsIGN0eC0+bmJfc3VyZmFjZXMsIG5iX3N1cmZhY2VzKTsKKyAgICAgICAgICAgIGN0eC0+bmJfc3VyZmFjZXMgPSBGRk1BWChjdHgtPm5iX3N1cmZhY2VzLCBuYl9zdXJmYWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoY3R4LT5uYl9zdXJmYWNlcyA8PSAwKQorICAgICAgICAgICAgY3R4LT5uYl9zdXJmYWNlcyA9IG5iX3N1cmZhY2VzOworICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHVzZXIgc3BlY2lmaWVkIHZhbHVlCisgICAgfQorCisgICAgY3R4LT5uYl9zdXJmYWNlcyA9IEZGTUFYKDEsIEZGTUlOKE1BWF9SRUdJU1RFUkVEX0ZSQU1FUywgY3R4LT5uYl9zdXJmYWNlcykpOworICAgIGN0eC0+YXN5bmNfZGVwdGggPSBGRk1JTihjdHgtPmFzeW5jX2RlcHRoLCBjdHgtPm5iX3N1cmZhY2VzIC0gMSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBudmVuY19zZXR1cF9yYXRlX2NvbnRyb2woQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgPiAwKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVXNpbmcgZ2xvYmFsX3F1YWxpdHkgd2l0aCBudmVuYyBpcyBkZXByZWNhdGVkLiBVc2UgcXAgaW5zdGVhZC5cbiIpOworCisgICAgaWYgKGN0eC0+Y3FwIDwgMCAmJiBhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgPiAwKQorICAgICAgICBjdHgtPmNxcCA9IGF2Y3R4LT5nbG9iYWxfcXVhbGl0eTsKIAogICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPiAwKSB7CiAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5hdmVyYWdlQml0UmF0ZSA9IGF2Y3R4LT5iaXRfcmF0ZTsKQEAgLTc3Niw4MiArODI3LDQ3IEBACiAgICAgaWYgKGF2Y3R4LT5yY19tYXhfcmF0ZSA+IDApCiAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5tYXhCaXRSYXRlID0gYXZjdHgtPnJjX21heF9yYXRlOwogCi0gICAgaWYgKGxvc3NsZXNzKSB7Ci0gICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0gyNjQpCi0gICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5xcFByaW1lWVplcm9UcmFuc2Zvcm1CeXBhc3NGbGFnID0gMTsKKyAgICBpZiAoY3R4LT5yYyA8IDApIHsKKyAgICAgICAgaWYgKGN0eC0+ZmxhZ3MgJiBOVkVOQ19PTkVfUEFTUykKKyAgICAgICAgICAgIGN0eC0+dHdvcGFzcyA9IDA7CisgICAgICAgIGlmIChjdHgtPmZsYWdzICYgTlZFTkNfVFdPX1BBU1NFUykKKyAgICAgICAgICAgIGN0eC0+dHdvcGFzcyA9IDE7CiAKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLnJhdGVDb250cm9sTW9kZSA9IE5WX0VOQ19QQVJBTVNfUkNfQ09OU1RRUDsKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLmNvbnN0UVAucXBJbnRlckIgPSAwOwotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuY29uc3RRUC5xcEludGVyUCA9IDA7Ci0gICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5jb25zdFFQLnFwSW50cmEgPSAwOworICAgICAgICBpZiAoY3R4LT50d29wYXNzIDwgMCkKKyAgICAgICAgICAgIGN0eC0+dHdvcGFzcyA9IChjdHgtPmZsYWdzICYgTlZFTkNfTE9XTEFURU5DWSkgIT0gMDsKIAotICAgICAgICBhdmN0eC0+cW1pbiA9IC0xOwotICAgICAgICBhdmN0eC0+cW1heCA9IC0xOwotICAgIH0gZWxzZSBpZiAoY3R4LT5jYnIpIHsKLSAgICAgICAgaWYgKCFjdHgtPnR3b3Bhc3MpIHsKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5yYXRlQ29udHJvbE1vZGUgPSBOVl9FTkNfUEFSQU1TX1JDX0NCUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5yYXRlQ29udHJvbE1vZGUgPSBOVl9FTkNfUEFSQU1TX1JDXzJfUEFTU19RVUFMSVRZOwotCi0gICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuYWRhcHRpdmVUcmFuc2Zvcm1Nb2RlID0gTlZfRU5DX0gyNjRfQURBUFRJVkVfVFJBTlNGT1JNX0VOQUJMRTsKLSAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5mbW9Nb2RlID0gTlZfRU5DX0gyNjRfRk1PX0RJU0FCTEU7CisgICAgICAgIGlmIChjdHgtPmNicikgeworICAgICAgICAgICAgaWYgKGN0eC0+dHdvcGFzcykgeworICAgICAgICAgICAgICAgIGN0eC0+cmMgPSBOVl9FTkNfUEFSQU1TX1JDX0NCUl9MT1dERUxBWV9IUTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY3R4LT5yYyA9IE5WX0VOQ19QQVJBTVNfUkNfQ0JSOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGN0eC0+Y3FwID49IDApIHsKKyAgICAgICAgICAgIGN0eC0+cmMgPSBOVl9FTkNfUEFSQU1TX1JDX0NPTlNUUVA7CisgICAgICAgIH0gZWxzZSBpZiAoY3R4LT50d29wYXNzKSB7CisgICAgICAgICAgICBjdHgtPnJjID0gTlZfRU5DX1BBUkFNU19SQ19WQlJfSFE7CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPnFtaW4gPj0gMCAmJiBhdmN0eC0+cW1heCA+PSAwKSB7CisgICAgICAgICAgICBjdHgtPnJjID0gTlZfRU5DX1BBUkFNU19SQ19WQlJfTUlOUVA7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSA+IDApIHsKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLnJhdGVDb250cm9sTW9kZSA9IE5WX0VOQ19QQVJBTVNfUkNfQ09OU1RRUDsKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLmNvbnN0UVAucXBJbnRlckIgPSBhdmN0eC0+Z2xvYmFsX3F1YWxpdHk7Ci0gICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5jb25zdFFQLnFwSW50ZXJQID0gYXZjdHgtPmdsb2JhbF9xdWFsaXR5OwotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuY29uc3RRUC5xcEludHJhID0gYXZjdHgtPmdsb2JhbF9xdWFsaXR5OworICAgIH0KIAotICAgICAgICBhdmN0eC0+cW1pbiA9IC0xOwotICAgICAgICBhdmN0eC0+cW1heCA9IC0xOworICAgIGlmIChjdHgtPnJjID49IDAgJiYgY3R4LT5yYyAmIFJDX01PREVfREVQUkVDQVRFRCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiU3BlY2lmaWVkIHJjIG1vZGUgaXMgZGVwcmVjYXRlZC5cbiIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiXHRsbF8ycGFzc19xdWFsaXR5IC0+IGNicl9sZF9ocVxuIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJcdGxsXzJwYXNzX3NpemUgLT4gY2JyX2hxXG4iKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlx0dmJyXzJwYXNzIC0+IHZicl9ocVxuIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJcdHZicl9taW5xcCAtPiAobm8gcmVwbGFjZW1lbnQpXG4iKTsKKworICAgICAgICBjdHgtPnJjICY9IH5SQ19NT0RFX0RFUFJFQ0FURUQ7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZmxhZ3MgJiBOVkVOQ19MT1NTTEVTUykgeworICAgICAgICBzZXRfbG9zc2xlc3MoYXZjdHgpOworICAgIH0gZWxzZSBpZiAoY3R4LT5yYyA+PSAwKSB7CisgICAgICAgIG52ZW5jX292ZXJyaWRlX3JhdGVfY29udHJvbChhdmN0eCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGF2Y3R4LT5xbWluID49IDAgJiYgYXZjdHgtPnFtYXggPj0gMCkgewotICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLmVuYWJsZU1pblFQID0gMTsKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5lbmFibGVNYXhRUCA9IDE7Ci0KLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5taW5RUC5xcEludGVyQiA9IGF2Y3R4LT5xbWluOwotICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLm1pblFQLnFwSW50ZXJQID0gYXZjdHgtPnFtaW47Ci0gICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMubWluUVAucXBJbnRyYSA9IGF2Y3R4LT5xbWluOwotCi0gICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMubWF4UVAucXBJbnRlckIgPSBhdmN0eC0+cW1heDsKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5tYXhRUC5xcEludGVyUCA9IGF2Y3R4LT5xbWF4OwotICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLm1heFFQLnFwSW50cmEgPSBhdmN0eC0+cW1heDsKLQotICAgICAgICAgICAgcXBfaW50ZXJfcCA9IChhdmN0eC0+cW1heCArIDMgKiBhdmN0eC0+cW1pbikgLyA0OyAvLyBiaWFzZWQgdG93YXJkcyBRbWluCi0KLSAgICAgICAgICAgIGlmIChjdHgtPnR3b3Bhc3MpIHsKLSAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMucmF0ZUNvbnRyb2xNb2RlID0gTlZfRU5DX1BBUkFNU19SQ18yX1BBU1NfVkJSOwotICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuYWRhcHRpdmVUcmFuc2Zvcm1Nb2RlID0gTlZfRU5DX0gyNjRfQURBUFRJVkVfVFJBTlNGT1JNX0VOQUJMRTsKLSAgICAgICAgICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuZm1vTW9kZSA9IE5WX0VOQ19IMjY0X0ZNT19ESVNBQkxFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLnJhdGVDb250cm9sTW9kZSA9IE5WX0VOQ19QQVJBTVNfUkNfVkJSX01JTlFQOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcXBfaW50ZXJfcCA9IDI2OyAvLyBkZWZhdWx0IHRvIDI2Ci0KLSAgICAgICAgICAgIGlmIChjdHgtPnR3b3Bhc3MpIHsKLSAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMucmF0ZUNvbnRyb2xNb2RlID0gTlZfRU5DX1BBUkFNU19SQ18yX1BBU1NfVkJSOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMucmF0ZUNvbnRyb2xNb2RlID0gTlZfRU5DX1BBUkFNU19SQ19WQlI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuZW5hYmxlSW5pdGlhbFJDUVAgPSAxOwotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuaW5pdGlhbFJDUVAucXBJbnRlclAgID0gcXBfaW50ZXJfcDsKLQotICAgICAgICBpZihhdmN0eC0+aV9xdWFudF9mYWN0b3IgIT0gMC4wICYmIGF2Y3R4LT5iX3F1YW50X2ZhY3RvciAhPSAwLjApIHsKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5pbml0aWFsUkNRUC5xcEludHJhID0gYXZfY2xpcCgKLSAgICAgICAgICAgICAgICBxcF9pbnRlcl9wICogZmFicyhhdmN0eC0+aV9xdWFudF9mYWN0b3IpICsgYXZjdHgtPmlfcXVhbnRfb2Zmc2V0LCAwLCA1MSk7Ci0gICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuaW5pdGlhbFJDUVAucXBJbnRlckIgPSBhdl9jbGlwKAotICAgICAgICAgICAgICAgIHFwX2ludGVyX3AgKiBmYWJzKGF2Y3R4LT5iX3F1YW50X2ZhY3RvcikgKyBhdmN0eC0+Yl9xdWFudF9vZmZzZXQsIDAsIDUxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5pbml0aWFsUkNRUC5xcEludHJhID0gcXBfaW50ZXJfcDsKLSAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5pbml0aWFsUkNRUC5xcEludGVyQiA9IHFwX2ludGVyX3A7Ci0gICAgICAgIH0KKyAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLnJhdGVDb250cm9sTW9kZSA9IE5WX0VOQ19QQVJBTVNfUkNfVkJSOworICAgICAgICBzZXRfdmJyKGF2Y3R4KTsKICAgICB9CiAKICAgICBpZiAoYXZjdHgtPnJjX2J1ZmZlcl9zaXplID4gMCkgewpAQCAtODYwLDIzNCArODc2LDM1MyBAQAogICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMudmJ2QnVmZmVyU2l6ZSA9IDIgKiBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuYXZlcmFnZUJpdFJhdGU7CiAgICAgfQogCisgICAgaWYgKGN0eC0+YXEpIHsKKyAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLmVuYWJsZUFRICAgPSAxOworICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuYXFTdHJlbmd0aCA9IGN0eC0+YXFfc3RyZW5ndGg7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJBUSBlbmFibGVkLlxuIik7CisgICAgfQorCisgICAgaWYgKGN0eC0+dGVtcG9yYWxfYXEpIHsKKyAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLmVuYWJsZVRlbXBvcmFsQVEgPSAxOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiVGVtcG9yYWwgQVEgZW5hYmxlZC5cbiIpOworICAgIH0KKworICAgIGlmIChjdHgtPnJjX2xvb2thaGVhZCA+IDApIHsKKyAgICAgICAgaW50IGxrZF9ib3VuZCA9IEZGTUlOKGN0eC0+bmJfc3VyZmFjZXMsIGN0eC0+YXN5bmNfZGVwdGgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5mcmFtZUludGVydmFsUCAtIDQ7CisKKyAgICAgICAgaWYgKGxrZF9ib3VuZCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIkxvb2thaGVhZCBub3QgZW5hYmxlZC4gSW5jcmVhc2UgYnVmZmVyIGRlbGF5ICgtZGVsYXkpLlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuZW5hYmxlTG9va2FoZWFkID0gMTsKKyAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5sb29rYWhlYWREZXB0aCAgPSBhdl9jbGlwKGN0eC0+cmNfbG9va2FoZWFkLCAwLCBsa2RfYm91bmQpOworICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLmRpc2FibGVJYWRhcHQgICA9IGN0eC0+bm9fc2NlbmVjdXQ7CisgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuZGlzYWJsZUJhZGFwdCAgID0gIWN0eC0+Yl9hZGFwdDsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAgICAgIkxvb2thaGVhZCBlbmFibGVkOiBkZXB0aCAlZCwgc2NlbmVjdXQgJXMsIEItYWRhcHQgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5sb29rYWhlYWREZXB0aCwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuZGlzYWJsZUlhZGFwdCA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIsCisgICAgICAgICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLmRpc2FibGVCYWRhcHQgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdHgtPnN0cmljdF9nb3ApIHsKKyAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLnN0cmljdEdPUFRhcmdldCA9IDE7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJTdHJpY3QgR09QIHRhcmdldCBlbmFibGVkLlxuIik7CisgICAgfQorCisgICAgaWYgKGN0eC0+bm9ucmVmX3ApCisgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy5lbmFibGVOb25SZWZQID0gMTsKKworICAgIGlmIChjdHgtPnplcm9sYXRlbmN5KQorICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMuemVyb1Jlb3JkZXJEZWxheSA9IDE7CisKKyAgICBpZiAoY3R4LT5xdWFsaXR5KQorICAgIHsKKyAgICAgICAgLy9jb252ZXJ0IGZyb20gZmxvYXQgdG8gZml4ZWQgcG9pbnQgOC44CisgICAgICAgIGludCB0bXBfcXVhbGl0eSA9IChpbnQpKGN0eC0+cXVhbGl0eSAqIDI1Ni4wZik7CisgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5yY1BhcmFtcy50YXJnZXRRdWFsaXR5ID0gKHVpbnQ4X3QpKHRtcF9xdWFsaXR5ID4+IDgpOworICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucmNQYXJhbXMudGFyZ2V0UXVhbGl0eUxTQiA9ICh1aW50OF90KSh0bXBfcXVhbGl0eSAmIDB4ZmYpOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX3NldHVwX2gyNjRfY29uZmlnKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBOdmVuY0NvbnRleHQgKmN0eCAgICAgICAgICAgICAgICAgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTlZfRU5DX0NPTkZJRyAqY2MgICAgICAgICAgICAgICAgICAgICAgPSAmY3R4LT5lbmNvZGVfY29uZmlnOworICAgIE5WX0VOQ19DT05GSUdfSDI2NCAqaDI2NCAgICAgICAgICAgICAgID0gJmNjLT5lbmNvZGVDb2RlY0NvbmZpZy5oMjY0Q29uZmlnOworICAgIE5WX0VOQ19DT05GSUdfSDI2NF9WVUlfUEFSQU1FVEVSUyAqdnVpID0gJmgyNjQtPmgyNjRWVUlQYXJhbWV0ZXJzOworCisgICAgdnVpLT5jb2xvdXJNYXRyaXggPSBhdmN0eC0+Y29sb3JzcGFjZTsKKyAgICB2dWktPmNvbG91clByaW1hcmllcyA9IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXM7CisgICAgdnVpLT50cmFuc2ZlckNoYXJhY3RlcmlzdGljcyA9IGF2Y3R4LT5jb2xvcl90cmM7CisgICAgdnVpLT52aWRlb0Z1bGxSYW5nZUZsYWcgPSAoYXZjdHgtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUcKKyAgICAgICAgfHwgY3R4LT5kYXRhX3BpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZKNDIwUCB8fCBjdHgtPmRhdGFfcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0MjJQIHx8IGN0eC0+ZGF0YV9waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWSjQ0NFApOworCisgICAgdnVpLT5jb2xvdXJEZXNjcmlwdGlvblByZXNlbnRGbGFnID0KKyAgICAgICAgKGF2Y3R4LT5jb2xvcnNwYWNlICE9IDIgfHwgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyAhPSAyIHx8IGF2Y3R4LT5jb2xvcl90cmMgIT0gMik7CisKKyAgICB2dWktPnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnID0KKyAgICAgICAgKHZ1aS0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZworICAgICAgICB8fCB2dWktPnZpZGVvRm9ybWF0ICE9IDUKKyAgICAgICAgfHwgdnVpLT52aWRlb0Z1bGxSYW5nZUZsYWcgIT0gMCk7CisKKyAgICBoMjY0LT5zbGljZU1vZGUgPSAzOworICAgIGgyNjQtPnNsaWNlTW9kZURhdGEgPSAxOworCisgICAgaDI2NC0+ZGlzYWJsZVNQU1BQUyA9IChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpID8gMSA6IDA7CisgICAgaDI2NC0+cmVwZWF0U1BTUFBTICA9IChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpID8gMCA6IDE7CisgICAgaDI2NC0+b3V0cHV0QVVEICAgICA9IGN0eC0+YXVkOworCisgICAgaWYgKGF2Y3R4LT5yZWZzID49IDApIHsKKyAgICAgICAgLyogMCBtZWFucyAibGV0IHRoZSBoYXJkd2FyZSBkZWNpZGUiICovCisgICAgICAgIGgyNjQtPm1heE51bVJlZkZyYW1lcyA9IGF2Y3R4LT5yZWZzOworICAgIH0KKyAgICBpZiAoYXZjdHgtPmdvcF9zaXplID49IDApIHsKKyAgICAgICAgaDI2NC0+aWRyUGVyaW9kID0gY2MtPmdvcExlbmd0aDsKKyAgICB9CisKKyAgICBpZiAoSVNfQ0JSKGNjLT5yY1BhcmFtcy5yYXRlQ29udHJvbE1vZGUpKSB7CisgICAgICAgIGgyNjQtPm91dHB1dEJ1ZmZlcmluZ1BlcmlvZFNFSSA9IDE7CisgICAgfQorCisgICAgaDI2NC0+b3V0cHV0UGljdHVyZVRpbWluZ1NFSSA9IDE7CisKKyAgICBpZiAoY2MtPnJjUGFyYW1zLnJhdGVDb250cm9sTW9kZSA9PSBOVl9FTkNfUEFSQU1TX1JDX0NCUl9MT1dERUxBWV9IUSB8fAorICAgICAgICBjYy0+cmNQYXJhbXMucmF0ZUNvbnRyb2xNb2RlID09IE5WX0VOQ19QQVJBTVNfUkNfQ0JSX0hRIHx8CisgICAgICAgIGNjLT5yY1BhcmFtcy5yYXRlQ29udHJvbE1vZGUgPT0gTlZfRU5DX1BBUkFNU19SQ19WQlJfSFEpIHsKKyAgICAgICAgaDI2NC0+YWRhcHRpdmVUcmFuc2Zvcm1Nb2RlID0gTlZfRU5DX0gyNjRfQURBUFRJVkVfVFJBTlNGT1JNX0VOQUJMRTsKKyAgICAgICAgaDI2NC0+Zm1vTW9kZSA9IE5WX0VOQ19IMjY0X0ZNT19ESVNBQkxFOworICAgIH0KKworICAgIGlmIChjdHgtPmZsYWdzICYgTlZFTkNfTE9TU0xFU1MpIHsKKyAgICAgICAgaDI2NC0+cXBQcmltZVlaZXJvVHJhbnNmb3JtQnlwYXNzRmxhZyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoKGN0eC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIE5WX0VOQ19IMjY0X1BST0ZJTEVfQkFTRUxJTkU6CisgICAgICAgICAgICBjYy0+cHJvZmlsZUdVSUQgPSBOVl9FTkNfSDI2NF9QUk9GSUxFX0JBU0VMSU5FX0dVSUQ7CisgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfSDI2NF9CQVNFTElORTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5WX0VOQ19IMjY0X1BST0ZJTEVfTUFJTjoKKyAgICAgICAgICAgIGNjLT5wcm9maWxlR1VJRCA9IE5WX0VOQ19IMjY0X1BST0ZJTEVfTUFJTl9HVUlEOworICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0gyNjRfTUFJTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5WX0VOQ19IMjY0X1BST0ZJTEVfSElHSDoKKyAgICAgICAgICAgIGNjLT5wcm9maWxlR1VJRCA9IE5WX0VOQ19IMjY0X1BST0ZJTEVfSElHSF9HVUlEOworICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0gyNjRfSElHSDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE5WX0VOQ19IMjY0X1BST0ZJTEVfSElHSF80NDRQOgorICAgICAgICAgICAgY2MtPnByb2ZpbGVHVUlEID0gTlZfRU5DX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9HVUlEOworICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDRfUFJFRElDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZm9yY2Ugc2V0dGluZyBwcm9maWxlIGFzIGhpZ2g0NDRwIGlmIGlucHV0IGlzIEFWX1BJWF9GTVRfWVVWNDQ0UAorICAgIGlmIChjdHgtPmRhdGFfcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFApIHsKKyAgICAgICAgY2MtPnByb2ZpbGVHVUlEID0gTlZfRU5DX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9HVUlEOworICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFOworICAgIH0KKworICAgIGgyNjQtPmNocm9tYUZvcm1hdElEQyA9IGF2Y3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFID8gMyA6IDE7CisKKyAgICBoMjY0LT5sZXZlbCA9IGN0eC0+bGV2ZWw7CisKKyAgICBpZiAoY3R4LT5jb2RlciA+PSAwKQorICAgICAgICBoMjY0LT5lbnRyb3B5Q29kaW5nTW9kZSA9IGN0eC0+Y29kZXI7CisKKyNpZmRlZiBOVkVOQ19IQVZFX0JGUkFNRV9SRUZfTU9ERQorICAgIGgyNjQtPnVzZUJGcmFtZXNBc1JlZiA9IGN0eC0+Yl9yZWZfbW9kZTsKKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBudmVuY19zZXR1cF9oZXZjX2NvbmZpZyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggICAgICAgICAgICAgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE5WX0VOQ19DT05GSUcgKmNjICAgICAgICAgICAgICAgICAgICAgID0gJmN0eC0+ZW5jb2RlX2NvbmZpZzsKKyAgICBOVl9FTkNfQ09ORklHX0hFVkMgKmhldmMgICAgICAgICAgICAgICA9ICZjYy0+ZW5jb2RlQ29kZWNDb25maWcuaGV2Y0NvbmZpZzsKKyAgICBOVl9FTkNfQ09ORklHX0hFVkNfVlVJX1BBUkFNRVRFUlMgKnZ1aSA9ICZoZXZjLT5oZXZjVlVJUGFyYW1ldGVyczsKKworICAgIHZ1aS0+Y29sb3VyTWF0cml4ID0gYXZjdHgtPmNvbG9yc3BhY2U7CisgICAgdnVpLT5jb2xvdXJQcmltYXJpZXMgPSBhdmN0eC0+Y29sb3JfcHJpbWFyaWVzOworICAgIHZ1aS0+dHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgPSBhdmN0eC0+Y29sb3JfdHJjOworICAgIHZ1aS0+dmlkZW9GdWxsUmFuZ2VGbGFnID0gKGF2Y3R4LT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHCisgICAgICAgIHx8IGN0eC0+ZGF0YV9waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWSjQyMFAgfHwgY3R4LT5kYXRhX3BpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZKNDIyUCB8fCBjdHgtPmRhdGFfcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0NDRQKTsKKworICAgIHZ1aS0+Y29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZyA9CisgICAgICAgIChhdmN0eC0+Y29sb3JzcGFjZSAhPSAyIHx8IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgIT0gMiB8fCBhdmN0eC0+Y29sb3JfdHJjICE9IDIpOworCisgICAgdnVpLT52aWRlb1NpZ25hbFR5cGVQcmVzZW50RmxhZyA9CisgICAgICAgICh2dWktPmNvbG91ckRlc2NyaXB0aW9uUHJlc2VudEZsYWcKKyAgICAgICAgfHwgdnVpLT52aWRlb0Zvcm1hdCAhPSA1CisgICAgICAgIHx8IHZ1aS0+dmlkZW9GdWxsUmFuZ2VGbGFnICE9IDApOworCisgICAgaGV2Yy0+c2xpY2VNb2RlID0gMzsKKyAgICBoZXZjLT5zbGljZU1vZGVEYXRhID0gMTsKKworICAgIGhldmMtPmRpc2FibGVTUFNQUFMgPSAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSA/IDEgOiAwOworICAgIGhldmMtPnJlcGVhdFNQU1BQUyAgPSAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSA/IDAgOiAxOworICAgIGhldmMtPm91dHB1dEFVRCAgICAgPSBjdHgtPmF1ZDsKKworICAgIGlmIChhdmN0eC0+cmVmcyA+PSAwKSB7CisgICAgICAgIC8qIDAgbWVhbnMgImxldCB0aGUgaGFyZHdhcmUgZGVjaWRlIiAqLworICAgICAgICBoZXZjLT5tYXhOdW1SZWZGcmFtZXNJbkRQQiA9IGF2Y3R4LT5yZWZzOworICAgIH0KKyAgICBpZiAoYXZjdHgtPmdvcF9zaXplID49IDApIHsKKyAgICAgICAgaGV2Yy0+aWRyUGVyaW9kID0gY2MtPmdvcExlbmd0aDsKKyAgICB9CisKKyAgICBpZiAoSVNfQ0JSKGNjLT5yY1BhcmFtcy5yYXRlQ29udHJvbE1vZGUpKSB7CisgICAgICAgIGhldmMtPm91dHB1dEJ1ZmZlcmluZ1BlcmlvZFNFSSA9IDE7CisgICAgfQorCisgICAgaGV2Yy0+b3V0cHV0UGljdHVyZVRpbWluZ1NFSSA9IDE7CisKKyAgICBzd2l0Y2ggKGN0eC0+cHJvZmlsZSkgeworICAgIGNhc2UgTlZfRU5DX0hFVkNfUFJPRklMRV9NQUlOOgorICAgICAgICBjYy0+cHJvZmlsZUdVSUQgPSBOVl9FTkNfSEVWQ19QUk9GSUxFX01BSU5fR1VJRDsKKyAgICAgICAgYXZjdHgtPnByb2ZpbGUgID0gRkZfUFJPRklMRV9IRVZDX01BSU47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTlZfRU5DX0hFVkNfUFJPRklMRV9NQUlOXzEwOgorICAgICAgICBjYy0+cHJvZmlsZUdVSUQgPSBOVl9FTkNfSEVWQ19QUk9GSUxFX01BSU4xMF9HVUlEOworICAgICAgICBhdmN0eC0+cHJvZmlsZSAgPSBGRl9QUk9GSUxFX0hFVkNfTUFJTl8xMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBOVl9FTkNfSEVWQ19QUk9GSUxFX1JFWFQ6CisgICAgICAgIGNjLT5wcm9maWxlR1VJRCA9IE5WX0VOQ19IRVZDX1BST0ZJTEVfRlJFWFRfR1VJRDsKKyAgICAgICAgYXZjdHgtPnByb2ZpbGUgID0gRkZfUFJPRklMRV9IRVZDX1JFWFQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIGZvcmNlIHNldHRpbmcgcHJvZmlsZSBhcyBtYWluMTAgaWYgaW5wdXQgaXMgMTAgYml0CisgICAgaWYgKElTXzEwQklUKGN0eC0+ZGF0YV9waXhfZm10KSkgeworICAgICAgICBjYy0+cHJvZmlsZUdVSUQgPSBOVl9FTkNfSEVWQ19QUk9GSUxFX01BSU4xMF9HVUlEOworICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfSEVWQ19NQUlOXzEwOworICAgIH0KKworICAgIC8vIGZvcmNlIHNldHRpbmcgcHJvZmlsZSBhcyByZXh0IGlmIGlucHV0IGlzIHl1djQ0NAorICAgIGlmIChJU19ZVVY0NDQoY3R4LT5kYXRhX3BpeF9mbXQpKSB7CisgICAgICAgIGNjLT5wcm9maWxlR1VJRCA9IE5WX0VOQ19IRVZDX1BST0ZJTEVfRlJFWFRfR1VJRDsKKyAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0hFVkNfUkVYVDsKKyAgICB9CisKKyAgICBoZXZjLT5jaHJvbWFGb3JtYXRJREMgPSBJU19ZVVY0NDQoY3R4LT5kYXRhX3BpeF9mbXQpID8gMyA6IDE7CisKKyAgICBoZXZjLT5waXhlbEJpdERlcHRoTWludXM4ID0gSVNfMTBCSVQoY3R4LT5kYXRhX3BpeF9mbXQpID8gMiA6IDA7CisKKyAgICBoZXZjLT5sZXZlbCA9IGN0eC0+bGV2ZWw7CisKKyAgICBoZXZjLT50aWVyID0gY3R4LT50aWVyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBudmVuY19zZXR1cF9jb2RlY19jb25maWcoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICAgICAgcmV0dXJuIG52ZW5jX3NldHVwX2gyNjRfY29uZmlnKGF2Y3R4KTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgIHJldHVybiBudmVuY19zZXR1cF9oZXZjX2NvbmZpZyhhdmN0eCk7CisgICAgLyogRWFybGllciBzd2l0Y2gvY2FzZSB3aWxsIHJldHVybiBpZiB1bmtub3duIGNvZGVjIGlzIHBhc3NlZC4gKi8KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX3NldHVwX2VuY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgKmRsX2ZuID0gJmN0eC0+bnZlbmNfZGxvYWRfZnVuY3M7CisgICAgTlZfRU5DT0RFX0FQSV9GVU5DVElPTl9MSVNUICpwX252ZW5jID0gJmRsX2ZuLT5udmVuY19mdW5jczsKKworICAgIE5WX0VOQ19QUkVTRVRfQ09ORklHIHByZXNldF9jb25maWcgPSB7IDAgfTsKKyAgICBOVkVOQ1NUQVRVUyBudl9zdGF0dXMgPSBOVl9FTkNfU1VDQ0VTUzsKKyAgICBBVkNQQlByb3BlcnRpZXMgKmNwYl9wcm9wczsKKyAgICBpbnQgcmVzID0gMDsKKyAgICBpbnQgZHcsIGRoOworCisgICAgY3R4LT5lbmNvZGVfY29uZmlnLnZlcnNpb24gPSBOVl9FTkNfQ09ORklHX1ZFUjsKKyAgICBjdHgtPmluaXRfZW5jb2RlX3BhcmFtcy52ZXJzaW9uID0gTlZfRU5DX0lOSVRJQUxJWkVfUEFSQU1TX1ZFUjsKKworICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuY29kZUhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZW5jb2RlV2lkdGggPSBhdmN0eC0+d2lkdGg7CisKKyAgICBjdHgtPmluaXRfZW5jb2RlX3BhcmFtcy5lbmNvZGVDb25maWcgPSAmY3R4LT5lbmNvZGVfY29uZmlnOworCisgICAgbnZlbmNfbWFwX3ByZXNldChjdHgpOworCisgICAgcHJlc2V0X2NvbmZpZy52ZXJzaW9uID0gTlZfRU5DX1BSRVNFVF9DT05GSUdfVkVSOworICAgIHByZXNldF9jb25maWcucHJlc2V0Q2ZnLnZlcnNpb24gPSBOVl9FTkNfQ09ORklHX1ZFUjsKKworICAgIG52X3N0YXR1cyA9IHBfbnZlbmMtPm52RW5jR2V0RW5jb2RlUHJlc2V0Q29uZmlnKGN0eC0+bnZlbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuY29kZUdVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMucHJlc2V0R1VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJlc2V0X2NvbmZpZyk7CisgICAgaWYgKG52X3N0YXR1cyAhPSBOVl9FTkNfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIG52ZW5jX3ByaW50X2Vycm9yKGF2Y3R4LCBudl9zdGF0dXMsICJDYW5ub3QgZ2V0IHRoZSBwcmVzZXQgY29uZmlndXJhdGlvbiIpOworCisgICAgbWVtY3B5KCZjdHgtPmVuY29kZV9jb25maWcsICZwcmVzZXRfY29uZmlnLnByZXNldENmZywgc2l6ZW9mKGN0eC0+ZW5jb2RlX2NvbmZpZykpOworCisgICAgY3R4LT5lbmNvZGVfY29uZmlnLnZlcnNpb24gPSBOVl9FTkNfQ09ORklHX1ZFUjsKKworICAgIGR3ID0gYXZjdHgtPndpZHRoOworICAgIGRoID0gYXZjdHgtPmhlaWdodDsKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID4gMCAmJiBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPiAwKSB7CisgICAgICAgIGR3Kj0gYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtOworICAgICAgICBkaCo9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbjsKKyAgICB9CisgICAgYXZfcmVkdWNlKCZkdywgJmRoLCBkdywgZGgsIDEwMjQgKiAxMDI0KTsKKyAgICBjdHgtPmluaXRfZW5jb2RlX3BhcmFtcy5kYXJIZWlnaHQgPSBkaDsKKyAgICBjdHgtPmluaXRfZW5jb2RlX3BhcmFtcy5kYXJXaWR0aCA9IGR3OworCisgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZnJhbWVSYXRlTnVtID0gYXZjdHgtPnRpbWVfYmFzZS5kZW47CisgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZnJhbWVSYXRlRGVuID0gYXZjdHgtPnRpbWVfYmFzZS5udW0gKiBhdmN0eC0+dGlja3NfcGVyX2ZyYW1lOworCisgICAgY3R4LT5pbml0X2VuY29kZV9wYXJhbXMuZW5hYmxlRW5jb2RlQXN5bmMgPSAwOworICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuYWJsZVBURCA9IDE7CisKKyAgICBpZiAoY3R4LT53ZWlnaHRlZF9wcmVkID09IDEpCisgICAgICAgIGN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zLmVuYWJsZVdlaWdodGVkUHJlZGljdGlvbiA9IDE7CisKKyAgICBpZiAoY3R4LT5ibHVyYXlfY29tcGF0KSB7CisgICAgICAgIGN0eC0+YXVkID0gMTsKKyAgICAgICAgYXZjdHgtPnJlZnMgPSBGRk1JTihGRk1BWChhdmN0eC0+cmVmcywgMCksIDYpOworICAgICAgICBhdmN0eC0+bWF4X2JfZnJhbWVzID0gRkZNSU4oYXZjdHgtPm1heF9iX2ZyYW1lcywgMyk7CisgICAgICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgeworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6CisgICAgICAgICAgICAvKiBtYXhpbXVtIGxldmVsIGRlcGVuZHMgb24gdXNlZCByZXNvbHV0aW9uICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IRVZDOgorICAgICAgICAgICAgY3R4LT5sZXZlbCA9IE5WX0VOQ19MRVZFTF9IRVZDXzUxOworICAgICAgICAgICAgY3R4LT50aWVyID0gTlZfRU5DX1RJRVJfSEVWQ19ISUdIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmdvcF9zaXplID4gMCkgeworICAgICAgICBpZiAoYXZjdHgtPm1heF9iX2ZyYW1lcyA+PSAwKSB7CisgICAgICAgICAgICAvKiAwIGlzIGludHJhLW9ubHksIDEgaXMgSS9QIG9ubHksIDIgaXMgb25lIEItRnJhbWUsIDMgdHdvIEItZnJhbWVzLCBhbmQgc28gb24uICovCisgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZnJhbWVJbnRlcnZhbFAgPSBhdmN0eC0+bWF4X2JfZnJhbWVzICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5nb3BMZW5ndGggPSBhdmN0eC0+Z29wX3NpemU7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+Z29wX3NpemUgPT0gMCkgeworICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZnJhbWVJbnRlcnZhbFAgPSAwOworICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZ29wTGVuZ3RoID0gMTsKKyAgICB9CisKKyAgICBjdHgtPmluaXRpYWxfcHRzWzBdID0gQVZfTk9QVFNfVkFMVUU7CisgICAgY3R4LT5pbml0aWFsX3B0c1sxXSA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgbnZlbmNfcmVjYWxjX3N1cmZhY2VzKGF2Y3R4KTsKKworICAgIG52ZW5jX3NldHVwX3JhdGVfY29udHJvbChhdmN0eCk7CisKICAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCkgewogICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZnJhbWVGaWVsZE1vZGUgPSBOVl9FTkNfUEFSQU1TX0ZSQU1FX0ZJRUxEX01PREVfRklFTEQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmZyYW1lRmllbGRNb2RlID0gTlZfRU5DX1BBUkFNU19GUkFNRV9GSUVMRF9NT0RFX0ZSQU1FOwogICAgIH0KIAotICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgewotICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuaDI2NFZVSVBhcmFtZXRlcnMuY29sb3VyRGVzY3JpcHRpb25QcmVzZW50RmxhZyA9IDE7Ci0gICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oMjY0Q29uZmlnLmgyNjRWVUlQYXJhbWV0ZXJzLnZpZGVvU2lnbmFsVHlwZVByZXNlbnRGbGFnID0gMTsKKyAgICByZXMgPSBudmVuY19zZXR1cF9jb2RlY19jb25maWcoYXZjdHgpOworICAgIGlmIChyZXMpCisgICAgICAgIHJldHVybiByZXM7CiAKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuaDI2NFZVSVBhcmFtZXRlcnMuY29sb3VyTWF0cml4ID0gYXZjdHgtPmNvbG9yc3BhY2U7Ci0gICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oMjY0Q29uZmlnLmgyNjRWVUlQYXJhbWV0ZXJzLmNvbG91clByaW1hcmllcyA9IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXM7Ci0gICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oMjY0Q29uZmlnLmgyNjRWVUlQYXJhbWV0ZXJzLnRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzID0gYXZjdHgtPmNvbG9yX3RyYzsKLQotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5oMjY0VlVJUGFyYW1ldGVycy52aWRlb0Z1bGxSYW5nZUZsYWcgPSBhdmN0eC0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRzsKLQotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5zbGljZU1vZGUgPSAzOwotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5zbGljZU1vZGVEYXRhID0gMTsKLQotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5kaXNhYmxlU1BTUFBTID0gKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgPyAxIDogMDsKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcucmVwZWF0U1BTUFBTID0gKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgPyAwIDogMTsKLQotICAgICAgICBpZiAoIWN0eC0+cHJvZmlsZSkgewotICAgICAgICAgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSkgewotICAgICAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDRfUFJFRElDVElWRToKLSAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucHJvZmlsZUdVSUQgPSBOVl9FTkNfSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X0dVSUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9CQVNFTElORToKLSAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucHJvZmlsZUdVSUQgPSBOVl9FTkNfSDI2NF9QUk9GSUxFX0JBU0VMSU5FX0dVSUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9NQUlOOgotICAgICAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5wcm9maWxlR1VJRCA9IE5WX0VOQ19IMjY0X1BST0ZJTEVfTUFJTl9HVUlEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSDoKLSAgICAgICAgICAgIGNhc2UgRkZfUFJPRklMRV9VTktOT1dOOgotICAgICAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5wcm9maWxlR1VJRCA9IE5WX0VOQ19IMjY0X1BST0ZJTEVfSElHSF9HVUlEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgcHJvZmlsZSByZXF1ZXN0ZWQsIGZhbGxpbmcgYmFjayB0byBoaWdoXG4iKTsKLSAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucHJvZmlsZUdVSUQgPSBOVl9FTkNfSDI2NF9QUk9GSUxFX0hJR0hfR1VJRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKGN0eC0+cHJvZmlsZSwgImhpZ2giKSkgewotICAgICAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5wcm9maWxlR1VJRCA9IE5WX0VOQ19IMjY0X1BST0ZJTEVfSElHSF9HVUlEOwotICAgICAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9IMjY0X0hJR0g7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5wcm9maWxlLCAibWFpbiIpKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnByb2ZpbGVHVUlEID0gTlZfRU5DX0gyNjRfUFJPRklMRV9NQUlOX0dVSUQ7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0gyNjRfTUFJTjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPnByb2ZpbGUsICJiYXNlbGluZSIpKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLnByb2ZpbGVHVUlEID0gTlZfRU5DX0gyNjRfUFJPRklMRV9CQVNFTElORV9HVUlEOwotICAgICAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlID0gRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGN0eC0+cHJvZmlsZSwgImhpZ2g0NDRwIikpIHsKLSAgICAgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucHJvZmlsZUdVSUQgPSBOVl9FTkNfSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X0dVSUQ7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDRfUFJFRElDVElWRTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJQcm9maWxlIFwiJXNcIiBpcyB1bmtub3duISBTdXBwb3J0ZWQgcHJvZmlsZXM6IGhpZ2gsIG1haW4sIGJhc2VsaW5lXG4iLCBjdHgtPnByb2ZpbGUpOwotICAgICAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gZm9yY2Ugc2V0dGluZyBwcm9maWxlIGFzIGhpZ2g0NDRwIGlmIGlucHV0IGlzIEFWX1BJWF9GTVRfWVVWNDQ0UAotICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQKSB7Ci0gICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcucHJvZmlsZUdVSUQgPSBOVl9FTkNfSDI2NF9QUk9GSUxFX0hJR0hfNDQ0X0dVSUQ7Ci0gICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFOwotICAgICAgICB9Ci0KLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuY2hyb21hRm9ybWF0SURDID0gYXZjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X1BSRURJQ1RJVkUgPyAzIDogMTsKLQotICAgICAgICBpZiAoY3R4LT5sZXZlbCkgewotICAgICAgICAgICAgcmVzID0gaW5wdXRfc3RyaW5nX3RvX3VpbnQzMihhdmN0eCwgbnZlbmNfaDI2NF9sZXZlbF9wYWlycywgY3R4LT5sZXZlbCwgJmN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oMjY0Q29uZmlnLmxldmVsKTsKLQotICAgICAgICAgICAgaWYgKHJlcykgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiTGV2ZWwgXCIlc1wiIGlzIHVua25vd24hIFN1cHBvcnRlZCBsZXZlbHM6IGF1dG8sIDEsIDFiLCAxLjEsIDEuMiwgMS4zLCAyLCAyLjEsIDIuMiwgMywgMy4xLCAzLjIsIDQsIDQuMSwgNC4yLCA1LCA1LjFcbiIsIGN0eC0+bGV2ZWwpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5sZXZlbCA9IE5WX0VOQ19MRVZFTF9BVVRPU0VMRUNUOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY1OgotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaGV2Y0NvbmZpZy5zbGljZU1vZGUgPSAzOwotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaGV2Y0NvbmZpZy5zbGljZU1vZGVEYXRhID0gMTsKLQotICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaGV2Y0NvbmZpZy5kaXNhYmxlU1BTUFBTID0gKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgPyAxIDogMDsKLSAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmhldmNDb25maWcucmVwZWF0U1BTUFBTID0gKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgPyAwIDogMTsKLQotICAgICAgICAvKiBObyBvdGhlciBwcm9maWxlIGlzIHN1cHBvcnRlZCBpbiB0aGUgY3VycmVudCBTREsgdmVyc2lvbiA1ICovCi0gICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5wcm9maWxlR1VJRCA9IE5WX0VOQ19IRVZDX1BST0ZJTEVfTUFJTl9HVUlEOwotICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IEZGX1BST0ZJTEVfSEVWQ19NQUlOOwotCi0gICAgICAgIGlmIChjdHgtPmxldmVsKSB7Ci0gICAgICAgICAgICByZXMgPSBpbnB1dF9zdHJpbmdfdG9fdWludDMyKGF2Y3R4LCBudmVuY19oZXZjX2xldmVsX3BhaXJzLCBjdHgtPmxldmVsLCAmY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmhldmNDb25maWcubGV2ZWwpOwotCi0gICAgICAgICAgICBpZiAocmVzKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJMZXZlbCBcIiVzXCIgaXMgdW5rbm93biEgU3VwcG9ydGVkIGxldmVsczogYXV0bywgMSwgMiwgMi4xLCAzLCAzLjEsIDQsIDQuMSwgNSwgNS4xLCA1LjIsIDYsIDYuMSwgNi4yXG4iLCBjdHgtPmxldmVsKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmhldmNDb25maWcubGV2ZWwgPSBOVl9FTkNfTEVWRUxfQVVUT1NFTEVDVDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdHgtPnRpZXIpIHsKLSAgICAgICAgICAgIGlmICghc3RyY21wKGN0eC0+dGllciwgIm1haW4iKSkgewotICAgICAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oZXZjQ29uZmlnLnRpZXIgPSBOVl9FTkNfVElFUl9IRVZDX01BSU47Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT50aWVyLCAiaGlnaCIpKSB7Ci0gICAgICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmhldmNDb25maWcudGllciA9IE5WX0VOQ19USUVSX0hFVkNfSElHSDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJUaWVyIFwiJXNcIiBpcyB1bmtub3duISBTdXBwb3J0ZWQgdGllcnM6IG1haW4sIGhpZ2hcbiIsIGN0eC0+dGllcik7Ci0gICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICAvKiBFYXJsaWVyIHN3aXRjaC9jYXNlIHdpbGwgcmV0dXJuIGlmIHVua25vd24gY29kZWMgaXMgcGFzc2VkLiAqLwotICAgIH0KKyAgICByZXMgPSBudmVuY19wdXNoX2NvbnRleHQoYXZjdHgpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOwogCiAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNJbml0aWFsaXplRW5jb2RlcihjdHgtPm52ZW5jb2RlciwgJmN0eC0+aW5pdF9lbmNvZGVfcGFyYW1zKTsKKworICAgIHJlcyA9IG52ZW5jX3BvcF9jb250ZXh0KGF2Y3R4KTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKwogICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJJbml0aWFsaXplRW5jb2RlciBmYWlsZWQ6IDB4JXhcbiIsIChpbnQpbnZfc3RhdHVzKTsKLSAgICAgICAgcmVzID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICBjdHgtPmlucHV0X3N1cmZhY2VzID0gYXZfbWFsbG9jKGN0eC0+bWF4X3N1cmZhY2VfY291bnQgKiBzaXplb2YoKmN0eC0+aW5wdXRfc3VyZmFjZXMpKTsKLQotICAgIGlmICghY3R4LT5pbnB1dF9zdXJmYWNlcykgewotICAgICAgICByZXMgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgfQotCi0gICAgY3R4LT5vdXRwdXRfc3VyZmFjZXMgPSBhdl9tYWxsb2MoY3R4LT5tYXhfc3VyZmFjZV9jb3VudCAqIHNpemVvZigqY3R4LT5vdXRwdXRfc3VyZmFjZXMpKTsKLQotICAgIGlmICghY3R4LT5vdXRwdXRfc3VyZmFjZXMpIHsKLSAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIGZvciAoc3VyZmFjZUNvdW50ID0gMDsgc3VyZmFjZUNvdW50IDwgY3R4LT5tYXhfc3VyZmFjZV9jb3VudDsgKytzdXJmYWNlQ291bnQpIHsKLSAgICAgICAgTlZfRU5DX0NSRUFURV9JTlBVVF9CVUZGRVIgYWxsb2NTdXJmID0geyAwIH07Ci0gICAgICAgIE5WX0VOQ19DUkVBVEVfQklUU1RSRUFNX0JVRkZFUiBhbGxvY091dCA9IHsgMCB9OwotICAgICAgICBhbGxvY1N1cmYudmVyc2lvbiA9IE5WX0VOQ19DUkVBVEVfSU5QVVRfQlVGRkVSX1ZFUjsKLSAgICAgICAgYWxsb2NPdXQudmVyc2lvbiA9IE5WX0VOQ19DUkVBVEVfQklUU1RSRUFNX0JVRkZFUl9WRVI7Ci0KLSAgICAgICAgYWxsb2NTdXJmLndpZHRoID0gKGF2Y3R4LT53aWR0aCArIDMxKSAmIH4zMTsKLSAgICAgICAgYWxsb2NTdXJmLmhlaWdodCA9IChhdmN0eC0+aGVpZ2h0ICsgMzEpICYgfjMxOwotCi0gICAgICAgIGFsbG9jU3VyZi5tZW1vcnlIZWFwID0gTlZfRU5DX01FTU9SWV9IRUFQX1NZU01FTV9DQUNIRUQ7Ci0KLSAgICAgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgewotICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKLSAgICAgICAgICAgIGFsbG9jU3VyZi5idWZmZXJGbXQgPSBOVl9FTkNfQlVGRkVSX0ZPUk1BVF9ZVjEyX1BMOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6Ci0gICAgICAgICAgICBhbGxvY1N1cmYuYnVmZmVyRm10ID0gTlZfRU5DX0JVRkZFUl9GT1JNQVRfTlYxMl9QTDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgotICAgICAgICAgICAgYWxsb2NTdXJmLmJ1ZmZlckZtdCA9IE5WX0VOQ19CVUZGRVJfRk9STUFUX1lVVjQ0NF9QTDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19GQVRBTCwgIkludmFsaWQgaW5wdXQgcGl4ZWwgZm9ybWF0XG4iKTsKLSAgICAgICAgICAgIHJlcyA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBudl9zdGF0dXMgPSBwX252ZW5jLT5udkVuY0NyZWF0ZUlucHV0QnVmZmVyKGN0eC0+bnZlbmNvZGVyLCAmYWxsb2NTdXJmKTsKLSAgICAgICAgaWYgKG52X3N0YXR1cyAhPSBOVl9FTkNfU1VDQ0VTUykgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJDcmVhdGVJbnB1dEJ1ZmZlciBmYWlsZWRcbiIpOwotICAgICAgICAgICAgcmVzID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBjdHgtPmlucHV0X3N1cmZhY2VzW3N1cmZhY2VDb3VudF0ubG9ja0NvdW50ID0gMDsKLSAgICAgICAgY3R4LT5pbnB1dF9zdXJmYWNlc1tzdXJmYWNlQ291bnRdLmlucHV0X3N1cmZhY2UgPSBhbGxvY1N1cmYuaW5wdXRCdWZmZXI7Ci0gICAgICAgIGN0eC0+aW5wdXRfc3VyZmFjZXNbc3VyZmFjZUNvdW50XS5mb3JtYXQgPSBhbGxvY1N1cmYuYnVmZmVyRm10OwotICAgICAgICBjdHgtPmlucHV0X3N1cmZhY2VzW3N1cmZhY2VDb3VudF0ud2lkdGggPSBhbGxvY1N1cmYud2lkdGg7Ci0gICAgICAgIGN0eC0+aW5wdXRfc3VyZmFjZXNbc3VyZmFjZUNvdW50XS5oZWlnaHQgPSBhbGxvY1N1cmYuaGVpZ2h0OwotCi0gICAgICAgIC8qIDFNQiBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBtb3N0IG91dHB1dCBmcmFtZXMuIE5WRU5DIGluY3JlYXNlcyB0aGlzIGF1dG9tYXRpY2FseSBpZiBpdCdzIG5vdCBlbm91Z2guICovCi0gICAgICAgIGFsbG9jT3V0LnNpemUgPSAxMDI0ICogMTAyNDsKLQotICAgICAgICBhbGxvY091dC5tZW1vcnlIZWFwID0gTlZfRU5DX01FTU9SWV9IRUFQX1NZU01FTV9DQUNIRUQ7Ci0KLSAgICAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNDcmVhdGVCaXRzdHJlYW1CdWZmZXIoY3R4LT5udmVuY29kZXIsICZhbGxvY091dCk7Ci0gICAgICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiQ3JlYXRlQml0c3RyZWFtQnVmZmVyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBjdHgtPm91dHB1dF9zdXJmYWNlc1tzdXJmYWNlQ291bnQrK10ub3V0cHV0X3N1cmZhY2UgPSBOVUxMOwotICAgICAgICAgICAgcmVzID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBjdHgtPm91dHB1dF9zdXJmYWNlc1tzdXJmYWNlQ291bnRdLm91dHB1dF9zdXJmYWNlID0gYWxsb2NPdXQuYml0c3RyZWFtQnVmZmVyOwotICAgICAgICBjdHgtPm91dHB1dF9zdXJmYWNlc1tzdXJmYWNlQ291bnRdLnNpemUgPSBhbGxvY091dC5zaXplOwotICAgICAgICBjdHgtPm91dHB1dF9zdXJmYWNlc1tzdXJmYWNlQ291bnRdLmJ1c3kgPSAwOwotICAgIH0KLQotICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHsKLSAgICAgICAgdWludDMyX3Qgb3V0U2l6ZSA9IDA7Ci0gICAgICAgIGNoYXIgdG1wSGVhZGVyWzI1Nl07Ci0gICAgICAgIE5WX0VOQ19TRVFVRU5DRV9QQVJBTV9QQVlMT0FEIHBheWxvYWQgPSB7IDAgfTsKLSAgICAgICAgcGF5bG9hZC52ZXJzaW9uID0gTlZfRU5DX1NFUVVFTkNFX1BBUkFNX1BBWUxPQURfVkVSOwotCi0gICAgICAgIHBheWxvYWQuc3BzcHBzQnVmZmVyID0gdG1wSGVhZGVyOwotICAgICAgICBwYXlsb2FkLmluQnVmZmVyU2l6ZSA9IHNpemVvZih0bXBIZWFkZXIpOwotICAgICAgICBwYXlsb2FkLm91dFNQU1BQU1BheWxvYWRTaXplID0gJm91dFNpemU7Ci0KLSAgICAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNHZXRTZXF1ZW5jZVBhcmFtcyhjdHgtPm52ZW5jb2RlciwgJnBheWxvYWQpOwotICAgICAgICBpZiAobnZfc3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19GQVRBTCwgIkdldFNlcXVlbmNlUGFyYW1zIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gb3V0U2l6ZTsKLSAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3oob3V0U2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotCi0gICAgICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkgewotICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhLCB0bXBIZWFkZXIsIG91dFNpemUpOworICAgICAgICByZXR1cm4gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIG52X3N0YXR1cywgIkluaXRpYWxpemVFbmNvZGVyIGZhaWxlZCIpOwogICAgIH0KIAogICAgIGlmIChjdHgtPmVuY29kZV9jb25maWcuZnJhbWVJbnRlcnZhbFAgPiAxKQpAQCAtMTEwNCw2OSArMTIzOSw1NTEgQEAKICAgICBjcGJfcHJvcHMtPmJ1ZmZlcl9zaXplID0gY3R4LT5lbmNvZGVfY29uZmlnLnJjUGFyYW1zLnZidkJ1ZmZlclNpemU7CiAKICAgICByZXR1cm4gMDsKLQotZXJyb3I6Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3VyZmFjZUNvdW50OyArK2kpIHsKLSAgICAgICAgcF9udmVuYy0+bnZFbmNEZXN0cm95SW5wdXRCdWZmZXIoY3R4LT5udmVuY29kZXIsIGN0eC0+aW5wdXRfc3VyZmFjZXNbaV0uaW5wdXRfc3VyZmFjZSk7Ci0gICAgICAgIGlmIChjdHgtPm91dHB1dF9zdXJmYWNlc1tpXS5vdXRwdXRfc3VyZmFjZSkKLSAgICAgICAgICAgIHBfbnZlbmMtPm52RW5jRGVzdHJveUJpdHN0cmVhbUJ1ZmZlcihjdHgtPm52ZW5jb2RlciwgY3R4LT5vdXRwdXRfc3VyZmFjZXNbaV0ub3V0cHV0X3N1cmZhY2UpOwotICAgIH0KLQotICAgIGlmIChjdHgtPm52ZW5jb2RlcikKLSAgICAgICAgcF9udmVuYy0+bnZFbmNEZXN0cm95RW5jb2RlcihjdHgtPm52ZW5jb2Rlcik7Ci0KLSAgICBpZiAoY3R4LT5jdV9jb250ZXh0KQotICAgICAgICBkbF9mbi0+Y3VfY3R4X2Rlc3Ryb3koY3R4LT5jdV9jb250ZXh0KTsKLQotICAgIG52ZW5jX3VubG9hZF9udmVuYyhhdmN0eCk7Ci0KLSAgICBjdHgtPm52ZW5jb2RlciA9IE5VTEw7Ci0gICAgY3R4LT5jdV9jb250ZXh0ID0gTlVMTDsKLQotICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBhdl9jb2xkIGludCBudmVuY19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQorc3RhdGljIE5WX0VOQ19CVUZGRVJfRk9STUFUIG52ZW5jX21hcF9idWZmZXJfZm9ybWF0KGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIHN3aXRjaCAocGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICByZXR1cm4gTlZfRU5DX0JVRkZFUl9GT1JNQVRfWVYxMl9QTDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTlYxMjoKKyAgICAgICAgcmV0dXJuIE5WX0VOQ19CVUZGRVJfRk9STUFUX05WMTJfUEw7CisgICAgY2FzZSBBVl9QSVhfRk1UX1AwMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1AwMTY6CisgICAgICAgIHJldHVybiBOVl9FTkNfQlVGRkVSX0ZPUk1BVF9ZVVY0MjBfMTBCSVQ7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgICAgIHJldHVybiBOVl9FTkNfQlVGRkVSX0ZPUk1BVF9ZVVY0NDRfUEw7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjoKKyAgICAgICAgcmV0dXJuIE5WX0VOQ19CVUZGRVJfRk9STUFUX1lVVjQ0NF8xMEJJVDsKKyAgICBjYXNlIEFWX1BJWF9GTVRfMFJHQjMyOgorICAgICAgICByZXR1cm4gTlZfRU5DX0JVRkZFUl9GT1JNQVRfQVJHQjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfMEJHUjMyOgorICAgICAgICByZXR1cm4gTlZfRU5DX0JVRkZFUl9GT1JNQVRfQUJHUjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gTlZfRU5DX0JVRkZFUl9GT1JNQVRfVU5ERUZJTkVEOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IG52ZW5jX2FsbG9jX3N1cmZhY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgaWR4KQogewogICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgKmRsX2ZuID0gJmN0eC0+bnZlbmNfZGxvYWRfZnVuY3M7CiAgICAgTlZfRU5DT0RFX0FQSV9GVU5DVElPTl9MSVNUICpwX252ZW5jID0gJmRsX2ZuLT5udmVuY19mdW5jczsKLSAgICBpbnQgaTsKKyAgICBOdmVuY1N1cmZhY2UqIHRtcF9zdXJmYWNlID0gJmN0eC0+c3VyZmFjZXNbaWR4XTsKIAotICAgIGF2X2ZyZWVwKCZjdHgtPnRpbWVzdGFtcF9saXN0LmRhdGEpOwotICAgIGF2X2ZyZWVwKCZjdHgtPm91dHB1dF9zdXJmYWNlX3JlYWR5X3F1ZXVlLmRhdGEpOwotICAgIGF2X2ZyZWVwKCZjdHgtPm91dHB1dF9zdXJmYWNlX3F1ZXVlLmRhdGEpOworICAgIE5WRU5DU1RBVFVTIG52X3N0YXR1czsKKyAgICBOVl9FTkNfQ1JFQVRFX0JJVFNUUkVBTV9CVUZGRVIgYWxsb2NPdXQgPSB7IDAgfTsKKyAgICBhbGxvY091dC52ZXJzaW9uID0gTlZfRU5DX0NSRUFURV9CSVRTVFJFQU1fQlVGRkVSX1ZFUjsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm1heF9zdXJmYWNlX2NvdW50OyArK2kpIHsKLSAgICAgICAgcF9udmVuYy0+bnZFbmNEZXN0cm95SW5wdXRCdWZmZXIoY3R4LT5udmVuY29kZXIsIGN0eC0+aW5wdXRfc3VyZmFjZXNbaV0uaW5wdXRfc3VyZmFjZSk7Ci0gICAgICAgIHBfbnZlbmMtPm52RW5jRGVzdHJveUJpdHN0cmVhbUJ1ZmZlcihjdHgtPm52ZW5jb2RlciwgY3R4LT5vdXRwdXRfc3VyZmFjZXNbaV0ub3V0cHV0X3N1cmZhY2UpOworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0NVREEgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkgeworICAgICAgICBjdHgtPnN1cmZhY2VzW2lkeF0uaW5fcmVmID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICAgICAgaWYgKCFjdHgtPnN1cmZhY2VzW2lkeF0uaW5fcmVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9IGVsc2UgeworICAgICAgICBOVl9FTkNfQ1JFQVRFX0lOUFVUX0JVRkZFUiBhbGxvY1N1cmYgPSB7IDAgfTsKKworICAgICAgICBjdHgtPnN1cmZhY2VzW2lkeF0uZm9ybWF0ID0gbnZlbmNfbWFwX2J1ZmZlcl9mb3JtYXQoY3R4LT5kYXRhX3BpeF9mbXQpOworICAgICAgICBpZiAoY3R4LT5zdXJmYWNlc1tpZHhdLmZvcm1hdCA9PSBOVl9FTkNfQlVGRkVSX0ZPUk1BVF9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBpbnB1dCBwaXhlbCBmb3JtYXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5kYXRhX3BpeF9mbXQpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBhbGxvY1N1cmYudmVyc2lvbiA9IE5WX0VOQ19DUkVBVEVfSU5QVVRfQlVGRkVSX1ZFUjsKKyAgICAgICAgYWxsb2NTdXJmLndpZHRoID0gYXZjdHgtPndpZHRoOworICAgICAgICBhbGxvY1N1cmYuaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKyAgICAgICAgYWxsb2NTdXJmLmJ1ZmZlckZtdCA9IGN0eC0+c3VyZmFjZXNbaWR4XS5mb3JtYXQ7CisKKyAgICAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNDcmVhdGVJbnB1dEJ1ZmZlcihjdHgtPm52ZW5jb2RlciwgJmFsbG9jU3VyZik7CisgICAgICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIHJldHVybiBudmVuY19wcmludF9lcnJvcihhdmN0eCwgbnZfc3RhdHVzLCAiQ3JlYXRlSW5wdXRCdWZmZXIgZmFpbGVkIik7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnN1cmZhY2VzW2lkeF0uaW5wdXRfc3VyZmFjZSA9IGFsbG9jU3VyZi5pbnB1dEJ1ZmZlcjsKKyAgICAgICAgY3R4LT5zdXJmYWNlc1tpZHhdLndpZHRoID0gYWxsb2NTdXJmLndpZHRoOworICAgICAgICBjdHgtPnN1cmZhY2VzW2lkeF0uaGVpZ2h0ID0gYWxsb2NTdXJmLmhlaWdodDsKICAgICB9Ci0gICAgY3R4LT5tYXhfc3VyZmFjZV9jb3VudCA9IDA7CiAKLSAgICBwX252ZW5jLT5udkVuY0Rlc3Ryb3lFbmNvZGVyKGN0eC0+bnZlbmNvZGVyKTsKLSAgICBjdHgtPm52ZW5jb2RlciA9IE5VTEw7CisgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNDcmVhdGVCaXRzdHJlYW1CdWZmZXIoY3R4LT5udmVuY29kZXIsICZhbGxvY091dCk7CisgICAgaWYgKG52X3N0YXR1cyAhPSBOVl9FTkNfU1VDQ0VTUykgeworICAgICAgICBpbnQgZXJyID0gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIG52X3N0YXR1cywgIkNyZWF0ZUJpdHN0cmVhbUJ1ZmZlciBmYWlsZWQiKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfQ1VEQSAmJiBhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX0QzRDExKQorICAgICAgICAgICAgcF9udmVuYy0+bnZFbmNEZXN0cm95SW5wdXRCdWZmZXIoY3R4LT5udmVuY29kZXIsIGN0eC0+c3VyZmFjZXNbaWR4XS5pbnB1dF9zdXJmYWNlKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmY3R4LT5zdXJmYWNlc1tpZHhdLmluX3JlZik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogCi0gICAgZGxfZm4tPmN1X2N0eF9kZXN0cm95KGN0eC0+Y3VfY29udGV4dCk7Ci0gICAgY3R4LT5jdV9jb250ZXh0ID0gTlVMTDsKKyAgICBjdHgtPnN1cmZhY2VzW2lkeF0ub3V0cHV0X3N1cmZhY2UgPSBhbGxvY091dC5iaXRzdHJlYW1CdWZmZXI7CisgICAgY3R4LT5zdXJmYWNlc1tpZHhdLnNpemUgPSBhbGxvY091dC5zaXplOwogCi0gICAgbnZlbmNfdW5sb2FkX252ZW5jKGF2Y3R4KTsKKyAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoY3R4LT51bnVzZWRfc3VyZmFjZV9xdWV1ZSwgJnRtcF9zdXJmYWNlLCBzaXplb2YodG1wX3N1cmZhY2UpLCBOVUxMKTsKIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2Nlc3Nfb3V0cHV0X3N1cmZhY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LCBOdmVuY091dHB1dFN1cmZhY2UgKnRtcG91dHN1cmYpCitzdGF0aWMgYXZfY29sZCBpbnQgbnZlbmNfc2V0dXBfc3VyZmFjZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmVzID0gMCwgcmVzMjsKKworICAgIGN0eC0+c3VyZmFjZXMgPSBhdl9tYWxsb2N6X2FycmF5KGN0eC0+bmJfc3VyZmFjZXMsIHNpemVvZigqY3R4LT5zdXJmYWNlcykpOworICAgIGlmICghY3R4LT5zdXJmYWNlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+dGltZXN0YW1wX2xpc3QgPSBhdl9maWZvX2FsbG9jKGN0eC0+bmJfc3VyZmFjZXMgKiBzaXplb2YoaW50NjRfdCkpOworICAgIGlmICghY3R4LT50aW1lc3RhbXBfbGlzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+dW51c2VkX3N1cmZhY2VfcXVldWUgPSBhdl9maWZvX2FsbG9jKGN0eC0+bmJfc3VyZmFjZXMgKiBzaXplb2YoTnZlbmNTdXJmYWNlKikpOworICAgIGlmICghY3R4LT51bnVzZWRfc3VyZmFjZV9xdWV1ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+b3V0cHV0X3N1cmZhY2VfcXVldWUgPSBhdl9maWZvX2FsbG9jKGN0eC0+bmJfc3VyZmFjZXMgKiBzaXplb2YoTnZlbmNTdXJmYWNlKikpOworICAgIGlmICghY3R4LT5vdXRwdXRfc3VyZmFjZV9xdWV1ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjdHgtPm91dHB1dF9zdXJmYWNlX3JlYWR5X3F1ZXVlID0gYXZfZmlmb19hbGxvYyhjdHgtPm5iX3N1cmZhY2VzICogc2l6ZW9mKE52ZW5jU3VyZmFjZSopKTsKKyAgICBpZiAoIWN0eC0+b3V0cHV0X3N1cmZhY2VfcmVhZHlfcXVldWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXMgPSBudmVuY19wdXNoX2NvbnRleHQoYXZjdHgpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfc3VyZmFjZXM7IGkrKykgeworICAgICAgICBpZiAoKHJlcyA9IG52ZW5jX2FsbG9jX3N1cmZhY2UoYXZjdHgsIGkpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIHJlczIgPSBudmVuY19wb3BfY29udGV4dChhdmN0eCk7CisgICAgaWYgKHJlczIgPCAwKQorICAgICAgICByZXR1cm4gcmVzMjsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBudmVuY19zZXR1cF9leHRyYWRhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgKmRsX2ZuID0gJmN0eC0+bnZlbmNfZGxvYWRfZnVuY3M7CisgICAgTlZfRU5DT0RFX0FQSV9GVU5DVElPTl9MSVNUICpwX252ZW5jID0gJmRsX2ZuLT5udmVuY19mdW5jczsKKworICAgIE5WRU5DU1RBVFVTIG52X3N0YXR1czsKKyAgICB1aW50MzJfdCBvdXRTaXplID0gMDsKKyAgICBjaGFyIHRtcEhlYWRlclsyNTZdOworICAgIE5WX0VOQ19TRVFVRU5DRV9QQVJBTV9QQVlMT0FEIHBheWxvYWQgPSB7IDAgfTsKKyAgICBwYXlsb2FkLnZlcnNpb24gPSBOVl9FTkNfU0VRVUVOQ0VfUEFSQU1fUEFZTE9BRF9WRVI7CisKKyAgICBwYXlsb2FkLnNwc3Bwc0J1ZmZlciA9IHRtcEhlYWRlcjsKKyAgICBwYXlsb2FkLmluQnVmZmVyU2l6ZSA9IHNpemVvZih0bXBIZWFkZXIpOworICAgIHBheWxvYWQub3V0U1BTUFBTUGF5bG9hZFNpemUgPSAmb3V0U2l6ZTsKKworICAgIG52X3N0YXR1cyA9IHBfbnZlbmMtPm52RW5jR2V0U2VxdWVuY2VQYXJhbXMoY3R4LT5udmVuY29kZXIsICZwYXlsb2FkKTsKKyAgICBpZiAobnZfc3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTKSB7CisgICAgICAgIHJldHVybiBudmVuY19wcmludF9lcnJvcihhdmN0eCwgbnZfc3RhdHVzLCAiR2V0U2VxdWVuY2VQYXJhbXMgZmFpbGVkIik7CisgICAgfQorCisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gb3V0U2l6ZTsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihvdXRTaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBtZW1jcHkoYXZjdHgtPmV4dHJhZGF0YSwgdG1wSGVhZGVyLCBvdXRTaXplKTsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIGludCBmZl9udmVuY19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE52ZW5jQ29udGV4dCAqY3R4ICAgICAgICAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE52ZW5jRHluTG9hZEZ1bmN0aW9ucyAqZGxfZm4gPSAmY3R4LT5udmVuY19kbG9hZF9mdW5jczsKKyAgICBOVl9FTkNPREVfQVBJX0ZVTkNUSU9OX0xJU1QgKnBfbnZlbmMgPSAmZGxfZm4tPm52ZW5jX2Z1bmNzOworICAgIGludCBpLCByZXM7CisKKyAgICAvKiB0aGUgZW5jb2RlciBoYXMgdG8gYmUgZmx1c2hlZCBiZWZvcmUgaXQgY2FuIGJlIGNsb3NlZCAqLworICAgIGlmIChjdHgtPm52ZW5jb2RlcikgeworICAgICAgICBOVl9FTkNfUElDX1BBUkFNUyBwYXJhbXMgICAgICAgID0geyAudmVyc2lvbiAgICAgICAgPSBOVl9FTkNfUElDX1BBUkFNU19WRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGVQaWNGbGFncyA9IE5WX0VOQ19QSUNfRkxBR19FT1MgfTsKKworICAgICAgICByZXMgPSBudmVuY19wdXNoX2NvbnRleHQoYXZjdHgpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgcF9udmVuYy0+bnZFbmNFbmNvZGVQaWN0dXJlKGN0eC0+bnZlbmNvZGVyLCAmcGFyYW1zKTsKKyAgICB9CisKKyAgICBhdl9maWZvX2ZyZWVwKCZjdHgtPnRpbWVzdGFtcF9saXN0KTsKKyAgICBhdl9maWZvX2ZyZWVwKCZjdHgtPm91dHB1dF9zdXJmYWNlX3JlYWR5X3F1ZXVlKTsKKyAgICBhdl9maWZvX2ZyZWVwKCZjdHgtPm91dHB1dF9zdXJmYWNlX3F1ZXVlKTsKKyAgICBhdl9maWZvX2ZyZWVwKCZjdHgtPnVudXNlZF9zdXJmYWNlX3F1ZXVlKTsKKworICAgIGlmIChjdHgtPnN1cmZhY2VzICYmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0NVREEgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfcmVnaXN0ZXJlZF9mcmFtZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbaV0ubWFwcGVkKQorICAgICAgICAgICAgICAgIHBfbnZlbmMtPm52RW5jVW5tYXBJbnB1dFJlc291cmNlKGN0eC0+bnZlbmNvZGVyLCBjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzW2ldLmluX21hcC5tYXBwZWRSZXNvdXJjZSk7CisgICAgICAgICAgICBpZiAoY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1tpXS5yZWdwdHIpCisgICAgICAgICAgICAgICAgcF9udmVuYy0+bnZFbmNVbnJlZ2lzdGVyUmVzb3VyY2UoY3R4LT5udmVuY29kZXIsIGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbaV0ucmVncHRyKTsKKyAgICAgICAgfQorICAgICAgICBjdHgtPm5iX3JlZ2lzdGVyZWRfZnJhbWVzID0gMDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5zdXJmYWNlcykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9zdXJmYWNlczsgKytpKSB7CisgICAgICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9DVURBICYmIGF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfRDNEMTEpCisgICAgICAgICAgICAgICAgcF9udmVuYy0+bnZFbmNEZXN0cm95SW5wdXRCdWZmZXIoY3R4LT5udmVuY29kZXIsIGN0eC0+c3VyZmFjZXNbaV0uaW5wdXRfc3VyZmFjZSk7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZjdHgtPnN1cmZhY2VzW2ldLmluX3JlZik7CisgICAgICAgICAgICBwX252ZW5jLT5udkVuY0Rlc3Ryb3lCaXRzdHJlYW1CdWZmZXIoY3R4LT5udmVuY29kZXIsIGN0eC0+c3VyZmFjZXNbaV0ub3V0cHV0X3N1cmZhY2UpOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWVwKCZjdHgtPnN1cmZhY2VzKTsKKyAgICBjdHgtPm5iX3N1cmZhY2VzID0gMDsKKworICAgIGlmIChjdHgtPm52ZW5jb2RlcikgeworICAgICAgICBwX252ZW5jLT5udkVuY0Rlc3Ryb3lFbmNvZGVyKGN0eC0+bnZlbmNvZGVyKTsKKworICAgICAgICByZXMgPSBudmVuY19wb3BfY29udGV4dChhdmN0eCk7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgY3R4LT5udmVuY29kZXIgPSBOVUxMOworCisgICAgaWYgKGN0eC0+Y3VfY29udGV4dF9pbnRlcm5hbCkKKyAgICAgICAgZGxfZm4tPmN1ZGFfZGwtPmN1Q3R4RGVzdHJveShjdHgtPmN1X2NvbnRleHRfaW50ZXJuYWwpOworICAgIGN0eC0+Y3VfY29udGV4dCA9IGN0eC0+Y3VfY29udGV4dF9pbnRlcm5hbCA9IE5VTEw7CisKKyNpZiBDT05GSUdfRDNEMTFWQQorICAgIGlmIChjdHgtPmQzZDExX2RldmljZSkgeworICAgICAgICBJRDNEMTFEZXZpY2VfUmVsZWFzZShjdHgtPmQzZDExX2RldmljZSk7CisgICAgICAgIGN0eC0+ZDNkMTFfZGV2aWNlID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICAgIG52ZW5jX2ZyZWVfZnVuY3Rpb25zKCZkbF9mbi0+bnZlbmNfZGwpOworICAgIGN1ZGFfZnJlZV9mdW5jdGlvbnMoJmRsX2ZuLT5jdWRhX2RsKTsKKworICAgIGRsX2ZuLT5udmVuY19kZXZpY2VfY291bnQgPSAwOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIk52ZW5jIHVubG9hZGVkXG4iKTsKKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIGludCBmZl9udmVuY19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9DVURBIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTEpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHg7CisgICAgICAgIGlmICghYXZjdHgtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJod19mcmFtZXNfY3R4IG11c3QgYmUgc2V0IHdoZW4gdXNpbmcgR1BVIGZyYW1lcyBhcyBpbnB1dFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWF2Y3R4LT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgICAgICBpZiAoZnJhbWVzX2N0eC0+Zm9ybWF0ICE9IGF2Y3R4LT5waXhfZm10KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiaHdfZnJhbWVzX2N0eCBtdXN0IG1hdGNoIHRoZSBHUFUgZnJhbWUgdHlwZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGN0eC0+ZGF0YV9waXhfZm10ID0gZnJhbWVzX2N0eC0+c3dfZm9ybWF0OworICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+ZGF0YV9waXhfZm10ID0gYXZjdHgtPnBpeF9mbXQ7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBudmVuY19sb2FkX2xpYnJhcmllcyhhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gbnZlbmNfc2V0dXBfZGV2aWNlKGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBudmVuY19zZXR1cF9lbmNvZGVyKGF2Y3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBudmVuY19zZXR1cF9zdXJmYWNlcyhhdmN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHsKKyAgICAgICAgaWYgKChyZXQgPSBudmVuY19zZXR1cF9leHRyYWRhdGEoYXZjdHgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgTnZlbmNTdXJmYWNlICpnZXRfZnJlZV9mcmFtZShOdmVuY0NvbnRleHQgKmN0eCkKK3sKKyAgICBOdmVuY1N1cmZhY2UgKnRtcF9zdXJmOworCisgICAgaWYgKCEoYXZfZmlmb19zaXplKGN0eC0+dW51c2VkX3N1cmZhY2VfcXVldWUpID4gMCkpCisgICAgICAgIC8vIHF1ZXVlIGVtcHR5CisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgYXZfZmlmb19nZW5lcmljX3JlYWQoY3R4LT51bnVzZWRfc3VyZmFjZV9xdWV1ZSwgJnRtcF9zdXJmLCBzaXplb2YodG1wX3N1cmYpLCBOVUxMKTsKKyAgICByZXR1cm4gdG1wX3N1cmY7Cit9CisKK3N0YXRpYyBpbnQgbnZlbmNfY29weV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIE52ZW5jU3VyZmFjZSAqbnZfc3VyZmFjZSwKKyAgICAgICAgICAgIE5WX0VOQ19MT0NLX0lOUFVUX0JVRkZFUiAqbG9ja19idWZmZXJfcGFyYW1zLCBjb25zdCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgZHN0X2xpbmVzaXplWzRdID0geworICAgICAgICBsb2NrX2J1ZmZlcl9wYXJhbXMtPnBpdGNoLAorICAgICAgICBsb2NrX2J1ZmZlcl9wYXJhbXMtPnBpdGNoLAorICAgICAgICBsb2NrX2J1ZmZlcl9wYXJhbXMtPnBpdGNoLAorICAgICAgICBsb2NrX2J1ZmZlcl9wYXJhbXMtPnBpdGNoCisgICAgfTsKKyAgICB1aW50OF90ICpkc3RfZGF0YVs0XTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGZyYW1lLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKQorICAgICAgICBkc3RfbGluZXNpemVbMV0gPSBkc3RfbGluZXNpemVbMl0gPj49IDE7CisKKyAgICByZXQgPSBhdl9pbWFnZV9maWxsX3BvaW50ZXJzKGRzdF9kYXRhLCBmcmFtZS0+Zm9ybWF0LCBudl9zdXJmYWNlLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrX2J1ZmZlcl9wYXJhbXMtPmJ1ZmZlckRhdGFQdHIsIGRzdF9saW5lc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoZnJhbWUtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApCisgICAgICAgIEZGU1dBUCh1aW50OF90KiwgZHN0X2RhdGFbMV0sIGRzdF9kYXRhWzJdKTsKKworICAgIGF2X2ltYWdlX2NvcHkoZHN0X2RhdGEsIGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiopZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwgZnJhbWUtPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBudmVuY19maW5kX2ZyZWVfcmVnX3Jlc291cmNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBOdmVuY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgTnZlbmNEeW5Mb2FkRnVuY3Rpb25zICpkbF9mbiA9ICZjdHgtPm52ZW5jX2Rsb2FkX2Z1bmNzOworICAgIE5WX0VOQ09ERV9BUElfRlVOQ1RJT05fTElTVCAqcF9udmVuYyA9ICZkbF9mbi0+bnZlbmNfZnVuY3M7CisgICAgTlZFTkNTVEFUVVMgbnZfc3RhdHVzOworCisgICAgaW50IGk7CisKKyAgICBpZiAoY3R4LT5uYl9yZWdpc3RlcmVkX2ZyYW1lcyA9PSBGRl9BUlJBWV9FTEVNUyhjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9yZWdpc3RlcmVkX2ZyYW1lczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbaV0ubWFwcGVkKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbaV0ucmVncHRyKSB7CisgICAgICAgICAgICAgICAgICAgIG52X3N0YXR1cyA9IHBfbnZlbmMtPm52RW5jVW5yZWdpc3RlclJlc291cmNlKGN0eC0+bnZlbmNvZGVyLCBjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzW2ldLnJlZ3B0cik7CisgICAgICAgICAgICAgICAgICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIG52X3N0YXR1cywgIkZhaWxlZCB1bnJlZ2lzdGVyaW5nIHVudXNlZCBpbnB1dCByZXNvdXJjZSIpOworICAgICAgICAgICAgICAgICAgICBjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzW2ldLnB0ciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbaV0ucmVncHRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gY3R4LT5uYl9yZWdpc3RlcmVkX2ZyYW1lcysrOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgcmVnaXN0ZXJlZCBDVURBIGZyYW1lc1xuIik7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworc3RhdGljIGludCBudmVuY19yZWdpc3Rlcl9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgKmRsX2ZuID0gJmN0eC0+bnZlbmNfZGxvYWRfZnVuY3M7CisgICAgTlZfRU5DT0RFX0FQSV9GVU5DVElPTl9MSVNUICpwX252ZW5jID0gJmRsX2ZuLT5udmVuY19mdW5jczsKKworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilmcmFtZS0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICBOVl9FTkNfUkVHSVNURVJfUkVTT1VSQ0UgcmVnOworICAgIGludCBpLCBpZHgsIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX3JlZ2lzdGVyZWRfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfQ1VEQSAmJiBjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzW2ldLnB0ciA9PSBmcmFtZS0+ZGF0YVswXSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICBlbHNlIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0QzRDExICYmIGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbaV0ucHRyID09IGZyYW1lLT5kYXRhWzBdICYmIGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbaV0ucHRyX2luZGV4ID09IChpbnRwdHJfdClmcmFtZS0+ZGF0YVsxXSkKKyAgICAgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIGlkeCA9IG52ZW5jX2ZpbmRfZnJlZV9yZWdfcmVzb3VyY2UoYXZjdHgpOworICAgIGlmIChpZHggPCAwKQorICAgICAgICByZXR1cm4gaWR4OworCisgICAgcmVnLnZlcnNpb24gICAgICAgICAgICA9IE5WX0VOQ19SRUdJU1RFUl9SRVNPVVJDRV9WRVI7CisgICAgcmVnLndpZHRoICAgICAgICAgICAgICA9IGZyYW1lc19jdHgtPndpZHRoOworICAgIHJlZy5oZWlnaHQgICAgICAgICAgICAgPSBmcmFtZXNfY3R4LT5oZWlnaHQ7CisgICAgcmVnLnBpdGNoICAgICAgICAgICAgICA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICByZWcucmVzb3VyY2VUb1JlZ2lzdGVyID0gZnJhbWUtPmRhdGFbMF07CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9DVURBKSB7CisgICAgICAgIHJlZy5yZXNvdXJjZVR5cGUgICA9IE5WX0VOQ19JTlBVVF9SRVNPVVJDRV9UWVBFX0NVREFERVZJQ0VQVFI7CisgICAgfQorICAgIGVsc2UgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTEpIHsKKyAgICAgICAgcmVnLnJlc291cmNlVHlwZSAgICAgPSBOVl9FTkNfSU5QVVRfUkVTT1VSQ0VfVFlQRV9ESVJFQ1RYOworICAgICAgICByZWcuc3ViUmVzb3VyY2VJbmRleCA9IChpbnRwdHJfdClmcmFtZS0+ZGF0YVsxXTsKKyAgICB9CisKKyAgICByZWcuYnVmZmVyRm9ybWF0ICAgICAgID0gbnZlbmNfbWFwX2J1ZmZlcl9mb3JtYXQoZnJhbWVzX2N0eC0+c3dfZm9ybWF0KTsKKyAgICBpZiAocmVnLmJ1ZmZlckZvcm1hdCA9PSBOVl9FTkNfQlVGRkVSX0ZPUk1BVF9VTkRFRklORUQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJJbnZhbGlkIGlucHV0IHBpeGVsIGZvcm1hdDogJXNcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGZyYW1lc19jdHgtPnN3X2Zvcm1hdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldCA9IHBfbnZlbmMtPm52RW5jUmVnaXN0ZXJSZXNvdXJjZShjdHgtPm52ZW5jb2RlciwgJnJlZyk7CisgICAgaWYgKHJldCAhPSBOVl9FTkNfU1VDQ0VTUykgeworICAgICAgICBudmVuY19wcmludF9lcnJvcihhdmN0eCwgcmV0LCAiRXJyb3IgcmVnaXN0ZXJpbmcgYW4gaW5wdXQgcmVzb3VyY2UiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzW2lkeF0ucHRyICAgICAgID0gZnJhbWUtPmRhdGFbMF07CisgICAgY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1tpZHhdLnB0cl9pbmRleCA9IHJlZy5zdWJSZXNvdXJjZUluZGV4OworICAgIGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbaWR4XS5yZWdwdHIgICAgPSByZWcucmVnaXN0ZXJlZFJlc291cmNlOworICAgIHJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQgbnZlbmNfdXBsb2FkX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE52ZW5jU3VyZmFjZSAqbnZlbmNfZnJhbWUpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIE52ZW5jRHluTG9hZEZ1bmN0aW9ucyAqZGxfZm4gPSAmY3R4LT5udmVuY19kbG9hZF9mdW5jczsKKyAgICBOVl9FTkNPREVfQVBJX0ZVTkNUSU9OX0xJU1QgKnBfbnZlbmMgPSAmZGxfZm4tPm52ZW5jX2Z1bmNzOworCisgICAgaW50IHJlczsKKyAgICBOVkVOQ1NUQVRVUyBudl9zdGF0dXM7CisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9DVURBIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfRDNEMTEpIHsKKyAgICAgICAgaW50IHJlZ19pZHggPSBudmVuY19yZWdpc3Rlcl9mcmFtZShhdmN0eCwgZnJhbWUpOworICAgICAgICBpZiAocmVnX2lkeCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHJlZ2lzdGVyIGFuIGlucHV0IEhXIGZyYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZWdfaWR4OworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gYXZfZnJhbWVfcmVmKG52ZW5jX2ZyYW1lLT5pbl9yZWYsIGZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworCisgICAgICAgIGlmICghY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1tyZWdfaWR4XS5tYXBwZWQpIHsKKyAgICAgICAgICAgIGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbcmVnX2lkeF0uaW5fbWFwLnZlcnNpb24gPSBOVl9FTkNfTUFQX0lOUFVUX1JFU09VUkNFX1ZFUjsKKyAgICAgICAgICAgIGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbcmVnX2lkeF0uaW5fbWFwLnJlZ2lzdGVyZWRSZXNvdXJjZSA9IGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbcmVnX2lkeF0ucmVncHRyOworICAgICAgICAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNNYXBJbnB1dFJlc291cmNlKGN0eC0+bnZlbmNvZGVyLCAmY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1tyZWdfaWR4XS5pbl9tYXApOworICAgICAgICAgICAgaWYgKG52X3N0YXR1cyAhPSBOVl9FTkNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKG52ZW5jX2ZyYW1lLT5pbl9yZWYpOworICAgICAgICAgICAgICAgIHJldHVybiBudmVuY19wcmludF9lcnJvcihhdmN0eCwgbnZfc3RhdHVzLCAiRXJyb3IgbWFwcGluZyBhbiBpbnB1dCByZXNvdXJjZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1tyZWdfaWR4XS5tYXBwZWQgKz0gMTsKKworICAgICAgICBudmVuY19mcmFtZS0+cmVnX2lkeCAgICAgICAgICAgICAgICAgICA9IHJlZ19pZHg7CisgICAgICAgIG52ZW5jX2ZyYW1lLT5pbnB1dF9zdXJmYWNlICAgICAgICAgICAgID0gY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1tyZWdfaWR4XS5pbl9tYXAubWFwcGVkUmVzb3VyY2U7CisgICAgICAgIG52ZW5jX2ZyYW1lLT5mb3JtYXQgICAgICAgICAgICAgICAgICAgID0gY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1tyZWdfaWR4XS5pbl9tYXAubWFwcGVkQnVmZmVyRm10OworICAgICAgICBudmVuY19mcmFtZS0+cGl0Y2ggICAgICAgICAgICAgICAgICAgICA9IGZyYW1lLT5saW5lc2l6ZVswXTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBOVl9FTkNfTE9DS19JTlBVVF9CVUZGRVIgbG9ja0J1ZmZlclBhcmFtcyA9IHsgMCB9OworCisgICAgICAgIGxvY2tCdWZmZXJQYXJhbXMudmVyc2lvbiA9IE5WX0VOQ19MT0NLX0lOUFVUX0JVRkZFUl9WRVI7CisgICAgICAgIGxvY2tCdWZmZXJQYXJhbXMuaW5wdXRCdWZmZXIgPSBudmVuY19mcmFtZS0+aW5wdXRfc3VyZmFjZTsKKworICAgICAgICBudl9zdGF0dXMgPSBwX252ZW5jLT5udkVuY0xvY2tJbnB1dEJ1ZmZlcihjdHgtPm52ZW5jb2RlciwgJmxvY2tCdWZmZXJQYXJhbXMpOworICAgICAgICBpZiAobnZfc3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIG52X3N0YXR1cywgIkZhaWxlZCBsb2NraW5nIG52ZW5jIGlucHV0IGJ1ZmZlciIpOworICAgICAgICB9CisKKyAgICAgICAgbnZlbmNfZnJhbWUtPnBpdGNoID0gbG9ja0J1ZmZlclBhcmFtcy5waXRjaDsKKyAgICAgICAgcmVzID0gbnZlbmNfY29weV9mcmFtZShhdmN0eCwgbnZlbmNfZnJhbWUsICZsb2NrQnVmZmVyUGFyYW1zLCBmcmFtZSk7CisKKyAgICAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNVbmxvY2tJbnB1dEJ1ZmZlcihjdHgtPm52ZW5jb2RlciwgbnZlbmNfZnJhbWUtPmlucHV0X3N1cmZhY2UpOworICAgICAgICBpZiAobnZfc3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTKSB7CisgICAgICAgICAgICByZXR1cm4gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIG52X3N0YXR1cywgIkZhaWxlZCB1bmxvY2tpbmcgaW5wdXQgYnVmZmVyISIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG52ZW5jX2NvZGVjX3NwZWNpZmljX3BpY19wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVl9FTkNfUElDX1BBUkFNUyAqcGFyYW1zKQoreworICAgIE52ZW5jQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICAgICAgcGFyYW1zLT5jb2RlY1BpY1BhcmFtcy5oMjY0UGljUGFyYW1zLnNsaWNlTW9kZSA9CisgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaDI2NENvbmZpZy5zbGljZU1vZGU7CisgICAgICAgIHBhcmFtcy0+Y29kZWNQaWNQYXJhbXMuaDI2NFBpY1BhcmFtcy5zbGljZU1vZGVEYXRhID0KKyAgICAgICAgICAgIGN0eC0+ZW5jb2RlX2NvbmZpZy5lbmNvZGVDb2RlY0NvbmZpZy5oMjY0Q29uZmlnLnNsaWNlTW9kZURhdGE7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgIHBhcmFtcy0+Y29kZWNQaWNQYXJhbXMuaGV2Y1BpY1BhcmFtcy5zbGljZU1vZGUgPQorICAgICAgICAgICAgY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmhldmNDb25maWcuc2xpY2VNb2RlOworICAgICAgICBwYXJhbXMtPmNvZGVjUGljUGFyYW1zLmhldmNQaWNQYXJhbXMuc2xpY2VNb2RlRGF0YSA9CisgICAgICAgICAgICBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaGV2Y0NvbmZpZy5zbGljZU1vZGVEYXRhOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lc3RhbXBfcXVldWVfZW5xdWV1ZShBVkZpZm9CdWZmZXIqIHF1ZXVlLCBpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKyAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUocXVldWUsICZ0aW1lc3RhbXAsIHNpemVvZih0aW1lc3RhbXApLCBOVUxMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQ2NF90IHRpbWVzdGFtcF9xdWV1ZV9kZXF1ZXVlKEFWRmlmb0J1ZmZlciogcXVldWUpCit7CisgICAgaW50NjRfdCB0aW1lc3RhbXAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBpZiAoYXZfZmlmb19zaXplKHF1ZXVlKSA+IDApCisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHF1ZXVlLCAmdGltZXN0YW1wLCBzaXplb2YodGltZXN0YW1wKSwgTlVMTCk7CisKKyAgICByZXR1cm4gdGltZXN0YW1wOworfQorCitzdGF0aWMgaW50IG52ZW5jX3NldF90aW1lc3RhbXAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5WX0VOQ19MT0NLX0JJVFNUUkVBTSAqcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcGt0LT5wdHMgPSBwYXJhbXMtPm91dHB1dFRpbWVTdGFtcDsKKworICAgIC8qIGdlbmVyYXRlIHRoZSBmaXJzdCBkdHMgYnkgbGluZWFybHkgZXh0cmFwb2xhdGluZyB0aGUKKyAgICAgKiBmaXJzdCB0d28gcHRzIHZhbHVlcyB0byB0aGUgcGFzdCAqLworICAgIGlmIChhdmN0eC0+bWF4X2JfZnJhbWVzID4gMCAmJiAhY3R4LT5maXJzdF9wYWNrZXRfb3V0cHV0ICYmCisgICAgICAgIGN0eC0+aW5pdGlhbF9wdHNbMV0gIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaW50NjRfdCB0czAgPSBjdHgtPmluaXRpYWxfcHRzWzBdLCB0czEgPSBjdHgtPmluaXRpYWxfcHRzWzFdOworICAgICAgICBpbnQ2NF90IGRlbHRhOworCisgICAgICAgIGlmICgodHMwIDwgMCAmJiB0czEgPiBJTlQ2NF9NQVggKyB0czApIHx8CisgICAgICAgICAgICAodHMwID4gMCAmJiB0czEgPCBJTlQ2NF9NSU4gKyB0czApKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRVJBTkdFKTsKKyAgICAgICAgZGVsdGEgPSB0czEgLSB0czA7CisKKyAgICAgICAgaWYgKChkZWx0YSA8IDAgJiYgdHMwID4gSU5UNjRfTUFYICsgZGVsdGEpIHx8CisgICAgICAgICAgICAoZGVsdGEgPiAwICYmIHRzMCA8IElOVDY0X01JTiArIGRlbHRhKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVSQU5HRSk7CisgICAgICAgIHBrdC0+ZHRzID0gdHMwIC0gZGVsdGE7CisKKyAgICAgICAgY3R4LT5maXJzdF9wYWNrZXRfb3V0cHV0ID0gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcGt0LT5kdHMgPSB0aW1lc3RhbXBfcXVldWVfZGVxdWV1ZShjdHgtPnRpbWVzdGFtcF9saXN0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Nfb3V0cHV0X3N1cmZhY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LCBOdmVuY1N1cmZhY2UgKnRtcG91dHN1cmYpCiB7CiAgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIE52ZW5jRHluTG9hZEZ1bmN0aW9ucyAqZGxfZm4gPSAmY3R4LT5udmVuY19kbG9hZF9mdW5jczsKICAgICBOVl9FTkNPREVfQVBJX0ZVTkNUSU9OX0xJU1QgKnBfbnZlbmMgPSAmZGxfZm4tPm52ZW5jX2Z1bmNzOwogCiAgICAgdWludDMyX3Qgc2xpY2VfbW9kZV9kYXRhOwotICAgIHVpbnQzMl90ICpzbGljZV9vZmZzZXRzOworICAgIHVpbnQzMl90ICpzbGljZV9vZmZzZXRzID0gTlVMTDsKICAgICBOVl9FTkNfTE9DS19CSVRTVFJFQU0gbG9ja19wYXJhbXMgPSB7IDAgfTsKICAgICBOVkVOQ1NUQVRVUyBudl9zdGF0dXM7CiAgICAgaW50IHJlcyA9IDA7CiAKKyAgICBlbnVtIEFWUGljdHVyZVR5cGUgcGljdF90eXBlOworCiAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OgogICAgICAgc2xpY2VfbW9kZV9kYXRhID0gY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuc2xpY2VNb2RlRGF0YTsKQEAgLTExODEsOCArMTc5OCwxMCBAQAogICAgIH0KICAgICBzbGljZV9vZmZzZXRzID0gYXZfbWFsbG9jeihzbGljZV9tb2RlX2RhdGEgKiBzaXplb2YoKnNsaWNlX29mZnNldHMpKTsKIAotICAgIGlmICghc2xpY2Vfb2Zmc2V0cykKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAoIXNsaWNlX29mZnNldHMpIHsKKyAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KIAogICAgIGxvY2tfcGFyYW1zLnZlcnNpb24gPSBOVl9FTkNfTE9DS19CSVRTVFJFQU1fVkVSOwogCkBAIC0xMTkyLDggKzE4MTEsNyBAQAogCiAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNMb2NrQml0c3RyZWFtKGN0eC0+bnZlbmNvZGVyLCAmbG9ja19wYXJhbXMpOwogICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgbG9ja2luZyBiaXRzdHJlYW0gYnVmZmVyXG4iKTsKLSAgICAgICAgcmVzID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgcmVzID0gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIG52X3N0YXR1cywgIkZhaWxlZCBsb2NraW5nIGJpdHN0cmVhbSBidWZmZXIiKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKQEAgLTEyMDUsNjggKzE4MjMsMTA4IEBACiAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgbG9ja19wYXJhbXMuYml0c3RyZWFtQnVmZmVyUHRyLCBsb2NrX3BhcmFtcy5iaXRzdHJlYW1TaXplSW5CeXRlcyk7CiAKICAgICBudl9zdGF0dXMgPSBwX252ZW5jLT5udkVuY1VubG9ja0JpdHN0cmVhbShjdHgtPm52ZW5jb2RlciwgdG1wb3V0c3VyZi0+b3V0cHV0X3N1cmZhY2UpOwotICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MpCi0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHVubG9ja2luZyBiaXRzdHJlYW0gYnVmZmVyLCBleHBlY3QgdGhlIGdhdGVzIG9mIG1vcmRvciB0byBvcGVuXG4iKTsKKyAgICBpZiAobnZfc3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTKSB7CisgICAgICAgIHJlcyA9IG52ZW5jX3ByaW50X2Vycm9yKGF2Y3R4LCBudl9zdGF0dXMsICJGYWlsZWQgdW5sb2NraW5nIGJpdHN0cmVhbSBidWZmZXIsIGV4cGVjdCB0aGUgZ2F0ZXMgb2YgbW9yZG9yIHRvIG9wZW4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0NVREEgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9EM0QxMSkgeworICAgICAgICBjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzW3RtcG91dHN1cmYtPnJlZ19pZHhdLm1hcHBlZCAtPSAxOworICAgICAgICBpZiAoY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1t0bXBvdXRzdXJmLT5yZWdfaWR4XS5tYXBwZWQgPT0gMCkgeworICAgICAgICAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNVbm1hcElucHV0UmVzb3VyY2UoY3R4LT5udmVuY29kZXIsIGN0eC0+cmVnaXN0ZXJlZF9mcmFtZXNbdG1wb3V0c3VyZi0+cmVnX2lkeF0uaW5fbWFwLm1hcHBlZFJlc291cmNlKTsKKyAgICAgICAgICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBudmVuY19wcmludF9lcnJvcihhdmN0eCwgbnZfc3RhdHVzLCAiRmFpbGVkIHVubWFwcGluZyBpbnB1dCByZXNvdXJjZSIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudl9zdGF0dXMgPSBwX252ZW5jLT5udkVuY1VucmVnaXN0ZXJSZXNvdXJjZShjdHgtPm52ZW5jb2RlciwgY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1t0bXBvdXRzdXJmLT5yZWdfaWR4XS5yZWdwdHIpOworICAgICAgICAgICAgaWYgKG52X3N0YXR1cyAhPSBOVl9FTkNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIHJlcyA9IG52ZW5jX3ByaW50X2Vycm9yKGF2Y3R4LCBudl9zdGF0dXMsICJGYWlsZWQgdW5yZWdpc3RlcmluZyBpbnB1dCByZXNvdXJjZSIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzW3RtcG91dHN1cmYtPnJlZ19pZHhdLnB0ciA9IE5VTEw7CisgICAgICAgICAgICBjdHgtPnJlZ2lzdGVyZWRfZnJhbWVzW3RtcG91dHN1cmYtPnJlZ19pZHhdLnJlZ3B0ciA9IE5VTEw7CisgICAgICAgIH0gZWxzZSBpZiAoY3R4LT5yZWdpc3RlcmVkX2ZyYW1lc1t0bXBvdXRzdXJmLT5yZWdfaWR4XS5tYXBwZWQgPCAwKSB7CisgICAgICAgICAgICByZXMgPSBBVkVSUk9SX0JVRzsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmFtZV91bnJlZih0bXBvdXRzdXJmLT5pbl9yZWYpOworCisgICAgICAgIHRtcG91dHN1cmYtPmlucHV0X3N1cmZhY2UgPSBOVUxMOworICAgIH0KIAogICAgIHN3aXRjaCAobG9ja19wYXJhbXMucGljdHVyZVR5cGUpIHsKICAgICBjYXNlIE5WX0VOQ19QSUNfVFlQRV9JRFI6CiAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwotI2lmIEZGX0FQSV9DT0RFRF9GUkFNRQotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIGNhc2UgTlZfRU5DX1BJQ19UWVBFX0k6Ci0gICAgICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgIHBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE5WX0VOQ19QSUNfVFlQRV9QOgotICAgICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBwaWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBOVl9FTkNfUElDX1RZUEVfQjoKLSAgICAgICAgYXZjdHgtPmNvZGVkX2ZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgcGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTlZfRU5DX1BJQ19UWVBFX0JJOgotICAgICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9CSTsKKyAgICAgICAgcGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0JJOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gcGljdHVyZSB0eXBlIGVuY291bnRlcmVkLCBleHBlY3QgdGhlIG91dHB1dCB0byBiZSBicm9rZW4uXG4iKTsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IgYW5kIGluY2x1ZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gcmVwcm9kdWNlIGl0IGFzIHBvc3NpYmxlLlxuIik7CiAgICAgICAgIHJlcyA9IEFWRVJST1JfRVhURVJOQUw7CiAgICAgICAgIGdvdG8gZXJyb3I7Ci1GRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgogICAgIH0KIAotICAgIHBrdC0+cHRzID0gbG9ja19wYXJhbXMub3V0cHV0VGltZVN0YW1wOwotICAgIHBrdC0+ZHRzID0gdGltZXN0YW1wX3F1ZXVlX2RlcXVldWUoJmN0eC0+dGltZXN0YW1wX2xpc3QpOworI2lmIEZGX0FQSV9DT0RFRF9GUkFNRQorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGF2Y3R4LT5jb2RlZF9mcmFtZS0+cGljdF90eXBlID0gcGljdF90eXBlOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKIAotICAgIC8qIHdoZW4gdGhlcmUncmUgYiBmcmFtZShzKSwgc2V0IGR0cyBvZmZzZXQgKi8KLSAgICBpZiAoY3R4LT5lbmNvZGVfY29uZmlnLmZyYW1lSW50ZXJ2YWxQID49IDIpCi0gICAgICAgIHBrdC0+ZHRzIC09IDE7CisgICAgZmZfc2lkZV9kYXRhX3NldF9lbmNvZGVyX3N0YXRzKHBrdCwKKyAgICAgICAgKGxvY2tfcGFyYW1zLmZyYW1lQXZnUVAgLSAxKSAqIEZGX1FQMkxBTUJEQSwgTlVMTCwgMCwgcGljdF90eXBlKTsKIAotICAgIGlmIChwa3QtPmR0cyA+IHBrdC0+cHRzKQotICAgICAgICBwa3QtPmR0cyA9IHBrdC0+cHRzOwotCi0gICAgaWYgKGN0eC0+bGFzdF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LT5kdHMgPD0gY3R4LT5sYXN0X2R0cykKLSAgICAgICAgcGt0LT5kdHMgPSBjdHgtPmxhc3RfZHRzICsgMTsKLQotICAgIGN0eC0+bGFzdF9kdHMgPSBwa3QtPmR0czsKKyAgICByZXMgPSBudmVuY19zZXRfdGltZXN0YW1wKGF2Y3R4LCAmbG9ja19wYXJhbXMsIHBrdCk7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIGdvdG8gZXJyb3IyOwogCiAgICAgYXZfZnJlZShzbGljZV9vZmZzZXRzKTsKIAogICAgIHJldHVybiAwOwogCiBlcnJvcjoKKyAgICB0aW1lc3RhbXBfcXVldWVfZGVxdWV1ZShjdHgtPnRpbWVzdGFtcF9saXN0KTsKIAorZXJyb3IyOgogICAgIGF2X2ZyZWUoc2xpY2Vfb2Zmc2V0cyk7Ci0gICAgdGltZXN0YW1wX3F1ZXVlX2RlcXVldWUoJmN0eC0+dGltZXN0YW1wX2xpc3QpOwogCiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGludCBudmVuY19lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAotICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCitzdGF0aWMgaW50IG91dHB1dF9yZWFkeShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBmbHVzaCkKK3sKKyAgICBOdmVuY0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IG5iX3JlYWR5LCBuYl9wZW5kaW5nOworCisgICAgLyogd2hlbiBCLWZyYW1lcyBhcmUgZW5hYmxlZCwgd2Ugd2FpdCBmb3IgdHdvIGluaXRpYWwgdGltZXN0YW1wcyB0bworICAgICAqIGNhbGN1bGF0ZSB0aGUgZmlyc3QgZHRzICovCisgICAgaWYgKCFmbHVzaCAmJiBhdmN0eC0+bWF4X2JfZnJhbWVzID4gMCAmJgorICAgICAgICAoY3R4LT5pbml0aWFsX3B0c1swXSA9PSBBVl9OT1BUU19WQUxVRSB8fCBjdHgtPmluaXRpYWxfcHRzWzFdID09IEFWX05PUFRTX1ZBTFVFKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBuYl9yZWFkeSAgID0gYXZfZmlmb19zaXplKGN0eC0+b3V0cHV0X3N1cmZhY2VfcmVhZHlfcXVldWUpICAgLyBzaXplb2YoTnZlbmNTdXJmYWNlKik7CisgICAgbmJfcGVuZGluZyA9IGF2X2ZpZm9fc2l6ZShjdHgtPm91dHB1dF9zdXJmYWNlX3F1ZXVlKSAgICAgICAgIC8gc2l6ZW9mKE52ZW5jU3VyZmFjZSopOworICAgIGlmIChmbHVzaCkKKyAgICAgICAgcmV0dXJuIG5iX3JlYWR5ID4gMDsKKyAgICByZXR1cm4gKG5iX3JlYWR5ID4gMCkgJiYgKG5iX3JlYWR5ICsgbmJfcGVuZGluZyA+PSBjdHgtPmFzeW5jX2RlcHRoKTsKK30KKworaW50IGZmX252ZW5jX3NlbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpmcmFtZSkKIHsKICAgICBOVkVOQ1NUQVRVUyBudl9zdGF0dXM7Ci0gICAgTnZlbmNPdXRwdXRTdXJmYWNlICp0bXBvdXRzdXJmOwotICAgIGludCByZXMsIGkgPSAwOworICAgIE52ZW5jU3VyZmFjZSAqdG1wX291dF9zdXJmLCAqaW5fc3VyZjsKKyAgICBpbnQgcmVzLCByZXMyOwogCiAgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIE52ZW5jRHluTG9hZEZ1bmN0aW9ucyAqZGxfZm4gPSAmY3R4LT5udmVuY19kbG9hZF9mdW5jczsKQEAgLTEyNzUsMzAwICsxOTMzLDE1MiBAQAogICAgIE5WX0VOQ19QSUNfUEFSQU1TIHBpY19wYXJhbXMgPSB7IDAgfTsKICAgICBwaWNfcGFyYW1zLnZlcnNpb24gPSBOVl9FTkNfUElDX1BBUkFNU19WRVI7CiAKKyAgICBpZiAoKCFjdHgtPmN1X2NvbnRleHQgJiYgIWN0eC0+ZDNkMTFfZGV2aWNlKSB8fCAhY3R4LT5udmVuY29kZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoY3R4LT5lbmNvZGVyX2ZsdXNoaW5nKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKICAgICBpZiAoZnJhbWUpIHsKLSAgICAgICAgTlZfRU5DX0xPQ0tfSU5QVVRfQlVGRkVSIGxvY2tCdWZmZXJQYXJhbXMgPSB7IDAgfTsKLSAgICAgICAgTnZlbmNJbnB1dFN1cmZhY2UgKmluU3VyZiA9IE5VTEw7CisgICAgICAgIGluX3N1cmYgPSBnZXRfZnJlZV9mcmFtZShjdHgpOworICAgICAgICBpZiAoIWluX3N1cmYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm1heF9zdXJmYWNlX2NvdW50OyArK2kpIHsKLSAgICAgICAgICAgIGlmICghY3R4LT5pbnB1dF9zdXJmYWNlc1tpXS5sb2NrQ291bnQpIHsKLSAgICAgICAgICAgICAgICBpblN1cmYgPSAmY3R4LT5pbnB1dF9zdXJmYWNlc1tpXTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICByZXMgPSBudmVuY19wdXNoX2NvbnRleHQoYXZjdHgpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAKLSAgICAgICAgYXZfYXNzZXJ0MChpblN1cmYpOworICAgICAgICByZXMgPSBudmVuY191cGxvYWRfZnJhbWUoYXZjdHgsIGZyYW1lLCBpbl9zdXJmKTsKIAotICAgICAgICBpblN1cmYtPmxvY2tDb3VudCA9IDE7CisgICAgICAgIHJlczIgPSBudmVuY19wb3BfY29udGV4dChhdmN0eCk7CisgICAgICAgIGlmIChyZXMyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXMyOwogCi0gICAgICAgIGxvY2tCdWZmZXJQYXJhbXMudmVyc2lvbiA9IE5WX0VOQ19MT0NLX0lOUFVUX0JVRkZFUl9WRVI7Ci0gICAgICAgIGxvY2tCdWZmZXJQYXJhbXMuaW5wdXRCdWZmZXIgPSBpblN1cmYtPmlucHV0X3N1cmZhY2U7CisgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICByZXR1cm4gcmVzOwogCi0gICAgICAgIG52X3N0YXR1cyA9IHBfbnZlbmMtPm52RW5jTG9ja0lucHV0QnVmZmVyKGN0eC0+bnZlbmNvZGVyLCAmbG9ja0J1ZmZlclBhcmFtcyk7Ci0gICAgICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIGxvY2tpbmcgbnZlbmMgaW5wdXQgYnVmZmVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgewotICAgICAgICAgICAgdWludDhfdCAqYnVmID0gbG9ja0J1ZmZlclBhcmFtcy5idWZmZXJEYXRhUHRyOwotCi0gICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGJ1ZiwgbG9ja0J1ZmZlclBhcmFtcy5waXRjaCwKLSAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVswXSwgZnJhbWUtPmxpbmVzaXplWzBdLAotICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7Ci0KLSAgICAgICAgICAgIGJ1ZiArPSBpblN1cmYtPmhlaWdodCAqIGxvY2tCdWZmZXJQYXJhbXMucGl0Y2g7Ci0KLSAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoYnVmLCBsb2NrQnVmZmVyUGFyYW1zLnBpdGNoID4+IDEsCi0gICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMl0sIGZyYW1lLT5saW5lc2l6ZVsyXSwKLSAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggPj4gMSwgYXZjdHgtPmhlaWdodCA+PiAxKTsKLQotICAgICAgICAgICAgYnVmICs9IChpblN1cmYtPmhlaWdodCAqIGxvY2tCdWZmZXJQYXJhbXMucGl0Y2gpID4+IDI7Ci0KLSAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoYnVmLCBsb2NrQnVmZmVyUGFyYW1zLnBpdGNoID4+IDEsCi0gICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMV0sIGZyYW1lLT5saW5lc2l6ZVsxXSwKLSAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggPj4gMSwgYXZjdHgtPmhlaWdodCA+PiAxKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05WMTIpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiA9IGxvY2tCdWZmZXJQYXJhbXMuYnVmZmVyRGF0YVB0cjsKLQotICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShidWYsIGxvY2tCdWZmZXJQYXJhbXMucGl0Y2gsCi0gICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSwKLSAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOwotCi0gICAgICAgICAgICBidWYgKz0gaW5TdXJmLT5oZWlnaHQgKiBsb2NrQnVmZmVyUGFyYW1zLnBpdGNoOwotCi0gICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGJ1ZiwgbG9ja0J1ZmZlclBhcmFtcy5waXRjaCwKLSAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVsxXSwgZnJhbWUtPmxpbmVzaXplWzFdLAotICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCA+PiAxKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFApIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiA9IGxvY2tCdWZmZXJQYXJhbXMuYnVmZmVyRGF0YVB0cjsKLQotICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShidWYsIGxvY2tCdWZmZXJQYXJhbXMucGl0Y2gsCi0gICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSwKLSAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOwotCi0gICAgICAgICAgICBidWYgKz0gaW5TdXJmLT5oZWlnaHQgKiBsb2NrQnVmZmVyUGFyYW1zLnBpdGNoOwotCi0gICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGJ1ZiwgbG9ja0J1ZmZlclBhcmFtcy5waXRjaCwKLSAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVsxXSwgZnJhbWUtPmxpbmVzaXplWzFdLAotICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7Ci0KLSAgICAgICAgICAgIGJ1ZiArPSBpblN1cmYtPmhlaWdodCAqIGxvY2tCdWZmZXJQYXJhbXMucGl0Y2g7Ci0KLSAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoYnVmLCBsb2NrQnVmZmVyUGFyYW1zLnBpdGNoLAotICAgICAgICAgICAgICAgIGZyYW1lLT5kYXRhWzJdLCBmcmFtZS0+bGluZXNpemVbMl0sCi0gICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0ZBVEFMLCAiSW52YWxpZCBwaXhlbCBmb3JtYXQhXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBudl9zdGF0dXMgPSBwX252ZW5jLT5udkVuY1VubG9ja0lucHV0QnVmZmVyKGN0eC0+bnZlbmNvZGVyLCBpblN1cmYtPmlucHV0X3N1cmZhY2UpOwotICAgICAgICBpZiAobnZfc3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19GQVRBTCwgIkZhaWxlZCB1bmxvY2tpbmcgaW5wdXQgYnVmZmVyIVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm1heF9zdXJmYWNlX2NvdW50OyArK2kpCi0gICAgICAgICAgICBpZiAoIWN0eC0+b3V0cHV0X3N1cmZhY2VzW2ldLmJ1c3kpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKGkgPT0gY3R4LT5tYXhfc3VyZmFjZV9jb3VudCkgewotICAgICAgICAgICAgaW5TdXJmLT5sb2NrQ291bnQgPSAwOwotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRkFUQUwsICJObyBmcmVlIG91dHB1dCBzdXJmYWNlIGZvdW5kIVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgfQotCi0gICAgICAgIGN0eC0+b3V0cHV0X3N1cmZhY2VzW2ldLmlucHV0X3N1cmZhY2UgPSBpblN1cmY7Ci0KLSAgICAgICAgcGljX3BhcmFtcy5pbnB1dEJ1ZmZlciA9IGluU3VyZi0+aW5wdXRfc3VyZmFjZTsKLSAgICAgICAgcGljX3BhcmFtcy5idWZmZXJGbXQgPSBpblN1cmYtPmZvcm1hdDsKLSAgICAgICAgcGljX3BhcmFtcy5pbnB1dFdpZHRoID0gYXZjdHgtPndpZHRoOwotICAgICAgICBwaWNfcGFyYW1zLmlucHV0SGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKLSAgICAgICAgcGljX3BhcmFtcy5vdXRwdXRCaXRzdHJlYW0gPSBjdHgtPm91dHB1dF9zdXJmYWNlc1tpXS5vdXRwdXRfc3VyZmFjZTsKLSAgICAgICAgcGljX3BhcmFtcy5jb21wbGV0aW9uRXZlbnQgPSAwOworICAgICAgICBwaWNfcGFyYW1zLmlucHV0QnVmZmVyID0gaW5fc3VyZi0+aW5wdXRfc3VyZmFjZTsKKyAgICAgICAgcGljX3BhcmFtcy5idWZmZXJGbXQgPSBpbl9zdXJmLT5mb3JtYXQ7CisgICAgICAgIHBpY19wYXJhbXMuaW5wdXRXaWR0aCA9IGluX3N1cmYtPndpZHRoOworICAgICAgICBwaWNfcGFyYW1zLmlucHV0SGVpZ2h0ID0gaW5fc3VyZi0+aGVpZ2h0OworICAgICAgICBwaWNfcGFyYW1zLmlucHV0UGl0Y2ggPSBpbl9zdXJmLT5waXRjaDsKKyAgICAgICAgcGljX3BhcmFtcy5vdXRwdXRCaXRzdHJlYW0gPSBpbl9zdXJmLT5vdXRwdXRfc3VyZmFjZTsKIAogICAgICAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCkgewotICAgICAgICAgICAgaWYgKGZyYW1lLT50b3BfZmllbGRfZmlyc3QpIHsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0KQogICAgICAgICAgICAgICAgIHBpY19wYXJhbXMucGljdHVyZVN0cnVjdCA9IE5WX0VOQ19QSUNfU1RSVUNUX0ZJRUxEX1RPUF9CT1RUT007Ci0gICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHBpY19wYXJhbXMucGljdHVyZVN0cnVjdCA9IE5WX0VOQ19QSUNfU1RSVUNUX0ZJRUxEX0JPVFRPTV9UT1A7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBwaWNfcGFyYW1zLnBpY3R1cmVTdHJ1Y3QgPSBOVl9FTkNfUElDX1NUUlVDVF9GUkFNRTsKICAgICAgICAgfQogCi0gICAgICAgIHBpY19wYXJhbXMuZW5jb2RlUGljRmxhZ3MgPSAwOwotICAgICAgICBwaWNfcGFyYW1zLmlucHV0VGltZVN0YW1wID0gZnJhbWUtPnB0czsKLSAgICAgICAgcGljX3BhcmFtcy5pbnB1dER1cmF0aW9uID0gMDsKLSAgICAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWMtPmlkKSB7Ci0gICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKLSAgICAgICAgICBwaWNfcGFyYW1zLmNvZGVjUGljUGFyYW1zLmgyNjRQaWNQYXJhbXMuc2xpY2VNb2RlID0gY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuc2xpY2VNb2RlOwotICAgICAgICAgIHBpY19wYXJhbXMuY29kZWNQaWNQYXJhbXMuaDI2NFBpY1BhcmFtcy5zbGljZU1vZGVEYXRhID0gY3R4LT5lbmNvZGVfY29uZmlnLmVuY29kZUNvZGVjQ29uZmlnLmgyNjRDb25maWcuc2xpY2VNb2RlRGF0YTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY1OgotICAgICAgICAgIHBpY19wYXJhbXMuY29kZWNQaWNQYXJhbXMuaGV2Y1BpY1BhcmFtcy5zbGljZU1vZGUgPSBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaGV2Y0NvbmZpZy5zbGljZU1vZGU7Ci0gICAgICAgICAgcGljX3BhcmFtcy5jb2RlY1BpY1BhcmFtcy5oZXZjUGljUGFyYW1zLnNsaWNlTW9kZURhdGEgPSBjdHgtPmVuY29kZV9jb25maWcuZW5jb2RlQ29kZWNDb25maWcuaGV2Y0NvbmZpZy5zbGljZU1vZGVEYXRhOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb2RlYyBuYW1lXG4iKTsKLSAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBpZiAoY3R4LT5mb3JjZWRfaWRyID49IDAgJiYgZnJhbWUtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICAgICAgcGljX3BhcmFtcy5lbmNvZGVQaWNGbGFncyA9CisgICAgICAgICAgICAgICAgY3R4LT5mb3JjZWRfaWRyID8gTlZfRU5DX1BJQ19GTEFHX0ZPUkNFSURSIDogTlZfRU5DX1BJQ19GTEFHX0ZPUkNFSU5UUkE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwaWNfcGFyYW1zLmVuY29kZVBpY0ZsYWdzID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIHJlcyA9IHRpbWVzdGFtcF9xdWV1ZV9lbnF1ZXVlKCZjdHgtPnRpbWVzdGFtcF9saXN0LCBmcmFtZS0+cHRzKTsKKyAgICAgICAgcGljX3BhcmFtcy5pbnB1dFRpbWVTdGFtcCA9IGZyYW1lLT5wdHM7CiAKLSAgICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIG52ZW5jX2NvZGVjX3NwZWNpZmljX3BpY19wYXJhbXMoYXZjdHgsICZwaWNfcGFyYW1zKTsKICAgICB9IGVsc2UgewogICAgICAgICBwaWNfcGFyYW1zLmVuY29kZVBpY0ZsYWdzID0gTlZfRU5DX1BJQ19GTEFHX0VPUzsKKyAgICAgICAgY3R4LT5lbmNvZGVyX2ZsdXNoaW5nID0gMTsKICAgICB9CiAKKyAgICByZXMgPSBudmVuY19wdXNoX2NvbnRleHQoYXZjdHgpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCiAgICAgbnZfc3RhdHVzID0gcF9udmVuYy0+bnZFbmNFbmNvZGVQaWN0dXJlKGN0eC0+bnZlbmNvZGVyLCAmcGljX3BhcmFtcyk7CiAKLSAgICBpZiAoZnJhbWUgJiYgbnZfc3RhdHVzID09IE5WX0VOQ19FUlJfTkVFRF9NT1JFX0lOUFVUKSB7Ci0gICAgICAgIHJlcyA9IG91dF9zdXJmX3F1ZXVlX2VucXVldWUoJmN0eC0+b3V0cHV0X3N1cmZhY2VfcXVldWUsICZjdHgtPm91dHB1dF9zdXJmYWNlc1tpXSk7CisgICAgcmVzID0gbnZlbmNfcG9wX2NvbnRleHQoYXZjdHgpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOwogCi0gICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICByZXR1cm4gcmVzOworICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX1NVQ0NFU1MgJiYKKyAgICAgICAgbnZfc3RhdHVzICE9IE5WX0VOQ19FUlJfTkVFRF9NT1JFX0lOUFVUKQorICAgICAgICByZXR1cm4gbnZlbmNfcHJpbnRfZXJyb3IoYXZjdHgsIG52X3N0YXR1cywgIkVuY29kZVBpY3R1cmUgZmFpbGVkISIpOwogCi0gICAgICAgIGN0eC0+b3V0cHV0X3N1cmZhY2VzW2ldLmJ1c3kgPSAxOworICAgIGlmIChmcmFtZSkgeworICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoY3R4LT5vdXRwdXRfc3VyZmFjZV9xdWV1ZSwgJmluX3N1cmYsIHNpemVvZihpbl9zdXJmKSwgTlVMTCk7CisgICAgICAgIHRpbWVzdGFtcF9xdWV1ZV9lbnF1ZXVlKGN0eC0+dGltZXN0YW1wX2xpc3QsIGZyYW1lLT5wdHMpOworCisgICAgICAgIGlmIChjdHgtPmluaXRpYWxfcHRzWzBdID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgY3R4LT5pbml0aWFsX3B0c1swXSA9IGZyYW1lLT5wdHM7CisgICAgICAgIGVsc2UgaWYgKGN0eC0+aW5pdGlhbF9wdHNbMV0gPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBjdHgtPmluaXRpYWxfcHRzWzFdID0gZnJhbWUtPnB0czsKICAgICB9CiAKLSAgICBpZiAobnZfc3RhdHVzICE9IE5WX0VOQ19TVUNDRVNTICYmIG52X3N0YXR1cyAhPSBOVl9FTkNfRVJSX05FRURfTU9SRV9JTlBVVCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVuY29kZVBpY3R1cmUgZmFpbGVkIVxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwotICAgIH0KLQotICAgIGlmIChudl9zdGF0dXMgIT0gTlZfRU5DX0VSUl9ORUVEX01PUkVfSU5QVVQpIHsKLSAgICAgICAgd2hpbGUgKGN0eC0+b3V0cHV0X3N1cmZhY2VfcXVldWUuY291bnQpIHsKLSAgICAgICAgICAgIHRtcG91dHN1cmYgPSBvdXRfc3VyZl9xdWV1ZV9kZXF1ZXVlKCZjdHgtPm91dHB1dF9zdXJmYWNlX3F1ZXVlKTsKLSAgICAgICAgICAgIHJlcyA9IG91dF9zdXJmX3F1ZXVlX2VucXVldWUoJmN0eC0+b3V0cHV0X3N1cmZhY2VfcmVhZHlfcXVldWUsIHRtcG91dHN1cmYpOwotCi0gICAgICAgICAgICBpZiAocmVzKQotICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgLyogYWxsIHRoZSBwZW5kaW5nIGJ1ZmZlcnMgYXJlIG5vdyByZWFkeSBmb3Igb3V0cHV0ICovCisgICAgaWYgKG52X3N0YXR1cyA9PSBOVl9FTkNfU1VDQ0VTUykgeworICAgICAgICB3aGlsZSAoYXZfZmlmb19zaXplKGN0eC0+b3V0cHV0X3N1cmZhY2VfcXVldWUpID4gMCkgeworICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQoY3R4LT5vdXRwdXRfc3VyZmFjZV9xdWV1ZSwgJnRtcF9vdXRfc3VyZiwgc2l6ZW9mKHRtcF9vdXRfc3VyZiksIE5VTEwpOworICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGN0eC0+b3V0cHV0X3N1cmZhY2VfcmVhZHlfcXVldWUsICZ0bXBfb3V0X3N1cmYsIHNpemVvZih0bXBfb3V0X3N1cmYpLCBOVUxMKTsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChmcmFtZSkgewotICAgICAgICAgICAgcmVzID0gb3V0X3N1cmZfcXVldWVfZW5xdWV1ZSgmY3R4LT5vdXRwdXRfc3VyZmFjZV9yZWFkeV9xdWV1ZSwgJmN0eC0+b3V0cHV0X3N1cmZhY2VzW2ldKTsKLQotICAgICAgICAgICAgaWYgKHJlcykKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwotCi0gICAgICAgICAgICBjdHgtPm91dHB1dF9zdXJmYWNlc1tpXS5idXN5ID0gMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChjdHgtPm91dHB1dF9zdXJmYWNlX3JlYWR5X3F1ZXVlLmNvdW50ICYmICghZnJhbWUgfHwgY3R4LT5vdXRwdXRfc3VyZmFjZV9yZWFkeV9xdWV1ZS5jb3VudCArIGN0eC0+b3V0cHV0X3N1cmZhY2VfcXVldWUuY291bnQgPj0gY3R4LT5idWZmZXJfZGVsYXkpKSB7Ci0gICAgICAgIHRtcG91dHN1cmYgPSBvdXRfc3VyZl9xdWV1ZV9kZXF1ZXVlKCZjdHgtPm91dHB1dF9zdXJmYWNlX3JlYWR5X3F1ZXVlKTsKLQotICAgICAgICByZXMgPSBwcm9jZXNzX291dHB1dF9zdXJmYWNlKGF2Y3R4LCBwa3QsIHRtcG91dHN1cmYpOwotCi0gICAgICAgIGlmIChyZXMpCi0gICAgICAgICAgICByZXR1cm4gcmVzOwotCi0gICAgICAgIHRtcG91dHN1cmYtPmJ1c3kgPSAwOwotICAgICAgICBhdl9hc3NlcnQwKHRtcG91dHN1cmYtPmlucHV0X3N1cmZhY2UtPmxvY2tDb3VudCk7Ci0gICAgICAgIHRtcG91dHN1cmYtPmlucHV0X3N1cmZhY2UtPmxvY2tDb3VudC0tOwotCi0gICAgICAgICpnb3RfcGFja2V0ID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICAqZ290X3BhY2tldCA9IDA7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNfbnZlbmNbXSA9IHsKLSAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCi0gICAgQVZfUElYX0ZNVF9OVjEyLAotICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKLSAgICBBVl9QSVhfRk1UX05PTkUKLX07CitpbnQgZmZfbnZlbmNfcmVjZWl2ZV9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIE52ZW5jU3VyZmFjZSAqdG1wX291dF9zdXJmOworICAgIGludCByZXMsIHJlczI7CiAKLSNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE52ZW5jQ29udGV4dCwgeCkKLSNkZWZpbmUgVkUgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQotc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKLSAgICB7ICJwcmVzZXQiLCAiU2V0IHRoZSBlbmNvZGluZyBwcmVzZXQgKG9uZSBvZiBzbG93ID0gaHEgMnBhc3MsIG1lZGl1bSA9IGhxLCBmYXN0ID0gaHAsIGhxLCBocCwgYmQsIGxsLCBsbGhxLCBsbGhwLCBkZWZhdWx0KSIsIE9GRlNFVChwcmVzZXQpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJtZWRpdW0iIH0sIDAsIDAsIFZFIH0sCi0gICAgeyAicHJvZmlsZSIsICJTZXQgdGhlIGVuY29kaW5nIHByb2ZpbGUgKGhpZ2gsIG1haW4sIGJhc2VsaW5lIG9yIGhpZ2g0NDRwKSIsIE9GRlNFVChwcm9maWxlKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAibWFpbiIgfSwgMCwgMCwgVkUgfSwKLSAgICB7ICJsZXZlbCIsICJTZXQgdGhlIGVuY29kaW5nIGxldmVsIHJlc3RyaWN0aW9uIChhdXRvLCAxLjAsIDEuMGIsIDEuMSwgMS4yLCAuLi4sIDQuMiwgNS4wLCA1LjEpIiwgT0ZGU0VUKGxldmVsKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiYXV0byIgfSwgMCwgMCwgVkUgfSwKLSAgICB7ICJ0aWVyIiwgIlNldCB0aGUgZW5jb2RpbmcgdGllciAobWFpbiBvciBoaWdoKSIsIE9GRlNFVCh0aWVyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAibWFpbiIgfSwgMCwgMCwgVkUgfSwKLSAgICB7ICJjYnIiLCAiVXNlIGNiciBlbmNvZGluZyBtb2RlIiwgT0ZGU0VUKGNiciksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKLSAgICB7ICIycGFzcyIsICJVc2UgMnBhc3MgZW5jb2RpbmcgbW9kZSIsIE9GRlNFVCh0d29wYXNzKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZFIH0sCi0gICAgeyAiZ3B1IiwgIlNlbGVjdHMgd2hpY2ggTlZFTkMgY2FwYWJsZSBHUFUgdG8gdXNlLiBGaXJzdCBHUFUgaXMgMCwgc2Vjb25kIGlzIDEsIGFuZCBzbyBvbi4iLCBPRkZTRVQoZ3B1KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIFZFIH0sCi0gICAgeyAiZGVsYXkiLCAiRGVsYXlzIGZyYW1lIG91dHB1dCBieSB0aGUgZ2l2ZW4gYW1vdW50IG9mIGZyYW1lcy4iLCBPRkZTRVQoYnVmZmVyX2RlbGF5KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBJTlRfTUFYIH0sIDAsIElOVF9NQVgsIFZFIH0sCi0gICAgeyBOVUxMIH0KLX07CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogCi1zdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgbnZlbmNfZGVmYXVsdHNbXSA9IHsKLSAgICB7ICJiIiwgIjJNIiB9LAotICAgIHsgInFtaW4iLCAiLTEiIH0sCi0gICAgeyAicW1heCIsICItMSIgfSwKLSAgICB7ICJxZGlmZiIsICItMSIgfSwKLSAgICB7ICJxYmx1ciIsICItMSIgfSwKLSAgICB7ICJxY29tcCIsICItMSIgfSwKLSAgICB7ICJnIiwgIjI1MCIgfSwKLSAgICB7ICJiZiIsICIwIiB9LAotICAgIHsgTlVMTCB9LAotfTsKKyAgICBpZiAoKCFjdHgtPmN1X2NvbnRleHQgJiYgIWN0eC0+ZDNkMTFfZGV2aWNlKSB8fCAhY3R4LT5udmVuY29kZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAKLSNpZiBDT05GSUdfTlZFTkNfRU5DT0RFUgotc3RhdGljIGNvbnN0IEFWQ2xhc3MgbnZlbmNfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAibnZlbmMiLAotICAgIC5pdGVtX25hbWUgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKLSAgICAub3B0aW9uID0gb3B0aW9ucywKLSAgICAudmVyc2lvbiA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLX07CisgICAgaWYgKG91dHB1dF9yZWFkeShhdmN0eCwgY3R4LT5lbmNvZGVyX2ZsdXNoaW5nKSkgeworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChjdHgtPm91dHB1dF9zdXJmYWNlX3JlYWR5X3F1ZXVlLCAmdG1wX291dF9zdXJmLCBzaXplb2YodG1wX291dF9zdXJmKSwgTlVMTCk7CiAKLUFWQ29kZWMgZmZfbnZlbmNfZW5jb2RlciA9IHsKLSAgICAubmFtZSA9ICJudmVuYyIsCi0gICAgLmxvbmdfbmFtZSA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJOVklESUEgTlZFTkMgaDI2NCBlbmNvZGVyIiksCi0gICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkID0gQVZfQ09ERUNfSURfSDI2NCwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTnZlbmNDb250ZXh0KSwKLSAgICAuaW5pdCA9IG52ZW5jX2VuY29kZV9pbml0LAotICAgIC5lbmNvZGUyID0gbnZlbmNfZW5jb2RlX2ZyYW1lLAotICAgIC5jbG9zZSA9IG52ZW5jX2VuY29kZV9jbG9zZSwKLSAgICAuY2FwYWJpbGl0aWVzID0gQVZfQ09ERUNfQ0FQX0RFTEFZLAotICAgIC5wcml2X2NsYXNzID0gJm52ZW5jX2NsYXNzLAotICAgIC5kZWZhdWx0cyA9IG52ZW5jX2RlZmF1bHRzLAotICAgIC5waXhfZm10cyA9IHBpeF9mbXRzX252ZW5jLAotfTsKLSNlbmRpZgorICAgICAgICByZXMgPSBudmVuY19wdXNoX2NvbnRleHQoYXZjdHgpOworICAgICAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAKLS8qIEFkZCBhbiBhbGlhcyBmb3IgbnZlbmNfaDI2NCAqLwotI2lmIENPTkZJR19OVkVOQ19IMjY0X0VOQ09ERVIKLXN0YXRpYyBjb25zdCBBVkNsYXNzIG52ZW5jX2gyNjRfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAibnZlbmNfaDI2NCIsCi0gICAgLml0ZW1fbmFtZSA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gPSBvcHRpb25zLAotICAgIC52ZXJzaW9uID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAotfTsKKyAgICAgICAgcmVzID0gcHJvY2Vzc19vdXRwdXRfc3VyZmFjZShhdmN0eCwgcGt0LCB0bXBfb3V0X3N1cmYpOwogCi1BVkNvZGVjIGZmX252ZW5jX2gyNjRfZW5jb2RlciA9IHsKLSAgICAubmFtZSA9ICJudmVuY19oMjY0IiwKLSAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5WSURJQSBOVkVOQyBoMjY0IGVuY29kZXIiKSwKLSAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgPSBBVl9DT0RFQ19JRF9IMjY0LAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihOdmVuY0NvbnRleHQpLAotICAgIC5pbml0ID0gbnZlbmNfZW5jb2RlX2luaXQsCi0gICAgLmVuY29kZTIgPSBudmVuY19lbmNvZGVfZnJhbWUsCi0gICAgLmNsb3NlID0gbnZlbmNfZW5jb2RlX2Nsb3NlLAotICAgIC5jYXBhYmlsaXRpZXMgPSBBVl9DT0RFQ19DQVBfREVMQVksCi0gICAgLnByaXZfY2xhc3MgPSAmbnZlbmNfaDI2NF9jbGFzcywKLSAgICAuZGVmYXVsdHMgPSBudmVuY19kZWZhdWx0cywKLSAgICAucGl4X2ZtdHMgPSBwaXhfZm10c19udmVuYywKLX07Ci0jZW5kaWYKKyAgICAgICAgcmVzMiA9IG52ZW5jX3BvcF9jb250ZXh0KGF2Y3R4KTsKKyAgICAgICAgaWYgKHJlczIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczI7CiAKLSNpZiBDT05GSUdfTlZFTkNfSEVWQ19FTkNPREVSCi1zdGF0aWMgY29uc3QgQVZDbGFzcyBudmVuY19oZXZjX2NsYXNzID0gewotICAgIC5jbGFzc19uYW1lID0gIm52ZW5jX2hldmMiLAotICAgIC5pdGVtX25hbWUgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKLSAgICAub3B0aW9uID0gb3B0aW9ucywKLSAgICAudmVyc2lvbiA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLX07CisgICAgICAgIGlmIChyZXMpCisgICAgICAgICAgICByZXR1cm4gcmVzOwogCi1BVkNvZGVjIGZmX252ZW5jX2hldmNfZW5jb2RlciA9IHsKLSAgICAubmFtZSA9ICJudmVuY19oZXZjIiwKLSAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5WSURJQSBOVkVOQyBoZXZjIGVuY29kZXIiKSwKLSAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgPSBBVl9DT0RFQ19JRF9IMjY1LAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihOdmVuY0NvbnRleHQpLAotICAgIC5pbml0ID0gbnZlbmNfZW5jb2RlX2luaXQsCi0gICAgLmVuY29kZTIgPSBudmVuY19lbmNvZGVfZnJhbWUsCi0gICAgLmNsb3NlID0gbnZlbmNfZW5jb2RlX2Nsb3NlLAotICAgIC5jYXBhYmlsaXRpZXMgPSBBVl9DT0RFQ19DQVBfREVMQVksCi0gICAgLnByaXZfY2xhc3MgPSAmbnZlbmNfaGV2Y19jbGFzcywKLSAgICAuZGVmYXVsdHMgPSBudmVuY19kZWZhdWx0cywKLSAgICAucGl4X2ZtdHMgPSBwaXhfZm10c19udmVuYywKLX07Ci0jZW5kaWYKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGN0eC0+dW51c2VkX3N1cmZhY2VfcXVldWUsICZ0bXBfb3V0X3N1cmYsIHNpemVvZih0bXBfb3V0X3N1cmYpLCBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKGN0eC0+ZW5jb2Rlcl9mbHVzaGluZykgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX252ZW5jX2VuY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgTnZlbmNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXM7CisKKyAgICBpZiAoIWN0eC0+ZW5jb2Rlcl9mbHVzaGluZykgeworICAgICAgICByZXMgPSBmZl9udmVuY19zZW5kX2ZyYW1lKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBmZl9udmVuY19yZWNlaXZlX3BhY2tldChhdmN0eCwgcGt0KTsKKyAgICBpZiAocmVzID09IEFWRVJST1IoRUFHQUlOKSB8fCByZXMgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgKmdvdF9wYWNrZXQgPSAwOworICAgIH0gZWxzZSBpZiAocmVzIDwgMCkgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvbnZlbmMuaCBiL2xpYmF2Y29kZWMvbnZlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzUwNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9udmVuYy5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19OVkVOQ19ICisjZGVmaW5lIEFWQ09ERUNfTlZFTkNfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBDT05GSUdfRDNEMTFWQQorI2RlZmluZSBDT0JKTUFDUk9TCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmgiCisjZWxzZQordHlwZWRlZiB2b2lkIElEM0QxMURldmljZTsKKyNlbmRpZgorCisjaW5jbHVkZSA8ZmZudmNvZGVjL252RW5jb2RlQVBJLmg+CisKKyNpbmNsdWRlICJjb21wYXQvY3VkYS9keW5saW5rX2xvYWRlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorCisjZGVmaW5lIE1BWF9SRUdJU1RFUkVEX0ZSQU1FUyA2NAorI2RlZmluZSBSQ19NT0RFX0RFUFJFQ0FURUQgMHg4MDAwMDAKKyNkZWZpbmUgUkNEKHJjX21vZGUpICgocmNfbW9kZSkgfCBSQ19NT0RFX0RFUFJFQ0FURUQpCisKKyNkZWZpbmUgTlZFTkNBUElfQ0hFQ0tfVkVSU0lPTihtYWpvciwgbWlub3IpIFwKKyAgICAoKG1ham9yKSA8IE5WRU5DQVBJX01BSk9SX1ZFUlNJT04gfHwgKChtYWpvcikgPT0gTlZFTkNBUElfTUFKT1JfVkVSU0lPTiAmJiAobWlub3IpIDw9IE5WRU5DQVBJX01JTk9SX1ZFUlNJT04pKQorCisvLyBTREsgOC4xIGNvbXBpbGUgdGltZSBmZWF0dXJlIGNoZWNrcworI2lmIE5WRU5DQVBJX0NIRUNLX1ZFUlNJT04oOCwgMSkKKyNkZWZpbmUgTlZFTkNfSEFWRV9CRlJBTUVfUkVGX01PREUKKyNkZWZpbmUgTlZFTkNfSEFWRV9RUF9NQVBfTU9ERQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IE52ZW5jU3VyZmFjZQoreworICAgIE5WX0VOQ19JTlBVVF9QVFIgaW5wdXRfc3VyZmFjZTsKKyAgICBBVkZyYW1lICppbl9yZWY7CisgICAgaW50IHJlZ19pZHg7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHBpdGNoOworCisgICAgTlZfRU5DX09VVFBVVF9QVFIgb3V0cHV0X3N1cmZhY2U7CisgICAgTlZfRU5DX0JVRkZFUl9GT1JNQVQgZm9ybWF0OworICAgIGludCBzaXplOworfSBOdmVuY1N1cmZhY2U7CisKK3R5cGVkZWYgc3RydWN0IE52ZW5jRHluTG9hZEZ1bmN0aW9ucworeworICAgIEN1ZGFGdW5jdGlvbnMgKmN1ZGFfZGw7CisgICAgTnZlbmNGdW5jdGlvbnMgKm52ZW5jX2RsOworCisgICAgTlZfRU5DT0RFX0FQSV9GVU5DVElPTl9MSVNUIG52ZW5jX2Z1bmNzOworICAgIGludCBudmVuY19kZXZpY2VfY291bnQ7Cit9IE52ZW5jRHluTG9hZEZ1bmN0aW9uczsKKworZW51bSB7CisgICAgUFJFU0VUX0RFRkFVTFQgPSAwLAorICAgIFBSRVNFVF9TTE9XLAorICAgIFBSRVNFVF9NRURJVU0sCisgICAgUFJFU0VUX0ZBU1QsCisgICAgUFJFU0VUX0hQLAorICAgIFBSRVNFVF9IUSwKKyAgICBQUkVTRVRfQkQgLAorICAgIFBSRVNFVF9MT1dfTEFURU5DWV9ERUZBVUxUICwKKyAgICBQUkVTRVRfTE9XX0xBVEVOQ1lfSFEgLAorICAgIFBSRVNFVF9MT1dfTEFURU5DWV9IUCwKKyAgICBQUkVTRVRfTE9TU0xFU1NfREVGQVVMVCwgLy8gbG9zc2xlc3MgcHJlc2V0cyBtdXN0IGJlIHRoZSBsYXN0IG9uZXMKKyAgICBQUkVTRVRfTE9TU0xFU1NfSFAsCit9OworCitlbnVtIHsKKyAgICBOVl9FTkNfSDI2NF9QUk9GSUxFX0JBU0VMSU5FLAorICAgIE5WX0VOQ19IMjY0X1BST0ZJTEVfTUFJTiwKKyAgICBOVl9FTkNfSDI2NF9QUk9GSUxFX0hJR0gsCisgICAgTlZfRU5DX0gyNjRfUFJPRklMRV9ISUdIXzQ0NFAsCit9OworCitlbnVtIHsKKyAgICBOVl9FTkNfSEVWQ19QUk9GSUxFX01BSU4sCisgICAgTlZfRU5DX0hFVkNfUFJPRklMRV9NQUlOXzEwLAorICAgIE5WX0VOQ19IRVZDX1BST0ZJTEVfUkVYVCwKK307CisKK2VudW0geworICAgIE5WRU5DX0xPV0xBVEVOQ1kgPSAxLAorICAgIE5WRU5DX0xPU1NMRVNTICAgPSAyLAorICAgIE5WRU5DX09ORV9QQVNTICAgPSA0LAorICAgIE5WRU5DX1RXT19QQVNTRVMgPSA4LAorfTsKKworZW51bSB7CisgICAgTElTVF9ERVZJQ0VTID0gLTIsCisgICAgQU5ZX0RFVklDRSwKK307CisKK3R5cGVkZWYgc3RydWN0IE52ZW5jQ29udGV4dAoreworICAgIEFWQ2xhc3MgKmF2Y2xhc3M7CisKKyAgICBOdmVuY0R5bkxvYWRGdW5jdGlvbnMgbnZlbmNfZGxvYWRfZnVuY3M7CisKKyAgICBOVl9FTkNfSU5JVElBTElaRV9QQVJBTVMgaW5pdF9lbmNvZGVfcGFyYW1zOworICAgIE5WX0VOQ19DT05GSUcgZW5jb2RlX2NvbmZpZzsKKyAgICBDVWNvbnRleHQgY3VfY29udGV4dDsKKyAgICBDVWNvbnRleHQgY3VfY29udGV4dF9pbnRlcm5hbDsKKyAgICBJRDNEMTFEZXZpY2UgKmQzZDExX2RldmljZTsKKworICAgIGludCBuYl9zdXJmYWNlczsKKyAgICBOdmVuY1N1cmZhY2UgKnN1cmZhY2VzOworCisgICAgQVZGaWZvQnVmZmVyICp1bnVzZWRfc3VyZmFjZV9xdWV1ZTsKKyAgICBBVkZpZm9CdWZmZXIgKm91dHB1dF9zdXJmYWNlX3F1ZXVlOworICAgIEFWRmlmb0J1ZmZlciAqb3V0cHV0X3N1cmZhY2VfcmVhZHlfcXVldWU7CisgICAgQVZGaWZvQnVmZmVyICp0aW1lc3RhbXBfbGlzdDsKKworICAgIGludCBlbmNvZGVyX2ZsdXNoaW5nOworCisgICAgc3RydWN0IHsKKyAgICAgICAgdm9pZCAqcHRyOworICAgICAgICBpbnQgcHRyX2luZGV4OworICAgICAgICBOVl9FTkNfUkVHSVNURVJFRF9QVFIgcmVncHRyOworICAgICAgICBpbnQgbWFwcGVkOworICAgICAgICBOVl9FTkNfTUFQX0lOUFVUX1JFU09VUkNFIGluX21hcDsKKyAgICB9IHJlZ2lzdGVyZWRfZnJhbWVzW01BWF9SRUdJU1RFUkVEX0ZSQU1FU107CisgICAgaW50IG5iX3JlZ2lzdGVyZWRfZnJhbWVzOworCisgICAgLyogdGhlIGFjdHVhbCBkYXRhIHBpeGVsIGZvcm1hdCwgZGlmZmVyZW50IGZyb20KKyAgICAgKiBBVkNvZGVjQ29udGV4dC5waXhfZm10IHdoZW4gdXNpbmcgaHdhY2NlbCBmcmFtZXMgb24gaW5wdXQgKi8KKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZGF0YV9waXhfZm10OworCisgICAgLyogdGltZXN0YW1wcyBvZiB0aGUgZmlyc3QgdHdvIGZyYW1lcywgZm9yIGNvbXB1dGluZyB0aGUgZmlyc3QgZHRzCisgICAgICogd2hlbiBCLWZyYW1lcyBhcmUgcHJlc2VudCAqLworICAgIGludDY0X3QgaW5pdGlhbF9wdHNbMl07CisgICAgaW50IGZpcnN0X3BhY2tldF9vdXRwdXQ7CisKKyAgICB2b2lkICpudmVuY29kZXI7CisKKyAgICBpbnQgcHJlc2V0OworICAgIGludCBwcm9maWxlOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgdGllcjsKKyAgICBpbnQgcmM7CisgICAgaW50IGNicjsKKyAgICBpbnQgdHdvcGFzczsKKyAgICBpbnQgZGV2aWNlOworICAgIGludCBmbGFnczsKKyAgICBpbnQgYXN5bmNfZGVwdGg7CisgICAgaW50IHJjX2xvb2thaGVhZDsKKyAgICBpbnQgYXE7CisgICAgaW50IG5vX3NjZW5lY3V0OworICAgIGludCBmb3JjZWRfaWRyOworICAgIGludCBiX2FkYXB0OworICAgIGludCB0ZW1wb3JhbF9hcTsKKyAgICBpbnQgemVyb2xhdGVuY3k7CisgICAgaW50IG5vbnJlZl9wOworICAgIGludCBzdHJpY3RfZ29wOworICAgIGludCBhcV9zdHJlbmd0aDsKKyAgICBmbG9hdCBxdWFsaXR5OworICAgIGludCBhdWQ7CisgICAgaW50IGJsdXJheV9jb21wYXQ7CisgICAgaW50IGluaXRfcXBfcDsKKyAgICBpbnQgaW5pdF9xcF9iOworICAgIGludCBpbml0X3FwX2k7CisgICAgaW50IGNxcDsKKyAgICBpbnQgd2VpZ2h0ZWRfcHJlZDsKKyAgICBpbnQgY29kZXI7CisgICAgaW50IGJfcmVmX21vZGU7Cit9IE52ZW5jQ29udGV4dDsKKworaW50IGZmX252ZW5jX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl9udmVuY19lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKworaW50IGZmX252ZW5jX3NlbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpmcmFtZSk7CisKK2ludCBmZl9udmVuY19yZWNlaXZlX3BhY2tldChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpOworCitpbnQgZmZfbnZlbmNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldCk7CisKK2V4dGVybiBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfbnZlbmNfcGl4X2ZtdHNbXTsKKworI2VuZGlmIC8qIEFWQ09ERUNfTlZFTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9udmVuY19oMjY0LmMgYi9saWJhdmNvZGVjL252ZW5jX2gyNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ2ZjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9udmVuY19oMjY0LmMKQEAgLTAsMCArMSwyNDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJudmVuYy5oIgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihOdmVuY0NvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicHJlc2V0IiwgICAgICAgIlNldCB0aGUgZW5jb2RpbmcgcHJlc2V0IiwgICAgICAgICAgICBPRkZTRVQocHJlc2V0KSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IFBSRVNFVF9NRURJVU0gfSwgUFJFU0VUX0RFRkFVTFQsIFBSRVNFVF9MT1NTTEVTU19IUCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiZGVmYXVsdCIsICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRVNFVF9ERUZBVUxUIH0sICAgICAgICAgICAgIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgInNsb3ciLCAgICAgICAgICJocSAyIHBhc3NlcyIsICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVTRVRfU0xPVyB9LCAgICAgICAgICAgICAgICAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJtZWRpdW0iLCAgICAgICAiaHEgMSBwYXNzIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFU0VUX01FRElVTSB9LCAgICAgICAgICAgICAgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiZmFzdCIsICAgICAgICAgImhwIDEgcGFzcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRVNFVF9GQVNUIH0sICAgICAgICAgICAgICAgIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgImhwIiwgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVTRVRfSFAgfSwgICAgICAgICAgICAgICAgICAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJocSIsICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFU0VUX0hRIH0sICAgICAgICAgICAgICAgICAgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiYmQiLCAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRVNFVF9CRCB9LCAgICAgICAgICAgICAgICAgIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgImxsIiwgICAgICAgICAgICJsb3cgbGF0ZW5jeSIsICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVTRVRfTE9XX0xBVEVOQ1lfREVGQVVMVCB9LCAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJsbGhxIiwgICAgICAgICAibG93IGxhdGVuY3kgaHEiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFU0VUX0xPV19MQVRFTkNZX0hRIH0sICAgICAgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAibGxocCIsICAgICAgICAgImxvdyBsYXRlbmN5IGhwIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRVNFVF9MT1dfTEFURU5DWV9IUCB9LCAgICAgIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgImxvc3NsZXNzIiwgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVTRVRfTE9TU0xFU1NfREVGQVVMVCB9LCAgICAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJsb3NzbGVzc2hwIiwgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFU0VUX0xPU1NMRVNTX0hQIH0sICAgICAgICAgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAicHJvZmlsZSIsICAgICAgIlNldCB0aGUgZW5jb2RpbmcgcHJvZmlsZSIsICAgICAgICAgICBPRkZTRVQocHJvZmlsZSksICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IE5WX0VOQ19IMjY0X1BST0ZJTEVfTUFJTiB9LCBOVl9FTkNfSDI2NF9QUk9GSUxFX0JBU0VMSU5FLCBOVl9FTkNfSDI2NF9QUk9GSUxFX0hJR0hfNDQ0UCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImJhc2VsaW5lIiwgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfSDI2NF9QUk9GSUxFX0JBU0VMSU5FIH0sICAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAibWFpbiIsICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19IMjY0X1BST0ZJTEVfTUFJTiB9LCAgICAgIDAsIDAsIFZFLCAicHJvZmlsZSIgfSwKKyAgICB7ICJoaWdoIiwgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0gyNjRfUFJPRklMRV9ISUdIIH0sICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImhpZ2g0NDRwIiwgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfSDI2NF9QUk9GSUxFX0hJR0hfNDQ0UCB9LCAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAibGV2ZWwiLCAgICAgICAgIlNldCB0aGUgZW5jb2RpbmcgbGV2ZWwgcmVzdHJpY3Rpb24iLCBPRkZTRVQobGV2ZWwpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IE5WX0VOQ19MRVZFTF9BVVRPU0VMRUNUIH0sIE5WX0VOQ19MRVZFTF9BVVRPU0VMRUNULCBOVl9FTkNfTEVWRUxfSDI2NF81MSwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICJhdXRvIiwgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0FVVE9TRUxFQ1QgfSwgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIxIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMSB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIxLjAiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMSB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIxYiIsICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMWIgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIxLjBiIiwgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMWIgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIxLjEiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMTEgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIxLjIiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMTIgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIxLjMiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMTMgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIyIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMiB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIyLjAiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMiB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIyLjEiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMjEgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIyLjIiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMjIgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIzIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMyB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIzLjAiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMyB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIzLjEiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMzEgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIzLjIiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfMzIgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI0IiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfNCB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI0LjAiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfNCB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI0LjEiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfNDEgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI0LjIiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfNDIgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI1IiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfNSB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI1LjAiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfNSB9LCAgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI1LjEiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0gyNjRfNTEgfSwgICAgICAgMCwgMCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICJyYyIsICAgICAgICAgICAiT3ZlcnJpZGUgdGhlIHByZXNldCByYXRlLWNvbnRyb2wiLCAgIE9GRlNFVChyYyksICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gLTEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIElOVF9NQVgsIFZFLCAicmMiIH0sCisgICAgeyAiY29uc3RxcCIsICAgICAgIkNvbnN0YW50IFFQIG1vZGUiLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19QQVJBTVNfUkNfQ09OU1RRUCB9LCAgICAgICAgICAgICAgICAgICAwLCAwLCBWRSwgInJjIiB9LAorICAgIHsgInZiciIsICAgICAgICAgICJWYXJpYWJsZSBiaXRyYXRlIG1vZGUiLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfUEFSQU1TX1JDX1ZCUiB9LCAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJjYnIiLCAgICAgICAgICAiQ29uc3RhbnQgYml0cmF0ZSBtb2RlIiwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX1BBUkFNU19SQ19DQlIgfSwgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAidmJyX21pbnFwIiwgICAgIlZhcmlhYmxlIGJpdHJhdGUgbW9kZSB3aXRoIE1pblFQIChkZXByZWNhdGVkKSIsIDAsICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFJDRChOVl9FTkNfUEFSQU1TX1JDX1ZCUl9NSU5RUCkgfSwgICAgICAgICAgICAwLCAwLCBWRSwgInJjIiB9LAorICAgIHsgImxsXzJwYXNzX3F1YWxpdHkiLCAiTXVsdGktcGFzcyBvcHRpbWl6ZWQgZm9yIGltYWdlIHF1YWxpdHkgKGRlcHJlY2F0ZWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkNEKE5WX0VOQ19QQVJBTVNfUkNfMl9QQVNTX1FVQUxJVFkpIH0sICAgICAgIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAibGxfMnBhc3Nfc2l6ZSIsICJNdWx0aS1wYXNzIG9wdGltaXplZCBmb3IgY29uc3RhbnQgZnJhbWUgc2l6ZSAoZGVwcmVjYXRlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBSQ0QoTlZfRU5DX1BBUkFNU19SQ18yX1BBU1NfRlJBTUVTSVpFX0NBUCkgfSwgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJ2YnJfMnBhc3MiLCAgICAiTXVsdGktcGFzcyB2YXJpYWJsZSBiaXRyYXRlIG1vZGUgKGRlcHJlY2F0ZWQpIiwgMCwgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkNEKE5WX0VOQ19QQVJBTVNfUkNfMl9QQVNTX1ZCUikgfSwgICAgICAgICAgIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAiY2JyX2xkX2hxIiwgICAgIkNvbnN0YW50IGJpdHJhdGUgbG93IGRlbGF5IGhpZ2ggcXVhbGl0eSBtb2RlIiwgMCwgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19QQVJBTVNfUkNfQ0JSX0xPV0RFTEFZX0hRIH0sICAgICAgICAgICAwLCAwLCBWRSwgInJjIiB9LAorICAgIHsgImNicl9ocSIsICAgICAgICJDb25zdGFudCBiaXRyYXRlIGhpZ2ggcXVhbGl0eSBtb2RlIiwgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfUEFSQU1TX1JDX0NCUl9IUSB9LCAgICAgICAgICAgICAgICAgICAgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJ2YnJfaHEiLCAgICAgICAiVmFyaWFibGUgYml0cmF0ZSBoaWdoIHF1YWxpdHkgbW9kZSIsIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX1BBUkFNU19SQ19WQlJfSFEgfSwgICAgICAgICAgICAgICAgICAgIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAicmMtbG9va2FoZWFkIiwgIk51bWJlciBvZiBmcmFtZXMgdG8gbG9vayBhaGVhZCBmb3IgcmF0ZS1jb250cm9sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChyY19sb29rYWhlYWQpLCBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWRSB9LAorICAgIHsgInN1cmZhY2VzIiwgICAgICJOdW1iZXIgb2YgY29uY3VycmVudCBzdXJmYWNlcyIsICAgICAgT0ZGU0VUKG5iX3N1cmZhY2VzKSwgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sIDAsIE1BWF9SRUdJU1RFUkVEX0ZSQU1FUywgVkUgfSwKKyAgICB7ICJjYnIiLCAgICAgICAgICAiVXNlIGNiciBlbmNvZGluZyBtb2RlIiwgICAgICAgICAgICAgIE9GRlNFVChjYnIpLCAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAgIDAsIDEsIFZFIH0sCisgICAgeyAiMnBhc3MiLCAgICAgICAgIlVzZSAycGFzcyBlbmNvZGluZyBtb2RlIiwgICAgICAgICAgICBPRkZTRVQodHdvcGFzcyksICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IC0xIH0sIC0xLCAxLCBWRSB9LAorICAgIHsgImdwdSIsICAgICAgICAgICJTZWxlY3RzIHdoaWNoIE5WRU5DIGNhcGFibGUgR1BVIHRvIHVzZS4gRmlyc3QgR1BVIGlzIDAsIHNlY29uZCBpcyAxLCBhbmQgc28gb24uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChkZXZpY2UpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gQU5ZX0RFVklDRSB9LCAgIC0yLCBJTlRfTUFYLCBWRSwgImdwdSIgfSwKKyAgICB7ICJhbnkiLCAgICAgICAgICAiUGljayB0aGUgZmlyc3QgZGV2aWNlIGF2YWlsYWJsZSIsICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU5ZX0RFVklDRSB9LCAgICAgICAgICAwLCAwLCBWRSwgImdwdSIgfSwKKyAgICB7ICJsaXN0IiwgICAgICAgICAiTGlzdCB0aGUgYXZhaWxhYmxlIGRldmljZXMiLCAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTElTVF9ERVZJQ0VTIH0sICAgICAgICAwLCAwLCBWRSwgImdwdSIgfSwKKyAgICB7ICJkZWxheSIsICAgICAgICAiRGVsYXkgZnJhbWUgb3V0cHV0IGJ5IHRoZSBnaXZlbiBhbW91bnQgb2YgZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChhc3luY19kZXB0aCksICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gSU5UX01BWCB9LCAwLCBJTlRfTUFYLCBWRSB9LAorICAgIHsgIm5vLXNjZW5lY3V0IiwgICJXaGVuIGxvb2thaGVhZCBpcyBlbmFibGVkLCBzZXQgdGhpcyB0byAxIHRvIGRpc2FibGUgYWRhcHRpdmUgSS1mcmFtZSBpbnNlcnRpb24gYXQgc2NlbmUgY3V0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobm9fc2NlbmVjdXQpLCAgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDAgfSwgMCwgIDEsIFZFIH0sCisgICAgeyAiZm9yY2VkLWlkciIsICAgIklmIGZvcmNpbmcga2V5ZnJhbWVzLCBmb3JjZSB0aGVtIGFzIElEUiBmcmFtZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChmb3JjZWRfaWRyKSwgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAtMSwgMSwgVkUgfSwKKyAgICB7ICJiX2FkYXB0IiwgICAgICAiV2hlbiBsb29rYWhlYWQgaXMgZW5hYmxlZCwgc2V0IHRoaXMgdG8gMCB0byBkaXNhYmxlIGFkYXB0aXZlIEItZnJhbWUgZGVjaXNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGJfYWRhcHQpLCAgICAgIEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAxIH0sIDAsICAxLCBWRSB9LAorICAgIHsgInNwYXRpYWwtYXEiLCAgICJzZXQgdG8gMSB0byBlbmFibGUgU3BhdGlhbCBBUSIsICAgICAgT0ZGU0VUKGFxKSwgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAwIH0sIDAsICAxLCBWRSB9LAorICAgIHsgInRlbXBvcmFsLWFxIiwgICJzZXQgdG8gMSB0byBlbmFibGUgVGVtcG9yYWwgQVEiLCAgICAgT0ZGU0VUKHRlbXBvcmFsX2FxKSwgIEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAwIH0sIDAsICAxLCBWRSB9LAorICAgIHsgInplcm9sYXRlbmN5IiwgICJTZXQgMSB0byBpbmRpY2F0ZSB6ZXJvIGxhdGVuY3kgb3BlcmF0aW9uIChubyByZW9yZGVyaW5nIGRlbGF5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoemVyb2xhdGVuY3kpLCAgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDAgfSwgMCwgIDEsIFZFIH0sCisgICAgeyAibm9ucmVmX3AiLCAgICAgIlNldCB0aGlzIHRvIDEgdG8gZW5hYmxlIGF1dG9tYXRpYyBpbnNlcnRpb24gb2Ygbm9uLXJlZmVyZW5jZSBQLWZyYW1lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobm9ucmVmX3ApLCAgICAgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDAgfSwgMCwgIDEsIFZFIH0sCisgICAgeyAic3RyaWN0X2dvcCIsICAgIlNldCAxIHRvIG1pbmltaXplIEdPUC10by1HT1AgcmF0ZSBmbHVjdHVhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0cmljdF9nb3ApLCAgIEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAwIH0sIDAsICAxLCBWRSB9LAorICAgIHsgImFxLXN0cmVuZ3RoIiwgICJXaGVuIFNwYXRpYWwgQVEgaXMgZW5hYmxlZCwgdGhpcyBmaWVsZCBpcyB1c2VkIHRvIHNwZWNpZnkgQVEgc3RyZW5ndGguIEFRIHN0cmVuZ3RoIHNjYWxlIGlzIGZyb20gMSAobG93KSAtIDE1IChhZ2dyZXNzaXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoYXFfc3RyZW5ndGgpLCAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDggfSwgMSwgMTUsIFZFIH0sCisgICAgeyAiY3EiLCAgICAgICAgICAgIlNldCB0YXJnZXQgcXVhbGl0eSBsZXZlbCAoMCB0byA1MSwgMCBtZWFucyBhdXRvbWF0aWMpIGZvciBjb25zdGFudCBxdWFsaXR5IG1vZGUgaW4gVkJSIHJhdGUgY29udHJvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocXVhbGl0eSksICAgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDAufSwgMC4sIDUxLiwgVkUgfSwKKyAgICB7ICJhdWQiLCAgICAgICAgICAiVXNlIGFjY2VzcyB1bml0IGRlbGltaXRlcnMiLCAgICAgICAgIE9GRlNFVChhdWQpLCAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgImJsdXJheS1jb21wYXQiLCAiQmx1cmF5IGNvbXBhdGliaWxpdHkgd29ya2Fyb3VuZHMiLCAgT0ZGU0VUKGJsdXJheV9jb21wYXQpLEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyAiaW5pdF9xcFAiLCAgICAgIkluaXRpYWwgUVAgdmFsdWUgZm9yIFAgZnJhbWUiLCAgICAgICBPRkZTRVQoaW5pdF9xcF9wKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xIH0sIC0xLCA1MSwgVkUgfSwKKyAgICB7ICJpbml0X3FwQiIsICAgICAiSW5pdGlhbCBRUCB2YWx1ZSBmb3IgQiBmcmFtZSIsICAgICAgIE9GRlNFVChpbml0X3FwX2IpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gLTEgfSwgLTEsIDUxLCBWRSB9LAorICAgIHsgImluaXRfcXBJIiwgICAgICJJbml0aWFsIFFQIHZhbHVlIGZvciBJIGZyYW1lIiwgICAgICAgT0ZGU0VUKGluaXRfcXBfaSksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAtMSB9LCAtMSwgNTEsIFZFIH0sCisgICAgeyAicXAiLCAgICAgICAgICAgIkNvbnN0YW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgcmF0ZSBjb250cm9sIG1ldGhvZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoY3FwKSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xIH0sIC0xLCA1MSwgVkUgfSwKKyAgICB7ICJ3ZWlnaHRlZF9wcmVkIiwiU2V0IDEgdG8gZW5hYmxlIHdlaWdodGVkIHByZWRpY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHdlaWdodGVkX3ByZWQpLEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyAiY29kZXIiLCAgICAgICAgIkNvZGVyIHR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoY29kZXIpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LC0xLCAyLCBWRSwgImNvZGVyIiB9LAorICAgIHsgImRlZmF1bHQiLCAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAtMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMCwgMCwgVkUsICJjb2RlciIgfSwKKyAgICB7ICJhdXRvIiwgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0gyNjRfRU5UUk9QWV9DT0RJTkdfTU9ERV9BVVRPU0VMRUNUIH0sIDAsIDAsIFZFLCAiY29kZXIiIH0sCisgICAgeyAiY2FiYWMiLCAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19IMjY0X0VOVFJPUFlfQ09ESU5HX01PREVfQ0FCQUMgICAgICB9LCAwLCAwLCBWRSwgImNvZGVyIiB9LAorICAgIHsgImNhdmxjIiwgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfSDI2NF9FTlRST1BZX0NPRElOR19NT0RFX0NBVkxDICAgICAgfSwgMCwgMCwgVkUsICJjb2RlciIgfSwKKyAgICB7ICJhYyIsICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0gyNjRfRU5UUk9QWV9DT0RJTkdfTU9ERV9DQUJBQyAgICAgIH0sIDAsIDAsIFZFLCAiY29kZXIiIH0sCisgICAgeyAidmxjIiwgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19IMjY0X0VOVFJPUFlfQ09ESU5HX01PREVfQ0FWTEMgICAgICB9LCAwLCAwLCBWRSwgImNvZGVyIiB9LAorI2lmZGVmIE5WRU5DX0hBVkVfQkZSQU1FX1JFRl9NT0RFCisgICAgeyAiYl9yZWZfbW9kZSIsICAgIlVzZSBCIGZyYW1lcyBhcyByZWZlcmVuY2VzIiwgICAgICAgICBPRkZTRVQoYl9yZWZfbW9kZSksICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IE5WX0VOQ19CRlJBTUVfUkVGX01PREVfRElTQUJMRUQgfSwgTlZfRU5DX0JGUkFNRV9SRUZfTU9ERV9ESVNBQkxFRCwgTlZfRU5DX0JGUkFNRV9SRUZfTU9ERV9NSURETEUsIFZFLCAiYl9yZWZfbW9kZSIgfSwKKyAgICB7ICJkaXNhYmxlZCIsICAgICAiQiBmcmFtZXMgd2lsbCBub3QgYmUgdXNlZCBmb3IgcmVmZXJlbmNlIiwgMCwgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0JGUkFNRV9SRUZfTU9ERV9ESVNBQkxFRCB9LCAwLCAwLCBWRSwgImJfcmVmX21vZGUiIH0sCisgICAgeyAiZWFjaCIsICAgICAgICAgIkVhY2ggQiBmcmFtZSB3aWxsIGJlIHVzZWQgZm9yIHJlZmVyZW5jZSIsIDAsICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19CRlJBTUVfUkVGX01PREVfRUFDSCB9LCAwLCAwLCBWRSwgImJfcmVmX21vZGUiIH0sCisgICAgeyAibWlkZGxlIiwgICAgICAgIk9ubHkgKG51bWJlciBvZiBCIGZyYW1lcykvMiB3aWxsIGJlIHVzZWQgZm9yIHJlZmVyZW5jZSIsIDAsQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19CRlJBTUVfUkVGX01PREVfTUlERExFIH0sIDAsIDAsIFZFLCAiYl9yZWZfbW9kZSIgfSwKKyNlbHNlCisgICAgeyAiYl9yZWZfbW9kZSIsICAgIihub3Qgc3VwcG9ydGVkKSIsICAgICAgICAgICAgICAgICAgICBPRkZTRVQoYl9yZWZfbW9kZSksICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgVkUsICJiX3JlZl9tb2RlIiB9LAorICAgIHsgImRpc2FibGVkIiwgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAwIH0sIDAsIDAsICAgICAgIFZFLCAiYl9yZWZfbW9kZSIgfSwKKyAgICB7ICJlYWNoIiwgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMSB9LCAwLCAwLCAgICAgICBWRSwgImJfcmVmX21vZGUiIH0sCisgICAgeyAibWlkZGxlIiwgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDIgfSwgMCwgMCwgICAgICAgVkUsICJiX3JlZl9tb2RlIiB9LAorI2VuZGlmCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCBkZWZhdWx0c1tdID0geworICAgIHsgImIiLCAiMk0iIH0sCisgICAgeyAicW1pbiIsICItMSIgfSwKKyAgICB7ICJxbWF4IiwgIi0xIiB9LAorICAgIHsgInFkaWZmIiwgIi0xIiB9LAorICAgIHsgInFibHVyIiwgIi0xIiB9LAorICAgIHsgInFjb21wIiwgIi0xIiB9LAorICAgIHsgImciLCAiMjUwIiB9LAorICAgIHsgImJmIiwgIjAiIH0sCisgICAgeyAicmVmcyIsICIwIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworI2lmIEZGX0FQSV9OVkVOQ19PTERfTkFNRQorCitzdGF0aWMgYXZfY29sZCBpbnQgbnZlbmNfb2xkX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGlzIGVuY29kZXIgaXMgZGVwcmVjYXRlZCwgdXNlICdoMjY0X252ZW5jJyBpbnN0ZWFkXG4iKTsKKyAgICByZXR1cm4gZmZfbnZlbmNfZW5jb2RlX2luaXQoYXZjdHgpOworfQorCisjaWYgQ09ORklHX05WRU5DX0VOQ09ERVIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG52ZW5jX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm52ZW5jIiwKKyAgICAuaXRlbV9uYW1lID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX252ZW5jX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm52ZW5jIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTlZJRElBIE5WRU5DIEguMjY0IGVuY29kZXIiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBudmVuY19vbGRfaW5pdCwKKyAgICAuc2VuZF9mcmFtZSAgICAgPSBmZl9udmVuY19zZW5kX2ZyYW1lLAorICAgIC5yZWNlaXZlX3BhY2tldCA9IGZmX252ZW5jX3JlY2VpdmVfcGFja2V0LAorICAgIC5lbmNvZGUyICAgICAgICA9IGZmX252ZW5jX2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBmZl9udmVuY19lbmNvZGVfY2xvc2UsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE52ZW5jQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgID0gJm52ZW5jX2NsYXNzLAorICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9IQVJEV0FSRSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC5waXhfZm10cyAgICAgICA9IGZmX252ZW5jX3BpeF9mbXRzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJudmVuYyIsCit9OworI2VuZGlmCisKKy8qIEFkZCBhbiBhbGlhcyBmb3IgbnZlbmNfaDI2NCAqLworI2lmIENPTkZJR19OVkVOQ19IMjY0X0VOQ09ERVIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG52ZW5jX2gyNjRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibnZlbmNfaDI2NCIsCisgICAgLml0ZW1fbmFtZSA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gPSBvcHRpb25zLAorICAgIC52ZXJzaW9uID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9udmVuY19oMjY0X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm52ZW5jX2gyNjQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJOVklESUEgTlZFTkMgSC4yNjQgZW5jb2RlciIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorICAgIC5pbml0ICAgICAgICAgICA9IG52ZW5jX29sZF9pbml0LAorICAgIC5zZW5kX2ZyYW1lICAgICA9IGZmX252ZW5jX3NlbmRfZnJhbWUsCisgICAgLnJlY2VpdmVfcGFja2V0ID0gZmZfbnZlbmNfcmVjZWl2ZV9wYWNrZXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZmZfbnZlbmNfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX252ZW5jX2VuY29kZV9jbG9zZSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTnZlbmNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbnZlbmNfaDI2NF9jbGFzcywKKyAgICAuZGVmYXVsdHMgICAgICAgPSBkZWZhdWx0cywKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSEFSRFdBUkUsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSBmZl9udmVuY19waXhfZm10cywKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibnZlbmMiLAorfTsKKyNlbmRpZgorCisjZW5kaWYKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaDI2NF9udmVuY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJoMjY0X252ZW5jIiwKKyAgICAuaXRlbV9uYW1lID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2gyNjRfbnZlbmNfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF9udmVuYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5WSURJQSBOVkVOQyBILjI2NCBlbmNvZGVyIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLmluaXQgICAgICAgICAgID0gZmZfbnZlbmNfZW5jb2RlX2luaXQsCisgICAgLnNlbmRfZnJhbWUgICAgID0gZmZfbnZlbmNfc2VuZF9mcmFtZSwKKyAgICAucmVjZWl2ZV9wYWNrZXQgPSBmZl9udmVuY19yZWNlaXZlX3BhY2tldCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9udmVuY19lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbnZlbmNfZW5jb2RlX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihOdmVuY0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZoMjY0X252ZW5jX2NsYXNzLAorICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9IQVJEV0FSRSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC5waXhfZm10cyAgICAgICA9IGZmX252ZW5jX3BpeF9mbXRzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJudmVuYyIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9udmVuY19oZXZjLmMgYi9saWJhdmNvZGVjL252ZW5jX2hldmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGY3ZWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9udmVuY19oZXZjLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNpbmNsdWRlICJudmVuYy5oIgorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihOdmVuY0NvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicHJlc2V0IiwgICAgICAgIlNldCB0aGUgZW5jb2RpbmcgcHJlc2V0IiwgICAgICAgICAgICBPRkZTRVQocHJlc2V0KSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IFBSRVNFVF9NRURJVU0gfSwgUFJFU0VUX0RFRkFVTFQsIFBSRVNFVF9MT1NTTEVTU19IUCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiZGVmYXVsdCIsICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRVNFVF9ERUZBVUxUIH0sICAgICAgICAgICAgIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgInNsb3ciLCAgICAgICAgICJocSAyIHBhc3NlcyIsICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVTRVRfU0xPVyB9LCAgICAgICAgICAgICAgICAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJtZWRpdW0iLCAgICAgICAiaHEgMSBwYXNzIiwgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFU0VUX01FRElVTSB9LCAgICAgICAgICAgICAgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiZmFzdCIsICAgICAgICAgImhwIDEgcGFzcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRVNFVF9GQVNUIH0sICAgICAgICAgICAgICAgIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgImhwIiwgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVTRVRfSFAgfSwgICAgICAgICAgICAgICAgICAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJocSIsICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFU0VUX0hRIH0sICAgICAgICAgICAgICAgICAgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAiYmQiLCAgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRVNFVF9CRCB9LCAgICAgICAgICAgICAgICAgIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgImxsIiwgICAgICAgICAgICJsb3cgbGF0ZW5jeSIsICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVTRVRfTE9XX0xBVEVOQ1lfREVGQVVMVCB9LCAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJsbGhxIiwgICAgICAgICAibG93IGxhdGVuY3kgaHEiLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFU0VUX0xPV19MQVRFTkNZX0hRIH0sICAgICAgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAibGxocCIsICAgICAgICAgImxvdyBsYXRlbmN5IGhwIiwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBSRVNFVF9MT1dfTEFURU5DWV9IUCB9LCAgICAgIDAsIDAsIFZFLCAicHJlc2V0IiB9LAorICAgIHsgImxvc3NsZXNzIiwgICAgICJsb3NzbGVzcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQUkVTRVRfTE9TU0xFU1NfREVGQVVMVCB9LCAgICAwLCAwLCBWRSwgInByZXNldCIgfSwKKyAgICB7ICJsb3NzbGVzc2hwIiwgICAibG9zc2xlc3MgaHAiLCAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJFU0VUX0xPU1NMRVNTX0hQIH0sICAgICAgICAgMCwgMCwgVkUsICJwcmVzZXQiIH0sCisgICAgeyAicHJvZmlsZSIsICAgICAgIlNldCB0aGUgZW5jb2RpbmcgcHJvZmlsZSIsICAgICAgICAgICBPRkZTRVQocHJvZmlsZSksICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IE5WX0VOQ19IRVZDX1BST0ZJTEVfTUFJTiB9LCBOVl9FTkNfSEVWQ19QUk9GSUxFX01BSU4sIEZGX1BST0ZJTEVfSEVWQ19SRVhULCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAibWFpbiIsICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19IRVZDX1BST0ZJTEVfTUFJTiB9LCAgICAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAibWFpbjEwIiwgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19IRVZDX1BST0ZJTEVfTUFJTl8xMCB9LCAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAicmV4dCIsICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19IRVZDX1BST0ZJTEVfUkVYVCB9LCAgICAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAibGV2ZWwiLCAgICAgICAgIlNldCB0aGUgZW5jb2RpbmcgbGV2ZWwgcmVzdHJpY3Rpb24iLCBPRkZTRVQobGV2ZWwpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IE5WX0VOQ19MRVZFTF9BVVRPU0VMRUNUIH0sIE5WX0VOQ19MRVZFTF9BVVRPU0VMRUNULCBOVl9FTkNfTEVWRUxfSEVWQ182MiwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICJhdXRvIiwgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0FVVE9TRUxFQ1QgfSwgIDAsIDAsIFZFLCAgImxldmVsIiB9LAorICAgIHsgIjEiLCAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfTEVWRUxfSEVWQ18xIH0sICAgICAgMCwgMCwgVkUsICAibGV2ZWwiIH0sCisgICAgeyAiMS4wIiwgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19MRVZFTF9IRVZDXzEgfSwgICAgICAwLCAwLCBWRSwgICJsZXZlbCIgfSwKKyAgICB7ICIyIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0hFVkNfMiB9LCAgICAgIDAsIDAsIFZFLCAgImxldmVsIiB9LAorICAgIHsgIjIuMCIsICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfTEVWRUxfSEVWQ18yIH0sICAgICAgMCwgMCwgVkUsICAibGV2ZWwiIH0sCisgICAgeyAiMi4xIiwgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19MRVZFTF9IRVZDXzIxIH0sICAgICAwLCAwLCBWRSwgICJsZXZlbCIgfSwKKyAgICB7ICIzIiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0hFVkNfMyB9LCAgICAgIDAsIDAsIFZFLCAgImxldmVsIiB9LAorICAgIHsgIjMuMCIsICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfTEVWRUxfSEVWQ18zIH0sICAgICAgMCwgMCwgVkUsICAibGV2ZWwiIH0sCisgICAgeyAiMy4xIiwgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19MRVZFTF9IRVZDXzMxIH0sICAgICAwLCAwLCBWRSwgICJsZXZlbCIgfSwKKyAgICB7ICI0IiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0hFVkNfNCB9LCAgICAgIDAsIDAsIFZFLCAgImxldmVsIiB9LAorICAgIHsgIjQuMCIsICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfTEVWRUxfSEVWQ180IH0sICAgICAgMCwgMCwgVkUsICAibGV2ZWwiIH0sCisgICAgeyAiNC4xIiwgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19MRVZFTF9IRVZDXzQxIH0sICAgICAwLCAwLCBWRSwgICJsZXZlbCIgfSwKKyAgICB7ICI1IiwgICAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0hFVkNfNSB9LCAgICAgIDAsIDAsIFZFLCAgImxldmVsIiB9LAorICAgIHsgIjUuMCIsICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfTEVWRUxfSEVWQ181IH0sICAgICAgMCwgMCwgVkUsICAibGV2ZWwiIH0sCisgICAgeyAiNS4xIiwgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19MRVZFTF9IRVZDXzUxIH0sICAgICAwLCAwLCBWRSwgICJsZXZlbCIgfSwKKyAgICB7ICI1LjIiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0hFVkNfNTIgfSwgICAgIDAsIDAsIFZFLCAgImxldmVsIiB9LAorICAgIHsgIjYiLCAgICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfTEVWRUxfSEVWQ182IH0sICAgICAgMCwgMCwgVkUsICAibGV2ZWwiIH0sCisgICAgeyAiNi4wIiwgICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19MRVZFTF9IRVZDXzYgfSwgICAgICAwLCAwLCBWRSwgICJsZXZlbCIgfSwKKyAgICB7ICI2LjEiLCAgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX0xFVkVMX0hFVkNfNjEgfSwgICAgIDAsIDAsIFZFLCAgImxldmVsIiB9LAorICAgIHsgIjYuMiIsICAgICAgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfTEVWRUxfSEVWQ182MiB9LCAgICAgMCwgMCwgVkUsICAibGV2ZWwiIH0sCisgICAgeyAidGllciIsICAgICAgICAgIlNldCB0aGUgZW5jb2RpbmcgdGllciIsICAgICAgICAgICAgICBPRkZTRVQodGllciksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IE5WX0VOQ19USUVSX0hFVkNfTUFJTiB9LCBOVl9FTkNfVElFUl9IRVZDX01BSU4sIE5WX0VOQ19USUVSX0hFVkNfSElHSCwgVkUsICJ0aWVyIn0sCisgICAgeyAibWFpbiIsICAgICAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19USUVSX0hFVkNfTUFJTiB9LCAgICAwLCAwLCBWRSwgICAidGllciIgfSwKKyAgICB7ICJoaWdoIiwgICAgICAgICAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX1RJRVJfSEVWQ19ISUdIIH0sICAgIDAsIDAsIFZFLCAgICJ0aWVyIiB9LAorICAgIHsgInJjIiwgICAgICAgICAgICJPdmVycmlkZSB0aGUgcHJlc2V0IHJhdGUtY29udHJvbCIsICAgT0ZGU0VUKHJjKSwgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAtMSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgSU5UX01BWCwgVkUsICJyYyIgfSwKKyAgICB7ICJjb25zdHFwIiwgICAgICAiQ29uc3RhbnQgUVAgbW9kZSIsICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX1BBUkFNU19SQ19DT05TVFFQIH0sICAgICAgICAgICAgICAgICAgIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAidmJyIiwgICAgICAgICAgIlZhcmlhYmxlIGJpdHJhdGUgbW9kZSIsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19QQVJBTVNfUkNfVkJSIH0sICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBWRSwgInJjIiB9LAorICAgIHsgImNiciIsICAgICAgICAgICJDb25zdGFudCBiaXRyYXRlIG1vZGUiLCAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfUEFSQU1TX1JDX0NCUiB9LCAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJ2YnJfbWlucXAiLCAgICAiVmFyaWFibGUgYml0cmF0ZSBtb2RlIHdpdGggTWluUVAgKGRlcHJlY2F0ZWQpIiwgMCwgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkNEKE5WX0VOQ19QQVJBTVNfUkNfVkJSX01JTlFQKSB9LCAgICAgICAgICAgIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAibGxfMnBhc3NfcXVhbGl0eSIsICJNdWx0aS1wYXNzIG9wdGltaXplZCBmb3IgaW1hZ2UgcXVhbGl0eSAoZGVwcmVjYXRlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBSQ0QoTlZfRU5DX1BBUkFNU19SQ18yX1BBU1NfUVVBTElUWSkgfSwgICAgICAgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJsbF8ycGFzc19zaXplIiwgIk11bHRpLXBhc3Mgb3B0aW1pemVkIGZvciBjb25zdGFudCBmcmFtZSBzaXplIChkZXByZWNhdGVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFJDRChOVl9FTkNfUEFSQU1TX1JDXzJfUEFTU19GUkFNRVNJWkVfQ0FQKSB9LCAwLCAwLCBWRSwgInJjIiB9LAorICAgIHsgInZicl8ycGFzcyIsICAgICJNdWx0aS1wYXNzIHZhcmlhYmxlIGJpdHJhdGUgbW9kZSAoZGVwcmVjYXRlZCkiLCAwLCAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBSQ0QoTlZfRU5DX1BBUkFNU19SQ18yX1BBU1NfVkJSKSB9LCAgICAgICAgICAgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJjYnJfbGRfaHEiLCAgICAiQ29uc3RhbnQgYml0cmF0ZSBsb3cgZGVsYXkgaGlnaCBxdWFsaXR5IG1vZGUiLCAwLCAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlZfRU5DX1BBUkFNU19SQ19DQlJfTE9XREVMQVlfSFEgfSwgICAgICAgICAgIDAsIDAsIFZFLCAicmMiIH0sCisgICAgeyAiY2JyX2hxIiwgICAgICAgIkNvbnN0YW50IGJpdHJhdGUgaGlnaCBxdWFsaXR5IG1vZGUiLCAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5WX0VOQ19QQVJBTVNfUkNfQ0JSX0hRIH0sICAgICAgICAgICAgICAgICAgICAwLCAwLCBWRSwgInJjIiB9LAorICAgIHsgInZicl9ocSIsICAgICAgICJWYXJpYWJsZSBiaXRyYXRlIGhpZ2ggcXVhbGl0eSBtb2RlIiwgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOVl9FTkNfUEFSQU1TX1JDX1ZCUl9IUSB9LCAgICAgICAgICAgICAgICAgICAgMCwgMCwgVkUsICJyYyIgfSwKKyAgICB7ICJyYy1sb29rYWhlYWQiLCAiTnVtYmVyIG9mIGZyYW1lcyB0byBsb29rIGFoZWFkIGZvciByYXRlLWNvbnRyb2wiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHJjX2xvb2thaGVhZCksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIFZFIH0sCisgICAgeyAic3VyZmFjZXMiLCAgICAgIk51bWJlciBvZiBjb25jdXJyZW50IHN1cmZhY2VzIiwgICAgICBPRkZTRVQobmJfc3VyZmFjZXMpLCAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDAgfSwgMCwgTUFYX1JFR0lTVEVSRURfRlJBTUVTLCBWRSB9LAorICAgIHsgImNiciIsICAgICAgICAgICJVc2UgY2JyIGVuY29kaW5nIG1vZGUiLCAgICAgICAgICAgICAgT0ZGU0VUKGNiciksICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAwIH0sICAgMCwgMSwgVkUgfSwKKyAgICB7ICIycGFzcyIsICAgICAgICAiVXNlIDJwYXNzIGVuY29kaW5nIG1vZGUiLCAgICAgICAgICAgIE9GRlNFVCh0d29wYXNzKSwgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIFZFIH0sCisgICAgeyAiZ3B1IiwgICAgICAgICAgIlNlbGVjdHMgd2hpY2ggTlZFTkMgY2FwYWJsZSBHUFUgdG8gdXNlLiBGaXJzdCBHUFUgaXMgMCwgc2Vjb25kIGlzIDEsIGFuZCBzbyBvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGRldmljZSksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBBTllfREVWSUNFIH0sIC0yLCBJTlRfTUFYLCBWRSwgImdwdSIgfSwKKyAgICB7ICJhbnkiLCAgICAgICAgICAiUGljayB0aGUgZmlyc3QgZGV2aWNlIGF2YWlsYWJsZSIsICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQU5ZX0RFVklDRSB9LCAgICAgICAgMCwgMCwgVkUsICJncHUiIH0sCisgICAgeyAibGlzdCIsICAgICAgICAgIkxpc3QgdGhlIGF2YWlsYWJsZSBkZXZpY2VzIiwgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IExJU1RfREVWSUNFUyB9LCAgICAgIDAsIDAsIFZFLCAiZ3B1IiB9LAorICAgIHsgImRlbGF5IiwgICAgICAgICJEZWxheSBmcmFtZSBvdXRwdXQgYnkgdGhlIGdpdmVuIGFtb3VudCBvZiBmcmFtZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGFzeW5jX2RlcHRoKSwgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBJTlRfTUFYIH0sIDAsIElOVF9NQVgsIFZFIH0sCisgICAgeyAibm8tc2NlbmVjdXQiLCAgIldoZW4gbG9va2FoZWFkIGlzIGVuYWJsZWQsIHNldCB0aGlzIHRvIDEgdG8gZGlzYWJsZSBhZGFwdGl2ZSBJLWZyYW1lIGluc2VydGlvbiBhdCBzY2VuZSBjdXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChub19zY2VuZWN1dCksICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgImZvcmNlZC1pZHIiLCAgICJJZiBmb3JjaW5nIGtleWZyYW1lcywgZm9yY2UgdGhlbSBhcyBJRFIgZnJhbWVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZm9yY2VkX2lkciksICAgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDAgfSwgLTEsIDEsIFZFIH0sCisgICAgeyAic3BhdGlhbF9hcSIsICAgInNldCB0byAxIHRvIGVuYWJsZSBTcGF0aWFsIEFRIiwgICAgICBPRkZTRVQoYXEpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKKyAgICB7ICJ0ZW1wb3JhbF9hcSIsICAic2V0IHRvIDEgdG8gZW5hYmxlIFRlbXBvcmFsIEFRIiwgICAgIE9GRlNFVCh0ZW1wb3JhbF9hcSksICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgInplcm9sYXRlbmN5IiwgICJTZXQgMSB0byBpbmRpY2F0ZSB6ZXJvIGxhdGVuY3kgb3BlcmF0aW9uIChubyByZW9yZGVyaW5nIGRlbGF5KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoemVyb2xhdGVuY3kpLCAgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwKKyAgICB7ICJub25yZWZfcCIsICAgICAiU2V0IHRoaXMgdG8gMSB0byBlbmFibGUgYXV0b21hdGljIGluc2VydGlvbiBvZiBub24tcmVmZXJlbmNlIFAtZnJhbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChub25yZWZfcCksICAgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgInN0cmljdF9nb3AiLCAgICJTZXQgMSB0byBtaW5pbWl6ZSBHT1AtdG8tR09QIHJhdGUgZmx1Y3R1YXRpb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChzdHJpY3RfZ29wKSwgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgImFxLXN0cmVuZ3RoIiwgICJXaGVuIFNwYXRpYWwgQVEgaXMgZW5hYmxlZCwgdGhpcyBmaWVsZCBpcyB1c2VkIHRvIHNwZWNpZnkgQVEgc3RyZW5ndGguIEFRIHN0cmVuZ3RoIHNjYWxlIGlzIGZyb20gMSAobG93KSAtIDE1IChhZ2dyZXNzaXZlKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoYXFfc3RyZW5ndGgpLCAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDggfSwgMSwgMTUsIFZFIH0sCisgICAgeyAiY3EiLCAgICAgICAgICAgIlNldCB0YXJnZXQgcXVhbGl0eSBsZXZlbCAoMCB0byA1MSwgMCBtZWFucyBhdXRvbWF0aWMpIGZvciBjb25zdGFudCBxdWFsaXR5IG1vZGUgaW4gVkJSIHJhdGUgY29udHJvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocXVhbGl0eSksICAgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDAufSwgMC4sIDUxLiwgVkUgfSwKKyAgICB7ICJhdWQiLCAgICAgICAgICAiVXNlIGFjY2VzcyB1bml0IGRlbGltaXRlcnMiLCAgICAgICAgIE9GRlNFVChhdWQpLCAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgImJsdXJheS1jb21wYXQiLCAiQmx1cmF5IGNvbXBhdGliaWxpdHkgd29ya2Fyb3VuZHMiLCAgT0ZGU0VUKGJsdXJheV9jb21wYXQpLEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyAiaW5pdF9xcFAiLCAgICAgIkluaXRpYWwgUVAgdmFsdWUgZm9yIFAgZnJhbWUiLCAgICAgICBPRkZTRVQoaW5pdF9xcF9wKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xIH0sIC0xLCA1MSwgVkUgfSwKKyAgICB7ICJpbml0X3FwQiIsICAgICAiSW5pdGlhbCBRUCB2YWx1ZSBmb3IgQiBmcmFtZSIsICAgICAgIE9GRlNFVChpbml0X3FwX2IpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gLTEgfSwgLTEsIDUxLCBWRSB9LAorICAgIHsgImluaXRfcXBJIiwgICAgICJJbml0aWFsIFFQIHZhbHVlIGZvciBJIGZyYW1lIiwgICAgICAgT0ZGU0VUKGluaXRfcXBfaSksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAtMSB9LCAtMSwgNTEsIFZFIH0sCisgICAgeyAicXAiLCAgICAgICAgICAgIkNvbnN0YW50IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgcmF0ZSBjb250cm9sIG1ldGhvZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoY3FwKSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IC0xIH0sIC0xLCA1MSwgVkUgfSwKKyAgICB7ICJ3ZWlnaHRlZF9wcmVkIiwiU2V0IDEgdG8gZW5hYmxlIHdlaWdodGVkIHByZWRpY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHdlaWdodGVkX3ByZWQpLEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCBkZWZhdWx0c1tdID0geworICAgIHsgImIiLCAiMk0iIH0sCisgICAgeyAicW1pbiIsICItMSIgfSwKKyAgICB7ICJxbWF4IiwgIi0xIiB9LAorICAgIHsgInFkaWZmIiwgIi0xIiB9LAorICAgIHsgInFibHVyIiwgIi0xIiB9LAorICAgIHsgInFjb21wIiwgIi0xIiB9LAorICAgIHsgImciLCAiMjUwIiB9LAorICAgIHsgImJmIiwgIjAiIH0sCisgICAgeyAicmVmcyIsICIwIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworI2lmIEZGX0FQSV9OVkVOQ19PTERfTkFNRQorCitzdGF0aWMgYXZfY29sZCBpbnQgbnZlbmNfb2xkX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGlzIGVuY29kZXIgaXMgZGVwcmVjYXRlZCwgdXNlICdoZXZjX252ZW5jJyBpbnN0ZWFkXG4iKTsKKyAgICByZXR1cm4gZmZfbnZlbmNfZW5jb2RlX2luaXQoYXZjdHgpOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBudmVuY19oZXZjX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm52ZW5jX2hldmMiLAorICAgIC5pdGVtX25hbWUgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfbnZlbmNfaGV2Y19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJudmVuY19oZXZjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTlZJRElBIE5WRU5DIGhldmMgZW5jb2RlciIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAorICAgIC5pbml0ICAgICAgICAgICA9IG52ZW5jX29sZF9pbml0LAorICAgIC5zZW5kX2ZyYW1lICAgICA9IGZmX252ZW5jX3NlbmRfZnJhbWUsCisgICAgLnJlY2VpdmVfcGFja2V0ID0gZmZfbnZlbmNfcmVjZWl2ZV9wYWNrZXQsCisgICAgLmVuY29kZTIgICAgICAgID0gZmZfbnZlbmNfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX252ZW5jX2VuY29kZV9jbG9zZSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTnZlbmNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbnZlbmNfaGV2Y19jbGFzcywKKyAgICAuZGVmYXVsdHMgICAgICAgPSBkZWZhdWx0cywKKyAgICAucGl4X2ZtdHMgICAgICAgPSBmZl9udmVuY19waXhfZm10cywKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSEFSRFdBUkUsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAibnZlbmMiLAorfTsKKworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGhldmNfbnZlbmNfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiaGV2Y19udmVuYyIsCisgICAgLml0ZW1fbmFtZSA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gPSBvcHRpb25zLAorICAgIC52ZXJzaW9uID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9oZXZjX252ZW5jX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImhldmNfbnZlbmMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJOVklESUEgTlZFTkMgaGV2YyBlbmNvZGVyIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCisgICAgLmluaXQgICAgICAgICAgID0gZmZfbnZlbmNfZW5jb2RlX2luaXQsCisgICAgLnNlbmRfZnJhbWUgICAgID0gZmZfbnZlbmNfc2VuZF9mcmFtZSwKKyAgICAucmVjZWl2ZV9wYWNrZXQgPSBmZl9udmVuY19yZWNlaXZlX3BhY2tldCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBmZl9udmVuY19lbmNvZGVfZnJhbWUsCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfbnZlbmNfZW5jb2RlX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihOdmVuY0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZoZXZjX252ZW5jX2NsYXNzLAorICAgIC5kZWZhdWx0cyAgICAgICA9IGRlZmF1bHRzLAorICAgIC5waXhfZm10cyAgICAgICA9IGZmX252ZW5jX3BpeF9mbXRzLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9IQVJEV0FSRSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJudmVuYyIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9vbXguYyBiL2xpYmF2Y29kZWMvb214LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2ZTBiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvb214LmMKQEAgLTAsMCArMSw5NjggQEAKKy8qCisgKiBPTVggVmlkZW8gZW5jb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDExIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIENPTkZJR19PTVhfUlBJCisjZGVmaW5lIE9NWF9TS0lQNjRCSVQKKyNlbmRpZgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxPTVhfQ29yZS5oPgorI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjaWZkZWYgT01YX1NLSVA2NEJJVAorc3RhdGljIE9NWF9USUNLUyB0b19vbXhfdGlja3MoaW50NjRfdCB2YWx1ZSkKK3sKKyAgICBPTVhfVElDS1MgczsKKyAgICBzLm5Mb3dQYXJ0ICA9IHZhbHVlICYgMHhmZmZmZmZmZjsKKyAgICBzLm5IaWdoUGFydCA9IHZhbHVlID4+IDMyOworICAgIHJldHVybiBzOworfQorc3RhdGljIGludDY0X3QgZnJvbV9vbXhfdGlja3MoT01YX1RJQ0tTIHZhbHVlKQoreworICAgIHJldHVybiAoKChpbnQ2NF90KXZhbHVlLm5IaWdoUGFydCkgPDwgMzIpIHwgdmFsdWUubkxvd1BhcnQ7Cit9CisjZWxzZQorI2RlZmluZSB0b19vbXhfdGlja3MoeCkgKHgpCisjZGVmaW5lIGZyb21fb214X3RpY2tzKHgpICh4KQorI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9TVFJVQ1QoeCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4Lm5TaXplID0gc2l6ZW9mKHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHgublZlcnNpb24gPSBzLT52ZXJzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorI2RlZmluZSBDSEVDSyh4KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh4ICE9IE9NWF9FcnJvck5vbmUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICJlcnIgJXggKCVkKSBvbiBsaW5lICVkXG4iLCB4LCB4LCBfX0xJTkVfXyk7ICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3R5cGVkZWYgc3RydWN0IE9NWENvbnRleHQgeworICAgIHZvaWQgKmxpYjsKKyAgICB2b2lkICpsaWIyOworICAgIE9NWF9FUlJPUlRZUEUgKCpwdHJfSW5pdCkodm9pZCk7CisgICAgT01YX0VSUk9SVFlQRSAoKnB0cl9EZWluaXQpKHZvaWQpOworICAgIE9NWF9FUlJPUlRZUEUgKCpwdHJfQ29tcG9uZW50TmFtZUVudW0pKE9NWF9TVFJJTkcsIE9NWF9VMzIsIE9NWF9VMzIpOworICAgIE9NWF9FUlJPUlRZUEUgKCpwdHJfR2V0SGFuZGxlKShPTVhfSEFORExFVFlQRSosIE9NWF9TVFJJTkcsIE9NWF9QVFIsIE9NWF9DQUxMQkFDS1RZUEUqKTsKKyAgICBPTVhfRVJST1JUWVBFICgqcHRyX0ZyZWVIYW5kbGUpKE9NWF9IQU5ETEVUWVBFKTsKKyAgICBPTVhfRVJST1JUWVBFICgqcHRyX0dldENvbXBvbmVudHNPZlJvbGUpKE9NWF9TVFJJTkcsIE9NWF9VMzIqLCBPTVhfVTgqKik7CisgICAgT01YX0VSUk9SVFlQRSAoKnB0cl9HZXRSb2xlc09mQ29tcG9uZW50KShPTVhfU1RSSU5HLCBPTVhfVTMyKiwgT01YX1U4KiopOworICAgIHZvaWQgKCpob3N0X2luaXQpKHZvaWQpOworfSBPTVhDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCB2b2lkICpkbHN5bV9wcmVmaXhlZCh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bWJvbCwgY29uc3QgY2hhciAqcHJlZml4KQoreworICAgIGNoYXIgYnVmWzUwXTsKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMlcyIsIHByZWZpeCA/IHByZWZpeCA6ICIiLCBzeW1ib2wpOworICAgIHJldHVybiBkbHN5bShoYW5kbGUsIGJ1Zik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBvbXhfdHJ5X2xvYWQoT01YQ29udGV4dCAqcywgdm9pZCAqbG9nY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsaWJuYW1lLCBjb25zdCBjaGFyICpwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxpYm5hbWUyKQoreworICAgIGlmIChsaWJuYW1lMikgeworICAgICAgICBzLT5saWIyID0gZGxvcGVuKGxpYm5hbWUyLCBSVExEX05PVyB8IFJUTERfR0xPQkFMKTsKKyAgICAgICAgaWYgKCFzLT5saWIyKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfV0FSTklORywgIiVzIG5vdCBmb3VuZFxuIiwgbGlibmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FTkNPREVSX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBzLT5ob3N0X2luaXQgPSBkbHN5bShzLT5saWIyLCAiYmNtX2hvc3RfaW5pdCIpOworICAgICAgICBpZiAoIXMtPmhvc3RfaW5pdCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1dBUk5JTkcsICJiY21faG9zdF9pbml0IG5vdCBmb3VuZFxuIik7CisgICAgICAgICAgICBkbGNsb3NlKHMtPmxpYjIpOworICAgICAgICAgICAgcy0+bGliMiA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FTkNPREVSX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5saWIgPSBkbG9wZW4obGlibmFtZSwgUlRMRF9OT1cgfCBSVExEX0dMT0JBTCk7CisgICAgaWYgKCFzLT5saWIpIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1dBUk5JTkcsICIlcyBub3QgZm91bmRcbiIsIGxpYm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FTkNPREVSX05PVF9GT1VORDsKKyAgICB9CisgICAgcy0+cHRyX0luaXQgICAgICAgICAgICAgICAgPSBkbHN5bV9wcmVmaXhlZChzLT5saWIsICJPTVhfSW5pdCIsIHByZWZpeCk7CisgICAgcy0+cHRyX0RlaW5pdCAgICAgICAgICAgICAgPSBkbHN5bV9wcmVmaXhlZChzLT5saWIsICJPTVhfRGVpbml0IiwgcHJlZml4KTsKKyAgICBzLT5wdHJfQ29tcG9uZW50TmFtZUVudW0gICA9IGRsc3ltX3ByZWZpeGVkKHMtPmxpYiwgIk9NWF9Db21wb25lbnROYW1lRW51bSIsIHByZWZpeCk7CisgICAgcy0+cHRyX0dldEhhbmRsZSAgICAgICAgICAgPSBkbHN5bV9wcmVmaXhlZChzLT5saWIsICJPTVhfR2V0SGFuZGxlIiwgcHJlZml4KTsKKyAgICBzLT5wdHJfRnJlZUhhbmRsZSAgICAgICAgICA9IGRsc3ltX3ByZWZpeGVkKHMtPmxpYiwgIk9NWF9GcmVlSGFuZGxlIiwgcHJlZml4KTsKKyAgICBzLT5wdHJfR2V0Q29tcG9uZW50c09mUm9sZSA9IGRsc3ltX3ByZWZpeGVkKHMtPmxpYiwgIk9NWF9HZXRDb21wb25lbnRzT2ZSb2xlIiwgcHJlZml4KTsKKyAgICBzLT5wdHJfR2V0Um9sZXNPZkNvbXBvbmVudCA9IGRsc3ltX3ByZWZpeGVkKHMtPmxpYiwgIk9NWF9HZXRSb2xlc09mQ29tcG9uZW50IiwgcHJlZml4KTsKKyAgICBpZiAoIXMtPnB0cl9Jbml0IHx8ICFzLT5wdHJfRGVpbml0IHx8ICFzLT5wdHJfQ29tcG9uZW50TmFtZUVudW0gfHwKKyAgICAgICAgIXMtPnB0cl9HZXRIYW5kbGUgfHwgIXMtPnB0cl9GcmVlSGFuZGxlIHx8CisgICAgICAgICFzLT5wdHJfR2V0Q29tcG9uZW50c09mUm9sZSB8fCAhcy0+cHRyX0dldFJvbGVzT2ZDb21wb25lbnQpIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1dBUk5JTkcsICJOb3QgYWxsIGZ1bmN0aW9ucyBmb3VuZCBpbiAlc1xuIiwgbGlibmFtZSk7CisgICAgICAgIGRsY2xvc2Uocy0+bGliKTsKKyAgICAgICAgcy0+bGliID0gTlVMTDsKKyAgICAgICAgaWYgKHMtPmxpYjIpCisgICAgICAgICAgICBkbGNsb3NlKHMtPmxpYjIpOworICAgICAgICBzLT5saWIyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU5DT0RFUl9OT1RfRk9VTkQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBPTVhDb250ZXh0ICpvbXhfaW5pdCh2b2lkICpsb2djdHgsIGNvbnN0IGNoYXIgKmxpYm5hbWUsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGxpYm5hbWVzW10gPSB7CisjaWYgQ09ORklHX09NWF9SUEkKKyAgICAgICAgIi9vcHQvdmMvbGliL2xpYm9wZW5tYXhpbC5zbyIsICIvb3B0L3ZjL2xpYi9saWJiY21faG9zdC5zbyIsCisjZWxzZQorICAgICAgICAibGliT01YX0NvcmUuc28iLCBOVUxMLAorICAgICAgICAibGliT214Q29yZS5zbyIsIE5VTEwsCisjZW5kaWYKKyAgICAgICAgTlVMTAorICAgIH07CisgICAgY29uc3QgY2hhciogY29uc3QqIG5hbWVwdHI7CisgICAgaW50IHJldCA9IEFWRVJST1JfRU5DT0RFUl9OT1RfRk9VTkQ7CisgICAgT01YQ29udGV4dCAqb214X2NvbnRleHQ7CisKKyAgICBvbXhfY29udGV4dCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpvbXhfY29udGV4dCkpOworICAgIGlmICghb214X2NvbnRleHQpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChsaWJuYW1lKSB7CisgICAgICAgIHJldCA9IG9teF90cnlfbG9hZChvbXhfY29udGV4dCwgbG9nY3R4LCBsaWJuYW1lLCBwcmVmaXgsIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZShvbXhfY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAobmFtZXB0ciA9IGxpYm5hbWVzOyAqbmFtZXB0cjsgbmFtZXB0ciArPSAyKQorICAgICAgICAgICAgaWYgKCEocmV0ID0gb214X3RyeV9sb2FkKG9teF9jb250ZXh0LCBsb2djdHgsIG5hbWVwdHJbMF0sIHByZWZpeCwgbmFtZXB0clsxXSkpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAoISpuYW1lcHRyKSB7CisgICAgICAgICAgICBhdl9mcmVlKG9teF9jb250ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9teF9jb250ZXh0LT5ob3N0X2luaXQpCisgICAgICAgIG9teF9jb250ZXh0LT5ob3N0X2luaXQoKTsKKyAgICBvbXhfY29udGV4dC0+cHRyX0luaXQoKTsKKyAgICByZXR1cm4gb214X2NvbnRleHQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgb214X2RlaW5pdChPTVhDb250ZXh0ICpvbXhfY29udGV4dCkKK3sKKyAgICBpZiAoIW9teF9jb250ZXh0KQorICAgICAgICByZXR1cm47CisgICAgb214X2NvbnRleHQtPnB0cl9EZWluaXQoKTsKKyAgICBkbGNsb3NlKG9teF9jb250ZXh0LT5saWIpOworICAgIGF2X2ZyZWUob214X2NvbnRleHQpOworfQorCit0eXBlZGVmIHN0cnVjdCBPTVhDb2RlY0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGNoYXIgKmxpYm5hbWU7CisgICAgY2hhciAqbGlicHJlZml4OworICAgIE9NWENvbnRleHQgKm9teF9jb250ZXh0OworCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworCisgICAgY2hhciBjb21wb25lbnRfbmFtZVtPTVhfTUFYX1NUUklOR05BTUVfU0laRV07CisgICAgT01YX1ZFUlNJT05UWVBFIHZlcnNpb247CisgICAgT01YX0hBTkRMRVRZUEUgaGFuZGxlOworICAgIGludCBpbl9wb3J0LCBvdXRfcG9ydDsKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvcl9mb3JtYXQ7CisgICAgaW50IHN0cmlkZSwgcGxhbmVfc2l6ZTsKKworICAgIGludCBudW1faW5fYnVmZmVycywgbnVtX291dF9idWZmZXJzOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqaW5fYnVmZmVyX2hlYWRlcnM7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipvdXRfYnVmZmVyX2hlYWRlcnM7CisgICAgaW50IG51bV9mcmVlX2luX2J1ZmZlcnM7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipmcmVlX2luX2J1ZmZlcnM7CisgICAgaW50IG51bV9kb25lX291dF9idWZmZXJzOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqZG9uZV9vdXRfYnVmZmVyczsKKyAgICBwdGhyZWFkX211dGV4X3QgaW5wdXRfbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgaW5wdXRfY29uZDsKKyAgICBwdGhyZWFkX211dGV4X3Qgb3V0cHV0X211dGV4OworICAgIHB0aHJlYWRfY29uZF90IG91dHB1dF9jb25kOworCisgICAgcHRocmVhZF9tdXRleF90IHN0YXRlX211dGV4OworICAgIHB0aHJlYWRfY29uZF90IHN0YXRlX2NvbmQ7CisgICAgT01YX1NUQVRFVFlQRSBzdGF0ZTsKKyAgICBPTVhfRVJST1JUWVBFIGVycm9yOworCisgICAgaW50IG11dGV4X2NvbmRfaW5pdGVkOworCisgICAgaW50IGVvc19zZW50LCBnb3RfZW9zOworCisgICAgdWludDhfdCAqb3V0cHV0X2J1ZjsKKyAgICBpbnQgb3V0cHV0X2J1Zl9zaXplOworCisgICAgaW50IGlucHV0X3plcm9jb3B5OworICAgIGludCBwcm9maWxlOworfSBPTVhDb2RlY0NvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGFwcGVuZF9idWZmZXIocHRocmVhZF9tdXRleF90ICptdXRleCwgcHRocmVhZF9jb25kX3QgKmNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYXJyYXlfc2l6ZSwgT01YX0JVRkZFUkhFQURFUlRZUEUgKiphcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikKK3sKKyAgICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpOworICAgIGFycmF5WygqYXJyYXlfc2l6ZSkrK10gPSBidWZmZXI7CisgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdChjb25kKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7Cit9CisKK3N0YXRpYyBPTVhfQlVGRkVSSEVBREVSVFlQRSAqZ2V0X2J1ZmZlcihwdGhyZWFkX211dGV4X3QgKm11dGV4LCBwdGhyZWFkX2NvbmRfdCAqY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGFycmF5X3NpemUsIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdhaXQpCit7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcjsKKyAgICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpOworICAgIGlmICh3YWl0KSB7CisgICAgICAgIHdoaWxlICghKmFycmF5X3NpemUpCisgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KGNvbmQsIG11dGV4KTsKKyAgICB9CisgICAgaWYgKCphcnJheV9zaXplID4gMCkgeworICAgICAgICBidWZmZXIgPSBhcnJheVswXTsKKyAgICAgICAgKCphcnJheV9zaXplKS0tOworICAgICAgICBtZW1tb3ZlKCZhcnJheVswXSwgJmFycmF5WzFdLCAoKmFycmF5X3NpemUpICogc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKikpOworICAgIH0gZWxzZSB7CisgICAgICAgIGJ1ZmZlciA9IE5VTEw7CisgICAgfQorICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBldmVudF9oYW5kbGVyKE9NWF9IQU5ETEVUWVBFIGNvbXBvbmVudCwgT01YX1BUUiBhcHBfZGF0YSwgT01YX0VWRU5UVFlQRSBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX1UzMiBkYXRhMSwgT01YX1UzMiBkYXRhMiwgT01YX1BUUiBldmVudF9kYXRhKQoreworICAgIE9NWENvZGVjQ29udGV4dCAqcyA9IGFwcF9kYXRhOworICAgIC8vIFRoaXMgdXNlcyBjYXN0cyBpbiB0aGUgcHJpbnRmcywgc2luY2UgT01YX1UzMiBhY3R1YWxseSBpcyBhIHR5cGVkZWYgZm9yCisgICAgLy8gdW5zaWduZWQgbG9uZyBpbiBvZmZpY2lhbCBoZWFkZXIgdmVyc2lvbnMgKGJ1dCB0aGVyZSBhcmUgYWxzbyBtb2RpZmllZAorICAgIC8vIHZlcnNpb25zIHdoZXJlIGl0IGlzIHNvbWV0aGluZyBlbHNlKS4KKyAgICBzd2l0Y2ggKGV2ZW50KSB7CisgICAgY2FzZSBPTVhfRXZlbnRFcnJvcjoKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5zdGF0ZV9tdXRleCk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiT01YIGVycm9yICUiUFJJeDMyIlxuIiwgKHVpbnQzMl90KSBkYXRhMSk7CisgICAgICAgIHMtPmVycm9yID0gZGF0YTE7CisgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnMtPnN0YXRlX2NvbmQpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+c3RhdGVfbXV0ZXgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9FdmVudENtZENvbXBsZXRlOgorICAgICAgICBpZiAoZGF0YTEgPT0gT01YX0NvbW1hbmRTdGF0ZVNldCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5zdGF0ZV9tdXRleCk7CisgICAgICAgICAgICBzLT5zdGF0ZSA9IGRhdGEyOworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIk9NWCBzdGF0ZSBjaGFuZ2VkIHRvICUiUFJJdTMyIlxuIiwgKHVpbnQzMl90KSBkYXRhMik7CisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZzLT5zdGF0ZV9jb25kKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5zdGF0ZV9tdXRleCk7CisgICAgICAgIH0gZWxzZSBpZiAoZGF0YTEgPT0gT01YX0NvbW1hbmRQb3J0RGlzYWJsZSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIk9NWCBwb3J0ICUiUFJJdTMyIiBkaXNhYmxlZFxuIiwgKHVpbnQzMl90KSBkYXRhMik7CisgICAgICAgIH0gZWxzZSBpZiAoZGF0YTEgPT0gT01YX0NvbW1hbmRQb3J0RW5hYmxlKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiT01YIHBvcnQgJSJQUkl1MzIiIGVuYWJsZWRcbiIsICh1aW50MzJfdCkgZGF0YTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIk9NWCBjb21tYW5kIGNvbXBsZXRlLCBjb21tYW5kICUiUFJJdTMyIiwgdmFsdWUgJSJQUkl1MzIiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBkYXRhMSwgKHVpbnQzMl90KSBkYXRhMik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkOgorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiT01YIHBvcnQgJSJQUkl1MzIiIHNldHRpbmdzIGNoYW5nZWRcbiIsICh1aW50MzJfdCkgZGF0YTEpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiT01YIGV2ZW50ICVkICUiUFJJeDMyIiAlIlBSSXgzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LCAodWludDMyX3QpIGRhdGExLCAodWludDMyX3QpIGRhdGEyKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBlbXB0eV9idWZmZXJfZG9uZShPTVhfSEFORExFVFlQRSBjb21wb25lbnQsIE9NWF9QVFIgYXBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKQoreworICAgIE9NWENvZGVjQ29udGV4dCAqcyA9IGFwcF9kYXRhOworICAgIGlmIChzLT5pbnB1dF96ZXJvY29weSkgeworICAgICAgICBpZiAoYnVmZmVyLT5wQXBwUHJpdmF0ZSkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci0+cE91dHB1dFBvcnRQcml2YXRlKQorICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmZmVyLT5wQXBwUHJpdmF0ZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgoQVZGcmFtZSoqKSZidWZmZXItPnBBcHBQcml2YXRlKTsKKyAgICAgICAgICAgIGJ1ZmZlci0+cEFwcFByaXZhdGUgPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGFwcGVuZF9idWZmZXIoJnMtPmlucHV0X211dGV4LCAmcy0+aW5wdXRfY29uZCwKKyAgICAgICAgICAgICAgICAgICZzLT5udW1fZnJlZV9pbl9idWZmZXJzLCBzLT5mcmVlX2luX2J1ZmZlcnMsIGJ1ZmZlcik7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIGZpbGxfYnVmZmVyX2RvbmUoT01YX0hBTkRMRVRZUEUgY29tcG9uZW50LCBPTVhfUFRSIGFwcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyKQoreworICAgIE9NWENvZGVjQ29udGV4dCAqcyA9IGFwcF9kYXRhOworICAgIGFwcGVuZF9idWZmZXIoJnMtPm91dHB1dF9tdXRleCwgJnMtPm91dHB1dF9jb25kLAorICAgICAgICAgICAgICAgICAgJnMtPm51bV9kb25lX291dF9idWZmZXJzLCBzLT5kb25lX291dF9idWZmZXJzLCBidWZmZXIpOworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitzdGF0aWMgY29uc3QgT01YX0NBTExCQUNLVFlQRSBjYWxsYmFja3MgPSB7CisgICAgZXZlbnRfaGFuZGxlciwKKyAgICBlbXB0eV9idWZmZXJfZG9uZSwKKyAgICBmaWxsX2J1ZmZlcl9kb25lCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgZmluZF9jb21wb25lbnQoT01YQ29udGV4dCAqb214X2NvbnRleHQsIHZvaWQgKmxvZ2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyb2xlLCBjaGFyICpzdHIsIGludCBzdHJfc2l6ZSkKK3sKKyAgICBPTVhfVTMyIGksIG51bSA9IDA7CisgICAgY2hhciAqKmNvbXBvbmVudHM7CisgICAgaW50IHJldCA9IDA7CisKKyNpZiBDT05GSUdfT01YX1JQSQorICAgIGlmIChhdl9zdHJzdGFydChyb2xlLCAidmlkZW9fZW5jb2Rlci4iLCBOVUxMKSkgeworICAgICAgICBhdl9zdHJsY3B5KHN0ciwgIk9NWC5icm9hZGNvbS52aWRlb19lbmNvZGUiLCBzdHJfc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyNlbmRpZgorICAgIG9teF9jb250ZXh0LT5wdHJfR2V0Q29tcG9uZW50c09mUm9sZSgoT01YX1NUUklORykgcm9sZSwgJm51bSwgTlVMTCk7CisgICAgaWYgKCFudW0pIHsKKyAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX1dBUk5JTkcsICJObyBjb21wb25lbnQgZm9yIHJvbGUgJXMgZm91bmRcbiIsIHJvbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FTkNPREVSX05PVF9GT1VORDsKKyAgICB9CisgICAgY29tcG9uZW50cyA9IGF2X21hbGxvY3pfYXJyYXkobnVtLCBzaXplb2YoKmNvbXBvbmVudHMpKTsKKyAgICBpZiAoIWNvbXBvbmVudHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgIGNvbXBvbmVudHNbaV0gPSBhdl9tYWxsb2N6KE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFKTsKKyAgICAgICAgaWYgKCFjb21wb25lbnRzW2ldKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvbXhfY29udGV4dC0+cHRyX0dldENvbXBvbmVudHNPZlJvbGUoKE9NWF9TVFJJTkcpIHJvbGUsICZudW0sIChPTVhfVTgqKikgY29tcG9uZW50cyk7CisgICAgYXZfc3RybGNweShzdHIsIGNvbXBvbmVudHNbMF0sIHN0cl9zaXplKTsKK2VuZDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspCisgICAgICAgIGF2X2ZyZWUoY29tcG9uZW50c1tpXSk7CisgICAgYXZfZnJlZShjb21wb25lbnRzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgd2FpdF9mb3Jfc3RhdGUoT01YQ29kZWNDb250ZXh0ICpzLCBPTVhfU1RBVEVUWVBFIHN0YXRlKQoreworICAgIGludCByZXQgPSAwOworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcy0+c3RhdGVfbXV0ZXgpOworICAgIHdoaWxlIChzLT5zdGF0ZSAhPSBzdGF0ZSAmJiBzLT5lcnJvciA9PSBPTVhfRXJyb3JOb25lKQorICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcy0+c3RhdGVfY29uZCwgJnMtPnN0YXRlX211dGV4KTsKKyAgICBpZiAocy0+ZXJyb3IgIT0gT01YX0Vycm9yTm9uZSkKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FTkNPREVSX05PVF9GT1VORDsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+c3RhdGVfbXV0ZXgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBvbXhfY29tcG9uZW50X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICpyb2xlKQoreworICAgIE9NWENvZGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFIHJvbGVfcGFyYW1zID0geyAwIH07CisgICAgT01YX1BPUlRfUEFSQU1fVFlQRSB2aWRlb19wb3J0X3BhcmFtcyA9IHsgMCB9OworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgaW5fcG9ydF9wYXJhbXMgPSB7IDAgfSwgb3V0X3BvcnRfcGFyYW1zID0geyAwIH07CisgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHZpZGVvX3BvcnRfZm9ybWF0ID0geyAwIH07CisgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFIHZpZF9wYXJhbV9iaXRyYXRlID0geyAwIH07CisgICAgT01YX0VSUk9SVFlQRSBlcnI7CisgICAgaW50IGk7CisKKyAgICBzLT52ZXJzaW9uLnMublZlcnNpb25NYWpvciA9IDE7CisgICAgcy0+dmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSAxOworICAgIHMtPnZlcnNpb24ucy5uUmV2aXNpb24gICAgID0gMjsKKworICAgIGVyciA9IHMtPm9teF9jb250ZXh0LT5wdHJfR2V0SGFuZGxlKCZzLT5oYW5kbGUsIHMtPmNvbXBvbmVudF9uYW1lLCBzLCAoT01YX0NBTExCQUNLVFlQRSopICZjYWxsYmFja3MpOworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9NWF9HZXRIYW5kbGUoJXMpIGZhaWxlZDogJXhcbiIsIHMtPmNvbXBvbmVudF9uYW1lLCBlcnIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIC8vIFRoaXMgb25lIGNyYXNoZXMgdGhlIG1lZGlhc2VydmVyIG9uIHFjb20sIGlmIHVzZWQgb3ZlciBJT01YCisgICAgSU5JVF9TVFJVQ1Qocm9sZV9wYXJhbXMpOworICAgIGF2X3N0cmxjcHkocm9sZV9wYXJhbXMuY1JvbGUsIHJvbGUsIHNpemVvZihyb2xlX3BhcmFtcy5jUm9sZSkpOworICAgIC8vIEludGVudGlvbmFsbHkgaWdub3JlIGVycm9ycyBvbiB0aGlzIG9uZQorICAgIE9NWF9TZXRQYXJhbWV0ZXIocy0+aGFuZGxlLCBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZSwgJnJvbGVfcGFyYW1zKTsKKworICAgIElOSVRfU1RSVUNUKHZpZGVvX3BvcnRfcGFyYW1zKTsKKyAgICBlcnIgPSBPTVhfR2V0UGFyYW1ldGVyKHMtPmhhbmRsZSwgT01YX0luZGV4UGFyYW1WaWRlb0luaXQsICZ2aWRlb19wb3J0X3BhcmFtcyk7CisgICAgQ0hFQ0soZXJyKTsKKworICAgIHMtPmluX3BvcnQgPSBzLT5vdXRfcG9ydCA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCB2aWRlb19wb3J0X3BhcmFtcy5uUG9ydHM7IGkrKykgeworICAgICAgICBpbnQgcG9ydCA9IHZpZGVvX3BvcnRfcGFyYW1zLm5TdGFydFBvcnROdW1iZXIgKyBpOworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIHBvcnRfcGFyYW1zID0geyAwIH07CisgICAgICAgIElOSVRfU1RSVUNUKHBvcnRfcGFyYW1zKTsKKyAgICAgICAgcG9ydF9wYXJhbXMublBvcnRJbmRleCA9IHBvcnQ7CisgICAgICAgIGVyciA9IE9NWF9HZXRQYXJhbWV0ZXIocy0+aGFuZGxlLCBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAmcG9ydF9wYXJhbXMpOworICAgICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJwb3J0ICVkIGVycm9yICV4XG4iLCBwb3J0LCBlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBvcnRfcGFyYW1zLmVEaXIgPT0gT01YX0RpcklucHV0ICYmIHMtPmluX3BvcnQgPCAwKSB7CisgICAgICAgICAgICBpbl9wb3J0X3BhcmFtcyA9IHBvcnRfcGFyYW1zOworICAgICAgICAgICAgcy0+aW5fcG9ydCA9IHBvcnQ7CisgICAgICAgIH0gZWxzZSBpZiAocG9ydF9wYXJhbXMuZURpciA9PSBPTVhfRGlyT3V0cHV0ICYmIHMtPm91dF9wb3J0IDwgMCkgeworICAgICAgICAgICAgb3V0X3BvcnRfcGFyYW1zID0gcG9ydF9wYXJhbXM7CisgICAgICAgICAgICBzLT5vdXRfcG9ydCA9IHBvcnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmluX3BvcnQgPCAwIHx8IHMtPm91dF9wb3J0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGluIG9yIG91dCBwb3J0IGZvdW5kIChpbiAlZCBvdXQgJWQpXG4iLCBzLT5pbl9wb3J0LCBzLT5vdXRfcG9ydCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcy0+Y29sb3JfZm9ybWF0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyA7IGkrKykgeworICAgICAgICBJTklUX1NUUlVDVCh2aWRlb19wb3J0X2Zvcm1hdCk7CisgICAgICAgIHZpZGVvX3BvcnRfZm9ybWF0Lm5JbmRleCA9IGk7CisgICAgICAgIHZpZGVvX3BvcnRfZm9ybWF0Lm5Qb3J0SW5kZXggPSBzLT5pbl9wb3J0OworICAgICAgICBpZiAoT01YX0dldFBhcmFtZXRlcihzLT5oYW5kbGUsIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0LCAmdmlkZW9fcG9ydF9mb3JtYXQpICE9IE9NWF9FcnJvck5vbmUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHZpZGVvX3BvcnRfZm9ybWF0LmVDb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8CisgICAgICAgICAgICB2aWRlb19wb3J0X2Zvcm1hdC5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcikgeworICAgICAgICAgICAgcy0+Y29sb3JfZm9ybWF0ID0gdmlkZW9fcG9ydF9mb3JtYXQuZUNvbG9yRm9ybWF0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHMtPmNvbG9yX2Zvcm1hdCA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gc3VwcG9ydGVkIHBpeGVsIGZvcm1hdHMgKCVkIGZvcm1hdHMgYXZhaWxhYmxlKVxuIiwgaSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaW5fcG9ydF9wYXJhbXMuYkVuYWJsZWQgICA9IE9NWF9UUlVFOworICAgIGluX3BvcnRfcGFyYW1zLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgaW5fcG9ydF9wYXJhbXMuZURvbWFpbiAgICA9IE9NWF9Qb3J0RG9tYWluVmlkZW87CisKKyAgICBpbl9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciAgICAgICAgID0gTlVMTDsKKyAgICBpbl9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIGluX3BvcnRfcGFyYW1zLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgICAgICAgICAgPSBzLT5jb2xvcl9mb3JtYXQ7CisgICAgcy0+c3RyaWRlICAgICA9IGF2Y3R4LT53aWR0aDsKKyAgICBzLT5wbGFuZV9zaXplID0gYXZjdHgtPmhlaWdodDsKKyAgICAvLyBJZiBzcGVjaWZpYyBjb2RlY3MgbmVlZCB0byBtYW51YWxseSBvdmVycmlkZSB0aGUgc3RyaWRlL3BsYW5lX3NpemUsCisgICAgLy8gdGhhdCBjYW4gYmUgZG9uZSBoZXJlLgorICAgIGluX3BvcnRfcGFyYW1zLmZvcm1hdC52aWRlby5uU3RyaWRlICAgICAgPSBzLT5zdHJpZGU7CisgICAgaW5fcG9ydF9wYXJhbXMuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IHMtPnBsYW5lX3NpemU7CisgICAgaW5fcG9ydF9wYXJhbXMuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICBpbl9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKyAgICBpZiAoYXZjdHgtPmZyYW1lcmF0ZS5kZW4gPiAwICYmIGF2Y3R4LT5mcmFtZXJhdGUubnVtID4gMCkKKyAgICAgICAgaW5fcG9ydF9wYXJhbXMuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAoMSA8PCAxNikgKiBhdmN0eC0+ZnJhbWVyYXRlLm51bSAvIGF2Y3R4LT5mcmFtZXJhdGUuZGVuOworICAgIGVsc2UKKyAgICAgICAgaW5fcG9ydF9wYXJhbXMuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAoMSA8PCAxNikgKiBhdmN0eC0+dGltZV9iYXNlLmRlbiAvIGF2Y3R4LT50aW1lX2Jhc2UubnVtOworCisgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihzLT5oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZpbl9wb3J0X3BhcmFtcyk7CisgICAgQ0hFQ0soZXJyKTsKKyAgICBlcnIgPSBPTVhfR2V0UGFyYW1ldGVyKHMtPmhhbmRsZSwgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmluX3BvcnRfcGFyYW1zKTsKKyAgICBDSEVDSyhlcnIpOworICAgIHMtPnN0cmlkZSAgICAgICAgID0gaW5fcG9ydF9wYXJhbXMuZm9ybWF0LnZpZGVvLm5TdHJpZGU7CisgICAgcy0+cGxhbmVfc2l6ZSAgICAgPSBpbl9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0OworICAgIHMtPm51bV9pbl9idWZmZXJzID0gaW5fcG9ydF9wYXJhbXMubkJ1ZmZlckNvdW50QWN0dWFsOworCisgICAgZXJyID0gT01YX0dldFBhcmFtZXRlcihzLT5oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZvdXRfcG9ydF9wYXJhbXMpOworICAgIG91dF9wb3J0X3BhcmFtcy5iRW5hYmxlZCAgID0gT01YX1RSVUU7CisgICAgb3V0X3BvcnRfcGFyYW1zLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgb3V0X3BvcnRfcGFyYW1zLmVEb21haW4gICAgPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgIG91dF9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CisgICAgb3V0X3BvcnRfcGFyYW1zLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAgID0gYXZjdHgtPndpZHRoOworICAgIG91dF9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ICA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgb3V0X3BvcnRfcGFyYW1zLmZvcm1hdC52aWRlby5uU3RyaWRlICAgICAgID0gMDsKKyAgICBvdXRfcG9ydF9wYXJhbXMuZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAgPSAwOworICAgIG91dF9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8ubkJpdHJhdGUgICAgICA9IGF2Y3R4LT5iaXRfcmF0ZTsKKyAgICBvdXRfcG9ydF9wYXJhbXMuZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgICAgPSBpbl9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICBvdXRfcG9ydF9wYXJhbXMuZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCAgPSBPTVhfRkFMU0U7CisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpCisgICAgICAgIG91dF9wb3J0X3BhcmFtcy5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ01QRUc0OworICAgIGVsc2UgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2NCkKKyAgICAgICAgb3V0X3BvcnRfcGFyYW1zLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOworCisgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihzLT5oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZvdXRfcG9ydF9wYXJhbXMpOworICAgIENIRUNLKGVycik7CisgICAgZXJyID0gT01YX0dldFBhcmFtZXRlcihzLT5oYW5kbGUsIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICZvdXRfcG9ydF9wYXJhbXMpOworICAgIENIRUNLKGVycik7CisgICAgcy0+bnVtX291dF9idWZmZXJzID0gb3V0X3BvcnRfcGFyYW1zLm5CdWZmZXJDb3VudEFjdHVhbDsKKworICAgIElOSVRfU1RSVUNUKHZpZF9wYXJhbV9iaXRyYXRlKTsKKyAgICB2aWRfcGFyYW1fYml0cmF0ZS5uUG9ydEluZGV4ICAgICA9IHMtPm91dF9wb3J0OworICAgIHZpZF9wYXJhbV9iaXRyYXRlLmVDb250cm9sUmF0ZSAgID0gT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGU7CisgICAgdmlkX3BhcmFtX2JpdHJhdGUublRhcmdldEJpdHJhdGUgPSBhdmN0eC0+Yml0X3JhdGU7CisgICAgZXJyID0gT01YX1NldFBhcmFtZXRlcihzLT5oYW5kbGUsIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlLCAmdmlkX3BhcmFtX2JpdHJhdGUpOworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlVuYWJsZSB0byBzZXQgdmlkZW8gYml0cmF0ZSBwYXJhbWV0ZXJcbiIpOworCisgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSBhdmMgPSB7IDAgfTsKKyAgICAgICAgSU5JVF9TVFJVQ1QoYXZjKTsKKyAgICAgICAgYXZjLm5Qb3J0SW5kZXggPSBzLT5vdXRfcG9ydDsKKyAgICAgICAgZXJyID0gT01YX0dldFBhcmFtZXRlcihzLT5oYW5kbGUsIE9NWF9JbmRleFBhcmFtVmlkZW9BdmMsICZhdmMpOworICAgICAgICBDSEVDSyhlcnIpOworICAgICAgICBhdmMubkJGcmFtZXMgPSAwOworICAgICAgICBhdmMublBGcmFtZXMgPSBhdmN0eC0+Z29wX3NpemUgLSAxOworICAgICAgICBzd2l0Y2ggKHMtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9VTktOT1dOID8gYXZjdHgtPnByb2ZpbGUgOiBzLT5wcm9maWxlKSB7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FOgorICAgICAgICAgICAgYXZjLmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9NQUlOOgorICAgICAgICAgICAgYXZjLmVQcm9maWxlID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0g6CisgICAgICAgICAgICBhdmMuZVByb2ZpbGUgPSBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVyciA9IE9NWF9TZXRQYXJhbWV0ZXIocy0+aGFuZGxlLCBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjLCAmYXZjKTsKKyAgICAgICAgQ0hFQ0soZXJyKTsKKyAgICB9CisKKyAgICBlcnIgPSBPTVhfU2VuZENvbW1hbmQocy0+aGFuZGxlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVJZGxlLCBOVUxMKTsKKyAgICBDSEVDSyhlcnIpOworCisgICAgcy0+aW5fYnVmZmVyX2hlYWRlcnMgID0gYXZfbWFsbG9jeihzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUqKSAqIHMtPm51bV9pbl9idWZmZXJzKTsKKyAgICBzLT5mcmVlX2luX2J1ZmZlcnMgICAgPSBhdl9tYWxsb2N6KHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSopICogcy0+bnVtX2luX2J1ZmZlcnMpOworICAgIHMtPm91dF9idWZmZXJfaGVhZGVycyA9IGF2X21hbGxvY3ooc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKikgKiBzLT5udW1fb3V0X2J1ZmZlcnMpOworICAgIHMtPmRvbmVfb3V0X2J1ZmZlcnMgICA9IGF2X21hbGxvY3ooc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKikgKiBzLT5udW1fb3V0X2J1ZmZlcnMpOworICAgIGlmICghcy0+aW5fYnVmZmVyX2hlYWRlcnMgfHwgIXMtPmZyZWVfaW5fYnVmZmVycyB8fCAhcy0+b3V0X2J1ZmZlcl9oZWFkZXJzIHx8ICFzLT5kb25lX291dF9idWZmZXJzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1faW5fYnVmZmVycyAmJiBlcnIgPT0gT01YX0Vycm9yTm9uZTsgaSsrKSB7CisgICAgICAgIGlmIChzLT5pbnB1dF96ZXJvY29weSkKKyAgICAgICAgICAgIGVyciA9IE9NWF9Vc2VCdWZmZXIocy0+aGFuZGxlLCAmcy0+aW5fYnVmZmVyX2hlYWRlcnNbaV0sIHMtPmluX3BvcnQsIHMsIGluX3BvcnRfcGFyYW1zLm5CdWZmZXJTaXplLCBOVUxMKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXJyID0gT01YX0FsbG9jYXRlQnVmZmVyKHMtPmhhbmRsZSwgJnMtPmluX2J1ZmZlcl9oZWFkZXJzW2ldLCAgcy0+aW5fcG9ydCwgIHMsIGluX3BvcnRfcGFyYW1zLm5CdWZmZXJTaXplKTsKKyAgICAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKQorICAgICAgICAgICAgcy0+aW5fYnVmZmVyX2hlYWRlcnNbaV0tPnBBcHBQcml2YXRlID0gcy0+aW5fYnVmZmVyX2hlYWRlcnNbaV0tPnBPdXRwdXRQb3J0UHJpdmF0ZSA9IE5VTEw7CisgICAgfQorICAgIENIRUNLKGVycik7CisgICAgcy0+bnVtX2luX2J1ZmZlcnMgPSBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fb3V0X2J1ZmZlcnMgJiYgZXJyID09IE9NWF9FcnJvck5vbmU7IGkrKykKKyAgICAgICAgZXJyID0gT01YX0FsbG9jYXRlQnVmZmVyKHMtPmhhbmRsZSwgJnMtPm91dF9idWZmZXJfaGVhZGVyc1tpXSwgcy0+b3V0X3BvcnQsIHMsIG91dF9wb3J0X3BhcmFtcy5uQnVmZmVyU2l6ZSk7CisgICAgQ0hFQ0soZXJyKTsKKyAgICBzLT5udW1fb3V0X2J1ZmZlcnMgPSBpOworCisgICAgaWYgKHdhaXRfZm9yX3N0YXRlKHMsIE9NWF9TdGF0ZUlkbGUpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRpZG4ndCBnZXQgT01YX1N0YXRlSWRsZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorICAgIGVyciA9IE9NWF9TZW5kQ29tbWFuZChzLT5oYW5kbGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUV4ZWN1dGluZywgTlVMTCk7CisgICAgQ0hFQ0soZXJyKTsKKyAgICBpZiAod2FpdF9mb3Jfc3RhdGUocywgT01YX1N0YXRlRXhlY3V0aW5nKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEaWRuJ3QgZ2V0IE9NWF9TdGF0ZUV4ZWN1dGluZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9vdXRfYnVmZmVycyAmJiBlcnIgPT0gT01YX0Vycm9yTm9uZTsgaSsrKQorICAgICAgICBlcnIgPSBPTVhfRmlsbFRoaXNCdWZmZXIocy0+aGFuZGxlLCBzLT5vdXRfYnVmZmVyX2hlYWRlcnNbaV0pOworICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBmb3IgKDsgaSA8IHMtPm51bV9vdXRfYnVmZmVyczsgaSsrKQorICAgICAgICAgICAgcy0+ZG9uZV9vdXRfYnVmZmVyc1tzLT5udW1fZG9uZV9vdXRfYnVmZmVycysrXSA9IHMtPm91dF9idWZmZXJfaGVhZGVyc1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9pbl9idWZmZXJzOyBpKyspCisgICAgICAgIHMtPmZyZWVfaW5fYnVmZmVyc1tzLT5udW1fZnJlZV9pbl9idWZmZXJzKytdID0gcy0+aW5fYnVmZmVyX2hlYWRlcnNbaV07CisgICAgcmV0dXJuIGVyciAhPSBPTVhfRXJyb3JOb25lID8gQVZFUlJPUl9VTktOT1dOIDogMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBjbGVhbnVwKE9NWENvZGVjQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgZXhlY3V0aW5nOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5zdGF0ZV9tdXRleCk7CisgICAgZXhlY3V0aW5nID0gcy0+c3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5zdGF0ZV9tdXRleCk7CisKKyAgICBpZiAoZXhlY3V0aW5nKSB7CisgICAgICAgIE9NWF9TZW5kQ29tbWFuZChzLT5oYW5kbGUsIE9NWF9Db21tYW5kU3RhdGVTZXQsIE9NWF9TdGF0ZUlkbGUsIE5VTEwpOworICAgICAgICB3YWl0X2Zvcl9zdGF0ZShzLCBPTVhfU3RhdGVJZGxlKTsKKyAgICAgICAgT01YX1NlbmRDb21tYW5kKHMtPmhhbmRsZSwgT01YX0NvbW1hbmRTdGF0ZVNldCwgT01YX1N0YXRlTG9hZGVkLCBOVUxMKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9pbl9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpidWZmZXIgPSBnZXRfYnVmZmVyKCZzLT5pbnB1dF9tdXRleCwgJnMtPmlucHV0X2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bnVtX2ZyZWVfaW5fYnVmZmVycywgcy0+ZnJlZV9pbl9idWZmZXJzLCAxKTsKKyAgICAgICAgICAgIGlmIChzLT5pbnB1dF96ZXJvY29weSkKKyAgICAgICAgICAgICAgICBidWZmZXItPnBCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgT01YX0ZyZWVCdWZmZXIocy0+aGFuZGxlLCBzLT5pbl9wb3J0LCBidWZmZXIpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fb3V0X2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlciA9IGdldF9idWZmZXIoJnMtPm91dHB1dF9tdXRleCwgJnMtPm91dHB1dF9jb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPm51bV9kb25lX291dF9idWZmZXJzLCBzLT5kb25lX291dF9idWZmZXJzLCAxKTsKKyAgICAgICAgICAgIE9NWF9GcmVlQnVmZmVyKHMtPmhhbmRsZSwgcy0+b3V0X3BvcnQsIGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgd2FpdF9mb3Jfc3RhdGUocywgT01YX1N0YXRlTG9hZGVkKTsKKyAgICB9CisgICAgaWYgKHMtPmhhbmRsZSkgeworICAgICAgICBzLT5vbXhfY29udGV4dC0+cHRyX0ZyZWVIYW5kbGUocy0+aGFuZGxlKTsKKyAgICAgICAgcy0+aGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICBvbXhfZGVpbml0KHMtPm9teF9jb250ZXh0KTsKKyAgICBzLT5vbXhfY29udGV4dCA9IE5VTEw7CisgICAgaWYgKHMtPm11dGV4X2NvbmRfaW5pdGVkKSB7CisgICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZzLT5zdGF0ZV9jb25kKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZzLT5zdGF0ZV9tdXRleCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZzLT5pbnB1dF9jb25kKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZzLT5pbnB1dF9tdXRleCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZzLT5vdXRwdXRfY29uZCk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcy0+b3V0cHV0X211dGV4KTsKKyAgICAgICAgcy0+bXV0ZXhfY29uZF9pbml0ZWQgPSAwOworICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+aW5fYnVmZmVyX2hlYWRlcnMpOworICAgIGF2X2ZyZWVwKCZzLT5vdXRfYnVmZmVyX2hlYWRlcnMpOworICAgIGF2X2ZyZWVwKCZzLT5mcmVlX2luX2J1ZmZlcnMpOworICAgIGF2X2ZyZWVwKCZzLT5kb25lX291dF9idWZmZXJzKTsKKyAgICBhdl9mcmVlcCgmcy0+b3V0cHV0X2J1Zik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBvbXhfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE9NWENvZGVjQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IEFWRVJST1JfRU5DT0RFUl9OT1RfRk9VTkQ7CisgICAgY29uc3QgY2hhciAqcm9sZTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqYnVmZmVyOworICAgIE9NWF9FUlJPUlRZUEUgZXJyOworCisjaWYgQ09ORklHX09NWF9SUEkKKyAgICBzLT5pbnB1dF96ZXJvY29weSA9IDE7CisjZW5kaWYKKworICAgIHMtPm9teF9jb250ZXh0ID0gb214X2luaXQoYXZjdHgsIHMtPmxpYm5hbWUsIHMtPmxpYnByZWZpeCk7CisgICAgaWYgKCFzLT5vbXhfY29udGV4dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU5DT0RFUl9OT1RfRk9VTkQ7CisKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJnMtPnN0YXRlX211dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcy0+c3RhdGVfY29uZCwgTlVMTCk7CisgICAgcHRocmVhZF9tdXRleF9pbml0KCZzLT5pbnB1dF9tdXRleCwgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJnMtPmlucHV0X2NvbmQsIE5VTEwpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcy0+b3V0cHV0X211dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcy0+b3V0cHV0X2NvbmQsIE5VTEwpOworICAgIHMtPm11dGV4X2NvbmRfaW5pdGVkID0gMTsKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworICAgIHMtPnN0YXRlID0gT01YX1N0YXRlTG9hZGVkOworICAgIHMtPmVycm9yID0gT01YX0Vycm9yTm9uZTsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjLT5pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CisgICAgICAgIHJvbGUgPSAidmlkZW9fZW5jb2Rlci5tcGVnNCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICAgICAgcm9sZSA9ICJ2aWRlb19lbmNvZGVyLmF2YyI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmaW5kX2NvbXBvbmVudChzLT5vbXhfY29udGV4dCwgYXZjdHgsIHJvbGUsIHMtPmNvbXBvbmVudF9uYW1lLCBzaXplb2Yocy0+Y29tcG9uZW50X25hbWUpKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiVXNpbmcgJXNcbiIsIHMtPmNvbXBvbmVudF9uYW1lKTsKKworICAgIGlmICgocmV0ID0gb214X2NvbXBvbmVudF9pbml0KGF2Y3R4LCByb2xlKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBidWZmZXIgPSBnZXRfYnVmZmVyKCZzLT5vdXRwdXRfbXV0ZXgsICZzLT5vdXRwdXRfY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPm51bV9kb25lX291dF9idWZmZXJzLCBzLT5kb25lX291dF9idWZmZXJzLCAxKTsKKyAgICAgICAgICAgIGlmIChidWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBhdl9yZWFsbG9jcCgmYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplICsgYnVmZmVyLT5uRmlsbGVkTGVuICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhICsgYXZjdHgtPmV4dHJhZGF0YV9zaXplLCBidWZmZXItPnBCdWZmZXIgKyBidWZmZXItPm5PZmZzZXQsIGJ1ZmZlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplICs9IGJ1ZmZlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgICAgICBtZW1zZXQoYXZjdHgtPmV4dHJhZGF0YSArIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBPTVhfRmlsbFRoaXNCdWZmZXIocy0+aGFuZGxlLCBidWZmZXIpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kX2J1ZmZlcigmcy0+b3V0cHV0X211dGV4LCAmcy0+b3V0cHV0X2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+bnVtX2RvbmVfb3V0X2J1ZmZlcnMsIHMtPmRvbmVfb3V0X2J1ZmZlcnMsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPTVhfRmlsbFRoaXNCdWZmZXIgZmFpbGVkOiAleFxuIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+aWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgICAgICAgICAgICAgIC8vIEZvciBILjI2NCwgdGhlIGV4dHJhZGF0YSBjYW4gYmUgcmV0dXJuZWQgaW4gdHdvIHNlcGFyYXRlIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAvLyAodGhlIHZpZGVvY29yZSBlbmNvZGVyIG9uIHJhc3BiZXJyeSBwaSBkb2VzIHRoaXMpOworICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBjaGVjayB0aGF0IHdlIGhhdmUgZ290IGJvdGggU1BTIGFuZCBQUFMgYmVmb3JlIGNvbnRpbnVpbmcuCisgICAgICAgICAgICAgICAgaW50IG5hbHNbMzJdID0geyAwIH07CisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSArIDQgPCBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhW2kgKyAwXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICFhdmN0eC0+ZXh0cmFkYXRhW2kgKyAxXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICFhdmN0eC0+ZXh0cmFkYXRhW2kgKyAyXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFbaSArIDNdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYWxzW2F2Y3R4LT5leHRyYWRhdGFbaSArIDRdICYgMHgxZl0rKzsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5hbHNbSDI2NF9OQUxfU1BTXSAmJiBuYWxzW0gyNjRfTkFMX1BQU10pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG9teF9lbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgT01YQ29kZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSogYnVmZmVyOworICAgIE9NWF9FUlJPUlRZUEUgZXJyOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIHVpbnQ4X3QgKmRzdFs0XTsKKyAgICAgICAgaW50IGxpbmVzaXplWzRdOworICAgICAgICBpbnQgbmVlZF9jb3B5OworICAgICAgICBidWZmZXIgPSBnZXRfYnVmZmVyKCZzLT5pbnB1dF9tdXRleCwgJnMtPmlucHV0X2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPm51bV9mcmVlX2luX2J1ZmZlcnMsIHMtPmZyZWVfaW5fYnVmZmVycywgMSk7CisKKyAgICAgICAgYnVmZmVyLT5uRmlsbGVkTGVuID0gYXZfaW1hZ2VfZmlsbF9hcnJheXMoZHN0LCBsaW5lc2l6ZSwgYnVmZmVyLT5wQnVmZmVyLCBhdmN0eC0+cGl4X2ZtdCwgcy0+c3RyaWRlLCBzLT5wbGFuZV9zaXplLCAxKTsKKworICAgICAgICBpZiAocy0+aW5wdXRfemVyb2NvcHkpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnNyY1s0XSA9IHsgTlVMTCB9OworICAgICAgICAgICAgaW50IHNyY19saW5lc2l6ZVs0XTsKKyAgICAgICAgICAgIGF2X2ltYWdlX2ZpbGxfYXJyYXlzKHNyYywgc3JjX2xpbmVzaXplLCBmcmFtZS0+ZGF0YVswXSwgYXZjdHgtPnBpeF9mbXQsIHMtPnN0cmlkZSwgcy0+cGxhbmVfc2l6ZSwgMSk7CisgICAgICAgICAgICBpZiAoZnJhbWUtPmxpbmVzaXplWzBdID09IHNyY19saW5lc2l6ZVswXSAmJgorICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVsxXSA9PSBzcmNfbGluZXNpemVbMV0gJiYKKyAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMl0gPT0gc3JjX2xpbmVzaXplWzJdICYmCisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMV0gPT0gc3JjWzFdICYmCisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGFbMl0gPT0gc3JjWzJdKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGlucHV0IGZyYW1lIGhhcHBlbnMgdG8gaGF2ZSBhbGwgcGxhbmVzIHN0b3JlZCBjb250aWd1b3VzbHksCisgICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgcmlnaHQgc3RyaWRlcywganVzdCBjbG9uZSB0aGUgZnJhbWUgYW5kIHNldCB0aGUgT01YCisgICAgICAgICAgICAgICAgLy8gYnVmZmVyIGhlYWRlciB0byBwb2ludCB0byBpdAorICAgICAgICAgICAgICAgIEFWRnJhbWUgKmxvY2FsID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworICAgICAgICAgICAgICAgIGlmICghbG9jYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlIHF1ZXVlIHNvIGl0J3Mgbm90IGxvc3QKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX2J1ZmZlcigmcy0+aW5wdXRfbXV0ZXgsICZzLT5pbnB1dF9jb25kLCAmcy0+bnVtX2ZyZWVfaW5fYnVmZmVycywgcy0+ZnJlZV9pbl9idWZmZXJzLCBidWZmZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cEFwcFByaXZhdGUgPSBsb2NhbDsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5wT3V0cHV0UG9ydFByaXZhdGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnBCdWZmZXIgPSBsb2NhbC0+ZGF0YVswXTsKKyAgICAgICAgICAgICAgICAgICAgbmVlZF9jb3B5ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBidWZmZXIgd2l0aCB0aGUgcmlnaHQKKyAgICAgICAgICAgICAgICAvLyBzaXplIGFuZCBjb3B5IHRoZSBpbnB1dCBmcmFtZSBpbnRvIGl0LgorICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgaW50IGltYWdlX2J1ZmZlcl9zaXplID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKGF2Y3R4LT5waXhfZm10LCBzLT5zdHJpZGUsIHMtPnBsYW5lX3NpemUsIDEpOworICAgICAgICAgICAgICAgIGlmIChpbWFnZV9idWZmZXJfc2l6ZSA+PSAwKQorICAgICAgICAgICAgICAgICAgICBidWYgPSBhdl9tYWxsb2MoaW1hZ2VfYnVmZmVyX3NpemUpOworICAgICAgICAgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBxdWV1ZSBzbyBpdCdzIG5vdCBsb3N0CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9idWZmZXIoJnMtPmlucHV0X211dGV4LCAmcy0+aW5wdXRfY29uZCwgJnMtPm51bV9mcmVlX2luX2J1ZmZlcnMsIHMtPmZyZWVfaW5fYnVmZmVycywgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnBBcHBQcml2YXRlID0gYnVmOworICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoYXQgcEFwcFByaXZhdGUgaXMgYW4gYXZfbWFsbG9jJ2VkIGJ1ZmZlciwgbm90IGFuIEFWRnJhbWUKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5wT3V0cHV0UG9ydFByaXZhdGUgPSAodm9pZCopIDE7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cEJ1ZmZlciA9IGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgbmVlZF9jb3B5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5uRmlsbGVkTGVuID0gYXZfaW1hZ2VfZmlsbF9hcnJheXMoZHN0LCBsaW5lc2l6ZSwgYnVmZmVyLT5wQnVmZmVyLCBhdmN0eC0+cGl4X2ZtdCwgcy0+c3RyaWRlLCBzLT5wbGFuZV9zaXplLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZWVkX2NvcHkgPSAxOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkX2NvcHkpCisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5KGRzdCwgbGluZXNpemUsIChjb25zdCB1aW50OF90KiopIGZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsIGF2Y3R4LT5waXhfZm10LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICBidWZmZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7CisgICAgICAgIGJ1ZmZlci0+bk9mZnNldCA9IDA7CisgICAgICAgIC8vIENvbnZlcnQgdGhlIHRpbWVzdGFtcHMgdG8gbWljcm9zZWNvbmRzOyBzb21lIGVuY29kZXJzIGNhbiBpZ25vcmUKKyAgICAgICAgLy8gdGhlIGZyYW1lcmF0ZSBhbmQgZG8gVkZSIGJpdCBhbGxvY2F0aW9uIGJhc2VkIG9uIHRpbWVzdGFtcHMuCisgICAgICAgIGJ1ZmZlci0+blRpbWVTdGFtcCA9IHRvX29teF90aWNrcyhhdl9yZXNjYWxlX3EoZnJhbWUtPnB0cywgYXZjdHgtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpKTsKKyAgICAgICAgZXJyID0gT01YX0VtcHR5VGhpc0J1ZmZlcihzLT5oYW5kbGUsIGJ1ZmZlcik7CisgICAgICAgIGlmIChlcnIgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgYXBwZW5kX2J1ZmZlcigmcy0+aW5wdXRfbXV0ZXgsICZzLT5pbnB1dF9jb25kLCAmcy0+bnVtX2ZyZWVfaW5fYnVmZmVycywgcy0+ZnJlZV9pbl9idWZmZXJzLCBidWZmZXIpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPTVhfRW1wdHlUaGlzQnVmZmVyIGZhaWxlZDogJXhcbiIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghcy0+ZW9zX3NlbnQpIHsKKyAgICAgICAgYnVmZmVyID0gZ2V0X2J1ZmZlcigmcy0+aW5wdXRfbXV0ZXgsICZzLT5pbnB1dF9jb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5udW1fZnJlZV9pbl9idWZmZXJzLCBzLT5mcmVlX2luX2J1ZmZlcnMsIDEpOworCisgICAgICAgIGJ1ZmZlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgIGJ1ZmZlci0+bkZsYWdzID0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICBidWZmZXItPnBBcHBQcml2YXRlID0gYnVmZmVyLT5wT3V0cHV0UG9ydFByaXZhdGUgPSBOVUxMOworICAgICAgICBlcnIgPSBPTVhfRW1wdHlUaGlzQnVmZmVyKHMtPmhhbmRsZSwgYnVmZmVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBhcHBlbmRfYnVmZmVyKCZzLT5pbnB1dF9tdXRleCwgJnMtPmlucHV0X2NvbmQsICZzLT5udW1fZnJlZV9pbl9idWZmZXJzLCBzLT5mcmVlX2luX2J1ZmZlcnMsIGJ1ZmZlcik7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9NWF9FbXB0eVRoaXNCdWZmZXIgZmFpbGVkOiAleFxuIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgcy0+ZW9zX3NlbnQgPSAxOworICAgIH0KKworICAgIHdoaWxlICghKmdvdF9wYWNrZXQgJiYgcmV0ID09IDAgJiYgIXMtPmdvdF9lb3MpIHsKKyAgICAgICAgLy8gSWYgbm90IGZsdXNoaW5nLCBqdXN0IHBvbGwgdGhlIHF1ZXVlIGlmIHRoZXJlJ3MgZmluaXNoZWQgcGFja2V0cy4KKyAgICAgICAgLy8gSWYgZmx1c2hpbmcsIGRvIGEgYmxvY2tpbmcgd2FpdCB1bnRpbCB3ZSBlaXRoZXIgZ2V0IGEgY29tcGxldGVkCisgICAgICAgIC8vIHBhY2tldCwgb3IgZ2V0IEVPUy4KKyAgICAgICAgYnVmZmVyID0gZ2V0X2J1ZmZlcigmcy0+b3V0cHV0X211dGV4LCAmcy0+b3V0cHV0X2NvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPm51bV9kb25lX291dF9idWZmZXJzLCBzLT5kb25lX291dF9idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmcmFtZSk7CisgICAgICAgIGlmICghYnVmZmVyKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQorICAgICAgICAgICAgcy0+Z290X2VvcyA9IDE7CisKKyAgICAgICAgaWYgKGJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgJiYgYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X3JlYWxsb2NwKCZhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKyBidWZmZXItPm5GaWxsZWRMZW4gKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhICsgYXZjdHgtPmV4dHJhZGF0YV9zaXplLCBidWZmZXItPnBCdWZmZXIgKyBidWZmZXItPm5PZmZzZXQsIGJ1ZmZlci0+bkZpbGxlZExlbik7CisgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKz0gYnVmZmVyLT5uRmlsbGVkTGVuOworICAgICAgICAgICAgbWVtc2V0KGF2Y3R4LT5leHRyYWRhdGEgKyBhdmN0eC0+ZXh0cmFkYXRhX3NpemUsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FKSB8fCAhcGt0LT5kYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG91dHB1dCBwYWNrZXQgaXNuJ3QgcHJlYWxsb2NhdGVkLCBqdXN0IGNvbmNhdGVuYXRlIGV2ZXJ5dGhpbmcgaW4gb3VyCisgICAgICAgICAgICAgICAgLy8gb3duIGJ1ZmZlcgorICAgICAgICAgICAgICAgIGludCBuZXdzaXplID0gcy0+b3V0cHV0X2J1Zl9zaXplICsgYnVmZmVyLT5uRmlsbGVkTGVuICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRTsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2X3JlYWxsb2NwKCZzLT5vdXRwdXRfYnVmLCBuZXdzaXplKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9idWZfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+b3V0cHV0X2J1ZiArIHMtPm91dHB1dF9idWZfc2l6ZSwgYnVmZmVyLT5wQnVmZmVyICsgYnVmZmVyLT5uT2Zmc2V0LCBidWZmZXItPm5GaWxsZWRMZW4pOworICAgICAgICAgICAgICAgIHMtPm91dHB1dF9idWZfc2l6ZSArPSBidWZmZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2X3BhY2tldF9mcm9tX2RhdGEocGt0LCBzLT5vdXRwdXRfYnVmLCBzLT5vdXRwdXRfYnVmX3NpemUpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5vdXRwdXRfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9idWZfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzLT5vdXRwdXRfYnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcy0+b3V0cHV0X2J1Zl9zaXplID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEVuZCBvZiBmcmFtZSwgYW5kIHRoZSBjYWxsZXIgcHJvdmlkZWQgYSBwcmVhbGxvY2F0ZWQgZnJhbWUKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcy0+b3V0cHV0X2J1Zl9zaXplICsgYnVmZmVyLT5uRmlsbGVkTGVuLCAwKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBvdXRwdXQgcGFja2V0IG9mIHNpemUgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkocy0+b3V0cHV0X2J1Zl9zaXplICsgYnVmZmVyLT5uRmlsbGVkTGVuKSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBzLT5vdXRwdXRfYnVmLCBzLT5vdXRwdXRfYnVmX3NpemUpOworICAgICAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEgKyBzLT5vdXRwdXRfYnVmX3NpemUsIGJ1ZmZlci0+cEJ1ZmZlciArIGJ1ZmZlci0+bk9mZnNldCwgYnVmZmVyLT5uRmlsbGVkTGVuKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+b3V0cHV0X2J1Zik7CisgICAgICAgICAgICAgICAgcy0+b3V0cHV0X2J1Zl9zaXplID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChidWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUpIHsKKyAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IGF2X3Jlc2NhbGVfcShmcm9tX29teF90aWNrcyhidWZmZXItPm5UaW1lU3RhbXApLCBBVl9USU1FX0JBU0VfUSwgYXZjdHgtPnRpbWVfYmFzZSk7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGVuYWJsZSBCLWZyYW1lcyBmb3IgdGhlIGVuY29kZXJzLCBzbyBzZXQKKyAgICAgICAgICAgICAgICAvLyBwa3QtPmR0cyA9IHBrdC0+cHRzLiAoVGhlIGNhbGxpbmcgY29kZSBiZWhhdmVzIHdvcnNlIGlmIHRoZSBlbmNvZGVyCisgICAgICAgICAgICAgICAgLy8gZG9lc24ndCBzZXQgdGhlIGR0cykuCisgICAgICAgICAgICAgICAgcGt0LT5kdHMgPSBwa3QtPnB0czsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUUpCisgICAgICAgICAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorZW5kOgorICAgICAgICBlcnIgPSBPTVhfRmlsbFRoaXNCdWZmZXIocy0+aGFuZGxlLCBidWZmZXIpOworICAgICAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGFwcGVuZF9idWZmZXIoJnMtPm91dHB1dF9tdXRleCwgJnMtPm91dHB1dF9jb25kLCAmcy0+bnVtX2RvbmVfb3V0X2J1ZmZlcnMsIHMtPmRvbmVfb3V0X2J1ZmZlcnMsIGJ1ZmZlcik7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9NWF9GaWxsVGhpc0J1ZmZlciBmYWlsZWQ6ICV4XG4iLCBlcnIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBvbXhfZW5jb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgT01YQ29kZWNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGNsZWFudXAocyk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE9NWENvZGVjQ29udGV4dCwgeCkKKyNkZWZpbmUgVkRFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorI2RlZmluZSBWRSAgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJvbXhfbGlibmFtZSIsICJPcGVuTUFYIGxpYnJhcnkgbmFtZSIsIE9GRlNFVChsaWJuYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgVkRFIH0sCisgICAgeyAib214X2xpYnByZWZpeCIsICJPcGVuTUFYIGxpYnJhcnkgcHJlZml4IiwgT0ZGU0VUKGxpYnByZWZpeCksIEFWX09QVF9UWVBFX1NUUklORywgeyAwIH0sIDAsIDAsIFZERSB9LAorICAgIHsgInplcm9jb3B5IiwgIlRyeSB0byBhdm9pZCBjb3B5aW5nIGlucHV0IGZyYW1lcyBpZiBwb3NzaWJsZSIsIE9GRlNFVChpbnB1dF96ZXJvY29weSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LAorICAgIHsgInByb2ZpbGUiLCAgIlNldCB0aGUgZW5jb2RpbmcgcHJvZmlsZSIsIE9GRlNFVChwcm9maWxlKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IEZGX1BST0ZJTEVfVU5LTk9XTiB9LCAgICAgICBGRl9QUk9GSUxFX1VOS05PV04sIEZGX1BST0ZJTEVfSDI2NF9ISUdILCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAiYmFzZWxpbmUiLCAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FIH0sIDAsIDAsIFZFLCAicHJvZmlsZSIgfSwKKyAgICB7ICJtYWluIiwgICAgICIiLCAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGRl9QUk9GSUxFX0gyNjRfTUFJTiB9LCAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImhpZ2giLCAgICAgIiIsICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZGX1BST0ZJTEVfSDI2NF9ISUdIIH0sICAgICAwLCAwLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb214X2VuY29kZXJfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgb214X21wZWc0ZW5jX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm1wZWc0X29teCIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworQVZDb2RlYyBmZl9tcGVnNF9vbXhfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJtcGVnNF9vbXgiLAorICAgIC5sb25nX25hbWUgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9wZW5NQVggSUwgTVBFRy00IHZpZGVvIGVuY29kZXIiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKE9NWENvZGVjQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgICAgPSBvbXhfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgPSBvbXhfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgID0gb214X2VuY29kZV9lbmQsCisgICAgLnBpeF9mbXRzICAgICAgICAgPSBvbXhfZW5jb2Rlcl9waXhfZm10cywKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IEFWX0NPREVDX0NBUF9ERUxBWSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfCBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC5wcml2X2NsYXNzICAgICAgID0gJm9teF9tcGVnNGVuY19jbGFzcywKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG9teF9oMjY0ZW5jX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImgyNjRfb214IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CitBVkNvZGVjIGZmX2gyNjRfb214X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAiaDI2NF9vbXgiLAorICAgIC5sb25nX25hbWUgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9wZW5NQVggSUwgSC4yNjQgdmlkZW8gZW5jb2RlciIpLAorICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihPTVhDb2RlY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgID0gb214X2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICAgID0gb214X2VuY29kZV9mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IG9teF9lbmNvZGVfZW5kLAorICAgIC5waXhfZm10cyAgICAgICAgID0gb214X2VuY29kZXJfcGl4X2ZtdHMsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBBVl9DT0RFQ19DQVBfREVMQVksCisgICAgLmNhcHNfaW50ZXJuYWwgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFIHwgRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKKyAgICAucHJpdl9jbGFzcyAgICAgICA9ICZvbXhfaDI2NGVuY19jbGFzcywKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29uMmF2Yy5jIGIvbGliYXZjb2RlYy9vbjJhdmMuYwppbmRleCA2MmM3MWNjLi40ZTRiZTc1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL29uMmF2Yy5jCisrKyBiL2xpYmF2Y29kZWMvb24yYXZjLmMKQEAgLTIxLDE1ICsyMSwxMyBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmZtYXRoLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAiZmZ0LmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKLSNpbmNsdWRlICJnb2xvbWIuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgInVuYXJ5LmgiCiAKICNpbmNsdWRlICJvbjJhdmNkYXRhLmgiCiAKQEAgLTY4NywxMSArNjg1LDExIEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IG9uMmF2Y19yZWNvbnN0cnVjdF9zdGVyZW8oT24yQVZDQ29udGV4dCAqYywgQVZGcmFtZSAqZHN0LCBpbnQgb2Zmc2V0KQorc3RhdGljIGludCBvbjJhdmNfcmVjb25zdHJ1Y3RfY2hhbm5lbF9leHQoT24yQVZDQ29udGV4dCAqYywgQVZGcmFtZSAqZHN0LCBpbnQgb2Zmc2V0KQogewogICAgIGludCBjaCwgaTsKIAotICAgIGZvciAoY2ggPSAwOyBjaCA8IDI7IGNoKyspIHsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgZmxvYXQgKm91dCAgID0gKGZsb2F0Kilkc3QtPmV4dGVuZGVkX2RhdGFbY2hdICsgb2Zmc2V0OwogICAgICAgICBmbG9hdCAqaW4gICAgPSBjLT5jb2VmZnNbY2hdOwogICAgICAgICBmbG9hdCAqc2F2ZWQgPSBjLT5kZWxheVtjaF07CkBAIC04MTIsMTAgKzgxMCw2IEBACiAgICAgfQogICAgIGMtPnByZXZfd2luZG93X3R5cGUgPSBjLT53aW5kb3dfdHlwZTsKICAgICBjLT53aW5kb3dfdHlwZSAgICAgID0gZ2V0X2JpdHMoJmdiLCAzKTsKLSAgICBpZiAoYy0+d2luZG93X3R5cGUgPj0gV0lORE9XX1RZUEVfRVhUNCAmJiBjLT5hdmN0eC0+Y2hhbm5lbHMgPT0gMSkgewotICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInN0ZXJlbyBtb2RlIHdpbmRvdyBmb3IgbW9ubyBhdWRpb1xuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIH0KIAogICAgIGMtPmJhbmRfc3RhcnQgID0gYy0+bW9kZXNbYy0+d2luZG93X3R5cGVdLmJhbmRfc3RhcnQ7CiAgICAgYy0+bnVtX3dpbmRvd3MgPSBjLT5tb2Rlc1tjLT53aW5kb3dfdHlwZV0ubnVtX3dpbmRvd3M7CkBAIC04MzYsNyArODMwLDcgQEAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPmF2Y3R4LT5jaGFubmVsczsgaSsrKQogICAgICAgICAgICAgb24yYXZjX3JlY29uc3RydWN0X2NoYW5uZWwoYywgaSwgZHN0LCBvZmZzZXQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG9uMmF2Y19yZWNvbnN0cnVjdF9zdGVyZW8oYywgZHN0LCBvZmZzZXQpOworICAgICAgICBvbjJhdmNfcmVjb25zdHJ1Y3RfY2hhbm5lbF9leHQoYywgZHN0LCBvZmZzZXQpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtOTI1LDEwICs5MTksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DSF9MQVlPVVRfTU9OTzsKIAogICAgIGMtPmlzX2F2NTAwID0gKGF2Y3R4LT5jb2RlY190YWcgPT0gMHg1MDApOwotICAgIGlmIChjLT5pc19hdjUwMCAmJiBhdmN0eC0+Y2hhbm5lbHMgPT0gMikgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIjB4NTAwIHZlcnNpb24gc2hvdWxkIGJlIG1vbm9cbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9CiAKICAgICBpZiAoYXZjdHgtPmNoYW5uZWxzID09IDIpCiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29uMmF2Y2RhdGEuYyBiL2xpYmF2Y29kZWMvb24yYXZjZGF0YS5jCmluZGV4IGFiZTU5ODMuLmVjOTgzNTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvb24yYXZjZGF0YS5jCisrKyBiL2xpYmF2Y29kZWMvb24yYXZjZGF0YS5jCkBAIC03NzI0LDEyICs3NzI0LDEyIEBACiAgICAgICAwLjIyNzgzLCAwLjA1ODg5NDc5NSwgLTAuNjEzNTA5MDIsIDAuNjk1NTk4NzMsIC0wLjI3MDEzNzgzLCB9CiB9OwogCi1jb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzlfMjBfMVs5XSA9IHsKK2NvbnN0IGRvdWJsZSAqIGNvbnN0IGZmX29uMmF2Y190YWJzXzlfMjBfMVs5XSA9IHsKICAgICB0YWJzXzlfMjBbMF0sIHRhYnNfOV8yMFsxXSwgdGFic185XzIwWzJdLCB0YWJzXzlfMjBbM10sIHRhYnNfOV8yMFs0XSwKICAgICB0YWJzXzlfMjBbNV0sIHRhYnNfOV8yMFs2XSwgdGFic185XzIwWzddLCB0YWJzXzlfMjBbOF0KIH07CiAKLWNvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfOV8yMF8yWzldID0geworY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfOV8yMF8yWzldID0gewogICAgIHRhYnNfOV8yMFsgOV0sIHRhYnNfOV8yMFsxMF0sIHRhYnNfOV8yMFsxMV0sIHRhYnNfOV8yMFsxMl0sIHRhYnNfOV8yMFsxM10sCiAgICAgdGFic185XzIwWzE0XSwgdGFic185XzIwWzE1XSwgdGFic185XzIwWzE2XSwgdGFic185XzIwWzE3XQogfTsKQEAgLTc5MjcsNyArNzkyNyw3IEBACiAgICAgICAwLjAxOTg3MTg0OCwgLTAuMTE5ODk1NTksIDAuMDM2NjU5MTM1LCAwLjI2NjMyMjAxLCAtMC4zMDU3Mzk3LCAtMC4yMzIyMDMzNSwgMC42ODc0MTM1MiwgLTAuNTQwMjQwMjcsIH0KIH07CiAKLWNvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfMTlfNDBfMVsxOV0gPSB7Citjb25zdCBkb3VibGUgKiBjb25zdCBmZl9vbjJhdmNfdGFic18xOV80MF8xWzE5XSA9IHsKICAgICB0YWJzXzE5XzQwWyAwXSwgdGFic18xOV80MFsgMV0sIHRhYnNfMTlfNDBbIDJdLCB0YWJzXzE5XzQwWyAzXSwKICAgICB0YWJzXzE5XzQwWyA0XSwgdGFic18xOV80MFsgNV0sIHRhYnNfMTlfNDBbIDZdLCB0YWJzXzE5XzQwWyA3XSwKICAgICB0YWJzXzE5XzQwWyA4XSwgdGFic18xOV80MFsgOV0sIHRhYnNfMTlfNDBbMTBdLCB0YWJzXzE5XzQwWzExXSwKQEAgLTc5MzUsNyArNzkzNSw3IEBACiAgICAgdGFic18xOV80MFsxNl0sIHRhYnNfMTlfNDBbMTddLCB0YWJzXzE5XzQwWzE4XSwKIH07CiAKLWNvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfMTlfNDBfMlsxOV0gPSB7Citjb25zdCBkb3VibGUgKiBjb25zdCBmZl9vbjJhdmNfdGFic18xOV80MF8yWzE5XSA9IHsKICAgICB0YWJzXzE5XzQwWzE5XSwgdGFic18xOV80MFsyMF0sIHRhYnNfMTlfNDBbMjFdLCB0YWJzXzE5XzQwWzIyXSwKICAgICB0YWJzXzE5XzQwWzIzXSwgdGFic18xOV80MFsyNF0sIHRhYnNfMTlfNDBbMjVdLCB0YWJzXzE5XzQwWzI2XSwKICAgICB0YWJzXzE5XzQwWzI3XSwgdGFic18xOV80MFsyOF0sIHRhYnNfMTlfNDBbMjldLCB0YWJzXzE5XzQwWzMwXSwKQEAgLTg4MjYsNyArODgyNiw3IEBACiAgICAgICAwLjUxNDM0NDA4LCAtMC40MTQ4NjQ0MywgMC4yNzY3MjYzNSwgLTAuMTA0MzIwNTQsIH0sCiB9OwogCi1jb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzFbMjBdID0geworY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfMVsyMF0gPSB7CiAgICAgdGFic18yMF84NFsgMF0sIHRhYnNfMjBfODRbIDFdLCB0YWJzXzIwXzg0WyAyXSwgdGFic18yMF84NFsgM10sCiAgICAgdGFic18yMF84NFsgNF0sIHRhYnNfMjBfODRbIDVdLCB0YWJzXzIwXzg0WyA2XSwgdGFic18yMF84NFsgN10sCiAgICAgdGFic18yMF84NFsgOF0sIHRhYnNfMjBfODRbIDldLCB0YWJzXzIwXzg0WzEwXSwgdGFic18yMF84NFsxMV0sCkBAIC04ODM0LDcgKzg4MzQsNyBAQAogICAgIHRhYnNfMjBfODRbMTZdLCB0YWJzXzIwXzg0WzE3XSwgdGFic18yMF84NFsxOF0sIHRhYnNfMjBfODRbMTldCiB9OwogCi1jb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzJbMjBdID0geworY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfMlsyMF0gPSB7CiAgICAgdGFic18yMF84NFsyMF0sIHRhYnNfMjBfODRbMjFdLCB0YWJzXzIwXzg0WzIyXSwgdGFic18yMF84NFsyM10sCiAgICAgdGFic18yMF84NFsyNF0sIHRhYnNfMjBfODRbMjVdLCB0YWJzXzIwXzg0WzI2XSwgdGFic18yMF84NFsyN10sCiAgICAgdGFic18yMF84NFsyOF0sIHRhYnNfMjBfODRbMjldLCB0YWJzXzIwXzg0WzMwXSwgdGFic18yMF84NFszMV0sCkBAIC04ODQyLDcgKzg4NDIsNyBAQAogICAgIHRhYnNfMjBfODRbMzZdLCB0YWJzXzIwXzg0WzM3XSwgdGFic18yMF84NFszOF0sIHRhYnNfMjBfODRbMzldCiB9OwogCi1jb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzNbMjBdID0geworY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfM1syMF0gPSB7CiAgICAgdGFic18yMF84NFs0MF0sIHRhYnNfMjBfODRbNDFdLCB0YWJzXzIwXzg0WzQyXSwgdGFic18yMF84NFs0M10sCiAgICAgdGFic18yMF84NFs0NF0sIHRhYnNfMjBfODRbNDVdLCB0YWJzXzIwXzg0WzQ2XSwgdGFic18yMF84NFs0N10sCiAgICAgdGFic18yMF84NFs0OF0sIHRhYnNfMjBfODRbNDldLCB0YWJzXzIwXzg0WzUwXSwgdGFic18yMF84NFs1MV0sCkBAIC04ODUwLDcgKzg4NTAsNyBAQAogICAgIHRhYnNfMjBfODRbNTZdLCB0YWJzXzIwXzg0WzU3XSwgdGFic18yMF84NFs1OF0sIHRhYnNfMjBfODRbNTldCiB9OwogCi1jb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzRbMjBdID0geworY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfNFsyMF0gPSB7CiAgICAgdGFic18yMF84NFs2MF0sIHRhYnNfMjBfODRbNjFdLCB0YWJzXzIwXzg0WzYyXSwgdGFic18yMF84NFs2M10sCiAgICAgdGFic18yMF84NFs2NF0sIHRhYnNfMjBfODRbNjVdLCB0YWJzXzIwXzg0WzY2XSwgdGFic18yMF84NFs2N10sCiAgICAgdGFic18yMF84NFs2OF0sIHRhYnNfMjBfODRbNjldLCB0YWJzXzIwXzg0WzcwXSwgdGFic18yMF84NFs3MV0sCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29uMmF2Y2RhdGEuaCBiL2xpYmF2Y29kZWMvb24yYXZjZGF0YS5oCmluZGV4IDk1ZDg4ZTAuLmRjNzgzM2YgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvb24yYXZjZGF0YS5oCisrKyBiL2xpYmF2Y29kZWMvb24yYXZjZGF0YS5oCkBAIC02NCwxNiArNjQsMTYgQEAKIGV4dGVybiBjb25zdCBkb3VibGUgZmZfb24yYXZjX3RhYl84NF8yW107CiBleHRlcm4gY29uc3QgZG91YmxlIGZmX29uMmF2Y190YWJfODRfM1tdOwogZXh0ZXJuIGNvbnN0IGRvdWJsZSBmZl9vbjJhdmNfdGFiXzg0XzRbXTsKLWV4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzRfMTBfMVs0XTsKLWV4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzRfMTBfMls0XTsKLWV4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzlfMjBfMVs5XTsKLWV4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzlfMjBfMls5XTsKLWV4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzE5XzQwXzFbMTldOwotZXh0ZXJuIGNvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfMTlfNDBfMlsxOV07Ci1leHRlcm4gY29uc3QgZG91YmxlKiBjb25zdCBmZl9vbjJhdmNfdGFic18yMF84NF8xWzIwXTsKLWV4dGVybiBjb25zdCBkb3VibGUqIGNvbnN0IGZmX29uMmF2Y190YWJzXzIwXzg0XzJbMjBdOwotZXh0ZXJuIGNvbnN0IGRvdWJsZSogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfM1syMF07Ci1leHRlcm4gY29uc3QgZG91YmxlKiBjb25zdCBmZl9vbjJhdmNfdGFic18yMF84NF80WzIwXTsKK2V4dGVybiBjb25zdCBkb3VibGUgKiBjb25zdCBmZl9vbjJhdmNfdGFic180XzEwXzFbNF07CitleHRlcm4gY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfNF8xMF8yWzRdOworZXh0ZXJuIGNvbnN0IGRvdWJsZSAqIGNvbnN0IGZmX29uMmF2Y190YWJzXzlfMjBfMVs5XTsKK2V4dGVybiBjb25zdCBkb3VibGUgKiBjb25zdCBmZl9vbjJhdmNfdGFic185XzIwXzJbOV07CitleHRlcm4gY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMTlfNDBfMVsxOV07CitleHRlcm4gY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMTlfNDBfMlsxOV07CitleHRlcm4gY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfMVsyMF07CitleHRlcm4gY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfMlsyMF07CitleHRlcm4gY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfM1syMF07CitleHRlcm4gY29uc3QgZG91YmxlICogY29uc3QgZmZfb24yYXZjX3RhYnNfMjBfODRfNFsyMF07CiBleHRlcm4gY29uc3QgZmxvYXQgZmZfb24yYXZjX2N0YWJfMVsyMDQ4XTsKIGV4dGVybiBjb25zdCBmbG9hdCBmZl9vbjJhdmNfY3RhYl8yWzIwNDhdOwogZXh0ZXJuIGNvbnN0IGZsb2F0IGZmX29uMmF2Y19jdGFiXzNbMjA0OF07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29wdGlvbnMuYyBiL2xpYmF2Y29kZWMvb3B0aW9ucy5jCmluZGV4IGVhMjU2M2IuLjQxYjYwNTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvb3B0aW9ucy5jCisrKyBiL2xpYmF2Y29kZWMvb3B0aW9ucy5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlIDxmbG9hdC5oPiAgICAgICAgICAgICAgLyogRkxUX01JTiwgRkxUX01BWCAqLwogI2luY2x1ZGUgPHN0cmluZy5oPgogCiBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCkBAIC04OSw3ICs4OCw3IEBACiAgICAgLmdldF9jYXRlZ29yeSAgICAgICAgICAgID0gZ2V0X2NhdGVnb3J5LAogfTsKIAotaW50IGF2Y29kZWNfZ2V0X2NvbnRleHRfZGVmYXVsdHMzKEFWQ29kZWNDb250ZXh0ICpzLCBjb25zdCBBVkNvZGVjICpjb2RlYykKK3N0YXRpYyBpbnQgaW5pdF9jb250ZXh0X2RlZmF1bHRzKEFWQ29kZWNDb250ZXh0ICpzLCBjb25zdCBBVkNvZGVjICpjb2RlYykKIHsKICAgICBpbnQgZmxhZ3M9MDsKICAgICBtZW1zZXQocywgMCwgc2l6ZW9mKEFWQ29kZWNDb250ZXh0KSk7CkBAIC0xMTksNiArMTE4LDcgQEAKICAgICBzLT5leGVjdXRlMiAgICAgICAgICAgID0gYXZjb2RlY19kZWZhdWx0X2V4ZWN1dGUyOwogICAgIHMtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MCwxfTsKICAgICBzLT5waXhfZm10ICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9OT05FOworICAgIHMtPnN3X3BpeF9mbXQgICAgICAgICAgPSBBVl9QSVhfRk1UX05PTkU7CiAgICAgcy0+c2FtcGxlX2ZtdCAgICAgICAgICA9IEFWX1NBTVBMRV9GTVRfTk9ORTsKIAogICAgIHMtPnJlb3JkZXJlZF9vcGFxdWUgICAgPSBBVl9OT1BUU19WQUxVRTsKQEAgLTE0Niw2ICsxNDYsMTMgQEAKICAgICByZXR1cm4gMDsKIH0KIAorI2lmIEZGX0FQSV9HRVRfQ09OVEVYVF9ERUZBVUxUUworaW50IGF2Y29kZWNfZ2V0X2NvbnRleHRfZGVmYXVsdHMzKEFWQ29kZWNDb250ZXh0ICpzLCBjb25zdCBBVkNvZGVjICpjb2RlYykKK3sKKyAgICByZXR1cm4gaW5pdF9jb250ZXh0X2RlZmF1bHRzKHMsIGNvZGVjKTsKK30KKyNlbmRpZgorCiBBVkNvZGVjQ29udGV4dCAqYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb25zdCBBVkNvZGVjICpjb2RlYykKIHsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg9IGF2X21hbGxvYyhzaXplb2YoQVZDb2RlY0NvbnRleHQpKTsKQEAgLTE1Myw3ICsxNjAsNyBAQAogICAgIGlmICghYXZjdHgpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaWYoYXZjb2RlY19nZXRfY29udGV4dF9kZWZhdWx0czMoYXZjdHgsIGNvZGVjKSA8IDApeworICAgIGlmIChpbml0X2NvbnRleHRfZGVmYXVsdHMoYXZjdHgsIGNvZGVjKSA8IDApIHsKICAgICAgICAgYXZfZnJlZShhdmN0eCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE3OSw2ICsxODYsMzIgQEAKICAgICBhdl9mcmVlcChwYXZjdHgpOwogfQogCisjaWYgRkZfQVBJX0NPUFlfQ09OVEVYVAorc3RhdGljIHZvaWQgY29weV9jb250ZXh0X3Jlc2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgaTsKKworICAgIGF2X29wdF9mcmVlKGF2Y3R4KTsKKyNpZiBGRl9BUElfQ09ERURfRlJBTUUKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBhdl9mcmFtZV9mcmVlKCZhdmN0eC0+Y29kZWRfZnJhbWUpOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICBhdl9mcmVlcCgmYXZjdHgtPnJjX292ZXJyaWRlKTsKKyAgICBhdl9mcmVlcCgmYXZjdHgtPmludHJhX21hdHJpeCk7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcl9tYXRyaXgpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKyAgICBhdl9mcmVlcCgmYXZjdHgtPnN1YnRpdGxlX2hlYWRlcik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZhdmN0eC0+aHdfZnJhbWVzX2N0eCk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZhdmN0eC0+aHdfZGV2aWNlX2N0eCk7CisgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5uYl9jb2RlZF9zaWRlX2RhdGE7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9zaWRlX2RhdGFbaV0uZGF0YSk7CisgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9zaWRlX2RhdGEpOworICAgIGF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZSA9IDA7CisgICAgYXZjdHgtPm5iX2NvZGVkX3NpZGVfZGF0YSA9IDA7CisgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMDsKK30KKwogaW50IGF2Y29kZWNfY29weV9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpkZXN0LCBjb25zdCBBVkNvZGVjQ29udGV4dCAqc3JjKQogewogICAgIGNvbnN0IEFWQ29kZWMgKm9yaWdfY29kZWMgPSBkZXN0LT5jb2RlYzsKQEAgLTE5MSwxMiArMjI0LDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBhdl9vcHRfZnJlZShkZXN0KTsKLSAgICBhdl9mcmVlcCgmZGVzdC0+cmNfb3ZlcnJpZGUpOwotICAgIGF2X2ZyZWVwKCZkZXN0LT5pbnRyYV9tYXRyaXgpOwotICAgIGF2X2ZyZWVwKCZkZXN0LT5pbnRlcl9tYXRyaXgpOwotICAgIGF2X2ZyZWVwKCZkZXN0LT5leHRyYWRhdGEpOwotICAgIGF2X2ZyZWVwKCZkZXN0LT5zdWJ0aXRsZV9oZWFkZXIpOworICAgIGNvcHlfY29udGV4dF9yZXNldChkZXN0KTsKIAogICAgIG1lbWNweShkZXN0LCBzcmMsIHNpemVvZigqZGVzdCkpOwogICAgIGF2X29wdF9jb3B5KGRlc3QsIHNyYyk7CkBAIC0yMjEsMTAgKzI0OSwxNCBAQAogCiAgICAgLyogcmVhbGxvY2F0ZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgYWxsb2NhdGVkIHNlcGFyYXRlbHkgKi8KICAgICBkZXN0LT5leHRyYWRhdGEgICAgICAgPSBOVUxMOworICAgIGRlc3QtPmNvZGVkX3NpZGVfZGF0YSA9IE5VTEw7CiAgICAgZGVzdC0+aW50cmFfbWF0cml4ICAgID0gTlVMTDsKICAgICBkZXN0LT5pbnRlcl9tYXRyaXggICAgPSBOVUxMOwogICAgIGRlc3QtPnJjX292ZXJyaWRlICAgICA9IE5VTEw7CiAgICAgZGVzdC0+c3VidGl0bGVfaGVhZGVyID0gTlVMTDsKKyAgICBkZXN0LT5od19mcmFtZXNfY3R4ICAgPSBOVUxMOworICAgIGRlc3QtPmh3X2RldmljZV9jdHggICA9IE5VTEw7CisgICAgZGVzdC0+bmJfY29kZWRfc2lkZV9kYXRhID0gMDsKIAogI2RlZmluZSBhbGxvY19hbmRfY29weV9vcl9mYWlsKG9iaiwgc2l6ZSwgcGFkKSBcCiAgICAgaWYgKHNyYy0+b2JqICYmIHNpemUgPiAwKSB7IFwKQEAgLTI0NSwxOSArMjc3LDE5IEBACiAgICAgYXZfYXNzZXJ0MChkZXN0LT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZSA9PSBzcmMtPnN1YnRpdGxlX2hlYWRlcl9zaXplKTsKICN1bmRlZiBhbGxvY19hbmRfY29weV9vcl9mYWlsCiAKKyAgICBpZiAoc3JjLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGRlc3QtPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKHNyYy0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgIGlmICghZGVzdC0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKICAgICByZXR1cm4gMDsKIAogZmFpbDoKLSAgICBhdl9mcmVlcCgmZGVzdC0+cmNfb3ZlcnJpZGUpOwotICAgIGF2X2ZyZWVwKCZkZXN0LT5pbnRyYV9tYXRyaXgpOwotICAgIGF2X2ZyZWVwKCZkZXN0LT5pbnRlcl9tYXRyaXgpOwotICAgIGF2X2ZyZWVwKCZkZXN0LT5leHRyYWRhdGEpOwotICAgIGF2X2ZyZWVwKCZkZXN0LT5zdWJ0aXRsZV9oZWFkZXIpOwotICAgIGRlc3QtPnN1YnRpdGxlX2hlYWRlcl9zaXplID0gMDsKLSAgICBkZXN0LT5leHRyYWRhdGFfc2l6ZSA9IDA7Ci0gICAgYXZfb3B0X2ZyZWUoZGVzdCk7CisgICAgY29weV9jb250ZXh0X3Jlc2V0KGRlc3QpOwogICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiB9CisjZW5kaWYKIAogY29uc3QgQVZDbGFzcyAqYXZjb2RlY19nZXRfY2xhc3Modm9pZCkKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvb3B0aW9uc190YWJsZS5oIGIvbGliYXZjb2RlYy9vcHRpb25zX3RhYmxlLmgKaW5kZXggYWE4YmZhYy4uMDk5MjYxZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9vcHRpb25zX3RhYmxlLmgKKysrIGIvbGliYXZjb2RlYy9vcHRpb25zX3RhYmxlLmgKQEAgLTU0LDI2ICs1NCwxMSBAQAogeyJxcGVsIiwgInVzZSAxLzQtcGVsIG1vdGlvbiBjb21wZW5zYXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9DT0RFQ19GTEFHX1FQRUwgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiZmxhZ3MifSwKIHsibG9vcCIsICJ1c2UgbG9vcCBmaWx0ZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9DT0RFQ19GTEFHX0xPT1BfRklMVEVSIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzIn0sCiB7InFzY2FsZSIsICJ1c2UgZml4ZWQgcXNjYWxlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQ09ERUNfRkxBR19RU0NBTEUgfSwgSU5UX01JTiwgSU5UX01BWCwgMCwgImZsYWdzIn0sCi0jaWYgRkZfQVBJX0dNQwoteyJnbWMiLCAidXNlIGdtYyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfR01DIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzIn0sCi0jZW5kaWYKLSNpZiBGRl9BUElfTVYwCi17Im12MCIsICJhbHdheXMgdHJ5IGEgbWIgd2l0aCBtdj08MCwwPiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfTVYwIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzIn0sCi0jZW5kaWYKLSNpZiBGRl9BUElfSU5QVVRfUFJFU0VSVkVECi17ImlucHV0X3ByZXNlcnZlZCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IENPREVDX0ZMQUdfSU5QVVRfUFJFU0VSVkVEIH0sIElOVF9NSU4sIElOVF9NQVgsIDAsICJmbGFncyJ9LAotI2VuZGlmCiB7InBhc3MxIiwgInVzZSBpbnRlcm5hbCAyLXBhc3MgcmF0ZWNvbnRyb2wgaW4gZmlyc3QgIHBhc3MgbW9kZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0NPREVDX0ZMQUdfUEFTUzEgfSwgSU5UX01JTiwgSU5UX01BWCwgMCwgImZsYWdzIn0sCiB7InBhc3MyIiwgInVzZSBpbnRlcm5hbCAyLXBhc3MgcmF0ZWNvbnRyb2wgaW4gc2Vjb25kIHBhc3MgbW9kZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0NPREVDX0ZMQUdfUEFTUzIgfSwgSU5UX01JTiwgSU5UX01BWCwgMCwgImZsYWdzIn0sCiB7ImdyYXkiLCAib25seSBkZWNvZGUvZW5jb2RlIGdyYXlzY2FsZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0NPREVDX0ZMQUdfR1JBWSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImZsYWdzIn0sCi0jaWYgRkZfQVBJX0VNVV9FREdFCi17ImVtdV9lZGdlIiwgImRvIG5vdCBkcmF3IGVkZ2VzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19FTVVfRURHRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCAwLCAiZmxhZ3MifSwKLSNlbmRpZgogeyJwc25yIiwgImVycm9yWz9dIHZhcmlhYmxlcyB3aWxsIGJlIHNldCBkdXJpbmcgZW5jb2RpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9DT0RFQ19GTEFHX1BTTlIgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiZmxhZ3MifSwKIHsidHJ1bmNhdGVkIiwgIklucHV0IGJpdHN0cmVhbSBtaWdodCBiZSByYW5kb21seSB0cnVuY2F0ZWQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9DT0RFQ19GTEFHX1RSVU5DQVRFRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJmbGFncyJ9LAotI2lmIEZGX0FQSV9OT1JNQUxJWkVfQVFQCi17Im5hcSIsICJub3JtYWxpemUgYWRhcHRpdmUgcXVhbnRpemF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQ09ERUNfRkxBR19OT1JNQUxJWkVfQVFQIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImZsYWdzIn0sCi0jZW5kaWYKIHsiaWxkY3QiLCAidXNlIGludGVybGFjZWQgRENUIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJmbGFncyJ9LAogeyJsb3dfZGVsYXkiLCAiZm9yY2UgbG93IGRlbGF5IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQ09ERUNfRkxBR19MT1dfREVMQVkgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfEUsICJmbGFncyJ9LAogeyJnbG9iYWxfaGVhZGVyIiwgInBsYWNlIGdsb2JhbCBoZWFkZXJzIGluIGV4dHJhZGF0YSBpbnN0ZWFkIG9mIGV2ZXJ5IGtleWZyYW1lIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFLCAiZmxhZ3MifSwKQEAgLTkwLDI3ICs3NSwxMyBAQAogeyJzaG93YWxsIiwgIlNob3cgYWxsIGZyYW1lcyBiZWZvcmUgdGhlIGZpcnN0IGtleWZyYW1lIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQ09ERUNfRkxBRzJfU0hPV19BTEwgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiZmxhZ3MyIn0sCiB7ImV4cG9ydF9tdnMiLCAiZXhwb3J0IG1vdGlvbiB2ZWN0b3JzIHRocm91Z2ggZnJhbWUgc2lkZSBkYXRhIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQ09ERUNfRkxBRzJfRVhQT1JUX01WU30sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImZsYWdzMiJ9LAogeyJza2lwX21hbnVhbCIsICJkbyBub3Qgc2tpcCBzYW1wbGVzIGFuZCBleHBvcnQgc2tpcCBpbmZvcm1hdGlvbiBhcyBmcmFtZSBzaWRlIGRhdGEiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9DT0RFQ19GTEFHMl9TS0lQX01BTlVBTH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImZsYWdzMiJ9LAotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi17Im1lX21ldGhvZCIsICJzZXQgbW90aW9uIGVzdGltYXRpb24gbWV0aG9kIiwgT0ZGU0VUKG1lX21ldGhvZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBNRV9FUFpTIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCJ9LAoteyJ6ZXJvIiwgInplcm8gbW90aW9uIGVzdGltYXRpb24gKGZhc3Rlc3QpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfWkVSTyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtZV9tZXRob2QiIH0sCi17ImZ1bGwiLCAiZnVsbCBtb3Rpb24gZXN0aW1hdGlvbiAoc2xvd2VzdCkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNRV9GVUxMIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCIgfSwKLXsiZXB6cyIsICJFUFpTIG1vdGlvbiBlc3RpbWF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfRVBaUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtZV9tZXRob2QiIH0sCi17ImVzYSIsICJlc2EgbW90aW9uIGVzdGltYXRpb24gKGFsaWFzIGZvciBmdWxsKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX0ZVTEwgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAoteyJ0ZXNhIiwgInRlc2EgbW90aW9uIGVzdGltYXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNRV9URVNBIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCIgfSwKLXsiZGlhIiwgImRpYW1vbmQgbW90aW9uIGVzdGltYXRpb24gKGFsaWFzIGZvciBFUFpTKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX0VQWlMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAoteyJsb2ciLCAibG9nIG1vdGlvbiBlc3RpbWF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfTE9HIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCIgfSwKLXsicGhvZHMiLCAicGhvZHMgbW90aW9uIGVzdGltYXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNRV9QSE9EUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtZV9tZXRob2QiIH0sCi17IngxIiwgIlgxIG1vdGlvbiBlc3RpbWF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfWDEgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAoteyJoZXgiLCAiaGV4IG1vdGlvbiBlc3RpbWF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTUVfSEVYIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgIm1lX21ldGhvZCIgfSwKLXsidW1oIiwgInVtaCBtb3Rpb24gZXN0aW1hdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX1VNSCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtZV9tZXRob2QiIH0sCi17Iml0ZXIiLCAiaXRlciBtb3Rpb24gZXN0aW1hdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1FX0lURVIgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWVfbWV0aG9kIiB9LAotI2VuZGlmCi17InRpbWVfYmFzZSIsIE5VTEwsIE9GRlNFVCh0aW1lX2Jhc2UpLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwgey5kYmwgPSAwfSwgSU5UX01JTiwgSU5UX01BWH0sCit7ImFzc19yb19mbHVzaF9ub29wIiwgImRvIG5vdCByZXNldCBBU1MgUmVhZE9yZGVyIGZpZWxkIG9uIGZsdXNoIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfQ09ERUNfRkxBRzJfUk9fRkxVU0hfTk9PUH0sIElOVF9NSU4sIElOVF9NQVgsIFN8RCwgImZsYWdzMiJ9LAoreyJ0aW1lX2Jhc2UiLCBOVUxMLCBPRkZTRVQodGltZV9iYXNlKSwgQVZfT1BUX1RZUEVfUkFUSU9OQUwsIHsuZGJsID0gMH0sIDAsIElOVF9NQVh9LAogeyJnIiwgInNldCB0aGUgZ3JvdXAgb2YgcGljdHVyZSAoR09QKSBzaXplIiwgT0ZGU0VUKGdvcF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEyIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCiB7ImFyIiwgInNldCBhdWRpbyBzYW1wbGluZyByYXRlIChpbiBIeikiLCBPRkZTRVQoc2FtcGxlX3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBBfER8RX0sCiB7ImFjIiwgInNldCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBBfER8RX0sCiB7ImN1dG9mZiIsICJzZXQgY3V0b2ZmIGJhbmR3aWR0aCIsIE9GRlNFVChjdXRvZmYpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEV9LAoteyJmcmFtZV9zaXplIiwgTlVMTCwgT0ZGU0VUKGZyYW1lX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEV9LAoreyJmcmFtZV9zaXplIiwgTlVMTCwgT0ZGU0VUKGZyYW1lX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBBfEV9LAogeyJmcmFtZV9udW1iZXIiLCBOVUxMLCBPRkZTRVQoZnJhbWVfbnVtYmVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCiB7ImRlbGF5IiwgTlVMTCwgT0ZGU0VUKGRlbGF5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCiB7InFjb21wIiwgInZpZGVvIHF1YW50aXplciBzY2FsZSBjb21wcmVzc2lvbiAoVkJSKS4gQ29uc3RhbnQgb2YgcmF0ZWNvbnRyb2wgZXF1YXRpb24uICIKQEAgLTEyMCwxMSArOTEsOCBAQAogeyJxbWluIiwgIm1pbmltdW0gdmlkZW8gcXVhbnRpemVyIHNjYWxlIChWQlIpIiwgT0ZGU0VUKHFtaW4pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMiB9LCAtMSwgNjksIFZ8RX0sCiB7InFtYXgiLCAibWF4aW11bSB2aWRlbyBxdWFudGl6ZXIgc2NhbGUgKFZCUikiLCBPRkZTRVQocW1heCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAzMSB9LCAtMSwgMTAyNCwgVnxFfSwKIHsicWRpZmYiLCAibWF4aW11bSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHF1YW50aXplciBzY2FsZXMgKFZCUikiLCBPRkZTRVQobWF4X3FkaWZmKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKLXsiYmYiLCAic2V0IG1heGltdW0gbnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gbm9uLUItZnJhbWVzIiwgT0ZGU0VUKG1heF9iX2ZyYW1lcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIC0xLCBJTlRfTUFYLCBWfEV9LAoreyJiZiIsICJzZXQgbWF4aW11bSBudW1iZXIgb2YgQi1mcmFtZXMgYmV0d2VlbiBub24tQi1mcmFtZXMiLCBPRkZTRVQobWF4X2JfZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgLTEsIElOVF9NQVgsIFZ8RX0sCiB7ImJfcWZhY3RvciIsICJRUCBmYWN0b3IgYmV0d2VlbiBQLSBhbmQgQi1mcmFtZXMiLCBPRkZTRVQoYl9xdWFudF9mYWN0b3IpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAxLjI1IH0sIC1GTFRfTUFYLCBGTFRfTUFYLCBWfEV9LAotI2lmIEZGX0FQSV9SQ19TVFJBVEVHWQoteyJyY19zdHJhdGVneSIsICJyYXRlY29udHJvbCBtZXRob2QiLCBPRkZTRVQocmNfc3RyYXRlZ3kpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAotI2VuZGlmCiAjaWYgRkZfQVBJX1BSSVZBVEVfT1BUCiB7ImJfc3RyYXRlZ3kiLCAic3RyYXRlZ3kgdG8gY2hvb3NlIGJldHdlZW4gSS9QL0ItZnJhbWVzIiwgT0ZGU0VUKGJfZnJhbWVfc3RyYXRlZ3kpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAogeyJwcyIsICJSVFAgcGF5bG9hZCBzaXplIGluIGJ5dGVzIiwgT0ZGU0VUKHJ0cF9wYXlsb2FkX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LApAQCAtMTQzLDE2ICsxMTEsMTAgQEAKIHsiY29kZWNfdGFnIiwgTlVMTCwgT0ZGU0VUKGNvZGVjX3RhZyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAogeyJidWciLCAid29yayBhcm91bmQgbm90IGF1dG9kZXRlY3RlZCBlbmNvZGVyIGJ1Z3MiLCBPRkZTRVQod29ya2Fyb3VuZF9idWdzKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gRkZfQlVHX0FVVE9ERVRFQ1QgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCiB7ImF1dG9kZXRlY3QiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfQVVUT0RFVEVDVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKLSNpZiBGRl9BUElfT0xEX01TTVBFRzQKLXsib2xkX21zbXBlZzQiLCAic29tZSBvbGQgbGF2Yy1nZW5lcmF0ZWQgTVNNUEVHNHYzIGZpbGVzIChubyBhdXRvZGV0ZWN0aW9uKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19PTERfTVNNUEVHNCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKLSNlbmRpZgogeyJ4dmlkX2lsYWNlIiwgIlh2aWQgaW50ZXJsYWNpbmcgYnVnIChhdXRvZGV0ZWN0ZWQgaWYgRk9VUkNDID09IFhWSVgpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX1hWSURfSUxBQ0UgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiYnVnIn0sCiB7InVtcDQiLCAiKGF1dG9kZXRlY3RlZCBpZiBGT1VSQ0MgPT0gVU1QNCkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfVU1QNCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKIHsibm9fcGFkZGluZyIsICJwYWRkaW5nIGJ1ZyAoYXV0b2RldGVjdGVkKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19OT19QQURESU5HIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAogeyJhbXYiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfQU1WIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAotI2lmIEZGX0FQSV9BQ19WTEMKLXsiYWNfdmxjIiwgImlsbGVnYWwgVkxDIGJ1ZyAoYXV0b2RldGVjdGVkIHBlciBGT1VSQ0MpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX0FDX1ZMQyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKLSNlbmRpZgogeyJxcGVsX2Nocm9tYSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19RUEVMX0NIUk9NQSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKIHsic3RkX3FwZWwiLCAib2xkIHN0YW5kYXJkIHFwZWwgKGF1dG9kZXRlY3RlZCBwZXIgRk9VUkNDL3ZlcnNpb24pIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX1NURF9RUEVMIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAogeyJxcGVsX2Nocm9tYTIiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9CVUdfUVBFTF9DSFJPTUEyIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LApAQCAtMTYyLDEyICsxMjQsMTMgQEAKIHsiZGNfY2xpcCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19EQ19DTElQIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAogeyJtcyIsICJ3b3JrIGFyb3VuZCB2YXJpb3VzIGJ1Z3MgaW4gTWljcm9zb2Z0J3MgYnJva2VuIGRlY29kZXJzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX01TIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAogeyJ0cnVuYyIsICJ0cnVuY2F0ZWQgZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQlVHX1RSVU5DQVRFRH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImJ1ZyJ9LAoreyJpZWRnZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0JVR19JRURHRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJidWcifSwKIHsic3RyaWN0IiwgImhvdyBzdHJpY3RseSB0byBmb2xsb3cgdGhlIHN0YW5kYXJkcyIsIE9GRlNFVChzdHJpY3Rfc3RkX2NvbXBsaWFuY2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfFZ8RHxFLCAic3RyaWN0In0sCi17InZlcnkiLCAic3RyaWN0bHkgY29uZm9ybSB0byBhIG9sZGVyIG1vcmUgc3RyaWN0IHZlcnNpb24gb2YgdGhlIHNwZWMgb3IgcmVmZXJlbmNlIHNvZnR3YXJlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9WRVJZX1NUUklDVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfER8RSwgInN0cmljdCJ9LAoteyJzdHJpY3QiLCAic3RyaWN0bHkgY29uZm9ybSB0byBhbGwgdGhlIHRoaW5ncyBpbiB0aGUgc3BlYyBubyBtYXR0ZXIgd2hhdCB0aGUgY29uc2VxdWVuY2VzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9TVFJJQ1QgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfEUsICJzdHJpY3QifSwKLXsibm9ybWFsIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9OT1JNQUwgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfEUsICJzdHJpY3QifSwKLXsidW5vZmZpY2lhbCIsICJhbGxvdyB1bm9mZmljaWFsIGV4dGVuc2lvbnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfEUsICJzdHJpY3QifSwKLXsiZXhwZXJpbWVudGFsIiwgImFsbG93IG5vbi1zdGFuZGFyZGl6ZWQgZXhwZXJpbWVudGFsIHRoaW5ncyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RHxFLCAic3RyaWN0In0sCit7InZlcnkiLCAic3RyaWN0bHkgY29uZm9ybSB0byBhIG9sZGVyIG1vcmUgc3RyaWN0IHZlcnNpb24gb2YgdGhlIHNwZWMgb3IgcmVmZXJlbmNlIHNvZnR3YXJlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9WRVJZX1NUUklDVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfFZ8RHxFLCAic3RyaWN0In0sCit7InN0cmljdCIsICJzdHJpY3RseSBjb25mb3JtIHRvIGFsbCB0aGUgdGhpbmdzIGluIHRoZSBzcGVjIG5vIG1hdHRlciB3aGF0IHRoZSBjb25zZXF1ZW5jZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT01QTElBTkNFX1NUUklDVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfFZ8RHxFLCAic3RyaWN0In0sCit7Im5vcm1hbCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPTVBMSUFOQ0VfTk9STUFMIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8VnxEfEUsICJzdHJpY3QifSwKK3sidW5vZmZpY2lhbCIsICJhbGxvdyB1bm9mZmljaWFsIGV4dGVuc2lvbnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfER8RSwgInN0cmljdCJ9LAoreyJleHBlcmltZW50YWwiLCAiYWxsb3cgbm9uLXN0YW5kYXJkaXplZCBleHBlcmltZW50YWwgdGhpbmdzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfER8RSwgInN0cmljdCJ9LAogeyJiX3FvZmZzZXQiLCAiUVAgb2Zmc2V0IGJldHdlZW4gUC0gYW5kIEItZnJhbWVzIiwgT0ZGU0VUKGJfcXVhbnRfb2Zmc2V0KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMS4yNSB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKIHsiZXJyX2RldGVjdCIsICJzZXQgZXJyb3IgZGV0ZWN0aW9uIGZsYWdzIiwgT0ZGU0VUKGVycl9yZWNvZ25pdGlvbiksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEQsICJlcnJfZGV0ZWN0In0sCiB7ImNyY2NoZWNrIiwgInZlcmlmeSBlbWJlZGRlZCBDUkNzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRUZfQ1JDQ0hFQ0sgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEQsICJlcnJfZGV0ZWN0In0sCkBAIC0xNzgsMzIgKzE0MSwxOCBAQAogeyJjYXJlZnVsIiwgICAgImNvbnNpZGVyIHRoaW5ncyB0aGF0IHZpb2xhdGUgdGhlIHNwZWMsIGFyZSBmYXN0IHRvIGNoZWNrIGFuZCBoYXZlIG5vdCBiZWVuIHNlZW4gaW4gdGhlIHdpbGQgYXMgZXJyb3JzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRUZfQ0FSRUZVTCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfFZ8RCwgImVycl9kZXRlY3QifSwKIHsiY29tcGxpYW50IiwgICJjb25zaWRlciBhbGwgc3BlYyBub24gY29tcGxpYW5jaWVzIGFzIGVycm9ycyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0VGX0NPTVBMSUFOVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfFZ8RCwgImVycl9kZXRlY3QifSwKIHsiYWdncmVzc2l2ZSIsICJjb25zaWRlciB0aGluZ3MgdGhhdCBhIHNhbmUgZW5jb2RlciBzaG91bGQgbm90IGRvIGFzIGFuIGVycm9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfRUZfQUdHUkVTU0lWRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfFZ8RCwgImVycl9kZXRlY3QifSwKLXsiaGFzX2JfZnJhbWVzIiwgTlVMTCwgT0ZGU0VUKGhhc19iX2ZyYW1lcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAoteyJibG9ja19hbGlnbiIsIE5VTEwsIE9GRlNFVChibG9ja19hbGlnbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAoreyJoYXNfYl9mcmFtZXMiLCBOVUxMLCBPRkZTRVQoaGFzX2JfZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWH0sCit7ImJsb2NrX2FsaWduIiwgTlVMTCwgT0ZGU0VUKGJsb2NrX2FsaWduKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWH0sCiAjaWYgRkZfQVBJX1BSSVZBVEVfT1BUCiB7Im1wZWdfcXVhbnQiLCAidXNlIE1QRUcgcXVhbnRpemVycyBpbnN0ZWFkIG9mIEguMjYzIiwgT0ZGU0VUKG1wZWdfcXVhbnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAogI2VuZGlmCi0jaWYgRkZfQVBJX01QVl9PUFQKLXsicXNxdWlzaCIsICJkZXByZWNhdGVkLCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZCIsIE9GRlNFVChyY19xc3F1aXNoKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gREVGQVVMVCB9LCAwLCA5OSwgVnxFfSwKLXsicmNfcW1vZF9hbXAiLCAgImRlcHJlY2F0ZWQsIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkIiwgT0ZGU0VUKHJjX3Ftb2RfYW1wKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gREVGQVVMVCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKLXsicmNfcW1vZF9mcmVxIiwgImRlcHJlY2F0ZWQsIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkIiwgT0ZGU0VUKHJjX3Ftb2RfZnJlcSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCi0jZW5kaWYKIHsicmNfb3ZlcnJpZGVfY291bnQiLCBOVUxMLCBPRkZTRVQocmNfb3ZlcnJpZGVfY291bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKLSNpZiBGRl9BUElfTVBWX09QVAoteyJyY19lcSIsICJkZXByZWNhdGVkLCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZCIsIE9GRlNFVChyY19lcSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBWfEV9LAotI2VuZGlmCiB7Im1heHJhdGUiLCAibWF4aW11bSBiaXRyYXRlIChpbiBiaXRzL3MpLiBVc2VkIGZvciBWQlYgdG9nZXRoZXIgd2l0aCBidWZzaXplLiIsIE9GRlNFVChyY19tYXhfcmF0ZSksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWCwgVnxBfEV9LAogeyJtaW5yYXRlIiwgIm1pbmltdW0gYml0cmF0ZSAoaW4gYml0cy9zKS4gTW9zdCB1c2VmdWwgaW4gc2V0dGluZyB1cCBhIENCUiBlbmNvZGUuIEl0IGlzIG9mIGxpdHRsZSB1c2Ugb3RoZXJ3aXNlLiIsCiAgICAgICAgICAgICBPRkZTRVQocmNfbWluX3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8QXxFfSwKIHsiYnVmc2l6ZSIsICJzZXQgcmF0ZWNvbnRyb2wgYnVmZmVyIHNpemUgKGluIGJpdHMpIiwgT0ZGU0VUKHJjX2J1ZmZlcl9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxWfEV9LAotI2lmIEZGX0FQSV9NUFZfT1BUCi17InJjX2J1Zl9hZ2dyZXNzaXZpdHkiLCAiZGVwcmVjYXRlZCwgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQiLCBPRkZTRVQocmNfYnVmZmVyX2FnZ3Jlc3Npdml0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDEuMCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKLSNlbmRpZgogeyJpX3FmYWN0b3IiLCAiUVAgZmFjdG9yIGJldHdlZW4gUC0gYW5kIEktZnJhbWVzIiwgT0ZGU0VUKGlfcXVhbnRfZmFjdG9yKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gLTAuOCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKIHsiaV9xb2Zmc2V0IiwgIlFQIG9mZnNldCBiZXR3ZWVuIFAtIGFuZCBJLWZyYW1lcyIsIE9GRlNFVChpX3F1YW50X29mZnNldCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IDAuMCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKLSNpZiBGRl9BUElfTVBWX09QVAoteyJyY19pbml0X2NwbHgiLCAiZGVwcmVjYXRlZCwgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQiLCBPRkZTRVQocmNfaW5pdGlhbF9jcGx4KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gREVGQVVMVCB9LCAtRkxUX01BWCwgRkxUX01BWCwgVnxFfSwKLSNlbmRpZgogeyJkY3QiLCAiRENUIGFsZ29yaXRobSIsIE9GRlNFVChkY3RfYWxnbyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIDAsIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAogeyJhdXRvIiwgImF1dG9zZWxlY3QgYSBnb29kIG9uZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RDVF9BVVRPIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRjdCJ9LAogeyJmYXN0aW50IiwgImZhc3QgaW50ZWdlciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RDVF9GQVNUSU5UIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRjdCJ9LApAQCAtMjIzLDE5ICsxNzIsMTAgQEAKIHsic2ltcGxlbW14IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVNTVggfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJpZGN0In0sCiB7ImFybSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfQVJNIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAogeyJhbHRpdmVjIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9BTFRJVkVDIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAotI2lmIEZGX0FQSV9BUkNIX1NINAoteyJzaDQiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NINCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKLSNlbmRpZgogeyJzaW1wbGVhcm0iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NJTVBMRUFSTSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKIHsic2ltcGxlYXJtdjV0ZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfU0lNUExFQVJNVjVURSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKIHsic2ltcGxlYXJtdjYiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX1NJTVBMRUFSTVY2IH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAogeyJzaW1wbGVuZW9uIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVORU9OIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAotI2lmIEZGX0FQSV9BUkNIX0FMUEhBCi17InNpbXBsZWFscGhhIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9TSU1QTEVBTFBIQSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKLSNlbmRpZgotI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUwoteyJpcHAiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9JRENUX0lQUCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKLSNlbmRpZiAvKiBGRl9BUElfVU5VU0VEX01FTUJFUlMgKi8KIHsieHZpZCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfWFZJRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImlkY3QifSwKIHsieHZpZG1teCIsICJkZXByZWNhdGVkLCBmb3IgY29tcGF0aWJpbGl0eSBvbmx5IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfSURDVF9YVklEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiaWRjdCJ9LAogeyJmYWFuaSIsICJmbG9hdGluZyBwb2ludCBBQU4gSURDVCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0lEQ1RfRkFBTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfER8RSwgImlkY3QifSwKQEAgLTI0NSw3ICsxODUsNyBAQAogeyJndWVzc19tdnMiLCAiaXRlcmF0aXZlIG1vdGlvbiB2ZWN0b3IgKE1WKSBzZWFyY2ggKHNsb3cpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfRUNfR1VFU1NfTVZTIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImVjIn0sCiB7ImRlYmxvY2siLCAidXNlIHN0cm9uZyBkZWJsb2NrIGZpbHRlciBmb3IgZGFtYWdlZCBNQnMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9FQ19ERUJMT0NLIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImVjIn0sCiB7ImZhdm9yX2ludGVyIiwgImZhdm9yIHByZWRpY3RpbmcgZnJvbSB0aGUgcHJldmlvdXMgZnJhbWUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9FQ19GQVZPUl9JTlRFUiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJlYyJ9LAoteyJiaXRzX3Blcl9jb2RlZF9zYW1wbGUiLCBOVUxMLCBPRkZTRVQoYml0c19wZXJfY29kZWRfc2FtcGxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCit7ImJpdHNfcGVyX2NvZGVkX3NhbXBsZSIsIE5VTEwsIE9GRlNFVChiaXRzX3Blcl9jb2RlZF9zYW1wbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYfSwKICNpZiBGRl9BUElfUFJJVkFURV9PUFQKIHsicHJlZCIsICJwcmVkaWN0aW9uIG1ldGhvZCIsIE9GRlNFVChwcmVkaWN0aW9uX21ldGhvZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgInByZWQifSwKIHsibGVmdCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BSRURfTEVGVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJwcmVkIn0sCkBAIC0yNTMsNiArMTkzLDcgQEAKIHsibWVkaWFuIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUFJFRF9NRURJQU4gfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAicHJlZCJ9LAogI2VuZGlmCiB7ImFzcGVjdCIsICJzYW1wbGUgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHNhbXBsZV9hc3BlY3RfcmF0aW8pLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwgey5kYmwgPSAwfSwgMCwgMTAsIFZ8RX0sCit7InNhciIsICAgICJzYW1wbGUgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHNhbXBsZV9hc3BlY3RfcmF0aW8pLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwgey5kYmwgPSAwfSwgMCwgMTAsIFZ8RX0sCiB7ImRlYnVnIiwgInByaW50IHNwZWNpZmljIGRlYnVnIGluZm8iLCBPRkZTRVQoZGVidWcpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSBERUZBVUxUIH0sIDAsIElOVF9NQVgsIFZ8QXxTfEV8RCwgImRlYnVnIn0sCiB7InBpY3QiLCAicGljdHVyZSBpbmZvIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfUElDVF9JTkZPIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCiB7InJjIiwgInJhdGUgY29udHJvbCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX1JDIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImRlYnVnIn0sCkBAIC0yNjYsMjMgKzIwNywxNiBAQAogeyJncmVlbl9tZXRhZGF0YSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX0dSRUVOX01EIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCiB7InNraXAiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19TS0lQIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCiB7InN0YXJ0Y29kZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX1NUQVJUQ09ERSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAotI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUwoteyJwdHMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19QVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiZGVidWcifSwKLSNlbmRpZiAvKiBGRl9BUElfVU5VU0VEX01FTUJFUlMgKi8KIHsiZXIiLCAiZXJyb3IgcmVjb2duaXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19FUiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAogeyJtbWNvIiwgIm1lbW9yeSBtYW5hZ2VtZW50IGNvbnRyb2wgb3BlcmF0aW9ucyAoSC4yNjQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfTU1DTyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAogeyJidWdzIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfQlVHUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEQsICJkZWJ1ZyJ9LAorI2lmIEZGX0FQSV9ERUJVR19NVgogeyJ2aXNfcXAiLCAidmlzdWFsaXplIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKFFQKSwgbG93ZXIgUVAgYXJlIHRpbnRlZCBncmVlbmVyIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfVklTX1FQIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCiB7InZpc19tYl90eXBlIiwgInZpc3VhbGl6ZSBibG9jayB0eXBlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX1ZJU19NQl9UWVBFIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnIn0sCisjZW5kaWYKIHsiYnVmZmVycyIsICJwaWN0dXJlIGJ1ZmZlciBhbGxvY2F0aW9ucyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX0JVRkZFUlMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiZGVidWcifSwKIHsidGhyZWFkX29wcyIsICJ0aHJlYWRpbmcgb3BlcmF0aW9ucyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX1RIUkVBRFMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxBfEQsICJkZWJ1ZyJ9LAogeyJub21jIiwgInNraXAgbW90aW9uIGNvbXBlbnNhdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0RFQlVHX05PTUMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxBfEQsICJkZWJ1ZyJ9LAotI2lmIEZGX0FQSV9WSVNNVgoteyJ2aXNtdiIsICJ2aXN1YWxpemUgbW90aW9uIHZlY3RvcnMgKE1WcykgKGRlcHJlY2F0ZWQpIiwgT0ZGU0VUKGRlYnVnX212KSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBWfEQsICJkZWJ1Z19tdiJ9LAoteyJwZiIsICJmb3J3YXJkIHByZWRpY3RlZCBNVnMgb2YgUC1mcmFtZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19WSVNfTVZfUF9GT1IgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxELCAiZGVidWdfbXYifSwKLXsiYmYiLCAiZm9yd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEItZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfREVCVUdfVklTX01WX0JfRk9SIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnX212In0sCi17ImJiIiwgImJhY2t3YXJkIHByZWRpY3RlZCBNVnMgb2YgQi1mcmFtZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9ERUJVR19WSVNfTVZfQl9CQUNLIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RCwgImRlYnVnX212In0sCi0jZW5kaWYKIHsiY21wIiwgImZ1bGwtcGVsIE1FIGNvbXBhcmUgZnVuY3Rpb24iLCBPRkZTRVQobWVfY21wKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKIHsic3ViY21wIiwgInN1Yi1wZWwgTUUgY29tcGFyZSBmdW5jdGlvbiIsIE9GRlNFVChtZV9zdWJfY21wKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKIHsibWJjbXAiLCAibWFjcm9ibG9jayBjb21wYXJlIGZ1bmN0aW9uIiwgT0ZGU0VUKG1iX2NtcCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImNtcF9mdW5jIn0sCkBAIC0zMTAsMTYgKzI0NCwxMCBAQAogI2VuZGlmCiB7ImRjdG1heCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9EQ1RNQVggfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY21wX2Z1bmMifSwKIHsiY2hyb21hIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ01QX0NIUk9NQSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjbXBfZnVuYyJ9LAoreyJtc2FkIiwgInN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcywgbWVkaWFuIHByZWRpY3RlZCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NNUF9NRURJQU5fU0FEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImNtcF9mdW5jIn0sCiB7InByZV9kaWFfc2l6ZSIsICJkaWFtb25kIHR5cGUgJiBzaXplIGZvciBtb3Rpb24gZXN0aW1hdGlvbiBwcmUtcGFzcyIsIE9GRlNFVChwcmVfZGlhX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAogeyJzdWJxIiwgInN1Yi1wZWwgbW90aW9uIGVzdGltYXRpb24gcXVhbGl0eSIsIE9GRlNFVChtZV9zdWJwZWxfcXVhbGl0eSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA4IH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCi0jaWYgRkZfQVBJX0FGRAoteyJkdGdfYWN0aXZlX2Zvcm1hdCIsIE5VTEwsIE9GRlNFVChkdGdfYWN0aXZlX2Zvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAotI2VuZGlmCiB7Im1lX3JhbmdlIiwgImxpbWl0IG1vdGlvbiB2ZWN0b3JzIHJhbmdlICgxMDIzIGZvciBEaXZYIHBsYXllcikiLCBPRkZTRVQobWVfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAotI2lmIEZGX0FQSV9RVUFOVF9CSUFTCi17ImliaWFzIiwgImludHJhIHF1YW50IGJpYXMiLCBPRkZTRVQoaW50cmFfcXVhbnRfYmlhcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9ERUZBVUxUX1FVQU5UX0JJQVMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKLXsicGJpYXMiLCAiaW50ZXIgcXVhbnQgYmlhcyIsIE9GRlNFVChpbnRlcl9xdWFudF9iaWFzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEZGX0RFRkFVTFRfUVVBTlRfQklBUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAotI2VuZGlmCiB7Imdsb2JhbF9xdWFsaXR5IiwgTlVMTCwgT0ZGU0VUKGdsb2JhbF9xdWFsaXR5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxBfEV9LAogI2lmIEZGX0FQSV9DT0RFUl9UWVBFCiB7ImNvZGVyIiwgTlVMTCwgT0ZGU0VUKGNvZGVyX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjb2RlciJ9LApAQCAtMzI3LDQ1ICsyNTUsMjUgQEAKIHsiYWMiLCAiYXJpdGhtZXRpYyBjb2RlciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPREVSX1RZUEVfQUMgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY29kZXIifSwKIHsicmF3IiwgInJhdyAobm8gZW5jb2RpbmcpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09ERVJfVFlQRV9SQVcgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY29kZXIifSwKIHsicmxlIiwgInJ1bi1sZW5ndGggY29kZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT0RFUl9UWVBFX1JMRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJjb2RlciJ9LAotI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUwoteyJkZWZsYXRlIiwgImRlZmxhdGUtYmFzZWQgY29kZXIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT0RFUl9UWVBFX0RFRkxBVEUgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAiY29kZXIifSwKLSNlbmRpZiAvKiBGRl9BUElfVU5VU0VEX01FTUJFUlMgKi8KICNlbmRpZiAvKiBGRl9BUElfQ09ERVJfVFlQRSAqLwogI2lmIEZGX0FQSV9QUklWQVRFX09QVAogeyJjb250ZXh0IiwgImNvbnRleHQgbW9kZWwiLCBPRkZTRVQoY29udGV4dF9tb2RlbCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCiAjZW5kaWYKIHsic2xpY2VfZmxhZ3MiLCBOVUxMLCBPRkZTRVQoc2xpY2VfZmxhZ3MpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYfSwKLSNpZiBGRl9BUElfWFZNQwoteyJ4dm1jX2FjY2VsZXJhdGlvbiIsIE5VTEwsIE9GRlNFVCh4dm1jX2FjY2VsZXJhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAotI2VuZGlmIC8qIEZGX0FQSV9YVk1DICovCiB7Im1iZCIsICJtYWNyb2Jsb2NrIGRlY2lzaW9uIGFsZ29yaXRobSAoaGlnaCBxdWFsaXR5IG1vZGUpIiwgT0ZGU0VUKG1iX2RlY2lzaW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgMiwgVnxFLCAibWJkIn0sCiB7InNpbXBsZSIsICJ1c2UgbWJjbXAiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NQl9ERUNJU0lPTl9TSU1QTEUgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWJkIn0sCiB7ImJpdHMiLCAidXNlIGZld2VzdCBiaXRzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTUJfREVDSVNJT05fQklUUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJtYmQifSwKIHsicmQiLCAidXNlIGJlc3QgcmF0ZSBkaXN0b3J0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTUJfREVDSVNJT05fUkQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFLCAibWJkIn0sCi0jaWYgRkZfQVBJX1NUUkVBTV9DT0RFQ19UQUcKLXsic3RyZWFtX2NvZGVjX3RhZyIsIE5VTEwsIE9GRlNFVChzdHJlYW1fY29kZWNfdGFnKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWH0sCi0jZW5kaWYKICNpZiBGRl9BUElfUFJJVkFURV9PUFQKIHsic2NfdGhyZXNob2xkIiwgInNjZW5lIGNoYW5nZSB0aHJlc2hvbGQiLCBPRkZTRVQoc2NlbmVjaGFuZ2VfdGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKICNlbmRpZgotI2lmIEZGX0FQSV9NUFZfT1BUCi17ImxtaW4iLCAiZGVwcmVjYXRlZCwgdXNlIGVuY29kZXIgcHJpdmF0ZSBvcHRpb25zIGluc3RlYWQiLCBPRkZTRVQobG1pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAgMCB9LCAwLCBJTlRfTUFYLCBWfEV9LAoteyJsbWF4IiwgImRlcHJlY2F0ZWQsIHVzZSBlbmNvZGVyIHByaXZhdGUgb3B0aW9ucyBpbnN0ZWFkIiwgT0ZGU0VUKGxtYXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gIDAgfSwgMCwgSU5UX01BWCwgVnxFfSwKLSNlbmRpZgogI2lmIEZGX0FQSV9QUklWQVRFX09QVAogeyJuciIsICJub2lzZSByZWR1Y3Rpb24iLCBPRkZTRVQobm9pc2VfcmVkdWN0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKICNlbmRpZgogeyJyY19pbml0X29jY3VwYW5jeSIsICJudW1iZXIgb2YgYml0cyB3aGljaCBzaG91bGQgYmUgbG9hZGVkIGludG8gdGhlIHJjIGJ1ZmZlciBiZWZvcmUgZGVjb2Rpbmcgc3RhcnRzIiwgT0ZGU0VUKHJjX2luaXRpYWxfYnVmZmVyX29jY3VwYW5jeSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCiB7ImZsYWdzMiIsIE5VTEwsIE9GRlNFVChmbGFnczIpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSBERUZBVUxUfSwgMCwgVUlOVF9NQVgsIFZ8QXxFfEQsICJmbGFnczIifSwKLSNpZiBGRl9BUElfRVJST1JfUkFURQoteyJlcnJvciIsIE5VTEwsIE9GRlNFVChlcnJvcl9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKLSNlbmRpZgogeyJ0aHJlYWRzIiwgInNldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMiLCBPRkZTRVQodGhyZWFkX2NvdW50KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEgfSwgMCwgSU5UX01BWCwgVnxBfEV8RCwgInRocmVhZHMifSwKIHsiYXV0byIsICJhdXRvZGV0ZWN0IGEgc3VpdGFibGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgInRocmVhZHMifSwKLSNpZiBGRl9BUElfTVBWX09QVAoteyJtZV90aHJlc2hvbGQiLCAibW90aW9uIGVzdGltYXRpb24gdGhyZXNob2xkIiwgT0ZGU0VUKG1lX3RocmVzaG9sZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RX0sCi17Im1iX3RocmVzaG9sZCIsICJtYWNyb2Jsb2NrIHRocmVzaG9sZCIsIE9GRlNFVChtYl90aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAotI2VuZGlmCiB7ImRjIiwgImludHJhX2RjX3ByZWNpc2lvbiIsIE9GRlNFVChpbnRyYV9kY19wcmVjaXNpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAtOCwgMTYsIFZ8RX0sCiB7Im5zc2V3IiwgIm5zc2Ugd2VpZ2h0IiwgT0ZGU0VUKG5zc2Vfd2VpZ2h0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDggfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKIHsic2tpcF90b3AiLCAibnVtYmVyIG9mIG1hY3JvYmxvY2sgcm93cyBhdCB0aGUgdG9wIHdoaWNoIGFyZSBza2lwcGVkIiwgT0ZGU0VUKHNraXBfdG9wKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxEfSwKQEAgLTM5MSw2ICsyOTksOCBAQAogeyJtcGVnNF9jb3JlIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUFJPRklMRV9NUEVHNF9DT1JFIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgInByb2ZpbGUifSwKIHsibXBlZzRfbWFpbiIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1BST0ZJTEVfTVBFRzRfTUFJTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJwcm9maWxlIn0sCiB7Im1wZWc0X2FzcCIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9QUk9GSUxFX01QRUc0X0FEVkFOQ0VEX1NJTVBMRSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJwcm9maWxlIn0sCit7Im1haW4xMCIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9QUk9GSUxFX0hFVkNfTUFJTl8xMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEUsICJwcm9maWxlIn0sCit7Im1zYmMiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUFJPRklMRV9TQkNfTVNCQyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEUsICJwcm9maWxlIn0sCiB7ImxldmVsIiwgTlVMTCwgT0ZGU0VUKGxldmVsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEZGX0xFVkVMX1VOS05PV04gfSwgSU5UX01JTiwgSU5UX01BWCwgVnxBfEUsICJsZXZlbCJ9LAogeyJ1bmtub3duIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTEVWRUxfVU5LTk9XTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEF8RSwgImxldmVsIn0sCiB7Imxvd3JlcyIsICJkZWNvZGUgYXQgMT0gMS8yLCAyPTEvNCwgMz0xLzggcmVzb2x1dGlvbnMiLCBPRkZTRVQobG93cmVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgVnxBfER9LApAQCAtNDAwLDkgKzMxMCw2IEBACiB7InNraXBfZXhwIiwgImZyYW1lIHNraXAgZXhwb25lbnQiLCBPRkZTRVQoZnJhbWVfc2tpcF9leHApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV9LAogeyJza2lwY21wIiwgImZyYW1lIHNraXAgY29tcGFyZSBmdW5jdGlvbiIsIE9GRlNFVChmcmFtZV9za2lwX2NtcCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9DTVBfRENUTUFYIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RSwgImNtcF9mdW5jIn0sCiAjZW5kaWYKLSNpZiBGRl9BUElfTVBWX09QVAoteyJib3JkZXJfbWFzayIsICJkZXByZWNhdGVkLCB1c2UgZW5jb2RlciBwcml2YXRlIG9wdGlvbnMgaW5zdGVhZCIsIE9GRlNFVChib3JkZXJfbWFza2luZyksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibCA9IERFRkFVTFQgfSwgLUZMVF9NQVgsIEZMVF9NQVgsIFZ8RX0sCi0jZW5kaWYKIHsibWJsbWluIiwgIm1pbmltdW0gbWFjcm9ibG9jayBMYWdyYW5nZSBmYWN0b3IgKFZCUikiLCBPRkZTRVQobWJfbG1pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9RUDJMQU1CREEgKiAyIH0sIDEsIEZGX0xBTUJEQV9NQVgsIFZ8RX0sCiB7Im1ibG1heCIsICJtYXhpbXVtIG1hY3JvYmxvY2sgTGFncmFuZ2UgZmFjdG9yIChWQlIpIiwgT0ZGU0VUKG1iX2xtYXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRkZfUVAyTEFNQkRBICogMzEgfSwgMSwgRkZfTEFNQkRBX01BWCwgVnxFfSwKICNpZiBGRl9BUElfUFJJVkFURV9PUFQKQEAgLTQyOCw5ICszMzUsNiBAQAogeyJjaHJvbWFvZmZzZXQiLCAiY2hyb21hIFFQIG9mZnNldCBmcm9tIGx1bWEiLCBPRkZTRVQoY2hyb21hb2Zmc2V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfSwKICNlbmRpZgogeyJ0cmVsbGlzIiwgInJhdGUtZGlzdG9ydGlvbiBvcHRpbWFsIHF1YW50aXphdGlvbiIsIE9GRlNFVCh0cmVsbGlzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxBfEV9LAotI2lmIEZGX0FQSV9VTlVTRURfTUVNQkVSUwoteyJzY19mYWN0b3IiLCAibXVsdGlwbGllZCBieSBxc2NhbGUgZm9yIGVhY2ggZnJhbWUgYW5kIGFkZGVkIHRvIHNjZW5lX2NoYW5nZV9zY29yZSIsIE9GRlNFVChzY2VuZWNoYW5nZV9mYWN0b3IpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNiB9LCAwLCBJTlRfTUFYLCBWfEV9LAotI2VuZGlmIC8qIEZGX0FQSV9VTlVTRURfTUVNQkVSUyAqLwogeyJtdjBfdGhyZXNob2xkIiwgTlVMTCwgT0ZGU0VUKG12MF90aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMjU2IH0sIDAsIElOVF9NQVgsIFZ8RX0sCiAjaWYgRkZfQVBJX1BSSVZBVEVfT1BUCiB7ImJfc2Vuc2l0aXZpdHkiLCAiYWRqdXN0IHNlbnNpdGl2aXR5IG9mIGJfZnJhbWVfc3RyYXRlZ3kgMSIsIE9GRlNFVChiX3NlbnNpdGl2aXR5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDQwIH0sIDEsIElOVF9NQVgsIFZ8RX0sCkBAIC00NDEsMzAgKzM0NSw0NiBAQAogeyJtYXhfcHJlZGljdGlvbl9vcmRlciIsIE5VTEwsIE9GRlNFVChtYXhfcHJlZGljdGlvbl9vcmRlciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEV9LAogeyJ0aW1lY29kZV9mcmFtZV9zdGFydCIsICJHT1AgdGltZWNvZGUgZnJhbWUgc3RhcnQgbnVtYmVyLCBpbiBub24tZHJvcC1mcmFtZSBmb3JtYXQiLCBPRkZTRVQodGltZWNvZGVfZnJhbWVfc3RhcnQpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSAtMSB9LCAtMSwgSU5UNjRfTUFYLCBWfEV9LAogI2VuZGlmCi17ImJpdHNfcGVyX3Jhd19zYW1wbGUiLCBOVUxMLCBPRkZTRVQoYml0c19wZXJfcmF3X3NhbXBsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIElOVF9NSU4sIElOVF9NQVh9LAoteyJjaGFubmVsX2xheW91dCIsIE5VTEwsIE9GRlNFVChjaGFubmVsX2xheW91dCksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UNjRfTUFYLCBBfEV8RCwgImNoYW5uZWxfbGF5b3V0In0sCi17InJlcXVlc3RfY2hhbm5lbF9sYXlvdXQiLCBOVUxMLCBPRkZTRVQocmVxdWVzdF9jaGFubmVsX2xheW91dCksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UNjRfTUFYLCBBfEQsICJyZXF1ZXN0X2NoYW5uZWxfbGF5b3V0In0sCit7ImJpdHNfcGVyX3Jhd19zYW1wbGUiLCBOVUxMLCBPRkZTRVQoYml0c19wZXJfcmF3X3NhbXBsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBERUZBVUxUIH0sIDAsIElOVF9NQVh9LAoreyJjaGFubmVsX2xheW91dCIsIE5VTEwsIE9GRlNFVChjaGFubmVsX2xheW91dCksIEFWX09QVF9UWVBFX1VJTlQ2NCwgey5pNjQgPSBERUZBVUxUIH0sIDAsIFVJTlQ2NF9NQVgsIEF8RXxELCAiY2hhbm5lbF9sYXlvdXQifSwKK3sicmVxdWVzdF9jaGFubmVsX2xheW91dCIsIE5VTEwsIE9GRlNFVChyZXF1ZXN0X2NoYW5uZWxfbGF5b3V0KSwgQVZfT1BUX1RZUEVfVUlOVDY0LCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgVUlOVDY0X01BWCwgQXxELCAicmVxdWVzdF9jaGFubmVsX2xheW91dCJ9LAogeyJyY19tYXhfdmJ2X3VzZSIsIE5VTEwsIE9GRlNFVChyY19tYXhfYXZhaWxhYmxlX3Zidl91c2UpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAwIH0sIDAuMCwgRkxUX01BWCwgVnxFfSwKIHsicmNfbWluX3Zidl91c2UiLCBOVUxMLCBPRkZTRVQocmNfbWluX3Zidl9vdmVyZmxvd191c2UpLCAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMyB9LCAgICAgMC4wLCBGTFRfTUFYLCBWfEV9LAogeyJ0aWNrc19wZXJfZnJhbWUiLCBOVUxMLCBPRkZTRVQodGlja3NfcGVyX2ZyYW1lKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEgfSwgMSwgSU5UX01BWCwgQXxWfEV8RH0sCi17ImNvbG9yX3ByaW1hcmllcyIsICJjb2xvciBwcmltYXJpZXMiLCBPRkZTRVQoY29sb3JfcHJpbWFyaWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB9LCAxLCBBVkNPTF9QUklfTkItMSwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAoreyJjb2xvcl9wcmltYXJpZXMiLCAiY29sb3IgcHJpbWFyaWVzIiwgT0ZGU0VUKGNvbG9yX3ByaW1hcmllcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQgfSwgMSwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAogeyJidDcwOSIsICAgICAgICJCVC43MDkiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9CVDcwOSB9LCAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAoteyJ1bnNwZWNpZmllZCIsICJVbnNwZWNpZmllZCIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB9LCAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAoreyJ1bmtub3duIiwgICAgICJVbnNwZWNpZmllZCIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB9LCAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAogeyJidDQ3MG0iLCAgICAgICJCVC40NzAgTSIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9CVDQ3ME0gfSwgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAogeyJidDQ3MGJnIiwgICAgICJCVC40NzAgQkciLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9CVDQ3MEJHIH0sICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAogeyJzbXB0ZTE3MG0iLCAgICJTTVBURSAxNzAgTSIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9TTVBURTE3ME0gfSwgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAogeyJzbXB0ZTI0MG0iLCAgICJTTVBURSAyNDAgTSIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9TTVBURTI0ME0gfSwgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAogeyJmaWxtIiwgICAgICAgICJGaWxtIiwgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9GSUxNIH0sICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAogeyJidDIwMjAiLCAgICAgICJCVC4yMDIwIiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9CVDIwMjAgfSwgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAoteyJzbXB0ZTQyOF8xIiwgICJTTVBURSBTVCA0MjgtMSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1BSSV9TTVBURVNUNDI4XzEgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcl9wcmltYXJpZXNfdHlwZSJ9LAoteyJjb2xvcl90cmMiLCAiY29sb3IgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzIiwgT0ZGU0VUKGNvbG9yX3RyYyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfSwgMSwgQVZDT0xfVFJDX05CLTEsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3sic21wdGU0MjgiLCAgICAiU01QVEUgNDI4LTEiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9QUklfU01QVEU0MjggfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3sic21wdGU0MjhfMSIsICAiU01QVEUgNDI4LTEiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9QUklfU01QVEU0MjggfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3sic21wdGU0MzEiLCAgICAiU01QVEUgNDMxLTIiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9QUklfU01QVEU0MzEgfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3sic21wdGU0MzIiLCAgICAiU01QVEUgNDIyLTEiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9QUklfU01QVEU0MzIgfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3siamVkZWMtcDIyIiwgICAiSkVERUMgUDIyIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9QUklfSkVERUNfUDIyIH0sICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3sidW5zcGVjaWZpZWQiLCAiVW5zcGVjaWZpZWQiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQgfSwgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcHJpbWFyaWVzX3R5cGUifSwKK3siY29sb3JfdHJjIiwgImNvbG9yIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcyIsIE9GRlNFVChjb2xvcl90cmMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEIH0sIDEsIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsiYnQ3MDkiLCAgICAgICAgIkJULjcwOSIsICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfQlQ3MDkgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKLXsidW5zcGVjaWZpZWQiLCAgIlVuc3BlY2lmaWVkIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfSwgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3sidW5rbm93biIsICAgICAgIlVuc3BlY2lmaWVkIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfSwgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsiZ2FtbWEyMiIsICAgICAgIkJULjQ3MCBNIiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfR0FNTUEyMiB9LCAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsiZ2FtbWEyOCIsICAgICAgIkJULjQ3MCBCRyIsICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfR0FNTUEyOCB9LCAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsic21wdGUxNzBtIiwgICAgIlNNUFRFIDE3MCBNIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfU01QVEUxNzBNIH0sICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsic21wdGUyNDBtIiwgICAgIlNNUFRFIDI0MCBNIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfU01QVEUyNDBNIH0sICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsibGluZWFyIiwgICAgICAgIkxpbmVhciIsICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfTElORUFSIH0sICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3sibG9nMTAwIiwgICAgICAgIkxvZyIsICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfTE9HIH0sICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3sibG9nMzE2IiwgICAgICAgIkxvZyBzcXVhcmUgcm9vdCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfTE9HX1NRUlQgfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3siaWVjNjE5NjYtMi00IiwgIklFQyA2MTk2Ni0yLTQiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfSUVDNjE5NjZfMl80IH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3siYnQxMzYxZSIsICAgICAgIkJULjEzNjEiLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfQlQxMzYxX0VDRyB9LCAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3siaWVjNjE5NjYtMi0xIiwgIklFQyA2MTk2Ni0yLTEiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfSUVDNjE5NjZfMl8xIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3siYnQyMDIwLTEwIiwgICAgIkJULjIwMjAgLSAxMCBiaXQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfQlQyMDIwXzEwIH0sICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3siYnQyMDIwLTEyIiwgICAgIkJULjIwMjAgLSAxMiBiaXQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfQlQyMDIwXzEyIH0sICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3sic21wdGUyMDg0IiwgICAgIlNNUFRFIDIwODQiLCAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfU01QVEUyMDg0IH0sICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3sic21wdGU0MjgiLCAgICAgIlNNUFRFIDQyOC0xIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfU01QVEU0MjggfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3siYXJpYi1zdGQtYjY3IiwgIkFSSUIgU1RELUI2NyIsICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfQVJJQl9TVERfQjY3IH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKK3sidW5zcGVjaWZpZWQiLCAgIlVuc3BlY2lmaWVkIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfSwgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsibG9nIiwgICAgICAgICAgIkxvZyIsICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfTE9HIH0sICAgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsibG9nX3NxcnQiLCAgICAgIkxvZyBzcXVhcmUgcm9vdCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfTE9HX1NRUlQgfSwgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKIHsiaWVjNjE5NjZfMl80IiwgIklFQyA2MTk2Ni0yLTQiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9UUkNfSUVDNjE5NjZfMl80IH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfdHJjX3R5cGUifSwKQEAgLTQ3MiwzMSArMzkyLDM5IEBACiB7ImllYzYxOTY2XzJfMSIsICJJRUMgNjE5NjYtMi0xIiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0lFQzYxOTY2XzJfMSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCiB7ImJ0MjAyMF8xMGJpdCIsICJCVC4yMDIwIC0gMTAgYml0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0JUMjAyMF8xMCB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCiB7ImJ0MjAyMF8xMmJpdCIsICJCVC4yMDIwIC0gMTIgYml0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX0JUMjAyMF8xMiB9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCi17InNtcHRlMjA4NCIsICAgICJTTVBURSBTVCAyMDg0IiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX1NNUFRFU1QyMDg0IH0sICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCi17InNtcHRlNDI4XzEiLCAgICJTTVBURSBTVCA0MjgtMSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX1NNUFRFU1Q0MjhfMSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCi17ImNvbG9yc3BhY2UiLCAiY29sb3Igc3BhY2UiLCBPRkZTRVQoY29sb3JzcGFjZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfSwgMCwgQVZDT0xfU1BDX05CLTEsIFZ8RXxELCAiY29sb3JzcGFjZV90eXBlIn0sCit7InNtcHRlNDI4XzEiLCAgICJTTVBURSA0MjgtMSIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfVFJDX1NNUFRFNDI4IH0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNvbG9yX3RyY190eXBlIn0sCit7ImNvbG9yc3BhY2UiLCAiY29sb3Igc3BhY2UiLCBPRkZTRVQoY29sb3JzcGFjZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfSwgMCwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKIHsicmdiIiwgICAgICAgICAiUkdCIiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfUkdCIH0sICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKIHsiYnQ3MDkiLCAgICAgICAiQlQuNzA5IiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfQlQ3MDkgfSwgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKLXsidW5zcGVjaWZpZWQiLCAiVW5zcGVjaWZpZWQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKK3sidW5rbm93biIsICAgICAiVW5zcGVjaWZpZWQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKIHsiZmNjIiwgICAgICAgICAiRkNDIiwgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfRkNDIH0sICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKIHsiYnQ0NzBiZyIsICAgICAiQlQuNDcwIEJHIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfQlQ0NzBCRyB9LCAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKIHsic21wdGUxNzBtIiwgICAiU01QVEUgMTcwIE0iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfU01QVEUxNzBNIH0sICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKIHsic21wdGUyNDBtIiwgICAiU01QVEUgMjQwIE0iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfU01QVEUyNDBNIH0sICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKLXsieWNvY2ciLCAgICAgICAiWUNPQ0ciLCAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfWUNPQ0cgfSwgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKK3sieWNnY28iLCAgICAgICAiWUNHQ08iLCAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfWUNHQ08gfSwgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKK3siYnQyMDIwbmMiLCAgICAiQlQuMjAyMCBOQ0wiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfQlQyMDIwX05DTCB9LCAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKK3siYnQyMDIwYyIsICAgICAiQlQuMjAyMCBDTCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfQlQyMDIwX0NMIH0sICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKK3sic21wdGUyMDg1IiwgICAiU01QVEUgMjA4NSIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfU01QVEUyMDg1IH0sICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKK3sidW5zcGVjaWZpZWQiLCAiVW5zcGVjaWZpZWQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfSwgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKK3sieWNvY2ciLCAgICAgICAiWUNHQ08iLCAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfWUNHQ08gfSwgICAgICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKIHsiYnQyMDIwX25jbCIsICAiQlQuMjAyMCBOQ0wiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfQlQyMDIwX05DTCB9LCAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKIHsiYnQyMDIwX2NsIiwgICAiQlQuMjAyMCBDTCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9TUENfQlQyMDIwX0NMIH0sICAgSU5UX01JTiwgSU5UX01BWCwgVnxFfEQsICJjb2xvcnNwYWNlX3R5cGUifSwKLXsiY29sb3JfcmFuZ2UiLCAiY29sb3IgcmFuZ2UiLCBPRkZTRVQoY29sb3JfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQgfSwgMCwgQVZDT0xfUkFOR0VfTkItMSwgVnxFfEQsICJjb2xvcl9yYW5nZV90eXBlIn0sCit7ImNvbG9yX3JhbmdlIiwgImNvbG9yIHJhbmdlIiwgT0ZGU0VUKGNvbG9yX3JhbmdlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0sIDAsIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAoreyJ1bmtub3duIiwgIlVuc3BlY2lmaWVkIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAoreyJ0diIsICJNUEVHICgyMTkqMl4obi04KSkiLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX01QRUcgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAoreyJwYyIsICJKUEVHICgyXm4tMSkiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX0pQRUcgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAogeyJ1bnNwZWNpZmllZCIsICJVbnNwZWNpZmllZCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAogeyJtcGVnIiwgIk1QRUcgKDIxOSoyXihuLTgpKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX01QRUcgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAogeyJqcGVnIiwgIkpQRUcgKDJebi0xKSIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX0pQRUcgfSwgICAgICAgIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY29sb3JfcmFuZ2VfdHlwZSJ9LAoteyJjaHJvbWFfc2FtcGxlX2xvY2F0aW9uIiwgImNocm9tYSBzYW1wbGUgbG9jYXRpb24iLCBPRkZTRVQoY2hyb21hX3NhbXBsZV9sb2NhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQgfSwgMCwgQVZDSFJPTUFfTE9DX05CLTEsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCi17InVuc3BlY2lmaWVkIiwgIlVuc3BlY2lmaWVkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEIH0sIElOVF9NSU4sIElOVF9NQVgsIFZ8RXxELCAiY2hyb21hX3NhbXBsZV9sb2NhdGlvbl90eXBlIn0sCit7ImNocm9tYV9zYW1wbGVfbG9jYXRpb24iLCAiY2hyb21hIHNhbXBsZSBsb2NhdGlvbiIsIE9GRlNFVChjaHJvbWFfc2FtcGxlX2xvY2F0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRCB9LCAwLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAoreyJ1bmtub3duIiwgICAgICJVbnNwZWNpZmllZCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAogeyJsZWZ0IiwgICAgICAgICJMZWZ0IiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19MRUZUIH0sICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAogeyJjZW50ZXIiLCAgICAgICJDZW50ZXIiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19DRU5URVIgfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAogeyJ0b3BsZWZ0IiwgICAgICJUb3AtbGVmdCIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19UT1BMRUZUIH0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAogeyJ0b3AiLCAgICAgICAgICJUb3AiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19UT1AgfSwgICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAogeyJib3R0b21sZWZ0IiwgICJCb3R0b20tbGVmdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19CT1RUT01MRUZUIH0sICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAogeyJib3R0b20iLCAgICAgICJCb3R0b20iLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19CT1RUT00gfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAoreyJ1bnNwZWNpZmllZCIsICJVbnNwZWNpZmllZCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWfEV8RCwgImNocm9tYV9zYW1wbGVfbG9jYXRpb25fdHlwZSJ9LAogeyJsb2dfbGV2ZWxfb2Zmc2V0IiwgInNldCB0aGUgbG9nIGxldmVsIG9mZnNldCIsIE9GRlNFVChsb2dfbGV2ZWxfb2Zmc2V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCB9LAogeyJzbGljZXMiLCAic2V0IHRoZSBudW1iZXIgb2Ygc2xpY2VzLCB1c2VkIGluIHBhcmFsbGVsaXplZCBlbmNvZGluZyIsIE9GRlNFVChzbGljZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWfEV9LAogeyJ0aHJlYWRfdHlwZSIsICJzZWxlY3QgbXVsdGl0aHJlYWRpbmcgdHlwZSIsIE9GRlNFVCh0aHJlYWRfdHlwZSksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IEZGX1RIUkVBRF9TTElDRXxGRl9USFJFQURfRlJBTUUgfSwgMCwgSU5UX01BWCwgVnxBfEV8RCwgInRocmVhZF90eXBlIn0sCkBAIC01MTksMTAgKzQ0NywyMSBAQAogeyJkb19ub3RoaW5nIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1NVQl9DSEFSRU5DX01PREVfRE9fTk9USElOR30sICBJTlRfTUlOLCBJTlRfTUFYLCBTfEQsICJzdWJfY2hhcmVuY19tb2RlIn0sCiB7ImF1dG8iLCAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfU1VCX0NIQVJFTkNfTU9ERV9BVVRPTUFUSUN9LCAgIElOVF9NSU4sIElOVF9NQVgsIFN8RCwgInN1Yl9jaGFyZW5jX21vZGUifSwKIHsicHJlX2RlY29kZXIiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9TVUJfQ0hBUkVOQ19NT0RFX1BSRV9ERUNPREVSfSwgSU5UX01JTiwgSU5UX01BWCwgU3xELCAic3ViX2NoYXJlbmNfbW9kZSJ9LAoreyJpZ25vcmUiLCAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1NVQl9DSEFSRU5DX01PREVfSUdOT1JFfSwgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBTfEQsICJzdWJfY2hhcmVuY19tb2RlIn0sCisjaWYgRkZfQVBJX0FTU19USU1JTkcKK3sic3ViX3RleHRfZm9ybWF0IiwgInNldCBkZWNvZGVkIHRleHQgc3VidGl0bGUgZm9ybWF0IiwgT0ZGU0VUKHN1Yl90ZXh0X2Zvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9TVUJfVEVYVF9GTVRfQVNTX1dJVEhfVElNSU5HU30sIDAsIDEsIFN8RCwgInN1Yl90ZXh0X2Zvcm1hdCJ9LAorI2Vsc2UKK3sic3ViX3RleHRfZm9ybWF0IiwgInNldCBkZWNvZGVkIHRleHQgc3VidGl0bGUgZm9ybWF0IiwgT0ZGU0VUKHN1Yl90ZXh0X2Zvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBGRl9TVUJfVEVYVF9GTVRfQVNTfSwgMCwgMSwgU3xELCAic3ViX3RleHRfZm9ybWF0In0sCisjZW5kaWYKK3siYXNzIiwgICAgICAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1NVQl9URVhUX0ZNVF9BU1N9LCAgICAgICAgICAgICAgSU5UX01JTiwgSU5UX01BWCwgU3xELCAic3ViX3RleHRfZm9ybWF0In0sCisjaWYgRkZfQVBJX0FTU19USU1JTkcKK3siYXNzX3dpdGhfdGltaW5ncyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1NVQl9URVhUX0ZNVF9BU1NfV0lUSF9USU1JTkdTfSwgSU5UX01JTiwgSU5UX01BWCwgU3xELCAic3ViX3RleHRfZm9ybWF0In0sCisjZW5kaWYKIHsicmVmY291bnRlZF9mcmFtZXMiLCBOVUxMLCBPRkZTRVQocmVmY291bnRlZF9mcmFtZXMpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDB9LCAwLCAxLCBBfFZ8RCB9LAogI2lmIEZGX0FQSV9TSURFREFUQV9PTkxZX1BLVAogeyJzaWRlX2RhdGFfb25seV9wYWNrZXRzIiwgTlVMTCwgT0ZGU0VUKHNpZGVfZGF0YV9vbmx5X3BhY2tldHMpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAxIH0sIDAsIDEsIEF8VnxFIH0sCiAjZW5kaWYKK3siYXBwbHlfY3JvcHBpbmciLCBOVUxMLCBPRkZTRVQoYXBwbHlfY3JvcHBpbmcpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAxIH0sIDAsIDEsIFYgfCBEIH0sCiB7InNraXBfYWxwaGEiLCAiU2tpcCBwcm9jZXNzaW5nIGFscGhhIiwgT0ZGU0VUKHNraXBfYWxwaGEpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDAgfSwgMCwgMSwgVnxEIH0sCiB7ImZpZWxkX29yZGVyIiwgIkZpZWxkIG9yZGVyIiwgT0ZGU0VUKGZpZWxkX29yZGVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWX0ZJRUxEX1VOS05PV04gfSwgMCwgNSwgVnxEfEUsICJmaWVsZF9vcmRlciIgfSwKIHsicHJvZ3Jlc3NpdmUiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVl9GSUVMRF9QUk9HUkVTU0lWRSB9LCAwLCAwLCBWfER8RSwgImZpZWxkX29yZGVyIiB9LApAQCAtNTM0LDYgKzQ3MywxMiBAQAogeyJjb2RlY193aGl0ZWxpc3QiLCAiTGlzdCBvZiBkZWNvZGVycyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQiLCBPRkZTRVQoY29kZWNfd2hpdGVsaXN0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEF8VnxTfEQgfSwKIHsicGl4ZWxfZm9ybWF0IiwgInNldCBwaXhlbCBmb3JtYXQiLCBPRkZTRVQocGl4X2ZtdCksIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCwgey5pNjQ9QVZfUElYX0ZNVF9OT05FfSwgLTEsIElOVF9NQVgsIDAgfSwKIHsidmlkZW9fc2l6ZSIsICJzZXQgdmlkZW8gc2l6ZSIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPU5VTEx9LCAwLCBJTlRfTUFYLCAwIH0sCit7Im1heF9waXhlbHMiLCAiTWF4aW11bSBudW1iZXIgb2YgcGl4ZWxzIiwgT0ZGU0VUKG1heF9waXhlbHMpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSBJTlRfTUFYIH0sIDAsIElOVF9NQVgsIEF8VnxTfER8RSB9LAoreyJod2FjY2VsX2ZsYWdzIiwgTlVMTCwgT0ZGU0VUKGh3YWNjZWxfZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQgPSBBVl9IV0FDQ0VMX0ZMQUdfSUdOT1JFX0xFVkVMIH0sIDAsIFVJTlRfTUFYLCBWfEQsICJod2FjY2VsX2ZsYWdzIn0sCit7Imlnbm9yZV9sZXZlbCIsICJpZ25vcmUgbGV2ZWwgZXZlbiBpZiB0aGUgY29kZWMgbGV2ZWwgdXNlZCBpcyB1bmtub3duIG9yIGhpZ2hlciB0aGFuIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBsZXZlbCByZXBvcnRlZCBieSB0aGUgaGFyZHdhcmUgZHJpdmVyIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0hXQUNDRUxfRkxBR19JR05PUkVfTEVWRUwgfSwgSU5UX01JTiwgSU5UX01BWCwgViB8IEQsICJod2FjY2VsX2ZsYWdzIiB9LAoreyJhbGxvd19oaWdoX2RlcHRoIiwgImFsbG93IHRvIG91dHB1dCBZVVYgcGl4ZWwgZm9ybWF0cyB3aXRoIGEgZGlmZmVyZW50IGNocm9tYSBzYW1wbGluZyB0aGFuIDQ6MjowIGFuZC9vciBvdGhlciB0aGFuIDggYml0cyBwZXIgY29tcG9uZW50IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZfSFdBQ0NFTF9GTEFHX0FMTE9XX0hJR0hfREVQVEggfSwgSU5UX01JTiwgSU5UX01BWCwgViB8IEQsICJod2FjY2VsX2ZsYWdzIn0sCit7ImFsbG93X3Byb2ZpbGVfbWlzbWF0Y2giLCAiYXR0ZW1wdCB0byBkZWNvZGUgYW55d2F5IGlmIEhXIGFjY2VsZXJhdGVkIGRlY29kZXIncyBzdXBwb3J0ZWQgcHJvZmlsZXMgZG8gbm90IGV4YWN0bHkgbWF0Y2ggdGhlIHN0cmVhbSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0hXQUNDRUxfRkxBR19BTExPV19QUk9GSUxFX01JU01BVENIIH0sIElOVF9NSU4sIElOVF9NQVgsIFYgfCBELCAiaHdhY2NlbF9mbGFncyJ9LAoreyJleHRyYV9od19mcmFtZXMiLCAiTnVtYmVyIG9mIGV4dHJhIGhhcmR3YXJlIGZyYW1lcyB0byBhbGxvY2F0ZSBmb3IgdGhlIHVzZXIiLCBPRkZTRVQoZXh0cmFfaHdfZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UX01BWCwgVnxEIH0sCiB7TlVMTH0sCiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29wdXMuYyBiL2xpYmF2Y29kZWMvb3B1cy5jCmluZGV4IGYyYjhlY2MuLmFhODI3YjYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvb3B1cy5jCisrKyBiL2xpYmF2Y29kZWMvb3B1cy5jCkBAIC0yNyw5ICsyNywxMCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Vycm9yLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmbWF0aC5oIgogCi0jaW5jbHVkZSAib3B1cy5oIgorI2luY2x1ZGUgIm9wdXNfY2VsdC5oIgorI2luY2x1ZGUgIm9wdXN0YWIuaCIKICNpbmNsdWRlICJ2b3JiaXMuaCIKIAogc3RhdGljIGNvbnN0IHVpbnQxNl90IG9wdXNfZnJhbWVfZHVyYXRpb25bMzJdID0gewpAQCAtMjY1LDcgKzI2Niw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgcGt0LT5tb2RlID0gT1BVU19NT0RFX0NFTFQ7CiAgICAgICAgIHBrdC0+YmFuZHdpZHRoID0gKHBrdC0+Y29uZmlnIC0gMTYpID4+IDI7Ci0gICAgICAgIC8qIHNraXAgbWVkaXVtYmFuZCAqLworICAgICAgICAvKiBza2lwIG1lZGl1bSBiYW5kICovCiAgICAgICAgIGlmIChwa3QtPmJhbmR3aWR0aCkKICAgICAgICAgICAgIHBrdC0+YmFuZHdpZHRoKys7CiAgICAgfQpAQCAtMzI4LDcgKzMyOSw3IEBACiAKICAgICBjaGFubmVscyA9IGF2Y3R4LT5leHRyYWRhdGEgPyBleHRyYWRhdGFbOV0gOiAoYXZjdHgtPmNoYW5uZWxzID09IDEpID8gMSA6IDI7CiAgICAgaWYgKCFjaGFubmVscykgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlplcm8gY2hhbm5lbCBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGV4dGFkYXRhXG4iKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJaZXJvIGNoYW5uZWwgY291bnQgc3BlY2lmaWVkIGluIHRoZSBleHRyYWRhdGFcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKQEAgLTM0Nyw3ICszNDgsNyBAQAogICAgICAgICBzdHJlYW1zICAgICAgICA9IDE7CiAgICAgICAgIHN0ZXJlb19zdHJlYW1zID0gY2hhbm5lbHMgLSAxOwogICAgICAgICBjaGFubmVsX21hcCAgICA9IGRlZmF1bHRfY2hhbm5lbF9tYXA7Ci0gICAgfSBlbHNlIGlmIChtYXBfdHlwZSA9PSAxIHx8IG1hcF90eXBlID09IDI1NSkgeworICAgIH0gZWxzZSBpZiAobWFwX3R5cGUgPT0gMSB8fCBtYXBfdHlwZSA9PSAyIHx8IG1hcF90eXBlID09IDI1NSkgewogICAgICAgICBpZiAoZXh0cmFkYXRhX3NpemUgPCAyMSArIGNoYW5uZWxzKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZXh0cmFkYXRhIHNpemU6ICVkXG4iLAogICAgICAgICAgICAgICAgICAgIGV4dHJhZGF0YV9zaXplKTsKQEAgLTM3MSw2ICszNzIsMjEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGxheW91dCA9IGZmX3ZvcmJpc19jaGFubmVsX2xheW91dHNbY2hhbm5lbHMgLSAxXTsKICAgICAgICAgICAgIGNoYW5uZWxfcmVvcmRlciA9IGNoYW5uZWxfcmVvcmRlcl92b3JiaXM7CisgICAgICAgIH0gZWxzZSBpZiAobWFwX3R5cGUgPT0gMikgeworICAgICAgICAgICAgaW50IGFtYmlzb25pY19vcmRlciA9IGZmX3NxcnQoY2hhbm5lbHMpIC0gMTsKKyAgICAgICAgICAgIGlmIChjaGFubmVscyAhPSAoKGFtYmlzb25pY19vcmRlciArIDEpICogKGFtYmlzb25pY19vcmRlciArIDEpKSAmJgorICAgICAgICAgICAgICAgIGNoYW5uZWxzICE9ICgoYW1iaXNvbmljX29yZGVyICsgMSkgKiAoYW1iaXNvbmljX29yZGVyICsgMSkgKyAyKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiQ2hhbm5lbCBtYXBwaW5nIDIgaXMgb25seSBzcGVjaWZpZWQgZm9yIGNoYW5uZWwgY291bnRzIgorICAgICAgICAgICAgICAgICAgICAgICAiIHdoaWNoIGNhbiBiZSB3cml0dGVuIGFzIChuICsgMSleMiBvciAobiArIDEpXjIgKyAyIgorICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBub25uZWdhdGl2ZSBpbnRlZ2VyIG5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoYW5uZWxzID4gMjI3KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUb28gbWFueSBjaGFubmVsc1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXlvdXQgPSAwOwogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgIGxheW91dCA9IDA7CiAKQEAgLTM5NCwxMCArNDEwLDExIEBACiAgICAgICAgIH0gZWxzZSBpZiAoaWR4ID49IHN0cmVhbXMgKyBzdGVyZW9fc3RyZWFtcykgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY2hhbm5lbCBtYXAgZm9yIG91dHB1dCBjaGFubmVsICVkOiAlZFxuIiwgaSwgaWR4KTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5jaGFubmVsX21hcHMpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KIAotICAgICAgICAvKiBjaGVjayB0aGF0IHdlIGRpbid0IHNlZSB0aGlzIGluZGV4IHlldCAqLworICAgICAgICAvKiBjaGVjayB0aGF0IHdlIGRpZCBub3Qgc2VlIHRoaXMgaW5kZXggeWV0ICovCiAgICAgICAgIG1hcC0+Y29weSA9IDA7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpOyBqKyspCiAgICAgICAgICAgICBpZiAoY2hhbm5lbF9tYXBbY2hhbm5lbF9yZW9yZGVyKGNoYW5uZWxzLCBqKV0gPT0gaWR4KSB7CkBAIC00MjIsMyArNDM5LDQ1OSBAQAogCiAgICAgcmV0dXJuIDA7CiB9CisKK3ZvaWQgZmZfY2VsdF9xdWFudF9iYW5kcyhDZWx0RnJhbWUgKmYsIE9wdXNSYW5nZUNvZGVyICpyYykKK3sKKyAgICBmbG9hdCBsb3diYW5kX3NjcmF0Y2hbOCAqIDIyXTsKKyAgICBmbG9hdCBub3JtMVsyICogOCAqIDEwMF07CisgICAgZmxvYXQgKm5vcm0yID0gbm9ybTEgKyA4ICogMTAwOworCisgICAgaW50IHRvdGFsYml0cyA9IChmLT5mcmFtZWJpdHMgPDwgMykgLSBmLT5hbnRpY29sbGFwc2VfbmVlZGVkOworCisgICAgaW50IHVwZGF0ZV9sb3diYW5kID0gMTsKKyAgICBpbnQgbG93YmFuZF9vZmZzZXQgPSAwOworCisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSBmLT5zdGFydF9iYW5kOyBpIDwgZi0+ZW5kX2JhbmQ7IGkrKykgeworICAgICAgICB1aW50MzJfdCBjbVsyXSA9IHsgKDEgPDwgZi0+YmxvY2tzKSAtIDEsICgxIDw8IGYtPmJsb2NrcykgLSAxIH07CisgICAgICAgIGludCBiYW5kX29mZnNldCA9IGZmX2NlbHRfZnJlcV9iYW5kc1tpXSA8PCBmLT5zaXplOworICAgICAgICBpbnQgYmFuZF9zaXplICAgPSBmZl9jZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgZi0+c2l6ZTsKKyAgICAgICAgZmxvYXQgKlggPSBmLT5ibG9ja1swXS5jb2VmZnMgKyBiYW5kX29mZnNldDsKKyAgICAgICAgZmxvYXQgKlkgPSAoZi0+Y2hhbm5lbHMgPT0gMikgPyBmLT5ibG9ja1sxXS5jb2VmZnMgKyBiYW5kX29mZnNldCA6IE5VTEw7CisgICAgICAgIGZsb2F0ICpub3JtX2xvYzEsICpub3JtX2xvYzI7CisKKyAgICAgICAgaW50IGNvbnN1bWVkID0gb3B1c19yY190ZWxsX2ZyYWMocmMpOworICAgICAgICBpbnQgZWZmZWN0aXZlX2xvd2JhbmQgPSAtMTsKKyAgICAgICAgaW50IGIgPSAwOworCisgICAgICAgIC8qIENvbXB1dGUgaG93IG1hbnkgYml0cyB3ZSB3YW50IHRvIGFsbG9jYXRlIHRvIHRoaXMgYmFuZCAqLworICAgICAgICBpZiAoaSAhPSBmLT5zdGFydF9iYW5kKQorICAgICAgICAgICAgZi0+cmVtYWluaW5nIC09IGNvbnN1bWVkOworICAgICAgICBmLT5yZW1haW5pbmcyID0gdG90YWxiaXRzIC0gY29uc3VtZWQgLSAxOworICAgICAgICBpZiAoaSA8PSBmLT5jb2RlZF9iYW5kcyAtIDEpIHsKKyAgICAgICAgICAgIGludCBjdXJyX2JhbGFuY2UgPSBmLT5yZW1haW5pbmcgLyBGRk1JTigzLCBmLT5jb2RlZF9iYW5kcy1pKTsKKyAgICAgICAgICAgIGIgPSBhdl9jbGlwX3VpbnRwMihGRk1JTihmLT5yZW1haW5pbmcyICsgMSwgZi0+cHVsc2VzW2ldICsgY3Vycl9iYWxhbmNlKSwgMTQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChmZl9jZWx0X2ZyZXFfYmFuZHNbaV0gLSBmZl9jZWx0X2ZyZXFfcmFuZ2VbaV0gPj0gZmZfY2VsdF9mcmVxX2JhbmRzW2YtPnN0YXJ0X2JhbmRdIHx8CisgICAgICAgICAgICBpID09IGYtPnN0YXJ0X2JhbmQgKyAxKSAmJiAodXBkYXRlX2xvd2JhbmQgfHwgbG93YmFuZF9vZmZzZXQgPT0gMCkpCisgICAgICAgICAgICBsb3diYW5kX29mZnNldCA9IGk7CisKKyAgICAgICAgaWYgKGkgPT0gZi0+c3RhcnRfYmFuZCArIDEpIHsKKyAgICAgICAgICAgIC8qIFNwZWNpYWwgSHlicmlkIEZvbGRpbmcgKFJGQyA4MjUxIHNlY3Rpb24gOSkuIENvcHkgdGhlIGZpcnN0IGJhbmQgaW50bworICAgICAgICAgICAgdGhlIHNlY29uZCB0byBlbnN1cmUgdGhlIHNlY29uZCBiYW5kIG5ldmVyIGhhcyB0byB1c2UgdGhlIExDRy4gKi8KKyAgICAgICAgICAgIGludCBjb3VudCA9IChmZl9jZWx0X2ZyZXFfcmFuZ2VbaV0gLSBmZl9jZWx0X2ZyZXFfcmFuZ2VbaS0xXSkgPDwgZi0+c2l6ZTsKKworICAgICAgICAgICAgbWVtY3B5KCZub3JtMVtiYW5kX29mZnNldF0sICZub3JtMVtiYW5kX29mZnNldCAtIGNvdW50XSwgY291bnQgKiBzaXplb2YoZmxvYXQpKTsKKworICAgICAgICAgICAgaWYgKGYtPmNoYW5uZWxzID09IDIpCisgICAgICAgICAgICAgICAgbWVtY3B5KCZub3JtMltiYW5kX29mZnNldF0sICZub3JtMltiYW5kX29mZnNldCAtIGNvdW50XSwgY291bnQgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEdldCBhIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvZiB0aGUgY29sbGFwc2VfbWFzaydzIGZvciB0aGUgYmFuZHMgd2UncmUKKyAgICAgICAgICAgZ29pbmcgdG8gYmUgZm9sZGluZyBmcm9tLiAqLworICAgICAgICBpZiAobG93YmFuZF9vZmZzZXQgIT0gMCAmJiAoZi0+c3ByZWFkICE9IENFTFRfU1BSRUFEX0FHR1JFU1NJVkUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmJsb2NrcyA+IDEgfHwgZi0+dGZfY2hhbmdlW2ldIDwgMCkpIHsKKyAgICAgICAgICAgIGludCBmb2xkc3RhcnQsIGZvbGRlbmQ7CisKKyAgICAgICAgICAgIC8qIFRoaXMgZW5zdXJlcyB3ZSBuZXZlciByZXBlYXQgc3BlY3RyYWwgY29udGVudCB3aXRoaW4gb25lIGJhbmQgKi8KKyAgICAgICAgICAgIGVmZmVjdGl2ZV9sb3diYW5kID0gRkZNQVgoZmZfY2VsdF9mcmVxX2JhbmRzW2YtPnN0YXJ0X2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9jZWx0X2ZyZXFfYmFuZHNbbG93YmFuZF9vZmZzZXRdIC0gZmZfY2VsdF9mcmVxX3JhbmdlW2ldKTsKKyAgICAgICAgICAgIGZvbGRzdGFydCA9IGxvd2JhbmRfb2Zmc2V0OworICAgICAgICAgICAgd2hpbGUgKGZmX2NlbHRfZnJlcV9iYW5kc1stLWZvbGRzdGFydF0gPiBlZmZlY3RpdmVfbG93YmFuZCk7CisgICAgICAgICAgICBmb2xkZW5kID0gbG93YmFuZF9vZmZzZXQgLSAxOworICAgICAgICAgICAgd2hpbGUgKCsrZm9sZGVuZCA8IGkgJiYgZmZfY2VsdF9mcmVxX2JhbmRzW2ZvbGRlbmRdIDwgZWZmZWN0aXZlX2xvd2JhbmQgKyBmZl9jZWx0X2ZyZXFfcmFuZ2VbaV0pOworCisgICAgICAgICAgICBjbVswXSA9IGNtWzFdID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IGZvbGRzdGFydDsgaiA8IGZvbGRlbmQ7IGorKykgeworICAgICAgICAgICAgICAgIGNtWzBdIHw9IGYtPmJsb2NrWzBdLmNvbGxhcHNlX21hc2tzW2pdOworICAgICAgICAgICAgICAgIGNtWzFdIHw9IGYtPmJsb2NrW2YtPmNoYW5uZWxzIC0gMV0uY29sbGFwc2VfbWFza3Nbal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZi0+ZHVhbF9zdGVyZW8gJiYgaSA9PSBmLT5pbnRlbnNpdHlfc3RlcmVvKSB7CisgICAgICAgICAgICAvKiBTd2l0Y2ggb2ZmIGR1YWwgc3RlcmVvIHRvIGRvIGludGVuc2l0eSAqLworICAgICAgICAgICAgZi0+ZHVhbF9zdGVyZW8gPSAwOworICAgICAgICAgICAgZm9yIChqID0gZmZfY2VsdF9mcmVxX2JhbmRzW2YtPnN0YXJ0X2JhbmRdIDw8IGYtPnNpemU7IGogPCBiYW5kX29mZnNldDsgaisrKQorICAgICAgICAgICAgICAgIG5vcm0xW2pdID0gKG5vcm0xW2pdICsgbm9ybTJbal0pIC8gMjsKKyAgICAgICAgfQorCisgICAgICAgIG5vcm1fbG9jMSA9IGVmZmVjdGl2ZV9sb3diYW5kICE9IC0xID8gbm9ybTEgKyAoZWZmZWN0aXZlX2xvd2JhbmQgPDwgZi0+c2l6ZSkgOiBOVUxMOworICAgICAgICBub3JtX2xvYzIgPSBlZmZlY3RpdmVfbG93YmFuZCAhPSAtMSA/IG5vcm0yICsgKGVmZmVjdGl2ZV9sb3diYW5kIDw8IGYtPnNpemUpIDogTlVMTDsKKworICAgICAgICBpZiAoZi0+ZHVhbF9zdGVyZW8pIHsKKyAgICAgICAgICAgIGNtWzBdID0gZi0+cHZxLT5xdWFudF9iYW5kKGYtPnB2cSwgZiwgcmMsIGksIFgsIE5VTEwsIGJhbmRfc2l6ZSwgYiA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+YmxvY2tzLCBub3JtX2xvYzEsIGYtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtMSArIGJhbmRfb2Zmc2V0LCAwLCAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93YmFuZF9zY3JhdGNoLCBjbVswXSk7CisKKyAgICAgICAgICAgIGNtWzFdID0gZi0+cHZxLT5xdWFudF9iYW5kKGYtPnB2cSwgZiwgcmMsIGksIFksIE5VTEwsIGJhbmRfc2l6ZSwgYiA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+YmxvY2tzLCBub3JtX2xvYzIsIGYtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtMiArIGJhbmRfb2Zmc2V0LCAwLCAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93YmFuZF9zY3JhdGNoLCBjbVsxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbVswXSA9IGYtPnB2cS0+cXVhbnRfYmFuZChmLT5wdnEsIGYsIHJjLCBpLCBYLCAgICBZLCBiYW5kX3NpemUsIGIgPj4gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmJsb2Nrcywgbm9ybV9sb2MxLCBmLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybTEgKyBiYW5kX29mZnNldCwgMCwgMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmRfc2NyYXRjaCwgY21bMF0gfCBjbVsxXSk7CisgICAgICAgICAgICBjbVsxXSA9IGNtWzBdOworICAgICAgICB9CisKKyAgICAgICAgZi0+YmxvY2tbMF0uY29sbGFwc2VfbWFza3NbaV0gICAgICAgICAgICAgICA9ICh1aW50OF90KWNtWzBdOworICAgICAgICBmLT5ibG9ja1tmLT5jaGFubmVscyAtIDFdLmNvbGxhcHNlX21hc2tzW2ldID0gKHVpbnQ4X3QpY21bMV07CisgICAgICAgIGYtPnJlbWFpbmluZyArPSBmLT5wdWxzZXNbaV0gKyBjb25zdW1lZDsKKworICAgICAgICAvKiBVcGRhdGUgdGhlIGZvbGRpbmcgcG9zaXRpb24gb25seSBhcyBsb25nIGFzIHdlIGhhdmUgMSBiaXQvc2FtcGxlIGRlcHRoICovCisgICAgICAgIHVwZGF0ZV9sb3diYW5kID0gKGIgPiBiYW5kX3NpemUgPDwgMyk7CisgICAgfQorfQorCisjZGVmaW5lIE5PUk1DKGJpdHMpICgoYml0cykgPDwgKGYtPmNoYW5uZWxzIC0gMSkgPDwgZi0+c2l6ZSA+PiAyKQorCit2b2lkIGZmX2NlbHRfYml0YWxsb2MoQ2VsdEZyYW1lICpmLCBPcHVzUmFuZ2VDb2RlciAqcmMsIGludCBlbmNvZGUpCit7CisgICAgaW50IGksIGosIGxvdywgaGlnaCwgdG90YWwsIGRvbmUsIGJhbmRiaXRzLCByZW1haW5pbmcsIHRiaXRzXzh0aHM7CisgICAgaW50IHNraXBfc3RhcnRiYW5kICAgICAgPSBmLT5zdGFydF9iYW5kOworICAgIGludCBza2lwX2JpdCAgICAgICAgICAgID0gMDsKKyAgICBpbnQgaW50ZW5zaXR5c3RlcmVvX2JpdCA9IDA7CisgICAgaW50IGR1YWxzdGVyZW9fYml0ICAgICAgPSAwOworICAgIGludCBkeW5hbGxvYyAgICAgICAgICAgID0gNjsKKyAgICBpbnQgZXh0cmFiaXRzICAgICAgICAgICA9IDA7CisKKyAgICBpbnQgYm9vc3RbQ0VMVF9NQVhfQkFORFNdID0geyAwIH07CisgICAgaW50IHRyaW1fb2Zmc2V0W0NFTFRfTUFYX0JBTkRTXTsKKyAgICBpbnQgdGhyZXNob2xkW0NFTFRfTUFYX0JBTkRTXTsKKyAgICBpbnQgYml0czFbQ0VMVF9NQVhfQkFORFNdOworICAgIGludCBiaXRzMltDRUxUX01BWF9CQU5EU107CisKKyAgICAvKiBTcHJlYWQgKi8KKyAgICBpZiAob3B1c19yY190ZWxsKHJjKSArIDQgPD0gZi0+ZnJhbWViaXRzKSB7CisgICAgICAgIGlmIChlbmNvZGUpCisgICAgICAgICAgICBmZl9vcHVzX3JjX2VuY19jZGYocmMsIGYtPnNwcmVhZCwgZmZfY2VsdF9tb2RlbF9zcHJlYWQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmLT5zcHJlYWQgPSBmZl9vcHVzX3JjX2RlY19jZGYocmMsIGZmX2NlbHRfbW9kZWxfc3ByZWFkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmLT5zcHJlYWQgPSBDRUxUX1NQUkVBRF9OT1JNQUw7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBzdGF0aWMgYWxsb2NhdGlvbiBjYXBzICovCisgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspCisgICAgICAgIGYtPmNhcHNbaV0gPSBOT1JNQygoZmZfY2VsdF9zdGF0aWNfY2Fwc1tmLT5zaXplXVtmLT5jaGFubmVscyAtIDFdW2ldICsgNjQpICogZmZfY2VsdF9mcmVxX3JhbmdlW2ldKTsKKworICAgIC8qIEJhbmQgYm9vc3RzICovCisgICAgdGJpdHNfOHRocyA9IGYtPmZyYW1lYml0cyA8PCAzOworICAgIGZvciAoaSA9IGYtPnN0YXJ0X2JhbmQ7IGkgPCBmLT5lbmRfYmFuZDsgaSsrKSB7CisgICAgICAgIGludCBxdWFudGEgPSBmZl9jZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgKGYtPmNoYW5uZWxzIC0gMSkgPDwgZi0+c2l6ZTsKKyAgICAgICAgaW50IGJfZHluYWxsb2MgPSBkeW5hbGxvYzsKKyAgICAgICAgaW50IGJvb3N0X2Ftb3VudCA9IGYtPmFsbG9jX2Jvb3N0W2ldOworICAgICAgICBxdWFudGEgPSBGRk1JTihxdWFudGEgPDwgMywgRkZNQVgoNiA8PCAzLCBxdWFudGEpKTsKKworICAgICAgICB3aGlsZSAob3B1c19yY190ZWxsX2ZyYWMocmMpICsgKGJfZHluYWxsb2MgPDwgMykgPCB0Yml0c184dGhzICYmIGJvb3N0W2ldIDwgZi0+Y2Fwc1tpXSkgeworICAgICAgICAgICAgaW50IGlzX2Jvb3N0OworICAgICAgICAgICAgaWYgKGVuY29kZSkgeworICAgICAgICAgICAgICAgIGlzX2Jvb3N0ID0gYm9vc3RfYW1vdW50LS07CisgICAgICAgICAgICAgICAgZmZfb3B1c19yY19lbmNfbG9nKHJjLCBpc19ib29zdCwgYl9keW5hbGxvYyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlzX2Jvb3N0ID0gZmZfb3B1c19yY19kZWNfbG9nKHJjLCBiX2R5bmFsbG9jKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpc19ib29zdCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgYm9vc3RbaV0gICArPSBxdWFudGE7CisgICAgICAgICAgICB0Yml0c184dGhzIC09IHF1YW50YTsKKworICAgICAgICAgICAgYl9keW5hbGxvYyA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYm9vc3RbaV0pCisgICAgICAgICAgICBkeW5hbGxvYyA9IEZGTUFYKGR5bmFsbG9jIC0gMSwgMik7CisgICAgfQorCisgICAgLyogQWxsb2NhdGlvbiB0cmltICovCisgICAgaWYgKG9wdXNfcmNfdGVsbF9mcmFjKHJjKSArICg2IDw8IDMpIDw9IHRiaXRzXzh0aHMpCisgICAgICAgIGlmIChlbmNvZGUpCisgICAgICAgICAgICBmZl9vcHVzX3JjX2VuY19jZGYocmMsIGYtPmFsbG9jX3RyaW0sIGZmX2NlbHRfbW9kZWxfYWxsb2NfdHJpbSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGYtPmFsbG9jX3RyaW0gPSBmZl9vcHVzX3JjX2RlY19jZGYocmMsIGZmX2NlbHRfbW9kZWxfYWxsb2NfdHJpbSk7CisKKyAgICAvKiBBbnRpLWNvbGxhcHNlIGJpdCByZXNlcnZhdGlvbiAqLworICAgIHRiaXRzXzh0aHMgPSAoZi0+ZnJhbWViaXRzIDw8IDMpIC0gb3B1c19yY190ZWxsX2ZyYWMocmMpIC0gMTsKKyAgICBmLT5hbnRpY29sbGFwc2VfbmVlZGVkID0gMDsKKyAgICBpZiAoZi0+dHJhbnNpZW50ICYmIGYtPnNpemUgPj0gMiAmJiB0Yml0c184dGhzID49ICgoZi0+c2l6ZSArIDIpIDw8IDMpKQorICAgICAgICBmLT5hbnRpY29sbGFwc2VfbmVlZGVkID0gMSA8PCAzOworICAgIHRiaXRzXzh0aHMgLT0gZi0+YW50aWNvbGxhcHNlX25lZWRlZDsKKworICAgIC8qIEJhbmQgc2tpcCBiaXQgcmVzZXJ2YXRpb24gKi8KKyAgICBpZiAodGJpdHNfOHRocyA+PSAxIDw8IDMpCisgICAgICAgIHNraXBfYml0ID0gMSA8PCAzOworICAgIHRiaXRzXzh0aHMgLT0gc2tpcF9iaXQ7CisKKyAgICAvKiBJbnRlbnNpdHkvZHVhbCBzdGVyZW8gYml0IHJlc2VydmF0aW9uICovCisgICAgaWYgKGYtPmNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgaW50ZW5zaXR5c3RlcmVvX2JpdCA9IGZmX2NlbHRfbG9nMl9mcmFjW2YtPmVuZF9iYW5kIC0gZi0+c3RhcnRfYmFuZF07CisgICAgICAgIGlmIChpbnRlbnNpdHlzdGVyZW9fYml0IDw9IHRiaXRzXzh0aHMpIHsKKyAgICAgICAgICAgIHRiaXRzXzh0aHMgLT0gaW50ZW5zaXR5c3RlcmVvX2JpdDsKKyAgICAgICAgICAgIGlmICh0Yml0c184dGhzID49IDEgPDwgMykgeworICAgICAgICAgICAgICAgIGR1YWxzdGVyZW9fYml0ID0gMSA8PCAzOworICAgICAgICAgICAgICAgIHRiaXRzXzh0aHMgLT0gMSA8PCAzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50ZW5zaXR5c3RlcmVvX2JpdCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUcmltIG9mZnNldHMgKi8KKyAgICBmb3IgKGkgPSBmLT5zdGFydF9iYW5kOyBpIDwgZi0+ZW5kX2JhbmQ7IGkrKykgeworICAgICAgICBpbnQgdHJpbSAgICAgPSBmLT5hbGxvY190cmltIC0gNSAtIGYtPnNpemU7CisgICAgICAgIGludCBiYW5kICAgICA9IGZmX2NlbHRfZnJlcV9yYW5nZVtpXSAqIChmLT5lbmRfYmFuZCAtIGkgLSAxKTsKKyAgICAgICAgaW50IGR1cmF0aW9uID0gZi0+c2l6ZSArIDM7CisgICAgICAgIGludCBzY2FsZSAgICA9IGR1cmF0aW9uICsgZi0+Y2hhbm5lbHMgLSAxOworCisgICAgICAgIC8qIFBWUSBtaW5pbXVtIGFsbG9jYXRpb24gdGhyZXNob2xkLCBiZWxvdyB0aGlzIHZhbHVlIHRoZSBiYW5kIGlzCisgICAgICAgICAqIHNraXBwZWQgKi8KKyAgICAgICAgdGhyZXNob2xkW2ldID0gRkZNQVgoMyAqIGZmX2NlbHRfZnJlcV9yYW5nZVtpXSA8PCBkdXJhdGlvbiA+PiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5jaGFubmVscyA8PCAzKTsKKworICAgICAgICB0cmltX29mZnNldFtpXSA9IHRyaW0gKiAoYmFuZCA8PCBzY2FsZSkgPj4gNjsKKworICAgICAgICBpZiAoZmZfY2VsdF9mcmVxX3JhbmdlW2ldIDw8IGYtPnNpemUgPT0gMSkKKyAgICAgICAgICAgIHRyaW1fb2Zmc2V0W2ldIC09IGYtPmNoYW5uZWxzIDw8IDM7CisgICAgfQorCisgICAgLyogQmlzZWN0aW9uICovCisgICAgbG93ICA9IDE7CisgICAgaGlnaCA9IENFTFRfVkVDVE9SUyAtIDE7CisgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CisgICAgICAgIGludCBjZW50ZXIgPSAobG93ICsgaGlnaCkgPj4gMTsKKyAgICAgICAgZG9uZSA9IHRvdGFsID0gMDsKKworICAgICAgICBmb3IgKGkgPSBmLT5lbmRfYmFuZCAtIDE7IGkgPj0gZi0+c3RhcnRfYmFuZDsgaS0tKSB7CisgICAgICAgICAgICBiYW5kYml0cyA9IE5PUk1DKGZmX2NlbHRfZnJlcV9yYW5nZVtpXSAqIGZmX2NlbHRfc3RhdGljX2FsbG9jW2NlbnRlcl1baV0pOworCisgICAgICAgICAgICBpZiAoYmFuZGJpdHMpCisgICAgICAgICAgICAgICAgYmFuZGJpdHMgPSBGRk1BWChiYW5kYml0cyArIHRyaW1fb2Zmc2V0W2ldLCAwKTsKKyAgICAgICAgICAgIGJhbmRiaXRzICs9IGJvb3N0W2ldOworCisgICAgICAgICAgICBpZiAoYmFuZGJpdHMgPj0gdGhyZXNob2xkW2ldIHx8IGRvbmUpIHsKKyAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSBGRk1JTihiYW5kYml0cywgZi0+Y2Fwc1tpXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJhbmRiaXRzID49IGYtPmNoYW5uZWxzIDw8IDMpIHsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSBmLT5jaGFubmVscyA8PCAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHRvdGFsID4gdGJpdHNfOHRocykKKyAgICAgICAgICAgIGhpZ2ggPSBjZW50ZXIgLSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBsb3cgPSBjZW50ZXIgKyAxOworICAgIH0KKyAgICBoaWdoID0gbG93LS07CisKKyAgICAvKiBCaXNlY3Rpb24gKi8KKyAgICBmb3IgKGkgPSBmLT5zdGFydF9iYW5kOyBpIDwgZi0+ZW5kX2JhbmQ7IGkrKykgeworICAgICAgICBiaXRzMVtpXSA9IE5PUk1DKGZmX2NlbHRfZnJlcV9yYW5nZVtpXSAqIGZmX2NlbHRfc3RhdGljX2FsbG9jW2xvd11baV0pOworICAgICAgICBiaXRzMltpXSA9IGhpZ2ggPj0gQ0VMVF9WRUNUT1JTID8gZi0+Y2Fwc1tpXSA6CisgICAgICAgICAgICAgICAgICAgTk9STUMoZmZfY2VsdF9mcmVxX3JhbmdlW2ldICogZmZfY2VsdF9zdGF0aWNfYWxsb2NbaGlnaF1baV0pOworCisgICAgICAgIGlmIChiaXRzMVtpXSkKKyAgICAgICAgICAgIGJpdHMxW2ldID0gRkZNQVgoYml0czFbaV0gKyB0cmltX29mZnNldFtpXSwgMCk7CisgICAgICAgIGlmIChiaXRzMltpXSkKKyAgICAgICAgICAgIGJpdHMyW2ldID0gRkZNQVgoYml0czJbaV0gKyB0cmltX29mZnNldFtpXSwgMCk7CisKKyAgICAgICAgaWYgKGxvdykKKyAgICAgICAgICAgIGJpdHMxW2ldICs9IGJvb3N0W2ldOworICAgICAgICBiaXRzMltpXSArPSBib29zdFtpXTsKKworICAgICAgICBpZiAoYm9vc3RbaV0pCisgICAgICAgICAgICBza2lwX3N0YXJ0YmFuZCA9IGk7CisgICAgICAgIGJpdHMyW2ldID0gRkZNQVgoYml0czJbaV0gLSBiaXRzMVtpXSwgMCk7CisgICAgfQorCisgICAgLyogQmlzZWN0aW9uICovCisgICAgbG93ICA9IDA7CisgICAgaGlnaCA9IDEgPDwgQ0VMVF9BTExPQ19TVEVQUzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0VMVF9BTExPQ19TVEVQUzsgaSsrKSB7CisgICAgICAgIGludCBjZW50ZXIgPSAobG93ICsgaGlnaCkgPj4gMTsKKyAgICAgICAgZG9uZSA9IHRvdGFsID0gMDsKKworICAgICAgICBmb3IgKGogPSBmLT5lbmRfYmFuZCAtIDE7IGogPj0gZi0+c3RhcnRfYmFuZDsgai0tKSB7CisgICAgICAgICAgICBiYW5kYml0cyA9IGJpdHMxW2pdICsgKGNlbnRlciAqIGJpdHMyW2pdID4+IENFTFRfQUxMT0NfU1RFUFMpOworCisgICAgICAgICAgICBpZiAoYmFuZGJpdHMgPj0gdGhyZXNob2xkW2pdIHx8IGRvbmUpIHsKKyAgICAgICAgICAgICAgICBkb25lID0gMTsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSBGRk1JTihiYW5kYml0cywgZi0+Y2Fwc1tqXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJhbmRiaXRzID49IGYtPmNoYW5uZWxzIDw8IDMpCisgICAgICAgICAgICAgICAgdG90YWwgKz0gZi0+Y2hhbm5lbHMgPDwgMzsKKyAgICAgICAgfQorICAgICAgICBpZiAodG90YWwgPiB0Yml0c184dGhzKQorICAgICAgICAgICAgaGlnaCA9IGNlbnRlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG93ID0gY2VudGVyOworICAgIH0KKworICAgIC8qIEJpc2VjdGlvbiAqLworICAgIGRvbmUgPSB0b3RhbCA9IDA7CisgICAgZm9yIChpID0gZi0+ZW5kX2JhbmQgLSAxOyBpID49IGYtPnN0YXJ0X2JhbmQ7IGktLSkgeworICAgICAgICBiYW5kYml0cyA9IGJpdHMxW2ldICsgKGxvdyAqIGJpdHMyW2ldID4+IENFTFRfQUxMT0NfU1RFUFMpOworCisgICAgICAgIGlmIChiYW5kYml0cyA+PSB0aHJlc2hvbGRbaV0gfHwgZG9uZSkKKyAgICAgICAgICAgIGRvbmUgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBiYW5kYml0cyA9IChiYW5kYml0cyA+PSBmLT5jaGFubmVscyA8PCAzKSA/CisgICAgICAgICAgICBmLT5jaGFubmVscyA8PCAzIDogMDsKKworICAgICAgICBiYW5kYml0cyAgICAgPSBGRk1JTihiYW5kYml0cywgZi0+Y2Fwc1tpXSk7CisgICAgICAgIGYtPnB1bHNlc1tpXSA9IGJhbmRiaXRzOworICAgICAgICB0b3RhbCAgICAgICs9IGJhbmRiaXRzOworICAgIH0KKworICAgIC8qIEJhbmQgc2tpcHBpbmcgKi8KKyAgICBmb3IgKGYtPmNvZGVkX2JhbmRzID0gZi0+ZW5kX2JhbmQ7IDsgZi0+Y29kZWRfYmFuZHMtLSkgeworICAgICAgICBpbnQgYWxsb2NhdGlvbjsKKyAgICAgICAgaiA9IGYtPmNvZGVkX2JhbmRzIC0gMTsKKworICAgICAgICBpZiAoaiA9PSBza2lwX3N0YXJ0YmFuZCkgeworICAgICAgICAgICAgLyogYWxsIHJlbWFpbmluZyBiYW5kcyBhcmUgbm90IHNraXBwZWQgKi8KKyAgICAgICAgICAgIHRiaXRzXzh0aHMgKz0gc2tpcF9iaXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdHMgYXZhaWxhYmxlIGZvciBjb2RpbmcgImRvIG5vdCBza2lwIiBtYXJrZXJzICovCisgICAgICAgIHJlbWFpbmluZyAgID0gdGJpdHNfOHRocyAtIHRvdGFsOworICAgICAgICBiYW5kYml0cyAgICA9IHJlbWFpbmluZyAvIChmZl9jZWx0X2ZyZXFfYmFuZHNbaisxXSAtIGZmX2NlbHRfZnJlcV9iYW5kc1tmLT5zdGFydF9iYW5kXSk7CisgICAgICAgIHJlbWFpbmluZyAgLT0gYmFuZGJpdHMgICogKGZmX2NlbHRfZnJlcV9iYW5kc1tqKzFdIC0gZmZfY2VsdF9mcmVxX2JhbmRzW2YtPnN0YXJ0X2JhbmRdKTsKKyAgICAgICAgYWxsb2NhdGlvbiAgPSBmLT5wdWxzZXNbal0gKyBiYW5kYml0cyAqIGZmX2NlbHRfZnJlcV9yYW5nZVtqXTsKKyAgICAgICAgYWxsb2NhdGlvbiArPSBGRk1BWChyZW1haW5pbmcgLSAoZmZfY2VsdF9mcmVxX2JhbmRzW2pdIC0gZmZfY2VsdF9mcmVxX2JhbmRzW2YtPnN0YXJ0X2JhbmRdKSwgMCk7CisKKyAgICAgICAgLyogYSAiZG8gbm90IHNraXAiIG1hcmtlciBpcyBvbmx5IGNvZGVkIGlmIHRoZSBhbGxvY2F0aW9uIGlzCisgICAgICAgICAqIGFib3ZlIHRoZSBjaG9zZW4gdGhyZXNob2xkICovCisgICAgICAgIGlmIChhbGxvY2F0aW9uID49IEZGTUFYKHRocmVzaG9sZFtqXSwgKGYtPmNoYW5uZWxzICsgMSkgPDwgMykpIHsKKyAgICAgICAgICAgIGludCBkb19ub3Rfc2tpcDsKKyAgICAgICAgICAgIGlmIChlbmNvZGUpIHsKKyAgICAgICAgICAgICAgICBkb19ub3Rfc2tpcCA9IGYtPmNvZGVkX2JhbmRzIDw9IGYtPnNraXBfYmFuZF9mbG9vcjsKKyAgICAgICAgICAgICAgICBmZl9vcHVzX3JjX2VuY19sb2cocmMsIGRvX25vdF9za2lwLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG9fbm90X3NraXAgPSBmZl9vcHVzX3JjX2RlY19sb2cocmMsIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZG9fbm90X3NraXApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHRvdGFsICAgICAgKz0gMSA8PCAzOworICAgICAgICAgICAgYWxsb2NhdGlvbiAtPSAxIDw8IDM7CisgICAgICAgIH0KKworICAgICAgICAvKiB0aGUgYmFuZCBpcyBza2lwcGVkLCBzbyByZWNsYWltIGl0cyBiaXRzICovCisgICAgICAgIHRvdGFsIC09IGYtPnB1bHNlc1tqXTsKKyAgICAgICAgaWYgKGludGVuc2l0eXN0ZXJlb19iaXQpIHsKKyAgICAgICAgICAgIHRvdGFsIC09IGludGVuc2l0eXN0ZXJlb19iaXQ7CisgICAgICAgICAgICBpbnRlbnNpdHlzdGVyZW9fYml0ID0gZmZfY2VsdF9sb2cyX2ZyYWNbaiAtIGYtPnN0YXJ0X2JhbmRdOworICAgICAgICAgICAgdG90YWwgKz0gaW50ZW5zaXR5c3RlcmVvX2JpdDsKKyAgICAgICAgfQorCisgICAgICAgIHRvdGFsICs9IGYtPnB1bHNlc1tqXSA9IChhbGxvY2F0aW9uID49IGYtPmNoYW5uZWxzIDw8IDMpID8gZi0+Y2hhbm5lbHMgPDwgMyA6IDA7CisgICAgfQorCisgICAgLyogSVMgc3RhcnQgYmFuZCAqLworICAgIGlmIChlbmNvZGUpIHsKKyAgICAgICAgaWYgKGludGVuc2l0eXN0ZXJlb19iaXQpIHsKKyAgICAgICAgICAgIGYtPmludGVuc2l0eV9zdGVyZW8gPSBGRk1JTihmLT5pbnRlbnNpdHlfc3RlcmVvLCBmLT5jb2RlZF9iYW5kcyk7CisgICAgICAgICAgICBmZl9vcHVzX3JjX2VuY191aW50KHJjLCBmLT5pbnRlbnNpdHlfc3RlcmVvLCBmLT5jb2RlZF9iYW5kcyArIDEgLSBmLT5zdGFydF9iYW5kKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGYtPmludGVuc2l0eV9zdGVyZW8gPSBmLT5kdWFsX3N0ZXJlbyA9IDA7CisgICAgICAgIGlmIChpbnRlbnNpdHlzdGVyZW9fYml0KQorICAgICAgICAgICAgZi0+aW50ZW5zaXR5X3N0ZXJlbyA9IGYtPnN0YXJ0X2JhbmQgKyBmZl9vcHVzX3JjX2RlY191aW50KHJjLCBmLT5jb2RlZF9iYW5kcyArIDEgLSBmLT5zdGFydF9iYW5kKTsKKyAgICB9CisKKyAgICAvKiBEUyBmbGFnICovCisgICAgaWYgKGYtPmludGVuc2l0eV9zdGVyZW8gPD0gZi0+c3RhcnRfYmFuZCkKKyAgICAgICAgdGJpdHNfOHRocyArPSBkdWFsc3RlcmVvX2JpdDsgLyogbm8gaW50ZW5zaXR5IHN0ZXJlbyBtZWFucyBubyBkdWFsIHN0ZXJlbyAqLworICAgIGVsc2UgaWYgKGR1YWxzdGVyZW9fYml0KQorICAgICAgICBpZiAoZW5jb2RlKQorICAgICAgICAgICAgZmZfb3B1c19yY19lbmNfbG9nKHJjLCBmLT5kdWFsX3N0ZXJlbywgMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGYtPmR1YWxfc3RlcmVvID0gZmZfb3B1c19yY19kZWNfbG9nKHJjLCAxKTsKKworICAgIC8qIFN1cHBseSB0aGUgcmVtYWluaW5nIGJpdHMgaW4gdGhpcyBmcmFtZSB0byBsb3dlciBiYW5kcyAqLworICAgIHJlbWFpbmluZyA9IHRiaXRzXzh0aHMgLSB0b3RhbDsKKyAgICBiYW5kYml0cyAgPSByZW1haW5pbmcgLyAoZmZfY2VsdF9mcmVxX2JhbmRzW2YtPmNvZGVkX2JhbmRzXSAtIGZmX2NlbHRfZnJlcV9iYW5kc1tmLT5zdGFydF9iYW5kXSk7CisgICAgcmVtYWluaW5nIC09IGJhbmRiaXRzICogKGZmX2NlbHRfZnJlcV9iYW5kc1tmLT5jb2RlZF9iYW5kc10gLSBmZl9jZWx0X2ZyZXFfYmFuZHNbZi0+c3RhcnRfYmFuZF0pOworICAgIGZvciAoaSA9IGYtPnN0YXJ0X2JhbmQ7IGkgPCBmLT5jb2RlZF9iYW5kczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBiaXRzID0gRkZNSU4ocmVtYWluaW5nLCBmZl9jZWx0X2ZyZXFfcmFuZ2VbaV0pOworICAgICAgICBmLT5wdWxzZXNbaV0gKz0gYml0cyArIGJhbmRiaXRzICogZmZfY2VsdF9mcmVxX3JhbmdlW2ldOworICAgICAgICByZW1haW5pbmcgICAgLT0gYml0czsKKyAgICB9CisKKyAgICAvKiBGaW5hbGx5IGRldGVybWluZSB0aGUgYWxsb2NhdGlvbiAqLworICAgIGZvciAoaSA9IGYtPnN0YXJ0X2JhbmQ7IGkgPCBmLT5jb2RlZF9iYW5kczsgaSsrKSB7CisgICAgICAgIGludCBOID0gZmZfY2VsdF9mcmVxX3JhbmdlW2ldIDw8IGYtPnNpemU7CisgICAgICAgIGludCBwcmV2X2V4dHJhID0gZXh0cmFiaXRzOworICAgICAgICBmLT5wdWxzZXNbaV0gKz0gZXh0cmFiaXRzOworCisgICAgICAgIGlmIChOID4gMSkgeworICAgICAgICAgICAgaW50IGRvZjsgICAgICAgIC8qIGRlZ3JlZXMgb2YgZnJlZWRvbSAqLworICAgICAgICAgICAgaW50IHRlbXA7ICAgICAgIC8qIGRvZiAqIGNoYW5uZWxzICogbG9nKGRvZikgKi8KKyAgICAgICAgICAgIGludCBmaW5lX2JpdHM7CisgICAgICAgICAgICBpbnQgbWF4X2JpdHM7CisgICAgICAgICAgICBpbnQgb2Zmc2V0OyAgICAgLyogZmluZSBlbmVyZ3kgcXVhbnRpemF0aW9uIG9mZnNldCwgaS5lLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGV4dHJhIGJpdHMgYXNzaWduZWQgb3ZlciB0aGUgc3RhbmRhcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0b3RhbGJpdHMvZG9mICovCisKKyAgICAgICAgICAgIGV4dHJhYml0cyA9IEZGTUFYKGYtPnB1bHNlc1tpXSAtIGYtPmNhcHNbaV0sIDApOworICAgICAgICAgICAgZi0+cHVsc2VzW2ldIC09IGV4dHJhYml0czsKKworICAgICAgICAgICAgLyogaW50ZW5zaXR5IHN0ZXJlbyBtYWtlcyB1c2Ugb2YgYW4gZXh0cmEgZGVncmVlIG9mIGZyZWVkb20gKi8KKyAgICAgICAgICAgIGRvZiA9IE4gKiBmLT5jaGFubmVscyArIChmLT5jaGFubmVscyA9PSAyICYmIE4gPiAyICYmICFmLT5kdWFsX3N0ZXJlbyAmJiBpIDwgZi0+aW50ZW5zaXR5X3N0ZXJlbyk7CisgICAgICAgICAgICB0ZW1wID0gZG9mICogKGZmX2NlbHRfbG9nX2ZyZXFfcmFuZ2VbaV0gKyAoZi0+c2l6ZSA8PCAzKSk7CisgICAgICAgICAgICBvZmZzZXQgPSAodGVtcCA+PiAxKSAtIGRvZiAqIENFTFRfRklORV9PRkZTRVQ7CisgICAgICAgICAgICBpZiAoTiA9PSAyKSAvKiBkb2Y9MiBpcyB0aGUgb25seSBjYXNlIHRoYXQgZG9lc24ndCBmaXQgdGhlIG1vZGVsICovCisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRvZiA8PCAxOworCisgICAgICAgICAgICAvKiBncmFudCBhbiBhZGRpdGlvbmFsIGJpYXMgZm9yIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHB1bHNlcyAqLworICAgICAgICAgICAgaWYgKGYtPnB1bHNlc1tpXSArIG9mZnNldCA8IDIgKiAoZG9mIDw8IDMpKQorICAgICAgICAgICAgICAgIG9mZnNldCArPSB0ZW1wID4+IDI7CisgICAgICAgICAgICBlbHNlIGlmIChmLT5wdWxzZXNbaV0gKyBvZmZzZXQgPCAzICogKGRvZiA8PCAzKSkKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdGVtcCA+PiAzOworCisgICAgICAgICAgICBmaW5lX2JpdHMgPSAoZi0+cHVsc2VzW2ldICsgb2Zmc2V0ICsgKGRvZiA8PCAyKSkgLyAoZG9mIDw8IDMpOworICAgICAgICAgICAgbWF4X2JpdHMgID0gRkZNSU4oKGYtPnB1bHNlc1tpXSA+PiAzKSA+PiAoZi0+Y2hhbm5lbHMgLSAxKSwgQ0VMVF9NQVhfRklORV9CSVRTKTsKKyAgICAgICAgICAgIG1heF9iaXRzICA9IEZGTUFYKG1heF9iaXRzLCAwKTsKKyAgICAgICAgICAgIGYtPmZpbmVfYml0c1tpXSA9IGF2X2NsaXAoZmluZV9iaXRzLCAwLCBtYXhfYml0cyk7CisKKyAgICAgICAgICAgIC8qIElmIGZpbmVfYml0cyB3YXMgcm91bmRlZCBkb3duIG9yIGNhcHBlZCwKKyAgICAgICAgICAgICAqIGdpdmUgcHJpb3JpdHkgZm9yIHRoZSBmaW5hbCBmaW5lIGVuZXJneSBwYXNzICovCisgICAgICAgICAgICBmLT5maW5lX3ByaW9yaXR5W2ldID0gKGYtPmZpbmVfYml0c1tpXSAqIChkb2YgPDwgMykgPj0gZi0+cHVsc2VzW2ldICsgb2Zmc2V0KTsKKworICAgICAgICAgICAgLyogdGhlIHJlbWFpbmluZyBiaXRzIGFyZSBhc3NpZ25lZCB0byBQVlEgKi8KKyAgICAgICAgICAgIGYtPnB1bHNlc1tpXSAtPSBmLT5maW5lX2JpdHNbaV0gPDwgKGYtPmNoYW5uZWxzIC0gMSkgPDwgMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFsbCBiaXRzIGdvIHRvIGZpbmUgZW5lcmd5IGV4Y2VwdCBmb3IgdGhlIHNpZ24gYml0ICovCisgICAgICAgICAgICBleHRyYWJpdHMgPSBGRk1BWChmLT5wdWxzZXNbaV0gLSAoZi0+Y2hhbm5lbHMgPDwgMyksIDApOworICAgICAgICAgICAgZi0+cHVsc2VzW2ldIC09IGV4dHJhYml0czsKKyAgICAgICAgICAgIGYtPmZpbmVfYml0c1tpXSA9IDA7CisgICAgICAgICAgICBmLT5maW5lX3ByaW9yaXR5W2ldID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGhhbmQgYmFjayBhIGxpbWl0ZWQgbnVtYmVyIG9mIGV4dHJhIGZpbmUgZW5lcmd5IGJpdHMgdG8gdGhpcyBiYW5kICovCisgICAgICAgIGlmIChleHRyYWJpdHMgPiAwKSB7CisgICAgICAgICAgICBpbnQgZmluZWV4dHJhID0gRkZNSU4oZXh0cmFiaXRzID4+IChmLT5jaGFubmVscyArIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTFRfTUFYX0ZJTkVfQklUUyAtIGYtPmZpbmVfYml0c1tpXSk7CisgICAgICAgICAgICBmLT5maW5lX2JpdHNbaV0gKz0gZmluZWV4dHJhOworCisgICAgICAgICAgICBmaW5lZXh0cmEgPDw9IGYtPmNoYW5uZWxzICsgMjsKKyAgICAgICAgICAgIGYtPmZpbmVfcHJpb3JpdHlbaV0gPSAoZmluZWV4dHJhID49IGV4dHJhYml0cyAtIHByZXZfZXh0cmEpOworICAgICAgICAgICAgZXh0cmFiaXRzIC09IGZpbmVleHRyYTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmLT5yZW1haW5pbmcgPSBleHRyYWJpdHM7CisKKyAgICAvKiBza2lwcGVkIGJhbmRzIGRlZGljYXRlIGFsbCBvZiB0aGVpciBiaXRzIGZvciBmaW5lIGVuZXJneSAqLworICAgIGZvciAoOyBpIDwgZi0+ZW5kX2JhbmQ7IGkrKykgeworICAgICAgICBmLT5maW5lX2JpdHNbaV0gICAgID0gZi0+cHVsc2VzW2ldID4+IChmLT5jaGFubmVscyAtIDEpID4+IDM7CisgICAgICAgIGYtPnB1bHNlc1tpXSAgICAgICAgPSAwOworICAgICAgICBmLT5maW5lX3ByaW9yaXR5W2ldID0gZi0+ZmluZV9iaXRzW2ldIDwgMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29wdXMuaCBiL2xpYmF2Y29kZWMvb3B1cy5oCmluZGV4IDNhN2VhOWYuLmVkYmFhYjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvb3B1cy5oCisrKyBiL2xpYmF2Y29kZWMvb3B1cy5oCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSAibGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJvcHVzX3JjLmgiCiAKICNkZWZpbmUgTUFYX0ZSQU1FX1NJWkUgICAgICAgICAgICAgICAxMjc1CiAjZGVmaW5lIE1BWF9GUkFNRVMgICAgICAgICAgICAgICAgICAgNDgKQEAgLTQzLDIzICs0MywxMiBAQAogI2RlZmluZSBDRUxUX01BWF9MT0dfQkxPQ0tTICAgICAgICAgIDMKICNkZWZpbmUgQ0VMVF9NQVhfRlJBTUVfU0laRSAgICAgICAgICAoQ0VMVF9TSE9SVF9CTE9DS1NJWkUgKiAoMSA8PCBDRUxUX01BWF9MT0dfQkxPQ0tTKSkKICNkZWZpbmUgQ0VMVF9NQVhfQkFORFMgICAgICAgICAgICAgICAyMQotI2RlZmluZSBDRUxUX1ZFQ1RPUlMgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIENFTFRfQUxMT0NfU1RFUFMgICAgICAgICAgICAgNgotI2RlZmluZSBDRUxUX0ZJTkVfT0ZGU0VUICAgICAgICAgICAgIDIxCi0jZGVmaW5lIENFTFRfTUFYX0ZJTkVfQklUUyAgICAgICAgICAgOAotI2RlZmluZSBDRUxUX05PUk1fU0NBTEUgICAgICAgICAgICAgIDE2Mzg0Ci0jZGVmaW5lIENFTFRfUVRIRVRBX09GRlNFVCAgICAgICAgICAgNAotI2RlZmluZSBDRUxUX1FUSEVUQV9PRkZTRVRfVFdPUEhBU0UgIDE2Ci0jZGVmaW5lIENFTFRfREVFTVBIX0NPRUZGICAgICAgICAgICAgMC44NTAwMDYxMGYKLSNkZWZpbmUgQ0VMVF9QT1NURklMVEVSX01JTlBFUklPRCAgICAxNQotI2RlZmluZSBDRUxUX0VORVJHWV9TSUxFTkNFICAgICAgICAgICgtMjguMGYpCiAKICNkZWZpbmUgU0lMS19ISVNUT1JZICAgICAgICAgICAgICAgICAzMjIKICNkZWZpbmUgU0lMS19NQVhfTFBDICAgICAgICAgICAgICAgICAxNgogCiAjZGVmaW5lIFJPVU5EX01VTEwoYSxiLHMpICgoKE1VTDY0KGEsIGIpID4+ICgocykgLSAxKSkgKyAxKSA+PiAxKQogI2RlZmluZSBST1VORF9NVUwxNihhLGIpICAoKE1VTDE2KGEsIGIpICsgMTYzODQpID4+IDE1KQotI2RlZmluZSBvcHVzX2lsb2coaSkgKGF2X2xvZzIoaSkgKyAhIShpKSkKIAogI2RlZmluZSBPUFVTX1RTX0hFQURFUiAgICAgMHg3RkUwICAgICAgICAvLyAweDNmZiAoMTEgYml0cykKICNkZWZpbmUgT1BVU19UU19NQVNLICAgICAgIDB4RkZFMCAgICAgICAgLy8gdG9wIDExIGJpdHMKQEAgLTczLDcgKzYyLDkgQEAKIGVudW0gT3B1c01vZGUgewogICAgIE9QVVNfTU9ERV9TSUxLLAogICAgIE9QVVNfTU9ERV9IWUJSSUQsCi0gICAgT1BVU19NT0RFX0NFTFQKKyAgICBPUFVTX01PREVfQ0VMVCwKKworICAgIE9QVVNfTU9ERV9OQgogfTsKIAogZW51bSBPcHVzQmFuZHdpZHRoIHsKQEAgLTgxLDI3ICs3MiwxNCBAQAogICAgIE9QVVNfQkFORFdJRFRIX01FRElVTUJBTkQsCiAgICAgT1BVU19CQU5EV0lEVEhfV0lERUJBTkQsCiAgICAgT1BVU19CQU5EV0lEVEhfU1VQRVJXSURFQkFORCwKLSAgICBPUFVTX0JBTkRXSURUSF9GVUxMQkFORAorICAgIE9QVVNfQkFORFdJRFRIX0ZVTExCQU5ELAorCisgICAgT1BVU19CQU5EV0lUSF9OQgogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgUmF3Qml0c0NvbnRleHQgewotICAgIGNvbnN0IHVpbnQ4X3QgKnBvc2l0aW9uOwotICAgIHVuc2lnbmVkIGludCBieXRlczsKLSAgICB1bnNpZ25lZCBpbnQgY2FjaGVsZW47Ci0gICAgdW5zaWduZWQgaW50IGNhY2hldmFsOwotfSBSYXdCaXRzQ29udGV4dDsKLQotdHlwZWRlZiBzdHJ1Y3QgT3B1c1JhbmdlQ29kZXIgewotICAgIEdldEJpdENvbnRleHQgZ2I7Ci0gICAgUmF3Qml0c0NvbnRleHQgcmI7Ci0gICAgdW5zaWduZWQgaW50IHJhbmdlOwotICAgIHVuc2lnbmVkIGludCB2YWx1ZTsKLSAgICB1bnNpZ25lZCBpbnQgdG90YWxfcmVhZF9iaXRzOwotfSBPcHVzUmFuZ2VDb2RlcjsKLQogdHlwZWRlZiBzdHJ1Y3QgU2lsa0NvbnRleHQgU2lsa0NvbnRleHQ7CiAKLXR5cGVkZWYgc3RydWN0IENlbHRDb250ZXh0IENlbHRDb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgQ2VsdEZyYW1lIENlbHRGcmFtZTsKIAogdHlwZWRlZiBzdHJ1Y3QgT3B1c1BhY2tldCB7CiAgICAgaW50IHBhY2tldF9zaXplOyAgICAgICAgICAgICAgICAvKio8IHBhY2tldCBzaXplICovCkBAIC0xMjYsNyArMTA0LDcgQEAKICAgICBPcHVzUmFuZ2VDb2RlciByYzsKICAgICBPcHVzUmFuZ2VDb2RlciByZWR1bmRhbmN5X3JjOwogICAgIFNpbGtDb250ZXh0ICpzaWxrOwotICAgIENlbHRDb250ZXh0ICpjZWx0OworICAgIENlbHRGcmFtZSAqY2VsdDsKICAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKIAogICAgIGZsb2F0IHNpbGtfYnVmWzJdWzk2MF07CkBAIC0xNzIsNyArMTUwLDkgQEAKIH0gQ2hhbm5lbE1hcDsKIAogdHlwZWRlZiBzdHJ1Y3QgT3B1c0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmF2X2NsYXNzOwogICAgIE9wdXNTdHJlYW1Db250ZXh0ICpzdHJlYW1zOworICAgIGludCBhcHBseV9waGFzZV9pbnY7CiAKICAgICAvKiBjdXJyZW50IG91dHB1dCBidWZmZXJzIGZvciBlYWNoIHN0cmVhbXMgKi8KICAgICBmbG9hdCAqKm91dDsKQEAgLTE5MywyMTAgKzE3Myw2IEBACiAgICAgQ2hhbm5lbE1hcCAqY2hhbm5lbF9tYXBzOwogfSBPcHVzQ29udGV4dDsKIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBvcHVzX3JjX25vcm1hbGl6ZShPcHVzUmFuZ2VDb2RlciAqcmMpCi17Ci0gICAgd2hpbGUgKHJjLT5yYW5nZSA8PSAxPDwyMykgewotICAgICAgICByYy0+dmFsdWUgPSAoKHJjLT52YWx1ZSA8PCA4KSB8IChnZXRfYml0cygmcmMtPmdiLCA4KSBeIDB4RkYpKSAmICgoMXUgPDwgMzEpIC0gMSk7Ci0gICAgICAgIHJjLT5yYW5nZSAgICAgICAgICA8PD0gODsKLSAgICAgICAgcmMtPnRvdGFsX3JlYWRfYml0cyArPSA4OwotICAgIH0KLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBvcHVzX3JjX3VwZGF0ZShPcHVzUmFuZ2VDb2RlciAqcmMsIHVuc2lnbmVkIGludCBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBsb3csIHVuc2lnbmVkIGludCBoaWdoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRvdGFsKQotewotICAgIHJjLT52YWx1ZSAtPSBzY2FsZSAqICh0b3RhbCAtIGhpZ2gpOwotICAgIHJjLT5yYW5nZSAgPSBsb3cgPyBzY2FsZSAqIChoaWdoIC0gbG93KQotICAgICAgICAgICAgICAgICAgICAgIDogcmMtPnJhbmdlIC0gc2NhbGUgKiAodG90YWwgLSBoaWdoKTsKLSAgICBvcHVzX3JjX25vcm1hbGl6ZShyYyk7Ci19Ci0KLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBvcHVzX3JjX2dldHN5bWJvbChPcHVzUmFuZ2VDb2RlciAqcmMsIGNvbnN0IHVpbnQxNl90ICpjZGYpCi17Ci0gICAgdW5zaWduZWQgaW50IGssIHNjYWxlLCB0b3RhbCwgc3ltYm9sLCBsb3csIGhpZ2g7Ci0KLSAgICB0b3RhbCA9ICpjZGYrKzsKLQotICAgIHNjYWxlICAgPSByYy0+cmFuZ2UgLyB0b3RhbDsKLSAgICBzeW1ib2wgPSByYy0+dmFsdWUgLyBzY2FsZSArIDE7Ci0gICAgc3ltYm9sID0gdG90YWwgLSBGRk1JTihzeW1ib2wsIHRvdGFsKTsKLQotICAgIGZvciAoayA9IDA7IGNkZltrXSA8PSBzeW1ib2w7IGsrKyk7Ci0gICAgaGlnaCA9IGNkZltrXTsKLSAgICBsb3cgID0gayA/IGNkZltrLTFdIDogMDsKLQotICAgIG9wdXNfcmNfdXBkYXRlKHJjLCBzY2FsZSwgbG93LCBoaWdoLCB0b3RhbCk7Ci0KLSAgICByZXR1cm4gazsKLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IG9wdXNfcmNfcDJtb2RlbChPcHVzUmFuZ2VDb2RlciAqcmMsIHVuc2lnbmVkIGludCBiaXRzKQotewotICAgIHVuc2lnbmVkIGludCBrLCBzY2FsZTsKLSAgICBzY2FsZSA9IHJjLT5yYW5nZSA+PiBiaXRzOyAvLyBpbiB0aGlzIGNhc2UsIHNjYWxlID0gc3ltYm9sCi0KLSAgICBpZiAocmMtPnZhbHVlID49IHNjYWxlKSB7Ci0gICAgICAgIHJjLT52YWx1ZSAtPSBzY2FsZTsKLSAgICAgICAgcmMtPnJhbmdlIC09IHNjYWxlOwotICAgICAgICBrID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICByYy0+cmFuZ2UgPSBzY2FsZTsKLSAgICAgICAgayA9IDE7Ci0gICAgfQotICAgIG9wdXNfcmNfbm9ybWFsaXplKHJjKTsKLSAgICByZXR1cm4gazsKLX0KLQotLyoqCi0gKiBDRUxUOiBlc3RpbWF0ZSBiaXRzIG9mIGVudHJvcHkgdGhhdCBoYXZlIHRodXMgZmFyIGJlZW4gY29uc3VtZWQgZm9yIHRoZQotICogICAgICAgY3VycmVudCBDRUxUIGZyYW1lLCB0byBpbnRlZ2VyIGFuZCBmcmFjdGlvbmFsICgxLzh0aCBiaXQpIHByZWNpc2lvbgotICovCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgb3B1c19yY190ZWxsKGNvbnN0IE9wdXNSYW5nZUNvZGVyICpyYykKLXsKLSAgICByZXR1cm4gcmMtPnRvdGFsX3JlYWRfYml0cyAtIGF2X2xvZzIocmMtPnJhbmdlKSAtIDE7Ci19Ci0KLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBvcHVzX3JjX3RlbGxfZnJhYyhjb25zdCBPcHVzUmFuZ2VDb2RlciAqcmMpCi17Ci0gICAgdW5zaWduZWQgaW50IGksIHRvdGFsX2JpdHMsIHJjYnVmZmVyLCByYW5nZTsKLQotICAgIHRvdGFsX2JpdHMgPSByYy0+dG90YWxfcmVhZF9iaXRzIDw8IDM7Ci0gICAgcmNidWZmZXIgICA9IGF2X2xvZzIocmMtPnJhbmdlKSArIDE7Ci0gICAgcmFuZ2UgICAgICA9IHJjLT5yYW5nZSA+PiAocmNidWZmZXItMTYpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICBpbnQgYml0OwotICAgICAgICByYW5nZSA9IHJhbmdlICogcmFuZ2UgPj4gMTU7Ci0gICAgICAgIGJpdCA9IHJhbmdlID4+IDE2OwotICAgICAgICByY2J1ZmZlciA9IHJjYnVmZmVyIDw8IDEgfCBiaXQ7Ci0gICAgICAgIHJhbmdlID4+PSBiaXQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRvdGFsX2JpdHMgLSByY2J1ZmZlcjsKLX0KLQotLyoqCi0gKiBDRUxUOiByZWFkIDEtMjUgcmF3IGJpdHMgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUsIGJhY2t3YXJkcyBieXRlLXdpc2UKLSAqLwotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IG9wdXNfZ2V0cmF3Yml0cyhPcHVzUmFuZ2VDb2RlciAqcmMsIHVuc2lnbmVkIGludCBjb3VudCkKLXsKLSAgICB1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOwotCi0gICAgd2hpbGUgKHJjLT5yYi5ieXRlcyAmJiByYy0+cmIuY2FjaGVsZW4gPCBjb3VudCkgewotICAgICAgICByYy0+cmIuY2FjaGV2YWwgfD0gKi0tcmMtPnJiLnBvc2l0aW9uIDw8IHJjLT5yYi5jYWNoZWxlbjsKLSAgICAgICAgcmMtPnJiLmNhY2hlbGVuICs9IDg7Ci0gICAgICAgIHJjLT5yYi5ieXRlcy0tOwotICAgIH0KLQotICAgIHZhbHVlID0gYXZfbW9kX3VpbnRwMihyYy0+cmIuY2FjaGV2YWwsIGNvdW50KTsKLSAgICByYy0+cmIuY2FjaGV2YWwgICAgPj49IGNvdW50OwotICAgIHJjLT5yYi5jYWNoZWxlbiAgICAgLT0gY291bnQ7Ci0gICAgcmMtPnRvdGFsX3JlYWRfYml0cyArPSBjb3VudDsKLQotICAgIHJldHVybiB2YWx1ZTsKLX0KLQotLyoqCi0gKiBDRUxUOiByZWFkIGEgdW5pZm9ybSBkaXN0cmlidXRpb24KLSAqLwotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IG9wdXNfcmNfdW5pbW9kZWwoT3B1c1JhbmdlQ29kZXIgKnJjLCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLSAgICB1bnNpZ25lZCBpbnQgYml0cywgaywgc2NhbGUsIHRvdGFsOwotCi0gICAgYml0cyAgPSBvcHVzX2lsb2coc2l6ZSAtIDEpOwotICAgIHRvdGFsID0gKGJpdHMgPiA4KSA/ICgoc2l6ZSAtIDEpID4+IChiaXRzIC0gOCkpICsgMSA6IHNpemU7Ci0KLSAgICBzY2FsZSAgPSByYy0+cmFuZ2UgLyB0b3RhbDsKLSAgICBrICAgICAgPSByYy0+dmFsdWUgLyBzY2FsZSArIDE7Ci0gICAgayAgICAgID0gdG90YWwgLSBGRk1JTihrLCB0b3RhbCk7Ci0gICAgb3B1c19yY191cGRhdGUocmMsIHNjYWxlLCBrLCBrICsgMSwgdG90YWwpOwotCi0gICAgaWYgKGJpdHMgPiA4KSB7Ci0gICAgICAgIGsgPSBrIDw8IChiaXRzIC0gOCkgfCBvcHVzX2dldHJhd2JpdHMocmMsIGJpdHMgLSA4KTsKLSAgICAgICAgcmV0dXJuIEZGTUlOKGssIHNpemUgLSAxKTsKLSAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIGs7Ci19Ci0KLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBvcHVzX3JjX2xhcGxhY2UoT3B1c1JhbmdlQ29kZXIgKnJjLCB1bnNpZ25lZCBpbnQgc3ltYm9sLCBpbnQgZGVjYXkpCi17Ci0gICAgLyogZXh0ZW5kcyB0aGUgcmFuZ2UgY29kZXIgdG8gbW9kZWwgYSBMYXBsYWNlIGRpc3RyaWJ1dGlvbiAqLwotICAgIGludCB2YWx1ZSA9IDA7Ci0gICAgdW5zaWduZWQgaW50IHNjYWxlLCBsb3cgPSAwLCBjZW50ZXI7Ci0KLSAgICBzY2FsZSAgPSByYy0+cmFuZ2UgPj4gMTU7Ci0gICAgY2VudGVyID0gcmMtPnZhbHVlIC8gc2NhbGUgKyAxOwotICAgIGNlbnRlciA9ICgxIDw8IDE1KSAtIEZGTUlOKGNlbnRlciwgMSA8PCAxNSk7Ci0KLSAgICBpZiAoY2VudGVyID49IHN5bWJvbCkgewotICAgICAgICB2YWx1ZSsrOwotICAgICAgICBsb3cgPSBzeW1ib2w7Ci0gICAgICAgIHN5bWJvbCA9IDEgKyAoKDMyNzY4IC0gMzIgLSBzeW1ib2wpICogKDE2Mzg0LWRlY2F5KSA+PiAxNSk7Ci0KLSAgICAgICAgd2hpbGUgKHN5bWJvbCA+IDEgJiYgY2VudGVyID49IGxvdyArIDIgKiBzeW1ib2wpIHsKLSAgICAgICAgICAgIHZhbHVlKys7Ci0gICAgICAgICAgICBzeW1ib2wgKj0gMjsKLSAgICAgICAgICAgIGxvdyAgICArPSBzeW1ib2w7Ci0gICAgICAgICAgICBzeW1ib2wgID0gKCgoc3ltYm9sIC0gMikgKiBkZWNheSkgPj4gMTUpICsgMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzeW1ib2wgPD0gMSkgewotICAgICAgICAgICAgaW50IGRpc3RhbmNlID0gKGNlbnRlciAtIGxvdykgPj4gMTsKLSAgICAgICAgICAgIHZhbHVlICs9IGRpc3RhbmNlOwotICAgICAgICAgICAgbG93ICAgKz0gMiAqIGRpc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNlbnRlciA8IGxvdyArIHN5bWJvbCkKLSAgICAgICAgICAgIHZhbHVlICo9IC0xOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsb3cgKz0gc3ltYm9sOwotICAgIH0KLQotICAgIG9wdXNfcmNfdXBkYXRlKHJjLCBzY2FsZSwgbG93LCBGRk1JTihsb3cgKyBzeW1ib2wsIDMyNzY4KSwgMzI3NjgpOwotCi0gICAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBpbnQgb3B1c19yY19zdGVwbW9kZWwoT3B1c1JhbmdlQ29kZXIgKnJjLCBpbnQgazApCi17Ci0gICAgLyogVXNlIGEgcHJvYmFiaWxpdHkgb2YgMyB1cCB0byBpdGhldGE9ODE5MiBhbmQgdGhlbiB1c2UgMSBhZnRlciAqLwotICAgIHVuc2lnbmVkIGludCBrLCBzY2FsZSwgc3ltYm9sLCB0b3RhbCA9IChrMCsxKSozICsgazA7Ci0gICAgc2NhbGUgID0gcmMtPnJhbmdlIC8gdG90YWw7Ci0gICAgc3ltYm9sID0gcmMtPnZhbHVlIC8gc2NhbGUgKyAxOwotICAgIHN5bWJvbCA9IHRvdGFsIC0gRkZNSU4oc3ltYm9sLCB0b3RhbCk7Ci0KLSAgICBrID0gKHN5bWJvbCA8IChrMCsxKSozKSA/IHN5bWJvbC8zIDogc3ltYm9sIC0gKGswKzEpKjI7Ci0KLSAgICBvcHVzX3JjX3VwZGF0ZShyYywgc2NhbGUsIChrIDw9IGswKSA/IDMqKGsrMCkgOiAoay0xLWswKSArIDMqKGswKzEpLAotICAgICAgICAgICAgICAgICAgIChrIDw9IGswKSA/IDMqKGsrMSkgOiAoay0wLWswKSArIDMqKGswKzEpLCB0b3RhbCk7Ci0gICAgcmV0dXJuIGs7Ci19Ci0KLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVuc2lnbmVkIGludCBvcHVzX3JjX3RyaW1vZGVsKE9wdXNSYW5nZUNvZGVyICpyYywgaW50IHFuKQotewotICAgIHVuc2lnbmVkIGludCBrLCBzY2FsZSwgc3ltYm9sLCB0b3RhbCwgbG93LCBjZW50ZXI7Ci0KLSAgICB0b3RhbCA9ICgocW4+PjEpICsgMSkgKiAoKHFuPj4xKSArIDEpOwotICAgIHNjYWxlICAgPSByYy0+cmFuZ2UgLyB0b3RhbDsKLSAgICBjZW50ZXIgPSByYy0+dmFsdWUgLyBzY2FsZSArIDE7Ci0gICAgY2VudGVyID0gdG90YWwgLSBGRk1JTihjZW50ZXIsIHRvdGFsKTsKLQotICAgIGlmIChjZW50ZXIgPCB0b3RhbCA+PiAxKSB7Ci0gICAgICAgIGsgICAgICA9IChmZl9zcXJ0KDggKiBjZW50ZXIgKyAxKSAtIDEpID4+IDE7Ci0gICAgICAgIGxvdyAgICA9IGsgKiAoayArIDEpID4+IDE7Ci0gICAgICAgIHN5bWJvbCA9IGsgKyAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGsgICAgICA9ICgyKihxbiArIDEpIC0gZmZfc3FydCg4Kih0b3RhbCAtIGNlbnRlciAtIDEpICsgMSkpID4+IDE7Ci0gICAgICAgIGxvdyAgICA9IHRvdGFsIC0gKChxbiArIDEgLSBrKSAqIChxbiArIDIgLSBrKSA+PiAxKTsKLSAgICAgICAgc3ltYm9sID0gcW4gKyAxIC0gazsKLSAgICB9Ci0KLSAgICBvcHVzX3JjX3VwZGF0ZShyYywgc2NhbGUsIGxvdywgbG93ICsgc3ltYm9sLCB0b3RhbCk7Ci0KLSAgICByZXR1cm4gazsKLX0KLQogaW50IGZmX29wdXNfcGFyc2VfcGFja2V0KE9wdXNQYWNrZXQgKnBrdCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlbGZfZGVsaW1pdGVkKTsKIApAQCAtNDE1LDE2ICsxOTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gT3B1c0JhbmR3aWR0aCBiYW5kd2lkdGgsIGludCBjb2RlZF9jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbl9tcyk7CiAKLWludCBmZl9jZWx0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBDZWx0Q29udGV4dCAqKnMsIGludCBvdXRwdXRfY2hhbm5lbHMpOworLyogRW5jb2RlIG9yIGRlY29kZSBDRUxUIGJhbmRzICovCit2b2lkIGZmX2NlbHRfcXVhbnRfYmFuZHMoQ2VsdEZyYW1lICpmLCBPcHVzUmFuZ2VDb2RlciAqcmMpOwogCi12b2lkIGZmX2NlbHRfZnJlZShDZWx0Q29udGV4dCAqKnMpOwotCi12b2lkIGZmX2NlbHRfZmx1c2goQ2VsdENvbnRleHQgKnMpOwotCi1pbnQgZmZfY2VsdF9kZWNvZGVfZnJhbWUoQ2VsdENvbnRleHQgKnMsIE9wdXNSYW5nZUNvZGVyICpyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm91dHB1dCwgaW50IGNvZGVkX2NoYW5uZWxzLCBpbnQgZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRiYW5kLCAgaW50IGVuZGJhbmQpOwotCi1leHRlcm4gY29uc3QgZmxvYXQgZmZfY2VsdF93aW5kb3cyWzEyMF07CisvKiBFbmNvZGUgb3IgZGVjb2RlIENFTFQgYml0YWxsb2NhdGlvbiAqLwordm9pZCBmZl9jZWx0X2JpdGFsbG9jKENlbHRGcmFtZSAqZiwgT3B1c1JhbmdlQ29kZXIgKnJjLCBpbnQgZW5jb2RlKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfT1BVU19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29wdXNfY2VsdC5jIGIvbGliYXZjb2RlYy9vcHVzX2NlbHQuYwppbmRleCA2MWE5ZGM2Li4xMTVkZDhjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL29wdXNfY2VsdC5jCisrKyBiL2xpYmF2Y29kZWMvb3B1c19jZWx0LmMKQEAgLTEsNiArMSw3IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJldyBEJ0FkZGVzaW8KICAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMjQsMTY3MSArMjUsMTQyIEBACiAgKiBPcHVzIENFTFQgZGVjb2RlcgogICovCiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJvcHVzX2NlbHQuaCIKKyNpbmNsdWRlICJvcHVzdGFiLmgiCisjaW5jbHVkZSAib3B1c19wdnEuaCIKIAotI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgotCi0jaW5jbHVkZSAiaW1kY3QxNS5oIgotI2luY2x1ZGUgIm9wdXMuaCIKLQotZW51bSBDZWx0U3ByZWFkIHsKLSAgICBDRUxUX1NQUkVBRF9OT05FLAotICAgIENFTFRfU1BSRUFEX0xJR0hULAotICAgIENFTFRfU1BSRUFEX05PUk1BTCwKLSAgICBDRUxUX1NQUkVBRF9BR0dSRVNTSVZFCi19OwotCi10eXBlZGVmIHN0cnVjdCBDZWx0RnJhbWUgewotICAgIGZsb2F0IGVuZXJneVtDRUxUX01BWF9CQU5EU107Ci0gICAgZmxvYXQgcHJldl9lbmVyZ3lbMl1bQ0VMVF9NQVhfQkFORFNdOwotCi0gICAgdWludDhfdCBjb2xsYXBzZV9tYXNrc1tDRUxUX01BWF9CQU5EU107Ci0KLSAgICAvKiBidWZmZXIgZm9yIG1kY3Qgb3V0cHV0ICsgcG9zdGZpbHRlciAqLwotICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGJ1ZilbMjA0OF07Ci0KLSAgICAvKiBwb3N0ZmlsdGVyIHBhcmFtZXRlcnMgKi8KLSAgICBpbnQgcGZfcGVyaW9kX25ldzsKLSAgICBmbG9hdCBwZl9nYWluc19uZXdbM107Ci0gICAgaW50IHBmX3BlcmlvZDsKLSAgICBmbG9hdCBwZl9nYWluc1szXTsKLSAgICBpbnQgcGZfcGVyaW9kX29sZDsKLSAgICBmbG9hdCBwZl9nYWluc19vbGRbM107Ci0KLSAgICBmbG9hdCBkZWVtcGhfY29lZmY7Ci19IENlbHRGcmFtZTsKLQotc3RydWN0IENlbHRDb250ZXh0IHsKLSAgICAvLyBjb25zdGFudCB2YWx1ZXMgdGhhdCBkbyBub3QgY2hhbmdlIGR1cmluZyBjb250ZXh0IGxpZmV0aW1lCi0gICAgQVZDb2RlY0NvbnRleHQgICAgKmF2Y3R4OwotICAgIElNRENUMTVDb250ZXh0ICAgICppbWRjdFs0XTsKLSAgICBBVkZsb2F0RFNQQ29udGV4dCAgKmRzcDsKLSAgICBpbnQgb3V0cHV0X2NoYW5uZWxzOwotCi0gICAgLy8gdmFsdWVzIHRoYXQgaGF2ZSBpbnRlci1mcmFtZSBlZmZlY3QgYW5kIG11c3QgYmUgcmVzZXQgb24gZmx1c2gKLSAgICBDZWx0RnJhbWUgZnJhbWVbMl07Ci0gICAgdWludDMyX3Qgc2VlZDsKLSAgICBpbnQgZmx1c2hlZDsKLQotICAgIC8vIHZhbHVlcyB0aGF0IG9ubHkgYWZmZWN0IGEgc2luZ2xlIGZyYW1lCi0gICAgaW50IGNvZGVkX2NoYW5uZWxzOwotICAgIGludCBmcmFtZWJpdHM7Ci0gICAgaW50IGR1cmF0aW9uOwotCi0gICAgLyogbnVtYmVyIG9mIGlNRENUIGJsb2NrcyBpbiB0aGUgZnJhbWUgKi8KLSAgICBpbnQgYmxvY2tzOwotICAgIC8qIHNpemUgb2YgZWFjaCBibG9jayAqLwotICAgIGludCBibG9ja3NpemU7Ci0KLSAgICBpbnQgc3RhcnRiYW5kOwotICAgIGludCBlbmRiYW5kOwotICAgIGludCBjb2RlZGJhbmRzOwotCi0gICAgaW50IGFudGljb2xsYXBzZV9iaXQ7Ci0KLSAgICBpbnQgaW50ZW5zaXR5c3RlcmVvOwotICAgIGludCBkdWFsc3RlcmVvOwotICAgIGVudW0gQ2VsdFNwcmVhZCBzcHJlYWQ7Ci0KLSAgICBpbnQgcmVtYWluaW5nOwotICAgIGludCByZW1haW5pbmcyOwotICAgIGludCBmaW5lX2JpdHMgICAgW0NFTFRfTUFYX0JBTkRTXTsKLSAgICBpbnQgZmluZV9wcmlvcml0eVtDRUxUX01BWF9CQU5EU107Ci0gICAgaW50IHB1bHNlcyAgICAgICBbQ0VMVF9NQVhfQkFORFNdOwotICAgIGludCB0Zl9jaGFuZ2UgICAgW0NFTFRfTUFYX0JBTkRTXTsKLQotICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIGNvZWZmcylbMl1bQ0VMVF9NQVhfRlJBTUVfU0laRV07Ci0gICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc2NyYXRjaClbMjIgKiA4XTsgLy8gTUFYKGNlbHRfZnJlcV9yYW5nZSkgKiAxPDxDRUxUX01BWF9MT0dfQkxPQ0tTCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgY2VsdF9tb2RlbF90YXBzZXRbXSA9IHsgNCwgMiwgMywgNCB9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgY2VsdF9tb2RlbF9zcHJlYWRbXSA9IHsgMzIsIDcsIDksIDMwLCAzMiB9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgY2VsdF9tb2RlbF9hbGxvY190cmltW10gPSB7Ci0gICAgMTI4LCAgIDIsICAgNCwgICA5LCAgMTksICA0MSwgIDg3LCAxMDksIDExOSwgMTI0LCAxMjYsIDEyOAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGNlbHRfbW9kZWxfZW5lcmd5X3NtYWxsW10gPSB7IDQsIDIsIDMsIDQgfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9mcmVxX2JhbmRzW10gPSB7IC8qIGluIHN0ZXBzIG9mIDIwMEh6ICovCi0gICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAxMCwgMTIsIDE0LCAxNiwgMjAsIDI0LCAyOCwgMzQsIDQwLCA0OCwgNjAsIDc4LCAxMDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGNlbHRfZnJlcV9yYW5nZVtdID0gewotICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMiwgIDIsICAyLCAgMiwgIDQsICA0LCAgNCwgIDYsICA2LCAgOCwgMTIsIDE4LCAyMgotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9sb2dfZnJlcV9yYW5nZVtdID0gewotICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOCwgIDgsICA4LCAgOCwgMTYsIDE2LCAxNiwgMjEsIDIxLCAyNCwgMjksIDM0LCAzNgotfTsKLQotc3RhdGljIGNvbnN0IGludDhfdCBjZWx0X3RmX3NlbGVjdFs0XVsyXVsyXVsyXSA9IHsKLSAgICB7IHsgeyAwLCAtMSB9LCB7IDAsIC0xIH0gfSwgeyB7IDAsIC0xIH0sIHsgMCwgLTEgfSB9IH0sCi0gICAgeyB7IHsgMCwgLTEgfSwgeyAwLCAtMiB9IH0sIHsgeyAxLCAgMCB9LCB7IDEsIC0xIH0gfSB9LAotICAgIHsgeyB7IDAsIC0yIH0sIHsgMCwgLTMgfSB9LCB7IHsgMiwgIDAgfSwgeyAxLCAtMSB9IH0gfSwKLSAgICB7IHsgeyAwLCAtMiB9LCB7IDAsIC0zIH0gfSwgeyB7IDMsICAwIH0sIHsgMSwgLTEgfSB9IH0KLX07Ci0KLXN0YXRpYyBjb25zdCBmbG9hdCBjZWx0X21lYW5fZW5lcmd5W10gPSB7Ci0gICAgNi40Mzc1MDBmLCA2LjI1MDAwMGYsIDUuNzUwMDAwZiwgNS4zMTI1MDBmLCA1LjA2MjUwMGYsCi0gICAgNC44MTI1MDBmLCA0LjUwMDAwMGYsIDQuMzc1MDAwZiwgNC44NzUwMDBmLCA0LjY4NzUwMGYsCi0gICAgNC41NjI1MDBmLCA0LjQzNzUwMGYsIDQuODc1MDAwZiwgNC42MjUwMDBmLCA0LjMxMjUwMGYsCi0gICAgNC41MDAwMDBmLCA0LjM3NTAwMGYsIDQuNjI1MDAwZiwgNC43NTAwMDBmLCA0LjQzNzUwMGYsCi0gICAgMy43NTAwMDBmLCAzLjc1MDAwMGYsIDMuNzUwMDAwZiwgMy43NTAwMDBmLCAzLjc1MDAwMGYKLX07Ci0KLXN0YXRpYyBjb25zdCBmbG9hdCBjZWx0X2FscGhhX2NvZWZbXSA9IHsKLSAgICAyOTQ0MC4wZi8zMjc2OC4wZiwgICAgMjYxMTIuMGYvMzI3NjguMGYsICAgIDIxMjQ4LjBmLzMyNzY4LjBmLCAgICAxNjM4NC4wZi8zMjc2OC4wZgotfTsKLQotc3RhdGljIGNvbnN0IGZsb2F0IGNlbHRfYmV0YV9jb2VmW10gPSB7IC8qIFRPRE86IHByZWNvbXB1dGUgMSBtaW51cyB0aGlzIGlmIHRoZSBjb2RlIGVuZHMgdXAgbmVhdGVyICovCi0gICAgMzAxNDcuMGYvMzI3NjguMGYsICAgIDIyMjgyLjBmLzMyNzY4LjBmLCAgICAxMjEyNC4wZi8zMjc2OC4wZiwgICAgIDY1NTQuMGYvMzI3NjguMGYKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGNlbHRfY29hcnNlX2VuZXJneV9kaXN0WzRdWzJdWzQyXSA9IHsKLSAgICB7Ci0gICAgICAgIHsgICAgICAgLy8gMTIwLXNhbXBsZSBpbnRlcgotICAgICAgICAgICAgIDcyLCAxMjcsICA2NSwgMTI5LCAgNjYsIDEyOCwgIDY1LCAxMjgsICA2NCwgMTI4LCAgNjIsIDEyOCwgIDY0LCAxMjgsCi0gICAgICAgICAgICAgNjQsIDEyOCwgIDkyLCAgNzgsICA5MiwgIDc5LCAgOTIsICA3OCwgIDkwLCAgNzksIDExNiwgIDQxLCAxMTUsICA0MCwKLSAgICAgICAgICAgIDExNCwgIDQwLCAxMzIsICAyNiwgMTMyLCAgMjYsIDE0NSwgIDE3LCAxNjEsICAxMiwgMTc2LCAgMTAsIDE3NywgIDExCi0gICAgICAgIH0sIHsgICAgLy8gMTIwLXNhbXBsZSBpbnRyYQotICAgICAgICAgICAgIDI0LCAxNzksICA0OCwgMTM4LCAgNTQsIDEzNSwgIDU0LCAxMzIsICA1MywgMTM0LCAgNTYsIDEzMywgIDU1LCAxMzIsCi0gICAgICAgICAgICAgNTUsIDEzMiwgIDYxLCAxMTQsICA3MCwgIDk2LCAgNzQsICA4OCwgIDc1LCAgODgsICA4NywgIDc0LCAgODksICA2NiwKLSAgICAgICAgICAgICA5MSwgIDY3LCAxMDAsICA1OSwgMTA4LCAgNTAsIDEyMCwgIDQwLCAxMjIsICAzNywgIDk3LCAgNDMsICA3OCwgIDUwCi0gICAgICAgIH0KLSAgICB9LCB7Ci0gICAgICAgIHsgICAgICAgLy8gMjQwLXNhbXBsZSBpbnRlcgotICAgICAgICAgICAgIDgzLCAgNzgsICA4NCwgIDgxLCAgODgsICA3NSwgIDg2LCAgNzQsICA4NywgIDcxLCAgOTAsICA3MywgIDkzLCAgNzQsCi0gICAgICAgICAgICAgOTMsICA3NCwgMTA5LCAgNDAsIDExNCwgIDM2LCAxMTcsICAzNCwgMTE3LCAgMzQsIDE0MywgIDE3LCAxNDUsICAxOCwKLSAgICAgICAgICAgIDE0NiwgIDE5LCAxNjIsICAxMiwgMTY1LCAgMTAsIDE3OCwgICA3LCAxODksICAgNiwgMTkwLCAgIDgsIDE3NywgICA5Ci0gICAgICAgIH0sIHsgICAgLy8gMjQwLXNhbXBsZSBpbnRyYQotICAgICAgICAgICAgIDIzLCAxNzgsICA1NCwgMTE1LCAgNjMsIDEwMiwgIDY2LCAgOTgsICA2OSwgIDk5LCAgNzQsICA4OSwgIDcxLCAgOTEsCi0gICAgICAgICAgICAgNzMsICA5MSwgIDc4LCAgODksICA4NiwgIDgwLCAgOTIsICA2NiwgIDkzLCAgNjQsIDEwMiwgIDU5LCAxMDMsICA2MCwKLSAgICAgICAgICAgIDEwNCwgIDYwLCAxMTcsICA1MiwgMTIzLCAgNDQsIDEzOCwgIDM1LCAxMzMsICAzMSwgIDk3LCAgMzgsICA3NywgIDQ1Ci0gICAgICAgIH0KLSAgICB9LCB7Ci0gICAgICAgIHsgICAgICAgLy8gNDgwLXNhbXBsZSBpbnRlcgotICAgICAgICAgICAgIDYxLCAgOTAsICA5MywgIDYwLCAxMDUsICA0MiwgMTA3LCAgNDEsIDExMCwgIDQ1LCAxMTYsICAzOCwgMTEzLCAgMzgsCi0gICAgICAgICAgICAxMTIsICAzOCwgMTI0LCAgMjYsIDEzMiwgIDI3LCAxMzYsICAxOSwgMTQwLCAgMjAsIDE1NSwgIDE0LCAxNTksICAxNiwKLSAgICAgICAgICAgIDE1OCwgIDE4LCAxNzAsICAxMywgMTc3LCAgMTAsIDE4NywgICA4LCAxOTIsICAgNiwgMTc1LCAgIDksIDE1OSwgIDEwCi0gICAgICAgIH0sIHsgICAgLy8gNDgwLXNhbXBsZSBpbnRyYQotICAgICAgICAgICAgIDIxLCAxNzgsICA1OSwgMTEwLCAgNzEsICA4NiwgIDc1LCAgODUsICA4NCwgIDgzLCAgOTEsICA2NiwgIDg4LCAgNzMsCi0gICAgICAgICAgICAgODcsICA3MiwgIDkyLCAgNzUsICA5OCwgIDcyLCAxMDUsICA1OCwgMTA3LCAgNTQsIDExNSwgIDUyLCAxMTQsICA1NSwKLSAgICAgICAgICAgIDExMiwgIDU2LCAxMjksICA1MSwgMTMyLCAgNDAsIDE1MCwgIDMzLCAxNDAsICAyOSwgIDk4LCAgMzUsICA3NywgIDQyCi0gICAgICAgIH0KLSAgICB9LCB7Ci0gICAgICAgIHsgICAgICAgLy8gOTYwLXNhbXBsZSBpbnRlcgotICAgICAgICAgICAgIDQyLCAxMjEsICA5NiwgIDY2LCAxMDgsICA0MywgMTExLCAgNDAsIDExNywgIDQ0LCAxMjMsICAzMiwgMTIwLCAgMzYsCi0gICAgICAgICAgICAxMTksICAzMywgMTI3LCAgMzMsIDEzNCwgIDM0LCAxMzksICAyMSwgMTQ3LCAgMjMsIDE1MiwgIDIwLCAxNTgsICAyNSwKLSAgICAgICAgICAgIDE1NCwgIDI2LCAxNjYsICAyMSwgMTczLCAgMTYsIDE4NCwgIDEzLCAxODQsICAxMCwgMTUwLCAgMTMsIDEzOSwgIDE1Ci0gICAgICAgIH0sIHsgICAgLy8gOTYwLXNhbXBsZSBpbnRyYQotICAgICAgICAgICAgIDIyLCAxNzgsICA2MywgMTE0LCAgNzQsICA4MiwgIDg0LCAgODMsICA5MiwgIDgyLCAxMDMsICA2MiwgIDk2LCAgNzIsCi0gICAgICAgICAgICAgOTYsICA2NywgMTAxLCAgNzMsIDEwNywgIDcyLCAxMTMsICA1NSwgMTE4LCAgNTIsIDEyNSwgIDUyLCAxMTgsICA1MiwKLSAgICAgICAgICAgIDExNywgIDU1LCAxMzUsICA0OSwgMTM3LCAgMzksIDE1NywgIDMyLCAxNDUsICAyOSwgIDk3LCAgMzMsICA3NywgIDQwCi0gICAgICAgIH0KLSAgICB9Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBjZWx0X3N0YXRpY19hbGxvY1sxMV1bMjFdID0geyAgLyogMS8zMiBiaXQvc2FtcGxlICovCi0gICAgeyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sCi0gICAgeyAgOTAsICA4MCwgIDc1LCAgNjksICA2MywgIDU2LCAgNDksICA0MCwgIDM0LCAgMjksICAyMCwgIDE4LCAgMTAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sCi0gICAgeyAxMTAsIDEwMCwgIDkwLCAgODQsICA3OCwgIDcxLCAgNjUsICA1OCwgIDUxLCAgNDUsICAzOSwgIDMyLCAgMjYsICAyMCwgIDEyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sCi0gICAgeyAxMTgsIDExMCwgMTAzLCAgOTMsICA4NiwgIDgwLCAgNzUsICA3MCwgIDY1LCAgNTksICA1MywgIDQ3LCAgNDAsICAzMSwgIDIzLCAgMTUsICAgNCwgICAwLCAgIDAsICAgMCwgICAwIH0sCi0gICAgeyAxMjYsIDExOSwgMTEyLCAxMDQsICA5NSwgIDg5LCAgODMsICA3OCwgIDcyLCAgNjYsICA2MCwgIDU0LCAgNDcsICAzOSwgIDMyLCAgMjUsICAxNywgIDEyLCAgIDEsICAgMCwgICAwIH0sCi0gICAgeyAxMzQsIDEyNywgMTIwLCAxMTQsIDEwMywgIDk3LCAgOTEsICA4NSwgIDc4LCAgNzIsICA2NiwgIDYwLCAgNTQsICA0NywgIDQxLCAgMzUsICAyOSwgIDIzLCAgMTYsICAxMCwgICAxIH0sCi0gICAgeyAxNDQsIDEzNywgMTMwLCAxMjQsIDExMywgMTA3LCAxMDEsICA5NSwgIDg4LCAgODIsICA3NiwgIDcwLCAgNjQsICA1NywgIDUxLCAgNDUsICAzOSwgIDMzLCAgMjYsICAxNSwgICAxIH0sCi0gICAgeyAxNTIsIDE0NSwgMTM4LCAxMzIsIDEyMywgMTE3LCAxMTEsIDEwNSwgIDk4LCAgOTIsICA4NiwgIDgwLCAgNzQsICA2NywgIDYxLCAgNTUsICA0OSwgIDQzLCAgMzYsICAyMCwgICAxIH0sCi0gICAgeyAxNjIsIDE1NSwgMTQ4LCAxNDIsIDEzMywgMTI3LCAxMjEsIDExNSwgMTA4LCAxMDIsICA5NiwgIDkwLCAgODQsICA3NywgIDcxLCAgNjUsICA1OSwgIDUzLCAgNDYsICAzMCwgICAxIH0sCi0gICAgeyAxNzIsIDE2NSwgMTU4LCAxNTIsIDE0MywgMTM3LCAxMzEsIDEyNSwgMTE4LCAxMTIsIDEwNiwgMTAwLCAgOTQsICA4NywgIDgxLCAgNzUsICA2OSwgIDYzLCAgNTYsICA0NSwgIDIwIH0sCi0gICAgeyAyMDAsIDIwMCwgMjAwLCAyMDAsIDIwMCwgMjAwLCAyMDAsIDIwMCwgMTk4LCAxOTMsIDE4OCwgMTgzLCAxNzgsIDE3MywgMTY4LCAxNjMsIDE1OCwgMTUzLCAxNDgsIDEyOSwgMTA0IH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGNlbHRfc3RhdGljX2NhcHNbNF1bMl1bMjFdID0gewotICAgIHsgICAgICAgLy8gMTIwLXNhbXBsZQotICAgICAgICB7MjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDE2MCwgMTYwLAotICAgICAgICAgMTYwLCAxNjAsIDE4NSwgMTg1LCAxODUsIDE3OCwgMTc4LCAxNjgsIDEzNCwgIDYxLCAgMzd9LAotICAgICAgICB7MjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDI0MCwgMjQwLAotICAgICAgICAgMjQwLCAyNDAsIDIwNywgMjA3LCAyMDcsIDE5OCwgMTk4LCAxODMsIDE0NCwgIDY2LCAgNDB9LAotICAgIH0sIHsgICAgLy8gMjQwLXNhbXBsZQotICAgICAgICB7MTYwLCAxNjAsIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTYwLCAxNjAsIDE4NSwgMTg1LAotICAgICAgICAgMTg1LCAxODUsIDE5MywgMTkzLCAxOTMsIDE4MywgMTgzLCAxNzIsIDEzOCwgIDY0LCAgMzh9LAotICAgICAgICB7MjQwLCAyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwgMjQwLCAyNDAsIDIwNywgMjA3LAotICAgICAgICAgMjA3LCAyMDcsIDIwNCwgMjA0LCAyMDQsIDE5MywgMTkzLCAxODAsIDE0MywgIDY2LCAgNDB9LAotICAgIH0sIHsgICAgLy8gNDgwLXNhbXBsZQotICAgICAgICB7MTg1LCAxODUsIDE4NSwgMTg1LCAxODUsIDE4NSwgMTg1LCAxODUsIDE5MywgMTkzLAotICAgICAgICAgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE4MywgMTgzLCAxNzIsIDEzOCwgIDY1LCAgMzl9LAotICAgICAgICB7MjA3LCAyMDcsIDIwNywgMjA3LCAyMDcsIDIwNywgMjA3LCAyMDcsIDIwNCwgMjA0LAotICAgICAgICAgMjA0LCAyMDQsIDIwMSwgMjAxLCAyMDEsIDE4OCwgMTg4LCAxNzYsIDE0MSwgIDY2LCAgNDB9LAotICAgIH0sIHsgICAgLy8gOTYwLXNhbXBsZQotICAgICAgICB7MTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMTkzLAotICAgICAgICAgMTkzLCAxOTMsIDE5NCwgMTk0LCAxOTQsIDE4NCwgMTg0LCAxNzMsIDEzOSwgIDY1LCAgMzl9LAotICAgICAgICB7MjA0LCAyMDQsIDIwNCwgMjA0LCAyMDQsIDIwNCwgMjA0LCAyMDQsIDIwMSwgMjAxLAotICAgICAgICAgMjAxLCAyMDEsIDE5OCwgMTk4LCAxOTgsIDE4NywgMTg3LCAxNzUsIDE0MCwgIDY2LCAgNDB9Ci0gICAgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9jYWNoZV9iaXRzWzM5Ml0gPSB7Ci0gICAgNDAsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCi0gICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKLSAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA0MCwgMTUsIDIzLCAyOCwKLSAgICAzMSwgMzQsIDM2LCAzOCwgMzksIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0NywgNDksIDUwLAotICAgIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTUsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2MywgNjUsCi0gICAgNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzEsIDQwLCAyMCwgMzMsIDQxLCA0OCwgNTMsIDU3LCA2MSwKLSAgICA2NCwgNjYsIDY5LCA3MSwgNzMsIDc1LCA3NiwgNzgsIDgwLCA4MiwgODUsIDg3LCA4OSwgOTEsIDkyLAotICAgIDk0LCA5NiwgOTgsIDEwMSwgMTAzLCAxMDUsIDEwNywgMTA4LCAxMTAsIDExMiwgMTE0LCAxMTcsIDExOSwgMTIxLCAxMjMsCi0gICAgMTI0LCAxMjYsIDEyOCwgNDAsIDIzLCAzOSwgNTEsIDYwLCA2NywgNzMsIDc5LCA4MywgODcsIDkxLCA5NCwKLSAgICA5NywgMTAwLCAxMDIsIDEwNSwgMTA3LCAxMTEsIDExNSwgMTE4LCAxMjEsIDEyNCwgMTI2LCAxMjksIDEzMSwgMTM1LCAxMzksCi0gICAgMTQyLCAxNDUsIDE0OCwgMTUwLCAxNTMsIDE1NSwgMTU5LCAxNjMsIDE2NiwgMTY5LCAxNzIsIDE3NCwgMTc3LCAxNzksIDM1LAotICAgIDI4LCA0OSwgNjUsIDc4LCA4OSwgOTksIDEwNywgMTE0LCAxMjAsIDEyNiwgMTMyLCAxMzYsIDE0MSwgMTQ1LCAxNDksCi0gICAgMTUzLCAxNTksIDE2NSwgMTcxLCAxNzYsIDE4MCwgMTg1LCAxODksIDE5MiwgMTk5LCAyMDUsIDIxMSwgMjE2LCAyMjAsIDIyNSwKLSAgICAyMjksIDIzMiwgMjM5LCAyNDUsIDI1MSwgMjEsIDMzLCA1OCwgNzksIDk3LCAxMTIsIDEyNSwgMTM3LCAxNDgsIDE1NywKLSAgICAxNjYsIDE3NCwgMTgyLCAxODksIDE5NSwgMjAxLCAyMDcsIDIxNywgMjI3LCAyMzUsIDI0MywgMjUxLCAxNywgMzUsIDYzLAotICAgIDg2LCAxMDYsIDEyMywgMTM5LCAxNTIsIDE2NSwgMTc3LCAxODcsIDE5NywgMjA2LCAyMTQsIDIyMiwgMjMwLCAyMzcsIDI1MCwKLSAgICAyNSwgMzEsIDU1LCA3NSwgOTEsIDEwNSwgMTE3LCAxMjgsIDEzOCwgMTQ2LCAxNTQsIDE2MSwgMTY4LCAxNzQsIDE4MCwKLSAgICAxODUsIDE5MCwgMjAwLCAyMDgsIDIxNSwgMjIyLCAyMjksIDIzNSwgMjQwLCAyNDUsIDI1NSwgMTYsIDM2LCA2NSwgODksCi0gICAgMTEwLCAxMjgsIDE0NCwgMTU5LCAxNzMsIDE4NSwgMTk2LCAyMDcsIDIxNywgMjI2LCAyMzQsIDI0MiwgMjUwLCAxMSwgNDEsCi0gICAgNzQsIDEwMywgMTI4LCAxNTEsIDE3MiwgMTkxLCAyMDksIDIyNSwgMjQxLCAyNTUsIDksIDQzLCA3OSwgMTEwLCAxMzgsCi0gICAgMTYzLCAxODYsIDIwNywgMjI3LCAyNDYsIDEyLCAzOSwgNzEsIDk5LCAxMjMsIDE0NCwgMTY0LCAxODIsIDE5OCwgMjE0LAotICAgIDIyOCwgMjQxLCAyNTMsIDksIDQ0LCA4MSwgMTEzLCAxNDIsIDE2OCwgMTkyLCAyMTQsIDIzNSwgMjU1LCA3LCA0OSwKLSAgICA5MCwgMTI3LCAxNjAsIDE5MSwgMjIwLCAyNDcsIDYsIDUxLCA5NSwgMTM0LCAxNzAsIDIwMywgMjM0LCA3LCA0NywKLSAgICA4NywgMTIzLCAxNTUsIDE4NCwgMjEyLCAyMzcsIDYsIDUyLCA5NywgMTM3LCAxNzQsIDIwOCwgMjQwLCA1LCA1NywKLSAgICAxMDYsIDE1MSwgMTkyLCAyMzEsIDUsIDU5LCAxMTEsIDE1OCwgMjAyLCAyNDMsIDUsIDU1LCAxMDMsIDE0NywgMTg3LAotICAgIDIyNCwgNSwgNjAsIDExMywgMTYxLCAyMDYsIDI0OCwgNCwgNjUsIDEyMiwgMTc1LCAyMjQsIDQsIDY3LCAxMjcsCi0gICAgMTgyLCAyMzQKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQxNl90IGNlbHRfY2FjaGVfaW5kZXhbMTA1XSA9IHsKLSAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDQxLCA0MSwgNDEsCi0gICAgODIsIDgyLCAxMjMsIDE2NCwgMjAwLCAyMjIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQxLAotICAgIDQxLCA0MSwgNDEsIDEyMywgMTIzLCAxMjMsIDE2NCwgMTY0LCAyNDAsIDI2NiwgMjgzLCAyOTUsIDQxLCA0MSwgNDEsCi0gICAgNDEsIDQxLCA0MSwgNDEsIDQxLCAxMjMsIDEyMywgMTIzLCAxMjMsIDI0MCwgMjQwLCAyNDAsIDI2NiwgMjY2LCAzMDUsCi0gICAgMzE4LCAzMjgsIDMzNiwgMTIzLCAxMjMsIDEyMywgMTIzLCAxMjMsIDEyMywgMTIzLCAxMjMsIDI0MCwgMjQwLCAyNDAsIDI0MCwKLSAgICAzMDUsIDMwNSwgMzA1LCAzMTgsIDMxOCwgMzQzLCAzNTEsIDM1OCwgMzY0LCAyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwgMjQwLAotICAgIDI0MCwgMjQwLCAzMDUsIDMwNSwgMzA1LCAzMDUsIDM0MywgMzQzLCAzNDMsIDM1MSwgMzUxLCAzNzAsIDM3NiwgMzgyLCAzODcsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBjZWx0X2xvZzJfZnJhY1tdID0gewotICAgIDAsIDgsIDEzLCAxNiwgMTksIDIxLCAyMywgMjQsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMiwgMzMsIDM0LCAzNCwgMzUsIDM2LCAzNiwgMzcsIDM3Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBjZWx0X2JpdF9pbnRlcmxlYXZlW10gPSB7Ci0gICAgMCwgMSwgMSwgMSwgMiwgMywgMywgMywgMiwgMywgMywgMywgMiwgMywgMywgMwotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2VsdF9iaXRfZGVpbnRlcmxlYXZlW10gPSB7Ci0gICAgMHgwMCwgMHgwMywgMHgwQywgMHgwRiwgMHgzMCwgMHgzMywgMHgzQywgMHgzRiwKLSAgICAweEMwLCAweEMzLCAweENDLCAweENGLCAweEYwLCAweEYzLCAweEZDLCAweEZGCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBjZWx0X2hhZGFtYXJkX29yZGVyeVtdID0gewotICAgIDEsICAgMCwKLSAgICAzLCAgIDAsICAyLCAgMSwKLSAgICA3LCAgIDAsICA0LCAgMywgIDYsICAxLCAgNSwgIDIsCi0gICAgMTUsICAwLCAgOCwgIDcsIDEyLCAgMywgMTEsICA0LCAxNCwgIDEsICA5LCAgNiwgMTMsICAyLCAxMCwgIDUKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBjZWx0X3FuX2V4cDJbXSA9IHsKLSAgICAxNjM4NCwgMTc4NjYsIDE5NDgzLCAyMTI0NywgMjMxNzAsIDI1MjY3LCAyNzU1NCwgMzAwNDgKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBjZWx0X3B2cV91WzEyNzJdID0gewotICAgIC8qIE4gPSAwLCBLID0gMC4uLjE3NiAqLwotICAgIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgLyogTiA9IDEsIEsgPSAxLi4uMTc2ICovCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAvKiBOID0gMiwgSyA9IDIuLi4xNzYgKi8KLSAgICAzLCA1LCA3LCA5LCAxMSwgMTMsIDE1LCAxNywgMTksIDIxLCAyMywgMjUsIDI3LCAyOSwgMzEsIDMzLCAzNSwgMzcsIDM5LCA0MSwKLSAgICA0MywgNDUsIDQ3LCA0OSwgNTEsIDUzLCA1NSwgNTcsIDU5LCA2MSwgNjMsIDY1LCA2NywgNjksIDcxLCA3MywgNzUsIDc3LCA3OSwKLSAgICA4MSwgODMsIDg1LCA4NywgODksIDkxLCA5MywgOTUsIDk3LCA5OSwgMTAxLCAxMDMsIDEwNSwgMTA3LCAxMDksIDExMSwgMTEzLAotICAgIDExNSwgMTE3LCAxMTksIDEyMSwgMTIzLCAxMjUsIDEyNywgMTI5LCAxMzEsIDEzMywgMTM1LCAxMzcsIDEzOSwgMTQxLCAxNDMsCi0gICAgMTQ1LCAxNDcsIDE0OSwgMTUxLCAxNTMsIDE1NSwgMTU3LCAxNTksIDE2MSwgMTYzLCAxNjUsIDE2NywgMTY5LCAxNzEsIDE3MywKLSAgICAxNzUsIDE3NywgMTc5LCAxODEsIDE4MywgMTg1LCAxODcsIDE4OSwgMTkxLCAxOTMsIDE5NSwgMTk3LCAxOTksIDIwMSwgMjAzLAotICAgIDIwNSwgMjA3LCAyMDksIDIxMSwgMjEzLCAyMTUsIDIxNywgMjE5LCAyMjEsIDIyMywgMjI1LCAyMjcsIDIyOSwgMjMxLCAyMzMsCi0gICAgMjM1LCAyMzcsIDIzOSwgMjQxLCAyNDMsIDI0NSwgMjQ3LCAyNDksIDI1MSwgMjUzLCAyNTUsIDI1NywgMjU5LCAyNjEsIDI2MywKLSAgICAyNjUsIDI2NywgMjY5LCAyNzEsIDI3MywgMjc1LCAyNzcsIDI3OSwgMjgxLCAyODMsIDI4NSwgMjg3LCAyODksIDI5MSwgMjkzLAotICAgIDI5NSwgMjk3LCAyOTksIDMwMSwgMzAzLCAzMDUsIDMwNywgMzA5LCAzMTEsIDMxMywgMzE1LCAzMTcsIDMxOSwgMzIxLCAzMjMsCi0gICAgMzI1LCAzMjcsIDMyOSwgMzMxLCAzMzMsIDMzNSwgMzM3LCAzMzksIDM0MSwgMzQzLCAzNDUsIDM0NywgMzQ5LCAzNTEsCi0gICAgLyogTiA9IDMsIEsgPSAzLi4uMTc2ICovCi0gICAgMTMsIDI1LCA0MSwgNjEsIDg1LCAxMTMsIDE0NSwgMTgxLCAyMjEsIDI2NSwgMzEzLCAzNjUsIDQyMSwgNDgxLCA1NDUsIDYxMywKLSAgICA2ODUsIDc2MSwgODQxLCA5MjUsIDEwMTMsIDExMDUsIDEyMDEsIDEzMDEsIDE0MDUsIDE1MTMsIDE2MjUsIDE3NDEsIDE4NjEsCi0gICAgMTk4NSwgMjExMywgMjI0NSwgMjM4MSwgMjUyMSwgMjY2NSwgMjgxMywgMjk2NSwgMzEyMSwgMzI4MSwgMzQ0NSwgMzYxMywgMzc4NSwKLSAgICAzOTYxLCA0MTQxLCA0MzI1LCA0NTEzLCA0NzA1LCA0OTAxLCA1MTAxLCA1MzA1LCA1NTEzLCA1NzI1LCA1OTQxLCA2MTYxLCA2Mzg1LAotICAgIDY2MTMsIDY4NDUsIDcwODEsIDczMjEsIDc1NjUsIDc4MTMsIDgwNjUsIDgzMjEsIDg1ODEsIDg4NDUsIDkxMTMsIDkzODUsIDk2NjEsCi0gICAgOTk0MSwgMTAyMjUsIDEwNTEzLCAxMDgwNSwgMTExMDEsIDExNDAxLCAxMTcwNSwgMTIwMTMsIDEyMzI1LCAxMjY0MSwgMTI5NjEsCi0gICAgMTMyODUsIDEzNjEzLCAxMzk0NSwgMTQyODEsIDE0NjIxLCAxNDk2NSwgMTUzMTMsIDE1NjY1LCAxNjAyMSwgMTYzODEsIDE2NzQ1LAotICAgIDE3MTEzLCAxNzQ4NSwgMTc4NjEsIDE4MjQxLCAxODYyNSwgMTkwMTMsIDE5NDA1LCAxOTgwMSwgMjAyMDEsIDIwNjA1LCAyMTAxMywKLSAgICAyMTQyNSwgMjE4NDEsIDIyMjYxLCAyMjY4NSwgMjMxMTMsIDIzNTQ1LCAyMzk4MSwgMjQ0MjEsIDI0ODY1LCAyNTMxMywgMjU3NjUsCi0gICAgMjYyMjEsIDI2NjgxLCAyNzE0NSwgMjc2MTMsIDI4MDg1LCAyODU2MSwgMjkwNDEsIDI5NTI1LCAzMDAxMywgMzA1MDUsIDMxMDAxLAotICAgIDMxNTAxLCAzMjAwNSwgMzI1MTMsIDMzMDI1LCAzMzU0MSwgMzQwNjEsIDM0NTg1LCAzNTExMywgMzU2NDUsIDM2MTgxLCAzNjcyMSwKLSAgICAzNzI2NSwgMzc4MTMsIDM4MzY1LCAzODkyMSwgMzk0ODEsIDQwMDQ1LCA0MDYxMywgNDExODUsIDQxNzYxLCA0MjM0MSwgNDI5MjUsCi0gICAgNDM1MTMsIDQ0MTA1LCA0NDcwMSwgNDUzMDEsIDQ1OTA1LCA0NjUxMywgNDcxMjUsIDQ3NzQxLCA0ODM2MSwgNDg5ODUsIDQ5NjEzLAotICAgIDUwMjQ1LCA1MDg4MSwgNTE1MjEsIDUyMTY1LCA1MjgxMywgNTM0NjUsIDU0MTIxLCA1NDc4MSwgNTU0NDUsIDU2MTEzLCA1Njc4NSwKLSAgICA1NzQ2MSwgNTgxNDEsIDU4ODI1LCA1OTUxMywgNjAyMDUsIDYwOTAxLCA2MTYwMSwKLSAgICAvKiBOID0gNCwgSyA9IDQuLi4xNzYgKi8KLSAgICA2MywgMTI5LCAyMzEsIDM3NywgNTc1LCA4MzMsIDExNTksIDE1NjEsIDIwNDcsIDI2MjUsIDMzMDMsIDQwODksIDQ5OTEsIDYwMTcsCi0gICAgNzE3NSwgODQ3MywgOTkxOSwgMTE1MjEsIDEzMjg3LCAxNTIyNSwgMTczNDMsIDE5NjQ5LCAyMjE1MSwgMjQ4NTcsIDI3Nzc1LAotICAgIDMwOTEzLCAzNDI3OSwgMzc4ODEsIDQxNzI3LCA0NTgyNSwgNTAxODMsIDU0ODA5LCA1OTcxMSwgNjQ4OTcsIDcwMzc1LCA3NjE1MywKLSAgICA4MjIzOSwgODg2NDEsIDk1MzY3LCAxMDI0MjUsIDEwOTgyMywgMTE3NTY5LCAxMjU2NzEsIDEzNDEzNywgMTQyOTc1LCAxNTIxOTMsCi0gICAgMTYxNzk5LCAxNzE4MDEsIDE4MjIwNywgMTkzMDI1LCAyMDQyNjMsIDIxNTkyOSwgMjI4MDMxLCAyNDA1NzcsIDI1MzU3NSwKLSAgICAyNjcwMzMsIDI4MDk1OSwgMjk1MzYxLCAzMTAyNDcsIDMyNTYyNSwgMzQxNTAzLCAzNTc4ODksIDM3NDc5MSwgMzkyMjE3LAotICAgIDQxMDE3NSwgNDI4NjczLCA0NDc3MTksIDQ2NzMyMSwgNDg3NDg3LCA1MDgyMjUsIDUyOTU0MywgNTUxNDQ5LCA1NzM5NTEsCi0gICAgNTk3MDU3LCA2MjA3NzUsIDY0NTExMywgNjcwMDc5LCA2OTU2ODEsIDcyMTkyNywgNzQ4ODI1LCA3NzYzODMsIDgwNDYwOSwKLSAgICA4MzM1MTEsIDg2MzA5NywgODkzMzc1LCA5MjQzNTMsIDk1NjAzOSwgOTg4NDQxLCAxMDIxNTY3LCAxMDU1NDI1LCAxMDkwMDIzLAotICAgIDExMjUzNjksIDExNjE0NzEsIDExOTgzMzcsIDEyMzU5NzUsIDEyNzQzOTMsIDEzMTM1OTksIDEzNTM2MDEsIDEzOTQ0MDcsCi0gICAgMTQzNjAyNSwgMTQ3ODQ2MywgMTUyMTcyOSwgMTU2NTgzMSwgMTYxMDc3NywgMTY1NjU3NSwgMTcwMzIzMywgMTc1MDc1OSwKLSAgICAxNzk5MTYxLCAxODQ4NDQ3LCAxODk4NjI1LCAxOTQ5NzAzLCAyMDAxNjg5LCAyMDU0NTkxLCAyMTA4NDE3LCAyMTYzMTc1LAotICAgIDIyMTg4NzMsIDIyNzU1MTksIDIzMzMxMjEsIDIzOTE2ODcsIDI0NTEyMjUsIDI1MTE3NDMsIDI1NzMyNDksIDI2MzU3NTEsCi0gICAgMjY5OTI1NywgMjc2Mzc3NSwgMjgyOTMxMywgMjg5NTg3OSwgMjk2MzQ4MSwgMzAzMjEyNywgMzEwMTgyNSwgMzE3MjU4MywKLSAgICAzMjQ0NDA5LCAzMzE3MzExLCAzMzkxMjk3LCAzNDY2Mzc1LCAzNTQyNTUzLCAzNjE5ODM5LCAzNjk4MjQxLCAzNzc3NzY3LAotICAgIDM4NTg0MjUsIDM5NDAyMjMsIDQwMjMxNjksIDQxMDcyNzEsIDQxOTI1MzcsIDQyNzg5NzUsIDQzNjY1OTMsIDQ0NTUzOTksCi0gICAgNDU0NTQwMSwgNDYzNjYwNywgNDcyOTAyNSwgNDgyMjY2MywgNDkxNzUyOSwgNTAxMzYzMSwgNTExMDk3NywgNTIwOTU3NSwKLSAgICA1MzA5NDMzLCA1NDEwNTU5LCA1NTEyOTYxLCA1NjE2NjQ3LCA1NzIxNjI1LCA1ODI3OTAzLCA1OTM1NDg5LCA2MDQ0MzkxLAotICAgIDYxNTQ2MTcsIDYyNjYxNzUsIDYzNzkwNzMsIDY0OTMzMTksIDY2MDg5MjEsIDY3MjU4ODcsIDY4NDQyMjUsIDY5NjM5NDMsCi0gICAgNzA4NTA0OSwgNzIwNzU1MSwKLSAgICAvKiBOID0gNSwgSyA9IDUuLi4xNzYgKi8KLSAgICAzMjEsIDY4MSwgMTI4OSwgMjI0MSwgMzY0OSwgNTY0MSwgODM2MSwgMTE5NjksIDE2NjQxLCAyMjU2OSwgMjk5NjEsIDM5MDQxLAotICAgIDUwMDQ5LCA2MzI0MSwgNzg4ODksIDk3MjgxLCAxMTg3MjEsIDE0MzUyOSwgMTcyMDQxLCAyMDQ2MDksIDI0MTYwMSwgMjgzNDAxLAotICAgIDMzMDQwOSwgMzgzMDQxLCA0NDE3MjksIDUwNjkyMSwgNTc5MDgxLCA2NTg2ODksIDc0NjI0MSwgODQyMjQ5LCA5NDcyNDEsCi0gICAgMTA2MTc2MSwgMTE4NjM2OSwgMTMyMTY0MSwgMTQ2ODE2OSwgMTYyNjU2MSwgMTc5NzQ0MSwgMTk4MTQ0OSwgMjE3OTI0MSwKLSAgICAyMzkxNDg5LCAyNjE4ODgxLCAyODYyMTIxLCAzMTIxOTI5LCAzMzk5MDQxLCAzNjk0MjA5LCA0MDA4MjAxLCA0MzQxODAxLAotICAgIDQ2OTU4MDksIDUwNzEwNDEsIDU0NjgzMjksIDU4ODg1MjEsIDYzMzI0ODEsIDY4MDEwODksIDcyOTUyNDEsIDc4MTU4NDksCi0gICAgODM2Mzg0MSwgODk0MDE2MSwgOTU0NTc2OSwgMTAxODE2NDEsIDEwODQ4NzY5LCAxMTU0ODE2MSwgMTIyODA4NDEsIDEzMDQ3ODQ5LAotICAgIDEzODUwMjQxLCAxNDY4OTA4OSwgMTU1NjU0ODEsIDE2NDgwNTIxLCAxNzQzNTMyOSwgMTg0MzEwNDEsIDE5NDY4ODA5LAotICAgIDIwNTQ5ODAxLCAyMTY3NTIwMSwgMjI4NDYyMDksIDI0MDY0MDQxLCAyNTMyOTkyOSwgMjY2NDUxMjEsIDI4MDEwODgxLAotICAgIDI5NDI4NDg5LCAzMDg5OTI0MSwgMzI0MjQ0NDksIDM0MDA1NDQxLCAzNTY0MzU2MSwgMzczNDAxNjksIDM5MDk2NjQxLAotICAgIDQwOTE0MzY5LCA0Mjc5NDc2MSwgNDQ3MzkyNDEsIDQ2NzQ5MjQ5LCA0ODgyNjI0MSwgNTA5NzE2ODksIDUzMTg3MDgxLAotICAgIDU1NDczOTIxLCA1NzgzMzcyOSwgNjAyNjgwNDEsIDYyNzc4NDA5LCA2NTM2NjQwMSwgNjgwMzM2MDEsIDcwNzgxNjA5LAotICAgIDczNjEyMDQxLCA3NjUyNjUyOSwgNzk1MjY3MjEsIDgyNjE0MjgxLCA4NTc5MDg4OSwgODkwNTgyNDEsIDkyNDE4MDQ5LAotICAgIDk1ODcyMDQxLCA5OTQyMTk2MSwgMTAzMDY5NTY5LCAxMDY4MTY2NDEsIDExMDY2NDk2OSwgMTE0NjE2MzYxLCAxMTg2NzI2NDEsCi0gICAgMTIyODM1NjQ5LCAxMjcxMDcyNDEsIDEzMTQ4OTI4OSwgMTM1OTgzNjgxLCAxNDA1OTIzMjEsIDE0NTMxNzEyOSwgMTUwMTYwMDQxLAotICAgIDE1NTEyMzAwOSwgMTYwMjA4MDAxLCAxNjU0MTcwMDEsIDE3MDc1MjAwOSwgMTc2MjE1MDQxLCAxODE4MDgxMjksIDE4NzUzMzMyMSwKLSAgICAxOTMzOTI2ODEsIDE5OTM4ODI4OSwgMjA1NTIyMjQxLCAyMTE3OTY2NDksIDIxODIxMzY0MSwgMjI0Nzc1MzYxLCAyMzE0ODM5NjksCi0gICAgMjM4MzQxNjQxLCAyNDUzNTA1NjksIDI1MjUxMjk2MSwgMjU5ODMxMDQxLCAyNjczMDcwNDksIDI3NDk0MzI0MSwgMjgyNzQxODg5LAotICAgIDI5MDcwNTI4MSwgMjk4ODM1NzIxLCAzMDcxMzU1MjksIDMxNTYwNzA0MSwgMzI0MjUyNjA5LCAzMzMwNzQ2MDEsIDM0MjA3NTQwMSwKLSAgICAzNTEyNTc0MDksIDM2MDYyMzA0MSwgMzcwMTc0NzI5LCAzNzk5MTQ5MjEsIDM4OTg0NjA4MSwgMzk5OTcwNjg5LCA0MTAyOTEyNDEsCi0gICAgNDIwODEwMjQ5LCA0MzE1MzAyNDEsIDQ0MjQ1Mzc2MSwgNDUzNTgzMzY5LCA0NjQ5MjE2NDEsIDQ3NjQ3MTE2OSwgNDg4MjM0NTYxLAotICAgIDUwMDIxNDQ0MSwgNTEyNDEzNDQ5LCA1MjQ4MzQyNDEsIDUzNzQ3OTQ4OSwgNTUwMzUxODgxLCA1NjM0NTQxMjEsIDU3Njc4ODkyOSwKLSAgICA1OTAzNTkwNDEsIDYwNDE2NzIwOSwgNjE4MjE2MjAxLCA2MzI1MDg4MDEsCi0gICAgLyogTiA9IDYsIEsgPSA2Li4uOTYgKHRlY2huaWNhbGx5IFYoMTA5LDUpIGZpdHMgaW4gMzIgYml0cywgYnV0IHRoYXQgY2FuJ3QgYmUKLSAgICAgYWNoaWV2ZWQgYnkgc3BsaXR0aW5nIGFuIE9wdXMgYmFuZCkgKi8KLSAgICAxNjgzLCAzNjUzLCA3MTgzLCAxMzA3MywgMjIzNjMsIDM2MzY1LCA1NjY5NSwgODUzMDUsIDEyNDUxNSwgMTc3MDQ1LCAyNDYwNDcsCi0gICAgMzM1MTM3LCA0NDg0MjcsIDU5MDU1NywgNzY2NzI3LCA5ODI3MjksIDEyNDQ5NzksIDE1NjA1NDksIDE5MzcxOTksIDIzODM0MDksCi0gICAgMjkwODQxMSwgMzUyMjIyMSwgNDIzNTY3MSwgNTA2MDQ0MSwgNjAwOTA5MSwgNzA5NTA5MywgODMzMjg2MywgOTczNzc5MywKLSAgICAxMTMyNjI4MywgMTMxMTU3NzMsIDE1MTI0Nzc1LCAxNzM3MjkwNSwgMTk4ODA5MTUsIDIyNjcwNzI1LCAyNTc2NTQ1NSwKLSAgICAyOTE4OTQ1NywgMzI5NjgzNDcsIDM3MTI5MDM3LCA0MTY5OTc2NywgNDY3MTAxMzcsIDUyMTkxMTM5LCA1ODE3NTE4OSwKLSAgICA2NDY5NjE1OSwgNzE3ODk0MDksIDc5NDkxODE5LCA4Nzg0MTgyMSwgOTY4Nzk0MzEsIDEwNjY0NjI4MSwgMTE3MTg1NjUxLAotICAgIDEyODU0MjUwMSwgMTQwNzYzNTAzLCAxNTM4OTcwNzMsIDE2Nzk5MzQwMywgMTgzMTA0NDkzLCAxOTkyODQxODMsIDIxNjU4ODE4NSwKLSAgICAyMzUwNzQxMTUsIDI1NDgwMTUyNSwgMjc1ODMxOTM1LCAyOTgyMjg4NjUsIDMyMjA1Nzg2NywgMzQ3Mzg2NTU3LCAzNzQyODQ2NDcsCi0gICAgNDAyODIzOTc3LCA0MzMwNzg1NDcsIDQ2NTEyNDU0OSwgNDk5MDQwMzk5LCA1MzQ5MDY3NjksIDU3MjgwNjYxOSwgNjEyODI1MjI5LAotICAgIDY1NTA1MDIzMSwgNjk5NTcxNjQxLCA3NDY0ODE4OTEsIDc5NTg3NTg2MSwgODQ3ODUwOTExLCA5MDI1MDY5MTMsIDk1OTk0NjI4MywKLSAgICAxMDIwMjc0MDEzLCAxMDgzNTk3NzAzLCAxMTUwMDI3NTkzLCAxMjE5Njc2NTk1LCAxMjkyNjYwMzI1LCAxMzY5MDk3MTM1LAotICAgIDE0NDkxMDgxNDUsIDE1MzI4MTcyNzUsIDE2MjAzNTEyNzcsIDE3MTE4Mzk3NjcsIDE4MDc0MTUyNTcsIDE5MDcyMTMxODcsCi0gICAgMjAxMTM3MTk1NywgMjEyMDAzMjk1OSwKLSAgICAvKiBOID0gNywgSyA9IDcuLi41NCAodGVjaG5pY2FsbHkgVig2MCw2KSBmaXRzIGluIDMyIGJpdHMsIGJ1dCB0aGF0IGNhbid0IGJlCi0gICAgIGFjaGlldmVkIGJ5IHNwbGl0dGluZyBhbiBPcHVzIGJhbmQpICovCi0gICAgODk4OSwgMTk4MjUsIDQwMDgxLCA3NTUxNywgMTM0MjQ1LCAyMjczMDUsIDM2OTMwNSwgNTc5MTI1LCA4ODA2ODUsIDEzMDM3NzcsCi0gICAgMTg4NDk2MSwgMjY2ODUyNSwgMzcwNzUwOSwgNTA2NDc5MywgNjgxNDI0OSwgOTA0MTk1NywgMTE4NDc0ODUsIDE1MzQ1MjMzLAotICAgIDE5NjY1ODQxLCAyNDk1NzY2MSwgMzEzODgyOTMsIDM5MTQ2MTg1LCA0ODQ0MjI5NywgNTk1MTE4MjksIDcyNjE2MDEzLAotICAgIDg4MDQzOTY5LCAxMDYxMTQ2MjUsIDEyNzE3ODcwMSwgMTUxNjIwNzU3LCAxNzk4NjEzMDUsIDIxMjM1ODk4NSwgMjQ5NjEyODA1LAotICAgIDI5MjE2NDQ0NSwgMzQwNjAwNjI1LCAzOTU1NTU1MzcsIDQ1NzcxMzM0MSwgNTI3ODEwNzI1LCA2MDY2Mzk1MjksIDY5NTA0OTQzMywKLSAgICA3OTM5NTA3MDksIDkwNDMxNzAzNywgMTAyNzE4ODM4NSwgMTE2MzY3Mzk1MywgMTMxNDk1NTE4MSwgMTQ4MjI4ODgyMSwKLSAgICAxNjY3MDEwMDczLCAxODcwNTM1Nzg1LCAyMDk0MzY3NzE3LAotICAgIC8qIE4gPSA4LCBLID0gOC4uLjM3ICh0ZWNobmljYWxseSBWKDQwLDcpIGZpdHMgaW4gMzIgYml0cywgYnV0IHRoYXQgY2FuJ3QgYmUKLSAgICAgYWNoaWV2ZWQgYnkgc3BsaXR0aW5nIGFuIE9wdXMgYmFuZCkgKi8KLSAgICA0ODYzOSwgMTA4NTQ1LCAyMjQxNDMsIDQzMzkwNSwgNzk1NDU1LCAxMzkyMDY1LCAyMzQwNDk1LCAzODAwMzA1LCA1OTg0NzY3LAotICAgIDkxNzM1MDUsIDEzNzI2OTkxLCAyMDEwMzAyNSwgMjg4NzUzMjcsIDQwNzU0MzY5LCA1NjYxMDU3NSwgNzc1MDAwMTcsCi0gICAgMTA0NjkyNzM1LCAxMzk3MDM4MDksIDE4NDMyNzMxMSwgMjQwNjczMjY1LCAzMTEyMDc3NDMsIDM5ODc5NjIyNSwgNTA2NzUwMzUxLAotICAgIDYzODg3ODE5MywgNzk5NTM4MTc1LCA5OTM2OTY3NjksIDEyMjY5OTAwOTUsIDE1MDU3ODk1NTMsIDE4MzcyNzE2MTUsCi0gICAgMjIyOTQ5MTkwNSwKLSAgICAvKiBOID0gOSwgSyA9IDkuLi4yOCAodGVjaG5pY2FsbHkgVigyOSw4KSBmaXRzIGluIDMyIGJpdHMsIGJ1dCB0aGF0IGNhbid0IGJlCi0gICAgIGFjaGlldmVkIGJ5IHNwbGl0dGluZyBhbiBPcHVzIGJhbmQpICovCi0gICAgMjY1NzI5LCA1OTg0MTcsIDEyNTY0NjUsIDI0ODU4MjUsIDQ2NzMzNDUsIDg0MDU5MDUsIDE0NTQ2NzA1LCAyNDMzMTc3NywKLSAgICAzOTQ5MDA0OSwgNjIzOTA1NDUsIDk2MjIwNTYxLCAxNDUxOTg5MTMsIDIxNDgyODYwOSwgMzEyMTkzNTUzLCA0NDYzMDQxNDUsCi0gICAgNjI4NDk2ODk3LCA4NzI4OTM0NDEsIDExOTY5MjQ1NjEsIDE2MjE5MjUxMzcsIDIxNzM4MDYxNDUsCi0gICAgLyogTiA9IDEwLCBLID0gMTAuLi4yNCAqLwotICAgIDE0NjI1NjMsIDMzMTc0NDUsIDcwNTk3MzUsIDE0MjE4OTA1LCAyNzI5ODE1NSwgNTAyNTA3NjUsIDg5MTI5MjQ3LCAxNTI5NTEwNzMsCi0gICAgMjU0ODMxNjY3LCA0MTM0NDI3NzMsIDY1NDg2MjI0NywgMTAxNDg4OTc2OSwgMTU0MTkxMTkzMSwgMjMwMDQwOTYyOSwKLSAgICAzMzc1MjEwNjcxLAotICAgIC8qIE4gPSAxMSwgSyA9IDExLi4uMTkgKHRlY2huaWNhbGx5IFYoMjAsMTApIGZpdHMgaW4gMzIgYml0cywgYnV0IHRoYXQgY2FuJ3QgYmUKLSAgICAgYWNoaWV2ZWQgYnkgc3BsaXR0aW5nIGFuIE9wdXMgYmFuZCkgKi8KLSAgICA4MDk3NDUzLCAxODQ3NDYzMywgMzk3NTMyNzMsIDgxMjcwMzMzLCAxNTg4MTkyNTMsIDI5ODE5OTI2NSwgNTQwMjc5NTg1LAotICAgIDk0ODA2MjMyNSwgMTYxNjMzNjc2NSwKLSAgICAvKiBOID0gMTIsIEsgPSAxMi4uLjE4ICovCi0gICAgNDUwNDY3MTksIDEwMzI3NDYyNSwgMjI0Mjk4MjMxLCA0NjQzODc4MTcsIDkyMTQwNjMzNSwgMTc1OTg4NTE4NSwKLSAgICAzMjQ4MjI3MDk1LAotICAgIC8qIE4gPSAxMywgSyA9IDEzLi4uMTYgKi8KLSAgICAyNTE1OTU5NjksIDU3OTE2ODgyNSwgMTI2Nzg1NDg3MywgMjY1MzY0OTAyNSwKLSAgICAvKiBOID0gMTQsIEsgPSAxNCAqLwotICAgIDE0MDk5MzM2MTkKLX07Ci0KLURFQ0xBUkVfQUxJR05FRCgzMiwgc3RhdGljIGNvbnN0IGZsb2F0LCBjZWx0X3dpbmRvdylbMTIwXSA9IHsKLSAgICA2LjcyODY5NjZlLTA1ZiwgMC4wMDA2MDU1MTM0OGYsIDAuMDAxNjgxNTk3MGYsIDAuMDAzMjk0Nzk2MmYsIDAuMDA1NDQzOTk0M2YsCi0gICAgMC4wMDgxMjc2OTIzZiwgMC4wMTEzNDQwMDFmLCAwLjAxNTA5MDYzM2YsIDAuMDE5MzY0ODg2ZiwgMC4wMjQxNjM2MzVmLAotICAgIDAuMDI5NDgzMzE1ZiwgMC4wMzUzMTk5MDVmLCAwLjA0MTY2ODkxMWYsIDAuMDQ4NTI1MzQ3ZiwgMC4wNTU4ODM3MThmLAotICAgIDAuMDYzNzM3OTk5ZiwgMC4wNzIwODE2MTZmLCAwLjA4MDkwNzQyOGYsIDAuMDkwMjA3NzA1ZiwgMC4wOTk5NzQxMTFmLAotICAgIDAuMTEwMTk3NjlmLCAwLjEyMDg2ODgzZiwgMC4xMzE5NzcyOWYsIDAuMTQzNTEyMTRmLCAwLjE1NTQ2MTc3ZiwKLSAgICAwLjE2NzgxMzg5ZiwgMC4xODA1NTU1MGYsIDAuMTkzNjcyOTBmLCAwLjIwNzE1MTcxZiwgMC4yMjA5NzY4MmYsCi0gICAgMC4yMzUxMzI0M2YsIDAuMjQ5NjAyMDhmLCAwLjI2NDM2ODYwZiwgMC4yNzk0MTQxOWYsIDAuMjk0NzIwNDBmLAotICAgIDAuMzEwMjY4MThmLCAwLjMyNjAzNzg4ZiwgMC4zNDIwMDkzMWYsIDAuMzU4MTYxNzdmLCAwLjM3NDQ3NDA3ZiwKLSAgICAwLjM5MDkyNDYyZiwgMC40MDc0OTE0MmYsIDAuNDI0MTUyMTVmLCAwLjQ0MDg4NDIzZiwgMC40NTc2NjQ4NGYsCi0gICAgMC40NzQ0NzEwNGYsIDAuNDkxMjc5NzhmLCAwLjUwODA2Nzk4ZiwgMC41MjQ4MTI2MWYsIDAuNTQxNDkwNzdmLAotICAgIDAuNTU4MDc5NzNmLCAwLjU3NDU1NzAxZiwgMC41OTA5MDA0OWYsIDAuNjA3MDg4NDFmLCAwLjYyMzA5OTUxZiwKLSAgICAwLjYzODkxMzA2ZiwgMC42NTQ1MDg5NmYsIDAuNjY5ODY3NzZmLCAwLjY4NDk3MDc3ZiwgMC42OTk4MDAxMGYsCi0gICAgMC43MTQzMzg3M2YsIDAuNzI4NTcwNTVmLCAwLjc0MjQ4MDQzZiwgMC43NTYwNTQyNGYsIDAuNzY5Mjc4OTVmLAotICAgIDAuNzgyMTQyNTdmLCAwLjc5NDYzNDMwZiwgMC44MDY3NDQ0NWYsIDAuODE4NDY0NTZmLCAwLjgyOTc4NzMzZiwKLSAgICAwLjg0MDcwNjY5ZiwgMC44NTEyMTc3OWYsIDAuODYxMzE2OThmLCAwLjg3MTAwMTgzZiwgMC44ODAyNzExMWYsCi0gICAgMC44ODkxMjQ3OWYsIDAuODk3NTYzOThmLCAwLjkwNTU5MDk0ZiwgMC45MTMyMDkwNGYsIDAuOTIwNDIyNzBmLAotICAgIDAuOTI3MjM3MzhmLCAwLjkzMzY1OTU1ZiwgMC45Mzk2OTY1NmYsIDAuOTQ1MzU2NzFmLCAwLjk1MDY0OTA3ZiwKLSAgICAwLjk1NTU4MzUzZiwgMC45NjAxNzA2N2YsIDAuOTY0NDIxNzFmLCAwLjk2ODM0ODQ5ZiwgMC45NzE5NjMzNGYsCi0gICAgMC45NzUyNzkwNmYsIDAuOTc4MzA4ODNmLCAwLjk4MTA2NjE2ZiwgMC45ODM1NjQ4MGYsIDAuOTg1ODE4NjlmLAotICAgIDAuOTg3ODQxOTFmLCAwLjk4OTY0ODU2ZiwgMC45OTEyNTI3NGYsIDAuOTkyNjY4NDlmLCAwLjk5MzkwOTY5ZiwKLSAgICAwLjk5NDk5MDA0ZiwgMC45OTU5MjI5N2YsIDAuOTk2NzIxNjJmLCAwLjk5NzM5ODc0ZiwgMC45OTc5NjY2N2YsCi0gICAgMC45OTg0MzcyOGYsIDAuOTk4ODIxOTVmLCAwLjk5OTEzMTQ3ZiwgMC45OTkzNzYwNmYsIDAuOTk5NTY1MjdmLAotICAgIDAuOTk5NzA4MDJmLCAwLjk5OTgxMjQ4ZiwgMC45OTk4ODYxM2YsIDAuOTk5OTM1NjVmLCAwLjk5OTk2Njk3ZiwKLSAgICAwLjk5OTk4NTE4ZiwgMC45OTk5OTQ1N2YsIDAuOTk5OTk4NTlmLCAwLjk5OTk5OTgyZiwgMS4wMDAwMDAwZiwKLX07Ci0KLS8qIHNxdWFyZSBvZiB0aGUgd2luZG93LCB1c2VkIGZvciB0aGUgcG9zdGZpbHRlciAqLwotY29uc3QgZmxvYXQgZmZfY2VsdF93aW5kb3cyWzEyMF0gPSB7Ci0gICAgNC41Mjc1MzU3ZS0wOWYsIDMuNjY2NDdlLTA3ZiwgMi44Mjc3N2UtMDZmLCAxLjA4NTU3ZS0wNWYsIDIuOTYzNzFlLTA1ZiwgNi42MDU5NGUtMDVmLAotICAgIDAuMDAwMTI4Njg2ZiwgMC4wMDAyMjc3MjdmLCAwLjAwMDM3NDk5OWYsIDAuMDAwNTgzODgxZiwgMC4wMDA4NjkyNjZmLCAwLjAwMTI0NzVmLAotICAgIDAuMDAxNzM2M2YsIDAuMDAyMzU0NzFmLCAwLjAwMzEyMjk5ZiwgMC4wMDQwNjI1M2YsIDAuMDA1MTk1NzZmLCAwLjAwNjU0NjAxZiwKLSAgICAwLjAwODEzNzQzZiwgMC4wMDk5OTQ4MmYsIDAuMDEyMTQzNWYsIDAuMDE0NjA5M2YsIDAuMDE3NDE4ZiwgMC4wMjA1OTU3ZiwgMC4wMjQxNjg0ZiwKLSAgICAwLjAyODE2MTVmLCAwLjAzMjYwMDNmLCAwLjAzNzUwOTJmLCAwLjA0MjkxMThmLCAwLjA0ODgzMDhmLCAwLjA1NTI4NzNmLCAwLjA2MjMwMTJmLAotICAgIDAuMDY5ODkwOGYsIDAuMDc4MDcyM2YsIDAuMDg2ODYwMWYsIDAuMDk2MjY2NGYsIDAuMTA2MzAxZiwgMC4xMTY5N2YsIDAuMTI4MjhmLAotICAgIDAuMTQwMjMxZiwgMC4xNTI4MjJmLCAwLjE2NjA0OWYsIDAuMTc5OTA1ZiwgMC4xOTQzNzlmLCAwLjIwOTQ1N2YsIDAuMjI1MTIzZiwgMC4yNDEzNTZmLAotICAgIDAuMjU4MTMzZiwgMC4yNzU0MjhmLCAwLjI5MzIxMmYsIDAuMzExNDUzZiwgMC4zMzAxMTZmLCAwLjM0OTE2M2YsIDAuMzY4NTU2ZiwgMC4zODgyNTNmLAotICAgIDAuNDA4MjFmLCAwLjQyODM4MmYsIDAuNDQ4NzIzZiwgMC40NjkxODVmLCAwLjQ4OTcyZiwgMC41MTAyOGYsIDAuNTMwODE1ZiwgMC41NTEyNzdmLAotICAgIDAuNTcxNjE4ZiwgMC41OTE3OWYsIDAuNjExNzQ3ZiwgMC42MzE0NDRmLCAwLjY1MDgzN2YsIDAuNjY5ODg0ZiwgMC42ODg1NDdmLCAwLjcwNjc4OGYsCi0gICAgMC43MjQ1NzJmLCAwLjc0MTg2N2YsIDAuNzU4NjQ0ZiwgMC43NzQ4NzdmLCAwLjc5MDU0M2YsIDAuODA1NjIxZiwgMC44MjAwOTVmLCAwLjgzMzk1MWYsCi0gICAgMC44NDcxNzhmLCAwLjg1OTc2OWYsIDAuODcxNzJmLCAwLjg4MzAzZiwgMC44OTM2OTlmLCAwLjkwMzczNGYsIDAuOTEzMTRmLCAwLjkyMTkyOGYsCi0gICAgMC45MzAxMDlmLCAwLjkzNzY5OWYsIDAuOTQ0NzEzZiwgMC45NTExNjlmLCAwLjk1NzA4OGYsIDAuOTYyNDkxZiwgMC45Njc0ZiwgMC45NzE4MzhmLAotICAgIDAuOTc1ODMyZiwgMC45Nzk0MDRmLCAwLjk4MjU4MmYsIDAuOTg1MzkxZiwgMC45ODc4NTdmLCAwLjk5MDAwNWYsIDAuOTkxODYzZiwgMC45OTM0NTRmLAotICAgIDAuOTk0ODA0ZiwgMC45OTU5MzdmLCAwLjk5Njg3N2YsIDAuOTk3NjQ1ZiwgMC45OTgyNjRmLCAwLjk5ODc1M2YsIDAuOTk5MTMxZiwgMC45OTk0MTZmLAotICAgIDAuOTk5NjI1ZiwgMC45OTk3NzJmLCAwLjk5OTg3MWYsIDAuOTk5OTM0ZiwgMC45OTk5N2YsIDAuOTk5OTg5ZiwgMC45OTk5OTdmLCAwLjk5OTk5OTY0ZiwgMS4wZiwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MzJfdCAqIGNvbnN0IGNlbHRfcHZxX3Vfcm93WzE1XSA9IHsKLSAgICBjZWx0X3B2cV91ICsgICAgMCwgY2VsdF9wdnFfdSArICAxNzYsIGNlbHRfcHZxX3UgKyAgMzUxLAotICAgIGNlbHRfcHZxX3UgKyAgNTI1LCBjZWx0X3B2cV91ICsgIDY5OCwgY2VsdF9wdnFfdSArICA4NzAsCi0gICAgY2VsdF9wdnFfdSArIDEwNDEsIGNlbHRfcHZxX3UgKyAxMTMxLCBjZWx0X3B2cV91ICsgMTE3OCwKLSAgICBjZWx0X3B2cV91ICsgMTIwNywgY2VsdF9wdnFfdSArIDEyMjYsIGNlbHRfcHZxX3UgKyAxMjQwLAotICAgIGNlbHRfcHZxX3UgKyAxMjQ4LCBjZWx0X3B2cV91ICsgMTI1NCwgY2VsdF9wdnFfdSArIDEyNTcKLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjZWx0X2NvcyhpbnQxNl90IHgpCi17Ci0gICAgeCA9IChNVUwxNih4LCB4KSArIDQwOTYpID4+IDEzOwotICAgIHggPSAoMzI3NjcteCkgKyBST1VORF9NVUwxNih4LCAoLTc2NTEgKyBST1VORF9NVUwxNih4LCAoODI3NyArIFJPVU5EX01VTDE2KC02MjYsIHgpKSkpKTsKLSAgICByZXR1cm4gMSt4OwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjZWx0X2xvZzJ0YW4oaW50IGlzaW4sIGludCBpY29zKQotewotICAgIGludCBsYywgbHM7Ci0gICAgbGMgPSBvcHVzX2lsb2coaWNvcyk7Ci0gICAgbHMgPSBvcHVzX2lsb2coaXNpbik7Ci0gICAgaWNvcyA8PD0gMTUgLSBsYzsKLSAgICBpc2luIDw8PSAxNSAtIGxzOwotICAgIHJldHVybiAobHMgPDwgMTEpIC0gKGxjIDw8IDExKSArCi0gICAgICAgICAgIFJPVU5EX01VTDE2KGlzaW4sIFJPVU5EX01VTDE2KGlzaW4sIC0yNTk3KSArIDc5MzIpIC0KLSAgICAgICAgICAgUk9VTkRfTVVMMTYoaWNvcywgUk9VTkRfTVVMMTYoaWNvcywgLTI1OTcpICsgNzkzMik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdWludDMyX3QgY2VsdF9ybmcoQ2VsdENvbnRleHQgKnMpCi17Ci0gICAgcy0+c2VlZCA9IDE2NjQ1MjUgKiBzLT5zZWVkICsgMTAxMzkwNDIyMzsKLSAgICByZXR1cm4gcy0+c2VlZDsKLX0KLQotc3RhdGljIHZvaWQgY2VsdF9kZWNvZGVfY29hcnNlX2VuZXJneShDZWx0Q29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjKQorLyogVXNlIHRoZSAyRCB6LXRyYW5zZm9ybSB0byBhcHBseSBwcmVkaWN0aW9uIGluIGJvdGggdGhlIHRpbWUgZG9tYWluIChhbHBoYSkKKyAqIGFuZCB0aGUgZnJlcXVlbmN5IGRvbWFpbiAoYmV0YSkgKi8KK3N0YXRpYyB2b2lkIGNlbHRfZGVjb2RlX2NvYXJzZV9lbmVyZ3koQ2VsdEZyYW1lICpmLCBPcHVzUmFuZ2VDb2RlciAqcmMpCiB7CiAgICAgaW50IGksIGo7Ci0gICAgZmxvYXQgcHJldlsyXSA9IHswfTsKLSAgICBmbG9hdCBhbHBoYSwgYmV0YTsKLSAgICBjb25zdCB1aW50OF90ICptb2RlbDsKKyAgICBmbG9hdCBwcmV2WzJdID0geyAwIH07CisgICAgZmxvYXQgYWxwaGEgPSBmZl9jZWx0X2FscGhhX2NvZWZbZi0+c2l6ZV07CisgICAgZmxvYXQgYmV0YSAgPSBmZl9jZWx0X2JldGFfY29lZltmLT5zaXplXTsKKyAgICBjb25zdCB1aW50OF90ICptb2RlbCA9IGZmX2NlbHRfY29hcnNlX2VuZXJneV9kaXN0W2YtPnNpemVdWzBdOwogCi0gICAgLyogdXNlIHRoZSAyRCB6LXRyYW5zZm9ybSB0byBhcHBseSBwcmVkaWN0aW9uIGluIGJvdGggKi8KLSAgICAvKiB0aGUgdGltZSBkb21haW4gKGFscGhhKSBhbmQgdGhlIGZyZXF1ZW5jeSBkb21haW4gKGJldGEpICovCi0KLSAgICBpZiAob3B1c19yY190ZWxsKHJjKSszIDw9IHMtPmZyYW1lYml0cyAmJiBvcHVzX3JjX3AybW9kZWwocmMsIDMpKSB7Ci0gICAgICAgIC8qIGludHJhIGZyYW1lICovCi0gICAgICAgIGFscGhhID0gMDsKLSAgICAgICAgYmV0YSAgPSAxLjBmIC0gNDkxNS4wZi8zMjc2OC4wZjsKLSAgICAgICAgbW9kZWwgPSBjZWx0X2NvYXJzZV9lbmVyZ3lfZGlzdFtzLT5kdXJhdGlvbl1bMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYWxwaGEgPSBjZWx0X2FscGhhX2NvZWZbcy0+ZHVyYXRpb25dOwotICAgICAgICBiZXRhICA9IDEuMGYgLSBjZWx0X2JldGFfY29lZltzLT5kdXJhdGlvbl07Ci0gICAgICAgIG1vZGVsID0gY2VsdF9jb2Fyc2VfZW5lcmd5X2Rpc3Rbcy0+ZHVyYXRpb25dWzBdOworICAgIC8qIGludHJhIGZyYW1lICovCisgICAgaWYgKG9wdXNfcmNfdGVsbChyYykgKyAzIDw9IGYtPmZyYW1lYml0cyAmJiBmZl9vcHVzX3JjX2RlY19sb2cocmMsIDMpKSB7CisgICAgICAgIGFscGhhID0gMC4wZjsKKyAgICAgICAgYmV0YSAgPSAxLjBmIC0gKDQ5MTUuMGYvMzI3NjguMGYpOworICAgICAgICBtb2RlbCA9IGZmX2NlbHRfY29hcnNlX2VuZXJneV9kaXN0W2YtPnNpemVdWzFdOwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBDRUxUX01BWF9CQU5EUzsgaSsrKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5jb2RlZF9jaGFubmVsczsgaisrKSB7Ci0gICAgICAgICAgICBDZWx0RnJhbWUgKmZyYW1lID0gJnMtPmZyYW1lW2pdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZi0+Y2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgQ2VsdEJsb2NrICpibG9jayA9ICZmLT5ibG9ja1tqXTsKICAgICAgICAgICAgIGZsb2F0IHZhbHVlOwogICAgICAgICAgICAgaW50IGF2YWlsYWJsZTsKIAotICAgICAgICAgICAgaWYgKGkgPCBzLT5zdGFydGJhbmQgfHwgaSA+PSBzLT5lbmRiYW5kKSB7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPmVuZXJneVtpXSA9IDAuMDsKKyAgICAgICAgICAgIGlmIChpIDwgZi0+c3RhcnRfYmFuZCB8fCBpID49IGYtPmVuZF9iYW5kKSB7CisgICAgICAgICAgICAgICAgYmxvY2stPmVuZXJneVtpXSA9IDAuMDsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYXZhaWxhYmxlID0gcy0+ZnJhbWViaXRzIC0gb3B1c19yY190ZWxsKHJjKTsKKyAgICAgICAgICAgIGF2YWlsYWJsZSA9IGYtPmZyYW1lYml0cyAtIG9wdXNfcmNfdGVsbChyYyk7CiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlID49IDE1KSB7CiAgICAgICAgICAgICAgICAgLyogZGVjb2RlIHVzaW5nIGEgTGFwbGFjZSBkaXN0cmlidXRpb24gKi8KICAgICAgICAgICAgICAgICBpbnQgayA9IEZGTUlOKGksIDIwKSA8PCAxOwotICAgICAgICAgICAgICAgIHZhbHVlID0gb3B1c19yY19sYXBsYWNlKHJjLCBtb2RlbFtrXSA8PCA3LCBtb2RlbFtrKzFdIDw8IDYpOworICAgICAgICAgICAgICAgIHZhbHVlID0gZmZfb3B1c19yY19kZWNfbGFwbGFjZShyYywgbW9kZWxba10gPDwgNywgbW9kZWxbaysxXSA8PCA2KTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID49IDIpIHsKLSAgICAgICAgICAgICAgICBpbnQgeCA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBjZWx0X21vZGVsX2VuZXJneV9zbWFsbCk7CisgICAgICAgICAgICAgICAgaW50IHggPSBmZl9vcHVzX3JjX2RlY19jZGYocmMsIGZmX2NlbHRfbW9kZWxfZW5lcmd5X3NtYWxsKTsKICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh4Pj4xKSBeIC0oeCYxKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID49IDEpIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IC0oZmxvYXQpb3B1c19yY19wMm1vZGVsKHJjLCAxKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IC0oZmxvYXQpZmZfb3B1c19yY19kZWNfbG9nKHJjLCAxKTsKICAgICAgICAgICAgIH0gZWxzZSB2YWx1ZSA9IC0xOwogCi0gICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2ldID0gRkZNQVgoLTkuMGYsIGZyYW1lLT5lbmVyZ3lbaV0pICogYWxwaGEgKyBwcmV2W2pdICsgdmFsdWU7CisgICAgICAgICAgICBibG9jay0+ZW5lcmd5W2ldID0gRkZNQVgoLTkuMGYsIGJsb2NrLT5lbmVyZ3lbaV0pICogYWxwaGEgKyBwcmV2W2pdICsgdmFsdWU7CiAgICAgICAgICAgICBwcmV2W2pdICs9IGJldGEgKiB2YWx1ZTsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2VsdF9kZWNvZGVfZmluZV9lbmVyZ3koQ2VsdENvbnRleHQgKnMsIE9wdXNSYW5nZUNvZGVyICpyYykKK3N0YXRpYyB2b2lkIGNlbHRfZGVjb2RlX2ZpbmVfZW5lcmd5KENlbHRGcmFtZSAqZiwgT3B1c1JhbmdlQ29kZXIgKnJjKQogewogICAgIGludCBpOwotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgeworICAgIGZvciAoaSA9IGYtPnN0YXJ0X2JhbmQ7IGkgPCBmLT5lbmRfYmFuZDsgaSsrKSB7CiAgICAgICAgIGludCBqOwotICAgICAgICBpZiAoIXMtPmZpbmVfYml0c1tpXSkKKyAgICAgICAgaWYgKCFmLT5maW5lX2JpdHNbaV0pCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+Y29kZWRfY2hhbm5lbHM7IGorKykgewotICAgICAgICAgICAgQ2VsdEZyYW1lICpmcmFtZSA9ICZzLT5mcmFtZVtqXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGYtPmNoYW5uZWxzOyBqKyspIHsKKyAgICAgICAgICAgIENlbHRCbG9jayAqYmxvY2sgPSAmZi0+YmxvY2tbal07CiAgICAgICAgICAgICBpbnQgcTI7CiAgICAgICAgICAgICBmbG9hdCBvZmZzZXQ7Ci0gICAgICAgICAgICBxMiA9IG9wdXNfZ2V0cmF3Yml0cyhyYywgcy0+ZmluZV9iaXRzW2ldKTsKLSAgICAgICAgICAgIG9mZnNldCA9IChxMiArIDAuNWYpICogKDEgPDwgKDE0IC0gcy0+ZmluZV9iaXRzW2ldKSkgLyAxNjM4NC4wZiAtIDAuNWY7Ci0gICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2ldICs9IG9mZnNldDsKKyAgICAgICAgICAgIHEyID0gZmZfb3B1c19yY19nZXRfcmF3KHJjLCBmLT5maW5lX2JpdHNbaV0pOworICAgICAgICAgICAgb2Zmc2V0ID0gKHEyICsgMC41ZikgKiAoMSA8PCAoMTQgLSBmLT5maW5lX2JpdHNbaV0pKSAvIDE2Mzg0LjBmIC0gMC41ZjsKKyAgICAgICAgICAgIGJsb2NrLT5lbmVyZ3lbaV0gKz0gb2Zmc2V0OwogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjZWx0X2RlY29kZV9maW5hbF9lbmVyZ3koQ2VsdENvbnRleHQgKnMsIE9wdXNSYW5nZUNvZGVyICpyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0c19sZWZ0KQorc3RhdGljIHZvaWQgY2VsdF9kZWNvZGVfZmluYWxfZW5lcmd5KENlbHRGcmFtZSAqZiwgT3B1c1JhbmdlQ29kZXIgKnJjKQogewogICAgIGludCBwcmlvcml0eSwgaSwgajsKKyAgICBpbnQgYml0c19sZWZ0ID0gZi0+ZnJhbWViaXRzIC0gb3B1c19yY190ZWxsKHJjKTsKIAogICAgIGZvciAocHJpb3JpdHkgPSAwOyBwcmlvcml0eSA8IDI7IHByaW9yaXR5KyspIHsKLSAgICAgICAgZm9yIChpID0gcy0+c3RhcnRiYW5kOyBpIDwgcy0+ZW5kYmFuZCAmJiBiaXRzX2xlZnQgPj0gcy0+Y29kZWRfY2hhbm5lbHM7IGkrKykgewotICAgICAgICAgICAgaWYgKHMtPmZpbmVfcHJpb3JpdHlbaV0gIT0gcHJpb3JpdHkgfHwgcy0+ZmluZV9iaXRzW2ldID49IENFTFRfTUFYX0ZJTkVfQklUUykKKyAgICAgICAgZm9yIChpID0gZi0+c3RhcnRfYmFuZDsgaSA8IGYtPmVuZF9iYW5kICYmIGJpdHNfbGVmdCA+PSBmLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZi0+ZmluZV9wcmlvcml0eVtpXSAhPSBwcmlvcml0eSB8fCBmLT5maW5lX2JpdHNbaV0gPj0gQ0VMVF9NQVhfRklORV9CSVRTKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+Y29kZWRfY2hhbm5lbHM7IGorKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGYtPmNoYW5uZWxzOyBqKyspIHsKICAgICAgICAgICAgICAgICBpbnQgcTI7CiAgICAgICAgICAgICAgICAgZmxvYXQgb2Zmc2V0OwotICAgICAgICAgICAgICAgIHEyID0gb3B1c19nZXRyYXdiaXRzKHJjLCAxKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSAocTIgLSAwLjVmKSAqICgxIDw8ICgxNCAtIHMtPmZpbmVfYml0c1tpXSAtIDEpKSAvIDE2Mzg0LjBmOwotICAgICAgICAgICAgICAgIHMtPmZyYW1lW2pdLmVuZXJneVtpXSArPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgcTIgPSBmZl9vcHVzX3JjX2dldF9yYXcocmMsIDEpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IChxMiAtIDAuNWYpICogKDEgPDwgKDE0IC0gZi0+ZmluZV9iaXRzW2ldIC0gMSkpIC8gMTYzODQuMGY7CisgICAgICAgICAgICAgICAgZi0+YmxvY2tbal0uZW5lcmd5W2ldICs9IG9mZnNldDsKICAgICAgICAgICAgICAgICBiaXRzX2xlZnQtLTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2VsdF9kZWNvZGVfdGZfY2hhbmdlcyhDZWx0Q29udGV4dCAqcywgT3B1c1JhbmdlQ29kZXIgKnJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNpZW50KQorc3RhdGljIHZvaWQgY2VsdF9kZWNvZGVfdGZfY2hhbmdlcyhDZWx0RnJhbWUgKmYsIE9wdXNSYW5nZUNvZGVyICpyYykKIHsKICAgICBpbnQgaSwgZGlmZiA9IDAsIHRmX3NlbGVjdCA9IDAsIHRmX2NoYW5nZWQgPSAwLCB0Zl9zZWxlY3RfYml0OwotICAgIGludCBjb25zdW1lZCwgYml0cyA9IHRyYW5zaWVudCA/IDIgOiA0OworICAgIGludCBjb25zdW1lZCwgYml0cyA9IGYtPnRyYW5zaWVudCA/IDIgOiA0OwogCiAgICAgY29uc3VtZWQgPSBvcHVzX3JjX3RlbGwocmMpOwotICAgIHRmX3NlbGVjdF9iaXQgPSAocy0+ZHVyYXRpb24gIT0gMCAmJiBjb25zdW1lZCtiaXRzKzEgPD0gcy0+ZnJhbWViaXRzKTsKKyAgICB0Zl9zZWxlY3RfYml0ID0gKGYtPnNpemUgIT0gMCAmJiBjb25zdW1lZCtiaXRzKzEgPD0gZi0+ZnJhbWViaXRzKTsKIAotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgewotICAgICAgICBpZiAoY29uc3VtZWQrYml0cyt0Zl9zZWxlY3RfYml0IDw9IHMtPmZyYW1lYml0cykgewotICAgICAgICAgICAgZGlmZiBePSBvcHVzX3JjX3AybW9kZWwocmMsIGJpdHMpOworICAgIGZvciAoaSA9IGYtPnN0YXJ0X2JhbmQ7IGkgPCBmLT5lbmRfYmFuZDsgaSsrKSB7CisgICAgICAgIGlmIChjb25zdW1lZCtiaXRzK3RmX3NlbGVjdF9iaXQgPD0gZi0+ZnJhbWViaXRzKSB7CisgICAgICAgICAgICBkaWZmIF49IGZmX29wdXNfcmNfZGVjX2xvZyhyYywgYml0cyk7CiAgICAgICAgICAgICBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbChyYyk7CiAgICAgICAgICAgICB0Zl9jaGFuZ2VkIHw9IGRpZmY7CiAgICAgICAgIH0KLSAgICAgICAgcy0+dGZfY2hhbmdlW2ldID0gZGlmZjsKLSAgICAgICAgYml0cyA9IHRyYW5zaWVudCA/IDQgOiA1OworICAgICAgICBmLT50Zl9jaGFuZ2VbaV0gPSBkaWZmOworICAgICAgICBiaXRzID0gZi0+dHJhbnNpZW50ID8gNCA6IDU7CiAgICAgfQogCi0gICAgaWYgKHRmX3NlbGVjdF9iaXQgJiYgY2VsdF90Zl9zZWxlY3Rbcy0+ZHVyYXRpb25dW3RyYW5zaWVudF1bMF1bdGZfY2hhbmdlZF0gIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICBjZWx0X3RmX3NlbGVjdFtzLT5kdXJhdGlvbl1bdHJhbnNpZW50XVsxXVt0Zl9jaGFuZ2VkXSkKLSAgICAgICAgdGZfc2VsZWN0ID0gb3B1c19yY19wMm1vZGVsKHJjLCAxKTsKKyAgICBpZiAodGZfc2VsZWN0X2JpdCAmJiBmZl9jZWx0X3RmX3NlbGVjdFtmLT5zaXplXVtmLT50cmFuc2llbnRdWzBdW3RmX2NoYW5nZWRdICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgZmZfY2VsdF90Zl9zZWxlY3RbZi0+c2l6ZV1bZi0+dHJhbnNpZW50XVsxXVt0Zl9jaGFuZ2VkXSkKKyAgICAgICAgdGZfc2VsZWN0ID0gZmZfb3B1c19yY19kZWNfbG9nKHJjLCAxKTsKIAotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgewotICAgICAgICBzLT50Zl9jaGFuZ2VbaV0gPSBjZWx0X3RmX3NlbGVjdFtzLT5kdXJhdGlvbl1bdHJhbnNpZW50XVt0Zl9zZWxlY3RdW3MtPnRmX2NoYW5nZVtpXV07CisgICAgZm9yIChpID0gZi0+c3RhcnRfYmFuZDsgaSA8IGYtPmVuZF9iYW5kOyBpKyspIHsKKyAgICAgICAgZi0+dGZfY2hhbmdlW2ldID0gZmZfY2VsdF90Zl9zZWxlY3RbZi0+c2l6ZV1bZi0+dHJhbnNpZW50XVt0Zl9zZWxlY3RdW2YtPnRmX2NoYW5nZVtpXV07CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjZWx0X2RlY29kZV9hbGxvY2F0aW9uKENlbHRDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMpCi17Ci0gICAgLy8gYXBwcm94LiBtYXhpbXVtIGJpdCBhbGxvY2F0aW9uIGZvciBlYWNoIGJhbmQgYmVmb3JlIGJvb3N0L3RyaW0KLSAgICBpbnQgY2FwW0NFTFRfTUFYX0JBTkRTXTsKLSAgICBpbnQgYm9vc3RbQ0VMVF9NQVhfQkFORFNdOwotICAgIGludCB0aHJlc2hvbGRbQ0VMVF9NQVhfQkFORFNdOwotICAgIGludCBiaXRzMVtDRUxUX01BWF9CQU5EU107Ci0gICAgaW50IGJpdHMyW0NFTFRfTUFYX0JBTkRTXTsKLSAgICBpbnQgdHJpbV9vZmZzZXRbQ0VMVF9NQVhfQkFORFNdOwotCi0gICAgaW50IHNraXBfc3RhcnRiYW5kID0gcy0+c3RhcnRiYW5kOwotICAgIGludCBkeW5hbGxvYyAgICAgICA9IDY7Ci0gICAgaW50IGFsbG9jdHJpbSAgICAgID0gNTsKLSAgICBpbnQgZXh0cmFiaXRzICAgICAgPSAwOwotCi0gICAgaW50IHNraXBfYml0ICAgICAgICAgICAgPSAwOwotICAgIGludCBpbnRlbnNpdHlzdGVyZW9fYml0ID0gMDsKLSAgICBpbnQgZHVhbHN0ZXJlb19iaXQgICAgICA9IDA7Ci0KLSAgICBpbnQgcmVtYWluaW5nLCBiYW5kYml0czsKLSAgICBpbnQgbG93LCBoaWdoLCB0b3RhbCwgZG9uZTsKLSAgICBpbnQgdG90YWxiaXRzOwotICAgIGludCBjb25zdW1lZDsKLSAgICBpbnQgaSwgajsKLQotICAgIGNvbnN1bWVkID0gb3B1c19yY190ZWxsKHJjKTsKLQotICAgIC8qIG9idGFpbiBzcHJlYWQgZmxhZyAqLwotICAgIHMtPnNwcmVhZCA9IENFTFRfU1BSRUFEX05PUk1BTDsKLSAgICBpZiAoY29uc3VtZWQgKyA0IDw9IHMtPmZyYW1lYml0cykKLSAgICAgICAgcy0+c3ByZWFkID0gb3B1c19yY19nZXRzeW1ib2wocmMsIGNlbHRfbW9kZWxfc3ByZWFkKTsKLQotICAgIC8qIGdlbmVyYXRlIHN0YXRpYyBhbGxvY2F0aW9uIGNhcHMgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgQ0VMVF9NQVhfQkFORFM7IGkrKykgewotICAgICAgICBjYXBbaV0gPSAoY2VsdF9zdGF0aWNfY2Fwc1tzLT5kdXJhdGlvbl1bcy0+Y29kZWRfY2hhbm5lbHMgLSAxXVtpXSArIDY0KQotICAgICAgICAgICAgICAgICAqIGNlbHRfZnJlcV9yYW5nZVtpXSA8PCAocy0+Y29kZWRfY2hhbm5lbHMgLSAxKSA8PCBzLT5kdXJhdGlvbiA+PiAyOwotICAgIH0KLQotICAgIC8qIG9idGFpbiBiYW5kIGJvb3N0ICovCi0gICAgdG90YWxiaXRzID0gcy0+ZnJhbWViaXRzIDw8IDM7IC8vIGNvbnZlcnQgdG8gMS84IGJpdHMKLSAgICBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbF9mcmFjKHJjKTsKLSAgICBmb3IgKGkgPSBzLT5zdGFydGJhbmQ7IGkgPCBzLT5lbmRiYW5kOyBpKyspIHsKLSAgICAgICAgaW50IHF1YW50YSwgYmFuZF9keW5hbGxvYzsKLQotICAgICAgICBib29zdFtpXSA9IDA7Ci0KLSAgICAgICAgcXVhbnRhID0gY2VsdF9mcmVxX3JhbmdlW2ldIDw8IChzLT5jb2RlZF9jaGFubmVscyAtIDEpIDw8IHMtPmR1cmF0aW9uOwotICAgICAgICBxdWFudGEgPSBGRk1JTihxdWFudGEgPDwgMywgRkZNQVgoNiA8PCAzLCBxdWFudGEpKTsKLSAgICAgICAgYmFuZF9keW5hbGxvYyA9IGR5bmFsbG9jOwotICAgICAgICB3aGlsZSAoY29uc3VtZWQgKyAoYmFuZF9keW5hbGxvYzw8MykgPCB0b3RhbGJpdHMgJiYgYm9vc3RbaV0gPCBjYXBbaV0pIHsKLSAgICAgICAgICAgIGludCBhZGQgPSBvcHVzX3JjX3AybW9kZWwocmMsIGJhbmRfZHluYWxsb2MpOwotICAgICAgICAgICAgY29uc3VtZWQgPSBvcHVzX3JjX3RlbGxfZnJhYyhyYyk7Ci0gICAgICAgICAgICBpZiAoIWFkZCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgYm9vc3RbaV0gICAgICs9IHF1YW50YTsKLSAgICAgICAgICAgIHRvdGFsYml0cyAgICAtPSBxdWFudGE7Ci0gICAgICAgICAgICBiYW5kX2R5bmFsbG9jID0gMTsKLSAgICAgICAgfQotICAgICAgICAvKiBkeW5hbGxvYyBpcyBtb3JlIGxpa2VseSB0byBvY2N1ciBpZiBpdCdzIGFscmVhZHkgYmVlbiB1c2VkIGZvciBlYXJsaWVyIGJhbmRzICovCi0gICAgICAgIGlmIChib29zdFtpXSkKLSAgICAgICAgICAgIGR5bmFsbG9jID0gRkZNQVgoMiwgZHluYWxsb2MgLSAxKTsKLSAgICB9Ci0KLSAgICAvKiBvYnRhaW4gYWxsb2NhdGlvbiB0cmltICovCi0gICAgaWYgKGNvbnN1bWVkICsgKDYgPDwgMykgPD0gdG90YWxiaXRzKQotICAgICAgICBhbGxvY3RyaW0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgY2VsdF9tb2RlbF9hbGxvY190cmltKTsKLQotICAgIC8qIGFudGktY29sbGFwc2UgYml0IHJlc2VydmF0aW9uICovCi0gICAgdG90YWxiaXRzID0gKHMtPmZyYW1lYml0cyA8PCAzKSAtIG9wdXNfcmNfdGVsbF9mcmFjKHJjKSAtIDE7Ci0gICAgcy0+YW50aWNvbGxhcHNlX2JpdCA9IDA7Ci0gICAgaWYgKHMtPmJsb2NrcyA+IDEgJiYgcy0+ZHVyYXRpb24gPj0gMiAmJgotICAgICAgICB0b3RhbGJpdHMgPj0gKChzLT5kdXJhdGlvbiArIDIpIDw8IDMpKQotICAgICAgICBzLT5hbnRpY29sbGFwc2VfYml0ID0gMSA8PCAzOwotICAgIHRvdGFsYml0cyAtPSBzLT5hbnRpY29sbGFwc2VfYml0OwotCi0gICAgLyogYmFuZCBza2lwIGJpdCByZXNlcnZhdGlvbiAqLwotICAgIGlmICh0b3RhbGJpdHMgPj0gMSA8PCAzKQotICAgICAgICBza2lwX2JpdCA9IDEgPDwgMzsKLSAgICB0b3RhbGJpdHMgLT0gc2tpcF9iaXQ7Ci0KLSAgICAvKiBpbnRlbnNpdHkvZHVhbCBzdGVyZW8gYml0IHJlc2VydmF0aW9uICovCi0gICAgaWYgKHMtPmNvZGVkX2NoYW5uZWxzID09IDIpIHsKLSAgICAgICAgaW50ZW5zaXR5c3RlcmVvX2JpdCA9IGNlbHRfbG9nMl9mcmFjW3MtPmVuZGJhbmQgLSBzLT5zdGFydGJhbmRdOwotICAgICAgICBpZiAoaW50ZW5zaXR5c3RlcmVvX2JpdCA8PSB0b3RhbGJpdHMpIHsKLSAgICAgICAgICAgIHRvdGFsYml0cyAtPSBpbnRlbnNpdHlzdGVyZW9fYml0OwotICAgICAgICAgICAgaWYgKHRvdGFsYml0cyA+PSAxIDw8IDMpIHsKLSAgICAgICAgICAgICAgICBkdWFsc3RlcmVvX2JpdCA9IDEgPDwgMzsKLSAgICAgICAgICAgICAgICB0b3RhbGJpdHMgLT0gMSA8PCAzOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGludGVuc2l0eXN0ZXJlb19iaXQgPSAwOwotICAgIH0KLQotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgewotICAgICAgICBpbnQgdHJpbSAgICAgPSBhbGxvY3RyaW0gLSA1IC0gcy0+ZHVyYXRpb247Ci0gICAgICAgIGludCBiYW5kICAgICA9IGNlbHRfZnJlcV9yYW5nZVtpXSAqIChzLT5lbmRiYW5kIC0gaSAtIDEpOwotICAgICAgICBpbnQgZHVyYXRpb24gPSBzLT5kdXJhdGlvbiArIDM7Ci0gICAgICAgIGludCBzY2FsZSAgICA9IGR1cmF0aW9uICsgcy0+Y29kZWRfY2hhbm5lbHMgLSAxOwotCi0gICAgICAgIC8qIFBWUSBtaW5pbXVtIGFsbG9jYXRpb24gdGhyZXNob2xkLCBiZWxvdyB0aGlzIHZhbHVlIHRoZSBiYW5kIGlzCi0gICAgICAgICAqIHNraXBwZWQgKi8KLSAgICAgICAgdGhyZXNob2xkW2ldID0gRkZNQVgoMyAqIGNlbHRfZnJlcV9yYW5nZVtpXSA8PCBkdXJhdGlvbiA+PiA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2RlZF9jaGFubmVscyA8PCAzKTsKLQotICAgICAgICB0cmltX29mZnNldFtpXSA9IHRyaW0gKiAoYmFuZCA8PCBzY2FsZSkgPj4gNjsKLQotICAgICAgICBpZiAoY2VsdF9mcmVxX3JhbmdlW2ldIDw8IHMtPmR1cmF0aW9uID09IDEpCi0gICAgICAgICAgICB0cmltX29mZnNldFtpXSAtPSBzLT5jb2RlZF9jaGFubmVscyA8PCAzOwotICAgIH0KLQotICAgIC8qIGJpc2VjdGlvbiAqLwotICAgIGxvdyAgPSAxOwotICAgIGhpZ2ggPSBDRUxUX1ZFQ1RPUlMgLSAxOwotICAgIHdoaWxlIChsb3cgPD0gaGlnaCkgewotICAgICAgICBpbnQgY2VudGVyID0gKGxvdyArIGhpZ2gpID4+IDE7Ci0gICAgICAgIGRvbmUgPSB0b3RhbCA9IDA7Ci0KLSAgICAgICAgZm9yIChpID0gcy0+ZW5kYmFuZCAtIDE7IGkgPj0gcy0+c3RhcnRiYW5kOyBpLS0pIHsKLSAgICAgICAgICAgIGJhbmRiaXRzID0gY2VsdF9mcmVxX3JhbmdlW2ldICogY2VsdF9zdGF0aWNfYWxsb2NbY2VudGVyXVtpXQotICAgICAgICAgICAgICAgICAgICAgICA8PCAocy0+Y29kZWRfY2hhbm5lbHMgLSAxKSA8PCBzLT5kdXJhdGlvbiA+PiAyOwotCi0gICAgICAgICAgICBpZiAoYmFuZGJpdHMpCi0gICAgICAgICAgICAgICAgYmFuZGJpdHMgPSBGRk1BWCgwLCBiYW5kYml0cyArIHRyaW1fb2Zmc2V0W2ldKTsKLSAgICAgICAgICAgIGJhbmRiaXRzICs9IGJvb3N0W2ldOwotCi0gICAgICAgICAgICBpZiAoYmFuZGJpdHMgPj0gdGhyZXNob2xkW2ldIHx8IGRvbmUpIHsKLSAgICAgICAgICAgICAgICBkb25lID0gMTsKLSAgICAgICAgICAgICAgICB0b3RhbCArPSBGRk1JTihiYW5kYml0cywgY2FwW2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFuZGJpdHMgPj0gcy0+Y29kZWRfY2hhbm5lbHMgPDwgMykKLSAgICAgICAgICAgICAgICB0b3RhbCArPSBzLT5jb2RlZF9jaGFubmVscyA8PCAzOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRvdGFsID4gdG90YWxiaXRzKQotICAgICAgICAgICAgaGlnaCA9IGNlbnRlciAtIDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxvdyA9IGNlbnRlciArIDE7Ci0gICAgfQotICAgIGhpZ2ggPSBsb3ctLTsKLQotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgewotICAgICAgICBiaXRzMVtpXSA9IGNlbHRfZnJlcV9yYW5nZVtpXSAqIGNlbHRfc3RhdGljX2FsbG9jW2xvd11baV0KLSAgICAgICAgICAgICAgICAgICA8PCAocy0+Y29kZWRfY2hhbm5lbHMgLSAxKSA8PCBzLT5kdXJhdGlvbiA+PiAyOwotICAgICAgICBiaXRzMltpXSA9IGhpZ2ggPj0gQ0VMVF9WRUNUT1JTID8gY2FwW2ldIDoKLSAgICAgICAgICAgICAgICAgICBjZWx0X2ZyZXFfcmFuZ2VbaV0gKiBjZWx0X3N0YXRpY19hbGxvY1toaWdoXVtpXQotICAgICAgICAgICAgICAgICAgIDw8IChzLT5jb2RlZF9jaGFubmVscyAtIDEpIDw8IHMtPmR1cmF0aW9uID4+IDI7Ci0KLSAgICAgICAgaWYgKGJpdHMxW2ldKQotICAgICAgICAgICAgYml0czFbaV0gPSBGRk1BWCgwLCBiaXRzMVtpXSArIHRyaW1fb2Zmc2V0W2ldKTsKLSAgICAgICAgaWYgKGJpdHMyW2ldKQotICAgICAgICAgICAgYml0czJbaV0gPSBGRk1BWCgwLCBiaXRzMltpXSArIHRyaW1fb2Zmc2V0W2ldKTsKLSAgICAgICAgaWYgKGxvdykKLSAgICAgICAgICAgIGJpdHMxW2ldICs9IGJvb3N0W2ldOwotICAgICAgICBiaXRzMltpXSArPSBib29zdFtpXTsKLQotICAgICAgICBpZiAoYm9vc3RbaV0pCi0gICAgICAgICAgICBza2lwX3N0YXJ0YmFuZCA9IGk7Ci0gICAgICAgIGJpdHMyW2ldID0gRkZNQVgoMCwgYml0czJbaV0gLSBiaXRzMVtpXSk7Ci0gICAgfQotCi0gICAgLyogYmlzZWN0aW9uICovCi0gICAgbG93ICA9IDA7Ci0gICAgaGlnaCA9IDEgPDwgQ0VMVF9BTExPQ19TVEVQUzsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQ0VMVF9BTExPQ19TVEVQUzsgaSsrKSB7Ci0gICAgICAgIGludCBjZW50ZXIgPSAobG93ICsgaGlnaCkgPj4gMTsKLSAgICAgICAgZG9uZSA9IHRvdGFsID0gMDsKLQotICAgICAgICBmb3IgKGogPSBzLT5lbmRiYW5kIC0gMTsgaiA+PSBzLT5zdGFydGJhbmQ7IGotLSkgewotICAgICAgICAgICAgYmFuZGJpdHMgPSBiaXRzMVtqXSArIChjZW50ZXIgKiBiaXRzMltqXSA+PiBDRUxUX0FMTE9DX1NURVBTKTsKLQotICAgICAgICAgICAgaWYgKGJhbmRiaXRzID49IHRocmVzaG9sZFtqXSB8fCBkb25lKSB7Ci0gICAgICAgICAgICAgICAgZG9uZSA9IDE7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gRkZNSU4oYmFuZGJpdHMsIGNhcFtqXSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGJhbmRiaXRzID49IHMtPmNvZGVkX2NoYW5uZWxzIDw8IDMpCi0gICAgICAgICAgICAgICAgdG90YWwgKz0gcy0+Y29kZWRfY2hhbm5lbHMgPDwgMzsKLSAgICAgICAgfQotICAgICAgICBpZiAodG90YWwgPiB0b3RhbGJpdHMpCi0gICAgICAgICAgICBoaWdoID0gY2VudGVyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsb3cgPSBjZW50ZXI7Ci0gICAgfQotCi0gICAgZG9uZSA9IHRvdGFsID0gMDsKLSAgICBmb3IgKGkgPSBzLT5lbmRiYW5kIC0gMTsgaSA+PSBzLT5zdGFydGJhbmQ7IGktLSkgewotICAgICAgICBiYW5kYml0cyA9IGJpdHMxW2ldICsgKGxvdyAqIGJpdHMyW2ldID4+IENFTFRfQUxMT0NfU1RFUFMpOwotCi0gICAgICAgIGlmIChiYW5kYml0cyA+PSB0aHJlc2hvbGRbaV0gfHwgZG9uZSkKLSAgICAgICAgICAgIGRvbmUgPSAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBiYW5kYml0cyA9IChiYW5kYml0cyA+PSBzLT5jb2RlZF9jaGFubmVscyA8PCAzKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgIHMtPmNvZGVkX2NoYW5uZWxzIDw8IDMgOiAwOwotCi0gICAgICAgIGJhbmRiaXRzICAgICA9IEZGTUlOKGJhbmRiaXRzLCBjYXBbaV0pOwotICAgICAgICBzLT5wdWxzZXNbaV0gPSBiYW5kYml0czsKLSAgICAgICAgdG90YWwgICAgICArPSBiYW5kYml0czsKLSAgICB9Ci0KLSAgICAvKiBiYW5kIHNraXBwaW5nICovCi0gICAgZm9yIChzLT5jb2RlZGJhbmRzID0gcy0+ZW5kYmFuZDsgOyBzLT5jb2RlZGJhbmRzLS0pIHsKLSAgICAgICAgaW50IGFsbG9jYXRpb247Ci0gICAgICAgIGogPSBzLT5jb2RlZGJhbmRzIC0gMTsKLQotICAgICAgICBpZiAoaiA9PSBza2lwX3N0YXJ0YmFuZCkgewotICAgICAgICAgICAgLyogYWxsIHJlbWFpbmluZyBiYW5kcyBhcmUgbm90IHNraXBwZWQgKi8KLSAgICAgICAgICAgIHRvdGFsYml0cyArPSBza2lwX2JpdDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgZm9yIGNvZGluZyAiZG8gbm90IHNraXAiIG1hcmtlcnMgKi8KLSAgICAgICAgcmVtYWluaW5nICAgPSB0b3RhbGJpdHMgLSB0b3RhbDsKLSAgICAgICAgYmFuZGJpdHMgICAgPSByZW1haW5pbmcgLyAoY2VsdF9mcmVxX2JhbmRzW2orMV0gLSBjZWx0X2ZyZXFfYmFuZHNbcy0+c3RhcnRiYW5kXSk7Ci0gICAgICAgIHJlbWFpbmluZyAgLT0gYmFuZGJpdHMgICogKGNlbHRfZnJlcV9iYW5kc1tqKzFdIC0gY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0pOwotICAgICAgICBhbGxvY2F0aW9uICA9IHMtPnB1bHNlc1tqXSArIGJhbmRiaXRzICogY2VsdF9mcmVxX3JhbmdlW2pdCi0gICAgICAgICAgICAgICAgICAgICAgKyBGRk1BWCgwLCByZW1haW5pbmcgLSAoY2VsdF9mcmVxX2JhbmRzW2pdIC0gY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0pKTsKLQotICAgICAgICAvKiBhICJkbyBub3Qgc2tpcCIgbWFya2VyIGlzIG9ubHkgY29kZWQgaWYgdGhlIGFsbG9jYXRpb24gaXMKLSAgICAgICAgICAgYWJvdmUgdGhlIGNob3NlbiB0aHJlc2hvbGQgKi8KLSAgICAgICAgaWYgKGFsbG9jYXRpb24gPj0gRkZNQVgodGhyZXNob2xkW2pdLCAocy0+Y29kZWRfY2hhbm5lbHMgKyAxKSA8PDMgKSkgewotICAgICAgICAgICAgaWYgKG9wdXNfcmNfcDJtb2RlbChyYywgMSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHRvdGFsICAgICAgKz0gMSA8PCAzOwotICAgICAgICAgICAgYWxsb2NhdGlvbiAtPSAxIDw8IDM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0aGUgYmFuZCBpcyBza2lwcGVkLCBzbyByZWNsYWltIGl0cyBiaXRzICovCi0gICAgICAgIHRvdGFsIC09IHMtPnB1bHNlc1tqXTsKLSAgICAgICAgaWYgKGludGVuc2l0eXN0ZXJlb19iaXQpIHsKLSAgICAgICAgICAgIHRvdGFsIC09IGludGVuc2l0eXN0ZXJlb19iaXQ7Ci0gICAgICAgICAgICBpbnRlbnNpdHlzdGVyZW9fYml0ID0gY2VsdF9sb2cyX2ZyYWNbaiAtIHMtPnN0YXJ0YmFuZF07Ci0gICAgICAgICAgICB0b3RhbCArPSBpbnRlbnNpdHlzdGVyZW9fYml0OwotICAgICAgICB9Ci0KLSAgICAgICAgdG90YWwgKz0gcy0+cHVsc2VzW2pdID0gKGFsbG9jYXRpb24gPj0gcy0+Y29kZWRfY2hhbm5lbHMgPDwgMykgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29kZWRfY2hhbm5lbHMgPDwgMyA6IDA7Ci0gICAgfQotCi0gICAgLyogb2J0YWluIHN0ZXJlbyBmbGFncyAqLwotICAgIHMtPmludGVuc2l0eXN0ZXJlbyA9IDA7Ci0gICAgcy0+ZHVhbHN0ZXJlbyAgICAgID0gMDsKLSAgICBpZiAoaW50ZW5zaXR5c3RlcmVvX2JpdCkKLSAgICAgICAgcy0+aW50ZW5zaXR5c3RlcmVvID0gcy0+c3RhcnRiYW5kICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3B1c19yY191bmltb2RlbChyYywgcy0+Y29kZWRiYW5kcyArIDEgLSBzLT5zdGFydGJhbmQpOwotICAgIGlmIChzLT5pbnRlbnNpdHlzdGVyZW8gPD0gcy0+c3RhcnRiYW5kKQotICAgICAgICB0b3RhbGJpdHMgKz0gZHVhbHN0ZXJlb19iaXQ7IC8qIG5vIGludGVuc2l0eSBzdGVyZW8gbWVhbnMgbm8gZHVhbCBzdGVyZW8gKi8KLSAgICBlbHNlIGlmIChkdWFsc3RlcmVvX2JpdCkKLSAgICAgICAgcy0+ZHVhbHN0ZXJlbyA9IG9wdXNfcmNfcDJtb2RlbChyYywgMSk7Ci0KLSAgICAvKiBzdXBwbHkgdGhlIHJlbWFpbmluZyBiaXRzIGluIHRoaXMgZnJhbWUgdG8gbG93ZXIgYmFuZHMgKi8KLSAgICByZW1haW5pbmcgPSB0b3RhbGJpdHMgLSB0b3RhbDsKLSAgICBiYW5kYml0cyAgPSByZW1haW5pbmcgLyAoY2VsdF9mcmVxX2JhbmRzW3MtPmNvZGVkYmFuZHNdIC0gY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0pOwotICAgIHJlbWFpbmluZyAtPSBiYW5kYml0cyAqIChjZWx0X2ZyZXFfYmFuZHNbcy0+Y29kZWRiYW5kc10gLSBjZWx0X2ZyZXFfYmFuZHNbcy0+c3RhcnRiYW5kXSk7Ci0gICAgZm9yIChpID0gcy0+c3RhcnRiYW5kOyBpIDwgcy0+Y29kZWRiYW5kczsgaSsrKSB7Ci0gICAgICAgIGludCBiaXRzID0gRkZNSU4ocmVtYWluaW5nLCBjZWx0X2ZyZXFfcmFuZ2VbaV0pOwotCi0gICAgICAgIHMtPnB1bHNlc1tpXSArPSBiaXRzICsgYmFuZGJpdHMgKiBjZWx0X2ZyZXFfcmFuZ2VbaV07Ci0gICAgICAgIHJlbWFpbmluZyAgICAtPSBiaXRzOwotICAgIH0KLQotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmNvZGVkYmFuZHM7IGkrKykgewotICAgICAgICBpbnQgTiA9IGNlbHRfZnJlcV9yYW5nZVtpXSA8PCBzLT5kdXJhdGlvbjsKLSAgICAgICAgaW50IHByZXZfZXh0cmEgPSBleHRyYWJpdHM7Ci0gICAgICAgIHMtPnB1bHNlc1tpXSArPSBleHRyYWJpdHM7Ci0KLSAgICAgICAgaWYgKE4gPiAxKSB7Ci0gICAgICAgICAgICBpbnQgZG9mOyAgICAgICAgLy8gZGVncmVlcyBvZiBmcmVlZG9tCi0gICAgICAgICAgICBpbnQgdGVtcDsgICAgICAgLy8gZG9mICogY2hhbm5lbHMgKiBsb2coZG9mKQotICAgICAgICAgICAgaW50IG9mZnNldDsgICAgIC8vIGZpbmUgZW5lcmd5IHF1YW50aXphdGlvbiBvZmZzZXQsIGkuZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRyYSBiaXRzIGFzc2lnbmVkIG92ZXIgdGhlIHN0YW5kYXJkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG90YWxiaXRzL2RvZgotICAgICAgICAgICAgaW50IGZpbmVfYml0cywgbWF4X2JpdHM7Ci0KLSAgICAgICAgICAgIGV4dHJhYml0cyA9IEZGTUFYKDAsIHMtPnB1bHNlc1tpXSAtIGNhcFtpXSk7Ci0gICAgICAgICAgICBzLT5wdWxzZXNbaV0gLT0gZXh0cmFiaXRzOwotCi0gICAgICAgICAgICAvKiBpbnRlbnNpdHkgc3RlcmVvIG1ha2VzIHVzZSBvZiBhbiBleHRyYSBkZWdyZWUgb2YgZnJlZWRvbSAqLwotICAgICAgICAgICAgZG9mID0gTiAqIHMtPmNvZGVkX2NoYW5uZWxzCi0gICAgICAgICAgICAgICAgICArIChzLT5jb2RlZF9jaGFubmVscyA9PSAyICYmIE4gPiAyICYmICFzLT5kdWFsc3RlcmVvICYmIGkgPCBzLT5pbnRlbnNpdHlzdGVyZW8pOwotICAgICAgICAgICAgdGVtcCA9IGRvZiAqIChjZWx0X2xvZ19mcmVxX3JhbmdlW2ldICsgKHMtPmR1cmF0aW9uPDwzKSk7Ci0gICAgICAgICAgICBvZmZzZXQgPSAodGVtcCA+PiAxKSAtIGRvZiAqIENFTFRfRklORV9PRkZTRVQ7Ci0gICAgICAgICAgICBpZiAoTiA9PSAyKSAvKiBkb2Y9MiBpcyB0aGUgb25seSBjYXNlIHRoYXQgZG9lc24ndCBmaXQgdGhlIG1vZGVsICovCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGRvZjw8MTsKLQotICAgICAgICAgICAgLyogZ3JhbnQgYW4gYWRkaXRpb25hbCBiaWFzIGZvciB0aGUgZmlyc3QgYW5kIHNlY29uZCBwdWxzZXMgKi8KLSAgICAgICAgICAgIGlmIChzLT5wdWxzZXNbaV0gKyBvZmZzZXQgPCAyICogKGRvZiA8PCAzKSkKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gdGVtcCA+PiAyOwotICAgICAgICAgICAgZWxzZSBpZiAocy0+cHVsc2VzW2ldICsgb2Zmc2V0IDwgMyAqIChkb2YgPDwgMykpCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IHRlbXAgPj4gMzsKLQotICAgICAgICAgICAgZmluZV9iaXRzID0gKHMtPnB1bHNlc1tpXSArIG9mZnNldCArIChkb2YgPDwgMikpIC8gKGRvZiA8PCAzKTsKLSAgICAgICAgICAgIG1heF9iaXRzICA9IEZGTUlOKChzLT5wdWxzZXNbaV0+PjMpID4+IChzLT5jb2RlZF9jaGFubmVscyAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMVF9NQVhfRklORV9CSVRTKTsKLQotICAgICAgICAgICAgbWF4X2JpdHMgID0gRkZNQVgobWF4X2JpdHMsIDApOwotCi0gICAgICAgICAgICBzLT5maW5lX2JpdHNbaV0gPSBhdl9jbGlwKGZpbmVfYml0cywgMCwgbWF4X2JpdHMpOwotCi0gICAgICAgICAgICAvKiBpZiBmaW5lX2JpdHMgd2FzIHJvdW5kZWQgZG93biBvciBjYXBwZWQsCi0gICAgICAgICAgICAgICBnaXZlIHByaW9yaXR5IGZvciB0aGUgZmluYWwgZmluZSBlbmVyZ3kgcGFzcyAqLwotICAgICAgICAgICAgcy0+ZmluZV9wcmlvcml0eVtpXSA9IChzLT5maW5lX2JpdHNbaV0gKiAoZG9mPDwzKSA+PSBzLT5wdWxzZXNbaV0gKyBvZmZzZXQpOwotCi0gICAgICAgICAgICAvKiB0aGUgcmVtYWluaW5nIGJpdHMgYXJlIGFzc2lnbmVkIHRvIFBWUSAqLwotICAgICAgICAgICAgcy0+cHVsc2VzW2ldIC09IHMtPmZpbmVfYml0c1tpXSA8PCAocy0+Y29kZWRfY2hhbm5lbHMgLSAxKSA8PCAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogYWxsIGJpdHMgZ28gdG8gZmluZSBlbmVyZ3kgZXhjZXB0IGZvciB0aGUgc2lnbiBiaXQgKi8KLSAgICAgICAgICAgIGV4dHJhYml0cyA9IEZGTUFYKDAsIHMtPnB1bHNlc1tpXSAtIChzLT5jb2RlZF9jaGFubmVscyA8PCAzKSk7Ci0gICAgICAgICAgICBzLT5wdWxzZXNbaV0gLT0gZXh0cmFiaXRzOwotICAgICAgICAgICAgcy0+ZmluZV9iaXRzW2ldID0gMDsKLSAgICAgICAgICAgIHMtPmZpbmVfcHJpb3JpdHlbaV0gPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaGFuZCBiYWNrIGEgbGltaXRlZCBudW1iZXIgb2YgZXh0cmEgZmluZSBlbmVyZ3kgYml0cyB0byB0aGlzIGJhbmQgKi8KLSAgICAgICAgaWYgKGV4dHJhYml0cyA+IDApIHsKLSAgICAgICAgICAgIGludCBmaW5lZXh0cmEgPSBGRk1JTihleHRyYWJpdHMgPj4gKHMtPmNvZGVkX2NoYW5uZWxzICsgMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMVF9NQVhfRklORV9CSVRTIC0gcy0+ZmluZV9iaXRzW2ldKTsKLSAgICAgICAgICAgIHMtPmZpbmVfYml0c1tpXSArPSBmaW5lZXh0cmE7Ci0KLSAgICAgICAgICAgIGZpbmVleHRyYSA8PD0gcy0+Y29kZWRfY2hhbm5lbHMgKyAyOwotICAgICAgICAgICAgcy0+ZmluZV9wcmlvcml0eVtpXSA9IChmaW5lZXh0cmEgPj0gZXh0cmFiaXRzIC0gcHJldl9leHRyYSk7Ci0gICAgICAgICAgICBleHRyYWJpdHMgLT0gZmluZWV4dHJhOwotICAgICAgICB9Ci0gICAgfQotICAgIHMtPnJlbWFpbmluZyA9IGV4dHJhYml0czsKLQotICAgIC8qIHNraXBwZWQgYmFuZHMgZGVkaWNhdGUgYWxsIG9mIHRoZWlyIGJpdHMgZm9yIGZpbmUgZW5lcmd5ICovCi0gICAgZm9yICg7IGkgPCBzLT5lbmRiYW5kOyBpKyspIHsKLSAgICAgICAgcy0+ZmluZV9iaXRzW2ldICAgICA9IHMtPnB1bHNlc1tpXSA+PiAocy0+Y29kZWRfY2hhbm5lbHMgLSAxKSA+PiAzOwotICAgICAgICBzLT5wdWxzZXNbaV0gICAgICAgID0gMDsKLSAgICAgICAgcy0+ZmluZV9wcmlvcml0eVtpXSA9IHMtPmZpbmVfYml0c1tpXSA8IDE7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGludCBjZWx0X2JpdHMycHVsc2VzKGNvbnN0IHVpbnQ4X3QgKmNhY2hlLCBpbnQgYml0cykKLXsKLSAgICAvLyBUT0RPOiBGaW5kIHRoZSBzaXplIG9mIGNhY2hlIGFuZCBtYWtlIGl0IGludG8gYW4gYXJyYXkgaW4gdGhlIHBhcmFtZXRlcnMgbGlzdAotICAgIGludCBpLCBsb3cgPSAwLCBoaWdoOwotCi0gICAgaGlnaCA9IGNhY2hlWzBdOwotICAgIGJpdHMtLTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgICAgaW50IGNlbnRlciA9IChsb3cgKyBoaWdoICsgMSkgPj4gMTsKLSAgICAgICAgaWYgKGNhY2hlW2NlbnRlcl0gPj0gYml0cykKLSAgICAgICAgICAgIGhpZ2ggPSBjZW50ZXI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxvdyA9IGNlbnRlcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gKGJpdHMgLSAobG93ID09IDAgPyAtMSA6IGNhY2hlW2xvd10pIDw9IGNhY2hlW2hpZ2hdIC0gYml0cykgPyBsb3cgOiBoaWdoOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjZWx0X3B1bHNlczJiaXRzKGNvbnN0IHVpbnQ4X3QgKmNhY2hlLCBpbnQgcHVsc2VzKQotewotICAgIC8vIFRPRE86IEZpbmQgdGhlIHNpemUgb2YgY2FjaGUgYW5kIG1ha2UgaXQgaW50byBhbiBhcnJheSBpbiB0aGUgcGFyYW1ldGVycyBsaXN0Ci0gICByZXR1cm4gKHB1bHNlcyA9PSAwKSA/IDAgOiBjYWNoZVtwdWxzZXNdICsgMTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNlbHRfbm9ybWFsaXplX3Jlc2lkdWFsKGNvbnN0IGludCAqIGF2X3Jlc3RyaWN0IGl5LCBmbG9hdCAqIGF2X3Jlc3RyaWN0IFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE4sIGZsb2F0IGcpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKLSAgICAgICAgWFtpXSA9IGcgKiBpeVtpXTsKLX0KLQotc3RhdGljIHZvaWQgY2VsdF9leHBfcm90YXRpb24xKGZsb2F0ICpYLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGMsIGZsb2F0IHMpCi17Ci0gICAgZmxvYXQgKlhwdHI7Ci0gICAgaW50IGk7Ci0KLSAgICBYcHRyID0gWDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gc3RyaWRlOyBpKyspIHsKLSAgICAgICAgZmxvYXQgeDEsIHgyOwotICAgICAgICB4MSAgICAgICAgICAgPSBYcHRyWzBdOwotICAgICAgICB4MiAgICAgICAgICAgPSBYcHRyW3N0cmlkZV07Ci0gICAgICAgIFhwdHJbc3RyaWRlXSA9IGMgKiB4MiArIHMgKiB4MTsKLSAgICAgICAgKlhwdHIrKyAgICAgID0gYyAqIHgxIC0gcyAqIHgyOwotICAgIH0KLQotICAgIFhwdHIgPSAmWFtsZW4gLSAyICogc3RyaWRlIC0gMV07Ci0gICAgZm9yIChpID0gbGVuIC0gMiAqIHN0cmlkZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgIGZsb2F0IHgxLCB4MjsKLSAgICAgICAgeDEgICAgICAgICAgID0gWHB0clswXTsKLSAgICAgICAgeDIgICAgICAgICAgID0gWHB0cltzdHJpZGVdOwotICAgICAgICBYcHRyW3N0cmlkZV0gPSBjICogeDIgKyBzICogeDE7Ci0gICAgICAgICpYcHRyLS0gICAgICA9IGMgKiB4MSAtIHMgKiB4MjsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjZWx0X2V4cF9yb3RhdGlvbihmbG9hdCAqWCwgdW5zaWduZWQgaW50IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RyaWRlLCB1bnNpZ25lZCBpbnQgSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENlbHRTcHJlYWQgc3ByZWFkKQotewotICAgIHVuc2lnbmVkIGludCBzdHJpZGUyID0gMDsKLSAgICBmbG9hdCBjLCBzOwotICAgIGZsb2F0IGdhaW4sIHRoZXRhOwotICAgIGludCBpOwotCi0gICAgaWYgKDIqSyA+PSBsZW4gfHwgc3ByZWFkID09IENFTFRfU1BSRUFEX05PTkUpCi0gICAgICAgIHJldHVybjsKLQotICAgIGdhaW4gPSAoZmxvYXQpbGVuIC8gKGxlbiArICgyMCAtIDUqc3ByZWFkKSAqIEspOwotICAgIHRoZXRhID0gTV9QSSAqIGdhaW4gKiBnYWluIC8gNDsKLQotICAgIGMgPSBjb3ModGhldGEpOwotICAgIHMgPSBzaW4odGhldGEpOwotCi0gICAgaWYgKGxlbiA+PSBzdHJpZGUgPDwgMykgewotICAgICAgICBzdHJpZGUyID0gMTsKLSAgICAgICAgLyogVGhpcyBpcyBqdXN0IGEgc2ltcGxlIChlcXVpdmFsZW50KSB3YXkgb2YgY29tcHV0aW5nIHNxcnQobGVuL3N0cmlkZSkgd2l0aCByb3VuZGluZy4KLSAgICAgICAgSXQncyBiYXNpY2FsbHkgaW5jcmVtZW50aW5nIGxvbmcgYXMgKHN0cmlkZTIrMC41KV4yIDwgbGVuL3N0cmlkZS4gKi8KLSAgICAgICAgd2hpbGUgKChzdHJpZGUyICogc3RyaWRlMiArIHN0cmlkZTIpICogc3RyaWRlICsgKHN0cmlkZSA+PiAyKSA8IGxlbikKLSAgICAgICAgICAgIHN0cmlkZTIrKzsKLSAgICB9Ci0KLSAgICAvKk5PVEU6IEFzIGEgbWlub3Igb3B0aW1pemF0aW9uLCB3ZSBjb3VsZCBiZSBwYXNzaW5nIGFyb3VuZCBsb2cyKEIpLCBub3QgQiwgZm9yIGJvdGggdGhpcyBhbmQgZm9yCi0gICAgZXh0cmFjdF9jb2xsYXBzZV9tYXNrKCkuKi8KLSAgICBsZW4gLz0gc3RyaWRlOwotICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpZGU7IGkrKykgewotICAgICAgICBpZiAoc3RyaWRlMikKLSAgICAgICAgICAgIGNlbHRfZXhwX3JvdGF0aW9uMShYICsgaSAqIGxlbiwgbGVuLCBzdHJpZGUyLCBzLCBjKTsKLSAgICAgICAgY2VsdF9leHBfcm90YXRpb24xKFggKyBpICogbGVuLCBsZW4sIDEsIGMsIHMpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY2VsdF9leHRyYWN0X2NvbGxhcHNlX21hc2soY29uc3QgaW50ICppeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBOLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEIpCi17Ci0gICAgdW5zaWduZWQgaW50IGNvbGxhcHNlX21hc2s7Ci0gICAgaW50IE4wOwotICAgIGludCBpLCBqOwotCi0gICAgaWYgKEIgPD0gMSkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAvKk5PVEU6IEFzIGEgbWlub3Igb3B0aW1pemF0aW9uLCB3ZSBjb3VsZCBiZSBwYXNzaW5nIGFyb3VuZCBsb2cyKEIpLCBub3QgQiwgZm9yIGJvdGggdGhpcyBhbmQgZm9yCi0gICAgZXhwX3JvdGF0aW9uKCkuKi8KLSAgICBOMCA9IE4vQjsKLSAgICBjb2xsYXBzZV9tYXNrID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgQjsgaSsrKQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKLSAgICAgICAgICAgIGNvbGxhcHNlX21hc2sgfD0gKGl5W2kqTjAral0hPTApPDxpOwotICAgIHJldHVybiBjb2xsYXBzZV9tYXNrOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2VsdF9yZW5vcm1hbGl6ZV92ZWN0b3IoZmxvYXQgKlgsIGludCBOLCBmbG9hdCBnYWluKQotewotICAgIGludCBpOwotICAgIGZsb2F0IGcgPSAxZS0xNWY7Ci0gICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKLSAgICAgICAgZyArPSBYW2ldICogWFtpXTsKLSAgICBnID0gZ2FpbiAvIHNxcnRmKGcpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKLSAgICAgICAgWFtpXSAqPSBnOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2VsdF9zdGVyZW9fbWVyZ2UoZmxvYXQgKlgsIGZsb2F0ICpZLCBmbG9hdCBtaWQsIGludCBOKQotewotICAgIGludCBpOwotICAgIGZsb2F0IHhwID0gMCwgc2lkZSA9IDA7Ci0gICAgZmxvYXQgRVsyXTsKLSAgICBmbG9hdCBtaWQyOwotICAgIGZsb2F0IHQsIGdhaW5bMl07Ci0KLSAgICAvKiBDb21wdXRlIHRoZSBub3JtIG9mIFgrWSBhbmQgWC1ZIGFzIHxYfF4yICsgfFl8XjIgKy8tIHN1bSh4eSkgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7Ci0gICAgICAgIHhwICAgKz0gWFtpXSAqIFlbaV07Ci0gICAgICAgIHNpZGUgKz0gWVtpXSAqIFlbaV07Ci0gICAgfQotCi0gICAgLyogQ29tcGVuc2F0aW5nIGZvciB0aGUgbWlkIG5vcm1hbGl6YXRpb24gKi8KLSAgICB4cCAqPSBtaWQ7Ci0gICAgbWlkMiA9IG1pZDsKLSAgICBFWzBdID0gbWlkMiAqIG1pZDIgKyBzaWRlIC0gMiAqIHhwOwotICAgIEVbMV0gPSBtaWQyICogbWlkMiArIHNpZGUgKyAyICogeHA7Ci0gICAgaWYgKEVbMF0gPCA2ZS00ZiB8fCBFWzFdIDwgNmUtNGYpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKLSAgICAgICAgICAgIFlbaV0gPSBYW2ldOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdCA9IEVbMF07Ci0gICAgZ2FpblswXSA9IDEuMGYgLyBzcXJ0Zih0KTsKLSAgICB0ID0gRVsxXTsKLSAgICBnYWluWzFdID0gMS4wZiAvIHNxcnRmKHQpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgewotICAgICAgICBmbG9hdCB2YWx1ZVsyXTsKLSAgICAgICAgLyogQXBwbHkgbWlkIHNjYWxpbmcgKHNpZGUgaXMgYWxyZWFkeSBzY2FsZWQpICovCi0gICAgICAgIHZhbHVlWzBdID0gbWlkICogWFtpXTsKLSAgICAgICAgdmFsdWVbMV0gPSBZW2ldOwotICAgICAgICBYW2ldID0gZ2FpblswXSAqICh2YWx1ZVswXSAtIHZhbHVlWzFdKTsKLSAgICAgICAgWVtpXSA9IGdhaW5bMV0gKiAodmFsdWVbMF0gKyB2YWx1ZVsxXSk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjZWx0X2ludGVybGVhdmVfaGFkYW1hcmQoZmxvYXQgKnRtcCwgZmxvYXQgKlgsIGludCBOMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaGFkYW1hcmQpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaW50IE4gPSBOMCpzdHJpZGU7Ci0KLSAgICBpZiAoaGFkYW1hcmQpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqb3JkZXJ5ID0gY2VsdF9oYWRhbWFyZF9vcmRlcnkgKyBzdHJpZGUgLSAyOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaWRlOyBpKyspCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKLSAgICAgICAgICAgICAgICB0bXBbaipzdHJpZGUraV0gPSBYW29yZGVyeVtpXSpOMCtqXTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaWRlOyBpKyspCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKLSAgICAgICAgICAgICAgICB0bXBbaipzdHJpZGUraV0gPSBYW2kqTjAral07Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKLSAgICAgICAgWFtpXSA9IHRtcFtpXTsKLX0KLQotc3RhdGljIHZvaWQgY2VsdF9kZWludGVybGVhdmVfaGFkYW1hcmQoZmxvYXQgKnRtcCwgZmxvYXQgKlgsIGludCBOMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoYWRhbWFyZCkKLXsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgTiA9IE4wKnN0cmlkZTsKLQotICAgIGlmIChoYWRhbWFyZCkgewotICAgICAgICBjb25zdCB1aW50OF90ICpvcmRlcnkgPSBjZWx0X2hhZGFtYXJkX29yZGVyeSArIHN0cmlkZSAtIDI7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpZGU7IGkrKykKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBOMDsgaisrKQotICAgICAgICAgICAgICAgIHRtcFtvcmRlcnlbaV0qTjAral0gPSBYW2oqc3RyaWRlK2ldOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdHJpZGU7IGkrKykKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBOMDsgaisrKQotICAgICAgICAgICAgICAgIHRtcFtpKk4wK2pdID0gWFtqKnN0cmlkZStpXTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQotICAgICAgICBYW2ldID0gdG1wW2ldOwotfQotCi1zdGF0aWMgdm9pZCBjZWx0X2hhYXIxKGZsb2F0ICpYLCBpbnQgTjAsIGludCBzdHJpZGUpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgTjAgPj49IDE7Ci0gICAgZm9yIChpID0gMDsgaSA8IHN0cmlkZTsgaSsrKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBOMDsgaisrKSB7Ci0gICAgICAgICAgICBmbG9hdCB4MCA9IFhbc3RyaWRlICogKDIgKiBqICsgMCkgKyBpXTsKLSAgICAgICAgICAgIGZsb2F0IHgxID0gWFtzdHJpZGUgKiAoMiAqIGogKyAxKSArIGldOwotICAgICAgICAgICAgWFtzdHJpZGUgKiAoMiAqIGogKyAwKSArIGldID0gKHgwICsgeDEpICogTV9TUVJUMV8yOwotICAgICAgICAgICAgWFtzdHJpZGUgKiAoMiAqIGogKyAxKSArIGldID0gKHgwIC0geDEpICogTV9TUVJUMV8yOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGludCBjZWx0X2NvbXB1dGVfcW4oaW50IE4sIGludCBiLCBpbnQgb2Zmc2V0LCBpbnQgcHVsc2VfY2FwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdWFsc3RlcmVvKQotewotICAgIGludCBxbiwgcWI7Ci0gICAgaW50IE4yID0gMiAqIE4gLSAxOwotICAgIGlmIChkdWFsc3RlcmVvICYmIE4gPT0gMikKLSAgICAgICAgTjItLTsKLQotICAgIC8qIFRoZSB1cHBlciBsaW1pdCBlbnN1cmVzIHRoYXQgaW4gYSBzdGVyZW8gc3BsaXQgd2l0aCBpdGhldGE9PTE2Mzg0LCB3ZSdsbAotICAgICAqIGFsd2F5cyBoYXZlIGVub3VnaCBiaXRzIGxlZnQgb3ZlciB0byBjb2RlIGF0IGxlYXN0IG9uZSBwdWxzZSBpbiB0aGUKLSAgICAgKiBzaWRlOyBvdGhlcndpc2UgaXQgd291bGQgY29sbGFwc2UsIHNpbmNlIGl0IGRvZXNuJ3QgZ2V0IGZvbGRlZC4gKi8KLSAgICBxYiA9IEZGTUlOMyhiIC0gcHVsc2VfY2FwIC0gKDQgPDwgMyksIChiICsgTjIgKiBvZmZzZXQpIC8gTjIsIDggPDwgMyk7Ci0gICAgcW4gPSAocWIgPCAoMSA8PCAzID4+IDEpKSA/IDEgOiAoKGNlbHRfcW5fZXhwMltxYiAmIDB4N10gPj4gKDE0IC0gKHFiID4+IDMpKSkgKyAxKSA+PiAxIDw8IDE7Ci0gICAgcmV0dXJuIHFuOwotfQotCi0vLyB0aGlzIGNvZGUgd2FzIGFkYXB0ZWQgZnJvbSBsaWJvcHVzCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IGNlbHRfY3dyc2kodW5zaWduZWQgaW50IE4sIHVuc2lnbmVkIGludCBLLCB1bnNpZ25lZCBpbnQgaSwgaW50ICp5KQotewotICAgIHVpbnQ2NF90IG5vcm0gPSAwOwotICAgIHVpbnQzMl90IHA7Ci0gICAgaW50IHMsIHZhbDsKLSAgICBpbnQgazA7Ci0KLSAgICB3aGlsZSAoTiA+IDIpIHsKLSAgICAgICAgdWludDMyX3QgcTsKLQotICAgICAgICAvKkxvdHMgb2YgcHVsc2VzIGNhc2U6Ki8KLSAgICAgICAgaWYgKEsgPj0gTikgewotICAgICAgICAgICAgY29uc3QgdWludDMyX3QgKnJvdyA9IGNlbHRfcHZxX3Vfcm93W05dOwotCi0gICAgICAgICAgICAvKiBBcmUgdGhlIHB1bHNlcyBpbiB0aGlzIGRpbWVuc2lvbiBuZWdhdGl2ZT8gKi8KLSAgICAgICAgICAgIHAgID0gcm93W0sgKyAxXTsKLSAgICAgICAgICAgIHMgID0gLShpID49IHApOwotICAgICAgICAgICAgaSAtPSBwICYgczsKLQotICAgICAgICAgICAgLypDb3VudCBob3cgbWFueSBwdWxzZXMgd2VyZSBwbGFjZWQgaW4gdGhpcyBkaW1lbnNpb24uKi8KLSAgICAgICAgICAgIGswID0gSzsKLSAgICAgICAgICAgIHEgPSByb3dbTl07Ci0gICAgICAgICAgICBpZiAocSA+IGkpIHsKLSAgICAgICAgICAgICAgICBLID0gTjsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIHAgPSBjZWx0X3B2cV91X3Jvd1stLUtdW05dOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKHAgPiBpKTsKLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGZvciAocCA9IHJvd1tLXTsgcCA+IGk7IHAgPSByb3dbS10pCi0gICAgICAgICAgICAgICAgICAgIEstLTsKLQotICAgICAgICAgICAgaSAgICAtPSBwOwotICAgICAgICAgICAgdmFsICAgPSAoazAgLSBLICsgcykgXiBzOwotICAgICAgICAgICAgbm9ybSArPSB2YWwgKiB2YWw7Ci0gICAgICAgICAgICAqeSsrICA9IHZhbDsKLSAgICAgICAgfSBlbHNlIHsgLypMb3RzIG9mIGRpbWVuc2lvbnMgY2FzZToqLwotICAgICAgICAgICAgLypBcmUgdGhlcmUgYW55IHB1bHNlcyBpbiB0aGlzIGRpbWVuc2lvbiBhdCBhbGw/Ki8KLSAgICAgICAgICAgIHAgPSBjZWx0X3B2cV91X3Jvd1tLICAgIF1bTl07Ci0gICAgICAgICAgICBxID0gY2VsdF9wdnFfdV9yb3dbSyArIDFdW05dOwotCi0gICAgICAgICAgICBpZiAocCA8PSBpICYmIGkgPCBxKSB7Ci0gICAgICAgICAgICAgICAgaSAtPSBwOwotICAgICAgICAgICAgICAgICp5KysgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKkFyZSB0aGUgcHVsc2VzIGluIHRoaXMgZGltZW5zaW9uIG5lZ2F0aXZlPyovCi0gICAgICAgICAgICAgICAgcyAgPSAtKGkgPj0gcSk7Ci0gICAgICAgICAgICAgICAgaSAtPSBxICYgczsKLQotICAgICAgICAgICAgICAgIC8qQ291bnQgaG93IG1hbnkgcHVsc2VzIHdlcmUgcGxhY2VkIGluIHRoaXMgZGltZW5zaW9uLiovCi0gICAgICAgICAgICAgICAgazAgPSBLOwotICAgICAgICAgICAgICAgIGRvIHAgPSBjZWx0X3B2cV91X3Jvd1stLUtdW05dOwotICAgICAgICAgICAgICAgIHdoaWxlIChwID4gaSk7Ci0KLSAgICAgICAgICAgICAgICBpICAgIC09IHA7Ci0gICAgICAgICAgICAgICAgdmFsICAgPSAoazAgLSBLICsgcykgXiBzOwotICAgICAgICAgICAgICAgIG5vcm0gKz0gdmFsICogdmFsOwotICAgICAgICAgICAgICAgICp5KysgID0gdmFsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE4tLTsKLSAgICB9Ci0KLSAgICAvKiBOID09IDIgKi8KLSAgICBwICA9IDIgKiBLICsgMTsKLSAgICBzICA9IC0oaSA+PSBwKTsKLSAgICBpIC09IHAgJiBzOwotICAgIGswID0gSzsKLSAgICBLICA9IChpICsgMSkgLyAyOwotCi0gICAgaWYgKEspCi0gICAgICAgIGkgLT0gMiAqIEsgLSAxOwotCi0gICAgdmFsICAgPSAoazAgLSBLICsgcykgXiBzOwotICAgIG5vcm0gKz0gdmFsICogdmFsOwotICAgICp5KysgID0gdmFsOwotCi0gICAgLyogTj09MSAqLwotICAgIHMgICAgID0gLWk7Ci0gICAgdmFsICAgPSAoSyArIHMpIF4gczsKLSAgICBub3JtICs9IHZhbCAqIHZhbDsKLSAgICAqeSAgICA9IHZhbDsKLQotICAgIHJldHVybiBub3JtOwotfQotCi1zdGF0aWMgaW5saW5lIGZsb2F0IGNlbHRfZGVjb2RlX3B1bHNlcyhPcHVzUmFuZ2VDb2RlciAqcmMsIGludCAqeSwgdW5zaWduZWQgaW50IE4sIHVuc2lnbmVkIGludCBLKQotewotICAgIHVuc2lnbmVkIGludCBpZHg7Ci0jZGVmaW5lIENFTFRfUFZRX1UobiwgaykgKGNlbHRfcHZxX3Vfcm93W0ZGTUlOKG4sIGspXVtGRk1BWChuLCBrKV0pCi0jZGVmaW5lIENFTFRfUFZRX1YobiwgaykgKENFTFRfUFZRX1UobiwgaykgKyBDRUxUX1BWUV9VKG4sIChrKSArIDEpKQotICAgIGlkeCA9IG9wdXNfcmNfdW5pbW9kZWwocmMsIENFTFRfUFZRX1YoTiwgSykpOwotICAgIHJldHVybiBjZWx0X2N3cnNpKE4sIEssIGlkeCwgeSk7Ci19Ci0KLS8qKiBEZWNvZGUgcHVsc2UgdmVjdG9yIGFuZCBjb21iaW5lIHRoZSByZXN1bHQgd2l0aCB0aGUgcGl0Y2ggdmVjdG9yIHRvIHByb2R1Y2UKLSAgICB0aGUgZmluYWwgbm9ybWFsaXNlZCBzaWduYWwgaW4gdGhlIGN1cnJlbnQgYmFuZC4gKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNlbHRfYWxnX3VucXVhbnQoT3B1c1JhbmdlQ29kZXIgKnJjLCBmbG9hdCAqWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IE4sIHVuc2lnbmVkIGludCBLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENlbHRTcHJlYWQgc3ByZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tzLCBmbG9hdCBnYWluKQotewotICAgIGludCB5WzE3Nl07Ci0KLSAgICBnYWluIC89IHNxcnRmKGNlbHRfZGVjb2RlX3B1bHNlcyhyYywgeSwgTiwgSykpOwotICAgIGNlbHRfbm9ybWFsaXplX3Jlc2lkdWFsKHksIFgsIE4sIGdhaW4pOwotICAgIGNlbHRfZXhwX3JvdGF0aW9uKFgsIE4sIGJsb2NrcywgSywgc3ByZWFkKTsKLSAgICByZXR1cm4gY2VsdF9leHRyYWN0X2NvbGxhcHNlX21hc2soeSwgTiwgYmxvY2tzKTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjZWx0X2RlY29kZV9iYW5kKENlbHRDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhbmQsIGZsb2F0ICpYLCBmbG9hdCAqWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTiwgaW50IGIsIHVuc2lnbmVkIGludCBibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmxvd2JhbmQsIGludCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbG93YmFuZF9vdXQsIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBnYWluLCBmbG9hdCAqbG93YmFuZF9zY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsKQotewotICAgIGNvbnN0IHVpbnQ4X3QgKmNhY2hlOwotICAgIGludCBkdWFsc3RlcmVvLCBzcGxpdDsKLSAgICBpbnQgaW1pZCA9IDAsIGlzaWRlID0gMDsKLSAgICB1bnNpZ25lZCBpbnQgTjAgPSBOOwotICAgIGludCBOX0I7Ci0gICAgaW50IE5fQjA7Ci0gICAgaW50IEIwID0gYmxvY2tzOwotICAgIGludCB0aW1lX2RpdmlkZSA9IDA7Ci0gICAgaW50IHJlY29tYmluZSA9IDA7Ci0gICAgaW50IGludiA9IDA7Ci0gICAgZmxvYXQgbWlkID0gMCwgc2lkZSA9IDA7Ci0gICAgaW50IGxvbmdibG9ja3MgPSAoQjAgPT0gMSk7Ci0gICAgdW5zaWduZWQgaW50IGNtID0gMDsKLQotICAgIE5fQjAgPSBOX0IgPSBOIC8gYmxvY2tzOwotICAgIHNwbGl0ID0gZHVhbHN0ZXJlbyA9IChZICE9IE5VTEwpOwotCi0gICAgaWYgKE4gPT0gMSkgewotICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIG9uZSBzYW1wbGUgKi8KLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGZsb2F0ICp4ID0gWDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8PSBkdWFsc3RlcmVvOyBpKyspIHsKLSAgICAgICAgICAgIGludCBzaWduID0gMDsKLSAgICAgICAgICAgIGlmIChzLT5yZW1haW5pbmcyID49IDE8PDMpIHsKLSAgICAgICAgICAgICAgICBzaWduICAgICAgICAgICA9IG9wdXNfZ2V0cmF3Yml0cyhyYywgMSk7Ci0gICAgICAgICAgICAgICAgcy0+cmVtYWluaW5nMiAtPSAxIDw8IDM7Ci0gICAgICAgICAgICAgICAgYiAgICAgICAgICAgICAtPSAxIDw8IDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB4WzBdID0gc2lnbiA/IC0xLjBmIDogMS4wZjsKLSAgICAgICAgICAgIHggPSBZOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsb3diYW5kX291dCkKLSAgICAgICAgICAgIGxvd2JhbmRfb3V0WzBdID0gWFswXTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKCFkdWFsc3RlcmVvICYmIGxldmVsID09IDApIHsKLSAgICAgICAgaW50IHRmX2NoYW5nZSA9IHMtPnRmX2NoYW5nZVtiYW5kXTsKLSAgICAgICAgaW50IGs7Ci0gICAgICAgIGlmICh0Zl9jaGFuZ2UgPiAwKQotICAgICAgICAgICAgcmVjb21iaW5lID0gdGZfY2hhbmdlOwotICAgICAgICAvKiBCYW5kIHJlY29tYmluaW5nIHRvIGluY3JlYXNlIGZyZXF1ZW5jeSByZXNvbHV0aW9uICovCi0KLSAgICAgICAgaWYgKGxvd2JhbmQgJiYKLSAgICAgICAgICAgIChyZWNvbWJpbmUgfHwgKChOX0IgJiAxKSA9PSAwICYmIHRmX2NoYW5nZSA8IDApIHx8IEIwID4gMSkpIHsKLSAgICAgICAgICAgIGludCBqOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykKLSAgICAgICAgICAgICAgICBsb3diYW5kX3NjcmF0Y2hbal0gPSBsb3diYW5kW2pdOwotICAgICAgICAgICAgbG93YmFuZCA9IGxvd2JhbmRfc2NyYXRjaDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoayA9IDA7IGsgPCByZWNvbWJpbmU7IGsrKykgewotICAgICAgICAgICAgaWYgKGxvd2JhbmQpCi0gICAgICAgICAgICAgICAgY2VsdF9oYWFyMShsb3diYW5kLCBOID4+IGssIDEgPDwgayk7Ci0gICAgICAgICAgICBmaWxsID0gY2VsdF9iaXRfaW50ZXJsZWF2ZVtmaWxsICYgMHhGXSB8IGNlbHRfYml0X2ludGVybGVhdmVbZmlsbCA+PiA0XSA8PCAyOwotICAgICAgICB9Ci0gICAgICAgIGJsb2NrcyA+Pj0gcmVjb21iaW5lOwotICAgICAgICBOX0IgPDw9IHJlY29tYmluZTsKLQotICAgICAgICAvKiBJbmNyZWFzaW5nIHRoZSB0aW1lIHJlc29sdXRpb24gKi8KLSAgICAgICAgd2hpbGUgKChOX0IgJiAxKSA9PSAwICYmIHRmX2NoYW5nZSA8IDApIHsKLSAgICAgICAgICAgIGlmIChsb3diYW5kKQotICAgICAgICAgICAgICAgIGNlbHRfaGFhcjEobG93YmFuZCwgTl9CLCBibG9ja3MpOwotICAgICAgICAgICAgZmlsbCB8PSBmaWxsIDw8IGJsb2NrczsKLSAgICAgICAgICAgIGJsb2NrcyA8PD0gMTsKLSAgICAgICAgICAgIE5fQiA+Pj0gMTsKLSAgICAgICAgICAgIHRpbWVfZGl2aWRlKys7Ci0gICAgICAgICAgICB0Zl9jaGFuZ2UrKzsKLSAgICAgICAgfQotICAgICAgICBCMCA9IGJsb2NrczsKLSAgICAgICAgTl9CMCA9IE5fQjsKLQotICAgICAgICAvKiBSZW9yZ2FuaXplIHRoZSBzYW1wbGVzIGluIHRpbWUgb3JkZXIgaW5zdGVhZCBvZiBmcmVxdWVuY3kgb3JkZXIgKi8KLSAgICAgICAgaWYgKEIwID4gMSAmJiBsb3diYW5kKQotICAgICAgICAgICAgY2VsdF9kZWludGVybGVhdmVfaGFkYW1hcmQocy0+c2NyYXRjaCwgbG93YmFuZCwgTl9CID4+IHJlY29tYmluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIwIDw8IHJlY29tYmluZSwgbG9uZ2Jsb2Nrcyk7Ci0gICAgfQotCi0gICAgLyogSWYgd2UgbmVlZCAxLjUgbW9yZSBiaXQgdGhhbiB3ZSBjYW4gcHJvZHVjZSwgc3BsaXQgdGhlIGJhbmQgaW4gdHdvLiAqLwotICAgIGNhY2hlID0gY2VsdF9jYWNoZV9iaXRzICsKLSAgICAgICAgICAgIGNlbHRfY2FjaGVfaW5kZXhbKGR1cmF0aW9uICsgMSkgKiBDRUxUX01BWF9CQU5EUyArIGJhbmRdOwotICAgIGlmICghZHVhbHN0ZXJlbyAmJiBkdXJhdGlvbiA+PSAwICYmIGIgPiBjYWNoZVtjYWNoZVswXV0gKyAxMiAmJiBOID4gMikgewotICAgICAgICBOID4+PSAxOwotICAgICAgICBZID0gWCArIE47Ci0gICAgICAgIHNwbGl0ID0gMTsKLSAgICAgICAgZHVyYXRpb24gLT0gMTsKLSAgICAgICAgaWYgKGJsb2NrcyA9PSAxKQotICAgICAgICAgICAgZmlsbCA9IChmaWxsICYgMSkgfCAoZmlsbCA8PCAxKTsKLSAgICAgICAgYmxvY2tzID0gKGJsb2NrcyArIDEpID4+IDE7Ci0gICAgfQotCi0gICAgaWYgKHNwbGl0KSB7Ci0gICAgICAgIGludCBxbjsKLSAgICAgICAgaW50IGl0aGV0YSA9IDA7Ci0gICAgICAgIGludCBtYml0cywgc2JpdHMsIGRlbHRhOwotICAgICAgICBpbnQgcWFsbG9jOwotICAgICAgICBpbnQgcHVsc2VfY2FwOwotICAgICAgICBpbnQgb2Zmc2V0OwotICAgICAgICBpbnQgb3JpZ19maWxsOwotICAgICAgICBpbnQgdGVsbDsKLQotICAgICAgICAvKiBEZWNpZGUgb24gdGhlIHJlc29sdXRpb24gdG8gZ2l2ZSB0byB0aGUgc3BsaXQgcGFyYW1ldGVyIHRoZXRhICovCi0gICAgICAgIHB1bHNlX2NhcCA9IGNlbHRfbG9nX2ZyZXFfcmFuZ2VbYmFuZF0gKyBkdXJhdGlvbiAqIDg7Ci0gICAgICAgIG9mZnNldCA9IChwdWxzZV9jYXAgPj4gMSkgLSAoZHVhbHN0ZXJlbyAmJiBOID09IDIgPyBDRUxUX1FUSEVUQV9PRkZTRVRfVFdPUEhBU0UgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFTFRfUVRIRVRBX09GRlNFVCk7Ci0gICAgICAgIHFuID0gKGR1YWxzdGVyZW8gJiYgYmFuZCA+PSBzLT5pbnRlbnNpdHlzdGVyZW8pID8gMSA6Ci0gICAgICAgICAgICAgY2VsdF9jb21wdXRlX3FuKE4sIGIsIG9mZnNldCwgcHVsc2VfY2FwLCBkdWFsc3RlcmVvKTsKLSAgICAgICAgdGVsbCA9IG9wdXNfcmNfdGVsbF9mcmFjKHJjKTsKLSAgICAgICAgaWYgKHFuICE9IDEpIHsKLSAgICAgICAgICAgIC8qIEVudHJvcHkgY29kaW5nIG9mIHRoZSBhbmdsZS4gV2UgdXNlIGEgdW5pZm9ybSBwZGYgZm9yIHRoZQotICAgICAgICAgICAgdGltZSBzcGxpdCwgYSBzdGVwIGZvciBzdGVyZW8sIGFuZCBhIHRyaWFuZ3VsYXIgb25lIGZvciB0aGUgcmVzdC4gKi8KLSAgICAgICAgICAgIGlmIChkdWFsc3RlcmVvICYmIE4gPiAyKQotICAgICAgICAgICAgICAgIGl0aGV0YSA9IG9wdXNfcmNfc3RlcG1vZGVsKHJjLCBxbi8yKTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGR1YWxzdGVyZW8gfHwgQjAgPiAxKQotICAgICAgICAgICAgICAgIGl0aGV0YSA9IG9wdXNfcmNfdW5pbW9kZWwocmMsIHFuKzEpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGl0aGV0YSA9IG9wdXNfcmNfdHJpbW9kZWwocmMsIHFuKTsKLSAgICAgICAgICAgIGl0aGV0YSA9IGl0aGV0YSAqIDE2Mzg0IC8gcW47Ci0gICAgICAgICAgICAvKiBOT1RFOiBSZW5vcm1hbGlzaW5nIFggYW5kIFkgKm1heSogaGVscCBmaXhlZC1wb2ludCBhIGJpdCBhdCB2ZXJ5IGhpZ2ggcmF0ZS4KLSAgICAgICAgICAgIExldCdzIGRvIHRoYXQgYXQgaGlnaGVyIGNvbXBsZXhpdHkgKi8KLSAgICAgICAgfSBlbHNlIGlmIChkdWFsc3RlcmVvKSB7Ci0gICAgICAgICAgICBpbnYgPSAoYiA+IDIgPDwgMyAmJiBzLT5yZW1haW5pbmcyID4gMiA8PCAzKSA/IG9wdXNfcmNfcDJtb2RlbChyYywgMikgOiAwOwotICAgICAgICAgICAgaXRoZXRhID0gMDsKLSAgICAgICAgfQotICAgICAgICBxYWxsb2MgPSBvcHVzX3JjX3RlbGxfZnJhYyhyYykgLSB0ZWxsOwotICAgICAgICBiIC09IHFhbGxvYzsKLQotICAgICAgICBvcmlnX2ZpbGwgPSBmaWxsOwotICAgICAgICBpZiAoaXRoZXRhID09IDApIHsKLSAgICAgICAgICAgIGltaWQgPSAzMjc2NzsKLSAgICAgICAgICAgIGlzaWRlID0gMDsKLSAgICAgICAgICAgIGZpbGwgPSBhdl9tb2RfdWludHAyKGZpbGwsIGJsb2Nrcyk7Ci0gICAgICAgICAgICBkZWx0YSA9IC0xNjM4NDsKLSAgICAgICAgfSBlbHNlIGlmIChpdGhldGEgPT0gMTYzODQpIHsKLSAgICAgICAgICAgIGltaWQgPSAwOwotICAgICAgICAgICAgaXNpZGUgPSAzMjc2NzsKLSAgICAgICAgICAgIGZpbGwgJj0gKCgxIDw8IGJsb2NrcykgLSAxKSA8PCBibG9ja3M7Ci0gICAgICAgICAgICBkZWx0YSA9IDE2Mzg0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW1pZCA9IGNlbHRfY29zKGl0aGV0YSk7Ci0gICAgICAgICAgICBpc2lkZSA9IGNlbHRfY29zKDE2Mzg0LWl0aGV0YSk7Ci0gICAgICAgICAgICAvKiBUaGlzIGlzIHRoZSBtaWQgdnMgc2lkZSBhbGxvY2F0aW9uIHRoYXQgbWluaW1pemVzIHNxdWFyZWQgZXJyb3IKLSAgICAgICAgICAgIGluIHRoYXQgYmFuZC4gKi8KLSAgICAgICAgICAgIGRlbHRhID0gUk9VTkRfTVVMMTYoKE4gLSAxKSA8PCA3LCBjZWx0X2xvZzJ0YW4oaXNpZGUsIGltaWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1pZCAgPSBpbWlkICAvIDMyNzY4LjBmOwotICAgICAgICBzaWRlID0gaXNpZGUgLyAzMjc2OC4wZjsKLQotICAgICAgICAvKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIGZvciBOPTIgdGhhdCBvbmx5IHdvcmtzIGZvciBzdGVyZW8gYW5kIHRha2VzCi0gICAgICAgIGFkdmFudGFnZSBvZiB0aGUgZmFjdCB0aGF0IG1pZCBhbmQgc2lkZSBhcmUgb3J0aG9nb25hbCB0byBlbmNvZGUKLSAgICAgICAgdGhlIHNpZGUgd2l0aCBqdXN0IG9uZSBiaXQuICovCi0gICAgICAgIGlmIChOID09IDIgJiYgZHVhbHN0ZXJlbykgewotICAgICAgICAgICAgaW50IGM7Ci0gICAgICAgICAgICBpbnQgc2lnbiA9IDA7Ci0gICAgICAgICAgICBmbG9hdCB0bXA7Ci0gICAgICAgICAgICBmbG9hdCAqeDIsICp5MjsKLSAgICAgICAgICAgIG1iaXRzID0gYjsKLSAgICAgICAgICAgIC8qIE9ubHkgbmVlZCBvbmUgYml0IGZvciB0aGUgc2lkZSAqLwotICAgICAgICAgICAgc2JpdHMgPSAoaXRoZXRhICE9IDAgJiYgaXRoZXRhICE9IDE2Mzg0KSA/IDEgPDwgMyA6IDA7Ci0gICAgICAgICAgICBtYml0cyAtPSBzYml0czsKLSAgICAgICAgICAgIGMgPSAoaXRoZXRhID4gODE5Mik7Ci0gICAgICAgICAgICBzLT5yZW1haW5pbmcyIC09IHFhbGxvYytzYml0czsKLQotICAgICAgICAgICAgeDIgPSBjID8gWSA6IFg7Ci0gICAgICAgICAgICB5MiA9IGMgPyBYIDogWTsKLSAgICAgICAgICAgIGlmIChzYml0cykKLSAgICAgICAgICAgICAgICBzaWduID0gb3B1c19nZXRyYXdiaXRzKHJjLCAxKTsKLSAgICAgICAgICAgIHNpZ24gPSAxIC0gMiAqIHNpZ247Ci0gICAgICAgICAgICAvKiBXZSB1c2Ugb3JpZ19maWxsIGhlcmUgYmVjYXVzZSB3ZSB3YW50IHRvIGZvbGQgdGhlIHNpZGUsIGJ1dCBpZgotICAgICAgICAgICAgaXRoZXRhPT0xNjM4NCwgd2UnbGwgaGF2ZSBjbGVhcmVkIHRoZSBsb3cgYml0cyBvZiBmaWxsLiAqLwotICAgICAgICAgICAgY20gPSBjZWx0X2RlY29kZV9iYW5kKHMsIHJjLCBiYW5kLCB4MiwgTlVMTCwgTiwgbWJpdHMsIGJsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kLCBkdXJhdGlvbiwgbG93YmFuZF9vdXQsIGxldmVsLCBnYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmRfc2NyYXRjaCwgb3JpZ19maWxsKTsKLSAgICAgICAgICAgIC8qIFdlIGRvbid0IHNwbGl0IE49MiBiYW5kcywgc28gY20gaXMgZWl0aGVyIDEgb3IgMCAoZm9yIGEgZm9sZC1jb2xsYXBzZSksCi0gICAgICAgICAgICBhbmQgdGhlcmUncyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IG1peGluZyB3aXRoIHRoZSBvdGhlciBjaGFubmVsLiAqLwotICAgICAgICAgICAgeTJbMF0gPSAtc2lnbiAqIHgyWzFdOwotICAgICAgICAgICAgeTJbMV0gPSAgc2lnbiAqIHgyWzBdOwotICAgICAgICAgICAgWFswXSAqPSBtaWQ7Ci0gICAgICAgICAgICBYWzFdICo9IG1pZDsKLSAgICAgICAgICAgIFlbMF0gKj0gc2lkZTsKLSAgICAgICAgICAgIFlbMV0gKj0gc2lkZTsKLSAgICAgICAgICAgIHRtcCA9IFhbMF07Ci0gICAgICAgICAgICBYWzBdID0gdG1wIC0gWVswXTsKLSAgICAgICAgICAgIFlbMF0gPSB0bXAgKyBZWzBdOwotICAgICAgICAgICAgdG1wID0gWFsxXTsKLSAgICAgICAgICAgIFhbMV0gPSB0bXAgLSBZWzFdOwotICAgICAgICAgICAgWVsxXSA9IHRtcCArIFlbMV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiAiTm9ybWFsIiBzcGxpdCBjb2RlICovCi0gICAgICAgICAgICBmbG9hdCAqbmV4dF9sb3diYW5kMiAgICAgPSBOVUxMOwotICAgICAgICAgICAgZmxvYXQgKm5leHRfbG93YmFuZF9vdXQxID0gTlVMTDsKLSAgICAgICAgICAgIGludCBuZXh0X2xldmVsID0gMDsKLSAgICAgICAgICAgIGludCByZWJhbGFuY2U7Ci0KLSAgICAgICAgICAgIC8qIEdpdmUgbW9yZSBiaXRzIHRvIGxvdy1lbmVyZ3kgTURDVHMgdGhhbiB0aGV5IHdvdWxkCi0gICAgICAgICAgICAgKiBvdGhlcndpc2UgZGVzZXJ2ZSAqLwotICAgICAgICAgICAgaWYgKEIwID4gMSAmJiAhZHVhbHN0ZXJlbyAmJiAoaXRoZXRhICYgMHgzZmZmKSkgewotICAgICAgICAgICAgICAgIGlmIChpdGhldGEgPiA4MTkyKQotICAgICAgICAgICAgICAgICAgICAvKiBSb3VnaCBhcHByb3hpbWF0aW9uIGZvciBwcmUtZWNobyBtYXNraW5nICovCi0gICAgICAgICAgICAgICAgICAgIGRlbHRhIC09IGRlbHRhID4+ICg0IC0gZHVyYXRpb24pOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgLyogQ29ycmVzcG9uZHMgdG8gYSBmb3J3YXJkLW1hc2tpbmcgc2xvcGUgb2YKLSAgICAgICAgICAgICAgICAgICAgICogMS41IGRCIHBlciAxMCBtcyAqLwotICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IEZGTUlOKDAsIGRlbHRhICsgKE4gPDwgMyA+PiAoNSAtIGR1cmF0aW9uKSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWJpdHMgPSBhdl9jbGlwKChiIC0gZGVsdGEpIC8gMiwgMCwgYik7Ci0gICAgICAgICAgICBzYml0cyA9IGIgLSBtYml0czsKLSAgICAgICAgICAgIHMtPnJlbWFpbmluZzIgLT0gcWFsbG9jOwotCi0gICAgICAgICAgICBpZiAobG93YmFuZCAmJiAhZHVhbHN0ZXJlbykKLSAgICAgICAgICAgICAgICBuZXh0X2xvd2JhbmQyID0gbG93YmFuZCArIE47IC8qID4zMi1iaXQgc3BsaXQgY2FzZSAqLwotCi0gICAgICAgICAgICAvKiBPbmx5IHN0ZXJlbyBuZWVkcyB0byBwYXNzIG9uIGxvd2JhbmRfb3V0LgotICAgICAgICAgICAgICogT3RoZXJ3aXNlLCBpdCdzIGhhbmRsZWQgYXQgdGhlIGVuZCAqLwotICAgICAgICAgICAgaWYgKGR1YWxzdGVyZW8pCi0gICAgICAgICAgICAgICAgbmV4dF9sb3diYW5kX291dDEgPSBsb3diYW5kX291dDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBuZXh0X2xldmVsID0gbGV2ZWwgKyAxOwotCi0gICAgICAgICAgICByZWJhbGFuY2UgPSBzLT5yZW1haW5pbmcyOwotICAgICAgICAgICAgaWYgKG1iaXRzID49IHNiaXRzKSB7Ci0gICAgICAgICAgICAgICAgLyogSW4gc3RlcmVvIG1vZGUsIHdlIGRvIG5vdCBhcHBseSBhIHNjYWxpbmcgdG8gdGhlIG1pZAotICAgICAgICAgICAgICAgICAqIGJlY2F1c2Ugd2UgbmVlZCB0aGUgbm9ybWFsaXplZCBtaWQgZm9yIGZvbGRpbmcgbGF0ZXIgKi8KLSAgICAgICAgICAgICAgICBjbSA9IGNlbHRfZGVjb2RlX2JhbmQocywgcmMsIGJhbmQsIFgsIE5VTEwsIE4sIG1iaXRzLCBibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmQsIGR1cmF0aW9uLCBuZXh0X2xvd2JhbmRfb3V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9sZXZlbCwgZHVhbHN0ZXJlbyA/IDEuMGYgOiAoZ2FpbiAqIG1pZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmRfc2NyYXRjaCwgZmlsbCk7Ci0KLSAgICAgICAgICAgICAgICByZWJhbGFuY2UgPSBtYml0cyAtIChyZWJhbGFuY2UgLSBzLT5yZW1haW5pbmcyKTsKLSAgICAgICAgICAgICAgICBpZiAocmViYWxhbmNlID4gMyA8PCAzICYmIGl0aGV0YSAhPSAwKQotICAgICAgICAgICAgICAgICAgICBzYml0cyArPSByZWJhbGFuY2UgLSAoMyA8PCAzKTsKLQotICAgICAgICAgICAgICAgIC8qIEZvciBhIHN0ZXJlbyBzcGxpdCwgdGhlIGhpZ2ggYml0cyBvZiBmaWxsIGFyZSBhbHdheXMgemVybywKLSAgICAgICAgICAgICAgICAgKiBzbyBubyBmb2xkaW5nIHdpbGwgYmUgZG9uZSB0byB0aGUgc2lkZS4gKi8KLSAgICAgICAgICAgICAgICBjbSB8PSBjZWx0X2RlY29kZV9iYW5kKHMsIHJjLCBiYW5kLCBZLCBOVUxMLCBOLCBzYml0cywgYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dF9sb3diYW5kMiwgZHVyYXRpb24sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xldmVsLCBnYWluICogc2lkZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPj4gYmxvY2tzKSA8PCAoKEIwID4+IDEpICYgKGR1YWxzdGVyZW8gLSAxKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8qIEZvciBhIHN0ZXJlbyBzcGxpdCwgdGhlIGhpZ2ggYml0cyBvZiBmaWxsIGFyZSBhbHdheXMgemVybywKLSAgICAgICAgICAgICAgICAgKiBzbyBubyBmb2xkaW5nIHdpbGwgYmUgZG9uZSB0byB0aGUgc2lkZS4gKi8KLSAgICAgICAgICAgICAgICBjbSA9IGNlbHRfZGVjb2RlX2JhbmQocywgcmMsIGJhbmQsIFksIE5VTEwsIE4sIHNiaXRzLCBibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfbG93YmFuZDIsIGR1cmF0aW9uLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xldmVsLCBnYWluICogc2lkZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA+PiBibG9ja3MpIDw8ICgoQjAgPj4gMSkgJiAoZHVhbHN0ZXJlbyAtIDEpKTsKLQotICAgICAgICAgICAgICAgIHJlYmFsYW5jZSA9IHNiaXRzIC0gKHJlYmFsYW5jZSAtIHMtPnJlbWFpbmluZzIpOwotICAgICAgICAgICAgICAgIGlmIChyZWJhbGFuY2UgPiAzIDw8IDMgJiYgaXRoZXRhICE9IDE2Mzg0KQotICAgICAgICAgICAgICAgICAgICBtYml0cyArPSByZWJhbGFuY2UgLSAoMyA8PCAzKTsKLQotICAgICAgICAgICAgICAgIC8qIEluIHN0ZXJlbyBtb2RlLCB3ZSBkbyBub3QgYXBwbHkgYSBzY2FsaW5nIHRvIHRoZSBtaWQgYmVjYXVzZQotICAgICAgICAgICAgICAgICAqIHdlIG5lZWQgdGhlIG5vcm1hbGl6ZWQgbWlkIGZvciBmb2xkaW5nIGxhdGVyICovCi0gICAgICAgICAgICAgICAgY20gfD0gY2VsdF9kZWNvZGVfYmFuZChzLCByYywgYmFuZCwgWCwgTlVMTCwgTiwgbWJpdHMsIGJsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmQsIGR1cmF0aW9uLCBuZXh0X2xvd2JhbmRfb3V0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfbGV2ZWwsIGR1YWxzdGVyZW8gPyAxLjBmIDogKGdhaW4gKiBtaWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93YmFuZF9zY3JhdGNoLCBmaWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFRoaXMgaXMgdGhlIGJhc2ljIG5vLXNwbGl0IGNhc2UgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IHEgICAgICAgICA9IGNlbHRfYml0czJwdWxzZXMoY2FjaGUsIGIpOwotICAgICAgICB1bnNpZ25lZCBpbnQgY3Vycl9iaXRzID0gY2VsdF9wdWxzZXMyYml0cyhjYWNoZSwgcSk7Ci0gICAgICAgIHMtPnJlbWFpbmluZzIgLT0gY3Vycl9iaXRzOwotCi0gICAgICAgIC8qIEVuc3VyZXMgd2UgY2FuIG5ldmVyIGJ1c3QgdGhlIGJ1ZGdldCAqLwotICAgICAgICB3aGlsZSAocy0+cmVtYWluaW5nMiA8IDAgJiYgcSA+IDApIHsKLSAgICAgICAgICAgIHMtPnJlbWFpbmluZzIgKz0gY3Vycl9iaXRzOwotICAgICAgICAgICAgY3Vycl9iaXRzICAgICAgPSBjZWx0X3B1bHNlczJiaXRzKGNhY2hlLCAtLXEpOwotICAgICAgICAgICAgcy0+cmVtYWluaW5nMiAtPSBjdXJyX2JpdHM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocSAhPSAwKSB7Ci0gICAgICAgICAgICAvKiBGaW5hbGx5IGRvIHRoZSBhY3R1YWwgcXVhbnRpemF0aW9uICovCi0gICAgICAgICAgICBjbSA9IGNlbHRfYWxnX3VucXVhbnQocmMsIFgsIE4sIChxIDwgOCkgPyBxIDogKDggKyAocSAmIDcpKSA8PCAoKHEgPj4gMykgLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zcHJlYWQsIGJsb2NrcywgZ2Fpbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBJZiB0aGVyZSdzIG5vIHB1bHNlLCBmaWxsIHRoZSBiYW5kIGFueXdheSAqLwotICAgICAgICAgICAgaW50IGo7Ci0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgY21fbWFzayA9ICgxIDw8IGJsb2NrcykgLSAxOwotICAgICAgICAgICAgZmlsbCAmPSBjbV9tYXNrOwotICAgICAgICAgICAgaWYgKCFmaWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IE47IGorKykKLSAgICAgICAgICAgICAgICAgICAgWFtqXSA9IDAuMGY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICghbG93YmFuZCkgewotICAgICAgICAgICAgICAgICAgICAvKiBOb2lzZSAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKQotICAgICAgICAgICAgICAgICAgICAgICAgWFtqXSA9ICgoKGludDMyX3QpY2VsdF9ybmcocykpID4+IDIwKTsKLSAgICAgICAgICAgICAgICAgICAgY20gPSBjbV9tYXNrOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEZvbGRlZCBzcGVjdHJ1bSAqLwotICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBYm91dCA0OCBkQiBiZWxvdyB0aGUgIm5vcm1hbCIgZm9sZGluZyBsZXZlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgWFtqXSA9IGxvd2JhbmRbal0gKyAoKChjZWx0X3JuZyhzKSkgJiAweDgwMDApID8gMS4wZiAvIDI1NiA6IC0xLjBmIC8gMjU2KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjbSA9IGZpbGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNlbHRfcmVub3JtYWxpemVfdmVjdG9yKFgsIE4sIGdhaW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGhpcyBjb2RlIGlzIHVzZWQgYnkgdGhlIGRlY29kZXIgYW5kIGJ5IHRoZSByZXN5bnRoZXNpcy1lbmFibGVkIGVuY29kZXIgKi8KLSAgICBpZiAoZHVhbHN0ZXJlbykgewotICAgICAgICBpbnQgajsKLSAgICAgICAgaWYgKE4gIT0gMikKLSAgICAgICAgICAgIGNlbHRfc3RlcmVvX21lcmdlKFgsIFksIG1pZCwgTik7Ci0gICAgICAgIGlmIChpbnYpIHsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBOOyBqKyspCi0gICAgICAgICAgICAgICAgWVtqXSAqPSAtMTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gMCkgewotICAgICAgICBpbnQgazsKLQotICAgICAgICAvKiBVbmRvIHRoZSBzYW1wbGUgcmVvcmdhbml6YXRpb24gZ29pbmcgZnJvbSB0aW1lIG9yZGVyIHRvIGZyZXF1ZW5jeSBvcmRlciAqLwotICAgICAgICBpZiAoQjAgPiAxKQotICAgICAgICAgICAgY2VsdF9pbnRlcmxlYXZlX2hhZGFtYXJkKHMtPnNjcmF0Y2gsIFgsIE5fQj4+cmVjb21iaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEIwPDxyZWNvbWJpbmUsIGxvbmdibG9ja3MpOwotCi0gICAgICAgIC8qIFVuZG8gdGltZS1mcmVxIGNoYW5nZXMgdGhhdCB3ZSBkaWQgZWFybGllciAqLwotICAgICAgICBOX0IgPSBOX0IwOwotICAgICAgICBibG9ja3MgPSBCMDsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IHRpbWVfZGl2aWRlOyBrKyspIHsKLSAgICAgICAgICAgIGJsb2NrcyA+Pj0gMTsKLSAgICAgICAgICAgIE5fQiA8PD0gMTsKLSAgICAgICAgICAgIGNtIHw9IGNtID4+IGJsb2NrczsKLSAgICAgICAgICAgIGNlbHRfaGFhcjEoWCwgTl9CLCBibG9ja3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChrID0gMDsgayA8IHJlY29tYmluZTsgaysrKSB7Ci0gICAgICAgICAgICBjbSA9IGNlbHRfYml0X2RlaW50ZXJsZWF2ZVtjbV07Ci0gICAgICAgICAgICBjZWx0X2hhYXIxKFgsIE4wPj5rLCAxPDxrKTsKLSAgICAgICAgfQotICAgICAgICBibG9ja3MgPDw9IHJlY29tYmluZTsKLQotICAgICAgICAvKiBTY2FsZSBvdXRwdXQgZm9yIGxhdGVyIGZvbGRpbmcgKi8KLSAgICAgICAgaWYgKGxvd2JhbmRfb3V0KSB7Ci0gICAgICAgICAgICBpbnQgajsKLSAgICAgICAgICAgIGZsb2F0IG4gPSBzcXJ0ZihOMCk7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKLSAgICAgICAgICAgICAgICBsb3diYW5kX291dFtqXSA9IG4gKiBYW2pdOwotICAgICAgICB9Ci0gICAgICAgIGNtID0gYXZfbW9kX3VpbnRwMihjbSwgYmxvY2tzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGNtOwotfQotCi1zdGF0aWMgdm9pZCBjZWx0X2Rlbm9ybWFsaXplKENlbHRDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmZyYW1lLCBmbG9hdCAqZGF0YSkKK3N0YXRpYyB2b2lkIGNlbHRfZGVub3JtYWxpemUoQ2VsdEZyYW1lICpmLCBDZWx0QmxvY2sgKmJsb2NrLCBmbG9hdCAqZGF0YSkKIHsKICAgICBpbnQgaSwgajsKIAotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgewotICAgICAgICBmbG9hdCAqZHN0ID0gZGF0YSArIChjZWx0X2ZyZXFfYmFuZHNbaV0gPDwgcy0+ZHVyYXRpb24pOwotICAgICAgICBmbG9hdCBub3JtID0gZXhwMihmcmFtZS0+ZW5lcmd5W2ldICsgY2VsdF9tZWFuX2VuZXJneVtpXSk7CisgICAgZm9yIChpID0gZi0+c3RhcnRfYmFuZDsgaSA8IGYtPmVuZF9iYW5kOyBpKyspIHsKKyAgICAgICAgZmxvYXQgKmRzdCA9IGRhdGEgKyAoZmZfY2VsdF9mcmVxX2JhbmRzW2ldIDw8IGYtPnNpemUpOworICAgICAgICBmbG9hdCBsb2dfbm9ybSA9IGJsb2NrLT5lbmVyZ3lbaV0gKyBmZl9jZWx0X21lYW5fZW5lcmd5W2ldOworICAgICAgICBmbG9hdCBub3JtID0gZXhwMmYoRkZNSU4obG9nX25vcm0sIDMyLjBmKSk7CiAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGNlbHRfZnJlcV9yYW5nZVtpXSA8PCBzLT5kdXJhdGlvbjsgaisrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgZmZfY2VsdF9mcmVxX3JhbmdlW2ldIDw8IGYtPnNpemU7IGorKykKICAgICAgICAgICAgIGRzdFtqXSAqPSBub3JtOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2VsdF9wb3N0ZmlsdGVyX2FwcGx5X3RyYW5zaXRpb24oQ2VsdEZyYW1lICpmcmFtZSwgZmxvYXQgKmRhdGEpCitzdGF0aWMgdm9pZCBjZWx0X3Bvc3RmaWx0ZXJfYXBwbHlfdHJhbnNpdGlvbihDZWx0QmxvY2sgKmJsb2NrLCBmbG9hdCAqZGF0YSkKIHsKLSAgICBjb25zdCBpbnQgVDAgPSBmcmFtZS0+cGZfcGVyaW9kX29sZDsKLSAgICBjb25zdCBpbnQgVDEgPSBmcmFtZS0+cGZfcGVyaW9kOworICAgIGNvbnN0IGludCBUMCA9IGJsb2NrLT5wZl9wZXJpb2Rfb2xkOworICAgIGNvbnN0IGludCBUMSA9IGJsb2NrLT5wZl9wZXJpb2Q7CiAKICAgICBmbG9hdCBnMDAsIGcwMSwgZzAyOwogICAgIGZsb2F0IGcxMCwgZzExLCBnMTI7CkBAIC0xNjk3LDE2ICsxNjksMTYgQEAKIAogICAgIGludCBpOwogCi0gICAgaWYgKGZyYW1lLT5wZl9nYWluc1swXSAgICAgPT0gMC4wICYmCi0gICAgICAgIGZyYW1lLT5wZl9nYWluc19vbGRbMF0gPT0gMC4wKQorICAgIGlmIChibG9jay0+cGZfZ2FpbnNbMF0gICAgID09IDAuMCAmJgorICAgICAgICBibG9jay0+cGZfZ2FpbnNfb2xkWzBdID09IDAuMCkKICAgICAgICAgcmV0dXJuOwogCi0gICAgZzAwID0gZnJhbWUtPnBmX2dhaW5zX29sZFswXTsKLSAgICBnMDEgPSBmcmFtZS0+cGZfZ2FpbnNfb2xkWzFdOwotICAgIGcwMiA9IGZyYW1lLT5wZl9nYWluc19vbGRbMl07Ci0gICAgZzEwID0gZnJhbWUtPnBmX2dhaW5zWzBdOwotICAgIGcxMSA9IGZyYW1lLT5wZl9nYWluc1sxXTsKLSAgICBnMTIgPSBmcmFtZS0+cGZfZ2FpbnNbMl07CisgICAgZzAwID0gYmxvY2stPnBmX2dhaW5zX29sZFswXTsKKyAgICBnMDEgPSBibG9jay0+cGZfZ2FpbnNfb2xkWzFdOworICAgIGcwMiA9IGJsb2NrLT5wZl9nYWluc19vbGRbMl07CisgICAgZzEwID0gYmxvY2stPnBmX2dhaW5zWzBdOworICAgIGcxMSA9IGJsb2NrLT5wZl9nYWluc1sxXTsKKyAgICBnMTIgPSBibG9jay0+cGZfZ2FpbnNbMl07CiAKICAgICB4MSA9IGRhdGFbLVQxICsgMV07CiAgICAgeDIgPSBkYXRhWy1UMV07CkBAIC0xNzMwLDIwICsyMDIsMTkgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNlbHRfcG9zdGZpbHRlcl9hcHBseShDZWx0RnJhbWUgKmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkYXRhLCBpbnQgbGVuKQorc3RhdGljIHZvaWQgY2VsdF9wb3N0ZmlsdGVyX2FwcGx5KENlbHRCbG9jayAqYmxvY2ssIGZsb2F0ICpkYXRhLCBpbnQgbGVuKQogewotICAgIGNvbnN0IGludCBUID0gZnJhbWUtPnBmX3BlcmlvZDsKKyAgICBjb25zdCBpbnQgVCA9IGJsb2NrLT5wZl9wZXJpb2Q7CiAgICAgZmxvYXQgZzAsIGcxLCBnMjsKICAgICBmbG9hdCB4MCwgeDEsIHgyLCB4MywgeDQ7CiAgICAgaW50IGk7CiAKLSAgICBpZiAoZnJhbWUtPnBmX2dhaW5zWzBdID09IDAuMCB8fCBsZW4gPD0gMCkKKyAgICBpZiAoYmxvY2stPnBmX2dhaW5zWzBdID09IDAuMCB8fCBsZW4gPD0gMCkKICAgICAgICAgcmV0dXJuOwogCi0gICAgZzAgPSBmcmFtZS0+cGZfZ2FpbnNbMF07Ci0gICAgZzEgPSBmcmFtZS0+cGZfZ2FpbnNbMV07Ci0gICAgZzIgPSBmcmFtZS0+cGZfZ2FpbnNbMl07CisgICAgZzAgPSBibG9jay0+cGZfZ2FpbnNbMF07CisgICAgZzEgPSBibG9jay0+cGZfZ2FpbnNbMV07CisgICAgZzIgPSBibG9jay0+cGZfZ2FpbnNbMl07CiAKICAgICB4NCA9IGRhdGFbLVQgLSAyXTsKICAgICB4MyA9IGRhdGFbLVQgLSAxXTsKQEAgLTE3NjIsNjEgKzIzMyw1NiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY2VsdF9wb3N0ZmlsdGVyKENlbHRDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmZyYW1lKQorc3RhdGljIHZvaWQgY2VsdF9wb3N0ZmlsdGVyKENlbHRGcmFtZSAqZiwgQ2VsdEJsb2NrICpibG9jaykKIHsKLSAgICBpbnQgbGVuID0gcy0+YmxvY2tzaXplICogcy0+YmxvY2tzOworICAgIGludCBsZW4gPSBmLT5ibG9ja3NpemUgKiBmLT5ibG9ja3M7CiAKLSAgICBjZWx0X3Bvc3RmaWx0ZXJfYXBwbHlfdHJhbnNpdGlvbihmcmFtZSwgZnJhbWUtPmJ1ZiArIDEwMjQpOworICAgIGNlbHRfcG9zdGZpbHRlcl9hcHBseV90cmFuc2l0aW9uKGJsb2NrLCBibG9jay0+YnVmICsgMTAyNCk7CiAKLSAgICBmcmFtZS0+cGZfcGVyaW9kX29sZCA9IGZyYW1lLT5wZl9wZXJpb2Q7Ci0gICAgbWVtY3B5KGZyYW1lLT5wZl9nYWluc19vbGQsIGZyYW1lLT5wZl9nYWlucywgc2l6ZW9mKGZyYW1lLT5wZl9nYWlucykpOworICAgIGJsb2NrLT5wZl9wZXJpb2Rfb2xkID0gYmxvY2stPnBmX3BlcmlvZDsKKyAgICBtZW1jcHkoYmxvY2stPnBmX2dhaW5zX29sZCwgYmxvY2stPnBmX2dhaW5zLCBzaXplb2YoYmxvY2stPnBmX2dhaW5zKSk7CiAKLSAgICBmcmFtZS0+cGZfcGVyaW9kID0gZnJhbWUtPnBmX3BlcmlvZF9uZXc7Ci0gICAgbWVtY3B5KGZyYW1lLT5wZl9nYWlucywgZnJhbWUtPnBmX2dhaW5zX25ldywgc2l6ZW9mKGZyYW1lLT5wZl9nYWlucykpOworICAgIGJsb2NrLT5wZl9wZXJpb2QgPSBibG9jay0+cGZfcGVyaW9kX25ldzsKKyAgICBtZW1jcHkoYmxvY2stPnBmX2dhaW5zLCBibG9jay0+cGZfZ2FpbnNfbmV3LCBzaXplb2YoYmxvY2stPnBmX2dhaW5zKSk7CiAKICAgICBpZiAobGVuID4gQ0VMVF9PVkVSTEFQKSB7Ci0gICAgICAgIGNlbHRfcG9zdGZpbHRlcl9hcHBseV90cmFuc2l0aW9uKGZyYW1lLCBmcmFtZS0+YnVmICsgMTAyNCArIENFTFRfT1ZFUkxBUCk7Ci0gICAgICAgIGNlbHRfcG9zdGZpbHRlcl9hcHBseShmcmFtZSwgZnJhbWUtPmJ1ZiArIDEwMjQgKyAyICogQ0VMVF9PVkVSTEFQLAorICAgICAgICBjZWx0X3Bvc3RmaWx0ZXJfYXBwbHlfdHJhbnNpdGlvbihibG9jaywgYmxvY2stPmJ1ZiArIDEwMjQgKyBDRUxUX09WRVJMQVApOworICAgICAgICBjZWx0X3Bvc3RmaWx0ZXJfYXBwbHkoYmxvY2ssIGJsb2NrLT5idWYgKyAxMDI0ICsgMiAqIENFTFRfT1ZFUkxBUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtIDIgKiBDRUxUX09WRVJMQVApOwogCi0gICAgICAgIGZyYW1lLT5wZl9wZXJpb2Rfb2xkID0gZnJhbWUtPnBmX3BlcmlvZDsKLSAgICAgICAgbWVtY3B5KGZyYW1lLT5wZl9nYWluc19vbGQsIGZyYW1lLT5wZl9nYWlucywgc2l6ZW9mKGZyYW1lLT5wZl9nYWlucykpOworICAgICAgICBibG9jay0+cGZfcGVyaW9kX29sZCA9IGJsb2NrLT5wZl9wZXJpb2Q7CisgICAgICAgIG1lbWNweShibG9jay0+cGZfZ2FpbnNfb2xkLCBibG9jay0+cGZfZ2FpbnMsIHNpemVvZihibG9jay0+cGZfZ2FpbnMpKTsKICAgICB9CiAKLSAgICBtZW1tb3ZlKGZyYW1lLT5idWYsIGZyYW1lLT5idWYgKyBsZW4sICgxMDI0ICsgQ0VMVF9PVkVSTEFQIC8gMikgKiBzaXplb2YoZmxvYXQpKTsKKyAgICBtZW1tb3ZlKGJsb2NrLT5idWYsIGJsb2NrLT5idWYgKyBsZW4sICgxMDI0ICsgQ0VMVF9PVkVSTEFQIC8gMikgKiBzaXplb2YoZmxvYXQpKTsKIH0KIAotc3RhdGljIGludCBwYXJzZV9wb3N0ZmlsdGVyKENlbHRDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMsIGludCBjb25zdW1lZCkKK3N0YXRpYyBpbnQgcGFyc2VfcG9zdGZpbHRlcihDZWx0RnJhbWUgKmYsIE9wdXNSYW5nZUNvZGVyICpyYywgaW50IGNvbnN1bWVkKQogewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBwb3N0ZmlsdGVyX3RhcHNbM11bM10gPSB7Ci0gICAgICAgIHsgMC4zMDY2NDA2MjUwZiwgMC4yMTcwNDEwMTU2ZiwgMC4xMjk2Mzg2NzE5ZiB9LAotICAgICAgICB7IDAuNDYzODY3MTg3NWYsIDAuMjY4MDY2NDA2MmYsIDAuMCAgICAgICAgICAgfSwKLSAgICAgICAgeyAwLjc5OTgwNDY4NzVmLCAwLjEwMDA5NzY1NjJmLCAwLjAgICAgICAgICAgIH0KLSAgICB9OwogICAgIGludCBpOwogCi0gICAgbWVtc2V0KHMtPmZyYW1lWzBdLnBmX2dhaW5zX25ldywgMCwgc2l6ZW9mKHMtPmZyYW1lWzBdLnBmX2dhaW5zX25ldykpOwotICAgIG1lbXNldChzLT5mcmFtZVsxXS5wZl9nYWluc19uZXcsIDAsIHNpemVvZihzLT5mcmFtZVsxXS5wZl9nYWluc19uZXcpKTsKKyAgICBtZW1zZXQoZi0+YmxvY2tbMF0ucGZfZ2FpbnNfbmV3LCAwLCBzaXplb2YoZi0+YmxvY2tbMF0ucGZfZ2FpbnNfbmV3KSk7CisgICAgbWVtc2V0KGYtPmJsb2NrWzFdLnBmX2dhaW5zX25ldywgMCwgc2l6ZW9mKGYtPmJsb2NrWzFdLnBmX2dhaW5zX25ldykpOwogCi0gICAgaWYgKHMtPnN0YXJ0YmFuZCA9PSAwICYmIGNvbnN1bWVkICsgMTYgPD0gcy0+ZnJhbWViaXRzKSB7Ci0gICAgICAgIGludCBoYXNfcG9zdGZpbHRlciA9IG9wdXNfcmNfcDJtb2RlbChyYywgMSk7CisgICAgaWYgKGYtPnN0YXJ0X2JhbmQgPT0gMCAmJiBjb25zdW1lZCArIDE2IDw9IGYtPmZyYW1lYml0cykgeworICAgICAgICBpbnQgaGFzX3Bvc3RmaWx0ZXIgPSBmZl9vcHVzX3JjX2RlY19sb2cocmMsIDEpOwogICAgICAgICBpZiAoaGFzX3Bvc3RmaWx0ZXIpIHsKICAgICAgICAgICAgIGZsb2F0IGdhaW47CiAgICAgICAgICAgICBpbnQgdGFwc2V0LCBvY3RhdmUsIHBlcmlvZDsKIAotICAgICAgICAgICAgb2N0YXZlID0gb3B1c19yY191bmltb2RlbChyYywgNik7Ci0gICAgICAgICAgICBwZXJpb2QgPSAoMTYgPDwgb2N0YXZlKSArIG9wdXNfZ2V0cmF3Yml0cyhyYywgNCArIG9jdGF2ZSkgLSAxOwotICAgICAgICAgICAgZ2FpbiAgID0gMC4wOTM3NWYgKiAob3B1c19nZXRyYXdiaXRzKHJjLCAzKSArIDEpOwotICAgICAgICAgICAgdGFwc2V0ID0gKG9wdXNfcmNfdGVsbChyYykgKyAyIDw9IHMtPmZyYW1lYml0cykgPwotICAgICAgICAgICAgICAgICAgICAgb3B1c19yY19nZXRzeW1ib2wocmMsIGNlbHRfbW9kZWxfdGFwc2V0KSA6IDA7CisgICAgICAgICAgICBvY3RhdmUgPSBmZl9vcHVzX3JjX2RlY191aW50KHJjLCA2KTsKKyAgICAgICAgICAgIHBlcmlvZCA9ICgxNiA8PCBvY3RhdmUpICsgZmZfb3B1c19yY19nZXRfcmF3KHJjLCA0ICsgb2N0YXZlKSAtIDE7CisgICAgICAgICAgICBnYWluICAgPSAwLjA5Mzc1ZiAqIChmZl9vcHVzX3JjX2dldF9yYXcocmMsIDMpICsgMSk7CisgICAgICAgICAgICB0YXBzZXQgPSAob3B1c19yY190ZWxsKHJjKSArIDIgPD0gZi0+ZnJhbWViaXRzKSA/CisgICAgICAgICAgICAgICAgICAgICBmZl9vcHVzX3JjX2RlY19jZGYocmMsIGZmX2NlbHRfbW9kZWxfdGFwc2V0KSA6IDA7CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgICAgICBDZWx0RnJhbWUgKmZyYW1lID0gJnMtPmZyYW1lW2ldOworICAgICAgICAgICAgICAgIENlbHRCbG9jayAqYmxvY2sgPSAmZi0+YmxvY2tbaV07CiAKLSAgICAgICAgICAgICAgICBmcmFtZS0+cGZfcGVyaW9kX25ldyA9IEZGTUFYKHBlcmlvZCwgQ0VMVF9QT1NURklMVEVSX01JTlBFUklPRCk7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPnBmX2dhaW5zX25ld1swXSA9IGdhaW4gKiBwb3N0ZmlsdGVyX3RhcHNbdGFwc2V0XVswXTsKLSAgICAgICAgICAgICAgICBmcmFtZS0+cGZfZ2FpbnNfbmV3WzFdID0gZ2FpbiAqIHBvc3RmaWx0ZXJfdGFwc1t0YXBzZXRdWzFdOwotICAgICAgICAgICAgICAgIGZyYW1lLT5wZl9nYWluc19uZXdbMl0gPSBnYWluICogcG9zdGZpbHRlcl90YXBzW3RhcHNldF1bMl07CisgICAgICAgICAgICAgICAgYmxvY2stPnBmX3BlcmlvZF9uZXcgPSBGRk1BWChwZXJpb2QsIENFTFRfUE9TVEZJTFRFUl9NSU5QRVJJT0QpOworICAgICAgICAgICAgICAgIGJsb2NrLT5wZl9nYWluc19uZXdbMF0gPSBnYWluICogZmZfY2VsdF9wb3N0ZmlsdGVyX3RhcHNbdGFwc2V0XVswXTsKKyAgICAgICAgICAgICAgICBibG9jay0+cGZfZ2FpbnNfbmV3WzFdID0gZ2FpbiAqIGZmX2NlbHRfcG9zdGZpbHRlcl90YXBzW3RhcHNldF1bMV07CisgICAgICAgICAgICAgICAgYmxvY2stPnBmX2dhaW5zX25ld1syXSA9IGdhaW4gKiBmZl9jZWx0X3Bvc3RmaWx0ZXJfdGFwc1t0YXBzZXRdWzJdOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE4MjYsMTEgKzI5MiwxMSBAQAogICAgIHJldHVybiBjb25zdW1lZDsKIH0KIAotc3RhdGljIHZvaWQgcHJvY2Vzc19hbnRpY29sbGFwc2UoQ2VsdENvbnRleHQgKnMsIENlbHRGcmFtZSAqZnJhbWUsIGZsb2F0ICpYKQorc3RhdGljIHZvaWQgcHJvY2Vzc19hbnRpY29sbGFwc2UoQ2VsdEZyYW1lICpmLCBDZWx0QmxvY2sgKmJsb2NrLCBmbG9hdCAqWCkKIHsKICAgICBpbnQgaSwgaiwgazsKIAotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgeworICAgIGZvciAoaSA9IGYtPnN0YXJ0X2JhbmQ7IGkgPCBmLT5lbmRfYmFuZDsgaSsrKSB7CiAgICAgICAgIGludCByZW5vcm1hbGl6ZSA9IDA7CiAgICAgICAgIGZsb2F0ICp4cHRyOwogICAgICAgICBmbG9hdCBwcmV2WzJdOwpAQCAtMTgzOSwzNTYgKzMwNSwyNjggQEAKICAgICAgICAgaW50IGRlcHRoOwogCiAgICAgICAgIC8qIGRlcHRoIGluIDEvOCBiaXRzICovCi0gICAgICAgIGRlcHRoID0gKDEgKyBzLT5wdWxzZXNbaV0pIC8gKGNlbHRfZnJlcV9yYW5nZVtpXSA8PCBzLT5kdXJhdGlvbik7CisgICAgICAgIGRlcHRoID0gKDEgKyBmLT5wdWxzZXNbaV0pIC8gKGZmX2NlbHRfZnJlcV9yYW5nZVtpXSA8PCBmLT5zaXplKTsKICAgICAgICAgdGhyZXNoID0gZXhwMmYoLTEuMCAtIDAuMTI1ZiAqIGRlcHRoKTsKLSAgICAgICAgc3FydF8xID0gMS4wZiAvIHNxcnRmKGNlbHRfZnJlcV9yYW5nZVtpXSA8PCBzLT5kdXJhdGlvbik7CisgICAgICAgIHNxcnRfMSA9IDEuMGYgLyBzcXJ0ZihmZl9jZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgZi0+c2l6ZSk7CiAKLSAgICAgICAgeHB0ciA9IFggKyAoY2VsdF9mcmVxX2JhbmRzW2ldIDw8IHMtPmR1cmF0aW9uKTsKKyAgICAgICAgeHB0ciA9IFggKyAoZmZfY2VsdF9mcmVxX2JhbmRzW2ldIDw8IGYtPnNpemUpOwogCi0gICAgICAgIHByZXZbMF0gPSBmcmFtZS0+cHJldl9lbmVyZ3lbMF1baV07Ci0gICAgICAgIHByZXZbMV0gPSBmcmFtZS0+cHJldl9lbmVyZ3lbMV1baV07Ci0gICAgICAgIGlmIChzLT5jb2RlZF9jaGFubmVscyA9PSAxKSB7Ci0gICAgICAgICAgICBDZWx0RnJhbWUgKmZyYW1lMSA9ICZzLT5mcmFtZVsxXTsKKyAgICAgICAgcHJldlswXSA9IGJsb2NrLT5wcmV2X2VuZXJneVswXVtpXTsKKyAgICAgICAgcHJldlsxXSA9IGJsb2NrLT5wcmV2X2VuZXJneVsxXVtpXTsKKyAgICAgICAgaWYgKGYtPmNoYW5uZWxzID09IDEpIHsKKyAgICAgICAgICAgIENlbHRCbG9jayAqYmxvY2sxID0gJmYtPmJsb2NrWzFdOwogCi0gICAgICAgICAgICBwcmV2WzBdID0gRkZNQVgocHJldlswXSwgZnJhbWUxLT5wcmV2X2VuZXJneVswXVtpXSk7Ci0gICAgICAgICAgICBwcmV2WzFdID0gRkZNQVgocHJldlsxXSwgZnJhbWUxLT5wcmV2X2VuZXJneVsxXVtpXSk7CisgICAgICAgICAgICBwcmV2WzBdID0gRkZNQVgocHJldlswXSwgYmxvY2sxLT5wcmV2X2VuZXJneVswXVtpXSk7CisgICAgICAgICAgICBwcmV2WzFdID0gRkZNQVgocHJldlsxXSwgYmxvY2sxLT5wcmV2X2VuZXJneVsxXVtpXSk7CiAgICAgICAgIH0KLSAgICAgICAgRWRpZmYgPSBmcmFtZS0+ZW5lcmd5W2ldIC0gRkZNSU4ocHJldlswXSwgcHJldlsxXSk7CisgICAgICAgIEVkaWZmID0gYmxvY2stPmVuZXJneVtpXSAtIEZGTUlOKHByZXZbMF0sIHByZXZbMV0pOwogICAgICAgICBFZGlmZiA9IEZGTUFYKDAsIEVkaWZmKTsKIAogICAgICAgICAvKiByIG5lZWRzIHRvIGJlIG11bHRpcGxpZWQgYnkgMiBvciAyKnNxcnQoMikgZGVwZW5kaW5nIG9uIExNIGJlY2F1c2UKICAgICAgICAgc2hvcnQgYmxvY2tzIGRvbid0IGhhdmUgdGhlIHNhbWUgZW5lcmd5IGFzIGxvbmcgKi8KLSAgICAgICAgciA9IGV4cDIoMSAtIEVkaWZmKTsKLSAgICAgICAgaWYgKHMtPmR1cmF0aW9uID09IDMpCisgICAgICAgIHIgPSBleHAyZigxIC0gRWRpZmYpOworICAgICAgICBpZiAoZi0+c2l6ZSA9PSAzKQogICAgICAgICAgICAgciAqPSBNX1NRUlQyOwogICAgICAgICByID0gRkZNSU4odGhyZXNoLCByKSAqIHNxcnRfMTsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IDEgPDwgcy0+ZHVyYXRpb247IGsrKykgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMSA8PCBmLT5zaXplOyBrKyspIHsKICAgICAgICAgICAgIC8qIERldGVjdCBjb2xsYXBzZSAqLwotICAgICAgICAgICAgaWYgKCEoZnJhbWUtPmNvbGxhcHNlX21hc2tzW2ldICYgMSA8PCBrKSkgeworICAgICAgICAgICAgaWYgKCEoYmxvY2stPmNvbGxhcHNlX21hc2tzW2ldICYgMSA8PCBrKSkgewogICAgICAgICAgICAgICAgIC8qIEZpbGwgd2l0aCBub2lzZSAqLwotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjZWx0X2ZyZXFfcmFuZ2VbaV07IGorKykKLSAgICAgICAgICAgICAgICAgICAgeHB0clsoaiA8PCBzLT5kdXJhdGlvbikgKyBrXSA9IChjZWx0X3JuZyhzKSAmIDB4ODAwMCkgPyByIDogLXI7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZmX2NlbHRfZnJlcV9yYW5nZVtpXTsgaisrKQorICAgICAgICAgICAgICAgICAgICB4cHRyWyhqIDw8IGYtPnNpemUpICsga10gPSAoY2VsdF9ybmcoZikgJiAweDgwMDApID8gciA6IC1yOwogICAgICAgICAgICAgICAgIHJlbm9ybWFsaXplID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIFdlIGp1c3QgYWRkZWQgc29tZSBlbmVyZ3ksIHNvIHdlIG5lZWQgdG8gcmVub3JtYWxpemUgKi8KICAgICAgICAgaWYgKHJlbm9ybWFsaXplKQotICAgICAgICAgICAgY2VsdF9yZW5vcm1hbGl6ZV92ZWN0b3IoeHB0ciwgY2VsdF9mcmVxX3JhbmdlW2ldIDw8IHMtPmR1cmF0aW9uLCAxLjBmKTsKKyAgICAgICAgICAgIGNlbHRfcmVub3JtYWxpemVfdmVjdG9yKHhwdHIsIGZmX2NlbHRfZnJlcV9yYW5nZVtpXSA8PCBmLT5zaXplLCAxLjBmKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNlbHRfZGVjb2RlX2JhbmRzKENlbHRDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMpCitpbnQgZmZfY2VsdF9kZWNvZGVfZnJhbWUoQ2VsdEZyYW1lICpmLCBPcHVzUmFuZ2VDb2RlciAqcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKipvdXRwdXQsIGludCBjaGFubmVscywgaW50IGZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2JhbmQsICBpbnQgZW5kX2JhbmQpCiB7Ci0gICAgZmxvYXQgbG93YmFuZF9zY3JhdGNoWzggKiAyMl07Ci0gICAgZmxvYXQgbm9ybVsyICogOCAqIDEwMF07Ci0KLSAgICBpbnQgdG90YWxiaXRzID0gKHMtPmZyYW1lYml0cyA8PCAzKSAtIHMtPmFudGljb2xsYXBzZV9iaXQ7Ci0KLSAgICBpbnQgdXBkYXRlX2xvd2JhbmQgPSAxOwotICAgIGludCBsb3diYW5kX29mZnNldCA9IDA7Ci0KLSAgICBpbnQgaSwgajsKLQotICAgIG1lbXNldChzLT5jb2VmZnMsIDAsIHNpemVvZihzLT5jb2VmZnMpKTsKLQotICAgIGZvciAoaSA9IHMtPnN0YXJ0YmFuZDsgaSA8IHMtPmVuZGJhbmQ7IGkrKykgewotICAgICAgICBpbnQgYmFuZF9vZmZzZXQgPSBjZWx0X2ZyZXFfYmFuZHNbaV0gPDwgcy0+ZHVyYXRpb247Ci0gICAgICAgIGludCBiYW5kX3NpemUgICA9IGNlbHRfZnJlcV9yYW5nZVtpXSA8PCBzLT5kdXJhdGlvbjsKLSAgICAgICAgZmxvYXQgKlggPSBzLT5jb2VmZnNbMF0gKyBiYW5kX29mZnNldDsKLSAgICAgICAgZmxvYXQgKlkgPSAocy0+Y29kZWRfY2hhbm5lbHMgPT0gMikgPyBzLT5jb2VmZnNbMV0gKyBiYW5kX29mZnNldCA6IE5VTEw7Ci0KLSAgICAgICAgaW50IGNvbnN1bWVkID0gb3B1c19yY190ZWxsX2ZyYWMocmMpOwotICAgICAgICBmbG9hdCAqbm9ybTIgPSBub3JtICsgOCAqIDEwMDsKLSAgICAgICAgaW50IGVmZmVjdGl2ZV9sb3diYW5kID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBjbVsyXTsKLSAgICAgICAgaW50IGI7Ci0KLSAgICAgICAgLyogQ29tcHV0ZSBob3cgbWFueSBiaXRzIHdlIHdhbnQgdG8gYWxsb2NhdGUgdG8gdGhpcyBiYW5kICovCi0gICAgICAgIGlmIChpICE9IHMtPnN0YXJ0YmFuZCkKLSAgICAgICAgICAgIHMtPnJlbWFpbmluZyAtPSBjb25zdW1lZDsKLSAgICAgICAgcy0+cmVtYWluaW5nMiA9IHRvdGFsYml0cyAtIGNvbnN1bWVkIC0gMTsKLSAgICAgICAgaWYgKGkgPD0gcy0+Y29kZWRiYW5kcyAtIDEpIHsKLSAgICAgICAgICAgIGludCBjdXJyX2JhbGFuY2UgPSBzLT5yZW1haW5pbmcgLyBGRk1JTigzLCBzLT5jb2RlZGJhbmRzLWkpOwotICAgICAgICAgICAgYiA9IGF2X2NsaXBfdWludHAyKEZGTUlOKHMtPnJlbWFpbmluZzIgKyAxLCBzLT5wdWxzZXNbaV0gKyBjdXJyX2JhbGFuY2UpLCAxNCk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYiA9IDA7Ci0KLSAgICAgICAgaWYgKGNlbHRfZnJlcV9iYW5kc1tpXSAtIGNlbHRfZnJlcV9yYW5nZVtpXSA+PSBjZWx0X2ZyZXFfYmFuZHNbcy0+c3RhcnRiYW5kXSAmJgotICAgICAgICAgICAgKHVwZGF0ZV9sb3diYW5kIHx8IGxvd2JhbmRfb2Zmc2V0ID09IDApKQotICAgICAgICAgICAgbG93YmFuZF9vZmZzZXQgPSBpOwotCi0gICAgICAgIC8qIEdldCBhIGNvbnNlcnZhdGl2ZSBlc3RpbWF0ZSBvZiB0aGUgY29sbGFwc2VfbWFzaydzIGZvciB0aGUgYmFuZHMgd2UncmUKLSAgICAgICAgZ29pbmcgdG8gYmUgZm9sZGluZyBmcm9tLiAqLwotICAgICAgICBpZiAobG93YmFuZF9vZmZzZXQgIT0gMCAmJiAocy0+c3ByZWFkICE9IENFTFRfU1BSRUFEX0FHR1JFU1NJVkUgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrcyA+IDEgfHwgcy0+dGZfY2hhbmdlW2ldIDwgMCkpIHsKLSAgICAgICAgICAgIGludCBmb2xkc3RhcnQsIGZvbGRlbmQ7Ci0KLSAgICAgICAgICAgIC8qIFRoaXMgZW5zdXJlcyB3ZSBuZXZlciByZXBlYXQgc3BlY3RyYWwgY29udGVudCB3aXRoaW4gb25lIGJhbmQgKi8KLSAgICAgICAgICAgIGVmZmVjdGl2ZV9sb3diYW5kID0gRkZNQVgoY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbHRfZnJlcV9iYW5kc1tsb3diYW5kX29mZnNldF0gLSBjZWx0X2ZyZXFfcmFuZ2VbaV0pOwotICAgICAgICAgICAgZm9sZHN0YXJ0ID0gbG93YmFuZF9vZmZzZXQ7Ci0gICAgICAgICAgICB3aGlsZSAoY2VsdF9mcmVxX2JhbmRzWy0tZm9sZHN0YXJ0XSA+IGVmZmVjdGl2ZV9sb3diYW5kKTsKLSAgICAgICAgICAgIGZvbGRlbmQgPSBsb3diYW5kX29mZnNldCAtIDE7Ci0gICAgICAgICAgICB3aGlsZSAoY2VsdF9mcmVxX2JhbmRzWysrZm9sZGVuZF0gPCBlZmZlY3RpdmVfbG93YmFuZCArIGNlbHRfZnJlcV9yYW5nZVtpXSk7Ci0KLSAgICAgICAgICAgIGNtWzBdID0gY21bMV0gPSAwOwotICAgICAgICAgICAgZm9yIChqID0gZm9sZHN0YXJ0OyBqIDwgZm9sZGVuZDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgY21bMF0gfD0gcy0+ZnJhbWVbMF0uY29sbGFwc2VfbWFza3Nbal07Ci0gICAgICAgICAgICAgICAgY21bMV0gfD0gcy0+ZnJhbWVbcy0+Y29kZWRfY2hhbm5lbHMgLSAxXS5jb2xsYXBzZV9tYXNrc1tqXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAvKiBPdGhlcndpc2UsIHdlJ2xsIGJlIHVzaW5nIHRoZSBMQ0cgdG8gZm9sZCwgc28gYWxsIGJsb2NrcyB3aWxsIChhbG1vc3QKLSAgICAgICAgICAgIGFsd2F5cykgYmUgbm9uLXplcm8uKi8KLSAgICAgICAgICAgIGNtWzBdID0gY21bMV0gPSAoMSA8PCBzLT5ibG9ja3MpIC0gMTsKLQotICAgICAgICBpZiAocy0+ZHVhbHN0ZXJlbyAmJiBpID09IHMtPmludGVuc2l0eXN0ZXJlbykgewotICAgICAgICAgICAgLyogU3dpdGNoIG9mZiBkdWFsIHN0ZXJlbyB0byBkbyBpbnRlbnNpdHkgKi8KLSAgICAgICAgICAgIHMtPmR1YWxzdGVyZW8gPSAwOwotICAgICAgICAgICAgZm9yIChqID0gY2VsdF9mcmVxX2JhbmRzW3MtPnN0YXJ0YmFuZF0gPDwgcy0+ZHVyYXRpb247IGogPCBiYW5kX29mZnNldDsgaisrKQotICAgICAgICAgICAgICAgIG5vcm1bal0gPSAobm9ybVtqXSArIG5vcm0yW2pdKSAvIDI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocy0+ZHVhbHN0ZXJlbykgewotICAgICAgICAgICAgY21bMF0gPSBjZWx0X2RlY29kZV9iYW5kKHMsIHJjLCBpLCBYLCBOVUxMLCBiYW5kX3NpemUsIGIgLyAyLCBzLT5ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlX2xvd2JhbmQgIT0gLTEgPyBub3JtICsgKGVmZmVjdGl2ZV9sb3diYW5kIDw8IHMtPmR1cmF0aW9uKSA6IE5VTEwsIHMtPmR1cmF0aW9uLAotICAgICAgICAgICAgbm9ybSArIGJhbmRfb2Zmc2V0LCAwLCAxLjBmLCBsb3diYW5kX3NjcmF0Y2gsIGNtWzBdKTsKLQotICAgICAgICAgICAgY21bMV0gPSBjZWx0X2RlY29kZV9iYW5kKHMsIHJjLCBpLCBZLCBOVUxMLCBiYW5kX3NpemUsIGIvMiwgcy0+YmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZV9sb3diYW5kICE9IC0xID8gbm9ybTIgKyAoZWZmZWN0aXZlX2xvd2JhbmQgPDwgcy0+ZHVyYXRpb24pIDogTlVMTCwgcy0+ZHVyYXRpb24sCi0gICAgICAgICAgICBub3JtMiArIGJhbmRfb2Zmc2V0LCAwLCAxLjBmLCBsb3diYW5kX3NjcmF0Y2gsIGNtWzFdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNtWzBdID0gY2VsdF9kZWNvZGVfYmFuZChzLCByYywgaSwgWCwgWSwgYmFuZF9zaXplLCBiLCBzLT5ibG9ja3MsCi0gICAgICAgICAgICBlZmZlY3RpdmVfbG93YmFuZCAhPSAtMSA/IG5vcm0gKyAoZWZmZWN0aXZlX2xvd2JhbmQgPDwgcy0+ZHVyYXRpb24pIDogTlVMTCwgcy0+ZHVyYXRpb24sCi0gICAgICAgICAgICBub3JtICsgYmFuZF9vZmZzZXQsIDAsIDEuMGYsIGxvd2JhbmRfc2NyYXRjaCwgY21bMF18Y21bMV0pOwotCi0gICAgICAgICAgICBjbVsxXSA9IGNtWzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcy0+ZnJhbWVbMF0uY29sbGFwc2VfbWFza3NbaV0gICAgICAgICAgICAgICAgICAgICA9ICh1aW50OF90KWNtWzBdOwotICAgICAgICBzLT5mcmFtZVtzLT5jb2RlZF9jaGFubmVscyAtIDFdLmNvbGxhcHNlX21hc2tzW2ldID0gKHVpbnQ4X3QpY21bMV07Ci0gICAgICAgIHMtPnJlbWFpbmluZyArPSBzLT5wdWxzZXNbaV0gKyBjb25zdW1lZDsKLQotICAgICAgICAvKiBVcGRhdGUgdGhlIGZvbGRpbmcgcG9zaXRpb24gb25seSBhcyBsb25nIGFzIHdlIGhhdmUgMSBiaXQvc2FtcGxlIGRlcHRoICovCi0gICAgICAgIHVwZGF0ZV9sb3diYW5kID0gKGIgPiBiYW5kX3NpemUgPDwgMyk7Ci0gICAgfQotfQotCi1pbnQgZmZfY2VsdF9kZWNvZGVfZnJhbWUoQ2VsdENvbnRleHQgKnMsIE9wdXNSYW5nZUNvZGVyICpyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm91dHB1dCwgaW50IGNvZGVkX2NoYW5uZWxzLCBpbnQgZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRiYW5kLCAgaW50IGVuZGJhbmQpCi17Ci0gICAgaW50IGksIGo7Ci0KKyAgICBpbnQgaSwgaiwgZG93bm1peCA9IDA7CiAgICAgaW50IGNvbnN1bWVkOyAgICAgICAgICAgLy8gYml0cyBvZiBlbnRyb3B5IGNvbnN1bWVkIHRodXMgZmFyIGZvciB0aGlzIGZyYW1lCi0gICAgaW50IHNpbGVuY2UgPSAwOwotICAgIGludCB0cmFuc2llbnQgPSAwOwotICAgIGludCBhbnRpY29sbGFwc2UgPSAwOwotICAgIElNRENUMTVDb250ZXh0ICppbWRjdDsKLSAgICBmbG9hdCBpbWRjdF9zY2FsZSA9IDEuMDsKKyAgICBNRENUMTVDb250ZXh0ICppbWRjdDsKIAotICAgIGlmIChjb2RlZF9jaGFubmVscyAhPSAxICYmIGNvZGVkX2NoYW5uZWxzICE9IDIpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjb2RlZCBjaGFubmVsczogJWRcbiIsCi0gICAgICAgICAgICAgICBjb2RlZF9jaGFubmVscyk7CisgICAgaWYgKGNoYW5uZWxzICE9IDEgJiYgY2hhbm5lbHMgIT0gMikgeworICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbnVtYmVyIG9mIGNvZGVkIGNoYW5uZWxzOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIGlmIChzdGFydGJhbmQgPCAwIHx8IHN0YXJ0YmFuZCA+IGVuZGJhbmQgfHwgZW5kYmFuZCA+IENFTFRfTUFYX0JBTkRTKSB7Ci0gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzdGFydC9lbmQgYmFuZDogJWQgJWRcbiIsCi0gICAgICAgICAgICAgICBzdGFydGJhbmQsIGVuZGJhbmQpOworICAgIGlmIChzdGFydF9iYW5kIDwgMCB8fCBzdGFydF9iYW5kID4gZW5kX2JhbmQgfHwgZW5kX2JhbmQgPiBDRUxUX01BWF9CQU5EUykgeworICAgICAgICBhdl9sb2coZi0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc3RhcnQvZW5kIGJhbmQ6ICVkICVkXG4iLAorICAgICAgICAgICAgICAgc3RhcnRfYmFuZCwgZW5kX2JhbmQpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBzLT5mbHVzaGVkICAgICAgICA9IDA7Ci0gICAgcy0+Y29kZWRfY2hhbm5lbHMgPSBjb2RlZF9jaGFubmVsczsKLSAgICBzLT5zdGFydGJhbmQgICAgICA9IHN0YXJ0YmFuZDsKLSAgICBzLT5lbmRiYW5kICAgICAgICA9IGVuZGJhbmQ7Ci0gICAgcy0+ZnJhbWViaXRzICAgICAgPSByYy0+cmIuYnl0ZXMgKiA4OworICAgIGYtPnNpbGVuY2UgICAgICAgID0gMDsKKyAgICBmLT50cmFuc2llbnQgICAgICA9IDA7CisgICAgZi0+YW50aWNvbGxhcHNlICAgPSAwOworICAgIGYtPmZsdXNoZWQgICAgICAgID0gMDsKKyAgICBmLT5jaGFubmVscyAgICAgICA9IGNoYW5uZWxzOworICAgIGYtPnN0YXJ0X2JhbmQgICAgID0gc3RhcnRfYmFuZDsKKyAgICBmLT5lbmRfYmFuZCAgICAgICA9IGVuZF9iYW5kOworICAgIGYtPmZyYW1lYml0cyAgICAgID0gcmMtPnJiLmJ5dGVzICogODsKIAotICAgIHMtPmR1cmF0aW9uID0gYXZfbG9nMihmcmFtZV9zaXplIC8gQ0VMVF9TSE9SVF9CTE9DS1NJWkUpOwotICAgIGlmIChzLT5kdXJhdGlvbiA+IENFTFRfTUFYX0xPR19CTE9DS1MgfHwKLSAgICAgICAgZnJhbWVfc2l6ZSAhPSBDRUxUX1NIT1JUX0JMT0NLU0laRSAqICgxIDw8IHMtPmR1cmF0aW9uKSkgewotICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgQ0VMVCBmcmFtZSBzaXplOiAlZFxuIiwKKyAgICBmLT5zaXplID0gYXZfbG9nMihmcmFtZV9zaXplIC8gQ0VMVF9TSE9SVF9CTE9DS1NJWkUpOworICAgIGlmIChmLT5zaXplID4gQ0VMVF9NQVhfTE9HX0JMT0NLUyB8fAorICAgICAgICBmcmFtZV9zaXplICE9IENFTFRfU0hPUlRfQkxPQ0tTSVpFICogKDEgPDwgZi0+c2l6ZSkpIHsKKyAgICAgICAgYXZfbG9nKGYtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIENFTFQgZnJhbWUgc2l6ZTogJWRcbiIsCiAgICAgICAgICAgICAgICBmcmFtZV9zaXplKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKCFzLT5vdXRwdXRfY2hhbm5lbHMpCi0gICAgICAgIHMtPm91dHB1dF9jaGFubmVscyA9IGNvZGVkX2NoYW5uZWxzOworICAgIGlmICghZi0+b3V0cHV0X2NoYW5uZWxzKQorICAgICAgICBmLT5vdXRwdXRfY2hhbm5lbHMgPSBjaGFubmVsczsKIAotICAgIG1lbXNldChzLT5mcmFtZVswXS5jb2xsYXBzZV9tYXNrcywgMCwgc2l6ZW9mKHMtPmZyYW1lWzBdLmNvbGxhcHNlX21hc2tzKSk7Ci0gICAgbWVtc2V0KHMtPmZyYW1lWzFdLmNvbGxhcHNlX21hc2tzLCAwLCBzaXplb2Yocy0+ZnJhbWVbMV0uY29sbGFwc2VfbWFza3MpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZi0+Y2hhbm5lbHM7IGkrKykgeworICAgICAgICBtZW1zZXQoZi0+YmxvY2tbaV0uY29lZmZzLCAgICAgICAgIDAsIHNpemVvZihmLT5ibG9ja1tpXS5jb2VmZnMpKTsKKyAgICAgICAgbWVtc2V0KGYtPmJsb2NrW2ldLmNvbGxhcHNlX21hc2tzLCAwLCBzaXplb2YoZi0+YmxvY2tbaV0uY29sbGFwc2VfbWFza3MpKTsKKyAgICB9CiAKICAgICBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbChyYyk7CiAKICAgICAvKiBvYnRhaW4gc2lsZW5jZSBmbGFnICovCi0gICAgaWYgKGNvbnN1bWVkID49IHMtPmZyYW1lYml0cykKLSAgICAgICAgc2lsZW5jZSA9IDE7CisgICAgaWYgKGNvbnN1bWVkID49IGYtPmZyYW1lYml0cykKKyAgICAgICAgZi0+c2lsZW5jZSA9IDE7CiAgICAgZWxzZSBpZiAoY29uc3VtZWQgPT0gMSkKLSAgICAgICAgc2lsZW5jZSA9IG9wdXNfcmNfcDJtb2RlbChyYywgMTUpOworICAgICAgICBmLT5zaWxlbmNlID0gZmZfb3B1c19yY19kZWNfbG9nKHJjLCAxNSk7CiAKIAotICAgIGlmIChzaWxlbmNlKSB7Ci0gICAgICAgIGNvbnN1bWVkID0gcy0+ZnJhbWViaXRzOwotICAgICAgICByYy0+dG90YWxfcmVhZF9iaXRzICs9IHMtPmZyYW1lYml0cyAtIG9wdXNfcmNfdGVsbChyYyk7CisgICAgaWYgKGYtPnNpbGVuY2UpIHsKKyAgICAgICAgY29uc3VtZWQgPSBmLT5mcmFtZWJpdHM7CisgICAgICAgIHJjLT50b3RhbF9iaXRzICs9IGYtPmZyYW1lYml0cyAtIG9wdXNfcmNfdGVsbChyYyk7CiAgICAgfQogCiAgICAgLyogb2J0YWluIHBvc3QtZmlsdGVyIG9wdGlvbnMgKi8KLSAgICBjb25zdW1lZCA9IHBhcnNlX3Bvc3RmaWx0ZXIocywgcmMsIGNvbnN1bWVkKTsKKyAgICBjb25zdW1lZCA9IHBhcnNlX3Bvc3RmaWx0ZXIoZiwgcmMsIGNvbnN1bWVkKTsKIAogICAgIC8qIG9idGFpbiB0cmFuc2llbnQgZmxhZyAqLwotICAgIGlmIChzLT5kdXJhdGlvbiAhPSAwICYmIGNvbnN1bWVkKzMgPD0gcy0+ZnJhbWViaXRzKQotICAgICAgICB0cmFuc2llbnQgPSBvcHVzX3JjX3AybW9kZWwocmMsIDMpOworICAgIGlmIChmLT5zaXplICE9IDAgJiYgY29uc3VtZWQrMyA8PSBmLT5mcmFtZWJpdHMpCisgICAgICAgIGYtPnRyYW5zaWVudCA9IGZmX29wdXNfcmNfZGVjX2xvZyhyYywgMyk7CiAKLSAgICBzLT5ibG9ja3MgICAgPSB0cmFuc2llbnQgPyAxIDw8IHMtPmR1cmF0aW9uIDogMTsKLSAgICBzLT5ibG9ja3NpemUgPSBmcmFtZV9zaXplIC8gcy0+YmxvY2tzOworICAgIGYtPmJsb2NrcyAgICA9IGYtPnRyYW5zaWVudCA/IDEgPDwgZi0+c2l6ZSA6IDE7CisgICAgZi0+YmxvY2tzaXplID0gZnJhbWVfc2l6ZSAvIGYtPmJsb2NrczsKIAotICAgIGltZGN0ID0gcy0+aW1kY3RbdHJhbnNpZW50ID8gMCA6IHMtPmR1cmF0aW9uXTsKKyAgICBpbWRjdCA9IGYtPmltZGN0W2YtPnRyYW5zaWVudCA/IDAgOiBmLT5zaXplXTsKIAotICAgIGlmIChjb2RlZF9jaGFubmVscyA9PSAxKSB7CisgICAgaWYgKGNoYW5uZWxzID09IDEpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspCi0gICAgICAgICAgICBzLT5mcmFtZVswXS5lbmVyZ3lbaV0gPSBGRk1BWChzLT5mcmFtZVswXS5lbmVyZ3lbaV0sIHMtPmZyYW1lWzFdLmVuZXJneVtpXSk7CisgICAgICAgICAgICBmLT5ibG9ja1swXS5lbmVyZ3lbaV0gPSBGRk1BWChmLT5ibG9ja1swXS5lbmVyZ3lbaV0sIGYtPmJsb2NrWzFdLmVuZXJneVtpXSk7CiAgICAgfQogCi0gICAgY2VsdF9kZWNvZGVfY29hcnNlX2VuZXJneShzLCByYyk7Ci0gICAgY2VsdF9kZWNvZGVfdGZfY2hhbmdlcyAgIChzLCByYywgdHJhbnNpZW50KTsKLSAgICBjZWx0X2RlY29kZV9hbGxvY2F0aW9uICAgKHMsIHJjKTsKLSAgICBjZWx0X2RlY29kZV9maW5lX2VuZXJneSAgKHMsIHJjKTsKLSAgICBjZWx0X2RlY29kZV9iYW5kcyAgICAgICAgKHMsIHJjKTsKKyAgICBjZWx0X2RlY29kZV9jb2Fyc2VfZW5lcmd5KGYsIHJjKTsKKyAgICBjZWx0X2RlY29kZV90Zl9jaGFuZ2VzICAgKGYsIHJjKTsKKyAgICBmZl9jZWx0X2JpdGFsbG9jICAgICAgICAgKGYsIHJjLCAwKTsKKyAgICBjZWx0X2RlY29kZV9maW5lX2VuZXJneSAgKGYsIHJjKTsKKyAgICBmZl9jZWx0X3F1YW50X2JhbmRzICAgICAgKGYsIHJjKTsKIAotICAgIGlmIChzLT5hbnRpY29sbGFwc2VfYml0KQotICAgICAgICBhbnRpY29sbGFwc2UgPSBvcHVzX2dldHJhd2JpdHMocmMsIDEpOworICAgIGlmIChmLT5hbnRpY29sbGFwc2VfbmVlZGVkKQorICAgICAgICBmLT5hbnRpY29sbGFwc2UgPSBmZl9vcHVzX3JjX2dldF9yYXcocmMsIDEpOwogCi0gICAgY2VsdF9kZWNvZGVfZmluYWxfZW5lcmd5KHMsIHJjLCBzLT5mcmFtZWJpdHMgLSBvcHVzX3JjX3RlbGwocmMpKTsKKyAgICBjZWx0X2RlY29kZV9maW5hbF9lbmVyZ3koZiwgcmMpOwogCiAgICAgLyogYXBwbHkgYW50aS1jb2xsYXBzZSBwcm9jZXNzaW5nIGFuZCBkZW5vcm1hbGl6YXRpb24gdG8KICAgICAgKiBlYWNoIGNvZGVkIGNoYW5uZWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+Y29kZWRfY2hhbm5lbHM7IGkrKykgewotICAgICAgICBDZWx0RnJhbWUgKmZyYW1lID0gJnMtPmZyYW1lW2ldOworICAgIGZvciAoaSA9IDA7IGkgPCBmLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIENlbHRCbG9jayAqYmxvY2sgPSAmZi0+YmxvY2tbaV07CiAKLSAgICAgICAgaWYgKGFudGljb2xsYXBzZSkKLSAgICAgICAgICAgIHByb2Nlc3NfYW50aWNvbGxhcHNlKHMsIGZyYW1lLCBzLT5jb2VmZnNbaV0pOworICAgICAgICBpZiAoZi0+YW50aWNvbGxhcHNlKQorICAgICAgICAgICAgcHJvY2Vzc19hbnRpY29sbGFwc2UoZiwgYmxvY2ssIGYtPmJsb2NrW2ldLmNvZWZmcyk7CiAKLSAgICAgICAgY2VsdF9kZW5vcm1hbGl6ZShzLCBmcmFtZSwgcy0+Y29lZmZzW2ldKTsKKyAgICAgICAgY2VsdF9kZW5vcm1hbGl6ZShmLCBibG9jaywgZi0+YmxvY2tbaV0uY29lZmZzKTsKICAgICB9CiAKICAgICAvKiBzdGVyZW8gLT4gbW9ubyBkb3dubWl4ICovCi0gICAgaWYgKHMtPm91dHB1dF9jaGFubmVscyA8IHMtPmNvZGVkX2NoYW5uZWxzKSB7Ci0gICAgICAgIHMtPmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyKHMtPmNvZWZmc1swXSwgcy0+Y29lZmZzWzFdLCAxLjAsIEZGQUxJR04oZnJhbWVfc2l6ZSwgMTYpKTsKLSAgICAgICAgaW1kY3Rfc2NhbGUgPSAwLjU7Ci0gICAgfSBlbHNlIGlmIChzLT5vdXRwdXRfY2hhbm5lbHMgPiBzLT5jb2RlZF9jaGFubmVscykKLSAgICAgICAgbWVtY3B5KHMtPmNvZWZmc1sxXSwgcy0+Y29lZmZzWzBdLCBmcmFtZV9zaXplICogc2l6ZW9mKGZsb2F0KSk7CisgICAgaWYgKGYtPm91dHB1dF9jaGFubmVscyA8IGYtPmNoYW5uZWxzKSB7CisgICAgICAgIGYtPmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyKGYtPmJsb2NrWzBdLmNvZWZmcywgZi0+YmxvY2tbMV0uY29lZmZzLCAxLjAsIEZGQUxJR04oZnJhbWVfc2l6ZSwgMTYpKTsKKyAgICAgICAgZG93bm1peCA9IDE7CisgICAgfSBlbHNlIGlmIChmLT5vdXRwdXRfY2hhbm5lbHMgPiBmLT5jaGFubmVscykKKyAgICAgICAgbWVtY3B5KGYtPmJsb2NrWzFdLmNvZWZmcywgZi0+YmxvY2tbMF0uY29lZmZzLCBmcmFtZV9zaXplICogc2l6ZW9mKGZsb2F0KSk7CiAKLSAgICBpZiAoc2lsZW5jZSkgeworICAgIGlmIChmLT5zaWxlbmNlKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgICAgIENlbHRGcmFtZSAqZnJhbWUgPSAmcy0+ZnJhbWVbaV07CisgICAgICAgICAgICBDZWx0QmxvY2sgKmJsb2NrID0gJmYtPmJsb2NrW2ldOwogCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgRkZfQVJSQVlfRUxFTVMoZnJhbWUtPmVuZXJneSk7IGorKykKLSAgICAgICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2pdID0gQ0VMVF9FTkVSR1lfU0lMRU5DRTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBGRl9BUlJBWV9FTEVNUyhibG9jay0+ZW5lcmd5KTsgaisrKQorICAgICAgICAgICAgICAgIGJsb2NrLT5lbmVyZ3lbal0gPSBDRUxUX0VORVJHWV9TSUxFTkNFOwogICAgICAgICB9Ci0gICAgICAgIG1lbXNldChzLT5jb2VmZnMsIDAsIHNpemVvZihzLT5jb2VmZnMpKTsKKyAgICAgICAgbWVtc2V0KGYtPmJsb2NrWzBdLmNvZWZmcywgMCwgc2l6ZW9mKGYtPmJsb2NrWzBdLmNvZWZmcykpOworICAgICAgICBtZW1zZXQoZi0+YmxvY2tbMV0uY29lZmZzLCAwLCBzaXplb2YoZi0+YmxvY2tbMV0uY29lZmZzKSk7CiAgICAgfQogCiAgICAgLyogdHJhbnNmb3JtIGFuZCBvdXRwdXQgZm9yIGVhY2ggb3V0cHV0IGNoYW5uZWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+b3V0cHV0X2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgQ2VsdEZyYW1lICpmcmFtZSA9ICZzLT5mcmFtZVtpXTsKLSAgICAgICAgZmxvYXQgbSA9IGZyYW1lLT5kZWVtcGhfY29lZmY7CisgICAgZm9yIChpID0gMDsgaSA8IGYtPm91dHB1dF9jaGFubmVsczsgaSsrKSB7CisgICAgICAgIENlbHRCbG9jayAqYmxvY2sgPSAmZi0+YmxvY2tbaV07CisgICAgICAgIGZsb2F0IG0gPSBibG9jay0+ZW1waF9jb2VmZjsKIAogICAgICAgICAvKiBpTURDVCBhbmQgb3ZlcmxhcC1hZGQgKi8KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmJsb2NrczsgaisrKSB7Ci0gICAgICAgICAgICBmbG9hdCAqZHN0ICA9IGZyYW1lLT5idWYgKyAxMDI0ICsgaiAqIHMtPmJsb2Nrc2l6ZTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGYtPmJsb2NrczsgaisrKSB7CisgICAgICAgICAgICBmbG9hdCAqZHN0ICA9IGJsb2NrLT5idWYgKyAxMDI0ICsgaiAqIGYtPmJsb2Nrc2l6ZTsKIAotICAgICAgICAgICAgaW1kY3QtPmltZGN0X2hhbGYoaW1kY3QsIGRzdCArIENFTFRfT1ZFUkxBUCAvIDIsIHMtPmNvZWZmc1tpXSArIGosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9ja3MsIGltZGN0X3NjYWxlKTsKLSAgICAgICAgICAgIHMtPmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93KGRzdCwgZHN0LCBkc3QgKyBDRUxUX09WRVJMQVAgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWx0X3dpbmRvdywgQ0VMVF9PVkVSTEFQIC8gMik7CisgICAgICAgICAgICBpbWRjdC0+aW1kY3RfaGFsZihpbWRjdCwgZHN0ICsgQ0VMVF9PVkVSTEFQIC8gMiwgZi0+YmxvY2tbaV0uY29lZmZzICsgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmJsb2Nrcyk7CisgICAgICAgICAgICBmLT5kc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhkc3QsIGRzdCwgZHN0ICsgQ0VMVF9PVkVSTEFQIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NlbHRfd2luZG93LCBDRUxUX09WRVJMQVAgLyAyKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChkb3dubWl4KQorICAgICAgICAgICAgZi0+ZHNwLT52ZWN0b3JfZm11bF9zY2FsYXIoJmJsb2NrLT5idWZbMTAyNF0sICZibG9jay0+YnVmWzEwMjRdLCAwLjVmLCBmcmFtZV9zaXplKTsKKwogICAgICAgICAvKiBwb3N0ZmlsdGVyICovCi0gICAgICAgIGNlbHRfcG9zdGZpbHRlcihzLCBmcmFtZSk7CisgICAgICAgIGNlbHRfcG9zdGZpbHRlcihmLCBibG9jayk7CiAKICAgICAgICAgLyogZGVlbXBoYXNpcyBhbmQgb3V0cHV0IHNjYWxpbmcgKi8KICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZyYW1lX3NpemU7IGorKykgewotICAgICAgICAgICAgZmxvYXQgdG1wID0gZnJhbWUtPmJ1ZlsxMDI0IC0gZnJhbWVfc2l6ZSArIGpdICsgbTsKLSAgICAgICAgICAgIG0gPSB0bXAgKiBDRUxUX0RFRU1QSF9DT0VGRjsKLSAgICAgICAgICAgIG91dHB1dFtpXVtqXSA9IHRtcCAvIDMyNzY4LjsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHRtcCA9IGJsb2NrLT5idWZbMTAyNCAtIGZyYW1lX3NpemUgKyBqXSArIG07CisgICAgICAgICAgICBtID0gdG1wICogQ0VMVF9FTVBIX0NPRUZGOworICAgICAgICAgICAgb3V0cHV0W2ldW2pdID0gdG1wOwogICAgICAgICB9Ci0gICAgICAgIGZyYW1lLT5kZWVtcGhfY29lZmYgPSBtOworCisgICAgICAgIGJsb2NrLT5lbXBoX2NvZWZmID0gbTsKICAgICB9CiAKLSAgICBpZiAoY29kZWRfY2hhbm5lbHMgPT0gMSkKLSAgICAgICAgbWVtY3B5KHMtPmZyYW1lWzFdLmVuZXJneSwgcy0+ZnJhbWVbMF0uZW5lcmd5LCBzaXplb2Yocy0+ZnJhbWVbMF0uZW5lcmd5KSk7CisgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgICAgIG1lbWNweShmLT5ibG9ja1sxXS5lbmVyZ3ksIGYtPmJsb2NrWzBdLmVuZXJneSwgc2l6ZW9mKGYtPmJsb2NrWzBdLmVuZXJneSkpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKyApIHsKLSAgICAgICAgQ2VsdEZyYW1lICpmcmFtZSA9ICZzLT5mcmFtZVtpXTsKKyAgICAgICAgQ2VsdEJsb2NrICpibG9jayA9ICZmLT5ibG9ja1tpXTsKIAotICAgICAgICBpZiAoIXRyYW5zaWVudCkgewotICAgICAgICAgICAgbWVtY3B5KGZyYW1lLT5wcmV2X2VuZXJneVsxXSwgZnJhbWUtPnByZXZfZW5lcmd5WzBdLCBzaXplb2YoZnJhbWUtPnByZXZfZW5lcmd5WzBdKSk7Ci0gICAgICAgICAgICBtZW1jcHkoZnJhbWUtPnByZXZfZW5lcmd5WzBdLCBmcmFtZS0+ZW5lcmd5LCAgICAgICAgIHNpemVvZihmcmFtZS0+cHJldl9lbmVyZ3lbMF0pKTsKKyAgICAgICAgaWYgKCFmLT50cmFuc2llbnQpIHsKKyAgICAgICAgICAgIG1lbWNweShibG9jay0+cHJldl9lbmVyZ3lbMV0sIGJsb2NrLT5wcmV2X2VuZXJneVswXSwgc2l6ZW9mKGJsb2NrLT5wcmV2X2VuZXJneVswXSkpOworICAgICAgICAgICAgbWVtY3B5KGJsb2NrLT5wcmV2X2VuZXJneVswXSwgYmxvY2stPmVuZXJneSwgICAgICAgICBzaXplb2YoYmxvY2stPnByZXZfZW5lcmd5WzBdKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgQ0VMVF9NQVhfQkFORFM7IGorKykKLSAgICAgICAgICAgICAgICBmcmFtZS0+cHJldl9lbmVyZ3lbMF1bal0gPSBGRk1JTihmcmFtZS0+cHJldl9lbmVyZ3lbMF1bal0sIGZyYW1lLT5lbmVyZ3lbal0pOworICAgICAgICAgICAgICAgIGJsb2NrLT5wcmV2X2VuZXJneVswXVtqXSA9IEZGTUlOKGJsb2NrLT5wcmV2X2VuZXJneVswXVtqXSwgYmxvY2stPmVuZXJneVtqXSk7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+c3RhcnRiYW5kOyBqKyspIHsKLSAgICAgICAgICAgIGZyYW1lLT5wcmV2X2VuZXJneVswXVtqXSA9IENFTFRfRU5FUkdZX1NJTEVOQ0U7Ci0gICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2pdICAgICAgICAgPSAwLjA7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmLT5zdGFydF9iYW5kOyBqKyspIHsKKyAgICAgICAgICAgIGJsb2NrLT5wcmV2X2VuZXJneVswXVtqXSA9IENFTFRfRU5FUkdZX1NJTEVOQ0U7CisgICAgICAgICAgICBibG9jay0+ZW5lcmd5W2pdICAgICAgICAgPSAwLjA7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChqID0gcy0+ZW5kYmFuZDsgaiA8IENFTFRfTUFYX0JBTkRTOyBqKyspIHsKLSAgICAgICAgICAgIGZyYW1lLT5wcmV2X2VuZXJneVswXVtqXSA9IENFTFRfRU5FUkdZX1NJTEVOQ0U7Ci0gICAgICAgICAgICBmcmFtZS0+ZW5lcmd5W2pdICAgICAgICAgPSAwLjA7CisgICAgICAgIGZvciAoaiA9IGYtPmVuZF9iYW5kOyBqIDwgQ0VMVF9NQVhfQkFORFM7IGorKykgeworICAgICAgICAgICAgYmxvY2stPnByZXZfZW5lcmd5WzBdW2pdID0gQ0VMVF9FTkVSR1lfU0lMRU5DRTsKKyAgICAgICAgICAgIGJsb2NrLT5lbmVyZ3lbal0gICAgICAgICA9IDAuMDsKICAgICAgICAgfQogICAgIH0KIAotICAgIHMtPnNlZWQgPSByYy0+cmFuZ2U7CisgICAgZi0+c2VlZCA9IHJjLT5yYW5nZTsKIAogICAgIHJldHVybiAwOwogfQogCi12b2lkIGZmX2NlbHRfZmx1c2goQ2VsdENvbnRleHQgKnMpCit2b2lkIGZmX2NlbHRfZmx1c2goQ2VsdEZyYW1lICpmKQogewogICAgIGludCBpLCBqOwogCi0gICAgaWYgKHMtPmZsdXNoZWQpCisgICAgaWYgKGYtPmZsdXNoZWQpCiAgICAgICAgIHJldHVybjsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgQ2VsdEZyYW1lICpmcmFtZSA9ICZzLT5mcmFtZVtpXTsKKyAgICAgICAgQ2VsdEJsb2NrICpibG9jayA9ICZmLT5ibG9ja1tpXTsKIAogICAgICAgICBmb3IgKGogPSAwOyBqIDwgQ0VMVF9NQVhfQkFORFM7IGorKykKLSAgICAgICAgICAgIGZyYW1lLT5wcmV2X2VuZXJneVswXVtqXSA9IGZyYW1lLT5wcmV2X2VuZXJneVsxXVtqXSA9IENFTFRfRU5FUkdZX1NJTEVOQ0U7CisgICAgICAgICAgICBibG9jay0+cHJldl9lbmVyZ3lbMF1bal0gPSBibG9jay0+cHJldl9lbmVyZ3lbMV1bal0gPSBDRUxUX0VORVJHWV9TSUxFTkNFOwogCi0gICAgICAgIG1lbXNldChmcmFtZS0+ZW5lcmd5LCAwLCBzaXplb2YoZnJhbWUtPmVuZXJneSkpOwotICAgICAgICBtZW1zZXQoZnJhbWUtPmJ1ZiwgICAgMCwgc2l6ZW9mKGZyYW1lLT5idWYpKTsKKyAgICAgICAgbWVtc2V0KGJsb2NrLT5lbmVyZ3ksIDAsIHNpemVvZihibG9jay0+ZW5lcmd5KSk7CisgICAgICAgIG1lbXNldChibG9jay0+YnVmLCAgICAwLCBzaXplb2YoYmxvY2stPmJ1ZikpOwogCi0gICAgICAgIG1lbXNldChmcmFtZS0+cGZfZ2FpbnMsICAgICAwLCBzaXplb2YoZnJhbWUtPnBmX2dhaW5zKSk7Ci0gICAgICAgIG1lbXNldChmcmFtZS0+cGZfZ2FpbnNfb2xkLCAwLCBzaXplb2YoZnJhbWUtPnBmX2dhaW5zX29sZCkpOwotICAgICAgICBtZW1zZXQoZnJhbWUtPnBmX2dhaW5zX25ldywgMCwgc2l6ZW9mKGZyYW1lLT5wZl9nYWluc19uZXcpKTsKKyAgICAgICAgbWVtc2V0KGJsb2NrLT5wZl9nYWlucywgICAgIDAsIHNpemVvZihibG9jay0+cGZfZ2FpbnMpKTsKKyAgICAgICAgbWVtc2V0KGJsb2NrLT5wZl9nYWluc19vbGQsIDAsIHNpemVvZihibG9jay0+cGZfZ2FpbnNfb2xkKSk7CisgICAgICAgIG1lbXNldChibG9jay0+cGZfZ2FpbnNfbmV3LCAwLCBzaXplb2YoYmxvY2stPnBmX2dhaW5zX25ldykpOwogCi0gICAgICAgIGZyYW1lLT5kZWVtcGhfY29lZmYgPSAwLjA7CisgICAgICAgIGJsb2NrLT5lbXBoX2NvZWZmID0gMC4wOwogICAgIH0KLSAgICBzLT5zZWVkID0gMDsKKyAgICBmLT5zZWVkID0gMDsKIAotICAgIHMtPmZsdXNoZWQgPSAxOworICAgIGYtPmZsdXNoZWQgPSAxOwogfQogCi12b2lkIGZmX2NlbHRfZnJlZShDZWx0Q29udGV4dCAqKnBzKQordm9pZCBmZl9jZWx0X2ZyZWUoQ2VsdEZyYW1lICoqZikKIHsKLSAgICBDZWx0Q29udGV4dCAqcyA9ICpwczsKKyAgICBDZWx0RnJhbWUgKmZybSA9ICpmOwogICAgIGludCBpOwogCi0gICAgaWYgKCFzKQorICAgIGlmICghZnJtKQogICAgICAgICByZXR1cm47CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+aW1kY3QpOyBpKyspCi0gICAgICAgIGZmX2ltZGN0MTVfdW5pbml0KCZzLT5pbWRjdFtpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGZybS0+aW1kY3QpOyBpKyspCisgICAgICAgIGZmX21kY3QxNV91bmluaXQoJmZybS0+aW1kY3RbaV0pOwogCi0gICAgYXZfZnJlZXAoJnMtPmRzcCk7Ci0gICAgYXZfZnJlZXAocHMpOworICAgIGZmX2NlbHRfcHZxX3VuaW5pdCgmZnJtLT5wdnEpOworCisgICAgYXZfZnJlZXAoJmZybS0+ZHNwKTsKKyAgICBhdl9mcmVlcChmKTsKIH0KIAotaW50IGZmX2NlbHRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIENlbHRDb250ZXh0ICoqcHMsIGludCBvdXRwdXRfY2hhbm5lbHMpCitpbnQgZmZfY2VsdF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQ2VsdEZyYW1lICoqZiwgaW50IG91dHB1dF9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgaW50IGFwcGx5X3BoYXNlX2ludikKIHsKLSAgICBDZWx0Q29udGV4dCAqczsKKyAgICBDZWx0RnJhbWUgKmZybTsKICAgICBpbnQgaSwgcmV0OwogCiAgICAgaWYgKG91dHB1dF9jaGFubmVscyAhPSAxICYmIG91dHB1dF9jaGFubmVscyAhPSAyKSB7CkBAIC0yMTk3LDMxICs1NzUsMzMgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBzID0gYXZfbWFsbG9jeihzaXplb2YoKnMpKTsKLSAgICBpZiAoIXMpCisgICAgZnJtID0gYXZfbWFsbG9jeihzaXplb2YoKmZybSkpOworICAgIGlmICghZnJtKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgcy0+YXZjdHggICAgICAgICAgID0gYXZjdHg7Ci0gICAgcy0+b3V0cHV0X2NoYW5uZWxzID0gb3V0cHV0X2NoYW5uZWxzOworICAgIGZybS0+YXZjdHggICAgICAgICAgID0gYXZjdHg7CisgICAgZnJtLT5vdXRwdXRfY2hhbm5lbHMgPSBvdXRwdXRfY2hhbm5lbHM7CisgICAgZnJtLT5hcHBseV9waGFzZV9pbnYgPSBhcHBseV9waGFzZV9pbnY7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+aW1kY3QpOyBpKyspIHsKLSAgICAgICAgcmV0ID0gZmZfaW1kY3QxNV9pbml0KCZzLT5pbWRjdFtpXSwgaSArIDMpOwotICAgICAgICBpZiAocmV0IDwgMCkKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZnJtLT5pbWRjdCk7IGkrKykKKyAgICAgICAgaWYgKChyZXQgPSBmZl9tZGN0MTVfaW5pdCgmZnJtLT5pbWRjdFtpXSwgMSwgaSArIDMsIC0xLjBmLzMyNzY4KSkgPCAwKQogICAgICAgICAgICAgZ290byBmYWlsOwotICAgIH0KIAotICAgIHMtPmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19CSVRFWEFDVCk7Ci0gICAgaWYgKCFzLT5kc3ApIHsKKyAgICBpZiAoKHJldCA9IGZmX2NlbHRfcHZxX2luaXQoJmZybS0+cHZxLCAwKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmcm0tPmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19CSVRFWEFDVCk7CisgICAgaWYgKCFmcm0tPmRzcCkgewogICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBmZl9jZWx0X2ZsdXNoKHMpOworICAgIGZmX2NlbHRfZmx1c2goZnJtKTsKIAotICAgICpwcyA9IHM7CisgICAgKmYgPSBmcm07CiAKICAgICByZXR1cm4gMDsKIGZhaWw6Ci0gICAgZmZfY2VsdF9mcmVlKCZzKTsKKyAgICBmZl9jZWx0X2ZyZWUoJmZybSk7CiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvb3B1c19jZWx0LmggYi9saWJhdmNvZGVjL29wdXNfY2VsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODlhMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL29wdXNfY2VsdC5oCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogT3B1cyBkZWNvZGVyL2RlbXV4ZXIgY29tbW9uIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJldyBEJ0FkZGVzaW8KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX09QVVNfQ0VMVF9ICisjZGVmaW5lIEFWQ09ERUNfT1BVU19DRUxUX0gKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJvcHVzLmgiCisjaW5jbHVkZSAib3B1c19wdnEuaCIKKworI2luY2x1ZGUgIm1kY3QxNS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorCisjZGVmaW5lIENFTFRfVkVDVE9SUyAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgQ0VMVF9BTExPQ19TVEVQUyAgICAgICAgICAgICA2CisjZGVmaW5lIENFTFRfRklORV9PRkZTRVQgICAgICAgICAgICAgMjEKKyNkZWZpbmUgQ0VMVF9NQVhfRklORV9CSVRTICAgICAgICAgICA4CisjZGVmaW5lIENFTFRfTk9STV9TQ0FMRSAgICAgICAgICAgICAgMTYzODQKKyNkZWZpbmUgQ0VMVF9RVEhFVEFfT0ZGU0VUICAgICAgICAgICA0CisjZGVmaW5lIENFTFRfUVRIRVRBX09GRlNFVF9UV09QSEFTRSAgMTYKKyNkZWZpbmUgQ0VMVF9FTVBIX0NPRUZGICAgICAgICAgICAgICAwLjg1MDAwNjEwZgorI2RlZmluZSBDRUxUX1BPU1RGSUxURVJfTUlOUEVSSU9EICAgIDE1CisjZGVmaW5lIENFTFRfRU5FUkdZX1NJTEVOQ0UgICAgICAgICAgKC0yOC4wZikKKwordHlwZWRlZiBzdHJ1Y3QgQ2VsdFBWUSBDZWx0UFZROworCitlbnVtIENlbHRTcHJlYWQgeworICAgIENFTFRfU1BSRUFEX05PTkUsCisgICAgQ0VMVF9TUFJFQURfTElHSFQsCisgICAgQ0VMVF9TUFJFQURfTk9STUFMLAorICAgIENFTFRfU1BSRUFEX0FHR1JFU1NJVkUKK307CisKK2VudW0gQ2VsdEJsb2NrU2l6ZSB7CisgICAgQ0VMVF9CTE9DS18xMjAsCisgICAgQ0VMVF9CTE9DS18yNDAsCisgICAgQ0VMVF9CTE9DS180ODAsCisgICAgQ0VMVF9CTE9DS185NjAsCisKKyAgICBDRUxUX0JMT0NLX05CCit9OworCit0eXBlZGVmIHN0cnVjdCBDZWx0QmxvY2sgeworICAgIGZsb2F0IGVuZXJneVtDRUxUX01BWF9CQU5EU107CisgICAgZmxvYXQgbGluX2VuZXJneVtDRUxUX01BWF9CQU5EU107CisgICAgZmxvYXQgZXJyb3JfZW5lcmd5W0NFTFRfTUFYX0JBTkRTXTsKKyAgICBmbG9hdCBwcmV2X2VuZXJneVsyXVtDRUxUX01BWF9CQU5EU107CisKKyAgICB1aW50OF90IGNvbGxhcHNlX21hc2tzW0NFTFRfTUFYX0JBTkRTXTsKKworICAgIC8qIGJ1ZmZlciBmb3IgbWRjdCBvdXRwdXQgKyBwb3N0ZmlsdGVyICovCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgYnVmKVsyMDQ4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBjb2VmZnMpW0NFTFRfTUFYX0ZSQU1FX1NJWkVdOworCisgICAgLyogVXNlZCBieSB0aGUgZW5jb2RlciAqLworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIG92ZXJsYXApW0ZGQUxJR04oQ0VMVF9PVkVSTEFQLCAxNildOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgZmxvYXQsIHNhbXBsZXMpW0ZGQUxJR04oQ0VMVF9NQVhfRlJBTUVfU0laRSwgMTYpXTsKKworICAgIC8qIHBvc3RmaWx0ZXIgcGFyYW1ldGVycyAqLworICAgIGludCAgIHBmX3BlcmlvZF9uZXc7CisgICAgZmxvYXQgcGZfZ2FpbnNfbmV3WzNdOworICAgIGludCAgIHBmX3BlcmlvZDsKKyAgICBmbG9hdCBwZl9nYWluc1szXTsKKyAgICBpbnQgICBwZl9wZXJpb2Rfb2xkOworICAgIGZsb2F0IHBmX2dhaW5zX29sZFszXTsKKworICAgIGZsb2F0IGVtcGhfY29lZmY7Cit9IENlbHRCbG9jazsKKworc3RydWN0IENlbHRGcmFtZSB7CisgICAgLy8gY29uc3RhbnQgdmFsdWVzIHRoYXQgZG8gbm90IGNoYW5nZSBkdXJpbmcgY29udGV4dCBsaWZldGltZQorICAgIEFWQ29kZWNDb250ZXh0ICAgICAgKmF2Y3R4OworICAgIE1EQ1QxNUNvbnRleHQgICAgICAgKmltZGN0WzRdOworICAgIEFWRmxvYXREU1BDb250ZXh0ICAgKmRzcDsKKyAgICBDZWx0QmxvY2sgICAgICAgICAgIGJsb2NrWzJdOworICAgIENlbHRQVlEgICAgICAgICAgICAgKnB2cTsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IG91dHB1dF9jaGFubmVsczsKKyAgICBpbnQgYXBwbHlfcGhhc2VfaW52OworCisgICAgZW51bSBDZWx0QmxvY2tTaXplIHNpemU7CisgICAgaW50IHN0YXJ0X2JhbmQ7CisgICAgaW50IGVuZF9iYW5kOworICAgIGludCBjb2RlZF9iYW5kczsKKyAgICBpbnQgdHJhbnNpZW50OworICAgIGludCBwZmlsdGVyOworICAgIGludCBza2lwX2JhbmRfZmxvb3I7CisgICAgaW50IHRmX3NlbGVjdDsKKyAgICBpbnQgYWxsb2NfdHJpbTsKKyAgICBpbnQgYWxsb2NfYm9vc3RbQ0VMVF9NQVhfQkFORFNdOworICAgIGludCBibG9ja3M7ICAgICAgICAvKiBudW1iZXIgb2YgaU1EQ1QgYmxvY2tzIGluIHRoZSBmcmFtZSwgZGVwZW5kcyBvbiB0cmFuc2llbnQgKi8KKyAgICBpbnQgYmxvY2tzaXplOyAgICAgLyogc2l6ZSBvZiBlYWNoIGJsb2NrICovCisgICAgaW50IHNpbGVuY2U7ICAgICAgIC8qIEZyYW1lIGlzIGZpbGxlZCB3aXRoIHNpbGVuY2UgKi8KKyAgICBpbnQgYW50aWNvbGxhcHNlX25lZWRlZDsgLyogV2hldGhlciB0byBleHBlY3QgYW4gYW50aWNvbGxhcHNlIGJpdCAqLworICAgIGludCBhbnRpY29sbGFwc2U7ICAvKiBFbmNvZGVkIGFudGljb2xsYXBzZSBiaXQgKi8KKyAgICBpbnQgaW50ZW5zaXR5X3N0ZXJlbzsKKyAgICBpbnQgZHVhbF9zdGVyZW87CisgICAgaW50IGZsdXNoZWQ7CisgICAgdWludDMyX3Qgc2VlZDsKKyAgICBlbnVtIENlbHRTcHJlYWQgc3ByZWFkOworCisgICAgLyogRW5jb2RlciBQRiBjb2VmZnMgKi8KKyAgICBpbnQgcGZfb2N0YXZlOworICAgIGludCBwZl9wZXJpb2Q7CisgICAgaW50IHBmX3RhcHNldDsKKyAgICBmbG9hdCBwZl9nYWluOworCisgICAgLyogQml0IGFsbG9jYXRpb24gKi8KKyAgICBpbnQgZnJhbWViaXRzOworICAgIGludCByZW1haW5pbmc7CisgICAgaW50IHJlbWFpbmluZzI7CisgICAgaW50IGNhcHMgICAgICAgICBbQ0VMVF9NQVhfQkFORFNdOworICAgIGludCBmaW5lX2JpdHMgICAgW0NFTFRfTUFYX0JBTkRTXTsKKyAgICBpbnQgZmluZV9wcmlvcml0eVtDRUxUX01BWF9CQU5EU107CisgICAgaW50IHB1bHNlcyAgICAgICBbQ0VMVF9NQVhfQkFORFNdOworICAgIGludCB0Zl9jaGFuZ2UgICAgW0NFTFRfTUFYX0JBTkRTXTsKK307CisKKy8qIExDRyBmb3Igbm9pc2UgZ2VuZXJhdGlvbiAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgY2VsdF9ybmcoQ2VsdEZyYW1lICpmKQoreworICAgIGYtPnNlZWQgPSAxNjY0NTI1ICogZi0+c2VlZCArIDEwMTM5MDQyMjM7CisgICAgcmV0dXJuIGYtPnNlZWQ7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgY2VsdF9yZW5vcm1hbGl6ZV92ZWN0b3IoZmxvYXQgKlgsIGludCBOLCBmbG9hdCBnYWluKQoreworICAgIGludCBpOworICAgIGZsb2F0IGcgPSAxZS0xNWY7CisgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKKyAgICAgICAgZyArPSBYW2ldICogWFtpXTsKKyAgICBnID0gZ2FpbiAvIHNxcnRmKGcpOworCisgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKKyAgICAgICAgWFtpXSAqPSBnOworfQorCitpbnQgZmZfY2VsdF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQ2VsdEZyYW1lICoqZiwgaW50IG91dHB1dF9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgaW50IGFwcGx5X3BoYXNlX2ludik7CisKK3ZvaWQgZmZfY2VsdF9mcmVlKENlbHRGcmFtZSAqKmYpOworCit2b2lkIGZmX2NlbHRfZmx1c2goQ2VsdEZyYW1lICpmKTsKKworaW50IGZmX2NlbHRfZGVjb2RlX2ZyYW1lKENlbHRGcmFtZSAqZiwgT3B1c1JhbmdlQ29kZXIgKnJjLCBmbG9hdCAqKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZWRfY2hhbm5lbHMsIGludCBmcmFtZV9zaXplLCBpbnQgc3RhcnRiYW5kLCBpbnQgZW5kYmFuZCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX09QVVNfQ0VMVF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29wdXNfcGFyc2VyLmMgYi9saWJhdmNvZGVjL29wdXNfcGFyc2VyLmMKaW5kZXggYzMwZmQ3Yi4uMjhiMDkzMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9vcHVzX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvb3B1c19wYXJzZXIuYwpAQCAtMzEsMTAgKzMxLDEwIEBACiAjaW5jbHVkZSAicGFyc2VyLmgiCiAKIHR5cGVkZWYgc3RydWN0IE9wdXNQYXJzZUNvbnRleHQgeworICAgIFBhcnNlQ29udGV4dCBwYzsKICAgICBPcHVzQ29udGV4dCBjdHg7CiAgICAgT3B1c1BhY2tldCBwa3Q7CiAgICAgaW50IGV4dHJhZGF0YV9wYXJzZWQ7Ci0gICAgUGFyc2VDb250ZXh0IHBjOwogICAgIGludCB0c19mcmFtaW5nOwogfSBPcHVzUGFyc2VDb250ZXh0OwogCkBAIC00Myw2ICs0Myw3IEBACiAgICAgY29uc3QgdWludDhfdCAqYnVmID0gc3RhcnQgKyAxOwogICAgIGludCBzdGFydF90cmltX2ZsYWcsIGVuZF90cmltX2ZsYWcsIGNvbnRyb2xfZXh0ZW5zaW9uX2ZsYWcsIGNvbnRyb2xfZXh0ZW5zaW9uX2xlbmd0aDsKICAgICB1aW50OF90IGZsYWdzOworICAgIHVpbnQ2NF90IHBheWxvYWRfbGVuX3RtcDsKIAogICAgIEdldEJ5dGVDb250ZXh0IGdiOwogICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYsIGJ1Zl9sZW4pOwpAQCAtNTIsMTEgKzUzLDExIEBACiAgICAgZW5kX3RyaW1fZmxhZyAgICAgICAgICA9IChmbGFncyA+PiAzKSAmIDE7CiAgICAgY29udHJvbF9leHRlbnNpb25fZmxhZyA9IChmbGFncyA+PiAyKSAmIDE7CiAKLSAgICAqcGF5bG9hZF9sZW4gPSAwOworICAgIHBheWxvYWRfbGVuX3RtcCA9ICpwYXlsb2FkX2xlbiA9IDA7CiAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX3BlZWtfYnl0ZSgmZ2IpID09IDB4ZmYpCi0gICAgICAgICpwYXlsb2FkX2xlbiArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgICAgICBwYXlsb2FkX2xlbl90bXAgKz0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKIAotICAgICpwYXlsb2FkX2xlbiArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOworICAgIHBheWxvYWRfbGVuX3RtcCArPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOwogCiAgICAgaWYgKHN0YXJ0X3RyaW1fZmxhZykKICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDIpOwpAQCAtNjcsNiArNjgsMTEgQEAKICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIGNvbnRyb2xfZXh0ZW5zaW9uX2xlbmd0aCk7CiAgICAgfQogCisgICAgaWYgKGJ5dGVzdHJlYW0yX3RlbGwoJmdiKSArIHBheWxvYWRfbGVuX3RtcCA+IGJ1Zl9sZW4pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKnBheWxvYWRfbGVuID0gcGF5bG9hZF9sZW5fdG1wOworCiAgICAgcmV0dXJuIGJ1ZiArIGJ5dGVzdHJlYW0yX3RlbGwoJmdiKTsKIH0KIApAQCAtMTA0LDYgKzExMCwxMCBAQAogICAgICAgICAgICAgc3RhdGUgPSAoc3RhdGUgPDwgOCkgfCBwYXlsb2FkW2ldOwogICAgICAgICAgICAgaWYgKChzdGF0ZSAmIE9QVVNfVFNfTUFTSykgPT0gT1BVU19UU19IRUFERVIpIHsKICAgICAgICAgICAgICAgICBwYXlsb2FkID0gcGFyc2Vfb3B1c190c19oZWFkZXIocGF5bG9hZCwgJnBheWxvYWRfbGVuLCBidWZfc2l6ZSAtIGkpOworICAgICAgICAgICAgICAgIGlmICghcGF5bG9hZCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgT2dnIFRTIGhlYWRlci5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgKmhlYWRlcl9sZW4gPSBwYXlsb2FkIC0gYnVmOwogICAgICAgICAgICAgICAgIHN0YXJ0X2ZvdW5kID0gMTsKICAgICAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvb3B1c19wdnEuYyBiL2xpYmF2Y29kZWMvb3B1c19wdnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGJmMTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9vcHVzX3B2cS5jCkBAIC0wLDAgKzEsOTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQ1NJUk8KKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDA5IFhpcGguT3JnIEZvdW5kYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOC0yMDA5IEdyZWdvcnkgTWF4d2VsbAorICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJldyBEJ0FkZGVzaW8KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNyBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm9wdXN0YWIuaCIKKyNpbmNsdWRlICJvcHVzX3B2cS5oIgorCisjZGVmaW5lIENFTFRfUFZRX1UobiwgaykgKGZmX2NlbHRfcHZxX3Vfcm93W0ZGTUlOKG4sIGspXVtGRk1BWChuLCBrKV0pCisjZGVmaW5lIENFTFRfUFZRX1YobiwgaykgKENFTFRfUFZRX1UobiwgaykgKyBDRUxUX1BWUV9VKG4sIChrKSArIDEpKQorCitzdGF0aWMgaW5saW5lIGludDE2X3QgY2VsdF9jb3MoaW50MTZfdCB4KQoreworICAgIHggPSAoTVVMMTYoeCwgeCkgKyA0MDk2KSA+PiAxMzsKKyAgICB4ID0gKDMyNzY3LXgpICsgUk9VTkRfTVVMMTYoeCwgKC03NjUxICsgUk9VTkRfTVVMMTYoeCwgKDgyNzcgKyBST1VORF9NVUwxNigtNjI2LCB4KSkpKSk7CisgICAgcmV0dXJuIHggKyAxOworfQorCitzdGF0aWMgaW5saW5lIGludCBjZWx0X2xvZzJ0YW4oaW50IGlzaW4sIGludCBpY29zKQoreworICAgIGludCBsYywgbHM7CisgICAgbGMgPSBvcHVzX2lsb2coaWNvcyk7CisgICAgbHMgPSBvcHVzX2lsb2coaXNpbik7CisgICAgaWNvcyA8PD0gMTUgLSBsYzsKKyAgICBpc2luIDw8PSAxNSAtIGxzOworICAgIHJldHVybiAobHMgPDwgMTEpIC0gKGxjIDw8IDExKSArCisgICAgICAgICAgIFJPVU5EX01VTDE2KGlzaW4sIFJPVU5EX01VTDE2KGlzaW4sIC0yNTk3KSArIDc5MzIpIC0KKyAgICAgICAgICAgUk9VTkRfTVVMMTYoaWNvcywgUk9VTkRfTVVMMTYoaWNvcywgLTI1OTcpICsgNzkzMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNlbHRfYml0czJwdWxzZXMoY29uc3QgdWludDhfdCAqY2FjaGUsIGludCBiaXRzKQoreworICAgIC8vIFRPRE86IEZpbmQgdGhlIHNpemUgb2YgY2FjaGUgYW5kIG1ha2UgaXQgaW50byBhbiBhcnJheSBpbiB0aGUgcGFyYW1ldGVycyBsaXN0CisgICAgaW50IGksIGxvdyA9IDAsIGhpZ2g7CisKKyAgICBoaWdoID0gY2FjaGVbMF07CisgICAgYml0cy0tOworCisgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgeworICAgICAgICBpbnQgY2VudGVyID0gKGxvdyArIGhpZ2ggKyAxKSA+PiAxOworICAgICAgICBpZiAoY2FjaGVbY2VudGVyXSA+PSBiaXRzKQorICAgICAgICAgICAgaGlnaCA9IGNlbnRlcjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG93ID0gY2VudGVyOworICAgIH0KKworICAgIHJldHVybiAoYml0cyAtIChsb3cgPT0gMCA/IC0xIDogY2FjaGVbbG93XSkgPD0gY2FjaGVbaGlnaF0gLSBiaXRzKSA/IGxvdyA6IGhpZ2g7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGNlbHRfcHVsc2VzMmJpdHMoY29uc3QgdWludDhfdCAqY2FjaGUsIGludCBwdWxzZXMpCit7CisgICAgLy8gVE9ETzogRmluZCB0aGUgc2l6ZSBvZiBjYWNoZSBhbmQgbWFrZSBpdCBpbnRvIGFuIGFycmF5IGluIHRoZSBwYXJhbWV0ZXJzIGxpc3QKKyAgIHJldHVybiAocHVsc2VzID09IDApID8gMCA6IGNhY2hlW3B1bHNlc10gKyAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VsdF9ub3JtYWxpemVfcmVzaWR1YWwoY29uc3QgaW50ICogYXZfcmVzdHJpY3QgaXksIGZsb2F0ICogYXZfcmVzdHJpY3QgWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTiwgZmxvYXQgZykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQorICAgICAgICBYW2ldID0gZyAqIGl5W2ldOworfQorCitzdGF0aWMgdm9pZCBjZWx0X2V4cF9yb3RhdGlvbl9pbXBsKGZsb2F0ICpYLCB1aW50MzJfdCBsZW4sIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYywgZmxvYXQgcykKK3sKKyAgICBmbG9hdCAqWHB0cjsKKyAgICBpbnQgaTsKKworICAgIFhwdHIgPSBYOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSBzdHJpZGU7IGkrKykgeworICAgICAgICBmbG9hdCB4MSAgICAgPSBYcHRyWzBdOworICAgICAgICBmbG9hdCB4MiAgICAgPSBYcHRyW3N0cmlkZV07CisgICAgICAgIFhwdHJbc3RyaWRlXSA9IGMgKiB4MiArIHMgKiB4MTsKKyAgICAgICAgKlhwdHIrKyAgICAgID0gYyAqIHgxIC0gcyAqIHgyOworICAgIH0KKworICAgIFhwdHIgPSAmWFtsZW4gLSAyICogc3RyaWRlIC0gMV07CisgICAgZm9yIChpID0gbGVuIC0gMiAqIHN0cmlkZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGZsb2F0IHgxICAgICA9IFhwdHJbMF07CisgICAgICAgIGZsb2F0IHgyICAgICA9IFhwdHJbc3RyaWRlXTsKKyAgICAgICAgWHB0cltzdHJpZGVdID0gYyAqIHgyICsgcyAqIHgxOworICAgICAgICAqWHB0ci0tICAgICAgPSBjICogeDEgLSBzICogeDI7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2VsdF9leHBfcm90YXRpb24oZmxvYXQgKlgsIHVpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBDZWx0U3ByZWFkIHNwcmVhZCwgY29uc3QgaW50IGVuY29kZSkKK3sKKyAgICB1aW50MzJfdCBzdHJpZGUyID0gMDsKKyAgICBmbG9hdCBjLCBzOworICAgIGZsb2F0IGdhaW4sIHRoZXRhOworICAgIGludCBpOworCisgICAgaWYgKDIqSyA+PSBsZW4gfHwgc3ByZWFkID09IENFTFRfU1BSRUFEX05PTkUpCisgICAgICAgIHJldHVybjsKKworICAgIGdhaW4gPSAoZmxvYXQpbGVuIC8gKGxlbiArICgyMCAtIDUqc3ByZWFkKSAqIEspOworICAgIHRoZXRhID0gTV9QSSAqIGdhaW4gKiBnYWluIC8gNDsKKworICAgIGMgPSBjb3NmKHRoZXRhKTsKKyAgICBzID0gc2luZih0aGV0YSk7CisKKyAgICBpZiAobGVuID49IHN0cmlkZSA8PCAzKSB7CisgICAgICAgIHN0cmlkZTIgPSAxOworICAgICAgICAvKiBUaGlzIGlzIGp1c3QgYSBzaW1wbGUgKGVxdWl2YWxlbnQpIHdheSBvZiBjb21wdXRpbmcgc3FydChsZW4vc3RyaWRlKSB3aXRoIHJvdW5kaW5nLgorICAgICAgICBJdCdzIGJhc2ljYWxseSBpbmNyZW1lbnRpbmcgbG9uZyBhcyAoc3RyaWRlMiswLjUpXjIgPCBsZW4vc3RyaWRlLiAqLworICAgICAgICB3aGlsZSAoKHN0cmlkZTIgKiBzdHJpZGUyICsgc3RyaWRlMikgKiBzdHJpZGUgKyAoc3RyaWRlID4+IDIpIDwgbGVuKQorICAgICAgICAgICAgc3RyaWRlMisrOworICAgIH0KKworICAgIGxlbiAvPSBzdHJpZGU7CisgICAgZm9yIChpID0gMDsgaSA8IHN0cmlkZTsgaSsrKSB7CisgICAgICAgIGlmIChlbmNvZGUpIHsKKyAgICAgICAgICAgIGNlbHRfZXhwX3JvdGF0aW9uX2ltcGwoWCArIGkgKiBsZW4sIGxlbiwgMSwgYywgLXMpOworICAgICAgICAgICAgaWYgKHN0cmlkZTIpCisgICAgICAgICAgICAgICAgY2VsdF9leHBfcm90YXRpb25faW1wbChYICsgaSAqIGxlbiwgbGVuLCBzdHJpZGUyLCBzLCAtYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RyaWRlMikKKyAgICAgICAgICAgICAgICBjZWx0X2V4cF9yb3RhdGlvbl9pbXBsKFggKyBpICogbGVuLCBsZW4sIHN0cmlkZTIsIHMsIGMpOworICAgICAgICAgICAgY2VsdF9leHBfcm90YXRpb25faW1wbChYICsgaSAqIGxlbiwgbGVuLCAxLCBjLCBzKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBjZWx0X2V4dHJhY3RfY29sbGFwc2VfbWFzayhjb25zdCBpbnQgKml5LCB1aW50MzJfdCBOLCB1aW50MzJfdCBCKQoreworICAgIGludCBpLCBqLCBOMCA9IE4gLyBCOworICAgIHVpbnQzMl90IGNvbGxhcHNlX21hc2sgPSAwOworCisgICAgaWYgKEIgPD0gMSkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQjsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKKyAgICAgICAgICAgIGNvbGxhcHNlX21hc2sgfD0gKCEhaXlbaSpOMCtqXSkgPDwgaTsKKyAgICByZXR1cm4gY29sbGFwc2VfbWFzazsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNlbHRfc3RlcmVvX21lcmdlKGZsb2F0ICpYLCBmbG9hdCAqWSwgZmxvYXQgbWlkLCBpbnQgTikKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCB4cCA9IDAsIHNpZGUgPSAwOworICAgIGZsb2F0IEVbMl07CisgICAgZmxvYXQgbWlkMjsKKyAgICBmbG9hdCBnYWluWzJdOworCisgICAgLyogQ29tcHV0ZSB0aGUgbm9ybSBvZiBYK1kgYW5kIFgtWSBhcyB8WHxeMiArIHxZfF4yICsvLSBzdW0oeHkpICovCisgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICB4cCAgICs9IFhbaV0gKiBZW2ldOworICAgICAgICBzaWRlICs9IFlbaV0gKiBZW2ldOworICAgIH0KKworICAgIC8qIENvbXBlbnNhdGluZyBmb3IgdGhlIG1pZCBub3JtYWxpemF0aW9uICovCisgICAgeHAgKj0gbWlkOworICAgIG1pZDIgPSBtaWQ7CisgICAgRVswXSA9IG1pZDIgKiBtaWQyICsgc2lkZSAtIDIgKiB4cDsKKyAgICBFWzFdID0gbWlkMiAqIG1pZDIgKyBzaWRlICsgMiAqIHhwOworICAgIGlmIChFWzBdIDwgNmUtNGYgfHwgRVsxXSA8IDZlLTRmKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgICAgICBZW2ldID0gWFtpXTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGdhaW5bMF0gPSAxLjBmIC8gc3FydGYoRVswXSk7CisgICAgZ2FpblsxXSA9IDEuMGYgLyBzcXJ0ZihFWzFdKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgZmxvYXQgdmFsdWVbMl07CisgICAgICAgIC8qIEFwcGx5IG1pZCBzY2FsaW5nIChzaWRlIGlzIGFscmVhZHkgc2NhbGVkKSAqLworICAgICAgICB2YWx1ZVswXSA9IG1pZCAqIFhbaV07CisgICAgICAgIHZhbHVlWzFdID0gWVtpXTsKKyAgICAgICAgWFtpXSA9IGdhaW5bMF0gKiAodmFsdWVbMF0gLSB2YWx1ZVsxXSk7CisgICAgICAgIFlbaV0gPSBnYWluWzFdICogKHZhbHVlWzBdICsgdmFsdWVbMV0pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2VsdF9pbnRlcmxlYXZlX2hhZGFtYXJkKGZsb2F0ICp0bXAsIGZsb2F0ICpYLCBpbnQgTjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGhhZGFtYXJkKQoreworICAgIGludCBpLCBqLCBOID0gTjAqc3RyaWRlOworICAgIGNvbnN0IHVpbnQ4X3QgKm9yZGVyID0gJmZmX2NlbHRfaGFkYW1hcmRfb3JkZXJbaGFkYW1hcmQgPyBzdHJpZGUgLSAyIDogMzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IHN0cmlkZTsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKKyAgICAgICAgICAgIHRtcFtqKnN0cmlkZStpXSA9IFhbb3JkZXJbaV0qTjAral07CisKKyAgICBtZW1jcHkoWCwgdG1wLCBOKnNpemVvZihmbG9hdCkpOworfQorCitzdGF0aWMgdm9pZCBjZWx0X2RlaW50ZXJsZWF2ZV9oYWRhbWFyZChmbG9hdCAqdG1wLCBmbG9hdCAqWCwgaW50IE4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGhhZGFtYXJkKQoreworICAgIGludCBpLCBqLCBOID0gTjAqc3RyaWRlOworICAgIGNvbnN0IHVpbnQ4X3QgKm9yZGVyID0gJmZmX2NlbHRfaGFkYW1hcmRfb3JkZXJbaGFkYW1hcmQgPyBzdHJpZGUgLSAyIDogMzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IHN0cmlkZTsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgTjA7IGorKykKKyAgICAgICAgICAgIHRtcFtvcmRlcltpXSpOMCtqXSA9IFhbaipzdHJpZGUraV07CisKKyAgICBtZW1jcHkoWCwgdG1wLCBOKnNpemVvZihmbG9hdCkpOworfQorCitzdGF0aWMgdm9pZCBjZWx0X2hhYXIxKGZsb2F0ICpYLCBpbnQgTjAsIGludCBzdHJpZGUpCit7CisgICAgaW50IGksIGo7CisgICAgTjAgPj49IDE7CisgICAgZm9yIChpID0gMDsgaSA8IHN0cmlkZTsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBOMDsgaisrKSB7CisgICAgICAgICAgICBmbG9hdCB4MCA9IFhbc3RyaWRlICogKDIgKiBqICsgMCkgKyBpXTsKKyAgICAgICAgICAgIGZsb2F0IHgxID0gWFtzdHJpZGUgKiAoMiAqIGogKyAxKSArIGldOworICAgICAgICAgICAgWFtzdHJpZGUgKiAoMiAqIGogKyAwKSArIGldID0gKHgwICsgeDEpICogTV9TUVJUMV8yOworICAgICAgICAgICAgWFtzdHJpZGUgKiAoMiAqIGogKyAxKSArIGldID0gKHgwIC0geDEpICogTV9TUVJUMV8yOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCBjZWx0X2NvbXB1dGVfcW4oaW50IE4sIGludCBiLCBpbnQgb2Zmc2V0LCBpbnQgcHVsc2VfY2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVyZW8pCit7CisgICAgaW50IHFuLCBxYjsKKyAgICBpbnQgTjIgPSAyICogTiAtIDE7CisgICAgaWYgKHN0ZXJlbyAmJiBOID09IDIpCisgICAgICAgIE4yLS07CisKKyAgICAvKiBUaGUgdXBwZXIgbGltaXQgZW5zdXJlcyB0aGF0IGluIGEgc3RlcmVvIHNwbGl0IHdpdGggaXRoZXRhPT0xNjM4NCwgd2UnbGwKKyAgICAgKiBhbHdheXMgaGF2ZSBlbm91Z2ggYml0cyBsZWZ0IG92ZXIgdG8gY29kZSBhdCBsZWFzdCBvbmUgcHVsc2UgaW4gdGhlCisgICAgICogc2lkZTsgb3RoZXJ3aXNlIGl0IHdvdWxkIGNvbGxhcHNlLCBzaW5jZSBpdCBkb2Vzbid0IGdldCBmb2xkZWQuICovCisgICAgcWIgPSBGRk1JTjMoYiAtIHB1bHNlX2NhcCAtICg0IDw8IDMpLCAoYiArIE4yICogb2Zmc2V0KSAvIE4yLCA4IDw8IDMpOworICAgIHFuID0gKHFiIDwgKDEgPDwgMyA+PiAxKSkgPyAxIDogKChmZl9jZWx0X3FuX2V4cDJbcWIgJiAweDddID4+ICgxNCAtIChxYiA+PiAzKSkpICsgMSkgPj4gMSA8PCAxOworICAgIHJldHVybiBxbjsKK30KKworLyogQ29udmVydCB0aGUgcXVhbnRpemVkIHZlY3RvciB0byBhbiBpbmRleCAqLworc3RhdGljIGlubGluZSB1aW50MzJfdCBjZWx0X2ljd3JzaSh1aW50MzJfdCBOLCB1aW50MzJfdCBLLCBjb25zdCBpbnQgKnkpCit7CisgICAgaW50IGksIGlkeCA9IDAsIHN1bSA9IDA7CisgICAgZm9yIChpID0gTiAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGlfcyA9IENFTFRfUFZRX1UoTiAtIGksIHN1bSArIEZGQUJTKHlbaV0pICsgMSk7CisgICAgICAgIGlkeCArPSBDRUxUX1BWUV9VKE4gLSBpLCBzdW0pICsgKHlbaV0gPCAwKSppX3M7CisgICAgICAgIHN1bSArPSBGRkFCUyh5W2ldKTsKKyAgICB9CisgICAgcmV0dXJuIGlkeDsKK30KKworLy8gdGhpcyBjb2RlIHdhcyBhZGFwdGVkIGZyb20gbGlib3B1cworc3RhdGljIGlubGluZSB1aW50NjRfdCBjZWx0X2N3cnNpKHVpbnQzMl90IE4sIHVpbnQzMl90IEssIHVpbnQzMl90IGksIGludCAqeSkKK3sKKyAgICB1aW50NjRfdCBub3JtID0gMDsKKyAgICB1aW50MzJfdCBxLCBwOworICAgIGludCBzLCB2YWw7CisgICAgaW50IGswOworCisgICAgd2hpbGUgKE4gPiAyKSB7CisgICAgICAgIC8qTG90cyBvZiBwdWxzZXMgY2FzZToqLworICAgICAgICBpZiAoSyA+PSBOKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcm93ID0gZmZfY2VsdF9wdnFfdV9yb3dbTl07CisKKyAgICAgICAgICAgIC8qIEFyZSB0aGUgcHVsc2VzIGluIHRoaXMgZGltZW5zaW9uIG5lZ2F0aXZlPyAqLworICAgICAgICAgICAgcCAgPSByb3dbSyArIDFdOworICAgICAgICAgICAgcyAgPSAtKGkgPj0gcCk7CisgICAgICAgICAgICBpIC09IHAgJiBzOworCisgICAgICAgICAgICAvKkNvdW50IGhvdyBtYW55IHB1bHNlcyB3ZXJlIHBsYWNlZCBpbiB0aGlzIGRpbWVuc2lvbi4qLworICAgICAgICAgICAgazAgPSBLOworICAgICAgICAgICAgcSA9IHJvd1tOXTsKKyAgICAgICAgICAgIGlmIChxID4gaSkgeworICAgICAgICAgICAgICAgIEsgPSBOOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGZmX2NlbHRfcHZxX3Vfcm93Wy0tS11bTl07CisgICAgICAgICAgICAgICAgfSB3aGlsZSAocCA+IGkpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgZm9yIChwID0gcm93W0tdOyBwID4gaTsgcCA9IHJvd1tLXSkKKyAgICAgICAgICAgICAgICAgICAgSy0tOworCisgICAgICAgICAgICBpICAgIC09IHA7CisgICAgICAgICAgICB2YWwgICA9IChrMCAtIEsgKyBzKSBeIHM7CisgICAgICAgICAgICBub3JtICs9IHZhbCAqIHZhbDsKKyAgICAgICAgICAgICp5KysgID0gdmFsOworICAgICAgICB9IGVsc2UgeyAvKkxvdHMgb2YgZGltZW5zaW9ucyBjYXNlOiovCisgICAgICAgICAgICAvKkFyZSB0aGVyZSBhbnkgcHVsc2VzIGluIHRoaXMgZGltZW5zaW9uIGF0IGFsbD8qLworICAgICAgICAgICAgcCA9IGZmX2NlbHRfcHZxX3Vfcm93W0sgICAgXVtOXTsKKyAgICAgICAgICAgIHEgPSBmZl9jZWx0X3B2cV91X3Jvd1tLICsgMV1bTl07CisKKyAgICAgICAgICAgIGlmIChwIDw9IGkgJiYgaSA8IHEpIHsKKyAgICAgICAgICAgICAgICBpIC09IHA7CisgICAgICAgICAgICAgICAgKnkrKyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qQXJlIHRoZSBwdWxzZXMgaW4gdGhpcyBkaW1lbnNpb24gbmVnYXRpdmU/Ki8KKyAgICAgICAgICAgICAgICBzICA9IC0oaSA+PSBxKTsKKyAgICAgICAgICAgICAgICBpIC09IHEgJiBzOworCisgICAgICAgICAgICAgICAgLypDb3VudCBob3cgbWFueSBwdWxzZXMgd2VyZSBwbGFjZWQgaW4gdGhpcyBkaW1lbnNpb24uKi8KKyAgICAgICAgICAgICAgICBrMCA9IEs7CisgICAgICAgICAgICAgICAgZG8gcCA9IGZmX2NlbHRfcHZxX3Vfcm93Wy0tS11bTl07CisgICAgICAgICAgICAgICAgd2hpbGUgKHAgPiBpKTsKKworICAgICAgICAgICAgICAgIGkgICAgLT0gcDsKKyAgICAgICAgICAgICAgICB2YWwgICA9IChrMCAtIEsgKyBzKSBeIHM7CisgICAgICAgICAgICAgICAgbm9ybSArPSB2YWwgKiB2YWw7CisgICAgICAgICAgICAgICAgKnkrKyAgPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTi0tOworICAgIH0KKworICAgIC8qIE4gPT0gMiAqLworICAgIHAgID0gMiAqIEsgKyAxOworICAgIHMgID0gLShpID49IHApOworICAgIGkgLT0gcCAmIHM7CisgICAgazAgPSBLOworICAgIEsgID0gKGkgKyAxKSAvIDI7CisKKyAgICBpZiAoSykKKyAgICAgICAgaSAtPSAyICogSyAtIDE7CisKKyAgICB2YWwgICA9IChrMCAtIEsgKyBzKSBeIHM7CisgICAgbm9ybSArPSB2YWwgKiB2YWw7CisgICAgKnkrKyAgPSB2YWw7CisKKyAgICAvKiBOPT0xICovCisgICAgcyAgICAgPSAtaTsKKyAgICB2YWwgICA9IChLICsgcykgXiBzOworICAgIG5vcm0gKz0gdmFsICogdmFsOworICAgICp5ICAgID0gdmFsOworCisgICAgcmV0dXJuIG5vcm07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjZWx0X2VuY29kZV9wdWxzZXMoT3B1c1JhbmdlQ29kZXIgKnJjLCBpbnQgKnksIHVpbnQzMl90IE4sIHVpbnQzMl90IEspCit7CisgICAgZmZfb3B1c19yY19lbmNfdWludChyYywgY2VsdF9pY3dyc2koTiwgSywgeSksIENFTFRfUFZRX1YoTiwgSykpOworfQorCitzdGF0aWMgaW5saW5lIGZsb2F0IGNlbHRfZGVjb2RlX3B1bHNlcyhPcHVzUmFuZ2VDb2RlciAqcmMsIGludCAqeSwgdWludDMyX3QgTiwgdWludDMyX3QgSykKK3sKKyAgICBjb25zdCB1aW50MzJfdCBpZHggPSBmZl9vcHVzX3JjX2RlY191aW50KHJjLCBDRUxUX1BWUV9WKE4sIEspKTsKKyAgICByZXR1cm4gY2VsdF9jd3JzaShOLCBLLCBpZHgsIHkpOworfQorCisvKgorICogRmFzdGVyIHRoYW4gbGlib3B1cydzIHNlYXJjaCwgb3BlcmF0ZXMgZW50aXJlbHkgaW4gdGhlIHNpZ25lZCBkb21haW4uCisgKiBTbGlnaHRseSB3b3JzZS9iZXR0ZXIgZGVwZW5kaW5nIG9uIE4sIEsgYW5kIHRoZSBpbnB1dCB2ZWN0b3IuCisgKi8KK3N0YXRpYyBmbG9hdCBwcHBfcHZxX3NlYXJjaF9jKGZsb2F0ICpYLCBpbnQgKnksIGludCBLLCBpbnQgTikKK3sKKyAgICBpbnQgaSwgeV9ub3JtID0gMDsKKyAgICBmbG9hdCByZXMgPSAwLjBmLCB4eV9ub3JtID0gMC4wZjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgIHJlcyArPSBGRkFCUyhYW2ldKTsKKworICAgIHJlcyA9IEsvKHJlcyArIEZMVF9FUFNJTE9OKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgeVtpXSA9IGxyaW50ZihyZXMqWFtpXSk7CisgICAgICAgIHlfbm9ybSAgKz0geVtpXSp5W2ldOworICAgICAgICB4eV9ub3JtICs9IHlbaV0qWFtpXTsKKyAgICAgICAgSyAtPSBGRkFCUyh5W2ldKTsKKyAgICB9CisKKyAgICB3aGlsZSAoSykgeworICAgICAgICBpbnQgbWF4X2lkeCA9IDAsIHBoYXNlID0gRkZTSUdOKEspOworICAgICAgICBmbG9hdCBtYXhfbnVtID0gMC4wZjsKKyAgICAgICAgZmxvYXQgbWF4X2RlbiA9IDEuMGY7CisgICAgICAgIHlfbm9ybSArPSAxLjBmOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBzdW0gaGFzIGJlZW4gb3ZlcnNob3QgYW5kIHRoZSBiZXN0IHBsYWNlIGhhcyAwIHB1bHNlcyBhbGxvY2F0ZWQKKyAgICAgICAgICAgICAqIHRvIGl0LCBhdHRlbXB0aW5nIHRvIGRlY3JlYXNlIGl0IGZ1cnRoZXIgd2lsbCBhY3R1YWxseSBpbmNyZWFzZSB0aGUKKyAgICAgICAgICAgICAqIHN1bS4gUHJldmVudCB0aGlzIGJ5IGRpc3JlZ2FyZGluZyBhbnkgMCBwb3NpdGlvbnMgd2hlbiBkZWNyZW1lbnRpbmcuICovCisgICAgICAgICAgICBjb25zdCBpbnQgY2EgPSAxIF4gKCh5W2ldID09IDApICYgKHBoYXNlIDwgMCkpOworICAgICAgICAgICAgY29uc3QgaW50IHlfbmV3ID0geV9ub3JtICArIDIqcGhhc2UqRkZBQlMoeVtpXSk7CisgICAgICAgICAgICBmbG9hdCB4eV9uZXcgPSB4eV9ub3JtICsgMSpwaGFzZSpGRkFCUyhYW2ldKTsKKyAgICAgICAgICAgIHh5X25ldyA9IHh5X25ldyAqIHh5X25ldzsKKyAgICAgICAgICAgIGlmIChjYSAmJiAobWF4X2Rlbip4eV9uZXcpID4gKHlfbmV3Km1heF9udW0pKSB7CisgICAgICAgICAgICAgICAgbWF4X2RlbiA9IHlfbmV3OworICAgICAgICAgICAgICAgIG1heF9udW0gPSB4eV9uZXc7CisgICAgICAgICAgICAgICAgbWF4X2lkeCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLIC09IHBoYXNlOworCisgICAgICAgIHBoYXNlICo9IEZGU0lHTihYW21heF9pZHhdKTsKKyAgICAgICAgeHlfbm9ybSArPSAxKnBoYXNlKlhbbWF4X2lkeF07CisgICAgICAgIHlfbm9ybSAgKz0gMipwaGFzZSp5W21heF9pZHhdOworICAgICAgICB5W21heF9pZHhdICs9IHBoYXNlOworICAgIH0KKworICAgIHJldHVybiAoZmxvYXQpeV9ub3JtOworfQorCitzdGF0aWMgdWludDMyX3QgY2VsdF9hbGdfcXVhbnQoT3B1c1JhbmdlQ29kZXIgKnJjLCBmbG9hdCAqWCwgdWludDMyX3QgTiwgdWludDMyX3QgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENlbHRTcHJlYWQgc3ByZWFkLCB1aW50MzJfdCBibG9ja3MsIGZsb2F0IGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsdFBWUSAqcHZxKQoreworICAgIGludCAqeSA9IHB2cS0+cWNvZWZmOworCisgICAgY2VsdF9leHBfcm90YXRpb24oWCwgTiwgYmxvY2tzLCBLLCBzcHJlYWQsIDEpOworICAgIGdhaW4gLz0gc3FydGYocHZxLT5wdnFfc2VhcmNoKFgsIHksIEssIE4pKTsKKyAgICBjZWx0X2VuY29kZV9wdWxzZXMocmMsIHksICBOLCBLKTsKKyAgICBjZWx0X25vcm1hbGl6ZV9yZXNpZHVhbCh5LCBYLCBOLCBnYWluKTsKKyAgICBjZWx0X2V4cF9yb3RhdGlvbihYLCBOLCBibG9ja3MsIEssIHNwcmVhZCwgMCk7CisgICAgcmV0dXJuIGNlbHRfZXh0cmFjdF9jb2xsYXBzZV9tYXNrKHksIE4sIGJsb2Nrcyk7Cit9CisKKy8qKiBEZWNvZGUgcHVsc2UgdmVjdG9yIGFuZCBjb21iaW5lIHRoZSByZXN1bHQgd2l0aCB0aGUgcGl0Y2ggdmVjdG9yIHRvIHByb2R1Y2UKKyAgICB0aGUgZmluYWwgbm9ybWFsaXNlZCBzaWduYWwgaW4gdGhlIGN1cnJlbnQgYmFuZC4gKi8KK3N0YXRpYyB1aW50MzJfdCBjZWx0X2FsZ191bnF1YW50KE9wdXNSYW5nZUNvZGVyICpyYywgZmxvYXQgKlgsIHVpbnQzMl90IE4sIHVpbnQzMl90IEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIENlbHRTcHJlYWQgc3ByZWFkLCB1aW50MzJfdCBibG9ja3MsIGZsb2F0IGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWx0UFZRICpwdnEpCit7CisgICAgaW50ICp5ID0gcHZxLT5xY29lZmY7CisKKyAgICBnYWluIC89IHNxcnRmKGNlbHRfZGVjb2RlX3B1bHNlcyhyYywgeSwgTiwgSykpOworICAgIGNlbHRfbm9ybWFsaXplX3Jlc2lkdWFsKHksIFgsIE4sIGdhaW4pOworICAgIGNlbHRfZXhwX3JvdGF0aW9uKFgsIE4sIGJsb2NrcywgSywgc3ByZWFkLCAwKTsKKyAgICByZXR1cm4gY2VsdF9leHRyYWN0X2NvbGxhcHNlX21hc2soeSwgTiwgYmxvY2tzKTsKK30KKworc3RhdGljIGludCBjZWx0X2NhbGNfdGhldGEoY29uc3QgZmxvYXQgKlgsIGNvbnN0IGZsb2F0ICpZLCBpbnQgY291cGxpbmcsIGludCBOKQoreworICAgIGludCBpOworICAgIGZsb2F0IGVbMl0gPSB7IDAuMGYsIDAuMGYgfTsKKyAgICBpZiAoY291cGxpbmcpIHsgLyogQ291cGxpbmcgY2FzZSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7CisgICAgICAgICAgICBlWzBdICs9IChYW2ldICsgWVtpXSkqKFhbaV0gKyBZW2ldKTsKKyAgICAgICAgICAgIGVbMV0gKz0gKFhbaV0gLSBZW2ldKSooWFtpXSAtIFlbaV0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgZVswXSArPSBYW2ldKlhbaV07CisgICAgICAgICAgICBlWzFdICs9IFlbaV0qWVtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbHJpbnRmKDMyNzY4LjBmKmF0YW4yZihzcXJ0ZihlWzFdKSwgc3FydGYoZVswXSkpL01fUEkpOworfQorCitzdGF0aWMgdm9pZCBjZWx0X3N0ZXJlb19pc19kZWNvdXBsZShmbG9hdCAqWCwgZmxvYXQgKlksIGZsb2F0IGVfbCwgZmxvYXQgZV9yLCBpbnQgTikKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBmbG9hdCBlbmVyZ3lfbiA9IDEuMGYvKHNxcnRmKGVfbCplX2wgKyBlX3IqZV9yKSArIEZMVF9FUFNJTE9OKTsKKyAgICBlX2wgKj0gZW5lcmd5X247CisgICAgZV9yICo9IGVuZXJneV9uOworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspCisgICAgICAgIFhbaV0gPSBlX2wqWFtpXSArIGVfcipZW2ldOworfQorCitzdGF0aWMgdm9pZCBjZWx0X3N0ZXJlb19tc19kZWNvdXBsZShmbG9hdCAqWCwgZmxvYXQgKlksIGludCBOKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsKKyAgICAgICAgY29uc3QgZmxvYXQgWHJldCA9IFhbaV07CisgICAgICAgIFhbaV0gPSAoWFtpXSArIFlbaV0pKk1fU1FSVDFfMjsKKyAgICAgICAgWVtpXSA9IChZW2ldIC0gWHJldCkqTV9TUVJUMV8yOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3QgcXVhbnRfYmFuZF90ZW1wbGF0ZShDZWx0UFZRICpwdnEsIENlbHRGcmFtZSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B1c1JhbmdlQ29kZXIgKnJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFuZCwgZmxvYXQgKlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpZLCBpbnQgTiwgaW50IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrcywgZmxvYXQgKmxvd2JhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbiwgZmxvYXQgKmxvd2JhbmRfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsIGZsb2F0IGdhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsb3diYW5kX3NjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsLCBpbnQgcXVhbnQpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDhfdCAqY2FjaGU7CisgICAgaW50IHN0ZXJlbyA9ICEhWSwgc3BsaXQgPSBzdGVyZW87CisgICAgaW50IGltaWQgPSAwLCBpc2lkZSA9IDA7CisgICAgdWludDMyX3QgTjAgPSBOOworICAgIGludCBOX0IgPSBOIC8gYmxvY2tzOworICAgIGludCBOX0IwID0gTl9COworICAgIGludCBCMCA9IGJsb2NrczsKKyAgICBpbnQgdGltZV9kaXZpZGUgPSAwOworICAgIGludCByZWNvbWJpbmUgPSAwOworICAgIGludCBpbnYgPSAwOworICAgIGZsb2F0IG1pZCA9IDAsIHNpZGUgPSAwOworICAgIGludCBsb25nYmxvY2tzID0gKEIwID09IDEpOworICAgIHVpbnQzMl90IGNtID0gMDsKKworICAgIGlmIChOID09IDEpIHsKKyAgICAgICAgZmxvYXQgKnggPSBYOworICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IHN0ZXJlbzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgc2lnbiA9IDA7CisgICAgICAgICAgICBpZiAoZi0+cmVtYWluaW5nMiA+PSAxIDw8IDMpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVhbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IHhbMF0gPCAwOworICAgICAgICAgICAgICAgICAgICBmZl9vcHVzX3JjX3B1dF9yYXcocmMsIHNpZ24sIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpZ24gPSBmZl9vcHVzX3JjX2dldF9yYXcocmMsIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmLT5yZW1haW5pbmcyIC09IDEgPDwgMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHhbMF0gPSAxLjBmIC0gMi4wZipzaWduOworICAgICAgICAgICAgeCA9IFk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxvd2JhbmRfb3V0KQorICAgICAgICAgICAgbG93YmFuZF9vdXRbMF0gPSBYWzBdOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIXN0ZXJlbyAmJiBsZXZlbCA9PSAwKSB7CisgICAgICAgIGludCB0Zl9jaGFuZ2UgPSBmLT50Zl9jaGFuZ2VbYmFuZF07CisgICAgICAgIGludCBrOworICAgICAgICBpZiAodGZfY2hhbmdlID4gMCkKKyAgICAgICAgICAgIHJlY29tYmluZSA9IHRmX2NoYW5nZTsKKyAgICAgICAgLyogQmFuZCByZWNvbWJpbmluZyB0byBpbmNyZWFzZSBmcmVxdWVuY3kgcmVzb2x1dGlvbiAqLworCisgICAgICAgIGlmIChsb3diYW5kICYmCisgICAgICAgICAgICAocmVjb21iaW5lIHx8ICgoTl9CICYgMSkgPT0gMCAmJiB0Zl9jaGFuZ2UgPCAwKSB8fCBCMCA+IDEpKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQorICAgICAgICAgICAgICAgIGxvd2JhbmRfc2NyYXRjaFtpXSA9IGxvd2JhbmRbaV07CisgICAgICAgICAgICBsb3diYW5kID0gbG93YmFuZF9zY3JhdGNoOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHJlY29tYmluZTsgaysrKSB7CisgICAgICAgICAgICBpZiAocXVhbnQgfHwgbG93YmFuZCkKKyAgICAgICAgICAgICAgICBjZWx0X2hhYXIxKHF1YW50ID8gWCA6IGxvd2JhbmQsIE4gPj4gaywgMSA8PCBrKTsKKyAgICAgICAgICAgIGZpbGwgPSBmZl9jZWx0X2JpdF9pbnRlcmxlYXZlW2ZpbGwgJiAweEZdIHwgZmZfY2VsdF9iaXRfaW50ZXJsZWF2ZVtmaWxsID4+IDRdIDw8IDI7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2tzID4+PSByZWNvbWJpbmU7CisgICAgICAgIE5fQiA8PD0gcmVjb21iaW5lOworCisgICAgICAgIC8qIEluY3JlYXNpbmcgdGhlIHRpbWUgcmVzb2x1dGlvbiAqLworICAgICAgICB3aGlsZSAoKE5fQiAmIDEpID09IDAgJiYgdGZfY2hhbmdlIDwgMCkgeworICAgICAgICAgICAgaWYgKHF1YW50IHx8IGxvd2JhbmQpCisgICAgICAgICAgICAgICAgY2VsdF9oYWFyMShxdWFudCA/IFggOiBsb3diYW5kLCBOX0IsIGJsb2Nrcyk7CisgICAgICAgICAgICBmaWxsIHw9IGZpbGwgPDwgYmxvY2tzOworICAgICAgICAgICAgYmxvY2tzIDw8PSAxOworICAgICAgICAgICAgTl9CID4+PSAxOworICAgICAgICAgICAgdGltZV9kaXZpZGUrKzsKKyAgICAgICAgICAgIHRmX2NoYW5nZSsrOworICAgICAgICB9CisgICAgICAgIEIwID0gYmxvY2tzOworICAgICAgICBOX0IwID0gTl9COworCisgICAgICAgIC8qIFJlb3JnYW5pemUgdGhlIHNhbXBsZXMgaW4gdGltZSBvcmRlciBpbnN0ZWFkIG9mIGZyZXF1ZW5jeSBvcmRlciAqLworICAgICAgICBpZiAoQjAgPiAxICYmIChxdWFudCB8fCBsb3diYW5kKSkKKyAgICAgICAgICAgIGNlbHRfZGVpbnRlcmxlYXZlX2hhZGFtYXJkKHB2cS0+aGFkYW1hcmRfdG1wLCBxdWFudCA/IFggOiBsb3diYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTl9CID4+IHJlY29tYmluZSwgQjAgPDwgcmVjb21iaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ2Jsb2Nrcyk7CisgICAgfQorCisgICAgLyogSWYgd2UgbmVlZCAxLjUgbW9yZSBiaXQgdGhhbiB3ZSBjYW4gcHJvZHVjZSwgc3BsaXQgdGhlIGJhbmQgaW4gdHdvLiAqLworICAgIGNhY2hlID0gZmZfY2VsdF9jYWNoZV9iaXRzICsKKyAgICAgICAgICAgIGZmX2NlbHRfY2FjaGVfaW5kZXhbKGR1cmF0aW9uICsgMSkgKiBDRUxUX01BWF9CQU5EUyArIGJhbmRdOworICAgIGlmICghc3RlcmVvICYmIGR1cmF0aW9uID49IDAgJiYgYiA+IGNhY2hlW2NhY2hlWzBdXSArIDEyICYmIE4gPiAyKSB7CisgICAgICAgIE4gPj49IDE7CisgICAgICAgIFkgPSBYICsgTjsKKyAgICAgICAgc3BsaXQgPSAxOworICAgICAgICBkdXJhdGlvbiAtPSAxOworICAgICAgICBpZiAoYmxvY2tzID09IDEpCisgICAgICAgICAgICBmaWxsID0gKGZpbGwgJiAxKSB8IChmaWxsIDw8IDEpOworICAgICAgICBibG9ja3MgPSAoYmxvY2tzICsgMSkgPj4gMTsKKyAgICB9CisKKyAgICBpZiAoc3BsaXQpIHsKKyAgICAgICAgaW50IHFuOworICAgICAgICBpbnQgaXRoZXRhID0gcXVhbnQgPyBjZWx0X2NhbGNfdGhldGEoWCwgWSwgc3RlcmVvLCBOKSA6IDA7CisgICAgICAgIGludCBtYml0cywgc2JpdHMsIGRlbHRhOworICAgICAgICBpbnQgcWFsbG9jOworICAgICAgICBpbnQgcHVsc2VfY2FwOworICAgICAgICBpbnQgb2Zmc2V0OworICAgICAgICBpbnQgb3JpZ19maWxsOworICAgICAgICBpbnQgdGVsbDsKKworICAgICAgICAvKiBEZWNpZGUgb24gdGhlIHJlc29sdXRpb24gdG8gZ2l2ZSB0byB0aGUgc3BsaXQgcGFyYW1ldGVyIHRoZXRhICovCisgICAgICAgIHB1bHNlX2NhcCA9IGZmX2NlbHRfbG9nX2ZyZXFfcmFuZ2VbYmFuZF0gKyBkdXJhdGlvbiAqIDg7CisgICAgICAgIG9mZnNldCA9IChwdWxzZV9jYXAgPj4gMSkgLSAoc3RlcmVvICYmIE4gPT0gMiA/IENFTFRfUVRIRVRBX09GRlNFVF9UV09QSEFTRSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VMVF9RVEhFVEFfT0ZGU0VUKTsKKyAgICAgICAgcW4gPSAoc3RlcmVvICYmIGJhbmQgPj0gZi0+aW50ZW5zaXR5X3N0ZXJlbykgPyAxIDoKKyAgICAgICAgICAgICBjZWx0X2NvbXB1dGVfcW4oTiwgYiwgb2Zmc2V0LCBwdWxzZV9jYXAsIHN0ZXJlbyk7CisgICAgICAgIHRlbGwgPSBvcHVzX3JjX3RlbGxfZnJhYyhyYyk7CisgICAgICAgIGlmIChxbiAhPSAxKSB7CisgICAgICAgICAgICBpZiAocXVhbnQpCisgICAgICAgICAgICAgICAgaXRoZXRhID0gKGl0aGV0YSpxbiArIDgxOTIpID4+IDE0OworICAgICAgICAgICAgLyogRW50cm9weSBjb2Rpbmcgb2YgdGhlIGFuZ2xlLiBXZSB1c2UgYSB1bmlmb3JtIHBkZiBmb3IgdGhlCisgICAgICAgICAgICAgKiB0aW1lIHNwbGl0LCBhIHN0ZXAgZm9yIHN0ZXJlbywgYW5kIGEgdHJpYW5ndWxhciBvbmUgZm9yIHRoZSByZXN0LiAqLworICAgICAgICAgICAgaWYgKHF1YW50KSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZXJlbyAmJiBOID4gMikKKyAgICAgICAgICAgICAgICAgICAgZmZfb3B1c19yY19lbmNfdWludF9zdGVwKHJjLCBpdGhldGEsIHFuIC8gMik7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RlcmVvIHx8IEIwID4gMSkKKyAgICAgICAgICAgICAgICAgICAgZmZfb3B1c19yY19lbmNfdWludChyYywgaXRoZXRhLCBxbiArIDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZmZfb3B1c19yY19lbmNfdWludF90cmkocmMsIGl0aGV0YSwgcW4pOworICAgICAgICAgICAgICAgIGl0aGV0YSA9IGl0aGV0YSAqIDE2Mzg0IC8gcW47CisgICAgICAgICAgICAgICAgaWYgKHN0ZXJlbykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXRoZXRhID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjZWx0X3N0ZXJlb19pc19kZWNvdXBsZShYLCBZLCBmLT5ibG9ja1swXS5saW5fZW5lcmd5W2JhbmRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+YmxvY2tbMV0ubGluX2VuZXJneVtiYW5kXSwgTik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlbHRfc3RlcmVvX21zX2RlY291cGxlKFgsIFksIE4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZXJlbyAmJiBOID4gMikKKyAgICAgICAgICAgICAgICAgICAgaXRoZXRhID0gZmZfb3B1c19yY19kZWNfdWludF9zdGVwKHJjLCBxbiAvIDIpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0ZXJlbyB8fCBCMCA+IDEpCisgICAgICAgICAgICAgICAgICAgIGl0aGV0YSA9IGZmX29wdXNfcmNfZGVjX3VpbnQocmMsIHFuKzEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaXRoZXRhID0gZmZfb3B1c19yY19kZWNfdWludF90cmkocmMsIHFuKTsKKyAgICAgICAgICAgICAgICBpdGhldGEgPSBpdGhldGEgKiAxNjM4NCAvIHFuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHN0ZXJlbykgeworICAgICAgICAgICAgaWYgKHF1YW50KSB7CisgICAgICAgICAgICAgICAgaW52ID0gaXRoZXRhID4gODE5MjsKKyAgICAgICAgICAgICAgICAgaWYgKGludikgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICBZW2ldICo9IC0xOworICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgIGNlbHRfc3RlcmVvX2lzX2RlY291cGxlKFgsIFksIGYtPmJsb2NrWzBdLmxpbl9lbmVyZ3lbYmFuZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPmJsb2NrWzFdLmxpbl9lbmVyZ3lbYmFuZF0sIE4pOworCisgICAgICAgICAgICAgICAgaWYgKGIgPiAyIDw8IDMgJiYgZi0+cmVtYWluaW5nMiA+IDIgPDwgMykgeworICAgICAgICAgICAgICAgICAgICBmZl9vcHVzX3JjX2VuY19sb2cocmMsIGludiwgMik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW52ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludiA9IChiID4gMiA8PCAzICYmIGYtPnJlbWFpbmluZzIgPiAyIDw8IDMpID8gZmZfb3B1c19yY19kZWNfbG9nKHJjLCAyKSA6IDA7CisgICAgICAgICAgICAgICAgaW52ID0gZi0+YXBwbHlfcGhhc2VfaW52ID8gaW52IDogMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGl0aGV0YSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcWFsbG9jID0gb3B1c19yY190ZWxsX2ZyYWMocmMpIC0gdGVsbDsKKyAgICAgICAgYiAtPSBxYWxsb2M7CisKKyAgICAgICAgb3JpZ19maWxsID0gZmlsbDsKKyAgICAgICAgaWYgKGl0aGV0YSA9PSAwKSB7CisgICAgICAgICAgICBpbWlkID0gMzI3Njc7CisgICAgICAgICAgICBpc2lkZSA9IDA7CisgICAgICAgICAgICBmaWxsID0gYXZfbW9kX3VpbnRwMihmaWxsLCBibG9ja3MpOworICAgICAgICAgICAgZGVsdGEgPSAtMTYzODQ7CisgICAgICAgIH0gZWxzZSBpZiAoaXRoZXRhID09IDE2Mzg0KSB7CisgICAgICAgICAgICBpbWlkID0gMDsKKyAgICAgICAgICAgIGlzaWRlID0gMzI3Njc7CisgICAgICAgICAgICBmaWxsICY9ICgoMSA8PCBibG9ja3MpIC0gMSkgPDwgYmxvY2tzOworICAgICAgICAgICAgZGVsdGEgPSAxNjM4NDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGltaWQgPSBjZWx0X2NvcyhpdGhldGEpOworICAgICAgICAgICAgaXNpZGUgPSBjZWx0X2NvcygxNjM4NC1pdGhldGEpOworICAgICAgICAgICAgLyogVGhpcyBpcyB0aGUgbWlkIHZzIHNpZGUgYWxsb2NhdGlvbiB0aGF0IG1pbmltaXplcyBzcXVhcmVkIGVycm9yCisgICAgICAgICAgICBpbiB0aGF0IGJhbmQuICovCisgICAgICAgICAgICBkZWx0YSA9IFJPVU5EX01VTDE2KChOIC0gMSkgPDwgNywgY2VsdF9sb2cydGFuKGlzaWRlLCBpbWlkKSk7CisgICAgICAgIH0KKworICAgICAgICBtaWQgID0gaW1pZCAgLyAzMjc2OC4wZjsKKyAgICAgICAgc2lkZSA9IGlzaWRlIC8gMzI3NjguMGY7CisKKyAgICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgTj0yIHRoYXQgb25seSB3b3JrcyBmb3Igc3RlcmVvIGFuZCB0YWtlcworICAgICAgICBhZHZhbnRhZ2Ugb2YgdGhlIGZhY3QgdGhhdCBtaWQgYW5kIHNpZGUgYXJlIG9ydGhvZ29uYWwgdG8gZW5jb2RlCisgICAgICAgIHRoZSBzaWRlIHdpdGgganVzdCBvbmUgYml0LiAqLworICAgICAgICBpZiAoTiA9PSAyICYmIHN0ZXJlbykgeworICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICBpbnQgc2lnbiA9IDA7CisgICAgICAgICAgICBmbG9hdCB0bXA7CisgICAgICAgICAgICBmbG9hdCAqeDIsICp5MjsKKyAgICAgICAgICAgIG1iaXRzID0gYjsKKyAgICAgICAgICAgIC8qIE9ubHkgbmVlZCBvbmUgYml0IGZvciB0aGUgc2lkZSAqLworICAgICAgICAgICAgc2JpdHMgPSAoaXRoZXRhICE9IDAgJiYgaXRoZXRhICE9IDE2Mzg0KSA/IDEgPDwgMyA6IDA7CisgICAgICAgICAgICBtYml0cyAtPSBzYml0czsKKyAgICAgICAgICAgIGMgPSAoaXRoZXRhID4gODE5Mik7CisgICAgICAgICAgICBmLT5yZW1haW5pbmcyIC09IHFhbGxvYytzYml0czsKKworICAgICAgICAgICAgeDIgPSBjID8gWSA6IFg7CisgICAgICAgICAgICB5MiA9IGMgPyBYIDogWTsKKyAgICAgICAgICAgIGlmIChzYml0cykgeworICAgICAgICAgICAgICAgIGlmIChxdWFudCkgeworICAgICAgICAgICAgICAgICAgICBzaWduID0geDJbMF0qeTJbMV0gLSB4MlsxXSp5MlswXSA8IDA7CisgICAgICAgICAgICAgICAgICAgIGZmX29wdXNfcmNfcHV0X3JhdyhyYywgc2lnbiwgMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IGZmX29wdXNfcmNfZ2V0X3JhdyhyYywgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2lnbiA9IDEgLSAyICogc2lnbjsKKyAgICAgICAgICAgIC8qIFdlIHVzZSBvcmlnX2ZpbGwgaGVyZSBiZWNhdXNlIHdlIHdhbnQgdG8gZm9sZCB0aGUgc2lkZSwgYnV0IGlmCisgICAgICAgICAgICBpdGhldGE9PTE2Mzg0LCB3ZSdsbCBoYXZlIGNsZWFyZWQgdGhlIGxvdyBiaXRzIG9mIGZpbGwuICovCisgICAgICAgICAgICBjbSA9IHB2cS0+cXVhbnRfYmFuZChwdnEsIGYsIHJjLCBiYW5kLCB4MiwgTlVMTCwgTiwgbWJpdHMsIGJsb2NrcywgbG93YmFuZCwgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kX291dCwgbGV2ZWwsIGdhaW4sIGxvd2JhbmRfc2NyYXRjaCwgb3JpZ19maWxsKTsKKyAgICAgICAgICAgIC8qIFdlIGRvbid0IHNwbGl0IE49MiBiYW5kcywgc28gY20gaXMgZWl0aGVyIDEgb3IgMCAoZm9yIGEgZm9sZC1jb2xsYXBzZSksCisgICAgICAgICAgICBhbmQgdGhlcmUncyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IG1peGluZyB3aXRoIHRoZSBvdGhlciBjaGFubmVsLiAqLworICAgICAgICAgICAgeTJbMF0gPSAtc2lnbiAqIHgyWzFdOworICAgICAgICAgICAgeTJbMV0gPSAgc2lnbiAqIHgyWzBdOworICAgICAgICAgICAgWFswXSAqPSBtaWQ7CisgICAgICAgICAgICBYWzFdICo9IG1pZDsKKyAgICAgICAgICAgIFlbMF0gKj0gc2lkZTsKKyAgICAgICAgICAgIFlbMV0gKj0gc2lkZTsKKyAgICAgICAgICAgIHRtcCA9IFhbMF07CisgICAgICAgICAgICBYWzBdID0gdG1wIC0gWVswXTsKKyAgICAgICAgICAgIFlbMF0gPSB0bXAgKyBZWzBdOworICAgICAgICAgICAgdG1wID0gWFsxXTsKKyAgICAgICAgICAgIFhbMV0gPSB0bXAgLSBZWzFdOworICAgICAgICAgICAgWVsxXSA9IHRtcCArIFlbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiAiTm9ybWFsIiBzcGxpdCBjb2RlICovCisgICAgICAgICAgICBmbG9hdCAqbmV4dF9sb3diYW5kMiAgICAgPSBOVUxMOworICAgICAgICAgICAgZmxvYXQgKm5leHRfbG93YmFuZF9vdXQxID0gTlVMTDsKKyAgICAgICAgICAgIGludCBuZXh0X2xldmVsID0gMDsKKyAgICAgICAgICAgIGludCByZWJhbGFuY2U7CisgICAgICAgICAgICB1aW50MzJfdCBjbXQ7CisKKyAgICAgICAgICAgIC8qIEdpdmUgbW9yZSBiaXRzIHRvIGxvdy1lbmVyZ3kgTURDVHMgdGhhbiB0aGV5IHdvdWxkCisgICAgICAgICAgICAgKiBvdGhlcndpc2UgZGVzZXJ2ZSAqLworICAgICAgICAgICAgaWYgKEIwID4gMSAmJiAhc3RlcmVvICYmIChpdGhldGEgJiAweDNmZmYpKSB7CisgICAgICAgICAgICAgICAgaWYgKGl0aGV0YSA+IDgxOTIpCisgICAgICAgICAgICAgICAgICAgIC8qIFJvdWdoIGFwcHJveGltYXRpb24gZm9yIHByZS1lY2hvIG1hc2tpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgLT0gZGVsdGEgPj4gKDQgLSBkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAvKiBDb3JyZXNwb25kcyB0byBhIGZvcndhcmQtbWFza2luZyBzbG9wZSBvZgorICAgICAgICAgICAgICAgICAgICAgKiAxLjUgZEIgcGVyIDEwIG1zICovCisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gRkZNSU4oMCwgZGVsdGEgKyAoTiA8PCAzID4+ICg1IC0gZHVyYXRpb24pKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYml0cyA9IGF2X2NsaXAoKGIgLSBkZWx0YSkgLyAyLCAwLCBiKTsKKyAgICAgICAgICAgIHNiaXRzID0gYiAtIG1iaXRzOworICAgICAgICAgICAgZi0+cmVtYWluaW5nMiAtPSBxYWxsb2M7CisKKyAgICAgICAgICAgIGlmIChsb3diYW5kICYmICFzdGVyZW8pCisgICAgICAgICAgICAgICAgbmV4dF9sb3diYW5kMiA9IGxvd2JhbmQgKyBOOyAvKiA+MzItYml0IHNwbGl0IGNhc2UgKi8KKworICAgICAgICAgICAgLyogT25seSBzdGVyZW8gbmVlZHMgdG8gcGFzcyBvbiBsb3diYW5kX291dC4KKyAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaXQncyBoYW5kbGVkIGF0IHRoZSBlbmQgKi8KKyAgICAgICAgICAgIGlmIChzdGVyZW8pCisgICAgICAgICAgICAgICAgbmV4dF9sb3diYW5kX291dDEgPSBsb3diYW5kX291dDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBuZXh0X2xldmVsID0gbGV2ZWwgKyAxOworCisgICAgICAgICAgICByZWJhbGFuY2UgPSBmLT5yZW1haW5pbmcyOworICAgICAgICAgICAgaWYgKG1iaXRzID49IHNiaXRzKSB7CisgICAgICAgICAgICAgICAgLyogSW4gc3RlcmVvIG1vZGUsIHdlIGRvIG5vdCBhcHBseSBhIHNjYWxpbmcgdG8gdGhlIG1pZAorICAgICAgICAgICAgICAgICAqIGJlY2F1c2Ugd2UgbmVlZCB0aGUgbm9ybWFsaXplZCBtaWQgZm9yIGZvbGRpbmcgbGF0ZXIgKi8KKyAgICAgICAgICAgICAgICBjbSA9IHB2cS0+cXVhbnRfYmFuZChwdnEsIGYsIHJjLCBiYW5kLCBYLCBOVUxMLCBOLCBtYml0cywgYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmQsIGR1cmF0aW9uLCBuZXh0X2xvd2JhbmRfb3V0MSwgbmV4dF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW8gPyAxLjBmIDogKGdhaW4gKiBtaWQpLCBsb3diYW5kX3NjcmF0Y2gsIGZpbGwpOworICAgICAgICAgICAgICAgIHJlYmFsYW5jZSA9IG1iaXRzIC0gKHJlYmFsYW5jZSAtIGYtPnJlbWFpbmluZzIpOworICAgICAgICAgICAgICAgIGlmIChyZWJhbGFuY2UgPiAzIDw8IDMgJiYgaXRoZXRhICE9IDApCisgICAgICAgICAgICAgICAgICAgIHNiaXRzICs9IHJlYmFsYW5jZSAtICgzIDw8IDMpOworCisgICAgICAgICAgICAgICAgLyogRm9yIGEgc3RlcmVvIHNwbGl0LCB0aGUgaGlnaCBiaXRzIG9mIGZpbGwgYXJlIGFsd2F5cyB6ZXJvLAorICAgICAgICAgICAgICAgICAqIHNvIG5vIGZvbGRpbmcgd2lsbCBiZSBkb25lIHRvIHRoZSBzaWRlLiAqLworICAgICAgICAgICAgICAgIGNtdCA9IHB2cS0+cXVhbnRfYmFuZChwdnEsIGYsIHJjLCBiYW5kLCBZLCBOVUxMLCBOLCBzYml0cywgYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xvd2JhbmQyLCBkdXJhdGlvbiwgTlVMTCwgbmV4dF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiAqIHNpZGUsIE5VTEwsIGZpbGwgPj4gYmxvY2tzKTsKKyAgICAgICAgICAgICAgICBjbSB8PSBjbXQgPDwgKChCMCA+PiAxKSAmIChzdGVyZW8gLSAxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEZvciBhIHN0ZXJlbyBzcGxpdCwgdGhlIGhpZ2ggYml0cyBvZiBmaWxsIGFyZSBhbHdheXMgemVybywKKyAgICAgICAgICAgICAgICAgKiBzbyBubyBmb2xkaW5nIHdpbGwgYmUgZG9uZSB0byB0aGUgc2lkZS4gKi8KKyAgICAgICAgICAgICAgICBjbSA9IHB2cS0+cXVhbnRfYmFuZChwdnEsIGYsIHJjLCBiYW5kLCBZLCBOVUxMLCBOLCBzYml0cywgYmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfbG93YmFuZDIsIGR1cmF0aW9uLCBOVUxMLCBuZXh0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW4gKiBzaWRlLCBOVUxMLCBmaWxsID4+IGJsb2Nrcyk7CisgICAgICAgICAgICAgICAgY20gPDw9ICgoQjAgPj4gMSkgJiAoc3RlcmVvIC0gMSkpOworICAgICAgICAgICAgICAgIHJlYmFsYW5jZSA9IHNiaXRzIC0gKHJlYmFsYW5jZSAtIGYtPnJlbWFpbmluZzIpOworICAgICAgICAgICAgICAgIGlmIChyZWJhbGFuY2UgPiAzIDw8IDMgJiYgaXRoZXRhICE9IDE2Mzg0KQorICAgICAgICAgICAgICAgICAgICBtYml0cyArPSByZWJhbGFuY2UgLSAoMyA8PCAzKTsKKworICAgICAgICAgICAgICAgIC8qIEluIHN0ZXJlbyBtb2RlLCB3ZSBkbyBub3QgYXBwbHkgYSBzY2FsaW5nIHRvIHRoZSBtaWQgYmVjYXVzZQorICAgICAgICAgICAgICAgICAqIHdlIG5lZWQgdGhlIG5vcm1hbGl6ZWQgbWlkIGZvciBmb2xkaW5nIGxhdGVyICovCisgICAgICAgICAgICAgICAgY20gfD0gcHZxLT5xdWFudF9iYW5kKHB2cSwgZiwgcmMsIGJhbmQsIFgsIE5VTEwsIE4sIG1iaXRzLCBibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd2JhbmQsIGR1cmF0aW9uLCBuZXh0X2xvd2JhbmRfb3V0MSwgbmV4dF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvID8gMS4wZiA6IChnYWluICogbWlkKSwgbG93YmFuZF9zY3JhdGNoLCBmaWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRoaXMgaXMgdGhlIGJhc2ljIG5vLXNwbGl0IGNhc2UgKi8KKyAgICAgICAgdWludDMyX3QgcSAgICAgICAgID0gY2VsdF9iaXRzMnB1bHNlcyhjYWNoZSwgYik7CisgICAgICAgIHVpbnQzMl90IGN1cnJfYml0cyA9IGNlbHRfcHVsc2VzMmJpdHMoY2FjaGUsIHEpOworICAgICAgICBmLT5yZW1haW5pbmcyIC09IGN1cnJfYml0czsKKworICAgICAgICAvKiBFbnN1cmVzIHdlIGNhbiBuZXZlciBidXN0IHRoZSBidWRnZXQgKi8KKyAgICAgICAgd2hpbGUgKGYtPnJlbWFpbmluZzIgPCAwICYmIHEgPiAwKSB7CisgICAgICAgICAgICBmLT5yZW1haW5pbmcyICs9IGN1cnJfYml0czsKKyAgICAgICAgICAgIGN1cnJfYml0cyAgICAgID0gY2VsdF9wdWxzZXMyYml0cyhjYWNoZSwgLS1xKTsKKyAgICAgICAgICAgIGYtPnJlbWFpbmluZzIgLT0gY3Vycl9iaXRzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHEgIT0gMCkgeworICAgICAgICAgICAgLyogRmluYWxseSBkbyB0aGUgYWN0dWFsIChkZSlxdWFudGl6YXRpb24gKi8KKyAgICAgICAgICAgIGlmIChxdWFudCkgeworICAgICAgICAgICAgICAgIGNtID0gY2VsdF9hbGdfcXVhbnQocmMsIFgsIE4sIChxIDwgOCkgPyBxIDogKDggKyAocSAmIDcpKSA8PCAoKHEgPj4gMykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYtPnNwcmVhZCwgYmxvY2tzLCBnYWluLCBwdnEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjbSA9IGNlbHRfYWxnX3VucXVhbnQocmMsIFgsIE4sIChxIDwgOCkgPyBxIDogKDggKyAocSAmIDcpKSA8PCAoKHEgPj4gMykgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+c3ByZWFkLCBibG9ja3MsIGdhaW4sIHB2cSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBJZiB0aGVyZSdzIG5vIHB1bHNlLCBmaWxsIHRoZSBiYW5kIGFueXdheSAqLworICAgICAgICAgICAgdWludDMyX3QgY21fbWFzayA9ICgxIDw8IGJsb2NrcykgLSAxOworICAgICAgICAgICAgZmlsbCAmPSBjbV9tYXNrOworICAgICAgICAgICAgaWYgKGZpbGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWxvd2JhbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTm9pc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIFhbaV0gPSAoKChpbnQzMl90KWNlbHRfcm5nKGYpKSA+PiAyMCk7CisgICAgICAgICAgICAgICAgICAgIGNtID0gY21fbWFzazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBGb2xkZWQgc3BlY3RydW0gKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJvdXQgNDggZEIgYmVsb3cgdGhlICJub3JtYWwiIGZvbGRpbmcgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFhbaV0gPSBsb3diYW5kW2ldICsgKCgoY2VsdF9ybmcoZikpICYgMHg4MDAwKSA/IDEuMGYgLyAyNTYgOiAtMS4wZiAvIDI1Nik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY20gPSBmaWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjZWx0X3Jlbm9ybWFsaXplX3ZlY3RvcihYLCBOLCBnYWluKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KFgsIDAsIE4qc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUaGlzIGNvZGUgaXMgdXNlZCBieSB0aGUgZGVjb2RlciBhbmQgYnkgdGhlIHJlc3ludGhlc2lzLWVuYWJsZWQgZW5jb2RlciAqLworICAgIGlmIChzdGVyZW8pIHsKKyAgICAgICAgaWYgKE4gPiAyKQorICAgICAgICAgICAgY2VsdF9zdGVyZW9fbWVyZ2UoWCwgWSwgbWlkLCBOKTsKKyAgICAgICAgaWYgKGludikgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE47IGkrKykKKyAgICAgICAgICAgICAgICBZW2ldICo9IC0xOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChsZXZlbCA9PSAwKSB7CisgICAgICAgIGludCBrOworCisgICAgICAgIC8qIFVuZG8gdGhlIHNhbXBsZSByZW9yZ2FuaXphdGlvbiBnb2luZyBmcm9tIHRpbWUgb3JkZXIgdG8gZnJlcXVlbmN5IG9yZGVyICovCisgICAgICAgIGlmIChCMCA+IDEpCisgICAgICAgICAgICBjZWx0X2ludGVybGVhdmVfaGFkYW1hcmQocHZxLT5oYWRhbWFyZF90bXAsIFgsIE5fQiA+PiByZWNvbWJpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQjAgPDwgcmVjb21iaW5lLCBsb25nYmxvY2tzKTsKKworICAgICAgICAvKiBVbmRvIHRpbWUtZnJlcSBjaGFuZ2VzIHRoYXQgd2UgZGlkIGVhcmxpZXIgKi8KKyAgICAgICAgTl9CID0gTl9CMDsKKyAgICAgICAgYmxvY2tzID0gQjA7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCB0aW1lX2RpdmlkZTsgaysrKSB7CisgICAgICAgICAgICBibG9ja3MgPj49IDE7CisgICAgICAgICAgICBOX0IgPDw9IDE7CisgICAgICAgICAgICBjbSB8PSBjbSA+PiBibG9ja3M7CisgICAgICAgICAgICBjZWx0X2hhYXIxKFgsIE5fQiwgYmxvY2tzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoayA9IDA7IGsgPCByZWNvbWJpbmU7IGsrKykgeworICAgICAgICAgICAgY20gPSBmZl9jZWx0X2JpdF9kZWludGVybGVhdmVbY21dOworICAgICAgICAgICAgY2VsdF9oYWFyMShYLCBOMD4+aywgMTw8ayk7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2tzIDw8PSByZWNvbWJpbmU7CisKKyAgICAgICAgLyogU2NhbGUgb3V0cHV0IGZvciBsYXRlciBmb2xkaW5nICovCisgICAgICAgIGlmIChsb3diYW5kX291dCkgeworICAgICAgICAgICAgZmxvYXQgbiA9IHNxcnRmKE4wKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOMDsgaSsrKQorICAgICAgICAgICAgICAgIGxvd2JhbmRfb3V0W2ldID0gbiAqIFhbaV07CisgICAgICAgIH0KKyAgICAgICAgY20gPSBhdl9tb2RfdWludHAyKGNtLCBibG9ja3MpOworICAgIH0KKworICAgIHJldHVybiBjbTsKK30KKworc3RhdGljIFFVQU5UX0ZOKHB2cV9kZWNvZGVfYmFuZCkKK3sKKyNpZiBDT05GSUdfT1BVU19ERUNPREVSCisgICAgcmV0dXJuIHF1YW50X2JhbmRfdGVtcGxhdGUocHZxLCBmLCByYywgYmFuZCwgWCwgWSwgTiwgYiwgYmxvY2tzLCBsb3diYW5kLCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3diYW5kX291dCwgbGV2ZWwsIGdhaW4sIGxvd2JhbmRfc2NyYXRjaCwgZmlsbCwgMCk7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBRVUFOVF9GTihwdnFfZW5jb2RlX2JhbmQpCit7CisjaWYgQ09ORklHX09QVVNfRU5DT0RFUgorICAgIHJldHVybiBxdWFudF9iYW5kX3RlbXBsYXRlKHB2cSwgZiwgcmMsIGJhbmQsIFgsIFksIE4sIGIsIGJsb2NrcywgbG93YmFuZCwgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93YmFuZF9vdXQsIGxldmVsLCBnYWluLCBsb3diYW5kX3NjcmF0Y2gsIGZpbGwsIDEpOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQgYXZfY29sZCBmZl9jZWx0X3B2cV9pbml0KENlbHRQVlEgKipwdnEsIGludCBlbmNvZGUpCit7CisgICAgQ2VsdFBWUSAqcyA9IGF2X21hbGxvYyhzaXplb2YoQ2VsdFBWUSkpOworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPnB2cV9zZWFyY2ggPSBwcHBfcHZxX3NlYXJjaF9jOworICAgIHMtPnF1YW50X2JhbmQgPSBlbmNvZGUgPyBwdnFfZW5jb2RlX2JhbmQgOiBwdnFfZGVjb2RlX2JhbmQ7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX29wdXNfZHNwX2luaXRfeDg2KHMpOworCisgICAgKnB2cSA9IHM7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBhdl9jb2xkIGZmX2NlbHRfcHZxX3VuaW5pdChDZWx0UFZRICoqcHZxKQoreworICAgIGF2X2ZyZWVwKHB2cSk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29wdXNfcHZxLmggYi9saWJhdmNvZGVjL29wdXNfcHZxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJmMDFhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvb3B1c19wdnEuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJldyBEJ0FkZGVzaW8KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX09QVVNfUFZRX0gKKyNkZWZpbmUgQVZDT0RFQ19PUFVTX1BWUV9ICisKKyNpbmNsdWRlICJvcHVzX2NlbHQuaCIKKworI2RlZmluZSBRVUFOVF9GTihuYW1lKSB1aW50MzJfdCAobmFtZSkoc3RydWN0IENlbHRQVlEgKnB2cSwgQ2VsdEZyYW1lICpmLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdXNSYW5nZUNvZGVyICpyYywgY29uc3QgaW50IGJhbmQsIGZsb2F0ICpYLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqWSwgaW50IE4sIGludCBiLCB1aW50MzJfdCBibG9ja3MsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmxvd2JhbmQsIGludCBkdXJhdGlvbiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsb3diYW5kX291dCwgaW50IGxldmVsLCBmbG9hdCBnYWluLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbG93YmFuZF9zY3JhdGNoLCBpbnQgZmlsbCkKKworc3RydWN0IENlbHRQVlEgeworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50LCAgIHFjb2VmZiAgICAgIClbMjU2XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBoYWRhbWFyZF90bXApWzI1Nl07CisKKyAgICBmbG9hdCAoKnB2cV9zZWFyY2gpKGZsb2F0ICpYLCBpbnQgKnksIGludCBLLCBpbnQgTik7CisgICAgUVVBTlRfRk4oKnF1YW50X2JhbmQpOworfTsKKwordm9pZCBmZl9vcHVzX2RzcF9pbml0X3g4NihzdHJ1Y3QgQ2VsdFBWUSAqcyk7CisKK2ludCAgZmZfY2VsdF9wdnFfaW5pdChzdHJ1Y3QgQ2VsdFBWUSAqKnB2cSwgaW50IGVuY29kZSk7Cit2b2lkIGZmX2NlbHRfcHZxX3VuaW5pdChzdHJ1Y3QgQ2VsdFBWUSAqKnB2cSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX09QVVNfUFZRX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvb3B1c19yYy5jIGIvbGliYXZjb2RlYy9vcHVzX3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3MmJiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvb3B1c19yYy5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJldyBEJ0FkZGVzaW8KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNyBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm9wdXNfcmMuaCIKKworI2RlZmluZSBPUFVTX1JDX0JJVFMgMzIKKyNkZWZpbmUgT1BVU19SQ19TWU0gIDgKKyNkZWZpbmUgT1BVU19SQ19DRUlMICgoMSA8PCBPUFVTX1JDX1NZTSkgLSAxKQorI2RlZmluZSBPUFVTX1JDX1RPUCAoMXUgPDwgMzEpCisjZGVmaW5lIE9QVVNfUkNfQk9UIChPUFVTX1JDX1RPUCA+PiBPUFVTX1JDX1NZTSkKKyNkZWZpbmUgT1BVU19SQ19TSElGVCAoT1BVU19SQ19CSVRTIC0gT1BVU19SQ19TWU0gLSAxKQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIG9wdXNfcmNfZW5jX2NhcnJ5b3V0KE9wdXNSYW5nZUNvZGVyICpyYywgaW50IGNidWYpCit7CisgICAgY29uc3QgaW50IGNiID0gY2J1ZiA+PiBPUFVTX1JDX1NZTSwgbWIgPSAoT1BVU19SQ19DRUlMICsgY2IpICYgT1BVU19SQ19DRUlMOworICAgIGlmIChjYnVmID09IE9QVVNfUkNfQ0VJTCkgeworICAgICAgICByYy0+ZXh0Kys7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmMtPnJuZ19jdXJbMF0gPSByYy0+cmVtICsgY2I7CisgICAgcmMtPnJuZ19jdXIgKz0gKHJjLT5yZW0gPj0gMCk7CisgICAgZm9yICg7IHJjLT5leHQgPiAwOyByYy0+ZXh0LS0pCisgICAgICAgICpyYy0+cm5nX2N1cisrID0gbWI7CisgICAgYXZfYXNzZXJ0MChyYy0+cm5nX2N1ciA8IHJjLT5yYi5wb3NpdGlvbik7CisgICAgcmMtPnJlbSA9IGNidWYgJiBPUFVTX1JDX0NFSUw7IC8qIFByb3BhZ2F0ZSAqLworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIG9wdXNfcmNfZGVjX25vcm1hbGl6ZShPcHVzUmFuZ2VDb2RlciAqcmMpCit7CisgICAgd2hpbGUgKHJjLT5yYW5nZSA8PSBPUFVTX1JDX0JPVCkgeworICAgICAgICByYy0+dmFsdWUgPSAoKHJjLT52YWx1ZSA8PCBPUFVTX1JDX1NZTSkgfCAoZ2V0X2JpdHMoJnJjLT5nYiwgT1BVU19SQ19TWU0pIF4gT1BVU19SQ19DRUlMKSkgJiAoT1BVU19SQ19UT1AgLSAxKTsKKyAgICAgICAgcmMtPnJhbmdlICAgICA8PD0gT1BVU19SQ19TWU07CisgICAgICAgIHJjLT50b3RhbF9iaXRzICs9IE9QVVNfUkNfU1lNOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBvcHVzX3JjX2VuY19ub3JtYWxpemUoT3B1c1JhbmdlQ29kZXIgKnJjKQoreworICAgIHdoaWxlIChyYy0+cmFuZ2UgPD0gT1BVU19SQ19CT1QpIHsKKyAgICAgICAgb3B1c19yY19lbmNfY2FycnlvdXQocmMsIHJjLT52YWx1ZSA+PiBPUFVTX1JDX1NISUZUKTsKKyAgICAgICAgcmMtPnZhbHVlID0gKHJjLT52YWx1ZSA8PCBPUFVTX1JDX1NZTSkgJiAoT1BVU19SQ19UT1AgLSAxKTsKKyAgICAgICAgcmMtPnJhbmdlICAgICA8PD0gT1BVU19SQ19TWU07CisgICAgICAgIHJjLT50b3RhbF9iaXRzICs9IE9QVVNfUkNfU1lNOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBvcHVzX3JjX2RlY191cGRhdGUoT3B1c1JhbmdlQ29kZXIgKnJjLCB1aW50MzJfdCBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvdywgdWludDMyX3QgaGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRvdGFsKQoreworICAgIHJjLT52YWx1ZSAtPSBzY2FsZSAqICh0b3RhbCAtIGhpZ2gpOworICAgIHJjLT5yYW5nZSAgPSBsb3cgPyBzY2FsZSAqIChoaWdoIC0gbG93KQorICAgICAgICAgICAgICAgICAgICAgIDogcmMtPnJhbmdlIC0gc2NhbGUgKiAodG90YWwgLSBoaWdoKTsKKyAgICBvcHVzX3JjX2RlY19ub3JtYWxpemUocmMpOworfQorCisvKiBNYWluIGVuY29kaW5nIGZ1bmN0aW9uLCB0aGlzIG5lZWRzIHRvIGdvIGZhc3QgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgb3B1c19yY19lbmNfdXBkYXRlKE9wdXNSYW5nZUNvZGVyICpyYywgdWludDMyX3QgYiwgdWludDMyX3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBfdG90LCBjb25zdCBpbnQgcHR3bykKK3sKKyAgICB1aW50MzJfdCByc2NhbGVkLCBjbmQgPSAhIWI7CisgICAgaWYgKHB0d28pIC8qIFdob2xlIGZ1bmN0aW9uIGlzIGlubGluZWQgc28gaG9wZWZ1bGx5IGJyYW5jaCBpcyBvcHRpbWl6ZWQgb3V0ICovCisgICAgICAgIHJzY2FsZWQgPSByYy0+cmFuZ2UgPj4gZmZfbG9nMihwX3RvdCk7CisgICAgZWxzZQorICAgICAgICByc2NhbGVkID0gcmMtPnJhbmdlL3BfdG90OworICAgIHJjLT52YWx1ZSArPSAgICBjbmQqKHJjLT5yYW5nZSAtIHJzY2FsZWQqKHBfdG90IC0gYikpOworICAgIHJjLT5yYW5nZSAgPSAoIWNuZCkqKHJjLT5yYW5nZSAtIHJzY2FsZWQqKHBfdG90IC0gcCkpICsgY25kKnJzY2FsZWQqKHAgLSBiKTsKKyAgICBvcHVzX3JjX2VuY19ub3JtYWxpemUocmMpOworfQorCit1aW50MzJfdCBmZl9vcHVzX3JjX2RlY19jZGYoT3B1c1JhbmdlQ29kZXIgKnJjLCBjb25zdCB1aW50MTZfdCAqY2RmKQoreworICAgIHVuc2lnbmVkIGludCBrLCBzY2FsZSwgdG90YWwsIHN5bWJvbCwgbG93LCBoaWdoOworCisgICAgdG90YWwgPSAqY2RmKys7CisKKyAgICBzY2FsZSAgID0gcmMtPnJhbmdlIC8gdG90YWw7CisgICAgc3ltYm9sID0gcmMtPnZhbHVlIC8gc2NhbGUgKyAxOworICAgIHN5bWJvbCA9IHRvdGFsIC0gRkZNSU4oc3ltYm9sLCB0b3RhbCk7CisKKyAgICBmb3IgKGsgPSAwOyBjZGZba10gPD0gc3ltYm9sOyBrKyspOworICAgIGhpZ2ggPSBjZGZba107CisgICAgbG93ICA9IGsgPyBjZGZbay0xXSA6IDA7CisKKyAgICBvcHVzX3JjX2RlY191cGRhdGUocmMsIHNjYWxlLCBsb3csIGhpZ2gsIHRvdGFsKTsKKworICAgIHJldHVybiBrOworfQorCit2b2lkIGZmX29wdXNfcmNfZW5jX2NkZihPcHVzUmFuZ2VDb2RlciAqcmMsIGludCB2YWwsIGNvbnN0IHVpbnQxNl90ICpjZGYpCit7CisgICAgb3B1c19yY19lbmNfdXBkYXRlKHJjLCAoISF2YWwpKmNkZlt2YWxdLCBjZGZbdmFsICsgMV0sIGNkZlswXSwgMSk7Cit9CisKK3VpbnQzMl90IGZmX29wdXNfcmNfZGVjX2xvZyhPcHVzUmFuZ2VDb2RlciAqcmMsIHVpbnQzMl90IGJpdHMpCit7CisgICAgdWludDMyX3Qgaywgc2NhbGU7CisgICAgc2NhbGUgPSByYy0+cmFuZ2UgPj4gYml0czsgLy8gaW4gdGhpcyBjYXNlLCBzY2FsZSA9IHN5bWJvbAorCisgICAgaWYgKHJjLT52YWx1ZSA+PSBzY2FsZSkgeworICAgICAgICByYy0+dmFsdWUgLT0gc2NhbGU7CisgICAgICAgIHJjLT5yYW5nZSAtPSBzY2FsZTsKKyAgICAgICAgayA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmMtPnJhbmdlID0gc2NhbGU7CisgICAgICAgIGsgPSAxOworICAgIH0KKyAgICBvcHVzX3JjX2RlY19ub3JtYWxpemUocmMpOworICAgIHJldHVybiBrOworfQorCit2b2lkIGZmX29wdXNfcmNfZW5jX2xvZyhPcHVzUmFuZ2VDb2RlciAqcmMsIGludCB2YWwsIHVpbnQzMl90IGJpdHMpCit7CisgICAgYml0cyA9ICgxIDw8IGJpdHMpIC0gMTsKKyAgICBvcHVzX3JjX2VuY191cGRhdGUocmMsICghIXZhbCkqYml0cywgYml0cyArICEhdmFsLCBiaXRzICsgMSwgMSk7Cit9CisKKy8qKgorICogQ0VMVDogcmVhZCAxLTI1IHJhdyBiaXRzIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lLCBiYWNrd2FyZHMgYnl0ZS13aXNlCisgKi8KK3VpbnQzMl90IGZmX29wdXNfcmNfZ2V0X3JhdyhPcHVzUmFuZ2VDb2RlciAqcmMsIHVpbnQzMl90IGNvdW50KQoreworICAgIHVpbnQzMl90IHZhbHVlID0gMDsKKworICAgIHdoaWxlIChyYy0+cmIuYnl0ZXMgJiYgcmMtPnJiLmNhY2hlbGVuIDwgY291bnQpIHsKKyAgICAgICAgcmMtPnJiLmNhY2hldmFsIHw9ICotLXJjLT5yYi5wb3NpdGlvbiA8PCByYy0+cmIuY2FjaGVsZW47CisgICAgICAgIHJjLT5yYi5jYWNoZWxlbiArPSA4OworICAgICAgICByYy0+cmIuYnl0ZXMtLTsKKyAgICB9CisKKyAgICB2YWx1ZSA9IGF2X21vZF91aW50cDIocmMtPnJiLmNhY2hldmFsLCBjb3VudCk7CisgICAgcmMtPnJiLmNhY2hldmFsICAgID4+PSBjb3VudDsKKyAgICByYy0+cmIuY2FjaGVsZW4gICAgIC09IGNvdW50OworICAgIHJjLT50b3RhbF9iaXRzICAgICAgKz0gY291bnQ7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKy8qKgorICogQ0VMVDogd3JpdGUgMCAtIDMxIGJpdHMgdG8gdGhlIHJhd2JpdHMgYnVmZmVyCisgKi8KK3ZvaWQgZmZfb3B1c19yY19wdXRfcmF3KE9wdXNSYW5nZUNvZGVyICpyYywgdWludDMyX3QgdmFsLCB1aW50MzJfdCBjb3VudCkKK3sKKyAgICBjb25zdCBpbnQgdG9fd3JpdGUgPSBGRk1JTigzMiAtIHJjLT5yYi5jYWNoZWxlbiwgY291bnQpOworCisgICAgcmMtPnRvdGFsX2JpdHMgKz0gY291bnQ7CisgICAgcmMtPnJiLmNhY2hldmFsIHw9IGF2X21vZF91aW50cDIodmFsLCB0b193cml0ZSkgPDwgcmMtPnJiLmNhY2hlbGVuOworICAgIHJjLT5yYi5jYWNoZWxlbiA9IChyYy0+cmIuY2FjaGVsZW4gKyB0b193cml0ZSkgJSAzMjsKKworICAgIGlmICghcmMtPnJiLmNhY2hlbGVuICYmIGNvdW50KSB7CisgICAgICAgIEFWX1dCMzIocmMtPnJiLnBvc2l0aW9uLCByYy0+cmIuY2FjaGV2YWwpOworICAgICAgICByYy0+cmIuYnl0ZXMgICAgKz0gNDsKKyAgICAgICAgcmMtPnJiLnBvc2l0aW9uIC09IDQ7CisgICAgICAgIHJjLT5yYi5jYWNoZWxlbiA9IGNvdW50IC0gdG9fd3JpdGU7CisgICAgICAgIHJjLT5yYi5jYWNoZXZhbCA9IGF2X21vZF91aW50cDIodmFsID4+IHRvX3dyaXRlLCByYy0+cmIuY2FjaGVsZW4pOworICAgICAgICBhdl9hc3NlcnQwKHJjLT5ybmdfY3VyIDwgcmMtPnJiLnBvc2l0aW9uKTsKKyAgICB9Cit9CisKKy8qKgorICogQ0VMVDogcmVhZCBhIHVuaWZvcm0gZGlzdHJpYnV0aW9uCisgKi8KK3VpbnQzMl90IGZmX29wdXNfcmNfZGVjX3VpbnQoT3B1c1JhbmdlQ29kZXIgKnJjLCB1aW50MzJfdCBzaXplKQoreworICAgIHVpbnQzMl90IGJpdHMsIGssIHNjYWxlLCB0b3RhbDsKKworICAgIGJpdHMgID0gb3B1c19pbG9nKHNpemUgLSAxKTsKKyAgICB0b3RhbCA9IChiaXRzID4gOCkgPyAoKHNpemUgLSAxKSA+PiAoYml0cyAtIDgpKSArIDEgOiBzaXplOworCisgICAgc2NhbGUgID0gcmMtPnJhbmdlIC8gdG90YWw7CisgICAgayAgICAgID0gcmMtPnZhbHVlIC8gc2NhbGUgKyAxOworICAgIGsgICAgICA9IHRvdGFsIC0gRkZNSU4oaywgdG90YWwpOworICAgIG9wdXNfcmNfZGVjX3VwZGF0ZShyYywgc2NhbGUsIGssIGsgKyAxLCB0b3RhbCk7CisKKyAgICBpZiAoYml0cyA+IDgpIHsKKyAgICAgICAgayA9IGsgPDwgKGJpdHMgLSA4KSB8IGZmX29wdXNfcmNfZ2V0X3JhdyhyYywgYml0cyAtIDgpOworICAgICAgICByZXR1cm4gRkZNSU4oaywgc2l6ZSAtIDEpOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gazsKK30KKworLyoqCisgKiBDRUxUOiB3cml0ZSBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCBpbnRlZ2VyCisgKi8KK3ZvaWQgZmZfb3B1c19yY19lbmNfdWludChPcHVzUmFuZ2VDb2RlciAqcmMsIHVpbnQzMl90IHZhbCwgdWludDMyX3Qgc2l6ZSkKK3sKKyAgICBjb25zdCBpbnQgcHMgPSBGRk1BWChvcHVzX2lsb2coc2l6ZSAtIDEpIC0gOCwgMCk7CisgICAgb3B1c19yY19lbmNfdXBkYXRlKHJjLCB2YWwgPj4gcHMsICh2YWwgPj4gcHMpICsgMSwgKChzaXplIC0gMSkgPj4gcHMpICsgMSwgMCk7CisgICAgZmZfb3B1c19yY19wdXRfcmF3KHJjLCB2YWwsIHBzKTsKK30KKwordWludDMyX3QgZmZfb3B1c19yY19kZWNfdWludF9zdGVwKE9wdXNSYW5nZUNvZGVyICpyYywgaW50IGswKQoreworICAgIC8qIFVzZSBhIHByb2JhYmlsaXR5IG9mIDMgdXAgdG8gaXRoZXRhPTgxOTIgYW5kIHRoZW4gdXNlIDEgYWZ0ZXIgKi8KKyAgICB1aW50MzJfdCBrLCBzY2FsZSwgc3ltYm9sLCB0b3RhbCA9IChrMCsxKSozICsgazA7CisgICAgc2NhbGUgID0gcmMtPnJhbmdlIC8gdG90YWw7CisgICAgc3ltYm9sID0gcmMtPnZhbHVlIC8gc2NhbGUgKyAxOworICAgIHN5bWJvbCA9IHRvdGFsIC0gRkZNSU4oc3ltYm9sLCB0b3RhbCk7CisKKyAgICBrID0gKHN5bWJvbCA8IChrMCsxKSozKSA/IHN5bWJvbC8zIDogc3ltYm9sIC0gKGswKzEpKjI7CisKKyAgICBvcHVzX3JjX2RlY191cGRhdGUocmMsIHNjYWxlLCAoayA8PSBrMCkgPyAzKihrKzApIDogKGstMS1rMCkgKyAzKihrMCsxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGsgPD0gazApID8gMyooaysxKSA6IChrLTAtazApICsgMyooazArMSksIHRvdGFsKTsKKyAgICByZXR1cm4gazsKK30KKwordm9pZCBmZl9vcHVzX3JjX2VuY191aW50X3N0ZXAoT3B1c1JhbmdlQ29kZXIgKnJjLCB1aW50MzJfdCB2YWwsIGludCBrMCkKK3sKKyAgICBjb25zdCB1aW50MzJfdCBhID0gdmFsIDw9IGswLCBiID0gMiphICsgMTsKKyAgICBrMCA9IChrMCArIDEpIDw8IDE7CisgICAgdmFsID0gYioodmFsICsgazApIC0gMyphKmswOworICAgIG9wdXNfcmNfZW5jX3VwZGF0ZShyYywgdmFsLCB2YWwgKyBiLCAoazAgPDwgMSkgLSAxLCAwKTsKK30KKwordWludDMyX3QgZmZfb3B1c19yY19kZWNfdWludF90cmkoT3B1c1JhbmdlQ29kZXIgKnJjLCBpbnQgcW4pCit7CisgICAgdWludDMyX3Qgaywgc2NhbGUsIHN5bWJvbCwgdG90YWwsIGxvdywgY2VudGVyOworCisgICAgdG90YWwgPSAoKHFuPj4xKSArIDEpICogKChxbj4+MSkgKyAxKTsKKyAgICBzY2FsZSAgID0gcmMtPnJhbmdlIC8gdG90YWw7CisgICAgY2VudGVyID0gcmMtPnZhbHVlIC8gc2NhbGUgKyAxOworICAgIGNlbnRlciA9IHRvdGFsIC0gRkZNSU4oY2VudGVyLCB0b3RhbCk7CisKKyAgICBpZiAoY2VudGVyIDwgdG90YWwgPj4gMSkgeworICAgICAgICBrICAgICAgPSAoZmZfc3FydCg4ICogY2VudGVyICsgMSkgLSAxKSA+PiAxOworICAgICAgICBsb3cgICAgPSBrICogKGsgKyAxKSA+PiAxOworICAgICAgICBzeW1ib2wgPSBrICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBrICAgICAgPSAoMioocW4gKyAxKSAtIGZmX3NxcnQoOCoodG90YWwgLSBjZW50ZXIgLSAxKSArIDEpKSA+PiAxOworICAgICAgICBsb3cgICAgPSB0b3RhbCAtICgocW4gKyAxIC0gaykgKiAocW4gKyAyIC0gaykgPj4gMSk7CisgICAgICAgIHN5bWJvbCA9IHFuICsgMSAtIGs7CisgICAgfQorCisgICAgb3B1c19yY19kZWNfdXBkYXRlKHJjLCBzY2FsZSwgbG93LCBsb3cgKyBzeW1ib2wsIHRvdGFsKTsKKworICAgIHJldHVybiBrOworfQorCit2b2lkIGZmX29wdXNfcmNfZW5jX3VpbnRfdHJpKE9wdXNSYW5nZUNvZGVyICpyYywgdWludDMyX3QgaywgaW50IHFuKQoreworICAgIHVpbnQzMl90IHN5bWJvbCwgbG93LCB0b3RhbDsKKworICAgIHRvdGFsID0gKChxbj4+MSkgKyAxKSAqICgocW4+PjEpICsgMSk7CisKKyAgICBpZiAoayA8PSBxbiA+PiAxKSB7CisgICAgICAgIGxvdyAgICA9IGsgKiAoayArIDEpID4+IDE7CisgICAgICAgIHN5bWJvbCA9IGsgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvdyAgICA9IHRvdGFsIC0gKChxbiArIDEgLSBrKSAqIChxbiArIDIgLSBrKSA+PiAxKTsKKyAgICAgICAgc3ltYm9sID0gcW4gKyAxIC0gazsKKyAgICB9CisKKyAgICBvcHVzX3JjX2VuY191cGRhdGUocmMsIGxvdywgbG93ICsgc3ltYm9sLCB0b3RhbCwgMCk7Cit9CisKK2ludCBmZl9vcHVzX3JjX2RlY19sYXBsYWNlKE9wdXNSYW5nZUNvZGVyICpyYywgdWludDMyX3Qgc3ltYm9sLCBpbnQgZGVjYXkpCit7CisgICAgLyogZXh0ZW5kcyB0aGUgcmFuZ2UgY29kZXIgdG8gbW9kZWwgYSBMYXBsYWNlIGRpc3RyaWJ1dGlvbiAqLworICAgIGludCB2YWx1ZSA9IDA7CisgICAgdWludDMyX3Qgc2NhbGUsIGxvdyA9IDAsIGNlbnRlcjsKKworICAgIHNjYWxlICA9IHJjLT5yYW5nZSA+PiAxNTsKKyAgICBjZW50ZXIgPSByYy0+dmFsdWUgLyBzY2FsZSArIDE7CisgICAgY2VudGVyID0gKDEgPDwgMTUpIC0gRkZNSU4oY2VudGVyLCAxIDw8IDE1KTsKKworICAgIGlmIChjZW50ZXIgPj0gc3ltYm9sKSB7CisgICAgICAgIHZhbHVlKys7CisgICAgICAgIGxvdyA9IHN5bWJvbDsKKyAgICAgICAgc3ltYm9sID0gMSArICgoMzI3NjggLSAzMiAtIHN5bWJvbCkgKiAoMTYzODQtZGVjYXkpID4+IDE1KTsKKworICAgICAgICB3aGlsZSAoc3ltYm9sID4gMSAmJiBjZW50ZXIgPj0gbG93ICsgMiAqIHN5bWJvbCkgeworICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIHN5bWJvbCAqPSAyOworICAgICAgICAgICAgbG93ICAgICs9IHN5bWJvbDsKKyAgICAgICAgICAgIHN5bWJvbCAgPSAoKChzeW1ib2wgLSAyKSAqIGRlY2F5KSA+PiAxNSkgKyAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN5bWJvbCA8PSAxKSB7CisgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSAoY2VudGVyIC0gbG93KSA+PiAxOworICAgICAgICAgICAgdmFsdWUgKz0gZGlzdGFuY2U7CisgICAgICAgICAgICBsb3cgICArPSAyICogZGlzdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2VudGVyIDwgbG93ICsgc3ltYm9sKQorICAgICAgICAgICAgdmFsdWUgKj0gLTE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvdyArPSBzeW1ib2w7CisgICAgfQorCisgICAgb3B1c19yY19kZWNfdXBkYXRlKHJjLCBzY2FsZSwgbG93LCBGRk1JTihsb3cgKyBzeW1ib2wsIDMyNzY4KSwgMzI3NjgpOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCit2b2lkIGZmX29wdXNfcmNfZW5jX2xhcGxhY2UoT3B1c1JhbmdlQ29kZXIgKnJjLCBpbnQgKnZhbHVlLCB1aW50MzJfdCBzeW1ib2wsIGludCBkZWNheSkKK3sKKyAgICB1aW50MzJfdCBsb3cgPSBzeW1ib2w7CisgICAgaW50IGkgPSAxLCB2YWwgPSBGRkFCUygqdmFsdWUpLCBwb3MgPSAqdmFsdWUgPiAwOworICAgIGlmICghdmFsKSB7CisgICAgICAgIG9wdXNfcmNfZW5jX3VwZGF0ZShyYywgMCwgc3ltYm9sLCAxIDw8IDE1LCAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzeW1ib2wgPSAoKDMyNzY4IC0gMzIgLSBzeW1ib2wpKigxNjM4NCAtIGRlY2F5KSkgPj4gMTU7CisgICAgZm9yICg7IGkgPCB2YWwgJiYgc3ltYm9sOyBpKyspIHsKKyAgICAgICAgbG93ICAgKz0gKHN5bWJvbCA8PCAxKSArIDI7CisgICAgICAgIHN5bWJvbCA9IChzeW1ib2wqZGVjYXkpID4+IDE0OworICAgIH0KKyAgICBpZiAoc3ltYm9sKSB7CisgICAgICAgIGxvdyArPSAoKytzeW1ib2wpKnBvczsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgZGlzdGFuY2UgPSBGRk1JTih2YWwgLSBpLCAoKCgzMjc2OCAtIGxvdykgLSAhcG9zKSA+PiAxKSAtIDEpOworICAgICAgICBsb3cgICArPSBwb3MgKyAoZGlzdGFuY2UgPDwgMSk7CisgICAgICAgIHN5bWJvbCA9IEZGTUlOKDEsIDMyNzY4IC0gbG93KTsKKyAgICAgICAgKnZhbHVlID0gRkZTSUdOKCp2YWx1ZSkqKGRpc3RhbmNlICsgaSk7CisgICAgfQorICAgIG9wdXNfcmNfZW5jX3VwZGF0ZShyYywgbG93LCBsb3cgKyBzeW1ib2wsIDEgPDwgMTUsIDEpOworfQorCitpbnQgZmZfb3B1c19yY19kZWNfaW5pdChPcHVzUmFuZ2VDb2RlciAqcmMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQoreworICAgIGludCByZXQgPSBpbml0X2dldF9iaXRzOCgmcmMtPmdiLCBkYXRhLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJjLT5yYW5nZSA9IDEyODsKKyAgICByYy0+dmFsdWUgPSAxMjcgLSBnZXRfYml0cygmcmMtPmdiLCA3KTsKKyAgICByYy0+dG90YWxfYml0cyA9IDk7CisgICAgb3B1c19yY19kZWNfbm9ybWFsaXplKHJjKTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX29wdXNfcmNfZGVjX3Jhd19pbml0KE9wdXNSYW5nZUNvZGVyICpyYywgY29uc3QgdWludDhfdCAqcmlnaHRlbmQsIHVpbnQzMl90IGJ5dGVzKQoreworICAgIHJjLT5yYi5wb3NpdGlvbiA9IHJpZ2h0ZW5kOworICAgIHJjLT5yYi5ieXRlcyAgICA9IGJ5dGVzOworICAgIHJjLT5yYi5jYWNoZWxlbiA9IDA7CisgICAgcmMtPnJiLmNhY2hldmFsID0gMDsKK30KKwordm9pZCBmZl9vcHVzX3JjX2VuY19lbmQoT3B1c1JhbmdlQ29kZXIgKnJjLCB1aW50OF90ICpkc3QsIGludCBzaXplKQoreworICAgIGludCBybmdfYnl0ZXMsIGJpdHMgPSBPUFVTX1JDX0JJVFMgLSBvcHVzX2lsb2cocmMtPnJhbmdlKTsKKyAgICB1aW50MzJfdCBtYXNrID0gKE9QVVNfUkNfVE9QIC0gMSkgPj4gYml0czsKKyAgICB1aW50MzJfdCBlbmQgPSAocmMtPnZhbHVlICsgbWFzaykgJiB+bWFzazsKKworICAgIGlmICgoZW5kIHwgbWFzaykgPj0gcmMtPnZhbHVlICsgcmMtPnJhbmdlKSB7CisgICAgICAgIGJpdHMrKzsKKyAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgZW5kID0gKHJjLT52YWx1ZSArIG1hc2spICYgfm1hc2s7CisgICAgfQorCisgICAgLyogRmluaXNoIHdoYXQncyBsZWZ0ICovCisgICAgd2hpbGUgKGJpdHMgPiAwKSB7CisgICAgICAgIG9wdXNfcmNfZW5jX2NhcnJ5b3V0KHJjLCBlbmQgPj4gT1BVU19SQ19TSElGVCk7CisgICAgICAgIGVuZCA9IChlbmQgPDwgT1BVU19SQ19TWU0pICYgKE9QVVNfUkNfVE9QIC0gMSk7CisgICAgICAgIGJpdHMgLT0gT1BVU19SQ19TWU07CisgICAgfQorCisgICAgLyogRmx1c2ggb3V0IGFueXRoaW5nIGxlZnQgb3IgbWFya2VkICovCisgICAgaWYgKHJjLT5yZW0gPj0gMCB8fCByYy0+ZXh0ID4gMCkKKyAgICAgICAgb3B1c19yY19lbmNfY2FycnlvdXQocmMsIDApOworCisgICAgcm5nX2J5dGVzID0gcmMtPnJuZ19jdXIgLSByYy0+YnVmOworICAgIG1lbWNweShkc3QsIHJjLT5idWYsIHJuZ19ieXRlcyk7CisKKyAgICByYy0+d2FzdGUgPSBzaXplKjggLSAocmMtPnJiLmJ5dGVzKjggKyByYy0+cmIuY2FjaGVsZW4pIC0gcm5nX2J5dGVzKjg7CisKKyAgICAvKiBQdXQgdGhlIHJhd2JpdHMgcGFydCwgaWYgYW55ICovCisgICAgaWYgKHJjLT5yYi5ieXRlcyB8fCByYy0+cmIuY2FjaGVsZW4pIHsKKyAgICAgICAgaW50IGksIGxhcDsKKyAgICAgICAgdWludDhfdCAqcmJfc3JjLCAqcmJfZHN0OworICAgICAgICBmZl9vcHVzX3JjX3B1dF9yYXcocmMsIDAsIDMyIC0gcmMtPnJiLmNhY2hlbGVuKTsKKyAgICAgICAgcmJfc3JjID0gcmMtPmJ1ZiArIE9QVVNfTUFYX1BBQ0tFVF9TSVpFICsgMTIgLSByYy0+cmIuYnl0ZXM7CisgICAgICAgIHJiX2RzdCA9IGRzdCArIEZGTUFYKHNpemUgLSByYy0+cmIuYnl0ZXMsIDApOworICAgICAgICBsYXAgPSAmZHN0W3JuZ19ieXRlc10gLSByYl9kc3Q7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsYXA7IGkrKykKKyAgICAgICAgICAgIHJiX2RzdFtpXSB8PSByYl9zcmNbaV07CisgICAgICAgIG1lbWNweSgmcmJfZHN0W2xhcF0sICZyYl9zcmNbbGFwXSwgRkZNQVgocmMtPnJiLmJ5dGVzIC0gbGFwLCAwKSk7CisgICAgfQorfQorCit2b2lkIGZmX29wdXNfcmNfZW5jX2luaXQoT3B1c1JhbmdlQ29kZXIgKnJjKQoreworICAgIHJjLT52YWx1ZSA9IDA7CisgICAgcmMtPnJhbmdlID0gT1BVU19SQ19UT1A7CisgICAgcmMtPnRvdGFsX2JpdHMgPSBPUFVTX1JDX0JJVFMgKyAxOworICAgIHJjLT5yZW0gPSAtMTsKKyAgICByYy0+ZXh0ID0gIDA7CisgICAgcmMtPnJuZ19jdXIgPSByYy0+YnVmOworICAgIGZmX29wdXNfcmNfZGVjX3Jhd19pbml0KHJjLCByYy0+YnVmICsgT1BVU19NQVhfUEFDS0VUX1NJWkUgKyA4LCAwKTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvb3B1c19yYy5oIGIvbGliYXZjb2RlYy9vcHVzX3JjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3ZjgzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvb3B1c19yYy5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJldyBEJ0FkZGVzaW8KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNyBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX09QVVNfUkNfSAorI2RlZmluZSBBVkNPREVDX09QVVNfUkNfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworI2RlZmluZSBPUFVTX01BWF9QQUNLRVRfU0laRSAxMjc1CisKKyNkZWZpbmUgb3B1c19pbG9nKGkpIChhdl9sb2cyKGkpICsgISEoaSkpCisKK3R5cGVkZWYgc3RydWN0IFJhd0JpdHNDb250ZXh0IHsKKyAgICBjb25zdCB1aW50OF90ICpwb3NpdGlvbjsKKyAgICB1aW50MzJfdCBieXRlczsKKyAgICB1aW50MzJfdCBjYWNoZWxlbjsKKyAgICB1aW50MzJfdCBjYWNoZXZhbDsKK30gUmF3Qml0c0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IE9wdXNSYW5nZUNvZGVyIHsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIFJhd0JpdHNDb250ZXh0IHJiOworICAgIHVpbnQzMl90IHJhbmdlOworICAgIHVpbnQzMl90IHZhbHVlOworICAgIHVpbnQzMl90IHRvdGFsX2JpdHM7CisKKyAgICAvKiBFbmNvZGVyICovCisgICAgdWludDhfdCBidWZbT1BVU19NQVhfUEFDS0VUX1NJWkUgKyAxMl07IC8qIG1lbWNweSB2cyAobWVtbW92ZSArIG92ZXJyZWFkaW5nKSAqLworICAgIHVpbnQ4X3QgKnJuZ19jdXI7ICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgcmFuZ2UgY29kZWQgYnl0ZSAqLworICAgIGludCBleHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF3YWl0aW5nIHByb3BhZ2F0aW9uICovCisgICAgaW50IHJlbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FycnlvdXQgZmxhZyAqLworCisgICAgLyogRW5jb2Rpbmcgc3RhdHMgKi8KKyAgICBpbnQgd2FzdGU7Cit9IE9wdXNSYW5nZUNvZGVyOworCisvKioKKyAqIENFTFQ6IGVzdGltYXRlIGJpdHMgb2YgZW50cm9weSB0aGF0IGhhdmUgdGh1cyBmYXIgYmVlbiBjb25zdW1lZCBmb3IgdGhlCisgKiAgICAgICBjdXJyZW50IENFTFQgZnJhbWUsIHRvIGludGVnZXIgYW5kIGZyYWN0aW9uYWwgKDEvOHRoIGJpdCkgcHJlY2lzaW9uCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQzMl90IG9wdXNfcmNfdGVsbChjb25zdCBPcHVzUmFuZ2VDb2RlciAqcmMpCit7CisgICAgcmV0dXJuIHJjLT50b3RhbF9iaXRzIC0gYXZfbG9nMihyYy0+cmFuZ2UpIC0gMTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdWludDMyX3Qgb3B1c19yY190ZWxsX2ZyYWMoY29uc3QgT3B1c1JhbmdlQ29kZXIgKnJjKQoreworICAgIHVpbnQzMl90IGksIHRvdGFsX2JpdHMsIHJjYnVmZmVyLCByYW5nZTsKKworICAgIHRvdGFsX2JpdHMgPSByYy0+dG90YWxfYml0cyA8PCAzOworICAgIHJjYnVmZmVyICAgPSBhdl9sb2cyKHJjLT5yYW5nZSkgKyAxOworICAgIHJhbmdlICAgICAgPSByYy0+cmFuZ2UgPj4gKHJjYnVmZmVyLTE2KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaW50IGJpdDsKKyAgICAgICAgcmFuZ2UgPSByYW5nZSAqIHJhbmdlID4+IDE1OworICAgICAgICBiaXQgPSByYW5nZSA+PiAxNjsKKyAgICAgICAgcmNidWZmZXIgPSByY2J1ZmZlciA8PCAxIHwgYml0OworICAgICAgICByYW5nZSA+Pj0gYml0OworICAgIH0KKworICAgIHJldHVybiB0b3RhbF9iaXRzIC0gcmNidWZmZXI7Cit9CisKK3VpbnQzMl90IGZmX29wdXNfcmNfZGVjX2NkZihPcHVzUmFuZ2VDb2RlciAqcmMsIGNvbnN0IHVpbnQxNl90ICpjZGYpOwordm9pZCAgICAgZmZfb3B1c19yY19lbmNfY2RmKE9wdXNSYW5nZUNvZGVyICpyYywgaW50IHZhbCwgY29uc3QgdWludDE2X3QgKmNkZik7CisKK3VpbnQzMl90IGZmX29wdXNfcmNfZGVjX2xvZyhPcHVzUmFuZ2VDb2RlciAqcmMsIHVpbnQzMl90IGJpdHMpOwordm9pZCAgICAgZmZfb3B1c19yY19lbmNfbG9nKE9wdXNSYW5nZUNvZGVyICpyYywgaW50IHZhbCwgdWludDMyX3QgYml0cyk7CisKK3VpbnQzMl90IGZmX29wdXNfcmNfZGVjX3VpbnRfc3RlcChPcHVzUmFuZ2VDb2RlciAqcmMsIGludCBrMCk7Cit2b2lkICAgICBmZl9vcHVzX3JjX2VuY191aW50X3N0ZXAoT3B1c1JhbmdlQ29kZXIgKnJjLCB1aW50MzJfdCB2YWwsIGludCBrMCk7CisKK3VpbnQzMl90IGZmX29wdXNfcmNfZGVjX3VpbnRfdHJpKE9wdXNSYW5nZUNvZGVyICpyYywgaW50IHFuKTsKK3ZvaWQgICAgIGZmX29wdXNfcmNfZW5jX3VpbnRfdHJpKE9wdXNSYW5nZUNvZGVyICpyYywgdWludDMyX3QgaywgaW50IHFuKTsKKwordWludDMyX3QgZmZfb3B1c19yY19kZWNfdWludChPcHVzUmFuZ2VDb2RlciAqcmMsIHVpbnQzMl90IHNpemUpOwordm9pZCAgICAgZmZfb3B1c19yY19lbmNfdWludChPcHVzUmFuZ2VDb2RlciAqcmMsIHVpbnQzMl90IHZhbCwgdWludDMyX3Qgc2l6ZSk7CisKK3VpbnQzMl90IGZmX29wdXNfcmNfZ2V0X3JhdyhPcHVzUmFuZ2VDb2RlciAqcmMsIHVpbnQzMl90IGNvdW50KTsKK3ZvaWQgICAgIGZmX29wdXNfcmNfcHV0X3JhdyhPcHVzUmFuZ2VDb2RlciAqcmMsIHVpbnQzMl90IHZhbCwgdWludDMyX3QgY291bnQpOworCitpbnQgICAgICBmZl9vcHVzX3JjX2RlY19sYXBsYWNlKE9wdXNSYW5nZUNvZGVyICpyYywgdWludDMyX3Qgc3ltYm9sLCBpbnQgZGVjYXkpOwordm9pZCAgICAgZmZfb3B1c19yY19lbmNfbGFwbGFjZShPcHVzUmFuZ2VDb2RlciAqcmMsIGludCAqdmFsdWUsIHVpbnQzMl90IHN5bWJvbCwgaW50IGRlY2F5KTsKKworaW50ICAgICAgZmZfb3B1c19yY19kZWNfaW5pdChPcHVzUmFuZ2VDb2RlciAqcmMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKTsKK3ZvaWQgICAgIGZmX29wdXNfcmNfZGVjX3Jhd19pbml0KE9wdXNSYW5nZUNvZGVyICpyYywgY29uc3QgdWludDhfdCAqcmlnaHRlbmQsIHVpbnQzMl90IGJ5dGVzKTsKKwordm9pZCAgICAgZmZfb3B1c19yY19lbmNfZW5kKE9wdXNSYW5nZUNvZGVyICpyYywgdWludDhfdCAqZHN0LCBpbnQgc2l6ZSk7Cit2b2lkICAgICBmZl9vcHVzX3JjX2VuY19pbml0KE9wdXNSYW5nZUNvZGVyICpyYyk7CisKKyNkZWZpbmUgT1BVU19SQ19DSEVDS1BPSU5UX1VQREFURShyYykgXAorICAgIHJjX3JvbGxiYWNrX2JpdHMgPSBvcHVzX3JjX3RlbGxfZnJhYyhyYyk7IFwKKyAgICByY19yb2xsYmFja19jdHggID0gKnJjCisKKyNkZWZpbmUgT1BVU19SQ19DSEVDS1BPSU5UX1NQQVdOKHJjKSBcCisgICAgdWludDMyX3QgcmNfcm9sbGJhY2tfYml0cyA9IG9wdXNfcmNfdGVsbF9mcmFjKHJjKTsgXAorICAgIE9wdXNSYW5nZUNvZGVyIHJjX3JvbGxiYWNrX2N0eCA9ICpyYyBcCisKKyNkZWZpbmUgT1BVU19SQ19DSEVDS1BPSU5UX0JJVFMocmMpIFwKKyAgICAob3B1c19yY190ZWxsX2ZyYWMocmMpIC0gcmNfcm9sbGJhY2tfYml0cykKKworI2RlZmluZSBPUFVTX1JDX0NIRUNLUE9JTlRfUk9MTEJBQ0socmMpIFwKKyAgICBtZW1jcHkocmMsICZyY19yb2xsYmFja19jdHgsIHNpemVvZihPcHVzUmFuZ2VDb2RlcikpOyBcCisKKyNlbmRpZiAvKiBBVkNPREVDX09QVVNfUkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9vcHVzX3NpbGsuYyBiL2xpYmF2Y29kZWMvb3B1c19zaWxrLmMKaW5kZXggNzM1MjZmOS4uMmZjYmYzYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9vcHVzX3NpbGsuYworKysgYi9saWJhdmNvZGVjL29wdXNfc2lsay5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJvcHVzLmgiCisjaW5jbHVkZSAib3B1c3RhYi5oIgogCiB0eXBlZGVmIHN0cnVjdCBTaWxrRnJhbWUgewogICAgIGludCBjb2RlZDsKQEAgLTYxLDczMCArNjIsNiBAQAogICAgIGludCBwcmV2X2NvZGVkX2NoYW5uZWxzOwogfTsKIAotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfc3RlcmVvX3MxW10gPSB7Ci0gICAgMjU2LCAgIDcsICAgOSwgIDEwLCAgMTEsICAxMiwgIDIyLCAgNDYsICA1NCwgIDU1LCAgNTYsICA1OSwgIDgyLCAxNzQsIDE5NywgMjAwLAotICAgIDIwMSwgMjAyLCAyMTAsIDIzNCwgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDksIDI1NgotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfc3RlcmVvX3MyW10gPSB7MjU2LCA4NSwgMTcxLCAyNTZ9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9zdGVyZW9fczNbXSA9IHsyNTYsIDUxLCAxMDIsIDE1NCwgMjA1LCAyNTZ9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9taWRfb25seVtdID0gezI1NiwgMTkyLCAyNTZ9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9mcmFtZV90eXBlX2luYWN0aXZlW10gPSB7MjU2LCAyNiwgMjU2fTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfZnJhbWVfdHlwZV9hY3RpdmVbXSA9IHsyNTYsIDI0LCA5OCwgMjQ2LCAyNTZ9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9nYWluX2hpZ2hiaXRzWzNdWzldID0gewotICAgIHsyNTYsICAzMiwgMTQ0LCAyMTIsIDI0MSwgMjUzLCAyNTQsIDI1NSwgMjU2fSwKLSAgICB7MjU2LCAgIDIsICAxOSwgIDY0LCAxMjQsIDE4NiwgMjMzLCAyNTIsIDI1Nn0sCi0gICAgezI1NiwgICAxLCAgIDQsICAzMCwgMTAxLCAxOTUsIDI0NSwgMjU0LCAyNTZ9Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9nYWluX2xvd2JpdHNbXSA9IHsyNTYsIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2fTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfZ2Fpbl9kZWx0YVtdID0gewotICAgIDI1NiwgICA2LCAgMTEsICAyMiwgIDUzLCAxODUsIDIwNiwgMjE0LCAyMTgsIDIyMSwgMjIzLCAyMjUsIDIyNywgMjI4LCAyMjksIDIzMCwKLSAgICAyMzEsIDIzMiwgMjMzLCAyMzQsIDIzNSwgMjM2LCAyMzcsIDIzOCwgMjM5LCAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsCi0gICAgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2Ci19Owotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfbHNmX3MxWzJdWzJdWzMzXSA9IHsKLSAgICB7Ci0gICAgICAgIHsgICAgLy8gTkIgb3IgTUIsIHVudm9pY2VkCi0gICAgICAgICAgICAyNTYsICA0NCwgIDc4LCAxMDgsIDEyNywgMTQ4LCAxNjAsIDE3MSwgMTc0LCAxNzcsIDE3OSwgMTk1LCAxOTcsIDE5OSwgMjAwLCAyMDUsCi0gICAgICAgICAgICAyMDcsIDIwOCwgMjExLCAyMTQsIDIxNSwgMjE2LCAyMTgsIDIyMCwgMjIyLCAyMjUsIDIyNiwgMjM1LCAyNDQsIDI0NiwgMjUzLCAyNTUsIDI1NgotICAgICAgICB9LCB7IC8vIE5CIG9yIE1CLCB2b2ljZWQKLSAgICAgICAgICAgIDI1NiwgICAxLCAgMTEsICAxMiwgIDIwLCAgMjMsICAzMSwgIDM5LCAgNTMsICA2NiwgIDgwLCAgODEsICA5NSwgMTA3LCAxMjAsIDEzMSwKLSAgICAgICAgICAgIDE0MiwgMTU0LCAxNjUsIDE3NSwgMTg1LCAxOTYsIDIwNCwgMjEzLCAyMjEsIDIyOCwgMjM2LCAyMzcsIDIzOCwgMjQ0LCAyNDUsIDI1MSwgMjU2Ci0gICAgICAgIH0KLSAgICB9LCB7Ci0gICAgICAgIHsgICAgLy8gV0IsIHVudm9pY2VkCi0gICAgICAgICAgICAyNTYsICAzMSwgIDUyLCAgNTUsICA3MiwgIDczLCAgODEsICA5OCwgMTAyLCAxMDMsIDEyMSwgMTM3LCAxNDEsIDE0MywgMTQ2LCAxNDcsCi0gICAgICAgICAgICAxNTcsIDE1OCwgMTYxLCAxNzcsIDE4OCwgMjA0LCAyMDYsIDIwOCwgMjExLCAyMTMsIDIyNCwgMjI1LCAyMjksIDIzOCwgMjQ2LCAyNTMsIDI1NgotICAgICAgICB9LCB7IC8vIFdCLCB2b2ljZWQKLSAgICAgICAgICAgIDI1NiwgICAxLCAgIDUsICAyMSwgIDI2LCAgNDQsICA1NSwgIDYwLCAgNzQsICA4OSwgIDkwLCAgOTMsIDEwNSwgMTE4LCAxMzIsIDE0NiwKLSAgICAgICAgICAgIDE1MiwgMTY2LCAxNzgsIDE4MCwgMTg2LCAxODcsIDE5OSwgMjExLCAyMjIsIDIzMiwgMjM1LCAyNDUsIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU2Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9sc2ZfczJbMzJdWzEwXSA9IHsKLSAgICAvLyBOQiwgTUIKLSAgICB7IDI1NiwgICAxLCAgIDIsICAgMywgIDE4LCAyNDIsIDI1MywgMjU0LCAyNTUsIDI1NiB9LAotICAgIHsgMjU2LCAgIDEsICAgMiwgICA0LCAgMzgsIDIyMSwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICAgMSwgICAyLCAgIDYsICA0OCwgMTk3LCAyNTIsIDI1NCwgMjU1LCAyNTYgfSwKLSAgICB7IDI1NiwgICAxLCAgIDIsICAxMCwgIDYyLCAxODUsIDI0NiwgMjU0LCAyNTUsIDI1NiB9LAotICAgIHsgMjU2LCAgIDEsICAgNCwgIDIwLCAgNzMsIDE3NCwgMjQ4LCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICAgMSwgICA0LCAgMjEsICA3NiwgMTY2LCAyMzksIDI1NCwgMjU1LCAyNTYgfSwKLSAgICB7IDI1NiwgICAxLCAgIDgsICAzMiwgIDg1LCAxNTksIDIyNiwgMjUyLCAyNTUsIDI1NiB9LAotICAgIHsgMjU2LCAgIDEsICAgMiwgIDIwLCAgODMsIDE2MSwgMjE5LCAyNDksIDI1NSwgMjU2IH0sCi0KLSAgICAvLyBXQgotICAgIHsgMjU2LCAgIDEsICAgMiwgICAzLCAgMTIsIDI0NCwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICAgMSwgICAyLCAgIDQsICAzMiwgMjE4LCAyNTMsIDI1NCwgMjU1LCAyNTYgfSwKLSAgICB7IDI1NiwgICAxLCAgIDIsICAgNSwgIDQ3LCAxOTksIDI1MiwgMjU0LCAyNTUsIDI1NiB9LAotICAgIHsgMjU2LCAgIDEsICAgMiwgIDEyLCAgNjEsIDE4NywgMjUyLCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICAgMSwgICA1LCAgMjQsICA3MiwgMTcyLCAyNDksIDI1NCwgMjU1LCAyNTYgfSwKLSAgICB7IDI1NiwgICAxLCAgIDIsICAxNiwgIDcwLCAxNzAsIDI0MiwgMjU0LCAyNTUsIDI1NiB9LAotICAgIHsgMjU2LCAgIDEsICAgMiwgIDE3LCAgNzgsIDE2NSwgMjI2LCAyNTEsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICAgMSwgICA4LCAgMjksICA3OSwgMTU2LCAyMzcsIDI1NCwgMjU1LCAyNTYgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfbHNmX3MyX2V4dFtdID0geyAyNTYsIDE1NiwgMjE2LCAyNDAsIDI0OSwgMjUzLCAyNTUsIDI1NiB9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9sc2ZfaW50ZXJwb2xhdGlvbl9vZmZzZXRbXSA9IHsgMjU2LCAxMywgMzUsIDY0LCA3NSwgMjU2IH07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX3BpdGNoX2hpZ2hiaXRzW10gPSB7Ci0gICAgMjU2LCAgIDMsICAgNiwgIDEyLCAgMjMsICA0NCwgIDc0LCAxMDYsIDEyNSwgMTM2LCAxNDYsIDE1OCwgMTcxLCAxODQsIDE5NiwgMjA3LAotICAgIDIxNiwgMjI0LCAyMzEsIDIzNywgMjQxLCAyNDMsIDI0NSwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX25iW109IHsgMjU2LCA2NCwgMTI4LCAxOTIsIDI1NiB9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX21iW109IHsgMjU2LCA0MywgODUsIDEyOCwgMTcxLCAyMTMsIDI1NiB9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX3diW109IHsgMjU2LCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiB9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9kZWx0YVtdID0gewotICAgIDI1NiwgIDQ2LCAgNDgsICA1MCwgIDUzLCAgNTcsICA2MywgIDczLCAgODgsIDExNCwgMTUyLCAxODIsIDIwNCwgMjE5LCAyMjksIDIzNiwKLSAgICAyNDIsIDI0NiwgMjUwLCAyNTIsIDI1NCwgMjU2Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9jb250b3VyX25iMTBtc1tdID0geyAyNTYsIDE0MywgMTkzLCAyNTYgfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9uYjIwbXNbXSA9IHsKLSAgICAyNTYsICA2OCwgIDgwLCAxMDEsIDExOCwgMTM3LCAxNTksIDE4OSwgMjEzLCAyMzAsIDI0NiwgMjU2Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9jb250b3VyX21id2IxMG1zW10gPSB7Ci0gICAgMjU2LCAgOTEsIDEzNywgMTc2LCAxOTUsIDIwOSwgMjIxLCAyMjksIDIzNiwgMjQyLCAyNDcsIDI1MiwgMjU2Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9waXRjaF9jb250b3VyX21id2IyMG1zW10gPSB7Ci0gICAgMjU2LCAgMzMsICA1NSwgIDczLCAgODksIDEwNCwgMTE4LCAxMzIsIDE0NSwgMTU4LCAxNjgsIDE3NywgMTg2LCAxOTQsIDIwMCwgMjA2LAotICAgIDIxMiwgMjE3LCAyMjEsIDIyNSwgMjI5LCAyMzIsIDIzNSwgMjM4LCAyNDAsIDI0MiwgMjQ0LCAyNDYsIDI0OCwgMjUwLCAyNTIsIDI1MywKLSAgICAyNTQsIDI1NSwgMjU2Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9sdHBfZmlsdGVyW10gPSB7IDI1NiwgNzcsIDE1NywgMjU2IH07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX2x0cF9maWx0ZXIwX3NlbFtdID0gewotICAgIDI1NiwgMTg1LCAyMDAsIDIxMywgMjI2LCAyMzUsIDI0NCwgMjUwLCAyNTYKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX2x0cF9maWx0ZXIxX3NlbFtdID0gewotICAgIDI1NiwgIDU3LCAgOTEsIDExMiwgMTMyLCAxNDcsIDE2MCwgMTcyLCAxODUsIDE5NSwgMjA1LCAyMTQsIDIyNCwgMjMzLCAyNDEsIDI0OCwgMjU2Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9sdHBfZmlsdGVyMl9zZWxbXSA9IHsKLSAgICAyNTYsICAxNSwgIDMxLCAgNDUsICA1NywgIDY5LCAgODEsICA5MiwgMTAzLCAxMTQsIDEyNCwgMTMzLCAxNDIsIDE1MSwgMTYwLCAxNjgsCi0gICAgMTc2LCAxODQsIDE5MiwgMTk5LCAyMDYsIDIxMiwgMjE4LCAyMjMsIDIyNywgMjMyLCAyMzYsIDI0MCwgMjQ0LCAyNDcsIDI1MSwgMjU0LCAyNTYKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX2x0cF9zY2FsZV9pbmRleFtdID0geyAyNTYsIDEyOCwgMTkyLCAyNTYgfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfbGNnX3NlZWRbXSA9IHsgMjU2LCA2NCwgMTI4LCAxOTIsIDI1NiB9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19tb2RlbF9leGNfcmF0ZVsyXVsxMF0gPSB7Ci0gICAgeyAyNTYsICAxNSwgIDY2LCAgNzgsIDEyNCwgMTY5LCAxODIsIDIxNSwgMjQyLCAyNTYgfSwgLy8gdW52b2ljZWQKLSAgICB7IDI1NiwgIDMzLCAgNjMsICA5OSwgMTE2LCAxNTAsIDE5OSwgMjE3LCAyMzgsIDI1NiB9ICAvLyB2b2ljZWQKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX3B1bHNlX2NvdW50WzExXVsxOV0gPSB7Ci0gICAgeyAyNTYsIDEzMSwgMjA1LCAyMzAsIDIzOCwgMjQxLCAyNDQsIDI0NSwgMjQ2LAotICAgICAgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICA1OCwgMTUxLCAyMTEsIDIzNCwgMjQxLCAyNDQsIDI0NSwgMjQ2LAotICAgICAgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICA0MywgIDk0LCAxNDAsIDE3MywgMTk3LCAyMTMsIDIyNCwgMjMyLAotICAgICAgMjM4LCAyNDEsIDI0NCwgMjQ3LCAyNDksIDI1MCwgMjUxLCAyNTMsIDI1NCwgMjU2IH0sCi0gICAgeyAyNTYsICAxNywgIDY5LCAxNDAsIDE5NywgMjI4LCAyNDAsIDI0NSwgMjQ2LAotICAgICAgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICAgNiwgIDI3LCAgNjgsIDEyMSwgMTcwLCAyMDUsIDIyNiwgMjM3LAotICAgICAgMjQzLCAyNDYsIDI0OCwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICAgNywgIDIxLCAgNDMsICA3MSwgMTAwLCAxMjgsIDE1MywgMTczLAotICAgICAgMTkwLCAyMDMsIDIxNCwgMjIzLCAyMzAsIDIzNSwgMjM5LCAyNDMsIDI0NiwgMjU2IH0sCi0gICAgeyAyNTYsICAgMiwgICA3LCAgMjEsICA1MCwgIDkyLCAxMzgsIDE3OSwgMjEwLAotICAgICAgMjI5LCAyNDAsIDI0NiwgMjQ5LCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCi0gICAgeyAyNTYsICAgMSwgICAzLCAgIDcsICAxNywgIDM2LCAgNjUsIDEwMCwgMTM3LAotICAgICAgMTcxLCAxOTksIDIxOSwgMjMzLCAyNDEsIDI0NiwgMjUwLCAyNTIsIDI1NCwgMjU2IH0sCi0gICAgeyAyNTYsICAgMSwgICAzLCAgIDUsICAxMCwgIDE5LCAgMzMsICA1MywgIDc3LAotICAgICAgMTA0LCAxMzIsIDE1OCwgMTgxLCAyMDEsIDIxNiwgMjI3LCAyMzUsIDI0MSwgMjU2IH0sCi0gICAgeyAyNTYsICAgMSwgICAyLCAgIDMsICAgOSwgIDM2LCAgOTQsIDE1MCwgMTg5LAotICAgICAgMjE0LCAyMjgsIDIzOCwgMjQ0LCAyNDcsIDI1MCwgMjUyLCAyNTMsIDI1NCwgMjU2IH0sCi0gICAgeyAyNTYsICAgMiwgICAzLCAgIDksICAzNiwgIDk0LCAxNTAsIDE4OSwgMjE0LAotICAgICAgMjI4LCAyMzgsIDI0NCwgMjQ3LCAyNTAsIDI1MiwgMjUzLCAyNTQsIDI1NiwgMjU2IH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX21vZGVsX3B1bHNlX2xvY2F0aW9uWzRdWzE2OF0gPSB7Ci0gICAgewotICAgICAgICAyNTYsIDEyNiwgMjU2LAotICAgICAgICAyNTYsIDU2LCAxOTgsIDI1NiwKLSAgICAgICAgMjU2LCAyNSwgMTI2LCAyMzAsIDI1NiwKLSAgICAgICAgMjU2LCAxMiwgNzIsIDE4MCwgMjQ0LCAyNTYsCi0gICAgICAgIDI1NiwgNywgNDIsIDEyNiwgMjEzLCAyNTAsIDI1NiwKLSAgICAgICAgMjU2LCA0LCAyNCwgODMsIDE2OSwgMjMyLCAyNTMsIDI1NiwKLSAgICAgICAgMjU2LCAzLCAxNSwgNTMsIDEyNSwgMjAwLCAyNDIsIDI1NCwgMjU2LAotICAgICAgICAyNTYsIDIsIDEwLCAzNSwgODksIDE2MiwgMjIxLCAyNDgsIDI1NSwgMjU2LAotICAgICAgICAyNTYsIDIsIDcsIDI0LCA2MywgMTI2LCAxOTEsIDIzMywgMjUxLCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCA1LCAxNywgNDUsIDk0LCAxNTcsIDIxMSwgMjQxLCAyNTIsIDI1NSwgMjU2LAotICAgICAgICAyNTYsIDEsIDUsIDEzLCAzMywgNzAsIDEyNSwgMTgyLCAyMjMsIDI0NSwgMjUzLCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCA0LCAxMSwgMjYsIDU0LCA5OCwgMTUxLCAxOTksIDIzMiwgMjQ4LCAyNTQsIDI1NSwgMjU2LAotICAgICAgICAyNTYsIDEsIDMsIDksIDIxLCA0MiwgNzcsIDEyNCwgMTcyLCAyMTIsIDIzNywgMjQ5LCAyNTQsIDI1NSwgMjU2LAotICAgICAgICAyNTYsIDEsIDIsIDYsIDE2LCAzMywgNjAsIDk3LCAxNDQsIDE4NywgMjIwLCAyNDEsIDI1MCwgMjU0LCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCAyLCAzLCAxMSwgMjUsIDQ3LCA4MCwgMTIwLCAxNjMsIDIwMSwgMjI5LCAyNDUsIDI1MywgMjU0LCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCAyLCAzLCA0LCAxNywgMzUsIDYyLCA5OCwgMTM5LCAxODAsIDIxNCwgMjM4LCAyNTIsIDI1MywgMjU0LCAyNTUsIDI1NgotICAgIH0sewotICAgICAgICAyNTYsIDEyNywgMjU2LAotICAgICAgICAyNTYsIDUzLCAyMDIsIDI1NiwKLSAgICAgICAgMjU2LCAyMiwgMTI3LCAyMzMsIDI1NiwKLSAgICAgICAgMjU2LCAxMSwgNzIsIDE4MywgMjQ2LCAyNTYsCi0gICAgICAgIDI1NiwgNiwgNDEsIDEyNywgMjE1LCAyNTEsIDI1NiwKLSAgICAgICAgMjU2LCA0LCAyNCwgODMsIDE3MCwgMjMyLCAyNTMsIDI1NiwKLSAgICAgICAgMjU2LCAzLCAxNiwgNTYsIDEyNywgMjAwLCAyNDEsIDI1NCwgMjU2LAotICAgICAgICAyNTYsIDMsIDEyLCAzOSwgOTIsIDE2MiwgMjE4LCAyNDYsIDI1NSwgMjU2LAotICAgICAgICAyNTYsIDMsIDExLCAzMCwgNjcsIDEyNCwgMTg1LCAyMjksIDI0OSwgMjU1LCAyNTYsCi0gICAgICAgIDI1NiwgMywgMTAsIDI1LCA1MywgOTcsIDE1MSwgMjAwLCAyMzMsIDI1MCwgMjU1LCAyNTYsCi0gICAgICAgIDI1NiwgMSwgOCwgMjEsIDQzLCA3NywgMTIzLCAxNzEsIDIwOSwgMjM3LCAyNTEsIDI1NSwgMjU2LAotICAgICAgICAyNTYsIDEsIDIsIDEzLCAzNSwgNjIsIDk3LCAxMzksIDE4NiwgMjE5LCAyNDQsIDI1NCwgMjU1LCAyNTYsCi0gICAgICAgIDI1NiwgMSwgMiwgOCwgMjIsIDQ4LCA4NSwgMTI4LCAxNzEsIDIwOCwgMjM0LCAyNDgsIDI1NCwgMjU1LCAyNTYsCi0gICAgICAgIDI1NiwgMSwgMiwgNiwgMTYsIDM2LCA2NywgMTA3LCAxNDksIDE4OSwgMjIwLCAyNDAsIDI1MCwgMjU0LCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCAyLCA1LCAxMywgMjksIDU1LCA5MCwgMTI4LCAxNjYsIDIwMSwgMjI3LCAyNDMsIDI1MSwgMjU0LCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCAyLCA0LCAxMCwgMjIsIDQzLCA3MywgMTA5LCAxNDcsIDE4MywgMjEzLCAyMzQsIDI0NiwgMjUyLCAyNTQsIDI1NSwgMjU2Ci0gICAgfSx7Ci0gICAgICAgIDI1NiwgMTI3LCAyNTYsCi0gICAgICAgIDI1NiwgNDksIDIwNiwgMjU2LAotICAgICAgICAyNTYsIDIwLCAxMjcsIDIzNiwgMjU2LAotICAgICAgICAyNTYsIDExLCA3MSwgMTg0LCAyNDYsIDI1NiwKLSAgICAgICAgMjU2LCA3LCA0MywgMTI3LCAyMTQsIDI1MCwgMjU2LAotICAgICAgICAyNTYsIDYsIDMwLCA4NywgMTY5LCAyMjksIDI1MiwgMjU2LAotICAgICAgICAyNTYsIDUsIDIzLCA2MiwgMTI2LCAxOTQsIDIzNiwgMjUyLCAyNTYsCi0gICAgICAgIDI1NiwgNiwgMjAsIDQ5LCA5NiwgMTU3LCAyMDksIDIzOSwgMjUzLCAyNTYsCi0gICAgICAgIDI1NiwgMSwgMTYsIDM5LCA3NCwgMTI1LCAxNzUsIDIxNSwgMjQ1LCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCAyLCAyMywgNTUsIDk3LCAxNDksIDE5NSwgMjM2LCAyNTQsIDI1NSwgMjU2LAotICAgICAgICAyNTYsIDEsIDcsIDIzLCA1MCwgODYsIDEyOCwgMTcwLCAyMDYsIDIzMywgMjQ5LCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCA2LCAxOCwgMzksIDcwLCAxMDgsIDE0OCwgMTg2LCAyMTcsIDIzOCwgMjUwLCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCA0LCAxMywgMzAsIDU2LCA5MCwgMTI4LCAxNjYsIDIwMCwgMjI2LCAyNDMsIDI1MiwgMjU1LCAyNTYsCi0gICAgICAgIDI1NiwgMSwgNCwgMTEsIDI1LCA0NywgNzYsIDExMCwgMTQ2LCAxODAsIDIwOSwgMjMxLCAyNDUsIDI1MiwgMjU1LCAyNTYsCi0gICAgICAgIDI1NiwgMSwgMywgOCwgMTksIDM3LCA2MiwgOTMsIDEyOCwgMTYzLCAxOTQsIDIxOSwgMjM3LCAyNDgsIDI1MywgMjU1LCAyNTYsCi0gICAgICAgIDI1NiwgMSwgMiwgNiwgMTUsIDMwLCA1MSwgNzksIDExMSwgMTQ1LCAxNzcsIDIwNSwgMjI2LCAyNDEsIDI1MCwgMjU0LCAyNTUsIDI1NgotICAgIH0sewotICAgICAgICAyNTYsIDEyOCwgMjU2LAotICAgICAgICAyNTYsIDQyLCAyMTQsIDI1NiwKLSAgICAgICAgMjU2LCAyMSwgMTI4LCAyMzUsIDI1NiwKLSAgICAgICAgMjU2LCAxMiwgNzIsIDE4NCwgMjQ1LCAyNTYsCi0gICAgICAgIDI1NiwgOCwgNDIsIDEyOCwgMjE0LCAyNDksIDI1NiwKLSAgICAgICAgMjU2LCA4LCAzMSwgODYsIDE3NiwgMjMxLCAyNTEsIDI1NiwKLSAgICAgICAgMjU2LCA1LCAyMCwgNTgsIDEzMCwgMjAyLCAyMzgsIDI1MywgMjU2LAotICAgICAgICAyNTYsIDYsIDE4LCA0NSwgOTcsIDE3NCwgMjIxLCAyNDEsIDI1MSwgMjU2LAotICAgICAgICAyNTYsIDYsIDI1LCA1MywgODgsIDEyOCwgMTY4LCAyMDMsIDIzMSwgMjUwLCAyNTYsCi0gICAgICAgIDI1NiwgNCwgMTgsIDQwLCA3MSwgMTA4LCAxNDgsIDE4NSwgMjE2LCAyMzgsIDI1MiwgMjU2LAotICAgICAgICAyNTYsIDMsIDEzLCAzMSwgNTcsIDkwLCAxMjgsIDE2NiwgMTk5LCAyMjUsIDI0MywgMjUzLCAyNTYsCi0gICAgICAgIDI1NiwgMiwgMTAsIDIzLCA0NCwgNzMsIDEwOSwgMTQ3LCAxODMsIDIxMiwgMjMzLCAyNDYsIDI1NCwgMjU2LAotICAgICAgICAyNTYsIDEsIDYsIDE2LCAzMywgNTgsIDkwLCAxMjgsIDE2NiwgMTk4LCAyMjMsIDI0MCwgMjUwLCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCA1LCAxMiwgMjUsIDQ2LCA3NSwgMTEwLCAxNDYsIDE4MSwgMjEwLCAyMzEsIDI0NCwgMjUxLCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCAzLCA4LCAxOCwgMzUsIDYwLCA5MiwgMTI4LCAxNjQsIDE5NiwgMjIxLCAyMzgsIDI0OCwgMjUzLCAyNTUsIDI1NiwKLSAgICAgICAgMjU2LCAxLCAzLCA3LCAxNCwgMjcsIDQ4LCA3NiwgMTEwLCAxNDYsIDE4MCwgMjA4LCAyMjksIDI0MiwgMjQ5LCAyNTMsIDI1NSwgMjU2Ci0gICAgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfZXhjaXRhdGlvbl9sc2JbXSA9IHsyNTYsIDEzNiwgMjU2fTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfbW9kZWxfZXhjaXRhdGlvbl9zaWduWzNdWzJdWzddWzNdID0gewotICAgIHsgICAgLy8gSW5hY3RpdmUKLSAgICAgICAgeyAgICAvLyBMb3cgb2Zmc2V0Ci0gICAgICAgICAgICB7MjU2LCAgIDIsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAyMDcsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxODksIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNzksIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNzQsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNjMsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNTcsIDI1Nn0KLSAgICAgICAgfSwgeyAvLyBIaWdoIG9mZnNldAotICAgICAgICAgICAgezI1NiwgIDU4LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMjQ1LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMjM4LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMjMyLCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMjI1LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMjIwLCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMjExLCAyNTZ9Ci0gICAgICAgIH0KLSAgICB9LCB7IC8vIFVudm9pY2VkCi0gICAgICAgIHsgICAgLy8gTG93IG9mZnNldAotICAgICAgICAgICAgezI1NiwgICAxLCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMjEwLCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTkwLCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTc4LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTY5LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTYyLCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTUyLCAyNTZ9Ci0gICAgICAgIH0sIHsgLy8gSGlnaCBvZmZzZXQKLSAgICAgICAgICAgIHsyNTYsICA0OCwgMjU2fSwKLSAgICAgICAgICAgIHsyNTYsIDI0MiwgMjU2fSwKLSAgICAgICAgICAgIHsyNTYsIDIzNSwgMjU2fSwKLSAgICAgICAgICAgIHsyNTYsIDIyNCwgMjU2fSwKLSAgICAgICAgICAgIHsyNTYsIDIxNCwgMjU2fSwKLSAgICAgICAgICAgIHsyNTYsIDIwNSwgMjU2fSwKLSAgICAgICAgICAgIHsyNTYsIDE5MCwgMjU2fQotICAgICAgICB9Ci0gICAgfSwgeyAvLyBWb2ljZWQKLSAgICAgICAgeyAgICAvLyBMb3cgb2Zmc2V0Ci0gICAgICAgICAgICB7MjU2LCAgIDEsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNjIsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNTIsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNDcsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNDQsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxNDEsIDI1Nn0sCi0gICAgICAgICAgICB7MjU2LCAxMzgsIDI1Nn0KLSAgICAgICAgfSwgeyAvLyBIaWdoIG9mZnNldAotICAgICAgICAgICAgezI1NiwgICA4LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMjAzLCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTg3LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTc2LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTY4LCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTYxLCAyNTZ9LAotICAgICAgICAgICAgezI1NiwgMTU0LCAyNTZ9Ci0gICAgICAgIH0KLSAgICB9Ci19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCBzaWxrX3N0ZXJlb193ZWlnaHRzW10gPSB7Ci0gICAgLTEzNzMyLCAtMTAwNTAsICAtODI2NiwgIC03NTI2LCAgLTY1MDAsICAtNTAwMCwgIC0yOTUwLCAgIC04MjAsCi0gICAgICAgODIwLCAgIDI5NTAsICAgNTAwMCwgICA2NTAwLCAgIDc1MjYsICAgODI2NiwgIDEwMDUwLCAgMTM3MzIKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNpbGtfbHNmX3MyX21vZGVsX3NlbF9uYm1iWzMyXVsxMF0gPSB7Ci0gICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCi0gICAgeyAxLCAzLCAxLCAyLCAyLCAxLCAyLCAxLCAxLCAxIH0sCi0gICAgeyAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0sCi0gICAgeyAxLCAyLCAyLCAyLCAyLCAxLCAyLCAxLCAxLCAxIH0sCi0gICAgeyAyLCAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyIH0sCi0gICAgeyAwLCA1LCAzLCAzLCAyLCAyLCAyLCAyLCAxLCAxIH0sCi0gICAgeyAwLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxIH0sCi0gICAgeyAyLCAzLCA2LCA0LCA0LCA0LCA1LCA0LCA1LCA1IH0sCi0gICAgeyAyLCA0LCA1LCA1LCA0LCA1LCA0LCA2LCA0LCA0IH0sCi0gICAgeyAyLCA0LCA0LCA3LCA0LCA1LCA0LCA1LCA1LCA0IH0sCi0gICAgeyA0LCAzLCAzLCAzLCAyLCAzLCAyLCAyLCAyLCAyIH0sCi0gICAgeyAxLCA1LCA1LCA2LCA0LCA1LCA0LCA1LCA1LCA1IH0sCi0gICAgeyAyLCA3LCA0LCA2LCA1LCA1LCA1LCA1LCA1LCA1IH0sCi0gICAgeyAyLCA3LCA1LCA1LCA1LCA1LCA1LCA2LCA1LCA0IH0sCi0gICAgeyAzLCAzLCA1LCA0LCA0LCA1LCA0LCA1LCA0LCA0IH0sCi0gICAgeyAyLCAzLCAzLCA1LCA1LCA0LCA0LCA0LCA0LCA0IH0sCi0gICAgeyAyLCA0LCA0LCA2LCA0LCA1LCA0LCA1LCA1LCA1IH0sCi0gICAgeyAyLCA1LCA0LCA2LCA1LCA1LCA1LCA0LCA1LCA0IH0sCi0gICAgeyAyLCA3LCA0LCA1LCA0LCA1LCA0LCA1LCA1LCA1IH0sCi0gICAgeyAyLCA1LCA0LCA2LCA3LCA2LCA1LCA2LCA1LCA0IH0sCi0gICAgeyAzLCA2LCA3LCA0LCA2LCA1LCA1LCA2LCA0LCA1IH0sCi0gICAgeyAyLCA3LCA2LCA0LCA0LCA0LCA1LCA0LCA1LCA1IH0sCi0gICAgeyA0LCA1LCA1LCA0LCA2LCA2LCA1LCA2LCA1LCA0IH0sCi0gICAgeyAyLCA1LCA1LCA2LCA1LCA2LCA0LCA2LCA0LCA0IH0sCi0gICAgeyA0LCA1LCA1LCA1LCAzLCA3LCA0LCA1LCA1LCA0IH0sCi0gICAgeyAyLCAzLCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA0IH0sCi0gICAgeyAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCAzIH0sCi0gICAgeyAxLCAxLCAyLCAyLCAyLCAyLCAyLCAzLCAyLCAyIH0sCi0gICAgeyA0LCA1LCA1LCA2LCA2LCA2LCA1LCA2LCA0LCA1IH0sCi0gICAgeyAzLCA1LCA1LCA0LCA0LCA0LCA0LCAzLCAzLCAyIH0sCi0gICAgeyAyLCA1LCAzLCA3LCA1LCA1LCA0LCA0LCA1LCA0IH0sCi0gICAgeyA0LCA0LCA1LCA0LCA1LCA2LCA1LCA2LCA1LCA0IH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNpbGtfbHNmX3MyX21vZGVsX3NlbF93YlszMl1bMTZdID0gewotICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDggfSwKLSAgICB7IDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDgsIDExIH0sCi0gICAgeyAxMCwgMTMsIDEzLCAxMSwgMTUsIDEyLCAxMiwgMTMsIDEwLCAxMywgMTIsIDEzLCAxMywgMTIsIDExLCAxMSB9LAotICAgIHsgIDgsIDEwLCAgOSwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDkgfSwKLSAgICB7ICA4LCAxNCwgMTMsIDEyLCAxNCwgMTIsIDE1LCAxMywgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMiwgMTIsIDExIH0sCi0gICAgeyAgOCwgMTEsIDEzLCAxMywgMTIsIDExLCAxMSwgMTMsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMiB9LAotICAgIHsgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDggfSwKLSAgICB7ICA4LCAxMCwgMTQsIDExLCAxNSwgMTAsIDEzLCAxMSwgMTIsIDEzLCAxMywgMTIsIDExLCAxMSwgMTAsIDExIH0sCi0gICAgeyAgOCwgMTQsIDEwLCAxNCwgMTQsIDEyLCAxMywgMTIsIDE0LCAxMywgMTIsIDEyLCAxMywgMTEsIDExLCAxMSB9LAotICAgIHsgMTAsICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDggfSwKLSAgICB7ICA4LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA5IH0sCi0gICAgeyAxMCwgMTAsIDExLCAxMiwgMTMsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsICA5LCAxMSB9LAotICAgIHsgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAgOSwgMTEgfSwKLSAgICB7IDExLCAxMiwgMTIsIDEyLCAxNCwgMTIsIDEyLCAxMywgMTEsIDEzLCAxMiwgMTIsIDEzLCAxMiwgMTEsIDEyIH0sCi0gICAgeyAgOCwgMTQsIDEyLCAxMywgMTIsIDE1LCAxMywgMTAsIDE0LCAxMywgMTUsIDEyLCAxMiwgMTEsIDEzLCAxMSB9LAotICAgIHsgIDgsICA5LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOSwgIDggfSwKLSAgICB7ICA5LCAxNCwgMTMsIDE1LCAxMywgMTIsIDEzLCAxMSwgMTIsIDEzLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDEyIH0sCi0gICAgeyAgOSwgMTEsIDExLCAxMiwgMTIsIDExLCAxMSwgMTMsIDEwLCAxMSwgMTEsIDEzLCAxMywgMTMsIDExLCAxMiB9LAotICAgIHsgMTAsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTEsIDEwLCAgOSwgMTAsICA5LCAxMCwgIDksICA5LCAgOSwgMTIgfSwKLSAgICB7ICA4LCAxMCwgMTEsIDEzLCAxMSwgMTEsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4IH0sCi0gICAgeyAxMSwgMTIsIDExLCAxMywgMTEsIDExLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMiB9LAotICAgIHsgMTAsIDE0LCAxMSwgMTUsIDE1LCAxMiwgMTMsIDEyLCAxMywgMTEsIDEzLCAxMSwgMTEsIDEwLCAxMSwgMTEgfSwKLSAgICB7IDEwLCAxMSwgMTMsIDE0LCAxNCwgMTEsIDEzLCAxMSwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEyIH0sCi0gICAgeyAgOSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDEzLCAxMywgMTMsIDExLCAgOSwgIDksICA5LCAgOSB9LAotICAgIHsgMTAsIDEzLCAxMSwgMTQsIDE0LCAxMiwgMTUsIDEyLCAxMiwgMTMsIDExLCAxMiwgMTIsIDExLCAxMSwgMTEgfSwKLSAgICB7ICA4LCAxNCwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4IH0sCi0gICAgeyAgOCwgMTQsIDE0LCAxMSwgMTMsIDEwLCAxMywgMTMsIDExLCAxMiwgMTIsIDE1LCAxNSwgMTIsIDEyLCAxMiB9LAotICAgIHsgMTEsIDExLCAxNSwgMTEsIDEzLCAxMiwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMCwgMTEgfSwKLSAgICB7ICA4LCAgOCwgIDksICA4LCAgOCwgIDgsIDEwLCAgOSwgMTAsICA5LCAgOSwgMTAsIDEwLCAxMCwgIDksICA5IH0sCi0gICAgeyAgOCwgMTEsIDEwLCAxMywgMTEsIDExLCAxMCwgMTEsIDEwLCAgOSwgIDgsICA4LCAgOSwgIDgsICA4LCAgOSB9LAotICAgIHsgMTEsIDEzLCAxMywgMTIsIDE1LCAxMywgMTEsIDExLCAxMCwgMTEsIDEwLCAxMCwgIDksICA4LCAgOSwgIDggfSwKLSAgICB7IDEwLCAxMSwgMTMsIDExLCAxMiwgMTEsIDExLCAxMSwgMTAsICA5LCAxMCwgMTQsIDEyLCAgOCwgIDgsICA4IH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNpbGtfbHNmX3ByZWRfd2VpZ2h0c19uYm1iWzJdWzldID0gewotICAgIHsxNzksIDEzOCwgMTQwLCAxNDgsIDE1MSwgMTQ5LCAxNTMsIDE1MSwgMTYzfSwKLSAgICB7MTE2LCAgNjcsICA4MiwgIDU5LCAgOTIsICA3MiwgMTAwLCAgODksICA5Mn0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNpbGtfbHNmX3ByZWRfd2VpZ2h0c193YlsyXVsxNV0gPSB7Ci0gICAgezE3NSwgMTQ4LCAxNjAsIDE3NiwgMTc4LCAxNzMsIDE3NCwgMTY0LCAxNzcsIDE3NCwgMTk2LCAxODIsIDE5OCwgMTkyLCAxODJ9LAotICAgIHsgNjgsICA2MiwgIDY2LCAgNjAsICA3MiwgMTE3LCAgODUsICA5MCwgMTE4LCAxMzYsIDE1MSwgMTQyLCAxNjAsIDE0MiwgMTU1fQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19sc2Zfd2VpZ2h0X3NlbF9uYm1iWzMyXVs5XSA9IHsKLSAgICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDAgfSwKLSAgICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDEsIDAsIDEsIDEsIDAsIDAsIDAsIDEsIDAgfSwKLSAgICB7IDAsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDAgfSwKLSAgICB7IDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDEgfSwKLSAgICB7IDAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEgfSwKLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDAgfSwKLSAgICB7IDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDAgfSwKLSAgICB7IDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAgfSwKLSAgICB7IDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEgfSwKLSAgICB7IDAsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAgfSwKLSAgICB7IDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDAgfSwKLSAgICB7IDAsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEgfSwKLSAgICB7IDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDAgfSwKLSAgICB7IDAsIDAsIDAsIDEsIDEsIDEsIDAsIDEsIDAgfSwKLSAgICB7IDAsIDEsIDEsIDAsIDAsIDEsIDAsIDEsIDAgfSwKLSAgICB7IDAsIDEsIDEsIDAsIDAsIDAsIDEsIDEsIDAgfSwKLSAgICB7IDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEgfSwKLSAgICB7IDAsIDAsIDEsIDEsIDAsIDAsIDAsIDEsIDEgfSwKLSAgICB7IDAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDEgfSwKLSAgICB7IDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAgfSwKLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDAsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDAgfSwKLSAgICB7IDEsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAgfSwKLSAgICB7IDAsIDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEgfSwKLSAgICB7IDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19sc2Zfd2VpZ2h0X3NlbF93YlszMl1bMTVdID0gewotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotICAgIHsgMCwgMCwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMCB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LAotICAgIHsgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMCB9LAotICAgIHsgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotICAgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMCB9LAotICAgIHsgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMCwgMSwgMCwgMSB9LAotICAgIHsgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAotICAgIHsgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotICAgIHsgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMCwgMCB9LAotICAgIHsgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMCwgMSwgMCwgMCB9LAotICAgIHsgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMCB9LAotICAgIHsgMCwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSB9LAotICAgIHsgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCB9LAotICAgIHsgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMCwgMCB9LAotICAgIHsgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMCB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAotICAgIHsgMCwgMSwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMSwgMCB9LAotICAgIHsgMCwgMCwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMCB9LAotICAgIHsgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCB9LAotICAgIHsgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAotICAgIHsgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMSwgMSwgMSB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAotICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSB9LAotICAgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCB9LAotICAgIHsgMCwgMCwgMSwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMCwgMSwgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzaWxrX2xzZl9jb2RlYm9va19uYm1iWzMyXVsxMF0gPSB7Ci0gICAgeyAxMiwgIDM1LCAgNjAsICA4MywgMTA4LCAxMzIsIDE1NywgMTgwLCAyMDYsIDIyOCB9LAotICAgIHsgMTUsICAzMiwgIDU1LCAgNzcsIDEwMSwgMTI1LCAxNTEsIDE3NSwgMjAxLCAyMjUgfSwKLSAgICB7IDE5LCAgNDIsICA2NiwgIDg5LCAxMTQsIDEzNywgMTYyLCAxODQsIDIwOSwgMjMwIH0sCi0gICAgeyAxMiwgIDI1LCAgNTAsICA3MiwgIDk3LCAxMjAsIDE0NywgMTcyLCAyMDAsIDIyMyB9LAotICAgIHsgMjYsICA0NCwgIDY5LCAgOTAsIDExNCwgMTM1LCAxNTksIDE4MCwgMjA1LCAyMjUgfSwKLSAgICB7IDEzLCAgMjIsICA1MywgIDgwLCAxMDYsIDEzMCwgMTU2LCAxODAsIDIwNSwgMjI4IH0sCi0gICAgeyAxNSwgIDI1LCAgNDQsICA2NCwgIDkwLCAxMTUsIDE0MiwgMTY4LCAxOTYsIDIyMiB9LAotICAgIHsgMTksICAyNCwgIDYyLCAgODIsIDEwMCwgMTIwLCAxNDUsIDE2OCwgMTkwLCAyMTQgfSwKLSAgICB7IDIyLCAgMzEsICA1MCwgIDc5LCAxMDMsIDEyMCwgMTUxLCAxNzAsIDIwMywgMjI3IH0sCi0gICAgeyAyMSwgIDI5LCAgNDUsICA2NSwgMTA2LCAxMjQsIDE1MCwgMTcxLCAxOTYsIDIyNCB9LAotICAgIHsgMzAsICA0OSwgIDc1LCAgOTcsIDEyMSwgMTQyLCAxNjUsIDE4NiwgMjA5LCAyMjkgfSwKLSAgICB7IDE5LCAgMjUsICA1MiwgIDcwLCAgOTMsIDExNiwgMTQzLCAxNjYsIDE5MiwgMjE5IH0sCi0gICAgeyAyNiwgIDM0LCAgNjIsICA3NSwgIDk3LCAxMTgsIDE0NSwgMTY3LCAxOTQsIDIxNyB9LAotICAgIHsgMjUsICAzMywgIDU2LCAgNzAsICA5MSwgMTEzLCAxNDMsIDE2NSwgMTk2LCAyMjMgfSwKLSAgICB7IDIxLCAgMzQsICA1MSwgIDcyLCAgOTcsIDExNywgMTQ1LCAxNzEsIDE5NiwgMjIyIH0sCi0gICAgeyAyMCwgIDI5LCAgNTAsICA2NywgIDkwLCAxMTcsIDE0NCwgMTY4LCAxOTcsIDIyMSB9LAotICAgIHsgMjIsICAzMSwgIDQ4LCAgNjYsICA5NSwgMTE3LCAxNDYsIDE2OCwgMTk2LCAyMjIgfSwKLSAgICB7IDI0LCAgMzMsICA1MSwgIDc3LCAxMTYsIDEzNCwgMTU4LCAxODAsIDIwMCwgMjI0IH0sCi0gICAgeyAyMSwgIDI4LCAgNzAsICA4NywgMTA2LCAxMjQsIDE0OSwgMTcwLCAxOTQsIDIxNyB9LAotICAgIHsgMjYsICAzMywgIDUzLCAgNjQsICA4MywgMTE3LCAxNTIsIDE3MywgMjA0LCAyMjUgfSwKLSAgICB7IDI3LCAgMzQsICA2NSwgIDk1LCAxMDgsIDEyOSwgMTU1LCAxNzQsIDIxMCwgMjI1IH0sCi0gICAgeyAyMCwgIDI2LCAgNzIsICA5OSwgMTEzLCAxMzEsIDE1NCwgMTc2LCAyMDAsIDIxOSB9LAotICAgIHsgMzQsICA0MywgIDYxLCAgNzgsICA5MywgMTE0LCAxNTUsIDE3NywgMjA1LCAyMjkgfSwKLSAgICB7IDIzLCAgMjksICA1NCwgIDk3LCAxMjQsIDEzOCwgMTYzLCAxNzksIDIwOSwgMjI5IH0sCi0gICAgeyAzMCwgIDM4LCAgNTYsICA4OSwgMTE4LCAxMjksIDE1OCwgMTc4LCAyMDAsIDIzMSB9LAotICAgIHsgMjEsICAyOSwgIDQ5LCAgNjMsICA4NSwgMTExLCAxNDIsIDE2MywgMTkzLCAyMjIgfSwKLSAgICB7IDI3LCAgNDgsICA3NywgMTAzLCAxMzMsIDE1OCwgMTc5LCAxOTYsIDIxNSwgMjMyIH0sCi0gICAgeyAyOSwgIDQ3LCAgNzQsICA5OSwgMTI0LCAxNTEsIDE3NiwgMTk4LCAyMjAsIDIzNyB9LAotICAgIHsgMzMsICA0MiwgIDYxLCAgNzYsICA5MywgMTIxLCAxNTUsIDE3NCwgMjA3LCAyMjUgfSwKLSAgICB7IDI5LCAgNTMsICA4NywgMTEyLCAxMzYsIDE1NCwgMTcwLCAxODgsIDIwOCwgMjI3IH0sCi0gICAgeyAyNCwgIDMwLCAgNTIsICA4NCwgMTMxLCAxNTAsIDE2NiwgMTg2LCAyMDMsIDIyOSB9LAotICAgIHsgMzcsICA0OCwgIDY0LCAgODQsIDEwNCwgMTE4LCAxNTYsIDE3NywgMjAxLCAyMzAgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19sc2ZfY29kZWJvb2tfd2JbMzJdWzE2XSA9IHsKLSAgICB7ICA3LCAgMjMsICAzOCwgIDU0LCAgNjksICA4NSwgMTAwLCAxMTYsIDEzMSwgMTQ3LCAxNjIsIDE3OCwgMTkzLCAyMDgsIDIyMywgMjM5IH0sCi0gICAgeyAxMywgIDI1LCAgNDEsICA1NSwgIDY5LCAgODMsICA5OCwgMTEyLCAxMjcsIDE0MiwgMTU3LCAxNzEsIDE4NywgMjAzLCAyMjAsIDIzNiB9LAotICAgIHsgMTUsICAyMSwgIDM0LCAgNTEsICA2MSwgIDc4LCAgOTIsIDEwNiwgMTI2LCAxMzYsIDE1MiwgMTY3LCAxODUsIDIwNSwgMjI1LCAyNDAgfSwKLSAgICB7IDEwLCAgMjEsICAzNiwgIDUwLCAgNjMsICA3OSwgIDk1LCAxMTAsIDEyNiwgMTQxLCAxNTcsIDE3MywgMTg5LCAyMDUsIDIyMSwgMjM3IH0sCi0gICAgeyAxNywgIDIwLCAgMzcsICA1MSwgIDU5LCAgNzgsICA4OSwgMTA3LCAxMjMsIDEzNCwgMTUwLCAxNjQsIDE4NCwgMjA1LCAyMjQsIDI0MCB9LAotICAgIHsgMTAsICAxNSwgIDMyLCAgNTEsICA2NywgIDgxLCAgOTYsIDExMiwgMTI5LCAxNDIsIDE1OCwgMTczLCAxODksIDIwNCwgMjIwLCAyMzYgfSwKLSAgICB7ICA4LCAgMjEsICAzNywgIDUxLCAgNjUsICA3OSwgIDk4LCAxMTMsIDEyNiwgMTM4LCAxNTUsIDE2OCwgMTc5LCAxOTIsIDIwOSwgMjE4IH0sCi0gICAgeyAxMiwgIDE1LCAgMzQsICA1NSwgIDYzLCAgNzgsICA4NywgMTA4LCAxMTgsIDEzMSwgMTQ4LCAxNjcsIDE4NSwgMjAzLCAyMTksIDIzNiB9LAotICAgIHsgMTYsICAxOSwgIDMyLCAgMzYsICA1NiwgIDc5LCAgOTEsIDEwOCwgMTE4LCAxMzYsIDE1NCwgMTcxLCAxODYsIDIwNCwgMjIwLCAyMzcgfSwKLSAgICB7IDExLCAgMjgsICA0MywgIDU4LCAgNzQsICA4OSwgMTA1LCAxMjAsIDEzNSwgMTUwLCAxNjUsIDE4MCwgMTk2LCAyMTEsIDIyNiwgMjQxIH0sCi0gICAgeyAgNiwgIDE2LCAgMzMsICA0NiwgIDYwLCAgNzUsICA5MiwgMTA3LCAxMjMsIDEzNywgMTU2LCAxNjksIDE4NSwgMTk5LCAyMTQsIDIyNSB9LAotICAgIHsgMTEsICAxOSwgIDMwLCAgNDQsICA1NywgIDc0LCAgODksIDEwNSwgMTIxLCAxMzUsIDE1MiwgMTY5LCAxODYsIDIwMiwgMjE4LCAyMzQgfSwKLSAgICB7IDEyLCAgMTksICAyOSwgIDQ2LCAgNTcsICA3MSwgIDg4LCAxMDAsIDEyMCwgMTMyLCAxNDgsIDE2NSwgMTgyLCAxOTksIDIxNiwgMjMzIH0sCi0gICAgeyAxNywgIDIzLCAgMzUsICA0NiwgIDU2LCAgNzcsICA5MiwgMTA2LCAxMjMsIDEzNCwgMTUyLCAxNjcsIDE4NSwgMjA0LCAyMjIsIDIzNyB9LAotICAgIHsgMTQsICAxNywgIDQ1LCAgNTMsICA2MywgIDc1LCAgODksIDEwNywgMTE1LCAxMzIsIDE1MSwgMTcxLCAxODgsIDIwNiwgMjIxLCAyNDAgfSwKLSAgICB7ICA5LCAgMTYsICAyOSwgIDQwLCAgNTYsICA3MSwgIDg4LCAxMDMsIDExOSwgMTM3LCAxNTQsIDE3MSwgMTg5LCAyMDUsIDIyMiwgMjM3IH0sCi0gICAgeyAxNiwgIDE5LCAgMzYsICA0OCwgIDU3LCAgNzYsICA4NywgMTA1LCAxMTgsIDEzMiwgMTUwLCAxNjcsIDE4NSwgMjAyLCAyMTgsIDIzNiB9LAotICAgIHsgMTIsICAxNywgIDI5LCAgNTQsICA3MSwgIDgxLCAgOTQsIDEwNCwgMTI2LCAxMzYsIDE0OSwgMTY0LCAxODIsIDIwMSwgMjIxLCAyMzcgfSwKLSAgICB7IDE1LCAgMjgsICA0NywgIDYyLCAgNzksICA5NywgMTE1LCAxMjksIDE0MiwgMTU1LCAxNjgsIDE4MCwgMTk0LCAyMDgsIDIyMywgMjM4IH0sCi0gICAgeyAgOCwgIDE0LCAgMzAsICA0NSwgIDYyLCAgNzgsICA5NCwgMTExLCAxMjcsIDE0MywgMTU5LCAxNzUsIDE5MiwgMjA3LCAyMjMsIDIzOSB9LAotICAgIHsgMTcsICAzMCwgIDQ5LCAgNjIsICA3OSwgIDkyLCAxMDcsIDExOSwgMTMyLCAxNDUsIDE2MCwgMTc0LCAxOTAsIDIwNCwgMjIwLCAyMzUgfSwKLSAgICB7IDE0LCAgMTksICAzNiwgIDQ1LCAgNjEsICA3NiwgIDkxLCAxMDgsIDEyMSwgMTM4LCAxNTQsIDE3MiwgMTg5LCAyMDUsIDIyMiwgMjM4IH0sCi0gICAgeyAxMiwgIDE4LCAgMzEsICA0NSwgIDYwLCAgNzYsICA5MSwgMTA3LCAxMjMsIDEzOCwgMTU0LCAxNzEsIDE4NywgMjA0LCAyMjEsIDIzNiB9LAotICAgIHsgMTMsICAxNywgIDMxLCAgNDMsICA1MywgIDcwLCAgODMsIDEwMywgMTE0LCAxMzEsIDE0OSwgMTY3LCAxODUsIDIwMywgMjIwLCAyMzcgfSwKLSAgICB7IDE3LCAgMjIsICAzNSwgIDQyLCAgNTgsICA3OCwgIDkzLCAxMTAsIDEyNSwgMTM5LCAxNTUsIDE3MCwgMTg4LCAyMDYsIDIyNCwgMjQwIH0sCi0gICAgeyAgOCwgIDE1LCAgMzQsICA1MCwgIDY3LCAgODMsICA5OSwgMTE1LCAxMzEsIDE0NiwgMTYyLCAxNzgsIDE5MywgMjA5LCAyMjQsIDIzOSB9LAotICAgIHsgMTMsICAxNiwgIDQxLCAgNjYsICA3MywgIDg2LCAgOTUsIDExMSwgMTI4LCAxMzcsIDE1MCwgMTYzLCAxODMsIDIwNiwgMjI1LCAyNDEgfSwKLSAgICB7IDE3LCAgMjUsICAzNywgIDUyLCAgNjMsICA3NSwgIDkyLCAxMDIsIDExOSwgMTMyLCAxNDQsIDE2MCwgMTc1LCAxOTEsIDIxMiwgMjMxIH0sCi0gICAgeyAxOSwgIDMxLCAgNDksICA2NSwgIDgzLCAxMDAsIDExNywgMTMzLCAxNDcsIDE2MSwgMTc0LCAxODcsIDIwMCwgMjEzLCAyMjcsIDI0MiB9LAotICAgIHsgMTgsICAzMSwgIDUyLCAgNjgsICA4OCwgMTAzLCAxMTcsIDEyNiwgMTM4LCAxNDksIDE2MywgMTc3LCAxOTIsIDIwNywgMjIzLCAyMzkgfSwKLSAgICB7IDE2LCAgMjksICA0NywgIDYxLCAgNzYsICA5MCwgMTA2LCAxMTksIDEzMywgMTQ3LCAxNjEsIDE3NiwgMTkzLCAyMDksIDIyNCwgMjQwIH0sCi0gICAgeyAxNSwgIDIxLCAgMzUsICA1MCwgIDYxLCAgNzMsICA4NiwgIDk3LCAxMTAsIDExOSwgMTI5LCAxNDEsIDE3NSwgMTk4LCAyMTgsIDIzNyB9Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19sc2ZfbWluX3NwYWNpbmdfbmJtYltdID0gewotICAgIDI1MCwgMywgNiwgMywgMywgMywgNCwgMywgMywgMywgNDYxCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19sc2ZfbWluX3NwYWNpbmdfd2JbXSA9IHsKLSAgICAxMDAsIDMsIDQwLCAzLCAzLCAzLCA1LCAxNCwgMTQsIDEwLCAxMSwgMywgOCwgOSwgNywgMywgMzQ3Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzaWxrX2xzZl9vcmRlcmluZ19uYm1iW10gPSB7Ci0gICAgMCwgOSwgNiwgMywgNCwgNSwgOCwgMSwgMiwgNwotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19sc2Zfb3JkZXJpbmdfd2JbXSA9IHsKLSAgICAwLCAxNSwgOCwgNywgNCwgMTEsIDEyLCAzLCAyLCAxMywgMTAsIDUsIDYsIDksIDE0LCAxCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCBzaWxrX2Nvc2luZVtdID0geyAvKiAoMC4xMikgKi8KLSAgICAgNDA5NiwgIDQwOTUsICA0MDkxLCAgNDA4NSwKLSAgICAgNDA3NiwgIDQwNjUsICA0MDUyLCAgNDAzNiwKLSAgICAgNDAxNywgIDM5OTcsICAzOTczLCAgMzk0OCwKLSAgICAgMzkyMCwgIDM4ODksICAzODU3LCAgMzgyMiwKLSAgICAgMzc4NCwgIDM3NDUsICAzNzAzLCAgMzY1OSwKLSAgICAgMzYxMywgIDM1NjQsICAzNTEzLCAgMzQ2MSwKLSAgICAgMzQwNiwgIDMzNDksICAzMjkwLCAgMzIyOSwKLSAgICAgMzE2NiwgIDMxMDIsICAzMDM1LCAgMjk2NywKLSAgICAgMjg5NiwgIDI4MjQsICAyNzUxLCAgMjY3NiwKLSAgICAgMjU5OSwgIDI1MjAsICAyNDQwLCAgMjM1OSwKLSAgICAgMjI3NiwgIDIxOTEsICAyMTA2LCAgMjAxOSwKLSAgICAgMTkzMSwgIDE4NDIsICAxNzUxLCAgMTY2MCwKLSAgICAgMTU2OCwgIDE0NzQsICAxMzgwLCAgMTI4NSwKLSAgICAgMTE4OSwgIDEwOTMsICAgOTk1LCAgIDg5NywKLSAgICAgIDc5OSwgICA3MDAsICAgNjAxLCAgIDUwMSwKLSAgICAgIDQwMSwgICAzMDEsICAgMjAxLCAgIDEwMSwKLSAgICAgICAgMCwgIC0xMDEsICAtMjAxLCAgLTMwMSwKLSAgICAgLTQwMSwgIC01MDEsICAtNjAxLCAgLTcwMCwKLSAgICAgLTc5OSwgIC04OTcsICAtOTk1LCAtMTA5MywKLSAgICAtMTE4OSwgLTEyODUsIC0xMzgwLCAtMTQ3NCwKLSAgICAtMTU2OCwgLTE2NjAsIC0xNzUxLCAtMTg0MiwKLSAgICAtMTkzMSwgLTIwMTksIC0yMTA2LCAtMjE5MSwKLSAgICAtMjI3NiwgLTIzNTksIC0yNDQwLCAtMjUyMCwKLSAgICAtMjU5OSwgLTI2NzYsIC0yNzUxLCAtMjgyNCwKLSAgICAtMjg5NiwgLTI5NjcsIC0zMDM1LCAtMzEwMiwKLSAgICAtMzE2NiwgLTMyMjksIC0zMjkwLCAtMzM0OSwKLSAgICAtMzQwNiwgLTM0NjEsIC0zNTEzLCAtMzU2NCwKLSAgICAtMzYxMywgLTM2NTksIC0zNzAzLCAtMzc0NSwKLSAgICAtMzc4NCwgLTM4MjIsIC0zODU3LCAtMzg4OSwKLSAgICAtMzkyMCwgLTM5NDgsIC0zOTczLCAtMzk5NywKLSAgICAtNDAxNywgLTQwMzYsIC00MDUyLCAtNDA2NSwKLSAgICAtNDA3NiwgLTQwODUsIC00MDkxLCAtNDA5NSwKLSAgICAtNDA5NgotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IHNpbGtfcGl0Y2hfc2NhbGVbXSAgID0geyAgNCwgICA2LCAgIDh9OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19waXRjaF9taW5fbGFnW10gPSB7IDE2LCAgMjQsICAzMn07Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX3BpdGNoX21heF9sYWdbXSA9IHsxNDQsIDIxNiwgMjg4fTsKLQotc3RhdGljIGNvbnN0IGludDhfdCBzaWxrX3BpdGNoX29mZnNldF9uYjEwbXNbM11bMl0gPSB7Ci0gICAgeyAwLCAgMH0sCi0gICAgeyAxLCAgMH0sCi0gICAgeyAwLCAgMX0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3Qgc2lsa19waXRjaF9vZmZzZXRfbmIyMG1zWzExXVs0XSA9IHsKLSAgICB7IDAsICAwLCAgMCwgIDB9LAotICAgIHsgMiwgIDEsICAwLCAtMX0sCi0gICAgey0xLCAgMCwgIDEsICAyfSwKLSAgICB7LTEsICAwLCAgMCwgIDF9LAotICAgIHstMSwgIDAsICAwLCAgMH0sCi0gICAgeyAwLCAgMCwgIDAsICAxfSwKLSAgICB7IDAsICAwLCAgMSwgIDF9LAotICAgIHsgMSwgIDEsICAwLCAgMH0sCi0gICAgeyAxLCAgMCwgIDAsICAwfSwKLSAgICB7IDAsICAwLCAgMCwgLTF9LAotICAgIHsgMSwgIDAsICAwLCAtMX0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3Qgc2lsa19waXRjaF9vZmZzZXRfbWJ3YjEwbXNbMTJdWzJdID0gewotICAgIHsgMCwgIDB9LAotICAgIHsgMCwgIDF9LAotICAgIHsgMSwgIDB9LAotICAgIHstMSwgIDF9LAotICAgIHsgMSwgLTF9LAotICAgIHstMSwgIDJ9LAotICAgIHsgMiwgLTF9LAotICAgIHstMiwgIDJ9LAotICAgIHsgMiwgLTJ9LAotICAgIHstMiwgIDN9LAotICAgIHsgMywgLTJ9LAotICAgIHstMywgIDN9Ci19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IHNpbGtfcGl0Y2hfb2Zmc2V0X21id2IyMG1zWzM0XVs0XSA9IHsKLSAgICB7IDAsICAwLCAgMCwgIDB9LAotICAgIHsgMCwgIDAsICAxLCAgMX0sCi0gICAgeyAxLCAgMSwgIDAsICAwfSwKLSAgICB7LTEsICAwLCAgMCwgIDB9LAotICAgIHsgMCwgIDAsICAwLCAgMX0sCi0gICAgeyAxLCAgMCwgIDAsICAwfSwKLSAgICB7LTEsICAwLCAgMCwgIDF9LAotICAgIHsgMCwgIDAsICAwLCAtMX0sCi0gICAgey0xLCAgMCwgIDEsICAyfSwKLSAgICB7IDEsICAwLCAgMCwgLTF9LAotICAgIHstMiwgLTEsICAxLCAgMn0sCi0gICAgeyAyLCAgMSwgIDAsIC0xfSwKLSAgICB7LTIsICAwLCAgMCwgIDJ9LAotICAgIHstMiwgIDAsICAxLCAgM30sCi0gICAgeyAyLCAgMSwgLTEsIC0yfSwKLSAgICB7LTMsIC0xLCAgMSwgIDN9LAotICAgIHsgMiwgIDAsICAwLCAtMn0sCi0gICAgeyAzLCAgMSwgIDAsIC0yfSwKLSAgICB7LTMsIC0xLCAgMiwgIDR9LAotICAgIHstNCwgLTEsICAxLCAgNH0sCi0gICAgeyAzLCAgMSwgLTEsIC0zfSwKLSAgICB7LTQsIC0xLCAgMiwgIDV9LAotICAgIHsgNCwgIDIsIC0xLCAtM30sCi0gICAgeyA0LCAgMSwgLTEsIC00fSwKLSAgICB7LTUsIC0xLCAgMiwgIDZ9LAotICAgIHsgNSwgIDIsIC0xLCAtNH0sCi0gICAgey02LCAtMiwgIDIsICA2fSwKLSAgICB7LTUsIC0yLCAgMiwgIDV9LAotICAgIHsgNiwgIDIsIC0xLCAtNX0sCi0gICAgey03LCAtMiwgIDMsICA4fSwKLSAgICB7IDYsICAyLCAtMiwgLTZ9LAotICAgIHsgNSwgIDIsIC0yLCAtNX0sCi0gICAgeyA4LCAgMywgLTIsIC03fSwKLSAgICB7LTksIC0zLCAgMywgIDl9Ci19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IHNpbGtfbHRwX2ZpbHRlcjBfdGFwc1s4XVs1XSA9IHsKLSAgICB7ICA0LCAgIDYsICAyNCwgICA3LCAgIDV9LAotICAgIHsgIDAsICAgMCwgICAyLCAgIDAsICAgMH0sCi0gICAgeyAxMiwgIDI4LCAgNDEsICAxMywgIC00fSwKLSAgICB7IC05LCAgMTUsICA0MiwgIDI1LCAgMTR9LAotICAgIHsgIDEsICAtMiwgIDYyLCAgNDEsICAtOX0sCi0gICAgey0xMCwgIDM3LCAgNjUsICAtNCwgICAzfSwKLSAgICB7IC02LCAgIDQsICA2NiwgICA3LCAgLTh9LAotICAgIHsgMTYsICAxNCwgIDM4LCAgLTMsICAzM30KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3Qgc2lsa19sdHBfZmlsdGVyMV90YXBzWzE2XVs1XSA9IHsKLSAgICB7IDEzLCAgMjIsICAzOSwgIDIzLCAgMTJ9LAotICAgIHsgLTEsICAzNiwgIDY0LCAgMjcsICAtNn0sCi0gICAgeyAtNywgIDEwLCAgNTUsICA0MywgIDE3fSwKLSAgICB7ICAxLCAgIDEsICAgOCwgICAxLCAgIDF9LAotICAgIHsgIDYsIC0xMSwgIDc0LCAgNTMsICAtOX0sCi0gICAgey0xMiwgIDU1LCAgNzYsIC0xMiwgICA4fSwKLSAgICB7IC0zLCAgIDMsICA5MywgIDI3LCAgLTR9LAotICAgIHsgMjYsICAzOSwgIDU5LCAgIDMsICAtOH0sCi0gICAgeyAgMiwgICAwLCAgNzcsICAxMSwgICA5fSwKLSAgICB7IC04LCAgMjIsICA0NCwgIC02LCAgIDd9LAotICAgIHsgNDAsICAgOSwgIDI2LCAgIDMsICAgOX0sCi0gICAgeyAtNywgIDIwLCAxMDEsICAtNywgICA0fSwKLSAgICB7ICAzLCAgLTgsICA0MiwgIDI2LCAgIDB9LAotICAgIHstMTUsICAzMywgIDY4LCAgIDIsICAyM30sCi0gICAgeyAtMiwgIDU1LCAgNDYsICAtMiwgIDE1fSwKLSAgICB7ICAzLCAgLTEsICAyMSwgIDE2LCAgNDF9Ci19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IHNpbGtfbHRwX2ZpbHRlcjJfdGFwc1szMl1bNV0gPSB7Ci0gICAgeyAtNiwgIDI3LCAgNjEsICAzOSwgICA1fSwKLSAgICB7LTExLCAgNDIsICA4OCwgICA0LCAgIDF9LAotICAgIHsgLTIsICA2MCwgIDY1LCAgIDYsICAtNH0sCi0gICAgeyAtMSwgIC01LCAgNzMsICA1NiwgICAxfSwKLSAgICB7IC05LCAgMTksICA5NCwgIDI5LCAgLTl9LAotICAgIHsgIDAsICAxMiwgIDk5LCAgIDYsICAgNH0sCi0gICAgeyAgOCwgLTE5LCAxMDIsICA0NiwgLTEzfSwKLSAgICB7ICAzLCAgIDIsICAxMywgICAzLCAgIDJ9LAotICAgIHsgIDksIC0yMSwgIDg0LCAgNzIsIC0xOH0sCi0gICAgey0xMSwgIDQ2LCAxMDQsIC0yMiwgICA4fSwKLSAgICB7IDE4LCAgMzgsICA0OCwgIDIzLCAgIDB9LAotICAgIHstMTYsICA3MCwgIDgzLCAtMjEsICAxMX0sCi0gICAgeyAgNSwgLTExLCAxMTcsICAyMiwgIC04fSwKLSAgICB7IC02LCAgMjMsIDExNywgLTEyLCAgIDN9LAotICAgIHsgIDMsICAtOCwgIDk1LCAgMjgsICAgNH0sCi0gICAgey0xMCwgIDE1LCAgNzcsICA2MCwgLTE1fSwKLSAgICB7IC0xLCAgIDQsIDEyNCwgICAyLCAgLTR9LAotICAgIHsgIDMsICAzOCwgIDg0LCAgMjQsIC0yNX0sCi0gICAgeyAgMiwgIDEzLCAgNDIsICAxMywgIDMxfSwKLSAgICB7IDIxLCAgLTQsICA1NiwgIDQ2LCAgLTF9LAotICAgIHsgLTEsICAzNSwgIDc5LCAtMTMsICAxOX0sCi0gICAgeyAtNywgIDY1LCAgODgsICAtOSwgLTE0fSwKLSAgICB7IDIwLCAgIDQsICA4MSwgIDQ5LCAtMjl9LAotICAgIHsgMjAsICAgMCwgIDc1LCAgIDMsIC0xN30sCi0gICAgeyAgNSwgIC05LCAgNDQsICA5MiwgIC04fSwKLSAgICB7ICAxLCAgLTMsICAyMiwgIDY5LCAgMzF9LAotICAgIHsgLTYsICA5NSwgIDQxLCAtMTIsICAgNX0sCi0gICAgeyAzOSwgIDY3LCAgMTYsICAtNCwgICAxfSwKLSAgICB7ICAwLCAgLTYsIDEyMCwgIDU1LCAtMzZ9LAotICAgIHstMTMsICA0NCwgMTIyLCAgIDQsIC0yNH0sCi0gICAgeyA4MSwgICA1LCAgMTEsICAgMywgICA3fSwKLSAgICB7ICAyLCAgIDAsICAgOSwgIDEwLCAgODh9Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qgc2lsa19sdHBfc2NhbGVfZmFjdG9yW10gPSB7MTU1NjUsIDEyMjg4LCA4MTkyfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2lsa19zaGVsbF9ibG9ja3NbM11bMl0gPSB7Ci0gICAgeyA1LCAxMH0sIC8vIE5CCi0gICAgeyA4LCAxNX0sIC8vIE1CCi0gICAgezEwLCAyMH0gIC8vIFdCCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzaWxrX3F1YW50X29mZnNldFsyXVsyXSA9IHsgLyogKDAuMjMpICovCi0gICAgezI1LCA2MH0sIC8vIEluYWN0aXZlIG9yIFVudm9pY2VkCi0gICAgeyA4LCAyNX0gIC8vIFZvaWNlZAotfTsKLQotc3RhdGljIGNvbnN0IGludCBzaWxrX3N0ZXJlb19pbnRlcnBfbGVuWzNdID0gewotICAgIDY0LCA5NiwgMTI4Ci19OwotCiBzdGF0aWMgaW5saW5lIHZvaWQgc2lsa19zdGFiaWxpemVfbHNmKGludDE2X3QgbmxzZlsxNl0sIGludCBvcmRlciwgY29uc3QgdWludDE2X3QgbWluX2RlbHRhWzE3XSkKIHsKICAgICBpbnQgcGFzcywgaTsKQEAgLTg1MSw4ICsxMjgsNyBAQAogICAgIGlmIChubHNmWzBdIDwgbWluX2RlbHRhWzBdKQogICAgICAgICBubHNmWzBdID0gbWluX2RlbHRhWzBdOwogICAgIGZvciAoaSA9IDE7IGkgPCBvcmRlcjsgaSsrKQotICAgICAgICBpZiAobmxzZltpXSA8IG5sc2ZbaSAtIDFdICsgbWluX2RlbHRhW2ldKQotICAgICAgICAgICAgbmxzZltpXSA9IG5sc2ZbaSAtIDFdICsgbWluX2RlbHRhW2ldOworICAgICAgICBubHNmW2ldID0gRkZNQVgobmxzZltpXSwgRkZNSU4obmxzZltpIC0gMV0gKyBtaW5fZGVsdGFbaV0sIDMyNzY3KSk7CiAKICAgICAvKiBwdXNoIGJhY2t3YXJkcyB0byBpbmNyZWFzZSBkaXN0YW5jZSAqLwogICAgIGlmIChubHNmW29yZGVyLTFdID4gMzI3NjggLSBtaW5fZGVsdGFbb3JkZXJdKQpAQCAtOTA5LDggKzE4NSwxNSBAQAogICAgICAgICByb3cgPSBscGMzMltrICYgMV07CiAKICAgICAgICAgZm9yIChqID0gMDsgaiA8IGs7IGorKykgewotICAgICAgICAgICAgaW50IHggPSBwcmV2cm93W2pdIC0gUk9VTkRfTVVMTChwcmV2cm93W2sgLSBqIC0gMV0sIHJjLCAzMSk7Ci0gICAgICAgICAgICByb3dbal0gPSBST1VORF9NVUxMKHgsIGdhaW4sIGZiaXRzKTsKKyAgICAgICAgICAgIGludCB4ID0gYXZfc2F0X3N1YjMyKHByZXZyb3dbal0sIFJPVU5EX01VTEwocHJldnJvd1trIC0gaiAtIDFdLCByYywgMzEpKTsKKyAgICAgICAgICAgIGludDY0X3QgdG1wID0gUk9VTkRfTVVMTCh4LCBnYWluLCBmYml0cyk7CisKKyAgICAgICAgICAgIC8qIHBlciBSRkMgODI1MSBzZWN0aW9uIDYsIGlmIHRoaXMgY2FsY3VsYXRpb24gb3ZlcmZsb3dzLCB0aGUgZmlsdGVyCisgICAgICAgICAgICAgICBpcyBjb25zaWRlcmVkIHVuc3RhYmxlLiAqLworICAgICAgICAgICAgaWYgKHRtcCA8IElOVDMyX01JTiB8fCB0bXAgPiBJTlQzMl9NQVgpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIHJvd1tqXSA9IChpbnQzMl90KXRtcDsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTk0MywxMSArMjI2LDExIEBACiAgICAgZm9yIChrID0gMDsgayA8IG9yZGVyOyBrKyspIHsKICAgICAgICAgaW50IGluZGV4ID0gbmxzZltrXSA+PiA4OwogICAgICAgICBpbnQgb2Zmc2V0ID0gbmxzZltrXSAmIDI1NTsKLSAgICAgICAgaW50IGsyID0gKG9yZGVyID09IDEwKSA/IHNpbGtfbHNmX29yZGVyaW5nX25ibWJba10gOiBzaWxrX2xzZl9vcmRlcmluZ193YltrXTsKKyAgICAgICAgaW50IGsyID0gKG9yZGVyID09IDEwKSA/IGZmX3NpbGtfbHNmX29yZGVyaW5nX25ibWJba10gOiBmZl9zaWxrX2xzZl9vcmRlcmluZ193YltrXTsKIAogICAgICAgICAvKiBpbnRlcnBvbGF0ZSBhbmQgcm91bmQgKi8KLSAgICAgICAgbHNwW2syXSAgPSBzaWxrX2Nvc2luZVtpbmRleF0gKiAyNTY7Ci0gICAgICAgIGxzcFtrMl0gKz0gKHNpbGtfY29zaW5lW2luZGV4ICsgMV0gLSBzaWxrX2Nvc2luZVtpbmRleF0pICogb2Zmc2V0OworICAgICAgICBsc3BbazJdICA9IGZmX3NpbGtfY29zaW5lW2luZGV4XSAqIDI1NjsKKyAgICAgICAgbHNwW2syXSArPSAoZmZfc2lsa19jb3NpbmVbaW5kZXggKyAxXSAtIGZmX3NpbGtfY29zaW5lW2luZGV4XSkgKiBvZmZzZXQ7CiAgICAgICAgIGxzcFtrMl0gID0gKGxzcFtrMl0gKyA0KSA+PiAzOwogICAgIH0KIApAQCAtOTU2LDggKzIzOSwxMCBAQAogCiAgICAgLyogcmVjb25zdHJ1Y3QgQSh6KSAqLwogICAgIGZvciAoayA9IDA7IGsgPCBvcmRlcj4+MTsgaysrKSB7Ci0gICAgICAgIGxwYzMyW2tdICAgICAgICAgPSAtcFtrICsgMV0gLSBwW2tdIC0gcVtrICsgMV0gKyBxW2tdOwotICAgICAgICBscGMzMltvcmRlci1rLTFdID0gLXBbayArIDFdIC0gcFtrXSArIHFbayArIDFdIC0gcVtrXTsKKyAgICAgICAgaW50MzJfdCBwX3RtcCA9IHBbayArIDFdICsgcFtrXTsKKyAgICAgICAgaW50MzJfdCBxX3RtcCA9IHFbayArIDFdIC0gcVtrXTsKKyAgICAgICAgbHBjMzJba10gICAgICAgICA9IC1xX3RtcCAtIHBfdG1wOworICAgICAgICBscGMzMltvcmRlci1rLTFdID0gIHFfdG1wIC0gcF90bXA7CiAgICAgfQogCiAgICAgLyogbGltaXQgdGhlIHJhbmdlIG9mIHRoZSBMUEMgY29lZmZpY2llbnRzIHRvIGVhY2ggZml0IHdpdGhpbiBhbiBpbnQxNl90ICovCkBAIC0xMDMwLDE1ICszMTUsMTUgQEAKICAgICAqbHBjX29yZGVyID0gb3JkZXIgPSBzLT53YiA/IDE2IDogMTA7CiAKICAgICAvKiBvYnRhaW4gTFNGIHN0YWdlLTEgYW5kIHN0YWdlLTIgaW5kaWNlcyAqLwotICAgIGxzZl9pMSA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX2xzZl9zMVtzLT53Yl1bdm9pY2VkXSk7CisgICAgbHNmX2kxID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX2xzZl9zMVtzLT53Yl1bdm9pY2VkXSk7CiAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspIHsKLSAgICAgICAgaW50IGluZGV4ID0gcy0+d2IgPyBzaWxrX2xzZl9zMl9tb2RlbF9zZWxfd2IgIFtsc2ZfaTFdW2ldIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX2xzZl9zMl9tb2RlbF9zZWxfbmJtYltsc2ZfaTFdW2ldOwotICAgICAgICBsc2ZfaTJbaV0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9sc2ZfczJbaW5kZXhdKSAtIDQ7CisgICAgICAgIGludCBpbmRleCA9IHMtPndiID8gZmZfc2lsa19sc2ZfczJfbW9kZWxfc2VsX3diICBbbHNmX2kxXVtpXSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfc2lsa19sc2ZfczJfbW9kZWxfc2VsX25ibWJbbHNmX2kxXVtpXTsKKyAgICAgICAgbHNmX2kyW2ldID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX2xzZl9zMltpbmRleF0pIC0gNDsKICAgICAgICAgaWYgKGxzZl9pMltpXSA9PSAtNCkKLSAgICAgICAgICAgIGxzZl9pMltpXSAtPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9sc2ZfczJfZXh0KTsKKyAgICAgICAgICAgIGxzZl9pMltpXSAtPSBmZl9vcHVzX3JjX2RlY19jZGYocmMsIGZmX3NpbGtfbW9kZWxfbHNmX3MyX2V4dCk7CiAgICAgICAgIGVsc2UgaWYgKGxzZl9pMltpXSA9PSA0KQotICAgICAgICAgICAgbHNmX2kyW2ldICs9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX2xzZl9zMl9leHQpOworICAgICAgICAgICAgbHNmX2kyW2ldICs9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9sc2ZfczJfZXh0KTsKICAgICB9CiAKICAgICAvKiByZXZlcnNlIHRoZSBiYWNrd2FyZHMtcHJlZGljdGlvbiBzdGVwICovCkBAIC0xMDUxLDE2ICszMzYsMTYgQEAKICAgICAgICAgbHNmX3Jlc1tpXSA9IChsc2ZfcmVzW2ldICogcXN0ZXApID4+IDE2OwogCiAgICAgICAgIGlmIChpICsgMSA8IG9yZGVyKSB7Ci0gICAgICAgICAgICBpbnQgd2VpZ2h0ID0gcy0+d2IgPyBzaWxrX2xzZl9wcmVkX3dlaWdodHNfd2IgIFtzaWxrX2xzZl93ZWlnaHRfc2VsX3diICBbbHNmX2kxXVtpXV1baV0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsa19sc2ZfcHJlZF93ZWlnaHRzX25ibWJbc2lsa19sc2Zfd2VpZ2h0X3NlbF9uYm1iW2xzZl9pMV1baV1dW2ldOworICAgICAgICAgICAgaW50IHdlaWdodCA9IHMtPndiID8gZmZfc2lsa19sc2ZfcHJlZF93ZWlnaHRzX3diICBbZmZfc2lsa19sc2Zfd2VpZ2h0X3NlbF93YiAgW2xzZl9pMV1baV1dW2ldIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3NpbGtfbHNmX3ByZWRfd2VpZ2h0c19uYm1iW2ZmX3NpbGtfbHNmX3dlaWdodF9zZWxfbmJtYltsc2ZfaTFdW2ldXVtpXTsKICAgICAgICAgICAgIGxzZl9yZXNbaV0gKz0gKGxzZl9yZXNbaSsxXSAqIHdlaWdodCkgPj4gODsKICAgICAgICAgfQogICAgIH0KIAogICAgIC8qIHJlY29uc3RydWN0IHRoZSBOTFNGIGNvZWZmaWNpZW50cyBmcm9tIHRoZSBzdXBwbGllZCBpbmRpY2VzICovCiAgICAgZm9yIChpID0gMDsgaSA8IG9yZGVyOyBpKyspIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqIGNvZGVib29rID0gcy0+d2IgPyBzaWxrX2xzZl9jb2RlYm9va193YiAgW2xzZl9pMV0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbHNmX2NvZGVib29rX25ibWJbbHNmX2kxXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqIGNvZGVib29rID0gcy0+d2IgPyBmZl9zaWxrX2xzZl9jb2RlYm9va193YiAgW2xzZl9pMV0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3NpbGtfbHNmX2NvZGVib29rX25ibWJbbHNmX2kxXTsKICAgICAgICAgaW50IGN1ciwgcHJldiwgbmV4dCwgd2VpZ2h0X3NxLCB3ZWlnaHQsIGlwYXJ0LCBmcGFydCwgeSwgdmFsdWU7CiAKICAgICAgICAgLyogZmluZCB0aGUgd2VpZ2h0IG9mIHRoZSByZXNpZHVhbCAqLwpAQCAtMTA4MSwxNCArMzY2LDE0IEBACiAgICAgfQogCiAgICAgLyogc3RhYmlsaXplIHRoZSBOTFNGIGNvZWZmaWNpZW50cyAqLwotICAgIHNpbGtfc3RhYmlsaXplX2xzZihubHNmLCBvcmRlciwgcy0+d2IgPyBzaWxrX2xzZl9taW5fc3BhY2luZ193YiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbHNmX21pbl9zcGFjaW5nX25ibWIpOworICAgIHNpbGtfc3RhYmlsaXplX2xzZihubHNmLCBvcmRlciwgcy0+d2IgPyBmZl9zaWxrX2xzZl9taW5fc3BhY2luZ193YiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3NpbGtfbHNmX21pbl9zcGFjaW5nX25ibWIpOwogCiAgICAgLyogcHJvZHVjZSBhbiBpbnRlcnBvbGF0aW9uIGZvciB0aGUgZmlyc3QgMiBzdWJmcmFtZXMsICovCiAgICAgLyogYW5kIHRoZW4gY29udmVydCBib3RoIHNldHMgb2YgTkxTRnMgdG8gTFBDIGNvZWZmaWNpZW50cyAqLwogICAgICpoYXNfbHBjX2xlYWRpbiA9IDA7CiAgICAgaWYgKHMtPnN1YmZyYW1lcyA9PSA0KSB7Ci0gICAgICAgIGludCBvZmZzZXQgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9sc2ZfaW50ZXJwb2xhdGlvbl9vZmZzZXQpOworICAgICAgICBpbnQgb2Zmc2V0ID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX2xzZl9pbnRlcnBvbGF0aW9uX29mZnNldCk7CiAgICAgICAgIGlmIChvZmZzZXQgIT0gNCAmJiBmcmFtZS0+Y29kZWQpIHsKICAgICAgICAgICAgICpoYXNfbHBjX2xlYWRpbiA9IDE7CiAgICAgICAgICAgICBpZiAob2Zmc2V0ICE9IDApIHsKQEAgLTExMTcsOCArNDAyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hpbGRbMl0pCiB7CiAgICAgaWYgKHRvdGFsICE9IDApIHsKLSAgICAgICAgY2hpbGRbMF0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywKLSAgICAgICAgICAgICAgICAgICAgICAgc2lsa19tb2RlbF9wdWxzZV9sb2NhdGlvblttb2RlbF0gKyAoKCh0b3RhbCAtIDEgKyA1KSAqICh0b3RhbCAtIDEpKSA+PiAxKSk7CisgICAgICAgIGNoaWxkWzBdID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLAorICAgICAgICAgICAgICAgICAgICAgICBmZl9zaWxrX21vZGVsX3B1bHNlX2xvY2F0aW9uW21vZGVsXSArICgoKHRvdGFsIC0gMSArIDUpICogKHRvdGFsIC0gMSkpID4+IDEpKTsKICAgICAgICAgY2hpbGRbMV0gPSB0b3RhbCAtIGNoaWxkWzBdOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNoaWxkWzBdID0gMDsKQEAgLTExMzksMTcgKzQyNCwxNyBAQAogICAgIGludDMyX3QgZXhjaXRhdGlvblszMjBdOyAgICAvLyBRMjMKIAogICAgIC8qIGV4Y2l0YXRpb24gcGFyYW1ldGVycyAqLwotICAgIHNlZWQgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9sY2dfc2VlZCk7Ci0gICAgc2hlbGxibG9ja3MgPSBzaWxrX3NoZWxsX2Jsb2Nrc1tzLT5iYW5kd2lkdGhdW3MtPnN1YmZyYW1lcyA+PiAyXTsKLSAgICByYXRlbGV2ZWwgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9leGNfcmF0ZVt2b2ljZWRdKTsKKyAgICBzZWVkID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX2xjZ19zZWVkKTsKKyAgICBzaGVsbGJsb2NrcyA9IGZmX3NpbGtfc2hlbGxfYmxvY2tzW3MtPmJhbmR3aWR0aF1bcy0+c3ViZnJhbWVzID4+IDJdOworICAgIHJhdGVsZXZlbCA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9leGNfcmF0ZVt2b2ljZWRdKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzaGVsbGJsb2NrczsgaSsrKSB7Ci0gICAgICAgIHB1bHNlY291bnRbaV0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9wdWxzZV9jb3VudFtyYXRlbGV2ZWxdKTsKKyAgICAgICAgcHVsc2Vjb3VudFtpXSA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9wdWxzZV9jb3VudFtyYXRlbGV2ZWxdKTsKICAgICAgICAgaWYgKHB1bHNlY291bnRbaV0gPT0gMTcpIHsKICAgICAgICAgICAgIHdoaWxlIChwdWxzZWNvdW50W2ldID09IDE3ICYmICsrbHNiY291bnRbaV0gIT0gMTApCi0gICAgICAgICAgICAgICAgcHVsc2Vjb3VudFtpXSA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX3B1bHNlX2NvdW50WzldKTsKKyAgICAgICAgICAgICAgICBwdWxzZWNvdW50W2ldID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX3B1bHNlX2NvdW50WzldKTsKICAgICAgICAgICAgIGlmIChsc2Jjb3VudFtpXSA9PSAxMCkKLSAgICAgICAgICAgICAgICBwdWxzZWNvdW50W2ldID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfcHVsc2VfY291bnRbMTBdKTsKKyAgICAgICAgICAgICAgICBwdWxzZWNvdW50W2ldID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX3B1bHNlX2NvdW50WzEwXSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExODQsMTMgKzQ2OSwxMyBAQAogICAgICAgICBpbnQgYml0OwogICAgICAgICBmb3IgKGJpdCA9IDA7IGJpdCA8IGxzYmNvdW50W2kgPj4gNF07IGJpdCsrKQogICAgICAgICAgICAgZXhjaXRhdGlvbltpXSA9IChleGNpdGF0aW9uW2ldIDw8IDEpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9leGNpdGF0aW9uX2xzYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX2V4Y2l0YXRpb25fbHNiKTsKICAgICB9CiAKICAgICAvKiBkZWNvZGUgc2lnbnMgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgc2hlbGxibG9ja3MgPDwgNDsgaSsrKSB7CiAgICAgICAgIGlmIChleGNpdGF0aW9uW2ldICE9IDApIHsKLSAgICAgICAgICAgIGludCBzaWduID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfZXhjaXRhdGlvbl9zaWduW2FjdGl2ZSArCisgICAgICAgICAgICBpbnQgc2lnbiA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9leGNpdGF0aW9uX3NpZ25bYWN0aXZlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VkXVtxb2Zmc2V0X2hpZ2hdW0ZGTUlOKHB1bHNlY291bnRbaSA+PiA0XSwgNildKTsKICAgICAgICAgICAgIGlmIChzaWduID09IDApCiAgICAgICAgICAgICAgICAgZXhjaXRhdGlvbltpXSAqPSAtMTsKQEAgLTEyMDAsNyArNDg1LDcgQEAKICAgICAvKiBhc3NlbWJsZSB0aGUgZXhjaXRhdGlvbiAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBzaGVsbGJsb2NrcyA8PCA0OyBpKyspIHsKICAgICAgICAgaW50IHZhbHVlID0gZXhjaXRhdGlvbltpXTsKLSAgICAgICAgZXhjaXRhdGlvbltpXSA9IHZhbHVlICogMjU2IHwgc2lsa19xdWFudF9vZmZzZXRbdm9pY2VkXVtxb2Zmc2V0X2hpZ2hdOworICAgICAgICBleGNpdGF0aW9uW2ldID0gdmFsdWUgKiAyNTYgfCBmZl9zaWxrX3F1YW50X29mZnNldFt2b2ljZWRdW3FvZmZzZXRfaGlnaF07CiAgICAgICAgIGlmICh2YWx1ZSA8IDApICAgICAgZXhjaXRhdGlvbltpXSArPSAyMDsKICAgICAgICAgZWxzZSBpZiAodmFsdWUgPiAwKSBleGNpdGF0aW9uW2ldIC09IDIwOwogCkBAIC0xMjQ1LDMwICs1MzAsMzAgQEAKICAgICAvKiBvYnRhaW4gc3RlcmVvIHdlaWdodHMgKi8KICAgICBpZiAoY29kZWRfY2hhbm5lbHMgPT0gMiAmJiBjaGFubmVsID09IDApIHsKICAgICAgICAgaW50IG4sIHdpWzJdLCB3c1syXSwgd1syXTsKLSAgICAgICAgbiAgICAgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9zdGVyZW9fczEpOwotICAgICAgICB3aVswXSA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX3N0ZXJlb19zMikgKyAzICogKG4gLyA1KTsKLSAgICAgICAgd3NbMF0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9zdGVyZW9fczMpOwotICAgICAgICB3aVsxXSA9IG9wdXNfcmNfZ2V0c3ltYm9sKHJjLCBzaWxrX21vZGVsX3N0ZXJlb19zMikgKyAzICogKG4gJSA1KTsKLSAgICAgICAgd3NbMV0gPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9zdGVyZW9fczMpOworICAgICAgICBuICAgICA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9zdGVyZW9fczEpOworICAgICAgICB3aVswXSA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9zdGVyZW9fczIpICsgMyAqIChuIC8gNSk7CisgICAgICAgIHdzWzBdID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX3N0ZXJlb19zMyk7CisgICAgICAgIHdpWzFdID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX3N0ZXJlb19zMikgKyAzICogKG4gJSA1KTsKKyAgICAgICAgd3NbMV0gPSBmZl9vcHVzX3JjX2RlY19jZGYocmMsIGZmX3NpbGtfbW9kZWxfc3RlcmVvX3MzKTsKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICAgICAgd1tpXSA9IHNpbGtfc3RlcmVvX3dlaWdodHNbd2lbaV1dICsKLSAgICAgICAgICAgICAgICAgICAoKChzaWxrX3N0ZXJlb193ZWlnaHRzW3dpW2ldICsgMV0gLSBzaWxrX3N0ZXJlb193ZWlnaHRzW3dpW2ldXSkgKiA2NTU0KSA+PiAxNikKKyAgICAgICAgICAgIHdbaV0gPSBmZl9zaWxrX3N0ZXJlb193ZWlnaHRzW3dpW2ldXSArCisgICAgICAgICAgICAgICAgICAgKCgoZmZfc2lsa19zdGVyZW9fd2VpZ2h0c1t3aVtpXSArIDFdIC0gZmZfc2lsa19zdGVyZW9fd2VpZ2h0c1t3aVtpXV0pICogNjU1NCkgPj4gMTYpCiAgICAgICAgICAgICAgICAgICAgICogKHdzW2ldKjIgKyAxKTsKIAogICAgICAgICBzLT5zdGVyZW9fd2VpZ2h0c1swXSA9ICh3WzBdIC0gd1sxXSkgLyA4MTkyLjA7CiAgICAgICAgIHMtPnN0ZXJlb193ZWlnaHRzWzFdID0gd1sxXSAgICAgICAgICAvIDgxOTIuMDsKIAogICAgICAgICAvKiBhbmQgcmVhZCB0aGUgbWlkLW9ubHkgZmxhZyAqLwotICAgICAgICBzLT5taWRvbmx5ID0gYWN0aXZlMSA/IDAgOiBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9taWRfb25seSk7CisgICAgICAgIHMtPm1pZG9ubHkgPSBhY3RpdmUxID8gMCA6IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9taWRfb25seSk7CiAgICAgfQogCiAgICAgLyogb2J0YWluIGZyYW1lIHR5cGUgKi8KICAgICBpZiAoIWFjdGl2ZSkgewotICAgICAgICBxb2Zmc2V0X2hpZ2ggPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9mcmFtZV90eXBlX2luYWN0aXZlKTsKKyAgICAgICAgcW9mZnNldF9oaWdoID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX2ZyYW1lX3R5cGVfaW5hY3RpdmUpOwogICAgICAgICB2b2ljZWQgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCB0eXBlID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfZnJhbWVfdHlwZV9hY3RpdmUpOworICAgICAgICBpbnQgdHlwZSA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9mcmFtZV90eXBlX2FjdGl2ZSk7CiAgICAgICAgIHFvZmZzZXRfaGlnaCA9IHR5cGUgJiAxOwogICAgICAgICB2b2ljZWQgPSB0eXBlID4+IDE7CiAgICAgfQpAQCAtMTI4MCwxNCArNTY1LDE0IEBACiAKICAgICAgICAgaWYgKGkgPT0gMCAmJiAoZnJhbWVfbnVtID09IDAgfHwgIWZyYW1lLT5jb2RlZCkpIHsKICAgICAgICAgICAgIC8qIGdhaW4gaXMgY29kZWQgYWJzb2x1dGUgKi8KLSAgICAgICAgICAgIGludCB4ID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfZ2Fpbl9oaWdoYml0c1thY3RpdmUgKyB2b2ljZWRdKTsKLSAgICAgICAgICAgIGxvZ19nYWluID0gKHg8PDMpIHwgb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfZ2Fpbl9sb3diaXRzKTsKKyAgICAgICAgICAgIGludCB4ID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX2dhaW5faGlnaGJpdHNbYWN0aXZlICsgdm9pY2VkXSk7CisgICAgICAgICAgICBsb2dfZ2FpbiA9ICh4PDwzKSB8IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9nYWluX2xvd2JpdHMpOwogCiAgICAgICAgICAgICBpZiAoZnJhbWUtPmNvZGVkKQogICAgICAgICAgICAgICAgIGxvZ19nYWluID0gRkZNQVgobG9nX2dhaW4sIGZyYW1lLT5sb2dfZ2FpbiAtIDE2KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIGdhaW4gaXMgY29kZWQgcmVsYXRpdmUgKi8KLSAgICAgICAgICAgIGludCBkZWx0YV9nYWluID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfZ2Fpbl9kZWx0YSk7CisgICAgICAgICAgICBpbnQgZGVsdGFfZ2FpbiA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9nYWluX2RlbHRhKTsKICAgICAgICAgICAgIGxvZ19nYWluID0gYXZfY2xpcF91aW50cDIoRkZNQVgoKGRlbHRhX2dhaW48PDEpIC0gMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmxvZ19nYWluICsgZGVsdGFfZ2FpbiAtIDQpLCA2KTsKICAgICAgICAgfQpAQCAtMTMxMyw3ICs1OTgsNyBAQAogICAgICAgICBjb25zdCBpbnQ4X3QgKiBvZmZzZXRzOwogCiAgICAgICAgIGlmICghbGFnX2Fic29sdXRlKSB7Ci0gICAgICAgICAgICBpbnQgZGVsdGEgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9waXRjaF9kZWx0YSk7CisgICAgICAgICAgICBpbnQgZGVsdGEgPSBmZl9vcHVzX3JjX2RlY19jZGYocmMsIGZmX3NpbGtfbW9kZWxfcGl0Y2hfZGVsdGEpOwogICAgICAgICAgICAgaWYgKGRlbHRhKQogICAgICAgICAgICAgICAgIHByaW1hcnlsYWcgPSBmcmFtZS0+cHJpbWFyeWxhZyArIGRlbHRhIC0gOTsKICAgICAgICAgICAgIGVsc2UKQEAgLTEzMjMsNDggKzYwOCw0OCBAQAogICAgICAgICBpZiAobGFnX2Fic29sdXRlKSB7CiAgICAgICAgICAgICAvKiBwcmltYXJ5IGxhZyBpcyBjb2RlZCBhYnNvbHV0ZSAqLwogICAgICAgICAgICAgaW50IGhpZ2hiaXRzLCBsb3diaXRzOwotICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKm1vZGVsW10gPSB7Ci0gICAgICAgICAgICAgICAgc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX25iLCBzaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfbWIsCi0gICAgICAgICAgICAgICAgc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX3diCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgKiBjb25zdCBtb2RlbFtdID0geworICAgICAgICAgICAgICAgIGZmX3NpbGtfbW9kZWxfcGl0Y2hfbG93Yml0c19uYiwgZmZfc2lsa19tb2RlbF9waXRjaF9sb3diaXRzX21iLAorICAgICAgICAgICAgICAgIGZmX3NpbGtfbW9kZWxfcGl0Y2hfbG93Yml0c193YgogICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGhpZ2hiaXRzID0gb3B1c19yY19nZXRzeW1ib2wocmMsIHNpbGtfbW9kZWxfcGl0Y2hfaGlnaGJpdHMpOwotICAgICAgICAgICAgbG93Yml0cyAgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgbW9kZWxbcy0+YmFuZHdpZHRoXSk7CisgICAgICAgICAgICBoaWdoYml0cyA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgZmZfc2lsa19tb2RlbF9waXRjaF9oaWdoYml0cyk7CisgICAgICAgICAgICBsb3diaXRzICA9IGZmX29wdXNfcmNfZGVjX2NkZihyYywgbW9kZWxbcy0+YmFuZHdpZHRoXSk7CiAKLSAgICAgICAgICAgIHByaW1hcnlsYWcgPSBzaWxrX3BpdGNoX21pbl9sYWdbcy0+YmFuZHdpZHRoXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGJpdHMqc2lsa19waXRjaF9zY2FsZVtzLT5iYW5kd2lkdGhdICsgbG93Yml0czsKKyAgICAgICAgICAgIHByaW1hcnlsYWcgPSBmZl9zaWxrX3BpdGNoX21pbl9sYWdbcy0+YmFuZHdpZHRoXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGJpdHMqZmZfc2lsa19waXRjaF9zY2FsZVtzLT5iYW5kd2lkdGhdICsgbG93Yml0czsKICAgICAgICAgfQogICAgICAgICBmcmFtZS0+cHJpbWFyeWxhZyA9IHByaW1hcnlsYWc7CiAKICAgICAgICAgaWYgKHMtPnN1YmZyYW1lcyA9PSAyKQogICAgICAgICAgICAgb2Zmc2V0cyA9IChzLT5iYW5kd2lkdGggPT0gT1BVU19CQU5EV0lEVEhfTkFSUk9XQkFORCkKLSAgICAgICAgICAgICAgICAgICAgID8gc2lsa19waXRjaF9vZmZzZXRfbmIxMG1zW29wdXNfcmNfZ2V0c3ltYm9sKHJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsa19tb2RlbF9waXRjaF9jb250b3VyX25iMTBtcyldCi0gICAgICAgICAgICAgICAgICAgICA6IHNpbGtfcGl0Y2hfb2Zmc2V0X21id2IxMG1zW29wdXNfcmNfZ2V0c3ltYm9sKHJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lsa19tb2RlbF9waXRjaF9jb250b3VyX21id2IxMG1zKV07CisgICAgICAgICAgICAgICAgICAgICA/IGZmX3NpbGtfcGl0Y2hfb2Zmc2V0X25iMTBtc1tmZl9vcHVzX3JjX2RlY19jZGYocmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9zaWxrX21vZGVsX3BpdGNoX2NvbnRvdXJfbmIxMG1zKV0KKyAgICAgICAgICAgICAgICAgICAgIDogZmZfc2lsa19waXRjaF9vZmZzZXRfbWJ3YjEwbXNbZmZfb3B1c19yY19kZWNfY2RmKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfc2lsa19tb2RlbF9waXRjaF9jb250b3VyX21id2IxMG1zKV07CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIG9mZnNldHMgPSAocy0+YmFuZHdpZHRoID09IE9QVVNfQkFORFdJRFRIX05BUlJPV0JBTkQpCi0gICAgICAgICAgICAgICAgICAgICA/IHNpbGtfcGl0Y2hfb2Zmc2V0X25iMjBtc1tvcHVzX3JjX2dldHN5bWJvbChyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9uYjIwbXMpXQotICAgICAgICAgICAgICAgICAgICAgOiBzaWxrX3BpdGNoX29mZnNldF9tYndiMjBtc1tvcHVzX3JjX2dldHN5bWJvbChyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9tYndiMjBtcyldOworICAgICAgICAgICAgICAgICAgICAgPyBmZl9zaWxrX3BpdGNoX29mZnNldF9uYjIwbXNbZmZfb3B1c19yY19kZWNfY2RmKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfc2lsa19tb2RlbF9waXRjaF9jb250b3VyX25iMjBtcyldCisgICAgICAgICAgICAgICAgICAgICA6IGZmX3NpbGtfcGl0Y2hfb2Zmc2V0X21id2IyMG1zW2ZmX29wdXNfcmNfZGVjX2NkZihyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3NpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9tYndiMjBtcyldOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5zdWJmcmFtZXM7IGkrKykKICAgICAgICAgICAgIHNmW2ldLnBpdGNobGFnID0gYXZfY2xpcChwcmltYXJ5bGFnICsgb2Zmc2V0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX3BpdGNoX21pbl9sYWdbcy0+YmFuZHdpZHRoXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWxrX3BpdGNoX21heF9sYWdbcy0+YmFuZHdpZHRoXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfc2lsa19waXRjaF9taW5fbGFnW3MtPmJhbmR3aWR0aF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfc2lsa19waXRjaF9tYXhfbGFnW3MtPmJhbmR3aWR0aF0pOwogCiAgICAgICAgIC8qIG9idGFpbiBMVFAgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotICAgICAgICBsdHBmaWx0ZXIgPSBvcHVzX3JjX2dldHN5bWJvbChyYywgc2lsa19tb2RlbF9sdHBfZmlsdGVyKTsKKyAgICAgICAgbHRwZmlsdGVyID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmZl9zaWxrX21vZGVsX2x0cF9maWx0ZXIpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c3ViZnJhbWVzOyBpKyspIHsKICAgICAgICAgICAgIGludCBpbmRleCwgajsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpmaWx0ZXJfc2VsW10gPSB7Ci0gICAgICAgICAgICAgICAgc2lsa19tb2RlbF9sdHBfZmlsdGVyMF9zZWwsIHNpbGtfbW9kZWxfbHRwX2ZpbHRlcjFfc2VsLAotICAgICAgICAgICAgICAgIHNpbGtfbW9kZWxfbHRwX2ZpbHRlcjJfc2VsCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgKiBjb25zdCBmaWx0ZXJfc2VsW10gPSB7CisgICAgICAgICAgICAgICAgZmZfc2lsa19tb2RlbF9sdHBfZmlsdGVyMF9zZWwsIGZmX3NpbGtfbW9kZWxfbHRwX2ZpbHRlcjFfc2VsLAorICAgICAgICAgICAgICAgIGZmX3NpbGtfbW9kZWxfbHRwX2ZpbHRlcjJfc2VsCiAgICAgICAgICAgICB9OwotICAgICAgICAgICAgY29uc3QgaW50OF90ICgqZmlsdGVyX3RhcHNbXSlbNV0gPSB7Ci0gICAgICAgICAgICAgICAgc2lsa19sdHBfZmlsdGVyMF90YXBzLCBzaWxrX2x0cF9maWx0ZXIxX3RhcHMsIHNpbGtfbHRwX2ZpbHRlcjJfdGFwcworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludDhfdCAoKiBjb25zdCBmaWx0ZXJfdGFwc1tdKVs1XSA9IHsKKyAgICAgICAgICAgICAgICBmZl9zaWxrX2x0cF9maWx0ZXIwX3RhcHMsIGZmX3NpbGtfbHRwX2ZpbHRlcjFfdGFwcywgZmZfc2lsa19sdHBfZmlsdGVyMl90YXBzCiAgICAgICAgICAgICB9OwotICAgICAgICAgICAgaW5kZXggPSBvcHVzX3JjX2dldHN5bWJvbChyYywgZmlsdGVyX3NlbFtsdHBmaWx0ZXJdKTsKKyAgICAgICAgICAgIGluZGV4ID0gZmZfb3B1c19yY19kZWNfY2RmKHJjLCBmaWx0ZXJfc2VsW2x0cGZpbHRlcl0pOwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDU7IGorKykKICAgICAgICAgICAgICAgICBzZltpXS5sdHB0YXBzW2pdID0gZmlsdGVyX3RhcHNbbHRwZmlsdGVyXVtpbmRleF1bal0gLyAxMjguMGY7CiAgICAgICAgIH0KQEAgLTEzNzIsOCArNjU3LDggQEAKIAogICAgIC8qIG9idGFpbiBMVFAgc2NhbGUgZmFjdG9yICovCiAgICAgaWYgKHZvaWNlZCAmJiBmcmFtZV9udW0gPT0gMCkKLSAgICAgICAgbHRwc2NhbGUgPSBzaWxrX2x0cF9zY2FsZV9mYWN0b3Jbb3B1c19yY19nZXRzeW1ib2wocmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGtfbW9kZWxfbHRwX3NjYWxlX2luZGV4KV0gLyAxNjM4NC4wZjsKKyAgICAgICAgbHRwc2NhbGUgPSBmZl9zaWxrX2x0cF9zY2FsZV9mYWN0b3JbZmZfb3B1c19yY19kZWNfY2RmKHJjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9zaWxrX21vZGVsX2x0cF9zY2FsZV9pbmRleCldIC8gMTYzODQuMGY7CiAgICAgZWxzZSBsdHBzY2FsZSA9IDE1NTY1LjBmLzE2Mzg0LjBmOwogCiAgICAgLyogZ2VuZXJhdGUgdGhlIGV4Y2l0YXRpb24gc2lnbmFsIGZvciB0aGUgZW50aXJlIGZyYW1lICovCkBAIC0xNDU1LDcgKzc0MCw3IEBACiAgICAgZmxvYXQgdzFfcHJldiA9IHMtPnByZXZfc3RlcmVvX3dlaWdodHNbMV07CiAgICAgZmxvYXQgdzAgICAgICA9IHMtPnN0ZXJlb193ZWlnaHRzWzBdOwogICAgIGZsb2F0IHcxICAgICAgPSBzLT5zdGVyZW9fd2VpZ2h0c1sxXTsKLSAgICBpbnQgbjEgICAgICAgID0gc2lsa19zdGVyZW9faW50ZXJwX2xlbltzLT5iYW5kd2lkdGhdOworICAgIGludCBuMSAgICAgICAgPSBmZl9zaWxrX3N0ZXJlb19pbnRlcnBfbGVuW3MtPmJhbmR3aWR0aF07CiAgICAgaW50IGk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgbjE7IGkrKykgewpAQCAtMTUyNiwxMSArODExLDExIEBACiAgICAgLyogcmVhZCB0aGUgTFAtbGF5ZXIgaGVhZGVyIGJpdHMgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgY29kZWRfY2hhbm5lbHM7IGkrKykgewogICAgICAgICBmb3IgKGogPSAwOyBqIDwgbmJfZnJhbWVzOyBqKyspCi0gICAgICAgICAgICBhY3RpdmVbaV1bal0gPSBvcHVzX3JjX3AybW9kZWwocmMsIDEpOworICAgICAgICAgICAgYWN0aXZlW2ldW2pdID0gZmZfb3B1c19yY19kZWNfbG9nKHJjLCAxKTsKIAotICAgICAgICByZWR1bmRhbmN5W2ldID0gb3B1c19yY19wMm1vZGVsKHJjLCAxKTsKKyAgICAgICAgcmVkdW5kYW5jeVtpXSA9IGZmX29wdXNfcmNfZGVjX2xvZyhyYywgMSk7CiAgICAgICAgIGlmIChyZWR1bmRhbmN5W2ldKSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkxCUlIgZnJhbWVzIHByZXNlbnQ7IHRoaXMgaXMgdW5zdXBwb3J0ZWRcbiIpOworICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICJMQlJSIGZyYW1lcyIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9vcHVzZGVjLmMgYi9saWJhdmNvZGVjL29wdXNkZWMuYwppbmRleCA5NWEyNDM1Li4wMzA4NmRlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL29wdXNkZWMuYworKysgYi9saWJhdmNvZGVjL29wdXNkZWMuYwpAQCAtNDcsNiArNDcsOCBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibWF0aG9wcy5oIgogI2luY2x1ZGUgIm9wdXMuaCIKKyNpbmNsdWRlICJvcHVzdGFiLmgiCisjaW5jbHVkZSAib3B1c19jZWx0LmgiCiAKIHN0YXRpYyBjb25zdCB1aW50MTZfdCBzaWxrX2ZyYW1lX2R1cmF0aW9uX21zWzE2XSA9IHsKICAgICAxMCwgMjAsIDQwLCA2MCwKQEAgLTYyLDggKzY0LDYgQEAKICAgICA0LCA4LCAxMSwgMTEsIDExCiB9OwogCi1zdGF0aWMgY29uc3QgdWludDhfdCBjZWx0X2JhbmRfZW5kW10gPSB7IDEzLCAxNywgMTcsIDE5LCAyMSB9OwotCiBzdGF0aWMgaW50IGdldF9zaWxrX3NhbXBsZXJhdGUoaW50IGNvbmZpZykKIHsKICAgICBpZiAoY29uZmlnIDwgNCkKQEAgLTczLDMyICs3Myw2IEBACiAgICAgcmV0dXJuIDE2MDAwOwogfQogCi0vKioKLSAqIFJhbmdlIGRlY29kZXIKLSAqLwotc3RhdGljIGludCBvcHVzX3JjX2luaXQoT3B1c1JhbmdlQ29kZXIgKnJjLCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSkKLXsKLSAgICBpbnQgcmV0ID0gaW5pdF9nZXRfYml0czgoJnJjLT5nYiwgZGF0YSwgc2l6ZSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICByYy0+cmFuZ2UgPSAxMjg7Ci0gICAgcmMtPnZhbHVlID0gMTI3IC0gZ2V0X2JpdHMoJnJjLT5nYiwgNyk7Ci0gICAgcmMtPnRvdGFsX3JlYWRfYml0cyA9IDk7Ci0gICAgb3B1c19yY19ub3JtYWxpemUocmMpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG9wdXNfcmF3X2luaXQoT3B1c1JhbmdlQ29kZXIgKnJjLCBjb25zdCB1aW50OF90ICpyaWdodGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzKQotewotICAgIHJjLT5yYi5wb3NpdGlvbiA9IHJpZ2h0ZW5kOwotICAgIHJjLT5yYi5ieXRlcyAgICA9IGJ5dGVzOwotICAgIHJjLT5yYi5jYWNoZWxlbiA9IDA7Ci0gICAgcmMtPnJiLmNhY2hldmFsID0gMDsKLX0KLQogc3RhdGljIHZvaWQgb3B1c19mYWRlKGZsb2F0ICpvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmluMSwgY29uc3QgZmxvYXQgKmluMiwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqd2luZG93LCBpbnQgbGVuKQpAQCAtMTc4LDIyICsxNTIsMTUgQEAKIAogc3RhdGljIGludCBvcHVzX2RlY29kZV9yZWR1bmRhbmN5KE9wdXNTdHJlYW1Db250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSkKIHsKLSAgICBpbnQgcmV0OwotICAgIGVudW0gT3B1c0JhbmR3aWR0aCBidyA9IHMtPnBhY2tldC5iYW5kd2lkdGg7Ci0KLSAgICBpZiAocy0+cGFja2V0Lm1vZGUgPT0gT1BVU19NT0RFX1NJTEsgJiYKLSAgICAgICAgYncgPT0gT1BVU19CQU5EV0lEVEhfTUVESVVNQkFORCkKLSAgICAgICAgYncgPSBPUFVTX0JBTkRXSURUSF9XSURFQkFORDsKLQotICAgIHJldCA9IG9wdXNfcmNfaW5pdCgmcy0+cmVkdW5kYW5jeV9yYywgZGF0YSwgc2l6ZSk7CisgICAgaW50IHJldCA9IGZmX29wdXNfcmNfZGVjX2luaXQoJnMtPnJlZHVuZGFuY3lfcmMsIGRhdGEsIHNpemUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGZhaWw7Ci0gICAgb3B1c19yYXdfaW5pdCgmcy0+cmVkdW5kYW5jeV9yYywgZGF0YSArIHNpemUsIHNpemUpOworICAgIGZmX29wdXNfcmNfZGVjX3Jhd19pbml0KCZzLT5yZWR1bmRhbmN5X3JjLCBkYXRhICsgc2l6ZSwgc2l6ZSk7CiAKICAgICByZXQgPSBmZl9jZWx0X2RlY29kZV9mcmFtZShzLT5jZWx0LCAmcy0+cmVkdW5kYW5jeV9yYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZWR1bmRhbmN5X291dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wYWNrZXQuc3RlcmVvICsgMSwgMjQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGNlbHRfYmFuZF9lbmRbcy0+cGFja2V0LmJhbmR3aWR0aF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGZmX2NlbHRfYmFuZF9lbmRbcy0+cGFja2V0LmJhbmR3aWR0aF0pOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKQEAgLTIxMSw3ICsxNzgsNyBAQAogICAgIGludCByZXQsIGksIGNvbnN1bWVkOwogICAgIGludCBkZWxheWVkX3NhbXBsZXMgPSBzLT5kZWxheWVkX3NhbXBsZXM7CiAKLSAgICByZXQgPSBvcHVzX3JjX2luaXQoJnMtPnJjLCBkYXRhLCBzaXplKTsKKyAgICByZXQgPSBmZl9vcHVzX3JjX2RlY19pbml0KCZzLT5yYywgZGF0YSwgc2l6ZSk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTI0NiwxNSArMjEzLDE1IEBACiAgICAgLy8gZGVjb2RlIHJlZHVuZGFuY3kgaW5mb3JtYXRpb24KICAgICBjb25zdW1lZCA9IG9wdXNfcmNfdGVsbCgmcy0+cmMpOwogICAgIGlmIChzLT5wYWNrZXQubW9kZSA9PSBPUFVTX01PREVfSFlCUklEICYmIGNvbnN1bWVkICsgMzcgPD0gc2l6ZSAqIDgpCi0gICAgICAgIHJlZHVuZGFuY3kgPSBvcHVzX3JjX3AybW9kZWwoJnMtPnJjLCAxMik7CisgICAgICAgIHJlZHVuZGFuY3kgPSBmZl9vcHVzX3JjX2RlY19sb2coJnMtPnJjLCAxMik7CiAgICAgZWxzZSBpZiAocy0+cGFja2V0Lm1vZGUgPT0gT1BVU19NT0RFX1NJTEsgJiYgY29uc3VtZWQgKyAxNyA8PSBzaXplICogOCkKICAgICAgICAgcmVkdW5kYW5jeSA9IDE7CiAKICAgICBpZiAocmVkdW5kYW5jeSkgewotICAgICAgICByZWR1bmRhbmN5X3BvcyA9IG9wdXNfcmNfcDJtb2RlbCgmcy0+cmMsIDEpOworICAgICAgICByZWR1bmRhbmN5X3BvcyA9IGZmX29wdXNfcmNfZGVjX2xvZygmcy0+cmMsIDEpOwogCiAgICAgICAgIGlmIChzLT5wYWNrZXQubW9kZSA9PSBPUFVTX01PREVfSFlCUklEKQotICAgICAgICAgICAgcmVkdW5kYW5jeV9zaXplID0gb3B1c19yY191bmltb2RlbCgmcy0+cmMsIDI1NikgKyAyOworICAgICAgICAgICAgcmVkdW5kYW5jeV9zaXplID0gZmZfb3B1c19yY19kZWNfdWludCgmcy0+cmMsIDI1NikgKyAyOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZWR1bmRhbmN5X3NpemUgPSBzaXplIC0gKGNvbnN1bWVkICsgNykgLyA4OwogICAgICAgICBzaXplIC09IHJlZHVuZGFuY3lfc2l6ZTsKQEAgLTI5OCwxMyArMjY1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBvcHVzX3Jhd19pbml0KCZzLT5yYywgZGF0YSArIHNpemUsIHNpemUpOworICAgICAgICBmZl9vcHVzX3JjX2RlY19yYXdfaW5pdCgmcy0+cmMsIGRhdGEgKyBzaXplLCBzaXplKTsKIAogICAgICAgICByZXQgPSBmZl9jZWx0X2RlY29kZV9mcmFtZShzLT5jZWx0LCAmcy0+cmMsIGRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGFja2V0LnN0ZXJlbyArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhY2tldC5mcmFtZV9kdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnBhY2tldC5tb2RlID09IE9QVVNfTU9ERV9IWUJSSUQpID8gMTcgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWx0X2JhbmRfZW5kW3MtPnBhY2tldC5iYW5kd2lkdGhdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfY2VsdF9iYW5kX2VuZFtzLT5wYWNrZXQuYmFuZHdpZHRoXSk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtNjcyLDcgKzYzOSw2IEBACiAgICAgLyogZmluZCBvdXQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiAqLwogICAgIHJldCA9IGZmX29wdXNfcGFyc2VfZXh0cmFkYXRhKGF2Y3R4LCBjKTsKICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9mcmVlcCgmYy0+Y2hhbm5lbF9tYXBzKTsKICAgICAgICAgYXZfZnJlZXAoJmMtPmZkc3ApOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTcyMSw3ICs2ODcsNyBAQAogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKIAotICAgICAgICByZXQgPSBmZl9jZWx0X2luaXQoYXZjdHgsICZzLT5jZWx0LCBzLT5vdXRwdXRfY2hhbm5lbHMpOworICAgICAgICByZXQgPSBmZl9jZWx0X2luaXQoYXZjdHgsICZzLT5jZWx0LCBzLT5vdXRwdXRfY2hhbm5lbHMsIGMtPmFwcGx5X3BoYXNlX2ludik7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgZ290byBmYWlsOwogCkBAIC03NDYsOSArNzEyLDI0IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoT3B1c0NvbnRleHQsIHgpCisjZGVmaW5lIEFEIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHVzX29wdGlvbnNbXSA9IHsKKyAgICB7ICJhcHBseV9waGFzZV9pbnYiLCAiQXBwbHkgaW50ZW5zaXR5IHN0ZXJlbyBwaGFzZSBpbnZlcnNpb24iLCBPRkZTRVQoYXBwbHlfcGhhc2VfaW52KSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBBRCB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgb3B1c19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJPcHVzIERlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHVzX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCiBBVkNvZGVjIGZmX29wdXNfZGVjb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgID0gIm9wdXMiLAogICAgIC5sb25nX25hbWUgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT3B1cyIpLAorICAgIC5wcml2X2NsYXNzICAgICAgPSAmb3B1c19jbGFzcywKICAgICAudHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgIC5pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9PUFVTLAogICAgIC5wcml2X2RhdGFfc2l6ZSAgPSBzaXplb2YoT3B1c0NvbnRleHQpLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9vcHVzZW5jLmMgYi9saWJhdmNvZGVjL29wdXNlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDY4YzQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9vcHVzZW5jLmMKQEAgLTAsMCArMSw3NDggQEAKKy8qCisgKiBPcHVzIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm9wdXNlbmMuaCIKKyNpbmNsdWRlICJvcHVzX3B2cS5oIgorI2luY2x1ZGUgIm9wdXNlbmNfcHN5LmgiCisjaW5jbHVkZSAib3B1c3RhYi5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJhdWRpb19mcmFtZV9xdWV1ZS5oIgorCit0eXBlZGVmIHN0cnVjdCBPcHVzRW5jQ29udGV4dCB7CisgICAgQVZDbGFzcyAqYXZfY2xhc3M7CisgICAgT3B1c0VuY09wdGlvbnMgb3B0aW9uczsKKyAgICBPcHVzUHN5Q29udGV4dCBwc3ljdHg7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEF1ZGlvRnJhbWVRdWV1ZSBhZnE7CisgICAgQVZGbG9hdERTUENvbnRleHQgKmRzcDsKKyAgICBNRENUMTVDb250ZXh0ICptZGN0W0NFTFRfQkxPQ0tfTkJdOworICAgIENlbHRQVlEgKnB2cTsKKyAgICBzdHJ1Y3QgRkZCdWZRdWV1ZSBidWZxdWV1ZTsKKworICAgIHVpbnQ4X3QgZW5jX2lkWzY0XTsKKyAgICBpbnQgZW5jX2lkX2JpdHM7CisKKyAgICBPcHVzUGFja2V0SW5mbyBwYWNrZXQ7CisKKyAgICBpbnQgY2hhbm5lbHM7CisKKyAgICBDZWx0RnJhbWUgKmZyYW1lOworICAgIE9wdXNSYW5nZUNvZGVyICpyYzsKKworICAgIC8qIEFjdHVhbCBlbmVyZ3kgdGhlIGRlY29kZXIgd2lsbCBoYXZlICovCisgICAgZmxvYXQgbGFzdF9xdWFudGl6ZWRfZW5lcmd5W09QVVNfTUFYX0NIQU5ORUxTXVtDRUxUX01BWF9CQU5EU107CisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIGZsb2F0LCBzY3JhdGNoKVsyMDQ4XTsKK30gT3B1c0VuY0NvbnRleHQ7CisKK3N0YXRpYyB2b2lkIG9wdXNfd3JpdGVfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICB1aW50OF90ICpicyA9IGF2Y3R4LT5leHRyYWRhdGE7CisKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJmJzLCAiT3B1c0hlYWQiLCA4KTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlICAoJmJzLCAweDEpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUgICgmYnMsIGF2Y3R4LT5jaGFubmVscyk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNiAgKCZicywgYXZjdHgtPmluaXRpYWxfcGFkZGluZyk7CisgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMiAgKCZicywgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKyAgICBieXRlc3RyZWFtX3B1dF9sZTE2ICAoJmJzLCAweDApOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUgICgmYnMsIDB4MCk7IC8qIERlZmF1bHQgbGF5b3V0ICovCit9CisKK3N0YXRpYyBpbnQgb3B1c19nZW5fdG9jKE9wdXNFbmNDb250ZXh0ICpzLCB1aW50OF90ICp0b2MsIGludCAqc2l6ZSwgaW50ICpmc2l6ZV9uZWVkZWQpCit7CisgICAgaW50IGksIHRtcCA9IDB4MCwgZXh0ZW5kZWRfdG9jID0gMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IHRvY19jZmdbXVtPUFVTX01PREVfTkJdW09QVVNfQkFORFdJVEhfTkJdID0geworICAgICAgICAvKiAgU2lsayAgICAgICAgICAgICAgICAgICAgSHlicmlkICAgICAgICAgICAgICAgICAgQ2VsdCAgICAgICAgICAgICAgICAgICAgTGF5ZXIgICAgICovCisgICAgICAgIC8qICBOQiAgTUIgIFdCIFNXQiAgRkIgICAgICBOQiAgTUIgIFdCIFNXQiAgRkIgICAgICBOQiAgTUIgIFdCIFNXQiAgRkIgICAgICBCYW5kd2lkdGggKi8KKyAgICAgICAgeyB7ICAwLCAgMCwgIDAsICAwLCAgMCB9LCB7ICAwLCAgMCwgIDAsICAwLCAgMCB9LCB7IDE3LCAgMCwgMjEsIDI1LCAyOSB9IH0sIC8qIDIuNSBtcyAqLworICAgICAgICB7IHsgIDAsICAwLCAgMCwgIDAsICAwIH0sIHsgIDAsICAwLCAgMCwgIDAsICAwIH0sIHsgMTgsICAwLCAyMiwgMjYsIDMwIH0gfSwgLyogICA1IG1zICovCisgICAgICAgIHsgeyAgMSwgIDUsICA5LCAgMCwgIDAgfSwgeyAgMCwgIDAsICAwLCAxMywgMTUgfSwgeyAxOSwgIDAsIDIzLCAyNywgMzEgfSB9LCAvKiAgMTAgbXMgKi8KKyAgICAgICAgeyB7ICAyLCAgNiwgMTAsICAwLCAgMCB9LCB7ICAwLCAgMCwgIDAsIDE0LCAxNiB9LCB7IDIwLCAgMCwgMjQsIDI4LCAzMiB9IH0sIC8qICAyMCBtcyAqLworICAgICAgICB7IHsgIDMsICA3LCAxMSwgIDAsICAwIH0sIHsgIDAsICAwLCAgMCwgIDAsICAwIH0sIHsgIDAsICAwLCAgMCwgIDAsICAwIH0gfSwgLyogIDQwIG1zICovCisgICAgICAgIHsgeyAgNCwgIDgsIDEyLCAgMCwgIDAgfSwgeyAgMCwgIDAsICAwLCAgMCwgIDAgfSwgeyAgMCwgIDAsICAwLCAgMCwgIDAgfSB9LCAvKiAgNjAgbXMgKi8KKyAgICB9OworICAgIGludCBjZmcgPSB0b2NfY2ZnW3MtPnBhY2tldC5mcmFtZXNpemVdW3MtPnBhY2tldC5tb2RlXVtzLT5wYWNrZXQuYmFuZHdpZHRoXTsKKyAgICAqZnNpemVfbmVlZGVkID0gMDsKKyAgICBpZiAoIWNmZykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHMtPnBhY2tldC5mcmFtZXMgPT0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDIgcGFja2V0cyAqLworICAgICAgICBpZiAocy0+ZnJhbWVbMF0uZnJhbWViaXRzID09IHMtPmZyYW1lWzFdLmZyYW1lYml0cykgeyAgICAgICAgICAvKiBzYW1lIHNpemUgKi8KKyAgICAgICAgICAgIHRtcCA9IDB4MTsKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpZmZlcmVudCBzaXplICovCisgICAgICAgICAgICB0bXAgPSAweDI7CisgICAgICAgICAgICAqZnNpemVfbmVlZGVkID0gMTsgICAgICAgICAgICAgICAgICAgICAvKiBwdXQgZnJhbWUgc2l6ZXMgaW4gdGhlIHBhY2tldCAqLworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzLT5wYWNrZXQuZnJhbWVzID4gMikgeworICAgICAgICB0bXAgPSAweDM7CisgICAgICAgIGV4dGVuZGVkX3RvYyA9IDE7CisgICAgfQorICAgIHRtcCB8PSAocy0+Y2hhbm5lbHMgPiAxKSA8PCAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RlcmVvIG9yIG1vbm8gKi8KKyAgICB0bXAgfD0gKGNmZyAtIDEpICAgICAgICAgPDwgMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlYyBjb25maWd1cmF0aW9uICovCisgICAgKnRvYysrID0gdG1wOworICAgIGlmIChleHRlbmRlZF90b2MpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChzLT5wYWNrZXQuZnJhbWVzIC0gMSk7IGkrKykKKyAgICAgICAgICAgICpmc2l6ZV9uZWVkZWQgfD0gKHMtPmZyYW1lW2ldLmZyYW1lYml0cyAhPSBzLT5mcmFtZVtpICsgMV0uZnJhbWViaXRzKTsKKyAgICAgICAgdG1wID0gKCpmc2l6ZV9uZWVkZWQpIDw8IDc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2YnIgZmxhZyAqLworICAgICAgICB0bXAgfD0gKDApIDw8IDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGFkZGluZyBmbGFnICovCisgICAgICAgIHRtcCB8PSBzLT5wYWNrZXQuZnJhbWVzOworICAgICAgICAqdG9jKysgPSB0bXA7CisgICAgfQorICAgICpzaXplID0gMSArIGV4dGVuZGVkX3RvYzsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2VsdF9mcmFtZV9zZXR1cF9pbnB1dChPcHVzRW5jQ29udGV4dCAqcywgQ2VsdEZyYW1lICpmKQoreworICAgIGludCBzZiwgY2g7CisgICAgQVZGcmFtZSAqY3VyID0gTlVMTDsKKyAgICBjb25zdCBpbnQgc3ViZnJhbWVzaXplID0gcy0+YXZjdHgtPmZyYW1lX3NpemU7CisgICAgaW50IHN1YmZyYW1lcyA9IE9QVVNfQkxPQ0tfU0laRShzLT5wYWNrZXQuZnJhbWVzaXplKSAvIHN1YmZyYW1lc2l6ZTsKKworICAgIGN1ciA9IGZmX2J1ZnF1ZXVlX2dldCgmcy0+YnVmcXVldWUpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgZi0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgQ2VsdEJsb2NrICpiID0gJmYtPmJsb2NrW2NoXTsKKyAgICAgICAgY29uc3Qgdm9pZCAqaW5wdXQgPSBjdXItPmV4dGVuZGVkX2RhdGFbY2hdOworICAgICAgICBzaXplX3QgYnBzID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoY3VyLT5mb3JtYXQpOworICAgICAgICBtZW1jcHkoYi0+b3ZlcmxhcCwgaW5wdXQsIGJwcypjdXItPm5iX3NhbXBsZXMpOworICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmN1cik7CisKKyAgICBmb3IgKHNmID0gMDsgc2YgPCBzdWJmcmFtZXM7IHNmKyspIHsKKyAgICAgICAgaWYgKHNmICE9IChzdWJmcmFtZXMgLSAxKSkKKyAgICAgICAgICAgIGN1ciA9IGZmX2J1ZnF1ZXVlX2dldCgmcy0+YnVmcXVldWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjdXIgPSBmZl9idWZxdWV1ZV9wZWVrKCZzLT5idWZxdWV1ZSwgMCk7CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZi0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIENlbHRCbG9jayAqYiA9ICZmLT5ibG9ja1tjaF07CisgICAgICAgICAgICBjb25zdCB2b2lkICppbnB1dCA9IGN1ci0+ZXh0ZW5kZWRfZGF0YVtjaF07CisgICAgICAgICAgICBjb25zdCBzaXplX3QgYnBzICA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGN1ci0+Zm9ybWF0KTsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBsZWZ0ID0gKHN1YmZyYW1lc2l6ZSAtIGN1ci0+bmJfc2FtcGxlcykqYnBzOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiAgPSBGRk1JTihzdWJmcmFtZXNpemUsIGN1ci0+bmJfc2FtcGxlcykqYnBzOworICAgICAgICAgICAgbWVtY3B5KCZiLT5zYW1wbGVzW3NmKnN1YmZyYW1lc2l6ZV0sIGlucHV0LCBsZW4pOworICAgICAgICAgICAgbWVtc2V0KCZiLT5zYW1wbGVzW2N1ci0+bmJfc2FtcGxlc10sIDAsIGxlZnQpOworICAgICAgICB9CisKKyAgICAgICAgLyogTGFzdCBmcmFtZSBpc24ndCBwb3BwZWQgb2ZmIGFuZCBmcmVlZCB5ZXQgLSB3ZSBuZWVkIGl0IGZvciBvdmVybGFwICovCisgICAgICAgIGlmIChzZiAhPSAoc3ViZnJhbWVzIC0gMSkpCisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZjdXIpOworICAgIH0KK30KKworLyogQXBwbHkgdGhlIHByZSBlbXBoYXNpcyBmaWx0ZXIgKi8KK3N0YXRpYyB2b2lkIGNlbHRfYXBwbHlfcHJlZW1waF9maWx0ZXIoT3B1c0VuY0NvbnRleHQgKnMsIENlbHRGcmFtZSAqZikKK3sKKyAgICBpbnQgaSwgc2YsIGNoOworICAgIGNvbnN0IGludCBzdWJmcmFtZXNpemUgPSBzLT5hdmN0eC0+ZnJhbWVfc2l6ZTsKKyAgICBjb25zdCBpbnQgc3ViZnJhbWVzID0gT1BVU19CTE9DS19TSVpFKHMtPnBhY2tldC5mcmFtZXNpemUpIC8gc3ViZnJhbWVzaXplOworCisgICAgLyogRmlsdGVyIG92ZXJsYXAgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBmLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBDZWx0QmxvY2sgKmIgPSAmZi0+YmxvY2tbY2hdOworICAgICAgICBmbG9hdCBtID0gYi0+ZW1waF9jb2VmZjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENFTFRfT1ZFUkxBUDsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSBiLT5vdmVybGFwW2ldOworICAgICAgICAgICAgYi0+b3ZlcmxhcFtpXSA9IHNhbXBsZSAtIG07CisgICAgICAgICAgICBtID0gc2FtcGxlICogQ0VMVF9FTVBIX0NPRUZGOworICAgICAgICB9CisgICAgICAgIGItPmVtcGhfY29lZmYgPSBtOworICAgIH0KKworICAgIC8qIEZpbHRlciB0aGUgc2FtcGxlcyBidXQgZG8gbm90IHVwZGF0ZSB0aGUgbGFzdCBzdWJmcmFtZSdzIGNvZWZmIC0gb3ZlcmxhcCBeXl4gKi8KKyAgICBmb3IgKHNmID0gMDsgc2YgPCBzdWJmcmFtZXM7IHNmKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZi0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIENlbHRCbG9jayAqYiA9ICZmLT5ibG9ja1tjaF07CisgICAgICAgICAgICBmbG9hdCBtID0gYi0+ZW1waF9jb2VmZjsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdWJmcmFtZXNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9IGItPnNhbXBsZXNbc2Yqc3ViZnJhbWVzaXplICsgaV07CisgICAgICAgICAgICAgICAgYi0+c2FtcGxlc1tzZipzdWJmcmFtZXNpemUgKyBpXSA9IHNhbXBsZSAtIG07CisgICAgICAgICAgICAgICAgbSA9IHNhbXBsZSAqIENFTFRfRU1QSF9DT0VGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZiAhPSAoc3ViZnJhbWVzIC0gMSkpCisgICAgICAgICAgICAgICAgYi0+ZW1waF9jb2VmZiA9IG07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENyZWF0ZSB0aGUgd2luZG93IGFuZCBkbyB0aGUgbWRjdCAqLworc3RhdGljIHZvaWQgY2VsdF9mcmFtZV9tZGN0KE9wdXNFbmNDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmYpCit7CisgICAgaW50IGksIGosIHQsIGNoOworICAgIGZsb2F0ICp3aW4gPSBzLT5zY3JhdGNoLCAqdGVtcCA9IHMtPnNjcmF0Y2ggKyAxOTIwOworCisgICAgaWYgKGYtPnRyYW5zaWVudCkgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBmLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgQ2VsdEJsb2NrICpiID0gJmYtPmJsb2NrW2NoXTsKKyAgICAgICAgICAgIGZsb2F0ICpzcmMxID0gYi0+b3ZlcmxhcDsKKyAgICAgICAgICAgIGZvciAodCA9IDA7IHQgPCBmLT5ibG9ja3M7IHQrKykgeworICAgICAgICAgICAgICAgIGZsb2F0ICpzcmMyID0gJmItPnNhbXBsZXNbQ0VMVF9PVkVSTEFQKnRdOworICAgICAgICAgICAgICAgIHMtPmRzcC0+dmVjdG9yX2ZtdWwod2luLCBzcmMxLCBmZl9jZWx0X3dpbmRvdywgMTI4KTsKKyAgICAgICAgICAgICAgICBzLT5kc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2UoJndpbltDRUxUX09WRVJMQVBdLCBzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl9jZWx0X3dpbmRvdyAtIDgsIDEyOCk7CisgICAgICAgICAgICAgICAgc3JjMSA9IHNyYzI7CisgICAgICAgICAgICAgICAgcy0+bWRjdFswXS0+bWRjdChzLT5tZGN0WzBdLCBiLT5jb2VmZnMgKyB0LCB3aW4sIGYtPmJsb2Nrcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgYmxrX2xlbiA9IE9QVVNfQkxPQ0tfU0laRShmLT5zaXplKSwgd2xlbiA9IE9QVVNfQkxPQ0tfU0laRShmLT5zaXplICsgMSk7CisgICAgICAgIGludCByd2luID0gYmxrX2xlbiAtIENFTFRfT1ZFUkxBUCwgbGFwX2RzdCA9ICh3bGVuIC0gYmxrX2xlbiAtIENFTFRfT1ZFUkxBUCkgPj4gMTsKKyAgICAgICAgbWVtc2V0KHdpbiwgMCwgd2xlbipzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZi0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIENlbHRCbG9jayAqYiA9ICZmLT5ibG9ja1tjaF07CisKKyAgICAgICAgICAgIC8qIE92ZXJsYXAgKi8KKyAgICAgICAgICAgIHMtPmRzcC0+dmVjdG9yX2ZtdWwodGVtcCwgYi0+b3ZlcmxhcCwgZmZfY2VsdF93aW5kb3csIDEyOCk7CisgICAgICAgICAgICBtZW1jcHkod2luICsgbGFwX2RzdCwgdGVtcCwgQ0VMVF9PVkVSTEFQKnNpemVvZihmbG9hdCkpOworCisgICAgICAgICAgICAvKiBTYW1wbGVzLCBmbGF0IHRvcCB3aW5kb3cgKi8KKyAgICAgICAgICAgIG1lbWNweSgmd2luW2xhcF9kc3QgKyBDRUxUX09WRVJMQVBdLCBiLT5zYW1wbGVzLCByd2luKnNpemVvZihmbG9hdCkpOworCisgICAgICAgICAgICAvKiBTYW1wbGVzLCB3aW5kb3dlZCAqLworICAgICAgICAgICAgcy0+ZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKHRlbXAsIGItPnNhbXBsZXMgKyByd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NlbHRfd2luZG93IC0gOCwgMTI4KTsKKyAgICAgICAgICAgIG1lbWNweSh3aW4gKyBsYXBfZHN0ICsgYmxrX2xlbiwgdGVtcCwgQ0VMVF9PVkVSTEFQKnNpemVvZihmbG9hdCkpOworCisgICAgICAgICAgICBzLT5tZGN0W2YtPnNpemVdLT5tZGN0KHMtPm1kY3RbZi0+c2l6ZV0sIGItPmNvZWZmcywgd2luLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGYtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIENlbHRCbG9jayAqYmxvY2sgPSAmZi0+YmxvY2tbY2hdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0VMVF9NQVhfQkFORFM7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgZW5lciA9IDAuMGY7CisgICAgICAgICAgICBpbnQgYmFuZF9vZmZzZXQgPSBmZl9jZWx0X2ZyZXFfYmFuZHNbaV0gPDwgZi0+c2l6ZTsKKyAgICAgICAgICAgIGludCBiYW5kX3NpemUgICA9IGZmX2NlbHRfZnJlcV9yYW5nZVtpXSA8PCBmLT5zaXplOworICAgICAgICAgICAgZmxvYXQgKmNvZWZmcyAgID0gJmJsb2NrLT5jb2VmZnNbYmFuZF9vZmZzZXRdOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYmFuZF9zaXplOyBqKyspCisgICAgICAgICAgICAgICAgZW5lciArPSBjb2VmZnNbal0qY29lZmZzW2pdOworCisgICAgICAgICAgICBibG9jay0+bGluX2VuZXJneVtpXSA9IHNxcnRmKGVuZXIpICsgRkxUX0VQU0lMT047CisgICAgICAgICAgICBlbmVyID0gMS4wZi9ibG9jay0+bGluX2VuZXJneVtpXTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGJhbmRfc2l6ZTsgaisrKQorICAgICAgICAgICAgICAgIGNvZWZmc1tqXSAqPSBlbmVyOworCisgICAgICAgICAgICBibG9jay0+ZW5lcmd5W2ldID0gbG9nMmYoYmxvY2stPmxpbl9lbmVyZ3lbaV0pIC0gZmZfY2VsdF9tZWFuX2VuZXJneVtpXTsKKworICAgICAgICAgICAgLyogQ0VMVF9FTkVSR1lfU0lMRU5DRSBpcyB3aGF0IHRoZSBkZWNvZGVyIHVzZXMgYW5kIGl0cyBub3QgLWluZmluaXR5ICovCisgICAgICAgICAgICBibG9jay0+ZW5lcmd5W2ldID0gRkZNQVgoYmxvY2stPmVuZXJneVtpXSwgQ0VMVF9FTkVSR1lfU0lMRU5DRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfZW5jX3RmKENlbHRGcmFtZSAqZiwgT3B1c1JhbmdlQ29kZXIgKnJjKQoreworICAgIGludCBpLCB0Zl9zZWxlY3QgPSAwLCBkaWZmID0gMCwgdGZfY2hhbmdlZCA9IDAsIHRmX3NlbGVjdF9uZWVkZWQ7CisgICAgaW50IGJpdHMgPSBmLT50cmFuc2llbnQgPyAyIDogNDsKKworICAgIHRmX3NlbGVjdF9uZWVkZWQgPSAoKGYtPnNpemUgJiYgKG9wdXNfcmNfdGVsbChyYykgKyBiaXRzICsgMSkgPD0gZi0+ZnJhbWViaXRzKSk7CisKKyAgICBmb3IgKGkgPSBmLT5zdGFydF9iYW5kOyBpIDwgZi0+ZW5kX2JhbmQ7IGkrKykgeworICAgICAgICBpZiAoKG9wdXNfcmNfdGVsbChyYykgKyBiaXRzICsgdGZfc2VsZWN0X25lZWRlZCkgPD0gZi0+ZnJhbWViaXRzKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgdGJpdCA9IChkaWZmIF4gMSkgPT0gZi0+dGZfY2hhbmdlW2ldOworICAgICAgICAgICAgZmZfb3B1c19yY19lbmNfbG9nKHJjLCB0Yml0LCBiaXRzKTsKKyAgICAgICAgICAgIGRpZmYgXj0gdGJpdDsKKyAgICAgICAgICAgIHRmX2NoYW5nZWQgfD0gZGlmZjsKKyAgICAgICAgfQorICAgICAgICBiaXRzID0gZi0+dHJhbnNpZW50ID8gNCA6IDU7CisgICAgfQorCisgICAgaWYgKHRmX3NlbGVjdF9uZWVkZWQgJiYgZmZfY2VsdF90Zl9zZWxlY3RbZi0+c2l6ZV1bZi0+dHJhbnNpZW50XVswXVt0Zl9jaGFuZ2VkXSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NlbHRfdGZfc2VsZWN0W2YtPnNpemVdW2YtPnRyYW5zaWVudF1bMV1bdGZfY2hhbmdlZF0pIHsKKyAgICAgICAgZmZfb3B1c19yY19lbmNfbG9nKHJjLCBmLT50Zl9zZWxlY3QsIDEpOworICAgICAgICB0Zl9zZWxlY3QgPSBmLT50Zl9zZWxlY3Q7CisgICAgfQorCisgICAgZm9yIChpID0gZi0+c3RhcnRfYmFuZDsgaSA8IGYtPmVuZF9iYW5kOyBpKyspCisgICAgICAgIGYtPnRmX2NoYW5nZVtpXSA9IGZmX2NlbHRfdGZfc2VsZWN0W2YtPnNpemVdW2YtPnRyYW5zaWVudF1bdGZfc2VsZWN0XVtmLT50Zl9jaGFuZ2VbaV1dOworfQorCitzdGF0aWMgdm9pZCBjZWx0X2VuY19xdWFudF9wZmlsdGVyKE9wdXNSYW5nZUNvZGVyICpyYywgQ2VsdEZyYW1lICpmKQoreworICAgIGZsb2F0IGdhaW4gPSBmLT5wZl9nYWluOworICAgIGludCBpLCB0eHZhbCwgb2N0YXZlID0gZi0+cGZfb2N0YXZlLCBwZXJpb2QgPSBmLT5wZl9wZXJpb2QsIHRhcHNldCA9IGYtPnBmX3RhcHNldDsKKworICAgIGZmX29wdXNfcmNfZW5jX2xvZyhyYywgZi0+cGZpbHRlciwgMSk7CisgICAgaWYgKCFmLT5wZmlsdGVyKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBPY3RhdmUgKi8KKyAgICB0eHZhbCA9IEZGTUlOKG9jdGF2ZSwgNik7CisgICAgZmZfb3B1c19yY19lbmNfdWludChyYywgdHh2YWwsIDYpOworICAgIG9jdGF2ZSA9IHR4dmFsOworICAgIC8qIFBlcmlvZCAqLworICAgIHR4dmFsID0gYXZfY2xpcChwZXJpb2QgLSAoMTYgPDwgb2N0YXZlKSArIDEsIDAsICgxIDw8ICg0ICsgb2N0YXZlKSkgLSAxKTsKKyAgICBmZl9vcHVzX3JjX3B1dF9yYXcocmMsIHBlcmlvZCwgNCArIG9jdGF2ZSk7CisgICAgcGVyaW9kID0gdHh2YWwgKyAoMTYgPDwgb2N0YXZlKSAtIDE7CisgICAgLyogR2FpbiAqLworICAgIHR4dmFsID0gRkZNSU4oKChpbnQpKGdhaW4gLyAwLjA5Mzc1ZikpIC0gMSwgNyk7CisgICAgZmZfb3B1c19yY19wdXRfcmF3KHJjLCB0eHZhbCwgMyk7CisgICAgZ2FpbiAgID0gMC4wOTM3NWYgKiAodHh2YWwgKyAxKTsKKyAgICAvKiBUYXBzZXQgKi8KKyAgICBpZiAoKG9wdXNfcmNfdGVsbChyYykgKyAyKSA8PSBmLT5mcmFtZWJpdHMpCisgICAgICAgIGZmX29wdXNfcmNfZW5jX2NkZihyYywgdGFwc2V0LCBmZl9jZWx0X21vZGVsX3RhcHNldCk7CisgICAgZWxzZQorICAgICAgICB0YXBzZXQgPSAwOworICAgIC8qIEZpbmFsbHkgY3JlYXRlIHRoZSBjb2VmZnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIENlbHRCbG9jayAqYmxvY2sgPSAmZi0+YmxvY2tbaV07CisKKyAgICAgICAgYmxvY2stPnBmX3BlcmlvZF9uZXcgPSBGRk1BWChwZXJpb2QsIENFTFRfUE9TVEZJTFRFUl9NSU5QRVJJT0QpOworICAgICAgICBibG9jay0+cGZfZ2FpbnNfbmV3WzBdID0gZ2FpbiAqIGZmX2NlbHRfcG9zdGZpbHRlcl90YXBzW3RhcHNldF1bMF07CisgICAgICAgIGJsb2NrLT5wZl9nYWluc19uZXdbMV0gPSBnYWluICogZmZfY2VsdF9wb3N0ZmlsdGVyX3RhcHNbdGFwc2V0XVsxXTsKKyAgICAgICAgYmxvY2stPnBmX2dhaW5zX25ld1syXSA9IGdhaW4gKiBmZl9jZWx0X3Bvc3RmaWx0ZXJfdGFwc1t0YXBzZXRdWzJdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZXhwX3F1YW50X2NvYXJzZShPcHVzUmFuZ2VDb2RlciAqcmMsIENlbHRGcmFtZSAqZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGFzdF9lbmVyZ3lbXVtDRUxUX01BWF9CQU5EU10sIGludCBpbnRyYSkKK3sKKyAgICBpbnQgaSwgY2g7CisgICAgZmxvYXQgYWxwaGEsIGJldGEsIHByZXZbMl0gPSB7IDAsIDAgfTsKKyAgICBjb25zdCB1aW50OF90ICpwbW9kID0gZmZfY2VsdF9jb2Fyc2VfZW5lcmd5X2Rpc3RbZi0+c2l6ZV1baW50cmFdOworCisgICAgLyogSW50ZXIgaXMgcmVhbGx5IGp1c3QgZGlmZmVyZW50aWFsIGNvZGluZyAqLworICAgIGlmIChvcHVzX3JjX3RlbGwocmMpICsgMyA8PSBmLT5mcmFtZWJpdHMpCisgICAgICAgIGZmX29wdXNfcmNfZW5jX2xvZyhyYywgaW50cmEsIDMpOworICAgIGVsc2UKKyAgICAgICAgaW50cmEgPSAwOworCisgICAgaWYgKGludHJhKSB7CisgICAgICAgIGFscGhhID0gMC4wZjsKKyAgICAgICAgYmV0YSAgPSAxLjBmIC0gKDQ5MTUuMGYvMzI3NjguMGYpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFscGhhID0gZmZfY2VsdF9hbHBoYV9jb2VmW2YtPnNpemVdOworICAgICAgICBiZXRhICA9IGZmX2NlbHRfYmV0YV9jb2VmW2YtPnNpemVdOworICAgIH0KKworICAgIGZvciAoaSA9IGYtPnN0YXJ0X2JhbmQ7IGkgPCBmLT5lbmRfYmFuZDsgaSsrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGYtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBDZWx0QmxvY2sgKmJsb2NrID0gJmYtPmJsb2NrW2NoXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBsZWZ0ID0gZi0+ZnJhbWViaXRzIC0gb3B1c19yY190ZWxsKHJjKTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxhc3QgPSBGRk1BWCgtOS4wZiwgbGFzdF9lbmVyZ3lbY2hdW2ldKTsKKyAgICAgICAgICAgIGZsb2F0IGRpZmYgPSBibG9jay0+ZW5lcmd5W2ldIC0gcHJldltjaF0gLSBsYXN0KmFscGhhOworICAgICAgICAgICAgaW50IHFfZW4gPSBscmludGYoZGlmZik7CisgICAgICAgICAgICBpZiAobGVmdCA+PSAxNSkgeworICAgICAgICAgICAgICAgIGZmX29wdXNfcmNfZW5jX2xhcGxhY2UocmMsICZxX2VuLCBwbW9kW2kgPDwgMV0gPDwgNywgcG1vZFsoaSA8PCAxKSArIDFdIDw8IDYpOworICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0ID49IDIpIHsKKyAgICAgICAgICAgICAgICBxX2VuID0gYXZfY2xpcChxX2VuLCAtMSwgMSk7CisgICAgICAgICAgICAgICAgZmZfb3B1c19yY19lbmNfY2RmKHJjLCAyKnFfZW4gKyAzKihxX2VuIDwgMCksIGZmX2NlbHRfbW9kZWxfZW5lcmd5X3NtYWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobGVmdCA+PSAxKSB7CisgICAgICAgICAgICAgICAgcV9lbiA9IGF2X2NsaXAocV9lbiwgLTEsIDApOworICAgICAgICAgICAgICAgIGZmX29wdXNfcmNfZW5jX2xvZyhyYywgKHFfZW4gJiAxKSwgMSk7CisgICAgICAgICAgICB9IGVsc2UgcV9lbiA9IC0xOworCisgICAgICAgICAgICBibG9jay0+ZXJyb3JfZW5lcmd5W2ldID0gcV9lbiAtIGRpZmY7CisgICAgICAgICAgICBwcmV2W2NoXSArPSBiZXRhICogcV9lbjsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY2VsdF9xdWFudF9jb2Fyc2UoQ2VsdEZyYW1lICpmLCBPcHVzUmFuZ2VDb2RlciAqcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsYXN0X2VuZXJneVtdW0NFTFRfTUFYX0JBTkRTXSkKK3sKKyAgICB1aW50MzJfdCBpbnRlciwgaW50cmE7CisgICAgT1BVU19SQ19DSEVDS1BPSU5UX1NQQVdOKHJjKTsKKworICAgIGV4cF9xdWFudF9jb2Fyc2UocmMsIGYsIGxhc3RfZW5lcmd5LCAxKTsKKyAgICBpbnRyYSA9IE9QVVNfUkNfQ0hFQ0tQT0lOVF9CSVRTKHJjKTsKKworICAgIE9QVVNfUkNfQ0hFQ0tQT0lOVF9ST0xMQkFDSyhyYyk7CisKKyAgICBleHBfcXVhbnRfY29hcnNlKHJjLCBmLCBsYXN0X2VuZXJneSwgMCk7CisgICAgaW50ZXIgPSBPUFVTX1JDX0NIRUNLUE9JTlRfQklUUyhyYyk7CisKKyAgICBpZiAoaW50ZXIgPiBpbnRyYSkgeyAvKiBVbmxpa2VseSAqLworICAgICAgICBPUFVTX1JDX0NIRUNLUE9JTlRfUk9MTEJBQ0socmMpOworICAgICAgICBleHBfcXVhbnRfY29hcnNlKHJjLCBmLCBsYXN0X2VuZXJneSwgMSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjZWx0X3F1YW50X2ZpbmUoQ2VsdEZyYW1lICpmLCBPcHVzUmFuZ2VDb2RlciAqcmMpCit7CisgICAgaW50IGksIGNoOworICAgIGZvciAoaSA9IGYtPnN0YXJ0X2JhbmQ7IGkgPCBmLT5lbmRfYmFuZDsgaSsrKSB7CisgICAgICAgIGlmICghZi0+ZmluZV9iaXRzW2ldKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGYtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBDZWx0QmxvY2sgKmJsb2NrID0gJmYtPmJsb2NrW2NoXTsKKyAgICAgICAgICAgIGludCBxdWFudCwgbGltID0gKDEgPDwgZi0+ZmluZV9iaXRzW2ldKTsKKyAgICAgICAgICAgIGZsb2F0IG9mZnNldCwgZGlmZiA9IDAuNWYgLSBibG9jay0+ZXJyb3JfZW5lcmd5W2ldOworICAgICAgICAgICAgcXVhbnQgPSBhdl9jbGlwKGZsb29yKGRpZmYqbGltKSwgMCwgbGltIC0gMSk7CisgICAgICAgICAgICBmZl9vcHVzX3JjX3B1dF9yYXcocmMsIHF1YW50LCBmLT5maW5lX2JpdHNbaV0pOworICAgICAgICAgICAgb2Zmc2V0ID0gMC41ZiAtICgocXVhbnQgKyAwLjVmKSAqICgxIDw8ICgxNCAtIGYtPmZpbmVfYml0c1tpXSkpIC8gMTYzODQuMGYpOworICAgICAgICAgICAgYmxvY2stPmVycm9yX2VuZXJneVtpXSAtPSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfcXVhbnRfZmluYWwoT3B1c0VuY0NvbnRleHQgKnMsIE9wdXNSYW5nZUNvZGVyICpyYywgQ2VsdEZyYW1lICpmKQoreworICAgIGludCBpLCBjaCwgcHJpb3JpdHk7CisgICAgZm9yIChwcmlvcml0eSA9IDA7IHByaW9yaXR5IDwgMjsgcHJpb3JpdHkrKykgeworICAgICAgICBmb3IgKGkgPSBmLT5zdGFydF9iYW5kOyBpIDwgZi0+ZW5kX2JhbmQgJiYgKGYtPmZyYW1lYml0cyAtIG9wdXNfcmNfdGVsbChyYykpID49IGYtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChmLT5maW5lX3ByaW9yaXR5W2ldICE9IHByaW9yaXR5IHx8IGYtPmZpbmVfYml0c1tpXSA+PSBDRUxUX01BWF9GSU5FX0JJVFMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBmLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgICAgIENlbHRCbG9jayAqYmxvY2sgPSAmZi0+YmxvY2tbY2hdOworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGVyciA9IGJsb2NrLT5lcnJvcl9lbmVyZ3lbaV07CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgb2Zmc2V0ID0gMC41ZiAqICgxIDw8ICgxNCAtIGYtPmZpbmVfYml0c1tpXSAtIDEpKSAvIDE2Mzg0LjBmOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaWduID0gRkZBQlMoZXJyICsgb2Zmc2V0KSA8IEZGQUJTKGVyciAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgZmZfb3B1c19yY19wdXRfcmF3KHJjLCBzaWduLCAxKTsKKyAgICAgICAgICAgICAgICBibG9jay0+ZXJyb3JfZW5lcmd5W2ldIC09IG9mZnNldCooMSAtIDIqc2lnbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNlbHRfZW5jb2RlX2ZyYW1lKE9wdXNFbmNDb250ZXh0ICpzLCBPcHVzUmFuZ2VDb2RlciAqcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZWx0RnJhbWUgKmYsIGludCBpbmRleCkKK3sKKyAgICBpbnQgaSwgY2g7CisKKyAgICBmZl9vcHVzX3JjX2VuY19pbml0KHJjKTsKKworICAgIGZmX29wdXNfcHN5X2NlbHRfZnJhbWVfaW5pdCgmcy0+cHN5Y3R4LCBmLCBpbmRleCk7CisKKyAgICBjZWx0X2ZyYW1lX3NldHVwX2lucHV0KHMsIGYpOworCisgICAgaWYgKGYtPnNpbGVuY2UpIHsKKyAgICAgICAgaWYgKGYtPmZyYW1lYml0cyA+PSAxNikKKyAgICAgICAgICAgIGZmX29wdXNfcmNfZW5jX2xvZyhyYywgMSwgMTUpOyAvKiBTaWxlbmNlIChpZiB1c2luZyBleHBsaWNpdCBzaW5nYWxsaW5nKSAqLworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIG1lbXNldChzLT5sYXN0X3F1YW50aXplZF9lbmVyZ3lbY2hdLCAwLjBmLCBzaXplb2YoZmxvYXQpKkNFTFRfTUFYX0JBTkRTKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEZpbHRlcnMgKi8KKyAgICBjZWx0X2FwcGx5X3ByZWVtcGhfZmlsdGVyKHMsIGYpOworICAgIGlmIChmLT5wZmlsdGVyKSB7CisgICAgICAgIGZmX29wdXNfcmNfZW5jX2xvZyhyYywgMCwgMTUpOworICAgICAgICBjZWx0X2VuY19xdWFudF9wZmlsdGVyKHJjLCBmKTsKKyAgICB9CisKKyAgICAvKiBUcmFuc2Zvcm0gKi8KKyAgICBjZWx0X2ZyYW1lX21kY3QocywgZik7CisKKyAgICAvKiBOZWVkIHRvIGhhbmRsZSB0cmFuc2llbnQvbm9uLXRyYW5zaWVudCBzd2l0Y2hlcyBhdCBhbnkgcG9pbnQgZHVyaW5nIGFuYWx5c2lzICovCisgICAgd2hpbGUgKGZmX29wdXNfcHN5X2NlbHRfZnJhbWVfcHJvY2Vzcygmcy0+cHN5Y3R4LCBmLCBpbmRleCkpCisgICAgICAgIGNlbHRfZnJhbWVfbWRjdChzLCBmKTsKKworICAgIGZmX29wdXNfcmNfZW5jX2luaXQocmMpOworCisgICAgLyogU2lsZW5jZSAqLworICAgIGZmX29wdXNfcmNfZW5jX2xvZyhyYywgMCwgMTUpOworCisgICAgLyogUGl0Y2ggZmlsdGVyICovCisgICAgaWYgKCFmLT5zdGFydF9iYW5kICYmIG9wdXNfcmNfdGVsbChyYykgKyAxNiA8PSBmLT5mcmFtZWJpdHMpCisgICAgICAgIGNlbHRfZW5jX3F1YW50X3BmaWx0ZXIocmMsIGYpOworCisgICAgLyogVHJhbnNpZW50IGZsYWcgKi8KKyAgICBpZiAoZi0+c2l6ZSAmJiBvcHVzX3JjX3RlbGwocmMpICsgMyA8PSBmLT5mcmFtZWJpdHMpCisgICAgICAgIGZmX29wdXNfcmNfZW5jX2xvZyhyYywgZi0+dHJhbnNpZW50LCAzKTsKKworICAgIC8qIE1haW4gZW5jb2RpbmcgKi8KKyAgICBjZWx0X3F1YW50X2NvYXJzZSAgKGYsIHJjLCBzLT5sYXN0X3F1YW50aXplZF9lbmVyZ3kpOworICAgIGNlbHRfZW5jX3RmICAgICAgICAoZiwgcmMpOworICAgIGZmX2NlbHRfYml0YWxsb2MgICAoZiwgcmMsIDEpOworICAgIGNlbHRfcXVhbnRfZmluZSAgICAoZiwgcmMpOworICAgIGZmX2NlbHRfcXVhbnRfYmFuZHMoZiwgcmMpOworCisgICAgLyogQW50aWNvbGxhcHNlIGJpdCAqLworICAgIGlmIChmLT5hbnRpY29sbGFwc2VfbmVlZGVkKQorICAgICAgICBmZl9vcHVzX3JjX3B1dF9yYXcocmMsIGYtPmFudGljb2xsYXBzZSwgMSk7CisKKyAgICAvKiBGaW5hbCBwZXItYmFuZCBlbmVyZ3kgYWRqdXN0bWVudHMgZnJvbSBsZWZ0b3ZlciBiaXRzICovCisgICAgY2VsdF9xdWFudF9maW5hbChzLCByYywgZik7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBmLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBDZWx0QmxvY2sgKmJsb2NrID0gJmYtPmJsb2NrW2NoXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspCisgICAgICAgICAgICBzLT5sYXN0X3F1YW50aXplZF9lbmVyZ3lbY2hdW2ldID0gYmxvY2stPmVuZXJneVtpXSArIGJsb2NrLT5lcnJvcl9lbmVyZ3lbaV07CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGludCB3cml0ZV9vcHVzbGFjaW5nKHVpbnQ4X3QgKmRzdCwgaW50IHYpCit7CisgICAgZHN0WzBdID0gRkZNSU4odiAtIEZGQUxJR04odiAtIDI1NSwgNCksIHYpOworICAgIGRzdFsxXSA9IHYgLSBkc3RbMF0gPj4gMjsKKyAgICByZXR1cm4gMSArICh2ID49IDI1Mik7Cit9CisKK3N0YXRpYyB2b2lkIG9wdXNfcGFja2V0X2Fzc2VtYmxlcihPcHVzRW5jQ29udGV4dCAqcywgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIGludCBpLCBvZmZzZXQsIGZzaXplX25lZWRlZDsKKworICAgIC8qIFdyaXRlIHRvYyAqLworICAgIG9wdXNfZ2VuX3RvYyhzLCBhdnBrdC0+ZGF0YSwgJm9mZnNldCwgJmZzaXplX25lZWRlZCk7CisKKyAgICAvKiBGcmFtZSBzaXplcyBpZiBuZWVkZWQgKi8KKyAgICBpZiAoZnNpemVfbmVlZGVkKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wYWNrZXQuZnJhbWVzIC0gMTsgaSsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0gd3JpdGVfb3B1c2xhY2luZyhhdnBrdC0+ZGF0YSArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lW2ldLmZyYW1lYml0cyA+PiAzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFBhY2tldHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGFja2V0LmZyYW1lczsgaSsrKSB7CisgICAgICAgIGZmX29wdXNfcmNfZW5jX2VuZCgmcy0+cmNbaV0sIGF2cGt0LT5kYXRhICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVbaV0uZnJhbWViaXRzID4+IDMpOworICAgICAgICBvZmZzZXQgKz0gcy0+ZnJhbWVbaV0uZnJhbWViaXRzID4+IDM7CisgICAgfQorCisgICAgYXZwa3QtPnNpemUgPSBvZmZzZXQ7Cit9CisKKy8qIFVzZWQgYXMgb3ZlcmxhcCBmb3IgdGhlIGZpcnN0IGZyYW1lIGFuZCBwYWRkaW5nIGZvciB0aGUgbGFzdCBlbmNvZGVkIHBhY2tldCAqLworc3RhdGljIEFWRnJhbWUgKnNwYXduX2VtcHR5X2ZyYW1lKE9wdXNFbmNDb250ZXh0ICpzKQoreworICAgIGludCBpOworICAgIEFWRnJhbWUgKmYgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZi0+Zm9ybWF0ICAgICAgICAgPSBzLT5hdmN0eC0+c2FtcGxlX2ZtdDsKKyAgICBmLT5uYl9zYW1wbGVzICAgICA9IHMtPmF2Y3R4LT5mcmFtZV9zaXplOworICAgIGYtPmNoYW5uZWxfbGF5b3V0ID0gcy0+YXZjdHgtPmNoYW5uZWxfbGF5b3V0OworICAgIGlmIChhdl9mcmFtZV9nZXRfYnVmZmVyKGYsIDQpKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmYpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGJwcyA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGYtPmZvcm1hdCk7CisgICAgICAgIG1lbXNldChmLT5leHRlbmRlZF9kYXRhW2ldLCAwLCBicHMqZi0+bmJfc2FtcGxlcyk7CisgICAgfQorICAgIHJldHVybiBmOworfQorCitzdGF0aWMgaW50IG9wdXNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKK3sKKyAgICBPcHVzRW5jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIHJldCwgZnJhbWVfc2l6ZSwgYWxsb2Nfc2l6ZSA9IDA7CisKKyAgICBpZiAoZnJhbWUpIHsgLyogQWRkIG5ldyBmcmFtZSB0byBxdWV1ZSAqLworICAgICAgICBpZiAoKHJldCA9IGZmX2FmX3F1ZXVlX2FkZCgmcy0+YWZxLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGZmX2J1ZnF1ZXVlX2FkZChhdmN0eCwgJnMtPmJ1ZnF1ZXVlLCBhdl9mcmFtZV9jbG9uZShmcmFtZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZmX29wdXNfcHN5X3NpZ25hbF9lb2YoJnMtPnBzeWN0eCk7CisgICAgICAgIGlmICghcy0+YWZxLnJlbWFpbmluZ19zYW1wbGVzKQorICAgICAgICAgICAgcmV0dXJuIDA7IC8qIFdlJ3ZlIGJlZW4gZmx1c2hlZCBhbmQgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZW5jb2RlICovCisgICAgfQorCisgICAgLyogUnVuIHRoZSBwc3ljaG9hY291c3RpYyBzeXN0ZW0gKi8KKyAgICBpZiAoZmZfb3B1c19wc3lfcHJvY2Vzcygmcy0+cHN5Y3R4LCAmcy0+cGFja2V0KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmcmFtZV9zaXplID0gT1BVU19CTE9DS19TSVpFKHMtPnBhY2tldC5mcmFtZXNpemUpOworCisgICAgaWYgKCFmcmFtZSkgeworICAgICAgICAvKiBUaGlzIGNhbiBnbyBuZWdhdGl2ZSwgdGhhdCdzIG5vdCBhIHByb2JsZW0sIHdlIG9ubHkgcGFkIGlmIHBvc2l0aXZlICovCisgICAgICAgIGludCBwYWRfZW1wdHkgPSBzLT5wYWNrZXQuZnJhbWVzKihmcmFtZV9zaXplL3MtPmF2Y3R4LT5mcmFtZV9zaXplKSAtIHMtPmJ1ZnF1ZXVlLmF2YWlsYWJsZSArIDE7CisgICAgICAgIC8qIFBhZCB3aXRoIGVtcHR5IDIuNSBtcyBmcmFtZXMgdG8gd2hhdGV2ZXIgZnJhbWVzaXplIHdhcyBkZWNpZGVkLAorICAgICAgICAgKiB0aGlzIHNob3VsZCBvbmx5IGhhcHBlbiBhdCB0aGUgdmVyeSBsYXN0IGZsdXNoIGZyYW1lLiBUaGUgZnJhbWVzCisgICAgICAgICAqIGFsbG9jYXRlZCBoZXJlIHdpbGwgYmUgZnJlZWQgKGJlY2F1c2UgdGhleSBoYXZlIG5vIG90aGVyIHJlZmVyZW5jZXMpCisgICAgICAgICAqIGFmdGVyIHRoZXkgZ2V0IHVzZWQgYnkgY2VsdF9mcmFtZV9zZXR1cF9pbnB1dCgpICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWRfZW1wdHk7IGkrKykgeworICAgICAgICAgICAgQVZGcmFtZSAqZW1wdHkgPSBzcGF3bl9lbXB0eV9mcmFtZShzKTsKKyAgICAgICAgICAgIGlmICghZW1wdHkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGZmX2J1ZnF1ZXVlX2FkZChhdmN0eCwgJnMtPmJ1ZnF1ZXVlLCBlbXB0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cGFja2V0LmZyYW1lczsgaSsrKSB7CisgICAgICAgIGNlbHRfZW5jb2RlX2ZyYW1lKHMsICZzLT5yY1tpXSwgJnMtPmZyYW1lW2ldLCBpKTsKKyAgICAgICAgYWxsb2Nfc2l6ZSArPSBzLT5mcmFtZVtpXS5mcmFtZWJpdHMgPj4gMzsKKyAgICB9CisKKyAgICAvKiBXb3JzdCBjYXNlIHRvYyArIHRoZSBmcmFtZSBsZW5ndGhzIGlmIG5lZWRlZCAqLworICAgIGFsbG9jX3NpemUgKz0gMiArIHMtPnBhY2tldC5mcmFtZXMqMjsKKworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIGFsbG9jX3NpemUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBBc3NlbWJsZSBwYWNrZXQgKi8KKyAgICBvcHVzX3BhY2tldF9hc3NlbWJsZXIocywgYXZwa3QpOworCisgICAgLyogVXBkYXRlIHRoZSBwc3ljaG9hY291c3RpYyBzeXN0ZW0gKi8KKyAgICBmZl9vcHVzX3BzeV9wb3N0ZW5jb2RlX3VwZGF0ZSgmcy0+cHN5Y3R4LCBzLT5mcmFtZSwgcy0+cmMpOworCisgICAgLyogUmVtb3ZlIHNhbXBsZXMgZnJvbSBxdWV1ZSBhbmQgc2tpcCBpZiBuZWVkZWQgKi8KKyAgICBmZl9hZl9xdWV1ZV9yZW1vdmUoJnMtPmFmcSwgcy0+cGFja2V0LmZyYW1lcypmcmFtZV9zaXplLCAmYXZwa3QtPnB0cywgJmF2cGt0LT5kdXJhdGlvbik7CisgICAgaWYgKHMtPnBhY2tldC5mcmFtZXMqZnJhbWVfc2l6ZSA+IGF2cGt0LT5kdXJhdGlvbikgeworICAgICAgICB1aW50OF90ICpzaWRlID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUywgMTApOworICAgICAgICBpZiAoIXNpZGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBBVl9XTDMyKCZzaWRlWzRdLCBzLT5wYWNrZXQuZnJhbWVzKmZyYW1lX3NpemUgLSBhdnBrdC0+ZHVyYXRpb24gKyAxMjApOworICAgIH0KKworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IG9wdXNfZW5jb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGk7CisgICAgT3B1c0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZm9yIChpID0gMDsgaSA8IENFTFRfQkxPQ0tfTkI7IGkrKykKKyAgICAgICAgZmZfbWRjdDE1X3VuaW5pdCgmcy0+bWRjdFtpXSk7CisKKyAgICBmZl9jZWx0X3B2cV91bmluaXQoJnMtPnB2cSk7CisgICAgYXZfZnJlZXAoJnMtPmRzcCk7CisgICAgYXZfZnJlZXAoJnMtPmZyYW1lKTsKKyAgICBhdl9mcmVlcCgmcy0+cmMpOworICAgIGZmX2FmX3F1ZXVlX2Nsb3NlKCZzLT5hZnEpOworICAgIGZmX29wdXNfcHN5X2VuZCgmcy0+cHN5Y3R4KTsKKyAgICBmZl9idWZxdWV1ZV9kaXNjYXJkX2FsbCgmcy0+YnVmcXVldWUpOworICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgb3B1c19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGksIGNoLCByZXQsIG1heF9mcmFtZXM7CisgICAgT3B1c0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBzLT5jaGFubmVscyA9IGF2Y3R4LT5jaGFubmVsczsKKworICAgIC8qIE9wdXMgYWxsb3dzIHVzIHRvIGNoYW5nZSB0aGUgZnJhbWVzaXplIG9uIGVhY2ggcGFja2V0IChhbmQgZWFjaCBwYWNrZXQgbWF5CisgICAgICogaGF2ZSBtdWx0aXBsZSBmcmFtZXMgaW4gaXQpIGJ1dCB3ZSBjYW4ndCBjaGFuZ2UgdGhlIGNvZGVjJ3MgZnJhbWUgc2l6ZSBvbgorICAgICAqIHJ1bnRpbWUsIHNvIGZpeCBpdCB0byB0aGUgbG93ZXN0IHBvc3NpYmxlIG51bWJlciBvZiBzYW1wbGVzIGFuZCB1c2UgYSBxdWV1ZQorICAgICAqIHRvIGFjY3VtdWxhdGUgQVZGcmFtZXMgdW50aWwgd2UgaGF2ZSBlbm91Z2ggdG8gZW5jb2RlIHdoYXRldmVyIHRoZSBlbmNvZGVyCisgICAgICogZGVjaWRlcyBpcyB0aGUgYmVzdCAqLworICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gMTIwOworICAgIC8qIEluaXRpYWwgcGFkZGluZyB3aWxsIGNoYW5nZSBpZiBTSUxLIGlzIGV2ZXIgc3VwcG9ydGVkICovCisgICAgYXZjdHgtPmluaXRpYWxfcGFkZGluZyA9IDEyMDsKKworICAgIGlmICghYXZjdHgtPmJpdF9yYXRlKSB7CisgICAgICAgIGludCBjb3VwbGVkID0gZmZfb3B1c19kZWZhdWx0X2NvdXBsZWRfc3RyZWFtc1tzLT5jaGFubmVscyAtIDFdOworICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSBjb3VwbGVkKig5NjAwMCkgKyAocy0+Y2hhbm5lbHMgLSBjb3VwbGVkKjIpKig0ODAwMCk7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+Yml0X3JhdGUgPCA2MDAwIHx8IGF2Y3R4LT5iaXRfcmF0ZSA+IDI1NTAwMCAqIHMtPmNoYW5uZWxzKSB7CisgICAgICAgIGludDY0X3QgY2xpcHBlZF9yYXRlID0gYXZfY2xpcChhdmN0eC0+Yml0X3JhdGUsIDYwMDAsIDI1NTAwMCAqIHMtPmNoYW5uZWxzKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBiaXRyYXRlICUiUFJJZDY0IiBrYnBzLCBjbGlwcGluZyB0byAlIlBSSWQ2NCIga2Jwc1xuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZS8xMDAwLCBjbGlwcGVkX3JhdGUvMTAwMCk7CisgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGNsaXBwZWRfcmF0ZTsKKyAgICB9CisKKyAgICAvKiBFeHRyYWRhdGEgKi8KKyAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAxOTsKKyAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBvcHVzX3dyaXRlX2V4dHJhZGF0YShhdmN0eCk7CisKKyAgICBmZl9hZl9xdWV1ZV9pbml0KGF2Y3R4LCAmcy0+YWZxKTsKKworICAgIGlmICgocmV0ID0gZmZfY2VsdF9wdnFfaW5pdCgmcy0+cHZxLCAxKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCEocy0+ZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0JJVEVYQUNUKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBJIGhhdmUgbm8gaWRlYSB3aHkgYSBiYXNlIHNjYWxpbmcgZmFjdG9yIG9mIDY4IHdvcmtzLCBjb3VsZCBiZSB0aGUgdHdpZGRsZXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0VMVF9CTE9DS19OQjsgaSsrKQorICAgICAgICBpZiAoKHJldCA9IGZmX21kY3QxNV9pbml0KCZzLT5tZGN0W2ldLCAwLCBpICsgMywgNjggPDwgKENFTFRfQkxPQ0tfTkIgLSAxIC0gaSkpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBaZXJvIG91dCBwcmV2aW91cyBlbmVyZ3kgKG1hdHRlcnMgZm9yIGludGVyIGZpcnN0IGZyYW1lKSAqLworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPmNoYW5uZWxzOyBjaCsrKQorICAgICAgICBtZW1zZXQocy0+bGFzdF9xdWFudGl6ZWRfZW5lcmd5W2NoXSwgMC4wZiwgc2l6ZW9mKGZsb2F0KSpDRUxUX01BWF9CQU5EUyk7CisKKyAgICAvKiBBbGxvY2F0ZSBhbiBlbXB0eSBmcmFtZSB0byB1c2UgYXMgb3ZlcmxhcCBmb3IgdGhlIGZpcnN0IGZyYW1lIG9mIGF1ZGlvICovCisgICAgZmZfYnVmcXVldWVfYWRkKGF2Y3R4LCAmcy0+YnVmcXVldWUsIHNwYXduX2VtcHR5X2ZyYW1lKHMpKTsKKyAgICBpZiAoIWZmX2J1ZnF1ZXVlX3BlZWsoJnMtPmJ1ZnF1ZXVlLCAwKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICgocmV0ID0gZmZfb3B1c19wc3lfaW5pdCgmcy0+cHN5Y3R4LCBzLT5hdmN0eCwgJnMtPmJ1ZnF1ZXVlLCAmcy0+b3B0aW9ucykpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogRnJhbWUgc3RydWN0cyBhbmQgcmFuZ2UgY29kZXIgYnVmZmVycyAqLworICAgIG1heF9mcmFtZXMgPSBjZWlsZihGRk1JTihzLT5vcHRpb25zLm1heF9kZWxheV9tcywgMTIwLjBmKS8yLjVmKTsKKyAgICBzLT5mcmFtZSA9IGF2X21hbGxvYyhtYXhfZnJhbWVzKnNpemVvZihDZWx0RnJhbWUpKTsKKyAgICBpZiAoIXMtPmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPnJjID0gYXZfbWFsbG9jKG1heF9mcmFtZXMqc2l6ZW9mKE9wdXNSYW5nZUNvZGVyKSk7CisgICAgaWYgKCFzLT5yYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgcy0+ZnJhbWVbaV0uZHNwID0gcy0+ZHNwOworICAgICAgICBzLT5mcmFtZVtpXS5hdmN0eCA9IHMtPmF2Y3R4OworICAgICAgICBzLT5mcmFtZVtpXS5zZWVkID0gMDsKKyAgICAgICAgcy0+ZnJhbWVbaV0ucHZxID0gcy0+cHZxOworICAgICAgICBzLT5mcmFtZVtpXS5hcHBseV9waGFzZV9pbnYgPSAxOworICAgICAgICBzLT5mcmFtZVtpXS5ibG9ja1swXS5lbXBoX2NvZWZmID0gcy0+ZnJhbWVbaV0uYmxvY2tbMV0uZW1waF9jb2VmZiA9IDAuMGY7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT1BVU0VOQ19GTEFHUyBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B1c2VuY19vcHRpb25zW10gPSB7CisgICAgeyAib3B1c19kZWxheSIsICJNYXhpbXVtIGRlbGF5IGluIG1pbGxpc2Vjb25kcyIsIG9mZnNldG9mKE9wdXNFbmNDb250ZXh0LCBvcHRpb25zLm1heF9kZWxheV9tcyksIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSBPUFVTX01BWF9MT09LQUhFQUQgfSwgMi41ZiwgT1BVU19NQVhfTE9PS0FIRUFELCBPUFVTRU5DX0ZMQUdTLCAibWF4X2RlbGF5X21zIiB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgb3B1c2VuY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJPcHVzIGVuY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHVzZW5jX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgb3B1c2VuY19kZWZhdWx0c1tdID0geworICAgIHsgImIiLCAiMCIgfSwKKyAgICB7ICJjb21wcmVzc2lvbl9sZXZlbCIsICIxMCIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK0FWQ29kZWMgZmZfb3B1c19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJvcHVzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiT3B1cyIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9PUFVTLAorICAgIC5kZWZhdWx0cyAgICAgICA9IG9wdXNlbmNfZGVmYXVsdHMsCisgICAgLnByaXZfY2xhc3MgICAgID0gJm9wdXNlbmNfY2xhc3MsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKE9wdXNFbmNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBvcHVzX2VuY29kZV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9IG9wdXNfZW5jb2RlX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IG9wdXNfZW5jb2RlX2VuZCwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFIHwgRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMIHwgQVZfQ09ERUNfQ0FQX1NNQUxMX0xBU1RfRlJBTUUgfCBBVl9DT0RFQ19DQVBfREVMQVksCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IChjb25zdCBpbnQgW10peyA0ODAwMCwgMCB9LAorICAgIC5jaGFubmVsX2xheW91dHMgPSAoY29uc3QgdWludDY0X3QgW10peyBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywgMCB9LAorICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10peyBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvb3B1c2VuYy5oIGIvbGliYXZjb2RlYy9vcHVzZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxNjJlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvb3B1c2VuYy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBPcHVzIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX09QVVNFTkNfSAorI2RlZmluZSBBVkNPREVDX09QVVNFTkNfSAorCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvcHVzX2NlbHQuaCIKKworLyogRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBkZWxheSB0aGUgcHN5Y2hvYWNvdXN0aWMgc3lzdGVtIHdpbGwgdXNlIGZvciBsb29rYWhlYWQgKi8KKyNkZWZpbmUgRkZfQlVGUVVFVUVfU0laRSAxNDUKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9idWZmZXJxdWV1ZS5oIgorCisjZGVmaW5lIE9QVVNfTUFYX0xPT0tBSEVBRCAoKEZGX0JVRlFVRVVFX1NJWkUgLSAxKSoyLjVmKQorCisjZGVmaW5lIE9QVVNfTUFYX0NIQU5ORUxTIDIKKworLyogMTIwIG1zIC8gMi41IG1zID0gNDggZnJhbWVzIChleHRyZW1lbHkgaW1wcm9iYWJsZSwgYnV0IHRoZSBlbmNvZGVyJ2xsIHdvcmspICovCisjZGVmaW5lIE9QVVNfTUFYX0ZSQU1FU19QRVJfUEFDS0VUIDQ4CisKKyNkZWZpbmUgT1BVU19CTE9DS19TSVpFKHgpICgyICogMTUgKiAoMSA8PCAoKHgpICsgMikpKQorCisjZGVmaW5lIE9QVVNfU0FNUExFU19UT19CTE9DS19TSVpFKHgpIChmZl9sb2cyKCh4KSAvICgyICogMTUpKSAtIDIpCisKK3R5cGVkZWYgc3RydWN0IE9wdXNFbmNPcHRpb25zIHsKKyAgICBmbG9hdCBtYXhfZGVsYXlfbXM7Cit9IE9wdXNFbmNPcHRpb25zOworCit0eXBlZGVmIHN0cnVjdCBPcHVzUGFja2V0SW5mbyB7CisgICAgZW51bSBPcHVzTW9kZSBtb2RlOworICAgIGVudW0gT3B1c0JhbmR3aWR0aCBiYW5kd2lkdGg7CisgICAgaW50IGZyYW1lc2l6ZTsKKyAgICBpbnQgZnJhbWVzOworfSBPcHVzUGFja2V0SW5mbzsKKworI2VuZGlmIC8qIEFWQ09ERUNfT1BVU0VOQ19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL29wdXNlbmNfcHN5LmMgYi9saWJhdmNvZGVjL29wdXNlbmNfcHN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE1MGRiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvb3B1c2VuY19wc3kuYwpAQCAtMCwwICsxLDYxMiBAQAorLyoKKyAqIE9wdXMgZW5jb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDE3IFJvc3Rpc2xhdiBQZWhsaXZhbm92IDxhdG9tbnVrZXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAib3B1c2VuY19wc3kuaCIKKyNpbmNsdWRlICJvcHVzX3B2cS5oIgorI2luY2x1ZGUgIm9wdXN0YWIuaCIKKyNpbmNsdWRlICJtZGN0MTUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcXNvcnQuaCIKKworc3RhdGljIGZsb2F0IHB2cV9iYW5kX2Nvc3QoQ2VsdFBWUSAqcHZxLCBDZWx0RnJhbWUgKmYsIE9wdXNSYW5nZUNvZGVyICpyYywgaW50IGJhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqYml0cywgZmxvYXQgbGFtYmRhKQoreworICAgIGludCBpLCBiID0gMDsKKyAgICB1aW50MzJfdCBjbVsyXSA9IHsgKDEgPDwgZi0+YmxvY2tzKSAtIDEsICgxIDw8IGYtPmJsb2NrcykgLSAxIH07CisgICAgY29uc3QgaW50IGJhbmRfc2l6ZSA9IGZmX2NlbHRfZnJlcV9yYW5nZVtiYW5kXSA8PCBmLT5zaXplOworICAgIGZsb2F0IGJ1ZlsxNzYgKiAyXSwgbG93YmFuZF9zY3JhdGNoWzE3Nl0sIG5vcm0xWzE3Nl0sIG5vcm0yWzE3Nl07CisgICAgZmxvYXQgZGlzdCwgY29zdCwgZXJyX3ggPSAwLjBmLCBlcnJfeSA9IDAuMGY7CisgICAgZmxvYXQgKlggPSBidWY7CisgICAgZmxvYXQgKlhfb3JpZyA9IGYtPmJsb2NrWzBdLmNvZWZmcyArIChmZl9jZWx0X2ZyZXFfYmFuZHNbYmFuZF0gPDwgZi0+c2l6ZSk7CisgICAgZmxvYXQgKlkgPSAoZi0+Y2hhbm5lbHMgPT0gMikgPyAmYnVmWzE3Nl0gOiBOVUxMOworICAgIGZsb2F0ICpZX29yaWcgPSBmLT5ibG9ja1sxXS5jb2VmZnMgKyAoZmZfY2VsdF9mcmVxX2JhbmRzW2JhbmRdIDw8IGYtPnNpemUpOworICAgIE9QVVNfUkNfQ0hFQ0tQT0lOVF9TUEFXTihyYyk7CisKKyAgICBtZW1jcHkoWCwgWF9vcmlnLCBiYW5kX3NpemUqc2l6ZW9mKGZsb2F0KSk7CisgICAgaWYgKFkpCisgICAgICAgIG1lbWNweShZLCBZX29yaWcsIGJhbmRfc2l6ZSpzaXplb2YoZmxvYXQpKTsKKworICAgIGYtPnJlbWFpbmluZzIgPSAoKGYtPmZyYW1lYml0cyA8PCAzKSAtIGYtPmFudGljb2xsYXBzZV9uZWVkZWQpIC0gb3B1c19yY190ZWxsX2ZyYWMocmMpIC0gMTsKKyAgICBpZiAoYmFuZCA8PSBmLT5jb2RlZF9iYW5kcyAtIDEpIHsKKyAgICAgICAgaW50IGN1cnJfYmFsYW5jZSA9IGYtPnJlbWFpbmluZyAvIEZGTUlOKDMsIGYtPmNvZGVkX2JhbmRzIC0gYmFuZCk7CisgICAgICAgIGIgPSBhdl9jbGlwX3VpbnRwMihGRk1JTihmLT5yZW1haW5pbmcyICsgMSwgZi0+cHVsc2VzW2JhbmRdICsgY3Vycl9iYWxhbmNlKSwgMTQpOworICAgIH0KKworICAgIGlmIChmLT5kdWFsX3N0ZXJlbykgeworICAgICAgICBwdnEtPnF1YW50X2JhbmQocHZxLCBmLCByYywgYmFuZCwgWCwgTlVMTCwgYmFuZF9zaXplLCBiIC8gMiwgZi0+YmxvY2tzLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgZi0+c2l6ZSwgbm9ybTEsIDAsIDEuMGYsIGxvd2JhbmRfc2NyYXRjaCwgY21bMF0pOworCisgICAgICAgIHB2cS0+cXVhbnRfYmFuZChwdnEsIGYsIHJjLCBiYW5kLCBZLCBOVUxMLCBiYW5kX3NpemUsIGIgLyAyLCBmLT5ibG9ja3MsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICBmLT5zaXplLCBub3JtMiwgMCwgMS4wZiwgbG93YmFuZF9zY3JhdGNoLCBjbVsxXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHZxLT5xdWFudF9iYW5kKHB2cSwgZiwgcmMsIGJhbmQsIFgsIFksIGJhbmRfc2l6ZSwgYiwgZi0+YmxvY2tzLCBOVUxMLCBmLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgbm9ybTEsIDAsIDEuMGYsIGxvd2JhbmRfc2NyYXRjaCwgY21bMF0gfCBjbVsxXSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGJhbmRfc2l6ZTsgaSsrKSB7CisgICAgICAgIGVycl94ICs9IChYW2ldIC0gWF9vcmlnW2ldKSooWFtpXSAtIFhfb3JpZ1tpXSk7CisgICAgICAgIGlmIChZKQorICAgICAgICAgICAgZXJyX3kgKz0gKFlbaV0gLSBZX29yaWdbaV0pKihZW2ldIC0gWV9vcmlnW2ldKTsKKyAgICB9CisKKyAgICBkaXN0ID0gc3FydGYoZXJyX3gpICsgc3FydGYoZXJyX3kpOworICAgIGNvc3QgPSBPUFVTX1JDX0NIRUNLUE9JTlRfQklUUyhyYykvOC4wZjsKKyAgICAqYml0cyArPSBjb3N0OworCisgICAgT1BVU19SQ19DSEVDS1BPSU5UX1JPTExCQUNLKHJjKTsKKworICAgIHJldHVybiBsYW1iZGEqZGlzdCpjb3N0OworfQorCisvKiBQb3B1bGF0ZSBtZXRyaWNzIHdpdGhvdXQgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBuZWlnaGJvdXJpbmcgc3RlcHMgKi8KK3N0YXRpYyB2b2lkIHN0ZXBfY29sbGVjdF9wc3lfbWV0cmljcyhPcHVzUHN5Q29udGV4dCAqcywgaW50IGluZGV4KQoreworICAgIGludCBzaWxlbmNlID0gMCwgY2gsIGksIGo7CisgICAgT3B1c1BzeVN0ZXAgKnN0ID0gcy0+c3RlcHNbaW5kZXhdOworCisgICAgc3QtPmluZGV4ID0gaW5kZXg7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgY29uc3QgaW50IGxhcF9zaXplID0gKDEgPDwgcy0+YnNpemVfYW5hbHlzaXMpOworICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IEZGTUlOKGxhcF9zaXplLCBpbmRleCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IGkqMTIwOworICAgICAgICAgICAgQVZGcmFtZSAqY3VyID0gZmZfYnVmcXVldWVfcGVlayhzLT5idWZxdWV1ZSwgaW5kZXggLSBpKTsKKyAgICAgICAgICAgIG1lbWNweSgmcy0+c2NyYXRjaFtvZmZzZXRdLCBjdXItPmV4dGVuZGVkX2RhdGFbY2hdLCBjdXItPm5iX3NhbXBsZXMqc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxhcF9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBpKjEyMCArIGxhcF9zaXplOworICAgICAgICAgICAgQVZGcmFtZSAqY3VyID0gZmZfYnVmcXVldWVfcGVlayhzLT5idWZxdWV1ZSwgaW5kZXggKyBpKTsKKyAgICAgICAgICAgIG1lbWNweSgmcy0+c2NyYXRjaFtvZmZzZXRdLCBjdXItPmV4dGVuZGVkX2RhdGFbY2hdLCBjdXItPm5iX3NhbXBsZXMqc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKworICAgICAgICBzLT5kc3AtPnZlY3Rvcl9mbXVsKHMtPnNjcmF0Y2gsIHMtPnNjcmF0Y2gsIHMtPndpbmRvd1tzLT5ic2l6ZV9hbmFseXNpc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QVVNfQkxPQ0tfU0laRShzLT5ic2l6ZV9hbmFseXNpcykgPDwgMSkpOworCisgICAgICAgIHMtPm1kY3Rbcy0+YnNpemVfYW5hbHlzaXNdLT5tZGN0KHMtPm1kY3Rbcy0+YnNpemVfYW5hbHlzaXNdLCBzdC0+Y29lZmZzW2NoXSwgcy0+c2NyYXRjaCwgMSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspCisgICAgICAgICAgICBzdC0+YmFuZHNbY2hdW2ldID0gJnN0LT5jb2VmZnNbY2hdW2ZmX2NlbHRfZnJlcV9iYW5kc1tpXSA8PCBzLT5ic2l6ZV9hbmFseXNpc107CisgICAgfQorCisgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDRUxUX01BWF9CQU5EUzsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCBhdmdfY19zLCBlbmVyZ3kgPSAwLjBmLCBkaXN0X2RldiA9IDAuMGY7CisgICAgICAgICAgICBjb25zdCBpbnQgcmFuZ2UgPSBmZl9jZWx0X2ZyZXFfcmFuZ2VbaV0gPDwgcy0+YnNpemVfYW5hbHlzaXM7CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZmZzID0gc3QtPmJhbmRzW2NoXVtpXTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByYW5nZTsgaisrKQorICAgICAgICAgICAgICAgIGVuZXJneSArPSBjb2VmZnNbal0qY29lZmZzW2pdOworCisgICAgICAgICAgICBzdC0+ZW5lcmd5W2NoXVtpXSArPSBzcXJ0ZihlbmVyZ3kpOworICAgICAgICAgICAgc2lsZW5jZSB8PSAhIXN0LT5lbmVyZ3lbY2hdW2ldOworICAgICAgICAgICAgYXZnX2NfcyA9IGVuZXJneSAvIHJhbmdlOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcmFuZ2U7IGorKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGNfcyA9IGNvZWZmc1tqXSpjb2VmZnNbal07CisgICAgICAgICAgICAgICAgZGlzdF9kZXYgKz0gKGF2Z19jX3MgLSBjX3MpKihhdmdfY19zIC0gY19zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3QtPnRvbmVbY2hdW2ldICs9IHNxcnRmKGRpc3RfZGV2KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0LT5zaWxlbmNlID0gIXNpbGVuY2U7CisKKyAgICBpZiAocy0+YXZjdHgtPmNoYW5uZWxzID4gMSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQ0VMVF9NQVhfQkFORFM7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgaW5jb21wYXQgPSAwLjBmOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNvZWZmczEgPSBzdC0+YmFuZHNbMF1baV07CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqY29lZmZzMiA9IHN0LT5iYW5kc1sxXVtpXTsKKyAgICAgICAgICAgIGNvbnN0IGludCByYW5nZSA9IGZmX2NlbHRfZnJlcV9yYW5nZVtpXSA8PCBzLT5ic2l6ZV9hbmFseXNpczsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByYW5nZTsgaisrKQorICAgICAgICAgICAgICAgIGluY29tcGF0ICs9IChjb2VmZnMxW2pdIC0gY29lZmZzMltqXSkqKGNvZWZmczFbal0gLSBjb2VmZnMyW2pdKTsKKyAgICAgICAgICAgIHN0LT5zdGVyZW9baV0gPSBzcXJ0ZihpbmNvbXBhdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspIHsKKyAgICAgICAgICAgIE9wdXNCYW5kRXhjaXRhdGlvbiAqZXggPSAmcy0+ZXhbY2hdW2ldOworICAgICAgICAgICAgZmxvYXQgYnBfZSA9IGJlc3NlbF9maWx0ZXIoJnMtPmJmaWx0ZXJfbG9bY2hdW2ldLCBzdC0+ZW5lcmd5W2NoXVtpXSk7CisgICAgICAgICAgICBicF9lID0gYmVzc2VsX2ZpbHRlcigmcy0+YmZpbHRlcl9oaVtjaF1baV0sIGJwX2UpOworICAgICAgICAgICAgYnBfZSAqPSBicF9lOworICAgICAgICAgICAgaWYgKGJwX2UgPiBleC0+ZXhjaXRhdGlvbikgeworICAgICAgICAgICAgICAgIHN0LT5jaGFuZ2VfYW1wW2NoXVtpXSA9IGJwX2UgLSBleC0+ZXhjaXRhdGlvbjsKKyAgICAgICAgICAgICAgICBzdC0+dG90YWxfY2hhbmdlICs9IHN0LT5jaGFuZ2VfYW1wW2NoXVtpXTsKKyAgICAgICAgICAgICAgICBleC0+ZXhjaXRhdGlvbiA9IGV4LT5leGNpdGF0aW9uX2luaXQgPSBicF9lOworICAgICAgICAgICAgICAgIGV4LT5leGNpdGF0aW9uX2Rpc3QgPSAwLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4LT5leGNpdGF0aW9uID4gMC4wZikgeworICAgICAgICAgICAgICAgIGV4LT5leGNpdGF0aW9uIC09IGF2X2NsaXBmKCgxL2V4cGYoZXgtPmV4Y2l0YXRpb25fZGlzdCkpLCBleC0+ZXhjaXRhdGlvbl9pbml0LzIwLCBleC0+ZXhjaXRhdGlvbl9pbml0LzEuMDkpOworICAgICAgICAgICAgICAgIGV4LT5leGNpdGF0aW9uID0gRkZNQVgoZXgtPmV4Y2l0YXRpb24sIDAuMGYpOworICAgICAgICAgICAgICAgIGV4LT5leGNpdGF0aW9uX2Rpc3QgKz0gMS4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgc2VhcmNoX2Zvcl9jaGFuZ2VfcG9pbnRzKE9wdXNQc3lDb250ZXh0ICpzLCBmbG9hdCB0Z3RfY2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfcywgaW50IG9mZnNldF9lLCBpbnQgcmVzb2x1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgY19jaGFuZ2UgPSAwLjBmOworICAgIGlmICgob2Zmc2V0X2UgLSBvZmZzZXRfcykgPD0gcmVzb2x1dGlvbikKKyAgICAgICAgcmV0dXJuOworICAgIGZvciAoaSA9IG9mZnNldF9zOyBpIDwgb2Zmc2V0X2U7IGkrKykgeworICAgICAgICBjX2NoYW5nZSArPSBzLT5zdGVwc1tpXS0+dG90YWxfY2hhbmdlOworICAgICAgICBpZiAoY19jaGFuZ2UgPiB0Z3RfY2hhbmdlKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IG9mZnNldF9lKQorICAgICAgICByZXR1cm47CisgICAgc2VhcmNoX2Zvcl9jaGFuZ2VfcG9pbnRzKHMsIHRndF9jaGFuZ2UgLyAyLjBmLCBvZmZzZXRfcywgaSArIDAsIHJlc29sdXRpb24sIGxldmVsICsgMSk7CisgICAgcy0+aW5mbGVjdGlvbl9wb2ludHNbcy0+aW5mbGVjdGlvbl9wb2ludHNfY291bnQrK10gPSBpOworICAgIHNlYXJjaF9mb3JfY2hhbmdlX3BvaW50cyhzLCB0Z3RfY2hhbmdlIC8gMi4wZiwgaSArIDEsIG9mZnNldF9lLCByZXNvbHV0aW9uLCBsZXZlbCArIDEpOworfQorCitzdGF0aWMgaW50IGZsdXNoX3NpbGVudF9mcmFtZXMoT3B1c1BzeUNvbnRleHQgKnMpCit7CisgICAgaW50IGZzaXplLCBzaWxlbnRfZnJhbWVzOworCisgICAgZm9yIChzaWxlbnRfZnJhbWVzID0gMDsgc2lsZW50X2ZyYW1lcyA8IHMtPmJ1ZmZlcmVkX3N0ZXBzOyBzaWxlbnRfZnJhbWVzKyspCisgICAgICAgIGlmICghcy0+c3RlcHNbc2lsZW50X2ZyYW1lc10tPnNpbGVuY2UpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoLS1zaWxlbnRfZnJhbWVzIDwgMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKGZzaXplID0gQ0VMVF9CTE9DS185NjA7IGZzaXplID4gQ0VMVF9CTE9DS18xMjA7IGZzaXplLS0pIHsKKyAgICAgICAgaWYgKCgxIDw8IGZzaXplKSA+IHNpbGVudF9mcmFtZXMpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcy0+cC5mcmFtZXMgPSBGRk1JTihzaWxlbnRfZnJhbWVzIC8gKDEgPDwgZnNpemUpLCA0OCA+PiBmc2l6ZSk7CisgICAgICAgIHMtPnAuZnJhbWVzaXplID0gZnNpemU7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKiBNYWluIGZ1bmN0aW9uIHdoaWNoIGRlY2lkZXMgZnJhbWUgc2l6ZSBhbmQgZnJhbWVzIHBlciBjdXJyZW50IHBhY2tldCAqLworc3RhdGljIHZvaWQgcHN5X291dHB1dF9ncm91cHMoT3B1c1BzeUNvbnRleHQgKnMpCit7CisgICAgaW50IG1heF9kZWxheV9zYW1wbGVzID0gKHMtPm9wdGlvbnMtPm1heF9kZWxheV9tcypzLT5hdmN0eC0+c2FtcGxlX3JhdGUpLzEwMDA7CisgICAgaW50IG1heF9ic2l6ZSA9IEZGTUlOKE9QVVNfU0FNUExFU19UT19CTE9DS19TSVpFKG1heF9kZWxheV9zYW1wbGVzKSwgQ0VMVF9CTE9DS185NjApOworCisgICAgLyogVGhlc2UgZG9uJ3QgY2hhbmdlIGZvciBub3cgKi8KKyAgICBzLT5wLm1vZGUgICAgICA9IE9QVVNfTU9ERV9DRUxUOworICAgIHMtPnAuYmFuZHdpZHRoID0gT1BVU19CQU5EV0lEVEhfRlVMTEJBTkQ7CisKKyAgICAvKiBGbHVzaCBzaWxlbnQgZnJhbWVzIEFTQVAgKi8KKyAgICBpZiAocy0+c3RlcHNbMF0tPnNpbGVuY2UgJiYgZmx1c2hfc2lsZW50X2ZyYW1lcyhzKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcy0+cC5mcmFtZXNpemUgPSBGRk1JTihtYXhfYnNpemUsIENFTFRfQkxPQ0tfOTYwKTsKKyAgICBzLT5wLmZyYW1lcyAgICA9IDE7Cit9CisKK2ludCBmZl9vcHVzX3BzeV9wcm9jZXNzKE9wdXNQc3lDb250ZXh0ICpzLCBPcHVzUGFja2V0SW5mbyAqcCkKK3sKKyAgICBpbnQgaTsKKyAgICBmbG9hdCB0b3RhbF9lbmVyZ3lfY2hhbmdlID0gMC4wZjsKKworICAgIGlmIChzLT5idWZmZXJlZF9zdGVwcyA8IHMtPm1heF9zdGVwcyAmJiAhcy0+ZW9mKSB7CisgICAgICAgIGNvbnN0IGludCBhd2luID0gKDEgPDwgcy0+YnNpemVfYW5hbHlzaXMpOworICAgICAgICBpZiAoKytzLT5zdGVwc190b19wcm9jZXNzID49IGF3aW4pIHsKKyAgICAgICAgICAgIHN0ZXBfY29sbGVjdF9wc3lfbWV0cmljcyhzLCBzLT5idWZmZXJlZF9zdGVwcyAtIGF3aW4gKyAxKTsKKyAgICAgICAgICAgIHMtPnN0ZXBzX3RvX3Byb2Nlc3MgPSAwOworICAgICAgICB9CisgICAgICAgIGlmICgoKytzLT5idWZmZXJlZF9zdGVwcykgPCBzLT5tYXhfc3RlcHMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YnVmZmVyZWRfc3RlcHM7IGkrKykKKyAgICAgICAgdG90YWxfZW5lcmd5X2NoYW5nZSArPSBzLT5zdGVwc1tpXS0+dG90YWxfY2hhbmdlOworCisgICAgc2VhcmNoX2Zvcl9jaGFuZ2VfcG9pbnRzKHMsIHRvdGFsX2VuZXJneV9jaGFuZ2UgLyAyLjBmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5idWZmZXJlZF9zdGVwcywgMSwgMCk7CisKKyAgICBwc3lfb3V0cHV0X2dyb3VwcyhzKTsKKworICAgIHAtPmZyYW1lcyAgICA9IHMtPnAuZnJhbWVzOworICAgIHAtPmZyYW1lc2l6ZSA9IHMtPnAuZnJhbWVzaXplOworICAgIHAtPm1vZGUgICAgICA9IHMtPnAubW9kZTsKKyAgICBwLT5iYW5kd2lkdGggPSBzLT5wLmJhbmR3aWR0aDsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX29wdXNfcHN5X2NlbHRfZnJhbWVfaW5pdChPcHVzUHN5Q29udGV4dCAqcywgQ2VsdEZyYW1lICpmLCBpbnQgaW5kZXgpCit7CisgICAgaW50IGksIG5laWdoYm91cmluZ19wb2ludHMgPSAwLCBzdGFydF9vZmZzZXQgPSAwOworICAgIGludCByYWRpdXMgPSAoMSA8PCBzLT5wLmZyYW1lc2l6ZSksIHN0ZXBfb2Zmc2V0ID0gcmFkaXVzKmluZGV4OworICAgIGludCBzaWxlbmNlID0gMTsKKworICAgIGYtPnN0YXJ0X2JhbmQgPSAocy0+cC5tb2RlID09IE9QVVNfTU9ERV9IWUJSSUQpID8gMTcgOiAwOworICAgIGYtPmVuZF9iYW5kICAgPSBmZl9jZWx0X2JhbmRfZW5kW3MtPnAuYmFuZHdpZHRoXTsKKyAgICBmLT5jaGFubmVscyAgID0gcy0+YXZjdHgtPmNoYW5uZWxzOworICAgIGYtPnNpemUgICAgICAgPSBzLT5wLmZyYW1lc2l6ZTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoMSA8PCBmLT5zaXplKTsgaSsrKQorICAgICAgICBzaWxlbmNlICY9IHMtPnN0ZXBzW2luZGV4KigxIDw8IGYtPnNpemUpICsgaV0tPnNpbGVuY2U7CisKKyAgICBmLT5zaWxlbmNlID0gc2lsZW5jZTsKKyAgICBpZiAoZi0+c2lsZW5jZSkgeworICAgICAgICBmLT5mcmFtZWJpdHMgPSAwOyAvKiBPdGhlcndpc2UgdGhlIHNpbGVuY2UgZmxhZyBlYXRzIHVwIDE2KCEpIGJpdHMgKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5pbmZsZWN0aW9uX3BvaW50c19jb3VudDsgaSsrKSB7CisgICAgICAgIGlmIChzLT5pbmZsZWN0aW9uX3BvaW50c1tpXSA+PSBzdGVwX29mZnNldCkgeworICAgICAgICAgICAgc3RhcnRfb2Zmc2V0ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gc3RhcnRfb2Zmc2V0OyBpIDwgRkZNSU4ocmFkaXVzLCBzLT5pbmZsZWN0aW9uX3BvaW50c19jb3VudCAtIHN0YXJ0X29mZnNldCk7IGkrKykgeworICAgICAgICBpZiAocy0+aW5mbGVjdGlvbl9wb2ludHNbaV0gPCAoc3RlcF9vZmZzZXQgKyByYWRpdXMpKSB7CisgICAgICAgICAgICBuZWlnaGJvdXJpbmdfcG9pbnRzKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBUcmFuc2llbnQgZmxhZ2dpbmcgKi8KKyAgICBmLT50cmFuc2llbnQgPSBuZWlnaGJvdXJpbmdfcG9pbnRzID4gMDsKKyAgICBmLT5ibG9ja3MgPSBmLT50cmFuc2llbnQgPyBPUFVTX0JMT0NLX1NJWkUocy0+cC5mcmFtZXNpemUpL0NFTFRfT1ZFUkxBUCA6IDE7CisKKyAgICAvKiBTb21lIHNhbmUgZGVmYXVsdHMgKi8KKyAgICBmLT5wZmlsdGVyICAgPSAwOworICAgIGYtPnBmX2dhaW4gICA9IDAuNWY7CisgICAgZi0+cGZfb2N0YXZlID0gMjsKKyAgICBmLT5wZl9wZXJpb2QgPSAxOworICAgIGYtPnBmX3RhcHNldCA9IDI7CisKKyAgICAvKiBNb3JlIHNhbmUgZGVmYXVsdHMgKi8KKyAgICBmLT50Zl9zZWxlY3QgPSAwOworICAgIGYtPmFudGljb2xsYXBzZSA9IDE7CisgICAgZi0+YWxsb2NfdHJpbSA9IDU7CisgICAgZi0+c2tpcF9iYW5kX2Zsb29yID0gZi0+ZW5kX2JhbmQ7CisgICAgZi0+aW50ZW5zaXR5X3N0ZXJlbyA9IGYtPmVuZF9iYW5kOworICAgIGYtPmR1YWxfc3RlcmVvID0gMDsKKyAgICBmLT5zcHJlYWQgPSBDRUxUX1NQUkVBRF9OT1JNQUw7CisgICAgbWVtc2V0KGYtPnRmX2NoYW5nZSwgMCwgc2l6ZW9mKGludCkqQ0VMVF9NQVhfQkFORFMpOworICAgIG1lbXNldChmLT5hbGxvY19ib29zdCwgMCwgc2l6ZW9mKGludCkqQ0VMVF9NQVhfQkFORFMpOworfQorCitzdGF0aWMgdm9pZCBjZWx0X2dhdWdlX3BzeV93ZWlnaHQoT3B1c1BzeUNvbnRleHQgKnMsIE9wdXNQc3lTdGVwICoqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VsdEZyYW1lICpmX291dCkKK3sKKyAgICBpbnQgaSwgZiwgY2g7CisgICAgaW50IGZyYW1lX3NpemUgPSBPUFVTX0JMT0NLX1NJWkUocy0+cC5mcmFtZXNpemUpOworICAgIGZsb2F0IHJhdGUsIGZyYW1lX2JpdHMgPSAwOworCisgICAgLyogVXNlZCBmb3IgdGhlIGdsb2JhbCBST1RBVEUgZmxhZyAqLworICAgIGZsb2F0IHRvbmFsID0gMC4wZjsKKworICAgIC8qIFBzZXVkby13ZWlnaHRzICovCisgICAgZmxvYXQgYmFuZF9zY29yZVtDRUxUX01BWF9CQU5EU10gPSB7IDAgfTsKKyAgICBmbG9hdCBtYXhfc2NvcmUgPSAxLjBmOworCisgICAgLyogUGFzcyBvbmUgLSBvbmUgbG9vcCBhcm91bmQgZWFjaCBiYW5kLCBjb21wdXRpbmcgdW5xdWFudCBzdHVmZiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBDRUxUX01BWF9CQU5EUzsgaSsrKSB7CisgICAgICAgIGZsb2F0IHdlaWdodCA9IDAuMGY7CisgICAgICAgIGZsb2F0IHRvbmFsX2NvbnRyaWIgPSAwLjBmOworICAgICAgICBmb3IgKGYgPSAwOyBmIDwgKDEgPDwgcy0+cC5mcmFtZXNpemUpOyBmKyspIHsKKyAgICAgICAgICAgIHdlaWdodCA9IHN0YXJ0W2ZdLT5zdGVyZW9baV07CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgICAgICB3ZWlnaHQgKz0gc3RhcnRbZl0tPmNoYW5nZV9hbXBbY2hdW2ldICsgc3RhcnRbZl0tPnRvbmVbY2hdW2ldICsgc3RhcnRbZl0tPmVuZXJneVtjaF1baV07CisgICAgICAgICAgICAgICAgdG9uYWxfY29udHJpYiArPSBzdGFydFtmXS0+dG9uZVtjaF1baV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdG9uYWwgKz0gdG9uYWxfY29udHJpYjsKKyAgICAgICAgYmFuZF9zY29yZVtpXSA9IHdlaWdodDsKKyAgICB9CisKKyAgICB0b25hbCAvPSAoZmxvYXQpQ0VMVF9NQVhfQkFORFM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0VMVF9NQVhfQkFORFM7IGkrKykgeworICAgICAgICBpZiAoYmFuZF9zY29yZVtpXSA+IG1heF9zY29yZSkKKyAgICAgICAgICAgIG1heF9zY29yZSA9IGJhbmRfc2NvcmVbaV07CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspIHsKKyAgICAgICAgZl9vdXQtPmFsbG9jX2Jvb3N0W2ldID0gKGludCkoKGJhbmRfc2NvcmVbaV0vbWF4X3Njb3JlKSozLjBmKTsKKyAgICAgICAgZnJhbWVfYml0cyArPSBiYW5kX3Njb3JlW2ldKjguMGY7CisgICAgfQorCisgICAgdG9uYWwgLz0gMTMzMzEzNi4wZjsKKyAgICBmX291dC0+c3ByZWFkID0gYXZfY2xpcF91aW50cDIobHJpbnRmKHRvbmFsKSwgMik7CisKKyAgICByYXRlID0gKChmbG9hdClzLT5hdmN0eC0+Yml0X3JhdGUpICsgZnJhbWVfYml0cypmcmFtZV9zaXplKjE2OworICAgIHJhdGUgKj0gcy0+bGFtYmRhOworICAgIHJhdGUgLz0gcy0+YXZjdHgtPnNhbXBsZV9yYXRlL2ZyYW1lX3NpemU7CisKKyAgICBmX291dC0+ZnJhbWViaXRzID0gbHJpbnRmKHJhdGUpOworICAgIGZfb3V0LT5mcmFtZWJpdHMgPSBGRk1JTihmX291dC0+ZnJhbWViaXRzLCBPUFVTX01BWF9QQUNLRVRfU0laRSo4KTsKKyAgICBmX291dC0+ZnJhbWViaXRzID0gRkZBTElHTihmX291dC0+ZnJhbWViaXRzLCA4KTsKK30KKworc3RhdGljIGludCBiYW5kc19kaXN0KE9wdXNQc3lDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmYsIGZsb2F0ICp0b3RhbF9kaXN0KQoreworICAgIGludCBpLCB0ZGlzdCA9IDAuMGY7CisgICAgT3B1c1JhbmdlQ29kZXIgZHVtcDsKKworICAgIGZmX29wdXNfcmNfZW5jX2luaXQoJmR1bXApOworICAgIGZmX2NlbHRfYml0YWxsb2MoZiwgJmR1bXAsIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspIHsKKyAgICAgICAgZmxvYXQgYml0cyA9IDAuMGY7CisgICAgICAgIGZsb2F0IGRpc3QgPSBwdnFfYmFuZF9jb3N0KGYtPnB2cSwgZiwgJmR1bXAsIGksICZiaXRzLCBzLT5sYW1iZGEpOworICAgICAgICB0ZGlzdCArPSBkaXN0OworICAgIH0KKworICAgICp0b3RhbF9kaXN0ID0gdGRpc3Q7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2VsdF9zZWFyY2hfZm9yX2R1YWxfc3RlcmVvKE9wdXNQc3lDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmYpCit7CisgICAgZmxvYXQgdGQxLCB0ZDI7CisgICAgZi0+ZHVhbF9zdGVyZW8gPSAwOworCisgICAgaWYgKHMtPmF2Y3R4LT5jaGFubmVscyA8IDIpCisgICAgICAgIHJldHVybjsKKworICAgIGJhbmRzX2Rpc3QocywgZiwgJnRkMSk7CisgICAgZi0+ZHVhbF9zdGVyZW8gPSAxOworICAgIGJhbmRzX2Rpc3QocywgZiwgJnRkMik7CisKKyAgICBmLT5kdWFsX3N0ZXJlbyA9IHRkMiA8IHRkMTsKKyAgICBzLT5kdWFsX3N0ZXJlb191c2VkICs9IHRkMiA8IHRkMTsKK30KKworc3RhdGljIHZvaWQgY2VsdF9zZWFyY2hfZm9yX2ludGVuc2l0eShPcHVzUHN5Q29udGV4dCAqcywgQ2VsdEZyYW1lICpmKQoreworICAgIGludCBpLCBiZXN0X2JhbmQgPSBDRUxUX01BWF9CQU5EUyAtIDE7CisgICAgZmxvYXQgZGlzdCwgYmVzdF9kaXN0ID0gRkxUX01BWDsKKyAgICAvKiBUT0RPOiBmaXgsIG1ha2Ugc29tZSBoZXVyaXN0aWMgdXAgaGVyZSB1c2luZyB0aGUgbGFtYmRhIHZhbHVlICovCisgICAgZmxvYXQgZW5kX2JhbmQgPSAwOworCisgICAgaWYgKHMtPmF2Y3R4LT5jaGFubmVscyA8IDIpCisgICAgICAgIHJldHVybjsKKworICAgIGZvciAoaSA9IGYtPmVuZF9iYW5kOyBpID49IGVuZF9iYW5kOyBpLS0pIHsKKyAgICAgICAgZi0+aW50ZW5zaXR5X3N0ZXJlbyA9IGk7CisgICAgICAgIGJhbmRzX2Rpc3QocywgZiwgJmRpc3QpOworICAgICAgICBpZiAoYmVzdF9kaXN0ID4gZGlzdCkgeworICAgICAgICAgICAgYmVzdF9kaXN0ID0gZGlzdDsKKyAgICAgICAgICAgIGJlc3RfYmFuZCA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmLT5pbnRlbnNpdHlfc3RlcmVvID0gYmVzdF9iYW5kOworICAgIHMtPmF2Z19pc19iYW5kID0gKHMtPmF2Z19pc19iYW5kICsgZi0+aW50ZW5zaXR5X3N0ZXJlbykvMi4wZjsKK30KKworc3RhdGljIGludCBjZWx0X3NlYXJjaF9mb3JfdGYoT3B1c1BzeUNvbnRleHQgKnMsIE9wdXNQc3lTdGVwICoqc3RhcnQsIENlbHRGcmFtZSAqZikKK3sKKyAgICBpbnQgaSwgaiwgaywgY3dheSwgY29uZmlnWzJdW0NFTFRfTUFYX0JBTkRTXSA9IHsgeyAwIH0gfTsKKyAgICBmbG9hdCBzY29yZVsyXSA9IHsgMCB9OworCisgICAgZm9yIChjd2F5ID0gMDsgY3dheSA8IDI7IGN3YXkrKykgeworICAgICAgICBpbnQgbWFnWzJdOworICAgICAgICBpbnQgYmFzZSA9IGYtPnRyYW5zaWVudCA/IDEyMCA6IDk2MDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYyA9IGZmX2NlbHRfdGZfc2VsZWN0W2YtPnNpemVdW2YtPnRyYW5zaWVudF1bY3dheV1baV07CisgICAgICAgICAgICBtYWdbaV0gPSBjIDwgMCA/IGJhc2UgPj4gRkZBQlMoYykgOiBiYXNlIDw8IEZGQUJTKGMpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGlzY29yZTAgPSAwLjBmOworICAgICAgICAgICAgZmxvYXQgaXNjb3JlMSA9IDAuMGY7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgKDEgPDwgZi0+c2l6ZSk7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBpc2NvcmUwICs9IHN0YXJ0W2pdLT50b25lW2tdW2ldKnN0YXJ0W2pdLT5jaGFuZ2VfYW1wW2tdW2ldL21hZ1swXTsKKyAgICAgICAgICAgICAgICAgICAgaXNjb3JlMSArPSBzdGFydFtqXS0+dG9uZVtrXVtpXSpzdGFydFtqXS0+Y2hhbmdlX2FtcFtrXVtpXS9tYWdbMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlnW2N3YXldW2ldID0gRkZBQlMoaXNjb3JlMCAtIDEuMGYpIDwgRkZBQlMoaXNjb3JlMSAtIDEuMGYpOworICAgICAgICAgICAgc2NvcmVbY3dheV0gKz0gY29uZmlnW2N3YXldW2ldID8gaXNjb3JlMSA6IGlzY29yZTA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmLT50Zl9zZWxlY3QgPSBzY29yZVswXSA8IHNjb3JlWzFdOworICAgIG1lbWNweShmLT50Zl9jaGFuZ2UsIGNvbmZpZ1tmLT50Zl9zZWxlY3RdLCBzaXplb2YoaW50KSpDRUxUX01BWF9CQU5EUyk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX29wdXNfcHN5X2NlbHRfZnJhbWVfcHJvY2VzcyhPcHVzUHN5Q29udGV4dCAqcywgQ2VsdEZyYW1lICpmLCBpbnQgaW5kZXgpCit7CisgICAgaW50IHN0YXJ0X3RyYW5zaWVudF9mbGFnID0gZi0+dHJhbnNpZW50OworICAgIE9wdXNQc3lTdGVwICoqc3RhcnQgPSAmcy0+c3RlcHNbaW5kZXggKiAoMSA8PCBzLT5wLmZyYW1lc2l6ZSldOworCisgICAgaWYgKGYtPnNpbGVuY2UpCisgICAgICAgIHJldHVybiAwOworCisgICAgY2VsdF9nYXVnZV9wc3lfd2VpZ2h0KHMsIHN0YXJ0LCBmKTsKKyAgICBjZWx0X3NlYXJjaF9mb3JfaW50ZW5zaXR5KHMsIGYpOworICAgIGNlbHRfc2VhcmNoX2Zvcl9kdWFsX3N0ZXJlbyhzLCBmKTsKKyAgICBjZWx0X3NlYXJjaF9mb3JfdGYocywgc3RhcnQsIGYpOworCisgICAgaWYgKGYtPnRyYW5zaWVudCAhPSBzdGFydF90cmFuc2llbnRfZmxhZykgeworICAgICAgICBmLT5ibG9ja3MgPSBmLT50cmFuc2llbnQgPyBPUFVTX0JMT0NLX1NJWkUocy0+cC5mcmFtZXNpemUpL0NFTFRfT1ZFUkxBUCA6IDE7CisgICAgICAgIHMtPnJlZG9fYW5hbHlzaXMgPSAxOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzLT5yZWRvX2FuYWx5c2lzID0gMDsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX29wdXNfcHN5X3Bvc3RlbmNvZGVfdXBkYXRlKE9wdXNQc3lDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmYsIE9wdXNSYW5nZUNvZGVyICpyYykKK3sKKyAgICBpbnQgaSwgZnJhbWVfc2l6ZSA9IE9QVVNfQkxPQ0tfU0laRShzLT5wLmZyYW1lc2l6ZSk7CisgICAgaW50IHN0ZXBzX291dCA9IHMtPnAuZnJhbWVzKihmcmFtZV9zaXplLzEyMCk7CisgICAgdm9pZCAqdG1wW0ZGX0JVRlFVRVVFX1NJWkVdOworICAgIGZsb2F0IGlkZWFsX2ZiaXRzOworCisgICAgZm9yIChpID0gMDsgaSA8IHN0ZXBzX291dDsgaSsrKQorICAgICAgICBtZW1zZXQocy0+c3RlcHNbaV0sIDAsIHNpemVvZihPcHVzUHN5U3RlcCkpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm1heF9zdGVwczsgaSsrKQorICAgICAgICB0bXBbaV0gPSBzLT5zdGVwc1tpXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYXhfc3RlcHM7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgaV9uZXcgPSBpIC0gc3RlcHNfb3V0OworICAgICAgICBzLT5zdGVwc1tpX25ldyA8IDAgPyBzLT5tYXhfc3RlcHMgKyBpX25ldyA6IGlfbmV3XSA9IHRtcFtpXTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSBzdGVwc19vdXQ7IGkgPCBzLT5idWZmZXJlZF9zdGVwczsgaSsrKQorICAgICAgICBzLT5zdGVwc1tpXS0+aW5kZXggLT0gc3RlcHNfb3V0OworCisgICAgaWRlYWxfZmJpdHMgPSBzLT5hdmN0eC0+Yml0X3JhdGUvKHMtPmF2Y3R4LT5zYW1wbGVfcmF0ZS9mcmFtZV9zaXplKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5wLmZyYW1lczsgaSsrKSB7CisgICAgICAgIHMtPmF2Z19pc19iYW5kICs9IGZbaV0uaW50ZW5zaXR5X3N0ZXJlbzsKKyAgICAgICAgcy0+bGFtYmRhICo9IGlkZWFsX2ZiaXRzIC8gZltpXS5mcmFtZWJpdHM7CisgICAgfQorCisgICAgcy0+YXZnX2lzX2JhbmQgLz0gKHMtPnAuZnJhbWVzICsgMSk7CisKKyAgICBzLT5jc19udW0gPSAwOworICAgIHMtPnN0ZXBzX3RvX3Byb2Nlc3MgPSAwOworICAgIHMtPmJ1ZmZlcmVkX3N0ZXBzIC09IHN0ZXBzX291dDsKKyAgICBzLT50b3RhbF9wYWNrZXRzX291dCArPSBzLT5wLmZyYW1lczsKKyAgICBzLT5pbmZsZWN0aW9uX3BvaW50c19jb3VudCA9IDA7Cit9CisKK2F2X2NvbGQgaW50IGZmX29wdXNfcHN5X2luaXQoT3B1c1BzeUNvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEZGQnVmUXVldWUgKmJ1ZnF1ZXVlLCBPcHVzRW5jT3B0aW9ucyAqb3B0aW9ucykKK3sKKyAgICBpbnQgaSwgY2gsIHJldDsKKworICAgIHMtPnJlZG9fYW5hbHlzaXMgPSAwOworICAgIHMtPmxhbWJkYSA9IDEuMGY7CisgICAgcy0+b3B0aW9ucyA9IG9wdGlvbnM7CisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBzLT5idWZxdWV1ZSA9IGJ1ZnF1ZXVlOworICAgIHMtPm1heF9zdGVwcyA9IGNlaWxmKHMtPm9wdGlvbnMtPm1heF9kZWxheV9tcy8yLjVmKTsKKyAgICBzLT5ic2l6ZV9hbmFseXNpcyA9IENFTFRfQkxPQ0tfOTYwOworICAgIHMtPmF2Z19pc19iYW5kID0gQ0VMVF9NQVhfQkFORFMgLSAxOworICAgIHMtPmluZmxlY3Rpb25fcG9pbnRzX2NvdW50ID0gMDsKKworICAgIHMtPmluZmxlY3Rpb25fcG9pbnRzID0gYXZfbWFsbG9jeihzaXplb2YoKnMtPmluZmxlY3Rpb25fcG9pbnRzKSpzLT5tYXhfc3RlcHMpOworICAgIGlmICghcy0+aW5mbGVjdGlvbl9wb2ludHMpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcy0+ZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIXMtPmRzcCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IENFTFRfTUFYX0JBTkRTOyBpKyspIHsKKyAgICAgICAgICAgIGJlc3NlbF9pbml0KCZzLT5iZmlsdGVyX2hpW2NoXVtpXSwgMS4wZiwgMTkuMGYsIDEwMC4wZiwgMSk7CisgICAgICAgICAgICBiZXNzZWxfaW5pdCgmcy0+YmZpbHRlcl9sb1tjaF1baV0sIDEuMGYsIDIwLjBmLCAxMDAuMGYsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm1heF9zdGVwczsgaSsrKSB7CisgICAgICAgIHMtPnN0ZXBzW2ldID0gYXZfbWFsbG9jeihzaXplb2YoT3B1c1BzeVN0ZXApKTsKKyAgICAgICAgaWYgKCFzLT5zdGVwc1tpXSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IENFTFRfQkxPQ0tfTkI7IGkrKykgeworICAgICAgICBmbG9hdCB0bXA7CisgICAgICAgIGNvbnN0IGludCBsZW4gPSBPUFVTX0JMT0NLX1NJWkUoaSk7CisgICAgICAgIHMtPndpbmRvd1tpXSA9IGF2X21hbGxvYygyKmxlbipzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgaWYgKCFzLT53aW5kb3dbaV0pIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0ZV93aW5kb3dfZnVuYyhzLT53aW5kb3dbaV0sIDIqbGVuLCBXRlVOQ19TSU5FLCAmdG1wKTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9tZGN0MTVfaW5pdCgmcy0+bWRjdFtpXSwgMCwgaSArIDMsIDY4IDw8IChDRUxUX0JMT0NLX05CIC0gMSAtIGkpKSkpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfZnJlZXAoJnMtPmluZmxlY3Rpb25fcG9pbnRzKTsKKyAgICBhdl9mcmVlcCgmcy0+ZHNwKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRUxUX0JMT0NLX05COyBpKyspIHsKKyAgICAgICAgZmZfbWRjdDE1X3VuaW5pdCgmcy0+bWRjdFtpXSk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT53aW5kb3dbaV0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYXhfc3RlcHM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJnMtPnN0ZXBzW2ldKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmZfb3B1c19wc3lfc2lnbmFsX2VvZihPcHVzUHN5Q29udGV4dCAqcykKK3sKKyAgICBzLT5lb2YgPSAxOworfQorCithdl9jb2xkIGludCBmZl9vcHVzX3BzeV9lbmQoT3B1c1BzeUNvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKKyAgICBhdl9mcmVlcCgmcy0+aW5mbGVjdGlvbl9wb2ludHMpOworICAgIGF2X2ZyZWVwKCZzLT5kc3ApOworCisgICAgZm9yIChpID0gMDsgaSA8IENFTFRfQkxPQ0tfTkI7IGkrKykgeworICAgICAgICBmZl9tZGN0MTVfdW5pbml0KCZzLT5tZGN0W2ldKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPndpbmRvd1tpXSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm1heF9zdGVwczsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmcy0+c3RlcHNbaV0pOworCisgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfSU5GTywgIkF2ZXJhZ2UgSW50ZW5zaXR5IFN0ZXJlbyBiYW5kOiAlMC4xZlxuIiwgcy0+YXZnX2lzX2JhbmQpOworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJEdWFsIFN0ZXJlbyB1c2VkOiAlMC4yZiUlXG4iLCAoKGZsb2F0KXMtPmR1YWxfc3RlcmVvX3VzZWQvcy0+dG90YWxfcGFja2V0c19vdXQpKjEwMC4wZik7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvb3B1c2VuY19wc3kuaCBiL2xpYmF2Y29kZWMvb3B1c2VuY19wc3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFlNGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9vcHVzZW5jX3BzeS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogT3B1cyBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUm9zdGlzbGF2IFBlaGxpdmFub3YgPGF0b21udWtlckBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19PUFVTRU5DX1BTWV9ICisjZGVmaW5lIEFWQ09ERUNfT1BVU0VOQ19QU1lfSAorCisjaW5jbHVkZSAib3B1c2VuYy5oIgorI2luY2x1ZGUgIm9wdXNlbmNfdXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci93aW5kb3dfZnVuYy5oIgorCisvKiBFYWNoIHN0ZXAgaXMgMi41bXMgKi8KK3R5cGVkZWYgc3RydWN0IE9wdXNQc3lTdGVwIHsKKyAgICBpbnQgICBpbmRleDsgLyogQ3VycmVudCBpbmRleCAqLworICAgIGludCAgIHNpbGVuY2U7CisgICAgZmxvYXQgZW5lcmd5W09QVVNfTUFYX0NIQU5ORUxTXVtDRUxUX01BWF9CQU5EU107IC8qIE1hc2tpbmcgZWZmZWN0cyBpbmNsdWRlZCAqLworICAgIGZsb2F0IHRvbmVbT1BVU19NQVhfQ0hBTk5FTFNdW0NFTFRfTUFYX0JBTkRTXTsgICAvKiBUb25hbGl0eSAqLworICAgIGZsb2F0IHN0ZXJlb1tDRUxUX01BWF9CQU5EU107ICAgICAgICAgICAgICAgICAgICAvKiBJUy9NUyBjb21wYXRpYmlsaXR5ICovCisgICAgZmxvYXQgY2hhbmdlX2FtcFtPUFVTX01BWF9DSEFOTkVMU11bQ0VMVF9NQVhfQkFORFNdOyAvKiBKdW1wIG92ZXIgbGFzdCBmcmFtZSAqLworICAgIGZsb2F0IHRvdGFsX2NoYW5nZTsgLyogVG90YWwgY2hhbmdlICovCisKKyAgICBmbG9hdCAqYmFuZHNbT1BVU19NQVhfQ0hBTk5FTFNdW0NFTFRfTUFYX0JBTkRTXTsKKyAgICBmbG9hdCBjb2VmZnNbT1BVU19NQVhfQ0hBTk5FTFNdW09QVVNfQkxPQ0tfU0laRShDRUxUX0JMT0NLXzk2MCldOworfSBPcHVzUHN5U3RlcDsKKwordHlwZWRlZiBzdHJ1Y3QgT3B1c0JhbmRFeGNpdGF0aW9uIHsKKyAgICBmbG9hdCBleGNpdGF0aW9uOworICAgIGZsb2F0IGV4Y2l0YXRpb25fZGlzdDsKKyAgICBmbG9hdCBleGNpdGF0aW9uX2luaXQ7Cit9IE9wdXNCYW5kRXhjaXRhdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgUHN5Q2hhaW4geworICAgIGludCBzdGFydDsKKyAgICBpbnQgZW5kOworfSBQc3lDaGFpbjsKKwordHlwZWRlZiBzdHJ1Y3QgT3B1c1BzeUNvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZHNwOworICAgIHN0cnVjdCBGRkJ1ZlF1ZXVlICpidWZxdWV1ZTsKKyAgICBPcHVzRW5jT3B0aW9ucyAqb3B0aW9uczsKKworICAgIFBzeUNoYWluIGNzWzEyOF07CisgICAgaW50IGNzX251bTsKKworICAgIE9wdXNCYW5kRXhjaXRhdGlvbiBleFtPUFVTX01BWF9DSEFOTkVMU11bQ0VMVF9NQVhfQkFORFNdOworICAgIEZGQmVzc2VsRmlsdGVyIGJmaWx0ZXJfbG9bT1BVU19NQVhfQ0hBTk5FTFNdW0NFTFRfTUFYX0JBTkRTXTsKKyAgICBGRkJlc3NlbEZpbHRlciBiZmlsdGVyX2hpW09QVVNfTUFYX0NIQU5ORUxTXVtDRUxUX01BWF9CQU5EU107CisKKyAgICBPcHVzUHN5U3RlcCAqc3RlcHNbRkZfQlVGUVVFVUVfU0laRSArIDFdOworICAgIGludCBtYXhfc3RlcHM7CisKKyAgICBmbG9hdCAqd2luZG93W0NFTFRfQkxPQ0tfTkJdOworICAgIE1EQ1QxNUNvbnRleHQgKm1kY3RbQ0VMVF9CTE9DS19OQl07CisgICAgaW50IGJzaXplX2FuYWx5c2lzOworCisgICAgREVDTEFSRV9BTElHTkVEKDMyLCBmbG9hdCwgc2NyYXRjaClbMjA0OF07CisKKyAgICAvKiBTdGF0cyAqLworICAgIGZsb2F0IHJjX3dhc3RlOworICAgIGZsb2F0IGF2Z19pc19iYW5kOworICAgIGludDY0X3QgZHVhbF9zdGVyZW9fdXNlZDsKKyAgICBpbnQ2NF90IHRvdGFsX3BhY2tldHNfb3V0OworCisgICAgLyogU3RhdGUgKi8KKyAgICBGRkJlc3NlbEZpbHRlciBsYW1iZGFfbHA7CisgICAgT3B1c1BhY2tldEluZm8gcDsKKyAgICBpbnQgcmVkb19hbmFseXNpczsKKyAgICBpbnQgYnVmZmVyZWRfc3RlcHM7CisgICAgaW50IHN0ZXBzX3RvX3Byb2Nlc3M7CisgICAgaW50IGVvZjsKKyAgICBmbG9hdCBsYW1iZGE7CisgICAgaW50ICppbmZsZWN0aW9uX3BvaW50czsKKyAgICBpbnQgaW5mbGVjdGlvbl9wb2ludHNfY291bnQ7Cit9IE9wdXNQc3lDb250ZXh0OworCitpbnQgIGZmX29wdXNfcHN5X3Byb2Nlc3MgICAgICAgICAgIChPcHVzUHN5Q29udGV4dCAqcywgT3B1c1BhY2tldEluZm8gKnApOwordm9pZCBmZl9vcHVzX3BzeV9jZWx0X2ZyYW1lX2luaXQgICAoT3B1c1BzeUNvbnRleHQgKnMsIENlbHRGcmFtZSAqZiwgaW50IGluZGV4KTsKK2ludCAgZmZfb3B1c19wc3lfY2VsdF9mcmFtZV9wcm9jZXNzKE9wdXNQc3lDb250ZXh0ICpzLCBDZWx0RnJhbWUgKmYsIGludCBpbmRleCk7Cit2b2lkIGZmX29wdXNfcHN5X3Bvc3RlbmNvZGVfdXBkYXRlIChPcHVzUHN5Q29udGV4dCAqcywgQ2VsdEZyYW1lICpmLCBPcHVzUmFuZ2VDb2RlciAqcmMpOworCitpbnQgIGZmX29wdXNfcHN5X2luaXQoT3B1c1BzeUNvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRkZCdWZRdWV1ZSAqYnVmcXVldWUsIE9wdXNFbmNPcHRpb25zICpvcHRpb25zKTsKK3ZvaWQgZmZfb3B1c19wc3lfc2lnbmFsX2VvZihPcHVzUHN5Q29udGV4dCAqcyk7CitpbnQgIGZmX29wdXNfcHN5X2VuZChPcHVzUHN5Q29udGV4dCAqcyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX09QVVNFTkNfUFNZX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvb3B1c2VuY191dGlscy5oIGIvbGliYXZjb2RlYy9vcHVzZW5jX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4MmUxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvb3B1c2VuY191dGlscy5oCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBPcHVzIGVuY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX09QVVNFTkNfVVRJTFNfSAorI2RlZmluZSBBVkNPREVDX09QVVNFTkNfVVRJTFNfSAorCisjaW5jbHVkZSAib3B1cy5oIgorCit0eXBlZGVmIHN0cnVjdCBGRkJlc3NlbEZpbHRlciB7CisgICAgZmxvYXQgYVszXTsKKyAgICBmbG9hdCBiWzJdOworICAgIGZsb2F0IHhbM107CisgICAgZmxvYXQgeVszXTsKK30gRkZCZXNzZWxGaWx0ZXI7CisKKy8qIEZpbGxzIHRoZSBjb2VmZmljaWVudHMsIHJldHVybnMgMSBpZiBmaWx0ZXIgd2lsbCBiZSB1bnN0YWJsZSAqLworc3RhdGljIGlubGluZSBpbnQgYmVzc2VsX3JlaW5pdChGRkJlc3NlbEZpbHRlciAqcywgZmxvYXQgbiwgZmxvYXQgZjAsIGZsb2F0IGZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlnaHBhc3MpCit7CisgICAgaW50IHVuc3RhYmxlOworICAgIGZsb2F0IGMsIGNmcmVxLCB3MCwgazEsIGsyOworCisgICAgaWYgKCFoaWdocGFzcykgeworICAgICAgICBjID0gKDEuMGYvc3FydGYoc3FydGYocG93KDIuMGYsIDEuMGYvbikgLSAzLjBmLzQuMGYpIC0gMC41ZikpL3NxcnRmKDMuMGYpOworICAgICAgICBjZnJlcSA9IGMqZjAvZnM7CisgICAgICAgIHVuc3RhYmxlID0gKGNmcmVxIDw9IDAuMGYgfHwgY2ZyZXEgPj0gMS4wZi80LjBmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjID0gc3FydGYoMy4wZikqc3FydGYoc3FydGYocG93KDIuMGYsIDEuMGYvbikgLSAzLjBmLzQuMGYpIC0gMC41Zik7CisgICAgICAgIGNmcmVxID0gMC41ZiAtIGMqZjAvZnM7CisgICAgICAgIHVuc3RhYmxlID0gKGNmcmVxIDw9IDMuMGYvOC4wZiB8fCBjZnJlcSA+PSAxLjBmLzIuMGYpOworICAgIH0KKworICAgIHcwID0gdGFuZihNX1BJKmNmcmVxKTsKKyAgICBrMSA9IDMuMGYgKiB3MDsKKyAgICBrMiA9IDMuMGYgKiB3MDsKKworICAgIHMtPmFbMF0gPSBrMi8oMS4wZiArIGsxICsgazIpOworICAgIHMtPmFbMV0gPSAyLjBmICogcy0+YVswXTsKKyAgICBzLT5hWzJdID0gcy0+YVswXTsKKyAgICBzLT5iWzBdID0gMi4wZiAqIHMtPmFbMF0gKiAoMS4wZi9rMiAtIDEuMGYpOworICAgIHMtPmJbMV0gPSAxLjBmIC0gKHMtPmFbMF0gKyBzLT5hWzFdICsgcy0+YVsyXSArIHMtPmJbMF0pOworCisgICAgaWYgKGhpZ2hwYXNzKSB7CisgICAgICAgIHMtPmFbMV0gKj0gLTE7CisgICAgICAgIHMtPmJbMF0gKj0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHVuc3RhYmxlOworfQorCitzdGF0aWMgaW5saW5lIGludCBiZXNzZWxfaW5pdChGRkJlc3NlbEZpbHRlciAqcywgZmxvYXQgbiwgZmxvYXQgZjAsIGZsb2F0IGZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpZ2hwYXNzKQoreworICAgIG1lbXNldChzLCAwLCBzaXplb2YoRkZCZXNzZWxGaWx0ZXIpKTsKKyAgICByZXR1cm4gYmVzc2VsX3JlaW5pdChzLCBuLCBmMCwgZnMsIGhpZ2hwYXNzKTsKK30KKworc3RhdGljIGlubGluZSBmbG9hdCBiZXNzZWxfZmlsdGVyKEZGQmVzc2VsRmlsdGVyICpzLCBmbG9hdCB4KQoreworICAgIHMtPnhbMl0gPSBzLT54WzFdOworICAgIHMtPnhbMV0gPSBzLT54WzBdOworICAgIHMtPnhbMF0gPSB4OworICAgIHMtPnlbMl0gPSBzLT55WzFdOworICAgIHMtPnlbMV0gPSBzLT55WzBdOworICAgIHMtPnlbMF0gPSBzLT5hWzBdKnMtPnhbMF0gKyBzLT5hWzFdKnMtPnhbMV0gKyBzLT5hWzJdKnMtPnhbMl0gKyBzLT5iWzBdKnMtPnlbMV0gKyBzLT5iWzFdKnMtPnlbMl07CisgICAgcmV0dXJuIHMtPnlbMF07Cit9CisKKyNlbmRpZiAvKiBBVkNPREVDX09QVVNFTkNfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9vcHVzdGFiLmMgYi9saWJhdmNvZGVjL29wdXN0YWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjM0MGUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9vcHVzdGFiLmMKQEAgLTAsMCArMSwxMTU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIEFuZHJldyBEJ0FkZGVzaW8KKyAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IE1vemlsbGEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm9wdXN0YWIuaCIKKworY29uc3QgdWludDhfdCBmZl9vcHVzX2RlZmF1bHRfY291cGxlZF9zdHJlYW1zW10gPSB7IDAsIDEsIDEsIDIsIDIsIDIsIDIsIDMgfTsKKworY29uc3QgdWludDhfdCBmZl9jZWx0X2JhbmRfZW5kW10gPSB7IDEzLCAxNywgMTcsIDE5LCAyMSB9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3N0ZXJlb19zMVtdID0geworICAgIDI1NiwgICA3LCAgIDksICAxMCwgIDExLCAgMTIsICAyMiwgIDQ2LCAgNTQsICA1NSwgIDU2LCAgNTksICA4MiwgMTc0LCAxOTcsIDIwMCwKKyAgICAyMDEsIDIwMiwgMjEwLCAyMzQsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ5LCAyNTYKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfc3RlcmVvX3MyW10gPSB7MjU2LCA4NSwgMTcxLCAyNTZ9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3N0ZXJlb19zM1tdID0gezI1NiwgNTEsIDEwMiwgMTU0LCAyMDUsIDI1Nn07CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbWlkX29ubHlbXSA9IHsyNTYsIDE5MiwgMjU2fTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9mcmFtZV90eXBlX2luYWN0aXZlW10gPSB7MjU2LCAyNiwgMjU2fTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9mcmFtZV90eXBlX2FjdGl2ZVtdID0gezI1NiwgMjQsIDk4LCAyNDYsIDI1Nn07CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfZ2Fpbl9oaWdoYml0c1szXVs5XSA9IHsKKyAgICB7MjU2LCAgMzIsIDE0NCwgMjEyLCAyNDEsIDI1MywgMjU0LCAyNTUsIDI1Nn0sCisgICAgezI1NiwgICAyLCAgMTksICA2NCwgMTI0LCAxODYsIDIzMywgMjUyLCAyNTZ9LAorICAgIHsyNTYsICAgMSwgICA0LCAgMzAsIDEwMSwgMTk1LCAyNDUsIDI1NCwgMjU2fQorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9nYWluX2xvd2JpdHNbXSA9IHsyNTYsIDMyLCA2NCwgOTYsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2fTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9nYWluX2RlbHRhW10gPSB7CisgICAgMjU2LCAgIDYsICAxMSwgIDIyLCAgNTMsIDE4NSwgMjA2LCAyMTQsIDIxOCwgMjIxLCAyMjMsIDIyNSwgMjI3LCAyMjgsIDIyOSwgMjMwLAorICAgIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwKKyAgICAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYKK307Citjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX2xzZl9zMVsyXVsyXVszM10gPSB7CisgICAgeworICAgICAgICB7ICAgIC8vIE5CIG9yIE1CLCB1bnZvaWNlZAorICAgICAgICAgICAgMjU2LCAgNDQsICA3OCwgMTA4LCAxMjcsIDE0OCwgMTYwLCAxNzEsIDE3NCwgMTc3LCAxNzksIDE5NSwgMTk3LCAxOTksIDIwMCwgMjA1LAorICAgICAgICAgICAgMjA3LCAyMDgsIDIxMSwgMjE0LCAyMTUsIDIxNiwgMjE4LCAyMjAsIDIyMiwgMjI1LCAyMjYsIDIzNSwgMjQ0LCAyNDYsIDI1MywgMjU1LCAyNTYKKyAgICAgICAgfSwgeyAvLyBOQiBvciBNQiwgdm9pY2VkCisgICAgICAgICAgICAyNTYsICAgMSwgIDExLCAgMTIsICAyMCwgIDIzLCAgMzEsICAzOSwgIDUzLCAgNjYsICA4MCwgIDgxLCAgOTUsIDEwNywgMTIwLCAxMzEsCisgICAgICAgICAgICAxNDIsIDE1NCwgMTY1LCAxNzUsIDE4NSwgMTk2LCAyMDQsIDIxMywgMjIxLCAyMjgsIDIzNiwgMjM3LCAyMzgsIDI0NCwgMjQ1LCAyNTEsIDI1NgorICAgICAgICB9CisgICAgfSwgeworICAgICAgICB7ICAgIC8vIFdCLCB1bnZvaWNlZAorICAgICAgICAgICAgMjU2LCAgMzEsICA1MiwgIDU1LCAgNzIsICA3MywgIDgxLCAgOTgsIDEwMiwgMTAzLCAxMjEsIDEzNywgMTQxLCAxNDMsIDE0NiwgMTQ3LAorICAgICAgICAgICAgMTU3LCAxNTgsIDE2MSwgMTc3LCAxODgsIDIwNCwgMjA2LCAyMDgsIDIxMSwgMjEzLCAyMjQsIDIyNSwgMjI5LCAyMzgsIDI0NiwgMjUzLCAyNTYKKyAgICAgICAgfSwgeyAvLyBXQiwgdm9pY2VkCisgICAgICAgICAgICAyNTYsICAgMSwgICA1LCAgMjEsICAyNiwgIDQ0LCAgNTUsICA2MCwgIDc0LCAgODksICA5MCwgIDkzLCAxMDUsIDExOCwgMTMyLCAxNDYsCisgICAgICAgICAgICAxNTIsIDE2NiwgMTc4LCAxODAsIDE4NiwgMTg3LCAxOTksIDIxMSwgMjIyLCAyMzIsIDIzNSwgMjQ1LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NgorICAgICAgICB9CisgICAgfQorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sc2ZfczJbMzJdWzEwXSA9IHsKKyAgICAvLyBOQiwgTUIKKyAgICB7IDI1NiwgICAxLCAgIDIsICAgMywgIDE4LCAyNDIsIDI1MywgMjU0LCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgMiwgICA0LCAgMzgsIDIyMSwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICAyLCAgIDYsICA0OCwgMTk3LCAyNTIsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDIsICAxMCwgIDYyLCAxODUsIDI0NiwgMjU0LCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgNCwgIDIwLCAgNzMsIDE3NCwgMjQ4LCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICA0LCAgMjEsICA3NiwgMTY2LCAyMzksIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDgsICAzMiwgIDg1LCAxNTksIDIyNiwgMjUyLCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgMiwgIDIwLCAgODMsIDE2MSwgMjE5LCAyNDksIDI1NSwgMjU2IH0sCisKKyAgICAvLyBXQgorICAgIHsgMjU2LCAgIDEsICAgMiwgICAzLCAgMTIsIDI0NCwgMjUzLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICAyLCAgIDQsICAzMiwgMjE4LCAyNTMsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDIsICAgNSwgIDQ3LCAxOTksIDI1MiwgMjU0LCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgMiwgIDEyLCAgNjEsIDE4NywgMjUyLCAyNTQsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICA1LCAgMjQsICA3MiwgMTcyLCAyNDksIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDIsICAxNiwgIDcwLCAxNzAsIDI0MiwgMjU0LCAyNTUsIDI1NiB9LAorICAgIHsgMjU2LCAgIDEsICAgMiwgIDE3LCAgNzgsIDE2NSwgMjI2LCAyNTEsIDI1NSwgMjU2IH0sCisgICAgeyAyNTYsICAgMSwgICA4LCAgMjksICA3OSwgMTU2LCAyMzcsIDI1NCwgMjU1LCAyNTYgfQorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sc2ZfczJfZXh0W10gPSB7IDI1NiwgMTU2LCAyMTYsIDI0MCwgMjQ5LCAyNTMsIDI1NSwgMjU2IH07CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbHNmX2ludGVycG9sYXRpb25fb2Zmc2V0W10gPSB7IDI1NiwgMTMsIDM1LCA2NCwgNzUsIDI1NiB9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2hpZ2hiaXRzW10gPSB7CisgICAgMjU2LCAgIDMsICAgNiwgIDEyLCAgMjMsICA0NCwgIDc0LCAxMDYsIDEyNSwgMTM2LCAxNDYsIDE1OCwgMTcxLCAxODQsIDE5NiwgMjA3LAorICAgIDIxNiwgMjI0LCAyMzEsIDIzNywgMjQxLCAyNDMsIDI0NSwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTEsIDI1MiwgMjUzLCAyNTQsIDI1NSwgMjU2Cit9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfbmJbXSA9IHsgMjU2LCA2NCwgMTI4LCAxOTIsIDI1NiB9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfbWJbXSA9IHsgMjU2LCA0MywgODUsIDEyOCwgMTcxLCAyMTMsIDI1NiB9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfd2JbXSA9IHsgMjU2LCAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiB9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2RlbHRhW10gPSB7CisgICAgMjU2LCAgNDYsICA0OCwgIDUwLCAgNTMsICA1NywgIDYzLCAgNzMsICA4OCwgMTE0LCAxNTIsIDE4MiwgMjA0LCAyMTksIDIyOSwgMjM2LAorICAgIDI0MiwgMjQ2LCAyNTAsIDI1MiwgMjU0LCAyNTYKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9uYjEwbXNbXSA9IHsgMjU2LCAxNDMsIDE5MywgMjU2IH07CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9uYjIwbXNbXSA9IHsKKyAgICAyNTYsICA2OCwgIDgwLCAxMDEsIDExOCwgMTM3LCAxNTksIDE4OSwgMjEzLCAyMzAsIDI0NiwgMjU2Cit9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2NvbnRvdXJfbWJ3YjEwbXNbXSA9IHsKKyAgICAyNTYsICA5MSwgMTM3LCAxNzYsIDE5NSwgMjA5LCAyMjEsIDIyOSwgMjM2LCAyNDIsIDI0NywgMjUyLCAyNTYKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9tYndiMjBtc1tdID0geworICAgIDI1NiwgIDMzLCAgNTUsICA3MywgIDg5LCAxMDQsIDExOCwgMTMyLCAxNDUsIDE1OCwgMTY4LCAxNzcsIDE4NiwgMTk0LCAyMDAsIDIwNiwKKyAgICAyMTIsIDIxNywgMjIxLCAyMjUsIDIyOSwgMjMyLCAyMzUsIDIzOCwgMjQwLCAyNDIsIDI0NCwgMjQ2LCAyNDgsIDI1MCwgMjUyLCAyNTMsCisgICAgMjU0LCAyNTUsIDI1NgorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sdHBfZmlsdGVyW10gPSB7IDI1NiwgNzcsIDE1NywgMjU2IH07CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbHRwX2ZpbHRlcjBfc2VsW10gPSB7CisgICAgMjU2LCAxODUsIDIwMCwgMjEzLCAyMjYsIDIzNSwgMjQ0LCAyNTAsIDI1NgorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sdHBfZmlsdGVyMV9zZWxbXSA9IHsKKyAgICAyNTYsICA1NywgIDkxLCAxMTIsIDEzMiwgMTQ3LCAxNjAsIDE3MiwgMTg1LCAxOTUsIDIwNSwgMjE0LCAyMjQsIDIzMywgMjQxLCAyNDgsIDI1NgorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sdHBfZmlsdGVyMl9zZWxbXSA9IHsKKyAgICAyNTYsICAxNSwgIDMxLCAgNDUsICA1NywgIDY5LCAgODEsICA5MiwgMTAzLCAxMTQsIDEyNCwgMTMzLCAxNDIsIDE1MSwgMTYwLCAxNjgsCisgICAgMTc2LCAxODQsIDE5MiwgMTk5LCAyMDYsIDIxMiwgMjE4LCAyMjMsIDIyNywgMjMyLCAyMzYsIDI0MCwgMjQ0LCAyNDcsIDI1MSwgMjU0LCAyNTYKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbHRwX3NjYWxlX2luZGV4W10gPSB7IDI1NiwgMTI4LCAxOTIsIDI1NiB9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX2xjZ19zZWVkW10gPSB7IDI1NiwgNjQsIDEyOCwgMTkyLCAyNTYgfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9leGNfcmF0ZVsyXVsxMF0gPSB7CisgICAgeyAyNTYsICAxNSwgIDY2LCAgNzgsIDEyNCwgMTY5LCAxODIsIDIxNSwgMjQyLCAyNTYgfSwgLy8gdW52b2ljZWQKKyAgICB7IDI1NiwgIDMzLCAgNjMsICA5OSwgMTE2LCAxNTAsIDE5OSwgMjE3LCAyMzgsIDI1NiB9ICAvLyB2b2ljZWQKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfcHVsc2VfY291bnRbMTFdWzE5XSA9IHsKKyAgICB7IDI1NiwgMTMxLCAyMDUsIDIzMCwgMjM4LCAyNDEsIDI0NCwgMjQ1LCAyNDYsCisgICAgICAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgIDU4LCAxNTEsIDIxMSwgMjM0LCAyNDEsIDI0NCwgMjQ1LCAyNDYsCisgICAgICAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgIDQzLCAgOTQsIDE0MCwgMTczLCAxOTcsIDIxMywgMjI0LCAyMzIsCisgICAgICAyMzgsIDI0MSwgMjQ0LCAyNDcsIDI0OSwgMjUwLCAyNTEsIDI1MywgMjU0LCAyNTYgfSwKKyAgICB7IDI1NiwgIDE3LCAgNjksIDE0MCwgMTk3LCAyMjgsIDI0MCwgMjQ1LCAyNDYsCisgICAgICAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICA2LCAgMjcsICA2OCwgMTIxLCAxNzAsIDIwNSwgMjI2LCAyMzcsCisgICAgICAyNDMsIDI0NiwgMjQ4LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICA3LCAgMjEsICA0MywgIDcxLCAxMDAsIDEyOCwgMTUzLCAxNzMsCisgICAgICAxOTAsIDIwMywgMjE0LCAyMjMsIDIzMCwgMjM1LCAyMzksIDI0MywgMjQ2LCAyNTYgfSwKKyAgICB7IDI1NiwgICAyLCAgIDcsICAyMSwgIDUwLCAgOTIsIDEzOCwgMTc5LCAyMTAsCisgICAgICAyMjksIDI0MCwgMjQ2LCAyNDksIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDMsICAgNywgIDE3LCAgMzYsICA2NSwgMTAwLCAxMzcsCisgICAgICAxNzEsIDE5OSwgMjE5LCAyMzMsIDI0MSwgMjQ2LCAyNTAsIDI1MiwgMjU0LCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDMsICAgNSwgIDEwLCAgMTksICAzMywgIDUzLCAgNzcsCisgICAgICAxMDQsIDEzMiwgMTU4LCAxODEsIDIwMSwgMjE2LCAyMjcsIDIzNSwgMjQxLCAyNTYgfSwKKyAgICB7IDI1NiwgICAxLCAgIDIsICAgMywgICA5LCAgMzYsICA5NCwgMTUwLCAxODksCisgICAgICAyMTQsIDIyOCwgMjM4LCAyNDQsIDI0NywgMjUwLCAyNTIsIDI1MywgMjU0LCAyNTYgfSwKKyAgICB7IDI1NiwgICAyLCAgIDMsICAgOSwgIDM2LCAgOTQsIDE1MCwgMTg5LCAyMTQsCisgICAgICAyMjgsIDIzOCwgMjQ0LCAyNDcsIDI1MCwgMjUyLCAyNTMsIDI1NCwgMjU2LCAyNTYgfQorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9wdWxzZV9sb2NhdGlvbls0XVsxNjhdID0geworICAgIHsKKyAgICAgICAgMjU2LCAxMjYsIDI1NiwKKyAgICAgICAgMjU2LCA1NiwgMTk4LCAyNTYsCisgICAgICAgIDI1NiwgMjUsIDEyNiwgMjMwLCAyNTYsCisgICAgICAgIDI1NiwgMTIsIDcyLCAxODAsIDI0NCwgMjU2LAorICAgICAgICAyNTYsIDcsIDQyLCAxMjYsIDIxMywgMjUwLCAyNTYsCisgICAgICAgIDI1NiwgNCwgMjQsIDgzLCAxNjksIDIzMiwgMjUzLCAyNTYsCisgICAgICAgIDI1NiwgMywgMTUsIDUzLCAxMjUsIDIwMCwgMjQyLCAyNTQsIDI1NiwKKyAgICAgICAgMjU2LCAyLCAxMCwgMzUsIDg5LCAxNjIsIDIyMSwgMjQ4LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAyLCA3LCAyNCwgNjMsIDEyNiwgMTkxLCAyMzMsIDI1MSwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgNSwgMTcsIDQ1LCA5NCwgMTU3LCAyMTEsIDI0MSwgMjUyLCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCA1LCAxMywgMzMsIDcwLCAxMjUsIDE4MiwgMjIzLCAyNDUsIDI1MywgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgNCwgMTEsIDI2LCA1NCwgOTgsIDE1MSwgMTk5LCAyMzIsIDI0OCwgMjU0LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAzLCA5LCAyMSwgNDIsIDc3LCAxMjQsIDE3MiwgMjEyLCAyMzcsIDI0OSwgMjU0LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAyLCA2LCAxNiwgMzMsIDYwLCA5NywgMTQ0LCAxODcsIDIyMCwgMjQxLCAyNTAsIDI1NCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMiwgMywgMTEsIDI1LCA0NywgODAsIDEyMCwgMTYzLCAyMDEsIDIyOSwgMjQ1LCAyNTMsIDI1NCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMiwgMywgNCwgMTcsIDM1LCA2MiwgOTgsIDEzOSwgMTgwLCAyMTQsIDIzOCwgMjUyLCAyNTMsIDI1NCwgMjU1LCAyNTYKKyAgICB9LHsKKyAgICAgICAgMjU2LCAxMjcsIDI1NiwKKyAgICAgICAgMjU2LCA1MywgMjAyLCAyNTYsCisgICAgICAgIDI1NiwgMjIsIDEyNywgMjMzLCAyNTYsCisgICAgICAgIDI1NiwgMTEsIDcyLCAxODMsIDI0NiwgMjU2LAorICAgICAgICAyNTYsIDYsIDQxLCAxMjcsIDIxNSwgMjUxLCAyNTYsCisgICAgICAgIDI1NiwgNCwgMjQsIDgzLCAxNzAsIDIzMiwgMjUzLCAyNTYsCisgICAgICAgIDI1NiwgMywgMTYsIDU2LCAxMjcsIDIwMCwgMjQxLCAyNTQsIDI1NiwKKyAgICAgICAgMjU2LCAzLCAxMiwgMzksIDkyLCAxNjIsIDIxOCwgMjQ2LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAzLCAxMSwgMzAsIDY3LCAxMjQsIDE4NSwgMjI5LCAyNDksIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDMsIDEwLCAyNSwgNTMsIDk3LCAxNTEsIDIwMCwgMjMzLCAyNTAsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDgsIDIxLCA0MywgNzcsIDEyMywgMTcxLCAyMDksIDIzNywgMjUxLCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCAyLCAxMywgMzUsIDYyLCA5NywgMTM5LCAxODYsIDIxOSwgMjQ0LCAyNTQsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDIsIDgsIDIyLCA0OCwgODUsIDEyOCwgMTcxLCAyMDgsIDIzNCwgMjQ4LCAyNTQsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDIsIDYsIDE2LCAzNiwgNjcsIDEwNywgMTQ5LCAxODksIDIyMCwgMjQwLCAyNTAsIDI1NCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMiwgNSwgMTMsIDI5LCA1NSwgOTAsIDEyOCwgMTY2LCAyMDEsIDIyNywgMjQzLCAyNTEsIDI1NCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMiwgNCwgMTAsIDIyLCA0MywgNzMsIDEwOSwgMTQ3LCAxODMsIDIxMywgMjM0LCAyNDYsIDI1MiwgMjU0LCAyNTUsIDI1NgorICAgIH0seworICAgICAgICAyNTYsIDEyNywgMjU2LAorICAgICAgICAyNTYsIDQ5LCAyMDYsIDI1NiwKKyAgICAgICAgMjU2LCAyMCwgMTI3LCAyMzYsIDI1NiwKKyAgICAgICAgMjU2LCAxMSwgNzEsIDE4NCwgMjQ2LCAyNTYsCisgICAgICAgIDI1NiwgNywgNDMsIDEyNywgMjE0LCAyNTAsIDI1NiwKKyAgICAgICAgMjU2LCA2LCAzMCwgODcsIDE2OSwgMjI5LCAyNTIsIDI1NiwKKyAgICAgICAgMjU2LCA1LCAyMywgNjIsIDEyNiwgMTk0LCAyMzYsIDI1MiwgMjU2LAorICAgICAgICAyNTYsIDYsIDIwLCA0OSwgOTYsIDE1NywgMjA5LCAyMzksIDI1MywgMjU2LAorICAgICAgICAyNTYsIDEsIDE2LCAzOSwgNzQsIDEyNSwgMTc1LCAyMTUsIDI0NSwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMiwgMjMsIDU1LCA5NywgMTQ5LCAxOTUsIDIzNiwgMjU0LCAyNTUsIDI1NiwKKyAgICAgICAgMjU2LCAxLCA3LCAyMywgNTAsIDg2LCAxMjgsIDE3MCwgMjA2LCAyMzMsIDI0OSwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgNiwgMTgsIDM5LCA3MCwgMTA4LCAxNDgsIDE4NiwgMjE3LCAyMzgsIDI1MCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgNCwgMTMsIDMwLCA1NiwgOTAsIDEyOCwgMTY2LCAyMDAsIDIyNiwgMjQzLCAyNTIsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDQsIDExLCAyNSwgNDcsIDc2LCAxMTAsIDE0NiwgMTgwLCAyMDksIDIzMSwgMjQ1LCAyNTIsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDMsIDgsIDE5LCAzNywgNjIsIDkzLCAxMjgsIDE2MywgMTk0LCAyMTksIDIzNywgMjQ4LCAyNTMsIDI1NSwgMjU2LAorICAgICAgICAyNTYsIDEsIDIsIDYsIDE1LCAzMCwgNTEsIDc5LCAxMTEsIDE0NSwgMTc3LCAyMDUsIDIyNiwgMjQxLCAyNTAsIDI1NCwgMjU1LCAyNTYKKyAgICB9LHsKKyAgICAgICAgMjU2LCAxMjgsIDI1NiwKKyAgICAgICAgMjU2LCA0MiwgMjE0LCAyNTYsCisgICAgICAgIDI1NiwgMjEsIDEyOCwgMjM1LCAyNTYsCisgICAgICAgIDI1NiwgMTIsIDcyLCAxODQsIDI0NSwgMjU2LAorICAgICAgICAyNTYsIDgsIDQyLCAxMjgsIDIxNCwgMjQ5LCAyNTYsCisgICAgICAgIDI1NiwgOCwgMzEsIDg2LCAxNzYsIDIzMSwgMjUxLCAyNTYsCisgICAgICAgIDI1NiwgNSwgMjAsIDU4LCAxMzAsIDIwMiwgMjM4LCAyNTMsIDI1NiwKKyAgICAgICAgMjU2LCA2LCAxOCwgNDUsIDk3LCAxNzQsIDIyMSwgMjQxLCAyNTEsIDI1NiwKKyAgICAgICAgMjU2LCA2LCAyNSwgNTMsIDg4LCAxMjgsIDE2OCwgMjAzLCAyMzEsIDI1MCwgMjU2LAorICAgICAgICAyNTYsIDQsIDE4LCA0MCwgNzEsIDEwOCwgMTQ4LCAxODUsIDIxNiwgMjM4LCAyNTIsIDI1NiwKKyAgICAgICAgMjU2LCAzLCAxMywgMzEsIDU3LCA5MCwgMTI4LCAxNjYsIDE5OSwgMjI1LCAyNDMsIDI1MywgMjU2LAorICAgICAgICAyNTYsIDIsIDEwLCAyMywgNDQsIDczLCAxMDksIDE0NywgMTgzLCAyMTIsIDIzMywgMjQ2LCAyNTQsIDI1NiwKKyAgICAgICAgMjU2LCAxLCA2LCAxNiwgMzMsIDU4LCA5MCwgMTI4LCAxNjYsIDE5OCwgMjIzLCAyNDAsIDI1MCwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgNSwgMTIsIDI1LCA0NiwgNzUsIDExMCwgMTQ2LCAxODEsIDIxMCwgMjMxLCAyNDQsIDI1MSwgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMywgOCwgMTgsIDM1LCA2MCwgOTIsIDEyOCwgMTY0LCAxOTYsIDIyMSwgMjM4LCAyNDgsIDI1MywgMjU1LCAyNTYsCisgICAgICAgIDI1NiwgMSwgMywgNywgMTQsIDI3LCA0OCwgNzYsIDExMCwgMTQ2LCAxODAsIDIwOCwgMjI5LCAyNDIsIDI0OSwgMjUzLCAyNTUsIDI1NgorICAgIH0KK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfZXhjaXRhdGlvbl9sc2JbXSA9IHsyNTYsIDEzNiwgMjU2fTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9leGNpdGF0aW9uX3NpZ25bM11bMl1bN11bM10gPSB7CisgICAgeyAgICAvLyBJbmFjdGl2ZQorICAgICAgICB7ICAgIC8vIExvdyBvZmZzZXQKKyAgICAgICAgICAgIHsyNTYsICAgMiwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDIwNywgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE4OSwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE3OSwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE3NCwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE2MywgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE1NywgMjU2fQorICAgICAgICB9LCB7IC8vIEhpZ2ggb2Zmc2V0CisgICAgICAgICAgICB7MjU2LCAgNTgsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyNDUsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyMzgsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyMzIsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyMjUsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyMjAsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyMTEsIDI1Nn0KKyAgICAgICAgfQorICAgIH0sIHsgLy8gVW52b2ljZWQKKyAgICAgICAgeyAgICAvLyBMb3cgb2Zmc2V0CisgICAgICAgICAgICB7MjU2LCAgIDEsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyMTAsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxOTAsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNzgsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNjksIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNjIsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNTIsIDI1Nn0KKyAgICAgICAgfSwgeyAvLyBIaWdoIG9mZnNldAorICAgICAgICAgICAgezI1NiwgIDQ4LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjQyLCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjM1LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjI0LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjE0LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMjA1LCAyNTZ9LAorICAgICAgICAgICAgezI1NiwgMTkwLCAyNTZ9CisgICAgICAgIH0KKyAgICB9LCB7IC8vIFZvaWNlZAorICAgICAgICB7ICAgIC8vIExvdyBvZmZzZXQKKyAgICAgICAgICAgIHsyNTYsICAgMSwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE2MiwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE1MiwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE0NywgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE0NCwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDE0MSwgMjU2fSwKKyAgICAgICAgICAgIHsyNTYsIDEzOCwgMjU2fQorICAgICAgICB9LCB7IC8vIEhpZ2ggb2Zmc2V0CisgICAgICAgICAgICB7MjU2LCAgIDgsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAyMDMsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxODcsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNzYsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNjgsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNjEsIDI1Nn0sCisgICAgICAgICAgICB7MjU2LCAxNTQsIDI1Nn0KKyAgICAgICAgfQorICAgIH0KK307CisKK2NvbnN0IGludDE2X3QgZmZfc2lsa19zdGVyZW9fd2VpZ2h0c1tdID0geworICAgIC0xMzczMiwgLTEwMDUwLCAgLTgyNjYsICAtNzUyNiwgIC02NTAwLCAgLTUwMDAsICAtMjk1MCwgICAtODIwLAorICAgICAgIDgyMCwgICAyOTUwLCAgIDUwMDAsICAgNjUwMCwgICA3NTI2LCAgIDgyNjYsICAxMDA1MCwgIDEzNzMyCit9OworCitjb25zdCB1aW50OF90IGZmX3NpbGtfbHNmX3MyX21vZGVsX3NlbF9uYm1iWzMyXVsxMF0gPSB7CisgICAgeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH0sCisgICAgeyAxLCAzLCAxLCAyLCAyLCAxLCAyLCAxLCAxLCAxIH0sCisgICAgeyAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxIH0sCisgICAgeyAxLCAyLCAyLCAyLCAyLCAxLCAyLCAxLCAxLCAxIH0sCisgICAgeyAyLCAzLCAzLCAzLCAzLCAyLCAyLCAyLCAyLCAyIH0sCisgICAgeyAwLCA1LCAzLCAzLCAyLCAyLCAyLCAyLCAxLCAxIH0sCisgICAgeyAwLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxIH0sCisgICAgeyAyLCAzLCA2LCA0LCA0LCA0LCA1LCA0LCA1LCA1IH0sCisgICAgeyAyLCA0LCA1LCA1LCA0LCA1LCA0LCA2LCA0LCA0IH0sCisgICAgeyAyLCA0LCA0LCA3LCA0LCA1LCA0LCA1LCA1LCA0IH0sCisgICAgeyA0LCAzLCAzLCAzLCAyLCAzLCAyLCAyLCAyLCAyIH0sCisgICAgeyAxLCA1LCA1LCA2LCA0LCA1LCA0LCA1LCA1LCA1IH0sCisgICAgeyAyLCA3LCA0LCA2LCA1LCA1LCA1LCA1LCA1LCA1IH0sCisgICAgeyAyLCA3LCA1LCA1LCA1LCA1LCA1LCA2LCA1LCA0IH0sCisgICAgeyAzLCAzLCA1LCA0LCA0LCA1LCA0LCA1LCA0LCA0IH0sCisgICAgeyAyLCAzLCAzLCA1LCA1LCA0LCA0LCA0LCA0LCA0IH0sCisgICAgeyAyLCA0LCA0LCA2LCA0LCA1LCA0LCA1LCA1LCA1IH0sCisgICAgeyAyLCA1LCA0LCA2LCA1LCA1LCA1LCA0LCA1LCA0IH0sCisgICAgeyAyLCA3LCA0LCA1LCA0LCA1LCA0LCA1LCA1LCA1IH0sCisgICAgeyAyLCA1LCA0LCA2LCA3LCA2LCA1LCA2LCA1LCA0IH0sCisgICAgeyAzLCA2LCA3LCA0LCA2LCA1LCA1LCA2LCA0LCA1IH0sCisgICAgeyAyLCA3LCA2LCA0LCA0LCA0LCA1LCA0LCA1LCA1IH0sCisgICAgeyA0LCA1LCA1LCA0LCA2LCA2LCA1LCA2LCA1LCA0IH0sCisgICAgeyAyLCA1LCA1LCA2LCA1LCA2LCA0LCA2LCA0LCA0IH0sCisgICAgeyA0LCA1LCA1LCA1LCAzLCA3LCA0LCA1LCA1LCA0IH0sCisgICAgeyAyLCAzLCA0LCA1LCA1LCA2LCA0LCA1LCA1LCA0IH0sCisgICAgeyAyLCAzLCAyLCAzLCAzLCA0LCAyLCAzLCAzLCAzIH0sCisgICAgeyAxLCAxLCAyLCAyLCAyLCAyLCAyLCAzLCAyLCAyIH0sCisgICAgeyA0LCA1LCA1LCA2LCA2LCA2LCA1LCA2LCA0LCA1IH0sCisgICAgeyAzLCA1LCA1LCA0LCA0LCA0LCA0LCAzLCAzLCAyIH0sCisgICAgeyAyLCA1LCAzLCA3LCA1LCA1LCA0LCA0LCA1LCA0IH0sCisgICAgeyA0LCA0LCA1LCA0LCA1LCA2LCA1LCA2LCA1LCA0IH0KK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfc2lsa19sc2ZfczJfbW9kZWxfc2VsX3diWzMyXVsxNl0gPSB7CisgICAgeyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCB9LAorICAgIHsgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOCwgMTEgfSwKKyAgICB7IDEwLCAxMywgMTMsIDExLCAxNSwgMTIsIDEyLCAxMywgMTAsIDEzLCAxMiwgMTMsIDEzLCAxMiwgMTEsIDExIH0sCisgICAgeyAgOCwgMTAsICA5LCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSB9LAorICAgIHsgIDgsIDE0LCAxMywgMTIsIDE0LCAxMiwgMTUsIDEzLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEyLCAxMiwgMTEgfSwKKyAgICB7ICA4LCAxMSwgMTMsIDEzLCAxMiwgMTEsIDExLCAxMywgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEyIH0sCisgICAgeyAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCB9LAorICAgIHsgIDgsIDEwLCAxNCwgMTEsIDE1LCAxMCwgMTMsIDExLCAxMiwgMTMsIDEzLCAxMiwgMTEsIDExLCAxMCwgMTEgfSwKKyAgICB7ICA4LCAxNCwgMTAsIDE0LCAxNCwgMTIsIDEzLCAxMiwgMTQsIDEzLCAxMiwgMTIsIDEzLCAxMSwgMTEsIDExIH0sCisgICAgeyAxMCwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCB9LAorICAgIHsgIDgsICA5LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDkgfSwKKyAgICB7IDEwLCAxMCwgMTEsIDEyLCAxMywgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgIDksIDExIH0sCisgICAgeyAxMCwgMTAsIDExLCAxMSwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsICA5LCAxMSB9LAorICAgIHsgMTEsIDEyLCAxMiwgMTIsIDE0LCAxMiwgMTIsIDEzLCAxMSwgMTMsIDEyLCAxMiwgMTMsIDEyLCAxMSwgMTIgfSwKKyAgICB7ICA4LCAxNCwgMTIsIDEzLCAxMiwgMTUsIDEzLCAxMCwgMTQsIDEzLCAxNSwgMTIsIDEyLCAxMSwgMTMsIDExIH0sCisgICAgeyAgOCwgIDksICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA5LCAgOCB9LAorICAgIHsgIDksIDE0LCAxMywgMTUsIDEzLCAxMiwgMTMsIDExLCAxMiwgMTMsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTIgfSwKKyAgICB7ICA5LCAxMSwgMTEsIDEyLCAxMiwgMTEsIDExLCAxMywgMTAsIDExLCAxMSwgMTMsIDEzLCAxMywgMTEsIDEyIH0sCisgICAgeyAxMCwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMSwgMTAsICA5LCAxMCwgIDksIDEwLCAgOSwgIDksICA5LCAxMiB9LAorICAgIHsgIDgsIDEwLCAxMSwgMTMsIDExLCAxMSwgMTAsIDEwLCAxMCwgIDksICA5LCAgOCwgIDgsICA4LCAgOCwgIDggfSwKKyAgICB7IDExLCAxMiwgMTEsIDEzLCAxMSwgMTEsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEyIH0sCisgICAgeyAxMCwgMTQsIDExLCAxNSwgMTUsIDEyLCAxMywgMTIsIDEzLCAxMSwgMTMsIDExLCAxMSwgMTAsIDExLCAxMSB9LAorICAgIHsgMTAsIDExLCAxMywgMTQsIDE0LCAxMSwgMTMsIDExLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMCwgMTIgfSwKKyAgICB7ICA5LCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTMsIDEzLCAxMywgMTEsICA5LCAgOSwgIDksICA5IH0sCisgICAgeyAxMCwgMTMsIDExLCAxNCwgMTQsIDEyLCAxNSwgMTIsIDEyLCAxMywgMTEsIDEyLCAxMiwgMTEsIDExLCAxMSB9LAorICAgIHsgIDgsIDE0LCAgOSwgIDksICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDggfSwKKyAgICB7ICA4LCAxNCwgMTQsIDExLCAxMywgMTAsIDEzLCAxMywgMTEsIDEyLCAxMiwgMTUsIDE1LCAxMiwgMTIsIDEyIH0sCisgICAgeyAxMSwgMTEsIDE1LCAxMSwgMTMsIDEyLCAxMSwgMTEsIDExLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEwLCAxMSB9LAorICAgIHsgIDgsICA4LCAgOSwgIDgsICA4LCAgOCwgMTAsICA5LCAxMCwgIDksICA5LCAxMCwgMTAsIDEwLCAgOSwgIDkgfSwKKyAgICB7ICA4LCAxMSwgMTAsIDEzLCAxMSwgMTEsIDEwLCAxMSwgMTAsICA5LCAgOCwgIDgsICA5LCAgOCwgIDgsICA5IH0sCisgICAgeyAxMSwgMTMsIDEzLCAxMiwgMTUsIDEzLCAxMSwgMTEsIDEwLCAxMSwgMTAsIDEwLCAgOSwgIDgsICA5LCAgOCB9LAorICAgIHsgMTAsIDExLCAxMywgMTEsIDEyLCAxMSwgMTEsIDExLCAxMCwgIDksIDEwLCAxNCwgMTIsICA4LCAgOCwgIDggfQorfTsKKworY29uc3QgdWludDhfdCBmZl9zaWxrX2xzZl9wcmVkX3dlaWdodHNfbmJtYlsyXVs5XSA9IHsKKyAgICB7MTc5LCAxMzgsIDE0MCwgMTQ4LCAxNTEsIDE0OSwgMTUzLCAxNTEsIDE2M30sCisgICAgezExNiwgIDY3LCAgODIsICA1OSwgIDkyLCAgNzIsIDEwMCwgIDg5LCAgOTJ9Cit9OworCitjb25zdCB1aW50OF90IGZmX3NpbGtfbHNmX3ByZWRfd2VpZ2h0c193YlsyXVsxNV0gPSB7CisgICAgezE3NSwgMTQ4LCAxNjAsIDE3NiwgMTc4LCAxNzMsIDE3NCwgMTY0LCAxNzcsIDE3NCwgMTk2LCAxODIsIDE5OCwgMTkyLCAxODJ9LAorICAgIHsgNjgsICA2MiwgIDY2LCAgNjAsICA3MiwgMTE3LCAgODUsICA5MCwgMTE4LCAxMzYsIDE1MSwgMTQyLCAxNjAsIDE0MiwgMTU1fQorfTsKKworY29uc3QgdWludDhfdCBmZl9zaWxrX2xzZl93ZWlnaHRfc2VsX25ibWJbMzJdWzldID0geworICAgIHsgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMSwgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMCB9LAorICAgIHsgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMCB9LAorICAgIHsgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMSB9LAorICAgIHsgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMSB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMCB9LAorICAgIHsgMCwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMCB9LAorICAgIHsgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCB9LAorICAgIHsgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMSB9LAorICAgIHsgMCwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCB9LAorICAgIHsgMCwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSB9LAorICAgIHsgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMSwgMSwgMSwgMCwgMSwgMCB9LAorICAgIHsgMCwgMSwgMSwgMCwgMCwgMSwgMCwgMSwgMCB9LAorICAgIHsgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSB9LAorICAgIHsgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMSB9LAorICAgIHsgMCwgMCwgMCwgMSwgMCwgMSwgMSwgMSwgMSB9LAorICAgIHsgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMSwgMCwgMSwgMSwgMCwgMSwgMCB9LAorICAgIHsgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9LAorICAgIHsgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSB9LAorICAgIHsgMSwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMSB9Cit9OworCitjb25zdCB1aW50OF90IGZmX3NpbGtfbHNmX3dlaWdodF9zZWxfd2JbMzJdWzE1XSA9IHsKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDAsIDEgfSwKKyAgICB7IDAsIDEsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfSwKKyAgICB7IDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDAsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDEsIDAsIDAsIDAsIDEsIDEsIDAsIDEsIDEsIDEsIDAsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDEsIDAsIDEsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDEsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDAsIDAgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDAgfSwKKyAgICB7IDAsIDAsIDAsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfSwKKyAgICB7IDAsIDEsIDEsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfSwKKyAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfSwKKyAgICB7IDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAgfSwKKyAgICB7IDAsIDAsIDEsIDAsIDAsIDEsIDEsIDEsIDAsIDAsIDEsIDAsIDAsIDEsIDAgfQorfTsKKworY29uc3QgdWludDhfdCBmZl9zaWxrX2xzZl9jb2RlYm9va19uYm1iWzMyXVsxMF0gPSB7CisgICAgeyAxMiwgIDM1LCAgNjAsICA4MywgMTA4LCAxMzIsIDE1NywgMTgwLCAyMDYsIDIyOCB9LAorICAgIHsgMTUsICAzMiwgIDU1LCAgNzcsIDEwMSwgMTI1LCAxNTEsIDE3NSwgMjAxLCAyMjUgfSwKKyAgICB7IDE5LCAgNDIsICA2NiwgIDg5LCAxMTQsIDEzNywgMTYyLCAxODQsIDIwOSwgMjMwIH0sCisgICAgeyAxMiwgIDI1LCAgNTAsICA3MiwgIDk3LCAxMjAsIDE0NywgMTcyLCAyMDAsIDIyMyB9LAorICAgIHsgMjYsICA0NCwgIDY5LCAgOTAsIDExNCwgMTM1LCAxNTksIDE4MCwgMjA1LCAyMjUgfSwKKyAgICB7IDEzLCAgMjIsICA1MywgIDgwLCAxMDYsIDEzMCwgMTU2LCAxODAsIDIwNSwgMjI4IH0sCisgICAgeyAxNSwgIDI1LCAgNDQsICA2NCwgIDkwLCAxMTUsIDE0MiwgMTY4LCAxOTYsIDIyMiB9LAorICAgIHsgMTksICAyNCwgIDYyLCAgODIsIDEwMCwgMTIwLCAxNDUsIDE2OCwgMTkwLCAyMTQgfSwKKyAgICB7IDIyLCAgMzEsICA1MCwgIDc5LCAxMDMsIDEyMCwgMTUxLCAxNzAsIDIwMywgMjI3IH0sCisgICAgeyAyMSwgIDI5LCAgNDUsICA2NSwgMTA2LCAxMjQsIDE1MCwgMTcxLCAxOTYsIDIyNCB9LAorICAgIHsgMzAsICA0OSwgIDc1LCAgOTcsIDEyMSwgMTQyLCAxNjUsIDE4NiwgMjA5LCAyMjkgfSwKKyAgICB7IDE5LCAgMjUsICA1MiwgIDcwLCAgOTMsIDExNiwgMTQzLCAxNjYsIDE5MiwgMjE5IH0sCisgICAgeyAyNiwgIDM0LCAgNjIsICA3NSwgIDk3LCAxMTgsIDE0NSwgMTY3LCAxOTQsIDIxNyB9LAorICAgIHsgMjUsICAzMywgIDU2LCAgNzAsICA5MSwgMTEzLCAxNDMsIDE2NSwgMTk2LCAyMjMgfSwKKyAgICB7IDIxLCAgMzQsICA1MSwgIDcyLCAgOTcsIDExNywgMTQ1LCAxNzEsIDE5NiwgMjIyIH0sCisgICAgeyAyMCwgIDI5LCAgNTAsICA2NywgIDkwLCAxMTcsIDE0NCwgMTY4LCAxOTcsIDIyMSB9LAorICAgIHsgMjIsICAzMSwgIDQ4LCAgNjYsICA5NSwgMTE3LCAxNDYsIDE2OCwgMTk2LCAyMjIgfSwKKyAgICB7IDI0LCAgMzMsICA1MSwgIDc3LCAxMTYsIDEzNCwgMTU4LCAxODAsIDIwMCwgMjI0IH0sCisgICAgeyAyMSwgIDI4LCAgNzAsICA4NywgMTA2LCAxMjQsIDE0OSwgMTcwLCAxOTQsIDIxNyB9LAorICAgIHsgMjYsICAzMywgIDUzLCAgNjQsICA4MywgMTE3LCAxNTIsIDE3MywgMjA0LCAyMjUgfSwKKyAgICB7IDI3LCAgMzQsICA2NSwgIDk1LCAxMDgsIDEyOSwgMTU1LCAxNzQsIDIxMCwgMjI1IH0sCisgICAgeyAyMCwgIDI2LCAgNzIsICA5OSwgMTEzLCAxMzEsIDE1NCwgMTc2LCAyMDAsIDIxOSB9LAorICAgIHsgMzQsICA0MywgIDYxLCAgNzgsICA5MywgMTE0LCAxNTUsIDE3NywgMjA1LCAyMjkgfSwKKyAgICB7IDIzLCAgMjksICA1NCwgIDk3LCAxMjQsIDEzOCwgMTYzLCAxNzksIDIwOSwgMjI5IH0sCisgICAgeyAzMCwgIDM4LCAgNTYsICA4OSwgMTE4LCAxMjksIDE1OCwgMTc4LCAyMDAsIDIzMSB9LAorICAgIHsgMjEsICAyOSwgIDQ5LCAgNjMsICA4NSwgMTExLCAxNDIsIDE2MywgMTkzLCAyMjIgfSwKKyAgICB7IDI3LCAgNDgsICA3NywgMTAzLCAxMzMsIDE1OCwgMTc5LCAxOTYsIDIxNSwgMjMyIH0sCisgICAgeyAyOSwgIDQ3LCAgNzQsICA5OSwgMTI0LCAxNTEsIDE3NiwgMTk4LCAyMjAsIDIzNyB9LAorICAgIHsgMzMsICA0MiwgIDYxLCAgNzYsICA5MywgMTIxLCAxNTUsIDE3NCwgMjA3LCAyMjUgfSwKKyAgICB7IDI5LCAgNTMsICA4NywgMTEyLCAxMzYsIDE1NCwgMTcwLCAxODgsIDIwOCwgMjI3IH0sCisgICAgeyAyNCwgIDMwLCAgNTIsICA4NCwgMTMxLCAxNTAsIDE2NiwgMTg2LCAyMDMsIDIyOSB9LAorICAgIHsgMzcsICA0OCwgIDY0LCAgODQsIDEwNCwgMTE4LCAxNTYsIDE3NywgMjAxLCAyMzAgfQorfTsKKworY29uc3QgdWludDhfdCBmZl9zaWxrX2xzZl9jb2RlYm9va193YlszMl1bMTZdID0geworICAgIHsgIDcsICAyMywgIDM4LCAgNTQsICA2OSwgIDg1LCAxMDAsIDExNiwgMTMxLCAxNDcsIDE2MiwgMTc4LCAxOTMsIDIwOCwgMjIzLCAyMzkgfSwKKyAgICB7IDEzLCAgMjUsICA0MSwgIDU1LCAgNjksICA4MywgIDk4LCAxMTIsIDEyNywgMTQyLCAxNTcsIDE3MSwgMTg3LCAyMDMsIDIyMCwgMjM2IH0sCisgICAgeyAxNSwgIDIxLCAgMzQsICA1MSwgIDYxLCAgNzgsICA5MiwgMTA2LCAxMjYsIDEzNiwgMTUyLCAxNjcsIDE4NSwgMjA1LCAyMjUsIDI0MCB9LAorICAgIHsgMTAsICAyMSwgIDM2LCAgNTAsICA2MywgIDc5LCAgOTUsIDExMCwgMTI2LCAxNDEsIDE1NywgMTczLCAxODksIDIwNSwgMjIxLCAyMzcgfSwKKyAgICB7IDE3LCAgMjAsICAzNywgIDUxLCAgNTksICA3OCwgIDg5LCAxMDcsIDEyMywgMTM0LCAxNTAsIDE2NCwgMTg0LCAyMDUsIDIyNCwgMjQwIH0sCisgICAgeyAxMCwgIDE1LCAgMzIsICA1MSwgIDY3LCAgODEsICA5NiwgMTEyLCAxMjksIDE0MiwgMTU4LCAxNzMsIDE4OSwgMjA0LCAyMjAsIDIzNiB9LAorICAgIHsgIDgsICAyMSwgIDM3LCAgNTEsICA2NSwgIDc5LCAgOTgsIDExMywgMTI2LCAxMzgsIDE1NSwgMTY4LCAxNzksIDE5MiwgMjA5LCAyMTggfSwKKyAgICB7IDEyLCAgMTUsICAzNCwgIDU1LCAgNjMsICA3OCwgIDg3LCAxMDgsIDExOCwgMTMxLCAxNDgsIDE2NywgMTg1LCAyMDMsIDIxOSwgMjM2IH0sCisgICAgeyAxNiwgIDE5LCAgMzIsICAzNiwgIDU2LCAgNzksICA5MSwgMTA4LCAxMTgsIDEzNiwgMTU0LCAxNzEsIDE4NiwgMjA0LCAyMjAsIDIzNyB9LAorICAgIHsgMTEsICAyOCwgIDQzLCAgNTgsICA3NCwgIDg5LCAxMDUsIDEyMCwgMTM1LCAxNTAsIDE2NSwgMTgwLCAxOTYsIDIxMSwgMjI2LCAyNDEgfSwKKyAgICB7ICA2LCAgMTYsICAzMywgIDQ2LCAgNjAsICA3NSwgIDkyLCAxMDcsIDEyMywgMTM3LCAxNTYsIDE2OSwgMTg1LCAxOTksIDIxNCwgMjI1IH0sCisgICAgeyAxMSwgIDE5LCAgMzAsICA0NCwgIDU3LCAgNzQsICA4OSwgMTA1LCAxMjEsIDEzNSwgMTUyLCAxNjksIDE4NiwgMjAyLCAyMTgsIDIzNCB9LAorICAgIHsgMTIsICAxOSwgIDI5LCAgNDYsICA1NywgIDcxLCAgODgsIDEwMCwgMTIwLCAxMzIsIDE0OCwgMTY1LCAxODIsIDE5OSwgMjE2LCAyMzMgfSwKKyAgICB7IDE3LCAgMjMsICAzNSwgIDQ2LCAgNTYsICA3NywgIDkyLCAxMDYsIDEyMywgMTM0LCAxNTIsIDE2NywgMTg1LCAyMDQsIDIyMiwgMjM3IH0sCisgICAgeyAxNCwgIDE3LCAgNDUsICA1MywgIDYzLCAgNzUsICA4OSwgMTA3LCAxMTUsIDEzMiwgMTUxLCAxNzEsIDE4OCwgMjA2LCAyMjEsIDI0MCB9LAorICAgIHsgIDksICAxNiwgIDI5LCAgNDAsICA1NiwgIDcxLCAgODgsIDEwMywgMTE5LCAxMzcsIDE1NCwgMTcxLCAxODksIDIwNSwgMjIyLCAyMzcgfSwKKyAgICB7IDE2LCAgMTksICAzNiwgIDQ4LCAgNTcsICA3NiwgIDg3LCAxMDUsIDExOCwgMTMyLCAxNTAsIDE2NywgMTg1LCAyMDIsIDIxOCwgMjM2IH0sCisgICAgeyAxMiwgIDE3LCAgMjksICA1NCwgIDcxLCAgODEsICA5NCwgMTA0LCAxMjYsIDEzNiwgMTQ5LCAxNjQsIDE4MiwgMjAxLCAyMjEsIDIzNyB9LAorICAgIHsgMTUsICAyOCwgIDQ3LCAgNjIsICA3OSwgIDk3LCAxMTUsIDEyOSwgMTQyLCAxNTUsIDE2OCwgMTgwLCAxOTQsIDIwOCwgMjIzLCAyMzggfSwKKyAgICB7ICA4LCAgMTQsICAzMCwgIDQ1LCAgNjIsICA3OCwgIDk0LCAxMTEsIDEyNywgMTQzLCAxNTksIDE3NSwgMTkyLCAyMDcsIDIyMywgMjM5IH0sCisgICAgeyAxNywgIDMwLCAgNDksICA2MiwgIDc5LCAgOTIsIDEwNywgMTE5LCAxMzIsIDE0NSwgMTYwLCAxNzQsIDE5MCwgMjA0LCAyMjAsIDIzNSB9LAorICAgIHsgMTQsICAxOSwgIDM2LCAgNDUsICA2MSwgIDc2LCAgOTEsIDEwOCwgMTIxLCAxMzgsIDE1NCwgMTcyLCAxODksIDIwNSwgMjIyLCAyMzggfSwKKyAgICB7IDEyLCAgMTgsICAzMSwgIDQ1LCAgNjAsICA3NiwgIDkxLCAxMDcsIDEyMywgMTM4LCAxNTQsIDE3MSwgMTg3LCAyMDQsIDIyMSwgMjM2IH0sCisgICAgeyAxMywgIDE3LCAgMzEsICA0MywgIDUzLCAgNzAsICA4MywgMTAzLCAxMTQsIDEzMSwgMTQ5LCAxNjcsIDE4NSwgMjAzLCAyMjAsIDIzNyB9LAorICAgIHsgMTcsICAyMiwgIDM1LCAgNDIsICA1OCwgIDc4LCAgOTMsIDExMCwgMTI1LCAxMzksIDE1NSwgMTcwLCAxODgsIDIwNiwgMjI0LCAyNDAgfSwKKyAgICB7ICA4LCAgMTUsICAzNCwgIDUwLCAgNjcsICA4MywgIDk5LCAxMTUsIDEzMSwgMTQ2LCAxNjIsIDE3OCwgMTkzLCAyMDksIDIyNCwgMjM5IH0sCisgICAgeyAxMywgIDE2LCAgNDEsICA2NiwgIDczLCAgODYsICA5NSwgMTExLCAxMjgsIDEzNywgMTUwLCAxNjMsIDE4MywgMjA2LCAyMjUsIDI0MSB9LAorICAgIHsgMTcsICAyNSwgIDM3LCAgNTIsICA2MywgIDc1LCAgOTIsIDEwMiwgMTE5LCAxMzIsIDE0NCwgMTYwLCAxNzUsIDE5MSwgMjEyLCAyMzEgfSwKKyAgICB7IDE5LCAgMzEsICA0OSwgIDY1LCAgODMsIDEwMCwgMTE3LCAxMzMsIDE0NywgMTYxLCAxNzQsIDE4NywgMjAwLCAyMTMsIDIyNywgMjQyIH0sCisgICAgeyAxOCwgIDMxLCAgNTIsICA2OCwgIDg4LCAxMDMsIDExNywgMTI2LCAxMzgsIDE0OSwgMTYzLCAxNzcsIDE5MiwgMjA3LCAyMjMsIDIzOSB9LAorICAgIHsgMTYsICAyOSwgIDQ3LCAgNjEsICA3NiwgIDkwLCAxMDYsIDExOSwgMTMzLCAxNDcsIDE2MSwgMTc2LCAxOTMsIDIwOSwgMjI0LCAyNDAgfSwKKyAgICB7IDE1LCAgMjEsICAzNSwgIDUwLCAgNjEsICA3MywgIDg2LCAgOTcsIDExMCwgMTE5LCAxMjksIDE0MSwgMTc1LCAxOTgsIDIxOCwgMjM3IH0KK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbHNmX21pbl9zcGFjaW5nX25ibWJbXSA9IHsKKyAgICAyNTAsIDMsIDYsIDMsIDMsIDMsIDQsIDMsIDMsIDMsIDQ2MQorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19sc2ZfbWluX3NwYWNpbmdfd2JbXSA9IHsKKyAgICAxMDAsIDMsIDQwLCAzLCAzLCAzLCA1LCAxNCwgMTQsIDEwLCAxMSwgMywgOCwgOSwgNywgMywgMzQ3Cit9OworCitjb25zdCB1aW50OF90IGZmX3NpbGtfbHNmX29yZGVyaW5nX25ibWJbXSA9IHsKKyAgICAwLCA5LCA2LCAzLCA0LCA1LCA4LCAxLCAyLCA3Cit9OworCitjb25zdCB1aW50OF90IGZmX3NpbGtfbHNmX29yZGVyaW5nX3diW10gPSB7CisgICAgMCwgMTUsIDgsIDcsIDQsIDExLCAxMiwgMywgMiwgMTMsIDEwLCA1LCA2LCA5LCAxNCwgMQorfTsKKworY29uc3QgaW50MTZfdCBmZl9zaWxrX2Nvc2luZVtdID0geyAvKiAoMC4xMikgKi8KKyAgICAgNDA5NiwgIDQwOTUsICA0MDkxLCAgNDA4NSwKKyAgICAgNDA3NiwgIDQwNjUsICA0MDUyLCAgNDAzNiwKKyAgICAgNDAxNywgIDM5OTcsICAzOTczLCAgMzk0OCwKKyAgICAgMzkyMCwgIDM4ODksICAzODU3LCAgMzgyMiwKKyAgICAgMzc4NCwgIDM3NDUsICAzNzAzLCAgMzY1OSwKKyAgICAgMzYxMywgIDM1NjQsICAzNTEzLCAgMzQ2MSwKKyAgICAgMzQwNiwgIDMzNDksICAzMjkwLCAgMzIyOSwKKyAgICAgMzE2NiwgIDMxMDIsICAzMDM1LCAgMjk2NywKKyAgICAgMjg5NiwgIDI4MjQsICAyNzUxLCAgMjY3NiwKKyAgICAgMjU5OSwgIDI1MjAsICAyNDQwLCAgMjM1OSwKKyAgICAgMjI3NiwgIDIxOTEsICAyMTA2LCAgMjAxOSwKKyAgICAgMTkzMSwgIDE4NDIsICAxNzUxLCAgMTY2MCwKKyAgICAgMTU2OCwgIDE0NzQsICAxMzgwLCAgMTI4NSwKKyAgICAgMTE4OSwgIDEwOTMsICAgOTk1LCAgIDg5NywKKyAgICAgIDc5OSwgICA3MDAsICAgNjAxLCAgIDUwMSwKKyAgICAgIDQwMSwgICAzMDEsICAgMjAxLCAgIDEwMSwKKyAgICAgICAgMCwgIC0xMDEsICAtMjAxLCAgLTMwMSwKKyAgICAgLTQwMSwgIC01MDEsICAtNjAxLCAgLTcwMCwKKyAgICAgLTc5OSwgIC04OTcsICAtOTk1LCAtMTA5MywKKyAgICAtMTE4OSwgLTEyODUsIC0xMzgwLCAtMTQ3NCwKKyAgICAtMTU2OCwgLTE2NjAsIC0xNzUxLCAtMTg0MiwKKyAgICAtMTkzMSwgLTIwMTksIC0yMTA2LCAtMjE5MSwKKyAgICAtMjI3NiwgLTIzNTksIC0yNDQwLCAtMjUyMCwKKyAgICAtMjU5OSwgLTI2NzYsIC0yNzUxLCAtMjgyNCwKKyAgICAtMjg5NiwgLTI5NjcsIC0zMDM1LCAtMzEwMiwKKyAgICAtMzE2NiwgLTMyMjksIC0zMjkwLCAtMzM0OSwKKyAgICAtMzQwNiwgLTM0NjEsIC0zNTEzLCAtMzU2NCwKKyAgICAtMzYxMywgLTM2NTksIC0zNzAzLCAtMzc0NSwKKyAgICAtMzc4NCwgLTM4MjIsIC0zODU3LCAtMzg4OSwKKyAgICAtMzkyMCwgLTM5NDgsIC0zOTczLCAtMzk5NywKKyAgICAtNDAxNywgLTQwMzYsIC00MDUyLCAtNDA2NSwKKyAgICAtNDA3NiwgLTQwODUsIC00MDkxLCAtNDA5NSwKKyAgICAtNDA5NgorfTsKKworY29uc3QgdWludDE2X3QgZmZfc2lsa19waXRjaF9zY2FsZVtdICAgPSB7ICA0LCAgIDYsICAgOH07CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfcGl0Y2hfbWluX2xhZ1tdID0geyAxNiwgIDI0LCAgMzJ9OworCitjb25zdCB1aW50MTZfdCBmZl9zaWxrX3BpdGNoX21heF9sYWdbXSA9IHsxNDQsIDIxNiwgMjg4fTsKKworY29uc3QgaW50OF90IGZmX3NpbGtfcGl0Y2hfb2Zmc2V0X25iMTBtc1szXVsyXSA9IHsKKyAgICB7IDAsICAwfSwKKyAgICB7IDEsICAwfSwKKyAgICB7IDAsICAxfQorfTsKKworY29uc3QgaW50OF90IGZmX3NpbGtfcGl0Y2hfb2Zmc2V0X25iMjBtc1sxMV1bNF0gPSB7CisgICAgeyAwLCAgMCwgIDAsICAwfSwKKyAgICB7IDIsICAxLCAgMCwgLTF9LAorICAgIHstMSwgIDAsICAxLCAgMn0sCisgICAgey0xLCAgMCwgIDAsICAxfSwKKyAgICB7LTEsICAwLCAgMCwgIDB9LAorICAgIHsgMCwgIDAsICAwLCAgMX0sCisgICAgeyAwLCAgMCwgIDEsICAxfSwKKyAgICB7IDEsICAxLCAgMCwgIDB9LAorICAgIHsgMSwgIDAsICAwLCAgMH0sCisgICAgeyAwLCAgMCwgIDAsIC0xfSwKKyAgICB7IDEsICAwLCAgMCwgLTF9Cit9OworCitjb25zdCBpbnQ4X3QgZmZfc2lsa19waXRjaF9vZmZzZXRfbWJ3YjEwbXNbMTJdWzJdID0geworICAgIHsgMCwgIDB9LAorICAgIHsgMCwgIDF9LAorICAgIHsgMSwgIDB9LAorICAgIHstMSwgIDF9LAorICAgIHsgMSwgLTF9LAorICAgIHstMSwgIDJ9LAorICAgIHsgMiwgLTF9LAorICAgIHstMiwgIDJ9LAorICAgIHsgMiwgLTJ9LAorICAgIHstMiwgIDN9LAorICAgIHsgMywgLTJ9LAorICAgIHstMywgIDN9Cit9OworCitjb25zdCBpbnQ4X3QgZmZfc2lsa19waXRjaF9vZmZzZXRfbWJ3YjIwbXNbMzRdWzRdID0geworICAgIHsgMCwgIDAsICAwLCAgMH0sCisgICAgeyAwLCAgMCwgIDEsICAxfSwKKyAgICB7IDEsICAxLCAgMCwgIDB9LAorICAgIHstMSwgIDAsICAwLCAgMH0sCisgICAgeyAwLCAgMCwgIDAsICAxfSwKKyAgICB7IDEsICAwLCAgMCwgIDB9LAorICAgIHstMSwgIDAsICAwLCAgMX0sCisgICAgeyAwLCAgMCwgIDAsIC0xfSwKKyAgICB7LTEsICAwLCAgMSwgIDJ9LAorICAgIHsgMSwgIDAsICAwLCAtMX0sCisgICAgey0yLCAtMSwgIDEsICAyfSwKKyAgICB7IDIsICAxLCAgMCwgLTF9LAorICAgIHstMiwgIDAsICAwLCAgMn0sCisgICAgey0yLCAgMCwgIDEsICAzfSwKKyAgICB7IDIsICAxLCAtMSwgLTJ9LAorICAgIHstMywgLTEsICAxLCAgM30sCisgICAgeyAyLCAgMCwgIDAsIC0yfSwKKyAgICB7IDMsICAxLCAgMCwgLTJ9LAorICAgIHstMywgLTEsICAyLCAgNH0sCisgICAgey00LCAtMSwgIDEsICA0fSwKKyAgICB7IDMsICAxLCAtMSwgLTN9LAorICAgIHstNCwgLTEsICAyLCAgNX0sCisgICAgeyA0LCAgMiwgLTEsIC0zfSwKKyAgICB7IDQsICAxLCAtMSwgLTR9LAorICAgIHstNSwgLTEsICAyLCAgNn0sCisgICAgeyA1LCAgMiwgLTEsIC00fSwKKyAgICB7LTYsIC0yLCAgMiwgIDZ9LAorICAgIHstNSwgLTIsICAyLCAgNX0sCisgICAgeyA2LCAgMiwgLTEsIC01fSwKKyAgICB7LTcsIC0yLCAgMywgIDh9LAorICAgIHsgNiwgIDIsIC0yLCAtNn0sCisgICAgeyA1LCAgMiwgLTIsIC01fSwKKyAgICB7IDgsICAzLCAtMiwgLTd9LAorICAgIHstOSwgLTMsICAzLCAgOX0KK307CisKK2NvbnN0IGludDhfdCBmZl9zaWxrX2x0cF9maWx0ZXIwX3RhcHNbOF1bNV0gPSB7CisgICAgeyAgNCwgICA2LCAgMjQsICAgNywgICA1fSwKKyAgICB7ICAwLCAgIDAsICAgMiwgICAwLCAgIDB9LAorICAgIHsgMTIsICAyOCwgIDQxLCAgMTMsICAtNH0sCisgICAgeyAtOSwgIDE1LCAgNDIsICAyNSwgIDE0fSwKKyAgICB7ICAxLCAgLTIsICA2MiwgIDQxLCAgLTl9LAorICAgIHstMTAsICAzNywgIDY1LCAgLTQsICAgM30sCisgICAgeyAtNiwgICA0LCAgNjYsICAgNywgIC04fSwKKyAgICB7IDE2LCAgMTQsICAzOCwgIC0zLCAgMzN9Cit9OworCitjb25zdCBpbnQ4X3QgZmZfc2lsa19sdHBfZmlsdGVyMV90YXBzWzE2XVs1XSA9IHsKKyAgICB7IDEzLCAgMjIsICAzOSwgIDIzLCAgMTJ9LAorICAgIHsgLTEsICAzNiwgIDY0LCAgMjcsICAtNn0sCisgICAgeyAtNywgIDEwLCAgNTUsICA0MywgIDE3fSwKKyAgICB7ICAxLCAgIDEsICAgOCwgICAxLCAgIDF9LAorICAgIHsgIDYsIC0xMSwgIDc0LCAgNTMsICAtOX0sCisgICAgey0xMiwgIDU1LCAgNzYsIC0xMiwgICA4fSwKKyAgICB7IC0zLCAgIDMsICA5MywgIDI3LCAgLTR9LAorICAgIHsgMjYsICAzOSwgIDU5LCAgIDMsICAtOH0sCisgICAgeyAgMiwgICAwLCAgNzcsICAxMSwgICA5fSwKKyAgICB7IC04LCAgMjIsICA0NCwgIC02LCAgIDd9LAorICAgIHsgNDAsICAgOSwgIDI2LCAgIDMsICAgOX0sCisgICAgeyAtNywgIDIwLCAxMDEsICAtNywgICA0fSwKKyAgICB7ICAzLCAgLTgsICA0MiwgIDI2LCAgIDB9LAorICAgIHstMTUsICAzMywgIDY4LCAgIDIsICAyM30sCisgICAgeyAtMiwgIDU1LCAgNDYsICAtMiwgIDE1fSwKKyAgICB7ICAzLCAgLTEsICAyMSwgIDE2LCAgNDF9Cit9OworCitjb25zdCBpbnQ4X3QgZmZfc2lsa19sdHBfZmlsdGVyMl90YXBzWzMyXVs1XSA9IHsKKyAgICB7IC02LCAgMjcsICA2MSwgIDM5LCAgIDV9LAorICAgIHstMTEsICA0MiwgIDg4LCAgIDQsICAgMX0sCisgICAgeyAtMiwgIDYwLCAgNjUsICAgNiwgIC00fSwKKyAgICB7IC0xLCAgLTUsICA3MywgIDU2LCAgIDF9LAorICAgIHsgLTksICAxOSwgIDk0LCAgMjksICAtOX0sCisgICAgeyAgMCwgIDEyLCAgOTksICAgNiwgICA0fSwKKyAgICB7ICA4LCAtMTksIDEwMiwgIDQ2LCAtMTN9LAorICAgIHsgIDMsICAgMiwgIDEzLCAgIDMsICAgMn0sCisgICAgeyAgOSwgLTIxLCAgODQsICA3MiwgLTE4fSwKKyAgICB7LTExLCAgNDYsIDEwNCwgLTIyLCAgIDh9LAorICAgIHsgMTgsICAzOCwgIDQ4LCAgMjMsICAgMH0sCisgICAgey0xNiwgIDcwLCAgODMsIC0yMSwgIDExfSwKKyAgICB7ICA1LCAtMTEsIDExNywgIDIyLCAgLTh9LAorICAgIHsgLTYsICAyMywgMTE3LCAtMTIsICAgM30sCisgICAgeyAgMywgIC04LCAgOTUsICAyOCwgICA0fSwKKyAgICB7LTEwLCAgMTUsICA3NywgIDYwLCAtMTV9LAorICAgIHsgLTEsICAgNCwgMTI0LCAgIDIsICAtNH0sCisgICAgeyAgMywgIDM4LCAgODQsICAyNCwgLTI1fSwKKyAgICB7ICAyLCAgMTMsICA0MiwgIDEzLCAgMzF9LAorICAgIHsgMjEsICAtNCwgIDU2LCAgNDYsICAtMX0sCisgICAgeyAtMSwgIDM1LCAgNzksIC0xMywgIDE5fSwKKyAgICB7IC03LCAgNjUsICA4OCwgIC05LCAtMTR9LAorICAgIHsgMjAsICAgNCwgIDgxLCAgNDksIC0yOX0sCisgICAgeyAyMCwgICAwLCAgNzUsICAgMywgLTE3fSwKKyAgICB7ICA1LCAgLTksICA0NCwgIDkyLCAgLTh9LAorICAgIHsgIDEsICAtMywgIDIyLCAgNjksICAzMX0sCisgICAgeyAtNiwgIDk1LCAgNDEsIC0xMiwgICA1fSwKKyAgICB7IDM5LCAgNjcsICAxNiwgIC00LCAgIDF9LAorICAgIHsgIDAsICAtNiwgMTIwLCAgNTUsIC0zNn0sCisgICAgey0xMywgIDQ0LCAxMjIsICAgNCwgLTI0fSwKKyAgICB7IDgxLCAgIDUsICAxMSwgICAzLCAgIDd9LAorICAgIHsgIDIsICAgMCwgICA5LCAgMTAsICA4OH0KK307CisKK2NvbnN0IHVpbnQxNl90IGZmX3NpbGtfbHRwX3NjYWxlX2ZhY3RvcltdID0gezE1NTY1LCAxMjI4OCwgODE5Mn07CisKK2NvbnN0IHVpbnQ4X3QgZmZfc2lsa19zaGVsbF9ibG9ja3NbM11bMl0gPSB7CisgICAgeyA1LCAxMH0sIC8vIE5CCisgICAgeyA4LCAxNX0sIC8vIE1CCisgICAgezEwLCAyMH0gIC8vIFdCCit9OworCitjb25zdCB1aW50OF90IGZmX3NpbGtfcXVhbnRfb2Zmc2V0WzJdWzJdID0geyAvKiAoMC4yMykgKi8KKyAgICB7MjUsIDYwfSwgLy8gSW5hY3RpdmUgb3IgVW52b2ljZWQKKyAgICB7IDgsIDI1fSAgLy8gVm9pY2VkCit9OworCitjb25zdCBpbnQgZmZfc2lsa19zdGVyZW9faW50ZXJwX2xlblszXSA9IHsKKyAgICA2NCwgOTYsIDEyOAorfTsKKworY29uc3QgdWludDE2X3QgZmZfY2VsdF9tb2RlbF90YXBzZXRbXSA9IHsgNCwgMiwgMywgNCB9OworCitjb25zdCB1aW50MTZfdCBmZl9jZWx0X21vZGVsX3NwcmVhZFtdID0geyAzMiwgNywgOSwgMzAsIDMyIH07CisKK2NvbnN0IHVpbnQxNl90IGZmX2NlbHRfbW9kZWxfYWxsb2NfdHJpbVtdID0geworICAgIDEyOCwgICAyLCAgIDQsICAgOSwgIDE5LCAgNDEsICA4NywgMTA5LCAxMTksIDEyNCwgMTI2LCAxMjgKK307CisKK2NvbnN0IHVpbnQxNl90IGZmX2NlbHRfbW9kZWxfZW5lcmd5X3NtYWxsW10gPSB7IDQsIDIsIDMsIDQgfTsKKworY29uc3QgdWludDhfdCBmZl9jZWx0X2ZyZXFfYmFuZHNbXSA9IHsgLyogaW4gc3RlcHMgb2YgMjAwSHogKi8KKyAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsIDEwLCAxMiwgMTQsIDE2LCAyMCwgMjQsIDI4LCAzNCwgNDAsIDQ4LCA2MCwgNzgsIDEwMAorfTsKKworY29uc3QgdWludDhfdCBmZl9jZWx0X2ZyZXFfcmFuZ2VbXSA9IHsKKyAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICA0LCAgNCwgIDQsICA2LCAgNiwgIDgsIDEyLCAxOCwgMjIKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfY2VsdF9sb2dfZnJlcV9yYW5nZVtdID0geworICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOCwgIDgsICA4LCAgOCwgMTYsIDE2LCAxNiwgMjEsIDIxLCAyNCwgMjksIDM0LCAzNgorfTsKKworLyogUG9zaXRpdmUgLSBpbmNyZWFzZWQgZnJlcWV1ZW5jeSByZXNvbHV0aW9uIChvbmx5IHBvc3NpYmxlIG9uIHRyYW5zaWVudHMpCisgKiBOZWdhdGl2ZSAtIGluY3JlYXNlZCB0aW1lIHJlc29sdXRpb24gKi8KK2NvbnN0IGludDhfdCBmZl9jZWx0X3RmX3NlbGVjdFs0XVsyXVsyXVsyXSA9IHsKKyAgICAvKiAgICAgICAgICBPRkYgICAgICAgICAgICAgICAgICAgICAgICBPTiAgICAgICAgICAgICAgICBUcmFuc2llbnQgZnJhbWUgKi8KKyAgICAvKiAgICAgT0ZGICAgICAgICBPTiAgICAgICAgICAgICBPRkYgICAgICAgIE9OICAgICAgICAgICBURiBzZWxlY3QgZmxhZyAgKi8KKyAgICAvKiAgIE9GRiAgT04gICAgT0ZGICBPTiAgICAgICAgT0ZGICBPTiAgICBPRkYgIE9OICAgICAgICBURiBjaGFuZ2UgZmxhZyAgKi8KKyAgICB7IHsgeyAwLCAtMSB9LCB7IDAsIC0xIH0gfSwgeyB7IDAsIC0xIH0sIHsgMCwgLTEgfSB9IH0sIC8qIDEyMCAqLworICAgIHsgeyB7IDAsIC0xIH0sIHsgMCwgLTIgfSB9LCB7IHsgMSwgIDAgfSwgeyAxLCAtMSB9IH0gfSwgLyogMjQwICovCisgICAgeyB7IHsgMCwgLTIgfSwgeyAwLCAtMyB9IH0sIHsgeyAyLCAgMCB9LCB7IDEsIC0xIH0gfSB9LCAvKiA0ODAgKi8KKyAgICB7IHsgeyAwLCAtMiB9LCB7IDAsIC0zIH0gfSwgeyB7IDMsICAwIH0sIHsgMSwgLTEgfSB9IH0gIC8qIDk2MCAqLworfTsKKworY29uc3QgZmxvYXQgZmZfY2VsdF9tZWFuX2VuZXJneVtdID0geworICAgIDYuNDM3NTAwZiwgNi4yNTAwMDBmLCA1Ljc1MDAwMGYsIDUuMzEyNTAwZiwgNS4wNjI1MDBmLAorICAgIDQuODEyNTAwZiwgNC41MDAwMDBmLCA0LjM3NTAwMGYsIDQuODc1MDAwZiwgNC42ODc1MDBmLAorICAgIDQuNTYyNTAwZiwgNC40Mzc1MDBmLCA0Ljg3NTAwMGYsIDQuNjI1MDAwZiwgNC4zMTI1MDBmLAorICAgIDQuNTAwMDAwZiwgNC4zNzUwMDBmLCA0LjYyNTAwMGYsIDQuNzUwMDAwZiwgNC40Mzc1MDBmLAorICAgIDMuNzUwMDAwZiwgMy43NTAwMDBmLCAzLjc1MDAwMGYsIDMuNzUwMDAwZiwgMy43NTAwMDBmCit9OworCitjb25zdCBmbG9hdCBmZl9jZWx0X2FscGhhX2NvZWZbXSA9IHsKKyAgICAyOTQ0MC4wZi8zMjc2OC4wZiwgICAgMjYxMTIuMGYvMzI3NjguMGYsICAgIDIxMjQ4LjBmLzMyNzY4LjBmLCAgICAxNjM4NC4wZi8zMjc2OC4wZgorfTsKKworY29uc3QgZmxvYXQgZmZfY2VsdF9iZXRhX2NvZWZbXSA9IHsKKyAgICAxLjBmIC0gKDMwMTQ3LjBmLzMyNzY4LjBmKSwgMS4wZiAtICgyMjI4Mi4wZi8zMjc2OC4wZiksIDEuMGYgLSAoMTIxMjQuMGYvMzI3NjguMGYpLCAxLjBmIC0gKDY1NTQuMGYvMzI3NjguMGYpLAorfTsKKworY29uc3QgdWludDhfdCBmZl9jZWx0X2NvYXJzZV9lbmVyZ3lfZGlzdFs0XVsyXVs0Ml0gPSB7CisgICAgeworICAgICAgICB7ICAgICAgIC8vIDEyMC1zYW1wbGUgaW50ZXIKKyAgICAgICAgICAgICA3MiwgMTI3LCAgNjUsIDEyOSwgIDY2LCAxMjgsICA2NSwgMTI4LCAgNjQsIDEyOCwgIDYyLCAxMjgsICA2NCwgMTI4LAorICAgICAgICAgICAgIDY0LCAxMjgsICA5MiwgIDc4LCAgOTIsICA3OSwgIDkyLCAgNzgsICA5MCwgIDc5LCAxMTYsICA0MSwgMTE1LCAgNDAsCisgICAgICAgICAgICAxMTQsICA0MCwgMTMyLCAgMjYsIDEzMiwgIDI2LCAxNDUsICAxNywgMTYxLCAgMTIsIDE3NiwgIDEwLCAxNzcsICAxMQorICAgICAgICB9LCB7ICAgIC8vIDEyMC1zYW1wbGUgaW50cmEKKyAgICAgICAgICAgICAyNCwgMTc5LCAgNDgsIDEzOCwgIDU0LCAxMzUsICA1NCwgMTMyLCAgNTMsIDEzNCwgIDU2LCAxMzMsICA1NSwgMTMyLAorICAgICAgICAgICAgIDU1LCAxMzIsICA2MSwgMTE0LCAgNzAsICA5NiwgIDc0LCAgODgsICA3NSwgIDg4LCAgODcsICA3NCwgIDg5LCAgNjYsCisgICAgICAgICAgICAgOTEsICA2NywgMTAwLCAgNTksIDEwOCwgIDUwLCAxMjAsICA0MCwgMTIyLCAgMzcsICA5NywgIDQzLCAgNzgsICA1MAorICAgICAgICB9CisgICAgfSwgeworICAgICAgICB7ICAgICAgIC8vIDI0MC1zYW1wbGUgaW50ZXIKKyAgICAgICAgICAgICA4MywgIDc4LCAgODQsICA4MSwgIDg4LCAgNzUsICA4NiwgIDc0LCAgODcsICA3MSwgIDkwLCAgNzMsICA5MywgIDc0LAorICAgICAgICAgICAgIDkzLCAgNzQsIDEwOSwgIDQwLCAxMTQsICAzNiwgMTE3LCAgMzQsIDExNywgIDM0LCAxNDMsICAxNywgMTQ1LCAgMTgsCisgICAgICAgICAgICAxNDYsICAxOSwgMTYyLCAgMTIsIDE2NSwgIDEwLCAxNzgsICAgNywgMTg5LCAgIDYsIDE5MCwgICA4LCAxNzcsICAgOQorICAgICAgICB9LCB7ICAgIC8vIDI0MC1zYW1wbGUgaW50cmEKKyAgICAgICAgICAgICAyMywgMTc4LCAgNTQsIDExNSwgIDYzLCAxMDIsICA2NiwgIDk4LCAgNjksICA5OSwgIDc0LCAgODksICA3MSwgIDkxLAorICAgICAgICAgICAgIDczLCAgOTEsICA3OCwgIDg5LCAgODYsICA4MCwgIDkyLCAgNjYsICA5MywgIDY0LCAxMDIsICA1OSwgMTAzLCAgNjAsCisgICAgICAgICAgICAxMDQsICA2MCwgMTE3LCAgNTIsIDEyMywgIDQ0LCAxMzgsICAzNSwgMTMzLCAgMzEsICA5NywgIDM4LCAgNzcsICA0NQorICAgICAgICB9CisgICAgfSwgeworICAgICAgICB7ICAgICAgIC8vIDQ4MC1zYW1wbGUgaW50ZXIKKyAgICAgICAgICAgICA2MSwgIDkwLCAgOTMsICA2MCwgMTA1LCAgNDIsIDEwNywgIDQxLCAxMTAsICA0NSwgMTE2LCAgMzgsIDExMywgIDM4LAorICAgICAgICAgICAgMTEyLCAgMzgsIDEyNCwgIDI2LCAxMzIsICAyNywgMTM2LCAgMTksIDE0MCwgIDIwLCAxNTUsICAxNCwgMTU5LCAgMTYsCisgICAgICAgICAgICAxNTgsICAxOCwgMTcwLCAgMTMsIDE3NywgIDEwLCAxODcsICAgOCwgMTkyLCAgIDYsIDE3NSwgICA5LCAxNTksICAxMAorICAgICAgICB9LCB7ICAgIC8vIDQ4MC1zYW1wbGUgaW50cmEKKyAgICAgICAgICAgICAyMSwgMTc4LCAgNTksIDExMCwgIDcxLCAgODYsICA3NSwgIDg1LCAgODQsICA4MywgIDkxLCAgNjYsICA4OCwgIDczLAorICAgICAgICAgICAgIDg3LCAgNzIsICA5MiwgIDc1LCAgOTgsICA3MiwgMTA1LCAgNTgsIDEwNywgIDU0LCAxMTUsICA1MiwgMTE0LCAgNTUsCisgICAgICAgICAgICAxMTIsICA1NiwgMTI5LCAgNTEsIDEzMiwgIDQwLCAxNTAsICAzMywgMTQwLCAgMjksICA5OCwgIDM1LCAgNzcsICA0MgorICAgICAgICB9CisgICAgfSwgeworICAgICAgICB7ICAgICAgIC8vIDk2MC1zYW1wbGUgaW50ZXIKKyAgICAgICAgICAgICA0MiwgMTIxLCAgOTYsICA2NiwgMTA4LCAgNDMsIDExMSwgIDQwLCAxMTcsICA0NCwgMTIzLCAgMzIsIDEyMCwgIDM2LAorICAgICAgICAgICAgMTE5LCAgMzMsIDEyNywgIDMzLCAxMzQsICAzNCwgMTM5LCAgMjEsIDE0NywgIDIzLCAxNTIsICAyMCwgMTU4LCAgMjUsCisgICAgICAgICAgICAxNTQsICAyNiwgMTY2LCAgMjEsIDE3MywgIDE2LCAxODQsICAxMywgMTg0LCAgMTAsIDE1MCwgIDEzLCAxMzksICAxNQorICAgICAgICB9LCB7ICAgIC8vIDk2MC1zYW1wbGUgaW50cmEKKyAgICAgICAgICAgICAyMiwgMTc4LCAgNjMsIDExNCwgIDc0LCAgODIsICA4NCwgIDgzLCAgOTIsICA4MiwgMTAzLCAgNjIsICA5NiwgIDcyLAorICAgICAgICAgICAgIDk2LCAgNjcsIDEwMSwgIDczLCAxMDcsICA3MiwgMTEzLCAgNTUsIDExOCwgIDUyLCAxMjUsICA1MiwgMTE4LCAgNTIsCisgICAgICAgICAgICAxMTcsICA1NSwgMTM1LCAgNDksIDEzNywgIDM5LCAxNTcsICAzMiwgMTQ1LCAgMjksICA5NywgIDMzLCAgNzcsICA0MAorICAgICAgICB9CisgICAgfQorfTsKKworY29uc3QgdWludDhfdCBmZl9jZWx0X3N0YXRpY19hbGxvY1sxMV1bMjFdID0geyAgLyogMS8zMiBiaXQvc2FtcGxlICovCisgICAgeyAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sCisgICAgeyAgOTAsICA4MCwgIDc1LCAgNjksICA2MywgIDU2LCAgNDksICA0MCwgIDM0LCAgMjksICAyMCwgIDE4LCAgMTAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sCisgICAgeyAxMTAsIDEwMCwgIDkwLCAgODQsICA3OCwgIDcxLCAgNjUsICA1OCwgIDUxLCAgNDUsICAzOSwgIDMyLCAgMjYsICAyMCwgIDEyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwIH0sCisgICAgeyAxMTgsIDExMCwgMTAzLCAgOTMsICA4NiwgIDgwLCAgNzUsICA3MCwgIDY1LCAgNTksICA1MywgIDQ3LCAgNDAsICAzMSwgIDIzLCAgMTUsICAgNCwgICAwLCAgIDAsICAgMCwgICAwIH0sCisgICAgeyAxMjYsIDExOSwgMTEyLCAxMDQsICA5NSwgIDg5LCAgODMsICA3OCwgIDcyLCAgNjYsICA2MCwgIDU0LCAgNDcsICAzOSwgIDMyLCAgMjUsICAxNywgIDEyLCAgIDEsICAgMCwgICAwIH0sCisgICAgeyAxMzQsIDEyNywgMTIwLCAxMTQsIDEwMywgIDk3LCAgOTEsICA4NSwgIDc4LCAgNzIsICA2NiwgIDYwLCAgNTQsICA0NywgIDQxLCAgMzUsICAyOSwgIDIzLCAgMTYsICAxMCwgICAxIH0sCisgICAgeyAxNDQsIDEzNywgMTMwLCAxMjQsIDExMywgMTA3LCAxMDEsICA5NSwgIDg4LCAgODIsICA3NiwgIDcwLCAgNjQsICA1NywgIDUxLCAgNDUsICAzOSwgIDMzLCAgMjYsICAxNSwgICAxIH0sCisgICAgeyAxNTIsIDE0NSwgMTM4LCAxMzIsIDEyMywgMTE3LCAxMTEsIDEwNSwgIDk4LCAgOTIsICA4NiwgIDgwLCAgNzQsICA2NywgIDYxLCAgNTUsICA0OSwgIDQzLCAgMzYsICAyMCwgICAxIH0sCisgICAgeyAxNjIsIDE1NSwgMTQ4LCAxNDIsIDEzMywgMTI3LCAxMjEsIDExNSwgMTA4LCAxMDIsICA5NiwgIDkwLCAgODQsICA3NywgIDcxLCAgNjUsICA1OSwgIDUzLCAgNDYsICAzMCwgICAxIH0sCisgICAgeyAxNzIsIDE2NSwgMTU4LCAxNTIsIDE0MywgMTM3LCAxMzEsIDEyNSwgMTE4LCAxMTIsIDEwNiwgMTAwLCAgOTQsICA4NywgIDgxLCAgNzUsICA2OSwgIDYzLCAgNTYsICA0NSwgIDIwIH0sCisgICAgeyAyMDAsIDIwMCwgMjAwLCAyMDAsIDIwMCwgMjAwLCAyMDAsIDIwMCwgMTk4LCAxOTMsIDE4OCwgMTgzLCAxNzgsIDE3MywgMTY4LCAxNjMsIDE1OCwgMTUzLCAxNDgsIDEyOSwgMTA0IH0KK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfY2VsdF9zdGF0aWNfY2Fwc1s0XVsyXVsyMV0gPSB7CisgICAgeyAgICAgICAvLyAxMjAtc2FtcGxlCisgICAgICAgIHsyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMTYwLCAxNjAsCisgICAgICAgICAxNjAsIDE2MCwgMTg1LCAxODUsIDE4NSwgMTc4LCAxNzgsIDE2OCwgMTM0LCAgNjEsICAzN30sCisgICAgICAgIHsyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjI0LCAyMjQsIDIyNCwgMjQwLCAyNDAsCisgICAgICAgICAyNDAsIDI0MCwgMjA3LCAyMDcsIDIwNywgMTk4LCAxOTgsIDE4MywgMTQ0LCAgNjYsICA0MH0sCisgICAgfSwgeyAgICAvLyAyNDAtc2FtcGxlCisgICAgICAgIHsxNjAsIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTYwLCAxNjAsIDE2MCwgMTg1LCAxODUsCisgICAgICAgICAxODUsIDE4NSwgMTkzLCAxOTMsIDE5MywgMTgzLCAxODMsIDE3MiwgMTM4LCAgNjQsICAzOH0sCisgICAgICAgIHsyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwgMjA3LCAyMDcsCisgICAgICAgICAyMDcsIDIwNywgMjA0LCAyMDQsIDIwNCwgMTkzLCAxOTMsIDE4MCwgMTQzLCAgNjYsICA0MH0sCisgICAgfSwgeyAgICAvLyA0ODAtc2FtcGxlCisgICAgICAgIHsxODUsIDE4NSwgMTg1LCAxODUsIDE4NSwgMTg1LCAxODUsIDE4NSwgMTkzLCAxOTMsCisgICAgICAgICAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMTgzLCAxODMsIDE3MiwgMTM4LCAgNjUsICAzOX0sCisgICAgICAgIHsyMDcsIDIwNywgMjA3LCAyMDcsIDIwNywgMjA3LCAyMDcsIDIwNywgMjA0LCAyMDQsCisgICAgICAgICAyMDQsIDIwNCwgMjAxLCAyMDEsIDIwMSwgMTg4LCAxODgsIDE3NiwgMTQxLCAgNjYsICA0MH0sCisgICAgfSwgeyAgICAvLyA5NjAtc2FtcGxlCisgICAgICAgIHsxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsIDE5MywgMTkzLCAxOTMsCisgICAgICAgICAxOTMsIDE5MywgMTk0LCAxOTQsIDE5NCwgMTg0LCAxODQsIDE3MywgMTM5LCAgNjUsICAzOX0sCisgICAgICAgIHsyMDQsIDIwNCwgMjA0LCAyMDQsIDIwNCwgMjA0LCAyMDQsIDIwNCwgMjAxLCAyMDEsCisgICAgICAgICAyMDEsIDIwMSwgMTk4LCAxOTgsIDE5OCwgMTg3LCAxODcsIDE3NSwgMTQwLCAgNjYsICA0MH0KKyAgICB9Cit9OworCitjb25zdCB1aW50OF90IGZmX2NlbHRfY2FjaGVfYml0c1szOTJdID0geworICAgIDQwLCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNDAsIDE1LCAyMywgMjgsCisgICAgMzEsIDM0LCAzNiwgMzgsIDM5LCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDcsIDQ5LCA1MCwKKyAgICA1MSwgNTIsIDUzLCA1NCwgNTUsIDU1LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjMsIDY1LAorICAgIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcxLCA0MCwgMjAsIDMzLCA0MSwgNDgsIDUzLCA1NywgNjEsCisgICAgNjQsIDY2LCA2OSwgNzEsIDczLCA3NSwgNzYsIDc4LCA4MCwgODIsIDg1LCA4NywgODksIDkxLCA5MiwKKyAgICA5NCwgOTYsIDk4LCAxMDEsIDEwMywgMTA1LCAxMDcsIDEwOCwgMTEwLCAxMTIsIDExNCwgMTE3LCAxMTksIDEyMSwgMTIzLAorICAgIDEyNCwgMTI2LCAxMjgsIDQwLCAyMywgMzksIDUxLCA2MCwgNjcsIDczLCA3OSwgODMsIDg3LCA5MSwgOTQsCisgICAgOTcsIDEwMCwgMTAyLCAxMDUsIDEwNywgMTExLCAxMTUsIDExOCwgMTIxLCAxMjQsIDEyNiwgMTI5LCAxMzEsIDEzNSwgMTM5LAorICAgIDE0MiwgMTQ1LCAxNDgsIDE1MCwgMTUzLCAxNTUsIDE1OSwgMTYzLCAxNjYsIDE2OSwgMTcyLCAxNzQsIDE3NywgMTc5LCAzNSwKKyAgICAyOCwgNDksIDY1LCA3OCwgODksIDk5LCAxMDcsIDExNCwgMTIwLCAxMjYsIDEzMiwgMTM2LCAxNDEsIDE0NSwgMTQ5LAorICAgIDE1MywgMTU5LCAxNjUsIDE3MSwgMTc2LCAxODAsIDE4NSwgMTg5LCAxOTIsIDE5OSwgMjA1LCAyMTEsIDIxNiwgMjIwLCAyMjUsCisgICAgMjI5LCAyMzIsIDIzOSwgMjQ1LCAyNTEsIDIxLCAzMywgNTgsIDc5LCA5NywgMTEyLCAxMjUsIDEzNywgMTQ4LCAxNTcsCisgICAgMTY2LCAxNzQsIDE4MiwgMTg5LCAxOTUsIDIwMSwgMjA3LCAyMTcsIDIyNywgMjM1LCAyNDMsIDI1MSwgMTcsIDM1LCA2MywKKyAgICA4NiwgMTA2LCAxMjMsIDEzOSwgMTUyLCAxNjUsIDE3NywgMTg3LCAxOTcsIDIwNiwgMjE0LCAyMjIsIDIzMCwgMjM3LCAyNTAsCisgICAgMjUsIDMxLCA1NSwgNzUsIDkxLCAxMDUsIDExNywgMTI4LCAxMzgsIDE0NiwgMTU0LCAxNjEsIDE2OCwgMTc0LCAxODAsCisgICAgMTg1LCAxOTAsIDIwMCwgMjA4LCAyMTUsIDIyMiwgMjI5LCAyMzUsIDI0MCwgMjQ1LCAyNTUsIDE2LCAzNiwgNjUsIDg5LAorICAgIDExMCwgMTI4LCAxNDQsIDE1OSwgMTczLCAxODUsIDE5NiwgMjA3LCAyMTcsIDIyNiwgMjM0LCAyNDIsIDI1MCwgMTEsIDQxLAorICAgIDc0LCAxMDMsIDEyOCwgMTUxLCAxNzIsIDE5MSwgMjA5LCAyMjUsIDI0MSwgMjU1LCA5LCA0MywgNzksIDExMCwgMTM4LAorICAgIDE2MywgMTg2LCAyMDcsIDIyNywgMjQ2LCAxMiwgMzksIDcxLCA5OSwgMTIzLCAxNDQsIDE2NCwgMTgyLCAxOTgsIDIxNCwKKyAgICAyMjgsIDI0MSwgMjUzLCA5LCA0NCwgODEsIDExMywgMTQyLCAxNjgsIDE5MiwgMjE0LCAyMzUsIDI1NSwgNywgNDksCisgICAgOTAsIDEyNywgMTYwLCAxOTEsIDIyMCwgMjQ3LCA2LCA1MSwgOTUsIDEzNCwgMTcwLCAyMDMsIDIzNCwgNywgNDcsCisgICAgODcsIDEyMywgMTU1LCAxODQsIDIxMiwgMjM3LCA2LCA1MiwgOTcsIDEzNywgMTc0LCAyMDgsIDI0MCwgNSwgNTcsCisgICAgMTA2LCAxNTEsIDE5MiwgMjMxLCA1LCA1OSwgMTExLCAxNTgsIDIwMiwgMjQzLCA1LCA1NSwgMTAzLCAxNDcsIDE4NywKKyAgICAyMjQsIDUsIDYwLCAxMTMsIDE2MSwgMjA2LCAyNDgsIDQsIDY1LCAxMjIsIDE3NSwgMjI0LCA0LCA2NywgMTI3LAorICAgIDE4MiwgMjM0Cit9OworCitjb25zdCBpbnQxNl90IGZmX2NlbHRfY2FjaGVfaW5kZXhbMTA1XSA9IHsKKyAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDAsIDAsIDAsIDAsIDQxLCA0MSwgNDEsCisgICAgODIsIDgyLCAxMjMsIDE2NCwgMjAwLCAyMjIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDQxLAorICAgIDQxLCA0MSwgNDEsIDEyMywgMTIzLCAxMjMsIDE2NCwgMTY0LCAyNDAsIDI2NiwgMjgzLCAyOTUsIDQxLCA0MSwgNDEsCisgICAgNDEsIDQxLCA0MSwgNDEsIDQxLCAxMjMsIDEyMywgMTIzLCAxMjMsIDI0MCwgMjQwLCAyNDAsIDI2NiwgMjY2LCAzMDUsCisgICAgMzE4LCAzMjgsIDMzNiwgMTIzLCAxMjMsIDEyMywgMTIzLCAxMjMsIDEyMywgMTIzLCAxMjMsIDI0MCwgMjQwLCAyNDAsIDI0MCwKKyAgICAzMDUsIDMwNSwgMzA1LCAzMTgsIDMxOCwgMzQzLCAzNTEsIDM1OCwgMzY0LCAyNDAsIDI0MCwgMjQwLCAyNDAsIDI0MCwgMjQwLAorICAgIDI0MCwgMjQwLCAzMDUsIDMwNSwgMzA1LCAzMDUsIDM0MywgMzQzLCAzNDMsIDM1MSwgMzUxLCAzNzAsIDM3NiwgMzgyLCAzODcsCit9OworCitjb25zdCB1aW50OF90IGZmX2NlbHRfbG9nMl9mcmFjW10gPSB7CisgICAgMCwgOCwgMTMsIDE2LCAxOSwgMjEsIDIzLCAyNCwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMyLCAzMywgMzQsIDM0LCAzNSwgMzYsIDM2LCAzNywgMzcKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfY2VsdF9iaXRfaW50ZXJsZWF2ZVtdID0geworICAgIDAsIDEsIDEsIDEsIDIsIDMsIDMsIDMsIDIsIDMsIDMsIDMsIDIsIDMsIDMsIDMKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfY2VsdF9iaXRfZGVpbnRlcmxlYXZlW10gPSB7CisgICAgMHgwMCwgMHgwMywgMHgwQywgMHgwRiwgMHgzMCwgMHgzMywgMHgzQywgMHgzRiwKKyAgICAweEMwLCAweEMzLCAweENDLCAweENGLCAweEYwLCAweEYzLCAweEZDLCAweEZGCit9OworCitjb25zdCB1aW50OF90IGZmX2NlbHRfaGFkYW1hcmRfb3JkZXJbXSA9IHsKKyAgICAxLCAgIDAsCisgICAgMywgICAwLCAgMiwgIDEsCisgICAgNywgICAwLCAgNCwgIDMsICA2LCAgMSwgIDUsICAyLAorICAgIDE1LCAgMCwgIDgsICA3LCAxMiwgIDMsIDExLCAgNCwgMTQsICAxLCAgOSwgIDYsIDEzLCAgMiwgMTAsICA1LAorICAgIDAsICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Cit9OworCitjb25zdCB1aW50MTZfdCBmZl9jZWx0X3FuX2V4cDJbXSA9IHsKKyAgICAxNjM4NCwgMTc4NjYsIDE5NDgzLCAyMTI0NywgMjMxNzAsIDI1MjY3LCAyNzU1NCwgMzAwNDgKK307CisKK2NvbnN0IHVpbnQzMl90IGZmX2NlbHRfcHZxX3VbMTI3Ml0gPSB7CisgICAgLyogTiA9IDAsIEsgPSAwLi4uMTc2ICovCisgICAgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAvKiBOID0gMSwgSyA9IDEuLi4xNzYgKi8KKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIC8qIE4gPSAyLCBLID0gMi4uLjE3NiAqLworICAgIDMsIDUsIDcsIDksIDExLCAxMywgMTUsIDE3LCAxOSwgMjEsIDIzLCAyNSwgMjcsIDI5LCAzMSwgMzMsIDM1LCAzNywgMzksIDQxLAorICAgIDQzLCA0NSwgNDcsIDQ5LCA1MSwgNTMsIDU1LCA1NywgNTksIDYxLCA2MywgNjUsIDY3LCA2OSwgNzEsIDczLCA3NSwgNzcsIDc5LAorICAgIDgxLCA4MywgODUsIDg3LCA4OSwgOTEsIDkzLCA5NSwgOTcsIDk5LCAxMDEsIDEwMywgMTA1LCAxMDcsIDEwOSwgMTExLCAxMTMsCisgICAgMTE1LCAxMTcsIDExOSwgMTIxLCAxMjMsIDEyNSwgMTI3LCAxMjksIDEzMSwgMTMzLCAxMzUsIDEzNywgMTM5LCAxNDEsIDE0MywKKyAgICAxNDUsIDE0NywgMTQ5LCAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsIDE2NSwgMTY3LCAxNjksIDE3MSwgMTczLAorICAgIDE3NSwgMTc3LCAxNzksIDE4MSwgMTgzLCAxODUsIDE4NywgMTg5LCAxOTEsIDE5MywgMTk1LCAxOTcsIDE5OSwgMjAxLCAyMDMsCisgICAgMjA1LCAyMDcsIDIwOSwgMjExLCAyMTMsIDIxNSwgMjE3LCAyMTksIDIyMSwgMjIzLCAyMjUsIDIyNywgMjI5LCAyMzEsIDIzMywKKyAgICAyMzUsIDIzNywgMjM5LCAyNDEsIDI0MywgMjQ1LCAyNDcsIDI0OSwgMjUxLCAyNTMsIDI1NSwgMjU3LCAyNTksIDI2MSwgMjYzLAorICAgIDI2NSwgMjY3LCAyNjksIDI3MSwgMjczLCAyNzUsIDI3NywgMjc5LCAyODEsIDI4MywgMjg1LCAyODcsIDI4OSwgMjkxLCAyOTMsCisgICAgMjk1LCAyOTcsIDI5OSwgMzAxLCAzMDMsIDMwNSwgMzA3LCAzMDksIDMxMSwgMzEzLCAzMTUsIDMxNywgMzE5LCAzMjEsIDMyMywKKyAgICAzMjUsIDMyNywgMzI5LCAzMzEsIDMzMywgMzM1LCAzMzcsIDMzOSwgMzQxLCAzNDMsIDM0NSwgMzQ3LCAzNDksIDM1MSwKKyAgICAvKiBOID0gMywgSyA9IDMuLi4xNzYgKi8KKyAgICAxMywgMjUsIDQxLCA2MSwgODUsIDExMywgMTQ1LCAxODEsIDIyMSwgMjY1LCAzMTMsIDM2NSwgNDIxLCA0ODEsIDU0NSwgNjEzLAorICAgIDY4NSwgNzYxLCA4NDEsIDkyNSwgMTAxMywgMTEwNSwgMTIwMSwgMTMwMSwgMTQwNSwgMTUxMywgMTYyNSwgMTc0MSwgMTg2MSwKKyAgICAxOTg1LCAyMTEzLCAyMjQ1LCAyMzgxLCAyNTIxLCAyNjY1LCAyODEzLCAyOTY1LCAzMTIxLCAzMjgxLCAzNDQ1LCAzNjEzLCAzNzg1LAorICAgIDM5NjEsIDQxNDEsIDQzMjUsIDQ1MTMsIDQ3MDUsIDQ5MDEsIDUxMDEsIDUzMDUsIDU1MTMsIDU3MjUsIDU5NDEsIDYxNjEsIDYzODUsCisgICAgNjYxMywgNjg0NSwgNzA4MSwgNzMyMSwgNzU2NSwgNzgxMywgODA2NSwgODMyMSwgODU4MSwgODg0NSwgOTExMywgOTM4NSwgOTY2MSwKKyAgICA5OTQxLCAxMDIyNSwgMTA1MTMsIDEwODA1LCAxMTEwMSwgMTE0MDEsIDExNzA1LCAxMjAxMywgMTIzMjUsIDEyNjQxLCAxMjk2MSwKKyAgICAxMzI4NSwgMTM2MTMsIDEzOTQ1LCAxNDI4MSwgMTQ2MjEsIDE0OTY1LCAxNTMxMywgMTU2NjUsIDE2MDIxLCAxNjM4MSwgMTY3NDUsCisgICAgMTcxMTMsIDE3NDg1LCAxNzg2MSwgMTgyNDEsIDE4NjI1LCAxOTAxMywgMTk0MDUsIDE5ODAxLCAyMDIwMSwgMjA2MDUsIDIxMDEzLAorICAgIDIxNDI1LCAyMTg0MSwgMjIyNjEsIDIyNjg1LCAyMzExMywgMjM1NDUsIDIzOTgxLCAyNDQyMSwgMjQ4NjUsIDI1MzEzLCAyNTc2NSwKKyAgICAyNjIyMSwgMjY2ODEsIDI3MTQ1LCAyNzYxMywgMjgwODUsIDI4NTYxLCAyOTA0MSwgMjk1MjUsIDMwMDEzLCAzMDUwNSwgMzEwMDEsCisgICAgMzE1MDEsIDMyMDA1LCAzMjUxMywgMzMwMjUsIDMzNTQxLCAzNDA2MSwgMzQ1ODUsIDM1MTEzLCAzNTY0NSwgMzYxODEsIDM2NzIxLAorICAgIDM3MjY1LCAzNzgxMywgMzgzNjUsIDM4OTIxLCAzOTQ4MSwgNDAwNDUsIDQwNjEzLCA0MTE4NSwgNDE3NjEsIDQyMzQxLCA0MjkyNSwKKyAgICA0MzUxMywgNDQxMDUsIDQ0NzAxLCA0NTMwMSwgNDU5MDUsIDQ2NTEzLCA0NzEyNSwgNDc3NDEsIDQ4MzYxLCA0ODk4NSwgNDk2MTMsCisgICAgNTAyNDUsIDUwODgxLCA1MTUyMSwgNTIxNjUsIDUyODEzLCA1MzQ2NSwgNTQxMjEsIDU0NzgxLCA1NTQ0NSwgNTYxMTMsIDU2Nzg1LAorICAgIDU3NDYxLCA1ODE0MSwgNTg4MjUsIDU5NTEzLCA2MDIwNSwgNjA5MDEsIDYxNjAxLAorICAgIC8qIE4gPSA0LCBLID0gNC4uLjE3NiAqLworICAgIDYzLCAxMjksIDIzMSwgMzc3LCA1NzUsIDgzMywgMTE1OSwgMTU2MSwgMjA0NywgMjYyNSwgMzMwMywgNDA4OSwgNDk5MSwgNjAxNywKKyAgICA3MTc1LCA4NDczLCA5OTE5LCAxMTUyMSwgMTMyODcsIDE1MjI1LCAxNzM0MywgMTk2NDksIDIyMTUxLCAyNDg1NywgMjc3NzUsCisgICAgMzA5MTMsIDM0Mjc5LCAzNzg4MSwgNDE3MjcsIDQ1ODI1LCA1MDE4MywgNTQ4MDksIDU5NzExLCA2NDg5NywgNzAzNzUsIDc2MTUzLAorICAgIDgyMjM5LCA4ODY0MSwgOTUzNjcsIDEwMjQyNSwgMTA5ODIzLCAxMTc1NjksIDEyNTY3MSwgMTM0MTM3LCAxNDI5NzUsIDE1MjE5MywKKyAgICAxNjE3OTksIDE3MTgwMSwgMTgyMjA3LCAxOTMwMjUsIDIwNDI2MywgMjE1OTI5LCAyMjgwMzEsIDI0MDU3NywgMjUzNTc1LAorICAgIDI2NzAzMywgMjgwOTU5LCAyOTUzNjEsIDMxMDI0NywgMzI1NjI1LCAzNDE1MDMsIDM1Nzg4OSwgMzc0NzkxLCAzOTIyMTcsCisgICAgNDEwMTc1LCA0Mjg2NzMsIDQ0NzcxOSwgNDY3MzIxLCA0ODc0ODcsIDUwODIyNSwgNTI5NTQzLCA1NTE0NDksIDU3Mzk1MSwKKyAgICA1OTcwNTcsIDYyMDc3NSwgNjQ1MTEzLCA2NzAwNzksIDY5NTY4MSwgNzIxOTI3LCA3NDg4MjUsIDc3NjM4MywgODA0NjA5LAorICAgIDgzMzUxMSwgODYzMDk3LCA4OTMzNzUsIDkyNDM1MywgOTU2MDM5LCA5ODg0NDEsIDEwMjE1NjcsIDEwNTU0MjUsIDEwOTAwMjMsCisgICAgMTEyNTM2OSwgMTE2MTQ3MSwgMTE5ODMzNywgMTIzNTk3NSwgMTI3NDM5MywgMTMxMzU5OSwgMTM1MzYwMSwgMTM5NDQwNywKKyAgICAxNDM2MDI1LCAxNDc4NDYzLCAxNTIxNzI5LCAxNTY1ODMxLCAxNjEwNzc3LCAxNjU2NTc1LCAxNzAzMjMzLCAxNzUwNzU5LAorICAgIDE3OTkxNjEsIDE4NDg0NDcsIDE4OTg2MjUsIDE5NDk3MDMsIDIwMDE2ODksIDIwNTQ1OTEsIDIxMDg0MTcsIDIxNjMxNzUsCisgICAgMjIxODg3MywgMjI3NTUxOSwgMjMzMzEyMSwgMjM5MTY4NywgMjQ1MTIyNSwgMjUxMTc0MywgMjU3MzI0OSwgMjYzNTc1MSwKKyAgICAyNjk5MjU3LCAyNzYzNzc1LCAyODI5MzEzLCAyODk1ODc5LCAyOTYzNDgxLCAzMDMyMTI3LCAzMTAxODI1LCAzMTcyNTgzLAorICAgIDMyNDQ0MDksIDMzMTczMTEsIDMzOTEyOTcsIDM0NjYzNzUsIDM1NDI1NTMsIDM2MTk4MzksIDM2OTgyNDEsIDM3Nzc3NjcsCisgICAgMzg1ODQyNSwgMzk0MDIyMywgNDAyMzE2OSwgNDEwNzI3MSwgNDE5MjUzNywgNDI3ODk3NSwgNDM2NjU5MywgNDQ1NTM5OSwKKyAgICA0NTQ1NDAxLCA0NjM2NjA3LCA0NzI5MDI1LCA0ODIyNjYzLCA0OTE3NTI5LCA1MDEzNjMxLCA1MTEwOTc3LCA1MjA5NTc1LAorICAgIDUzMDk0MzMsIDU0MTA1NTksIDU1MTI5NjEsIDU2MTY2NDcsIDU3MjE2MjUsIDU4Mjc5MDMsIDU5MzU0ODksIDYwNDQzOTEsCisgICAgNjE1NDYxNywgNjI2NjE3NSwgNjM3OTA3MywgNjQ5MzMxOSwgNjYwODkyMSwgNjcyNTg4NywgNjg0NDIyNSwgNjk2Mzk0MywKKyAgICA3MDg1MDQ5LCA3MjA3NTUxLAorICAgIC8qIE4gPSA1LCBLID0gNS4uLjE3NiAqLworICAgIDMyMSwgNjgxLCAxMjg5LCAyMjQxLCAzNjQ5LCA1NjQxLCA4MzYxLCAxMTk2OSwgMTY2NDEsIDIyNTY5LCAyOTk2MSwgMzkwNDEsCisgICAgNTAwNDksIDYzMjQxLCA3ODg4OSwgOTcyODEsIDExODcyMSwgMTQzNTI5LCAxNzIwNDEsIDIwNDYwOSwgMjQxNjAxLCAyODM0MDEsCisgICAgMzMwNDA5LCAzODMwNDEsIDQ0MTcyOSwgNTA2OTIxLCA1NzkwODEsIDY1ODY4OSwgNzQ2MjQxLCA4NDIyNDksIDk0NzI0MSwKKyAgICAxMDYxNzYxLCAxMTg2MzY5LCAxMzIxNjQxLCAxNDY4MTY5LCAxNjI2NTYxLCAxNzk3NDQxLCAxOTgxNDQ5LCAyMTc5MjQxLAorICAgIDIzOTE0ODksIDI2MTg4ODEsIDI4NjIxMjEsIDMxMjE5MjksIDMzOTkwNDEsIDM2OTQyMDksIDQwMDgyMDEsIDQzNDE4MDEsCisgICAgNDY5NTgwOSwgNTA3MTA0MSwgNTQ2ODMyOSwgNTg4ODUyMSwgNjMzMjQ4MSwgNjgwMTA4OSwgNzI5NTI0MSwgNzgxNTg0OSwKKyAgICA4MzYzODQxLCA4OTQwMTYxLCA5NTQ1NzY5LCAxMDE4MTY0MSwgMTA4NDg3NjksIDExNTQ4MTYxLCAxMjI4MDg0MSwgMTMwNDc4NDksCisgICAgMTM4NTAyNDEsIDE0Njg5MDg5LCAxNTU2NTQ4MSwgMTY0ODA1MjEsIDE3NDM1MzI5LCAxODQzMTA0MSwgMTk0Njg4MDksCisgICAgMjA1NDk4MDEsIDIxNjc1MjAxLCAyMjg0NjIwOSwgMjQwNjQwNDEsIDI1MzI5OTI5LCAyNjY0NTEyMSwgMjgwMTA4ODEsCisgICAgMjk0Mjg0ODksIDMwODk5MjQxLCAzMjQyNDQ0OSwgMzQwMDU0NDEsIDM1NjQzNTYxLCAzNzM0MDE2OSwgMzkwOTY2NDEsCisgICAgNDA5MTQzNjksIDQyNzk0NzYxLCA0NDczOTI0MSwgNDY3NDkyNDksIDQ4ODI2MjQxLCA1MDk3MTY4OSwgNTMxODcwODEsCisgICAgNTU0NzM5MjEsIDU3ODMzNzI5LCA2MDI2ODA0MSwgNjI3Nzg0MDksIDY1MzY2NDAxLCA2ODAzMzYwMSwgNzA3ODE2MDksCisgICAgNzM2MTIwNDEsIDc2NTI2NTI5LCA3OTUyNjcyMSwgODI2MTQyODEsIDg1NzkwODg5LCA4OTA1ODI0MSwgOTI0MTgwNDksCisgICAgOTU4NzIwNDEsIDk5NDIxOTYxLCAxMDMwNjk1NjksIDEwNjgxNjY0MSwgMTEwNjY0OTY5LCAxMTQ2MTYzNjEsIDExODY3MjY0MSwKKyAgICAxMjI4MzU2NDksIDEyNzEwNzI0MSwgMTMxNDg5Mjg5LCAxMzU5ODM2ODEsIDE0MDU5MjMyMSwgMTQ1MzE3MTI5LCAxNTAxNjAwNDEsCisgICAgMTU1MTIzMDA5LCAxNjAyMDgwMDEsIDE2NTQxNzAwMSwgMTcwNzUyMDA5LCAxNzYyMTUwNDEsIDE4MTgwODEyOSwgMTg3NTMzMzIxLAorICAgIDE5MzM5MjY4MSwgMTk5Mzg4Mjg5LCAyMDU1MjIyNDEsIDIxMTc5NjY0OSwgMjE4MjEzNjQxLCAyMjQ3NzUzNjEsIDIzMTQ4Mzk2OSwKKyAgICAyMzgzNDE2NDEsIDI0NTM1MDU2OSwgMjUyNTEyOTYxLCAyNTk4MzEwNDEsIDI2NzMwNzA0OSwgMjc0OTQzMjQxLCAyODI3NDE4ODksCisgICAgMjkwNzA1MjgxLCAyOTg4MzU3MjEsIDMwNzEzNTUyOSwgMzE1NjA3MDQxLCAzMjQyNTI2MDksIDMzMzA3NDYwMSwgMzQyMDc1NDAxLAorICAgIDM1MTI1NzQwOSwgMzYwNjIzMDQxLCAzNzAxNzQ3MjksIDM3OTkxNDkyMSwgMzg5ODQ2MDgxLCAzOTk5NzA2ODksIDQxMDI5MTI0MSwKKyAgICA0MjA4MTAyNDksIDQzMTUzMDI0MSwgNDQyNDUzNzYxLCA0NTM1ODMzNjksIDQ2NDkyMTY0MSwgNDc2NDcxMTY5LCA0ODgyMzQ1NjEsCisgICAgNTAwMjE0NDQxLCA1MTI0MTM0NDksIDUyNDgzNDI0MSwgNTM3NDc5NDg5LCA1NTAzNTE4ODEsIDU2MzQ1NDEyMSwgNTc2Nzg4OTI5LAorICAgIDU5MDM1OTA0MSwgNjA0MTY3MjA5LCA2MTgyMTYyMDEsIDYzMjUwODgwMSwKKyAgICAvKiBOID0gNiwgSyA9IDYuLi45NiAodGVjaG5pY2FsbHkgVigxMDksNSkgZml0cyBpbiAzMiBiaXRzLCBidXQgdGhhdCBjYW4ndCBiZQorICAgICBhY2hpZXZlZCBieSBzcGxpdHRpbmcgYW4gT3B1cyBiYW5kKSAqLworICAgIDE2ODMsIDM2NTMsIDcxODMsIDEzMDczLCAyMjM2MywgMzYzNjUsIDU2Njk1LCA4NTMwNSwgMTI0NTE1LCAxNzcwNDUsIDI0NjA0NywKKyAgICAzMzUxMzcsIDQ0ODQyNywgNTkwNTU3LCA3NjY3MjcsIDk4MjcyOSwgMTI0NDk3OSwgMTU2MDU0OSwgMTkzNzE5OSwgMjM4MzQwOSwKKyAgICAyOTA4NDExLCAzNTIyMjIxLCA0MjM1NjcxLCA1MDYwNDQxLCA2MDA5MDkxLCA3MDk1MDkzLCA4MzMyODYzLCA5NzM3NzkzLAorICAgIDExMzI2MjgzLCAxMzExNTc3MywgMTUxMjQ3NzUsIDE3MzcyOTA1LCAxOTg4MDkxNSwgMjI2NzA3MjUsIDI1NzY1NDU1LAorICAgIDI5MTg5NDU3LCAzMjk2ODM0NywgMzcxMjkwMzcsIDQxNjk5NzY3LCA0NjcxMDEzNywgNTIxOTExMzksIDU4MTc1MTg5LAorICAgIDY0Njk2MTU5LCA3MTc4OTQwOSwgNzk0OTE4MTksIDg3ODQxODIxLCA5Njg3OTQzMSwgMTA2NjQ2MjgxLCAxMTcxODU2NTEsCisgICAgMTI4NTQyNTAxLCAxNDA3NjM1MDMsIDE1Mzg5NzA3MywgMTY3OTkzNDAzLCAxODMxMDQ0OTMsIDE5OTI4NDE4MywgMjE2NTg4MTg1LAorICAgIDIzNTA3NDExNSwgMjU0ODAxNTI1LCAyNzU4MzE5MzUsIDI5ODIyODg2NSwgMzIyMDU3ODY3LCAzNDczODY1NTcsIDM3NDI4NDY0NywKKyAgICA0MDI4MjM5NzcsIDQzMzA3ODU0NywgNDY1MTI0NTQ5LCA0OTkwNDAzOTksIDUzNDkwNjc2OSwgNTcyODA2NjE5LCA2MTI4MjUyMjksCisgICAgNjU1MDUwMjMxLCA2OTk1NzE2NDEsIDc0NjQ4MTg5MSwgNzk1ODc1ODYxLCA4NDc4NTA5MTEsIDkwMjUwNjkxMywgOTU5OTQ2MjgzLAorICAgIDEwMjAyNzQwMTMsIDEwODM1OTc3MDMsIDExNTAwMjc1OTMsIDEyMTk2NzY1OTUsIDEyOTI2NjAzMjUsIDEzNjkwOTcxMzUsCisgICAgMTQ0OTEwODE0NSwgMTUzMjgxNzI3NSwgMTYyMDM1MTI3NywgMTcxMTgzOTc2NywgMTgwNzQxNTI1NywgMTkwNzIxMzE4NywKKyAgICAyMDExMzcxOTU3LCAyMTIwMDMyOTU5LAorICAgIC8qIE4gPSA3LCBLID0gNy4uLjU0ICh0ZWNobmljYWxseSBWKDYwLDYpIGZpdHMgaW4gMzIgYml0cywgYnV0IHRoYXQgY2FuJ3QgYmUKKyAgICAgYWNoaWV2ZWQgYnkgc3BsaXR0aW5nIGFuIE9wdXMgYmFuZCkgKi8KKyAgICA4OTg5LCAxOTgyNSwgNDAwODEsIDc1NTE3LCAxMzQyNDUsIDIyNzMwNSwgMzY5MzA1LCA1NzkxMjUsIDg4MDY4NSwgMTMwMzc3NywKKyAgICAxODg0OTYxLCAyNjY4NTI1LCAzNzA3NTA5LCA1MDY0NzkzLCA2ODE0MjQ5LCA5MDQxOTU3LCAxMTg0NzQ4NSwgMTUzNDUyMzMsCisgICAgMTk2NjU4NDEsIDI0OTU3NjYxLCAzMTM4ODI5MywgMzkxNDYxODUsIDQ4NDQyMjk3LCA1OTUxMTgyOSwgNzI2MTYwMTMsCisgICAgODgwNDM5NjksIDEwNjExNDYyNSwgMTI3MTc4NzAxLCAxNTE2MjA3NTcsIDE3OTg2MTMwNSwgMjEyMzU4OTg1LCAyNDk2MTI4MDUsCisgICAgMjkyMTY0NDQ1LCAzNDA2MDA2MjUsIDM5NTU1NTUzNywgNDU3NzEzMzQxLCA1Mjc4MTA3MjUsIDYwNjYzOTUyOSwgNjk1MDQ5NDMzLAorICAgIDc5Mzk1MDcwOSwgOTA0MzE3MDM3LCAxMDI3MTg4Mzg1LCAxMTYzNjczOTUzLCAxMzE0OTU1MTgxLCAxNDgyMjg4ODIxLAorICAgIDE2NjcwMTAwNzMsIDE4NzA1MzU3ODUsIDIwOTQzNjc3MTcsCisgICAgLyogTiA9IDgsIEsgPSA4Li4uMzcgKHRlY2huaWNhbGx5IFYoNDAsNykgZml0cyBpbiAzMiBiaXRzLCBidXQgdGhhdCBjYW4ndCBiZQorICAgICBhY2hpZXZlZCBieSBzcGxpdHRpbmcgYW4gT3B1cyBiYW5kKSAqLworICAgIDQ4NjM5LCAxMDg1NDUsIDIyNDE0MywgNDMzOTA1LCA3OTU0NTUsIDEzOTIwNjUsIDIzNDA0OTUsIDM4MDAzMDUsIDU5ODQ3NjcsCisgICAgOTE3MzUwNSwgMTM3MjY5OTEsIDIwMTAzMDI1LCAyODg3NTMyNywgNDA3NTQzNjksIDU2NjEwNTc1LCA3NzUwMDAxNywKKyAgICAxMDQ2OTI3MzUsIDEzOTcwMzgwOSwgMTg0MzI3MzExLCAyNDA2NzMyNjUsIDMxMTIwNzc0MywgMzk4Nzk2MjI1LCA1MDY3NTAzNTEsCisgICAgNjM4ODc4MTkzLCA3OTk1MzgxNzUsIDk5MzY5Njc2OSwgMTIyNjk5MDA5NSwgMTUwNTc4OTU1MywgMTgzNzI3MTYxNSwKKyAgICAyMjI5NDkxOTA1LAorICAgIC8qIE4gPSA5LCBLID0gOS4uLjI4ICh0ZWNobmljYWxseSBWKDI5LDgpIGZpdHMgaW4gMzIgYml0cywgYnV0IHRoYXQgY2FuJ3QgYmUKKyAgICAgYWNoaWV2ZWQgYnkgc3BsaXR0aW5nIGFuIE9wdXMgYmFuZCkgKi8KKyAgICAyNjU3MjksIDU5ODQxNywgMTI1NjQ2NSwgMjQ4NTgyNSwgNDY3MzM0NSwgODQwNTkwNSwgMTQ1NDY3MDUsIDI0MzMxNzc3LAorICAgIDM5NDkwMDQ5LCA2MjM5MDU0NSwgOTYyMjA1NjEsIDE0NTE5ODkxMywgMjE0ODI4NjA5LCAzMTIxOTM1NTMsIDQ0NjMwNDE0NSwKKyAgICA2Mjg0OTY4OTcsIDg3Mjg5MzQ0MSwgMTE5NjkyNDU2MSwgMTYyMTkyNTEzNywgMjE3MzgwNjE0NSwKKyAgICAvKiBOID0gMTAsIEsgPSAxMC4uLjI0ICovCisgICAgMTQ2MjU2MywgMzMxNzQ0NSwgNzA1OTczNSwgMTQyMTg5MDUsIDI3Mjk4MTU1LCA1MDI1MDc2NSwgODkxMjkyNDcsIDE1Mjk1MTA3MywKKyAgICAyNTQ4MzE2NjcsIDQxMzQ0Mjc3MywgNjU0ODYyMjQ3LCAxMDE0ODg5NzY5LCAxNTQxOTExOTMxLCAyMzAwNDA5NjI5LAorICAgIDMzNzUyMTA2NzEsCisgICAgLyogTiA9IDExLCBLID0gMTEuLi4xOSAodGVjaG5pY2FsbHkgVigyMCwxMCkgZml0cyBpbiAzMiBiaXRzLCBidXQgdGhhdCBjYW4ndCBiZQorICAgICBhY2hpZXZlZCBieSBzcGxpdHRpbmcgYW4gT3B1cyBiYW5kKSAqLworICAgIDgwOTc0NTMsIDE4NDc0NjMzLCAzOTc1MzI3MywgODEyNzAzMzMsIDE1ODgxOTI1MywgMjk4MTk5MjY1LCA1NDAyNzk1ODUsCisgICAgOTQ4MDYyMzI1LCAxNjE2MzM2NzY1LAorICAgIC8qIE4gPSAxMiwgSyA9IDEyLi4uMTggKi8KKyAgICA0NTA0NjcxOSwgMTAzMjc0NjI1LCAyMjQyOTgyMzEsIDQ2NDM4NzgxNywgOTIxNDA2MzM1LCAxNzU5ODg1MTg1LAorICAgIDMyNDgyMjcwOTUsCisgICAgLyogTiA9IDEzLCBLID0gMTMuLi4xNiAqLworICAgIDI1MTU5NTk2OSwgNTc5MTY4ODI1LCAxMjY3ODU0ODczLCAyNjUzNjQ5MDI1LAorICAgIC8qIE4gPSAxNCwgSyA9IDE0ICovCisgICAgMTQwOTkzMzYxOQorfTsKKworY29uc3QgZmxvYXQgZmZfY2VsdF9wb3N0ZmlsdGVyX3RhcHNbM11bM10gPSB7CisgICAgeyAwLjMwNjY0MDYyNTBmLCAwLjIxNzA0MTAxNTZmLCAwLjEyOTYzODY3MTlmIH0sCisgICAgeyAwLjQ2Mzg2NzE4NzVmLCAwLjI2ODA2NjQwNjJmLCAwLjAgICAgICAgICAgIH0sCisgICAgeyAwLjc5OTgwNDY4NzVmLCAwLjEwMDA5NzY1NjJmLCAwLjAgICAgICAgICAgIH0KK307CisKK0RFQ0xBUkVfQUxJR05FRCgzMiwgc3RhdGljIGNvbnN0IGZsb2F0LCBmZl9jZWx0X3dpbmRvd19wYWRkZWQpWzEzNl0gPSB7CisgICAgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsCisgICAgMC4wMDAwMDAwMGYsIDAuMDAwMDAwMDBmLCAwLjAwMDAwMDAwZiwgMC4wMDAwMDAwMGYsCisgICAgNi43Mjg2OTY2ZS0wNWYsIDAuMDAwNjA1NTEzNDhmLCAwLjAwMTY4MTU5NzBmLCAwLjAwMzI5NDc5NjJmLCAwLjAwNTQ0Mzk5NDNmLAorICAgIDAuMDA4MTI3NjkyM2YsIDAuMDExMzQ0MDAxZiwgMC4wMTUwOTA2MzNmLCAwLjAxOTM2NDg4NmYsIDAuMDI0MTYzNjM1ZiwKKyAgICAwLjAyOTQ4MzMxNWYsIDAuMDM1MzE5OTA1ZiwgMC4wNDE2Njg5MTFmLCAwLjA0ODUyNTM0N2YsIDAuMDU1ODgzNzE4ZiwKKyAgICAwLjA2MzczNzk5OWYsIDAuMDcyMDgxNjE2ZiwgMC4wODA5MDc0MjhmLCAwLjA5MDIwNzcwNWYsIDAuMDk5OTc0MTExZiwKKyAgICAwLjExMDE5NzY5ZiwgMC4xMjA4Njg4M2YsIDAuMTMxOTc3MjlmLCAwLjE0MzUxMjE0ZiwgMC4xNTU0NjE3N2YsCisgICAgMC4xNjc4MTM4OWYsIDAuMTgwNTU1NTBmLCAwLjE5MzY3MjkwZiwgMC4yMDcxNTE3MWYsIDAuMjIwOTc2ODJmLAorICAgIDAuMjM1MTMyNDNmLCAwLjI0OTYwMjA4ZiwgMC4yNjQzNjg2MGYsIDAuMjc5NDE0MTlmLCAwLjI5NDcyMDQwZiwKKyAgICAwLjMxMDI2ODE4ZiwgMC4zMjYwMzc4OGYsIDAuMzQyMDA5MzFmLCAwLjM1ODE2MTc3ZiwgMC4zNzQ0NzQwN2YsCisgICAgMC4zOTA5MjQ2MmYsIDAuNDA3NDkxNDJmLCAwLjQyNDE1MjE1ZiwgMC40NDA4ODQyM2YsIDAuNDU3NjY0ODRmLAorICAgIDAuNDc0NDcxMDRmLCAwLjQ5MTI3OTc4ZiwgMC41MDgwNjc5OGYsIDAuNTI0ODEyNjFmLCAwLjU0MTQ5MDc3ZiwKKyAgICAwLjU1ODA3OTczZiwgMC41NzQ1NTcwMWYsIDAuNTkwOTAwNDlmLCAwLjYwNzA4ODQxZiwgMC42MjMwOTk1MWYsCisgICAgMC42Mzg5MTMwNmYsIDAuNjU0NTA4OTZmLCAwLjY2OTg2Nzc2ZiwgMC42ODQ5NzA3N2YsIDAuNjk5ODAwMTBmLAorICAgIDAuNzE0MzM4NzNmLCAwLjcyODU3MDU1ZiwgMC43NDI0ODA0M2YsIDAuNzU2MDU0MjRmLCAwLjc2OTI3ODk1ZiwKKyAgICAwLjc4MjE0MjU3ZiwgMC43OTQ2MzQzMGYsIDAuODA2NzQ0NDVmLCAwLjgxODQ2NDU2ZiwgMC44Mjk3ODczM2YsCisgICAgMC44NDA3MDY2OWYsIDAuODUxMjE3NzlmLCAwLjg2MTMxNjk4ZiwgMC44NzEwMDE4M2YsIDAuODgwMjcxMTFmLAorICAgIDAuODg5MTI0NzlmLCAwLjg5NzU2Mzk4ZiwgMC45MDU1OTA5NGYsIDAuOTEzMjA5MDRmLCAwLjkyMDQyMjcwZiwKKyAgICAwLjkyNzIzNzM4ZiwgMC45MzM2NTk1NWYsIDAuOTM5Njk2NTZmLCAwLjk0NTM1NjcxZiwgMC45NTA2NDkwN2YsCisgICAgMC45NTU1ODM1M2YsIDAuOTYwMTcwNjdmLCAwLjk2NDQyMTcxZiwgMC45NjgzNDg0OWYsIDAuOTcxOTYzMzRmLAorICAgIDAuOTc1Mjc5MDZmLCAwLjk3ODMwODgzZiwgMC45ODEwNjYxNmYsIDAuOTgzNTY0ODBmLCAwLjk4NTgxODY5ZiwKKyAgICAwLjk4Nzg0MTkxZiwgMC45ODk2NDg1NmYsIDAuOTkxMjUyNzRmLCAwLjk5MjY2ODQ5ZiwgMC45OTM5MDk2OWYsCisgICAgMC45OTQ5OTAwNGYsIDAuOTk1OTIyOTdmLCAwLjk5NjcyMTYyZiwgMC45OTczOTg3NGYsIDAuOTk3OTY2NjdmLAorICAgIDAuOTk4NDM3MjhmLCAwLjk5ODgyMTk1ZiwgMC45OTkxMzE0N2YsIDAuOTk5Mzc2MDZmLCAwLjk5OTU2NTI3ZiwKKyAgICAwLjk5OTcwODAyZiwgMC45OTk4MTI0OGYsIDAuOTk5ODg2MTNmLCAwLjk5OTkzNTY1ZiwgMC45OTk5NjY5N2YsCisgICAgMC45OTk5ODUxOGYsIDAuOTk5OTk0NTdmLCAwLjk5OTk5ODU5ZiwgMC45OTk5OTk4MmYsIDEuMDAwMDAwMDBmLAorICAgIDEuMDAwMDAwMDBmLCAxLjAwMDAwMDAwZiwgMS4wMDAwMDAwMGYsIDEuMDAwMDAwMDBmLCAxLjAwMDAwMDAwZiwKKyAgICAxLjAwMDAwMDAwZiwgMS4wMDAwMDAwMGYsIDEuMDAwMDAwMDBmLAorfTsKKworY29uc3QgZmxvYXQgKmZmX2NlbHRfd2luZG93ID0gJmZmX2NlbHRfd2luZG93X3BhZGRlZFs4XTsKKworLyogc3F1YXJlIG9mIHRoZSB3aW5kb3csIHVzZWQgZm9yIHRoZSBwb3N0ZmlsdGVyICovCitjb25zdCBmbG9hdCBmZl9jZWx0X3dpbmRvdzJbMTIwXSA9IHsKKyAgICA0LjUyNzUzNTdlLTA5ZiwgMy42NjY0N2UtMDdmLCAyLjgyNzc3ZS0wNmYsIDEuMDg1NTdlLTA1ZiwgMi45NjM3MWUtMDVmLCA2LjYwNTk0ZS0wNWYsCisgICAgMC4wMDAxMjg2ODZmLCAwLjAwMDIyNzcyN2YsIDAuMDAwMzc0OTk5ZiwgMC4wMDA1ODM4ODFmLCAwLjAwMDg2OTI2NmYsIDAuMDAxMjQ3NWYsCisgICAgMC4wMDE3MzYzZiwgMC4wMDIzNTQ3MWYsIDAuMDAzMTIyOTlmLCAwLjAwNDA2MjUzZiwgMC4wMDUxOTU3NmYsIDAuMDA2NTQ2MDFmLAorICAgIDAuMDA4MTM3NDNmLCAwLjAwOTk5NDgyZiwgMC4wMTIxNDM1ZiwgMC4wMTQ2MDkzZiwgMC4wMTc0MThmLCAwLjAyMDU5NTdmLCAwLjAyNDE2ODRmLAorICAgIDAuMDI4MTYxNWYsIDAuMDMyNjAwM2YsIDAuMDM3NTA5MmYsIDAuMDQyOTExOGYsIDAuMDQ4ODMwOGYsIDAuMDU1Mjg3M2YsIDAuMDYyMzAxMmYsCisgICAgMC4wNjk4OTA4ZiwgMC4wNzgwNzIzZiwgMC4wODY4NjAxZiwgMC4wOTYyNjY0ZiwgMC4xMDYzMDFmLCAwLjExNjk3ZiwgMC4xMjgyOGYsCisgICAgMC4xNDAyMzFmLCAwLjE1MjgyMmYsIDAuMTY2MDQ5ZiwgMC4xNzk5MDVmLCAwLjE5NDM3OWYsIDAuMjA5NDU3ZiwgMC4yMjUxMjNmLCAwLjI0MTM1NmYsCisgICAgMC4yNTgxMzNmLCAwLjI3NTQyOGYsIDAuMjkzMjEyZiwgMC4zMTE0NTNmLCAwLjMzMDExNmYsIDAuMzQ5MTYzZiwgMC4zNjg1NTZmLCAwLjM4ODI1M2YsCisgICAgMC40MDgyMWYsIDAuNDI4MzgyZiwgMC40NDg3MjNmLCAwLjQ2OTE4NWYsIDAuNDg5NzJmLCAwLjUxMDI4ZiwgMC41MzA4MTVmLCAwLjU1MTI3N2YsCisgICAgMC41NzE2MThmLCAwLjU5MTc5ZiwgMC42MTE3NDdmLCAwLjYzMTQ0NGYsIDAuNjUwODM3ZiwgMC42Njk4ODRmLCAwLjY4ODU0N2YsIDAuNzA2Nzg4ZiwKKyAgICAwLjcyNDU3MmYsIDAuNzQxODY3ZiwgMC43NTg2NDRmLCAwLjc3NDg3N2YsIDAuNzkwNTQzZiwgMC44MDU2MjFmLCAwLjgyMDA5NWYsIDAuODMzOTUxZiwKKyAgICAwLjg0NzE3OGYsIDAuODU5NzY5ZiwgMC44NzE3MmYsIDAuODgzMDNmLCAwLjg5MzY5OWYsIDAuOTAzNzM0ZiwgMC45MTMxNGYsIDAuOTIxOTI4ZiwKKyAgICAwLjkzMDEwOWYsIDAuOTM3Njk5ZiwgMC45NDQ3MTNmLCAwLjk1MTE2OWYsIDAuOTU3MDg4ZiwgMC45NjI0OTFmLCAwLjk2NzRmLCAwLjk3MTgzOGYsCisgICAgMC45NzU4MzJmLCAwLjk3OTQwNGYsIDAuOTgyNTgyZiwgMC45ODUzOTFmLCAwLjk4Nzg1N2YsIDAuOTkwMDA1ZiwgMC45OTE4NjNmLCAwLjk5MzQ1NGYsCisgICAgMC45OTQ4MDRmLCAwLjk5NTkzN2YsIDAuOTk2ODc3ZiwgMC45OTc2NDVmLCAwLjk5ODI2NGYsIDAuOTk4NzUzZiwgMC45OTkxMzFmLCAwLjk5OTQxNmYsCisgICAgMC45OTk2MjVmLCAwLjk5OTc3MmYsIDAuOTk5ODcxZiwgMC45OTk5MzRmLCAwLjk5OTk3ZiwgMC45OTk5ODlmLCAwLjk5OTk5N2YsIDAuOTk5OTk5NjRmLCAxLjBmLAorfTsKKworY29uc3QgdWludDMyX3QgKiBjb25zdCBmZl9jZWx0X3B2cV91X3Jvd1sxNV0gPSB7CisgICAgZmZfY2VsdF9wdnFfdSArICAgIDAsIGZmX2NlbHRfcHZxX3UgKyAgMTc2LCBmZl9jZWx0X3B2cV91ICsgIDM1MSwKKyAgICBmZl9jZWx0X3B2cV91ICsgIDUyNSwgZmZfY2VsdF9wdnFfdSArICA2OTgsIGZmX2NlbHRfcHZxX3UgKyAgODcwLAorICAgIGZmX2NlbHRfcHZxX3UgKyAxMDQxLCBmZl9jZWx0X3B2cV91ICsgMTEzMSwgZmZfY2VsdF9wdnFfdSArIDExNzgsCisgICAgZmZfY2VsdF9wdnFfdSArIDEyMDcsIGZmX2NlbHRfcHZxX3UgKyAxMjI2LCBmZl9jZWx0X3B2cV91ICsgMTI0MCwKKyAgICBmZl9jZWx0X3B2cV91ICsgMTI0OCwgZmZfY2VsdF9wdnFfdSArIDEyNTQsIGZmX2NlbHRfcHZxX3UgKyAxMjU3Cit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9vcHVzdGFiLmggYi9saWJhdmNvZGVjL29wdXN0YWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2U1YTQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9vcHVzdGFiLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgQW5kcmV3IEQnQWRkZXNpbworICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTQgTW96aWxsYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDE2IFJvc3Rpc2xhdiBQZWhsaXZhbm92IDxhdG9tbnVrZXJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfT1BVU1RBQl9ICisjZGVmaW5lIEFWQ09ERUNfT1BVU1RBQl9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2NlbHRfYmFuZF9lbmRbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX29wdXNfZGVmYXVsdF9jb3VwbGVkX3N0cmVhbXNbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfc3RlcmVvX3MxW107CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9zdGVyZW9fczJbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3N0ZXJlb19zM1tdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbWlkX29ubHlbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfZnJhbWVfdHlwZV9pbmFjdGl2ZVtdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfZnJhbWVfdHlwZV9hY3RpdmVbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfZ2Fpbl9oaWdoYml0c1szXVs5XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX2dhaW5fbG93Yml0c1tdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfZ2Fpbl9kZWx0YVtdOworCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sc2ZfczFbMl1bMl1bMzNdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbHNmX3MyWzMyXVsxMF07CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sc2ZfczJfZXh0W107CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sc2ZfaW50ZXJwb2xhdGlvbl9vZmZzZXRbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfcGl0Y2hfaGlnaGJpdHNbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfbmJbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfbWJbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2xvd2JpdHNfd2JbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2RlbHRhW107CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9waXRjaF9jb250b3VyX25iMTBtc1tdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfcGl0Y2hfY29udG91cl9uYjIwbXNbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2NvbnRvdXJfbWJ3YjEwbXNbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3BpdGNoX2NvbnRvdXJfbWJ3YjIwbXNbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbHRwX2ZpbHRlcltdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbHRwX2ZpbHRlcjBfc2VsW107CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9sdHBfZmlsdGVyMV9zZWxbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX2x0cF9maWx0ZXIyX3NlbFtdOworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfbHRwX3NjYWxlX2luZGV4W107CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX2xjZ19zZWVkW107CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX2V4Y19yYXRlWzJdWzEwXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfbW9kZWxfcHVsc2VfY291bnRbMTFdWzE5XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX3B1bHNlX2xvY2F0aW9uWzRdWzE2OF07CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX21vZGVsX2V4Y2l0YXRpb25fbHNiW107CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19tb2RlbF9leGNpdGF0aW9uX3NpZ25bM11bMl1bN11bM107CisKK2V4dGVybiBjb25zdCBpbnQxNl90ICBmZl9zaWxrX3N0ZXJlb193ZWlnaHRzW107CisKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9zaWxrX2xzZl9zMl9tb2RlbF9zZWxfbmJtYlszMl1bMTBdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX3NpbGtfbHNmX3MyX21vZGVsX3NlbF93YlszMl1bMTZdOworCitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfc2lsa19sc2ZfcHJlZF93ZWlnaHRzX25ibWJbMl1bOV07CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfc2lsa19sc2ZfcHJlZF93ZWlnaHRzX3diWzJdWzE1XTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX3NpbGtfbHNmX3dlaWdodF9zZWxfbmJtYlszMl1bOV07CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfc2lsa19sc2Zfd2VpZ2h0X3NlbF93YlszMl1bMTVdOworCitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfc2lsa19sc2ZfY29kZWJvb2tfbmJtYlszMl1bMTBdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX3NpbGtfbHNmX2NvZGVib29rX3diWzMyXVsxNl07CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX2xzZl9taW5fc3BhY2luZ19uYm1iW107CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19sc2ZfbWluX3NwYWNpbmdfd2JbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX3NpbGtfbHNmX29yZGVyaW5nX25ibWJbXTsKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9zaWxrX2xzZl9vcmRlcmluZ193YltdOworCitleHRlcm4gY29uc3QgaW50MTZfdCAgZmZfc2lsa19jb3NpbmVbXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX3NpbGtfcGl0Y2hfc2NhbGVbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX3BpdGNoX21pbl9sYWdbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9zaWxrX3BpdGNoX21heF9sYWdbXTsKKworZXh0ZXJuIGNvbnN0IGludDhfdCAgIGZmX3NpbGtfcGl0Y2hfb2Zmc2V0X25iMTBtc1szXVsyXTsKK2V4dGVybiBjb25zdCBpbnQ4X3QgICBmZl9zaWxrX3BpdGNoX29mZnNldF9uYjIwbXNbMTFdWzRdOworZXh0ZXJuIGNvbnN0IGludDhfdCAgIGZmX3NpbGtfcGl0Y2hfb2Zmc2V0X21id2IxMG1zWzEyXVsyXTsKK2V4dGVybiBjb25zdCBpbnQ4X3QgICBmZl9zaWxrX3BpdGNoX29mZnNldF9tYndiMjBtc1szNF1bNF07CisKK2V4dGVybiBjb25zdCBpbnQ4X3QgICBmZl9zaWxrX2x0cF9maWx0ZXIwX3RhcHNbOF1bNV07CitleHRlcm4gY29uc3QgaW50OF90ICAgZmZfc2lsa19sdHBfZmlsdGVyMV90YXBzWzE2XVs1XTsKK2V4dGVybiBjb25zdCBpbnQ4X3QgICBmZl9zaWxrX2x0cF9maWx0ZXIyX3RhcHNbMzJdWzVdOworCitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfc2lsa19sdHBfc2NhbGVfZmFjdG9yW107CisKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9zaWxrX3NoZWxsX2Jsb2Nrc1szXVsyXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX3NpbGtfcXVhbnRfb2Zmc2V0WzJdWzJdOworCitleHRlcm4gY29uc3QgaW50ICAgICAgZmZfc2lsa19zdGVyZW9faW50ZXJwX2xlblszXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGZmX2NlbHRfbW9kZWxfdGFwc2V0W107CitleHRlcm4gY29uc3QgdWludDE2X3QgZmZfY2VsdF9tb2RlbF9zcHJlYWRbXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9jZWx0X21vZGVsX2FsbG9jX3RyaW1bXTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9jZWx0X21vZGVsX2VuZXJneV9zbWFsbFtdOworCitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfY2VsdF9mcmVxX2JhbmRzW107CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfY2VsdF9mcmVxX3JhbmdlW107CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfY2VsdF9sb2dfZnJlcV9yYW5nZVtdOworCitleHRlcm4gY29uc3QgaW50OF90ICAgZmZfY2VsdF90Zl9zZWxlY3RbNF1bMl1bMl1bMl07CisKK2V4dGVybiBjb25zdCBmbG9hdCAgICBmZl9jZWx0X21lYW5fZW5lcmd5W107CisKK2V4dGVybiBjb25zdCBmbG9hdCAgICBmZl9jZWx0X2FscGhhX2NvZWZbXTsKK2V4dGVybiBjb25zdCBmbG9hdCAgICBmZl9jZWx0X2JldGFfY29lZltdOworCitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfY2VsdF9jb2Fyc2VfZW5lcmd5X2Rpc3RbNF1bMl1bNDJdOworCitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfY2VsdF9zdGF0aWNfYWxsb2NbMTFdWzIxXTsKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9jZWx0X3N0YXRpY19jYXBzWzRdWzJdWzIxXTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2NlbHRfY2FjaGVfYml0c1szOTJdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgIGZmX2NlbHRfY2FjaGVfaW5kZXhbMTA1XTsKKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgIGZmX2NlbHRfbG9nMl9mcmFjW107CisKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9jZWx0X2JpdF9pbnRlcmxlYXZlW107CitleHRlcm4gY29uc3QgdWludDhfdCAgZmZfY2VsdF9iaXRfZGVpbnRlcmxlYXZlW107CisKK2V4dGVybiBjb25zdCB1aW50OF90ICBmZl9jZWx0X2hhZGFtYXJkX29yZGVyW107CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBmZl9jZWx0X3FuX2V4cDJbXTsKK2V4dGVybiBjb25zdCB1aW50MzJfdCBmZl9jZWx0X3B2cV91WzEyNzJdOworCitleHRlcm4gY29uc3QgZmxvYXQgICAgZmZfY2VsdF9wb3N0ZmlsdGVyX3RhcHNbM11bM107CisKK2V4dGVybiBjb25zdCBmbG9hdCAgICBmZl9jZWx0X3dpbmRvdzJbMTIwXTsKK2V4dGVybiBjb25zdCBmbG9hdCAgICpmZl9jZWx0X3dpbmRvdzsKKworZXh0ZXJuIGNvbnN0IHVpbnQzMl90ICogY29uc3QgZmZfY2VsdF9wdnFfdV9yb3dbMTVdOworCisjZW5kaWYgLyogQVZDT0RFQ19PUFVTVEFCX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcGFmdmlkZW8uYyBiL2xpYmF2Y29kZWMvcGFmdmlkZW8uYwppbmRleCBjYWIzMTI5Li43YzU4NjFkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BhZnZpZGVvLmMKKysrIGIvbGliYXZjb2RlYy9wYWZ2aWRlby5jCkBAIC03OCw2ICs3OCw3IEBACiB7CiAgICAgUEFGVmlkZW9EZWNDb250ZXh0ICpjID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBpbnQgaTsKKyAgICBpbnQgcmV0OwogCiAgICAgYy0+d2lkdGggID0gYXZjdHgtPndpZHRoOwogICAgIGMtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CkBAIC05MCw2ICs5MSw5IEBACiAgICAgfQogCiAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgcmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZTIoYXZjdHgtPndpZHRoLCBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQsIDI1NiksIGF2Y3R4LT5tYXhfcGl4ZWxzLCBhdmN0eC0+cGl4X2ZtdCwgMCwgYXZjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgYy0+cGljID0gYXZfZnJhbWVfYWxsb2MoKTsKICAgICBpZiAoIWMtPnBpYykKQEAgLTE4MSw2ICsxODUsOCBAQAogICAgICAgICAgICAgZGVuZCAgID0gYy0+ZnJhbWVbcGFnZV0gKyBjLT5mcmFtZV9zaXplOwogICAgICAgICAgICAgb2Zmc2V0ID0gKHggJiAweDdGKSAqIDI7CiAgICAgICAgICAgICBqICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUxNigmYy0+Z2IpICsgb2Zmc2V0OworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjLT5nYikgPCAoaiAtIG9mZnNldCkgKiAxNikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICBvZmZzZXQrKzsKICAgICAgICAgICAgICAgICBpZiAoZHN0ICsgMyAqIGMtPndpZHRoICsgNCA+IGRlbmQpCkBAIC0xOTgsNyArMjA0LDggQEAKICAgICBkbyB7CiAgICAgICAgIHNldF9zcmNfcG9zaXRpb24oYywgJnNyYywgJnNlbmQpOwogICAgICAgICBpZiAoKHNyYyArIDMgKiBjLT53aWR0aCArIDQgPiBzZW5kKSB8fAotICAgICAgICAgICAgKGRzdCArIDMgKiBjLT53aWR0aCArIDQgPiBkZW5kKSkKKyAgICAgICAgICAgIChkc3QgKyAzICogYy0+d2lkdGggKyA0ID4gZGVuZCkgfHwKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjLT5nYikgPCA0KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGNvcHlfYmxvY2s0KGRzdCwgc3JjLCBjLT53aWR0aCwgYy0+d2lkdGgsIDQpOwogICAgICAgICBpKys7CkBAIC0yNjcsMTIgKzI3NCwyMCBAQAogICAgIHVpbnQ4X3QgY29kZSwgKmRzdCwgKmVuZDsKICAgICBpbnQgaSwgZnJhbWUsIHJldDsKIAotICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjLT5waWMpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHBrdC0+c2l6ZSA8IDIpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmYy0+Z2IsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKIAogICAgIGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmYy0+Z2IpOworICAgIGlmICgoY29kZSAmIDB4RikgPiA0IHx8IChjb2RlICYgMHhGKSA9PSAzKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInVua25vd24vaW52YWxpZCBjb2RlIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjLT5waWMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKICAgICBpZiAoY29kZSAmIDB4MjApIHsgIC8vIGZyYW1lIGlzIGtleWZyYW1lCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgICAgICBtZW1zZXQoYy0+ZnJhbWVbaV0sIDAsIGMtPmZyYW1lX3NpemUpOwpAQCAtMzY3LDggKzM4Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidW5rbm93bi9pbnZhbGlkIGNvZGUiKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CiAgICAgfQogCiAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShjLT5waWMtPmRhdGFbMF0sIGMtPnBpYy0+bGluZXNpemVbMF0sCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BhcnNlci5jIGIvbGliYXZjb2RlYy9wYXJzZXIuYwppbmRleCBkMjVkMjYxLi5mNDNiMTk3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvcGFyc2VyLmMKQEAgLTIwLDQ0ICsyMCwxMTMgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdG9taWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgogCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJwYXJzZXIuaCIKIAotc3RhdGljIEFWQ29kZWNQYXJzZXIgKmF2X2ZpcnN0X3BhcnNlciA9IE5VTEw7CisvKiBQYXJzZXJzICovCitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9hYWNfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfYWFjX2xhdG1fcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfYWMzX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2FkeF9wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9ibXBfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfY2F2c3ZpZGVvX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2Nvb2tfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfZGNhX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2RpcmFjX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2RueGhkX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2RweF9wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9kdmF1ZGlvX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2R2YnN1Yl9wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9kdmRzdWJfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfZHZkX25hdl9wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9mbGFjX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2c3MjlfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfZ3NtX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2gyNjFfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfaDI2M19wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9oMjY0X3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX2hldmNfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfbWpwZWdfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfbWxwX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX21wZWc0dmlkZW9fcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfbXBlZ2F1ZGlvX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX21wZWd2aWRlb19wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9vcHVzX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX3BuZ19wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9wbm1fcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfcnYzMF9wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9ydjQwX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX3NiY19wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl9zaXByX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX3Rha19wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl92YzFfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfdm9yYmlzX3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX3ZwM19wYXJzZXI7CitleHRlcm4gQVZDb2RlY1BhcnNlciBmZl92cDhfcGFyc2VyOworZXh0ZXJuIEFWQ29kZWNQYXJzZXIgZmZfdnA5X3BhcnNlcjsKK2V4dGVybiBBVkNvZGVjUGFyc2VyIGZmX3htYV9wYXJzZXI7CisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3BhcnNlcl9saXN0LmMiCisKK3N0YXRpYyBBVk9uY2UgYXZfcGFyc2VyX25leHRfaW5pdCA9IEFWX09OQ0VfSU5JVDsKKworc3RhdGljIHZvaWQgYXZfcGFyc2VyX2luaXRfbmV4dCh2b2lkKQoreworICAgIEFWQ29kZWNQYXJzZXIgKnByZXYgPSBOVUxMLCAqcDsKKyAgICBpbnQgaSA9IDA7CisgICAgd2hpbGUgKChwID0gKEFWQ29kZWNQYXJzZXIqKXBhcnNlcl9saXN0W2krK10pKSB7CisgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgcHJldi0+bmV4dCA9IHA7CisgICAgICAgIHByZXYgPSBwOworICAgIH0KK30KIAogQVZDb2RlY1BhcnNlciAqYXZfcGFyc2VyX25leHQoY29uc3QgQVZDb2RlY1BhcnNlciAqcCkKIHsKKyAgICBmZl90aHJlYWRfb25jZSgmYXZfcGFyc2VyX25leHRfaW5pdCwgYXZfcGFyc2VyX2luaXRfbmV4dCk7CisKICAgICBpZiAocCkKICAgICAgICAgcmV0dXJuIHAtPm5leHQ7CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gYXZfZmlyc3RfcGFyc2VyOworICAgICAgICByZXR1cm4gKEFWQ29kZWNQYXJzZXIqKXBhcnNlcl9saXN0WzBdOworfQorCitjb25zdCBBVkNvZGVjUGFyc2VyICphdl9wYXJzZXJfaXRlcmF0ZSh2b2lkICoqb3BhcXVlKQoreworICAgIHVpbnRwdHJfdCBpID0gKHVpbnRwdHJfdCkqb3BhcXVlOworICAgIGNvbnN0IEFWQ29kZWNQYXJzZXIgKnAgPSBwYXJzZXJfbGlzdFtpXTsKKworICAgIGlmIChwKQorICAgICAgICAqb3BhcXVlID0gKHZvaWQqKShpICsgMSk7CisKKyAgICByZXR1cm4gcDsKIH0KIAogdm9pZCBhdl9yZWdpc3Rlcl9jb2RlY19wYXJzZXIoQVZDb2RlY1BhcnNlciAqcGFyc2VyKQogewotICAgIGRvIHsKLSAgICAgICAgcGFyc2VyLT5uZXh0ID0gYXZfZmlyc3RfcGFyc2VyOwotICAgIH0gd2hpbGUgKHBhcnNlci0+bmV4dCAhPSBhdnByaXZfYXRvbWljX3B0cl9jYXMoKHZvaWQgKiB2b2xhdGlsZSAqKSZhdl9maXJzdF9wYXJzZXIsIHBhcnNlci0+bmV4dCwgcGFyc2VyKSk7CisgICAgZmZfdGhyZWFkX29uY2UoJmF2X3BhcnNlcl9uZXh0X2luaXQsIGF2X3BhcnNlcl9pbml0X25leHQpOwogfQogCiBBVkNvZGVjUGFyc2VyQ29udGV4dCAqYXZfcGFyc2VyX2luaXQoaW50IGNvZGVjX2lkKQogewogICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzID0gTlVMTDsKLSAgICBBVkNvZGVjUGFyc2VyICpwYXJzZXI7CisgICAgY29uc3QgQVZDb2RlY1BhcnNlciAqcGFyc2VyOworICAgIHZvaWQgKmkgPSAwOwogICAgIGludCByZXQ7CiAKICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBmb3IgKHBhcnNlciA9IGF2X2ZpcnN0X3BhcnNlcjsgcGFyc2VyOyBwYXJzZXIgPSBwYXJzZXItPm5leHQpIHsKKyAgICB3aGlsZSAoKHBhcnNlciA9IGF2X3BhcnNlcl9pdGVyYXRlKCZpKSkpIHsKICAgICAgICAgaWYgKHBhcnNlci0+Y29kZWNfaWRzWzBdID09IGNvZGVjX2lkIHx8CiAgICAgICAgICAgICBwYXJzZXItPmNvZGVjX2lkc1sxXSA9PSBjb2RlY19pZCB8fAogICAgICAgICAgICAgcGFyc2VyLT5jb2RlY19pZHNbMl0gPT0gY29kZWNfaWQgfHwKQEAgLTcxLDcgKzE0MCw3IEBACiAgICAgcyA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWQ29kZWNQYXJzZXJDb250ZXh0KSk7CiAgICAgaWYgKCFzKQogICAgICAgICBnb3RvIGVycl9vdXQ7Ci0gICAgcy0+cGFyc2VyID0gcGFyc2VyOworICAgIHMtPnBhcnNlciA9IChBVkNvZGVjUGFyc2VyKilwYXJzZXI7CiAgICAgcy0+cHJpdl9kYXRhID0gYXZfbWFsbG9jeihwYXJzZXItPnByaXZfZGF0YV9zaXplKTsKICAgICBpZiAoIXMtPnByaXZfZGF0YSkKICAgICAgICAgZ290byBlcnJfb3V0OwpAQCAtMTQxLDYgKzIxMCw4IEBACiAgICAgaW50IGluZGV4LCBpOwogICAgIHVpbnQ4X3QgZHVtbXlfYnVmW0FWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkVdOwogCisgICAgYXZfYXNzZXJ0MShhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSk7CisKICAgICAvKiBQYXJzZXJzIG9ubHkgd29yayBmb3IgdGhlIHNwZWNpZmllZCBjb2RlYyBpZHMuICovCiAgICAgYXZfYXNzZXJ0MShhdmN0eC0+Y29kZWNfaWQgPT0gcy0+cGFyc2VyLT5jb2RlY19pZHNbMF0gfHwKICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBzLT5wYXJzZXItPmNvZGVjX2lkc1sxXSB8fApAQCAtMTgwLDYgKzI1MSwxMSBAQAogICAgIGluZGV4ID0gcy0+cGFyc2VyLT5wYXJzZXJfcGFyc2UocywgYXZjdHgsIChjb25zdCB1aW50OF90ICoqKSBwb3V0YnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG91dGJ1Zl9zaXplLCBidWYsIGJ1Zl9zaXplKTsKICAgICBhdl9hc3NlcnQwKGluZGV4ID4gLTB4MjAwMDAwMDApOyAvLyBUaGUgQVBJIGRvZXMgbm90IGFsbG93IHJldHVybmluZyBBVkVSUk9SIGNvZGVzCisjZGVmaW5lIEZJTEwobmFtZSkgaWYocy0+bmFtZSA+IDAgJiYgYXZjdHgtPm5hbWUgPD0gMCkgYXZjdHgtPm5hbWUgPSBzLT5uYW1lCisgICAgaWYgKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBGSUxMKGZpZWxkX29yZGVyKTsKKyAgICB9CisKICAgICAvKiB1cGRhdGUgdGhlIGZpbGUgcG9pbnRlciAqLwogICAgIGlmICgqcG91dGJ1Zl9zaXplKSB7CiAgICAgICAgIC8qIGZpbGwgdGhlIGRhdGEgZm9yIHRoZSBjdXJyZW50IGZyYW1lICovCkBAIC0yNDQsNyArMzIwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipidWYsIGludCAqYnVmX3NpemUpCiB7CiAgICAgaWYgKHBjLT5vdmVycmVhZCkgewotICAgICAgICBmZl9kbG9nKE5VTEwsICJvdmVycmVhZCAlZCwgc3RhdGU6JVggbmV4dDolZCBpbmRleDolZCBvX2luZGV4OiVkXG4iLAorICAgICAgICBmZl9kbG9nKE5VTEwsICJvdmVycmVhZCAlZCwgc3RhdGU6JSJQUklYMzIiIG5leHQ6JWQgaW5kZXg6JWQgb19pbmRleDolZFxuIiwKICAgICAgICAgICAgICAgICBwYy0+b3ZlcnJlYWQsIHBjLT5zdGF0ZSwgbmV4dCwgcGMtPmluZGV4LCBwYy0+b3ZlcnJlYWRfaW5kZXgpOwogICAgICAgICBmZl9kbG9nKE5VTEwsICIlWCAlWCAlWCAlWFxuIiwKICAgICAgICAgICAgICAgICAoKmJ1ZilbMF0sICgqYnVmKVsxXSwgKCpidWYpWzJdLCAoKmJ1ZilbM10pOwpAQCAtMjc3LDYgKzM1Myw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKKyAgICBhdl9hc3NlcnQwKG5leHQgPj0gMCB8fCBwYy0+YnVmZmVyKTsKKwogICAgICpidWZfc2l6ZSAgICAgICAgICA9CiAgICAgcGMtPm92ZXJyZWFkX2luZGV4ID0gcGMtPmluZGV4ICsgbmV4dDsKIApAQCAtMzA3LDcgKzM4NSw3IEBACiAgICAgfQogCiAgICAgaWYgKHBjLT5vdmVycmVhZCkgewotICAgICAgICBmZl9kbG9nKE5VTEwsICJvdmVycmVhZCAlZCwgc3RhdGU6JVggbmV4dDolZCBpbmRleDolZCBvX2luZGV4OiVkXG4iLAorICAgICAgICBmZl9kbG9nKE5VTEwsICJvdmVycmVhZCAlZCwgc3RhdGU6JSJQUklYMzIiIG5leHQ6JWQgaW5kZXg6JWQgb19pbmRleDolZFxuIiwKICAgICAgICAgICAgICAgICBwYy0+b3ZlcnJlYWQsIHBjLT5zdGF0ZSwgbmV4dCwgcGMtPmluZGV4LCBwYy0+b3ZlcnJlYWRfaW5kZXgpOwogICAgICAgICBmZl9kbG9nKE5VTEwsICIlWCAlWCAlWCAlWFxuIiwKICAgICAgICAgICAgICAgICAoKmJ1ZilbMF0sICgqYnVmKVsxXSwgKCpidWYpWzJdLCAoKmJ1ZilbM10pOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wY20tYmx1cmF5LmMgYi9saWJhdmNvZGVjL3BjbS1ibHVyYXkuYwppbmRleCAyMmMxYzA4Li41MTdkN2I1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BjbS1ibHVyYXkuYworKysgYi9saWJhdmNvZGVjL3BjbS1ibHVyYXkuYwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICAgIGZmX2Rsb2coYXZjdHgsCiAgICAgICAgICAgICAgICAgInBjbV9ibHVyYXlfcGFyc2VfaGVhZGVyOiAlZCBjaGFubmVscywgJWQgYml0cyBwZXIgc2FtcGxlLCAlZCBIeiwgJSJQUklkNjQiIGJpdC9zXG4iLAogICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwKLSAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUsIChpbnQ2NF90KWF2Y3R4LT5iaXRfcmF0ZSk7CisgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlLCBhdmN0eC0+Yml0X3JhdGUpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BjbS1kdmQuYyBiL2xpYmF2Y29kZWMvcGNtLWR2ZC5jCmluZGV4IGE3OGMwNWQuLjBhNzUxYTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcGNtLWR2ZC5jCisrKyBiL2xpYmF2Y29kZWMvcGNtLWR2ZC5jCkBAIC0zMyw3ICszMyw3IEBACiAgICAgaW50IGJsb2NrX3NpemU7ICAgICAgICAgIC8vIFNpemUgb2YgYSBibG9jayBvZiBzYW1wbGVzIGluIGJ5dGVzCiAgICAgaW50IGxhc3RfYmxvY2tfc2l6ZTsgICAgIC8vIFNpemUgb2YgdGhlIGxhc3QgYmxvY2sgb2Ygc2FtcGxlcyBpbiBieXRlcwogICAgIGludCBzYW1wbGVzX3Blcl9ibG9jazsgICAvLyBOdW1iZXIgb2Ygc2FtcGxlcyBwZXIgY2hhbm5lbCBwZXIgYmxvY2sKLSAgICBpbnQgZ3JvdXBzX3Blcl9ibG9jazsgICAgLy8gTnVtYmVyIG9mIDIwLzI0Yml0IHNhbXBsZSBncm91cHMgcGVyIGJsb2NrCisgICAgaW50IGdyb3Vwc19wZXJfYmxvY2s7ICAgIC8vIE51bWJlciBvZiAyMC8yNC1iaXQgc2FtcGxlIGdyb3VwcyBwZXIgYmxvY2sKICAgICB1aW50OF90ICpleHRyYV9zYW1wbGVzOyAgLy8gUG9pbnRlciB0byBsZWZ0b3ZlciBzYW1wbGVzIGZyb20gYSBmcmFtZQogICAgIGludCBleHRyYV9zYW1wbGVfY291bnQ7ICAvLyBOdW1iZXIgb2YgbGVmdG92ZXIgc2FtcGxlcyBpbiB0aGUgYnVmZmVyCiB9IFBDTURWRENvbnRleHQ7CkBAIC0xMDYsNyArMTA2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgKgogICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CiAKLSAgICAvKiA0IHNhbXBsZXMgZm9ybSBhIGdyb3VwIGluIDIwLzI0Yml0IFBDTSBvbiBEVkQgVmlkZW8uCisgICAgLyogNCBzYW1wbGVzIGZvcm0gYSBncm91cCBpbiAyMC8yNC1iaXQgUENNIG9uIERWRCBWaWRlby4KICAgICAgKiBBIGJsb2NrIGlzIGZvcm1lZCBieSB0aGUgbnVtYmVyIG9mIGdyb3VwcyB0aGF0IGFyZQogICAgICAqIG5lZWRlZCB0byBjb21wbGV0ZSBhIHNldCBvZiBzYW1wbGVzIGZvciBlYWNoIGNoYW5uZWwuICovCiAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpIHsKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgICBmZl9kbG9nKGF2Y3R4LAogICAgICAgICAgICAgICAgICJwY21fZHZkX3BhcnNlX2hlYWRlcjogJWQgY2hhbm5lbHMsICVkIGJpdHMgcGVyIHNhbXBsZSwgJWQgSHosICUiUFJJZDY0IiBiaXQvc1xuIiwKICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMsIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsCi0gICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlLCAoaW50NjRfdClhdmN0eC0+Yml0X3JhdGUpOworICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSwgYXZjdHgtPmJpdF9yYXRlKTsKIAogICAgIHMtPmxhc3RfaGVhZGVyID0gaGVhZGVyX2ludDsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wY20uYyBiL2xpYmF2Y29kZWMvcGNtLmMKaW5kZXggOWExMzYwMi4uOGMzMjZjNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wY20uYworKysgYi9saWJhdmNvZGVjL3BjbS5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTE0NSw2ICsxNDYsNyBAQAogICAgICAgICBFTkNPREVfUExBTkFSKHVpbnQ4X3QsIGJ5dGUsIGRzdCwgbiwgMCwgLTEyOCkKICAgICAgICAgYnJlYWs7CiAjaWYgSEFWRV9CSUdFTkRJQU4KKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TNjRMRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRMRToKICAgICAgICAgRU5DT0RFKGludDY0X3QsIGxlNjQsIHNhbXBsZXMsIGRzdCwgbiwgMCwgMCkKICAgICAgICAgYnJlYWs7CkBAIC0xNjMsOSArMTY1LDExIEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NEJFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M2NEJFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkJFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFOgogI2Vsc2UKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TNjRCRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKICAgICAgICAgRU5DT0RFKGludDY0X3QsIGJlNjQsIHNhbXBsZXMsIGRzdCwgbiwgMCwgMCkKICAgICAgICAgYnJlYWs7CkBAIC0xODEsNiArMTg1LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjY0TEU6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyTEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzY0TEU6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CiAjZW5kaWYgLyogSEFWRV9CSUdFTkRJQU4gKi8KQEAgLTIyMSw2ICsyMjYsOCBAQAogCiB0eXBlZGVmIHN0cnVjdCBQQ01EZWNvZGUgewogICAgIHNob3J0ICAgdGFibGVbMjU2XTsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKKyAgICBmbG9hdCAgIHNjYWxlOwogfSBQQ01EZWNvZGU7CiAKIHN0YXRpYyBhdl9jb2xkIGludCBwY21fZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQpAQCAtMjQyLDYgKzI0OSwxMyBAQAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCiAgICAgICAgICAgICBzLT50YWJsZVtpXSA9IHVsYXcybGluZWFyKGkpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMTZMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMjRMRToKKyAgICAgICAgcy0+c2NhbGUgPSAxLiAvICgxIDw8IChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC0gMSkpOworICAgICAgICBzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYygwKTsKKyAgICAgICAgaWYgKCFzLT5mZHNwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMjU0LDYgKzI2OCwxNSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgYXZfY29sZCBpbnQgcGNtX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUENNRGVjb2RlICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2ZyZWVwKCZzLT5mZHNwKTsKKworICAgIHJldHVybiAwOworfQorCiAvKioKICAqIFJlYWQgUENNIHNhbXBsZXMgbWFjcm8KICAqIEBwYXJhbSBzaXplICAgRGF0YSBzaXplIG9mIG5hdGl2ZSBtYWNoaW5lIGZvcm1hdApAQCAtMzkwLDExICs0MTMsMTQgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICNpZiBIQVZFX0JJR0VORElBTgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M2NExFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NExFOgogICAgICAgICBERUNPREUoNjQsIGxlNjQsIHNyYywgc2FtcGxlcywgbiwgMCwgMCkKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjMyTEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjI0TEU6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjE2TEU6CiAgICAgICAgIERFQ09ERSgzMiwgbGUzMiwgc3JjLCBzYW1wbGVzLCBuLCAwLCAwKQogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJMRV9QTEFOQVI6CkBAIC00MDgsOSArNDM0LDExIEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NEJFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M2NEJFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkJFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFOgogI2Vsc2UKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TNjRCRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKICAgICAgICAgREVDT0RFKDY0LCBiZTY0LCBzcmMsIHNhbXBsZXMsIG4sIDAsIDApCiAgICAgICAgIGJyZWFrOwpAQCAtNDI2LDYgKzQ1NCw5IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NExFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkxFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YyNExFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YxNkxFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M2NExFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MzMkxFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkxFOgogI2VuZGlmIC8qIEhBVkVfQklHRU5ESUFOICovCkBAIC00ODcsNiArNTE4LDE0IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9GMTZMRSB8fAorICAgICAgICBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0YyNExFKSB7CisgICAgICAgIHMtPmZkc3AtPnZlY3Rvcl9mbXVsX3NjYWxhcigoZmxvYXQgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKWZyYW1lLT5leHRlbmRlZF9kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c2NhbGUsIEZGQUxJR04oZnJhbWUtPm5iX3NhbXBsZXMgKiBhdmN0eC0+Y2hhbm5lbHMsIDQpKTsKKyAgICAgICAgZW1tc19jKCk7CisgICAgfQorCiAgICAgKmdvdF9mcmFtZV9wdHIgPSAxOwogCiAgICAgcmV0dXJuIGJ1Zl9zaXplOwpAQCAtNTIyLDYgKzU2MSw3IEBACiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfICMjIGlkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihQQ01EZWNvZGUpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAuaW5pdCAgICAgICAgICAgPSBwY21fZGVjb2RlX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLmNsb3NlICAgICAgICAgID0gcGNtX2RlY29kZV9jbG9zZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIC5kZWNvZGUgICAgICAgICA9IHBjbV9kZWNvZGVfZnJhbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSl7IHNhbXBsZV9mbXRfLCAgICAgICAgICAgXApAQCAtNTQxLDYgKzU4MSw4IEBACiAKIC8qIE5vdGU6IERvIG5vdCBmb3JnZXQgdG8gYWRkIG5ldyBlbnRyaWVzIHRvIHRoZSBNYWtlZmlsZSBhcyB3ZWxsLiAqLwogUENNX0NPREVDICAoUENNX0FMQVcsICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsIHBjbV9hbGF3LCAgICAgICAgICJQQ00gQS1sYXcgLyBHLjcxMSBBLWxhdyIpOworUENNX0RFQ09ERVIoUENNX0YxNkxFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsIHBjbV9mMTZsZSwgICAgICAgICJQQ00gMTYuOCBmbG9hdGluZyBwb2ludCBsaXR0bGUtZW5kaWFuIik7CitQQ01fREVDT0RFUihQQ01fRjI0TEUsICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwgcGNtX2YyNGxlLCAgICAgICAgIlBDTSAyNC4wIGZsb2F0aW5nIHBvaW50IGxpdHRsZS1lbmRpYW4iKTsKIFBDTV9DT0RFQyAgKFBDTV9GMzJCRSwgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxULCBwY21fZjMyYmUsICAgICAgICAiUENNIDMyLWJpdCBmbG9hdGluZyBwb2ludCBiaWctZW5kaWFuIik7CiBQQ01fQ09ERUMgIChQQ01fRjMyTEUsICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwgcGNtX2YzMmxlLCAgICAgICAgIlBDTSAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbGl0dGxlLWVuZGlhbiIpOwogUENNX0NPREVDICAoUENNX0Y2NEJFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsIHBjbV9mNjRiZSwgICAgICAgICJQQ00gNjQtYml0IGZsb2F0aW5nIHBvaW50IGJpZy1lbmRpYW4iKTsKQEAgLTU2OCw0ICs2MTAsNSBAQAogUENNX0NPREVDICAoUENNX1UzMkJFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzIsIHBjbV91MzJiZSwgICAgICAgICJQQ00gdW5zaWduZWQgMzItYml0IGJpZy1lbmRpYW4iKTsKIFBDTV9DT0RFQyAgKFBDTV9VMzJMRSwgICAgICAgIEFWX1NBTVBMRV9GTVRfUzMyLCBwY21fdTMybGUsICAgICAgICAiUENNIHVuc2lnbmVkIDMyLWJpdCBsaXR0bGUtZW5kaWFuIik7CiBQQ01fREVDT0RFUihQQ01fWk9SSywgICAgICAgICBBVl9TQU1QTEVfRk1UX1U4LCAgcGNtX3pvcmssICAgICAgICAgIlBDTSBab3JrIik7Ci0KK1BDTV9DT0RFQyAgKFBDTV9TNjRCRSwgICAgICAgIEFWX1NBTVBMRV9GTVRfUzY0LCBwY21fczY0YmUsICAgICAgICAiUENNIHNpZ25lZCA2NC1iaXQgYmlnLWVuZGlhbiIpOworUENNX0NPREVDICAoUENNX1M2NExFLCAgICAgICAgQVZfU0FNUExFX0ZNVF9TNjQsIHBjbV9zNjRsZSwgICAgICAgICJQQ00gc2lnbmVkIDY0LWJpdCBsaXR0bGUtZW5kaWFuIik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BjbV90YWJsZWdlbi5oIGIvbGliYXZjb2RlYy9wY21fdGFibGVnZW4uaAppbmRleCA3MjY5OTc3Li43Y2UxNDdmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BjbV90YWJsZWdlbi5oCisrKyBiL2xpYmF2Y29kZWMvcGNtX3RhYmxlZ2VuLmgKQEAgLTM2LDEwICszNiw3IEBACiAKICNkZWZpbmUgICAgICAgICBCSUFTICAgICAgICAgICAgKDB4ODQpICAgICAgLyogQmlhcyBmb3IgbGluZWFyIGNvZGUuICovCiAKLS8qCi0gKiBhbGF3MmxpbmVhcigpIC0gQ29udmVydCBhbiBBLWxhdyB2YWx1ZSB0byAxNi1iaXQgbGluZWFyIFBDTQotICoKLSAqLworLyogYWxhdzJsaW5lYXIoKSAtIENvbnZlcnQgYW4gQS1sYXcgdmFsdWUgdG8gMTYtYml0IGxpbmVhciBQQ00gKi8KIHN0YXRpYyBhdl9jb2xkIGludCBhbGF3MmxpbmVhcih1bnNpZ25lZCBjaGFyIGFfdmFsKQogewogICAgICAgICBpbnQgdDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcGN4LmMgYi9saWJhdmNvZGVjL3BjeC5jCmluZGV4IDFkM2VlOGQuLjU4YTVlMWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcGN4LmMKKysrIGIvbGliYXZjb2RlYy9wY3guYwpAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAorI2RlZmluZSBQQ1hfSEVBREVSX1NJWkUgMTI4CisKIHN0YXRpYyB2b2lkIHBjeF9ybGVfZGVjb2RlKEdldEJ5dGVDb250ZXh0ICpnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBieXRlc19wZXJfc2NhbmxpbmUsCkBAIC03NCw4ICs3NiwxMCBAQAogICAgICAgICAgICAgICAgICBieXRlc19wZXJfc2NhbmxpbmU7CiAgICAgdWludDhfdCAqcHRyLCAqc2NhbmxpbmU7CiAKLSAgICBpZiAoYXZwa3QtPnNpemUgPCAxMjgpCisgICAgaWYgKGF2cGt0LT5zaXplIDwgUENYX0hFQURFUl9TSVpFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFja2V0IHRvbyBzbWFsbFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KIAogICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BjeGVuYy5jIGIvbGliYXZjb2RlYy9wY3hlbmMuYwppbmRleCBmMGZmZWRmLi42MTM1OTQ0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BjeGVuYy5jCisrKyBiL2xpYmF2Y29kZWMvcGN4ZW5jLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAqIEBmaWxlCiAgKiBQQ1ggaW1hZ2UgZW5jb2RlcgogICogQGF1dGhvciBEYW5pZWwgVmVya2FtcAotICogQHNlZSBodHRwOi8vd3d3LnF6eC5jb20vcGMtZ3BlL3BjeC50eHQKKyAqIEBzZWUgaHR0cDovL2Jlc3Bpbi5vcmcvfnF6L3BjLWdwZS9wY3gudHh0CiAgKi8KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcGdzc3ViZGVjLmMgYi9saWJhdmNvZGVjL3Bnc3N1YmRlYy5jCmluZGV4IDA3YTJhNzguLjhjMTBmNmQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcGdzc3ViZGVjLmMKKysrIGIvbGliYXZjb2RlYy9wZ3NzdWJkZWMuYwpAQCAtMzAwLDggKzMwMCwxMSBAQAogCiAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZvYmplY3QtPnJsZSwgJm9iamVjdC0+cmxlX2J1ZmZlcl9zaXplLCBybGVfYml0bWFwX2xlbik7CiAKLSAgICBpZiAoIW9iamVjdC0+cmxlKQorICAgIGlmICghb2JqZWN0LT5ybGUpIHsKKyAgICAgICAgb2JqZWN0LT5ybGVfZGF0YV9sZW4gPSAwOworICAgICAgICBvYmplY3QtPnJsZV9yZW1haW5pbmdfbGVuID0gMDsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CiAKICAgICBtZW1jcHkob2JqZWN0LT5ybGUsIGJ1ZiwgYnVmX3NpemUpOwogICAgIG9iamVjdC0+cmxlX2RhdGFfbGVuID0gYnVmX3NpemU7CkBAIC0zNTQsOCArMzU3LDE0IEBACiAgICAgICAgIGNiICAgICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CiAgICAgICAgIGFscGhhICAgICA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJmJ1Zik7CiAKLSAgICAgICAgWVVWX1RPX1JHQjEoY2IsIGNyKTsKLSAgICAgICAgWVVWX1RPX1JHQjIociwgZywgYiwgeSk7CisgICAgICAgIC8qIERlZmF1bHQgdG8gQlQuNzA5IGNvbG9yc3BhY2UuIEluIGNhc2Ugb2YgPD0gNTc2IGhlaWdodCB1c2UgQlQuNjAxICovCisgICAgICAgIGlmIChhdmN0eC0+aGVpZ2h0IDw9IDAgfHwgYXZjdHgtPmhlaWdodCA+IDU3NikgeworICAgICAgICAgICAgWVVWX1RPX1JHQjFfQ0NJUl9CVDcwOShjYiwgY3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgWVVWX1RPX1JHQjFfQ0NJUihjYiwgY3IpOworICAgICAgICB9CisKKyAgICAgICAgWVVWX1RPX1JHQjJfQ0NJUihyLCBnLCBiLCB5KTsKIAogICAgICAgICBmZl9kbG9nKGF2Y3R4LCAiQ29sb3IgJWQgOj0gKCVkLCVkLCVkLCVkKVxuIiwgY29sb3JfaWQsIHIsIGcsIGIsIGFscGhhKTsKIApAQCAtNTIzLDggKzUzMiw2IEBACiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RfY291bnQ7IGkrKykgewogICAgICAgICBQR1NTdWJPYmplY3QgKm9iamVjdDsKLSAgICAgICAgQVZTdWJ0aXRsZVJlY3QgKnJlY3Q7Ci0gICAgICAgIGludCBqOwogCiAgICAgICAgIHN1Yi0+cmVjdHNbaV0gID0gYXZfbWFsbG9jeihzaXplb2YoKnN1Yi0+cmVjdHNbMF0pKTsKICAgICAgICAgaWYgKCFzdWItPnJlY3RzW2ldKSB7CkBAIC01NTIsMTIgKzU1OSwxMyBAQAogCiAgICAgICAgIHN1Yi0+cmVjdHNbaV0tPnggICAgPSBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLng7CiAgICAgICAgIHN1Yi0+cmVjdHNbaV0tPnkgICAgPSBjdHgtPnByZXNlbnRhdGlvbi5vYmplY3RzW2ldLnk7Ci0gICAgICAgIHN1Yi0+cmVjdHNbaV0tPncgICAgPSBvYmplY3QtPnc7Ci0gICAgICAgIHN1Yi0+cmVjdHNbaV0tPmggICAgPSBvYmplY3QtPmg7Ci0KLSAgICAgICAgc3ViLT5yZWN0c1tpXS0+bGluZXNpemVbMF0gPSBvYmplY3QtPnc7CiAKICAgICAgICAgaWYgKG9iamVjdC0+cmxlKSB7CisgICAgICAgICAgICBzdWItPnJlY3RzW2ldLT53ICAgID0gb2JqZWN0LT53OworICAgICAgICAgICAgc3ViLT5yZWN0c1tpXS0+aCAgICA9IG9iamVjdC0+aDsKKworICAgICAgICAgICAgc3ViLT5yZWN0c1tpXS0+bGluZXNpemVbMF0gPSBvYmplY3QtPnc7CisKICAgICAgICAgICAgIGlmIChvYmplY3QtPnJsZV9yZW1haW5pbmdfbGVuKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJSTEUgZGF0YSBsZW5ndGggJXUgaXMgJXUgYnl0ZXMgc2hvcnRlciB0aGFuIGV4cGVjdGVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QtPnJsZV9kYXRhX2xlbiwgb2JqZWN0LT5ybGVfcmVtYWluaW5nX2xlbik7CkBAIC01OTEsMTEgKzU5OSwxNSBAQAogCiAjaWYgRkZfQVBJX0FWUElDVFVSRQogRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworeworICAgICAgICBBVlN1YnRpdGxlUmVjdCAqcmVjdDsKKyAgICAgICAgaW50IGo7CiAgICAgICAgIHJlY3QgPSBzdWItPnJlY3RzW2ldOwogICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CiAgICAgICAgICAgICByZWN0LT5waWN0LmRhdGFbal0gPSByZWN0LT5kYXRhW2pdOwogICAgICAgICAgICAgcmVjdC0+cGljdC5saW5lc2l6ZVtqXSA9IHJlY3QtPmxpbmVzaXplW2pdOwogICAgICAgICB9Cit9CiBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICNlbmRpZgogICAgIH0KQEAgLTY2NCw2ICs2NzYsMTEgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRElTUExBWV9TRUdNRU5UOgorICAgICAgICAgICAgaWYgKCpkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkR1cGxpY2F0ZSBkaXNwbGF5IHNlZ21lbnRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXQgPSBkaXNwbGF5X2VuZF9zZWdtZW50KGF2Y3R4LCBkYXRhLCBidWYsIHNlZ21lbnRfbGVuZ3RoKTsKICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKICAgICAgICAgICAgICAgICAqZGF0YV9zaXplID0gcmV0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9waWN0b3JkZWMuYyBiL2xpYmF2Y29kZWMvcGljdG9yZGVjLmMKaW5kZXggZmY2ZWI3Zi4uYjI5YTQ4NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9waWN0b3JkZWMuYworKysgYi9saWJhdmNvZGVjL3BpY3RvcmRlYy5jCkBAIC01NywxMiArNTcsMTIgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHBpY21lbXNldChQaWNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSwgaW50IHZhbHVlLCBpbnQgcnVuLAorc3RhdGljIHZvaWQgcGljbWVtc2V0KFBpY0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lLCB1bnNpZ25lZCB2YWx1ZSwgaW50IHJ1biwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgKngsIGludCAqeSwgaW50ICpwbGFuZSwgaW50IGJpdHNfcGVyX3BsYW5lKQogewogICAgIHVpbnQ4X3QgKmQ7CiAgICAgaW50IHNoaWZ0ID0gKnBsYW5lICogYml0c19wZXJfcGxhbmU7Ci0gICAgaW50IG1hc2sgID0gKCgxIDw8IGJpdHNfcGVyX3BsYW5lKSAtIDEpIDw8IHNoaWZ0OworICAgIHVuc2lnbmVkIG1hc2sgID0gKCgxVSA8PCBiaXRzX3Blcl9wbGFuZSkgLSAxKSA8PCBzaGlmdDsKICAgICB2YWx1ZSAgIDw8PSBzaGlmdDsKIAogICAgIHdoaWxlIChydW4gPiAwKSB7CkBAIC03NywxMCArNzcsMTAgQEAKICAgICAgICAgICAgICAgICBpZiAoKnkgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgKnkgPSBzLT5oZWlnaHQgLSAxOwogICAgICAgICAgICAgICAgICAgICpwbGFuZSArPSAxOworICAgICAgICAgICAgICAgICAgIGlmICgqcGxhbmUgPj0gcy0+bmJfcGxhbmVzKQorICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPDw9IGJpdHNfcGVyX3BsYW5lOwogICAgICAgICAgICAgICAgICAgIG1hc2sgIDw8PSBiaXRzX3Blcl9wbGFuZTsKLSAgICAgICAgICAgICAgICAgICBpZiAoKnBsYW5lID49IHMtPm5iX3BsYW5lcykKLSAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDIsNyArMTQyLDcgQEAKIAogICAgIGlmIChhdl9pbWFnZV9jaGVja19zaXplKHMtPndpZHRoLCBzLT5oZWlnaHQsIDAsIGF2Y3R4KSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAocy0+d2lkdGggIT0gYXZjdHgtPndpZHRoICYmIHMtPmhlaWdodCAhPSBhdmN0eC0+aGVpZ2h0KSB7CisgICAgaWYgKHMtPndpZHRoICE9IGF2Y3R4LT53aWR0aCB8fCBzLT5oZWlnaHQgIT0gYXZjdHgtPmhlaWdodCkgewogICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgcy0+d2lkdGgsIHMtPmhlaWdodCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTIzNiw3ICsyMzYsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHggPCBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgaWYgKHBsYW5lIDwgcy0+bmJfcGxhbmVzICYmIHggPCBhdmN0eC0+d2lkdGgpIHsKICAgICAgICAgICAgIGludCBydW4gPSAoeSArIDEpICogYXZjdHgtPndpZHRoIC0geDsKICAgICAgICAgICAgIGlmIChiaXRzX3Blcl9wbGFuZSA9PSA4KQogICAgICAgICAgICAgICAgIHBpY21lbXNldF84YnBwKHMsIGZyYW1lLCB2YWwsIHJ1biwgJngsICZ5KTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcGl4YmxvY2tkc3AuYyBiL2xpYmF2Y29kZWMvcGl4YmxvY2tkc3AuYwppbmRleCBmMDg4M2QzLi41MGUxZDFkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BpeGJsb2NrZHNwLmMKKysrIGIvbGliYXZjb2RlYy9waXhibG9ja2RzcC5jCkBAIC0yNSwyMCArMjUsMjAgQEAKICNpbmNsdWRlICJwaXhibG9ja2RzcC5oIgogCiBzdGF0aWMgdm9pZCBnZXRfcGl4ZWxzXzE2X2MoaW50MTZfdCAqYXZfcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgQVZfQ09QWTEyOFUoYmxvY2sgKyAwICogOCwgcGl4ZWxzICsgMCAqIGxpbmVfc2l6ZSk7Ci0gICAgQVZfQ09QWTEyOFUoYmxvY2sgKyAxICogOCwgcGl4ZWxzICsgMSAqIGxpbmVfc2l6ZSk7Ci0gICAgQVZfQ09QWTEyOFUoYmxvY2sgKyAyICogOCwgcGl4ZWxzICsgMiAqIGxpbmVfc2l6ZSk7Ci0gICAgQVZfQ09QWTEyOFUoYmxvY2sgKyAzICogOCwgcGl4ZWxzICsgMyAqIGxpbmVfc2l6ZSk7Ci0gICAgQVZfQ09QWTEyOFUoYmxvY2sgKyA0ICogOCwgcGl4ZWxzICsgNCAqIGxpbmVfc2l6ZSk7Ci0gICAgQVZfQ09QWTEyOFUoYmxvY2sgKyA1ICogOCwgcGl4ZWxzICsgNSAqIGxpbmVfc2l6ZSk7Ci0gICAgQVZfQ09QWTEyOFUoYmxvY2sgKyA2ICogOCwgcGl4ZWxzICsgNiAqIGxpbmVfc2l6ZSk7Ci0gICAgQVZfQ09QWTEyOFUoYmxvY2sgKyA3ICogOCwgcGl4ZWxzICsgNyAqIGxpbmVfc2l6ZSk7CisgICAgQVZfQ09QWTEyOFUoYmxvY2sgKyAwICogOCwgcGl4ZWxzICsgMCAqIHN0cmlkZSk7CisgICAgQVZfQ09QWTEyOFUoYmxvY2sgKyAxICogOCwgcGl4ZWxzICsgMSAqIHN0cmlkZSk7CisgICAgQVZfQ09QWTEyOFUoYmxvY2sgKyAyICogOCwgcGl4ZWxzICsgMiAqIHN0cmlkZSk7CisgICAgQVZfQ09QWTEyOFUoYmxvY2sgKyAzICogOCwgcGl4ZWxzICsgMyAqIHN0cmlkZSk7CisgICAgQVZfQ09QWTEyOFUoYmxvY2sgKyA0ICogOCwgcGl4ZWxzICsgNCAqIHN0cmlkZSk7CisgICAgQVZfQ09QWTEyOFUoYmxvY2sgKyA1ICogOCwgcGl4ZWxzICsgNSAqIHN0cmlkZSk7CisgICAgQVZfQ09QWTEyOFUoYmxvY2sgKyA2ICogOCwgcGl4ZWxzICsgNiAqIHN0cmlkZSk7CisgICAgQVZfQ09QWTEyOFUoYmxvY2sgKyA3ICogOCwgcGl4ZWxzICsgNyAqIHN0cmlkZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGdldF9waXhlbHNfOF9jKGludDE2X3QgKmF2X3Jlc3RyaWN0IGJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKICAgICBpbnQgaTsKIApAQCAtNTIsMTMgKzUyLDEzIEBACiAgICAgICAgIGJsb2NrWzVdID0gcGl4ZWxzWzVdOwogICAgICAgICBibG9ja1s2XSA9IHBpeGVsc1s2XTsKICAgICAgICAgYmxvY2tbN10gPSBwaXhlbHNbN107Ci0gICAgICAgIHBpeGVscyAgKz0gbGluZV9zaXplOworICAgICAgICBwaXhlbHMgICs9IHN0cmlkZTsKICAgICAgICAgYmxvY2sgICArPSA4OwogICAgIH0KIH0KIAogc3RhdGljIHZvaWQgZGlmZl9waXhlbHNfYyhpbnQxNl90ICphdl9yZXN0cmljdCBibG9jaywgY29uc3QgdWludDhfdCAqczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyLCBpbnQgc3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzMiwgcHRyZGlmZl90IHN0cmlkZSkKIHsKICAgICBpbnQgaTsKIApAQCAtODIsNiArODIsNyBAQAogewogICAgIGNvbnN0IHVuc2lnbmVkIGhpZ2hfYml0X2RlcHRoID0gYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPiA4OwogCisgICAgYy0+ZGlmZl9waXhlbHNfdW5hbGlnbmVkID0KICAgICBjLT5kaWZmX3BpeGVscyA9IGRpZmZfcGl4ZWxzX2M7CiAKICAgICBzd2l0Y2ggKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlKSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BpeGJsb2NrZHNwLmggYi9saWJhdmNvZGVjL3BpeGJsb2NrZHNwLmgKaW5kZXggNzllZDg2Yy4uZTAzNjcwMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9waXhibG9ja2RzcC5oCisrKyBiL2xpYmF2Y29kZWMvcGl4YmxvY2tkc3AuaApAQCAtMjEsMTYgKzIxLDIzIEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogCiB0eXBlZGVmIHN0cnVjdCBQaXhibG9ja0RTUENvbnRleHQgewotICAgIHZvaWQgKCpnZXRfcGl4ZWxzKShpbnQxNl90ICpibG9jayAvKiBhbGlnbiAxNiAqLywKKyAgICB2b2lkICgqZ2V0X3BpeGVscykoaW50MTZfdCAqYXZfcmVzdHJpY3QgYmxvY2sgLyogYWxpZ24gMTYgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscyAvKiBhbGlnbiA4ICovLAotICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKTsKLSAgICB2b2lkICgqZGlmZl9waXhlbHMpKGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovLAorICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKKyAgICB2b2lkICgqZGlmZl9waXhlbHMpKGludDE2X3QgKmF2X3Jlc3RyaWN0IGJsb2NrIC8qIGFsaWduIDE2ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqczEgLyogYWxpZ24gOCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyIC8qIGFsaWduIDggKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOworICAgIHZvaWQgKCpkaWZmX3BpeGVsc191bmFsaWduZWQpKGludDE2X3QgKmF2X3Jlc3RyaWN0IGJsb2NrIC8qIGFsaWduIDE2ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqczEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOworCiB9IFBpeGJsb2NrRFNQQ29udGV4dDsKIAogdm9pZCBmZl9waXhibG9ja2RzcF9pbml0KFBpeGJsb2NrRFNQQ29udGV4dCAqYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcGl4bGV0LmMgYi9saWJhdmNvZGVjL3BpeGxldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYTJjZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3BpeGxldC5jCkBAIC0wLDAgKzEsNzA3IEBACisvKgorICogQXBwbGUgUGl4bGV0IGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludG1hdGguaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ1bmFyeS5oIgorCisjZGVmaW5lIE5CX0xFVkVMUyA0CisKKyNkZWZpbmUgUElYTEVUX01BR0lDIDB4REVBREJFRUYKKworI2RlZmluZSBIIDAKKyNkZWZpbmUgViAxCisKK3R5cGVkZWYgc3RydWN0IFN1YkJhbmQgeworICAgIHVuc2lnbmVkIHdpZHRoLCBoZWlnaHQ7CisgICAgdW5zaWduZWQgc2l6ZTsKKyAgICB1bnNpZ25lZCB4LCB5OworfSBTdWJCYW5kOworCit0eXBlZGVmIHN0cnVjdCBQaXhsZXRDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIEdldEJpdENvbnRleHQgYmM7CisKKyAgICBpbnQgbGV2ZWxzOworICAgIGludCBkZXB0aDsKKyAgICBpbnQgdywgaDsKKworICAgIGludDE2X3QgKmZpbHRlclsyXTsKKyAgICBpbnQxNl90ICpwcmVkaWN0aW9uOworICAgIGludDY0X3Qgc2NhbGluZ1s0XVsyXVtOQl9MRVZFTFNdOworICAgIFN1YkJhbmQgYmFuZFs0XVtOQl9MRVZFTFMgKiAzICsgMV07Cit9IFBpeGxldENvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBwaXhsZXRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPnBpeF9mbXQgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjBQMTY7CisgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9idWZmZXJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQaXhsZXRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJmN0eC0+ZmlsdGVyWzBdKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5maWx0ZXJbMV0pOworICAgIGF2X2ZyZWVwKCZjdHgtPnByZWRpY3Rpb24pOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcGl4bGV0X2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQaXhsZXRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGZyZWVfYnVmZmVycyhhdmN0eCk7CisgICAgY3R4LT53ID0gMDsKKyAgICBjdHgtPmggPSAwOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfZGVjb2RlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUGl4bGV0Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcGxhbmU7CisKKyAgICBjdHgtPmZpbHRlclswXSAgPSBhdl9tYWxsb2NfYXJyYXkoY3R4LT5oLCBzaXplb2YoaW50MTZfdCkpOworICAgIGN0eC0+ZmlsdGVyWzFdICA9IGF2X21hbGxvY19hcnJheShGRk1BWChjdHgtPmgsIGN0eC0+dykgKyAxNiwgc2l6ZW9mKGludDE2X3QpKTsKKyAgICBjdHgtPnByZWRpY3Rpb24gPSBhdl9tYWxsb2NfYXJyYXkoKGN0eC0+dyA+PiBOQl9MRVZFTFMpLCBzaXplb2YoaW50MTZfdCkpOworICAgIGlmICghY3R4LT5maWx0ZXJbMF0gfHwgIWN0eC0+ZmlsdGVyWzFdIHx8ICFjdHgtPnByZWRpY3Rpb24pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCAzOyBwbGFuZSsrKSB7CisgICAgICAgIHVuc2lnbmVkIHNoaWZ0ID0gcGxhbmUgPiAwOworICAgICAgICB1bnNpZ25lZCB3ICAgICA9IGN0eC0+dyA+PiBzaGlmdDsKKyAgICAgICAgdW5zaWduZWQgaCAgICAgPSBjdHgtPmggPj4gc2hpZnQ7CisKKyAgICAgICAgY3R4LT5iYW5kW3BsYW5lXVswXS53aWR0aCAgPSAgdyA+PiBOQl9MRVZFTFM7CisgICAgICAgIGN0eC0+YmFuZFtwbGFuZV1bMF0uaGVpZ2h0ID0gIGggPj4gTkJfTEVWRUxTOworICAgICAgICBjdHgtPmJhbmRbcGxhbmVdWzBdLnNpemUgICA9ICh3ID4+IE5CX0xFVkVMUykgKiAoaCA+PiBOQl9MRVZFTFMpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQl9MRVZFTFMgKiAzOyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHNjYWxlID0gY3R4LT5sZXZlbHMgLSAoaSAvIDMpOworCisgICAgICAgICAgICBjdHgtPmJhbmRbcGxhbmVdW2kgKyAxXS53aWR0aCAgPSAgdyA+PiBzY2FsZTsKKyAgICAgICAgICAgIGN0eC0+YmFuZFtwbGFuZV1baSArIDFdLmhlaWdodCA9ICBoID4+IHNjYWxlOworICAgICAgICAgICAgY3R4LT5iYW5kW3BsYW5lXVtpICsgMV0uc2l6ZSAgID0gKHcgPj4gc2NhbGUpICogKGggPj4gc2NhbGUpOworCisgICAgICAgICAgICBjdHgtPmJhbmRbcGxhbmVdW2kgKyAxXS54ID0gKHcgPj4gc2NhbGUpICogKCgoaSArIDEpICUgMykgIT0gMik7CisgICAgICAgICAgICBjdHgtPmJhbmRbcGxhbmVdW2kgKyAxXS55ID0gKGggPj4gc2NhbGUpICogKCgoaSArIDEpICUgMykgIT0gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2xvd19jb2VmZnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQxNl90ICpkc3QsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBwdHJkaWZmX3Qgc3RyaWRlKQoreworICAgIFBpeGxldENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCAqYmMgPSAmY3R4LT5iYzsKKyAgICB1bnNpZ25lZCBjbnQxLCBuYml0cywgaywgaiA9IDAsIGkgPSAwOworICAgIGludDY0X3QgdmFsdWUsIHN0YXRlID0gMzsKKyAgICBpbnQgcmxlbiwgZXNjYXBlLCBmbGFnID0gMDsKKworICAgIHdoaWxlIChpIDwgc2l6ZSkgeworICAgICAgICBuYml0cyA9IEZGTUlOKGZmX2Nseigoc3RhdGUgPj4gOCkgKyAzKSBeIDB4MUYsIDE0KTsKKworICAgICAgICBjbnQxID0gZ2V0X3VuYXJ5KGJjLCAwLCA4KTsKKyAgICAgICAgaWYgKGNudDEgPCA4KSB7CisgICAgICAgICAgICB2YWx1ZSA9IHNob3dfYml0cyhiYywgbmJpdHMpOworICAgICAgICAgICAgaWYgKHZhbHVlIDw9IDEpIHsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoYmMsIG5iaXRzIC0gMSk7CisgICAgICAgICAgICAgICAgZXNjYXBlID0gKCgxIDw8IG5iaXRzKSAtIDEpICogY250MTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGJjLCBuYml0cyk7CisgICAgICAgICAgICAgICAgZXNjYXBlID0gdmFsdWUgKyAoKDEgPDwgbmJpdHMpIC0gMSkgKiBjbnQxIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVzY2FwZSA9IGdldF9iaXRzKGJjLCAxNik7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZSAgICA9IC0oKGVzY2FwZSArIGZsYWcpICYgMSkgfCAxOworICAgICAgICBkc3RbaisrXSA9IHZhbHVlICogKChlc2NhcGUgKyBmbGFnICsgMSkgPj4gMSk7CisgICAgICAgIGkrKzsKKyAgICAgICAgaWYgKGogPT0gd2lkdGgpIHsKKyAgICAgICAgICAgIGogICAgPSAwOworICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IDEyMCAqIChlc2NhcGUgKyBmbGFnKSArIHN0YXRlIC0gKDEyMCAqIHN0YXRlID4+IDgpOworICAgICAgICBmbGFnICA9IDA7CisKKyAgICAgICAgaWYgKHN0YXRlICogNFVMTCA+IDB4RkYgfHwgaSA+PSBzaXplKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbmJpdHMgID0gKChzdGF0ZSArIDgpID4+IDUpICsgKHN0YXRlID8gZmZfY2x6KHN0YXRlKSA6IDMyKSAtIDI0OworICAgICAgICBlc2NhcGUgPSBhdl9tb2RfdWludHAyKDE2MzgzLCBuYml0cyk7CisgICAgICAgIGNudDEgICA9IGdldF91bmFyeShiYywgMCwgOCk7CisgICAgICAgIGlmIChjbnQxID4gNykgeworICAgICAgICAgICAgcmxlbiA9IGdldF9iaXRzKGJjLCAxNik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZSA9IHNob3dfYml0cyhiYywgbmJpdHMpOworICAgICAgICAgICAgaWYgKHZhbHVlID4gMSkgeworICAgICAgICAgICAgICAgIHNraXBfYml0cyhiYywgbmJpdHMpOworICAgICAgICAgICAgICAgIHJsZW4gPSB2YWx1ZSArIGVzY2FwZSAqIGNudDEgLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoYmMsIG5iaXRzIC0gMSk7CisgICAgICAgICAgICAgICAgcmxlbiA9IGVzY2FwZSAqIGNudDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmxlbiA+IHNpemUgLSBpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGkgKz0gcmxlbjsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmxlbjsgaysrKSB7CisgICAgICAgICAgICBkc3RbaisrXSA9IDA7CisgICAgICAgICAgICBpZiAoaiA9PSB3aWR0aCkgeworICAgICAgICAgICAgICAgIGogICAgPSAwOworICAgICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0ZSA9IDA7CisgICAgICAgIGZsYWcgID0gcmxlbiA8IDB4RkZGRiA/IDEgOiAwOworICAgIH0KKworICAgIGFsaWduX2dldF9iaXRzKGJjKTsKKyAgICByZXR1cm4gZ2V0X2JpdHNfY291bnQoYmMpID4+IDM7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oaWdoX2NvZWZmcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKnNyYywgaW50MTZfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgYywgaW50IGEsIGludCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgcHRyZGlmZl90IHN0cmlkZSkKK3sKKyAgICBQaXhsZXRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJpdENvbnRleHQgKmJjID0gJmN0eC0+YmM7CisgICAgdW5zaWduZWQgY250MSwgc2hiaXRzLCBybGVuLCBuYml0cywgbGVuZ3RoLCBpID0gMCwgaiA9IDAsIGs7CisgICAgaW50IHJldCwgZXNjYXBlLCBwZngsIHZhbHVlLCB5ZmxhZywgeGZsYWcsIGZsYWcgPSAwOworICAgIGludDY0X3Qgc3RhdGUgPSAzLCB0bXA7CisKKyAgICByZXQgPSBpbml0X2dldF9iaXRzOChiYywgc3JjLCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGEgXiAoYSA+PiAzMSkpIHsKKyAgICAgICAgbmJpdHMgPSAzMyAtIGZmX2NseihhIF4gKGEgPj4gMzEpKTsKKyAgICAgICAgaWYgKG5iaXRzID4gMTYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgeworICAgICAgICBuYml0cyA9IDE7CisgICAgfQorCisgICAgbGVuZ3RoID0gMjUgLSBuYml0czsKKworICAgIHdoaWxlIChpIDwgc2l6ZSkgeworICAgICAgICBpZiAoc3RhdGUgPj4gOCAhPSAtMykKKyAgICAgICAgICAgIHZhbHVlID0gZmZfY2x6KChzdGF0ZSA+PiA4KSArIDMpIF4gMHgxRjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdmFsdWUgPSAtMTsKKworICAgICAgICBjbnQxID0gZ2V0X3VuYXJ5KGJjLCAwLCBsZW5ndGgpOworICAgICAgICBpZiAoY250MSA+PSBsZW5ndGgpIHsKKyAgICAgICAgICAgIGNudDEgPSBnZXRfYml0cyhiYywgbmJpdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGZ4ID0gMTQgKyAoKCgodWludDY0X3QpKHZhbHVlIC0gMTQpKSA+PiAzMikgJiAodmFsdWUgLSAxNCkpOworICAgICAgICAgICAgaWYgKHBmeCA8IDEgfHwgcGZ4ID4gMjUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBjbnQxICo9ICgxIDw8IHBmeCkgLSAxOworICAgICAgICAgICAgc2hiaXRzID0gc2hvd19iaXRzKGJjLCBwZngpOworICAgICAgICAgICAgaWYgKHNoYml0cyA8PSAxKSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGJjLCBwZnggLSAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKGJjLCBwZngpOworICAgICAgICAgICAgICAgIGNudDEgKz0gc2hiaXRzIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHhmbGFnID0gZmxhZyArIGNudDE7CisgICAgICAgIHlmbGFnID0geGZsYWc7CisKKyAgICAgICAgaWYgKGZsYWcgKyBjbnQxID09IDApIHsKKyAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHhmbGFnICY9IDF1OworICAgICAgICAgICAgdG1wICAgID0gKGludDY0X3QpYyAqICgoeWZsYWcgKyAxKSA+PiAxKSArIChjID4+IDEpOworICAgICAgICAgICAgdmFsdWUgID0geGZsYWcgKyAodG1wIF4gLXhmbGFnKTsKKyAgICAgICAgfQorCisgICAgICAgIGkrKzsKKyAgICAgICAgZHN0W2orK10gPSB2YWx1ZTsKKyAgICAgICAgaWYgKGogPT0gd2lkdGgpIHsKKyAgICAgICAgICAgIGogICAgPSAwOworICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSArPSAoaW50NjRfdClkICogKHVpbnQ2NF90KXlmbGFnIC0gKChpbnQ2NF90KShkICogKHVpbnQ2NF90KXN0YXRlKSA+PiA4KTsKKworICAgICAgICBmbGFnID0gMDsKKworICAgICAgICBpZiAoKHVpbnQ2NF90KXN0YXRlID4gMHhGRiAvIDQgfHwgaSA+PSBzaXplKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcGZ4ICAgID0gKChzdGF0ZSArIDgpID4+IDUpICsgKHN0YXRlID8gZmZfY2x6KHN0YXRlKSA6IDMyKSAtIDI0OworICAgICAgICBlc2NhcGUgPSBhdl9tb2RfdWludHAyKDE2MzgzLCBwZngpOworICAgICAgICBjbnQxICAgPSBnZXRfdW5hcnkoYmMsIDAsIDgpOworICAgICAgICBpZiAoY250MSA8IDgpIHsKKyAgICAgICAgICAgIGlmIChwZnggPCAxIHx8IHBmeCA+IDI1KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICB2YWx1ZSA9IHNob3dfYml0cyhiYywgcGZ4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoYmMsIHBmeCk7CisgICAgICAgICAgICAgICAgcmxlbiA9IHZhbHVlICsgZXNjYXBlICogY250MSAtIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNraXBfYml0cyhiYywgcGZ4IC0gMSk7CisgICAgICAgICAgICAgICAgcmxlbiA9IGVzY2FwZSAqIGNudDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHMxKGJjKSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldF9iaXRzKGJjLCAxNik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRfYml0cyhiYywgOCk7CisKKyAgICAgICAgICAgIHJsZW4gPSB2YWx1ZSArIDggKiBlc2NhcGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmxlbiA+IDB4RkZGRiB8fCBpICsgcmxlbiA+IHNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaSArPSBybGVuOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBybGVuOyBrKyspIHsKKyAgICAgICAgICAgIGRzdFtqKytdID0gMDsKKyAgICAgICAgICAgIGlmIChqID09IHdpZHRoKSB7CisgICAgICAgICAgICAgICAgaiAgICA9IDA7CisgICAgICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRlID0gMDsKKyAgICAgICAgZmxhZyAgPSBybGVuIDwgMHhGRkZGID8gMSA6IDA7CisgICAgfQorCisgICAgYWxpZ25fZ2V0X2JpdHMoYmMpOworICAgIHJldHVybiBnZXRfYml0c19jb3VudChiYykgPj4gMzsKK30KKworc3RhdGljIGludCByZWFkX2hpZ2hwYXNzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdWludDhfdCAqcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGFuZSwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgUGl4bGV0Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBwdHJkaWZmX3Qgc3RyaWRlID0gZnJhbWUtPmxpbmVzaXplW3BsYW5lXSAvIDI7CisgICAgaW50IGksIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmxldmVscyAqIDM7IGkrKykgeworICAgICAgICBpbnQzMl90IGEgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmY3R4LT5nYik7CisgICAgICAgIGludDMyX3QgYiA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZjdHgtPmdiKTsKKyAgICAgICAgaW50MzJfdCBjID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmN0eC0+Z2IpOworICAgICAgICBpbnQzMl90IGQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmY3R4LT5nYik7CisgICAgICAgIGludDE2X3QgKmRlc3QgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhW3BsYW5lXSArCisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJhbmRbcGxhbmVdW2kgKyAxXS54ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+YmFuZFtwbGFuZV1baSArIDFdLnkgKiBzdHJpZGU7CisgICAgICAgIHVuc2lnbmVkIHNpemUgPSBjdHgtPmJhbmRbcGxhbmVdW2kgKyAxXS5zaXplOworICAgICAgICB1aW50MzJfdCBtYWdpYyA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZjdHgtPmdiKTsKKworICAgICAgICBpZiAobWFnaWMgIT0gUElYTEVUX01BR0lDKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAid3JvbmcgbWFnaWMgbnVtYmVyOiAweCUwOCJQUklYMzIiIGZvciBwbGFuZSAlZCwgYmFuZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBtYWdpYywgcGxhbmUsIGkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYSA9PSBJTlQzMl9NSU4pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICByZXQgPSByZWFkX2hpZ2hfY29lZmZzKGF2Y3R4LCBwdHIgKyBieXRlc3RyZWFtMl90ZWxsKCZjdHgtPmdiKSwgZGVzdCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLCAoYiA+PSBGRkFCUyhhKSkgPyBiIDogYSwgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJhbmRbcGxhbmVdW2kgKyAxXS53aWR0aCwgc3RyaWRlKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJlcnJvciBpbiBoaWdocGFzcyBjb2VmZmljaWVudHMgZm9yIHBsYW5lICVkLCBiYW5kICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHBsYW5lLCBpKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nYiwgcmV0KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbG93cGFzc19wcmVkaWN0aW9uKGludDE2X3QgKmRzdCwgaW50MTZfdCAqcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgaW50MTZfdCB2YWw7CisgICAgaW50IGksIGo7CisKKyAgICBtZW1zZXQocHJlZCwgMCwgd2lkdGggKiBzaXplb2YoKnByZWQpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworICAgICAgICB2YWwgICAgPSBwcmVkWzBdICsgZHN0WzBdOworICAgICAgICBkc3RbMF0gPSBwcmVkWzBdID0gdmFsOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykgeworICAgICAgICAgICAgdmFsICAgICA9IHByZWRbal0gKyBkc3Rbal07CisgICAgICAgICAgICBkc3Rbal0gID0gcHJlZFtqXSA9IHZhbDsKKyAgICAgICAgICAgIGRzdFtqXSArPSBkc3Rbai0xXTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gc3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyZm4oaW50MTZfdCAqZGVzdCwgaW50MTZfdCAqdG1wLCB1bnNpZ25lZCBzaXplLCBpbnQ2NF90IHNjYWxlKQoreworICAgIGludDE2X3QgKmxvdywgKmhpZ2gsICpsbCwgKmxoLCAqaGwsICpoaDsKKyAgICBpbnQgaHNpemUsIGksIGo7CisgICAgaW50NjRfdCB2YWx1ZTsKKworICAgIGhzaXplID0gc2l6ZSA+PiAxOworICAgIGxvdyAgID0gdG1wICsgNDsKKyAgICBoaWdoICA9ICZsb3dbaHNpemUgKyA4XTsKKworICAgIG1lbWNweShsb3csIGRlc3QsIHNpemUpOworICAgIG1lbWNweShoaWdoLCBkZXN0ICsgaHNpemUsIHNpemUpOworCisgICAgbGwgPSAmbG93W2hzaXplXTsKKyAgICBsaCA9ICZsb3dbaHNpemVdOworICAgIGhsID0gJmhpZ2hbaHNpemVdOworICAgIGhoID0gaGw7CisgICAgZm9yIChpID0gNCwgaiA9IDI7IGk7IGktLSwgaisrLCBsbC0tLCBoaCsrLCBsaCsrLCBobC0tKSB7CisgICAgICAgIGxvd1tpIC0gNV0gID0gbG93W2ogLSAxXTsKKyAgICAgICAgbGhbMF0gICAgICAgPSBsbFstMV07CisgICAgICAgIGhpZ2hbaSAtIDVdID0gaGlnaFtqIC0gMl07CisgICAgICAgIGhoWzBdICAgICAgID0gaGxbLTJdOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBoc2l6ZTsgaSsrKSB7CisgICAgICAgIHZhbHVlID0gKGludDY0X3QpIGxvdyBbaSArIDFdICogLUlOVDY0X0MoMzI1MzkyOTA3KSAgKworICAgICAgICAgICAgICAgIChpbnQ2NF90KSBsb3cgW2kgKyAwXSAqICBJTlQ2NF9DKDM2ODc3ODYzMjApICsKKyAgICAgICAgICAgICAgICAoaW50NjRfdCkgbG93IFtpIC0gMV0gKiAtSU5UNjRfQygzMjUzOTI5MDcpICArCisgICAgICAgICAgICAgICAgKGludDY0X3QpIGhpZ2hbaSArIDBdICogIElOVDY0X0MoMTUxODUwMDI0OSkgKworICAgICAgICAgICAgICAgIChpbnQ2NF90KSBoaWdoW2kgLSAxXSAqICBJTlQ2NF9DKDE1MTg1MDAyNDkpOworICAgICAgICBkZXN0W2kgKiAyXSA9IGF2X2NsaXBfaW50MTYoKCh2YWx1ZSA+PiAzMikgKiBzY2FsZSkgPj4gMzIpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBoc2l6ZTsgaSsrKSB7CisgICAgICAgIHZhbHVlID0gKGludDY0X3QpIGxvdyBbaSArIDJdICogLUlOVDY0X0MoNjUwNzg1NzYpICAgKworICAgICAgICAgICAgICAgIChpbnQ2NF90KSBsb3cgW2kgKyAxXSAqICBJTlQ2NF9DKDE1ODM1Nzg4ODApICsKKyAgICAgICAgICAgICAgICAoaW50NjRfdCkgbG93IFtpICsgMF0gKiAgSU5UNjRfQygxNTgzNTc4ODgwKSArCisgICAgICAgICAgICAgICAgKGludDY0X3QpIGxvdyBbaSAtIDFdICogLUlOVDY0X0MoNjUwNzg1NzYpICAgKworICAgICAgICAgICAgICAgIChpbnQ2NF90KSBoaWdoW2kgKyAxXSAqICBJTlQ2NF9DKDMwMzcwMDA2NCkgICsKKyAgICAgICAgICAgICAgICAoaW50NjRfdCkgaGlnaFtpICsgMF0gKiAtSU5UNjRfQygzNjQ0NDAwNjQwKSArCisgICAgICAgICAgICAgICAgKGludDY0X3QpIGhpZ2hbaSAtIDFdICogIElOVDY0X0MoMzAzNzAwMDY0KTsKKyAgICAgICAgZGVzdFtpICogMiArIDFdID0gYXZfY2xpcF9pbnQxNigoKHZhbHVlID4+IDMyKSAqIHNjYWxlKSA+PiAzMik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZWNvbnN0cnVjdGlvbihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludDE2X3QgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB3aWR0aCwgdW5zaWduZWQgaGVpZ2h0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqc2NhbGluZ19oLCBpbnQ2NF90ICpzY2FsaW5nX3YpCit7CisgICAgUGl4bGV0Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBzY2FsZWRfd2lkdGgsIHNjYWxlZF9oZWlnaHQ7CisgICAgaW50MTZfdCAqcHRyLCAqdG1wOworICAgIGludCBpLCBqLCBrOworCisgICAgc2NhbGVkX3dpZHRoICA9IHdpZHRoICA+PiBOQl9MRVZFTFM7CisgICAgc2NhbGVkX2hlaWdodCA9IGhlaWdodCA+PiBOQl9MRVZFTFM7CisgICAgdG1wICAgICAgICAgICA9IGN0eC0+ZmlsdGVyWzBdOworCisgICAgZm9yIChpID0gMDsgaSA8IE5CX0xFVkVMUzsgaSsrKSB7CisgICAgICAgIGludDY0X3Qgc2NhbGVfdiA9IHNjYWxpbmdfdltpXTsKKyAgICAgICAgaW50NjRfdCBzY2FsZV9oID0gc2NhbGluZ19oW2ldOworICAgICAgICBzY2FsZWRfd2lkdGggIDw8PSAxOworICAgICAgICBzY2FsZWRfaGVpZ2h0IDw8PSAxOworCisgICAgICAgIHB0ciA9IGRlc3Q7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzY2FsZWRfaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgIGZpbHRlcmZuKHB0ciwgY3R4LT5maWx0ZXJbMV0sIHNjYWxlZF93aWR0aCwgc2NhbGVfdik7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNjYWxlZF93aWR0aDsgaisrKSB7CisgICAgICAgICAgICBwdHIgPSBkZXN0ICsgajsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzY2FsZWRfaGVpZ2h0OyBrKyspIHsKKyAgICAgICAgICAgICAgICB0bXBba10gPSAqcHRyOworICAgICAgICAgICAgICAgIHB0ciAgICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmlsdGVyZm4odG1wLCBjdHgtPmZpbHRlclsxXSwgc2NhbGVkX2hlaWdodCwgc2NhbGVfaCk7CisKKyAgICAgICAgICAgIHB0ciA9IGRlc3QgKyBqOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNjYWxlZF9oZWlnaHQ7IGsrKykgeworICAgICAgICAgICAgICAgICpwdHIgPSB0bXBba107CisgICAgICAgICAgICAgICAgcHRyICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcG9zdHByb2Nlc3NfbHVtYShBVkZyYW1lICpmcmFtZSwgaW50IHcsIGludCBoLCBpbnQgZGVwdGgpCit7CisgICAgdWludDE2X3QgKmRzdHkgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YVswXTsKKyAgICBpbnQxNl90ICpzcmN5ICA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF07CisgICAgcHRyZGlmZl90IHN0cmlkZXkgPSBmcmFtZS0+bGluZXNpemVbMF0gLyAyOworICAgIGludCBpLCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3JjeVtpXSA8PSAwKQorICAgICAgICAgICAgICAgIGRzdHlbaV0gPSAwOworICAgICAgICAgICAgZWxzZSBpZiAoc3JjeVtpXSA+ICgoMSA8PCBkZXB0aCkgLSAxKSkKKyAgICAgICAgICAgICAgICBkc3R5W2ldID0gNjU1MzU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZHN0eVtpXSA9ICgoaW50NjRfdCkgc3JjeVtpXSAqIHNyY3lbaV0gKiA2NTUzNSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAoKDEgPDwgZGVwdGgpIC0gMSkgLyAoKDEgPDwgZGVwdGgpIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgZHN0eSArPSBzdHJpZGV5OworICAgICAgICBzcmN5ICs9IHN0cmlkZXk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwb3N0cHJvY2Vzc19jaHJvbWEoQVZGcmFtZSAqZnJhbWUsIGludCB3LCBpbnQgaCwgaW50IGRlcHRoKQoreworICAgIHVpbnQxNl90ICpkc3R1ID0gKHVpbnQxNl90ICopZnJhbWUtPmRhdGFbMV07CisgICAgdWludDE2X3QgKmRzdHYgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YVsyXTsKKyAgICBpbnQxNl90ICpzcmN1ICA9IChpbnQxNl90ICopZnJhbWUtPmRhdGFbMV07CisgICAgaW50MTZfdCAqc3JjdiAgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhWzJdOworICAgIHB0cmRpZmZfdCBzdHJpZGV1ID0gZnJhbWUtPmxpbmVzaXplWzFdIC8gMjsKKyAgICBwdHJkaWZmX3Qgc3RyaWRldiA9IGZyYW1lLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgY29uc3QgdW5zaWduZWQgYWRkID0gMSA8PCAoZGVwdGggLSAxKTsKKyAgICBjb25zdCB1bnNpZ25lZCBzaGlmdCA9IDE2IC0gZGVwdGg7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICAgIGRzdHVbaV0gPSBhdl9jbGlwX3VpbnRwMl9jKGFkZCArIHNyY3VbaV0sIGRlcHRoKSA8PCBzaGlmdDsKKyAgICAgICAgICAgIGRzdHZbaV0gPSBhdl9jbGlwX3VpbnRwMl9jKGFkZCArIHNyY3ZbaV0sIGRlcHRoKSA8PCBzaGlmdDsKKyAgICAgICAgfQorICAgICAgICBkc3R1ICs9IHN0cmlkZXU7CisgICAgICAgIGRzdHYgKz0gc3RyaWRldjsKKyAgICAgICAgc3JjdSArPSBzdHJpZGV1OworICAgICAgICBzcmN2ICs9IHN0cmlkZXY7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRlY29kZV9wbGFuZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgUGl4bGV0Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBwdHJkaWZmX3Qgc3RyaWRlICAgPSBmcmFtZS0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICB1bnNpZ25lZCBzaGlmdCAgICAgPSBwbGFuZSA+IDA7CisgICAgaW50MTZfdCAqZHN0OworICAgIGludCBpLCByZXQ7CisKKyAgICBmb3IgKGkgPSBjdHgtPmxldmVscyAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGludDMyX3QgaCA9IHNpZ25fZXh0ZW5kKGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZjdHgtPmdiKSwgMzIpOworICAgICAgICBpbnQzMl90IHYgPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfYmUzMigmY3R4LT5nYiksIDMyKTsKKworICAgICAgICBpZiAoIWggfHwgIXYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBjdHgtPnNjYWxpbmdbcGxhbmVdW0hdW2ldID0gKDEwMDAwMDBVTEwgPDwgMzIpIC8gaDsKKyAgICAgICAgY3R4LT5zY2FsaW5nW3BsYW5lXVtWXVtpXSA9ICgxMDAwMDAwVUxMIDw8IDMyKSAvIHY7CisgICAgfQorCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nYiwgNCk7CisKKyAgICBkc3QgICAgPSAoaW50MTZfdCAqKWZyYW1lLT5kYXRhW3BsYW5lXTsKKyAgICBkc3RbMF0gPSBzaWduX2V4dGVuZChieXRlc3RyZWFtMl9nZXRfYmUxNigmY3R4LT5nYiksIDE2KTsKKworICAgIHJldCA9IGluaXRfZ2V0X2JpdHM4KCZjdHgtPmJjLCBhdnBrdC0+ZGF0YSArIGJ5dGVzdHJlYW0yX3RlbGwoJmN0eC0+Z2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZjdHgtPmdiKSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSByZWFkX2xvd19jb2VmZnMoYXZjdHgsIGRzdCArIDEsIGN0eC0+YmFuZFtwbGFuZV1bMF0ud2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJhbmRbcGxhbmVdWzBdLndpZHRoIC0gMSwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiZXJyb3IgaW4gbG93cGFzcyBjb2VmZmljaWVudHMgZm9yIHBsYW5lICVkLCB0b3Agcm93XG4iLCBwbGFuZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gcmVhZF9sb3dfY29lZmZzKGF2Y3R4LCBkc3QgKyBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+YmFuZFtwbGFuZV1bMF0uaGVpZ2h0IC0gMSwgMSwgc3RyaWRlKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJlcnJvciBpbiBsb3dwYXNzIGNvZWZmaWNpZW50cyBmb3IgcGxhbmUgJWQsIGxlZnQgY29sdW1uXG4iLAorICAgICAgICAgICAgICAgcGxhbmUpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHJlYWRfbG93X2NvZWZmcyhhdmN0eCwgZHN0ICsgc3RyaWRlICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGN0eC0+YmFuZFtwbGFuZV1bMF0ud2lkdGggLSAxKSAqIChjdHgtPmJhbmRbcGxhbmVdWzBdLmhlaWdodCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJhbmRbcGxhbmVdWzBdLndpZHRoIC0gMSwgc3RyaWRlKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJlcnJvciBpbiBsb3dwYXNzIGNvZWZmaWNpZW50cyBmb3IgcGxhbmUgJWQsIHJlc3RcbiIsIHBsYW5lKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgtPmdiLCByZXQpOworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikgPD0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5vIGJ5dGVzIGxlZnRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXQgPSByZWFkX2hpZ2hwYXNzKGF2Y3R4LCBhdnBrdC0+ZGF0YSwgcGxhbmUsIGZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGxvd3Bhc3NfcHJlZGljdGlvbihkc3QsIGN0eC0+cHJlZGljdGlvbiwgY3R4LT5iYW5kW3BsYW5lXVswXS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5iYW5kW3BsYW5lXVswXS5oZWlnaHQsIHN0cmlkZSk7CisKKyAgICByZWNvbnN0cnVjdGlvbihhdmN0eCwgKGludDE2X3QgKilmcmFtZS0+ZGF0YVtwbGFuZV0sIGN0eC0+dyA+PiBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmggPj4gc2hpZnQsIHN0cmlkZSwgY3R4LT5zY2FsaW5nW3BsYW5lXVtIXSwKKyAgICAgICAgICAgICAgICAgICBjdHgtPnNjYWxpbmdbcGxhbmVdW1ZdKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpeGxldF9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgUGl4bGV0Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgdywgaCwgd2lkdGgsIGhlaWdodCwgcmV0LCB2ZXJzaW9uOworICAgIEFWRnJhbWUgKnAgPSBkYXRhOworICAgIFRocmVhZEZyYW1lIGZyYW1lID0geyAuZiA9IGRhdGEgfTsKKyAgICB1aW50MzJfdCBwa3RzaXplOworCisgICAgYnl0ZXN0cmVhbTJfaW5pdCgmY3R4LT5nYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIHBrdHNpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmY3R4LT5nYik7CisgICAgaWYgKHBrdHNpemUgPD0gNDQgfHwgcGt0c2l6ZSAtIDQgPiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmY3R4LT5nYikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBhY2tldCBzaXplICUiUFJJdTMyIlxuIiwgcGt0c2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHZlcnNpb24gPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmY3R4LT5nYik7CisgICAgaWYgKHZlcnNpb24gIT0gMSkKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVmVyc2lvbiAlZCIsIHZlcnNpb24pOworCisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmY3R4LT5nYiwgNCk7CisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZjdHgtPmdiKSAhPSAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBieXRlc3RyZWFtMl9za2lwKCZjdHgtPmdiLCA0KTsKKworICAgIHdpZHRoICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZjdHgtPmdiKTsKKyAgICBoZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmY3R4LT5nYik7CisKKyAgICBpZiAoICAgIHdpZHRoID4gSU5UX01BWCAtICgxVSA8PCAoTkJfTEVWRUxTICsgMSkpCisgICAgICAgIHx8IGhlaWdodCA+IElOVF9NQVggLSAoMVUgPDwgKE5CX0xFVkVMUyArIDEpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB3ID0gRkZBTElHTih3aWR0aCwgIDEgPDwgKE5CX0xFVkVMUyArIDEpKTsKKyAgICBoID0gRkZBTElHTihoZWlnaHQsIDEgPDwgKE5CX0xFVkVMUyArIDEpKTsKKworICAgIGN0eC0+bGV2ZWxzID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmN0eC0+Z2IpOworICAgIGlmIChjdHgtPmxldmVscyAhPSBOQl9MRVZFTFMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGN0eC0+ZGVwdGggPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmY3R4LT5nYik7CisgICAgaWYgKGN0eC0+ZGVwdGggPCA4IHx8IGN0eC0+ZGVwdGggPiAxNSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJEZXB0aCAlZCIsIGN0eC0+ZGVwdGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgYXZjdHgtPndpZHRoICA9IHdpZHRoOworICAgIGF2Y3R4LT5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBpZiAoY3R4LT53ICE9IHcgfHwgY3R4LT5oICE9IGgpIHsKKyAgICAgICAgZnJlZV9idWZmZXJzKGF2Y3R4KTsKKyAgICAgICAgY3R4LT53ID0gdzsKKyAgICAgICAgY3R4LT5oID0gaDsKKworICAgICAgICByZXQgPSBpbml0X2RlY29kZXIoYXZjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnJlZV9idWZmZXJzKGF2Y3R4KTsKKyAgICAgICAgICAgIGN0eC0+dyA9IDA7CisgICAgICAgICAgICBjdHgtPmggPSAwOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmN0eC0+Z2IsIDgpOworCisgICAgcC0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgcC0+a2V5X2ZyYW1lID0gMTsKKyAgICBwLT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CisKKyAgICByZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gZGVjb2RlX3BsYW5lKGF2Y3R4LCBpLCBhdnBrdCwgZnJhbWUuZik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBvc3Rwcm9jZXNzX2x1bWEoZnJhbWUuZiwgY3R4LT53LCBjdHgtPmgsIGN0eC0+ZGVwdGgpOworICAgIHBvc3Rwcm9jZXNzX2Nocm9tYShmcmFtZS5mLCBjdHgtPncgPj4gMSwgY3R4LT5oID4+IDEsIGN0eC0+ZGVwdGgpOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gcGt0c2l6ZTsKK30KKworI2lmIEhBVkVfVEhSRUFEUworc3RhdGljIGludCBwaXhsZXRfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUGl4bGV0Q29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGN0eC0+ZmlsdGVyWzBdICA9IE5VTEw7CisgICAgY3R4LT5maWx0ZXJbMV0gID0gTlVMTDsKKyAgICBjdHgtPnByZWRpY3Rpb24gPSBOVUxMOworICAgIGN0eC0+dyA9IDA7CisgICAgY3R4LT5oID0gMDsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8qIEhBVkVfVEhSRUFEUyAqLworCitBVkNvZGVjIGZmX3BpeGxldF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgID0gInBpeGxldCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbGUgUGl4bGV0IiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QSVhMRVQsCisgICAgLmluaXQgICAgICAgICAgICAgPSBwaXhsZXRfaW5pdCwKKyAgICAuaW5pdF90aHJlYWRfY29weSA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKHBpeGxldF9pbml0X3RocmVhZF9jb3B5KSwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IHBpeGxldF9jbG9zZSwKKyAgICAuZGVjb2RlICAgICAgICAgICA9IHBpeGxldF9kZWNvZGVfZnJhbWUsCisgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoUGl4bGV0Q29udGV4dCksCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTLAorICAgIC5jYXBzX2ludGVybmFsICAgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcG5nLmggYi9saWJhdmNvZGVjL3BuZy5oCmluZGV4IDk0OGMyZjcuLmU5NjdmY2YgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcG5nLmgKKysrIGIvbGliYXZjb2RlYy9wbmcuaApAQCAtNDIsMTEgKzQyLDYgQEAKICNkZWZpbmUgUE5HX0ZJTFRFUl9WQUxVRV9QQUVUSCA0CiAjZGVmaW5lIFBOR19GSUxURVJfVkFMVUVfTUlYRUQgNQogCi0jZGVmaW5lIFBOR19JSERSICAgICAgMHgwMDAxCi0jZGVmaW5lIFBOR19JREFUICAgICAgMHgwMDAyCi0jZGVmaW5lIFBOR19BTExJTUFHRSAgMHgwMDA0Ci0jZGVmaW5lIFBOR19QTFRFICAgICAgMHgwMDA4Ci0KICNkZWZpbmUgTkJfUEFTU0VTIDcKIAogI2RlZmluZSBQTkdTSUcgMHg4OTUwNGU0NzBkMGExYTBhCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BuZ2RlYy5jIGIvbGliYXZjb2RlYy9wbmdkZWMuYwppbmRleCA2MTg1N2QwLi5mNzYxZjJmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BuZ2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvcG5nZGVjLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3N0ZXJlbzNkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgpAQCAtMzYsNiArMzcsMTYgQEAKIAogI2luY2x1ZGUgPHpsaWIuaD4KIAorZW51bSBQTkdIZWFkZXJTdGF0ZSB7CisgICAgUE5HX0lIRFIgPSAxIDw8IDAsCisgICAgUE5HX1BMVEUgPSAxIDw8IDEsCit9OworCitlbnVtIFBOR0ltYWdlU3RhdGUgeworICAgIFBOR19JREFUICAgICA9IDEgPDwgMCwKKyAgICBQTkdfQUxMSU1BR0UgPSAxIDw8IDEsCit9OworCiB0eXBlZGVmIHN0cnVjdCBQTkdEZWNDb250ZXh0IHsKICAgICBQTkdEU1BDb250ZXh0IGRzcDsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CkBAIC00NSw3ICs1Niw4IEBACiAgICAgVGhyZWFkRnJhbWUgbGFzdF9waWN0dXJlOwogICAgIFRocmVhZEZyYW1lIHBpY3R1cmU7CiAKLSAgICBpbnQgc3RhdGU7CisgICAgZW51bSBQTkdIZWFkZXJTdGF0ZSBoZHJfc3RhdGU7CisgICAgZW51bSBQTkdJbWFnZVN0YXRlIHBpY19zdGF0ZTsKICAgICBpbnQgd2lkdGgsIGhlaWdodDsKICAgICBpbnQgY3VyX3csIGN1cl9oOwogICAgIGludCBsYXN0X3csIGxhc3RfaDsKQEAgLTMzNCw3ICszNDYsNyBAQAogICAgICAgICB9CiAgICAgICAgIHMtPnkrKzsKICAgICAgICAgaWYgKHMtPnkgPT0gcy0+Y3VyX2gpIHsKLSAgICAgICAgICAgIHMtPnN0YXRlIHw9IFBOR19BTExJTUFHRTsKKyAgICAgICAgICAgIHMtPnBpY19zdGF0ZSB8PSBQTkdfQUxMSU1BR0U7CiAgICAgICAgICAgICBpZiAocy0+ZmlsdGVyX3R5cGUgPT0gUE5HX0ZJTFRFUl9UWVBFX0xPQ08pIHsKICAgICAgICAgICAgICAgICBpZiAocy0+Yml0X2RlcHRoID09IDE2KSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbG9jb19yZ2IxNigodWludDE2X3QgKilwdHIsIHMtPnJvd19zaXplIC8gMiwKQEAgLTM2OSw3ICszODEsNyBAQAogICAgICAgICAgICAgICAgIG1lbXNldChzLT5sYXN0X3JvdywgMCwgcy0+cm93X3NpemUpOwogICAgICAgICAgICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3MgPT0gTkJfUEFTU0VTIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdGUgfD0gUE5HX0FMTElNQUdFOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGljX3N0YXRlIHw9IFBOR19BTExJTUFHRTsKICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gdGhlX2VuZDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBhc3MrKzsKQEAgLTQwNCw3ICs0MTYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHMtPnpzdHJlYW0uYXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgIGlmICghKHMtPnN0YXRlICYgUE5HX0FMTElNQUdFKSkgeworICAgICAgICAgICAgaWYgKCEocy0+cGljX3N0YXRlICYgUE5HX0FMTElNQUdFKSkgewogICAgICAgICAgICAgICAgIHBuZ19oYW5kbGVfcm93KHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcy0+enN0cmVhbS5hdmFpbF9vdXQgPSBzLT5jcm93X3NpemU7CkBAIC00MzcsMTMgKzQ0OSwxMyBAQAogICAgIGF2X2JwcmludF9pbml0KGJwLCAwLCAtMSk7CiAKICAgICB3aGlsZSAoenN0cmVhbS5hdmFpbF9pbiA+IDApIHsKLSAgICAgICAgYXZfYnByaW50X2dldF9idWZmZXIoYnAsIDEsICZidWYsICZidWZfc2l6ZSk7Ci0gICAgICAgIGlmICghYnVmX3NpemUpIHsKKyAgICAgICAgYXZfYnByaW50X2dldF9idWZmZXIoYnAsIDIsICZidWYsICZidWZfc2l6ZSk7CisgICAgICAgIGlmIChidWZfc2l6ZSA8IDIpIHsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogICAgICAgICB6c3RyZWFtLm5leHRfb3V0ICA9IGJ1ZjsKLSAgICAgICAgenN0cmVhbS5hdmFpbF9vdXQgPSBidWZfc2l6ZTsKKyAgICAgICAgenN0cmVhbS5hdmFpbF9vdXQgPSBidWZfc2l6ZSAtIDE7CiAgICAgICAgIHJldCA9IGluZmxhdGUoJnpzdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7CiAgICAgICAgIGlmIChyZXQgIT0gWl9PSyAmJiByZXQgIT0gWl9TVFJFQU1fRU5EKSB7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOwpAQCAtNTEyLDkgKzUyNCw5IEBACiAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX3pidWYoJmJwLCBkYXRhLCBkYXRhX2VuZCkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIHRleHRfbGVuID0gYnAubGVuOwotICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJwLCAoY2hhciAqKikmdGV4dCk7Ci0gICAgICAgIGlmICghdGV4dCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldCA9IGF2X2JwcmludF9maW5hbGl6ZSgmYnAsIChjaGFyICoqKSZ0ZXh0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0gZWxzZSB7CiAgICAgICAgIHRleHQgPSAodWludDhfdCAqKWRhdGE7CiAgICAgICAgIHRleHRfbGVuID0gZGF0YV9lbmQgLSB0ZXh0OwpAQCAtNTQxLDEyICs1NTMsMTIgQEAKICAgICBpZiAobGVuZ3RoICE9IDEzKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIGlmIChzLT5zdGF0ZSAmIFBOR19JREFUKSB7CisgICAgaWYgKHMtPnBpY19zdGF0ZSAmIFBOR19JREFUKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSUhEUiBhZnRlciBJREFUXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKHMtPnN0YXRlICYgUE5HX0lIRFIpIHsKKyAgICBpZiAocy0+aGRyX3N0YXRlICYgUE5HX0lIRFIpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNdWx0aXBsZSBJSERSXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtNTU5LDEyICs1NzEsMjEgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogICAgIHMtPmJpdF9kZXB0aCAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgIGlmIChzLT5iaXRfZGVwdGggIT0gMSAmJiBzLT5iaXRfZGVwdGggIT0gMiAmJiBzLT5iaXRfZGVwdGggIT0gNCAmJgorICAgICAgICBzLT5iaXRfZGVwdGggIT0gOCAmJiBzLT5iaXRfZGVwdGggIT0gMTYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGJpdCBkZXB0aFxuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQogICAgIHMtPmNvbG9yX3R5cGUgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOwogICAgIHMtPmNvbXByZXNzaW9uX3R5cGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOworICAgIGlmIChzLT5jb21wcmVzc2lvbl90eXBlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb21wcmVzc2lvbiBtZXRob2QgJWRcbiIsIHMtPmNvbXByZXNzaW9uX3R5cGUpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICAgICBzLT5maWx0ZXJfdHlwZSAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKICAgICBzLT5pbnRlcmxhY2VfdHlwZSAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgNCk7IC8qIGNyYyAqLwotICAgIHMtPnN0YXRlIHw9IFBOR19JSERSOworICAgIHMtPmhkcl9zdGF0ZSB8PSBQTkdfSUhEUjsKICAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIndpZHRoPSVkIGhlaWdodD0lZCBkZXB0aD0lZCBjb2xvcl90eXBlPSVkICIKICAgICAgICAgICAgICAgICAiY29tcHJlc3Npb25fdHlwZT0lZCBmaWx0ZXJfdHlwZT0lZCBpbnRlcmxhY2VfdHlwZT0lZFxuIiwKQEAgLTU3MiwxMSArNTkzLDE1IEBACiAgICAgICAgICAgICAgICAgcy0+Y29tcHJlc3Npb25fdHlwZSwgcy0+ZmlsdGVyX3R5cGUsIHMtPmludGVybGFjZV90eXBlKTsKIAogICAgIHJldHVybiAwOworZXJyb3I6CisgICAgcy0+Y3VyX3cgPSBzLT5jdXJfaCA9IHMtPndpZHRoID0gcy0+aGVpZ2h0ID0gMDsKKyAgICBzLT5iaXRfZGVwdGggPSA4OworICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogfQogCiBzdGF0aWMgaW50IGRlY29kZV9waHlzX2NodW5rKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUE5HRGVjQ29udGV4dCAqcykKIHsKLSAgICBpZiAocy0+c3RhdGUgJiBQTkdfSURBVCkgeworICAgIGlmIChzLT5waWNfc3RhdGUgJiBQTkdfSURBVCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInBIWXMgYWZ0ZXIgSURBVFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KQEAgLTU5NiwxNCArNjIxLDE1IEBACiAgICAgaW50IHJldDsKICAgICBzaXplX3QgYnl0ZV9kZXB0aCA9IHMtPmJpdF9kZXB0aCA+IDggPyAyIDogMTsKIAotICAgIGlmICghKHMtPnN0YXRlICYgUE5HX0lIRFIpKSB7CisgICAgaWYgKCEocy0+aGRyX3N0YXRlICYgUE5HX0lIRFIpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSURBVCB3aXRob3V0IElIRFJcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9Ci0gICAgaWYgKCEocy0+c3RhdGUgJiBQTkdfSURBVCkpIHsKKyAgICBpZiAoIShzLT5waWNfc3RhdGUgJiBQTkdfSURBVCkpIHsKICAgICAgICAgLyogaW5pdCBpbWFnZSBpbmZvICovCi0gICAgICAgIGF2Y3R4LT53aWR0aCAgPSBzLT53aWR0aDsKLSAgICAgICAgYXZjdHgtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHMtPndpZHRoLCBzLT5oZWlnaHQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAgICAgcy0+Y2hhbm5lbHMgICAgICAgPSBmZl9wbmdfZ2V0X25iX2NoYW5uZWxzKHMtPmNvbG9yX3R5cGUpOwogICAgICAgICBzLT5iaXRzX3Blcl9waXhlbCA9IHMtPmJpdF9kZXB0aCAqIHMtPmNoYW5uZWxzOwpAQCAtNjQwLDEwICs2NjYsMTAgQEAKICAgICAgICAgICAgICAgICBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpIHsKICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZQTE2QkU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGJpdCBkZXB0aCAlZCAiCi0gICAgICAgICAgICAgICAgICAgICJhbmQgY29sb3IgdHlwZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgcy0+Yml0X2RlcHRoLCBzLT5jb2xvcl90eXBlKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQml0IGRlcHRoICVkIGNvbG9yIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Yml0X2RlcHRoLCBzLT5jb2xvcl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzLT5oYXNfdHJucyAmJiBzLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKQEAgLTY4MSwxMiArNzA3LDEyIEBACiAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmcy0+cHJldmlvdXNfcGljdHVyZSwgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRikpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9Ci0gICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOwotCiAgICAgICAgIHAtPnBpY3RfdHlwZSAgICAgICAgPSBBVl9QSUNUVVJFX1RZUEVfSTsKICAgICAgICAgcC0+a2V5X2ZyYW1lICAgICAgICA9IDE7CiAgICAgICAgIHAtPmludGVybGFjZWRfZnJhbWUgPSAhIXMtPmludGVybGFjZV90eXBlOwogCisgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOworCiAgICAgICAgIC8qIGNvbXB1dGUgdGhlIGNvbXByZXNzZWQgcm93IHNpemUgKi8KICAgICAgICAgaWYgKCFzLT5pbnRlcmxhY2VfdHlwZSkgewogICAgICAgICAgICAgcy0+Y3Jvd19zaXplID0gcy0+cm93X3NpemUgKyAxOwpAQCAtNzI1LDcgKzc1MSw3IEBACiAgICAgICAgIHMtPnpzdHJlYW0ubmV4dF9vdXQgID0gcy0+Y3Jvd19idWY7CiAgICAgfQogCi0gICAgcy0+c3RhdGUgfD0gUE5HX0lEQVQ7CisgICAgcy0+cGljX3N0YXRlIHw9IFBOR19JREFUOwogCiAgICAgLyogc2V0IGltYWdlIHRvIG5vbi10cmFuc3BhcmVudCBicHAgd2hpbGUgZGVjb21wcmVzc2luZyAqLwogICAgIGlmIChzLT5oYXNfdHJucyAmJiBzLT5jb2xvcl90eXBlICE9IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpCkBAIC03NjEsNyArNzg3LDcgQEAKICAgICB9CiAgICAgZm9yICg7IGkgPCAyNTY7IGkrKykKICAgICAgICAgcy0+cGFsZXR0ZVtpXSA9ICgweEZGVSA8PCAyNCk7Ci0gICAgcy0+c3RhdGUgfD0gUE5HX1BMVEU7CisgICAgcy0+aGRyX3N0YXRlIHw9IFBOR19QTFRFOwogICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCA0KTsgICAgIC8qIGNyYyAqLwogCiAgICAgcmV0dXJuIDA7CkBAIC03NzIsMTcgKzc5OCwyOCBAQAogewogICAgIGludCB2LCBpOwogCisgICAgaWYgKCEocy0+aGRyX3N0YXRlICYgUE5HX0lIRFIpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidHJucyBiZWZvcmUgSUhEUlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzLT5waWNfc3RhdGUgJiBQTkdfSURBVCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInRybnMgYWZ0ZXIgSURBVFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIGlmIChzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKLSAgICAgICAgaWYgKGxlbmd0aCA+IDI1NiB8fCAhKHMtPnN0YXRlICYgUE5HX1BMVEUpKQorICAgICAgICBpZiAobGVuZ3RoID4gMjU2IHx8ICEocy0+aGRyX3N0YXRlICYgUE5HX1BMVEUpKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHYgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOwogICAgICAgICAgICAgcy0+cGFsZXR0ZVtpXSA9IChzLT5wYWxldHRlW2ldICYgMHgwMGZmZmZmZikgfCAodiA8PCAyNCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHMtPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fCBzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQikgewogICAgICAgICBpZiAoKHMtPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBsZW5ndGggIT0gMikgfHwKLSAgICAgICAgICAgIChzLT5jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiAmJiBsZW5ndGggIT0gNikpCisgICAgICAgICAgICAocy0+Y29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9SR0IgJiYgbGVuZ3RoICE9IDYpIHx8CisgICAgICAgICAgICBzLT5iaXRfZGVwdGggPT0gMSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLyAyOyBpKyspIHsKQEAgLTgwNCw2ICs4NDEsNTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkZWNvZGVfaWNjcF9jaHVuayhQTkdEZWNDb250ZXh0ICpzLCBpbnQgbGVuZ3RoLCBBVkZyYW1lICpmKQoreworICAgIGludCByZXQsIGNudCA9IDA7CisgICAgdWludDhfdCAqZGF0YSwgcHJvZmlsZV9uYW1lWzgyXTsKKyAgICBBVkJQcmludCBicDsKKyAgICBBVkZyYW1lU2lkZURhdGEgKnNkOworCisgICAgd2hpbGUgKChwcm9maWxlX25hbWVbY250KytdID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKSkgJiYgY250IDwgODEpOworICAgIGlmIChjbnQgPiA4MCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlDQ1Agd2l0aCBpbnZhbGlkIG5hbWUhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgbGVuZ3RoID0gRkZNQVgobGVuZ3RoIC0gY250LCAwKTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpICE9IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpQ0NQIHdpdGggaW52YWxpZCBjb21wcmVzc2lvbiFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBsZW5ndGggPSBGRk1BWChsZW5ndGggLSAxLCAwKTsKKworICAgIGlmICgocmV0ID0gZGVjb2RlX3pidWYoJmJwLCBzLT5nYi5idWZmZXIsIHMtPmdiLmJ1ZmZlciArIGxlbmd0aCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGF2X2JwcmludF9maW5hbGl6ZSgmYnAsIChjaGFyICoqKSZkYXRhKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHNkID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShmLCBBVl9GUkFNRV9EQVRBX0lDQ19QUk9GSUxFLCBicC5sZW4pOworICAgIGlmICghc2QpIHsKKyAgICAgICAgYXZfZnJlZShkYXRhKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdl9kaWN0X3NldCgmc2QtPm1ldGFkYXRhLCAibmFtZSIsIHByb2ZpbGVfbmFtZSwgMCk7CisgICAgbWVtY3B5KHNkLT5kYXRhLCBkYXRhLCBicC5sZW4pOworICAgIGF2X2ZyZWUoZGF0YSk7CisKKyAgICAvKiBJQ0MgY29tcHJlc3NlZCBkYXRhIGFuZCBDUkMgKi8KKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgbGVuZ3RoICsgNCk7CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgaGFuZGxlX3NtYWxsX2JwcChQTkdEZWNDb250ZXh0ICpzLCBBVkZyYW1lICpwKQogewogICAgIGlmIChzLT5iaXRzX3Blcl9waXhlbCA9PSAxICYmIHMtPmNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkgewpAQCAtODg2LDcgKzk2OCw3IEBACiAgICAgaWYgKGxlbmd0aCAhPSAyNikKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBpZiAoIShzLT5zdGF0ZSAmIFBOR19JSERSKSkgeworICAgIGlmICghKHMtPmhkcl9zdGF0ZSAmIFBOR19JSERSKSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImZjdGwgYmVmb3JlIElIRFJcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC05MjIsNyArMTAwNCw4IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGlmIChzZXF1ZW5jZV9udW1iZXIgPT0gMCAmJiBkaXNwb3NlX29wID09IEFQTkdfRElTUE9TRV9PUF9QUkVWSU9VUykgeworICAgIGlmICgoc2VxdWVuY2VfbnVtYmVyID09IDAgfHwgIXMtPnByZXZpb3VzX3BpY3R1cmUuZi0+ZGF0YVswXSkgJiYKKyAgICAgICAgZGlzcG9zZV9vcCA9PSBBUE5HX0RJU1BPU0VfT1BfUFJFVklPVVMpIHsKICAgICAgICAgLy8gTm8gcHJldmlvdXMgZnJhbWUgdG8gcmV2ZXJ0IHRvIGZvciB0aGUgZmlyc3QgZnJhbWUKICAgICAgICAgLy8gU3BlYyBzYXlzIHRvIGp1c3QgdHJlYXQgaXQgYXMgYSBBUE5HX0RJU1BPU0VfT1BfQkFDS0dST1VORAogICAgICAgICBkaXNwb3NlX29wID0gQVBOR19ESVNQT1NFX09QX0JBQ0tHUk9VTkQ7CkBAIC0xMDg2LDEwICsxMTY5LDEwIEBACiBzdGF0aWMgaW50IGRlY29kZV9mcmFtZV9jb21tb24oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBQTkdEZWNDb250ZXh0ICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKnAsIEFWUGFja2V0ICphdnBrdCkKIHsKLSAgICBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhICA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGFwID0gTlVMTDsKICAgICB1aW50MzJfdCB0YWcsIGxlbmd0aDsKICAgICBpbnQgZGVjb2RlX25leHRfZGF0ID0gMDsKLSAgICBpbnQgcmV0OworICAgIGludCBpLCByZXQ7CiAKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGxlbmd0aCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYik7CkBAIC0xMDk3LDE4ICsxMTgwLDE3IEBACiAKICAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUE5HICYmCiAgICAgICAgICAgICAgICAgYXZjdHgtPnNraXBfZnJhbWUgPT0gQVZESVNDQVJEX0FMTCkgewotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3NldF9tZXRhZGF0YShwLCBtZXRhZGF0YSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChDT05GSUdfQVBOR19ERUNPREVSICYmIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BUE5HICYmIGxlbmd0aCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEocy0+c3RhdGUgJiBQTkdfSURBVCkpCisgICAgICAgICAgICAgICAgaWYgKCEocy0+cGljX3N0YXRlICYgUE5HX0lEQVQpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9sb29wOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICIlZCBieXRlcyBsZWZ0XG4iLCBsZW5ndGgpOwotICAgICAgICAgICAgaWYgKCAgIHMtPnN0YXRlICYgUE5HX0FMTElNQUdFCisgICAgICAgICAgICBpZiAoICAgcy0+cGljX3N0YXRlICYgUE5HX0FMTElNQUdFCiAgICAgICAgICAgICAgICAgJiYgYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8PSBGRl9DT01QTElBTkNFX05PUk1BTCkKICAgICAgICAgICAgICAgICBnb3RvIGV4aXRfbG9vcDsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC0xMTIzLDExICsxMjA1LDggQEAKICAgICAgICAgfQogICAgICAgICB0YWcgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcy0+Z2IpOwogICAgICAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfU1RBUlRDT0RFKQotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJwbmc6IHRhZz0lYyVjJWMlYyBsZW5ndGg9JXVcbiIsCi0gICAgICAgICAgICAgICAgKHRhZyAmIDB4ZmYpLAotICAgICAgICAgICAgICAgICgodGFnID4+IDgpICYgMHhmZiksCi0gICAgICAgICAgICAgICAgKCh0YWcgPj4gMTYpICYgMHhmZiksCi0gICAgICAgICAgICAgICAgKCh0YWcgPj4gMjQpICYgMHhmZiksIGxlbmd0aCk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInBuZzogdGFnPSVzIGxlbmd0aD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKHRhZyksIGxlbmd0aCk7CiAKICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QTkcgJiYKICAgICAgICAgICAgIGF2Y3R4LT5za2lwX2ZyYW1lID09IEFWRElTQ0FSRF9BTEwpIHsKQEAgLTExMzYsMTIgKzEyMTUsMTQgQEAKICAgICAgICAgICAgIGNhc2UgTUtUQUcoJ3AnLCAnSCcsICdZJywgJ3MnKToKICAgICAgICAgICAgIGNhc2UgTUtUQUcoJ3QnLCAnRScsICdYJywgJ3QnKToKICAgICAgICAgICAgIGNhc2UgTUtUQUcoJ0knLCAnRCcsICdBJywgJ1QnKToKKyAgICAgICAgICAgIGNhc2UgTUtUQUcoJ3QnLCAnUicsICdOJywgJ1MnKToKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgZ290byBza2lwX3RhZzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIG1ldGFkYXRhcCA9ICZwLT5tZXRhZGF0YTsKICAgICAgICAgc3dpdGNoICh0YWcpIHsKICAgICAgICAgY2FzZSBNS1RBRygnSScsICdIJywgJ0QnLCAnUicpOgogICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfaWhkcl9jaHVuayhhdmN0eCwgcywgbGVuZ3RoKSkgPCAwKQpAQCAtMTE4MywxMiArMTI2NCwxMiBAQAogICAgICAgICAgICAgICAgIGdvdG8gc2tpcF90YWc7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNS1RBRygndCcsICdFJywgJ1gnLCAndCcpOgotICAgICAgICAgICAgaWYgKGRlY29kZV90ZXh0X2NodW5rKHMsIGxlbmd0aCwgMCwgJm1ldGFkYXRhKSA8IDApCisgICAgICAgICAgICBpZiAoZGVjb2RlX3RleHRfY2h1bmsocywgbGVuZ3RoLCAwLCBtZXRhZGF0YXApIDwgMCkKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQnJva2VuIHRFWHQgY2h1bmtcbiIpOwogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIGxlbmd0aCArIDQpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUtUQUcoJ3onLCAnVCcsICdYJywgJ3QnKToKLSAgICAgICAgICAgIGlmIChkZWNvZGVfdGV4dF9jaHVuayhzLCBsZW5ndGgsIDEsICZtZXRhZGF0YSkgPCAwKQorICAgICAgICAgICAgaWYgKGRlY29kZV90ZXh0X2NodW5rKHMsIGxlbmd0aCwgMSwgbWV0YWRhdGFwKSA8IDApCiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkJyb2tlbiB6VFh0IGNodW5rXG4iKTsKICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCBsZW5ndGggKyA0KTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTIwOCwxMCArMTI4OSw1MSBAQAogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIDQpOyAvKiBjcmMgKi8KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2UgTUtUQUcoJ2knLCAnQycsICdDJywgJ1AnKTogeworICAgICAgICAgICAgaWYgKGRlY29kZV9pY2NwX2NodW5rKHMsIGxlbmd0aCwgcCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTUtUQUcoJ2MnLCAnSCcsICdSJywgJ00nKTogeworICAgICAgICAgICAgQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEgKm1kbSA9IGF2X21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhX2NyZWF0ZV9zaWRlX2RhdGEocCk7CisgICAgICAgICAgICBpZiAoIW1kbSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1kbS0+d2hpdGVfcG9pbnRbMF0gPSBhdl9tYWtlX3EoYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKSwgMTAwMDAwKTsKKyAgICAgICAgICAgIG1kbS0+d2hpdGVfcG9pbnRbMV0gPSBhdl9tYWtlX3EoYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKSwgMTAwMDAwKTsKKworICAgICAgICAgICAgLyogUkdCIFByaW1hcmllcyAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgIG1kbS0+ZGlzcGxheV9wcmltYXJpZXNbaV1bMF0gPSBhdl9tYWtlX3EoYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKSwgMTAwMDAwKTsKKyAgICAgICAgICAgICAgICBtZG0tPmRpc3BsYXlfcHJpbWFyaWVzW2ldWzFdID0gYXZfbWFrZV9xKGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYiksIDEwMDAwMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1kbS0+aGFzX3ByaW1hcmllcyA9IDE7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgNCk7IC8qIGNyYyAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBNS1RBRygnZycsICdBJywgJ00nLCAnQScpOiB7CisgICAgICAgICAgICBBVkJQcmludCBicDsKKyAgICAgICAgICAgIGNoYXIgKmdhbW1hX3N0cjsKKyAgICAgICAgICAgIGludCBudW0gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworCisgICAgICAgICAgICBhdl9icHJpbnRfaW5pdCgmYnAsIDAsIC0xKTsKKyAgICAgICAgICAgIGF2X2JwcmludGYoJmJwLCAiJWkvJWkiLCBudW0sIDEwMDAwMCk7CisgICAgICAgICAgICByZXQgPSBhdl9icHJpbnRfZmluYWxpemUoJmJwLCAmZ2FtbWFfc3RyKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZwLT5tZXRhZGF0YSwgImdhbW1hIiwgZ2FtbWFfc3RyLCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCA0KTsgLyogY3JjICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBjYXNlIE1LVEFHKCdJJywgJ0UnLCAnTicsICdEJyk6Ci0gICAgICAgICAgICBpZiAoIShzLT5zdGF0ZSAmIFBOR19BTExJTUFHRSkpCisgICAgICAgICAgICBpZiAoIShzLT5waWNfc3RhdGUgJiBQTkdfQUxMSU1BR0UpKQogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSUVORCB3aXRob3V0IGFsbCBpbWFnZVxuIik7Ci0gICAgICAgICAgICBpZiAoIShzLT5zdGF0ZSAmIChQTkdfQUxMSU1BR0V8UE5HX0lEQVQpKSkgeworICAgICAgICAgICAgaWYgKCEocy0+cGljX3N0YXRlICYgKFBOR19BTExJTUFHRXxQTkdfSURBVCkpKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICB9CkBAIC0xMjI1LDkgKzEzNDcsOSBAQAogICAgICAgICB9CiAgICAgfQogZXhpdF9sb29wOgorCiAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QTkcgJiYKICAgICAgICAgYXZjdHgtPnNraXBfZnJhbWUgPT0gQVZESVNDQVJEX0FMTCkgewotICAgICAgICBhdl9mcmFtZV9zZXRfbWV0YWRhdGEocCwgbWV0YWRhdGEpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTEyNDAsNiArMTM2Miw4IEBACiAgICAgICAgIHNpemVfdCByYXdfYnBwID0gcy0+YnBwIC0gYnl0ZV9kZXB0aDsKICAgICAgICAgdW5zaWduZWQgeCwgeTsKIAorICAgICAgICBhdl9hc3NlcnQwKHMtPmJpdF9kZXB0aCA+IDEpOworCiAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzLT5oZWlnaHQ7ICsreSkgewogICAgICAgICAgICAgdWludDhfdCAqcm93ID0gJnMtPmltYWdlX2J1ZltzLT5pbWFnZV9saW5lc2l6ZSAqIHldOwogCkBAIC0xMjU3LDcgKzEzODEsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyogaGFuZGxlIHAtZnJhbWVzIG9ubHkgaWYgYSBwcmVkZWNlc3NvciBmcmFtZSBpcyBhdmFpbGFibGUgKi8KKyAgICAvKiBoYW5kbGUgUC1mcmFtZXMgb25seSBpZiBhIHByZWRlY2Vzc29yIGZyYW1lIGlzIGF2YWlsYWJsZSAqLwogICAgIGlmIChzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXSkgewogICAgICAgICBpZiAoICAgIShhdnBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpICYmIGF2Y3R4LT5jb2RlY190YWcgIT0gQVZfUkwzMigiTVBORyIpCiAgICAgICAgICAgICAmJiBzLT5sYXN0X3BpY3R1cmUuZi0+d2lkdGggPT0gcC0+d2lkdGgKQEAgLTEyNzUsMTIgKzEzOTksOSBAQAogICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPnBpY3R1cmUsIElOVF9NQVgsIDApOwogICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPnByZXZpb3VzX3BpY3R1cmUsIElOVF9NQVgsIDApOwogCi0gICAgYXZfZnJhbWVfc2V0X21ldGFkYXRhKHAsIG1ldGFkYXRhKTsKLSAgICBtZXRhZGF0YSAgID0gTlVMTDsKICAgICByZXR1cm4gMDsKIAogZmFpbDoKLSAgICBhdl9kaWN0X2ZyZWUoJm1ldGFkYXRhKTsKICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5waWN0dXJlLCBJTlRfTUFYLCAwKTsKICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5wcmV2aW91c19waWN0dXJlLCBJTlRfTUFYLCAwKTsKICAgICByZXR1cm4gcmV0OwpAQCAtMTMxMiw3ICsxNDMzLDkgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgcy0+eSA9IHMtPnN0YXRlID0gcy0+aGFzX3RybnMgPSAwOworICAgIHMtPnkgPSBzLT5oYXNfdHJucyA9IDA7CisgICAgcy0+aGRyX3N0YXRlID0gMDsKKyAgICBzLT5waWNfc3RhdGUgPSAwOwogCiAgICAgLyogaW5pdCB0aGUgemxpYiAqLwogICAgIHMtPnpzdHJlYW0uemFsbG9jID0gZmZfcG5nX3phbGxvYzsKQEAgLTEzMzQsNyArMTQ1Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+cGljdHVyZS5mKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBnb3RvIHRoZV9lbmQ7CiAKICAgICAqZ290X2ZyYW1lID0gMTsKIApAQCAtMTM1OSw3ICsxNDgyLDcgQEAKICAgICBGRlNXQVAoVGhyZWFkRnJhbWUsIHMtPnBpY3R1cmUsIHMtPmxhc3RfcGljdHVyZSk7CiAgICAgcCA9IHMtPnBpY3R1cmUuZjsKIAotICAgIGlmICghKHMtPnN0YXRlICYgUE5HX0lIRFIpKSB7CisgICAgaWYgKCEocy0+aGRyX3N0YXRlICYgUE5HX0lIRFIpKSB7CiAgICAgICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YV9zaXplKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKQEAgLTEzNzksMTQgKzE1MDIsMTQgQEAKICAgICAgICAgZ290byBlbmQ7CiAgICAgfQogICAgIHMtPnkgPSAwOwotICAgIHMtPnN0YXRlICY9IH4oUE5HX0lEQVQgfCBQTkdfQUxMSU1BR0UpOworICAgIHMtPnBpY19zdGF0ZSA9IDA7CiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcy0+Z2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CiAgICAgaWYgKChyZXQgPSBkZWNvZGVfZnJhbWVfY29tbW9uKGF2Y3R4LCBzLCBwLCBhdnBrdCkpIDwgMCkKICAgICAgICAgZ290byBlbmQ7CiAKLSAgICBpZiAoIShzLT5zdGF0ZSAmIFBOR19BTExJTUFHRSkpCisgICAgaWYgKCEocy0+cGljX3N0YXRlICYgUE5HX0FMTElNQUdFKSkKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkZyYW1lIGRpZCBub3QgY29udGFpbiBhIGNvbXBsZXRlIGltYWdlXG4iKTsKLSAgICBpZiAoIShzLT5zdGF0ZSAmIChQTkdfQUxMSU1BR0V8UE5HX0lEQVQpKSkgeworICAgIGlmICghKHMtPnBpY19zdGF0ZSAmIChQTkdfQUxMSU1BR0V8UE5HX0lEQVQpKSkgewogICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBnb3RvIGVuZDsKICAgICB9CkBAIC0xNDM1LDcgKzE1NTgsNyBAQAogCiAgICAgICAgIG1lbWNweShwZHN0LT5wYWxldHRlLCBwc3JjLT5wYWxldHRlLCBzaXplb2YocGRzdC0+cGFsZXR0ZSkpOwogCi0gICAgICAgIHBkc3QtPnN0YXRlIHw9IHBzcmMtPnN0YXRlICYgKFBOR19JSERSIHwgUE5HX1BMVEUpOworICAgICAgICBwZHN0LT5oZHJfc3RhdGUgfD0gcHNyYy0+aGRyX3N0YXRlOwogCiAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihkc3QsICZwZHN0LT5sYXN0X3BpY3R1cmUpOwogICAgICAgICBpZiAocHNyYy0+bGFzdF9waWN0dXJlLmYtPmRhdGFbMF0gJiYKQEAgLTE1MTAsNiArMTYzMyw3IEBACiAgICAgLmluaXRfdGhyZWFkX2NvcHkgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChwbmdfZGVjX2luaXQpLAogICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh1cGRhdGVfdGhyZWFkX2NvbnRleHQpLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyAvKnwgQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCovLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwogI2VuZGlmCiAKQEAgLTE1MjYsNiArMTY1MCw2IEBACiAgICAgLmluaXRfdGhyZWFkX2NvcHkgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChwbmdfZGVjX2luaXQpLAogICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh1cGRhdGVfdGhyZWFkX2NvbnRleHQpLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyAvKnwgQVZfQ09ERUNfQ0FQX0RSQVdfSE9SSVpfQkFORCovLAotICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9TS0lQX0ZSQU1FX0ZJTExfUEFSQU0sCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSB8IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BuZ2VuYy5jIGIvbGliYXZjb2RlYy9wbmdlbmMuYwppbmRleCBlOWU4YmMyLi42OWI0NDk1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BuZ2VuYy5jCisrKyBiL2xpYmF2Y29kZWMvcG5nZW5jLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCi0jaW5jbHVkZSAiaHVmZnl1dmVuY2RzcC5oIgorI2luY2x1ZGUgImxvc3NsZXNzX3ZpZGVvZW5jZHNwLmgiCiAjaW5jbHVkZSAicG5nLmgiCiAjaW5jbHVkZSAiYXBuZy5oIgogCkBAIC00Nyw3ICs0Nyw3IEBACiAKIHR5cGVkZWYgc3RydWN0IFBOR0VuY0NvbnRleHQgewogICAgIEFWQ2xhc3MgKmNsYXNzOwotICAgIEh1ZmZZVVZFbmNEU1BDb250ZXh0IGhkc3A7CisgICAgTExWaWRFbmNEU1BDb250ZXh0IGxsdmlkZW5jZHNwOwogCiAgICAgdWludDhfdCAqYnl0ZXN0cmVhbTsKICAgICB1aW50OF90ICpieXRlc3RyZWFtX3N0YXJ0OwpAQCAtNjgsNiArNjgsOSBAQAogICAgIC8vIEFQTkcKICAgICB1aW50MzJfdCBwYWxldHRlX2NoZWNrc3VtOyAgIC8vIFVzZWQgdG8gZW5zdXJlIGEgc2luZ2xlIHVuaXF1ZSBwYWxldHRlCiAgICAgdWludDMyX3Qgc2VxdWVuY2VfbnVtYmVyOworICAgIGludCBleHRyYV9kYXRhX3VwZGF0ZWQ7CisgICAgdWludDhfdCAqZXh0cmFfZGF0YTsKKyAgICBpbnQgZXh0cmFfZGF0YV9zaXplOwogCiAgICAgQVZGcmFtZSAqcHJldl9mcmFtZTsKICAgICBBVkZyYW1lICpsYXN0X2ZyYW1lOwpAQCAtMTU2LDcgKzE1OSw3IEBACiAgICAgZm9yICh4ID0gMDsgeCA8IHVuYWxpZ25lZF93OyB4KyspCiAgICAgICAgICpkc3QrKyA9ICpzcmMxKysgLSAqc3JjMisrOwogICAgIHNpemUgLT0gdW5hbGlnbmVkX3c7Ci0gICAgYy0+aGRzcC5kaWZmX2J5dGVzKGRzdCwgc3JjMSwgc3JjMiwgc2l6ZSk7CisgICAgYy0+bGx2aWRlbmNkc3AuZGlmZl9ieXRlcyhkc3QsIHNyYzEsIHNyYzIsIHNpemUpOwogfQogCiBzdGF0aWMgdm9pZCBwbmdfZmlsdGVyX3JvdyhQTkdFbmNDb250ZXh0ICpjLCB1aW50OF90ICpkc3QsIGludCBmaWx0ZXJfdHlwZSwKQEAgLTE3Miw3ICsxNzUsNyBAQAogICAgICAgICBzdWJfbGVmdF9wcmVkaWN0aW9uKGMsIGRzdCwgc3JjLCBicHAsIHNpemUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFBOR19GSUxURVJfVkFMVUVfVVA6Ci0gICAgICAgIGMtPmhkc3AuZGlmZl9ieXRlcyhkc3QsIHNyYywgdG9wLCBzaXplKTsKKyAgICAgICAgYy0+bGx2aWRlbmNkc3AuZGlmZl9ieXRlcyhkc3QsIHNyYywgdG9wLCBzaXplKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBQTkdfRklMVEVSX1ZBTFVFX0FWRzoKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJwcDsgaSsrKQpAQCAtNzY2LDcgKzc2OSwxMSBAQAogCiAgICAgICAgICAgICAvLyBEbyBkaXNwb3NhbAogICAgICAgICAgICAgaWYgKGxhc3RfZmN0bF9jaHVuay5kaXNwb3NlX29wICE9IEFQTkdfRElTUE9TRV9PUF9QUkVWSU9VUykgewotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2NvcHkoZGlmZkZyYW1lLCBzLT5sYXN0X2ZyYW1lKTsKKyAgICAgICAgICAgICAgICBkaWZmRnJhbWUtPndpZHRoID0gcGljdC0+d2lkdGg7CisgICAgICAgICAgICAgICAgZGlmZkZyYW1lLT5oZWlnaHQgPSBwaWN0LT5oZWlnaHQ7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weShkaWZmRnJhbWUsIHMtPmxhc3RfZnJhbWUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAKICAgICAgICAgICAgICAgICBpZiAobGFzdF9mY3RsX2NodW5rLmRpc3Bvc2Vfb3AgPT0gQVBOR19ESVNQT1NFX09QX0JBQ0tHUk9VTkQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gbGFzdF9mY3RsX2NodW5rLnlfb2Zmc2V0OyB5IDwgbGFzdF9mY3RsX2NodW5rLnlfb2Zmc2V0ICsgbGFzdF9mY3RsX2NodW5rLmhlaWdodDsgKyt5KSB7CkBAIC03NzgsNyArNzg1LDExIEBACiAgICAgICAgICAgICAgICAgaWYgKCFzLT5wcmV2X2ZyYW1lKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2NvcHkoZGlmZkZyYW1lLCBzLT5wcmV2X2ZyYW1lKTsKKyAgICAgICAgICAgICAgICBkaWZmRnJhbWUtPndpZHRoID0gcGljdC0+d2lkdGg7CisgICAgICAgICAgICAgICAgZGlmZkZyYW1lLT5oZWlnaHQgPSBwaWN0LT5oZWlnaHQ7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weShkaWZmRnJhbWUsIHMtPnByZXZfZnJhbWUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIERvIGludmVyc2UgYmxlbmRpbmcKQEAgLTg2MiwxNSArODczLDE1IEBACiAgICAgICAgIGlmICghcGljdCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAKLSAgICAgICAgcy0+Ynl0ZXN0cmVhbSA9IGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoRkZfTUlOX0JVRkZFUl9TSVpFKTsKLSAgICAgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKQorICAgICAgICBzLT5ieXRlc3RyZWFtID0gcy0+ZXh0cmFfZGF0YSA9IGF2X21hbGxvYyhBVl9JTlBVVF9CVUZGRVJfTUlOX1NJWkUpOworICAgICAgICBpZiAoIXMtPmV4dHJhX2RhdGEpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgICAgIHJldCA9IGVuY29kZV9oZWFkZXJzKGF2Y3R4LCBwaWN0KTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHMtPmJ5dGVzdHJlYW0gLSBhdmN0eC0+ZXh0cmFkYXRhOworICAgICAgICBzLT5leHRyYV9kYXRhX3NpemUgPSBzLT5ieXRlc3RyZWFtIC0gcy0+ZXh0cmFfZGF0YTsKIAogICAgICAgICBzLT5sYXN0X2ZyYW1lX3BhY2tldCA9IGF2X21hbGxvYyhtYXhfcGFja2V0X3NpemUpOwogICAgICAgICBpZiAoIXMtPmxhc3RfZnJhbWVfcGFja2V0KQpAQCAtOTA5LDYgKzkyMCwxMyBAQAogICAgIGlmIChzLT5sYXN0X2ZyYW1lKSB7CiAgICAgICAgIHVpbnQ4X3QqIGxhc3RfZmN0bF9jaHVua19zdGFydCA9IHBrdC0+ZGF0YTsKICAgICAgICAgdWludDhfdCBidWZbMjZdOworICAgICAgICBpZiAoIXMtPmV4dHJhX2RhdGFfdXBkYXRlZCkgeworICAgICAgICAgICAgdWludDhfdCAqc2lkZV9kYXRhID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9ORVdfRVhUUkFEQVRBLCBzLT5leHRyYV9kYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKCFzaWRlX2RhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIG1lbWNweShzaWRlX2RhdGEsIHMtPmV4dHJhX2RhdGEsIHMtPmV4dHJhX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBzLT5leHRyYV9kYXRhX3VwZGF0ZWQgPSAxOworICAgICAgICB9CiAKICAgICAgICAgQVZfV0IzMihidWYgKyAwLCBzLT5sYXN0X2ZyYW1lX2ZjdGwuc2VxdWVuY2VfbnVtYmVyKTsKICAgICAgICAgQVZfV0IzMihidWYgKyA0LCBzLT5sYXN0X2ZyYW1lX2ZjdGwud2lkdGgpOwpAQCAtOTk3LDcgKzEwMTUsNyBAQAogRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAjZW5kaWYKIAotICAgIGZmX2h1ZmZ5dXZlbmNkc3BfaW5pdCgmcy0+aGRzcCk7CisgICAgZmZfbGx2aWRlbmNkc3BfaW5pdCgmcy0+bGx2aWRlbmNkc3ApOwogCiAjaWYgRkZfQVBJX1BSSVZBVEVfT1BUCiBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCkBAIC0xMDg1LDYgKzExMDMsOCBAQAogICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmxhc3RfZnJhbWUpOwogICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnByZXZfZnJhbWUpOwogICAgIGF2X2ZyZWVwKCZzLT5sYXN0X2ZyYW1lX3BhY2tldCk7CisgICAgYXZfZnJlZXAoJnMtPmV4dHJhX2RhdGEpOworICAgIHMtPmV4dHJhX2RhdGFfc2l6ZSA9IDA7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTExNDcsNyArMTE2Nyw3IEBACiAgICAgLmluaXQgICAgICAgICAgID0gcG5nX2VuY19pbml0LAogICAgIC5jbG9zZSAgICAgICAgICA9IHBuZ19lbmNfY2xvc2UsCiAgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2FwbmcsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQ09ERUNfQ0FQX0RFTEFZLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSwKICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKICAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9SR0JBLAogICAgICAgICBBVl9QSVhfRk1UX1JHQjQ4QkUsIEFWX1BJWF9GTVRfUkdCQTY0QkUsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BubS5jIGIvbGliYXZjb2RlYy9wbm0uYwppbmRleCAxNjc1OTU5Li5iMDZhNmU4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BubS5jCisrKyBiL2xpYmF2Y29kZWMvcG5tLmMKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInBubS5oIgogCiBzdGF0aWMgaW5saW5lIGludCBwbm1fc3BhY2UoaW50IGMpCkBAIC02MSw2ICs2Miw3IEBACiB7CiAgICAgY2hhciBidWYxWzMyXSwgdHVwbGVfdHlwZVszMl07CiAgICAgaW50IGgsIHcsIGRlcHRoLCBtYXh2YWw7CisgICAgaW50IHJldDsKIAogICAgIHBubV9nZXQocywgYnVmMSwgc2l6ZW9mKGJ1ZjEpKTsKICAgICBpZihidWYxWzBdICE9ICdQJykKQEAgLTEwNywxMSArMTA5LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLyogY2hlY2sgdGhhdCBhbGwgdGFncyBhcmUgcHJlc2VudCAqLwotICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCBtYXh2YWwgPD0gMCB8fCBkZXB0aCA8PSAwIHx8IHR1cGxlX3R5cGVbMF0gPT0gJ1wwJyB8fCBhdl9pbWFnZV9jaGVja19zaXplKHcsIGgsIDAsIGF2Y3R4KSB8fCBzLT5ieXRlc3RyZWFtID49IHMtPmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICBpZiAodyA8PSAwIHx8IGggPD0gMCB8fCBtYXh2YWwgPD0gMCB8fCBtYXh2YWwgPiBVSU5UMTZfTUFYIHx8IGRlcHRoIDw9IDAgfHwgdHVwbGVfdHlwZVswXSA9PSAnXDAnIHx8CisgICAgICAgICAgICBhdl9pbWFnZV9jaGVja19zaXplKHcsIGgsIDAsIGF2Y3R4KSB8fCBzLT5ieXRlc3RyZWFtID49IHMtPmJ5dGVzdHJlYW1fZW5kKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICAgICAgYXZjdHgtPndpZHRoICA9IHc7Ci0gICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBoOworICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgcy0+bWF4dmFsICAgICA9IG1heHZhbDsKICAgICAgICAgaWYgKGRlcHRoID09IDEpIHsKICAgICAgICAgICAgIGlmIChtYXh2YWwgPT0gMSkgewpAQCAtMTUzLDEzICsxNTcsMTQgQEAKICAgICBpZih3IDw9IDAgfHwgaCA8PSAwIHx8IGF2X2ltYWdlX2NoZWNrX3NpemUodywgaCwgMCwgYXZjdHgpIHx8IHMtPmJ5dGVzdHJlYW0gPj0gcy0+Ynl0ZXN0cmVhbV9lbmQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgYXZjdHgtPndpZHRoICA9IHc7Ci0gICAgYXZjdHgtPmhlaWdodCA9IGg7CisgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHcsIGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgaWYgKGF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfTU9OT1dISVRFICYmIGF2Y3R4LT5waXhfZm10ICE9IEFWX1BJWF9GTVRfTU9OT0JMQUNLKSB7CiAgICAgICAgIHBubV9nZXQocywgYnVmMSwgc2l6ZW9mKGJ1ZjEpKTsKICAgICAgICAgcy0+bWF4dmFsID0gYXRvaShidWYxKTsKLSAgICAgICAgaWYgKHMtPm1heHZhbCA8PSAwKSB7CisgICAgICAgIGlmIChzLT5tYXh2YWwgPD0gMCB8fCBzLT5tYXh2YWwgPiBVSU5UMTZfTUFYKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWF4dmFsOiAlZFxuIiwgcy0+bWF4dmFsKTsKICAgICAgICAgICAgIHMtPm1heHZhbCA9IDI1NTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wbm1fcGFyc2VyLmMgYi9saWJhdmNvZGVjL3BubV9wYXJzZXIuYwppbmRleCBhN2Q3MGI5Li5iZGQ3ZjJiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BubV9wYXJzZXIuYworKysgYi9saWJhdmNvZGVjL3BubV9wYXJzZXIuYwpAQCAtNTYsMTUgKzU2LDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdvdG8gcmV0cnk7CiAgICAgICAgIH0KLSNpZiAwCi0gICAgICAgIGlmIChwYy0+aW5kZXggJiYgcGMtPmluZGV4ICogMiArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgPCBwYy0+YnVmZmVyX3NpemUgJiYgYnVmX3NpemUgPiBwYy0+aW5kZXgpIHsKLSAgICAgICAgICAgIG1lbWNweShwYy0+YnVmZmVyICsgcGMtPmluZGV4LCBidWYsIHBjLT5pbmRleCk7Ci0gICAgICAgICAgICBwYy0+aW5kZXggKz0gcGMtPmluZGV4OwotICAgICAgICAgICAgYnVmICAgICAgICs9IHBjLT5pbmRleDsKLSAgICAgICAgICAgIGJ1Zl9zaXplICAtPSBwYy0+aW5kZXg7Ci0gICAgICAgICAgICBnb3RvIHJldHJ5OwotICAgICAgICB9Ci0jZW5kaWYKKyAgICAgICAgbmV4dCA9IEVORF9OT1RfRk9VTkQ7CisgICAgfSBlbHNlIGlmIChwbm1jdHgudHlwZSA8IDQpIHsKICAgICAgICAgbmV4dCA9IEVORF9OT1RfRk9VTkQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbmV4dCA9IHBubWN0eC5ieXRlc3RyZWFtIC0gcG5tY3R4LmJ5dGVzdHJlYW1fc3RhcnQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcG5tZGVjLmMgYi9saWJhdmNvZGVjL3BubWRlYy5jCmluZGV4IGQ0MjYxYTQuLjk1OGM1ZTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcG5tZGVjLmMKKysrIGIvbGliYXZjb2RlYy9wbm1kZWMuYwpAQCAtNDMsNyArNDMsNyBAQAogICAgIGludCBidWZfc2l6ZSAgICAgICAgID0gYXZwa3QtPnNpemU7CiAgICAgUE5NQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFWRnJhbWUgKiBjb25zdCBwICAgID0gZGF0YTsKLSAgICBpbnQgaSwgaiwgbiwgbGluZXNpemUsIGgsIHVwZ3JhZGUgPSAwLCBpc19tb25vID0gMDsKKyAgICBpbnQgaSwgaiwgaywgbiwgbGluZXNpemUsIGgsIHVwZ3JhZGUgPSAwLCBpc19tb25vID0gMDsKICAgICB1bnNpZ25lZCBjaGFyICpwdHI7CiAgICAgaW50IGNvbXBvbmVudHMsIHNhbXBsZV9sZW4sIHJldDsKIApAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgZG9fcmVhZDoKICAgICAgICAgcHRyICAgICAgPSBwLT5kYXRhWzBdOwogICAgICAgICBsaW5lc2l6ZSA9IHAtPmxpbmVzaXplWzBdOwotICAgICAgICBpZiAocy0+Ynl0ZXN0cmVhbSArIG4gKiBhdmN0eC0+aGVpZ2h0ID4gcy0+Ynl0ZXN0cmVhbV9lbmQpCisgICAgICAgIGlmIChuICogYXZjdHgtPmhlaWdodCA+IHMtPmJ5dGVzdHJlYW1fZW5kIC0gcy0+Ynl0ZXN0cmVhbSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBpZihzLT50eXBlIDwgNCB8fCAoaXNfbW9ubyAmJiBzLT50eXBlPT03KSl7CiAgICAgICAgICAgICBmb3IgKGk9MDsgaTxhdmN0eC0+aGVpZ2h0OyBpKyspIHsKQEAgLTE0MywxMCArMTQzLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gKCpzLT5ieXRlc3RyZWFtKyspJjE7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZWFkIGEgc2VxdWVuY2Ugb2YgZGlnaXRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNSAmJiBjIDw9IDk7IGsgKz0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAxMCp2ICsgYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKCpzLT5ieXRlc3RyZWFtKyspIC0gJzAnOwotICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoYyA8PSA5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ID4gcy0+bWF4dmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2YWx1ZSAlZCBsYXJnZXIgdGhhbiBtYXh2YWwgJWRcbiIsIHYsIHMtPm1heHZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKHNhbXBsZV9sZW4gPT0gMTYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDE2X3QqKXB0cilbal0gPSAoKCgxPDxzYW1wbGVfbGVuKS0xKSp2ICsgKHMtPm1heHZhbD4+MSkpL3MtPm1heHZhbDsKQEAgLTE4OCw3ICsxOTIsNyBAQAogICAgICAgICAgICAgbGluZXNpemUgPSBwLT5saW5lc2l6ZVswXTsKICAgICAgICAgICAgIGlmIChzLT5tYXh2YWwgPj0gMjU2KQogICAgICAgICAgICAgICAgIG4gKj0gMjsKLSAgICAgICAgICAgIGlmIChzLT5ieXRlc3RyZWFtICsgbiAqIGF2Y3R4LT5oZWlnaHQgKiAzIC8gMiA+IHMtPmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICAgICAgaWYgKG4gKiBhdmN0eC0+aGVpZ2h0ICogMyAvIDIgPiBzLT5ieXRlc3RyZWFtX2VuZCAtIHMtPmJ5dGVzdHJlYW0pCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc2FtcGxlY3B5KHB0ciwgcy0+Ynl0ZXN0cmVhbSwgbiwgcy0+bWF4dmFsKTsKQEAgLTIxOCw3ICsyMjIsNyBAQAogICAgICAgICAgICAgbiAgICAgICAgPSBhdmN0eC0+d2lkdGggKiAyOwogICAgICAgICAgICAgcHRyICAgICAgPSBwLT5kYXRhWzBdOwogICAgICAgICAgICAgbGluZXNpemUgPSBwLT5saW5lc2l6ZVswXTsKLSAgICAgICAgICAgIGlmIChzLT5ieXRlc3RyZWFtICsgbiAqIGF2Y3R4LT5oZWlnaHQgKiAzIC8gMiA+IHMtPmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICAgICAgaWYgKG4gKiBhdmN0eC0+aGVpZ2h0ICogMyAvIDIgPiBzLT5ieXRlc3RyZWFtX2VuZCAtIHMtPmJ5dGVzdHJlYW0pCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG4gLyAyOyBqKyspIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL01ha2VmaWxlIGIvbGliYXZjb2RlYy9wcGMvTWFrZWZpbGUKaW5kZXggYmQ0ZjQyNy4uMDNlNWI0MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvTWFrZWZpbGUKKysrIGIvbGliYXZjb2RlYy9wcGMvTWFrZWZpbGUKQEAgLTQsMjcgKzQsMjggQEAKIE9CSlMtJChDT05GSUdfRkZUKSAgICAgICAgICAgICAgICAgICAgICs9IHBwYy9mZnRfaW5pdC5vICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwYy9mZnRfYWx0aXZlYy5vICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwYy9mZnRfdnN4Lm8KK09CSlMtJChDT05GSUdfRkRDVERTUCkgICAgICAgICAgICAgICAgICs9IHBwYy9mZGN0ZHNwLm8KIE9CSlMtJChDT05GSUdfRk1UQ09OVkVSVCkgICAgICAgICAgICAgICs9IHBwYy9mbXRjb252ZXJ0X2FsdGl2ZWMubwogT0JKUy0kKENPTkZJR19IMjY0Q0hST01BKSAgICAgICAgICAgICAgKz0gcHBjL2gyNjRjaHJvbWFfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0gyNjREU1ApICAgICAgICAgICAgICAgICArPSBwcGMvaDI2NGRzcC5vIHBwYy9ocGVsZHNwX2FsdGl2ZWMubwogT0JKUy0kKENPTkZJR19IMjY0UVBFTCkgICAgICAgICAgICAgICAgKz0gcHBjL2gyNjRxcGVsLm8KIE9CSlMtJChDT05GSUdfSFBFTERTUCkgICAgICAgICAgICAgICAgICs9IHBwYy9ocGVsZHNwX2FsdGl2ZWMubwotT0JKUy0kKENPTkZJR19IVUZGWVVWRFNQKSAgICAgICAgICAgICAgKz0gcHBjL2h1ZmZ5dXZkc3BfYWx0aXZlYy5vCi1PQkpTLSQoQ09ORklHX0ZEQ1REU1ApICAgICAgICAgICAgICAgICArPSBwcGMvZmRjdGRzcC5vCiBPQkpTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICAgICAgICArPSBwcGMvaWRjdGRzcC5vCitPQkpTLSQoQ09ORklHX0xMVklERFNQKSAgICAgICAgICAgICAgICArPSBwcGMvbG9zc2xlc3NfdmlkZW9kc3BfYWx0aXZlYy5vCiBPQkpTLSQoQ09ORklHX01FX0NNUCkgICAgICAgICAgICAgICAgICArPSBwcGMvbWVfY21wLm8KIE9CSlMtJChDT05GSUdfTVBFR0FVRElPRFNQKSAgICAgICAgICAgICs9IHBwYy9tcGVnYXVkaW9kc3BfYWx0aXZlYy5vCiBPQkpTLSQoQ09ORklHX01QRUdWSURFTykgICAgICAgICAgICAgICArPSBwcGMvbXBlZ3ZpZGVvX2FsdGl2ZWMubyAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwYy9tcGVndmlkZW9kc3AubwogT0JKUy0kKENPTkZJR19NUEVHVklERU9FTkMpICAgICAgICAgICAgKz0gcHBjL21wZWd2aWRlb2VuY2RzcC5vCiBPQkpTLSQoQ09ORklHX1BJWEJMT0NLRFNQKSAgICAgICAgICAgICArPSBwcGMvcGl4YmxvY2tkc3AubwotT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICAgICAgKz0gcHBjL3ZpZGVvZHNwX3BwYy5vCitPQkpTLSQoQ09ORklHX1ZDMURTUCkgICAgICAgICAgICAgICAgICArPSBwcGMvdmMxZHNwX2FsdGl2ZWMubworT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICAgICAgKz0gcHBjL3ZpZGVvZHNwLm8KIE9CSlMtJChDT05GSUdfVlAzRFNQKSAgICAgICAgICAgICAgICAgICs9IHBwYy92cDNkc3BfYWx0aXZlYy5vCiBPQkpTLSQoQ09ORklHX1ZQOERTUCkgICAgICAgICAgICAgICAgICArPSBwcGMvdnA4ZHNwX2FsdGl2ZWMubwogCiAjIGRlY29kZXJzL2VuY29kZXJzCitPQkpTLSQoQ09ORklHX0hFVkNfREVDT0RFUikgICAgICAgICAgICArPSBwcGMvaGV2Y2RzcC5vCiBPQkpTLSQoQ09ORklHX0xMQVVERFNQKSAgICAgICAgICAgICAgICArPSBwcGMvbG9zc2xlc3NfYXVkaW9kc3BfYWx0aXZlYy5vCiBPQkpTLSQoQ09ORklHX1NWUTFfRU5DT0RFUikgICAgICAgICAgICArPSBwcGMvc3ZxMWVuY19hbHRpdmVjLm8KLU9CSlMtJChDT05GSUdfVkMxX0RFQ09ERVIpICAgICAgICAgICAgICs9IHBwYy92YzFkc3BfYWx0aXZlYy5vCiBPQkpTLSQoQ09ORklHX1ZPUkJJU19ERUNPREVSKSAgICAgICAgICArPSBwcGMvdm9yYmlzZHNwX2FsdGl2ZWMubwogT0JKUy0kKENPTkZJR19WUDdfREVDT0RFUikgICAgICAgICAgICAgKz0gcHBjL3ZwOGRzcF9hbHRpdmVjLm8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2FzbS5TIGIvbGliYXZjb2RlYy9wcGMvYXNtLlMKaW5kZXggYTNlZGVlZC4uNjIyMmI4YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvYXNtLlMKKysrIGIvbGliYXZjb2RlYy9wcGMvYXNtLlMKQEAgLTI0LDYgKzI0LDEyIEBACiAjZGVmaW5lIEpPSU4oYSwgYikgR0xVRShhLCBiKQogI2RlZmluZSBYKHMpIEpPSU4oRVhURVJOX0FTTSwgcykKIAorI2lmIF9fQVBQTEVfXworI2RlZmluZSBSKG4pIHIgIyMgbgorI2Vsc2UKKyNkZWZpbmUgUihuKSBuCisjZW5kaWYKKwogI2lmIEFSQ0hfUFBDNjQKIAogI2RlZmluZSBQVFIgIC5xdWFkCkBAIC01Myw3ICs1OSw3IEBACiAuZW5kbQogCiAubWFjcm8gbW92cmVsIHJkLCBzeW0sIGdwCi0gICAgbGQgICAgICBccmQsIFxzeW1AZ290KHIyKQorICAgIGxkICAgICAgXHJkLCBcc3ltQGdvdChSKDIpKQogLmVuZG0KIAogLm1hY3JvIGdldF9nb3QgcmQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2F1ZGlvZHNwLmMgYi9saWJhdmNvZGVjL3BwYy9hdWRpb2RzcC5jCmluZGV4IGM4OGMzZDkuLjJlMzc0NzMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL2F1ZGlvZHNwLmMKKysrIGIvbGliYXZjb2RlYy9wcGMvYXVkaW9kc3AuYwpAQCAtMjQsMTUgKzI0LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lmIEhBVkVfQUxUSVZFQ19ICi0jaW5jbHVkZSA8YWx0aXZlYy5oPgotI2VuZGlmCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisKICNpbmNsdWRlICJsaWJhdmNvZGVjL2F1ZGlvZHNwLmgiCiAKICNpZiBIQVZFX0FMVElWRUMKQEAgLTYxLDYgKzU4LDMxIEBACiAKICNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KIAorI2lmIEhBVkVfVlNYCisKK3N0YXRpYyBpbnQzMl90IHNjYWxhcnByb2R1Y3RfaW50MTZfdnN4KGNvbnN0IGludDE2X3QgKnYxLCBjb25zdCBpbnQxNl90ICp2MiwgaW50IG9yZGVyKQoreworICAgIGludCBpOworICAgIExPQURfWkVSTzsKKyAgICByZWdpc3RlciB2ZWNfczE2IHZlYzE7CisgICAgcmVnaXN0ZXIgdmVjX3MzMiByZXMgPSB2ZWNfc3BsYXRfczMyKDApLCB0OworICAgIGludDMyX3QgaXJlczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlcjsgaSArPSA4KSB7CisgICAgICAgIHZlYzEgPSB2ZWNfdnN4X2xkKDAsIHYxKTsKKyAgICAgICAgdCAgICA9IHZlY19tc3VtKHZlYzEsIHZlY19sZCgwLCB2MiksIHplcm9fczMydik7CisgICAgICAgIHJlcyAgPSB2ZWNfc3Vtcyh0LCByZXMpOworICAgICAgICB2MSAgKz0gODsKKyAgICAgICAgdjIgICs9IDg7CisgICAgfQorICAgIHJlcyA9IHZlY19zcGxhdChyZXMsIDMpOworICAgIHZlY19zdGUocmVzLCAwLCAmaXJlcyk7CisKKyAgICByZXR1cm4gaXJlczsKK30KKworI2VuZGlmIC8qIEhBVkVfVlNYICovCisKIGF2X2NvbGQgdm9pZCBmZl9hdWRpb2RzcF9pbml0X3BwYyhBdWRpb0RTUENvbnRleHQgKmMpCiB7CiAjaWYgSEFWRV9BTFRJVkVDCkBAIC02OSw0ICs5MSwxMSBAQAogCiAgICAgYy0+c2NhbGFycHJvZHVjdF9pbnQxNiA9IHNjYWxhcnByb2R1Y3RfaW50MTZfYWx0aXZlYzsKICNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworI2lmIEhBVkVfVlNYCisgICAgaWYgKCFQUENfVlNYKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGMtPnNjYWxhcnByb2R1Y3RfaW50MTYgPSBzY2FsYXJwcm9kdWN0X2ludDE2X3ZzeDsKKyNlbmRpZiAvKiBIQVZFX1ZTWCAqLwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvYmxvY2tkc3AuYyBiL2xpYmF2Y29kZWMvcHBjL2Jsb2NrZHNwLmMKaW5kZXggNDVjNDkyYS4uZDg5Yjc3ZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvYmxvY2tkc3AuYworKysgYi9saWJhdmNvZGVjL3BwYy9ibG9ja2RzcC5jCkBAIC0yMSwxNiArMjEsMTUgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaWYgSEFWRV9BTFRJVkVDX0gKLSNpbmNsdWRlIDxhbHRpdmVjLmg+Ci0jZW5kaWYKKwogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvYmxvY2tkc3AuaCIKIAogLyogKioqKiogV0FSTklORyAqKioqKiBXQVJOSU5HICoqKioqIFdBUk5JTkcgKioqKiogKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2RjdC10ZXN0LmMgYi9saWJhdmNvZGVjL3BwYy9kY3QtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzI4NTE2Li4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvcHBjL2RjdC10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgImZkY3QuaCIKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGZkY3RfdGFiX2FyY2hbXSA9IHsKLSNpZiBIQVZFX0FMVElWRUMKLSAgICB7ICJhbHRpdmVjZmRjdCIsIGZmX2ZkY3RfYWx0aXZlYywgRkZfSURDVF9QRVJNX05PTkUsIEFWX0NQVV9GTEFHX0FMVElWRUMgfSwKLSNlbmRpZgotICAgIHsgMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gaWRjdF90YWJfYXJjaFtdID0gewotICAgIHsgMCB9Ci19OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvZmRjdGRzcC5jIGIvbGliYXZjb2RlYy9wcGMvZmRjdGRzcC5jCmluZGV4IDY2NTkwNDYuLjRhYjUxNmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL2ZkY3Rkc3AuYworKysgYi9saWJhdmNvZGVjL3BwYy9mZGN0ZHNwLmMKQEAgLTE5LDE0ICsxOSwxNCBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpZiBIQVZFX0FMVElWRUNfSAotI2luY2x1ZGUgPGFsdGl2ZWMuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorCiAjaW5jbHVkZSAibGliYXZjb2RlYy9mZGN0ZHNwLmgiCisKICNpbmNsdWRlICJmZGN0LmgiCiAKICNpZiBIQVZFX0FMVElWRUMKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2ZmdF9hbHRpdmVjLlMgYi9saWJhdmNvZGVjL3BwYy9mZnRfYWx0aXZlYy5TCmluZGV4IGFhYjY2OWUuLjhjZDY4ZDYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL2ZmdF9hbHRpdmVjLlMKKysrIGIvbGliYXZjb2RlYy9wcGMvZmZ0X2FsdGl2ZWMuUwpAQCAtNDAsNyArNDAsNyBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpZiBIQVZFX0dOVV9BUyAmJiBIQVZFX0FMVElWRUMKKyNpZiBIQVZFX0dOVV9BUyAmJiBIQVZFX0FMVElWRUMgJiYgSEFWRV9CSUdFTkRJQU4KIAogI2luY2x1ZGUgImFzbS5TIgogCkBAIC0zNTQsMTQgKzM1NCwxOCBAQAogLm1hY3JvIGZmdF9jYWxjIGludGVybGVhdmUKIGV4dGZ1bmMgZmZfZmZ0X2NhbGNcaW50ZXJsZWF2ZVwoKV9hbHRpdmVjCiAgICAgbWZsciAgICByMAotICAgIHN0cCAgICAgcjAsIDIqUFMocjEpCi0gICAgc3RwdSAgICByMSwgLSgxNjArMTYqUFMpKHIxKQorICAgIHN0cCAgICAgcjAsIDIqUFMoUigxKSkKKyAgICBzdHB1ICAgIHIxLCAtKDE2MCsxNipQUykoUigxKSkKICAgICBnZXRfZ290IHIxMQogICAgIGFkZGkgICAgcjYsIHIxLCAxNipQUwogICAgIHN0dm0gICAgcjYsIHYyMCwgdjIxLCB2MjIsIHYyMywgdjI0LCB2MjUsIHYyNiwgdjI3LCB2MjgsIHYyOQogICAgIG1mdnJzYXZlIHIwCi0gICAgc3R3ICAgICByMCwgMTUqUFMocjEpCisgICAgc3R3ICAgICByMCwgMTUqUFMoUigxKSkKKyNpZiBfX0FQUExFX18KICAgICBsaSAgICAgIHI2LCAweGZmZmZmZmZjCisjZWxzZQorICAgIGxpICAgICAgcjYsIC00CisjZW5kaWYKICAgICBtdHZyc2F2ZSByNgogCiAgICAgbW92cmVsICByNiwgZmZ0X2RhdGEsIHIxMQpAQCAtMzcyLDcgKzM3Niw3IEBACiAgICAgbW92cmVsICByMTIsIFgoZmZfY29zX3RhYnMpLCByMTEKIAogICAgIG1vdnJlbCAgcjYsIGZmdF9kaXNwYXRjaF90YWJcaW50ZXJsZWF2ZVwoKV9hbHRpdmVjLCByMTEKLSAgICBsd3ogICAgIHIzLCAwKHIzKQorICAgIGx3eiAgICAgcjMsIDAoUigzKSkKICAgICBzdWJpICAgIHIzLCByMywgMgogICAgIHNsd2kgICAgcjMsIHIzLCAyK0FSQ0hfUFBDNjQKICAgICBscHggICAgIHIzLCByMywgcjYKQEAgLTM4MiwxMCArMzg2LDEwIEBACiAKICAgICBhZGRpICAgIHI2LCByMSwgMTYqUFMKICAgICBsdm0gICAgIHI2LCB2MjAsIHYyMSwgdjIyLCB2MjMsIHYyNCwgdjI1LCB2MjYsIHYyNywgdjI4LCB2MjkKLSAgICBsd3ogICAgIHI2LCAxNSpQUyhyMSkKKyAgICBsd3ogICAgIHI2LCAxNSpQUyhSKDEpKQogICAgIG10dnJzYXZlIHI2Ci0gICAgbHAgICAgICByMSwgMChyMSkKLSAgICBscCAgICAgIHIwLCAyKlBTKHIxKQorICAgIGxwICAgICAgcjEsIDAoUigxKSkKKyAgICBscCAgICAgIHIwLCAyKlBTKFIoMSkpCiAgICAgbXRsciAgICByMAogICAgIGJscgogLmVuZG0KQEAgLTM5MywxNSArMzk3LDE1IEBACiAubWFjcm8gREVDTF9GRlQgc3VmZml4LCBiaXRzLCBuLCBuMiwgbjQKIGZmdFxuXHN1ZmZpeFwoKV9hbHRpdmVjOgogICAgIG1mbHIgIHIwCi0gICAgc3RwICAgcjAsUFMqKFxiaXRzLTMpKHIxKQorICAgIHN0cCAgIHIwLFBTKihcYml0cy0zKShSKDEpKQogICAgIGJsICAgIGZmdFxuMlwoKV9hbHRpdmVjCiAgICAgYWRkaTIgcjMsXG4qNAogICAgIGJsICAgIGZmdFxuNFwoKV9hbHRpdmVjCiAgICAgYWRkaTIgcjMsXG4qMgogICAgIGJsICAgIGZmdFxuNFwoKV9hbHRpdmVjCiAgICAgYWRkaTIgcjMsXG4qLTYKLSAgICBscCAgICByMCxQUyooXGJpdHMtMykocjEpCi0gICAgbHAgICAgcjQsXGJpdHMqUFMocjEyKQorICAgIGxwICAgIHIwLFBTKihcYml0cy0zKShSKDEpKQorICAgIGxwICAgIHI0LFxiaXRzKlBTKFIoMTIpKQogICAgIG10bHIgIHIwCiAgICAgbGkgICAgcjUsXG4vMTYKICAgICBiICAgICBmZnRfcGFzc1xzdWZmaXhcKClfYWx0aXZlYwpAQCAtNDUxLDQgKzQ1NSw0IEBACiBERUNMX0ZGVFMgMAogREVDTF9GRlRTIDEsIF9pbnRlcmxlYXZlCiAKLSNlbmRpZiAvKiBIQVZFX0dOVV9BUyAmJiBIQVZFX0FMVElWRUMgKi8KKyNlbmRpZiAvKiBIQVZFX0dOVV9BUyAmJiBIQVZFX0FMVElWRUMgJiYgSEFWRV9CSUdFTkRJQU4gKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2ZmdF9pbml0LmMgYi9saWJhdmNvZGVjL3BwYy9mZnRfaW5pdC5jCmluZGV4IDY3NWZhMzMuLjczM2U1OGIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL2ZmdF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy9wcGMvZmZ0X2luaXQuYwpAQCAtMjMsNyArMjMsNiBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9mZnQuaCIKIApAQCAtNDMsNyArNDIsNyBAQAogdm9pZCBmZl9mZnRfY2FsY19pbnRlcmxlYXZlX2FsdGl2ZWMoRkZUQ29udGV4dCAqcywgRkZUQ29tcGxleCAqeik7CiAjZW5kaWYKIAotI2lmIEhBVkVfR05VX0FTICYmIEhBVkVfQUxUSVZFQworI2lmIEhBVkVfR05VX0FTICYmIEhBVkVfQUxUSVZFQyAmJiAoSEFWRV9CSUdFTkRJQU4gfHwgSEFWRV9WU1gpCiBzdGF0aWMgdm9pZCBpbWRjdF9oYWxmX2FsdGl2ZWMoRkZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpvdXRwdXQsIGNvbnN0IEZGVFNhbXBsZSAqaW5wdXQpCiB7CiAgICAgaW50IGosIGs7CkBAIC0xNDcsMTEgKzE0NiwxMSBAQAogICAgICAgICBwMVtrXSAgICA9IHZlY19wZXJtKGIsIGIsIHZjcHJtKDMsMiwxLDApKTsKICAgICB9CiB9Ci0jZW5kaWYgLyogSEFWRV9HTlVfQVMgJiYgSEFWRV9BTFRJVkVDICovCisjZW5kaWYgLyogSEFWRV9HTlVfQVMgJiYgSEFWRV9BTFRJVkVDICYmIChIQVZFX0JJR0VORElBTiB8fCBIQVZFX1ZTWCkgKi8KIAogYXZfY29sZCB2b2lkIGZmX2ZmdF9pbml0X3BwYyhGRlRDb250ZXh0ICpzKQogewotI2lmIEhBVkVfR05VX0FTICYmIEhBVkVfQUxUSVZFQworI2lmIEhBVkVfR05VX0FTICYmIEhBVkVfQUxUSVZFQyAmJiAoSEFWRV9CSUdFTkRJQU4gfHwgSEFWRV9WU1gpCiAgICAgaWYgKCFQUENfQUxUSVZFQyhhdl9nZXRfY3B1X2ZsYWdzKCkpKQogICAgICAgICByZXR1cm47CiAKQEAgLTE2NCw1ICsxNjMsNSBAQAogICAgICAgICBzLT5pbWRjdF9jYWxjID0gaW1kY3RfY2FsY19hbHRpdmVjOwogICAgICAgICBzLT5pbWRjdF9oYWxmID0gaW1kY3RfaGFsZl9hbHRpdmVjOwogICAgIH0KLSNlbmRpZiAvKiBIQVZFX0dOVV9BUyAmJiBIQVZFX0FMVElWRUMgKi8KKyNlbmRpZiAvKiBIQVZFX0dOVV9BUyAmJiBIQVZFX0FMVElWRUMgJiYgSEFWRV9CSUdFTkRJQU4gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2ZmdF92c3guYyBiL2xpYmF2Y29kZWMvcHBjL2ZmdF92c3guYwppbmRleCBlOTI5NzVmLi5jMzY1ZmExIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BwYy9mZnRfdnN4LmMKKysrIGIvbGliYXZjb2RlYy9wcGMvZmZ0X3ZzeC5jCkBAIC0yNSw3ICsyNSw2IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2ZmdC5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvZmZ0LWludGVybmFsLmgiCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BwYy9mZnRfdnN4LmggYi9saWJhdmNvZGVjL3BwYy9mZnRfdnN4LmgKaW5kZXggYTg1NDc1ZC4uMWU0NDAzMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvZmZ0X3ZzeC5oCisrKyBiL2xpYmF2Y29kZWMvcHBjL2ZmdF92c3guaApAQCAtMjcsNyArMjcsNiBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9mZnQuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2ZmdC1pbnRlcm5hbC5oIgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvaDI2NGNocm9tYV9pbml0LmMgYi9saWJhdmNvZGVjL3BwYy9oMjY0Y2hyb21hX2luaXQuYwppbmRleCA4NzZlZmVjLi5iZDBkMjEzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BwYy9oMjY0Y2hyb21hX2luaXQuYworKysgYi9saWJhdmNvZGVjL3BwYy9oMjY0Y2hyb21hX2luaXQuYwpAQCAtMTksMTIgKzE5LDEzIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NGNocm9tYS5oIgogCiAjaWYgSEFWRV9BTFRJVkVDCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BwYy9oMjY0Y2hyb21hX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL3BwYy9oMjY0Y2hyb21hX3RlbXBsYXRlLmMKaW5kZXggY2IxZTA5NS4uOGY0M2U1ZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvaDI2NGNocm9tYV90ZW1wbGF0ZS5jCisrKyBiL2xpYmF2Y29kZWMvcHBjL2gyNjRjaHJvbWFfdGVtcGxhdGUuYwpAQCAtMTksNyArMTksNiBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKIAogLyogdGhpcyBjb2RlIGFzc3VtZSB0aGF0IHN0cmlkZSAlIDE2ID09IDAgKi8KQEAgLTExMSw3ICsxMTAsOSBAQAogCiAjaWZkZWYgUFJFRklYX2gyNjRfY2hyb21hX21jOF9hbHRpdmVjCiBzdGF0aWMgdm9pZCBQUkVGSVhfaDI2NF9jaHJvbWFfbWM4X2FsdGl2ZWModWludDhfdCAqIGRzdCwgdWludDhfdCAqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpCit7CiAgICAgREVDTEFSRV9BTElHTkVEKDE2LCBzaWduZWQgaW50LCBBQkNEKVs0XSA9CiAgICAgICAgICAgICAgICAgICAgICAgICB7KCg4IC0geCkgKiAoOCAtIHkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoKCAgICB4KSAqICg4IC0geSkpLApAQCAtMTgzLDcgKzE4NCwxMCBAQAogCiAvKiB0aGlzIGNvZGUgYXNzdW1lIHRoYXQgc3RyaWRlICUgMTYgPT0gMCAqLwogI2lmZGVmIFBSRUZJWF9ub19ybmRfdmMxX2Nocm9tYV9tYzhfYWx0aXZlYwotc3RhdGljIHZvaWQgUFJFRklYX25vX3JuZF92YzFfY2hyb21hX21jOF9hbHRpdmVjKHVpbnQ4X3QgKiBkc3QsIHVpbnQ4X3QgKiBzcmMsIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpIHsKK3N0YXRpYyB2b2lkIFBSRUZJWF9ub19ybmRfdmMxX2Nocm9tYV9tYzhfYWx0aXZlYyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHkpCit7CiAgICBERUNMQVJFX0FMSUdORUQoMTYsIHNpZ25lZCBpbnQsIEFCQ0QpWzRdID0KICAgICAgICAgICAgICAgICAgICAgICAgIHsoKDggLSB4KSAqICg4IC0geSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICgoICAgIHgpICogKDggLSB5KSksCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BwYy9oMjY0ZHNwLmMgYi9saWJhdmNvZGVjL3BwYy9oMjY0ZHNwLmMKaW5kZXggNGEwNDhhMS4uZjUxMDU0NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvaDI2NGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvcHBjL2gyNjRkc3AuYwpAQCAtMTksMTMgKzE5LDE4IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRkYXRhLmgiCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRkZWMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRkc3AuaCIKIAogI2lmIEhBVkVfQUxUSVZFQwpAQCAtNzY2LDEyICs3NzEsMTIgQEAKIH0KIAogI2RlZmluZSBIMjY0X1dFSUdIVChXKSBcCi1zdGF0aWMgdm9pZCB3ZWlnaHRfaDI2NF9waXhlbHMgIyMgVyAjIyBfYWx0aXZlYyh1aW50OF90ICpibG9jaywgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgXAorc3RhdGljIHZvaWQgd2VpZ2h0X2gyNjRfcGl4ZWxzICMjIFcgIyMgX2FsdGl2ZWModWludDhfdCAqYmxvY2ssIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoZWlnaHQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0LCBpbnQgb2Zmc2V0KSBcCiB7IFwKICAgICB3ZWlnaHRfaDI2NF9XX2FsdGl2ZWMoYmxvY2ssIHN0cmlkZSwgaGVpZ2h0LCBsb2cyX2Rlbm9tLCB3ZWlnaHQsIG9mZnNldCwgVyk7IFwKIH1cCi1zdGF0aWMgdm9pZCBiaXdlaWdodF9oMjY0X3BpeGVscyAjIyBXICMjIF9hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0LCBcCitzdGF0aWMgdm9pZCBiaXdlaWdodF9oMjY0X3BpeGVscyAjIyBXICMjIF9hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaGVpZ2h0LCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCBpbnQgd2VpZ2h0ZCwgaW50IHdlaWdodHMsIGludCBvZmZzZXQpIFwKIHsgXAogICAgIGJpd2VpZ2h0X2gyNjRfV19hbHRpdmVjKGRzdCwgc3JjLCBzdHJpZGUsIGhlaWdodCwgbG9nMl9kZW5vbSwgd2VpZ2h0ZCwgd2VpZ2h0cywgb2Zmc2V0LCBXKTsgXApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvaDI2NHFwZWwuYyBiL2xpYmF2Y29kZWMvcHBjL2gyNjRxcGVsLmMKaW5kZXggNTc1ZjUwNC4uYmVmNDIxZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvaDI2NHFwZWwuYworKysgYi9saWJhdmNvZGVjL3BwYy9oMjY0cXBlbC5jCkBAIC0xOSwxMyArMTksMTUgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCisKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorCiAjaW5jbHVkZSAibGliYXZjb2RlYy9oMjY0cXBlbC5oIgorCiAjaW5jbHVkZSAiaHBlbGRzcF9hbHRpdmVjLmgiCiAKICNpZiBIQVZFX0FMVElWRUMKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2gyNjRxcGVsX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL3BwYy9oMjY0cXBlbF90ZW1wbGF0ZS5jCmluZGV4IDVmZjcyZTMuLjMwNDYwNGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL2gyNjRxcGVsX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy9wcGMvaDI2NHFwZWxfdGVtcGxhdGUuYwpAQCAtMjUsNyArMjUsNiBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCiAKICNkZWZpbmUgQVNTRVJUX0FMSUdORUQocHRyKSBhdl9hc3NlcnQyKCEoKHVpbnRwdHJfdClwdHImMHgwMDAwMDAwRikpOwpAQCAtMTg5LDcgKzE4OCw3IEBACiAgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7CiAgICAgfQogfQotI2VuZGlmCisjZW5kaWYgLyogUFJFRklYX2gyNjRfcXBlbDE2X2hfbG93cGFzc19hbHRpdmVjICovCiAKIC8qIHRoaXMgY29kZSBhc3N1bWUgc3RyaWRlICUgMTYgPT0gMCAqLwogI2lmZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl92X2xvd3Bhc3NfYWx0aXZlYwpAQCAtMjkxLDcgKzI5MCw3IEBACiAgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7CiAgICAgfQogfQotI2VuZGlmCisjZW5kaWYgLyogUFJFRklYX2gyNjRfcXBlbDE2X3ZfbG93cGFzc19hbHRpdmVjICovCiAKIC8qIHRoaXMgY29kZSBhc3N1bWUgc3RyaWRlICUgMTYgPT0gMCAqYW5kKiB0bXAgaXMgcHJvcGVybHkgYWxpZ25lZCAqLwogI2lmZGVmIFBSRUZJWF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2FsdGl2ZWMKQEAgLTQ4MSw0ICs0ODAsNCBAQAogICAgICAgICBkc3QgKz0gZHN0U3RyaWRlOwogICAgIH0KIH0KLSNlbmRpZgorI2VuZGlmIC8qIFBSRUZJWF9oMjY0X3FwZWwxNl9odl9sb3dwYXNzX2FsdGl2ZWMgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2hldmNkc3AuYyBiL2xpYmF2Y29kZWMvcHBjL2hldmNkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE1YmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9wcGMvaGV2Y2RzcC5jCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogU0lNRC1vcHRpbWl6ZWQgSURDVCBmdW5jdGlvbnMgZm9yIEhFVkMgZGVjb2RpbmcKKyAqIENvcHlyaWdodCAoYykgQWxleGFuZHJhIEhhamtvdmEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9oZXZjZHNwLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKK3N0YXRpYyBjb25zdCB2ZWNfczE2IHRyYW5zNFs0XSA9IHsKKyAgICB7IDY0LCAgNjQsIDY0LCAgNjQsIDY0LCAgNjQsIDY0LCAgNjQgfSwKKyAgICB7IDgzLCAgMzYsIDgzLCAgMzYsIDgzLCAgMzYsIDgzLCAgMzYgfSwKKyAgICB7IDY0LCAtNjQsIDY0LCAtNjQsIDY0LCAtNjQsIDY0LCAtNjQgfSwKKyAgICB7IDM2LCAtODMsIDM2LCAtODMsIDM2LCAtODMsIDM2LCAtODMgfSwKK307CisKK3N0YXRpYyBjb25zdCB2ZWNfdTggbWFza1syXSA9IHsKKyAgICB7IDB4MDAsIDB4MDEsIDB4MDgsIDB4MDksIDB4MTAsIDB4MTEsIDB4MTgsIDB4MTksIDB4MDIsIDB4MDMsIDB4MEEsIDB4MEIsIDB4MTIsIDB4MTMsIDB4MUEsIDB4MUIgfSwKKyAgICB7IDB4MDQsIDB4MDUsIDB4MEMsIDB4MEQsIDB4MTQsIDB4MTUsIDB4MUMsIDB4MUQsIDB4MDYsIDB4MDcsIDB4MEUsIDB4MEYsIDB4MTYsIDB4MTcsIDB4MUUsIDB4MUYgfSwKK307CisKK3N0YXRpYyB2b2lkIHRyYW5zZm9ybTR4NCh2ZWNfczE2IHNyY18wMSwgdmVjX3MxNiBzcmNfMjMsIHZlY19zMzIgcmVzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzaGlmdCwgaW50MTZfdCAqY29lZmZzKQoreworICAgIHZlY19zMTYgc3JjXzAyLCBzcmNfMTM7CisgICAgdmVjX3MzMiB6ZXJvID0gdmVjX3NwbGF0X3MzMigwKTsKKyAgICB2ZWNfczMyIGUwLCBvMCwgZTEsIG8xOworICAgIHZlY19zMzIgYWRkOworCisgICAgc3JjXzEzID0gdmVjX21lcmdlbChzcmNfMDEsIHNyY18yMyk7CisgICAgc3JjXzAyID0gdmVjX21lcmdlaChzcmNfMDEsIHNyY18yMyk7CisKKyAgICBlMCA9IHZlY19tc3VtcyhzcmNfMDIsIHRyYW5zNFswXSwgemVybyk7CisgICAgbzAgPSB2ZWNfbXN1bXMoc3JjXzEzLCB0cmFuczRbMV0sIHplcm8pOworICAgIGUxID0gdmVjX21zdW1zKHNyY18wMiwgdHJhbnM0WzJdLCB6ZXJvKTsKKyAgICBvMSA9IHZlY19tc3VtcyhzcmNfMTMsIHRyYW5zNFszXSwgemVybyk7CisKKyAgICBzd2l0Y2goc2hpZnQpIHsKKyAgICBjYXNlICA3OiBhZGQgPSB2ZWNfc2wodmVjX3NwbGF0X3MzMigxKSwgdmVjX3NwbGF0X3UzMiggNyAtIDEpKTsgYnJlYWs7CisgICAgY2FzZSAxMDogYWRkID0gdmVjX3NsKHZlY19zcGxhdF9zMzIoMSksIHZlY19zcGxhdF91MzIoMTAgLSAxKSk7IGJyZWFrOworICAgIGNhc2UgMTI6IGFkZCA9IHZlY19zbCh2ZWNfc3BsYXRfczMyKDEpLCB2ZWNfc3BsYXRfdTMyKDEyIC0gMSkpOyBicmVhazsKKyAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgIH0KKworICAgIGUwID0gdmVjX2FkZChlMCwgYWRkKTsKKyAgICBlMSA9IHZlY19hZGQoZTEsIGFkZCk7CisKKyAgICByZXNbMF0gPSB2ZWNfYWRkKGUwLCBvMCk7CisgICAgcmVzWzFdID0gdmVjX2FkZChlMSwgbzEpOworICAgIHJlc1syXSA9IHZlY19zdWIoZTEsIG8xKTsKKyAgICByZXNbM10gPSB2ZWNfc3ViKGUwLCBvMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNjYWxlKHZlY19zMzIgcmVzWzRdLCB2ZWNfczE2IHJlc19wYWNrZWRbMl0sIGludCBzaGlmdCkKK3sKKyAgICBpbnQgaTsKKyAgICB2ZWNfdTMyIHZfc2hpZnQ7CisKKyAgICBzd2l0Y2goc2hpZnQpIHsKKyAgICBjYXNlICA3OiB2X3NoaWZ0ID0gdmVjX3NwbGF0X3UzMig3KSA7IGJyZWFrOworICAgIGNhc2UgMTA6IHZfc2hpZnQgPSB2ZWNfc3BsYXRfdTMyKDEwKTsgYnJlYWs7CisgICAgY2FzZSAxMjogdl9zaGlmdCA9IHZlY19zcGxhdF91MzIoMTIpOyBicmVhazsKKyAgICBkZWZhdWx0OiBhYm9ydCgpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIHJlc1tpXSA9IHZlY19zcmEocmVzW2ldLCB2X3NoaWZ0KTsKKworICAgIC8vIGNsaXAxNgorICAgIHJlc19wYWNrZWRbMF0gPSB2ZWNfcGFja3MocmVzWzBdLCByZXNbMV0pOworICAgIHJlc19wYWNrZWRbMV0gPSB2ZWNfcGFja3MocmVzWzJdLCByZXNbM10pOworfQorCisjZGVmaW5lIEZVTkNERUNMKGEsIGRlcHRoKSBhICMjIF8gIyMgZGVwdGggIyMgX2FsdGl2ZWMKKyNkZWZpbmUgRlVOQyhhLCBiKSBGVU5DREVDTChhLCBiKQorCisjZGVmaW5lIEJJVF9ERVBUSCA4CisjaW5jbHVkZSAiaGV2Y2RzcF90ZW1wbGF0ZS5jIgorI3VuZGVmIEJJVF9ERVBUSAorCisjZGVmaW5lIEJJVF9ERVBUSCAxMAorI2luY2x1ZGUgImhldmNkc3BfdGVtcGxhdGUuYyIKKyN1bmRlZiBCSVRfREVQVEgKKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KKworYXZfY29sZCB2b2lkIGZmX2hldmNfZHNwX2luaXRfcHBjKEhFVkNEU1BDb250ZXh0ICpjLCBjb25zdCBpbnQgYml0X2RlcHRoKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGJpdF9kZXB0aCA9PSA4KQorICAgICAgICBjLT5pZGN0WzBdID0gZmZfaGV2Y19pZGN0XzR4NF84X2FsdGl2ZWM7CisgICAgaWYgKGJpdF9kZXB0aCA9PSAxMCkKKyAgICAgICAgYy0+aWRjdFswXSA9IGZmX2hldmNfaWRjdF80eDRfMTBfYWx0aXZlYzsKKyNlbmRpZiAvKiBIQVZFX0FMVElWRUMgKi8KK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL2hldmNkc3BfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvcHBjL2hldmNkc3BfdGVtcGxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjY0MTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9wcGMvaGV2Y2RzcF90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIEFsZXhhbmRyYSBIYWprb3ZhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKK3N0YXRpYyB2b2lkIEZVTkMoZmZfaGV2Y19pZGN0XzR4NCwgQklUX0RFUFRIKShpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpCit7CisgICAgY29uc3QgaW50IHNoaWZ0ID0gNzsKKyAgICBjb25zdCBpbnQgc2hpZnQyID0gMjAgLSBCSVRfREVQVEg7CisgICAgdmVjX3MxNiBzcmNfMDEsIHNyY18yMzsKKyAgICB2ZWNfczMyIHJlc1s0XTsKKyAgICB2ZWNfczE2IHJlc19wYWNrZWRbMl07CisKKyAgICBzcmNfMDEgPSB2ZWNfbGQoMCwgY29lZmZzKTsKKyAgICBzcmNfMjMgPSB2ZWNfbGQoMTYsIGNvZWZmcyk7CisKKyAgICB0cmFuc2Zvcm00eDQoc3JjXzAxLCBzcmNfMjMsIHJlcywgc2hpZnQsIGNvZWZmcyk7CisgICAgc3JjXzAxID0gdmVjX3BhY2tzKHJlc1swXSwgcmVzWzFdKTsKKyAgICBzcmNfMjMgPSB2ZWNfcGFja3MocmVzWzJdLCByZXNbM10pOworICAgIHNjYWxlKHJlcywgcmVzX3BhY2tlZCwgc2hpZnQpOworICAgIC8vIHRyYW5zcG9zZQorICAgIHNyY18wMSA9IHZlY19wZXJtKHJlc19wYWNrZWRbMF0sIHJlc19wYWNrZWRbMV0sIG1hc2tbMF0pOworICAgIHNyY18yMyA9IHZlY19wZXJtKHJlc19wYWNrZWRbMF0sIHJlc19wYWNrZWRbMV0sIG1hc2tbMV0pOworCisgICAgdHJhbnNmb3JtNHg0KHNyY18wMSwgc3JjXzIzLCByZXMsIHNoaWZ0MiwgY29lZmZzKTsKKyAgICBzY2FsZShyZXMsIHJlc19wYWNrZWQsIHNoaWZ0Mik7CisgICAgLy8gdHJhbnNwb3NlCisgICAgc3JjXzAxID0gdmVjX3Blcm0ocmVzX3BhY2tlZFswXSwgcmVzX3BhY2tlZFsxXSwgbWFza1swXSk7CisgICAgc3JjXzIzID0gdmVjX3Blcm0ocmVzX3BhY2tlZFswXSwgcmVzX3BhY2tlZFsxXSwgbWFza1sxXSk7CisKKyAgICB2ZWNfc3Qoc3JjXzAxLCAwLCBjb2VmZnMpOworICAgIHZlY19zdChzcmNfMjMsIDE2LCBjb2VmZnMpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvaHBlbGRzcF9hbHRpdmVjLmMgYi9saWJhdmNvZGVjL3BwYy9ocGVsZHNwX2FsdGl2ZWMuYwppbmRleCA4N2ExZjA1Li5hNTMxYjZiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BwYy9ocGVsZHNwX2FsdGl2ZWMuYworKysgYi9saWJhdmNvZGVjL3BwYy9ocGVsZHNwX2FsdGl2ZWMuYwpAQCAtMjIsMTYgKzIyLDEzIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAotI2lmIEhBVkVfQUxUSVZFQ19ICi0jaW5jbHVkZSA8YWx0aXZlYy5oPgotI2VuZGlmCi0KICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisKICNpbmNsdWRlICJsaWJhdmNvZGVjL2hwZWxkc3AuaCIKKwogI2luY2x1ZGUgImhwZWxkc3BfYWx0aXZlYy5oIgogCiAjaWYgSEFWRV9BTFRJVkVDCkBAIC04Nyw3ICs4NCw3IEBACiAvKiBuZXh0IG9uZSBhc3N1bWVzIHRoYXQgKChsaW5lX3NpemUgJSA4KSA9PSAwKSAqLwogc3RhdGljIHZvaWQgYXZnX3BpeGVsczhfYWx0aXZlYyh1aW50OF90ICogYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKiBwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQogewotICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGVsc3YxLCBwaXhlbHN2MiwgcGl4ZWxzdiwgYmxvY2t2OworICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHBpeGVsc3YsIGJsb2NrdjsKICAgICBpbnQgaTsKIAogICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvaHVmZnl1dmRzcF9hbHRpdmVjLmMgYi9saWJhdmNvZGVjL3BwYy9odWZmeXV2ZHNwX2FsdGl2ZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwMTUyNC4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL3BwYy9odWZmeXV2ZHNwX2FsdGl2ZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgQnJpYW4gRm9sZXkKLSAqIENvcHlyaWdodCAoYykgMjAwMiBEaWV0ZXIgU2hpcmxleQotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgUm9tYWluIERvbGJlYXUgPHJvbWFpbkBkb2xiZWF1Lm9yZz4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2lmIEhBVkVfQUxUSVZFQ19ICi0jaW5jbHVkZSA8YWx0aXZlYy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9odWZmeXV2ZHNwLmgiCi0KLSNpZiBIQVZFX0FMVElWRUMKLXN0YXRpYyB2b2lkIGFkZF9ieXRlc19hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnRwdHJfdCB3KQotewotICAgIHJlZ2lzdGVyIGludCBpOwotICAgIHJlZ2lzdGVyIHZlY3RvciB1bnNpZ25lZCBjaGFyIHZkc3QsIHZzcmM7Ci0KLSAgICAvKiBkc3QgYW5kIHNyYyBhcmUgMTYgYnl0ZXMtYWxpZ25lZCAoZ3VhcmFudGVlZCkuICovCi0gICAgZm9yIChpID0gMDsgaSArIDE1IDwgdzsgaSArPSAxNikgewotICAgICAgICB2ZHN0ID0gdmVjX2xkKGksICh1bnNpZ25lZCBjaGFyICopIGRzdCk7Ci0gICAgICAgIHZzcmMgPSB2ZWNfbGQoaSwgKHVuc2lnbmVkIGNoYXIgKikgc3JjKTsKLSAgICAgICAgdmRzdCA9IHZlY19hZGQodnNyYywgdmRzdCk7Ci0gICAgICAgIHZlY19zdCh2ZHN0LCBpLCAodW5zaWduZWQgY2hhciAqKSBkc3QpOwotICAgIH0KLSAgICAvKiBJZiB3IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2LiAqLwotICAgIGZvciAoOyBpIDwgdzsgaSsrKQotICAgICAgICBkc3RbaV0gPSBzcmNbaV07Ci19Ci0jZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCi0KLWF2X2NvbGQgdm9pZCBmZl9odWZmeXV2ZHNwX2luaXRfcHBjKEh1ZmZZVVZEU1BDb250ZXh0ICpjKQotewotI2lmIEhBVkVfQUxUSVZFQwotICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYy0+YWRkX2J5dGVzID0gYWRkX2J5dGVzX2FsdGl2ZWM7Ci0jZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCi19CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BwYy9pZGN0ZHNwLmMgYi9saWJhdmNvZGVjL3BwYy9pZGN0ZHNwLmMKaW5kZXggODBlNzFmZC4uMjlmNjI1YSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvaWRjdGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvcHBjL2lkY3Rkc3AuYwpAQCAtMzAsMTcgKzMwLDE2IEBACiAgKiBJRENUIGZ1bmN0aW9uIGl0c2VsZiB3YXMgdG8gZmFjdG9yIG91dCB0aGUgcGFydGlhbCB0cmFuc3Bvc2l0aW9uLCBhbmQgdG8KICAqIHBlcmZvcm0gYSBmdWxsIHRyYW5zcG9zZSBhdCB0aGUgZW5kIG9mIHRoZSBmdW5jdGlvbi4gKi8KIAorI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaWYgSEFWRV9BTFRJVkVDX0gKLSNpbmNsdWRlIDxhbHRpdmVjLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvaWRjdGRzcC5oIgogCiAjaWYgSEFWRV9BTFRJVkVDCkBAIC0xNjksNyArMTY4LDcgQEAKICAgICBibG9ja1s3XSA9IHZ4NzsKIH0KIAotc3RhdGljIHZvaWQgaWRjdF9wdXRfYWx0aXZlYyh1aW50OF90ICpkZXN0LCBpbnQgc3RyaWRlLCBpbnQxNl90ICpibGspCitzdGF0aWMgdm9pZCBpZGN0X3B1dF9hbHRpdmVjKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsaykKIHsKICAgICB2ZWNfczE2ICpibG9jayA9ICh2ZWNfczE2ICopIGJsazsKICAgICB2ZWNfdTggdG1wOwpAQCAtMTk4LDcgKzE5Nyw3IEBACiAgICAgQ09QWShkZXN0LCB2eDcpOwogfQogCi1zdGF0aWMgdm9pZCBpZGN0X2FkZF9hbHRpdmVjKHVpbnQ4X3QgKmRlc3QsIGludCBzdHJpZGUsIGludDE2X3QgKmJsaykKK3N0YXRpYyB2b2lkIGlkY3RfYWRkX2FsdGl2ZWModWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxrKQogewogICAgIHZlY19zMTYgKmJsb2NrID0gKHZlY19zMTYgKikgYmxrOwogICAgIHZlY191OCB0bXA7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BwYy9sb3NzbGVzc19hdWRpb2RzcF9hbHRpdmVjLmMgYi9saWJhdmNvZGVjL3BwYy9sb3NzbGVzc19hdWRpb2RzcF9hbHRpdmVjLmMKaW5kZXggYmRlYzI1Mi4uMjk4ZTZjMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvbG9zc2xlc3NfYXVkaW9kc3BfYWx0aXZlYy5jCisrKyBiL2xpYmF2Y29kZWMvcHBjL2xvc3NsZXNzX2F1ZGlvZHNwX2FsdGl2ZWMuYwpAQCAtMTksMTQgKzE5LDEyIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lmIEhBVkVfQUxUSVZFQ19ICi0jaW5jbHVkZSA8YWx0aXZlYy5oPgotI2VuZGlmCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisKICNpbmNsdWRlICJsaWJhdmNvZGVjL2xvc3NsZXNzX2F1ZGlvZHNwLmgiCiAKICNpZiBIQVZFX0JJR0VORElBTgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvbG9zc2xlc3NfdmlkZW9kc3BfYWx0aXZlYy5jIGIvbGliYXZjb2RlYy9wcGMvbG9zc2xlc3NfdmlkZW9kc3BfYWx0aXZlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MGY4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3BwYy9sb3NzbGVzc192aWRlb2RzcF9hbHRpdmVjLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMiBCcmlhbiBGb2xleQorICogQ29weXJpZ2h0IChjKSAyMDAyIERpZXRlciBTaGlybGV5CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2xvc3NsZXNzX3ZpZGVvZHNwLmgiCisKKyNpZiBIQVZFX0FMVElWRUMKK3N0YXRpYyB2b2lkIGFkZF9ieXRlc19hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgdykKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICByZWdpc3RlciB2ZWN0b3IgdW5zaWduZWQgY2hhciB2ZHN0LCB2c3JjOworCisgICAgLyogZHN0IGFuZCBzcmMgYXJlIDE2IGJ5dGVzLWFsaWduZWQgKGd1YXJhbnRlZWQpLiAqLworICAgIGZvciAoaSA9IDA7IGkgKyAxNSA8IHc7IGkgKz0gMTYpIHsKKyAgICAgICAgdmRzdCA9IHZlY19sZChpLCAodW5zaWduZWQgY2hhciAqKSBkc3QpOworICAgICAgICB2c3JjID0gdmVjX2xkKGksICh1bnNpZ25lZCBjaGFyICopIHNyYyk7CisgICAgICAgIHZkc3QgPSB2ZWNfYWRkKHZzcmMsIHZkc3QpOworICAgICAgICB2ZWNfc3QodmRzdCwgaSwgKHVuc2lnbmVkIGNoYXIgKikgZHN0KTsKKyAgICB9CisgICAgLyogSWYgdyBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNi4gKi8KKyAgICBmb3IgKDsgaSA8IHc7IGkrKykKKyAgICAgICAgZHN0W2ldID0gc3JjW2ldOworfQorI2VuZGlmIC8qIEhBVkVfQUxUSVZFQyAqLworCithdl9jb2xkIHZvaWQgZmZfbGx2aWRkc3BfaW5pdF9wcGMoTExWaWREU1BDb250ZXh0ICpjKQoreworI2lmIEhBVkVfQUxUSVZFQworICAgIGlmICghUFBDX0FMVElWRUMoYXZfZ2V0X2NwdV9mbGFncygpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYy0+YWRkX2J5dGVzID0gYWRkX2J5dGVzX2FsdGl2ZWM7CisjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BwYy9tZV9jbXAuYyBiL2xpYmF2Y29kZWMvcHBjL21lX2NtcC5jCmluZGV4IDlmNzVlZDIuLjE3ZjlhNGYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL21lX2NtcC5jCisrKyBiL2xpYmF2Y29kZWMvcHBjL21lX2NtcC5jCkBAIC0yMSwxNSArMjEsMTIgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaWYgSEFWRV9BTFRJVkVDX0gKLSNpbmNsdWRlIDxhbHRpdmVjLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9tZV9jbXAuaCIKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL21wZWdhdWRpb2RzcF9hbHRpdmVjLmMgYi9saWJhdmNvZGVjL3BwYy9tcGVnYXVkaW9kc3BfYWx0aXZlYy5jCmluZGV4IGRkZmU1ZGMuLmVmYTlmZDUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL21wZWdhdWRpb2RzcF9hbHRpdmVjLmMKKysrIGIvbGliYXZjb2RlYy9wcGMvbXBlZ2F1ZGlvZHNwX2FsdGl2ZWMuYwpAQCAtOTAsNyArOTAsNyBAQAogfQogCiBzdGF0aWMgdm9pZCBhcHBseV93aW5kb3dfbXAzKGZsb2F0ICppbiwgZmxvYXQgKndpbiwgaW50ICp1bnVzZWQsIGZsb2F0ICpvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmNyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgaW5jcikKIHsKICAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBzdW1hLCBbMTddKTsKICAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBzdW1iLCBbMTddKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb19hbHRpdmVjLmMgYi9saWJhdmNvZGVjL3BwYy9tcGVndmlkZW9fYWx0aXZlYy5jCmluZGV4IDFiNmJkYTYuLjJjNmZmOTEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb19hbHRpdmVjLmMKKysrIGIvbGliYXZjb2RlYy9wcGMvbXBlZ3ZpZGVvX2FsdGl2ZWMuYwpAQCAtMjUsMTEgKzI1LDEyIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorCiAjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKIAogI2lmIEhBVkVfQUxUSVZFQwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvbXBlZ3ZpZGVvZHNwLmMgYi9saWJhdmNvZGVjL3BwYy9tcGVndmlkZW9kc3AuYwppbmRleCA3Njk2OTU0Li45OTBhOTc0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BwYy9tcGVndmlkZW9kc3AuYworKysgYi9saWJhdmNvZGVjL3BwYy9tcGVndmlkZW9kc3AuYwpAQCAtMjAsOSArMjAsMTEgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisKICNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWd2aWRlb2RzcC5oIgogCiAjaWYgSEFWRV9BTFRJVkVDCkBAIC0xMjgsNiArMTMwLDkgQEAKIGF2X2NvbGQgdm9pZCBmZl9tcGVndmlkZW9kc3BfaW5pdF9wcGMoTXBlZ1ZpZGVvRFNQQ29udGV4dCAqYykKIHsKICNpZiBIQVZFX0FMVElWRUMKKyAgICBpZiAoIVBQQ19BTFRJVkVDKGF2X2dldF9jcHVfZmxhZ3MoKSkpCisgICAgICAgIHJldHVybjsKKwogICAgIGMtPmdtYzEgPSBnbWMxX2FsdGl2ZWM7CiAjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BwYy9tcGVndmlkZW9lbmNkc3AuYyBiL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb2VuY2RzcC5jCmluZGV4IDNlNjc2NWMuLmI5NjQ4N2IgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb2VuY2RzcC5jCisrKyBiL2xpYmF2Y29kZWMvcHBjL21wZWd2aWRlb2VuY2RzcC5jCkBAIC0xNywxNiArMTcsMTQgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCisKICNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpZiBIQVZFX0FMVElWRUNfSAotI2luY2x1ZGUgPGFsdGl2ZWMuaD4KLSNlbmRpZgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oIgorCiAjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW9lbmNkc3AuaCIKIAogI2lmIEhBVkVfQUxUSVZFQwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvcGl4YmxvY2tkc3AuYyBiL2xpYmF2Y29kZWMvcHBjL3BpeGJsb2NrZHNwLmMKaW5kZXggODRhYTU2Mi4uMDFkMTRiNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvcGl4YmxvY2tkc3AuYworKysgYi9saWJhdmNvZGVjL3BwYy9waXhibG9ja2RzcC5jCkBAIC0yMSwxNSArMjEsMTIgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaWYgSEFWRV9BTFRJVkVDX0gKLSNpbmNsdWRlIDxhbHRpdmVjLmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvcGl4YmxvY2tkc3AuaCIKIApAQCAtMzcsNyArMzQsNyBAQAogCiAjaWYgSEFWRV9WU1gKIHN0YXRpYyB2b2lkIGdldF9waXhlbHNfYWx0aXZlYyhpbnQxNl90ICpyZXN0cmljdCBibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIHsKICAgICBpbnQgaTsKICAgICB2ZWN0b3IgdW5zaWduZWQgY2hhciBwZXJtID0KQEAgLTU5LDE4ICs1NiwxOCBAQAogICAgICAgICAvLyBTYXZlIHRoZSBkYXRhIHRvIHRoZSBibG9jaywgd2UgYXNzdW1lIHRoZSBibG9jayBpcyAxNi1ieXRlIGFsaWduZWQuCiAgICAgICAgIHZlY192c3hfc3Qoc2hvcnRzLCBpICogMTYsICh2ZWN0b3Igc2lnbmVkIHNob3J0ICopIGJsb2NrKTsKIAotICAgICAgICBwaXhlbHMgKz0gbGluZV9zaXplOworICAgICAgICBwaXhlbHMgKz0gc3RyaWRlOwogICAgIH0KIH0KICNlbHNlCiBzdGF0aWMgdm9pZCBnZXRfcGl4ZWxzX2FsdGl2ZWMoaW50MTZfdCAqcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiB7CiAgICAgaW50IGk7Ci0gICAgdmVjX3U4IHBlcm0gPSB2ZWNfbHZzbCgwLCBwaXhlbHMpOwogICAgIGNvbnN0IHZlY191OCB6ZXJvID0gKGNvbnN0IHZlY191OCl2ZWNfc3BsYXRfdTgoMCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIHZlY191OCBwZXJtID0gdmVjX2x2c2woMCwgcGl4ZWxzKTsKICAgICAgICAgLyogUmVhZCBwb3RlbnRpYWxseSB1bmFsaWduZWQgcGl4ZWxzLgogICAgICAgICAgKiBXZSdyZSByZWFkaW5nIDE2IHBpeGVscywgYW5kIGFjdHVhbGx5IG9ubHkgd2FudCA4LAogICAgICAgICAgKiBidXQgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgZXh0cmFzLiAqLwpAQCAtODQsNyArODEsNyBAQAogICAgICAgICAvLyBTYXZlIHRoZSBkYXRhIHRvIHRoZSBibG9jaywgd2UgYXNzdW1lIHRoZSBibG9jayBpcyAxNi1ieXRlIGFsaWduZWQuCiAgICAgICAgIHZlY19zdChzaG9ydHMsIGkgKiAxNiwgKHZlY19zMTYgKilibG9jayk7CiAKLSAgICAgICAgcGl4ZWxzICs9IGxpbmVfc2l6ZTsKKyAgICAgICAgcGl4ZWxzICs9IHN0cmlkZTsKICAgICB9CiB9CiAKQEAgLTkyLDcgKzg5LDcgQEAKIAogI2lmIEhBVkVfVlNYCiBzdGF0aWMgdm9pZCBkaWZmX3BpeGVsc19hbHRpdmVjKGludDE2X3QgKnJlc3RyaWN0IGJsb2NrLCBjb25zdCB1aW50OF90ICpzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqczIsIGludCBzdHJpZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyLCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICBpbnQgaTsKICAgY29uc3QgdmVjdG9yIHVuc2lnbmVkIGNoYXIgemVybyA9CkBAIC0xNTQsMTEgKzE1MSwxMCBAQAogfQogI2Vsc2UKIHN0YXRpYyB2b2lkIGRpZmZfcGl4ZWxzX2FsdGl2ZWMoaW50MTZfdCAqcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzMiwgaW50IHN0cmlkZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqczIsIHB0cmRpZmZfdCBzdHJpZGUpCiB7CiAgICAgaW50IGk7Ci0gICAgdmVjX3U4IHBlcm0xID0gdmVjX2x2c2woMCwgczEpOwotICAgIHZlY191OCBwZXJtMiA9IHZlY19sdnNsKDAsIHMyKTsKKyAgICB2ZWNfdTggcGVybTsKICAgICBjb25zdCB2ZWNfdTggemVybyA9IChjb25zdCB2ZWNfdTgpdmVjX3NwbGF0X3U4KDApOwogICAgIHZlY19zMTYgc2hvcnRzMSwgc2hvcnRzMjsKIApAQCAtMTY2LDE3ICsxNjIsMTkgQEAKICAgICAgICAgLyogUmVhZCBwb3RlbnRpYWxseSB1bmFsaWduZWQgcGl4ZWxzLgogICAgICAgICAgKiBXZSdyZSByZWFkaW5nIDE2IHBpeGVscywgYW5kIGFjdHVhbGx5IG9ubHkgd2FudCA4LAogICAgICAgICAgKiBidXQgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgZXh0cmFzLiAqLworICAgICAgICBwZXJtID0gdmVjX2x2c2woMCwgczEpOwogICAgICAgICB2ZWNfdTggcGl4bCAgPSB2ZWNfbGQoMCwgIHMxKTsKICAgICAgICAgdmVjX3U4IHBpeHIgID0gdmVjX2xkKDE1LCBzMSk7Ci0gICAgICAgIHZlY191OCBieXRlcyA9IHZlY19wZXJtKHBpeGwsIHBpeHIsIHBlcm0xKTsKKyAgICAgICAgdmVjX3U4IGJ5dGVzID0gdmVjX3Blcm0ocGl4bCwgcGl4ciwgcGVybSk7CiAKICAgICAgICAgLy8gQ29udmVydCB0aGUgYnl0ZXMgaW50byBzaG9ydHMuCiAgICAgICAgIHNob3J0czEgPSAodmVjX3MxNil2ZWNfbWVyZ2VoKHplcm8sIGJ5dGVzKTsKIAogICAgICAgICAvLyBEbyB0aGUgc2FtZSBmb3IgdGhlIHNlY29uZCBibG9jayBvZiBwaXhlbHMuCisgICAgICAgIHBlcm0gPSB2ZWNfbHZzbCgwLCBzMik7CiAgICAgICAgIHBpeGwgID0gdmVjX2xkKDAsICBzMik7CiAgICAgICAgIHBpeHIgID0gdmVjX2xkKDE1LCBzMik7Ci0gICAgICAgIGJ5dGVzID0gdmVjX3Blcm0ocGl4bCwgcGl4ciwgcGVybTIpOworICAgICAgICBieXRlcyA9IHZlY19wZXJtKHBpeGwsIHBpeHIsIHBlcm0pOwogCiAgICAgICAgIC8vIENvbnZlcnQgdGhlIGJ5dGVzIGludG8gc2hvcnRzLgogICAgICAgICBzaG9ydHMyID0gKHZlY19zMTYpdmVjX21lcmdlaCh6ZXJvLCBieXRlcyk7CkBAIC0xOTcsMTcgKzE5NSwxOSBAQAogICAgICAgICAvKiBSZWFkIHBvdGVudGlhbGx5IHVuYWxpZ25lZCBwaXhlbHMuCiAgICAgICAgICAqIFdlJ3JlIHJlYWRpbmcgMTYgcGl4ZWxzLCBhbmQgYWN0dWFsbHkgb25seSB3YW50IDgsCiAgICAgICAgICAqIGJ1dCB3ZSBzaW1wbHkgaWdub3JlIHRoZSBleHRyYXMuICovCisgICAgICAgIHBlcm0gPSB2ZWNfbHZzbCgwLCBzMSk7CiAgICAgICAgIHBpeGwgID0gdmVjX2xkKDAsICBzMSk7CiAgICAgICAgIHBpeHIgID0gdmVjX2xkKDE1LCBzMSk7Ci0gICAgICAgIGJ5dGVzID0gdmVjX3Blcm0ocGl4bCwgcGl4ciwgcGVybTEpOworICAgICAgICBieXRlcyA9IHZlY19wZXJtKHBpeGwsIHBpeHIsIHBlcm0pOwogCiAgICAgICAgIC8vIENvbnZlcnQgdGhlIGJ5dGVzIGludG8gc2hvcnRzLgogICAgICAgICBzaG9ydHMxID0gKHZlY19zMTYpdmVjX21lcmdlaCh6ZXJvLCBieXRlcyk7CiAKICAgICAgICAgLy8gRG8gdGhlIHNhbWUgZm9yIHRoZSBzZWNvbmQgYmxvY2sgb2YgcGl4ZWxzLgorICAgICAgICBwZXJtID0gdmVjX2x2c2woMCwgczIpOwogICAgICAgICBwaXhsICA9IHZlY19sZCgwLCAgczIpOwogICAgICAgICBwaXhyICA9IHZlY19sZCgxNSwgczIpOwotICAgICAgICBieXRlcyA9IHZlY19wZXJtKHBpeGwsIHBpeHIsIHBlcm0yKTsKKyAgICAgICAgYnl0ZXMgPSB2ZWNfcGVybShwaXhsLCBwaXhyLCBwZXJtKTsKIAogICAgICAgICAvLyBDb252ZXJ0IHRoZSBieXRlcyBpbnRvIHNob3J0cy4KICAgICAgICAgc2hvcnRzMiA9ICh2ZWNfczE2KXZlY19tZXJnZWgoemVybywgYnl0ZXMpOwpAQCAtMjMwLDcgKzIzMCw3IEBACiAKICNpZiBIQVZFX1ZTWAogc3RhdGljIHZvaWQgZ2V0X3BpeGVsc192c3goaW50MTZfdCAqcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKQEAgLTIzOCwxMiArMjM4LDEyIEBACiAKICAgICAgICAgdmVjX3ZzeF9zdChzaG9ydHMsIGkgKiAxNiwgYmxvY2spOwogCi0gICAgICAgIHBpeGVscyArPSBsaW5lX3NpemU7CisgICAgICAgIHBpeGVscyArPSBzdHJpZGU7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBkaWZmX3BpeGVsc192c3goaW50MTZfdCAqcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyLCBpbnQgc3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnMyLCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCBpOwogICAgIHZlY19zMTYgc2hvcnRzMSwgc2hvcnRzMjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL3N2cTFlbmNfYWx0aXZlYy5jIGIvbGliYXZjb2RlYy9wcGMvc3ZxMWVuY19hbHRpdmVjLmMKaW5kZXggNGUyNWUyNS4uYWE2NmI0MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvc3ZxMWVuY19hbHRpdmVjLmMKKysrIGIvbGliYXZjb2RlYy9wcGMvc3ZxMWVuY19hbHRpdmVjLmMKQEAgLTE4LDIzICsxOCwyMCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQogI2luY2x1ZGUgImNvbmZpZy5oIgotI2lmIEhBVkVfQUxUSVZFQ19ICi0jaW5jbHVkZSA8YWx0aXZlYy5oPgotI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvc3ZxMWVuYy5oIgogCiAjaWYgSEFWRV9BTFRJVkVDCiBzdGF0aWMgaW50IHNzZF9pbnQ4X3ZzX2ludDE2X2FsdGl2ZWMoY29uc3QgaW50OF90ICpwaXgxLCBjb25zdCBpbnQxNl90ICpwaXgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHNpemUpCiB7CiAgICAgaW50IGksIHNpemUxNiA9IHNpemUgPj4gNDsKICAgICB2ZWN0b3Igc2lnbmVkIGNoYXIgdnBpeDE7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BwYy92YzFkc3BfYWx0aXZlYy5jIGIvbGliYXZjb2RlYy9wcGMvdmMxZHNwX2FsdGl2ZWMuYwppbmRleCAzNWJiMjgwLi5iYmFkYjJhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BwYy92YzFkc3BfYWx0aXZlYy5jCisrKyBiL2xpYmF2Y29kZWMvcHBjL3ZjMWRzcF9hbHRpdmVjLmMKQEAgLTIwLDExICsyMCwxMiBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKKwogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvdmMxZHNwLmgiCiAKICNpZiBIQVZFX0FMVElWRUMKQEAgLTIyOSw3ICsyMzAsOCBAQAogCiAvKiogRG8gaW52ZXJzZSB0cmFuc2Zvcm0gb24gOHg0IHBhcnQgb2YgYmxvY2sKICovCi1zdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4NF9hbHRpdmVjKHVpbnQ4X3QgKmRlc3QsIGludCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQorc3RhdGljIHZvaWQgdmMxX2ludl90cmFuc184eDRfYWx0aXZlYyh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaykKIHsKICAgICB2ZWN0b3Igc2lnbmVkIHNob3J0IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzc7CiAgICAgdmVjdG9yIHNpZ25lZCBpbnQgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvdmlkZW9kc3BfcHBjLmMgYi9saWJhdmNvZGVjL3BwYy92aWRlb2RzcC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJhdmNvZGVjL3BwYy92aWRlb2RzcF9wcGMuYwpyZW5hbWUgdG8gbGliYXZjb2RlYy9wcGMvdmlkZW9kc3AuYwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcGMvdm9yYmlzZHNwX2FsdGl2ZWMuYyBiL2xpYmF2Y29kZWMvcHBjL3ZvcmJpc2RzcF9hbHRpdmVjLmMKaW5kZXggZDc1NTdjOC4uNGRhYmYyZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcGMvdm9yYmlzZHNwX2FsdGl2ZWMuYworKysgYi9saWJhdmNvZGVjL3BwYy92b3JiaXNkc3BfYWx0aXZlYy5jCkBAIC0xOSwxMiArMTksMTIgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaWYgSEFWRV9BTFRJVkVDX0gKLSNpbmNsdWRlIDxhbHRpdmVjLmg+Ci0jZW5kaWYKKwogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvdm9yYmlzZHNwLmgiCiAKICNpZiBIQVZFX0FMVElWRUMKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL3ZwM2RzcF9hbHRpdmVjLmMgYi9saWJhdmNvZGVjL3BwYy92cDNkc3BfYWx0aXZlYy5jCmluZGV4IDRhMzY3YjYuLmE5YTQ4ZDEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL3ZwM2RzcF9hbHRpdmVjLmMKKysrIGIvbGliYXZjb2RlYy9wcGMvdnAzZHNwX2FsdGl2ZWMuYwpAQCAtMjEsMTEgKzIxLDEyIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJjb25maWcuaCIKKwogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BwYy90eXBlc19hbHRpdmVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvdnAzZHNwLmgiCiAKICNpZiBIQVZFX0FMVElWRUMKQEAgLTExOSw3ICsxMjAsNyBAQAogI2RlZmluZSBBREQ4KGEpIHZlY19hZGQoYSwgZWlnaHQpCiAjZGVmaW5lIFNISUZUNChhKSB2ZWNfc3JhKGEsIGZvdXIpCiAKLXN0YXRpYyB2b2lkIHZwM19pZGN0X3B1dF9hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50MTZfdCBibG9ja1s2NF0pCitzdGF0aWMgdm9pZCB2cDNfaWRjdF9wdXRfYWx0aXZlYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgYmxvY2tbNjRdKQogewogICAgIHZlY191OCB0OwogICAgIElEQ1RfU1RBUlQKQEAgLTE0OCw3ICsxNDksNyBAQAogICAgIG1lbXNldChibG9jaywgMCwgc2l6ZW9mKCpibG9jaykgKiA2NCk7CiB9CiAKLXN0YXRpYyB2b2lkIHZwM19pZGN0X2FkZF9hbHRpdmVjKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50MTZfdCBibG9ja1s2NF0pCitzdGF0aWMgdm9pZCB2cDNfaWRjdF9hZGRfYWx0aXZlYyh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgYmxvY2tbNjRdKQogewogICAgIExPQURfWkVSTzsKICAgICB2ZWNfdTggdCwgdmRzdDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHBjL3ZwOGRzcF9hbHRpdmVjLmMgYi9saWJhdmNvZGVjL3BwYy92cDhkc3BfYWx0aXZlYy5jCmluZGV4IDIzZTRhY2UuLjMxMjAxZWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHBjL3ZwOGRzcF9hbHRpdmVjLmMKKysrIGIvbGliYXZjb2RlYy9wcGMvdnA4ZHNwX2FsdGl2ZWMuYwpAQCAtMjEsMTIgKzIxLDE0IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcHBjL2NwdS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCisKICNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwOGRzcC5oIgorCiAjaW5jbHVkZSAiaHBlbGRzcF9hbHRpdmVjLmgiCiAKICNpZiBIQVZFX0FMVElWRUMKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHJvZmlsZXMuYyBiL2xpYmF2Y29kZWMvcHJvZmlsZXMuYwppbmRleCA5NDA2OWZkLi5kN2RjOTYwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Byb2ZpbGVzLmMKKysrIGIvbGliYXZjb2RlYy9wcm9maWxlcy5jCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNDcsNiArNDYsMTYgQEAKICAgICB7IEZGX1BST0ZJTEVfVU5LTk9XTiB9LAogfTsKIAorY29uc3QgQVZQcm9maWxlIGZmX2RueGhkX3Byb2ZpbGVzW10gPSB7CisgIHsgRkZfUFJPRklMRV9ETlhIRCwgICAgICAiRE5YSEQifSwKKyAgeyBGRl9QUk9GSUxFX0ROWEhSX0xCLCAgICJETlhIUiBMQiJ9LAorICB7IEZGX1BST0ZJTEVfRE5YSFJfU1EsICAgIkROWEhSIFNRIn0sCisgIHsgRkZfUFJPRklMRV9ETlhIUl9IUSwgICAiRE5YSFIgSFEiIH0sCisgIHsgRkZfUFJPRklMRV9ETlhIUl9IUVgsICAiRE5YSFIgSFFYIn0sCisgIHsgRkZfUFJPRklMRV9ETlhIUl80NDQsICAiRE5YSFIgNDQ0In0sCisgIHsgRkZfUFJPRklMRV9VTktOT1dOIH0sCit9OworCiBjb25zdCBBVlByb2ZpbGUgZmZfaDI2NF9wcm9maWxlc1tdID0gewogICAgIHsgRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FLCAgICAgICAgICAgICAiQmFzZWxpbmUiICAgICAgICAgICAgICB9LAogICAgIHsgRkZfUFJPRklMRV9IMjY0X0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAiQ29uc3RyYWluZWQgQmFzZWxpbmUiICB9LApAQCAtNjEsNiArNzAsOCBAQAogICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X1BSRURJQ1RJVkUsICAiSGlnaCA0OjQ6NCBQcmVkaWN0aXZlIiB9LAogICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDQ0X0lOVFJBLCAgICAgICAiSGlnaCA0OjQ6NCBJbnRyYSIgICAgICB9LAogICAgIHsgRkZfUFJPRklMRV9IMjY0X0NBVkxDXzQ0NCwgICAgICAgICAgICAiQ0FWTEMgNDo0OjQiICAgICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X01VTFRJVklFV19ISUdILCAgICAgICAiTXVsdGl2aWV3IEhpZ2giICAgICAgICB9LAorICAgIHsgRkZfUFJPRklMRV9IMjY0X1NURVJFT19ISUdILCAgICAgICAgICAiU3RlcmVvIEhpZ2giICAgICAgICAgICB9LAogICAgIHsgRkZfUFJPRklMRV9VTktOT1dOIH0sCiB9OwogCkBAIC0xMjksNCArMTQwLDE2IEBACiAgICAgeyBGRl9QUk9GSUxFX1VOS05PV04gfSwKIH07CiAKK2NvbnN0IEFWUHJvZmlsZSBmZl9hdjFfcHJvZmlsZXNbXSA9IHsKKyAgICB7IEZGX1BST0ZJTEVfQVYxX01BSU4sICAgICAgICAgIk1haW4iIH0sCisgICAgeyBGRl9QUk9GSUxFX0FWMV9ISUdILCAgICAgICAgICJIaWdoIiB9LAorICAgIHsgRkZfUFJPRklMRV9BVjFfUFJPRkVTU0lPTkFMLCAiUHJvZmVzc2lvbmFsIiB9LAorICAgIHsgRkZfUFJPRklMRV9VTktOT1dOIH0sCit9OworCitjb25zdCBBVlByb2ZpbGUgZmZfc2JjX3Byb2ZpbGVzW10gPSB7CisgICAgeyBGRl9QUk9GSUxFX1NCQ19NU0JDLCAibVNCQyIgfSwKKyAgICB7IEZGX1BST0ZJTEVfVU5LTk9XTiB9LAorfTsKKwogI2VuZGlmIC8qICFDT05GSUdfU01BTEwgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHJvZmlsZXMuaCBiL2xpYmF2Y29kZWMvcHJvZmlsZXMuaAppbmRleCA3ZTFmNzRkLi45ZDdlMjExIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Byb2ZpbGVzLmgKKysrIGIvbGliYXZjb2RlYy9wcm9maWxlcy5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjQsNiArMjMsNyBAQAogCiBleHRlcm4gY29uc3QgQVZQcm9maWxlIGZmX2FhY19wcm9maWxlc1tdOwogZXh0ZXJuIGNvbnN0IEFWUHJvZmlsZSBmZl9kY2FfcHJvZmlsZXNbXTsKK2V4dGVybiBjb25zdCBBVlByb2ZpbGUgZmZfZG54aGRfcHJvZmlsZXNbXTsKIGV4dGVybiBjb25zdCBBVlByb2ZpbGUgZmZfaDI2NF9wcm9maWxlc1tdOwogZXh0ZXJuIGNvbnN0IEFWUHJvZmlsZSBmZl9oZXZjX3Byb2ZpbGVzW107CiBleHRlcm4gY29uc3QgQVZQcm9maWxlIGZmX2pwZWcyMDAwX3Byb2ZpbGVzW107CkBAIC0zMSw1ICszMSw3IEBACiBleHRlcm4gY29uc3QgQVZQcm9maWxlIGZmX21wZWc0X3ZpZGVvX3Byb2ZpbGVzW107CiBleHRlcm4gY29uc3QgQVZQcm9maWxlIGZmX3ZjMV9wcm9maWxlc1tdOwogZXh0ZXJuIGNvbnN0IEFWUHJvZmlsZSBmZl92cDlfcHJvZmlsZXNbXTsKK2V4dGVybiBjb25zdCBBVlByb2ZpbGUgZmZfYXYxX3Byb2ZpbGVzW107CitleHRlcm4gY29uc3QgQVZQcm9maWxlIGZmX3NiY19wcm9maWxlc1tdOwogCi0jZW5kaWYKKyNlbmRpZiAvKiBBVkNPREVDX1BST0ZJTEVTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHJvcmVzZGVjMi5jIGIvbGliYXZjb2RlYy9wcm9yZXNkZWMyLmMKaW5kZXggMmQ0N2ExMy4uZDk3ZTI2NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcm9yZXNkZWMyLmMKKysrIGIvbGliYXZjb2RlYy9wcm9yZXNkZWMyLmMKQEAgLTI1MCw3ICsyNTAsNyBAQAogICAgIHJldHVybiBwaWNfZGF0YV9zaXplOwogfQogCi0jZGVmaW5lIERFQ09ERV9DT0RFV09SRCh2YWwsIGNvZGVib29rKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIERFQ09ERV9DT0RFV09SRCh2YWwsIGNvZGVib29rLCBTS0lQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHVuc2lnbmVkIGludCByaWNlX29yZGVyLCBleHBfb3JkZXIsIHN3aXRjaF9iaXRzOyAgICAgICAgICAgICAgICBcCiAgICAgICAgIHVuc2lnbmVkIGludCBxLCBidWYsIGJpdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNjcsMTYgKzI2NywxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAocSA+IHN3aXRjaF9iaXRzKSB7IC8qIGV4cCBnb2xvbWIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYml0cyA9IGV4cF9vcmRlciAtIHN3aXRjaF9iaXRzICsgKHE8PDEpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGJpdHMgPiBGRk1JTihNSU5fQ0FDSEVfQklUUywgMzEpKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgdmFsID0gU0hPV19VQklUUyhyZSwgZ2IsIGJpdHMpIC0gKDEgPDwgZXhwX29yZGVyKSArICAgICAgICAgXAogICAgICAgICAgICAgICAgICgoc3dpdGNoX2JpdHMgKyAxKSA8PCByaWNlX29yZGVyKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgYml0cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU0tJUChyZSwgZ2IsIGJpdHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9IGVsc2UgaWYgKHJpY2Vfb3JkZXIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgcSsxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgdmFsID0gKHEgPDwgcmljZV9vcmRlcikgKyBTSE9XX1VCSVRTKHJlLCBnYiwgcmljZV9vcmRlcik7ICAgXAotICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgcmljZV9vcmRlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU0tJUChyZSwgZ2IsIHJpY2Vfb3JkZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgdmFsID0gcTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgcSsxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgU0tJUChyZSwgZ2IsIHErMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKQEAgLTI4Niw3ICsyODgsNyBAQAogCiBzdGF0aWMgY29uc3QgdWludDhfdCBkY19jb2RlYm9va1s3XSA9IHsgMHgwNCwgMHgyOCwgMHgyOCwgMHg0RCwgMHg0RCwgMHg3MCwgMHg3MH07CiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZGVjb2RlX2RjX2NvZWZmcyhHZXRCaXRDb250ZXh0ICpnYiwgaW50MTZfdCAqb3V0LAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGRlY29kZV9kY19jb2VmZnMoR2V0Qml0Q29udGV4dCAqZ2IsIGludDE2X3QgKm91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzX3Blcl9zbGljZSkKIHsKICAgICBpbnQxNl90IHByZXZfZGM7CkBAIC0yOTQsNyArMjk2LDcgQEAKIAogICAgIE9QRU5fUkVBREVSKHJlLCBnYik7CiAKLSAgICBERUNPREVfQ09ERVdPUkQoY29kZSwgRklSU1RfRENfQ0IpOworICAgIERFQ09ERV9DT0RFV09SRChjb2RlLCBGSVJTVF9EQ19DQiwgTEFTVF9TS0lQX0JJVFMpOwogICAgIHByZXZfZGMgPSBUT1NJR05FRChjb2RlKTsKICAgICBvdXRbMF0gPSBwcmV2X2RjOwogCkBAIC0zMDMsMTMgKzMwNSwxNCBAQAogICAgIGNvZGUgPSA1OwogICAgIHNpZ24gPSAwOwogICAgIGZvciAoaSA9IDE7IGkgPCBibG9ja3NfcGVyX3NsaWNlOyBpKyssIG91dCArPSA2NCkgewotICAgICAgICBERUNPREVfQ09ERVdPUkQoY29kZSwgZGNfY29kZWJvb2tbRkZNSU4oY29kZSwgNlUpXSk7CisgICAgICAgIERFQ09ERV9DT0RFV09SRChjb2RlLCBkY19jb2RlYm9va1tGRk1JTihjb2RlLCA2VSldLCBMQVNUX1NLSVBfQklUUyk7CiAgICAgICAgIGlmKGNvZGUpIHNpZ24gXj0gLShjb2RlICYgMSk7CiAgICAgICAgIGVsc2UgICAgIHNpZ24gID0gMDsKICAgICAgICAgcHJldl9kYyArPSAoKChjb2RlICsgMSkgPj4gMSkgXiBzaWduKSAtIHNpZ247CiAgICAgICAgIG91dFswXSA9IHByZXZfZGM7CiAgICAgfQogICAgIENMT1NFX1JFQURFUihyZSwgZ2IpOworICAgIHJldHVybiAwOwogfQogCiAvLyBhZGFwdGl2ZSBjb2RlYm9vayBzd2l0Y2hpbmcgbHV0IGFjY29yZGluZyB0byBwcmV2aW91cyBydW4vbGV2ZWwgdmFsdWVzCkBAIC0zMzgsMTQgKzM0MSwxNCBAQAogICAgICAgICBpZiAoIWJpdHNfbGVmdCB8fCAoYml0c19sZWZ0IDwgMzIgJiYgIVNIT1dfVUJJVFMocmUsIGdiLCBiaXRzX2xlZnQpKSkKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIERFQ09ERV9DT0RFV09SRChydW4sIHJ1bl90b19jYltGRk1JTihydW4sICAxNSldKTsKKyAgICAgICAgREVDT0RFX0NPREVXT1JEKHJ1biwgcnVuX3RvX2NiW0ZGTUlOKHJ1biwgIDE1KV0sIExBU1RfU0tJUF9CSVRTKTsKICAgICAgICAgcG9zICs9IHJ1biArIDE7CiAgICAgICAgIGlmIChwb3MgPj0gbWF4X2NvZWZmcykgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJhYyB0ZXggZGFtYWdlZCAlZCwgJWRcbiIsIHBvcywgbWF4X2NvZWZmcyk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogCi0gICAgICAgIERFQ09ERV9DT0RFV09SRChsZXZlbCwgbGV2X3RvX2NiW0ZGTUlOKGxldmVsLCA5KV0pOworICAgICAgICBERUNPREVfQ09ERVdPUkQobGV2ZWwsIGxldl90b19jYltGRk1JTihsZXZlbCwgOSldLCBTS0lQX0JJVFMpOwogICAgICAgICBsZXZlbCArPSAxOwogCiAgICAgICAgIGkgPSBwb3MgPj4gbG9nMl9ibG9ja19jb3VudDsKQEAgLTM2NSw3ICszNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpxbWF0KQogewogICAgIFByb3Jlc0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBibG9ja3MsIFs4KjQqNjRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGJsb2NrcywgWzgqNCo2NF0pOwogICAgIGludDE2X3QgKmJsb2NrOwogICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgaW50IGksIGJsb2Nrc19wZXJfc2xpY2UgPSBzbGljZS0+bWJfY291bnQ8PDI7CkBAIC0zNzYsNyArMzc5LDggQEAKIAogICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplIDw8IDMpOwogCi0gICAgZGVjb2RlX2RjX2NvZWZmcygmZ2IsIGJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSk7CisgICAgaWYgKChyZXQgPSBkZWNvZGVfZGNfY29lZmZzKCZnYiwgYmxvY2tzLCBibG9ja3NfcGVyX3NsaWNlKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogICAgIGlmICgocmV0ID0gZGVjb2RlX2FjX2NvZWZmcyhhdmN0eCwgJmdiLCBibG9ja3MsIGJsb2Nrc19wZXJfc2xpY2UpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTM5OCw3ICs0MDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnFtYXQsIGludCBsb2cyX2Jsb2Nrc19wZXJfbWIpCiB7CiAgICAgUHJvcmVzQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGJsb2NrcywgWzgqNCo2NF0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MTZfdCwgYmxvY2tzLCBbOCo0KjY0XSk7CiAgICAgaW50MTZfdCAqYmxvY2s7CiAgICAgR2V0Qml0Q29udGV4dCBnYjsKICAgICBpbnQgaSwgaiwgYmxvY2tzX3Blcl9zbGljZSA9IHNsaWNlLT5tYl9jb3VudCA8PCBsb2cyX2Jsb2Nrc19wZXJfbWI7CkBAIC00MDksNyArNDEzLDggQEAKIAogICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIGJ1Zl9zaXplIDw8IDMpOwogCi0gICAgZGVjb2RlX2RjX2NvZWZmcygmZ2IsIGJsb2NrcywgYmxvY2tzX3Blcl9zbGljZSk7CisgICAgaWYgKChyZXQgPSBkZWNvZGVfZGNfY29lZmZzKCZnYiwgYmxvY2tzLCBibG9ja3NfcGVyX3NsaWNlKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogICAgIGlmICgocmV0ID0gZGVjb2RlX2FjX2NvZWZmcyhhdmN0eCwgJmdiLCBibG9ja3MsIGJsb2Nrc19wZXJfc2xpY2UpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTQ4MCw3ICs0ODUsNyBAQAogewogICAgIEdldEJpdENvbnRleHQgZ2I7CiAgICAgaW50IGk7Ci0gICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBibG9ja3MsIFs4KjQqNjRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGJsb2NrcywgWzgqNCo2NF0pOwogICAgIGludDE2X3QgKmJsb2NrOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGJsb2Nrc19wZXJfc2xpY2U8PDI7IGkrKykKQEAgLTUxMiw4ICs1MTcsOCBAQAogICAgIGludCBsdW1hX3N0cmlkZSwgY2hyb21hX3N0cmlkZTsKICAgICBpbnQgeV9kYXRhX3NpemUsIHVfZGF0YV9zaXplLCB2X2RhdGFfc2l6ZSwgYV9kYXRhX3NpemU7CiAgICAgdWludDhfdCAqZGVzdF95LCAqZGVzdF91LCAqZGVzdF92LCAqZGVzdF9hOwotICAgIGludDE2X3QgcW1hdF9sdW1hX3NjYWxlZFs2NF07Ci0gICAgaW50MTZfdCBxbWF0X2Nocm9tYV9zY2FsZWRbNjRdOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgcW1hdF9sdW1hX3NjYWxlZCwgIFs2NF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgcW1hdF9jaHJvbWFfc2NhbGVkLFs2NF0pOwogICAgIGludCBtYl94X3NoaWZ0OwogICAgIGludCByZXQ7CiAKQEAgLTU3OCw3ICs1ODMsNyBAQAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgaWYgKCEoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSkgeworICAgIGlmICghKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkgJiYgKHVfZGF0YV9zaXplICsgdl9kYXRhX3NpemUpID4gMCkgewogICAgICAgICByZXQgPSBkZWNvZGVfc2xpY2VfY2hyb21hKGF2Y3R4LCBzbGljZSwgKHVpbnQxNl90KilkZXN0X3UsIGNocm9tYV9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmICsgeV9kYXRhX3NpemUsIHVfZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFtYXRfY2hyb21hX3NjYWxlZCwgbG9nMl9jaHJvbWFfYmxvY2tzX3Blcl9tYik7CkBAIC01OTEsNiArNTk2LDE2IEBACiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNpemVfdCBtYl9tYXhfeCA9IHNsaWNlLT5tYl9jb3VudCA8PCAobWJfeF9zaGlmdCAtIDEpOworICAgICAgICBzaXplX3QgaSwgajsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWJfbWF4X3g7ICsraikgeworICAgICAgICAgICAgICAgICoodWludDE2X3QqKShkZXN0X3UgKyAoaSAqIGNocm9tYV9zdHJpZGUpICsgKGogPDwgMSkpID0gNTExOworICAgICAgICAgICAgICAgICoodWludDE2X3QqKShkZXN0X3YgKyAoaSAqIGNocm9tYV9zdHJpZGUpICsgKGogPDwgMSkpID0gNTExOworICAgICAgICAgICAgfQorICAgIH0KKwogICAgIC8qIGRlY29kZSBhbHBoYSBwbGFuZSBpZiBhdmFpbGFibGUgKi8KICAgICBpZiAoY3R4LT5hbHBoYV9pbmZvICYmIHBpYy0+ZGF0YVszXSAmJiBhX2RhdGFfc2l6ZSkKICAgICAgICAgZGVjb2RlX3NsaWNlX2FscGhhKGN0eCwgKHVpbnQxNl90KilkZXN0X2EsIGx1bWFfc3RyaWRlLApAQCAtNjA1LDE0ICs2MjAsMTkgQEAKIHsKICAgICBQcm9yZXNDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGludCBpOworICAgIGludCBlcnJvciA9IDA7CiAKICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIGRlY29kZV9zbGljZV90aHJlYWQsIE5VTEwsIE5VTEwsIGN0eC0+c2xpY2VfY291bnQpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+c2xpY2VfY291bnQ7IGkrKykKLSAgICAgICAgaWYgKGN0eC0+c2xpY2VzW2ldLnJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gY3R4LT5zbGljZXNbaV0ucmV0OworICAgICAgICBlcnJvciArPSBjdHgtPnNsaWNlc1tpXS5yZXQgPCAwOwogCi0gICAgcmV0dXJuIDA7CisgICAgaWYgKGVycm9yKQorICAgICAgICBjdHgtPmZyYW1lLT5kZWNvZGVfZXJyb3JfZmxhZ3MgPSBGRl9ERUNPREVfRVJST1JfSU5WQUxJRF9CSVRTVFJFQU07CisgICAgaWYgKGVycm9yIDwgY3R4LT5zbGljZV9jb3VudCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY3R4LT5zbGljZXNbMF0ucmV0OwogfQogCiBzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcm9yZXNkZWNfbGdwbC5jIGIvbGliYXZjb2RlYy9wcm9yZXNkZWNfbGdwbC5jCmluZGV4IDQ2N2E0MjMuLmM4NmQ0MzMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcHJvcmVzZGVjX2xncGwuYworKysgYi9saWJhdmNvZGVjL3Byb3Jlc2RlY19sZ3BsLmMKQEAgLTE3Nyw2ICsxNzcsNyBAQAogICAgIGF2Y3R4LT5jb2xvcl9wcmltYXJpZXMgPSBidWZbMTRdOwogICAgIGF2Y3R4LT5jb2xvcl90cmMgICAgICAgPSBidWZbMTVdOwogICAgIGF2Y3R4LT5jb2xvcnNwYWNlICAgICAgPSBidWZbMTZdOworICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSAgICAgPSBBVkNPTF9SQU5HRV9NUEVHOwogCiAgICAgY3R4LT5xbWF0X2NoYW5nZWQgPSAwOwogICAgIHB0ciAgID0gYnVmICsgMjA7CkBAIC02MjUsNyArNjI2LDcgQEAKIAogICAgIC8qIGlmIFYgb3IgYWxwaGEgY29tcG9uZW50IHNpemUgaXMgbmVnYXRpdmUgdGhhdCBtZWFucyB0aGF0IHByZXZpb3VzCiAgICAgICAgY29tcG9uZW50IHNpemVzIGFyZSB0b28gbGFyZ2UgKi8KLSAgICBpZiAodl9kYXRhX3NpemUgPCAwIHx8IGFfZGF0YV9zaXplIDwgMCB8fCBoZHJfc2l6ZSA8IDYpIHsKKyAgICBpZiAodl9kYXRhX3NpemUgPCAwIHx8IGFfZGF0YV9zaXplIDwgMCB8fCBoZHJfc2l6ZSA8IDYgfHwgY29mZlszXSA+IHNsaWNlX2RhdGFfc2l6ZSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZGF0YSBzaXplXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcm9yZXNkc3AuYyBiL2xpYmF2Y29kZWMvcHJvcmVzZHNwLmMKaW5kZXggODJkNjAwOS4uNWI1YWRhMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcm9yZXNkc3AuYworKysgYi9saWJhdmNvZGVjL3Byb3Jlc2RzcC5jCkBAIC0zNiwxMSArMzYsMTEgQEAKIC8qKgogICogQWRkIGJpYXMgdmFsdWUsIGNsYW1wIGFuZCBvdXRwdXQgcGl4ZWxzIG9mIGEgc2xpY2UKICAqLwotc3RhdGljIHZvaWQgcHV0X3BpeGVscyh1aW50MTZfdCAqZHN0LCBpbnQgc3RyaWRlLCBjb25zdCBpbnQxNl90ICppbikKK3N0YXRpYyB2b2lkIHB1dF9waXhlbHModWludDE2X3QgKmRzdCwgcHRyZGlmZl90IGxpbmVzaXplLCBjb25zdCBpbnQxNl90ICppbikKIHsKICAgICBpbnQgeCwgeSwgc3JjX29mZnNldCwgZHN0X29mZnNldDsKIAotICAgIGZvciAoeSA9IDAsIGRzdF9vZmZzZXQgPSAwOyB5IDwgODsgeSsrLCBkc3Rfb2Zmc2V0ICs9IHN0cmlkZSkgeworICAgIGZvciAoeSA9IDAsIGRzdF9vZmZzZXQgPSAwOyB5IDwgODsgeSsrLCBkc3Rfb2Zmc2V0ICs9IGxpbmVzaXplKSB7CiAgICAgICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspIHsKICAgICAgICAgICAgIHNyY19vZmZzZXQgPSAoeSA8PCAzKSArIHg7CiAKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHByb3Jlc19pZGN0X3B1dF9jKHVpbnQxNl90ICpvdXQsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2ssIGNvbnN0IGludDE2X3QgKnFtYXQpCitzdGF0aWMgdm9pZCBwcm9yZXNfaWRjdF9wdXRfYyh1aW50MTZfdCAqb3V0LCBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrLCBjb25zdCBpbnQxNl90ICpxbWF0KQogewogICAgIGZmX3Byb3Jlc19pZGN0KGJsb2NrLCBxbWF0KTsKICAgICBwdXRfcGl4ZWxzKG91dCwgbGluZXNpemUgPj4gMSwgYmxvY2spOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcm9yZXNkc3AuaCBiL2xpYmF2Y29kZWMvcHJvcmVzZHNwLmgKaW5kZXggMTU5ODYyZS4uNTU4ZmFlNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wcm9yZXNkc3AuaAorKysgYi9saWJhdmNvZGVjL3Byb3Jlc2RzcC5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaWZuZGVmIEFWQ09ERUNfUFJPUkVTRFNQX0gKICNkZWZpbmUgQVZDT0RFQ19QUk9SRVNEU1BfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogCkBAIC0zMSw3ICszMiw3IEBACiB0eXBlZGVmIHN0cnVjdCBQcm9yZXNEU1BDb250ZXh0IHsKICAgICBpbnQgaWRjdF9wZXJtdXRhdGlvbl90eXBlOwogICAgIHVpbnQ4X3QgaWRjdF9wZXJtdXRhdGlvbls2NF07Ci0gICAgdm9pZCAoKiBpZGN0X3B1dCkgKHVpbnQxNl90ICpvdXQsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2ssIGNvbnN0IGludDE2X3QgKnFtYXQpOworICAgIHZvaWQgKCppZGN0X3B1dCkodWludDE2X3QgKm91dCwgcHRyZGlmZl90IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaywgY29uc3QgaW50MTZfdCAqcW1hdCk7CiB9IFByb3Jlc0RTUENvbnRleHQ7CiAKIHZvaWQgZmZfcHJvcmVzZHNwX2luaXQoUHJvcmVzRFNQQ29udGV4dCAqZHNwLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wcm9yZXNlbmNfa29zdHlhLmMgYi9saWJhdmNvZGVjL3Byb3Jlc2VuY19rb3N0eWEuYwppbmRleCAzYmMxZDVkLi4wNmQ1YWEzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Byb3Jlc2VuY19rb3N0eWEuYworKysgYi9saWJhdmNvZGVjL3Byb3Jlc2VuY19rb3N0eWEuYwpAQCAtNDYsNiArNDYsNyBAQAogICAgIFBST1JFU19QUk9GSUxFX1NUQU5EQVJELAogICAgIFBST1JFU19QUk9GSUxFX0hRLAogICAgIFBST1JFU19QUk9GSUxFXzQ0NDQsCisgICAgUFJPUkVTX1BST0ZJTEVfNDQ0NFhRLAogfTsKIAogZW51bSB7CkBAIC0xMjQsNyArMTI1LDcgQEAKICAgICBpbnQgICAgICAgICBtYXhfcXVhbnQ7CiAgICAgaW50ICAgICAgICAgYnJfdGFiW05VTV9NQl9MSU1JVFNdOwogICAgIGludCAgICAgICAgIHF1YW50OwotfSBwcm9yZXNfcHJvZmlsZV9pbmZvWzVdID0geworfSBwcm9yZXNfcHJvZmlsZV9pbmZvWzZdID0gewogICAgIHsKICAgICAgICAgLmZ1bGxfbmFtZSA9ICJwcm94eSIsCiAgICAgICAgIC50YWcgICAgICAgPSBNS1RBRygnYScsICdwJywgJ2MnLCAnbycpLApAQCAtMTY0LDYgKzE2NSwxNCBAQAogICAgICAgICAubWF4X3F1YW50ID0gNiwKICAgICAgICAgLmJyX3RhYiAgICA9IHsgMjM1MCwgMTgyOCwgMTYwMCwgMTQyNSB9LAogICAgICAgICAucXVhbnQgICAgID0gUVVBTlRfTUFUX0hRLAorICAgIH0sCisgICAgeworICAgICAgICAuZnVsbF9uYW1lID0gIjQ0NDRYUSIsCisgICAgICAgIC50YWcgICAgICAgPSBNS1RBRygnYScsICdwJywgJzQnLCAneCcpLAorICAgICAgICAubWluX3F1YW50ID0gMSwKKyAgICAgICAgLm1heF9xdWFudCA9IDYsCisgICAgICAgIC5icl90YWIgICAgPSB7IDM1MjUsIDI3NDIsIDI0MDAsIDIxMzcgfSwKKyAgICAgICAgLnF1YW50ICAgICA9IFFVQU5UX01BVF9IUSwKICAgICB9CiB9OwogCkBAIC0xOTYsNyArMjA1LDcgQEAKICAgICBjb25zdCB1aW50OF90ICpzY2FudGFibGU7CiAKICAgICB2b2lkICgqZmRjdCkoRkRDVERTUENvbnRleHQgKmZkc3AsIGNvbnN0IHVpbnQxNl90ICpzcmMsCi0gICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKTsKICAgICBGRENURFNQQ29udGV4dCBmZHNwOwogCiAgICAgY29uc3QgQVZGcmFtZSAqcGljOwpAQCAtMjI3LDEzICsyMzYsMTMgQEAKIH0gUHJvcmVzQ29udGV4dDsKIAogc3RhdGljIHZvaWQgZ2V0X3NsaWNlX2RhdGEoUHJvcmVzQ29udGV4dCAqY3R4LCBjb25zdCB1aW50MTZfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBpbnQgeCwgaW50IHksIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9ja3MsIHVpbnQxNl90ICplbXVfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ic19wZXJfc2xpY2UsIGludCBibG9ja3NfcGVyX21iLCBpbnQgaXNfY2hyb21hKQogewogICAgIGNvbnN0IHVpbnQxNl90ICplc3JjOwogICAgIGNvbnN0IGludCBtYl93aWR0aCA9IDQgKiBibG9ja3NfcGVyX21iOwotICAgIGludCBlbGluZXNpemU7CisgICAgcHRyZGlmZl90IGVsaW5lc2l6ZTsKICAgICBpbnQgaSwgaiwgazsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBtYnNfcGVyX3NsaWNlOyBpKyssIHNyYyArPSBtYl93aWR0aCkgewpAQCAtMjk4LDcgKzMwNyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGdldF9hbHBoYV9kYXRhKFByb3Jlc0NvbnRleHQgKmN0eCwgY29uc3QgdWludDE2X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemUsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2tzLCBpbnQgbWJzX3Blcl9zbGljZSwgaW50IGFiaXRzKQogewogICAgIGNvbnN0IGludCBzbGljZV93aWR0aCA9IDE2ICogbWJzX3Blcl9zbGljZTsKQEAgLTM1OCw3ICszNjcsNyBAQAogfQogCiAjZGVmaW5lIEdFVF9TSUdOKHgpICAoKHgpID4+IDMxKQotI2RlZmluZSBNQUtFX0NPREUoeCkgKCgoeCkgPDwgMSkgXiBHRVRfU0lHTih4KSkKKyNkZWZpbmUgTUFLRV9DT0RFKHgpICgoKCh4KSkgKiAyKSBeIEdFVF9TSUdOKHgpKQogCiBzdGF0aWMgdm9pZCBlbmNvZGVfZGNzKFB1dEJpdENvbnRleHQgKnBiLCBpbnQxNl90ICpibG9ja3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja3NfcGVyX3NsaWNlLCBpbnQgc2NhbGUpCkBAIC00MjEsNyArNDMwLDcgQEAKIH0KIAogc3RhdGljIGludCBlbmNvZGVfc2xpY2VfcGxhbmUoUHJvcmVzQ29udGV4dCAqY3R4LCBQdXRCaXRDb250ZXh0ICpwYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYnNfcGVyX3NsaWNlLCBpbnQxNl90ICpibG9ja3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzX3Blcl9tYiwgaW50IHBsYW5lX3NpemVfZmFjdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqcW1hdCkKQEAgLTUxNCw3ICs1MjMsOCBAQAogICAgIGludCB0b3RhbF9zaXplID0gMDsKICAgICBjb25zdCB1aW50MTZfdCAqc3JjOwogICAgIGludCBzbGljZV93aWR0aF9mYWN0b3IgPSBhdl9sb2cyKG1ic19wZXJfc2xpY2UpOwotICAgIGludCBudW1fY2Jsb2NrcywgcHdpZHRoLCBsaW5lc2l6ZSwgbGluZV9hZGQ7CisgICAgaW50IG51bV9jYmxvY2tzLCBwd2lkdGgsIGxpbmVfYWRkOworICAgIHB0cmRpZmZfdCBsaW5lc2l6ZTsKICAgICBpbnQgcGxhbmVfZmFjdG9yLCBpc19jaHJvbWE7CiAgICAgdWludDE2X3QgKnFtYXQ7CiAKQEAgLTY3MCw3ICs2ODAsNyBAQAogfQogCiBzdGF0aWMgaW50IGVzdGltYXRlX3NsaWNlX3BsYW5lKFByb3Jlc0NvbnRleHQgKmN0eCwgaW50ICplcnJvciwgaW50IHBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjLCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ic19wZXJfc2xpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja3NfcGVyX21iLCBpbnQgcGxhbmVfc2l6ZV9mYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnFtYXQsIFByb3Jlc1RocmVhZERhdGEgKnRkKQpAQCAtNzAyLDEwICs3MTIsOSBAQAogICAgICAgICByZXR1cm4gZGJpdHMgKyAxOwogfQogCi1zdGF0aWMgaW50IGVzdGltYXRlX2FscGhhX3BsYW5lKFByb3Jlc0NvbnRleHQgKmN0eCwgaW50ICplcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYywgaW50IGxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJzX3Blcl9zbGljZSwgaW50IHF1YW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9ja3MpCitzdGF0aWMgaW50IGVzdGltYXRlX2FscGhhX3BsYW5lKFByb3Jlc0NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYywgcHRyZGlmZl90IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWJzX3Blcl9zbGljZSwgaW50MTZfdCAqYmxvY2tzKQogewogICAgIGNvbnN0IGludCBhYml0cyA9IGN0eC0+YWxwaGFfYml0czsKICAgICBjb25zdCBpbnQgbWFzayAgPSAoMSA8PCBhYml0cykgLSAxOwpAQCAtNzE1LDcgKzcyNCw2IEBACiAgICAgaW50IHJ1biA9IDA7CiAgICAgaW50IGJpdHM7CiAKLSAgICAqZXJyb3IgPSAwOwogICAgIGN1ciA9IGJsb2Nrc1tpZHgrK107CiAgICAgYml0cyA9IGVzdF9hbHBoYV9kaWZmKGN1ciwgcHJldiwgYWJpdHMpOwogICAgIHByZXYgPSBjdXI7CkBAIC03NjQsNiArNzcyLDcgQEAKICAgICBpbnQgb3ZlcnF1YW50OwogICAgIHVpbnQxNl90ICpxbWF0OwogICAgIGludCBsaW5lc2l6ZVs0XSwgbGluZV9hZGQ7CisgICAgaW50IGFscGhhX2JpdHMgPSAwOwogCiAgICAgaWYgKGN0eC0+cGljdHVyZXNfcGVyX2ZyYW1lID09IDEpCiAgICAgICAgIGxpbmVfYWRkID0gMDsKQEAgLTgwOSw5ICs4MTgsMTIgQEAKICAgICAgICAgdGQtPm5vZGVzW3RyZWxsaXNfbm9kZSArIHFdLnF1YW50ICAgICA9IHE7CiAgICAgfQogCisgICAgaWYgKGN0eC0+YWxwaGFfYml0cykKKyAgICAgICAgYWxwaGFfYml0cyA9IGVzdGltYXRlX2FscGhhX3BsYW5lKGN0eCwgc3JjLCBsaW5lc2l6ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ic19wZXJfc2xpY2UsIHRkLT5ibG9ja3NbM10pOwogICAgIC8vIHRvZG86IG1heWJlIHBlcmZvcm0gY29hcnNlciBxdWFudGlzaW5nIHRvIGZpdCBpbnRvIGZyYW1lIHNpemUgd2hlbiBuZWVkZWQKICAgICBmb3IgKHEgPSBtaW5fcXVhbnQ7IHEgPD0gbWF4X3F1YW50OyBxKyspIHsKLSAgICAgICAgYml0cyAgPSAwOworICAgICAgICBiaXRzICA9IGFscGhhX2JpdHM7CiAgICAgICAgIGVycm9yID0gMDsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX3BsYW5lcyAtICEhY3R4LT5hbHBoYV9iaXRzOyBpKyspIHsKICAgICAgICAgICAgIGJpdHMgKz0gZXN0aW1hdGVfc2xpY2VfcGxhbmUoY3R4LCAmZXJyb3IsIGksCkBAIC04MjAsOSArODMyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2NibG9ja3NbaV0sIHBsYW5lX2ZhY3RvcltpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5xdWFudHNbcV0sIHRkKTsKICAgICAgICAgfQotICAgICAgICBpZiAoY3R4LT5hbHBoYV9iaXRzKQotICAgICAgICAgICAgYml0cyArPSBlc3RpbWF0ZV9hbHBoYV9wbGFuZShjdHgsICZlcnJvciwgc3JjLCBsaW5lc2l6ZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSwgcSwgdGQtPmJsb2Nrc1szXSk7CiAgICAgICAgIGlmIChiaXRzID4gNjUwMDAgKiA4KQogICAgICAgICAgICAgZXJyb3IgPSBTQ09SRV9MSU1JVDsKIApAQCAtODM1LDcgKzg0NCw3IEBACiAgICAgICAgIG92ZXJxdWFudCA9IG1heF9xdWFudDsKICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKHEgPSBtYXhfcXVhbnQgKyAxOyBxIDwgMTI4OyBxKyspIHsKLSAgICAgICAgICAgIGJpdHMgID0gMDsKKyAgICAgICAgICAgIGJpdHMgID0gYWxwaGFfYml0czsKICAgICAgICAgICAgIGVycm9yID0gMDsKICAgICAgICAgICAgIGlmIChxIDwgTUFYX1NUT1JFRF9RKSB7CiAgICAgICAgICAgICAgICAgcW1hdCA9IGN0eC0+cXVhbnRzW3FdOwpAQCAtODUxLDkgKzg2MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fY2Jsb2Nrc1tpXSwgcGxhbmVfZmFjdG9yW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcW1hdCwgdGQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN0eC0+YWxwaGFfYml0cykKLSAgICAgICAgICAgICAgICBiaXRzICs9IGVzdGltYXRlX2FscGhhX3BsYW5lKGN0eCwgJmVycm9yLCBzcmMsIGxpbmVzaXplWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJzX3Blcl9zbGljZSwgcSwgdGQtPmJsb2Nrc1szXSk7CiAgICAgICAgICAgICBpZiAoYml0cyA8PSBjdHgtPmJpdHNfcGVyX21iICogbWJzX3Blcl9zbGljZSkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtOTY4LDkgKzk3NCw5IEBACiAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIGZyYW1lX2ZsYWdzKTsKIAogICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUgICgmYnVmLCAwKTsgICAgICAgICAgICAgLy8gcmVzZXJ2ZWQKLSAgICBieXRlc3RyZWFtX3B1dF9ieXRlICAoJmJ1ZiwgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyk7Ci0gICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIGF2Y3R4LT5jb2xvcl90cmMpOwotICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUgICgmYnVmLCBhdmN0eC0+Y29sb3JzcGFjZSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIHBpYy0+Y29sb3JfcHJpbWFyaWVzKTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlICAoJmJ1ZiwgcGljLT5jb2xvcl90cmMpOworICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUgICgmYnVmLCBwaWMtPmNvbG9yc3BhY2UpOwogICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUgICgmYnVmLCAweDQwIHwgKGN0eC0+YWxwaGFfYml0cyA+PiAzKSk7CiAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSAgKCZidWYsIDApOyAgICAgICAgICAgICAvLyByZXNlcnZlZAogICAgIGlmIChjdHgtPnF1YW50X3NlbCAhPSBRVUFOVF9NQVRfREVGQVVMVCkgewpAQCAtMTEwMyw3ICsxMTA5LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcHJvcmVzX2ZkY3QoRkRDVERTUENvbnRleHQgKmZkc3AsIGNvbnN0IHVpbnQxNl90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQorICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKIHsKICAgICBpbnQgeCwgeTsKICAgICBjb25zdCB1aW50MTZfdCAqdHNyYyA9IHNyYzsKQEAgLTExNTQsNyArMTE2MCw4IEBACiAgICAgICAgICAgICAgICA6ICJIUSBwcm9maWxlIHRvIGtlZXAgYmVzdCBxdWFsaXR5Iik7CiAgICAgfQogICAgIGlmIChhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KS0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpIHsKLSAgICAgICAgaWYgKGN0eC0+cHJvZmlsZSAhPSBQUk9SRVNfUFJPRklMRV80NDQ0KSB7CisgICAgICAgIGlmIChjdHgtPnByb2ZpbGUgIT0gUFJPUkVTX1BST0ZJTEVfNDQ0NCAmJgorICAgICAgICAgICAgY3R4LT5wcm9maWxlICE9IFBST1JFU19QUk9GSUxFXzQ0NDRYUSkgewogICAgICAgICAgICAgLy8gZm9yY2UgYWxwaGEgYW5kIHdhcm4KICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJQcm9maWxlIHNlbGVjdGVkIHdpbGwgbm90ICIKICAgICAgICAgICAgICAgICAgICAiZW5jb2RlIGFscGhhLiBPdmVycmlkZSB3aXRoIC1wcm9maWxlIGlmIG5lZWRlZC5cbiIpOwpAQCAtMTIwNSw2ICsxMjEyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBpY3R1cmVzX3Blcl9mcmFtZSkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjdHgtPmJpdHNfcGVyX21iICAgPSBjdHgtPnByb2ZpbGVfaW5mby0+YnJfdGFiW2ldOworICAgICAgICAgICAgaWYgKGN0eC0+YWxwaGFfYml0cykKKyAgICAgICAgICAgICAgICBjdHgtPmJpdHNfcGVyX21iICo9IDIwOwogICAgICAgICB9IGVsc2UgaWYgKGN0eC0+Yml0c19wZXJfbWIgPCAxMjgpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIGZldyBiaXRzIHBlciBNQiwgcGxlYXNlIHNldCBhdCBsZWFzdCAxMjhcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC0xMjk1LDcgKzEzMDQsNyBAQAogICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDggfSwgMSwgTUFYX01CU19QRVJfU0xJQ0UsIFZFIH0sCiAgICAgeyAicHJvZmlsZSIsICAgICAgIE5VTEwsIE9GRlNFVChwcm9maWxlKSwgQVZfT1BUX1RZUEVfSU5ULAogICAgICAgICB7IC5pNjQgPSBQUk9SRVNfUFJPRklMRV9BVVRPIH0sCi0gICAgICAgIFBST1JFU19QUk9GSUxFX0FVVE8sIFBST1JFU19QUk9GSUxFXzQ0NDQsIFZFLCAicHJvZmlsZSIgfSwKKyAgICAgICAgUFJPUkVTX1BST0ZJTEVfQVVUTywgUFJPUkVTX1BST0ZJTEVfNDQ0NFhRLCBWRSwgInByb2ZpbGUiIH0sCiAgICAgeyAiYXV0byIsICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBST1JFU19QUk9GSUxFX0FVVE8gfSwKICAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAogICAgIHsgInByb3h5IiwgICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJPUkVTX1BST0ZJTEVfUFJPWFkgfSwKQEAgLTEzMDgsNiArMTMxNyw4IEBACiAgICAgICAgIDAsIDAsIFZFLCAicHJvZmlsZSIgfSwKICAgICB7ICI0NDQ0IiwgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBST1JFU19QUk9GSUxFXzQ0NDQgfSwKICAgICAgICAgMCwgMCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgIjQ0NDR4cSIsICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFJPUkVTX1BST0ZJTEVfNDQ0NFhRIH0sCisgICAgICAgIDAsIDAsIFZFLCAicHJvZmlsZSIgfSwKICAgICB7ICJ2ZW5kb3IiLCAidmVuZG9yIElEIiwgT0ZGU0VUKHZlbmRvciksCiAgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIkxhdmMiIH0sIENIQVJfTUlOLCBDSEFSX01BWCwgVkUgfSwKICAgICB7ICJiaXRzX3Blcl9tYiIsICJkZXNpcmVkIGJpdHMgcGVyIG1hY3JvYmxvY2siLCBPRkZTRVQoYml0c19wZXJfbWIpLApAQCAtMTM0Nyw3ICsxMzU4LDcgQEAKICAgICAuaW5pdCAgICAgICAgICAgPSBlbmNvZGVfaW5pdCwKICAgICAuY2xvc2UgICAgICAgICAgPSBlbmNvZGVfY2xvc2UsCiAgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMgfCBBVl9DT0RFQ19DQVBfSU5UUkFfT05MWSwKICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsIEFWX1BJWF9GTVRfTk9ORQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wc2QuYyBiL2xpYmF2Y29kZWMvcHNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZmMmVjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvcHNkLmMKQEAgLTAsMCArMSw0NzIgQEAKKy8qCisgKiBQaG90b3Nob3AgKFBTRCkgaW1hZ2UgZGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDE2IEpva3lvIEltYWdlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK2VudW0gUHNkQ29tcHIgeworICAgIFBTRF9SQVcsCisgICAgUFNEX1JMRSwKKyAgICBQU0RfWklQX1dJVEhPVVRfUCwKKyAgICBQU0RfWklQX1dJVEhfUCwKK307CisKK2VudW0gUHNkQ29sb3JNb2RlIHsKKyAgICBQU0RfQklUTUFQLAorICAgIFBTRF9HUkFZU0NBTEUsCisgICAgUFNEX0lOREVYRUQsCisgICAgUFNEX1JHQiwKKyAgICBQU0RfQ01ZSywKKyAgICBQU0RfTVVMVElDSEFOTkVMLAorICAgIFBTRF9EVU9UT05FLAorICAgIFBTRF9MQUIsCit9OworCit0eXBlZGVmIHN0cnVjdCBQU0RDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBBVkZyYW1lICpwaWN0dXJlOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgIHVpbnQ4X3QgKiB0bXA7CisKKyAgICB1aW50MTZfdCBjaGFubmVsX2NvdW50OworICAgIHVpbnQxNl90IGNoYW5uZWxfZGVwdGg7CisKKyAgICB1aW50NjRfdCB1bmNvbXByZXNzZWRfc2l6ZTsKKyAgICB1bnNpZ25lZCBpbnQgcGl4ZWxfc2l6ZTsvKiAxIGZvciA4IGJpdHMsIDIgZm9yIDE2IGJpdHMgKi8KKyAgICB1aW50NjRfdCBsaW5lX3NpemU7LyogbGVuZ3RoIG9mIHNyYyBkYXRhIChldmVuIHdpZHRoKSAqLworCisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisKKyAgICBlbnVtIFBzZENvbXByIGNvbXByZXNzaW9uOworICAgIGVudW0gUHNkQ29sb3JNb2RlIGNvbG9yX21vZGU7CisKKyAgICB1aW50OF90IHBhbGV0dGVbQVZQQUxFVFRFX1NJWkVdOworfSBQU0RDb250ZXh0OworCitzdGF0aWMgaW50IGRlY29kZV9oZWFkZXIoUFNEQ29udGV4dCAqIHMpCit7CisgICAgaW50IHNpZ25hdHVyZSwgdmVyc2lvbiwgY29sb3JfbW9kZTsKKyAgICBpbnQ2NF90IGxlbl9zZWN0aW9uOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAzMCkgey8qIEZpbGUgaGVhZGVyIHNlY3Rpb24gKyBjb2xvciBtYXAgZGF0YSBzZWN0aW9uIGxlbmd0aCAqLworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkhlYWRlciB0b28gc2hvcnQgdG8gcGFyc2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc2lnbmF0dXJlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnMtPmdiKTsKKyAgICBpZiAoc2lnbmF0dXJlICE9IE1LVEFHKCc4JywnQicsJ1AnLCdTJykpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJXcm9uZyBzaWduYXR1cmUgJWQuXG4iLCBzaWduYXR1cmUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB2ZXJzaW9uID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmdiKTsKKyAgICBpZiAodmVyc2lvbiAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiV3JvbmcgdmVyc2lvbiAlZC5cbiIsIHZlcnNpb24pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgNik7LyogcmVzZXJ2ZWQgKi8KKworICAgIHMtPmNoYW5uZWxfY291bnQgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmcy0+Z2IpOworICAgIGlmICgocy0+Y2hhbm5lbF9jb3VudCA8IDEpIHx8IChzLT5jaGFubmVsX2NvdW50ID4gNTYpKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVsIGNvdW50ICVkLlxuIiwgcy0+Y2hhbm5lbF9jb3VudCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYik7CisKKyAgICBpZiAoKHMtPmhlaWdodCA+IDMwMDAwKSAmJiAocy0+YXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMKSkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJIZWlnaHQgPiAzMDAwMCBpcyBleHBlcmltZW50YWwsIGFkZCAiCisgICAgICAgICAgICAgICAiJy1zdHJpY3QgJWQnIGlmIHlvdSB3YW50IHRvIHRyeSB0byBkZWNvZGUgdGhlIHBpY3R1cmUuXG4iLAorICAgICAgICAgICAgICAgRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFBFUklNRU5UQUw7CisgICAgfQorCisgICAgcy0+d2lkdGggPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworICAgIGlmICgocy0+d2lkdGggPiAzMDAwMCkgJiYgKHMtPmF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiV2lkdGggPiAzMDAwMCBpcyBleHBlcmltZW50YWwsIGFkZCAiCisgICAgICAgICAgICAgICAiJy1zdHJpY3QgJWQnIGlmIHlvdSB3YW50IHRvIHRyeSB0byBkZWNvZGUgdGhlIHBpY3R1cmUuXG4iLAorICAgICAgICAgICAgICAgRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFBFUklNRU5UQUw7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhzLT5hdmN0eCwgcy0+d2lkdGgsIHMtPmhlaWdodCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPmNoYW5uZWxfZGVwdGggPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmcy0+Z2IpOworCisgICAgY29sb3JfbW9kZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KCZzLT5nYik7CisgICAgc3dpdGNoIChjb2xvcl9tb2RlKSB7CisgICAgY2FzZSAwOgorICAgICAgICBzLT5jb2xvcl9tb2RlID0gUFNEX0JJVE1BUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBzLT5jb2xvcl9tb2RlID0gUFNEX0dSQVlTQ0FMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBzLT5jb2xvcl9tb2RlID0gUFNEX0lOREVYRUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgcy0+Y29sb3JfbW9kZSA9IFBTRF9SR0I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcy0+Y29sb3JfbW9kZSA9IFBTRF9DTVlLOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIHMtPmNvbG9yX21vZGUgPSBQU0RfTVVMVElDSEFOTkVMOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIHMtPmNvbG9yX21vZGUgPSBQU0RfRFVPVE9ORTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA5OgorICAgICAgICBzLT5jb2xvcl9tb2RlID0gUFNEX0xBQjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGNvbG9yIG1vZGUgJWQuXG4iLCBjb2xvcl9tb2RlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogY29sb3IgbWFwIGRhdGEgKi8KKyAgICBsZW5fc2VjdGlvbiA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZzLT5nYik7CisgICAgaWYgKGxlbl9zZWN0aW9uIDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk5lZ2F0aXZlIHNpemUgZm9yIGNvbG9yIG1hcCBkYXRhIHNlY3Rpb24uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAobGVuX3NlY3Rpb24gKyA0KSkgeyAvKiBzZWN0aW9uIGFuZCBsZW4gbmV4dCBzZWN0aW9uICovCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb21wbGV0ZSBmaWxlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAobGVuX3NlY3Rpb24pIHsKKyAgICAgICAgaW50IGksajsKKyAgICAgICAgbWVtc2V0KHMtPnBhbGV0dGUsIDB4ZmYsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgZm9yIChqID0gSEFWRV9CSUdFTkRJQU47IGogPCAzICsgSEFWRV9CSUdFTkRJQU47IGorKykKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTigyNTYsIGxlbl9zZWN0aW9uIC8gMyk7IGkrKykKKyAgICAgICAgICAgICAgICBzLT5wYWxldHRlW2kgKiA0ICsgKEhBVkVfQklHRU5ESUFOID8gaiA6IDIgLSBqKV0gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJnMtPmdiKTsKKyAgICAgICAgbGVuX3NlY3Rpb24gLT0gaSAqIDM7CisgICAgfQorICAgIGJ5dGVzdHJlYW0yX3NraXAoJnMtPmdiLCBsZW5fc2VjdGlvbik7CisKKyAgICAvKiBpbWFnZSByZXNzb3VyY2VzICovCisgICAgbGVuX3NlY3Rpb24gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpOworICAgIGlmIChsZW5fc2VjdGlvbiA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJOZWdhdGl2ZSBzaXplIGZvciBpbWFnZSByZXNzb3VyY2VzIHNlY3Rpb24uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAobGVuX3NlY3Rpb24gKyA0KSkgeyAvKiBzZWN0aW9uIGFuZCBsZW4gbmV4dCBzZWN0aW9uICovCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb21wbGV0ZSBmaWxlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgbGVuX3NlY3Rpb24pOworCisgICAgLyogbGF5ZXJzIGFuZCBtYXNrcyAqLworICAgIGxlbl9zZWN0aW9uID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJnMtPmdiKTsKKyAgICBpZiAobGVuX3NlY3Rpb24gPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTmVnYXRpdmUgc2l6ZSBmb3IgbGF5ZXJzIGFuZCBtYXNrcyBkYXRhIHNlY3Rpb24uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBsZW5fc2VjdGlvbikgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29tcGxldGUgZmlsZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcy0+Z2IsIGxlbl9zZWN0aW9uKTsKKworICAgIC8qIGltYWdlIHNlY3Rpb24gKi8KKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IDIpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaWxlIHdpdGhvdXQgaW1hZ2UgZGF0YSBzZWN0aW9uLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHMtPmNvbXByZXNzaW9uID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJnMtPmdiKTsKKyAgICBzd2l0Y2ggKHMtPmNvbXByZXNzaW9uKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJaSVAgd2l0aG91dCBwcmVkaWN0b3IgY29tcHJlc3Npb24iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIlpJUCB3aXRoIHByZWRpY3RvciBjb21wcmVzc2lvbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb21wcmVzc2lvbiAlZC5cbiIsIHMtPmNvbXByZXNzaW9uKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmxlKFBTRENvbnRleHQgKiBzKXsKKyAgICB1bnNpZ25lZCBpbnQgc2NhbmxpbmVfY291bnQ7CisgICAgdW5zaWduZWQgaW50IHNsLCBjb3VudDsKKyAgICB1bnNpZ25lZCBsb25nIHRhcmdldF9pbmRleCA9IDA7CisgICAgdW5zaWduZWQgaW50IHA7CisgICAgaW50OF90IHJsZV9jaGFyOworICAgIHVuc2lnbmVkIGludCByZXBlYXRfY291bnQ7CisgICAgdWludDhfdCB2OworCisgICAgc2NhbmxpbmVfY291bnQgPSBzLT5oZWlnaHQgKiBzLT5jaGFubmVsX2NvdW50OworCisgICAgLyogc2NhbmxpbmUgdGFibGUgKi8KKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IHNjYW5saW5lX2NvdW50ICogMikgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBlbm91Z2ggZGF0YSBmb3IgcmxlIHNjYW5saW5lIHRhYmxlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBieXRlc3RyZWFtMl9za2lwKCZzLT5nYiwgc2NhbmxpbmVfY291bnQgKiAyKTsvKiBzaXplIG9mIGVhY2ggc2NhbmxpbmUgKi8KKworICAgIC8qIGRlY29kZSBybGUgZGF0YSBzY2FubGluZSBieSBzY2FubGluZSAqLworICAgIGZvciAoc2wgPSAwOyBzbCA8IHNjYW5saW5lX2NvdW50OyBzbCsrKSB7CisgICAgICAgIGNvdW50ID0gMDsKKworICAgICAgICB3aGlsZSAoY291bnQgPCBzLT5saW5lX3NpemUpIHsKKyAgICAgICAgICAgIHJsZV9jaGFyID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKworICAgICAgICAgICAgaWYgKHJsZV9jaGFyIDw9IDApIHsvKiBieXRlIHJlcGVhdCAqLworICAgICAgICAgICAgICAgIHJlcGVhdF9jb3VudCA9IHJsZV9jaGFyICogLTE7CisKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIGRhdGEgZm9yIHJsZSBzY2FubGluZS5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X2luZGV4ICsgcmVwZWF0X2NvdW50ID49IHMtPnVuY29tcHJlc3NlZF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBybGUgY2hhci5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB2ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmdiKTsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDw9IHJlcGVhdF9jb3VudDsgcCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnRtcFt0YXJnZXRfaW5kZXgrK10gPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3VudCArPSByZXBlYXRfY291bnQgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IHJsZV9jaGFyKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBkYXRhIGZvciBybGUgc2NhbmxpbmUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHRhcmdldF9pbmRleCArIHJsZV9jaGFyID49IHMtPnVuY29tcHJlc3NlZF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBybGUgY2hhci5cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDw9IHJsZV9jaGFyOyBwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nYik7CisgICAgICAgICAgICAgICAgICAgIHMtPnRtcFt0YXJnZXRfaW5kZXgrK10gPSB2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb3VudCArPSBybGVfY2hhciArIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgcmV0OworICAgIHVpbnQ4X3QgKnB0cjsKKyAgICBjb25zdCB1aW50OF90ICpwdHJfZGF0YTsKKyAgICBpbnQgaW5kZXhfb3V0LCBjLCB5LCB4LCBwOworICAgIHVpbnQ4X3QgZXFfY2hhbm5lbFs0XSA9IHsyLDAsMSwzfTsvKiBSR0JBIC0+IEdCUkEgY2hhbm5lbCBvcmRlciAqLworICAgIHVpbnQ4X3QgcGxhbmVfbnVtYmVyOworCisgICAgQVZGcmFtZSAqcGljdHVyZSA9IGRhdGE7CisKKyAgICBQU0RDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzLT5hdmN0eCAgICAgPSBhdmN0eDsKKyAgICBzLT5jaGFubmVsX2NvdW50ID0gMDsKKyAgICBzLT5jaGFubmVsX2RlcHRoID0gMDsKKyAgICBzLT50bXAgICAgICAgICAgID0gTlVMTDsKKyAgICBzLT5saW5lX3NpemUgICAgID0gMDsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworCisgICAgaWYgKChyZXQgPSBkZWNvZGVfaGVhZGVyKHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5waXhlbF9zaXplID0gcy0+Y2hhbm5lbF9kZXB0aCA+PiAzOy8qIGluIGJ5dGUgKi8KKyAgICBzLT5saW5lX3NpemUgPSBzLT53aWR0aCAqIHMtPnBpeGVsX3NpemU7CisKKyAgICBzd2l0Y2ggKHMtPmNvbG9yX21vZGUpIHsKKyAgICBjYXNlIFBTRF9CSVRNQVA6CisgICAgICAgIGlmIChzLT5jaGFubmVsX2RlcHRoICE9IDEgfHwgcy0+Y2hhbm5lbF9jb3VudCAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYml0bWFwIGZpbGUgKGNoYW5uZWxfZGVwdGggJWQsIGNoYW5uZWxfY291bnQgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2RlcHRoLCBzLT5jaGFubmVsX2NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHMtPmxpbmVfc2l6ZSA9IHMtPndpZHRoICsgNyA+PiAzOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfTU9OT1dISVRFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBTRF9JTkRFWEVEOgorICAgICAgICBpZiAocy0+Y2hhbm5lbF9kZXB0aCAhPSA4IHx8IHMtPmNoYW5uZWxfY291bnQgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5kZXhlZCBmaWxlIChjaGFubmVsX2RlcHRoICVkLCBjaGFubmVsX2NvdW50ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2RlcHRoLCBzLT5jaGFubmVsX2NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBTRF9SR0I6CisgICAgICAgIGlmIChzLT5jaGFubmVsX2NvdW50ID09IDMpIHsKKyAgICAgICAgICAgIGlmIChzLT5jaGFubmVsX2RlcHRoID09IDgpIHsKKyAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSUDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+Y2hhbm5lbF9kZXB0aCA9PSAxNikgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTZCRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJjaGFubmVsIGRlcHRoICVkIGZvciByZ2IiLCBzLT5jaGFubmVsX2RlcHRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+Y2hhbm5lbF9jb3VudCA9PSA0KSB7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9kZXB0aCA9PSA4KSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUkFQOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5jaGFubmVsX2RlcHRoID09IDE2KSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUkFQMTZCRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJjaGFubmVsIGRlcHRoICVkIGZvciByZ2IiLCBzLT5jaGFubmVsX2RlcHRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgImNoYW5uZWwgY291bnQgJWQgZm9yIHJnYiIsIHMtPmNoYW5uZWxfY291bnQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUFNEX0RVT1RPTkU6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyB1bmtub3duIGR1b3RvbmUgc3BlY2lmaWNhdGlvbi5cbiIpOworICAgIGNhc2UgUFNEX0dSQVlTQ0FMRToKKyAgICAgICAgaWYgKHMtPmNoYW5uZWxfY291bnQgPT0gMSkgeworICAgICAgICAgICAgaWYgKHMtPmNoYW5uZWxfZGVwdGggPT0gOCkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+Y2hhbm5lbF9kZXB0aCA9PSAxNikgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTZCRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJjaGFubmVsIGRlcHRoICVkIGZvciBncmF5c2NhbGUiLCBzLT5jaGFubmVsX2RlcHRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocy0+Y2hhbm5lbF9jb3VudCA9PSAyKSB7CisgICAgICAgICAgICBpZiAocy0+Y2hhbm5lbF9kZXB0aCA9PSA4KSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lBODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+Y2hhbm5lbF9kZXB0aCA9PSAxNikgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZQTE2QkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiY2hhbm5lbCBkZXB0aCAlZCBmb3IgZ3JheXNjYWxlIiwgcy0+Y2hhbm5lbF9kZXB0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJjaGFubmVsIGNvdW50ICVkIGZvciBncmF5c2NhbGUiLCBzLT5jaGFubmVsX2NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShhdmN0eCwgImNvbG9yIG1vZGUgJWQiLCBzLT5jb2xvcl9tb2RlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIHMtPnVuY29tcHJlc3NlZF9zaXplID0gcy0+bGluZV9zaXplICogcy0+aGVpZ2h0ICogcy0+Y2hhbm5lbF9jb3VudDsKKworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljdHVyZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIGRlY29kZSBwaWN0dXJlIGlmIG5lZWQgKi8KKyAgICBpZiAocy0+Y29tcHJlc3Npb24gPT0gUFNEX1JMRSkgeworICAgICAgICBzLT50bXAgPSBhdl9tYWxsb2Mocy0+dW5jb21wcmVzc2VkX3NpemUpOworICAgICAgICBpZiAoIXMtPnRtcCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgcmV0ID0gZGVjb2RlX3JsZShzKTsKKworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPnRtcCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcHRyX2RhdGEgPSBzLT50bXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBzLT51bmNvbXByZXNzZWRfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIGRhdGEgZm9yIHJhdyBpbWFnZSBkYXRhIHNlY3Rpb24uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHB0cl9kYXRhID0gcy0+Z2IuYnVmZmVyOworICAgIH0KKworICAgIC8qIFN0b3JlIGRhdGEgKi8KKyAgICBpZiAoKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWUE4KXx8KGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWUExNkJFKSl7LyogSW50ZXJsZWF2ZWQgKi8KKyAgICAgICAgcHRyID0gcGljdHVyZS0+ZGF0YVswXTsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IHMtPmNoYW5uZWxfY291bnQ7IGMrKykgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXhfb3V0ID0geSAqIHBpY3R1cmUtPmxpbmVzaXplWzBdICsgeCAqIHMtPmNoYW5uZWxfY291bnQgKiBzLT5waXhlbF9zaXplICsgYyAqIHMtPnBpeGVsX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBzLT5waXhlbF9zaXplOyBwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cltpbmRleF9vdXQgKyBwXSA9ICpwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhICsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsvKiBQbGFuYXIgKi8KKyAgICAgICAgaWYgKHMtPmNoYW5uZWxfY291bnQgPT0gMSkvKiBncmF5IDggb3IgZ3JheSAxNmJlICovCisgICAgICAgICAgICBlcV9jaGFubmVsWzBdID0gMDsvKiBhc3NpZ24gZmlyc3QgY2hhbm5lbCwgdG8gZmlyc3QgcGxhbmUgKi8KKworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+Y2hhbm5lbF9jb3VudDsgYysrKSB7CisgICAgICAgICAgICBwbGFuZV9udW1iZXIgPSBlcV9jaGFubmVsW2NdOworICAgICAgICAgICAgcHRyID0gcGljdHVyZS0+ZGF0YVtwbGFuZV9udW1iZXJdOy8qIGdldCB0aGUgcmlnaHQgcGxhbmUgKi8KKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzLT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIG1lbWNweShwdHIsIHB0cl9kYXRhLCBzLT5saW5lX3NpemUpOworICAgICAgICAgICAgICAgIHB0ciArPSBwaWN0dXJlLT5saW5lc2l6ZVtwbGFuZV9udW1iZXJdOworICAgICAgICAgICAgICAgIHB0cl9kYXRhICs9IHMtPmxpbmVfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5jb2xvcl9tb2RlID09IFBTRF9JTkRFWEVEKSB7CisgICAgICAgIHBpY3R1cmUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICBtZW1jcHkocGljdHVyZS0+ZGF0YVsxXSwgcy0+cGFsZXR0ZSwgQVZQQUxFVFRFX1NJWkUpOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZzLT50bXApOworCisgICAgcGljdHVyZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK0FWQ29kZWMgZmZfcHNkX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAicHNkIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaG90b3Nob3AgUFNEIGZpbGUiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BTRCwKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihQU0RDb250ZXh0KSwKKyAgICAuZGVjb2RlICAgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3BzeW1vZGVsLmMgYi9saWJhdmNvZGVjL3BzeW1vZGVsLmMKaW5kZXggNjI3NGE0OS4uMmI1ZjExMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wc3ltb2RlbC5jCisrKyBiL2xpYmF2Y29kZWMvcHN5bW9kZWwuYwpAQCAtMTIwLDcgKzEyMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0ZJTFRFUl9NT0RFX0xPV1BBU1MsIEZJTFRfT1JERVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3V0b2ZmX2NvZWZmLCAwLjAsIDAuMCk7CiAgICAgICAgIGlmIChjdHgtPmZjb2VmZnMpIHsKLSAgICAgICAgICAgIGN0eC0+ZnN0YXRlID0gYXZfbWFsbG9jeihzaXplb2YoY3R4LT5mc3RhdGVbMF0pICogYXZjdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGN0eC0+ZnN0YXRlID0gYXZfbWFsbG9jel9hcnJheShzaXplb2YoY3R4LT5mc3RhdGVbMF0pLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgaWYgKCFjdHgtPmZzdGF0ZSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUoY3R4LT5mY29lZmZzKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGN0eCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspCiAgICAgICAgICAgICAgICAgY3R4LT5mc3RhdGVbaV0gPSBmZl9paXJfZmlsdGVyX2luaXRfc3RhdGUoRklMVF9PUkRFUik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHN5bW9kZWwuaCBiL2xpYmF2Y29kZWMvcHN5bW9kZWwuaAppbmRleCAzNWQxODRjLi5lNWY5MTdkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3BzeW1vZGVsLmgKKysrIGIvbGliYXZjb2RlYy9wc3ltb2RlbC5oCkBAIC0yOSw3ICsyOSw3IEBACiAvKiogbWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgKi8KICNkZWZpbmUgUFNZX01BWF9DSEFOUyAyMAogCi0vKiBjdXRvZmYgZm9yIFZCUiBpcyBwdXJwb3NlZGx5IGluY3JlYXNlZCwgc2luY2UgTFAgZmlsdGVyaW5nIGFjdHVhbGx5CisvKiBjdXRvZmYgZm9yIFZCUiBpcyBwdXJwb3NlbHkgaW5jcmVhc2VkLCBzaW5jZSBMUCBmaWx0ZXJpbmcgYWN0dWFsbHkKICAqIGhpbmRlcnMgVkJSIHBlcmZvcm1hbmNlIHJhdGhlciB0aGFuIHRoZSBvcHBvc2l0ZQogICovCiAjZGVmaW5lIEFBQ19DVVRPRkZfRlJPTV9CSVRSQVRFKGJpdF9yYXRlLGNoYW5uZWxzLHNhbXBsZV9yYXRlKSAoYml0X3JhdGUgPyBGRk1JTjMoRkZNSU4zKCBcCkBAIC0zOSw3ICszOSw3IEBACiAgICAgMjIwMDAsIFwKICAgICBzYW1wbGVfcmF0ZSAvIDIpOiAoc2FtcGxlX3JhdGUgLyAyKSkKICNkZWZpbmUgQUFDX0NVVE9GRihzKSAoIFwKLSAgICAocy0+ZmxhZ3MgJiBDT0RFQ19GTEFHX1FTQ0FMRSkgXAorICAgIChzLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKSBcCiAgICAgPyBzLT5zYW1wbGVfcmF0ZSAvIDIgXAogICAgIDogQUFDX0NVVE9GRl9GUk9NX0JJVFJBVEUocy0+Yml0X3JhdGUsIHMtPmNoYW5uZWxzLCBzLT5zYW1wbGVfcmF0ZSkgXAogKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wdGhyZWFkX2ZyYW1lLmMgYi9saWJhdmNvZGVjL3B0aHJlYWRfZnJhbWUuYwppbmRleCBiNzdkZDFlLi41MTA0YjFiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3B0aHJlYWRfZnJhbWUuYworKysgYi9saWJhdmNvZGVjL3B0aHJlYWRfZnJhbWUuYwpAQCAtMjQsOSArMjQsMTEgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaHdhY2NlbC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAicHRocmVhZF9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInRocmVhZC5oIgpAQCAtNDMsNiArNDUsMjUgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgogCitlbnVtIHsKKyAgICAvLy88IFNldCB3aGVuIHRoZSB0aHJlYWQgaXMgYXdhaXRpbmcgYSBwYWNrZXQuCisgICAgU1RBVEVfSU5QVVRfUkVBRFksCisgICAgLy8vPCBTZXQgYmVmb3JlIHRoZSBjb2RlYyBoYXMgY2FsbGVkIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKS4KKyAgICBTVEFURV9TRVRUSU5HX1VQLAorICAgIC8qKgorICAgICAqIFNldCB3aGVuIHRoZSBjb2RlYyBjYWxscyBnZXRfYnVmZmVyKCkuCisgICAgICogU3RhdGUgaXMgcmV0dXJuZWQgdG8gU1RBVEVfU0VUVElOR19VUCBhZnRlcndhcmRzLgorICAgICAqLworICAgIFNUQVRFX0dFVF9CVUZGRVIsCisgICAgIC8qKgorICAgICAgKiBTZXQgd2hlbiB0aGUgY29kZWMgY2FsbHMgZ2V0X2Zvcm1hdCgpLgorICAgICAgKiBTdGF0ZSBpcyByZXR1cm5lZCB0byBTVEFURV9TRVRUSU5HX1VQIGFmdGVyd2FyZHMuCisgICAgICAqLworICAgIFNUQVRFX0dFVF9GT1JNQVQsCisgICAgLy8vPCBTZXQgYWZ0ZXIgdGhlIGNvZGVjIGhhcyBjYWxsZWQgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cCgpLgorICAgIFNUQVRFX1NFVFVQX0ZJTklTSEVELAorfTsKKwogLyoqCiAgKiBDb250ZXh0IHVzZWQgYnkgY29kZWMgdGhyZWFkcyBhbmQgc3RvcmVkIGluIHRoZWlyIEFWQ29kZWNJbnRlcm5hbCB0aHJlYWRfY3R4LgogICovCkBAIC02NiwxOSArODcsNyBAQAogICAgIGludCAgICAgZ290X2ZyYW1lOyAgICAgICAgICAgICAgLy8vPCBUaGUgb3V0cHV0IG9mIGdvdF9waWN0dXJlX3B0ciBmcm9tIHRoZSBsYXN0IGF2Y29kZWNfZGVjb2RlX3ZpZGVvKCkgY2FsbC4KICAgICBpbnQgICAgIHJlc3VsdDsgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBjb2RlYyBkZWNvZGUvZW5jb2RlKCkgY2FsbC4KIAotICAgIGVudW0gewotICAgICAgICBTVEFURV9JTlBVVF9SRUFEWSwgICAgICAgICAgLy8vPCBTZXQgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWl0aW5nIGEgcGFja2V0LgotICAgICAgICBTVEFURV9TRVRUSU5HX1VQLCAgICAgICAgICAgLy8vPCBTZXQgYmVmb3JlIHRoZSBjb2RlYyBoYXMgY2FsbGVkIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKS4KLSAgICAgICAgU1RBVEVfR0VUX0JVRkZFUiwgICAgICAgICAgIC8qKjwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNldCB3aGVuIHRoZSBjb2RlYyBjYWxscyBnZXRfYnVmZmVyKCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdGF0ZSBpcyByZXR1cm5lZCB0byBTVEFURV9TRVRUSU5HX1VQIGFmdGVyd2FyZHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgU1RBVEVfR0VUX0ZPUk1BVCwgICAgICAgICAgIC8qKjwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFNldCB3aGVuIHRoZSBjb2RlYyBjYWxscyBnZXRfZm9ybWF0KCkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBTdGF0ZSBpcyByZXR1cm5lZCB0byBTVEFURV9TRVRUSU5HX1VQIGFmdGVyd2FyZHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgU1RBVEVfU0VUVVBfRklOSVNIRUQgICAgICAgIC8vLzwgU2V0IGFmdGVyIHRoZSBjb2RlYyBoYXMgY2FsbGVkIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKS4KLSAgICB9IHN0YXRlOworICAgIGF0b21pY19pbnQgc3RhdGU7CiAKICAgICAvKioKICAgICAgKiBBcnJheSBvZiBmcmFtZXMgcGFzc2VkIHRvIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcigpLgpAQCAtOTMsNiArMTAyLDEzIEBACiAKICAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmF2YWlsYWJsZV9mb3JtYXRzOyAvLy88IEZvcm1hdCBhcnJheSBmb3IgZ2V0X2Zvcm1hdCgpCiAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHJlc3VsdF9mb3JtYXQ7ICAgICAgICAgICAgLy8vPCBnZXRfZm9ybWF0KCkgcmVzdWx0CisKKyAgICBpbnQgZGllOyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgU2V0IHdoZW4gdGhlIHRocmVhZCBzaG91bGQgZXhpdC4KKworICAgIGludCBod2FjY2VsX3NlcmlhbGl6aW5nOworICAgIGludCBhc3luY19zZXJpYWxpemluZzsKKworICAgIGF0b21pY19pbnQgZGVidWdfdGhyZWFkczsgICAgICAgLy8vPCBTZXQgaWYgdGhlIEZGX0RFQlVHX1RIUkVBRFMgb3B0aW9uIGlzIHNldC4KIH0gUGVyVGhyZWFkQ29udGV4dDsKIAogLyoqCkBAIC0xMDMsNiArMTE5LDE0IEBACiAgICAgUGVyVGhyZWFkQ29udGV4dCAqcHJldl90aHJlYWQ7IC8vLzwgVGhlIGxhc3QgdGhyZWFkIHN1Ym1pdF9wYWNrZXQoKSB3YXMgY2FsbGVkIG9uLgogCiAgICAgcHRocmVhZF9tdXRleF90IGJ1ZmZlcl9tdXRleDsgIC8vLzwgTXV0ZXggdXNlZCB0byBwcm90ZWN0IGdldC9yZWxlYXNlX2J1ZmZlcigpLgorICAgIC8qKgorICAgICAqIFRoaXMgbG9jayBpcyB1c2VkIGZvciBlbnN1cmluZyB0aHJlYWRzIHJ1biBpbiBzZXJpYWwgd2hlbiBod2FjY2VsCisgICAgICogaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwdGhyZWFkX211dGV4X3QgaHdhY2NlbF9tdXRleDsKKyAgICBwdGhyZWFkX211dGV4X3QgYXN5bmNfbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgYXN5bmNfY29uZDsKKyAgICBpbnQgYXN5bmNfbG9jazsKIAogICAgIGludCBuZXh0X2RlY29kaW5nOyAgICAgICAgICAgICAvLy88IFRoZSBuZXh0IGNvbnRleHQgdG8gc3VibWl0IGEgcGFja2V0IHRvLgogICAgIGludCBuZXh0X2ZpbmlzaGVkOyAgICAgICAgICAgICAvLy88IFRoZSBuZXh0IGNvbnRleHQgdG8gcmV0dXJuIG91dHB1dCBmcm9tLgpAQCAtMTExLDEzICsxMzUsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogU2V0IGZvciB0aGUgZmlyc3QgTiBwYWNrZXRzLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgdGhyZWFkcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogV2hpbGUgaXQgaXMgc2V0LCBmZl90aHJlYWRfZW4vZGVjb2RlX2ZyYW1lIHdvbid0IHJldHVybiBhbnkgcmVzdWx0cy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBpbnQgZGllOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTZXQgd2hlbiB0aHJlYWRzIHNob3VsZCBleGl0LgogfSBGcmFtZVRocmVhZENvbnRleHQ7CiAKICNkZWZpbmUgVEhSRUFEX1NBRkVfQ0FMTEJBQ0tTKGF2Y3R4KSBcCiAoKGF2Y3R4KS0+dGhyZWFkX3NhZmVfY2FsbGJhY2tzIHx8IChhdmN0eCktPmdldF9idWZmZXIyID09IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMikKIAorc3RhdGljIHZvaWQgYXN5bmNfbG9jayhGcmFtZVRocmVhZENvbnRleHQgKmZjdHgpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmY3R4LT5hc3luY19tdXRleCk7CisgICAgd2hpbGUgKGZjdHgtPmFzeW5jX2xvY2spCisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZmY3R4LT5hc3luY19jb25kLCAmZmN0eC0+YXN5bmNfbXV0ZXgpOworICAgIGZjdHgtPmFzeW5jX2xvY2sgPSAxOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmY3R4LT5hc3luY19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzeW5jX3VubG9jayhGcmFtZVRocmVhZENvbnRleHQgKmZjdHgpCit7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmY3R4LT5hc3luY19tdXRleCk7CisgICAgYXZfYXNzZXJ0MChmY3R4LT5hc3luY19sb2NrKTsKKyAgICBmY3R4LT5hc3luY19sb2NrID0gMDsKKyAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZmY3R4LT5hc3luY19jb25kKTsKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZmN0eC0+YXN5bmNfbXV0ZXgpOworfQorCiAvKioKICAqIENvZGVjIHdvcmtlciB0aHJlYWQuCiAgKgpAQCAtMTI4LDIwICsxNjgsMzQgQEAKIHN0YXRpYyBhdHRyaWJ1dGVfYWxpZ25fYXJnIHZvaWQgKmZyYW1lX3dvcmtlcl90aHJlYWQodm9pZCAqYXJnKQogewogICAgIFBlclRocmVhZENvbnRleHQgKnAgPSBhcmc7Ci0gICAgRnJhbWVUaHJlYWRDb250ZXh0ICpmY3R4ID0gcC0+cGFyZW50OwogICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHAtPmF2Y3R4OwogICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjID0gYXZjdHgtPmNvZGVjOwogCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5tdXRleCk7CiAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgICAgIHdoaWxlIChwLT5zdGF0ZSA9PSBTVEFURV9JTlBVVF9SRUFEWSAmJiAhZmN0eC0+ZGllKQotICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZwLT5pbnB1dF9jb25kLCAmcC0+bXV0ZXgpOworICAgICAgICB3aGlsZSAoYXRvbWljX2xvYWQoJnAtPnN0YXRlKSA9PSBTVEFURV9JTlBVVF9SRUFEWSAmJiAhcC0+ZGllKQorICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnAtPmlucHV0X2NvbmQsICZwLT5tdXRleCk7CiAKLSAgICAgICAgaWYgKGZjdHgtPmRpZSkgYnJlYWs7CisgICAgICAgIGlmIChwLT5kaWUpIGJyZWFrOwogCiAgICAgICAgIGlmICghY29kZWMtPnVwZGF0ZV90aHJlYWRfY29udGV4dCAmJiBUSFJFQURfU0FGRV9DQUxMQkFDS1MoYXZjdHgpKQogICAgICAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChhdmN0eCk7CiAKKyAgICAgICAgLyogSWYgYSBkZWNvZGVyIHN1cHBvcnRzIGh3YWNjZWwsIHRoZW4gaXQgbXVzdCBjYWxsIGZmX2dldF9mb3JtYXQoKS4KKyAgICAgICAgICogU2luY2UgdGhhdCBjYWxsIG11c3QgaGFwcGVuIGJlZm9yZSBmZl90aHJlYWRfZmluaXNoX3NldHVwKCksIHRoZQorICAgICAgICAgKiBkZWNvZGVyIGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCB1cGRhdGVfdGhyZWFkX2NvbnRleHQoKSBhbmQgY2FsbAorICAgICAgICAgKiBmZl90aHJlYWRfZmluaXNoX3NldHVwKCkgbWFudWFsbHkuIFRoZXJlZm9yZSB0aGUgYWJvdmUKKyAgICAgICAgICogZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cCgpIGNhbGwgZGlkIG5vdCBoYXBwZW4gYW5kIGh3YWNjZWxfc2VyaWFsaXppbmcKKyAgICAgICAgICogY2Fubm90IGJlIHRydWUgaGVyZS4gKi8KKyAgICAgICAgYXZfYXNzZXJ0MCghcC0+aHdhY2NlbF9zZXJpYWxpemluZyk7CisKKyAgICAgICAgLyogaWYgdGhlIHByZXZpb3VzIHRocmVhZCB1c2VzIGh3YWNjZWwgdGhlbiB3ZSB0YWtlIHRoZSBsb2NrIHRvIGVuc3VyZQorICAgICAgICAgKiB0aGUgdGhyZWFkcyBkb24ndCBydW4gY29uY3VycmVudGx5ICovCisgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wYXJlbnQtPmh3YWNjZWxfbXV0ZXgpOworICAgICAgICAgICAgcC0+aHdhY2NlbF9zZXJpYWxpemluZyA9IDE7CisgICAgICAgIH0KKwogICAgICAgICBhdl9mcmFtZV91bnJlZihwLT5mcmFtZSk7CiAgICAgICAgIHAtPmdvdF9mcmFtZSA9IDA7CiAgICAgICAgIHAtPnJlc3VsdCA9IGNvZGVjLT5kZWNvZGUoYXZjdHgsIHAtPmZyYW1lLCAmcC0+Z290X2ZyYW1lLCAmcC0+YXZwa3QpOwpAQCAtMTUzLDE3ICsyMDcsMjMgQEAKICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKHAtPmZyYW1lKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChwLT5zdGF0ZSA9PSBTVEFURV9TRVRUSU5HX1VQKSBmZl90aHJlYWRfZmluaXNoX3NldHVwKGF2Y3R4KTsKKyAgICAgICAgaWYgKGF0b21pY19sb2FkKCZwLT5zdGF0ZSkgPT0gU1RBVEVfU0VUVElOR19VUCkKKyAgICAgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOworCisgICAgICAgIGlmIChwLT5od2FjY2VsX3NlcmlhbGl6aW5nKSB7CisgICAgICAgICAgICBwLT5od2FjY2VsX3NlcmlhbGl6aW5nID0gMDsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wYXJlbnQtPmh3YWNjZWxfbXV0ZXgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAtPmFzeW5jX3NlcmlhbGl6aW5nKSB7CisgICAgICAgICAgICBwLT5hc3luY19zZXJpYWxpemluZyA9IDA7CisKKyAgICAgICAgICAgIGFzeW5jX3VubG9jayhwLT5wYXJlbnQpOworICAgICAgICB9CiAKICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7Ci0jaWYgMCAvL0JVRlJFRi1GSVhNRQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0JVRkZFUlM7IGkrKykKLSAgICAgICAgICAgIGlmIChwLT5wcm9ncmVzc191c2VkW2ldICYmIChwLT5nb3RfZnJhbWUgfHwgcC0+cmVzdWx0PDAgfHwgYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0gyNjQpKSB7Ci0gICAgICAgICAgICAgICAgcC0+cHJvZ3Jlc3NbaV1bMF0gPSBJTlRfTUFYOwotICAgICAgICAgICAgICAgIHAtPnByb2dyZXNzW2ldWzFdID0gSU5UX01BWDsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICBwLT5zdGF0ZSA9IFNUQVRFX0lOUFVUX1JFQURZOworCisgICAgICAgIGF0b21pY19zdG9yZSgmcC0+c3RhdGUsIFNUQVRFX0lOUFVUX1JFQURZKTsKIAogICAgICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZwLT5wcm9ncmVzc19jb25kKTsKICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcC0+b3V0cHV0X2NvbmQpOwpAQCAtMTg2LDEyICsyNDYsMTMgQEAKIHsKICAgICBpbnQgZXJyID0gMDsKIAotICAgIGlmIChkc3QgIT0gc3JjKSB7CisgICAgaWYgKGRzdCAhPSBzcmMgJiYgKGZvcl91c2VyIHx8ICEoc3JjLT5jb2RlY19kZXNjcmlwdG9yLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSkpKSB7CiAgICAgICAgIGRzdC0+dGltZV9iYXNlID0gc3JjLT50aW1lX2Jhc2U7CiAgICAgICAgIGRzdC0+ZnJhbWVyYXRlID0gc3JjLT5mcmFtZXJhdGU7CiAgICAgICAgIGRzdC0+d2lkdGggICAgID0gc3JjLT53aWR0aDsKICAgICAgICAgZHN0LT5oZWlnaHQgICAgPSBzcmMtPmhlaWdodDsKICAgICAgICAgZHN0LT5waXhfZm10ICAgPSBzcmMtPnBpeF9mbXQ7CisgICAgICAgIGRzdC0+c3dfcGl4X2ZtdCA9IHNyYy0+c3dfcGl4X2ZtdDsKIAogICAgICAgICBkc3QtPmNvZGVkX3dpZHRoICA9IHNyYy0+Y29kZWRfd2lkdGg7CiAgICAgICAgIGRzdC0+Y29kZWRfaGVpZ2h0ID0gc3JjLT5jb2RlZF9oZWlnaHQ7CkBAIC0yMDEsMTEgKzI2Miw2IEBACiAKICAgICAgICAgZHN0LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBzcmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKICAgICAgICAgZHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvICAgPSBzcmMtPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0jaWYgRkZfQVBJX0FGRAotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgICAgICBkc3QtPmR0Z19hY3RpdmVfZm9ybWF0ICAgICA9IHNyYy0+ZHRnX2FjdGl2ZV9mb3JtYXQ7Ci1GRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZiAvKiBGRl9BUElfQUZEICovCiAKICAgICAgICAgZHN0LT5wcm9maWxlID0gc3JjLT5wcm9maWxlOwogICAgICAgICBkc3QtPmxldmVsICAgPSBzcmMtPmxldmVsOwpAQCAtMjI3LDYgKzI4MywxOSBAQAogICAgICAgICBkc3QtPnNhbXBsZV9mbXQgICAgID0gc3JjLT5zYW1wbGVfZm10OwogICAgICAgICBkc3QtPmNoYW5uZWxfbGF5b3V0ID0gc3JjLT5jaGFubmVsX2xheW91dDsKICAgICAgICAgZHN0LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGEgPSBzcmMtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKworICAgICAgICBpZiAoISFkc3QtPmh3X2ZyYW1lc19jdHggIT0gISFzcmMtPmh3X2ZyYW1lc19jdHggfHwKKyAgICAgICAgICAgIChkc3QtPmh3X2ZyYW1lc19jdHggJiYgZHN0LT5od19mcmFtZXNfY3R4LT5kYXRhICE9IHNyYy0+aHdfZnJhbWVzX2N0eC0+ZGF0YSkpIHsKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZHN0LT5od19mcmFtZXNfY3R4KTsKKworICAgICAgICAgICAgaWYgKHNyYy0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICAgICAgICAgIGRzdC0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgICAgICAgICBpZiAoIWRzdC0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdC0+aHdhY2NlbF9mbGFncyA9IHNyYy0+aHdhY2NlbF9mbGFnczsKICAgICB9CiAKICAgICBpZiAoZm9yX3VzZXIpIHsKQEAgLTMwOCwyNCArMzc3LDM1IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IHN1Ym1pdF9wYWNrZXQoUGVyVGhyZWFkQ29udGV4dCAqcCwgQVZQYWNrZXQgKmF2cGt0KQorc3RhdGljIGludCBzdWJtaXRfcGFja2V0KFBlclRocmVhZENvbnRleHQgKnAsIEFWQ29kZWNDb250ZXh0ICp1c2VyX2F2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKIHsKICAgICBGcmFtZVRocmVhZENvbnRleHQgKmZjdHggPSBwLT5wYXJlbnQ7CiAgICAgUGVyVGhyZWFkQ29udGV4dCAqcHJldl90aHJlYWQgPSBmY3R4LT5wcmV2X3RocmVhZDsKICAgICBjb25zdCBBVkNvZGVjICpjb2RlYyA9IHAtPmF2Y3R4LT5jb2RlYzsKKyAgICBpbnQgcmV0OwogCiAgICAgaWYgKCFhdnBrdC0+c2l6ZSAmJiAhKGNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfREVMQVkpKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+bXV0ZXgpOwogCisgICAgcmV0ID0gdXBkYXRlX2NvbnRleHRfZnJvbV91c2VyKHAtPmF2Y3R4LCB1c2VyX2F2Y3R4KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5tdXRleCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGF0b21pY19zdG9yZV9leHBsaWNpdCgmcC0+ZGVidWdfdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHAtPmF2Y3R4LT5kZWJ1ZyAmIEZGX0RFQlVHX1RIUkVBRFMpICE9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKwogICAgIHJlbGVhc2VfZGVsYXllZF9idWZmZXJzKHApOwogCiAgICAgaWYgKHByZXZfdGhyZWFkKSB7CiAgICAgICAgIGludCBlcnI7Ci0gICAgICAgIGlmIChwcmV2X3RocmVhZC0+c3RhdGUgPT0gU1RBVEVfU0VUVElOR19VUCkgeworICAgICAgICBpZiAoYXRvbWljX2xvYWQoJnByZXZfdGhyZWFkLT5zdGF0ZSkgPT0gU1RBVEVfU0VUVElOR19VUCkgewogICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwcmV2X3RocmVhZC0+cHJvZ3Jlc3NfbXV0ZXgpOwotICAgICAgICAgICAgd2hpbGUgKHByZXZfdGhyZWFkLT5zdGF0ZSA9PSBTVEFURV9TRVRUSU5HX1VQKQorICAgICAgICAgICAgd2hpbGUgKGF0b21pY19sb2FkKCZwcmV2X3RocmVhZC0+c3RhdGUpID09IFNUQVRFX1NFVFRJTkdfVVApCiAgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnByZXZfdGhyZWFkLT5wcm9ncmVzc19jb25kLCAmcHJldl90aHJlYWQtPnByb2dyZXNzX211dGV4KTsKICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwcmV2X3RocmVhZC0+cHJvZ3Jlc3NfbXV0ZXgpOwogICAgICAgICB9CkBAIC0zMzgsOSArNDE4LDE0IEBACiAgICAgfQogCiAgICAgYXZfcGFja2V0X3VucmVmKCZwLT5hdnBrdCk7Ci0gICAgYXZfcGFja2V0X3JlZigmcC0+YXZwa3QsIGF2cGt0KTsKKyAgICByZXQgPSBhdl9wYWNrZXRfcmVmKCZwLT5hdnBrdCwgYXZwa3QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5tdXRleCk7CisgICAgICAgIGF2X2xvZyhwLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiYXZfcGFja2V0X3JlZigpIGZhaWxlZCBpbiBzdWJtaXRfcGFja2V0KClcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KIAotICAgIHAtPnN0YXRlID0gU1RBVEVfU0VUVElOR19VUDsKKyAgICBhdG9taWNfc3RvcmUoJnAtPnN0YXRlLCBTVEFURV9TRVRUSU5HX1VQKTsKICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZwLT5pbnB1dF9jb25kKTsKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+bXV0ZXgpOwogCkBAIC0zNTMsMTMgKzQzOCwxMyBAQAogICAgIGlmICghcC0+YXZjdHgtPnRocmVhZF9zYWZlX2NhbGxiYWNrcyAmJiAoCiAgICAgICAgICBwLT5hdmN0eC0+Z2V0X2Zvcm1hdCAhPSBhdmNvZGVjX2RlZmF1bHRfZ2V0X2Zvcm1hdCB8fAogICAgICAgICAgcC0+YXZjdHgtPmdldF9idWZmZXIyICE9IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMikpIHsKLSAgICAgICAgd2hpbGUgKHAtPnN0YXRlICE9IFNUQVRFX1NFVFVQX0ZJTklTSEVEICYmIHAtPnN0YXRlICE9IFNUQVRFX0lOUFVUX1JFQURZKSB7CisgICAgICAgIHdoaWxlIChhdG9taWNfbG9hZCgmcC0+c3RhdGUpICE9IFNUQVRFX1NFVFVQX0ZJTklTSEVEICYmIGF0b21pY19sb2FkKCZwLT5zdGF0ZSkgIT0gU1RBVEVfSU5QVVRfUkVBRFkpIHsKICAgICAgICAgICAgIGludCBjYWxsX2RvbmUgPSAxOwogICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7Ci0gICAgICAgICAgICB3aGlsZSAocC0+c3RhdGUgPT0gU1RBVEVfU0VUVElOR19VUCkKKyAgICAgICAgICAgIHdoaWxlIChhdG9taWNfbG9hZCgmcC0+c3RhdGUpID09IFNUQVRFX1NFVFRJTkdfVVApCiAgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnAtPnByb2dyZXNzX2NvbmQsICZwLT5wcm9ncmVzc19tdXRleCk7CiAKLSAgICAgICAgICAgIHN3aXRjaCAocC0+c3RhdGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYXRvbWljX2xvYWRfZXhwbGljaXQoJnAtPnN0YXRlLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSkpIHsKICAgICAgICAgICAgIGNhc2UgU1RBVEVfR0VUX0JVRkZFUjoKICAgICAgICAgICAgICAgICBwLT5yZXN1bHQgPSBmZl9nZXRfYnVmZmVyKHAtPmF2Y3R4LCBwLT5yZXF1ZXN0ZWRfZnJhbWUsIHAtPnJlcXVlc3RlZF9mbGFncyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNzEsNyArNDU2LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChjYWxsX2RvbmUpIHsKLSAgICAgICAgICAgICAgICBwLT5zdGF0ZSAgPSBTVEFURV9TRVRUSU5HX1VQOworICAgICAgICAgICAgICAgIGF0b21pY19zdG9yZSgmcC0+c3RhdGUsIFNUQVRFX1NFVFRJTkdfVVApOwogICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnAtPnByb2dyZXNzX2NvbmQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnAtPnByb2dyZXNzX211dGV4KTsKQEAgLTM5MywxNSArNDc4LDE4IEBACiAgICAgUGVyVGhyZWFkQ29udGV4dCAqcDsKICAgICBpbnQgZXJyOwogCisgICAgLyogcmVsZWFzZSB0aGUgYXN5bmMgbG9jaywgcGVybWl0dGluZyBibG9ja2VkIGh3YWNjZWwgdGhyZWFkcyB0bworICAgICAqIGdvIGZvcndhcmQgd2hpbGUgd2UgYXJlIGluIHRoaXMgZnVuY3Rpb24gKi8KKyAgICBhc3luY191bmxvY2soZmN0eCk7CisKICAgICAvKgogICAgICAqIFN1Ym1pdCBhIHBhY2tldCB0byB0aGUgbmV4dCBkZWNvZGluZyB0aHJlYWQuCiAgICAgICovCiAKICAgICBwID0gJmZjdHgtPnRocmVhZHNbZmN0eC0+bmV4dF9kZWNvZGluZ107Ci0gICAgZXJyID0gdXBkYXRlX2NvbnRleHRfZnJvbV91c2VyKHAtPmF2Y3R4LCBhdmN0eCk7Ci0gICAgaWYgKGVycikgcmV0dXJuIGVycjsKLSAgICBlcnIgPSBzdWJtaXRfcGFja2V0KHAsIGF2cGt0KTsKLSAgICBpZiAoZXJyKSByZXR1cm4gZXJyOworICAgIGVyciA9IHN1Ym1pdF9wYWNrZXQocCwgYXZjdHgsIGF2cGt0KTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGZpbmlzaDsKIAogICAgIC8qCiAgICAgICogSWYgd2UncmUgc3RpbGwgcmVjZWl2aW5nIHRoZSBpbml0aWFsIHBhY2tldHMsIGRvbid0IHJldHVybiBhIGZyYW1lLgpAQCAtNDEyLDIzICs1MDAsMjUgQEAKIAogICAgIGlmIChmY3R4LT5kZWxheWluZykgewogICAgICAgICAqZ290X3BpY3R1cmVfcHRyPTA7Ci0gICAgICAgIGlmIChhdnBrdC0+c2l6ZSkKLSAgICAgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKKyAgICAgICAgaWYgKGF2cGt0LT5zaXplKSB7CisgICAgICAgICAgICBlcnIgPSBhdnBrdC0+c2l6ZTsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoKICAgICAgKiBSZXR1cm4gdGhlIG5leHQgYXZhaWxhYmxlIGZyYW1lIGZyb20gdGhlIG9sZGVzdCB0aHJlYWQuCiAgICAgICogSWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLCB0aGVuIHdlIGhhdmUgdG8gc2tpcCB0aHJlYWRzIHRoYXQKLSAgICAgKiBkaWRuJ3Qgb3V0cHV0IGEgZnJhbWUsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBhY2NpZGVudGFsbHkgc2lnbmFsCi0gICAgICogRU9GIChhdnBrdC0+c2l6ZSA9PSAwICYmICpnb3RfcGljdHVyZV9wdHIgPT0gMCkuCisgICAgICogZGlkbid0IG91dHB1dCBhIGZyYW1lL2Vycm9yLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gYWNjaWRlbnRhbGx5IHNpZ25hbAorICAgICAqIEVPRiAoYXZwa3QtPnNpemUgPT0gMCAmJiAqZ290X3BpY3R1cmVfcHRyID09IDAgJiYgZXJyID49IDApLgogICAgICAqLwogCiAgICAgZG8gewogICAgICAgICBwID0gJmZjdHgtPnRocmVhZHNbZmluaXNoZWQrK107CiAKLSAgICAgICAgaWYgKHAtPnN0YXRlICE9IFNUQVRFX0lOUFVUX1JFQURZKSB7CisgICAgICAgIGlmIChhdG9taWNfbG9hZCgmcC0+c3RhdGUpICE9IFNUQVRFX0lOUFVUX1JFQURZKSB7CiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnAtPnByb2dyZXNzX211dGV4KTsKLSAgICAgICAgICAgIHdoaWxlIChwLT5zdGF0ZSAhPSBTVEFURV9JTlBVVF9SRUFEWSkKKyAgICAgICAgICAgIHdoaWxlIChhdG9taWNfbG9hZF9leHBsaWNpdCgmcC0+c3RhdGUsIG1lbW9yeV9vcmRlcl9yZWxheGVkKSAhPSBTVEFURV9JTlBVVF9SRUFEWSkKICAgICAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcC0+b3V0cHV0X2NvbmQsICZwLT5wcm9ncmVzc19tdXRleCk7CiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOwogICAgICAgICB9CkBAIC00MzYsMjAgKzUyNiwxOSBAQAogICAgICAgICBhdl9mcmFtZV9tb3ZlX3JlZihwaWN0dXJlLCBwLT5mcmFtZSk7CiAgICAgICAgICpnb3RfcGljdHVyZV9wdHIgPSBwLT5nb3RfZnJhbWU7CiAgICAgICAgIHBpY3R1cmUtPnBrdF9kdHMgPSBwLT5hdnBrdC5kdHM7Ci0KLSAgICAgICAgaWYgKHAtPnJlc3VsdCA8IDApCi0gICAgICAgICAgICBlcnIgPSBwLT5yZXN1bHQ7CisgICAgICAgIGVyciA9IHAtPnJlc3VsdDsKIAogICAgICAgICAvKgogICAgICAgICAgKiBBIGxhdGVyIGNhbGwgd2l0aCBhdmtwdC0+c2l6ZSA9PSAwIG1heSBsb29wIG92ZXIgYWxsIHRocmVhZHMsCi0gICAgICAgICAqIGluY2x1ZGluZyB0aGlzIG9uZSwgc2VhcmNoaW5nIGZvciBhIGZyYW1lIHRvIHJldHVybiBiZWZvcmUgYmVpbmcKKyAgICAgICAgICogaW5jbHVkaW5nIHRoaXMgb25lLCBzZWFyY2hpbmcgZm9yIGEgZnJhbWUvZXJyb3IgdG8gcmV0dXJuIGJlZm9yZSBiZWluZwogICAgICAgICAgKiBzdG9wcGVkIGJ5IHRoZSAiZmluaXNoZWQgIT0gZmN0eC0+bmV4dF9maW5pc2hlZCIgY29uZGl0aW9uLgotICAgICAgICAgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgbWlzdGFrZW5seSByZXR1cm4gdGhlIHNhbWUgZnJhbWUgYWdhaW4uCisgICAgICAgICAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBtaXN0YWtlbmx5IHJldHVybiB0aGUgc2FtZSBmcmFtZS9lcnJvciBhZ2Fpbi4KICAgICAgICAgICovCiAgICAgICAgIHAtPmdvdF9mcmFtZSA9IDA7CisgICAgICAgIHAtPnJlc3VsdCA9IDA7CiAKICAgICAgICAgaWYgKGZpbmlzaGVkID49IGF2Y3R4LT50aHJlYWRfY291bnQpIGZpbmlzaGVkID0gMDsKLSAgICB9IHdoaWxlICghYXZwa3QtPnNpemUgJiYgISpnb3RfcGljdHVyZV9wdHIgJiYgZmluaXNoZWQgIT0gZmN0eC0+bmV4dF9maW5pc2hlZCk7CisgICAgfSB3aGlsZSAoIWF2cGt0LT5zaXplICYmICEqZ290X3BpY3R1cmVfcHRyICYmIGVyciA+PSAwICYmIGZpbmlzaGVkICE9IGZjdHgtPm5leHRfZmluaXNoZWQpOwogCiAgICAgdXBkYXRlX2NvbnRleHRfZnJvbV90aHJlYWQoYXZjdHgsIHAtPmF2Y3R4LCAxKTsKIApAQCAtNDU3LDMyICs1NDYsMzMgQEAKIAogICAgIGZjdHgtPm5leHRfZmluaXNoZWQgPSBmaW5pc2hlZDsKIAotICAgIC8qCi0gICAgICogV2hlbiBubyBmcmFtZSB3YXMgZm91bmQgd2hpbGUgZmx1c2hpbmcsIGJ1dCBhbiBlcnJvciBvY2N1cnJlZCBpbgotICAgICAqIGFueSB0aHJlYWQsIHJldHVybiBpdCBpbnN0ZWFkIG9mIDAuCi0gICAgICogT3RoZXJ3aXNlIHRoZSBlcnJvciBjYW4gZ2V0IGxvc3QuCi0gICAgICovCi0gICAgaWYgKCFhdnBrdC0+c2l6ZSAmJiAhKmdvdF9waWN0dXJlX3B0cikKLSAgICAgICAgcmV0dXJuIGVycjsKLQogICAgIC8qIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY29uc3VtZWQgcGFja2V0IGlmIG5vIGVycm9yIG9jY3VycmVkICovCi0gICAgcmV0dXJuIChwLT5yZXN1bHQgPj0gMCkgPyBhdnBrdC0+c2l6ZSA6IHAtPnJlc3VsdDsKKyAgICBpZiAoZXJyID49IDApCisgICAgICAgIGVyciA9IGF2cGt0LT5zaXplOworZmluaXNoOgorICAgIGFzeW5jX2xvY2soZmN0eCk7CisgICAgcmV0dXJuIGVycjsKIH0KIAogdm9pZCBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKFRocmVhZEZyYW1lICpmLCBpbnQgbiwgaW50IGZpZWxkKQogewogICAgIFBlclRocmVhZENvbnRleHQgKnA7Ci0gICAgdm9sYXRpbGUgaW50ICpwcm9ncmVzcyA9IGYtPnByb2dyZXNzID8gKGludCopZi0+cHJvZ3Jlc3MtPmRhdGEgOiBOVUxMOworICAgIGF0b21pY19pbnQgKnByb2dyZXNzID0gZi0+cHJvZ3Jlc3MgPyAoYXRvbWljX2ludCopZi0+cHJvZ3Jlc3MtPmRhdGEgOiBOVUxMOwogCi0gICAgaWYgKCFwcm9ncmVzcyB8fCBwcm9ncmVzc1tmaWVsZF0gPj0gbikgcmV0dXJuOworICAgIGlmICghcHJvZ3Jlc3MgfHwKKyAgICAgICAgYXRvbWljX2xvYWRfZXhwbGljaXQoJnByb2dyZXNzW2ZpZWxkXSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpID49IG4pCisgICAgICAgIHJldHVybjsKIAotICAgIHAgPSBmLT5vd25lci0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CisgICAgcCA9IGYtPm93bmVyW2ZpZWxkXS0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CiAKLSAgICBpZiAoZi0+b3duZXItPmRlYnVnJkZGX0RFQlVHX1RIUkVBRFMpCi0gICAgICAgIGF2X2xvZyhmLT5vd25lciwgQVZfTE9HX0RFQlVHLCAiJXAgZmluaXNoZWQgJWQgZmllbGQgJWRcbiIsIHByb2dyZXNzLCBuLCBmaWVsZCk7CisgICAgaWYgKGF0b21pY19sb2FkX2V4cGxpY2l0KCZwLT5kZWJ1Z190aHJlYWRzLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCkpCisgICAgICAgIGF2X2xvZyhmLT5vd25lcltmaWVsZF0sIEFWX0xPR19ERUJVRywKKyAgICAgICAgICAgICAgICIlcCBmaW5pc2hlZCAlZCBmaWVsZCAlZFxuIiwgcHJvZ3Jlc3MsIG4sIGZpZWxkKTsKIAogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOwotICAgIHByb2dyZXNzW2ZpZWxkXSA9IG47CisKKyAgICBhdG9taWNfc3RvcmVfZXhwbGljaXQoJnByb2dyZXNzW2ZpZWxkXSwgbiwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOworCiAgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmcC0+cHJvZ3Jlc3NfY29uZCk7CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnAtPnByb2dyZXNzX211dGV4KTsKIH0KQEAgLTQ5MCwxNyArNTgwLDIwIEBACiB2b2lkIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhUaHJlYWRGcmFtZSAqZiwgaW50IG4sIGludCBmaWVsZCkKIHsKICAgICBQZXJUaHJlYWRDb250ZXh0ICpwOwotICAgIHZvbGF0aWxlIGludCAqcHJvZ3Jlc3MgPSBmLT5wcm9ncmVzcyA/IChpbnQqKWYtPnByb2dyZXNzLT5kYXRhIDogTlVMTDsKKyAgICBhdG9taWNfaW50ICpwcm9ncmVzcyA9IGYtPnByb2dyZXNzID8gKGF0b21pY19pbnQqKWYtPnByb2dyZXNzLT5kYXRhIDogTlVMTDsKIAotICAgIGlmICghcHJvZ3Jlc3MgfHwgcHJvZ3Jlc3NbZmllbGRdID49IG4pIHJldHVybjsKKyAgICBpZiAoIXByb2dyZXNzIHx8CisgICAgICAgIGF0b21pY19sb2FkX2V4cGxpY2l0KCZwcm9ncmVzc1tmaWVsZF0sIG1lbW9yeV9vcmRlcl9hY3F1aXJlKSA+PSBuKQorICAgICAgICByZXR1cm47CiAKLSAgICBwID0gZi0+b3duZXItPmludGVybmFsLT50aHJlYWRfY3R4OworICAgIHAgPSBmLT5vd25lcltmaWVsZF0tPmludGVybmFsLT50aHJlYWRfY3R4OwogCi0gICAgaWYgKGYtPm93bmVyLT5kZWJ1ZyZGRl9ERUJVR19USFJFQURTKQotICAgICAgICBhdl9sb2coZi0+b3duZXIsIEFWX0xPR19ERUJVRywgInRocmVhZCBhd2FpdGluZyAlZCBmaWVsZCAlZCBmcm9tICVwXG4iLCBuLCBmaWVsZCwgcHJvZ3Jlc3MpOworICAgIGlmIChhdG9taWNfbG9hZF9leHBsaWNpdCgmcC0+ZGVidWdfdGhyZWFkcywgbWVtb3J5X29yZGVyX3JlbGF4ZWQpKQorICAgICAgICBhdl9sb2coZi0+b3duZXJbZmllbGRdLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAidGhyZWFkIGF3YWl0aW5nICVkIGZpZWxkICVkIGZyb20gJXBcbiIsIG4sIGZpZWxkLCBwcm9ncmVzcyk7CiAKICAgICBwdGhyZWFkX211dGV4X2xvY2soJnAtPnByb2dyZXNzX211dGV4KTsKLSAgICB3aGlsZSAocHJvZ3Jlc3NbZmllbGRdIDwgbikKKyAgICB3aGlsZSAoYXRvbWljX2xvYWRfZXhwbGljaXQoJnByb2dyZXNzW2ZpZWxkXSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpIDwgbikKICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnAtPnByb2dyZXNzX2NvbmQsICZwLT5wcm9ncmVzc19tdXRleCk7CiAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnAtPnByb2dyZXNzX211dGV4KTsKIH0KQEAgLTUxMCwxMiArNjAzLDI2IEBACiAKICAgICBpZiAoIShhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlJkZGX1RIUkVBRF9GUkFNRSkpIHJldHVybjsKIAotICAgIGlmKHAtPnN0YXRlID09IFNUQVRFX1NFVFVQX0ZJTklTSEVEKXsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIk11bHRpcGxlIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKSBjYWxsc1xuIik7CisgICAgaWYgKGF2Y3R4LT5od2FjY2VsICYmICFwLT5od2FjY2VsX3NlcmlhbGl6aW5nKSB7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+cGFyZW50LT5od2FjY2VsX211dGV4KTsKKyAgICAgICAgcC0+aHdhY2NlbF9zZXJpYWxpemluZyA9IDE7CisgICAgfQorCisgICAgLyogdGhpcyBhc3N1bWVzIHRoYXQgbm8gaHdhY2NlbCBjYWxscyBoYXBwZW4gYmVmb3JlIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKSAqLworICAgIGlmIChhdmN0eC0+aHdhY2NlbCAmJgorICAgICAgICAhKGF2Y3R4LT5od2FjY2VsLT5jYXBzX2ludGVybmFsICYgSFdBQ0NFTF9DQVBfQVNZTkNfU0FGRSkpIHsKKyAgICAgICAgcC0+YXN5bmNfc2VyaWFsaXppbmcgPSAxOworCisgICAgICAgIGFzeW5jX2xvY2socC0+cGFyZW50KTsKICAgICB9CiAKICAgICBwdGhyZWFkX211dGV4X2xvY2soJnAtPnByb2dyZXNzX211dGV4KTsKLSAgICBwLT5zdGF0ZSA9IFNUQVRFX1NFVFVQX0ZJTklTSEVEOworICAgIGlmKGF0b21pY19sb2FkKCZwLT5zdGF0ZSkgPT0gU1RBVEVfU0VUVVBfRklOSVNIRUQpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiTXVsdGlwbGUgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cCgpIGNhbGxzXG4iKTsKKyAgICB9CisKKyAgICBhdG9taWNfc3RvcmUoJnAtPnN0YXRlLCBTVEFURV9TRVRVUF9GSU5JU0hFRCk7CisKICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZwLT5wcm9ncmVzc19jb25kKTsKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcC0+cHJvZ3Jlc3NfbXV0ZXgpOwogfQpAQCAtNTI1LDE3ICs2MzIsMjEgQEAKIHsKICAgICBpbnQgaTsKIAorICAgIGFzeW5jX3VubG9jayhmY3R4KTsKKwogICAgIGZvciAoaSA9IDA7IGkgPCB0aHJlYWRfY291bnQ7IGkrKykgewogICAgICAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gJmZjdHgtPnRocmVhZHNbaV07CiAKLSAgICAgICAgaWYgKHAtPnN0YXRlICE9IFNUQVRFX0lOUFVUX1JFQURZKSB7CisgICAgICAgIGlmIChhdG9taWNfbG9hZCgmcC0+c3RhdGUpICE9IFNUQVRFX0lOUFVUX1JFQURZKSB7CiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnAtPnByb2dyZXNzX211dGV4KTsKLSAgICAgICAgICAgIHdoaWxlIChwLT5zdGF0ZSAhPSBTVEFURV9JTlBVVF9SRUFEWSkKKyAgICAgICAgICAgIHdoaWxlIChhdG9taWNfbG9hZCgmcC0+c3RhdGUpICE9IFNUQVRFX0lOUFVUX1JFQURZKQogICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZwLT5vdXRwdXRfY29uZCwgJnAtPnByb2dyZXNzX211dGV4KTsKICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7CiAgICAgICAgIH0KICAgICAgICAgcC0+Z290X2ZyYW1lID0gMDsKICAgICB9CisKKyAgICBhc3luY19sb2NrKGZjdHgpOwogfQogCiB2b2lkIGZmX2ZyYW1lX3RocmVhZF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHRocmVhZF9jb3VudCkKQEAgLTU1MywxMiArNjY0LDExIEBACiAgICAgICAgICAgICBmY3R4LT50aHJlYWRzLT5hdmN0eC0+aW50ZXJuYWwtPmlzX2NvcHkgPSAxOwogICAgICAgICB9CiAKLSAgICBmY3R4LT5kaWUgPSAxOwotCiAgICAgZm9yIChpID0gMDsgaSA8IHRocmVhZF9jb3VudDsgaSsrKSB7CiAgICAgICAgIFBlclRocmVhZENvbnRleHQgKnAgPSAmZmN0eC0+dGhyZWFkc1tpXTsKIAogICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnAtPm11dGV4KTsKKyAgICAgICAgcC0+ZGllID0gMTsKICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcC0+aW5wdXRfY29uZCk7CiAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZwLT5tdXRleCk7CiAKQEAgLTU4OSwxMyArNjk5LDIwIEBACiAgICAgICAgICAgICBhdl9mcmVlcCgmcC0+YXZjdHgtPnNsaWNlX29mZnNldCk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocC0+YXZjdHgpCisgICAgICAgIGlmIChwLT5hdmN0eCkgewogICAgICAgICAgICAgYXZfZnJlZXAoJnAtPmF2Y3R4LT5pbnRlcm5hbCk7CisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnAtPmF2Y3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgfQorCiAgICAgICAgIGF2X2ZyZWVwKCZwLT5hdmN0eCk7CiAgICAgfQogCiAgICAgYXZfZnJlZXAoJmZjdHgtPnRocmVhZHMpOwogICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmZmN0eC0+YnVmZmVyX211dGV4KTsKKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmZjdHgtPmh3YWNjZWxfbXV0ZXgpOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmZmN0eC0+YXN5bmNfbXV0ZXgpOworICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZmY3R4LT5hc3luY19jb25kKTsKKwogICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHgpOwogCiAgICAgaWYgKGF2Y3R4LT5wcml2X2RhdGEgJiYgYXZjdHgtPmNvZGVjICYmIGF2Y3R4LT5jb2RlYy0+cHJpdl9jbGFzcykKQEAgLTYxMSwxNCArNzI4LDEyIEBACiAgICAgRnJhbWVUaHJlYWRDb250ZXh0ICpmY3R4OwogICAgIGludCBpLCBlcnIgPSAwOwogCi0jaWYgSEFWRV9XMzJUSFJFQURTCi0gICAgdzMydGhyZWFkX2luaXQoKTsKLSNlbmRpZgotCiAgICAgaWYgKCF0aHJlYWRfY291bnQpIHsKICAgICAgICAgaW50IG5iX2NwdXMgPSBhdl9jcHVfY291bnQoKTsKKyNpZiBGRl9BUElfREVCVUdfTVYKICAgICAgICAgaWYgKChhdmN0eC0+ZGVidWcgJiAoRkZfREVCVUdfVklTX1FQIHwgRkZfREVCVUdfVklTX01CX1RZUEUpKSB8fCBhdmN0eC0+ZGVidWdfbXYpCiAgICAgICAgICAgICBuYl9jcHVzID0gMTsKKyNlbmRpZgogICAgICAgICAvLyB1c2UgbnVtYmVyIG9mIGNvcmVzICsgMSBhcyB0aHJlYWQgY291bnQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZQogICAgICAgICBpZiAobmJfY3B1cyA+IDEpCiAgICAgICAgICAgICB0aHJlYWRfY291bnQgPSBhdmN0eC0+dGhyZWFkX2NvdW50ID0gRkZNSU4obmJfY3B1cyArIDEsIE1BWF9BVVRPX1RIUkVBRFMpOwpAQCAtNjQyLDYgKzc1NywxMSBAQAogICAgIH0KIAogICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZmN0eC0+YnVmZmVyX211dGV4LCBOVUxMKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmZjdHgtPmh3YWNjZWxfbXV0ZXgsIE5VTEwpOworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmZmN0eC0+YXN5bmNfbXV0ZXgsIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZmY3R4LT5hc3luY19jb25kLCBOVUxMKTsKKworICAgIGZjdHgtPmFzeW5jX2xvY2sgPSAxOwogICAgIGZjdHgtPmRlbGF5aW5nID0gMTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCB0aHJlYWRfY291bnQ7IGkrKykgewpAQCAtNjc5LDcgKzc5OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgKmNvcHktPmludGVybmFsID0gKnNyYy0+aW50ZXJuYWw7CiAgICAgICAgIGNvcHktPmludGVybmFsLT50aHJlYWRfY3R4ID0gcDsKLSAgICAgICAgY29weS0+aW50ZXJuYWwtPnBrdCA9ICZwLT5hdnBrdDsKKyAgICAgICAgY29weS0+aW50ZXJuYWwtPmxhc3RfcGt0X3Byb3BzID0gJnAtPmF2cGt0OwogCiAgICAgICAgIGlmICghaSkgewogICAgICAgICAgICAgc3JjID0gY29weTsKQEAgLTcwMyw2ICs4MjMsOCBAQAogCiAgICAgICAgIGlmIChlcnIpIGdvdG8gZXJyb3I7CiAKKyAgICAgICAgYXRvbWljX2luaXQoJnAtPmRlYnVnX3RocmVhZHMsIChjb3B5LT5kZWJ1ZyAmIEZGX0RFQlVHX1RIUkVBRFMpICE9IDApOworCiAgICAgICAgIGVyciA9IEFWRVJST1IocHRocmVhZF9jcmVhdGUoJnAtPnRocmVhZCwgTlVMTCwgZnJhbWVfd29ya2VyX3RocmVhZCwgcCkpOwogICAgICAgICBwLT50aHJlYWRfaW5pdD0gIWVycjsKICAgICAgICAgaWYoIXAtPnRocmVhZF9pbml0KQpAQCAtNzM4LDYgKzg2MCw3IEBACiAgICAgICAgIC8vIE1ha2Ugc3VyZSBkZWNvZGUgZmx1c2ggY2FsbHMgd2l0aCBzaXplPTAgd29uJ3QgcmV0dXJuIG9sZCBmcmFtZXMKICAgICAgICAgcC0+Z290X2ZyYW1lID0gMDsKICAgICAgICAgYXZfZnJhbWVfdW5yZWYocC0+ZnJhbWUpOworICAgICAgICBwLT5yZXN1bHQgPSAwOwogCiAgICAgICAgIHJlbGVhc2VfZGVsYXllZF9idWZmZXJzKHApOwogCkBAIC03NDksNyArODcyLDcgQEAKIGludCBmZl90aHJlYWRfY2FuX3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBQZXJUaHJlYWRDb250ZXh0ICpwID0gYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4OwotICAgIGlmICgoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSZGRl9USFJFQURfRlJBTUUpICYmIHAtPnN0YXRlICE9IFNUQVRFX1NFVFRJTkdfVVAgJiYKKyAgICBpZiAoKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUmRkZfVEhSRUFEX0ZSQU1FKSAmJiBhdG9taWNfbG9hZCgmcC0+c3RhdGUpICE9IFNUQVRFX1NFVFRJTkdfVVAgJiYKICAgICAgICAgKGF2Y3R4LT5jb2RlYy0+dXBkYXRlX3RocmVhZF9jb250ZXh0IHx8ICFUSFJFQURfU0FGRV9DQUxMQkFDS1MoYXZjdHgpKSkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC03NjEsMjggKzg4NCwyNyBAQAogICAgIFBlclRocmVhZENvbnRleHQgKnAgPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7CiAgICAgaW50IGVycjsKIAotICAgIGYtPm93bmVyID0gYXZjdHg7Ci0KLSAgICBmZl9pbml0X2J1ZmZlcl9pbmZvKGF2Y3R4LCBmLT5mKTsKKyAgICBmLT5vd25lclswXSA9IGYtPm93bmVyWzFdID0gYXZjdHg7CiAKICAgICBpZiAoIShhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkKICAgICAgICAgcmV0dXJuIGZmX2dldF9idWZmZXIoYXZjdHgsIGYtPmYsIGZsYWdzKTsKIAotICAgIGlmIChwLT5zdGF0ZSAhPSBTVEFURV9TRVRUSU5HX1VQICYmCisgICAgaWYgKGF0b21pY19sb2FkKCZwLT5zdGF0ZSkgIT0gU1RBVEVfU0VUVElOR19VUCAmJgogICAgICAgICAoYXZjdHgtPmNvZGVjLT51cGRhdGVfdGhyZWFkX2NvbnRleHQgfHwgIVRIUkVBRF9TQUZFX0NBTExCQUNLUyhhdmN0eCkpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZ2V0X2J1ZmZlcigpIGNhbm5vdCBiZSBjYWxsZWQgYWZ0ZXIgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cCgpXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIGlmIChhdmN0eC0+aW50ZXJuYWwtPmFsbG9jYXRlX3Byb2dyZXNzKSB7Ci0gICAgICAgIGludCAqcHJvZ3Jlc3M7Ci0gICAgICAgIGYtPnByb2dyZXNzID0gYXZfYnVmZmVyX2FsbG9jKDIgKiBzaXplb2YoaW50KSk7CisgICAgICAgIGF0b21pY19pbnQgKnByb2dyZXNzOworICAgICAgICBmLT5wcm9ncmVzcyA9IGF2X2J1ZmZlcl9hbGxvYygyICogc2l6ZW9mKCpwcm9ncmVzcykpOwogICAgICAgICBpZiAoIWYtPnByb2dyZXNzKSB7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9Ci0gICAgICAgIHByb2dyZXNzID0gKGludCopZi0+cHJvZ3Jlc3MtPmRhdGE7CisgICAgICAgIHByb2dyZXNzID0gKGF0b21pY19pbnQqKWYtPnByb2dyZXNzLT5kYXRhOwogCi0gICAgICAgIHByb2dyZXNzWzBdID0gcHJvZ3Jlc3NbMV0gPSAtMTsKKyAgICAgICAgYXRvbWljX2luaXQoJnByb2dyZXNzWzBdLCAtMSk7CisgICAgICAgIGF0b21pY19pbml0KCZwcm9ncmVzc1sxXSwgLTEpOwogICAgIH0KIAogICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcC0+cGFyZW50LT5idWZmZXJfbXV0ZXgpOwpAQCAtNzkzLDEwICs5MTUsMTAgQEAKICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7CiAgICAgICAgIHAtPnJlcXVlc3RlZF9mcmFtZSA9IGYtPmY7CiAgICAgICAgIHAtPnJlcXVlc3RlZF9mbGFncyA9IGZsYWdzOwotICAgICAgICBwLT5zdGF0ZSA9IFNUQVRFX0dFVF9CVUZGRVI7CisgICAgICAgIGF0b21pY19zdG9yZV9leHBsaWNpdCgmcC0+c3RhdGUsIFNUQVRFX0dFVF9CVUZGRVIsIG1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKICAgICAgICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmcC0+cHJvZ3Jlc3NfY29uZCk7CiAKLSAgICAgICAgd2hpbGUgKHAtPnN0YXRlICE9IFNUQVRFX1NFVFRJTkdfVVApCisgICAgICAgIHdoaWxlIChhdG9taWNfbG9hZCgmcC0+c3RhdGUpICE9IFNUQVRFX1NFVFRJTkdfVVApCiAgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmcC0+cHJvZ3Jlc3NfY29uZCwgJnAtPnByb2dyZXNzX211dGV4KTsKIAogICAgICAgICBlcnIgPSBwLT5yZXN1bHQ7CkBAIC04MjEsMTYgKzk0MywxNiBAQAogICAgIGlmICghKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpIHx8IGF2Y3R4LT50aHJlYWRfc2FmZV9jYWxsYmFja3MgfHwKICAgICAgICAgYXZjdHgtPmdldF9mb3JtYXQgPT0gYXZjb2RlY19kZWZhdWx0X2dldF9mb3JtYXQpCiAgICAgICAgIHJldHVybiBmZl9nZXRfZm9ybWF0KGF2Y3R4LCBmbXQpOwotICAgIGlmIChwLT5zdGF0ZSAhPSBTVEFURV9TRVRUSU5HX1VQKSB7CisgICAgaWYgKGF0b21pY19sb2FkKCZwLT5zdGF0ZSkgIT0gU1RBVEVfU0VUVElOR19VUCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImdldF9mb3JtYXQoKSBjYW5ub3QgYmUgY2FsbGVkIGFmdGVyIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoKVxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZwLT5wcm9ncmVzc19tdXRleCk7CiAgICAgcC0+YXZhaWxhYmxlX2Zvcm1hdHMgPSBmbXQ7Ci0gICAgcC0+c3RhdGUgPSBTVEFURV9HRVRfRk9STUFUOworICAgIGF0b21pY19zdG9yZSgmcC0+c3RhdGUsIFNUQVRFX0dFVF9GT1JNQVQpOwogICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnAtPnByb2dyZXNzX2NvbmQpOwogCi0gICAgd2hpbGUgKHAtPnN0YXRlICE9IFNUQVRFX1NFVFRJTkdfVVApCisgICAgd2hpbGUgKGF0b21pY19sb2FkKCZwLT5zdGF0ZSkgIT0gU1RBVEVfU0VUVElOR19VUCkKICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnAtPnByb2dyZXNzX2NvbmQsICZwLT5wcm9ncmVzc19tdXRleCk7CiAKICAgICByZXMgPSBwLT5yZXN1bHRfZm9ybWF0OwpAQCAtODY0LDcgKzk4Niw3IEBACiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAidGhyZWFkX3JlbGVhc2VfYnVmZmVyIGNhbGxlZCBvbiBwaWMgJXBcbiIsIGYpOwogCiAgICAgYXZfYnVmZmVyX3VucmVmKCZmLT5wcm9ncmVzcyk7Ci0gICAgZi0+b3duZXIgICAgPSBOVUxMOworICAgIGYtPm93bmVyWzBdID0gZi0+b3duZXJbMV0gPSBOVUxMOwogCiAgICAgaWYgKGNhbl9kaXJlY3RfZnJlZSkgewogICAgICAgICBhdl9mcmFtZV91bnJlZihmLT5mKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcHRocmVhZF9pbnRlcm5hbC5oIGIvbGliYXZjb2RlYy9wdGhyZWFkX2ludGVybmFsLmgKaW5kZXggNmEyZjM3OC4uZDIxMTVjYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wdGhyZWFkX2ludGVybmFsLmgKKysrIGIvbGliYXZjb2RlYy9wdGhyZWFkX2ludGVybmFsLmgKQEAgLTIxLDcgKzIxLDcgQEAKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKIAotLyogSDI2NCBzbGljZSB0aHJlYWRpbmcgc2VlbXMgdG8gYmUgYnVnZ3kgd2l0aCBtb3JlIHRoYW4gMTYgdGhyZWFkcywKKy8qIEguMjY0IHNsaWNlIHRocmVhZGluZyBzZWVtcyB0byBiZSBidWdneSB3aXRoIG1vcmUgdGhhbiAxNiB0aHJlYWRzLAogICogbGltaXQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIDE2IGZvciBhdXRvbWF0aWMgZGV0ZWN0aW9uICovCiAjZGVmaW5lIE1BWF9BVVRPX1RIUkVBRFMgMTYKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9wdGhyZWFkX3NsaWNlLmMgYi9saWJhdmNvZGVjL3B0aHJlYWRfc2xpY2UuYwppbmRleCA5NmE3NjQzLi43N2NmZTNjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3B0aHJlYWRfc2xpY2UuYworKysgYi9saWJhdmNvZGVjL3B0aHJlYWRfc2xpY2UuYwpAQCAtMzQsMjYgKzM0LDIxIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NsaWNldGhyZWFkLmgiCiAKIHR5cGVkZWYgaW50IChhY3Rpb25fZnVuYykoQVZDb2RlY0NvbnRleHQgKmMsIHZvaWQgKmFyZyk7CiB0eXBlZGVmIGludCAoYWN0aW9uX2Z1bmMyKShBVkNvZGVjQ29udGV4dCAqYywgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCB0aHJlYWRucik7Cit0eXBlZGVmIGludCAobWFpbl9mdW5jKShBVkNvZGVjQ29udGV4dCAqYyk7CiAKIHR5cGVkZWYgc3RydWN0IFNsaWNlVGhyZWFkQ29udGV4dCB7Ci0gICAgcHRocmVhZF90ICp3b3JrZXJzOworICAgIEFWU2xpY2VUaHJlYWQgKnRocmVhZDsKICAgICBhY3Rpb25fZnVuYyAqZnVuYzsKICAgICBhY3Rpb25fZnVuYzIgKmZ1bmMyOworICAgIG1haW5fZnVuYyAqbWFpbmZ1bmM7CiAgICAgdm9pZCAqYXJnczsKICAgICBpbnQgKnJldHM7Ci0gICAgaW50IGpvYl9jb3VudDsKICAgICBpbnQgam9iX3NpemU7CiAKLSAgICBwdGhyZWFkX2NvbmRfdCBsYXN0X2pvYl9jb25kOwotICAgIHB0aHJlYWRfY29uZF90IGN1cnJlbnRfam9iX2NvbmQ7Ci0gICAgcHRocmVhZF9tdXRleF90IGN1cnJlbnRfam9iX2xvY2s7Ci0gICAgdW5zaWduZWQgY3VycmVudF9leGVjdXRlOwotICAgIGludCBjdXJyZW50X2pvYjsKLSAgICBpbnQgZG9uZTsKLQogICAgIGludCAqZW50cmllczsKICAgICBpbnQgZW50cmllc19jb3VudDsKICAgICBpbnQgdGhyZWFkX2NvdW50OwpAQCAtNjEsNDMgKzU2LDIyIEBACiAgICAgcHRocmVhZF9tdXRleF90ICpwcm9ncmVzc19tdXRleDsKIH0gU2xpY2VUaHJlYWRDb250ZXh0OwogCi1zdGF0aWMgdm9pZCogYXR0cmlidXRlX2FsaWduX2FyZyB3b3JrZXIodm9pZCAqdikKLXsKLSAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSB2Oworc3RhdGljIHZvaWQgbWFpbl9mdW5jdGlvbih2b2lkICpwcml2KSB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcHJpdjsKICAgICBTbGljZVRocmVhZENvbnRleHQgKmMgPSBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHg7Ci0gICAgdW5zaWduZWQgbGFzdF9leGVjdXRlID0gMDsKLSAgICBpbnQgb3VyX2pvYiA9IGMtPmpvYl9jb3VudDsKLSAgICBpbnQgdGhyZWFkX2NvdW50ID0gYXZjdHgtPnRocmVhZF9jb3VudDsKLSAgICBpbnQgc2VsZl9pZDsKKyAgICBjLT5tYWluZnVuYyhhdmN0eCk7Cit9CiAKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOwotICAgIHNlbGZfaWQgPSBjLT5jdXJyZW50X2pvYisrOwotICAgIGZvciAoOzspewotICAgICAgICBpbnQgcmV0OwotICAgICAgICB3aGlsZSAob3VyX2pvYiA+PSBjLT5qb2JfY291bnQpIHsKLSAgICAgICAgICAgIGlmIChjLT5jdXJyZW50X2pvYiA9PSB0aHJlYWRfY291bnQgKyBjLT5qb2JfY291bnQpCi0gICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmYy0+bGFzdF9qb2JfY29uZCk7CitzdGF0aWMgdm9pZCB3b3JrZXJfZnVuYyh2b2lkICpwcml2LCBpbnQgam9ibnIsIGludCB0aHJlYWRuciwgaW50IG5iX2pvYnMsIGludCBuYl90aHJlYWRzKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHByaXY7CisgICAgU2xpY2VUaHJlYWRDb250ZXh0ICpjID0gYXZjdHgtPmludGVybmFsLT50aHJlYWRfY3R4OworICAgIGludCByZXQ7CiAKLSAgICAgICAgICAgIHdoaWxlIChsYXN0X2V4ZWN1dGUgPT0gYy0+Y3VycmVudF9leGVjdXRlICYmICFjLT5kb25lKQotICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZjLT5jdXJyZW50X2pvYl9jb25kLCAmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0gICAgICAgICAgICBsYXN0X2V4ZWN1dGUgPSBjLT5jdXJyZW50X2V4ZWN1dGU7Ci0gICAgICAgICAgICBvdXJfam9iID0gc2VsZl9pZDsKLQotICAgICAgICAgICAgaWYgKGMtPmRvbmUpIHsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOwotCi0gICAgICAgIHJldCA9IGMtPmZ1bmMgPyBjLT5mdW5jKGF2Y3R4LCAoY2hhciopYy0+YXJncyArIG91cl9qb2IqYy0+am9iX3NpemUpOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5mdW5jMihhdmN0eCwgYy0+YXJncywgb3VyX2pvYiwgc2VsZl9pZCk7Ci0gICAgICAgIGlmIChjLT5yZXRzKQotICAgICAgICAgICAgYy0+cmV0c1tvdXJfam9iJWMtPmpvYl9jb3VudF0gPSByZXQ7Ci0KLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKLSAgICAgICAgb3VyX2pvYiA9IGMtPmN1cnJlbnRfam9iKys7Ci0gICAgfQorICAgIHJldCA9IGMtPmZ1bmMgPyBjLT5mdW5jKGF2Y3R4LCAoY2hhciAqKWMtPmFyZ3MgKyBjLT5qb2Jfc2l6ZSAqIGpvYm5yKQorICAgICAgICAgICAgICAgICAgOiBjLT5mdW5jMihhdmN0eCwgYy0+YXJncywgam9ibnIsIHRocmVhZG5yKTsKKyAgICBpZiAoYy0+cmV0cykKKyAgICAgICAgYy0+cmV0c1tqb2Jucl0gPSByZXQ7CiB9CiAKIHZvaWQgZmZfc2xpY2VfdGhyZWFkX2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQpAQCAtMTA1LDQwICs3OSwxOSBAQAogICAgIFNsaWNlVGhyZWFkQ29udGV4dCAqYyA9IGF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eDsKICAgICBpbnQgaTsKIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0gICAgYy0+ZG9uZSA9IDE7Ci0gICAgcHRocmVhZF9jb25kX2Jyb2FkY2FzdCgmYy0+Y3VycmVudF9qb2JfY29uZCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGMtPnRocmVhZF9jb3VudDsgaSsrKQotICAgICAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjLT5wcm9ncmVzc19jb25kW2ldKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0KLSAgICBmb3IgKGk9MDsgaTxhdmN0eC0+dGhyZWFkX2NvdW50OyBpKyspCi0gICAgICAgICBwdGhyZWFkX2pvaW4oYy0+d29ya2Vyc1tpXSwgTlVMTCk7CisgICAgYXZwcml2X3NsaWNldGhyZWFkX2ZyZWUoJmMtPnRocmVhZCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dGhyZWFkX2NvdW50OyBpKyspIHsKICAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZjLT5wcm9ncmVzc19tdXRleFtpXSk7CiAgICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjLT5wcm9ncmVzc19jb25kW2ldKTsKICAgICB9CiAKLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmMtPmN1cnJlbnRfam9iX2xvY2spOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjLT5jdXJyZW50X2pvYl9jb25kKTsKLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmYy0+bGFzdF9qb2JfY29uZCk7Ci0KICAgICBhdl9mcmVlcCgmYy0+ZW50cmllcyk7CiAgICAgYXZfZnJlZXAoJmMtPnByb2dyZXNzX211dGV4KTsKICAgICBhdl9mcmVlcCgmYy0+cHJvZ3Jlc3NfY29uZCk7Ci0KLSAgICBhdl9mcmVlcCgmYy0+d29ya2Vycyk7CiAgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eCk7CiB9CiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgdGhyZWFkX3Bhcmtfd29ya2VycyhTbGljZVRocmVhZENvbnRleHQgKmMsIGludCB0aHJlYWRfY291bnQpCi17Ci0gICAgd2hpbGUgKGMtPmN1cnJlbnRfam9iICE9IHRocmVhZF9jb3VudCArIGMtPmpvYl9jb3VudCkKLSAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmMtPmxhc3Rfam9iX2NvbmQsICZjLT5jdXJyZW50X2pvYl9sb2NrKTsKLSAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci19Ci0KIHN0YXRpYyBpbnQgdGhyZWFkX2V4ZWN1dGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBhY3Rpb25fZnVuYyogZnVuYywgdm9pZCAqYXJnLCBpbnQgKnJldCwgaW50IGpvYl9jb3VudCwgaW50IGpvYl9zaXplKQogewogICAgIFNsaWNlVGhyZWFkQ29udGV4dCAqYyA9IGF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eDsKQEAgLTE0OSwyMyArMTAyLDEyIEBACiAgICAgaWYgKGpvYl9jb3VudCA8PSAwKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0KLSAgICBjLT5jdXJyZW50X2pvYiA9IGF2Y3R4LT50aHJlYWRfY291bnQ7Ci0gICAgYy0+am9iX2NvdW50ID0gam9iX2NvdW50OwogICAgIGMtPmpvYl9zaXplID0gam9iX3NpemU7CiAgICAgYy0+YXJncyA9IGFyZzsKICAgICBjLT5mdW5jID0gZnVuYzsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIGMtPnJldHMgPSByZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYy0+cmV0cyA9IE5VTEw7Ci0gICAgfQotICAgIGMtPmN1cnJlbnRfZXhlY3V0ZSsrOwotICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmMtPmN1cnJlbnRfam9iX2NvbmQpOworICAgIGMtPnJldHMgPSByZXQ7CiAKLSAgICB0aHJlYWRfcGFya193b3JrZXJzKGMsIGF2Y3R4LT50aHJlYWRfY291bnQpOwotCisgICAgYXZwcml2X3NsaWNldGhyZWFkX2V4ZWN1dGUoYy0+dGhyZWFkLCBqb2JfY291bnQsICEhYy0+bWFpbmZ1bmMgICk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE3NiwxNSArMTE4LDE5IEBACiAgICAgcmV0dXJuIHRocmVhZF9leGVjdXRlKGF2Y3R4LCBOVUxMLCBhcmcsIHJldCwgam9iX2NvdW50LCAwKTsKIH0KIAoraW50IGZmX3NsaWNlX3RocmVhZF9leGVjdXRlX3dpdGhfbWFpbmZ1bmMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBhY3Rpb25fZnVuYzIqIGZ1bmMyLCBtYWluX2Z1bmMgKm1haW5mdW5jLCB2b2lkICphcmcsIGludCAqcmV0LCBpbnQgam9iX2NvdW50KQoreworICAgIFNsaWNlVGhyZWFkQ29udGV4dCAqYyA9IGF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eDsKKyAgICBjLT5mdW5jMiA9IGZ1bmMyOworICAgIGMtPm1haW5mdW5jID0gbWFpbmZ1bmM7CisgICAgcmV0dXJuIHRocmVhZF9leGVjdXRlKGF2Y3R4LCBOVUxMLCBhcmcsIHJldCwgam9iX2NvdW50LCAwKTsKK30KKwogaW50IGZmX3NsaWNlX3RocmVhZF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKLSAgICBpbnQgaTsKICAgICBTbGljZVRocmVhZENvbnRleHQgKmM7CiAgICAgaW50IHRocmVhZF9jb3VudCA9IGF2Y3R4LT50aHJlYWRfY291bnQ7Ci0KLSNpZiBIQVZFX1czMlRIUkVBRFMKLSAgICB3MzJ0aHJlYWRfaW5pdCgpOwotI2VuZGlmCisgICAgc3RhdGljIHZvaWQgKCptYWluZnVuYykodm9pZCAqKTsKIAogICAgIC8vIFdlIGNhbm5vdCBkbyB0aGlzIGluIHRoZSBlbmNvZGVyIGluaXQgYXMgdGhlIHRocmVhZHMgYXJlIGNyZWF0ZWQgYmVmb3JlCiAgICAgaWYgKGF2X2NvZGVjX2lzX2VuY29kZXIoYXZjdHgtPmNvZGVjKSAmJgpAQCAtMjA4LDM1ICsxNTQsMTcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgYyA9IGF2X21hbGxvY3ooc2l6ZW9mKFNsaWNlVGhyZWFkQ29udGV4dCkpOwotICAgIGlmICghYykKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgYy0+d29ya2VycyA9IGF2X21hbGxvY3pfYXJyYXkodGhyZWFkX2NvdW50LCBzaXplb2YocHRocmVhZF90KSk7Ci0gICAgaWYgKCFjLT53b3JrZXJzKSB7Ci0gICAgICAgIGF2X2ZyZWUoYyk7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICBhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHggPSBjID0gYXZfbWFsbG9jeihzaXplb2YoKmMpKTsKKyAgICBtYWluZnVuYyA9IGF2Y3R4LT5jb2RlYy0+Y2Fwc19pbnRlcm5hbCAmIEZGX0NPREVDX0NBUF9TTElDRV9USFJFQURfSEFTX01GID8gJm1haW5fZnVuY3Rpb24gOiBOVUxMOworICAgIGlmICghYyB8fCAodGhyZWFkX2NvdW50ID0gYXZwcml2X3NsaWNldGhyZWFkX2NyZWF0ZSgmYy0+dGhyZWFkLCBhdmN0eCwgd29ya2VyX2Z1bmMsIG1haW5mdW5jLCB0aHJlYWRfY291bnQpKSA8PSAxKSB7CisgICAgICAgIGlmIChjKQorICAgICAgICAgICAgYXZwcml2X3NsaWNldGhyZWFkX2ZyZWUoJmMtPnRocmVhZCk7CisgICAgICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwtPnRocmVhZF9jdHgpOworICAgICAgICBhdmN0eC0+dGhyZWFkX2NvdW50ID0gMTsKKyAgICAgICAgYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9IDA7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLQotICAgIGF2Y3R4LT5pbnRlcm5hbC0+dGhyZWFkX2N0eCA9IGM7Ci0gICAgYy0+Y3VycmVudF9qb2IgPSAwOwotICAgIGMtPmpvYl9jb3VudCA9IDA7Ci0gICAgYy0+am9iX3NpemUgPSAwOwotICAgIGMtPmRvbmUgPSAwOwotICAgIHB0aHJlYWRfY29uZF9pbml0KCZjLT5jdXJyZW50X2pvYl9jb25kLCBOVUxMKTsKLSAgICBwdGhyZWFkX2NvbmRfaW5pdCgmYy0+bGFzdF9qb2JfY29uZCwgTlVMTCk7Ci0gICAgcHRocmVhZF9tdXRleF9pbml0KCZjLT5jdXJyZW50X2pvYl9sb2NrLCBOVUxMKTsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOwotICAgIGZvciAoaT0wOyBpPHRocmVhZF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmKHB0aHJlYWRfY3JlYXRlKCZjLT53b3JrZXJzW2ldLCBOVUxMLCB3b3JrZXIsIGF2Y3R4KSkgewotICAgICAgICAgICBhdmN0eC0+dGhyZWFkX2NvdW50ID0gaTsKLSAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOwotICAgICAgICAgICBmZl90aHJlYWRfZnJlZShhdmN0eCk7Ci0gICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRocmVhZF9wYXJrX3dvcmtlcnMoYywgdGhyZWFkX2NvdW50KTsKKyAgICBhdmN0eC0+dGhyZWFkX2NvdW50ID0gdGhyZWFkX2NvdW50OwogCiAgICAgYXZjdHgtPmV4ZWN1dGUgPSB0aHJlYWRfZXhlY3V0ZTsKICAgICBhdmN0eC0+ZXhlY3V0ZTIgPSB0aHJlYWRfZXhlY3V0ZTI7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3B1dF9iaXRzLmggYi9saWJhdmNvZGVjL3B1dF9iaXRzLmgKaW5kZXggNjhlZDM5MS4uMWNlYjFjYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9wdXRfYml0cy5oCisrKyBiL2xpYmF2Y29kZWMvcHV0X2JpdHMuaApAQCAtMTE5LDYgKzExOSwxOCBAQAogICAgIHMtPmJpdF9idWYgID0gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3B1dF9iaXRzX2xlKFB1dEJpdENvbnRleHQgKnMpCit7CisgICAgd2hpbGUgKHMtPmJpdF9sZWZ0IDwgMzIpIHsKKyAgICAgICAgYXZfYXNzZXJ0MChzLT5idWZfcHRyIDwgcy0+YnVmX2VuZCk7CisgICAgICAgICpzLT5idWZfcHRyKysgPSBzLT5iaXRfYnVmOworICAgICAgICBzLT5iaXRfYnVmICA+Pj0gODsKKyAgICAgICAgcy0+Yml0X2xlZnQgICs9IDg7CisgICAgfQorICAgIHMtPmJpdF9sZWZ0ID0gMzI7CisgICAgcy0+Yml0X2J1ZiAgPSAwOworfQorCiAjaWZkZWYgQklUU1RSRUFNX1dSSVRFUl9MRQogI2RlZmluZSBhdnByaXZfYWxpZ25fcHV0X2JpdHMgYWxpZ25fcHV0X2JpdHNfdW5zdXBwb3J0ZWRfaGVyZQogI2RlZmluZSBhdnByaXZfcHV0X3N0cmluZyBmZl9wdXRfc3RyaW5nX3Vuc3VwcG9ydGVkX2hlcmUKQEAgLTE5Nyw2ICsyMDksMzQgQEAKICAgICBzLT5iaXRfbGVmdCA9IGJpdF9sZWZ0OwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2JpdHNfbGUoUHV0Qml0Q29udGV4dCAqcywgaW50IG4sIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgYml0X2J1ZjsKKyAgICBpbnQgYml0X2xlZnQ7CisKKyAgICBhdl9hc3NlcnQyKG4gPD0gMzEgJiYgdmFsdWUgPCAoMVUgPDwgbikpOworCisgICAgYml0X2J1ZiAgPSBzLT5iaXRfYnVmOworICAgIGJpdF9sZWZ0ID0gcy0+Yml0X2xlZnQ7CisKKyAgICBiaXRfYnVmIHw9IHZhbHVlIDw8ICgzMiAtIGJpdF9sZWZ0KTsKKyAgICBpZiAobiA+PSBiaXRfbGVmdCkgeworICAgICAgICBpZiAoMyA8IHMtPmJ1Zl9lbmQgLSBzLT5idWZfcHRyKSB7CisgICAgICAgICAgICBBVl9XTDMyKHMtPmJ1Zl9wdHIsIGJpdF9idWYpOworICAgICAgICAgICAgcy0+YnVmX3B0ciArPSA0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludGVybmFsIGVycm9yLCBwdXRfYml0cyBidWZmZXIgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoMCk7CisgICAgICAgIH0KKyAgICAgICAgYml0X2J1ZiAgICAgPSB2YWx1ZSA+PiBiaXRfbGVmdDsKKyAgICAgICAgYml0X2xlZnQgICArPSAzMjsKKyAgICB9CisgICAgYml0X2xlZnQgLT0gbjsKKworICAgIHMtPmJpdF9idWYgID0gYml0X2J1ZjsKKyAgICBzLT5iaXRfbGVmdCA9IGJpdF9sZWZ0OworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3NiaXRzKFB1dEJpdENvbnRleHQgKnBiLCBpbnQgbiwgaW50MzJfdCB2YWx1ZSkKIHsKICAgICBhdl9hc3NlcnQyKG4gPj0gMCAmJiBuIDw9IDMxKTsKQEAgLTIwOSwxNSArMjQ5LDcyIEBACiAgKi8KIHN0YXRpYyB2b2lkIGF2X3VudXNlZCBwdXRfYml0czMyKFB1dEJpdENvbnRleHQgKnMsIHVpbnQzMl90IHZhbHVlKQogewotICAgIGludCBsbyA9IHZhbHVlICYgMHhmZmZmOwotICAgIGludCBoaSA9IHZhbHVlID4+IDE2OworICAgIHVuc2lnbmVkIGludCBiaXRfYnVmOworICAgIGludCBiaXRfbGVmdDsKKworICAgIGJpdF9idWYgID0gcy0+Yml0X2J1ZjsKKyAgICBiaXRfbGVmdCA9IHMtPmJpdF9sZWZ0OworCiAjaWZkZWYgQklUU1RSRUFNX1dSSVRFUl9MRQotICAgIHB1dF9iaXRzKHMsIDE2LCBsbyk7Ci0gICAgcHV0X2JpdHMocywgMTYsIGhpKTsKKyAgICBiaXRfYnVmIHw9IHZhbHVlIDw8ICgzMiAtIGJpdF9sZWZ0KTsKKyAgICBpZiAoMyA8IHMtPmJ1Zl9lbmQgLSBzLT5idWZfcHRyKSB7CisgICAgICAgIEFWX1dMMzIocy0+YnVmX3B0ciwgYml0X2J1Zik7CisgICAgICAgIHMtPmJ1Zl9wdHIgKz0gNDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW50ZXJuYWwgZXJyb3IsIHB1dF9iaXRzIGJ1ZmZlciB0b28gc21hbGxcbiIpOworICAgICAgICBhdl9hc3NlcnQyKDApOworICAgIH0KKyAgICBiaXRfYnVmICAgICA9ICh1aW50NjRfdCl2YWx1ZSA+PiBiaXRfbGVmdDsKICNlbHNlCi0gICAgcHV0X2JpdHMocywgMTYsIGhpKTsKLSAgICBwdXRfYml0cyhzLCAxNiwgbG8pOworICAgIGJpdF9idWYgICAgID0gKHVpbnQ2NF90KWJpdF9idWYgPDwgYml0X2xlZnQ7CisgICAgYml0X2J1ZiAgICB8PSB2YWx1ZSA+PiAoMzIgLSBiaXRfbGVmdCk7CisgICAgaWYgKDMgPCBzLT5idWZfZW5kIC0gcy0+YnVmX3B0cikgeworICAgICAgICBBVl9XQjMyKHMtPmJ1Zl9wdHIsIGJpdF9idWYpOworICAgICAgICBzLT5idWZfcHRyICs9IDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludGVybmFsIGVycm9yLCBwdXRfYml0cyBidWZmZXIgdG9vIHNtYWxsXG4iKTsKKyAgICAgICAgYXZfYXNzZXJ0MigwKTsKKyAgICB9CisgICAgYml0X2J1ZiAgICAgPSB2YWx1ZTsKICNlbmRpZgorCisgICAgcy0+Yml0X2J1ZiAgPSBiaXRfYnVmOworICAgIHMtPmJpdF9sZWZ0ID0gYml0X2xlZnQ7Cit9CisKKy8qKgorICogV3JpdGUgdXAgdG8gNjQgYml0cyBpbnRvIGEgYml0c3RyZWFtLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2JpdHM2NChQdXRCaXRDb250ZXh0ICpzLCBpbnQgbiwgdWludDY0X3QgdmFsdWUpCit7CisgICAgYXZfYXNzZXJ0MigobiA9PSA2NCkgfHwgKG4gPCA2NCAmJiB2YWx1ZSA8IChVSU5UNjRfQygxKSA8PCBuKSkpOworCisgICAgaWYgKG4gPCAzMikKKyAgICAgICAgcHV0X2JpdHMocywgbiwgdmFsdWUpOworICAgIGVsc2UgaWYgKG4gPT0gMzIpCisgICAgICAgIHB1dF9iaXRzMzIocywgdmFsdWUpOworICAgIGVsc2UgaWYgKG4gPCA2NCkgeworICAgICAgICB1aW50MzJfdCBsbyA9IHZhbHVlICYgMHhmZmZmZmZmZjsKKyAgICAgICAgdWludDMyX3QgaGkgPSB2YWx1ZSA+PiAzMjsKKyNpZmRlZiBCSVRTVFJFQU1fV1JJVEVSX0xFCisgICAgICAgIHB1dF9iaXRzMzIocywgbG8pOworICAgICAgICBwdXRfYml0cyhzLCBuIC0gMzIsIGhpKTsKKyNlbHNlCisgICAgICAgIHB1dF9iaXRzKHMsIG4gLSAzMiwgaGkpOworICAgICAgICBwdXRfYml0czMyKHMsIGxvKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IGxvID0gdmFsdWUgJiAweGZmZmZmZmZmOworICAgICAgICB1aW50MzJfdCBoaSA9IHZhbHVlID4+IDMyOworI2lmZGVmIEJJVFNUUkVBTV9XUklURVJfTEUKKyAgICAgICAgcHV0X2JpdHMzMihzLCBsbyk7CisgICAgICAgIHB1dF9iaXRzMzIocywgaGkpOworI2Vsc2UKKyAgICAgICAgcHV0X2JpdHMzMihzLCBoaSk7CisgICAgICAgIHB1dF9iaXRzMzIocywgbG8pOworI2VuZGlmCisKKyAgICB9CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xY2VscGRlYy5jIGIvbGliYXZjb2RlYy9xY2VscGRlYy5jCmluZGV4IGFkYjNlODIuLmI0YWZkYTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcWNlbHBkZWMuYworKysgYi9saWJhdmNvZGVjL3FjZWxwZGVjLmMKQEAgLTYwMyw3ICs2MDMsNyBAQAogICoKICAqIEBwYXJhbSBhdmN0eCB0aGUgQVYgY29kZWMgY29udGV4dAogICogQHBhcmFtIGJ1Zl9zaXplIGxlbmd0aCBvZiB0aGUgYnVmZmVyCi0gKiBAcGFyYW0gYnVmIHRoZSBidWZmZmVyCisgKiBAcGFyYW0gYnVmIHRoZSBidWZmZXIKICAqCiAgKiBAcmV0dXJuIHRoZSBiaXRyYXRlIG9uIHN1Y2Nlc3MsCiAgKiAgICAgICAgIElfRl9RICBpZiB0aGUgYml0cmF0ZSBjYW5ub3QgYmUgc2F0aXNmYWN0b3JpbHkgZGV0ZXJtaW5lZApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xZG0yLmMgYi9saWJhdmNvZGVjL3FkbTIuYwppbmRleCAwYjZkY2Q2Li44OGI2YjE5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3FkbTIuYworKysgYi9saWJhdmNvZGVjL3FkbTIuYwpAQCAtMzUsMTQgKzM1LDE2IEBACiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgInJkZnQuaCIKLSNpbmNsdWRlICJtcGVnYXVkaW9kc3AuaCIKICNpbmNsdWRlICJtcGVnYXVkaW8uaCIKKyNpbmNsdWRlICJtcGVnYXVkaW9kc3AuaCIKKyNpbmNsdWRlICJyZGZ0LmgiCiAKICNpbmNsdWRlICJxZG0yX3RhYmxlZ2VuLmgiCiAKQEAgLTIzNSw3ICsyMzcsNyBAQAogLyoqCiAgKiBRRE0yIGNoZWNrc3VtCiAgKgotICogQHBhcmFtIGRhdGEgICAgICBwb2ludGVyIHRvIGRhdGEgdG8gYmUgY2hlY2tzdW0nZWQKKyAqIEBwYXJhbSBkYXRhICAgICAgcG9pbnRlciB0byBkYXRhIHRvIGJlIGNoZWNrc3VtbWVkCiAgKiBAcGFyYW0gbGVuZ3RoICAgIGRhdGEgbGVuZ3RoCiAgKiBAcGFyYW0gdmFsdWUgICAgIGNoZWNrc3VtIHZhbHVlCiAgKgpAQCAtNTM2LDcgKzUzOCw3IEBACiAgICAgICAgIC8qIFRoaXMgY2FzZSBpcyB1bnRlc3RlZCwgbm8gc2FtcGxlcyBhdmFpbGFibGUgKi8KICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKE5VTEwsICIhc3VwZXJibG9ja3R5cGVfMl8zIik7CiAgICAgICAgIHJldHVybjsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbmJfY2hhbm5lbHM7IGNoKyspCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKSB7CiAgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCAzMDsgc2IrKykgewogICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCA2MzsgaisrKSB7ICAvLyBUaGUgbG9vcCBvbmx5IGl0ZXJhdGVzIHRvIDYzIHNvIHRoZSBjb2RlIGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICBhZGQxID0gdG9uZV9sZXZlbF9pZHhbY2hdW3NiXVtqXSAtIDEwOwpAQCAtNTY1LDY3ICs1NjcsNjggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdG9uZV9sZXZlbF9pZHhfdGVtcFtjaF1bc2JdWzBdID0gdG9uZV9sZXZlbF9pZHhfdGVtcFtjaF1bc2JdWzFdOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYWNjID0gMDsKLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjYyArPSB0b25lX2xldmVsX2lkeF90ZW1wW2NoXVtzYl1bal07Ci0KLSAgICAgICAgICAgIG11bHRyZXMgPSAweDY2NjY2NjY3TEwgKiAoYWNjICogMTApOwotICAgICAgICAgICAgZXNwXzQwID0gKG11bHRyZXMgPj4gMzIpIC8gOCArICgobXVsdHJlcyAmIDB4ZmZmZmZmZmYpID4+IDMxKTsKLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyAgY2ggPCBuYl9jaGFubmVsczsgY2grKykKLSAgICAgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCAzMDsgc2IrKykKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSB0b25lX2xldmVsX2lkeF90ZW1wW2NoXVtzYl1bal0qIGVzcF80MCAqIDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgKz0gMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgLz0gMjU2OyAvLyBzaWduZWQgc2hpZnQKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChzYikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAzMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAzMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCArPSAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcCA8IDI0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDI0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wICs9IDEwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAxNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAxNjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wIDw9IDUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXAgPD0gMTApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wIDw9IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IDE2OwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcCA8PSAyNCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX21ldGhvZFtjaF1bc2JdW2pdID0gKCh0bXAgJiAweGZmZmEpICsgMzAgKSYgMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFjYyA9IDA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKQogICAgICAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgMzA7IHNiKyspCi0gICAgICAgICAgICAgICAgZml4X2NvZGluZ19tZXRob2RfYXJyYXkoc2IsIG5iX2NoYW5uZWxzLCBjb2RpbmdfbWV0aG9kKTsKLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5iX2NoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQotICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYiA+PSAxMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPCAxMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX21ldGhvZFtjaF1bc2JdW2pdID0gMTA7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGFjYyArPSB0b25lX2xldmVsX2lkeF90ZW1wW2NoXVtzYl1bal07CisKKyAgICAgICAgbXVsdHJlcyA9IDB4NjY2NjY2NjdMTCAqIChhY2MgKiAxMCk7CisgICAgICAgIGVzcF80MCA9IChtdWx0cmVzID4+IDMyKSAvIDggKyAoKG11bHRyZXMgJiAweGZmZmZmZmZmKSA+PiAzMSk7CisgICAgICAgIGZvciAoY2ggPSAwOyAgY2ggPCBuYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXAgPSB0b25lX2xldmVsX2lkeF90ZW1wW2NoXVtzYl1bal0qIGVzcF80MCAqIDEwOworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wICs9IDB4ZmY7CisgICAgICAgICAgICAgICAgICAgIGNvbXAgLz0gMjU2OyAvLyBzaWduZWQgc2hpZnQKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKHNiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAzMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgKz0gMTU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDI0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAgKz0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXAgPCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCA9IDE2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wIDw9IDUpCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAwOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wIDw9IDEwKQorICAgICAgICAgICAgICAgICAgICAgICAgdG1wID0gMTA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvbXAgPD0gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY29tcCA8PSAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcCA9IC0xOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0bXAgPSAwOworICAgICAgICAgICAgICAgICAgICBjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPSAoKHRtcCAmIDB4ZmZmYSkgKyAzMCApJiAweGZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgMzA7IHNiKyspCisgICAgICAgICAgICBmaXhfY29kaW5nX21ldGhvZF9hcnJheShzYiwgbmJfY2hhbm5lbHMsIGNvZGluZ19tZXRob2QpOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA2NDsgaisrKQorICAgICAgICAgICAgICAgICAgICBpZiAoc2IgPj0gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPCAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYiA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGluZ19tZXRob2RbY2hdW3NiXVtqXSA8IDE2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPSAxNjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNiID49IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGluZ19tZXRob2RbY2hdW3NiXVtqXSA8IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX21ldGhvZFtjaF1bc2JdW2pdID0gMTY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGluZ19tZXRob2RbY2hdW3NiXVtqXSA8IDMwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX21ldGhvZFtjaF1bc2JdW2pdID0gMzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RpbmdfbWV0aG9kW2NoXVtzYl1bal0gPCAzMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nX21ldGhvZFtjaF1bc2JdW2pdID0gMzA7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICB9IGVsc2UgeyAvLyBzdXBlcmJsb2NrdHlwZV8yXzMgIT0gMAogICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuYl9jaGFubmVsczsgY2grKykKICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IDMwOyBzYisrKQpAQCAtNjM1LDcgKzYzOCw2IEBACiB9CiAKIC8qKgotICoKICAqIENhbGxlZCBieSBwcm9jZXNzX3N1YnBhY2tldF8xMSB0byBwcm9jZXNzIG1vcmUgZGF0YSBmcm9tIHN1YnBhY2tldCAxMQogICogd2l0aCBzYiAwLTguCiAgKiBDYWxsZWQgYnkgcHJvY2Vzc19zdWJwYWNrZXRfMTIgdG8gcHJvY2VzcyBkYXRhIGZyb20gc3VicGFja2V0IDEyIHdpdGgKQEAgLTE2MDQsOSArMTYwNiw4IEBACiBzdGF0aWMgYXZfY29sZCBpbnQgcWRtMl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgUURNMkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIHVpbnQ4X3QgKmV4dHJhZGF0YTsKLSAgICBpbnQgZXh0cmFkYXRhX3NpemU7CiAgICAgaW50IHRtcF92YWwsIHRtcCwgc2l6ZTsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKIAogICAgIHFkbTJfaW5pdF9zdGF0aWNfZGF0YSgpOwogCkBAIC0xNjQ5LDU1ICsxNjUwLDM5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGV4dHJhZGF0YSAgICAgID0gYXZjdHgtPmV4dHJhZGF0YTsKLSAgICBleHRyYWRhdGFfc2l6ZSA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKIAotICAgIHdoaWxlIChleHRyYWRhdGFfc2l6ZSA+IDcpIHsKLSAgICAgICAgaWYgKCFtZW1jbXAoZXh0cmFkYXRhLCAiZnJtYVFETSIsIDcpKQorICAgIHdoaWxlIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpID4gOCkgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfcGVla19iZTY0KCZnYikgPT0gKCgodWludDY0X3QpTUtCRVRBRygnZicsJ3InLCdtJywnYScpIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClNS0JFVEFHKCdRJywnRCcsJ00nLCcyJykpKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGV4dHJhZGF0YSsrOwotICAgICAgICBleHRyYWRhdGFfc2l6ZS0tOworICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMSk7CiAgICAgfQogCi0gICAgaWYgKGV4dHJhZGF0YV9zaXplIDwgMTIpIHsKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IDEyKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibm90IGVub3VnaCBleHRyYWRhdGEgKCVpKVxuIiwKLSAgICAgICAgICAgICAgIGV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBpZiAobWVtY21wKGV4dHJhZGF0YSwgImZybWFRRE0iLCA3KSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgaGVhZGVycywgUURNPyBub3QgZm91bmRcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9CisgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2IsIDgpOworICAgIHNpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOwogCi0gICAgaWYgKGV4dHJhZGF0YVs3XSA9PSAnQycpIHsKLS8vICAgICAgICBzLT5pc19xZG1jID0gMTsKLSAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJRRE1DIHZlcnNpb24gMSIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Ci0gICAgfQotCi0gICAgZXh0cmFkYXRhICs9IDg7Ci0gICAgZXh0cmFkYXRhX3NpemUgLT0gODsKLQotICAgIHNpemUgPSBBVl9SQjMyKGV4dHJhZGF0YSk7Ci0KLSAgICBpZihzaXplID4gZXh0cmFkYXRhX3NpemUpeworICAgIGlmIChzaXplID4gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImV4dHJhZGF0YSBzaXplIHRvbyBzbWFsbCwgJWkgPCAlaVxuIiwKLSAgICAgICAgICAgICAgIGV4dHJhZGF0YV9zaXplLCBzaXplKTsKKyAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYiksIHNpemUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBleHRyYWRhdGEgKz0gNDsKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNpemU6ICVkXG4iLCBzaXplKTsKLSAgICBpZiAoQVZfUkIzMihleHRyYWRhdGEpICE9IE1LQkVUQUcoJ1EnLCdEJywnQycsJ0EnKSkgeworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpICE9IE1LQkVUQUcoJ1EnLCdEJywnQycsJ0EnKSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZXh0cmFkYXRhLCBleHBlY3RpbmcgUURDQVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGV4dHJhZGF0YSArPSA4OworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA0KTsKIAotICAgIGF2Y3R4LT5jaGFubmVscyA9IHMtPm5iX2NoYW5uZWxzID0gcy0+Y2hhbm5lbHMgPSBBVl9SQjMyKGV4dHJhZGF0YSk7Ci0gICAgZXh0cmFkYXRhICs9IDQ7CisgICAgYXZjdHgtPmNoYW5uZWxzID0gcy0+bmJfY2hhbm5lbHMgPSBzLT5jaGFubmVscyA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CiAgICAgaWYgKHMtPmNoYW5uZWxzIDw9IDAgfHwgcy0+Y2hhbm5lbHMgPiBNUEFfTUFYX0NIQU5ORUxTKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHNcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTE3MDUsMTkgKzE2OTAsMTEgQEAKICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSBhdmN0eC0+Y2hhbm5lbHMgPT0gMiA/IEFWX0NIX0xBWU9VVF9TVEVSRU8gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX01PTk87CiAKLSAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBBVl9SQjMyKGV4dHJhZGF0YSk7Ci0gICAgZXh0cmFkYXRhICs9IDQ7Ci0KLSAgICBhdmN0eC0+Yml0X3JhdGUgPSBBVl9SQjMyKGV4dHJhZGF0YSk7Ci0gICAgZXh0cmFkYXRhICs9IDQ7Ci0KLSAgICBzLT5ncm91cF9zaXplID0gQVZfUkIzMihleHRyYWRhdGEpOwotICAgIGV4dHJhZGF0YSArPSA0OwotCi0gICAgcy0+ZmZ0X3NpemUgPSBBVl9SQjMyKGV4dHJhZGF0YSk7Ci0gICAgZXh0cmFkYXRhICs9IDQ7Ci0KLSAgICBzLT5jaGVja3N1bV9zaXplID0gQVZfUkIzMihleHRyYWRhdGEpOworICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgYXZjdHgtPmJpdF9yYXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICBzLT5ncm91cF9zaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICBzLT5mZnRfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgcy0+Y2hlY2tzdW1fc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CiAgICAgaWYgKHMtPmNoZWNrc3VtX3NpemUgPj0gMVUgPDwgMjgpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkYXRhIGJsb2NrIHNpemUgdG9vIGxhcmdlICgldSlcbiIsIHMtPmNoZWNrc3VtX3NpemUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTE4MzIsNyArMTgwOSw3IEBACiAKICAgICBxLT5zdWJfcGFja2V0ID0gKHEtPnN1Yl9wYWNrZXQgKyAxKSAlIDE2OwogCi0gICAgLyogY2xpcCBhbmQgY29udmVydCBvdXRwdXQgZmxvYXRbXSB0byAxNmJpdCBzaWduZWQgc2FtcGxlcyAqLworICAgIC8qIGNsaXAgYW5kIGNvbnZlcnQgb3V0cHV0IGZsb2F0W10gdG8gMTYtYml0IHNpZ25lZCBzYW1wbGVzICovCiAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lX3NpemU7IGkrKykgewogICAgICAgICBpbnQgdmFsdWUgPSAoaW50KXEtPm91dHB1dF9idWZmZXJbaV07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcWRtYy5jIGIvbGliYXZjb2RlYy9xZG1jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmODZhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvcWRtYy5jCkBAIC0wLDAgKzEsNzg2IEBACisvKgorICogUURNQyBjb21wYXRpYmxlIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKworI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImZmdC5oIgorCit0eXBlZGVmIHN0cnVjdCBRRE1DVG9uZSB7CisgICAgdWludDhfdCBtb2RlOworICAgIHVpbnQ4X3QgcGhhc2U7CisgICAgdWludDhfdCBvZmZzZXQ7CisgICAgaW50MTZfdCBmcmVxOworICAgIGludDE2X3QgYW1wbGl0dWRlOworfSBRRE1DVG9uZTsKKwordHlwZWRlZiBzdHJ1Y3QgUURNQ0NvbnRleHQgeworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKworICAgIHVpbnQ4X3QgZnJhbWVfYml0czsKKyAgICBpbnQgYmFuZF9pbmRleDsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICBpbnQgc3ViZnJhbWVfc2l6ZTsKKyAgICBpbnQgZmZ0X29mZnNldDsKKyAgICBpbnQgYnVmZmVyX29mZnNldDsKKyAgICBpbnQgbmJfY2hhbm5lbHM7CisgICAgaW50IGNoZWNrc3VtX3NpemU7CisKKyAgICB1aW50OF90IG5vaXNlWzJdWzE5XVsxN107CisgICAgUURNQ1RvbmUgdG9uZXNbNV1bODE5Ml07CisgICAgaW50IG5iX3RvbmVzWzVdOworICAgIGludCBjdXJfdG9uZVs1XTsKKyAgICBmbG9hdCBhbHRfc2luWzVdWzMxXTsKKyAgICBmbG9hdCBmZnRfYnVmZmVyWzRdWzgxOTIgKiAyXTsKKyAgICBmbG9hdCBub2lzZTJfYnVmZmVyWzQwOTYgKiAyXTsKKyAgICBmbG9hdCBub2lzZV9idWZmZXJbNDA5NiAqIDJdOworICAgIGZsb2F0IGJ1ZmZlclsyICogMzI3NjhdOworICAgIGZsb2F0ICpidWZmZXJfcHRyOworICAgIGludCBybmR2YWw7CisKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIEZGVENvbXBsZXgsIGNtcGx4KVsyXVs1MTJdOworICAgIEZGVENvbnRleHQgZmZ0X2N0eDsKK30gUURNQ0NvbnRleHQ7CisKK3N0YXRpYyBmbG9hdCBzaW5fdGFibGVbNTEyXTsKK3N0YXRpYyBWTEMgdnRhYmxlWzZdOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY29kZV9wcmVmaXhbXSA9IHsKKyAgICAweDAsIDB4MSwgMHgyLCAweDMsIDB4NCwgMHg2LCAweDgsIDB4QSwKKyAgICAweEMsIDB4MTAsIDB4MTQsIDB4MTgsIDB4MUMsIDB4MjQsIDB4MkMsIDB4MzQsCisgICAgMHgzQywgMHg0QywgMHg1QywgMHg2QywgMHg3QywgMHg5QywgMHhCQywgMHhEQywKKyAgICAweEZDLCAweDEzQywgMHgxN0MsIDB4MUJDLCAweDFGQywgMHgyN0MsIDB4MkZDLCAweDM3QywKKyAgICAweDNGQywgMHg0RkMsIDB4NUZDLCAweDZGQywgMHg3RkMsIDB4OUZDLCAweEJGQywgMHhERkMsCisgICAgMHhGRkMsIDB4MTNGQywgMHgxN0ZDLCAweDFCRkMsIDB4MUZGQywgMHgyN0ZDLCAweDJGRkMsIDB4MzdGQywKKyAgICAweDNGRkMsIDB4NEZGQywgMHg1RkZDLCAweDZGRkMsIDB4N0ZGQywgMHg5RkZDLCAweEJGRkMsIDB4REZGQywKKyAgICAweEZGRkMsIDB4MTNGRkMsIDB4MTdGRkMsIDB4MUJGRkMsIDB4MUZGRkMsIDB4MjdGRkMsIDB4MkZGRkMsIDB4MzdGRkMsCisgICAgMHgzRkZGQworfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGFtcGxpdHVkZV90YWJbNjRdID0geworICAgIDEuMTg3NTAwMDBmLCAxLjY4MzU5MzgwZiwgMi4zNzUwMDAwMGYsIDMuMzY3MTg3NTBmLCA0Ljc1MDAwMDAwZiwKKyAgICA2LjczNDM3NTAwZiwgOS41MDAwMDAwMGYsIDEzLjQ2ODc1MDBmLCAxOS4wMDAwMDAwZiwgMjYuOTM3NTAwMGYsCisgICAgMzguMDAwMDAwMGYsIDUzLjg3NTAwMDBmLCA3Ni4wMDAwMDAwZiwgMTA3Ljc1MDAwMGYsIDE1Mi4wMDAwMDBmLAorICAgIDIxNS41MDAwMDBmLCAzMDQuMDAwMDAwZiwgNDMxLjAwMDAwMGYsIDYwOC4wMDAwMDBmLCA4NjIuMDAwMDAwZiwKKyAgICAxMjE2LjAwMDAwZiwgMTcyNC4wMDAwMGYsIDI0MzIuMDAwMDBmLCAzNDQ4LjAwMDAwZiwgNDg2NC4wMDAwMGYsCisgICAgNjg5Ni4wMDAwMGYsIDk3MjguMDAwMDBmLCAxMzc5Mi4wMDAwZiwgMTk0NTYuMDAwMGYsIDI3NTg0LjAwMDBmLAorICAgIDM4OTEyLjAwMDBmLCA1NTE2OC4wMDAwZiwgNzc4MjQuMDAwMGYsIDExMDMzNi4wMDBmLCAxNTU2NDguMDAwZiwKKyAgICAyMjA2NzIuMDAwZiwgMzExMjk2LjAwMGYsIDQ0MTM0NC4wMDBmLCA2MjI1OTIuMDAwZiwgODgyNjg4LjAwMGYsCisgICAgMTI0NTE4NC4wMGYsIDE3NjUzNzYuMDBmLCAyNDkwMzY4LjAwZiwgMzUzMDc1Mi4wMGYsIDQ5ODA3MzYuMDBmLAorICAgIDcwNjE1MDQuMDBmLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IHFkbWNfbm9kZXNbMTEyXSA9IHsKKyAgICAwLCAxLCAyLCA0LCA2LCA4LCAxMiwgMTYsIDI0LCAzMiwgNDgsIDU2LCA2NCwKKyAgICA4MCwgOTYsIDEyMCwgMTQ0LCAxNzYsIDIwOCwgMjQwLCAyNTYsCisgICAgMCwgMiwgNCwgOCwgMTYsIDI0LCAzMiwgNDgsIDU2LCA2NCwgODAsIDEwNCwKKyAgICAxMjgsIDE2MCwgMjA4LCAyNTYsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMiwgNCwgOCwgMTYsIDMyLCA0OCwgNjQsIDgwLCAxMTIsIDE2MCwgMjA4LAorICAgIDI1NiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCA0LCA4LCAxNiwgMzIsIDQ4LCA2NCwgOTYsIDE0NCwgMjA4LCAyNTYsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCA0LCAxNiwgMzIsIDY0LCAyNTYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgbm9pc2VfYmFuZHNfc2l6ZVtdID0geworICAgIDE5LCAxNCwgMTEsIDksIDQsIDIsIDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG5vaXNlX2JhbmRzX3NlbGVjdG9yW10gPSB7CisgICAgNCwgMywgMiwgMSwgMCwgMCwgMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG5vaXNlX3ZhbHVlX2JpdHNbXSA9IHsKKyAgICAxMiwgNywgOSwgNywgMTAsIDksIDExLCA5LCA5LCAyLCA5LCA5LCA5LCA5LAorICAgIDksIDMsIDksIDEwLCAxMCwgMTIsIDIsIDMsIDMsIDUsIDUsIDYsIDcsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBub2lzZV92YWx1ZV9zeW1ib2xzW10gPSB7CisgICAgMCwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE4LCAxLCAyMCwgMjIsIDI0LAorICAgIDI2LCAyOCwgMiwgMzAsIDMyLCAzNCwgMzYsIDMsIDQsIDUsIDYsIDcsIDgsIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgbm9pc2VfdmFsdWVfY29kZXNbXSA9IHsKKyAgICAweEM3QSwgMHgwMDIsIDB4MEZBLCAweDAzQSwgMHgzNUEsIDB4MUMyLCAweDA3QSwgMHgxRkEsCisgICAgMHgxN0EsIDB4MDAwLCAweDBEQSwgMHgxNDIsIDB4MEMyLCAweDA0MiwgMHgxREEsIDB4MDAxLAorICAgIDB4MDVBLCAweDE1QSwgMHgyN0EsIDB4NDdBLCAweDAwMywgMHgwMDUsIDB4MDA2LCAweDAxMiwKKyAgICAweDAwQSwgMHgwMjIsIDB4MDFBLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgbm9pc2Vfc2VnbWVudF9sZW5ndGhfYml0c1tdID0geworICAgIDEwLCA4LCA1LCAxLCAyLCA0LCA0LCA0LCA2LCA3LCA5LCAxMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IG5vaXNlX3NlZ21lbnRfbGVuZ3RoX3N5bWJvbHNbXSA9IHsKKyAgICAwLCAxMywgMTcsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qgbm9pc2Vfc2VnbWVudF9sZW5ndGhfY29kZXNbXSA9IHsKKyAgICAweDMwQiwgMHg4QiwgMHgxQiwgMHgwLCAweDEsIDB4MywgMHg3LCAweEYsIDB4MmIsIDB4NEIsIDB4QiwgMHgxMEIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBmcmVxX2RpZmZfYml0c1tdID0geworICAgIDE4LCAyLCA0LCA0LCA1LCA0LCA0LCA1LCA1LCA0LCA1LCA1LCA1LCA1LCA2LCA2LCA2LCA2LCA2LCA3LCA3LCA2LAorICAgIDcsIDYsIDYsIDYsIDcsIDcsIDcsIDcsIDcsIDgsIDksIDksIDgsIDksIDExLCAxMSwgMTIsIDEyLCAxMywgMTIsCisgICAgMTQsIDE1LCAxOCwgMTYsIDE3LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGZyZXFfZGlmZl9jb2Rlc1tdID0geworICAgIDB4MkFENDYsIDB4MSwgMHgwLCAweDMsIDB4QywgMHhBLCAweDcsIDB4MTgsIDB4MTIsIDB4RSwgMHg0LCAweDE2LAorICAgIDB4RiwgMHgxQywgMHg4LCAweDIyLCAweDI2LCAweDIsIDB4M0IsIDB4MzQsIDB4NzQsIDB4MUYsIDB4MTQsIDB4MkIsCisgICAgMHgxQiwgMHgzRiwgMHgyOCwgMHg1NCwgMHg2LCAweDRCLCAweEIsIDB4NjgsIDB4RTgsIDB4NDYsIDB4QzYsIDB4MUU4LAorICAgIDB4MTQ2LCAweDM0NiwgMHg1NDYsIDB4NzQ2LCAweDFENDYsIDB4RjQ2LCAweEQ0NiwgMHg2RDQ2LCAweEFENDYsIDB4MkQ0NiwKKyAgICAweDFBRDQ2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYW1wbGl0dWRlX2JpdHNbXSA9IHsKKyAgICAxMywgNywgOCwgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCA5LCA4LCA3LCA2LAorICAgIDUsIDQsIDMsIDMsIDIsIDMsIDMsIDQsIDUsIDcsIDgsIDksIDExLCAxMiwgMTMsCit9OworCitzdGF0aWMgY29uc3QgdWludDE2X3QgYW1wbGl0dWRlX2NvZGVzW10gPSB7CisgICAgMHgxRUM2LCAweDYsIDB4QzIsIDB4MTQyLCAweDI0MiwgMHgyNDYsIDB4QzYsIDB4NDYsIDB4NDIsIDB4MTQ2LCAweEEyLAorICAgIDB4NjIsIDB4MjYsIDB4MTYsIDB4RSwgMHg1LCAweDQsIDB4MywgMHgwLCAweDEsIDB4QSwgMHgxMiwgMHgyLCAweDIyLAorICAgIDB4MUM2LCAweDJDNiwgMHg2QzYsIDB4RUM2LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYW1wbGl0dWRlX2RpZmZfYml0c1tdID0geworICAgIDgsIDIsIDEsIDMsIDQsIDUsIDYsIDcsIDgsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBhbXBsaXR1ZGVfZGlmZl9jb2Rlc1tdID0geworICAgIDB4RkUsIDB4MCwgMHgxLCAweDIsIDB4NiwgMHhFLCAweDFFLCAweDNFLCAweDdFLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGhhc2VfZGlmZl9iaXRzW10gPSB7CisgICAgNiwgMiwgMiwgNCwgNCwgNiwgNSwgNCwgMiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHBoYXNlX2RpZmZfY29kZXNbXSA9IHsKKyAgICAweDM1LCAweDIsIDB4MCwgMHgxLCAweEQsIDB4MTUsIDB4NSwgMHg5LCAweDMsCit9OworCisjZGVmaW5lIElOSVRfVkxDX1NUQVRJQ19MRSh2bGMsIG5iX2JpdHMsIG5iX2NvZGVzLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgYml0c193cmFwLCBiaXRzX3NpemUsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzLCBjb2Rlc193cmFwLCBjb2Rlc19zaXplLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzLCBzeW1ib2xzX3dyYXAsIHN5bWJvbHNfc2l6ZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX3NpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpYyBWTENfVFlQRSB0YWJsZVtzdGF0aWNfc2l6ZV1bMl07ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmxjKS0+dGFibGUgICAgICAgICAgID0gdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZsYyktPnRhYmxlX2FsbG9jYXRlZCA9IHN0YXRpY19zaXplOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZmX2luaXRfdmxjX3NwYXJzZSh2bGMsIG5iX2JpdHMsIG5iX2NvZGVzLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgYml0c193cmFwLCBiaXRzX3NpemUsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzLCBjb2Rlc193cmFwLCBjb2Rlc19zaXplLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzLCBzeW1ib2xzX3dyYXAsIHN5bWJvbHNfc2l6ZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5JVF9WTENfTEUgfCBJTklUX1ZMQ19VU0VfTkVXX1NUQVRJQyk7IFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHFkbWNfaW5pdF9zdGF0aWNfZGF0YSh2b2lkKQoreworICAgIGludCBpOworCisgICAgSU5JVF9WTENfU1RBVElDX0xFKCZ2dGFibGVbMF0sIDEyLCBGRl9BUlJBWV9FTEVNUyhub2lzZV92YWx1ZV9iaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbm9pc2VfdmFsdWVfYml0cywgMSwgMSwgbm9pc2VfdmFsdWVfY29kZXMsIDIsIDIsIG5vaXNlX3ZhbHVlX3N5bWJvbHMsIDEsIDEsIDQwOTYpOworICAgIElOSVRfVkxDX1NUQVRJQ19MRSgmdnRhYmxlWzFdLCAxMCwgRkZfQVJSQVlfRUxFTVMobm9pc2Vfc2VnbWVudF9sZW5ndGhfYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgIG5vaXNlX3NlZ21lbnRfbGVuZ3RoX2JpdHMsIDEsIDEsIG5vaXNlX3NlZ21lbnRfbGVuZ3RoX2NvZGVzLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICBub2lzZV9zZWdtZW50X2xlbmd0aF9zeW1ib2xzLCAxLCAxLCAxMDI0KTsKKyAgICBJTklUX1ZMQ19TVEFUSUNfTEUoJnZ0YWJsZVsyXSwgMTMsIEZGX0FSUkFZX0VMRU1TKGFtcGxpdHVkZV9iaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYW1wbGl0dWRlX2JpdHMsIDEsIDEsIGFtcGxpdHVkZV9jb2RlcywgMiwgMiwgTlVMTCwgMCwgMCwgODE5Mik7CisgICAgSU5JVF9WTENfU1RBVElDX0xFKCZ2dGFibGVbM10sIDE4LCBGRl9BUlJBWV9FTEVNUyhmcmVxX2RpZmZfYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgIGZyZXFfZGlmZl9iaXRzLCAxLCAxLCBmcmVxX2RpZmZfY29kZXMsIDQsIDQsIE5VTEwsIDAsIDAsIDI2MjE0NCk7CisgICAgSU5JVF9WTENfU1RBVElDX0xFKCZ2dGFibGVbNF0sIDgsIEZGX0FSUkFZX0VMRU1TKGFtcGxpdHVkZV9kaWZmX2JpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICBhbXBsaXR1ZGVfZGlmZl9iaXRzLCAxLCAxLCBhbXBsaXR1ZGVfZGlmZl9jb2RlcywgMSwgMSwgTlVMTCwgMCwgMCwgMjU2KTsKKyAgICBJTklUX1ZMQ19TVEFUSUNfTEUoJnZ0YWJsZVs1XSwgNiwgRkZfQVJSQVlfRUxFTVMocGhhc2VfZGlmZl9iaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VfZGlmZl9iaXRzLCAxLCAxLCBwaGFzZV9kaWZmX2NvZGVzLCAxLCAxLCBOVUxMLCAwLCAwLCA2NCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspCisgICAgICAgIHNpbl90YWJsZVtpXSA9IHNpbigyLjBmICogaSAqIE1fUEkgKiAwLjAwMTk1MzEyNWYpOworfQorCitzdGF0aWMgdm9pZCBtYWtlX25vaXNlcyhRRE1DQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgaiwgbjAsIG4xLCBuMiwgZGlmZjsKKyAgICBmbG9hdCAqbnB0cjsKKworICAgIGZvciAoaiA9IDA7IGogPCBub2lzZV9iYW5kc19zaXplW3MtPmJhbmRfaW5kZXhdOyBqKyspIHsKKyAgICAgICAgbjAgPSBxZG1jX25vZGVzW2ogKyAyMSAqIHMtPmJhbmRfaW5kZXggICAgXTsKKyAgICAgICAgbjEgPSBxZG1jX25vZGVzW2ogKyAyMSAqIHMtPmJhbmRfaW5kZXggKyAxXTsKKyAgICAgICAgbjIgPSBxZG1jX25vZGVzW2ogKyAyMSAqIHMtPmJhbmRfaW5kZXggKyAyXTsKKyAgICAgICAgbnB0ciA9IHMtPm5vaXNlX2J1ZmZlciArIDI1NiAqIGo7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSArIG4wIDwgbjE7IGkrKywgbnB0cisrKQorICAgICAgICAgICAgbnB0clswXSA9IGkgLyAoZmxvYXQpKG4xIC0gbjApOworCisgICAgICAgIGRpZmYgPSBuMiAtIG4xOworICAgICAgICBucHRyID0gcy0+bm9pc2VfYnVmZmVyICsgKGogPDwgOCkgKyBuMSAtIG4wOworCisgICAgICAgIGZvciAoaSA9IG4xOyBpIDwgbjI7IGkrKywgbnB0cisrLCBkaWZmLS0pCisgICAgICAgICAgICBucHRyWzBdID0gZGlmZiAvIChmbG9hdCkobjIgLSBuMSk7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcWRtY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgc3RhdGljIEFWT25jZSBpbml0X3N0YXRpY19vbmNlID0gQVZfT05DRV9JTklUOworICAgIFFETUNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgZmZ0X3NpemUsIGZmdF9vcmRlciwgc2l6ZSwgZywgaiwgeDsKKyAgICBHZXRCeXRlQ29udGV4dCBiOworCisgICAgZmZfdGhyZWFkX29uY2UoJmluaXRfc3RhdGljX29uY2UsIHFkbWNfaW5pdF9zdGF0aWNfZGF0YSk7CisKKyAgICBpZiAoIWF2Y3R4LT5leHRyYWRhdGEgfHwgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDQ4KSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImV4dHJhZGF0YSBtaXNzaW5nIG9yIHRydW5jYXRlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmIsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7CisKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmIpID4gOCkgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfcGVla19iZTY0KCZiKSA9PSAoKCh1aW50NjRfdClNS0JFVEFHKCdmJywncicsJ20nLCdhJykgPDwgMzIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpTUtCRVRBRygnUScsJ0QnLCdNJywnQycpKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmYiwgMSk7CisgICAgfQorICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZiLCA4KTsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmYikgPCAzNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm5vdCBlbm91Z2ggZXh0cmFkYXRhICglaSlcbiIsCisgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmYikpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZiKTsKKyAgICBpZiAoc2l6ZSA+IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZiKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImV4dHJhZGF0YSBzaXplIHRvbyBzbWFsbCwgJWkgPCAlaVxuIiwKKyAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZiKSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmIpICE9IE1LQkVUQUcoJ1EnLCdEJywnQycsJ0EnKSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgZXh0cmFkYXRhLCBleHBlY3RpbmcgUURDQVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBieXRlc3RyZWFtMl9za2lwdSgmYiwgNCk7CisKKyAgICBhdmN0eC0+Y2hhbm5lbHMgPSBzLT5uYl9jaGFubmVscyA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmYik7CisgICAgaWYgKHMtPm5iX2NoYW5uZWxzIDw9IDAgfHwgcy0+bmJfY2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgYXZjdHgtPmNoYW5uZWxfbGF5b3V0ID0gYXZjdHgtPmNoYW5uZWxzID09IDIgPyBBVl9DSF9MQVlPVVRfU1RFUkVPIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9NT05POworCisgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZiKTsKKyAgICBhdmN0eC0+Yml0X3JhdGUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmIpOworICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZiLCA0KTsKKyAgICBmZnRfc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmYik7CisgICAgZmZ0X29yZGVyID0gYXZfbG9nMihmZnRfc2l6ZSkgKyAxOworICAgIHMtPmNoZWNrc3VtX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmIpOworICAgIGlmIChzLT5jaGVja3N1bV9zaXplID49IDFVIDw8IDI4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGF0YSBibG9jayBzaXplIHRvbyBsYXJnZSAoJXUpXG4iLCBzLT5jaGVja3N1bV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSA+PSAzMjAwMCkgeworICAgICAgICB4ID0gMjgwMDA7CisgICAgICAgIHMtPmZyYW1lX2JpdHMgPSAxMzsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSA+PSAxNjAwMCkgeworICAgICAgICB4ID0gMjAwMDA7CisgICAgICAgIHMtPmZyYW1lX2JpdHMgPSAxMjsKKyAgICB9IGVsc2UgeworICAgICAgICB4ID0gMTYwMDA7CisgICAgICAgIHMtPmZyYW1lX2JpdHMgPSAxMTsKKyAgICB9CisgICAgcy0+ZnJhbWVfc2l6ZSA9IDEgPDwgcy0+ZnJhbWVfYml0czsKKyAgICBzLT5zdWJmcmFtZV9zaXplID0gcy0+ZnJhbWVfc2l6ZSA+PiA1OworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA9PSAyKQorICAgICAgICB4ID0gMyAqIHggLyAyOworICAgIHMtPmJhbmRfaW5kZXggPSBub2lzZV9iYW5kc19zZWxlY3RvcltGRk1JTig2LCBsbHJpbnQoZmxvb3IoYXZjdHgtPmJpdF9yYXRlICogMy4wIC8gKGRvdWJsZSl4ICsgMC41KSkpXTsKKworICAgIGlmICgoZmZ0X29yZGVyIDwgNykgfHwgKGZmdF9vcmRlciA+IDkpKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIlVua25vd24gRkZUIG9yZGVyICVkIiwgZmZ0X29yZGVyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmIChmZnRfc2l6ZSAhPSAoMSA8PCAoZmZ0X29yZGVyIC0gMSkpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRkZUIHNpemUgJWQgbm90IHBvd2VyIG9mIDIuXG4iLCBmZnRfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZmX2ZmdF9pbml0KCZzLT5mZnRfY3R4LCBmZnRfb3JkZXIsIDEpOworCisgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKworICAgIGZvciAoZyA9IDU7IGcgPiAwOyBnLS0pIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8ICgxIDw8IGcpIC0gMTsgaisrKQorICAgICAgICAgICAgcy0+YWx0X3Npbls1LWddW2pdID0gc2luX3RhYmxlWygoKGorMSkgPDwgKDggLSBnKSkgJiAweDFGRildOworICAgIH0KKworICAgIG1ha2Vfbm9pc2VzKHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBxZG1jX2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUURNQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfZmZ0X2VuZCgmcy0+ZmZ0X2N0eCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxZG1jX2dldF92bGMoR2V0Qml0Q29udGV4dCAqZ2IsIFZMQyAqdGFibGUsIGludCBmbGFnKQoreworICAgIGludCB2OworCisgICAgdiA9IGdldF92bGMyKGdiLCB0YWJsZS0+dGFibGUsIHRhYmxlLT5iaXRzLCAxKTsKKyAgICBpZiAodiA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmICh2KQorICAgICAgICB2ID0gdiAtIDE7CisgICAgZWxzZQorICAgICAgICB2ID0gZ2V0X2JpdHMoZ2IsIGdldF9iaXRzKGdiLCAzKSArIDEpOworCisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgaWYgKHYgPj0gRkZfQVJSQVlfRUxFTVMoY29kZV9wcmVmaXgpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgdiA9IGNvZGVfcHJlZml4W3ZdICsgZ2V0X2JpdHN6KGdiLCB2ID4+IDIpOworICAgIH0KKworICAgIHJldHVybiB2OworfQorCitzdGF0aWMgaW50IHNraXBfbGFiZWwoUURNQ0NvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIHVpbnQzMl90IGxhYmVsID0gZ2V0X2JpdHNfbG9uZyhnYiwgMzIpOworICAgIHVpbnQxNl90IHN1bSA9IDIyNiwgY2hlY2tzdW0gPSBnZXRfYml0cyhnYiwgMTYpOworICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IGdiLT5idWZmZXIgKyA2OworICAgIGludCBpOworCisgICAgaWYgKGxhYmVsICE9IE1LVEFHKCdRJywgJ00nLCAnQycsIDEpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGVja3N1bV9zaXplIC0gNjsgaSsrKQorICAgICAgICBzdW0gKz0gcHRyW2ldOworCisgICAgcmV0dXJuIHN1bSAhPSBjaGVja3N1bTsKK30KKworc3RhdGljIGludCByZWFkX25vaXNlX2RhdGEoUURNQ0NvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIGludCBjaCwgaiwgaywgdiwgaWR4LCBiYW5kLCBsYXN0dmFsLCBuZXd2YWwsIGxlbjsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoYmFuZCA9IDA7IGJhbmQgPCBub2lzZV9iYW5kc19zaXplW3MtPmJhbmRfaW5kZXhdOyBiYW5kKyspIHsKKyAgICAgICAgICAgIHYgPSBxZG1jX2dldF92bGMoZ2IsICZ2dGFibGVbMF0sIDApOworICAgICAgICAgICAgaWYgKHYgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBpZiAodiAmIDEpCisgICAgICAgICAgICAgICAgdiA9IHYgKyAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHYgPSAtdjsKKworICAgICAgICAgICAgbGFzdHZhbCA9IHYgLyAyOworICAgICAgICAgICAgcy0+bm9pc2VbY2hdW2JhbmRdWzBdID0gbGFzdHZhbCAtIDE7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTU7KSB7CisgICAgICAgICAgICAgICAgbGVuID0gcWRtY19nZXRfdmxjKGdiLCAmdnRhYmxlWzFdLCAxKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgbGVuICs9IDE7CisKKyAgICAgICAgICAgICAgICB2ID0gcWRtY19nZXRfdmxjKGdiLCAmdnRhYmxlWzBdLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAodiA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgaWYgKHYgJiAxKQorICAgICAgICAgICAgICAgICAgICBuZXd2YWwgPSBsYXN0dmFsICsgKHYgKyAxKSAvIDI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBuZXd2YWwgPSBsYXN0dmFsIC0gdiAvIDI7CisKKyAgICAgICAgICAgICAgICBpZHggPSBqICsgMTsKKyAgICAgICAgICAgICAgICBpZiAobGVuICsgaWR4ID4gMTYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgZm9yIChrID0gMTsgaWR4IDw9IGogKyBsZW47IGsrKywgaWR4KyspCisgICAgICAgICAgICAgICAgICAgIHMtPm5vaXNlW2NoXVtiYW5kXVtpZHhdID0gbGFzdHZhbCArIGsgKiAobmV3dmFsIC0gbGFzdHZhbCkgLyBsZW4gLSAxOworCisgICAgICAgICAgICAgICAgbGFzdHZhbCA9IG5ld3ZhbDsKKyAgICAgICAgICAgICAgICBqICs9IGxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfdG9uZShRRE1DQ29udGV4dCAqcywgaW50IGdyb3VwLCBpbnQgb2Zmc2V0LCBpbnQgZnJlcSwgaW50IHN0ZXJlb19tb2RlLCBpbnQgYW1wbGl0dWRlLCBpbnQgcGhhc2UpCit7CisgICAgY29uc3QgaW50IGluZGV4ID0gcy0+bmJfdG9uZXNbZ3JvdXBdOworCisgICAgaWYgKGluZGV4ID49IEZGX0FSUkFZX0VMRU1TKHMtPnRvbmVzW2dyb3VwXSkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlRvbyBtYW55IHRvbmVzIGFscmVhZHkgaW4gYnVmZmVyLCBpZ25vcmluZyB0b25lIVxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzLT50b25lc1tncm91cF1baW5kZXhdLm9mZnNldCAgICA9IG9mZnNldDsKKyAgICBzLT50b25lc1tncm91cF1baW5kZXhdLmZyZXEgICAgICA9IGZyZXE7CisgICAgcy0+dG9uZXNbZ3JvdXBdW2luZGV4XS5tb2RlICAgICAgPSBzdGVyZW9fbW9kZTsKKyAgICBzLT50b25lc1tncm91cF1baW5kZXhdLmFtcGxpdHVkZSA9IGFtcGxpdHVkZTsKKyAgICBzLT50b25lc1tncm91cF1baW5kZXhdLnBoYXNlICAgICA9IHBoYXNlOworICAgIHMtPm5iX3RvbmVzW2dyb3VwXSsrOworfQorCitzdGF0aWMgaW50IHJlYWRfd2F2ZV9kYXRhKFFETUNDb250ZXh0ICpzLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBpbnQgYW1wLCBwaGFzZSwgc3RlcmVvX21vZGUgPSAwLCBpLCBncm91cCwgZnJlcSwgZ3JvdXBfc2l6ZSwgZ3JvdXBfYml0czsKKyAgICBpbnQgYW1wMiwgcGhhc2UyLCBwb3MyLCBvZmY7CisKKyAgICBmb3IgKGdyb3VwID0gMDsgZ3JvdXAgPCA1OyBncm91cCsrKSB7CisgICAgICAgIGdyb3VwX3NpemUgPSAxIDw8IChzLT5mcmFtZV9iaXRzIC0gZ3JvdXAgLSAxKTsKKyAgICAgICAgZ3JvdXBfYml0cyA9IDQgLSBncm91cDsKKyAgICAgICAgcG9zMiA9IDA7CisgICAgICAgIG9mZiAgPSAwOworCisgICAgICAgIGZvciAoaSA9IDE7IDsgaSA9IGZyZXEgKyAxKSB7CisgICAgICAgICAgICBpbnQgdjsKKworICAgICAgICAgICAgdiA9IHFkbWNfZ2V0X3ZsYyhnYiwgJnZ0YWJsZVszXSwgMSk7CisgICAgICAgICAgICBpZiAodiA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGZyZXEgPSBpICsgdjsKKyAgICAgICAgICAgIHdoaWxlIChmcmVxID49IGdyb3VwX3NpemUgLSAxKSB7CisgICAgICAgICAgICAgICAgZnJlcSArPSAyIC0gZ3JvdXBfc2l6ZTsKKyAgICAgICAgICAgICAgICBwb3MyICs9IGdyb3VwX3NpemU7CisgICAgICAgICAgICAgICAgb2ZmICArPSAxIDw8IGdyb3VwX2JpdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwb3MyID49IHMtPmZyYW1lX3NpemUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmIChzLT5uYl9jaGFubmVscyA+IDEpCisgICAgICAgICAgICAgICAgc3RlcmVvX21vZGUgPSBnZXRfYml0cyhnYiwgMik7CisKKyAgICAgICAgICAgIGFtcCAgID0gcWRtY19nZXRfdmxjKGdiLCAmdnRhYmxlWzJdLCAwKTsKKyAgICAgICAgICAgIGlmIChhbXAgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgcGhhc2UgPSBnZXRfYml0cyhnYiwgMyk7CisKKyAgICAgICAgICAgIGlmIChzdGVyZW9fbW9kZSA+IDEpIHsKKyAgICAgICAgICAgICAgICBhbXAyICAgPSBxZG1jX2dldF92bGMoZ2IsICZ2dGFibGVbNF0sIDApOworICAgICAgICAgICAgICAgIGlmIChhbXAyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgYW1wMiAgID0gYW1wIC0gYW1wMjsKKworICAgICAgICAgICAgICAgIHBoYXNlMiA9IHFkbWNfZ2V0X3ZsYyhnYiwgJnZ0YWJsZVs1XSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKHBoYXNlMiA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHBoYXNlMiA9IHBoYXNlIC0gcGhhc2UyOworCisgICAgICAgICAgICAgICAgaWYgKHBoYXNlMiA8IDApCisgICAgICAgICAgICAgICAgICAgIHBoYXNlMiArPSA4OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGZyZXEgPj4gZ3JvdXBfYml0cykgKyAxIDwgcy0+c3ViZnJhbWVfc2l6ZSkgeworICAgICAgICAgICAgICAgIGFkZF90b25lKHMsIGdyb3VwLCBvZmYsIGZyZXEsIHN0ZXJlb19tb2RlICYgMSwgYW1wLCBwaGFzZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0ZXJlb19tb2RlID4gMSkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3RvbmUocywgZ3JvdXAsIG9mZiwgZnJlcSwgfnN0ZXJlb19tb2RlICYgMSwgYW1wMiwgcGhhc2UyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsaW5fY2FsYyhRRE1DQ29udGV4dCAqcywgZmxvYXQgYW1wbGl0dWRlLCBpbnQgbm9kZTEsIGludCBub2RlMiwgaW50IGluZGV4KQoreworICAgIGludCBzdWJmcmFtZV9zaXplLCBpLCBqLCBrLCBsZW5ndGg7CisgICAgZmxvYXQgc2NhbGUsICpub2lzZV9wdHI7CisKKyAgICBzY2FsZSA9IDAuNSAqIGFtcGxpdHVkZTsKKyAgICBzdWJmcmFtZV9zaXplID0gcy0+c3ViZnJhbWVfc2l6ZTsKKyAgICBpZiAoc3ViZnJhbWVfc2l6ZSA+PSBub2RlMikKKyAgICAgICAgc3ViZnJhbWVfc2l6ZSA9IG5vZGUyOworICAgIGxlbmd0aCA9IChzdWJmcmFtZV9zaXplIC0gbm9kZTEpICYgMHhGRkZDOworICAgIGogPSBub2RlMTsKKyAgICBub2lzZV9wdHIgPSAmcy0+bm9pc2VfYnVmZmVyWzI1NiAqIGluZGV4XTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gNCwgais9IDQsIG5vaXNlX3B0ciArPSA0KSB7CisgICAgICAgIHMtPm5vaXNlMl9idWZmZXJbaiAgICBdICs9IHNjYWxlICogbm9pc2VfcHRyWzBdOworICAgICAgICBzLT5ub2lzZTJfYnVmZmVyW2ogKyAxXSArPSBzY2FsZSAqIG5vaXNlX3B0clsxXTsKKyAgICAgICAgcy0+bm9pc2UyX2J1ZmZlcltqICsgMl0gKz0gc2NhbGUgKiBub2lzZV9wdHJbMl07CisgICAgICAgIHMtPm5vaXNlMl9idWZmZXJbaiArIDNdICs9IHNjYWxlICogbm9pc2VfcHRyWzNdOworICAgIH0KKworICAgIGsgPSBsZW5ndGggKyBub2RlMTsKKyAgICBub2lzZV9wdHIgPSBzLT5ub2lzZV9idWZmZXIgKyBsZW5ndGggKyAoaW5kZXggPDwgOCk7CisgICAgZm9yIChpID0gbGVuZ3RoOyBpIDwgc3ViZnJhbWVfc2l6ZSAtIG5vZGUxOyBpKyssIGsrKywgbm9pc2VfcHRyKyspCisgICAgICAgIHMtPm5vaXNlMl9idWZmZXJba10gKz0gc2NhbGUgKiBub2lzZV9wdHJbMF07Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9ub2lzZShRRE1DQ29udGV4dCAqcywgaW50IGNoLCBpbnQgY3VycmVudF9zdWJmcmFtZSkKK3sKKyAgICBpbnQgaSwgaiwgYWluZGV4OworICAgIGZsb2F0IGFtcGxpdHVkZTsKKyAgICBmbG9hdCAqaW0gPSAmcy0+ZmZ0X2J1ZmZlclswICsgY2hdW3MtPmZmdF9vZmZzZXQgKyBzLT5zdWJmcmFtZV9zaXplICogY3VycmVudF9zdWJmcmFtZV07CisgICAgZmxvYXQgKnJlID0gJnMtPmZmdF9idWZmZXJbMiArIGNoXVtzLT5mZnRfb2Zmc2V0ICsgcy0+c3ViZnJhbWVfc2l6ZSAqIGN1cnJlbnRfc3ViZnJhbWVdOworCisgICAgbWVtc2V0KHMtPm5vaXNlMl9idWZmZXIsIDAsIDQgKiBzLT5zdWJmcmFtZV9zaXplKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBub2lzZV9iYW5kc19zaXplW3MtPmJhbmRfaW5kZXhdOyBpKyspIHsKKyAgICAgICAgaWYgKHFkbWNfbm9kZXNbaSArIDIxICogcy0+YmFuZF9pbmRleF0gPiBzLT5zdWJmcmFtZV9zaXplIC0gMSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGFpbmRleCA9IHMtPm5vaXNlW2NoXVtpXVtjdXJyZW50X3N1YmZyYW1lIC8gMl07CisgICAgICAgIGFtcGxpdHVkZSA9IGFpbmRleCA+IDAgPyBhbXBsaXR1ZGVfdGFiW2FpbmRleCAmIDB4M0ZdIDogMC4wZjsKKworICAgICAgICBsaW5fY2FsYyhzLCBhbXBsaXR1ZGUsIHFkbWNfbm9kZXNbMjEgKiBzLT5iYW5kX2luZGV4ICsgaV0sCisgICAgICAgICAgICAgICAgIHFkbWNfbm9kZXNbMjEgKiBzLT5iYW5kX2luZGV4ICsgaSArIDJdLCBpKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAyOyBqIDwgcy0+c3ViZnJhbWVfc2l6ZSAtIDE7IGorKykgeworICAgICAgICBmbG9hdCBybmRfcmUsIHJuZF9pbTsKKworICAgICAgICBzLT5ybmR2YWwgPSAyMTQwMTMgKiBzLT5ybmR2YWwgKyAyNTMxMDExOworICAgICAgICBybmRfaW0gPSAoKHMtPnJuZHZhbCAmIDB4N0ZGRikgLSAxNjM4NC4wZikgKiAwLjAwMDAzMDUxNzU3OGYgKiBzLT5ub2lzZTJfYnVmZmVyW2pdOworICAgICAgICBzLT5ybmR2YWwgPSAyMTQwMTMgKiBzLT5ybmR2YWwgKyAyNTMxMDExOworICAgICAgICBybmRfcmUgPSAoKHMtPnJuZHZhbCAmIDB4N0ZGRikgLSAxNjM4NC4wZikgKiAwLjAwMDAzMDUxNzU3OGYgKiBzLT5ub2lzZTJfYnVmZmVyW2pdOworICAgICAgICBpbVtqICBdICs9IHJuZF9pbTsKKyAgICAgICAgcmVbaiAgXSArPSBybmRfcmU7CisgICAgICAgIGltW2orMV0gLT0gcm5kX2ltOworICAgICAgICByZVtqKzFdIC09IHJuZF9yZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF93YXZlKFFETUNDb250ZXh0ICpzLCBpbnQgb2Zmc2V0LCBpbnQgZnJlcXMsIGludCBncm91cCwgaW50IHN0ZXJlb19tb2RlLCBpbnQgYW1wLCBpbnQgcGhhc2UpCit7CisgICAgaW50IGosIGdyb3VwX2JpdHMsIHBvcywgcGluZGV4OworICAgIGZsb2F0IGltLCByZSwgYW1wbGl0dWRlLCBsZXZlbCwgKmltcHRyLCAqcmVwdHI7CisKKyAgICBpZiAocy0+bmJfY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgc3RlcmVvX21vZGUgPSAwOworCisgICAgZ3JvdXBfYml0cyA9IDQgLSBncm91cDsKKyAgICBwb3MgPSBmcmVxcyA+PiAoNCAtIGdyb3VwKTsKKyAgICBhbXBsaXR1ZGUgPSBhbXBsaXR1ZGVfdGFiW2FtcCAmIDB4M0ZdOworICAgIGltcHRyID0gJnMtPmZmdF9idWZmZXJbICAgIHN0ZXJlb19tb2RlXVtzLT5mZnRfb2Zmc2V0ICsgcy0+c3ViZnJhbWVfc2l6ZSAqIG9mZnNldCArIHBvc107CisgICAgcmVwdHIgPSAmcy0+ZmZ0X2J1ZmZlclsyICsgc3RlcmVvX21vZGVdW3MtPmZmdF9vZmZzZXQgKyBzLT5zdWJmcmFtZV9zaXplICogb2Zmc2V0ICsgcG9zXTsKKyAgICBwaW5kZXggPSAocGhhc2UgPDwgNikgLSAoKDIgKiAoZnJlcXMgPj4gKDQgLSBncm91cCkpICsgMSkgPDwgNyk7CisgICAgZm9yIChqID0gMDsgaiA8ICgxIDw8IChncm91cF9iaXRzICsgMSkpIC0gMTsgaisrKSB7CisgICAgICAgIHBpbmRleCArPSAoMiAqIGZyZXFzICsgMSkgPDwgKDcgLSBncm91cF9iaXRzKTsKKyAgICAgICAgbGV2ZWwgPSBhbXBsaXR1ZGUgKiBzLT5hbHRfc2luW2dyb3VwXVtqXTsKKyAgICAgICAgaW0gPSBsZXZlbCAqIHNpbl90YWJsZVsgcGluZGV4ICAgICAgICAmIDB4MUZGXTsKKyAgICAgICAgcmUgPSBsZXZlbCAqIHNpbl90YWJsZVsocGluZGV4ICsgMTI4KSAmIDB4MUZGXTsKKyAgICAgICAgaW1wdHJbMF0gKz0gaW07CisgICAgICAgIGltcHRyWzFdIC09IGltOworICAgICAgICByZXB0clswXSArPSByZTsKKyAgICAgICAgcmVwdHJbMV0gLT0gcmU7CisgICAgICAgIGltcHRyICs9IHMtPnN1YmZyYW1lX3NpemU7CisgICAgICAgIHJlcHRyICs9IHMtPnN1YmZyYW1lX3NpemU7CisgICAgICAgIGlmIChpbXB0ciA+PSAmcy0+ZmZ0X2J1ZmZlcltzdGVyZW9fbW9kZV1bMiAqIHMtPmZyYW1lX3NpemVdKSB7CisgICAgICAgICAgICBpbXB0ciA9ICZzLT5mZnRfYnVmZmVyWzAgKyBzdGVyZW9fbW9kZV1bcG9zXTsKKyAgICAgICAgICAgIHJlcHRyID0gJnMtPmZmdF9idWZmZXJbMiArIHN0ZXJlb19tb2RlXVtwb3NdOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRfd2F2ZTAoUURNQ0NvbnRleHQgKnMsIGludCBvZmZzZXQsIGludCBmcmVxcywgaW50IHN0ZXJlb19tb2RlLCBpbnQgYW1wLCBpbnQgcGhhc2UpCit7CisgICAgZmxvYXQgbGV2ZWwsIGltLCByZTsKKyAgICBpbnQgcG9zOworCisgICAgaWYgKHMtPm5iX2NoYW5uZWxzID09IDEpCisgICAgICAgIHN0ZXJlb19tb2RlID0gMDsKKworICAgIGxldmVsID0gYW1wbGl0dWRlX3RhYlthbXAgJiAweDNGXTsKKyAgICBpbSA9IGxldmVsICogc2luX3RhYmxlWyAocGhhc2UgPDwgNikgICAgICAgICYgMHgxRkZdOworICAgIHJlID0gbGV2ZWwgKiBzaW5fdGFibGVbKChwaGFzZSA8PCA2KSArIDEyOCkgJiAweDFGRl07CisgICAgcG9zID0gcy0+ZmZ0X29mZnNldCArIGZyZXFzICsgcy0+c3ViZnJhbWVfc2l6ZSAqIG9mZnNldDsKKyAgICBzLT5mZnRfYnVmZmVyWyAgICBzdGVyZW9fbW9kZV1bcG9zICAgIF0gKz0gaW07CisgICAgcy0+ZmZ0X2J1ZmZlclsyICsgc3RlcmVvX21vZGVdW3BvcyAgICBdICs9IHJlOworICAgIHMtPmZmdF9idWZmZXJbICAgIHN0ZXJlb19tb2RlXVtwb3MgKyAxXSAtPSBpbTsKKyAgICBzLT5mZnRfYnVmZmVyWzIgKyBzdGVyZW9fbW9kZV1bcG9zICsgMV0gLT0gcmU7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF93YXZlcyhRRE1DQ29udGV4dCAqcywgaW50IGN1cnJlbnRfc3ViZnJhbWUpCit7CisgICAgaW50IHcsIGc7CisKKyAgICBmb3IgKGcgPSAwOyBnIDwgNDsgZysrKSB7CisgICAgICAgIGZvciAodyA9IHMtPmN1cl90b25lW2ddOyB3IDwgcy0+bmJfdG9uZXNbZ107IHcrKykgeworICAgICAgICAgICAgUURNQ1RvbmUgKnQgPSAmcy0+dG9uZXNbZ11bd107CisKKyAgICAgICAgICAgIGlmIChjdXJyZW50X3N1YmZyYW1lIDwgdC0+b2Zmc2V0KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYWRkX3dhdmUocywgdC0+b2Zmc2V0LCB0LT5mcmVxLCBnLCB0LT5tb2RlLCB0LT5hbXBsaXR1ZGUsIHQtPnBoYXNlKTsKKyAgICAgICAgfQorICAgICAgICBzLT5jdXJfdG9uZVtnXSA9IHc7CisgICAgfQorICAgIGZvciAodyA9IHMtPmN1cl90b25lWzRdOyB3IDwgcy0+bmJfdG9uZXNbNF07IHcrKykgeworICAgICAgICBRRE1DVG9uZSAqdCA9ICZzLT50b25lc1s0XVt3XTsKKworICAgICAgICBpZiAoY3VycmVudF9zdWJmcmFtZSA8IHQtPm9mZnNldCkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhZGRfd2F2ZTAocywgdC0+b2Zmc2V0LCB0LT5mcmVxLCB0LT5tb2RlLCB0LT5hbXBsaXR1ZGUsIHQtPnBoYXNlKTsKKyAgICB9CisgICAgcy0+Y3VyX3RvbmVbNF0gPSB3OworfQorCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShRRE1DQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IsIGludDE2X3QgKm91dCkKK3sKKyAgICBpbnQgcmV0LCBjaCwgaSwgbjsKKworICAgIGlmIChza2lwX2xhYmVsKHMsIGdiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzLT5mZnRfb2Zmc2V0ID0gcy0+ZnJhbWVfc2l6ZSAtIHMtPmZmdF9vZmZzZXQ7CisgICAgcy0+YnVmZmVyX3B0ciA9ICZzLT5idWZmZXJbcy0+bmJfY2hhbm5lbHMgKiBzLT5idWZmZXJfb2Zmc2V0XTsKKworICAgIHJldCA9IHJlYWRfbm9pc2VfZGF0YShzLCBnYik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSByZWFkX3dhdmVfZGF0YShzLCBnYik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgMzI7IG4rKykgeworICAgICAgICBmbG9hdCAqcjsKKworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIGFkZF9ub2lzZShzLCBjaCwgbik7CisKKyAgICAgICAgYWRkX3dhdmVzKHMsIG4pOworCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+c3ViZnJhbWVfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgcy0+Y21wbHhbY2hdW2ldLnJlID0gcy0+ZmZ0X2J1ZmZlcltjaCArIDJdW3MtPmZmdF9vZmZzZXQgKyBuICogcy0+c3ViZnJhbWVfc2l6ZSArIGldOworICAgICAgICAgICAgICAgIHMtPmNtcGx4W2NoXVtpXS5pbSA9IHMtPmZmdF9idWZmZXJbY2ggKyAwXVtzLT5mZnRfb2Zmc2V0ICsgbiAqIHMtPnN1YmZyYW1lX3NpemUgKyBpXTsKKyAgICAgICAgICAgICAgICBzLT5jbXBseFtjaF1bcy0+c3ViZnJhbWVfc2l6ZSArIGldLnJlID0gMDsKKyAgICAgICAgICAgICAgICBzLT5jbXBseFtjaF1bcy0+c3ViZnJhbWVfc2l6ZSArIGldLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBzLT5mZnRfY3R4LmZmdF9wZXJtdXRlKCZzLT5mZnRfY3R4LCBzLT5jbXBseFtjaF0pOworICAgICAgICAgICAgcy0+ZmZ0X2N0eC5mZnRfY2FsYygmcy0+ZmZ0X2N0eCwgcy0+Y21wbHhbY2hdKTsKKyAgICAgICAgfQorCisgICAgICAgIHIgPSAmcy0+YnVmZmVyX3B0cltzLT5uYl9jaGFubmVscyAqIG4gKiBzLT5zdWJmcmFtZV9zaXplXTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDIgKiBzLT5zdWJmcmFtZV9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgKnIrKyArPSBzLT5jbXBseFtjaF1baV0ucmU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByID0gJnMtPmJ1ZmZlcl9wdHJbbiAqIHMtPnN1YmZyYW1lX3NpemUgKiBzLT5uYl9jaGFubmVsc107CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFubmVscyAqIHMtPnN1YmZyYW1lX3NpemU7IGkrKykgeworICAgICAgICAgICAgb3V0W2ldID0gYXZfY2xpcGYocltpXSwgSU5UMTZfTUlOLCBJTlQxNl9NQVgpOworICAgICAgICB9CisgICAgICAgIG91dCArPSBzLT5zdWJmcmFtZV9zaXplICogcy0+bmJfY2hhbm5lbHM7CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIG1lbXNldChzLT5mZnRfYnVmZmVyW2NoKzBdICsgcy0+ZmZ0X29mZnNldCArIG4gKiBzLT5zdWJmcmFtZV9zaXplLCAwLCA0ICogcy0+c3ViZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICBtZW1zZXQocy0+ZmZ0X2J1ZmZlcltjaCsyXSArIHMtPmZmdF9vZmZzZXQgKyBuICogcy0+c3ViZnJhbWVfc2l6ZSwgMCwgNCAqIHMtPnN1YmZyYW1lX3NpemUpOworICAgICAgICB9CisgICAgICAgIG1lbXNldChzLT5idWZmZXIgKyBzLT5uYl9jaGFubmVscyAqIChuICogcy0+c3ViZnJhbWVfc2l6ZSArIHMtPmZyYW1lX3NpemUgKyBzLT5idWZmZXJfb2Zmc2V0KSwgMCwgNCAqIHMtPnN1YmZyYW1lX3NpemUgKiBzLT5uYl9jaGFubmVscyk7CisgICAgfQorCisgICAgcy0+YnVmZmVyX29mZnNldCArPSBzLT5mcmFtZV9zaXplOworICAgIGlmIChzLT5idWZmZXJfb2Zmc2V0ID49IDMyNzY4IC0gcy0+ZnJhbWVfc2l6ZSkgeworICAgICAgICBtZW1jcHkocy0+YnVmZmVyLCAmcy0+YnVmZmVyW3MtPm5iX2NoYW5uZWxzICogcy0+YnVmZmVyX29mZnNldF0sIDQgKiBzLT5mcmFtZV9zaXplICogcy0+bmJfY2hhbm5lbHMpOworICAgICAgICBzLT5idWZmZXJfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBxZG1jX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBRRE1DQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBtZW1zZXQocy0+YnVmZmVyLCAwLCBzaXplb2Yocy0+YnVmZmVyKSk7CisgICAgbWVtc2V0KHMtPmZmdF9idWZmZXIsIDAsIHNpemVvZihzLT5mZnRfYnVmZmVyKSk7CisgICAgcy0+ZmZ0X29mZnNldCA9IDA7CisgICAgcy0+YnVmZmVyX29mZnNldCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcWRtY19kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBRRE1DQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgaW50IHJldDsKKworICAgIGlmICghYXZwa3QtPmRhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhdnBrdC0+c2l6ZSA8IHMtPmNoZWNrc3VtX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHMtPmZyYW1lX3NpemU7CisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBhdnBrdC0+ZGF0YSwgcy0+Y2hlY2tzdW1fc2l6ZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG1lbXNldChzLT5uYl90b25lcywgMCwgc2l6ZW9mKHMtPm5iX3RvbmVzKSk7CisgICAgbWVtc2V0KHMtPmN1cl90b25lLCAwLCBzaXplb2Yocy0+Y3VyX3RvbmUpKTsKKworICAgIHJldCA9IGRlY29kZV9mcmFtZShzLCAmZ2IsIChpbnQxNl90ICopZnJhbWUtPmRhdGFbMF0pOworICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisgICAgICAgIHJldHVybiBzLT5jaGVja3N1bV9zaXplOworICAgIH0KKyAgICBxZG1jX2ZsdXNoKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitBVkNvZGVjIGZmX3FkbWNfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJxZG1jIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJRRGVzaWduIE11c2ljIENvZGVjIDEiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1FETUMsCisgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoUURNQ0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgID0gcWRtY19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IHFkbWNfZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICAgID0gcWRtY19kZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgICAgPSBxZG1jX2ZsdXNoLAorICAgIC5jYXBhYmlsaXRpZXMgICAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3FkcncuYyBiL2xpYmF2Y29kZWMvcWRydy5jCmluZGV4IDBhMzFiNDEuLjgyY2M1MjggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcWRydy5jCisrKyBiL2xpYmF2Y29kZWMvcWRydy5jCkBAIC0zMywxMCArMzMsMTMgQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiBlbnVtIFF1aWNrZHJhd09wY29kZXMgeworICAgIENMSVAgPSAweDAwMDEsCiAgICAgUEFDS0JJVFNSRUNUID0gMHgwMDk4LAogICAgIFBBQ0tCSVRTUkdOLAogICAgIERJUkVDVEJJVFNSRUNULAogICAgIERJUkVDVEJJVFNSR04sCisgICAgU0hPUlRDT01NRU5UID0gMHgwMEEwLAorICAgIExPTkdDT01NRU5ULAogCiAgICAgRU9QID0gMHgwMEZGLAogfTsKQEAgLTU1LDYgKzU4LDggQEAKICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2JjLCA2KTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1BBTDgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgciA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiYyk7CiAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2JjLCAxKTsKICAgICAgICAgZyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiYyk7CkBAIC02Niw2ICs3MSwxNDggQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkZWNvZGVfcmxlX2JwcDIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCeXRlQ29udGV4dCAqZ2JjKQoreworICAgIGludCBvZmZzZXQgPSBhdmN0eC0+d2lkdGg7CisgICAgdWludDhfdCAqb3V0ZGF0YSA9IHAtPmRhdGFbMF07CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGludCBzaXplLCBsZWZ0LCBjb2RlLCBwaXg7CisgICAgICAgIHVpbnQ4X3QgKm91dCA9IG91dGRhdGE7CisgICAgICAgIGludCBwb3MgPSAwOworCisgICAgICAgIC8qIHNpemUgb2YgcGFja2VkIGxpbmUgKi8KKyAgICAgICAgaWYgKG9mZnNldCAvIDQgPiAyMDApCisgICAgICAgICAgICBzaXplID0gbGVmdCA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNpemUgPSBsZWZ0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2JjKTsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiYykgPCBzaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgLyogZGVjb2RlIGxpbmUgKi8KKyAgICAgICAgd2hpbGUgKGxlZnQgPiAwKSB7CisgICAgICAgICAgICBjb2RlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2JjKTsKKyAgICAgICAgICAgIGlmIChjb2RlICYgMHg4MCApIHsgLyogcnVuICovCisgICAgICAgICAgICAgICAgcGl4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2JjKTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU3IC0gY29kZTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcG9zKytdID0gKHBpeCAmIDB4QzApID4+IDY7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcG9zKytdID0gKHBpeCAmIDB4MzApID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcG9zKytdID0gKHBpeCAmIDB4MEMpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcG9zKytdID0gKHBpeCAmIDB4MDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZWZ0ICAtPSAyOworICAgICAgICAgICAgfSBlbHNlIHsgLyogY29weSAqLworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlICsgMTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeCA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcG9zKytdID0gKHBpeCAmIDB4QzApID4+IDY7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcG9zKytdID0gKHBpeCAmIDB4MzApID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcG9zKytdID0gKHBpeCAmIDB4MEMpID4+IDI7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbcG9zKytdID0gKHBpeCAmIDB4MDMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZWZ0ICAtPSAxICsgKGNvZGUgKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXRkYXRhICs9IHAtPmxpbmVzaXplWzBdOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfcmxlX2JwcDQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCeXRlQ29udGV4dCAqZ2JjKQoreworICAgIGludCBvZmZzZXQgPSBhdmN0eC0+d2lkdGg7CisgICAgdWludDhfdCAqb3V0ZGF0YSA9IHAtPmRhdGFbMF07CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmhlaWdodDsgaSsrKSB7CisgICAgICAgIGludCBzaXplLCBsZWZ0LCBjb2RlLCBwaXg7CisgICAgICAgIHVpbnQ4X3QgKm91dCA9IG91dGRhdGE7CisgICAgICAgIGludCBwb3MgPSAwOworCisgICAgICAgIC8qIHNpemUgb2YgcGFja2VkIGxpbmUgKi8KKyAgICAgICAgc2l6ZSA9IGxlZnQgPSBieXRlc3RyZWFtMl9nZXRfYmUxNihnYmMpOworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2JjKSA8IHNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAvKiBkZWNvZGUgbGluZSAqLworICAgICAgICB3aGlsZSAobGVmdCA+IDApIHsKKyAgICAgICAgICAgIGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYmMpOworICAgICAgICAgICAgaWYgKGNvZGUgJiAweDgwICkgeyAvKiBydW4gKi8KKyAgICAgICAgICAgICAgICBwaXggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYmMpOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTcgLSBjb2RlOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFtwb3MrK10gPSAocGl4ICYgMHhGMCkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFtwb3MrK10gPSBwaXggJiAweEY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlZnQgIC09IDI7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBjb3B5ICovCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGUgKyAxOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2JjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFtwb3MrK10gPSAocGl4ICYgMHhGMCkgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFtwb3MrK10gPSBwaXggJiAweEY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlZnQgIC09IDEgKyAoY29kZSArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dGRhdGEgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV9ybGUxNihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJ5dGVDb250ZXh0ICpnYmMpCit7CisgICAgaW50IG9mZnNldCA9IGF2Y3R4LT53aWR0aDsKKyAgICB1aW50OF90ICpvdXRkYXRhID0gcC0+ZGF0YVswXTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgaW50IHNpemUsIGxlZnQsIGNvZGUsIHBpeDsKKyAgICAgICAgdWludDE2X3QgKm91dCA9ICh1aW50MTZfdCAqKW91dGRhdGE7CisgICAgICAgIGludCBwb3MgPSAwOworCisgICAgICAgIC8qIHNpemUgb2YgcGFja2VkIGxpbmUgKi8KKyAgICAgICAgc2l6ZSA9IGxlZnQgPSBieXRlc3RyZWFtMl9nZXRfYmUxNihnYmMpOworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2JjKSA8IHNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAvKiBkZWNvZGUgbGluZSAqLworICAgICAgICB3aGlsZSAobGVmdCA+IDApIHsKKyAgICAgICAgICAgIGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYmMpOworICAgICAgICAgICAgaWYgKGNvZGUgJiAweDgwICkgeyAvKiBydW4gKi8KKyAgICAgICAgICAgICAgICBwaXggPSBieXRlc3RyZWFtMl9nZXRfYmUxNihnYmMpOworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTcgLSBjb2RlOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvcyA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0W3BvcysrXSA9IHBpeDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZWZ0ICAtPSAzOworICAgICAgICAgICAgfSBlbHNlIHsgLyogY29weSAqLworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjb2RlICsgMTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFtwb3MrK10gPSBieXRlc3RyZWFtMl9nZXRfYmUxNihnYmMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYmMsIDIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlZnQgIC09IDEgKyAoY29kZSArIDEpICogMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvdXRkYXRhICs9IHAtPmxpbmVzaXplWzBdOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBkZWNvZGVfcmxlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qnl0ZUNvbnRleHQgKmdiYywKICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCkKIHsKQEAgLTg5LDI2ICsyMzYsMjUgQEAKICAgICAgICAgICAgIGlmIChjb2RlICYgMHg4MCApIHsgLyogcnVuICovCiAgICAgICAgICAgICAgICAgcGl4ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2JjKTsKICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjU3IC0gY29kZTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dFtwb3NdID0gcGl4OworICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0W3Bvc10gPSBwaXg7CiAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBzdGVwOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IG9mZnNldCAmJiBzdGVwID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcG9zIC09IG9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGxlZnQgIC09IDI7CiAgICAgICAgICAgICB9IGVsc2UgeyAvKiBjb3B5ICovCiAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvZGUgKyAxOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0W3Bvc10gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYmMpOworICAgICAgICAgICAgICAgICAgICBwaXggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYmMpOworICAgICAgICAgICAgICAgICAgICBpZiAocG9zIDwgb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0W3Bvc10gPSBwaXg7CiAgICAgICAgICAgICAgICAgICAgIHBvcyArPSBzdGVwOwotICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9zID49IG9mZnNldCAmJiBzdGVwID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcG9zIC09IG9mZnNldDsKICAgICAgICAgICAgICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3MgPj0gb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGxlZnQgIC09IDIgKyBjb2RlOwogICAgICAgICAgICAgfQpAQCAtMTkyLDYgKzMzOCw5IEBACiAgICAgICAgIGludCBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2JjKTsKIAogICAgICAgICBzd2l0Y2gob3Bjb2RlKSB7CisgICAgICAgIGNhc2UgQ0xJUDoKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiYywgMTApOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgUEFDS0JJVFNSRUNUOgogICAgICAgICBjYXNlIFBBQ0tCSVRTUkdOOgogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJQYXJzaW5nIFBhY2tiaXQgb3Bjb2RlXG4iKTsKQEAgLTIwMyw2ICszNTIsMTAgQEAKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiYnBwY291bnQgJWQgYnBwICVkXG4iLCBicHBjbnQsIGJwcCk7CiAgICAgICAgICAgICBpZiAoYnBwY250ID09IDEgJiYgYnBwID09IDgpIHsKICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYnBwY250ID09IDEgJiYgKGJwcCA9PSA0IHx8IGJwcCA9PSAyKSkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgICAgICAgICAgfSBlbHNlIGlmIChicHBjbnQgPT0gMyAmJiBicHAgPT0gNSkgeworICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NTU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBwaXhlbCBmb3JtYXQgKGJwcGNudCAlZCBicHAgJWQpIGluIFBhY2tiaXRcbiIsCkBAIC0yMjcsNyArMzgwLDkgQEAKICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcCwgMCkpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgICAgICBwYXJzZV9wYWxldHRlKGF2Y3R4LCAmZ2JjLCAodWludDMyX3QgKilwLT5kYXRhWzFdLCBjb2xvcnMpOworICAgICAgICAgICAgcmV0ID0gcGFyc2VfcGFsZXR0ZShhdmN0eCwgJmdiYywgKHVpbnQzMl90ICopcC0+ZGF0YVsxXSwgY29sb3JzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICBwLT5wYWxldHRlX2hhc19jaGFuZ2VkID0gMTsKIAogICAgICAgICAgICAgLyoganVtcCB0byBpbWFnZSBkYXRhICovCkBAIC0yMzgsNyArMzkzLDE0IEBACiAgICAgICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJQYWNrYml0IG1hc2sgcmVnaW9uIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldCA9IGRlY29kZV9ybGUoYXZjdHgsIHAsICZnYmMsIGJwcGNudCk7CisgICAgICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I1NTUpCisgICAgICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3JsZTE2KGF2Y3R4LCBwLCAmZ2JjKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJwcCA9PSAyKQorICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZV9ybGVfYnBwMihhdmN0eCwgcCwgJmdiYyk7CisgICAgICAgICAgICBlbHNlIGlmIChicHAgPT0gNCkKKyAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfcmxlX2JwcDQoYXZjdHgsIHAsICZnYmMpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZV9ybGUoYXZjdHgsIHAsICZnYmMsIGJwcGNudCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgKmdvdF9mcmFtZSA9IDE7CkBAIC0yNTQsNyArNDE2LDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYmMsIDEwKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiYywgNCk7CisgICAgICAgICAgICBoID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiYyk7CisgICAgICAgICAgICB3ID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiYyk7CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYmMsIDIpOworCisgICAgICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgdywgaCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCiAgICAgICAgICAgICBwYWNrX3R5cGUgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2JjKTsKIAogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2JjLCAxNik7CkBAIC0yNjQsNiArNDM0LDggQEAKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiYnBwY291bnQgJWQgYnBwICVkXG4iLCBicHBjbnQsIGJwcCk7CiAgICAgICAgICAgICBpZiAoYnBwY250ID09IDMgJiYgYnBwID09IDgpIHsKICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJwcGNudCA9PSAzICYmIGJwcCA9PSA1IHx8IGJwcGNudCA9PSAyICYmIGJwcCA9PSA4KSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjU1NTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYnBwY250ID09IDQgJiYgYnBwID09IDgpIHsKICAgICAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQVJHQjsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yODEsMTAgKzQ1Myw4IEBACiAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiUGFjayB0eXBlICVkIiwgcGFja190eXBlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImdldF9idWZmZXIoKSBmYWlsZWRcbiIpOworICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIGp1bXAgdG8gZGF0YSAqLwogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmZ2JjLCAzMCk7CkBAIC0yOTQsMTEgKzQ2NCwxOCBAQAogICAgICAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiRGlyZWN0Qml0IG1hc2sgcmVnaW9uIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldCA9IGRlY29kZV9ybGUoYXZjdHgsIHAsICZnYmMsIGJwcGNudCk7CisgICAgICAgICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I1NTUpCisgICAgICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3JsZTE2KGF2Y3R4LCBwLCAmZ2JjKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfcmxlKGF2Y3R4LCBwLCAmZ2JjLCBicHBjbnQpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICpnb3RfZnJhbWUgPSAxOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTE9OR0NPTU1FTlQ6CisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2JjKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiYywgYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiYykpOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19UUkFDRSwgIlVua25vd24gMHglMDRYIG9wY29kZVxuIiwgb3Bjb2RlKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xcGVnLmMgYi9saWJhdmNvZGVjL3FwZWcuYwppbmRleCA5ZWFmOWI4Li4xMGI1NWQyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3FwZWcuYworKysgYi9saWJhdmNvZGVjL3FwZWcuYwpAQCAtOTAsNiArOTAsOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcWN0eC0+YnVmZmVyKSA8IGNvcHkpCisgICAgICAgICAgICAgICAgY29weSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZxY3R4LT5idWZmZXIpOwogICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgY29weTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgZHN0W2ZpbGxlZCsrXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZxY3R4LT5idWZmZXIpOwogICAgICAgICAgICAgICAgIGlmIChmaWxsZWQgPj0gd2lkdGgpIHsKQEAgLTE2Niw3ICsxNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoKG1lX3ggKyBmaWxsZWQgPCAwKSB8fCAobWVfeCArIG1lX3cgKyBmaWxsZWQgPiB3aWR0aCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKGhlaWdodCAtIG1lX3kgLSBtZV9oIDwgMCkgfHwgKGhlaWdodCAtIG1lX3kgPj0gb3JpZ19oZWlnaHQpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChmaWxsZWQgKyBtZV93ID4gd2lkdGgpIHx8IChoZWlnaHQgLSBtZV9oIDwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQm9ndXMgbW90aW9uIHZlY3RvciAoJWksJWkpLCBibG9jayBzaXplICVpeCVpIGF0ICVpLCVpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHFjdHgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJCb2d1cyBtb3Rpb24gdmVjdG9yICglaSwlaSksIGJsb2NrIHNpemUgJWl4JWkgYXQgJWksJWlcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVfeCwgbWVfeSwgbWVfdywgbWVfaCwgZmlsbGVkLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIG1vdGlvbiBjb21wZW5zYXRpb24gKi8KQEAgLTI2MCw3ICsyNjIsOCBAQAogICAgIEFWRnJhbWUgKiBjb25zdCByZWYgPSBhLT5yZWY7CiAgICAgdWludDhfdCogb3V0ZGF0YTsKICAgICBpbnQgZGVsdGEsIHJldDsKLSAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisgICAgaW50IHBhbF9zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKnBhbCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCAmcGFsX3NpemUpOwogCiAgICAgaWYgKGF2cGt0LT5zaXplIDwgMHg4NikgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBpcyB0b28gc21hbGxcbiIpOwpAQCAtMjg3LDkgKzI5MCwxMSBAQAogICAgIH0KIAogICAgIC8qIG1ha2UgdGhlIHBhbGV0dGUgYXZhaWxhYmxlIG9uIHRoZSB3YXkgb3V0ICovCi0gICAgaWYgKHBhbCkgeworICAgIGlmIChwYWwgJiYgcGFsX3NpemUgPT0gQVZQQUxFVFRFX1NJWkUpIHsKICAgICAgICAgcC0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CiAgICAgICAgIG1lbWNweShhLT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgIH0gZWxzZSBpZiAocGFsKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFsZXR0ZSBzaXplICVkIGlzIHdyb25nXG4iLCBwYWxfc2l6ZSk7CiAgICAgfQogICAgIG1lbWNweShwLT5kYXRhWzFdLCBhLT5wYWwsIEFWUEFMRVRURV9TSVpFKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xc3YuYyBiL2xpYmF2Y29kZWMvcXN2LmMKaW5kZXggNGM4ZTZiMC4uNDVlMWMyNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9xc3YuYworKysgYi9saWJhdmNvZGVjL3Fzdi5jCkBAIC0yMCwxNiArMjAsMjUgQEAKIAogI2luY2x1ZGUgPG1meC9tZnh2aWRlby5oPgogI2luY2x1ZGUgPG1meC9tZnhwbHVnaW4uaD4KKyNpbmNsdWRlIDxtZngvbWZ4anBlZy5oPgogCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dF9xc3YuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJxc3ZfaW50ZXJuYWwuaCIKIAorI2lmIFFTVl9WRVJTSU9OX0FUTEVBU1QoMSwgMTIpCisjaW5jbHVkZSAibWZ4L21meHZwOC5oIgorI2VuZGlmCisKIGludCBmZl9xc3ZfY29kZWNfaWRfdG9fbWZ4KGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKQogewogICAgIHN3aXRjaCAoY29kZWNfaWQpIHsKQEAgLTQ0LDYgKzUzLDEyIEBACiAgICAgICAgIHJldHVybiBNRlhfQ09ERUNfTVBFRzI7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9WQzE6CiAgICAgICAgIHJldHVybiBNRlhfQ09ERUNfVkMxOworI2lmIFFTVl9WRVJTSU9OX0FUTEVBU1QoMSwgMTIpCisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDg6CisgICAgICAgIHJldHVybiBNRlhfQ09ERUNfVlA4OworI2VuZGlmCisgICAgY2FzZSBBVl9DT0RFQ19JRF9NSlBFRzoKKyAgICAgICAgcmV0dXJuIE1GWF9DT0RFQ19KUEVHOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTUxLDEyNCArNjYsMjExIEBACiAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKIH0KIAotaW50IGZmX3Fzdl9lcnJvcihpbnQgbWZ4X2VycikKK2ludCBmZl9xc3ZfcHJvZmlsZV90b19tZngoZW51bSBBVkNvZGVjSUQgY29kZWNfaWQsIGludCBwcm9maWxlKQogewotICAgIHN3aXRjaCAobWZ4X2VycikgewotICAgIGNhc2UgTUZYX0VSUl9OT05FOgotICAgICAgICByZXR1cm4gMDsKLSAgICBjYXNlIE1GWF9FUlJfTUVNT1JZX0FMTE9DOgotICAgIGNhc2UgTUZYX0VSUl9OT1RfRU5PVUdIX0JVRkZFUjoKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBjYXNlIE1GWF9FUlJfSU5WQUxJRF9IQU5ETEU6Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgY2FzZSBNRlhfRVJSX0RFVklDRV9GQUlMRUQ6Ci0gICAgY2FzZSBNRlhfRVJSX0RFVklDRV9MT1NUOgotICAgIGNhc2UgTUZYX0VSUl9MT0NLX01FTU9SWToKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKLSAgICBjYXNlIE1GWF9FUlJfTlVMTF9QVFI6Ci0gICAgY2FzZSBNRlhfRVJSX1VOREVGSU5FRF9CRUhBVklPUjoKLSAgICBjYXNlIE1GWF9FUlJfTk9UX0lOSVRJQUxJWkVEOgotICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7Ci0gICAgY2FzZSBNRlhfRVJSX1VOU1VQUE9SVEVEOgotICAgIGNhc2UgTUZYX0VSUl9OT1RfRk9VTkQ6Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Ci0gICAgY2FzZSBNRlhfRVJSX01PUkVfREFUQToKLSAgICBjYXNlIE1GWF9FUlJfTU9SRV9TVVJGQUNFOgotICAgIGNhc2UgTUZYX0VSUl9NT1JFX0JJVFNUUkVBTToKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKLSAgICBjYXNlIE1GWF9FUlJfSU5DT01QQVRJQkxFX1ZJREVPX1BBUkFNOgotICAgIGNhc2UgTUZYX0VSUl9JTlZBTElEX1ZJREVPX1BBUkFNOgotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIGNhc2UgTUZYX0VSUl9BQk9SVEVEOgotICAgIGNhc2UgTUZYX0VSUl9VTktOT1dOOgorICAgIGlmIChwcm9maWxlID09IEZGX1BST0ZJTEVfVU5LTk9XTikKKyAgICAgICAgcmV0dXJuIE1GWF9QUk9GSUxFX1VOS05PV047CisgICAgc3dpdGNoIChjb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6CisgICAgICAgIHJldHVybiBwcm9maWxlOworICAgIGNhc2UgQVZfQ09ERUNfSURfVkMxOgorICAgICAgICByZXR1cm4gNCAqIHByb2ZpbGUgKyAxOworICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzJWSURFTzoKKyAgICAgICAgcmV0dXJuIDB4MTAgKiBwcm9maWxlOworICAgIH0KKyAgICByZXR1cm4gTUZYX1BST0ZJTEVfVU5LTk9XTjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgbWZ4U3RhdHVzICAgbWZ4ZXJyOworICAgIGludCAgICAgICAgIGF2ZXJyOworICAgIGNvbnN0IGNoYXIgKmRlc2M7Cit9IHFzdl9lcnJvcnNbXSA9IHsKKyAgICB7IE1GWF9FUlJfTk9ORSwgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICJzdWNjZXNzIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBNRlhfRVJSX1VOS05PV04sICAgICAgICAgICAgICAgICAgQVZFUlJPUl9VTktOT1dOLCAidW5rbm93biBlcnJvciIgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgTUZYX0VSUl9OVUxMX1BUUiwgICAgICAgICAgICAgICAgIEFWRVJST1IoRUlOVkFMKSwgIk5VTEwgcG9pbnRlciIgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IE1GWF9FUlJfVU5TVVBQT1JURUQsICAgICAgICAgICAgICBBVkVSUk9SKEVOT1NZUyksICJ1bnN1cHBvcnRlZCIgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBNRlhfRVJSX01FTU9SWV9BTExPQywgICAgICAgICAgICAgQVZFUlJPUihFTk9NRU0pLCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSIgICAgICAgICAgICB9LAorICAgIHsgTUZYX0VSUl9OT1RfRU5PVUdIX0JVRkZFUiwgICAgICAgIEFWRVJST1IoRU5PTUVNKSwgImluc3VmZmljaWVudCBpbnB1dC9vdXRwdXQgYnVmZmVyIiAgICAgfSwKKyAgICB7IE1GWF9FUlJfSU5WQUxJRF9IQU5ETEUsICAgICAgICAgICBBVkVSUk9SKEVJTlZBTCksICJpbnZhbGlkIGhhbmRsZSIgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBNRlhfRVJSX0xPQ0tfTUVNT1JZLCAgICAgICAgICAgICAgQVZFUlJPUihFSU8pLCAgICAiZmFpbGVkIHRvIGxvY2sgdGhlIG1lbW9yeSBibG9jayIgICAgICB9LAorICAgIHsgTUZYX0VSUl9OT1RfSU5JVElBTElaRUQsICAgICAgICAgIEFWRVJST1JfQlVHLCAgICAgIm5vdCBpbml0aWFsaXplZCIgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IE1GWF9FUlJfTk9UX0ZPVU5ELCAgICAgICAgICAgICAgICBBVkVSUk9SKEVOT1NZUyksICJzcGVjaWZpZWQgb2JqZWN0IHdhcyBub3QgZm91bmQiICAgICAgIH0sCisgICAgLyogdGhlIGZvbGxvd2luZyAzIGVycm9ycyBzaG91bGQgYWx3YXlzIGJlIGhhbmRsZWQgZXhwbGljaXRseSwgc28gdGhvc2UgIm1hcHBpbmdzIgorICAgICAqIGFyZSBmb3IgY29tcGxldGVuZXNzIG9ubHkgKi8KKyAgICB7IE1GWF9FUlJfTU9SRV9EQVRBLCAgICAgICAgICAgICAgICBBVkVSUk9SX1VOS05PV04sICJleHBlY3QgbW9yZSBkYXRhIGF0IGlucHV0IiAgICAgICAgICAgIH0sCisgICAgeyBNRlhfRVJSX01PUkVfU1VSRkFDRSwgICAgICAgICAgICAgQVZFUlJPUl9VTktOT1dOLCAiZXhwZWN0IG1vcmUgc3VyZmFjZSBhdCBvdXRwdXQiICAgICAgICB9LAorICAgIHsgTUZYX0VSUl9NT1JFX0JJVFNUUkVBTSwgICAgICAgICAgIEFWRVJST1JfVU5LTk9XTiwgImV4cGVjdCBtb3JlIGJpdHN0cmVhbSBhdCBvdXRwdXQiICAgICAgfSwKKyAgICB7IE1GWF9FUlJfQUJPUlRFRCwgICAgICAgICAgICAgICAgICBBVkVSUk9SX1VOS05PV04sICJvcGVyYXRpb24gYWJvcnRlZCIgICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBNRlhfRVJSX0RFVklDRV9MT1NULCAgICAgICAgICAgICAgQVZFUlJPUihFSU8pLCAgICAiZGV2aWNlIGxvc3QiICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgTUZYX0VSUl9JTkNPTVBBVElCTEVfVklERU9fUEFSQU0sIEFWRVJST1IoRUlOVkFMKSwgImluY29tcGF0aWJsZSB2aWRlbyBwYXJhbWV0ZXJzIiAgICAgICAgfSwKKyAgICB7IE1GWF9FUlJfSU5WQUxJRF9WSURFT19QQVJBTSwgICAgICBBVkVSUk9SKEVJTlZBTCksICJpbnZhbGlkIHZpZGVvIHBhcmFtZXRlcnMiICAgICAgICAgICAgIH0sCisgICAgeyBNRlhfRVJSX1VOREVGSU5FRF9CRUhBVklPUiwgICAgICAgQVZFUlJPUl9CVUcsICAgICAidW5kZWZpbmVkIGJlaGF2aW9yIiAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgTUZYX0VSUl9ERVZJQ0VfRkFJTEVELCAgICAgICAgICAgIEFWRVJST1IoRUlPKSwgICAgImRldmljZSBmYWlsZWQiICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IE1GWF9FUlJfSU5DT01QQVRJQkxFX0FVRElPX1BBUkFNLCBBVkVSUk9SKEVJTlZBTCksICJpbmNvbXBhdGlibGUgYXVkaW8gcGFyYW1ldGVycyIgICAgICAgIH0sCisgICAgeyBNRlhfRVJSX0lOVkFMSURfQVVESU9fUEFSQU0sICAgICAgQVZFUlJPUihFSU5WQUwpLCAiaW52YWxpZCBhdWRpbyBwYXJhbWV0ZXJzIiAgICAgICAgICAgICB9LAorCisgICAgeyBNRlhfV1JOX0lOX0VYRUNVVElPTiwgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAib3BlcmF0aW9uIGluIGV4ZWN1dGlvbiIgICAgICAgICAgICAgICB9LAorICAgIHsgTUZYX1dSTl9ERVZJQ0VfQlVTWSwgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgImRldmljZSBidXN5IiAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IE1GWF9XUk5fVklERU9fUEFSQU1fQ0hBTkdFRCwgICAgICAwLCAgICAgICAgICAgICAgICJ2aWRlbyBwYXJhbWV0ZXJzIGNoYW5nZWQiICAgICAgICAgICAgIH0sCisgICAgeyBNRlhfV1JOX1BBUlRJQUxfQUNDRUxFUkFUSU9OLCAgICAgMCwgICAgICAgICAgICAgICAicGFydGlhbCBhY2NlbGVyYXRpb24iICAgICAgICAgICAgICAgICB9LAorICAgIHsgTUZYX1dSTl9JTkNPTVBBVElCTEVfVklERU9fUEFSQU0sIDAsICAgICAgICAgICAgICAgImluY29tcGF0aWJsZSB2aWRlbyBwYXJhbWV0ZXJzIiAgICAgICAgfSwKKyAgICB7IE1GWF9XUk5fVkFMVUVfTk9UX0NIQU5HRUQsICAgICAgICAwLCAgICAgICAgICAgICAgICJ2YWx1ZSBpcyBzYXR1cmF0ZWQiICAgICAgICAgICAgICAgICAgIH0sCisgICAgeyBNRlhfV1JOX09VVF9PRl9SQU5HRSwgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAidmFsdWUgb3V0IG9mIHJhbmdlIiAgICAgICAgICAgICAgICAgICB9LAorICAgIHsgTUZYX1dSTl9GSUxURVJfU0tJUFBFRCwgICAgICAgICAgIDAsICAgICAgICAgICAgICAgImZpbHRlciBza2lwcGVkIiAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICB7IE1GWF9XUk5fSU5DT01QQVRJQkxFX0FVRElPX1BBUkFNLCAwLCAgICAgICAgICAgICAgICJpbmNvbXBhdGlibGUgYXVkaW8gcGFyYW1ldGVycyIgICAgICAgIH0sCit9OworCitpbnQgZmZfcXN2X21hcF9lcnJvcihtZnhTdGF0dXMgbWZ4X2VyciwgY29uc3QgY2hhciAqKmRlc2MpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHFzdl9lcnJvcnMpOyBpKyspIHsKKyAgICAgICAgaWYgKHFzdl9lcnJvcnNbaV0ubWZ4ZXJyID09IG1meF9lcnIpIHsKKyAgICAgICAgICAgIGlmIChkZXNjKQorICAgICAgICAgICAgICAgICpkZXNjID0gcXN2X2Vycm9yc1tpXS5kZXNjOworICAgICAgICAgICAgcmV0dXJuIHFzdl9lcnJvcnNbaV0uYXZlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlc2MpCisgICAgICAgICpkZXNjID0gInVua25vd24gZXJyb3IiOworICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Cit9CisKK2ludCBmZl9xc3ZfcHJpbnRfZXJyb3Iodm9pZCAqbG9nX2N0eCwgbWZ4U3RhdHVzIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3Jfc3RyaW5nKQoreworICAgIGNvbnN0IGNoYXIgKmRlc2M7CisgICAgaW50IHJldDsKKyAgICByZXQgPSBmZl9xc3ZfbWFwX2Vycm9yKGVyciwgJmRlc2MpOworICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICIlczogJXMgKCVkKVxuIiwgZXJyb3Jfc3RyaW5nLCBkZXNjLCBlcnIpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9xc3ZfcHJpbnRfd2FybmluZyh2b2lkICpsb2dfY3R4LCBtZnhTdGF0dXMgZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKndhcm5pbmdfc3RyaW5nKQoreworICAgIGNvbnN0IGNoYXIgKmRlc2M7CisgICAgaW50IHJldDsKKyAgICByZXQgPSBmZl9xc3ZfbWFwX2Vycm9yKGVyciwgJmRlc2MpOworICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfV0FSTklORywgIiVzOiAlcyAoJWQpXG4iLCB3YXJuaW5nX3N0cmluZywgZGVzYywgZXJyKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IHFzdl9tYXBfZm91cmNjKHVpbnQzMl90IGZvdXJjYykKK3sKKyAgICBzd2l0Y2ggKGZvdXJjYykgeworICAgIGNhc2UgTUZYX0ZPVVJDQ19OVjEyOiByZXR1cm4gQVZfUElYX0ZNVF9OVjEyOworICAgIGNhc2UgTUZYX0ZPVVJDQ19QMDEwOiByZXR1cm4gQVZfUElYX0ZNVF9QMDEwOworICAgIGNhc2UgTUZYX0ZPVVJDQ19QODogICByZXR1cm4gQVZfUElYX0ZNVF9QQUw4OworICAgIH0KKyAgICByZXR1cm4gQVZfUElYX0ZNVF9OT05FOworfQorCitpbnQgZmZfcXN2X21hcF9waXhmbXQoZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgKmZvdXJjYykKK3sKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDIwUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfTlYxMjoKKyAgICAgICAgKmZvdXJjYyA9IE1GWF9GT1VSQ0NfTlYxMjsKKyAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfTlYxMjsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9QMDEwOgorICAgICAgICAqZm91cmNjID0gTUZYX0ZPVVJDQ19QMDEwOworICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9QMDEwOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgfQogfQotc3RhdGljIGludCBmZl9xc3Zfc2V0X2Rpc3BsYXlfaGFuZGxlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWU2Vzc2lvbiAqcXMpCisKK2ludCBmZl9xc3ZfZmluZF9zdXJmYWNlX2lkeChRU1ZGcmFtZXNDb250ZXh0ICpjdHgsIFFTVkZyYW1lICpmcmFtZSkKIHsKLSAgICAvLyB0aGlzIGNvZGUgaXMgb25seSByZXF1aXJlZCBmb3IgTGludXguICBJdCBzZWFyY2hlcyBmb3IgYSB2YWxpZAotICAgIC8vIGRpc3BsYXkgaGFuZGxlLiAgRmlyc3QgaW4gL2Rldi9kcmkvcmVuZGVyRCB0aGVuIGluIC9kZXYvZHJpL2NhcmQKLSNpZmRlZiBBVkNPREVDX1FTVl9MSU5VWF9TRVNTSU9OX0hBTkRMRQotICAgIC8vIFZBQVBJIGRpc3BsYXkgaGFuZGxlCi0gICAgaW50IHJldCA9IDA7Ci0gICAgVkFEaXNwbGF5IHZhX2RweSA9IE5VTEw7Ci0gICAgVkFTdGF0dXMgdmFfcmVzID0gVkFfU1RBVFVTX1NVQ0NFU1M7Ci0gICAgaW50IG1ham9yX3ZlcnNpb24gPSAwLCBtaW5vcl92ZXJzaW9uID0gMDsKLSAgICBpbnQgZmQgPSAtMTsKLSAgICBjaGFyIGFkYXB0ZXJwYXRoWzI1Nl07Ci0gICAgaW50IGFkYXB0ZXJfbnVtOwotCi0gICAgcXMtPmZkX2Rpc3BsYXkgPSAtMTsKLSAgICBxcy0+dmFfZGlzcGxheSA9IE5VTEw7Ci0KLSAgICAvL3NlYXJjaCBmb3IgdmFsaWQgZ3JhcGhpY3MgZGV2aWNlCi0gICAgZm9yIChhZGFwdGVyX251bSA9IDA7YWRhcHRlcl9udW0gPCA2O2FkYXB0ZXJfbnVtKyspIHsKLQotICAgICAgICBpZiAoYWRhcHRlcl9udW08MykgewotICAgICAgICAgICAgc25wcmludGYoYWRhcHRlcnBhdGgsc2l6ZW9mKGFkYXB0ZXJwYXRoKSwKLSAgICAgICAgICAgICAgICAiL2Rldi9kcmkvcmVuZGVyRCVkIiwgYWRhcHRlcl9udW0rMTI4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGFkYXB0ZXJwYXRoLHNpemVvZihhZGFwdGVycGF0aCksCi0gICAgICAgICAgICAgICAgIi9kZXYvZHJpL2NhcmQlZCIsIGFkYXB0ZXJfbnVtLTMpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmQgPSBvcGVuKGFkYXB0ZXJwYXRoLCBPX1JEV1IpOwotICAgICAgICBpZiAoZmQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAibWZ4IGluaXQ6ICVzIGZkIG9wZW4gZmFpbGVkXG4iLCBhZGFwdGVycGF0aCk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhX2RweSA9IHZhR2V0RGlzcGxheURSTShmZCk7Ci0gICAgICAgIGlmICghdmFfZHB5KSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAibWZ4IGluaXQ6ICVzIHZhR2V0RGlzcGxheURSTSBmYWlsZWRcbiIsIGFkYXB0ZXJwYXRoKTsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdmFfcmVzID0gdmFJbml0aWFsaXplKHZhX2RweSwgJm1ham9yX3ZlcnNpb24sICZtaW5vcl92ZXJzaW9uKTsKLSAgICAgICAgaWYgKFZBX1NUQVRVU19TVUNDRVNTICE9IHZhX3JlcykgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgIm1meCBpbml0OiAlcyB2YUluaXRpYWxpemUgZmFpbGVkXG4iLCBhZGFwdGVycGF0aCk7Ci0gICAgICAgICAgICBjbG9zZShmZCk7Ci0gICAgICAgICAgICBmZCA9IC0xOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLAotICAgICAgICAgICAgIm1meCBpbml0aWFsaXphdGlvbjogJXMgdmFJbml0aWFsaXplIHN1Y2Nlc3NmdWxcbiIsYWRhcHRlcnBhdGgpOwotICAgICAgICAgICAgcXMtPmZkX2Rpc3BsYXkgPSBmZDsKLSAgICAgICAgICAgIHFzLT52YV9kaXNwbGF5ID0gdmFfZHB5OwotICAgICAgICAgICAgcmV0ID0gTUZYVmlkZW9DT1JFX1NldEhhbmRsZShxcy0+c2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgIChtZnhIYW5kbGVUeXBlKU1GWF9IQU5ETEVfVkFfRElTUExBWSwgKG1meEhETCl2YV9kcHkpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAiRXJyb3IgJWQgZHVyaW5nIHNldCBkaXNwbGF5IGhhbmRsZVxuIiwgcmV0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmZfcXN2X2Vycm9yKHJldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX21pZHM7IGkrKykgeworICAgICAgICBRU1ZNaWQgKm1pZCA9ICZjdHgtPm1pZHNbaV07CisgICAgICAgIGlmIChtaWQtPmhhbmRsZSA9PSBmcmFtZS0+c3VyZmFjZS5EYXRhLk1lbUlkKQorICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgfQotI2VuZGlmIC8vQVZDT0RFQ19RU1ZfTElOVVhfU0VTU0lPTl9IQU5ETEUKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZFUlJPUl9CVUc7CiB9Ci0vKioKLSAqIEBicmllZiBJbml0aWFsaXplIGEgTVNESyBzZXNzaW9uCi0gKgotICogTWVkaWEgU0RLIGlzIGJhc2VkIG9uIHNlc3Npb25zLCBzbyB0aGlzIGlzIHRoZSBwcmVyZXF1aXNpdGUKLSAqIGluaXRpYWxpemF0aW9uIGZvciBIVyBhY2NlbGVyYXRpb24uICBGb3IgV2luZG93cyB0aGUgc2Vzc2lvbiBpcwotICogY29tcGxldGUgYW5kIHJlYWR5IHRvIHVzZSwgZm9yIExpbnV4IGEgZGlzcGxheSBoYW5kbGUgaXMKLSAqIHJlcXVpcmVkLiAgRm9yIHJlbGVhc2VzIG9mIE1lZGlhIFNlcnZlciBTdHVkaW8gPj0gMjAxNSBSNCB0aGUKLSAqIHJlbmRlciBub2RlcyBpbnRlcmZhY2UgaXMgcHJlZmVycmVkICgvZGV2L2RyaS9yZW5kZXJEKS4KLSAqIFVzaW5nIE1lZGlhIFNlcnZlciBTdHVkaW8gMjAxNSBSNCBvciBuZXdlciBpcyByZWNvbW1lbmRlZAotICogYnV0IHRoZSBvbGRlciAvZGV2L2RyaS9jYXJkIGludGVyZmFjZSBpcyBhbHNvIHNlYXJjaGVkCi0gKiBmb3IgYnJvYWRlciBjb21wYXRpYmlsaXR5LgotICoKLSAqIEBwYXJhbSBhdmN0eCAgICBmZm1wZWcgbWV0YWRhdGEgZm9yIHRoaXMgY29kZWMgY29udGV4dAotICogQHBhcmFtIHNlc3Npb24gIHRoZSBNU0RLIHNlc3Npb24gdXNlZAotICovCi1pbnQgZmZfcXN2X2luaXRfaW50ZXJuYWxfc2Vzc2lvbihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFFTVlNlc3Npb24gKnFzLAorCitlbnVtIEFWUGljdHVyZVR5cGUgZmZfcXN2X21hcF9waWN0eXBlKGludCBtZnhfcGljX3R5cGUpCit7CisgICAgZW51bSBBVlBpY3R1cmVUeXBlIHR5cGU7CisgICAgc3dpdGNoIChtZnhfcGljX3R5cGUgJiAweDcpIHsKKyAgICBjYXNlIE1GWF9GUkFNRVRZUEVfSToKKyAgICAgICAgaWYgKG1meF9waWNfdHlwZSAmIE1GWF9GUkFNRVRZUEVfUykKKyAgICAgICAgICAgIHR5cGUgPSBBVl9QSUNUVVJFX1RZUEVfU0k7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHR5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRlhfRlJBTUVUWVBFX0I6CisgICAgICAgIHR5cGUgPSBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNRlhfRlJBTUVUWVBFX1A6CisgICAgICAgIGlmIChtZnhfcGljX3R5cGUgJiBNRlhfRlJBTUVUWVBFX1MpCisgICAgICAgICAgICB0eXBlID0gQVZfUElDVFVSRV9UWVBFX1NQOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiB0eXBlOworfQorCitzdGF0aWMgaW50IHFzdl9sb2FkX3BsdWdpbnMobWZ4U2Vzc2lvbiBzZXNzaW9uLCBjb25zdCBjaGFyICpsb2FkX3BsdWdpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nY3R4KQoreworICAgIGlmICghbG9hZF9wbHVnaW5zIHx8ICEqbG9hZF9wbHVnaW5zKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHdoaWxlICgqbG9hZF9wbHVnaW5zKSB7CisgICAgICAgIG1meFBsdWdpblVJRCB1aWQ7CisgICAgICAgIG1meFN0YXR1cyByZXQ7CisgICAgICAgIGludCBpLCBlcnIgPSAwOworCisgICAgICAgIGNoYXIgKnBsdWdpbiA9IGF2X2dldF90b2tlbigmbG9hZF9wbHVnaW5zLCAiOiIpOworICAgICAgICBpZiAoIXBsdWdpbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmIChzdHJsZW4ocGx1Z2luKSAhPSAyICogc2l6ZW9mKHVpZC5EYXRhKSkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ2N0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwbHVnaW4gVUlEIGxlbmd0aFxuIik7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGxvYWRfcGx1Z2luX2ZhaWw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVpZC5EYXRhKTsgaSsrKSB7CisgICAgICAgICAgICBlcnIgPSBzc2NhbmYocGx1Z2luICsgMiAqIGksICIlMmhoeCIsIHVpZC5EYXRhICsgaSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobG9nY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBsdWdpbiBVSURcbiIpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGxvYWRfcGx1Z2luX2ZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IE1GWFZpZGVvVVNFUl9Mb2FkKHNlc3Npb24sICZ1aWQsIDEpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgY2hhciBlcnJvcmJ1ZlsxMjhdOworICAgICAgICAgICAgc25wcmludGYoZXJyb3JidWYsIHNpemVvZihlcnJvcmJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGxvYWQgdGhlIHJlcXVlc3RlZCBwbHVnaW4gJyVzJyIsIHBsdWdpbik7CisgICAgICAgICAgICBlcnIgPSBmZl9xc3ZfcHJpbnRfZXJyb3IobG9nY3R4LCByZXQsIGVycm9yYnVmKTsKKyAgICAgICAgICAgIGdvdG8gbG9hZF9wbHVnaW5fZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqbG9hZF9wbHVnaW5zKQorICAgICAgICAgICAgbG9hZF9wbHVnaW5zKys7Citsb2FkX3BsdWdpbl9mYWlsOgorICAgICAgICBhdl9mcmVlcCgmcGx1Z2luKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiAwOworCit9CisKK2ludCBmZl9xc3ZfaW5pdF9pbnRlcm5hbF9zZXNzaW9uKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgbWZ4U2Vzc2lvbiAqc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxvYWRfcGx1Z2lucykKIHsKICAgICBtZnhJTVBMIGltcGwgICA9IE1GWF9JTVBMX0FVVE9fQU5ZOwpAQCAtMTc3LDE3ICsyNzksMTggQEAKICAgICBjb25zdCBjaGFyICpkZXNjOwogICAgIGludCByZXQ7CiAKLSAgICByZXQgPSBNRlhJbml0KGltcGwsICZ2ZXIsICZxcy0+c2Vzc2lvbik7CisgICAgcmV0ID0gTUZYSW5pdChpbXBsLCAmdmVyLCBzZXNzaW9uKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIGZmX3Fzdl9wcmludF9lcnJvcihhdmN0eCwgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpbml0aWFsaXppbmcgYW4gaW50ZXJuYWwgTUZYIHNlc3Npb24iKTsKKworICAgIHJldCA9IHFzdl9sb2FkX3BsdWdpbnMoKnNlc3Npb24sIGxvYWRfcGx1Z2lucywgYXZjdHgpOwogICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIGFuIGludGVybmFsIE1GWCBzZXNzaW9uXG4iKTsKLSAgICAgICAgcmV0dXJuIGZmX3Fzdl9lcnJvcihyZXQpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGxvYWRpbmcgcGx1Z2luc1xuIik7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgcmV0ID0gZmZfcXN2X3NldF9kaXNwbGF5X2hhbmRsZShhdmN0eCwgcXMpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgTUZYUXVlcnlJTVBMKHFzLT5zZXNzaW9uLCAmaW1wbCk7CisgICAgTUZYUXVlcnlJTVBMKCpzZXNzaW9uLCAmaW1wbCk7CiAKICAgICBzd2l0Y2ggKE1GWF9JTVBMX0JBU0VUWVBFKGltcGwpKSB7CiAgICAgY2FzZSBNRlhfSU1QTF9TT0ZUV0FSRToKQEAgLTIwMyw0NSArMzA2LDYgQEAKICAgICAgICAgZGVzYyA9ICJ1bmtub3duIjsKICAgICB9CiAKLSAgICBpZiAobG9hZF9wbHVnaW5zICYmICpsb2FkX3BsdWdpbnMpIHsKLSAgICAgICAgd2hpbGUgKCpsb2FkX3BsdWdpbnMpIHsKLSAgICAgICAgICAgIG1meFBsdWdpblVJRCB1aWQ7Ci0gICAgICAgICAgICBpbnQgaSwgZXJyID0gMDsKLQotICAgICAgICAgICAgY2hhciAqcGx1Z2luID0gYXZfZ2V0X3Rva2VuKCZsb2FkX3BsdWdpbnMsICI6Iik7Ci0gICAgICAgICAgICBpZiAoIXBsdWdpbikKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgaWYgKHN0cmxlbihwbHVnaW4pICE9IDIgKiBzaXplb2YodWlkLkRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBsdWdpbiBVSUQgbGVuZ3RoXG4iKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICAgICAgZ290byBsb2FkX3BsdWdpbl9mYWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHVpZC5EYXRhKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gc3NjYW5mKHBsdWdpbiArIDIgKiBpLCAiJTJoaHgiLCB1aWQuRGF0YSArIGkpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGx1Z2luIFVJRFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBsb2FkX3BsdWdpbl9mYWlsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXQgPSBNRlhWaWRlb1VTRVJfTG9hZChxcy0+c2Vzc2lvbiwgJnVpZCwgMSk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGxvYWQgdGhlIHJlcXVlc3RlZCBwbHVnaW46ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW4pOwotICAgICAgICAgICAgICAgIGVyciA9IGZmX3Fzdl9lcnJvcihyZXQpOwotICAgICAgICAgICAgICAgIGdvdG8gbG9hZF9wbHVnaW5fZmFpbDsKLSAgICAgICAgICAgIH0KLQotbG9hZF9wbHVnaW5fZmFpbDoKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZwbHVnaW4pOwotICAgICAgICAgICAgaWYgKGVyciA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsCiAgICAgICAgICAgICJJbml0aWFsaXplZCBhbiBpbnRlcm5hbCBNRlggc2Vzc2lvbiB1c2luZyAlcyBpbXBsZW1lbnRhdGlvblxuIiwKICAgICAgICAgICAgZGVzYyk7CkBAIC0yNDksMjEgKzMxMywzNzAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGZmX3Fzdl9jbG9zZV9pbnRlcm5hbF9zZXNzaW9uKFFTVlNlc3Npb24gKnFzKQorc3RhdGljIHZvaWQgbWlkc19idWZfZnJlZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCiB7Ci0gICAgaWYgKHFzLT5zZXNzaW9uKSB7Ci0gICAgICAgIE1GWENsb3NlKHFzLT5zZXNzaW9uKTsKLSAgICAgICAgcXMtPnNlc3Npb24gPSBOVUxMOworICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfcmVmID0gb3BhcXVlOworICAgIGF2X2J1ZmZlcl91bnJlZigmaHdfZnJhbWVzX3JlZik7CisgICAgYXZfZnJlZXAoJmRhdGEpOworfQorCitzdGF0aWMgQVZCdWZmZXJSZWYgKnFzdl9jcmVhdGVfbWlkcyhBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX3JlZikKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAqZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopaHdfZnJhbWVzX3JlZi0+ZGF0YTsKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGZyYW1lc19jdHgtPmh3Y3R4OworICAgIGludCAgICAgICAgICAgICAgICAgIG5iX3N1cmZhY2VzID0gZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlczsKKworICAgIEFWQnVmZmVyUmVmICptaWRzX2J1ZiwgKmh3X2ZyYW1lc19yZWYxOworICAgIFFTVk1pZCAqbWlkczsKKyAgICBpbnQgaTsKKworICAgIGh3X2ZyYW1lc19yZWYxID0gYXZfYnVmZmVyX3JlZihod19mcmFtZXNfcmVmKTsKKyAgICBpZiAoIWh3X2ZyYW1lc19yZWYxKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1pZHMgPSBhdl9tYWxsb2N6X2FycmF5KG5iX3N1cmZhY2VzLCBzaXplb2YoKm1pZHMpKTsKKyAgICBpZiAoIW1pZHMpIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZod19mcmFtZXNfcmVmMSk7CisgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSNpZmRlZiBBVkNPREVDX1FTVl9MSU5VWF9TRVNTSU9OX0hBTkRMRQotICAgIGlmIChxcy0+dmFfZGlzcGxheSkgewotICAgICAgICB2YVRlcm1pbmF0ZShxcy0+dmFfZGlzcGxheSk7Ci0gICAgICAgIHFzLT52YV9kaXNwbGF5ID0gTlVMTDsKKworICAgIG1pZHNfYnVmID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCopbWlkcywgbmJfc3VyZmFjZXMgKiBzaXplb2YoKm1pZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWRzX2J1Zl9mcmVlLCBod19mcmFtZXNfcmVmMSwgMCk7CisgICAgaWYgKCFtaWRzX2J1ZikgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmh3X2ZyYW1lc19yZWYxKTsKKyAgICAgICAgYXZfZnJlZXAoJm1pZHMpOworICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgaWYgKHFzLT5mZF9kaXNwbGF5ID4gMCkgewotICAgICAgICBjbG9zZShxcy0+ZmRfZGlzcGxheSk7Ci0gICAgICAgIHFzLT5mZF9kaXNwbGF5ID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc3VyZmFjZXM7IGkrKykgeworICAgICAgICBRU1ZNaWQgKm1pZCA9ICZtaWRzW2ldOworICAgICAgICBtaWQtPmhhbmRsZSAgICAgICAgPSBmcmFtZXNfaHdjdHgtPnN1cmZhY2VzW2ldLkRhdGEuTWVtSWQ7CisgICAgICAgIG1pZC0+aHdfZnJhbWVzX3JlZiA9IGh3X2ZyYW1lc19yZWYxOwogICAgIH0KLSNlbmRpZgorCisgICAgcmV0dXJuIG1pZHNfYnVmOworfQorCitzdGF0aWMgaW50IHFzdl9zZXR1cF9taWRzKG1meEZyYW1lQWxsb2NSZXNwb25zZSAqcmVzcCwgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICptaWRzX2J1ZikKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAqZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopaHdfZnJhbWVzX3JlZi0+ZGF0YTsKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGZyYW1lc19jdHgtPmh3Y3R4OworICAgIFFTVk1pZCAgICAgICAgICAgICAgICAgICAgICptaWRzID0gKFFTVk1pZCopbWlkc19idWYtPmRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICAgbmJfc3VyZmFjZXMgPSBmcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzOworICAgIGludCBpOworCisgICAgLy8gdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoZSBhcnJheSBpcyB0d28gbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZgorICAgIC8vIHN1cmZhY2VzLCB3ZSBzdG9yZSB0aGUgcmVmZXJlbmNlcyB0byB0aGUgZnJhbWVzIGNvbnRleHQgYW5kIHRoZQorICAgIC8vIFFTVk1pZCBhcnJheSB0aGVyZQorICAgIHJlc3AtPm1pZHMgPSBhdl9tYWxsb2N6X2FycmF5KG5iX3N1cmZhY2VzICsgMiwgc2l6ZW9mKCpyZXNwLT5taWRzKSk7CisgICAgaWYgKCFyZXNwLT5taWRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX3N1cmZhY2VzOyBpKyspCisgICAgICAgIHJlc3AtPm1pZHNbaV0gPSAmbWlkc1tpXTsKKyAgICByZXNwLT5OdW1GcmFtZUFjdHVhbCA9IG5iX3N1cmZhY2VzOworCisgICAgcmVzcC0+bWlkc1tyZXNwLT5OdW1GcmFtZUFjdHVhbF0gPSAobWZ4TWVtSWQpYXZfYnVmZmVyX3JlZihod19mcmFtZXNfcmVmKTsKKyAgICBpZiAoIXJlc3AtPm1pZHNbcmVzcC0+TnVtRnJhbWVBY3R1YWxdKSB7CisgICAgICAgIGF2X2ZyZWVwKCZyZXNwLT5taWRzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXNwLT5taWRzW3Jlc3AtPk51bUZyYW1lQWN0dWFsICsgMV0gPSBhdl9idWZmZXJfcmVmKG1pZHNfYnVmKTsKKyAgICBpZiAoIXJlc3AtPm1pZHNbcmVzcC0+TnVtRnJhbWVBY3R1YWwgKyAxXSkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoKEFWQnVmZmVyUmVmKiopJnJlc3AtPm1pZHNbcmVzcC0+TnVtRnJhbWVBY3R1YWxdKTsKKyAgICAgICAgYXZfZnJlZXAoJnJlc3AtPm1pZHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIHFzdl9mcmFtZV9hbGxvYyhtZnhIREwgcHRoaXMsIG1meEZyYW1lQWxsb2NSZXF1ZXN0ICpyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZnhGcmFtZUFsbG9jUmVzcG9uc2UgKnJlc3ApCit7CisgICAgUVNWRnJhbWVzQ29udGV4dCAqY3R4ID0gcHRoaXM7CisgICAgaW50IHJldDsKKworICAgIC8qIHRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gYW4gZW5jb2RlciBvciBkZWNvZGVyIGFuZAorICAgICAqIG9ubHkgYWxsb2NhdGVzIHZpZGVvIG1lbW9yeSBmcmFtZXMgKi8KKyAgICBpZiAoIShyZXEtPlR5cGUgJiAoTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX0RFQ09ERVJfVEFSR0VUIHwKKyAgICAgICAgICAgICAgICAgICAgICAgTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX1BST0NFU1NPUl9UQVJHRVQpKSAgICAgICAgIHx8CisgICAgICAgICEocmVxLT5UeXBlICYgKE1GWF9NRU1UWVBFX0ZST01fREVDT0RFIHwgTUZYX01FTVRZUEVfRlJPTV9FTkNPREUpKSkKKyAgICAgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7CisKKyAgICBpZiAocmVxLT5UeXBlICYgTUZYX01FTVRZUEVfRVhURVJOQUxfRlJBTUUpIHsKKyAgICAgICAgLyogZXh0ZXJuYWwgZnJhbWVzIC0tIGZpbGwgZnJvbSB0aGUgY2FsbGVyLXN1cHBsaWVkIGZyYW1lcyBjb250ZXh0ICovCisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KiljdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgICAgIEFWUVNWRnJhbWVzQ29udGV4dCAqZnJhbWVzX2h3Y3R4ID0gZnJhbWVzX2N0eC0+aHdjdHg7CisgICAgICAgIG1meEZyYW1lSW5mbyAgICAgICppICA9ICZyZXEtPkluZm87CisgICAgICAgIG1meEZyYW1lSW5mbyAgICAgICppMSA9ICZmcmFtZXNfaHdjdHgtPnN1cmZhY2VzWzBdLkluZm87CisKKyAgICAgICAgaWYgKGktPldpZHRoICA+IGkxLT5XaWR0aCAgfHwgaS0+SGVpZ2h0ID4gaTEtPkhlaWdodCB8fAorICAgICAgICAgICAgaS0+Rm91ckNDICE9IGkxLT5Gb3VyQ0MgfHwgaS0+Q2hyb21hRm9ybWF0ICE9IGkxLT5DaHJvbWFGb3JtYXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ2N0eCwgQVZfTE9HX0VSUk9SLCAiTWlzbWF0Y2hpbmcgc3VyZmFjZSBwcm9wZXJ0aWVzIGluIGFuICIKKyAgICAgICAgICAgICAgICAgICAiYWxsb2NhdGlvbiByZXF1ZXN0OiAlZHglZCAlZCAlZCB2cyAlZHglZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBpLT5XaWR0aCwgIGktPkhlaWdodCwgIGktPkZvdXJDQywgIGktPkNocm9tYUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICBpMS0+V2lkdGgsIGkxLT5IZWlnaHQsIGkxLT5Gb3VyQ0MsIGkxLT5DaHJvbWFGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBxc3Zfc2V0dXBfbWlkcyhyZXNwLCBjdHgtPmh3X2ZyYW1lc19jdHgsIGN0eC0+bWlkc19idWYpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eC0+bG9nY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkVycm9yIGZpbGxpbmcgYW4gZXh0ZXJuYWwgZnJhbWUgYWxsb2NhdGlvbiByZXF1ZXN0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRlhfRVJSX01FTU9SWV9BTExPQzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocmVxLT5UeXBlICYgTUZYX01FTVRZUEVfSU5URVJOQUxfRlJBTUUpIHsKKyAgICAgICAgLyogaW50ZXJuYWwgZnJhbWVzIC0tIGFsbG9jYXRlIGEgbmV3IGh3IGZyYW1lcyBjb250ZXh0ICovCisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpleHRfZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopY3R4LT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgICAgICBtZnhGcmFtZUluZm8gICAgICAqaSAgPSAmcmVxLT5JbmZvOworCisgICAgICAgIEFWQnVmZmVyUmVmICpmcmFtZXNfcmVmLCAqbWlkc19idWY7CisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmcmFtZXNfY3R4OworICAgICAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eDsKKworICAgICAgICBmcmFtZXNfcmVmID0gYXZfaHdmcmFtZV9jdHhfYWxsb2MoZXh0X2ZyYW1lc19jdHgtPmRldmljZV9yZWYpOworICAgICAgICBpZiAoIWZyYW1lc19yZWYpCisgICAgICAgICAgICByZXR1cm4gTUZYX0VSUl9NRU1PUllfQUxMT0M7CisKKyAgICAgICAgZnJhbWVzX2N0eCAgID0gKEFWSFdGcmFtZXNDb250ZXh0KilmcmFtZXNfcmVmLT5kYXRhOworICAgICAgICBmcmFtZXNfaHdjdHggPSBmcmFtZXNfY3R4LT5od2N0eDsKKworICAgICAgICBmcmFtZXNfY3R4LT5mb3JtYXQgICAgICAgICAgICA9IEFWX1BJWF9GTVRfUVNWOworICAgICAgICBmcmFtZXNfY3R4LT5zd19mb3JtYXQgICAgICAgICA9IHFzdl9tYXBfZm91cmNjKGktPkZvdXJDQyk7CisgICAgICAgIGZyYW1lc19jdHgtPndpZHRoICAgICAgICAgICAgID0gaS0+V2lkdGg7CisgICAgICAgIGZyYW1lc19jdHgtPmhlaWdodCAgICAgICAgICAgID0gaS0+SGVpZ2h0OworICAgICAgICBmcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSA9IHJlcS0+TnVtRnJhbWVTdWdnZXN0ZWQ7CisKKyAgICAgICAgZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlICAgICAgPSByZXEtPlR5cGU7CisKKyAgICAgICAgcmV0ID0gYXZfaHdmcmFtZV9jdHhfaW5pdChmcmFtZXNfcmVmKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJFcnJvciBpbml0aWFsaXppbmcgYSBmcmFtZXMgY29udGV4dCBmb3IgYW4gaW50ZXJuYWwgZnJhbWUgIgorICAgICAgICAgICAgICAgICAgICJhbGxvY2F0aW9uIHJlcXVlc3RcbiIpOworICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZXNfcmVmKTsKKyAgICAgICAgICAgIHJldHVybiBNRlhfRVJSX01FTU9SWV9BTExPQzsKKyAgICAgICAgfQorCisgICAgICAgIG1pZHNfYnVmID0gcXN2X2NyZWF0ZV9taWRzKGZyYW1lc19yZWYpOworICAgICAgICBpZiAoIW1pZHNfYnVmKSB7CisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lc19yZWYpOworICAgICAgICAgICAgcmV0dXJuIE1GWF9FUlJfTUVNT1JZX0FMTE9DOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gcXN2X3NldHVwX21pZHMocmVzcCwgZnJhbWVzX3JlZiwgbWlkc19idWYpOworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJm1pZHNfYnVmKTsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZXNfcmVmKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgtPmxvZ2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJFcnJvciBmaWxsaW5nIGFuIGludGVybmFsIGZyYW1lIGFsbG9jYXRpb24gcmVxdWVzdFxuIik7CisgICAgICAgICAgICByZXR1cm4gTUZYX0VSUl9NRU1PUllfQUxMT0M7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTUZYX0VSUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIHFzdl9mcmFtZV9mcmVlKG1meEhETCBwdGhpcywgbWZ4RnJhbWVBbGxvY1Jlc3BvbnNlICpyZXNwKQoreworICAgIGF2X2J1ZmZlcl91bnJlZigoQVZCdWZmZXJSZWYqKikmcmVzcC0+bWlkc1tyZXNwLT5OdW1GcmFtZUFjdHVhbF0pOworICAgIGF2X2J1ZmZlcl91bnJlZigoQVZCdWZmZXJSZWYqKikmcmVzcC0+bWlkc1tyZXNwLT5OdW1GcmFtZUFjdHVhbCArIDFdKTsKKyAgICBhdl9mcmVlcCgmcmVzcC0+bWlkcyk7CisgICAgcmV0dXJuIE1GWF9FUlJfTk9ORTsKK30KKworc3RhdGljIG1meFN0YXR1cyBxc3ZfZnJhbWVfbG9jayhtZnhIREwgcHRoaXMsIG1meE1lbUlkIG1pZCwgbWZ4RnJhbWVEYXRhICpwdHIpCit7CisgICAgUVNWTWlkICpxc3ZfbWlkID0gbWlkOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpod19mcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0Kilxc3ZfbWlkLT5od19mcmFtZXNfcmVmLT5kYXRhOworICAgIEFWUVNWRnJhbWVzQ29udGV4dCAqaHdfZnJhbWVzX2h3Y3R4ID0gaHdfZnJhbWVzX2N0eC0+aHdjdHg7CisgICAgaW50IHJldDsKKworICAgIGlmIChxc3ZfbWlkLT5sb2NrZWRfZnJhbWUpCisgICAgICAgIHJldHVybiBNRlhfRVJSX1VOREVGSU5FRF9CRUhBVklPUjsKKworICAgIC8qIEFsbG9jYXRlIGEgc3lzdGVtIG1lbW9yeSBmcmFtZSB0aGF0IHdpbGwgaG9sZCB0aGUgbWFwcGVkIGRhdGEuICovCisgICAgcXN2X21pZC0+bG9ja2VkX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXFzdl9taWQtPmxvY2tlZF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIE1GWF9FUlJfTUVNT1JZX0FMTE9DOworICAgIHFzdl9taWQtPmxvY2tlZF9mcmFtZS0+Zm9ybWF0ICA9IGh3X2ZyYW1lc19jdHgtPnN3X2Zvcm1hdDsKKworICAgIC8qIHdyYXAgdGhlIHByb3ZpZGVkIGhhbmRsZSBpbiBhIGh3YWNjZWwgQVZGcmFtZSAqLworICAgIHFzdl9taWQtPmh3X2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIXFzdl9taWQtPmh3X2ZyYW1lKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBxc3ZfbWlkLT5od19mcmFtZS0+ZGF0YVszXSA9ICh1aW50OF90KikmcXN2X21pZC0+c3VyZjsKKyAgICBxc3ZfbWlkLT5od19mcmFtZS0+Zm9ybWF0ICA9IEFWX1BJWF9GTVRfUVNWOworCisgICAgLy8gZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoYXQgYnVmZmVyIGlzIHVzZWQgaGVyZQorICAgIHFzdl9taWQtPmh3X2ZyYW1lLT5idWZbMF0gID0gYXZfYnVmZmVyX2FsbG9jKDEpOworICAgIGlmICghcXN2X21pZC0+aHdfZnJhbWUtPmJ1ZlswXSkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcXN2X21pZC0+aHdfZnJhbWUtPndpZHRoICAgPSBod19mcmFtZXNfY3R4LT53aWR0aDsKKyAgICBxc3ZfbWlkLT5od19mcmFtZS0+aGVpZ2h0ICA9IGh3X2ZyYW1lc19jdHgtPmhlaWdodDsKKworICAgIHFzdl9taWQtPmh3X2ZyYW1lLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihxc3ZfbWlkLT5od19mcmFtZXNfcmVmKTsKKyAgICBpZiAoIXFzdl9taWQtPmh3X2ZyYW1lLT5od19mcmFtZXNfY3R4KQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBxc3ZfbWlkLT5zdXJmLkluZm8gPSBod19mcmFtZXNfaHdjdHgtPnN1cmZhY2VzWzBdLkluZm87CisgICAgcXN2X21pZC0+c3VyZi5EYXRhLk1lbUlkID0gcXN2X21pZC0+aGFuZGxlOworCisgICAgLyogbWFwIHRoZSBkYXRhIHRvIHRoZSBzeXN0ZW0gbWVtb3J5ICovCisgICAgcmV0ID0gYXZfaHdmcmFtZV9tYXAocXN2X21pZC0+bG9ja2VkX2ZyYW1lLCBxc3ZfbWlkLT5od19mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVl9IV0ZSQU1FX01BUF9ESVJFQ1QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBwdHItPlBpdGNoID0gcXN2X21pZC0+bG9ja2VkX2ZyYW1lLT5saW5lc2l6ZVswXTsKKyAgICBwdHItPlkgICAgID0gcXN2X21pZC0+bG9ja2VkX2ZyYW1lLT5kYXRhWzBdOworICAgIHB0ci0+VSAgICAgPSBxc3ZfbWlkLT5sb2NrZWRfZnJhbWUtPmRhdGFbMV07CisgICAgcHRyLT5WICAgICA9IHFzdl9taWQtPmxvY2tlZF9mcmFtZS0+ZGF0YVsxXSArIDE7CisKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZxc3ZfbWlkLT5od19mcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcXN2X21pZC0+bG9ja2VkX2ZyYW1lKTsKKyAgICByZXR1cm4gTUZYX0VSUl9NRU1PUllfQUxMT0M7Cit9CisKK3N0YXRpYyBtZnhTdGF0dXMgcXN2X2ZyYW1lX3VubG9jayhtZnhIREwgcHRoaXMsIG1meE1lbUlkIG1pZCwgbWZ4RnJhbWVEYXRhICpwdHIpCit7CisgICAgUVNWTWlkICpxc3ZfbWlkID0gbWlkOworCisgICAgYXZfZnJhbWVfZnJlZSgmcXN2X21pZC0+bG9ja2VkX2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZxc3ZfbWlkLT5od19mcmFtZSk7CisKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIHFzdl9mcmFtZV9nZXRfaGRsKG1meEhETCBwdGhpcywgbWZ4TWVtSWQgbWlkLCBtZnhIREwgKmhkbCkKK3sKKyAgICBRU1ZNaWQgKnFzdl9taWQgPSAoUVNWTWlkKiltaWQ7CisgICAgKmhkbCA9IHFzdl9taWQtPmhhbmRsZTsKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworfQorCitpbnQgZmZfcXN2X2luaXRfc2Vzc2lvbl9kZXZpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBtZnhTZXNzaW9uICpwc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqZGV2aWNlX3JlZiwgY29uc3QgY2hhciAqbG9hZF9wbHVnaW5zKQoreworICAgIHN0YXRpYyBjb25zdCBtZnhIYW5kbGVUeXBlIGhhbmRsZV90eXBlc1tdID0geworICAgICAgICBNRlhfSEFORExFX1ZBX0RJU1BMQVksCisgICAgICAgIE1GWF9IQU5ETEVfRDNEOV9ERVZJQ0VfTUFOQUdFUiwKKyAgICAgICAgTUZYX0hBTkRMRV9EM0QxMV9ERVZJQ0UsCisgICAgfTsKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAgICAqZGV2aWNlX2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCopZGV2aWNlX3JlZi0+ZGF0YTsKKyAgICBBVlFTVkRldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGRldmljZV9jdHgtPmh3Y3R4OworICAgIG1meFNlc3Npb24gICAgICAgIHBhcmVudF9zZXNzaW9uID0gZGV2aWNlX2h3Y3R4LT5zZXNzaW9uOworCisgICAgbWZ4U2Vzc2lvbiAgICBzZXNzaW9uOworICAgIG1meFZlcnNpb24gICAgdmVyOworICAgIG1meElNUEwgICAgICAgaW1wbDsKKyAgICBtZnhIREwgICAgICAgIGhhbmRsZSA9IE5VTEw7CisgICAgbWZ4SGFuZGxlVHlwZSBoYW5kbGVfdHlwZTsKKyAgICBtZnhTdGF0dXMgZXJyOworCisgICAgaW50IGksIHJldDsKKworICAgIGVyciA9IE1GWFF1ZXJ5SU1QTChwYXJlbnRfc2Vzc2lvbiwgJmltcGwpOworICAgIGlmIChlcnIgPT0gTUZYX0VSUl9OT05FKQorICAgICAgICBlcnIgPSBNRlhRdWVyeVZlcnNpb24ocGFyZW50X3Nlc3Npb24sICZ2ZXIpOworICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKQorICAgICAgICByZXR1cm4gZmZfcXN2X3ByaW50X2Vycm9yKGF2Y3R4LCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHF1ZXJ5aW5nIHRoZSBzZXNzaW9uIGF0dHJpYnV0ZXMiKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhoYW5kbGVfdHlwZXMpOyBpKyspIHsKKyAgICAgICAgZXJyID0gTUZYVmlkZW9DT1JFX0dldEhhbmRsZShwYXJlbnRfc2Vzc2lvbiwgaGFuZGxlX3R5cGVzW2ldLCAmaGFuZGxlKTsKKyAgICAgICAgaWYgKGVyciA9PSBNRlhfRVJSX05PTkUpIHsKKyAgICAgICAgICAgIGhhbmRsZV90eXBlID0gaGFuZGxlX3R5cGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlID0gTlVMTDsKKyAgICB9CisgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIk5vIHN1cHBvcnRlZCBodyBoYW5kbGUgY291bGQgYmUgcmV0cmlldmVkICIKKyAgICAgICAgICAgICAgICJmcm9tIHRoZSBzZXNzaW9uXG4iKTsKKyAgICB9CisKKyAgICBlcnIgPSBNRlhJbml0KGltcGwsICZ2ZXIsICZzZXNzaW9uKTsKKyAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgcmV0dXJuIGZmX3Fzdl9wcmludF9lcnJvcihhdmN0eCwgZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpbml0aWFsaXppbmcgYSBjaGlsZCBNRlggc2Vzc2lvbiIpOworCisgICAgaWYgKGhhbmRsZSkgeworICAgICAgICBlcnIgPSBNRlhWaWRlb0NPUkVfU2V0SGFuZGxlKHNlc3Npb24sIGhhbmRsZV90eXBlLCBoYW5kbGUpOworICAgICAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBmZl9xc3ZfcHJpbnRfZXJyb3IoYXZjdHgsIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHNldHRpbmcgYSBIVyBoYW5kbGUiKTsKKyAgICB9CisKKyAgICBpZiAoUVNWX1JVTlRJTUVfVkVSU0lPTl9BVExFQVNUKHZlciwgMSwgMjUpKSB7CisgICAgICAgIGVyciA9IE1GWEpvaW5TZXNzaW9uKHBhcmVudF9zZXNzaW9uLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKGVyciAhPSBNRlhfRVJSX05PTkUpCisgICAgICAgICAgICByZXR1cm4gZmZfcXN2X3ByaW50X2Vycm9yKGF2Y3R4LCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBqb2luaW5nIHNlc3Npb24iKTsKKyAgICB9CisKKyAgICByZXQgPSBxc3ZfbG9hZF9wbHVnaW5zKHNlc3Npb24sIGxvYWRfcGx1Z2lucywgYXZjdHgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgbG9hZGluZyBwbHVnaW5zXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAqcHNlc3Npb24gPSBzZXNzaW9uOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcXN2X2luaXRfc2Vzc2lvbl9mcmFtZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBtZnhTZXNzaW9uICpwc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRU1ZGcmFtZXNDb250ZXh0ICpxc3ZfZnJhbWVzX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsb2FkX3BsdWdpbnMsIGludCBvcGFxdWUpCit7CisgICAgbWZ4RnJhbWVBbGxvY2F0b3IgZnJhbWVfYWxsb2NhdG9yID0geworICAgICAgICAucHRoaXMgID0gcXN2X2ZyYW1lc19jdHgsCisgICAgICAgIC5BbGxvYyAgPSBxc3ZfZnJhbWVfYWxsb2MsCisgICAgICAgIC5Mb2NrICAgPSBxc3ZfZnJhbWVfbG9jaywKKyAgICAgICAgLlVubG9jayA9IHFzdl9mcmFtZV91bmxvY2ssCisgICAgICAgIC5HZXRIREwgPSBxc3ZfZnJhbWVfZ2V0X2hkbCwKKyAgICAgICAgLkZyZWUgICA9IHFzdl9mcmFtZV9mcmVlLAorICAgIH07CisKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAqZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopcXN2X2ZyYW1lc19jdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICpmcmFtZXNfaHdjdHggPSBmcmFtZXNfY3R4LT5od2N0eDsKKworICAgIG1meFNlc3Npb24gICAgc2Vzc2lvbjsKKyAgICBtZnhTdGF0dXMgZXJyOworCisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3Fzdl9pbml0X3Nlc3Npb25fZGV2aWNlKGF2Y3R4LCAmc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNfY3R4LT5kZXZpY2VfcmVmLCBsb2FkX3BsdWdpbnMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFvcGFxdWUpIHsKKyAgICAgICAgcXN2X2ZyYW1lc19jdHgtPmxvZ2N0eCA9IGF2Y3R4OworCisgICAgICAgIC8qIGFsbG9jYXRlIHRoZSBtZW1vcnkgaWRzIGZvciB0aGUgZXh0ZXJuYWwgZnJhbWVzICovCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcXN2X2ZyYW1lc19jdHgtPm1pZHNfYnVmKTsKKyAgICAgICAgcXN2X2ZyYW1lc19jdHgtPm1pZHNfYnVmID0gcXN2X2NyZWF0ZV9taWRzKHFzdl9mcmFtZXNfY3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgaWYgKCFxc3ZfZnJhbWVzX2N0eC0+bWlkc19idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBxc3ZfZnJhbWVzX2N0eC0+bWlkcyAgICA9IChRU1ZNaWQqKXFzdl9mcmFtZXNfY3R4LT5taWRzX2J1Zi0+ZGF0YTsKKyAgICAgICAgcXN2X2ZyYW1lc19jdHgtPm5iX21pZHMgPSBmcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzOworCisgICAgICAgIGVyciA9IE1GWFZpZGVvQ09SRV9TZXRGcmFtZUFsbG9jYXRvcihzZXNzaW9uLCAmZnJhbWVfYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKGVyciAhPSBNRlhfRVJSX05PTkUpCisgICAgICAgICAgICByZXR1cm4gZmZfcXN2X3ByaW50X2Vycm9yKGF2Y3R4LCBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBzZXR0aW5nIGEgZnJhbWUgYWxsb2NhdG9yIik7CisgICAgfQorCisgICAgKnBzZXNzaW9uID0gc2Vzc2lvbjsKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcXN2X2ludGVybmFsLmggYi9saWJhdmNvZGVjL3Fzdl9pbnRlcm5hbC5oCmluZGV4IGMyMzVlMDcuLjM5NGM1NTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcXN2X2ludGVybmFsLmgKKysrIGIvbGliYXZjb2RlYy9xc3ZfaW50ZXJuYWwuaApAQCAtMjEsMjcgKzIxLDE0IEBACiAjaWZuZGVmIEFWQ09ERUNfUVNWX0lOVEVSTkFMX0gKICNkZWZpbmUgQVZDT0RFQ19RU1ZfSU5URVJOQUxfSAogCi0jaWYgQ09ORklHX1ZBQVBJCi0jZGVmaW5lIEFWQ09ERUNfUVNWX0xJTlVYX1NFU1NJT05fSEFORExFCi0jZW5kaWYgLy9DT05GSUdfVkFBUEkKLQotI2lmZGVmIEFWQ09ERUNfUVNWX0xJTlVYX1NFU1NJT05fSEFORExFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZiBIQVZFX1VOSVNURF9ICi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHZhL3ZhLmg+Ci0jaW5jbHVkZSA8dmEvdmFfZHJtLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgPG1meC9tZnh2aWRlby5oPgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCiAKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKICNkZWZpbmUgUVNWX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBRU1ZfVkVSU0lPTl9NSU5PUiA5CisjZGVmaW5lIFFTVl9WRVJTSU9OX01JTk9SIDEKIAogI2RlZmluZSBBU1lOQ19ERVBUSF9ERUZBVUxUIDQgICAgICAgLy8gaW50ZXJuYWwgcGFyYWxsZWxpc20KIApAQCAtNTEsMzUgKzM4LDcyIEBACiAgICAgKE1GWF9WRVJTSU9OX01BSk9SID4gKE1BSk9SKSB8fCAgICAgICAgIFwKICAgICAgTUZYX1ZFUlNJT05fTUFKT1IgPT0gKE1BSk9SKSAmJiBNRlhfVkVSU0lPTl9NSU5PUiA+PSAoTUlOT1IpKQogCisjZGVmaW5lIFFTVl9SVU5USU1FX1ZFUlNJT05fQVRMRUFTVChNRlhfVkVSU0lPTiwgTUFKT1IsIE1JTk9SKSBcCisgICAgKE1GWF9WRVJTSU9OLk1ham9yID4gKE1BSk9SKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKE1GWF9WRVJTSU9OLk1ham9yID09IChNQUpPUikgJiYgTUZYX1ZFUlNJT04uTWlub3IgPj0gKE1JTk9SKSkKKwordHlwZWRlZiBzdHJ1Y3QgUVNWTWlkIHsKKyAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX3JlZjsKKyAgICBtZnhIREwgaGFuZGxlOworCisgICAgQVZGcmFtZSAqbG9ja2VkX2ZyYW1lOworICAgIEFWRnJhbWUgKmh3X2ZyYW1lOworICAgIG1meEZyYW1lU3VyZmFjZTEgc3VyZjsKK30gUVNWTWlkOworCiB0eXBlZGVmIHN0cnVjdCBRU1ZGcmFtZSB7CiAgICAgQVZGcmFtZSAqZnJhbWU7Ci0gICAgbWZ4RnJhbWVTdXJmYWNlMSAqc3VyZmFjZTsKKyAgICBtZnhGcmFtZVN1cmZhY2UxIHN1cmZhY2U7CiAgICAgbWZ4RW5jb2RlQ3RybCBlbmNfY3RybDsKLQotICAgIG1meEZyYW1lU3VyZmFjZTEgc3VyZmFjZV9pbnRlcm5hbDsKKyAgICBtZnhFeHREZWNvZGVkRnJhbWVJbmZvIGRlY19pbmZvOworICAgIG1meEV4dEJ1ZmZlciAqZXh0X3BhcmFtOwogCiAgICAgaW50IHF1ZXVlZDsKKyAgICBpbnQgdXNlZDsKIAogICAgIHN0cnVjdCBRU1ZGcmFtZSAqbmV4dDsKIH0gUVNWRnJhbWU7CiAKLXR5cGVkZWYgc3RydWN0IFFTVlNlc3Npb24gewotICAgIG1meFNlc3Npb24gc2Vzc2lvbjsKLSNpZmRlZiBBVkNPREVDX1FTVl9MSU5VWF9TRVNTSU9OX0hBTkRMRQotICAgIGludCAgICAgICAgZmRfZGlzcGxheTsKLSAgICBWQURpc3BsYXkgIHZhX2Rpc3BsYXk7Ci0jZW5kaWYKLX0gUVNWU2Vzc2lvbjsKK3R5cGVkZWYgc3RydWN0IFFTVkZyYW1lc0NvbnRleHQgeworICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4OworICAgIHZvaWQgKmxvZ2N0eDsKKworICAgIC8qIFRoZSBtZW1vcnkgaWRzIGZvciB0aGUgZXh0ZXJuYWwgZnJhbWVzLgorICAgICAqIFJlZmNvdW50ZWQsIHNpbmNlIHdlIG5lZWQgb25lIHJlZmVyZW5jZSBvd25lZCBieSB0aGUgUVNWRnJhbWVzQ29udGV4dAorICAgICAqIChpLmUuIGJ5IHRoZSBlbmNvZGVyL2RlY29kZXIpIGFuZCBhbm90aGVyIG9uZSBnaXZlbiB0byB0aGUgTUZYIHNlc3Npb24KKyAgICAgKiBmcm9tIHRoZSBmcmFtZSBhbGxvY2F0b3IuICovCisgICAgQVZCdWZmZXJSZWYgKm1pZHNfYnVmOworICAgIFFTVk1pZCAqbWlkczsKKyAgICBpbnQgIG5iX21pZHM7Cit9IFFTVkZyYW1lc0NvbnRleHQ7CiAKIC8qKgotICogQ29udmVydCBhIGxpYm1meCBlcnJvciBjb2RlIGludG8gYSBmZm1wZWcgZXJyb3IgY29kZS4KKyAqIENvbnZlcnQgYSBsaWJtZnggZXJyb3IgY29kZSBpbnRvIGFuIGZmbXBlZyBlcnJvciBjb2RlLgogICovCi1pbnQgZmZfcXN2X2Vycm9yKGludCBtZnhfZXJyKTsKK2ludCBmZl9xc3ZfbWFwX2Vycm9yKG1meFN0YXR1cyBtZnhfZXJyLCBjb25zdCBjaGFyICoqZGVzYyk7CisKK2ludCBmZl9xc3ZfcHJpbnRfZXJyb3Iodm9pZCAqbG9nX2N0eCwgbWZ4U3RhdHVzIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZXJyb3Jfc3RyaW5nKTsKKworaW50IGZmX3Fzdl9wcmludF93YXJuaW5nKHZvaWQgKmxvZ19jdHgsIG1meFN0YXR1cyBlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2FybmluZ19zdHJpbmcpOwogCiBpbnQgZmZfcXN2X2NvZGVjX2lkX3RvX21meChlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCk7CitpbnQgZmZfcXN2X3Byb2ZpbGVfdG9fbWZ4KGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkLCBpbnQgcHJvZmlsZSk7CiAKLWludCBmZl9xc3ZfaW5pdF9pbnRlcm5hbF9zZXNzaW9uKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWU2Vzc2lvbiAqcXMsCitpbnQgZmZfcXN2X21hcF9waXhmbXQoZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgKmZvdXJjYyk7CitlbnVtIEFWUGljdHVyZVR5cGUgZmZfcXN2X21hcF9waWN0eXBlKGludCBtZnhfcGljX3R5cGUpOworCitpbnQgZmZfcXN2X2luaXRfaW50ZXJuYWxfc2Vzc2lvbihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIG1meFNlc3Npb24gKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsb2FkX3BsdWdpbnMpOwotaW50IGZmX3Fzdl9jbG9zZV9pbnRlcm5hbF9zZXNzaW9uKFFTVlNlc3Npb24gKnFzKTsKKworaW50IGZmX3Fzdl9pbml0X3Nlc3Npb25fZGV2aWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgbWZ4U2Vzc2lvbiAqcHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmRldmljZV9yZWYsIGNvbnN0IGNoYXIgKmxvYWRfcGx1Z2lucyk7CisKK2ludCBmZl9xc3ZfaW5pdF9zZXNzaW9uX2ZyYW1lcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIG1meFNlc3Npb24gKnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVNWRnJhbWVzQ29udGV4dCAqcXN2X2ZyYW1lc19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbG9hZF9wbHVnaW5zLCBpbnQgb3BhcXVlKTsKKworaW50IGZmX3Fzdl9maW5kX3N1cmZhY2VfaWR4KFFTVkZyYW1lc0NvbnRleHQgKmN0eCwgUVNWRnJhbWUgKmZyYW1lKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfUVNWX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcXN2ZGVjLmMgYi9saWJhdmNvZGVjL3FzdmRlYy5jCmluZGV4IDkxMjU3MDAuLjMyZjFmZTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcXN2ZGVjLmMKKysrIGIvbGliYXZjb2RlYy9xc3ZkZWMuYwpAQCAtMjcsOCArMjcsMTEgQEAKICNpbmNsdWRlIDxtZngvbWZ4dmlkZW8uaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dF9xc3YuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCiAKQEAgLTM4LDEzMiArNDEsMTczIEBACiAjaW5jbHVkZSAicXN2X2ludGVybmFsLmgiCiAjaW5jbHVkZSAicXN2ZGVjLmgiCiAKLWludCBmZl9xc3ZfbWFwX3BpeGZtdChlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0KQotewotICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVko0MjBQOgotICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9OVjEyOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Ci0gICAgfQotfQorY29uc3QgQVZDb2RlY0hXQ29uZmlnSW50ZXJuYWwgKmZmX3Fzdl9od19jb25maWdzW10gPSB7CisgICAgJihjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCkgeworICAgICAgICAucHVibGljID0geworICAgICAgICAgICAgLnBpeF9mbXQgICAgID0gQVZfUElYX0ZNVF9RU1YsCisgICAgICAgICAgICAubWV0aG9kcyAgICAgPSBBVl9DT0RFQ19IV19DT05GSUdfTUVUSE9EX0hXX0ZSQU1FU19DVFggfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSFdfQ09ORklHX01FVEhPRF9BRF9IT0MsCisgICAgICAgICAgICAuZGV2aWNlX3R5cGUgPSBBVl9IV0RFVklDRV9UWVBFX1FTViwKKyAgICAgICAgfSwKKyAgICAgICAgLmh3YWNjZWwgPSBOVUxMLAorICAgIH0sCisgICAgTlVMTAorfTsKIAotc3RhdGljIGludCBxc3ZfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZDb250ZXh0ICpxLCBBVlBhY2tldCAqYXZwa3QpCitzdGF0aWMgaW50IHFzdl9pbml0X3Nlc3Npb24oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZDb250ZXh0ICpxLCBtZnhTZXNzaW9uIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19yZWYsIEFWQnVmZmVyUmVmICpod19kZXZpY2VfcmVmKQogewotICAgIG1meFZpZGVvUGFyYW0gcGFyYW0gPSB7IHsgMCB9IH07Ci0gICAgbWZ4Qml0c3RyZWFtIGJzICAgPSB7IHsgeyAwIH0gfSB9OwogICAgIGludCByZXQ7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzWzNdID0geyBBVl9QSVhfRk1UX1FTViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTlYxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9OwogCi0gICAgcmV0ID0gZmZfZ2V0X2Zvcm1hdChhdmN0eCwgcGl4X2ZtdHMpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OworICAgIGlmIChzZXNzaW9uKSB7CisgICAgICAgIHEtPnNlc3Npb24gPSBzZXNzaW9uOworICAgIH0gZWxzZSBpZiAoaHdfZnJhbWVzX3JlZikgeworICAgICAgICBpZiAocS0+aW50ZXJuYWxfc2Vzc2lvbikgeworICAgICAgICAgICAgTUZYQ2xvc2UocS0+aW50ZXJuYWxfc2Vzc2lvbik7CisgICAgICAgICAgICBxLT5pbnRlcm5hbF9zZXNzaW9uID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnEtPmZyYW1lc19jdHguaHdfZnJhbWVzX2N0eCk7CiAKLSAgICBhdmN0eC0+cGl4X2ZtdCAgICAgID0gcmV0OworICAgICAgICBxLT5mcmFtZXNfY3R4Lmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKGh3X2ZyYW1lc19yZWYpOworICAgICAgICBpZiAoIXEtPmZyYW1lc19jdHguaHdfZnJhbWVzX2N0eCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBxLT5pb3BhdHRlcm4gID0gTUZYX0lPUEFUVEVSTl9PVVRfU1lTVEVNX01FTU9SWTsKLSAgICBpZiAoYXZjdHgtPmh3YWNjZWxfY29udGV4dCkgewotICAgICAgICBBVlFTVkNvbnRleHQgKnFzdiA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgICAgIHJldCA9IGZmX3Fzdl9pbml0X3Nlc3Npb25fZnJhbWVzKGF2Y3R4LCAmcS0+aW50ZXJuYWxfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnEtPmZyYW1lc19jdHgsIHEtPmxvYWRfcGx1Z2lucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+aW9wYXR0ZXJuID09IE1GWF9JT1BBVFRFUk5fT1VUX09QQVFVRV9NRU1PUlkpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZxLT5mcmFtZXNfY3R4Lmh3X2ZyYW1lc19jdHgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogCi0gICAgICAgIHEtPnNlc3Npb24gICAgICAgID0gcXN2LT5zZXNzaW9uOwotICAgICAgICBxLT5pb3BhdHRlcm4gICAgICA9IHFzdi0+aW9wYXR0ZXJuOwotICAgICAgICBxLT5leHRfYnVmZmVycyAgICA9IHFzdi0+ZXh0X2J1ZmZlcnM7Ci0gICAgICAgIHEtPm5iX2V4dF9idWZmZXJzID0gcXN2LT5uYl9leHRfYnVmZmVyczsKLSAgICB9Ci0gICAgaWYgKCFxLT5zZXNzaW9uKSB7Ci0gICAgICAgIGlmICghcS0+aW50ZXJuYWxfcXMuc2Vzc2lvbikgewotICAgICAgICAgICAgcmV0ID0gZmZfcXN2X2luaXRfaW50ZXJuYWxfc2Vzc2lvbihhdmN0eCwgJnEtPmludGVybmFsX3FzLAorICAgICAgICBxLT5zZXNzaW9uID0gcS0+aW50ZXJuYWxfc2Vzc2lvbjsKKyAgICB9IGVsc2UgaWYgKGh3X2RldmljZV9yZWYpIHsKKyAgICAgICAgaWYgKHEtPmludGVybmFsX3Nlc3Npb24pIHsKKyAgICAgICAgICAgIE1GWENsb3NlKHEtPmludGVybmFsX3Nlc3Npb24pOworICAgICAgICAgICAgcS0+aW50ZXJuYWxfc2Vzc2lvbiA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBmZl9xc3ZfaW5pdF9zZXNzaW9uX2RldmljZShhdmN0eCwgJnEtPmludGVybmFsX3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3X2RldmljZV9yZWYsIHEtPmxvYWRfcGx1Z2lucyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBxLT5zZXNzaW9uID0gcS0+aW50ZXJuYWxfc2Vzc2lvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXEtPmludGVybmFsX3Nlc3Npb24pIHsKKyAgICAgICAgICAgIHJldCA9IGZmX3Fzdl9pbml0X2ludGVybmFsX3Nlc3Npb24oYXZjdHgsICZxLT5pbnRlcm5hbF9zZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLT5sb2FkX3BsdWdpbnMpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCi0gICAgICAgIHEtPnNlc3Npb24gPSBxLT5pbnRlcm5hbF9xcy5zZXNzaW9uOworICAgICAgICBxLT5zZXNzaW9uID0gcS0+aW50ZXJuYWxfc2Vzc2lvbjsKICAgICB9CiAKLSAgICBpZiAoYXZwa3QtPnNpemUpIHsKLSAgICAgICAgYnMuRGF0YSAgICAgICA9IGF2cGt0LT5kYXRhOwotICAgICAgICBicy5EYXRhTGVuZ3RoID0gYXZwa3QtPnNpemU7Ci0gICAgICAgIGJzLk1heExlbmd0aCAgPSBicy5EYXRhTGVuZ3RoOwotICAgICAgICBicy5UaW1lU3RhbXAgID0gYXZwa3QtPnB0czsKLSAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0KLSAgICByZXQgPSBmZl9xc3ZfY29kZWNfaWRfdG9fbWZ4KGF2Y3R4LT5jb2RlY19pZCk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2RlY19pZCAlMDh4XG4iLCBhdmN0eC0+Y29kZWNfaWQpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHBhcmFtLm1meC5Db2RlY0lkID0gcmV0OwotCi0gICAgcmV0ID0gTUZYVmlkZW9ERUNPREVfRGVjb2RlSGVhZGVyKHEtPnNlc3Npb24sICZicywgJnBhcmFtKTsKLSAgICBpZiAoTUZYX0VSUl9NT1JFX0RBVEE9PXJldCkgewotICAgICAgICAvKiB0aGlzIGNvZGUgbWVhbnMgdGhhdCBoZWFkZXIgbm90IGZvdW5kIHNvIHdlIHJldHVybiBwYWNrZXQgc2l6ZSB0byBza2lwCi0gICAgICAgICAgIGEgY3VycmVudCBwYWNrZXQKLSAgICAgICAgICovCi0gICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKLSAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWNvZGUgaGVhZGVyIGVycm9yICVkXG4iLCByZXQpOwotICAgICAgICByZXR1cm4gZmZfcXN2X2Vycm9yKHJldCk7Ci0gICAgfQotICAgIHBhcmFtLklPUGF0dGVybiAgID0gcS0+aW9wYXR0ZXJuOwotICAgIHBhcmFtLkFzeW5jRGVwdGggID0gcS0+YXN5bmNfZGVwdGg7Ci0gICAgcGFyYW0uRXh0UGFyYW0gICAgPSBxLT5leHRfYnVmZmVyczsKLSAgICBwYXJhbS5OdW1FeHRQYXJhbSA9IHEtPm5iX2V4dF9idWZmZXJzOwotICAgIHBhcmFtLm1meC5GcmFtZUluZm8uQml0RGVwdGhMdW1hICAgPSA4OwotICAgIHBhcmFtLm1meC5GcmFtZUluZm8uQml0RGVwdGhDaHJvbWEgPSA4OwotCi0gICAgcmV0ID0gTUZYVmlkZW9ERUNPREVfSW5pdChxLT5zZXNzaW9uLCAmcGFyYW0pOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGlmIChNRlhfRVJSX0lOVkFMSURfVklERU9fUEFSQU09PXJldCkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIkVycm9yIGluaXRpYWxpemluZyB0aGUgTUZYIHZpZGVvIGRlY29kZXIsIHVuc3VwcG9ydGVkIHZpZGVvXG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJFcnJvciBpbml0aWFsaXppbmcgdGhlIE1GWCB2aWRlbyBkZWNvZGVyICVkXG4iLCByZXQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmZl9xc3ZfZXJyb3IocmV0KTsKLSAgICB9Ci0KLSAgICBhdmN0eC0+cHJvZmlsZSAgICAgID0gcGFyYW0ubWZ4LkNvZGVjUHJvZmlsZTsKLSAgICBhdmN0eC0+bGV2ZWwgICAgICAgID0gcGFyYW0ubWZ4LkNvZGVjTGV2ZWw7Ci0gICAgYXZjdHgtPmNvZGVkX3dpZHRoICA9IHBhcmFtLm1meC5GcmFtZUluZm8uV2lkdGg7Ci0gICAgYXZjdHgtPmNvZGVkX2hlaWdodCA9IHBhcmFtLm1meC5GcmFtZUluZm8uSGVpZ2h0OwotICAgIGF2Y3R4LT53aWR0aCAgICAgICAgPSBwYXJhbS5tZnguRnJhbWVJbmZvLkNyb3BXIC0gcGFyYW0ubWZ4LkZyYW1lSW5mby5Dcm9wWDsKLSAgICBhdmN0eC0+aGVpZ2h0ICAgICAgID0gcGFyYW0ubWZ4LkZyYW1lSW5mby5Dcm9wSCAtIHBhcmFtLm1meC5GcmFtZUluZm8uQ3JvcFk7Ci0KLSAgICAvKiBtYXhpbXVtIGRlY29kZXIgbGF0ZW5jeSBzaG91bGQgYmUgbm90IGV4Y2VlZCBtYXggRFBCIHNpemUgZm9yIGguMjY0IGFuZAotICAgICAgIEhFVkMgd2hpY2ggaXMgMTYgZm9yIGJvdGggY2FzZXMuCi0gICAgICAgU28gd2VhcmUgIHByZS1hbGxvY2F0aW5nIGZpZm8gYmlnIGVub3VnaCBmb3IgMTcgZWxlbWVudHM6Ci0gICAgICovCi0gICAgaWYgKCFxLT5hc3luY19maWZvKSB7Ci0gICAgICAgIHEtPmFzeW5jX2ZpZm8gPSBhdl9maWZvX2FsbG9jKCgxICsgMTYpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihtZnhTeW5jUG9pbnQpICsgc2l6ZW9mKFFTVkZyYW1lKikpKTsKLSAgICAgICAgaWYgKCFxLT5hc3luY19maWZvKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICBpZiAoIXEtPmlucHV0X2ZpZm8pIHsKLSAgICAgICAgcS0+aW5wdXRfZmlmbyA9IGF2X2ZpZm9fYWxsb2MoMTAyNCoxNik7Ci0gICAgICAgIGlmICghcS0+aW5wdXRfZmlmbykKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgaWYgKCFxLT5wa3RfZmlmbykgewotICAgICAgICBxLT5wa3RfZmlmbyA9IGF2X2ZpZm9fYWxsb2MoIHNpemVvZihBVlBhY2tldCkgKiAoMSArIDE2KSApOwotICAgICAgICBpZiAoIXEtPnBrdF9maWZvKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0gICAgcS0+ZW5naW5lX3JlYWR5ID0gMTsKKyAgICAvKiBtYWtlIHN1cmUgdGhlIGRlY29kZXIgaXMgdW5pbml0aWFsaXplZCAqLworICAgIE1GWFZpZGVvREVDT0RFX0Nsb3NlKHEtPnNlc3Npb24pOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYWxsb2NfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZGcmFtZSAqZnJhbWUpCitzdGF0aWMgaW50IHFzdl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFFTVkNvbnRleHQgKnEpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIG1meFNlc3Npb24gc2Vzc2lvbiA9IE5VTEw7CisgICAgaW50IGlvcGF0dGVybiA9IDA7CisgICAgbWZ4VmlkZW9QYXJhbSBwYXJhbSA9IHsgMCB9OworICAgIGludCBmcmFtZV93aWR0aCAgPSBhdmN0eC0+Y29kZWRfd2lkdGg7CisgICAgaW50IGZyYW1lX2hlaWdodCA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisgICAgaW50IHJldDsKKworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5zd19waXhfZm10KTsKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKworICAgIGlmICghcS0+YXN5bmNfZmlmbykgeworICAgICAgICBxLT5hc3luY19maWZvID0gYXZfZmlmb19hbGxvYygoMSArIHEtPmFzeW5jX2RlcHRoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YobWZ4U3luY1BvaW50KikgKyBzaXplb2YoUVNWRnJhbWUqKSkpOworICAgICAgICBpZiAoIXEtPmFzeW5jX2ZpZm8pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1FTViAmJiBhdmN0eC0+aHdhY2NlbF9jb250ZXh0KSB7CisgICAgICAgIEFWUVNWQ29udGV4dCAqdXNlcl9jdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgICAgICBzZXNzaW9uICAgICAgICAgICA9IHVzZXJfY3R4LT5zZXNzaW9uOworICAgICAgICBpb3BhdHRlcm4gICAgICAgICA9IHVzZXJfY3R4LT5pb3BhdHRlcm47CisgICAgICAgIHEtPmV4dF9idWZmZXJzICAgID0gdXNlcl9jdHgtPmV4dF9idWZmZXJzOworICAgICAgICBxLT5uYl9leHRfYnVmZmVycyA9IHVzZXJfY3R4LT5uYl9leHRfYnVmZmVyczsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWF2Y3R4LT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgICAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGZyYW1lc19jdHgtPmh3Y3R4OworCisgICAgICAgIGlmICghaW9wYXR0ZXJuKSB7CisgICAgICAgICAgICBpZiAoZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlICYgTUZYX01FTVRZUEVfT1BBUVVFX0ZSQU1FKQorICAgICAgICAgICAgICAgIGlvcGF0dGVybiA9IE1GWF9JT1BBVFRFUk5fT1VUX09QQVFVRV9NRU1PUlk7CisgICAgICAgICAgICBlbHNlIGlmIChmcmFtZXNfaHdjdHgtPmZyYW1lX3R5cGUgJiBNRlhfTUVNVFlQRV9WSURFT19NRU1PUllfREVDT0RFUl9UQVJHRVQpCisgICAgICAgICAgICAgICAgaW9wYXR0ZXJuID0gTUZYX0lPUEFUVEVSTl9PVVRfVklERU9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFpb3BhdHRlcm4pCisgICAgICAgIGlvcGF0dGVybiA9IE1GWF9JT1BBVFRFUk5fT1VUX1NZU1RFTV9NRU1PUlk7CisgICAgcS0+aW9wYXR0ZXJuID0gaW9wYXR0ZXJuOworCisgICAgcmV0ID0gcXN2X2luaXRfc2Vzc2lvbihhdmN0eCwgcSwgc2Vzc2lvbiwgYXZjdHgtPmh3X2ZyYW1lc19jdHgsIGF2Y3R4LT5od19kZXZpY2VfY3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBhbiBNRlggc2Vzc2lvblxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gZmZfcXN2X2NvZGVjX2lkX3RvX21meChhdmN0eC0+Y29kZWNfaWQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGFyYW0ubWZ4LkNvZGVjSWQgICAgICA9IHJldDsKKyAgICBwYXJhbS5tZnguQ29kZWNQcm9maWxlID0gZmZfcXN2X3Byb2ZpbGVfdG9fbWZ4KGF2Y3R4LT5jb2RlY19pZCwgYXZjdHgtPnByb2ZpbGUpOworICAgIHBhcmFtLm1meC5Db2RlY0xldmVsICAgPSBhdmN0eC0+bGV2ZWwgPT0gRkZfTEVWRUxfVU5LTk9XTiA/IE1GWF9MRVZFTF9VTktOT1dOIDogYXZjdHgtPmxldmVsOworCisgICAgcGFyYW0ubWZ4LkZyYW1lSW5mby5CaXREZXB0aEx1bWEgICA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgcGFyYW0ubWZ4LkZyYW1lSW5mby5CaXREZXB0aENocm9tYSA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgcGFyYW0ubWZ4LkZyYW1lSW5mby5TaGlmdCAgICAgICAgICA9IGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4OworICAgIHBhcmFtLm1meC5GcmFtZUluZm8uRm91ckNDICAgICAgICAgPSBxLT5mb3VyY2M7CisgICAgcGFyYW0ubWZ4LkZyYW1lSW5mby5XaWR0aCAgICAgICAgICA9IGZyYW1lX3dpZHRoOworICAgIHBhcmFtLm1meC5GcmFtZUluZm8uSGVpZ2h0ICAgICAgICAgPSBmcmFtZV9oZWlnaHQ7CisgICAgcGFyYW0ubWZ4LkZyYW1lSW5mby5DaHJvbWFGb3JtYXQgICA9IE1GWF9DSFJPTUFGT1JNQVRfWVVWNDIwOworCisgICAgc3dpdGNoIChhdmN0eC0+ZmllbGRfb3JkZXIpIHsKKyAgICBjYXNlIEFWX0ZJRUxEX1BST0dSRVNTSVZFOgorICAgICAgICBwYXJhbS5tZnguRnJhbWVJbmZvLlBpY1N0cnVjdCA9IE1GWF9QSUNTVFJVQ1RfUFJPR1JFU1NJVkU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfRklFTERfVFQ6CisgICAgICAgIHBhcmFtLm1meC5GcmFtZUluZm8uUGljU3RydWN0ID0gTUZYX1BJQ1NUUlVDVF9GSUVMRF9URkY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfRklFTERfQkI6CisgICAgICAgIHBhcmFtLm1meC5GcmFtZUluZm8uUGljU3RydWN0ID0gTUZYX1BJQ1NUUlVDVF9GSUVMRF9CRkY7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHBhcmFtLm1meC5GcmFtZUluZm8uUGljU3RydWN0ID0gTUZYX1BJQ1NUUlVDVF9VTktOT1dOOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwYXJhbS5JT1BhdHRlcm4gICA9IHEtPmlvcGF0dGVybjsKKyAgICBwYXJhbS5Bc3luY0RlcHRoICA9IHEtPmFzeW5jX2RlcHRoOworICAgIHBhcmFtLkV4dFBhcmFtICAgID0gcS0+ZXh0X2J1ZmZlcnM7CisgICAgcGFyYW0uTnVtRXh0UGFyYW0gPSBxLT5uYl9leHRfYnVmZmVyczsKKworICAgIHJldCA9IE1GWFZpZGVvREVDT0RFX0luaXQocS0+c2Vzc2lvbiwgJnBhcmFtKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIGZmX3Fzdl9wcmludF9lcnJvcihhdmN0eCwgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpbml0aWFsaXppbmcgdGhlIE1GWCB2aWRlbyBkZWNvZGVyIik7CisKKyAgICBxLT5mcmFtZV9pbmZvID0gcGFyYW0ubWZ4LkZyYW1lSW5mbzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFsbG9jX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWQ29udGV4dCAqcSwgUVNWRnJhbWUgKmZyYW1lKQogewogICAgIGludCByZXQ7CiAKQEAgLTE3MiwyMiArMjE2LDMwIEBACiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBpZiAoZnJhbWUtPmZyYW1lLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9RU1YpIHsKLSAgICAgICAgZnJhbWUtPnN1cmZhY2UgPSAobWZ4RnJhbWVTdXJmYWNlMSopZnJhbWUtPmZyYW1lLT5kYXRhWzNdOworICAgICAgICBmcmFtZS0+c3VyZmFjZSA9ICoobWZ4RnJhbWVTdXJmYWNlMSopZnJhbWUtPmZyYW1lLT5kYXRhWzNdOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyYW1lLT5zdXJmYWNlX2ludGVybmFsLkluZm8uQml0RGVwdGhMdW1hICAgPSA4OwotICAgICAgICBmcmFtZS0+c3VyZmFjZV9pbnRlcm5hbC5JbmZvLkJpdERlcHRoQ2hyb21hID0gODsKLSAgICAgICAgZnJhbWUtPnN1cmZhY2VfaW50ZXJuYWwuSW5mby5Gb3VyQ0MgICAgICAgICA9IE1GWF9GT1VSQ0NfTlYxMjsKLSAgICAgICAgZnJhbWUtPnN1cmZhY2VfaW50ZXJuYWwuSW5mby5XaWR0aCAgICAgICAgICA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKLSAgICAgICAgZnJhbWUtPnN1cmZhY2VfaW50ZXJuYWwuSW5mby5IZWlnaHQgICAgICAgICA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7Ci0gICAgICAgIGZyYW1lLT5zdXJmYWNlX2ludGVybmFsLkluZm8uQ2hyb21hRm9ybWF0ICAgPSBNRlhfQ0hST01BRk9STUFUX1lVVjQyMDsKKyAgICAgICAgZnJhbWUtPnN1cmZhY2UuSW5mbyA9IHEtPmZyYW1lX2luZm87CiAKLSAgICAgICAgZnJhbWUtPnN1cmZhY2VfaW50ZXJuYWwuRGF0YS5QaXRjaExvdyA9IGZyYW1lLT5mcmFtZS0+bGluZXNpemVbMF07Ci0gICAgICAgIGZyYW1lLT5zdXJmYWNlX2ludGVybmFsLkRhdGEuWSAgICAgICAgPSBmcmFtZS0+ZnJhbWUtPmRhdGFbMF07Ci0gICAgICAgIGZyYW1lLT5zdXJmYWNlX2ludGVybmFsLkRhdGEuVVYgICAgICAgPSBmcmFtZS0+ZnJhbWUtPmRhdGFbMV07Ci0KLSAgICAgICAgZnJhbWUtPnN1cmZhY2UgPSAmZnJhbWUtPnN1cmZhY2VfaW50ZXJuYWw7CisgICAgICAgIGZyYW1lLT5zdXJmYWNlLkRhdGEuUGl0Y2hMb3cgPSBmcmFtZS0+ZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICBmcmFtZS0+c3VyZmFjZS5EYXRhLlkgICAgICAgID0gZnJhbWUtPmZyYW1lLT5kYXRhWzBdOworICAgICAgICBmcmFtZS0+c3VyZmFjZS5EYXRhLlVWICAgICAgID0gZnJhbWUtPmZyYW1lLT5kYXRhWzFdOwogICAgIH0KIAorICAgIGlmIChxLT5mcmFtZXNfY3R4Lm1pZHMpIHsKKyAgICAgICAgcmV0ID0gZmZfcXN2X2ZpbmRfc3VyZmFjZV9pZHgoJnEtPmZyYW1lc19jdHgsIGZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGZyYW1lLT5zdXJmYWNlLkRhdGEuTWVtSWQgPSAmcS0+ZnJhbWVzX2N0eC5taWRzW3JldF07CisgICAgfQorICAgIGZyYW1lLT5zdXJmYWNlLkRhdGEuRXh0UGFyYW0gICAgPSAmZnJhbWUtPmV4dF9wYXJhbTsKKyAgICBmcmFtZS0+c3VyZmFjZS5EYXRhLk51bUV4dFBhcmFtID0gMTsKKyAgICBmcmFtZS0+ZXh0X3BhcmFtICAgICAgICAgICAgICAgID0gKG1meEV4dEJ1ZmZlciopJmZyYW1lLT5kZWNfaW5mbzsKKyAgICBmcmFtZS0+ZGVjX2luZm8uSGVhZGVyLkJ1ZmZlcklkID0gTUZYX0VYVEJVRkZfREVDT0RFRF9GUkFNRV9JTkZPOworICAgIGZyYW1lLT5kZWNfaW5mby5IZWFkZXIuQnVmZmVyU3ogPSBzaXplb2YoZnJhbWUtPmRlY19pbmZvKTsKKworICAgIGZyYW1lLT51c2VkID0gMTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0xOTUsOCArMjQ3LDggQEAKIHsKICAgICBRU1ZGcmFtZSAqY3VyID0gcS0+d29ya19mcmFtZXM7CiAgICAgd2hpbGUgKGN1cikgewotICAgICAgICBpZiAoY3VyLT5zdXJmYWNlICYmICFjdXItPnN1cmZhY2UtPkRhdGEuTG9ja2VkICYmICFjdXItPnF1ZXVlZCkgewotICAgICAgICAgICAgY3VyLT5zdXJmYWNlID0gTlVMTDsKKyAgICAgICAgaWYgKGN1ci0+dXNlZCAmJiAhY3VyLT5zdXJmYWNlLkRhdGEuTG9ja2VkICYmICFjdXItPnF1ZXVlZCkgeworICAgICAgICAgICAgY3VyLT51c2VkID0gMDsKICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGN1ci0+ZnJhbWUpOwogICAgICAgICB9CiAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKQEAgLTIxMywxMSArMjY1LDExIEBACiAgICAgZnJhbWUgPSBxLT53b3JrX2ZyYW1lczsKICAgICBsYXN0ICA9ICZxLT53b3JrX2ZyYW1lczsKICAgICB3aGlsZSAoZnJhbWUpIHsKLSAgICAgICAgaWYgKCFmcmFtZS0+c3VyZmFjZSkgewotICAgICAgICAgICAgcmV0ID0gYWxsb2NfZnJhbWUoYXZjdHgsIGZyYW1lKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+dXNlZCkgeworICAgICAgICAgICAgcmV0ID0gYWxsb2NfZnJhbWUoYXZjdHgsIHEsIGZyYW1lKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAqc3VyZiA9IGZyYW1lLT5zdXJmYWNlOworICAgICAgICAgICAgKnN1cmYgPSAmZnJhbWUtPnN1cmZhY2U7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogCkBAIC0yMzUsMTEgKzI4NywxMSBAQAogICAgIH0KICAgICAqbGFzdCA9IGZyYW1lOwogCi0gICAgcmV0ID0gYWxsb2NfZnJhbWUoYXZjdHgsIGZyYW1lKTsKKyAgICByZXQgPSBhbGxvY19mcmFtZShhdmN0eCwgcSwgZnJhbWUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgKnN1cmYgPSBmcmFtZS0+c3VyZmFjZTsKKyAgICAqc3VyZiA9ICZmcmFtZS0+c3VyZmFjZTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjQ4LDE3NyArMzAwLDEwNSBAQAogewogICAgIFFTVkZyYW1lICpjdXIgPSBxLT53b3JrX2ZyYW1lczsKICAgICB3aGlsZSAoY3VyKSB7Ci0gICAgICAgIGlmIChzdXJmID09IGN1ci0+c3VyZmFjZSkKKyAgICAgICAgaWYgKHN1cmYgPT0gJmN1ci0+c3VyZmFjZSkKICAgICAgICAgICAgIHJldHVybiBjdXI7CiAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLS8qICBUaGlzIGZ1bmN0aW9uIHVzZXMgZm9yICdzbWFydCcgcmVsZWFzaW5nIG9mIGNvbnN1bWVkIGRhdGEKLSAgICBmcm9tIHRoZSBpbnB1dCBiaXRzdHJlYW0gZmlmby4KLSAgICBTaW5jZSB0aGUgaW5wdXQgZmlmbyBtYXBwZWQgdG8gbWZ4Qml0c3RyZWFtIHdoaWNoIGRvZXMgbm90IHVuZGVyc3RhbmQKLSAgICBhIHdyYXBwaW5nIG9mIGRhdGEgb3ZlciBmaWZvIGVuZCwgd2Ugc2hvdWxkIGFsc28gdG8gcmVsb2NhdGUgYSBwb3NzaWJsZQotICAgIGRhdGEgcmVzdCB0byBmaWZvIGJlZ2luLiBJZiByZXN0IG9mIGRhdGEgaXMgYWJzZW50IHRoZW4gd2UganVzdCByZXNldCBmaWZvJ3MKLSAgICBwb2ludGVycyB0byBpbml0aWFsIHBvc2l0aW9ucy4KLSAgICBOT1RFIHRoZSBjYXNlIHdoZW4gZmlmbyBkb2VzIGNvbnRhaW4gdW5jb25zdW1lZCBkYXRhIGlzIHJhcmUgYW5kIHR5cGljYWwKLSAgICBhbW91bnQgb2Ygc3VjaCBkYXRhIGlzIDEuLjQgYnl0ZXMuCi0qLwotc3RhdGljIHZvaWQgcXN2X2ZpZm9fcmVsb2NhdGUoQVZGaWZvQnVmZmVyICpmLCBpbnQgYnl0ZXNfdG9fZnJlZSkKLXsKLSAgICBpbnQgZGF0YV9zaXplOwotICAgIGludCBkYXRhX3Jlc3QgPSAwOwotCi0gICAgYXZfZmlmb19kcmFpbihmLCBieXRlc190b19mcmVlKTsKLQotICAgIGRhdGFfc2l6ZSA9IGF2X2ZpZm9fc2l6ZShmKTsKLSAgICBpZiAoZGF0YV9zaXplID4gMCkgewotICAgICAgICBpZiAoZi0+YnVmZmVyIT1mLT5ycHRyKSB7Ci0gICAgICAgICAgICBpZiAoIChmLT5lbmQgLSBmLT5ycHRyKSA8IGRhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIGRhdGFfcmVzdCA9IGRhdGFfc2l6ZSAtIChmLT5lbmQgLSBmLT5ycHRyKTsKLSAgICAgICAgICAgICAgICBkYXRhX3NpemUtPWRhdGFfcmVzdDsKLSAgICAgICAgICAgICAgICBtZW1tb3ZlKGYtPmJ1ZmZlcitkYXRhX3NpemUsIGYtPmJ1ZmZlciwgZGF0YV9yZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbW1vdmUoZi0+YnVmZmVyLCBmLT5ycHRyLCBkYXRhX3NpemUpOwotICAgICAgICAgICAgZGF0YV9zaXplKz0gZGF0YV9yZXN0OwotICAgICAgICB9Ci0gICAgfQotICAgIGYtPnJwdHIgPSBmLT5idWZmZXI7Ci0gICAgZi0+d3B0ciA9IGYtPmJ1ZmZlciArIGRhdGFfc2l6ZTsKLSAgICBmLT53bmR4ID0gZGF0YV9zaXplOwotICAgIGYtPnJuZHggPSAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGNsb3NlX2RlY29kZXIoUVNWQ29udGV4dCAqcSkKLXsKLSAgICBRU1ZGcmFtZSAqY3VyOwotCi0gICAgaWYgKHEtPnNlc3Npb24pCi0gICAgICAgIE1GWFZpZGVvREVDT0RFX0Nsb3NlKHEtPnNlc3Npb24pOwotCi0gICAgY3VyID0gcS0+d29ya19mcmFtZXM7Ci0gICAgd2hpbGUgKGN1cikgewotICAgICAgICBxLT53b3JrX2ZyYW1lcyA9IGN1ci0+bmV4dDsKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmY3VyLT5mcmFtZSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZjdXIpOwotICAgICAgICBjdXIgPSBxLT53b3JrX2ZyYW1lczsKLSAgICB9Ci0KLSAgICBxLT5lbmdpbmVfcmVhZHkgICA9IDA7Ci0gICAgcS0+cmVpbml0X3BlbmRpbmcgPSAwOwotfQotCi1zdGF0aWMgaW50IGRvX3Fzdl9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZDb250ZXh0ICpxLAotICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQorc3RhdGljIGludCBxc3ZfZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWQ29udGV4dCAqcSwKKyAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQogewogICAgIFFTVkZyYW1lICpvdXRfZnJhbWU7CiAgICAgbWZ4RnJhbWVTdXJmYWNlMSAqaW5zdXJmOwogICAgIG1meEZyYW1lU3VyZmFjZTEgKm91dHN1cmY7Ci0gICAgbWZ4U3luY1BvaW50IHN5bmM7CisgICAgbWZ4U3luY1BvaW50ICpzeW5jOwogICAgIG1meEJpdHN0cmVhbSBicyA9IHsgeyB7IDAgfSB9IH07CiAgICAgaW50IHJldDsKLSAgICBpbnQgbl9vdXRfZnJhbWVzOwotICAgIGludCBidWZmZXJlZCA9IDA7Ci0gICAgaW50IGZsdXNoICAgID0gIWF2cGt0LT5zaXplIHx8IHEtPnJlaW5pdF9wZW5kaW5nOwogCi0gICAgaWYgKCFxLT5lbmdpbmVfcmVhZHkpIHsKLSAgICAgICAgcmV0ID0gcXN2X2RlY29kZV9pbml0KGF2Y3R4LCBxLCBhdnBrdCk7Ci0gICAgICAgIGlmIChyZXQpCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGlmICghZmx1c2gpIHsKLSAgICAgICAgaWYgKGF2X2ZpZm9fc2l6ZShxLT5pbnB1dF9maWZvKSkgewotICAgICAgICAgICAgLyogd2UgaGF2ZSBnb3QgcmVzdCBvZiBwcmV2aW91cyBwYWNrZXQgaW50byBidWZmZXIgKi8KLSAgICAgICAgICAgIGlmIChhdl9maWZvX3NwYWNlKHEtPmlucHV0X2ZpZm8pIDwgYXZwa3QtPnNpemUpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBhdl9maWZvX2dyb3cocS0+aW5wdXRfZmlmbywgYXZwa3QtPnNpemUpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHEtPmlucHV0X2ZpZm8sIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSwgTlVMTCk7Ci0gICAgICAgICAgICBicy5EYXRhICAgICAgID0gcS0+aW5wdXRfZmlmby0+cnB0cjsKLSAgICAgICAgICAgIGJzLkRhdGFMZW5ndGggPSBhdl9maWZvX3NpemUocS0+aW5wdXRfZmlmbyk7Ci0gICAgICAgICAgICBidWZmZXJlZCA9IDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBicy5EYXRhICAgICAgID0gYXZwa3QtPmRhdGE7Ci0gICAgICAgICAgICBicy5EYXRhTGVuZ3RoID0gYXZwa3QtPnNpemU7Ci0gICAgICAgIH0KKyAgICBpZiAoYXZwa3QtPnNpemUpIHsKKyAgICAgICAgYnMuRGF0YSAgICAgICA9IGF2cGt0LT5kYXRhOworICAgICAgICBicy5EYXRhTGVuZ3RoID0gYXZwa3QtPnNpemU7CiAgICAgICAgIGJzLk1heExlbmd0aCAgPSBicy5EYXRhTGVuZ3RoOwogICAgICAgICBicy5UaW1lU3RhbXAgID0gYXZwa3QtPnB0czsKKyAgICAgICAgaWYgKGF2Y3R4LT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9QUk9HUkVTU0lWRSkKKyAgICAgICAgICAgIGJzLkRhdGFGbGFnICAgfD0gTUZYX0JJVFNUUkVBTV9DT01QTEVURV9GUkFNRTsKICAgICB9CiAKLSAgICB3aGlsZSAoMSkgeworICAgIHN5bmMgPSBhdl9tYWxsb2N6KHNpemVvZigqc3luYykpOworICAgIGlmICghc3luYykgeworICAgICAgICBhdl9mcmVlcCgmc3luYyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZG8gewogICAgICAgICByZXQgPSBnZXRfc3VyZmFjZShhdmN0eCwgcSwgJmluc3VyZik7Ci0gICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnN5bmMpOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmV0ID0gTUZYVmlkZW9ERUNPREVfRGVjb2RlRnJhbWVBc3luYyhxLT5zZXNzaW9uLCBmbHVzaCA/IE5VTEwgOiAmYnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3VyZiwgJm91dHN1cmYsICZzeW5jKTsKLSAgICAgICAgICAgIGlmIChyZXQgIT0gTUZYX1dSTl9ERVZJQ0VfQlVTWSkKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IE1GWFZpZGVvREVDT0RFX0RlY29kZUZyYW1lQXN5bmMocS0+c2Vzc2lvbiwgYXZwa3QtPnNpemUgPyAmYnMgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3VyZiwgJm91dHN1cmYsIHN5bmMpOworICAgICAgICBpZiAocmV0ID09IE1GWF9XUk5fREVWSUNFX0JVU1kpCiAgICAgICAgICAgICBhdl91c2xlZXAoNTAwKTsKLSAgICAgICAgfSB3aGlsZSAoMSk7CiAKLSAgICAgICAgaWYgKE1GWF9XUk5fVklERU9fUEFSQU1fQ0hBTkdFRD09cmV0KSB7Ci0gICAgICAgICAgICAvKiBUT0RPOiBoYW5kbGUgaGVyZSBtaW5vciBzZXF1ZW5jZSBoZWFkZXIgY2hhbmdpbmcgKi8KLSAgICAgICAgfSBlbHNlIGlmIChNRlhfRVJSX0lOQ09NUEFUSUJMRV9WSURFT19QQVJBTT09cmV0KSB7Ci0gICAgICAgICAgICBhdl9maWZvX3Jlc2V0KHEtPmlucHV0X2ZpZm8pOwotICAgICAgICAgICAgZmx1c2ggPSBxLT5yZWluaXRfcGVuZGluZyA9IDE7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQorICAgIH0gd2hpbGUgKHJldCA9PSBNRlhfV1JOX0RFVklDRV9CVVNZIHx8IHJldCA9PSBNRlhfRVJSX01PUkVfU1VSRkFDRSk7CiAKLSAgICAgICAgaWYgKHN5bmMpIHsKLSAgICAgICAgICAgIFFTVkZyYW1lICpvdXRfZnJhbWUgPSBmaW5kX2ZyYW1lKHEsIG91dHN1cmYpOwotCi0gICAgICAgICAgICBpZiAoIW91dF9mcmFtZSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHJldHVybmVkIHN1cmZhY2UgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgZnJhbWVcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb3V0X2ZyYW1lLT5xdWV1ZWQgPSAxOwotICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHEtPmFzeW5jX2ZpZm8sICZvdXRfZnJhbWUsIHNpemVvZihvdXRfZnJhbWUpLCBOVUxMKTsKLSAgICAgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShxLT5hc3luY19maWZvLCAmc3luYywgICAgICBzaXplb2Yoc3luYyksICAgICAgTlVMTCk7Ci0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChNRlhfRVJSX01PUkVfU1VSRkFDRSAhPSByZXQgJiYgcmV0IDwgMCkKLSAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChyZXQgIT0gTUZYX0VSUl9OT05FICYmCisgICAgICAgIHJldCAhPSBNRlhfRVJSX01PUkVfREFUQSAmJgorICAgICAgICByZXQgIT0gTUZYX1dSTl9WSURFT19QQVJBTV9DSEFOR0VEICYmCisgICAgICAgIHJldCAhPSBNRlhfRVJSX01PUkVfU1VSRkFDRSkgeworICAgICAgICBhdl9mcmVlcCgmc3luYyk7CisgICAgICAgIHJldHVybiBmZl9xc3ZfcHJpbnRfZXJyb3IoYXZjdHgsIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZHVyaW5nIFFTViBkZWNvZGluZy4iKTsKICAgICB9CiAKICAgICAvKiBtYWtlIHN1cmUgd2UgZG8gbm90IGVudGVyIGFuIGluZmluaXRlIGxvb3AgaWYgdGhlIFNESwogICAgICAqIGRpZCBub3QgY29uc3VtZSBhbnkgZGF0YSBhbmQgZGlkIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KLSAgICBpZiAoIXN5bmMgJiYgIWJzLkRhdGFPZmZzZXQgJiYgIWZsdXNoKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJBIGRlY29kZSBjYWxsIGRpZCBub3QgY29uc3VtZSBhbnkgZGF0YVxuIik7CisgICAgaWYgKCEqc3luYyAmJiAhYnMuRGF0YU9mZnNldCkgewogICAgICAgICBicy5EYXRhT2Zmc2V0ID0gYXZwa3QtPnNpemU7CisgICAgICAgICsrcS0+emVyb19jb25zdW1lX3J1bjsKKyAgICAgICAgaWYgKHEtPnplcm9fY29uc3VtZV9ydW4gPiAxKQorICAgICAgICAgICAgZmZfcXN2X3ByaW50X3dhcm5pbmcoYXZjdHgsIHJldCwgIkEgZGVjb2RlIGNhbGwgZGlkIG5vdCBjb25zdW1lIGFueSBkYXRhIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcS0+emVyb19jb25zdW1lX3J1biA9IDA7CiAgICAgfQogCi0gICAgaWYgKGJ1ZmZlcmVkKSB7Ci0gICAgICAgIHFzdl9maWZvX3JlbG9jYXRlKHEtPmlucHV0X2ZpZm8sIGJzLkRhdGFPZmZzZXQpOwotICAgIH0gZWxzZSBpZiAoYnMuRGF0YU9mZnNldCE9YXZwa3QtPnNpemUpIHsKLSAgICAgICAgLyogc29tZSBkYXRhIG9mIHBhY2tldCB3YXMgbm90IGNvbnN1bWVkLiBzdG9yZSBpdCB0byBsb2NhbCBidWZmZXIgKi8KLSAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHEtPmlucHV0X2ZpZm8sIGF2cGt0LT5kYXRhK2JzLkRhdGFPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+c2l6ZSAtIGJzLkRhdGFPZmZzZXQsIE5VTEwpOworICAgIGlmICgqc3luYykgeworICAgICAgICBRU1ZGcmFtZSAqb3V0X2ZyYW1lID0gZmluZF9mcmFtZShxLCBvdXRzdXJmKTsKKworICAgICAgICBpZiAoIW91dF9mcmFtZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlRoZSByZXR1cm5lZCBzdXJmYWNlIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IGZyYW1lXG4iKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzeW5jKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICAgICAgfQorCisgICAgICAgIG91dF9mcmFtZS0+cXVldWVkID0gMTsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHEtPmFzeW5jX2ZpZm8sICZvdXRfZnJhbWUsIHNpemVvZihvdXRfZnJhbWUpLCBOVUxMKTsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHEtPmFzeW5jX2ZpZm8sICZzeW5jLCAgICAgIHNpemVvZihzeW5jKSwgICAgICBOVUxMKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9mcmVlcCgmc3luYyk7CiAgICAgfQogCi0gICAgaWYgKE1GWF9FUlJfTU9SRV9EQVRBIT1yZXQgJiYgcmV0IDwgMCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yICVkIGR1cmluZyBRU1YgZGVjb2RpbmcuXG4iLCByZXQpOwotICAgICAgICByZXR1cm4gZmZfcXN2X2Vycm9yKHJldCk7Ci0gICAgfQotICAgIG5fb3V0X2ZyYW1lcyA9IGF2X2ZpZm9fc2l6ZShxLT5hc3luY19maWZvKSAvIChzaXplb2Yob3V0X2ZyYW1lKStzaXplb2Yoc3luYykpOwotCi0gICAgaWYgKG5fb3V0X2ZyYW1lcyA+IHEtPmFzeW5jX2RlcHRoIHx8IChmbHVzaCAmJiBuX291dF9mcmFtZXMpICkgeworICAgIGlmICghYXZfZmlmb19zcGFjZShxLT5hc3luY19maWZvKSB8fAorICAgICAgICAoIWF2cGt0LT5zaXplICYmIGF2X2ZpZm9fc2l6ZShxLT5hc3luY19maWZvKSkpIHsKICAgICAgICAgQVZGcmFtZSAqc3JjX2ZyYW1lOwogCiAgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHEtPmFzeW5jX2ZpZm8sICZvdXRfZnJhbWUsIHNpemVvZihvdXRfZnJhbWUpLCBOVUxMKTsKICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocS0+YXN5bmNfZmlmbywgJnN5bmMsICAgICAgc2l6ZW9mKHN5bmMpLCAgICAgIE5VTEwpOwogICAgICAgICBvdXRfZnJhbWUtPnF1ZXVlZCA9IDA7CiAKLSAgICAgICAgZG8gewotICAgICAgICAgICAgcmV0ID0gTUZYVmlkZW9DT1JFX1N5bmNPcGVyYXRpb24ocS0+c2Vzc2lvbiwgc3luYywgMTAwMCk7Ci0gICAgICAgIH0gd2hpbGUgKHJldCA9PSBNRlhfV1JOX0lOX0VYRUNVVElPTik7CisgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1FTVikgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHJldCA9IE1GWFZpZGVvQ09SRV9TeW5jT3BlcmF0aW9uKHEtPnNlc3Npb24sICpzeW5jLCAxMDAwKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHJldCA9PSBNRlhfV1JOX0lOX0VYRUNVVElPTik7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmVlcCgmc3luYyk7CiAKICAgICAgICAgc3JjX2ZyYW1lID0gb3V0X2ZyYW1lLT5mcmFtZTsKIApAQCAtNDI2LDkgKzQwNiwxNCBAQAogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICAgICAgb3V0c3VyZiA9IG91dF9mcmFtZS0+c3VyZmFjZTsKKyAgICAgICAgb3V0c3VyZiA9ICZvdXRfZnJhbWUtPnN1cmZhY2U7CiAKLSAgICAgICAgZnJhbWUtPnBrdF9wdHMgPSBmcmFtZS0+cHRzID0gb3V0c3VyZi0+RGF0YS5UaW1lU3RhbXA7CisjaWYgRkZfQVBJX1BLVF9QVFMKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgZnJhbWUtPnBrdF9wdHMgPSBvdXRzdXJmLT5EYXRhLlRpbWVTdGFtcDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgICAgIGZyYW1lLT5wdHMgPSBvdXRzdXJmLT5EYXRhLlRpbWVTdGFtcDsKIAogICAgICAgICBmcmFtZS0+cmVwZWF0X3BpY3QgPQogICAgICAgICAgICAgb3V0c3VyZi0+SW5mby5QaWNTdHJ1Y3QgJiBNRlhfUElDU1RSVUNUX0ZSQU1FX1RSSVBMSU5HID8gNCA6CkBAIC00MzgsMTUxICs0MjMsMTQ3IEBACiAgICAgICAgICAgICBvdXRzdXJmLT5JbmZvLlBpY1N0cnVjdCAmIE1GWF9QSUNTVFJVQ1RfRklFTERfVEZGOwogICAgICAgICBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9CiAgICAgICAgICAgICAhKG91dHN1cmYtPkluZm8uUGljU3RydWN0ICYgTUZYX1BJQ1NUUlVDVF9QUk9HUkVTU0lWRSk7CisgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBmZl9xc3ZfbWFwX3BpY3R5cGUob3V0X2ZyYW1lLT5kZWNfaW5mby5GcmFtZVR5cGUpOworICAgICAgICAvL0tleSBmcmFtZSBpcyBJRFIgZnJhbWUgaXMgb25seSBzdWl0YWJsZSBmb3IgSDI2NC4gRm9yIEhFVkMsIElSQVBzIGFyZSBrZXkgZnJhbWVzLgorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpCisgICAgICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gISEob3V0X2ZyYW1lLT5kZWNfaW5mby5GcmFtZVR5cGUgJiBNRlhfRlJBTUVUWVBFX0lEUik7CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBzdXJmYWNlIHByb3BlcnRpZXMgKi8KKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUVNWKQorICAgICAgICAgICAgKChtZnhGcmFtZVN1cmZhY2UxKilmcmFtZS0+ZGF0YVszXSktPkluZm8gPSBvdXRzdXJmLT5JbmZvOwogCiAgICAgICAgICpnb3RfZnJhbWUgPSAxOwogICAgIH0KIAotICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKLX0KLS8qCi0gVGhpcyBmdW5jdGlvbiBpbnNlcnRzIGEgcGFja2V0IGF0IGZpZm8gZnJvbnQuCi0qLwotc3RhdGljIHZvaWQgcXN2X3BhY2tldF9wdXNoX2Zyb250KFFTVkNvbnRleHQgKnEsIEFWUGFja2V0ICphdnBrdCkKLXsKLSAgICBpbnQgZmlmb19zaXplID0gYXZfZmlmb19zaXplKHEtPnBrdF9maWZvKTsKLSAgICBpZiAoIWZpZm9fc2l6ZSkgewotICAgIC8qIGVhc3kgY2FzZSBmaWZvIGlzIGVtcHR5ICovCi0gICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShxLT5wa3RfZmlmbywgYXZwa3QsIHNpemVvZigqYXZwa3QpLCBOVUxMKTsKLSAgICB9IGVsc2UgewotICAgIC8qIHJlYWxsb2MgbmVjZXNzYXJ5ICovCi0gICAgICAgIEFWUGFja2V0IHBrdDsKLSAgICAgICAgQVZGaWZvQnVmZmVyICpmaWZvID0gYXZfZmlmb19hbGxvYyhmaWZvX3NpemUrYXZfZmlmb19zcGFjZShxLT5wa3RfZmlmbykpOwotCi0gICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShmaWZvLCBhdnBrdCwgc2l6ZW9mKCphdnBrdCksIE5VTEwpOwotCi0gICAgICAgIHdoaWxlIChhdl9maWZvX3NpemUocS0+cGt0X2ZpZm8pKSB7Ci0gICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChxLT5wa3RfZmlmbywgJnBrdCwgc2l6ZW9mKHBrdCksIE5VTEwpOwotICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGZpZm8sICAgICAgICZwa3QsIHNpemVvZihwa3QpLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgICBhdl9maWZvX2ZyZWUocS0+cGt0X2ZpZm8pOwotICAgICAgICBxLT5wa3RfZmlmbyA9IGZpZm87Ci0gICAgfQotfQotaW50IGZmX3Fzdl9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZDb250ZXh0ICpxLAotICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQotewotICAgIEFWUGFja2V0IHBrdF9yZWYgPSB7IDAgfTsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIGlmIChxLT5wa3RfZmlmbyAmJiBhdl9maWZvX3NpemUocS0+cGt0X2ZpZm8pID49IHNpemVvZihBVlBhY2tldCkpIHsKLSAgICAgICAgLyogd2UgYWxyZWFkeSBoYXZlIGdvdCBzb21lIGJ1ZmZlcmVkIHBhY2tldHMuIHNvIGFkZCBuZXcgdG8gdGFpbCAqLwotICAgICAgICByZXQgPSBhdl9wYWNrZXRfcmVmKCZwa3RfcmVmLCBhdnBrdCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHEtPnBrdF9maWZvLCAmcGt0X3JlZiwgc2l6ZW9mKHBrdF9yZWYpLCBOVUxMKTsKLSAgICB9Ci0gICAgaWYgKHEtPnJlaW5pdF9wZW5kaW5nKSB7Ci0gICAgICAgIHJldCA9IGRvX3Fzdl9kZWNvZGUoYXZjdHgsIHEsIGZyYW1lLCBnb3RfZnJhbWUsIGF2cGt0KTsKLQotICAgICAgICBpZiAoISpnb3RfZnJhbWUpIHsKLSAgICAgICAgICAgIC8qIEZsdXNoaW5nIGNvbXBsZXRlLCBubyBtb3JlIGZyYW1lcyAgKi8KLSAgICAgICAgICAgIGNsb3NlX2RlY29kZXIocSk7Ci0gICAgICAgICAgICAvL3JldHVybiBmZl9xc3ZfZGVjb2RlKGF2Y3R4LCBxLCBmcmFtZSwgZ290X2ZyYW1lLCBhdnBrdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFxLT5yZWluaXRfcGVuZGluZykgewotICAgICAgICBpZiAocS0+cGt0X2ZpZm8gJiYgYXZfZmlmb19zaXplKHEtPnBrdF9maWZvKSA+PSBzaXplb2YoQVZQYWNrZXQpKSB7Ci0gICAgICAgICAgICAvKiBwcm9jZXNzIGJ1ZmZlcmVkIHBhY2tldHMgKi8KLSAgICAgICAgICAgIHdoaWxlICghKmdvdF9mcmFtZSAmJiBhdl9maWZvX3NpemUocS0+cGt0X2ZpZm8pID49IHNpemVvZihBVlBhY2tldCkpIHsKLSAgICAgICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChxLT5wa3RfZmlmbywgJnBrdF9yZWYsIHNpemVvZihwa3RfcmVmKSwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gZG9fcXN2X2RlY29kZShhdmN0eCwgcSwgZnJhbWUsIGdvdF9mcmFtZSwgJnBrdF9yZWYpOwotICAgICAgICAgICAgICAgIGlmIChxLT5yZWluaXRfcGVuZGluZykgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICBBIHJhcmUgY2FzZTogbmV3IHJlaW5pdCBwZW5kaW5nIHdoZW4gYnVmZmVyaW5nIGV4aXN0aW5nLgotICAgICAgICAgICAgICAgICAgICAgICBXZSBzaG91bGQgdG8gcmV0dXJuIHRoZSBwa3RfcmVmIGJhY2sgdG8gc2FtZSBwbGFjZSBvZiBmaWZvCi0gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIHFzdl9wYWNrZXRfcHVzaF9mcm9udChxLCAmcGt0X3JlZik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3RfcmVmKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIGdlbmVyYWwgZGVjb2RpbmcgKi8KLSAgICAgICAgICAgIHJldCA9IGRvX3Fzdl9kZWNvZGUoYXZjdHgsIHEsIGZyYW1lLCBnb3RfZnJhbWUsIGF2cGt0KTsKLSAgICAgICAgICAgIGlmIChxLT5yZWluaXRfcGVuZGluZykgewotICAgICAgICAgICAgICAgIHJldCA9IGF2X3BhY2tldF9yZWYoJnBrdF9yZWYsIGF2cGt0KTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUocS0+cGt0X2ZpZm8sICZwa3RfcmVmLCBzaXplb2YocGt0X3JlZiksIE5VTEwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldDsKLX0KLS8qCi0gVGhpcyBmdW5jdGlvbiByZXNldHMgZGVjb2RlciBhbmQgY29ycmVzcG9uZGVkIGJ1ZmZlcnMgYmVmb3JlIHNlZWsgb3BlcmF0aW9uCi0qLwotdm9pZCBmZl9xc3ZfZGVjb2RlX3Jlc2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWQ29udGV4dCAqcSkKLXsKLSAgICBRU1ZGcmFtZSAqY3VyOwotICAgIEFWUGFja2V0IHBrdDsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBtZnhWaWRlb1BhcmFtIHBhcmFtID0geyB7IDAgfSB9OwotCi0gICAgaWYgKHEtPnJlaW5pdF9wZW5kaW5nKSB7Ci0gICAgICAgIGNsb3NlX2RlY29kZXIocSk7Ci0gICAgfSBlbHNlIGlmIChxLT5lbmdpbmVfcmVhZHkpIHsKLSAgICAgICAgcmV0ID0gTUZYVmlkZW9ERUNPREVfR2V0VmlkZW9QYXJhbShxLT5zZXNzaW9uLCAmcGFyYW0pOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNRlggZGVjb2RlIGdldCBwYXJhbSBlcnJvciAlZFxuIiwgcmV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldCA9IE1GWFZpZGVvREVDT0RFX1Jlc2V0KHEtPnNlc3Npb24sICZwYXJhbSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk1GWCBkZWNvZGUgcmVzZXQgZXJyb3IgJWRcbiIsIHJldCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGcmVlIGFsbCBmcmFtZXMqLwotICAgICAgICBjdXIgPSBxLT53b3JrX2ZyYW1lczsKLSAgICAgICAgd2hpbGUgKGN1cikgewotICAgICAgICAgICAgcS0+d29ya19mcmFtZXMgPSBjdXItPm5leHQ7Ci0gICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZjdXItPmZyYW1lKTsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZjdXIpOwotICAgICAgICAgICAgY3VyID0gcS0+d29ya19mcmFtZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZXNldCBvdXRwdXQgc3VyZmFjZXMgKi8KLSAgICBhdl9maWZvX3Jlc2V0KHEtPmFzeW5jX2ZpZm8pOwotCi0gICAgLyogUmVzZXQgaW5wdXQgcGFja2V0cyBmaWZvICovCi0gICAgd2hpbGUgKGF2X2ZpZm9fc2l6ZShxLT5wa3RfZmlmbykpIHsKLSAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocS0+cGt0X2ZpZm8sICZwa3QsIHNpemVvZihwa3QpLCBOVUxMKTsKLSAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwotICAgIH0KLQotICAgIC8qIFJlc2V0IGlucHV0IGJpdHN0cmVhbSBmaWZvICovCi0gICAgYXZfZmlmb19yZXNldChxLT5pbnB1dF9maWZvKTsKKyAgICByZXR1cm4gYnMuRGF0YU9mZnNldDsKIH0KIAogaW50IGZmX3Fzdl9kZWNvZGVfY2xvc2UoUVNWQ29udGV4dCAqcSkKIHsKLSAgICBjbG9zZV9kZWNvZGVyKHEpOworICAgIFFTVkZyYW1lICpjdXIgPSBxLT53b3JrX2ZyYW1lczsKIAotICAgIHEtPnNlc3Npb24gPSBOVUxMOworICAgIGlmIChxLT5zZXNzaW9uKQorICAgICAgICBNRlhWaWRlb0RFQ09ERV9DbG9zZShxLT5zZXNzaW9uKTsKIAotICAgIGZmX3Fzdl9jbG9zZV9pbnRlcm5hbF9zZXNzaW9uKCZxLT5pbnRlcm5hbF9xcyk7CisgICAgd2hpbGUgKHEtPmFzeW5jX2ZpZm8gJiYgYXZfZmlmb19zaXplKHEtPmFzeW5jX2ZpZm8pKSB7CisgICAgICAgIFFTVkZyYW1lICpvdXRfZnJhbWU7CisgICAgICAgIG1meFN5bmNQb2ludCAqc3luYzsKKworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChxLT5hc3luY19maWZvLCAmb3V0X2ZyYW1lLCBzaXplb2Yob3V0X2ZyYW1lKSwgTlVMTCk7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHEtPmFzeW5jX2ZpZm8sICZzeW5jLCAgICAgIHNpemVvZihzeW5jKSwgICAgICBOVUxMKTsKKworICAgICAgICBhdl9mcmVlcCgmc3luYyk7CisgICAgfQorCisgICAgd2hpbGUgKGN1cikgeworICAgICAgICBxLT53b3JrX2ZyYW1lcyA9IGN1ci0+bmV4dDsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmY3VyLT5mcmFtZSk7CisgICAgICAgIGF2X2ZyZWVwKCZjdXIpOworICAgICAgICBjdXIgPSBxLT53b3JrX2ZyYW1lczsKKyAgICB9CiAKICAgICBhdl9maWZvX2ZyZWUocS0+YXN5bmNfZmlmbyk7CiAgICAgcS0+YXN5bmNfZmlmbyA9IE5VTEw7CiAKLSAgICBhdl9maWZvX2ZyZWUocS0+aW5wdXRfZmlmbyk7Ci0gICAgcS0+aW5wdXRfZmlmbyA9IE5VTEw7CisgICAgYXZfcGFyc2VyX2Nsb3NlKHEtPnBhcnNlcik7CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJnEtPmF2Y3R4X2ludGVybmFsKTsKIAotICAgIGF2X2ZpZm9fZnJlZShxLT5wa3RfZmlmbyk7Ci0gICAgcS0+cGt0X2ZpZm8gPSBOVUxMOworICAgIGlmIChxLT5pbnRlcm5hbF9zZXNzaW9uKQorICAgICAgICBNRlhDbG9zZShxLT5pbnRlcm5hbF9zZXNzaW9uKTsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmcS0+ZnJhbWVzX2N0eC5od19mcmFtZXNfY3R4KTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJnEtPmZyYW1lc19jdHgubWlkc19idWYpOwogCiAgICAgcmV0dXJuIDA7CiB9CisKK2ludCBmZl9xc3ZfcHJvY2Vzc19kYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWQ29udGV4dCAqcSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICB1aW50OF90ICpkdW1teV9kYXRhOworICAgIGludCBkdW1teV9zaXplOworICAgIGludCByZXQ7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworCisgICAgaWYgKCFxLT5hdmN0eF9pbnRlcm5hbCkgeworICAgICAgICBxLT5hdmN0eF9pbnRlcm5hbCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCk7CisgICAgICAgIGlmICghcS0+YXZjdHhfaW50ZXJuYWwpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHEtPnBhcnNlciA9IGF2X3BhcnNlcl9pbml0KGF2Y3R4LT5jb2RlY19pZCk7CisgICAgICAgIGlmICghcS0+cGFyc2VyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBxLT5wYXJzZXItPmZsYWdzIHw9IFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUzsKKyAgICAgICAgcS0+b3JpZ19waXhfZm10ICAgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgfQorCisgICAgaWYgKCFwa3QtPnNpemUpCisgICAgICAgIHJldHVybiBxc3ZfZGVjb2RlKGF2Y3R4LCBxLCBmcmFtZSwgZ290X2ZyYW1lLCBwa3QpOworCisgICAgLyogd2UgYXNzdW1lIHRoZSBwYWNrZXRzIGFyZSBhbHJlYWR5IHNwbGl0IHByb3Blcmx5IGFuZCB3YW50CisgICAgICoganVzdCB0aGUgY29kZWMgcGFyYW1ldGVycyBoZXJlICovCisgICAgYXZfcGFyc2VyX3BhcnNlMihxLT5wYXJzZXIsIHEtPmF2Y3R4X2ludGVybmFsLAorICAgICAgICAgICAgICAgICAgICAgJmR1bW15X2RhdGEsICZkdW1teV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgcGt0LT5kYXRhLCBwa3QtPnNpemUsIHBrdC0+cHRzLCBwa3QtPmR0cywKKyAgICAgICAgICAgICAgICAgICAgIHBrdC0+cG9zKTsKKworICAgIGF2Y3R4LT5maWVsZF9vcmRlciAgPSBxLT5wYXJzZXItPmZpZWxkX29yZGVyOworICAgIC8qIFRPRE86IGZsdXNoIGRlbGF5ZWQgZnJhbWVzIG9uIHJlaW5pdCAqLworICAgIGlmIChxLT5wYXJzZXItPmZvcm1hdCAgICAgICAhPSBxLT5vcmlnX3BpeF9mbXQgICAgfHwKKyAgICAgICAgRkZBTElHTihxLT5wYXJzZXItPmNvZGVkX3dpZHRoLCAxNikgICE9IEZGQUxJR04oYXZjdHgtPmNvZGVkX3dpZHRoLCAxNikgfHwKKyAgICAgICAgRkZBTElHTihxLT5wYXJzZXItPmNvZGVkX2hlaWdodCwgMTYpICE9IEZGQUxJR04oYXZjdHgtPmNvZGVkX2hlaWdodCwgMTYpKSB7CisgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1szXSA9IHsgQVZfUElYX0ZNVF9RU1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9OworICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcXN2X2Zvcm1hdDsKKworICAgICAgICBxc3ZfZm9ybWF0ID0gZmZfcXN2X21hcF9waXhmbXQocS0+cGFyc2VyLT5mb3JtYXQsICZxLT5mb3VyY2MpOworICAgICAgICBpZiAocXN2X2Zvcm1hdCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJEZWNvZGluZyBwaXhlbCBmb3JtYXQgJyVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocS0+cGFyc2VyLT5mb3JtYXQpKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgICAgIGdvdG8gcmVpbml0X2ZhaWw7CisgICAgICAgIH0KKworICAgICAgICBxLT5vcmlnX3BpeF9mbXQgICAgID0gcS0+cGFyc2VyLT5mb3JtYXQ7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ICAgICAgPSBwaXhfZm10c1sxXSA9IHFzdl9mb3JtYXQ7CisgICAgICAgIGF2Y3R4LT53aWR0aCAgICAgICAgPSBxLT5wYXJzZXItPndpZHRoOworICAgICAgICBhdmN0eC0+aGVpZ2h0ICAgICAgID0gcS0+cGFyc2VyLT5oZWlnaHQ7CisgICAgICAgIGF2Y3R4LT5jb2RlZF93aWR0aCAgPSBGRkFMSUdOKHEtPnBhcnNlci0+Y29kZWRfd2lkdGgsIDE2KTsKKyAgICAgICAgYXZjdHgtPmNvZGVkX2hlaWdodCA9IEZGQUxJR04ocS0+cGFyc2VyLT5jb2RlZF9oZWlnaHQsIDE2KTsKKyAgICAgICAgYXZjdHgtPmxldmVsICAgICAgICA9IHEtPmF2Y3R4X2ludGVybmFsLT5sZXZlbDsKKyAgICAgICAgYXZjdHgtPnByb2ZpbGUgICAgICA9IHEtPmF2Y3R4X2ludGVybmFsLT5wcm9maWxlOworCisgICAgICAgIHJldCA9IGZmX2dldF9mb3JtYXQoYXZjdHgsIHBpeF9mbXRzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIHJlaW5pdF9mYWlsOworCisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gcmV0OworCisgICAgICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICAgICAgaWYgKCFkZXNjKQorICAgICAgICAgICAgZ290byByZWluaXRfZmFpbDsKKworICAgICAgICAgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4KSB7CisgICAgICAgICAgICBhdmN0eC0+Y29kZWRfd2lkdGggPSAgRkZBTElHTihxLT5wYXJzZXItPmNvZGVkX3dpZHRoLCAzMik7CisgICAgICAgICAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0ID0gRkZBTElHTihxLT5wYXJzZXItPmNvZGVkX2hlaWdodCwgMzIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gcXN2X2RlY29kZV9pbml0KGF2Y3R4LCBxKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIHJlaW5pdF9mYWlsOworICAgIH0KKworICAgIHJldHVybiBxc3ZfZGVjb2RlKGF2Y3R4LCBxLCBmcmFtZSwgZ290X2ZyYW1lLCBwa3QpOworCityZWluaXRfZmFpbDoKKyAgICBxLT5vcmlnX3BpeF9mbXQgPSBxLT5wYXJzZXItPmZvcm1hdCA9IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgZmZfcXN2X2RlY29kZV9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFFTVkNvbnRleHQgKnEpCit7CisgICAgcS0+b3JpZ19waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xc3ZkZWMuaCBiL2xpYmF2Y29kZWMvcXN2ZGVjLmgKaW5kZXggOTdhMzMxNS4uNWI3YjAzYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9xc3ZkZWMuaAorKysgYi9saWJhdmNvZGVjL3FzdmRlYy5oCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImh3YWNjZWwuaCIKICNpbmNsdWRlICJxc3ZfaW50ZXJuYWwuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgUVNWQ29udGV4dCB7CkBAIC00MSw3ICs0Miw5IEBACiAKICAgICAvLyB0aGUgc2Vzc2lvbiB3ZSBhbGxvY2F0ZWQgaW50ZXJuYWxseSwgaW4gY2FzZSB0aGUgY2FsbGVyIGRpZCBub3QgcHJvdmlkZQogICAgIC8vIG9uZQotICAgIFFTVlNlc3Npb24gaW50ZXJuYWxfcXM7CisgICAgbWZ4U2Vzc2lvbiBpbnRlcm5hbF9zZXNzaW9uOworCisgICAgUVNWRnJhbWVzQ29udGV4dCBmcmFtZXNfY3R4OwogCiAgICAgLyoqCiAgICAgICogYSBsaW5rZWQgbGlzdCBvZiBmcmFtZXMgY3VycmVudGx5IGJlaW5nIHVzZWQgYnkgUVNWCkBAIC00OSwyMiArNTIsMTQgQEAKICAgICBRU1ZGcmFtZSAqd29ya19mcmFtZXM7CiAKICAgICBBVkZpZm9CdWZmZXIgKmFzeW5jX2ZpZm87Ci0gICAgQVZGaWZvQnVmZmVyICppbnB1dF9maWZvOworICAgIGludCB6ZXJvX2NvbnN1bWVfcnVuOwogCi0gICAgLy8gd2Ugc2hvdWxkIHRvIGJ1ZmZlciBpbnB1dCBwYWNrZXRzIGF0IHNvbWUgY2FzZXMKLSAgICAvLyBlbHNlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBoYW5kbGUgZHluYW1pYyBzdHJlYW0gY2hhbmdlcyBjb3JyZWN0bHkKLSAgICAvLyB0aGlzIGZpZm8gdXNlcyBmb3IgaW5wdXQgcGFja2V0cyBidWZmZXJpbmcKLSAgICBBVkZpZm9CdWZmZXIgKnBrdF9maWZvOwotCi0gICAgLy8gdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IGhlYWRlciBwYXJzZWQsCi0gICAgLy8gZGVjb2RlciBpbnN0YW5jZSBjcmVhdGVkIGFuZCByZWFkeSB0byBnZW5lcmFsIGRlY29kaW5nCi0gICAgaW50IGVuZ2luZV9yZWFkeTsKLQotICAgIC8vIHdlIGNhbiBub3QganVzdCByZS1pbml0IGRlY29kZXIgaWYgZGlmZmVyZW50IHNlcXVlbmNlIGhlYWRlciBhcnJpdmVkCi0gICAgLy8gd2Ugc2hvdWxkIHRvIGRlbGl2ZXIgYWxsIGJ1ZmZlcmVkIGZyYW1lcyBidXQgd2UgY2FuIG5vdCBkZWNvZGUgbmV3IHBhY2tldHMKLSAgICAvLyB0aGlzIHRpbWUuIFNvIHdoZW4gcmVpbml0X3BlbmRpbmcgaXMgbm9uLXplcm8gd2UgZmx1c2hpbmcgZGVjb2RlciBhbmQKLSAgICAvLyBhY2N1bXVsYXRlIG5ldyBhcnJpdmVkIHBhY2tldHMgaW50byBwa3RfZmlmbwotICAgIGludCByZWluaXRfcGVuZGluZzsKKyAgICAvLyB0aGUgaW50ZXJuYWwgcGFyc2VyIGFuZCBjb2RlYyBjb250ZXh0IGZvciBwYXJzaW5nIHRoZSBkYXRhCisgICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnBhcnNlcjsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHhfaW50ZXJuYWw7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IG9yaWdfcGl4X2ZtdDsKKyAgICB1aW50MzJfdCBmb3VyY2M7CisgICAgbWZ4RnJhbWVJbmZvIGZyYW1lX2luZm87CiAKICAgICAvLyBvcHRpb25zIHNldCBieSB0aGUgY2FsbGVyCiAgICAgaW50IGFzeW5jX2RlcHRoOwpAQCAtNzYsMTMgKzcxLDEyIEBACiAgICAgaW50ICAgICAgICAgbmJfZXh0X2J1ZmZlcnM7CiB9IFFTVkNvbnRleHQ7CiAKLWludCBmZl9xc3ZfbWFwX3BpeGZtdChlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0KTsKK2V4dGVybiBjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCAqZmZfcXN2X2h3X2NvbmZpZ3NbXTsKIAotaW50IGZmX3Fzdl9kZWNvZGUoQVZDb2RlY0NvbnRleHQgKnMsIFFTVkNvbnRleHQgKnEsCi0gICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfZnJhbWUsCi0gICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpOworaW50IGZmX3Fzdl9wcm9jZXNzX2RhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZDb250ZXh0ICpxLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqcGt0KTsKIAotdm9pZCBmZl9xc3ZfZGVjb2RlX3Jlc2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWQ29udGV4dCAqcSk7Cit2b2lkIGZmX3Fzdl9kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZDb250ZXh0ICpxKTsKIAogaW50IGZmX3Fzdl9kZWNvZGVfY2xvc2UoUVNWQ29udGV4dCAqcSk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcXN2ZGVjX2gyNjQ1LmMgYi9saWJhdmNvZGVjL3FzdmRlY19oMjY0NS5jCmluZGV4IGEzOTZmMzEuLjgzMTI1MmYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcXN2ZGVjX2gyNjQ1LmMKKysrIGIvbGliYXZjb2RlYy9xc3ZkZWNfaDI2NDUuYwpAQCAtMzMsMTEgKzMzLDE0IEBACiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJxc3ZfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJxc3ZkZWMuaCIKKyNpbmNsdWRlICJxc3YuaCIKIAogZW51bSBMb2FkUGx1Z2luIHsKICAgICBMT0FEX1BMVUdJTl9OT05FLAogICAgIExPQURfUExVR0lOX0hFVkNfU1csCisgICAgTE9BRF9QTFVHSU5fSEVWQ19IVywKIH07CiAKIHR5cGVkZWYgc3RydWN0IFFTVkgyNjQ1Q29udGV4dCB7CkBAIC00NiwxOCArNDksMzEgQEAKIAogICAgIGludCBsb2FkX3BsdWdpbjsKIAotICAgIC8vIHRoZSBmaWx0ZXIgZm9yIGNvbnZlcnRpbmcgdG8gQW5uZXggQgotICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmOworICAgIEFWRmlmb0J1ZmZlciAqcGFja2V0X2ZpZm87CiAKKyAgICBBVlBhY2tldCBidWZmZXJfcGt0OwogfSBRU1ZIMjY0NUNvbnRleHQ7CiAKK3N0YXRpYyB2b2lkIHFzdl9jbGVhcl9idWZmZXJzKFFTVkgyNjQ1Q29udGV4dCAqcykKK3sKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgd2hpbGUgKGF2X2ZpZm9fc2l6ZShzLT5wYWNrZXRfZmlmbykgPj0gc2l6ZW9mKHBrdCkpIHsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocy0+cGFja2V0X2ZpZm8sICZwa3QsIHNpemVvZihwa3QpLCBOVUxMKTsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOworICAgIH0KKworICAgIGF2X3BhY2tldF91bnJlZigmcy0+YnVmZmVyX3BrdCk7Cit9CisKIHN0YXRpYyBhdl9jb2xkIGludCBxc3ZfZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBRU1ZIMjY0NUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogCiAgICAgZmZfcXN2X2RlY29kZV9jbG9zZSgmcy0+cXN2KTsKIAotICAgIGF2X2JpdHN0cmVhbV9maWx0ZXJfY2xvc2Uocy0+YnNmKTsKKyAgICBxc3ZfY2xlYXJfYnVmZmVycyhzKTsKKworICAgIGF2X2ZpZm9fZnJlZShzLT5wYWNrZXRfZmlmbyk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTY4LDcgKzg0LDggQEAKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDICYmIHMtPmxvYWRfcGx1Z2luICE9IExPQURfUExVR0lOX05PTkUpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnVpZF9oZXZjZW5jX3N3ID0gIjE1ZGQ5MzY4MjVhZDQ3NWVhMzRlMzVmM2Y1NDIxN2E2IjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aWRfaGV2Y2RlY19zdyA9ICIxNWRkOTM2ODI1YWQ0NzVlYTM0ZTM1ZjNmNTQyMTdhNiI7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWlkX2hldmNkZWNfaHcgPSAiMzNhNjFjMGI0YzI3NDU0Y2E4ZDg1ZGRlNzU3YzZmOGUiOwogCiAgICAgICAgIGlmIChzLT5xc3YubG9hZF9wbHVnaW5zWzBdKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLApAQCAtNzYsMTcgKzkzLDE4IEBACiAgICAgICAgICAgICAgICAgICAgIlRoZSBsb2FkX3BsdWdpbiB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuXG4iKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5xc3YubG9hZF9wbHVnaW5zKTsKLSAgICAgICAgICAgIHMtPnFzdi5sb2FkX3BsdWdpbnMgPSBhdl9zdHJkdXAodWlkX2hldmNlbmNfc3cpOworCisgICAgICAgICAgICBpZiAocy0+bG9hZF9wbHVnaW4gPT0gTE9BRF9QTFVHSU5fSEVWQ19TVykKKyAgICAgICAgICAgICAgICBzLT5xc3YubG9hZF9wbHVnaW5zID0gYXZfc3RyZHVwKHVpZF9oZXZjZGVjX3N3KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzLT5xc3YubG9hZF9wbHVnaW5zID0gYXZfc3RyZHVwKHVpZF9oZXZjZGVjX2h3KTsKICAgICAgICAgICAgIGlmICghcy0+cXN2LmxvYWRfcGx1Z2lucykKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQotICAgICAgICBzLT5ic2YgPSBhdl9iaXRzdHJlYW1fZmlsdGVyX2luaXQoImgyNjRfbXA0dG9hbm5leGIiKTsKLSAgICBlbHNlCi0gICAgICAgIHMtPmJzZiA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfaW5pdCgiaGV2Y19tcDR0b2FubmV4YiIpOwotICAgIGlmICghcy0+YnNmKSB7CisgICAgcy0+cGFja2V0X2ZpZm8gPSBhdl9maWZvX2FsbG9jKHNpemVvZihBVlBhY2tldCkpOworICAgIGlmICghcy0+cGFja2V0X2ZpZm8pIHsKICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQpAQCAtMTAzLDYxICsxMjEsNzcgQEAKICAgICBRU1ZIMjY0NUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFWRnJhbWUgKmZyYW1lICAgID0gZGF0YTsKICAgICBpbnQgcmV0OwotICAgIHVpbnQ4X3QgKnBfZmlsdGVyZWQgPSBOVUxMOwotICAgIGludCAgICAgIG5fZmlsdGVyZWQgPSBOVUxMOwotICAgIEFWUGFja2V0IHBrdF9maWx0ZXJlZCA9IHsgMCB9OwogCisgICAgLyogYnVmZmVyIHRoZSBpbnB1dCBwYWNrZXQgKi8KICAgICBpZiAoYXZwa3QtPnNpemUpIHsKLSAgICAgICAgaWYgKGF2cGt0LT5zaXplID4gMyAmJiAhYXZwa3QtPmRhdGFbMF0gJiYKLSAgICAgICAgICAgICFhdnBrdC0+ZGF0YVsxXSAmJiAhYXZwa3QtPmRhdGFbMl0gJiYgMT09YXZwa3QtPmRhdGFbM10pIHsKLSAgICAgICAgICAgIC8qIHdlIGFscmVhZHkgaGF2ZSBhbm5leC1iIHByZWZpeCAqLwotICAgICAgICAgICAgcmV0dXJuIGZmX3Fzdl9kZWNvZGUoYXZjdHgsICZzLT5xc3YsIGZyYW1lLCBnb3RfZnJhbWUsIGF2cGt0KTsKKyAgICAgICAgQVZQYWNrZXQgaW5wdXRfcmVmID0geyAwIH07CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIG5vIGFubmV4LWIgcHJlZml4LiB0cnkgdG8gcmVzdG9yZTogKi8KLSAgICAgICAgICAgIHJldCA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfZmlsdGVyKHMtPmJzZiwgYXZjdHgsICJwcml2YXRlX3Nwc3Bwc19idWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcF9maWx0ZXJlZCwgJm5fZmlsdGVyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSwgMCk7Ci0gICAgICAgICAgICBpZiAocmV0Pj0wKSB7Ci0gICAgICAgICAgICAgICAgcGt0X2ZpbHRlcmVkLnB0cyAgPSBhdnBrdC0+cHRzOwotICAgICAgICAgICAgICAgIHBrdF9maWx0ZXJlZC5kYXRhID0gcF9maWx0ZXJlZDsKLSAgICAgICAgICAgICAgICBwa3RfZmlsdGVyZWQuc2l6ZSA9IG5fZmlsdGVyZWQ7Ci0KLSAgICAgICAgICAgICAgICByZXQgPSBmZl9xc3ZfZGVjb2RlKGF2Y3R4LCAmcy0+cXN2LCBmcmFtZSwgZ290X2ZyYW1lLCAmcGt0X2ZpbHRlcmVkKTsKLQotICAgICAgICAgICAgICAgIGlmIChwX2ZpbHRlcmVkICE9IGF2cGt0LT5kYXRhKQotICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHBfZmlsdGVyZWQpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQgPiAwID8gYXZwa3QtPnNpemUgOiByZXQ7Ci0gICAgICAgICAgICB9CisgICAgICAgIGlmIChhdl9maWZvX3NwYWNlKHMtPnBhY2tldF9maWZvKSA8IHNpemVvZihpbnB1dF9yZWYpKSB7CisgICAgICAgICAgICByZXQgPSBhdl9maWZvX3JlYWxsb2MyKHMtPnBhY2tldF9maWZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9maWZvX3NpemUocy0+cGFja2V0X2ZpZm8pICsgc2l6ZW9mKGlucHV0X3JlZikpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQorCisgICAgICAgIHJldCA9IGF2X3BhY2tldF9yZWYoJmlucHV0X3JlZiwgYXZwa3QpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShzLT5wYWNrZXRfZmlmbywgJmlucHV0X3JlZiwgc2l6ZW9mKGlucHV0X3JlZiksIE5VTEwpOwogICAgIH0KIAotICAgIHJldHVybiBmZl9xc3ZfZGVjb2RlKGF2Y3R4LCAmcy0+cXN2LCBmcmFtZSwgZ290X2ZyYW1lLCBhdnBrdCk7CisgICAgLyogcHJvY2VzcyBidWZmZXJlZCBkYXRhICovCisgICAgd2hpbGUgKCEqZ290X2ZyYW1lKSB7CisgICAgICAgIC8qIHByZXBhcmUgdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgaWYgKHMtPmJ1ZmZlcl9wa3Quc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAvKiBubyBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgIGlmIChhdl9maWZvX3NpemUocy0+cGFja2V0X2ZpZm8pIDwgc2l6ZW9mKEFWUGFja2V0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYXZwa3QtPnNpemUgPyBhdnBrdC0+c2l6ZSA6IGZmX3Fzdl9wcm9jZXNzX2RhdGEoYXZjdHgsICZzLT5xc3YsIGZyYW1lLCBnb3RfZnJhbWUsIGF2cGt0KTsKKworICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZzLT5idWZmZXJfcGt0KTsKKworICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocy0+cGFja2V0X2ZpZm8sICZzLT5idWZmZXJfcGt0LCBzaXplb2Yocy0+YnVmZmVyX3BrdCksIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZmZfcXN2X3Byb2Nlc3NfZGF0YShhdmN0eCwgJnMtPnFzdiwgZnJhbWUsIGdvdF9mcmFtZSwgJnMtPmJ1ZmZlcl9wa3QpOworICAgICAgICBpZiAocmV0IDwgMCl7CisgICAgICAgICAgICAvKiBEcm9wIGJ1ZmZlcl9wa3Qgd2hlbiBmYWlsZWQgdG8gZGVjb2RlIHRoZSBwYWNrZXQuIE90aGVyd2lzZSwKKyAgICAgICAgICAgICAgIHRoZSBkZWNvZGVyIHdpbGwga2VlcCBkZWNvZGluZyB0aGUgZmFpbHVyZSBwYWNrZXQuICovCisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnMtPmJ1ZmZlcl9wa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmJ1ZmZlcl9wa3Quc2l6ZSAtPSByZXQ7CisgICAgICAgIHMtPmJ1ZmZlcl9wa3QuZGF0YSArPSByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOwogfQogCiBzdGF0aWMgdm9pZCBxc3ZfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBRU1ZIMjY0NUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGZmX3Fzdl9kZWNvZGVfcmVzZXQoYXZjdHgsICZzLT5xc3YpOworCisgICAgcXN2X2NsZWFyX2J1ZmZlcnMocyk7CisgICAgZmZfcXN2X2RlY29kZV9mbHVzaChhdmN0eCwgJnMtPnFzdik7CiB9CiAKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyNkZWZpbmUgTE9BRF9QTFVHSU5fREVGQVVMVCBMT0FEX1BMVUdJTl9IRVZDX1NXCisjZWxzZQorI2RlZmluZSBMT0FEX1BMVUdJTl9ERUZBVUxUIExPQURfUExVR0lOX0hFVkNfSFcKKyNlbmRpZgorCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihRU1ZIMjY0NUNvbnRleHQsIHgpCiAjZGVmaW5lIFZEIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KIAogI2lmIENPTkZJR19IRVZDX1FTVl9ERUNPREVSCi1BVkhXQWNjZWwgZmZfaGV2Y19xc3ZfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAiaGV2Y19xc3YiLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAotICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfUVNWLAotfTsKLQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGhldmNfb3B0aW9uc1tdID0gewogICAgIHsgImFzeW5jX2RlcHRoIiwgIkludGVybmFsIHBhcmFsbGVsaXphdGlvbiBkZXB0aCwgdGhlIGhpZ2hlciB0aGUgdmFsdWUgdGhlIGhpZ2hlciB0aGUgbGF0ZW5jeS4iLCBPRkZTRVQocXN2LmFzeW5jX2RlcHRoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBBU1lOQ19ERVBUSF9ERUZBVUxUIH0sIDAsIElOVF9NQVgsIFZEIH0sCiAKLSAgICB7ICJsb2FkX3BsdWdpbiIsICJBIHVzZXIgcGx1Z2luIHRvIGxvYWQgaW4gYW4gaW50ZXJuYWwgc2Vzc2lvbiIsIE9GRlNFVChsb2FkX3BsdWdpbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gTE9BRF9QTFVHSU5fSEVWQ19TVyB9LCBMT0FEX1BMVUdJTl9OT05FLCBMT0FEX1BMVUdJTl9IRVZDX1NXLCBWRCwgImxvYWRfcGx1Z2luIiB9LAorICAgIHsgImxvYWRfcGx1Z2luIiwgIkEgdXNlciBwbHVnaW4gdG8gbG9hZCBpbiBhbiBpbnRlcm5hbCBzZXNzaW9uIiwgT0ZGU0VUKGxvYWRfcGx1Z2luKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBMT0FEX1BMVUdJTl9ERUZBVUxUIH0sIExPQURfUExVR0lOX05PTkUsIExPQURfUExVR0lOX0hFVkNfSFcsIFZELCAibG9hZF9wbHVnaW4iIH0sCiAgICAgeyAibm9uZSIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTE9BRF9QTFVHSU5fTk9ORSB9LCAgICAwLCAwLCBWRCwgImxvYWRfcGx1Z2luIiB9LAogICAgIHsgImhldmNfc3ciLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IExPQURfUExVR0lOX0hFVkNfU1cgfSwgMCwgMCwgVkQsICJsb2FkX3BsdWdpbiIgfSwKKyAgICB7ICJoZXZjX2h3IiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBMT0FEX1BMVUdJTl9IRVZDX0hXIH0sIDAsIDAsIFZELCAibG9hZF9wbHVnaW4iIH0sCiAKICAgICB7ICJsb2FkX3BsdWdpbnMiLCAiQSA6LXNlcGFyYXRlIGxpc3Qgb2YgaGV4YWRlY2ltYWwgcGx1Z2luIFVJRHMgdG8gbG9hZCBpbiBhbiBpbnRlcm5hbCBzZXNzaW9uIiwKICAgICAgICAgT0ZGU0VUKHFzdi5sb2FkX3BsdWdpbnMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIiIH0sIDAsIDAsIFZEIH0sCkBAIC0xODEsMjIgKzIxNSwxOSBAQAogICAgIC5kZWNvZGUgICAgICAgICA9IHFzdl9kZWNvZGVfZnJhbWUsCiAgICAgLmZsdXNoICAgICAgICAgID0gcXN2X2RlY29kZV9mbHVzaCwKICAgICAuY2xvc2UgICAgICAgICAgPSBxc3ZfZGVjb2RlX2Nsb3NlLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9BVk9JRF9QUk9CSU5HIHwgQVZfQ09ERUNfQ0FQX0hZQlJJRCwKICAgICAucHJpdl9jbGFzcyAgICAgPSAmaGV2Y19jbGFzcywKICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX05WMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9QMDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUVNWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorICAgIC5od19jb25maWdzICAgICA9IGZmX3Fzdl9od19jb25maWdzLAorICAgIC5ic2ZzICAgICAgICAgICA9ICJoZXZjX21wNHRvYW5uZXhiIiwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAicXN2IiwKIH07CiAjZW5kaWYKIAogI2lmIENPTkZJR19IMjY0X1FTVl9ERUNPREVSCi1BVkhXQWNjZWwgZmZfaDI2NF9xc3ZfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF9xc3YiLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAotICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfUVNWLAotfTsKLQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICB7ICJhc3luY19kZXB0aCIsICJJbnRlcm5hbCBwYXJhbGxlbGl6YXRpb24gZGVwdGgsIHRoZSBoaWdoZXIgdGhlIHZhbHVlIHRoZSBoaWdoZXIgdGhlIGxhdGVuY3kuIiwgT0ZGU0VUKHFzdi5hc3luY19kZXB0aCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gQVNZTkNfREVQVEhfREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBWRCB9LAogICAgIHsgTlVMTCB9LApAQCAtMjE5LDEwICsyNTAsMTQgQEAKICAgICAuZGVjb2RlICAgICAgICAgPSBxc3ZfZGVjb2RlX2ZyYW1lLAogICAgIC5mbHVzaCAgICAgICAgICA9IHFzdl9kZWNvZGVfZmx1c2gsCiAgICAgLmNsb3NlICAgICAgICAgID0gcXN2X2RlY29kZV9jbG9zZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfQVZPSURfUFJPQklORyB8IEFWX0NPREVDX0NBUF9IWUJSSUQsCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfTlYxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1AwMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9RU1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLmh3X2NvbmZpZ3MgICAgID0gZmZfcXN2X2h3X2NvbmZpZ3MsCisgICAgLmJzZnMgICAgICAgICAgID0gImgyNjRfbXA0dG9hbm5leGIiLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJxc3YiLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xc3ZkZWNfbXBlZzIuYyBiL2xpYmF2Y29kZWMvcXN2ZGVjX21wZWcyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MDUyZTAuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9xc3ZkZWNfbXBlZzIuYworKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKgotICogSW50ZWwgTWVkaWFTREsgUVNWIGJhc2VkIE1QRUcyIHZpZGVvIGRlY29kZXIKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLQotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJxc3ZkZWMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgUVNWTVBFRzJDb250ZXh0IHsKLSAgICBBVkNsYXNzICpjbGFzczsKLSAgICBRU1ZDb250ZXh0IHFzdjsKLX0gUVNWTVBFRzJDb250ZXh0OwotCi1zdGF0aWMgYXZfY29sZCBpbnQgcXN2X2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgUVNWTVBFRzJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLQotICAgIGZmX3Fzdl9kZWNvZGVfY2xvc2UoJnMtPnFzdik7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGF2X2NvbGQgaW50IHFzdl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcXN2X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKLXsKLSAgICBRU1ZNUEVHMkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEFWRnJhbWUgKmZyYW1lICAgID0gZGF0YTsKLQotICAgIHJldHVybiBmZl9xc3ZfZGVjb2RlKGF2Y3R4LCAmcy0+cXN2LCBmcmFtZSwgZ290X2ZyYW1lLCBhdnBrdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHFzdl9kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIFFTVk1QRUcyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgZmZfcXN2X2RlY29kZV9yZXNldChhdmN0eCwgJnMtPnFzdik7Ci19Ci0KLUFWSFdBY2NlbCBmZl9tcGVnMl9xc3ZfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzJfcXN2IiwKLSAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTywKLSAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1FTViwKLX07Ci0KLSNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFFTVk1QRUcyQ29udGV4dCwgeCkKLSNkZWZpbmUgVkQgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQotc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKLSAgICB7ICJhc3luY19kZXB0aCIsICJJbnRlcm5hbCBwYXJhbGxlbGl6YXRpb24gZGVwdGgsIHRoZSBoaWdoZXIgdGhlIHZhbHVlIHRoZSBoaWdoZXIgdGhlIGxhdGVuY3kuIiwgT0ZGU0VUKHFzdi5hc3luY19kZXB0aCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gQVNZTkNfREVQVEhfREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBWRCB9LAotICAgIHsgTlVMTCB9LAotfTsKLQotc3RhdGljIGNvbnN0IEFWQ2xhc3MgY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAibXBlZzJfcXN2IiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKLSAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLX07Ci0KLUFWQ29kZWMgZmZfbXBlZzJfcXN2X2RlY29kZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gIm1wZWcyX3FzdiIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1QRUctMiB2aWRlbyAoSW50ZWwgUXVpY2sgU3luYyBWaWRlbyBhY2NlbGVyYXRpb24pIiksCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFFTVk1QRUcyQ29udGV4dCksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCi0gICAgLmluaXQgICAgICAgICAgID0gcXN2X2RlY29kZV9pbml0LAotICAgIC5kZWNvZGUgICAgICAgICA9IHFzdl9kZWNvZGVfZnJhbWUsCi0gICAgLmZsdXNoICAgICAgICAgID0gcXN2X2RlY29kZV9mbHVzaCwKLSAgICAuY2xvc2UgICAgICAgICAgPSBxc3ZfZGVjb2RlX2Nsb3NlLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9EUjEsCi0gICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfTlYxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1FTViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfSwKLX07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3FzdmRlY19vdGhlci5jIGIvbGliYXZjb2RlYy9xc3ZkZWNfb3RoZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzg3MmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9xc3ZkZWNfb3RoZXIuYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIEludGVsIE1lZGlhU0RLIFFTViBiYXNlZCBNUEVHLTIsIFZDLTEgYW5kIFZQOCBkZWNvZGVycworICoKKyAqIGNvcHlyaWdodCAoYykgMjAxNSBBbnRvbiBLaGlybm92CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bWZ4L21meHZpZGVvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJxc3ZfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJxc3ZkZWMuaCIKKyNpbmNsdWRlICJxc3YuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUVNWT3RoZXJDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBRU1ZDb250ZXh0IHFzdjsKKworICAgIEFWRmlmb0J1ZmZlciAqcGFja2V0X2ZpZm87CisKKyAgICBBVlBhY2tldCBpbnB1dF9yZWY7Cit9IFFTVk90aGVyQ29udGV4dDsKKworc3RhdGljIHZvaWQgcXN2X2NsZWFyX2J1ZmZlcnMoUVNWT3RoZXJDb250ZXh0ICpzKQoreworICAgIEFWUGFja2V0IHBrdDsKKyAgICB3aGlsZSAoYXZfZmlmb19zaXplKHMtPnBhY2tldF9maWZvKSA+PSBzaXplb2YocGt0KSkgeworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5wYWNrZXRfZmlmbywgJnBrdCwgc2l6ZW9mKHBrdCksIE5VTEwpOworICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgfQorCisgICAgYXZfcGFja2V0X3VucmVmKCZzLT5pbnB1dF9yZWYpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcXN2X2RlY29kZV9jbG9zZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUVNWT3RoZXJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworI2lmIENPTkZJR19WUDhfUVNWX0RFQ09ERVIKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCkKKyAgICAgICAgYXZfZnJlZXAoJnMtPnFzdi5sb2FkX3BsdWdpbnMpOworI2VuZGlmCisKKyAgICBmZl9xc3ZfZGVjb2RlX2Nsb3NlKCZzLT5xc3YpOworCisgICAgcXN2X2NsZWFyX2J1ZmZlcnMocyk7CisKKyAgICBhdl9maWZvX2ZyZWUocy0+cGFja2V0X2ZpZm8pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBxc3ZfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFFTVk90aGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworI2lmIENPTkZJR19WUDhfUVNWX0RFQ09ERVIKKyAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOCkgeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqdWlkX3ZwOGRlY19odyA9ICJmNjIyMzk0ZDhkODc0NTJmODc4YzUxZjJmYzliNDEzMSI7CisKKyAgICAgICAgYXZfZnJlZXAoJnMtPnFzdi5sb2FkX3BsdWdpbnMpOworICAgICAgICBzLT5xc3YubG9hZF9wbHVnaW5zID0gYXZfc3RyZHVwKHVpZF92cDhkZWNfaHcpOworICAgICAgICBpZiAoIXMtPnFzdi5sb2FkX3BsdWdpbnMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyNlbmRpZgorCisgICAgcy0+cGFja2V0X2ZpZm8gPSBhdl9maWZvX2FsbG9jKHNpemVvZihBVlBhY2tldCkpOworICAgIGlmICghcy0+cGFja2V0X2ZpZm8pIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIHFzdl9kZWNvZGVfY2xvc2UoYXZjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcXN2X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBRU1ZPdGhlckNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lICAgID0gZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgLyogYnVmZmVyIHRoZSBpbnB1dCBwYWNrZXQgKi8KKyAgICBpZiAoYXZwa3QtPnNpemUpIHsKKyAgICAgICAgQVZQYWNrZXQgaW5wdXRfcmVmID0geyAwIH07CisKKyAgICAgICAgaWYgKGF2X2ZpZm9fc3BhY2Uocy0+cGFja2V0X2ZpZm8pIDwgc2l6ZW9mKGlucHV0X3JlZikpIHsKKyAgICAgICAgICAgIHJldCA9IGF2X2ZpZm9fcmVhbGxvYzIocy0+cGFja2V0X2ZpZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZpZm9fc2l6ZShzLT5wYWNrZXRfZmlmbykgKyBzaXplb2YoaW5wdXRfcmVmKSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gYXZfcGFja2V0X3JlZigmaW5wdXRfcmVmLCBhdnBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHMtPnBhY2tldF9maWZvLCAmaW5wdXRfcmVmLCBzaXplb2YoaW5wdXRfcmVmKSwgTlVMTCk7CisgICAgfQorCisgICAgLyogcHJvY2VzcyBidWZmZXJlZCBkYXRhICovCisgICAgd2hpbGUgKCEqZ290X2ZyYW1lKSB7CisgICAgICAgIGlmIChzLT5pbnB1dF9yZWYuc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAvKiBubyBtb3JlIGRhdGEgKi8KKyAgICAgICAgICAgIGlmIChhdl9maWZvX3NpemUocy0+cGFja2V0X2ZpZm8pIDwgc2l6ZW9mKEFWUGFja2V0KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYXZwa3QtPnNpemUgPyBhdnBrdC0+c2l6ZSA6IGZmX3Fzdl9wcm9jZXNzX2RhdGEoYXZjdHgsICZzLT5xc3YsIGZyYW1lLCBnb3RfZnJhbWUsIGF2cGt0KTsKKworICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZzLT5pbnB1dF9yZWYpOworICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocy0+cGFja2V0X2ZpZm8sICZzLT5pbnB1dF9yZWYsIHNpemVvZihzLT5pbnB1dF9yZWYpLCBOVUxMKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGZmX3Fzdl9wcm9jZXNzX2RhdGEoYXZjdHgsICZzLT5xc3YsIGZyYW1lLCBnb3RfZnJhbWUsICZzLT5pbnB1dF9yZWYpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcy0+aW5wdXRfcmVmLnNpemUgLT0gcmV0OworICAgICAgICBzLT5pbnB1dF9yZWYuZGF0YSArPSByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgdm9pZCBxc3ZfZGVjb2RlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBRU1ZPdGhlckNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcXN2X2NsZWFyX2J1ZmZlcnMocyk7CisgICAgZmZfcXN2X2RlY29kZV9mbHVzaChhdmN0eCwgJnMtPnFzdik7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFFTVk90aGVyQ29udGV4dCwgeCkKKyNkZWZpbmUgVkQgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJhc3luY19kZXB0aCIsICJJbnRlcm5hbCBwYXJhbGxlbGl6YXRpb24gZGVwdGgsIHRoZSBoaWdoZXIgdGhlIHZhbHVlIHRoZSBoaWdoZXIgdGhlIGxhdGVuY3kuIiwgT0ZGU0VUKHFzdi5hc3luY19kZXB0aCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gQVNZTkNfREVQVEhfREVGQVVMVCB9LCAwLCBJTlRfTUFYLCBWRCB9LAorICAgIHsgTlVMTCB9LAorfTsKKworI2lmIENPTkZJR19NUEVHMl9RU1ZfREVDT0RFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3MgbXBlZzJfcXN2X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm1wZWcyX3FzdiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX21wZWcyX3Fzdl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnMl9xc3YiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNUEVHLTIgdmlkZW8gKEludGVsIFF1aWNrIFN5bmMgVmlkZW8gYWNjZWxlcmF0aW9uKSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihRU1ZPdGhlckNvbnRleHQpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAorICAgIC5pbml0ICAgICAgICAgICA9IHFzdl9kZWNvZGVfaW5pdCwKKyAgICAuZGVjb2RlICAgICAgICAgPSBxc3ZfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IHFzdl9kZWNvZGVfZmx1c2gsCisgICAgLmNsb3NlICAgICAgICAgID0gcXN2X2RlY29kZV9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0FWT0lEX1BST0JJTkcgfCBBVl9DT0RFQ19DQVBfSFlCUklELAorICAgIC5wcml2X2NsYXNzICAgICA9ICZtcGVnMl9xc3ZfY2xhc3MsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9OVjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUVNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorICAgIC5od19jb25maWdzICAgICA9IGZmX3Fzdl9od19jb25maWdzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJxc3YiLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX1ZDMV9RU1ZfREVDT0RFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3MgdmMxX3Fzdl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJ2YzFfcXN2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfdmMxX3Fzdl9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ2YzFfcXN2IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVkMtMSB2aWRlbyAoSW50ZWwgUXVpY2sgU3luYyBWaWRlbyBhY2NlbGVyYXRpb24pIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFFTVk90aGVyQ29udGV4dCksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZDMSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBxc3ZfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gcXN2X2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgICAgPSBxc3ZfZGVjb2RlX2ZsdXNoLAorICAgIC5jbG9zZSAgICAgICAgICA9IHFzdl9kZWNvZGVfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9BVk9JRF9QUk9CSU5HIHwgQVZfQ09ERUNfQ0FQX0hZQlJJRCwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmdmMxX3Fzdl9jbGFzcywKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX05WMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9RU1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLmh3X2NvbmZpZ3MgICAgID0gZmZfcXN2X2h3X2NvbmZpZ3MsCisgICAgLndyYXBwZXJfbmFtZSAgID0gInFzdiIsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfVlA4X1FTVl9ERUNPREVSCitzdGF0aWMgY29uc3QgQVZDbGFzcyB2cDhfcXN2X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInZwOF9xc3YiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl92cDhfcXN2X2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZwOF9xc3YiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWUDggdmlkZW8gKEludGVsIFF1aWNrIFN5bmMgVmlkZW8gYWNjZWxlcmF0aW9uKSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihRU1ZPdGhlckNvbnRleHQpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WUDgsCisgICAgLmluaXQgICAgICAgICAgID0gcXN2X2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICA9IHFzdl9kZWNvZGVfZnJhbWUsCisgICAgLmZsdXNoICAgICAgICAgID0gcXN2X2RlY29kZV9mbHVzaCwKKyAgICAuY2xvc2UgICAgICAgICAgPSBxc3ZfZGVjb2RlX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSB8IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfQVZPSURfUFJPQklORyB8IEFWX0NPREVDX0NBUF9IWUJSSUQsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnZwOF9xc3ZfY2xhc3MsCisgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9OVjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUVNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAorICAgIC5od19jb25maWdzICAgICA9IGZmX3Fzdl9od19jb25maWdzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJxc3YiLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xc3ZkZWNfdmMxLmMgYi9saWJhdmNvZGVjL3FzdmRlY192YzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNmMTAxZi4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL3FzdmRlY192YzEuYworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qCi0gKiBJbnRlbCBNZWRpYVNESyBRU1YgYmFzZWQgVkMtMSB2aWRlbyBkZWNvZGVyCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLQotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJxc3ZkZWMuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgUVNWVkMxQ29udGV4dCB7Ci0gICAgQVZDbGFzcyAqY2xhc3M7Ci0gICAgUVNWQ29udGV4dCBxc3Y7Ci19IFFTVlZDMUNvbnRleHQ7Ci0KLQotc3RhdGljIGF2X2NvbGQgaW50IHFzdl9kZWNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIFFTVlZDMUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotCi0gICAgZmZfcXN2X2RlY29kZV9jbG9zZSgmcy0+cXN2KTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHFzdl9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgUVNWVkMxQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZGcmFtZSAqZnJhbWUgICAgPSBkYXRhOwotCi0gICAgcmV0dXJuIGZmX3Fzdl9kZWNvZGUoYXZjdHgsICZzLT5xc3YsIGZyYW1lLCBnb3RfZnJhbWUsIGF2cGt0KTsKLX0KLQotc3RhdGljIHZvaWQgcXN2X2RlY29kZV9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgUVNWVkMxQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgZmZfcXN2X2RlY29kZV9yZXNldChhdmN0eCwgJnMtPnFzdik7Ci19Ci0KLUFWSFdBY2NlbCBmZl92YzFfcXN2X2h3YWNjZWwgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gInZjMV9xc3YiLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQzEsCi0gICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9RU1YsCi19OwotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihRU1ZWQzFDb250ZXh0LCB4KQotI2RlZmluZSBWRCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewotICAgIHsgImFzeW5jX2RlcHRoIiwgIkludGVybmFsIHBhcmFsbGVsaXphdGlvbiBkZXB0aCwgdGhlIGhpZ2hlciB0aGUgdmFsdWUgdGhlIGhpZ2hlciB0aGUgbGF0ZW5jeS4iLCBPRkZTRVQocXN2LmFzeW5jX2RlcHRoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBBU1lOQ19ERVBUSF9ERUZBVUxUIH0sIDAsIElOVF9NQVgsIFZEIH0sCi0gICAgeyBOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyBjbGFzcyA9IHsKLSAgICAuY2xhc3NfbmFtZSA9ICJ2YzFfcXN2IiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKLSAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLX07Ci0KLUFWQ29kZWMgZmZfdmMxX3Fzdl9kZWNvZGVyID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJ2YzFfcXN2IiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVkMtMSB2aWRlbyAoSW50ZWwgUXVpY2sgU3luYyBWaWRlbyBhY2NlbGVyYXRpb24pIiksCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFFTVlZDMUNvbnRleHQpLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQzEsCi0gICAgLmluaXQgICAgICAgICAgID0gTlVMTCwKLSAgICAuZGVjb2RlICAgICAgICAgPSBxc3ZfZGVjb2RlX2ZyYW1lLAotICAgIC5mbHVzaCAgICAgICAgICA9IHFzdl9kZWNvZGVfZmx1c2gsCi0gICAgLmNsb3NlICAgICAgICAgID0gcXN2X2RlY29kZV9jbG9zZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVksCi0gICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzLAotICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfTlYxMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1FTViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfSwKLX07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3FzdmVuYy5jIGIvbGliYXZjb2RlYy9xc3ZlbmMuYwppbmRleCAzYmFjOGNmLi4zY2U1ZmZlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3FzdmVuYy5jCisrKyBiL2xpYmF2Y29kZWMvcXN2ZW5jLmMKQEAgLTI2LDYgKzI2LDggQEAKICNpbmNsdWRlIDxtZngvbWZ4dmlkZW8uaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dF9xc3YuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCkBAIC04Myw3ICs4NSw5IEBACiAgICAgeyBNRlhfUkFURUNPTlRST0xfQ0JSLCAgICAgIkNCUiIgfSwKICAgICB7IE1GWF9SQVRFQ09OVFJPTF9WQlIsICAgICAiVkJSIiB9LAogICAgIHsgTUZYX1JBVEVDT05UUk9MX0NRUCwgICAgICJDUVAiIH0sCisjaWYgUVNWX0hBVkVfQVZCUgogICAgIHsgTUZYX1JBVEVDT05UUk9MX0FWQlIsICAgICJBVkJSIiB9LAorI2VuZGlmCiAjaWYgUVNWX0hBVkVfTEEKICAgICB7IE1GWF9SQVRFQ09OVFJPTF9MQSwgICAgICAiTEEiIH0sCiAjZW5kaWYKQEAgLTEzMiw5ICsxMzYsNiBAQAogI2lmIFFTVl9IQVZFX0NPMgogICAgIG1meEV4dENvZGluZ09wdGlvbjIgKmNvMiA9IChtZnhFeHRDb2RpbmdPcHRpb24yKiljb2Rpbmdfb3B0c1sxXTsKICNlbmRpZgotI2lmIFFTVl9IQVZFX0NPMwotICAgIG1meEV4dENvZGluZ09wdGlvbjMgKmNvMyA9IChtZnhFeHRDb2RpbmdPcHRpb24zKiljb2Rpbmdfb3B0c1syXTsKLSNlbmRpZgogCiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgInByb2ZpbGU6ICVzOyBsZXZlbDogJSJQUkl1MTYiXG4iLAogICAgICAgICAgICBwcmludF9wcm9maWxlKGluZm8tPkNvZGVjUHJvZmlsZSksIGluZm8tPkNvZGVjTGV2ZWwpOwpAQCAtMTYyLDExICsxNjMsMTQgQEAKICAgICB9IGVsc2UgaWYgKGluZm8tPlJhdGVDb250cm9sTWV0aG9kID09IE1GWF9SQVRFQ09OVFJPTF9DUVApIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlFQSTogJSJQUkl1MTYiOyBRUFA6ICUiUFJJdTE2IjsgUVBCOiAlIlBSSXUxNiJcbiIsCiAgICAgICAgICAgICAgICBpbmZvLT5RUEksIGluZm8tPlFQUCwgaW5mby0+UVBCKTsKLSAgICB9IGVsc2UgaWYgKGluZm8tPlJhdGVDb250cm9sTWV0aG9kID09IE1GWF9SQVRFQ09OVFJPTF9BVkJSKSB7CisgICAgfQorI2lmIFFTVl9IQVZFX0FWQlIKKyAgICBlbHNlIGlmIChpbmZvLT5SYXRlQ29udHJvbE1ldGhvZCA9PSBNRlhfUkFURUNPTlRST0xfQVZCUikgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLAogICAgICAgICAgICAgICAgIlRhcmdldEticHM6ICUiUFJJdTE2IjsgQWNjdXJhY3k6ICUiUFJJdTE2IjsgQ29udmVyZ2VuY2U6ICUiUFJJdTE2IlxuIiwKICAgICAgICAgICAgICAgIGluZm8tPlRhcmdldEticHMsIGluZm8tPkFjY3VyYWN5LCBpbmZvLT5Db252ZXJnZW5jZSk7CiAgICAgfQorI2VuZGlmCiAjaWYgUVNWX0hBVkVfTEEKICAgICBlbHNlIGlmIChpbmZvLT5SYXRlQ29udHJvbE1ldGhvZCA9PSBNRlhfUkFURUNPTlRST0xfTEEKICNpZiBRU1ZfSEFWRV9MQV9IUkQKQEAgLTE4NiwxMiArMTkwLDYgQEAKICAgICAgICAgICAgICAgIGluZm8tPklDUVF1YWxpdHksIGNvMi0+TG9va0FoZWFkRGVwdGgpOwogICAgIH0KICNlbmRpZgotI2lmIFFTVl9IQVZFX1FWQlIKLSAgICBlbHNlIGlmIChpbmZvLT5SYXRlQ29udHJvbE1ldGhvZCA9PSBNRlhfUkFURUNPTlRST0xfUVZCUikgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiUVZCUlF1YWxpdHk6ICUiUFJJdTE2IlxuIiwKLSAgICAgICAgICAgICAgIGNvMy0+UVZCUlF1YWxpdHkpOwotICAgIH0KLSNlbmRpZgogCiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIk51bVNsaWNlOiAlIlBSSXUxNiI7IE51bVJlZkZyYW1lOiAlIlBSSXUxNiJcbiIsCiAgICAgICAgICAgIGluZm8tPk51bVNsaWNlLCBpbmZvLT5OdW1SZWZGcmFtZSk7CkBAIC0yOTQsNiArMjkyLDEyIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCisgICAgaWYgKCF3YW50X3FzY2FsZSAmJiBhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgPiAwICYmICFRU1ZfSEFWRV9JQ1EpeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJQ1EgcmF0ZWNvbnRyb2wgbW9kZSByZXF1ZXN0ZWQsIGJ1dCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgU0RLIHZlcnNpb25cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKwogICAgIGlmICh3YW50X3FzY2FsZSkgewogICAgICAgICByY19tb2RlID0gTUZYX1JBVEVDT05UUk9MX0NRUDsKICAgICAgICAgcmNfZGVzYyA9ICJjb25zdGFudCBxdWFudGl6YXRpb24gcGFyYW1ldGVyIChDUVApIjsKQEAgLTMyNiwxMCArMzMwLDE0IEBACiAgICAgZWxzZSBpZiAoYXZjdHgtPnJjX21heF9yYXRlID09IGF2Y3R4LT5iaXRfcmF0ZSkgewogICAgICAgICByY19tb2RlID0gTUZYX1JBVEVDT05UUk9MX0NCUjsKICAgICAgICAgcmNfZGVzYyA9ICJjb25zdGFudCBiaXRyYXRlIChDQlIpIjsKLSAgICB9IGVsc2UgaWYgKCFhdmN0eC0+cmNfbWF4X3JhdGUpIHsKKyAgICB9CisjaWYgUVNWX0hBVkVfQVZCUgorICAgIGVsc2UgaWYgKCFhdmN0eC0+cmNfbWF4X3JhdGUpIHsKICAgICAgICAgcmNfbW9kZSA9IE1GWF9SQVRFQ09OVFJPTF9BVkJSOwogICAgICAgICByY19kZXNjID0gImF2ZXJhZ2UgdmFyaWFibGUgYml0cmF0ZSAoQVZCUikiOwotICAgIH0gZWxzZSB7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CiAgICAgICAgIHJjX21vZGUgPSBNRlhfUkFURUNPTlRST0xfVkJSOwogICAgICAgICByY19kZXNjID0gInZhcmlhYmxlIGJpdHJhdGUgKFZCUikiOwogICAgIH0KQEAgLTM0MCwyMSArMzQ4LDQyIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcmNfc3VwcG9ydGVkKFFTVkVuY0NvbnRleHQgKnEpCitzdGF0aWMgaW50IGNoZWNrX2VuY19wYXJhbShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFFTVkVuY0NvbnRleHQgKnEpCiB7CiAgICAgbWZ4VmlkZW9QYXJhbSBwYXJhbV9vdXQgPSB7IC5tZnguQ29kZWNJZCA9IHEtPnBhcmFtLm1meC5Db2RlY0lkIH07CiAgICAgbWZ4U3RhdHVzIHJldDsKIAorI2RlZmluZSBVTk1BVENIKHgpIChwYXJhbV9vdXQubWZ4LnggIT0gcS0+cGFyYW0ubWZ4LngpCisKICAgICByZXQgPSBNRlhWaWRlb0VOQ09ERV9RdWVyeShxLT5zZXNzaW9uLCAmcS0+cGFyYW0sICZwYXJhbV9vdXQpOwotICAgIGlmIChyZXQgPCAwIHx8Ci0gICAgICAgIHBhcmFtX291dC5tZnguUmF0ZUNvbnRyb2xNZXRob2QgIT0gcS0+cGFyYW0ubWZ4LlJhdGVDb250cm9sTWV0aG9kKQorCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKFVOTUFUQ0goQ29kZWNJZCkpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkN1cnJlbnQgY29kZWMgdHlwZSBpcyB1bnN1cHBvcnRlZFxuIik7CisgICAgICAgIGlmIChVTk1BVENIKENvZGVjUHJvZmlsZSkpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkN1cnJlbnQgcHJvZmlsZSBpcyB1bnN1cHBvcnRlZFxuIik7CisgICAgICAgIGlmIChVTk1BVENIKFJhdGVDb250cm9sTWV0aG9kKSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2VsZWN0ZWQgcmF0ZWNvbnRyb2wgbW9kZSBpcyB1bnN1cHBvcnRlZFxuIik7CisgICAgICAgIGlmIChVTk1BVENIKExvd1Bvd2VyKSkKKyAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJMb3cgcG93ZXIgbW9kZSBpcyB1bnN1cHBvcnRlZFxuIik7CisgICAgICAgIGlmIChVTk1BVENIKEZyYW1lSW5mby5GcmFtZVJhdGVFeHROKSB8fCBVTk1BVENIKEZyYW1lSW5mby5GcmFtZVJhdGVFeHREKSkKKyAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDdXJyZW50IGZyYW1lIHJhdGUgaXMgdW5zdXBwb3J0ZWRcbiIpOworICAgICAgICBpZiAoVU5NQVRDSChGcmFtZUluZm8uUGljU3RydWN0KSkKKyAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDdXJyZW50IHBpY3R1cmUgc3RydWN0dXJlIGlzIHVuc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgaWYgKFVOTUFUQ0goRnJhbWVJbmZvLldpZHRoKSB8fCBVTk1BVENIKEZyYW1lSW5mby5IZWlnaHQpKQorICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkN1cnJlbnQgcmVzb2x1dGlvbiBpcyB1bnN1cHBvcnRlZFxuIik7CisgICAgICAgIGlmIChVTk1BVENIKEZyYW1lSW5mby5Gb3VyQ0MpKQorICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkN1cnJlbnQgcGl4ZWwgZm9ybWF0IGlzIHVuc3VwcG9ydGVkXG4iKTsKICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IGluaXRfdmlkZW9fcGFyYW0oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZFbmNDb250ZXh0ICpxKQorc3RhdGljIGludCBpbml0X3ZpZGVvX3BhcmFtX2pwZWcoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZFbmNDb250ZXh0ICpxKQogewotICAgIGZsb2F0IHF1YW50OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzd19mb3JtYXQgPSBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1FTViA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zd19waXhfZm10IDogYXZjdHgtPnBpeF9mbXQ7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOwogICAgIGludCByZXQ7CiAKICAgICByZXQgPSBmZl9xc3ZfY29kZWNfaWRfdG9fbWZ4KGF2Y3R4LT5jb2RlY19pZCk7CkBAIC0zNjIsNyArMzkxLDY0IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKICAgICBxLT5wYXJhbS5tZnguQ29kZWNJZCA9IHJldDsKIAotICAgIHEtPndpZHRoX2FsaWduID0gYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hFVkMgPyAzMiA6IDE2OworICAgIGlmIChhdmN0eC0+bGV2ZWwgPiAwKQorICAgICAgICBxLT5wYXJhbS5tZnguQ29kZWNMZXZlbCA9IGF2Y3R4LT5sZXZlbDsKKyAgICBxLT5wYXJhbS5tZnguQ29kZWNQcm9maWxlICAgICAgID0gcS0+cHJvZmlsZTsKKworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHN3X2Zvcm1hdCk7CisgICAgaWYgKCFkZXNjKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisKKyAgICBmZl9xc3ZfbWFwX3BpeGZtdChzd19mb3JtYXQsICZxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkZvdXJDQyk7CisKKyAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkNyb3BYICAgICAgICAgID0gMDsKKyAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkNyb3BZICAgICAgICAgID0gMDsKKyAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkNyb3BXICAgICAgICAgID0gYXZjdHgtPndpZHRoOworICAgIHEtPnBhcmFtLm1meC5GcmFtZUluZm8uQ3JvcEggICAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OworICAgIHEtPnBhcmFtLm1meC5GcmFtZUluZm8uQXNwZWN0UmF0aW9XICAgPSBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW07CisgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5Bc3BlY3RSYXRpb0ggICA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbjsKKyAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkNocm9tYUZvcm1hdCAgID0gTUZYX0NIUk9NQUZPUk1BVF9ZVVY0MjA7CisgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5CaXREZXB0aEx1bWEgICA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5CaXREZXB0aENocm9tYSA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5TaGlmdCAgICAgICAgICA9IGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4OworCisgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5XaWR0aCAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMTYpOworICAgIHEtPnBhcmFtLm1meC5GcmFtZUluZm8uSGVpZ2h0ID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNik7CisKKyAgICBpZiAoYXZjdHgtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggICAgPSAoQVZIV0ZyYW1lc0NvbnRleHQgKilhdmN0eC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICAgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICpmcmFtZXNfaHdjdHggPSBmcmFtZXNfY3R4LT5od2N0eDsKKyAgICAgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5XaWR0aCAgPSBmcmFtZXNfaHdjdHgtPnN1cmZhY2VzWzBdLkluZm8uV2lkdGg7CisgICAgICAgIHEtPnBhcmFtLm1meC5GcmFtZUluZm8uSGVpZ2h0ID0gZnJhbWVzX2h3Y3R4LT5zdXJmYWNlc1swXS5JbmZvLkhlaWdodDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmZyYW1lcmF0ZS5kZW4gPiAwICYmIGF2Y3R4LT5mcmFtZXJhdGUubnVtID4gMCkgeworICAgICAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkZyYW1lUmF0ZUV4dE4gPSBhdmN0eC0+ZnJhbWVyYXRlLm51bTsKKyAgICAgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5GcmFtZVJhdGVFeHREID0gYXZjdHgtPmZyYW1lcmF0ZS5kZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5GcmFtZVJhdGVFeHROICA9IGF2Y3R4LT50aW1lX2Jhc2UuZGVuOworICAgICAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkZyYW1lUmF0ZUV4dEQgID0gYXZjdHgtPnRpbWVfYmFzZS5udW07CisgICAgfQorCisgICAgcS0+cGFyYW0ubWZ4LkludGVybGVhdmVkICAgICAgICAgID0gMTsKKyAgICBxLT5wYXJhbS5tZnguUXVhbGl0eSAgICAgICAgICAgICAgPSBhdl9jbGlwKGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSwgMSwgMTAwKTsKKyAgICBxLT5wYXJhbS5tZnguUmVzdGFydEludGVydmFsICAgICAgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF92aWRlb19wYXJhbShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFFTVkVuY0NvbnRleHQgKnEpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHN3X2Zvcm1hdCA9IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUVNWID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnN3X3BpeF9mbXQgOiBhdmN0eC0+cGl4X2ZtdDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisgICAgZmxvYXQgcXVhbnQ7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3Fzdl9jb2RlY19pZF90b19tZngoYXZjdHgtPmNvZGVjX2lkKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIHEtPnBhcmFtLm1meC5Db2RlY0lkID0gcmV0OwogCiAgICAgaWYgKGF2Y3R4LT5sZXZlbCA+IDApCiAgICAgICAgIHEtPnBhcmFtLm1meC5Db2RlY0xldmVsID0gYXZjdHgtPmxldmVsOwpAQCAtMzc5LDcgKzQ2NSwxMiBAQAogICAgIHEtPnBhcmFtLm1meC5FbmNvZGVkT3JkZXIgICAgICAgPSAwOwogICAgIHEtPnBhcmFtLm1meC5CdWZmZXJTaXplSW5LQiAgICAgPSAwOwogCi0gICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5Gb3VyQ0MgICAgICAgICA9IE1GWF9GT1VSQ0NfTlYxMjsKKyAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzd19mb3JtYXQpOworICAgIGlmICghZGVzYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworCisgICAgZmZfcXN2X21hcF9waXhmbXQoc3dfZm9ybWF0LCAmcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5Gb3VyQ0MpOworCiAgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5Dcm9wWCAgICAgICAgICA9IDA7CiAgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5Dcm9wWSAgICAgICAgICA9IDA7CiAgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5Dcm9wVyAgICAgICAgICA9IGF2Y3R4LT53aWR0aDsKQEAgLTM4NywyMyArNDc4LDM4IEBACiAgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5Bc3BlY3RSYXRpb1cgICA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bTsKICAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkFzcGVjdFJhdGlvSCAgID0gYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuOwogICAgIHEtPnBhcmFtLm1meC5GcmFtZUluZm8uQ2hyb21hRm9ybWF0ICAgPSBNRlhfQ0hST01BRk9STUFUX1lVVjQyMDsKLSAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkJpdERlcHRoTHVtYSAgID0gODsKLSAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkJpdERlcHRoQ2hyb21hID0gODsKLSAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLldpZHRoICAgICAgICAgID0gRkZBTElHTihhdmN0eC0+d2lkdGgsIHEtPndpZHRoX2FsaWduKTsKKyAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkJpdERlcHRoTHVtYSAgID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLkJpdERlcHRoQ2hyb21hID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLlNoaWZ0ICAgICAgICAgID0gZGVzYy0+Y29tcFswXS5kZXB0aCA+IDg7CisKKyAgICAvLyBUT0RPOiAgZGV0ZWN0IHZlcnNpb24gb2YgTUZYLS1pZiB0aGUgbWlub3IgdmVyc2lvbiBpcyBncmVhdGVyIHRoYW4KKyAgICAvLyBvciBlcXVhbCB0byAxOSwgdGhlbiBjYW4gdXNlIHRoZSBzYW1lIGFsaWdubWVudCBzZXR0aW5ncyBhcyBILjI2NAorICAgIC8vIGZvciBIRVZDCisgICAgcS0+d2lkdGhfYWxpZ24gPSBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQyA/IDMyIDogMTY7CisgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5XaWR0aCA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCBxLT53aWR0aF9hbGlnbik7CiAKICAgICBpZiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19JTlRFUkxBQ0VEX0RDVCkgewotICAgICAgIC8qIEEgdHJ1ZSBmaWVsZCBsYXlvdXQgKFRGRiBvciBCRkYpIGlzIG5vdCBpbXBvcnRhbnQgaGVyZSwKLSAgICAgICAgICBpdCB3aWxsIHNwZWNpZmllZCBsYXRlciBkdXJpbmcgZnJhbWUgZW5jb2RpbmcuIEJ1dCBpdCBpcyBpbXBvcnRhbnQKLSAgICAgICAgICB0byBzcGVjaWZ5IGlzIGZyYW1lIHByb2dyZXNzaXZlIG9yIG5vdCBiZWNhdXNlIGFsbG93ZWQgaGVpZ2ggYWxpZ25tZW50Ci0gICAgICAgICAgZG9lcyBkZXBlbmQgYnkgdGhpcy4KLSAgICAgICAgKi8KKyAgICAgICAgLy8gaXQgaXMgaW1wb3J0YW50IHRoYXQgUGljU3RydWN0IGJlIHNldHVwIGNvcnJlY3RseSBmcm9tIHRoZQorICAgICAgICAvLyBzdGFydC0tb3RoZXJ3aXNlLCBlbmNvZGluZyBkb2Vzbid0IHdvcmsgYW5kIHJlc3VsdHMgaW4gYSBidW5jaAorICAgICAgICAvLyBvZiBpbmNvbXBhdGlibGUgdmlkZW8gcGFyYW1ldGVyIGVycm9ycwogICAgICAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLlBpY1N0cnVjdCA9IE1GWF9QSUNTVFJVQ1RfRklFTERfVEZGOworICAgICAgICAvLyBoZWlnaHQgYWxpZ25tZW50IGFsd2F5cyBtdXN0IGJlIDMyIGZvciBpbnRlcmxhY2VkIHZpZGVvCiAgICAgICAgIHEtPmhlaWdodF9hbGlnbiA9IDMyOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHEtPnBhcmFtLm1meC5GcmFtZUluZm8uUGljU3RydWN0ID0gTUZYX1BJQ1NUUlVDVF9QUk9HUkVTU0lWRTsKLSAgICAgICAgcS0+aGVpZ2h0X2FsaWduID0gMTY7CisgICAgICAgIC8vIGZvciBwcm9ncmVzc2l2ZSB2aWRlbywgdGhlIGhlaWdodCBzaG91bGQgYmUgYWxpZ25lZCB0byAxNiBmb3IKKyAgICAgICAgLy8gSC4yNjQuICBGb3IgSEVWQywgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIE1GWCwgaXQgc2hvdWxkIGJlCisgICAgICAgIC8vIGVpdGhlciAzMiBvciAxNi4gIFRoZSBsb3dlciBudW1iZXIgaXMgYmV0dGVyIGlmIHBvc3NpYmxlLgorICAgICAgICBxLT5oZWlnaHRfYWxpZ24gPSBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQyA/IDMyIDogMTY7CiAgICAgfQotICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5IZWlnaHQgICAgPSBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQsIHEtPmhlaWdodF9hbGlnbik7CisgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5IZWlnaHQgPSBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQsIHEtPmhlaWdodF9hbGlnbik7CisKKyAgICBpZiAoYXZjdHgtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWF2Y3R4LT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgICAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGZyYW1lc19jdHgtPmh3Y3R4OworICAgICAgICBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLldpZHRoICA9IGZyYW1lc19od2N0eC0+c3VyZmFjZXNbMF0uSW5mby5XaWR0aDsKKyAgICAgICAgcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5IZWlnaHQgPSBmcmFtZXNfaHdjdHgtPnN1cmZhY2VzWzBdLkluZm8uSGVpZ2h0OworICAgIH0KIAogICAgIGlmIChhdmN0eC0+ZnJhbWVyYXRlLmRlbiA+IDAgJiYgYXZjdHgtPmZyYW1lcmF0ZS5udW0gPiAwKSB7CiAgICAgICAgIHEtPnBhcmFtLm1meC5GcmFtZUluZm8uRnJhbWVSYXRlRXh0TiA9IGF2Y3R4LT5mcmFtZXJhdGUubnVtOwpAQCAtNDIzLDYgKzUyOSw3IEBACiAjaWYgUVNWX0hBVkVfVkNNCiAgICAgY2FzZSBNRlhfUkFURUNPTlRST0xfVkNNOgogI2VuZGlmCisgICAgICAgIHEtPnBhcmFtLm1meC5CdWZmZXJTaXplSW5LQiAgID0gYXZjdHgtPnJjX2J1ZmZlcl9zaXplIC8gODAwMDsKICAgICAgICAgcS0+cGFyYW0ubWZ4LkluaXRpYWxEZWxheUluS0IgPSBhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5IC8gMTAwMDsKICAgICAgICAgcS0+cGFyYW0ubWZ4LlRhcmdldEticHMgICAgICAgPSBhdmN0eC0+Yml0X3JhdGUgLyAxMDAwOwogICAgICAgICBxLT5wYXJhbS5tZnguTWF4S2JwcyAgICAgICAgICA9IGF2Y3R4LT5yY19tYXhfcmF0ZSAvIDEwMDA7CkBAIC00MzUsMTEgKzU0MiwxMyBAQAogICAgICAgICBxLT5wYXJhbS5tZnguUVBCID0gYXZfY2xpcChxdWFudCAqIGZhYnMoYXZjdHgtPmJfcXVhbnRfZmFjdG9yKSArIGF2Y3R4LT5iX3F1YW50X29mZnNldCwgMCwgNTEpOwogCiAgICAgICAgIGJyZWFrOworI2lmIFFTVl9IQVZFX0FWQlIKICAgICBjYXNlIE1GWF9SQVRFQ09OVFJPTF9BVkJSOgogICAgICAgICBxLT5wYXJhbS5tZnguVGFyZ2V0S2JwcyAgPSBhdmN0eC0+Yml0X3JhdGUgLyAxMDAwOwogICAgICAgICBxLT5wYXJhbS5tZnguQ29udmVyZ2VuY2UgPSBxLT5hdmJyX2NvbnZlcmdlbmNlOwogICAgICAgICBxLT5wYXJhbS5tZnguQWNjdXJhY3kgICAgPSBxLT5hdmJyX2FjY3VyYWN5OwogICAgICAgICBicmVhazsKKyNlbmRpZgogI2lmIFFTVl9IQVZFX0xBCiAgICAgY2FzZSBNRlhfUkFURUNPTlRST0xfTEE6CiAgICAgICAgIHEtPnBhcmFtLm1meC5UYXJnZXRLYnBzICA9IGF2Y3R4LT5iaXRfcmF0ZSAvIDEwMDA7CkBAIC00NjAsOCArNTY5LDYgQEAKICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0hFVkMpIHsKICAgICAgICAgcS0+ZXh0Y28uSGVhZGVyLkJ1ZmZlcklkICAgICAgPSBNRlhfRVhUQlVGRl9DT0RJTkdfT1BUSU9OOwogICAgICAgICBxLT5leHRjby5IZWFkZXIuQnVmZmVyU3ogICAgICA9IHNpemVvZihxLT5leHRjbyk7Ci0gICAgICAgIHEtPmV4dGNvLkNBVkxDICAgICAgICAgICAgICAgID0gYXZjdHgtPmNvZGVyX3R5cGUgPT0gRkZfQ09ERVJfVFlQRV9WTEMgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GWF9DT0RJTkdPUFRJT05fT04gOiBNRlhfQ09ESU5HT1BUSU9OX1VOS05PV047CiAKICAgICAgICAgcS0+ZXh0Y28uUGljVGltaW5nU0VJICAgICAgICAgPSBxLT5waWNfdGltaW5nX3NlaSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZYX0NPRElOR09QVElPTl9PTiA6IE1GWF9DT0RJTkdPUFRJT05fVU5LTk9XTjsKQEAgLTQ3MCw2ICs1NzcsMTUgQEAKICAgICAgICAgICAgIHEtPmV4dGNvLlJhdGVEaXN0b3J0aW9uT3B0ID0gcS0+cmRvID4gMCA/IE1GWF9DT0RJTkdPUFRJT05fT04gOiBNRlhfQ09ESU5HT1BUSU9OX09GRjsKIAogICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyNpZiBGRl9BUElfQ09ERVJfVFlQRQorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2Rlcl90eXBlID49IDApCisgICAgICAgICAgICAgICAgcS0+Y2F2bGMgPSBhdmN0eC0+Y29kZXJfdHlwZSA9PSBGRl9DT0RFUl9UWVBFX1ZMQzsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgICAgICAgICBxLT5leHRjby5DQVZMQyA9IHEtPmNhdmxjID8gTUZYX0NPRElOR09QVElPTl9PTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1GWF9DT0RJTkdPUFRJT05fVU5LTk9XTjsKKwogICAgICAgICAgICAgaWYgKGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgIT0gRkZfQ09NUExJQU5DRV9OT1JNQUwpCiAgICAgICAgICAgICAgICAgcS0+ZXh0Y28uTmFsSHJkQ29uZm9ybWFuY2UgPSBhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9OT1JNQUwgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZYX0NPRElOR09QVElPTl9PTiA6IE1GWF9DT0RJTkdPUFRJT05fT0ZGOwpAQCAtNDc5LDYgKzU5NSw3IEBACiAgICAgICAgICAgICBpZiAocS0+cmVjb3ZlcnlfcG9pbnRfc2VpID49IDApCiAgICAgICAgICAgICAgICAgcS0+ZXh0Y28uUmVjb3ZlcnlQb2ludFNFSSA9IHEtPnJlY292ZXJ5X3BvaW50X3NlaSA/IE1GWF9DT0RJTkdPUFRJT05fT04gOiBNRlhfQ09ESU5HT1BUSU9OX09GRjsKICAgICAgICAgICAgIHEtPmV4dGNvLk1heERlY0ZyYW1lQnVmZmVyaW5nID0gcS0+bWF4X2RlY19mcmFtZV9idWZmZXJpbmc7CisgICAgICAgICAgICBxLT5leHRjby5BVURlbGltaXRlciAgICAgICAgICA9IHEtPmF1ZCA/IE1GWF9DT0RJTkdPUFRJT05fT04gOiBNRlhfQ09ESU5HT1BUSU9OX09GRjsKICAgICAgICAgfQogCiAgICAgICAgIHEtPmV4dHBhcmFtX2ludGVybmFsW3EtPm5iX2V4dHBhcmFtX2ludGVybmFsKytdID0gKG1meEV4dEJ1ZmZlciAqKSZxLT5leHRjbzsKQEAgLTUxMyw2ICs2MzAsMTAgQEAKICAgICAgICAgICAgIHEtPmV4dGNvMi5UcmVsbGlzID0gcS0+dHJlbGxpczsKICNlbmRpZgogCisjaWYgUVNWX0hBVkVfTEFfRFMKKyAgICAgICAgICAgIHEtPmV4dGNvMi5Mb29rQWhlYWREUyA9IHEtPmxvb2tfYWhlYWRfZG93bnNhbXBsaW5nOworI2VuZGlmCisKICNpZiBRU1ZfSEFWRV9CUkVGX1RZUEUKICNpZiBGRl9BUElfUFJJVkFURV9PUFQKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKQEAgLTUyOSwyNCArNjUwLDUyIEBACiAjZW5kaWYKIAogICAgICAgICAgICAgcS0+ZXh0cGFyYW1faW50ZXJuYWxbcS0+bmJfZXh0cGFyYW1faW50ZXJuYWwrK10gPSAobWZ4RXh0QnVmZmVyICopJnEtPmV4dGNvMjsKLQotI2lmIFFTVl9WRVJTSU9OX0FUTEVBU1QoMSw4KQotICAgICAgICAgICAgcS0+ZXh0Y28yLkxvb2tBaGVhZERTICAgICAgICAgICA9IHEtPmxvb2tfYWhlYWRfZG93bnNhbXBsaW5nOworICAgICAgICB9CiAjZW5kaWYKKyNpZiBRU1ZfSEFWRV9NRgorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgICAgIG1meFZlcnNpb24gICAgdmVyOworICAgICAgICAgICAgcmV0ID0gTUZYUXVlcnlWZXJzaW9uKHEtPnNlc3Npb24sJnZlcik7CisgICAgICAgICAgICBpZiAocmV0ID49IE1GWF9FUlJfTk9ORSAmJiBRU1ZfUlVOVElNRV9WRVJTSU9OX0FUTEVBU1QodmVyLCAxLCAyNSkpIHsKKyAgICAgICAgICAgICAgICBxLT5leHRtZnAuSGVhZGVyLkJ1ZmZlcklkICAgICA9IE1GWF9FWFRCVUZGX01VTFRJX0ZSQU1FX1BBUkFNOworICAgICAgICAgICAgICAgIHEtPmV4dG1mcC5IZWFkZXIuQnVmZmVyU3ogICAgID0gc2l6ZW9mKHEtPmV4dG1mcCk7CisKKyAgICAgICAgICAgICAgICBxLT5leHRtZnAuTUZNb2RlID0gcS0+bWZtb2RlOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCxBVl9MT0dfVkVSQk9TRSwiTUZNb2RlOiVkXG4iLCBxLT5leHRtZnAuTUZNb2RlKTsKKyAgICAgICAgICAgICAgICBxLT5leHRwYXJhbV9pbnRlcm5hbFtxLT5uYl9leHRwYXJhbV9pbnRlcm5hbCsrXSA9IChtZnhFeHRCdWZmZXIgKikmcS0+ZXh0bWZwOworICAgICAgICAgICAgfQogICAgICAgICB9CiAjZW5kaWYKICAgICB9CiAKLSAgICBpZiAoIXJjX3N1cHBvcnRlZChxKSkgeworICAgIGlmICghY2hlY2tfZW5jX3BhcmFtKGF2Y3R4LHEpKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlNlbGVjdGVkIHJhdGVjb250cm9sIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgUVNWICIKLSAgICAgICAgICAgICAgICJydW50aW1lLiBDaG9vc2UgYSBkaWZmZXJlbnQgbW9kZS5cbiIpOworICAgICAgICAgICAgICAgInNvbWUgZW5jb2RpbmcgcGFyYW1ldGVycyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgUVNWICIKKyAgICAgICAgICAgICAgICJydW50aW1lLiBQbGVhc2UgZG91YmxlIGNoZWNrIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcXN2X3JldHJpZXZlX2VuY19qcGVnX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFFTVkVuY0NvbnRleHQgKnEpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICByZXQgPSBNRlhWaWRlb0VOQ09ERV9HZXRWaWRlb1BhcmFtKHEtPnNlc3Npb24sICZxLT5wYXJhbSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBmZl9xc3ZfcHJpbnRfZXJyb3IoYXZjdHgsIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY2FsbGluZyBHZXRWaWRlb1BhcmFtIik7CisKKyAgICBxLT5wYWNrZXRfc2l6ZSA9IHEtPnBhcmFtLm1meC5CdWZmZXJTaXplSW5LQiAqIDEwMDA7CisKKyAgICAvLyBmb3IgcXN2IG1qcGVnIHRoZSByZXR1cm4gdmFsdWUgbWF5YmUgMCBzbyBhbGxvYyB0aGUgYnVmZmVyCisgICAgaWYgKHEtPnBhY2tldF9zaXplID09IDApCisgICAgICAgIHEtPnBhY2tldF9zaXplID0gcS0+cGFyYW0ubWZ4LkZyYW1lSW5mby5IZWlnaHQgKiBxLT5wYXJhbS5tZnguRnJhbWVJbmZvLldpZHRoICogNDsKKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHFzdl9yZXRyaWV2ZV9lbmNfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWRW5jQ29udGV4dCAqcSkKIHsKICAgICBBVkNQQlByb3BlcnRpZXMgKmNwYl9wcm9wczsKQEAgLTU3MSwxMiArNzIwLDYgQEAKICAgICAgICAgLkhlYWRlci5CdWZmZXJTeiA9IHNpemVvZihjbzIpLAogICAgIH07CiAjZW5kaWYKLSNpZiBRU1ZfSEFWRV9DTzMKLSAgICBtZnhFeHRDb2RpbmdPcHRpb24zIGNvMyA9IHsKLSAgICAgICAgLkhlYWRlci5CdWZmZXJJZCA9IE1GWF9FWFRCVUZGX0NPRElOR19PUFRJT04zLAotICAgICAgICAuSGVhZGVyLkJ1ZmZlclN6ID0gc2l6ZW9mKGNvMyksCi0gICAgfTsKLSNlbmRpZgogCiAgICAgbWZ4RXh0QnVmZmVyICpleHRfYnVmZmVyc1tdID0gewogICAgICAgICAobWZ4RXh0QnVmZmVyKikmZXh0cmFkYXRhLApAQCAtNTg0LDkgKzcyNyw2IEBACiAjaWYgUVNWX0hBVkVfQ08yCiAgICAgICAgIChtZnhFeHRCdWZmZXIqKSZjbzIsCiAjZW5kaWYKLSNpZiBRU1ZfSEFWRV9DTzMKLSAgICAgICAgKG1meEV4dEJ1ZmZlciopJmNvMywKLSNlbmRpZgogICAgIH07CiAKICAgICBpbnQgbmVlZF9wcHMgPSBhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTzsKQEAgLTU5Nyw3ICs3MzcsOCBAQAogCiAgICAgcmV0ID0gTUZYVmlkZW9FTkNPREVfR2V0VmlkZW9QYXJhbShxLT5zZXNzaW9uLCAmcS0+cGFyYW0pOwogICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gZmZfcXN2X2Vycm9yKHJldCk7CisgICAgICAgIHJldHVybiBmZl9xc3ZfcHJpbnRfZXJyb3IoYXZjdHgsIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgY2FsbGluZyBHZXRWaWRlb1BhcmFtIik7CiAKICAgICBxLT5wYWNrZXRfc2l6ZSA9IHEtPnBhcmFtLm1meC5CdWZmZXJTaXplSW5LQiAqIDEwMDA7CiAKQEAgLTY2Nyw1NCArODA4LDExMSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHFzdmVuY19pbml0X3Nlc3Npb24oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBRU1ZFbmNDb250ZXh0ICpxKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmh3YWNjZWxfY29udGV4dCkgeworICAgICAgICBBVlFTVkNvbnRleHQgKnFzdiA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgICAgIHEtPnNlc3Npb24gPSBxc3YtPnNlc3Npb247CisgICAgfSBlbHNlIGlmIChhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBxLT5mcmFtZXNfY3R4Lmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKGF2Y3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgaWYgKCFxLT5mcmFtZXNfY3R4Lmh3X2ZyYW1lc19jdHgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHJldCA9IGZmX3Fzdl9pbml0X3Nlc3Npb25fZnJhbWVzKGF2Y3R4LCAmcS0+aW50ZXJuYWxfc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnEtPmZyYW1lc19jdHgsIHEtPmxvYWRfcGx1Z2lucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+cGFyYW0uSU9QYXR0ZXJuID09IE1GWF9JT1BBVFRFUk5fSU5fT1BBUVVFX01FTU9SWSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJnEtPmZyYW1lc19jdHguaHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcS0+c2Vzc2lvbiA9IHEtPmludGVybmFsX3Nlc3Npb247CisgICAgfSBlbHNlIGlmIChhdmN0eC0+aHdfZGV2aWNlX2N0eCkgeworICAgICAgICByZXQgPSBmZl9xc3ZfaW5pdF9zZXNzaW9uX2RldmljZShhdmN0eCwgJnEtPmludGVybmFsX3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5od19kZXZpY2VfY3R4LCBxLT5sb2FkX3BsdWdpbnMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcS0+c2Vzc2lvbiA9IHEtPmludGVybmFsX3Nlc3Npb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gZmZfcXN2X2luaXRfaW50ZXJuYWxfc2Vzc2lvbihhdmN0eCwgJnEtPmludGVybmFsX3Nlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+bG9hZF9wbHVnaW5zKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHEtPnNlc3Npb24gPSBxLT5pbnRlcm5hbF9zZXNzaW9uOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBpbnQgZmZfcXN2X2VuY19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgUVNWRW5jQ29udGV4dCAqcSkKIHsKKyAgICBpbnQgaW9wYXR0ZXJuID0gMDsKICAgICBpbnQgb3BhcXVlX2FsbG9jID0gMDsKICAgICBpbnQgcmV0OwogCi0gICAgcS0+cGFyYW0uSU9QYXR0ZXJuICA9IE1GWF9JT1BBVFRFUk5fSU5fU1lTVEVNX01FTU9SWTsKICAgICBxLT5wYXJhbS5Bc3luY0RlcHRoID0gcS0+YXN5bmNfZGVwdGg7CiAKICAgICBxLT5hc3luY19maWZvID0gYXZfZmlmb19hbGxvYygoMSArIHEtPmFzeW5jX2RlcHRoKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihBVlBhY2tldCkgKyBzaXplb2YobWZ4U3luY1BvaW50KSArIHNpemVvZihtZnhCaXRzdHJlYW0qKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoQVZQYWNrZXQpICsgc2l6ZW9mKG1meFN5bmNQb2ludCopICsgc2l6ZW9mKG1meEJpdHN0cmVhbSopKSk7CiAgICAgaWYgKCFxLT5hc3luY19maWZvKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgaWYgKGF2Y3R4LT5od2FjY2VsX2NvbnRleHQpIHsKICAgICAgICAgQVZRU1ZDb250ZXh0ICpxc3YgPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OwogCi0gICAgICAgIHEtPnNlc3Npb24gICAgICAgICA9IHFzdi0+c2Vzc2lvbjsKLSAgICAgICAgcS0+cGFyYW0uSU9QYXR0ZXJuID0gcXN2LT5pb3BhdHRlcm47Ci0KKyAgICAgICAgaW9wYXR0ZXJuICAgID0gcXN2LT5pb3BhdHRlcm47CiAgICAgICAgIG9wYXF1ZV9hbGxvYyA9IHFzdi0+b3BhcXVlX2FsbG9jOwogICAgIH0KIAotICAgIGlmICghcS0+c2Vzc2lvbikgewotICAgICAgICByZXQgPSBmZl9xc3ZfaW5pdF9pbnRlcm5hbF9zZXNzaW9uKGF2Y3R4LCAmcS0+aW50ZXJuYWxfcXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+bG9hZF9wbHVnaW5zKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OworICAgIGlmIChhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAqZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgICAgIEFWUVNWRnJhbWVzQ29udGV4dCAqZnJhbWVzX2h3Y3R4ID0gZnJhbWVzX2N0eC0+aHdjdHg7CiAKLSAgICAgICAgcS0+c2Vzc2lvbiA9IHEtPmludGVybmFsX3FzLnNlc3Npb247CisgICAgICAgIGlmICghaW9wYXR0ZXJuKSB7CisgICAgICAgICAgICBpZiAoZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlICYgTUZYX01FTVRZUEVfT1BBUVVFX0ZSQU1FKQorICAgICAgICAgICAgICAgIGlvcGF0dGVybiA9IE1GWF9JT1BBVFRFUk5fSU5fT1BBUVVFX01FTU9SWTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGZyYW1lc19od2N0eC0+ZnJhbWVfdHlwZSAmCisgICAgICAgICAgICAgICAgICAgICAoTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX0RFQ09ERVJfVEFSR0VUIHwgTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX1BST0NFU1NPUl9UQVJHRVQpKQorICAgICAgICAgICAgICAgIGlvcGF0dGVybiA9IE1GWF9JT1BBVFRFUk5fSU5fVklERU9fTUVNT1JZOworICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0ID0gaW5pdF92aWRlb19wYXJhbShhdmN0eCwgcSk7CisgICAgaWYgKCFpb3BhdHRlcm4pCisgICAgICAgIGlvcGF0dGVybiA9IE1GWF9JT1BBVFRFUk5fSU5fU1lTVEVNX01FTU9SWTsKKyAgICBxLT5wYXJhbS5JT1BhdHRlcm4gPSBpb3BhdHRlcm47CisKKyAgICByZXQgPSBxc3ZlbmNfaW5pdF9zZXNzaW9uKGF2Y3R4LCBxKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIHJldCA9IE1GWFZpZGVvRU5DT0RFX1F1ZXJ5KHEtPnNlc3Npb24sICZxLT5wYXJhbSwmcS0+cGFyYW0pOwotICAgIGlmIChNRlhfV1JOX1BBUlRJQUxfQUNDRUxFUkFUSU9OPT1yZXQpIHsKKyAgICAvLyBpbiB0aGUgbWZ4SW5mb01GWCBzdHJ1Y3QsIEpQRUcgaXMgZGlmZmVyZW50IGZyb20gb3RoZXIgY29kZWNzCisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01KUEVHOgorICAgICAgICByZXQgPSBpbml0X3ZpZGVvX3BhcmFtX2pwZWcoYXZjdHgsIHEpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBpbml0X3ZpZGVvX3BhcmFtKGF2Y3R4LCBxKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gTUZYVmlkZW9FTkNPREVfUXVlcnkocS0+c2Vzc2lvbiwgJnEtPnBhcmFtLCAmcS0+cGFyYW0pOworICAgIGlmIChyZXQgPT0gTUZYX1dSTl9QQVJUSUFMX0FDQ0VMRVJBVElPTikgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRW5jb2RlciB3aWxsIHdvcmsgd2l0aCBwYXJ0aWFsIEhXIGFjY2VsZXJhdGlvblxuIik7CiAgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgJWQgcXVlcnlpbmcgZW5jb2RlciBwYXJhbXNcbiIsIHJldCk7Ci0gICAgICAgIHJldHVybiBmZl9xc3ZfZXJyb3IocmV0KTsKKyAgICAgICAgcmV0dXJuIGZmX3Fzdl9wcmludF9lcnJvcihhdmN0eCwgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBxdWVyeWluZyBlbmNvZGVyIHBhcmFtcyIpOwogICAgIH0KIAogICAgIHJldCA9IE1GWFZpZGVvRU5DT0RFX1F1ZXJ5SU9TdXJmKHEtPnNlc3Npb24sICZxLT5wYXJhbSwgJnEtPnJlcSk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBxdWVyeWluZyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVyc1xuIik7Ci0gICAgICAgIHJldHVybiBmZl9xc3ZfZXJyb3IocmV0KTsKLSAgICB9CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBmZl9xc3ZfcHJpbnRfZXJyb3IoYXZjdHgsIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcXVlcnlpbmcgKElPU3VyZikgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMiKTsKIAogICAgIGlmIChvcGFxdWVfYWxsb2MpIHsKICAgICAgICAgcmV0ID0gcXN2X2luaXRfb3BhcXVlX2FsbG9jKGF2Y3R4LCBxKTsKQEAgLTc1MiwxNCArOTUwLDIxIEBACiAgICAgfQogCiAgICAgcmV0ID0gTUZYVmlkZW9FTkNPREVfSW5pdChxLT5zZXNzaW9uLCAmcS0+cGFyYW0pOwotICAgIGlmIChNRlhfV1JOX1BBUlRJQUxfQUNDRUxFUkFUSU9OPT1yZXQpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkVuY29kZXIgd2lsbCB3b3JrIHdpdGggcGFydGlhbCBIVyBhY2NlbGVyYXRpb25cbiIpOwotICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyB0aGUgZW5jb2RlclxuIik7Ci0gICAgICAgIHJldHVybiBmZl9xc3ZfZXJyb3IocmV0KTsKLSAgICB9CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBmZl9xc3ZfcHJpbnRfZXJyb3IoYXZjdHgsIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW5pdGlhbGl6aW5nIHRoZSBlbmNvZGVyIik7CisgICAgZWxzZSBpZiAocmV0ID4gMCkKKyAgICAgICAgZmZfcXN2X3ByaW50X3dhcm5pbmcoYXZjdHgsIHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgaW4gZW5jb2RlciBpbml0aWFsaXphdGlvbiIpOwogCi0gICAgcmV0ID0gcXN2X3JldHJpZXZlX2VuY19wYXJhbXMoYXZjdHgsIHEpOworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9NSlBFRzoKKyAgICAgICAgcmV0ID0gcXN2X3JldHJpZXZlX2VuY19qcGVnX3BhcmFtcyhhdmN0eCwgcSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IHFzdl9yZXRyaWV2ZV9lbmNfcGFyYW1zKGF2Y3R4LCBxKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcmV0cmlldmluZyBlbmNvZGluZyBwYXJhbWV0ZXJzLlxuIik7CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC03NzUsOSArOTgwLDcgQEAKICAgICBpZiAoZW5jX2N0cmwpIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbmNfY3RybC0+TnVtUGF5bG9hZCAmJiBpIDwgUVNWX01BWF9FTkNfUEFZTE9BRDsgaSsrKSB7Ci0gICAgICAgICAgICBtZnhQYXlsb2FkKiBwYXkgPSBlbmNfY3RybC0+UGF5bG9hZFtpXTsKLSAgICAgICAgICAgIGF2X2ZyZWUoZW5jX2N0cmwtPlBheWxvYWRbaV0tPkRhdGEpOwotICAgICAgICAgICAgYXZfZnJlZShwYXkpOworICAgICAgICAgICAgYXZfZnJlZShlbmNfY3RybC0+UGF5bG9hZFtpXSk7CiAgICAgICAgIH0KICAgICAgICAgZW5jX2N0cmwtPk51bVBheWxvYWQgPSAwOwogICAgIH0KQEAgLTc4NywxMCArOTkwLDEwIEBACiB7CiAgICAgUVNWRnJhbWUgKmN1ciA9IHEtPndvcmtfZnJhbWVzOwogICAgIHdoaWxlIChjdXIpIHsKLSAgICAgICAgaWYgKGN1ci0+c3VyZmFjZSAmJiAhY3VyLT5zdXJmYWNlLT5EYXRhLkxvY2tlZCkgewotICAgICAgICAgICAgY3VyLT5zdXJmYWNlID0gTlVMTDsKKyAgICAgICAgaWYgKGN1ci0+dXNlZCAmJiAhY3VyLT5zdXJmYWNlLkRhdGEuTG9ja2VkKSB7CiAgICAgICAgICAgICBmcmVlX2VuY29kZXJfY3RybF9wYXlsb2FkcygmY3VyLT5lbmNfY3RybCk7CiAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihjdXItPmZyYW1lKTsKKyAgICAgICAgICAgIGN1ci0+dXNlZCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgY3VyID0gY3VyLT5uZXh0OwogICAgIH0KQEAgLTgwNSw4ICsxMDA4LDkgQEAKICAgICBmcmFtZSA9IHEtPndvcmtfZnJhbWVzOwogICAgIGxhc3QgID0gJnEtPndvcmtfZnJhbWVzOwogICAgIHdoaWxlIChmcmFtZSkgewotICAgICAgICBpZiAoIWZyYW1lLT5zdXJmYWNlKSB7CisgICAgICAgIGlmICghZnJhbWUtPnVzZWQpIHsKICAgICAgICAgICAgICpmID0gZnJhbWU7CisgICAgICAgICAgICBmcmFtZS0+dXNlZCA9IDE7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogCkBAIC04MzAsNiArMTAzNCw3IEBACiAgICAgKmxhc3QgPSBmcmFtZTsKIAogICAgICpmID0gZnJhbWU7CisgICAgZnJhbWUtPnVzZWQgPSAxOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC04NDksMTEgKzEwNTQsMTggQEAKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgIHFmLT5zdXJmYWNlID0gKG1meEZyYW1lU3VyZmFjZTEqKXFmLT5mcmFtZS0+ZGF0YVszXTsKKyAgICAgICAgcWYtPnN1cmZhY2UgPSAqKG1meEZyYW1lU3VyZmFjZTEqKXFmLT5mcmFtZS0+ZGF0YVszXTsKKworICAgICAgICBpZiAocS0+ZnJhbWVzX2N0eC5taWRzKSB7CisgICAgICAgICAgICByZXQgPSBmZl9xc3ZfZmluZF9zdXJmYWNlX2lkeCgmcS0+ZnJhbWVzX2N0eCwgcWYpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgcWYtPnN1cmZhY2UuRGF0YS5NZW1JZCA9ICZxLT5mcmFtZXNfY3R4Lm1pZHNbcmV0XTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIG1ha2UgYSBjb3B5IGlmIHRoZSBpbnB1dCBpcyBub3QgcGFkZGVkIGFzIGxpYm1meCByZXF1aXJlcyAqLwotICAgICAgICBpZiAoICAgICBmcmFtZS0+aGVpZ2h0ICYgKHEtPmhlaWdodF9hbGlnbiAtIDEpIHx8Ci0gICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0gJiAocS0+d2lkdGhfYWxpZ24gLSAxKSkgeworICAgICAgICBpZiAoZnJhbWUtPmhlaWdodCAmIDMxIHx8IGZyYW1lLT5saW5lc2l6ZVswXSAmIChxLT53aWR0aF9hbGlnbiAtIDEpKSB7CiAgICAgICAgICAgICBxZi0+ZnJhbWUtPmhlaWdodCA9IEZGQUxJR04oZnJhbWUtPmhlaWdodCwgcS0+aGVpZ2h0X2FsaWduKTsKICAgICAgICAgICAgIHFmLT5mcmFtZS0+d2lkdGggID0gRkZBTElHTihmcmFtZS0+d2lkdGgsIHEtPndpZHRoX2FsaWduKTsKIApAQCAtODc0LDI3ICsxMDg2LDI1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCi0gICAgICAgIHFmLT5zdXJmYWNlX2ludGVybmFsLkluZm8gPSBxLT5wYXJhbS5tZnguRnJhbWVJbmZvOworICAgICAgICBxZi0+c3VyZmFjZS5JbmZvID0gcS0+cGFyYW0ubWZ4LkZyYW1lSW5mbzsKIAotICAgICAgICBxZi0+c3VyZmFjZV9pbnRlcm5hbC5JbmZvLlBpY1N0cnVjdCA9CisgICAgICAgIHFmLT5zdXJmYWNlLkluZm8uUGljU3RydWN0ID0KICAgICAgICAgICAgICFmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA/IE1GWF9QSUNTVFJVQ1RfUFJPR1JFU1NJVkUgOgogICAgICAgICAgICAgZnJhbWUtPnRvcF9maWVsZF9maXJzdCAgID8gTUZYX1BJQ1NUUlVDVF9GSUVMRF9URkYgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZYX1BJQ1NUUlVDVF9GSUVMRF9CRkY7CiAgICAgICAgIGlmIChmcmFtZS0+cmVwZWF0X3BpY3QgPT0gMSkKLSAgICAgICAgICAgIHFmLT5zdXJmYWNlX2ludGVybmFsLkluZm8uUGljU3RydWN0IHw9IE1GWF9QSUNTVFJVQ1RfRklFTERfUkVQRUFURUQ7CisgICAgICAgICAgICBxZi0+c3VyZmFjZS5JbmZvLlBpY1N0cnVjdCB8PSBNRlhfUElDU1RSVUNUX0ZJRUxEX1JFUEVBVEVEOwogICAgICAgICBlbHNlIGlmIChmcmFtZS0+cmVwZWF0X3BpY3QgPT0gMikKLSAgICAgICAgICAgIHFmLT5zdXJmYWNlX2ludGVybmFsLkluZm8uUGljU3RydWN0IHw9IE1GWF9QSUNTVFJVQ1RfRlJBTUVfRE9VQkxJTkc7CisgICAgICAgICAgICBxZi0+c3VyZmFjZS5JbmZvLlBpY1N0cnVjdCB8PSBNRlhfUElDU1RSVUNUX0ZSQU1FX0RPVUJMSU5HOwogICAgICAgICBlbHNlIGlmIChmcmFtZS0+cmVwZWF0X3BpY3QgPT0gNCkKLSAgICAgICAgICAgIHFmLT5zdXJmYWNlX2ludGVybmFsLkluZm8uUGljU3RydWN0IHw9IE1GWF9QSUNTVFJVQ1RfRlJBTUVfVFJJUExJTkc7CisgICAgICAgICAgICBxZi0+c3VyZmFjZS5JbmZvLlBpY1N0cnVjdCB8PSBNRlhfUElDU1RSVUNUX0ZSQU1FX1RSSVBMSU5HOwogCi0gICAgICAgIHFmLT5zdXJmYWNlX2ludGVybmFsLkRhdGEuUGl0Y2hMb3cgID0gcWYtPmZyYW1lLT5saW5lc2l6ZVswXTsKLSAgICAgICAgcWYtPnN1cmZhY2VfaW50ZXJuYWwuRGF0YS5ZICAgICAgICAgPSBxZi0+ZnJhbWUtPmRhdGFbMF07Ci0gICAgICAgIHFmLT5zdXJmYWNlX2ludGVybmFsLkRhdGEuVVYgICAgICAgID0gcWYtPmZyYW1lLT5kYXRhWzFdOwotCi0gICAgICAgIHFmLT5zdXJmYWNlID0gJnFmLT5zdXJmYWNlX2ludGVybmFsOworICAgICAgICBxZi0+c3VyZmFjZS5EYXRhLlBpdGNoTG93ICA9IHFmLT5mcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIHFmLT5zdXJmYWNlLkRhdGEuWSAgICAgICAgID0gcWYtPmZyYW1lLT5kYXRhWzBdOworICAgICAgICBxZi0+c3VyZmFjZS5EYXRhLlVWICAgICAgICA9IHFmLT5mcmFtZS0+ZGF0YVsxXTsKICAgICB9CiAKLSAgICBxZi0+c3VyZmFjZS0+RGF0YS5UaW1lU3RhbXAgPSBhdl9yZXNjYWxlX3EoZnJhbWUtPnB0cywgcS0+YXZjdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsIDkwMDAwfSk7CisgICAgcWYtPnN1cmZhY2UuRGF0YS5UaW1lU3RhbXAgPSBhdl9yZXNjYWxlX3EoZnJhbWUtPnB0cywgcS0+YXZjdHgtPnRpbWVfYmFzZSwgKEFWUmF0aW9uYWwpezEsIDkwMDAwfSk7CiAKICAgICAqbmV3X2ZyYW1lID0gcWY7CiAKQEAgLTkyMCw3ICsxMTMwLDcgQEAKICAgICBtZnhCaXRzdHJlYW0gKmJzOwogCiAgICAgbWZ4RnJhbWVTdXJmYWNlMSAqc3VyZiA9IE5VTEw7Ci0gICAgbWZ4U3luY1BvaW50IHN5bmMgICAgICA9IE5VTEw7CisgICAgbWZ4U3luY1BvaW50ICpzeW5jICAgICA9IE5VTEw7CiAgICAgUVNWRnJhbWUgKnFzdl9mcmFtZSA9IE5VTEw7CiAgICAgbWZ4RW5jb2RlQ3RybCogZW5jX2N0cmwgPSBOVUxMOwogICAgIGludCByZXQ7CkBAIC05MzMsNyArMTE0Myw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHFzdl9mcmFtZSkgewotICAgICAgICBzdXJmID0gcXN2X2ZyYW1lLT5zdXJmYWNlOworICAgICAgICBzdXJmID0gJnFzdl9mcmFtZS0+c3VyZmFjZTsKICAgICAgICAgZW5jX2N0cmwgPSAmcXN2X2ZyYW1lLT5lbmNfY3RybDsKICAgICB9CiAKQEAgLTk1NSwzNiArMTE2NSwzOSBAQAogICAgICAgICBxLT5zZXRfZW5jb2RlX2N0cmxfY2IoYXZjdHgsIGZyYW1lLCAmcXN2X2ZyYW1lLT5lbmNfY3RybCk7CiAgICAgfQogCisgICAgc3luYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzeW5jKSk7CisgICAgaWYgKCFzeW5jKSB7CisgICAgICAgIGF2X2ZyZWVwKCZicyk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmbmV3X3BrdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCiAgICAgZG8gewotICAgICAgICByZXQgPSBNRlhWaWRlb0VOQ09ERV9FbmNvZGVGcmFtZUFzeW5jKHEtPnNlc3Npb24sIGVuY19jdHJsLCBzdXJmLCBicywgJnN5bmMpOwotICAgICAgICBpZiAocmV0ID09IE1GWF9XUk5fREVWSUNFX0JVU1kpIHsKKyAgICAgICAgcmV0ID0gTUZYVmlkZW9FTkNPREVfRW5jb2RlRnJhbWVBc3luYyhxLT5zZXNzaW9uLCBlbmNfY3RybCwgc3VyZiwgYnMsIHN5bmMpOworICAgICAgICBpZiAocmV0ID09IE1GWF9XUk5fREVWSUNFX0JVU1kpCiAgICAgICAgICAgICBhdl91c2xlZXAoNTAwKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0gd2hpbGUgKCAxICk7CisgICAgfSB3aGlsZSAocmV0ID09IE1GWF9XUk5fREVWSUNFX0JVU1kgfHwgcmV0ID09IE1GWF9XUk5fSU5fRVhFQ1VUSU9OKTsKKworICAgIGlmIChyZXQgPiAwKQorICAgICAgICBmZl9xc3ZfcHJpbnRfd2FybmluZyhhdmN0eCwgcmV0LCAiV2FybmluZyBkdXJpbmcgZW5jb2RpbmciKTsKIAogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGF2X3BhY2tldF91bnJlZigmbmV3X3BrdCk7CiAgICAgICAgIGF2X2ZyZWVwKCZicyk7Ci0gICAgICAgIGlmIChyZXQgPT0gTUZYX0VSUl9NT1JFX0RBVEEpCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFbmNvZGVGcmFtZUFzeW5jIHJldHVybmVkICVkXG4iLCByZXQpOwotICAgICAgICByZXR1cm4gZmZfcXN2X2Vycm9yKHJldCk7CisgICAgICAgIGF2X2ZyZWVwKCZzeW5jKTsKKyAgICAgICAgcmV0dXJuIChyZXQgPT0gTUZYX0VSUl9NT1JFX0RBVEEpID8KKyAgICAgICAgICAgICAgIDAgOiBmZl9xc3ZfcHJpbnRfZXJyb3IoYXZjdHgsIHJldCwgIkVycm9yIGR1cmluZyBlbmNvZGluZyIpOwogICAgIH0KIAotICAgIGlmIChyZXQgPT0gTUZYX1dSTl9JTkNPTVBBVElCTEVfVklERU9fUEFSQU0pIHsKLSAgICAgICAgaWYgKGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lKQotICAgICAgICAgICAgcHJpbnRfaW50ZXJsYWNlX21zZyhhdmN0eCwgcSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgIkVuY29kZUZyYW1lQXN5bmMgcmV0dXJuZWQgJ2luY29tcGF0aWJsZSBwYXJhbScgY29kZVxuIik7Ci0gICAgfQotICAgIGlmIChzeW5jKSB7CisgICAgaWYgKHJldCA9PSBNRlhfV1JOX0lOQ09NUEFUSUJMRV9WSURFT19QQVJBTSAmJiBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSkKKyAgICAgICAgcHJpbnRfaW50ZXJsYWNlX21zZyhhdmN0eCwgcSk7CisKKyAgICBpZiAoKnN5bmMpIHsKICAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHEtPmFzeW5jX2ZpZm8sICZuZXdfcGt0LCBzaXplb2YobmV3X3BrdCksIE5VTEwpOwogICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUocS0+YXN5bmNfZmlmbywgJnN5bmMsICAgIHNpemVvZihzeW5jKSwgICAgTlVMTCk7CiAgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShxLT5hc3luY19maWZvLCAmYnMsICAgICAgc2l6ZW9mKGJzKSwgICAgTlVMTCk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZnJlZXAoJnN5bmMpOwogICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJm5ld19wa3QpOwogICAgICAgICBhdl9mcmVlcCgmYnMpOwogICAgIH0KQEAgLTEwMDUsMTQgKzEyMTgsMTQgQEAKICAgICAgICAgKCFmcmFtZSAmJiBhdl9maWZvX3NpemUocS0+YXN5bmNfZmlmbykpKSB7CiAgICAgICAgIEFWUGFja2V0IG5ld19wa3Q7CiAgICAgICAgIG1meEJpdHN0cmVhbSAqYnM7Ci0gICAgICAgIG1meFN5bmNQb2ludCBzeW5jOworICAgICAgICBtZnhTeW5jUG9pbnQgKnN5bmM7CiAKICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocS0+YXN5bmNfZmlmbywgJm5ld19wa3QsIHNpemVvZihuZXdfcGt0KSwgTlVMTCk7CiAgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHEtPmFzeW5jX2ZpZm8sICZzeW5jLCAgICBzaXplb2Yoc3luYyksICAgIE5VTEwpOwogICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChxLT5hc3luY19maWZvLCAmYnMsICAgICAgc2l6ZW9mKGJzKSwgICAgICBOVUxMKTsKIAogICAgICAgICBkbyB7Ci0gICAgICAgICAgICByZXQgPSBNRlhWaWRlb0NPUkVfU3luY09wZXJhdGlvbihxLT5zZXNzaW9uLCBzeW5jLCAxMDAwKTsKKyAgICAgICAgICAgIHJldCA9IE1GWFZpZGVvQ09SRV9TeW5jT3BlcmF0aW9uKHEtPnNlc3Npb24sICpzeW5jLCAxMDAwKTsKICAgICAgICAgfSB3aGlsZSAocmV0ID09IE1GWF9XUk5fSU5fRVhFQ1VUSU9OKTsKIAogICAgICAgICBuZXdfcGt0LmR0cyAgPSBhdl9yZXNjYWxlX3EoYnMtPkRlY29kZVRpbWVTdGFtcCwgKEFWUmF0aW9uYWwpezEsIDkwMDAwfSwgYXZjdHgtPnRpbWVfYmFzZSk7CkBAIC0xMDM1LDYgKzEyNDgsNyBAQAogI2VuZGlmCiAKICAgICAgICAgYXZfZnJlZXAoJmJzKTsKKyAgICAgICAgYXZfZnJlZXAoJnN5bmMpOwogCiAgICAgICAgIGlmIChwa3QtPmRhdGEpIHsKICAgICAgICAgICAgIGlmIChwa3QtPnNpemUgPCBuZXdfcGt0LnNpemUpIHsKQEAgLTEwNjYsOSArMTI4MCwxMyBAQAogCiAgICAgaWYgKHEtPnNlc3Npb24pCiAgICAgICAgIE1GWFZpZGVvRU5DT0RFX0Nsb3NlKHEtPnNlc3Npb24pOwotICAgIHEtPnNlc3Npb24gPSBOVUxMOworICAgIGlmIChxLT5pbnRlcm5hbF9zZXNzaW9uKQorICAgICAgICBNRlhDbG9zZShxLT5pbnRlcm5hbF9zZXNzaW9uKTsKKyAgICBxLT5zZXNzaW9uICAgICAgICAgID0gTlVMTDsKKyAgICBxLT5pbnRlcm5hbF9zZXNzaW9uID0gTlVMTDsKIAotICAgIGZmX3Fzdl9jbG9zZV9pbnRlcm5hbF9zZXNzaW9uKCZxLT5pbnRlcm5hbF9xcyk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZxLT5mcmFtZXNfY3R4Lmh3X2ZyYW1lc19jdHgpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcS0+ZnJhbWVzX2N0eC5taWRzX2J1Zik7CiAKICAgICBjdXIgPSBxLT53b3JrX2ZyYW1lczsKICAgICB3aGlsZSAoY3VyKSB7CkBAIC0xMDgxLDEzICsxMjk5LDE0IEBACiAKICAgICB3aGlsZSAocS0+YXN5bmNfZmlmbyAmJiBhdl9maWZvX3NpemUocS0+YXN5bmNfZmlmbykpIHsKICAgICAgICAgQVZQYWNrZXQgcGt0OwotICAgICAgICBtZnhTeW5jUG9pbnQgc3luYzsKKyAgICAgICAgbWZ4U3luY1BvaW50ICpzeW5jOwogICAgICAgICBtZnhCaXRzdHJlYW0gKmJzOwogCiAgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHEtPmFzeW5jX2ZpZm8sICZwa3QsICBzaXplb2YocGt0KSwgIE5VTEwpOwogICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChxLT5hc3luY19maWZvLCAmc3luYywgc2l6ZW9mKHN5bmMpLCBOVUxMKTsKICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQocS0+YXN5bmNfZmlmbywgJmJzLCAgIHNpemVvZihicyksICAgTlVMTCk7CiAKKyAgICAgICAgYXZfZnJlZXAoJnN5bmMpOwogICAgICAgICBhdl9mcmVlcCgmYnMpOwogICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xc3ZlbmMuaCBiL2xpYmF2Y29kZWMvcXN2ZW5jLmgKaW5kZXggODA2ZGMwNi4uZDQ4MjcyMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9xc3ZlbmMuaAorKysgYi9saWJhdmNvZGVjL3FzdmVuYy5oCkBAIC00MiwxMCArNDIsMjkgQEAKICNkZWZpbmUgUVNWX0hBVkVfQlJFRl9UWVBFICAgICAgUVNWX1ZFUlNJT05fQVRMRUFTVCgxLCA4KQogCiAjZGVmaW5lIFFTVl9IQVZFX0xBICAgICBRU1ZfVkVSU0lPTl9BVExFQVNUKDEsIDcpCisjZGVmaW5lIFFTVl9IQVZFX0xBX0RTICBRU1ZfVkVSU0lPTl9BVExFQVNUKDEsIDgpCiAjZGVmaW5lIFFTVl9IQVZFX0xBX0hSRCBRU1ZfVkVSU0lPTl9BVExFQVNUKDEsIDExKQorCisjaWYgZGVmaW5lZChfV0lOMzIpCisjZGVmaW5lIFFTVl9IQVZFX0FWQlIgICBRU1ZfVkVSU0lPTl9BVExFQVNUKDEsIDMpCiAjZGVmaW5lIFFTVl9IQVZFX0lDUSAgICBRU1ZfVkVSU0lPTl9BVExFQVNUKDEsIDgpCiAjZGVmaW5lIFFTVl9IQVZFX1ZDTSAgICBRU1ZfVkVSU0lPTl9BVExFQVNUKDEsIDgpCiAjZGVmaW5lIFFTVl9IQVZFX1FWQlIgICBRU1ZfVkVSU0lPTl9BVExFQVNUKDEsIDExKQorI2RlZmluZSBRU1ZfSEFWRV9NRiAgICAgMAorI2Vsc2UKKyNkZWZpbmUgUVNWX0hBVkVfQVZCUiAgIDAKKyNkZWZpbmUgUVNWX0hBVkVfSUNRICAgIDAKKyNkZWZpbmUgUVNWX0hBVkVfVkNNICAgIDAKKyNkZWZpbmUgUVNWX0hBVkVfUVZCUiAgIDAKKyNkZWZpbmUgUVNWX0hBVkVfTUYgICAgIFFTVl9WRVJTSU9OX0FUTEVBU1QoMSwgMjUpCisjZW5kaWYKKworI2lmICFRU1ZfSEFWRV9MQV9EUworI2RlZmluZSBNRlhfTE9PS0FIRUFEX0RTX1VOS05PV04gMAorI2RlZmluZSBNRlhfTE9PS0FIRUFEX0RTX09GRiAwCisjZGVmaW5lIE1GWF9MT09LQUhFQURfRFNfMnggMAorI2RlZmluZSBNRlhfTE9PS0FIRUFEX0RTXzR4IDAKKyNlbmRpZgogCiAjZGVmaW5lIFFTVl9DT01NT05fT1BUUyBcCiB7ICJhc3luY19kZXB0aCIsICJNYXhpbXVtIHByb2Nlc3NpbmcgcGFyYWxsZWxpc20iLCBPRkZTRVQocXN2LmFzeW5jX2RlcHRoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBBU1lOQ19ERVBUSF9ERUZBVUxUIH0sIDAsIElOVF9NQVgsIFZFIH0sICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC03OCw3ICs5Nyw3IEBACiAgICAgUVNWRnJhbWUgKndvcmtfZnJhbWVzOwogCiAgICAgbWZ4U2Vzc2lvbiBzZXNzaW9uOwotICAgIFFTVlNlc3Npb24gaW50ZXJuYWxfcXM7CisgICAgbWZ4U2Vzc2lvbiBpbnRlcm5hbF9zZXNzaW9uOwogCiAgICAgaW50IHBhY2tldF9zaXplOwogICAgIGludCB3aWR0aF9hbGlnbjsKQEAgLTkxLDE4ICsxMTAsMjMgQEAKICNpZiBRU1ZfSEFWRV9DTzIKICAgICBtZnhFeHRDb2RpbmdPcHRpb24yIGV4dGNvMjsKICNlbmRpZgotCisjaWYgUVNWX0hBVkVfTUYKKyAgICBtZnhFeHRNdWx0aUZyYW1lUGFyYW0gICBleHRtZnA7CisgICAgbWZ4RXh0TXVsdGlGcmFtZUNvbnRyb2wgZXh0bWZjOworI2VuZGlmCiAgICAgbWZ4RXh0T3BhcXVlU3VyZmFjZUFsbG9jIG9wYXF1ZV9hbGxvYzsKICAgICBtZnhGcmFtZVN1cmZhY2UxICAgICAgICoqb3BhcXVlX3N1cmZhY2VzOwogICAgIEFWQnVmZmVyUmVmICAgICAgICAgICAgICpvcGFxdWVfYWxsb2NfYnVmOwogCi0gICAgbWZ4RXh0QnVmZmVyICAqZXh0cGFyYW1faW50ZXJuYWxbMiArIFFTVl9IQVZFX0NPMl07CisgICAgbWZ4RXh0QnVmZmVyICAqZXh0cGFyYW1faW50ZXJuYWxbMiArIFFTVl9IQVZFX0NPMiArIChRU1ZfSEFWRV9NRiAqIDIpXTsKICAgICBpbnQgICAgICAgICBuYl9leHRwYXJhbV9pbnRlcm5hbDsKIAogICAgIG1meEV4dEJ1ZmZlciAqKmV4dHBhcmFtOwogCiAgICAgQVZGaWZvQnVmZmVyICphc3luY19maWZvOwogCisgICAgUVNWRnJhbWVzQ29udGV4dCBmcmFtZXNfY3R4OworCiAgICAgLy8gb3B0aW9ucyBzZXQgYnkgdGhlIGNhbGxlcgogICAgIGludCBhc3luY19kZXB0aDsKICAgICBpbnQgaWRyX2ludGVydmFsOwpAQCAtMTE5LDYgKzE0Myw4IEBACiAgICAgaW50IG1heF9mcmFtZV9zaXplOwogICAgIGludCBtYXhfc2xpY2Vfc2l6ZTsKIAorICAgIGludCBhdWQ7CisKICAgICBpbnQgc2luZ2xlX3NlaV9uYWxfdW5pdDsKICAgICBpbnQgbWF4X2RlY19mcmFtZV9idWZmZXJpbmc7CiAgICAgaW50IHRyZWxsaXM7CkBAIC0xMjksNiArMTU1LDcgQEAKICAgICBpbnQgYWRhcHRpdmVfaTsKICAgICBpbnQgYWRhcHRpdmVfYjsKICAgICBpbnQgYl9zdHJhdGVneTsKKyAgICBpbnQgY2F2bGM7CiAKICAgICBpbnQgaW50X3JlZl90eXBlOwogICAgIGludCBpbnRfcmVmX2N5Y2xlX3NpemU7CkBAIC0xMzYsNiArMTYzLDEwIEBACiAgICAgaW50IHJlY292ZXJ5X3BvaW50X3NlaTsKIAogICAgIGludCBhNTNfY2M7CisKKyNpZiBRU1ZfSEFWRV9NRgorICAgIGludCBtZm1vZGU7CisjZW5kaWYKICAgICBjaGFyICpsb2FkX3BsdWdpbnM7CiAgICAgU2V0RW5jb2RlQ3RybENCICpzZXRfZW5jb2RlX2N0cmxfY2I7CiB9IFFTVkVuY0NvbnRleHQ7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3FzdmVuY19oMjY0LmMgYi9saWJhdmNvZGVjL3FzdmVuY19oMjY0LmMKaW5kZXggNjZlNWVlOC4uNzE4YmY5YyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9xc3ZlbmNfaDI2NC5jCisrKyBiL2xpYmF2Y29kZWMvcXN2ZW5jX2gyNjQuYwpAQCAtMjYsMTEgKzI2LDExIEBACiAKICNpbmNsdWRlIDxtZngvbWZ4dmlkZW8uaD4KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJoMjY0LmgiCiAjaW5jbHVkZSAicXN2LmgiCiAjaW5jbHVkZSAicXN2X2ludGVybmFsLmgiCiAjaW5jbHVkZSAicXN2ZW5jLmgiCkBAIC00Myw2MyArNDMsMzMgQEAKIHN0YXRpYyBpbnQgcXN2X2gyNjRfc2V0X2VuY29kZV9jdHJsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBtZnhFbmNvZGVDdHJsKiBlbmNfY3RybCkKIHsKLSAgICBBVkZyYW1lU2lkZURhdGEgKnNpZGVfZGF0YSA9IE5VTEw7CiAgICAgUVNWSDI2NEVuY0NvbnRleHQgKnFoMjY0ID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBRU1ZFbmNDb250ZXh0ICpxID0gJnFoMjY0LT5xc3Y7CiAKICAgICBpZiAocS0+YTUzX2NjICYmIGZyYW1lKSB7Ci0gICAgICAgIHNpZGVfZGF0YSA9IGF2X2ZyYW1lX2dldF9zaWRlX2RhdGEoZnJhbWUsIEFWX0ZSQU1FX0RBVEFfQTUzX0NDKTsKLSAgICAgICAgaWYgKHNpZGVfZGF0YSkgeworICAgICAgICBtZnhQYXlsb2FkKiBwYXlsb2FkOworICAgICAgICBtZnhVOCogc2VpX2RhdGE7CisgICAgICAgIHNpemVfdCBzZWlfc2l6ZTsKKyAgICAgICAgaW50IHJlczsKIAotICAgICAgICAgICAgaW50IHNlaV9wYXlsb2FkX3NpemUgPSAwOwotICAgICAgICAgICAgbWZ4VTgqIHNlaV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgIG1meFBheWxvYWQqIHBheWxvYWQgPSBOVUxMOworICAgICAgICByZXMgPSBmZl9hbGxvY19hNTNfc2VpKGZyYW1lLCBzaXplb2YobWZ4UGF5bG9hZCkgKyAyLCAodm9pZCoqKSZwYXlsb2FkLCAmc2VpX3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCB8fCAhcGF5bG9hZCkKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAKLSAgICAgICAgICAgIHNlaV9wYXlsb2FkX3NpemUgPSBzaWRlX2RhdGEtPnNpemUgKyAxMzsKKyAgICAgICAgc2VpX2RhdGEgPSAobWZ4VTgqKShwYXlsb2FkICsgMSk7CisgICAgICAgIC8vIFNFSSBoZWFkZXIKKyAgICAgICAgc2VpX2RhdGFbMF0gPSA0OworICAgICAgICBzZWlfZGF0YVsxXSA9IChtZnhVOClzZWlfc2l6ZTsgLy8gc2l6ZSBvZiBTRUkgZGF0YQorICAgICAgICAvLyBTRUkgZGF0YSBmaWxsZWQgaW4gYnkgZmZfYWxsb2NfYTUzX3NlaQogCi0gICAgICAgICAgICBzZWlfZGF0YSA9IGF2X21hbGxvY3ooc2VpX3BheWxvYWRfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAoIXNlaV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBtZW1vcnkgZm9yIENDLCBza2lwcGluZy4uLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgcGF5bG9hZC0+QnVmU2l6ZSA9IHNlaV9zaXplICsgMjsKKyAgICAgICAgcGF5bG9hZC0+TnVtQml0ID0gcGF5bG9hZC0+QnVmU2l6ZSAqIDg7CisgICAgICAgIHBheWxvYWQtPlR5cGUgPSA0OworICAgICAgICBwYXlsb2FkLT5EYXRhID0gc2VpX2RhdGE7CiAKLSAgICAgICAgICAgIC8vIFNFSSBoZWFkZXIKLSAgICAgICAgICAgIHNlaV9kYXRhWzBdID0gNDsKLSAgICAgICAgICAgIHNlaV9kYXRhWzFdID0gc2VpX3BheWxvYWRfc2l6ZSAtIDI7IC8vIHNpemUgb2YgU0VJIGRhdGEKLQotICAgICAgICAgICAgLy8gY291bnRyeSBjb2RlCi0gICAgICAgICAgICBzZWlfZGF0YVsyXSA9IDE4MTsKLSAgICAgICAgICAgIHNlaV9kYXRhWzNdID0gMDsKLSAgICAgICAgICAgIHNlaV9kYXRhWzRdID0gNDk7Ci0KLSAgICAgICAgICAgIC8vIEFUU0NfaWRlbnRpZmllciAtIHVzaW5nICdHQTk0JyBvbmx5Ci0gICAgICAgICAgICBBVl9XTDMyKHNlaV9kYXRhICsgNSwKLSAgICAgICAgICAgICAgICBNS1RBRygnRycsICdBJywgJzknLCAnNCcpKTsKLSAgICAgICAgICAgIHNlaV9kYXRhWzldID0gMzsKLSAgICAgICAgICAgIHNlaV9kYXRhWzEwXSA9Ci0gICAgICAgICAgICAgICAgKChzaWRlX2RhdGEtPnNpemUvMykgJiAweDFmKSB8IDB4QzA7Ci0KLSAgICAgICAgICAgIHNlaV9kYXRhWzExXSA9IDB4RkY7IC8vIHJlc2VydmVkCi0KLSAgICAgICAgICAgIG1lbWNweShzZWlfZGF0YSArIDEyLCBzaWRlX2RhdGEtPmRhdGEsIHNpZGVfZGF0YS0+c2l6ZSk7Ci0KLSAgICAgICAgICAgIHNlaV9kYXRhW3NpZGVfZGF0YS0+c2l6ZSsxMl0gPSAyNTU7Ci0KLSAgICAgICAgICAgIHBheWxvYWQgPSBhdl9tYWxsb2N6KHNpemVvZihtZnhQYXlsb2FkKSk7Ci0gICAgICAgICAgICBpZiAoIXBheWxvYWQpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIG1lbW9yeSwgc2tpcHBpbmcgY2FwdGlvbnNcbiIpOwotICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzZWlfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBheWxvYWQtPkJ1ZlNpemUgPSBzaWRlX2RhdGEtPnNpemUgKyAxMzsKLSAgICAgICAgICAgIHBheWxvYWQtPk51bUJpdCA9IHBheWxvYWQtPkJ1ZlNpemUgKiA4OwotICAgICAgICAgICAgcGF5bG9hZC0+VHlwZSA9IDQ7Ci0gICAgICAgICAgICBwYXlsb2FkLT5EYXRhID0gc2VpX2RhdGE7Ci0KLSAgICAgICAgICAgIGVuY19jdHJsLT5OdW1FeHRQYXJhbSA9IDA7Ci0gICAgICAgICAgICBlbmNfY3RybC0+TnVtUGF5bG9hZCA9IDE7Ci0gICAgICAgICAgICBlbmNfY3RybC0+UGF5bG9hZFswXSA9IHBheWxvYWQ7Ci0gICAgICAgIH0KKyAgICAgICAgZW5jX2N0cmwtPk51bUV4dFBhcmFtID0gMDsKKyAgICAgICAgZW5jX2N0cmwtPk51bVBheWxvYWQgPSAxOworICAgICAgICBlbmNfY3RybC0+UGF5bG9hZFswXSA9IHBheWxvYWQ7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMTMyLDIxICsxMDIsMjQgQEAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CiAgICAgUVNWX0NPTU1PTl9PUFRTCiAKKyAgICB7ICJjYXZsYyIsICAgICAgICAgICJFbmFibGUgQ0FWTEMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChxc3YuY2F2bGMpLCAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgICAwLCAgICAgICAgICAxLCBWRSB9LAogICAgIHsgImlkcl9pbnRlcnZhbCIsICJEaXN0YW5jZSAoaW4gSS1mcmFtZXMpIGJldHdlZW4gSURSIGZyYW1lcyIsIE9GRlNFVChxc3YuaWRyX2ludGVydmFsKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIFZFIH0sCiAgICAgeyAicGljX3RpbWluZ19zZWkiLCAgICAiSW5zZXJ0IHBpY3R1cmUgdGltaW5nIFNFSSB3aXRoIHBpY19zdHJ1Y3Rfc3ludGF4IGVsZW1lbnQiLCBPRkZTRVQocXN2LnBpY190aW1pbmdfc2VpKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIFZFIH0sCiAgICAgeyAic2luZ2xlX3NlaV9uYWxfdW5pdCIsICAgICJQdXQgYWxsIHRoZSBTRUkgbWVzc2FnZXMgaW50byBvbmUgTkFMVSIsICAgICAgICBPRkZTRVQocXN2LnNpbmdsZV9zZWlfbmFsX3VuaXQpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAtMSwgICAgICAgICAgMSwgVkUgfSwKICAgICB7ICJtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZyIsICJNYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgYnVmZmVyZWQgaW4gdGhlIERQQiIsIE9GRlNFVChxc3YubWF4X2RlY19mcmFtZV9idWZmZXJpbmcpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgICAwLCBVSU5UMTZfTUFYLCBWRSB9LAogCiAjaWYgUVNWX0hBVkVfTEEKLSAgICB7ICJsb29rX2FoZWFkIiwgICAgICAgIlVzZSBWQlIgYWxnb3JpdGhtIHdpdGggbG9vayBhaGVhZCIsICAgIE9GRlNFVChxc3YubG9va19haGVhZCksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBWRSB9LAorICAgIHsgImxvb2tfYWhlYWQiLCAgICAgICAiVXNlIFZCUiBhbGdvcml0aG0gd2l0aCBsb29rIGFoZWFkIiwgICAgT0ZGU0VUKHFzdi5sb29rX2FoZWFkKSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCiAgICAgeyAibG9va19haGVhZF9kZXB0aCIsICJEZXB0aCBvZiBsb29rIGFoZWFkIGluIG51bWJlciBmcmFtZXMiLCBPRkZTRVQocXN2Lmxvb2tfYWhlYWRfZGVwdGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMTAwLCBWRSB9LAogI2VuZGlmCi0KLSNpZiBRU1ZfVkVSU0lPTl9BVExFQVNUKDEsOCkKLSAgICB7ICJsb29rX2FoZWFkX2Rvd25zYW1wbGluZyIsIE5VTEwsIE9GRlNFVChxc3YubG9va19haGVhZF9kb3duc2FtcGxpbmcpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IE1GWF9MT09LQUhFQURfRFNfVU5LTk9XTiB9LCBNRlhfTE9PS0FIRUFEX0RTX1VOS05PV04sIE1GWF9MT09LQUhFQURfRFNfMngsIFZFLCAibG9va19haGVhZF9kb3duc2FtcGxpbmciIH0sCisjaWYgUVNWX0hBVkVfTEFfRFMKKyAgICB7ICJsb29rX2FoZWFkX2Rvd25zYW1wbGluZyIsICJEb3duc2NhbGluZyBmYWN0b3IgZm9yIHRoZSBmcmFtZXMgc2F2ZWQgZm9yIHRoZSBsb29rYWhlYWQgYW5hbHlzaXMiLCBPRkZTRVQocXN2Lmxvb2tfYWhlYWRfZG93bnNhbXBsaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBNRlhfTE9PS0FIRUFEX0RTX1VOS05PV04gfSwgTUZYX0xPT0tBSEVBRF9EU19VTktOT1dOLCBNRlhfTE9PS0FIRUFEX0RTXzJ4LCBWRSwgImxvb2tfYWhlYWRfZG93bnNhbXBsaW5nIiB9LAogICAgIHsgInVua25vd24iICAgICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE1GWF9MT09LQUhFQURfRFNfVU5LTk9XTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCAgICAgVkUsICJsb29rX2FoZWFkX2Rvd25zYW1wbGluZyIgfSwKKyAgICB7ICJhdXRvIiAgICAgICAgICAgICAgICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBNRlhfTE9PS0FIRUFEX0RTX1VOS05PV04gfSwgSU5UX01JTiwgSU5UX01BWCwgICAgIFZFLCAibG9va19haGVhZF9kb3duc2FtcGxpbmciIH0sCiAgICAgeyAib2ZmIiAgICAgICAgICAgICAgICAgICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTUZYX0xPT0tBSEVBRF9EU19PRkYgICAgIH0sIElOVF9NSU4sIElOVF9NQVgsICAgICBWRSwgImxvb2tfYWhlYWRfZG93bnNhbXBsaW5nIiB9LAogICAgIHsgIjJ4IiAgICAgICAgICAgICAgICAgICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE1GWF9MT09LQUhFQURfRFNfMnggICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCAgICAgVkUsICJsb29rX2FoZWFkX2Rvd25zYW1wbGluZyIgfSwKKyAgICB7ICI0eCIgICAgICAgICAgICAgICAgICAgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBNRlhfTE9PS0FIRUFEX0RTXzR4ICAgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgICAgIFZFLCAibG9va19haGVhZF9kb3duc2FtcGxpbmciIH0sCiAjZW5kaWYKIAogICAgIHsgImludF9yZWZfdHlwZSIsICJJbnRyYSByZWZyZXNoIHR5cGUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHFzdi5pbnRfcmVmX3R5cGUpLCAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgLTEsIFVJTlQxNl9NQVgsIFZFLCAiaW50X3JlZl90eXBlIiB9LApAQCAtMTY4LDcgKzE0MSwxNCBAQAogICAgIHsgIm1haW4iICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE1GWF9QUk9GSUxFX0FWQ19NQUlOICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCAgICAgVkUsICJwcm9maWxlIiB9LAogICAgIHsgImhpZ2giICAgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE1GWF9QUk9GSUxFX0FWQ19ISUdIICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCAgICAgVkUsICJwcm9maWxlIiB9LAogCi0gICAgeyAiYTUzY2MiICwgIlVzZSBBNTMgQ2xvc2VkIENhcHRpb25zIChpZiBhdmFpbGFibGUpIiwgT0ZGU0VUKHFzdi5hNTNfY2MpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIFZFfSwKKyAgICB7ICJhNTNjYyIgLCAiVXNlIEE1MyBDbG9zZWQgQ2FwdGlvbnMgKGlmIGF2YWlsYWJsZSkiLCBPRkZTRVQocXN2LmE1M19jYyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMCwgMSwgVkV9LAorCisgICAgeyAiYXVkIiwgIkluc2VydCB0aGUgQWNjZXNzIFVuaXQgRGVsaW1pdGVyIE5BTCIsIE9GRlNFVChxc3YuYXVkKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFfSwKKworI2lmIFFTVl9IQVZFX01GCisgICAgeyAibWZtb2RlIiwgIk11bHRpLUZyYW1lIE1vZGUiLCBPRkZTRVQocXN2Lm1mbW9kZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gTUZYX01GX0FVVE8gfSwgMCwgSU5UX01BWCwgVkUgfSwKKyNlbmRpZgorCiAgICAgeyBOVUxMIH0sCiB9OwogCkBAIC0xODUsNyArMTY1LDkgQEAKICAgICAvLyBzYW1lIGFzIHRoZSB4MjY0IGRlZmF1bHQKICAgICB7ICJnIiwgICAgICAgICAiMjUwIiAgIH0sCiAgICAgeyAiYmYiLCAgICAgICAgIjMiICAgICB9LAotICAgIHsgImNvZGVyIiwgICAgICJhYyIgICAgfSwKKyNpZiBGRl9BUElfQ09ERVJfVFlQRQorICAgIHsgImNvZGVyIiwgICAgICItMSIgICAgfSwKKyNlbmRpZgogCiAgICAgeyAiZmxhZ3MiLCAgICAgIitjZ29wIiB9LAogI2lmIEZGX0FQSV9QUklWQVRFX09QVApAQCAtMjAzLDExICsxODUsMTMgQEAKICAgICAuaW5pdCAgICAgICAgICAgPSBxc3ZfZW5jX2luaXQsCiAgICAgLmVuY29kZTIgICAgICAgID0gcXN2X2VuY19mcmFtZSwKICAgICAuY2xvc2UgICAgICAgICAgPSBxc3ZfZW5jX2Nsb3NlLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSFlCUklELAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfTlYxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1AwMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9RU1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzLAogICAgIC5kZWZhdWx0cyAgICAgICA9IHFzdl9lbmNfZGVmYXVsdHMsCiAgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAicXN2IiwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3FzdmVuY19oZXZjLmMgYi9saWJhdmNvZGVjL3FzdmVuY19oZXZjLmMKaW5kZXggMzBmZGU3Mi4uNDMzOWIzMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9xc3ZlbmNfaGV2Yy5jCisrKyBiL2xpYmF2Y29kZWMvcXN2ZW5jX2hldmMuYwpAQCAtMzEsNiArMzEsOCBAQAogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImhldmMuaCIKKyNpbmNsdWRlICJoZXZjZGVjLmgiCisjaW5jbHVkZSAiaDI2NDVfcGFyc2UuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInFzdi5oIgogI2luY2x1ZGUgInFzdl9pbnRlcm5hbC5oIgpAQCAtNTQsNyArNTYsOCBAQAogICAgIFB1dEJ5dGVDb250ZXh0IHBiYzsKIAogICAgIEdldEJpdENvbnRleHQgZ2I7Ci0gICAgSEVWQ05BTCBzcHNfbmFsID0geyBOVUxMIH07CisgICAgSDI2NDVSQlNQIHNwc19yYnNwID0geyBOVUxMIH07CisgICAgSDI2NDVOQUwgc3BzX25hbCA9IHsgTlVMTCB9OwogICAgIEhFVkNTUFMgc3BzID0geyAwIH07CiAgICAgSEVWQ1ZQUyB2cHMgPSB7IDAgfTsKICAgICB1aW50OF90IHZwc19idWZbMTI4XSwgdnBzX3Jic3BfYnVmWzEyOF07CkBAIC02Nyw4ICs3MCwxMiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOwogICAgIH0KIAorICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmc3BzX3Jic3AucmJzcF9idWZmZXIsICZzcHNfcmJzcC5yYnNwX2J1ZmZlcl9hbGxvY19zaXplLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgIGlmICghc3BzX3Jic3AucmJzcF9idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKICAgICAvKiBwYXJzZSB0aGUgU1BTICovCi0gICAgcmV0ID0gZmZfaGV2Y19leHRyYWN0X3Jic3AoTlVMTCwgYXZjdHgtPmV4dHJhZGF0YSArIDQsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIDQsICZzcHNfbmFsKTsKKyAgICByZXQgPSBmZl9oMjY0NV9leHRyYWN0X3Jic3AoYXZjdHgtPmV4dHJhZGF0YSArIDQsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIDQsICZzcHNfcmJzcCwgJnNwc19uYWwsIDEpOwogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgdW5lc2NhcGluZyB0aGUgU1BTIGJ1ZmZlclxuIik7CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC03NiwyMiArODMsMjIgQEAKIAogICAgIHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgc3BzX25hbC5kYXRhLCBzcHNfbmFsLnNpemUpOwogICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZzcHNfbmFsLnJic3BfYnVmZmVyKTsKKyAgICAgICAgYXZfZnJlZXAoJnNwc19yYnNwLnJic3BfYnVmZmVyKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBnZXRfYml0cygmZ2IsIDEpOwogICAgIHR5cGUgPSBnZXRfYml0cygmZ2IsIDYpOwotICAgIGlmICh0eXBlICE9IE5BTF9TUFMpIHsKKyAgICBpZiAodHlwZSAhPSBIRVZDX05BTF9TUFMpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmV4cGVjdGVkIE5BTCB0eXBlIGluIHRoZSBleHRyYWRhdGE6ICVkXG4iLAogICAgICAgICAgICAgICAgdHlwZSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzcHNfbmFsLnJic3BfYnVmZmVyKTsKKyAgICAgICAgYXZfZnJlZXAoJnNwc19yYnNwLnJic3BfYnVmZmVyKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogICAgIGdldF9iaXRzKCZnYiwgOSk7CiAKICAgICByZXQgPSBmZl9oZXZjX3BhcnNlX3Nwcygmc3BzLCAmZ2IsICZzcHNfaWQsIDAsIE5VTEwsIGF2Y3R4KTsKLSAgICBhdl9mcmVlcCgmc3BzX25hbC5yYnNwX2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnNwc19yYnNwLnJic3BfYnVmZmVyKTsKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgdGhlIFNQU1xuIik7CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC0xMDIsNyArMTA5LDcgQEAKICAgICB2cHMudnBzX21heF9zdWJfbGF5ZXJzID0gc3BzLm1heF9zdWJfbGF5ZXJzOwogICAgIG1lbWNweSgmdnBzLnB0bCwgJnNwcy5wdGwsIHNpemVvZih2cHMucHRsKSk7CiAgICAgdnBzLnZwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWcgPSAxOwotICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfU1VCX0xBWUVSUzsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEhFVkNfTUFYX1NVQl9MQVlFUlM7IGkrKykgewogICAgICAgICB2cHMudnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ1tpXSA9IHNwcy50ZW1wb3JhbF9sYXllcltpXS5tYXhfZGVjX3BpY19idWZmZXJpbmc7CiAgICAgICAgIHZwcy52cHNfbnVtX3Jlb3JkZXJfcGljc1tpXSAgICAgID0gc3BzLnRlbXBvcmFsX2xheWVyW2ldLm51bV9yZW9yZGVyX3BpY3M7CiAgICAgICAgIHZwcy52cHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VbaV0gID0gc3BzLnRlbXBvcmFsX2xheWVyW2ldLm1heF9sYXRlbmN5X2luY3JlYXNlOwpAQCAtMTI2LDkgKzEzMyw5IEBACiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCB2cHNfcmJzcF9idWYsIHJldCk7CiAgICAgYnl0ZXN0cmVhbTJfaW5pdF93cml0ZXIoJnBiYywgdnBzX2J1Ziwgc2l6ZW9mKHZwc19idWYpKTsKIAotICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTMyKCZwYmMsIDEpOyAgICAgICAgICAgICAgLy8gc3RhcnRjb2RlCi0gICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgTkFMX1ZQUyA8PCAxKTsgICAvLyBOQUwKLSAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCAxKTsgICAgICAgICAgICAgIC8vIGhlYWRlcgorICAgIGJ5dGVzdHJlYW0yX3B1dF9iZTMyKCZwYmMsIDEpOyAgICAgICAgICAgICAgICAgLy8gc3RhcnRjb2RlCisgICAgYnl0ZXN0cmVhbTJfcHV0X2J5dGUoJnBiYywgSEVWQ19OQUxfVlBTIDw8IDEpOyAvLyBOQUwKKyAgICBieXRlc3RyZWFtMl9wdXRfYnl0ZSgmcGJjLCAxKTsgICAgICAgICAgICAgICAgIC8vIGhlYWRlcgogCiAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYmMpKSB7CiAgICAgICAgIHVpbnQzMl90IGIgPSBieXRlc3RyZWFtMl9wZWVrX2JlMjQoJmdiYyk7CkBAIC0xNTksOCArMTY2LDggQEAKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKHEtPmxvYWRfcGx1Z2luICE9IExPQURfUExVR0lOX05PTkUpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnVpZF9oZXZjZW5jX3N3ID0gIjJmY2E5OTc0OWZkYjQ5YWViMTIxYTViNjNlZjU2OGY3IjsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnVpZF9oZXZjZW5jX2h3ID0gIjZmYWRjNzkxYTBjMmViNDc5YWI2ZGNkNWVhOWRhMzQ3IjsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB1aWRfaGV2Y2VuY19zdyA9ICIyZmNhOTk3NDlmZGI0OWFlYjEyMWE1YjYzZWY1NjhmNyI7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdWlkX2hldmNlbmNfaHcgPSAiNmZhZGM3OTFhMGMyZWI0NzlhYjZkY2Q1ZWE5ZGEzNDciOwogCiAgICAgICAgIGlmIChxLT5xc3YubG9hZF9wbHVnaW5zWzBdKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLApAQCAtMTc5LDYgKzE4Niw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBIRVZDIGFuZCBIMjY0IG1lYW5pbmcgb2YgdGhlIHZhbHVlIGlzIHNoaWZ0ZWQgYnkgMSwgbWFrZSBpdCBjb25zaXN0ZW50CisgICAgcS0+cXN2Lmlkcl9pbnRlcnZhbCsrOworCiAgICAgcmV0ID0gZmZfcXN2X2VuY19pbml0KGF2Y3R4LCAmcS0+cXN2KTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTIwNywxMiArMjE3LDIwIEBACiAgICAgcmV0dXJuIGZmX3Fzdl9lbmNfY2xvc2UoYXZjdHgsICZxLT5xc3YpOwogfQogCisjaWYgZGVmaW5lZChfV0lOMzIpCisjZGVmaW5lIExPQURfUExVR0lOX0RFRkFVTFQgTE9BRF9QTFVHSU5fSEVWQ19TVworI2Vsc2UKKyNkZWZpbmUgTE9BRF9QTFVHSU5fREVGQVVMVCBMT0FEX1BMVUdJTl9IRVZDX0hXCisjZW5kaWYKKwogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUVNWSEVWQ0VuY0NvbnRleHQsIHgpCiAjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CiAgICAgUVNWX0NPTU1PTl9PUFRTCiAKLSAgICB7ICJsb2FkX3BsdWdpbiIsICJBIHVzZXIgcGx1Z2luIHRvIGxvYWQgaW4gYW4gaW50ZXJuYWwgc2Vzc2lvbiIsIE9GRlNFVChsb2FkX3BsdWdpbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gTE9BRF9QTFVHSU5fSEVWQ19TVyB9LCBMT0FEX1BMVUdJTl9OT05FLCBMT0FEX1BMVUdJTl9IRVZDX0hXLCBWRSwgImxvYWRfcGx1Z2luIiB9LAorICAgIHsgImlkcl9pbnRlcnZhbCIsICJEaXN0YW5jZSAoaW4gSS1mcmFtZXMpIGJldHdlZW4gSURSIGZyYW1lcyIsIE9GRlNFVChxc3YuaWRyX2ludGVydmFsKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIC0xLCBJTlRfTUFYLCBWRSwgImlkcl9pbnRlcnZhbCIgfSwKKyAgICB7ICJiZWdpbl9vbmx5IiwgIk91dHB1dCBhbiBJRFItZnJhbWUgb25seSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gLTEgfSwgMCwgMCwgVkUsICJpZHJfaW50ZXJ2YWwiIH0sCisgICAgeyAibG9hZF9wbHVnaW4iLCAiQSB1c2VyIHBsdWdpbiB0byBsb2FkIGluIGFuIGludGVybmFsIHNlc3Npb24iLCBPRkZTRVQobG9hZF9wbHVnaW4pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IExPQURfUExVR0lOX0RFRkFVTFQgfSwgTE9BRF9QTFVHSU5fTk9ORSwgTE9BRF9QTFVHSU5fSEVWQ19IVywgVkUsICJsb2FkX3BsdWdpbiIgfSwKICAgICB7ICJub25lIiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBMT0FEX1BMVUdJTl9OT05FIH0sICAgIDAsIDAsIFZFLCAibG9hZF9wbHVnaW4iIH0sCiAgICAgeyAiaGV2Y19zdyIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTE9BRF9QTFVHSU5fSEVWQ19TVyB9LCAwLCAwLCBWRSwgImxvYWRfcGx1Z2luIiB9LAogICAgIHsgImhldmNfaHciLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IExPQURfUExVR0lOX0hFVkNfSFcgfSwgMCwgMCwgVkUsICJsb2FkX3BsdWdpbiIgfSwKQEAgLTI1OSwxMSArMjc3LDEzIEBACiAgICAgLmluaXQgICAgICAgICAgID0gcXN2X2VuY19pbml0LAogICAgIC5lbmNvZGUyICAgICAgICA9IHFzdl9lbmNfZnJhbWUsCiAgICAgLmNsb3NlICAgICAgICAgID0gcXN2X2VuY19jbG9zZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVksCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0hZQlJJRCwKICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX05WMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9QMDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUVNWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSB9LAogICAgIC5wcml2X2NsYXNzICAgICA9ICZjbGFzcywKICAgICAuZGVmYXVsdHMgICAgICAgPSBxc3ZfZW5jX2RlZmF1bHRzLAogICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX0NMRUFOVVAsCisgICAgLndyYXBwZXJfbmFtZSAgID0gInFzdiIsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9xc3ZlbmNfanBlZy5jIGIvbGliYXZjb2RlYy9xc3ZlbmNfanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGZlOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3FzdmVuY19qcGVnLmMKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIEludGVsIE1lZGlhU0RLIFFTViBiYXNlZCBNSlBFRyBlbmNvZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWZ4L21meHZpZGVvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgInFzdi5oIgorI2luY2x1ZGUgInFzdl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInFzdmVuYy5oIgorCit0eXBlZGVmIHN0cnVjdCBRU1ZNSlBFR0VuY0NvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIFFTVkVuY0NvbnRleHQgcXN2OworfSBRU1ZNSlBFR0VuY0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBxc3ZfZW5jX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFFTVk1KUEVHRW5jQ29udGV4dCAqcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICByZXR1cm4gZmZfcXN2X2VuY19pbml0KGF2Y3R4LCAmcS0+cXN2KTsKK30KKworc3RhdGljIGludCBxc3ZfZW5jX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIFFTVk1KUEVHRW5jQ29udGV4dCAqcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICByZXR1cm4gZmZfcXN2X2VuY29kZShhdmN0eCwgJnEtPnFzdiwgcGt0LCBmcmFtZSwgZ290X3BhY2tldCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBxc3ZfZW5jX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBRU1ZNSlBFR0VuY0NvbnRleHQgKnEgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcmV0dXJuIGZmX3Fzdl9lbmNfY2xvc2UoYXZjdHgsICZxLT5xc3YpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihRU1ZNSlBFR0VuY0NvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBjbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJtanBlZ19xc3YgZW5jb2RlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX21qcGVnX3Fzdl9lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtanBlZ19xc3YiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNSlBFRyAoSW50ZWwgUXVpY2sgU3luYyBWaWRlbyBhY2NlbGVyYXRpb24pIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFFTVk1KUEVHRW5jQ29udGV4dCksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01KUEVHLAorICAgIC5pbml0ICAgICAgICAgICA9IHFzdl9lbmNfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgPSBxc3ZfZW5jX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICA9IHFzdl9lbmNfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0hZQlJJRCwKKyAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX05WMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9RU1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FIH0sCisgICAgLnByaXZfY2xhc3MgICAgID0gJmNsYXNzLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJxc3YiLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcXN2ZW5jX21wZWcyLmMgYi9saWJhdmNvZGVjL3FzdmVuY19tcGVnMi5jCmluZGV4IDViNTgzZmIuLmE3NDI3ZDggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcXN2ZW5jX21wZWcyLmMKKysrIGIvbGliYXZjb2RlYy9xc3ZlbmNfbXBlZzIuYwpAQCAtMTA0LDExICsxMDQsMTIgQEAKICAgICAuaW5pdCAgICAgICAgICAgPSBxc3ZfZW5jX2luaXQsCiAgICAgLmVuY29kZTIgICAgICAgID0gcXN2X2VuY19mcmFtZSwKICAgICAuY2xvc2UgICAgICAgICAgPSBxc3ZfZW5jX2Nsb3NlLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9ERUxBWSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSFlCUklELAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfTlYxMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1FTViwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUgfSwKICAgICAucHJpdl9jbGFzcyAgICAgPSAmY2xhc3MsCiAgICAgLmRlZmF1bHRzICAgICAgID0gcXN2X2VuY19kZWZhdWx0cywKICAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC53cmFwcGVyX25hbWUgICA9ICJxc3YiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcXRybGUuYyBiL2xpYmF2Y29kZWMvcXRybGUuYwppbmRleCAzZjQ4MmY0Li5jZDgzMDFkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3F0cmxlLmMKKysrIGIvbGliYXZjb2RlYy9xdHJsZS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFF1aWNrdGltZSBBbmltYXRpb24gKFJMRSkgVmlkZW8gRGVjb2RlcgotICogQ29weXJpZ2h0IChjKSAyMDA0IFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDA0IFRoZSBGRm1wZWcgcHJvamVjdAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0xNTUsNiArMTU1LDggQEAKICAgICAgICAgQ0hFQ0tfUElYRUxfUFRSKDApOwogCiAgICAgICAgIHdoaWxlICgocmxlX2NvZGUgPSAoaW50OF90KWJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+ZykgPCAxKQorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIGlmIChybGVfY29kZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLyogdGhlcmUncyBhbm90aGVyIHNraXAgY29kZSBpbiB0aGUgc3RyZWFtICovCiAgICAgICAgICAgICAgICAgcGl4ZWxfcHRyICs9IChudW1fcGl4ZWxzICogKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZzLT5nKSAtIDEpKTsKQEAgLTIxMCw2ICsyMTIsOCBAQAogICAgICAgICBDSEVDS19QSVhFTF9QVFIoMCk7CiAKICAgICAgICAgd2hpbGUgKChybGVfY29kZSA9IChpbnQ4X3QpYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpKSAhPSAtMSkgeworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nKSA8IDEpCisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgaWYgKHJsZV9jb2RlID09IDApIHsKICAgICAgICAgICAgICAgICAvKiB0aGVyZSdzIGFub3RoZXIgc2tpcCBjb2RlIGluIHRoZSBzdHJlYW0gKi8KICAgICAgICAgICAgICAgICBwaXhlbF9wdHIgKz0gKDQgKiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpIC0gMSkpOwpAQCAtMjU5LDYgKzI2Myw4IEBACiAgICAgICAgIENIRUNLX1BJWEVMX1BUUigwKTsKIAogICAgICAgICB3aGlsZSAoKHJsZV9jb2RlID0gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykpICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgMSkKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBpZiAocmxlX2NvZGUgPT0gMCkgewogICAgICAgICAgICAgICAgIC8qIHRoZXJlJ3MgYW5vdGhlciBza2lwIGNvZGUgaW4gdGhlIHN0cmVhbSAqLwogICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpIC0gMSkgKiAyOwpAQCAtMzAzLDYgKzMwOSw4IEBACiAgICAgICAgIENIRUNLX1BJWEVMX1BUUigwKTsKIAogICAgICAgICB3aGlsZSAoKHJsZV9jb2RlID0gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykpICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgMSkKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBpZiAocmxlX2NvZGUgPT0gMCkgewogICAgICAgICAgICAgICAgIC8qIHRoZXJlJ3MgYW5vdGhlciBza2lwIGNvZGUgaW4gdGhlIHN0cmVhbSAqLwogICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpIC0gMSkgKiAzOwpAQCAtMzUwLDYgKzM1OCw4IEBACiAgICAgICAgIENIRUNLX1BJWEVMX1BUUigwKTsKIAogICAgICAgICB3aGlsZSAoKHJsZV9jb2RlID0gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+ZykpICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmcpIDwgMSkKKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBpZiAocmxlX2NvZGUgPT0gMCkgewogICAgICAgICAgICAgICAgIC8qIHRoZXJlJ3MgYW5vdGhlciBza2lwIGNvZGUgaW4gdGhlIHN0cmVhbSAqLwogICAgICAgICAgICAgICAgIHBpeGVsX3B0ciArPSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJnMtPmcpIC0gMSkgKiA0OwpAQCAtNTA2LDExICs1MTYsMTQgQEAKICAgICB9CiAKICAgICBpZihoYXNfcGFsZXR0ZSkgewotICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgTlVMTCk7CisgICAgICAgIGludCBzaXplOworICAgICAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgJnNpemUpOwogCi0gICAgICAgIGlmIChwYWwpIHsKKyAgICAgICAgaWYgKHBhbCAmJiBzaXplID09IEFWUEFMRVRURV9TSVpFKSB7CiAgICAgICAgICAgICBzLT5mcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CiAgICAgICAgICAgICBtZW1jcHkocy0+cGFsLCBwYWwsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYWwpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFsZXR0ZSBzaXplICVkIGlzIHdyb25nXG4iLCBzaXplKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIG1ha2UgdGhlIHBhbGV0dGUgYXZhaWxhYmxlIG9uIHRoZSB3YXkgb3V0ICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3F0cmxlZW5jLmMgYi9saWJhdmNvZGVjL3F0cmxlZW5jLmMKaW5kZXggYTRlZDg1YS4uY2RkODY0YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9xdHJsZWVuYy5jCisrKyBiL2xpYmF2Y29kZWMvcXRybGVlbmMuYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgaW50IGk7CiAgICAgc2lnbmVkIGNoYXIgcmxlY29kZTsKIAotICAgIC8qIFRoaXMgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIHBpeGVscyBlcXVhbCB0byB0aGUgcHJlaXZvdXMgZnJhbWUgb25lJ3MKKyAgICAvKiBUaGlzIHdpbGwgYmUgdGhlIG51bWJlciBvZiBwaXhlbHMgZXF1YWwgdG8gdGhlIHByZXZpb3VzIGZyYW1lIG9uZSdzCiAgICAgICogc3RhcnRpbmcgZnJvbSB0aGUgaXRoIHBpeGVsICovCiAgICAgdW5zaWduZWQgaW50IHNraXBjb3VudDsKICAgICAvKiBUaGlzIHdpbGwgYmUgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBlcXVhbCBwaXhlbHMgaW4gdGhlIGN1cnJlbnQKQEAgLTI2NCw3ICsyNjQsNyBAQAogICAgICAgICBwcmV2X2xpbmUgLT0gcy0+cGl4ZWxfc2l6ZTsKICAgICB9CiAKLSAgICAvKiBHb29kICEgTm93IHdlIGhhdmUgdGhlIGJlc3Qgc2VxdWVuY2UgZm9yIHRoaXMgbGluZSwgbGV0J3Mgb3V0cHV0IGl0ICovCisgICAgLyogR29vZCEgTm93IHdlIGhhdmUgdGhlIGJlc3Qgc2VxdWVuY2UgZm9yIHRoaXMgbGluZSwgbGV0J3Mgb3V0cHV0IGl0LiAqLwogCiAgICAgLyogV2UgZG8gYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSBmaXJzdCBwaXhlbCBzbyB0aGF0IHdlIGF2b2lkIHRlc3RpbmcgaXQgaW4KICAgICAgKiB0aGUgd2hvbGUgbG9vcCAqLwpAQCAtMzYzLDcgKzM2Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpwaWN0LCBpbnQgKmdvdF9wYWNrZXQpCiB7CiAgICAgUXRybGVFbmNDb250ZXh0ICogY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgZW51bSBBVlBpY3R1cmVUeXBlIHBpY3RfdHlwZTsKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKChyZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIHMtPm1heF9idWZfc2l6ZSwgMCkpIDwgMCkKQEAgLTM3MSwxMSArMzcwLDkgQEAKIAogICAgIGlmIChhdmN0eC0+Z29wX3NpemUgPT0gMCB8fCAocy0+YXZjdHgtPmZyYW1lX251bWJlciAlIGF2Y3R4LT5nb3Bfc2l6ZSkgPT0gMCkgewogICAgICAgICAvKiBJLUZyYW1lICovCi0gICAgICAgIHBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOwogICAgICAgICBzLT5rZXlfZnJhbWUgPSAxOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIFAtRnJhbWUgKi8KLSAgICAgICAgcGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CiAgICAgICAgIHMtPmtleV9mcmFtZSA9IDA7CiAgICAgfQogCkBAIC0zOTIsNyArMzg5LDcgQEAKICNpZiBGRl9BUElfQ09ERURfRlJBTUUKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IHMtPmtleV9mcmFtZTsKLSAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IHBpY3RfdHlwZTsKKyAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IHMtPmtleV9mcmFtZSA/IEFWX1BJQ1RVUkVfVFlQRV9JIDogQVZfUElDVFVSRV9UWVBFX1A7CiBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3IyMTBkZWMuYyBiL2xpYmF2Y29kZWMvcjIxMGRlYy5jCmluZGV4IDljODY4Y2QuLmRiYzk0YzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcjIxMGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvcjIxMGRlYy5jCkBAIC0xMDQsNiArMTA0LDcgQEAKICAgICAuaW5pdCAgICAgICAgICAgPSBkZWNvZGVfaW5pdCwKICAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKICNlbmRpZgogI2lmIENPTkZJR19SMTBLX0RFQ09ERVIKQEAgLTExNSw2ICsxMTYsNyBAQAogICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAogICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwogI2VuZGlmCiAjaWYgQ09ORklHX0FWUlBfREVDT0RFUgpAQCAtMTI2LDUgKzEyOCw2IEBACiAgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCiAgICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcjIxMGVuYy5jIGIvbGliYXZjb2RlYy9yMjEwZW5jLmMKaW5kZXggNjViM2MwNi4uYTU1ZTU0MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9yMjEwZW5jLmMKKysrIGIvbGliYXZjb2RlYy9yMjEwZW5jLmMKQEAgLTI0LDYgKzI0LDE4IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAKK3N0YXRpYyBhdl9jb2xkIGludCBlbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IGFsaWduZWRfd2lkdGggPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1IxMEsgPyAxIDogNjQpOworCisgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDMyOworICAgIGlmIChhdmN0eC0+d2lkdGggPiAwKQorICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSBmZl9ndWVzc19jb2RlZF9iaXRyYXRlKGF2Y3R4KSAqIGFsaWduZWRfd2lkdGggLyBhdmN0eC0+d2lkdGg7CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBlbmNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcGljLCBpbnQgKmdvdF9wYWNrZXQpCiB7CkBAIC03Myw2ICs4NSw3IEBACiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuY29tcHJlc3NlZCBSR0IgMTAtYml0IiksCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1IyMTAsCisgICAgLmluaXQgICAgICAgICAgID0gZW5jb2RlX2luaXQsCiAgICAgLmVuY29kZTIgICAgICAgID0gZW5jb2RlX2ZyYW1lLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeyBBVl9QSVhfRk1UX1JHQjQ4LCBBVl9QSVhfRk1UX05PTkUgfSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfSU5UUkFfT05MWSwKQEAgLTg0LDYgKzk3LDcgQEAKICAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQUpBIEtvbmEgMTAtYml0IFJHQiBDb2RlYyIpLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SMTBLLAorICAgIC5pbml0ICAgICAgICAgICA9IGVuY29kZV9pbml0LAogICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9SR0I0OCwgQVZfUElYX0ZNVF9OT05FIH0sCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0lOVFJBX09OTFksCkBAIC05NSw2ICsxMDksNyBAQAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBdmlkIDE6MSAxMC1iaXQgUkdCIFBhY2tlciIpLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BVlJQLAorICAgIC5pbml0ICAgICAgICAgICA9IGVuY29kZV9pbml0LAogICAgIC5lbmNvZGUyICAgICAgICA9IGVuY29kZV9mcmFtZSwKICAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsgQVZfUElYX0ZNVF9SR0I0OCwgQVZfUElYX0ZNVF9OT05FIH0sCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0lOVFJBX09OTFksCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3JhMTQ0LmMgYi9saWJhdmNvZGVjL3JhMTQ0LmMKaW5kZXggNjk2YTQ5ZS4uNjVhNzQ0OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9yYTE0NC5jCisrKyBiL2xpYmF2Y29kZWMvcmExNDQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBSZWFsIEF1ZGlvIDEuMCAoMTQuNEspCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTE1MTIsMTEgKzE1MTIsMTEgQEAKIAogICAgIHZbMF0gPSAwOwogICAgIGZvciAoaT0hc2tpcF9maXJzdDsgaTwzOyBpKyspCi0gICAgICAgIHZbaV0gPSAoZmZfZ2Fpbl92YWxfdGFiW25dW2ldICogbVtpXSkgPj4gZmZfZ2Fpbl9leHBfdGFiW25dOworICAgICAgICB2W2ldID0gKGZmX2dhaW5fdmFsX3RhYltuXVtpXSAqICh1bnNpZ25lZCltW2ldKSA+PiBmZl9nYWluX2V4cF90YWJbbl07CiAKICAgICBpZiAodlswXSkgewogICAgICAgICBmb3IgKGk9MDsgaSA8IEJMT0NLU0laRTsgaSsrKQotICAgICAgICAgICAgZGVzdFtpXSA9IChzMVtpXSp2WzBdICsgczJbaV0qdlsxXSArIHMzW2ldKnZbMl0pID4+IDEyOworICAgICAgICAgICAgZGVzdFtpXSA9IChpbnQpKChzMVtpXSoodW5zaWduZWQpdlswXSkgKyBzMltpXSp2WzFdICsgczNbaV0qdlsyXSkgPj4gMTI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZm9yIChpPTA7IGkgPCBCTE9DS1NJWkU7IGkrKykKICAgICAgICAgICAgIGRlc3RbaV0gPSAoICAgICAgICAgICAgIHMyW2ldKnZbMV0gKyBzM1tpXSp2WzJdKSA+PiAxMjsKQEAgLTE1NjksMTEgKzE1NjksMTEgQEAKICAgICAgICAgYiA9IDB4MTAwMDAwMCAvIGI7CiAgICAgICAgIGZvciAoaj0wOyBqIDw9IGk7IGorKykgewogI2lmIENPTkZJR19GVFJBUFYKLSAgICAgICAgICAgIGludCBhID0gYnAyW2pdIC0gKChyZWZsW2krMV0gKiBicDJbaS1qXSkgPj4gMTIpOworICAgICAgICAgICAgaW50IGEgPSBicDJbal0gLSAoKGludCkocmVmbFtpKzFdICogKHVuc2lnbmVkKWJwMltpLWpdKSA+PiAxMik7CiAgICAgICAgICAgICBpZigoaW50KShhKih1bnNpZ25lZCliKSAhPSBhKihpbnQ2NF90KWIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAjZW5kaWYKLSAgICAgICAgICAgIGJwMVtqXSA9ICgoYnAyW2pdIC0gKChyZWZsW2krMV0gKiBicDJbaS1qXSkgPj4gMTIpKSAqIGIpID4+IDEyOworICAgICAgICAgICAgYnAxW2pdID0gKGludCkoKGJwMltqXSAtICgoaW50KShyZWZsW2krMV0gKiAodW5zaWduZWQpYnAyW2ktal0pID4+IDEyKSkgKiAodW5zaWduZWQpYikgPj4gMTI7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKHVuc2lnbmVkKSBicDFbaV0gKyAweDEwMDAgPiAweDFmZmYpCkBAIC0xNTk4LDEwICsxNTk4LDEwIEBACiAgICAgaW50IGksIGo7CiAKICAgICBmb3IgKGk9MDsgaSA8IExQQ19PUkRFUjsgaSsrKSB7Ci0gICAgICAgIGIxW2ldID0gcmVmbFtpXSA8PCA0OworICAgICAgICBiMVtpXSA9IHJlZmxbaV0gKiAxNjsKIAogICAgICAgICBmb3IgKGo9MDsgaiA8IGk7IGorKykKLSAgICAgICAgICAgIGIxW2pdID0gKChyZWZsW2ldICogYjJbaS1qLTFdKSA+PiAxMikgKyBiMltqXTsKKyAgICAgICAgICAgIGIxW2pdID0gKChpbnQpKHJlZmxbaV0gKiAodW5zaWduZWQpYjJbaS1qLTFdKSA+PiAxMikgKyBiMltqXTsKIAogICAgICAgICBGRlNXQVAoaW50ICosIGIxLCBiMik7CiAgICAgfQpAQCAtMTcwMSw3ICsxNzAxLDcgQEAKICAgICBpZiAoY2JhX2lkeCkgewogICAgICAgICBjYmFfaWR4ICs9IEJMT0NLU0laRS8yIC0gMTsKICAgICAgICAgZmZfY29weV9hbmRfZHVwKHJhY3R4LT5idWZmZXJfYSwgcmFjdHgtPmFkYXB0X2NiLCBjYmFfaWR4KTsKLSAgICAgICAgbVswXSA9IChmZl9pcm1zKCZyYWN0eC0+YWRzcCwgcmFjdHgtPmJ1ZmZlcl9hKSAqIGd2YWwpID4+IDEyOworICAgICAgICBtWzBdID0gKGZmX2lybXMoJnJhY3R4LT5hZHNwLCByYWN0eC0+YnVmZmVyX2EpICogKHVuc2lnbmVkKWd2YWwpID4+IDEyOwogICAgIH0gZWxzZSB7CiAgICAgICAgIG1bMF0gPSAwOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmExNDQuaCBiL2xpYmF2Y29kZWMvcmExNDQuaAppbmRleCBkZjc0NzkwLi4xOWE0Y2UwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JhMTQ0LmgKKysrIGIvbGliYXZjb2RlYy9yYTE0NC5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFJlYWwgQXVkaW8gMS4wICgxNC40SykKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yYTE0NGRlYy5jIGIvbGliYXZjb2RlYy9yYTE0NGRlYy5jCmluZGV4IDNlZWQxN2MuLmM3MTZjMzIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmExNDRkZWMuYworKysgYi9saWJhdmNvZGVjL3JhMTQ0ZGVjLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgICAgICBkb19vdXRwdXRfc3ViYmxvY2socmFjdHgsIGJsb2NrX2NvZWZzW2ldLCByZWZsX3Jtc1tpXSwgJmdiKTsKIAogICAgICAgICBmb3IgKGo9MDsgaiA8IEJMT0NLU0laRTsgaisrKQotICAgICAgICAgICAgKnNhbXBsZXMrKyA9IGF2X2NsaXBfaW50MTYocmFjdHgtPmN1cnJfc2Jsb2NrW2ogKyAxMF0gPDwgMik7CisgICAgICAgICAgICAqc2FtcGxlcysrID0gYXZfY2xpcF9pbnQxNihyYWN0eC0+Y3Vycl9zYmxvY2tbaiArIDEwXSAqICgxIDw8IDIpKTsKICAgICB9CiAKICAgICByYWN0eC0+b2xkX2VuZXJneSA9IGVuZXJneTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmExNDRlbmMuYyBiL2xpYmF2Y29kZWMvcmExNDRlbmMuYwppbmRleCAzMjc1NWQyLi5jYzRmMzgxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JhMTQ0ZW5jLmMKKysrIGIvbGliYXZjb2RlYy9yYTE0NGVuYy5jCkBAIC0xMjgsNyArMTI4LDcgQEAKIAogLyoqCiAgKiBDYWxjdWxhdGUgbWF0Y2ggc2NvcmUgYW5kIGdhaW4gb2YgYW4gTFBDLWZpbHRlcmVkIHZlY3RvciB3aXRoIHJlc3BlY3QgdG8KLSAqIGlucHV0IGRhdGEsIHBvc3NpYmx5IG90aG9nb25hbGl6aW5nIGl0IHRvIHVwIHRvIDIgb3RoZXIgdmVjdG9ycworICogaW5wdXQgZGF0YSwgcG9zc2libHkgb3J0aG9nb25hbGl6aW5nIGl0IHRvIHVwIHRvIHR3byBvdGhlciB2ZWN0b3JzLgogICoKICAqIEBwYXJhbSB3b3JrIGFycmF5IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBmaWx0ZXJlZCB2ZWN0b3IKICAqIEBwYXJhbSBjb2VmcyBjb2VmZmljaWVudHMgb2YgdGhlIExQQyBmaWx0ZXIKQEAgLTIyOSw4ICsyMjksOCBAQAogCiAvKioKICAqIEZpbmQgdGhlIGJlc3QgdmVjdG9yIG9mIGEgZml4ZWQgY29kZWJvb2sgYnkgYXBwbHlpbmcgYW4gTFBDIGZpbHRlciB0bwotICogY29kZWJvb2sgZW50cmllcywgcG9zc2libHkgb3Rob2dvbmFsaXppbmcgdGhlbSB0byB1cCB0byAyIG90aGVyIHZlY3RvcnMgYW5kCi0gKiBtYXRjaGluZyB0aGUgcmVzdWx0cyB3aXRoIGlucHV0IGRhdGEKKyAqIGNvZGVib29rIGVudHJpZXMsIHBvc3NpYmx5IG9ydGhvZ29uYWxpemluZyB0aGVtIHRvIHVwIHRvIHR3byBvdGhlciB2ZWN0b3JzCisgKiBhbmQgbWF0Y2hpbmcgdGhlIHJlc3VsdHMgd2l0aCBpbnB1dCBkYXRhLgogICoKICAqIEBwYXJhbSB3b3JrIGFycmF5IHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBmaWx0ZXJlZCB2ZWN0b3JzCiAgKiBAcGFyYW0gY29lZnMgY29lZmZpY2llbnRzIG9mIHRoZSBMUEMgZmlsdGVyCkBAIC00NzUsNyArNDc1LDcgQEAKIAogICAgIGZmX2xwY19jYWxjX2NvZWZzKCZyYWN0eC0+bHBjX2N0eCwgbHBjX2RhdGEsIE5CTE9DS1MgKiBCTE9DS1NJWkUsIExQQ19PUkRFUiwKICAgICAgICAgICAgICAgICAgICAgICBMUENfT1JERVIsIDE2LCBscGNfY29lZnMsIHNoaWZ0LCBGRl9MUENfVFlQRV9MRVZJTlNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAwLCBPUkRFUl9NRVRIT0RfRVNULCAxMiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgMCwgT1JERVJfTUVUSE9EX0VTVCwgMCwgMTIsIDApOwogICAgIGZvciAoaSA9IDA7IGkgPCBMUENfT1JERVI7IGkrKykKICAgICAgICAgYmxvY2tfY29lZnNbTkJMT0NLUyAtIDFdW2ldID0gLShscGNfY29lZnNbTFBDX09SREVSIC0gMV1baV0gPDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTIgLSBzaGlmdFtMUENfT1JERVIgLSAxXSkpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yYTI4OC5jIGIvbGliYXZjb2RlYy9yYTI4OC5jCmluZGV4IDhmNWE3ZjIuLmYxYjNjOGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmEyODguYworKysgYi9saWJhdmNvZGVjL3JhMjg4LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogUmVhbEF1ZGlvIDIuMCAoMjguOEspCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIyLDEzICsyMiwxNCBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwogI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKLSNpbmNsdWRlICJyYTI4OC5oIgotI2luY2x1ZGUgImxwYy5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJjZWxwX2ZpbHRlcnMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibHBjLmgiCisjaW5jbHVkZSAicmEyODguaCIKIAogI2RlZmluZSBNQVhfQkFDS1dBUkRfRklMVEVSX09SREVSICAzNgogI2RlZmluZSBNQVhfQkFDS1dBUkRfRklMVEVSX0xFTiAgICA0MApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yYTI4OC5oIGIvbGliYXZjb2RlYy9yYTI4OC5oCmluZGV4IGQzMGU0OWEuLmZhMGI1MjggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmEyODguaAorKysgYi9saWJhdmNvZGVjL3JhMjg4LmgKQEAgLTEsNiArMSw2IEBACiAvKgogICogUmVhbEF1ZGlvIDIuMCAoMjguOEspCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmFsZi5jIGIvbGliYXZjb2RlYy9yYWxmLmMKaW5kZXggOGNkOWY4OC4uM2Y3OTUzYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9yYWxmLmMKKysrIGIvbGliYXZjb2RlYy9yYWxmLmMKQEAgLTQ3OSw3ICs0NzksNyBAQAogICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBzcmMgKyAyLCB0YWJsZV9zaXplKTsKICAgICBjdHgtPm51bV9ibG9ja3MgPSAwOwogICAgIHdoaWxlIChnZXRfYml0c19sZWZ0KCZnYikgPiAwKSB7Ci0gICAgICAgIGN0eC0+YmxvY2tfc2l6ZVtjdHgtPm51bV9ibG9ja3NdID0gZ2V0X2JpdHMoJmdiLCAxNSk7CisgICAgICAgIGN0eC0+YmxvY2tfc2l6ZVtjdHgtPm51bV9ibG9ja3NdID0gZ2V0X2JpdHMoJmdiLCAxMyArIGF2Y3R4LT5jaGFubmVscyk7CiAgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkgewogICAgICAgICAgICAgY3R4LT5ibG9ja19wdHNbY3R4LT5udW1fYmxvY2tzXSA9IGdldF9iaXRzKCZnYiwgOSk7CiAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3JhbmdlY29kZXIuYyBiL2xpYmF2Y29kZWMvcmFuZ2Vjb2Rlci5jCmluZGV4IDIwMDIxN2EuLjBkNTNiZWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmFuZ2Vjb2Rlci5jCisrKyBiL2xpYmF2Y29kZWMvcmFuZ2Vjb2Rlci5jCkBAIC0yOCw3ICsyOCw2IEBACiAgKiAgICAgRy4gTi4gTi4gTWFydGluICAgICAgICAgICAgICAgICAgUHJlc2VudGVkIGluIE1hcmNoIDE5NzkgdG8gdGhlIFZpZGVvICYKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhIFJlY29yZGluZyBDb25mZXJlbmNlLAogICogICAgIElCTSBVSyBTY2llbnRpZmljIENlbnRlciAgICAgICAgIGhlbGQgaW4gU291dGhhbXB0b24gSnVseSAyNC0yNyAxOTc5LiIKLSAqCiAgKi8KIAogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNTcsOCArNTYsMTMgQEAKICAgICAvKiBjYXN0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcgKi8KICAgICBmZl9pbml0X3JhbmdlX2VuY29kZXIoYywgKHVpbnQ4X3QgKilidWYsIGJ1Zl9zaXplKTsKIAotICAgIGMtPmxvdyA9IEFWX1JCMTYoYy0+Ynl0ZXN0cmVhbSk7CisgICAgYy0+bG93ICAgICAgICAgPSBBVl9SQjE2KGMtPmJ5dGVzdHJlYW0pOwogICAgIGMtPmJ5dGVzdHJlYW0gKz0gMjsKKyAgICBjLT5vdmVycmVhZCAgICA9IDA7CisgICAgaWYgKGMtPmxvdyA+PSAweEZGMDApIHsKKyAgICAgICAgYy0+bG93ID0gMHhGRjAwOworICAgICAgICBjLT5ieXRlc3RyZWFtX2VuZCA9IGMtPmJ5dGVzdHJlYW07CisgICAgfQogfQogCiB2b2lkIGZmX2J1aWxkX3JhY19zdGF0ZXMoUmFuZ2VDb2RlciAqYywgaW50IGZhY3RvciwgaW50IG1heF9wKQpAQCAtMTE1LDQ4ICsxMTksMyBAQAogCiAgICAgcmV0dXJuIGMtPmJ5dGVzdHJlYW0gLSBjLT5ieXRlc3RyZWFtX3N0YXJ0OwogfQotCi0jaWZkZWYgVEVTVAotI2RlZmluZSBTSVpFIDEwMjQwCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgotCi1zdGF0aWMgdWludDhfdCBiWzkgKiBTSVpFXTsKLXN0YXRpYyB1aW50OF90IHJbOSAqIFNJWkVdOwotCi1pbnQgbWFpbih2b2lkKQotewotICAgIFJhbmdlQ29kZXIgYzsKLSAgICBpbnQgaTsKLSAgICB1aW50OF90IHN0YXRlWzEwXTsKLSAgICBBVkxGRyBwcm5nOwotCi0gICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOwotCi0gICAgZmZfaW5pdF9yYW5nZV9lbmNvZGVyKCZjLCBiLCBTSVpFKTsKLSAgICBmZl9idWlsZF9yYWNfc3RhdGVzKCZjLCAoMUxMIDw8IDMyKSAvIDIwLCAxMjggKyA2NCArIDMyICsgMTYpOwotCi0gICAgbWVtc2V0KHN0YXRlLCAxMjgsIHNpemVvZihzdGF0ZSkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKLSAgICAgICAgcltpXSA9IGF2X2xmZ19nZXQoJnBybmcpICUgNzsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpKyspCi0gICAgICAgIHB1dF9yYWMoJmMsIHN0YXRlLCByW2ldICYgMSk7Ci0KLSAgICBmZl9yYWNfdGVybWluYXRlKCZjKTsKLQotICAgIGZmX2luaXRfcmFuZ2VfZGVjb2RlcigmYywgYiwgU0laRSk7Ci0KLSAgICBtZW1zZXQoc3RhdGUsIDEyOCwgc2l6ZW9mKHN0YXRlKSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgU0laRTsgaSsrKQotICAgICAgICBpZiAoKHJbaV0gJiAxKSAhPSBnZXRfcmFjKCZjLCBzdGF0ZSkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJyYWMgZmFpbHVyZSBhdCAlZFxuIiwgaSk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yYW5nZWNvZGVyLmggYi9saWJhdmNvZGVjL3JhbmdlY29kZXIuaAppbmRleCBkMzZmYmQ3Li40NGFmODhiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JhbmdlY29kZXIuaAorKysgYi9saWJhdmNvZGVjL3JhbmdlY29kZXIuaApAQCAtNDIsNiArNDIsOCBAQAogICAgIHVpbnQ4X3QgKmJ5dGVzdHJlYW1fc3RhcnQ7CiAgICAgdWludDhfdCAqYnl0ZXN0cmVhbTsKICAgICB1aW50OF90ICpieXRlc3RyZWFtX2VuZDsKKyAgICBpbnQgb3ZlcnJlYWQ7CisjZGVmaW5lIE1BWF9PVkVSUkVBRCAyCiB9IFJhbmdlQ29kZXI7CiAKIHZvaWQgZmZfaW5pdF9yYW5nZV9lbmNvZGVyKFJhbmdlQ29kZXIgKmMsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKTsKQEAgLTEwNiw5ICsxMDgsMTEgQEAKICAgICBpZiAoYy0+cmFuZ2UgPCAweDEwMCkgewogICAgICAgICBjLT5yYW5nZSA8PD0gODsKICAgICAgICAgYy0+bG93ICAgPDw9IDg7Ci0gICAgICAgIGlmIChjLT5ieXRlc3RyZWFtIDwgYy0+Ynl0ZXN0cmVhbV9lbmQpCisgICAgICAgIGlmIChjLT5ieXRlc3RyZWFtIDwgYy0+Ynl0ZXN0cmVhbV9lbmQpIHsKICAgICAgICAgICAgIGMtPmxvdyArPSBjLT5ieXRlc3RyZWFtWzBdOwotICAgICAgICBjLT5ieXRlc3RyZWFtKys7CisgICAgICAgICAgICBjLT5ieXRlc3RyZWFtKys7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYy0+b3ZlcnJlYWQgKys7CiAgICAgfQogfQogCkBAIC0xMTcsNyArMTIxLDYgQEAKICAgICBpbnQgcmFuZ2UxID0gKGMtPnJhbmdlICogKCpzdGF0ZSkpID4+IDg7CiAKICAgICBjLT5yYW5nZSAtPSByYW5nZTE7Ci0jaWYgMQogICAgIGlmIChjLT5sb3cgPCBjLT5yYW5nZSkgewogICAgICAgICAqc3RhdGUgPSBjLT56ZXJvX3N0YXRlWypzdGF0ZV07CiAgICAgICAgIHJlZmlsbChjKTsKQEAgLTEyOSwxOSArMTMyLDYgQEAKICAgICAgICAgcmVmaWxsKGMpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0jZWxzZQotICAgIHsKLSAgICAgICAgaW50IG9uZV9tYXNrIG9uZV9tYXNrID0gKGMtPnJhbmdlIC0gYy0+bG93IC0gMSkgPj4gMzE7Ci0KLSAgICAgICAgYy0+bG93ICAgLT0gICAgICAgICAgIGMtPnJhbmdlICAmIG9uZV9tYXNrOwotICAgICAgICBjLT5yYW5nZSArPSAocmFuZ2UxIC0gYy0+cmFuZ2UpICYgb25lX21hc2s7Ci0KLSAgICAgICAgKnN0YXRlID0gYy0+emVyb19zdGF0ZVsoKnN0YXRlKSArICgyNTYgJiBvbmVfbWFzayldOwotICAgIH0KLSAgICByZWZpbGwoYyk7Ci0KLSAgICByZXR1cm4gb25lX21hc2sgJiAxOwotI2VuZGlmCiB9CiAKICNlbmRpZiAvKiBBVkNPREVDX1JBTkdFQ09ERVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yYXRlY29udHJvbC5jIGIvbGliYXZjb2RlYy9yYXRlY29udHJvbC5jCmluZGV4IDZjMmI0YWYuLjQ5ZDE2OWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmF0ZWNvbnRyb2wuYworKysgYi9saWJhdmNvZGVjL3JhdGVjb250cm9sLmMKQEAgLTM1LDEwICszNSw2IEBACiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKIAotc3RhdGljIGludCBpbml0X3Bhc3MyKE1wZWdFbmNDb250ZXh0ICpzKTsKLXN0YXRpYyBkb3VibGUgZ2V0X3FzY2FsZShNcGVnRW5jQ29udGV4dCAqcywgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByYXRlX2ZhY3RvciwgaW50IGZyYW1lX251bSk7Ci0KIHZvaWQgZmZfd3JpdGVfcGFzczFfc3RhdHMoTXBlZ0VuY0NvbnRleHQgKnMpCiB7CiAgICAgc25wcmludGYocy0+YXZjdHgtPnN0YXRzX291dCwgMjU2LApAQCAtODEsMzcyICs3Nyw2IEBACiAgICAgcmV0dXJuIHJjZS0+cXNjYWxlICogKGRvdWJsZSkocmNlLT5pX3RleF9iaXRzICsgcmNlLT5wX3RleF9iaXRzICsgMSkgLyBiaXRzOwogfQogCi1hdl9jb2xkIGludCBmZl9yYXRlX2NvbnRyb2xfaW5pdChNcGVnRW5jQ29udGV4dCAqcykKLXsKLSAgICBSYXRlQ29udHJvbENvbnRleHQgKnJjYyA9ICZzLT5yY19jb250ZXh0OwotICAgIGludCBpLCByZXM7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb25zdF9uYW1lc1tdID0gewotICAgICAgICAiUEkiLAotICAgICAgICAiRSIsCi0gICAgICAgICJpVGV4IiwKLSAgICAgICAgInBUZXgiLAotICAgICAgICAidGV4IiwKLSAgICAgICAgIm12IiwKLSAgICAgICAgImZDb2RlIiwKLSAgICAgICAgImlDb3VudCIsCi0gICAgICAgICJtY1ZhciIsCi0gICAgICAgICJ2YXIiLAotICAgICAgICAiaXNJIiwKLSAgICAgICAgImlzUCIsCi0gICAgICAgICJpc0IiLAotICAgICAgICAiYXZnUVAiLAotICAgICAgICAicUNvbXAiLAotI2lmIDAKLSAgICAgICAgImxhc3RJUVAiLAotICAgICAgICAibGFzdFBRUCIsCi0gICAgICAgICJsYXN0QlFQIiwKLSAgICAgICAgIm5leHROb25CUVAiLAotI2VuZGlmCi0gICAgICAgICJhdmdJSVRleCIsCi0gICAgICAgICJhdmdQSVRleCIsCi0gICAgICAgICJhdmdQUFRleCIsCi0gICAgICAgICJhdmdCUFRleCIsCi0gICAgICAgICJhdmdUZXgiLAotICAgICAgICBOVUxMCi0gICAgfTsKLSAgICBzdGF0aWMgZG91YmxlICgqIGNvbnN0IGZ1bmMxW10pKHZvaWQgKiwgZG91YmxlKSA9IHsKLSAgICAgICAgKHZvaWQgKiliaXRzMnFwLAotICAgICAgICAodm9pZCAqKXFwMmJpdHMsCi0gICAgICAgIE5VTEwKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZnVuYzFfbmFtZXNbXSA9IHsKLSAgICAgICAgImJpdHMycXAiLAotICAgICAgICAicXAyYml0cyIsCi0gICAgICAgIE5VTEwKLSAgICB9OwotICAgIGVtbXNfYygpOwotCi0gICAgaWYgKCFzLT5hdmN0eC0+cmNfbWF4X2F2YWlsYWJsZV92YnZfdXNlICYmIHMtPmF2Y3R4LT5yY19idWZmZXJfc2l6ZSkgewotICAgICAgICBpZiAocy0+YXZjdHgtPnJjX21heF9yYXRlKSB7Ci0gICAgICAgICAgICBzLT5hdmN0eC0+cmNfbWF4X2F2YWlsYWJsZV92YnZfdXNlID0gYXZfY2xpcGYocy0+YXZjdHgtPnJjX21heF9yYXRlLyhzLT5hdmN0eC0+cmNfYnVmZmVyX3NpemUqZ2V0X2ZwcyhzLT5hdmN0eCkpLCAxLjAvMywgMS4wKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBzLT5hdmN0eC0+cmNfbWF4X2F2YWlsYWJsZV92YnZfdXNlID0gMS4wOwotICAgIH0KLQotICAgIHJlcyA9IGF2X2V4cHJfcGFyc2UoJnJjYy0+cmNfZXFfZXZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJjX2VxID8gcy0+cmNfZXEgOiAidGV4XnFDb21wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X25hbWVzLCBmdW5jMV9uYW1lcywgZnVuYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCAwLCBzLT5hdmN0eCk7Ci0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIHJjX2VxIFwiJXNcIlxuIiwgcy0+cmNfZXEpOwotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0KLQotI2lmIEZGX0FQSV9SQ19TVFJBVEVHWQotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGlmICghcy0+cmNfc3RyYXRlZ3kpCi0gICAgICAgIHMtPnJjX3N0cmF0ZWd5ID0gcy0+YXZjdHgtPnJjX3N0cmF0ZWd5OwotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYKLQotICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgcmNjLT5wcmVkW2ldLmNvZWZmID0gRkZfUVAyTEFNQkRBICogNy4wOwotICAgICAgICByY2MtPnByZWRbaV0uY291bnQgPSAxLjA7Ci0gICAgICAgIHJjYy0+cHJlZFtpXS5kZWNheSA9IDAuNDsKLQotICAgICAgICByY2MtPmlfY3BseF9zdW0gW2ldID0KLSAgICAgICAgcmNjLT5wX2NwbHhfc3VtIFtpXSA9Ci0gICAgICAgIHJjYy0+bXZfYml0c19zdW1baV0gPQotICAgICAgICByY2MtPnFzY2FsZV9zdW0gW2ldID0KLSAgICAgICAgcmNjLT5mcmFtZV9jb3VudFtpXSA9IDE7IC8vIDEgaXMgYmV0dGVyIGJlY2F1c2Ugb2YgMS8wIGFuZCBzdWNoCi0KLSAgICAgICAgcmNjLT5sYXN0X3FzY2FsZV9mb3JbaV0gPSBGRl9RUDJMQU1CREEgKiA1OwotICAgIH0KLSAgICByY2MtPmJ1ZmZlcl9pbmRleCA9IHMtPmF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3k7Ci0gICAgaWYgKCFyY2MtPmJ1ZmZlcl9pbmRleCkKLSAgICAgICAgcmNjLT5idWZmZXJfaW5kZXggPSBzLT5hdmN0eC0+cmNfYnVmZmVyX3NpemUgKiAzIC8gNDsKLQotICAgIGlmIChzLT5hdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MyKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBjaGFyICpwOwotCi0gICAgICAgIC8qIGZpbmQgbnVtYmVyIG9mIHBpY3MgKi8KLSAgICAgICAgcCA9IHMtPmF2Y3R4LT5zdGF0c19pbjsKLSAgICAgICAgZm9yIChpID0gLTE7IHA7IGkrKykKLSAgICAgICAgICAgIHAgPSBzdHJjaHIocCArIDEsICc7Jyk7Ci0gICAgICAgIGkgKz0gcy0+bWF4X2JfZnJhbWVzOwotICAgICAgICBpZiAoaSA8PSAwIHx8IGkgPj0gSU5UX01BWCAvIHNpemVvZihSYXRlQ29udHJvbEVudHJ5KSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgcmNjLT5lbnRyeSAgICAgICA9IGF2X21hbGxvY3ooaSAqIHNpemVvZihSYXRlQ29udHJvbEVudHJ5KSk7Ci0gICAgICAgIGlmICghcmNjLT5lbnRyeSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIHJjYy0+bnVtX2VudHJpZXMgPSBpOwotCi0gICAgICAgIC8qIGluaXQgYWxsIHRvIHNraXBwZWQgcCBmcmFtZXMKLSAgICAgICAgICogKHdpdGggYiBmcmFtZXMgd2UgbWlnaHQgaGF2ZSBhIG5vdCBlbmNvZGVkIGZyYW1lIGF0IHRoZSBlbmQgRklYTUUpICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCByY2MtPm51bV9lbnRyaWVzOyBpKyspIHsKLSAgICAgICAgICAgIFJhdGVDb250cm9sRW50cnkgKnJjZSA9ICZyY2MtPmVudHJ5W2ldOwotCi0gICAgICAgICAgICByY2UtPnBpY3RfdHlwZSAgPSByY2UtPm5ld19waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKLSAgICAgICAgICAgIHJjZS0+cXNjYWxlICAgICA9IHJjZS0+bmV3X3FzY2FsZSAgICA9IEZGX1FQMkxBTUJEQSAqIDI7Ci0gICAgICAgICAgICByY2UtPm1pc2NfYml0cyAgPSBzLT5tYl9udW0gKyAxMDsKLSAgICAgICAgICAgIHJjZS0+bWJfdmFyX3N1bSA9IHMtPm1iX251bSAqIDEwMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHJlYWQgc3RhdHMgKi8KLSAgICAgICAgcCA9IHMtPmF2Y3R4LT5zdGF0c19pbjsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHJjYy0+bnVtX2VudHJpZXMgLSBzLT5tYXhfYl9mcmFtZXM7IGkrKykgewotICAgICAgICAgICAgUmF0ZUNvbnRyb2xFbnRyeSAqcmNlOwotICAgICAgICAgICAgaW50IHBpY3R1cmVfbnVtYmVyOwotICAgICAgICAgICAgaW50IGU7Ci0gICAgICAgICAgICBjaGFyICpuZXh0OwotCi0gICAgICAgICAgICBuZXh0ID0gc3RyY2hyKHAsICc7Jyk7Ci0gICAgICAgICAgICBpZiAobmV4dCkgewotICAgICAgICAgICAgICAgICgqbmV4dCkgPSAwOyAvLyBzc2NhbmYgaW4gdW5iZWxpZXZhYmx5IHNsb3cgb24gbG9vb25nIHN0cmluZ3MgLy8gRklYTUUgY29weSAvIGRvIG5vdCB3cml0ZQotICAgICAgICAgICAgICAgIG5leHQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGUgPSBzc2NhbmYocCwgIiBpbjolZCAiLCAmcGljdHVyZV9udW1iZXIpOwotCi0gICAgICAgICAgICBhdl9hc3NlcnQwKHBpY3R1cmVfbnVtYmVyID49IDApOwotICAgICAgICAgICAgYXZfYXNzZXJ0MChwaWN0dXJlX251bWJlciA8IHJjYy0+bnVtX2VudHJpZXMpOwotICAgICAgICAgICAgcmNlID0gJnJjYy0+ZW50cnlbcGljdHVyZV9udW1iZXJdOwotCi0gICAgICAgICAgICBlICs9IHNzY2FuZihwLCAiIGluOiUqZCBvdXQ6JSpkIHR5cGU6JWQgcTolZiBpdGV4OiVkIHB0ZXg6JWQgbXY6JWQgbWlzYzolZCBmY29kZTolZCBiY29kZTolZCBtYy12YXI6JSJTQ05kNjQiIHZhcjolIlNDTmQ2NCIgaWNvdW50OiVkIHNraXBjb3VudDolZCBoYml0czolZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmcmNlLT5waWN0X3R5cGUsICZyY2UtPnFzY2FsZSwgJnJjZS0+aV90ZXhfYml0cywgJnJjZS0+cF90ZXhfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICZyY2UtPm12X2JpdHMsICZyY2UtPm1pc2NfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICZyY2UtPmZfY29kZSwgJnJjZS0+Yl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgJnJjZS0+bWNfbWJfdmFyX3N1bSwgJnJjZS0+bWJfdmFyX3N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZyY2UtPmlfY291bnQsICZyY2UtPnNraXBfY291bnQsICZyY2UtPmhlYWRlcl9iaXRzKTsKLSAgICAgICAgICAgIGlmIChlICE9IDE0KSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJzdGF0aXN0aWNzIGFyZSBkYW1hZ2VkIGF0IGxpbmUgJWQsIHBhcnNlciBvdXQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGksIGUpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcCA9IG5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaW5pdF9wYXNzMihzKSA8IDApIHsKLSAgICAgICAgICAgIGZmX3JhdGVfY29udHJvbF91bmluaXQocyk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotI2lmIEZGX0FQSV9SQ19TVFJBVEVHWQotICAgICAgICBhdl9hc3NlcnQwKE1QVl9SQ19TVFJBVEVHWV9YVklEID09IEZGX1JDX1NUUkFURUdZX1hWSUQpOwotI2VuZGlmCi0KLSAgICAgICAgLy8gRklYTUUgbWF5YmUgbW92ZSB0byBlbmQKLSAgICAgICAgaWYgKChzLT5hdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MyKSAmJiBzLT5yY19zdHJhdGVneSA9PSBNUFZfUkNfU1RSQVRFR1lfWFZJRCkgewotI2lmIENPTkZJR19MSUJYVklECi0gICAgICAgICAgICByZXR1cm4gZmZfeHZpZF9yYXRlX2NvbnRyb2xfaW5pdChzKTsKLSNlbHNlCi0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiWHZpZCByYXRlY29udHJvbCByZXF1aXJlcyBsaWJhdmNvZGVjIGNvbXBpbGVkIHdpdGggWHZpZCBzdXBwb3J0LlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICghKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzIpKSB7Ci0gICAgICAgIHJjYy0+c2hvcnRfdGVybV9xc3VtICAgPSAwLjAwMTsKLSAgICAgICAgcmNjLT5zaG9ydF90ZXJtX3Fjb3VudCA9IDAuMDAxOwotCi0gICAgICAgIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSA9IDAuMDAxOwotICAgICAgICByY2MtPnBhc3MxX3dhbnRlZF9iaXRzICAgICAgPSAwLjAwMTsKLQotICAgICAgICBpZiAocy0+YXZjdHgtPnFibHVyID4gMS4wKSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInFibHVyIHRvbyBsYXJnZVxuIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgLyogaW5pdCBzdHVmZiB3aXRoIHRoZSB1c2VyIHNwZWNpZmllZCBjb21wbGV4aXR5ICovCi0gICAgICAgIGlmIChzLT5yY19pbml0aWFsX2NwbHgpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2MCAqIDMwOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgYml0cyA9IHMtPnJjX2luaXRpYWxfY3BseCAqIChpIC8gMTAwMDAuMCArIDEuMCkgKiBzLT5tYl9udW07Ci0gICAgICAgICAgICAgICAgUmF0ZUNvbnRyb2xFbnRyeSByY2U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaSAlICgocy0+Z29wX3NpemUgKyAzKSAvIDQpID09IDApCi0gICAgICAgICAgICAgICAgICAgIHJjZS5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChpICUgKHMtPm1heF9iX2ZyYW1lcyArIDEpKQotICAgICAgICAgICAgICAgICAgICByY2UucGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0I7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByY2UucGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7Ci0KLSAgICAgICAgICAgICAgICByY2UubmV3X3BpY3RfdHlwZSA9IHJjZS5waWN0X3R5cGU7Ci0gICAgICAgICAgICAgICAgcmNlLm1jX21iX3Zhcl9zdW0gPSBiaXRzICogcy0+bWJfbnVtIC8gMTAwMDAwOwotICAgICAgICAgICAgICAgIHJjZS5tYl92YXJfc3VtICAgID0gcy0+bWJfbnVtOwotCi0gICAgICAgICAgICAgICAgcmNlLnFzY2FsZSAgICA9IEZGX1FQMkxBTUJEQSAqIDI7Ci0gICAgICAgICAgICAgICAgcmNlLmZfY29kZSAgICA9IDI7Ci0gICAgICAgICAgICAgICAgcmNlLmJfY29kZSAgICA9IDE7Ci0gICAgICAgICAgICAgICAgcmNlLm1pc2NfYml0cyA9IDE7Ci0KLSAgICAgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjZS5pX2NvdW50ICAgID0gcy0+bWJfbnVtOwotICAgICAgICAgICAgICAgICAgICByY2UuaV90ZXhfYml0cyA9IGJpdHM7Ci0gICAgICAgICAgICAgICAgICAgIHJjZS5wX3RleF9iaXRzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgcmNlLm12X2JpdHMgICAgPSAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJjZS5pX2NvdW50ICAgID0gMDsgLy8gRklYTUUgd2UgZG8ga25vdyB0aGlzIGFwcHJveAotICAgICAgICAgICAgICAgICAgICByY2UuaV90ZXhfYml0cyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJjZS5wX3RleF9iaXRzID0gYml0cyAqIDAuOTsKLSAgICAgICAgICAgICAgICAgICAgcmNlLm12X2JpdHMgICAgPSBiaXRzICogMC4xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByY2MtPmlfY3BseF9zdW1bcmNlLnBpY3RfdHlwZV0gICs9IHJjZS5pX3RleF9iaXRzICogcmNlLnFzY2FsZTsKLSAgICAgICAgICAgICAgICByY2MtPnBfY3BseF9zdW1bcmNlLnBpY3RfdHlwZV0gICs9IHJjZS5wX3RleF9iaXRzICogcmNlLnFzY2FsZTsKLSAgICAgICAgICAgICAgICByY2MtPm12X2JpdHNfc3VtW3JjZS5waWN0X3R5cGVdICs9IHJjZS5tdl9iaXRzOwotICAgICAgICAgICAgICAgIHJjYy0+ZnJhbWVfY291bnRbcmNlLnBpY3RfdHlwZV0rKzsKLQotICAgICAgICAgICAgICAgIGdldF9xc2NhbGUocywgJnJjZSwgcmNjLT5wYXNzMV93YW50ZWRfYml0cyAvIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSwgaSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBGSVhNRSBtaXNiZWhhdmVzIGEgbGl0dGxlIGZvciB2YXJpYWJsZSBmcHMKLSAgICAgICAgICAgICAgICByY2MtPnBhc3MxX3dhbnRlZF9iaXRzICs9IHMtPmJpdF9yYXRlIC8gZ2V0X2ZwcyhzLT5hdmN0eCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotYXZfY29sZCB2b2lkIGZmX3JhdGVfY29udHJvbF91bmluaXQoTXBlZ0VuY0NvbnRleHQgKnMpCi17Ci0gICAgUmF0ZUNvbnRyb2xDb250ZXh0ICpyY2MgPSAmcy0+cmNfY29udGV4dDsKLSAgICBlbW1zX2MoKTsKLQotICAgIGF2X2V4cHJfZnJlZShyY2MtPnJjX2VxX2V2YWwpOwotICAgIGF2X2ZyZWVwKCZyY2MtPmVudHJ5KTsKLQotI2lmIENPTkZJR19MSUJYVklECi0gICAgaWYgKChzLT5hdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1BBU1MyKSAmJiBzLT5yY19zdHJhdGVneSA9PSBNUFZfUkNfU1RSQVRFR1lfWFZJRCkKLSAgICAgICAgZmZfeHZpZF9yYXRlX2NvbnRyb2xfdW5pbml0KHMpOwotI2VuZGlmCi19Ci0KLWludCBmZl92YnZfdXBkYXRlKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgZnJhbWVfc2l6ZSkKLXsKLSAgICBSYXRlQ29udHJvbENvbnRleHQgKnJjYyA9ICZzLT5yY19jb250ZXh0OwotICAgIGNvbnN0IGRvdWJsZSBmcHMgICAgICAgID0gZ2V0X2ZwcyhzLT5hdmN0eCk7Ci0gICAgY29uc3QgaW50IGJ1ZmZlcl9zaXplICAgPSBzLT5hdmN0eC0+cmNfYnVmZmVyX3NpemU7Ci0gICAgY29uc3QgZG91YmxlIG1pbl9yYXRlICAgPSBzLT5hdmN0eC0+cmNfbWluX3JhdGUgLyBmcHM7Ci0gICAgY29uc3QgZG91YmxlIG1heF9yYXRlICAgPSBzLT5hdmN0eC0+cmNfbWF4X3JhdGUgLyBmcHM7Ci0KLSAgICBmZl9kbG9nKHMsICIlZCAlZiAlZCAlZiAlZlxuIiwKLSAgICAgICAgICAgIGJ1ZmZlcl9zaXplLCByY2MtPmJ1ZmZlcl9pbmRleCwgZnJhbWVfc2l6ZSwgbWluX3JhdGUsIG1heF9yYXRlKTsKLQotICAgIGlmIChidWZmZXJfc2l6ZSkgewotICAgICAgICBpbnQgbGVmdDsKLQotICAgICAgICByY2MtPmJ1ZmZlcl9pbmRleCAtPSBmcmFtZV9zaXplOwotICAgICAgICBpZiAocmNjLT5idWZmZXJfaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInJjIGJ1ZmZlciB1bmRlcmZsb3dcbiIpOwotICAgICAgICAgICAgaWYgKGZyYW1lX3NpemUgPiBtYXhfcmF0ZSAmJiBzLT5xc2NhbGUgPT0gcy0+YXZjdHgtPnFtYXgpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIm1heCBiaXRyYXRlIHBvc3NpYmx5IHRvbyBzbWFsbCBvciB0cnkgdHJlbGxpcyB3aXRoIGxhcmdlIGxtYXggb3IgaW5jcmVhc2UgcW1heFxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByY2MtPmJ1ZmZlcl9pbmRleCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBsZWZ0ID0gYnVmZmVyX3NpemUgLSByY2MtPmJ1ZmZlcl9pbmRleCAtIDE7Ci0gICAgICAgIHJjYy0+YnVmZmVyX2luZGV4ICs9IGF2X2NsaXAobGVmdCwgbWluX3JhdGUsIG1heF9yYXRlKTsKLQotICAgICAgICBpZiAocmNjLT5idWZmZXJfaW5kZXggPiBidWZmZXJfc2l6ZSkgewotICAgICAgICAgICAgaW50IHN0dWZmaW5nID0gY2VpbCgocmNjLT5idWZmZXJfaW5kZXggLSBidWZmZXJfc2l6ZSkgLyA4KTsKLQotICAgICAgICAgICAgaWYgKHN0dWZmaW5nIDwgNCAmJiBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkKLSAgICAgICAgICAgICAgICBzdHVmZmluZyA9IDQ7Ci0gICAgICAgICAgICByY2MtPmJ1ZmZlcl9pbmRleCAtPSA4ICogc3R1ZmZpbmc7Ci0KLSAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19SQykKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInN0dWZmaW5nICVkIGJ5dGVzXG4iLCBzdHVmZmluZyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHVmZmluZzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBNb2RpZnkgdGhlIGJpdHJhdGUgY3VydmUgZnJvbSBwYXNzMSBmb3Igb25lIGZyYW1lLgotICovCi1zdGF0aWMgZG91YmxlIGdldF9xc2NhbGUoTXBlZ0VuY0NvbnRleHQgKnMsIFJhdGVDb250cm9sRW50cnkgKnJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmF0ZV9mYWN0b3IsIGludCBmcmFtZV9udW0pCi17Ci0gICAgUmF0ZUNvbnRyb2xDb250ZXh0ICpyY2MgPSAmcy0+cmNfY29udGV4dDsKLSAgICBBVkNvZGVjQ29udGV4dCAqYSAgICAgICA9IHMtPmF2Y3R4OwotICAgIGNvbnN0IGludCBwaWN0X3R5cGUgICAgID0gcmNlLT5uZXdfcGljdF90eXBlOwotICAgIGNvbnN0IGRvdWJsZSBtYl9udW0gICAgID0gcy0+bWJfbnVtOwotICAgIGRvdWJsZSBxLCBiaXRzOwotICAgIGludCBpOwotCi0gICAgZG91YmxlIGNvbnN0X3ZhbHVlc1tdID0gewotICAgICAgICBNX1BJLAotICAgICAgICBNX0UsCi0gICAgICAgIHJjZS0+aV90ZXhfYml0cyAqIHJjZS0+cXNjYWxlLAotICAgICAgICByY2UtPnBfdGV4X2JpdHMgKiByY2UtPnFzY2FsZSwKLSAgICAgICAgKHJjZS0+aV90ZXhfYml0cyArIHJjZS0+cF90ZXhfYml0cykgKiAoZG91YmxlKXJjZS0+cXNjYWxlLAotICAgICAgICByY2UtPm12X2JpdHMgLyBtYl9udW0sCi0gICAgICAgIHJjZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CID8gKHJjZS0+Zl9jb2RlICsgcmNlLT5iX2NvZGUpICogMC41IDogcmNlLT5mX2NvZGUsCi0gICAgICAgIHJjZS0+aV9jb3VudCAvIG1iX251bSwKLSAgICAgICAgcmNlLT5tY19tYl92YXJfc3VtIC8gbWJfbnVtLAotICAgICAgICByY2UtPm1iX3Zhcl9zdW0gLyBtYl9udW0sCi0gICAgICAgIHJjZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JLAotICAgICAgICByY2UtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCwKLSAgICAgICAgcmNlLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IsCi0gICAgICAgIHJjYy0+cXNjYWxlX3N1bVtwaWN0X3R5cGVdIC8gKGRvdWJsZSlyY2MtPmZyYW1lX2NvdW50W3BpY3RfdHlwZV0sCi0gICAgICAgIGEtPnFjb21wcmVzcywKLSNpZiAwCi0gICAgICAgIHJjYy0+bGFzdF9xc2NhbGVfZm9yW0FWX1BJQ1RVUkVfVFlQRV9JXSwKLSAgICAgICAgcmNjLT5sYXN0X3FzY2FsZV9mb3JbQVZfUElDVFVSRV9UWVBFX1BdLAotICAgICAgICByY2MtPmxhc3RfcXNjYWxlX2ZvcltBVl9QSUNUVVJFX1RZUEVfQl0sCi0gICAgICAgIHJjYy0+bmV4dF9ub25fYl9xc2NhbGUsCi0jZW5kaWYKLSAgICAgICAgcmNjLT5pX2NwbHhfc3VtW0FWX1BJQ1RVUkVfVFlQRV9JXSAvIChkb3VibGUpcmNjLT5mcmFtZV9jb3VudFtBVl9QSUNUVVJFX1RZUEVfSV0sCi0gICAgICAgIHJjYy0+aV9jcGx4X3N1bVtBVl9QSUNUVVJFX1RZUEVfUF0gLyAoZG91YmxlKXJjYy0+ZnJhbWVfY291bnRbQVZfUElDVFVSRV9UWVBFX1BdLAotICAgICAgICByY2MtPnBfY3BseF9zdW1bQVZfUElDVFVSRV9UWVBFX1BdIC8gKGRvdWJsZSlyY2MtPmZyYW1lX2NvdW50W0FWX1BJQ1RVUkVfVFlQRV9QXSwKLSAgICAgICAgcmNjLT5wX2NwbHhfc3VtW0FWX1BJQ1RVUkVfVFlQRV9CXSAvIChkb3VibGUpcmNjLT5mcmFtZV9jb3VudFtBVl9QSUNUVVJFX1RZUEVfQl0sCi0gICAgICAgIChyY2MtPmlfY3BseF9zdW1bcGljdF90eXBlXSArIHJjYy0+cF9jcGx4X3N1bVtwaWN0X3R5cGVdKSAvIChkb3VibGUpcmNjLT5mcmFtZV9jb3VudFtwaWN0X3R5cGVdLAotICAgICAgICAwCi0gICAgfTsKLQotICAgIGJpdHMgPSBhdl9leHByX2V2YWwocmNjLT5yY19lcV9ldmFsLCBjb25zdF92YWx1ZXMsIHJjZSk7Ci0gICAgaWYgKGlzbmFuKGJpdHMpKSB7Ci0gICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZXZhbHVhdGluZyByY19lcSBcIiVzXCJcbiIsIHMtPnJjX2VxKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSArPSBiaXRzOwotICAgIGJpdHMgKj0gcmF0ZV9mYWN0b3I7Ci0gICAgaWYgKGJpdHMgPCAwLjApCi0gICAgICAgIGJpdHMgPSAwLjA7Ci0gICAgYml0cyArPSAxLjA7IC8vIGF2b2lkIDEvMCBpc3N1ZXMKLQotICAgIC8qIHVzZXIgb3ZlcnJpZGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YXZjdHgtPnJjX292ZXJyaWRlX2NvdW50OyBpKyspIHsKLSAgICAgICAgUmNPdmVycmlkZSAqcmNvID0gcy0+YXZjdHgtPnJjX292ZXJyaWRlOwotICAgICAgICBpZiAocmNvW2ldLnN0YXJ0X2ZyYW1lID4gZnJhbWVfbnVtKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChyY29baV0uZW5kX2ZyYW1lIDwgZnJhbWVfbnVtKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKHJjb1tpXS5xc2NhbGUpCi0gICAgICAgICAgICBiaXRzID0gcXAyYml0cyhyY2UsIHJjb1tpXS5xc2NhbGUpOyAgLy8gRklYTUUgbW92ZSBhdCBlbmQgdG8gcmVhbGx5IGZvcmNlIGl0PwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBiaXRzICo9IHJjb1tpXS5xdWFsaXR5X2ZhY3RvcjsKLSAgICB9Ci0KLSAgICBxID0gYml0czJxcChyY2UsIGJpdHMpOwotCi0gICAgLyogSS9CIGRpZmZlcmVuY2UgKi8KLSAgICBpZiAocGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JICYmIHMtPmF2Y3R4LT5pX3F1YW50X2ZhY3RvciA8IDAuMCkKLSAgICAgICAgcSA9IC1xICogcy0+YXZjdHgtPmlfcXVhbnRfZmFjdG9yICsgcy0+YXZjdHgtPmlfcXVhbnRfb2Zmc2V0OwotICAgIGVsc2UgaWYgKHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiBzLT5hdmN0eC0+Yl9xdWFudF9mYWN0b3IgPCAwLjApCi0gICAgICAgIHEgPSAtcSAqIHMtPmF2Y3R4LT5iX3F1YW50X2ZhY3RvciArIHMtPmF2Y3R4LT5iX3F1YW50X29mZnNldDsKLSAgICBpZiAocSA8IDEpCi0gICAgICAgIHEgPSAxOwotCi0gICAgcmV0dXJuIHE7Ci19Ci0KIHN0YXRpYyBkb3VibGUgZ2V0X2RpZmZfbGltaXRlZF9xKE1wZWdFbmNDb250ZXh0ICpzLCBSYXRlQ29udHJvbEVudHJ5ICpyY2UsIGRvdWJsZSBxKQogewogICAgIFJhdGVDb250cm9sQ29udGV4dCAqcmNjICAgPSAmcy0+cmNfY29udGV4dDsKQEAgLTYwMiwzMjQgKzIzMiw4MiBAQAogICAgIHJldHVybiBxOwogfQogCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAxIFBhc3MgQ29kZQotCi1zdGF0aWMgZG91YmxlIHByZWRpY3Rfc2l6ZShQcmVkaWN0b3IgKnAsIGRvdWJsZSBxLCBkb3VibGUgdmFyKQorLyoqCisgKiBNb2RpZnkgdGhlIGJpdHJhdGUgY3VydmUgZnJvbSBwYXNzMSBmb3Igb25lIGZyYW1lLgorICovCitzdGF0aWMgZG91YmxlIGdldF9xc2NhbGUoTXBlZ0VuY0NvbnRleHQgKnMsIFJhdGVDb250cm9sRW50cnkgKnJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmF0ZV9mYWN0b3IsIGludCBmcmFtZV9udW0pCiB7Ci0gICAgcmV0dXJuIHAtPmNvZWZmICogdmFyIC8gKHEgKiBwLT5jb3VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwZGF0ZV9wcmVkaWN0b3IoUHJlZGljdG9yICpwLCBkb3VibGUgcSwgZG91YmxlIHZhciwgZG91YmxlIHNpemUpCi17Ci0gICAgZG91YmxlIG5ld19jb2VmZiA9IHNpemUgKiBxIC8gKHZhciArIDEpOwotICAgIGlmICh2YXIgPCAxMCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcC0+Y291bnQgKj0gcC0+ZGVjYXk7Ci0gICAgcC0+Y29lZmYgKj0gcC0+ZGVjYXk7Ci0gICAgcC0+Y291bnQrKzsKLSAgICBwLT5jb2VmZiArPSBuZXdfY29lZmY7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkYXB0aXZlX3F1YW50aXphdGlvbihNcGVnRW5jQ29udGV4dCAqcywgZG91YmxlIHEpCi17Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgZmxvYXQgbHVtaV9tYXNraW5nICAgICAgICAgPSBzLT5hdmN0eC0+bHVtaV9tYXNraW5nIC8gKDEyOC4wICogMTI4LjApOwotICAgIGNvbnN0IGZsb2F0IGRhcmtfbWFza2luZyAgICAgICAgID0gcy0+YXZjdHgtPmRhcmtfbWFza2luZyAvICgxMjguMCAqIDEyOC4wKTsKLSAgICBjb25zdCBmbG9hdCB0ZW1wX2NwbHhfbWFza2luZyAgICA9IHMtPmF2Y3R4LT50ZW1wb3JhbF9jcGx4X21hc2tpbmc7Ci0gICAgY29uc3QgZmxvYXQgc3BhdGlhbF9jcGx4X21hc2tpbmcgPSBzLT5hdmN0eC0+c3BhdGlhbF9jcGx4X21hc2tpbmc7Ci0gICAgY29uc3QgZmxvYXQgcF9tYXNraW5nICAgICAgICAgICAgPSBzLT5hdmN0eC0+cF9tYXNraW5nOwotICAgIGNvbnN0IGZsb2F0IGJvcmRlcl9tYXNraW5nICAgICAgID0gcy0+Ym9yZGVyX21hc2tpbmc7Ci0gICAgZmxvYXQgYml0c19zdW0gICAgICAgICAgICAgICAgICAgPSAwLjA7Ci0gICAgZmxvYXQgY3BseF9zdW0gICAgICAgICAgICAgICAgICAgPSAwLjA7Ci0gICAgZmxvYXQgKmNwbHhfdGFiICAgICAgICAgICAgICAgICAgPSBzLT5jcGx4X3RhYjsKLSAgICBmbG9hdCAqYml0c190YWIgICAgICAgICAgICAgICAgICA9IHMtPmJpdHNfdGFiOwotICAgIGNvbnN0IGludCBxbWluICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPm1iX2xtaW47Ci0gICAgY29uc3QgaW50IHFtYXggICAgICAgICAgICAgICAgICAgPSBzLT5hdmN0eC0+bWJfbG1heDsKLSAgICBQaWN0dXJlICpjb25zdCBwaWMgICAgICAgICAgICAgICA9ICZzLT5jdXJyZW50X3BpY3R1cmU7Ci0gICAgY29uc3QgaW50IG1iX3dpZHRoICAgICAgICAgICAgICAgPSBzLT5tYl93aWR0aDsKLSAgICBjb25zdCBpbnQgbWJfaGVpZ2h0ICAgICAgICAgICAgICA9IHMtPm1iX2hlaWdodDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgewotICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKLSAgICAgICAgZmxvYXQgdGVtcF9jcGx4ID0gc3FydChwaWMtPm1jX21iX3ZhclttYl94eV0pOyAvLyBGSVhNRSBtZXJnZSBpbiBwb3coKQotICAgICAgICBmbG9hdCBzcGF0X2NwbHggPSBzcXJ0KHBpYy0+bWJfdmFyW21iX3h5XSk7Ci0gICAgICAgIGNvbnN0IGludCBsdW1pICA9IHBpYy0+bWJfbWVhblttYl94eV07Ci0gICAgICAgIGZsb2F0IGJpdHMsIGNwbHgsIGZhY3RvcjsKLSAgICAgICAgaW50IG1iX3ggPSBtYl94eSAlIHMtPm1iX3N0cmlkZTsKLSAgICAgICAgaW50IG1iX3kgPSBtYl94eSAvIHMtPm1iX3N0cmlkZTsKLSAgICAgICAgaW50IG1iX2Rpc3RhbmNlOwotICAgICAgICBmbG9hdCBtYl9mYWN0b3IgPSAwLjA7Ci0gICAgICAgIGlmIChzcGF0X2NwbHggPCA0KQotICAgICAgICAgICAgc3BhdF9jcGx4ID0gNDsgICAgICAgICAgICAgIC8vIEZJWE1FIGZpbmV0dW5lCi0gICAgICAgIGlmICh0ZW1wX2NwbHggPCA0KQotICAgICAgICAgICAgdGVtcF9jcGx4ID0gNDsgICAgICAgICAgICAgIC8vIEZJWE1FIGZpbmV0dW5lCi0KLSAgICAgICAgaWYgKChzLT5tYl90eXBlW21iX3h5XSAmIENBTkRJREFURV9NQl9UWVBFX0lOVFJBKSkgeyAvLyBGSVhNRSBocSBtb2RlCi0gICAgICAgICAgICBjcGx4ICAgPSBzcGF0X2NwbHg7Ci0gICAgICAgICAgICBmYWN0b3IgPSAxLjAgKyBwX21hc2tpbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjcGx4ICAgPSB0ZW1wX2NwbHg7Ci0gICAgICAgICAgICBmYWN0b3IgPSBwb3codGVtcF9jcGx4LCAtdGVtcF9jcGx4X21hc2tpbmcpOwotICAgICAgICB9Ci0gICAgICAgIGZhY3RvciAqPSBwb3coc3BhdF9jcGx4LCAtc3BhdGlhbF9jcGx4X21hc2tpbmcpOwotCi0gICAgICAgIGlmIChsdW1pID4gMTI3KQotICAgICAgICAgICAgZmFjdG9yICo9ICgxLjAgLSAobHVtaSAtIDEyOCkgKiAobHVtaSAtIDEyOCkgKiBsdW1pX21hc2tpbmcpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBmYWN0b3IgKj0gKDEuMCAtIChsdW1pIC0gMTI4KSAqIChsdW1pIC0gMTI4KSAqIGRhcmtfbWFza2luZyk7Ci0KLSAgICAgICAgaWYgKG1iX3ggPCBtYl93aWR0aCAvIDUpIHsKLSAgICAgICAgICAgIG1iX2Rpc3RhbmNlID0gbWJfd2lkdGggLyA1IC0gbWJfeDsKLSAgICAgICAgICAgIG1iX2ZhY3RvciAgID0gKGZsb2F0KW1iX2Rpc3RhbmNlIC8gKGZsb2F0KShtYl93aWR0aCAvIDUpOwotICAgICAgICB9IGVsc2UgaWYgKG1iX3ggPiA0ICogbWJfd2lkdGggLyA1KSB7Ci0gICAgICAgICAgICBtYl9kaXN0YW5jZSA9IG1iX3ggLSA0ICogbWJfd2lkdGggLyA1OwotICAgICAgICAgICAgbWJfZmFjdG9yICAgPSAoZmxvYXQpbWJfZGlzdGFuY2UgLyAoZmxvYXQpKG1iX3dpZHRoIC8gNSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1iX3kgPCBtYl9oZWlnaHQgLyA1KSB7Ci0gICAgICAgICAgICBtYl9kaXN0YW5jZSA9IG1iX2hlaWdodCAvIDUgLSBtYl95OwotICAgICAgICAgICAgbWJfZmFjdG9yICAgPSBGRk1BWChtYl9mYWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCltYl9kaXN0YW5jZSAvIChmbG9hdCkobWJfaGVpZ2h0IC8gNSkpOwotICAgICAgICB9IGVsc2UgaWYgKG1iX3kgPiA0ICogbWJfaGVpZ2h0IC8gNSkgewotICAgICAgICAgICAgbWJfZGlzdGFuY2UgPSBtYl95IC0gNCAqIG1iX2hlaWdodCAvIDU7Ci0gICAgICAgICAgICBtYl9mYWN0b3IgICA9IEZGTUFYKG1iX2ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KW1iX2Rpc3RhbmNlIC8gKGZsb2F0KShtYl9oZWlnaHQgLyA1KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmYWN0b3IgKj0gMS4wIC0gYm9yZGVyX21hc2tpbmcgKiBtYl9mYWN0b3I7Ci0KLSAgICAgICAgaWYgKGZhY3RvciA8IDAuMDAwMDEpCi0gICAgICAgICAgICBmYWN0b3IgPSAwLjAwMDAxOwotCi0gICAgICAgIGJpdHMgICAgICAgID0gY3BseCAqIGZhY3RvcjsKLSAgICAgICAgY3BseF9zdW0gICArPSBjcGx4OwotICAgICAgICBiaXRzX3N1bSAgICs9IGJpdHM7Ci0gICAgICAgIGNwbHhfdGFiW2ldID0gY3BseDsKLSAgICAgICAgYml0c190YWJbaV0gPSBiaXRzOwotICAgIH0KLQotICAgIC8qIGhhbmRsZSBxbWluL3FtYXggY2xpcHBpbmcgKi8KLSAgICBpZiAocy0+bXB2X2ZsYWdzICYgRkZfTVBWX0ZMQUdfTkFRKSB7Ci0gICAgICAgIGZsb2F0IGZhY3RvciA9IGJpdHNfc3VtIC8gY3BseF9zdW07Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgewotICAgICAgICAgICAgZmxvYXQgbmV3cSA9IHEgKiBjcGx4X3RhYltpXSAvIGJpdHNfdGFiW2ldOwotICAgICAgICAgICAgbmV3cSAqPSBmYWN0b3I7Ci0KLSAgICAgICAgICAgIGlmIChuZXdxID4gcW1heCkgewotICAgICAgICAgICAgICAgIGJpdHNfc3VtIC09IGJpdHNfdGFiW2ldOwotICAgICAgICAgICAgICAgIGNwbHhfc3VtIC09IGNwbHhfdGFiW2ldICogcSAvIHFtYXg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5ld3EgPCBxbWluKSB7Ci0gICAgICAgICAgICAgICAgYml0c19zdW0gLT0gYml0c190YWJbaV07Ci0gICAgICAgICAgICAgICAgY3BseF9zdW0gLT0gY3BseF90YWJbaV0gKiBxIC8gcW1pbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYml0c19zdW0gPCAwLjAwMSkKLSAgICAgICAgICAgIGJpdHNfc3VtID0gMC4wMDE7Ci0gICAgICAgIGlmIChjcGx4X3N1bSA8IDAuMDAxKQotICAgICAgICAgICAgY3BseF9zdW0gPSAwLjAwMTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bWJfbnVtOyBpKyspIHsKLSAgICAgICAgY29uc3QgaW50IG1iX3h5ID0gcy0+bWJfaW5kZXgyeHlbaV07Ci0gICAgICAgIGZsb2F0IG5ld3EgICAgICA9IHEgKiBjcGx4X3RhYltpXSAvIGJpdHNfdGFiW2ldOwotICAgICAgICBpbnQgaW50cTsKLQotICAgICAgICBpZiAocy0+bXB2X2ZsYWdzICYgRkZfTVBWX0ZMQUdfTkFRKSB7Ci0gICAgICAgICAgICBuZXdxICo9IGJpdHNfc3VtIC8gY3BseF9zdW07Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRxID0gKGludCkobmV3cSArIDAuNSk7Ci0KLSAgICAgICAgaWYgKGludHEgPiBxbWF4KQotICAgICAgICAgICAgaW50cSA9IHFtYXg7Ci0gICAgICAgIGVsc2UgaWYgKGludHEgPCBxbWluKQotICAgICAgICAgICAgaW50cSA9IHFtaW47Ci0gICAgICAgIHMtPmxhbWJkYV90YWJsZVttYl94eV0gPSBpbnRxOwotICAgIH0KLX0KLQotdm9pZCBmZl9nZXRfMnBhc3NfZmNvZGUoTXBlZ0VuY0NvbnRleHQgKnMpCi17Ci0gICAgUmF0ZUNvbnRyb2xDb250ZXh0ICpyY2MgPSAmcy0+cmNfY29udGV4dDsKLSAgICBSYXRlQ29udHJvbEVudHJ5ICpyY2UgICA9ICZyY2MtPmVudHJ5W3MtPnBpY3R1cmVfbnVtYmVyXTsKLQotICAgIHMtPmZfY29kZSA9IHJjZS0+Zl9jb2RlOwotICAgIHMtPmJfY29kZSA9IHJjZS0+Yl9jb2RlOwotfQotCi0vLyBGSVhNRSByZCBvciBhdCBsZWFzdCBhcHByb3ggZm9yIGRxdWFudAotCi1mbG9hdCBmZl9yYXRlX2VzdGltYXRlX3FzY2FsZShNcGVnRW5jQ29udGV4dCAqcywgaW50IGRyeV9ydW4pCi17Ci0gICAgZmxvYXQgcTsKLSAgICBpbnQgcW1pbiwgcW1heDsKLSAgICBmbG9hdCBicl9jb21wZW5zYXRpb247Ci0gICAgZG91YmxlIGRpZmY7Ci0gICAgZG91YmxlIHNob3J0X3Rlcm1fcTsKLSAgICBkb3VibGUgZnBzOwotICAgIGludCBwaWN0dXJlX251bWJlciA9IHMtPnBpY3R1cmVfbnVtYmVyOwotICAgIGludDY0X3Qgd2FudGVkX2JpdHM7CiAgICAgUmF0ZUNvbnRyb2xDb250ZXh0ICpyY2MgPSAmcy0+cmNfY29udGV4dDsKICAgICBBVkNvZGVjQ29udGV4dCAqYSAgICAgICA9IHMtPmF2Y3R4OwotICAgIFJhdGVDb250cm9sRW50cnkgbG9jYWxfcmNlLCAqcmNlOwotICAgIGRvdWJsZSBiaXRzOwotICAgIGRvdWJsZSByYXRlX2ZhY3RvcjsKLSAgICBpbnQ2NF90IHZhcjsKLSAgICBjb25zdCBpbnQgcGljdF90eXBlID0gcy0+cGljdF90eXBlOwotICAgIFBpY3R1cmUgKiBjb25zdCBwaWMgPSAmcy0+Y3VycmVudF9waWN0dXJlOwotICAgIGVtbXNfYygpOworICAgIGNvbnN0IGludCBwaWN0X3R5cGUgICAgID0gcmNlLT5uZXdfcGljdF90eXBlOworICAgIGNvbnN0IGRvdWJsZSBtYl9udW0gICAgID0gcy0+bWJfbnVtOworICAgIGRvdWJsZSBxLCBiaXRzOworICAgIGludCBpOwogCi0jaWYgQ09ORklHX0xJQlhWSUQKLSAgICBpZiAoKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzIpICYmIHMtPnJjX3N0cmF0ZWd5ID09IE1QVl9SQ19TVFJBVEVHWV9YVklEKQotICAgICAgICByZXR1cm4gZmZfeHZpZF9yYXRlX2VzdGltYXRlX3FzY2FsZShzLCBkcnlfcnVuKTsKLSNlbmRpZgorICAgIGRvdWJsZSBjb25zdF92YWx1ZXNbXSA9IHsKKyAgICAgICAgTV9QSSwKKyAgICAgICAgTV9FLAorICAgICAgICByY2UtPmlfdGV4X2JpdHMgKiByY2UtPnFzY2FsZSwKKyAgICAgICAgcmNlLT5wX3RleF9iaXRzICogcmNlLT5xc2NhbGUsCisgICAgICAgIChyY2UtPmlfdGV4X2JpdHMgKyByY2UtPnBfdGV4X2JpdHMpICogKGRvdWJsZSlyY2UtPnFzY2FsZSwKKyAgICAgICAgcmNlLT5tdl9iaXRzIC8gbWJfbnVtLAorICAgICAgICByY2UtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiA/IChyY2UtPmZfY29kZSArIHJjZS0+Yl9jb2RlKSAqIDAuNSA6IHJjZS0+Zl9jb2RlLAorICAgICAgICByY2UtPmlfY291bnQgLyBtYl9udW0sCisgICAgICAgIHJjZS0+bWNfbWJfdmFyX3N1bSAvIG1iX251bSwKKyAgICAgICAgcmNlLT5tYl92YXJfc3VtIC8gbWJfbnVtLAorICAgICAgICByY2UtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSwKKyAgICAgICAgcmNlLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AsCisgICAgICAgIHJjZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CLAorICAgICAgICByY2MtPnFzY2FsZV9zdW1bcGljdF90eXBlXSAvIChkb3VibGUpcmNjLT5mcmFtZV9jb3VudFtwaWN0X3R5cGVdLAorICAgICAgICBhLT5xY29tcHJlc3MsCisgICAgICAgIHJjYy0+aV9jcGx4X3N1bVtBVl9QSUNUVVJFX1RZUEVfSV0gLyAoZG91YmxlKXJjYy0+ZnJhbWVfY291bnRbQVZfUElDVFVSRV9UWVBFX0ldLAorICAgICAgICByY2MtPmlfY3BseF9zdW1bQVZfUElDVFVSRV9UWVBFX1BdIC8gKGRvdWJsZSlyY2MtPmZyYW1lX2NvdW50W0FWX1BJQ1RVUkVfVFlQRV9QXSwKKyAgICAgICAgcmNjLT5wX2NwbHhfc3VtW0FWX1BJQ1RVUkVfVFlQRV9QXSAvIChkb3VibGUpcmNjLT5mcmFtZV9jb3VudFtBVl9QSUNUVVJFX1RZUEVfUF0sCisgICAgICAgIHJjYy0+cF9jcGx4X3N1bVtBVl9QSUNUVVJFX1RZUEVfQl0gLyAoZG91YmxlKXJjYy0+ZnJhbWVfY291bnRbQVZfUElDVFVSRV9UWVBFX0JdLAorICAgICAgICAocmNjLT5pX2NwbHhfc3VtW3BpY3RfdHlwZV0gKyByY2MtPnBfY3BseF9zdW1bcGljdF90eXBlXSkgLyAoZG91YmxlKXJjYy0+ZnJhbWVfY291bnRbcGljdF90eXBlXSwKKyAgICAgICAgMAorICAgIH07CiAKLSAgICBnZXRfcW1pbm1heCgmcW1pbiwgJnFtYXgsIHMsIHBpY3RfdHlwZSk7Ci0KLSAgICBmcHMgPSBnZXRfZnBzKHMtPmF2Y3R4KTsKLSAgICAvKiB1cGRhdGUgcHJlZGljdG9ycyAqLwotICAgIGlmIChwaWN0dXJlX251bWJlciA+IDIgJiYgIWRyeV9ydW4pIHsKLSAgICAgICAgY29uc3QgaW50NjRfdCBsYXN0X3ZhciA9Ci0gICAgICAgICAgICBzLT5sYXN0X3BpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/IHJjYy0+bGFzdF9tYl92YXJfc3VtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJjYy0+bGFzdF9tY19tYl92YXJfc3VtOwotICAgICAgICBhdl9hc3NlcnQxKHMtPmZyYW1lX2JpdHMgPj0gcy0+c3R1ZmZpbmdfYml0cyk7Ci0gICAgICAgIHVwZGF0ZV9wcmVkaWN0b3IoJnJjYy0+cHJlZFtzLT5sYXN0X3BpY3RfdHlwZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmNjLT5sYXN0X3FzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzcXJ0KGxhc3RfdmFyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9iaXRzIC0gcy0+c3R1ZmZpbmdfYml0cyk7CisgICAgYml0cyA9IGF2X2V4cHJfZXZhbChyY2MtPnJjX2VxX2V2YWwsIGNvbnN0X3ZhbHVlcywgcmNlKTsKKyAgICBpZiAoaXNuYW4oYml0cykpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBldmFsdWF0aW5nIHJjX2VxIFwiJXNcIlxuIiwgcy0+cmNfZXEpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzIpIHsKLSAgICAgICAgYXZfYXNzZXJ0MChwaWN0dXJlX251bWJlciA+PSAwKTsKLSAgICAgICAgaWYgKHBpY3R1cmVfbnVtYmVyID49IHJjYy0+bnVtX2VudHJpZXMpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnB1dCBpcyBsb25nZXIgdGhhbiAyLXBhc3MgbG9nIGZpbGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHJjZSAgICAgICAgID0gJnJjYy0+ZW50cnlbcGljdHVyZV9udW1iZXJdOwotICAgICAgICB3YW50ZWRfYml0cyA9IHJjZS0+ZXhwZWN0ZWRfYml0czsKLSAgICB9IGVsc2UgewotICAgICAgICBQaWN0dXJlICpkdHNfcGljOwotICAgICAgICByY2UgPSAmbG9jYWxfcmNlOworICAgIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSArPSBiaXRzOworICAgIGJpdHMgKj0gcmF0ZV9mYWN0b3I7CisgICAgaWYgKGJpdHMgPCAwLjApCisgICAgICAgIGJpdHMgPSAwLjA7CisgICAgYml0cyArPSAxLjA7IC8vIGF2b2lkIDEvMCBpc3N1ZXMKIAotICAgICAgICAvKiBGSVhNRSBhZGQgYSBkdHMgZmllbGQgdG8gQVZGcmFtZSBhbmQgZW5zdXJlIGl0IGlzIHNldCBhbmQgdXNlIGl0Ci0gICAgICAgICAqIGhlcmUgaW5zdGVhZCBvZiByZW9yZGVyaW5nIGJ1dCB0aGUgcmVvcmRlcmluZyBpcyBzaW1wbGVyIGZvciBub3cKLSAgICAgICAgICogdW50aWwgSC4yNjQgQi1weXJhbWlkIG11c3QgYmUgaGFuZGxlZC4gKi8KLSAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiB8fCBzLT5sb3dfZGVsYXkpCi0gICAgICAgICAgICBkdHNfcGljID0gcy0+Y3VycmVudF9waWN0dXJlX3B0cjsKKyAgICAvKiB1c2VyIG92ZXJyaWRlICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmF2Y3R4LT5yY19vdmVycmlkZV9jb3VudDsgaSsrKSB7CisgICAgICAgIFJjT3ZlcnJpZGUgKnJjbyA9IHMtPmF2Y3R4LT5yY19vdmVycmlkZTsKKyAgICAgICAgaWYgKHJjb1tpXS5zdGFydF9mcmFtZSA+IGZyYW1lX251bSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocmNvW2ldLmVuZF9mcmFtZSA8IGZyYW1lX251bSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChyY29baV0ucXNjYWxlKQorICAgICAgICAgICAgYml0cyA9IHFwMmJpdHMocmNlLCByY29baV0ucXNjYWxlKTsgIC8vIEZJWE1FIG1vdmUgYXQgZW5kIHRvIHJlYWxseSBmb3JjZSBpdD8KICAgICAgICAgZWxzZQotICAgICAgICAgICAgZHRzX3BpYyA9IHMtPmxhc3RfcGljdHVyZV9wdHI7Ci0KLSAgICAgICAgaWYgKCFkdHNfcGljIHx8IGR0c19waWMtPmYtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgIHdhbnRlZF9iaXRzID0gKHVpbnQ2NF90KShzLT5iaXRfcmF0ZSAqIChkb3VibGUpcGljdHVyZV9udW1iZXIgLyBmcHMpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB3YW50ZWRfYml0cyA9ICh1aW50NjRfdCkocy0+Yml0X3JhdGUgKiAoZG91YmxlKWR0c19waWMtPmYtPnB0cyAvIGZwcyk7CisgICAgICAgICAgICBiaXRzICo9IHJjb1tpXS5xdWFsaXR5X2ZhY3RvcjsKICAgICB9CiAKLSAgICBkaWZmID0gcy0+dG90YWxfYml0cyAtIHdhbnRlZF9iaXRzOwotICAgIGJyX2NvbXBlbnNhdGlvbiA9IChhLT5iaXRfcmF0ZV90b2xlcmFuY2UgLSBkaWZmKSAvIGEtPmJpdF9yYXRlX3RvbGVyYW5jZTsKLSAgICBpZiAoYnJfY29tcGVuc2F0aW9uIDw9IDAuMCkKLSAgICAgICAgYnJfY29tcGVuc2F0aW9uID0gMC4wMDE7CisgICAgcSA9IGJpdHMycXAocmNlLCBiaXRzKTsKIAotICAgIHZhciA9IHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/IHBpYy0+bWJfdmFyX3N1bSA6IHBpYy0+bWNfbWJfdmFyX3N1bTsKKyAgICAvKiBJL0IgZGlmZmVyZW5jZSAqLworICAgIGlmIChwaWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgJiYgcy0+YXZjdHgtPmlfcXVhbnRfZmFjdG9yIDwgMC4wKQorICAgICAgICBxID0gLXEgKiBzLT5hdmN0eC0+aV9xdWFudF9mYWN0b3IgKyBzLT5hdmN0eC0+aV9xdWFudF9vZmZzZXQ7CisgICAgZWxzZSBpZiAocGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmIHMtPmF2Y3R4LT5iX3F1YW50X2ZhY3RvciA8IDAuMCkKKyAgICAgICAgcSA9IC1xICogcy0+YXZjdHgtPmJfcXVhbnRfZmFjdG9yICsgcy0+YXZjdHgtPmJfcXVhbnRfb2Zmc2V0OworICAgIGlmIChxIDwgMSkKKyAgICAgICAgcSA9IDE7CiAKLSAgICBzaG9ydF90ZXJtX3EgPSAwOyAvKiBhdm9pZCB3YXJuaW5nICovCi0gICAgaWYgKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzIpIHsKLSAgICAgICAgaWYgKHBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkKLSAgICAgICAgICAgIGF2X2Fzc2VydDAocGljdF90eXBlID09IHJjZS0+bmV3X3BpY3RfdHlwZSk7Ci0KLSAgICAgICAgcSA9IHJjZS0+bmV3X3FzY2FsZSAvIGJyX2NvbXBlbnNhdGlvbjsKLSAgICAgICAgZmZfZGxvZyhzLCAiJWYgJWYgJWYgbGFzdDolZCB2YXI6JSJQUklkNjQiIHR5cGU6JWQvL1xuIiwgcSwgcmNlLT5uZXdfcXNjYWxlLAotICAgICAgICAgICAgICAgIGJyX2NvbXBlbnNhdGlvbiwgcy0+ZnJhbWVfYml0cywgdmFyLCBwaWN0X3R5cGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjZS0+cGljdF90eXBlICAgICA9Ci0gICAgICAgIHJjZS0+bmV3X3BpY3RfdHlwZSA9IHBpY3RfdHlwZTsKLSAgICAgICAgcmNlLT5tY19tYl92YXJfc3VtID0gcGljLT5tY19tYl92YXJfc3VtOwotICAgICAgICByY2UtPm1iX3Zhcl9zdW0gICAgPSBwaWMtPm1iX3Zhcl9zdW07Ci0gICAgICAgIHJjZS0+cXNjYWxlICAgICAgICA9IEZGX1FQMkxBTUJEQSAqIDI7Ci0gICAgICAgIHJjZS0+Zl9jb2RlICAgICAgICA9IHMtPmZfY29kZTsKLSAgICAgICAgcmNlLT5iX2NvZGUgICAgICAgID0gcy0+Yl9jb2RlOwotICAgICAgICByY2UtPm1pc2NfYml0cyAgICAgPSAxOwotCi0gICAgICAgIGJpdHMgPSBwcmVkaWN0X3NpemUoJnJjYy0+cHJlZFtwaWN0X3R5cGVdLCByY2UtPnFzY2FsZSwgc3FydCh2YXIpKTsKLSAgICAgICAgaWYgKHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgewotICAgICAgICAgICAgcmNlLT5pX2NvdW50ICAgID0gcy0+bWJfbnVtOwotICAgICAgICAgICAgcmNlLT5pX3RleF9iaXRzID0gYml0czsKLSAgICAgICAgICAgIHJjZS0+cF90ZXhfYml0cyA9IDA7Ci0gICAgICAgICAgICByY2UtPm12X2JpdHMgICAgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmNlLT5pX2NvdW50ICAgID0gMDsgICAgLy8gRklYTUUgd2UgZG8ga25vdyB0aGlzIGFwcHJveAotICAgICAgICAgICAgcmNlLT5pX3RleF9iaXRzID0gMDsKLSAgICAgICAgICAgIHJjZS0+cF90ZXhfYml0cyA9IGJpdHMgKiAwLjk7Ci0gICAgICAgICAgICByY2UtPm12X2JpdHMgICAgPSBiaXRzICogMC4xOwotICAgICAgICB9Ci0gICAgICAgIHJjYy0+aV9jcGx4X3N1bVtwaWN0X3R5cGVdICArPSByY2UtPmlfdGV4X2JpdHMgKiByY2UtPnFzY2FsZTsKLSAgICAgICAgcmNjLT5wX2NwbHhfc3VtW3BpY3RfdHlwZV0gICs9IHJjZS0+cF90ZXhfYml0cyAqIHJjZS0+cXNjYWxlOwotICAgICAgICByY2MtPm12X2JpdHNfc3VtW3BpY3RfdHlwZV0gKz0gcmNlLT5tdl9iaXRzOwotICAgICAgICByY2MtPmZyYW1lX2NvdW50W3BpY3RfdHlwZV0rKzsKLQotICAgICAgICByYXRlX2ZhY3RvciA9IHJjYy0+cGFzczFfd2FudGVkX2JpdHMgLwotICAgICAgICAgICAgICAgICAgICAgIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSAqIGJyX2NvbXBlbnNhdGlvbjsKLQotICAgICAgICBxID0gZ2V0X3FzY2FsZShzLCByY2UsIHJhdGVfZmFjdG9yLCBwaWN0dXJlX251bWJlcik7Ci0gICAgICAgIGlmIChxIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgICAgICBhdl9hc3NlcnQwKHEgPiAwLjApOwotICAgICAgICBxID0gZ2V0X2RpZmZfbGltaXRlZF9xKHMsIHJjZSwgcSk7Ci0gICAgICAgIGF2X2Fzc2VydDAocSA+IDAuMCk7Ci0KLSAgICAgICAgLy8gRklYTUUgdHlwZSBkZXBlbmRlbnQgYmx1ciBsaWtlIGluIDItcGFzcwotICAgICAgICBpZiAocGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8IHMtPmludHJhX29ubHkpIHsKLSAgICAgICAgICAgIHJjYy0+c2hvcnRfdGVybV9xc3VtICAgKj0gYS0+cWJsdXI7Ci0gICAgICAgICAgICByY2MtPnNob3J0X3Rlcm1fcWNvdW50ICo9IGEtPnFibHVyOwotCi0gICAgICAgICAgICByY2MtPnNob3J0X3Rlcm1fcXN1bSArPSBxOwotICAgICAgICAgICAgcmNjLT5zaG9ydF90ZXJtX3Fjb3VudCsrOwotICAgICAgICAgICAgcSA9IHNob3J0X3Rlcm1fcSA9IHJjYy0+c2hvcnRfdGVybV9xc3VtIC8gcmNjLT5zaG9ydF90ZXJtX3Fjb3VudDsKLSAgICAgICAgfQotICAgICAgICBhdl9hc3NlcnQwKHEgPiAwLjApOwotCi0gICAgICAgIHEgPSBtb2RpZnlfcXNjYWxlKHMsIHJjZSwgcSwgcGljdHVyZV9udW1iZXIpOwotCi0gICAgICAgIHJjYy0+cGFzczFfd2FudGVkX2JpdHMgKz0gcy0+Yml0X3JhdGUgLyBmcHM7Ci0KLSAgICAgICAgYXZfYXNzZXJ0MChxID4gMC4wKTsKLSAgICB9Ci0KLSAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUkMpIHsKLSAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAiJWMgcXA6JWQ8JTIuMWY8JWQgJWQgd2FudDolZCB0b3RhbDolZCBjb21wOiVmIHN0X3E6JTIuMmYgIgotICAgICAgICAgICAgICAgInNpemU6JWQgdmFyOiUiUFJJZDY0Ii8lIlBSSWQ2NCIgYnI6JSJQUklkNjQiIGZwczolZFxuIiwKLSAgICAgICAgICAgICAgIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihwaWN0X3R5cGUpLAotICAgICAgICAgICAgICAgcW1pbiwgcSwgcW1heCwgcGljdHVyZV9udW1iZXIsCi0gICAgICAgICAgICAgICAoaW50KXdhbnRlZF9iaXRzIC8gMTAwMCwgKGludClzLT50b3RhbF9iaXRzIC8gMTAwMCwKLSAgICAgICAgICAgICAgIGJyX2NvbXBlbnNhdGlvbiwgc2hvcnRfdGVybV9xLCBzLT5mcmFtZV9iaXRzLAotICAgICAgICAgICAgICAgcGljLT5tYl92YXJfc3VtLCBwaWMtPm1jX21iX3Zhcl9zdW0sCi0gICAgICAgICAgICAgICBzLT5iaXRfcmF0ZSAvIDEwMDAsIChpbnQpZnBzKTsKLSAgICB9Ci0KLSAgICBpZiAocSA8IHFtaW4pCi0gICAgICAgIHEgPSBxbWluOwotICAgIGVsc2UgaWYgKHEgPiBxbWF4KQotICAgICAgICBxID0gcW1heDsKLQotICAgIGlmIChzLT5hZGFwdGl2ZV9xdWFudCkKLSAgICAgICAgYWRhcHRpdmVfcXVhbnRpemF0aW9uKHMsIHEpOwotICAgIGVsc2UKLSAgICAgICAgcSA9IChpbnQpKHEgKyAwLjUpOwotCi0gICAgaWYgKCFkcnlfcnVuKSB7Ci0gICAgICAgIHJjYy0+bGFzdF9xc2NhbGUgICAgICAgID0gcTsKLSAgICAgICAgcmNjLT5sYXN0X21jX21iX3Zhcl9zdW0gPSBwaWMtPm1jX21iX3Zhcl9zdW07Ci0gICAgICAgIHJjYy0+bGFzdF9tYl92YXJfc3VtICAgID0gcGljLT5tYl92YXJfc3VtOwotICAgIH0KICAgICByZXR1cm4gcTsKIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gMi1QYXNzIGNvZGUKLQogc3RhdGljIGludCBpbml0X3Bhc3MyKE1wZWdFbmNDb250ZXh0ICpzKQogewogICAgIFJhdGVDb250cm9sQ29udGV4dCAqcmNjID0gJnMtPnJjX2NvbnRleHQ7CkBAIC0xMDgwLDMgKzQ2OCw1NjEgQEAKIAogICAgIHJldHVybiAwOwogfQorCithdl9jb2xkIGludCBmZl9yYXRlX2NvbnRyb2xfaW5pdChNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBSYXRlQ29udHJvbENvbnRleHQgKnJjYyA9ICZzLT5yY19jb250ZXh0OworICAgIGludCBpLCByZXM7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb25zdF9uYW1lc1tdID0geworICAgICAgICAiUEkiLAorICAgICAgICAiRSIsCisgICAgICAgICJpVGV4IiwKKyAgICAgICAgInBUZXgiLAorICAgICAgICAidGV4IiwKKyAgICAgICAgIm12IiwKKyAgICAgICAgImZDb2RlIiwKKyAgICAgICAgImlDb3VudCIsCisgICAgICAgICJtY1ZhciIsCisgICAgICAgICJ2YXIiLAorICAgICAgICAiaXNJIiwKKyAgICAgICAgImlzUCIsCisgICAgICAgICJpc0IiLAorICAgICAgICAiYXZnUVAiLAorICAgICAgICAicUNvbXAiLAorICAgICAgICAiYXZnSUlUZXgiLAorICAgICAgICAiYXZnUElUZXgiLAorICAgICAgICAiYXZnUFBUZXgiLAorICAgICAgICAiYXZnQlBUZXgiLAorICAgICAgICAiYXZnVGV4IiwKKyAgICAgICAgTlVMTAorICAgIH07CisgICAgc3RhdGljIGRvdWJsZSAoKiBjb25zdCBmdW5jMVtdKSh2b2lkICosIGRvdWJsZSkgPSB7CisgICAgICAgIChkb3VibGUgKCopKHZvaWQgKiwgZG91YmxlKSkgYml0czJxcCwKKyAgICAgICAgKGRvdWJsZSAoKikodm9pZCAqLCBkb3VibGUpKSBxcDJiaXRzLAorICAgICAgICBOVUxMCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGZ1bmMxX25hbWVzW10gPSB7CisgICAgICAgICJiaXRzMnFwIiwKKyAgICAgICAgInFwMmJpdHMiLAorICAgICAgICBOVUxMCisgICAgfTsKKyAgICBlbW1zX2MoKTsKKworICAgIGlmICghcy0+YXZjdHgtPnJjX21heF9hdmFpbGFibGVfdmJ2X3VzZSAmJiBzLT5hdmN0eC0+cmNfYnVmZmVyX3NpemUpIHsKKyAgICAgICAgaWYgKHMtPmF2Y3R4LT5yY19tYXhfcmF0ZSkgeworICAgICAgICAgICAgcy0+YXZjdHgtPnJjX21heF9hdmFpbGFibGVfdmJ2X3VzZSA9IGF2X2NsaXBmKHMtPmF2Y3R4LT5yY19tYXhfcmF0ZS8ocy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplKmdldF9mcHMocy0+YXZjdHgpKSwgMS4wLzMsIDEuMCk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcy0+YXZjdHgtPnJjX21heF9hdmFpbGFibGVfdmJ2X3VzZSA9IDEuMDsKKyAgICB9CisKKyAgICByZXMgPSBhdl9leHByX3BhcnNlKCZyY2MtPnJjX2VxX2V2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5yY19lcSA/IHMtPnJjX2VxIDogInRleF5xQ29tcCIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9uYW1lcywgZnVuYzFfbmFtZXMsIGZ1bmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgMCwgcy0+YXZjdHgpOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyByY19lcSBcIiVzXCJcbiIsIHMtPnJjX2VxKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIHJjYy0+cHJlZFtpXS5jb2VmZiA9IEZGX1FQMkxBTUJEQSAqIDcuMDsKKyAgICAgICAgcmNjLT5wcmVkW2ldLmNvdW50ID0gMS4wOworICAgICAgICByY2MtPnByZWRbaV0uZGVjYXkgPSAwLjQ7CisKKyAgICAgICAgcmNjLT5pX2NwbHhfc3VtIFtpXSA9CisgICAgICAgIHJjYy0+cF9jcGx4X3N1bSBbaV0gPQorICAgICAgICByY2MtPm12X2JpdHNfc3VtW2ldID0KKyAgICAgICAgcmNjLT5xc2NhbGVfc3VtIFtpXSA9CisgICAgICAgIHJjYy0+ZnJhbWVfY291bnRbaV0gPSAxOyAvLyAxIGlzIGJldHRlciBiZWNhdXNlIG9mIDEvMCBhbmQgc3VjaAorCisgICAgICAgIHJjYy0+bGFzdF9xc2NhbGVfZm9yW2ldID0gRkZfUVAyTEFNQkRBICogNTsKKyAgICB9CisgICAgcmNjLT5idWZmZXJfaW5kZXggPSBzLT5hdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5OworICAgIGlmICghcmNjLT5idWZmZXJfaW5kZXgpCisgICAgICAgIHJjYy0+YnVmZmVyX2luZGV4ID0gcy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplICogMyAvIDQ7CisKKyAgICBpZiAocy0+YXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QQVNTMikgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgY2hhciAqcDsKKworICAgICAgICAvKiBmaW5kIG51bWJlciBvZiBwaWNzICovCisgICAgICAgIHAgPSBzLT5hdmN0eC0+c3RhdHNfaW47CisgICAgICAgIGZvciAoaSA9IC0xOyBwOyBpKyspCisgICAgICAgICAgICBwID0gc3RyY2hyKHAgKyAxLCAnOycpOworICAgICAgICBpICs9IHMtPm1heF9iX2ZyYW1lczsKKyAgICAgICAgaWYgKGkgPD0gMCB8fCBpID49IElOVF9NQVggLyBzaXplb2YoUmF0ZUNvbnRyb2xFbnRyeSkpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJjYy0+ZW50cnkgICAgICAgPSBhdl9tYWxsb2N6KGkgKiBzaXplb2YoUmF0ZUNvbnRyb2xFbnRyeSkpOworICAgICAgICBpZiAoIXJjYy0+ZW50cnkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByY2MtPm51bV9lbnRyaWVzID0gaTsKKworICAgICAgICAvKiBpbml0IGFsbCB0byBza2lwcGVkIFAtZnJhbWVzCisgICAgICAgICAqICh3aXRoIEItZnJhbWVzIHdlIG1pZ2h0IGhhdmUgYSBub3QgZW5jb2RlZCBmcmFtZSBhdCB0aGUgZW5kIEZJWE1FKSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcmNjLT5udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICBSYXRlQ29udHJvbEVudHJ5ICpyY2UgPSAmcmNjLT5lbnRyeVtpXTsKKworICAgICAgICAgICAgcmNlLT5waWN0X3R5cGUgID0gcmNlLT5uZXdfcGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX1A7CisgICAgICAgICAgICByY2UtPnFzY2FsZSAgICAgPSByY2UtPm5ld19xc2NhbGUgICAgPSBGRl9RUDJMQU1CREEgKiAyOworICAgICAgICAgICAgcmNlLT5taXNjX2JpdHMgID0gcy0+bWJfbnVtICsgMTA7CisgICAgICAgICAgICByY2UtPm1iX3Zhcl9zdW0gPSBzLT5tYl9udW0gKiAxMDA7CisgICAgICAgIH0KKworICAgICAgICAvKiByZWFkIHN0YXRzICovCisgICAgICAgIHAgPSBzLT5hdmN0eC0+c3RhdHNfaW47CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCByY2MtPm51bV9lbnRyaWVzIC0gcy0+bWF4X2JfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgICAgIFJhdGVDb250cm9sRW50cnkgKnJjZTsKKyAgICAgICAgICAgIGludCBwaWN0dXJlX251bWJlcjsKKyAgICAgICAgICAgIGludCBlOworICAgICAgICAgICAgY2hhciAqbmV4dDsKKworICAgICAgICAgICAgbmV4dCA9IHN0cmNocihwLCAnOycpOworICAgICAgICAgICAgaWYgKG5leHQpIHsKKyAgICAgICAgICAgICAgICAoKm5leHQpID0gMDsgLy8gc3NjYW5mIGlzIHVuYmVsaWV2YWJseSBzbG93IG9uIGxvb29uZyBzdHJpbmdzIC8vIEZJWE1FIGNvcHkgLyBkbyBub3Qgd3JpdGUKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlID0gc3NjYW5mKHAsICIgaW46JWQgIiwgJnBpY3R1cmVfbnVtYmVyKTsKKworICAgICAgICAgICAgYXZfYXNzZXJ0MChwaWN0dXJlX251bWJlciA+PSAwKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocGljdHVyZV9udW1iZXIgPCByY2MtPm51bV9lbnRyaWVzKTsKKyAgICAgICAgICAgIHJjZSA9ICZyY2MtPmVudHJ5W3BpY3R1cmVfbnVtYmVyXTsKKworICAgICAgICAgICAgZSArPSBzc2NhbmYocCwgIiBpbjolKmQgb3V0OiUqZCB0eXBlOiVkIHE6JWYgaXRleDolZCBwdGV4OiVkIG12OiVkIG1pc2M6JWQgZmNvZGU6JWQgYmNvZGU6JWQgbWMtdmFyOiUiU0NOZDY0IiB2YXI6JSJTQ05kNjQiIGljb3VudDolZCBza2lwY291bnQ6JWQgaGJpdHM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJjZS0+cGljdF90eXBlLCAmcmNlLT5xc2NhbGUsICZyY2UtPmlfdGV4X2JpdHMsICZyY2UtPnBfdGV4X2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAmcmNlLT5tdl9iaXRzLCAmcmNlLT5taXNjX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAmcmNlLT5mX2NvZGUsICZyY2UtPmJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyY2UtPm1jX21iX3Zhcl9zdW0sICZyY2UtPm1iX3Zhcl9zdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAmcmNlLT5pX2NvdW50LCAmcmNlLT5za2lwX2NvdW50LCAmcmNlLT5oZWFkZXJfYml0cyk7CisgICAgICAgICAgICBpZiAoZSAhPSAxNCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAic3RhdGlzdGljcyBhcmUgZGFtYWdlZCBhdCBsaW5lICVkLCBwYXJzZXIgb3V0PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBpLCBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluaXRfcGFzczIocykgPCAwKSB7CisgICAgICAgICAgICBmZl9yYXRlX2NvbnRyb2xfdW5pbml0KHMpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCEocy0+YXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19QQVNTMikpIHsKKyAgICAgICAgcmNjLT5zaG9ydF90ZXJtX3FzdW0gICA9IDAuMDAxOworICAgICAgICByY2MtPnNob3J0X3Rlcm1fcWNvdW50ID0gMC4wMDE7CisKKyAgICAgICAgcmNjLT5wYXNzMV9yY19lcV9vdXRwdXRfc3VtID0gMC4wMDE7CisgICAgICAgIHJjYy0+cGFzczFfd2FudGVkX2JpdHMgICAgICA9IDAuMDAxOworCisgICAgICAgIGlmIChzLT5hdmN0eC0+cWJsdXIgPiAxLjApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicWJsdXIgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvKiBpbml0IHN0dWZmIHdpdGggdGhlIHVzZXIgc3BlY2lmaWVkIGNvbXBsZXhpdHkgKi8KKyAgICAgICAgaWYgKHMtPnJjX2luaXRpYWxfY3BseCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDYwICogMzA7IGkrKykgeworICAgICAgICAgICAgICAgIGRvdWJsZSBiaXRzID0gcy0+cmNfaW5pdGlhbF9jcGx4ICogKGkgLyAxMDAwMC4wICsgMS4wKSAqIHMtPm1iX251bTsKKyAgICAgICAgICAgICAgICBSYXRlQ29udHJvbEVudHJ5IHJjZTsKKworICAgICAgICAgICAgICAgIGlmIChpICUgKChzLT5nb3Bfc2l6ZSArIDMpIC8gNCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgcmNlLnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgJSAocy0+bWF4X2JfZnJhbWVzICsgMSkpCisgICAgICAgICAgICAgICAgICAgIHJjZS5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfQjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJjZS5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKworICAgICAgICAgICAgICAgIHJjZS5uZXdfcGljdF90eXBlID0gcmNlLnBpY3RfdHlwZTsKKyAgICAgICAgICAgICAgICByY2UubWNfbWJfdmFyX3N1bSA9IGJpdHMgKiBzLT5tYl9udW0gLyAxMDAwMDA7CisgICAgICAgICAgICAgICAgcmNlLm1iX3Zhcl9zdW0gICAgPSBzLT5tYl9udW07CisKKyAgICAgICAgICAgICAgICByY2UucXNjYWxlICAgID0gRkZfUVAyTEFNQkRBICogMjsKKyAgICAgICAgICAgICAgICByY2UuZl9jb2RlICAgID0gMjsKKyAgICAgICAgICAgICAgICByY2UuYl9jb2RlICAgID0gMTsKKyAgICAgICAgICAgICAgICByY2UubWlzY19iaXRzID0gMTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgICAgICAgICAgICAgcmNlLmlfY291bnQgICAgPSBzLT5tYl9udW07CisgICAgICAgICAgICAgICAgICAgIHJjZS5pX3RleF9iaXRzID0gYml0czsKKyAgICAgICAgICAgICAgICAgICAgcmNlLnBfdGV4X2JpdHMgPSAwOworICAgICAgICAgICAgICAgICAgICByY2UubXZfYml0cyAgICA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmNlLmlfY291bnQgICAgPSAwOyAvLyBGSVhNRSB3ZSBkbyBrbm93IHRoaXMgYXBwcm94CisgICAgICAgICAgICAgICAgICAgIHJjZS5pX3RleF9iaXRzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcmNlLnBfdGV4X2JpdHMgPSBiaXRzICogMC45OworICAgICAgICAgICAgICAgICAgICByY2UubXZfYml0cyAgICA9IGJpdHMgKiAwLjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJjYy0+aV9jcGx4X3N1bVtyY2UucGljdF90eXBlXSAgKz0gcmNlLmlfdGV4X2JpdHMgKiByY2UucXNjYWxlOworICAgICAgICAgICAgICAgIHJjYy0+cF9jcGx4X3N1bVtyY2UucGljdF90eXBlXSAgKz0gcmNlLnBfdGV4X2JpdHMgKiByY2UucXNjYWxlOworICAgICAgICAgICAgICAgIHJjYy0+bXZfYml0c19zdW1bcmNlLnBpY3RfdHlwZV0gKz0gcmNlLm12X2JpdHM7CisgICAgICAgICAgICAgICAgcmNjLT5mcmFtZV9jb3VudFtyY2UucGljdF90eXBlXSsrOworCisgICAgICAgICAgICAgICAgZ2V0X3FzY2FsZShzLCAmcmNlLCByY2MtPnBhc3MxX3dhbnRlZF9iaXRzIC8gcmNjLT5wYXNzMV9yY19lcV9vdXRwdXRfc3VtLCBpKTsKKworICAgICAgICAgICAgICAgIC8vIEZJWE1FIG1pc2JlaGF2ZXMgYSBsaXR0bGUgZm9yIHZhcmlhYmxlIGZwcworICAgICAgICAgICAgICAgIHJjYy0+cGFzczFfd2FudGVkX2JpdHMgKz0gcy0+Yml0X3JhdGUgLyBnZXRfZnBzKHMtPmF2Y3R4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCithdl9jb2xkIHZvaWQgZmZfcmF0ZV9jb250cm9sX3VuaW5pdChNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBSYXRlQ29udHJvbENvbnRleHQgKnJjYyA9ICZzLT5yY19jb250ZXh0OworICAgIGVtbXNfYygpOworCisgICAgYXZfZXhwcl9mcmVlKHJjYy0+cmNfZXFfZXZhbCk7CisgICAgYXZfZnJlZXAoJnJjYy0+ZW50cnkpOworfQorCitpbnQgZmZfdmJ2X3VwZGF0ZShNcGVnRW5jQ29udGV4dCAqcywgaW50IGZyYW1lX3NpemUpCit7CisgICAgUmF0ZUNvbnRyb2xDb250ZXh0ICpyY2MgPSAmcy0+cmNfY29udGV4dDsKKyAgICBjb25zdCBkb3VibGUgZnBzICAgICAgICA9IGdldF9mcHMocy0+YXZjdHgpOworICAgIGNvbnN0IGludCBidWZmZXJfc2l6ZSAgID0gcy0+YXZjdHgtPnJjX2J1ZmZlcl9zaXplOworICAgIGNvbnN0IGRvdWJsZSBtaW5fcmF0ZSAgID0gcy0+YXZjdHgtPnJjX21pbl9yYXRlIC8gZnBzOworICAgIGNvbnN0IGRvdWJsZSBtYXhfcmF0ZSAgID0gcy0+YXZjdHgtPnJjX21heF9yYXRlIC8gZnBzOworCisgICAgZmZfZGxvZyhzLCAiJWQgJWYgJWQgJWYgJWZcbiIsCisgICAgICAgICAgICBidWZmZXJfc2l6ZSwgcmNjLT5idWZmZXJfaW5kZXgsIGZyYW1lX3NpemUsIG1pbl9yYXRlLCBtYXhfcmF0ZSk7CisKKyAgICBpZiAoYnVmZmVyX3NpemUpIHsKKyAgICAgICAgaW50IGxlZnQ7CisKKyAgICAgICAgcmNjLT5idWZmZXJfaW5kZXggLT0gZnJhbWVfc2l6ZTsKKyAgICAgICAgaWYgKHJjYy0+YnVmZmVyX2luZGV4IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJyYyBidWZmZXIgdW5kZXJmbG93XG4iKTsKKyAgICAgICAgICAgIGlmIChmcmFtZV9zaXplID4gbWF4X3JhdGUgJiYgcy0+cXNjYWxlID09IHMtPmF2Y3R4LT5xbWF4KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtYXggYml0cmF0ZSBwb3NzaWJseSB0b28gc21hbGwgb3IgdHJ5IHRyZWxsaXMgd2l0aCBsYXJnZSBsbWF4IG9yIGluY3JlYXNlIHFtYXhcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmNjLT5idWZmZXJfaW5kZXggPSAwOworICAgICAgICB9CisKKyAgICAgICAgbGVmdCA9IGJ1ZmZlcl9zaXplIC0gcmNjLT5idWZmZXJfaW5kZXggLSAxOworICAgICAgICByY2MtPmJ1ZmZlcl9pbmRleCArPSBhdl9jbGlwKGxlZnQsIG1pbl9yYXRlLCBtYXhfcmF0ZSk7CisKKyAgICAgICAgaWYgKHJjYy0+YnVmZmVyX2luZGV4ID4gYnVmZmVyX3NpemUpIHsKKyAgICAgICAgICAgIGludCBzdHVmZmluZyA9IGNlaWwoKHJjYy0+YnVmZmVyX2luZGV4IC0gYnVmZmVyX3NpemUpIC8gOCk7CisKKyAgICAgICAgICAgIGlmIChzdHVmZmluZyA8IDQgJiYgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpCisgICAgICAgICAgICAgICAgc3R1ZmZpbmcgPSA0OworICAgICAgICAgICAgcmNjLT5idWZmZXJfaW5kZXggLT0gOCAqIHN0dWZmaW5nOworCisgICAgICAgICAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUkMpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJzdHVmZmluZyAlZCBieXRlc1xuIiwgc3R1ZmZpbmcpOworCisgICAgICAgICAgICByZXR1cm4gc3R1ZmZpbmc7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBkb3VibGUgcHJlZGljdF9zaXplKFByZWRpY3RvciAqcCwgZG91YmxlIHEsIGRvdWJsZSB2YXIpCit7CisgICAgcmV0dXJuIHAtPmNvZWZmICogdmFyIC8gKHEgKiBwLT5jb3VudCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9wcmVkaWN0b3IoUHJlZGljdG9yICpwLCBkb3VibGUgcSwgZG91YmxlIHZhciwgZG91YmxlIHNpemUpCit7CisgICAgZG91YmxlIG5ld19jb2VmZiA9IHNpemUgKiBxIC8gKHZhciArIDEpOworICAgIGlmICh2YXIgPCAxMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcC0+Y291bnQgKj0gcC0+ZGVjYXk7CisgICAgcC0+Y29lZmYgKj0gcC0+ZGVjYXk7CisgICAgcC0+Y291bnQrKzsKKyAgICBwLT5jb2VmZiArPSBuZXdfY29lZmY7Cit9CisKK3N0YXRpYyB2b2lkIGFkYXB0aXZlX3F1YW50aXphdGlvbihNcGVnRW5jQ29udGV4dCAqcywgZG91YmxlIHEpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgZmxvYXQgbHVtaV9tYXNraW5nICAgICAgICAgPSBzLT5hdmN0eC0+bHVtaV9tYXNraW5nIC8gKDEyOC4wICogMTI4LjApOworICAgIGNvbnN0IGZsb2F0IGRhcmtfbWFza2luZyAgICAgICAgID0gcy0+YXZjdHgtPmRhcmtfbWFza2luZyAvICgxMjguMCAqIDEyOC4wKTsKKyAgICBjb25zdCBmbG9hdCB0ZW1wX2NwbHhfbWFza2luZyAgICA9IHMtPmF2Y3R4LT50ZW1wb3JhbF9jcGx4X21hc2tpbmc7CisgICAgY29uc3QgZmxvYXQgc3BhdGlhbF9jcGx4X21hc2tpbmcgPSBzLT5hdmN0eC0+c3BhdGlhbF9jcGx4X21hc2tpbmc7CisgICAgY29uc3QgZmxvYXQgcF9tYXNraW5nICAgICAgICAgICAgPSBzLT5hdmN0eC0+cF9tYXNraW5nOworICAgIGNvbnN0IGZsb2F0IGJvcmRlcl9tYXNraW5nICAgICAgID0gcy0+Ym9yZGVyX21hc2tpbmc7CisgICAgZmxvYXQgYml0c19zdW0gICAgICAgICAgICAgICAgICAgPSAwLjA7CisgICAgZmxvYXQgY3BseF9zdW0gICAgICAgICAgICAgICAgICAgPSAwLjA7CisgICAgZmxvYXQgKmNwbHhfdGFiICAgICAgICAgICAgICAgICAgPSBzLT5jcGx4X3RhYjsKKyAgICBmbG9hdCAqYml0c190YWIgICAgICAgICAgICAgICAgICA9IHMtPmJpdHNfdGFiOworICAgIGNvbnN0IGludCBxbWluICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPm1iX2xtaW47CisgICAgY29uc3QgaW50IHFtYXggICAgICAgICAgICAgICAgICAgPSBzLT5hdmN0eC0+bWJfbG1heDsKKyAgICBQaWN0dXJlICpjb25zdCBwaWMgICAgICAgICAgICAgICA9ICZzLT5jdXJyZW50X3BpY3R1cmU7CisgICAgY29uc3QgaW50IG1iX3dpZHRoICAgICAgICAgICAgICAgPSBzLT5tYl93aWR0aDsKKyAgICBjb25zdCBpbnQgbWJfaGVpZ2h0ICAgICAgICAgICAgICA9IHMtPm1iX2hlaWdodDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgZmxvYXQgdGVtcF9jcGx4ID0gc3FydChwaWMtPm1jX21iX3ZhclttYl94eV0pOyAvLyBGSVhNRSBtZXJnZSBpbiBwb3coKQorICAgICAgICBmbG9hdCBzcGF0X2NwbHggPSBzcXJ0KHBpYy0+bWJfdmFyW21iX3h5XSk7CisgICAgICAgIGNvbnN0IGludCBsdW1pICA9IHBpYy0+bWJfbWVhblttYl94eV07CisgICAgICAgIGZsb2F0IGJpdHMsIGNwbHgsIGZhY3RvcjsKKyAgICAgICAgaW50IG1iX3ggPSBtYl94eSAlIHMtPm1iX3N0cmlkZTsKKyAgICAgICAgaW50IG1iX3kgPSBtYl94eSAvIHMtPm1iX3N0cmlkZTsKKyAgICAgICAgaW50IG1iX2Rpc3RhbmNlOworICAgICAgICBmbG9hdCBtYl9mYWN0b3IgPSAwLjA7CisgICAgICAgIGlmIChzcGF0X2NwbHggPCA0KQorICAgICAgICAgICAgc3BhdF9jcGx4ID0gNDsgICAgICAgICAgICAgIC8vIEZJWE1FIGZpbmUtdHVuZQorICAgICAgICBpZiAodGVtcF9jcGx4IDwgNCkKKyAgICAgICAgICAgIHRlbXBfY3BseCA9IDQ7ICAgICAgICAgICAgICAvLyBGSVhNRSBmaW5lLXR1bmUKKworICAgICAgICBpZiAoKHMtPm1iX3R5cGVbbWJfeHldICYgQ0FORElEQVRFX01CX1RZUEVfSU5UUkEpKSB7IC8vIEZJWE1FIGhxIG1vZGUKKyAgICAgICAgICAgIGNwbHggICA9IHNwYXRfY3BseDsKKyAgICAgICAgICAgIGZhY3RvciA9IDEuMCArIHBfbWFza2luZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNwbHggICA9IHRlbXBfY3BseDsKKyAgICAgICAgICAgIGZhY3RvciA9IHBvdyh0ZW1wX2NwbHgsIC10ZW1wX2NwbHhfbWFza2luZyk7CisgICAgICAgIH0KKyAgICAgICAgZmFjdG9yICo9IHBvdyhzcGF0X2NwbHgsIC1zcGF0aWFsX2NwbHhfbWFza2luZyk7CisKKyAgICAgICAgaWYgKGx1bWkgPiAxMjcpCisgICAgICAgICAgICBmYWN0b3IgKj0gKDEuMCAtIChsdW1pIC0gMTI4KSAqIChsdW1pIC0gMTI4KSAqIGx1bWlfbWFza2luZyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhY3RvciAqPSAoMS4wIC0gKGx1bWkgLSAxMjgpICogKGx1bWkgLSAxMjgpICogZGFya19tYXNraW5nKTsKKworICAgICAgICBpZiAobWJfeCA8IG1iX3dpZHRoIC8gNSkgeworICAgICAgICAgICAgbWJfZGlzdGFuY2UgPSBtYl93aWR0aCAvIDUgLSBtYl94OworICAgICAgICAgICAgbWJfZmFjdG9yICAgPSAoZmxvYXQpbWJfZGlzdGFuY2UgLyAoZmxvYXQpKG1iX3dpZHRoIC8gNSk7CisgICAgICAgIH0gZWxzZSBpZiAobWJfeCA+IDQgKiBtYl93aWR0aCAvIDUpIHsKKyAgICAgICAgICAgIG1iX2Rpc3RhbmNlID0gbWJfeCAtIDQgKiBtYl93aWR0aCAvIDU7CisgICAgICAgICAgICBtYl9mYWN0b3IgICA9IChmbG9hdCltYl9kaXN0YW5jZSAvIChmbG9hdCkobWJfd2lkdGggLyA1KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWJfeSA8IG1iX2hlaWdodCAvIDUpIHsKKyAgICAgICAgICAgIG1iX2Rpc3RhbmNlID0gbWJfaGVpZ2h0IC8gNSAtIG1iX3k7CisgICAgICAgICAgICBtYl9mYWN0b3IgICA9IEZGTUFYKG1iX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KW1iX2Rpc3RhbmNlIC8gKGZsb2F0KShtYl9oZWlnaHQgLyA1KSk7CisgICAgICAgIH0gZWxzZSBpZiAobWJfeSA+IDQgKiBtYl9oZWlnaHQgLyA1KSB7CisgICAgICAgICAgICBtYl9kaXN0YW5jZSA9IG1iX3kgLSA0ICogbWJfaGVpZ2h0IC8gNTsKKyAgICAgICAgICAgIG1iX2ZhY3RvciAgID0gRkZNQVgobWJfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpbWJfZGlzdGFuY2UgLyAoZmxvYXQpKG1iX2hlaWdodCAvIDUpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZhY3RvciAqPSAxLjAgLSBib3JkZXJfbWFza2luZyAqIG1iX2ZhY3RvcjsKKworICAgICAgICBpZiAoZmFjdG9yIDwgMC4wMDAwMSkKKyAgICAgICAgICAgIGZhY3RvciA9IDAuMDAwMDE7CisKKyAgICAgICAgYml0cyAgICAgICAgPSBjcGx4ICogZmFjdG9yOworICAgICAgICBjcGx4X3N1bSAgICs9IGNwbHg7CisgICAgICAgIGJpdHNfc3VtICAgKz0gYml0czsKKyAgICAgICAgY3BseF90YWJbaV0gPSBjcGx4OworICAgICAgICBiaXRzX3RhYltpXSA9IGJpdHM7CisgICAgfQorCisgICAgLyogaGFuZGxlIHFtaW4vcW1heCBjbGlwcGluZyAqLworICAgIGlmIChzLT5tcHZfZmxhZ3MgJiBGRl9NUFZfRkxBR19OQVEpIHsKKyAgICAgICAgZmxvYXQgZmFjdG9yID0gYml0c19zdW0gLyBjcGx4X3N1bTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm1iX251bTsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCBuZXdxID0gcSAqIGNwbHhfdGFiW2ldIC8gYml0c190YWJbaV07CisgICAgICAgICAgICBuZXdxICo9IGZhY3RvcjsKKworICAgICAgICAgICAgaWYgKG5ld3EgPiBxbWF4KSB7CisgICAgICAgICAgICAgICAgYml0c19zdW0gLT0gYml0c190YWJbaV07CisgICAgICAgICAgICAgICAgY3BseF9zdW0gLT0gY3BseF90YWJbaV0gKiBxIC8gcW1heDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmV3cSA8IHFtaW4pIHsKKyAgICAgICAgICAgICAgICBiaXRzX3N1bSAtPSBiaXRzX3RhYltpXTsKKyAgICAgICAgICAgICAgICBjcGx4X3N1bSAtPSBjcGx4X3RhYltpXSAqIHEgLyBxbWluOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChiaXRzX3N1bSA8IDAuMDAxKQorICAgICAgICAgICAgYml0c19zdW0gPSAwLjAwMTsKKyAgICAgICAgaWYgKGNwbHhfc3VtIDwgMC4wMDEpCisgICAgICAgICAgICBjcGx4X3N1bSA9IDAuMDAxOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5tYl9udW07IGkrKykgeworICAgICAgICBjb25zdCBpbnQgbWJfeHkgPSBzLT5tYl9pbmRleDJ4eVtpXTsKKyAgICAgICAgZmxvYXQgbmV3cSAgICAgID0gcSAqIGNwbHhfdGFiW2ldIC8gYml0c190YWJbaV07CisgICAgICAgIGludCBpbnRxOworCisgICAgICAgIGlmIChzLT5tcHZfZmxhZ3MgJiBGRl9NUFZfRkxBR19OQVEpIHsKKyAgICAgICAgICAgIG5ld3EgKj0gYml0c19zdW0gLyBjcGx4X3N1bTsKKyAgICAgICAgfQorCisgICAgICAgIGludHEgPSAoaW50KShuZXdxICsgMC41KTsKKworICAgICAgICBpZiAoaW50cSA+IHFtYXgpCisgICAgICAgICAgICBpbnRxID0gcW1heDsKKyAgICAgICAgZWxzZSBpZiAoaW50cSA8IHFtaW4pCisgICAgICAgICAgICBpbnRxID0gcW1pbjsKKyAgICAgICAgcy0+bGFtYmRhX3RhYmxlW21iX3h5XSA9IGludHE7CisgICAgfQorfQorCit2b2lkIGZmX2dldF8ycGFzc19mY29kZShNcGVnRW5jQ29udGV4dCAqcykKK3sKKyAgICBSYXRlQ29udHJvbENvbnRleHQgKnJjYyA9ICZzLT5yY19jb250ZXh0OworICAgIFJhdGVDb250cm9sRW50cnkgKnJjZSAgID0gJnJjYy0+ZW50cnlbcy0+cGljdHVyZV9udW1iZXJdOworCisgICAgcy0+Zl9jb2RlID0gcmNlLT5mX2NvZGU7CisgICAgcy0+Yl9jb2RlID0gcmNlLT5iX2NvZGU7Cit9CisKKy8vIEZJWE1FIHJkIG9yIGF0IGxlYXN0IGFwcHJveCBmb3IgZHF1YW50CisKK2Zsb2F0IGZmX3JhdGVfZXN0aW1hdGVfcXNjYWxlKE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgZHJ5X3J1bikKK3sKKyAgICBmbG9hdCBxOworICAgIGludCBxbWluLCBxbWF4OworICAgIGZsb2F0IGJyX2NvbXBlbnNhdGlvbjsKKyAgICBkb3VibGUgZGlmZjsKKyAgICBkb3VibGUgc2hvcnRfdGVybV9xOworICAgIGRvdWJsZSBmcHM7CisgICAgaW50IHBpY3R1cmVfbnVtYmVyID0gcy0+cGljdHVyZV9udW1iZXI7CisgICAgaW50NjRfdCB3YW50ZWRfYml0czsKKyAgICBSYXRlQ29udHJvbENvbnRleHQgKnJjYyA9ICZzLT5yY19jb250ZXh0OworICAgIEFWQ29kZWNDb250ZXh0ICphICAgICAgID0gcy0+YXZjdHg7CisgICAgUmF0ZUNvbnRyb2xFbnRyeSBsb2NhbF9yY2UsICpyY2U7CisgICAgZG91YmxlIGJpdHM7CisgICAgZG91YmxlIHJhdGVfZmFjdG9yOworICAgIGludDY0X3QgdmFyOworICAgIGNvbnN0IGludCBwaWN0X3R5cGUgPSBzLT5waWN0X3R5cGU7CisgICAgUGljdHVyZSAqIGNvbnN0IHBpYyA9ICZzLT5jdXJyZW50X3BpY3R1cmU7CisgICAgZW1tc19jKCk7CisKKyAgICBnZXRfcW1pbm1heCgmcW1pbiwgJnFtYXgsIHMsIHBpY3RfdHlwZSk7CisKKyAgICBmcHMgPSBnZXRfZnBzKHMtPmF2Y3R4KTsKKyAgICAvKiB1cGRhdGUgcHJlZGljdG9ycyAqLworICAgIGlmIChwaWN0dXJlX251bWJlciA+IDIgJiYgIWRyeV9ydW4pIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBsYXN0X3ZhciA9CisgICAgICAgICAgICBzLT5sYXN0X3BpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSA/IHJjYy0+bGFzdF9tYl92YXJfc3VtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJjYy0+bGFzdF9tY19tYl92YXJfc3VtOworICAgICAgICBhdl9hc3NlcnQxKHMtPmZyYW1lX2JpdHMgPj0gcy0+c3R1ZmZpbmdfYml0cyk7CisgICAgICAgIHVwZGF0ZV9wcmVkaWN0b3IoJnJjYy0+cHJlZFtzLT5sYXN0X3BpY3RfdHlwZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgcmNjLT5sYXN0X3FzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcXJ0KGxhc3RfdmFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9iaXRzIC0gcy0+c3R1ZmZpbmdfYml0cyk7CisgICAgfQorCisgICAgaWYgKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzIpIHsKKyAgICAgICAgYXZfYXNzZXJ0MChwaWN0dXJlX251bWJlciA+PSAwKTsKKyAgICAgICAgaWYgKHBpY3R1cmVfbnVtYmVyID49IHJjYy0+bnVtX2VudHJpZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnB1dCBpcyBsb25nZXIgdGhhbiAyLXBhc3MgbG9nIGZpbGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHJjZSAgICAgICAgID0gJnJjYy0+ZW50cnlbcGljdHVyZV9udW1iZXJdOworICAgICAgICB3YW50ZWRfYml0cyA9IHJjZS0+ZXhwZWN0ZWRfYml0czsKKyAgICB9IGVsc2UgeworICAgICAgICBQaWN0dXJlICpkdHNfcGljOworICAgICAgICByY2UgPSAmbG9jYWxfcmNlOworCisgICAgICAgIC8qIEZJWE1FIGFkZCBhIGR0cyBmaWVsZCB0byBBVkZyYW1lIGFuZCBlbnN1cmUgaXQgaXMgc2V0IGFuZCB1c2UgaXQKKyAgICAgICAgICogaGVyZSBpbnN0ZWFkIG9mIHJlb3JkZXJpbmcgYnV0IHRoZSByZW9yZGVyaW5nIGlzIHNpbXBsZXIgZm9yIG5vdworICAgICAgICAgKiB1bnRpbCBILjI2NCBCLXB5cmFtaWQgbXVzdCBiZSBoYW5kbGVkLiAqLworICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CIHx8IHMtPmxvd19kZWxheSkKKyAgICAgICAgICAgIGR0c19waWMgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkdHNfcGljID0gcy0+bGFzdF9waWN0dXJlX3B0cjsKKworICAgICAgICBpZiAoIWR0c19waWMgfHwgZHRzX3BpYy0+Zi0+cHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgd2FudGVkX2JpdHMgPSAodWludDY0X3QpKHMtPmJpdF9yYXRlICogKGRvdWJsZSlwaWN0dXJlX251bWJlciAvIGZwcyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdhbnRlZF9iaXRzID0gKHVpbnQ2NF90KShzLT5iaXRfcmF0ZSAqIChkb3VibGUpZHRzX3BpYy0+Zi0+cHRzIC8gZnBzKTsKKyAgICB9CisKKyAgICBkaWZmID0gcy0+dG90YWxfYml0cyAtIHdhbnRlZF9iaXRzOworICAgIGJyX2NvbXBlbnNhdGlvbiA9IChhLT5iaXRfcmF0ZV90b2xlcmFuY2UgLSBkaWZmKSAvIGEtPmJpdF9yYXRlX3RvbGVyYW5jZTsKKyAgICBpZiAoYnJfY29tcGVuc2F0aW9uIDw9IDAuMCkKKyAgICAgICAgYnJfY29tcGVuc2F0aW9uID0gMC4wMDE7CisKKyAgICB2YXIgPSBwaWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kgPyBwaWMtPm1iX3Zhcl9zdW0gOiBwaWMtPm1jX21iX3Zhcl9zdW07CisKKyAgICBzaG9ydF90ZXJtX3EgPSAwOyAvKiBhdm9pZCB3YXJuaW5nICovCisgICAgaWYgKHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUEFTUzIpIHsKKyAgICAgICAgaWYgKHBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocGljdF90eXBlID09IHJjZS0+bmV3X3BpY3RfdHlwZSk7CisKKyAgICAgICAgcSA9IHJjZS0+bmV3X3FzY2FsZSAvIGJyX2NvbXBlbnNhdGlvbjsKKyAgICAgICAgZmZfZGxvZyhzLCAiJWYgJWYgJWYgbGFzdDolZCB2YXI6JSJQUklkNjQiIHR5cGU6JWQvL1xuIiwgcSwgcmNlLT5uZXdfcXNjYWxlLAorICAgICAgICAgICAgICAgIGJyX2NvbXBlbnNhdGlvbiwgcy0+ZnJhbWVfYml0cywgdmFyLCBwaWN0X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJjZS0+cGljdF90eXBlICAgICA9CisgICAgICAgIHJjZS0+bmV3X3BpY3RfdHlwZSA9IHBpY3RfdHlwZTsKKyAgICAgICAgcmNlLT5tY19tYl92YXJfc3VtID0gcGljLT5tY19tYl92YXJfc3VtOworICAgICAgICByY2UtPm1iX3Zhcl9zdW0gICAgPSBwaWMtPm1iX3Zhcl9zdW07CisgICAgICAgIHJjZS0+cXNjYWxlICAgICAgICA9IEZGX1FQMkxBTUJEQSAqIDI7CisgICAgICAgIHJjZS0+Zl9jb2RlICAgICAgICA9IHMtPmZfY29kZTsKKyAgICAgICAgcmNlLT5iX2NvZGUgICAgICAgID0gcy0+Yl9jb2RlOworICAgICAgICByY2UtPm1pc2NfYml0cyAgICAgPSAxOworCisgICAgICAgIGJpdHMgPSBwcmVkaWN0X3NpemUoJnJjYy0+cHJlZFtwaWN0X3R5cGVdLCByY2UtPnFzY2FsZSwgc3FydCh2YXIpKTsKKyAgICAgICAgaWYgKHBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgICAgICAgICAgcmNlLT5pX2NvdW50ICAgID0gcy0+bWJfbnVtOworICAgICAgICAgICAgcmNlLT5pX3RleF9iaXRzID0gYml0czsKKyAgICAgICAgICAgIHJjZS0+cF90ZXhfYml0cyA9IDA7CisgICAgICAgICAgICByY2UtPm12X2JpdHMgICAgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmNlLT5pX2NvdW50ICAgID0gMDsgICAgLy8gRklYTUUgd2UgZG8ga25vdyB0aGlzIGFwcHJveAorICAgICAgICAgICAgcmNlLT5pX3RleF9iaXRzID0gMDsKKyAgICAgICAgICAgIHJjZS0+cF90ZXhfYml0cyA9IGJpdHMgKiAwLjk7CisgICAgICAgICAgICByY2UtPm12X2JpdHMgICAgPSBiaXRzICogMC4xOworICAgICAgICB9CisgICAgICAgIHJjYy0+aV9jcGx4X3N1bVtwaWN0X3R5cGVdICArPSByY2UtPmlfdGV4X2JpdHMgKiByY2UtPnFzY2FsZTsKKyAgICAgICAgcmNjLT5wX2NwbHhfc3VtW3BpY3RfdHlwZV0gICs9IHJjZS0+cF90ZXhfYml0cyAqIHJjZS0+cXNjYWxlOworICAgICAgICByY2MtPm12X2JpdHNfc3VtW3BpY3RfdHlwZV0gKz0gcmNlLT5tdl9iaXRzOworICAgICAgICByY2MtPmZyYW1lX2NvdW50W3BpY3RfdHlwZV0rKzsKKworICAgICAgICByYXRlX2ZhY3RvciA9IHJjYy0+cGFzczFfd2FudGVkX2JpdHMgLworICAgICAgICAgICAgICAgICAgICAgIHJjYy0+cGFzczFfcmNfZXFfb3V0cHV0X3N1bSAqIGJyX2NvbXBlbnNhdGlvbjsKKworICAgICAgICBxID0gZ2V0X3FzY2FsZShzLCByY2UsIHJhdGVfZmFjdG9yLCBwaWN0dXJlX251bWJlcik7CisgICAgICAgIGlmIChxIDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBhdl9hc3NlcnQwKHEgPiAwLjApOworICAgICAgICBxID0gZ2V0X2RpZmZfbGltaXRlZF9xKHMsIHJjZSwgcSk7CisgICAgICAgIGF2X2Fzc2VydDAocSA+IDAuMCk7CisKKyAgICAgICAgLy8gRklYTUUgdHlwZSBkZXBlbmRlbnQgYmx1ciBsaWtlIGluIDItcGFzcworICAgICAgICBpZiAocGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8IHMtPmludHJhX29ubHkpIHsKKyAgICAgICAgICAgIHJjYy0+c2hvcnRfdGVybV9xc3VtICAgKj0gYS0+cWJsdXI7CisgICAgICAgICAgICByY2MtPnNob3J0X3Rlcm1fcWNvdW50ICo9IGEtPnFibHVyOworCisgICAgICAgICAgICByY2MtPnNob3J0X3Rlcm1fcXN1bSArPSBxOworICAgICAgICAgICAgcmNjLT5zaG9ydF90ZXJtX3Fjb3VudCsrOworICAgICAgICAgICAgcSA9IHNob3J0X3Rlcm1fcSA9IHJjYy0+c2hvcnRfdGVybV9xc3VtIC8gcmNjLT5zaG9ydF90ZXJtX3Fjb3VudDsKKyAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQwKHEgPiAwLjApOworCisgICAgICAgIHEgPSBtb2RpZnlfcXNjYWxlKHMsIHJjZSwgcSwgcGljdHVyZV9udW1iZXIpOworCisgICAgICAgIHJjYy0+cGFzczFfd2FudGVkX2JpdHMgKz0gcy0+Yml0X3JhdGUgLyBmcHM7CisKKyAgICAgICAgYXZfYXNzZXJ0MChxID4gMC4wKTsKKyAgICB9CisKKyAgICBpZiAocy0+YXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUkMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiJWMgcXA6JWQ8JTIuMWY8JWQgJWQgd2FudDolZCB0b3RhbDolZCBjb21wOiVmIHN0X3E6JTIuMmYgIgorICAgICAgICAgICAgICAgInNpemU6JWQgdmFyOiUiUFJJZDY0Ii8lIlBSSWQ2NCIgYnI6JSJQUklkNjQiIGZwczolZFxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waWN0dXJlX3R5cGVfY2hhcihwaWN0X3R5cGUpLAorICAgICAgICAgICAgICAgcW1pbiwgcSwgcW1heCwgcGljdHVyZV9udW1iZXIsCisgICAgICAgICAgICAgICAoaW50KXdhbnRlZF9iaXRzIC8gMTAwMCwgKGludClzLT50b3RhbF9iaXRzIC8gMTAwMCwKKyAgICAgICAgICAgICAgIGJyX2NvbXBlbnNhdGlvbiwgc2hvcnRfdGVybV9xLCBzLT5mcmFtZV9iaXRzLAorICAgICAgICAgICAgICAgcGljLT5tYl92YXJfc3VtLCBwaWMtPm1jX21iX3Zhcl9zdW0sCisgICAgICAgICAgICAgICBzLT5iaXRfcmF0ZSAvIDEwMDAsIChpbnQpZnBzKTsKKyAgICB9CisKKyAgICBpZiAocSA8IHFtaW4pCisgICAgICAgIHEgPSBxbWluOworICAgIGVsc2UgaWYgKHEgPiBxbWF4KQorICAgICAgICBxID0gcW1heDsKKworICAgIGlmIChzLT5hZGFwdGl2ZV9xdWFudCkKKyAgICAgICAgYWRhcHRpdmVfcXVhbnRpemF0aW9uKHMsIHEpOworICAgIGVsc2UKKyAgICAgICAgcSA9IChpbnQpKHEgKyAwLjUpOworCisgICAgaWYgKCFkcnlfcnVuKSB7CisgICAgICAgIHJjYy0+bGFzdF9xc2NhbGUgICAgICAgID0gcTsKKyAgICAgICAgcmNjLT5sYXN0X21jX21iX3Zhcl9zdW0gPSBwaWMtPm1jX21iX3Zhcl9zdW07CisgICAgICAgIHJjYy0+bGFzdF9tYl92YXJfc3VtICAgID0gcGljLT5tYl92YXJfc3VtOworICAgIH0KKyAgICByZXR1cm4gcTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmF0ZWNvbnRyb2wuaCBiL2xpYmF2Y29kZWMvcmF0ZWNvbnRyb2wuaAppbmRleCBlZWI0YmI5Li4yYTdhYWVjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JhdGVjb250cm9sLmgKKysrIGIvbGliYXZjb2RlYy9yYXRlY29udHJvbC5oCkBAIC02OCw3ICs2OCw3IEBACiAgICAgZG91YmxlIHNob3J0X3Rlcm1fcXN1bTsgICAgICAgLy8vPCBzdW0gb2YgcmVjZW50IHFzY2FsZXMKICAgICBkb3VibGUgc2hvcnRfdGVybV9xY291bnQ7ICAgICAvLy88IGNvdW50IG9mIHJlY2VudCBxc2NhbGVzCiAgICAgZG91YmxlIHBhc3MxX3JjX2VxX291dHB1dF9zdW07Ly8vPCBzdW0gb2YgdGhlIG91dHB1dCBvZiB0aGUgcmMgZXF1YXRpb24sIHRoaXMgaXMgdXNlZCBmb3Igbm9ybWFsaXphdGlvbgotICAgIGRvdWJsZSBwYXNzMV93YW50ZWRfYml0czsgICAgIC8vLzwgYml0cyB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIG91dHB1dGVkIGJ5IHRoZSBwYXNzMSBjb2RlIChpbmNsdWRpbmcgY29tcGxleGl0eSBpbml0KQorICAgIGRvdWJsZSBwYXNzMV93YW50ZWRfYml0czsgICAgIC8vLzwgYml0cyB3aGljaCBzaG91bGQgaGF2ZSBiZWVuIG91dHB1dCBieSB0aGUgcGFzczEgY29kZSAoaW5jbHVkaW5nIGNvbXBsZXhpdHkgaW5pdCkKICAgICBkb3VibGUgbGFzdF9xc2NhbGU7CiAgICAgZG91YmxlIGxhc3RfcXNjYWxlX2Zvcls1XTsgICAgLy8vPCBsYXN0IHFzY2FsZSBmb3IgYSBzcGVjaWZpYyBwaWN0IHR5cGUsIHVzZWQgZm9yIG1heF9kaWZmICYgaXBiIGZhY3RvciBzdHVmZgogICAgIGludDY0X3QgbGFzdF9tY19tYl92YXJfc3VtOwpAQCAtOTYsOCArOTYsNCBAQAogaW50IGZmX3Zidl91cGRhdGUoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgZnJhbWVfc2l6ZSk7CiB2b2lkIGZmX2dldF8ycGFzc19mY29kZShzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMpOwogCi1pbnQgZmZfeHZpZF9yYXRlX2NvbnRyb2xfaW5pdChzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQgKnMpOwotdm9pZCBmZl94dmlkX3JhdGVfY29udHJvbF91bmluaXQoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzKTsKLWZsb2F0IGZmX3h2aWRfcmF0ZV9lc3RpbWF0ZV9xc2NhbGUoc3RydWN0IE1wZWdFbmNDb250ZXh0ICpzLCBpbnQgZHJ5X3J1bik7Ci0KICNlbmRpZiAvKiBBVkNPREVDX1JBVEVDT05UUk9MX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmF3LmMgYi9saWJhdmNvZGVjL3Jhdy5jCmluZGV4IGJmYTI1MzcuLjhkYTJhOTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmF3LmMKKysrIGIvbGliYXZjb2RlYy9yYXcuYwpAQCAtMzEsNiArMzEsNyBAQAogY29uc3QgUGl4ZWxGb3JtYXRUYWcgZmZfcmF3X3BpeF9mbXRfdGFnc1tdID0gewogICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBNS1RBRygnSScsICc0JywgJzInLCAnMCcpIH0sIC8qIFBsYW5hciBmb3JtYXRzICovCiAgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAsIE1LVEFHKCdJJywgJ1knLCAnVScsICdWJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUCwgTUtUQUcoJ3knLCAndicsICcxJywgJzInKSB9LAogICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCBNS1RBRygnWScsICdWJywgJzEnLCAnMicpIH0sCiAgICAgeyBBVl9QSVhfRk1UX1lVVjQxMFAsIE1LVEFHKCdZJywgJ1UnLCAnVicsICc5JykgfSwKICAgICB7IEFWX1BJWF9GTVRfWVVWNDEwUCwgTUtUQUcoJ1knLCAnVicsICdVJywgJzknKSB9LApAQCAtMTE4LDYgKzExOSwxMiBAQAogICAgIHsgQVZfUElYX0ZNVF9SR0I0OEJFLCAgTUtUQUcoIDQ4LCAnUicsICdHJywgJ0InKSB9LAogICAgIHsgQVZfUElYX0ZNVF9CR1I0OExFLCAgTUtUQUcoJ0InLCAnRycsICdSJywgNDggKSB9LAogICAgIHsgQVZfUElYX0ZNVF9CR1I0OEJFLCAgTUtUQUcoIDQ4LCAnQicsICdHJywgJ1InKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZOUxFLCAgICAgTUtUQUcoJ1knLCAnMScsICAwICwgIDkgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZOUJFLCAgICAgTUtUQUcoIDkgLCAgMCAsICcxJywgJ1knKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZMTBMRSwgICAgTUtUQUcoJ1knLCAnMScsICAwICwgMTAgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZMTBCRSwgICAgTUtUQUcoMTAgLCAgMCAsICcxJywgJ1knKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZMTJMRSwgICAgTUtUQUcoJ1knLCAnMScsICAwICwgMTIgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HUkFZMTJCRSwgICAgTUtUQUcoMTIgLCAgMCAsICcxJywgJ1knKSB9LAogICAgIHsgQVZfUElYX0ZNVF9HUkFZMTZMRSwgICAgTUtUQUcoJ1knLCAnMScsICAwICwgMTYgKSB9LAogICAgIHsgQVZfUElYX0ZNVF9HUkFZMTZCRSwgICAgTUtUQUcoMTYgLCAgMCAsICcxJywgJ1knKSB9LAogICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQOUxFLCAgTUtUQUcoJ1knLCAnMycsIDExICwgIDkgKSB9LApAQCAtMTg3LDYgKzE5NCwxNCBAQAogICAgIHsgQVZfUElYX0ZNVF9HQlJQMTZMRSwgICAgIE1LVEFHKCdHJywgJzMnLCAwMCAsIDE2ICkgfSwKICAgICB7IEFWX1BJWF9GTVRfR0JSUDE2QkUsICAgICBNS1RBRygxNiAsIDAwICwgJzMnLCAnRycpIH0sCiAKKyAgICB7IEFWX1BJWF9GTVRfR0JSQVAsICAgICAgICBNS1RBRygnRycsICc0JywgMDAgLCAgOCApIH0sCisgICAgeyBBVl9QSVhfRk1UX0dCUkFQMTBMRSwgICAgTUtUQUcoJ0cnLCAnNCcsIDAwICwgMTAgKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HQlJBUDEwQkUsICAgIE1LVEFHKDEwICwgMDAgLCAnNCcsICdHJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfR0JSQVAxMkxFLCAgICBNS1RBRygnRycsICc0JywgMDAgLCAxMiApIH0sCisgICAgeyBBVl9QSVhfRk1UX0dCUkFQMTJCRSwgICAgTUtUQUcoMTIgLCAwMCAsICc0JywgJ0cnKSB9LAorICAgIHsgQVZfUElYX0ZNVF9HQlJBUDE2TEUsICAgIE1LVEFHKCdHJywgJzQnLCAwMCAsIDE2ICkgfSwKKyAgICB7IEFWX1BJWF9GTVRfR0JSQVAxNkJFLCAgICBNS1RBRygxNiAsIDAwICwgJzQnLCAnRycpIH0sCisKICAgICB7IEFWX1BJWF9GTVRfWFlaMTJMRSwgICAgICBNS1RBRygnWCcsICdZJywgJ1onICwgMzYgKSB9LAogICAgIHsgQVZfUElYX0ZNVF9YWVoxMkJFLCAgICAgIE1LVEFHKDM2ICwgJ1onICwgJ1knLCAnWCcpIH0sCiAKQEAgLTIyNCw2ICsyMzksNyBAQAogICAgIHsgQVZfUElYX0ZNVF9BQkdSLCAgICBNS1RBRygnQScsICdCJywgJ0cnLCAnUicpIH0sCiAgICAgeyBBVl9QSVhfRk1UX0dSQVkxNkJFLE1LVEFHKCdiJywgJzEnLCAnNicsICdnJykgfSwKICAgICB7IEFWX1BJWF9GTVRfUkdCNDhCRSwgTUtUQUcoJ2InLCAnNCcsICc4JywgJ3InKSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0JBNjRCRSxNS1RBRygnYicsICc2JywgJzQnLCAnYScpIH0sCiAKICAgICAvKiB2bGMgKi8KICAgICB7IEFWX1BJWF9GTVRfWVVWNDEwUCwgICAgIE1LVEFHKCdJJywgJzQnLCAnMScsICcwJykgfSwKQEAgLTI1Niw2ICsyNzIsMTQgQEAKICAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwQkUsIE1LVEFHKCdJJywgJzInLCAnQScsICdCJykgfSwKICAgICB7IEFWX1BJWF9GTVRfWVVWNDQ0UDEwTEUsIE1LVEFHKCdJJywgJzQnLCAnQScsICdMJykgfSwKICAgICB7IEFWX1BJWF9GTVRfWVVWNDQ0UDEwQkUsIE1LVEFHKCdJJywgJzQnLCAnQScsICdCJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUDEyTEUsIE1LVEFHKCdJJywgJzAnLCAnQycsICdMJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUDEyQkUsIE1LVEFHKCdJJywgJzAnLCAnQycsICdCJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEyTEUsIE1LVEFHKCdJJywgJzInLCAnQycsICdMJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEyQkUsIE1LVEFHKCdJJywgJzInLCAnQycsICdCJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDQ0UDEyTEUsIE1LVEFHKCdJJywgJzQnLCAnQycsICdMJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDQ0UDEyQkUsIE1LVEFHKCdJJywgJzQnLCAnQycsICdCJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUDE2TEUsIE1LVEFHKCdJJywgJzAnLCAnRicsICdMJykgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUDE2QkUsIE1LVEFHKCdJJywgJzAnLCAnRicsICdCJykgfSwKICAgICB7IEFWX1BJWF9GTVRfWVVWNDQ0UDE2TEUsIE1LVEFHKCdJJywgJzQnLCAnRicsICdMJykgfSwKICAgICB7IEFWX1BJWF9GTVRfWVVWNDQ0UDE2QkUsIE1LVEFHKCdJJywgJzQnLCAnRicsICdCJykgfSwKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yYXcuaCBiL2xpYmF2Y29kZWMvcmF3LmgKaW5kZXggMjRiZjRjYy4uMjhhMjdiMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9yYXcuaAorKysgYi9saWJhdmNvZGVjL3Jhdy5oCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIEFWQ09ERUNfUkFXX0gKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogCiB0eXBlZGVmIHN0cnVjdCBQaXhlbEZvcm1hdFRhZyB7CkBAIC00MSw3ICs0Miw3IEBACiAKIGVudW0gQVZQaXhlbEZvcm1hdCBhdnByaXZfZmluZF9waXhfZm10KGNvbnN0IFBpeGVsRm9ybWF0VGFnICp0YWdzLCB1bnNpZ25lZCBpbnQgZm91cmNjKTsKIAotZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCBQaXhlbEZvcm1hdFRhZyBhdnByaXZfcGl4X2ZtdF9icHNfYXZpW107Ci1leHRlcm4gYXZfZXhwb3J0IGNvbnN0IFBpeGVsRm9ybWF0VGFnIGF2cHJpdl9waXhfZm10X2Jwc19tb3ZbXTsKK2V4dGVybiBhdl9leHBvcnRfYXZjb2RlYyBjb25zdCBQaXhlbEZvcm1hdFRhZyBhdnByaXZfcGl4X2ZtdF9icHNfYXZpW107CitleHRlcm4gYXZfZXhwb3J0X2F2Y29kZWMgY29uc3QgUGl4ZWxGb3JtYXRUYWcgYXZwcml2X3BpeF9mbXRfYnBzX21vdltdOwogCiAjZW5kaWYgLyogQVZDT0RFQ19SQVdfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yYXdkZWMuYyBiL2xpYmF2Y29kZWMvcmF3ZGVjLmMKaW5kZXggMjg3YmU5Ni4uNTNmNWI3NiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9yYXdkZWMuYworKysgYi9saWJhdmNvZGVjL3Jhd2RlYy5jCkBAIC05MiwxMiArOTIsMTQgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBpZiAoZGVzYy0+ZmxhZ3MgJiAoQVZfUElYX0ZNVF9GTEFHX1BBTCB8IEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwpKSB7CisgICAgaWYgKGRlc2MtPmZsYWdzICYgKEFWX1BJWF9GTVRfRkxBR19QQUwgfCBGRl9QU0VVRE9QQUwpKSB7CiAgICAgICAgIGNvbnRleHQtPnBhbGV0dGUgPSBhdl9idWZmZXJfYWxsb2MoQVZQQUxFVFRFX1NJWkUpOwogICAgICAgICBpZiAoIWNvbnRleHQtPnBhbGV0dGUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworI2lmIEZGX0FQSV9QU0VVRE9QQUwKICAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkKICAgICAgICAgICAgIGF2cHJpdl9zZXRfc3lzdGVtYXRpY19wYWwyKCh1aW50MzJfdCopY29udGV4dC0+cGFsZXR0ZS0+ZGF0YSwgYXZjdHgtPnBpeF9mbXQpOworI2VuZGlmCiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgbWVtc2V0KGNvbnRleHQtPnBhbGV0dGUtPmRhdGEsIDAsIEFWUEFMRVRURV9TSVpFKTsKICAgICAgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDEpCkBAIC0xMjgsMTAgKzEzMCw2IEBACiAgICAgICAgIGF2Y3R4LT5waXhfZm10ICAgPT0gQVZfUElYX0ZNVF9ZVVlWNDIyKQogICAgICAgICBjb250ZXh0LT5pc195dXYyID0gMTsKIAotICAgIC8qIFRlbXBvcmFyeSBzb2x1dGlvbiB1bnRpbCBQQUw4IGlzIGltcGxlbWVudGVkIGluIG51dCAqLwotICAgIGlmIChjb250ZXh0LT5pc19wYWw4ICYmIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMSkKLSAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX05PTkU7Ci0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjA2LDI1ICsyMDQsMTEgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgLyogVGVtcG9yYXJ5IHNvbHV0aW9uIHVudGlsIFBBTDggaXMgaW1wbGVtZW50ZWQgaW4gbnV0ICovCi0gICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSAmJgotICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDEgJiYKLSAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlciA9PSAwICYmCi0gICAgICAgIGNvbnRleHQtPnBhbGV0dGUgJiYKLSAgICAgICAgQVZfUkI2NChjb250ZXh0LT5wYWxldHRlLT5kYXRhKSA9PSAweEZGRkZGRkZGMDAwMDAwMDAKLSAgICApIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOwotICAgICAgICBpZiAoIXBhbCkgewotICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX01PTk9XSElURTsKLSAgICAgICAgICAgIGNvbnRleHQtPmlzX3BhbDggPSAwOwotICAgICAgICAgICAgY29udGV4dC0+aXNfbW9ubyA9IDE7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7Ci0gICAgfQogICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKIAotICAgIGlmICgoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4IHx8IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gNAotICAgICAgICAgICAgfHwgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSAyKSAmJgorICAgIGlmICgoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4IHx8IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gNCB8fAorICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAyIHx8IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMSB8fAorICAgICAgICAgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMCAmJiAoY29udGV4dC0+aXNfbnV0X3BhbDggfHwgY29udGV4dC0+aXNfbW9ubykpICkgJiYKICAgICAgICAgKGNvbnRleHQtPmlzX21vbm8gfHwgY29udGV4dC0+aXNfcGFsOCkgJiYKICAgICAgICAgKCFhdmN0eC0+Y29kZWNfdGFnIHx8IGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ3InLCdhJywndycsJyAnKSB8fAogICAgICAgICAgICAgICAgIGNvbnRleHQtPmlzX251dF9tb25vIHx8IGNvbnRleHQtPmlzX251dF9wYWw4KSkgewpAQCAtMjU1LDggKzIzOSw4IEBACiAgICAgaWYgKHJlcyA8IDApCiAgICAgICAgIHJldHVybiByZXM7CiAKLSAgICBhdl9mcmFtZV9zZXRfcGt0X3BvcyAgICAgKGZyYW1lLCBhdmN0eC0+aW50ZXJuYWwtPnBrdC0+cG9zKTsKLSAgICBhdl9mcmFtZV9zZXRfcGt0X2R1cmF0aW9uKGZyYW1lLCBhdmN0eC0+aW50ZXJuYWwtPnBrdC0+ZHVyYXRpb24pOworICAgIGZyYW1lLT5wa3RfcG9zICAgICAgPSBhdmN0eC0+aW50ZXJuYWwtPmxhc3RfcGt0X3Byb3BzLT5wb3M7CisgICAgZnJhbWUtPnBrdF9kdXJhdGlvbiA9IGF2Y3R4LT5pbnRlcm5hbC0+bGFzdF9wa3RfcHJvcHMtPmR1cmF0aW9uOwogCiAgICAgaWYgKGNvbnRleHQtPnRmZiA+PSAwKSB7CiAgICAgICAgIGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKQEAgLTM4MiwyNiArMzY2LDQ5IEBACiAgICAgfQogCiAgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkgeworICAgICAgICBpbnQgcGFsX3NpemU7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBhbCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhbF9zaXplKTsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpZiAocGFsICYmIHBhbF9zaXplICE9IEFWUEFMRVRURV9TSVpFKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhbGV0dGUgc2l6ZSAlZCBpcyB3cm9uZ1xuIiwgcGFsX3NpemUpOworICAgICAgICAgICAgcGFsID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29udGV4dC0+cGFsZXR0ZSkKKyAgICAgICAgICAgIGNvbnRleHQtPnBhbGV0dGUgPSBhdl9idWZmZXJfYWxsb2MoQVZQQUxFVFRFX1NJWkUpOworICAgICAgICBpZiAoIWNvbnRleHQtPnBhbGV0dGUpIHsKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPmJ1ZlswXSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHJldCA9IGF2X2J1ZmZlcl9tYWtlX3dyaXRhYmxlKCZjb250ZXh0LT5wYWxldHRlKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPmJ1ZlswXSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAKICAgICAgICAgaWYgKHBhbCkgewotICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZjb250ZXh0LT5wYWxldHRlKTsKLSAgICAgICAgICAgIGNvbnRleHQtPnBhbGV0dGUgPSBhdl9idWZmZXJfYWxsb2MoQVZQQUxFVFRFX1NJWkUpOwotICAgICAgICAgICAgaWYgKCFjb250ZXh0LT5wYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+YnVmWzBdKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgbWVtY3B5KGNvbnRleHQtPnBhbGV0dGUtPmRhdGEsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOwogICAgICAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICB9IGVsc2UgaWYgKGNvbnRleHQtPmlzX251dF9wYWw4KSB7CisgICAgICAgICAgICBpbnQgdmlkX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0OworICAgICAgICAgICAgaW50IHBhbF9zaXplID0gYXZwa3QtPnNpemUgLSB2aWRfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGF2cGt0LT5zaXplID4gdmlkX3NpemUgJiYgcGFsX3NpemUgPD0gQVZQQUxFVFRFX1NJWkUpIHsKKyAgICAgICAgICAgICAgICBwYWwgPSBhdnBrdC0+ZGF0YSArIHZpZF9zaXplOworICAgICAgICAgICAgICAgIG1lbWNweShjb250ZXh0LT5wYWxldHRlLT5kYXRhLCBwYWwsIHBhbF9zaXplKTsKKyAgICAgICAgICAgICAgICBmcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX0JHUjI0ICAgIHx8Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX0dSQVk4ICAgIHx8Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX1JHQjU1NUxFIHx8Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX1JHQjU1NUJFIHx8Ci0gICAgICAgIGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX1JHQjU2NUxFIHx8CisgICAgaWYgKChhdmN0eC0+cGl4X2ZtdD09QVZfUElYX0ZNVF9SR0IyNCAgICB8fAorICAgICAgICBhdmN0eC0+cGl4X2ZtdD09QVZfUElYX0ZNVF9CR1IyNCAgICAgfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfR1JBWTggICAgIHx8CisgICAgICAgIGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX1JHQjU1NUxFICB8fAorICAgICAgICBhdmN0eC0+cGl4X2ZtdD09QVZfUElYX0ZNVF9SR0I1NTVCRSAgfHwKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfUkdCNTY1TEUgIHx8CiAgICAgICAgIGF2Y3R4LT5waXhfZm10PT1BVl9QSVhfRk1UX01PTk9XSElURSB8fAogICAgICAgICBhdmN0eC0+cGl4X2ZtdD09QVZfUElYX0ZNVF9NT05PQkxBQ0sgfHwKICAgICAgICAgYXZjdHgtPnBpeF9mbXQ9PUFWX1BJWF9GTVRfUEFMOCkgJiYKQEAgLTQxOCw3ICs0MjUsNyBAQAogICAgIH0KIAogICAgIGlmICgoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4ICYmIGJ1Zl9zaXplIDwgY29udGV4dC0+ZnJhbWVfc2l6ZSkgfHwKLSAgICAgICAgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkpIHsKKyAgICAgICAgKGRlc2MtPmZsYWdzICYgRkZfUFNFVURPUEFMKSkgewogICAgICAgICBmcmFtZS0+YnVmWzFdICA9IGF2X2J1ZmZlcl9yZWYoY29udGV4dC0+cGFsZXR0ZSk7CiAgICAgICAgIGlmICghZnJhbWUtPmJ1ZlsxXSkgewogICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+YnVmWzBdKTsKQEAgLTQ1Niw2ICs0NjMsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IEFWX1JMMzIoImI2NGEiKSAmJgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCAgID09IEFWX1BJWF9GTVRfUkdCQTY0QkUpIHsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gZnJhbWUtPmRhdGFbMF07CisgICAgICAgIHVpbnQ2NF90IHY7CisgICAgICAgIGludCB4OworICAgICAgICBmb3IgKHggPSAwOyB4ID4+IDMgPCBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0OyB4ICs9IDgpIHsKKyAgICAgICAgICAgIHYgPSBBVl9SQjY0KCZkc3RbeF0pOworICAgICAgICAgICAgQVZfV0I2NCgmZHN0W3hdLCB2IDw8IDE2IHwgdiA+PiA0OCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoYXZjdHgtPmZpZWxkX29yZGVyID4gQVZfRklFTERfUFJPR1JFU1NJVkUpIHsgLyogd2UgaGF2ZSBpbnRlcmxhY2VkIG1hdGVyaWFsIGZsYWdnZWQgaW4gY29udGFpbmVyICovCiAgICAgICAgIGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKICAgICAgICAgaWYgKGF2Y3R4LT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9UVCB8fCBhdmN0eC0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVEIpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Jhd2VuYy5jIGIvbGliYXZjb2RlYy9yYXdlbmMuYwppbmRleCBkODM3MDU2Li5kMTgxYjc0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Jhd2VuYy5jCisrKyBiL2xpYmF2Y29kZWMvcmF3ZW5jLmMKQEAgLTQ0LDYgKzQ0LDggQEAKICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpOwogICAgIGlmKCFhdmN0eC0+Y29kZWNfdGFnKQogICAgICAgICBhdmN0eC0+Y29kZWNfdGFnID0gYXZjb2RlY19waXhfZm10X3RvX2NvZGVjX3RhZyhhdmN0eC0+cGl4X2ZtdCk7CisgICAgYXZjdHgtPmJpdF9yYXRlID0gZmZfZ3Vlc3NfY29kZWRfYml0cmF0ZShhdmN0eCk7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjksNiArNzEsMTQgQEAKICAgICAgICAgaW50IHg7CiAgICAgICAgIGZvcih4ID0gMTsgeCA8IGZyYW1lLT5oZWlnaHQqZnJhbWUtPndpZHRoKjI7IHggKz0gMikKICAgICAgICAgICAgIHBrdC0+ZGF0YVt4XSBePSAweDgwOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJiNjRhIikgJiYgcmV0ID4gMCAmJgorICAgICAgICBmcmFtZS0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCQTY0QkUpIHsKKyAgICAgICAgdWludDY0X3QgdjsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+aGVpZ2h0ICogZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIHYgPSBBVl9SQjY0KCZwa3QtPmRhdGFbOCAqIHhdKTsKKyAgICAgICAgICAgIEFWX1dCNjQoJnBrdC0+ZGF0YVs4ICogeF0sIHYgPDwgNDggfCB2ID4+IDE2KTsKKyAgICAgICAgfQogICAgIH0KICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKICAgICAqZ290X3BhY2tldCA9IDE7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3JkZnQuYyBiL2xpYmF2Y29kZWMvcmRmdC5jCmluZGV4IGMzMThhYTguLjZiYTc0ODQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmRmdC5jCisrKyBiL2xpYmF2Y29kZWMvcmRmdC5jCkBAIC0yOCwyOCArMjgsNiBAQAogICogKEludmVyc2UpIFJlYWwgRGlzY3JldGUgRm91cmllciBUcmFuc2Zvcm1zLgogICovCiAKLS8qIHNpbigyKnBpKngvbikgZm9yIDA8PXg8bi80LCBmb2xsb3dlZCBieSBuLzI8PXg8M24vNCAqLwotI2lmICFDT05GSUdfSEFSRENPREVEX1RBQkxFUwotU0lOVEFCTEUoMTYpOwotU0lOVEFCTEUoMzIpOwotU0lOVEFCTEUoNjQpOwotU0lOVEFCTEUoMTI4KTsKLVNJTlRBQkxFKDI1Nik7Ci1TSU5UQUJMRSg1MTIpOwotU0lOVEFCTEUoMTAyNCk7Ci1TSU5UQUJMRSgyMDQ4KTsKLVNJTlRBQkxFKDQwOTYpOwotU0lOVEFCTEUoODE5Mik7Ci1TSU5UQUJMRSgxNjM4NCk7Ci1TSU5UQUJMRSgzMjc2OCk7Ci1TSU5UQUJMRSg2NTUzNik7Ci0jZW5kaWYKLXN0YXRpYyBTSU5UQUJMRV9DT05TVCBGRlRTYW1wbGUgKiBjb25zdCBmZl9zaW5fdGFic1tdID0gewotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgZmZfc2luXzE2LCBmZl9zaW5fMzIsIGZmX3Npbl82NCwgZmZfc2luXzEyOCwgZmZfc2luXzI1NiwgZmZfc2luXzUxMiwgZmZfc2luXzEwMjQsCi0gICAgZmZfc2luXzIwNDgsIGZmX3Npbl80MDk2LCBmZl9zaW5fODE5MiwgZmZfc2luXzE2Mzg0LCBmZl9zaW5fMzI3NjgsIGZmX3Npbl82NTUzNiwKLX07Ci0KIC8qKiBNYXAgb25lIHJlYWwgRkZUIGludG8gdHdvIHBhcmFsbGVsIHJlYWwgZXZlbiBhbmQgb2RkIEZGVHMuIFRoZW4gaW50ZXJsZWF2ZQogICogdGhlIHR3byByZWFsIEZGVHMgaW50byBvbmUgY29tcGxleCBGRlQuIFVubWFuZ2xlIHRoZSByZXN1bHRzLgogICogcmVmOiBodHRwOi8vd3d3LmVuZ2luZWVyaW5ncHJvZHVjdGl2aXR5dG9vbHMuY29tL3N0dWZmL1QwMDAxL1BUMTAuSFRNCkBAIC01Nyw3ICszNSw3IEBACiBzdGF0aWMgdm9pZCByZGZ0X2NhbGNfYyhSREZUQ29udGV4dCAqcywgRkZUU2FtcGxlICpkYXRhKQogewogICAgIGludCBpLCBpMSwgaTI7Ci0gICAgRkZUQ29tcGxleCBldiwgb2Q7CisgICAgRkZUQ29tcGxleCBldiwgb2QsIG9kc3VtOwogICAgIGNvbnN0IGludCBuID0gMSA8PCBzLT5uYml0czsKICAgICBjb25zdCBmbG9hdCBrMSA9IDAuNTsKICAgICBjb25zdCBmbG9hdCBrMiA9IDAuNSAtIHMtPmludmVyc2U7CkBAIC03MywyMCArNTEsMzEgQEAKICAgICBldi5yZSA9IGRhdGFbMF07CiAgICAgZGF0YVswXSA9IGV2LnJlK2RhdGFbMV07CiAgICAgZGF0YVsxXSA9IGV2LnJlLWRhdGFbMV07Ci0gICAgZm9yIChpID0gMTsgaSA8IChuPj4yKTsgaSsrKSB7Ci0gICAgICAgIGkxID0gMippOwotICAgICAgICBpMiA9IG4taTE7Ci0gICAgICAgIC8qIFNlcGFyYXRlIGV2ZW4gYW5kIG9kZCBGRlRzICovCi0gICAgICAgIGV2LnJlID0gIGsxKihkYXRhW2kxICBdK2RhdGFbaTIgIF0pOwotICAgICAgICBvZC5pbSA9IC1rMiooZGF0YVtpMSAgXS1kYXRhW2kyICBdKTsKLSAgICAgICAgZXYuaW0gPSAgazEqKGRhdGFbaTErMV0tZGF0YVtpMisxXSk7Ci0gICAgICAgIG9kLnJlID0gIGsyKihkYXRhW2kxKzFdK2RhdGFbaTIrMV0pOwotICAgICAgICAvKiBBcHBseSB0d2lkZGxlIGZhY3RvcnMgdG8gdGhlIG9kZCBGRlQgYW5kIGFkZCB0byB0aGUgZXZlbiBGRlQgKi8KLSAgICAgICAgZGF0YVtpMSAgXSA9ICBldi5yZSArIG9kLnJlKnRjb3NbaV0gLSBvZC5pbSp0c2luW2ldOwotICAgICAgICBkYXRhW2kxKzFdID0gIGV2LmltICsgb2QuaW0qdGNvc1tpXSArIG9kLnJlKnRzaW5baV07Ci0gICAgICAgIGRhdGFbaTIgIF0gPSAgZXYucmUgLSBvZC5yZSp0Y29zW2ldICsgb2QuaW0qdHNpbltpXTsKLSAgICAgICAgZGF0YVtpMisxXSA9IC1ldi5pbSArIG9kLmltKnRjb3NbaV0gKyBvZC5yZSp0c2luW2ldOworCisjZGVmaW5lIFJERlRfVU5NQU5HTEUoc2lnbjAsIHNpZ24xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDE7IGkgPCAobj4+Mik7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaTEgPSAyKmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkyID0gbi1pMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBTZXBhcmF0ZSBldmVuIGFuZCBvZGQgRkZUcyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZXYucmUgPSAgazEqKGRhdGFbaTEgIF0rZGF0YVtpMiAgXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9kLmltID0gIGsyKihkYXRhW2kyICBdLWRhdGFbaTEgIF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBldi5pbSA9ICBrMSooZGF0YVtpMSsxXS1kYXRhW2kyKzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2QucmUgPSAgazIqKGRhdGFbaTErMV0rZGF0YVtpMisxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIEFwcGx5IHR3aWRkbGUgZmFjdG9ycyB0byB0aGUgb2RkIEZGVCBhbmQgYWRkIHRvIHRoZSBldmVuIEZGVCAqLyAgXAorICAgICAgICBvZHN1bS5yZSA9IG9kLnJlKnRjb3NbaV0gc2lnbjAgb2QuaW0qdHNpbltpXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2RzdW0uaW0gPSBvZC5pbSp0Y29zW2ldIHNpZ24xIG9kLnJlKnRzaW5baV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRhdGFbaTEgIF0gPSAgZXYucmUgKyBvZHN1bS5yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkYXRhW2kxKzFdID0gIGV2LmltICsgb2RzdW0uaW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGF0YVtpMiAgXSA9ICBldi5yZSAtIG9kc3VtLnJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRhdGFbaTIrMV0gPSAgb2RzdW0uaW0gLSBldi5pbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KKworICAgIGlmIChzLT5uZWdhdGl2ZV9zaW4pIHsKKyAgICAgICAgUkRGVF9VTk1BTkdMRSgrLC0pCisgICAgfSBlbHNlIHsKKyAgICAgICAgUkRGVF9VTk1BTkdMRSgtLCspCisgICAgfQorCiAgICAgZGF0YVsyKmkrMV09cy0+c2lnbl9jb252ZW50aW9uKmRhdGFbMippKzFdOwogICAgIGlmIChzLT5pbnZlcnNlKSB7CiAgICAgICAgIGRhdGFbMF0gKj0gazE7CkBAIC0xMDQsNiArOTMsNyBAQAogICAgIHMtPm5iaXRzICAgICAgICAgICA9IG5iaXRzOwogICAgIHMtPmludmVyc2UgICAgICAgICA9IHRyYW5zID09IElERlRfQzJSIHx8IHRyYW5zID09IERGVF9DMlI7CiAgICAgcy0+c2lnbl9jb252ZW50aW9uID0gdHJhbnMgPT0gSURGVF9SMkMgfHwgdHJhbnMgPT0gREZUX0MyUiA/IDEgOiAtMTsKKyAgICBzLT5uZWdhdGl2ZV9zaW4gICAgPSB0cmFucyA9PSBERlRfQzJSIHx8IHRyYW5zID09IERGVF9SMkM7CiAKICAgICBpZiAobmJpdHMgPCA0IHx8IG5iaXRzID4gMTYpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC0xMTMsMTUgKzEwMyw3IEBACiAKICAgICBmZl9pbml0X2ZmX2Nvc190YWJzKG5iaXRzKTsKICAgICBzLT50Y29zID0gZmZfY29zX3RhYnNbbmJpdHNdOwotICAgIHMtPnRzaW4gPSBmZl9zaW5fdGFic1tuYml0c10rKHRyYW5zID09IERGVF9SMkMgfHwgdHJhbnMgPT0gREZUX0MyUikqKG4+PjIpOwotI2lmICFDT05GSUdfSEFSRENPREVEX1RBQkxFUwotICAgIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSB0aGV0YSA9ICh0cmFucyA9PSBERlRfUjJDIHx8IHRyYW5zID09IERGVF9DMlIgPyAtMSA6IDEpICogMiAqIE1fUEkgLyBuOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKG4gPj4gMik7IGkrKykKLSAgICAgICAgICAgIHMtPnRzaW5baV0gPSBzaW4oaSAqIHRoZXRhKTsKLSAgICB9Ci0jZW5kaWYKKyAgICBzLT50c2luID0gZmZfY29zX3RhYnNbbmJpdHNdICsgKG4gPj4gMik7CiAgICAgcy0+cmRmdF9jYWxjICAgPSByZGZ0X2NhbGNfYzsKIAogICAgIGlmIChBUkNIX0FSTSkgZmZfcmRmdF9pbml0X2FybShzKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmRmdC5oIGIvbGliYXZjb2RlYy9yZGZ0LmgKaW5kZXggMzdjNDBlNy4uZmZhZmNhNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9yZGZ0LmgKKysrIGIvbGliYXZjb2RlYy9yZGZ0LmgKQEAgLTI1LDI5ICsyNSw2IEBACiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiZmZ0LmgiCiAKLSNpZiBDT05GSUdfSEFSRENPREVEX1RBQkxFUwotIyAgIGRlZmluZSBTSU5UQUJMRV9DT05TVCBjb25zdAotI2Vsc2UKLSMgICBkZWZpbmUgU0lOVEFCTEVfQ09OU1QKLSNlbmRpZgotCi0jZGVmaW5lIFNJTlRBQkxFKHNpemUpIFwKLSAgICBTSU5UQUJMRV9DT05TVCBERUNMQVJFX0FMSUdORUQoMTYsIEZGVFNhbXBsZSwgZmZfc2luXyMjc2l6ZSlbc2l6ZS8yXQotCi1leHRlcm4gU0lOVEFCTEUoMTYpOwotZXh0ZXJuIFNJTlRBQkxFKDMyKTsKLWV4dGVybiBTSU5UQUJMRSg2NCk7Ci1leHRlcm4gU0lOVEFCTEUoMTI4KTsKLWV4dGVybiBTSU5UQUJMRSgyNTYpOwotZXh0ZXJuIFNJTlRBQkxFKDUxMik7Ci1leHRlcm4gU0lOVEFCTEUoMTAyNCk7Ci1leHRlcm4gU0lOVEFCTEUoMjA0OCk7Ci1leHRlcm4gU0lOVEFCTEUoNDA5Nik7Ci1leHRlcm4gU0lOVEFCTEUoODE5Mik7Ci1leHRlcm4gU0lOVEFCTEUoMTYzODQpOwotZXh0ZXJuIFNJTlRBQkxFKDMyNzY4KTsKLWV4dGVybiBTSU5UQUJMRSg2NTUzNik7Ci0KIHN0cnVjdCBSREZUQ29udGV4dCB7CiAgICAgaW50IG5iaXRzOwogICAgIGludCBpbnZlcnNlOwpAQCAtNTUsNyArMzIsOCBAQAogCiAgICAgLyogcHJlL3Bvc3Qgcm90YXRpb24gdGFibGVzICovCiAgICAgY29uc3QgRkZUU2FtcGxlICp0Y29zOwotICAgIFNJTlRBQkxFX0NPTlNUIEZGVFNhbXBsZSAqdHNpbjsKKyAgICBjb25zdCBGRlRTYW1wbGUgKnRzaW47CisgICAgaW50IG5lZ2F0aXZlX3NpbjsKICAgICBGRlRDb250ZXh0IGZmdDsKICAgICB2b2lkICgqcmRmdF9jYWxjKShzdHJ1Y3QgUkRGVENvbnRleHQgKnMsIEZGVFNhbXBsZSAqeik7CiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yZWFsdGV4dGRlYy5jIGIvbGliYXZjb2RlYy9yZWFsdGV4dGRlYy5jCmluZGV4IDg3MDk1M2IuLjUwODQ3ODEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmVhbHRleHRkZWMuYworKysgYi9saWJhdmNvZGVjL3JlYWx0ZXh0ZGVjLmMKQEAgLTYxLDEzICs2MSwxMiBAQAogICAgIGludCByZXQgPSAwOwogICAgIEFWU3VidGl0bGUgKnN1YiA9IGRhdGE7CiAgICAgY29uc3QgY2hhciAqcHRyID0gYXZwa3QtPmRhdGE7CisgICAgRkZBU1NEZWNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgQVZCUHJpbnQgYnVmOwogCiAgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgNDA5Nik7Ci0gICAgLy8gbm90ZTogbm8gbmVlZCB0byByZXNjYWxlIHB0cyAmIGR1cmF0aW9uIHNpbmNlIHRoZXkgYXJlIGluIHRoZSBzYW1lCi0gICAgLy8gdGltZWJhc2UgYXMgQVNTICgxLzEwMCkKICAgICBpZiAocHRyICYmIGF2cGt0LT5zaXplID4gMCAmJiAhcnRfZXZlbnRfdG9fYXNzKCZidWYsIHB0cikpCi0gICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmYnVmLCBhdnBrdC0+cHRzLCBhdnBrdC0+ZHVyYXRpb24pOworICAgICAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3Qoc3ViLCBidWYuc3RyLCBzLT5yZWFkb3JkZXIrKywgMCwgTlVMTCwgTlVMTCk7CiAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtODIsNCArODEsNiBAQAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1JFQUxURVhULAogICAgIC5kZWNvZGUgICAgICAgICA9IHJlYWx0ZXh0X2RlY29kZV9mcmFtZSwKICAgICAuaW5pdCAgICAgICAgICAgPSBmZl9hc3Nfc3VidGl0bGVfaGVhZGVyX2RlZmF1bHQsCisgICAgLmZsdXNoICAgICAgICAgID0gZmZfYXNzX2RlY29kZXJfZmx1c2gsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGQVNTRGVjb2RlckNvbnRleHQpLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmVjdGFuZ2xlLmggYi9saWJhdmNvZGVjL3JlY3RhbmdsZS5oCmluZGV4IDU5NGE3NjAuLmRmN2MxOGEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmVjdGFuZ2xlLmgKKysrIGIvbGliYXZjb2RlYy9yZWN0YW5nbGUuaApAQCAtNjUsNyArNjUsNyBAQAogICAgICAgICAqKHVpbnQzMl90KikocCArIDIqc3RyaWRlKT0gdjsKICAgICAgICAgKih1aW50MzJfdCopKHAgKyAzKnN0cmlkZSk9IHY7CiAgICAgfWVsc2UgaWYodz09OCl7Ci0gICAgLy9nY2MgY2FuJ3Qgb3B0aW1pemUgNjRiaXQgbWF0aCBvbiB4ODZfMzIKKyAgICAvLyBnY2MgY2Fubm90IG9wdGltaXplIDY0LWJpdCBtYXRoIG9uIHg4Nl8zMgogI2lmIEhBVkVfRkFTVF82NEJJVAogICAgICAgICBjb25zdCB1aW50NjRfdCB2PSAgc2l6ZT09MiA/IHZhbCoweDAwMDEwMDAxMDAwMTAwMDFVTEwgOiB2YWwqMHgwMTAwMDAwMDAxVUxMOwogICAgICAgICAqKHVpbnQ2NF90KikocCArIDAqc3RyaWRlKT0gdjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmVtb3ZlX2V4dHJhZGF0YV9ic2YuYyBiL2xpYmF2Y29kZWMvcmVtb3ZlX2V4dHJhZGF0YV9ic2YuYwppbmRleCA2YmIzNTc2Li5iNzYyMDc5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JlbW92ZV9leHRyYWRhdGFfYnNmLmMKKysrIGIvbGliYXZjb2RlYy9yZW1vdmVfZXh0cmFkYXRhX2JzZi5jCkBAIC0xOCwzOCArMTgsMTAwIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCiAKK2VudW0gUmVtb3ZlRnJlcSB7CisgICAgUkVNT1ZFX0ZSRVFfS0VZRlJBTUUsCisgICAgUkVNT1ZFX0ZSRVFfQUxMLAorICAgIFJFTU9WRV9GUkVRX05PTktFWUZSQU1FLAorfTsKIAotc3RhdGljIGludCByZW1vdmVfZXh0cmFkYXRhKEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmYywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBjaGFyICphcmdzLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludCBrZXlmcmFtZSl7Ci0gICAgaW50IGNtZD0gYXJncyA/ICphcmdzIDogMDsKLSAgICBBVkNvZGVjUGFyc2VyQ29udGV4dCAqczsKK3R5cGVkZWYgc3RydWN0IFJlbW92ZUV4dHJhZGF0YUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBmcmVxOwogCi0gICAgaWYoIWJzZmMtPnBhcnNlcil7Ci0gICAgICAgIGJzZmMtPnBhcnNlcj0gYXZfcGFyc2VyX2luaXQoYXZjdHgtPmNvZGVjX2lkKTsKLSAgICB9Ci0gICAgcz0gYnNmYy0+cGFyc2VyOworICAgIEFWQ29kZWNQYXJzZXJDb250ZXh0ICpwYXJzZXI7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworfSBSZW1vdmVFeHRyYWRhdGFDb250ZXh0OwogCi0gICAgaWYocyAmJiBzLT5wYXJzZXItPnNwbGl0KXsKLSAgICAgICAgaWYoICAoKChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHx8Ci0gICAgICAgICAgICAgICAoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX0xPQ0FMX0hFQURFUikpICYmIGNtZCA9PSAnYScpCi0gICAgICAgICAgIHx8KCFrZXlmcmFtZSAmJiBjbWQ9PSdrJykKLSAgICAgICAgICAgfHwoY21kPT0nZScgfHwgIWNtZCkKLSAgICAgICAgICApewotICAgICAgICAgICAgaW50IGk9IHMtPnBhcnNlci0+c3BsaXQoYXZjdHgsIGJ1ZiwgYnVmX3NpemUpOwotICAgICAgICAgICAgYnVmICs9IGk7Ci0gICAgICAgICAgICBidWZfc2l6ZSAtPSBpOworc3RhdGljIGludCByZW1vdmVfZXh0cmFkYXRhKEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIFJlbW92ZUV4dHJhZGF0YUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZl9ic2ZfZ2V0X3BhY2tldF9yZWYoY3R4LCBwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHMtPnBhcnNlciAmJiBzLT5wYXJzZXItPnBhcnNlci0+c3BsaXQpIHsKKyAgICAgICAgaWYgKHMtPmZyZXEgPT0gUkVNT1ZFX0ZSRVFfQUxMIHx8CisgICAgICAgICAgICAocy0+ZnJlcSA9PSBSRU1PVkVfRlJFUV9OT05LRVlGUkFNRSAmJiAhKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSB8fAorICAgICAgICAgICAgKHMtPmZyZXEgPT0gUkVNT1ZFX0ZSRVFfS0VZRlJBTUUgJiYgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkpIHsKKyAgICAgICAgICAgIGludCBpID0gcy0+cGFyc2VyLT5wYXJzZXItPnNwbGl0KHMtPmF2Y3R4LCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgICAgICBwa3QtPmRhdGEgKz0gaTsKKyAgICAgICAgICAgIHBrdC0+c2l6ZSAtPSBpOwogICAgICAgICB9CiAgICAgfQotICAgICpwb3V0YnVmPSAodWludDhfdCAqKSBidWY7Ci0gICAgKnBvdXRidWZfc2l6ZT0gYnVmX3NpemU7CiAKICAgICByZXR1cm4gMDsKIH0KIAotQVZCaXRTdHJlYW1GaWx0ZXIgZmZfcmVtb3ZlX2V4dHJhZGF0YV9ic2Y9ewotICAgIC5uYW1lICAgPSAicmVtb3ZlX2V4dHJhIiwKLSAgICAuZmlsdGVyID0gcmVtb3ZlX2V4dHJhZGF0YSwKK3N0YXRpYyBpbnQgcmVtb3ZlX2V4dHJhZGF0YV9pbml0KEFWQlNGQ29udGV4dCAqY3R4KQoreworICAgIFJlbW92ZUV4dHJhZGF0YUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgcy0+cGFyc2VyID0gYXZfcGFyc2VyX2luaXQoY3R4LT5wYXJfaW4tPmNvZGVjX2lkKTsKKworICAgIGlmIChzLT5wYXJzZXIpIHsKKyAgICAgICAgcy0+YXZjdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworICAgICAgICBpZiAoIXMtPmF2Y3R4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChzLT5hdmN0eCwgY3R4LT5wYXJfaW4pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9leHRyYWRhdGFfY2xvc2UoQVZCU0ZDb250ZXh0ICpjdHgpCit7CisgICAgUmVtb3ZlRXh0cmFkYXRhQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJnMtPmF2Y3R4KTsKKyAgICBhdl9wYXJzZXJfY2xvc2Uocy0+cGFyc2VyKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUmVtb3ZlRXh0cmFkYXRhQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0JTRl9QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZnJlcSIsIE5VTEwsIE9GRlNFVChmcmVxKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBSRU1PVkVfRlJFUV9LRVlGUkFNRSB9LCBSRU1PVkVfRlJFUV9LRVlGUkFNRSwgUkVNT1ZFX0ZSRVFfTk9OS0VZRlJBTUUsIEZMQUdTLCAiZnJlcSIgfSwKKyAgICAgICAgeyAiayIsICAgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkVNT1ZFX0ZSRVFfTk9OS0VZRlJBTUUgfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZyZXEiIH0sCisgICAgICAgIHsgImtleWZyYW1lIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFJFTU9WRV9GUkVRX0tFWUZSQU1FIH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmcmVxIiB9LAorICAgICAgICB7ICJlIiwgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBSRU1PVkVfRlJFUV9BTEwgICAgICB9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZnJlcSIgfSwKKyAgICAgICAgeyAiYWxsIiwgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUkVNT1ZFX0ZSRVFfQUxMICAgICAgfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZyZXEiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyByZW1vdmVfZXh0cmFkYXRhX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInJlbW92ZV9leHRyYWRhdGEiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfcmVtb3ZlX2V4dHJhZGF0YV9ic2YgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInJlbW92ZV9leHRyYSIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFJlbW92ZUV4dHJhZGF0YUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZyZW1vdmVfZXh0cmFkYXRhX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgICA9IHJlbW92ZV9leHRyYWRhdGFfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSByZW1vdmVfZXh0cmFkYXRhX2Nsb3NlLAorICAgIC5maWx0ZXIgICAgICAgICA9IHJlbW92ZV9leHRyYWRhdGEsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yZXNhbXBsZS5jIGIvbGliYXZjb2RlYy9yZXNhbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjVlZTg0Li4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvcmVzYW1wbGUuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKgotICogc2FtcGxlcmF0ZSBjb252ZXJzaW9uIGZvciBib3RoIGF1ZGlvIGFuZCB2aWRlbwotICogQ29weXJpZ2h0IChjKSAyMDAwIEZhYnJpY2UgQmVsbGFyZAotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSAqIEBmaWxlCi0gKiBzYW1wbGVyYXRlIGNvbnZlcnNpb24gZm9yIGJvdGggYXVkaW8gYW5kIHZpZGVvCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImF1ZGlvY29udmVydC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgotCi0jaWYgRkZfQVBJX0FWQ09ERUNfUkVTQU1QTEUKLUZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLQotI2RlZmluZSBNQVhfQ0hBTk5FTFMgOAotCi1zdHJ1Y3QgQVZSZXNhbXBsZUNvbnRleHQ7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpjb250ZXh0X3RvX25hbWUodm9pZCAqcHRyKQotewotICAgIHJldHVybiAiYXVkaW9yZXNhbXBsZSI7Ci19Ci0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7e05VTEx9fTsKLXN0YXRpYyBjb25zdCBBVkNsYXNzIGF1ZGlvcmVzYW1wbGVfY29udGV4dF9jbGFzcyA9IHsKLSAgICAiUmVTYW1wbGVDb250ZXh0IiwgY29udGV4dF90b19uYW1lLCBvcHRpb25zLCBMSUJBVlVUSUxfVkVSU0lPTl9JTlQKLX07Ci0KLXN0cnVjdCBSZVNhbXBsZUNvbnRleHQgewotICAgIHN0cnVjdCBBVlJlc2FtcGxlQ29udGV4dCAqcmVzYW1wbGVfY29udGV4dDsKLSAgICBzaG9ydCAqdGVtcFtNQVhfQ0hBTk5FTFNdOwotICAgIGludCB0ZW1wX2xlbjsKLSAgICBmbG9hdCByYXRpbzsKLSAgICAvKiBjaGFubmVsIGNvbnZlcnQgKi8KLSAgICBpbnQgaW5wdXRfY2hhbm5lbHMsIG91dHB1dF9jaGFubmVscywgZmlsdGVyX2NoYW5uZWxzOwotICAgIEFWQXVkaW9Db252ZXJ0ICpjb252ZXJ0X2N0eFsyXTsKLSAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRbMl07IC8vLzwgaW5wdXQgYW5kIG91dHB1dCBzYW1wbGUgZm9ybWF0Ci0gICAgdW5zaWduZWQgc2FtcGxlX3NpemVbMl07ICAgICAgICAgICAvLy88IHNpemUgb2Ygb25lIHNhbXBsZSBpbiBzYW1wbGVfZm10Ci0gICAgc2hvcnQgKmJ1ZmZlclsyXTsgICAgICAgICAgICAgICAgICAvLy88IGJ1ZmZlcnMgdXNlZCBmb3IgY29udmVyc2lvbiB0byBTMTYKLSAgICB1bnNpZ25lZCBidWZmZXJfc2l6ZVsyXTsgICAgICAgICAgIC8vLzwgc2l6ZXMgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMKLX07Ci0KLS8qIG4xOiBudW1iZXIgb2Ygc2FtcGxlcyAqLwotc3RhdGljIHZvaWQgc3RlcmVvX3RvX21vbm8oc2hvcnQgKm91dHB1dCwgc2hvcnQgKmlucHV0LCBpbnQgbjEpCi17Ci0gICAgc2hvcnQgKnAsICpxOwotICAgIGludCBuID0gbjE7Ci0KLSAgICBwID0gaW5wdXQ7Ci0gICAgcSA9IG91dHB1dDsKLSAgICB3aGlsZSAobiA+PSA0KSB7Ci0gICAgICAgIHFbMF0gPSAocFswXSArIHBbMV0pID4+IDE7Ci0gICAgICAgIHFbMV0gPSAocFsyXSArIHBbM10pID4+IDE7Ci0gICAgICAgIHFbMl0gPSAocFs0XSArIHBbNV0pID4+IDE7Ci0gICAgICAgIHFbM10gPSAocFs2XSArIHBbN10pID4+IDE7Ci0gICAgICAgIHEgKz0gNDsKLSAgICAgICAgcCArPSA4OwotICAgICAgICBuIC09IDQ7Ci0gICAgfQotICAgIHdoaWxlIChuID4gMCkgewotICAgICAgICBxWzBdID0gKHBbMF0gKyBwWzFdKSA+PiAxOwotICAgICAgICBxKys7Ci0gICAgICAgIHAgKz0gMjsKLSAgICAgICAgbi0tOwotICAgIH0KLX0KLQotLyogbjE6IG51bWJlciBvZiBzYW1wbGVzICovCi1zdGF0aWMgdm9pZCBtb25vX3RvX3N0ZXJlbyhzaG9ydCAqb3V0cHV0LCBzaG9ydCAqaW5wdXQsIGludCBuMSkKLXsKLSAgICBzaG9ydCAqcCwgKnE7Ci0gICAgaW50IG4gPSBuMTsKLSAgICBpbnQgdjsKLQotICAgIHAgPSBpbnB1dDsKLSAgICBxID0gb3V0cHV0OwotICAgIHdoaWxlIChuID49IDQpIHsKLSAgICAgICAgdiA9IHBbMF07IHFbMF0gPSB2OyBxWzFdID0gdjsKLSAgICAgICAgdiA9IHBbMV07IHFbMl0gPSB2OyBxWzNdID0gdjsKLSAgICAgICAgdiA9IHBbMl07IHFbNF0gPSB2OyBxWzVdID0gdjsKLSAgICAgICAgdiA9IHBbM107IHFbNl0gPSB2OyBxWzddID0gdjsKLSAgICAgICAgcSArPSA4OwotICAgICAgICBwICs9IDQ7Ci0gICAgICAgIG4gLT0gNDsKLSAgICB9Ci0gICAgd2hpbGUgKG4gPiAwKSB7Ci0gICAgICAgIHYgPSBwWzBdOyBxWzBdID0gdjsgcVsxXSA9IHY7Ci0gICAgICAgIHEgKz0gMjsKLSAgICAgICAgcCArPSAxOwotICAgICAgICBuLS07Ci0gICAgfQotfQotCi0vKgotNS4xIHRvIHN0ZXJlbyBpbnB1dDogW2ZsLCBmciwgYywgbGZlLCBybCwgcnJdCi0tIExlZnQgPSBmcm9udF9sZWZ0ICsgcmVhcl9nYWluICogcmVhcl9sZWZ0ICsgY2VudGVyX2dhaW4gKiBjZW50ZXIKLS0gUmlnaHQgPSBmcm9udF9yaWdodCArIHJlYXJfZ2FpbiAqIHJlYXJfcmlnaHQgKyBjZW50ZXJfZ2FpbiAqIGNlbnRlcgotV2hlcmUgcmVhcl9nYWluIGlzIHVzdWFsbHkgYXJvdW5kIDAuNS0xLjAgYW5kCi0gICAgICBjZW50ZXJfZ2FpbiBpcyBhbG1vc3QgYWx3YXlzIDAuNyAoLTMgZEIpCi0qLwotc3RhdGljIHZvaWQgc3Vycm91bmRfdG9fc3RlcmVvKHNob3J0ICoqb3V0cHV0LCBzaG9ydCAqaW5wdXQsIGludCBjaGFubmVscywgaW50IHNhbXBsZXMpCi17Ci0gICAgaW50IGk7Ci0gICAgc2hvcnQgbCwgcjsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspIHsKLSAgICAgICAgaW50IGZsLGZyLGMscmwscnI7Ci0gICAgICAgIGZsID0gaW5wdXRbMF07Ci0gICAgICAgIGZyID0gaW5wdXRbMV07Ci0gICAgICAgIGMgPSBpbnB1dFsyXTsKLSAgICAgICAgLy8gbGZlID0gaW5wdXRbM107Ci0gICAgICAgIHJsID0gaW5wdXRbNF07Ci0gICAgICAgIHJyID0gaW5wdXRbNV07Ci0KLSAgICAgICAgbCA9IGF2X2NsaXBfaW50MTYoZmwgKyAoMC41ICogcmwpICsgKDAuNyAqIGMpKTsKLSAgICAgICAgciA9IGF2X2NsaXBfaW50MTYoZnIgKyAoMC41ICogcnIpICsgKDAuNyAqIGMpKTsKLQotICAgICAgICAvKiBvdXRwdXQgbCAmIHIuICovCi0gICAgICAgICpvdXRwdXRbMF0rKyA9IGw7Ci0gICAgICAgICpvdXRwdXRbMV0rKyA9IHI7Ci0KLSAgICAgICAgLyogaW5jcmVtZW50IGlucHV0LiAqLwotICAgICAgICBpbnB1dCArPSBjaGFubmVsczsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGRlaW50ZXJsZWF2ZShzaG9ydCAqKm91dHB1dCwgc2hvcnQgKmlucHV0LCBpbnQgY2hhbm5lbHMsIGludCBzYW1wbGVzKQotewotICAgIGludCBpLCBqOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXM7IGkrKykgewotICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hhbm5lbHM7IGorKykgewotICAgICAgICAgICAgKm91dHB1dFtqXSsrID0gKmlucHV0Kys7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVybGVhdmUoc2hvcnQgKm91dHB1dCwgc2hvcnQgKippbnB1dCwgaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxlcykKLXsKLSAgICBpbnQgaSwgajsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGNoYW5uZWxzOyBqKyspIHsKLSAgICAgICAgICAgICpvdXRwdXQrKyA9ICppbnB1dFtqXSsrOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBhYzNfNXAxX211eChzaG9ydCAqb3V0cHV0LCBzaG9ydCAqaW5wdXQxLCBzaG9ydCAqaW5wdXQyLCBpbnQgbikKLXsKLSAgICBpbnQgaTsKLSAgICBzaG9ydCBsLCByOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBsID0gKmlucHV0MSsrOwotICAgICAgICByID0gKmlucHV0MisrOwotICAgICAgICAqb3V0cHV0KysgPSBsOyAgICAgICAgICAgICAgICAgIC8qIGxlZnQgKi8KLSAgICAgICAgKm91dHB1dCsrID0gKGwgLyAyKSArIChyIC8gMik7ICAvKiBjZW50ZXIgKi8KLSAgICAgICAgKm91dHB1dCsrID0gcjsgICAgICAgICAgICAgICAgICAvKiByaWdodCAqLwotICAgICAgICAqb3V0cHV0KysgPSAwOyAgICAgICAgICAgICAgICAgIC8qIGxlZnQgc3Vycm91bmQgKi8KLSAgICAgICAgKm91dHB1dCsrID0gMDsgICAgICAgICAgICAgICAgICAvKiByaWdodCBzdXJyb3VkICovCi0gICAgICAgICpvdXRwdXQrKyA9IDA7ICAgICAgICAgICAgICAgICAgLyogbG93IGZyZXEgKi8KLSAgICB9Ci19Ci0KLSNkZWZpbmUgU1VQUE9SVF9SRVNBTVBMRShjaDEsIGNoMiwgY2gzLCBjaDQsIGNoNSwgY2g2LCBjaDcsIGNoOCkgXAotICAgIGNoODw8NyB8IGNoNzw8NiB8IGNoNjw8NSB8IGNoNTw8NCB8IGNoNDw8MyB8IGNoMzw8MiB8IGNoMjw8MSB8IGNoMTw8MAotCi1zdGF0aWMgY29uc3QgdWludDhfdCBzdXBwb3J0ZWRfcmVzYW1wbGluZ1tNQVhfQ0hBTk5FTFNdID0gewotICAgIC8vIG91dHB1dCBjaDogICAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgOAotICAgIFNVUFBPUlRfUkVTQU1QTEUoMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCksIC8vIDEgaW5wdXQgY2hhbm5lbAotICAgIFNVUFBPUlRfUkVTQU1QTEUoMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCksIC8vIDIgaW5wdXQgY2hhbm5lbHMKLSAgICBTVVBQT1JUX1JFU0FNUExFKDAsIDAsIDEsIDAsIDAsIDAsIDAsIDApLCAvLyAzIGlucHV0IGNoYW5uZWxzCi0gICAgU1VQUE9SVF9SRVNBTVBMRSgwLCAwLCAwLCAxLCAwLCAwLCAwLCAwKSwgLy8gNCBpbnB1dCBjaGFubmVscwotICAgIFNVUFBPUlRfUkVTQU1QTEUoMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCksIC8vIDUgaW5wdXQgY2hhbm5lbHMKLSAgICBTVVBQT1JUX1JFU0FNUExFKDAsIDEsIDAsIDAsIDAsIDEsIDAsIDApLCAvLyA2IGlucHV0IGNoYW5uZWxzCi0gICAgU1VQUE9SVF9SRVNBTVBMRSgwLCAwLCAwLCAwLCAwLCAwLCAxLCAwKSwgLy8gNyBpbnB1dCBjaGFubmVscwotICAgIFNVUFBPUlRfUkVTQU1QTEUoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSksIC8vIDggaW5wdXQgY2hhbm5lbHMKLX07Ci0KLVJlU2FtcGxlQ29udGV4dCAqYXZfYXVkaW9fcmVzYW1wbGVfaW5pdChpbnQgb3V0cHV0X2NoYW5uZWxzLCBpbnQgaW5wdXRfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dF9yYXRlLCBpbnQgaW5wdXRfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRfb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdF9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsdGVyX2xlbmd0aCwgaW50IGxvZzJfcGhhc2VfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVhciwgZG91YmxlIGN1dG9mZikKLXsKLSAgICBSZVNhbXBsZUNvbnRleHQgKnM7Ci0KLSAgICBpZiAoaW5wdXRfY2hhbm5lbHMgPiBNQVhfQ0hBTk5FTFMpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJSZXNhbXBsaW5nIHdpdGggaW5wdXQgY2hhbm5lbHMgZ3JlYXRlciB0aGFuICVkIGlzIHVuc3VwcG9ydGVkLlxuIiwKLSAgICAgICAgICAgICAgIE1BWF9DSEFOTkVMUyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIShzdXBwb3J0ZWRfcmVzYW1wbGluZ1tpbnB1dF9jaGFubmVscy0xXSAmICgxPDwob3V0cHV0X2NoYW5uZWxzLTEpKSkpIHsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBhdWRpbyByZXNhbXBsaW5nLiBBbGxvd2VkICIKLSAgICAgICAgICAgICAgICJvdXRwdXQgY2hhbm5lbHMgZm9yICVkIGlucHV0IGNoYW5uZWwlcyIsIGlucHV0X2NoYW5uZWxzLAotICAgICAgICAgICAgICAgaW5wdXRfY2hhbm5lbHMgPiAxID8gInM6IiA6ICI6Iik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfQ0hBTk5FTFM7IGkrKykKLSAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRfcmVzYW1wbGluZ1tpbnB1dF9jaGFubmVscy0xXSAmICgxPDxpKSkKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiICVkIiwgaSArIDEpOwotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiXG4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcyA9IGF2X21hbGxvY3ooc2l6ZW9mKFJlU2FtcGxlQ29udGV4dCkpOwotICAgIGlmICghcykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGZvciByZXNhbXBsZSBjb250ZXh0LlxuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHMtPnJhdGlvID0gKGZsb2F0KW91dHB1dF9yYXRlIC8gKGZsb2F0KWlucHV0X3JhdGU7Ci0KLSAgICBzLT5pbnB1dF9jaGFubmVscyA9IGlucHV0X2NoYW5uZWxzOwotICAgIHMtPm91dHB1dF9jaGFubmVscyA9IG91dHB1dF9jaGFubmVsczsKLQotICAgIHMtPmZpbHRlcl9jaGFubmVscyA9IHMtPmlucHV0X2NoYW5uZWxzOwotICAgIGlmIChzLT5vdXRwdXRfY2hhbm5lbHMgPCBzLT5maWx0ZXJfY2hhbm5lbHMpCi0gICAgICAgIHMtPmZpbHRlcl9jaGFubmVscyA9IHMtPm91dHB1dF9jaGFubmVsczsKLQotICAgIHMtPnNhbXBsZV9mbXRbMF0gID0gc2FtcGxlX2ZtdF9pbjsKLSAgICBzLT5zYW1wbGVfZm10WzFdICA9IHNhbXBsZV9mbXRfb3V0OwotICAgIHMtPnNhbXBsZV9zaXplWzBdID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUocy0+c2FtcGxlX2ZtdFswXSk7Ci0gICAgcy0+c2FtcGxlX3NpemVbMV0gPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzLT5zYW1wbGVfZm10WzFdKTsKLQotICAgIGlmIChzLT5zYW1wbGVfZm10WzBdICE9IEFWX1NBTVBMRV9GTVRfUzE2KSB7Ci0gICAgICAgIGlmICghKHMtPmNvbnZlcnRfY3R4WzBdID0gYXZfYXVkaW9fY29udmVydF9hbGxvYyhBVl9TQU1QTEVfRk1UX1MxNiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNhbXBsZV9mbXRbMF0sIDEsIE5VTEwsIDApKSkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgJXMgc2FtcGxlIGZvcm1hdCB0byBzMTYgc2FtcGxlIGZvcm1hdFxuIiwKLSAgICAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHMtPnNhbXBsZV9mbXRbMF0pKTsKLSAgICAgICAgICAgIGF2X2ZyZWUocyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChzLT5zYW1wbGVfZm10WzFdICE9IEFWX1NBTVBMRV9GTVRfUzE2KSB7Ci0gICAgICAgIGlmICghKHMtPmNvbnZlcnRfY3R4WzFdID0gYXZfYXVkaW9fY29udmVydF9hbGxvYyhzLT5zYW1wbGVfZm10WzFdLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTYsIDEsIE5VTEwsIDApKSkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbnZlcnQgczE2IHNhbXBsZSBmb3JtYXQgdG8gJXMgc2FtcGxlIGZvcm1hdFxuIiwKLSAgICAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHMtPnNhbXBsZV9mbXRbMV0pKTsKLSAgICAgICAgICAgIGF2X2F1ZGlvX2NvbnZlcnRfZnJlZShzLT5jb252ZXJ0X2N0eFswXSk7Ci0gICAgICAgICAgICBhdl9mcmVlKHMpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzLT5yZXNhbXBsZV9jb250ZXh0ID0gYXZfcmVzYW1wbGVfaW5pdChvdXRwdXRfcmF0ZSwgaW5wdXRfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJfbGVuZ3RoLCBsb2cyX3BoYXNlX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVhciwgY3V0b2ZmKTsKLQotICAgICooY29uc3QgQVZDbGFzcyoqKXMtPnJlc2FtcGxlX2NvbnRleHQgPSAmYXVkaW9yZXNhbXBsZV9jb250ZXh0X2NsYXNzOwotCi0gICAgcmV0dXJuIHM7Ci19Ci0KLS8qIHJlc2FtcGxlIGF1ZGlvLiAnbmJfc2FtcGxlcycgaXMgdGhlIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCi0vKiBYWFg6IG9wdGltaXplIGl0ICEgKi8KLWludCBhdWRpb19yZXNhbXBsZShSZVNhbXBsZUNvbnRleHQgKnMsIHNob3J0ICpvdXRwdXQsIHNob3J0ICppbnB1dCwgaW50IG5iX3NhbXBsZXMpCi17Ci0gICAgaW50IGksIG5iX3NhbXBsZXMxOwotICAgIHNob3J0ICpidWZpbltNQVhfQ0hBTk5FTFNdOwotICAgIHNob3J0ICpidWZvdXRbTUFYX0NIQU5ORUxTXTsKLSAgICBzaG9ydCAqYnVmdG1wMltNQVhfQ0hBTk5FTFNdLCAqYnVmdG1wM1tNQVhfQ0hBTk5FTFNdOwotICAgIHNob3J0ICpvdXRwdXRfYmFrID0gTlVMTDsKLSAgICBpbnQgbGVub3V0OwotCi0gICAgaWYgKHMtPmlucHV0X2NoYW5uZWxzID09IHMtPm91dHB1dF9jaGFubmVscyAmJiBzLT5yYXRpbyA9PSAxLjAgJiYgMCkgewotICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgICAgIG1lbWNweShvdXRwdXQsIGlucHV0LCBuYl9zYW1wbGVzICogcy0+aW5wdXRfY2hhbm5lbHMgKiBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgcmV0dXJuIG5iX3NhbXBsZXM7Ci0gICAgfQotCi0gICAgaWYgKHMtPnNhbXBsZV9mbXRbMF0gIT0gQVZfU0FNUExFX0ZNVF9TMTYpIHsKLSAgICAgICAgaW50IGlzdHJpZGVbMV0gPSB7IHMtPnNhbXBsZV9zaXplWzBdIH07Ci0gICAgICAgIGludCBvc3RyaWRlWzFdID0geyAyIH07Ci0gICAgICAgIGNvbnN0IHZvaWQgKmlidWZbMV0gPSB7IGlucHV0IH07Ci0gICAgICAgIHZvaWQgICAgICAgKm9idWZbMV07Ci0gICAgICAgIHVuc2lnbmVkIGlucHV0X3NpemUgPSBuYl9zYW1wbGVzICogcy0+aW5wdXRfY2hhbm5lbHMgKiAyOwotCi0gICAgICAgIGlmICghcy0+YnVmZmVyX3NpemVbMF0gfHwgcy0+YnVmZmVyX3NpemVbMF0gPCBpbnB1dF9zaXplKSB7Ci0gICAgICAgICAgICBhdl9mcmVlKHMtPmJ1ZmZlclswXSk7Ci0gICAgICAgICAgICBzLT5idWZmZXJfc2l6ZVswXSA9IGlucHV0X3NpemU7Ci0gICAgICAgICAgICBzLT5idWZmZXJbMF0gPSBhdl9tYWxsb2Mocy0+YnVmZmVyX3NpemVbMF0pOwotICAgICAgICAgICAgaWYgKCFzLT5idWZmZXJbMF0pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+cmVzYW1wbGVfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvYnVmWzBdID0gcy0+YnVmZmVyWzBdOwotCi0gICAgICAgIGlmIChhdl9hdWRpb19jb252ZXJ0KHMtPmNvbnZlcnRfY3R4WzBdLCBvYnVmLCBvc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYnVmLCBpc3RyaWRlLCBuYl9zYW1wbGVzICogcy0+aW5wdXRfY2hhbm5lbHMpIDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKHMtPnJlc2FtcGxlX2NvbnRleHQsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiQXVkaW8gc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlucHV0ID0gcy0+YnVmZmVyWzBdOwotICAgIH0KLQotICAgIGxlbm91dD0gMipzLT5vdXRwdXRfY2hhbm5lbHMqbmJfc2FtcGxlcyAqIHMtPnJhdGlvICsgMTY7Ci0KLSAgICBpZiAocy0+c2FtcGxlX2ZtdFsxXSAhPSBBVl9TQU1QTEVfRk1UX1MxNikgewotICAgICAgICBpbnQgb3V0X3NpemUgPSBsZW5vdXQgKiBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzLT5zYW1wbGVfZm10WzFdKSAqCi0gICAgICAgICAgICAgICAgICAgICAgIHMtPm91dHB1dF9jaGFubmVsczsKLSAgICAgICAgb3V0cHV0X2JhayA9IG91dHB1dDsKLQotICAgICAgICBpZiAoIXMtPmJ1ZmZlcl9zaXplWzFdIHx8IHMtPmJ1ZmZlcl9zaXplWzFdIDwgb3V0X3NpemUpIHsKLSAgICAgICAgICAgIGF2X2ZyZWUocy0+YnVmZmVyWzFdKTsKLSAgICAgICAgICAgIHMtPmJ1ZmZlcl9zaXplWzFdID0gb3V0X3NpemU7Ci0gICAgICAgICAgICBzLT5idWZmZXJbMV0gPSBhdl9tYWxsb2Mocy0+YnVmZmVyX3NpemVbMV0pOwotICAgICAgICAgICAgaWYgKCFzLT5idWZmZXJbMV0pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+cmVzYW1wbGVfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGFsbG9jYXRlIGJ1ZmZlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBvdXRwdXQgPSBzLT5idWZmZXJbMV07Ci0gICAgfQotCi0gICAgLyogWFhYOiBtb3ZlIHRob3NlIG1hbGxvYyB0byByZXNhbXBsZSBpbml0IGNvZGUgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZmlsdGVyX2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgYnVmaW5baV0gPSBhdl9tYWxsb2NfYXJyYXkoKG5iX3NhbXBsZXMgKyBzLT50ZW1wX2xlbiksIHNpemVvZihzaG9ydCkpOwotICAgICAgICBidWZvdXRbaV0gPSBhdl9tYWxsb2NfYXJyYXkobGVub3V0LCBzaXplb2Yoc2hvcnQpKTsKLQotICAgICAgICBpZiAoIWJ1ZmluW2ldIHx8ICFidWZvdXRbaV0pIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLT5yZXNhbXBsZV9jb250ZXh0LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKLSAgICAgICAgICAgIG5iX3NhbXBsZXMxID0gMDsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweShidWZpbltpXSwgcy0+dGVtcFtpXSwgcy0+dGVtcF9sZW4gKiBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgYnVmdG1wMltpXSA9IGJ1ZmluW2ldICsgcy0+dGVtcF9sZW47Ci0gICAgfQotCi0gICAgaWYgKHMtPmlucHV0X2NoYW5uZWxzID09IDIgJiYgcy0+b3V0cHV0X2NoYW5uZWxzID09IDEpIHsKLSAgICAgICAgYnVmdG1wM1swXSA9IG91dHB1dDsKLSAgICAgICAgc3RlcmVvX3RvX21vbm8oYnVmdG1wMlswXSwgaW5wdXQsIG5iX3NhbXBsZXMpOwotICAgIH0gZWxzZSBpZiAocy0+b3V0cHV0X2NoYW5uZWxzID49IDIgJiYgcy0+aW5wdXRfY2hhbm5lbHMgPT0gMSkgewotICAgICAgICBidWZ0bXAzWzBdID0gYnVmb3V0WzBdOwotICAgICAgICBtZW1jcHkoYnVmdG1wMlswXSwgaW5wdXQsIG5iX3NhbXBsZXMgKiBzaXplb2Yoc2hvcnQpKTsKLSAgICB9IGVsc2UgaWYgKHMtPmlucHV0X2NoYW5uZWxzID09IDYgJiYgcy0+b3V0cHV0X2NoYW5uZWxzID09MikgewotICAgICAgICBidWZ0bXAzWzBdID0gYnVmb3V0WzBdOwotICAgICAgICBidWZ0bXAzWzFdID0gYnVmb3V0WzFdOwotICAgICAgICBzdXJyb3VuZF90b19zdGVyZW8oYnVmdG1wMiwgaW5wdXQsIHMtPmlucHV0X2NoYW5uZWxzLCBuYl9zYW1wbGVzKTsKLSAgICB9IGVsc2UgaWYgKHMtPm91dHB1dF9jaGFubmVscyA+PSBzLT5pbnB1dF9jaGFubmVscyAmJiBzLT5pbnB1dF9jaGFubmVscyA+PSAyKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5pbnB1dF9jaGFubmVsczsgaSsrKSB7Ci0gICAgICAgICAgICBidWZ0bXAzW2ldID0gYnVmb3V0W2ldOwotICAgICAgICB9Ci0gICAgICAgIGRlaW50ZXJsZWF2ZShidWZ0bXAyLCBpbnB1dCwgcy0+aW5wdXRfY2hhbm5lbHMsIG5iX3NhbXBsZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZnRtcDNbMF0gPSBvdXRwdXQ7Ci0gICAgICAgIG1lbWNweShidWZ0bXAyWzBdLCBpbnB1dCwgbmJfc2FtcGxlcyAqIHNpemVvZihzaG9ydCkpOwotICAgIH0KLQotICAgIG5iX3NhbXBsZXMgKz0gcy0+dGVtcF9sZW47Ci0KLSAgICAvKiByZXNhbXBsZSBlYWNoIGNoYW5uZWwgKi8KLSAgICBuYl9zYW1wbGVzMSA9IDA7IC8qIGF2b2lkIHdhcm5pbmcgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZmlsdGVyX2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgaW50IGNvbnN1bWVkOwotICAgICAgICBpbnQgaXNfbGFzdCA9IGkgKyAxID09IHMtPmZpbHRlcl9jaGFubmVsczsKLQotICAgICAgICBuYl9zYW1wbGVzMSA9IGF2X3Jlc2FtcGxlKHMtPnJlc2FtcGxlX2NvbnRleHQsIGJ1ZnRtcDNbaV0sIGJ1ZmluW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb25zdW1lZCwgbmJfc2FtcGxlcywgbGVub3V0LCBpc19sYXN0KTsKLSAgICAgICAgcy0+dGVtcF9sZW4gPSBuYl9zYW1wbGVzIC0gY29uc3VtZWQ7Ci0gICAgICAgIHMtPnRlbXBbaV0gPSBhdl9yZWFsbG9jX2FycmF5KHMtPnRlbXBbaV0sIHMtPnRlbXBfbGVuLCBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgbWVtY3B5KHMtPnRlbXBbaV0sIGJ1ZmluW2ldICsgY29uc3VtZWQsIHMtPnRlbXBfbGVuICogc2l6ZW9mKHNob3J0KSk7Ci0gICAgfQotCi0gICAgaWYgKHMtPm91dHB1dF9jaGFubmVscyA9PSAyICYmIHMtPmlucHV0X2NoYW5uZWxzID09IDEpIHsKLSAgICAgICAgbW9ub190b19zdGVyZW8ob3V0cHV0LCBidWZ0bXAzWzBdLCBuYl9zYW1wbGVzMSk7Ci0gICAgfSBlbHNlIGlmIChzLT5vdXRwdXRfY2hhbm5lbHMgPT0gNiAmJiBzLT5pbnB1dF9jaGFubmVscyA9PSAyKSB7Ci0gICAgICAgIGFjM181cDFfbXV4KG91dHB1dCwgYnVmdG1wM1swXSwgYnVmdG1wM1sxXSwgbmJfc2FtcGxlczEpOwotICAgIH0gZWxzZSBpZiAoKHMtPm91dHB1dF9jaGFubmVscyA9PSBzLT5pbnB1dF9jaGFubmVscyAmJiBzLT5pbnB1dF9jaGFubmVscyA+PSAyKSB8fAotICAgICAgICAgICAgICAgKHMtPm91dHB1dF9jaGFubmVscyA9PSAyICYmIHMtPmlucHV0X2NoYW5uZWxzID09IDYpKSB7Ci0gICAgICAgIGludGVybGVhdmUob3V0cHV0LCBidWZ0bXAzLCBzLT5vdXRwdXRfY2hhbm5lbHMsIG5iX3NhbXBsZXMxKTsKLSAgICB9Ci0KLSAgICBpZiAocy0+c2FtcGxlX2ZtdFsxXSAhPSBBVl9TQU1QTEVfRk1UX1MxNikgewotICAgICAgICBpbnQgaXN0cmlkZVsxXSA9IHsgMiB9OwotICAgICAgICBpbnQgb3N0cmlkZVsxXSA9IHsgcy0+c2FtcGxlX3NpemVbMV0gfTsKLSAgICAgICAgY29uc3Qgdm9pZCAqaWJ1ZlsxXSA9IHsgb3V0cHV0IH07Ci0gICAgICAgIHZvaWQgICAgICAgKm9idWZbMV0gPSB7IG91dHB1dF9iYWsgfTsKLQotICAgICAgICBpZiAoYXZfYXVkaW9fY29udmVydChzLT5jb252ZXJ0X2N0eFsxXSwgb2J1Ziwgb3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWJ1ZiwgaXN0cmlkZSwgbmJfc2FtcGxlczEgKiBzLT5vdXRwdXRfY2hhbm5lbHMpIDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKHMtPnJlc2FtcGxlX2NvbnRleHQsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiQXVkaW8gc2FtcGxlIGZvcm1hdCBjb252ZXJzaW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLQotZmFpbDoKLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZmlsdGVyX2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgYXZfZnJlZShidWZpbltpXSk7Ci0gICAgICAgIGF2X2ZyZWUoYnVmb3V0W2ldKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmJfc2FtcGxlczE7Ci19Ci0KLXZvaWQgYXVkaW9fcmVzYW1wbGVfY2xvc2UoUmVTYW1wbGVDb250ZXh0ICpzKQotewotICAgIGludCBpOwotICAgIGF2X3Jlc2FtcGxlX2Nsb3NlKHMtPnJlc2FtcGxlX2NvbnRleHQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5maWx0ZXJfY2hhbm5lbHM7IGkrKykKLSAgICAgICAgYXZfZnJlZXAoJnMtPnRlbXBbaV0pOwotICAgIGF2X2ZyZWVwKCZzLT5idWZmZXJbMF0pOwotICAgIGF2X2ZyZWVwKCZzLT5idWZmZXJbMV0pOwotICAgIGF2X2F1ZGlvX2NvbnZlcnRfZnJlZShzLT5jb252ZXJ0X2N0eFswXSk7Ci0gICAgYXZfYXVkaW9fY29udmVydF9mcmVlKHMtPmNvbnZlcnRfY3R4WzFdKTsKLSAgICBhdl9mcmVlKHMpOwotfQotCi1GRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yZXNhbXBsZTIuYyBiL2xpYmF2Y29kZWMvcmVzYW1wbGUyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2YWU5ZjcuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy9yZXNhbXBsZTIuYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vKgotICogYXVkaW8gcmVzYW1wbGluZwotICogQ29weXJpZ2h0IChjKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLS8qKgotICogQGZpbGUKLSAqIGF1ZGlvIHJlc2FtcGxpbmcKLSAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KLSAqLwotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKLQotI2lmIEZGX0FQSV9BVkNPREVDX1JFU0FNUExFCi0KLSNpZm5kZWYgQ09ORklHX1JFU0FNUExFX0hQCi0jZGVmaW5lIEZJTFRFUl9TSElGVCAxNQotCi10eXBlZGVmIGludDE2X3QgRkVMRU07Ci10eXBlZGVmIGludDMyX3QgRkVMRU0yOwotdHlwZWRlZiBpbnQ2NF90IEZFTEVNTDsKLSNkZWZpbmUgRkVMRU1fTUFYIElOVDE2X01BWAotI2RlZmluZSBGRUxFTV9NSU4gSU5UMTZfTUlOCi0jZGVmaW5lIFdJTkRPV19UWVBFIDkKLSNlbGlmICFkZWZpbmVkKENPTkZJR19SRVNBTVBMRV9BVURJT1BISUxFX0tJRERZX01PREUpCi0jZGVmaW5lIEZJTFRFUl9TSElGVCAzMAotCi0jZGVmaW5lIEZFTEVNIGludDMyX3QKLSNkZWZpbmUgRkVMRU0yIGludDY0X3QKLSNkZWZpbmUgRkVMRU1MIGludDY0X3QKLSNkZWZpbmUgRkVMRU1fTUFYIElOVDMyX01BWAotI2RlZmluZSBGRUxFTV9NSU4gSU5UMzJfTUlOCi0jZGVmaW5lIFdJTkRPV19UWVBFIDEyCi0jZWxzZQotI2RlZmluZSBGSUxURVJfU0hJRlQgMAotCi10eXBlZGVmIGRvdWJsZSBGRUxFTTsKLXR5cGVkZWYgZG91YmxlIEZFTEVNMjsKLXR5cGVkZWYgZG91YmxlIEZFTEVNTDsKLSNkZWZpbmUgV0lORE9XX1RZUEUgMjQKLSNlbmRpZgotCi0KLXR5cGVkZWYgc3RydWN0IEFWUmVzYW1wbGVDb250ZXh0ewotICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOwotICAgIEZFTEVNICpmaWx0ZXJfYmFuazsKLSAgICBpbnQgZmlsdGVyX2xlbmd0aDsKLSAgICBpbnQgaWRlYWxfZHN0X2luY3I7Ci0gICAgaW50IGRzdF9pbmNyOwotICAgIGludCBpbmRleDsKLSAgICBpbnQgZnJhYzsKLSAgICBpbnQgc3JjX2luY3I7Ci0gICAgaW50IGNvbXBlbnNhdGlvbl9kaXN0YW5jZTsKLSAgICBpbnQgcGhhc2Vfc2hpZnQ7Ci0gICAgaW50IHBoYXNlX21hc2s7Ci0gICAgaW50IGxpbmVhcjsKLX1BVlJlc2FtcGxlQ29udGV4dDsKLQotLyoqCi0gKiAwdGggb3JkZXIgbW9kaWZpZWQgYmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLgotICovCi1zdGF0aWMgZG91YmxlIGJlc3NlbChkb3VibGUgeCl7Ci0gICAgZG91YmxlIHY9MTsKLSAgICBkb3VibGUgbGFzdHY9MDsKLSAgICBkb3VibGUgdD0xOwotICAgIGludCBpOwotCi0gICAgeD0geCp4LzQ7Ci0gICAgZm9yKGk9MTsgdiAhPSBsYXN0djsgaSsrKXsKLSAgICAgICAgbGFzdHY9djsKLSAgICAgICAgdCAqPSB4LyhpKmkpOwotICAgICAgICB2ICs9IHQ7Ci0gICAgfQotICAgIHJldHVybiB2OwotfQotCi0vKioKLSAqIEJ1aWxkIGEgcG9seXBoYXNlIGZpbHRlcmJhbmsuCi0gKiBAcGFyYW0gZmFjdG9yIHJlc2FtcGxpbmcgZmFjdG9yCi0gKiBAcGFyYW0gc2NhbGUgd2FudGVkIHN1bSBvZiBjb2VmZmljaWVudHMgZm9yIGVhY2ggZmlsdGVyCi0gKiBAcGFyYW0gdHlwZSAwLT5jdWJpYywgMS0+YmxhY2ttYW4gbnV0dGFsbCB3aW5kb3dlZCBzaW5jLCAyLi4xNi0+a2Fpc2VyIHdpbmRvd2VkIHNpbmMgYmV0YT0yLi4xNgotICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG9uIGVycm9yCi0gKi8KLXN0YXRpYyBpbnQgYnVpbGRfZmlsdGVyKEZFTEVNICpmaWx0ZXIsIGRvdWJsZSBmYWN0b3IsIGludCB0YXBfY291bnQsIGludCBwaGFzZV9jb3VudCwgaW50IHNjYWxlLCBpbnQgdHlwZSl7Ci0gICAgaW50IHBoLCBpOwotICAgIGRvdWJsZSB4LCB5LCB3OwotICAgIGRvdWJsZSAqdGFiID0gYXZfbWFsbG9jX2FycmF5KHRhcF9jb3VudCwgc2l6ZW9mKCp0YWIpKTsKLSAgICBjb25zdCBpbnQgY2VudGVyPSAodGFwX2NvdW50LTEpLzI7Ci0KLSAgICBpZiAoIXRhYikKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIC8qIGlmIHVwc2FtcGxpbmcsIG9ubHkgbmVlZCB0byBpbnRlcnBvbGF0ZSwgbm8gZmlsdGVyICovCi0gICAgaWYgKGZhY3RvciA+IDEuMCkKLSAgICAgICAgZmFjdG9yID0gMS4wOwotCi0gICAgZm9yKHBoPTA7cGg8cGhhc2VfY291bnQ7cGgrKykgewotICAgICAgICBkb3VibGUgbm9ybSA9IDA7Ci0gICAgICAgIGZvcihpPTA7aTx0YXBfY291bnQ7aSsrKSB7Ci0gICAgICAgICAgICB4ID0gTV9QSSAqICgoZG91YmxlKShpIC0gY2VudGVyKSAtIChkb3VibGUpcGggLyBwaGFzZV9jb3VudCkgKiBmYWN0b3I7Ci0gICAgICAgICAgICBpZiAoeCA9PSAwKSB5ID0gMS4wOwotICAgICAgICAgICAgZWxzZSAgICAgICAgeSA9IHNpbih4KSAvIHg7Ci0gICAgICAgICAgICBzd2l0Y2godHlwZSl7Ci0gICAgICAgICAgICBjYXNlIDA6ewotICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGQ9IC0wLjU7IC8vZmlyc3Qgb3JkZXIgZGVyaXZhdGl2ZSA9IC0wLjUKLSAgICAgICAgICAgICAgICB4ID0gZmFicygoKGRvdWJsZSkoaSAtIGNlbnRlcikgLSAoZG91YmxlKXBoIC8gcGhhc2VfY291bnQpICogZmFjdG9yKTsKLSAgICAgICAgICAgICAgICBpZih4PDEuMCkgeT0gMSAtIDMqeCp4ICsgMip4KngqeCArIGQqKCAgICAgICAgICAgIC14KnggKyB4KngqeCk7Ci0gICAgICAgICAgICAgICAgZWxzZSAgICAgIHk9ICAgICAgICAgICAgICAgICAgICAgICBkKigtNCArIDgqeCAtIDUqeCp4ICsgeCp4KngpOwotICAgICAgICAgICAgICAgIGJyZWFrO30KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICB3ID0gMi4wKnggLyAoZmFjdG9yKnRhcF9jb3VudCkgKyBNX1BJOwotICAgICAgICAgICAgICAgIHkgKj0gMC4zNjM1ODE5IC0gMC40ODkxNzc1ICogY29zKHcpICsgMC4xMzY1OTk1ICogY29zKDIqdykgLSAwLjAxMDY0MTEgKiBjb3MoMyp3KTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdyA9IDIuMCp4IC8gKGZhY3Rvcip0YXBfY291bnQqTV9QSSk7Ci0gICAgICAgICAgICAgICAgeSAqPSBiZXNzZWwodHlwZSpzcXJ0KEZGTUFYKDEtdyp3LCAwKSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0YWJbaV0gPSB5OwotICAgICAgICAgICAgbm9ybSArPSB5OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbm9ybWFsaXplIHNvIHRoYXQgYW4gdW5pZm9ybSBjb2xvciByZW1haW5zIHRoZSBzYW1lICovCi0gICAgICAgIGZvcihpPTA7aTx0YXBfY291bnQ7aSsrKSB7Ci0jaWZkZWYgQ09ORklHX1JFU0FNUExFX0FVRElPUEhJTEVfS0lERFlfTU9ERQotICAgICAgICAgICAgZmlsdGVyW3BoICogdGFwX2NvdW50ICsgaV0gPSB0YWJbaV0gLyBub3JtOwotI2Vsc2UKLSAgICAgICAgICAgIGZpbHRlcltwaCAqIHRhcF9jb3VudCArIGldID0gYXZfY2xpcChscmludGYodGFiW2ldICogc2NhbGUgLyBub3JtKSwgRkVMRU1fTUlOLCBGRUxFTV9NQVgpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICB9Ci0jaWYgMAotICAgIHsKLSNkZWZpbmUgTEVOIDEwMjQKLSAgICAgICAgaW50IGosazsKLSAgICAgICAgZG91YmxlIHNpbmVbTEVOICsgdGFwX2NvdW50XTsKLSAgICAgICAgZG91YmxlIGZpbHRlcmVkW0xFTl07Ci0gICAgICAgIGRvdWJsZSBtYXhmZj0tMiwgbWluZmY9MiwgbWF4c2Y9LTIsIG1pbnNmPTI7Ci0gICAgICAgIGZvcihpPTA7IGk8TEVOOyBpKyspewotICAgICAgICAgICAgZG91YmxlIHNzPTAsIHNmPTAsIGZmPTA7Ci0gICAgICAgICAgICBmb3Ioaj0wOyBqPExFTit0YXBfY291bnQ7IGorKykKLSAgICAgICAgICAgICAgICBzaW5lW2pdPSBjb3MoaSpqKk1fUEkvTEVOKTsKLSAgICAgICAgICAgIGZvcihqPTA7IGo8TEVOOyBqKyspewotICAgICAgICAgICAgICAgIGRvdWJsZSBzdW09MDsKLSAgICAgICAgICAgICAgICBwaD0wOwotICAgICAgICAgICAgICAgIGZvcihrPTA7IGs8dGFwX2NvdW50OyBrKyspCi0gICAgICAgICAgICAgICAgICAgIHN1bSArPSBmaWx0ZXJbcGggKiB0YXBfY291bnQgKyBrXSAqIHNpbmVbaytqXTsKLSAgICAgICAgICAgICAgICBmaWx0ZXJlZFtqXT0gc3VtIC8gKDE8PEZJTFRFUl9TSElGVCk7Ci0gICAgICAgICAgICAgICAgc3MrPSBzaW5lW2ogKyBjZW50ZXJdICogc2luZVtqICsgY2VudGVyXTsKLSAgICAgICAgICAgICAgICBmZis9IGZpbHRlcmVkW2pdICogZmlsdGVyZWRbal07Ci0gICAgICAgICAgICAgICAgc2YrPSBzaW5lW2ogKyBjZW50ZXJdICogZmlsdGVyZWRbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcz0gc3FydCgyKnNzL0xFTik7Ci0gICAgICAgICAgICBmZj0gc3FydCgyKmZmL0xFTik7Ci0gICAgICAgICAgICBzZj0gMipzZi9MRU47Ci0gICAgICAgICAgICBtYXhmZj0gRkZNQVgobWF4ZmYsIGZmKTsKLSAgICAgICAgICAgIG1pbmZmPSBGRk1JTihtaW5mZiwgZmYpOwotICAgICAgICAgICAgbWF4c2Y9IEZGTUFYKG1heHNmLCBzZik7Ci0gICAgICAgICAgICBtaW5zZj0gRkZNSU4obWluc2YsIHNmKTsKLSAgICAgICAgICAgIGlmKGklMTE9PTApewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJpOiU0ZCBzczolZiBmZjolMTMuNmUtJTEzLjZlIHNmOiUxMy42ZS0lMTMuNmVcbiIsIGksIHNzLCBtYXhmZiwgbWluZmYsIG1heHNmLCBtaW5zZik7Ci0gICAgICAgICAgICAgICAgbWluZmY9bWluc2Y9IDI7Ci0gICAgICAgICAgICAgICAgbWF4ZmY9bWF4c2Y9IC0yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICBhdl9mcmVlKHRhYik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLUFWUmVzYW1wbGVDb250ZXh0ICphdl9yZXNhbXBsZV9pbml0KGludCBvdXRfcmF0ZSwgaW50IGluX3JhdGUsIGludCBmaWx0ZXJfc2l6ZSwgaW50IHBoYXNlX3NoaWZ0LCBpbnQgbGluZWFyLCBkb3VibGUgY3V0b2ZmKXsKLSAgICBBVlJlc2FtcGxlQ29udGV4dCAqYz0gYXZfbWFsbG9jeihzaXplb2YoQVZSZXNhbXBsZUNvbnRleHQpKTsKLSAgICBkb3VibGUgZmFjdG9yPSBGRk1JTihvdXRfcmF0ZSAqIGN1dG9mZiAvIGluX3JhdGUsIDEuMCk7Ci0gICAgaW50IHBoYXNlX2NvdW50PSAxPDxwaGFzZV9zaGlmdDsKLQotICAgIGlmICghYykKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjLT5waGFzZV9zaGlmdD0gcGhhc2Vfc2hpZnQ7Ci0gICAgYy0+cGhhc2VfbWFzaz0gcGhhc2VfY291bnQtMTsKLSAgICBjLT5saW5lYXI9IGxpbmVhcjsKLQotICAgIGMtPmZpbHRlcl9sZW5ndGg9IEZGTUFYKChpbnQpY2VpbChmaWx0ZXJfc2l6ZS9mYWN0b3IpLCAxKTsKLSAgICBjLT5maWx0ZXJfYmFuaz0gYXZfbWFsbG9jel9hcnJheShjLT5maWx0ZXJfbGVuZ3RoLCAocGhhc2VfY291bnQrMSkqc2l6ZW9mKEZFTEVNKSk7Ci0gICAgaWYgKCFjLT5maWx0ZXJfYmFuaykKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICBpZiAoYnVpbGRfZmlsdGVyKGMtPmZpbHRlcl9iYW5rLCBmYWN0b3IsIGMtPmZpbHRlcl9sZW5ndGgsIHBoYXNlX2NvdW50LCAxPDxGSUxURVJfU0hJRlQsIFdJTkRPV19UWVBFKSkKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICBtZW1jcHkoJmMtPmZpbHRlcl9iYW5rW2MtPmZpbHRlcl9sZW5ndGgqcGhhc2VfY291bnQrMV0sIGMtPmZpbHRlcl9iYW5rLCAoYy0+ZmlsdGVyX2xlbmd0aC0xKSpzaXplb2YoRkVMRU0pKTsKLSAgICBjLT5maWx0ZXJfYmFua1tjLT5maWx0ZXJfbGVuZ3RoKnBoYXNlX2NvdW50XT0gYy0+ZmlsdGVyX2JhbmtbYy0+ZmlsdGVyX2xlbmd0aCAtIDFdOwotCi0gICAgaWYoIWF2X3JlZHVjZSgmYy0+c3JjX2luY3IsICZjLT5kc3RfaW5jciwgb3V0X3JhdGUsIGluX3JhdGUgKiAoaW50NjRfdClwaGFzZV9jb3VudCwgSU5UMzJfTUFYLzIpKQotICAgICAgICBnb3RvIGVycm9yOwotICAgIGMtPmlkZWFsX2RzdF9pbmNyPSBjLT5kc3RfaW5jcjsKLQotICAgIGMtPmluZGV4PSAtcGhhc2VfY291bnQqKChjLT5maWx0ZXJfbGVuZ3RoLTEpLzIpOwotCi0gICAgcmV0dXJuIGM7Ci1lcnJvcjoKLSAgICBhdl9mcmVlKGMtPmZpbHRlcl9iYW5rKTsKLSAgICBhdl9mcmVlKGMpOwotICAgIHJldHVybiBOVUxMOwotfQotCi12b2lkIGF2X3Jlc2FtcGxlX2Nsb3NlKEFWUmVzYW1wbGVDb250ZXh0ICpjKXsKLSAgICBhdl9mcmVlcCgmYy0+ZmlsdGVyX2JhbmspOwotICAgIGF2X2ZyZWVwKCZjKTsKLX0KLQotdm9pZCBhdl9yZXNhbXBsZV9jb21wZW5zYXRlKEFWUmVzYW1wbGVDb250ZXh0ICpjLCBpbnQgc2FtcGxlX2RlbHRhLCBpbnQgY29tcGVuc2F0aW9uX2Rpc3RhbmNlKXsKLS8vICAgIHNhbXBsZV9kZWx0YSArPSAoYy0+aWRlYWxfZHN0X2luY3IgLSBjLT5kc3RfaW5jcikqKGludDY0X3QpYy0+Y29tcGVuc2F0aW9uX2Rpc3RhbmNlIC8gYy0+aWRlYWxfZHN0X2luY3I7Ci0gICAgYy0+Y29tcGVuc2F0aW9uX2Rpc3RhbmNlPSBjb21wZW5zYXRpb25fZGlzdGFuY2U7Ci0gICAgYy0+ZHN0X2luY3IgPSBjLT5pZGVhbF9kc3RfaW5jciAtIGMtPmlkZWFsX2RzdF9pbmNyICogKGludDY0X3Qpc2FtcGxlX2RlbHRhIC8gY29tcGVuc2F0aW9uX2Rpc3RhbmNlOwotfQotCi1pbnQgYXZfcmVzYW1wbGUoQVZSZXNhbXBsZUNvbnRleHQgKmMsIHNob3J0ICpkc3QsIHNob3J0ICpzcmMsIGludCAqY29uc3VtZWQsIGludCBzcmNfc2l6ZSwgaW50IGRzdF9zaXplLCBpbnQgdXBkYXRlX2N0eCl7Ci0gICAgaW50IGRzdF9pbmRleCwgaTsKLSAgICBpbnQgaW5kZXg9IGMtPmluZGV4OwotICAgIGludCBmcmFjPSBjLT5mcmFjOwotICAgIGludCBkc3RfaW5jcl9mcmFjPSBjLT5kc3RfaW5jciAlIGMtPnNyY19pbmNyOwotICAgIGludCBkc3RfaW5jcj0gICAgICBjLT5kc3RfaW5jciAvIGMtPnNyY19pbmNyOwotICAgIGludCBjb21wZW5zYXRpb25fZGlzdGFuY2U9IGMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZTsKLQotICBpZihjb21wZW5zYXRpb25fZGlzdGFuY2UgPT0gMCAmJiBjLT5maWx0ZXJfbGVuZ3RoID09IDEgJiYgYy0+cGhhc2Vfc2hpZnQ9PTApewotICAgICAgICBpbnQ2NF90IGluZGV4Mj0gKChpbnQ2NF90KWluZGV4KTw8MzI7Ci0gICAgICAgIGludDY0X3QgaW5jcj0gKDFMTDw8MzIpICogYy0+ZHN0X2luY3IgLyBjLT5zcmNfaW5jcjsKLSAgICAgICAgZHN0X3NpemU9IEZGTUlOKGRzdF9zaXplLCAoc3JjX3NpemUtMS1pbmRleCkgKiAoaW50NjRfdCljLT5zcmNfaW5jciAvIGMtPmRzdF9pbmNyKTsKLQotICAgICAgICBmb3IoZHN0X2luZGV4PTA7IGRzdF9pbmRleCA8IGRzdF9zaXplOyBkc3RfaW5kZXgrKyl7Ci0gICAgICAgICAgICBkc3RbZHN0X2luZGV4XSA9IHNyY1tpbmRleDI+PjMyXTsKLSAgICAgICAgICAgIGluZGV4MiArPSBpbmNyOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4ICs9IGRzdF9pbmRleCAqIGRzdF9pbmNyOwotICAgICAgICBpbmRleCArPSAoZnJhYyArIGRzdF9pbmRleCAqIChpbnQ2NF90KWRzdF9pbmNyX2ZyYWMpIC8gYy0+c3JjX2luY3I7Ci0gICAgICAgIGZyYWMgICA9IChmcmFjICsgZHN0X2luZGV4ICogKGludDY0X3QpZHN0X2luY3JfZnJhYykgJSBjLT5zcmNfaW5jcjsKLSAgfWVsc2V7Ci0gICAgZm9yKGRzdF9pbmRleD0wOyBkc3RfaW5kZXggPCBkc3Rfc2l6ZTsgZHN0X2luZGV4KyspewotICAgICAgICBGRUxFTSAqZmlsdGVyPSBjLT5maWx0ZXJfYmFuayArIGMtPmZpbHRlcl9sZW5ndGgqKGluZGV4ICYgYy0+cGhhc2VfbWFzayk7Ci0gICAgICAgIGludCBzYW1wbGVfaW5kZXg9IGluZGV4ID4+IGMtPnBoYXNlX3NoaWZ0OwotICAgICAgICBGRUxFTTIgdmFsPTA7Ci0KLSAgICAgICAgaWYoc2FtcGxlX2luZGV4IDwgMCl7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPGMtPmZpbHRlcl9sZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB2YWwgKz0gc3JjW0ZGQUJTKHNhbXBsZV9pbmRleCArIGkpICUgc3JjX3NpemVdICogZmlsdGVyW2ldOwotICAgICAgICB9ZWxzZSBpZihzYW1wbGVfaW5kZXggKyBjLT5maWx0ZXJfbGVuZ3RoID4gc3JjX3NpemUpewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH1lbHNlIGlmKGMtPmxpbmVhcil7Ci0gICAgICAgICAgICBGRUxFTTIgdjI9MDsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8Yy0+ZmlsdGVyX2xlbmd0aDsgaSsrKXsKLSAgICAgICAgICAgICAgICB2YWwgKz0gc3JjW3NhbXBsZV9pbmRleCArIGldICogKEZFTEVNMilmaWx0ZXJbaV07Ci0gICAgICAgICAgICAgICAgdjIgICs9IHNyY1tzYW1wbGVfaW5kZXggKyBpXSAqIChGRUxFTTIpZmlsdGVyW2kgKyBjLT5maWx0ZXJfbGVuZ3RoXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbCs9KHYyLXZhbCkqKEZFTEVNTClmcmFjIC8gYy0+c3JjX2luY3I7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgZm9yKGk9MDsgaTxjLT5maWx0ZXJfbGVuZ3RoOyBpKyspewotICAgICAgICAgICAgICAgIHZhbCArPSBzcmNbc2FtcGxlX2luZGV4ICsgaV0gKiAoRkVMRU0yKWZpbHRlcltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jaWZkZWYgQ09ORklHX1JFU0FNUExFX0FVRElPUEhJTEVfS0lERFlfTU9ERQotICAgICAgICBkc3RbZHN0X2luZGV4XSA9IGF2X2NsaXBfaW50MTYobHJpbnRmKHZhbCkpOwotI2Vsc2UKLSAgICAgICAgdmFsID0gKHZhbCArICgxPDwoRklMVEVSX1NISUZULTEpKSk+PkZJTFRFUl9TSElGVDsKLSAgICAgICAgZHN0W2RzdF9pbmRleF0gPSAodW5zaWduZWQpKHZhbCArIDMyNzY4KSA+IDY1NTM1ID8gKHZhbD4+MzEpIF4gMzI3NjcgOiB2YWw7Ci0jZW5kaWYKLQotICAgICAgICBmcmFjICs9IGRzdF9pbmNyX2ZyYWM7Ci0gICAgICAgIGluZGV4ICs9IGRzdF9pbmNyOwotICAgICAgICBpZihmcmFjID49IGMtPnNyY19pbmNyKXsKLSAgICAgICAgICAgIGZyYWMgLT0gYy0+c3JjX2luY3I7Ci0gICAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoZHN0X2luZGV4ICsgMSA9PSBjb21wZW5zYXRpb25fZGlzdGFuY2UpewotICAgICAgICAgICAgY29tcGVuc2F0aW9uX2Rpc3RhbmNlPSAwOwotICAgICAgICAgICAgZHN0X2luY3JfZnJhYz0gYy0+aWRlYWxfZHN0X2luY3IgJSBjLT5zcmNfaW5jcjsKLSAgICAgICAgICAgIGRzdF9pbmNyPSAgICAgIGMtPmlkZWFsX2RzdF9pbmNyIC8gYy0+c3JjX2luY3I7Ci0gICAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAqY29uc3VtZWQ9IEZGTUFYKGluZGV4LCAwKSA+PiBjLT5waGFzZV9zaGlmdDsKLSAgICBpZihpbmRleD49MCkgaW5kZXggJj0gYy0+cGhhc2VfbWFzazsKLQotICAgIGlmKGNvbXBlbnNhdGlvbl9kaXN0YW5jZSl7Ci0gICAgICAgIGNvbXBlbnNhdGlvbl9kaXN0YW5jZSAtPSBkc3RfaW5kZXg7Ci0gICAgICAgIGF2X2Fzc2VydDIoY29tcGVuc2F0aW9uX2Rpc3RhbmNlID4gMCk7Ci0gICAgfQotICAgIGlmKHVwZGF0ZV9jdHgpewotICAgICAgICBjLT5mcmFjPSBmcmFjOwotICAgICAgICBjLT5pbmRleD0gaW5kZXg7Ci0gICAgICAgIGMtPmRzdF9pbmNyPSBkc3RfaW5jcl9mcmFjICsgYy0+c3JjX2luY3IqZHN0X2luY3I7Ci0gICAgICAgIGMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZT0gY29tcGVuc2F0aW9uX2Rpc3RhbmNlOwotICAgIH0KLQotICAgIHJldHVybiBkc3RfaW5kZXg7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ya21wcGRlYy5jIGIvbGliYXZjb2RlYy9ya21wcGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2QwNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3JrbXBwZGVjLmMKQEAgLTAsMCArMSw1ODYgQEAKKy8qCisgKiBSb2NrQ2hpcCBNUFAgVmlkZW8gRGVjb2RlcgorICogQ29weXJpZ2h0IChjKSAyMDE3IExpb25lbCBDSEFaQUxMT04KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGRybV9mb3VyY2MuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cm9ja2NoaXAvbXBwX2J1ZmZlci5oPgorI2luY2x1ZGUgPHJvY2tjaGlwL3JrX21waS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJkZWNvZGUuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X2RybS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKworI2RlZmluZSBSRUNFSVZFX0ZSQU1FX1RJTUVPVVQgICAxMDAKKyNkZWZpbmUgRlJBTUVHUk9VUF9NQVhfRlJBTUVTICAgMTYKKyNkZWZpbmUgSU5QVVRfTUFYX1BBQ0tFVFMgICAgICAgNAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgTXBwQ3R4IGN0eDsKKyAgICBNcHBBcGkgKm1waTsKKyAgICBNcHBCdWZmZXJHcm91cCBmcmFtZV9ncm91cDsKKworICAgIGNoYXIgZmlyc3RfcGFja2V0OworICAgIGNoYXIgZW9zX3JlYWNoZWQ7CisKKyAgICBBVkJ1ZmZlclJlZiAqZnJhbWVzX3JlZjsKKyAgICBBVkJ1ZmZlclJlZiAqZGV2aWNlX3JlZjsKK30gUktNUFBEZWNvZGVyOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgQVZDbGFzcyAqYXZfY2xhc3M7CisgICAgQVZCdWZmZXJSZWYgKmRlY29kZXJfcmVmOworfSBSS01QUERlY29kZUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBNcHBGcmFtZSBmcmFtZTsKKyAgICBBVkJ1ZmZlclJlZiAqZGVjb2Rlcl9yZWY7Cit9IFJLTVBQRnJhbWVDb250ZXh0OworCitzdGF0aWMgTXBwQ29kaW5nVHlwZSBya21wcF9nZXRfY29kaW5ndHlwZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6ICAgICAgICAgIHJldHVybiBNUFBfVklERU9fQ29kaW5nQVZDOworICAgIGNhc2UgQVZfQ09ERUNfSURfSEVWQzogICAgICAgICAgcmV0dXJuIE1QUF9WSURFT19Db2RpbmdIRVZDOworICAgIGNhc2UgQVZfQ09ERUNfSURfVlA4OiAgICAgICAgICAgcmV0dXJuIE1QUF9WSURFT19Db2RpbmdWUDg7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDk6ICAgICAgICAgICByZXR1cm4gTVBQX1ZJREVPX0NvZGluZ1ZQOTsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNUFBfVklERU9fQ29kaW5nVW51c2VkOworICAgIH0KK30KKworc3RhdGljIHVpbnQzMl90IHJrbXBwX2dldF9mcmFtZWZvcm1hdChNcHBGcmFtZUZvcm1hdCBtcHBmb3JtYXQpCit7CisgICAgc3dpdGNoIChtcHBmb3JtYXQpIHsKKyAgICBjYXNlIE1QUF9GTVRfWVVWNDIwU1A6ICAgICAgICAgIHJldHVybiBEUk1fRk9STUFUX05WMTI7CisjaWZkZWYgRFJNX0ZPUk1BVF9OVjEyXzEwCisgICAgY2FzZSBNUFBfRk1UX1lVVjQyMFNQXzEwQklUOiAgICByZXR1cm4gRFJNX0ZPUk1BVF9OVjEyXzEwOworI2VuZGlmCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmttcHBfd3JpdGVfZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKmJ1ZmZlciwgaW50IHNpemUsIGludDY0X3QgcHRzKQoreworICAgIFJLTVBQRGVjb2RlQ29udGV4dCAqcmtfY29udGV4dCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgUktNUFBEZWNvZGVyICpkZWNvZGVyID0gKFJLTVBQRGVjb2RlciAqKXJrX2NvbnRleHQtPmRlY29kZXJfcmVmLT5kYXRhOworICAgIGludCByZXQ7CisgICAgTXBwUGFja2V0IHBhY2tldDsKKworICAgIC8vIGNyZWF0ZSB0aGUgTVBQIHBhY2tldAorICAgIHJldCA9IG1wcF9wYWNrZXRfaW5pdCgmcGFja2V0LCBidWZmZXIsIHNpemUpOworICAgIGlmIChyZXQgIT0gTVBQX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXQgTVBQIHBhY2tldCAoY29kZSA9ICVkKVxuIiwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBtcHBfcGFja2V0X3NldF9wdHMocGFja2V0LCBwdHMpOworCisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIG1wcF9wYWNrZXRfc2V0X2VvcyhwYWNrZXQpOworCisgICAgcmV0ID0gZGVjb2Rlci0+bXBpLT5kZWNvZGVfcHV0X3BhY2tldChkZWNvZGVyLT5jdHgsIHBhY2tldCk7CisgICAgaWYgKHJldCAhPSBNUFBfT0spIHsKKyAgICAgICAgaWYgKHJldCA9PSBNUFBfRVJSX0JVRkZFUl9GVUxMKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkJ1ZmZlciBmdWxsIHdyaXRpbmcgJWQgYnl0ZXMgdG8gZGVjb2RlclxuIiwgc2l6ZSk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiV3JvdGUgJWQgYnl0ZXMgdG8gZGVjb2RlclxuIiwgc2l6ZSk7CisKKyAgICBtcHBfcGFja2V0X2RlaW5pdCgmcGFja2V0KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmttcHBfY2xvc2VfZGVjb2RlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUktNUFBEZWNvZGVDb250ZXh0ICpya19jb250ZXh0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJnJrX2NvbnRleHQtPmRlY29kZXJfcmVmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcmttcHBfcmVsZWFzZV9kZWNvZGVyKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBSS01QUERlY29kZXIgKmRlY29kZXIgPSAoUktNUFBEZWNvZGVyICopZGF0YTsKKworICAgIGlmIChkZWNvZGVyLT5tcGkpIHsKKyAgICAgICAgZGVjb2Rlci0+bXBpLT5yZXNldChkZWNvZGVyLT5jdHgpOworICAgICAgICBtcHBfZGVzdHJveShkZWNvZGVyLT5jdHgpOworICAgICAgICBkZWNvZGVyLT5jdHggPSBOVUxMOworICAgIH0KKworICAgIGlmIChkZWNvZGVyLT5mcmFtZV9ncm91cCkgeworICAgICAgICBtcHBfYnVmZmVyX2dyb3VwX3B1dChkZWNvZGVyLT5mcmFtZV9ncm91cCk7CisgICAgICAgIGRlY29kZXItPmZyYW1lX2dyb3VwID0gTlVMTDsKKyAgICB9CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmRlY29kZXItPmZyYW1lc19yZWYpOworICAgIGF2X2J1ZmZlcl91bnJlZigmZGVjb2Rlci0+ZGV2aWNlX3JlZik7CisKKyAgICBhdl9mcmVlKGRlY29kZXIpOworfQorCitzdGF0aWMgaW50IHJrbXBwX2luaXRfZGVjb2RlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgUktNUFBEZWNvZGVDb250ZXh0ICpya19jb250ZXh0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBSS01QUERlY29kZXIgKmRlY29kZXIgPSBOVUxMOworICAgIE1wcENvZGluZ1R5cGUgY29kZWN0eXBlID0gTVBQX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICBpbnQgcmV0OworICAgIFJLX1M2NCBwYXJhbVM2NDsKKyAgICBSS19TMzIgcGFyYW1TMzI7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfRFJNX1BSSU1FOworCisgICAgLy8gY3JlYXRlIGEgZGVjb2RlciBhbmQgYSByZWYgdG8gaXQKKyAgICBkZWNvZGVyID0gYXZfbWFsbG9jeihzaXplb2YoUktNUFBEZWNvZGVyKSk7CisgICAgaWYgKCFkZWNvZGVyKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJrX2NvbnRleHQtPmRlY29kZXJfcmVmID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCAqKWRlY29kZXIsIHNpemVvZigqZGVjb2RlciksIHJrbXBwX3JlbGVhc2VfZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgQVZfQlVGRkVSX0ZMQUdfUkVBRE9OTFkpOworICAgIGlmICghcmtfY29udGV4dC0+ZGVjb2Rlcl9yZWYpIHsKKyAgICAgICAgYXZfZnJlZShkZWNvZGVyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJJbml0aWFsaXppbmcgUktNUFAgZGVjb2Rlci5cbiIpOworCisgICAgY29kZWN0eXBlID0gcmttcHBfZ2V0X2NvZGluZ3R5cGUoYXZjdHgpOworICAgIGlmIChjb2RlY3R5cGUgPT0gTVBQX1ZJREVPX0NvZGluZ1VudXNlZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY29kZWMgdHlwZSAoJWQpLlxuIiwgYXZjdHgtPmNvZGVjX2lkKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gbXBwX2NoZWNrX3N1cHBvcnRfZm9ybWF0KE1QUF9DVFhfREVDLCBjb2RlY3R5cGUpOworICAgIGlmIChyZXQgIT0gTVBQX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29kZWMgdHlwZSAoJWQpIHVuc3VwcG9ydGVkIGJ5IE1QUFxuIiwgYXZjdHgtPmNvZGVjX2lkKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSBNUFAgY29udGV4dAorICAgIHJldCA9IG1wcF9jcmVhdGUoJmRlY29kZXItPmN0eCwgJmRlY29kZXItPm1waSk7CisgICAgaWYgKHJldCAhPSBNUFBfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIE1QUCBjb250ZXh0IChjb2RlID0gJWQpLlxuIiwgcmV0KTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBtcHAKKyAgICByZXQgPSBtcHBfaW5pdChkZWNvZGVyLT5jdHgsIE1QUF9DVFhfREVDLCBjb2RlY3R5cGUpOworICAgIGlmIChyZXQgIT0gTVBQX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgTVBQIGNvbnRleHQgKGNvZGUgPSAlZCkuXG4iLCByZXQpOworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvLyBtYWtlIGRlY29kZSBjYWxscyBibG9ja2luZyB3aXRoIGEgdGltZW91dAorICAgIHBhcmFtUzMyID0gTVBQX1BPTExfQkxPQ0s7CisgICAgcmV0ID0gZGVjb2Rlci0+bXBpLT5jb250cm9sKGRlY29kZXItPmN0eCwgTVBQX1NFVF9PVVRQVVRfQkxPQ0ssICZwYXJhbVMzMik7CisgICAgaWYgKHJldCAhPSBNUFBfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGJsb2NraW5nIG1vZGUgb24gTVBJIChjb2RlID0gJWQpLlxuIiwgcmV0KTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcGFyYW1TNjQgPSBSRUNFSVZFX0ZSQU1FX1RJTUVPVVQ7CisgICAgcmV0ID0gZGVjb2Rlci0+bXBpLT5jb250cm9sKGRlY29kZXItPmN0eCwgTVBQX1NFVF9PVVRQVVRfQkxPQ0tfVElNRU9VVCwgJnBhcmFtUzY0KTsKKyAgICBpZiAocmV0ICE9IE1QUF9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQgYmxvY2sgdGltZW91dCBvbiBNUEkgKGNvZGUgPSAlZCkuXG4iLCByZXQpOworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBtcHBfYnVmZmVyX2dyb3VwX2dldF9pbnRlcm5hbCgmZGVjb2Rlci0+ZnJhbWVfZ3JvdXAsIE1QUF9CVUZGRVJfVFlQRV9JT04pOworICAgIGlmIChyZXQpIHsKKyAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZXRyaWV2ZSBidWZmZXIgZ3JvdXAgKGNvZGUgPSAlZClcbiIsIHJldCk7CisgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBkZWNvZGVyLT5tcGktPmNvbnRyb2woZGVjb2Rlci0+Y3R4LCBNUFBfREVDX1NFVF9FWFRfQlVGX0dST1VQLCBkZWNvZGVyLT5mcmFtZV9ncm91cCk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhc3NpZ24gYnVmZmVyIGdyb3VwIChjb2RlID0gJWQpXG4iLCByZXQpOworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBtcHBfYnVmZmVyX2dyb3VwX2xpbWl0X2NvbmZpZyhkZWNvZGVyLT5mcmFtZV9ncm91cCwgMCwgRlJBTUVHUk9VUF9NQVhfRlJBTUVTKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBidWZmZXIgZ3JvdXAgbGltaXQgKGNvZGUgPSAlZClcbiIsIHJldCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGRlY29kZXItPmZpcnN0X3BhY2tldCA9IDE7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlJLTVBQIGRlY29kZXIgaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5LlxuIik7CisKKyAgICBkZWNvZGVyLT5kZXZpY2VfcmVmID0gYXZfaHdkZXZpY2VfY3R4X2FsbG9jKEFWX0hXREVWSUNFX1RZUEVfRFJNKTsKKyAgICBpZiAoIWRlY29kZXItPmRldmljZV9yZWYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHJldCA9IGF2X2h3ZGV2aWNlX2N0eF9pbml0KGRlY29kZXItPmRldmljZV9yZWYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIFJLTVBQIGRlY29kZXIuXG4iKTsKKyAgICBya21wcF9jbG9zZV9kZWNvZGVyKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJrbXBwX3NlbmRfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFJLTVBQRGVjb2RlQ29udGV4dCAqcmtfY29udGV4dCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgUktNUFBEZWNvZGVyICpkZWNvZGVyID0gKFJLTVBQRGVjb2RlciAqKXJrX2NvbnRleHQtPmRlY29kZXJfcmVmLT5kYXRhOworICAgIGludCByZXQ7CisKKyAgICAvLyBoYW5kbGUgRU9GCisgICAgaWYgKCFhdnBrdC0+c2l6ZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVuZCBvZiBzdHJlYW0uXG4iKTsKKyAgICAgICAgZGVjb2Rlci0+ZW9zX3JlYWNoZWQgPSAxOworICAgICAgICByZXQgPSBya21wcF93cml0ZV9kYXRhKGF2Y3R4LCBOVUxMLCAwLCAwKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNlbmQgRU9TIHRvIGRlY29kZXIgKGNvZGUgPSAlZClcbiIsIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gb24gZmlyc3QgcGFja2V0LCBzZW5kIGV4dHJhZGF0YQorICAgIGlmIChkZWNvZGVyLT5maXJzdF9wYWNrZXQpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgcmV0ID0gcmttcHBfd3JpdGVfZGF0YShhdmN0eCwgYXZjdHgtPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnBrdC0+cHRzKTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB3cml0ZSBleHRyYWRhdGEgdG8gZGVjb2RlciAoY29kZSA9ICVkKVxuIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRlY29kZXItPmZpcnN0X3BhY2tldCA9IDA7CisgICAgfQorCisgICAgLy8gbm93IHNlbmQgcGFja2V0CisgICAgcmV0ID0gcmttcHBfd3JpdGVfZGF0YShhdmN0eCwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplLCBhdnBrdC0+cHRzKTsKKyAgICBpZiAocmV0ICYmIHJldCE9QVZFUlJPUihFQUdBSU4pKQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB3cml0ZSBkYXRhIHRvIGRlY29kZXIgKGNvZGUgPSAlZClcbiIsIHJldCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBya21wcF9yZWxlYXNlX2ZyYW1lKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBBVkRSTUZyYW1lRGVzY3JpcHRvciAqZGVzYyA9IChBVkRSTUZyYW1lRGVzY3JpcHRvciAqKWRhdGE7CisgICAgQVZCdWZmZXJSZWYgKmZyYW1lY29udGV4dHJlZiA9IChBVkJ1ZmZlclJlZiAqKW9wYXF1ZTsKKyAgICBSS01QUEZyYW1lQ29udGV4dCAqZnJhbWVjb250ZXh0ID0gKFJLTVBQRnJhbWVDb250ZXh0ICopZnJhbWVjb250ZXh0cmVmLT5kYXRhOworCisgICAgbXBwX2ZyYW1lX2RlaW5pdCgmZnJhbWVjb250ZXh0LT5mcmFtZSk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZWNvbnRleHQtPmRlY29kZXJfcmVmKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lY29udGV4dHJlZik7CisKKyAgICBhdl9mcmVlKGRlc2MpOworfQorCitzdGF0aWMgaW50IHJrbXBwX3JldHJpZXZlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgUktNUFBEZWNvZGVDb250ZXh0ICpya19jb250ZXh0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBSS01QUERlY29kZXIgKmRlY29kZXIgPSAoUktNUFBEZWNvZGVyICopcmtfY29udGV4dC0+ZGVjb2Rlcl9yZWYtPmRhdGE7CisgICAgUktNUFBGcmFtZUNvbnRleHQgKmZyYW1lY29udGV4dCA9IE5VTEw7CisgICAgQVZCdWZmZXJSZWYgKmZyYW1lY29udGV4dHJlZiA9IE5VTEw7CisgICAgaW50IHJldDsKKyAgICBNcHBGcmFtZSBtcHBmcmFtZSA9IE5VTEw7CisgICAgTXBwQnVmZmVyIGJ1ZmZlciA9IE5VTEw7CisgICAgQVZEUk1GcmFtZURlc2NyaXB0b3IgKmRlc2MgPSBOVUxMOworICAgIEFWRFJNTGF5ZXJEZXNjcmlwdG9yICpsYXllciA9IE5VTEw7CisgICAgaW50IG1vZGU7CisgICAgTXBwRnJhbWVGb3JtYXQgbXBwZm9ybWF0OworICAgIHVpbnQzMl90IGRybWZvcm1hdDsKKworICAgIHJldCA9IGRlY29kZXItPm1waS0+ZGVjb2RlX2dldF9mcmFtZShkZWNvZGVyLT5jdHgsICZtcHBmcmFtZSk7CisgICAgaWYgKHJldCAhPSBNUFBfT0sgJiYgcmV0ICE9IE1QUF9FUlJfVElNRU9VVCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgYSBmcmFtZSBmcm9tIE1QUCAoY29kZSA9ICVkKVxuIiwgcmV0KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChtcHBmcmFtZSkgeworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBzcGVjaWFsIGZyYW1lIG9yIG5vdAorICAgICAgICBpZiAobXBwX2ZyYW1lX2dldF9pbmZvX2NoYW5nZShtcHBmcmFtZSkpIHsKKyAgICAgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpod2ZyYW1lczsKKworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkRlY29kZXIgbm90aWNlZCBhbiBpbmZvIGNoYW5nZSAoJWR4JWQpLCBmb3JtYXQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltcHBfZnJhbWVfZ2V0X3dpZHRoKG1wcGZyYW1lKSwgKGludCltcHBfZnJhbWVfZ2V0X2hlaWdodChtcHBmcmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltcHBfZnJhbWVfZ2V0X2ZtdChtcHBmcmFtZSkpOworCisgICAgICAgICAgICBhdmN0eC0+d2lkdGggPSBtcHBfZnJhbWVfZ2V0X3dpZHRoKG1wcGZyYW1lKTsKKyAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQgPSBtcHBfZnJhbWVfZ2V0X2hlaWdodChtcHBmcmFtZSk7CisKKyAgICAgICAgICAgIGRlY29kZXItPm1waS0+Y29udHJvbChkZWNvZGVyLT5jdHgsIE1QUF9ERUNfU0VUX0lORk9fQ0hBTkdFX1JFQURZLCBOVUxMKTsKKworICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZkZWNvZGVyLT5mcmFtZXNfcmVmKTsKKworICAgICAgICAgICAgZGVjb2Rlci0+ZnJhbWVzX3JlZiA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGRlY29kZXItPmRldmljZV9yZWYpOworICAgICAgICAgICAgaWYgKCFkZWNvZGVyLT5mcmFtZXNfcmVmKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXBwZm9ybWF0ID0gbXBwX2ZyYW1lX2dldF9mbXQobXBwZnJhbWUpOworICAgICAgICAgICAgZHJtZm9ybWF0ID0gcmttcHBfZ2V0X2ZyYW1lZm9ybWF0KG1wcGZvcm1hdCk7CisKKyAgICAgICAgICAgIGh3ZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0KilkZWNvZGVyLT5mcmFtZXNfcmVmLT5kYXRhOworICAgICAgICAgICAgaHdmcmFtZXMtPmZvcm1hdCAgICA9IEFWX1BJWF9GTVRfRFJNX1BSSU1FOworICAgICAgICAgICAgaHdmcmFtZXMtPnN3X2Zvcm1hdCA9IGRybWZvcm1hdCA9PSBEUk1fRk9STUFUX05WMTIgPyBBVl9QSVhfRk1UX05WMTIgOiBBVl9QSVhfRk1UX05PTkU7CisgICAgICAgICAgICBod2ZyYW1lcy0+d2lkdGggICAgID0gYXZjdHgtPndpZHRoOworICAgICAgICAgICAgaHdmcmFtZXMtPmhlaWdodCAgICA9IGF2Y3R4LT5oZWlnaHQ7CisgICAgICAgICAgICByZXQgPSBhdl9od2ZyYW1lX2N0eF9pbml0KGRlY29kZXItPmZyYW1lc19yZWYpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgICAgICAvLyBoZXJlIGRlY29kZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQsIHdlIG5lZWQgdG8gZmVlZCBpdCBhZ2FpbiB3aXRoIGRhdGEKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlIGlmIChtcHBfZnJhbWVfZ2V0X2VvcyhtcHBmcmFtZSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUmVjZWl2ZWQgYSBFT1MgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIGRlY29kZXItPmVvc19yZWFjaGVkID0gMTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9IGVsc2UgaWYgKG1wcF9mcmFtZV9nZXRfZGlzY2FyZChtcHBmcmFtZSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUmVjZWl2ZWQgYSBkaXNjYXJkIGZyYW1lLlxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0gZWxzZSBpZiAobXBwX2ZyYW1lX2dldF9lcnJpbmZvKG1wcGZyYW1lKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJSZWNlaXZlZCBhIGVycmluZm8gZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhlcmUgd2Ugc2hvdWxkIGhhdmUgYSB2YWxpZCBmcmFtZQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlJlY2VpdmVkIGEgZnJhbWUuXG4iKTsKKworICAgICAgICAvLyBzZXR1cCBnZW5lcmFsIGZyYW1lIGZpZWxkcworICAgICAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgICA9IEFWX1BJWF9GTVRfRFJNX1BSSU1FOworICAgICAgICBmcmFtZS0+d2lkdGggICAgICAgICAgICA9IG1wcF9mcmFtZV9nZXRfd2lkdGgobXBwZnJhbWUpOworICAgICAgICBmcmFtZS0+aGVpZ2h0ICAgICAgICAgICA9IG1wcF9mcmFtZV9nZXRfaGVpZ2h0KG1wcGZyYW1lKTsKKyAgICAgICAgZnJhbWUtPnB0cyAgICAgICAgICAgICAgPSBtcHBfZnJhbWVfZ2V0X3B0cyhtcHBmcmFtZSk7CisgICAgICAgIGZyYW1lLT5jb2xvcl9yYW5nZSAgICAgID0gbXBwX2ZyYW1lX2dldF9jb2xvcl9yYW5nZShtcHBmcmFtZSk7CisgICAgICAgIGZyYW1lLT5jb2xvcl9wcmltYXJpZXMgID0gbXBwX2ZyYW1lX2dldF9jb2xvcl9wcmltYXJpZXMobXBwZnJhbWUpOworICAgICAgICBmcmFtZS0+Y29sb3JfdHJjICAgICAgICA9IG1wcF9mcmFtZV9nZXRfY29sb3JfdHJjKG1wcGZyYW1lKTsKKyAgICAgICAgZnJhbWUtPmNvbG9yc3BhY2UgICAgICAgPSBtcHBfZnJhbWVfZ2V0X2NvbG9yc3BhY2UobXBwZnJhbWUpOworCisgICAgICAgIG1vZGUgPSBtcHBfZnJhbWVfZ2V0X21vZGUobXBwZnJhbWUpOworICAgICAgICBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9ICgobW9kZSAmIE1QUF9GUkFNRV9GTEFHX0ZJRUxEX09SREVSX01BU0spID09IE1QUF9GUkFNRV9GTEFHX0RFSU5URVJMQUNFRCk7CisgICAgICAgIGZyYW1lLT50b3BfZmllbGRfZmlyc3QgID0gKChtb2RlICYgTVBQX0ZSQU1FX0ZMQUdfRklFTERfT1JERVJfTUFTSykgPT0gTVBQX0ZSQU1FX0ZMQUdfVE9QX0ZJUlNUKTsKKworICAgICAgICBtcHBmb3JtYXQgPSBtcHBfZnJhbWVfZ2V0X2ZtdChtcHBmcmFtZSk7CisgICAgICAgIGRybWZvcm1hdCA9IHJrbXBwX2dldF9mcmFtZWZvcm1hdChtcHBmb3JtYXQpOworCisgICAgICAgIC8vIG5vdyBzZXR1cCB0aGUgZnJhbWUgYnVmZmVyIGluZm8KKyAgICAgICAgYnVmZmVyID0gbXBwX2ZyYW1lX2dldF9idWZmZXIobXBwZnJhbWUpOworICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBkZXNjID0gYXZfbWFsbG9jeihzaXplb2YoQVZEUk1GcmFtZURlc2NyaXB0b3IpKTsKKyAgICAgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlc2MtPm5iX29iamVjdHMgPSAxOworICAgICAgICAgICAgZGVzYy0+b2JqZWN0c1swXS5mZCA9IG1wcF9idWZmZXJfZ2V0X2ZkKGJ1ZmZlcik7CisgICAgICAgICAgICBkZXNjLT5vYmplY3RzWzBdLnNpemUgPSBtcHBfYnVmZmVyX2dldF9zaXplKGJ1ZmZlcik7CisKKyAgICAgICAgICAgIGRlc2MtPm5iX2xheWVycyA9IDE7CisgICAgICAgICAgICBsYXllciA9ICZkZXNjLT5sYXllcnNbMF07CisgICAgICAgICAgICBsYXllci0+Zm9ybWF0ID0gZHJtZm9ybWF0OworICAgICAgICAgICAgbGF5ZXItPm5iX3BsYW5lcyA9IDI7CisKKyAgICAgICAgICAgIGxheWVyLT5wbGFuZXNbMF0ub2JqZWN0X2luZGV4ID0gMDsKKyAgICAgICAgICAgIGxheWVyLT5wbGFuZXNbMF0ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGxheWVyLT5wbGFuZXNbMF0ucGl0Y2ggPSBtcHBfZnJhbWVfZ2V0X2hvcl9zdHJpZGUobXBwZnJhbWUpOworCisgICAgICAgICAgICBsYXllci0+cGxhbmVzWzFdLm9iamVjdF9pbmRleCA9IDA7CisgICAgICAgICAgICBsYXllci0+cGxhbmVzWzFdLm9mZnNldCA9IGxheWVyLT5wbGFuZXNbMF0ucGl0Y2ggKiBtcHBfZnJhbWVfZ2V0X3Zlcl9zdHJpZGUobXBwZnJhbWUpOworICAgICAgICAgICAgbGF5ZXItPnBsYW5lc1sxXS5waXRjaCA9IGxheWVyLT5wbGFuZXNbMF0ucGl0Y2g7CisKKyAgICAgICAgICAgIC8vIHdlIGFsc28gYWxsb2NhdGUgYSBzdHJ1Y3QgaW4gYnVmWzBdIHRoYXQgd2lsbCBhbGxvdyB0byBob2xkIGFkZGl0aW9ubmFsIGluZm9ybWF0aW9uCisgICAgICAgICAgICAvLyBmb3IgcmVsZWFzaW5nIHByb3Blcmx5IE1QUCBmcmFtZXMgYW5kIGRlY29kZXIKKyAgICAgICAgICAgIGZyYW1lY29udGV4dHJlZiA9IGF2X2J1ZmZlcl9hbGxvY3ooc2l6ZW9mKCpmcmFtZWNvbnRleHQpKTsKKyAgICAgICAgICAgIGlmICghZnJhbWVjb250ZXh0cmVmKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTVBQIGRlY29kZXIgbmVlZHMgdG8gYmUgY2xvc2VkIG9ubHkgd2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiByZWxlYXNlZC4KKyAgICAgICAgICAgIGZyYW1lY29udGV4dCA9IChSS01QUEZyYW1lQ29udGV4dCAqKWZyYW1lY29udGV4dHJlZi0+ZGF0YTsKKyAgICAgICAgICAgIGZyYW1lY29udGV4dC0+ZGVjb2Rlcl9yZWYgPSBhdl9idWZmZXJfcmVmKHJrX2NvbnRleHQtPmRlY29kZXJfcmVmKTsKKyAgICAgICAgICAgIGZyYW1lY29udGV4dC0+ZnJhbWUgPSBtcHBmcmFtZTsKKworICAgICAgICAgICAgZnJhbWUtPmRhdGFbMF0gID0gKHVpbnQ4X3QgKilkZXNjOworICAgICAgICAgICAgZnJhbWUtPmJ1ZlswXSAgID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCAqKWRlc2MsIHNpemVvZigqZGVzYyksIHJrbXBwX3JlbGVhc2VfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lY29udGV4dHJlZiwgQVZfQlVGRkVSX0ZMQUdfUkVBRE9OTFkpOworCisgICAgICAgICAgICBpZiAoIWZyYW1lLT5idWZbMF0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFtZS0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoZGVjb2Rlci0+ZnJhbWVzX3JlZik7CisgICAgICAgICAgICBpZiAoIWZyYW1lLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZXRyaWV2ZSB0aGUgZnJhbWUgYnVmZmVyLCBmcmFtZSBpcyBkcm9wcGVkIChjb2RlID0gJWQpXG4iLCByZXQpOworICAgICAgICAgICAgbXBwX2ZyYW1lX2RlaW5pdCgmbXBwZnJhbWUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChkZWNvZGVyLT5lb3NfcmVhY2hlZCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfSBlbHNlIGlmIChyZXQgPT0gTVBQX0VSUl9USU1FT1VUKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVGltZW91dCB3aGVuIHRyeWluZyB0byBnZXQgYSBmcmFtZSBmcm9tIE1QUFxuIik7CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKworZmFpbDoKKyAgICBpZiAobXBwZnJhbWUpCisgICAgICAgIG1wcF9mcmFtZV9kZWluaXQoJm1wcGZyYW1lKTsKKworICAgIGlmIChmcmFtZWNvbnRleHQpCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWVjb250ZXh0LT5kZWNvZGVyX3JlZik7CisKKyAgICBpZiAoZnJhbWVjb250ZXh0cmVmKQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lY29udGV4dHJlZik7CisKKyAgICBpZiAoZGVzYykKKyAgICAgICAgYXZfZnJlZShkZXNjKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcmttcHBfcmVjZWl2ZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIFJLTVBQRGVjb2RlQ29udGV4dCAqcmtfY29udGV4dCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgUktNUFBEZWNvZGVyICpkZWNvZGVyID0gKFJLTVBQRGVjb2RlciAqKXJrX2NvbnRleHQtPmRlY29kZXJfcmVmLT5kYXRhOworICAgIGludCByZXQgPSBNUFBfTk9LOworICAgIEFWUGFja2V0IHBrdCA9IHswfTsKKyAgICBSS19TMzIgdXNlZHNsb3RzLCBmcmVlc2xvdHM7CisKKyAgICBpZiAoIWRlY29kZXItPmVvc19yZWFjaGVkKSB7CisgICAgICAgIC8vIHdlIGdldCB0aGUgYXZhaWxhYmxlIHNsb3RzIGluIGRlY29kZXIKKyAgICAgICAgcmV0ID0gZGVjb2Rlci0+bXBpLT5jb250cm9sKGRlY29kZXItPmN0eCwgTVBQX0RFQ19HRVRfU1RSRUFNX0NPVU5ULCAmdXNlZHNsb3RzKTsKKyAgICAgICAgaWYgKHJldCAhPSBNUFBfT0spIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBkZWNvZGVyIHVzZWQgc2xvdHMgKGNvZGUgPSAlZCkuXG4iLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGZyZWVzbG90cyA9IElOUFVUX01BWF9QQUNLRVRTIC0gdXNlZHNsb3RzOworICAgICAgICBpZiAoZnJlZXNsb3RzID4gMCkgeworICAgICAgICAgICAgcmV0ID0gZmZfZGVjb2RlX2dldF9wYWNrZXQoYXZjdHgsICZwa3QpOworICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1JfRU9GKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0ID0gcmttcHBfc2VuZF9wYWNrZXQoYXZjdHgsICZwa3QpOworICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOworCisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNlbmQgcGFja2V0IHRvIGRlY29kZXIgKGNvZGUgPSAlZClcbiIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBrZWVwIGRlY29kZXIgZnVsbAorICAgICAgICBpZiAoZnJlZXNsb3RzID4gMSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgfQorCisgICAgcmV0dXJuIHJrbXBwX3JldHJpZXZlX2ZyYW1lKGF2Y3R4LCBmcmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHJrbXBwX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBSS01QUERlY29kZUNvbnRleHQgKnJrX2NvbnRleHQgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFJLTVBQRGVjb2RlciAqZGVjb2RlciA9IChSS01QUERlY29kZXIgKilya19jb250ZXh0LT5kZWNvZGVyX3JlZi0+ZGF0YTsKKyAgICBpbnQgcmV0ID0gTVBQX05PSzsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRmx1c2guXG4iKTsKKworICAgIHJldCA9IGRlY29kZXItPm1waS0+cmVzZXQoZGVjb2Rlci0+Y3R4KTsKKyAgICBpZiAocmV0ID09IE1QUF9PSykgeworICAgICAgICBkZWNvZGVyLT5maXJzdF9wYWNrZXQgPSAxOworICAgIH0gZWxzZQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZXNldCBNUEkgKGNvZGUgPSAlZClcbiIsIHJldCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCAqcmttcHBfaHdfY29uZmlnc1tdID0geworICAgIEhXX0NPTkZJR19JTlRFUk5BTChEUk1fUFJJTUUpLAorICAgIE5VTEwKK307CisKKyNkZWZpbmUgUktNUFBfREVDX0NMQVNTKE5BTUUpIFwKKyAgICBzdGF0aWMgY29uc3QgQVZDbGFzcyBya21wcF8jI05BTUUjI19kZWNfY2xhc3MgPSB7IFwKKyAgICAgICAgLmNsYXNzX25hbWUgPSAicmttcHBfIiAjTkFNRSAiX2RlYyIsIFwKKyAgICAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsIFwKKyAgICB9OworCisjZGVmaW5lIFJLTVBQX0RFQyhOQU1FLCBJRCwgQlNGUykgXAorICAgIFJLTVBQX0RFQ19DTEFTUyhOQU1FKSBcCisgICAgQVZDb2RlYyBmZl8jI05BTUUjI19ya21wcF9kZWNvZGVyID0geyBcCisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICNOQU1FICJfcmttcHAiLCBcCisgICAgICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCNOQU1FICIgKHJrbXBwKSIpLCBcCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywgXAorICAgICAgICAuaWQgICAgICAgICAgICAgPSBJRCwgXAorICAgICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUktNUFBEZWNvZGVDb250ZXh0KSwgXAorICAgICAgICAuaW5pdCAgICAgICAgICAgPSBya21wcF9pbml0X2RlY29kZXIsIFwKKyAgICAgICAgLmNsb3NlICAgICAgICAgID0gcmttcHBfY2xvc2VfZGVjb2RlciwgXAorICAgICAgICAucmVjZWl2ZV9mcmFtZSAgPSBya21wcF9yZWNlaXZlX2ZyYW1lLCBcCisgICAgICAgIC5mbHVzaCAgICAgICAgICA9IHJrbXBwX2ZsdXNoLCBcCisgICAgICAgIC5wcml2X2NsYXNzICAgICA9ICZya21wcF8jI05BTUUjI19kZWNfY2xhc3MsIFwKKyAgICAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0FWT0lEX1BST0JJTkcgfCBBVl9DT0RFQ19DQVBfSEFSRFdBUkUsIFwKKyAgICAgICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7IEFWX1BJWF9GTVRfRFJNX1BSSU1FLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkV9LCBcCisgICAgICAgIC5od19jb25maWdzICAgICA9IHJrbXBwX2h3X2NvbmZpZ3MsIFwKKyAgICAgICAgLmJzZnMgICAgICAgICAgID0gQlNGUywgXAorICAgICAgICAud3JhcHBlcl9uYW1lICAgPSAicmttcHAiLCBcCisgICAgfTsKKworUktNUFBfREVDKGgyNjQsICBBVl9DT0RFQ19JRF9IMjY0LCAgICAgICAgICAiaDI2NF9tcDR0b2FubmV4YiIpCitSS01QUF9ERUMoaGV2YywgIEFWX0NPREVDX0lEX0hFVkMsICAgICAgICAgICJoZXZjX21wNHRvYW5uZXhiIikKK1JLTVBQX0RFQyh2cDgsICAgQVZfQ09ERUNfSURfVlA4LCAgICAgICAgICAgTlVMTCkKK1JLTVBQX0RFQyh2cDksICAgQVZfQ09ERUNfSURfVlA5LCAgICAgICAgICAgTlVMTCkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmwuYyBiL2xpYmF2Y29kZWMvcmwuYwppbmRleCBiMjA2YzZmLi42ZWFjMzA2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JsLmMKKysrIGIvbGliYXZjb2RlYy9ybC5jCkBAIC0xNyw4ICsxNywxMCBAQAogICovCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgogCiAjaW5jbHVkZSAicmwuaCIKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmwuaCBiL2xpYmF2Y29kZWMvcmwuaAppbmRleCAzM2Y0ZWY4Li45YTc2N2JjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JsLmgKKysrIGIvbGliYXZjb2RlYy9ybC5oCkBAIC0yOCw3ICsyOCw4IEBACiAjZGVmaW5lIEFWQ09ERUNfUkxfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworI2luY2x1ZGUgInZsYy5oIgogCiAvKiBydW4gbGVuZ3RoIHRhYmxlICovCiAjZGVmaW5lIE1BWF9SVU4gICAgNjQKQEAgLTQ4LDcgKzQ5LDYgQEAKIH0gUkxUYWJsZTsKIAogLyoqCi0gKgogICogQHBhcmFtIHN0YXRpY19zdG9yZSBzdGF0aWMgdWludDhfdCBhcnJheVsyXVsyKk1BWF9SVU4gKyBNQVhfTEVWRUwgKyAzXSB3aGljaCB3aWxsIGhvbGQKICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGxldmVsIGFuZCBydW4gdGFibGVzLCBpZiB0aGlzIGlzIE5VTEwgYXZfbWFsbG9jKCkgd2lsbCBiZSB1c2VkCiAgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcmxlLmMgYi9saWJhdmNvZGVjL3JsZS5jCmluZGV4IDc5MjRlYTcuLjc5MmJjMDUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcmxlLmMKKysrIGIvbGliYXZjb2RlYy9ybGUuYwpAQCAtMTgsMjYgKzE4LDI5IEBACiAgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKwogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJybGUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCiAKIGludCBmZl9ybGVfY291bnRfcGl4ZWxzKGNvbnN0IHVpbnQ4X3QgKnN0YXJ0LCBpbnQgbGVuLCBpbnQgYnBwLCBpbnQgc2FtZSkKIHsKICAgICBjb25zdCB1aW50OF90ICpwb3M7CiAgICAgaW50IGNvdW50ID0gMTsKIAotICAgIGZvcihwb3MgPSBzdGFydCArIGJwcDsgY291bnQgPCBGRk1JTigxMjcsIGxlbik7IHBvcyArPSBicHAsIGNvdW50ICsrKSB7Ci0gICAgICAgIGlmKHNhbWUgIT0gIW1lbWNtcChwb3MtYnBwLCBwb3MsIGJwcCkpIHsKLSAgICAgICAgICAgIGlmKCFzYW1lKSB7Ci0gICAgICAgICAgICAgICAgLyogaWYgYnBwID09IDEsIHRoZW4gMCAxIDEgMCBpcyBtb3JlIGVmZmljaWVudGx5IGVuY29kZWQgYXMgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICAgKiByYXcgYmxvY2sgb2YgcGl4ZWxzLiAgZm9yIGxhcmdlciBicHAsIFJMRSBpcyBhcyBnb29kIG9yIGJldHRlciAqLwotICAgICAgICAgICAgICAgIGlmKGJwcCA9PSAxICYmIGNvdW50ICsgMSA8IEZGTUlOKDEyNywgbGVuKSAmJiAqcG9zICE9ICoocG9zKzEpKQorICAgIGZvciAocG9zID0gc3RhcnQgKyBicHA7IGNvdW50IDwgRkZNSU4oMTI3LCBsZW4pOyBwb3MgKz0gYnBwLCBjb3VudCsrKSB7CisgICAgICAgIGlmIChzYW1lICE9ICFtZW1jbXAocG9zIC0gYnBwLCBwb3MsIGJwcCkpIHsKKyAgICAgICAgICAgIGlmICghc2FtZSkgeworICAgICAgICAgICAgICAgIC8qIGlmIGJwcCA9PSAxLCB0aGVuIDAgMSAxIDAgaXMgbW9yZSBlZmZpY2llbnRseSBlbmNvZGVkIGFzIGEKKyAgICAgICAgICAgICAgICAgKiBzaW5nbGUgcmF3IGJsb2NrIG9mIHBpeGVscy4gRm9yIGxhcmdlciBicHAsIFJMRSBpcyBhcyBnb29kCisgICAgICAgICAgICAgICAgICogb3IgYmV0dGVyICovCisgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAxICYmIGNvdW50ICsgMSA8IEZGTUlOKDEyNywgbGVuKSAmJiAqcG9zICE9ICoocG9zICsgMSkpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgICAgICAgICAgLyogaWYgUkxFIGNhbiBlbmNvZGUgdGhlIG5leHQgYmxvY2sgYmV0dGVyIHRoYW4gYXMgYSByYXcgYmxvY2ssCiAgICAgICAgICAgICAgICAgICogYmFjayB1cCBhbmQgbGVhdmUgX2FsbF8gdGhlIGlkZW50aWNhbCBwaXhlbHMgZm9yIFJMRSAqLwotICAgICAgICAgICAgICAgIGNvdW50IC0tOworICAgICAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNDYsMjUgKzQ5LDI4IEBACiAgICAgcmV0dXJuIGNvdW50OwogfQogCi1pbnQgZmZfcmxlX2VuY29kZSh1aW50OF90ICpvdXRidWYsIGludCBvdXRfc2l6ZSwgY29uc3QgdWludDhfdCAqcHRyICwgaW50IGJwcCwgaW50IHcsCi0gICAgICAgICAgICAgICAgICBpbnQgYWRkX3JlcCwgaW50IHhvcl9yZXAsIGludCBhZGRfcmF3LCBpbnQgeG9yX3JhdykKK2ludCBmZl9ybGVfZW5jb2RlKHVpbnQ4X3QgKm91dGJ1ZiwgaW50IG91dF9zaXplLCBjb25zdCB1aW50OF90ICpwdHIsIGludCBicHAsCisgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGFkZF9yZXAsIGludCB4b3JfcmVwLCBpbnQgYWRkX3JhdywgaW50IHhvcl9yYXcpCiB7CiAgICAgaW50IGNvdW50LCB4OwogICAgIHVpbnQ4X3QgKm91dCA9IG91dGJ1ZjsKIAotICAgIGZvcih4ID0gMDsgeCA8IHc7IHggKz0gY291bnQpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCArPSBjb3VudCkgewogICAgICAgICAvKiBzZWUgaWYgd2UgY2FuIGVuY29kZSB0aGUgbmV4dCBzZXQgb2YgcGl4ZWxzIHdpdGggUkxFICovCiAgICAgICAgIGlmICgoY291bnQgPSBmZl9ybGVfY291bnRfcGl4ZWxzKHB0ciwgdyAtIHgsIGJwcCwgMSkpID4gMSkgewotICAgICAgICAgICAgaWYob3V0ICsgYnBwICsgMSA+IG91dGJ1ZiArIG91dF9zaXplKSByZXR1cm4gLTE7CisgICAgICAgICAgICBpZiAob3V0ICsgYnBwICsgMSA+IG91dGJ1ZiArIG91dF9zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKwogICAgICAgICAgICAgKm91dCsrID0gKGNvdW50IF4geG9yX3JlcCkgKyBhZGRfcmVwOwogICAgICAgICAgICAgbWVtY3B5KG91dCwgcHRyLCBicHApOwogICAgICAgICAgICAgb3V0ICs9IGJwcDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIGZhbGwgYmFjayBvbiB1bmNvbXByZXNzZWQgKi8KICAgICAgICAgICAgIGNvdW50ID0gZmZfcmxlX2NvdW50X3BpeGVscyhwdHIsIHcgLSB4LCBicHAsIDApOwotICAgICAgICAgICAgaWYob3V0ICsgYnBwKmNvdW50ID49IG91dGJ1ZiArIG91dF9zaXplKSByZXR1cm4gLTE7Ci0gICAgICAgICAgICAqb3V0KysgPSAoY291bnQgXiB4b3JfcmF3KSArIGFkZF9yYXc7CisgICAgICAgICAgICBpZiAob3V0ICsgYnBwICogY291bnQgPj0gb3V0YnVmICsgb3V0X3NpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCisgICAgICAgICAgICAqb3V0KysgPSAoY291bnQgXiB4b3JfcmF3KSArIGFkZF9yYXc7CiAgICAgICAgICAgICBtZW1jcHkob3V0LCBwdHIsIGJwcCAqIGNvdW50KTsKICAgICAgICAgICAgIG91dCArPSBicHAgKiBjb3VudDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ybGUuaCBiL2xpYmF2Y29kZWMvcmxlLmgKaW5kZXggY2I1MTYyNC4uYTkyZWRmNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9ybGUuaAorKysgYi9saWJhdmNvZGVjL3JsZS5oCkBAIC0zNSw4ICszNSw5IEBACiBpbnQgZmZfcmxlX2NvdW50X3BpeGVscyhjb25zdCB1aW50OF90ICpzdGFydCwgaW50IGxlbiwgaW50IGJwcCwgaW50IHNhbWUpOwogCiAvKioKLSAqIFJMRSBjb21wcmVzcyB0aGUgcm93LCB3aXRoIG1heGltdW0gc2l6ZSBvZiBvdXRfc2l6ZS4gVmFsdWUgYmVmb3JlIHJlcGVhdGVkIGJ5dGVzIGlzIChjb3VudCBeIHhvcl9yZXApICsgYWRkX3JlcC4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgYmVmb3JlIHJhdyBieXRlcyBpcyAgICAgIChjb3VudCBeIHhvcl9yYXcpICsgYWRkX3Jhdy4KKyAqIFJMRSBjb21wcmVzcyB0aGUgcm93LCB3aXRoIG1heGltdW0gc2l6ZSBvZiBvdXRfc2l6ZS4KKyAqIFZhbHVlIGJlZm9yZSByZXBlYXRlZCBieXRlcyBpcyAoY291bnQgXiB4b3JfcmVwKSArIGFkZF9yZXAuCisgKiBWYWx1ZSBiZWZvcmUgcmF3IGJ5dGVzIGlzIChjb3VudCBeIHhvcl9yYXcpICsgYWRkX3Jhdy4KICAqIEBwYXJhbSBvdXRidWYgT3V0cHV0IGJ1ZmZlcgogICogQHBhcmFtIG91dF9zaXplIE1heGltdW0gb3V0cHV0IHNpemUKICAqIEBwYXJhbSBpbmJ1ZiBJbnB1dCBidWZmZXIKQEAgLTQ0LDcgKzQ1LDcgQEAKICAqIEBwYXJhbSB3IEltYWdlIHdpZHRoCiAgKiBAcmV0dXJuIFNpemUgb2Ygb3V0cHV0IGluIGJ5dGVzLCBvciAtMSBpZiBsYXJnZXIgdGhhbiBvdXRfc2l6ZQogICovCi1pbnQgZmZfcmxlX2VuY29kZSh1aW50OF90ICpvdXRidWYsIGludCBvdXRfc2l6ZSwgY29uc3QgdWludDhfdCAqaW5idWYsIGludCBicHAsIGludCB3LAotICAgICAgICAgICAgICAgICAgaW50IGFkZF9yZXAsIGludCB4b3JfcmVwLCBpbnQgYWRkX3JhdywgaW50IHhvcl9yYXcpOworaW50IGZmX3JsZV9lbmNvZGUodWludDhfdCAqb3V0YnVmLCBpbnQgb3V0X3NpemUsIGNvbnN0IHVpbnQ4X3QgKmluYnVmLCBpbnQgYnBwLAorICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBhZGRfcmVwLCBpbnQgeG9yX3JlcCwgaW50IGFkZF9yYXcsIGludCB4b3JfcmF3KTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfUkxFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcm9xdmlkZW9kZWMuYyBiL2xpYmF2Y29kZWMvcm9xdmlkZW9kZWMuYwppbmRleCA1ZjBiMjA0Li4wYWI3ZDM5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JvcXZpZGVvZGVjLmMKKysrIGIvbGliYXZjb2RlYy9yb3F2aWRlb2RlYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMTc1LDggKzE3NSw3IEBACiAgICAgcy0+YXZjdHggPSBhdmN0eDsKIAogICAgIGlmIChhdmN0eC0+d2lkdGggJSAxNiB8fCBhdmN0eC0+aGVpZ2h0ICUgMTYpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiRGltZW5zaW9ucyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTZcbiIpOworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJEaW1lbnNpb25zIG5vdCBiZWluZyBhIG11bHRpcGxlIG9mIDE2Iik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcm9xdmlkZW9lbmMuYyBiL2xpYmF2Y29kZWMvcm9xdmlkZW9lbmMuYwppbmRleCBiNmVkMWY5Li5hYzA1MTIzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JvcXZpZGVvZW5jLmMKKysrIGIvbGliYXZjb2RlYy9yb3F2aWRlb2VuYy5jCkBAIC03MzYsMjEgKzczNiw2IEBACiAgICAgLyogRmx1c2ggdGhlIHJlbWFpbmRlciBvZiB0aGUgYXJndW1lbnQvdHlwZSBzcG9vbCAqLwogICAgIHdoaWxlIChzcG9vbC50eXBlU3Bvb2xMZW5ndGgpCiAgICAgICAgIHdyaXRlX3R5cGVjb2RlKCZzcG9vbCwgMHgwKTsKLQotI2lmIDAKLSAgICB1aW50OF90ICpmZGF0YVszXSA9IHtlbmMtPmZyYW1lX3RvX2VuYy0+ZGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+ZnJhbWVfdG9fZW5jLT5kYXRhWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5mcmFtZV90b19lbmMtPmRhdGFbMl19OwotICAgIHVpbnQ4X3QgKmNkYXRhWzNdID0ge2VuYy0+Y3VycmVudF9mcmFtZS0+ZGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF9mcmFtZS0+ZGF0YVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Y3VycmVudF9mcmFtZS0+ZGF0YVsyXX07Ci0gICAgYXZfbG9nKGVuYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4cGVjdGVkIGRpc3RvcnRpb246ICVpIEFjdHVhbDogJWlcbiIsCi0gICAgICAgICAgIGRpc3QsCi0gICAgICAgICAgIGJsb2NrX3NzZShmZGF0YSwgY2RhdGEsIDAsIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICBlbmMtPmZyYW1lX3RvX2VuYy0+bGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICBlbmMtPmN1cnJlbnRfZnJhbWUtPmxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgZW5jLT53aWR0aCkpOyAgLy9XQVJOSU5HOiBTcXVhcmUgZGltZW5zaW9ucyBpbXBsaWVkLi4uCi0jZW5kaWYKIH0KIAogCkBAIC0xMDk0LDcgKzEwNzksNyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIGVuYy0+b3V0X2J1ZiA9IHBrdC0+ZGF0YTsKIAotICAgIC8qIENoZWNrIGZvciBJIGZyYW1lICovCisgICAgLyogQ2hlY2sgZm9yIEktZnJhbWUgKi8KICAgICBpZiAoZW5jLT5mcmFtZXNTaW5jZUtleWZyYW1lID09IGF2Y3R4LT5nb3Bfc2l6ZSkKICAgICAgICAgZW5jLT5mcmFtZXNTaW5jZUtleWZyYW1lID0gMDsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ycHphLmMgYi9saWJhdmNvZGVjL3JwemEuYwppbmRleCAzMTVhZDIzLi44ZTFlZmEyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JwemEuYworKysgYi9saWJhdmNvZGVjL3JwemEuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBRdWlja3RpbWUgVmlkZW8gKFJQWkEpIFZpZGVvIERlY29kZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtNzMsMTMgKzczLDEyIEBACiBzdGF0aWMgaW50IHJwemFfZGVjb2RlX3N0cmVhbShScHphQ29udGV4dCAqcykKIHsKICAgICBpbnQgd2lkdGggPSBzLT5hdmN0eC0+d2lkdGg7Ci0gICAgaW50IHN0cmlkZSA9IHMtPmZyYW1lLT5saW5lc2l6ZVswXSAvIDI7Ci0gICAgaW50IHJvd19pbmMgPSBzdHJpZGUgLSA0OworICAgIGludCBzdHJpZGUsIHJvd19pbmMsIHJldDsKICAgICBpbnQgY2h1bmtfc2l6ZTsKICAgICB1aW50MTZfdCBjb2xvckEgPSAwLCBjb2xvckI7CiAgICAgdWludDE2X3QgY29sb3I0WzRdOwogICAgIHVpbnQxNl90IHRhLCB0YjsKLSAgICB1aW50MTZfdCAqcGl4ZWxzID0gKHVpbnQxNl90ICopcy0+ZnJhbWUtPmRhdGFbMF07CisgICAgdWludDE2X3QgKnBpeGVsczsKIAogICAgIGludCByb3dfcHRyID0gMDsKICAgICBpbnQgcGl4ZWxfcHRyID0gMDsKQEAgLTkyLDcgKzkxLDcgQEAKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGaXJzdCBjaHVuayBieXRlIGlzIDB4JTAyeCBpbnN0ZWFkIG9mIDB4ZTFcbiIsCiAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9wZWVrX2J5dGUoJnMtPmdiKSk7CiAKLSAgICAvKiBHZXQgY2h1bmsgc2l6ZSwgaW5nbm9yaW5nIGZpcnN0IGJ5dGUgKi8KKyAgICAvKiBHZXQgY2h1bmsgc2l6ZSwgaWdub3JpbmcgZmlyc3QgYnl0ZSAqLwogICAgIGNodW5rX3NpemUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmcy0+Z2IpICYgMHgwMEZGRkZGRjsKIAogICAgIC8qIElmIGxlbmd0aCBtaXNtYXRjaCB1c2Ugc2l6ZSBmcm9tIE1PViBmaWxlIGFuZCB0cnkgdG8gZGVjb2RlIGFueXdheSAqLwpAQCAtMTA2LDYgKzEwNSwxNSBAQAogICAgIC8qIE51bWJlciBvZiA0eDQgYmxvY2tzIGluIGZyYW1lLiAqLwogICAgIHRvdGFsX2Jsb2NrcyA9ICgocy0+YXZjdHgtPndpZHRoICsgMykgLyA0KSAqICgocy0+YXZjdHgtPmhlaWdodCArIDMpIC8gNCk7CiAKKyAgICBpZiAodG90YWxfYmxvY2tzIC8gMzIgPiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKHMtPmF2Y3R4LCBzLT5mcmFtZSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwaXhlbHMgPSAodWludDE2X3QgKilzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICBzdHJpZGUgPSBzLT5mcmFtZS0+bGluZXNpemVbMF0gLyAyOworICAgIHJvd19pbmMgPSBzdHJpZGUgLSA0OworCiAgICAgLyogUHJvY2VzcyBjaHVuayBkYXRhICovCiAgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikpIHsKICAgICAgICAgdWludDhfdCBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOyAvKiBHZXQgb3Bjb2RlICovCkBAIC0yNTYsOSArMjY0LDYgQEAKIAogICAgIGJ5dGVzdHJlYW0yX2luaXQoJnMtPmdiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwogCi0gICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCiAgICAgcmV0ID0gcnB6YV9kZWNvZGVfc3RyZWFtKHMpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9yc2NjLmMgYi9saWJhdmNvZGVjL3JzY2MuYwppbmRleCBhMmY3YTBkLi5kYWU1ZTg0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3JzY2MuYworKysgYi9saWJhdmNvZGVjL3JzY2MuYwpAQCAtMzEsNyArMzEsNyBAQAogICogYW5kIGl0IGNhbiBiZSBkZWZsYXRlZCBvciBub3QuIFNpbWlsYXJseSwgcGl4ZWwgZGF0YSBjb21lcyBhZnRlciB0aGUgaGVhZGVyCiAgKiBhbmQgYSB2YXJpYWJsZSBzaXplIHZhbHVlLCBhbmQgaXQgY2FuIGJlIGRlZmxhdGVkIG9yIGp1c3QgcmF3LgogICoKLSAqIFN1cHBvcnRzOiBCR1JBCisgKiBTdXBwb3J0czogUEFMOCwgQkdSQSwgQkdSMjQsIFJHQjU1NQogICovCiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTU3LDYgKzU3LDkgQEAKICAgICBBVkZyYW1lICpyZWZlcmVuY2U7CiAgICAgVGlsZSAqdGlsZXM7CiAgICAgdW5zaWduZWQgaW50IHRpbGVzX3NpemU7CisgICAgaW50IGNvbXBvbmVudF9zaXplOworCisgICAgdWludDhfdCBwYWxldHRlW0FWUEFMRVRURV9TSVpFXTsKIAogICAgIC8qIHpsaWIgaW50ZXJhY3Rpb24gKi8KICAgICB1aW50OF90ICppbmZsYXRlZF9idWY7CkBAIC04MCwxNCArODMsMzggQEAKICAgICBpZiAoIWN0eC0+cmVmZXJlbmNlKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgaWYgKGF2Y3R4LT5jb2RlY190YWcgPT0gTUtUQUcoJ0knLCdTJywnQycsJ0MnKSkgeworICAgIC8qIEdldCBwaXhlbCBmb3JtYXQgYW5kIHRoZSBzaXplIG9mIHRoZSBwaXhlbCAqLworICAgIGlmIChhdmN0eC0+Y29kZWNfdGFnID09IE1LVEFHKCdJJywgJ1MnLCAnQycsICdDJykpIHsKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUkE7CisgICAgICAgIGN0eC0+Y29tcG9uZW50X3NpemUgPSA0OworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnUicsICdTJywgJ0MnLCAnQycpKSB7CisgICAgICAgIGN0eC0+Y29tcG9uZW50X3NpemUgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gODsKKyAgICAgICAgc3dpdGNoIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9QQUw4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1TEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBiaXRzIHBlciBwaXhlbCB2YWx1ZSAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMDsKKyAgICAgICAgY3R4LT5jb21wb25lbnRfc2l6ZSA9IDQ7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGNvZGVjIHRhZ1xuIik7CiAgICAgfQogCiAgICAgLyogU3RvcmUgdGhlIHZhbHVlIHRvIGNoZWNrIGZvciBrZXlmcmFtZXMgKi8KLSAgICBjdHgtPmluZmxhdGVkX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogNDsKKyAgICBjdHgtPmluZmxhdGVkX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogY3R4LT5jb21wb25lbnRfc2l6ZTsKIAogICAgIC8qIEFsbG9jYXRlIG1heGltdW0gc2l6ZSBwb3NzaWJsZSwgYSBmdWxsIGZyYW1lICovCiAgICAgY3R4LT5pbmZsYXRlZF9idWYgPSBhdl9tYWxsb2MoY3R4LT5pbmZsYXRlZF9zaXplKTsKQEAgLTEzMCw2ICsxNTcsMTIgQEAKIAogICAgIC8qIFJlYWQgbnVtYmVyIG9mIHRpbGVzLCBhbmQgYWxsb2NhdGUgdGhlIGFycmF5ICovCiAgICAgdGlsZXNfbmIgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYmMpOworCisgICAgaWYgKHRpbGVzX25iID09IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJubyB0aWxlc1xuIik7CisgICAgICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKKyAgICB9CisKICAgICBhdl9mYXN0X21hbGxvYygmY3R4LT50aWxlcywgJmN0eC0+dGlsZXNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICB0aWxlc19uYiAqIHNpemVvZigqY3R4LT50aWxlcykpOwogICAgIGlmICghY3R4LT50aWxlcykgewpAQCAtMTg0LDcgKzIxNywxMyBAQAogICAgICAgICBjdHgtPnRpbGVzW2ldLnkgPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYmMpOwogICAgICAgICBjdHgtPnRpbGVzW2ldLmggPSBieXRlc3RyZWFtMl9nZXRfbGUxNihnYmMpOwogCi0gICAgICAgIHBpeGVsX3NpemUgKz0gY3R4LT50aWxlc1tpXS53ICogY3R4LT50aWxlc1tpXS5oICogNDsKKyAgICAgICAgaWYgKHBpeGVsX3NpemUgKyBjdHgtPnRpbGVzW2ldLncgKiAoaW50NjRfdCljdHgtPnRpbGVzW2ldLmggKiBjdHgtPmNvbXBvbmVudF9zaXplID4gSU5UX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHRpbGUgZGltZW5zaW9uc1xuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKworICAgICAgICBwaXhlbF9zaXplICs9IGN0eC0+dGlsZXNbaV0udyAqIGN0eC0+dGlsZXNbaV0uaCAqIGN0eC0+Y29tcG9uZW50X3NpemU7CiAKICAgICAgICAgZmZfZGxvZyhhdmN0eCwgInRpbGUgJWQgb3JpZyglZCwlZCkgJWR4JWQuXG4iLCBpLAogICAgICAgICAgICAgICAgIGN0eC0+dGlsZXNbaV0ueCwgY3R4LT50aWxlc1tpXS55LApAQCAtMjIzLDYgKzI2MiwxMiBAQAogCiAgICAgZmZfZGxvZyhhdmN0eCwgInBpeGVsX3NpemUgJWQgcGFja2VkX3NpemUgJWQuXG4iLCBwaXhlbF9zaXplLCBwYWNrZWRfc2l6ZSk7CiAKKyAgICBpZiAocGFja2VkX3NpemUgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB0aWxlIHNpemUgJWRcbiIsIHBhY2tlZF9zaXplKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCiAgICAgLyogR2V0IHBpeGVscyBidWZmZXIsIGl0IG1heSBiZSBkZWZsYXRlZCBvciBqdXN0IHJhdyAqLwogICAgIGlmIChwaXhlbF9zaXplID09IHBhY2tlZF9zaXplKSB7CiAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYmMpIDwgcGl4ZWxfc2l6ZSkgewpAQCAtMjMzLDYgKzI3OCwxMSBAQAogICAgICAgICBwaXhlbHMgPSBnYmMtPmJ1ZmZlcjsKICAgICB9IGVsc2UgewogICAgICAgICB1TG9uZ2YgbGVuID0gY3R4LT5pbmZsYXRlZF9zaXplOworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2JjKSA8IHBhY2tlZF9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluc3VmZmljaWVudCBpbnB1dCBmb3IgJWRcbiIsIHBhY2tlZF9zaXplKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQogICAgICAgICByZXQgPSB1bmNvbXByZXNzKGN0eC0+aW5mbGF0ZWRfYnVmLCAmbGVuLCBnYmMtPmJ1ZmZlciwgcGFja2VkX3NpemUpOwogICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBpeGVsIGRlZmxhdGUgZXJyb3IgJWQuXG4iLCByZXQpOwpAQCAtMjUyLDExICszMDIsMTIgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZXNfbmI7IGkrKykgewogICAgICAgICB1aW50OF90ICpkc3QgPSBjdHgtPnJlZmVyZW5jZS0+ZGF0YVswXSArIGN0eC0+cmVmZXJlbmNlLT5saW5lc2l6ZVswXSAqCiAgICAgICAgICAgICAgICAgICAgICAgIChhdmN0eC0+aGVpZ2h0IC0gY3R4LT50aWxlc1tpXS55IC0gMSkgKwotICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnRpbGVzW2ldLnggKiA0OworICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnRpbGVzW2ldLnggKiBjdHgtPmNvbXBvbmVudF9zaXplOwogICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdCwgLTEgKiBjdHgtPnJlZmVyZW5jZS0+bGluZXNpemVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3LCBjdHgtPnRpbGVzW2ldLncgKiA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dGlsZXNbaV0udyAqIDQsIGN0eC0+dGlsZXNbaV0uaCk7Ci0gICAgICAgIHJhdyArPSBjdHgtPnRpbGVzW2ldLncgKiA0ICogY3R4LT50aWxlc1tpXS5oOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdywgY3R4LT50aWxlc1tpXS53ICogY3R4LT5jb21wb25lbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnRpbGVzW2ldLncgKiBjdHgtPmNvbXBvbmVudF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dGlsZXNbaV0uaCk7CisgICAgICAgIHJhdyArPSBjdHgtPnRpbGVzW2ldLncgKiBjdHgtPmNvbXBvbmVudF9zaXplICogY3R4LT50aWxlc1tpXS5oOwogICAgIH0KIAogICAgIC8qIEZyYW1lIGlzIHJlYWR5IHRvIGJlIG91dHB1dCAqLwpAQCAtMjcxLDggKzMyMiwyNSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGZyYW1lLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKICAgICB9CisKKyAgICAvKiBQYWxldHRlIGhhbmRsaW5nICovCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCkgeworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGFsZXR0ZSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfUEFMRVRURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKKyAgICAgICAgaWYgKHBhbGV0dGUgJiYgc2l6ZSA9PSBBVlBBTEVUVEVfU0laRSkgeworICAgICAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOworICAgICAgICAgICAgbWVtY3B5KGN0eC0+cGFsZXR0ZSwgcGFsZXR0ZSwgQVZQQUxFVFRFX1NJWkUpOworICAgICAgICB9IGVsc2UgaWYgKHBhbGV0dGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFsZXR0ZSBzaXplICVkIGlzIHdyb25nXG4iLCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkgKGZyYW1lLT5kYXRhWzFdLCBjdHgtPnBhbGV0dGUsIEFWUEFMRVRURV9TSVpFKTsKKyAgICB9CisKICAgICAqZ290X2ZyYW1lID0gMTsKIAorICAgIHJldCA9IGF2cGt0LT5zaXplOwogZW5kOgogICAgIGF2X2ZyZWUoaW5mbGF0ZWRfdGlsZXMpOwogICAgIHJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3J2MTAuYyBiL2xpYmF2Y29kZWMvcnYxMC5jCmluZGV4IGI1NmJiNTguLjU5NWUyMTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcnYxMC5jCisrKyBiL2xpYmF2Y29kZWMvcnYxMC5jCkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICBmZl9kbG9nKHMtPmF2Y3R4LCAicGljdF90eXBlPSVkIHBiX2ZyYW1lPSVkXG4iLCBzLT5waWN0X3R5cGUsIHBiX2ZyYW1lKTsKIAogICAgIGlmIChwYl9mcmFtZSkgewotICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJwYiBmcmFtZSIpOworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJQQi1mcmFtZSIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCkBAIC00MzEsNyArNDMxLDcgQEAKICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7CiAgICAgICAgIGlmIChzLT5wcF90aW1lIDw9cy0+cGJfdGltZSB8fCBzLT5wcF90aW1lIDw9IHMtPnBwX3RpbWUgLSBzLT5wYl90aW1lIHx8IHMtPnBwX3RpbWU8PTApIHsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAotICAgICAgICAgICAgICAgICAgICJtZXNzZWQgdXAgb3JkZXIsIHBvc3NpYmxlIGZyb20gc2Vla2luZz8gc2tpcHBpbmcgY3VycmVudCBiIGZyYW1lXG4iKTsKKyAgICAgICAgICAgICAgICAgICAibWVzc2VkIHVwIG9yZGVyLCBwb3NzaWJsZSBmcm9tIHNlZWtpbmc/IHNraXBwaW5nIGN1cnJlbnQgQi1mcmFtZVxuIik7CiAjZGVmaW5lIEVSUk9SX1NLSVBfRlJBTUUgLTEyMwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1NLSVBfRlJBTUU7CiAgICAgICAgIH0KQEAgLTY3MCw3ICs2NzAsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpCiAgICAgICAgICAgICBmZl9oMjYzX3VwZGF0ZV9tb3Rpb25fdmFsKHMpOwotICAgICAgICBmZl9tcHZfZGVjb2RlX21iKHMsIHMtPmJsb2NrKTsKKyAgICAgICAgZmZfbXB2X3JlY29uc3RydWN0X21iKHMsIHMtPmJsb2NrKTsKICAgICAgICAgaWYgKHMtPmxvb3BfZmlsdGVyKQogICAgICAgICAgICAgZmZfaDI2M19sb29wX2ZpbHRlcihzKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ydjEwZW5jLmMgYi9saWJhdmNvZGVjL3J2MTBlbmMuYwppbmRleCBiMTdhY2JjLi44NjkxZDE4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3J2MTBlbmMuYworKysgYi9saWJhdmNvZGVjL3J2MTBlbmMuYwpAQCAtMzksNyArMzksNyBAQAogCiAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSk7CiAKLSAgICBwdXRfYml0cygmcy0+cGIsIDEsIDApOyAgICAgLyogbm90IFBCIGZyYW1lICovCisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAwKTsgICAgIC8qIG5vdCBQQi1tZnJhbWUgKi8KIAogICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+cXNjYWxlKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ydjMwLmMgYi9saWJhdmNvZGVjL3J2MzAuYwppbmRleCAzYjk4NjhjLi5kZGFhYWM2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3J2MzAuYworKysgYi9saWJhdmNvZGVjL3J2MzAuYwpAQCAtODksNyArODksNyBAQAogCiAgICAgZm9yKGkgPSAwOyBpIDwgNDsgaSsrLCBkc3QgKz0gci0+aW50cmFfdHlwZXNfc3RyaWRlIC0gNCl7CiAgICAgICAgIGZvcihqID0gMDsgaiA8IDQ7IGorPSAyKXsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNvZGUgPSBzdnEzX2dldF91ZV9nb2xvbWIoZ2IpIDw8IDE7CisgICAgICAgICAgICB1bnNpZ25lZCBjb2RlID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYikgPDwgMTsKICAgICAgICAgICAgIGlmIChjb2RlID4gODBVKjJVKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHItPnMuYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBpbnRyYSBwcmVkaWN0aW9uIGNvZGVcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTExNyw3ICsxMTcsNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgcnYzMF9iX3R5cGVzWzZdID0geyBSVjM0X01CX1NLSVAsIFJWMzRfTUJfQl9ESVJFQ1QsIFJWMzRfTUJfQl9GT1JXQVJELCBSVjM0X01CX0JfQkFDS1dBUkQsIFJWMzRfTUJfVFlQRV9JTlRSQSwgUlYzNF9NQl9UWVBFX0lOVFJBMTZ4MTYgfTsKICAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZyLT5zOwogICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOwotICAgIHVuc2lnbmVkIGNvZGUgICAgID0gc3ZxM19nZXRfdWVfZ29sb21iKGdiKTsKKyAgICB1bnNpZ25lZCBjb2RlID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYik7CiAKICAgICBpZiAoY29kZSA+IDExKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IE1CIHR5cGUgY29kZVxuIik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3J2MzQuYyBiL2xpYmF2Y29kZWMvcnYzNC5jCmluZGV4IGMyZTg0YTMuLmQxNzFlNmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcnYzNC5jCisrKyBiL2xpYmF2Y29kZWMvcnYzNC5jCkBAIC00MDQsNyArNDA0LDggQEAKICAgICAgICAgICAgIHItPm1iX3R5cGVbbWJfcG9zXSA9IFJWMzRfTUJfQl9ESVJFQ1Q7CiAgICAgfQogICAgIHItPmlzMTYgPSAhIUlTX0lOVFJBMTZ4MTYocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+bWJfdHlwZVttYl9wb3NdKTsKLSAgICBydjM0X2RlY29kZV9tdihyLCByLT5ibG9ja190eXBlKTsKKyAgICBpZiAocnYzNF9kZWNvZGVfbXYociwgci0+YmxvY2tfdHlwZSkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAgICAgaWYoci0+YmxvY2tfdHlwZSA9PSBSVjM0X01CX1NLSVApewogICAgICAgICBmaWxsX3JlY3RhbmdsZShpbnRyYV90eXBlcywgNCwgNCwgci0+aW50cmFfdHlwZXNfc3RyaWRlLCAwLCBzaXplb2YoaW50cmFfdHlwZXNbMF0pKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC01MjAsNyArNTIxLDcgQEAKIHsKICAgICBpbnQgbXVsID0gZGlyID8gLXItPm12X3dlaWdodDIgOiByLT5tdl93ZWlnaHQxOwogCi0gICAgcmV0dXJuICh2YWwgKiBtdWwgKyAweDIwMDApID4+IDE0OworICAgIHJldHVybiAoaW50KSh2YWwgKiAoU1VJTlQpbXVsICsgMHgyMDAwKSA+PiAxNDsKIH0KIAogLyoqCkBAIC04NjQsOCArODY1LDEzIEBACiAKICAgICBtZW1zZXQoci0+ZG12LCAwLCBzaXplb2Yoci0+ZG12KSk7CiAgICAgZm9yKGkgPSAwOyBpIDwgbnVtX212c1tibG9ja190eXBlXTsgaSsrKXsKLSAgICAgICAgci0+ZG12W2ldWzBdID0gc3ZxM19nZXRfc2VfZ29sb21iKGdiKTsKLSAgICAgICAgci0+ZG12W2ldWzFdID0gc3ZxM19nZXRfc2VfZ29sb21iKGdiKTsKKyAgICAgICAgci0+ZG12W2ldWzBdID0gZ2V0X2ludGVybGVhdmVkX3NlX2dvbG9tYihnYik7CisgICAgICAgIHItPmRtdltpXVsxXSA9IGdldF9pbnRlcmxlYXZlZF9zZV9nb2xvbWIoZ2IpOworICAgICAgICBpZiAoci0+ZG12W2ldWzBdID09IElOVkFMSURfVkxDIHx8CisgICAgICAgICAgICByLT5kbXZbaV1bMV0gPT0gSU5WQUxJRF9WTEMpIHsKKyAgICAgICAgICAgIHItPmRtdltpXVswXSA9IHItPmRtdltpXVsxXSA9IDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogICAgIH0KICAgICBzd2l0Y2goYmxvY2tfdHlwZSl7CiAgICAgY2FzZSBSVjM0X01CX1RZUEVfSU5UUkE6CkBAIC0xNDc4LDcgKzE0ODQsNyBAQAogICAgIHJldHVybiBzLT5tYl95ID09IHMtPm1iX2hlaWdodDsKIH0KIAotLyoqIEB9ICovIC8vIHJlY29ucyBncm91cCBlbmQKKy8qKiBAfSAqLyAvLyByZWNvbnN0cnVjdGlvbiBncm91cCBlbmQKIAogLyoqCiAgKiBJbml0aWFsaXplIGRlY29kZXIuCkBAIC0xNTc5LDE2ICsxNTg1LDE5IEBACiAKICAgICAvLyBEbyBubyBjYWxsIGZmX21wZWdfdXBkYXRlX3RocmVhZF9jb250ZXh0IG9uIGEgcGFydGlhbGx5IGluaXRpYWxpemVkCiAgICAgLy8gZGVjb2RlciBjb250ZXh0LgotICAgIGlmICghczEtPmxpbmVzaXplKQorICAgIGlmICghczEtPmNvbnRleHRfaW5pdGlhbGl6ZWQpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgcmV0dXJuIGZmX21wZWdfdXBkYXRlX3RocmVhZF9jb250ZXh0KGRzdCwgc3JjKTsKIH0KIAotc3RhdGljIGludCBnZXRfc2xpY2Vfb2Zmc2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbikKK3N0YXRpYyBpbnQgZ2V0X3NsaWNlX29mZnNldChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IG4sIGludCBzbGljZV9jb3VudCwgaW50IGJ1Zl9zaXplKQogewotICAgIGlmKGF2Y3R4LT5zbGljZV9jb3VudCkgcmV0dXJuIGF2Y3R4LT5zbGljZV9vZmZzZXRbbl07Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZfUkwzMihidWYgKyBuKjggLSA0KSA9PSAxID8gQVZfUkwzMihidWYgKyBuKjgpIDogIEFWX1JCMzIoYnVmICsgbio4KTsKKyAgICBpZiAobiA8IHNsaWNlX2NvdW50KSB7CisgICAgICAgIGlmKGF2Y3R4LT5zbGljZV9jb3VudCkgcmV0dXJuIGF2Y3R4LT5zbGljZV9vZmZzZXRbbl07CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWX1JMMzIoYnVmICsgbio4IC0gNCkgPT0gMSA/IEFWX1JMMzIoYnVmICsgbio4KSA6ICBBVl9SQjMyKGJ1ZiArIG4qOCk7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKIH0KIAogc3RhdGljIGludCBmaW5pc2hfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWN0KQpAQCAtMTYyNyw3ICsxNjM2LDcgQEAKICAgICBpZiAoIXNhci5udW0pCiAgICAgICAgIHNhciA9IChBVlJhdGlvbmFsKXsxLCAxfTsKIAotICAgIHNhciA9IGF2X211bF9xKHNhciwgKEFWUmF0aW9uYWwpe25ld19oICogb2xkX3csIG5ld193ICogb2xkX2h9KTsKKyAgICBzYXIgPSBhdl9tdWxfcShzYXIsIGF2X211bF9xKChBVlJhdGlvbmFsKXtuZXdfaCwgbmV3X3d9LCAoQVZSYXRpb25hbCl7b2xkX3csIG9sZF9ofSkpOwogICAgIHJldHVybiBzYXI7CiB9CiAKQEAgLTE2NDYsNiArMTY1NSw3IEBACiAgICAgY29uc3QgdWludDhfdCAqc2xpY2VzX2hkciA9IE5VTEw7CiAgICAgaW50IGxhc3QgPSAwOwogICAgIGludCBmYXVsdHlfYiA9IDA7CisgICAgaW50IG9mZnNldDsKIAogICAgIC8qIG5vIHN1cHBsZW1lbnRhcnkgcGljdHVyZSAqLwogICAgIGlmIChidWZfc2l6ZSA9PSAwKSB7CkBAIC0xNjY4LDEzICsxNjc4LDEzIEBACiAgICAgfWVsc2UKICAgICAgICAgc2xpY2VfY291bnQgPSBhdmN0eC0+c2xpY2VfY291bnQ7CiAKKyAgICBvZmZzZXQgPSBnZXRfc2xpY2Vfb2Zmc2V0KGF2Y3R4LCBzbGljZXNfaGRyLCAwLCBzbGljZV9jb3VudCwgYnVmX3NpemUpOwogICAgIC8vcGFyc2UgZmlyc3Qgc2xpY2UgaGVhZGVyIHRvIGNoZWNrIHdoZXRoZXIgdGhpcyBmcmFtZSBjYW4gYmUgZGVjb2RlZAotICAgIGlmKGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIDApIDwgMCB8fAotICAgICAgIGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIDApID4gYnVmX3NpemUpeworICAgIGlmKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmX3NpemUpewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNsaWNlIG9mZnNldCBpcyBpbnZhbGlkXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWYrZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgMCksIChidWZfc2l6ZS1nZXRfc2xpY2Vfb2Zmc2V0KGF2Y3R4LCBzbGljZXNfaGRyLCAwKSkqOCk7CisgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZitvZmZzZXQsIChidWZfc2l6ZS1vZmZzZXQpKjgpOwogICAgIGlmKHItPnBhcnNlX3NsaWNlX2hlYWRlcihyLCAmci0+cy5nYiwgJnNpKSA8IDAgfHwgc2kuc3RhcnQpewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZpcnN0IHNsaWNlIGhlYWRlciBpcyBpbmNvcnJlY3RcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTE3MjMsNiArMTczMyw4IEBACiAgICAgICAgICAgICBpZiAoKGVyciA9IHJ2MzRfZGVjb2Rlcl9yZWFsbG9jKHIpKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQorICAgICAgICBpZiAoZmF1bHR5X2IpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgcy0+cGljdF90eXBlID0gc2kudHlwZSA/IHNpLnR5cGUgOiBBVl9QSUNUVVJFX1RZUEVfSTsKICAgICAgICAgaWYgKGZmX21wdl9mcmFtZV9zdGFydChzLCBzLT5hdmN0eCkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTc1Miw2ICsxNzY0LDkgQEAKICAgICAgICAgICAgICAgICByLT5tdl93ZWlnaHQxID0gci0+bXZfd2VpZ2h0MiA9IHItPndlaWdodDEgPSByLT53ZWlnaHQyID0gODE5MjsKICAgICAgICAgICAgICAgICByLT5zY2FsZWRfd2VpZ2h0ID0gMDsKICAgICAgICAgICAgIH1lbHNleworICAgICAgICAgICAgICAgIGlmIChGRk1BWChkaXN0MCwgZGlzdDEpID4gcmVmZGlzdCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVFJBQ0UsICJkaXN0YW5jZSBvdmVyZmxvd1xuIik7CisKICAgICAgICAgICAgICAgICByLT5tdl93ZWlnaHQxID0gKGRpc3QwIDw8IDE0KSAvIHJlZmRpc3Q7CiAgICAgICAgICAgICAgICAgci0+bXZfd2VpZ2h0MiA9IChkaXN0MSA8PCAxNCkgLyByZWZkaXN0OwogICAgICAgICAgICAgICAgIGlmKChyLT5tdl93ZWlnaHQxfHItPm12X3dlaWdodDIpICYgNTExKXsKQEAgLTE3NzMsNDQgKzE3ODgsMzQgQEAKICAgICAgICAgICAgICAgICJtdWx0aXRocmVhZGluZyBtb2RlIChzdGFydCBNQiBpcyAlZCkuXG4iLCBzaS5zdGFydCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KLSAgICBpZiAoZmF1bHR5X2IpCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgZm9yKGkgPSAwOyBpIDwgc2xpY2VfY291bnQ7IGkrKyl7Ci0gICAgICAgIGludCBvZmZzZXQgPSBnZXRfc2xpY2Vfb2Zmc2V0KGF2Y3R4LCBzbGljZXNfaGRyLCBpKTsKKyAgICAgICAgaW50IG9mZnNldCAgPSBnZXRfc2xpY2Vfb2Zmc2V0KGF2Y3R4LCBzbGljZXNfaGRyLCBpICAsIHNsaWNlX2NvdW50LCBidWZfc2l6ZSk7CisgICAgICAgIGludCBvZmZzZXQxID0gZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgaSsxLCBzbGljZV9jb3VudCwgYnVmX3NpemUpOwogICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgaWYoaSsxID09IHNsaWNlX2NvdW50KQotICAgICAgICAgICAgc2l6ZSA9IGJ1Zl9zaXplIC0gb2Zmc2V0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzaXplID0gZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgaSsxKSAtIG9mZnNldDsKIAotICAgICAgICBpZihvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1Zl9zaXplKXsKKyAgICAgICAgaWYob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPiBvZmZzZXQxIHx8IG9mZnNldDEgPiBidWZfc2l6ZSl7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNsaWNlIG9mZnNldCBpcyBpbnZhbGlkXG4iKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIHNpemUgPSBvZmZzZXQxIC0gb2Zmc2V0OwogCiAgICAgICAgIHItPnNpLmVuZCA9IHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0OwogICAgICAgICBzLT5tYl9udW1fbGVmdCA9IHItPnMubWJfeCArIHItPnMubWJfeSpyLT5zLm1iX3dpZHRoIC0gci0+c2kuc3RhcnQ7CiAKICAgICAgICAgaWYoaSsxIDwgc2xpY2VfY291bnQpewotICAgICAgICAgICAgaWYgKGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkrMSkgPCAwIHx8Ci0gICAgICAgICAgICAgICAgZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgaSsxKSA+IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0MiA9IGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkrMiwgc2xpY2VfY291bnQsIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIGlmIChvZmZzZXQyIDwgb2Zmc2V0MSB8fCBvZmZzZXQyID4gYnVmX3NpemUpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlNsaWNlIG9mZnNldCBpcyBpbnZhbGlkXG4iKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWYrZ2V0X3NsaWNlX29mZnNldChhdmN0eCwgc2xpY2VzX2hkciwgaSsxKSwgKGJ1Zl9zaXplLWdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkrMSkpKjgpOworICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGJ1ZitvZmZzZXQxLCAoYnVmX3NpemUtb2Zmc2V0MSkqOCk7CiAgICAgICAgICAgICBpZihyLT5wYXJzZV9zbGljZV9oZWFkZXIociwgJnItPnMuZ2IsICZzaSkgPCAwKXsKLSAgICAgICAgICAgICAgICBpZihpKzIgPCBzbGljZV9jb3VudCkKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGdldF9zbGljZV9vZmZzZXQoYXZjdHgsIHNsaWNlc19oZHIsIGkrMikgLSBvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzaXplID0gYnVmX3NpemUgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgc2l6ZSA9IG9mZnNldDIgLSBvZmZzZXQ7CiAgICAgICAgICAgICB9ZWxzZQogICAgICAgICAgICAgICAgIHItPnNpLmVuZCA9IHNpLnN0YXJ0OwogICAgICAgICB9Ci0gICAgICAgIGlmIChzaXplIDwgMCB8fCBzaXplID4gYnVmX3NpemUgLSBvZmZzZXQpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2xpY2Ugc2l6ZSBpcyBpbnZhbGlkXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9CisgICAgICAgIGF2X2Fzc2VydDAgKHNpemUgPj0gMCAmJiBzaXplIDw9IGJ1Zl9zaXplIC0gb2Zmc2V0KTsKICAgICAgICAgbGFzdCA9IHJ2MzRfZGVjb2RlX3NsaWNlKHIsIHItPnNpLmVuZCwgYnVmICsgb2Zmc2V0LCBzaXplKTsKICAgICAgICAgaWYobGFzdCkKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9ydjM0LmggYi9saWJhdmNvZGVjL3J2MzQuaAppbmRleCBlMmY0MGM4Li5lZmZmOTRhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3J2MzQuaAorKysgYi9saWJhdmNvZGVjL3J2MzQuaApAQCAtMTAxLDEyICsxMDEsMTIgQEAKICAgICBpbnQgaXMxNjsgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGJsb2NrIGhhcyBhZGRpdGlvbmFsIDE2eDE2IHNwZWNpZmljIGZlYXR1cmVzIG9yIG5vdAogICAgIGludCBkbXZbNF1bMl07ICAgICAgICAgICAvLy88IGRpZmZlcmVudGlhbCBtb3Rpb24gdmVjdG9ycyBmb3IgdGhlIGN1cnJlbnQgbWFjcm9ibG9jawogCi0gICAgaW50IHJ2MzA7ICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIHdoaWNoIFJWIHZhcmlhc250IGlzIGN1cnJlbnRseSBkZWNvZGVkCisgICAgaW50IHJ2MzA7ICAgICAgICAgICAgICAgIC8vLzwgaW5kaWNhdGVzIHdoaWNoIFJWIHZhcmlhbnQgaXMgY3VycmVudGx5IGRlY29kZWQKICAgICBpbnQgbWF4X3JwcjsKIAogICAgIGludCBjdXJfcHRzLCBsYXN0X3B0cywgbmV4dF9wdHM7CiAgICAgaW50IHNjYWxlZF93ZWlnaHQ7Ci0gICAgaW50IHdlaWdodDEsIHdlaWdodDI7ICAgIC8vLzwgQiBmcmFtZSBkaXN0YW5jZSBmcmFjdGlvbnMgKDAuMTQpIHVzZWQgaW4gbW90aW9uIGNvbXBlbnNhdGlvbgorICAgIGludCB3ZWlnaHQxLCB3ZWlnaHQyOyAgICAvLy88IEItZnJhbWUgZGlzdGFuY2UgZnJhY3Rpb25zICgwLjE0KSB1c2VkIGluIG1vdGlvbiBjb21wZW5zYXRpb24KICAgICBpbnQgbXZfd2VpZ2h0MSwgbXZfd2VpZ2h0MjsKIAogICAgIGludCBvcmlnX3dpZHRoLCBvcmlnX2hlaWdodDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvcnY0MC5jIGIvbGliYXZjb2RlYy9ydjQwLmMKaW5kZXggM2ZmMTU1NC4uZGZlZWJkYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9ydjQwLmMKKysrIGIvbGliYXZjb2RlYy9ydjQwLmMKQEAgLTEwOSw2ICsxMDksOCBAQAogICAgICAgICB2YWwgPSBkaW1bZ2V0X2JpdHMxKGdiKSAtIHZhbF07CiAgICAgaWYoIXZhbCl7CiAgICAgICAgIGRveworICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgOCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIHQgPSBnZXRfYml0cyhnYiwgOCk7CiAgICAgICAgICAgICB2YWwgKz0gdCA8PCAyOwogICAgICAgICB9d2hpbGUodCA9PSAweEZGKTsKQEAgLTE4Nyw3ICsxODksNyBAQAogICAgICAgICAgICAgQSA9IHB0clstci0+aW50cmFfdHlwZXNfc3RyaWRlICsgMV07IC8vIGl0IHdvbid0IGJlIHVzZWQgZm9yIHRoZSBsYXN0IGNvZWZmaWNpZW50IGluIGEgcm93CiAgICAgICAgICAgICBCID0gcHRyWy1yLT5pbnRyYV90eXBlc19zdHJpZGVdOwogICAgICAgICAgICAgQyA9IHB0clstMV07Ci0gICAgICAgICAgICBwYXR0ZXJuID0gQSArIChCIDw8IDQpICsgKEMgPDwgOCk7CisgICAgICAgICAgICBwYXR0ZXJuID0gQSArIEIgKiAoMSA8PCA0KSArIEMgKiAoMSA8PCA4KTsKICAgICAgICAgICAgIGZvcihrID0gMDsgayA8IE1PREUyX1BBVFRFUk5TX05VTTsgaysrKQogICAgICAgICAgICAgICAgIGlmKHBhdHRlcm4gPT0gcnY0MF9haWNfdGFibGVfaW5kZXhba10pCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjMxLDcgKzIzMyw3IEBACiAgICAgaW50IG1iX3BvcyA9IHMtPm1iX3ggKyBzLT5tYl95ICogcy0+bWJfc3RyaWRlOwogCiAgICAgaWYoIXItPnMubWJfc2tpcF9ydW4pIHsKLSAgICAgICAgci0+cy5tYl9za2lwX3J1biA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYikgKyAxOworICAgICAgICByLT5zLm1iX3NraXBfcnVuID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYihnYikgKyAxOwogICAgICAgICBpZihyLT5zLm1iX3NraXBfcnVuID4gKHVuc2lnbmVkKXMtPm1iX251bSkKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3J2NDBkc3AuYyBiL2xpYmF2Y29kZWMvcnY0MGRzcC5jCmluZGV4IDE5YjBlOTMuLjU1NzliZDkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvcnY0MGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvcnY0MGRzcC5jCkBAIC0yOTIsNyArMjkyLDEwIEBACiB9OwogCiAjZGVmaW5lIFJWNDBfQ0hST01BX01DKE9QTkFNRSwgT1ApXAotc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2NDBfY2hyb21hX21jNF9jKHVpbnQ4X3QgKmRzdC8qYWxpZ24gOCovLCB1aW50OF90ICpzcmMvKmFsaWduIDEqLywgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSl7XAorc3RhdGljIHZvaWQgT1BOQU1FICMjIHJ2NDBfY2hyb21hX21jNF9jKHVpbnQ4X3QgKmRzdCAvKmFsaWduIDgqLyxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjIC8qYWxpZ24gMSovLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KVwKK3tcCiAgICAgY29uc3QgaW50IEEgPSAoOC14KSAqICg4LXkpO1wKICAgICBjb25zdCBpbnQgQiA9ICggIHgpICogKDgteSk7XAogICAgIGNvbnN0IGludCBDID0gKDgteCkgKiAoICB5KTtcCkBAIC0zMTMsNyArMzE2LDcgQEAKICAgICAgICAgfVwKICAgICB9ZWxzZXtcCiAgICAgICAgIGNvbnN0IGludCBFID0gQiArIEM7XAotICAgICAgICBjb25zdCBpbnQgc3RlcCA9IEMgPyBzdHJpZGUgOiAxO1wKKyAgICAgICAgY29uc3QgcHRyZGlmZl90IHN0ZXAgPSBDID8gc3RyaWRlIDogMTtcCiAgICAgICAgIGZvcihpID0gMDsgaSA8IGg7IGkrKyl7XAogICAgICAgICAgICAgT1AoZHN0WzBdLCAoQSpzcmNbMF0gKyBFKnNyY1tzdGVwKzBdICsgYmlhcykpO1wKICAgICAgICAgICAgIE9QKGRzdFsxXSwgKEEqc3JjWzFdICsgRSpzcmNbc3RlcCsxXSArIGJpYXMpKTtcCkBAIC0zMjUsNyArMzI4LDEwIEBACiAgICAgfVwKIH1cCiBcCi1zdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9jaHJvbWFfbWM4X2ModWludDhfdCAqZHN0LyphbGlnbiA4Ki8sIHVpbnQ4X3QgKnNyYy8qYWxpZ24gMSovLCBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KXtcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgcnY0MF9jaHJvbWFfbWM4X2ModWludDhfdCAqZHN0LyphbGlnbiA4Ki8sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYy8qYWxpZ24gMSovLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KVwKK3tcCiAgICAgY29uc3QgaW50IEEgPSAoOC14KSAqICg4LXkpO1wKICAgICBjb25zdCBpbnQgQiA9ICggIHgpICogKDgteSk7XAogICAgIGNvbnN0IGludCBDID0gKDgteCkgKiAoICB5KTtcCkBAIC0zNTAsNyArMzU2LDcgQEAKICAgICAgICAgfVwKICAgICB9ZWxzZXtcCiAgICAgICAgIGNvbnN0IGludCBFID0gQiArIEM7XAotICAgICAgICBjb25zdCBpbnQgc3RlcCA9IEMgPyBzdHJpZGUgOiAxO1wKKyAgICAgICAgY29uc3QgcHRyZGlmZl90IHN0ZXAgPSBDID8gc3RyaWRlIDogMTtcCiAgICAgICAgIGZvcihpID0gMDsgaSA8IGg7IGkrKyl7XAogICAgICAgICAgICAgT1AoZHN0WzBdLCAoQSpzcmNbMF0gKyBFKnNyY1tzdGVwKzBdICsgYmlhcykpO1wKICAgICAgICAgICAgIE9QKGRzdFsxXSwgKEEqc3JjWzFdICsgRSpzcmNbc3RlcCsxXSArIGJpYXMpKTtcCkBAIC00NDksNyArNDU1LDcgQEAKICAgICAgICAgaWYgKHUgPiAzIC0gKGZpbHRlcl9wMSAmJiBmaWx0ZXJfcTEpKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgdCA8PD0gMjsKKyAgICAgICAgdCAqPSAxIDw8IDI7CiAgICAgICAgIGlmIChmaWx0ZXJfcDEgJiYgZmlsdGVyX3ExKQogICAgICAgICAgICAgdCArPSBzcmNbLTIqc3RlcF0gLSBzcmNbMSpzdGVwXTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zMzAybS5jIGIvbGliYXZjb2RlYy9zMzAybS5jCmluZGV4IGNjZmI1OTEuLjU4NGI1OGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvczMwMm0uYworKysgYi9saWJhdmNvZGVjL3MzMDJtLmMKQEAgLTEyMCwxMCArMTIwLDEwIEBACiAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDI0KSB7CiAgICAgICAgIHVpbnQzMl90ICpvID0gKHVpbnQzMl90ICopZnJhbWUtPmRhdGFbMF07CiAgICAgICAgIGZvciAoOyBidWZfc2l6ZSA+IDY7IGJ1Zl9zaXplIC09IDcpIHsKLSAgICAgICAgICAgICpvKysgPSAoZmZfcmV2ZXJzZVtidWZbMl1dICAgICAgICA8PCAyNCkgfAorICAgICAgICAgICAgKm8rKyA9ICgodW5zaWduZWQpZmZfcmV2ZXJzZVtidWZbMl1dICAgICAgICA8PCAyNCkgfAogICAgICAgICAgICAgICAgICAgIChmZl9yZXZlcnNlW2J1ZlsxXV0gICAgICAgIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAgKGZmX3JldmVyc2VbYnVmWzBdXSAgICAgICAgPDwgIDgpOwotICAgICAgICAgICAgKm8rKyA9IChmZl9yZXZlcnNlW2J1Zls2XSAmIDB4ZjBdIDw8IDI4KSB8CisgICAgICAgICAgICAqbysrID0gKCh1bnNpZ25lZClmZl9yZXZlcnNlW2J1Zls2XSAmIDB4ZjBdIDw8IDI4KSB8CiAgICAgICAgICAgICAgICAgICAgKGZmX3JldmVyc2VbYnVmWzVdXSAgICAgICAgPDwgMjApIHwKICAgICAgICAgICAgICAgICAgICAoZmZfcmV2ZXJzZVtidWZbNF1dICAgICAgICA8PCAxMikgfAogICAgICAgICAgICAgICAgICAgIChmZl9yZXZlcnNlW2J1ZlszXSAmIDB4MGZdIDw8ICA0KTsKQEAgLTE0MiwxMCArMTQyLDEwIEBACiAgICAgfSBlbHNlIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAyMCkgewogICAgICAgICB1aW50MzJfdCAqbyA9ICh1aW50MzJfdCAqKWZyYW1lLT5kYXRhWzBdOwogICAgICAgICBmb3IgKDsgYnVmX3NpemUgPiA1OyBidWZfc2l6ZSAtPSA2KSB7Ci0gICAgICAgICAgICAqbysrID0gKGZmX3JldmVyc2VbYnVmWzJdICYgMHhmMF0gPDwgMjgpIHwKKyAgICAgICAgICAgICpvKysgPSAoKHVuc2lnbmVkKWZmX3JldmVyc2VbYnVmWzJdICYgMHhmMF0gPDwgMjgpIHwKICAgICAgICAgICAgICAgICAgICAoZmZfcmV2ZXJzZVtidWZbMV1dICAgICAgICA8PCAyMCkgfAogICAgICAgICAgICAgICAgICAgIChmZl9yZXZlcnNlW2J1ZlswXV0gICAgICAgIDw8IDEyKTsKLSAgICAgICAgICAgICpvKysgPSAoZmZfcmV2ZXJzZVtidWZbNV0gJiAweGYwXSA8PCAyOCkgfAorICAgICAgICAgICAgKm8rKyA9ICgodW5zaWduZWQpZmZfcmV2ZXJzZVtidWZbNV0gJiAweGYwXSA8PCAyOCkgfAogICAgICAgICAgICAgICAgICAgIChmZl9yZXZlcnNlW2J1Zls0XV0gICAgICAgIDw8IDIwKSB8CiAgICAgICAgICAgICAgICAgICAgKGZmX3JldmVyc2VbYnVmWzNdXSAgICAgICAgPDwgMTIpOwogICAgICAgICAgICAgYnVmICs9IDY7CkBAIC0yMDEsNyArMjAxLDcgQEAKICAgICByZXR1cm4gYXZwa3QtPnNpemU7CiB9CiAKLSNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBzMzAybV9vcHRpb25zW10gPSB7CiAgICAgeyJub25fcGNtX21vZGUiLCAiQ2hvb3NlcyB3aGF0IHRvIGRvIHdpdGggTk9OLVBDTSIsIG9mZnNldG9mKFMzMDJDb250ZXh0LCBub25fcGNtX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gM30sIDAsIDMsIEZMQUdTLCAibm9uX3BjbV9tb2RlIn0sCiAgICAgeyJjb3B5IiAgICAgICAgLCAiUGFzcyBOT04tUENNIHRocm91Z2ggdW5jaGFuZ2VkIiAgICAgLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAwfSwgMCwgMywgRkxBR1MsICJub25fcGNtX21vZGUifSwKQEAgLTIxMiwxMCArMjEyLDEwIEBACiB9OwogCiBzdGF0aWMgY29uc3QgQVZDbGFzcyBzMzAybV9jbGFzcyA9IHsKLSAgICAiU01QVEUgMzAyTSBEZWNvZGVyIiwKLSAgICBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKLSAgICBzMzAybV9vcHRpb25zLAotICAgIExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2xhc3NfbmFtZSA9ICJTTVBURSAzMDJNIERlY29kZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBzMzAybV9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAogQVZDb2RlYyBmZl9zMzAybV9kZWNvZGVyID0gewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zYW1pZGVjLmMgYi9saWJhdmNvZGVjL3NhbWlkZWMuYwppbmRleCA5NWYzNWFiLi5lMzJmMjM4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3NhbWlkZWMuYworKysgYi9saWJhdmNvZGVjL3NhbWlkZWMuYwpAQCAtMzUsNiArMzUsNyBAQAogICAgIEFWQlByaW50IGVuY29kZWRfc291cmNlOwogICAgIEFWQlByaW50IGVuY29kZWRfY29udGVudDsKICAgICBBVkJQcmludCBmdWxsOworICAgIGludCByZWFkb3JkZXI7CiB9IFNBTUlDb250ZXh0OwogCiBzdGF0aWMgaW50IHNhbWlfcGFyYWdyYXBoX3RvX2FzcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKnNyYykKQEAgLTQ3LDYgKzQ4LDkgQEAKICAgICBBVkJQcmludCAqZHN0X2NvbnRlbnQgPSAmc2FtaS0+ZW5jb2RlZF9jb250ZW50OwogICAgIEFWQlByaW50ICpkc3Rfc291cmNlID0gJnNhbWktPmVuY29kZWRfc291cmNlOwogCisgICAgaWYgKCFkdXBzcmMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKICAgICBhdl9icHJpbnRfY2xlYXIoJnNhbWktPmVuY29kZWRfY29udGVudCk7CiAgICAgYXZfYnByaW50X2NsZWFyKCZzYW1pLT5jb250ZW50KTsKICAgICBhdl9icHJpbnRfY2xlYXIoJnNhbWktPmVuY29kZWRfc291cmNlKTsKQEAgLTExMiwxMCArMTE2LDE0IEBACiAKICAgICBhdl9icHJpbnRfY2xlYXIoJnNhbWktPmZ1bGwpOwogICAgIGlmIChzYW1pLT5zb3VyY2UubGVuKSB7Ci0gICAgICAgIGZmX2h0bWxtYXJrdXBfdG9fYXNzKGF2Y3R4LCBkc3Rfc291cmNlLCBzYW1pLT5zb3VyY2Uuc3RyKTsKKyAgICAgICAgcmV0ID0gZmZfaHRtbG1hcmt1cF90b19hc3MoYXZjdHgsIGRzdF9zb3VyY2UsIHNhbWktPnNvdXJjZS5zdHIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICBhdl9icHJpbnRmKCZzYW1pLT5mdWxsLCAie1xcaTF9JXN7XFxpMH1cXE4iLCBzYW1pLT5lbmNvZGVkX3NvdXJjZS5zdHIpOwogICAgIH0KLSAgICBmZl9odG1sbWFya3VwX3RvX2FzcyhhdmN0eCwgZHN0X2NvbnRlbnQsIHNhbWktPmNvbnRlbnQuc3RyKTsKKyAgICByZXQgPSBmZl9odG1sbWFya3VwX3RvX2FzcyhhdmN0eCwgZHN0X2NvbnRlbnQsIHNhbWktPmNvbnRlbnQuc3RyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CiAgICAgYXZfYnByaW50Zigmc2FtaS0+ZnVsbCwgIiVzIiwgc2FtaS0+ZW5jb2RlZF9jb250ZW50LnN0cik7CiAKIGVuZDoKQEAgLTEzMCwxMSArMTM4LDEyIEBACiAgICAgY29uc3QgY2hhciAqcHRyID0gYXZwa3QtPmRhdGE7CiAgICAgU0FNSUNvbnRleHQgKnNhbWkgPSBhdmN0eC0+cHJpdl9kYXRhOwogCi0gICAgaWYgKHB0ciAmJiBhdnBrdC0+c2l6ZSA+IDAgJiYgIXNhbWlfcGFyYWdyYXBoX3RvX2FzcyhhdmN0eCwgcHRyKSkgewotICAgICAgICBpbnQgdHNfc3RhcnQgICAgID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMsIGF2Y3R4LT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXsxLDEwMH0pOwotICAgICAgICBpbnQgdHNfZHVyYXRpb24gID0gYXZwa3QtPmR1cmF0aW9uICE9IC0xID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShhdnBrdC0+ZHVyYXRpb24sIGF2Y3R4LT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXsxLDEwMH0pIDogLTE7Ci0gICAgICAgIGludCByZXQgPSBmZl9hc3NfYWRkX3JlY3RfYnByaW50KHN1YiwgJnNhbWktPmZ1bGwsIHRzX3N0YXJ0LCB0c19kdXJhdGlvbik7CisgICAgaWYgKHB0ciAmJiBhdnBrdC0+c2l6ZSA+IDApIHsKKyAgICAgICAgaW50IHJldCA9IHNhbWlfcGFyYWdyYXBoX3RvX2FzcyhhdmN0eCwgcHRyKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAvLyBUT0RPOiBwYXNzIGVzY2FwZWQgc2FtaS0+ZW5jb2RlZF9zb3VyY2Uuc3RyIGFzIHNvdXJjZQorICAgICAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3Qoc3ViLCBzYW1pLT5mdWxsLnN0ciwgc2FtaS0+cmVhZG9yZGVyKyssIDAsIE5VTEwsIE5VTEwpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTY0LDYgKzE3MywxMyBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBzYW1pX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTQU1JQ29udGV4dCAqc2FtaSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaWYgKCEoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX1JPX0ZMVVNIX05PT1ApKQorICAgICAgICBzYW1pLT5yZWFkb3JkZXIgPSAwOworfQorCiBBVkNvZGVjIGZmX3NhbWlfZGVjb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAic2FtaSIsCiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNBTUkgc3VidGl0bGUiKSwKQEAgLTE3Myw0ICsxODksNSBAQAogICAgIC5pbml0ICAgICAgICAgICA9IHNhbWlfaW5pdCwKICAgICAuY2xvc2UgICAgICAgICAgPSBzYW1pX2Nsb3NlLAogICAgIC5kZWNvZGUgICAgICAgICA9IHNhbWlfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgICA9IHNhbWlfZmx1c2gsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zYW5tLmMgYi9saWJhdmNvZGVjL3Nhbm0uYwppbmRleCAxYWEwMDJiLi44MTFmZDIxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Nhbm0uYworKysgYi9saWJhdmNvZGVjL3Nhbm0uYwpAQCAtMjY4LDcgKzI2OCw3IEBACiAgICAgdWludDMyX3QgcGFsW1BBTEVUVEVfU0laRV07CiAgICAgaW50MTZfdCBkZWx0YV9wYWxbUEFMRVRURV9ERUxUQV07CiAKLSAgICBpbnQgcGl0Y2g7CisgICAgcHRyZGlmZl90IHBpdGNoOwogICAgIGludCB3aWR0aCwgaGVpZ2h0OwogICAgIGludCBhbGlnbmVkX3dpZHRoLCBhbGlnbmVkX2hlaWdodDsKICAgICBpbnQgcHJldl9zZXE7CkBAIC00NjIsMTEgKzQ2MiwxMSBAQAogCiBzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF9idWZmZXJzKFNBTk1WaWRlb0NvbnRleHQgKmN0eCkKIHsKLSAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmN0eC0+ZnJtMCwgJmN0eC0+ZnJtMF9zaXplLCBjdHgtPmJ1Zl9zaXplKTsKLSAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmN0eC0+ZnJtMSwgJmN0eC0+ZnJtMV9zaXplLCBjdHgtPmJ1Zl9zaXplKTsKLSAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmN0eC0+ZnJtMiwgJmN0eC0+ZnJtMl9zaXplLCBjdHgtPmJ1Zl9zaXplKTsKKyAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2N6KCZjdHgtPmZybTAsICZjdHgtPmZybTBfc2l6ZSwgY3R4LT5idWZfc2l6ZSk7CisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jeigmY3R4LT5mcm0xLCAmY3R4LT5mcm0xX3NpemUsIGN0eC0+YnVmX3NpemUpOworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvY3ooJmN0eC0+ZnJtMiwgJmN0eC0+ZnJtMl9zaXplLCBjdHgtPmJ1Zl9zaXplKTsKICAgICBpZiAoIWN0eC0+dmVyc2lvbikKLSAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZjdHgtPnN0b3JlZF9mcmFtZSwKKyAgICAgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jeigmY3R4LT5zdG9yZWRfZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5zdG9yZWRfZnJhbWVfc2l6ZSwgY3R4LT5idWZfc2l6ZSk7CiAKICAgICBpZiAoIWN0eC0+ZnJtMCB8fCAhY3R4LT5mcm0xIHx8ICFjdHgtPmZybTIgfHwKQEAgLTYyMyw3ICs2MjMsNyBAQAogc3RhdGljIGludCBvbGRfY29kZWMzNyhTQU5NVmlkZW9Db250ZXh0ICpjdHgsIGludCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7Ci0gICAgaW50IHN0cmlkZSA9IGN0eC0+cGl0Y2g7CisgICAgcHRyZGlmZl90IHN0cmlkZSA9IGN0eC0+cGl0Y2g7CiAgICAgaW50IGksIGosIGssIHQ7CiAgICAgdWludDhfdCAqZHN0LCAqcHJldjsKICAgICBpbnQgc2tpcF9ydW4gPSAwOwpAQCAtODYxLDcgKzg2MSw3IEBACiB7CiAgICAgdWludDMyX3QgZGVjb2RlZF9zaXplOwogICAgIGludCBpLCBqOwotICAgIGludCBzdHJpZGUgICAgID0gY3R4LT5waXRjaDsKKyAgICBwdHJkaWZmX3Qgc3RyaWRlID0gY3R4LT5waXRjaDsKICAgICB1aW50OF90ICpkc3QgICA9ICh1aW50OF90ICopY3R4LT5mcm0wICsgbGVmdCArIHRvcCAqIHN0cmlkZTsKICAgICB1aW50OF90ICpwcmV2MSA9ICh1aW50OF90ICopY3R4LT5mcm0xOwogICAgIHVpbnQ4X3QgKnByZXYyID0gKHVpbnQ4X3QgKiljdHgtPmZybTI7CkBAIC05NzgsMTMgKzk3OCwxMCBAQAogICAgIGNhc2UgMToKICAgICBjYXNlIDM6CiAgICAgICAgIHJldHVybiBvbGRfY29kZWMxKGN0eCwgdG9wLCBsZWZ0LCB3LCBoKTsKLSAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAzNzoKICAgICAgICAgcmV0dXJuIG9sZF9jb2RlYzM3KGN0eCwgdG9wLCBsZWZ0LCB3LCBoKTsKLSAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0NzoKICAgICAgICAgcmV0dXJuIG9sZF9jb2RlYzQ3KGN0eCwgdG9wLCBsZWZ0LCB3LCBoKTsKLSAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGN0eC0+YXZjdHgsICJTdWJjb2RlYyAlZCIsIGNvZGVjKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwpAQCAtMTAxNCwxMSArMTAxMSwxMSBAQAogICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKIH0KIAotc3RhdGljIHZvaWQgY29weV9ibG9jayh1aW50MTZfdCAqcGRlc3QsIHVpbnQxNl90ICpwc3JjLCBpbnQgYmxvY2tfc2l6ZSwgaW50IHBpdGNoKQorc3RhdGljIHZvaWQgY29weV9ibG9jayh1aW50MTZfdCAqcGRlc3QsIHVpbnQxNl90ICpwc3JjLCBpbnQgYmxvY2tfc2l6ZSwgcHRyZGlmZl90IHBpdGNoKQogewogICAgIHVpbnQ4X3QgKmRzdCA9ICh1aW50OF90ICopcGRlc3Q7CiAgICAgdWludDhfdCAqc3JjID0gKHVpbnQ4X3QgKilwc3JjOwotICAgIGludCBzdHJpZGUgPSBwaXRjaCAqIDI7CisgICAgcHRyZGlmZl90IHN0cmlkZSA9IHBpdGNoICogMjsKIAogICAgIHN3aXRjaCAoYmxvY2tfc2l6ZSkgewogICAgIGNhc2UgMjoKQEAgLTEwMzMsNyArMTAzMCw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBmaWxsX2Jsb2NrKHVpbnQxNl90ICpwZGVzdCwgdWludDE2X3QgY29sb3IsIGludCBibG9ja19zaXplLCBpbnQgcGl0Y2gpCitzdGF0aWMgdm9pZCBmaWxsX2Jsb2NrKHVpbnQxNl90ICpwZGVzdCwgdWludDE2X3QgY29sb3IsIGludCBibG9ja19zaXplLCBwdHJkaWZmX3QgcGl0Y2gpCiB7CiAgICAgaW50IHgsIHk7CiAKQEAgLTEwNDUsNyArMTA0Miw3IEBACiAKIHN0YXRpYyBpbnQgZHJhd19nbHlwaChTQU5NVmlkZW9Db250ZXh0ICpjdHgsIHVpbnQxNl90ICpkc3QsIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBmZ19jb2xvciwgdWludDE2X3QgYmdfY29sb3IsIGludCBibG9ja19zaXplLAotICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcGl0Y2gpCiB7CiAgICAgaW50OF90ICpwZ2x5cGg7CiAgICAgdWludDE2X3QgY29sb3JzWzJdID0geyBmZ19jb2xvciwgYmdfY29sb3IgfTsKQEAgLTEwNjUsNyArMTA2Miw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Bjb2RlXzB4ZjcoU0FOTVZpZGVvQ29udGV4dCAqY3R4LCBpbnQgY3gsIGludCBjeSwgaW50IGJsb2NrX3NpemUsIGludCBwaXRjaCkKK3N0YXRpYyBpbnQgb3Bjb2RlXzB4ZjcoU0FOTVZpZGVvQ29udGV4dCAqY3R4LCBpbnQgY3gsIGludCBjeSwgaW50IGJsb2NrX3NpemUsIHB0cmRpZmZfdCBwaXRjaCkKIHsKICAgICB1aW50MTZfdCAqZHN0ID0gY3R4LT5mcm0wICsgY3ggKyBjeSAqIGN0eC0+cGl0Y2g7CiAKQEAgLTEwOTksNyArMTA5Niw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgb3Bjb2RlXzB4ZjgoU0FOTVZpZGVvQ29udGV4dCAqY3R4LCBpbnQgY3gsIGludCBjeSwgaW50IGJsb2NrX3NpemUsIGludCBwaXRjaCkKK3N0YXRpYyBpbnQgb3Bjb2RlXzB4ZjgoU0FOTVZpZGVvQ29udGV4dCAqY3R4LCBpbnQgY3gsIGludCBjeSwgaW50IGJsb2NrX3NpemUsIHB0cmRpZmZfdCBwaXRjaCkKIHsKICAgICB1aW50MTZfdCAqZHN0ID0gY3R4LT5mcm0wICsgY3ggKyBjeSAqIGN0eC0+cGl0Y2g7CiAKQEAgLTEzNjksOCArMTM2Niw4IEBACiB7CiAgICAgdWludDhfdCAqZHN0OwogICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9ICh1aW50OF90KikgY3R4LT5mcm0wOwotICAgIGludCByZXQsIGRzdHBpdGNoLCBoZWlnaHQgPSBjdHgtPmhlaWdodDsKLSAgICBpbnQgc3JjcGl0Y2ggPSBjdHgtPnBpdGNoICogKGhkciA/IHNpemVvZihjdHgtPmZybTBbMF0pIDogMSk7CisgICAgaW50IHJldCwgaGVpZ2h0ID0gY3R4LT5oZWlnaHQ7CisgICAgcHRyZGlmZl90IGRzdHBpdGNoLCBzcmNwaXRjaCA9IGN0eC0+cGl0Y2ggKiAoaGRyID8gc2l6ZW9mKGN0eC0+ZnJtMFswXSkgOiAxKTsKIAogICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihjdHgtPmF2Y3R4LCBjdHgtPmZyYW1lLCAwKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zYmMuYyBiL2xpYmF2Y29kZWMvc2JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzYjY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvc2JjLmMKQEAgLTAsMCArMSwyNzEgQEAKKy8qCisgKiBCbHVldG9vdGggbG93LWNvbXBsZXhpdHksIHN1YmJhbmQgY29kZWMgKFNCQykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEzICBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIEhlbnJ5ayBQbG9ldHogPGhlbnJ5a0BwbG9ldHpsaS5jaD4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4ICBCcmFkIE1pZGdsZXkgPGJtaWRnbGV5QHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0JDIGNvbW1vbiBmdW5jdGlvbnMgZm9yIHRoZSBlbmNvZGVyIGFuZCBkZWNvZGVyCisgKi8KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJzYmMuaCIKKworLyogQTJEUCBzcGVjaWZpY2F0aW9uOiBBcHBlbmRpeCBCLCBwYWdlIDY5ICovCitzdGF0aWMgY29uc3QgaW50IHNiY19vZmZzZXQ0WzRdWzRdID0geworICAgIHsgLTEsIDAsIDAsIDAgfSwKKyAgICB7IC0yLCAwLCAwLCAxIH0sCisgICAgeyAtMiwgMCwgMCwgMSB9LAorICAgIHsgLTIsIDAsIDAsIDEgfQorfTsKKworLyogQTJEUCBzcGVjaWZpY2F0aW9uOiBBcHBlbmRpeCBCLCBwYWdlIDY5ICovCitzdGF0aWMgY29uc3QgaW50IHNiY19vZmZzZXQ4WzRdWzhdID0geworICAgIHsgLTIsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfSwKKyAgICB7IC0zLCAwLCAwLCAwLCAwLCAwLCAxLCAyIH0sCisgICAgeyAtNCwgMCwgMCwgMCwgMCwgMCwgMSwgMiB9LAorICAgIHsgLTQsIDAsIDAsIDAsIDAsIDAsIDEsIDIgfQorfTsKKworLyoKKyAqIENhbGN1bGF0ZXMgdGhlIENSQy04IG9mIHRoZSBmaXJzdCBsZW4gYml0cyBpbiBkYXRhCisgKi8KK3VpbnQ4X3QgZmZfc2JjX2NyYzgoY29uc3QgQVZDUkMgKmN0eCwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICBzaXplX3QgYnl0ZV9sZW5ndGggPSBsZW4gPj4gMzsKKyAgICBpbnQgYml0X2xlbmd0aCA9IGxlbiAmIDc7CisgICAgdWludDhfdCBjcmM7CisKKyAgICBjcmMgPSBhdl9jcmMoY3R4LCAweDBGLCBkYXRhLCBieXRlX2xlbmd0aCk7CisKKyAgICBpZiAoYml0X2xlbmd0aCkgeworICAgICAgICB1aW50OF90IGJpdHMgPSBkYXRhW2J5dGVfbGVuZ3RoXTsKKyAgICAgICAgd2hpbGUgKGJpdF9sZW5ndGgtLSkgeworICAgICAgICAgICAgaW50OF90IG1hc2sgPSBiaXRzIF4gY3JjOworICAgICAgICAgICAgY3JjID0gKGNyYyA8PCAxKSBeICgobWFzayA+PiA3KSAmIDB4MUQpOworICAgICAgICAgICAgYml0cyA8PD0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBjcmM7Cit9CisKKy8qCisgKiBDb2RlIHN0cmFpZ2h0IGZyb20gdGhlIHNwZWMgdG8gY2FsY3VsYXRlIHRoZSBiaXRzIGFycmF5CisgKiBUYWtlcyBhIHBvaW50ZXIgdG8gdGhlIGZyYW1lIGluIHF1ZXN0aW9uIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGJpdHMgYXJyYXkKKyAqLwordm9pZCBmZl9zYmNfY2FsY3VsYXRlX2JpdHMoY29uc3Qgc3RydWN0IHNiY19mcmFtZSAqZnJhbWUsIGludCAoKmJpdHMpWzhdKQoreworICAgIGludCBzdWJiYW5kcyA9IGZyYW1lLT5zdWJiYW5kczsKKyAgICB1aW50OF90IHNmID0gZnJhbWUtPmZyZXF1ZW5jeTsKKworICAgIGlmIChmcmFtZS0+bW9kZSA9PSBNT05PIHx8IGZyYW1lLT5tb2RlID09IERVQUxfQ0hBTk5FTCkgeworICAgICAgICBpbnQgYml0bmVlZFsyXVs4XSwgbG91ZG5lc3MsIG1heF9iaXRuZWVkLCBiaXRjb3VudCwgc2xpY2Vjb3VudCwgYml0c2xpY2U7CisgICAgICAgIGludCBjaCwgc2I7CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZnJhbWUtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBtYXhfYml0bmVlZCA9IDA7CisgICAgICAgICAgICBpZiAoZnJhbWUtPmFsbG9jYXRpb24gPT0gU05SKSB7CisgICAgICAgICAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgc3ViYmFuZHM7IHNiKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYml0bmVlZFtjaF1bc2JdID0gZnJhbWUtPnNjYWxlX2ZhY3RvcltjaF1bc2JdOworICAgICAgICAgICAgICAgICAgICBpZiAoYml0bmVlZFtjaF1bc2JdID4gbWF4X2JpdG5lZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYml0bmVlZCA9IGJpdG5lZWRbY2hdW3NiXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+c2NhbGVfZmFjdG9yW2NoXVtzYl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdG5lZWRbY2hdW3NiXSA9IC01OworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJiYW5kcyA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzID0gZnJhbWUtPnNjYWxlX2ZhY3RvcltjaF1bc2JdIC0gc2JjX29mZnNldDRbc2ZdW3NiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VkbmVzcyA9IGZyYW1lLT5zY2FsZV9mYWN0b3JbY2hdW3NiXSAtIHNiY19vZmZzZXQ4W3NmXVtzYl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG91ZG5lc3MgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG5lZWRbY2hdW3NiXSA9IGxvdWRuZXNzIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRuZWVkW2NoXVtzYl0gPSBsb3VkbmVzczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYml0bmVlZFtjaF1bc2JdID4gbWF4X2JpdG5lZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYml0bmVlZCA9IGJpdG5lZWRbY2hdW3NiXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJpdGNvdW50ID0gMDsKKyAgICAgICAgICAgIHNsaWNlY291bnQgPSAwOworICAgICAgICAgICAgYml0c2xpY2UgPSBtYXhfYml0bmVlZCArIDE7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYml0c2xpY2UtLTsKKyAgICAgICAgICAgICAgICBiaXRjb3VudCArPSBzbGljZWNvdW50OworICAgICAgICAgICAgICAgIHNsaWNlY291bnQgPSAwOworICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYml0bmVlZFtjaF1bc2JdID4gYml0c2xpY2UgKyAxKSAmJiAoYml0bmVlZFtjaF1bc2JdIDwgYml0c2xpY2UgKyAxNikpCisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGJpdG5lZWRbY2hdW3NiXSA9PSBiaXRzbGljZSArIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBzbGljZWNvdW50ICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoYml0Y291bnQgKyBzbGljZWNvdW50IDwgZnJhbWUtPmJpdHBvb2wpOworCisgICAgICAgICAgICBpZiAoYml0Y291bnQgKyBzbGljZWNvdW50ID09IGZyYW1lLT5iaXRwb29sKSB7CisgICAgICAgICAgICAgICAgYml0Y291bnQgKz0gc2xpY2Vjb3VudDsKKyAgICAgICAgICAgICAgICBiaXRzbGljZS0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBzdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgICAgIGlmIChiaXRuZWVkW2NoXVtzYl0gPCBiaXRzbGljZSArIDIpCisgICAgICAgICAgICAgICAgICAgIGJpdHNbY2hdW3NiXSA9IDA7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJpdHNbY2hdW3NiXSA9IGJpdG5lZWRbY2hdW3NiXSAtIGJpdHNsaWNlOworICAgICAgICAgICAgICAgICAgICBpZiAoYml0c1tjaF1bc2JdID4gMTYpCisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzW2NoXVtzYl0gPSAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBiaXRjb3VudCA8IGZyYW1lLT5iaXRwb29sICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IgPCBzdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgICAgIGlmICgoYml0c1tjaF1bc2JdID49IDIpICYmIChiaXRzW2NoXVtzYl0gPCAxNikpIHsKKyAgICAgICAgICAgICAgICAgICAgYml0c1tjaF1bc2JdKys7CisgICAgICAgICAgICAgICAgICAgIGJpdGNvdW50Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYml0bmVlZFtjaF1bc2JdID09IGJpdHNsaWNlICsgMSkgJiYgKGZyYW1lLT5iaXRwb29sID4gYml0Y291bnQgKyAxKSkgeworICAgICAgICAgICAgICAgICAgICBiaXRzW2NoXVtzYl0gPSAyOworICAgICAgICAgICAgICAgICAgICBiaXRjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChzYiA9IDA7IGJpdGNvdW50IDwgZnJhbWUtPmJpdHBvb2wgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYiA8IHN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJpdHNbY2hdW3NiXSA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIGJpdHNbY2hdW3NiXSsrOworICAgICAgICAgICAgICAgICAgICBiaXRjb3VudCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKGZyYW1lLT5tb2RlID09IFNURVJFTyB8fCBmcmFtZS0+bW9kZSA9PSBKT0lOVF9TVEVSRU8pIHsKKyAgICAgICAgaW50IGJpdG5lZWRbMl1bOF0sIGxvdWRuZXNzLCBtYXhfYml0bmVlZCwgYml0Y291bnQsIHNsaWNlY291bnQsIGJpdHNsaWNlOworICAgICAgICBpbnQgY2gsIHNiOworCisgICAgICAgIG1heF9iaXRuZWVkID0gMDsKKyAgICAgICAgaWYgKGZyYW1lLT5hbGxvY2F0aW9uID09IFNOUikgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgMjsgY2grKykgeworICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdG5lZWRbY2hdW3NiXSA9IGZyYW1lLT5zY2FsZV9mYWN0b3JbY2hdW3NiXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJpdG5lZWRbY2hdW3NiXSA+IG1heF9iaXRuZWVkKQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2JpdG5lZWQgPSBiaXRuZWVkW2NoXVtzYl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgMjsgY2grKykgeworICAgICAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IHN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+c2NhbGVfZmFjdG9yW2NoXVtzYl0gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdG5lZWRbY2hdW3NiXSA9IC01OworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJiYW5kcyA9PSA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvdWRuZXNzID0gZnJhbWUtPnNjYWxlX2ZhY3RvcltjaF1bc2JdIC0gc2JjX29mZnNldDRbc2ZdW3NiXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3VkbmVzcyA9IGZyYW1lLT5zY2FsZV9mYWN0b3JbY2hdW3NiXSAtIHNiY19vZmZzZXQ4W3NmXVtzYl07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG91ZG5lc3MgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG5lZWRbY2hdW3NiXSA9IGxvdWRuZXNzIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRuZWVkW2NoXVtzYl0gPSBsb3VkbmVzczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoYml0bmVlZFtjaF1bc2JdID4gbWF4X2JpdG5lZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfYml0bmVlZCA9IGJpdG5lZWRbY2hdW3NiXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBiaXRjb3VudCA9IDA7CisgICAgICAgIHNsaWNlY291bnQgPSAwOworICAgICAgICBiaXRzbGljZSA9IG1heF9iaXRuZWVkICsgMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgYml0c2xpY2UtLTsKKyAgICAgICAgICAgIGJpdGNvdW50ICs9IHNsaWNlY291bnQ7CisgICAgICAgICAgICBzbGljZWNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IDI7IGNoKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHNiID0gMDsgc2IgPCBzdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGJpdG5lZWRbY2hdW3NiXSA+IGJpdHNsaWNlICsgMSkgJiYgKGJpdG5lZWRbY2hdW3NiXSA8IGJpdHNsaWNlICsgMTYpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2Vjb3VudCsrOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChiaXRuZWVkW2NoXVtzYl0gPT0gYml0c2xpY2UgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2Vjb3VudCArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAoYml0Y291bnQgKyBzbGljZWNvdW50IDwgZnJhbWUtPmJpdHBvb2wpOworCisgICAgICAgIGlmIChiaXRjb3VudCArIHNsaWNlY291bnQgPT0gZnJhbWUtPmJpdHBvb2wpIHsKKyAgICAgICAgICAgIGJpdGNvdW50ICs9IHNsaWNlY291bnQ7CisgICAgICAgICAgICBiaXRzbGljZS0tOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgMjsgY2grKykgeworICAgICAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgc3ViYmFuZHM7IHNiKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYml0bmVlZFtjaF1bc2JdIDwgYml0c2xpY2UgKyAyKSB7CisgICAgICAgICAgICAgICAgICAgIGJpdHNbY2hdW3NiXSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYml0c1tjaF1bc2JdID0gYml0bmVlZFtjaF1bc2JdIC0gYml0c2xpY2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzW2NoXVtzYl0gPiAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHNbY2hdW3NiXSA9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNoID0gMDsKKyAgICAgICAgc2IgPSAwOworICAgICAgICB3aGlsZSAoYml0Y291bnQgPCBmcmFtZS0+Yml0cG9vbCkgeworICAgICAgICAgICAgaWYgKChiaXRzW2NoXVtzYl0gPj0gMikgJiYgKGJpdHNbY2hdW3NiXSA8IDE2KSkgeworICAgICAgICAgICAgICAgIGJpdHNbY2hdW3NiXSsrOworICAgICAgICAgICAgICAgIGJpdGNvdW50Kys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChiaXRuZWVkW2NoXVtzYl0gPT0gYml0c2xpY2UgKyAxKSAmJiAoZnJhbWUtPmJpdHBvb2wgPiBiaXRjb3VudCArIDEpKSB7CisgICAgICAgICAgICAgICAgYml0c1tjaF1bc2JdID0gMjsKKyAgICAgICAgICAgICAgICBiaXRjb3VudCArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoID09IDEpIHsKKyAgICAgICAgICAgICAgICBjaCA9IDA7CisgICAgICAgICAgICAgICAgc2IrKzsKKyAgICAgICAgICAgICAgICBpZiAoc2IgPj0gc3ViYmFuZHMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY2ggPSAxOworICAgICAgICB9CisKKyAgICAgICAgY2ggPSAwOworICAgICAgICBzYiA9IDA7CisgICAgICAgIHdoaWxlIChiaXRjb3VudCA8IGZyYW1lLT5iaXRwb29sKSB7CisgICAgICAgICAgICBpZiAoYml0c1tjaF1bc2JdIDwgMTYpIHsKKyAgICAgICAgICAgICAgICBiaXRzW2NoXVtzYl0rKzsKKyAgICAgICAgICAgICAgICBiaXRjb3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNoID09IDEpIHsKKyAgICAgICAgICAgICAgICBjaCA9IDA7CisgICAgICAgICAgICAgICAgc2IrKzsKKyAgICAgICAgICAgICAgICBpZiAoc2IgPj0gc3ViYmFuZHMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY2ggPSAxOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvc2JjLmggYi9saWJhdmNvZGVjL3NiYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOWM4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3NiYy5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQmx1ZXRvb3RoIGxvdy1jb21wbGV4aXR5LCBzdWJiYW5kIGNvZGVjIChTQkMpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxNCAgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwICBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBIZW5yeWsgUGxvZXR6IDxoZW5yeWtAcGxvZXR6bGkuY2g+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiAgQnJhZCBNaWRnbGV5IDxibWlkZ2xleUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNCQyBjb21tb24gZGVmaW5pdGlvbnMgZm9yIHRoZSBlbmNvZGVyIGFuZCBkZWNvZGVyCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NCQ19ICisjZGVmaW5lIEFWQ09ERUNfU0JDX0gKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisKKyNkZWZpbmUgTVNCQ19CTE9DS1MgMTUKKworLyogc2FtcGxpbmcgZnJlcXVlbmN5ICovCisjZGVmaW5lIFNCQ19GUkVRXzE2MDAwICAweDAwCisjZGVmaW5lIFNCQ19GUkVRXzMyMDAwICAweDAxCisjZGVmaW5lIFNCQ19GUkVRXzQ0MTAwICAweDAyCisjZGVmaW5lIFNCQ19GUkVRXzQ4MDAwICAweDAzCisKKy8qIGJsb2NrcyAqLworI2RlZmluZSBTQkNfQkxLXzQgICAgICAgMHgwMAorI2RlZmluZSBTQkNfQkxLXzggICAgICAgMHgwMQorI2RlZmluZSBTQkNfQkxLXzEyICAgICAgMHgwMgorI2RlZmluZSBTQkNfQkxLXzE2ICAgICAgMHgwMworCisvKiBjaGFubmVsIG1vZGUgKi8KKyNkZWZpbmUgU0JDX01PREVfTU9OTyAgICAgICAgIDB4MDAKKyNkZWZpbmUgU0JDX01PREVfRFVBTF9DSEFOTkVMIDB4MDEKKyNkZWZpbmUgU0JDX01PREVfU1RFUkVPICAgICAgIDB4MDIKKyNkZWZpbmUgU0JDX01PREVfSk9JTlRfU1RFUkVPIDB4MDMKKworLyogYWxsb2NhdGlvbiBtZXRob2QgKi8KKyNkZWZpbmUgU0JDX0FNX0xPVURORVNTIDB4MDAKKyNkZWZpbmUgU0JDX0FNX1NOUiAgICAgIDB4MDEKKworLyogc3ViYmFuZHMgKi8KKyNkZWZpbmUgU0JDX1NCXzQgICAgICAgIDB4MDAKKyNkZWZpbmUgU0JDX1NCXzggICAgICAgIDB4MDEKKworLyogc3luY2hyb25pc2F0aW9uIHdvcmRzICovCisjZGVmaW5lIFNCQ19TWU5DV09SRCAgIDB4OUMKKyNkZWZpbmUgTVNCQ19TWU5DV09SRCAgMHhBRAorCisvKiBleHRyYSBiaXRzIG9mIHByZWNpc2lvbiBmb3IgdGhlIHN5bnRoZXNpcyBmaWx0ZXIgaW5wdXQgZGF0YSAqLworI2RlZmluZSBTQkNERUNfRklYRURfRVhUUkFfQklUUyAyCisKKy8qCisgKiBFbmZvcmNlIDE2IGJ5dGUgYWxpZ25tZW50IGZvciB0aGUgZGF0YSwgd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUgdXNlZAorICogd2l0aCBTSU1EIG9wdGltaXplZCBjb2RlLgorICovCisjZGVmaW5lIFNCQ19BTElHTiAxNgorCisvKiBUaGlzIHN0cnVjdHVyZSBjb250YWlucyBhbiB1bnBhY2tlZCBTQkMgZnJhbWUuCisgICBZZXMsIHRoZXJlIGlzIHByb2JhYmx5IHF1aXRlIHNvbWUgdW51c2VkIHNwYWNlIGhlcmVpbiAqLworc3RydWN0IHNiY19mcmFtZSB7CisgICAgdWludDhfdCBmcmVxdWVuY3k7CisgICAgdWludDhfdCBibG9ja3M7CisgICAgZW51bSB7CisgICAgICAgIE1PTk8gICAgICAgICA9IFNCQ19NT0RFX01PTk8sCisgICAgICAgIERVQUxfQ0hBTk5FTCA9IFNCQ19NT0RFX0RVQUxfQ0hBTk5FTCwKKyAgICAgICAgU1RFUkVPICAgICAgID0gU0JDX01PREVfU1RFUkVPLAorICAgICAgICBKT0lOVF9TVEVSRU8gPSBTQkNfTU9ERV9KT0lOVF9TVEVSRU8KKyAgICB9IG1vZGU7CisgICAgdWludDhfdCBjaGFubmVsczsKKyAgICBlbnVtIHsKKyAgICAgICAgTE9VRE5FU1MgPSBTQkNfQU1fTE9VRE5FU1MsCisgICAgICAgIFNOUiAgICAgID0gU0JDX0FNX1NOUgorICAgIH0gYWxsb2NhdGlvbjsKKyAgICB1aW50OF90IHN1YmJhbmRzOworICAgIHVpbnQ4X3QgYml0cG9vbDsKKyAgICB1aW50MTZfdCBjb2Rlc2l6ZTsKKworICAgIC8qIGJpdCBudW1iZXIgeCBzZXQgbWVhbnMgam9pbnQgc3RlcmVvIGhhcyBiZWVuIHVzZWQgaW4gc3ViYmFuZCB4ICovCisgICAgdWludDhfdCBqb2ludDsKKworICAgIC8qIG9ubHkgdGhlIGxvd2VyIDQgYml0cyBvZiBldmVyeSBlbGVtZW50IGFyZSB0byBiZSB1c2VkICovCisgICAgREVDTEFSRV9BTElHTkVEKFNCQ19BTElHTiwgdWludDMyX3QsIHNjYWxlX2ZhY3RvcilbMl1bOF07CisKKyAgICAvKiByYXcgaW50ZWdlciBzdWJiYW5kIHNhbXBsZXMgaW4gdGhlIGZyYW1lICovCisgICAgREVDTEFSRV9BTElHTkVEKFNCQ19BTElHTiwgaW50MzJfdCwgc2Jfc2FtcGxlX2YpWzE2XVsyXVs4XTsKKworICAgIC8qIG1vZGlmaWVkIHN1YmJhbmQgc2FtcGxlcyAqLworICAgIERFQ0xBUkVfQUxJR05FRChTQkNfQUxJR04sIGludDMyX3QsIHNiX3NhbXBsZSlbMTZdWzJdWzhdOworCisgICAgY29uc3QgQVZDUkMgKmNyY19jdHg7Cit9OworCit1aW50OF90IGZmX3NiY19jcmM4KGNvbnN0IEFWQ1JDICpjcmNfY3R4LCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuKTsKK3ZvaWQgZmZfc2JjX2NhbGN1bGF0ZV9iaXRzKGNvbnN0IHN0cnVjdCBzYmNfZnJhbWUgKmZyYW1lLCBpbnQgKCpiaXRzKVs4XSk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1NCQ19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NiY19wYXJzZXIuYyBiL2xpYmF2Y29kZWMvc2JjX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NjU2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3NiY19wYXJzZXIuYwpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIFNCQyBwYXJzZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInNiYy5oIgorI2luY2x1ZGUgInBhcnNlci5oIgorCit0eXBlZGVmIHN0cnVjdCBTQkNQYXJzZUNvbnRleHQgeworICAgIFBhcnNlQ29udGV4dCBwYzsKKyAgICB1aW50OF90IGhlYWRlclszXTsKKyAgICBpbnQgaGVhZGVyX3NpemU7CisgICAgaW50IGJ1ZmZlcmVkX3NpemU7Cit9IFNCQ1BhcnNlQ29udGV4dDsKKworc3RhdGljIGludCBzYmNfcGFyc2VfaGVhZGVyKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IHNhbXBsZV9yYXRlc1s0XSA9IHsgMTYwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAgfTsKKyAgICBpbnQgc3IsIGJsb2NrcywgbW9kZSwgc3ViYmFuZHMsIGJpdHBvb2wsIGNoYW5uZWxzLCBqb2ludDsKKyAgICBpbnQgbGVuZ3RoOworCisgICAgaWYgKGxlbiA8IDMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChkYXRhWzBdID09IE1TQkNfU1lOQ1dPUkQgJiYgZGF0YVsxXSA9PSAwICYmIGRhdGFbMl0gPT0gMCkgeworICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPSAxOworICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzE2OworICAgICAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSAxNjAwMDsKKyAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUgPSAxMjA7CisgICAgICAgIHMtPmR1cmF0aW9uID0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgICAgIHJldHVybiA1NzsKKyAgICB9CisKKyAgICBpZiAoZGF0YVswXSAhPSBTQkNfU1lOQ1dPUkQpCisgICAgICAgIHJldHVybiAtMjsKKworICAgIHNyICAgICAgID0gICAoZGF0YVsxXSA+PiA2KSAmIDB4MDM7CisgICAgYmxvY2tzICAgPSAoKChkYXRhWzFdID4+IDQpICYgMHgwMykgKyAxKSA8PCAyOworICAgIG1vZGUgICAgID0gICAoZGF0YVsxXSA+PiAyKSAmIDB4MDM7CisgICAgc3ViYmFuZHMgPSAoKChkYXRhWzFdID4+IDApICYgMHgwMSkgKyAxKSA8PCAyOworICAgIGJpdHBvb2wgID0gZGF0YVsyXTsKKworICAgIGNoYW5uZWxzID0gbW9kZSA9PSBTQkNfTU9ERV9NT05PID8gMSA6IDI7CisgICAgam9pbnQgICAgPSBtb2RlID09IFNCQ19NT0RFX0pPSU5UX1NURVJFTzsKKworICAgIGxlbmd0aCA9IDQgKyAoc3ViYmFuZHMgKiBjaGFubmVscykgLyAyCisgICAgICAgICAgICAgKyAoKCgobW9kZSA9PSBTQkNfTU9ERV9EVUFMX0NIQU5ORUwpICsgMSkgKiBibG9ja3MgKiBiaXRwb29sCisgICAgICAgICAgICAgICAgICsgKGpvaW50ICogc3ViYmFuZHMpKSArIDcpIC8gODsKKworICAgIGF2Y3R4LT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIGF2Y3R4LT5zYW1wbGVfZm10ID0gQVZfU0FNUExFX0ZNVF9TMTY7CisgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGVzW3NyXTsKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IHN1YmJhbmRzICogYmxvY2tzOworICAgIHMtPmR1cmF0aW9uID0gYXZjdHgtPmZyYW1lX3NpemU7CisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGludCBzYmNfcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQoreworICAgIFNCQ1BhcnNlQ29udGV4dCAqcGMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IG5leHQ7CisKKyAgICBpZiAocy0+ZmxhZ3MgJiBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVMpIHsKKyAgICAgICAgbmV4dCA9IGJ1Zl9zaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwYy0+aGVhZGVyX3NpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShwYy0+aGVhZGVyICsgcGMtPmhlYWRlcl9zaXplLCBidWYsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBjLT5oZWFkZXIpIC0gcGMtPmhlYWRlcl9zaXplKTsKKyAgICAgICAgICAgIG5leHQgPSBzYmNfcGFyc2VfaGVhZGVyKHMsIGF2Y3R4LCBwYy0+aGVhZGVyLCBzaXplb2YocGMtPmhlYWRlcikpCisgICAgICAgICAgICAgICAgIC0gcGMtPmJ1ZmZlcmVkX3NpemU7CisgICAgICAgICAgICBwYy0+aGVhZGVyX3NpemUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV4dCA9IHNiY19wYXJzZV9oZWFkZXIocywgYXZjdHgsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICAgICAgaWYgKG5leHQgPj0gYnVmX3NpemUpCisgICAgICAgICAgICAgICAgbmV4dCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5leHQgPCAwKSB7CisgICAgICAgICAgICBwYy0+aGVhZGVyX3NpemUgPSBGRk1JTihzaXplb2YocGMtPmhlYWRlciksIGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIG1lbWNweShwYy0+aGVhZGVyLCBidWYsIHBjLT5oZWFkZXJfc2l6ZSk7CisgICAgICAgICAgICBwYy0+YnVmZmVyZWRfc2l6ZSA9IGJ1Zl9zaXplOworICAgICAgICAgICAgbmV4dCA9IEVORF9OT1RfRk9VTkQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmZfY29tYmluZV9mcmFtZSgmcGMtPnBjLCBuZXh0LCAmYnVmLCAmYnVmX3NpemUpIDwgMCkgeworICAgICAgICAgICAgKnBvdXRidWYgICAgICA9IE5VTEw7CisgICAgICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBuZXh0OworfQorCitBVkNvZGVjUGFyc2VyIGZmX3NiY19wYXJzZXIgPSB7CisgICAgLmNvZGVjX2lkcyAgICAgID0geyBBVl9DT0RFQ19JRF9TQkMgfSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoU0JDUGFyc2VDb250ZXh0KSwKKyAgICAucGFyc2VyX3BhcnNlICAgPSBzYmNfcGFyc2UsCisgICAgLnBhcnNlcl9jbG9zZSAgID0gZmZfcGFyc2VfY2xvc2UsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zYmNkZWMuYyBiL2xpYmF2Y29kZWMvc2JjZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2YjM4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvc2JjZGVjLmMKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisgKiBCbHVldG9vdGggbG93LWNvbXBsZXhpdHksIHN1YmJhbmQgY29kZWMgKFNCQykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxMi0yMDEzICBJbnRlbCBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIEhlbnJ5ayBQbG9ldHogPGhlbnJ5a0BwbG9ldHpsaS5jaD4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA4ICBCcmFkIE1pZGdsZXkgPGJtaWRnbGV5QHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0JDIGRlY29kZXIgaW1wbGVtZW50YXRpb24KKyAqLworCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJzYmMuaCIKKyNpbmNsdWRlICJzYmNkZWNfZGF0YS5oIgorCitzdHJ1Y3Qgc2JjX2RlY29kZXJfc3RhdGUgeworICAgIGludDMyX3QgVlsyXVsxNzBdOworICAgIGludCBvZmZzZXRbMl1bMTZdOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgU0JDRGVjQ29udGV4dCB7CisgICAgQVZDbGFzcyAqY2xhc3M7CisgICAgREVDTEFSRV9BTElHTkVEKFNCQ19BTElHTiwgc3RydWN0IHNiY19mcmFtZSwgZnJhbWUpOworICAgIERFQ0xBUkVfQUxJR05FRChTQkNfQUxJR04sIHN0cnVjdCBzYmNfZGVjb2Rlcl9zdGF0ZSwgZHNwKTsKK30gU0JDRGVjQ29udGV4dDsKKworLyoKKyAqIFVucGFja3MgYSBTQkMgZnJhbWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtIGluIGRhdGEsCisgKiB3aGljaCBoYXMgYXQgbW9zdCBsZW4gYnl0ZXMgaW50byBmcmFtZS4KKyAqIFJldHVybnMgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgcGFja2VkIGZyYW1lLCBvciBhIG5lZ2F0aXZlCisgKiB2YWx1ZSBvbiBlcnJvci4gVGhlIGVycm9yIGNvZGVzIGFyZToKKyAqCisgKiAgLTEgICBEYXRhIHN0cmVhbSB0b28gc2hvcnQKKyAqICAtMiAgIFN5bmMgYnl0ZSBpbmNvcnJlY3QKKyAqICAtMyAgIENSQzggaW5jb3JyZWN0CisgKiAgLTQgICBCaXRwb29sIHZhbHVlIG91dCBvZiBib3VuZHMKKyAqLworc3RhdGljIGludCBzYmNfdW5wYWNrX2ZyYW1lKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHN0cnVjdCBzYmNfZnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pCit7CisgICAgdW5zaWduZWQgaW50IGNvbnN1bWVkOworICAgIC8qIFdpbGwgY29weSB0aGUgcGFydHMgb2YgdGhlIGhlYWRlciB0aGF0IGFyZSByZWxldmFudCB0byBjcmMKKyAgICAgKiBjYWxjdWxhdGlvbiBoZXJlICovCisgICAgdWludDhfdCBjcmNfaGVhZGVyWzExXSA9IHsgMCB9OworICAgIGludCBjcmNfcG9zOworICAgIGludDMyX3QgdGVtcDsKKworICAgIHVpbnQzMl90IGF1ZGlvX3NhbXBsZTsKKyAgICBpbnQgY2gsIHNiLCBibGssIGJpdDsgICAvKiBjaGFubmVsLCBzdWJiYW5kLCBibG9jayBhbmQgYml0IHN0YW5kYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlcnMgKi8KKyAgICBpbnQgYml0c1syXVs4XTsgICAgICAgICAvKiBiaXRzIGRpc3RyaWJ1dGlvbiAqLworICAgIHVpbnQzMl90IGxldmVsc1syXVs4XTsgIC8qIGxldmVscyBkZXJpdmVkIGZyb20gdGhhdCAqLworCisgICAgaWYgKGxlbiA8IDQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmIChkYXRhWzBdID09IE1TQkNfU1lOQ1dPUkQpIHsKKyAgICAgICAgaWYgKGRhdGFbMV0gIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgaWYgKGRhdGFbMl0gIT0gMCkKKyAgICAgICAgICAgIHJldHVybiAtMjsKKworICAgICAgICBmcmFtZS0+ZnJlcXVlbmN5ID0gU0JDX0ZSRVFfMTYwMDA7CisgICAgICAgIGZyYW1lLT5ibG9ja3MgPSBNU0JDX0JMT0NLUzsKKyAgICAgICAgZnJhbWUtPmFsbG9jYXRpb24gPSBMT1VETkVTUzsKKyAgICAgICAgZnJhbWUtPm1vZGUgPSBNT05POworICAgICAgICBmcmFtZS0+Y2hhbm5lbHMgPSAxOworICAgICAgICBmcmFtZS0+c3ViYmFuZHMgPSA4OworICAgICAgICBmcmFtZS0+Yml0cG9vbCA9IDI2OworICAgIH0gZWxzZSBpZiAoZGF0YVswXSA9PSBTQkNfU1lOQ1dPUkQpIHsKKyAgICAgICAgZnJhbWUtPmZyZXF1ZW5jeSAgPSAoZGF0YVsxXSA+PiA2KSAmIDB4MDM7CisgICAgICAgIGZyYW1lLT5ibG9ja3MgPSA0ICogKChkYXRhWzFdID4+IDQpICYgMHgwMykgKyA0OworICAgICAgICBmcmFtZS0+bW9kZSA9IChkYXRhWzFdID4+IDIpICYgMHgwMzsKKyAgICAgICAgZnJhbWUtPmNoYW5uZWxzID0gZnJhbWUtPm1vZGUgPT0gTU9OTyA/IDEgOiAyOworICAgICAgICBmcmFtZS0+YWxsb2NhdGlvbiA9IChkYXRhWzFdID4+IDEpICYgMHgwMTsKKyAgICAgICAgZnJhbWUtPnN1YmJhbmRzID0gZGF0YVsxXSAmIDB4MDEgPyA4IDogNDsKKyAgICAgICAgZnJhbWUtPmJpdHBvb2wgPSBkYXRhWzJdOworCisgICAgICAgIGlmICgoZnJhbWUtPm1vZGUgPT0gTU9OTyB8fCBmcmFtZS0+bW9kZSA9PSBEVUFMX0NIQU5ORUwpICYmCisgICAgICAgICAgICBmcmFtZS0+Yml0cG9vbCA+IDE2ICogZnJhbWUtPnN1YmJhbmRzKQorICAgICAgICAgICAgcmV0dXJuIC00OworCisgICAgICAgIGlmICgoZnJhbWUtPm1vZGUgPT0gU1RFUkVPIHx8IGZyYW1lLT5tb2RlID09IEpPSU5UX1NURVJFTykgJiYKKyAgICAgICAgICAgIGZyYW1lLT5iaXRwb29sID4gMzIgKiBmcmFtZS0+c3ViYmFuZHMpCisgICAgICAgICAgICByZXR1cm4gLTQ7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiAtMjsKKworICAgIGNvbnN1bWVkID0gMzI7CisgICAgY3JjX2hlYWRlclswXSA9IGRhdGFbMV07CisgICAgY3JjX2hlYWRlclsxXSA9IGRhdGFbMl07CisgICAgY3JjX3BvcyA9IDE2OworCisgICAgaWYgKGZyYW1lLT5tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICBpZiAobGVuICogOCA8IGNvbnN1bWVkICsgZnJhbWUtPnN1YmJhbmRzKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGZyYW1lLT5qb2ludCA9IDB4MDA7CisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGZyYW1lLT5zdWJiYW5kcyAtIDE7IHNiKyspCisgICAgICAgICAgICBmcmFtZS0+am9pbnQgfD0gKChkYXRhWzRdID4+ICg3IC0gc2IpKSAmIDB4MDEpIDw8IHNiOworICAgICAgICBpZiAoZnJhbWUtPnN1YmJhbmRzID09IDQpCisgICAgICAgICAgICBjcmNfaGVhZGVyW2NyY19wb3MgLyA4XSA9IGRhdGFbNF0gJiAweGYwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjcmNfaGVhZGVyW2NyY19wb3MgLyA4XSA9IGRhdGFbNF07CisKKyAgICAgICAgY29uc3VtZWQgKz0gZnJhbWUtPnN1YmJhbmRzOworICAgICAgICBjcmNfcG9zICs9IGZyYW1lLT5zdWJiYW5kczsKKyAgICB9CisKKyAgICBpZiAobGVuICogOCA8IGNvbnN1bWVkICsgKDQgKiBmcmFtZS0+c3ViYmFuZHMgKiBmcmFtZS0+Y2hhbm5lbHMpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBmcmFtZS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgZnJhbWUtPnN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICAvKiBGSVhNRSBhc3NlcnQoY29uc3VtZWQgJSA0ID09IDApOyAqLworICAgICAgICAgICAgZnJhbWUtPnNjYWxlX2ZhY3RvcltjaF1bc2JdID0KKyAgICAgICAgICAgICAgICAoZGF0YVtjb25zdW1lZCA+PiAzXSA+PiAoNCAtIChjb25zdW1lZCAmIDB4NykpKSAmIDB4MEY7CisgICAgICAgICAgICBjcmNfaGVhZGVyW2NyY19wb3MgPj4gM10gfD0KKyAgICAgICAgICAgICAgICBmcmFtZS0+c2NhbGVfZmFjdG9yW2NoXVtzYl0gPDwgKDQgLSAoY3JjX3BvcyAmIDB4NykpOworCisgICAgICAgICAgICBjb25zdW1lZCArPSA0OworICAgICAgICAgICAgY3JjX3BvcyArPSA0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGRhdGFbM10gIT0gZmZfc2JjX2NyYzgoZnJhbWUtPmNyY19jdHgsIGNyY19oZWFkZXIsIGNyY19wb3MpKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgICBmZl9zYmNfY2FsY3VsYXRlX2JpdHMoZnJhbWUsIGJpdHMpOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgZnJhbWUtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGZyYW1lLT5zdWJiYW5kczsgc2IrKykKKyAgICAgICAgICAgIGxldmVsc1tjaF1bc2JdID0gKDEgPDwgYml0c1tjaF1bc2JdKSAtIDE7CisgICAgfQorCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBmcmFtZS0+YmxvY2tzOyBibGsrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBmcmFtZS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGZyYW1lLT5zdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNoaWZ0OworCisgICAgICAgICAgICAgICAgaWYgKGxldmVsc1tjaF1bc2JdID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNiX3NhbXBsZVtibGtdW2NoXVtzYl0gPSAwOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaGlmdCA9IGZyYW1lLT5zY2FsZV9mYWN0b3JbY2hdW3NiXSArCisgICAgICAgICAgICAgICAgICAgICAgICAxICsgU0JDREVDX0ZJWEVEX0VYVFJBX0JJVFM7CisKKyAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGUgPSAwOworICAgICAgICAgICAgICAgIGZvciAoYml0ID0gMDsgYml0IDwgYml0c1tjaF1bc2JdOyBiaXQrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29uc3VtZWQgPiBsZW4gKiA4KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoZGF0YVtjb25zdW1lZCA+PiAzXSA+PiAoNyAtIChjb25zdW1lZCAmIDB4NykpKSAmIDB4MDEpCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zYW1wbGUgfD0gMSA8PCAoYml0c1tjaF1bc2JdIC0gYml0IC0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgY29uc3VtZWQrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmcmFtZS0+c2Jfc2FtcGxlW2Jsa11bY2hdW3NiXSA9IChpbnQzMl90KQorICAgICAgICAgICAgICAgICAgICAoKCgoKHVpbnQ2NF90KSBhdWRpb19zYW1wbGUgPDwgMSkgfCAxKSA8PCBzaGlmdCkgLworICAgICAgICAgICAgICAgICAgICBsZXZlbHNbY2hdW3NiXSkgLSAoMSA8PCBzaGlmdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZnJhbWUtPm1vZGUgPT0gSk9JTlRfU1RFUkVPKSB7CisgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgZnJhbWUtPmJsb2NrczsgYmxrKyspIHsKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGZyYW1lLT5zdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+am9pbnQgJiAoMHgwMSA8PCBzYikpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGZyYW1lLT5zYl9zYW1wbGVbYmxrXVswXVtzYl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNiX3NhbXBsZVtibGtdWzFdW3NiXTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNiX3NhbXBsZVtibGtdWzFdW3NiXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+c2Jfc2FtcGxlW2Jsa11bMF1bc2JdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zYl9zYW1wbGVbYmxrXVsxXVtzYl07CisgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zYl9zYW1wbGVbYmxrXVswXVtzYl0gPSB0ZW1wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgoY29uc3VtZWQgJiAweDcpICE9IDApCisgICAgICAgIGNvbnN1bWVkICs9IDggLSAoY29uc3VtZWQgJiAweDcpOworCisgICAgcmV0dXJuIGNvbnN1bWVkID4+IDM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYmNfc3ludGhlc2l6ZV9mb3VyKHN0cnVjdCBzYmNfZGVjb2Rlcl9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2JjX2ZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwgaW50IGJsaywgQVZGcmFtZSAqb3V0cHV0X2ZyYW1lKQoreworICAgIGludCBpLCBrLCBpZHg7CisgICAgaW50MzJfdCAqdiA9IHN0YXRlLT5WW2NoXTsKKyAgICBpbnQgKm9mZnNldCA9IHN0YXRlLT5vZmZzZXRbY2hdOworCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAvKiBTaGlmdGluZyAqLworICAgICAgICBvZmZzZXRbaV0tLTsKKyAgICAgICAgaWYgKG9mZnNldFtpXSA8IDApIHsKKyAgICAgICAgICAgIG9mZnNldFtpXSA9IDc5OworICAgICAgICAgICAgbWVtY3B5KHYgKyA4MCwgdiwgOSAqIHNpemVvZigqdikpOworICAgICAgICB9CisKKyAgICAgICAgLyogRGlzdHJpYnV0ZSB0aGUgbmV3IG1hdHJpeCB2YWx1ZSB0byB0aGUgc2hpZnRlZCBwb3NpdGlvbiAqLworICAgICAgICB2W29mZnNldFtpXV0gPQorICAgICAgICAgICAgKCBmZl9zeW5tYXRyaXg0W2ldWzBdICogZnJhbWUtPnNiX3NhbXBsZVtibGtdW2NoXVswXSArCisgICAgICAgICAgICAgIGZmX3N5bm1hdHJpeDRbaV1bMV0gKiBmcmFtZS0+c2Jfc2FtcGxlW2Jsa11bY2hdWzFdICsKKyAgICAgICAgICAgICAgZmZfc3lubWF0cml4NFtpXVsyXSAqIGZyYW1lLT5zYl9zYW1wbGVbYmxrXVtjaF1bMl0gKworICAgICAgICAgICAgICBmZl9zeW5tYXRyaXg0W2ldWzNdICogZnJhbWUtPnNiX3NhbXBsZVtibGtdW2NoXVszXSApID4+IDE1OworICAgIH0KKworICAgIC8qIENvbXB1dGUgdGhlIHNhbXBsZXMgKi8KKyAgICBmb3IgKGlkeCA9IDAsIGkgPSAwOyBpIDwgNDsgaSsrLCBpZHggKz0gNSkgeworICAgICAgICBrID0gKGkgKyA0KSAmIDB4ZjsKKworICAgICAgICAvKiBTdG9yZSBpbiBvdXRwdXQsIFEwICovCisgICAgICAgIEFWX1dOMTZBKCZvdXRwdXRfZnJhbWUtPmRhdGFbY2hdW2JsayAqIDggKyBpICogMl0sIGF2X2NsaXBfaW50MTYoCisgICAgICAgICAgICAoIHZbb2Zmc2V0W2ldICsgMF0gKiBmZl9zYmNfcHJvdG9fNF80MG0wW2lkeCArIDBdICsKKyAgICAgICAgICAgICAgdltvZmZzZXRba10gKyAxXSAqIGZmX3NiY19wcm90b180XzQwbTFbaWR4ICsgMF0gKworICAgICAgICAgICAgICB2W29mZnNldFtpXSArIDJdICogZmZfc2JjX3Byb3RvXzRfNDBtMFtpZHggKyAxXSArCisgICAgICAgICAgICAgIHZbb2Zmc2V0W2tdICsgM10gKiBmZl9zYmNfcHJvdG9fNF80MG0xW2lkeCArIDFdICsKKyAgICAgICAgICAgICAgdltvZmZzZXRbaV0gKyA0XSAqIGZmX3NiY19wcm90b180XzQwbTBbaWR4ICsgMl0gKworICAgICAgICAgICAgICB2W29mZnNldFtrXSArIDVdICogZmZfc2JjX3Byb3RvXzRfNDBtMVtpZHggKyAyXSArCisgICAgICAgICAgICAgIHZbb2Zmc2V0W2ldICsgNl0gKiBmZl9zYmNfcHJvdG9fNF80MG0wW2lkeCArIDNdICsKKyAgICAgICAgICAgICAgdltvZmZzZXRba10gKyA3XSAqIGZmX3NiY19wcm90b180XzQwbTFbaWR4ICsgM10gKworICAgICAgICAgICAgICB2W29mZnNldFtpXSArIDhdICogZmZfc2JjX3Byb3RvXzRfNDBtMFtpZHggKyA0XSArCisgICAgICAgICAgICAgIHZbb2Zmc2V0W2tdICsgOV0gKiBmZl9zYmNfcHJvdG9fNF80MG0xW2lkeCArIDRdICkgPj4gMTUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYmNfc3ludGhlc2l6ZV9laWdodChzdHJ1Y3Qgc2JjX2RlY29kZXJfc3RhdGUgKnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYmNfZnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwgaW50IGJsaywgQVZGcmFtZSAqb3V0cHV0X2ZyYW1lKQoreworICAgIGludCBpLCBrLCBpZHg7CisgICAgaW50MzJfdCAqdiA9IHN0YXRlLT5WW2NoXTsKKyAgICBpbnQgKm9mZnNldCA9IHN0YXRlLT5vZmZzZXRbY2hdOworCisgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgLyogU2hpZnRpbmcgKi8KKyAgICAgICAgb2Zmc2V0W2ldLS07CisgICAgICAgIGlmIChvZmZzZXRbaV0gPCAwKSB7CisgICAgICAgICAgICBvZmZzZXRbaV0gPSAxNTk7CisgICAgICAgICAgICBtZW1jcHkodiArIDE2MCwgdiwgOSAqIHNpemVvZigqdikpOworICAgICAgICB9CisKKyAgICAgICAgLyogRGlzdHJpYnV0ZSB0aGUgbmV3IG1hdHJpeCB2YWx1ZSB0byB0aGUgc2hpZnRlZCBwb3NpdGlvbiAqLworICAgICAgICB2W29mZnNldFtpXV0gPQorICAgICAgICAgICAgKCBmZl9zeW5tYXRyaXg4W2ldWzBdICogZnJhbWUtPnNiX3NhbXBsZVtibGtdW2NoXVswXSArCisgICAgICAgICAgICAgIGZmX3N5bm1hdHJpeDhbaV1bMV0gKiBmcmFtZS0+c2Jfc2FtcGxlW2Jsa11bY2hdWzFdICsKKyAgICAgICAgICAgICAgZmZfc3lubWF0cml4OFtpXVsyXSAqIGZyYW1lLT5zYl9zYW1wbGVbYmxrXVtjaF1bMl0gKworICAgICAgICAgICAgICBmZl9zeW5tYXRyaXg4W2ldWzNdICogZnJhbWUtPnNiX3NhbXBsZVtibGtdW2NoXVszXSArCisgICAgICAgICAgICAgIGZmX3N5bm1hdHJpeDhbaV1bNF0gKiBmcmFtZS0+c2Jfc2FtcGxlW2Jsa11bY2hdWzRdICsKKyAgICAgICAgICAgICAgZmZfc3lubWF0cml4OFtpXVs1XSAqIGZyYW1lLT5zYl9zYW1wbGVbYmxrXVtjaF1bNV0gKworICAgICAgICAgICAgICBmZl9zeW5tYXRyaXg4W2ldWzZdICogZnJhbWUtPnNiX3NhbXBsZVtibGtdW2NoXVs2XSArCisgICAgICAgICAgICAgIGZmX3N5bm1hdHJpeDhbaV1bN10gKiBmcmFtZS0+c2Jfc2FtcGxlW2Jsa11bY2hdWzddICkgPj4gMTU7CisgICAgfQorCisgICAgLyogQ29tcHV0ZSB0aGUgc2FtcGxlcyAqLworICAgIGZvciAoaWR4ID0gMCwgaSA9IDA7IGkgPCA4OyBpKyssIGlkeCArPSA1KSB7CisgICAgICAgIGsgPSAoaSArIDgpICYgMHhmOworCisgICAgICAgIC8qIFN0b3JlIGluIG91dHB1dCwgUTAgKi8KKyAgICAgICAgQVZfV04xNkEoJm91dHB1dF9mcmFtZS0+ZGF0YVtjaF1bYmxrICogMTYgKyBpICogMl0sIGF2X2NsaXBfaW50MTYoCisgICAgICAgICAgICAoIHZbb2Zmc2V0W2ldICsgMF0gKiBmZl9zYmNfcHJvdG9fOF84MG0wW2lkeCArIDBdICsKKyAgICAgICAgICAgICAgdltvZmZzZXRba10gKyAxXSAqIGZmX3NiY19wcm90b184XzgwbTFbaWR4ICsgMF0gKworICAgICAgICAgICAgICB2W29mZnNldFtpXSArIDJdICogZmZfc2JjX3Byb3RvXzhfODBtMFtpZHggKyAxXSArCisgICAgICAgICAgICAgIHZbb2Zmc2V0W2tdICsgM10gKiBmZl9zYmNfcHJvdG9fOF84MG0xW2lkeCArIDFdICsKKyAgICAgICAgICAgICAgdltvZmZzZXRbaV0gKyA0XSAqIGZmX3NiY19wcm90b184XzgwbTBbaWR4ICsgMl0gKworICAgICAgICAgICAgICB2W29mZnNldFtrXSArIDVdICogZmZfc2JjX3Byb3RvXzhfODBtMVtpZHggKyAyXSArCisgICAgICAgICAgICAgIHZbb2Zmc2V0W2ldICsgNl0gKiBmZl9zYmNfcHJvdG9fOF84MG0wW2lkeCArIDNdICsKKyAgICAgICAgICAgICAgdltvZmZzZXRba10gKyA3XSAqIGZmX3NiY19wcm90b184XzgwbTFbaWR4ICsgM10gKworICAgICAgICAgICAgICB2W29mZnNldFtpXSArIDhdICogZmZfc2JjX3Byb3RvXzhfODBtMFtpZHggKyA0XSArCisgICAgICAgICAgICAgIHZbb2Zmc2V0W2tdICsgOV0gKiBmZl9zYmNfcHJvdG9fOF84MG0xW2lkeCArIDRdICkgPj4gMTUpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNiY19zeW50aGVzaXplX2F1ZGlvKHN0cnVjdCBzYmNfZGVjb2Rlcl9zdGF0ZSAqc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2JjX2ZyYW1lICpmcmFtZSwgQVZGcmFtZSAqb3V0cHV0X2ZyYW1lKQoreworICAgIGludCBjaCwgYmxrOworCisgICAgc3dpdGNoIChmcmFtZS0+c3ViYmFuZHMpIHsKKyAgICBjYXNlIDQ6CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGZyYW1lLT5jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgZnJhbWUtPmJsb2NrczsgYmxrKyspCisgICAgICAgICAgICAgICAgc2JjX3N5bnRoZXNpemVfZm91cihzdGF0ZSwgZnJhbWUsIGNoLCBibGssIG91dHB1dF9mcmFtZSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA4OgorICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBmcmFtZS0+Y2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IGZyYW1lLT5ibG9ja3M7IGJsaysrKQorICAgICAgICAgICAgICAgIHNiY19zeW50aGVzaXplX2VpZ2h0KHN0YXRlLCBmcmFtZSwgY2gsIGJsaywgb3V0cHV0X2ZyYW1lKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNiY19kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU0JDRGVjQ29udGV4dCAqc2JjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgY2g7CisKKyAgICBzYmMtPmZyYW1lLmNyY19jdHggPSBhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ184X0VCVSk7CisKKyAgICBtZW1zZXQoc2JjLT5kc3AuViwgMCwgc2l6ZW9mKHNiYy0+ZHNwLlYpKTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCAyOyBjaCsrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc2JjLT5kc3Aub2Zmc2V0WzBdKTsgaSsrKQorICAgICAgICAgICAgc2JjLT5kc3Aub2Zmc2V0W2NoXVtpXSA9ICgxMCAqIGkgKyAxMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JjX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBTQkNEZWNDb250ZXh0ICpzYmMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmV0LCBmcmFtZV9sZW5ndGg7CisKKyAgICBpZiAoIXNiYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKworICAgIGZyYW1lX2xlbmd0aCA9IHNiY191bnBhY2tfZnJhbWUoYXZwa3QtPmRhdGEsICZzYmMtPmZyYW1lLCBhdnBrdC0+c2l6ZSk7CisgICAgaWYgKGZyYW1lX2xlbmd0aCA8PSAwKQorICAgICAgICByZXR1cm4gZnJhbWVfbGVuZ3RoOworCisgICAgZnJhbWUtPmNoYW5uZWxzID0gc2JjLT5mcmFtZS5jaGFubmVsczsKKyAgICBmcmFtZS0+Zm9ybWF0ID0gQVZfU0FNUExFX0ZNVF9TMTZQOworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gc2JjLT5mcmFtZS5ibG9ja3MgKiBzYmMtPmZyYW1lLnN1YmJhbmRzOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzYmNfc3ludGhlc2l6ZV9hdWRpbygmc2JjLT5kc3AsICZzYmMtPmZyYW1lLCBmcmFtZSk7CisKKyAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CisKKyAgICByZXR1cm4gZnJhbWVfbGVuZ3RoOworfQorCitBVkNvZGVjIGZmX3NiY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICAgPSAic2JjIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNCQyAobG93LWNvbXBsZXhpdHkgc3ViYmFuZCBjb2RlYykiKSwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TQkMsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihTQkNEZWNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gc2JjX2RlY29kZV9pbml0LAorICAgIC5kZWNvZGUgICAgICAgICAgICAgICAgPSBzYmNfZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICAgICAgICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICAgICAgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAorICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgPSAoY29uc3QgdWludDY0X3RbXSkgeyBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywgMH0sCisgICAgLnNhbXBsZV9mbXRzICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORSB9LAorICAgIC5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXMgPSAoY29uc3QgaW50W10pIHsgMTYwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDAgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NiY2RlY19kYXRhLmMgYi9saWJhdmNvZGVjL3NiY2RlY19kYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE1MjE2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvc2JjZGVjX2RhdGEuYwpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIEJsdWV0b290aCBsb3ctY29tcGxleGl0eSwgc3ViYmFuZCBjb2RlYyAoU0JDKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIEhlbnJ5ayBQbG9ldHogPGhlbnJ5a0BwbG9ldHpsaS5jaD4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2ICBCcmFkIE1pZGdsZXkgPGJtaWRnbGV5QHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0JDIGRlY29kZXIgdGFibGVzCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInNiY2RlY19kYXRhLmgiCisjaW5jbHVkZSAic2JjLmgiCisKKyNkZWZpbmUgU1M0KHZhbCkgICgoaW50MzJfdCl2YWwgPj4gMTIpCisjZGVmaW5lIFNTOCh2YWwpICAoKGludDMyX3QpdmFsID4+IDE0KQorI2RlZmluZSBTTjQodmFsKSAgKChpbnQzMl90KXZhbCA+PiAxMSArIDEgKyBTQkNERUNfRklYRURfRVhUUkFfQklUUykKKyNkZWZpbmUgU044KHZhbCkgICgoaW50MzJfdCl2YWwgPj4gMTEgKyAxICsgU0JDREVDX0ZJWEVEX0VYVFJBX0JJVFMpCisKK2NvbnN0IGludDMyX3QgZmZfc2JjX3Byb3RvXzRfNDBtMFtdID0geworICAgIFNTNCgweDAwMDAwMDAwKSwgU1M0KDB4ZmZhNjk4MmYpLCBTUzQoMHhmYmE5Mzg0OCksIFNTNCgweDA0NTZjN2I4KSwKKyAgICBTUzQoMHgwMDU5NjdkMSksIFNTNCgweGZmZmI5YWM3KSwgU1M0KDB4ZmY1ODkxNTcpLCBTUzQoMHhmOWMyYThkOCksCisgICAgU1M0KDB4MDI3YzE0MzQpLCBTUzQoMHgwMDE5MTE4YiksIFNTNCgweGZmZjNjNzRjKSwgU1M0KDB4ZmYxMzczMzApLAorICAgIFNTNCgweGY4MWI4ZDcwKSwgU1M0KDB4MDBlYzFiOGIpLCBTUzQoMHhmZmYwYjcxYSksIFNTNCgweGZmZTk5YjAwKSwKKyAgICBTUzQoMHhmZWY4NDQ3MCksIFNTNCgweGY2ZmI0MzcwKSwgU1M0KDB4ZmZjZGMzNTEpLCBTUzQoMHhmZmUwMWRjNykKK307CisKK2NvbnN0IGludDMyX3QgZmZfc2JjX3Byb3RvXzRfNDBtMVtdID0geworICAgIFNTNCgweGZmZTA5MGNlKSwgU1M0KDB4ZmYyYzA0NzUpLCBTUzQoMHhmNjk0ZjgwMCksIFNTNCgweGZmMmMwNDc1KSwKKyAgICBTUzQoMHhmZmUwOTBjZSksIFNTNCgweGZmZTAxZGM3KSwgU1M0KDB4ZmZjZGMzNTEpLCBTUzQoMHhmNmZiNDM3MCksCisgICAgU1M0KDB4ZmVmODQ0NzApLCBTUzQoMHhmZmU5OWIwMCksIFNTNCgweGZmZjBiNzFhKSwgU1M0KDB4MDBlYzFiOGIpLAorICAgIFNTNCgweGY4MWI4ZDcwKSwgU1M0KDB4ZmYxMzczMzApLCBTUzQoMHhmZmYzYzc0YyksIFNTNCgweDAwMTkxMThiKSwKKyAgICBTUzQoMHgwMjdjMTQzNCksIFNTNCgweGY5YzJhOGQ4KSwgU1M0KDB4ZmY1ODkxNTcpLCBTUzQoMHhmZmZiOWFjNykKK307CisKK2NvbnN0IGludDMyX3QgZmZfc2JjX3Byb3RvXzhfODBtMFtdID0geworICAgIFNTOCgweDAwMDAwMDAwKSwgU1M4KDB4ZmU4ZDE5NzApLCBTUzgoMHhlZTk3OWYwMCksIFNTOCgweDExNjg2MTAwKSwKKyAgICBTUzgoMHgwMTcyZTY5MCksIFNTOCgweGZmZjViZDFhKSwgU1M4KDB4ZmRmMWM4ZDQpLCBTUzgoMHhlYWMxODJjMCksCisgICAgU1M4KDB4MGQ5ZGFlZTApLCBTUzgoMHgwMGU1MzBkYSksIFNTOCgweGZmZTk4MTFkKSwgU1M4KDB4ZmQ1Mjk4NmMpLAorICAgIFNTOCgweGU3MDU0Y2EwKSwgU1M4KDB4MGEwMGQ0MTApLCBTUzgoMHgwMDZjMWRlNCksIFNTOCgweGZmZGJhNzA1KSwKKyAgICBTUzgoMHhmY2JjOThlOCksIFNTOCgweGUzODg5ZDIwKSwgU1M4KDB4MDZhZjIzMDgpLCBTUzgoMHgwMDBiYjdkYiksCisgICAgU1M4KDB4ZmZjYTAwZWQpLCBTUzgoMHhmYzNmYmI2OCksIFNTOCgweGUwNzFiYzAwKSwgU1M4KDB4MDNiZjc5NDgpLAorICAgIFNTOCgweGZmYzRlMDVjKSwgU1M4KDB4ZmZiNTRiM2IpLCBTUzgoMHhmYmVkYWRjMCksIFNTOCgweGRkZTI2MjAwKSwKKyAgICBTUzgoMHgwMTQyMjkxYyksIFNTOCgweGZmOTYwZTk0KSwgU1M4KDB4ZmY5ZjNlMTcpLCBTUzgoMHhmYmQ4ZjM1OCksCisgICAgU1M4KDB4ZGJmNzk0MDApLCBTUzgoMHhmZjQwNWUwMSksIFNTOCgweGZmN2Q0OTE0KSwgU1M4KDB4ZmY4YjFhMzEpLAorICAgIFNTOCgweGZjMTQxN2I4KSwgU1M4KDB4ZGFjN2JiNDApLCBTUzgoMHhmZGJiODI4YyksIFNTOCgweGZmNzYyMTcwKQorfTsKKworY29uc3QgaW50MzJfdCBmZl9zYmNfcHJvdG9fOF84MG0xW10gPSB7CisgICAgU1M4KDB4ZmY3YzI3MmMpLCBTUzgoMHhmY2IwMjYyMCksIFNTOCgweGRhNjEyNzAwKSwgU1M4KDB4ZmNiMDI2MjApLAorICAgIFNTOCgweGZmN2MyNzJjKSwgU1M4KDB4ZmY3NjIxNzApLCBTUzgoMHhmZGJiODI4YyksIFNTOCgweGRhYzdiYjQwKSwKKyAgICBTUzgoMHhmYzE0MTdiOCksIFNTOCgweGZmOGIxYTMxKSwgU1M4KDB4ZmY3ZDQ5MTQpLCBTUzgoMHhmZjQwNWUwMSksCisgICAgU1M4KDB4ZGJmNzk0MDApLCBTUzgoMHhmYmQ4ZjM1OCksIFNTOCgweGZmOWYzZTE3KSwgU1M4KDB4ZmY5NjBlOTQpLAorICAgIFNTOCgweDAxNDIyOTFjKSwgU1M4KDB4ZGRlMjYyMDApLCBTUzgoMHhmYmVkYWRjMCksIFNTOCgweGZmYjU0YjNiKSwKKyAgICBTUzgoMHhmZmM0ZTA1YyksIFNTOCgweDAzYmY3OTQ4KSwgU1M4KDB4ZTA3MWJjMDApLCBTUzgoMHhmYzNmYmI2OCksCisgICAgU1M4KDB4ZmZjYTAwZWQpLCBTUzgoMHgwMDBiYjdkYiksIFNTOCgweDA2YWYyMzA4KSwgU1M4KDB4ZTM4ODlkMjApLAorICAgIFNTOCgweGZjYmM5OGU4KSwgU1M4KDB4ZmZkYmE3MDUpLCBTUzgoMHgwMDZjMWRlNCksIFNTOCgweDBhMDBkNDEwKSwKKyAgICBTUzgoMHhlNzA1NGNhMCksIFNTOCgweGZkNTI5ODZjKSwgU1M4KDB4ZmZlOTgxMWQpLCBTUzgoMHgwMGU1MzBkYSksCisgICAgU1M4KDB4MGQ5ZGFlZTApLCBTUzgoMHhlYWMxODJjMCksIFNTOCgweGZkZjFjOGQ0KSwgU1M4KDB4ZmZmNWJkMWEpCit9OworCitjb25zdCBpbnQzMl90IGZmX3N5bm1hdHJpeDRbOF1bNF0gPSB7CisgICAgeyBTTjQoMHgwNWE4Mjc5OCksIFNONCgweGZhNTdkODY4KSwgU040KDB4ZmE1N2Q4NjgpLCBTTjQoMHgwNWE4Mjc5OCkgfSwKKyAgICB7IFNONCgweDAzMGZiYzU0KSwgU040KDB4Zjg5YmU1MTApLCBTTjQoMHgwNzY0MWFmMCksIFNONCgweGZjZjA0M2FjKSB9LAorICAgIHsgU040KDB4MDAwMDAwMDApLCBTTjQoMHgwMDAwMDAwMCksIFNONCgweDAwMDAwMDAwKSwgU040KDB4MDAwMDAwMDApIH0sCisgICAgeyBTTjQoMHhmY2YwNDNhYyksIFNONCgweDA3NjQxYWYwKSwgU040KDB4Zjg5YmU1MTApLCBTTjQoMHgwMzBmYmM1NCkgfSwKKyAgICB7IFNONCgweGZhNTdkODY4KSwgU040KDB4MDVhODI3OTgpLCBTTjQoMHgwNWE4Mjc5OCksIFNONCgweGZhNTdkODY4KSB9LAorICAgIHsgU040KDB4Zjg5YmU1MTApLCBTTjQoMHhmY2YwNDNhYyksIFNONCgweDAzMGZiYzU0KSwgU040KDB4MDc2NDFhZjApIH0sCisgICAgeyBTTjQoMHhmODAwMDAwMCksIFNONCgweGY4MDAwMDAwKSwgU040KDB4ZjgwMDAwMDApLCBTTjQoMHhmODAwMDAwMCkgfSwKKyAgICB7IFNONCgweGY4OWJlNTEwKSwgU040KDB4ZmNmMDQzYWMpLCBTTjQoMHgwMzBmYmM1NCksIFNONCgweDA3NjQxYWYwKSB9Cit9OworCitjb25zdCBpbnQzMl90IGZmX3N5bm1hdHJpeDhbMTZdWzhdID0geworICAgIHsgU044KDB4MDVhODI3OTgpLCBTTjgoMHhmYTU3ZDg2OCksIFNOOCgweGZhNTdkODY4KSwgU044KDB4MDVhODI3OTgpLAorICAgICAgU044KDB4MDVhODI3OTgpLCBTTjgoMHhmYTU3ZDg2OCksIFNOOCgweGZhNTdkODY4KSwgU044KDB4MDVhODI3OTgpIH0sCisgICAgeyBTTjgoMHgwNDcxY2VkMCksIFNOOCgweGY4Mjc1YTEwKSwgU044KDB4MDE4ZjhiODQpLCBTTjgoMHgwNmE2ZDk4OCksCisgICAgICBTTjgoMHhmOTU5MjY3OCksIFNOOCgweGZlNzA3NDdjKSwgU044KDB4MDdkOGE1ZjApLCBTTjgoMHhmYjhlMzEzMCkgfSwKKyAgICB7IFNOOCgweDAzMGZiYzU0KSwgU044KDB4Zjg5YmU1MTApLCBTTjgoMHgwNzY0MWFmMCksIFNOOCgweGZjZjA0M2FjKSwKKyAgICAgIFNOOCgweGZjZjA0M2FjKSwgU044KDB4MDc2NDFhZjApLCBTTjgoMHhmODliZTUxMCksIFNOOCgweDAzMGZiYzU0KSB9LAorICAgIHsgU044KDB4MDE4ZjhiODQpLCBTTjgoMHhmYjhlMzEzMCksIFNOOCgweDA2YTZkOTg4KSwgU044KDB4ZjgyNzVhMTApLAorICAgICAgU044KDB4MDdkOGE1ZjApLCBTTjgoMHhmOTU5MjY3OCksIFNOOCgweDA0NzFjZWQwKSwgU044KDB4ZmU3MDc0N2MpIH0sCisgICAgeyBTTjgoMHgwMDAwMDAwMCksIFNOOCgweDAwMDAwMDAwKSwgU044KDB4MDAwMDAwMDApLCBTTjgoMHgwMDAwMDAwMCksCisgICAgICBTTjgoMHgwMDAwMDAwMCksIFNOOCgweDAwMDAwMDAwKSwgU044KDB4MDAwMDAwMDApLCBTTjgoMHgwMDAwMDAwMCkgfSwKKyAgICB7IFNOOCgweGZlNzA3NDdjKSwgU044KDB4MDQ3MWNlZDApLCBTTjgoMHhmOTU5MjY3OCksIFNOOCgweDA3ZDhhNWYwKSwKKyAgICAgIFNOOCgweGY4Mjc1YTEwKSwgU044KDB4MDZhNmQ5ODgpLCBTTjgoMHhmYjhlMzEzMCksIFNOOCgweDAxOGY4Yjg0KSB9LAorICAgIHsgU044KDB4ZmNmMDQzYWMpLCBTTjgoMHgwNzY0MWFmMCksIFNOOCgweGY4OWJlNTEwKSwgU044KDB4MDMwZmJjNTQpLAorICAgICAgU044KDB4MDMwZmJjNTQpLCBTTjgoMHhmODliZTUxMCksIFNOOCgweDA3NjQxYWYwKSwgU044KDB4ZmNmMDQzYWMpIH0sCisgICAgeyBTTjgoMHhmYjhlMzEzMCksIFNOOCgweDA3ZDhhNWYwKSwgU044KDB4ZmU3MDc0N2MpLCBTTjgoMHhmOTU5MjY3OCksCisgICAgICBTTjgoMHgwNmE2ZDk4OCksIFNOOCgweDAxOGY4Yjg0KSwgU044KDB4ZjgyNzVhMTApLCBTTjgoMHgwNDcxY2VkMCkgfSwKKyAgICB7IFNOOCgweGZhNTdkODY4KSwgU044KDB4MDVhODI3OTgpLCBTTjgoMHgwNWE4Mjc5OCksIFNOOCgweGZhNTdkODY4KSwKKyAgICAgIFNOOCgweGZhNTdkODY4KSwgU044KDB4MDVhODI3OTgpLCBTTjgoMHgwNWE4Mjc5OCksIFNOOCgweGZhNTdkODY4KSB9LAorICAgIHsgU044KDB4Zjk1OTI2NzgpLCBTTjgoMHgwMThmOGI4NCksIFNOOCgweDA3ZDhhNWYwKSwgU044KDB4MDQ3MWNlZDApLAorICAgICAgU044KDB4ZmI4ZTMxMzApLCBTTjgoMHhmODI3NWExMCksIFNOOCgweGZlNzA3NDdjKSwgU044KDB4MDZhNmQ5ODgpIH0sCisgICAgeyBTTjgoMHhmODliZTUxMCksIFNOOCgweGZjZjA0M2FjKSwgU044KDB4MDMwZmJjNTQpLCBTTjgoMHgwNzY0MWFmMCksCisgICAgICBTTjgoMHgwNzY0MWFmMCksIFNOOCgweDAzMGZiYzU0KSwgU044KDB4ZmNmMDQzYWMpLCBTTjgoMHhmODliZTUxMCkgfSwKKyAgICB7IFNOOCgweGY4Mjc1YTEwKSwgU044KDB4Zjk1OTI2NzgpLCBTTjgoMHhmYjhlMzEzMCksIFNOOCgweGZlNzA3NDdjKSwKKyAgICAgIFNOOCgweDAxOGY4Yjg0KSwgU044KDB4MDQ3MWNlZDApLCBTTjgoMHgwNmE2ZDk4OCksIFNOOCgweDA3ZDhhNWYwKSB9LAorICAgIHsgU044KDB4ZjgwMDAwMDApLCBTTjgoMHhmODAwMDAwMCksIFNOOCgweGY4MDAwMDAwKSwgU044KDB4ZjgwMDAwMDApLAorICAgICAgU044KDB4ZjgwMDAwMDApLCBTTjgoMHhmODAwMDAwMCksIFNOOCgweGY4MDAwMDAwKSwgU044KDB4ZjgwMDAwMDApIH0sCisgICAgeyBTTjgoMHhmODI3NWExMCksIFNOOCgweGY5NTkyNjc4KSwgU044KDB4ZmI4ZTMxMzApLCBTTjgoMHhmZTcwNzQ3YyksCisgICAgICBTTjgoMHgwMThmOGI4NCksIFNOOCgweDA0NzFjZWQwKSwgU044KDB4MDZhNmQ5ODgpLCBTTjgoMHgwN2Q4YTVmMCkgfSwKKyAgICB7IFNOOCgweGY4OWJlNTEwKSwgU044KDB4ZmNmMDQzYWMpLCBTTjgoMHgwMzBmYmM1NCksIFNOOCgweDA3NjQxYWYwKSwKKyAgICAgIFNOOCgweDA3NjQxYWYwKSwgU044KDB4MDMwZmJjNTQpLCBTTjgoMHhmY2YwNDNhYyksIFNOOCgweGY4OWJlNTEwKSB9LAorICAgIHsgU044KDB4Zjk1OTI2NzgpLCBTTjgoMHgwMThmOGI4NCksIFNOOCgweDA3ZDhhNWYwKSwgU044KDB4MDQ3MWNlZDApLAorICAgICAgU044KDB4ZmI4ZTMxMzApLCBTTjgoMHhmODI3NWExMCksIFNOOCgweGZlNzA3NDdjKSwgU044KDB4MDZhNmQ5ODgpIH0KK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NiY2RlY19kYXRhLmggYi9saWJhdmNvZGVjL3NiY2RlY19kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3OWQxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvc2JjZGVjX2RhdGEuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQmx1ZXRvb3RoIGxvdy1jb21wbGV4aXR5LCBzdWJiYW5kIGNvZGVjIChTQkMpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCAgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgSGVucnlrIFBsb2V0eiA8aGVucnlrQHBsb2V0emxpLmNoPgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgIEJyYWQgTWlkZ2xleSA8Ym1pZGdsZXlAeG1pc3Npb24uY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTQkMgZGVjb2RlciB0YWJsZXMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU0JDREVDX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX1NCQ0RFQ19EQVRBX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitleHRlcm4gY29uc3QgaW50MzJfdCBmZl9zYmNfcHJvdG9fNF80MG0wW107CitleHRlcm4gY29uc3QgaW50MzJfdCBmZl9zYmNfcHJvdG9fNF80MG0xW107CitleHRlcm4gY29uc3QgaW50MzJfdCBmZl9zYmNfcHJvdG9fOF84MG0wW107CitleHRlcm4gY29uc3QgaW50MzJfdCBmZl9zYmNfcHJvdG9fOF84MG0xW107CitleHRlcm4gY29uc3QgaW50MzJfdCBmZl9zeW5tYXRyaXg0WzhdWzRdOworZXh0ZXJuIGNvbnN0IGludDMyX3QgZmZfc3lubWF0cml4OFsxNl1bOF07CisKKyNlbmRpZiAvKiBBVkNPREVDX1NCQ0RFQ19EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvc2JjZHNwLmMgYi9saWJhdmNvZGVjL3NiY2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDU1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3NiY2RzcC5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogQmx1ZXRvb3RoIGxvdy1jb21wbGV4aXR5LCBzdWJiYW5kIGNvZGVjIChTQkMpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyAgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwICBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBIZW5yeWsgUGxvZXR6IDxoZW5yeWtAcGxvZXR6bGkuY2g+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiAgQnJhZCBNaWRnbGV5IDxibWlkZ2xleUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNCQyBiYXNpYyAiYnVpbGRpbmcgYnJpY2tzIgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludG1hdGguaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAic2JjLmgiCisjaW5jbHVkZSAic2JjZHNwLmgiCisjaW5jbHVkZSAic2JjZHNwX2RhdGEuaCIKKworLyoKKyAqIEEgcmVmZXJlbmNlIEMgY29kZSBvZiBhbmFseXNpcyBmaWx0ZXIgd2l0aCBTSU1ELWZyaWVuZGx5IHRhYmxlcworICogcmVvcmRlcmluZyBhbmQgY29kZSBsYXlvdXQuIFRoaXMgY29kZSBjYW4gYmUgdXNlZCB0byBkZXZlbG9wIHBsYXRmb3JtCisgKiBzcGVjaWZpYyBTSU1EIG9wdGltaXphdGlvbnMuIEFsc28gaXQgbWF5IGJlIHVzZWQgYXMgc29tZSBraW5kIG9mIHRlc3QKKyAqIGZvciBjb21waWxlciBhdXRvdmVjdG9yaXphdGlvbiBjYXBhYmlsaXRpZXMgKHdobyBrbm93cywgaWYgdGhlIGNvbXBpbGVyCisgKiBpcyB2ZXJ5IGdvb2QgYXQgdGhpcyBzdHVmZiwgaGFuZCBvcHRpbWl6ZWQgYXNzZW1ibHkgbWF5IGJlIG5vdCBzdHJpY3RseQorICogbmVlZGVkIGZvciBzb21lIHBsYXRmb3JtKS4KKyAqCisgKiBOb3RlOiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIG1ha2UgYSBzaW1wbGUgdmFyaWFudCBvZiBhbmFseXNpcyBmaWx0ZXIsCisgKiB3aGljaCBuZWVkcyBvbmx5IGEgc2luZ2xlIGNvbnN0YW50cyB0YWJsZSB3aXRob3V0IHRha2luZyBjYXJlIGFib3V0CisgKiBldmVuL29kZCBjYXNlcy4gVGhpcyBzaW1wbGUgdmFyaWFudCBvZiBmaWx0ZXIgY2FuIGJlIGltcGxlbWVudGVkIHdpdGhvdXQKKyAqIGlucHV0IGRhdGEgcGVybXV0YXRpb24uIFRoZSBvbmx5IHRoaW5nIHRoYXQgd291bGQgYmUgbG9zdCBpcyB0aGUKKyAqIHBvc3NpYmlsaXR5IHRvIHVzZSBwYWlyd2lzZSBTSU1EIG11bHRpcGxpY2F0aW9ucy4gQnV0IGZvciBzb21lIHNpbXBsZQorICogQ1BVIGNvcmVzIHdpdGhvdXQgU0lNRCBleHRlbnNpb25zIGl0IGNhbiBiZSB1c2VmdWwuIElmIGFueWJvZHkgaXMKKyAqIGludGVyZXN0ZWQgaW4gaW1wbGVtZW50aW5nIHN1Y2ggdmFyaWFudCBvZiBhIGZpbHRlciwgc291cmNlY29kZSBmcm9tCisgKiBibHVleiB2ZXJzaW9ucyA0LjI2LzQuMjcgY2FuIGJlIHVzZWQgYXMgYSByZWZlcmVuY2UgYW5kIHRoZSBoaXN0b3J5IG9mCisgKiB0aGUgY2hhbmdlcyBpbiBnaXQgcmVwb3NpdG9yeSBkb25lIGFyb3VuZCB0aGF0IHRpbWUgbWF5IGJlIHdvcnRoIGNoZWNraW5nLgorICovCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgc2JjX2FuYWx5emVfc2ltZChjb25zdCBpbnQxNl90ICppbiwgaW50MzJfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNvbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzdWJiYW5kcykKK3sKKyAgICBpbnQzMl90IHQxWzhdOworICAgIGludDE2X3QgdDJbOF07CisgICAgaW50IGksIGosIGhvcCA9IDA7CisKKyAgICAvKiByb3VuZGluZyBjb2VmZmljaWVudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBzdWJiYW5kczsgaSsrKQorICAgICAgICB0MVtpXSA9IDEgPDwgKFNCQ19QUk9UT19GSVhFRF9TQ0FMRSAtIDEpOworCisgICAgLyogbG93IHBhc3MgcG9seXBoYXNlIGZpbHRlciAqLworICAgIGZvciAoaG9wID0gMDsgaG9wIDwgMTAqc3ViYmFuZHM7IGhvcCArPSAyKnN1YmJhbmRzKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMipzdWJiYW5kczsgaSsrKQorICAgICAgICAgICAgdDFbaSA+PiAxXSArPSBpbltob3AgKyBpXSAqIGNvbnN0c1tob3AgKyBpXTsKKworICAgIC8qIHNjYWxpbmcgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc3ViYmFuZHM7IGkrKykKKyAgICAgICAgdDJbaV0gPSB0MVtpXSA+PiBTQkNfUFJPVE9fRklYRURfU0NBTEU7CisKKyAgICBtZW1zZXQodDEsIDAsIHNpemVvZih0MSkpOworCisgICAgLyogZG8gdGhlIGNvcyB0cmFuc2Zvcm0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc3ViYmFuZHMvMjsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgMipzdWJiYW5kczsgaisrKQorICAgICAgICAgICAgdDFbaj4+MV0gKz0gdDJbaSAqIDIgKyAoaiYxKV0gKiBjb25zdHNbMTAqc3ViYmFuZHMgKyBpKjIqc3ViYmFuZHMgKyBqXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzdWJiYW5kczsgaSsrKQorICAgICAgICBvdXRbaV0gPSB0MVtpXSA+PiAoU0JDX0NPU19UQUJMRV9GSVhFRF9TQ0FMRSAtIFNDQUxFX09VVF9CSVRTKTsKK30KKworc3RhdGljIHZvaWQgc2JjX2FuYWx5emVfNF9zaW1kKGNvbnN0IGludDE2X3QgKmluLCBpbnQzMl90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY29uc3RzKQoreworICAgIHNiY19hbmFseXplX3NpbWQoaW4sIG91dCwgY29uc3RzLCA0KTsKK30KKworc3RhdGljIHZvaWQgc2JjX2FuYWx5emVfOF9zaW1kKGNvbnN0IGludDE2X3QgKmluLCBpbnQzMl90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY29uc3RzKQoreworICAgIHNiY19hbmFseXplX3NpbWQoaW4sIG91dCwgY29uc3RzLCA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNiY19hbmFseXplXzRiXzRzX3NpbWQoU0JDRFNQQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKngsIGludDMyX3QgKm91dCwgaW50IG91dF9zdHJpZGUpCit7CisgICAgLyogQW5hbHl6ZSBibG9ja3MgKi8KKyAgICBzLT5zYmNfYW5hbHl6ZV80KHggKyAxMiwgb3V0LCBmZl9zYmNkc3BfYW5hbHlzaXNfY29uc3RzX2ZpeGVkNF9zaW1kX29kZCk7CisgICAgb3V0ICs9IG91dF9zdHJpZGU7CisgICAgcy0+c2JjX2FuYWx5emVfNCh4ICsgOCwgb3V0LCBmZl9zYmNkc3BfYW5hbHlzaXNfY29uc3RzX2ZpeGVkNF9zaW1kX2V2ZW4pOworICAgIG91dCArPSBvdXRfc3RyaWRlOworICAgIHMtPnNiY19hbmFseXplXzQoeCArIDQsIG91dCwgZmZfc2JjZHNwX2FuYWx5c2lzX2NvbnN0c19maXhlZDRfc2ltZF9vZGQpOworICAgIG91dCArPSBvdXRfc3RyaWRlOworICAgIHMtPnNiY19hbmFseXplXzQoeCArIDAsIG91dCwgZmZfc2JjZHNwX2FuYWx5c2lzX2NvbnN0c19maXhlZDRfc2ltZF9ldmVuKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNiY19hbmFseXplXzRiXzhzX3NpbWQoU0JDRFNQQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKngsIGludDMyX3QgKm91dCwgaW50IG91dF9zdHJpZGUpCit7CisgICAgLyogQW5hbHl6ZSBibG9ja3MgKi8KKyAgICBzLT5zYmNfYW5hbHl6ZV84KHggKyAyNCwgb3V0LCBmZl9zYmNkc3BfYW5hbHlzaXNfY29uc3RzX2ZpeGVkOF9zaW1kX29kZCk7CisgICAgb3V0ICs9IG91dF9zdHJpZGU7CisgICAgcy0+c2JjX2FuYWx5emVfOCh4ICsgMTYsIG91dCwgZmZfc2JjZHNwX2FuYWx5c2lzX2NvbnN0c19maXhlZDhfc2ltZF9ldmVuKTsKKyAgICBvdXQgKz0gb3V0X3N0cmlkZTsKKyAgICBzLT5zYmNfYW5hbHl6ZV84KHggKyA4LCBvdXQsIGZmX3NiY2RzcF9hbmFseXNpc19jb25zdHNfZml4ZWQ4X3NpbWRfb2RkKTsKKyAgICBvdXQgKz0gb3V0X3N0cmlkZTsKKyAgICBzLT5zYmNfYW5hbHl6ZV84KHggKyAwLCBvdXQsIGZmX3NiY2RzcF9hbmFseXNpc19jb25zdHNfZml4ZWQ4X3NpbWRfZXZlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYmNfYW5hbHl6ZV8xYl84c19zaW1kX2V2ZW4oU0JDRFNQQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqeCwgaW50MzJfdCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X3N0cmlkZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzYmNfYW5hbHl6ZV8xYl84c19zaW1kX29kZChTQkNEU1BDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKngsIGludDMyX3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X3N0cmlkZSkKK3sKKyAgICBzLT5zYmNfYW5hbHl6ZV84KHgsIG91dCwgZmZfc2JjZHNwX2FuYWx5c2lzX2NvbnN0c19maXhlZDhfc2ltZF9vZGQpOworICAgIHMtPnNiY19hbmFseXplXzhzID0gc2JjX2FuYWx5emVfMWJfOHNfc2ltZF9ldmVuOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2JjX2FuYWx5emVfMWJfOHNfc2ltZF9ldmVuKFNCQ0RTUENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKngsIGludDMyX3QgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF9zdHJpZGUpCit7CisgICAgcy0+c2JjX2FuYWx5emVfOCh4LCBvdXQsIGZmX3NiY2RzcF9hbmFseXNpc19jb25zdHNfZml4ZWQ4X3NpbWRfZXZlbik7CisgICAgcy0+c2JjX2FuYWx5emVfOHMgPSBzYmNfYW5hbHl6ZV8xYl84c19zaW1kX29kZDsKK30KKworLyoKKyAqIElucHV0IGRhdGEgcHJvY2Vzc2luZyBmdW5jdGlvbnMuIFRoZSBkYXRhIGlzIGVuZGlhbiBjb252ZXJ0ZWQgaWYgbmVlZGVkLAorICogY2hhbm5lbHMgYXJlIGRlaW50cmxlYXZlZCBhbmQgYXVkaW8gc2FtcGxlcyBhcmUgcmVvcmRlcmVkIGZvciB1c2UgaW4KKyAqIFNJTUQtZnJpZW5kbHkgYW5hbHlzaXMgZmlsdGVyIGZ1bmN0aW9uLiBUaGUgcmVzdWx0cyBhcmUgcHV0IGludG8gIlgiCisgKiBhcnJheSwgZ2V0dGluZyBhcHBlbmRlZCB0byB0aGUgcHJldmlvdXMgZGF0YSAob3IgaXQgaXMgYmV0dGVyIHRvIHNheQorICogcHJlcGVuZGVkLCBhcyB0aGUgYnVmZmVyIGlzIGZpbGxlZCBmcm9tIHRvcCB0byBib3R0b20pLiBPbGQgZGF0YSBpcworICogZGlzY2FyZGVkIHdoZW4gbmVlZGVkZWQsIGJ1dCBhdmFpbGFiaWxpdHkgb2YgKDEwICogbnJvZl9zdWJiYW5kcykKKyAqIGNvbnRpZ3VvdXMgc2FtcGxlcyBpcyBhbHdheXMgZ3VhcmFudGVlZCBmb3IgdGhlIGlucHV0IHRvIHRoZSBhbmFseXNpcworICogZmlsdGVyLiBUaGlzIGlzIGFjaGlldmVkIGJ5IGNvcHlpbmcgYSBzdWZmaWNpZW50IHBhcnQgb2Ygb2xkIGRhdGEKKyAqIHRvIHRoZSB0b3Agb2YgdGhlIGJ1ZmZlciBvbiBidWZmZXIgd3JhcGFyb3VuZC4KKyAqLworCitzdGF0aWMgaW50IHNiY19lbmNfcHJvY2Vzc19pbnB1dF80cyhpbnQgcG9zaXRpb24sIGNvbnN0IHVpbnQ4X3QgKnBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgWFsyXVtTQkNfWF9CVUZGRVJfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnNhbXBsZXMsIGludCBuY2hhbm5lbHMpCit7CisgICAgaW50IGM7CisKKyAgICAvKiBoYW5kbGUgWCBidWZmZXIgd3JhcGFyb3VuZCAqLworICAgIGlmIChwb3NpdGlvbiA8IG5zYW1wbGVzKSB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBuY2hhbm5lbHM7IGMrKykKKyAgICAgICAgICAgIG1lbWNweSgmWFtjXVtTQkNfWF9CVUZGRVJfU0laRSAtIDQwXSwgJlhbY11bcG9zaXRpb25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgcG9zaXRpb24gPSBTQkNfWF9CVUZGRVJfU0laRSAtIDQwOworICAgIH0KKworICAgIC8qIGNvcHkvcGVybXV0YXRlIGF1ZGlvIHNhbXBsZXMgKi8KKyAgICBmb3IgKDsgbnNhbXBsZXMgPj0gODsgbnNhbXBsZXMgLT0gOCwgcGNtICs9IDE2ICogbmNoYW5uZWxzKSB7CisgICAgICAgIHBvc2l0aW9uIC09IDg7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBuY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgaW50MTZfdCAqeCA9ICZYW2NdW3Bvc2l0aW9uXTsKKyAgICAgICAgICAgIHhbMF0gPSBBVl9STjE2KHBjbSArIDE0Km5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzFdID0gQVZfUk4xNihwY20gKyAgNipuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFsyXSA9IEFWX1JOMTYocGNtICsgMTIqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbM10gPSBBVl9STjE2KHBjbSArICA4Km5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzRdID0gQVZfUk4xNihwY20gKyAgMCpuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFs1XSA9IEFWX1JOMTYocGNtICsgIDQqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbNl0gPSBBVl9STjE2KHBjbSArICAyKm5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzddID0gQVZfUk4xNihwY20gKyAxMCpuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBvc2l0aW9uOworfQorCitzdGF0aWMgaW50IHNiY19lbmNfcHJvY2Vzc19pbnB1dF84cyhpbnQgcG9zaXRpb24sIGNvbnN0IHVpbnQ4X3QgKnBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgWFsyXVtTQkNfWF9CVUZGRVJfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnNhbXBsZXMsIGludCBuY2hhbm5lbHMpCit7CisgICAgaW50IGM7CisKKyAgICAvKiBoYW5kbGUgWCBidWZmZXIgd3JhcGFyb3VuZCAqLworICAgIGlmIChwb3NpdGlvbiA8IG5zYW1wbGVzKSB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBuY2hhbm5lbHM7IGMrKykKKyAgICAgICAgICAgIG1lbWNweSgmWFtjXVtTQkNfWF9CVUZGRVJfU0laRSAtIDcyXSwgJlhbY11bcG9zaXRpb25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgcG9zaXRpb24gPSBTQkNfWF9CVUZGRVJfU0laRSAtIDcyOworICAgIH0KKworICAgIGlmIChwb3NpdGlvbiAlIDE2ID09IDgpIHsKKyAgICAgICAgcG9zaXRpb24gLT0gODsKKyAgICAgICAgbnNhbXBsZXMgLT0gODsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IG5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBpbnQxNl90ICp4ID0gJlhbY11bcG9zaXRpb25dOworICAgICAgICAgICAgeFswXSA9IEFWX1JOMTYocGNtICsgMTQqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbMl0gPSBBVl9STjE2KHBjbSArIDEyKm5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzNdID0gQVZfUk4xNihwY20gKyAgMCpuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFs0XSA9IEFWX1JOMTYocGNtICsgMTAqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbNV0gPSBBVl9STjE2KHBjbSArICAyKm5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzZdID0gQVZfUk4xNihwY20gKyAgOCpuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFs3XSA9IEFWX1JOMTYocGNtICsgIDQqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbOF0gPSBBVl9STjE2KHBjbSArICA2Km5jaGFubmVscyArIDIqYyk7CisgICAgICAgIH0KKyAgICAgICAgcGNtICs9IDE2ICogbmNoYW5uZWxzOworICAgIH0KKworICAgIC8qIGNvcHkvcGVybXV0YXRlIGF1ZGlvIHNhbXBsZXMgKi8KKyAgICBmb3IgKDsgbnNhbXBsZXMgPj0gMTY7IG5zYW1wbGVzIC09IDE2LCBwY20gKz0gMzIgKiBuY2hhbm5lbHMpIHsKKyAgICAgICAgcG9zaXRpb24gLT0gMTY7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBuY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgaW50MTZfdCAqeCA9ICZYW2NdW3Bvc2l0aW9uXTsKKyAgICAgICAgICAgIHhbMF0gID0gQVZfUk4xNihwY20gKyAzMCpuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFsxXSAgPSBBVl9STjE2KHBjbSArIDE0Km5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzJdICA9IEFWX1JOMTYocGNtICsgMjgqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbM10gID0gQVZfUk4xNihwY20gKyAxNipuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFs0XSAgPSBBVl9STjE2KHBjbSArIDI2Km5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzVdICA9IEFWX1JOMTYocGNtICsgMTgqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbNl0gID0gQVZfUk4xNihwY20gKyAyNCpuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFs3XSAgPSBBVl9STjE2KHBjbSArIDIwKm5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzhdICA9IEFWX1JOMTYocGNtICsgMjIqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbOV0gID0gQVZfUk4xNihwY20gKyAgNipuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFsxMF0gPSBBVl9STjE2KHBjbSArIDEyKm5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzExXSA9IEFWX1JOMTYocGNtICsgIDAqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbMTJdID0gQVZfUk4xNihwY20gKyAxMCpuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFsxM10gPSBBVl9STjE2KHBjbSArICAyKm5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzE0XSA9IEFWX1JOMTYocGNtICsgIDgqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbMTVdID0gQVZfUk4xNihwY20gKyAgNCpuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5zYW1wbGVzID09IDgpIHsKKyAgICAgICAgcG9zaXRpb24gLT0gODsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IG5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBpbnQxNl90ICp4ID0gJlhbY11bcG9zaXRpb25dOworICAgICAgICAgICAgeFstN10gPSBBVl9STjE2KHBjbSArIDE0Km5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzFdICA9IEFWX1JOMTYocGNtICsgIDYqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbMl0gID0gQVZfUk4xNihwY20gKyAxMipuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFszXSAgPSBBVl9STjE2KHBjbSArICAwKm5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzRdICA9IEFWX1JOMTYocGNtICsgMTAqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgICAgIHhbNV0gID0gQVZfUk4xNihwY20gKyAgMipuY2hhbm5lbHMgKyAyKmMpOworICAgICAgICAgICAgeFs2XSAgPSBBVl9STjE2KHBjbSArICA4Km5jaGFubmVscyArIDIqYyk7CisgICAgICAgICAgICB4WzddICA9IEFWX1JOMTYocGNtICsgIDQqbmNoYW5uZWxzICsgMipjKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwb3NpdGlvbjsKK30KKworc3RhdGljIHZvaWQgc2JjX2NhbGNfc2NhbGVmYWN0b3JzKGludDMyX3Qgc2Jfc2FtcGxlX2ZbMTZdWzJdWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYWxlX2ZhY3RvclsyXVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzLCBpbnQgY2hhbm5lbHMsIGludCBzdWJiYW5kcykKK3sKKyAgICBpbnQgY2gsIHNiLCBibGs7CisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgc3ViYmFuZHM7IHNiKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHggPSAxIDw8IFNDQUxFX09VVF9CSVRTOworICAgICAgICAgICAgZm9yIChibGsgPSAwOyBibGsgPCBibG9ja3M7IGJsaysrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB0bXAgPSBGRkFCUyhzYl9zYW1wbGVfZltibGtdW2NoXVtzYl0pOworICAgICAgICAgICAgICAgIGlmICh0bXAgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeCB8PSB0bXAgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbGVfZmFjdG9yW2NoXVtzYl0gPSAoMzEgLSBTQ0FMRV9PVVRfQklUUykgLSBmZl9jbHooeCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgc2JjX2NhbGNfc2NhbGVmYWN0b3JzX2ooaW50MzJfdCBzYl9zYW1wbGVfZlsxNl1bMl1bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYWxlX2ZhY3RvclsyXVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrcywgaW50IHN1YmJhbmRzKQoreworICAgIGludCBibGssIGpvaW50ID0gMDsKKyAgICBpbnQzMl90IHRtcDAsIHRtcDE7CisgICAgdWludDMyX3QgeCwgeTsKKworICAgIC8qIGxhc3Qgc3ViYmFuZCBkb2VzIG5vdCB1c2Ugam9pbnQgc3RlcmVvICovCisgICAgaW50IHNiID0gc3ViYmFuZHMgLSAxOworICAgIHggPSAxIDw8IFNDQUxFX09VVF9CSVRTOworICAgIHkgPSAxIDw8IFNDQUxFX09VVF9CSVRTOworICAgIGZvciAoYmxrID0gMDsgYmxrIDwgYmxvY2tzOyBibGsrKykgeworICAgICAgICB0bXAwID0gRkZBQlMoc2Jfc2FtcGxlX2ZbYmxrXVswXVtzYl0pOworICAgICAgICB0bXAxID0gRkZBQlMoc2Jfc2FtcGxlX2ZbYmxrXVsxXVtzYl0pOworICAgICAgICBpZiAodG1wMCAhPSAwKQorICAgICAgICAgICAgeCB8PSB0bXAwIC0gMTsKKyAgICAgICAgaWYgKHRtcDEgIT0gMCkKKyAgICAgICAgICAgIHkgfD0gdG1wMSAtIDE7CisgICAgfQorICAgIHNjYWxlX2ZhY3RvclswXVtzYl0gPSAoMzEgLSBTQ0FMRV9PVVRfQklUUykgLSBmZl9jbHooeCk7CisgICAgc2NhbGVfZmFjdG9yWzFdW3NiXSA9ICgzMSAtIFNDQUxFX09VVF9CSVRTKSAtIGZmX2Nseih5KTsKKworICAgIC8qIHRoZSByZXN0IG9mIHN1YmJhbmRzIGNhbiB1c2Ugam9pbnQgc3RlcmVvICovCisgICAgd2hpbGUgKC0tc2IgPj0gMCkgeworICAgICAgICBpbnQzMl90IHNiX3NhbXBsZV9qWzE2XVsyXTsKKyAgICAgICAgeCA9IDEgPDwgU0NBTEVfT1VUX0JJVFM7CisgICAgICAgIHkgPSAxIDw8IFNDQUxFX09VVF9CSVRTOworICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IGJsb2NrczsgYmxrKyspIHsKKyAgICAgICAgICAgIHRtcDAgPSBzYl9zYW1wbGVfZltibGtdWzBdW3NiXTsKKyAgICAgICAgICAgIHRtcDEgPSBzYl9zYW1wbGVfZltibGtdWzFdW3NiXTsKKyAgICAgICAgICAgIHNiX3NhbXBsZV9qW2Jsa11bMF0gPSAodG1wMCA+PiAxKSArICh0bXAxID4+IDEpOworICAgICAgICAgICAgc2Jfc2FtcGxlX2pbYmxrXVsxXSA9ICh0bXAwID4+IDEpIC0gKHRtcDEgPj4gMSk7CisgICAgICAgICAgICB0bXAwID0gRkZBQlModG1wMCk7CisgICAgICAgICAgICB0bXAxID0gRkZBQlModG1wMSk7CisgICAgICAgICAgICBpZiAodG1wMCAhPSAwKQorICAgICAgICAgICAgICAgIHggfD0gdG1wMCAtIDE7CisgICAgICAgICAgICBpZiAodG1wMSAhPSAwKQorICAgICAgICAgICAgICAgIHkgfD0gdG1wMSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgc2NhbGVfZmFjdG9yWzBdW3NiXSA9ICgzMSAtIFNDQUxFX09VVF9CSVRTKSAtCisgICAgICAgICAgICBmZl9jbHooeCk7CisgICAgICAgIHNjYWxlX2ZhY3RvclsxXVtzYl0gPSAoMzEgLSBTQ0FMRV9PVVRfQklUUykgLQorICAgICAgICAgICAgZmZfY2x6KHkpOworICAgICAgICB4ID0gMSA8PCBTQ0FMRV9PVVRfQklUUzsKKyAgICAgICAgeSA9IDEgPDwgU0NBTEVfT1VUX0JJVFM7CisgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgYmxvY2tzOyBibGsrKykgeworICAgICAgICAgICAgdG1wMCA9IEZGQUJTKHNiX3NhbXBsZV9qW2Jsa11bMF0pOworICAgICAgICAgICAgdG1wMSA9IEZGQUJTKHNiX3NhbXBsZV9qW2Jsa11bMV0pOworICAgICAgICAgICAgaWYgKHRtcDAgIT0gMCkKKyAgICAgICAgICAgICAgICB4IHw9IHRtcDAgLSAxOworICAgICAgICAgICAgaWYgKHRtcDEgIT0gMCkKKyAgICAgICAgICAgICAgICB5IHw9IHRtcDEgLSAxOworICAgICAgICB9CisgICAgICAgIHggPSAoMzEgLSBTQ0FMRV9PVVRfQklUUykgLSBmZl9jbHooeCk7CisgICAgICAgIHkgPSAoMzEgLSBTQ0FMRV9PVVRfQklUUykgLSBmZl9jbHooeSk7CisKKyAgICAgICAgLyogZGVjaWRlIHdoZXRoZXIgdG8gdXNlIGpvaW50IHN0ZXJlbyBmb3IgdGhpcyBzdWJiYW5kICovCisgICAgICAgIGlmICgoc2NhbGVfZmFjdG9yWzBdW3NiXSArIHNjYWxlX2ZhY3RvclsxXVtzYl0pID4geCArIHkpIHsKKyAgICAgICAgICAgIGpvaW50IHw9IDEgPDwgKHN1YmJhbmRzIC0gMSAtIHNiKTsKKyAgICAgICAgICAgIHNjYWxlX2ZhY3RvclswXVtzYl0gPSB4OworICAgICAgICAgICAgc2NhbGVfZmFjdG9yWzFdW3NiXSA9IHk7CisgICAgICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IGJsb2NrczsgYmxrKyspIHsKKyAgICAgICAgICAgICAgICBzYl9zYW1wbGVfZltibGtdWzBdW3NiXSA9IHNiX3NhbXBsZV9qW2Jsa11bMF07CisgICAgICAgICAgICAgICAgc2Jfc2FtcGxlX2ZbYmxrXVsxXVtzYl0gPSBzYl9zYW1wbGVfaltibGtdWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogYml0bWFzayB3aXRoIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBzdWJiYW5kcyB1c2luZyBqb2ludCBzdGVyZW8gKi8KKyAgICByZXR1cm4gam9pbnQ7Cit9CisKKy8qCisgKiBEZXRlY3QgQ1BVIGZlYXR1cmVzIGFuZCBzZXR1cCBmdW5jdGlvbiBwb2ludGVycworICovCithdl9jb2xkIHZvaWQgZmZfc2JjZHNwX2luaXQoU0JDRFNQQ29udGV4dCAqcykKK3sKKyAgICAvKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBhbmFseXplIGZ1bmN0aW9ucyAqLworICAgIHMtPnNiY19hbmFseXplXzQgPSBzYmNfYW5hbHl6ZV80X3NpbWQ7CisgICAgcy0+c2JjX2FuYWx5emVfOCA9IHNiY19hbmFseXplXzhfc2ltZDsKKyAgICBzLT5zYmNfYW5hbHl6ZV80cyA9IHNiY19hbmFseXplXzRiXzRzX3NpbWQ7CisgICAgaWYgKHMtPmluY3JlbWVudCA9PSAxKQorICAgICAgICBzLT5zYmNfYW5hbHl6ZV84cyA9IHNiY19hbmFseXplXzFiXzhzX3NpbWRfb2RkOworICAgIGVsc2UKKyAgICAgICAgcy0+c2JjX2FuYWx5emVfOHMgPSBzYmNfYW5hbHl6ZV80Yl84c19zaW1kOworCisgICAgLyogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgaW5wdXQgcmVvcmRlcmluZyAvIGRlaW50ZXJsZWF2aW5nICovCisgICAgcy0+c2JjX2VuY19wcm9jZXNzX2lucHV0XzRzID0gc2JjX2VuY19wcm9jZXNzX2lucHV0XzRzOworICAgIHMtPnNiY19lbmNfcHJvY2Vzc19pbnB1dF84cyA9IHNiY19lbmNfcHJvY2Vzc19pbnB1dF84czsKKworICAgIC8qIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIHNjYWxlIGZhY3RvcnMgY2FsY3VsYXRpb24gKi8KKyAgICBzLT5zYmNfY2FsY19zY2FsZWZhY3RvcnMgPSBzYmNfY2FsY19zY2FsZWZhY3RvcnM7CisgICAgcy0+c2JjX2NhbGNfc2NhbGVmYWN0b3JzX2ogPSBzYmNfY2FsY19zY2FsZWZhY3RvcnNfajsKKworICAgIGlmIChBUkNIX0FSTSkKKyAgICAgICAgZmZfc2JjZHNwX2luaXRfYXJtKHMpOworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfc2JjZHNwX2luaXRfeDg2KHMpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zYmNkc3AuaCBiL2xpYmF2Y29kZWMvc2JjZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0YzA1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvc2JjZHNwLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIEJsdWV0b290aCBsb3ctY29tcGxleGl0eSwgc3ViYmFuZCBjb2RlYyAoU0JDKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIEhlbnJ5ayBQbG9ldHogPGhlbnJ5a0BwbG9ldHpsaS5jaD4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2ICBCcmFkIE1pZGdsZXkgPGJtaWRnbGV5QHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0JDIGJhc2ljICJidWlsZGluZyBicmlja3MiCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NCQ0RTUF9ICisjZGVmaW5lIEFWQ09ERUNfU0JDRFNQX0gKKworI2luY2x1ZGUgInNiYy5oIgorI2luY2x1ZGUgInNiY2RzcF9kYXRhLmgiCisKKyNkZWZpbmUgU0NBTEVfT1VUX0JJVFMgMTUKKyNkZWZpbmUgU0JDX1hfQlVGRkVSX1NJWkUgMzI4CisKK3R5cGVkZWYgc3RydWN0IHNiY19kc3BfY29udGV4dCBTQkNEU1BDb250ZXh0OworCitzdHJ1Y3Qgc2JjX2RzcF9jb250ZXh0IHsKKyAgICBpbnQgcG9zaXRpb247CisgICAgLyogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJsb2NrcyBoYW5kbGVkIGJ5IHRoZSBlbmNvZGVyICovCisgICAgdWludDhfdCBpbmNyZW1lbnQ7CisgICAgREVDTEFSRV9BTElHTkVEKFNCQ19BTElHTiwgaW50MTZfdCwgWClbMl1bU0JDX1hfQlVGRkVSX1NJWkVdOworICAgIHZvaWQgKCpzYmNfYW5hbHl6ZV80KShjb25zdCBpbnQxNl90ICppbiwgaW50MzJfdCAqb3V0LCBjb25zdCBpbnQxNl90ICpjb25zdHMpOworICAgIHZvaWQgKCpzYmNfYW5hbHl6ZV84KShjb25zdCBpbnQxNl90ICppbiwgaW50MzJfdCAqb3V0LCBjb25zdCBpbnQxNl90ICpjb25zdHMpOworICAgIC8qIFBvbHlwaGFzZSBhbmFseXNpcyBmaWx0ZXIgZm9yIDQgc3ViYmFuZHMgY29uZmlndXJhdGlvbiwKKyAgICAgKiBpdCBoYW5kbGVzICJpbmNyZW1lbnQiIGJsb2NrcyBhdCBvbmNlICovCisgICAgdm9pZCAoKnNiY19hbmFseXplXzRzKShTQkNEU1BDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqeCwgaW50MzJfdCAqb3V0LCBpbnQgb3V0X3N0cmlkZSk7CisgICAgLyogUG9seXBoYXNlIGFuYWx5c2lzIGZpbHRlciBmb3IgOCBzdWJiYW5kcyBjb25maWd1cmF0aW9uLAorICAgICAqIGl0IGhhbmRsZXMgImluY3JlbWVudCIgYmxvY2tzIGF0IG9uY2UgKi8KKyAgICB2b2lkICgqc2JjX2FuYWx5emVfOHMpKFNCQ0RTUENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICp4LCBpbnQzMl90ICpvdXQsIGludCBvdXRfc3RyaWRlKTsKKyAgICAvKiBQcm9jZXNzIGlucHV0IGRhdGEgKGRlaW50ZXJsZWF2ZSwgZW5kaWFuIGNvbnZlcnNpb24sIHJlb3JkZXJpbmcpLAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHN1YmJhbmRzIGFuZCBpbnB1dCBkYXRhIGJ5dGUgb3JkZXIgKi8KKyAgICBpbnQgKCpzYmNfZW5jX3Byb2Nlc3NfaW5wdXRfNHMpKGludCBwb3NpdGlvbiwgY29uc3QgdWludDhfdCAqcGNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBYWzJdW1NCQ19YX0JVRkZFUl9TSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuc2FtcGxlcywgaW50IG5jaGFubmVscyk7CisgICAgaW50ICgqc2JjX2VuY19wcm9jZXNzX2lucHV0XzhzKShpbnQgcG9zaXRpb24sIGNvbnN0IHVpbnQ4X3QgKnBjbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgWFsyXVtTQkNfWF9CVUZGRVJfU0laRV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnNhbXBsZXMsIGludCBuY2hhbm5lbHMpOworICAgIC8qIFNjYWxlIGZhY3RvcnMgY2FsY3VsYXRpb24gKi8KKyAgICB2b2lkICgqc2JjX2NhbGNfc2NhbGVmYWN0b3JzKShpbnQzMl90IHNiX3NhbXBsZV9mWzE2XVsyXVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzY2FsZV9mYWN0b3JbMl1bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrcywgaW50IGNoYW5uZWxzLCBpbnQgc3ViYmFuZHMpOworICAgIC8qIFNjYWxlIGZhY3RvcnMgY2FsY3VsYXRpb24gd2l0aCBqb2ludCBzdGVyZW8gc3VwcG9ydCAqLworICAgIGludCAoKnNiY19jYWxjX3NjYWxlZmFjdG9yc19qKShpbnQzMl90IHNiX3NhbXBsZV9mWzE2XVsyXVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2NhbGVfZmFjdG9yWzJdWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzLCBpbnQgc3ViYmFuZHMpOworfTsKKworLyoKKyAqIEluaXRpYWxpemUgcG9pbnRlcnMgdG8gdGhlIGZ1bmN0aW9ucyB3aGljaCBhcmUgdGhlIGJhc2ljICJidWlsZGluZyBicmlja3MiCisgKiBvZiBTQkMgY29kZWMuIEJlc3QgaW1wbGVtZW50YXRpb24gaXMgc2VsZWN0ZWQgYmFzZWQgb24gdGFyZ2V0IENQVQorICogY2FwYWJpbGl0aWVzLgorICovCit2b2lkIGZmX3NiY2RzcF9pbml0KFNCQ0RTUENvbnRleHQgKnMpOworCit2b2lkIGZmX3NiY2RzcF9pbml0X2FybShTQkNEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfc2JjZHNwX2luaXRfeDg2KFNCQ0RTUENvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZDT0RFQ19TQkNEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zYmNkc3BfZGF0YS5jIGIvbGliYXZjb2RlYy9zYmNkc3BfZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YzA3YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3NiY2RzcF9kYXRhLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBCbHVldG9vdGggbG93LWNvbXBsZXhpdHksIHN1YmJhbmQgY29kZWMgKFNCQykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwICBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBIZW5yeWsgUGxvZXR6IDxoZW5yeWtAcGxvZXR6bGkuY2g+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiAgQnJhZCBNaWRnbGV5IDxibWlkZ2xleUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG1pc2NlbGxhbmVvdXMgU0JDIHRhYmxlcworICovCisKKyNpbmNsdWRlICJzYmNkc3BfZGF0YS5oIgorCisjZGVmaW5lIEZfUFJPVE8oeCkgKChpbnQzMl90KSAoKCh4KSAqIDIpICogKChpbnQzMl90KSAxIDw8IDE1KSArIDAuNSkpCisjZGVmaW5lIEZfQ09TKHgpICAgKChpbnQzMl90KSAoKCh4KSAgICApICogKChpbnQzMl90KSAxIDw8IDE1KSArIDAuNSkpCisKKy8qCisgKiBDb25zdGFudCB0YWJsZXMgZm9yIHRoZSB1c2UgaW4gU0lNRCBvcHRpbWl6ZWQgYW5hbHlzaXMgZmlsdGVycworICogRWFjaCB0YWJsZSBjb25zaXN0cyBvZiB0d28gcGFydHM6CisgKiAxLiByZW9yZGVyZWQgInByb3RvIiB0YWJsZQorICogMi4gcmVvcmRlcmVkICJjb3MiIHRhYmxlCisgKgorICogRHVlIHRvIG5vbi1zeW1tZXRyaWNhbCByZW9yZGVyaW5nLCBzZXBhcmF0ZSB0YWJsZXMgZm9yICJldmVuIgorICogYW5kICJvZGQiIGNhc2VzIGFyZSBuZWVkZWQKKyAqLworCitERUNMQVJFX0FMSUdORUQoU0JDX0FMSUdOLCBjb25zdCBpbnQxNl90LCBmZl9zYmNkc3BfYW5hbHlzaXNfY29uc3RzX2ZpeGVkNF9zaW1kX2V2ZW4pWzQwICsgMTZdID0geworI2RlZmluZSBDMCAxLjA5MzI1Njg5OTMKKyNkZWZpbmUgQzEgMS4zMDU2ODc1NTgwCisjZGVmaW5lIEMyIDEuMzA1Njg3NTU4MAorI2RlZmluZSBDMyAxLjY3NzIyODA4NTYKKworI2RlZmluZSBGKHgpIEZfUFJPVE8oeCkKKyAgICAgRigwLjAwMDAwMDAwRSswMCAqIEMwKSwgIEYoMy44MzcyMDE5M0UtMDMgKiBDMCksCisgICAgIEYoNS4zNjU0ODk3NkUtMDQgKiBDMSksICBGKDIuNzMzNzA5MDRFLTAzICogQzEpLAorICAgICBGKDMuMDYwMTIyODZFLTAzICogQzIpLCAgRigzLjg5MjA1MTQ5RS0wMyAqIEMyKSwKKyAgICAgRigwLjAwMDAwMDAwRSswMCAqIEMzKSwgLUYoMS40OTE4ODM1N0UtMDMgKiBDMyksCisgICAgIEYoMS4wOTEzNzYyMEUtMDIgKiBDMCksICBGKDIuNTg3Njc4MTFFLTAyICogQzApLAorICAgICBGKDIuMDQzODUwODdFLTAyICogQzEpLCAgRigzLjIxOTM5MjkwRS0wMiAqIEMxKSwKKyAgICAgRig3Ljc2NDYzNDk0RS0wMiAqIEMyKSwgIEYoNi4xMzI0NTE4NkUtMDMgKiBDMiksCisgICAgIEYoMC4wMDAwMDAwMEUrMDAgKiBDMyksIC1GKDIuODg3NTczOTJFLTAyICogQzMpLAorICAgICBGKDEuMzU1OTMyNzRFLTAxICogQzApLCAgRigyLjk0MzE1MzMyRS0wMSAqIEMwKSwKKyAgICAgRigxLjk0OTg3ODQxRS0wMSAqIEMxKSwgIEYoMi44MTgyODIwM0UtMDEgKiBDMSksCisgICAgLUYoMS45NDk4Nzg0MUUtMDEgKiBDMiksICBGKDIuODE4MjgyMDNFLTAxICogQzIpLAorICAgICBGKDAuMDAwMDAwMDBFKzAwICogQzMpLCAtRigyLjQ2NjM2NjYyRS0wMSAqIEMzKSwKKyAgICAtRigxLjM1NTkzMjc0RS0wMSAqIEMwKSwgIEYoMi41ODc2NzgxMUUtMDIgKiBDMCksCisgICAgLUYoNy43NjQ2MzQ5NEUtMDIgKiBDMSksICBGKDYuMTMyNDUxODZFLTAzICogQzEpLAorICAgIC1GKDIuMDQzODUwODdFLTAyICogQzIpLCAgRigzLjIxOTM5MjkwRS0wMiAqIEMyKSwKKyAgICAgRigwLjAwMDAwMDAwRSswMCAqIEMzKSwgIEYoMi44ODIxNzI3NEUtMDIgKiBDMyksCisgICAgLUYoMS4wOTEzNzYyMEUtMDIgKiBDMCksICBGKDMuODM3MjAxOTNFLTAzICogQzApLAorICAgIC1GKDMuMDYwMTIyODZFLTAzICogQzEpLCAgRigzLjg5MjA1MTQ5RS0wMyAqIEMxKSwKKyAgICAtRig1LjM2NTQ4OTc2RS0wNCAqIEMyKSwgIEYoMi43MzM3MDkwNEUtMDMgKiBDMiksCisgICAgIEYoMC4wMDAwMDAwMEUrMDAgKiBDMyksIC1GKDEuODY1ODE2OTFFLTAzICogQzMpLAorI3VuZGVmIEYKKyNkZWZpbmUgRih4KSBGX0NPUyh4KQorICAgICBGKDAuNzA3MTA2NzgxMiAvIEMwKSwgIEYoMC45MjM4Nzk1MzI1IC8gQzEpLAorICAgIC1GKDAuNzA3MTA2NzgxMiAvIEMwKSwgIEYoMC4zODI2ODM0MzI0IC8gQzEpLAorICAgIC1GKDAuNzA3MTA2NzgxMiAvIEMwKSwgLUYoMC4zODI2ODM0MzI0IC8gQzEpLAorICAgICBGKDAuNzA3MTA2NzgxMiAvIEMwKSwgLUYoMC45MjM4Nzk1MzI1IC8gQzEpLAorICAgICBGKDAuMzgyNjgzNDMyNCAvIEMyKSwgLUYoMS4wMDAwMDAwMDAwIC8gQzMpLAorICAgIC1GKDAuOTIzODc5NTMyNSAvIEMyKSwgLUYoMS4wMDAwMDAwMDAwIC8gQzMpLAorICAgICBGKDAuOTIzODc5NTMyNSAvIEMyKSwgLUYoMS4wMDAwMDAwMDAwIC8gQzMpLAorICAgIC1GKDAuMzgyNjgzNDMyNCAvIEMyKSwgLUYoMS4wMDAwMDAwMDAwIC8gQzMpLAorI3VuZGVmIEYKKworI3VuZGVmIEMwCisjdW5kZWYgQzEKKyN1bmRlZiBDMgorI3VuZGVmIEMzCit9OworCitERUNMQVJFX0FMSUdORUQoU0JDX0FMSUdOLCBjb25zdCBpbnQxNl90LCBmZl9zYmNkc3BfYW5hbHlzaXNfY29uc3RzX2ZpeGVkNF9zaW1kX29kZClbNDAgKyAxNl0gPSB7CisjZGVmaW5lIEMwIDEuMzA1Njg3NTU4MAorI2RlZmluZSBDMSAxLjY3NzIyODA4NTYKKyNkZWZpbmUgQzIgMS4wOTMyNTY4OTkzCisjZGVmaW5lIEMzIDEuMzA1Njg3NTU4MAorCisjZGVmaW5lIEYoeCkgRl9QUk9UTyh4KQorICAgICBGKDIuNzMzNzA5MDRFLTAzICogQzApLCAgRig1LjM2NTQ4OTc2RS0wNCAqIEMwKSwKKyAgICAtRigxLjQ5MTg4MzU3RS0wMyAqIEMxKSwgIEYoMC4wMDAwMDAwMEUrMDAgKiBDMSksCisgICAgIEYoMy44MzcyMDE5M0UtMDMgKiBDMiksICBGKDEuMDkxMzc2MjBFLTAyICogQzIpLAorICAgICBGKDMuODkyMDUxNDlFLTAzICogQzMpLCAgRigzLjA2MDEyMjg2RS0wMyAqIEMzKSwKKyAgICAgRigzLjIxOTM5MjkwRS0wMiAqIEMwKSwgIEYoMi4wNDM4NTA4N0UtMDIgKiBDMCksCisgICAgLUYoMi44ODc1NzM5MkUtMDIgKiBDMSksICBGKDAuMDAwMDAwMDBFKzAwICogQzEpLAorICAgICBGKDIuNTg3Njc4MTFFLTAyICogQzIpLCAgRigxLjM1NTkzMjc0RS0wMSAqIEMyKSwKKyAgICAgRig2LjEzMjQ1MTg2RS0wMyAqIEMzKSwgIEYoNy43NjQ2MzQ5NEUtMDIgKiBDMyksCisgICAgIEYoMi44MTgyODIwM0UtMDEgKiBDMCksICBGKDEuOTQ5ODc4NDFFLTAxICogQzApLAorICAgIC1GKDIuNDY2MzY2NjJFLTAxICogQzEpLCAgRigwLjAwMDAwMDAwRSswMCAqIEMxKSwKKyAgICAgRigyLjk0MzE1MzMyRS0wMSAqIEMyKSwgLUYoMS4zNTU5MzI3NEUtMDEgKiBDMiksCisgICAgIEYoMi44MTgyODIwM0UtMDEgKiBDMyksIC1GKDEuOTQ5ODc4NDFFLTAxICogQzMpLAorICAgICBGKDYuMTMyNDUxODZFLTAzICogQzApLCAtRig3Ljc2NDYzNDk0RS0wMiAqIEMwKSwKKyAgICAgRigyLjg4MjE3Mjc0RS0wMiAqIEMxKSwgIEYoMC4wMDAwMDAwMEUrMDAgKiBDMSksCisgICAgIEYoMi41ODc2NzgxMUUtMDIgKiBDMiksIC1GKDEuMDkxMzc2MjBFLTAyICogQzIpLAorICAgICBGKDMuMjE5MzkyOTBFLTAyICogQzMpLCAtRigyLjA0Mzg1MDg3RS0wMiAqIEMzKSwKKyAgICAgRigzLjg5MjA1MTQ5RS0wMyAqIEMwKSwgLUYoMy4wNjAxMjI4NkUtMDMgKiBDMCksCisgICAgLUYoMS44NjU4MTY5MUUtMDMgKiBDMSksICBGKDAuMDAwMDAwMDBFKzAwICogQzEpLAorICAgICBGKDMuODM3MjAxOTNFLTAzICogQzIpLCAgRigwLjAwMDAwMDAwRSswMCAqIEMyKSwKKyAgICAgRigyLjczMzcwOTA0RS0wMyAqIEMzKSwgLUYoNS4zNjU0ODk3NkUtMDQgKiBDMyksCisjdW5kZWYgRgorI2RlZmluZSBGKHgpIEZfQ09TKHgpCisgICAgIEYoMC45MjM4Nzk1MzI1IC8gQzApLCAtRigxLjAwMDAwMDAwMDAgLyBDMSksCisgICAgIEYoMC4zODI2ODM0MzI0IC8gQzApLCAtRigxLjAwMDAwMDAwMDAgLyBDMSksCisgICAgLUYoMC4zODI2ODM0MzI0IC8gQzApLCAtRigxLjAwMDAwMDAwMDAgLyBDMSksCisgICAgLUYoMC45MjM4Nzk1MzI1IC8gQzApLCAtRigxLjAwMDAwMDAwMDAgLyBDMSksCisgICAgIEYoMC43MDcxMDY3ODEyIC8gQzIpLCAgRigwLjM4MjY4MzQzMjQgLyBDMyksCisgICAgLUYoMC43MDcxMDY3ODEyIC8gQzIpLCAtRigwLjkyMzg3OTUzMjUgLyBDMyksCisgICAgLUYoMC43MDcxMDY3ODEyIC8gQzIpLCAgRigwLjkyMzg3OTUzMjUgLyBDMyksCisgICAgIEYoMC43MDcxMDY3ODEyIC8gQzIpLCAtRigwLjM4MjY4MzQzMjQgLyBDMyksCisjdW5kZWYgRgorCisjdW5kZWYgQzAKKyN1bmRlZiBDMQorI3VuZGVmIEMyCisjdW5kZWYgQzMKK307CisKK0RFQ0xBUkVfQUxJR05FRChTQkNfQUxJR04sIGNvbnN0IGludDE2X3QsIGZmX3NiY2RzcF9hbmFseXNpc19jb25zdHNfZml4ZWQ4X3NpbWRfZXZlbilbODAgKyA2NF0gPSB7CisjZGVmaW5lIEMwIDIuNzkwNjE0ODg5NAorI2RlZmluZSBDMSAyLjQyNzAwNDQyODAKKyNkZWZpbmUgQzIgMi44MDE1NjE2MDI0CisjZGVmaW5lIEMzIDMuMTcxMDM2Mzc0MQorI2RlZmluZSBDNCAyLjUzNzc5NDQwNDMKKyNkZWZpbmUgQzUgMi40MjcwMDQ0MjgwCisjZGVmaW5lIEM2IDIuODAxNTYxNjAyNAorI2RlZmluZSBDNyAzLjE3MTAzNjM3NDEKKworI2RlZmluZSBGKHgpIEZfUFJPVE8oeCkKKyAgICAgRigwLjAwMDAwMDAwRSswMCAqIEMwKSwgIEYoMi4wMTE4MjU0MkUtMDMgKiBDMCksCisgICAgIEYoMS41NjU3NTM5OEUtMDQgKiBDMSksICBGKDEuNzgzNzE3MjVFLTAzICogQzEpLAorICAgICBGKDMuNDMyNTY0MjVFLTA0ICogQzIpLCAgRigxLjQ3NjQwMTY5RS0wMyAqIEMyKSwKKyAgICAgRig1LjU0NjIwMjAyRS0wNCAqIEMzKSwgIEYoMS4xMzk5MjUwN0UtMDMgKiBDMyksCisgICAgLUYoOC4yMzkxOTUwNkUtMDQgKiBDNCksICBGKDAuMDAwMDAwMDBFKzAwICogQzQpLAorICAgICBGKDIuMTAzNzE5ODlFLTAzICogQzUpLCAgRigzLjQ5NzE3NDU0RS0wMyAqIEM1KSwKKyAgICAgRigxLjk5NDU0NTU0RS0wMyAqIEM2KSwgIEYoMS42NDk3MzA5OEUtMDMgKiBDNiksCisgICAgIEYoMS42MTY1NjI4M0UtMDMgKiBDNyksICBGKDEuNzg4MDUzNjFFLTA0ICogQzcpLAorICAgICBGKDUuNjU5NDk0NzNFLTAzICogQzApLCAgRigxLjI5MzcxODA2RS0wMiAqIEMwKSwKKyAgICAgRig4LjAyOTQxMTYzRS0wMyAqIEMxKSwgIEYoMS41MzE4NDEwNkUtMDIgKiBDMSksCisgICAgIEYoMS4wNDU4NDQ0M0UtMDIgKiBDMiksICBGKDEuNjIyMDg0NzFFLTAyICogQzIpLAorICAgICBGKDEuMjc0NzIzMzVFLTAyICogQzMpLCAgRigxLjU5MDQ1NjAzRS0wMiAqIEMzKSwKKyAgICAtRigxLjQ2NTI1MjYzRS0wMiAqIEM0KSwgIEYoMC4wMDAwMDAwMEUrMDAgKiBDNCksCisgICAgIEYoOC44NTc1NzU0MEUtMDMgKiBDNSksICBGKDUuMzE4NzMwMzJFLTAyICogQzUpLAorICAgICBGKDIuOTI0MDg0NDJFLTAzICogQzYpLCAgRigzLjkwNzUxMzgxRS0wMiAqIEM2KSwKKyAgICAtRig0LjkxNTc4MDI0RS0wMyAqIEM3KSwgIEYoMi42MTA5ODc1MkUtMDIgKiBDNyksCisgICAgIEYoNi43OTk4OTQzMUUtMDIgKiBDMCksICBGKDEuNDY5NTUwNjhFLTAxICogQzApLAorICAgICBGKDguMjk4NDc1NzhFLTAyICogQzEpLCAgRigxLjQ1Mzg5ODQ3RS0wMSAqIEMxKSwKKyAgICAgRig5Ljc1NzUzOTE4RS0wMiAqIEMyKSwgIEYoMS40MDc1MzUwNUUtMDEgKiBDMiksCisgICAgIEYoMS4xMTE5NjY4OUUtMDEgKiBDMyksICBGKDEuMzMyNjQ0MTVFLTAxICogQzMpLAorICAgIC1GKDEuMjMyNjQ1NDhFLTAxICogQzQpLCAgRigwLjAwMDAwMDAwRSswMCAqIEM0KSwKKyAgICAgRigxLjQ1Mzg5ODQ3RS0wMSAqIEM1KSwgLUYoOC4yOTg0NzU3OEUtMDIgKiBDNSksCisgICAgIEYoMS40MDc1MzUwNUUtMDEgKiBDNiksIC1GKDkuNzU3NTM5MThFLTAyICogQzYpLAorICAgICBGKDEuMzMyNjQ0MTVFLTAxICogQzcpLCAtRigxLjExMTk2Njg5RS0wMSAqIEM3KSwKKyAgICAtRig2Ljc5OTg5NDMxRS0wMiAqIEMwKSwgIEYoMS4yOTM3MTgwNkUtMDIgKiBDMCksCisgICAgLUYoNS4zMTg3MzAzMkUtMDIgKiBDMSksICBGKDguODU3NTc1NDBFLTAzICogQzEpLAorICAgIC1GKDMuOTA3NTEzODFFLTAyICogQzIpLCAgRigyLjkyNDA4NDQyRS0wMyAqIEMyKSwKKyAgICAtRigyLjYxMDk4NzUyRS0wMiAqIEMzKSwgLUYoNC45MTU3ODAyNEUtMDMgKiBDMyksCisgICAgIEYoMS40NjQwNDA3NkUtMDIgKiBDNCksICBGKDAuMDAwMDAwMDBFKzAwICogQzQpLAorICAgICBGKDEuNTMxODQxMDZFLTAyICogQzUpLCAtRig4LjAyOTQxMTYzRS0wMyAqIEM1KSwKKyAgICAgRigxLjYyMjA4NDcxRS0wMiAqIEM2KSwgLUYoMS4wNDU4NDQ0M0UtMDIgKiBDNiksCisgICAgIEYoMS41OTA0NTYwM0UtMDIgKiBDNyksIC1GKDEuMjc0NzIzMzVFLTAyICogQzcpLAorICAgIC1GKDUuNjU5NDk0NzNFLTAzICogQzApLCAgRigyLjAxMTgyNTQyRS0wMyAqIEMwKSwKKyAgICAtRigzLjQ5NzE3NDU0RS0wMyAqIEMxKSwgIEYoMi4xMDM3MTk4OUUtMDMgKiBDMSksCisgICAgLUYoMS42NDk3MzA5OEUtMDMgKiBDMiksICBGKDEuOTk0NTQ1NTRFLTAzICogQzIpLAorICAgIC1GKDEuNzg4MDUzNjFFLTA0ICogQzMpLCAgRigxLjYxNjU2MjgzRS0wMyAqIEMzKSwKKyAgICAtRig5LjAyMTU0NTAyRS0wNCAqIEM0KSwgIEYoMC4wMDAwMDAwMEUrMDAgKiBDNCksCisgICAgIEYoMS43ODM3MTcyNUUtMDMgKiBDNSksIC1GKDEuNTY1NzUzOThFLTA0ICogQzUpLAorICAgICBGKDEuNDc2NDAxNjlFLTAzICogQzYpLCAtRigzLjQzMjU2NDI1RS0wNCAqIEM2KSwKKyAgICAgRigxLjEzOTkyNTA3RS0wMyAqIEM3KSwgLUYoNS41NDYyMDIwMkUtMDQgKiBDNyksCisjdW5kZWYgRgorI2RlZmluZSBGKHgpIEZfQ09TKHgpCisgICAgIEYoMC43MDcxMDY3ODEyIC8gQzApLCAgRigwLjgzMTQ2OTYxMjMgLyBDMSksCisgICAgLUYoMC43MDcxMDY3ODEyIC8gQzApLCAtRigwLjE5NTA5MDMyMjAgLyBDMSksCisgICAgLUYoMC43MDcxMDY3ODEyIC8gQzApLCAtRigwLjk4MDc4NTI4MDQgLyBDMSksCisgICAgIEYoMC43MDcxMDY3ODEyIC8gQzApLCAtRigwLjU1NTU3MDIzMzAgLyBDMSksCisgICAgIEYoMC43MDcxMDY3ODEyIC8gQzApLCAgRigwLjU1NTU3MDIzMzAgLyBDMSksCisgICAgLUYoMC43MDcxMDY3ODEyIC8gQzApLCAgRigwLjk4MDc4NTI4MDQgLyBDMSksCisgICAgLUYoMC43MDcxMDY3ODEyIC8gQzApLCAgRigwLjE5NTA5MDMyMjAgLyBDMSksCisgICAgIEYoMC43MDcxMDY3ODEyIC8gQzApLCAtRigwLjgzMTQ2OTYxMjMgLyBDMSksCisgICAgIEYoMC45MjM4Nzk1MzI1IC8gQzIpLCAgRigwLjk4MDc4NTI4MDQgLyBDMyksCisgICAgIEYoMC4zODI2ODM0MzI0IC8gQzIpLCAgRigwLjgzMTQ2OTYxMjMgLyBDMyksCisgICAgLUYoMC4zODI2ODM0MzI0IC8gQzIpLCAgRigwLjU1NTU3MDIzMzAgLyBDMyksCisgICAgLUYoMC45MjM4Nzk1MzI1IC8gQzIpLCAgRigwLjE5NTA5MDMyMjAgLyBDMyksCisgICAgLUYoMC45MjM4Nzk1MzI1IC8gQzIpLCAtRigwLjE5NTA5MDMyMjAgLyBDMyksCisgICAgLUYoMC4zODI2ODM0MzI0IC8gQzIpLCAtRigwLjU1NTU3MDIzMzAgLyBDMyksCisgICAgIEYoMC4zODI2ODM0MzI0IC8gQzIpLCAtRigwLjgzMTQ2OTYxMjMgLyBDMyksCisgICAgIEYoMC45MjM4Nzk1MzI1IC8gQzIpLCAtRigwLjk4MDc4NTI4MDQgLyBDMyksCisgICAgLUYoMS4wMDAwMDAwMDAwIC8gQzQpLCAgRigwLjU1NTU3MDIzMzAgLyBDNSksCisgICAgLUYoMS4wMDAwMDAwMDAwIC8gQzQpLCAtRigwLjk4MDc4NTI4MDQgLyBDNSksCisgICAgLUYoMS4wMDAwMDAwMDAwIC8gQzQpLCAgRigwLjE5NTA5MDMyMjAgLyBDNSksCisgICAgLUYoMS4wMDAwMDAwMDAwIC8gQzQpLCAgRigwLjgzMTQ2OTYxMjMgLyBDNSksCisgICAgLUYoMS4wMDAwMDAwMDAwIC8gQzQpLCAtRigwLjgzMTQ2OTYxMjMgLyBDNSksCisgICAgLUYoMS4wMDAwMDAwMDAwIC8gQzQpLCAtRigwLjE5NTA5MDMyMjAgLyBDNSksCisgICAgLUYoMS4wMDAwMDAwMDAwIC8gQzQpLCAgRigwLjk4MDc4NTI4MDQgLyBDNSksCisgICAgLUYoMS4wMDAwMDAwMDAwIC8gQzQpLCAtRigwLjU1NTU3MDIzMzAgLyBDNSksCisgICAgIEYoMC4zODI2ODM0MzI0IC8gQzYpLCAgRigwLjE5NTA5MDMyMjAgLyBDNyksCisgICAgLUYoMC45MjM4Nzk1MzI1IC8gQzYpLCAtRigwLjU1NTU3MDIzMzAgLyBDNyksCisgICAgIEYoMC45MjM4Nzk1MzI1IC8gQzYpLCAgRigwLjgzMTQ2OTYxMjMgLyBDNyksCisgICAgLUYoMC4zODI2ODM0MzI0IC8gQzYpLCAtRigwLjk4MDc4NTI4MDQgLyBDNyksCisgICAgLUYoMC4zODI2ODM0MzI0IC8gQzYpLCAgRigwLjk4MDc4NTI4MDQgLyBDNyksCisgICAgIEYoMC45MjM4Nzk1MzI1IC8gQzYpLCAtRigwLjgzMTQ2OTYxMjMgLyBDNyksCisgICAgLUYoMC45MjM4Nzk1MzI1IC8gQzYpLCAgRigwLjU1NTU3MDIzMzAgLyBDNyksCisgICAgIEYoMC4zODI2ODM0MzI0IC8gQzYpLCAtRigwLjE5NTA5MDMyMjAgLyBDNyksCisjdW5kZWYgRgorCisjdW5kZWYgQzAKKyN1bmRlZiBDMQorI3VuZGVmIEMyCisjdW5kZWYgQzMKKyN1bmRlZiBDNAorI3VuZGVmIEM1CisjdW5kZWYgQzYKKyN1bmRlZiBDNworfTsKKworREVDTEFSRV9BTElHTkVEKFNCQ19BTElHTiwgY29uc3QgaW50MTZfdCwgZmZfc2JjZHNwX2FuYWx5c2lzX2NvbnN0c19maXhlZDhfc2ltZF9vZGQpWzgwICsgNjRdID0geworI2RlZmluZSBDMCAyLjUzNzc5NDQwNDMKKyNkZWZpbmUgQzEgMi40MjcwMDQ0MjgwCisjZGVmaW5lIEMyIDIuODAxNTYxNjAyNAorI2RlZmluZSBDMyAzLjE3MTAzNjM3NDEKKyNkZWZpbmUgQzQgMi43OTA2MTQ4ODk0CisjZGVmaW5lIEM1IDIuNDI3MDA0NDI4MAorI2RlZmluZSBDNiAyLjgwMTU2MTYwMjQKKyNkZWZpbmUgQzcgMy4xNzEwMzYzNzQxCisKKyNkZWZpbmUgRih4KSBGX1BST1RPKHgpCisgICAgIEYoMC4wMDAwMDAwMEUrMDAgKiBDMCksIC1GKDguMjM5MTk1MDZFLTA0ICogQzApLAorICAgICBGKDEuNTY1NzUzOThFLTA0ICogQzEpLCAgRigxLjc4MzcxNzI1RS0wMyAqIEMxKSwKKyAgICAgRigzLjQzMjU2NDI1RS0wNCAqIEMyKSwgIEYoMS40NzY0MDE2OUUtMDMgKiBDMiksCisgICAgIEYoNS41NDYyMDIwMkUtMDQgKiBDMyksICBGKDEuMTM5OTI1MDdFLTAzICogQzMpLAorICAgICBGKDIuMDExODI1NDJFLTAzICogQzQpLCAgRig1LjY1OTQ5NDczRS0wMyAqIEM0KSwKKyAgICAgRigyLjEwMzcxOTg5RS0wMyAqIEM1KSwgIEYoMy40OTcxNzQ1NEUtMDMgKiBDNSksCisgICAgIEYoMS45OTQ1NDU1NEUtMDMgKiBDNiksICBGKDEuNjQ5NzMwOThFLTAzICogQzYpLAorICAgICBGKDEuNjE2NTYyODNFLTAzICogQzcpLCAgRigxLjc4ODA1MzYxRS0wNCAqIEM3KSwKKyAgICAgRigwLjAwMDAwMDAwRSswMCAqIEMwKSwgLUYoMS40NjUyNTI2M0UtMDIgKiBDMCksCisgICAgIEYoOC4wMjk0MTE2M0UtMDMgKiBDMSksICBGKDEuNTMxODQxMDZFLTAyICogQzEpLAorICAgICBGKDEuMDQ1ODQ0NDNFLTAyICogQzIpLCAgRigxLjYyMjA4NDcxRS0wMiAqIEMyKSwKKyAgICAgRigxLjI3NDcyMzM1RS0wMiAqIEMzKSwgIEYoMS41OTA0NTYwM0UtMDIgKiBDMyksCisgICAgIEYoMS4yOTM3MTgwNkUtMDIgKiBDNCksICBGKDYuNzk5ODk0MzFFLTAyICogQzQpLAorICAgICBGKDguODU3NTc1NDBFLTAzICogQzUpLCAgRig1LjMxODczMDMyRS0wMiAqIEM1KSwKKyAgICAgRigyLjkyNDA4NDQyRS0wMyAqIEM2KSwgIEYoMy45MDc1MTM4MUUtMDIgKiBDNiksCisgICAgLUYoNC45MTU3ODAyNEUtMDMgKiBDNyksICBGKDIuNjEwOTg3NTJFLTAyICogQzcpLAorICAgICBGKDAuMDAwMDAwMDBFKzAwICogQzApLCAtRigxLjIzMjY0NTQ4RS0wMSAqIEMwKSwKKyAgICAgRig4LjI5ODQ3NTc4RS0wMiAqIEMxKSwgIEYoMS40NTM4OTg0N0UtMDEgKiBDMSksCisgICAgIEYoOS43NTc1MzkxOEUtMDIgKiBDMiksICBGKDEuNDA3NTM1MDVFLTAxICogQzIpLAorICAgICBGKDEuMTExOTY2ODlFLTAxICogQzMpLCAgRigxLjMzMjY0NDE1RS0wMSAqIEMzKSwKKyAgICAgRigxLjQ2OTU1MDY4RS0wMSAqIEM0KSwgLUYoNi43OTk4OTQzMUUtMDIgKiBDNCksCisgICAgIEYoMS40NTM4OTg0N0UtMDEgKiBDNSksIC1GKDguMjk4NDc1NzhFLTAyICogQzUpLAorICAgICBGKDEuNDA3NTM1MDVFLTAxICogQzYpLCAtRig5Ljc1NzUzOTE4RS0wMiAqIEM2KSwKKyAgICAgRigxLjMzMjY0NDE1RS0wMSAqIEM3KSwgLUYoMS4xMTE5NjY4OUUtMDEgKiBDNyksCisgICAgIEYoMC4wMDAwMDAwMEUrMDAgKiBDMCksICBGKDEuNDY0MDQwNzZFLTAyICogQzApLAorICAgIC1GKDUuMzE4NzMwMzJFLTAyICogQzEpLCAgRig4Ljg1NzU3NTQwRS0wMyAqIEMxKSwKKyAgICAtRigzLjkwNzUxMzgxRS0wMiAqIEMyKSwgIEYoMi45MjQwODQ0MkUtMDMgKiBDMiksCisgICAgLUYoMi42MTA5ODc1MkUtMDIgKiBDMyksIC1GKDQuOTE1NzgwMjRFLTAzICogQzMpLAorICAgICBGKDEuMjkzNzE4MDZFLTAyICogQzQpLCAtRig1LjY1OTQ5NDczRS0wMyAqIEM0KSwKKyAgICAgRigxLjUzMTg0MTA2RS0wMiAqIEM1KSwgLUYoOC4wMjk0MTE2M0UtMDMgKiBDNSksCisgICAgIEYoMS42MjIwODQ3MUUtMDIgKiBDNiksIC1GKDEuMDQ1ODQ0NDNFLTAyICogQzYpLAorICAgICBGKDEuNTkwNDU2MDNFLTAyICogQzcpLCAtRigxLjI3NDcyMzM1RS0wMiAqIEM3KSwKKyAgICAgRigwLjAwMDAwMDAwRSswMCAqIEMwKSwgLUYoOS4wMjE1NDUwMkUtMDQgKiBDMCksCisgICAgLUYoMy40OTcxNzQ1NEUtMDMgKiBDMSksICBGKDIuMTAzNzE5ODlFLTAzICogQzEpLAorICAgIC1GKDEuNjQ5NzMwOThFLTAzICogQzIpLCAgRigxLjk5NDU0NTU0RS0wMyAqIEMyKSwKKyAgICAtRigxLjc4ODA1MzYxRS0wNCAqIEMzKSwgIEYoMS42MTY1NjI4M0UtMDMgKiBDMyksCisgICAgIEYoMi4wMTE4MjU0MkUtMDMgKiBDNCksICBGKDAuMDAwMDAwMDBFKzAwICogQzQpLAorICAgICBGKDEuNzgzNzE3MjVFLTAzICogQzUpLCAtRigxLjU2NTc1Mzk4RS0wNCAqIEM1KSwKKyAgICAgRigxLjQ3NjQwMTY5RS0wMyAqIEM2KSwgLUYoMy40MzI1NjQyNUUtMDQgKiBDNiksCisgICAgIEYoMS4xMzk5MjUwN0UtMDMgKiBDNyksIC1GKDUuNTQ2MjAyMDJFLTA0ICogQzcpLAorI3VuZGVmIEYKKyNkZWZpbmUgRih4KSBGX0NPUyh4KQorICAgIC1GKDEuMDAwMDAwMDAwMCAvIEMwKSwgIEYoMC44MzE0Njk2MTIzIC8gQzEpLAorICAgIC1GKDEuMDAwMDAwMDAwMCAvIEMwKSwgLUYoMC4xOTUwOTAzMjIwIC8gQzEpLAorICAgIC1GKDEuMDAwMDAwMDAwMCAvIEMwKSwgLUYoMC45ODA3ODUyODA0IC8gQzEpLAorICAgIC1GKDEuMDAwMDAwMDAwMCAvIEMwKSwgLUYoMC41NTU1NzAyMzMwIC8gQzEpLAorICAgIC1GKDEuMDAwMDAwMDAwMCAvIEMwKSwgIEYoMC41NTU1NzAyMzMwIC8gQzEpLAorICAgIC1GKDEuMDAwMDAwMDAwMCAvIEMwKSwgIEYoMC45ODA3ODUyODA0IC8gQzEpLAorICAgIC1GKDEuMDAwMDAwMDAwMCAvIEMwKSwgIEYoMC4xOTUwOTAzMjIwIC8gQzEpLAorICAgIC1GKDEuMDAwMDAwMDAwMCAvIEMwKSwgLUYoMC44MzE0Njk2MTIzIC8gQzEpLAorICAgICBGKDAuOTIzODc5NTMyNSAvIEMyKSwgIEYoMC45ODA3ODUyODA0IC8gQzMpLAorICAgICBGKDAuMzgyNjgzNDMyNCAvIEMyKSwgIEYoMC44MzE0Njk2MTIzIC8gQzMpLAorICAgIC1GKDAuMzgyNjgzNDMyNCAvIEMyKSwgIEYoMC41NTU1NzAyMzMwIC8gQzMpLAorICAgIC1GKDAuOTIzODc5NTMyNSAvIEMyKSwgIEYoMC4xOTUwOTAzMjIwIC8gQzMpLAorICAgIC1GKDAuOTIzODc5NTMyNSAvIEMyKSwgLUYoMC4xOTUwOTAzMjIwIC8gQzMpLAorICAgIC1GKDAuMzgyNjgzNDMyNCAvIEMyKSwgLUYoMC41NTU1NzAyMzMwIC8gQzMpLAorICAgICBGKDAuMzgyNjgzNDMyNCAvIEMyKSwgLUYoMC44MzE0Njk2MTIzIC8gQzMpLAorICAgICBGKDAuOTIzODc5NTMyNSAvIEMyKSwgLUYoMC45ODA3ODUyODA0IC8gQzMpLAorICAgICBGKDAuNzA3MTA2NzgxMiAvIEM0KSwgIEYoMC41NTU1NzAyMzMwIC8gQzUpLAorICAgIC1GKDAuNzA3MTA2NzgxMiAvIEM0KSwgLUYoMC45ODA3ODUyODA0IC8gQzUpLAorICAgIC1GKDAuNzA3MTA2NzgxMiAvIEM0KSwgIEYoMC4xOTUwOTAzMjIwIC8gQzUpLAorICAgICBGKDAuNzA3MTA2NzgxMiAvIEM0KSwgIEYoMC44MzE0Njk2MTIzIC8gQzUpLAorICAgICBGKDAuNzA3MTA2NzgxMiAvIEM0KSwgLUYoMC44MzE0Njk2MTIzIC8gQzUpLAorICAgIC1GKDAuNzA3MTA2NzgxMiAvIEM0KSwgLUYoMC4xOTUwOTAzMjIwIC8gQzUpLAorICAgIC1GKDAuNzA3MTA2NzgxMiAvIEM0KSwgIEYoMC45ODA3ODUyODA0IC8gQzUpLAorICAgICBGKDAuNzA3MTA2NzgxMiAvIEM0KSwgLUYoMC41NTU1NzAyMzMwIC8gQzUpLAorICAgICBGKDAuMzgyNjgzNDMyNCAvIEM2KSwgIEYoMC4xOTUwOTAzMjIwIC8gQzcpLAorICAgIC1GKDAuOTIzODc5NTMyNSAvIEM2KSwgLUYoMC41NTU1NzAyMzMwIC8gQzcpLAorICAgICBGKDAuOTIzODc5NTMyNSAvIEM2KSwgIEYoMC44MzE0Njk2MTIzIC8gQzcpLAorICAgIC1GKDAuMzgyNjgzNDMyNCAvIEM2KSwgLUYoMC45ODA3ODUyODA0IC8gQzcpLAorICAgIC1GKDAuMzgyNjgzNDMyNCAvIEM2KSwgIEYoMC45ODA3ODUyODA0IC8gQzcpLAorICAgICBGKDAuOTIzODc5NTMyNSAvIEM2KSwgLUYoMC44MzE0Njk2MTIzIC8gQzcpLAorICAgIC1GKDAuOTIzODc5NTMyNSAvIEM2KSwgIEYoMC41NTU1NzAyMzMwIC8gQzcpLAorICAgICBGKDAuMzgyNjgzNDMyNCAvIEM2KSwgLUYoMC4xOTUwOTAzMjIwIC8gQzcpLAorI3VuZGVmIEYKKworI3VuZGVmIEMwCisjdW5kZWYgQzEKKyN1bmRlZiBDMgorI3VuZGVmIEMzCisjdW5kZWYgQzQKKyN1bmRlZiBDNQorI3VuZGVmIEM2CisjdW5kZWYgQzcKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NiY2RzcF9kYXRhLmggYi9saWJhdmNvZGVjL3NiY2RzcF9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBmYWQ1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvc2JjZHNwX2RhdGEuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQmx1ZXRvb3RoIGxvdy1jb21wbGV4aXR5LCBzdWJiYW5kIGNvZGVjIChTQkMpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCAgTm9raWEgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgSGVucnlrIFBsb2V0eiA8aGVucnlrQHBsb2V0emxpLmNoPgorICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgIEJyYWQgTWlkZ2xleSA8Ym1pZGdsZXlAeG1pc3Npb24uY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBtaXNjZWxsYW5lb3VzIFNCQyB0YWJsZXMKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfU0JDRFNQX0RBVEFfSAorI2RlZmluZSBBVkNPREVDX1NCQ0RTUF9EQVRBX0gKKworI2luY2x1ZGUgInNiYy5oIgorCisjZGVmaW5lIFNCQ19QUk9UT19GSVhFRF9TQ0FMRSAgICAgIDE2CisjZGVmaW5lIFNCQ19DT1NfVEFCTEVfRklYRURfU0NBTEUgIDE1CisKKy8qCisgKiBDb25zdGFudCB0YWJsZXMgZm9yIHRoZSB1c2UgaW4gU0lNRCBvcHRpbWl6ZWQgYW5hbHlzaXMgZmlsdGVycworICogRWFjaCB0YWJsZSBjb25zaXN0cyBvZiB0d28gcGFydHM6CisgKiAxLiByZW9yZGVyZWQgInByb3RvIiB0YWJsZQorICogMi4gcmVvcmRlcmVkICJjb3MiIHRhYmxlCisgKgorICogRHVlIHRvIG5vbi1zeW1tZXRyaWNhbCByZW9yZGVyaW5nLCBzZXBhcmF0ZSB0YWJsZXMgZm9yICJldmVuIgorICogYW5kICJvZGQiIGNhc2VzIGFyZSBuZWVkZWQKKyAqLworCitleHRlcm4gY29uc3QgaW50MTZfdCBmZl9zYmNkc3BfYW5hbHlzaXNfY29uc3RzX2ZpeGVkNF9zaW1kX2V2ZW5bXTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3NiY2RzcF9hbmFseXNpc19jb25zdHNfZml4ZWQ0X3NpbWRfb2RkW107CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl9zYmNkc3BfYW5hbHlzaXNfY29uc3RzX2ZpeGVkOF9zaW1kX2V2ZW5bXTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3NiY2RzcF9hbmFseXNpc19jb25zdHNfZml4ZWQ4X3NpbWRfb2RkW107CisKKyNlbmRpZiAvKiBBVkNPREVDX1NCQ0RTUF9EQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvc2JjZW5jLmMgYi9saWJhdmNvZGVjL3NiY2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOTI5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3NiY2VuYy5jCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogQmx1ZXRvb3RoIGxvdy1jb21wbGV4aXR5LCBzdWJiYW5kIGNvZGVjIChTQkMpCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTItMjAxMyAgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDEwICBOb2tpYSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgIE1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1ICBIZW5yeWsgUGxvZXR6IDxoZW5yeWtAcGxvZXR6bGkuY2g+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOCAgQnJhZCBNaWRnbGV5IDxibWlkZ2xleUB4bWlzc2lvbi5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNCQyBlbmNvZGVyIGltcGxlbWVudGF0aW9uCisgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHJvZmlsZXMuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgInNiYy5oIgorI2luY2x1ZGUgInNiY2RzcC5oIgorCit0eXBlZGVmIHN0cnVjdCBTQkNFbmNDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQ2NF90IG1heF9kZWxheTsKKyAgICBpbnQgbXNiYzsKKyAgICBERUNMQVJFX0FMSUdORUQoU0JDX0FMSUdOLCBzdHJ1Y3Qgc2JjX2ZyYW1lLCBmcmFtZSk7CisgICAgREVDTEFSRV9BTElHTkVEKFNCQ19BTElHTiwgU0JDRFNQQ29udGV4dCwgZHNwKTsKK30gU0JDRW5jQ29udGV4dDsKKworc3RhdGljIGludCBzYmNfYW5hbHl6ZV9hdWRpbyhTQkNEU1BDb250ZXh0ICpzLCBzdHJ1Y3Qgc2JjX2ZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgY2gsIGJsazsKKyAgICBpbnQxNl90ICp4OworCisgICAgc3dpdGNoIChmcmFtZS0+c3ViYmFuZHMpIHsKKyAgICBjYXNlIDQ6CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGZyYW1lLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgeCA9ICZzLT5YW2NoXVtzLT5wb3NpdGlvbiAtIDQgKgorICAgICAgICAgICAgICAgICAgICBzLT5pbmNyZW1lbnQgKyBmcmFtZS0+YmxvY2tzICogNF07CisgICAgICAgICAgICBmb3IgKGJsayA9IDA7IGJsayA8IGZyYW1lLT5ibG9ja3M7CisgICAgICAgICAgICAgICAgICAgICAgICBibGsgKz0gcy0+aW5jcmVtZW50KSB7CisgICAgICAgICAgICAgICAgcy0+c2JjX2FuYWx5emVfNHMoCisgICAgICAgICAgICAgICAgICAgIHMsIHgsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zYl9zYW1wbGVfZltibGtdW2NoXSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNiX3NhbXBsZV9mW2JsayArIDFdW2NoXSAtCisgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zYl9zYW1wbGVfZltibGtdW2NoXSk7CisgICAgICAgICAgICAgICAgeCAtPSA0ICogcy0+aW5jcmVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFtZS0+YmxvY2tzICogNDsKKworICAgIGNhc2UgODoKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgZnJhbWUtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICB4ID0gJnMtPlhbY2hdW3MtPnBvc2l0aW9uIC0gOCAqCisgICAgICAgICAgICAgICAgICAgIHMtPmluY3JlbWVudCArIGZyYW1lLT5ibG9ja3MgKiA4XTsKKyAgICAgICAgICAgIGZvciAoYmxrID0gMDsgYmxrIDwgZnJhbWUtPmJsb2NrczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsayArPSBzLT5pbmNyZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBzLT5zYmNfYW5hbHl6ZV84cygKKyAgICAgICAgICAgICAgICAgICAgcywgeCwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNiX3NhbXBsZV9mW2Jsa11bY2hdLAorICAgICAgICAgICAgICAgICAgICBmcmFtZS0+c2Jfc2FtcGxlX2ZbYmxrICsgMV1bY2hdIC0KKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNiX3NhbXBsZV9mW2Jsa11bY2hdKTsKKyAgICAgICAgICAgICAgICB4IC09IDggKiBzLT5pbmNyZW1lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZyYW1lLT5ibG9ja3MgKiA4OworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9Cit9CisKKy8qCisgKiBQYWNrcyB0aGUgU0JDIGZyYW1lIGZyb20gZnJhbWUgaW50byB0aGUgbWVtb3J5IGluIGF2cGt0LgorICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwYWNrZWQgZnJhbWUuCisgKi8KK3N0YXRpYyBzaXplX3Qgc2JjX3BhY2tfZnJhbWUoQVZQYWNrZXQgKmF2cGt0LCBzdHJ1Y3Qgc2JjX2ZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvaW50LCBib29sIG1zYmMpCit7CisgICAgUHV0Qml0Q29udGV4dCBwYjsKKworICAgIC8qIFdpbGwgY29weSB0aGUgaGVhZGVyIHBhcnRzIGZvciBDUkMtOCBjYWxjdWxhdGlvbiBoZXJlICovCisgICAgdWludDhfdCBjcmNfaGVhZGVyWzExXSA9IHsgMCB9OworICAgIGludCBjcmNfcG9zOworCisgICAgdWludDMyX3QgYXVkaW9fc2FtcGxlOworCisgICAgaW50IGNoLCBzYiwgYmxrOyAgICAgICAgLyogY2hhbm5lbCwgc3ViYmFuZCwgYmxvY2sgYW5kIGJpdCBjb3VudGVycyAqLworICAgIGludCBiaXRzWzJdWzhdOyAgICAgICAgIC8qIGJpdHMgZGlzdHJpYnV0aW9uICovCisgICAgdWludDMyX3QgbGV2ZWxzWzJdWzhdOyAgLyogbGV2ZWxzIGFyZSBkZXJpdmVkIGZyb20gdGhhdCAqLworICAgIHVpbnQzMl90IHNiX3NhbXBsZV9kZWx0YVsyXVs4XTsKKworICAgIGlmIChtc2JjKSB7CisgICAgICAgIGF2cGt0LT5kYXRhWzBdID0gTVNCQ19TWU5DV09SRDsKKyAgICAgICAgYXZwa3QtPmRhdGFbMV0gPSAwOworICAgICAgICBhdnBrdC0+ZGF0YVsyXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZwa3QtPmRhdGFbMF0gPSBTQkNfU1lOQ1dPUkQ7CisKKyAgICAgICAgYXZwa3QtPmRhdGFbMV0gID0gKGZyYW1lLT5mcmVxdWVuY3kgICAgICAgICAgICYgMHgwMykgPDwgNjsKKyAgICAgICAgYXZwa3QtPmRhdGFbMV0gfD0gKCgoZnJhbWUtPmJsb2NrcyA+PiAyKSAtIDEpICYgMHgwMykgPDwgNDsKKyAgICAgICAgYXZwa3QtPmRhdGFbMV0gfD0gKGZyYW1lLT5tb2RlICAgICAgICAgICAgICAgICYgMHgwMykgPDwgMjsKKyAgICAgICAgYXZwa3QtPmRhdGFbMV0gfD0gKGZyYW1lLT5hbGxvY2F0aW9uICAgICAgICAgICYgMHgwMSkgPDwgMTsKKyAgICAgICAgYXZwa3QtPmRhdGFbMV0gfD0gKChmcmFtZS0+c3ViYmFuZHMgPT0gOCkgICAgICYgMHgwMSkgPDwgMDsKKworICAgICAgICBhdnBrdC0+ZGF0YVsyXSA9IGZyYW1lLT5iaXRwb29sOworCisgICAgICAgIGlmIChmcmFtZS0+Yml0cG9vbCA+IGZyYW1lLT5zdWJiYW5kcyA8PCAoNCArIChmcmFtZS0+bW9kZSA9PSBTVEVSRU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGZyYW1lLT5tb2RlID09IEpPSU5UX1NURVJFTykpKQorICAgICAgICAgICAgcmV0dXJuIC01OworICAgIH0KKworICAgIC8qIENhbid0IGZpbGwgaW4gY3JjIHlldCAqLworICAgIGNyY19oZWFkZXJbMF0gPSBhdnBrdC0+ZGF0YVsxXTsKKyAgICBjcmNfaGVhZGVyWzFdID0gYXZwa3QtPmRhdGFbMl07CisgICAgY3JjX3BvcyA9IDE2OworCisgICAgaW5pdF9wdXRfYml0cygmcGIsIGF2cGt0LT5kYXRhICsgNCwgYXZwa3QtPnNpemUpOworCisgICAgaWYgKGZyYW1lLT5tb2RlID09IEpPSU5UX1NURVJFTykgeworICAgICAgICBwdXRfYml0cygmcGIsIGZyYW1lLT5zdWJiYW5kcywgam9pbnQpOworICAgICAgICBjcmNfaGVhZGVyW2NyY19wb3MgPj4gM10gPSBqb2ludDsKKyAgICAgICAgY3JjX3BvcyArPSBmcmFtZS0+c3ViYmFuZHM7CisgICAgfQorCisgICAgZm9yIChjaCA9IDA7IGNoIDwgZnJhbWUtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGZyYW1lLT5zdWJiYW5kczsgc2IrKykgeworICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCA0LCBmcmFtZS0+c2NhbGVfZmFjdG9yW2NoXVtzYl0gJiAweDBGKTsKKyAgICAgICAgICAgIGNyY19oZWFkZXJbY3JjX3BvcyA+PiAzXSA8PD0gNDsKKyAgICAgICAgICAgIGNyY19oZWFkZXJbY3JjX3BvcyA+PiAzXSB8PSBmcmFtZS0+c2NhbGVfZmFjdG9yW2NoXVtzYl0gJiAweDBGOworICAgICAgICAgICAgY3JjX3BvcyArPSA0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogYWxpZ24gdGhlIGxhc3QgY3JjIGJ5dGUgKi8KKyAgICBpZiAoY3JjX3BvcyAlIDgpCisgICAgICAgIGNyY19oZWFkZXJbY3JjX3BvcyA+PiAzXSA8PD0gOCAtIChjcmNfcG9zICUgOCk7CisKKyAgICBhdnBrdC0+ZGF0YVszXSA9IGZmX3NiY19jcmM4KGZyYW1lLT5jcmNfY3R4LCBjcmNfaGVhZGVyLCBjcmNfcG9zKTsKKworICAgIGZmX3NiY19jYWxjdWxhdGVfYml0cyhmcmFtZSwgYml0cyk7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBmcmFtZS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZm9yIChzYiA9IDA7IHNiIDwgZnJhbWUtPnN1YmJhbmRzOyBzYisrKSB7CisgICAgICAgICAgICBsZXZlbHNbY2hdW3NiXSA9ICgoMSA8PCBiaXRzW2NoXVtzYl0pIC0gMSkgPDwKKyAgICAgICAgICAgICAgICAoMzIgLSAoZnJhbWUtPnNjYWxlX2ZhY3RvcltjaF1bc2JdICsKKyAgICAgICAgICAgICAgICAgICAgU0NBTEVfT1VUX0JJVFMgKyAyKSk7CisgICAgICAgICAgICBzYl9zYW1wbGVfZGVsdGFbY2hdW3NiXSA9ICh1aW50MzJfdCkgMSA8PAorICAgICAgICAgICAgICAgIChmcmFtZS0+c2NhbGVfZmFjdG9yW2NoXVtzYl0gKworICAgICAgICAgICAgICAgICAgICBTQ0FMRV9PVVRfQklUUyArIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChibGsgPSAwOyBibGsgPCBmcmFtZS0+YmxvY2tzOyBibGsrKykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBmcmFtZS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZvciAoc2IgPSAwOyBzYiA8IGZyYW1lLT5zdWJiYW5kczsgc2IrKykgeworCisgICAgICAgICAgICAgICAgaWYgKGJpdHNbY2hdW3NiXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZSA9ICgodWludDY0X3QpIGxldmVsc1tjaF1bc2JdICoKKyAgICAgICAgICAgICAgICAgICAgKHNiX3NhbXBsZV9kZWx0YVtjaF1bc2JdICsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNiX3NhbXBsZV9mW2Jsa11bY2hdW3NiXSkpID4+IDMyOworCisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCBiaXRzW2NoXVtzYl0sIGF1ZGlvX3NhbXBsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgcmV0dXJuIChwdXRfYml0c19jb3VudCgmcGIpICsgNykgLyA4OworfQorCitzdGF0aWMgaW50IHNiY19lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU0JDRW5jQ29udGV4dCAqc2JjID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3Qgc2JjX2ZyYW1lICpmcmFtZSA9ICZzYmMtPmZyYW1lOworCisgICAgaWYgKGF2Y3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfU0JDX01TQkMpCisgICAgICAgIHNiYy0+bXNiYyA9IDE7CisKKyAgICBpZiAoc2JjLT5tc2JjKSB7CisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtU0JDIHJlcXVpcmUgbW9ubyBjaGFubmVsLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2Y3R4LT5zYW1wbGVfcmF0ZSAhPSAxNjAwMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtU0JDIHJlcXVpcmUgMTYga0h6IHNhbXBsZXJhdGUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZS0+bW9kZSA9IFNCQ19NT0RFX01PTk87CisgICAgICAgIGZyYW1lLT5zdWJiYW5kcyA9IDg7CisgICAgICAgIGZyYW1lLT5ibG9ja3MgPSBNU0JDX0JMT0NLUzsKKyAgICAgICAgZnJhbWUtPmFsbG9jYXRpb24gPSBTQkNfQU1fTE9VRE5FU1M7CisgICAgICAgIGZyYW1lLT5iaXRwb29sID0gMjY7CisKKyAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUgPSA4ICogTVNCQ19CTE9DS1M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGQ7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSA+IDI1NSpGRl9RUDJMQU1CREEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiYml0cG9vbCA+IDI1NSBpcyBub3QgYWxsb3dlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPT0gMSkgeworICAgICAgICAgICAgZnJhbWUtPm1vZGUgPSBTQkNfTU9ERV9NT05POworICAgICAgICAgICAgaWYgKHNiYy0+bWF4X2RlbGF5IDw9IDMwMDAgfHwgYXZjdHgtPmJpdF9yYXRlID4gMjcwMDAwKQorICAgICAgICAgICAgICAgIGZyYW1lLT5zdWJiYW5kcyA9IDQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnJhbWUtPnN1YmJhbmRzID0gODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPCAxODAwMDAgfHwgYXZjdHgtPmJpdF9yYXRlID4gNDIwMDAwKQorICAgICAgICAgICAgICAgIGZyYW1lLT5tb2RlID0gU0JDX01PREVfSk9JTlRfU1RFUkVPOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZyYW1lLT5tb2RlID0gU0JDX01PREVfU1RFUkVPOworICAgICAgICAgICAgaWYgKHNiYy0+bWF4X2RlbGF5IDw9IDQwMDAgfHwgYXZjdHgtPmJpdF9yYXRlID4gNDIwMDAwKQorICAgICAgICAgICAgICAgIGZyYW1lLT5zdWJiYW5kcyA9IDQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnJhbWUtPnN1YmJhbmRzID0gODsKKyAgICAgICAgfQorICAgICAgICAvKiBzYmMgYWxnb3JpdGhtaWMgZGVsYXkgaXMgKChibG9ja3MgKyAxMCkgKiBzdWJiYW5kcyAtIDIpIC8gc2FtcGxlX3JhdGUgKi8KKyAgICAgICAgZnJhbWUtPmJsb2NrcyA9IGF2X2NsaXAoKChzYmMtPm1heF9kZWxheSAqIGF2Y3R4LT5zYW1wbGVfcmF0ZSArIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAoMTAwMDAwMCAqIGZyYW1lLT5zdWJiYW5kcykpIC0gMTAsIDQsIDE2KSAmIH4zOworCisgICAgICAgIGZyYW1lLT5hbGxvY2F0aW9uID0gU0JDX0FNX0xPVURORVNTOworCisgICAgICAgIGQgPSBmcmFtZS0+YmxvY2tzICogKChmcmFtZS0+bW9kZSA9PSBTQkNfTU9ERV9EVUFMX0NIQU5ORUwpICsgMSk7CisgICAgICAgIGZyYW1lLT5iaXRwb29sID0gKCgoYXZjdHgtPmJpdF9yYXRlICogZnJhbWUtPnN1YmJhbmRzICogZnJhbWUtPmJsb2NrcykgLyBhdmN0eC0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0gNCAqIGZyYW1lLT5zdWJiYW5kcyAqIGF2Y3R4LT5jaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAtIChmcmFtZS0+bW9kZSA9PSBTQkNfTU9ERV9KT0lOVF9TVEVSRU8pKmZyYW1lLT5zdWJiYW5kcyAtIDMyICsgZC8yKSAvIGQ7CisgICAgICAgIGlmIChhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgPiAwKQorICAgICAgICAgICAgZnJhbWUtPmJpdHBvb2wgPSBhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgLyBGRl9RUDJMQU1CREE7CisKKyAgICAgICAgYXZjdHgtPmZyYW1lX3NpemUgPSA0KigoZnJhbWUtPnN1YmJhbmRzID4+IDMpICsgMSkgKiA0KihmcmFtZS0+YmxvY2tzID4+IDIpOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBhdmN0eC0+Y29kZWMtPnN1cHBvcnRlZF9zYW1wbGVyYXRlc1tpXTsgaSsrKQorICAgICAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlID09IGF2Y3R4LT5jb2RlYy0+c3VwcG9ydGVkX3NhbXBsZXJhdGVzW2ldKQorICAgICAgICAgICAgZnJhbWUtPmZyZXF1ZW5jeSA9IGk7CisKKyAgICBmcmFtZS0+Y2hhbm5lbHMgPSBhdmN0eC0+Y2hhbm5lbHM7CisgICAgZnJhbWUtPmNvZGVzaXplID0gZnJhbWUtPnN1YmJhbmRzICogZnJhbWUtPmJsb2NrcyAqIGF2Y3R4LT5jaGFubmVscyAqIDI7CisgICAgZnJhbWUtPmNyY19jdHggPSBhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ184X0VCVSk7CisKKyAgICBtZW1zZXQoJnNiYy0+ZHNwLlgsIDAsIHNpemVvZihzYmMtPmRzcC5YKSk7CisgICAgc2JjLT5kc3AucG9zaXRpb24gPSAoU0JDX1hfQlVGRkVSX1NJWkUgLSBmcmFtZS0+c3ViYmFuZHMgKiA5KSAmIH43OworICAgIHNiYy0+ZHNwLmluY3JlbWVudCA9IHNiYy0+bXNiYyA/IDEgOiA0OworICAgIGZmX3NiY2RzcF9pbml0KCZzYmMtPmRzcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYmNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmF2X2ZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQoreworICAgIFNCQ0VuY0NvbnRleHQgKnNiYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IHNiY19mcmFtZSAqZnJhbWUgPSAmc2JjLT5mcmFtZTsKKyAgICB1aW50OF90IGpvaW50ID0gZnJhbWUtPm1vZGUgPT0gU0JDX01PREVfSk9JTlRfU1RFUkVPOworICAgIHVpbnQ4X3QgZHVhbCAgPSBmcmFtZS0+bW9kZSA9PSBTQkNfTU9ERV9EVUFMX0NIQU5ORUw7CisgICAgaW50IHJldCwgaiA9IDA7CisKKyAgICBpbnQgZnJhbWVfbGVuZ3RoID0gNCArICg0ICogZnJhbWUtPnN1YmJhbmRzICogZnJhbWUtPmNoYW5uZWxzKSAvIDgKKyAgICAgICAgICAgICAgICAgICAgICsgKChmcmFtZS0+YmxvY2tzICogZnJhbWUtPmJpdHBvb2wgKiAoMSArIGR1YWwpCisgICAgICAgICAgICAgICAgICAgICArIGpvaW50ICogZnJhbWUtPnN1YmJhbmRzKSArIDcpIC8gODsKKworICAgIC8qIGlucHV0IG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGVuY29kZSBhIGNvbXBsZXRlIGZyYW1lICovCisgICAgaWYgKGF2X2ZyYW1lLT5uYl9zYW1wbGVzICogZnJhbWUtPmNoYW5uZWxzICogMiA8IGZyYW1lLT5jb2Rlc2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIGF2cGt0LCBmcmFtZV9sZW5ndGgsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBTZWxlY3QgdGhlIG5lZWRlZCBpbnB1dCBkYXRhIHByb2Nlc3NpbmcgZnVuY3Rpb24gYW5kIGNhbGwgaXQgKi8KKyAgICBpZiAoZnJhbWUtPnN1YmJhbmRzID09IDgpCisgICAgICAgIHNiYy0+ZHNwLnBvc2l0aW9uID0gc2JjLT5kc3Auc2JjX2VuY19wcm9jZXNzX2lucHV0XzhzKAorICAgICAgICAgICAgICAgIHNiYy0+ZHNwLnBvc2l0aW9uLCBhdl9mcmFtZS0+ZGF0YVswXSwgc2JjLT5kc3AuWCwKKyAgICAgICAgICAgICAgICBmcmFtZS0+c3ViYmFuZHMgKiBmcmFtZS0+YmxvY2tzLCBmcmFtZS0+Y2hhbm5lbHMpOworICAgIGVsc2UKKyAgICAgICAgc2JjLT5kc3AucG9zaXRpb24gPSBzYmMtPmRzcC5zYmNfZW5jX3Byb2Nlc3NfaW5wdXRfNHMoCisgICAgICAgICAgICAgICAgc2JjLT5kc3AucG9zaXRpb24sIGF2X2ZyYW1lLT5kYXRhWzBdLCBzYmMtPmRzcC5YLAorICAgICAgICAgICAgICAgIGZyYW1lLT5zdWJiYW5kcyAqIGZyYW1lLT5ibG9ja3MsIGZyYW1lLT5jaGFubmVscyk7CisKKyAgICBzYmNfYW5hbHl6ZV9hdWRpbygmc2JjLT5kc3AsICZzYmMtPmZyYW1lKTsKKworICAgIGlmIChmcmFtZS0+bW9kZSA9PSBKT0lOVF9TVEVSRU8pCisgICAgICAgIGogPSBzYmMtPmRzcC5zYmNfY2FsY19zY2FsZWZhY3RvcnNfaihmcmFtZS0+c2Jfc2FtcGxlX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+c2NhbGVfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zdWJiYW5kcyk7CisgICAgZWxzZQorICAgICAgICBzYmMtPmRzcC5zYmNfY2FsY19zY2FsZWZhY3RvcnMoZnJhbWUtPnNiX3NhbXBsZV9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNjYWxlX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5ibG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+c3ViYmFuZHMpOworICAgIGVtbXNfYygpOworICAgIHNiY19wYWNrX2ZyYW1lKGF2cGt0LCBmcmFtZSwgaiwgc2JjLT5tc2JjKTsKKworICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNCQ0VuY0NvbnRleHQsIHgpCisjZGVmaW5lIEFFIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAic2JjX2RlbGF5IiwgInNldCBtYXhpbXVtIGFsZ29yaXRobWljIGxhdGVuY3kiLAorICAgICAgT0ZGU0VUKG1heF9kZWxheSksIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IDEzMDAwfSwgMTAwMCwxMzAwMCwgQUUgfSwKKyAgICB7ICJtc2JjIiwgICAgICAidXNlIG1TQkMgbW9kZSAod2lkZWJhbmQgc3BlZWNoIG1vbm8gU0JDKSIsCisgICAgICBPRkZTRVQobXNiYyksICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgICAgIHsuaTY0ID0gMH0sICAgICAgICAwLCAgICAxLCBBRSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mgc2JjX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInNiYyBlbmNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfc2JjX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgICA9ICJzYmMiLAorICAgIC5sb25nX25hbWUgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU0JDIChsb3ctY29tcGxleGl0eSBzdWJiYW5kIGNvZGVjKSIpLAorICAgIC50eXBlICAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NCQywKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFNCQ0VuY0NvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICAgPSBzYmNfZW5jb2RlX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgICAgICA9IHNiY19lbmNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IEFWX0NPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FLAorICAgIC5jYXBzX2ludGVybmFsICAgICAgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAorICAgIC5jaGFubmVsX2xheW91dHMgICAgICAgPSAoY29uc3QgdWludDY0X3RbXSkgeyBBVl9DSF9MQVlPVVRfTU9OTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTywgMH0sCisgICAgLnNhbXBsZV9mbXRzICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9TMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCisgICAgLnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA9IChjb25zdCBpbnRbXSkgeyAxNjAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMCwgMCB9LAorICAgIC5wcml2X2NsYXNzICAgICAgICAgICAgPSAmc2JjX2NsYXNzLAorICAgIC5wcm9maWxlcyAgICAgICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl9zYmNfcHJvZmlsZXMpLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvc2JyZHNwLmMgYi9saWJhdmNvZGVjL3NicmRzcC5jCmluZGV4IGNjNDMyYjYuLmE5M2I1ZjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc2JyZHNwLmMKKysrIGIvbGliYXZjb2RlYy9zYnJkc3AuYwpAQCAtMTUzLDggKzE1Myw4IEBACiAgICAgcGhpWzIgLSAxXVsxXVsxXSA9IGltYWdfc3VtMSArIHhbIDBdWzBdICogeFsgMV1bMV0gLSB4WyAwXVsxXSAqIHhbIDFdWzBdOwogICAgIHBoaVswICAgIF1bMF1bMF0gPSByZWFsX3N1bTEgKyB4WzM4XVswXSAqIHhbMzldWzBdICsgeFszOF1bMV0gKiB4WzM5XVsxXTsKICAgICBwaGlbMCAgICBdWzBdWzFdID0gaW1hZ19zdW0xICsgeFszOF1bMF0gKiB4WzM5XVsxXSAtIHhbMzhdWzFdICogeFszOV1bMF07Ci0jZW5kaWYKIH0KKyNlbmRpZgogCiBzdGF0aWMgdm9pZCBzYnJfaGZfZ2VuX2MoZmxvYXQgKCpYX2hpZ2gpWzJdLCBjb25zdCBmbG9hdCAoKlhfbG93KVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBhbHBoYTBbMl0sIGNvbnN0IGZsb2F0IGFscGhhMVsyXSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvc2JyZHNwLmggYi9saWJhdmNvZGVjL3NicmRzcC5oCmluZGV4IDY2ODUyZGUuLmU2ZmQ3NmQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc2JyZHNwLmgKKysrIGIvbGliYXZjb2RlYy9zYnJkc3AuaApAQCAtNDgsNiArNDgsNyBAQAogCiB2b2lkIEFBQ19SRU5BTUUoZmZfc2JyZHNwX2luaXQpKFNCUkRTUENvbnRleHQgKnMpOwogdm9pZCBmZl9zYnJkc3BfaW5pdF9hcm0oU0JSRFNQQ29udGV4dCAqcyk7Cit2b2lkIGZmX3NicmRzcF9pbml0X2FhcmNoNjQoU0JSRFNQQ29udGV4dCAqcyk7CiB2b2lkIGZmX3NicmRzcF9pbml0X3g4NihTQlJEU1BDb250ZXh0ICpzKTsKIHZvaWQgZmZfc2JyZHNwX2luaXRfbWlwcyhTQlJEU1BDb250ZXh0ICpzKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zYnJkc3BfZml4ZWQuYyBiL2xpYmF2Y29kZWMvc2JyZHNwX2ZpeGVkLmMKaW5kZXggZjRlM2RlMC4uOTFmYTY2NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9zYnJkc3BfZml4ZWQuYworKysgYi9saWJhdmNvZGVjL3NicmRzcF9maXhlZC5jCkBAIC0zNCwzNyArMzQsNTEgQEAKIHN0YXRpYyBTb2Z0RmxvYXQgc2JyX3N1bV9zcXVhcmVfYyhpbnQgKCp4KVsyXSwgaW50IG4pCiB7CiAgICAgU29mdEZsb2F0IHJldDsKLSAgICBpbnQ2NF90IGFjY3UgPSAwOwotICAgIGludCBpLCBueiwgcm91bmQ7CisgICAgdWludDY0X3QgYWNjdSA9IDAsIHJvdW5kOworICAgIHVpbnQ2NF90IGFjY3UwID0gMCwgYWNjdTEgPSAwLCBhY2N1MiA9IDAsIGFjY3UzID0gMDsKKyAgICBpbnQgaSwgbnosIG56MDsKKyAgICB1bnNpZ25lZCB1OwogCisgICAgbnogPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpICs9IDIpIHsKLSAgICAgICAgLy8gTGFyZ2VyIHZhbHVlcyBhcmUgaW5hdmxpZCBhbmQgY291bGQgY2F1c2Ugb3ZlcmZsb3dzIG9mIGFjY3UuCi0gICAgICAgIGF2X2Fzc2VydDIoRkZBQlMoeFtpICsgMF1bMF0pID4+IDI5ID09IDApOwotICAgICAgICBhY2N1ICs9IChpbnQ2NF90KXhbaSArIDBdWzBdICogeFtpICsgMF1bMF07Ci0gICAgICAgIGF2X2Fzc2VydDIoRkZBQlMoeFtpICsgMF1bMV0pID4+IDI5ID09IDApOwotICAgICAgICBhY2N1ICs9IChpbnQ2NF90KXhbaSArIDBdWzFdICogeFtpICsgMF1bMV07Ci0gICAgICAgIGF2X2Fzc2VydDIoRkZBQlMoeFtpICsgMV1bMF0pID4+IDI5ID09IDApOwotICAgICAgICBhY2N1ICs9IChpbnQ2NF90KXhbaSArIDFdWzBdICogeFtpICsgMV1bMF07Ci0gICAgICAgIGF2X2Fzc2VydDIoRkZBQlMoeFtpICsgMV1bMV0pID4+IDI5ID09IDApOwotICAgICAgICBhY2N1ICs9IChpbnQ2NF90KXhbaSArIDFdWzFdICogeFtpICsgMV1bMV07Ci0gICAgfQotCi0gICAgaSA9IChpbnQpKGFjY3UgPj4gMzIpOwotICAgIGlmIChpID09IDApIHsKLSAgICAgICAgbnogPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG56ID0gMDsKLSAgICAgICAgd2hpbGUgKEZGQUJTKGkpIDwgMHg0MDAwMDAwMCkgewotICAgICAgICAgICAgaSA8PD0gMTsKLSAgICAgICAgICAgIG56Kys7CisgICAgICAgIGFjY3UwICs9IChpbnQ2NF90KXhbaSArIDBdWzBdICogeFtpICsgMF1bMF07CisgICAgICAgIGFjY3UxICs9IChpbnQ2NF90KXhbaSArIDBdWzFdICogeFtpICsgMF1bMV07CisgICAgICAgIGFjY3UyICs9IChpbnQ2NF90KXhbaSArIDFdWzBdICogeFtpICsgMV1bMF07CisgICAgICAgIGFjY3UzICs9IChpbnQ2NF90KXhbaSArIDFdWzFdICogeFtpICsgMV1bMV07CisgICAgICAgIGlmICgoYWNjdTB8YWNjdTF8YWNjdTJ8YWNjdTMpID4gVUlOVDY0X01BWCAtIElOVDMyX01JTiooaW50NjRfdClJTlQzMl9NSU4gfHwgaSsyPj1uKSB7CisgICAgICAgICAgICBhY2N1MCA+Pj0gbno7CisgICAgICAgICAgICBhY2N1MSA+Pj0gbno7CisgICAgICAgICAgICBhY2N1MiA+Pj0gbno7CisgICAgICAgICAgICBhY2N1MyA+Pj0gbno7CisgICAgICAgICAgICB3aGlsZSAoKGFjY3UwfGFjY3UxfGFjY3UyfGFjY3UzKSA+IChVSU5UNjRfTUFYIC0gYWNjdSkgPj4gMikgeworICAgICAgICAgICAgICAgIGFjY3UwID4+PSAxOworICAgICAgICAgICAgICAgIGFjY3UxID4+PSAxOworICAgICAgICAgICAgICAgIGFjY3UyID4+PSAxOworICAgICAgICAgICAgICAgIGFjY3UzID4+PSAxOworICAgICAgICAgICAgICAgIGFjY3UgID4+PSAxOworICAgICAgICAgICAgICAgIG56ICsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWNjdSArPSBhY2N1MCArIGFjY3UxICsgYWNjdTIgKyBhY2N1MzsKKyAgICAgICAgICAgIGFjY3UwID0gYWNjdTEgPSBhY2N1MiA9IGFjY3UzID0gMDsKICAgICAgICAgfQotICAgICAgICBueiA9IDMyIC0gbno7CiAgICAgfQogCi0gICAgcm91bmQgPSAxIDw8IChuei0xKTsKLSAgICBpID0gKGludCkoKGFjY3UgKyByb3VuZCkgPj4gbnopOwotICAgIGkgPj49IDE7Ci0gICAgcmV0ID0gYXZfaW50MnNmKGksIDE1IC0gbnopOworICAgIG56MCA9IDE1IC0gbno7CisKKyAgICB1ID0gYWNjdSA+PiAzMjsKKyAgICBpZiAodSkgeworICAgICAgICBueiA9IDMzOworICAgICAgICB3aGlsZSAodSA8IDB4ODAwMDAwMDBVKSB7CisgICAgICAgICAgICB1IDw8PSAxOworICAgICAgICAgICAgbnotLTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBueiA9IDE7CisKKyAgICByb3VuZCA9IDFVTEwgPDwgKG56LTEpOworICAgIHUgPSAoKGFjY3UgKyByb3VuZCkgPj4gbnopOworICAgIHUgPj49IDE7CisgICAgcmV0ID0gYXZfaW50MnNmKHUsIG56MCAtIG56KTsKIAogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xMDcsMjMgKzEyMSwyNCBAQAogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBTb2Z0RmxvYXQgYXV0b2NvcnJfY2FsYyhpbnQ2NF90IGFjY3UpCiB7Ci0gICAgICAgIGludCBueiwgbWFudCwgZXhwbywgcm91bmQ7CisgICAgICAgIGludCBueiwgbWFudCwgZXhwbzsKKyAgICAgICAgdW5zaWduZWQgcm91bmQ7CiAgICAgICAgIGludCBpID0gKGludCkoYWNjdSA+PiAzMik7CiAgICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgICAgIG56ID0gMTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG56ID0gMDsKICAgICAgICAgICAgIHdoaWxlIChGRkFCUyhpKSA8IDB4NDAwMDAwMDApIHsKLSAgICAgICAgICAgICAgICBpIDw8PSAxOworICAgICAgICAgICAgICAgIGkgKj0gMjsKICAgICAgICAgICAgICAgICBueisrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbnogPSAzMi1uejsKICAgICAgICAgfQogCi0gICAgICAgIHJvdW5kID0gMSA8PCAobnotMSk7CisgICAgICAgIHJvdW5kID0gMVUgPDwgKG56LTEpOwogICAgICAgICBtYW50ID0gKGludCkoKGFjY3UgKyByb3VuZCkgPj4gbnopOwotICAgICAgICBtYW50ID0gKG1hbnQgKyAweDQwKT4+NzsKLSAgICAgICAgbWFudCA8PD0gNjsKKyAgICAgICAgbWFudCA9IChtYW50ICsgMHg0MExMKT4+NzsKKyAgICAgICAgbWFudCAqPSA2NDsKICAgICAgICAgZXhwbyA9IG56ICsgMTU7CiAgICAgICAgIHJldHVybiBhdl9pbnQyc2YobWFudCwgMzAgLSBleHBvKTsKIH0KQEAgLTEzNiwxOSArMTUxLDE5IEBACiAKICAgICBpZiAobGFnKSB7CiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCAzODsgaSsrKSB7Ci0gICAgICAgICAgICBhY2N1X3JlICs9IChpbnQ2NF90KXhbaV1bMF0gKiB4W2krbGFnXVswXTsKLSAgICAgICAgICAgIGFjY3VfcmUgKz0gKGludDY0X3QpeFtpXVsxXSAqIHhbaStsYWddWzFdOwotICAgICAgICAgICAgYWNjdV9pbSArPSAoaW50NjRfdCl4W2ldWzBdICogeFtpK2xhZ11bMV07Ci0gICAgICAgICAgICBhY2N1X2ltIC09IChpbnQ2NF90KXhbaV1bMV0gKiB4W2krbGFnXVswXTsKKyAgICAgICAgICAgIGFjY3VfcmUgKz0gKHVpbnQ2NF90KXhbaV1bMF0gKiB4W2krbGFnXVswXTsKKyAgICAgICAgICAgIGFjY3VfcmUgKz0gKHVpbnQ2NF90KXhbaV1bMV0gKiB4W2krbGFnXVsxXTsKKyAgICAgICAgICAgIGFjY3VfaW0gKz0gKHVpbnQ2NF90KXhbaV1bMF0gKiB4W2krbGFnXVsxXTsKKyAgICAgICAgICAgIGFjY3VfaW0gLT0gKHVpbnQ2NF90KXhbaV1bMV0gKiB4W2krbGFnXVswXTsKICAgICAgICAgfQogCiAgICAgICAgIHJlYWxfc3VtID0gYWNjdV9yZTsKICAgICAgICAgaW1hZ19zdW0gPSBhY2N1X2ltOwogCi0gICAgICAgIGFjY3VfcmUgKz0gKGludDY0X3QpeFsgMF1bMF0gKiB4W2xhZ11bMF07Ci0gICAgICAgIGFjY3VfcmUgKz0gKGludDY0X3QpeFsgMF1bMV0gKiB4W2xhZ11bMV07Ci0gICAgICAgIGFjY3VfaW0gKz0gKGludDY0X3QpeFsgMF1bMF0gKiB4W2xhZ11bMV07Ci0gICAgICAgIGFjY3VfaW0gLT0gKGludDY0X3QpeFsgMF1bMV0gKiB4W2xhZ11bMF07CisgICAgICAgIGFjY3VfcmUgKz0gKHVpbnQ2NF90KXhbIDBdWzBdICogeFtsYWddWzBdOworICAgICAgICBhY2N1X3JlICs9ICh1aW50NjRfdCl4WyAwXVsxXSAqIHhbbGFnXVsxXTsKKyAgICAgICAgYWNjdV9pbSArPSAodWludDY0X3QpeFsgMF1bMF0gKiB4W2xhZ11bMV07CisgICAgICAgIGFjY3VfaW0gLT0gKHVpbnQ2NF90KXhbIDBdWzFdICogeFtsYWddWzBdOwogCiAgICAgICAgIHBoaVsyLWxhZ11bMV1bMF0gPSBhdXRvY29ycl9jYWxjKGFjY3VfcmUpOwogICAgICAgICBwaGlbMi1sYWddWzFdWzFdID0gYXV0b2NvcnJfY2FsYyhhY2N1X2ltKTsKQEAgLTE1NiwyOCArMTcxLDI4IEBACiAgICAgICAgIGlmIChsYWcgPT0gMSkgewogICAgICAgICAgICAgYWNjdV9yZSA9IHJlYWxfc3VtOwogICAgICAgICAgICAgYWNjdV9pbSA9IGltYWdfc3VtOwotICAgICAgICAgICAgYWNjdV9yZSArPSAoaW50NjRfdCl4WzM4XVswXSAqIHhbMzldWzBdOwotICAgICAgICAgICAgYWNjdV9yZSArPSAoaW50NjRfdCl4WzM4XVsxXSAqIHhbMzldWzFdOwotICAgICAgICAgICAgYWNjdV9pbSArPSAoaW50NjRfdCl4WzM4XVswXSAqIHhbMzldWzFdOwotICAgICAgICAgICAgYWNjdV9pbSAtPSAoaW50NjRfdCl4WzM4XVsxXSAqIHhbMzldWzBdOworICAgICAgICAgICAgYWNjdV9yZSArPSAodWludDY0X3QpeFszOF1bMF0gKiB4WzM5XVswXTsKKyAgICAgICAgICAgIGFjY3VfcmUgKz0gKHVpbnQ2NF90KXhbMzhdWzFdICogeFszOV1bMV07CisgICAgICAgICAgICBhY2N1X2ltICs9ICh1aW50NjRfdCl4WzM4XVswXSAqIHhbMzldWzFdOworICAgICAgICAgICAgYWNjdV9pbSAtPSAodWludDY0X3QpeFszOF1bMV0gKiB4WzM5XVswXTsKIAogICAgICAgICAgICAgcGhpWzBdWzBdWzBdID0gYXV0b2NvcnJfY2FsYyhhY2N1X3JlKTsKICAgICAgICAgICAgIHBoaVswXVswXVsxXSA9IGF1dG9jb3JyX2NhbGMoYWNjdV9pbSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMzg7IGkrKykgewotICAgICAgICAgICAgYWNjdV9yZSArPSAoaW50NjRfdCl4W2ldWzBdICogeFtpXVswXTsKLSAgICAgICAgICAgIGFjY3VfcmUgKz0gKGludDY0X3QpeFtpXVsxXSAqIHhbaV1bMV07CisgICAgICAgICAgICBhY2N1X3JlICs9ICh1aW50NjRfdCl4W2ldWzBdICogeFtpXVswXTsKKyAgICAgICAgICAgIGFjY3VfcmUgKz0gKHVpbnQ2NF90KXhbaV1bMV0gKiB4W2ldWzFdOwogICAgICAgICB9CiAgICAgICAgIHJlYWxfc3VtID0gYWNjdV9yZTsKLSAgICAgICAgYWNjdV9yZSArPSAoaW50NjRfdCl4WyAwXVswXSAqIHhbIDBdWzBdOwotICAgICAgICBhY2N1X3JlICs9IChpbnQ2NF90KXhbIDBdWzFdICogeFsgMF1bMV07CisgICAgICAgIGFjY3VfcmUgKz0gKHVpbnQ2NF90KXhbIDBdWzBdICogeFsgMF1bMF07CisgICAgICAgIGFjY3VfcmUgKz0gKHVpbnQ2NF90KXhbIDBdWzFdICogeFsgMF1bMV07CiAKICAgICAgICAgcGhpWzJdWzFdWzBdID0gYXV0b2NvcnJfY2FsYyhhY2N1X3JlKTsKIAogICAgICAgICBhY2N1X3JlID0gcmVhbF9zdW07Ci0gICAgICAgIGFjY3VfcmUgKz0gKGludDY0X3QpeFszOF1bMF0gKiB4WzM4XVswXTsKLSAgICAgICAgYWNjdV9yZSArPSAoaW50NjRfdCl4WzM4XVsxXSAqIHhbMzhdWzFdOworICAgICAgICBhY2N1X3JlICs9ICh1aW50NjRfdCl4WzM4XVswXSAqIHhbMzhdWzBdOworICAgICAgICBhY2N1X3JlICs9ICh1aW50NjRfdCl4WzM4XVsxXSAqIHhbMzhdWzFdOwogCiAgICAgICAgIHBoaVsxXVswXVswXSA9IGF1dG9jb3JyX2NhbGMoYWNjdV9yZSk7CiAgICAgfQpAQCAtMjI5LDIwICsyNDQsMjIgQEAKIHN0YXRpYyB2b2lkIHNicl9oZl9nX2ZpbHRfYyhpbnQgKCpZKVsyXSwgY29uc3QgaW50ICgqWF9oaWdoKVs0MF1bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNvZnRGbG9hdCAqZ19maWx0LCBpbnQgbV9tYXgsIGludHB0cl90IGl4aCkKIHsKLSAgICBpbnQgbSwgcjsKKyAgICBpbnQgbTsKICAgICBpbnQ2NF90IGFjY3U7CiAKICAgICBmb3IgKG0gPSAwOyBtIDwgbV9tYXg7IG0rKykgewotICAgICAgICByID0gMSA8PCAoMjItZ19maWx0W21dLmV4cCk7Ci0gICAgICAgIGFjY3UgPSAoaW50NjRfdClYX2hpZ2hbbV1baXhoXVswXSAqICgoZ19maWx0W21dLm1hbnQgKyAweDQwKT4+Nyk7Ci0gICAgICAgIFlbbV1bMF0gPSAoaW50KSgoYWNjdSArIHIpID4+ICgyMy1nX2ZpbHRbbV0uZXhwKSk7CisgICAgICAgIGlmICgyMiAtIGdfZmlsdFttXS5leHAgPCA2MSkgeworICAgICAgICAgICAgaW50NjRfdCByID0gMUxMIDw8ICgyMi1nX2ZpbHRbbV0uZXhwKTsKKyAgICAgICAgICAgIGFjY3UgPSAoaW50NjRfdClYX2hpZ2hbbV1baXhoXVswXSAqICgoZ19maWx0W21dLm1hbnQgKyAweDQwKT4+Nyk7CisgICAgICAgICAgICBZW21dWzBdID0gKGludCkoKGFjY3UgKyByKSA+PiAoMjMtZ19maWx0W21dLmV4cCkpOwogCi0gICAgICAgIGFjY3UgPSAoaW50NjRfdClYX2hpZ2hbbV1baXhoXVsxXSAqICgoZ19maWx0W21dLm1hbnQgKyAweDQwKT4+Nyk7Ci0gICAgICAgIFlbbV1bMV0gPSAoaW50KSgoYWNjdSArIHIpID4+ICgyMy1nX2ZpbHRbbV0uZXhwKSk7CisgICAgICAgICAgICBhY2N1ID0gKGludDY0X3QpWF9oaWdoW21dW2l4aF1bMV0gKiAoKGdfZmlsdFttXS5tYW50ICsgMHg0MCk+PjcpOworICAgICAgICAgICAgWVttXVsxXSA9IChpbnQpKChhY2N1ICsgcikgPj4gKDIzLWdfZmlsdFttXS5leHApKTsKKyAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzYnJfaGZfYXBwbHlfbm9pc2UoaW50ICgqWSlbMl0sCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgc2JyX2hmX2FwcGx5X25vaXNlKGludCAoKlkpWzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU29mdEZsb2F0ICpzX20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTb2Z0RmxvYXQgKnFfZmlsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub2lzZSwKQEAgLTI1MywxNCArMjcwLDE3IEBACiAgICAgaW50IG07CiAKICAgICBmb3IgKG0gPSAwOyBtIDwgbV9tYXg7IG0rKykgewotICAgICAgICBpbnQgeTAgPSBZW21dWzBdOwotICAgICAgICBpbnQgeTEgPSBZW21dWzFdOworICAgICAgICB1bnNpZ25lZCB5MCA9IFlbbV1bMF07CisgICAgICAgIHVuc2lnbmVkIHkxID0gWVttXVsxXTsKICAgICAgICAgbm9pc2UgPSAobm9pc2UgKyAxKSAmIDB4MWZmOwogICAgICAgICBpZiAoc19tW21dLm1hbnQpIHsKICAgICAgICAgICAgIGludCBzaGlmdCwgcm91bmQ7CiAKICAgICAgICAgICAgIHNoaWZ0ID0gMjIgLSBzX21bbV0uZXhwOwotICAgICAgICAgICAgaWYgKHNoaWZ0IDwgMzApIHsKKyAgICAgICAgICAgIGlmIChzaGlmdCA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3ZlcmZsb3cgaW4gc2JyX2hmX2FwcGx5X25vaXNlLCBzaGlmdD0lZFxuIiwgc2hpZnQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVSQU5HRSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMzApIHsKICAgICAgICAgICAgICAgICByb3VuZCA9IDEgPDwgKHNoaWZ0LTEpOwogICAgICAgICAgICAgICAgIHkwICs9IChzX21bbV0ubWFudCAqIHBoaV9zaWduMCArIHJvdW5kKSA+PiBzaGlmdDsKICAgICAgICAgICAgICAgICB5MSArPSAoc19tW21dLm1hbnQgKiBwaGlfc2lnbjEgKyByb3VuZCkgPj4gc2hpZnQ7CkBAIC0yNzAsNyArMjkwLDEwIEBACiAgICAgICAgICAgICBpbnQ2NF90IGFjY3U7CiAKICAgICAgICAgICAgIHNoaWZ0ID0gMjIgLSBxX2ZpbHRbbV0uZXhwOwotICAgICAgICAgICAgaWYgKHNoaWZ0IDwgMzApIHsKKyAgICAgICAgICAgIGlmIChzaGlmdCA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiT3ZlcmZsb3cgaW4gc2JyX2hmX2FwcGx5X25vaXNlLCBzaGlmdD0lZFxuIiwgc2hpZnQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVSQU5HRSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNoaWZ0IDwgMzApIHsKICAgICAgICAgICAgICAgICByb3VuZCA9IDEgPDwgKHNoaWZ0LTEpOwogCiAgICAgICAgICAgICAgICAgYWNjdSA9IChpbnQ2NF90KXFfZmlsdFttXS5tYW50ICogZmZfc2JyX25vaXNlX3RhYmxlX2ZpeGVkW25vaXNlXVswXTsKQEAgLTI4Niw2ICszMDksNyBAQAogICAgICAgICBZW21dWzFdID0geTE7CiAgICAgICAgIHBoaV9zaWduMSA9IC1waGlfc2lnbjE7CiAgICAgfQorICAgIHJldHVybiAwOwogfQogCiAjaW5jbHVkZSAic2JyZHNwX3RlbXBsYXRlLmMiCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NicmRzcF90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9zYnJkc3BfdGVtcGxhdGUuYwppbmRleCBiNjQ5ZGZkLi4zN2EzMzY1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3NicmRzcF90ZW1wbGF0ZS5jCisrKyBiL2xpYmF2Y29kZWMvc2JyZHNwX3RlbXBsYXRlLmMKQEAgLTMzLDggKzMzLDEzIEBACiB7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKLSAgICAgICAgdlsgICAgICBpXSA9IEFBQ19TUkFfUigoc3JjMFtpXSAtIHNyYzFbNjMgLSBpXSksIDUpOwotICAgICAgICB2WzEyNyAtIGldID0gQUFDX1NSQV9SKChzcmMwW2ldICsgc3JjMVs2MyAtIGldKSwgNSk7CisjaWYgVVNFX0ZJWEVECisgICAgICAgIHZbICAgICAgaV0gPSAoaW50KSgweDEwVSArIHNyYzBbaV0gLSBzcmMxWzYzIC0gaV0pID4+IDU7CisgICAgICAgIHZbMTI3IC0gaV0gPSAoaW50KSgweDEwVSArIHNyYzBbaV0gKyBzcmMxWzYzIC0gaV0pID4+IDU7CisjZWxzZQorICAgICAgICB2WyAgICAgIGldID0gc3JjMFtpXSAtIHNyYzFbNjMgLSBpXTsKKyAgICAgICAgdlsxMjcgLSBpXSA9IHNyYzBbaV0gKyBzcmMxWzYzIC0gaV07CisjZW5kaWYKICAgICB9CiB9CiAKQEAgLTg5LDYgKzk0LDggQEAKICNpZiAhVVNFX0ZJWEVECiAgICAgaWYgKEFSQ0hfQVJNKQogICAgICAgICBmZl9zYnJkc3BfaW5pdF9hcm0ocyk7CisgICAgaWYgKEFSQ0hfQUFSQ0g2NCkKKyAgICAgICAgZmZfc2JyZHNwX2luaXRfYWFyY2g2NChzKTsKICAgICBpZiAoQVJDSF9YODYpCiAgICAgICAgIGZmX3NicmRzcF9pbml0X3g4NihzKTsKICAgICBpZiAoQVJDSF9NSVBTKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zY3ByLmMgYi9saWJhdmNvZGVjL3NjcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODU2MDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9zY3ByLmMKQEAgLTAsMCArMSw5MjcgQEAKKy8qCisgKiBTY3JlZW5QcmVzc29yIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIFRPUCAgMHgwMTAwMDAwMAorI2RlZmluZSBCT1QgICAgMHgwMTAwMDAKKwordHlwZWRlZiBzdHJ1Y3QgUmFuZ2VDb2RlciB7CisgICAgdW5zaWduZWQgICBjb2RlOworICAgIHVuc2lnbmVkICAgcmFuZ2U7CisgICAgdW5zaWduZWQgICBjb2RlMTsKK30gUmFuZ2VDb2RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgUGl4ZWxNb2RlbCB7CisgICAgdW5zaWduZWQgICAgZnJlcVsyNTZdOworICAgIHVuc2lnbmVkICAgIGxvb2t1cFsxNl07CisgICAgdW5zaWduZWQgICAgdG90YWxfZnJlcTsKK30gUGl4ZWxNb2RlbDsKKwordHlwZWRlZiBzdHJ1Y3QgU0NQUkNvbnRleHQgeworICAgIEFWRnJhbWUgICAgICAgICpsYXN0X2ZyYW1lOworICAgIEFWRnJhbWUgICAgICAgICpjdXJyZW50X2ZyYW1lOworICAgIEdldEJ5dGVDb250ZXh0ICBnYjsKKyAgICBSYW5nZUNvZGVyICAgICAgcmM7CisgICAgUGl4ZWxNb2RlbCAgICAgIHBpeGVsX21vZGVsWzNdWzQwOTZdOworICAgIHVuc2lnbmVkICAgICAgICBvcF9tb2RlbFs2XVs3XTsKKyAgICB1bnNpZ25lZCAgICAgICAgcnVuX21vZGVsWzZdWzI1N107CisgICAgdW5zaWduZWQgICAgICAgIHJhbmdlX21vZGVsWzI1N107CisgICAgdW5zaWduZWQgICAgICAgIGNvdW50X21vZGVsWzI1N107CisgICAgdW5zaWduZWQgICAgICAgIGZpbGxfbW9kZWxbNl07CisgICAgdW5zaWduZWQgICAgICAgIHN4eV9tb2RlbFs0XVsxN107CisgICAgdW5zaWduZWQgICAgICAgIG12X21vZGVsWzJdWzUxM107CisgICAgdW5zaWduZWQgICAgICAgIG5ieCwgbmJ5OworICAgIHVuc2lnbmVkICAgICAgICBuYmNvdW50OworICAgIHVuc2lnbmVkICAgICAgICpibG9ja3M7CisgICAgdW5zaWduZWQgICAgICAgIGNiaXRzOworICAgIGludCAgICAgICAgICAgICBjeHNoaWZ0OworCisgICAgaW50ICAgICAgICAgICAoKmdldF9mcmVxKShSYW5nZUNvZGVyICpyYywgdW5zaWduZWQgdG90YWxfZnJlcSwgdW5zaWduZWQgKmZyZXEpOworICAgIGludCAgICAgICAgICAgKCpkZWNvZGUpKEdldEJ5dGVDb250ZXh0ICpnYiwgUmFuZ2VDb2RlciAqcmMsIHVuc2lnbmVkIGN1bUZyZXEsIHVuc2lnbmVkIGZyZXEsIHVuc2lnbmVkIHRvdGFsX2ZyZXEpOworfSBTQ1BSQ29udGV4dDsKKworc3RhdGljIHZvaWQgaW5pdF9yYW5nZWNvZGVyKFJhbmdlQ29kZXIgKnJjLCBHZXRCeXRlQ29udGV4dCAqZ2IpCit7CisgICAgcmMtPmNvZGUxID0gMDsKKyAgICByYy0+cmFuZ2UgPSAweEZGRkZGRkZGVTsKKyAgICByYy0+Y29kZSAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMihnYik7Cit9CisKK3N0YXRpYyB2b2lkIHJlaW5pdF90YWJsZXMoU0NQUkNvbnRleHQgKnMpCit7CisgICAgaW50IGNvbXAsIGksIGo7CisKKyAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgMzsgY29tcCsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0MDk2OyBqKyspIHsKKyAgICAgICAgICAgIGlmIChzLT5waXhlbF9tb2RlbFtjb21wXVtqXS50b3RhbF9mcmVxICE9IDI1NikgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgcy0+cGl4ZWxfbW9kZWxbY29tcF1bal0uZnJlcVtpXSA9IDE7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICAgICAgICAgIHMtPnBpeGVsX21vZGVsW2NvbXBdW2pdLmxvb2t1cFtpXSA9IDE2OworICAgICAgICAgICAgICAgIHMtPnBpeGVsX21vZGVsW2NvbXBdW2pdLnRvdGFsX2ZyZXEgPSAyNTY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgNjsgaisrKSB7CisgICAgICAgIHVuc2lnbmVkICpwID0gcy0+cnVuX21vZGVsW2pdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgICAgICAgICBwW2ldID0gMTsKKyAgICAgICAgcFsyNTZdID0gMjU2OworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCA2OyBqKyspIHsKKyAgICAgICAgdW5zaWduZWQgKm9wID0gcy0+b3BfbW9kZWxbal07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisgICAgICAgICAgICBvcFtpXSA9IDE7CisgICAgICAgIG9wWzZdID0gNjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgcy0+cmFuZ2VfbW9kZWxbaV0gPSAxOworICAgICAgICBzLT5jb3VudF9tb2RlbFtpXSA9IDE7CisgICAgfQorICAgIHMtPnJhbmdlX21vZGVsWzI1Nl0gPSAyNTY7CisgICAgcy0+Y291bnRfbW9kZWxbMjU2XSA9IDI1NjsKKworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgcy0+ZmlsbF9tb2RlbFtpXSA9IDE7CisgICAgfQorICAgIHMtPmZpbGxfbW9kZWxbNV0gPSA1OworCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgcy0+c3h5X21vZGVsW2pdW2ldID0gMTsKKyAgICAgICAgfQorICAgICAgICBzLT5zeHlfbW9kZWxbal1bMTZdID0gMTY7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDUxMjsgaSsrKSB7CisgICAgICAgIHMtPm12X21vZGVsWzBdW2ldID0gMTsKKyAgICAgICAgcy0+bXZfbW9kZWxbMV1baV0gPSAxOworICAgIH0KKyAgICBzLT5tdl9tb2RlbFswXVs1MTJdID0gNTEyOworICAgIHMtPm12X21vZGVsWzFdWzUxMl0gPSA1MTI7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlKEdldEJ5dGVDb250ZXh0ICpnYiwgUmFuZ2VDb2RlciAqcmMsIHVuc2lnbmVkIGN1bUZyZXEsIHVuc2lnbmVkIGZyZXEsIHVuc2lnbmVkIHRvdGFsX2ZyZXEpCit7CisgICAgcmMtPmNvZGUgLT0gY3VtRnJlcSAqIHJjLT5yYW5nZTsKKyAgICByYy0+cmFuZ2UgKj0gZnJlcTsKKworICAgIHdoaWxlIChyYy0+cmFuZ2UgPCBUT1AgJiYgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpID4gMCkgeworICAgICAgICB1bnNpZ25lZCBieXRlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgICAgICByYy0+Y29kZSA9IChyYy0+Y29kZSA8PCA4KSB8IGJ5dGU7CisgICAgICAgIHJjLT5yYW5nZSA8PD0gODsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZnJlcShSYW5nZUNvZGVyICpyYywgdW5zaWduZWQgdG90YWxfZnJlcSwgdW5zaWduZWQgKmZyZXEpCit7CisgICAgaWYgKHRvdGFsX2ZyZXEgPT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICByYy0+cmFuZ2UgPSByYy0+cmFuZ2UgLyB0b3RhbF9mcmVxOworCisgICAgaWYgKHJjLT5yYW5nZSA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICpmcmVxID0gcmMtPmNvZGUgLyByYy0+cmFuZ2U7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGUwKEdldEJ5dGVDb250ZXh0ICpnYiwgUmFuZ2VDb2RlciAqcmMsIHVuc2lnbmVkIGN1bUZyZXEsIHVuc2lnbmVkIGZyZXEsIHVuc2lnbmVkIHRvdGFsX2ZyZXEpCit7CisgICAgdW5zaWduZWQgdDsKKworICAgIGlmICh0b3RhbF9mcmVxID09IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgdCA9IHJjLT5yYW5nZSAqICh1aW50NjRfdCljdW1GcmVxIC8gdG90YWxfZnJlcTsKKworICAgIHJjLT5jb2RlMSArPSB0ICsgMTsKKyAgICByYy0+cmFuZ2UgPSByYy0+cmFuZ2UgKiAodWludDY0X3QpKGZyZXEgKyBjdW1GcmVxKSAvIHRvdGFsX2ZyZXEgLSAodCArIDEpOworCisgICAgd2hpbGUgKHJjLT5yYW5nZSA8IFRPUCAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPiAwKSB7CisgICAgICAgIHVuc2lnbmVkIGJ5dGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7CisgICAgICAgIHJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IDgpIHwgYnl0ZTsKKyAgICAgICAgcmMtPmNvZGUxIDw8PSA4OworICAgICAgICByYy0+cmFuZ2UgPDw9IDg7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZXEwKFJhbmdlQ29kZXIgKnJjLCB1bnNpZ25lZCB0b3RhbF9mcmVxLCB1bnNpZ25lZCAqZnJlcSkKK3sKKyAgICBpZiAocmMtPnJhbmdlID09IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgKmZyZXEgPSB0b3RhbF9mcmVxICogKHVpbnQ2NF90KShyYy0+Y29kZSAtIHJjLT5jb2RlMSkgLyByYy0+cmFuZ2U7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfdmFsdWUoU0NQUkNvbnRleHQgKnMsIHVuc2lnbmVkICpjbnQsIHVuc2lnbmVkIG1heGMsIHVuc2lnbmVkIHN0ZXAsIHVuc2lnbmVkICpydmFsKQoreworICAgIEdldEJ5dGVDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBSYW5nZUNvZGVyICpyYyA9ICZzLT5yYzsKKyAgICB1bnNpZ25lZCB0b3RmciA9IGNudFttYXhjXTsKKyAgICB1bnNpZ25lZCB2YWx1ZTsKKyAgICB1bnNpZ25lZCBjID0gMCwgY3VtZnIgPSAwLCBjbnRfYyA9IDA7CisgICAgaW50IGksIHJldDsKKworICAgIGlmICgocmV0ID0gcy0+Z2V0X2ZyZXEocmMsIHRvdGZyLCAmdmFsdWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB3aGlsZSAoYyA8IG1heGMpIHsKKyAgICAgICAgY250X2MgPSBjbnRbY107CisgICAgICAgIGlmICh2YWx1ZSA+PSBjdW1mciArIGNudF9jKQorICAgICAgICAgICAgY3VtZnIgKz0gY250X2M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjKys7CisgICAgfQorCisgICAgaWYgKGMgPj0gbWF4YykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoKHJldCA9IHMtPmRlY29kZShnYiwgcmMsIGN1bWZyLCBjbnRfYywgdG90ZnIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBjbnRbY10gPSBjbnRfYyArIHN0ZXA7CisgICAgdG90ZnIgKz0gc3RlcDsKKyAgICBpZiAodG90ZnIgPiBCT1QpIHsKKyAgICAgICAgdG90ZnIgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4YzsgaSsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBuYyA9IChjbnRbaV0gPj4gMSkgKyAxOworICAgICAgICAgICAgY250W2ldID0gbmM7CisgICAgICAgICAgICB0b3RmciArPSBuYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNudFttYXhjXSA9IHRvdGZyOworICAgICpydmFsID0gYzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29kZV91bml0KFNDUFJDb250ZXh0ICpzLCBQaXhlbE1vZGVsICpwaXhlbCwgdW5zaWduZWQgc3RlcCwgdW5zaWduZWQgKnJ2YWwpCit7CisgICAgR2V0Qnl0ZUNvbnRleHQgKmdiID0gJnMtPmdiOworICAgIFJhbmdlQ29kZXIgKnJjID0gJnMtPnJjOworICAgIHVuc2lnbmVkIHRvdGZyID0gcGl4ZWwtPnRvdGFsX2ZyZXE7CisgICAgdW5zaWduZWQgdmFsdWUsIHggPSAwLCBjdW1mciA9IDAsIGNudF94ID0gMDsKKyAgICBpbnQgaSwgaiwgcmV0LCBjLCBjbnRfYzsKKworICAgIGlmICgocmV0ID0gcy0+Z2V0X2ZyZXEocmMsIHRvdGZyLCAmdmFsdWUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB3aGlsZSAoeCA8IDE2KSB7CisgICAgICAgIGNudF94ID0gcGl4ZWwtPmxvb2t1cFt4XTsKKyAgICAgICAgaWYgKHZhbHVlID49IGN1bWZyICsgY250X3gpCisgICAgICAgICAgICBjdW1mciArPSBjbnRfeDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHgrKzsKKyAgICB9CisKKyAgICBjID0geCAqIDE2OworICAgIGNudF9jID0gMDsKKyAgICB3aGlsZSAoYyA8IDI1NikgeworICAgICAgICBjbnRfYyA9IHBpeGVsLT5mcmVxW2NdOworICAgICAgICBpZiAodmFsdWUgPj0gY3VtZnIgKyBjbnRfYykKKyAgICAgICAgICAgIGN1bWZyICs9IGNudF9jOworICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYysrOworICAgIH0KKyAgICBpZiAoeCA+PSAxNiB8fCBjID49IDI1NikgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHMtPmRlY29kZShnYiwgcmMsIGN1bWZyLCBjbnRfYywgdG90ZnIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwaXhlbC0+ZnJlcVtjXSA9IGNudF9jICsgc3RlcDsKKyAgICBwaXhlbC0+bG9va3VwW3hdID0gY250X3ggKyBzdGVwOworICAgIHRvdGZyICs9IHN0ZXA7CisgICAgaWYgKHRvdGZyID4gQk9UKSB7CisgICAgICAgIHRvdGZyID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBuYyA9IChwaXhlbC0+ZnJlcVtpXSA+PiAxKSArIDE7CisgICAgICAgICAgICBwaXhlbC0+ZnJlcVtpXSA9IG5jOworICAgICAgICAgICAgdG90ZnIgKz0gbmM7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHN1bSA9IDA7CisgICAgICAgICAgICB1bnNpZ25lZCBpMTZfMTcgPSBpIDw8IDQ7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgICAgICBzdW0gKz0gcGl4ZWwtPmZyZXFbaTE2XzE3ICsgal07CisgICAgICAgICAgICBwaXhlbC0+bG9va3VwW2ldID0gc3VtOworICAgICAgICB9CisgICAgfQorICAgIHBpeGVsLT50b3RhbF9mcmVxID0gdG90ZnI7CisKKyAgICAqcnZhbCA9IGMgJiBzLT5jYml0czsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29tcHJlc3NfaShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQzMl90ICpkc3QsIGludCBsaW5lc2l6ZSkKK3sKKyAgICBTQ1BSQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qnl0ZUNvbnRleHQgKmdiID0gJnMtPmdiOworICAgIGludCBjeCA9IDAsIGN4MSA9IDAsIGsgPSAwLCBjbHIgPSAwOworICAgIGludCBydW4sIHIsIGcsIGIsIG9mZiwgeSA9IDAsIHggPSAwLCB6LCByZXQ7CisgICAgdW5zaWduZWQgYmFja3N0ZXAgPSBsaW5lc2l6ZSAtIGF2Y3R4LT53aWR0aDsKKyAgICBjb25zdCBpbnQgY3hzaGlmdCA9IHMtPmN4c2hpZnQ7CisgICAgdW5zaWduZWQgbHgsIGx5LCBwdHlwZTsKKworICAgIHJlaW5pdF90YWJsZXMocyk7CisgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMik7CisgICAgaW5pdF9yYW5nZWNvZGVyKCZzLT5yYywgZ2IpOworCisgICAgd2hpbGUgKGsgPCBhdmN0eC0+d2lkdGggKyAxKSB7CisgICAgICAgIHJldCA9IGRlY29kZV91bml0KHMsICZzLT5waXhlbF9tb2RlbFswXVtjeCArIGN4MV0sIDQwMCwgJnIpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgY3gxID0gKGN4IDw8IDYpICYgMHhGQzA7CisgICAgICAgIGN4ID0gciA+PiBjeHNoaWZ0OworICAgICAgICByZXQgPSBkZWNvZGVfdW5pdChzLCAmcy0+cGl4ZWxfbW9kZWxbMV1bY3ggKyBjeDFdLCA0MDAsICZnKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGN4MSA9IChjeCA8PCA2KSAmIDB4RkMwOworICAgICAgICBjeCA9IGcgPj4gY3hzaGlmdDsKKyAgICAgICAgcmV0ID0gZGVjb2RlX3VuaXQocywgJnMtPnBpeGVsX21vZGVsWzJdW2N4ICsgY3gxXSwgNDAwLCAmYik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBjeDEgPSAoY3ggPDwgNikgJiAweEZDMDsKKyAgICAgICAgY3ggPSBiID4+IGN4c2hpZnQ7CisKKyAgICAgICAgcmV0ID0gZGVjb2RlX3ZhbHVlKHMsIHMtPnJ1bl9tb2RlbFswXSwgMjU2LCA0MDAsICZydW4pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgY2xyID0gKGIgPDwgMTYpICsgKGcgPDwgOCkgKyByOworICAgICAgICBrICs9IHJ1bjsKKyAgICAgICAgd2hpbGUgKHJ1bi0tID4gMCkgeworICAgICAgICAgICAgaWYgKHkgPj0gYXZjdHgtPmhlaWdodCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgZHN0W3kgKiBsaW5lc2l6ZSArIHhdID0gY2xyOworICAgICAgICAgICAgbHggPSB4OworICAgICAgICAgICAgbHkgPSB5OworICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgaWYgKHggPj0gYXZjdHgtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG9mZiA9IC1saW5lc2l6ZSAtIDE7CisgICAgcHR5cGUgPSAwOworCisgICAgd2hpbGUgKHggPCBhdmN0eC0+d2lkdGggJiYgeSA8IGF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgcmV0ID0gZGVjb2RlX3ZhbHVlKHMsIHMtPm9wX21vZGVsW3B0eXBlXSwgNiwgMTAwMCwgJnB0eXBlKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAocHR5cGUgPT0gMCkgeworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3VuaXQocywgJnMtPnBpeGVsX21vZGVsWzBdW2N4ICsgY3gxXSwgNDAwLCAmcik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBjeDEgPSAoY3ggPDwgNikgJiAweEZDMDsKKyAgICAgICAgICAgIGN4ID0gciA+PiBjeHNoaWZ0OworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3VuaXQocywgJnMtPnBpeGVsX21vZGVsWzFdW2N4ICsgY3gxXSwgNDAwLCAmZyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBjeDEgPSAoY3ggPDwgNikgJiAweEZDMDsKKyAgICAgICAgICAgIGN4ID0gZyA+PiBjeHNoaWZ0OworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3VuaXQocywgJnMtPnBpeGVsX21vZGVsWzJdW2N4ICsgY3gxXSwgNDAwLCAmYik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBjbHIgPSAoYiA8PCAxNikgKyAoZyA8PCA4KSArIHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHB0eXBlID4gNSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICByZXQgPSBkZWNvZGVfdmFsdWUocywgcy0+cnVuX21vZGVsW3B0eXBlXSwgMjU2LCA0MDAsICZydW4pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgc3dpdGNoIChwdHlwZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICB3aGlsZSAocnVuLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHkgPj0gYXZjdHgtPmhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICBkc3RbeSAqIGxpbmVzaXplICsgeF0gPSBjbHI7CisgICAgICAgICAgICAgICAgbHggPSB4OworICAgICAgICAgICAgICAgIGx5ID0geTsKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICAgICAgaWYgKHggPj0gYXZjdHgtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgICAgICB5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHdoaWxlIChydW4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeSA+PSBhdmN0eC0+aGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgIGRzdFt5ICogbGluZXNpemUgKyB4XSA9IGRzdFtseSAqIGxpbmVzaXplICsgbHhdOworICAgICAgICAgICAgICAgIGx4ID0geDsKKyAgICAgICAgICAgICAgICBseSA9IHk7CisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgICAgIGlmICh4ID49IGF2Y3R4LT53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsciA9IGRzdFtseSAqIGxpbmVzaXplICsgbHhdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHdoaWxlIChydW4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeSA8IDEgfHwgeSA+PSBhdmN0eC0+aGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgIGNsciA9IGRzdFt5ICogbGluZXNpemUgKyB4ICsgb2ZmICsgMV07CisgICAgICAgICAgICAgICAgZHN0W3kgKiBsaW5lc2l6ZSArIHhdID0gY2xyOworICAgICAgICAgICAgICAgIGx4ID0geDsKKyAgICAgICAgICAgICAgICBseSA9IHk7CisgICAgICAgICAgICAgICAgeCsrOworICAgICAgICAgICAgICAgIGlmICh4ID49IGF2Y3R4LT53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICB3aGlsZSAocnVuLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqb2RzdCA9ICh1aW50OF90ICopZHN0OworCisgICAgICAgICAgICAgICAgaWYgKHkgPCAxIHx8IHkgPj0gYXZjdHgtPmhlaWdodCB8fAorICAgICAgICAgICAgICAgICAgICAoeSA9PSAxICYmIHggPT0gMCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgaWYgKHggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB6ID0gYmFja3N0ZXA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgciA9IG9kc3RbKGx5ICogbGluZXNpemUgKyBseCkgKiA0XSArCisgICAgICAgICAgICAgICAgICAgIG9kc3RbKCh5ICogbGluZXNpemUgKyB4KSArIG9mZikgKiA0ICsgNF0gLQorICAgICAgICAgICAgICAgICAgICBvZHN0WygoeSAqIGxpbmVzaXplICsgeCkgKyBvZmYgLSB6KSAqIDRdOworICAgICAgICAgICAgICAgIGcgPSBvZHN0WyhseSAqIGxpbmVzaXplICsgbHgpICogNCArIDFdICsKKyAgICAgICAgICAgICAgICAgICAgb2RzdFsoKHkgKiBsaW5lc2l6ZSArIHgpICsgb2ZmKSAqIDQgKyA1XSAtCisgICAgICAgICAgICAgICAgICAgIG9kc3RbKCh5ICogbGluZXNpemUgKyB4KSArIG9mZiAtIHopICogNCArIDFdOworICAgICAgICAgICAgICAgIGIgPSBvZHN0WyhseSAqIGxpbmVzaXplICsgbHgpICogNCArIDJdICsKKyAgICAgICAgICAgICAgICAgICAgb2RzdFsoKHkgKiBsaW5lc2l6ZSArIHgpICsgb2ZmKSAqIDQgKyA2XSAtCisgICAgICAgICAgICAgICAgICAgIG9kc3RbKCh5ICogbGluZXNpemUgKyB4KSArIG9mZiAtIHopICogNCArIDJdOworICAgICAgICAgICAgICAgIGNsciA9ICgoYiAmIDB4RkYpIDw8IDE2KSArICgoZyAmIDB4RkYpIDw8IDgpICsgKHIgJiAweEZGKTsKKyAgICAgICAgICAgICAgICBkc3RbeSAqIGxpbmVzaXplICsgeF0gPSBjbHI7CisgICAgICAgICAgICAgICAgbHggPSB4OworICAgICAgICAgICAgICAgIGx5ID0geTsKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICAgICAgaWYgKHggPj0gYXZjdHgtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgICAgICAgICB5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgIHdoaWxlIChydW4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoeSA8IDEgfHwgeSA+PSBhdmN0eC0+aGVpZ2h0IHx8CisgICAgICAgICAgICAgICAgICAgICh5ID09IDEgJiYgeCA9PSAwKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICBpZiAoeCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHogPSBiYWNrc3RlcDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB6ID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjbHIgPSBkc3RbeSAqIGxpbmVzaXplICsgeCArIG9mZiAtIHpdOworICAgICAgICAgICAgICAgIGRzdFt5ICogbGluZXNpemUgKyB4XSA9IGNscjsKKyAgICAgICAgICAgICAgICBseCA9IHg7CisgICAgICAgICAgICAgICAgbHkgPSB5OworICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgICAgICBpZiAoeCA+PSBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHkrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2KSB7CisgICAgICAgICAgICBjeDEgPSAoY2xyICYgMHgzRjAwKSA+PiAyOworICAgICAgICAgICAgY3ggPSAoY2xyICYgMHgzRkZGRkYpID4+IDE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3gxID0gKGNsciAmIDB4RkMwMCkgPj4gNDsKKyAgICAgICAgICAgIGN4ID0gKGNsciAmIDB4RkZGRkZGKSA+PiAxODsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlY29tcHJlc3NfcChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZHN0LCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcHJldiwgaW50IHBsaW5lc2l6ZSkKK3sKKyAgICBTQ1BSQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qnl0ZUNvbnRleHQgKmdiID0gJnMtPmdiOworICAgIGludCByZXQsIHRlbXAgPSAwLCBtaW4sIG1heCwgeCwgeSwgY3ggPSAwLCBjeDEgPSAwOworICAgIGludCBiYWNrc3RlcCA9IGxpbmVzaXplIC0gYXZjdHgtPndpZHRoOworICAgIGNvbnN0IGludCBjeHNoaWZ0ID0gcy0+Y3hzaGlmdDsKKworICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgPT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMSk7CisgICAgaW5pdF9yYW5nZWNvZGVyKCZzLT5yYywgZ2IpOworCisgICAgcmV0ICA9IGRlY29kZV92YWx1ZShzLCBzLT5yYW5nZV9tb2RlbCwgMjU2LCAxLCAmbWluKTsKKyAgICByZXQgfD0gZGVjb2RlX3ZhbHVlKHMsIHMtPnJhbmdlX21vZGVsLCAyNTYsIDEsICZ0ZW1wKTsKKyAgICBtaW4gKz0gdGVtcCA8PCA4OworICAgIHJldCB8PSBkZWNvZGVfdmFsdWUocywgcy0+cmFuZ2VfbW9kZWwsIDI1NiwgMSwgJm1heCk7CisgICAgcmV0IHw9IGRlY29kZV92YWx1ZShzLCBzLT5yYW5nZV9tb2RlbCwgMjU2LCAxLCAmdGVtcCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBtYXggKz0gdGVtcCA8PCA4OworICAgIGlmIChtaW4gPiBtYXgpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgbWVtc2V0KHMtPmJsb2NrcywgMCwgc2l6ZW9mKCpzLT5ibG9ja3MpICogcy0+bmJjb3VudCk7CisKKyAgICB3aGlsZSAobWluIDw9IG1heCkgeworICAgICAgICBpbnQgZmlsbCwgY291bnQ7CisKKyAgICAgICAgcmV0ICA9IGRlY29kZV92YWx1ZShzLCBzLT5maWxsX21vZGVsLCAgNSwgICAxMCwgJmZpbGwpOworICAgICAgICByZXQgfD0gZGVjb2RlX3ZhbHVlKHMsIHMtPmNvdW50X21vZGVsLCAyNTYsIDIwLCAmY291bnQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgd2hpbGUgKG1pbiA8IHMtPm5iY291bnQgJiYgY291bnQtLSA+IDApIHsKKyAgICAgICAgICAgIHMtPmJsb2Nrc1ttaW4rK10gPSBmaWxsOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh5ID0gMDsgeSA8IHMtPm5ieTsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5uYng7IHgrKykgeworICAgICAgICAgICAgaW50IHN5MSA9IDAsIHN5MiA9IDE2LCBzeDEgPSAwLCBzeDIgPSAxNjsKKworICAgICAgICAgICAgaWYgKHMtPmJsb2Nrc1t5ICogcy0+bmJ4ICsgeF0gPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKCgocy0+YmxvY2tzW3kgKiBzLT5uYnggKyB4XSAtIDEpICYgMSkgPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0ICA9IGRlY29kZV92YWx1ZShzLCBzLT5zeHlfbW9kZWxbMF0sIDE2LCAxMDAsICZzeDEpOworICAgICAgICAgICAgICAgIHJldCB8PSBkZWNvZGVfdmFsdWUocywgcy0+c3h5X21vZGVsWzFdLCAxNiwgMTAwLCAmc3kxKTsKKyAgICAgICAgICAgICAgICByZXQgfD0gZGVjb2RlX3ZhbHVlKHMsIHMtPnN4eV9tb2RlbFsyXSwgMTYsIDEwMCwgJnN4Mik7CisgICAgICAgICAgICAgICAgcmV0IHw9IGRlY29kZV92YWx1ZShzLCBzLT5zeHlfbW9kZWxbM10sIDE2LCAxMDAsICZzeTIpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgc3gyKys7CisgICAgICAgICAgICAgICAgc3kyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKChzLT5ibG9ja3NbeSAqIHMtPm5ieCArIHhdIC0gMSkgJiAyKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQgaSwgaiwgYnkgPSB5ICogMTYsIGJ4ID0geCAqIDE2OworICAgICAgICAgICAgICAgIGludCBtdngsIG12eTsKKworICAgICAgICAgICAgICAgIHJldCAgPSBkZWNvZGVfdmFsdWUocywgcy0+bXZfbW9kZWxbMF0sIDUxMiwgMTAwLCAmbXZ4KTsKKyAgICAgICAgICAgICAgICByZXQgfD0gZGVjb2RlX3ZhbHVlKHMsIHMtPm12X21vZGVsWzFdLCA1MTIsIDEwMCwgJm12eSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICBtdnggLT0gMjU2OworICAgICAgICAgICAgICAgIG12eSAtPSAyNTY7CisKKyAgICAgICAgICAgICAgICBpZiAoYnkgKyBtdnkgKyBzeTEgPCAwIHx8IGJ4ICsgbXZ4ICsgc3gxIDwgMCB8fAorICAgICAgICAgICAgICAgICAgICBieSArIG12eSArIHN5MSA+PSBhdmN0eC0+aGVpZ2h0IHx8IGJ4ICsgbXZ4ICsgc3gxID49IGF2Y3R4LT53aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3kyIC0gc3kxICYmIChieSArIHN5MSArIGkpIDwgYXZjdHgtPmhlaWdodCAmJiAoYnkgKyBtdnkgKyBzeTEgKyBpKSA8IGF2Y3R4LT5oZWlnaHQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3gyIC0gc3gxICYmIChieCArIHN4MSArIGopIDwgYXZjdHgtPndpZHRoICYmIChieCArIG12eCArIHN4MSArIGopIDwgYXZjdHgtPndpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFsoYnkgKyBpICsgc3kxKSAqIGxpbmVzaXplICsgYnggKyBzeDEgKyBqXSA9IHByZXZbKGJ5ICsgbXZ5ICsgc3kxICsgaSkgKiBwbGluZXNpemUgKyBieCArIHN4MSArIG12eCArIGpdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgcnVuLCByLCBnLCBiLCB6LCBieCA9IHggKiAxNiArIHN4MSwgYnkgPSB5ICogMTYgKyBzeTE7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2xyLCBwdHlwZSA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgKDsgYnkgPCB5ICogMTYgKyBzeTIgJiYgYnkgPCBhdmN0eC0+aGVpZ2h0OykgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfdmFsdWUocywgcy0+b3BfbW9kZWxbcHR5cGVdLCA2LCAxMDAwLCAmcHR5cGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHlwZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfdW5pdChzLCAmcy0+cGl4ZWxfbW9kZWxbMF1bY3ggKyBjeDFdLCA0MDAsICZyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN4MSA9IChjeCA8PCA2KSAmIDB4RkMwOworICAgICAgICAgICAgICAgICAgICAgICAgY3ggPSByID4+IGN4c2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfdW5pdChzLCAmcy0+cGl4ZWxfbW9kZWxbMV1bY3ggKyBjeDFdLCA0MDAsICZnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN4MSA9IChjeCA8PCA2KSAmIDB4RkMwOworICAgICAgICAgICAgICAgICAgICAgICAgY3ggPSBnID4+IGN4c2hpZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBkZWNvZGVfdW5pdChzLCAmcy0+cGl4ZWxfbW9kZWxbMl1bY3ggKyBjeDFdLCA0MDAsICZiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsciA9IChiIDw8IDE2KSArIChnIDw8IDgpICsgcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHR5cGUgPiA1KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGRlY29kZV92YWx1ZShzLCBzLT5ydW5fbW9kZWxbcHR5cGVdLCAyNTYsIDQwMCwgJnJ1bik7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHB0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnkgPj0gYXZjdHgtPmhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbYnkgKiBsaW5lc2l6ZSArIGJ4XSA9IGNscjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieCA+PSB4ICogMTYgKyBzeDIgfHwgYnggPj0gYXZjdHgtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4ID0geCAqIDE2ICsgc3gxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVuLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ4ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5IDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gYmFja3N0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5ID49IGF2Y3R4LT5oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyID0gZHN0W2J5ICogbGluZXNpemUgKyBieCAtIDEgLSB6XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbYnkgKiBsaW5lc2l6ZSArIGJ4XSA9IGNscjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieCA+PSB4ICogMTYgKyBzeDIgfHwgYnggPj0gYXZjdHgtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4ID0geCAqIDE2ICsgc3gxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVuLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5IDwgMSB8fCBieSA+PSBhdmN0eC0+aGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsciA9IGRzdFsoYnkgLSAxKSAqIGxpbmVzaXplICsgYnhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtieSAqIGxpbmVzaXplICsgYnhdID0gY2xyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ4ID49IHggKiAxNiArIHN4MiB8fCBieCA+PSBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnggPSB4ICogMTYgKyBzeDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnkgPj0gYXZjdHgtPmhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHIgPSBwcmV2W2J5ICogcGxpbmVzaXplICsgYnhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtieSAqIGxpbmVzaXplICsgYnhdID0gY2xyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ4ID49IHggKiAxNiArIHN4MiB8fCBieCA+PSBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnggPSB4ICogMTYgKyBzeDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvZHN0ID0gKHVpbnQ4X3QgKilkc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnkgPCAxIHx8IGJ5ID49IGF2Y3R4LT5oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ4ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5IDwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gYmFja3N0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IG9kc3RbKChieSAtIDEpICogbGluZXNpemUgKyBieCkgKiA0XSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9kc3RbKGJ5ICogbGluZXNpemUgKyBieCAtIDEgLSB6KSAqIDRdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2RzdFsoKGJ5IC0gMSkgKiBsaW5lc2l6ZSArIGJ4IC0gMSAtIHopICogNF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZyA9IG9kc3RbKChieSAtIDEpICogbGluZXNpemUgKyBieCkgKiA0ICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZHN0WyhieSAqIGxpbmVzaXplICsgYnggLSAxIC0geikgKiA0ICsgMV0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZHN0WygoYnkgLSAxKSAqIGxpbmVzaXplICsgYnggLSAxIC0geikgKiA0ICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IG9kc3RbKChieSAtIDEpICogbGluZXNpemUgKyBieCkgKiA0ICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZHN0WyhieSAqIGxpbmVzaXplICsgYnggLSAxIC0geikgKiA0ICsgMl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZHN0WygoYnkgLSAxKSAqIGxpbmVzaXplICsgYnggLSAxIC0geikgKiA0ICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyID0gKChiICYgMHhGRikgPDwgMTYpICsgKChnICYgMHhGRikgPDwgOCkgKyAociAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtieSAqIGxpbmVzaXplICsgYnhdID0gY2xyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ4ID49IHggKiAxNiArIHN4MiB8fCBieCA+PSBhdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnggPSB4ICogMTYgKyBzeDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW4tLSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnkgPCAxIHx8IGJ5ID49IGF2Y3R4LT5oZWlnaHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ4ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5IDwgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ID0gYmFja3N0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyID0gZHN0WyhieSAtIDEpICogbGluZXNpemUgKyBieCAtIDEgLSB6XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbYnkgKiBsaW5lc2l6ZSArIGJ4XSA9IGNscjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChieCA+PSB4ICogMTYgKyBzeDIgfHwgYnggPj0gYXZjdHgtPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ4ID0geCAqIDE2ICsgc3gxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN4MSA9IChjbHIgJiAweDNGMDApID4+IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBjeCA9IChjbHIgJiAweDNGRkZGRikgPj4gMTY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjeDEgPSAoY2xyICYgMHhGQzAwKSA+PiA0OworICAgICAgICAgICAgICAgICAgICAgICAgY3ggPSAoY2xyICYgMHhGRkZGRkYpID4+IDE4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwgaW50ICpnb3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgU0NQUkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEdldEJ5dGVDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGRhdGE7CisgICAgaW50IHJldCwgdHlwZTsKKworICAgIGlmIChhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2KSB7CisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBzLT5jdXJyZW50X2ZyYW1lKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYnl0ZXN0cmVhbTJfaW5pdChnYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKworICAgIHR5cGUgPSBieXRlc3RyZWFtMl9wZWVrX2J5dGUoZ2IpOworCisgICAgaWYgKHR5cGUgPT0gMikgeworICAgICAgICBzLT5nZXRfZnJlcSA9IGdldF9mcmVxMDsKKyAgICAgICAgcy0+ZGVjb2RlID0gZGVjb2RlMDsKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgICAgIHJldCA9IGRlY29tcHJlc3NfaShhdmN0eCwgKHVpbnQzMl90ICopcy0+Y3VycmVudF9mcmFtZS0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfZnJhbWUtPmxpbmVzaXplWzBdIC8gNCk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IDE4KSB7CisgICAgICAgIHMtPmdldF9mcmVxID0gZ2V0X2ZyZXE7CisgICAgICAgIHMtPmRlY29kZSA9IGRlY29kZTsKKyAgICAgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisgICAgICAgIHJldCA9IGRlY29tcHJlc3NfaShhdmN0eCwgKHVpbnQzMl90ICopcy0+Y3VycmVudF9mcmFtZS0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfZnJhbWUtPmxpbmVzaXplWzBdIC8gNCk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IDE3KSB7CisgICAgICAgIHVpbnQzMl90IGNsciwgKmRzdCA9ICh1aW50MzJfdCAqKXMtPmN1cnJlbnRfZnJhbWUtPmRhdGFbMF07CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAxOworICAgICAgICBieXRlc3RyZWFtMl9za2lwKGdiLCAxKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgIHVpbnQxNl90IHZhbHVlID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoZ2IpOworICAgICAgICAgICAgaW50IHIsIGcsIGI7CisKKyAgICAgICAgICAgIHIgPSAodmFsdWUgICAgICApICYgMzE7CisgICAgICAgICAgICBnID0gKHZhbHVlID4+ICA1KSAmIDMxOworICAgICAgICAgICAgYiA9ICh2YWx1ZSA+PiAxMCkgJiAzMTsKKyAgICAgICAgICAgIGNsciA9IChyIDw8IDE2KSArIChnIDw8IDgpICsgYjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsciA9IGJ5dGVzdHJlYW0yX2dldF9sZTI0KGdiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBjbHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QgKz0gcy0+Y3VycmVudF9mcmFtZS0+bGluZXNpemVbMF0gLyA0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh0eXBlID09IDAgfHwgdHlwZSA9PSAxKSB7CisgICAgICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAwOworCisgICAgICAgIHJldCA9IGF2X2ZyYW1lX2NvcHkocy0+Y3VycmVudF9mcmFtZSwgcy0+bGFzdF9mcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICByZXQgPSBkZWNvbXByZXNzX3AoYXZjdHgsICh1aW50MzJfdCAqKXMtPmN1cnJlbnRfZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X2ZyYW1lLT5saW5lc2l6ZVswXSAvIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilzLT5sYXN0X2ZyYW1lLT5kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGFzdF9mcmFtZS0+bGluZXNpemVbMF0gLyA0KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAhPSAxNikgeworICAgICAgICByZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+Y3VycmVudF9mcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50OF90ICpkc3QgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgaW50IHgsIHk7CisKKyAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weShmcmFtZSwgcy0+Y3VycmVudF9mcmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAvLyBzY2FsZSB1cCBlYWNoIHNhbXBsZSBieSA4CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbWFnZSBpcyBzdWZmaWNpZW50bHkgYWxpZ25lZCwgY29tcHV0ZSA4IHNhbXBsZXMgYXQgb25jZQorICAgICAgICAgICAgaWYgKCEoKCh1aW50cHRyX3QpZHN0KSAmIDcpKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgKmRzdDY0ID0gKHVpbnQ2NF90ICopZHN0OworICAgICAgICAgICAgICAgIGludCB3ID0gYXZjdHgtPndpZHRoPj4xOworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0NjRbeF0gPSAoZHN0NjRbeF0gPDwgMykgJiAweEZDRkNGQ0ZDRkNGQ0ZDRkNVTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHggKj0gODsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHggPSAwOworICAgICAgICAgICAgZm9yICg7IHggPCBhdmN0eC0+d2lkdGggKiA0OyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBkc3RbeF0gPDwgMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCArPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZS0+cGljdF90eXBlID0gZnJhbWUtPmtleV9mcmFtZSA/IEFWX1BJQ1RVUkVfVFlQRV9JIDogQVZfUElDVFVSRV9UWVBFX1A7CisKKyAgICBGRlNXQVAoQVZGcmFtZSAqLCBzLT5jdXJyZW50X2ZyYW1lLCBzLT5sYXN0X2ZyYW1lKTsKKworICAgIGZyYW1lLT5kYXRhWzBdICAgICArPSBmcmFtZS0+bGluZXNpemVbMF0gKiAoYXZjdHgtPmhlaWdodCAtIDEpOworICAgIGZyYW1lLT5saW5lc2l6ZVswXSAqPSAtMTsKKworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFNDUFJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHN3aXRjaCAoYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgIGNhc2UgMTY6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IwOyBicmVhazsKKyAgICBjYXNlIDI0OgorICAgIGNhc2UgMzI6IGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IwOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGJpdGRlcHRoICVpXG4iLCBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+Z2V0X2ZyZXEgPSBnZXRfZnJlcTA7CisgICAgcy0+ZGVjb2RlID0gZGVjb2RlMDsKKworICAgIHMtPmN4c2hpZnQgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2ID8gMCA6IDI7CisgICAgcy0+Y2JpdHMgPSBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2ID8gMHgxRiA6IDB4RkY7CisgICAgcy0+bmJ4ID0gKGF2Y3R4LT53aWR0aCArIDE1KSAvIDE2OworICAgIHMtPm5ieSA9IChhdmN0eC0+aGVpZ2h0ICsgMTUpIC8gMTY7CisgICAgcy0+bmJjb3VudCA9IHMtPm5ieCAqIHMtPm5ieTsKKyAgICBzLT5ibG9ja3MgPSBhdl9tYWxsb2NfYXJyYXkocy0+bmJjb3VudCwgc2l6ZW9mKCpzLT5ibG9ja3MpKTsKKyAgICBpZiAoIXMtPmJsb2NrcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPmxhc3RfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIHMtPmN1cnJlbnRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+bGFzdF9mcmFtZSB8fCAhcy0+Y3VycmVudF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBTQ1BSQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBhdl9mcmVlcCgmcy0+YmxvY2tzKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5sYXN0X2ZyYW1lKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5jdXJyZW50X2ZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3NjcHJfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJzY3ByIiwKKyAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTY3JlZW5QcmVzc29yIiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TQ1BSLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKFNDUFJDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IGRlY29kZV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgID0gZGVjb2RlX2Nsb3NlLAorICAgIC5kZWNvZGUgICAgICAgICAgID0gZGVjb2RlX2ZyYW1lLAorICAgIC5jYXBhYmlsaXRpZXMgICAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUgfAorICAgICAgICAgICAgICAgICAgICAgICAgRkZfQ09ERUNfQ0FQX0lOSVRfQ0xFQU5VUCwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NjcmVlbnByZXNzby5jIGIvbGliYXZjb2RlYy9zY3JlZW5wcmVzc28uYwppbmRleCAyYzRiYjE5Li5mYjhiZmQ0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3NjcmVlbnByZXNzby5jCisrKyBiL2xpYmF2Y29kZWMvc2NyZWVucHJlc3NvLmMKQEAgLTMwLDcgKzMwLDcgQEAKICAqIHJlYnVpbHQgZnJhbWUgKG5vdCB0aGUgcmVmZXJlbmNlKSwgYW5kIHNpbmNlIHRoZXJlIGlzIG5vIGNvb3JkaW5hdGUgc3lzdGVtCiAgKiB0aGV5IGNvbnRhaW4gZXhhY3RseSBhcyBtYW55IHBpeGVsIGFzIHRoZSBrZXlmcmFtZS4KICAqCi0gKiBTdXBwb3J0czogQkdSMjQKKyAqIFN1cHBvcnRzOiBCR1IwLCBCR1IyNCwgUkdCNTU1CiAgKi8KIAogI2luY2x1ZGUgPHN0ZGludC5oPgpAQCAtNDcsNyArNDcsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgU2NyZWVucHJlc3NvQ29udGV4dCB7CiAgICAgQVZGcmFtZSAqY3VycmVudDsKIAotICAgIC8qIHpsaWIgaW50ZXJhdGlvbiAqLworICAgIC8qIHpsaWIgaW50ZXJhY3Rpb24gKi8KICAgICB1aW50OF90ICppbmZsYXRlZF9idWY7CiAgICAgdUxvbmdmIGluZmxhdGVkX3NpemU7CiB9IFNjcmVlbnByZXNzb0NvbnRleHQ7CkBAIC03OSwxMCArNzksOCBAQAogICAgIGlmICghY3R4LT5jdXJyZW50KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OwotCi0gICAgLyogQWxsb2NhdGUgbWF4aW11bSBzaXplIHBvc3NpYmxlLCBhIGZ1bGwgZnJhbWUgKi8KLSAgICBjdHgtPmluZmxhdGVkX3NpemUgPSBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogMzsKKyAgICAvKiBBbGxvY2F0ZSBtYXhpbXVtIHNpemUgcG9zc2libGUsIGEgZnVsbCBSR0JBIGZyYW1lICovCisgICAgY3R4LT5pbmZsYXRlZF9zaXplID0gYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqIDQ7CiAgICAgY3R4LT5pbmZsYXRlZF9idWYgID0gYXZfbWFsbG9jKGN0eC0+aW5mbGF0ZWRfc2l6ZSk7CiAgICAgaWYgKCFjdHgtPmluZmxhdGVkX2J1ZikKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTEwOCw3ICsxMDYsNyBAQAogICAgIFNjcmVlbnByZXNzb0NvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOwogICAgIHVMb25nZiBsZW5ndGggPSBjdHgtPmluZmxhdGVkX3NpemU7Ci0gICAgaW50IGtleWZyYW1lOworICAgIGludCBrZXlmcmFtZSwgY29tcG9uZW50X3NpemUsIHNyY19saW5lc2l6ZTsKICAgICBpbnQgcmV0OwogCiAgICAgLyogU2l6ZSBjaGVjayAqLwpAQCAtMTE3LDEzICsxMTUsMjcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgLyogQmFzaWMgc2FuaXR5IGNoZWNrLCBidXQgbm90IHJlYWxseSBoYXJtZnVsICovCi0gICAgaWYgKChhdnBrdC0+ZGF0YVswXSAhPSAweDczICYmIGF2cGt0LT5kYXRhWzBdICE9IDB4NzIpIHx8Ci0gICAgICAgIGF2cGt0LT5kYXRhWzFdICE9IDgpIHsgLy8gYnBwIHByb2JhYmx5Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIGhlYWRlciAweCUwMlglMDJYXG4iLAotICAgICAgICAgICAgICAgYXZwa3QtPmRhdGFbMF0sIGF2cGt0LT5kYXRhWzFdKTsKKyAgICAvKiBDb21wcmVzc2lvbiBsZXZlbCAoNCBiaXRzKSBhbmQga2V5ZnJhbWUgaW5mb3JtYXRpb24gKDEgYml0KSAqLworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiQ29tcHJlc3Npb24gbGV2ZWwgJWRcbiIsIGF2cGt0LT5kYXRhWzBdID4+IDQpOworICAgIGtleWZyYW1lID0gYXZwa3QtPmRhdGFbMF0gJiAxOworCisgICAgLyogUGl4ZWwgc2l6ZSAqLworICAgIGNvbXBvbmVudF9zaXplID0gKChhdnBrdC0+ZGF0YVsxXSA+PiAyKSAmIDB4MDMpICsgMTsKKyAgICBzd2l0Y2ggKGNvbXBvbmVudF9zaXplKSB7CisgICAgY2FzZSAyOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1TEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYml0cyBwZXIgcGl4ZWwgdmFsdWUgKCVkKVxuIiwKKyAgICAgICAgICAgICAgIGNvbXBvbmVudF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIGtleWZyYW1lID0gKGF2cGt0LT5kYXRhWzBdID09IDB4NzMpOwogCiAgICAgLyogSW5mbGF0ZSB0aGUgZnJhbWUgYWZ0ZXIgdGhlIDIgYnl0ZSBoZWFkZXIgKi8KICAgICByZXQgPSB1bmNvbXByZXNzKGN0eC0+aW5mbGF0ZWRfYnVmLCAmbGVuZ3RoLApAQCAtMTM3LDE4ICsxNDksMjEgQEAKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAorICAgIC8qIENvZGVjIGhhcyBhbGlnbmVkIHN0cmlkZXMgKi8KKyAgICBzcmNfbGluZXNpemUgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCAqIGNvbXBvbmVudF9zaXplLCA0KTsKKwogICAgIC8qIFdoZW4gYSBrZXlmcmFtZSBpcyBmb3VuZCwgY29weSBpdCAoZmxpcHBlZCkgKi8KICAgICBpZiAoa2V5ZnJhbWUpCiAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoY3R4LT5jdXJyZW50LT5kYXRhWzBdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmN1cnJlbnQtPmxpbmVzaXplWzBdICogKGF2Y3R4LT5oZWlnaHQgLSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAqIGN0eC0+Y3VycmVudC0+bGluZXNpemVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pbmZsYXRlZF9idWYsIGF2Y3R4LT53aWR0aCAqIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoICogMywgYXZjdHgtPmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pbmZsYXRlZF9idWYsIHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggKiBjb21wb25lbnRfc2l6ZSwgYXZjdHgtPmhlaWdodCk7CiAgICAgLyogT3RoZXJ3aXNlIHN1bSB0aGUgZGVsdGEgb24gdG9wIG9mIHRoZSBjdXJyZW50IGZyYW1lICovCiAgICAgZWxzZQogICAgICAgICBzdW1fZGVsdGFfZmxpcHBlZChjdHgtPmN1cnJlbnQtPmRhdGFbMF0sIGN0eC0+Y3VycmVudC0+bGluZXNpemVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aW5mbGF0ZWRfYnVmLCBhdmN0eC0+d2lkdGggKiAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggKiAzLCBhdmN0eC0+aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pbmZsYXRlZF9idWYsIHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoICogY29tcG9uZW50X3NpemUsIGF2Y3R4LT5oZWlnaHQpOwogCiAgICAgLyogRnJhbWUgaXMgcmVhZHkgdG8gYmUgb3V0cHV0ICovCiAgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGZyYW1lLCBjdHgtPmN1cnJlbnQpOwpAQCAtMTY0LDcgKzE3OSw3IEBACiAgICAgfQogICAgICpnb3RfZnJhbWUgPSAxOwogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGF2cGt0LT5zaXplOwogfQogCiBBVkNvZGVjIGZmX3NjcmVlbnByZXNzb19kZWNvZGVyID0gewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zZ2lybGVkZWMuYyBiL2xpYmF2Y29kZWMvc2dpcmxlZGVjLmMKaW5kZXggZTdiMjgxYS4uYWE0ZjBlNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9zZ2lybGVkZWMuYworKysgYi9saWJhdmNvZGVjL3NnaXJsZWRlYy5jCkBAIC0zMSwxNyArMzEsOSBAQAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIHN0cnVjdCBTR0lSTEVDb250ZXh0IHsKLSAgICBBVkZyYW1lICpmcmFtZTsKLX0gU0dJUkxFQ29udGV4dDsKLQogc3RhdGljIGF2X2NvbGQgaW50IHNnaXJsZV9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgU0dJUkxFQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUjg7Ci0gICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgIGlmICghcy0+ZnJhbWUpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEyMCw0MSArMTEyLDMxIEBACiBzdGF0aWMgaW50IHNnaXJsZV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCiB7Ci0gICAgU0dJUkxFQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBkYXRhOwogICAgIGludCByZXQ7CiAKLSAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCisgICAgaWYgKChyZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIHJldCA9IGRlY29kZV9zZ2lybGU4KGF2Y3R4LCBzLT5mcmFtZS0+ZGF0YVswXSwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgcy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICByZXQgPSBkZWNvZGVfc2dpcmxlOChhdmN0eCwgZnJhbWUtPmRhdGFbMF0sIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIGZyYW1lLT5saW5lc2l6ZVswXSk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKKyAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgZnJhbWUtPmtleV9mcmFtZSA9IDE7CisKICAgICAqZ290X2ZyYW1lID0gMTsKLSAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5mcmFtZSkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKIH0KIAotc3RhdGljIGF2X2NvbGQgaW50IHNnaXJsZV9kZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBTR0lSTEVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLQotICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKLQotICAgIHJldHVybiAwOwotfQotCiBBVkNvZGVjIGZmX3NnaXJsZV9kZWNvZGVyID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJzZ2lybGUiLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTaWxpY29uIEdyYXBoaWNzIFJMRSA4LWJpdCB2aWRlbyIpLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TR0lSTEUsCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNHSVJMRUNvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICA9IHNnaXJsZV9kZWNvZGVfaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgPSBzZ2lybGVfZGVjb2RlX2VuZCwKICAgICAuZGVjb2RlICAgICAgICAgPSBzZ2lybGVfZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zaGVlcnZpZGVvLmMgYi9saWJhdmNvZGVjL3NoZWVydmlkZW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGMzZWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy9zaGVlcnZpZGVvLmMKQEAgLTAsMCArMSwyMDk5IEBACisvKgorICogQml0SmF6eiBTaGVlclZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJzaGVlcnZpZGVvZGF0YS5oIgorCit0eXBlZGVmIHN0cnVjdCBTaGVlclZpZGVvQ29udGV4dCB7CisgICAgdW5zaWduZWQgZm9ybWF0OworICAgIGludCBhbHQ7CisgICAgVkxDIHZsY1syXTsKKyAgICB2b2lkICgqZGVjb2RlX2ZyYW1lKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKTsKK30gU2hlZXJWaWRlb0NvbnRleHQ7CisKK3N0YXRpYyB2b2lkIGRlY29kZV9jYTRpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQxNl90ICpkc3RfeSwgKmRzdF91LCAqZHN0X3YsICpkc3RfYTsKKyAgICBpbnQgeCwgeTsKKworICAgIGRzdF9hID0gKHVpbnQxNl90ICopcC0+ZGF0YVszXTsKKyAgICBkc3RfeSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMF07CisgICAgZHN0X3UgPSAodWludDE2X3QgKilwLT5kYXRhWzFdOworICAgIGRzdF92ID0gKHVpbnQxNl90ICopcC0+ZGF0YVsyXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGRzdF9hW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwcmVkWzRdID0geyA1MDIsIDUxMiwgNTEyLCA1MDIgfTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaW50IHksIHUsIHYsIGE7CisKKyAgICAgICAgICAgICAgICBhID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHkgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0X2FbeF0gPSBwcmVkWzNdID0gKGEgKyBwcmVkWzNdKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF95W3hdID0gcHJlZFswXSA9ICh5ICsgcHJlZFswXSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9IHByZWRbMV0gPSAodSArIHByZWRbMV0pICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSBwcmVkWzJdID0gKHYgKyBwcmVkWzJdKSAmIDB4M2ZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgICAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXSAvIDI7CisgICAgICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdIC8gMjsKKyAgICAgICAgZHN0X2EgKz0gcC0+bGluZXNpemVbM10gLyAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2NhNHAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDE2X3QgKmRzdF95LCAqZHN0X3UsICpkc3RfdiwgKmRzdF9hOworICAgIGludCB4LCB5OworCisgICAgZHN0X2EgPSAodWludDE2X3QgKilwLT5kYXRhWzNdOworICAgIGRzdF95ID0gKHVpbnQxNl90ICopcC0+ZGF0YVswXTsKKyAgICBkc3RfdSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMV07CisgICAgZHN0X3YgPSAodWludDE2X3QgKilwLT5kYXRhWzJdOworCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBkc3RfYVt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICBkc3RfeVt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICBkc3RfdVt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICBkc3Rfdlt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcHJlZFs0XSA9IHsgNTAyLCA1MTIsIDUxMiwgNTAyIH07CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgeSwgdSwgdiwgYTsKKworICAgICAgICAgICAgYSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHkgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICB1ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgdiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgZHN0X2FbeF0gPSBwcmVkWzNdID0gKGEgKyBwcmVkWzNdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X3lbeF0gPSBwcmVkWzBdID0gKHkgKyBwcmVkWzBdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X3VbeF0gPSBwcmVkWzFdID0gKHUgKyBwcmVkWzFdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X3ZbeF0gPSBwcmVkWzJdID0gKHYgKyBwcmVkWzJdKSAmIDB4M2ZmOworICAgICAgICB9CisgICAgfQorCisgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdIC8gMjsKKyAgICBkc3RfdiArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgZHN0X2EgKz0gcC0+bGluZXNpemVbM10gLyAyOworCisgICAgZm9yICh5ID0gMTsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0X2FbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF95W3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRfVExbNF0sIHByZWRfTFs0XSwgcHJlZF9UWzRdOworICAgICAgICAgICAgaW50IHksIHUsIHYsIGE7CisKKyAgICAgICAgICAgIHByZWRfVExbMF0gPSBwcmVkX0xbMF0gPSBkc3RfeVstcC0+bGluZXNpemVbMF0gLyAyXTsKKyAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX0xbMV0gPSBkc3RfdVstcC0+bGluZXNpemVbMV0gLyAyXTsKKyAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX0xbMl0gPSBkc3RfdlstcC0+bGluZXNpemVbMl0gLyAyXTsKKyAgICAgICAgICAgIHByZWRfVExbM10gPSBwcmVkX0xbM10gPSBkc3RfYVstcC0+bGluZXNpemVbM10gLyAyXTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcHJlZF9UWzBdID0gZHN0X3lbLXAtPmxpbmVzaXplWzBdIC8gMiArIHhdOworICAgICAgICAgICAgICAgIHByZWRfVFsxXSA9IGRzdF91Wy1wLT5saW5lc2l6ZVsxXSAvIDIgKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMl0gPSBkc3RfdlstcC0+bGluZXNpemVbMl0gLyAyICsgeF07CisgICAgICAgICAgICAgICAgcHJlZF9UWzNdID0gZHN0X2FbLXAtPmxpbmVzaXplWzNdIC8gMiArIHhdOworCisgICAgICAgICAgICAgICAgYSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB5ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHUgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdF9hW3hdID0gcHJlZF9MWzNdID0gKGEgKyAoKDMgKiAocHJlZF9UWzNdICsgcHJlZF9MWzNdKSAtIDIgKiBwcmVkX1RMWzNdKSA+PiAyKSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9IHByZWRfTFswXSA9ICh5ICsgKCgzICogKHByZWRfVFswXSArIHByZWRfTFswXSkgLSAyICogcHJlZF9UTFswXSkgPj4gMikpICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBwcmVkX0xbMV0gPSAodSArICgoMyAqIChwcmVkX1RbMV0gKyBwcmVkX0xbMV0pIC0gMiAqIHByZWRfVExbMV0pID4+IDIpKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gcHJlZF9MWzJdID0gKHYgKyAoKDMgKiAocHJlZF9UWzJdICsgcHJlZF9MWzJdKSAtIDIgKiBwcmVkX1RMWzJdKSA+PiAyKSkgJiAweDNmZjsKKworICAgICAgICAgICAgICAgIHByZWRfVExbMF0gPSBwcmVkX1RbMF07CisgICAgICAgICAgICAgICAgcHJlZF9UTFsxXSA9IHByZWRfVFsxXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzJdID0gcHJlZF9UWzJdOworICAgICAgICAgICAgICAgIHByZWRfVExbM10gPSBwcmVkX1RbM107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3RfeSArPSBwLT5saW5lc2l6ZVswXSAvIDI7CisgICAgICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdIC8gMjsKKyAgICAgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl0gLyAyOworICAgICAgICBkc3RfYSArPSBwLT5saW5lc2l6ZVszXSAvIDI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfeWJyMTBpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQxNl90ICpkc3RfeSwgKmRzdF91LCAqZHN0X3Y7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3RfeSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMF07CisgICAgZHN0X3UgPSAodWludDE2X3QgKilwLT5kYXRhWzFdOworICAgIGRzdF92ID0gKHVpbnQxNl90ICopcC0+ZGF0YVsyXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGRzdF95W3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRbNF0gPSB7IDUwMiwgNTEyLCA1MTIsIDUxMiB9OworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgeSwgdSwgdjsKKworICAgICAgICAgICAgICAgIHkgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSBwcmVkWzBdID0gKHkgKyBwcmVkWzBdKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF91W3hdID0gcHJlZFsxXSA9ICh1ICsgcHJlZFsxXSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9IHByZWRbMl0gPSAodiArIHByZWRbMl0pICYgMHgzZmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3RfeSArPSBwLT5saW5lc2l6ZVswXSAvIDI7CisgICAgICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdIC8gMjsKKyAgICAgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl0gLyAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3licjEwKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQxNl90ICpkc3RfeSwgKmRzdF91LCAqZHN0X3Y7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3RfeSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMF07CisgICAgZHN0X3UgPSAodWludDE2X3QgKilwLT5kYXRhWzFdOworICAgIGRzdF92ID0gKHVpbnQxNl90ICopcC0+ZGF0YVsyXTsKKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgZHN0X3lbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgZHN0X3VbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgZHN0X3ZbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHByZWRbNF0gPSB7IDUwMiwgNTEyLCA1MTIsIDUxMiB9OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHksIHUsIHY7CisKKyAgICAgICAgICAgIHkgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICB1ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgdiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgZHN0X3lbeF0gPSBwcmVkWzBdID0gKHkgKyBwcmVkWzBdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X3VbeF0gPSBwcmVkWzFdID0gKHUgKyBwcmVkWzFdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X3ZbeF0gPSBwcmVkWzJdID0gKHYgKyBwcmVkWzJdKSAmIDB4M2ZmOworICAgICAgICB9CisgICAgfQorCisgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdIC8gMjsKKyAgICBkc3RfdiArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwcmVkX1RMWzRdLCBwcmVkX0xbNF0sIHByZWRfVFs0XTsKKyAgICAgICAgICAgIGludCB5LCB1LCB2OworCisgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9MWzBdID0gZHN0X3lbLXAtPmxpbmVzaXplWzBdIC8gMl07CisgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9MWzFdID0gZHN0X3VbLXAtPmxpbmVzaXplWzFdIC8gMl07CisgICAgICAgICAgICBwcmVkX1RMWzJdID0gcHJlZF9MWzJdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdIC8gMl07CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIHByZWRfVFswXSA9IGRzdF95Wy1wLT5saW5lc2l6ZVswXSAvIDIgKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMV0gPSBkc3RfdVstcC0+bGluZXNpemVbMV0gLyAyICsgeF07CisgICAgICAgICAgICAgICAgcHJlZF9UWzJdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdIC8gMiArIHhdOworCisgICAgICAgICAgICAgICAgeSA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB1ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHYgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9IHByZWRfTFswXSA9ICh5ICsgKCgzICogKHByZWRfVFswXSArIHByZWRfTFswXSkgLSAyICogcHJlZF9UTFswXSkgPj4gMikpICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBwcmVkX0xbMV0gPSAodSArICgoMyAqIChwcmVkX1RbMV0gKyBwcmVkX0xbMV0pIC0gMiAqIHByZWRfVExbMV0pID4+IDIpKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gcHJlZF9MWzJdID0gKHYgKyAoKDMgKiAocHJlZF9UWzJdICsgcHJlZF9MWzJdKSAtIDIgKiBwcmVkX1RMWzJdKSA+PiAyKSkgJiAweDNmZjsKKworICAgICAgICAgICAgICAgIHByZWRfVExbMF0gPSBwcmVkX1RbMF07CisgICAgICAgICAgICAgICAgcHJlZF9UTFsxXSA9IHByZWRfVFsxXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzJdID0gcHJlZF9UWzJdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgICAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXSAvIDI7CisgICAgICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV95cnkxMGkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDE2X3QgKmRzdF95LCAqZHN0X3UsICpkc3RfdjsKKyAgICBpbnQgeCwgeTsKKworICAgIGRzdF95ID0gKHVpbnQxNl90ICopcC0+ZGF0YVswXTsKKyAgICBkc3RfdSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMV07CisgICAgZHN0X3YgPSAodWludDE2X3QgKilwLT5kYXRhWzJdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICAgICAgZHN0X3lbeCAgICBdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3ZbeCAvIDJdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwcmVkWzRdID0geyA1MDIsIDUxMiwgNTEyLCAwIH07CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgICAgIGludCB5MSwgeTIsIHUsIHY7CisKKyAgICAgICAgICAgICAgICB5MSA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB1ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB5MiA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IHByZWRbMF0gPSAoeTEgKyBwcmVkWzBdKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IHByZWRbMV0gPSAodSAgKyBwcmVkWzFdKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IHByZWRbMF0gPSAoeTIgKyBwcmVkWzBdKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF92W3ggLyAyXSA9IHByZWRbMl0gPSAodiAgKyBwcmVkWzJdKSAmIDB4M2ZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgICAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXSAvIDI7CisgICAgICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV95cnkxMChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50MTZfdCAqZHN0X3ksICpkc3RfdSwgKmRzdF92OworICAgIGludCB4LCB5OworCisgICAgZHN0X3kgPSAodWludDE2X3QgKilwLT5kYXRhWzBdOworICAgIGRzdF91ID0gKHVpbnQxNl90ICopcC0+ZGF0YVsxXTsKKyAgICBkc3RfdiA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMl07CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgZHN0X3lbeCArIDFdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGRzdF92W3ggLyAyXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcHJlZFs0XSA9IHsgNTAyLCA1MTIsIDUxMiwgMCB9OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdjsKKworICAgICAgICAgICAgeTEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICB1ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHkyID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdiAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IHByZWRbMF0gPSAoeTEgKyBwcmVkWzBdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gcHJlZFsxXSA9ICh1ICArIHByZWRbMV0pICYgMHgzZmY7CisgICAgICAgICAgICBkc3RfeVt4ICsgMV0gPSBwcmVkWzBdID0gKHkyICsgcHJlZFswXSkgJiAweDNmZjsKKyAgICAgICAgICAgIGRzdF92W3ggLyAyXSA9IHByZWRbMl0gPSAodiAgKyBwcmVkWzJdKSAmIDB4M2ZmOworICAgICAgICB9CisgICAgfQorCisgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdIC8gMjsKKyAgICBkc3RfdiArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3lbeCArIDFdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRfVExbNl0sIHByZWRfTFs2XSwgcHJlZF9UWzZdOworICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdjsKKworICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfTFswXSA9IGRzdF95Wy1wLT5saW5lc2l6ZVswXSAvIDJdOworICAgICAgICAgICAgcHJlZF9UTFsxXSA9IHByZWRfTFsxXSA9IGRzdF91Wy1wLT5saW5lc2l6ZVsxXSAvIDJdOworICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfTFsyXSA9IGRzdF92Wy1wLT5saW5lc2l6ZVsyXSAvIDJdOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMF0gPSBkc3RfeVstcC0+bGluZXNpemVbMF0gLyAyICsgeF07CisgICAgICAgICAgICAgICAgcHJlZF9UWzNdID0gZHN0X3lbLXAtPmxpbmVzaXplWzBdIC8gMiArIHggKyAxXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMV0gPSBkc3RfdVstcC0+bGluZXNpemVbMV0gLyAyICsgeCAvIDJdOworICAgICAgICAgICAgICAgIHByZWRfVFsyXSA9IGRzdF92Wy1wLT5saW5lc2l6ZVsyXSAvIDIgKyB4IC8gMl07CisKKyAgICAgICAgICAgICAgICB5MSA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB1ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB5MiA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IHByZWRfTFswXSA9ICh5MSArICgoMyAqIChwcmVkX1RbMF0gKyBwcmVkX0xbMF0pIC0gMiAqIHByZWRfVExbMF0pID4+IDIpKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IHByZWRfTFsxXSA9ICh1ICsgKCgocHJlZF9MWzFdIC0gcHJlZF9UTFsxXSkgPj4gMSkgKyBwcmVkX1RbMV0pKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IHByZWRfTFswXSA9ICh5MiArICgoMyAqIChwcmVkX1RbM10gKyBwcmVkX0xbMF0pIC0gMiAqIHByZWRfVFswXSkgPj4gMikpICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X3ZbeCAvIDJdID0gcHJlZF9MWzJdID0gKHYgKyAoKChwcmVkX0xbMl0gLSBwcmVkX1RMWzJdKSA+PiAxKSArIHByZWRfVFsyXSkpICYgMHgzZmY7CisKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9UWzNdOworICAgICAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX1RbMV07CisgICAgICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfVFsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdIC8gMjsKKyAgICAgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV0gLyAyOworICAgICAgICBkc3RfdiArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfY2EyaShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50MTZfdCAqZHN0X3ksICpkc3RfdSwgKmRzdF92LCAqZHN0X2E7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3RfeSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMF07CisgICAgZHN0X3UgPSAodWludDE2X3QgKilwLT5kYXRhWzFdOworICAgIGRzdF92ID0gKHVpbnQxNl90ICopcC0+ZGF0YVsyXTsKKyAgICBkc3RfYSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbM107CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBkc3RfYVt4ICAgIF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfYVt4ICsgMV0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3ZbeCAvIDJdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwcmVkWzRdID0geyA1MDIsIDUxMiwgNTEyLCA1MDIgfTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdiwgYTEsIGEyOworCisgICAgICAgICAgICAgICAgYTEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgeTEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdSAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgYTIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgeTIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdiAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBwcmVkWzBdID0gKHkxICsgcHJlZFswXSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBwcmVkWzFdID0gKHUgICsgcHJlZFsxXSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICsgMV0gPSBwcmVkWzBdID0gKHkyICsgcHJlZFswXSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfYVt4ICAgIF0gPSBwcmVkWzNdID0gKGExICsgcHJlZFszXSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBwcmVkWzJdID0gKHYgICsgcHJlZFsyXSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfYVt4ICsgMV0gPSBwcmVkWzNdID0gKGEyICsgcHJlZFszXSkgJiAweDNmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdIC8gMjsKKyAgICAgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV0gLyAyOworICAgICAgICBkc3RfdiArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgICAgIGRzdF9hICs9IHAtPmxpbmVzaXplWzNdIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9jYTJwKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQxNl90ICpkc3RfeSwgKmRzdF91LCAqZHN0X3YsICpkc3RfYTsKKyAgICBpbnQgeCwgeTsKKworICAgIGRzdF95ID0gKHVpbnQxNl90ICopcC0+ZGF0YVswXTsKKyAgICBkc3RfdSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMV07CisgICAgZHN0X3YgPSAodWludDE2X3QgKilwLT5kYXRhWzJdOworICAgIGRzdF9hID0gKHVpbnQxNl90ICopcC0+ZGF0YVszXTsKKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgZHN0X2FbeCAgICBdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgZHN0X2FbeCArIDFdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHByZWRbNF0gPSB7IDUwMiwgNTEyLCA1MTIsIDUwMiB9OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdiwgYTEsIGEyOworCisgICAgICAgICAgICBhMSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHkxID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdSAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICBhMiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHkyID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdiAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IHByZWRbMF0gPSAoeTEgKyBwcmVkWzBdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gcHJlZFsxXSA9ICh1ICArIHByZWRbMV0pICYgMHgzZmY7CisgICAgICAgICAgICBkc3RfeVt4ICsgMV0gPSBwcmVkWzBdID0gKHkyICsgcHJlZFswXSkgJiAweDNmZjsKKyAgICAgICAgICAgIGRzdF9hW3ggICAgXSA9IHByZWRbM10gPSAoYTEgKyBwcmVkWzNdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X3ZbeCAvIDJdID0gcHJlZFsyXSA9ICh2ICArIHByZWRbMl0pICYgMHgzZmY7CisgICAgICAgICAgICBkc3RfYVt4ICsgMV0gPSBwcmVkWzNdID0gKGEyICsgcHJlZFszXSkgJiAweDNmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdIC8gMjsKKyAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXSAvIDI7CisgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl0gLyAyOworICAgIGRzdF9hICs9IHAtPmxpbmVzaXplWzNdIC8gMjsKKworICAgIGZvciAoeSA9IDE7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgICAgIGRzdF9hW3ggICAgXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3lbeCAgICBdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF9hW3ggKyAxXSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3lbeCArIDFdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRfVExbNl0sIHByZWRfTFs2XSwgcHJlZF9UWzZdOworICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdiwgYTEsIGEyOworCisgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9MWzBdID0gZHN0X3lbLXAtPmxpbmVzaXplWzBdIC8gMl07CisgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9MWzFdID0gZHN0X3VbLXAtPmxpbmVzaXplWzFdIC8gMl07CisgICAgICAgICAgICBwcmVkX1RMWzJdID0gcHJlZF9MWzJdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdIC8gMl07CisgICAgICAgICAgICBwcmVkX1RMWzRdID0gcHJlZF9MWzRdID0gZHN0X2FbLXAtPmxpbmVzaXplWzNdIC8gMl07CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgICAgIHByZWRfVFswXSA9IGRzdF95Wy1wLT5saW5lc2l6ZVswXSAvIDIgKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbM10gPSBkc3RfeVstcC0+bGluZXNpemVbMF0gLyAyICsgeCArIDFdOworICAgICAgICAgICAgICAgIHByZWRfVFsxXSA9IGRzdF91Wy1wLT5saW5lc2l6ZVsxXSAvIDIgKyB4IC8gMl07CisgICAgICAgICAgICAgICAgcHJlZF9UWzJdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdIC8gMiArIHggLyAyXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbNF0gPSBkc3RfYVstcC0+bGluZXNpemVbM10gLyAyICsgeF07CisgICAgICAgICAgICAgICAgcHJlZF9UWzVdID0gZHN0X2FbLXAtPmxpbmVzaXplWzNdIC8gMiArIHggKyAxXTsKKworICAgICAgICAgICAgICAgIGExID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHkxID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHUgID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIGEyID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHkyID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHYgID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0X3lbeCAgICBdID0gcHJlZF9MWzBdID0gKHkxICsgKCgzICogKHByZWRfVFswXSArIHByZWRfTFswXSkgLSAyICogcHJlZF9UTFswXSkgPj4gMikpICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gcHJlZF9MWzFdID0gKHUgKyAoKChwcmVkX0xbMV0gLSBwcmVkX1RMWzFdKSA+PiAxKSArIHByZWRfVFsxXSkpICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X3lbeCArIDFdID0gcHJlZF9MWzBdID0gKHkyICsgKCgzICogKHByZWRfVFszXSArIHByZWRfTFswXSkgLSAyICogcHJlZF9UWzBdKSA+PiAyKSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBwcmVkX0xbMl0gPSAodiArICgoKHByZWRfTFsyXSAtIHByZWRfVExbMl0pID4+IDEpICsgcHJlZF9UWzJdKSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfYVt4ICAgIF0gPSBwcmVkX0xbNF0gPSAoYTEgKyAoKDMgKiAocHJlZF9UWzRdICsgcHJlZF9MWzRdKSAtIDIgKiBwcmVkX1RMWzRdKSA+PiAyKSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfYVt4ICsgMV0gPSBwcmVkX0xbNF0gPSAoYTIgKyAoKDMgKiAocHJlZF9UWzVdICsgcHJlZF9MWzRdKSAtIDIgKiBwcmVkX1RbNF0pID4+IDIpKSAmIDB4M2ZmOworCisgICAgICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfVFszXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9UWzFdOworICAgICAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX1RbMl07CisgICAgICAgICAgICAgICAgcHJlZF9UTFs0XSA9IHByZWRfVFs1XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdIC8gMjsKKyAgICAgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV0gLyAyOworICAgICAgICBkc3RfdiArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgICAgIGRzdF9hICs9IHAtPmxpbmVzaXplWzNdIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9jODJpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmRzdF95LCAqZHN0X3UsICpkc3RfdiwgKmRzdF9hOworICAgIGludCB4LCB5OworCisgICAgZHN0X3kgPSBwLT5kYXRhWzBdOworICAgIGRzdF91ID0gcC0+ZGF0YVsxXTsKKyAgICBkc3RfdiA9IHAtPmRhdGFbMl07CisgICAgZHN0X2EgPSBwLT5kYXRhWzNdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkgKz0gMSkgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICAgICAgZHN0X2FbeCAgICBdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0X2FbeCArIDFdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJlZFs0XSA9IHsgMTI1LCAtMTI4LCAtMTI4LCAxMjUgfTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdiwgYTEsIGEyOworCisgICAgICAgICAgICAgICAgYTEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgeTEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdSAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgYTIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgeTIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdiAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBwcmVkWzBdID0gKHkxICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IHByZWRbMF0gPSAoeTIgKyBwcmVkWzBdKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gcHJlZFsxXSA9ICh1ICArIHByZWRbMV0pICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBwcmVkWzJdID0gKHYgICsgcHJlZFsyXSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF9hW3ggICAgXSA9IHByZWRbM10gPSAoYTEgKyBwcmVkWzNdKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X2FbeCArIDFdID0gcHJlZFszXSA9IChhMiArIHByZWRbM10pICYgMHhmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdOworICAgICAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl07CisgICAgICAgIGRzdF9hICs9IHAtPmxpbmVzaXplWzNdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2M4MnAoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqZHN0X3ksICpkc3RfdSwgKmRzdF92LCAqZHN0X2E7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3RfeSA9IHAtPmRhdGFbMF07CisgICAgZHN0X3UgPSBwLT5kYXRhWzFdOworICAgIGRzdF92ID0gcC0+ZGF0YVsyXTsKKyAgICBkc3RfYSA9IHAtPmRhdGFbM107CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGRzdF9hW3ggICAgXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF9hW3ggKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF92W3ggLyAyXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwcmVkWzRdID0geyAxMjUsIC0xMjgsIC0xMjgsIDEyNSB9OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdiwgYTEsIGEyOworCisgICAgICAgICAgICBhMSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHkxID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdSAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICBhMiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHkyID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdiAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IHByZWRbMF0gPSAoeTEgKyBwcmVkWzBdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBwcmVkWzFdID0gKHUgICsgcHJlZFsxXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X3lbeCArIDFdID0gcHJlZFswXSA9ICh5MiArIHByZWRbMF0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdF9hW3ggICAgXSA9IHByZWRbM10gPSAoYTEgKyBwcmVkWzNdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBwcmVkWzJdID0gKHYgICsgcHJlZFsyXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X2FbeCArIDFdID0gcHJlZFszXSA9IChhMiArIHByZWRbM10pICYgMHhmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdOworICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdOworICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdOworICAgIGRzdF9hICs9IHAtPmxpbmVzaXplWzNdOworCisgICAgZm9yICh5ID0gMTsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICAgICAgZHN0X2FbeCAgICBdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0X2FbeCArIDFdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJlZF9UTFs2XSwgcHJlZF9MWzZdLCBwcmVkX1RbNl07CisgICAgICAgICAgICBpbnQgeTEsIHkyLCB1LCB2LCBhMSwgYTI7CisKKyAgICAgICAgICAgIHByZWRfVExbMF0gPSBwcmVkX0xbMF0gPSBkc3RfeVstcC0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgcHJlZF9UTFsxXSA9IHByZWRfTFsxXSA9IGRzdF91Wy1wLT5saW5lc2l6ZVsxXV07CisgICAgICAgICAgICBwcmVkX1RMWzJdID0gcHJlZF9MWzJdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdXTsKKyAgICAgICAgICAgIHByZWRfVExbNF0gPSBwcmVkX0xbNF0gPSBkc3RfYVstcC0+bGluZXNpemVbM11dOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMF0gPSBkc3RfeVstcC0+bGluZXNpemVbMF0gKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbM10gPSBkc3RfeVstcC0+bGluZXNpemVbMF0gKyB4ICsgMV07CisgICAgICAgICAgICAgICAgcHJlZF9UWzFdID0gZHN0X3VbLXAtPmxpbmVzaXplWzFdICsgeCAvIDJdOworICAgICAgICAgICAgICAgIHByZWRfVFsyXSA9IGRzdF92Wy1wLT5saW5lc2l6ZVsyXSArIHggLyAyXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbNF0gPSBkc3RfYVstcC0+bGluZXNpemVbM10gKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbNV0gPSBkc3RfYVstcC0+bGluZXNpemVbM10gKyB4ICsgMV07CisKKyAgICAgICAgICAgICAgICBhMSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB5MSA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB1ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICBhMiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB5MiA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IHByZWRfTFswXSA9ICh5MSArICgoMyAqIChwcmVkX1RbMF0gKyBwcmVkX0xbMF0pIC0gMiAqIHByZWRfVExbMF0pID4+IDIpKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gcHJlZF9MWzFdID0gKHUgKyAoKChwcmVkX0xbMV0gLSBwcmVkX1RMWzFdKSA+PiAxKSArIHByZWRfVFsxXSkpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICsgMV0gPSBwcmVkX0xbMF0gPSAoeTIgKyAoKDMgKiAocHJlZF9UWzNdICsgcHJlZF9MWzBdKSAtIDIgKiBwcmVkX1RbMF0pID4+IDIpKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3ZbeCAvIDJdID0gcHJlZF9MWzJdID0gKHYgKyAoKChwcmVkX0xbMl0gLSBwcmVkX1RMWzJdKSA+PiAxKSArIHByZWRfVFsyXSkpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3RfYVt4ICAgIF0gPSBwcmVkX0xbNF0gPSAoYTEgKyAoKDMgKiAocHJlZF9UWzRdICsgcHJlZF9MWzRdKSAtIDIgKiBwcmVkX1RMWzRdKSA+PiAyKSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF9hW3ggKyAxXSA9IHByZWRfTFs0XSA9IChhMiArICgoMyAqIChwcmVkX1RbNV0gKyBwcmVkX0xbNF0pIC0gMiAqIHByZWRfVFs0XSkgPj4gMikpICYgMHhmZjsKKworICAgICAgICAgICAgICAgIHByZWRfVExbMF0gPSBwcmVkX1RbM107CisgICAgICAgICAgICAgICAgcHJlZF9UTFsxXSA9IHByZWRfVFsxXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzJdID0gcHJlZF9UWzJdOworICAgICAgICAgICAgICAgIHByZWRfVExbNF0gPSBwcmVkX1RbNV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3RfeSArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV07CisgICAgICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdOworICAgICAgICBkc3RfYSArPSBwLT5saW5lc2l6ZVszXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV95YnlyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmRzdF95LCAqZHN0X3UsICpkc3RfdjsKKyAgICBpbnQgeCwgeTsKKworICAgIGRzdF95ID0gcC0+ZGF0YVswXTsKKyAgICBkc3RfdSA9IHAtPmRhdGFbMV07CisgICAgZHN0X3YgPSBwLT5kYXRhWzJdOworCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCkgKyAxMjg7CisgICAgICAgICAgICBkc3RfeVt4ICsgMV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCkgKyAxMjg7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcHJlZFs0XSA9IHsgLTEyOCwgMTI4LCAxMjgsIDAgfTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGludCB5MSwgeTIsIHUsIHY7CisKKyAgICAgICAgICAgIHkxID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdSAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICB5MiA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHYgID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBwcmVkWzBdID0gKHkxICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gcHJlZFsxXSA9ICh1ICArIHByZWRbMV0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IHByZWRbMF0gPSAoeTIgKyBwcmVkWzBdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBwcmVkWzJdID0gKHYgICsgcHJlZFsyXSkgJiAweGZmOworICAgICAgICB9CisgICAgfQorCisgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF07CisgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV07CisgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl07CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gZ2V0X2JpdHMoZ2IsIDgpICsgMTI4OworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCkgKyAxMjg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJlZF9UTFs0XSwgcHJlZF9MWzRdLCBwcmVkX1RbNF07CisgICAgICAgICAgICBpbnQgeTEsIHkyLCB1LCB2OworCisgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9MWzBdID0gZHN0X3lbLXAtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX0xbMV0gPSBkc3RfdVstcC0+bGluZXNpemVbMV1dOworICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfTFsyXSA9IGRzdF92Wy1wLT5saW5lc2l6ZVsyXV07CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgICAgIHByZWRfVFswXSA9IGRzdF95Wy1wLT5saW5lc2l6ZVswXSArIHhdOworICAgICAgICAgICAgICAgIHByZWRfVFszXSA9IGRzdF95Wy1wLT5saW5lc2l6ZVswXSArIHggKyAxXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMV0gPSBkc3RfdVstcC0+bGluZXNpemVbMV0gKyB4IC8gMl07CisgICAgICAgICAgICAgICAgcHJlZF9UWzJdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdICsgeCAvIDJdOworCisgICAgICAgICAgICAgICAgeTEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdSAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgeTIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdiAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBwcmVkX0xbMF0gPSAoeTEgKyAoKDMgKiAocHJlZF9UWzBdICsgcHJlZF9MWzBdKSAtIDIgKiBwcmVkX1RMWzBdKSA+PiAyKSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IHByZWRfTFsxXSA9ICh1ICsgKCgocHJlZF9MWzFdIC0gcHJlZF9UTFsxXSkgPj4gMSkgKyBwcmVkX1RbMV0pKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3lbeCArIDFdID0gcHJlZF9MWzBdID0gKHkyICsgKCgzICogKHByZWRfVFszXSArIHByZWRfTFswXSkgLSAyICogcHJlZF9UWzBdKSA+PiAyKSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF92W3ggLyAyXSA9IHByZWRfTFsyXSA9ICh2ICsgKCgocHJlZF9MWzJdIC0gcHJlZF9UTFsyXSkgPj4gMSkgKyBwcmVkX1RbMl0pKSAmIDB4ZmY7CisKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9UWzNdOworICAgICAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX1RbMV07CisgICAgICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfVFsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdOworICAgICAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfYnlyeWkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqZHN0X3ksICpkc3RfdSwgKmRzdF92OworICAgIGludCB4LCB5OworCisgICAgZHN0X3kgPSBwLT5kYXRhWzBdOworICAgIGRzdF91ID0gcC0+ZGF0YVsxXTsKKyAgICBkc3RfdiA9IHAtPmRhdGFbMl07CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF92W3ggLyAyXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwcmVkWzRdID0geyAxMjUsIC0xMjgsIC0xMjgsIDAgfTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgIGludCB5MSwgeTIsIHUsIHY7CisKKyAgICAgICAgICAgIHkxID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdSAgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICB5MiA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHYgID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBwcmVkWzBdID0gKHkxICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gcHJlZFsxXSA9ICh1ICArIHByZWRbMV0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IHByZWRbMF0gPSAoeTIgKyBwcmVkWzBdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBwcmVkWzJdID0gKHYgICsgcHJlZFsyXSkgJiAweGZmOworICAgICAgICB9CisgICAgfQorCisgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF07CisgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV07CisgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl07CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0X3VbeCAvIDJdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJlZF9MWzRdOworICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdjsKKworICAgICAgICAgICAgcHJlZF9MWzBdID0gZHN0X3lbLXAtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgIHByZWRfTFsxXSA9IGRzdF91Wy1wLT5saW5lc2l6ZVsxXV07CisgICAgICAgICAgICBwcmVkX0xbMl0gPSBkc3RfdlstcC0+bGluZXNpemVbMl1dOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICB5MSA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB1ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB5MiA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdF95W3ggICAgXSA9IHByZWRfTFswXSA9ICh5MSArIHByZWRfTFswXSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IHByZWRfTFsxXSA9ICh1ICArIHByZWRfTFsxXSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IHByZWRfTFswXSA9ICh5MiArIHByZWRfTFswXSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF92W3ggLyAyXSA9IHByZWRfTFsyXSA9ICh2ICsgIHByZWRfTFsyXSkgJiAweGZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF07CisgICAgICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdOworICAgICAgICBkc3RfdiArPSBwLT5saW5lc2l6ZVsyXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9ieXJ5KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmRzdF95LCAqZHN0X3UsICpkc3RfdjsKKyAgICBpbnQgeCwgeTsKKworICAgIGRzdF95ID0gcC0+ZGF0YVswXTsKKyAgICBkc3RfdSA9IHAtPmRhdGFbMV07CisgICAgZHN0X3YgPSBwLT5kYXRhWzJdOworCisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICBkc3RfeVt4ICAgIF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RfeVt4ICsgMV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcHJlZFs0XSA9IHsgMTI1LCAtMTI4LCAtMTI4LCAwIH07CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICBpbnQgeTEsIHkyLCB1LCB2OworCisgICAgICAgICAgICB5MSA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHUgID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgeTIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICB2ICA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgZHN0X3lbeCAgICBdID0gcHJlZFswXSA9ICh5MSArIHByZWRbMF0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IHByZWRbMV0gPSAodSAgKyBwcmVkWzFdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3RfeVt4ICsgMV0gPSBwcmVkWzBdID0gKHkyICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X3ZbeCAvIDJdID0gcHJlZFsyXSA9ICh2ICArIHByZWRbMl0pICYgMHhmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdOworICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdOworICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdOworCisgICAgZm9yICh5ID0gMTsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSAyKSB7CisgICAgICAgICAgICAgICAgZHN0X3lbeCAgICBdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdF91W3ggLyAyXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RfeVt4ICsgMV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0X3ZbeCAvIDJdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRfVExbNF0sIHByZWRfTFs0XSwgcHJlZF9UWzRdOworICAgICAgICAgICAgaW50IHkxLCB5MiwgdSwgdjsKKworICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfTFswXSA9IGRzdF95Wy1wLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9MWzFdID0gZHN0X3VbLXAtPmxpbmVzaXplWzFdXTsKKyAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX0xbMl0gPSBkc3RfdlstcC0+bGluZXNpemVbMl1dOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMF0gPSBkc3RfeVstcC0+bGluZXNpemVbMF0gKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbM10gPSBkc3RfeVstcC0+bGluZXNpemVbMF0gKyB4ICsgMV07CisgICAgICAgICAgICAgICAgcHJlZF9UWzFdID0gZHN0X3VbLXAtPmxpbmVzaXplWzFdICsgeCAvIDJdOworICAgICAgICAgICAgICAgIHByZWRfVFsyXSA9IGRzdF92Wy1wLT5saW5lc2l6ZVsyXSArIHggLyAyXTsKKworICAgICAgICAgICAgICAgIHkxID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHUgID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHkyID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHYgID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0X3lbeCAgICBdID0gcHJlZF9MWzBdID0gKHkxICsgKCgzICogKHByZWRfVFswXSArIHByZWRfTFswXSkgLSAyICogcHJlZF9UTFswXSkgPj4gMikpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3RfdVt4IC8gMl0gPSBwcmVkX0xbMV0gPSAodSArICgoKHByZWRfTFsxXSAtIHByZWRfVExbMV0pID4+IDEpICsgcHJlZF9UWzFdKSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF95W3ggKyAxXSA9IHByZWRfTFswXSA9ICh5MiArICgoMyAqIChwcmVkX1RbM10gKyBwcmVkX0xbMF0pIC0gMiAqIHByZWRfVFswXSkgPj4gMikpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4IC8gMl0gPSBwcmVkX0xbMl0gPSAodiArICgoKHByZWRfTFsyXSAtIHByZWRfVExbMl0pID4+IDEpICsgcHJlZF9UWzJdKSkgJiAweGZmOworCisgICAgICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfVFszXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9UWzFdOworICAgICAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX1RbMl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3RfeSArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV07CisgICAgICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3licmkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqZHN0X3ksICpkc3RfdSwgKmRzdF92OworICAgIGludCB4LCB5OworCisgICAgZHN0X3kgPSBwLT5kYXRhWzBdOworICAgIGRzdF91ID0gcC0+ZGF0YVsxXTsKKyAgICBkc3RfdiA9IHAtPmRhdGFbMl07CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRzdF95W3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZHN0X3VbeF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3Rfdlt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwcmVkWzRdID0geyBzLT5hbHQgPyAxMjUgOiAtMTQ2LCAtMTI4LCAtMTI4LCAtMTI4IH07CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgeSwgdSwgdjsKKworICAgICAgICAgICAgeSA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHUgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICB2ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICBkc3RfeVt4XSA9IHByZWRbMF0gPSAoeSArIHByZWRbMF0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdF91W3hdID0gcHJlZFsxXSA9ICh1ICsgcHJlZFsxXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X3ZbeF0gPSBwcmVkWzJdID0gKHYgKyBwcmVkWzJdKSAmIDB4ZmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3RfeSArPSBwLT5saW5lc2l6ZVswXTsKKyAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXTsKKyAgICBkc3RfdiArPSBwLT5saW5lc2l6ZVsyXTsKKworICAgIGZvciAoeSA9IDE7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGRzdF95W3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdF91W3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRfTFs0XTsKKyAgICAgICAgICAgIGludCB5LCB1LCB2OworCisgICAgICAgICAgICBwcmVkX0xbMF0gPSBkc3RfeVstcC0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgcHJlZF9MWzFdID0gZHN0X3VbLXAtPmxpbmVzaXplWzFdXTsKKyAgICAgICAgICAgIHByZWRfTFsyXSA9IGRzdF92Wy1wLT5saW5lc2l6ZVsyXV07CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIHkgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSBwcmVkX0xbMF0gPSAoeSArIHByZWRfTFswXSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF91W3hdID0gcHJlZF9MWzFdID0gKHUgKyBwcmVkX0xbMV0pICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9IHByZWRfTFsyXSA9ICh2ICsgcHJlZF9MWzJdKSAmIDB4ZmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3RfeSArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV07CisgICAgICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX3licihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpkc3RfeSwgKmRzdF91LCAqZHN0X3Y7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3RfeSA9IHAtPmRhdGFbMF07CisgICAgZHN0X3UgPSBwLT5kYXRhWzFdOworICAgIGRzdF92ID0gcC0+ZGF0YVsyXTsKKworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgZHN0X3lbeF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RfdVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF92W3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHByZWRbNF0gPSB7IHMtPmFsdCA/IDEyNSA6IC0xNDYsIC0xMjgsIC0xMjgsIC0xMjggfTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCB5LCB1LCB2OworCisgICAgICAgICAgICB5ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHYgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgIGRzdF95W3hdID0gcHJlZFswXSA9ICh5ICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X3VbeF0gPSBwcmVkWzFdID0gKHUgKyBwcmVkWzFdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3Rfdlt4XSA9IHByZWRbMl0gPSAodiArIHByZWRbMl0pICYgMHhmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdOworICAgIGRzdF91ICs9IHAtPmxpbmVzaXplWzFdOworICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdOworCisgICAgZm9yICh5ID0gMTsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJlZF9UTFs0XSwgcHJlZF9MWzRdLCBwcmVkX1RbNF07CisgICAgICAgICAgICBpbnQgeSwgdSwgdjsKKworICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfTFswXSA9IGRzdF95Wy1wLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9MWzFdID0gZHN0X3VbLXAtPmxpbmVzaXplWzFdXTsKKyAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX0xbMl0gPSBkc3RfdlstcC0+bGluZXNpemVbMl1dOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMF0gPSBkc3RfeVstcC0+bGluZXNpemVbMF0gKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMV0gPSBkc3RfdVstcC0+bGluZXNpemVbMV0gKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMl0gPSBkc3RfdlstcC0+bGluZXNpemVbMl0gKyB4XTsKKworICAgICAgICAgICAgICAgIHkgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSBwcmVkX0xbMF0gPSAoeSArICgoMyAqIChwcmVkX1RbMF0gKyBwcmVkX0xbMF0pIC0gMiAqIHByZWRfVExbMF0pID4+IDIpKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBwcmVkX0xbMV0gPSAodSArICgoMyAqIChwcmVkX1RbMV0gKyBwcmVkX0xbMV0pIC0gMiAqIHByZWRfVExbMV0pID4+IDIpKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSBwcmVkX0xbMl0gPSAodiArICgoMyAqIChwcmVkX1RbMl0gKyBwcmVkX0xbMl0pIC0gMiAqIHByZWRfVExbMl0pID4+IDIpKSAmIDB4ZmY7CisKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9UWzBdOworICAgICAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX1RbMV07CisgICAgICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfVFsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdOworICAgICAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfYXlicmkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqZHN0X2EsICpkc3RfeSwgKmRzdF91LCAqZHN0X3Y7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3RfYSA9IHAtPmRhdGFbM107CisgICAgZHN0X3kgPSBwLT5kYXRhWzBdOworICAgIGRzdF91ID0gcC0+ZGF0YVsxXTsKKyAgICBkc3RfdiA9IHAtPmRhdGFbMl07CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRzdF9hW3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZHN0X3lbeF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RfdVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF92W3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHByZWRbNF0gPSB7IDEyNSwgcy0+YWx0ID8gMTI1IDogLTE0NiwgLTEyOCwgLTEyOCB9OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IGEsIHksIHUsIHY7CisKKyAgICAgICAgICAgIGEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICB5ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHYgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgIGRzdF9hW3hdID0gcHJlZFswXSA9IChhICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X3lbeF0gPSBwcmVkWzFdID0gKHkgKyBwcmVkWzFdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3RfdVt4XSA9IHByZWRbMl0gPSAodSArIHByZWRbMl0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdF92W3hdID0gcHJlZFszXSA9ICh2ICsgcHJlZFszXSkgJiAweGZmOworICAgICAgICB9CisgICAgfQorCisgICAgZHN0X2EgKz0gcC0+bGluZXNpemVbM107CisgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF07CisgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV07CisgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl07CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RfYVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwcmVkX0xbNF07CisgICAgICAgICAgICBpbnQgYSwgeSwgdSwgdjsKKworICAgICAgICAgICAgcHJlZF9MWzBdID0gZHN0X2FbLXAtPmxpbmVzaXplWzNdXTsKKyAgICAgICAgICAgIHByZWRfTFsxXSA9IGRzdF95Wy1wLT5saW5lc2l6ZVswXV07CisgICAgICAgICAgICBwcmVkX0xbMl0gPSBkc3RfdVstcC0+bGluZXNpemVbMV1dOworICAgICAgICAgICAgcHJlZF9MWzNdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdXTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgYSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB5ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHUgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdF9hW3hdID0gcHJlZF9MWzBdID0gKGEgKyBwcmVkX0xbMF0pICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9IHByZWRfTFsxXSA9ICh5ICsgcHJlZF9MWzFdKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBwcmVkX0xbMl0gPSAodSArIHByZWRfTFsyXSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gcHJlZF9MWzNdID0gKHYgKyBwcmVkX0xbM10pICYgMHhmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF9hICs9IHAtPmxpbmVzaXplWzNdOworICAgICAgICBkc3RfeSArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV07CisgICAgICAgIGRzdF92ICs9IHAtPmxpbmVzaXplWzJdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2F5YnIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqZHN0X2EsICpkc3RfeSwgKmRzdF91LCAqZHN0X3Y7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3RfYSA9IHAtPmRhdGFbM107CisgICAgZHN0X3kgPSBwLT5kYXRhWzBdOworICAgIGRzdF91ID0gcC0+ZGF0YVsxXTsKKyAgICBkc3RfdiA9IHAtPmRhdGFbMl07CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRzdF9hW3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZHN0X3lbeF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RfdVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdF92W3hdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHByZWRbNF0gPSB7IDEyNSwgcy0+YWx0ID8gMTI1IDogLTE0NiwgLTEyOCwgLTEyOCB9OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IGEsIHksIHUsIHY7CisKKyAgICAgICAgICAgIGEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICB5ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgdSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHYgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgIGRzdF9hW3hdID0gcHJlZFswXSA9IChhICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgZHN0X3lbeF0gPSBwcmVkWzFdID0gKHkgKyBwcmVkWzFdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3RfdVt4XSA9IHByZWRbMl0gPSAodSArIHByZWRbMl0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdF92W3hdID0gcHJlZFszXSA9ICh2ICsgcHJlZFszXSkgJiAweGZmOworICAgICAgICB9CisgICAgfQorCisgICAgZHN0X2EgKz0gcC0+bGluZXNpemVbM107CisgICAgZHN0X3kgKz0gcC0+bGluZXNpemVbMF07CisgICAgZHN0X3UgKz0gcC0+bGluZXNpemVbMV07CisgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl07CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RfYVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RfeVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwcmVkX1RMWzRdLCBwcmVkX0xbNF0sIHByZWRfVFs0XTsKKyAgICAgICAgICAgIGludCBhLCB5LCB1LCB2OworCisgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9MWzBdID0gZHN0X2FbLXAtPmxpbmVzaXplWzNdXTsKKyAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX0xbMV0gPSBkc3RfeVstcC0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfTFsyXSA9IGRzdF91Wy1wLT5saW5lc2l6ZVsxXV07CisgICAgICAgICAgICBwcmVkX1RMWzNdID0gcHJlZF9MWzNdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdXTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcHJlZF9UWzBdID0gZHN0X2FbLXAtPmxpbmVzaXplWzNdICsgeF07CisgICAgICAgICAgICAgICAgcHJlZF9UWzFdID0gZHN0X3lbLXAtPmxpbmVzaXplWzBdICsgeF07CisgICAgICAgICAgICAgICAgcHJlZF9UWzJdID0gZHN0X3VbLXAtPmxpbmVzaXplWzFdICsgeF07CisgICAgICAgICAgICAgICAgcHJlZF9UWzNdID0gZHN0X3ZbLXAtPmxpbmVzaXplWzJdICsgeF07CisKKyAgICAgICAgICAgICAgICBhID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHkgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgdSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICB2ID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0X2FbeF0gPSBwcmVkX0xbMF0gPSAoYSArICgoMyAqIChwcmVkX1RbMF0gKyBwcmVkX0xbMF0pIC0gMiAqIHByZWRfVExbMF0pID4+IDIpKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSBwcmVkX0xbMV0gPSAoeSArICgoMyAqIChwcmVkX1RbMV0gKyBwcmVkX0xbMV0pIC0gMiAqIHByZWRfVExbMV0pID4+IDIpKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSBwcmVkX0xbMl0gPSAodSArICgoMyAqIChwcmVkX1RbMl0gKyBwcmVkX0xbMl0pIC0gMiAqIHByZWRfVExbMl0pID4+IDIpKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSBwcmVkX0xbM10gPSAodiArICgoMyAqIChwcmVkX1RbM10gKyBwcmVkX0xbM10pIC0gMiAqIHByZWRfVExbM10pID4+IDIpKSAmIDB4ZmY7CisKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9UWzBdOworICAgICAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX1RbMV07CisgICAgICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfVFsyXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzNdID0gcHJlZF9UWzNdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZHN0X2EgKz0gcC0+bGluZXNpemVbM107CisgICAgICAgIGRzdF95ICs9IHAtPmxpbmVzaXplWzBdOworICAgICAgICBkc3RfdSArPSBwLT5saW5lc2l6ZVsxXTsKKyAgICAgICAgZHN0X3YgKz0gcC0+bGluZXNpemVbMl07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfYXJneGkoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDE2X3QgKmRzdF9yLCAqZHN0X2csICpkc3RfYiwgKmRzdF9hOworICAgIGludCB4LCB5OworCisgICAgZHN0X3IgPSAodWludDE2X3QgKilwLT5kYXRhWzJdOworICAgIGRzdF9nID0gKHVpbnQxNl90ICopcC0+ZGF0YVswXTsKKyAgICBkc3RfYiA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMV07CisgICAgZHN0X2EgPSAodWludDE2X3QgKilwLT5kYXRhWzNdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0X2FbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF9yW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfZ1t4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X2JbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRbNF0gPSB7IDUxMiwgNTEyLCA1MTIsIDUxMiB9OworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgciwgZywgYiwgYTsKKworICAgICAgICAgICAgICAgIGEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgciA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICBnID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIGIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgICAgICBkc3RfYVt4XSA9IHByZWRbM10gPSAoYSArIHByZWRbM10pICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X3JbeF0gPSBwcmVkWzBdID0gKHIgKyBwcmVkWzBdKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF9nW3hdID0gcHJlZFsxXSA9IChyICsgZyArIHByZWRbMV0pICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X2JbeF0gPSBwcmVkWzJdID0gKHIgKyBnICsgYiArIHByZWRbMl0pICYgMHgzZmY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3RfciArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgICAgIGRzdF9nICs9IHAtPmxpbmVzaXplWzBdIC8gMjsKKyAgICAgICAgZHN0X2IgKz0gcC0+bGluZXNpemVbMV0gLyAyOworICAgICAgICBkc3RfYSArPSBwLT5saW5lc2l6ZVszXSAvIDI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfYXJneChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50MTZfdCAqZHN0X3IsICpkc3RfZywgKmRzdF9iLCAqZHN0X2E7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3RfciA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMl07CisgICAgZHN0X2cgPSAodWludDE2X3QgKilwLT5kYXRhWzBdOworICAgIGRzdF9iID0gKHVpbnQxNl90ICopcC0+ZGF0YVsxXTsKKyAgICBkc3RfYSA9ICh1aW50MTZfdCAqKXAtPmRhdGFbM107CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRzdF9hW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGRzdF9yW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGRzdF9nW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGRzdF9iW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwcmVkWzRdID0geyA1MTIsIDUxMiwgNTEyLCA1MTIgfTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCByLCBnLCBiLCBhOworCisgICAgICAgICAgICBhID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgciA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIGcgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICBiID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICBkc3RfYVt4XSA9IHByZWRbM10gPSAoYSArIHByZWRbM10pICYgMHgzZmY7CisgICAgICAgICAgICBkc3Rfclt4XSA9IHByZWRbMF0gPSAociArIHByZWRbMF0pICYgMHgzZmY7CisgICAgICAgICAgICBkc3RfZ1t4XSA9IHByZWRbMV0gPSAociArIGcgKyBwcmVkWzFdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X2JbeF0gPSBwcmVkWzJdID0gKHIgKyBnICsgYiArIHByZWRbMl0pICYgMHgzZmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3RfciArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgZHN0X2cgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgIGRzdF9iICs9IHAtPmxpbmVzaXplWzFdIC8gMjsKKyAgICBkc3RfYSArPSBwLT5saW5lc2l6ZVszXSAvIDI7CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RfYVt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X3JbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF9nW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfYlt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJlZF9UTFs0XSwgcHJlZF9MWzRdLCBwcmVkX1RbNF07CisgICAgICAgICAgICBpbnQgciwgZywgYiwgYTsKKworICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfTFswXSA9IGRzdF9yWy1wLT5saW5lc2l6ZVsyXSAvIDJdOworICAgICAgICAgICAgcHJlZF9UTFsxXSA9IHByZWRfTFsxXSA9IGRzdF9nWy1wLT5saW5lc2l6ZVswXSAvIDJdOworICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfTFsyXSA9IGRzdF9iWy1wLT5saW5lc2l6ZVsxXSAvIDJdOworICAgICAgICAgICAgcHJlZF9UTFszXSA9IHByZWRfTFszXSA9IGRzdF9hWy1wLT5saW5lc2l6ZVszXSAvIDJdOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMF0gPSBkc3RfclstcC0+bGluZXNpemVbMl0gLyAyICsgeF07CisgICAgICAgICAgICAgICAgcHJlZF9UWzFdID0gZHN0X2dbLXAtPmxpbmVzaXplWzBdIC8gMiArIHhdOworICAgICAgICAgICAgICAgIHByZWRfVFsyXSA9IGRzdF9iWy1wLT5saW5lc2l6ZVsxXSAvIDIgKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbM10gPSBkc3RfYVstcC0+bGluZXNpemVbM10gLyAyICsgeF07CisKKyAgICAgICAgICAgICAgICBhID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIHIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgZyA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICBiID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0X2FbeF0gPSBwcmVkX0xbM10gPSAoYSArICgoMyAqIChwcmVkX1RbM10gKyBwcmVkX0xbM10pIC0gMiAqIHByZWRfVExbM10pID4+IDIpKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF9yW3hdID0gcHJlZF9MWzBdID0gKHIgKyAoKDMgKiAocHJlZF9UWzBdICsgcHJlZF9MWzBdKSAtIDIgKiBwcmVkX1RMWzBdKSA+PiAyKSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfZ1t4XSA9IHByZWRfTFsxXSA9IChyICsgZyArICgoMyAqIChwcmVkX1RbMV0gKyBwcmVkX0xbMV0pIC0gMiAqIHByZWRfVExbMV0pID4+IDIpKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF9iW3hdID0gcHJlZF9MWzJdID0gKHIgKyBnICsgYiArICgoMyAqIChwcmVkX1RbMl0gKyBwcmVkX0xbMl0pIC0gMiAqIHByZWRfVExbMl0pID4+IDIpKSAmIDB4M2ZmOworCisgICAgICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfVFswXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9UWzFdOworICAgICAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX1RbMl07CisgICAgICAgICAgICAgICAgcHJlZF9UTFszXSA9IHByZWRfVFszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF9yICs9IHAtPmxpbmVzaXplWzJdIC8gMjsKKyAgICAgICAgZHN0X2cgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgICAgICBkc3RfYiArPSBwLT5saW5lc2l6ZVsxXSAvIDI7CisgICAgICAgIGRzdF9hICs9IHAtPmxpbmVzaXplWzNdIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9yZ2J4aShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50MTZfdCAqZHN0X3IsICpkc3RfZywgKmRzdF9iOworICAgIGludCB4LCB5OworCisgICAgZHN0X3IgPSAodWludDE2X3QgKilwLT5kYXRhWzJdOworICAgIGRzdF9nID0gKHVpbnQxNl90ICopcC0+ZGF0YVswXTsKKyAgICBkc3RfYiA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMV07CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3Rfclt4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X2dbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgICAgIGRzdF9iW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwcmVkWzRdID0geyA1MTIsIDUxMiwgNTEyLCAwIH07CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGludCByLCBnLCBiOworCisgICAgICAgICAgICAgICAgciA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICBnID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIGIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgICAgICBkc3Rfclt4XSA9IHByZWRbMF0gPSAociArIHByZWRbMF0pICYgMHgzZmY7CisgICAgICAgICAgICAgICAgZHN0X2dbeF0gPSBwcmVkWzFdID0gKHIgKyBnICsgcHJlZFsxXSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfYlt4XSA9IHByZWRbMl0gPSAociArIGcgKyBiICsgcHJlZFsyXSkgJiAweDNmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdF9yICs9IHAtPmxpbmVzaXplWzJdIC8gMjsKKyAgICAgICAgZHN0X2cgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgICAgICBkc3RfYiArPSBwLT5saW5lc2l6ZVsxXSAvIDI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfcmdieChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50MTZfdCAqZHN0X3IsICpkc3RfZywgKmRzdF9iOworICAgIGludCB4LCB5OworCisgICAgZHN0X3IgPSAodWludDE2X3QgKilwLT5kYXRhWzJdOworICAgIGRzdF9nID0gKHVpbnQxNl90ICopcC0+ZGF0YVswXTsKKyAgICBkc3RfYiA9ICh1aW50MTZfdCAqKXAtPmRhdGFbMV07CisKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRzdF9yW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGRzdF9nW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgIGRzdF9iW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwcmVkWzRdID0geyA1MTIsIDUxMiwgNTEyLCAwIH07CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgciwgZywgYjsKKworICAgICAgICAgICAgciA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIGcgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICBiID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICBkc3Rfclt4XSA9IHByZWRbMF0gPSAociArIHByZWRbMF0pICYgMHgzZmY7CisgICAgICAgICAgICBkc3RfZ1t4XSA9IHByZWRbMV0gPSAociArIGcgKyBwcmVkWzFdKSAmIDB4M2ZmOworICAgICAgICAgICAgZHN0X2JbeF0gPSBwcmVkWzJdID0gKHIgKyBnICsgYiArIHByZWRbMl0pICYgMHgzZmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3RfciArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgZHN0X2cgKz0gcC0+bGluZXNpemVbMF0gLyAyOworICAgIGRzdF9iICs9IHAtPmxpbmVzaXplWzFdIC8gMjsKKworICAgIGZvciAoeSA9IDE7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGRzdF9yW3hdID0gZ2V0X2JpdHMoZ2IsIDEwKTsKKyAgICAgICAgICAgICAgICBkc3RfZ1t4XSA9IGdldF9iaXRzKGdiLCAxMCk7CisgICAgICAgICAgICAgICAgZHN0X2JbeF0gPSBnZXRfYml0cyhnYiwgMTApOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRfVExbNF0sIHByZWRfTFs0XSwgcHJlZF9UWzRdOworICAgICAgICAgICAgaW50IHIsIGcsIGI7CisKKyAgICAgICAgICAgIHByZWRfVExbMF0gPSBwcmVkX0xbMF0gPSBkc3RfclstcC0+bGluZXNpemVbMl0gLyAyXTsKKyAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX0xbMV0gPSBkc3RfZ1stcC0+bGluZXNpemVbMF0gLyAyXTsKKyAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX0xbMl0gPSBkc3RfYlstcC0+bGluZXNpemVbMV0gLyAyXTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcHJlZF9UWzBdID0gZHN0X3JbLXAtPmxpbmVzaXplWzJdIC8gMiArIHhdOworICAgICAgICAgICAgICAgIHByZWRfVFsxXSA9IGRzdF9nWy1wLT5saW5lc2l6ZVswXSAvIDIgKyB4XTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMl0gPSBkc3RfYlstcC0+bGluZXNpemVbMV0gLyAyICsgeF07CisKKyAgICAgICAgICAgICAgICByID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIGcgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgYiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdF9yW3hdID0gcHJlZF9MWzBdID0gKHIgKyAoKDMgKiAocHJlZF9UWzBdICsgcHJlZF9MWzBdKSAtIDIgKiBwcmVkX1RMWzBdKSA+PiAyKSkgJiAweDNmZjsKKyAgICAgICAgICAgICAgICBkc3RfZ1t4XSA9IHByZWRfTFsxXSA9IChyICsgZyArICgoMyAqIChwcmVkX1RbMV0gKyBwcmVkX0xbMV0pIC0gMiAqIHByZWRfVExbMV0pID4+IDIpKSAmIDB4M2ZmOworICAgICAgICAgICAgICAgIGRzdF9iW3hdID0gcHJlZF9MWzJdID0gKHIgKyBnICsgYiArICgoMyAqIChwcmVkX1RbMl0gKyBwcmVkX0xbMl0pIC0gMiAqIHByZWRfVExbMl0pID4+IDIpKSAmIDB4M2ZmOworCisgICAgICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfVFswXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9UWzFdOworICAgICAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX1RbMl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkc3RfciArPSBwLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgICAgIGRzdF9nICs9IHAtPmxpbmVzaXplWzBdIC8gMjsKKyAgICAgICAgZHN0X2IgKz0gcC0+bGluZXNpemVbMV0gLyAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZGVjb2RlX2FyZ2JpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqcCwgR2V0Qml0Q29udGV4dCAqZ2IpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKmRzdDsKKyAgICBpbnQgeCwgeTsKKworICAgIGRzdCA9IHAtPmRhdGFbMF07CisgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBkc3RbeCAqIDQgKyAwXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdFt4ICogNCArIDFdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZHN0W3ggKiA0ICsgMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RbeCAqIDQgKyAzXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwcmVkWzRdID0geyAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4IH07CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgYSwgciwgZywgYjsKKworICAgICAgICAgICAgYSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIHIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICBnID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworICAgICAgICAgICAgYiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgZHN0WzQgKiB4ICsgMF0gPSBwcmVkWzBdID0gKGEgKyBwcmVkWzBdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3RbNCAqIHggKyAxXSA9IHByZWRbMV0gPSAociArIHByZWRbMV0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdFs0ICogeCArIDJdID0gcHJlZFsyXSA9IChyICsgZyArIHByZWRbMl0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdFs0ICogeCArIDNdID0gcHJlZFszXSA9IChyICsgZyArIGIgKyBwcmVkWzNdKSAmIDB4ZmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisgICAgZm9yICh5ID0gMTsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0W3ggKiA0ICsgMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0W3ggKiA0ICsgMV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0W3ggKiA0ICsgMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0W3ggKiA0ICsgM10gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJlZF9MWzRdOworICAgICAgICAgICAgaW50IGEsIHIsIGcsIGI7CisKKyAgICAgICAgICAgIHByZWRfTFswXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyAwXTsKKyAgICAgICAgICAgIHByZWRfTFsxXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyAxXTsKKyAgICAgICAgICAgIHByZWRfTFsyXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyAyXTsKKyAgICAgICAgICAgIHByZWRfTFszXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyAzXTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgYSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICByID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIGcgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgYiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdFs0ICogeCArIDBdID0gcHJlZF9MWzBdID0gKGEgKyBwcmVkX0xbMF0pICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3RbNCAqIHggKyAxXSA9IHByZWRfTFsxXSA9IChyICsgcHJlZF9MWzFdKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0WzQgKiB4ICsgMl0gPSBwcmVkX0xbMl0gPSAociArIGcgKyBwcmVkX0xbMl0pICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3RbNCAqIHggKyAzXSA9IHByZWRfTFszXSA9IChyICsgZyArIGIgKyBwcmVkX0xbM10pICYgMHhmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfYXJnYihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3QgPSBwLT5kYXRhWzBdOworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgZHN0W3ggKiA0ICsgMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RbeCAqIDQgKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdFt4ICogNCArIDJdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZHN0W3ggKiA0ICsgM10gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcHJlZFs0XSA9IHsgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCB9OworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IGEsIHIsIGcsIGI7CisKKyAgICAgICAgICAgIGEgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICByID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgZyA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIGIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgIGRzdFs0ICogeCArIDBdID0gcHJlZFswXSA9IChhICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgZHN0WzQgKiB4ICsgMV0gPSBwcmVkWzFdID0gKHIgKyBwcmVkWzFdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3RbNCAqIHggKyAyXSA9IHByZWRbMl0gPSAociArIGcgKyBwcmVkWzJdKSAmIDB4ZmY7CisgICAgICAgICAgICBkc3RbNCAqIHggKyAzXSA9IHByZWRbM10gPSAociArIGcgKyBiICsgcHJlZFszXSkgJiAweGZmOworICAgICAgICB9CisgICAgfQorCisgICAgZHN0ICs9IHAtPmxpbmVzaXplWzBdOworICAgIGZvciAoeSA9IDE7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGRzdFt4ICogNCArIDBdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdFt4ICogNCArIDFdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdFt4ICogNCArIDJdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgICAgIGRzdFt4ICogNCArIDNdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHByZWRfVExbNF0sIHByZWRfTFs0XSwgcHJlZF9UWzRdOworICAgICAgICAgICAgaW50IGEsIHIsIGcsIGI7CisKKyAgICAgICAgICAgIHByZWRfVExbMF0gPSBwcmVkX0xbMF0gPSBkc3RbLXAtPmxpbmVzaXplWzBdICsgMF07CisgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9MWzFdID0gZHN0Wy1wLT5saW5lc2l6ZVswXSArIDFdOworICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfTFsyXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyAyXTsKKyAgICAgICAgICAgIHByZWRfVExbM10gPSBwcmVkX0xbM10gPSBkc3RbLXAtPmxpbmVzaXplWzBdICsgM107CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIHByZWRfVFswXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyA0ICogeCArIDBdOworICAgICAgICAgICAgICAgIHByZWRfVFsxXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyA0ICogeCArIDFdOworICAgICAgICAgICAgICAgIHByZWRfVFsyXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyA0ICogeCArIDJdOworICAgICAgICAgICAgICAgIHByZWRfVFszXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyA0ICogeCArIDNdOworCisgICAgICAgICAgICAgICAgYSA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICByID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIGcgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgYiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdFs0ICogeCArIDBdID0gcHJlZF9MWzBdID0gKGEgKyAoKDMgKiAocHJlZF9UWzBdICsgcHJlZF9MWzBdKSAtIDIgKiBwcmVkX1RMWzBdKSA+PiAyKSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdFs0ICogeCArIDFdID0gcHJlZF9MWzFdID0gKHIgKyAoKDMgKiAocHJlZF9UWzFdICsgcHJlZF9MWzFdKSAtIDIgKiBwcmVkX1RMWzFdKSA+PiAyKSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdFs0ICogeCArIDJdID0gcHJlZF9MWzJdID0gKHIgKyBnICsgKCgzICogKHByZWRfVFsyXSArIHByZWRfTFsyXSkgLSAyICogcHJlZF9UTFsyXSkgPj4gMikpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3RbNCAqIHggKyAzXSA9IHByZWRfTFszXSA9IChyICsgZyArIGIgKyAoKDMgKiAocHJlZF9UWzNdICsgcHJlZF9MWzNdKSAtIDIgKiBwcmVkX1RMWzNdKSA+PiAyKSkgJiAweGZmOworCisgICAgICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfVFswXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzFdID0gcHJlZF9UWzFdOworICAgICAgICAgICAgICAgIHByZWRfVExbMl0gPSBwcmVkX1RbMl07CisgICAgICAgICAgICAgICAgcHJlZF9UTFszXSA9IHByZWRfVFszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWNvZGVfcmdiaShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsIEdldEJpdENvbnRleHQgKmdiKQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IHgsIHk7CisKKyAgICBkc3QgPSBwLT5kYXRhWzBdOworICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgZHN0W3ggKiA0ICsgMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RbeCAqIDQgKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIGRzdFt4ICogNCArIDJdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHByZWRbNF0gPSB7IC0xMjgsIC0xMjgsIC0xMjgsIC0xMjggfTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCByLCBnLCBiOworCisgICAgICAgICAgICByID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgZyA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIGIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisKKyAgICAgICAgICAgIGRzdFs0ICogeCArIDBdID0gcHJlZFswXSA9IChyICsgcHJlZFswXSkgJiAweGZmOworICAgICAgICAgICAgZHN0WzQgKiB4ICsgMV0gPSBwcmVkWzFdID0gKHIgKyBnICsgcHJlZFsxXSkgJiAweGZmOworICAgICAgICAgICAgZHN0WzQgKiB4ICsgMl0gPSBwcmVkWzJdID0gKHIgKyBnICsgYiArIHByZWRbMl0pICYgMHhmZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBkc3RbeCAqIDQgKyAwXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RbeCAqIDQgKyAxXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgICAgICBkc3RbeCAqIDQgKyAyXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBwcmVkX0xbNF07CisgICAgICAgICAgICBpbnQgciwgZywgYjsKKworICAgICAgICAgICAgcHJlZF9MWzBdID0gZHN0Wy1wLT5saW5lc2l6ZVswXSArIDBdOworICAgICAgICAgICAgcHJlZF9MWzFdID0gZHN0Wy1wLT5saW5lc2l6ZVswXSArIDFdOworICAgICAgICAgICAgcHJlZF9MWzJdID0gZHN0Wy1wLT5saW5lc2l6ZVswXSArIDJdOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICByID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDIpOworICAgICAgICAgICAgICAgIGcgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICAgICAgYiA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKworICAgICAgICAgICAgICAgIGRzdFs0ICogeCArIDBdID0gcHJlZF9MWzBdID0gKHIgKyBwcmVkX0xbMF0pICYgMHhmZjsKKyAgICAgICAgICAgICAgICBkc3RbNCAqIHggKyAxXSA9IHByZWRfTFsxXSA9IChyICsgZyArIHByZWRfTFsxXSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdFs0ICogeCArIDJdID0gcHJlZF9MWzJdID0gKHIgKyBnICsgYiArIHByZWRfTFsyXSkgJiAweGZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9yZ2IoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwLCBHZXRCaXRDb250ZXh0ICpnYikKK3sKKyAgICBTaGVlclZpZGVvQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqZHN0OworICAgIGludCB4LCB5OworCisgICAgZHN0ID0gcC0+ZGF0YVswXTsKKyAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGRzdFt4ICogNCArIDBdID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZHN0W3ggKiA0ICsgMV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICBkc3RbeCAqIDQgKyAyXSA9IGdldF9iaXRzKGdiLCA4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwcmVkWzRdID0geyAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4IH07CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgciwgZywgYjsKKworICAgICAgICAgICAgciA9IGdldF92bGMyKGdiLCBzLT52bGNbMF0udGFibGUsIHMtPnZsY1swXS5iaXRzLCAyKTsKKyAgICAgICAgICAgIGcgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMik7CisgICAgICAgICAgICBiID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICBkc3RbNCAqIHggKyAwXSA9IHByZWRbMF0gPSAociArIHByZWRbMF0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdFs0ICogeCArIDFdID0gcHJlZFsxXSA9IChyICsgZyArIHByZWRbMV0pICYgMHhmZjsKKyAgICAgICAgICAgIGRzdFs0ICogeCArIDJdID0gcHJlZFsyXSA9IChyICsgZyArIGIgKyBwcmVkWzJdKSAmIDB4ZmY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisgICAgZm9yICh5ID0gMTsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBpZiAoZ2V0X2JpdHMxKGdiKSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0W3ggKiA0ICsgMF0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0W3ggKiA0ICsgMV0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICAgICAgZHN0W3ggKiA0ICsgMl0gPSBnZXRfYml0cyhnYiwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcHJlZF9UTFs0XSwgcHJlZF9MWzRdLCBwcmVkX1RbNF07CisgICAgICAgICAgICBpbnQgciwgZywgYjsKKworICAgICAgICAgICAgcHJlZF9UTFswXSA9IHByZWRfTFswXSA9IGRzdFstcC0+bGluZXNpemVbMF0gKyAwXTsKKyAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX0xbMV0gPSBkc3RbLXAtPmxpbmVzaXplWzBdICsgMV07CisgICAgICAgICAgICBwcmVkX1RMWzJdID0gcHJlZF9MWzJdID0gZHN0Wy1wLT5saW5lc2l6ZVswXSArIDJdOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMF0gPSBkc3RbLXAtPmxpbmVzaXplWzBdICsgNCAqIHggKyAwXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMV0gPSBkc3RbLXAtPmxpbmVzaXplWzBdICsgNCAqIHggKyAxXTsKKyAgICAgICAgICAgICAgICBwcmVkX1RbMl0gPSBkc3RbLXAtPmxpbmVzaXplWzBdICsgNCAqIHggKyAyXTsKKworICAgICAgICAgICAgICAgIHIgPSBnZXRfdmxjMihnYiwgcy0+dmxjWzBdLnRhYmxlLCBzLT52bGNbMF0uYml0cywgMik7CisgICAgICAgICAgICAgICAgZyA9IGdldF92bGMyKGdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAyKTsKKyAgICAgICAgICAgICAgICBiID0gZ2V0X3ZsYzIoZ2IsIHMtPnZsY1sxXS50YWJsZSwgcy0+dmxjWzFdLmJpdHMsIDIpOworCisgICAgICAgICAgICAgICAgZHN0WzQgKiB4ICsgMF0gPSBwcmVkX0xbMF0gPSAociArICgoMyAqIChwcmVkX1RbMF0gKyBwcmVkX0xbMF0pIC0gMiAqIHByZWRfVExbMF0pID4+IDIpKSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgZHN0WzQgKiB4ICsgMV0gPSBwcmVkX0xbMV0gPSAociArIGcgKyAoKDMgKiAocHJlZF9UWzFdICsgcHJlZF9MWzFdKSAtIDIgKiBwcmVkX1RMWzFdKSA+PiAyKSkgJiAweGZmOworICAgICAgICAgICAgICAgIGRzdFs0ICogeCArIDJdID0gcHJlZF9MWzJdID0gKHIgKyBnICsgYiArICgoMyAqIChwcmVkX1RbMl0gKyBwcmVkX0xbMl0pIC0gMiAqIHByZWRfVExbMl0pID4+IDIpKSAmIDB4ZmY7CisKKyAgICAgICAgICAgICAgICBwcmVkX1RMWzBdID0gcHJlZF9UWzBdOworICAgICAgICAgICAgICAgIHByZWRfVExbMV0gPSBwcmVkX1RbMV07CisgICAgICAgICAgICAgICAgcHJlZF9UTFsyXSA9IHByZWRfVFsyXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorfQorCitzdGF0aWMgaW50IGJ1aWxkX3ZsYyhWTEMgKnZsYywgY29uc3QgdWludDhfdCAqbGVuLCBpbnQgY291bnQpCit7CisgICAgdWludDMyX3QgY29kZXNbMTAyNF07CisgICAgdWludDhfdCBiaXRzWzEwMjRdOworICAgIHVpbnQxNl90IHN5bXNbMTAyNF07CisgICAgdWludDY0X3QgaW5kZXg7CisgICAgaW50IGk7CisKKyAgICBpbmRleCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgY29kZXNbaV0gID0gaW5kZXggPj4gKDMyIC0gbGVuW2ldKTsKKyAgICAgICAgYml0c1tpXSA9IGxlbltpXTsKKyAgICAgICAgc3ltc1tpXSAgPSBpOworICAgICAgICBpbmRleCArPSAxVUxMIDw8ICgzMiAtIGxlbltpXSk7CisgICAgfQorCisgICAgZmZfZnJlZV92bGModmxjKTsKKyAgICByZXR1cm4gZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgMTYsIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cywgIHNpemVvZigqYml0cyksICBzaXplb2YoKmJpdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXMsIHNpemVvZigqY29kZXMpLCBzaXplb2YoKmNvZGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMsICBzaXplb2YoKnN5bXMpLCAgc2l6ZW9mKCpzeW1zKSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFNoZWVyVmlkZW9Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBUaHJlYWRGcmFtZSBmcmFtZSA9IHsgLmYgPSBkYXRhIH07CisgICAgQVZGcmFtZSAqcCA9IGRhdGE7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICB1bnNpZ25lZCBmb3JtYXQ7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdnBrdC0+c2l6ZSA8PSAyMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoQVZfUkwzMihhdnBrdC0+ZGF0YSkgIT0gTUtUQUcoJ1MnLCdoJywnaScsJ3InKSAmJgorICAgICAgICBBVl9STDMyKGF2cGt0LT5kYXRhKSAhPSBNS1RBRygnWicsJ3cnLCdhJywnaycpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHMtPmFsdCA9IDA7CisgICAgZm9ybWF0ID0gQVZfUkwzMihhdnBrdC0+ZGF0YSArIDE2KTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImZvcm1hdDogJXNcbiIsIGF2X2ZvdXJjYzJzdHIoZm9ybWF0KSk7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIE1LVEFHKCcgJywgJ1InLCAnRycsICdCJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IwOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfcmdiOworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3JfcmdiLCAyNTYpOworICAgICAgICAgICAgcmV0IHw9IGJ1aWxkX3ZsYygmcy0+dmxjWzFdLCBsX2dfcmdiLCAyNTYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJyAnLCAncicsICdHJywgJ0InKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQjA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV9yZ2JpOworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3JfcmdiaSwgMjU2KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF9nX3JnYmksIDI1Nik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnQScsICdSJywgJ0cnLCAnWCcpOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSQVAxMDsKKyAgICAgICAgcy0+ZGVjb2RlX2ZyYW1lID0gZGVjb2RlX2FyZ3g7CisgICAgICAgIGlmIChzLT5mb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXQgID0gYnVpbGRfdmxjKCZzLT52bGNbMF0sIGxfcl9yZ2J4LCAxMDI0KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF9nX3JnYngsIDEwMjQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ0EnLCAncicsICdHJywgJ1gnKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dCUkFQMTA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV9hcmd4aTsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF9yX3JnYnhpLCAxMDI0KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF9nX3JnYnhpLCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdSJywgJ0cnLCAnQicsICdYJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV9yZ2J4OworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3JfcmdieCwgMTAyNCk7CisgICAgICAgICAgICByZXQgfD0gYnVpbGRfdmxjKCZzLT52bGNbMV0sIGxfZ19yZ2J4LCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdyJywgJ0cnLCAnQicsICdYJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV9yZ2J4aTsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF9yX3JnYnhpLCAxMDI0KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF9nX3JnYnhpLCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdBJywgJ1InLCAnRycsICdCJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9BUkdCOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfYXJnYjsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF9yX3JnYiwgMjU2KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF9nX3JnYiwgMjU2KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdBJywgJ3InLCAnRycsICdCJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9BUkdCOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfYXJnYmk7CisgICAgICAgIGlmIChzLT5mb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXQgID0gYnVpbGRfdmxjKCZzLT52bGNbMF0sIGxfcl9yZ2JpLCAyNTYpOworICAgICAgICAgICAgcmV0IHw9IGJ1aWxkX3ZsYygmcy0+dmxjWzFdLCBsX2dfcmdiaSwgMjU2KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdBJywgJ1knLCAnQicsICdSJyk6CisgICAgICAgIHMtPmFsdCA9IDE7CisgICAgY2FzZSBNS1RBRygnQScsICdZJywgJ2InLCAnUicpOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV9heWJyOworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3lfeWJyLCAyNTYpOworICAgICAgICAgICAgcmV0IHw9IGJ1aWxkX3ZsYygmcy0+dmxjWzFdLCBsX3VfeWJyLCAyNTYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ0EnLCAneScsICdCJywgJ1InKToKKyAgICAgICAgcy0+YWx0ID0gMTsKKyAgICBjYXNlIE1LVEFHKCdBJywgJ3knLCAnYicsICdSJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDQ0UDsKKyAgICAgICAgcy0+ZGVjb2RlX2ZyYW1lID0gZGVjb2RlX2F5YnJpOworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3lfeWJyaSwgMjU2KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF91X3licmksIDI1Nik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnICcsICdZJywgJ0InLCAnUicpOgorICAgICAgICBzLT5hbHQgPSAxOworICAgIGNhc2UgTUtUQUcoJyAnLCAnWScsICdiJywgJ1InKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV95YnI7CisgICAgICAgIGlmIChzLT5mb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXQgID0gYnVpbGRfdmxjKCZzLT52bGNbMF0sIGxfeV95YnIsIDI1Nik7CisgICAgICAgICAgICByZXQgfD0gYnVpbGRfdmxjKCZzLT52bGNbMV0sIGxfdV95YnIsIDI1Nik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnICcsICd5JywgJ0InLCAnUicpOgorICAgICAgICBzLT5hbHQgPSAxOworICAgIGNhc2UgTUtUQUcoJyAnLCAneScsICdiJywgJ1InKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV95YnJpOworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3lfeWJyaSwgMjU2KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF91X3licmksIDI1Nik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnWScsICdCJywgJ1InLCAweDBhKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDsKKyAgICAgICAgcy0+ZGVjb2RlX2ZyYW1lID0gZGVjb2RlX3licjEwOworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3lfeWJyMTAsIDEwMjQpOworICAgICAgICAgICAgcmV0IHw9IGJ1aWxkX3ZsYygmcy0+dmxjWzFdLCBsX3VfeWJyMTAsIDEwMjQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ3knLCAnQicsICdSJywgMHgwYSk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQMTA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV95YnIxMGk7CisgICAgICAgIGlmIChzLT5mb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXQgID0gYnVpbGRfdmxjKCZzLT52bGNbMF0sIGxfeV95YnIxMGksIDEwMjQpOworICAgICAgICAgICAgcmV0IHw9IGJ1aWxkX3ZsYygmcy0+dmxjWzFdLCBsX3VfeWJyMTBpLCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdDJywgJ0EnLCAnNCcsICdwJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfY2E0cDsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF95X3licjEwLCAxMDI0KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF91X3licjEwLCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdDJywgJ0EnLCAnNCcsICdpJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfY2E0aTsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF95X3licjEwaSwgMTAyNCk7CisgICAgICAgICAgICByZXQgfD0gYnVpbGRfdmxjKCZzLT52bGNbMV0sIGxfdV95YnIxMGksIDEwMjQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ0InLCAnWScsICdSJywgJ1knKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV9ieXJ5OworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3lfYnlyeSwgMjU2KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF91X2J5cnksIDI1Nik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnQicsICdZJywgJ1InLCAneScpOgorICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgcy0+ZGVjb2RlX2ZyYW1lID0gZGVjb2RlX2J5cnlpOworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3lfYnlyeWksIDI1Nik7CisgICAgICAgICAgICByZXQgfD0gYnVpbGRfdmxjKCZzLT52bGNbMV0sIGxfdV9ieXJ5aSwgMjU2KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdZJywgJ2InLCAnWScsICdyJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfeWJ5cjsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF95X3lieXIsIDI1Nik7CisgICAgICAgICAgICByZXQgfD0gYnVpbGRfdmxjKCZzLT52bGNbMV0sIGxfdV95YnlyLCAyNTYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ0MnLCAnOCcsICcyJywgJ3AnKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfYzgycDsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF95X2J5cnksIDI1Nik7CisgICAgICAgICAgICByZXQgfD0gYnVpbGRfdmxjKCZzLT52bGNbMV0sIGxfdV9ieXJ5LCAyNTYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ0MnLCAnOCcsICcyJywgJ2knKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfYzgyaTsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF95X2J5cnlpLCAyNTYpOworICAgICAgICAgICAgcmV0IHw9IGJ1aWxkX3ZsYygmcy0+dmxjWzFdLCBsX3VfYnlyeWksIDI1Nik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygweGEyLCAnWScsICdSJywgJ1knKToKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICAgICAgcy0+ZGVjb2RlX2ZyYW1lID0gZGVjb2RlX3lyeTEwOworICAgICAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0ICA9IGJ1aWxkX3ZsYygmcy0+dmxjWzBdLCBsX3lfeXJ5MTAsIDEwMjQpOworICAgICAgICAgICAgcmV0IHw9IGJ1aWxkX3ZsYygmcy0+dmxjWzFdLCBsX3VfeXJ5MTAsIDEwMjQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoMHhhMiwgJ1knLCAnUicsICd5Jyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CisgICAgICAgIHMtPmRlY29kZV9mcmFtZSA9IGRlY29kZV95cnkxMGk7CisgICAgICAgIGlmIChzLT5mb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXQgID0gYnVpbGRfdmxjKCZzLT52bGNbMF0sIGxfeV95cnkxMGksIDEwMjQpOworICAgICAgICAgICAgcmV0IHw9IGJ1aWxkX3ZsYygmcy0+dmxjWzFdLCBsX3VfeXJ5MTBpLCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdDJywgJ0EnLCAnMicsICdwJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIyUDEwOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfY2EycDsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF95X3lyeTEwLCAxMDI0KTsKKyAgICAgICAgICAgIHJldCB8PSBidWlsZF92bGMoJnMtPnZsY1sxXSwgbF91X3lyeTEwLCAxMDI0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdDJywgJ0EnLCAnMicsICdpJyk6CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIyUDEwOworICAgICAgICBzLT5kZWNvZGVfZnJhbWUgPSBkZWNvZGVfY2EyaTsKKyAgICAgICAgaWYgKHMtPmZvcm1hdCAhPSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCAgPSBidWlsZF92bGMoJnMtPnZsY1swXSwgbF95X3lyeTEwaSwgMTAyNCk7CisgICAgICAgICAgICByZXQgfD0gYnVpbGRfdmxjKCZzLT52bGNbMV0sIGxfdV95cnkxMGksIDEwMjQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInVuc3VwcG9ydGVkIGZvcm1hdDogMHglWCIsIGZvcm1hdCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoYXZwa3QtPnNpemUgPCAyMCArIGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgLyAxNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIklucHV0IHBhY2tldCB0b28gc21hbGxcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAocy0+Zm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHMtPmZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwLT5rZXlfZnJhbWUgPSAxOworCisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGF2cGt0LT5kYXRhICsgMjAsIGF2cGt0LT5zaXplIC0gMjApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5kZWNvZGVfZnJhbWUoYXZjdHgsIHAsICZnYik7CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKK30KKworI2lmIEhBVkVfVEhSRUFEUworc3RhdGljIGludCBkZWNvZGVfaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+Zm9ybWF0ID0gMDsKKyAgICBtZW1zZXQoJnMtPnZsY1swXSwgMCwgc2l6ZW9mKHMtPnZsY1swXSkpOworICAgIG1lbXNldCgmcy0+dmxjWzFdLCAwLCBzaXplb2Yocy0+dmxjWzFdKSk7CisKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgU2hlZXJWaWRlb0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfZnJlZV92bGMoJnMtPnZsY1swXSk7CisgICAgZmZfZnJlZV92bGMoJnMtPnZsY1sxXSk7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZDb2RlYyBmZl9zaGVlcnZpZGVvX2RlY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAic2hlZXJ2aWRlbyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQml0SmF6eiBTaGVlclZpZGVvIiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKFNoZWVyVmlkZW9Db250ZXh0KSwKKyAgICAuaW5pdF90aHJlYWRfY29weSA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKGRlY29kZV9pbml0X3RocmVhZF9jb3B5KSwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGRlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgICAgPSBkZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zaGVlcnZpZGVvZGF0YS5oIGIvbGliYXZjb2RlYy9zaGVlcnZpZGVvZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNmUyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3NoZWVydmlkZW9kYXRhLmgKQEAgLTAsMCArMSwxMDk3IEBACisvKgorICogQml0SmF6eiBTaGVlclZpZGVvIGRlY29kZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1NIRUVSVklERU9EQVRBX0gKKyNkZWZpbmUgQVZDT0RFQ19TSEVFUlZJREVPREFUQV9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxfcl9yZ2JbMjU2XSA9IHsKKyAgICAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxfcl9yZ2JpWzI1Nl0gPSB7CisgICAgIDMsICA0LCAgNCwgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDcsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA0LCAgNCwgIDQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsX2dfcmdiaVsyNTZdID0geworICAgICAxLCAgMywgIDQsICA1LCAgNiwgIDcsICA3LCAgOCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLAorICAgIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA4LCAgOCwgIDcsICA2LCAgNSwgIDUsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF9nX3JnYlsyNTZdID0geworICAgICAyLCAgMiwgIDQsICA0LCAgNiwgIDcsICA5LCAgOSwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLAorICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTAsICA5LCAgOSwgIDgsICA2LCAgNCwgIDMsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF95X3liclsyNTZdID0geworICAgICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA1LCAgNCwgIDQsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF91X3liclsyNTZdID0geworICAgICAxLCAgMiwgIDQsICA2LCAgOSwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTIsIDEyLCAxMSwgMTEsIDEwLCAgOCwgIDUsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF95X3lieXJbMjU2XSA9IHsKKyAgICAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsICA3LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA1LCAgNSwgIDQsICA0LCAgNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxfdV95YnlyWzI1Nl0gPSB7CisgICAgIDEsICAyLCAgNCwgIDYsICA4LCAgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxMywgMTMsIDEzLCAxMiwgMTIsIDExLCAxMSwgMTAsIDEwLCAgOSwgIDgsICA3LCAgNiwgIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsX3lfYnlyeVsyNTZdID0geworICAgICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA1LCAgNCwgIDQsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF91X2J5cnlbMjU2XSA9IHsKKyAgICAgMSwgIDIsICA0LCAgNiwgIDgsICA5LCAgOSwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMywgMTMsIDEzLCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxMywgMTMsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTAsICA5LCAgOCwgIDcsICA2LCAgMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxfeV95YnIxMGlbMTAyNF0gPSB7CisgICAgIDMsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsX3lfeWJyMTBbMTAyNF0gPSB7CisgICAgIDQsICA1LCAgNSwgIDUsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsX3VfeWJyMTBpWzEwMjRdID0geworICAgICAyLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNywgIDcsICA4LCAgOCwgIDksICA5LCAgOSwgIDksIDEwLAorICAgIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA4LCAgOCwgIDgsICA3LCAgNiwgIDUsICA1LCAgNCwgIDQsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF91X3licjEwWzEwMjRdID0geworICAgICAyLCAgMywgIDMsICA0LCAgNSwgIDUsICA2LCAgNywgIDgsICA5LCAgOSwgMTAsIDEwLCAxMCwgMTEsIDExLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMSwgMTEsIDExLCAxMCwgMTAsICA5LCAgOSwgIDgsICA4LCAgNywgIDYsICA1LCAgNCwgIDQsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF9yX3JnYnhbMTAyNF0gPSB7CisgICAgIDQsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwgIDgsCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA3LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDUsICA1LCAgNSwgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsX2dfcmdieFsxMDI0XSA9IHsKKyAgICAgMywgIDQsICA0LCAgNSwgIDUsICA1LCAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKKyAgICAgOCwgIDgsICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LCAgOSwKKyAgICAgOCwgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNSwgIDUsICA1LCAgNSwgIDQsICA0LCAgNCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxfeV95cnkxMFsxMDI0XSA9IHsKKyAgICAgNCwgIDUsICA1LCAgNSwgIDUsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwKKyAgICAgOCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKKyAgICAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwKKyAgICAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwKKyAgICAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywKKyAgICAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA1LCAgNSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxfeV95cnkxMGlbMTAyNF0gPSB7CisgICAgIDMsICA1LCAgNSwgIDUsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsCisgICAgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsCisgICAgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsCisgICAgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsCisgICAgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksCisgICAgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksCisgICAgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDcsCisgICAgIDcsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsX3VfeXJ5MTBbMTAyNF0gPSB7CisgICAgIDIsICAzLCAgMywgIDQsICA1LCAgNiwgIDcsICA3LCAgOCwgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTAsCisgICAgMTAsIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsCisgICAgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsCisgICAgMTMsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLCAxMSwgMTEsCisgICAgMTAsIDEwLCAxMCwgMTAsICA5LCAgOSwgIDksICA4LCAgOCwgIDcsICA3LCAgNiwgIDUsICA0LCAgNCwgIDMsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsX3VfeXJ5MTBpWzEwMjRdID0geworICAgICAyLCAgNCwgIDQsICA0LCAgNSwgIDYsICA2LCAgNiwgIDcsICA3LCAgNywgIDgsICA4LCAgOCwgIDksICA5LAorICAgICA5LCAgOSwgIDksICA5LCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA3LCAgNywgIDcsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF95X3licmlbMjU2XSA9IHsKKyAgICAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA1LCAgNSwgIDUsICA0LCAgMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxfdV95YnJpWzI1Nl0gPSB7CisgICAgIDEsICAzLCAgNSwgIDYsICA4LCAgOCwgIDksIDEwLCAxMCwgMTEsIDExLCAxMiwgMTIsIDEzLCAxMywgMTMsCisgICAgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCisgICAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsCisgICAgMTQsIDEzLCAxMywgMTMsIDEyLCAxMiwgMTEsIDExLCAxMCwgMTAsICA5LCAgOCwgIDgsICA2LCAgNSwgIDIsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBsX3lfYnlyeWlbMjU2XSA9IHsKKyAgICAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwKKyAgICAxNiwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKKyAgICAxNSwgMTUsIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKKyAgICAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKKyAgICAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKKyAgICAxMiwgMTIsIDEyLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwKKyAgICAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA4LCAgOCwKKyAgICAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDcsICA3LCAgNiwgIDYsICA2LCAgNSwgIDQsICA0LCAgMywKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGxfdV9ieXJ5aVsyNTZdID0geworICAgICAxLCAgMywgIDQsICA2LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDEzLCAxMywgMTMsIDEzLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAgOSwgIDksICA4LCAgOCwgIDcsICA3LCAgNSwgIDQsICAzLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF9yX3JnYnhpWzEwMjRdID0geworICAgICAzLCAgNCwgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LAorICAgICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLAorICAgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLAorICAgIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgIDksICA5LAorICAgICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOCwgIDgsICA4LAorICAgICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNiwgIDUsICA1LCAgNCwgIDQsICA0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbF9nX3JnYnhpWzEwMjRdID0geworICAgICAyLCAgMywgIDQsICA0LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgNywgIDcsICA4LCAgOCwgIDgsICA4LAorICAgICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEzLAorICAgIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LAorICAgIDE2LCAxNiwgMTYsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LAorICAgIDE1LCAxNSwgMTUsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LAorICAgIDE0LCAxNCwgMTQsIDE0LCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLAorICAgIDEzLCAxMywgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTEsIDExLAorICAgIDExLCAxMSwgMTEsIDExLCAxMSwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAgOSwgIDksICA5LAorICAgICA5LCAgOCwgIDgsICA4LCAgOCwgIDcsICA3LCAgNywgIDcsICA3LCAgNywgIDYsICA2LCAgNCwgIDQsICAzLAorfTsKKworI2VuZGlmIC8qIEFWQ09ERUNfU0hFRVJWSURFT0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zaG9ydGVuLmMgYi9saWJhdmNvZGVjL3Nob3J0ZW4uYwppbmRleCAwZjViZTk2Li40MTM0YWY3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Nob3J0ZW4uYworKysgYi9saWJhdmNvZGVjL3Nob3J0ZW4uYwpAQCAtMjMsMTEgKzIzLDExIEBACiAgKiBAZmlsZQogICogU2hvcnRlbiBkZWNvZGVyCiAgKiBAYXV0aG9yIEplZmYgTXVpemVsYWFyCi0gKgogICovCiAKICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJnb2xvbWIuaCIKQEAgLTExMCw2ICsxMTAsOCBAQAogICAgIGludDMyX3QgbHBjcW9mZnNldDsKICAgICBpbnQgZ290X2hlYWRlcjsKICAgICBpbnQgZ290X3F1aXRfY29tbWFuZDsKKyAgICBpbnQgc3dhcDsKKyAgICBCc3dhcERTUENvbnRleHQgYmRzcDsKIH0gU2hvcnRlbkNvbnRleHQ7CiAKIHN0YXRpYyBhdl9jb2xkIGludCBzaG9ydGVuX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKQEAgLTExNyw2ICsxMTksOCBAQAogICAgIFNob3J0ZW5Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBzLT5hdmN0eCAgICAgICAgICA9IGF2Y3R4OwogCisgICAgZmZfYnN3YXBkc3BfaW5pdCgmcy0+YmRzcCk7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTU2LDggKzE2MCwxMSBAQAogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfdWludChTaG9ydGVuQ29udGV4dCAqcywgaW50IGspCiB7Ci0gICAgaWYgKHMtPnZlcnNpb24gIT0gMCkKKyAgICBpZiAocy0+dmVyc2lvbiAhPSAwKSB7CiAgICAgICAgIGsgPSBnZXRfdXJfZ29sb21iX3Nob3J0ZW4oJnMtPmdiLCBVTE9OR1NJWkUpOworICAgICAgICBpZiAoayA+IDMxVSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KICAgICByZXR1cm4gZ2V0X3VyX2dvbG9tYl9zaG9ydGVuKCZzLT5nYiwgayk7CiB9CiAKQEAgLTE2NSw5ICsxNzIsMTMgQEAKIHsKICAgICBpbnQgaTsKIAotICAgIGlmIChzLT5iaXRzaGlmdCAhPSAwKQorICAgIGlmIChzLT5iaXRzaGlmdCA9PSAzMikgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YmxvY2tzaXplOyBpKyspCi0gICAgICAgICAgICBidWZmZXJbaV0gPDw9IHMtPmJpdHNoaWZ0OworICAgICAgICAgICAgYnVmZmVyW2ldID0gMDsKKyAgICB9IGVsc2UgaWYgKHMtPmJpdHNoaWZ0ICE9IDApIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmJsb2Nrc2l6ZTsgaSsrKQorICAgICAgICAgICAgYnVmZmVyW2ldICo9IDFVIDw8IHMtPmJpdHNoaWZ0OworICAgIH0KIH0KIAogc3RhdGljIGludCBpbml0X29mZnNldChTaG9ydGVuQ29udGV4dCAqcykKQEAgLTE5Niw2ICsyMDcsNzQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkZWNvZGVfYWlmZl9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCB1aW50OF90ICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyX3NpemUpCit7CisgICAgU2hvcnRlbkNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBsZW4sIGJwcywgZXhwOworICAgIEdldEJ5dGVDb250ZXh0IGdiOworICAgIHVpbnQ2NF90IHZhbDsKKyAgICB1aW50MzJfdCB0YWc7CisKKyAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgaGVhZGVyLCBoZWFkZXJfc2l6ZSk7CisKKyAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKSAhPSBNS1RBRygnRicsICdPJywgJ1InLCAnTScpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibWlzc2luZyBGT1JNIHRhZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA0KTsgLyogY2h1bmsgc2l6ZSAqLworCisgICAgdGFnID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKyAgICBpZiAodGFnICE9IE1LVEFHKCdBJywgJ0knLCAnRicsICdGJykgJiYKKyAgICAgICAgdGFnICE9IE1LVEFHKCdBJywgJ0knLCAnRicsICdDJykpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIEFJRkYgdGFnXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgd2hpbGUgKGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZnYikgIT0gTUtUQUcoJ0MnLCAnTycsICdNJywgJ00nKSkgeworICAgICAgICBsZW4gPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICBpZiAobGVuIDwgMCB8fCBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgMThMTCArIGxlbiArIChsZW4mMSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibm8gQ09NTSBjaHVuayBmb3VuZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgbGVuICsgKGxlbiAmIDEpKTsKKyAgICB9CisgICAgbGVuID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKworICAgIGlmIChsZW4gPCAxOCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNPTU0gY2h1bmsgd2FzIHRvbyBzaG9ydFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA2KTsKKyAgICBicHMgPSBieXRlc3RyZWFtMl9nZXRfYmUxNigmZ2IpOworICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHM7CisKKyAgICBzLT5zd2FwID0gdGFnID09IE1LVEFHKCdBJywgJ0knLCAnRicsICdDJyk7CisKKyAgICBpZiAoYnBzICE9IDE2ICYmIGJwcyAhPSA4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGJpdHMgcGVyIHNhbXBsZTogJWRcbiIsIGJwcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgZXhwID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoJmdiKSAtIDE2MzgzIC0gNjM7CisgICAgdmFsID0gYnl0ZXN0cmVhbTJfZ2V0X2JlNjQoJmdiKTsKKyAgICBpZiAoZXhwIDwgLTYzIHx8IGV4cCA+IDYzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXhwICVkIGlzIG91dCBvZiByYW5nZVxuIiwgZXhwKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmIChleHAgPj0gMCkKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gdmFsIDw8IGV4cDsKKyAgICBlbHNlCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfcmF0ZSA9ICh2YWwgKyAoMVVMTDw8KC1leHAtMSkpKSA+PiAtZXhwOworICAgIGxlbiAtPSAxODsKKyAgICBpZiAobGVuID4gMCkKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIiVkIGhlYWRlciBieXRlcyB1bnBhcnNlZFxuIiwgbGVuKTsKKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRlY29kZV93YXZlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IHVpbnQ4X3QgKmhlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXJfc2l6ZSkKIHsKQEAgLTMwMywyMiArMzgyLDIyIEBACiAgICAgLyogc3VidHJhY3Qgb2Zmc2V0IGZyb20gcHJldmlvdXMgc2FtcGxlcyB0byB1c2UgaW4gcHJlZGljdGlvbiAqLwogICAgIGlmIChjb21tYW5kID09IEZOX1FMUEMgJiYgY29mZnNldCkKICAgICAgICAgZm9yIChpID0gLXByZWRfb3JkZXI7IGkgPCAwOyBpKyspCi0gICAgICAgICAgICBzLT5kZWNvZGVkW2NoYW5uZWxdW2ldIC09IGNvZmZzZXQ7CisgICAgICAgICAgICBzLT5kZWNvZGVkW2NoYW5uZWxdW2ldIC09ICh1bnNpZ25lZCljb2Zmc2V0OwogCiAgICAgLyogZGVjb2RlIHJlc2lkdWFsIGFuZCBkbyBMUEMgcHJlZGljdGlvbiAqLwogICAgIGluaXRfc3VtID0gcHJlZF9vcmRlciA/IChjb21tYW5kID09IEZOX1FMUEMgPyBzLT5scGNxb2Zmc2V0IDogMCkgOiBjb2Zmc2V0OwogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ibG9ja3NpemU7IGkrKykgewogICAgICAgICBzdW0gPSBpbml0X3N1bTsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IHByZWRfb3JkZXI7IGorKykKLSAgICAgICAgICAgIHN1bSArPSBjb2VmZnNbal0gKiBzLT5kZWNvZGVkW2NoYW5uZWxdW2kgLSBqIC0gMV07CisgICAgICAgICAgICBzdW0gKz0gY29lZmZzW2pdICogKHVuc2lnbmVkKXMtPmRlY29kZWRbY2hhbm5lbF1baSAtIGogLSAxXTsKICAgICAgICAgcy0+ZGVjb2RlZFtjaGFubmVsXVtpXSA9IGdldF9zcl9nb2xvbWJfc2hvcnRlbigmcy0+Z2IsIHJlc2lkdWFsX3NpemUpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdW0gPj4gcXNoaWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoc3VtID4+IHFzaGlmdCk7CiAgICAgfQogCiAgICAgLyogYWRkIG9mZnNldCB0byBjdXJyZW50IHNhbXBsZXMgKi8KICAgICBpZiAoY29tbWFuZCA9PSBGTl9RTFBDICYmIGNvZmZzZXQpCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ibG9ja3NpemU7IGkrKykKLSAgICAgICAgICAgIHMtPmRlY29kZWRbY2hhbm5lbF1baV0gKz0gY29mZnNldDsKKyAgICAgICAgICAgIHMtPmRlY29kZWRbY2hhbm5lbF1baV0gKz0gKHVuc2lnbmVkKWNvZmZzZXQ7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTM2NiwxMCArNDQ1LDE4IEBACiAgICAgICAgIHMtPmJsb2Nrc2l6ZSA9IGJsb2Nrc2l6ZTsKIAogICAgICAgICBtYXhubHBjICA9IGdldF91aW50KHMsIExQQ1FTSVpFKTsKKyAgICAgICAgaWYgKG1heG5scGMgPiAxMDI0VSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJtYXhubHBjIGlzOiAlZFxuIiwgbWF4bmxwYyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogICAgICAgICBzLT5ubWVhbiA9IGdldF91aW50KHMsIDApOworICAgICAgICBpZiAocy0+bm1lYW4gPiAzMjc2OFUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAibm1lYW4gaXM6ICVkXG4iLCBzLT5ubWVhbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogCiAgICAgICAgIHNraXBfYnl0ZXMgPSBnZXRfdWludChzLCBOU0tJUFNJWkUpOwotICAgICAgICBpZiAoKHVuc2lnbmVkKXNraXBfYnl0ZXMgPiBnZXRfYml0c19sZWZ0KCZzLT5nYikvOCkgeworICAgICAgICBpZiAoKHVuc2lnbmVkKXNraXBfYnl0ZXMgPiBGRk1BWChnZXRfYml0c19sZWZ0KCZzLT5nYiksIDApLzgpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBza2lwX2J5dGVzOiAlZFxuIiwgc2tpcF9ieXRlcyk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQpAQCAtMzc5LDE1ICs0NjYsMTIgQEAKICAgICB9CiAgICAgcy0+bndyYXAgPSBGRk1BWChOV1JBUCwgbWF4bmxwYyk7CiAKLSAgICBpZiAoKHJldCA9IGFsbG9jYXRlX2J1ZmZlcnMocykpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGlmICgocmV0ID0gaW5pdF9vZmZzZXQocykpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQogICAgIGlmIChzLT52ZXJzaW9uID4gMSkKICAgICAgICAgcy0+bHBjcW9mZnNldCA9IFYyTFBDUU9GRlNFVDsKIAorICAgIGlmIChzLT5hdmN0eC0+ZXh0cmFkYXRhX3NpemUgPiAwKQorICAgICAgICBnb3RvIGVuZDsKKwogICAgIGlmIChnZXRfdXJfZ29sb21iX3Nob3J0ZW4oJnMtPmdiLCBGTlNJWkUpICE9IEZOX1ZFUkJBVElNKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIm1pc3NpbmcgdmVyYmF0aW0gc2VjdGlvbiBhdCBiZWdpbm5pbmcgb2Ygc3RyZWFtXG4iKTsKQEAgLTQwNSw3ICs0ODksMjQgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+aGVhZGVyX3NpemU7IGkrKykKICAgICAgICAgcy0+aGVhZGVyW2ldID0gKGNoYXIpZ2V0X3VyX2dvbG9tYl9zaG9ydGVuKCZzLT5nYiwgVkVSQkFUSU1fQllURV9TSVpFKTsKIAotICAgIGlmICgocmV0ID0gZGVjb2RlX3dhdmVfaGVhZGVyKHMtPmF2Y3R4LCBzLT5oZWFkZXIsIHMtPmhlYWRlcl9zaXplKSkgPCAwKQorICAgIGlmIChBVl9STDMyKHMtPmhlYWRlcikgPT0gTUtUQUcoJ1InLCdJJywnRicsJ0YnKSkgeworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV93YXZlX2hlYWRlcihzLT5hdmN0eCwgcy0+aGVhZGVyLCBzLT5oZWFkZXJfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIGlmIChBVl9STDMyKHMtPmhlYWRlcikgPT0gTUtUQUcoJ0YnLCdPJywnUicsJ00nKSkgeworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9haWZmX2hlYWRlcihzLT5hdmN0eCwgcy0+aGVhZGVyLCBzLT5oZWFkZXJfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocy0+YXZjdHgsICJ1bnN1cHBvcnRlZCBiaXQgcGFja2luZyAlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklYMzIsIEFWX1JMMzIocy0+aGVhZGVyKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKK2VuZDoKKworICAgIGlmICgocmV0ID0gYWxsb2NhdGVfYnVmZmVycyhzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBpbml0X29mZnNldChzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgcy0+Y3VyX2NoYW4gPSAwOwpAQCAtNDMzLDYgKzUzNCw3IEBACiAgICAgICAgIHRtcF9wdHIgPSBhdl9mYXN0X3JlYWxsb2Mocy0+Yml0c3RyZWFtLCAmcy0+YWxsb2NhdGVkX2JpdHN0cmVhbV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1heF9mcmFtZXNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKICAgICAgICAgaWYgKCF0bXBfcHRyKSB7CisgICAgICAgICAgICBzLT5tYXhfZnJhbWVzaXplID0gMDsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgYWxsb2NhdGluZyBiaXRzdHJlYW0gYnVmZmVyXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0KQEAgLTQ0MSwyOSArNTQzLDI3IEBACiAgICAgfQogCiAgICAgLyogYXBwZW5kIGN1cnJlbnQgcGFja2V0IGRhdGEgdG8gYml0c3RyZWFtIGJ1ZmZlciAqLwotICAgIGlmICgxICYmIHMtPm1heF9mcmFtZXNpemUpIHsgLy9GSVhNRSB0cnVuY2F0ZWQKLSAgICAgICAgYnVmX3NpemUgICAgICAgPSBGRk1JTihidWZfc2l6ZSwgcy0+bWF4X2ZyYW1lc2l6ZSAtIHMtPmJpdHN0cmVhbV9zaXplKTsKLSAgICAgICAgaW5wdXRfYnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICBidWZfc2l6ZSAgICAgICA9IEZGTUlOKGJ1Zl9zaXplLCBzLT5tYXhfZnJhbWVzaXplIC0gcy0+Yml0c3RyZWFtX3NpemUpOworICAgIGlucHV0X2J1Zl9zaXplID0gYnVmX3NpemU7CiAKLSAgICAgICAgaWYgKHMtPmJpdHN0cmVhbV9pbmRleCArIHMtPmJpdHN0cmVhbV9zaXplICsgYnVmX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFID4KLSAgICAgICAgICAgIHMtPmFsbG9jYXRlZF9iaXRzdHJlYW1fc2l6ZSkgewotICAgICAgICAgICAgbWVtbW92ZShzLT5iaXRzdHJlYW0sICZzLT5iaXRzdHJlYW1bcy0+Yml0c3RyZWFtX2luZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgcy0+Yml0c3RyZWFtX3NpemUpOwotICAgICAgICAgICAgcy0+Yml0c3RyZWFtX2luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmKQotICAgICAgICAgICAgbWVtY3B5KCZzLT5iaXRzdHJlYW1bcy0+Yml0c3RyZWFtX2luZGV4ICsgcy0+Yml0c3RyZWFtX3NpemVdLCBidWYsCi0gICAgICAgICAgICAgICAgICAgYnVmX3NpemUpOwotICAgICAgICBidWYgICAgICAgICAgICAgICA9ICZzLT5iaXRzdHJlYW1bcy0+Yml0c3RyZWFtX2luZGV4XTsKLSAgICAgICAgYnVmX3NpemUgICAgICAgICArPSBzLT5iaXRzdHJlYW1fc2l6ZTsKLSAgICAgICAgcy0+Yml0c3RyZWFtX3NpemUgPSBidWZfc2l6ZTsKKyAgICBpZiAocy0+Yml0c3RyZWFtX2luZGV4ICsgcy0+Yml0c3RyZWFtX3NpemUgKyBidWZfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgPgorICAgICAgICBzLT5hbGxvY2F0ZWRfYml0c3RyZWFtX3NpemUpIHsKKyAgICAgICAgbWVtbW92ZShzLT5iaXRzdHJlYW0sICZzLT5iaXRzdHJlYW1bcy0+Yml0c3RyZWFtX2luZGV4XSwKKyAgICAgICAgICAgICAgICBzLT5iaXRzdHJlYW1fc2l6ZSk7CisgICAgICAgIHMtPmJpdHN0cmVhbV9pbmRleCA9IDA7CisgICAgfQorICAgIGlmIChidWYpCisgICAgICAgIG1lbWNweSgmcy0+Yml0c3RyZWFtW3MtPmJpdHN0cmVhbV9pbmRleCArIHMtPmJpdHN0cmVhbV9zaXplXSwgYnVmLAorICAgICAgICAgICAgICAgYnVmX3NpemUpOworICAgIGJ1ZiAgICAgICAgICAgICAgID0gJnMtPmJpdHN0cmVhbVtzLT5iaXRzdHJlYW1faW5kZXhdOworICAgIGJ1Zl9zaXplICAgICAgICAgKz0gcy0+Yml0c3RyZWFtX3NpemU7CisgICAgcy0+Yml0c3RyZWFtX3NpemUgPSBidWZfc2l6ZTsKIAotICAgICAgICAvKiBkbyBub3QgZGVjb2RlIHVudGlsIGJ1ZmZlciBoYXMgYXQgbGVhc3QgbWF4X2ZyYW1lc2l6ZSBieXRlcyBvcgotICAgICAgICAgKiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgKi8KLSAgICAgICAgaWYgKGJ1Zl9zaXplIDwgcy0+bWF4X2ZyYW1lc2l6ZSAmJiBhdnBrdC0+ZGF0YSkgewotICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOwotICAgICAgICAgICAgcmV0dXJuIGlucHV0X2J1Zl9zaXplOwotICAgICAgICB9CisgICAgLyogZG8gbm90IGRlY29kZSB1bnRpbCBidWZmZXIgaGFzIGF0IGxlYXN0IG1heF9mcmFtZXNpemUgYnl0ZXMgb3IKKyAgICAgKiB0aGUgZW5kIG9mIHRoZSBmaWxlIGhhcyBiZWVuIHJlYWNoZWQgKi8KKyAgICBpZiAoYnVmX3NpemUgPCBzLT5tYXhfZnJhbWVzaXplICYmIGF2cGt0LT5kYXRhKSB7CisgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKKyAgICAgICAgcmV0dXJuIGlucHV0X2J1Zl9zaXplOwogICAgIH0KICAgICAvKiBpbml0IGFuZCBwb3NpdGlvbiBiaXRzdHJlYW0gcmVhZGVyICovCiAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmcy0+Z2IsIGJ1ZiwgYnVmX3NpemUpKSA8IDApCkBAIC00NzIsMTAgKzU3MiwyNiBAQAogCiAgICAgLyogcHJvY2VzcyBoZWFkZXIgb3IgbmV4dCBzdWJibG9jayAqLwogICAgIGlmICghcy0+Z290X2hlYWRlcikgeworCiAgICAgICAgIGlmICgocmV0ID0gcmVhZF9oZWFkZXIocykpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKLSAgICAgICAgZ290byBmaW5pc2hfZnJhbWU7CisKKyAgICAgICAgaWYgKGF2cGt0LT5zaXplKSB7CisgICAgICAgICAgICBpbnQgbWF4X2ZyYW1lc2l6ZTsKKyAgICAgICAgICAgIHZvaWQgKnRtcF9wdHI7CisKKyAgICAgICAgICAgIG1heF9mcmFtZXNpemUgPSBGRk1BWChzLT5tYXhfZnJhbWVzaXplLCBzLT5ibG9ja3NpemUgKiBzLT5jaGFubmVscyAqIDgpOworICAgICAgICAgICAgdG1wX3B0ciA9IGF2X2Zhc3RfcmVhbGxvYyhzLT5iaXRzdHJlYW0sICZzLT5hbGxvY2F0ZWRfYml0c3RyZWFtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9mcmFtZXNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghdG1wX3B0cikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgYWxsb2NhdGluZyBiaXRzdHJlYW0gYnVmZmVyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+Yml0c3RyZWFtID0gdG1wX3B0cjsKKyAgICAgICAgICAgIHMtPm1heF9mcmFtZXNpemUgPSBtYXhfZnJhbWVzaXplOworICAgICAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICAgICAgZ290byBmaW5pc2hfZnJhbWU7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBpZiBxdWl0IGNvbW1hbmQgd2FzIHJlYWQgcHJldmlvdXNseSwgZG9uJ3QgZGVjb2RlIGFueXRoaW5nICovCkBAIC01MDcsMTIgKzYyMywxNyBAQAogICAgICAgICAgICAgc3dpdGNoIChjbWQpIHsKICAgICAgICAgICAgIGNhc2UgRk5fVkVSQkFUSU06CiAgICAgICAgICAgICAgICAgbGVuID0gZ2V0X3VyX2dvbG9tYl9zaG9ydGVuKCZzLT5nYiwgVkVSQkFUSU1fQ0tTSVpFX1NJWkUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPCAwIHx8IGxlbiA+IGdldF9iaXRzX2xlZnQoJnMtPmdiKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInZlcmJhdGltIGxlbmd0aCAlZCBpbnZhbGlkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdoaWxlIChsZW4tLSkKICAgICAgICAgICAgICAgICAgICAgZ2V0X3VyX2dvbG9tYl9zaG9ydGVuKCZzLT5nYiwgVkVSQkFUSU1fQllURV9TSVpFKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgRk5fQklUU0hJRlQ6IHsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBiaXRzaGlmdCA9IGdldF91cl9nb2xvbWJfc2hvcnRlbigmcy0+Z2IsIEJJVFNISUZUU0laRSk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpdHNoaWZ0ID4gMzEpIHsKKyAgICAgICAgICAgICAgICBpZiAoYml0c2hpZnQgPiAzMikgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJpdHNoaWZ0ICVkIGlzIGludmFsaWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzaGlmdCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtNTIzLDggKzY0NCw4IEBACiAgICAgICAgICAgICBjYXNlIEZOX0JMT0NLU0laRTogewogICAgICAgICAgICAgICAgIHVuc2lnbmVkIGJsb2Nrc2l6ZSA9IGdldF91aW50KHMsIGF2X2xvZzIocy0+YmxvY2tzaXplKSk7CiAgICAgICAgICAgICAgICAgaWYgKGJsb2Nrc2l6ZSA+IHMtPmJsb2Nrc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNyZWFzaW5nIGJsb2NrIHNpemUgaXMgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5jcmVhc2luZyBibG9jayBzaXplIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCFibG9ja3NpemUgfHwgYmxvY2tzaXplID4gTUFYX0JMT0NLU0laRSkgewpAQCAtNTM5LDEwICs2NjAsOCBAQAogICAgICAgICAgICAgICAgIHMtPmdvdF9xdWl0X2NvbW1hbmQgPSAxOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNtZCA9PSBGTl9CTE9DS1NJWkUgfHwgY21kID09IEZOX1FVSVQpIHsKLSAgICAgICAgICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7CisgICAgICAgICAgICBpZiAoY21kID09IEZOX1FVSVQpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBwcm9jZXNzIGF1ZGlvIGNvbW1hbmQgKi8KICAgICAgICAgICAgIGludCByZXNpZHVhbF9zaXplID0gMDsKQEAgLTU1Niw2ICs2NzUsMTAgQEAKICAgICAgICAgICAgICAgICAgKiBvZiBnZXRfc3JfZ29sb21iX3Nob3J0ZW4oKS4gKi8KICAgICAgICAgICAgICAgICBpZiAocy0+dmVyc2lvbiA9PSAwKQogICAgICAgICAgICAgICAgICAgICByZXNpZHVhbF9zaXplLS07CisgICAgICAgICAgICAgICAgaWYgKHJlc2lkdWFsX3NpemUgPiAzMFUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZXNpZHVhbCBzaXplIHVuc3VwcG9ydGQ6ICVkXG4iLCByZXNpZHVhbF9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBjYWxjdWxhdGUgc2FtcGxlIG9mZnNldCB1c2luZyBtZWFucyBmcm9tIHByZXZpb3VzIGJsb2NrcyAqLwpAQCAtNTY0LDcgKzY4Nyw3IEBACiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IHN1bSA9IChzLT52ZXJzaW9uIDwgMikgPyAwIDogcy0+bm1lYW4gLyAyOwogICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5ubWVhbjsgaSsrKQotICAgICAgICAgICAgICAgICAgICBzdW0gKz0gcy0+b2Zmc2V0W2NoYW5uZWxdW2ldOworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gKHVuc2lnbmVkKXMtPm9mZnNldFtjaGFubmVsXVtpXTsKICAgICAgICAgICAgICAgICBjb2Zmc2V0ID0gc3VtIC8gcy0+bm1lYW47CiAgICAgICAgICAgICAgICAgaWYgKHMtPnZlcnNpb24gPj0gMikKICAgICAgICAgICAgICAgICAgICAgY29mZnNldCA9IHMtPmJpdHNoaWZ0ID09IDAgPyBjb2Zmc2V0IDogY29mZnNldCA+PiBzLT5iaXRzaGlmdCAtIDEgPj4gMTsKQEAgLTU4Miw3ICs3MDUsNyBAQAogCiAgICAgICAgICAgICAvKiB1cGRhdGUgbWVhbnMgd2l0aCBpbmZvIGZyb20gdGhlIGN1cnJlbnQgYmxvY2sgKi8KICAgICAgICAgICAgIGlmIChzLT5ubWVhbiA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHN1bSA9IChzLT52ZXJzaW9uIDwgMikgPyAwIDogcy0+YmxvY2tzaXplIC8gMjsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHN1bSA9IChzLT52ZXJzaW9uIDwgMikgPyAwIDogcy0+YmxvY2tzaXplIC8gMjsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YmxvY2tzaXplOyBpKyspCiAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBzLT5kZWNvZGVkW2NoYW5uZWxdW2ldOwogCkBAIC01OTIsNyArNzE1LDcgQEAKICAgICAgICAgICAgICAgICBpZiAocy0+dmVyc2lvbiA8IDIpCiAgICAgICAgICAgICAgICAgICAgIHMtPm9mZnNldFtjaGFubmVsXVtzLT5ubWVhbiAtIDFdID0gc3VtIC8gcy0+YmxvY2tzaXplOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcy0+b2Zmc2V0W2NoYW5uZWxdW3MtPm5tZWFuIC0gMV0gPSAoc3VtIC8gcy0+YmxvY2tzaXplKSA8PCBzLT5iaXRzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgcy0+b2Zmc2V0W2NoYW5uZWxdW3MtPm5tZWFuIC0gMV0gPSBzLT5iaXRzaGlmdCA9PSAzMiA/IDAgOiAoc3VtIC8gcy0+YmxvY2tzaXplKSAqICgxTEwgPDwgcy0+Yml0c2hpZnQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiBjb3B5IHdyYXAgc2FtcGxlcyBmb3IgdXNlIHdpdGggbmV4dCBibG9jayAqLwpAQCAtNjI5LDYgKzc1MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5zd2FwICYmIHMtPmludGVybmFsX2Z0eXBlICE9IFRZUEVfVTgpCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5iZHNwLmJzd2FwMTZfYnVmKCgodWludDE2X3QgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGEpW2NoYW5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhKVtjaGFuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YmxvY2tzaXplKTsKKwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMTsKQEAgLTY4MCw3ICs4MDgsNyBAQAogICAgIC5pbml0ICAgICAgICAgICA9IHNob3J0ZW5fZGVjb2RlX2luaXQsCiAgICAgLmNsb3NlICAgICAgICAgID0gc2hvcnRlbl9kZWNvZGVfY2xvc2UsCiAgICAgLmRlY29kZSAgICAgICAgID0gc2hvcnRlbl9kZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfU1VCRlJBTUVTIHwgQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0RSMSwKICAgICAuc2FtcGxlX2ZtdHMgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfUzE2UCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfVThQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NpbXBsZV9pZGN0LmMgYi9saWJhdmNvZGVjL3NpbXBsZV9pZGN0LmMKaW5kZXggMDcxMWUxNi4uNzhiMjljMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9zaW1wbGVfaWRjdC5jCisrKyBiL2xpYmF2Y29kZWMvc2ltcGxlX2lkY3QuYwpAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJzaW1wbGVfaWRjdC5oIgogCisjZGVmaW5lIElOX0lEQ1RfREVQVEggMTYKKwogI2RlZmluZSBCSVRfREVQVEggOAogI2luY2x1ZGUgInNpbXBsZV9pZGN0X3RlbXBsYXRlLmMiCiAjdW5kZWYgQklUX0RFUFRICkBAIC00Niw2ICs0OCwxMyBAQAogI2RlZmluZSBCSVRfREVQVEggMTIKICNpbmNsdWRlICJzaW1wbGVfaWRjdF90ZW1wbGF0ZS5jIgogI3VuZGVmIEJJVF9ERVBUSAorI3VuZGVmIElOX0lEQ1RfREVQVEgKKworI2RlZmluZSBJTl9JRENUX0RFUFRIIDMyCisjZGVmaW5lIEJJVF9ERVBUSCAxMAorI2luY2x1ZGUgInNpbXBsZV9pZGN0X3RlbXBsYXRlLmMiCisjdW5kZWYgQklUX0RFUFRICisjdW5kZWYgSU5fSURDVF9ERVBUSAogCiAvKiAyeDR4OCBpZGN0ICovCiAKQEAgLTU4LDcgKzY3LDcgQEAKICAgIGFuZCB0aGUgYnV0dGVyZmx5IG11c3QgYmUgbXVsdGlwbGllZCBieSAwLjUgKiBzcXJ0KDIuMCkgKi8KICNkZWZpbmUgQ19TSElGVCAoNCsxKzEyKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWRjdDRjb2xfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGNvbnN0IGludDE2X3QgKmNvbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBpZGN0NGNvbF9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgY29uc3QgaW50MTZfdCAqY29sKQogewogICAgIGludCBjMCwgYzEsIGMyLCBjMywgYTAsIGExLCBhMiwgYTM7CiAKQEAgLTY2LDggKzc1LDggQEAKICAgICBhMSA9IGNvbFs4KjJdOwogICAgIGEyID0gY29sWzgqNF07CiAgICAgYTMgPSBjb2xbOCo2XTsKLSAgICBjMCA9ICgoYTAgKyBhMikgPDwgKENOX1NISUZUIC0gMSkpICsgKDEgPDwgKENfU0hJRlQgLSAxKSk7Ci0gICAgYzIgPSAoKGEwIC0gYTIpIDw8IChDTl9TSElGVCAtIDEpKSArICgxIDw8IChDX1NISUZUIC0gMSkpOworICAgIGMwID0gKChhMCArIGEyKSAqICgxIDw8IENOX1NISUZUIC0gMSkpICsgKDEgPDwgKENfU0hJRlQgLSAxKSk7CisgICAgYzIgPSAoKGEwIC0gYTIpICogKDEgPDwgQ05fU0hJRlQgLSAxKSkgKyAoMSA8PCAoQ19TSElGVCAtIDEpKTsKICAgICBjMSA9IGExICogQzEgKyBhMyAqIEMyOwogICAgIGMzID0gYTEgKiBDMiAtIGEzICogQzE7CiAgICAgZGVzdFswXSA9IGF2X2NsaXBfdWludDgoKGMwICsgYzEpID4+IENfU0hJRlQpOwpAQCAtOTQsNyArMTAzLDcgQEAKIC8qIFhYWDogSSB0aGluayBhIDEuMC9zcXJ0KDIpIG5vcm1hbGl6YXRpb24gc2hvdWxkIGJlIG5lZWRlZCB0bwogICAgY29tcGVuc2F0ZSB0aGUgZXh0cmEgYnV0dGVyZmx5IHN0YWdlIC0gSSBkb24ndCBoYXZlIHRoZSBmdWxsIERWCiAgICBzcGVjaWZpY2F0aW9uICovCi12b2lkIGZmX3NpbXBsZV9pZGN0MjQ4X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3ZvaWQgZmZfc2ltcGxlX2lkY3QyNDhfcHV0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogICAgIGludDE2X3QgKnB0cjsKQEAgLTExNSw3ICsxMjQsNyBAQAogCiAgICAgLyogSURDVDggb24gZWFjaCBsaW5lICovCiAgICAgZm9yKGk9MDsgaTw4OyBpKyspIHsKLSAgICAgICAgaWRjdFJvd0NvbmREQ184KGJsb2NrICsgaSo4LCAwKTsKKyAgICAgICAgaWRjdFJvd0NvbmREQ19pbnQxNl84Yml0KGJsb2NrICsgaSo4LCAwKTsKICAgICB9CiAKICAgICAvKiBJRENUNCBhbmQgc3RvcmUgKi8KQEAgLTEzNyw3ICsxNDYsNyBAQAogI2RlZmluZSBDMiBDX0ZJWCgwLjI3MDU5ODA1MDEpCiAjZGVmaW5lIEMzIENfRklYKDAuNSkKICNkZWZpbmUgQ19TSElGVCAoNCsxKzEyKQotc3RhdGljIGlubGluZSB2b2lkIGlkY3Q0Y29sX2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBjb25zdCBpbnQxNl90ICpjb2wpCitzdGF0aWMgaW5saW5lIHZvaWQgaWRjdDRjb2xfYWRkKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGNvbnN0IGludDE2X3QgKmNvbCkKIHsKICAgICBpbnQgYzAsIGMxLCBjMiwgYzMsIGEwLCBhMSwgYTIsIGEzOwogCkBAIC0xODIsMTMgKzE5MSwxMyBAQAogICAgIHJvd1szXT0gKGMwIC0gYzEpID4+IFJfU0hJRlQ7CiB9CiAKLXZvaWQgZmZfc2ltcGxlX2lkY3Q4NF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit2b2lkIGZmX3NpbXBsZV9pZGN0ODRfYWRkKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogCiAgICAgLyogSURDVDggb24gZWFjaCBsaW5lICovCiAgICAgZm9yKGk9MDsgaTw0OyBpKyspIHsKLSAgICAgICAgaWRjdFJvd0NvbmREQ184KGJsb2NrICsgaSo4LCAwKTsKKyAgICAgICAgaWRjdFJvd0NvbmREQ19pbnQxNl84Yml0KGJsb2NrICsgaSo4LCAwKTsKICAgICB9CiAKICAgICAvKiBJRENUNCBhbmQgc3RvcmUgKi8KQEAgLTE5Nyw3ICsyMDYsNyBAQAogICAgIH0KIH0KIAotdm9pZCBmZl9zaW1wbGVfaWRjdDQ4X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3ZvaWQgZmZfc2ltcGxlX2lkY3Q0OF9hZGQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgaW50IGk7CiAKQEAgLTIwOCwxMSArMjE3LDExIEBACiAKICAgICAvKiBJRENUOCBhbmQgc3RvcmUgKi8KICAgICBmb3IoaT0wOyBpPDQ7IGkrKyl7Ci0gICAgICAgIGlkY3RTcGFyc2VDb2xBZGRfOChkZXN0ICsgaSwgbGluZV9zaXplLCBibG9jayArIGkpOworICAgICAgICBpZGN0U3BhcnNlQ29sQWRkX2ludDE2XzhiaXQoZGVzdCArIGksIGxpbmVfc2l6ZSwgYmxvY2sgKyBpKTsKICAgICB9CiB9CiAKLXZvaWQgZmZfc2ltcGxlX2lkY3Q0NF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit2b2lkIGZmX3NpbXBsZV9pZGN0NDRfYWRkKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NpbXBsZV9pZGN0LmggYi9saWJhdmNvZGVjL3NpbXBsZV9pZGN0LmgKaW5kZXggMTU0ZTI5Ny4uMzlkZjIzMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9zaW1wbGVfaWRjdC5oCisrKyBiL2xpYmF2Y29kZWMvc2ltcGxlX2lkY3QuaApAQCAtMjgsMzEgKzI4LDM2IEBACiAjaWZuZGVmIEFWQ09ERUNfU0lNUExFX0lEQ1RfSAogI2RlZmluZSBBVkNPREVDX1NJTVBMRV9JRENUX0gKIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCi12b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF84KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKLXZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkXzgodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl9zaW1wbGVfaWRjdF84KGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X2ludDE2XzhiaXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfaW50MTZfOGJpdCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X2ludDE2XzhiaXQoaW50MTZfdCAqYmxvY2spOwogCi12b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF8xMCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF8xMCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0XzEwKGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X2ludDE2XzEwYml0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2ludDE2XzEwYml0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfaW50MTZfMTBiaXQoaW50MTZfdCAqYmxvY2spOwogCi12b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF8xMih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF8xMih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0XzEyKGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X2ludDMyXzEwYml0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX2ludDMyXzEwYml0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfaW50MzJfMTBiaXQoaW50MTZfdCAqYmxvY2spOworCit2b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9pbnQxNl8xMmJpdCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X2FkZF9pbnQxNl8xMmJpdCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0X2ludDE2XzEyYml0KGludDE2X3QgKmJsb2NrKTsKIAogLyoqCi0gKiBTcGVjaWFsIHZlcnNpb24gb2YgZmZfc2ltcGxlX2lkY3RfMTAoKSB3aGljaCBkb2VzIGRlcXVhbnRpemF0aW9uCisgKiBTcGVjaWFsIHZlcnNpb24gb2YgZmZfc2ltcGxlX2lkY3RfaW50MTZfMTBiaXQoKSB3aGljaCBkb2VzIGRlcXVhbnRpemF0aW9uCiAgKiBhbmQgc2NhbGVzIGJ5IGEgZmFjdG9yIG9mIDIgbW9yZSBiZXR3ZWVuIHRoZSB0d28gSURDVHMgdG8gYWNjb3VudAogICogZm9yIGxhcmdlciBzY2FsZSBvZiBpbnB1dCBjb2VmZmljaWVudHMuCiAgKi8KIHZvaWQgZmZfcHJvcmVzX2lkY3QoaW50MTZfdCAqYmxvY2ssIGNvbnN0IGludDE2X3QgKnFtYXQpOwogCi12b2lkIGZmX3NpbXBsZV9pZGN0MjQ4X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0MjQ4X3B1dCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CiAKLXZvaWQgZmZfc2ltcGxlX2lkY3Q4NF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl9zaW1wbGVfaWRjdDQ4X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0NDRfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3Q4NF9hZGQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdDQ4X2FkZCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0NDRfYWRkKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfU0lNUExFX0lEQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zaW1wbGVfaWRjdF90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy9zaW1wbGVfaWRjdF90ZW1wbGF0ZS5jCmluZGV4IDA1ODU2NzkuLjkwNDI2M2YgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc2ltcGxlX2lkY3RfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL3NpbXBsZV9pZGN0X3RlbXBsYXRlLmMKQEAgLTI1LDEwICsyNSw4IEBACiAgKiBzaW1wbGVpZGN0IGluIEMuCiAgKi8KIAotLyoKLSAgYmFzZWQgdXBvbiBzb21lIG91dGNvbW1lbnRlZCBjIGNvZGUgZnJvbSBtcGVnMmRlYyAoaWRjdF9tbXguYwotICB3cml0dGVuIGJ5IEFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPikKLSAqLworLyogQmFzZWQgdXBvbiBzb21lIGNvbW1lbnRlZC1vdXQgQyBjb2RlIGZyb20gbXBlZzJkZWMgKGlkY3RfbW14LmMKKyAqIHdyaXR0ZW4gYnkgQWFyb24gSG9sdHptYW4gPGFob2x0em1hQGVzcy5lbmdyLnV2aWMuY2E+KS4gKi8KIAogI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCiAKQEAgLTc5LDYgKzc3LDEwIEBACiAjZGVmaW5lIFJPV19TSElGVCAxMwogI2RlZmluZSBDT0xfU0hJRlQgMTgKICNkZWZpbmUgRENfU0hJRlQgIDEKKyMgICBlbGlmIElOX0lEQ1RfREVQVEggPT0gMzIKKyNkZWZpbmUgUk9XX1NISUZUIDEzCisjZGVmaW5lIENPTF9TSElGVCAyMQorI2RlZmluZSBEQ19TSElGVCAgMgogIyAgIGVsc2UKICNkZWZpbmUgUk9XX1NISUZUIDEyCiAjZGVmaW5lIENPTF9TSElGVCAxOQpAQCAtMTExLDE0ICsxMTMsMTYgQEAKICNpZmRlZiBFWFRSQV9TSElGVAogc3RhdGljIGlubGluZSB2b2lkIEZVTkMoaWRjdFJvd0NvbmREQ19leHRyYXNoaWZ0KShpbnQxNl90ICpyb3csIGludCBleHRyYV9zaGlmdCkKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhpZGN0Um93Q29uZERDKShpbnQxNl90ICpyb3csIGludCBleHRyYV9zaGlmdCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBGVU5DNihpZGN0Um93Q29uZERDKShpZGN0aW4gKnJvdywgaW50IGV4dHJhX3NoaWZ0KQogI2VuZGlmCiB7Ci0gICAgaW50IGEwLCBhMSwgYTIsIGEzLCBiMCwgYjEsIGIyLCBiMzsKKyAgICBTVUlOVCBhMCwgYTEsIGEyLCBhMywgYjAsIGIxLCBiMiwgYjM7CiAKKy8vIFRPRE86IEFkZCBEQy1vbmx5IHN1cHBvcnQgZm9yIGludDMyX3QgaW5wdXQKKyNpZiBJTl9JRENUX0RFUFRIID09IDE2CiAjaWYgSEFWRV9GQVNUXzY0QklUCiAjZGVmaW5lIFJPVzBfTUFTSyAoMHhmZmZmTEwgPDwgNDggKiBIQVZFX0JJR0VORElBTikKLSAgICBpZiAoKCgoKHVpbnQ2NF90ICopcm93KVswXSAmIH5ST1cwX01BU0spIHwgKCh1aW50NjRfdCAqKXJvdylbMV0pID09IDApIHsKKyAgICBpZiAoKChBVl9STjY0QShyb3cpICYgflJPVzBfTUFTSykgfCBBVl9STjY0QShyb3crNCkpID09IDApIHsKICAgICAgICAgdWludDY0X3QgdGVtcDsKICAgICAgICAgaWYgKERDX1NISUZUIC0gZXh0cmFfc2hpZnQgPj0gMCkgewogICAgICAgICAgICAgdGVtcCA9IChyb3dbMF0gKiAoMSA8PCAoRENfU0hJRlQgLSBleHRyYV9zaGlmdCkpKSAmIDB4ZmZmZjsKQEAgLTEyNywxNCArMTMxLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgdGVtcCArPSB0ZW1wICogKDEgPDwgMTYpOwogICAgICAgICB0ZW1wICs9IHRlbXAgKiAoKHVpbnQ2NF90KSAxIDw8IDMyKTsKLSAgICAgICAgKCh1aW50NjRfdCAqKXJvdylbMF0gPSB0ZW1wOwotICAgICAgICAoKHVpbnQ2NF90ICopcm93KVsxXSA9IHRlbXA7CisgICAgICAgIEFWX1dONjRBKHJvdywgdGVtcCk7CisgICAgICAgIEFWX1dONjRBKHJvdyArIDQsIHRlbXApOwogICAgICAgICByZXR1cm47CiAgICAgfQogI2Vsc2UKLSAgICBpZiAoISgoKHVpbnQzMl90Kilyb3cpWzFdIHwKLSAgICAgICAgICAoKHVpbnQzMl90Kilyb3cpWzJdIHwKLSAgICAgICAgICAoKHVpbnQzMl90Kilyb3cpWzNdIHwKKyAgICBpZiAoIShBVl9STjMyQShyb3crMikgfAorICAgICAgICAgIEFWX1JOMzJBKHJvdys0KSB8CisgICAgICAgICAgQVZfUk4zMkEocm93KzYpIHwKICAgICAgICAgICByb3dbMV0pKSB7CiAgICAgICAgIHVpbnQzMl90IHRlbXA7CiAgICAgICAgIGlmIChEQ19TSElGVCAtIGV4dHJhX3NoaWZ0ID49IDApIHsKQEAgLTE0MywxMSArMTQ3LDE0IEBACiAgICAgICAgICAgICB0ZW1wID0gKChyb3dbMF0gKyAoMTw8KGV4dHJhX3NoaWZ0IC0gRENfU0hJRlQtMSkpKSA+PiAoZXh0cmFfc2hpZnQgLSBEQ19TSElGVCkpICYgMHhmZmZmOwogICAgICAgICB9CiAgICAgICAgIHRlbXAgKz0gdGVtcCAqICgxIDw8IDE2KTsKLSAgICAgICAgKCh1aW50MzJfdCopcm93KVswXT0oKHVpbnQzMl90Kilyb3cpWzFdID0KLSAgICAgICAgICAgICgodWludDMyX3QqKXJvdylbMl09KCh1aW50MzJfdCopcm93KVszXSA9IHRlbXA7CisgICAgICAgIEFWX1dOMzJBKHJvdywgdGVtcCk7CisgICAgICAgIEFWX1dOMzJBKHJvdysyLCB0ZW1wKTsKKyAgICAgICAgQVZfV04zMkEocm93KzQsIHRlbXApOworICAgICAgICBBVl9XTjMyQShyb3crNiwgdGVtcCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAjZW5kaWYKKyNlbmRpZgogCiAgICAgYTAgPSAoVzQgKiByb3dbMF0pICsgKDEgPDwgKFJPV19TSElGVCArIGV4dHJhX3NoaWZ0IC0gMSkpOwogICAgIGExID0gYTA7CkBAIC0xNjgsNyArMTc1LDExIEBACiAgICAgYjMgPSBNVUwoVzcsIHJvd1sxXSk7CiAgICAgTUFDKGIzLCAtVzUsIHJvd1szXSk7CiAKKyNpZiBJTl9JRENUX0RFUFRIID09IDMyCisgICAgaWYgKEFWX1JONjRBKHJvdyArIDQpIHwgQVZfUk42NEEocm93ICsgNikpIHsKKyNlbHNlCiAgICAgaWYgKEFWX1JONjRBKHJvdyArIDQpKSB7CisjZW5kaWYKICAgICAgICAgYTAgKz0gICBXNCpyb3dbNF0gKyBXNipyb3dbNl07CiAgICAgICAgIGExICs9IC0gVzQqcm93WzRdIC0gVzIqcm93WzZdOwogICAgICAgICBhMiArPSAtIFc0KnJvd1s0XSArIFcyKnJvd1s2XTsKQEAgLTE4NywxNCArMTk4LDE0IEBACiAgICAgICAgIE1BQyhiMywgLVcxLCByb3dbN10pOwogICAgIH0KIAotICAgIHJvd1swXSA9IChhMCArIGIwKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOwotICAgIHJvd1s3XSA9IChhMCAtIGIwKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOwotICAgIHJvd1sxXSA9IChhMSArIGIxKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOwotICAgIHJvd1s2XSA9IChhMSAtIGIxKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOwotICAgIHJvd1syXSA9IChhMiArIGIyKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOwotICAgIHJvd1s1XSA9IChhMiAtIGIyKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOwotICAgIHJvd1szXSA9IChhMyArIGIzKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOwotICAgIHJvd1s0XSA9IChhMyAtIGIzKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOworICAgIHJvd1swXSA9IChpbnQpKGEwICsgYjApID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzddID0gKGludCkoYTAgLSBiMCkgPj4gKFJPV19TSElGVCArIGV4dHJhX3NoaWZ0KTsKKyAgICByb3dbMV0gPSAoaW50KShhMSArIGIxKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOworICAgIHJvd1s2XSA9IChpbnQpKGExIC0gYjEpID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzJdID0gKGludCkoYTIgKyBiMikgPj4gKFJPV19TSElGVCArIGV4dHJhX3NoaWZ0KTsKKyAgICByb3dbNV0gPSAoaW50KShhMiAtIGIyKSA+PiAoUk9XX1NISUZUICsgZXh0cmFfc2hpZnQpOworICAgIHJvd1szXSA9IChpbnQpKGEzICsgYjMpID4+IChST1dfU0hJRlQgKyBleHRyYV9zaGlmdCk7CisgICAgcm93WzRdID0gKGludCkoYTMgLSBiMykgPj4gKFJPV19TSElGVCArIGV4dHJhX3NoaWZ0KTsKIH0KIAogI2RlZmluZSBJRENUX0NPTFMgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNTAsMzIgKzI2MSwzMiBAQAogI2lmZGVmIEVYVFJBX1NISUZUCiBzdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhpZGN0U3BhcnNlQ29sX2V4dHJhc2hpZnQpKGludDE2X3QgKmNvbCkKICNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhpZGN0U3BhcnNlQ29sUHV0KShwaXhlbCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBGVU5DNihpZGN0U3BhcnNlQ29sUHV0KShwaXhlbCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkY3RpbiAqY29sKQogewotICAgIGludCBhMCwgYTEsIGEyLCBhMywgYjAsIGIxLCBiMiwgYjM7CisgICAgU1VJTlQgYTAsIGExLCBhMiwgYTMsIGIwLCBiMSwgYjIsIGIzOwogCiAgICAgSURDVF9DT0xTOwogCi0gICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGEwICsgYjApID4+IENPTF9TSElGVCk7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGludCkoYTAgKyBiMCkgPj4gQ09MX1NISUZUKTsKICAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKLSAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbCgoYTEgKyBiMSkgPj4gQ09MX1NISUZUKTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbCgoaW50KShhMSArIGIxKSA+PiBDT0xfU0hJRlQpOwogICAgIGRlc3QgKz0gbGluZV9zaXplOwotICAgIGRlc3RbMF0gPSBhdl9jbGlwX3BpeGVsKChhMiArIGIyKSA+PiBDT0xfU0hJRlQpOworICAgIGRlc3RbMF0gPSBhdl9jbGlwX3BpeGVsKChpbnQpKGEyICsgYjIpID4+IENPTF9TSElGVCk7CiAgICAgZGVzdCArPSBsaW5lX3NpemU7Ci0gICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGEzICsgYjMpID4+IENPTF9TSElGVCk7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGludCkoYTMgKyBiMykgPj4gQ09MX1NISUZUKTsKICAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKLSAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbCgoYTMgLSBiMykgPj4gQ09MX1NISUZUKTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbCgoaW50KShhMyAtIGIzKSA+PiBDT0xfU0hJRlQpOwogICAgIGRlc3QgKz0gbGluZV9zaXplOwotICAgIGRlc3RbMF0gPSBhdl9jbGlwX3BpeGVsKChhMiAtIGIyKSA+PiBDT0xfU0hJRlQpOworICAgIGRlc3RbMF0gPSBhdl9jbGlwX3BpeGVsKChpbnQpKGEyIC0gYjIpID4+IENPTF9TSElGVCk7CiAgICAgZGVzdCArPSBsaW5lX3NpemU7Ci0gICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGExIC0gYjEpID4+IENPTF9TSElGVCk7CisgICAgZGVzdFswXSA9IGF2X2NsaXBfcGl4ZWwoKGludCkoYTEgLSBiMSkgPj4gQ09MX1NISUZUKTsKICAgICBkZXN0ICs9IGxpbmVfc2l6ZTsKLSAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbCgoYTAgLSBiMCkgPj4gQ09MX1NISUZUKTsKKyAgICBkZXN0WzBdID0gYXZfY2xpcF9waXhlbCgoaW50KShhMCAtIGIwKSA+PiBDT0xfU0hJRlQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhpZGN0U3BhcnNlQ29sQWRkKShwaXhlbCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmNvbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBGVU5DNihpZGN0U3BhcnNlQ29sQWRkKShwaXhlbCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkY3RpbiAqY29sKQogewogICAgIGludCBhMCwgYTEsIGEyLCBhMywgYjAsIGIxLCBiMiwgYjM7CiAKQEAgLTI5OCw3ICszMDksNyBAQAogICAgIGRlc3RbMF0gPSBhdl9jbGlwX3BpeGVsKGRlc3RbMF0gKyAoKGEwIC0gYjApID4+IENPTF9TSElGVCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgRlVOQyhpZGN0U3BhcnNlQ29sKShpbnQxNl90ICpjb2wpCitzdGF0aWMgaW5saW5lIHZvaWQgRlVOQzYoaWRjdFNwYXJzZUNvbCkoaWRjdGluICpjb2wpCiAjZW5kaWYKIHsKICAgICBpbnQgYTAsIGExLCBhMiwgYTMsIGIwLCBiMSwgYjIsIGIzOwpAQCAtMzE2LDcgKzMyNywyMyBAQAogfQogCiAjaWZuZGVmIEVYVFJBX1NISUZUCi12b2lkIEZVTkMoZmZfc2ltcGxlX2lkY3RfcHV0KSh1aW50OF90ICpkZXN0XywgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCit2b2lkIEZVTkM2KGZmX3NpbXBsZV9pZGN0X3B1dCkodWludDhfdCAqZGVzdF8sIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrXykKK3sKKyAgICBpZGN0aW4gKmJsb2NrID0gKGlkY3RpbiAqKWJsb2NrXzsKKyAgICBwaXhlbCAqZGVzdCA9IChwaXhlbCAqKWRlc3RfOworICAgIGludCBpOworCisgICAgbGluZV9zaXplIC89IHNpemVvZihwaXhlbCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBGVU5DNihpZGN0Um93Q29uZERDKShibG9jayArIGkqOCwgMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICBGVU5DNihpZGN0U3BhcnNlQ29sUHV0KShkZXN0ICsgaSwgbGluZV9zaXplLCBibG9jayArIGkpOworfQorCisjaWYgSU5fSURDVF9ERVBUSCA9PSAxNgordm9pZCBGVU5DNihmZl9zaW1wbGVfaWRjdF9hZGQpKHVpbnQ4X3QgKmRlc3RfLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKIHsKICAgICBwaXhlbCAqZGVzdCA9IChwaXhlbCAqKWRlc3RfOwogICAgIGludCBpOwpAQCAtMzI0LDM0ICszNTEsMjEgQEAKICAgICBsaW5lX3NpemUgLz0gc2l6ZW9mKHBpeGVsKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIEZVTkMoaWRjdFJvd0NvbmREQykoYmxvY2sgKyBpKjgsIDApOworICAgICAgICBGVU5DNihpZGN0Um93Q29uZERDKShibG9jayArIGkqOCwgMCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICBGVU5DKGlkY3RTcGFyc2VDb2xQdXQpKGRlc3QgKyBpLCBsaW5lX3NpemUsIGJsb2NrICsgaSk7CisgICAgICAgIEZVTkM2KGlkY3RTcGFyc2VDb2xBZGQpKGRlc3QgKyBpLCBsaW5lX3NpemUsIGJsb2NrICsgaSk7CiB9CiAKLXZvaWQgRlVOQyhmZl9zaW1wbGVfaWRjdF9hZGQpKHVpbnQ4X3QgKmRlc3RfLCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKLXsKLSAgICBwaXhlbCAqZGVzdCA9IChwaXhlbCAqKWRlc3RfOwotICAgIGludCBpOwotCi0gICAgbGluZV9zaXplIC89IHNpemVvZihwaXhlbCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICBGVU5DKGlkY3RSb3dDb25kREMpKGJsb2NrICsgaSo4LCAwKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIEZVTkMoaWRjdFNwYXJzZUNvbEFkZCkoZGVzdCArIGksIGxpbmVfc2l6ZSwgYmxvY2sgKyBpKTsKLX0KLQotdm9pZCBGVU5DKGZmX3NpbXBsZV9pZGN0KShpbnQxNl90ICpibG9jaykKK3ZvaWQgRlVOQzYoZmZfc2ltcGxlX2lkY3QpKGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLSAgICAgICAgRlVOQyhpZGN0Um93Q29uZERDKShibG9jayArIGkqOCwgMCk7CisgICAgICAgIEZVTkM2KGlkY3RSb3dDb25kREMpKGJsb2NrICsgaSo4LCAwKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0gICAgICAgIEZVTkMoaWRjdFNwYXJzZUNvbCkoYmxvY2sgKyBpKTsKKyAgICAgICAgRlVOQzYoaWRjdFNwYXJzZUNvbCkoYmxvY2sgKyBpKTsKIH0KICNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NpbmV3aW4uaCBiL2xpYmF2Y29kZWMvc2luZXdpbi5oCmluZGV4IDI3YzEwN2MuLjZiOTdhNzEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc2luZXdpbi5oCisrKyBiL2xpYmF2Y29kZWMvc2luZXdpbi5oCkBAIC01MiwxNCArNTIsMTYgQEAKIAogZXh0ZXJuIFNJTkVUQUJMRSggIDMyKTsKIGV4dGVybiBTSU5FVEFCTEUoICA2NCk7CitleHRlcm4gU0lORVRBQkxFKCAxMjApOwogZXh0ZXJuIFNJTkVUQUJMRSggMTI4KTsKIGV4dGVybiBTSU5FVEFCTEUoIDI1Nik7CiBleHRlcm4gU0lORVRBQkxFKCA1MTIpOworZXh0ZXJuIFNJTkVUQUJMRSggOTYwKTsKIGV4dGVybiBTSU5FVEFCTEUoMTAyNCk7CiBleHRlcm4gU0lORVRBQkxFKDIwNDgpOwogZXh0ZXJuIFNJTkVUQUJMRSg0MDk2KTsKIGV4dGVybiBTSU5FVEFCTEUoODE5Mik7CiAKLWV4dGVybiBTSU5FVEFCTEVfQ09OU1QgSU5URkxPQVQgKiBjb25zdCBBQUNfUkVOQU1FKGZmX3NpbmVfd2luZG93cylbMTRdOworZXh0ZXJuIFNJTkVUQUJMRV9DT05TVCBJTlRGTE9BVCAqIGNvbnN0IEFBQ19SRU5BTUUoZmZfc2luZV93aW5kb3dzKVsxNl07CiAKICNlbmRpZiAvKiBBVkNPREVDX1NJTkVXSU5fSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zaW5ld2luX3RhYmxlZ2VuLmggYi9saWJhdmNvZGVjL3NpbmV3aW5fdGFibGVnZW4uaAppbmRleCA0NDMyMTM1Li4wZmEzNTYxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3NpbmV3aW5fdGFibGVnZW4uaAorKysgYi9saWJhdmNvZGVjL3NpbmV3aW5fdGFibGVnZW4uaApAQCAtMzEsNiArMzEsMTAgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKIAorI2lmICFVU0VfRklYRUQKK1NJTkVUQUJMRSggMTIwKTsKK1NJTkVUQUJMRSggOTYwKTsKKyNlbmRpZgogI2lmICFDT05GSUdfSEFSRENPREVEX1RBQkxFUwogU0lORVRBQkxFKCAgMzIpOwogU0lORVRBQkxFKCAgNjQpOwpAQCAtNTksNyArNjMsNyBAQAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIC8vIHVudXNlZAogICAgIEFBQ19SRU5BTUUoZmZfc2luZV8zMikgLCBBQUNfUkVOQU1FKGZmX3NpbmVfNjQpLCBBQUNfUkVOQU1FKGZmX3NpbmVfMTI4KSwKICAgICBBQUNfUkVOQU1FKGZmX3NpbmVfMjU2KSwgQUFDX1JFTkFNRShmZl9zaW5lXzUxMiksIEFBQ19SRU5BTUUoZmZfc2luZV8xMDI0KSwKLSAgICBBQUNfUkVOQU1FKGZmX3NpbmVfMjA0OCksIEFBQ19SRU5BTUUoZmZfc2luZV80MDk2KSwgQUFDX1JFTkFNRShmZl9zaW5lXzgxOTIpCisgICAgQUFDX1JFTkFNRShmZl9zaW5lXzIwNDgpLCBBQUNfUkVOQU1FKGZmX3NpbmVfNDA5NiksIEFBQ19SRU5BTUUoZmZfc2luZV84MTkyKSwKIH07CiAKIC8vIEdlbmVyYXRlIGEgc2luZSB3aW5kb3cuCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NpcHIuYyBiL2xpYmF2Y29kZWMvc2lwci5jCmluZGV4IDU5NTA5N2EuLjFiNmRlMjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc2lwci5jCisrKyBiL2xpYmF2Y29kZWMvc2lwci5jCkBAIC0yOCwxMSArMjgsMTEgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgorCiAjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgotCiAjaW5jbHVkZSAibHNwLmgiCiAjaW5jbHVkZSAiYWNlbHBfdmVjdG9ycy5oIgogI2luY2x1ZGUgImFjZWxwX3BpdGNoX2RlbGF5LmgiCkBAIC00OTQsNyArNDk0LDcgQEAKICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bW9kZSA9IE1PREVfNWswOwogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgIkludmFsaWQgYmxvY2tfYWxpZ246ICVkLiBNb2RlICVzIGd1ZXNzZWQgYmFzZWQgb24gYml0cmF0ZTogJSJQUklkNjQiXG4iLAotICAgICAgICAgICAgICAgYXZjdHgtPmJsb2NrX2FsaWduLCBtb2Rlc1tjdHgtPm1vZGVdLm1vZGVfbmFtZSwgKGludDY0X3QpYXZjdHgtPmJpdF9yYXRlKTsKKyAgICAgICAgICAgICAgIGF2Y3R4LT5ibG9ja19hbGlnbiwgbW9kZXNbY3R4LT5tb2RlXS5tb2RlX25hbWUsIGF2Y3R4LT5iaXRfcmF0ZSk7CiAgICAgfQogCiAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJNb2RlOiAlc1xuIiwgbW9kZXNbY3R4LT5tb2RlXS5tb2RlX25hbWUpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zaXByX3BhcnNlci5jIGIvbGliYXZjb2RlYy9zaXByX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYTI1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3NpcHJfcGFyc2VyLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBTaXByIGF1ZGlvIHBhcnNlcgorICovCisKKyNpbmNsdWRlICJwYXJzZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU2lwclBhcnNlckNvbnRleHR7CisgICAgUGFyc2VDb250ZXh0IHBjOworfSBTaXByUGFyc2VyQ29udGV4dDsKKworc3RhdGljIGludCBzaXByX3NwbGl0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgaW50IG5leHQ7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5ibG9ja19hbGlnbikgeworICAgIGNhc2UgMjA6CisgICAgY2FzZSAxOToKKyAgICBjYXNlIDI5OgorICAgIGNhc2UgMzc6IG5leHQgPSBhdmN0eC0+YmxvY2tfYWxpZ247IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICAgICAgKGF2Y3R4LT5iaXRfcmF0ZSA+IDEyMjAwKSBuZXh0ID0gMjA7CisgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA+IDc1MDAgKSBuZXh0ID0gMTk7CisgICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA+IDU3NTAgKSBuZXh0ID0gMjk7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gMzc7CisgICAgfQorCisgICAgcmV0dXJuIEZGTUlOKG5leHQsIGJ1Zl9zaXplKTsKK30KKworc3RhdGljIGludCBzaXByX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzMSwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipwb3V0YnVmLCBpbnQgKnBvdXRidWZfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBTaXByUGFyc2VyQ29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisgICAgUGFyc2VDb250ZXh0ICpwYyA9ICZzLT5wYzsKKyAgICBpbnQgbmV4dDsKKworICAgIG5leHQgPSBzaXByX3NwbGl0KGF2Y3R4LCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAoZmZfY29tYmluZV9mcmFtZShwYywgbmV4dCwgJmJ1ZiwgJmJ1Zl9zaXplKSA8IDApIHsKKyAgICAgICAgKnBvdXRidWYgPSBOVUxMOworICAgICAgICAqcG91dGJ1Zl9zaXplID0gMDsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBuZXh0OworfQorCitBVkNvZGVjUGFyc2VyIGZmX3NpcHJfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfU0lQUiB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTaXByUGFyc2VyQ29udGV4dCksCisgICAgLnBhcnNlcl9wYXJzZSAgID0gc2lwcl9wYXJzZSwKKyAgICAucGFyc2VyX2Nsb3NlICAgPSBmZl9wYXJzZV9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NtYWNrZXIuYyBiL2xpYmF2Y29kZWMvc21hY2tlci5jCmluZGV4IDQwMTRlOGQuLjYxZTMxNjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc21hY2tlci5jCisrKyBiL2xpYmF2Y29kZWMvc21hY2tlci5jCkBAIC0zMiwyMCArMzIsMjAgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgIm1hdGhvcHMuaCIKIAogI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCiAKICNkZWZpbmUgU01LVFJFRV9CSVRTIDkKICNkZWZpbmUgU01LX05PREUgMHg4MDAwMDAwMAogCi0vKgotICogRGVjb2RlciBjb250ZXh0Ci0gKi8KKyNkZWZpbmUgU01LVFJFRV9ERUNPREVfTUFYX1JFQ1VSU0lPTiAzMgorI2RlZmluZSBTTUtUUkVFX0RFQ09ERV9CSUdfTUFYX1JFQ1VSU0lPTiA1MDAKKwogdHlwZWRlZiBzdHJ1Y3QgU21hY2tWQ29udGV4dCB7CiAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwogICAgIEFWRnJhbWUgKnBpYzsKQEAgLTk3LDEwICs5NywxMSBAQAogICovCiBzdGF0aWMgaW50IHNtYWNrZXJfZGVjb2RlX3RyZWUoR2V0Qml0Q29udGV4dCAqZ2IsIEh1ZmZDb250ZXh0ICpoYywgdWludDMyX3QgcHJlZml4LCBpbnQgbGVuZ3RoKQogewotICAgIGlmKGxlbmd0aCA+IDMyIHx8IGxlbmd0aCA+IDMqU01LVFJFRV9CSVRTKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJsZW5ndGggdG9vIGxvbmdcbiIpOworICAgIGlmIChsZW5ndGggPiBTTUtUUkVFX0RFQ09ERV9NQVhfUkVDVVJTSU9OIHx8IGxlbmd0aCA+IDMgKiBTTUtUUkVFX0JJVFMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk1heGltdW0gdHJlZSByZWN1cnNpb24gbGV2ZWwgZXhjZWVkZWQuXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQorCiAgICAgaWYoIWdldF9iaXRzMShnYikpeyAvL0xlYWYKICAgICAgICAgaWYoaGMtPmN1cnJlbnQgPj0gaGMtPmxlbmd0aCl7CiAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVHJlZSBzaXplIGV4Y2VlZGVkIVxuIik7CkBAIC0xMzEsOCArMTMyLDE1IEBACiAvKioKICAqIERlY29kZSBoZWFkZXIgdHJlZQogICovCi1zdGF0aWMgaW50IHNtYWNrZXJfZGVjb2RlX2JpZ3RyZWUoR2V0Qml0Q29udGV4dCAqZ2IsIEh1ZmZDb250ZXh0ICpoYywgREJDdHggKmN0eCkKK3N0YXRpYyBpbnQgc21hY2tlcl9kZWNvZGVfYmlndHJlZShHZXRCaXRDb250ZXh0ICpnYiwgSHVmZkNvbnRleHQgKmhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCQ3R4ICpjdHgsIGludCBsZW5ndGgpCiB7CisgICAgLy8gTGFyZ2VyIGxlbmd0aCBjYW4gY2F1c2Ugc2VnbWVudGF0aW9uIGZhdWx0cyBkdWUgdG8gdG9vIGRlZXAgcmVjdXJzaW9uLgorICAgIGlmIChsZW5ndGggPiBTTUtUUkVFX0RFQ09ERV9CSUdfTUFYX1JFQ1VSU0lPTikgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTWF4aW11bSBiaWd0cmVlIHJlY3Vyc2lvbiBsZXZlbCBleGNlZWRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKICAgICBpZiAoaGMtPmN1cnJlbnQgKyAxID49IGhjLT5sZW5ndGgpIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlRyZWUgc2l6ZSBleGNlZWRlZCFcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTE2MSwxMiArMTY5LDEyIEBACiAgICAgICAgIGludCByID0gMCwgcl9uZXcsIHQ7CiAKICAgICAgICAgdCA9IGhjLT5jdXJyZW50Kys7Ci0gICAgICAgIHIgPSBzbWFja2VyX2RlY29kZV9iaWd0cmVlKGdiLCBoYywgY3R4KTsKKyAgICAgICAgciA9IHNtYWNrZXJfZGVjb2RlX2JpZ3RyZWUoZ2IsIGhjLCBjdHgsIGxlbmd0aCArIDEpOwogICAgICAgICBpZihyIDwgMCkKICAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICBoYy0+dmFsdWVzW3RdID0gU01LX05PREUgfCByOwogICAgICAgICByKys7Ci0gICAgICAgIHJfbmV3ID0gc21hY2tlcl9kZWNvZGVfYmlndHJlZShnYiwgaGMsIGN0eCk7CisgICAgICAgIHJfbmV3ID0gc21hY2tlcl9kZWNvZGVfYmlndHJlZShnYiwgaGMsIGN0eCwgbGVuZ3RoICsgMSk7CiAgICAgICAgIGlmIChyX25ldyA8IDApCiAgICAgICAgICAgICByZXR1cm4gcl9uZXc7CiAgICAgICAgIHJldHVybiByICsgcl9uZXc7CkBAIC0yNzcsOCArMjg1LDkgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBpZiAoc21hY2tlcl9kZWNvZGVfYmlndHJlZShnYiwgJmh1ZmYsICZjdHgpIDwgMCkKLSAgICAgICAgZXJyID0gLTE7CisgICAgcmVzID0gc21hY2tlcl9kZWNvZGVfYmlndHJlZShnYiwgJmh1ZmYsICZjdHgsIDApOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICBlcnIgPSByZXM7CiAgICAgc2tpcF9iaXRzMShnYik7CiAgICAgaWYoY3R4Lmxhc3RbMF0gPT0gLTEpIGN0eC5sYXN0WzBdID0gaHVmZi5jdXJyZW50Kys7CiAgICAgaWYoY3R4Lmxhc3RbMV0gPT0gLTEpIGN0eC5sYXN0WzFdID0gaHVmZi5jdXJyZW50Kys7CkBAIC01NDksMTIgKzU1OCw2IEBACiB9CiAKIAotCi0vKgotICoKLSAqIFVuaW5pdCBzbWFja2VyIGRlY29kZXIKLSAqCi0gKi8KIHN0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBTbWFja1ZDb250ZXh0ICogY29uc3Qgc21rID0gYXZjdHgtPnByaXZfZGF0YTsKQEAgLTU3MCwxMSArNTczLDYgQEAKIH0KIAogCi0vKgotICoKLSAqIEluaXQgc21hY2tlciBkZWNvZGVyCi0gKgotICovCiBzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIFNtYWNrVkNvbnRleHQgKiBjb25zdCBjID0gYXZjdHgtPnByaXZfZGF0YTsKQEAgLTYwOSw3ICs2MDcsNyBAQAogewogICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPCAxIHx8IGF2Y3R4LT5jaGFubmVscyA+IDIpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBjaGFubmVsc1xuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQgPSAoYXZjdHgtPmNoYW5uZWxzPT0yKSA/IEFWX0NIX0xBWU9VVF9TVEVSRU8gOiBBVl9DSF9MQVlPVVRfTU9OTzsKICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gOCA/IEFWX1NBTVBMRV9GTVRfVTggOiBBVl9TQU1QTEVfRk1UX1MxNjsKQEAgLTYzOSw3ICs2MzcsNyBAQAogCiAgICAgaWYgKGJ1Zl9zaXplIDw9IDQpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJwYWNrZXQgaXMgdG9vIHNtYWxsXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgdW5wX3NpemUgPSBBVl9STDMyKGJ1Zik7CkBAIC02NjEsMTggKzY1OSwxOSBAQAogICAgIGJpdHMgPSBnZXRfYml0czEoJmdiKTsKICAgICBpZiAoc3RlcmVvIF4gKGF2Y3R4LT5jaGFubmVscyAhPSAxKSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNoYW5uZWxzIG1pc21hdGNoXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogICAgIGlmIChiaXRzID09IChhdmN0eC0+c2FtcGxlX2ZtdCA9PSBBVl9TQU1QTEVfRk1UX1U4KSkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInNhbXBsZSBmb3JtYXQgbWlzbWF0Y2hcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKICAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLwogICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gdW5wX3NpemUgLyAoYXZjdHgtPmNoYW5uZWxzICogKGJpdHMgKyAxKSk7CiAgICAgaWYgKHVucF9zaXplICUgKGF2Y3R4LT5jaGFubmVscyAqIChiaXRzICsgMSkpKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5wX3NpemUgJWQgaXMgb2RkXG4iLCB1bnBfc2l6ZSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlRoZSBidWZmZXIgZG9lcyBub3QgY29udGFpbiBhbiBpbnRlZ2VyIG51bWJlciBvZiBzYW1wbGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NtYy5jIGIvbGliYXZjb2RlYy9zbWMuYwppbmRleCBhNDIzYzQ1Li4zY2I0ODM0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3NtYy5jCisrKyBiL2xpYmF2Y29kZWMvc21jLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogUXVpY2t0aW1lIEdyYXBoaWNzIChTTUMpIFZpZGVvIERlY29kZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtOTIsNyArOTIsNyBAQAogICAgIHVuc2lnbmVkIGludCBjb2xvcl9mbGFnc19iOwogICAgIHVuc2lnbmVkIGludCBmbGFnX21hc2s7CiAKLSAgICB1bnNpZ25lZCBjaGFyICpwaXhlbHMgPSBzLT5mcmFtZS0+ZGF0YVswXTsKKyAgICB1bnNpZ25lZCBjaGFyICogY29uc3QgcGl4ZWxzID0gcy0+ZnJhbWUtPmRhdGFbMF07CiAKICAgICBpbnQgaW1hZ2Vfc2l6ZSA9IGhlaWdodCAqIHMtPmZyYW1lLT5saW5lc2l6ZVswXTsKICAgICBpbnQgcm93X3B0ciA9IDA7CkBAIC0xMzIsNiArMTMyLDEwIEBACiAgICAgICAgICAgICAgICAgcm93X3B0ciwgaW1hZ2Vfc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCAxKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0IHRvbyBzbWFsbFxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KIAogICAgICAgICBvcGNvZGUgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmcy0+Z2IpOwogICAgICAgICBzd2l0Y2ggKG9wY29kZSAmIDB4RjApIHsKQEAgLTQzMSwxNyArNDM1LDI0IEBACiAgICAgY29uc3QgdWludDhfdCAqYnVmID0gYXZwa3QtPmRhdGE7CiAgICAgaW50IGJ1Zl9zaXplID0gYXZwa3QtPnNpemU7CiAgICAgU21jQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOworICAgIGludCBwYWxfc2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShhdnBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgJnBhbF9zaXplKTsKICAgICBpbnQgcmV0OworICAgIGludCB0b3RhbF9ibG9ja3MgPSAoKHMtPmF2Y3R4LT53aWR0aCArIDMpIC8gNCkgKiAoKHMtPmF2Y3R4LT5oZWlnaHQgKyAzKSAvIDQpOworCisgICAgaWYgKHRvdGFsX2Jsb2NrcyAvIDEwMjQgPiBhdnBrdC0+c2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBieXRlc3RyZWFtMl9pbml0KCZzLT5nYiwgYnVmLCBidWZfc2l6ZSk7CiAKICAgICBpZiAoKHJldCA9IGZmX3JlZ2V0X2J1ZmZlcihhdmN0eCwgcy0+ZnJhbWUpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICBpZiAocGFsKSB7CisgICAgaWYgKHBhbCAmJiBwYWxfc2l6ZSA9PSBBVlBBTEVUVEVfU0laRSkgewogICAgICAgICBzLT5mcmFtZS0+cGFsZXR0ZV9oYXNfY2hhbmdlZCA9IDE7CiAgICAgICAgIG1lbWNweShzLT5wYWwsIHBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgIH0gZWxzZSBpZiAocGFsKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGFsZXR0ZSBzaXplICVkIGlzIHdyb25nXG4iLCBwYWxfc2l6ZSk7CiAgICAgfQogCiAgICAgc21jX2RlY29kZV9zdHJlYW0ocyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NtdmpwZWdkZWMuYyBiL2xpYmF2Y29kZWMvc212anBlZ2RlYy5jCmluZGV4IDkwNTdlODYuLjdlYTgyZWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc212anBlZ2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvc212anBlZ2RlYy5jCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgICAgICBzcmNfbGluZXNpemVzW2ldLCBoLCBubGluZXMpOwogICAgIH0KICAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8Ci0gICAgICAgIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkKKyAgICAgICAgZGVzYy0+ZmxhZ3MgJiBGRl9QU0VVRE9QQUwpCiAgICAgICAgIGRzdF9kYXRhWzFdID0gc3JjX2RhdGFbMV07CiB9CiAKQEAgLTE1Miw2ICsxNTIsMTAgQEAKIAogICAgIGN1cl9mcmFtZSA9IGF2cGt0LT5wdHMgJSBzLT5mcmFtZXNfcGVyX2pwZWc7CiAKKyAgICAvKiBjdXJfZnJhbWUgaXMgbGF0ZXIgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGJ1ZmZlciBvZmZzZXQsIHNvIGl0IG11c3RuJ3QgYmUgbmVnYXRpdmUgKi8KKyAgICBpZiAoY3VyX2ZyYW1lIDwgMCkKKyAgICAgICAgY3VyX2ZyYW1lICs9IHMtPmZyYW1lc19wZXJfanBlZzsKKwogICAgIC8qIEFyZSB3ZSBhdCB0aGUgc3RhcnQgb2YgYSBibG9jaz8gKi8KICAgICBpZiAoIWN1cl9mcmFtZSkgewogICAgICAgICBhdl9mcmFtZV91bnJlZihtanBlZ19kYXRhKTsKQEAgLTE4OSwxNiArMTkzLDE3IEBACiAgICAgICAgIHMtPnBpY3R1cmVbMV0tPndpZHRoICAgICAgICAgPSBhdmN0eC0+d2lkdGg7CiAgICAgICAgIHMtPnBpY3R1cmVbMV0tPmhlaWdodCAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OwogICAgICAgICBzLT5waWN0dXJlWzFdLT5mb3JtYXQgICAgICAgID0gYXZjdHgtPnBpeF9mbXQ7Ci0gICAgICAgIC8qIGZmX2luaXRfYnVmZmVyX2luZm8oYXZjdHgsICZzLT5waWN0dXJlWzFdKTsgKi8KICAgICAgICAgc212X2ltZ19wbnQocy0+cGljdHVyZVsxXS0+ZGF0YSwgbWpwZWdfZGF0YS0+ZGF0YSwgbWpwZWdfZGF0YS0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIGN1cl9mcmFtZSk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBVl9OVU1fREFUQV9QT0lOVEVSUzsgaSsrKQogICAgICAgICAgICAgcy0+cGljdHVyZVsxXS0+bGluZXNpemVbaV0gPSBtanBlZ19kYXRhLT5saW5lc2l6ZVtpXTsKIAogICAgICAgICByZXQgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcy0+cGljdHVyZVsxXSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKIH0KIAogc3RhdGljIGNvbnN0IEFWQ2xhc3Mgc212anBlZ2RlY19jbGFzcyA9IHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvc25vdy5oIGIvbGliYXZjb2RlYy9zbm93LmgKaW5kZXggZDEyNmQ2OC4uNDFhM2JlZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9zbm93LmgKKysrIGIvbGliYXZjb2RlYy9zbm93LmgKQEAgLTMyLDEwICszMiwxMSBAQAogI2luY2x1ZGUgInJhbmdlY29kZXIuaCIKICNpbmNsdWRlICJtYXRob3BzLmgiCiAKLSNkZWZpbmUgRkZfTVBWX09GRlNFVCh4KSAob2Zmc2V0b2YoTXBlZ0VuY0NvbnRleHQsIHgpICsgb2Zmc2V0b2YoU25vd0NvbnRleHQsIG0pKQogI2luY2x1ZGUgIm1wZWd2aWRlby5oIgogI2luY2x1ZGUgImgyNjRxcGVsLmgiCiAKKyNkZWZpbmUgRkZfTUVfSVRFUiAzCisKICNkZWZpbmUgTUlEX1NUQVRFIDEyOAogCiAjZGVmaW5lIE1BWF9QTEFORVMgNApAQCAtNDgsMTQgKzQ5LDE0IEBACiAjZGVmaW5lIExPRzJfT0JNQ19NQVggOAogI2RlZmluZSBPQk1DX01BWCAoMTw8KExPRzJfT0JNQ19NQVgpKQogdHlwZWRlZiBzdHJ1Y3QgQmxvY2tOb2RlewotICAgIGludDE2X3QgbXg7Ci0gICAgaW50MTZfdCBteTsKLSAgICB1aW50OF90IHJlZjsKLSAgICB1aW50OF90IGNvbG9yWzNdOwotICAgIHVpbnQ4X3QgdHlwZTsKKyAgICBpbnQxNl90IG14OyAgICAgICAgICAgICAgICAgLy8vPCBNb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBYLCBzZWUgbXZfc2NhbGUKKyAgICBpbnQxNl90IG15OyAgICAgICAgICAgICAgICAgLy8vPCBNb3Rpb24gdmVjdG9yIGNvbXBvbmVudCBZLCBzZWUgbXZfc2NhbGUKKyAgICB1aW50OF90IHJlZjsgICAgICAgICAgICAgICAgLy8vPCBSZWZlcmVuY2UgZnJhbWUgaW5kZXgKKyAgICB1aW50OF90IGNvbG9yWzNdOyAgICAgICAgICAgLy8vPCBDb2xvciBmb3IgaW50cmEKKyAgICB1aW50OF90IHR5cGU7ICAgICAgICAgICAgICAgLy8vPCBCaXRmaWVsZCBvZiBCTE9DS18qCiAvLyNkZWZpbmUgVFlQRV9TUExJVCAgICAxCi0jZGVmaW5lIEJMT0NLX0lOVFJBICAgMQotI2RlZmluZSBCTE9DS19PUFQgICAgIDIKKyNkZWZpbmUgQkxPQ0tfSU5UUkEgICAxICAgICAgICAgLy8vPCBJbnRyYSBibG9jaywgaW50ZXIgb3RoZXJ3aXNlCisjZGVmaW5lIEJMT0NLX09QVCAgICAgMiAgICAgICAgIC8vLzwgQmxvY2sgbmVlZHMgbm8gY2hlY2tzIGluIHRoaXMgcm91bmQgb2YgaXRlcmF0aXZlIG1vdGlvbiBlc3RpYXRpb24KIC8vI2RlZmluZSBUWVBFX05PQ09MT1IgIDQKICAgICB1aW50OF90IGxldmVsOyAvL0ZJWE1FIG1lcmdlIGludG8gdHlwZT8KIH1CbG9ja05vZGU7CkBAIC0yNTAsMzAgKzI1MSw2IEBACiAvKiBjb21tb24gaW5saW5lIGZ1bmN0aW9ucyAqLwogLy9YWFggZG91YmxlY2hlY2sgYWxsIG9mIHRoZW0gc2hvdWxkIHN0YXkgaW5saW5lZAogCi1zdGF0aWMgaW5saW5lIHZvaWQgc25vd19zZXRfYmxvY2tzKFNub3dDb250ZXh0ICpzLCBpbnQgbGV2ZWwsIGludCB4LCBpbnQgeSwgaW50IGwsIGludCBjYiwgaW50IGNyLCBpbnQgbXgsIGludCBteSwgaW50IHJlZiwgaW50IHR5cGUpewotICAgIGNvbnN0IGludCB3PSBzLT5iX3dpZHRoIDw8IHMtPmJsb2NrX21heF9kZXB0aDsKLSAgICBjb25zdCBpbnQgcmVtX2RlcHRoPSBzLT5ibG9ja19tYXhfZGVwdGggLSBsZXZlbDsKLSAgICBjb25zdCBpbnQgaW5kZXg9ICh4ICsgeSp3KSA8PCByZW1fZGVwdGg7Ci0gICAgY29uc3QgaW50IGJsb2NrX3c9IDE8PHJlbV9kZXB0aDsKLSAgICBCbG9ja05vZGUgYmxvY2s7Ci0gICAgaW50IGksajsKLQotICAgIGJsb2NrLmNvbG9yWzBdPSBsOwotICAgIGJsb2NrLmNvbG9yWzFdPSBjYjsKLSAgICBibG9jay5jb2xvclsyXT0gY3I7Ci0gICAgYmxvY2subXg9IG14OwotICAgIGJsb2NrLm15PSBteTsKLSAgICBibG9jay5yZWY9IHJlZjsKLSAgICBibG9jay50eXBlPSB0eXBlOwotICAgIGJsb2NrLmxldmVsPSBsZXZlbDsKLQotICAgIGZvcihqPTA7IGo8YmxvY2tfdzsgaisrKXsKLSAgICAgICAgZm9yKGk9MDsgaTxibG9ja193OyBpKyspewotICAgICAgICAgICAgcy0+YmxvY2tbaW5kZXggKyBpICsgaip3XT0gYmxvY2s7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBwcmVkX212KFNub3dDb250ZXh0ICpzLCBpbnQgKm14LCBpbnQgKm15LCBpbnQgcmVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tOb2RlICpsZWZ0LCBjb25zdCBCbG9ja05vZGUgKnRvcCwgY29uc3QgQmxvY2tOb2RlICp0cil7CiAgICAgaWYocy0+cmVmX2ZyYW1lcyA9PSAxKXsKQEAgLTU2NCw3ICs1NDEsOCBAQAogICAgIGlmKGdldF9yYWMoYywgc3RhdGUrMCkpCiAgICAgICAgIHJldHVybiAwOwogICAgIGVsc2V7Ci0gICAgICAgIGludCBpLCBlLCBhOworICAgICAgICBpbnQgaSwgZTsKKyAgICAgICAgdW5zaWduZWQgYTsKICAgICAgICAgZT0gMDsKICAgICAgICAgd2hpbGUoZ2V0X3JhYyhjLCBzdGF0ZSsxICsgRkZNSU4oZSw5KSkpeyAvLzEuLjEwCiAgICAgICAgICAgICBlKys7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Nub3dfZHd0LmggYi9saWJhdmNvZGVjL3Nub3dfZHd0LmgKaW5kZXggZTJkNzUyOC4uZWU2OTlkZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9zbm93X2R3dC5oCisrKyBiL2xpYmF2Y29kZWMvc25vd19kd3QuaApAQCAtMjQsNiArMjQsOCBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCitzdHJ1Y3QgTXBlZ0VuY0NvbnRleHQ7CisKIHR5cGVkZWYgaW50IERXVEVMRU07CiB0eXBlZGVmIHNob3J0IElEV1RFTEVNOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Nub3dkZWMuYyBiL2xpYmF2Y29kZWMvc25vd2RlYy5jCmluZGV4IDA0MmFlY2IuLjU5YmQyNGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc25vd2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvc25vd2RlYy5jCkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgICAgdiA9IGItPnhfY29lZmZbbmV3X2luZGV4XS5jb2VmZjsKICAgICAgICAgeCA9IGItPnhfY29lZmZbbmV3X2luZGV4KytdLng7CiAgICAgICAgIHdoaWxlKHggPCB3KXsKLSAgICAgICAgICAgIHJlZ2lzdGVyIGludCB0PSAoICh2Pj4xKSpxbXVsICsgcWFkZCk+PlFFWFBTSElGVDsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGludCB0PSAoaW50KSggKHY+PjEpKih1bnNpZ25lZClxbXVsICsgcWFkZCk+PlFFWFBTSElGVDsKICAgICAgICAgICAgIHJlZ2lzdGVyIGludCB1PSAtKHYmMSk7CiAgICAgICAgICAgICBsaW5lW3hdID0gKHRedSkgLSB1OwogCkBAIC0xODMsMTMgKzE4MywyMiBAQAogICAgICAgICBpbnQgbXlfY29udGV4dD0gYXZfbG9nMigyKkZGQUJTKGxlZnQtPm15IC0gdG9wLT5teSkpICsgMCphdl9sb2cyKDIqRkZBQlModHItPm15IC0gdG9wLT5teSkpOwogCiAgICAgICAgIHR5cGU9IGdldF9yYWMoJnMtPmMsICZzLT5ibG9ja19zdGF0ZVsxICsgbGVmdC0+dHlwZSArIHRvcC0+dHlwZV0pID8gQkxPQ0tfSU5UUkEgOiAwOwotCiAgICAgICAgIGlmKHR5cGUpeworICAgICAgICAgICAgaW50IGxkLCBjYmQsIGNyZDsKICAgICAgICAgICAgIHByZWRfbXYocywgJm14LCAmbXksIDAsIGxlZnQsIHRvcCwgdHIpOwotICAgICAgICAgICAgbCArPSBnZXRfc3ltYm9sKCZzLT5jLCAmcy0+YmxvY2tfc3RhdGVbMzJdLCAxKTsKKyAgICAgICAgICAgIGxkID0gZ2V0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzMyXSwgMSk7CisgICAgICAgICAgICBpZiAobGQgPCAtMjU1IHx8IGxkID4gMjU1KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsICs9IGxkOwogICAgICAgICAgICAgaWYgKHMtPm5iX3BsYW5lcyA+IDIpIHsKLSAgICAgICAgICAgICAgICBjYis9IGdldF9zeW1ib2woJnMtPmMsICZzLT5ibG9ja19zdGF0ZVs2NF0sIDEpOwotICAgICAgICAgICAgICAgIGNyKz0gZ2V0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzk2XSwgMSk7CisgICAgICAgICAgICAgICAgY2JkID0gZ2V0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzY0XSwgMSk7CisgICAgICAgICAgICAgICAgY3JkID0gZ2V0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzk2XSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKGNiZCA8IC0yNTUgfHwgY2JkID4gMjU1IHx8IGNyZCA8IC0yNTUgfHwgY3JkID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYiArPSBjYmQ7CisgICAgICAgICAgICAgICAgY3IgKz0gY3JkOwogICAgICAgICAgICAgfQogICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgIGlmKHMtPnJlZl9mcmFtZXMgPiAxKQpAQCAtMTk5LDggKzIwOCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwcmVkX212KHMsICZteCwgJm15LCByZWYsIGxlZnQsIHRvcCwgdHIpOwotICAgICAgICAgICAgbXgrPSBnZXRfc3ltYm9sKCZzLT5jLCAmcy0+YmxvY2tfc3RhdGVbMTI4ICsgMzIqKG14X2NvbnRleHQgKyAxNiohIXJlZildLCAxKTsKLSAgICAgICAgICAgIG15Kz0gZ2V0X3N5bWJvbCgmcy0+YywgJnMtPmJsb2NrX3N0YXRlWzEyOCArIDMyKihteV9jb250ZXh0ICsgMTYqISFyZWYpXSwgMSk7CisgICAgICAgICAgICBteCs9ICh1bnNpZ25lZClnZXRfc3ltYm9sKCZzLT5jLCAmcy0+YmxvY2tfc3RhdGVbMTI4ICsgMzIqKG14X2NvbnRleHQgKyAxNiohIXJlZildLCAxKTsKKyAgICAgICAgICAgIG15Kz0gKHVuc2lnbmVkKWdldF9zeW1ib2woJnMtPmMsICZzLT5ibG9ja19zdGF0ZVsxMjggKyAzMioobXlfY29udGV4dCArIDE2KiEhcmVmKV0sIDEpOwogICAgICAgICB9CiAgICAgICAgIHNldF9ibG9ja3MocywgbGV2ZWwsIHgsIHksIGwsIGNiLCBjciwgbXgsIG15LCByZWYsIHR5cGUpOwogICAgIH1lbHNlewpAQCAtMjI4LDkgKzIzNyw5IEBACiAgICAgICAgIGZvcih4PTA7IHg8dzsgeCsrKXsKICAgICAgICAgICAgIGludCBpPSBsaW5lW3hdOwogICAgICAgICAgICAgaWYoaTwwKXsKLSAgICAgICAgICAgICAgICBsaW5lW3hdPSAtKCgtaSpxbXVsICsgcWFkZCk+PihRRVhQU0hJRlQpKTsgLy9GSVhNRSB0cnkgZGlmZmVyZW50IGJpYXMKKyAgICAgICAgICAgICAgICBsaW5lW3hdPSAtKCgtaSoodW5zaWduZWQpcW11bCArIHFhZGQpPj4oUUVYUFNISUZUKSk7IC8vRklYTUUgdHJ5IGRpZmZlcmVudCBiaWFzCiAgICAgICAgICAgICB9ZWxzZSBpZihpPjApewotICAgICAgICAgICAgICAgIGxpbmVbeF09ICAoKCBpKnFtdWwgKyBxYWRkKT4+KFFFWFBTSElGVCkpOworICAgICAgICAgICAgICAgIGxpbmVbeF09ICAoKCBpKih1bnNpZ25lZClxbXVsICsgcWFkZCk+PihRRVhQU0hJRlQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM1NCw5ICszNjMsMTAgQEAKICAgICAgICAgICAgICAgICBpbnQgaHRhcHMsIGksIHN1bT0wOwogICAgICAgICAgICAgICAgIFBsYW5lICpwPSAmcy0+cGxhbmVbcGxhbmVfaW5kZXhdOwogICAgICAgICAgICAgICAgIHAtPmRpYWdfbWM9IGdldF9yYWMoJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSk7Ci0gICAgICAgICAgICAgICAgaHRhcHM9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMCkqMiArIDI7Ci0gICAgICAgICAgICAgICAgaWYoKHVuc2lnbmVkKWh0YXBzID4gSFRBUFNfTUFYIHx8IGh0YXBzPT0wKQorICAgICAgICAgICAgICAgIGh0YXBzPSBnZXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIDApOworICAgICAgICAgICAgICAgIGlmKCh1bnNpZ25lZClodGFwcyA+PSBIVEFQU19NQVgvMiAtIDEpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGh0YXBzID0gaHRhcHMqMiArIDI7CiAgICAgICAgICAgICAgICAgcC0+aHRhcHM9IGh0YXBzOwogICAgICAgICAgICAgICAgIGZvcihpPSBodGFwcy8yOyBpOyBpLS0pewogICAgICAgICAgICAgICAgICAgICBwLT5oY29lZmZbaV09IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMCkgKiAoMS0yKihpJjEpKTsKQEAgLTM3NCw3ICszODQsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUrPSBnZXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIDEpOworICAgIHMtPnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlKz0gKHVuc2lnbmVkKWdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMSk7CiAgICAgaWYocy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUgPiAxVSl7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUgJWQgbm90IHN1cHBvcnRlZFxuIiwgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTM4NCwxNSArMzk0LDI1IEBACiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50ICVkIHRvbyBsYXJnZSBmb3Igc2l6ZVxuIiwgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50KTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQorICAgIGlmIChzLT5hdmN0eC0+d2lkdGggPiA2NTUzNi00KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiV2lkdGggJWQgaXMgdG9vIGxhcmdlXG4iLCBzLT5hdmN0eC0+d2lkdGgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CiAKIAotICAgIHMtPnFsb2cgICAgICAgICAgICs9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMSk7Ci0gICAgcy0+bXZfc2NhbGUgICAgICAgKz0gZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAxKTsKLSAgICBzLT5xYmlhcyAgICAgICAgICArPSBnZXRfc3ltYm9sKCZzLT5jLCBzLT5oZWFkZXJfc3RhdGUsIDEpOwotICAgIHMtPmJsb2NrX21heF9kZXB0aCs9IGdldF9zeW1ib2woJnMtPmMsIHMtPmhlYWRlcl9zdGF0ZSwgMSk7Ci0gICAgaWYocy0+YmxvY2tfbWF4X2RlcHRoID4gMSB8fCBzLT5ibG9ja19tYXhfZGVwdGggPCAwKXsKKyAgICBzLT5xbG9nICAgICAgICAgICArPSAodW5zaWduZWQpZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAxKTsKKyAgICBzLT5tdl9zY2FsZSAgICAgICArPSAodW5zaWduZWQpZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAxKTsKKyAgICBzLT5xYmlhcyAgICAgICAgICArPSAodW5zaWduZWQpZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAxKTsKKyAgICBzLT5ibG9ja19tYXhfZGVwdGgrPSAodW5zaWduZWQpZ2V0X3N5bWJvbCgmcy0+Yywgcy0+aGVhZGVyX3N0YXRlLCAxKTsKKyAgICBpZihzLT5ibG9ja19tYXhfZGVwdGggPiAxIHx8IHMtPmJsb2NrX21heF9kZXB0aCA8IDAgfHwgcy0+bXZfc2NhbGUgPiAyNTZVKXsKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJibG9ja19tYXhfZGVwdGg9ICVkIGlzIHRvbyBsYXJnZVxuIiwgcy0+YmxvY2tfbWF4X2RlcHRoKTsKICAgICAgICAgcy0+YmxvY2tfbWF4X2RlcHRoPSAwOworICAgICAgICBzLT5tdl9zY2FsZSA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoRkZBQlMocy0+cWJpYXMpID4gMTI3KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicWJpYXMgJWQgaXMgdG9vIGxhcmdlXG4iLCBzLT5xYmlhcyk7CisgICAgICAgIHMtPnFiaWFzID0gMDsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCkBAIC00MTgsNiArNDM4LDggQEAKIAogICAgIGZvcih5PTA7IHk8aDsgeSsrKXsKICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspeworICAgICAgICAgICAgaWYgKHMtPmMuYnl0ZXN0cmVhbSA+PSBzLT5jLmJ5dGVzdHJlYW1fZW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgaWYgKChyZXMgPSBkZWNvZGVfcV9icmFuY2gocywgMCwgeCwgeSkpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CkBAIC01MDcsMTQgKzUyOSwxMiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgewogICAgICAgICBmb3IobGV2ZWw9MDsgbGV2ZWw8cy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50OyBsZXZlbCsrKXsKICAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDEgOiAwOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKICAgICAgICAgICAgICAgICBTdWJCYW5kICpiPSAmcC0+YmFuZFtsZXZlbF1bb3JpZW50YXRpb25dOwogICAgICAgICAgICAgICAgIHVucGFja19jb2VmZnMocywgYiwgYi0+cGFyZW50LCBvcmllbnRhdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgfQogCiAgICAgICAgIHsKICAgICAgICAgY29uc3QgaW50IG1iX2g9IHMtPmJfaGVpZ2h0IDw8IHMtPmJsb2NrX21heF9kZXB0aDsKQEAgLTU3Nyw3ICs1OTcsNyBAQAogICAgICAgICAgICAgICAgIGZvcig7IHlxPHNsaWNlX2ggJiYgeXE8aDsgeXErKyl7CiAgICAgICAgICAgICAgICAgICAgIElEV1RFTEVNICogbGluZSA9IHNsaWNlX2J1ZmZlcl9nZXRfbGluZSgmcy0+c2IsIHlxKTsKICAgICAgICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZVt4XSA8PD0gRlJBQ19CSVRTOworICAgICAgICAgICAgICAgICAgICAgICAgbGluZVt4XSAqPSAxPDxGUkFDX0JJVFM7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Nub3dlbmMuYyBiL2xpYmF2Y29kZWMvc25vd2VuYy5jCmluZGV4IGIxZDE3N2QuLjYxYTY1OGYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc25vd2VuYy5jCisrKyBiL2xpYmF2Y29kZWMvc25vd2VuYy5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAic25vd19kd3QuaCIKQEAgLTMzLDggKzM0LDYgQEAKICNpbmNsdWRlICJtcGVndmlkZW8uaCIKICNpbmNsdWRlICJoMjYzLmgiCiAKLSNkZWZpbmUgRkZfTUVfSVRFUiA1MAotCiBzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIFNub3dDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKQEAgLTUyLDE0ICs1MSw4IEBACiAgICAgICAgJiYgKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKQogICAgICAgICYmIGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSA9PSAwKXsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGUgOS83IHdhdmVsZXQgaXMgaW5jb21wYXRpYmxlIHdpdGggbG9zc2xlc3MgbW9kZS5cbiIpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgaWYgKGF2Y3R4LT5tZV9tZXRob2QgPT0gTUVfSVRFUikKLSAgICAgICAgcy0+bW90aW9uX2VzdCA9IEZGX01FX0lURVI7Ci1GRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgogCiAgICAgcy0+c3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGU9IHMtPnByZWQ7IC8vRklYTUUgYWRkIGRlY29ycmVsYXRvciB0eXBlIHIgdHJhbnNmb3JtX3R5cGUKIApAQCAtODYsNiArNzksOCBAQAogCiAgICAgcy0+bS5hdmN0eCAgID0gYXZjdHg7CiAgICAgcy0+bS5iaXRfcmF0ZT0gYXZjdHgtPmJpdF9yYXRlOworICAgIHMtPm0ubG1pbiAgICA9IGF2Y3R4LT5tYl9sbWluOworICAgIHMtPm0ubG1heCAgICA9IGF2Y3R4LT5tYl9sbWF4OwogCiAgICAgcy0+bS5tZS50ZW1wICAgICAgPQogICAgIHMtPm0ubWUuc2NyYXRjaHBhZD0gYXZfbWFsbG9jel9hcnJheSgoYXZjdHgtPndpZHRoKzY0KSwgMioxNioyKnNpemVvZih1aW50OF90KSk7CkBAIC0xMDYsMTEgKzEwMSwxMiBAQAogICAgICAgICBpZiAoIWF2Y3R4LT5zdGF0c19vdXQpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KLSAgICBpZigoYXZjdHgtPmZsYWdzJkFWX0NPREVDX0ZMQUdfUEFTUzIpIHx8ICEoYXZjdHgtPmZsYWdzJkNPREVDX0ZMQUdfUVNDQUxFKSl7Ci0gICAgICAgIGlmKGZmX3JhdGVfY29udHJvbF9pbml0KCZzLT5tKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgaWYoKGF2Y3R4LT5mbGFncyZBVl9DT0RFQ19GTEFHX1BBU1MyKSB8fCAhKGF2Y3R4LT5mbGFncyZBVl9DT0RFQ19GTEFHX1FTQ0FMRSkpeworICAgICAgICByZXQgPSBmZl9yYXRlX2NvbnRyb2xfaW5pdCgmcy0+bSk7CisgICAgICAgIGlmKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSAgICBzLT5wYXNzMV9yYz0gIShhdmN0eC0+ZmxhZ3MgJiAoQVZfQ09ERUNfRkxBR19RU0NBTEV8Q09ERUNfRkxBR19QQVNTMikpOworICAgIHMtPnBhc3MxX3JjPSAhKGF2Y3R4LT5mbGFncyAmIChBVl9DT0RFQ19GTEFHX1FTQ0FMRXxBVl9DT0RFQ19GTEFHX1BBU1MyKSk7CiAKICAgICBzd2l0Y2goYXZjdHgtPnBpeF9mbXQpewogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgpAQCAtMTMwLDkgKzEyNiwxNSBAQAogICAgICAgICBicmVhazsqLwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGl4ZWwgZm9ybWF0IG5vdCBzdXBwb3J0ZWRcbiIpOwotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9Ci0gICAgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZzLT5jaHJvbWFfaF9zaGlmdCwgJnMtPmNocm9tYV92X3NoaWZ0KTsKKworICAgIHJldCA9IGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LCAmcy0+Y2hyb21hX2hfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmNocm9tYV92X3NoaWZ0KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicGl4ZWwgZm9ybWF0IGludmFsaWQgb3IgdW5rbm93blxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCiAgICAgZmZfc2V0X2NtcCgmcy0+bWVjYywgcy0+bWVjYy5tZV9jbXAsIHMtPmF2Y3R4LT5tZV9jbXApOwogICAgIGZmX3NldF9jbXAoJnMtPm1lY2MsIHMtPm1lY2MubWVfc3ViX2NtcCwgcy0+YXZjdHgtPm1lX3N1Yl9jbXApOwpAQCAtMTc3LDcgKzE3OSw3IEBACiBzdGF0aWMgaW50IHBpeF9ub3JtMSh1aW50OF90ICogcGl4LCBpbnQgbGluZV9zaXplLCBpbnQgdykKIHsKICAgICBpbnQgcywgaSwgajsKLSAgICB1aW50MzJfdCAqc3EgPSBmZl9zcXVhcmVfdGFiICsgMjU2OworICAgIGNvbnN0IHVpbnQzMl90ICpzcSA9IGZmX3NxdWFyZV90YWIgKyAyNTY7CiAKICAgICBzID0gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgdzsgaSsrKSB7CkBAIC04MzMsNyArODM1LDcgQEAKICAgICAgICAgZm9yKHk9MDsgeTxoOyB5KyspewogICAgICAgICAgICAgaWYocy0+Yy5ieXRlc3RyZWFtX2VuZCAtIHMtPmMuYnl0ZXN0cmVhbSA8IHcqNDApewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZW5jb2RlZCBmcmFtZSB0b28gbGFyZ2VcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yKHg9MDsgeDx3OyB4KyspewogICAgICAgICAgICAgICAgIGludCB2LCBwPTA7CkBAIC0xNjIxLDExICsxNjIzLDcgQEAKICAgICAgICAgcy0+bGFtYmRhID0gMDsKICAgICB9Ly9lbHNlIGtlZXAgcHJldmlvdXMgZnJhbWUncyBxbG9nIHVudGlsIGFmdGVyIG1vdGlvbiBlc3RpbWF0aW9uCiAKLSAgICBpZiAocy0+Y3VycmVudF9waWN0dXJlLT5kYXRhWzBdCi0jaWYgRkZfQVBJX0VNVV9FREdFCi0gICAgICAgICYmICEocy0+YXZjdHgtPmZsYWdzJkNPREVDX0ZMQUdfRU1VX0VER0UpCi0jZW5kaWYKLSAgICAgICAgKSB7CisgICAgaWYgKHMtPmN1cnJlbnRfcGljdHVyZS0+ZGF0YVswXSkgewogICAgICAgICBpbnQgdyA9IHMtPmF2Y3R4LT53aWR0aDsKICAgICAgICAgaW50IGggPSBzLT5hdmN0eC0+aGVpZ2h0OwogCkBAIC0xNjQwLDExICsxNjM4LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUtPmxpbmVzaXplWzJdLCB3Pj5zLT5jaHJvbWFfaF9zaGlmdCwgaD4+cy0+Y2hyb21hX3Zfc2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFREdFX1dJRFRIPj5zLT5jaHJvbWFfaF9zaGlmdCwgRURHRV9XSURUSD4+cy0+Y2hyb21hX3Zfc2hpZnQsIEVER0VfVE9QIHwgRURHRV9CT1RUT00pOwogICAgICAgICB9CisgICAgICAgIGVtbXNfYygpOwogICAgIH0KIAogICAgIGZmX3Nub3dfZnJhbWVfc3RhcnQocyk7CisjaWYgRkZfQVBJX0NPREVEX0ZSQU1FCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgYXZfZnJhbWVfdW5yZWYoYXZjdHgtPmNvZGVkX2ZyYW1lKTsKICAgICByZXQgPSBhdl9mcmFtZV9yZWYoYXZjdHgtPmNvZGVkX2ZyYW1lLCBzLT5jdXJyZW50X3BpY3R1cmUpOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtMTY3Myw5ICsxNjc2LDYgQEAKICAgICAgICAgcy0+bS5iOF9zdHJpZGU9IDIqcy0+bS5tYl93aWR0aCsxOwogICAgICAgICBzLT5tLmZfY29kZT0xOwogICAgICAgICBzLT5tLnBpY3RfdHlwZSA9IHBpYy0+cGljdF90eXBlOwotI2lmIEZGX0FQSV9NT1RJT05fRVNUCi0gICAgICAgIHMtPm0ubWVfbWV0aG9kPSBzLT5hdmN0eC0+bWVfbWV0aG9kOwotI2VuZGlmCiAgICAgICAgIHMtPm0ubW90aW9uX2VzdD0gcy0+bW90aW9uX2VzdDsKICAgICAgICAgcy0+bS5tZS5zY2VuZV9jaGFuZ2Vfc2NvcmU9MDsKICAgICAgICAgcy0+bS5tZS5kaWFfc2l6ZSA9IGF2Y3R4LT5kaWFfc2l6ZTsKQEAgLTE4NTYsNiArMTg1Niw3IEBACiAgICAgICAgIH0KIAogICAgIH0KKyAgICBlbW1zX2MoKTsKIAogICAgIHVwZGF0ZV9sYXN0X2hlYWRlcl92YWx1ZXMocyk7CiAKQEAgLTE4NzYsMTAgKzE4NzcsMTQgQEAKICAgICBpZihhdmN0eC0+ZmxhZ3MmQVZfQ09ERUNfRkxBR19QQVNTMSkKICAgICAgICAgZmZfd3JpdGVfcGFzczFfc3RhdHMoJnMtPm0pOwogICAgIHMtPm0ubGFzdF9waWN0X3R5cGUgPSBzLT5tLnBpY3RfdHlwZTsKKyNpZiBGRl9BUElfU1RBVF9CSVRTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgYXZjdHgtPmZyYW1lX2JpdHMgPSBzLT5tLmZyYW1lX2JpdHM7CiAgICAgYXZjdHgtPm12X2JpdHMgPSBzLT5tLm12X2JpdHM7CiAgICAgYXZjdHgtPm1pc2NfYml0cyA9IHMtPm0ubWlzY19iaXRzOwogICAgIGF2Y3R4LT5wX3RleF9iaXRzID0gcy0+bS5wX3RleF9iaXRzOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKIAogICAgIGVtbXNfYygpOwogCkBAIC0xOTE3LDggKzE5MjIsMTEgQEAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNub3dDb250ZXh0LCB4KQogI2RlZmluZSBWRSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewotICAgIEZGX01QVl9DT01NT05fT1BUUwotICAgIHsgIml0ZXIiLCAgICAgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZGX01FX0lURVIgfSwgMCwgMCwgRkZfTVBWX09QVF9GTEFHUywgIm1vdGlvbl9lc3QiIH0sCisgICAgeyJtb3Rpb25fZXN0IiwgIm1vdGlvbiBlc3RpbWF0aW9uIGFsZ29yaXRobSIsIE9GRlNFVChtb3Rpb25fZXN0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEZGX01FX0VQWlMgfSwgRkZfTUVfWkVSTywgRkZfTUVfSVRFUiwgVkUsICJtb3Rpb25fZXN0IiB9LAorICAgIHsgInplcm8iLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfTUVfWkVSTyB9LCAwLCAwLCBWRSwgIm1vdGlvbl9lc3QiIH0sCisgICAgeyAiZXB6cyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBGRl9NRV9FUFpTIH0sIDAsIDAsIFZFLCAibW90aW9uX2VzdCIgfSwKKyAgICB7ICJ4b25lIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEZGX01FX1hPTkUgfSwgMCwgMCwgVkUsICJtb3Rpb25fZXN0IiB9LAorICAgIHsgIml0ZXIiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRkZfTUVfSVRFUiB9LCAwLCAwLCBWRSwgIm1vdGlvbl9lc3QiIH0sCiAgICAgeyAibWVtY19vbmx5IiwgICAgICAiT25seSBkbyBNRS9NQyAoSSBmcmFtZXMgLT4gcmVmLCBQIGZyYW1lIC0+IE1FK01DKS4iLCAgIE9GRlNFVChtZW1jX29ubHkpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCiAgICAgeyAibm9fYml0c3RyZWFtIiwgICAiU2tpcCBmaW5hbCBiaXRzdHJlYW0gd3JpdGVvdXQuIiwgICAgICAgICAgICAgICAgICAgIE9GRlNFVChub19iaXRzdHJlYW0pLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCiAgICAgeyAiaW50cmFfcGVuYWx0eSIsICAiUGVuYWx0eSBmb3IgaW50cmEgYmxvY2tzIGluIGJsb2NrIGRlY2lzc2lvbiIsICAgICAgT0ZGU0VUKGludHJhX3BlbmFsdHkpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgVkUgfSwKQEAgLTE5NTUsMTMyICsxOTYzLDMgQEAKICAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFIHwKICAgICAgICAgICAgICAgICAgICAgICBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAogfTsKLQotCi0jaWZkZWYgVEVTVAotI3VuZGVmIG1hbGxvYwotI3VuZGVmIGZyZWUKLSN1bmRlZiBwcmludGYKLQotI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKLQotaW50IG1haW4odm9pZCl7Ci0jZGVmaW5lIHdpZHRoICAyNTYKLSNkZWZpbmUgaGVpZ2h0IDI1NgotICAgIGludCBidWZmZXJbMl1bd2lkdGgqaGVpZ2h0XTsKLSAgICBTbm93Q29udGV4dCBzOwotICAgIGludCBpOwotICAgIEFWTEZHIHBybmc7Ci0gICAgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ9NjsKLSAgICBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlPTE7Ci0KLSAgICBzLnRlbXBfZHd0X2J1ZmZlciAgPSBhdl9tYWxsb2N6X2FycmF5KHdpZHRoLCBzaXplb2YoRFdURUxFTSkpOwotICAgIHMudGVtcF9pZHd0X2J1ZmZlciA9IGF2X21hbGxvY3pfYXJyYXkod2lkdGgsIHNpemVvZihJRFdURUxFTSkpOwotCi0gICAgaWYgKCFzLnRlbXBfZHd0X2J1ZmZlciB8fCAhcy50ZW1wX2lkd3RfYnVmZmVyKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKLQotICAgIHByaW50ZigidGVzdGluZyA1LzMgRFdUXG4iKTsKLSAgICBmb3IoaT0wOyBpPHdpZHRoKmhlaWdodDsgaSsrKQotICAgICAgICBidWZmZXJbMF1baV0gPSBidWZmZXJbMV1baV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDU0MzIxIC0gMTIzNDU7Ci0KLSAgICBmZl9zcGF0aWFsX2R3dChidWZmZXJbMF0sIHMudGVtcF9kd3RfYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOwotICAgIGZmX3NwYXRpYWxfaWR3dCgoSURXVEVMRU0qKWJ1ZmZlclswXSwgcy50ZW1wX2lkd3RfYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOwotCi0gICAgZm9yKGk9MDsgaTx3aWR0aCpoZWlnaHQ7IGkrKykKLSAgICAgICAgaWYoYnVmZmVyWzBdW2ldIT0gYnVmZmVyWzFdW2ldKSBwcmludGYoImZzY2s6ICU2ZCAlMTJkICU3ZFxuIixpLCBidWZmZXJbMF1baV0sIGJ1ZmZlclsxXVtpXSk7Ci0KLSAgICBwcmludGYoInRlc3RpbmcgOS83IERXVFxuIik7Ci0gICAgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZT0wOwotICAgIGZvcihpPTA7IGk8d2lkdGgqaGVpZ2h0OyBpKyspCi0gICAgICAgIGJ1ZmZlclswXVtpXSA9IGJ1ZmZlclsxXVtpXSA9IGF2X2xmZ19nZXQoJnBybmcpICUgNTQzMjEgLSAxMjM0NTsKLQotICAgIGZmX3NwYXRpYWxfZHd0KGJ1ZmZlclswXSwgcy50ZW1wX2R3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7Ci0gICAgZmZfc3BhdGlhbF9pZHd0KChJRFdURUxFTSopYnVmZmVyWzBdLCBzLnRlbXBfaWR3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7Ci0KLSAgICBmb3IoaT0wOyBpPHdpZHRoKmhlaWdodDsgaSsrKQotICAgICAgICBpZihGRkFCUyhidWZmZXJbMF1baV0gLSBidWZmZXJbMV1baV0pPjIwKSBwcmludGYoImZzY2s6ICU2ZCAlMTJkICU3ZFxuIixpLCBidWZmZXJbMF1baV0sIGJ1ZmZlclsxXVtpXSk7Ci0KLSAgICB7Ci0gICAgaW50IGxldmVsLCBvcmllbnRhdGlvbiwgeCwgeTsKLSAgICBpbnQ2NF90IGVycm9yc1s4XVs0XTsKLSAgICBpbnQ2NF90IGc9MDsKLQotICAgICAgICBtZW1zZXQoZXJyb3JzLCAwLCBzaXplb2YoZXJyb3JzKSk7Ci0gICAgICAgIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50PTM7Ci0gICAgICAgIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGU9MDsKLSAgICAgICAgZm9yKGxldmVsPTA7IGxldmVsPHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50OyBsZXZlbCsrKXsKLSAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj1sZXZlbCA/IDEgOiAwOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKLSAgICAgICAgICAgICAgICBpbnQgdz0gd2lkdGggID4+IChzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC1sZXZlbCk7Ci0gICAgICAgICAgICAgICAgaW50IGg9IGhlaWdodCA+PiAocy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQtbGV2ZWwpOwotICAgICAgICAgICAgICAgIGludCBzdHJpZGU9IHdpZHRoICA8PCAocy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQtbGV2ZWwpOwotICAgICAgICAgICAgICAgIERXVEVMRU0gKmJ1Zj0gYnVmZmVyWzBdOwotICAgICAgICAgICAgICAgIGludDY0X3QgZXJyb3I9MDsKLQotICAgICAgICAgICAgICAgIGlmKG9yaWVudGF0aW9uJjEpIGJ1Zis9dzsKLSAgICAgICAgICAgICAgICBpZihvcmllbnRhdGlvbj4xKSBidWYrPXN0cmlkZT4+MTsKLQotICAgICAgICAgICAgICAgIG1lbXNldChidWZmZXJbMF0sIDAsIHNpemVvZihpbnQpKndpZHRoKmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgYnVmW3cvMiArIGgvMipzdHJpZGVdPSAyNTYqMjU2OwotICAgICAgICAgICAgICAgIGZmX3NwYXRpYWxfaWR3dCgoSURXVEVMRU0qKWJ1ZmZlclswXSwgcy50ZW1wX2lkd3RfYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZSwgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQpOwotICAgICAgICAgICAgICAgIGZvcih5PTA7IHk8aGVpZ2h0OyB5KyspewotICAgICAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHdpZHRoOyB4KyspewotICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkPSBidWZmZXJbMF1beCArIHkqd2lkdGhdOwotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gZCpkOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoRkZBQlMod2lkdGgvMi14KTw5ICYmIEZGQUJTKGhlaWdodC8yLXkpPDkgJiYgbGV2ZWw9PTIpIHByaW50ZigiJTgiUFJJZDY0IiAiLCBkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZihGRkFCUyhoZWlnaHQvMi15KTw5ICYmIGxldmVsPT0yKSBwcmludGYoIlxuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVycm9yPSAoaW50KShzcXJ0KGVycm9yKSswLjUpOwotICAgICAgICAgICAgICAgIGVycm9yc1tsZXZlbF1bb3JpZW50YXRpb25dPSBlcnJvcjsKLSAgICAgICAgICAgICAgICBpZihnKSBnPWF2X2djZChnLCBlcnJvcik7Ci0gICAgICAgICAgICAgICAgZWxzZSBnPSBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcmludGYoInN0YXRpYyBpbnQgY29uc3QgdmlzdWFsX3dlaWdodFtdWzRdPXtcbiIpOwotICAgICAgICBmb3IobGV2ZWw9MDsgbGV2ZWw8cy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ7IGxldmVsKyspewotICAgICAgICAgICAgcHJpbnRmKCIgIHsiKTsKLSAgICAgICAgICAgIGZvcihvcmllbnRhdGlvbj0wOyBvcmllbnRhdGlvbjw0OyBvcmllbnRhdGlvbisrKXsKLSAgICAgICAgICAgICAgICBwcmludGYoIiU4IlBSSWQ2NCIsIiwgZXJyb3JzW2xldmVsXVtvcmllbnRhdGlvbl0vZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmludGYoIn0sXG4iKTsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoIn07XG4iKTsKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGxldmVsPTI7Ci0gICAgICAgICAgICBpbnQgdz0gd2lkdGggID4+IChzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC1sZXZlbCk7Ci0gICAgICAgICAgICAvL2ludCBoPSBoZWlnaHQgPj4gKHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50LWxldmVsKTsKLSAgICAgICAgICAgIGludCBzdHJpZGU9IHdpZHRoICA8PCAocy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQtbGV2ZWwpOwotICAgICAgICAgICAgRFdURUxFTSAqYnVmPSBidWZmZXJbMF07Ci0gICAgICAgICAgICBpbnQ2NF90IGVycm9yPTA7Ci0KLSAgICAgICAgICAgIGJ1Zis9dzsKLSAgICAgICAgICAgIGJ1Zis9c3RyaWRlPj4xOwotCi0gICAgICAgICAgICBtZW1zZXQoYnVmZmVyWzBdLCAwLCBzaXplb2YoaW50KSp3aWR0aCpoZWlnaHQpOwotICAgICAgICAgICAgZm9yKHk9MDsgeTxoZWlnaHQ7IHkrKyl7Ci0gICAgICAgICAgICAgICAgZm9yKHg9MDsgeDx3aWR0aDsgeCsrKXsKLSAgICAgICAgICAgICAgICAgICAgaW50IHRhYls0XT17MCwyLDMsMX07Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlclswXVt4K3dpZHRoKnldPSAyNTYqMjU2KnRhYlsoeCYxKSArIDIqKHkmMSldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZmX3NwYXRpYWxfZHd0KGJ1ZmZlclswXSwgcy50ZW1wX2R3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7Ci0gICAgICAgICAgICBmb3IoeT0wOyB5PGhlaWdodDsgeSsrKXsKLSAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHdpZHRoOyB4KyspewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGQ9IGJ1ZmZlclswXVt4ICsgeSp3aWR0aF07Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yICs9IGQqZDsKLSAgICAgICAgICAgICAgICAgICAgaWYoRkZBQlMod2lkdGgvMi14KTw5ICYmIEZGQUJTKGhlaWdodC8yLXkpPDkpIHByaW50ZigiJTgiUFJJZDY0IiAiLCBkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYoRkZBQlMoaGVpZ2h0LzIteSk8OSkgcHJpbnRmKCJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zcDV4LmggYi9saWJhdmNvZGVjL3NwNXguaAppbmRleCBlY2Q2ZThkLi4yMWM0NTcxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3NwNXguaAorKysgYi9saWJhdmNvZGVjL3NwNXguaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBTdW5wbHVzIEpQRUcgdGFibGVzCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvc3BlZWRocS5jIGIvbGliYXZjb2RlYy9zcGVlZGhxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQzNDg3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvc3BlZWRocS5jCkBAIC0wLDAgKzEsNjkwIEBACisvKgorICogTmV3VGVrIFNwZWVkSFEgY29kZWMKKyAqIENvcHlyaWdodCAyMDE3IFN0ZWluYXIgSC4gR3VuZGVyc29uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE5ld1RlayBTcGVlZEhRIGRlY29kZXIuCisgKi8KKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgorI2luY2x1ZGUgIm1wZWcxMi5oIgorI2luY2x1ZGUgIm1wZWcxMmRhdGEuaCIKKyNpbmNsdWRlICJtcGVnMTJ2bGMuaCIKKworI2RlZmluZSBNQVhfSU5ERVggKDY0IC0gMSkKKworLyoKKyAqIDUgYml0cyBtYWtlcyBmb3IgdmVyeSBzbWFsbCB0YWJsZXMsIHdpdGggbm8gbW9yZSB0aGFuIHR3byBsb29rdXBzIG5lZWRlZAorICogZm9yIHRoZSBsb25nZXN0ICgxMC1iaXQpIGNvZGVzLgorICovCisjZGVmaW5lIEFMUEhBX1ZMQ19CSVRTIDUKKwordHlwZWRlZiBzdHJ1Y3QgU0hRQ29udGV4dCB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIEJsb2NrRFNQQ29udGV4dCBiZHNwOworICAgIElEQ1REU1BDb250ZXh0IGlkc3A7CisgICAgU2NhblRhYmxlIGludHJhX3NjYW50YWJsZTsKKyAgICBpbnQgcXVhbnRfbWF0cml4WzY0XTsKKyAgICBlbnVtIHsgU0hRX1NVQlNBTVBMSU5HXzQyMCwgU0hRX1NVQlNBTVBMSU5HXzQyMiwgU0hRX1NVQlNBTVBMSU5HXzQ0NCB9CisgICAgICAgIHN1YnNhbXBsaW5nOworICAgIGVudW0geyBTSFFfTk9fQUxQSEEsIFNIUV9STEVfQUxQSEEsIFNIUV9EQ1RfQUxQSEEgfSBhbHBoYV90eXBlOworfSBTSFFDb250ZXh0OworCisKKy8qIEFDIGNvZGVzOiBWZXJ5IHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwgdG8gTVBFRy0yLiAqLworc3RhdGljIHVpbnQxNl90IHNwZWVkaHFfdmxjWzEyM11bMl0gPSB7CisgICAgezB4MDIsIDJ9LCB7MHgwNiwgM30sIHsweDA3LCA0fSwgezB4MWMsIDV9LAorICAgIHsweDFkLCA1fSwgezB4MDUsIDZ9LCB7MHgwNCwgNn0sIHsweDdiLCA3fSwKKyAgICB7MHg3YywgN30sIHsweDIzLCA4fSwgezB4MjIsIDh9LCB7MHhmYSwgOH0sCisgICAgezB4ZmIsIDh9LCB7MHhmZSwgOH0sIHsweGZmLCA4fSwgezB4MWYsMTR9LAorICAgIHsweDFlLDE0fSwgezB4MWQsMTR9LCB7MHgxYywxNH0sIHsweDFiLDE0fSwKKyAgICB7MHgxYSwxNH0sIHsweDE5LDE0fSwgezB4MTgsMTR9LCB7MHgxNywxNH0sCisgICAgezB4MTYsMTR9LCB7MHgxNSwxNH0sIHsweDE0LDE0fSwgezB4MTMsMTR9LAorICAgIHsweDEyLDE0fSwgezB4MTEsMTR9LCB7MHgxMCwxNH0sIHsweDE4LDE1fSwKKyAgICB7MHgxNywxNX0sIHsweDE2LDE1fSwgezB4MTUsMTV9LCB7MHgxNCwxNX0sCisgICAgezB4MTMsMTV9LCB7MHgxMiwxNX0sIHsweDExLDE1fSwgezB4MTAsMTV9LAorICAgIHsweDAyLCAzfSwgezB4MDYsIDV9LCB7MHg3OSwgN30sIHsweDI3LCA4fSwKKyAgICB7MHgyMCwgOH0sIHsweDE2LDEzfSwgezB4MTUsMTN9LCB7MHgxZiwxNX0sCisgICAgezB4MWUsMTV9LCB7MHgxZCwxNX0sIHsweDFjLDE1fSwgezB4MWIsMTV9LAorICAgIHsweDFhLDE1fSwgezB4MTksMTV9LCB7MHgxMywxNn0sIHsweDEyLDE2fSwKKyAgICB7MHgxMSwxNn0sIHsweDEwLDE2fSwgezB4MTgsMTN9LCB7MHgxNywxM30sCisgICAgezB4MDUsIDV9LCB7MHgwNywgN30sIHsweGZjLCA4fSwgezB4MGMsMTB9LAorICAgIHsweDE0LDEzfSwgezB4MTgsMTJ9LCB7MHgxNCwxMn0sIHsweDEzLDEyfSwKKyAgICB7MHgxMCwxMn0sIHsweDFhLDEzfSwgezB4MTksMTN9LCB7MHgwNywgNX0sCisgICAgezB4MjYsIDh9LCB7MHgxYywxMn0sIHsweDEzLDEzfSwgezB4MWIsMTJ9LAorICAgIHsweDA2LCA2fSwgezB4ZmQsIDh9LCB7MHgxMiwxMn0sIHsweDFkLDEyfSwKKyAgICB7MHgwNywgNn0sIHsweDA0LCA5fSwgezB4MTIsMTN9LCB7MHgwNiwgN30sCisgICAgezB4MWUsMTJ9LCB7MHgxNCwxNn0sIHsweDA0LCA3fSwgezB4MTUsMTJ9LAorICAgIHsweDA1LCA3fSwgezB4MTEsMTJ9LCB7MHg3OCwgN30sIHsweDExLDEzfSwKKyAgICB7MHg3YSwgN30sIHsweDEwLDEzfSwgezB4MjEsIDh9LCB7MHgxYSwxNn0sCisgICAgezB4MjUsIDh9LCB7MHgxOSwxNn0sIHsweDI0LCA4fSwgezB4MTgsMTZ9LAorICAgIHsweDA1LCA5fSwgezB4MTcsMTZ9LCB7MHgwNywgOX0sIHsweDE2LDE2fSwKKyAgICB7MHgwZCwxMH0sIHsweDE1LDE2fSwgezB4MWYsMTJ9LCB7MHgxYSwxMn0sCisgICAgezB4MTksMTJ9LCB7MHgxNywxMn0sIHsweDE2LDEyfSwgezB4MWYsMTN9LAorICAgIHsweDFlLDEzfSwgezB4MWQsMTN9LCB7MHgxYywxM30sIHsweDFiLDEzfSwKKyAgICB7MHgxZiwxNn0sIHsweDFlLDE2fSwgezB4MWQsMTZ9LCB7MHgxYywxNn0sCisgICAgezB4MWIsMTZ9LAorICAgIHsweDAxLDZ9LCAvKiBlc2NhcGUgKi8KKyAgICB7MHgwNiw0fSwgLyogRU9CICovCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzcGVlZGhxX2xldmVsWzEyMV0gPSB7CisgICAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LAorICAgICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwKKyAgICAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsCisgICAgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAorICAgIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwKKyAgICAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsCisgICAgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LAorICAgIDE3LCAxOCwgMTksIDIwLCAgMSwgIDIsICAzLCAgNCwKKyAgICAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgIDEsCisgICAgIDIsICAzLCAgNCwgIDUsICAxLCAgMiwgIDMsICA0LAorICAgICAxLCAgMiwgIDMsICAxLCAgMiwgIDMsICAxLCAgMiwKKyAgICAgMSwgIDIsICAxLCAgMiwgIDEsICAyLCAgMSwgIDIsCisgICAgIDEsICAyLCAgMSwgIDIsICAxLCAgMiwgIDEsICAyLAorICAgICAxLCAgMiwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsCisgICAgIDEsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzcGVlZGhxX3J1blsxMjFdID0geworICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLAorICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwKKyAgICAgMSwgIDEsICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsCisgICAgIDIsICAyLCAgMiwgIDIsICAyLCAgMiwgIDIsICAzLAorICAgICAzLCAgMywgIDMsICAzLCAgNCwgIDQsICA0LCAgNCwKKyAgICAgNSwgIDUsICA1LCAgNiwgIDYsICA2LCAgNywgIDcsCisgICAgIDgsICA4LCAgOSwgIDksIDEwLCAxMCwgMTEsIDExLAorICAgIDEyLCAxMiwgMTMsIDEzLCAxNCwgMTQsIDE1LCAxNSwKKyAgICAxNiwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsCisgICAgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLAorICAgIDMxLAorfTsKKworc3RhdGljIFJMVGFibGUgZmZfcmxfc3BlZWRocSA9IHsKKyAgICAxMjEsCisgICAgMTIxLAorICAgIChjb25zdCB1aW50MTZfdCAoKilbXSlzcGVlZGhxX3ZsYywKKyAgICBzcGVlZGhxX3J1biwKKyAgICBzcGVlZGhxX2xldmVsLAorfTsKKworLyogTk9URTogVGhlIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIDE2LCB1bnNjYWxlZC4gKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHVuc2NhbGVkX3F1YW50X21hdHJpeFs2NF0gPSB7CisgICAgMTYsIDE2LCAxOSwgMjIsIDI2LCAyNywgMjksIDM0LAorICAgIDE2LCAxNiwgMjIsIDI0LCAyNywgMjksIDM0LCAzNywKKyAgICAxOSwgMjIsIDI2LCAyNywgMjksIDM0LCAzNCwgMzgsCisgICAgMjIsIDIyLCAyNiwgMjcsIDI5LCAzNCwgMzcsIDQwLAorICAgIDIyLCAyNiwgMjcsIDI5LCAzMiwgMzUsIDQwLCA0OCwKKyAgICAyNiwgMjcsIDI5LCAzMiwgMzUsIDQwLCA0OCwgNTgsCisgICAgMjYsIDI3LCAyOSwgMzQsIDM4LCA0NiwgNTYsIDY5LAorICAgIDI3LCAyOSwgMzUsIDM4LCA0NiwgNTYsIDY5LCA4MworfTsKKworc3RhdGljIHVpbnQ4X3QgZmZfc3BlZWRocV9zdGF0aWNfcmxfdGFibGVfc3RvcmVbMl1bMipNQVhfUlVOICsgTUFYX0xFVkVMICsgM107CisKK3N0YXRpYyBWTEMgZmZfZGNfbHVtX3ZsY19sZTsKK3N0YXRpYyBWTEMgZmZfZGNfY2hyb21hX3ZsY19sZTsKK3N0YXRpYyBWTEMgZmZfZGNfYWxwaGFfcnVuX3ZsY19sZTsKK3N0YXRpYyBWTEMgZmZfZGNfYWxwaGFfbGV2ZWxfdmxjX2xlOworCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfZGNfbGUoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBjb21wb25lbnQpCit7CisgICAgaW50IGNvZGUsIGRpZmY7CisKKyAgICBpZiAoY29tcG9uZW50ID09IDAgfHwgY29tcG9uZW50ID09IDMpIHsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKGdiLCBmZl9kY19sdW1fdmxjX2xlLnRhYmxlLCBEQ19WTENfQklUUywgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29kZSA9IGdldF92bGMyKGdiLCBmZl9kY19jaHJvbWFfdmxjX2xlLnRhYmxlLCBEQ19WTENfQklUUywgMik7CisgICAgfQorICAgIGlmIChjb2RlIDwgMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBkYyBjb2RlIGF0XG4iKTsKKyAgICAgICAgcmV0dXJuIDB4ZmZmZjsKKyAgICB9CisgICAgaWYgKCFjb2RlKSB7CisgICAgICAgIGRpZmYgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZmYgPSBnZXRfeGJpdHNfbGUoZ2IsIGNvZGUpOworICAgIH0KKyAgICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVjb2RlX2FscGhhX2Jsb2NrKGNvbnN0IFNIUUNvbnRleHQgKnMsIEdldEJpdENvbnRleHQgKmdiLCB1aW50OF90IGxhc3RfYWxwaGFbMTZdLCB1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUpCit7CisgICAgdWludDhfdCBibG9ja1sxMjhdOworICAgIGludCBpID0gMCwgeCwgeTsKKworICAgIG1lbXNldChibG9jaywgMCwgc2l6ZW9mKGJsb2NrKSk7CisKKyAgICB7CisgICAgICAgIE9QRU5fUkVBREVSKHJlLCBnYik7CisKKyAgICAgICAgZm9yICggOzsgKSB7CisgICAgICAgICAgICBpbnQgcnVuLCBsZXZlbDsKKworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFX0xFKHJlLCBnYik7CisgICAgICAgICAgICBHRVRfVkxDKHJ1biwgcmUsIGdiLCBmZl9kY19hbHBoYV9ydW5fdmxjX2xlLnRhYmxlLCBBTFBIQV9WTENfQklUUywgMik7CisKKyAgICAgICAgICAgIGlmIChydW4gPCAwKSBicmVhazsKKyAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgaWYgKGkgPj0gMTI4KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBVUERBVEVfQ0FDSEVfTEUocmUsIGdiKTsKKyAgICAgICAgICAgIEdFVF9WTEMobGV2ZWwsIHJlLCBnYiwgZmZfZGNfYWxwaGFfbGV2ZWxfdmxjX2xlLnRhYmxlLCBBTFBIQV9WTENfQklUUywgMik7CisgICAgICAgICAgICBibG9ja1tpKytdID0gbGV2ZWw7CisgICAgICAgIH0KKworICAgICAgICBDTE9TRV9SRUFERVIocmUsIGdiKTsKKyAgICB9CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCsrKSB7CisgICAgICAgICAgICBsYXN0X2FscGhhW3hdIC09IGJsb2NrW3kgKiAxNiArIHhdOworICAgICAgICB9CisgICAgICAgIG1lbWNweShkZXN0LCBsYXN0X2FscGhhLCAxNik7CisgICAgICAgIGRlc3QgKz0gbGluZXNpemU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlY29kZV9kY3RfYmxvY2soY29uc3QgU0hRQ29udGV4dCAqcywgR2V0Qml0Q29udGV4dCAqZ2IsIGludCBsYXN0X2RjWzRdLCBpbnQgY29tcG9uZW50LCB1aW50OF90ICpkZXN0LCBpbnQgbGluZXNpemUpCit7CisgICAgY29uc3QgaW50ICpxdWFudF9tYXRyaXggPSBzLT5xdWFudF9tYXRyaXg7CisgICAgY29uc3QgdWludDhfdCAqc2NhbnRhYmxlID0gcy0+aW50cmFfc2NhbnRhYmxlLnBlcm11dGF0ZWQ7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBibG9jaywgWzY0XSk7CisgICAgaW50IGRjX29mZnNldDsKKworICAgIHMtPmJkc3AuY2xlYXJfYmxvY2soYmxvY2spOworCisgICAgZGNfb2Zmc2V0ID0gZGVjb2RlX2RjX2xlKGdiLCBjb21wb25lbnQpOworICAgIGxhc3RfZGNbY29tcG9uZW50XSAtPSBkY19vZmZzZXQ7ICAvKiBOb3RlOiBPcHBvc2l0ZSBvZiBtb3N0IGNvZGVjcy4gKi8KKyAgICBibG9ja1tzY2FudGFibGVbMF1dID0gbGFzdF9kY1tjb21wb25lbnRdOyAgLyogcXVhbnRfbWF0cml4WzBdIGlzIGFsd2F5cyAxNi4gKi8KKworICAgIC8qIFJlYWQgQUMgY29lZmZpY2llbnRzLiAqLworICAgIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBPUEVOX1JFQURFUihyZSwgZ2IpOworICAgICAgICBmb3IgKCA7OyApIHsKKyAgICAgICAgICAgIGludCBsZXZlbCwgcnVuOworICAgICAgICAgICAgVVBEQVRFX0NBQ0hFX0xFKHJlLCBnYik7CisgICAgICAgICAgICBHRVRfUkxfVkxDKGxldmVsLCBydW4sIHJlLCBnYiwgZmZfcmxfc3BlZWRocS5ybF92bGNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIFRFWF9WTENfQklUUywgMiwgMCk7CisgICAgICAgICAgICBpZiAobGV2ZWwgPT0gMTI3KSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxldmVsKSB7CisgICAgICAgICAgICAgICAgaSArPSBydW47CisgICAgICAgICAgICAgICAgaWYgKGkgPiBNQVhfSU5ERVgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIC8qIElmIG5leHQgYml0IGlzIDEsIGxldmVsID0gLWxldmVsICovCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAobGV2ZWwgXiBTSE9XX1NCSVRTKHJlLCBnYiwgMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIFNIT1dfU0JJVFMocmUsIGdiLCAxKTsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBFc2NhcGUuICovCisjaWYgTUlOX0NBQ0hFX0JJVFMgPCA2ICsgNiArIDEyCisjZXJyb3IgTUlOX0NBQ0hFX0JJVFMgaXMgdG9vIHNtYWxsIGZvciB0aGUgZXNjYXBlIGNvZGUsIGFkZCBVUERBVEVfQ0FDSEUKKyNlbmRpZgorICAgICAgICAgICAgICAgIHJ1biA9IFNIT1dfVUJJVFMocmUsIGdiLCA2KSArIDE7CisgICAgICAgICAgICAgICAgU0tJUF9CSVRTKHJlLCBnYiwgNik7CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBTSE9XX1VCSVRTKHJlLCBnYiwgMTIpIC0gMjA0ODsKKyAgICAgICAgICAgICAgICBMQVNUX1NLSVBfQklUUyhyZSwgZ2IsIDEyKTsKKworICAgICAgICAgICAgICAgIGkgKz0gcnVuOworICAgICAgICAgICAgICAgIGlmIChpID4gTUFYX0lOREVYKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmxvY2tbc2NhbnRhYmxlW2ldXSA9IChsZXZlbCAqIHF1YW50X21hdHJpeFtpXSkgPj4gNDsKKyAgICAgICAgfQorICAgICAgICBDTE9TRV9SRUFERVIocmUsIGdiKTsKKyAgICB9CisKKyAgICBzLT5pZHNwLmlkY3RfcHV0KGRlc3QsIGxpbmVzaXplLCBibG9jayk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWNvZGVfc3BlZWRocV9maWVsZChjb25zdCBTSFFDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSwgQVZGcmFtZSAqZnJhbWUsIGludCBmaWVsZF9udW1iZXIsIGludCBzdGFydCwgaW50IGVuZCwgaW50IGxpbmVfc3RyaWRlKQoreworICAgIGludCByZXQsIHNsaWNlX251bWJlciwgc2xpY2Vfb2Zmc2V0c1s1XTsKKyAgICBpbnQgbGluZXNpemVfeSAgPSBmcmFtZS0+bGluZXNpemVbMF0gKiBsaW5lX3N0cmlkZTsKKyAgICBpbnQgbGluZXNpemVfY2IgPSBmcmFtZS0+bGluZXNpemVbMV0gKiBsaW5lX3N0cmlkZTsKKyAgICBpbnQgbGluZXNpemVfY3IgPSBmcmFtZS0+bGluZXNpemVbMl0gKiBsaW5lX3N0cmlkZTsKKyAgICBpbnQgbGluZXNpemVfYTsKKworICAgIGlmIChzLT5hbHBoYV90eXBlICE9IFNIUV9OT19BTFBIQSkKKyAgICAgICAgbGluZXNpemVfYSA9IGZyYW1lLT5saW5lc2l6ZVszXSAqIGxpbmVfc3RyaWRlOworCisgICAgaWYgKGVuZCA8IHN0YXJ0IHx8IGVuZCAtIHN0YXJ0IDwgMyB8fCBlbmQgPiBidWZfc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzbGljZV9vZmZzZXRzWzBdID0gc3RhcnQ7CisgICAgc2xpY2Vfb2Zmc2V0c1s0XSA9IGVuZDsKKyAgICBmb3IgKHNsaWNlX251bWJlciA9IDE7IHNsaWNlX251bWJlciA8IDQ7IHNsaWNlX251bWJlcisrKSB7CisgICAgICAgIHVpbnQzMl90IGxhc3Rfb2Zmc2V0LCBzbGljZV9sZW47CisKKyAgICAgICAgbGFzdF9vZmZzZXQgPSBzbGljZV9vZmZzZXRzW3NsaWNlX251bWJlciAtIDFdOworICAgICAgICBzbGljZV9sZW4gPSBBVl9STDI0KGJ1ZiArIGxhc3Rfb2Zmc2V0KTsKKyAgICAgICAgc2xpY2Vfb2Zmc2V0c1tzbGljZV9udW1iZXJdID0gbGFzdF9vZmZzZXQgKyBzbGljZV9sZW47CisKKyAgICAgICAgaWYgKHNsaWNlX2xlbiA8IDMgfHwgc2xpY2Vfb2Zmc2V0c1tzbGljZV9udW1iZXJdID4gZW5kIC0gMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZvciAoc2xpY2VfbnVtYmVyID0gMDsgc2xpY2VfbnVtYmVyIDwgNDsgc2xpY2VfbnVtYmVyKyspIHsKKyAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICAgICAgdWludDMyX3Qgc2xpY2VfYmVnaW4sIHNsaWNlX2VuZDsKKyAgICAgICAgaW50IHgsIHk7CisKKyAgICAgICAgc2xpY2VfYmVnaW4gPSBzbGljZV9vZmZzZXRzW3NsaWNlX251bWJlcl07CisgICAgICAgIHNsaWNlX2VuZCA9IHNsaWNlX29mZnNldHNbc2xpY2VfbnVtYmVyICsgMV07CisKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZiArIHNsaWNlX2JlZ2luICsgMywgc2xpY2VfZW5kIC0gc2xpY2VfYmVnaW4gLSAzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBmb3IgKHkgPSBzbGljZV9udW1iZXIgKiAxNiAqIGxpbmVfc3RyaWRlOyB5IDwgZnJhbWUtPmhlaWdodDsgeSArPSBsaW5lX3N0cmlkZSAqIDY0KSB7CisgICAgICAgICAgICB1aW50OF90ICpkZXN0X3ksICpkZXN0X2NiLCAqZGVzdF9jciwgKmRlc3RfYTsKKyAgICAgICAgICAgIGludCBsYXN0X2RjWzRdID0geyAxMDI0LCAxMDI0LCAxMDI0LCAxMDI0IH07CisgICAgICAgICAgICB1aW50OF90IGxhc3RfYWxwaGFbMTZdOworCisgICAgICAgICAgICBtZW1zZXQobGFzdF9hbHBoYSwgMjU1LCBzaXplb2YobGFzdF9hbHBoYSkpOworCisgICAgICAgICAgICBkZXN0X3kgPSBmcmFtZS0+ZGF0YVswXSArIGZyYW1lLT5saW5lc2l6ZVswXSAqICh5ICsgZmllbGRfbnVtYmVyKTsKKyAgICAgICAgICAgIGlmIChzLT5zdWJzYW1wbGluZyA9PSBTSFFfU1VCU0FNUExJTkdfNDIwKSB7CisgICAgICAgICAgICAgICAgZGVzdF9jYiA9IGZyYW1lLT5kYXRhWzFdICsgZnJhbWUtPmxpbmVzaXplWzFdICogKHkvMiArIGZpZWxkX251bWJlcik7CisgICAgICAgICAgICAgICAgZGVzdF9jciA9IGZyYW1lLT5kYXRhWzJdICsgZnJhbWUtPmxpbmVzaXplWzJdICogKHkvMiArIGZpZWxkX251bWJlcik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlc3RfY2IgPSBmcmFtZS0+ZGF0YVsxXSArIGZyYW1lLT5saW5lc2l6ZVsxXSAqICh5ICsgZmllbGRfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBkZXN0X2NyID0gZnJhbWUtPmRhdGFbMl0gKyBmcmFtZS0+bGluZXNpemVbMl0gKiAoeSArIGZpZWxkX251bWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+YWxwaGFfdHlwZSAhPSBTSFFfTk9fQUxQSEEpIHsKKyAgICAgICAgICAgICAgICBkZXN0X2EgPSBmcmFtZS0+ZGF0YVszXSArIGZyYW1lLT5saW5lc2l6ZVszXSAqICh5ICsgZmllbGRfbnVtYmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGZyYW1lLT53aWR0aDsgeCArPSAxNikgeworICAgICAgICAgICAgICAgIC8qIERlY29kZSB0aGUgZm91ciBsdW1hIGJsb2Nrcy4gKi8KKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9kY3RfYmxvY2socywgJmdiLCBsYXN0X2RjLCAwLCBkZXN0X3ksIGxpbmVzaXplX3kpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfZGN0X2Jsb2NrKHMsICZnYiwgbGFzdF9kYywgMCwgZGVzdF95ICsgOCwgbGluZXNpemVfeSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9kY3RfYmxvY2socywgJmdiLCBsYXN0X2RjLCAwLCBkZXN0X3kgKyA4ICogbGluZXNpemVfeSwgbGluZXNpemVfeSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9kY3RfYmxvY2socywgJmdiLCBsYXN0X2RjLCAwLCBkZXN0X3kgKyA4ICogbGluZXNpemVfeSArIDgsIGxpbmVzaXplX3kpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIERlY29kZSB0aGUgZmlyc3QgY2hyb21hIGJsb2NrLiBGb3IgNDoyOjAsIHRoaXMgaXMgdGhlIG9ubHkgb25lOworICAgICAgICAgICAgICAgICAqIGZvciA0OjI6MiwgaXQncyB0aGUgdG9wIGJsb2NrOyBmb3IgNDo0OjQsIGl0J3MgdGhlIHRvcC1sZWZ0IGJsb2NrLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2RjdF9ibG9jayhzLCAmZ2IsIGxhc3RfZGMsIDEsIGRlc3RfY2IsIGxpbmVzaXplX2NiKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2RjdF9ibG9jayhzLCAmZ2IsIGxhc3RfZGMsIDIsIGRlc3RfY3IsIGxpbmVzaXplX2NyKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgaWYgKHMtPnN1YnNhbXBsaW5nICE9IFNIUV9TVUJTQU1QTElOR180MjApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRm9yIDQ6MjoyLCB0aGlzIGlzIHRoZSBib3R0b20gYmxvY2s7IGZvciA0OjQ6NCwgaXQncyB0aGUgYm90dG9tLWxlZnQgYmxvY2suICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2RjdF9ibG9jayhzLCAmZ2IsIGxhc3RfZGMsIDEsIGRlc3RfY2IgKyA4ICogbGluZXNpemVfY2IsIGxpbmVzaXplX2NiKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfZGN0X2Jsb2NrKHMsICZnYiwgbGFzdF9kYywgMiwgZGVzdF9jciArIDggKiBsaW5lc2l6ZV9jciwgbGluZXNpemVfY3IpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5zdWJzYW1wbGluZyA9PSBTSFFfU1VCU0FNUExJTkdfNDQ0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUb3AtcmlnaHQgYW5kIGJvdHRvbS1yaWdodCBibG9ja3MuICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9kY3RfYmxvY2socywgJmdiLCBsYXN0X2RjLCAxLCBkZXN0X2NiICsgOCwgbGluZXNpemVfY2IpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2RjdF9ibG9jayhzLCAmZ2IsIGxhc3RfZGMsIDIsIGRlc3RfY3IgKyA4LCBsaW5lc2l6ZV9jcikpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfZGN0X2Jsb2NrKHMsICZnYiwgbGFzdF9kYywgMSwgZGVzdF9jYiArIDggKiBsaW5lc2l6ZV9jYiArIDgsIGxpbmVzaXplX2NiKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9kY3RfYmxvY2socywgJmdiLCBsYXN0X2RjLCAyLCBkZXN0X2NyICsgOCAqIGxpbmVzaXplX2NyICsgOCwgbGluZXNpemVfY3IpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9jYiArPSA4OworICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9jciArPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3RfeSArPSAxNjsKKyAgICAgICAgICAgICAgICBkZXN0X2NiICs9IDg7CisgICAgICAgICAgICAgICAgZGVzdF9jciArPSA4OworCisgICAgICAgICAgICAgICAgaWYgKHMtPmFscGhhX3R5cGUgPT0gU0hRX1JMRV9BTFBIQSkgeworICAgICAgICAgICAgICAgICAgICAvKiBBbHBoYSBjb2RlZCB1c2luZyAxNng4IFJMRSBibG9ja3MuICovCisgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX2FscGhhX2Jsb2NrKHMsICZnYiwgbGFzdF9hbHBoYSwgZGVzdF9hLCBsaW5lc2l6ZV9hKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfYWxwaGFfYmxvY2socywgJmdiLCBsYXN0X2FscGhhLCBkZXN0X2EgKyA4ICogbGluZXNpemVfYSwgbGluZXNpemVfYSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIGRlc3RfYSArPSAxNjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFscGhhX3R5cGUgPT0gU0hRX0RDVF9BTFBIQSkgeworICAgICAgICAgICAgICAgICAgICAvKiBBbHBoYSBlbmNvZGVkIGV4YWN0bHkgbGlrZSBsdW1hLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9kY3RfYmxvY2socywgJmdiLCBsYXN0X2RjLCAzLCBkZXN0X2EsIGxpbmVzaXplX2EpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9kY3RfYmxvY2socywgJmdiLCBsYXN0X2RjLCAzLCBkZXN0X2EgKyA4LCBsaW5lc2l6ZV9hKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfZGN0X2Jsb2NrKHMsICZnYiwgbGFzdF9kYywgMywgZGVzdF9hICsgOCAqIGxpbmVzaXplX2EsIGxpbmVzaXplX2EpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9kY3RfYmxvY2socywgJmdiLCBsYXN0X2RjLCAzLCBkZXN0X2EgKyA4ICogbGluZXNpemVfYSArIDgsIGxpbmVzaXplX2EpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICBkZXN0X2EgKz0gMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfcXVhbnRfbWF0cml4KGludCAqb3V0cHV0LCBpbnQgcXNjYWxlKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSBvdXRwdXRbaV0gPSB1bnNjYWxlZF9xdWFudF9tYXRyaXhbZmZfemlnemFnX2RpcmVjdFtpXV0gKiBxc2NhbGU7Cit9CisKK3N0YXRpYyBpbnQgc3BlZWRocV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFNIUUNvbnRleHQgKiBjb25zdCBzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpidWYgICA9IGF2cGt0LT5kYXRhOworICAgIGludCBidWZfc2l6ZSAgICAgICAgID0gYXZwa3QtPnNpemU7CisgICAgQVZGcmFtZSAqZnJhbWUgICAgICAgPSBkYXRhOworICAgIHVpbnQ4X3QgcXVhbGl0eTsKKyAgICB1aW50MzJfdCBzZWNvbmRfZmllbGRfb2Zmc2V0OworICAgIGludCByZXQ7CisKKyAgICBpZiAoYnVmX3NpemUgPCA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHF1YWxpdHkgPSBidWZbMF07CisgICAgaWYgKHF1YWxpdHkgPj0gMTAwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGNvbXB1dGVfcXVhbnRfbWF0cml4KHMtPnF1YW50X21hdHJpeCwgMTAwIC0gcXVhbGl0eSk7CisKKyAgICBzZWNvbmRfZmllbGRfb2Zmc2V0ID0gQVZfUkwyNChidWYgKyAxKTsKKyAgICBpZiAoc2Vjb25kX2ZpZWxkX29mZnNldCA+PSBidWZfc2l6ZSAtIDMpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgYXZjdHgtPmNvZGVkX3dpZHRoID0gRkZBTElHTihhdmN0eC0+d2lkdGgsIDE2KTsKKyAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0ID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNik7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAxOworCisgICAgaWYgKHNlY29uZF9maWVsZF9vZmZzZXQgPT0gNCkgeworICAgICAgICAvKgorICAgICAgICAgKiBPdmVybGFwcGluZyBmaXJzdCBhbmQgc2Vjb25kIGZpZWxkcyBpcyB1c2VkIHRvIHNpZ25hbAorICAgICAgICAgKiBlbmNvZGluZyBvbmx5IGEgc2luZ2xlIGZpZWxkLiBJbiB0aGlzIGNhc2UsICJoZWlnaHQiCisgICAgICAgICAqIGlzIGFtYmlndW91czsgaXQgY291bGQgbWVhbiBlaXRoZXIgdGhlIGhlaWdodCBvZiB0aGUKKyAgICAgICAgICogZnJhbWUgYXMgYSB3aG9sZSwgb3Igb2YgdGhlIGZpZWxkLiBUaGUgZm9ybWVyIHdvdWxkIG1ha2UKKyAgICAgICAgICogbW9yZSBzZW5zZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBkZWNvZGVycywKKyAgICAgICAgICogYnV0IHRoaXMgbWF0Y2hlcyB0aGUgY29udmVudGlvbiB1c2VkIGluIE5ESSwgd2hpY2ggaXMKKyAgICAgICAgICogdGhlIHByaW1hcnkgdXNlciBvZiB0aGlzIHRyaWNrLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChyZXQgPSBkZWNvZGVfc3BlZWRocV9maWVsZChzLCBidWYsIGJ1Zl9zaXplLCBmcmFtZSwgMCwgNCwgYnVmX3NpemUsIDEpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgocmV0ID0gZGVjb2RlX3NwZWVkaHFfZmllbGQocywgYnVmLCBidWZfc2l6ZSwgZnJhbWUsIDAsIDQsIHNlY29uZF9maWVsZF9vZmZzZXQsIDIpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoKHJldCA9IGRlY29kZV9zcGVlZGhxX2ZpZWxkKHMsIGJ1ZiwgYnVmX3NpemUsIGZyYW1lLCAxLCBzZWNvbmRfZmllbGRfb2Zmc2V0LCBidWZfc2l6ZSwgMikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKmdvdF9mcmFtZSA9IDE7CisgICAgcmV0dXJuIGJ1Zl9zaXplOworfQorCisvKgorICogQWxwaGEgVkxDLiBSdW4gYW5kIGxldmVsIGFyZSBpbmRlcGVuZGVudGx5IGNvZGVkLCBhbmQgd291bGQgYmUKKyAqIG91dHNpZGUgdGhlIGRlZmF1bHQgbGltaXRzIGZvciBNQVhfUlVOL01BWF9MRVZFTCwgc28gd2UgZG9uJ3QKKyAqIGJvdGhlciB3aXRoIGNvbWJpbmluZyB0aGVtIGludG8gb25lIHRhYmxlLgorICovCitzdGF0aWMgYXZfY29sZCB2b2lkIGNvbXB1dGVfYWxwaGFfdmxjcyh2b2lkKQoreworICAgIHVpbnQxNl90IHJ1bl9jb2RlWzEzNF0sIGxldmVsX2NvZGVbMjY2XTsKKyAgICB1aW50OF90IHJ1bl9iaXRzWzEzNF0sIGxldmVsX2JpdHNbMjY2XTsKKyAgICBpbnQxNl90IHJ1bl9zeW1ib2xzWzEzNF0sIGxldmVsX3N5bWJvbHNbMjY2XTsKKyAgICBpbnQgZW50cnksIGksIHNpZ247CisKKyAgICAvKiBJbml0aWFsaXplIFZMQyBmb3IgYWxwaGEgcnVuLiAqLworICAgIGVudHJ5ID0gMDsKKworICAgIC8qIDAgLT4gMC4gKi8KKyAgICBydW5fY29kZVtlbnRyeV0gPSAwOworICAgIHJ1bl9iaXRzW2VudHJ5XSA9IDE7CisgICAgcnVuX3N5bWJvbHNbZW50cnldID0gMDsKKyAgICArK2VudHJ5OworCisgICAgLyogMTB4eCAtPiB4eCBwbHVzIDEuICovCisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICBydW5fY29kZVtlbnRyeV0gPSAoaSA8PCAyKSB8IDE7CisgICAgICAgIHJ1bl9iaXRzW2VudHJ5XSA9IDQ7CisgICAgICAgIHJ1bl9zeW1ib2xzW2VudHJ5XSA9IGkgKyAxOworICAgICAgICArK2VudHJ5OworICAgIH0KKworICAgIC8qIDExMXh4eHh4eHggLT4geHh4eHh4eC4gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI4OyArK2kpIHsKKyAgICAgICAgcnVuX2NvZGVbZW50cnldID0gKGkgPDwgMykgfCA3OworICAgICAgICBydW5fYml0c1tlbnRyeV0gPSAxMDsKKyAgICAgICAgcnVuX3N5bWJvbHNbZW50cnldID0gaTsKKyAgICAgICAgKytlbnRyeTsKKyAgICB9CisKKyAgICAvKiAxMTAgLT4gRU9CLiAqLworICAgIHJ1bl9jb2RlW2VudHJ5XSA9IDM7CisgICAgcnVuX2JpdHNbZW50cnldID0gMzsKKyAgICBydW5fc3ltYm9sc1tlbnRyeV0gPSAtMTsKKyAgICArK2VudHJ5OworCisgICAgYXZfYXNzZXJ0MChlbnRyeSA9PSBGRl9BUlJBWV9FTEVNUyhydW5fY29kZSkpOworCisgICAgSU5JVF9MRV9WTENfU1BBUlNFX1NUQVRJQygmZmZfZGNfYWxwaGFfcnVuX3ZsY19sZSwgQUxQSEFfVkxDX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9BUlJBWV9FTEVNUyhydW5fY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9jb2RlLCAyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3N5bWJvbHMsIDIsIDIsIDE2MCk7CisKKyAgICAvKiBJbml0aWFsaXplIFZMQyBmb3IgYWxwaGEgbGV2ZWwuICovCisgICAgZW50cnkgPSAwOworCisgICAgZm9yIChzaWduID0gMDsgc2lnbiA8PSAxOyArK3NpZ24pIHsKKyAgICAgICAgLyogMXMgLT4gLTEgb3IgKzEgKGRlcGVuZGluZyBvbiBzaWduIGJpdCkuICovCisgICAgICAgIGxldmVsX2NvZGVbZW50cnldID0gKHNpZ24gPDwgMSkgfCAxOworICAgICAgICBsZXZlbF9iaXRzW2VudHJ5XSA9IDI7CisgICAgICAgIGxldmVsX3N5bWJvbHNbZW50cnldID0gc2lnbiA/IC0xIDogMTsKKyAgICAgICAgKytlbnRyeTsKKworICAgICAgICAvKiAwMXN4eCAtPiB4eCBwbHVzIDIgKDIuLjUgb3IgLTIuLi01LCBkZXBlbmRpbmcgb24gc2lnbiBiaXQpLiAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBsZXZlbF9jb2RlW2VudHJ5XSA9IChpIDw8IDMpIHwgKHNpZ24gPDwgMikgfCAyOworICAgICAgICAgICAgbGV2ZWxfYml0c1tlbnRyeV0gPSA1OworICAgICAgICAgICAgbGV2ZWxfc3ltYm9sc1tlbnRyeV0gPSBzaWduID8gLShpICsgMikgOiAoaSArIDIpOworICAgICAgICAgICAgKytlbnRyeTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogMDB4eHh4eHh4eCAtPiB4eHh4eHh4eCwgaW4gdHdvJ3MgY29tcGxlbWVudC4gVGhlcmUgYXJlIG1hbnkgY29kZXMKKyAgICAgKiBoZXJlIHRoYXQgd291bGQgYmV0dGVyIGJlIGVuY29kZWQgaW4gb3RoZXIgd2F5cyAoZS5nLiAwIHdvdWxkIGJlCisgICAgICogZW5jb2RlZCBieSBpbmNyZWFzaW5nIHJ1biwgYW5kICsvLSAxIHdvdWxkIGJlIGVuY29kZWQgd2l0aCBhCisgICAgICogc2hvcnRlciBjb2RlKSwgYnV0IGl0IGRvZXNuJ3QgaHVydCB0byBhbGxvdyBldmVyeXRoaW5nLgorICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICBsZXZlbF9jb2RlW2VudHJ5XSA9IGkgPDwgMjsKKyAgICAgICAgbGV2ZWxfYml0c1tlbnRyeV0gPSAxMDsKKyAgICAgICAgbGV2ZWxfc3ltYm9sc1tlbnRyeV0gPSBpOworICAgICAgICArK2VudHJ5OworICAgIH0KKworICAgIGF2X2Fzc2VydDAoZW50cnkgPT0gRkZfQVJSQVlfRUxFTVMobGV2ZWxfY29kZSkpOworCisgICAgSU5JVF9MRV9WTENfU1BBUlNFX1NUQVRJQygmZmZfZGNfYWxwaGFfbGV2ZWxfdmxjX2xlLCBBTFBIQV9WTENfQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0FSUkFZX0VMRU1TKGxldmVsX2NvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxfYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsX2NvZGUsIDIsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbF9zeW1ib2xzLCAyLCAyLCAyODgpOworfQorCitzdGF0aWMgdWludDMyX3QgcmV2ZXJzZSh1aW50MzJfdCBudW0sIGludCBiaXRzKQoreworICAgIHJldHVybiBiaXRzd2FwXzMyKG51bSkgPj4gKDMyIC0gYml0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHJldmVyc2VfY29kZShjb25zdCB1aW50MTZfdCAqY29kZSwgY29uc3QgdWludDhfdCAqYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqcmV2ZXJzZWRfY29kZSwgaW50IG51bV9lbnRyaWVzKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgaSsrKSB7CisgICAgICAgIHJldmVyc2VkX2NvZGVbaV0gPSByZXZlcnNlKGNvZGVbaV0sIGJpdHNbaV0pOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBzcGVlZGhxX3N0YXRpY19pbml0KHZvaWQpCit7CisgICAgdWludDE2X3QgZmZfbXBlZzEyX3ZsY19kY19sdW1fY29kZV9yZXZlcnNlZFsxMl07CisgICAgdWludDE2X3QgZmZfbXBlZzEyX3ZsY19kY19jaHJvbWFfY29kZV9yZXZlcnNlZFsxMl07CisgICAgaW50IGk7CisKKyAgICAvKiBFeGFjdGx5IHRoZSBzYW1lIGFzIE1QRUctMiwgZXhjZXB0IGxpdHRsZS1lbmRpYW4uICovCisgICAgcmV2ZXJzZV9jb2RlKGZmX21wZWcxMl92bGNfZGNfbHVtX2NvZGUsCisgICAgICAgICAgICAgICAgIGZmX21wZWcxMl92bGNfZGNfbHVtX2JpdHMsCisgICAgICAgICAgICAgICAgIGZmX21wZWcxMl92bGNfZGNfbHVtX2NvZGVfcmV2ZXJzZWQsCisgICAgICAgICAgICAgICAgIDEyKTsKKyAgICBJTklUX0xFX1ZMQ19TVEFUSUMoJmZmX2RjX2x1bV92bGNfbGUsIERDX1ZMQ19CSVRTLCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX3ZsY19kY19sdW1fYml0cywgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX3ZsY19kY19sdW1fY29kZV9yZXZlcnNlZCwgMiwgMiwgNTEyKTsKKyAgICByZXZlcnNlX2NvZGUoZmZfbXBlZzEyX3ZsY19kY19jaHJvbWFfY29kZSwKKyAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX3ZsY19kY19jaHJvbWFfYml0cywKKyAgICAgICAgICAgICAgICAgZmZfbXBlZzEyX3ZsY19kY19jaHJvbWFfY29kZV9yZXZlcnNlZCwKKyAgICAgICAgICAgICAgICAgMTIpOworICAgIElOSVRfTEVfVkxDX1NUQVRJQygmZmZfZGNfY2hyb21hX3ZsY19sZSwgRENfVkxDX0JJVFMsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfdmxjX2RjX2Nocm9tYV9iaXRzLCAxLCAxLAorICAgICAgICAgICAgICAgICAgICAgICBmZl9tcGVnMTJfdmxjX2RjX2Nocm9tYV9jb2RlX3JldmVyc2VkLCAyLCAyLCA1MTQpOworCisgICAgLyogUmV2ZXJzZSB0aGUgQUMgVkxDLCBiZWNhdXNlIElOSVRfVkxDX0xFIHdhbnRzIGl0IGluIHRoYXQgb3JkZXIuICovCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNwZWVkaHFfdmxjKTsgKytpKSB7CisgICAgICAgIHNwZWVkaHFfdmxjW2ldWzBdID0gcmV2ZXJzZShzcGVlZGhxX3ZsY1tpXVswXSwgc3BlZWRocV92bGNbaV1bMV0pOworICAgIH0KKyAgICBmZl9ybF9pbml0KCZmZl9ybF9zcGVlZGhxLCBmZl9zcGVlZGhxX3N0YXRpY19ybF90YWJsZV9zdG9yZSk7CisgICAgSU5JVF8yRF9WTENfUkwoZmZfcmxfc3BlZWRocSwgNjc0LCBJTklUX1ZMQ19MRSk7CisKKyAgICBjb21wdXRlX2FscGhhX3ZsY3MoKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHNwZWVkaHFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGludCByZXQ7CisgICAgc3RhdGljIEFWT25jZSBpbml0X29uY2UgPSBBVl9PTkNFX0lOSVQ7CisgICAgU0hRQ29udGV4dCAqIGNvbnN0IHMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcy0+YXZjdHggPSBhdmN0eDsKKworICAgIHJldCA9IGZmX3RocmVhZF9vbmNlKCZpbml0X29uY2UsIHNwZWVkaHFfc3RhdGljX2luaXQpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZzLT5iZHNwLCBhdmN0eCk7CisgICAgZmZfaWRjdGRzcF9pbml0KCZzLT5pZHNwLCBhdmN0eCk7CisgICAgZmZfaW5pdF9zY2FudGFibGUocy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uLCAmcy0+aW50cmFfc2NhbnRhYmxlLCBmZl96aWd6YWdfZGlyZWN0KTsKKworICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX3RhZykgeworICAgIGNhc2UgTUtUQUcoJ1MnLCAnSCcsICdRJywgJzAnKToKKyAgICAgICAgcy0+c3Vic2FtcGxpbmcgPSBTSFFfU1VCU0FNUExJTkdfNDIwOworICAgICAgICBzLT5hbHBoYV90eXBlID0gU0hRX05PX0FMUEhBOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnUycsICdIJywgJ1EnLCAnMScpOgorICAgICAgICBzLT5zdWJzYW1wbGluZyA9IFNIUV9TVUJTQU1QTElOR180MjA7CisgICAgICAgIHMtPmFscGhhX3R5cGUgPSBTSFFfUkxFX0FMUEhBOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1MnLCAnSCcsICdRJywgJzInKToKKyAgICAgICAgcy0+c3Vic2FtcGxpbmcgPSBTSFFfU1VCU0FNUExJTkdfNDIyOworICAgICAgICBzLT5hbHBoYV90eXBlID0gU0hRX05PX0FMUEhBOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnUycsICdIJywgJ1EnLCAnMycpOgorICAgICAgICBzLT5zdWJzYW1wbGluZyA9IFNIUV9TVUJTQU1QTElOR180MjI7CisgICAgICAgIHMtPmFscGhhX3R5cGUgPSBTSFFfUkxFX0FMUEhBOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQyMlA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1MnLCAnSCcsICdRJywgJzQnKToKKyAgICAgICAgcy0+c3Vic2FtcGxpbmcgPSBTSFFfU1VCU0FNUExJTkdfNDQ0OworICAgICAgICBzLT5hbHBoYV90eXBlID0gU0hRX05PX0FMUEhBOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnUycsICdIJywgJ1EnLCAnNScpOgorICAgICAgICBzLT5zdWJzYW1wbGluZyA9IFNIUV9TVUJTQU1QTElOR180NDQ7CisgICAgICAgIHMtPmFscGhhX3R5cGUgPSBTSFFfUkxFX0FMUEhBOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1MnLCAnSCcsICdRJywgJzcnKToKKyAgICAgICAgcy0+c3Vic2FtcGxpbmcgPSBTSFFfU1VCU0FNUExJTkdfNDIyOworICAgICAgICBzLT5hbHBoYV90eXBlID0gU0hRX0RDVF9BTFBIQTsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdTJywgJ0gnLCAnUScsICc5Jyk6CisgICAgICAgIHMtPnN1YnNhbXBsaW5nID0gU0hRX1NVQlNBTVBMSU5HXzQ0NDsKKyAgICAgICAgcy0+YWxwaGFfdHlwZSA9IFNIUV9EQ1RfQUxQSEE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDQ0UDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIE5ld1RlayBTcGVlZEhRIEZPVVJDQyBwcm92aWRlZCAoJTA4WClcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWNfdGFnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogVGhpcyBtYXRjaGVzIHdoYXQgTkRJJ3MgUkdCIC0+IFknQ2JDciA0OjI6MiBjb252ZXJ0ZXIgdXNlcy4gKi8KKyAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOworICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uID0gQVZDSFJPTUFfTE9DX0NFTlRFUjsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3NwZWVkaHFfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic3BlZWRocSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5ld1RlayBTcGVlZEhRIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NQRUVESFEsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNIUUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHNwZWVkaHFfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gc3BlZWRocV9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3NydGRlYy5jIGIvbGliYXZjb2RlYy9zcnRkZWMuYwppbmRleCA1NDJkZDM1Li5lY2MwODAxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3NydGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvc3J0ZGVjLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJhc3MuaCIKICNpbmNsdWRlICJodG1sc3VidGl0bGVzLmgiCiAKLXN0YXRpYyB2b2lkIHNydF90b19hc3MoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkJQcmludCAqZHN0LAorc3RhdGljIGludCBzcnRfdG9fYXNzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZCUHJpbnQgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaW4sIGludCB4MSwgaW50IHkxLCBpbnQgeDIsIGludCB5MikKIHsKICAgICBpZiAoeDEgPj0gMCAmJiB5MSA+PSAwKSB7CkBAIC0zOCwxOCArMzgsMTggQEAKICAgICAgICAgICAgIC8qIHRleHQgcmVjdGFuZ2xlIGRlZmluZWQsIHdyaXRlIHRoZSB0ZXh0IGF0IHRoZSBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZSAqLwogICAgICAgICAgICAgY29uc3QgaW50IGN4ID0geDEgKyAoeDIgLSB4MSkvMjsKICAgICAgICAgICAgIGNvbnN0IGludCBjeSA9IHkxICsgKHkyIC0geTEpLzI7Ci0gICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVkX3ggPSBjeCAqIEFTU19ERUZBVUxUX1BMQVlSRVNYIC8gNzIwOwotICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlZF95ID0gY3kgKiBBU1NfREVGQVVMVF9QTEFZUkVTWSAvIDQ4MDsKKyAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZWRfeCA9IGN4ICogKGludDY0X3QpQVNTX0RFRkFVTFRfUExBWVJFU1ggLyA3MjA7CisgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVkX3kgPSBjeSAqIChpbnQ2NF90KUFTU19ERUZBVUxUX1BMQVlSRVNZIC8gNDgwOwogICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJ7XFxhbjV9e1xccG9zKCVkLCVkKX0iLCBzY2FsZWRfeCwgc2NhbGVkX3kpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogb25seSB0aGUgdG9wIGxlZnQgY29ybmVyLCBhc3N1bWUgdGhlIHRleHQgc3RhcnRzIGluIHRoYXQgY29ybmVyICovCi0gICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVkX3ggPSB4MSAqIEFTU19ERUZBVUxUX1BMQVlSRVNYIC8gNzIwOwotICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlZF95ID0geTEgKiBBU1NfREVGQVVMVF9QTEFZUkVTWSAvIDQ4MDsKKyAgICAgICAgICAgIGNvbnN0IGludCBzY2FsZWRfeCA9IHgxICogKGludDY0X3QpQVNTX0RFRkFVTFRfUExBWVJFU1ggLyA3MjA7CisgICAgICAgICAgICBjb25zdCBpbnQgc2NhbGVkX3kgPSB5MSAqIChpbnQ2NF90KUFTU19ERUZBVUxUX1BMQVlSRVNZIC8gNDgwOwogICAgICAgICAgICAgYXZfYnByaW50Zihkc3QsICJ7XFxhbjF9e1xccG9zKCVkLCVkKX0iLCBzY2FsZWRfeCwgc2NhbGVkX3kpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgZmZfaHRtbG1hcmt1cF90b19hc3MoYXZjdHgsIGRzdCwgaW4pOworICAgIHJldHVybiBmZl9odG1sbWFya3VwX3RvX2FzcyhhdmN0eCwgZHN0LCBpbik7CiB9CiAKIHN0YXRpYyBpbnQgc3J0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCkBAIC01Nyw5ICs1NywxMCBAQAogewogICAgIEFWU3VidGl0bGUgKnN1YiA9IGRhdGE7CiAgICAgQVZCUHJpbnQgYnVmZmVyOwotICAgIGludCB0c19zdGFydCwgdHNfZW5kLCB4MSA9IC0xLCB5MSA9IC0xLCB4MiA9IC0xLCB5MiA9IC0xOworICAgIGludCB4MSA9IC0xLCB5MSA9IC0xLCB4MiA9IC0xLCB5MiA9IC0xOwogICAgIGludCBzaXplLCByZXQ7CiAgICAgY29uc3QgdWludDhfdCAqcCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LCBBVl9QS1RfREFUQV9TVUJUSVRMRV9QT1NJVElPTiwgJnNpemUpOworICAgIEZGQVNTRGVjb2RlckNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogCiAgICAgaWYgKHAgJiYgc2l6ZSA9PSAxNikgewogICAgICAgICB4MSA9IEFWX1JMMzIocCAgICAgKTsKQEAgLTczLDE2ICs3NCw5IEBACiAKICAgICBhdl9icHJpbnRfaW5pdCgmYnVmZmVyLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwogCi0gICAgLy8gRG8gZmluYWwgZGl2aWRlLWJ5LTEwIG91dHNpZGUgcmVzY2FsZSB0byBmb3JjZSByb3VuZGluZyBkb3duLgotICAgIHRzX3N0YXJ0ID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwxMDB9KTsKLSAgICB0c19lbmQgICA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzICsgYXZwa3QtPmR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsMTAwfSk7Ci0KLSAgICBzcnRfdG9fYXNzKGF2Y3R4LCAmYnVmZmVyLCBhdnBrdC0+ZGF0YSwgeDEsIHkxLCB4MiwgeTIpOwotICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmYnVmZmVyLCB0c19zdGFydCwgdHNfZW5kLXRzX3N0YXJ0KTsKKyAgICByZXQgPSBzcnRfdG9fYXNzKGF2Y3R4LCAmYnVmZmVyLCBhdnBrdC0+ZGF0YSwgeDEsIHkxLCB4MiwgeTIpOworICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgcmV0ID0gZmZfYXNzX2FkZF9yZWN0KHN1YiwgYnVmZmVyLnN0ciwgcy0+cmVhZG9yZGVyKyssIDAsIE5VTEwsIE5VTEwpOwogICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmZmVyLCBOVUxMKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTEwMCw2ICs5NCw4IEBACiAgICAgLmlkICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NVQlJJUCwKICAgICAuaW5pdCAgICAgICAgID0gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0LAogICAgIC5kZWNvZGUgICAgICAgPSBzcnRfZGVjb2RlX2ZyYW1lLAorICAgIC5mbHVzaCAgICAgICAgPSBmZl9hc3NfZGVjb2Rlcl9mbHVzaCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZBU1NEZWNvZGVyQ29udGV4dCksCiB9OwogI2VuZGlmCiAKQEAgLTExMSw1ICsxMDcsNyBAQAogICAgIC5pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9TVUJSSVAsCiAgICAgLmluaXQgICAgICAgICA9IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdCwKICAgICAuZGVjb2RlICAgICAgID0gc3J0X2RlY29kZV9mcmFtZSwKKyAgICAuZmx1c2ggICAgICAgID0gZmZfYXNzX2RlY29kZXJfZmx1c2gsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGQVNTRGVjb2RlckNvbnRleHQpLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zcnRlbmMuYyBiL2xpYmF2Y29kZWMvc3J0ZW5jLmMKaW5kZXggMGE2ODc1YS4uMzRmMGYwZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy9zcnRlbmMuYworKysgYi9saWJhdmNvZGVjL3NydGVuYy5jCkBAIC0yMzIsMjMgKzIzMiw0MSBAQAogewogICAgIFNSVENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFTU0RpYWxvZyAqZGlhbG9nOwotICAgIGludCBpLCBudW07CisgICAgaW50IGk7CiAKICAgICBhdl9icHJpbnRfY2xlYXIoJnMtPmJ1ZmZlcik7CiAKICAgICBmb3IgKGk9MDsgaTxzdWItPm51bV9yZWN0czsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFzcyA9IHN1Yi0+cmVjdHNbaV0tPmFzczsKIAogICAgICAgICBpZiAoc3ViLT5yZWN0c1tpXS0+dHlwZSAhPSBTVUJUSVRMRV9BU1MpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBTVUJUSVRMRV9BU1MgdHlwZSBzdXBwb3J0ZWQuXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgICAgIH0KIAotICAgICAgICBkaWFsb2cgPSBmZl9hc3Nfc3BsaXRfZGlhbG9nKHMtPmFzc19jdHgsIHN1Yi0+cmVjdHNbaV0tPmFzcywgMCwgJm51bSk7Ci0gICAgICAgIGZvciAoOyBkaWFsb2cgJiYgbnVtLS07IGRpYWxvZysrKSB7CisjaWYgRkZfQVBJX0FTU19USU1JTkcKKyAgICAgICAgaWYgKCFzdHJuY21wKGFzcywgIkRpYWxvZ3VlOiAiLCAxMCkpIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBkaWFsb2cgPSBmZl9hc3Nfc3BsaXRfZGlhbG9nKHMtPmFzc19jdHgsIGFzcywgMCwgJm51bSk7CisgICAgICAgICAgICBmb3IgKDsgZGlhbG9nICYmIG51bS0tOyBkaWFsb2crKykgeworICAgICAgICAgICAgICAgIHMtPmFsaWdubWVudF9hcHBsaWVkID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NVQlJJUCkKKyAgICAgICAgICAgICAgICAgICAgc3J0X3N0eWxlX2FwcGx5KHMsIGRpYWxvZy0+c3R5bGUpOworICAgICAgICAgICAgICAgIGZmX2Fzc19zcGxpdF9vdmVycmlkZV9jb2RlcyhjYiwgcywgZGlhbG9nLT50ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICAgICAgZGlhbG9nID0gZmZfYXNzX3NwbGl0X2RpYWxvZzIocy0+YXNzX2N0eCwgYXNzKTsKKyAgICAgICAgICAgIGlmICghZGlhbG9nKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBzLT5hbGlnbm1lbnRfYXBwbGllZCA9IDA7Ci0gICAgICAgICAgICBzcnRfc3R5bGVfYXBwbHkocywgZGlhbG9nLT5zdHlsZSk7CisgICAgICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NVQlJJUCkKKyAgICAgICAgICAgICAgICBzcnRfc3R5bGVfYXBwbHkocywgZGlhbG9nLT5zdHlsZSk7CiAgICAgICAgICAgICBmZl9hc3Nfc3BsaXRfb3ZlcnJpZGVfY29kZXMoY2IsIHMsIGRpYWxvZy0+dGV4dCk7CisgICAgICAgICAgICBmZl9hc3NfZnJlZV9kaWFsb2coJmRpYWxvZyk7CisjaWYgRkZfQVBJX0FTU19USU1JTkcKICAgICAgICAgfQorI2VuZGlmCiAgICAgfQogCiAgICAgaWYgKCFhdl9icHJpbnRfaXNfY29tcGxldGUoJnMtPmJ1ZmZlcikpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3N1YnZpZXdlcmRlYy5jIGIvbGliYXZjb2RlYy9zdWJ2aWV3ZXJkZWMuYwppbmRleCBhMDA4ODI4Li44MDVjN2RkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3N1YnZpZXdlcmRlYy5jCisrKyBiL2xpYmF2Y29kZWMvc3Vidmlld2VyZGVjLmMKQEAgLTUyLDEzICs1MiwxMiBAQAogICAgIGludCByZXQgPSAwOwogICAgIEFWU3VidGl0bGUgKnN1YiA9IGRhdGE7CiAgICAgY29uc3QgY2hhciAqcHRyID0gYXZwa3QtPmRhdGE7CisgICAgRkZBU1NEZWNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgQVZCUHJpbnQgYnVmOwogCiAgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKLSAgICAvLyBub3RlOiBubyBuZWVkIHRvIHJlc2NhbGUgcHRzICYgZHVyYXRpb24gc2luY2UgdGhleSBhcmUgaW4gdGhlIHNhbWUKLSAgICAvLyB0aW1lYmFzZSBhcyBBU1MgKDEvMTAwKQogICAgIGlmIChwdHIgJiYgYXZwa3QtPnNpemUgPiAwICYmICFzdWJ2aWV3ZXJfZXZlbnRfdG9fYXNzKCZidWYsIHB0cikpCi0gICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdF9icHJpbnQoc3ViLCAmYnVmLCBhdnBrdC0+cHRzLCBhdnBrdC0+ZHVyYXRpb24pOworICAgICAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3Qoc3ViLCBidWYuc3RyLCBzLT5yZWFkb3JkZXIrKywgMCwgTlVMTCwgTlVMTCk7CiAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtNzMsNCArNzIsNiBAQAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1NVQlZJRVdFUiwKICAgICAuZGVjb2RlICAgICAgICAgPSBzdWJ2aWV3ZXJfZGVjb2RlX2ZyYW1lLAogICAgIC5pbml0ICAgICAgICAgICA9IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdCwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmZl9hc3NfZGVjb2Rlcl9mbHVzaCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZBU1NEZWNvZGVyQ29udGV4dCksCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zdW5yYXN0LmMgYi9saWJhdmNvZGVjL3N1bnJhc3QuYwppbmRleCAyNWUxMWY2Li4wYWY1NjI2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3N1bnJhc3QuYworKysgYi9saWJhdmNvZGVjL3N1bnJhc3QuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICBpZiAoYnVmX2VuZCAtIGJ1ZiA8IGxlbikKKyAgICAgICAgICAgIGlmIChidWZfZW5kIC0gYnVmIDwgYWxlbikKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIG1lbWNweShwdHIsIGJ1ZiwgbGVuKTsKICAgICAgICAgICAgIHB0ciArPSBzdHJpZGU7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3N2cTEuYyBiL2xpYmF2Y29kZWMvc3ZxMS5jCmluZGV4IDkwOWIwYmYuLmNjMjE0ZjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc3ZxMS5jCisrKyBiL2xpYmF2Y29kZWMvc3ZxMS5jCkBAIC0zLDggKzMsOCBAQAogICogcG9ydGVkIHRvIE1QbGF5ZXIgYnkgQXJwaSA8YXJwaUB0aG90LmJhbmtpLmh1PgogICogcG9ydGVkIHRvIGxpYmF2Y29kZWMgYnkgTmljayBLdXJzaGV2IDxuaWNrb2xzX2tAbWFpbC5ydT4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFhpbmUgUHJvamVjdAotICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBYaW5lIHByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBTVlExIEVuY29kZXIgKGMpIDIwMDQgTWlrZSBNZWxhbnNvbiA8bWVsYW5zb25AcGNpc3lzLm5ldD4KICAqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3N2cTEuaCBiL2xpYmF2Y29kZWMvc3ZxMS5oCmluZGV4IDg4ZDYxZDEuLjYzYzA0NzkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc3ZxMS5oCisrKyBiL2xpYmF2Y29kZWMvc3ZxMS5oCkBAIC0zLDggKzMsOCBAQAogICogcG9ydGVkIHRvIE1QbGF5ZXIgYnkgQXJwaSA8YXJwaUB0aG90LmJhbmtpLmh1PgogICogcG9ydGVkIHRvIGxpYmF2Y29kZWMgYnkgTmljayBLdXJzaGV2IDxuaWNrb2xzX2tAbWFpbC5ydT4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFhpbmUgUHJvamVjdAotICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBYaW5lIHByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBTVlExIEVuY29kZXIgKGMpIDIwMDQgTWlrZSBNZWxhbnNvbiA8bWVsYW5zb25AcGNpc3lzLm5ldD4KICAqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3N2cTFfY2IuaCBiL2xpYmF2Y29kZWMvc3ZxMV9jYi5oCmluZGV4IDQxNDg1ZDIuLjExZjc5NjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc3ZxMV9jYi5oCisrKyBiL2xpYmF2Y29kZWMvc3ZxMV9jYi5oCkBAIC0zLDggKzMsOCBAQAogICogcG9ydGVkIHRvIE1QbGF5ZXIgYnkgQXJwaSA8YXJwaUB0aG90LmJhbmtpLmh1PgogICogcG9ydGVkIHRvIGxpYmF2Y29kZWMgYnkgTmljayBLdXJzaGV2IDxuaWNrb2xzX2tAbWFpbC5ydT4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFhpbmUgUHJvamVjdAotICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBYaW5lIHByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zdnExX3ZsYy5oIGIvbGliYXZjb2RlYy9zdnExX3ZsYy5oCmluZGV4IGY1ZDI5OGQuLjA2ZTM1MDkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc3ZxMV92bGMuaAorKysgYi9saWJhdmNvZGVjL3N2cTFfdmxjLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZSBGRm1wZWcgcHJvamVjdAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3N2cTFkZWMuYyBiL2xpYmF2Y29kZWMvc3ZxMWRlYy5jCmluZGV4IGRjYTk5ZmEuLmQzZTYwYzMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc3ZxMWRlYy5jCisrKyBiL2xpYmF2Y29kZWMvc3ZxMWRlYy5jCkBAIC0zLDggKzMsOCBAQAogICogcG9ydGVkIHRvIE1QbGF5ZXIgYnkgQXJwaSA8YXJwaUB0aG90LmJhbmtpLmh1PgogICogcG9ydGVkIHRvIGxpYmF2Y29kZWMgYnkgTmljayBLdXJzaGV2IDxuaWNrb2xzX2tAbWFpbC5ydT4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgVGhlIFhpbmUgUHJvamVjdAotICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAyIFRoZSBYaW5lIHByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMiBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBTVlExIEVuY29kZXIgKGMpIDIwMDQgTWlrZSBNZWxhbnNvbiA8bWVsYW5zb25AcGNpc3lzLm5ldD4KICAqCkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICBuNCAgICA9IChtZWFuIDw8IDE2KSArIG1lYW47CiAKIHN0YXRpYyBpbnQgc3ZxMV9kZWNvZGVfYmxvY2tfaW50cmEoR2V0Qml0Q29udGV4dCAqYml0YnVmLCB1aW50OF90ICpwaXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHBpdGNoKQogewogICAgIHVpbnQzMl90IGJpdF9jYWNoZTsKICAgICB1aW50OF90ICpsaXN0WzYzXTsKQEAgLTIyMSw3ICsyMjEsNyBAQAogfQogCiBzdGF0aWMgaW50IHN2cTFfZGVjb2RlX2Jsb2NrX25vbl9pbnRyYShHZXRCaXRDb250ZXh0ICpiaXRidWYsIHVpbnQ4X3QgKnBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwaXRjaCkKIHsKICAgICB1aW50MzJfdCBiaXRfY2FjaGU7CiAgICAgdWludDhfdCAqbGlzdFs2M107CkBAIC0zMDcsNyArMzA3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgc3ZxMV9za2lwX2Jsb2NrKHVpbnQ4X3QgKmN1cnJlbnQsIHVpbnQ4X3QgKnByZXZpb3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgaW50IHgsIGludCB5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwaXRjaCwgaW50IHgsIGludCB5KQogewogICAgIHVpbnQ4X3QgKnNyYzsKICAgICB1aW50OF90ICpkc3Q7CkBAIC0zMjUsNyArMzI1LDcgQEAKIAogc3RhdGljIGludCBzdnExX21vdGlvbl9pbnRlcl9ibG9jayhIcGVsRFNQQ29udGV4dCAqaGRzcCwgR2V0Qml0Q29udGV4dCAqYml0YnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjdXJyZW50LCB1aW50OF90ICpwcmV2aW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLCBzdnExX3BtdiAqbW90aW9uLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwaXRjaCwgc3ZxMV9wbXYgKm1vdGlvbiwgaW50IHgsIGludCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAgICAgdWludDhfdCAqc3JjOwpAQCAtMzY4LDcgKzM2OCw3IEBACiAKIHN0YXRpYyBpbnQgc3ZxMV9tb3Rpb25faW50ZXJfNHZfYmxvY2soSHBlbERTUENvbnRleHQgKmhkc3AsIEdldEJpdENvbnRleHQgKmJpdGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqY3VycmVudCwgdWludDhfdCAqcHJldmlvdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaCwgc3ZxMV9wbXYgKm1vdGlvbiwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcGl0Y2gsIHN2cTFfcG12ICptb3Rpb24sIGludCB4LCBpbnQgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIHVpbnQ4X3QgKnNyYzsKQEAgLTQ0Niw3ICs0NDYsNyBAQAogc3RhdGljIGludCBzdnExX2RlY29kZV9kZWx0YV9ibG9jayhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEhwZWxEU1BDb250ZXh0ICpoZHNwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRDb250ZXh0ICpiaXRidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmN1cnJlbnQsIHVpbnQ4X3QgKnByZXZpb3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsIHN2cTFfcG12ICptb3Rpb24sIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHBpdGNoLCBzdnExX3BtdiAqbW90aW9uLCBpbnQgeCwgaW50IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKIHsKICAgICB1aW50MzJfdCBibG9ja190eXBlOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zdnExZW5jLmMgYi9saWJhdmNvZGVjL3N2cTFlbmMuYwppbmRleCBkOTY4ZDM2Li44MGE4YWYxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3N2cTFlbmMuYworKysgYi9saWJhdmNvZGVjL3N2cTFlbmMuYwpAQCAtMTUyLDcgKzE1Miw3IEBACiAgICAgICAgICAgICAgICAgdmVjdG9yID0gY29kZWJvb2sgKyBzdGFnZSAqIHNpemUgKiAxNiArIGkgKiBzaXplOwogICAgICAgICAgICAgICAgIHNxciAgICA9IHMtPnNzZF9pbnQ4X3ZzX2ludDE2KHZlY3RvciwgYmxvY2tbc3RhZ2VdLCBzaXplKTsKICAgICAgICAgICAgICAgICBkaWZmICAgPSBibG9ja19zdW1bc3RhZ2VdIC0gc3VtOwotICAgICAgICAgICAgICAgIHNjb3JlICA9IHNxciAtIChkaWZmICogKGludDY0X3QpZGlmZiA+PiAobGV2ZWwgKyAzKSk7IC8vIEZJWE1FOiA2NGJpdCBzbG9vb3cKKyAgICAgICAgICAgICAgICBzY29yZSAgPSBzcXIgLSAoZGlmZiAqIChpbnQ2NF90KWRpZmYgPj4gKGxldmVsICsgMykpOyAvLyBGSVhNRTogNjQgYml0cyBzbG9vb3cKICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X3ZlY3Rvcl9zY29yZSkgewogICAgICAgICAgICAgICAgICAgICBpbnQgbWVhbiA9IGRpZmYgKyAoc2l6ZSA+PiAxKSA+PiAobGV2ZWwgKyAzKTsKICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihtZWFuID4gLTMwMCAmJiBtZWFuIDwgMzAwKTsKQEAgLTI4MywxOSArMjgzLDYgQEAKICAgICAgICAgcy0+bS5iOF9zdHJpZGUgICAgICAgICAgICAgICAgICAgICA9IDIgKiBzLT5tLm1iX3dpZHRoICsgMTsKICAgICAgICAgcy0+bS5mX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgIHMtPm0ucGljdF90eXBlICAgICAgICAgICAgICAgICAgICAgPSBzLT5waWN0X3R5cGU7Ci0jaWYgRkZfQVBJX01PVElPTl9FU1QKLUZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSAgICAgICAgcy0+bS5tZV9tZXRob2QgICAgICAgICAgICAgICAgICAgICA9IHMtPmF2Y3R4LT5tZV9tZXRob2Q7Ci0gICAgICAgIGlmIChzLT5tb3Rpb25fZXN0ID09IEZGX01FX0VQWlMpIHsKLSAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+bWVfbWV0aG9kID09IE1FX1pFUk8pCi0gICAgICAgICAgICAgICAgcy0+bW90aW9uX2VzdCA9IEZGX01FX1pFUk87Ci0gICAgICAgICAgICBlbHNlIGlmIChzLT5hdmN0eC0+bWVfbWV0aG9kID09IE1FX0VQWlMpCi0gICAgICAgICAgICAgICAgcy0+bW90aW9uX2VzdCA9IEZGX01FX0VQWlM7Ci0gICAgICAgICAgICBlbHNlIGlmIChzLT5hdmN0eC0+bWVfbWV0aG9kID09IE1FX1gxKQotICAgICAgICAgICAgICAgIHMtPm1vdGlvbl9lc3QgPSBGRl9NRV9YT05FOwotICAgICAgICB9Ci1GRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSNlbmRpZgogICAgICAgICBzLT5tLm1vdGlvbl9lc3QgICAgICAgICAgICAgICAgICAgID0gcy0+bW90aW9uX2VzdDsKICAgICAgICAgcy0+bS5tZS5zY2VuZV9jaGFuZ2Vfc2NvcmUgICAgICAgICA9IDA7CiAgICAgICAgIC8vIHMtPm0ub3V0X2Zvcm1hdCAgICAgICAgICAgICAgICAgICAgPSBGTVRfSDI2MzsKQEAgLTY0MSwxNSArNjI4LDE3IEBACiAgICAgZmZfc2lkZV9kYXRhX3NldF9lbmNvZGVyX3N0YXRzKHBrdCwgcGljdC0+cXVhbGl0eSwgTlVMTCwgMCwgcy0+cGljdF90eXBlKTsKIAogICAgIHN2cTFfd3JpdGVfaGVhZGVyKHMsIHMtPnBpY3RfdHlwZSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgaWYgKHN2cTFfZW5jb2RlX3BsYW5lKHMsIGksCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBpbnQgcmV0ID0gc3ZxMV9lbmNvZGVfcGxhbmUocywgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3QtPmRhdGFbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X3BpY3R1cmUtPmRhdGFbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUtPmRhdGFbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV93aWR0aCAgLyAoaSA/IDQgOiAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lX2hlaWdodCAvIChpID8gNCA6IDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdC0+bGluZXNpemVbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJyZW50X3BpY3R1cmUtPmxpbmVzaXplW2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS0+bGluZXNpemVbaV0pOworICAgICAgICBlbW1zX2MoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgIGludCBqOwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGk7IGorKykgewogICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5tb3Rpb25fdmFsOFtqXSk7CkBAIC02NTgsNiArNjQ3LDcgQEAKICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5zY3JhdGNoYnVmKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQorICAgIH0KIAogICAgIC8vIGF2cHJpdl9hbGlnbl9wdXRfYml0cygmcy0+cGIpOwogICAgIHdoaWxlIChwdXRfYml0c19jb3VudCgmcy0+cGIpICYgMzEpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3N2cTFlbmMuaCBiL2xpYmF2Y29kZWMvc3ZxMWVuYy5oCmluZGV4IDM3ZjA1YTAuLmI0ZWY3NjMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc3ZxMWVuYy5oCisrKyBiL2xpYmF2Y29kZWMvc3ZxMWVuYy5oCkBAIC0yNCw4ICsyNCw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKwogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImhwZWxkc3AuaCIKICNpbmNsdWRlICJtZV9jbXAuaCIKICNpbmNsdWRlICJtcGVndmlkZW8uaCIKQEAgLTQyLDcgKzQyLDYgQEAKICAgICBBVkZyYW1lICpjdXJyZW50X3BpY3R1cmU7CiAgICAgQVZGcmFtZSAqbGFzdF9waWN0dXJlOwogICAgIFB1dEJpdENvbnRleHQgcGI7Ci0gICAgR2V0Qml0Q29udGV4dCBnYjsKIAogICAgIC8qIFNvbWUgY29tcHJlc3Npb24gc3RhdGlzdGljcyAqLwogICAgIGVudW0gQVZQaWN0dXJlVHlwZSBwaWN0X3R5cGU7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3N2cTMuYyBiL2xpYmF2Y29kZWMvc3ZxMy5jCmluZGV4IDU3MjA1YzYuLjE4YTQ0NDggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvc3ZxMy5jCisrKyBiL2xpYmF2Y29kZWMvc3ZxMy5jCkBAIC00Niw0MCArNDYsNTggQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJtcGVndXRpbHMuaCIKLSNpbmNsdWRlICJoMjY0LmgiCi0KLSNpbmNsdWRlICJoMjY0ZGF0YS5oIiAvLyBGSVhNRSBGSVhNRSBGSVhNRQotCi0jaW5jbHVkZSAiaDI2NF9tdnByZWQuaCIKKyNpbmNsdWRlICJoMjY0ZGVjLmgiCisjaW5jbHVkZSAiaDI2NGRhdGEuaCIKICNpbmNsdWRlICJnb2xvbWIuaCIKICNpbmNsdWRlICJocGVsZHNwLmgiCisjaW5jbHVkZSAibWF0aG9wcy5oIgogI2luY2x1ZGUgInJlY3RhbmdsZS5oIgogI2luY2x1ZGUgInRwZWxkc3AuaCIKLSNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgogCiAjaWYgQ09ORklHX1pMSUIKICNpbmNsdWRlIDx6bGliLmg+CiAjZW5kaWYKIAogI2luY2x1ZGUgInN2cTEuaCIKLSNpbmNsdWRlICJzdnEzLmgiCiAKIC8qKgogICogQGZpbGUKICAqIHN2cTMgZGVjb2Rlci4KICAqLwogCit0eXBlZGVmIHN0cnVjdCBTVlEzRnJhbWUgeworICAgIEFWRnJhbWUgKmY7CisKKyAgICBBVkJ1ZmZlclJlZiAqbW90aW9uX3ZhbF9idWZbMl07CisgICAgaW50MTZfdCAoKm1vdGlvbl92YWxbMl0pWzJdOworCisgICAgQVZCdWZmZXJSZWYgKm1iX3R5cGVfYnVmOworICAgIHVpbnQzMl90ICptYl90eXBlOworCisKKyAgICBBVkJ1ZmZlclJlZiAqcmVmX2luZGV4X2J1ZlsyXTsKKyAgICBpbnQ4X3QgKnJlZl9pbmRleFsyXTsKK30gU1ZRM0ZyYW1lOworCiB0eXBlZGVmIHN0cnVjdCBTVlEzQ29udGV4dCB7Ci0gICAgSDI2NENvbnRleHQgaDsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisKKyAgICBIMjY0RFNQQ29udGV4dCAgaDI2NGRzcDsKKyAgICBIMjY0UHJlZENvbnRleHQgaHBjOwogICAgIEhwZWxEU1BDb250ZXh0IGhkc3A7CiAgICAgVHBlbERTUENvbnRleHQgdGRzcDsKLSAgICBIMjY0UGljdHVyZSAqY3VyX3BpYzsKLSAgICBIMjY0UGljdHVyZSAqbmV4dF9waWM7Ci0gICAgSDI2NFBpY3R1cmUgKmxhc3RfcGljOworICAgIFZpZGVvRFNQQ29udGV4dCB2ZHNwOworCisgICAgU1ZRM0ZyYW1lICpjdXJfcGljOworICAgIFNWUTNGcmFtZSAqbmV4dF9waWM7CisgICAgU1ZRM0ZyYW1lICpsYXN0X3BpYzsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIEdldEJpdENvbnRleHQgZ2Jfc2xpY2U7CisgICAgdWludDhfdCAqc2xpY2VfYnVmOworICAgIGludCBzbGljZV9zaXplOwogICAgIGludCBoYWxmcGVsX2ZsYWc7CiAgICAgaW50IHRoaXJkcGVsX2ZsYWc7CiAgICAgaW50IGhhc193YXRlcm1hcms7Ci0gICAgaW50IG5leHRfc2xpY2VfaW5kZXg7CiAgICAgdWludDMyX3Qgd2F0ZXJtYXJrX2tleTsKICAgICB1aW50OF90ICpidWY7CiAgICAgaW50IGJ1Zl9zaXplOwpAQCAtODgsNiArMTA2LDQ1IEBACiAgICAgaW50IGhfZWRnZV9wb3M7CiAgICAgaW50IHZfZWRnZV9wb3M7CiAgICAgaW50IGxhc3RfZnJhbWVfb3V0cHV0OworICAgIGludCBzbGljZV9udW07CisgICAgaW50IHFzY2FsZTsKKyAgICBpbnQgY2JwOworICAgIGludCBmcmFtZV9udW07CisgICAgaW50IGZyYW1lX251bV9vZmZzZXQ7CisgICAgaW50IHByZXZfZnJhbWVfbnVtX29mZnNldDsKKyAgICBpbnQgcHJldl9mcmFtZV9udW07CisKKyAgICBlbnVtIEFWUGljdHVyZVR5cGUgcGljdF90eXBlOworICAgIGVudW0gQVZQaWN0dXJlVHlwZSBzbGljZV90eXBlOworICAgIGludCBsb3dfZGVsYXk7CisKKyAgICBpbnQgbWJfeCwgbWJfeTsKKyAgICBpbnQgbWJfeHk7CisgICAgaW50IG1iX3dpZHRoLCBtYl9oZWlnaHQ7CisgICAgaW50IG1iX3N0cmlkZSwgbWJfbnVtOworICAgIGludCBiX3N0cmlkZTsKKworICAgIHVpbnQzMl90ICptYjJicl94eTsKKworICAgIGludCBjaHJvbWFfcHJlZF9tb2RlOworICAgIGludCBpbnRyYTE2eDE2X3ByZWRfbW9kZTsKKworICAgIGludDhfdCAgIGludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs1ICogOF07CisgICAgaW50OF90ICgqaW50cmE0eDRfcHJlZF9tb2RlKTsKKworICAgIHVuc2lnbmVkIGludCB0b3Bfc2FtcGxlc19hdmFpbGFibGU7CisgICAgdW5zaWduZWQgaW50IHRvcHJpZ2h0X3NhbXBsZXNfYXZhaWxhYmxlOworICAgIHVuc2lnbmVkIGludCBsZWZ0X3NhbXBsZXNfYXZhaWxhYmxlOworCisgICAgdWludDhfdCAqZWRnZV9lbXVfYnVmZmVyOworCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBtdl9jYWNoZSlbMl1bNSAqIDhdWzJdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCAgaW50OF90LCByZWZfY2FjaGUpWzJdWzUgKiA4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDE2X3QsIG1iKVsxNiAqIDQ4ICogMl07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBtYl9sdW1hX2RjKVszXVsxNiAqIDJdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBub25femVyb19jb3VudF9jYWNoZSlbMTUgKiA4XTsKKyAgICB1aW50MzJfdCBkZXF1YW50NF9jb2VmZltRUF9NQVhfTlVNICsgMV1bMTZdOworICAgIGludCBibG9ja19vZmZzZXRbMiAqICgxNiAqIDMpXTsKIH0gU1ZRM0NvbnRleHQ7CiAKICNkZWZpbmUgRlVMTFBFTF9NT0RFICAxCkBAIC05NSw3ICsxNTIsNyBAQAogI2RlZmluZSBUSElSRFBFTF9NT0RFIDMKICNkZWZpbmUgUFJFRElDVF9NT0RFICA0CiAKLS8qIGR1YWwgc2NhbiAoZnJvbSBzb21lIG9sZGVyIGgyNjQgZHJhZnQpCisvKiBkdWFsIHNjYW4gKGZyb20gc29tZSBvbGRlciBILjI2NCBkcmFmdCkKICAqIG8tLT5vLS0+byAgIG8KICAqICAgICAgICAgfCAgL3wKICAqIG8gICBvICAgbyAvIG8KQEAgLTE2NCw5ICsyMjEsOSBAQAogCiBzdGF0aWMgaW50IHN2cTNfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwogCi12b2lkIGZmX3N2cTNfbHVtYV9kY19kZXF1YW50X2lkY3RfYyhpbnQxNl90ICpvdXRwdXQsIGludDE2X3QgKmlucHV0LCBpbnQgcXApCitzdGF0aWMgdm9pZCBzdnEzX2x1bWFfZGNfZGVxdWFudF9pZGN0X2MoaW50MTZfdCAqb3V0cHV0LCBpbnQxNl90ICppbnB1dCwgaW50IHFwKQogewotICAgIGNvbnN0IGludCBxbXVsID0gc3ZxM19kZXF1YW50X2NvZWZmW3FwXTsKKyAgICBjb25zdCB1bnNpZ25lZCBxbXVsID0gc3ZxM19kZXF1YW50X2NvZWZmW3FwXTsKICNkZWZpbmUgc3RyaWRlIDE2CiAgICAgaW50IGk7CiAgICAgaW50IHRlbXBbMTZdOwpAQCAtMTkxLDIyICsyNDgsMjIgQEAKICAgICAgICAgY29uc3QgaW50IHoyICAgICA9ICA3ICogIHRlbXBbNCAqIDEgKyBpXSAtIDE3ICogdGVtcFs0ICogMyArIGldOwogICAgICAgICBjb25zdCBpbnQgejMgICAgID0gMTcgKiAgdGVtcFs0ICogMSArIGldICsgIDcgKiB0ZW1wWzQgKiAzICsgaV07CiAKLSAgICAgICAgb3V0cHV0W3N0cmlkZSAqICAwICsgb2Zmc2V0XSA9ICh6MCArIHozKSAqIHFtdWwgKyAweDgwMDAwID4+IDIwOwotICAgICAgICBvdXRwdXRbc3RyaWRlICogIDIgKyBvZmZzZXRdID0gKHoxICsgejIpICogcW11bCArIDB4ODAwMDAgPj4gMjA7Ci0gICAgICAgIG91dHB1dFtzdHJpZGUgKiAgOCArIG9mZnNldF0gPSAoejEgLSB6MikgKiBxbXVsICsgMHg4MDAwMCA+PiAyMDsKLSAgICAgICAgb3V0cHV0W3N0cmlkZSAqIDEwICsgb2Zmc2V0XSA9ICh6MCAtIHozKSAqIHFtdWwgKyAweDgwMDAwID4+IDIwOworICAgICAgICBvdXRwdXRbc3RyaWRlICogIDAgKyBvZmZzZXRdID0gKGludCkoKHowICsgejMpICogcW11bCArIDB4ODAwMDApID4+IDIwOworICAgICAgICBvdXRwdXRbc3RyaWRlICogIDIgKyBvZmZzZXRdID0gKGludCkoKHoxICsgejIpICogcW11bCArIDB4ODAwMDApID4+IDIwOworICAgICAgICBvdXRwdXRbc3RyaWRlICogIDggKyBvZmZzZXRdID0gKGludCkoKHoxIC0gejIpICogcW11bCArIDB4ODAwMDApID4+IDIwOworICAgICAgICBvdXRwdXRbc3RyaWRlICogMTAgKyBvZmZzZXRdID0gKGludCkoKHowIC0gejMpICogcW11bCArIDB4ODAwMDApID4+IDIwOwogICAgIH0KIH0KICN1bmRlZiBzdHJpZGUKIAotdm9pZCBmZl9zdnEzX2FkZF9pZGN0X2ModWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBxcCwgaW50IGRjKQorc3RhdGljIHZvaWQgc3ZxM19hZGRfaWRjdF9jKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IHFwLCBpbnQgZGMpCiB7CiAgICAgY29uc3QgaW50IHFtdWwgPSBzdnEzX2RlcXVhbnRfY29lZmZbcXBdOwogICAgIGludCBpOwogCiAgICAgaWYgKGRjKSB7Ci0gICAgICAgIGRjICAgICAgID0gMTMgKiAxMyAqIChkYyA9PSAxID8gMTUzOCAqIGJsb2NrWzBdCisgICAgICAgIGRjICAgICAgID0gMTMgKiAxMyAqIChkYyA9PSAxID8gMTUzOFUqIGJsb2NrWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcW11bCAqIChibG9ja1swXSA+PiAzKSAvIDIpOwogICAgICAgICBibG9ja1swXSA9IDA7CiAgICAgfQpAQCAtMjI0LDE2ICsyODEsMTYgQEAKICAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGludCB6MCA9IDEzICogKGJsb2NrW2kgKyA0ICogMF0gKyAgICAgIGJsb2NrW2kgKyA0ICogMl0pOwotICAgICAgICBjb25zdCBpbnQgejEgPSAxMyAqIChibG9ja1tpICsgNCAqIDBdIC0gICAgICBibG9ja1tpICsgNCAqIDJdKTsKLSAgICAgICAgY29uc3QgaW50IHoyID0gIDcgKiAgYmxvY2tbaSArIDQgKiAxXSAtIDE3ICogYmxvY2tbaSArIDQgKiAzXTsKLSAgICAgICAgY29uc3QgaW50IHozID0gMTcgKiAgYmxvY2tbaSArIDQgKiAxXSArICA3ICogYmxvY2tbaSArIDQgKiAzXTsKLSAgICAgICAgY29uc3QgaW50IHJyID0gKGRjICsgMHg4MDAwMCk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHowID0gMTMgKiAoYmxvY2tbaSArIDQgKiAwXSArICAgICAgYmxvY2tbaSArIDQgKiAyXSk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHoxID0gMTMgKiAoYmxvY2tbaSArIDQgKiAwXSAtICAgICAgYmxvY2tbaSArIDQgKiAyXSk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHoyID0gIDcgKiAgYmxvY2tbaSArIDQgKiAxXSAtIDE3ICogYmxvY2tbaSArIDQgKiAzXTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgejMgPSAxNyAqICBibG9ja1tpICsgNCAqIDFdICsgIDcgKiBibG9ja1tpICsgNCAqIDNdOworICAgICAgICBjb25zdCBpbnQgcnIgPSAoZGMgKyAweDgwMDAwdSk7CiAKLSAgICAgICAgZHN0W2kgKyBzdHJpZGUgKiAwXSA9IGF2X2NsaXBfdWludDgoZHN0W2kgKyBzdHJpZGUgKiAwXSArICgoejAgKyB6MykgKiBxbXVsICsgcnIgPj4gMjApKTsKLSAgICAgICAgZHN0W2kgKyBzdHJpZGUgKiAxXSA9IGF2X2NsaXBfdWludDgoZHN0W2kgKyBzdHJpZGUgKiAxXSArICgoejEgKyB6MikgKiBxbXVsICsgcnIgPj4gMjApKTsKLSAgICAgICAgZHN0W2kgKyBzdHJpZGUgKiAyXSA9IGF2X2NsaXBfdWludDgoZHN0W2kgKyBzdHJpZGUgKiAyXSArICgoejEgLSB6MikgKiBxbXVsICsgcnIgPj4gMjApKTsKLSAgICAgICAgZHN0W2kgKyBzdHJpZGUgKiAzXSA9IGF2X2NsaXBfdWludDgoZHN0W2kgKyBzdHJpZGUgKiAzXSArICgoejAgLSB6MykgKiBxbXVsICsgcnIgPj4gMjApKTsKKyAgICAgICAgZHN0W2kgKyBzdHJpZGUgKiAwXSA9IGF2X2NsaXBfdWludDgoZHN0W2kgKyBzdHJpZGUgKiAwXSArICgoaW50KSgoejAgKyB6MykgKiBxbXVsICsgcnIpID4+IDIwKSk7CisgICAgICAgIGRzdFtpICsgc3RyaWRlICogMV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFtpICsgc3RyaWRlICogMV0gKyAoKGludCkoKHoxICsgejIpICogcW11bCArIHJyKSA+PiAyMCkpOworICAgICAgICBkc3RbaSArIHN0cmlkZSAqIDJdID0gYXZfY2xpcF91aW50OChkc3RbaSArIHN0cmlkZSAqIDJdICsgKChpbnQpKCh6MSAtIHoyKSAqIHFtdWwgKyBycikgPj4gMjApKTsKKyAgICAgICAgZHN0W2kgKyBzdHJpZGUgKiAzXSA9IGF2X2NsaXBfdWludDgoZHN0W2kgKyBzdHJpZGUgKiAzXSArICgoaW50KSgoejAgLSB6MykgKiBxbXVsICsgcnIpID4+IDIwKSk7CiAgICAgfQogCiAgICAgbWVtc2V0KGJsb2NrLCAwLCAxNiAqIHNpemVvZihpbnQxNl90KSk7CkBAIC0yNDIsOCArMjk5LDkgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHN2cTNfZGVjb2RlX2Jsb2NrKEdldEJpdENvbnRleHQgKmdiLCBpbnQxNl90ICpibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgY29uc3QgaW50IHR5cGUpCiB7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IHNjYW5fcGF0dGVybnNbNF0gPQotICAgIHsgbHVtYV9kY196aWd6YWdfc2NhbiwgemlnemFnX3NjYW4sIHN2cTNfc2NhbiwgY2hyb21hX2RjX3NjYW4gfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCAqY29uc3Qgc2Nhbl9wYXR0ZXJuc1s0XSA9IHsKKyAgICAgICAgbHVtYV9kY196aWd6YWdfc2NhbiwgZmZfemlnemFnX3NjYW4sIHN2cTNfc2NhbiwgZmZfaDI2NF9jaHJvbWFfZGNfc2NhbgorICAgIH07CiAKICAgICBpbnQgcnVuLCBsZXZlbCwgc2lnbiwgbGltaXQ7CiAgICAgdW5zaWduZWQgdmxjOwpAQCAtMjUxLDcgKzMwOSw3IEBACiAgICAgY29uc3QgdWludDhfdCAqY29uc3Qgc2NhbiA9IHNjYW5fcGF0dGVybnNbdHlwZV07CiAKICAgICBmb3IgKGxpbWl0ID0gKDE2ID4+IGludHJhKTsgaW5kZXggPCAxNjsgaW5kZXggPSBsaW1pdCwgbGltaXQgKz0gOCkgewotICAgICAgICBmb3IgKDsgKHZsYyA9IHN2cTNfZ2V0X3VlX2dvbG9tYihnYikpICE9IDA7IGluZGV4KyspIHsKKyAgICAgICAgZm9yICg7ICh2bGMgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKGdiKSkgIT0gMDsgaW5kZXgrKykgewogICAgICAgICAgICAgaWYgKChpbnQzMl90KXZsYyA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogCkBAIC0yOTcsMTcgKzM1NSw4OCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQKK3N2cTNfZmV0Y2hfZGlhZ29uYWxfbXYoY29uc3QgU1ZRM0NvbnRleHQgKnMsIGNvbnN0IGludDE2X3QgKipDLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxpc3QsIGludCBwYXJ0X3dpZHRoKQoreworICAgIGNvbnN0IGludCB0b3ByaWdodF9yZWYgPSBzLT5yZWZfY2FjaGVbbGlzdF1baSAtIDggKyBwYXJ0X3dpZHRoXTsKKworICAgIGlmICh0b3ByaWdodF9yZWYgIT0gUEFSVF9OT1RfQVZBSUxBQkxFKSB7CisgICAgICAgICpDID0gcy0+bXZfY2FjaGVbbGlzdF1baSAtIDggKyBwYXJ0X3dpZHRoXTsKKyAgICAgICAgcmV0dXJuIHRvcHJpZ2h0X3JlZjsKKyAgICB9IGVsc2UgeworICAgICAgICAqQyA9IHMtPm12X2NhY2hlW2xpc3RdW2kgLSA4IC0gMV07CisgICAgICAgIHJldHVybiBzLT5yZWZfY2FjaGVbbGlzdF1baSAtIDggLSAxXTsKKyAgICB9Cit9CisKKy8qKgorICogR2V0IHRoZSBwcmVkaWN0ZWQgTVYuCisgKiBAcGFyYW0gbiB0aGUgYmxvY2sgaW5kZXgKKyAqIEBwYXJhbSBwYXJ0X3dpZHRoIHRoZSB3aWR0aCBvZiB0aGUgcGFydGl0aW9uICg0LCA4LDE2KSAtPiAoMSwgMiwgNCkKKyAqIEBwYXJhbSBteCB0aGUgeCBjb21wb25lbnQgb2YgdGhlIHByZWRpY3RlZCBtb3Rpb24gdmVjdG9yCisgKiBAcGFyYW0gbXkgdGhlIHkgY29tcG9uZW50IG9mIHRoZSBwcmVkaWN0ZWQgbW90aW9uIHZlY3RvcgorICovCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHN2cTNfcHJlZF9tb3Rpb24oY29uc3QgU1ZRM0NvbnRleHQgKnMsIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJ0X3dpZHRoLCBpbnQgbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmLCBpbnQgKmNvbnN0IG14LCBpbnQgKmNvbnN0IG15KQoreworICAgIGNvbnN0IGludCBpbmRleDggICAgICAgPSBzY2FuOFtuXTsKKyAgICBjb25zdCBpbnQgdG9wX3JlZiAgICAgID0gcy0+cmVmX2NhY2hlW2xpc3RdW2luZGV4OCAtIDhdOworICAgIGNvbnN0IGludCBsZWZ0X3JlZiAgICAgPSBzLT5yZWZfY2FjaGVbbGlzdF1baW5kZXg4IC0gMV07CisgICAgY29uc3QgaW50MTZfdCAqY29uc3QgQSA9IHMtPm12X2NhY2hlW2xpc3RdW2luZGV4OCAtIDFdOworICAgIGNvbnN0IGludDE2X3QgKmNvbnN0IEIgPSBzLT5tdl9jYWNoZVtsaXN0XVtpbmRleDggLSA4XTsKKyAgICBjb25zdCBpbnQxNl90ICpDOworICAgIGludCBkaWFnb25hbF9yZWYsIG1hdGNoX2NvdW50OworCisvKiBtdl9jYWNoZQorICogQiAuIC4gQSBUIFQgVCBUCisgKiBVIC4gLiBMIC4gLiAsIC4KKyAqIFUgLiAuIEwgLiAuIC4gLgorICogVSAuIC4gTCAuIC4gLCAuCisgKiAuIC4gLiBMIC4gLiAuIC4KKyAqLworCisgICAgZGlhZ29uYWxfcmVmID0gc3ZxM19mZXRjaF9kaWFnb25hbF9tdihzLCAmQywgaW5kZXg4LCBsaXN0LCBwYXJ0X3dpZHRoKTsKKyAgICBtYXRjaF9jb3VudCAgPSAoZGlhZ29uYWxfcmVmID09IHJlZikgKyAodG9wX3JlZiA9PSByZWYpICsgKGxlZnRfcmVmID09IHJlZik7CisgICAgaWYgKG1hdGNoX2NvdW50ID4gMSkgeyAvL21vc3QgY29tbW9uCisgICAgICAgICpteCA9IG1pZF9wcmVkKEFbMF0sIEJbMF0sIENbMF0pOworICAgICAgICAqbXkgPSBtaWRfcHJlZChBWzFdLCBCWzFdLCBDWzFdKTsKKyAgICB9IGVsc2UgaWYgKG1hdGNoX2NvdW50ID09IDEpIHsKKyAgICAgICAgaWYgKGxlZnRfcmVmID09IHJlZikgeworICAgICAgICAgICAgKm14ID0gQVswXTsKKyAgICAgICAgICAgICpteSA9IEFbMV07CisgICAgICAgIH0gZWxzZSBpZiAodG9wX3JlZiA9PSByZWYpIHsKKyAgICAgICAgICAgICpteCA9IEJbMF07CisgICAgICAgICAgICAqbXkgPSBCWzFdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm14ID0gQ1swXTsKKyAgICAgICAgICAgICpteSA9IENbMV07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAodG9wX3JlZiAgICAgID09IFBBUlRfTk9UX0FWQUlMQUJMRSAmJgorICAgICAgICAgICAgZGlhZ29uYWxfcmVmID09IFBBUlRfTk9UX0FWQUlMQUJMRSAmJgorICAgICAgICAgICAgbGVmdF9yZWYgICAgICE9IFBBUlRfTk9UX0FWQUlMQUJMRSkgeworICAgICAgICAgICAgKm14ID0gQVswXTsKKyAgICAgICAgICAgICpteSA9IEFbMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqbXggPSBtaWRfcHJlZChBWzBdLCBCWzBdLCBDWzBdKTsKKyAgICAgICAgICAgICpteSA9IG1pZF9wcmVkKEFbMV0sIEJbMV0sIENbMV0pOworICAgICAgICB9CisgICAgfQorfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc3ZxM19tY19kaXJfcGFydChTVlEzQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14LCBpbnQgbXksIGludCBkeHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhpcmRwZWwsIGludCBkaXIsIGludCBhdmcpCiB7Ci0gICAgSDI2NENvbnRleHQgKmggPSAmcy0+aDsKLSAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCA9ICZoLT5zbGljZV9jdHhbMF07Ci0gICAgY29uc3QgSDI2NFBpY3R1cmUgKnBpYyA9IChkaXIgPT0gMCkgPyBzLT5sYXN0X3BpYyA6IHMtPm5leHRfcGljOworICAgIGNvbnN0IFNWUTNGcmFtZSAqcGljID0gKGRpciA9PSAwKSA/IHMtPmxhc3RfcGljIDogcy0+bmV4dF9waWM7CiAgICAgdWludDhfdCAqc3JjLCAqZGVzdDsKICAgICBpbnQgaSwgZW11ID0gMDsKICAgICBpbnQgYmxvY2tzaXplID0gMiAtICh3aWR0aCA+PiAzKTsgLy8gMTYtPjAsIDgtPjEsIDQtPjIKKyAgICBpbnQgbGluZXNpemUgICA9IHMtPmN1cl9waWMtPmYtPmxpbmVzaXplWzBdOworICAgIGludCB1dmxpbmVzaXplID0gcy0+Y3VyX3BpYy0+Zi0+bGluZXNpemVbMV07CiAKICAgICBteCArPSB4OwogICAgIG15ICs9IHk7CkBAIC0zMjAsMjYgKzQ0OSwyNiBAQAogICAgIH0KIAogICAgIC8qIGZvcm0gY29tcG9uZW50IHByZWRpY3Rpb25zICovCi0gICAgZGVzdCA9IGgtPmN1cl9waWMuZi0+ZGF0YVswXSArIHggKyB5ICogc2wtPmxpbmVzaXplOwotICAgIHNyYyAgPSBwaWMtPmYtPmRhdGFbMF0gKyBteCArIG15ICogc2wtPmxpbmVzaXplOworICAgIGRlc3QgPSBzLT5jdXJfcGljLT5mLT5kYXRhWzBdICsgeCArIHkgKiBsaW5lc2l6ZTsKKyAgICBzcmMgID0gcGljLT5mLT5kYXRhWzBdICsgbXggKyBteSAqIGxpbmVzaXplOwogCiAgICAgaWYgKGVtdSkgewotICAgICAgICBoLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMoc2wtPmVkZ2VfZW11X2J1ZmZlciwgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmxpbmVzaXplLCBzbC0+bGluZXNpemUsCisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzaXplLCBsaW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICsgMSwgaGVpZ2h0ICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14LCBteSwgcy0+aF9lZGdlX3Bvcywgcy0+dl9lZGdlX3Bvcyk7Ci0gICAgICAgIHNyYyA9IHNsLT5lZGdlX2VtdV9idWZmZXI7CisgICAgICAgIHNyYyA9IHMtPmVkZ2VfZW11X2J1ZmZlcjsKICAgICB9CiAgICAgaWYgKHRoaXJkcGVsKQogICAgICAgICAoYXZnID8gcy0+dGRzcC5hdmdfdHBlbF9waXhlbHNfdGFiCi0gICAgICAgICAgICAgOiBzLT50ZHNwLnB1dF90cGVsX3BpeGVsc190YWIpW2R4eV0oZGVzdCwgc3JjLCBzbC0+bGluZXNpemUsCisgICAgICAgICAgICAgOiBzLT50ZHNwLnB1dF90cGVsX3BpeGVsc190YWIpW2R4eV0oZGVzdCwgc3JjLCBsaW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKICAgICBlbHNlCiAgICAgICAgIChhdmcgPyBzLT5oZHNwLmF2Z19waXhlbHNfdGFiCi0gICAgICAgICAgICAgOiBzLT5oZHNwLnB1dF9waXhlbHNfdGFiKVtibG9ja3NpemVdW2R4eV0oZGVzdCwgc3JjLCBzbC0+bGluZXNpemUsCisgICAgICAgICAgICAgOiBzLT5oZHNwLnB1dF9waXhlbHNfdGFiKVtibG9ja3NpemVdW2R4eV0oZGVzdCwgc3JjLCBsaW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQpOwogCi0gICAgaWYgKCEoaC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dSQVkpKSB7CisgICAgaWYgKCEocy0+YXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HUkFZKSkgewogICAgICAgICBteCAgICAgPSBteCArIChteCA8IChpbnQpIHgpID4+IDE7CiAgICAgICAgIG15ICAgICA9IG15ICsgKG15IDwgKGludCkgeSkgPj4gMTsKICAgICAgICAgd2lkdGggID0gd2lkdGggID4+IDE7CkBAIC0zNDcsMjYgKzQ3NiwyNiBAQAogICAgICAgICBibG9ja3NpemUrKzsKIAogICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICBkZXN0ID0gaC0+Y3VyX3BpYy5mLT5kYXRhW2ldICsgKHggPj4gMSkgKyAoeSA+PiAxKSAqIHNsLT51dmxpbmVzaXplOwotICAgICAgICAgICAgc3JjICA9IHBpYy0+Zi0+ZGF0YVtpXSArIG14ICsgbXkgKiBzbC0+dXZsaW5lc2l6ZTsKKyAgICAgICAgICAgIGRlc3QgPSBzLT5jdXJfcGljLT5mLT5kYXRhW2ldICsgKHggPj4gMSkgKyAoeSA+PiAxKSAqIHV2bGluZXNpemU7CisgICAgICAgICAgICBzcmMgID0gcGljLT5mLT5kYXRhW2ldICsgbXggKyBteSAqIHV2bGluZXNpemU7CiAKICAgICAgICAgICAgIGlmIChlbXUpIHsKLSAgICAgICAgICAgICAgICBoLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMoc2wtPmVkZ2VfZW11X2J1ZmZlciwgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbC0+dXZsaW5lc2l6ZSwgc2wtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dmxpbmVzaXplLCB1dmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArIDEsIGhlaWdodCArIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG14LCBteSwgKHMtPmhfZWRnZV9wb3MgPj4gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnZfZWRnZV9wb3MgPj4gMSk7Ci0gICAgICAgICAgICAgICAgc3JjID0gc2wtPmVkZ2VfZW11X2J1ZmZlcjsKKyAgICAgICAgICAgICAgICBzcmMgPSBzLT5lZGdlX2VtdV9idWZmZXI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodGhpcmRwZWwpCiAgICAgICAgICAgICAgICAgKGF2ZyA/IHMtPnRkc3AuYXZnX3RwZWxfcGl4ZWxzX3RhYgogICAgICAgICAgICAgICAgICAgICAgOiBzLT50ZHNwLnB1dF90cGVsX3BpeGVsc190YWIpW2R4eV0oZGVzdCwgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPnV2bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgKGF2ZyA/IHMtPmhkc3AuYXZnX3BpeGVsc190YWIKICAgICAgICAgICAgICAgICAgICAgIDogcy0+aGRzcC5wdXRfcGl4ZWxzX3RhYilbYmxvY2tzaXplXVtkeHldKGRlc3QsIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT51dmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZsaW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zNzYsOCArNTA1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXIsIGludCBhdmcpCiB7CiAgICAgaW50IGksIGosIGssIG14LCBteSwgZHgsIGR5LCB4LCB5OwotICAgIEgyNjRDb250ZXh0ICpoICAgICAgICAgID0gJnMtPmg7Ci0gICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgICAgPSAmaC0+c2xpY2VfY3R4WzBdOwogICAgIGNvbnN0IGludCBwYXJ0X3dpZHRoICAgID0gKChzaXplICYgNSkgPT0gNCkgPyA0IDogMTYgPj4gKHNpemUgJiAxKTsKICAgICBjb25zdCBpbnQgcGFydF9oZWlnaHQgICA9IDE2ID4+ICgodW5zaWduZWQpKHNpemUgKyAxKSAvIDMpOwogICAgIGNvbnN0IGludCBleHRyYV93aWR0aCAgID0gKG1vZGUgPT0gUFJFRElDVF9NT0RFKSA/IC0xNiAqIDYgOiAwOwpAQCAtMzg2LDMwICs1MTMsMzAgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSBwYXJ0X2hlaWdodCkKICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IHBhcnRfd2lkdGgpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBiX3h5ID0gKDQgKiBzbC0+bWJfeCArIChqID4+IDIpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0ICogc2wtPm1iX3kgKyAoaSA+PiAyKSkgKiBoLT5iX3N0cmlkZTsKKyAgICAgICAgICAgIGNvbnN0IGludCBiX3h5ID0gKDQgKiBzLT5tYl94ICsgKGogPj4gMikpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQgKiBzLT5tYl95ICsgKGkgPj4gMikpICogcy0+Yl9zdHJpZGU7CiAgICAgICAgICAgICBpbnQgZHh5OwotICAgICAgICAgICAgeCA9IDE2ICogc2wtPm1iX3ggKyBqOwotICAgICAgICAgICAgeSA9IDE2ICogc2wtPm1iX3kgKyBpOworICAgICAgICAgICAgeCA9IDE2ICogcy0+bWJfeCArIGo7CisgICAgICAgICAgICB5ID0gMTYgKiBzLT5tYl95ICsgaTsKICAgICAgICAgICAgIGsgPSAoaiA+PiAyICYgMSkgKyAoaSA+PiAxICYgMikgKwogICAgICAgICAgICAgICAgIChqID4+IDEgJiA0KSArIChpICAgICAgJiA4KTsKIAogICAgICAgICAgICAgaWYgKG1vZGUgIT0gUFJFRElDVF9NT0RFKSB7Ci0gICAgICAgICAgICAgICAgcHJlZF9tb3Rpb24oaCwgc2wsIGssIHBhcnRfd2lkdGggPj4gMiwgZGlyLCAxLCAmbXgsICZteSk7CisgICAgICAgICAgICAgICAgc3ZxM19wcmVkX21vdGlvbihzLCBrLCBwYXJ0X3dpZHRoID4+IDIsIGRpciwgMSwgJm14LCAmbXkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBteCA9IHMtPm5leHRfcGljLT5tb3Rpb25fdmFsWzBdW2JfeHldWzBdIDw8IDE7Ci0gICAgICAgICAgICAgICAgbXkgPSBzLT5uZXh0X3BpYy0+bW90aW9uX3ZhbFswXVtiX3h5XVsxXSA8PCAxOworICAgICAgICAgICAgICAgIG14ID0gcy0+bmV4dF9waWMtPm1vdGlvbl92YWxbMF1bYl94eV1bMF0gKiAyOworICAgICAgICAgICAgICAgIG15ID0gcy0+bmV4dF9waWMtPm1vdGlvbl92YWxbMF1bYl94eV1bMV0gKiAyOwogCiAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG14ID0gbXggKiBoLT5mcmFtZV9udW1fb2Zmc2V0IC8KLSAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgKyAxID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgIG15ID0gbXkgKiBoLT5mcmFtZV9udW1fb2Zmc2V0IC8KLSAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgKyAxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIG14ID0gbXggKiBzLT5mcmFtZV9udW1fb2Zmc2V0IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgKyAxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIG15ID0gbXkgKiBzLT5mcmFtZV9udW1fb2Zmc2V0IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgKyAxID4+IDE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbXggPSBteCAqIChoLT5mcmFtZV9udW1fb2Zmc2V0IC0gaC0+cHJldl9mcmFtZV9udW1fb2Zmc2V0KSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJldl9mcmFtZV9udW1fb2Zmc2V0ICsgMSA+PiAxOwotICAgICAgICAgICAgICAgICAgICBteSA9IG15ICogKGgtPmZyYW1lX251bV9vZmZzZXQgLSBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgKyAxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIG14ID0gbXggKiAocy0+ZnJhbWVfbnVtX29mZnNldCAtIHMtPnByZXZfZnJhbWVfbnVtX29mZnNldCkgLworICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByZXZfZnJhbWVfbnVtX29mZnNldCArIDEgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgbXkgPSBteSAqIChzLT5mcmFtZV9udW1fb2Zmc2V0IC0gcy0+cHJldl9mcmFtZV9udW1fb2Zmc2V0KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldl9mcmFtZV9udW1fb2Zmc2V0ICsgMSA+PiAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDIxLDExICs1NDgsMTEgQEAKICAgICAgICAgICAgIGlmIChtb2RlID09IFBSRURJQ1RfTU9ERSkgewogICAgICAgICAgICAgICAgIGR4ID0gZHkgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkeSA9IHN2cTNfZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOwotICAgICAgICAgICAgICAgIGR4ID0gc3ZxM19nZXRfc2VfZ29sb21iKCZoLT5nYik7CisgICAgICAgICAgICAgICAgZHkgPSBnZXRfaW50ZXJsZWF2ZWRfc2VfZ29sb21iKCZzLT5nYl9zbGljZSk7CisgICAgICAgICAgICAgICAgZHggPSBnZXRfaW50ZXJsZWF2ZWRfc2VfZ29sb21iKCZzLT5nYl9zbGljZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoZHggPT0gSU5WQUxJRF9WTEMgfHwgZHkgPT0gSU5WQUxJRF9WTEMpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIE1WIHZsY1xuIik7CisgICAgICAgICAgICAgICAgaWYgKGR4ICE9IChpbnQxNl90KWR4IHx8IGR5ICE9IChpbnQxNl90KWR5KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBNViB2bGNcbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDM1LDggKzU2Miw4IEBACiAgICAgICAgICAgICAgICAgaW50IGZ4LCBmeTsKICAgICAgICAgICAgICAgICBteCAgPSAobXggKyAxID4+IDEpICsgZHg7CiAgICAgICAgICAgICAgICAgbXkgID0gKG15ICsgMSA+PiAxKSArIGR5OwotICAgICAgICAgICAgICAgIGZ4ICA9ICh1bnNpZ25lZCkobXggKyAweDMwMDApIC8gMyAtIDB4MTAwMDsKLSAgICAgICAgICAgICAgICBmeSAgPSAodW5zaWduZWQpKG15ICsgMHgzMDAwKSAvIDMgLSAweDEwMDA7CisgICAgICAgICAgICAgICAgZnggID0gKHVuc2lnbmVkKShteCArIDB4MzAwMDApIC8gMyAtIDB4MTAwMDA7CisgICAgICAgICAgICAgICAgZnkgID0gKHVuc2lnbmVkKShteSArIDB4MzAwMDApIC8gMyAtIDB4MTAwMDA7CiAgICAgICAgICAgICAgICAgZHh5ID0gKG14IC0gMyAqIGZ4KSArIDQgKiAobXkgLSAzICogZnkpOwogCiAgICAgICAgICAgICAgICAgc3ZxM19tY19kaXJfcGFydChzLCB4LCB5LCBwYXJ0X3dpZHRoLCBwYXJ0X2hlaWdodCwKQEAgLTQ0NCw4ICs1NzEsOCBAQAogICAgICAgICAgICAgICAgIG14ICs9IG14OwogICAgICAgICAgICAgICAgIG15ICs9IG15OwogICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IEhBTEZQRUxfTU9ERSB8fCBtb2RlID09IFBSRURJQ1RfTU9ERSkgewotICAgICAgICAgICAgICAgIG14ICA9ICh1bnNpZ25lZCkobXggKyAxICsgMHgzMDAwKSAvIDMgKyBkeCAtIDB4MTAwMDsKLSAgICAgICAgICAgICAgICBteSAgPSAodW5zaWduZWQpKG15ICsgMSArIDB4MzAwMCkgLyAzICsgZHkgLSAweDEwMDA7CisgICAgICAgICAgICAgICAgbXggID0gKHVuc2lnbmVkKShteCArIDEgKyAweDMwMDAwKSAvIDMgKyBkeCAtIDB4MTAwMDA7CisgICAgICAgICAgICAgICAgbXkgID0gKHVuc2lnbmVkKShteSArIDEgKyAweDMwMDAwKSAvIDMgKyBkeSAtIDB4MTAwMDA7CiAgICAgICAgICAgICAgICAgZHh5ID0gKG14ICYgMSkgKyAyICogKG15ICYgMSk7CiAKICAgICAgICAgICAgICAgICBzdnEzX21jX2Rpcl9wYXJ0KHMsIHgsIHksIHBhcnRfd2lkdGgsIHBhcnRfaGVpZ2h0LApAQCAtNDUzLDggKzU4MCw4IEBACiAgICAgICAgICAgICAgICAgbXggKj0gMzsKICAgICAgICAgICAgICAgICBteSAqPSAzOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBteCA9ICh1bnNpZ25lZCkobXggKyAzICsgMHg2MDAwKSAvIDYgKyBkeCAtIDB4MTAwMDsKLSAgICAgICAgICAgICAgICBteSA9ICh1bnNpZ25lZCkobXkgKyAzICsgMHg2MDAwKSAvIDYgKyBkeSAtIDB4MTAwMDsKKyAgICAgICAgICAgICAgICBteCA9ICh1bnNpZ25lZCkobXggKyAzICsgMHg2MDAwMCkgLyA2ICsgZHggLSAweDEwMDAwOworICAgICAgICAgICAgICAgIG15ID0gKHVuc2lnbmVkKShteSArIDMgKyAweDYwMDAwKSAvIDYgKyBkeSAtIDB4MTAwMDA7CiAKICAgICAgICAgICAgICAgICBzdnEzX21jX2Rpcl9wYXJ0KHMsIHgsIHksIHBhcnRfd2lkdGgsIHBhcnRfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXgsIG15LCAwLCAwLCBkaXIsIGF2Zyk7CkBAIC00NjcsNDkgKzU5NCwxNDkgQEAKICAgICAgICAgICAgICAgICBpbnQzMl90IG12ID0gcGFjazE2dG8zMihteCwgbXkpOwogCiAgICAgICAgICAgICAgICAgaWYgKHBhcnRfaGVpZ2h0ID09IDggJiYgaSA8IDgpIHsKLSAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEoc2wtPm12X2NhY2hlW2Rpcl1bc2Nhbjhba10gKyAxICogOF0sIG12KTsKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEocy0+bXZfY2FjaGVbZGlyXVtzY2FuOFtrXSArIDEgKiA4XSwgbXYpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0X3dpZHRoID09IDggJiYgaiA8IDgpCi0gICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQShzbC0+bXZfY2FjaGVbZGlyXVtzY2FuOFtrXSArIDEgKyAxICogOF0sIG12KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKHMtPm12X2NhY2hlW2Rpcl1bc2Nhbjhba10gKyAxICsgMSAqIDhdLCBtdik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChwYXJ0X3dpZHRoID09IDggJiYgaiA8IDgpCi0gICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKHNsLT5tdl9jYWNoZVtkaXJdW3NjYW44W2tdICsgMV0sIG12KTsKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEocy0+bXZfY2FjaGVbZGlyXVtzY2FuOFtrXSArIDFdLCBtdik7CiAgICAgICAgICAgICAgICAgaWYgKHBhcnRfd2lkdGggPT0gNCB8fCBwYXJ0X2hlaWdodCA9PSA0KQotICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQShzbC0+bXZfY2FjaGVbZGlyXVtzY2FuOFtrXV0sIG12KTsKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEocy0+bXZfY2FjaGVbZGlyXVtzY2FuOFtrXV0sIG12KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogd3JpdGUgYmFjayBtb3Rpb24gdmVjdG9ycyAqLwotICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUoaC0+Y3VyX3BpYy5tb3Rpb25fdmFsW2Rpcl1bYl94eV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0X3dpZHRoID4+IDIsIHBhcnRfaGVpZ2h0ID4+IDIsIGgtPmJfc3RyaWRlLAorICAgICAgICAgICAgZmlsbF9yZWN0YW5nbGUocy0+Y3VyX3BpYy0+bW90aW9uX3ZhbFtkaXJdW2JfeHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydF93aWR0aCA+PiAyLCBwYXJ0X2hlaWdodCA+PiAyLCBzLT5iX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2sxNnRvMzIobXgsIG15KSwgNCk7CiAgICAgICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGhsX2RlY29kZV9tYl9pZGN0X2x1bWEoU1ZRM0NvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3R5cGUsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgdWludDhfdCAqZGVzdF95KQoreworICAgIGludCBpOworICAgIGlmICghSVNfSU5UUkE0eDQobWJfdHlwZSkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICBpZiAocy0+bm9uX3plcm9fY291bnRfY2FjaGVbc2NhbjhbaV1dIHx8IHMtPm1iW2kgKiAxNl0pIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBwdHIgPSBkZXN0X3kgKyBibG9ja19vZmZzZXRbaV07CisgICAgICAgICAgICAgICAgc3ZxM19hZGRfaWRjdF9jKHB0ciwgcy0+bWIgKyBpICogMTYsIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5xc2NhbGUsIElTX0lOVFJBKG1iX3R5cGUpID8gMSA6IDApOworICAgICAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBobF9kZWNvZGVfbWJfcHJlZGljdF9sdW1hKFNWUTNDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0X3kpCit7CisgICAgaW50IGk7CisgICAgaW50IHFzY2FsZSA9IHMtPnFzY2FsZTsKKworICAgIGlmIChJU19JTlRSQTR4NChtYl90eXBlKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCAqY29uc3QgcHRyID0gZGVzdF95ICsgYmxvY2tfb2Zmc2V0W2ldOworICAgICAgICAgICAgY29uc3QgaW50IGRpciAgICAgID0gcy0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44W2ldXTsKKworICAgICAgICAgICAgdWludDhfdCAqdG9wcmlnaHQ7CisgICAgICAgICAgICBpbnQgbm56LCB0cjsKKyAgICAgICAgICAgIGlmIChkaXIgPT0gRElBR19ET1dOX0xFRlRfUFJFRCB8fCBkaXIgPT0gVkVSVF9MRUZUX1BSRUQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgdG9wcmlnaHRfYXZhaWwgPSAocy0+dG9wcmlnaHRfc2FtcGxlc19hdmFpbGFibGUgPDwgaSkgJiAweDgwMDA7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT5tYl95IHx8IGxpbmVzaXplIDw9IGJsb2NrX29mZnNldFtpXSk7CisgICAgICAgICAgICAgICAgaWYgKCF0b3ByaWdodF9hdmFpbCkgeworICAgICAgICAgICAgICAgICAgICB0ciAgICAgICA9IHB0clszIC0gbGluZXNpemVdICogMHgwMTAxMDEwMXU7CisgICAgICAgICAgICAgICAgICAgIHRvcHJpZ2h0ID0gKHVpbnQ4X3QgKikmdHI7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRvcHJpZ2h0ID0gcHRyICsgNCAtIGxpbmVzaXplOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgdG9wcmlnaHQgPSBOVUxMOworCisgICAgICAgICAgICBzLT5ocGMucHJlZDR4NFtkaXJdKHB0ciwgdG9wcmlnaHQsIGxpbmVzaXplKTsKKyAgICAgICAgICAgIG5ueiA9IHMtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2ldXTsKKyAgICAgICAgICAgIGlmIChubnopIHsKKyAgICAgICAgICAgICAgICBzdnEzX2FkZF9pZGN0X2MocHRyLCBzLT5tYiArIGkgKiAxNiwgbGluZXNpemUsIHFzY2FsZSwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzLT5ocGMucHJlZDE2eDE2W3MtPmludHJhMTZ4MTZfcHJlZF9tb2RlXShkZXN0X3ksIGxpbmVzaXplKTsKKyAgICAgICAgc3ZxM19sdW1hX2RjX2RlcXVhbnRfaWRjdF9jKHMtPm1iLCBzLT5tYl9sdW1hX2RjWzBdLCBxc2NhbGUpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaGxfZGVjb2RlX21iKFNWUTNDb250ZXh0ICpzKQoreworICAgIGNvbnN0IGludCBtYl94ICAgID0gcy0+bWJfeDsKKyAgICBjb25zdCBpbnQgbWJfeSAgICA9IHMtPm1iX3k7CisgICAgY29uc3QgaW50IG1iX3h5ICAgPSBzLT5tYl94eTsKKyAgICBjb25zdCBpbnQgbWJfdHlwZSA9IHMtPmN1cl9waWMtPm1iX3R5cGVbbWJfeHldOworICAgIHVpbnQ4X3QgKmRlc3RfeSwgKmRlc3RfY2IsICpkZXN0X2NyOworICAgIGludCBsaW5lc2l6ZSwgdXZsaW5lc2l6ZTsKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCBpbnQgKmJsb2NrX29mZnNldCA9ICZzLT5ibG9ja19vZmZzZXRbMF07CisgICAgY29uc3QgaW50IGJsb2NrX2ggICA9IDE2ID4+IDE7CisKKyAgICBsaW5lc2l6ZSAgID0gcy0+Y3VyX3BpYy0+Zi0+bGluZXNpemVbMF07CisgICAgdXZsaW5lc2l6ZSA9IHMtPmN1cl9waWMtPmYtPmxpbmVzaXplWzFdOworCisgICAgZGVzdF95ICA9IHMtPmN1cl9waWMtPmYtPmRhdGFbMF0gKyAobWJfeCAgICAgKyBtYl95ICogbGluZXNpemUpICAqIDE2OworICAgIGRlc3RfY2IgPSBzLT5jdXJfcGljLT5mLT5kYXRhWzFdICsgIG1iX3ggKiA4ICsgbWJfeSAqIHV2bGluZXNpemUgKiBibG9ja19oOworICAgIGRlc3RfY3IgPSBzLT5jdXJfcGljLT5mLT5kYXRhWzJdICsgIG1iX3ggKiA4ICsgbWJfeSAqIHV2bGluZXNpemUgKiBibG9ja19oOworCisgICAgcy0+dmRzcC5wcmVmZXRjaChkZXN0X3kgICsgKHMtPm1iX3ggJiAzKSAqIDQgKiBsaW5lc2l6ZSAgICsgNjQsIGxpbmVzaXplLCAgICAgIDQpOworICAgIHMtPnZkc3AucHJlZmV0Y2goZGVzdF9jYiArIChzLT5tYl94ICYgNykgICAgICogdXZsaW5lc2l6ZSArIDY0LCBkZXN0X2NyIC0gZGVzdF9jYiwgMik7CisKKyAgICBpZiAoSVNfSU5UUkEobWJfdHlwZSkpIHsKKyAgICAgICAgcy0+aHBjLnByZWQ4eDhbcy0+Y2hyb21hX3ByZWRfbW9kZV0oZGVzdF9jYiwgdXZsaW5lc2l6ZSk7CisgICAgICAgIHMtPmhwYy5wcmVkOHg4W3MtPmNocm9tYV9wcmVkX21vZGVdKGRlc3RfY3IsIHV2bGluZXNpemUpOworCisgICAgICAgIGhsX2RlY29kZV9tYl9wcmVkaWN0X2x1bWEocywgbWJfdHlwZSwgYmxvY2tfb2Zmc2V0LCBsaW5lc2l6ZSwgZGVzdF95KTsKKyAgICB9CisKKyAgICBobF9kZWNvZGVfbWJfaWRjdF9sdW1hKHMsIG1iX3R5cGUsIGJsb2NrX29mZnNldCwgbGluZXNpemUsIGRlc3RfeSk7CisKKyAgICBpZiAocy0+Y2JwICYgMHgzMCkgeworICAgICAgICB1aW50OF90ICpkZXN0WzJdID0geyBkZXN0X2NiLCBkZXN0X2NyIH07CisgICAgICAgIHMtPmgyNjRkc3AuaDI2NF9jaHJvbWFfZGNfZGVxdWFudF9pZGN0KHMtPm1iICsgMTYgKiAxNiAqIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlcXVhbnQ0X2NvZWZmWzRdWzBdKTsKKyAgICAgICAgcy0+aDI2NGRzcC5oMjY0X2Nocm9tYV9kY19kZXF1YW50X2lkY3Qocy0+bWIgKyAxNiAqIDE2ICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVxdWFudDRfY29lZmZbNF1bMF0pOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgMzsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBqICogMTY7IGkgPCBqICogMTYgKyA0OyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHMtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2ldXSB8fCBzLT5tYltpICogMTZdKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmNvbnN0IHB0ciA9IGRlc3RbaiAtIDFdICsgYmxvY2tfb2Zmc2V0W2ldOworICAgICAgICAgICAgICAgICAgICBzdnEzX2FkZF9pZGN0X2MocHRyLCBzLT5tYiArIGkgKiAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2bGluZXNpemUsIGZmX2gyNjRfY2hyb21hX3FwWzBdW3MtPnFzY2FsZSArIDEyXSAtIDEyLCAyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXRpYyBpbnQgc3ZxM19kZWNvZGVfbWIoU1ZRM0NvbnRleHQgKnMsIHVuc2lnbmVkIGludCBtYl90eXBlKQogewotICAgIEgyNjRDb250ZXh0ICpoID0gJnMtPmg7Ci0gICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOwogICAgIGludCBpLCBqLCBrLCBtLCBkaXIsIG1vZGU7CiAgICAgaW50IGNicCA9IDA7CiAgICAgdWludDMyX3QgdmxjOwogICAgIGludDhfdCAqdG9wLCAqbGVmdDsKLSAgICBjb25zdCBpbnQgbWJfeHkgICAgICAgICA9IHNsLT5tYl94eTsKLSAgICBjb25zdCBpbnQgYl94eSAgICAgICAgICA9IDQgKiBzbC0+bWJfeCArIDQgKiBzbC0+bWJfeSAqIGgtPmJfc3RyaWRlOworICAgIGNvbnN0IGludCBtYl94eSA9IHMtPm1iX3h5OworICAgIGNvbnN0IGludCBiX3h5ICA9IDQgKiBzLT5tYl94ICsgNCAqIHMtPm1iX3kgKiBzLT5iX3N0cmlkZTsKIAotICAgIHNsLT50b3Bfc2FtcGxlc19hdmFpbGFibGUgICAgICA9IChzbC0+bWJfeSA9PSAwKSA/IDB4MzNGRiA6IDB4RkZGRjsKLSAgICBzbC0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAgICAgPSAoc2wtPm1iX3ggPT0gMCkgPyAweDVGNUYgOiAweEZGRkY7Ci0gICAgc2wtPnRvcHJpZ2h0X3NhbXBsZXNfYXZhaWxhYmxlID0gMHhGRkZGOworICAgIHMtPnRvcF9zYW1wbGVzX2F2YWlsYWJsZSAgICAgID0gKHMtPm1iX3kgPT0gMCkgPyAweDMzRkYgOiAweEZGRkY7CisgICAgcy0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSAgICAgPSAocy0+bWJfeCA9PSAwKSA/IDB4NUY1RiA6IDB4RkZGRjsKKyAgICBzLT50b3ByaWdodF9zYW1wbGVzX2F2YWlsYWJsZSA9IDB4RkZGRjsKIAogICAgIGlmIChtYl90eXBlID09IDApIHsgICAgICAgICAgIC8qIFNLSVAgKi8KLSAgICAgICAgaWYgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fAorICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QIHx8CiAgICAgICAgICAgICBzLT5uZXh0X3BpYy0+bWJfdHlwZVttYl94eV0gPT0gLTEpIHsKLSAgICAgICAgICAgIHN2cTNfbWNfZGlyX3BhcnQocywgMTYgKiBzbC0+bWJfeCwgMTYgKiBzbC0+bWJfeSwgMTYsIDE2LAorICAgICAgICAgICAgc3ZxM19tY19kaXJfcGFydChzLCAxNiAqIHMtPm1iX3gsIDE2ICogcy0+bWJfeSwgMTYsIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwKTsKIAotICAgICAgICAgICAgaWYgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKLSAgICAgICAgICAgICAgICBzdnEzX21jX2Rpcl9wYXJ0KHMsIDE2ICogc2wtPm1iX3gsIDE2ICogc2wtPm1iX3ksIDE2LCAxNiwKKyAgICAgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgICAgICAgICAgc3ZxM19tY19kaXJfcGFydChzLCAxNiAqIHMtPm1iX3gsIDE2ICogcy0+bWJfeSwgMTYsIDE2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMSwgMSk7CiAKICAgICAgICAgICAgIG1iX3R5cGUgPSBNQl9UWVBFX1NLSVA7CkBAIC01MjMsMTAgKzc1MCwxMCBAQAogICAgICAgICAgICAgbWJfdHlwZSA9IE1CX1RZUEVfMTZ4MTY7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1iX3R5cGUgPCA4KSB7ICAgICAvKiBJTlRFUiAqLwotICAgICAgICBpZiAocy0+dGhpcmRwZWxfZmxhZyAmJiBzLT5oYWxmcGVsX2ZsYWcgPT0gIWdldF9iaXRzMSgmaC0+Z2IpKQorICAgICAgICBpZiAocy0+dGhpcmRwZWxfZmxhZyAmJiBzLT5oYWxmcGVsX2ZsYWcgPT0gIWdldF9iaXRzMSgmcy0+Z2Jfc2xpY2UpKQogICAgICAgICAgICAgbW9kZSA9IFRISVJEUEVMX01PREU7CiAgICAgICAgIGVsc2UgaWYgKHMtPmhhbGZwZWxfZmxhZyAmJgotICAgICAgICAgICAgICAgICBzLT50aGlyZHBlbF9mbGFnID09ICFnZXRfYml0czEoJmgtPmdiKSkKKyAgICAgICAgICAgICAgICAgcy0+dGhpcmRwZWxfZmxhZyA9PSAhZ2V0X2JpdHMxKCZzLT5nYl9zbGljZSkpCiAgICAgICAgICAgICBtb2RlID0gSEFMRlBFTF9NT0RFOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBtb2RlID0gRlVMTFBFTF9NT0RFOwpAQCAtNTQxLDQ2ICs3NjgsNDYgQEAKICAgICAgICAgICovCiAKICAgICAgICAgZm9yIChtID0gMDsgbSA8IDI7IG0rKykgewotICAgICAgICAgICAgaWYgKHNsLT5tYl94ID4gMCAmJiBzbC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gMV0gKyA2XSAhPSAtMSkgeworICAgICAgICAgICAgaWYgKHMtPm1iX3ggPiAwICYmIHMtPmludHJhNHg0X3ByZWRfbW9kZVtzLT5tYjJicl94eVttYl94eSAtIDFdICsgNl0gIT0gLTEpIHsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoc2wtPm12X2NhY2hlW21dW3NjYW44WzBdIC0gMSArIGkgKiA4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmN1cl9waWMubW90aW9uX3ZhbFttXVtiX3h5IC0gMSArIGkgKiBoLT5iX3N0cmlkZV0pOworICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIocy0+bXZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxICsgaSAqIDhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy0+bW90aW9uX3ZhbFttXVtiX3h5IC0gMSArIGkgKiBzLT5iX3N0cmlkZV0pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBBVl9aRVJPMzIoc2wtPm12X2NhY2hlW21dW3NjYW44WzBdIC0gMSArIGkgKiA4XSk7CisgICAgICAgICAgICAgICAgICAgIEFWX1pFUk8zMihzLT5tdl9jYWNoZVttXVtzY2FuOFswXSAtIDEgKyBpICogOF0pOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNsLT5tYl95ID4gMCkgewotICAgICAgICAgICAgICAgIG1lbWNweShzbC0+bXZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxICogOF0sCi0gICAgICAgICAgICAgICAgICAgICAgIGgtPmN1cl9waWMubW90aW9uX3ZhbFttXVtiX3h5IC0gaC0+Yl9zdHJpZGVdLAorICAgICAgICAgICAgaWYgKHMtPm1iX3kgPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPm12X2NhY2hlW21dW3NjYW44WzBdIC0gMSAqIDhdLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLT5tb3Rpb25fdmFsW21dW2JfeHkgLSBzLT5iX3N0cmlkZV0sCiAgICAgICAgICAgICAgICAgICAgICAgIDQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgICAgICBtZW1zZXQoJnNsLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxICogOF0sCi0gICAgICAgICAgICAgICAgICAgICAgIChzbC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlXV0gPT0gLTEpID8gUEFSVF9OT1RfQVZBSUxBQkxFIDogMSwgNCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZzLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxICogOF0sCisgICAgICAgICAgICAgICAgICAgICAgIChzLT5pbnRyYTR4NF9wcmVkX21vZGVbcy0+bWIyYnJfeHlbbWJfeHkgLSBzLT5tYl9zdHJpZGVdXSA9PSAtMSkgPyBQQVJUX05PVF9BVkFJTEFCTEUgOiAxLCA0KTsKIAotICAgICAgICAgICAgICAgIGlmIChzbC0+bWJfeCA8IGgtPm1iX3dpZHRoIC0gMSkgewotICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoc2wtPm12X2NhY2hlW21dW3NjYW44WzBdICsgNCAtIDEgKiA4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPmN1cl9waWMubW90aW9uX3ZhbFttXVtiX3h5IC0gaC0+Yl9zdHJpZGUgKyA0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNsLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gKyA0IC0gMSAqIDhdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChzbC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlICsgMV0gKyA2XSA9PSAtMSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5pbnRyYTR4NF9wcmVkX21vZGVbaC0+bWIyYnJfeHlbbWJfeHkgLSBoLT5tYl9zdHJpZGVdXSA9PSAtMSkgPyBQQVJUX05PVF9BVkFJTEFCTEUgOiAxOworICAgICAgICAgICAgICAgIGlmIChzLT5tYl94IDwgcy0+bWJfd2lkdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFWX0NPUFkzMihzLT5tdl9jYWNoZVttXVtzY2FuOFswXSArIDQgLSAxICogOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJfcGljLT5tb3Rpb25fdmFsW21dW2JfeHkgLSBzLT5iX3N0cmlkZSArIDRdKTsKKyAgICAgICAgICAgICAgICAgICAgcy0+cmVmX2NhY2hlW21dW3NjYW44WzBdICsgNCAtIDEgKiA4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAocy0+aW50cmE0eDRfcHJlZF9tb2RlW3MtPm1iMmJyX3h5W21iX3h5IC0gcy0+bWJfc3RyaWRlICsgMV0gKyA2XSA9PSAtMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmludHJhNHg0X3ByZWRfbW9kZVtzLT5tYjJicl94eVttYl94eSAtIHMtPm1iX3N0cmlkZV1dID09IC0xKSA/IFBBUlRfTk9UX0FWQUlMQUJMRSA6IDE7CiAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNsLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gKyA0IC0gMSAqIDhdID0gUEFSVF9OT1RfQVZBSUxBQkxFOwotICAgICAgICAgICAgICAgIGlmIChzbC0+bWJfeCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTMyKHNsLT5tdl9jYWNoZVttXVtzY2FuOFswXSAtIDEgLSAxICogOF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5jdXJfcGljLm1vdGlvbl92YWxbbV1bYl94eSAtIGgtPmJfc3RyaWRlIC0gMV0pOwotICAgICAgICAgICAgICAgICAgICBzbC0+cmVmX2NhY2hlW21dW3NjYW44WzBdIC0gMSAtIDEgKiA4XSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoc2wtPmludHJhNHg0X3ByZWRfbW9kZVtoLT5tYjJicl94eVttYl94eSAtIGgtPm1iX3N0cmlkZSAtIDFdICsgM10gPT0gLTEpID8gUEFSVF9OT1RfQVZBSUxBQkxFIDogMTsKKyAgICAgICAgICAgICAgICAgICAgcy0+cmVmX2NhY2hlW21dW3NjYW44WzBdICsgNCAtIDEgKiA4XSA9IFBBUlRfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bWJfeCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfQ09QWTMyKHMtPm12X2NhY2hlW21dW3NjYW44WzBdIC0gMSAtIDEgKiA4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cl9waWMtPm1vdGlvbl92YWxbbV1bYl94eSAtIHMtPmJfc3RyaWRlIC0gMV0pOworICAgICAgICAgICAgICAgICAgICBzLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxIC0gMSAqIDhdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChzLT5pbnRyYTR4NF9wcmVkX21vZGVbcy0+bWIyYnJfeHlbbWJfeHkgLSBzLT5tYl9zdHJpZGUgLSAxXSArIDNdID09IC0xKSA/IFBBUlRfTk9UX0FWQUlMQUJMRSA6IDE7CiAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNsLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxIC0gMSAqIDhdID0gUEFSVF9OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgICAgICBzLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gLSAxIC0gMSAqIDhdID0gUEFSVF9OT1RfQVZBSUxBQkxFOwogICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgbWVtc2V0KCZzbC0+cmVmX2NhY2hlW21dW3NjYW44WzBdIC0gMSAqIDggLSAxXSwKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnMtPnJlZl9jYWNoZVttXVtzY2FuOFswXSAtIDEgKiA4IC0gMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIFBBUlRfTk9UX0FWQUlMQUJMRSwgOCk7CiAKLSAgICAgICAgICAgIGlmIChoLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgLyogZGVjb2RlIG1vdGlvbiB2ZWN0b3IocykgYW5kIGZvcm0gcHJlZGljdGlvbihzKSAqLwotICAgICAgICBpZiAoaC0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHsKICAgICAgICAgICAgIGlmIChzdnEzX21jX2RpcihzLCBtYl90eXBlIC0gMSwgbW9kZSwgMCwgMCkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfSBlbHNlIHsgICAgICAgIC8qIEFWX1BJQ1RVUkVfVFlQRV9CICovCkBAIC01ODksNyArODE2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoaC0+Y3VyX3BpYy5tb3Rpb25fdmFsWzBdW2JfeHkgKyBpICogaC0+Yl9zdHJpZGVdLAorICAgICAgICAgICAgICAgICAgICBtZW1zZXQocy0+Y3VyX3BpYy0+bW90aW9uX3ZhbFswXVtiX3h5ICsgaSAqIHMtPmJfc3RyaWRlXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtYl90eXBlICE9IDEpIHsKQEAgLTU5NywxMjggKzgyNCwxMzcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBtZW1zZXQoaC0+Y3VyX3BpYy5tb3Rpb25fdmFsWzFdW2JfeHkgKyBpICogaC0+Yl9zdHJpZGVdLAorICAgICAgICAgICAgICAgICAgICBtZW1zZXQocy0+Y3VyX3BpYy0+bW90aW9uX3ZhbFsxXVtiX3h5ICsgaSAqIHMtPmJfc3RyaWRlXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIG1iX3R5cGUgPSBNQl9UWVBFXzE2eDE2OwogICAgIH0gZWxzZSBpZiAobWJfdHlwZSA9PSA4IHx8IG1iX3R5cGUgPT0gMzMpIHsgICAvKiBJTlRSQTR4NCAqLwotICAgICAgICBtZW1zZXQoc2wtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZSwgLTEsIDggKiA1ICogc2l6ZW9mKGludDhfdCkpOworICAgICAgICBpbnQ4X3QgKmk0eDQgICAgICAgPSBzLT5pbnRyYTR4NF9wcmVkX21vZGUgKyBzLT5tYjJicl94eVtzLT5tYl94eV07CisgICAgICAgIGludDhfdCAqaTR4NF9jYWNoZSA9IHMtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZTsKKworICAgICAgICBtZW1zZXQocy0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlLCAtMSwgOCAqIDUgKiBzaXplb2YoaW50OF90KSk7CiAKICAgICAgICAgaWYgKG1iX3R5cGUgPT0gOCkgewotICAgICAgICAgICAgaWYgKHNsLT5tYl94ID4gMCkgeworICAgICAgICAgICAgaWYgKHMtPm1iX3ggPiAwKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgc2wtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFswXSAtIDEgKyBpICogOF0gPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gMV0gKyA2IC0gaV07Ci0gICAgICAgICAgICAgICAgaWYgKHNsLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gLSAxXSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgc2wtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgPSAweDVGNUY7CisgICAgICAgICAgICAgICAgICAgIHMtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFswXSAtIDEgKyBpICogOF0gPSBzLT5pbnRyYTR4NF9wcmVkX21vZGVbcy0+bWIyYnJfeHlbbWJfeHkgLSAxXSArIDYgLSBpXTsKKyAgICAgICAgICAgICAgICBpZiAocy0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44WzBdIC0gMV0gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHMtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgPSAweDVGNUY7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2wtPm1iX3kgPiAwKSB7Ci0gICAgICAgICAgICAgICAgc2wtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs0ICsgOCAqIDBdID0gc2wtPmludHJhNHg0X3ByZWRfbW9kZVtoLT5tYjJicl94eVttYl94eSAtIGgtPm1iX3N0cmlkZV0gKyAwXTsKLSAgICAgICAgICAgICAgICBzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlWzUgKyA4ICogMF0gPSBzbC0+aW50cmE0eDRfcHJlZF9tb2RlW2gtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlXSArIDFdOwotICAgICAgICAgICAgICAgIHNsLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbNiArIDggKiAwXSA9IHNsLT5pbnRyYTR4NF9wcmVkX21vZGVbaC0+bWIyYnJfeHlbbWJfeHkgLSBoLT5tYl9zdHJpZGVdICsgMl07Ci0gICAgICAgICAgICAgICAgc2wtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs3ICsgOCAqIDBdID0gc2wtPmludHJhNHg0X3ByZWRfbW9kZVtoLT5tYjJicl94eVttYl94eSAtIGgtPm1iX3N0cmlkZV0gKyAzXTsKKyAgICAgICAgICAgIGlmIChzLT5tYl95ID4gMCkgeworICAgICAgICAgICAgICAgIHMtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs0ICsgOCAqIDBdID0gcy0+aW50cmE0eDRfcHJlZF9tb2RlW3MtPm1iMmJyX3h5W21iX3h5IC0gcy0+bWJfc3RyaWRlXSArIDBdOworICAgICAgICAgICAgICAgIHMtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs1ICsgOCAqIDBdID0gcy0+aW50cmE0eDRfcHJlZF9tb2RlW3MtPm1iMmJyX3h5W21iX3h5IC0gcy0+bWJfc3RyaWRlXSArIDFdOworICAgICAgICAgICAgICAgIHMtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs2ICsgOCAqIDBdID0gcy0+aW50cmE0eDRfcHJlZF9tb2RlW3MtPm1iMmJyX3h5W21iX3h5IC0gcy0+bWJfc3RyaWRlXSArIDJdOworICAgICAgICAgICAgICAgIHMtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVs3ICsgOCAqIDBdID0gcy0+aW50cmE0eDRfcHJlZF9tb2RlW3MtPm1iMmJyX3h5W21iX3h5IC0gcy0+bWJfc3RyaWRlXSArIDNdOwogCi0gICAgICAgICAgICAgICAgaWYgKHNsLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbNCArIDggKiAwXSA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgc2wtPnRvcF9zYW1wbGVzX2F2YWlsYWJsZSA9IDB4MzNGRjsKKyAgICAgICAgICAgICAgICBpZiAocy0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlWzQgKyA4ICogMF0gPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIHMtPnRvcF9zYW1wbGVzX2F2YWlsYWJsZSA9IDB4MzNGRjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogZGVjb2RlIHByZWRpY3Rpb24gY29kZXMgZm9yIGx1bWEgYmxvY2tzICovCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkgKz0gMikgewotICAgICAgICAgICAgICAgIHZsYyA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAgICAgICAgIHZsYyA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJnMtPmdiX3NsaWNlKTsKIAogICAgICAgICAgICAgICAgIGlmICh2bGMgPj0gMjVVKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsdW1hIHByZWRpY3Rpb246JSJQUkl1MzIiXG4iLCB2bGMpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbGVmdCA9ICZzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44W2ldIC0gMV07Ci0gICAgICAgICAgICAgICAgdG9wICA9ICZzbC0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlW3NjYW44W2ldIC0gOF07CisgICAgICAgICAgICAgICAgbGVmdCA9ICZzLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbaV0gLSAxXTsKKyAgICAgICAgICAgICAgICB0b3AgID0gJnMtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFtpXSAtIDhdOwogCiAgICAgICAgICAgICAgICAgbGVmdFsxXSA9IHN2cTNfcHJlZF8xW3RvcFswXSArIDFdW2xlZnRbMF0gKyAxXVtzdnEzX3ByZWRfMFt2bGNdWzBdXTsKICAgICAgICAgICAgICAgICBsZWZ0WzJdID0gc3ZxM19wcmVkXzFbdG9wWzFdICsgMV1bbGVmdFsxXSArIDFdW3N2cTNfcHJlZF8wW3ZsY11bMV1dOwogCiAgICAgICAgICAgICAgICAgaWYgKGxlZnRbMV0gPT0gLTEgfHwgbGVmdFsyXSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIndlaXJkIHByZWRpY3Rpb25cbiIpOworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIndlaXJkIHByZWRpY3Rpb25cbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeyAgICAvKiBtYl90eXBlID09IDMzLCBEQ18xMjhfUFJFRCBibG9jayB0eXBlICovCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgICAgIG1lbXNldCgmc2wtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFswXSArIDggKiBpXSwgRENfUFJFRCwgNCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZzLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyA4ICogaV0sIERDX1BSRUQsIDQpOwogICAgICAgICB9CiAKLSAgICAgICAgd3JpdGVfYmFja19pbnRyYV9wcmVkX21vZGUoaCwgc2wpOworICAgICAgICBBVl9DT1BZMzIoaTR4NCwgaTR4NF9jYWNoZSArIDQgKyA4ICogNCk7CisgICAgICAgIGk0eDRbNF0gPSBpNHg0X2NhY2hlWzcgKyA4ICogM107CisgICAgICAgIGk0eDRbNV0gPSBpNHg0X2NhY2hlWzcgKyA4ICogMl07CisgICAgICAgIGk0eDRbNl0gPSBpNHg0X2NhY2hlWzcgKyA4ICogMV07CiAKICAgICAgICAgaWYgKG1iX3R5cGUgPT0gOCkgewotICAgICAgICAgICAgZmZfaDI2NF9jaGVja19pbnRyYTR4NF9wcmVkX21vZGUoaCwgc2wpOworICAgICAgICAgICAgZmZfaDI2NF9jaGVja19pbnRyYTR4NF9wcmVkX21vZGUocy0+aW50cmE0eDRfcHJlZF9tb2RlX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YXZjdHgsIHMtPnRvcF9zYW1wbGVzX2F2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUpOwogCi0gICAgICAgICAgICBzbC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlICA9IChzbC0+bWJfeSA9PSAwKSA/IDB4MzNGRiA6IDB4RkZGRjsKLSAgICAgICAgICAgIHNsLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlID0gKHNsLT5tYl94ID09IDApID8gMHg1RjVGIDogMHhGRkZGOworICAgICAgICAgICAgcy0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlICA9IChzLT5tYl95ID09IDApID8gMHgzM0ZGIDogMHhGRkZGOworICAgICAgICAgICAgcy0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSA9IChzLT5tYl94ID09IDApID8gMHg1RjVGIDogMHhGRkZGOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgICAgICBtZW1zZXQoJnNsLT5pbnRyYTR4NF9wcmVkX21vZGVfY2FjaGVbc2NhbjhbMF0gKyA4ICogaV0sIERDXzEyOF9QUkVELCA0KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnMtPmludHJhNHg0X3ByZWRfbW9kZV9jYWNoZVtzY2FuOFswXSArIDggKiBpXSwgRENfMTI4X1BSRUQsIDQpOwogCi0gICAgICAgICAgICBzbC0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlICA9IDB4MzNGRjsKLSAgICAgICAgICAgIHNsLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlID0gMHg1RjVGOworICAgICAgICAgICAgcy0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlICA9IDB4MzNGRjsKKyAgICAgICAgICAgIHMtPmxlZnRfc2FtcGxlc19hdmFpbGFibGUgPSAweDVGNUY7CiAgICAgICAgIH0KIAogICAgICAgICBtYl90eXBlID0gTUJfVFlQRV9JTlRSQTR4NDsKICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBJTlRSQTE2eDE2ICovCi0gICAgICAgIGRpciA9IGlfbWJfdHlwZV9pbmZvW21iX3R5cGUgLSA4XS5wcmVkX21vZGU7CisgICAgICAgIGRpciA9IGZmX2gyNjRfaV9tYl90eXBlX2luZm9bbWJfdHlwZSAtIDhdLnByZWRfbW9kZTsKICAgICAgICAgZGlyID0gKGRpciA+PiAxKSBeIDMgKiAoZGlyICYgMSkgXiAxOwogCi0gICAgICAgIGlmICgoc2wtPmludHJhMTZ4MTZfcHJlZF9tb2RlID0gZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUoaCwgc2wsIGRpciwgMCkpIDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZSA8IDBcbiIpOwotICAgICAgICAgICAgcmV0dXJuIHNsLT5pbnRyYTE2eDE2X3ByZWRfbW9kZTsKKyAgICAgICAgaWYgKChzLT5pbnRyYTE2eDE2X3ByZWRfbW9kZSA9IGZmX2gyNjRfY2hlY2tfaW50cmFfcHJlZF9tb2RlKHMtPmF2Y3R4LCBzLT50b3Bfc2FtcGxlc19hdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZWZ0X3NhbXBsZXNfYXZhaWxhYmxlLCBkaXIsIDApKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZmZfaDI2NF9jaGVja19pbnRyYV9wcmVkX21vZGUgPCAwXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBzLT5pbnRyYTE2eDE2X3ByZWRfbW9kZTsKICAgICAgICAgfQogCi0gICAgICAgIGNicCAgICAgPSBpX21iX3R5cGVfaW5mb1ttYl90eXBlIC0gOF0uY2JwOworICAgICAgICBjYnAgICAgID0gZmZfaDI2NF9pX21iX3R5cGVfaW5mb1ttYl90eXBlIC0gOF0uY2JwOwogICAgICAgICBtYl90eXBlID0gTUJfVFlQRV9JTlRSQTE2eDE2OwogICAgIH0KIAotICAgIGlmICghSVNfSU5URVIobWJfdHlwZSkgJiYgaC0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgaWYgKCFJU19JTlRFUihtYl90eXBlKSAmJiBzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgIG1lbXNldChoLT5jdXJfcGljLm1vdGlvbl92YWxbMF1bYl94eSArIGkgKiBoLT5iX3N0cmlkZV0sCisgICAgICAgICAgICBtZW1zZXQocy0+Y3VyX3BpYy0+bW90aW9uX3ZhbFswXVtiX3h5ICsgaSAqIHMtPmJfc3RyaWRlXSwKICAgICAgICAgICAgICAgICAgICAwLCA0ICogMiAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgIGlmIChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgewogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgICAgICBtZW1zZXQoaC0+Y3VyX3BpYy5tb3Rpb25fdmFsWzFdW2JfeHkgKyBpICogaC0+Yl9zdHJpZGVdLAorICAgICAgICAgICAgICAgIG1lbXNldChzLT5jdXJfcGljLT5tb3Rpb25fdmFsWzFdW2JfeHkgKyBpICogcy0+Yl9zdHJpZGVdLAogICAgICAgICAgICAgICAgICAgICAgICAwLCA0ICogMiAqIHNpemVvZihpbnQxNl90KSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFJU19JTlRSQTR4NChtYl90eXBlKSkgewotICAgICAgICBtZW1zZXQoc2wtPmludHJhNHg0X3ByZWRfbW9kZSArIGgtPm1iMmJyX3h5W21iX3h5XSwgRENfUFJFRCwgOCk7CisgICAgICAgIG1lbXNldChzLT5pbnRyYTR4NF9wcmVkX21vZGUgKyBzLT5tYjJicl94eVttYl94eV0sIERDX1BSRUQsIDgpOwogICAgIH0KLSAgICBpZiAoIUlTX1NLSVAobWJfdHlwZSkgfHwgaC0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB7Ci0gICAgICAgIG1lbXNldChzbC0+bm9uX3plcm9fY291bnRfY2FjaGUgKyA4LCAwLCAxNCAqIDggKiBzaXplb2YodWludDhfdCkpOworICAgIGlmICghSVNfU0tJUChtYl90eXBlKSB8fCBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgbWVtc2V0KHMtPm5vbl96ZXJvX2NvdW50X2NhY2hlICsgOCwgMCwgMTQgKiA4ICogc2l6ZW9mKHVpbnQ4X3QpKTsKICAgICB9CiAKICAgICBpZiAoIUlTX0lOVFJBMTZ4MTYobWJfdHlwZSkgJiYKLSAgICAgICAgKCFJU19TS0lQKG1iX3R5cGUpIHx8IGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikpIHsKLSAgICAgICAgaWYgKCh2bGMgPSBzdnEzX2dldF91ZV9nb2xvbWIoJmgtPmdiKSkgPj0gNDhVKXsKLSAgICAgICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2JwX3ZsYz0lIlBSSXUzMiJcbiIsIHZsYyk7CisgICAgICAgICghSVNfU0tJUChtYl90eXBlKSB8fCBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpKSB7CisgICAgICAgIGlmICgodmxjID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYigmcy0+Z2Jfc2xpY2UpKSA+PSA0OFUpeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYnBfdmxjPSUiUFJJdTMyIlxuIiwgdmxjKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGNicCA9IElTX0lOVFJBKG1iX3R5cGUpID8gZ29sb21iX3RvX2ludHJhNHg0X2NicFt2bGNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ29sb21iX3RvX2ludGVyX2NicFt2bGNdOworICAgICAgICBjYnAgPSBJU19JTlRSQShtYl90eXBlKSA/IGZmX2gyNjRfZ29sb21iX3RvX2ludHJhNHg0X2NicFt2bGNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfaDI2NF9nb2xvbWJfdG9faW50ZXJfY2JwW3ZsY107CiAgICAgfQogICAgIGlmIChJU19JTlRSQTE2eDE2KG1iX3R5cGUpIHx8Ci0gICAgICAgIChoLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kgJiYgcy0+YWRhcHRpdmVfcXVhbnQgJiYgY2JwKSkgewotICAgICAgICBzbC0+cXNjYWxlICs9IHN2cTNfZ2V0X3NlX2dvbG9tYigmaC0+Z2IpOworICAgICAgICAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9JICYmIHMtPmFkYXB0aXZlX3F1YW50ICYmIGNicCkpIHsKKyAgICAgICAgcy0+cXNjYWxlICs9IGdldF9pbnRlcmxlYXZlZF9zZV9nb2xvbWIoJnMtPmdiX3NsaWNlKTsKIAotICAgICAgICBpZiAoc2wtPnFzY2FsZSA+IDMxdSkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJxc2NhbGU6JWRcbiIsIHNsLT5xc2NhbGUpOworICAgICAgICBpZiAocy0+cXNjYWxlID4gMzF1KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInFzY2FsZTolZFxuIiwgcy0+cXNjYWxlKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoSVNfSU5UUkExNngxNihtYl90eXBlKSkgewotICAgICAgICBBVl9aRVJPMTI4KHNsLT5tYl9sdW1hX2RjWzBdICsgMCk7Ci0gICAgICAgIEFWX1pFUk8xMjgoc2wtPm1iX2x1bWFfZGNbMF0gKyA4KTsKLSAgICAgICAgaWYgKHN2cTNfZGVjb2RlX2Jsb2NrKCZoLT5nYiwgc2wtPm1iX2x1bWFfZGNbMF0sIDAsIDEpKSB7Ci0gICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgQVZfWkVSTzEyOChzLT5tYl9sdW1hX2RjWzBdICsgMCk7CisgICAgICAgIEFWX1pFUk8xMjgocy0+bWJfbHVtYV9kY1swXSArIDgpOworICAgICAgICBpZiAoc3ZxM19kZWNvZGVfYmxvY2soJnMtPmdiX3NsaWNlLCBzLT5tYl9sdW1hX2RjWzBdLCAwLCAxKSkgeworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgImVycm9yIHdoaWxlIGRlY29kaW5nIGludHJhIGx1bWEgZGNcbiIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC03MjYsNyArOTYyLDcgQEAKIAogICAgIGlmIChjYnApIHsKICAgICAgICAgY29uc3QgaW50IGluZGV4ID0gSVNfSU5UUkExNngxNihtYl90eXBlKSA/IDEgOiAwOwotICAgICAgICBjb25zdCBpbnQgdHlwZSAgPSAoKHNsLT5xc2NhbGUgPCAyNCAmJiBJU19JTlRSQTR4NChtYl90eXBlKSkgPyAyIDogMSk7CisgICAgICAgIGNvbnN0IGludCB0eXBlICA9ICgocy0+cXNjYWxlIDwgMjQgJiYgSVNfSU5UUkE0eDQobWJfdHlwZSkpID8gMiA6IDEpOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgICAgICBpZiAoKGNicCAmICgxIDw8IGkpKSkgewpAQCAtNzM0LDEwICs5NzAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgayA9IGluZGV4ID8gKDEgKiAoaiAmIDEpICsgMiAqIChpICYgMSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIChqICYgMikgKyA0ICogKGkgJiAyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKDQgKiBpICsgaik7Ci0gICAgICAgICAgICAgICAgICAgIHNsLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtrXV0gPSAxOworICAgICAgICAgICAgICAgICAgICBzLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtrXV0gPSAxOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdnEzX2RlY29kZV9ibG9jaygmaC0+Z2IsICZzbC0+bWJbMTYgKiBrXSwgaW5kZXgsIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2cTNfZGVjb2RlX2Jsb2NrKCZzLT5nYl9zbGljZSwgJnMtPm1iWzE2ICoga10sIGluZGV4LCB0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdoaWxlIGRlY29kaW5nIGJsb2NrXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzQ2LDggKzk4Miw4IEBACiAKICAgICAgICAgaWYgKChjYnAgJiAweDMwKSkgewogICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDM7ICsraSkKLSAgICAgICAgICAgICAgICBpZiAoc3ZxM19kZWNvZGVfYmxvY2soJmgtPmdiLCAmc2wtPm1iWzE2ICogMTYgKiBpXSwgMCwgMykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgaWYgKHN2cTNfZGVjb2RlX2Jsb2NrKCZzLT5nYl9zbGljZSwgJnMtPm1iWzE2ICogMTYgKiBpXSwgMCwgMykpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2hpbGUgZGVjb2RpbmcgY2hyb21hIGRjIGJsb2NrXG4iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KQEAgLTc1NiwxMCArOTkyLDEwIEBACiAgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNiAqIGkgKyBqOwotICAgICAgICAgICAgICAgICAgICAgICAgc2wtPm5vbl96ZXJvX2NvdW50X2NhY2hlW3NjYW44W2tdXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5ub25femVyb19jb3VudF9jYWNoZVtzY2FuOFtrXV0gPSAxOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ZxM19kZWNvZGVfYmxvY2soJmgtPmdiLCAmc2wtPm1iWzE2ICoga10sIDEsIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ZxM19kZWNvZGVfYmxvY2soJnMtPmdiX3NsaWNlLCAmcy0+bWJbMTYgKiBrXSwgMSwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdoaWxlIGRlY29kaW5nIGNocm9tYSBhYyBibG9ja1xuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNzY5LDExICsxMDA1LDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzbC0+Y2JwICAgICAgICAgICAgICAgICAgID0gY2JwOwotICAgIGgtPmN1cl9waWMubWJfdHlwZVttYl94eV0gPSBtYl90eXBlOworICAgIHMtPmNicCAgICAgICAgICAgICAgICAgICAgID0gY2JwOworICAgIHMtPmN1cl9waWMtPm1iX3R5cGVbbWJfeHldID0gbWJfdHlwZTsKIAogICAgIGlmIChJU19JTlRSQShtYl90eXBlKSkKLSAgICAgICAgc2wtPmNocm9tYV9wcmVkX21vZGUgPSBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShoLCBzbCwgRENfUFJFRDh4OCwgMSk7CisgICAgICAgIHMtPmNocm9tYV9wcmVkX21vZGUgPSBmZl9oMjY0X2NoZWNrX2ludHJhX3ByZWRfbW9kZShzLT5hdmN0eCwgcy0+dG9wX3NhbXBsZXNfYXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGVmdF9zYW1wbGVzX2F2YWlsYWJsZSwgRENfUFJFRDh4OCwgMSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTc4MSwxMDEgKzEwMTgsMTE1IEBACiBzdGF0aWMgaW50IHN2cTNfZGVjb2RlX3NsaWNlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgU1ZRM0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEgyNjRDb250ZXh0ICpoICAgID0gJnMtPmg7Ci0gICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOwotICAgIGNvbnN0IGludCBtYl94eSAgID0gc2wtPm1iX3h5OworICAgIGNvbnN0IGludCBtYl94eSAgID0gcy0+bWJfeHk7CiAgICAgaW50IGksIGhlYWRlcjsKICAgICB1bnNpZ25lZCBzbGljZV9pZDsKIAotICAgIGhlYWRlciA9IGdldF9iaXRzKCZoLT5nYiwgOCk7CisgICAgaGVhZGVyID0gZ2V0X2JpdHMoJnMtPmdiLCA4KTsKIAogICAgIGlmICgoKGhlYWRlciAmIDB4OUYpICE9IDEgJiYgKGhlYWRlciAmIDB4OUYpICE9IDIpIHx8IChoZWFkZXIgJiAweDYwKSA9PSAwKSB7CiAgICAgICAgIC8qIFRPRE86IHdoYXQ/ICovCiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgc2xpY2UgaGVhZGVyICglMDJYKVxuIiwgaGVhZGVyKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzbGljZV9iaXRzLCBzbGljZV9ieXRlcywgc2xpY2VfbGVuZ3RoOwogICAgICAgICBpbnQgbGVuZ3RoID0gaGVhZGVyID4+IDUgJiAzOwogCi0gICAgICAgIHMtPm5leHRfc2xpY2VfaW5kZXggPSBnZXRfYml0c19jb3VudCgmaC0+Z2IpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKiBzaG93X2JpdHMoJmgtPmdiLCA4ICogbGVuZ3RoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICogbGVuZ3RoOworICAgICAgICBzbGljZV9sZW5ndGggPSBzaG93X2JpdHMoJnMtPmdiLCA4ICogbGVuZ3RoKTsKKyAgICAgICAgc2xpY2VfYml0cyAgID0gc2xpY2VfbGVuZ3RoICogODsKKyAgICAgICAgc2xpY2VfYnl0ZXMgID0gc2xpY2VfbGVuZ3RoICsgbGVuZ3RoIC0gMTsKIAotICAgICAgICBpZiAocy0+bmV4dF9zbGljZV9pbmRleCA+IGgtPmdiLnNpemVfaW5fYml0cykgeworICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCA4KTsKKworICAgICAgICBhdl9mYXN0X21hbGxvYygmcy0+c2xpY2VfYnVmLCAmcy0+c2xpY2Vfc2l6ZSwgc2xpY2VfYnl0ZXMgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgaWYgKCFzLT5zbGljZV9idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGlmIChzbGljZV9ieXRlcyAqIDhMTCA+IGdldF9iaXRzX2xlZnQoJnMtPmdiKSkgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJzbGljZSBhZnRlciBiaXRzdHJlYW0gZW5kXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9Ci0KLSAgICAgICAgaC0+Z2Iuc2l6ZV9pbl9iaXRzID0gcy0+bmV4dF9zbGljZV9pbmRleCAtIDggKiAobGVuZ3RoIC0gMSk7Ci0gICAgICAgIHNraXBfYml0cygmaC0+Z2IsIDgpOworICAgICAgICBtZW1jcHkocy0+c2xpY2VfYnVmLCBzLT5nYi5idWZmZXIgKyBzLT5nYi5pbmRleCAvIDgsIHNsaWNlX2J5dGVzKTsKIAogICAgICAgICBpZiAocy0+d2F0ZXJtYXJrX2tleSkgewotICAgICAgICAgICAgdWludDMyX3QgaGVhZGVyID0gQVZfUkwzMigmaC0+Z2IuYnVmZmVyWyhnZXRfYml0c19jb3VudCgmaC0+Z2IpID4+IDMpICsgMV0pOwotICAgICAgICAgICAgQVZfV0wzMigmaC0+Z2IuYnVmZmVyWyhnZXRfYml0c19jb3VudCgmaC0+Z2IpID4+IDMpICsgMV0sCi0gICAgICAgICAgICAgICAgICAgIGhlYWRlciBeIHMtPndhdGVybWFya19rZXkpOworICAgICAgICAgICAgdWludDMyX3QgaGVhZGVyID0gQVZfUkwzMigmcy0+c2xpY2VfYnVmWzFdKTsKKyAgICAgICAgICAgIEFWX1dMMzIoJnMtPnNsaWNlX2J1ZlsxXSwgaGVhZGVyIF4gcy0+d2F0ZXJtYXJrX2tleSk7CiAgICAgICAgIH0KKyAgICAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2Jfc2xpY2UsIHMtPnNsaWNlX2J1Ziwgc2xpY2VfYml0cyk7CisKICAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKLSAgICAgICAgICAgIG1lbW1vdmUoKHVpbnQ4X3QgKikgJmgtPmdiLmJ1ZmZlcltnZXRfYml0c19jb3VudCgmaC0+Z2IpID4+IDNdLAotICAgICAgICAgICAgICAgICAgICAmaC0+Z2IuYnVmZmVyW2gtPmdiLnNpemVfaW5fYml0cyA+PiAzXSwgbGVuZ3RoIC0gMSk7CisgICAgICAgICAgICBtZW1tb3ZlKHMtPnNsaWNlX2J1ZiwgJnMtPnNsaWNlX2J1ZltzbGljZV9sZW5ndGhdLCBsZW5ndGggLSAxKTsKICAgICAgICAgfQotICAgICAgICBza2lwX2JpdHNfbG9uZygmaC0+Z2IsIDApOworICAgICAgICBza2lwX2JpdHNfbG9uZygmcy0+Z2IsIHNsaWNlX2J5dGVzICogOCk7CiAgICAgfQogCi0gICAgaWYgKChzbGljZV9pZCA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmaC0+Z2IpKSA+PSAzKSB7Ci0gICAgICAgIGF2X2xvZyhoLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaWxsZWdhbCBzbGljZSB0eXBlICV1IFxuIiwgc2xpY2VfaWQpOworICAgIGlmICgoc2xpY2VfaWQgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZzLT5nYl9zbGljZSkpID49IDMpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbGxlZ2FsIHNsaWNlIHR5cGUgJXUgXG4iLCBzbGljZV9pZCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBzbC0+c2xpY2VfdHlwZSA9IGdvbG9tYl90b19waWN0X3R5cGVbc2xpY2VfaWRdOworICAgIHMtPnNsaWNlX3R5cGUgPSBmZl9oMjY0X2dvbG9tYl90b19waWN0X3R5cGVbc2xpY2VfaWRdOwogCiAgICAgaWYgKChoZWFkZXIgJiAweDlGKSA9PSAyKSB7Ci0gICAgICAgIGkgICAgICAgICAgICAgID0gKGgtPm1iX251bSA8IDY0KSA/IDYgOiAoMSArIGF2X2xvZzIoaC0+bWJfbnVtIC0gMSkpOwotICAgICAgICBzbC0+bWJfc2tpcF9ydW4gPSBnZXRfYml0cygmaC0+Z2IsIGkpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoc2wtPm1iX3kgKiBoLT5tYl93aWR0aCArIHNsLT5tYl94KTsKLSAgICB9IGVsc2UgewotICAgICAgICBza2lwX2JpdHMxKCZoLT5nYik7Ci0gICAgICAgIHNsLT5tYl9za2lwX3J1biA9IDA7CisgICAgICAgIGkgPSAocy0+bWJfbnVtIDwgNjQpID8gNiA6ICgxICsgYXZfbG9nMihzLT5tYl9udW0gLSAxKSk7CisgICAgICAgIGdldF9iaXRzKCZzLT5nYl9zbGljZSwgaSk7CisgICAgfSBlbHNlIGlmIChnZXRfYml0czEoJnMtPmdiX3NsaWNlKSkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIk1lZGlhIGtleSBlbmNyeXB0aW9uIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKLSAgICBzbC0+c2xpY2VfbnVtICAgICA9IGdldF9iaXRzKCZoLT5nYiwgOCk7Ci0gICAgc2wtPnFzY2FsZSAgICAgICAgPSBnZXRfYml0cygmaC0+Z2IsIDUpOwotICAgIHMtPmFkYXB0aXZlX3F1YW50ID0gZ2V0X2JpdHMxKCZoLT5nYik7CisgICAgcy0+c2xpY2VfbnVtICAgICAgPSBnZXRfYml0cygmcy0+Z2Jfc2xpY2UsIDgpOworICAgIHMtPnFzY2FsZSAgICAgICAgID0gZ2V0X2JpdHMoJnMtPmdiX3NsaWNlLCA1KTsKKyAgICBzLT5hZGFwdGl2ZV9xdWFudCA9IGdldF9iaXRzMSgmcy0+Z2Jfc2xpY2UpOwogCiAgICAgLyogdW5rbm93biBmaWVsZHMgKi8KLSAgICBza2lwX2JpdHMxKCZoLT5nYik7CisgICAgc2tpcF9iaXRzMSgmcy0+Z2Jfc2xpY2UpOwogCiAgICAgaWYgKHMtPmhhc193YXRlcm1hcmspCi0gICAgICAgIHNraXBfYml0czEoJmgtPmdiKTsKKyAgICAgICAgc2tpcF9iaXRzMSgmcy0+Z2Jfc2xpY2UpOwogCi0gICAgc2tpcF9iaXRzMSgmaC0+Z2IpOwotICAgIHNraXBfYml0cygmaC0+Z2IsIDIpOworICAgIHNraXBfYml0czEoJnMtPmdiX3NsaWNlKTsKKyAgICBza2lwX2JpdHMoJnMtPmdiX3NsaWNlLCAyKTsKIAotICAgIGlmIChza2lwXzFzdG9wXzhkYXRhX2JpdHMoJmgtPmdiKSA8IDApCisgICAgaWYgKHNraXBfMXN0b3BfOGRhdGFfYml0cygmcy0+Z2Jfc2xpY2UpIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAvKiByZXNldCBpbnRyYSBwcmVkaWN0b3JzIGFuZCBpbnZhbGlkYXRlIG1vdGlvbiB2ZWN0b3IgcmVmZXJlbmNlcyAqLwotICAgIGlmIChzbC0+bWJfeCA+IDApIHsKLSAgICAgICAgbWVtc2V0KHNsLT5pbnRyYTR4NF9wcmVkX21vZGUgKyBoLT5tYjJicl94eVttYl94eSAtIDFdICsgMywKKyAgICBpZiAocy0+bWJfeCA+IDApIHsKKyAgICAgICAgbWVtc2V0KHMtPmludHJhNHg0X3ByZWRfbW9kZSArIHMtPm1iMmJyX3h5W21iX3h5IC0gMV0gKyAzLAogICAgICAgICAgICAgICAgLTEsIDQgKiBzaXplb2YoaW50OF90KSk7Ci0gICAgICAgIG1lbXNldChzbC0+aW50cmE0eDRfcHJlZF9tb2RlICsgaC0+bWIyYnJfeHlbbWJfeHkgLSBzbC0+bWJfeF0sCi0gICAgICAgICAgICAgICAtMSwgOCAqIHNpemVvZihpbnQ4X3QpICogc2wtPm1iX3gpOworICAgICAgICBtZW1zZXQocy0+aW50cmE0eDRfcHJlZF9tb2RlICsgcy0+bWIyYnJfeHlbbWJfeHkgLSBzLT5tYl94XSwKKyAgICAgICAgICAgICAgIC0xLCA4ICogc2l6ZW9mKGludDhfdCkgKiBzLT5tYl94KTsKICAgICB9Ci0gICAgaWYgKHNsLT5tYl95ID4gMCkgewotICAgICAgICBtZW1zZXQoc2wtPmludHJhNHg0X3ByZWRfbW9kZSArIGgtPm1iMmJyX3h5W21iX3h5IC0gaC0+bWJfc3RyaWRlXSwKLSAgICAgICAgICAgICAgIC0xLCA4ICogc2l6ZW9mKGludDhfdCkgKiAoaC0+bWJfd2lkdGggLSBzbC0+bWJfeCkpOworICAgIGlmIChzLT5tYl95ID4gMCkgeworICAgICAgICBtZW1zZXQocy0+aW50cmE0eDRfcHJlZF9tb2RlICsgcy0+bWIyYnJfeHlbbWJfeHkgLSBzLT5tYl9zdHJpZGVdLAorICAgICAgICAgICAgICAgLTEsIDggKiBzaXplb2YoaW50OF90KSAqIChzLT5tYl93aWR0aCAtIHMtPm1iX3gpKTsKIAotICAgICAgICBpZiAoc2wtPm1iX3ggPiAwKQotICAgICAgICAgICAgc2wtPmludHJhNHg0X3ByZWRfbW9kZVtoLT5tYjJicl94eVttYl94eSAtIGgtPm1iX3N0cmlkZSAtIDFdICsgM10gPSAtMTsKKyAgICAgICAgaWYgKHMtPm1iX3ggPiAwKQorICAgICAgICAgICAgcy0+aW50cmE0eDRfcHJlZF9tb2RlW3MtPm1iMmJyX3h5W21iX3h5IC0gcy0+bWJfc3RyaWRlIC0gMV0gKyAzXSA9IC0xOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBpbml0X2RlcXVhbnQ0X2NvZWZmX3RhYmxlKFNWUTNDb250ZXh0ICpzKQoreworICAgIGludCBxLCB4OworICAgIGNvbnN0IGludCBtYXhfcXAgPSA1MTsKKworICAgIGZvciAocSA9IDA7IHEgPCBtYXhfcXAgKyAxOyBxKyspIHsKKyAgICAgICAgaW50IHNoaWZ0ID0gZmZfaDI2NF9xdWFudF9kaXY2W3FdICsgMjsKKyAgICAgICAgaW50IGlkeCAgID0gZmZfaDI2NF9xdWFudF9yZW02W3FdOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHgrKykKKyAgICAgICAgICAgIHMtPmRlcXVhbnQ0X2NvZWZmW3FdWyh4ID4+IDIpIHwgKCh4IDw8IDIpICYgMHhGKV0gPQorICAgICAgICAgICAgICAgICgodWludDMyX3QpZmZfaDI2NF9kZXF1YW50NF9jb2VmZl9pbml0W2lkeF1bKHggJiAxKSArICgoeCA+PiAyKSAmIDEpXSAqIDE2KSA8PCBzaGlmdDsKKyAgICB9Cit9CisKIHN0YXRpYyBhdl9jb2xkIGludCBzdnEzX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBTVlEzQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgSDI2NENvbnRleHQgKmggPSAmcy0+aDsKLSAgICBIMjY0U2xpY2VDb250ZXh0ICpzbDsKLSAgICBpbnQgbTsKKyAgICBpbnQgbSwgeCwgeTsKICAgICB1bnNpZ25lZCBjaGFyICpleHRyYWRhdGE7CiAgICAgdW5zaWduZWQgY2hhciAqZXh0cmFkYXRhX2VuZDsKICAgICB1bnNpZ25lZCBpbnQgc2l6ZTsKQEAgLTg5Niw0MSArMTE0NywyMCBAQAogICAgIGlmICghcy0+Y3VyX3BpYy0+ZiB8fCAhcy0+bGFzdF9waWMtPmYgfHwgIXMtPm5leHRfcGljLT5mKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgaWYgKChyZXQgPSBmZl9oMjY0X2RlY29kZV9pbml0KGF2Y3R4KSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7CisgICAgZmZfaDI2NGRzcF9pbml0KCZzLT5oMjY0ZHNwLCA4LCAxKTsKKyAgICBmZl9oMjY0X3ByZWRfaW5pdCgmcy0+aHBjLCBBVl9DT0RFQ19JRF9TVlEzLCA4LCAxKTsKKyAgICBmZl92aWRlb2RzcF9pbml0KCZzLT52ZHNwLCA4KTsKIAotICAgIC8vIHdlIHdpbGwgb3ZlcndyaXRlIGl0IGxhdGVyIGR1cmluZyBkZWNvZGluZwotICAgIGF2X2ZyYW1lX2ZyZWUoJmgtPmN1cl9waWMuZik7Ci0KLSAgICBhdl9mcmFtZV9mcmVlKCZoLT5sYXN0X3BpY19mb3JfZWMuZik7Ci0KLSAgICBmZl9oMjY0ZHNwX2luaXQoJmgtPmgyNjRkc3AsIDgsIDEpOwotICAgIGF2X2Fzc2VydDAoaC0+c3BzLmJpdF9kZXB0aF9jaHJvbWEgPT0gMCk7Ci0gICAgZmZfaDI2NF9wcmVkX2luaXQoJmgtPmhwYywgQVZfQ09ERUNfSURfU1ZRMywgOCwgMSk7Ci0gICAgZmZfdmlkZW9kc3BfaW5pdCgmaC0+dmRzcCwgOCk7Ci0KLSAgICBtZW1zZXQoaC0+cHBzLnNjYWxpbmdfbWF0cml4NCwgMTYsIDYgKiAxNiAqIHNpemVvZih1aW50OF90KSk7Ci0gICAgbWVtc2V0KGgtPnBwcy5zY2FsaW5nX21hdHJpeDgsIDE2LCAyICogNjQgKiBzaXplb2YodWludDhfdCkpOwogCiAgICAgYXZjdHgtPmJpdHNfcGVyX3Jhd19zYW1wbGUgPSA4OwotICAgIGgtPnNwcy5iaXRfZGVwdGhfbHVtYSA9IDg7Ci0gICAgaC0+Y2hyb21hX2Zvcm1hdF9pZGMgPSAxOwogCiAgICAgZmZfaHBlbGRzcF9pbml0KCZzLT5oZHNwLCBhdmN0eC0+ZmxhZ3MpOwogICAgIGZmX3RwZWxkc3BfaW5pdCgmcy0+dGRzcCk7CiAKLSAgICBzbCA9IGgtPnNsaWNlX2N0eDsKLQotICAgIGgtPmZsYWdzICAgICAgICAgICA9IGF2Y3R4LT5mbGFnczsKLSAgICBzbC0+aXNfY29tcGxleCAgICAgPSAxOwotICAgIGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYyA9IDE7Ci0gICAgaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBQSUNUX0ZSQU1FOwogICAgIGF2Y3R4LT5waXhfZm10ICAgICA9IEFWX1BJWF9GTVRfWVVWSjQyMFA7CiAgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKIAotICAgIGgtPnNsaWNlX2N0eFswXS5jaHJvbWFfcXBbMF0gPSBoLT5zbGljZV9jdHhbMF0uY2hyb21hX3FwWzFdID0gNDsKLSAgICBoLT5jaHJvbWFfeF9zaGlmdCA9IGgtPmNocm9tYV95X3NoaWZ0ID0gMTsKLQorICAgIHMtPmF2Y3R4ICAgICAgICAgPSBhdmN0eDsKICAgICBzLT5oYWxmcGVsX2ZsYWcgID0gMTsKICAgICBzLT50aGlyZHBlbF9mbGFnID0gMTsKICAgICBzLT5oYXNfd2F0ZXJtYXJrID0gMDsKQEAgLTEwMDcsNyArMTIzNyw3IEBACiAgICAgICAgIHVuazIgPSBnZXRfYml0czEoJmdiKTsKICAgICAgICAgdW5rMyA9IGdldF9iaXRzMSgmZ2IpOwogCi0gICAgICAgIGgtPmxvd19kZWxheSA9IGdldF9iaXRzMSgmZ2IpOworICAgICAgICBzLT5sb3dfZGVsYXkgPSBnZXRfYml0czEoJmdiKTsKIAogICAgICAgICAvKiB1bmtub3duIGZpZWxkICovCiAgICAgICAgIHVuazQgPSBnZXRfYml0czEoJmdiKTsKQEAgLTEwMjEsMTUgKzEyNTEsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIHMtPmhhc193YXRlcm1hcmsgID0gZ2V0X2JpdHMxKCZnYik7Ci0gICAgICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMgPSAhaC0+bG93X2RlbGF5OworICAgICAgICBhdmN0eC0+aGFzX2JfZnJhbWVzID0gIXMtPmxvd19kZWxheTsKICAgICAgICAgaWYgKHMtPmhhc193YXRlcm1hcmspIHsKICNpZiBDT05GSUdfWkxJQgotICAgICAgICAgICAgdW5zaWduZWQgd2F0ZXJtYXJrX3dpZHRoICA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOwotICAgICAgICAgICAgdW5zaWduZWQgd2F0ZXJtYXJrX2hlaWdodCA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOwotICAgICAgICAgICAgaW50IHUxICAgICAgICAgICAgICAgICAgICA9IHN2cTNfZ2V0X3VlX2dvbG9tYigmZ2IpOworICAgICAgICAgICAgdW5zaWduZWQgd2F0ZXJtYXJrX3dpZHRoICA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJmdiKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIHdhdGVybWFya19oZWlnaHQgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZnYik7CisgICAgICAgICAgICBpbnQgdTEgICAgICAgICAgICAgICAgICAgID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYigmZ2IpOwogICAgICAgICAgICAgaW50IHUyICAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzKCZnYiwgOCk7CiAgICAgICAgICAgICBpbnQgdTMgICAgICAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoJmdiLCAyKTsKLSAgICAgICAgICAgIGludCB1NCAgICAgICAgICAgICAgICAgICAgPSBzdnEzX2dldF91ZV9nb2xvbWIoJmdiKTsKKyAgICAgICAgICAgIGludCB1NCAgICAgICAgICAgICAgICAgICAgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZnYik7CiAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zl9sZW4gICAgID0gd2F0ZXJtYXJrX3dpZHRoICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRlcm1hcmtfaGVpZ2h0ICogNDsKICAgICAgICAgICAgIGludCBvZmZzZXQgICAgICAgICAgICAgICAgPSBnZXRfYml0c19jb3VudCgmZ2IpICsgNyA+PiAzOwpAQCAtMTA3MywyMCArMTMwMywzMSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaC0+d2lkdGggID0gYXZjdHgtPndpZHRoOwotICAgIGgtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7Ci0gICAgaC0+bWJfd2lkdGggID0gKGgtPndpZHRoICsgMTUpIC8gMTY7Ci0gICAgaC0+bWJfaGVpZ2h0ID0gKGgtPmhlaWdodCArIDE1KSAvIDE2OwotICAgIGgtPm1iX3N0cmlkZSA9IGgtPm1iX3dpZHRoICsgMTsKLSAgICBoLT5tYl9udW0gICAgPSBoLT5tYl93aWR0aCAqIGgtPm1iX2hlaWdodDsKLSAgICBoLT5iX3N0cmlkZSA9IDQgKiBoLT5tYl93aWR0aDsKLSAgICBzLT5oX2VkZ2VfcG9zID0gaC0+bWJfd2lkdGggKiAxNjsKLSAgICBzLT52X2VkZ2VfcG9zID0gaC0+bWJfaGVpZ2h0ICogMTY7CisgICAgcy0+bWJfd2lkdGggICA9IChhdmN0eC0+d2lkdGggKyAxNSkgLyAxNjsKKyAgICBzLT5tYl9oZWlnaHQgID0gKGF2Y3R4LT5oZWlnaHQgKyAxNSkgLyAxNjsKKyAgICBzLT5tYl9zdHJpZGUgID0gcy0+bWJfd2lkdGggKyAxOworICAgIHMtPm1iX251bSAgICAgPSBzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodDsKKyAgICBzLT5iX3N0cmlkZSAgID0gNCAqIHMtPm1iX3dpZHRoOworICAgIHMtPmhfZWRnZV9wb3MgPSBzLT5tYl93aWR0aCAqIDE2OworICAgIHMtPnZfZWRnZV9wb3MgPSBzLT5tYl9oZWlnaHQgKiAxNjsKIAotICAgIGlmICgocmV0ID0gZmZfaDI2NF9hbGxvY190YWJsZXMoaCkpIDwgMCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInN2cTMgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KKyAgICBzLT5pbnRyYTR4NF9wcmVkX21vZGUgPSBhdl9tYWxsb2N6KHMtPm1iX3N0cmlkZSAqIDIgKiA4KTsKKyAgICBpZiAoIXMtPmludHJhNHg0X3ByZWRfbW9kZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPm1iMmJyX3h5ID0gYXZfbWFsbG9jeihzLT5tYl9zdHJpZGUgKiAocy0+bWJfaGVpZ2h0ICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPm1iMmJyX3h5KSk7CisgICAgaWYgKCFzLT5tYjJicl94eSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBzLT5tYl9oZWlnaHQ7IHkrKykKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPm1iX3dpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBtYl94eSA9IHggKyB5ICogcy0+bWJfc3RyaWRlOworCisgICAgICAgICAgICBzLT5tYjJicl94eVttYl94eV0gPSA4ICogKG1iX3h5ICUgKDIgKiBzLT5tYl9zdHJpZGUpKTsKKyAgICAgICAgfQorCisgICAgaW5pdF9kZXF1YW50NF9jb2VmZl90YWJsZShzKTsKIAogICAgIHJldHVybiAwOwogZmFpbDoKQEAgLTEwOTQsNyArMTMzNSw3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgZnJlZV9waWN0dXJlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgSDI2NFBpY3R1cmUgKnBpYykKK3N0YXRpYyB2b2lkIGZyZWVfcGljdHVyZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFNWUTNGcmFtZSAqcGljKQogewogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKQEAgLTExMDYsMjQgKzEzNDcsMjIgQEAKICAgICBhdl9mcmFtZV91bnJlZihwaWMtPmYpOwogfQogCi1zdGF0aWMgaW50IGdldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBIMjY0UGljdHVyZSAqcGljKQorc3RhdGljIGludCBnZXRfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgU1ZRM0ZyYW1lICpwaWMpCiB7CiAgICAgU1ZRM0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEgyNjRDb250ZXh0ICpoID0gJnMtPmg7Ci0gICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOwotICAgIGNvbnN0IGludCBiaWdfbWJfbnVtICAgID0gaC0+bWJfc3RyaWRlICogKGgtPm1iX2hlaWdodCArIDEpICsgMTsKLSAgICBjb25zdCBpbnQgbWJfYXJyYXlfc2l6ZSA9IGgtPm1iX3N0cmlkZSAqIGgtPm1iX2hlaWdodDsKLSAgICBjb25zdCBpbnQgYjRfc3RyaWRlICAgICA9IGgtPm1iX3dpZHRoICogNCArIDE7Ci0gICAgY29uc3QgaW50IGI0X2FycmF5X3NpemUgPSBiNF9zdHJpZGUgKiBoLT5tYl9oZWlnaHQgKiA0OworICAgIGNvbnN0IGludCBiaWdfbWJfbnVtICAgID0gcy0+bWJfc3RyaWRlICogKHMtPm1iX2hlaWdodCArIDEpICsgMTsKKyAgICBjb25zdCBpbnQgbWJfYXJyYXlfc2l6ZSA9IHMtPm1iX3N0cmlkZSAqIHMtPm1iX2hlaWdodDsKKyAgICBjb25zdCBpbnQgYjRfc3RyaWRlICAgICA9IHMtPm1iX3dpZHRoICogNCArIDE7CisgICAgY29uc3QgaW50IGI0X2FycmF5X3NpemUgPSBiNF9zdHJpZGUgKiBzLT5tYl9oZWlnaHQgKiA0OwogICAgIGludCByZXQ7CiAKICAgICBpZiAoIXBpYy0+bW90aW9uX3ZhbF9idWZbMF0pIHsKICAgICAgICAgaW50IGk7CiAKLSAgICAgICAgcGljLT5tYl90eXBlX2J1ZiA9IGF2X2J1ZmZlcl9hbGxvY3ooKGJpZ19tYl9udW0gKyBoLT5tYl9zdHJpZGUpICogc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIHBpYy0+bWJfdHlwZV9idWYgPSBhdl9idWZmZXJfYWxsb2N6KChiaWdfbWJfbnVtICsgcy0+bWJfc3RyaWRlKSAqIHNpemVvZih1aW50MzJfdCkpOwogICAgICAgICBpZiAoIXBpYy0+bWJfdHlwZV9idWYpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBwaWMtPm1iX3R5cGUgPSAodWludDMyX3QqKXBpYy0+bWJfdHlwZV9idWYtPmRhdGEgKyAyICogaC0+bWJfc3RyaWRlICsgMTsKKyAgICAgICAgcGljLT5tYl90eXBlID0gKHVpbnQzMl90KilwaWMtPm1iX3R5cGVfYnVmLT5kYXRhICsgMiAqIHMtPm1iX3N0cmlkZSArIDE7CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewogICAgICAgICAgICAgcGljLT5tb3Rpb25fdmFsX2J1ZltpXSA9IGF2X2J1ZmZlcl9hbGxvY3ooMiAqIChiNF9hcnJheV9zaXplICsgNCkgKiBzaXplb2YoaW50MTZfdCkpOwpAQCAtMTEzNywyMiArMTM3NiwxOSBAQAogICAgICAgICAgICAgcGljLT5yZWZfaW5kZXhbaV0gID0gcGljLT5yZWZfaW5kZXhfYnVmW2ldLT5kYXRhOwogICAgICAgICB9CiAgICAgfQotICAgIHBpYy0+cmVmZXJlbmNlID0gIShoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpOwogCiAgICAgcmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLT5mLAotICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5yZWZlcmVuY2UgPyBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGIDogMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfR0VUX0JVRkZFUl9GTEFHX1JFRiA6IDApOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICBpZiAoIXNsLT5lZGdlX2VtdV9idWZmZXIpIHsKLSAgICAgICAgc2wtPmVkZ2VfZW11X2J1ZmZlciA9IGF2X21hbGxvY3pfYXJyYXkocGljLT5mLT5saW5lc2l6ZVswXSwgMTcpOwotICAgICAgICBpZiAoIXNsLT5lZGdlX2VtdV9idWZmZXIpCisgICAgaWYgKCFzLT5lZGdlX2VtdV9idWZmZXIpIHsKKyAgICAgICAgcy0+ZWRnZV9lbXVfYnVmZmVyID0gYXZfbWFsbG9jel9hcnJheShwaWMtPmYtPmxpbmVzaXplWzBdLCAxNyk7CisgICAgICAgIGlmICghcy0+ZWRnZV9lbXVfYnVmZmVyKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAKLSAgICBzbC0+bGluZXNpemUgICA9IHBpYy0+Zi0+bGluZXNpemVbMF07Ci0gICAgc2wtPnV2bGluZXNpemUgPSBwaWMtPmYtPmxpbmVzaXplWzFdOwotCiAgICAgcmV0dXJuIDA7CiBmYWlsOgogICAgIGZyZWVfcGljdHVyZShhdmN0eCwgcGljKTsKQEAgLTExNjMsOCArMTM5OSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCiB7CiAgICAgU1ZRM0NvbnRleHQgKnMgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBIMjY0Q29udGV4dCAqaCAgICAgPSAmcy0+aDsKLSAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCA9ICZoLT5zbGljZV9jdHhbMF07CiAgICAgaW50IGJ1Zl9zaXplICAgICAgID0gYXZwa3QtPnNpemU7CiAgICAgaW50IGxlZnQ7CiAgICAgdWludDhfdCAqYnVmOwpAQCAtMTE3Miw3ICsxNDA2LDcgQEAKIAogICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgbGFzdCBwaWN0dXJlICovCiAgICAgaWYgKGJ1Zl9zaXplID09IDApIHsKLSAgICAgICAgaWYgKHMtPm5leHRfcGljLT5mLT5kYXRhWzBdICYmICFoLT5sb3dfZGVsYXkgJiYgIXMtPmxhc3RfZnJhbWVfb3V0cHV0KSB7CisgICAgICAgIGlmIChzLT5uZXh0X3BpYy0+Zi0+ZGF0YVswXSAmJiAhcy0+bG93X2RlbGF5ICYmICFzLT5sYXN0X2ZyYW1lX291dHB1dCkgewogICAgICAgICAgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPm5leHRfcGljLT5mKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC0xMTgyLDcgKzE0MTYsNyBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBzbC0+bWJfeCA9IHNsLT5tYl95ID0gc2wtPm1iX3h5ID0gMDsKKyAgICBzLT5tYl94ID0gcy0+bWJfeSA9IHMtPm1iX3h5ID0gMDsKIAogICAgIGlmIChzLT53YXRlcm1hcmtfa2V5KSB7CiAgICAgICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmcy0+YnVmLCAmcy0+YnVmX3NpemUsIGJ1Zl9zaXplKTsKQEAgLTExOTQsNDEgKzE0MjgsNDAgQEAKICAgICAgICAgYnVmID0gYXZwa3QtPmRhdGE7CiAgICAgfQogCi0gICAgaW5pdF9nZXRfYml0cygmaC0+Z2IsIGJ1ZiwgOCAqIGJ1Zl9zaXplKTsKKyAgICByZXQgPSBpbml0X2dldF9iaXRzKCZzLT5nYiwgYnVmLCA4ICogYnVmX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgaWYgKHN2cTNfZGVjb2RlX3NsaWNlX2hlYWRlcihhdmN0eCkpCiAgICAgICAgIHJldHVybiAtMTsKIAotICAgIGgtPnBpY3RfdHlwZSA9IHNsLT5zbGljZV90eXBlOworICAgIHMtPnBpY3RfdHlwZSA9IHMtPnNsaWNlX3R5cGU7CiAKLSAgICBpZiAoaC0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CKQotICAgICAgICBGRlNXQVAoSDI2NFBpY3R1cmUqLCBzLT5uZXh0X3BpYywgcy0+bGFzdF9waWMpOworICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpCisgICAgICAgIEZGU1dBUChTVlEzRnJhbWUqLCBzLT5uZXh0X3BpYywgcy0+bGFzdF9waWMpOwogCiAgICAgYXZfZnJhbWVfdW5yZWYocy0+Y3VyX3BpYy0+Zik7CiAKICAgICAvKiBmb3Igc2tpcHBpbmcgdGhlIGZyYW1lICovCi0gICAgcy0+Y3VyX3BpYy0+Zi0+cGljdF90eXBlID0gaC0+cGljdF90eXBlOwotICAgIHMtPmN1cl9waWMtPmYtPmtleV9mcmFtZSA9IChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpOworICAgIHMtPmN1cl9waWMtPmYtPnBpY3RfdHlwZSA9IHMtPnBpY3RfdHlwZTsKKyAgICBzLT5jdXJfcGljLT5mLT5rZXlfZnJhbWUgPSAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKTsKIAogICAgIHJldCA9IGdldF9idWZmZXIoYXZjdHgsIHMtPmN1cl9waWMpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgaC0+Y3VyX3BpY19wdHIgPSBzLT5jdXJfcGljOwotICAgIGgtPmN1cl9waWMgICAgID0gKnMtPmN1cl9waWM7Ci0KICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICBoLT5ibG9ja19vZmZzZXRbaV0gICAgICAgICAgID0gKDQgKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pICYgNykpICsgNCAqIHNsLT5saW5lc2l6ZSAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgPj4gMyk7Ci0gICAgICAgIGgtPmJsb2NrX29mZnNldFs0OCArIGldICAgICAgPSAoNCAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgJiA3KSkgKyA4ICogc2wtPmxpbmVzaXplICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSA+PiAzKTsKKyAgICAgICAgcy0+YmxvY2tfb2Zmc2V0W2ldICAgICAgICAgICA9ICg0ICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSAmIDcpKSArIDQgKiBzLT5jdXJfcGljLT5mLT5saW5lc2l6ZVswXSAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgPj4gMyk7CisgICAgICAgIHMtPmJsb2NrX29mZnNldFs0OCArIGldICAgICAgPSAoNCAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgJiA3KSkgKyA4ICogcy0+Y3VyX3BpYy0+Zi0+bGluZXNpemVbMF0gKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pID4+IDMpOwogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICBoLT5ibG9ja19vZmZzZXRbMTYgKyBpXSAgICAgID0KLSAgICAgICAgaC0+YmxvY2tfb2Zmc2V0WzMyICsgaV0gICAgICA9ICg0ICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSAmIDcpKSArIDQgKiBzbC0+dXZsaW5lc2l6ZSAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgPj4gMyk7Ci0gICAgICAgIGgtPmJsb2NrX29mZnNldFs0OCArIDE2ICsgaV0gPQotICAgICAgICBoLT5ibG9ja19vZmZzZXRbNDggKyAzMiArIGldID0gKDQgKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pICYgNykpICsgOCAqIHNsLT51dmxpbmVzaXplICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSA+PiAzKTsKKyAgICAgICAgcy0+YmxvY2tfb2Zmc2V0WzE2ICsgaV0gICAgICA9CisgICAgICAgIHMtPmJsb2NrX29mZnNldFszMiArIGldICAgICAgPSAoNCAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgJiA3KSkgKyA0ICogcy0+Y3VyX3BpYy0+Zi0+bGluZXNpemVbMV0gKiAoKHNjYW44W2ldIC0gc2NhbjhbMF0pID4+IDMpOworICAgICAgICBzLT5ibG9ja19vZmZzZXRbNDggKyAxNiArIGldID0KKyAgICAgICAgcy0+YmxvY2tfb2Zmc2V0WzQ4ICsgMzIgKyBpXSA9ICg0ICogKChzY2FuOFtpXSAtIHNjYW44WzBdKSAmIDcpKSArIDggKiBzLT5jdXJfcGljLT5mLT5saW5lc2l6ZVsxXSAqICgoc2NhbjhbaV0gLSBzY2FuOFswXSkgPj4gMyk7CiAgICAgfQogCi0gICAgaWYgKGgtPnBpY3RfdHlwZSAhPSBBVl9QSUNUVVJFX1RZUEVfSSkgeworICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKICAgICAgICAgaWYgKCFzLT5sYXN0X3BpYy0+Zi0+ZGF0YVswXSkgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNaXNzaW5nIHJlZmVyZW5jZSBmcmFtZS5cbiIpOwogICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocy0+bGFzdF9waWMtPmYpOwpAQCAtMTI0Miw3ICsxNDc1LDcgQEAKICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X3BpYy0+Zi0+bGluZXNpemVbMl0pOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhcy0+bmV4dF9waWMtPmYtPmRhdGFbMF0pIHsKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhcy0+bmV4dF9waWMtPmYtPmRhdGFbMF0pIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyByZWZlcmVuY2UgZnJhbWUuXG4iKTsKICAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKHMtPm5leHRfcGljLT5mKTsKICAgICAgICAgICAgIHJldCA9IGdldF9idWZmZXIoYXZjdHgsIHMtPm5leHRfcGljKTsKQEAgLTEyNTcsNDEgKzE0OTAsNDEgQEAKICAgICB9CiAKICAgICBpZiAoYXZjdHgtPmRlYnVnICYgRkZfREVCVUdfUElDVF9JTkZPKQotICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19ERUJVRywKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsCiAgICAgICAgICAgICAgICAiJWMgaHBlbDolZCwgdHBlbDolZCBhcXA6JWQgcXA6JWQsIHNsaWNlX251bTolMDJYXG4iLAotICAgICAgICAgICAgICAgYXZfZ2V0X3BpY3R1cmVfdHlwZV9jaGFyKGgtPnBpY3RfdHlwZSksCisgICAgICAgICAgICAgICBhdl9nZXRfcGljdHVyZV90eXBlX2NoYXIocy0+cGljdF90eXBlKSwKICAgICAgICAgICAgICAgIHMtPmhhbGZwZWxfZmxhZywgcy0+dGhpcmRwZWxfZmxhZywKLSAgICAgICAgICAgICAgIHMtPmFkYXB0aXZlX3F1YW50LCBoLT5zbGljZV9jdHhbMF0ucXNjYWxlLCBzbC0+c2xpY2VfbnVtKTsKKyAgICAgICAgICAgICAgIHMtPmFkYXB0aXZlX3F1YW50LCBzLT5xc2NhbGUsIHMtPnNsaWNlX251bSk7CiAKLSAgICBpZiAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJiBoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgfHwKLSAgICAgICAgYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTktFWSAmJiBoLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKKyAgICBpZiAoYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTlJFRiAmJiBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgfHwKKyAgICAgICAgYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX05PTktFWSAmJiBzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kgfHwKICAgICAgICAgYXZjdHgtPnNraXBfZnJhbWUgPj0gQVZESVNDQVJEX0FMTCkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBpZiAocy0+bmV4dF9wX2ZyYW1lX2RhbWFnZWQpIHsKLSAgICAgICAgaWYgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKKyAgICAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzLT5uZXh0X3BfZnJhbWVfZGFtYWdlZCA9IDA7CiAgICAgfQogCi0gICAgaWYgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikgewotICAgICAgICBoLT5mcmFtZV9udW1fb2Zmc2V0ID0gc2wtPnNsaWNlX251bSAtIGgtPnByZXZfZnJhbWVfbnVtOworICAgIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgcy0+ZnJhbWVfbnVtX29mZnNldCA9IHMtPnNsaWNlX251bSAtIHMtPnByZXZfZnJhbWVfbnVtOwogCi0gICAgICAgIGlmIChoLT5mcmFtZV9udW1fb2Zmc2V0IDwgMCkKLSAgICAgICAgICAgIGgtPmZyYW1lX251bV9vZmZzZXQgKz0gMjU2OwotICAgICAgICBpZiAoaC0+ZnJhbWVfbnVtX29mZnNldCA9PSAwIHx8Ci0gICAgICAgICAgICBoLT5mcmFtZV9udW1fb2Zmc2V0ID49IGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCkgewotICAgICAgICAgICAgYXZfbG9nKGgtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJlcnJvciBpbiBCLWZyYW1lIHBpY3R1cmUgaWRcbiIpOworICAgICAgICBpZiAocy0+ZnJhbWVfbnVtX29mZnNldCA8IDApCisgICAgICAgICAgICBzLT5mcmFtZV9udW1fb2Zmc2V0ICs9IDI1NjsKKyAgICAgICAgaWYgKHMtPmZyYW1lX251bV9vZmZzZXQgPT0gMCB8fAorICAgICAgICAgICAgcy0+ZnJhbWVfbnVtX29mZnNldCA+PSBzLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgaW4gQi1mcmFtZSBwaWN0dXJlIGlkXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGgtPnByZXZfZnJhbWVfbnVtICAgICAgICA9IGgtPmZyYW1lX251bTsKLSAgICAgICAgaC0+ZnJhbWVfbnVtICAgICAgICAgICAgID0gc2wtPnNsaWNlX251bTsKLSAgICAgICAgaC0+cHJldl9mcmFtZV9udW1fb2Zmc2V0ID0gaC0+ZnJhbWVfbnVtIC0gaC0+cHJldl9mcmFtZV9udW07CisgICAgICAgIHMtPnByZXZfZnJhbWVfbnVtICAgICAgICA9IHMtPmZyYW1lX251bTsKKyAgICAgICAgcy0+ZnJhbWVfbnVtICAgICAgICAgICAgID0gcy0+c2xpY2VfbnVtOworICAgICAgICBzLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgPSBzLT5mcmFtZV9udW0gLSBzLT5wcmV2X2ZyYW1lX251bTsKIAotICAgICAgICBpZiAoaC0+cHJldl9mcmFtZV9udW1fb2Zmc2V0IDwgMCkKLSAgICAgICAgICAgIGgtPnByZXZfZnJhbWVfbnVtX29mZnNldCArPSAyNTY7CisgICAgICAgIGlmIChzLT5wcmV2X2ZyYW1lX251bV9vZmZzZXQgPCAwKQorICAgICAgICAgICAgcy0+cHJldl9mcmFtZV9udW1fb2Zmc2V0ICs9IDI1NjsKICAgICB9CiAKICAgICBmb3IgKG0gPSAwOyBtIDwgMjsgbSsrKSB7CkBAIC0xMjk5LDU5ICsxNTMyLDYwIEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgIGludCBqOwogICAgICAgICAgICAgZm9yIChqID0gLTE7IGogPCA0OyBqKyspCi0gICAgICAgICAgICAgICAgc2wtPnJlZl9jYWNoZVttXVtzY2FuOFswXSArIDggKiBpICsgal0gPSAxOworICAgICAgICAgICAgICAgIHMtPnJlZl9jYWNoZVttXVtzY2FuOFswXSArIDggKiBpICsgal0gPSAxOwogICAgICAgICAgICAgaWYgKGkgPCAzKQotICAgICAgICAgICAgICAgIHNsLT5yZWZfY2FjaGVbbV1bc2NhbjhbMF0gKyA4ICogaSArIGpdID0gUEFSVF9OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgICAgIHMtPnJlZl9jYWNoZVttXVtzY2FuOFswXSArIDggKiBpICsgal0gPSBQQVJUX05PVF9BVkFJTEFCTEU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKHNsLT5tYl95ID0gMDsgc2wtPm1iX3kgPCBoLT5tYl9oZWlnaHQ7IHNsLT5tYl95KyspIHsKLSAgICAgICAgZm9yIChzbC0+bWJfeCA9IDA7IHNsLT5tYl94IDwgaC0+bWJfd2lkdGg7IHNsLT5tYl94KyspIHsKKyAgICBmb3IgKHMtPm1iX3kgPSAwOyBzLT5tYl95IDwgcy0+bWJfaGVpZ2h0OyBzLT5tYl95KyspIHsKKyAgICAgICAgZm9yIChzLT5tYl94ID0gMDsgcy0+bWJfeCA8IHMtPm1iX3dpZHRoOyBzLT5tYl94KyspIHsKICAgICAgICAgICAgIHVuc2lnbmVkIG1iX3R5cGU7Ci0gICAgICAgICAgICBzbC0+bWJfeHkgPSBzbC0+bWJfeCArIHNsLT5tYl95ICogaC0+bWJfc3RyaWRlOworICAgICAgICAgICAgcy0+bWJfeHkgPSBzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZTsKIAotICAgICAgICAgICAgaWYgKChnZXRfYml0c19jb3VudCgmaC0+Z2IpICsgNykgPj0gaC0+Z2Iuc2l6ZV9pbl9iaXRzICYmCi0gICAgICAgICAgICAgICAgKChnZXRfYml0c19jb3VudCgmaC0+Z2IpICYgNykgPT0gMCB8fAotICAgICAgICAgICAgICAgICBzaG93X2JpdHMoJmgtPmdiLCAtZ2V0X2JpdHNfY291bnQoJmgtPmdiKSAmIDcpID09IDApKSB7Ci0gICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZoLT5nYiwgcy0+bmV4dF9zbGljZV9pbmRleCAtIGdldF9iaXRzX2NvdW50KCZoLT5nYikpOwotICAgICAgICAgICAgICAgIGgtPmdiLnNpemVfaW5fYml0cyA9IDggKiBidWZfc2l6ZTsKKyAgICAgICAgICAgIGlmICgoZ2V0X2JpdHNfbGVmdCgmcy0+Z2Jfc2xpY2UpKSA8PSA3KSB7CisgICAgICAgICAgICAgICAgaWYgKCgoZ2V0X2JpdHNfY291bnQoJnMtPmdiX3NsaWNlKSAmIDcpID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgc2hvd19iaXRzKCZzLT5nYl9zbGljZSwgZ2V0X2JpdHNfbGVmdCgmcy0+Z2Jfc2xpY2UpICYgNykgPT0gMCkpIHsKIAotICAgICAgICAgICAgICAgIGlmIChzdnEzX2RlY29kZV9zbGljZV9oZWFkZXIoYXZjdHgpKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2cTNfZGVjb2RlX3NsaWNlX2hlYWRlcihhdmN0eCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzLT5zbGljZV90eXBlICE9IHMtPnBpY3RfdHlwZSkgeworICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJub24gY29uc3RhbnQgc2xpY2UgdHlwZSIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvKiBUT0RPOiBzdXBwb3J0IHMtPm1iX3NraXBfcnVuICovCiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1iX3R5cGUgPSBzdnEzX2dldF91ZV9nb2xvbWIoJmgtPmdiKTsKKyAgICAgICAgICAgIG1iX3R5cGUgPSBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZzLT5nYl9zbGljZSk7CiAKLSAgICAgICAgICAgIGlmIChoLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpCisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKQogICAgICAgICAgICAgICAgIG1iX3R5cGUgKz0gODsKLSAgICAgICAgICAgIGVsc2UgaWYgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiBtYl90eXBlID49IDQpCisgICAgICAgICAgICBlbHNlIGlmIChzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgbWJfdHlwZSA+PSA0KQogICAgICAgICAgICAgICAgIG1iX3R5cGUgKz0gNDsKICAgICAgICAgICAgIGlmIChtYl90eXBlID4gMzMgfHwgc3ZxM19kZWNvZGVfbWIocywgbWJfdHlwZSkpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coaC0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgImVycm9yIHdoaWxlIGRlY29kaW5nIE1CICVkICVkXG4iLCBzbC0+bWJfeCwgc2wtPm1iX3kpOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3Igd2hpbGUgZGVjb2RpbmcgTUIgJWQgJWRcbiIsIHMtPm1iX3gsIHMtPm1iX3kpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1iX3R5cGUgIT0gMCB8fCBzbC0+Y2JwKQotICAgICAgICAgICAgICAgIGZmX2gyNjRfaGxfZGVjb2RlX21iKGgsICZoLT5zbGljZV9jdHhbMF0pOworICAgICAgICAgICAgaWYgKG1iX3R5cGUgIT0gMCB8fCBzLT5jYnApCisgICAgICAgICAgICAgICAgaGxfZGVjb2RlX21iKHMpOwogCi0gICAgICAgICAgICBpZiAoaC0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CICYmICFoLT5sb3dfZGVsYXkpCi0gICAgICAgICAgICAgICAgaC0+Y3VyX3BpYy5tYl90eXBlW3NsLT5tYl94ICsgc2wtPm1iX3kgKiBoLT5tYl9zdHJpZGVdID0KLSAgICAgICAgICAgICAgICAgICAgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCAmJiBtYl90eXBlIDwgOCkgPyAobWJfdHlwZSAtIDEpIDogLTE7CisgICAgICAgICAgICBpZiAocy0+cGljdF90eXBlICE9IEFWX1BJQ1RVUkVfVFlQRV9CICYmICFzLT5sb3dfZGVsYXkpCisgICAgICAgICAgICAgICAgcy0+Y3VyX3BpYy0+bWJfdHlwZVtzLT5tYl94ICsgcy0+bWJfeSAqIHMtPm1iX3N0cmlkZV0gPQorICAgICAgICAgICAgICAgICAgICAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmIG1iX3R5cGUgPCA4KSA/IChtYl90eXBlIC0gMSkgOiAtMTsKICAgICAgICAgfQogCiAgICAgICAgIGZmX2RyYXdfaG9yaXpfYmFuZChhdmN0eCwgcy0+Y3VyX3BpYy0+ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxhc3RfcGljLT5mLT5kYXRhWzBdID8gcy0+bGFzdF9waWMtPmYgOiBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgKiBzbC0+bWJfeSwgMTYsIGgtPnBpY3R1cmVfc3RydWN0dXJlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+bG93X2RlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICogcy0+bWJfeSwgMTYsIFBJQ1RfRlJBTUUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sb3dfZGVsYXkpOwogICAgIH0KIAotICAgIGxlZnQgPSBidWZfc2l6ZSo4IC0gZ2V0X2JpdHNfY291bnQoJmgtPmdiKTsKKyAgICBsZWZ0ID0gYnVmX3NpemUqOCAtIGdldF9iaXRzX2NvdW50KCZzLT5nYl9zbGljZSk7CiAKLSAgICBpZiAoc2wtPm1iX3kgIT0gaC0+bWJfaGVpZ2h0IHx8IHNsLT5tYl94ICE9IGgtPm1iX3dpZHRoKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJmcmFtZSBudW0gJWQgaW5jb21wbGV0ZSBwaWMgeCAlZCB5ICVkIGxlZnQgJWRcbiIsIGF2Y3R4LT5mcmFtZV9udW1iZXIsIHNsLT5tYl95LCBzbC0+bWJfeCwgbGVmdCk7CisgICAgaWYgKHMtPm1iX3kgIT0gcy0+bWJfaGVpZ2h0IHx8IHMtPm1iX3ggIT0gcy0+bWJfd2lkdGgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgImZyYW1lIG51bSAlZCBpbmNvbXBsZXRlIHBpYyB4ICVkIHkgJWQgbGVmdCAlZFxuIiwgYXZjdHgtPmZyYW1lX251bWJlciwgcy0+bWJfeSwgcy0+bWJfeCwgbGVmdCk7CiAgICAgICAgIC8vYXZfaGV4X2R1bXAoc3RkZXJyLCBidWYrYnVmX3NpemUtOCwgOCk7CiAgICAgfQogCkBAIC0xMzYwLDcgKzE1OTQsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGgtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiB8fCBoLT5sb3dfZGVsYXkpCisgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiB8fCBzLT5sb3dfZGVsYXkpCiAgICAgICAgIHJldCA9IGF2X2ZyYW1lX3JlZihkYXRhLCBzLT5jdXJfcGljLT5mKTsKICAgICBlbHNlIGlmIChzLT5sYXN0X3BpYy0+Zi0+ZGF0YVswXSkKICAgICAgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmxhc3RfcGljLT5mKTsKQEAgLTEzNjgsMTEgKzE2MDIsMTEgQEAKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIC8qIERvIG5vdCBvdXRwdXQgdGhlIGxhc3QgcGljIGFmdGVyIHNlZWtpbmcuICovCi0gICAgaWYgKHMtPmxhc3RfcGljLT5mLT5kYXRhWzBdIHx8IGgtPmxvd19kZWxheSkKKyAgICBpZiAocy0+bGFzdF9waWMtPmYtPmRhdGFbMF0gfHwgcy0+bG93X2RlbGF5KQogICAgICAgICAqZ290X2ZyYW1lID0gMTsKIAotICAgIGlmIChoLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKLSAgICAgICAgRkZTV0FQKEgyNjRQaWN0dXJlKiwgcy0+Y3VyX3BpYywgcy0+bmV4dF9waWMpOworICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgRkZTV0FQKFNWUTNGcmFtZSosIHMtPmN1cl9waWMsIHMtPm5leHRfcGljKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5jdXJfcGljLT5mKTsKICAgICB9CkBAIC0xMzgzLDcgKzE2MTcsNiBAQAogc3RhdGljIGF2X2NvbGQgaW50IHN2cTNfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgU1ZRM0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEgyNjRDb250ZXh0ICpoID0gJnMtPmg7CiAKICAgICBmcmVlX3BpY3R1cmUoYXZjdHgsIHMtPmN1cl9waWMpOwogICAgIGZyZWVfcGljdHVyZShhdmN0eCwgcy0+bmV4dF9waWMpOwpAQCAtMTM5NCwxMCArMTYyNywxMSBAQAogICAgIGF2X2ZyZWVwKCZzLT5jdXJfcGljKTsKICAgICBhdl9mcmVlcCgmcy0+bmV4dF9waWMpOwogICAgIGF2X2ZyZWVwKCZzLT5sYXN0X3BpYyk7CisgICAgYXZfZnJlZXAoJnMtPnNsaWNlX2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPmludHJhNHg0X3ByZWRfbW9kZSk7CisgICAgYXZfZnJlZXAoJnMtPmVkZ2VfZW11X2J1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPm1iMmJyX3h5KTsKIAotICAgIG1lbXNldCgmaC0+Y3VyX3BpYywgMCwgc2l6ZW9mKGgtPmN1cl9waWMpKTsKLQotICAgIGZmX2gyNjRfZnJlZV9jb250ZXh0KGgpOwogCiAgICAgYXZfZnJlZXAoJnMtPmJ1Zik7CiAgICAgcy0+YnVmX3NpemUgPSAwOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy9zdnEzLmggYi9saWJhdmNvZGVjL3N2cTMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAwN2E4Yy4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL3N2cTMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2lmbmRlZiBBVkNPREVDX1NWUTNfSAotI2RlZmluZSBBVkNPREVDX1NWUTNfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLXZvaWQgZmZfc3ZxM19sdW1hX2RjX2RlcXVhbnRfaWRjdF9jKGludDE2X3QgKm91dHB1dCwgaW50MTZfdCAqaW5wdXQsIGludCBxcCk7Ci12b2lkIGZmX3N2cTNfYWRkX2lkY3RfYyh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLCBpbnQgcXAsIGludCBkYyk7Ci0KLSNlbmRpZiAvKiBBVkNPREVDX1NWUTNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90YWJsZXByaW50X3ZsYy5oIGIvbGliYXZjb2RlYy90YWJsZXByaW50X3ZsYy5oCmluZGV4IDY3NTI1MWEuLjMwMDRiZTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdGFibGVwcmludF92bGMuaAorKysgYi9saWJhdmNvZGVjL3RhYmxlcHJpbnRfdmxjLmgKQEAgLTM1LDYgKzM1LDcgQEAKICNkZWZpbmUgYXZfZnJlZXAocCkgd2hpbGUoMCkKICNkZWZpbmUgQVZDT0RFQ19BVkNPREVDX0gKICNkZWZpbmUgQVZDT0RFQ19JTlRFUk5BTF9ICisjZGVmaW5lIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgNjQgLy8gdGhlIHZhbHVlIGRvZXMgbm90IG1hdHRlciBmb3IgdGhpcwogI2luY2x1ZGUgInRhYmxlcHJpbnQuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgIm1hdGh0YWJsZXMuYyIKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGFrLmMgYi9saWJhdmNvZGVjL3Rhay5jCmluZGV4IGVkNDFjYTguLjhhYTk1NmIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdGFrLmMKKysrIGIvbGliYXZjb2RlYy90YWsuYwpAQCAtMjEsNiArMjEsOCBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAidGFrLmgiCiAKIHN0YXRpYyBjb25zdCBpbnQ2NF90IHRha19jaGFubmVsX2xheW91dHNbXSA9IHsKQEAgLTg4LDcgKzkwLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBhdnByaXZfdGFrX3BhcnNlX3N0cmVhbWluZm8oR2V0Qml0Q29udGV4dCAqZ2IsIFRBS1N0cmVhbUluZm8gKnMpCit2b2lkIGZmX3Rha19wYXJzZV9zdHJlYW1pbmZvKFRBS1N0cmVhbUluZm8gKnMsIEdldEJpdENvbnRleHQgKmdiKQogewogICAgIHVpbnQ2NF90IGNoYW5uZWxfbWFzayA9IDA7CiAgICAgaW50IGZyYW1lX3R5cGUsIGk7CkBAIC0xMjMsNiArMTI1LDE5IEBACiAgICAgcy0+ZnJhbWVfc2FtcGxlcyA9IHRha19nZXRfbmJfc2FtcGxlcyhzLT5zYW1wbGVfcmF0ZSwgZnJhbWVfdHlwZSk7CiB9CiAKK2ludCBhdnByaXZfdGFrX3BhcnNlX3N0cmVhbWluZm8oVEFLU3RyZWFtSW5mbyAqcywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCByZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1Ziwgc2l6ZSk7CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBmZl90YWtfcGFyc2Vfc3RyZWFtaW5mbyhzLCAmZ2IpOworCisgICAgcmV0dXJuIDA7Cit9CisKIGludCBmZl90YWtfZGVjb2RlX2ZyYW1lX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEdldEJpdENvbnRleHQgKmdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBS1N0cmVhbUluZm8gKnRpLCBpbnQgbG9nX2xldmVsX29mZnNldCkKIHsKQEAgLTE0Miw3ICsxNTcsNyBAQAogICAgIH0KIAogICAgIGlmICh0aS0+ZmxhZ3MgJiBUQUtfRlJBTUVfRkxBR19IQVNfSU5GTykgewotICAgICAgICBhdnByaXZfdGFrX3BhcnNlX3N0cmVhbWluZm8oZ2IsIHRpKTsKKyAgICAgICAgZmZfdGFrX3BhcnNlX3N0cmVhbWluZm8odGksIGdiKTsKIAogICAgICAgICBpZiAoZ2V0X2JpdHMoZ2IsIDYpKQogICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCAyNSk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rhay5oIGIvbGliYXZjb2RlYy90YWsuaAppbmRleCBlOGUyZGFjLi5kYzQ1YThjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Rhay5oCisrKyBiL2xpYmF2Y29kZWMvdGFrLmgKQEAgLTI5LDkgKzI5LDggQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCi0jZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgogCiAjZGVmaW5lIFRBS19GT1JNQVRfREFUQV9UWVBFX0JJVFMgICAgICAgICAgICAgICAzCiAjZGVmaW5lIFRBS19GT1JNQVRfU0FNUExFX1JBVEVfQklUUyAgICAgICAgICAgIDE4CkBAIC0xNDQsMTAgKzE0MywxNCBAQAogCiAvKioKICAqIFBhcnNlIHRoZSBTdHJlYW1pbmZvIG1ldGFkYXRhIGJsb2NrLgotICogQHBhcmFtW2luXSAgZ2IgcG9pbnRlciB0byBHZXRCaXRDb250ZXh0CiAgKiBAcGFyYW1bb3V0XSBzICBzdG9yYWdlIGZvciBwYXJzZWQgaW5mb3JtYXRpb24KKyAqIEBwYXJhbVtpbl0gIGJ1ZiAgIGlucHV0IGJ1ZmZlcgorICogQHBhcmFtW2luXSAgc2l6ZSAgc2l6ZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMKKyAqIEByZXR1cm4gbm9uLXplcm8gb24gZXJyb3IsIDAgaWYgT0sKICAqLwotdm9pZCBhdnByaXZfdGFrX3BhcnNlX3N0cmVhbWluZm8oR2V0Qml0Q29udGV4dCAqZ2IsIFRBS1N0cmVhbUluZm8gKnMpOworaW50IGF2cHJpdl90YWtfcGFyc2Vfc3RyZWFtaW5mbyhUQUtTdHJlYW1JbmZvICpzLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKTsKKwordm9pZCBmZl90YWtfcGFyc2Vfc3RyZWFtaW5mbyhUQUtTdHJlYW1JbmZvICpzLCBHZXRCaXRDb250ZXh0ICpnYik7CiAKIC8qKgogICogVmFsaWRhdGUgYW5kIGRlY29kZSBhIGZyYW1lIGhlYWRlci4KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGFrX3BhcnNlci5jIGIvbGliYXZjb2RlYy90YWtfcGFyc2VyLmMKaW5kZXggNGYyMTQ5YS4uODM1YTQ3YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90YWtfcGFyc2VyLmMKKysrIGIvbGliYXZjb2RlYy90YWtfcGFyc2VyLmMKQEAgLTI0LDggKzI0LDkgQEAKICAqIFRBSyBwYXJzZXIKICAqKi8KIAotI2luY2x1ZGUgInRhay5oIgorI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAicGFyc2VyLmgiCisjaW5jbHVkZSAidGFrLmgiCiAKIHR5cGVkZWYgc3RydWN0IFRBS1BhcnNlQ29udGV4dCB7CiAgICAgUGFyc2VDb250ZXh0ICBwYzsKQEAgLTU5LDcgKzYwLDcgQEAKIAogICAgIHdoaWxlIChidWZfc2l6ZSB8fCB0LT5pbmRleCArIG5lZWRlZCA8PSBwYy0+aW5kZXgpIHsKICAgICAgICAgaWYgKGJ1Zl9zaXplICYmIHQtPmluZGV4ICsgVEFLX01BWF9GUkFNRV9IRUFERVJfQllURVMgPiBwYy0+aW5kZXgpIHsKLSAgICAgICAgICAgIGludCB0bXBfYnVmX3NpemUgICAgICAgPSBGRk1JTigyICogVEFLX01BWF9GUkFNRV9IRUFERVJfQllURVMsCisgICAgICAgICAgICBpbnQgdG1wX2J1Zl9zaXplICAgICAgID0gRkZNSU4oVEFLX01BWF9GUkFNRV9IRUFERVJfQllURVMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUpOwogICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG1wX2J1ZiA9IGJ1ZjsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90YWtkZWMuYyBiL2xpYmF2Y29kZWMvdGFrZGVjLmMKaW5kZXggZDA1N2UwYS4uMDQzOWEzYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90YWtkZWMuYworKysgYi9saWJhdmNvZGVjL3Rha2RlYy5jCkBAIC0yNywxMyArMjcsMTUgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKLSNpbmNsdWRlICJ0YWsuaCIKLSNpbmNsdWRlICJ0YWtkc3AuaCIKKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAiYXVkaW9kc3AuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ1bmFyeS5oIgorI2luY2x1ZGUgInRhay5oIgorI2luY2x1ZGUgInRha2RzcC5oIgogCiAjZGVmaW5lIE1BWF9TVUJGUkFNRVMgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXggbnVtYmVyIG9mIHN1YmZyYW1lcyBwZXIgY2hhbm5lbAogI2RlZmluZSBNQVhfUFJFRElDVE9SUyAgMjU2CkBAIC0xNjMsOCArMTY1LDE3IEBACiBzdGF0aWMgdm9pZCBzZXRfc2FtcGxlX3JhdGVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBUQUtEZWNDb250ZXh0ICpzICA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IHNoaWZ0ICAgICAgICAgPSAzIC0gKGF2Y3R4LT5zYW1wbGVfcmF0ZSAvIDExMDI1KTsKLSAgICBzaGlmdCAgICAgICAgICAgICA9IEZGTUFYKDAsIHNoaWZ0KTsKKyAgICBpbnQgc2hpZnQ7CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlIDwgMTEwMjUpIHsKKyAgICAgICAgc2hpZnQgPSAzOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlIDwgMjIwNTApIHsKKyAgICAgICAgc2hpZnQgPSAyOworICAgIH0gZWxzZSBpZiAoYXZjdHgtPnNhbXBsZV9yYXRlIDwgNDQxMDApIHsKKyAgICAgICAgc2hpZnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHNoaWZ0ID0gMDsKKyAgICB9CiAgICAgcy0+dXZhbCAgICAgICAgICAgPSBGRkFMSUdOKGF2Y3R4LT5zYW1wbGVfcmF0ZSArIDUxMSA+PiA5LCA0KSA8PCBzaGlmdDsKICAgICBzLT5zdWJmcmFtZV9zY2FsZSA9IEZGQUxJR04oYXZjdHgtPnNhbXBsZV9yYXRlICsgNTExID4+IDksIDQpIDw8IDE7CiB9CkBAIC0xOTIsMjQgKzIwMywyNCBAQAogICAgICAgICByZXR1cm47CiAKICAgICBpZiAobW9kZSA9PSAxKSB7Ci0gICAgICAgIGludCBhMSA9ICpjb2VmZnMrKzsKKyAgICAgICAgdW5zaWduZWQgYTEgPSAqY29lZmZzKys7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggLSAxID4+IDE7IGkrKykgewogICAgICAgICAgICAgKmNvZWZmcyAgICs9IGExOwotICAgICAgICAgICAgY29lZmZzWzFdICs9ICpjb2VmZnM7CisgICAgICAgICAgICBjb2VmZnNbMV0gKz0gKHVuc2lnbmVkKSpjb2VmZnM7CiAgICAgICAgICAgICBhMSAgICAgICAgID0gY29lZmZzWzFdOwogICAgICAgICAgICAgY29lZmZzICAgICs9IDI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGxlbmd0aCAtIDEgJiAxKQogICAgICAgICAgICAgKmNvZWZmcyArPSBhMTsKICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gMikgewotICAgICAgICBpbnQgYTEgICAgPSBjb2VmZnNbMV07Ci0gICAgICAgIGludCBhMiAgICA9IGExICsgKmNvZWZmczsKKyAgICAgICAgdW5zaWduZWQgYTEgICAgPSBjb2VmZnNbMV07CisgICAgICAgIHVuc2lnbmVkIGEyICAgID0gYTEgKyAqY29lZmZzOwogICAgICAgICBjb2VmZnNbMV0gPSBhMjsKICAgICAgICAgaWYgKGxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgIGNvZWZmcyArPSAyOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCAtIDIgPj4gMTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGEzICAgID0gKmNvZWZmcyArIGExOwotICAgICAgICAgICAgICAgIGludCBhNCAgICA9IGEzICsgYTI7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYTMgICAgPSAqY29lZmZzICsgYTE7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYTQgICAgPSBhMyArIGEyOwogICAgICAgICAgICAgICAgICpjb2VmZnMgICA9IGE0OwogICAgICAgICAgICAgICAgIGExICAgICAgICA9IGNvZWZmc1sxXSArIGEzOwogICAgICAgICAgICAgICAgIGEyICAgICAgICA9IGExICsgYTQ7CkBAIC0yMjAsMTMgKzIzMSwxNCBAQAogICAgICAgICAgICAgICAgICpjb2VmZnMgKz0gYTEgKyBhMjsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobW9kZSA9PSAzKSB7Ci0gICAgICAgIGludCBhMSAgICA9IGNvZWZmc1sxXTsKLSAgICAgICAgaW50IGEyICAgID0gYTEgKyAqY29lZmZzOworICAgICAgICB1bnNpZ25lZCBhMSAgICA9IGNvZWZmc1sxXTsKKyAgICAgICAgdW5zaWduZWQgYTIgICAgPSBhMSArICpjb2VmZnM7CiAgICAgICAgIGNvZWZmc1sxXSA9IGEyOwogICAgICAgICBpZiAobGVuZ3RoID4gMikgewotICAgICAgICAgICAgaW50IGEzICA9IGNvZWZmc1syXTsKLSAgICAgICAgICAgIGludCBhNCAgPSBhMyArIGExOwotICAgICAgICAgICAgaW50IGE1ICA9IGE0ICsgYTI7CisgICAgICAgICAgICB1bnNpZ25lZCBhMyAgPSBjb2VmZnNbMl07CisgICAgICAgICAgICB1bnNpZ25lZCBhNCAgPSBhMyArIGExOworICAgICAgICAgICAgdW5zaWduZWQgYTUgID0gYTQgKyBhMjsKKyAgICAgICAgICAgIGNvZWZmc1syXSA9IGE1OwogICAgICAgICAgICAgY29lZmZzICs9IDM7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoIC0gMzsgaSsrKSB7CiAgICAgICAgICAgICAgICAgYTMgICAgICs9ICpjb2VmZnM7CkBAIC0yNTUsMTEgKzI2NywxMSBAQAogICAgIGNvZGUgPSB4Y29kZXNbbW9kZSAtIDFdOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIGludCB4ID0gZ2V0X2JpdHNfbG9uZyhnYiwgY29kZS5pbml0KTsKKyAgICAgICAgdW5zaWduZWQgeCA9IGdldF9iaXRzX2xvbmcoZ2IsIGNvZGUuaW5pdCk7CiAgICAgICAgIGlmICh4ID49IGNvZGUuZXNjYXBlICYmIGdldF9iaXRzMShnYikpIHsKICAgICAgICAgICAgIHggfD0gMSA8PCBjb2RlLmluaXQ7CiAgICAgICAgICAgICBpZiAoeCA+PSBjb2RlLmFlc2NhcGUpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2NhbGUgPSBnZXRfdW5hcnkoZ2IsIDEsIDkpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNjYWxlID0gZ2V0X3VuYXJ5KGdiLCAxLCA5KTsKICAgICAgICAgICAgICAgICBpZiAoc2NhbGUgPT0gOSkgewogICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGVfYml0cyA9IGdldF9iaXRzKGdiLCAzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHNjYWxlX2JpdHMgPiAwKSB7CkBAIC00MjEsMzEgKzQzMywzMSBAQAogCiAgICAgcy0+cHJlZGljdG9yc1swXSA9IGdldF9zYml0cyhnYiwgMTApOwogICAgIHMtPnByZWRpY3RvcnNbMV0gPSBnZXRfc2JpdHMoZ2IsIDEwKTsKLSAgICBzLT5wcmVkaWN0b3JzWzJdID0gZ2V0X3NiaXRzKGdiLCBzaXplKSA8PCAoMTAgLSBzaXplKTsKLSAgICBzLT5wcmVkaWN0b3JzWzNdID0gZ2V0X3NiaXRzKGdiLCBzaXplKSA8PCAoMTAgLSBzaXplKTsKKyAgICBzLT5wcmVkaWN0b3JzWzJdID0gZ2V0X3NiaXRzKGdiLCBzaXplKSAqICgxIDw8ICgxMCAtIHNpemUpKTsKKyAgICBzLT5wcmVkaWN0b3JzWzNdID0gZ2V0X3NiaXRzKGdiLCBzaXplKSAqICgxIDw8ICgxMCAtIHNpemUpKTsKICAgICBpZiAoZmlsdGVyX29yZGVyID4gNCkgewogICAgICAgICBpbnQgdG1wID0gc2l6ZSAtIGdldF9iaXRzMShnYik7CiAKICAgICAgICAgZm9yIChpID0gNDsgaSA8IGZpbHRlcl9vcmRlcjsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoIShpICYgMykpCiAgICAgICAgICAgICAgICAgeCA9IHRtcCAtIGdldF9iaXRzKGdiLCAyKTsKLSAgICAgICAgICAgIHMtPnByZWRpY3RvcnNbaV0gPSBnZXRfc2JpdHMoZ2IsIHgpIDw8ICgxMCAtIHNpemUpOworICAgICAgICAgICAgcy0+cHJlZGljdG9yc1tpXSA9IGdldF9zYml0cyhnYiwgeCkgKiAoMSA8PCAoMTAgLSBzaXplKSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICB0ZmlsdGVyWzBdID0gcy0+cHJlZGljdG9yc1swXSA8PCA2OworICAgIHRmaWx0ZXJbMF0gPSBzLT5wcmVkaWN0b3JzWzBdICogNjQ7CiAgICAgZm9yIChpID0gMTsgaSA8IGZpbHRlcl9vcmRlcjsgaSsrKSB7Ci0gICAgICAgIGludDMyX3QgKnAxID0gJnRmaWx0ZXJbMF07Ci0gICAgICAgIGludDMyX3QgKnAyID0gJnRmaWx0ZXJbaSAtIDFdOworICAgICAgICB1aW50MzJfdCAqcDEgPSAmdGZpbHRlclswXTsKKyAgICAgICAgdWludDMyX3QgKnAyID0gJnRmaWx0ZXJbaSAtIDFdOwogCiAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoaSArIDEpIC8gMjsgaisrKSB7Ci0gICAgICAgICAgICB4ICAgICA9ICpwMSArIChzLT5wcmVkaWN0b3JzW2ldICogKnAyICsgMjU2ID4+IDkpOwotICAgICAgICAgICAgKnAyICArPSBzLT5wcmVkaWN0b3JzW2ldICogKnAxICsgMjU2ID4+IDk7CisgICAgICAgICAgICB4ICAgICA9ICpwMSArICgoaW50MzJfdCkocy0+cHJlZGljdG9yc1tpXSAqICpwMiArIDI1NikgPj4gOSk7CisgICAgICAgICAgICAqcDIgICs9IChpbnQzMl90KShzLT5wcmVkaWN0b3JzW2ldICogKnAxICsgMjU2KSA+PiA5OwogICAgICAgICAgICAgKnAxKysgPSB4OwogICAgICAgICAgICAgcDItLTsKICAgICAgICAgfQogCi0gICAgICAgIHRmaWx0ZXJbaV0gPSBzLT5wcmVkaWN0b3JzW2ldIDw8IDY7CisgICAgICAgIHRmaWx0ZXJbaV0gPSBzLT5wcmVkaWN0b3JzW2ldICogNjQ7CiAgICAgfQogCiAgICAgeCA9IDEgPDwgKDMyIC0gKDE1IC0gZmlsdGVyX3F1YW50KSk7CkBAIC00NzEsMTUgKzQ4MywxNSBAQAogICAgICAgICAgICAgaW50IHYgPSAxIDw8IChmaWx0ZXJfcXVhbnQgLSAxKTsKIAogICAgICAgICAgICAgaWYgKGZpbHRlcl9vcmRlciAmIC0xNikKLSAgICAgICAgICAgICAgICB2ICs9IHMtPmFkc3Auc2NhbGFycHJvZHVjdF9pbnQxNigmcy0+cmVzaWR1ZXNbaV0sIHMtPmZpbHRlciwKKyAgICAgICAgICAgICAgICB2ICs9ICh1bnNpZ25lZClzLT5hZHNwLnNjYWxhcnByb2R1Y3RfaW50MTYoJnMtPnJlc2lkdWVzW2ldLCBzLT5maWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX29yZGVyICYgLTE2KTsKICAgICAgICAgICAgIGZvciAoaiA9IGZpbHRlcl9vcmRlciAmIC0xNjsgaiA8IGZpbHRlcl9vcmRlcjsgaiArPSA0KSB7Ci0gICAgICAgICAgICAgICAgdiArPSBzLT5yZXNpZHVlc1tpICsgaiArIDNdICogcy0+ZmlsdGVyW2ogKyAzXSArCi0gICAgICAgICAgICAgICAgICAgICBzLT5yZXNpZHVlc1tpICsgaiArIDJdICogcy0+ZmlsdGVyW2ogKyAyXSArCi0gICAgICAgICAgICAgICAgICAgICBzLT5yZXNpZHVlc1tpICsgaiArIDFdICogcy0+ZmlsdGVyW2ogKyAxXSArCi0gICAgICAgICAgICAgICAgICAgICBzLT5yZXNpZHVlc1tpICsgaiAgICBdICogcy0+ZmlsdGVyW2ogICAgXTsKKyAgICAgICAgICAgICAgICB2ICs9IHMtPnJlc2lkdWVzW2kgKyBqICsgM10gKiAodW5zaWduZWQpcy0+ZmlsdGVyW2ogKyAzXSArCisgICAgICAgICAgICAgICAgICAgICBzLT5yZXNpZHVlc1tpICsgaiArIDJdICogKHVuc2lnbmVkKXMtPmZpbHRlcltqICsgMl0gKworICAgICAgICAgICAgICAgICAgICAgcy0+cmVzaWR1ZXNbaSArIGogKyAxXSAqICh1bnNpZ25lZClzLT5maWx0ZXJbaiArIDFdICsKKyAgICAgICAgICAgICAgICAgICAgIHMtPnJlc2lkdWVzW2kgKyBqICAgIF0gKiAodW5zaWduZWQpcy0+ZmlsdGVyW2ogICAgXTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHYgPSAoYXZfY2xpcF9pbnRwMih2ID4+IGZpbHRlcl9xdWFudCwgMTMpIDw8IGRzaGlmdCkgLSAqZGVjb2RlZDsKKyAgICAgICAgICAgIHYgPSAoYXZfY2xpcF9pbnRwMih2ID4+IGZpbHRlcl9xdWFudCwgMTMpICogKDEgPDwgZHNoaWZ0KSkgLSAodW5zaWduZWQpKmRlY29kZWQ7CiAgICAgICAgICAgICAqZGVjb2RlZCsrID0gdjsKICAgICAgICAgICAgIHMtPnJlc2lkdWVzW2ZpbHRlcl9vcmRlciArIGldID0gdiA+PiBkc2hpZnQ7CiAgICAgICAgIH0KQEAgLTY0MSw3ICs2NTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlc2lkdWVzW2kgICAgXSAqIHMtPmZpbHRlclswXTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICB2ID0gKGF2X2NsaXBfaW50cDIodiA+PiAxMCwgMTMpIDw8IGRzaGlmdCkgLSAqcDE7CisgICAgICAgICAgICAgICAgdiA9IGF2X2NsaXBfaW50cDIodiA+PiAxMCwgMTMpICogKDEgPDwgZHNoaWZ0KSAtICpwMTsKICAgICAgICAgICAgICAgICAqcDErKyA9IHY7CiAgICAgICAgICAgICB9CiAKQEAgLTY5MCw3ICs3MDIsNyBAQAogCiAgICAgaWYgKHMtPnRpLmNvZGVjICE9IFRBS19DT0RFQ19NT05PX1NURVJFTyAmJgogICAgICAgICBzLT50aS5jb2RlYyAhPSBUQUtfQ09ERUNfTVVMVElDSEFOTkVMKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY29kZWM6ICVkXG4iLCBzLT50aS5jb2RlYyk7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiVEFLIGNvZGVjIHR5cGUgJWQiLCBzLT50aS5jb2RlYyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAgICAgaWYgKHMtPnRpLmRhdGFfdHlwZSkgewpAQCAtODUwLDcgKzg2Miw3IEBACiAKICAgICAgICAgICAgIGlmIChzLT5zYW1wbGVfc2hpZnRbY2hhbl0gPiAwKQogICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zYW1wbGVzOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIGRlY29kZWRbaV0gPDw9IHMtPnNhbXBsZV9zaGlmdFtjaGFuXTsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFtpXSAqPSAxVSA8PCBzLT5zYW1wbGVfc2hpZnRbY2hhbl07CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTg3Nyw3ICs4ODksNyBAQAogICAgICAgICAgICAgdWludDhfdCAqc2FtcGxlcyA9ICh1aW50OF90ICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbY2hhbl07CiAgICAgICAgICAgICBpbnQzMl90ICpkZWNvZGVkID0gcy0+ZGVjb2RlZFtjaGFuXTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zYW1wbGVzOyBpKyspCi0gICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IGRlY29kZWRbaV0gKyAweDgwOworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBkZWNvZGVkW2ldICsgMHg4MFU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNlA6CkBAIC04OTIsNyArOTA0LDcgQEAKICAgICAgICAgZm9yIChjaGFuID0gMDsgY2hhbiA8IGF2Y3R4LT5jaGFubmVsczsgY2hhbisrKSB7CiAgICAgICAgICAgICBpbnQzMl90ICpzYW1wbGVzID0gKGludDMyX3QgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFuXTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zYW1wbGVzOyBpKyspCi0gICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA8PD0gODsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldICo9IDFVIDw8IDg7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90YXJnYS5jIGIvbGliYXZjb2RlYy90YXJnYS5jCmluZGV4IDIxNWMwZjUuLjkzZTBlZjcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdGFyZ2EuYworKysgYi9saWJhdmNvZGVjL3RhcmdhLmMKQEAgLTI2NSwzMiArMjY1LDMzIEBACiAgICAgICAgICAgICAgICAgbGluZSA9IGFkdmFuY2VfbGluZShkc3QsIGxpbmUsIHN0cmlkZSwgJnksIGgsIGludGVybGVhdmUpOwogICAgICAgICAgICAgfSB3aGlsZSAobGluZSk7CiAgICAgICAgIH0KLSAgICB9CiAKLSAgICBpZiAoZmxhZ3MgJiBUR0FfUklHSFRUT0xFRlQpIHsgLy8gcmlnaHQtdG8tbGVmdCwgbmVlZHMgaG9yaXpvbnRhbCBmbGlwCi0gICAgICAgIGludCB4OwotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgICAgICB2b2lkICpsaW5lID0gJnAtPmRhdGFbMF1beSAqIHAtPmxpbmVzaXplWzBdXTsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3ID4+IDE7IHgrKykgewotICAgICAgICAgICAgICAgIHN3aXRjaCAoYnBwKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQzMl90LCAoKHVpbnQzMl90ICopbGluZSlbeF0sICgodWludDMyX3QgKilsaW5lKVt3IC0geCAtIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QsICgodWludDhfdCAqKWxpbmUpWzMgKiB4ICAgIF0sICgodWludDhfdCAqKWxpbmUpWzMgKiB3IC0gMyAqIHggLSAzXSk7Ci0gICAgICAgICAgICAgICAgICAgIEZGU1dBUCh1aW50OF90LCAoKHVpbnQ4X3QgKilsaW5lKVszICogeCArIDFdLCAoKHVpbnQ4X3QgKilsaW5lKVszICogdyAtIDMgKiB4IC0gMl0pOwotICAgICAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgKCh1aW50OF90ICopbGluZSlbMyAqIHggKyAyXSwgKCh1aW50OF90ICopbGluZSlbMyAqIHcgLSAzICogeCAtIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQxNl90LCAoKHVpbnQxNl90ICopbGluZSlbeF0sICgodWludDE2X3QgKilsaW5lKVt3IC0geCAtIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgKCh1aW50OF90ICopbGluZSlbeF0sICgodWludDhfdCAqKWxpbmUpW3cgLSB4IC0gMV0pOworICAgICAgICBpZiAoZmxhZ3MgJiBUR0FfUklHSFRUT0xFRlQpIHsgLy8gcmlnaHQtdG8tbGVmdCwgbmVlZHMgaG9yaXpvbnRhbCBmbGlwCisgICAgICAgICAgICBpbnQgeDsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgICAgICB2b2lkICpsaW5lID0gJnAtPmRhdGFbMF1beSAqIHAtPmxpbmVzaXplWzBdXTsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdyA+PiAxOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChicHApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZGU1dBUCh1aW50MzJfdCwgKCh1aW50MzJfdCAqKWxpbmUpW3hdLCAoKHVpbnQzMl90ICopbGluZSlbdyAtIHggLSAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZGU1dBUCh1aW50OF90LCAoKHVpbnQ4X3QgKilsaW5lKVszICogeCAgICBdLCAoKHVpbnQ4X3QgKilsaW5lKVszICogdyAtIDMgKiB4IC0gM10pOworICAgICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQ4X3QsICgodWludDhfdCAqKWxpbmUpWzMgKiB4ICsgMV0sICgodWludDhfdCAqKWxpbmUpWzMgKiB3IC0gMyAqIHggLSAyXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgKCh1aW50OF90ICopbGluZSlbMyAqIHggKyAyXSwgKCh1aW50OF90ICopbGluZSlbMyAqIHcgLSAzICogeCAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgICAgICAgICAgRkZTV0FQKHVpbnQxNl90LCAoKHVpbnQxNl90ICopbGluZSlbeF0sICgodWludDE2X3QgKilsaW5lKVt3IC0geCAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICBGRlNXQVAodWludDhfdCwgKCh1aW50OF90ICopbGluZSlbeF0sICgodWludDhfdCAqKWxpbmUpW3cgLSB4IC0gMV0pOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCisKICAgICAqZ290X2ZyYW1lID0gMTsKIAogICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGFyZ2FfeTIxNmRlYy5jIGIvbGliYXZjb2RlYy90YXJnYV95MjE2ZGVjLmMKaW5kZXggMjFiM2QzNS4uNDQzZDQ4YSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90YXJnYV95MjE2ZGVjLmMKKysrIGIvbGliYXZjb2RlYy90YXJnYV95MjE2ZGVjLmMKQEAgLTM1LDcgKzM1LDggQEAKIHsKICAgICBBVkZyYW1lICpwaWMgPSBkYXRhOwogICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAodWludDE2X3QgKilhdnBrdC0+ZGF0YTsKLSAgICB1aW50MTZfdCAqeSwgKnUsICp2LCBhbGlnbmVkX3dpZHRoID0gRkZBTElHTihhdmN0eC0+d2lkdGgsIDQpOworICAgIHVpbnQxNl90ICp5LCAqdSwgKnY7CisgICAgaW50IGFsaWduZWRfd2lkdGggPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgNCk7CiAgICAgaW50IGksIGosIHJldDsKIAogICAgIGlmIChhdnBrdC0+c2l6ZSA8IDQgKiBhdmN0eC0+aGVpZ2h0ICogYWxpZ25lZF93aWR0aCkgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90YXJnYWVuYy5jIGIvbGliYXZjb2RlYy90YXJnYWVuYy5jCmluZGV4IDY2YmM1NWMuLjc5MDMwYTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdGFyZ2FlbmMuYworKysgYi9saWJhdmNvZGVjL3RhcmdhZW5jLmMKQEAgLTg5LDEwICs4OSw2IEBACiAgICAgaW50IGJwcCwgcGljc2l6ZSwgZGF0YXNpemUgPSAtMSwgcmV0LCBpOwogICAgIHVpbnQ4X3QgKm91dDsKIAotICAgIGlmKGF2Y3R4LT53aWR0aCA+IDB4ZmZmZiB8fCBhdmN0eC0+aGVpZ2h0ID4gMHhmZmZmKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW1hZ2UgZGltZW5zaW9ucyB0b28gbGFyZ2VcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KICAgICBwaWNzaXplID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKGF2Y3R4LT5waXhfZm10LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCAxKTsKICAgICBpZiAoKHJldCA9IGZmX2FsbG9jX3BhY2tldDIoYXZjdHgsIHBrdCwgcGljc2l6ZSArIDQ1LCAwKSkgPCAwKQpAQCAtMTkwLDYgKzE4NiwxMSBAQAogCiBzdGF0aWMgYXZfY29sZCBpbnQgdGFyZ2FfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogeworICAgIGlmIChhdmN0eC0+d2lkdGggPiAweGZmZmYgfHwgYXZjdHgtPmhlaWdodCA+IDB4ZmZmZikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImltYWdlIGRpbWVuc2lvbnMgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKICNpZiBGRl9BUElfQ09ERURfRlJBTUUKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPmtleV9mcmFtZSA9IDE7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rkc2MuYyBiL2xpYmF2Y29kZWMvdGRzYy5jCmluZGV4IDYzY2Q0NDMuLjQxODI0MDQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdGRzYy5jCisrKyBiL2xpYmF2Y29kZWMvdGRzYy5jCkBAIC01Niw3ICs1Niw3IEBACiAgICAgQVZGcmFtZSAqanBnZnJhbWU7ICAgICAgICAgIC8vIGRlY29kZWQgSlBFRyB0aWxlCiAgICAgdWludDhfdCAqdGlsZWJ1ZmZlcjsgICAgICAgIC8vIGJ1ZmZlciBjb250YWluaW5nIHRpbGUgZGF0YQogCi0gICAgLyogemxpYiBpbnRlcmF0aW9uICovCisgICAgLyogemxpYiBpbnRlcmFjdGlvbiAqLwogICAgIHVpbnQ4X3QgKmRlZmxhdGVidWZmZXI7CiAgICAgdUxvbmdmIGRlZmxhdGVsZW47CiAKQEAgLTM0Myw3ICszNDMsNiBAQAogewogICAgIFREU0NDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFWUGFja2V0IGpwa3Q7Ci0gICAgaW50IGdvdF9mcmFtZSA9IDA7CiAgICAgaW50IHJldDsKIAogICAgIC8qIFByZXBhcmUgYSBwYWNrZXQgYW5kIHNlbmQgdG8gdGhlIE1KUEVHIGRlY29kZXIgKi8KQEAgLTM1MSwxMiArMzUwLDE2IEBACiAgICAganBrdC5kYXRhID0gY3R4LT50aWxlYnVmZmVyOwogICAgIGpwa3Quc2l6ZSA9IHRpbGVfc2l6ZTsKIAotICAgIHJldCA9IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihjdHgtPmpwZWdfYXZjdHgsIGN0eC0+anBnZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnb3RfZnJhbWUsICZqcGt0KTsKLSAgICBpZiAocmV0IDwgMCB8fCAhZ290X2ZyYW1lIHx8IGN0eC0+anBnZnJhbWUtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX1lVVko0MjBQKSB7CisgICAgcmV0ID0gYXZjb2RlY19zZW5kX3BhY2tldChjdHgtPmpwZWdfYXZjdHgsICZqcGt0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHN1Ym1pdHRpbmcgYSBwYWNrZXQgZm9yIGRlY29kaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBhdmNvZGVjX3JlY2VpdmVfZnJhbWUoY3R4LT5qcGVnX2F2Y3R4LCBjdHgtPmpwZ2ZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCB8fCBjdHgtPmpwZ2ZyYW1lLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9ZVVZKNDIwUCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJKUEVHIGRlY29kaW5nIGVycm9yICglZCkgZm9yICglZCkgZnJhbWUuXG4iLAotICAgICAgICAgICAgICAgcmV0LCBnb3RfZnJhbWUpOworICAgICAgICAgICAgICAgIkpQRUcgZGVjb2RpbmcgZXJyb3IgKCVkKS5cbiIsIHJldCk7CiAKICAgICAgICAgLyogTm9ybWFsbHkgc2tpcCwgZXJyb3IgaWYgZXhwbG9kZSAqLwogICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCkBAIC0zNjUsNyArMzY4LDcgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIC8qIExldCdzIHBhaW50IG9udCB0aGUgYnVmZmVyICovCisgICAgLyogTGV0J3MgcGFpbnQgb250byB0aGUgYnVmZmVyICovCiAgICAgdGRzY19ibGl0KGN0eC0+cmVmZnJhbWUtPmRhdGFbMF0gKyB4ICogMyArIGN0eC0+cmVmZnJhbWUtPmxpbmVzaXplWzBdICogeSwKICAgICAgICAgICAgICAgY3R4LT5yZWZmcmFtZS0+bGluZXNpemVbMF0sCiAgICAgICAgICAgICAgIGN0eC0+anBnZnJhbWUtPmRhdGFbMF0sIGN0eC0+anBnZnJhbWUtPmxpbmVzaXplWzBdLApAQCAtNjA5LDcgKzYxMiw3IEBACiAgICAgfQogICAgICpnb3RfZnJhbWUgPSAxOwogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGF2cGt0LT5zaXplOwogfQogCiBBVkNvZGVjIGZmX3Rkc2NfZGVjb2RlciA9IHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGVzdHMvYWFyY2g2NC9kY3QuYyBiL2xpYmF2Y29kZWMvdGVzdHMvYWFyY2g2NC9kY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzJhOTYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy9hYXJjaDY0L2RjdC5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYXJjaDY0L2lkY3QuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGZkY3RfdGFiX2FyY2hbXSA9IHsKKyAgICB7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGlkY3RfdGFiX2FyY2hbXSA9IHsKKyAgICB7ICJTSU1QTEUtTkVPTiIsIGZmX3NpbXBsZV9pZGN0X25lb24sIEZGX0lEQ1RfUEVSTV9QQVJUVFJBTlMsIEFWX0NQVV9GTEFHX05FT04gfSwKKyAgICB7IDAgfQorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGVzdHMvYXJtL2RjdC5jIGIvbGliYXZjb2RlYy90ZXN0cy9hcm0vZGN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2ZDM2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvYXJtL2RjdC5jCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hcm0vaWRjdC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gZmRjdF90YWJfYXJjaFtdID0geworICAgIHsgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gaWRjdF90YWJfYXJjaFtdID0geworICAgIHsgIlNJTVBMRS1BUk0iLCAgICAgZmZfc2ltcGxlX2lkY3RfYXJtLCAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKKyAgICB7ICJJTlQtQVJNIiwgICAgICAgIGZmX2pfcmV2X2RjdF9hcm0sICAgICAgIEZGX0lEQ1RfUEVSTV9MSUJNUEVHMiB9LAorI2lmIEhBVkVfQVJNVjVURQorICAgIHsgIlNJTVBMRS1BUk1WNVRFIiwgZmZfc2ltcGxlX2lkY3RfYXJtdjV0ZSwgRkZfSURDVF9QRVJNX05PTkUsICAgICAgQVZfQ1BVX0ZMQUdfQVJNVjVURSB9LAorI2VuZGlmCisjaWYgSEFWRV9BUk1WNgorICAgIHsgIlNJTVBMRS1BUk1WNiIsICAgZmZfc2ltcGxlX2lkY3RfYXJtdjYsICAgRkZfSURDVF9QRVJNX0xJQk1QRUcyLCAgQVZfQ1BVX0ZMQUdfQVJNVjYgfSwKKyNlbmRpZgorI2lmIEhBVkVfTkVPTgorICAgIHsgIlNJTVBMRS1ORU9OIiwgICAgZmZfc2ltcGxlX2lkY3RfbmVvbiwgICAgRkZfSURDVF9QRVJNX1BBUlRUUkFOUywgQVZfQ1BVX0ZMQUdfTkVPTiB9LAorI2VuZGlmCisgICAgeyAwIH0KK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rlc3RzL2F2ZmZ0LmMgYi9saWJhdmNvZGVjL3Rlc3RzL2F2ZmZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhYTk5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvYXZmZnQuYwpAQCAtMCwwICsxLDI1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBUaGlzIHRlc3QgaXMgc2ltaWxhciB0byBmZnQtZml4ZWQuYyBvciBmZnQtZml4ZWQzMi5jCisgKi8KKworI2RlZmluZSBBVkZGVCAxCisjZGVmaW5lIEZGVF9GTE9BVCAxCisjaW5jbHVkZSAiZmZ0LmMiCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rlc3RzL2F2cGFja2V0LmMgYi9saWJhdmNvZGVjL3Rlc3RzL2F2cGFja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiNzIzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvYXZwYWNrZXQuYwpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorCisKKworc3RhdGljIGludCBzZXR1cF9zaWRlX2RhdGFfZW50cnkoQVZQYWNrZXQqIGF2cGt0KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGFfbmFtZSA9IE5VTEw7CisgICAgaW50IHJldCA9IDAsIGJ5dGVzOworICAgIHVpbnQ4X3QgKmV4dHJhX2RhdGEgPSBOVUxMOworCisKKyAgICAvKiBnZXQgc2lkZV9kYXRhX25hbWUgc3RyaW5nICovCisgICAgZGF0YV9uYW1lID0gYXZfcGFja2V0X3NpZGVfZGF0YV9uYW1lKEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEpOworCisgICAgLyogQWxsb2NhdGUgYSBtZW1vcnkgYmxvYyAqLworICAgIGJ5dGVzID0gc3RybGVuKGRhdGFfbmFtZSk7CisKKyAgICBpZighKGV4dHJhX2RhdGEgPSBhdl9tYWxsb2MoYnl0ZXMpKSl7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBvY2N1cnJlZDogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIC8qIGNvcHkgc2lkZV9kYXRhX25hbWUgdG8gZXh0cmFfZGF0YSBhcnJheSAqLworICAgIG1lbWNweShleHRyYV9kYXRhLCBkYXRhX25hbWUsIGJ5dGVzKTsKKworICAgIC8qIGNyZWF0ZSBzaWRlIGRhdGEgZm9yIEFWUGFja2V0ICovCisgICAgcmV0ID0gYXZfcGFja2V0X2FkZF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfZGF0YSwgYnl0ZXMpOworICAgIGlmKHJldCA8IDApeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiRXJyb3Igb2NjdXJyZWQgaW4gYXZfcGFja2V0X2FkZF9zaWRlX2RhdGE6ICVzXG4iLAorICAgICAgICAgICAgICAgIGF2X2VycjJzdHIocmV0KSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbml0aWFsaXphdGlvbnMoQVZQYWNrZXQqIGF2cGt0KQoreworICAgIGNvbnN0IHN0YXRpYyB1aW50OF90KiBkYXRhID0gInNlbGZ0ZXN0IGZvciBhdl9wYWNrZXRfY2xvbmUoLi4uKSI7CisgICAgaW50IHJldCA9IDA7CisKKyAgICAvKiBpbml0aWFsaXplIGF2cGt0ICovCisgICAgYXZfaW5pdF9wYWNrZXQoYXZwa3QpOworCisgICAgLyogc2V0IHZhbHVlcyBmb3IgYXZwa3QgKi8KKyAgICBhdnBrdC0+cHRzID0gMTc7CisgICAgYXZwa3QtPmR0cyA9IDI7CisgICAgYXZwa3QtPmRhdGEgPSAodWludDhfdCopZGF0YTsKKyAgICBhdnBrdC0+c2l6ZSA9IHN0cmxlbihkYXRhKTsKKyAgICBhdnBrdC0+ZmxhZ3MgPSBBVl9QS1RfRkxBR19ESVNDQVJEOworICAgIGF2cGt0LT5kdXJhdGlvbiA9IDEwMDsKKyAgICBhdnBrdC0+cG9zID0gMzsKKworICAgIHJldCA9IHNldHVwX3NpZGVfZGF0YV9lbnRyeShhdnBrdCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIEFWUGFja2V0IGF2cGt0OworICAgIEFWUGFja2V0ICphdnBrdF9jbG9uZSA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZihpbml0aWFsaXphdGlvbnMoJmF2cGt0KSA8IDApeworICAgICAgICBwcmludGYoImZhaWxlZCB0byBpbml0aWFsaXplIHZhcmlhYmxlc1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICAvKiB0ZXN0IGF2X3BhY2tldF9jbG9uZSovCisgICAgYXZwa3RfY2xvbmUgPSBhdl9wYWNrZXRfY2xvbmUoJmF2cGt0KTsKKworICAgIGlmKCFhdnBrdF9jbG9uZSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCJhdl9wYWNrZXRfY2xvbmUgZmFpbGVkIHRvIGNsb25lIEFWUGFja2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIC8qdGVzdCBhdl9ncm93X3BhY2tldCovCisgICAgaWYoYXZfZ3Jvd19wYWNrZXQoYXZwa3RfY2xvbmUsIDIwKSA8IDApeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiYXZfZ3Jvd19wYWNrZXQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKGF2X2dyb3dfcGFja2V0KGF2cGt0X2Nsb25lLCBJTlRfTUFYKSA9PSAwKXsKKyAgICAgICAgcHJpbnRmKCAiYXZfZ3Jvd19wYWNrZXQgZmFpbGVkIHRvIHJldHVybiBlcnJvciAiCisgICAgICAgICAgICAgICAgIndoZW4gXCJncm93X2J5XCIgcGFyYW1ldGVyIGlzIHRvbyBsYXJnZS5cbiIgKTsKKyAgICAgICAgcmV0ID0gMTsKKyAgICB9CisgICAgLyogdGVzdCBzaXplIGVycm9yIGNoZWNrIGluIGF2X25ld19wYWNrZXQqLworICAgIGlmKGF2X25ld19wYWNrZXQoYXZwa3RfY2xvbmUsIElOVF9NQVgpID09IDApeworICAgICAgICBwcmludGYoICJhdl9uZXdfcGFja2V0IGZhaWxlZCB0byByZXR1cm4gZXJyb3IgIgorICAgICAgICAgICAgICAgICJ3aGVuIFwic2l6ZVwiIHBhcmFtZXRlciBpcyB0b28gbGFyZ2UuXG4iICk7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorICAgIC8qdGVzdCBzaXplIGVycm9yIGNoZWNrIGluIGF2X3BhY2tldF9mcm9tX2RhdGEqLworICAgIGlmKGF2X3BhY2tldF9mcm9tX2RhdGEoYXZwa3RfY2xvbmUsIGF2cGt0X2Nsb25lLT5kYXRhLCBJTlRfTUFYKSA9PSAwKXsKKyAgICAgICAgcHJpbnRmKCJhdl9wYWNrZXRfZnJvbV9kYXRhIGZhaWxlZCB0byByZXR1cm4gZXJyb3IgIgorICAgICAgICAgICAgICAgICJ3aGVuIFwic2l6ZVwiIHBhcmFtZXRlciBpcyB0b28gbGFyZ2UuXG4iICk7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorICAgIC8qY2xlYW4gdXAqLworICAgIGF2X3BhY2tldF9mcmVlKCZhdnBrdF9jbG9uZSk7CisgICAgYXZfcGFja2V0X3VucmVmKCZhdnBrdCk7CisKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rlc3RzL2NhYmFjLmMgYi9saWJhdmNvZGVjL3Rlc3RzL2NhYmFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmZTRlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvY2FiYWMuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9jYWJhYy5jIgorCisjZGVmaW5lIFNJWkUgMTAyNDAKKworI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9jYWJhY19iaXQoQ0FCQUNDb250ZXh0ICpjLCBpbnQgYil7CisgICAgcHV0X2JpdHMoJmMtPnBiLCAxLCBiKTsKKyAgICBmb3IoO2MtPm91dHN0YW5kaW5nX2NvdW50OyBjLT5vdXRzdGFuZGluZ19jb3VudC0tKXsKKyAgICAgICAgcHV0X2JpdHMoJmMtPnBiLCAxLCAxLWIpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbm9ybV9jYWJhY19lbmNvZGVyKENBQkFDQ29udGV4dCAqYyl7CisgICAgd2hpbGUoYy0+cmFuZ2UgPCAweDEwMCl7CisgICAgICAgIC8vRklYTUUgb3B0aW1pemUKKyAgICAgICAgaWYoYy0+bG93PDB4MTAwKXsKKyAgICAgICAgICAgIHB1dF9jYWJhY19iaXQoYywgMCk7CisgICAgICAgIH1lbHNlIGlmKGMtPmxvdzwweDIwMCl7CisgICAgICAgICAgICBjLT5vdXRzdGFuZGluZ19jb3VudCsrOworICAgICAgICAgICAgYy0+bG93IC09IDB4MTAwOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIHB1dF9jYWJhY19iaXQoYywgMSk7CisgICAgICAgICAgICBjLT5sb3cgLT0gMHgyMDA7CisgICAgICAgIH0KKworICAgICAgICBjLT5yYW5nZSs9IGMtPnJhbmdlOworICAgICAgICBjLT5sb3cgKz0gYy0+bG93OworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHV0X2NhYmFjKENBQkFDQ29udGV4dCAqYywgdWludDhfdCAqIGNvbnN0IHN0YXRlLCBpbnQgYml0KXsKKyAgICBpbnQgUmFuZ2VMUFM9IGZmX2gyNjRfbHBzX3JhbmdlWzIqKGMtPnJhbmdlJjB4QzApICsgKnN0YXRlXTsKKworICAgIGlmKGJpdCA9PSAoKCpzdGF0ZSkmMSkpeworICAgICAgICBjLT5yYW5nZSAtPSBSYW5nZUxQUzsKKyAgICAgICAgKnN0YXRlICAgID0gZmZfaDI2NF9tbHBzX3N0YXRlWzEyOCArICpzdGF0ZV07CisgICAgfWVsc2V7CisgICAgICAgIGMtPmxvdyArPSBjLT5yYW5nZSAtIFJhbmdlTFBTOworICAgICAgICBjLT5yYW5nZSA9IFJhbmdlTFBTOworICAgICAgICAqc3RhdGU9IGZmX2gyNjRfbWxwc19zdGF0ZVsxMjcgLSAqc3RhdGVdOworICAgIH0KKworICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOworfQorCisvKioKKyAqIEBwYXJhbSBiaXQgMCAtPiB3cml0ZSB6ZXJvIGJpdCwgIT0wIHdyaXRlIG9uZSBiaXQKKyAqLworc3RhdGljIHZvaWQgcHV0X2NhYmFjX2J5cGFzcyhDQUJBQ0NvbnRleHQgKmMsIGludCBiaXQpeworICAgIGMtPmxvdyArPSBjLT5sb3c7CisKKyAgICBpZihiaXQpeworICAgICAgICBjLT5sb3cgKz0gYy0+cmFuZ2U7CisgICAgfQorLy9GSVhNRSBvcHRpbWl6ZQorICAgIGlmKGMtPmxvdzwweDIwMCl7CisgICAgICAgIHB1dF9jYWJhY19iaXQoYywgMCk7CisgICAgfWVsc2UgaWYoYy0+bG93PDB4NDAwKXsKKyAgICAgICAgYy0+b3V0c3RhbmRpbmdfY291bnQrKzsKKyAgICAgICAgYy0+bG93IC09IDB4MjAwOworICAgIH1lbHNleworICAgICAgICBwdXRfY2FiYWNfYml0KGMsIDEpOworICAgICAgICBjLT5sb3cgLT0gMHg0MDA7CisgICAgfQorfQorCisvKioKKyAqCisgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbgorICovCitzdGF0aWMgaW50IHB1dF9jYWJhY190ZXJtaW5hdGUoQ0FCQUNDb250ZXh0ICpjLCBpbnQgYml0KXsKKyAgICBjLT5yYW5nZSAtPSAyOworCisgICAgaWYoIWJpdCl7CisgICAgICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOworICAgIH1lbHNleworICAgICAgICBjLT5sb3cgKz0gYy0+cmFuZ2U7CisgICAgICAgIGMtPnJhbmdlPSAyOworCisgICAgICAgIHJlbm9ybV9jYWJhY19lbmNvZGVyKGMpOworCisgICAgICAgIGF2X2Fzc2VydDAoYy0+bG93IDw9IDB4MUZGKTsKKyAgICAgICAgcHV0X2NhYmFjX2JpdChjLCBjLT5sb3c+PjkpOworICAgICAgICBwdXRfYml0cygmYy0+cGIsIDIsICgoYy0+bG93Pj43KSYzKXwxKTsKKworICAgICAgICBmbHVzaF9wdXRfYml0cygmYy0+cGIpOyAvL0ZJWE1FIEZJWE1FIEZJWE1FIFhYWCB3cm9uZworICAgIH0KKworICAgIHJldHVybiAocHV0X2JpdHNfY291bnQoJmMtPnBiKSs3KT4+MzsKK30KKworaW50IG1haW4odm9pZCl7CisgICAgQ0FCQUNDb250ZXh0IGM7CisgICAgdWludDhfdCBiWzkqU0laRV07CisgICAgdWludDhfdCByWzkqU0laRV07CisgICAgaW50IGksIHJldCA9IDA7CisgICAgdWludDhfdCBzdGF0ZVsxMF09IHswfTsKKyAgICBBVkxGRyBwcm5nOworCisgICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOworICAgIGZmX2luaXRfY2FiYWNfZW5jb2RlcigmYywgYiwgU0laRSk7CisKKyAgICBmb3IoaT0wOyBpPFNJWkU7IGkrKyl7CisgICAgICAgIGlmKDIqaTxTSVpFKSByW2ldID0gYXZfbGZnX2dldCgmcHJuZykgJSA3OworICAgICAgICBlbHNlICAgICAgICAgcltpXSA9IChpPj44KSYxOworICAgIH0KKworICAgIGZvcihpPTA7IGk8U0laRTsgaSsrKXsKKyAgICAgICAgcHV0X2NhYmFjX2J5cGFzcygmYywgcltpXSYxKTsKKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPFNJWkU7IGkrKyl7CisgICAgICAgIHB1dF9jYWJhYygmYywgc3RhdGUsIHJbaV0mMSk7CisgICAgfQorCisgICAgaT0gcHV0X2NhYmFjX3Rlcm1pbmF0ZSgmYywgMSk7CisgICAgYltpKytdID0gYXZfbGZnX2dldCgmcHJuZyk7CisgICAgYltpICBdID0gYXZfbGZnX2dldCgmcHJuZyk7CisKKyAgICBmZl9pbml0X2NhYmFjX2RlY29kZXIoJmMsIGIsIFNJWkUpOworCisgICAgbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKworICAgIGZvcihpPTA7IGk8U0laRTsgaSsrKXsKKyAgICAgICAgaWYoIChyW2ldJjEpICE9IGdldF9jYWJhY19ieXBhc3MoJmMpICkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNBQkFDIGJ5cGFzcyBmYWlsdXJlIGF0ICVkXG4iLCBpKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoaT0wOyBpPFNJWkU7IGkrKyl7CisgICAgICAgIGlmKCAocltpXSYxKSAhPSBnZXRfY2FiYWNfbm9pbmxpbmUoJmMsIHN0YXRlKSApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDQUJBQyBmYWlsdXJlIGF0ICVkXG4iLCBpKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoIWdldF9jYWJhY190ZXJtaW5hdGUoJmMpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJ3aGVyZSdzIHRoZSBUZXJtaW5hdG9yP1xuIik7CisgICAgICAgIHJldCA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGVzdHMvY2VscF9tYXRoLmMgYi9saWJhdmNvZGVjL3Rlc3RzL2NlbHBfbWF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OWVhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Rlc3RzL2NlbHBfbWF0aC5jCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9saWJtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9jZWxwX21hdGguYyIKKworc3RhdGljIGlubGluZSB2b2lkIElzQWxtb3N0RXF1YWwoZmxvYXQgQSwgZmxvYXQgQiwgZmxvYXQgZXBzaWxvbikKK3sKKyAgICBmbG9hdCBkaWZmID0gZmFic2YoQSAtIEIpOworICAgIGZsb2F0IGFic2EgPSBmYWJzZihBKTsKKyAgICBmbG9hdCBhYnNiID0gZmFic2YoQik7CisgICAgZmxvYXQgbGFyZ2VzdCA9IChhYnNiID4gYWJzYSkgPyBhYnNiIDogYWJzYTsKKyAgICBhdl9hc3NlcnQwKGRpZmYgPD0gbGFyZ2VzdCAqIGVwc2lsb24pOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCBpOworICAgIGNvbnN0IGZsb2F0IGYxWzNdICAgPSB7MC4wLCAgMS4xLCAgMi4yfTsKKyAgICBjb25zdCBmbG9hdCBmMlszXSAgID0gezMuMywgIDQuNCwgIDUuNX07CisgICAgY29uc3QgaW50MTZfdCBpMVszXSA9IHs2LCAgNywgIDh9OworICAgIGNvbnN0IGludDE2X3QgaTJbM10gPSB7OSwgMTAsIDExfTsKKworICAgIGZsb2F0ICAgciA9IGZmX2RvdF9wcm9kdWN0ZihmMSwgZjIsIEZGX0FSUkFZX0VMRU1TKGYxKSk7CisgICAgaW50NjRfdCBkID0gZmZfZG90X3Byb2R1Y3QoaTEsIGkyLCBGRl9BUlJBWV9FTEVNUyhpMSkpOworCisgICAgSXNBbG1vc3RFcXVhbCgxNi45NGYsIHIsIDAuMDAwMDAxZik7CisgICAgYXZfYXNzZXJ0MCgyMTIgPT0gZCk7CisKKyAgICBmb3IgKGkgPSAxMDI0OyBpID49IDE7IGkvPTIpCisgICAgICAgIGF2X2Fzc2VydDAoZmZfbG9nMl9xMTUoaSkgPT0gKDE8PDE1KSooKGludClsb2cyKGkpKSsoMTw8MikpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rlc3RzL2NvZGVjX2Rlc2MuYyBiL2xpYmF2Y29kZWMvdGVzdHMvY29kZWNfZGVzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5YjM0OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Rlc3RzL2NvZGVjX2Rlc2MuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpvbGRfZGVzYyA9IE5VTEwsICpkZXNjOworCisgICAgd2hpbGUgKGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfbmV4dChvbGRfZGVzYykpIHsKKyAgICAgICAgaWYgKG9sZF9kZXNjICYmIG9sZF9kZXNjLT5pZCA+PSBkZXNjLT5pZCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19GQVRBTCwgIlVuc29ydGVkIGNvZGVjX2Rlc2NyaXB0b3JzICclcycgYW5kICclcycuXG4iLCBvbGRfZGVzYy0+bmFtZSwgZGVzYy0+bmFtZSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGRlc2MtPmlkKSAhPSBkZXNjKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiYXZjb2RlY19kZXNjcmlwdG9yX2dldCgpIGZhaWxlZCB3aXRoICclcycuXG4iLCBkZXNjLT5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2Y29kZWNfZGVzY3JpcHRvcl9nZXRfYnlfbmFtZShkZXNjLT5uYW1lKSAhPSBkZXNjKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiYXZjb2RlY19kZXNjcmlwdG9yX2dldF9ieV9uYW1lKCkgZmFpbGVkIHdpdGggJyVzJy5cbiIsIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBvbGRfZGVzYyA9IGRlc2M7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rlc3RzL2RjdC5jIGIvbGliYXZjb2RlYy90ZXN0cy9kY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGZhNGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy9kY3QuYwpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIChjKSAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogICAgIDIwMDcgTWFyYyBIb2ZmbWFuIDxtYXJjLmhvZmZtYW5AYW5hbG9nLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRENUIHRlc3QgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBTdGFydGVkIGZyb20gc2FtcGxlIGNvZGUgYnkgSnVhbiBKLiBTaWVycmFsdGEgUC4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9kY3QuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2lkY3Rkc3AuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3NpbXBsZV9pZGN0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy94dmlkaWRjdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWFuZGN0dGFiLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mYWFuZGN0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9mYWFuaWRjdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZGN0cmVmLmgiCisKK3N0cnVjdCBhbGdvIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHZvaWQgKCpmdW5jKShpbnQxNl90ICpibG9jayk7CisgICAgZW51bSBpZGN0X3Blcm11dGF0aW9uX3R5cGUgcGVybV90eXBlOworICAgIGludCBjcHVfZmxhZzsKKyAgICBpbnQgbm9uc3BlYzsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBmZGN0X3RhYltdID0geworICAgIHsgIlJFRi1EQkwiLCAgICAgZmZfcmVmX2ZkY3QsICAgICAgICAgIEZGX0lEQ1RfUEVSTV9OT05FIH0sCisgICAgeyAiSUpHLUFBTi1JTlQiLCBmZl9mZGN0X2lmYXN0LCAgICAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKKyAgICB7ICJJSkctTExNLUlOVCIsIGZmX2pwZWdfZmRjdF9pc2xvd184LCBGRl9JRENUX1BFUk1fTk9ORSB9LAorI2lmIENPTkZJR19GQUFORENUCisgICAgeyAiRkFBTiIsICAgICAgICBmZl9mYWFuZGN0LCAgICAgICAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKKyNlbmRpZiAvKiBDT05GSUdfRkFBTkRDVCAqLworfTsKKworc3RhdGljIHZvaWQgZmZfcHJvcmVzX2lkY3Rfd3JhcChpbnQxNl90ICpkc3QpeworICAgIExPQ0FMX0FMSUdORUQoMTYsIGludDE2X3QsIHFtYXQsIFs2NF0pOworICAgIGludCBpOworCisgICAgZm9yKGk9MDsgaTw2NDsgaSsrKXsKKyAgICAgICAgcW1hdFtpXT00OworICAgIH0KKyAgICBmZl9wcm9yZXNfaWRjdChkc3QsIHFtYXQpOworICAgIGZvcihpPTA7IGk8NjQ7IGkrKykgeworICAgICAgICAgZHN0W2ldIC09IDUxMjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBpZGN0X3RhYltdID0geworICAgIHsgIlJFRi1EQkwiLCAgICAgZmZfcmVmX2lkY3QsICAgICAgICAgIEZGX0lEQ1RfUEVSTV9OT05FIH0sCisgICAgeyAiSU5UIiwgICAgICAgICBmZl9qX3Jldl9kY3QsICAgICAgICAgRkZfSURDVF9QRVJNX0xJQk1QRUcyIH0sCisgICAgeyAiU0lNUExFLUMiLCAgICBmZl9zaW1wbGVfaWRjdF9pbnQxNl84Yml0LCAgICAgRkZfSURDVF9QRVJNX05PTkUgfSwKKyAgICB7ICJTSU1QTEUtQzEwIiwgIGZmX3NpbXBsZV9pZGN0X2ludDE2XzEwYml0LCAgICBGRl9JRENUX1BFUk1fTk9ORSB9LAorICAgIHsgIlNJTVBMRS1DMTIiLCAgZmZfc2ltcGxlX2lkY3RfaW50MTZfMTJiaXQsICAgIEZGX0lEQ1RfUEVSTV9OT05FLCAwLCAxIH0sCisgICAgeyAiUFItQyIsICAgICAgICBmZl9wcm9yZXNfaWRjdF93cmFwLCAgRkZfSURDVF9QRVJNX05PTkUsIDAsIDEgfSwKKyNpZiBDT05GSUdfRkFBTklEQ1QKKyAgICB7ICJGQUFOSSIsICAgICAgIGZmX2ZhYW5pZGN0LCAgICAgICAgICBGRl9JRENUX1BFUk1fTk9ORSB9LAorI2VuZGlmIC8qIENPTkZJR19GQUFOSURDVCAqLworI2lmIENPTkZJR19NUEVHNF9ERUNPREVSCisgICAgeyAiWFZJRCIsICAgICAgICBmZl94dmlkX2lkY3QsICAgICAgICAgRkZfSURDVF9QRVJNX05PTkUsIDAsIDEgfSwKKyNlbmRpZiAvKiBDT05GSUdfTVBFRzRfREVDT0RFUiAqLworfTsKKworI2lmIEFSQ0hfQUFSQ0g2NAorI2luY2x1ZGUgImFhcmNoNjQvZGN0LmMiCisjZWxpZiBBUkNIX0FSTQorI2luY2x1ZGUgImFybS9kY3QuYyIKKyNlbGlmIEFSQ0hfUFBDCisjaW5jbHVkZSAicHBjL2RjdC5jIgorI2VsaWYgQVJDSF9YODYKKyNpbmNsdWRlICJ4ODYvZGN0LmMiCisjZWxzZQorc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGZkY3RfdGFiX2FyY2hbXSA9IHsgeyAwIH0gfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBpZGN0X3RhYl9hcmNoW10gPSB7IHsgMCB9IH07CisjZW5kaWYKKworI2RlZmluZSBBQU5TQ0FMRV9CSVRTIDEyCisKKyNkZWZpbmUgTkJfSVRTIDIwMDAwCisjZGVmaW5lIE5CX0lUU19TUEVFRCA1MDAwMAorCitERUNMQVJFX0FMSUdORUQoMTYsIHN0YXRpYyBpbnQxNl90LCBibG9jaylbNjRdOworREVDTEFSRV9BTElHTkVEKDgsICBzdGF0aWMgaW50MTZfdCwgYmxvY2sxKVs2NF07CisKK3N0YXRpYyB2b2lkIGluaXRfYmxvY2soaW50MTZfdCBibG9ja1s2NF0sIGludCB0ZXN0LCBpbnQgaXNfaWRjdCwgQVZMRkcgKnBybmcsIGludCB2YWxzKQoreworICAgIGludCBpLCBqOworCisgICAgbWVtc2V0KGJsb2NrLCAwLCA2NCAqIHNpemVvZigqYmxvY2spKTsKKworICAgIHN3aXRjaCAodGVzdCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBibG9ja1tpXSA9IChhdl9sZmdfZ2V0KHBybmcpICUgKDIqdmFscykpIC12YWxzOworICAgICAgICBpZiAoaXNfaWRjdCkgeworICAgICAgICAgICAgZmZfcmVmX2ZkY3QoYmxvY2spOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICAgICAgYmxvY2tbaV0gPj49IDM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBqID0gYXZfbGZnX2dldChwcm5nKSAlIDEwICsgMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGo7IGkrKykgeworICAgICAgICAgICAgaW50IGlkeCA9IGF2X2xmZ19nZXQocHJuZykgJSA2NDsKKyAgICAgICAgICAgIGJsb2NrW2lkeF0gPSBhdl9sZmdfZ2V0KHBybmcpICUgKDIqdmFscykgLXZhbHM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBibG9ja1sgMF0gPSBhdl9sZmdfZ2V0KHBybmcpICUgKDE2KnZhbHMpIC0gKDgqdmFscyk7CisgICAgICAgIGJsb2NrWzYzXSA9IChibG9ja1swXSAmIDEpIF4gMTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwZXJtdXRlKGludDE2X3QgZHN0WzY0XSwgY29uc3QgaW50MTZfdCBzcmNbNjRdLAorICAgICAgICAgICAgICAgICAgICBlbnVtIGlkY3RfcGVybXV0YXRpb25fdHlwZSBwZXJtX3R5cGUpCit7CisgICAgaW50IGk7CisKKyNpZiBBUkNIX1g4NgorICAgIGlmIChwZXJtdXRlX3g4Nihkc3QsIHNyYywgcGVybV90eXBlKSkKKyAgICAgICAgcmV0dXJuOworI2VuZGlmCisKKyAgICBzd2l0Y2ggKHBlcm1fdHlwZSkgeworICAgIGNhc2UgRkZfSURDVF9QRVJNX0xJQk1QRUcyOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGRzdFsoaSAmIDB4MzgpIHwgKChpICYgNikgPj4gMSkgfCAoKGkgJiAxKSA8PCAyKV0gPSBzcmNbaV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfSURDVF9QRVJNX1BBUlRUUkFOUzoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBkc3RbKGkgJiAweDI0KSB8ICgoaSAmIDMpIDw8IDMpIHwgKChpID4+IDMpICYgMyldID0gc3JjW2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0U6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQorICAgICAgICAgICAgZHN0WyhpPj4zKSB8ICgoaTw8MykmMHgzOCldID0gc3JjW2ldOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgaW50IGRjdF9lcnJvcihjb25zdCBzdHJ1Y3QgYWxnbyAqZGN0LCBpbnQgdGVzdCwgaW50IGlzX2lkY3QsIGludCBzcGVlZCwgY29uc3QgaW50IGJpdHMpCit7CisgICAgdm9pZCAoKnJlZikoaW50MTZfdCAqYmxvY2spID0gaXNfaWRjdCA/IGZmX3JlZl9pZGN0IDogZmZfcmVmX2ZkY3Q7CisgICAgaW50IGl0LCBpLCBzY2FsZTsKKyAgICBpbnQgZXJyX2luZiwgdjsKKyAgICBpbnQ2NF90IGVycjIsIHRpLCB0aTEsIGl0MSwgZXJyX3N1bSA9IDA7CisgICAgaW50NjRfdCBzeXNFcnJbNjRdLCBzeXNFcnJNYXggPSAwOworICAgIGludDY0X3QgZXJyMl9tYXRyaXhbNjRdLCBlcnIyX21heCA9IDA7CisgICAgaW50IG1heG91dCA9IDA7CisgICAgaW50IGJsb2NrU3VtRXJyTWF4ID0gMCwgYmxvY2tTdW1FcnI7CisgICAgQVZMRkcgcHJuZzsKKyAgICBjb25zdCBpbnQgdmFscz0xPDxiaXRzOworICAgIGRvdWJsZSBvbXNlLCBvbWU7CisgICAgaW50IHNwZWNfZXJyOworCisgICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOworCisgICAgZXJyX2luZiA9IDA7CisgICAgZXJyMiA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgIGVycjJfbWF0cml4W2ldID0gc3lzRXJyW2ldID0gMDsKKyAgICBmb3IgKGl0ID0gMDsgaXQgPCBOQl9JVFM7IGl0KyspIHsKKyAgICAgICAgaW5pdF9ibG9jayhibG9jazEsIHRlc3QsIGlzX2lkY3QsICZwcm5nLCB2YWxzKTsKKyAgICAgICAgcGVybXV0ZShibG9jaywgYmxvY2sxLCBkY3QtPnBlcm1fdHlwZSk7CisKKyAgICAgICAgZGN0LT5mdW5jKGJsb2NrKTsKKyAgICAgICAgZW1tc19jKCk7CisKKyAgICAgICAgaWYgKCFzdHJjbXAoZGN0LT5uYW1lLCAiSUpHLUFBTi1JTlQiKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzY2FsZSA9IDggKiAoMSA8PCAoQUFOU0NBTEVfQklUUyArIDExKSkgLyBmZl9hYW5zY2FsZXNbaV07CisgICAgICAgICAgICAgICAgYmxvY2tbaV0gPSAoYmxvY2tbaV0gKiBzY2FsZSkgPj4gQUFOU0NBTEVfQklUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlZihibG9jazEpOworICAgICAgICBpZiAoIXN0cmNtcChkY3QtPm5hbWUsICJQUi1TU0UyIikpCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgICAgICBibG9jazFbaV0gPSBhdl9jbGlwKGJsb2NrMVtpXSwgNC01MTIsIDEwMTktNTEyKTsKKworICAgICAgICBibG9ja1N1bUVyciA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgZXJyID0gYmxvY2tbaV0gLSBibG9jazFbaV07CisgICAgICAgICAgICBlcnJfc3VtICs9IGVycjsKKyAgICAgICAgICAgIHYgPSBhYnMoZXJyKTsKKyAgICAgICAgICAgIGlmICh2ID4gZXJyX2luZikKKyAgICAgICAgICAgICAgICBlcnJfaW5mID0gdjsKKyAgICAgICAgICAgIGVycjJfbWF0cml4W2ldICs9IHYgKiB2OworICAgICAgICAgICAgZXJyMiArPSB2ICogdjsKKyAgICAgICAgICAgIHN5c0VycltpXSArPSBibG9ja1tpXSAtIGJsb2NrMVtpXTsKKyAgICAgICAgICAgIGJsb2NrU3VtRXJyICs9IHY7CisgICAgICAgICAgICBpZiAoYWJzKGJsb2NrW2ldKSA+IG1heG91dCkKKyAgICAgICAgICAgICAgICBtYXhvdXQgPSBhYnMoYmxvY2tbaV0pOworICAgICAgICB9CisgICAgICAgIGlmIChibG9ja1N1bUVyck1heCA8IGJsb2NrU3VtRXJyKQorICAgICAgICAgICAgYmxvY2tTdW1FcnJNYXggPSBibG9ja1N1bUVycjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgc3lzRXJyTWF4ID0gRkZNQVgoc3lzRXJyTWF4LCBGRkFCUyhzeXNFcnJbaV0pKTsKKyAgICAgICAgZXJyMl9tYXggID0gRkZNQVgoZXJyMl9tYXggLCBGRkFCUyhlcnIyX21hdHJpeFtpXSkpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIGlmIChpICUgOCA9PSAwKQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBwcmludGYoIiU3ZCAiLCAoaW50KSBzeXNFcnJbaV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICBvbXNlID0gKGRvdWJsZSkgZXJyMiAvIE5CX0lUUyAvIDY0OworICAgIG9tZSAgPSAoZG91YmxlKSBlcnJfc3VtIC8gTkJfSVRTIC8gNjQ7CisKKyAgICBzcGVjX2VyciA9IGlzX2lkY3QgJiYgKGVycl9pbmYgPiAxIHx8IG9tc2UgPiAwLjAyIHx8IGZhYnMob21lKSA+IDAuMDAxNSk7CisgICAgaWYgKHRlc3QgPCAyKQorICAgICAgICBzcGVjX2VyciA9IGlzX2lkY3QgJiYgKChkb3VibGUpIGVycjJfbWF4IC8gTkJfSVRTID4gMC4wNiB8fCAoZG91YmxlKSBzeXNFcnJNYXggLyBOQl9JVFMgPiAwLjAxNSk7CisKKyAgICBwcmludGYoIiVzICVzOiBtYXhfZXJyPSVkIG9tc2U9JTAuOGYgb21lPSUwLjhmIHN5c2Vycj0lMC44ZiBtYXhvdXQ9JWQgYmxvY2tTdW1FcnI9JWRcbiIsCisgICAgICAgICAgIGlzX2lkY3QgPyAiSURDVCIgOiAiRENUIiwgZGN0LT5uYW1lLCBlcnJfaW5mLAorICAgICAgICAgICBvbXNlLCBvbWUsIChkb3VibGUpIHN5c0Vyck1heCAvIE5CX0lUUywKKyAgICAgICAgICAgbWF4b3V0LCBibG9ja1N1bUVyck1heCk7CisKKyAgICBpZiAoc3BlY19lcnIgJiYgIWRjdC0+bm9uc3BlYykgeworICAgICAgICBwcmludGYoIkZhaWxlZCFcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoIXNwZWVkKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIHNwZWVkIHRlc3QgKi8KKworICAgIGluaXRfYmxvY2soYmxvY2ssIHRlc3QsIGlzX2lkY3QsICZwcm5nLCB2YWxzKTsKKyAgICBwZXJtdXRlKGJsb2NrMSwgYmxvY2ssIGRjdC0+cGVybV90eXBlKTsKKworICAgIHRpID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworICAgIGl0MSA9IDA7CisgICAgZG8geworICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBOQl9JVFNfU1BFRUQ7IGl0KyspIHsKKyAgICAgICAgICAgIG1lbWNweShibG9jaywgYmxvY2sxLCBzaXplb2YoYmxvY2spKTsKKyAgICAgICAgICAgIGRjdC0+ZnVuYyhibG9jayk7CisgICAgICAgIH0KKyAgICAgICAgZW1tc19jKCk7CisgICAgICAgIGl0MSArPSBOQl9JVFNfU1BFRUQ7CisgICAgICAgIHRpMSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHRpOworICAgIH0gd2hpbGUgKHRpMSA8IDEwMDAwMDApOworCisgICAgcHJpbnRmKCIlcyAlczogJTAuMWYga2RjdC9zXG4iLCBpc19pZGN0ID8gIklEQ1QiIDogIkRDVCIsIGRjdC0+bmFtZSwKKyAgICAgICAgICAgKGRvdWJsZSkgaXQxICogMTAwMC4wIC8gKGRvdWJsZSkgdGkxKTsKKworICAgIHJldHVybiAwOworfQorCitERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIHVpbnQ4X3QsIGltZ19kZXN0KVs2NF07CitERUNMQVJFX0FMSUdORUQoOCwgc3RhdGljIHVpbnQ4X3QsIGltZ19kZXN0MSlbNjRdOworCitzdGF0aWMgdm9pZCBpZGN0MjQ4X3JlZih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZXNpemUsIGludDE2X3QgKmJsb2NrKQoreworICAgIHN0YXRpYyBpbnQgaW5pdDsKKyAgICBzdGF0aWMgZG91YmxlIGM4WzhdWzhdOworICAgIHN0YXRpYyBkb3VibGUgYzRbNF1bNF07CisgICAgZG91YmxlIGJsb2NrMVs2NF0sIGJsb2NrMls2NF0sIGJsb2NrM1s2NF07CisgICAgZG91YmxlIHMsIHN1bSwgdjsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGlmICghaW5pdCkgeworICAgICAgICBpbml0ID0gMTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgICAgIHMgPSAoaSA9PSAwKSA/IHNxcnQoMS4wIC8gOC4wKSA6IHNxcnQoMS4wIC8gNC4wKTsKKyAgICAgICAgICAgICAgICBjOFtpXVtqXSA9IHMgKiBjb3MoTV9QSSAqIGkgKiAoaiArIDAuNSkgLyA4LjApOworICAgICAgICAgICAgICAgIHN1bSArPSBjOFtpXVtqXSAqIGM4W2ldW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgICAgICBzID0gKGkgPT0gMCkgPyBzcXJ0KDEuMCAvIDQuMCkgOiBzcXJ0KDEuMCAvIDIuMCk7CisgICAgICAgICAgICAgICAgYzRbaV1bal0gPSBzICogY29zKE1fUEkgKiBpICogKGogKyAwLjUpIC8gNC4wKTsKKyAgICAgICAgICAgICAgICBzdW0gKz0gYzRbaV1bal0gKiBjNFtpXVtqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGJ1dHRlcmZseSAqLworICAgIHMgPSAwLjUgKiBzcXJ0KDIuMCk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisgICAgICAgICAgICBibG9jazFbOCAqICgyICogaSkgKyBqXSA9CisgICAgICAgICAgICAgICAgKGJsb2NrWzggKiAoMiAqIGkpICsgal0gKyBibG9ja1s4ICogKDIgKiBpICsgMSkgKyBqXSkgKiBzOworICAgICAgICAgICAgYmxvY2sxWzggKiAoMiAqIGkgKyAxKSArIGpdID0KKyAgICAgICAgICAgICAgICAoYmxvY2tbOCAqICgyICogaSkgKyBqXSAtIGJsb2NrWzggKiAoMiAqIGkgKyAxKSArIGpdKSAqIHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBpZGN0OCBvbiBsaW5lcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA4OyBrKyspCisgICAgICAgICAgICAgICAgc3VtICs9IGM4W2tdW2pdICogYmxvY2sxWzggKiBpICsga107CisgICAgICAgICAgICBibG9jazJbOCAqIGkgKyBqXSA9IHN1bTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGlkY3Q0ICovCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgICAgICAvKiB0b3AgKi8KKyAgICAgICAgICAgIHN1bSA9IDA7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgaysrKQorICAgICAgICAgICAgICAgIHN1bSArPSBjNFtrXVtqXSAqIGJsb2NrMls4ICogKDIgKiBrKSArIGldOworICAgICAgICAgICAgYmxvY2szWzggKiAoMiAqIGopICsgaV0gPSBzdW07CisKKyAgICAgICAgICAgIC8qIGJvdHRvbSAqLworICAgICAgICAgICAgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgICAgICAgICAgc3VtICs9IGM0W2tdW2pdICogYmxvY2syWzggKiAoMiAqIGsgKyAxKSArIGldOworICAgICAgICAgICAgYmxvY2szWzggKiAoMiAqIGogKyAxKSArIGldID0gc3VtOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2xhbXAgYW5kIHN0b3JlIHRoZSByZXN1bHQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKyAgICAgICAgICAgIHYgPSBibG9jazNbOCAqIGkgKyBqXTsKKyAgICAgICAgICAgIGlmICAgICAgKHYgPCAwKSAgIHYgPSAwOworICAgICAgICAgICAgZWxzZSBpZiAodiA+IDI1NSkgdiA9IDI1NTsKKyAgICAgICAgICAgIGRlc3RbaSAqIGxpbmVzaXplICsgal0gPSAoaW50KSByaW50KHYpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBpZGN0MjQ4X2Vycm9yKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCppZGN0MjQ4X3B1dCkodWludDhfdCAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwZWVkKQoreworICAgIGludCBpdCwgaSwgaXQxLCB0aSwgdGkxLCBlcnJfbWF4LCB2OworICAgIEFWTEZHIHBybmc7CisKKyAgICBhdl9sZmdfaW5pdCgmcHJuZywgMSk7CisKKyAgICAvKiBqdXN0IG9uZSB0ZXN0IHRvIHNlZSBpZiBjb2RlIGlzIGNvcnJlY3QgKHByZWNpc2lvbiBpcyBsZXNzCisgICAgICAgaW1wb3J0YW50IGhlcmUpICovCisgICAgZXJyX21heCA9IDA7CisgICAgZm9yIChpdCA9IDA7IGl0IDwgTkJfSVRTOyBpdCsrKSB7CisgICAgICAgIC8qIFhYWDogdXNlIGZvcndhcmQgdHJhbnNmb3JtIHRvIGdlbmVyYXRlIHZhbHVlcyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGJsb2NrMVtpXSA9IGF2X2xmZ19nZXQoJnBybmcpICUgMjU2IC0gMTI4OworICAgICAgICBibG9jazFbMF0gKz0gMTAyNDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGJsb2NrW2ldID0gYmxvY2sxW2ldOworICAgICAgICBpZGN0MjQ4X3JlZihpbWdfZGVzdDEsIDgsIGJsb2NrKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGJsb2NrW2ldID0gYmxvY2sxW2ldOworICAgICAgICBpZGN0MjQ4X3B1dChpbWdfZGVzdCwgOCwgYmxvY2spOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgICAgICB2ID0gYWJzKChpbnQpIGltZ19kZXN0W2ldIC0gKGludCkgaW1nX2Rlc3QxW2ldKTsKKyAgICAgICAgICAgIGlmICh2ID09IDI1NSkKKyAgICAgICAgICAgICAgICBwcmludGYoIiVkICVkXG4iLCBpbWdfZGVzdFtpXSwgaW1nX2Rlc3QxW2ldKTsKKyAgICAgICAgICAgIGlmICh2ID4gZXJyX21heCkKKyAgICAgICAgICAgICAgICBlcnJfbWF4ID0gdjsKKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgcHJpbnRmKCJyZWY9XG4iKTsKKyAgICAgICAgZm9yKGk9MDtpPDg7aSsrKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGZvcihqPTA7ajw4O2orKykgeworICAgICAgICAgICAgICAgIHByaW50ZigiICUzZCIsIGltZ19kZXN0MVtpKjgral0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpbnRmKCJvdXQ9XG4iKTsKKyAgICAgICAgZm9yKGk9MDtpPDg7aSsrKSB7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGZvcihqPTA7ajw4O2orKykgeworICAgICAgICAgICAgICAgIHByaW50ZigiICUzZCIsIGltZ19kZXN0W2kqOCtqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBwcmludGYoIiVzICVzOiBlcnJfaW5mPSVkXG4iLCAxID8gIklEQ1QyNDgiIDogIkRDVDI0OCIsIG5hbWUsIGVycl9tYXgpOworCisgICAgaWYgKCFzcGVlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdGkgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgaXQxID0gMDsKKyAgICBkbyB7CisgICAgICAgIGZvciAoaXQgPSAwOyBpdCA8IE5CX0lUU19TUEVFRDsgaXQrKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICAgICAgYmxvY2tbaV0gPSBibG9jazFbaV07CisgICAgICAgICAgICBpZGN0MjQ4X3B1dChpbWdfZGVzdCwgOCwgYmxvY2spOworICAgICAgICB9CisgICAgICAgIGVtbXNfYygpOworICAgICAgICBpdDEgKz0gTkJfSVRTX1NQRUVEOworICAgICAgICB0aTEgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSB0aTsKKyAgICB9IHdoaWxlICh0aTEgPCAxMDAwMDAwKTsKKworICAgIHByaW50ZigiJXMgJXM6ICUwLjFmIGtkY3Qvc1xuIiwgMSA/ICJJRENUMjQ4IiA6ICJEQ1QyNDgiLCBuYW1lLAorICAgICAgICAgICAoZG91YmxlKSBpdDEgKiAxMDAwLjAgLyAoZG91YmxlKSB0aTEpOworfQorCitzdGF0aWMgdm9pZCBoZWxwKHZvaWQpCit7CisgICAgcHJpbnRmKCJkY3QtdGVzdCBbLWldIFs8dGVzdC1udW1iZXI+XSBbPGJpdHM+XVxuIgorICAgICAgICAgICAidGVzdC1udW1iZXIgMCAtPiB0ZXN0IHdpdGggcmFuZG9tIG1hdHJpeGVzXG4iCisgICAgICAgICAgICIgICAgICAgICAgICAxIC0+IHRlc3Qgd2l0aCByYW5kb20gc3BhcnNlIG1hdHJpeGVzXG4iCisgICAgICAgICAgICIgICAgICAgICAgICAyIC0+IGRvIDMuIHRlc3QgZnJvbSBNUEVHLTQgc3RkXG4iCisgICAgICAgICAgICJiaXRzICAgICAgICBOdW1iZXIgb2YgdGltZSBkb21haW4gYml0cyB0byB1c2UsIDggaXMgZGVmYXVsdFxuIgorICAgICAgICAgICAiLWkgICAgICAgICAgdGVzdCBJRENUIGltcGxlbWVudGF0aW9uc1xuIgorICAgICAgICAgICAiLTQgICAgICAgICAgdGVzdCBJRENUMjQ4IGltcGxlbWVudGF0aW9uc1xuIgorICAgICAgICAgICAiLXQgICAgICAgICAgc3BlZWQgdGVzdFxuIik7Cit9CisKKyNpZiAhSEFWRV9HRVRPUFQKKyNpbmNsdWRlICJjb21wYXQvZ2V0b3B0LmMiCisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCB0ZXN0X2lkY3QgPSAwLCB0ZXN0XzI0OF9kY3QgPSAwOworICAgIGludCBjLCBpOworICAgIGludCB0ZXN0ID0gMTsKKyAgICBpbnQgc3BlZWQgPSAwOworICAgIGludCBlcnIgPSAwOworICAgIGludCBiaXRzPTg7CisKKyAgICBmZl9yZWZfZGN0X2luaXQoKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaWg0dCIpOworICAgICAgICBpZiAoYyA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICB0ZXN0X2lkY3QgPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzQnOgorICAgICAgICAgICAgdGVzdF8yNDhfZGN0ID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIHNwZWVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGhlbHAoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpCisgICAgICAgIHRlc3QgPSBhdG9pKGFyZ3Zbb3B0aW5kXSk7CisgICAgaWYob3B0aW5kKzEgPCBhcmdjKSBiaXRzPSBhdG9pKGFyZ3Zbb3B0aW5kKzFdKTsKKworICAgIHByaW50ZigiZmZtcGVnIERDVC9JRENUIHRlc3RcbiIpOworCisgICAgaWYgKHRlc3RfMjQ4X2RjdCkgeworICAgICAgICBpZGN0MjQ4X2Vycm9yKCJTSU1QTEUtQyIsIGZmX3NpbXBsZV9pZGN0MjQ4X3B1dCwgc3BlZWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisgICAgICAgIGlmICh0ZXN0X2lkY3QpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhpZGN0X3RhYik7IGkrKykKKyAgICAgICAgICAgICAgICBlcnIgfD0gZGN0X2Vycm9yKCZpZGN0X3RhYltpXSwgdGVzdCwgdGVzdF9pZGN0LCBzcGVlZCwgYml0cyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGlkY3RfdGFiX2FyY2hbaV0ubmFtZTsgaSsrKQorICAgICAgICAgICAgICAgIGlmICghKH5jcHVfZmxhZ3MgJiBpZGN0X3RhYl9hcmNoW2ldLmNwdV9mbGFnKSkKKyAgICAgICAgICAgICAgICAgICAgZXJyIHw9IGRjdF9lcnJvcigmaWRjdF90YWJfYXJjaFtpXSwgdGVzdCwgdGVzdF9pZGN0LCBzcGVlZCwgYml0cyk7CisgICAgICAgIH0KKyNpZiBDT05GSUdfRkRDVERTUAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhmZGN0X3RhYik7IGkrKykKKyAgICAgICAgICAgICAgICBlcnIgfD0gZGN0X2Vycm9yKCZmZGN0X3RhYltpXSwgdGVzdCwgdGVzdF9pZGN0LCBzcGVlZCwgYml0cyk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGZkY3RfdGFiX2FyY2hbaV0ubmFtZTsgaSsrKQorICAgICAgICAgICAgICAgIGlmICghKH5jcHVfZmxhZ3MgJiBmZGN0X3RhYl9hcmNoW2ldLmNwdV9mbGFnKSkKKyAgICAgICAgICAgICAgICAgICAgZXJyIHw9IGRjdF9lcnJvcigmZmRjdF90YWJfYXJjaFtpXSwgdGVzdCwgdGVzdF9pZGN0LCBzcGVlZCwgYml0cyk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfRkRDVERTUCAqLworICAgIH0KKworICAgIGlmIChlcnIpCisgICAgICAgIHByaW50ZigiRXJyb3I6ICVkLlxuIiwgZXJyKTsKKworICAgIHJldHVybiAhIWVycjsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGVzdHMvZmZ0LWZpeGVkLmMgYi9saWJhdmNvZGVjL3Rlc3RzL2ZmdC1maXhlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTBiZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Rlc3RzL2ZmdC1maXhlZC5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBGRlRfRkxPQVQgMAorI2RlZmluZSBBVkZGVCAwCisjaW5jbHVkZSAiZmZ0LmMiCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rlc3RzL2ZmdC1maXhlZDMyLmMgYi9saWJhdmNvZGVjL3Rlc3RzL2ZmdC1maXhlZDMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhZGQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvZmZ0LWZpeGVkMzIuYwpAQCAtMCwwICsxLDIyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgRkZUX0ZMT0FUIDAKKyNkZWZpbmUgRkZUX0ZJWEVEXzMyIDEKKyNkZWZpbmUgQVZGRlQgMAorI2luY2x1ZGUgImZmdC5jIgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9mZnQuYyBiL2xpYmF2Y29kZWMvdGVzdHMvZmZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNmMmZmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvZmZ0LmMKQEAgLTAsMCArMSw2NzYgQEAKKy8qCisgKiAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRkZUIGFuZCBNRENUIHRlc3RzLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmbmRlZiBBVkZGVAorI2RlZmluZSBBVkZGVCAwCisjZW5kaWYKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2lmIEFWRkZUCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmZmdC5oIgorI2Vsc2UKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ZmdC5oIgorI2VuZGlmCisKKyNpZiBGRlRfRkxPQVQKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2RjdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcmRmdC5oIgorI2VuZGlmCisKKy8qIHJlZmVyZW5jZSBmZnQgKi8KKworI2RlZmluZSBNVUwxNihhLCBiKSAoKGEpICogKGIpKQorCisjZGVmaW5lIENNQUMocHJlLCBwaW0sIGFyZSwgYWltLCBicmUsIGJpbSkgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJlICs9IChNVUwxNihhcmUsIGJyZSkgLSBNVUwxNihhaW0sIGJpbSkpOyBcCisgICAgICAgIHBpbSArPSAoTVVMMTYoYXJlLCBiaW0pICsgTVVMMTYoYnJlLCBhaW0pKTsgXAorICAgIH0KKworI2lmIEZGVF9GTE9BVCB8fCBBVkZGVAorI2RlZmluZSBSQU5HRSAxLjAKKyNkZWZpbmUgUkVGX1NDQUxFKHgsIGJpdHMpICAoeCkKKyNkZWZpbmUgRk1UICIlMTAuNmYiCisjZWxpZiBGRlRfRklYRURfMzIKKyNkZWZpbmUgUkFOR0UgODM4ODYwOAorI2RlZmluZSBSRUZfU0NBTEUoeCwgYml0cykgKHgpCisjZGVmaW5lIEZNVCAiJTZkIgorI2Vsc2UKKyNkZWZpbmUgUkFOR0UgMTYzODQKKyNkZWZpbmUgUkVGX1NDQUxFKHgsIGJpdHMpICgoeCkgLyAoMSA8PCAoYml0cykpKQorI2RlZmluZSBGTVQgIiU2ZCIKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHsKKyAgICBmbG9hdCByZSwgaW07Cit9ICpleHB0YWI7CisKK3N0YXRpYyBpbnQgZmZ0X3JlZl9pbml0KGludCBuYml0cywgaW50IGludmVyc2UpCit7CisgICAgaW50IGksIG4gPSAxIDw8IG5iaXRzOworCisgICAgZXhwdGFiID0gYXZfbWFsbG9jX2FycmF5KChuIC8gMiksIHNpemVvZigqZXhwdGFiKSk7CisgICAgaWYgKCFleHB0YWIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG4gLyAyKTsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBhbHBoYSA9IDIgKiBNX1BJICogKGZsb2F0KSBpIC8gKGZsb2F0KSBuOworICAgICAgICBkb3VibGUgYzEgPSBjb3MoYWxwaGEpLCBzMSA9IHNpbihhbHBoYSk7CisgICAgICAgIGlmICghaW52ZXJzZSkKKyAgICAgICAgICAgIHMxID0gLXMxOworICAgICAgICBleHB0YWJbaV0ucmUgPSBjMTsKKyAgICAgICAgZXhwdGFiW2ldLmltID0gczE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmZnRfcmVmKEZGVENvbXBsZXggKnRhYnIsIEZGVENvbXBsZXggKnRhYiwgaW50IG5iaXRzKQoreworICAgIGludCBpLCBqOworICAgIGludCBuICA9IDEgPDwgbmJpdHM7CisgICAgaW50IG4yID0gbiA+PiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBkb3VibGUgdG1wX3JlID0gMCwgdG1wX2ltID0gMDsKKyAgICAgICAgRkZUQ29tcGxleCAqcSA9IHRhYjsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgeworICAgICAgICAgICAgZG91YmxlIHMsIGM7CisgICAgICAgICAgICBpbnQgayA9IChpICogaikgJiAobiAtIDEpOworICAgICAgICAgICAgaWYgKGsgPj0gbjIpIHsKKyAgICAgICAgICAgICAgICBjID0gLWV4cHRhYltrIC0gbjJdLnJlOworICAgICAgICAgICAgICAgIHMgPSAtZXhwdGFiW2sgLSBuMl0uaW07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSBleHB0YWJba10ucmU7CisgICAgICAgICAgICAgICAgcyA9IGV4cHRhYltrXS5pbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENNQUModG1wX3JlLCB0bXBfaW0sIGMsIHMsIHEtPnJlLCBxLT5pbSk7CisgICAgICAgICAgICBxKys7CisgICAgICAgIH0KKyAgICAgICAgdGFicltpXS5yZSA9IFJFRl9TQ0FMRSh0bXBfcmUsIG5iaXRzKTsKKyAgICAgICAgdGFicltpXS5pbSA9IFJFRl9TQ0FMRSh0bXBfaW0sIG5iaXRzKTsKKyAgICB9Cit9CisKKyNpZiBDT05GSUdfTURDVAorc3RhdGljIHZvaWQgaW1kY3RfcmVmKEZGVFNhbXBsZSAqb3V0LCBGRlRTYW1wbGUgKmluLCBpbnQgbmJpdHMpCit7CisgICAgaW50IGksIGssIG4gPSAxIDw8IG5iaXRzOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBkb3VibGUgc3VtID0gMDsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG4gLyAyOyBrKyspIHsKKyAgICAgICAgICAgIGludCBhID0gKDIgKiBpICsgMSArIChuIC8gMikpICogKDIgKiBrICsgMSk7CisgICAgICAgICAgICBkb3VibGUgZiA9IGNvcyhNX1BJICogYSAvIChkb3VibGUpICgyICogbikpOworICAgICAgICAgICAgc3VtICs9IGYgKiBpbltrXTsKKyAgICAgICAgfQorICAgICAgICBvdXRbaV0gPSBSRUZfU0NBTEUoLXN1bSwgbmJpdHMgLSAyKTsKKyAgICB9Cit9CisKKy8qIE5PVEU6IG5vIG5vcm1hbGlzYXRpb24gYnkgMSAvIE4gaXMgZG9uZSAqLworc3RhdGljIHZvaWQgbWRjdF9yZWYoRkZUU2FtcGxlICpvdXRwdXQsIEZGVFNhbXBsZSAqaW5wdXQsIGludCBuYml0cykKK3sKKyAgICBpbnQgaSwgaywgbiA9IDEgPDwgbmJpdHM7CisKKyAgICAvKiBkbyBpdCBieSBoYW5kICovCisgICAgZm9yIChrID0gMDsgayA8IG4gLyAyOyBrKyspIHsKKyAgICAgICAgZG91YmxlIHMgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgYSA9ICgyICogTV9QSSAqICgyICogaSArIDEgKyBuIC8gMikgKiAoMiAqIGsgKyAxKSAvICg0ICogbikpOworICAgICAgICAgICAgcyArPSBpbnB1dFtpXSAqIGNvcyhhKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRba10gPSBSRUZfU0NBTEUocywgbmJpdHMgLSAxKTsKKyAgICB9Cit9CisjZW5kaWYgLyogQ09ORklHX01EQ1QgKi8KKworI2lmIEZGVF9GTE9BVAorI2lmIENPTkZJR19EQ1QKK3N0YXRpYyB2b2lkIGlkY3RfcmVmKEZGVFNhbXBsZSAqb3V0cHV0LCBGRlRTYW1wbGUgKmlucHV0LCBpbnQgbmJpdHMpCit7CisgICAgaW50IGksIGssIG4gPSAxIDw8IG5iaXRzOworCisgICAgLyogZG8gaXQgYnkgaGFuZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgZG91YmxlIHMgPSAwLjUgKiBpbnB1dFswXTsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IG47IGsrKykgeworICAgICAgICAgICAgZG91YmxlIGEgPSBNX1BJICogayAqIChpICsgMC41KSAvIG47CisgICAgICAgICAgICBzICs9IGlucHV0W2tdICogY29zKGEpOworICAgICAgICB9CisgICAgICAgIG91dHB1dFtpXSA9IDIgKiBzIC8gbjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRjdF9yZWYoRkZUU2FtcGxlICpvdXRwdXQsIEZGVFNhbXBsZSAqaW5wdXQsIGludCBuYml0cykKK3sKKyAgICBpbnQgaSwgaywgbiA9IDEgPDwgbmJpdHM7CisKKyAgICAvKiBkbyBpdCBieSBoYW5kICovCisgICAgZm9yIChrID0gMDsgayA8IG47IGsrKykgeworICAgICAgICBkb3VibGUgcyA9IDA7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBhID0gTV9QSSAqIGsgKiAoaSArIDAuNSkgLyBuOworICAgICAgICAgICAgcyArPSBpbnB1dFtpXSAqIGNvcyhhKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRba10gPSBzOworICAgIH0KK30KKyNlbmRpZiAvKiBDT05GSUdfRENUICovCisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisKK3N0YXRpYyBGRlRTYW1wbGUgZnJhbmRvbShBVkxGRyAqcHJuZykKK3sKKyAgICByZXR1cm4gKGludDE2X3QpIGF2X2xmZ19nZXQocHJuZykgLyAzMjc2OC4wICogUkFOR0U7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGlmZihGRlRTYW1wbGUgKnRhYjEsIEZGVFNhbXBsZSAqdGFiMiwgaW50IG4sIGRvdWJsZSBzY2FsZSkKK3sKKyAgICBpbnQgaSwgZXJyID0gMDsKKyAgICBkb3VibGUgZXJyb3IgPSAwLCBtYXggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBkb3VibGUgZSA9IGZhYnModGFiMVtpXSAtICh0YWIyW2ldIC8gc2NhbGUpKSAvIFJBTkdFOworICAgICAgICBpZiAoZSA+PSAxZS0zKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRVJST1IgJTVkOiAiRk1UIiAiRk1UIlxuIiwKKyAgICAgICAgICAgICAgICAgICBpLCB0YWIxW2ldLCB0YWIyW2ldKTsKKyAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3IgKz0gZSAqIGU7CisgICAgICAgIGlmIChlID4gbWF4KQorICAgICAgICAgICAgbWF4ID0gZTsKKyAgICB9CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAibWF4OiVmIGU6JWdcbiIsIG1heCwgc3FydChlcnJvciAvIG4pKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmZ0X2luaXQoRkZUQ29udGV4dCAqKnMsIGludCBuYml0cywgaW50IGludmVyc2UpCit7CisjaWYgQVZGRlQKKyAgICAqcyA9IGF2X2ZmdF9pbml0KG5iaXRzLCBpbnZlcnNlKTsKKyNlbHNlCisgICAgZmZfZmZ0X2luaXQoKnMsIG5iaXRzLCBpbnZlcnNlKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWRjdF9pbml0KEZGVENvbnRleHQgKipzLCBpbnQgbmJpdHMsIGludCBpbnZlcnNlLCBkb3VibGUgc2NhbGUpCit7CisjaWYgQVZGRlQKKyAgICAqcyA9IGF2X21kY3RfaW5pdChuYml0cywgaW52ZXJzZSwgc2NhbGUpOworI2Vsc2UKKyAgICBmZl9tZGN0X2luaXQoKnMsIG5iaXRzLCBpbnZlcnNlLCBzY2FsZSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1kY3RfY2FsYyhGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCkKK3sKKyNpZiBBVkZGVAorICAgIGF2X21kY3RfY2FsYyhzLCBvdXRwdXQsIGlucHV0KTsKKyNlbHNlCisgICAgcy0+bWRjdF9jYWxjKHMsIG91dHB1dCwgaW5wdXQpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbWRjdF9jYWxjKHN0cnVjdCBGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dCkKK3sKKyNpZiBBVkZGVAorICAgIGF2X2ltZGN0X2NhbGMocywgb3V0cHV0LCBpbnB1dCk7CisjZWxzZQorICAgIHMtPmltZGN0X2NhbGMocywgb3V0cHV0LCBpbnB1dCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZmdF9wZXJtdXRlKEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopCit7CisjaWYgQVZGRlQKKyAgICBhdl9mZnRfcGVybXV0ZShzLCB6KTsKKyNlbHNlCisgICAgcy0+ZmZ0X3Blcm11dGUocywgeik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZmdF9jYWxjKEZGVENvbnRleHQgKnMsIEZGVENvbXBsZXggKnopCit7CisjaWYgQVZGRlQKKyAgICBhdl9mZnRfY2FsYyhzLCB6KTsKKyNlbHNlCisgICAgcy0+ZmZ0X2NhbGMocywgeik7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1kY3RfZW5kKEZGVENvbnRleHQgKnMpCit7CisjaWYgQVZGRlQKKyAgICBhdl9tZGN0X2VuZChzKTsKKyNlbHNlCisgICAgZmZfbWRjdF9lbmQocyk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZmdF9lbmQoRkZUQ29udGV4dCAqcykKK3sKKyNpZiBBVkZGVAorICAgIGF2X2ZmdF9lbmQocyk7CisjZWxzZQorICAgIGZmX2ZmdF9lbmQocyk7CisjZW5kaWYKK30KKworI2lmIEZGVF9GTE9BVAorc3RhdGljIGlubGluZSB2b2lkIHJkZnRfaW5pdChSREZUQ29udGV4dCAqKnIsIGludCBuYml0cywgZW51bSBSREZUcmFuc2Zvcm1UeXBlIHRyYW5zKQoreworI2lmIEFWRkZUCisgICAgKnIgPSBhdl9yZGZ0X2luaXQobmJpdHMsIHRyYW5zKTsKKyNlbHNlCisgICAgZmZfcmRmdF9pbml0KCpyLCBuYml0cywgdHJhbnMpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY3RfaW5pdChEQ1RDb250ZXh0ICoqZCwgaW50IG5iaXRzLCBlbnVtIERDVFRyYW5zZm9ybVR5cGUgdHJhbnMpCit7CisjaWYgQVZGRlQKKyAgICAqZCA9IGF2X2RjdF9pbml0KG5iaXRzLCB0cmFucyk7CisjZWxzZQorICAgIGZmX2RjdF9pbml0KCpkLCBuYml0cywgdHJhbnMpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZGZ0X2NhbGMoUkRGVENvbnRleHQgKnIsIEZGVFNhbXBsZSAqdGFiKQoreworI2lmIEFWRkZUCisgICAgYXZfcmRmdF9jYWxjKHIsIHRhYik7CisjZWxzZQorICAgIHItPnJkZnRfY2FsYyhyLCB0YWIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY3RfY2FsYyhEQ1RDb250ZXh0ICpkLCBGRlRTYW1wbGUgKmRhdGEpCit7CisjaWYgQVZGRlQKKyAgICBhdl9kY3RfY2FsYyhkLCBkYXRhKTsKKyNlbHNlCisgICAgZC0+ZGN0X2NhbGMoZCwgZGF0YSk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJkZnRfZW5kKFJERlRDb250ZXh0ICpyKQoreworI2lmIEFWRkZUCisgICAgYXZfcmRmdF9lbmQocik7CisjZWxzZQorICAgIGZmX3JkZnRfZW5kKHIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkY3RfZW5kKERDVENvbnRleHQgKmQpCit7CisjaWYgQVZGRlQKKyAgICBhdl9kY3RfZW5kKGQpOworI2Vsc2UKKyAgICBmZl9kY3RfZW5kKGQpOworI2VuZGlmCit9CisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisKK3N0YXRpYyB2b2lkIGhlbHAodm9pZCkKK3sKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICJ1c2FnZTogZmZ0LXRlc3QgWy1oXSBbLXNdIFstaV0gWy1uIGJdXG4iCisgICAgICAgICAgICItaCAgICAgcHJpbnQgdGhpcyBoZWxwXG4iCisgICAgICAgICAgICItcyAgICAgc3BlZWQgdGVzdFxuIgorICAgICAgICAgICAiLW0gICAgIChJKU1EQ1QgdGVzdFxuIgorICAgICAgICAgICAiLWQgICAgIChJKURDVCB0ZXN0XG4iCisgICAgICAgICAgICItciAgICAgKEkpUkRGVCB0ZXN0XG4iCisgICAgICAgICAgICItaSAgICAgaW52ZXJzZSB0cmFuc2Zvcm0gdGVzdFxuIgorICAgICAgICAgICAiLW4gYiAgIHNldCB0aGUgdHJhbnNmb3JtIHNpemUgdG8gMl5iXG4iCisgICAgICAgICAgICItZiB4ICAgc2V0IHNjYWxlIGZhY3RvciBmb3Igb3V0cHV0IGRhdGEgb2YgKEkpTURDVCB0byB4XG4iKTsKK30KKworZW51bSB0Zl90cmFuc2Zvcm0geworICAgIFRSQU5TRk9STV9GRlQsCisgICAgVFJBTlNGT1JNX01EQ1QsCisgICAgVFJBTlNGT1JNX1JERlQsCisgICAgVFJBTlNGT1JNX0RDVCwKK307CisKKyNpZiAhSEFWRV9HRVRPUFQKKyNpbmNsdWRlICJjb21wYXQvZ2V0b3B0LmMiCisjZW5kaWYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIEZGVENvbXBsZXggKnRhYiwgKnRhYjEsICp0YWJfcmVmOworICAgIEZGVFNhbXBsZSAqdGFiMjsKKyAgICBlbnVtIHRmX3RyYW5zZm9ybSB0cmFuc2Zvcm0gPSBUUkFOU0ZPUk1fRkZUOworICAgIEZGVENvbnRleHQgKm0sICpzOworI2lmIEZGVF9GTE9BVAorICAgIFJERlRDb250ZXh0ICpyOworICAgIERDVENvbnRleHQgKmQ7CisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisgICAgaW50IGl0LCBpLCBlcnIgPSAxOworICAgIGludCBkb19zcGVlZCA9IDAsIGRvX2ludmVyc2UgPSAwOworICAgIGludCBmZnRfbmJpdHMgPSA5LCBmZnRfc2l6ZTsKKyAgICBkb3VibGUgc2NhbGUgPSAxLjA7CisgICAgQVZMRkcgcHJuZzsKKworI2lmICFBVkZGVAorICAgIHMgPSBhdl9tYWxsb2N6KHNpemVvZigqcykpOworICAgIG0gPSBhdl9tYWxsb2N6KHNpemVvZigqbSkpOworI2VuZGlmCisKKyNpZiAhQVZGRlQgJiYgRkZUX0ZMT0FUCisgICAgciA9IGF2X21hbGxvY3ooc2l6ZW9mKCpyKSk7CisgICAgZCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpkKSk7CisjZW5kaWYKKworICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhzaW1yZG46ZjpjOiIpOworICAgICAgICBpZiAoYyA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICBoZWxwKCk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICBkb19zcGVlZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICBkb19pbnZlcnNlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IFRSQU5TRk9STV9NRENUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3InOgorICAgICAgICAgICAgdHJhbnNmb3JtID0gVFJBTlNGT1JNX1JERlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBUUkFOU0ZPUk1fRENUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgZmZ0X25iaXRzID0gYXRvaShvcHRhcmcpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2YnOgorICAgICAgICAgICAgc2NhbGUgPSBhdG9mKG9wdGFyZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYyc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNwdWZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgICAgICAgICBpZiAoYXZfcGFyc2VfY3B1X2NhcHMoJmNwdWZsYWdzLCBvcHRhcmcpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgYXZfZm9yY2VfY3B1X2ZsYWdzKGNwdWZsYWdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZnRfc2l6ZSA9IDEgPDwgZmZ0X25iaXRzOworICAgIHRhYiAgICAgID0gYXZfbWFsbG9jX2FycmF5KGZmdF9zaXplLCBzaXplb2YoRkZUQ29tcGxleCkpOworICAgIHRhYjEgICAgID0gYXZfbWFsbG9jX2FycmF5KGZmdF9zaXplLCBzaXplb2YoRkZUQ29tcGxleCkpOworICAgIHRhYl9yZWYgID0gYXZfbWFsbG9jX2FycmF5KGZmdF9zaXplLCBzaXplb2YoRkZUQ29tcGxleCkpOworICAgIHRhYjIgICAgID0gYXZfbWFsbG9jX2FycmF5KGZmdF9zaXplLCBzaXplb2YoRkZUU2FtcGxlKSk7CisKKyAgICBpZiAoISh0YWIgJiYgdGFiMSAmJiB0YWJfcmVmICYmIHRhYjIpKQorICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICBzd2l0Y2ggKHRyYW5zZm9ybSkgeworI2lmIENPTkZJR19NRENUCisgICAgY2FzZSBUUkFOU0ZPUk1fTURDVDoKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiU2NhbGUgZmFjdG9yIGlzIHNldCB0byAlZlxuIiwgc2NhbGUpOworICAgICAgICBpZiAoZG9faW52ZXJzZSkKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIklNRENUIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIk1EQ1QiKTsKKyAgICAgICAgbWRjdF9pbml0KCZtLCBmZnRfbmJpdHMsIGRvX2ludmVyc2UsIHNjYWxlKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX01EQ1QgKi8KKyAgICBjYXNlIFRSQU5TRk9STV9GRlQ6CisgICAgICAgIGlmIChkb19pbnZlcnNlKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiSUZGVCIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJGRlQiKTsKKyAgICAgICAgZmZ0X2luaXQoJnMsIGZmdF9uYml0cywgZG9faW52ZXJzZSk7CisgICAgICAgIGlmICgoZXJyID0gZmZ0X3JlZl9pbml0KGZmdF9uYml0cywgZG9faW52ZXJzZSkpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgYnJlYWs7CisjaWYgRkZUX0ZMT0FUCisjICAgIGlmIENPTkZJR19SREZUCisgICAgY2FzZSBUUkFOU0ZPUk1fUkRGVDoKKyAgICAgICAgaWYgKGRvX2ludmVyc2UpCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJJREZUX0MyUiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJERlRfUjJDIik7CisgICAgICAgIHJkZnRfaW5pdCgmciwgZmZ0X25iaXRzLCBkb19pbnZlcnNlID8gSURGVF9DMlIgOiBERlRfUjJDKTsKKyAgICAgICAgaWYgKChlcnIgPSBmZnRfcmVmX2luaXQoZmZ0X25iaXRzLCBkb19pbnZlcnNlKSkgPCAwKQorICAgICAgICAgICAgZ290byBjbGVhbnVwOworICAgICAgICBicmVhazsKKyMgICAgZW5kaWYgLyogQ09ORklHX1JERlQgKi8KKyMgICAgaWYgQ09ORklHX0RDVAorICAgIGNhc2UgVFJBTlNGT1JNX0RDVDoKKyAgICAgICAgaWYgKGRvX2ludmVyc2UpCisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJEQ1RfSUlJIik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIkRDVF9JSSIpOworICAgICAgICBkY3RfaW5pdCgmZCwgZmZ0X25iaXRzLCBkb19pbnZlcnNlID8gRENUX0lJSSA6IERDVF9JSSk7CisgICAgICAgIGJyZWFrOworIyAgICBlbmRpZiAvKiBDT05GSUdfRENUICovCisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlJlcXVlc3RlZCB0cmFuc2Zvcm0gbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICVkIHRlc3RcbiIsIGZmdF9zaXplKTsKKworICAgIC8qIGdlbmVyYXRlIHJhbmRvbSBkYXRhICovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmZ0X3NpemU7IGkrKykgeworICAgICAgICB0YWIxW2ldLnJlID0gZnJhbmRvbSgmcHJuZyk7CisgICAgICAgIHRhYjFbaV0uaW0gPSBmcmFuZG9tKCZwcm5nKTsKKyAgICB9CisKKyAgICAvKiBjaGVja2luZyByZXN1bHQgKi8KKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJDaGVja2luZy4uLlxuIik7CisKKyAgICBzd2l0Y2ggKHRyYW5zZm9ybSkgeworI2lmIENPTkZJR19NRENUCisgICAgY2FzZSBUUkFOU0ZPUk1fTURDVDoKKyAgICAgICAgaWYgKGRvX2ludmVyc2UpIHsKKyAgICAgICAgICAgIGltZGN0X3JlZigmdGFiX3JlZi0+cmUsICZ0YWIxLT5yZSwgZmZ0X25iaXRzKTsKKyAgICAgICAgICAgIGltZGN0X2NhbGMobSwgdGFiMiwgJnRhYjEtPnJlKTsKKyAgICAgICAgICAgIGVyciA9IGNoZWNrX2RpZmYoJnRhYl9yZWYtPnJlLCB0YWIyLCBmZnRfc2l6ZSwgc2NhbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWRjdF9yZWYoJnRhYl9yZWYtPnJlLCAmdGFiMS0+cmUsIGZmdF9uYml0cyk7CisgICAgICAgICAgICBtZGN0X2NhbGMobSwgdGFiMiwgJnRhYjEtPnJlKTsKKyAgICAgICAgICAgIGVyciA9IGNoZWNrX2RpZmYoJnRhYl9yZWYtPnJlLCB0YWIyLCBmZnRfc2l6ZSAvIDIsIHNjYWxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfTURDVCAqLworICAgIGNhc2UgVFJBTlNGT1JNX0ZGVDoKKyAgICAgICAgbWVtY3B5KHRhYiwgdGFiMSwgZmZ0X3NpemUgKiBzaXplb2YoRkZUQ29tcGxleCkpOworICAgICAgICBmZnRfcGVybXV0ZShzLCB0YWIpOworICAgICAgICBmZnRfY2FsYyhzLCB0YWIpOworCisgICAgICAgIGZmdF9yZWYodGFiX3JlZiwgdGFiMSwgZmZ0X25iaXRzKTsKKyAgICAgICAgZXJyID0gY2hlY2tfZGlmZigmdGFiX3JlZi0+cmUsICZ0YWItPnJlLCBmZnRfc2l6ZSAqIDIsIDEuMCk7CisgICAgICAgIGJyZWFrOworI2lmIEZGVF9GTE9BVAorI2lmIENPTkZJR19SREZUCisgICAgY2FzZSBUUkFOU0ZPUk1fUkRGVDoKKyAgICB7CisgICAgICAgIGludCBmZnRfc2l6ZV8yID0gZmZ0X3NpemUgPj4gMTsKKyAgICAgICAgaWYgKGRvX2ludmVyc2UpIHsKKyAgICAgICAgICAgIHRhYjFbMF0uaW0gICAgICAgICAgPSAwOworICAgICAgICAgICAgdGFiMVtmZnRfc2l6ZV8yXS5pbSA9IDA7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgZmZ0X3NpemVfMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgdGFiMVtmZnRfc2l6ZV8yICsgaV0ucmUgPSAgdGFiMVtmZnRfc2l6ZV8yIC0gaV0ucmU7CisgICAgICAgICAgICAgICAgdGFiMVtmZnRfc2l6ZV8yICsgaV0uaW0gPSAtdGFiMVtmZnRfc2l6ZV8yIC0gaV0uaW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweSh0YWIyLCB0YWIxLCBmZnRfc2l6ZSAqIHNpemVvZihGRlRTYW1wbGUpKTsKKyAgICAgICAgICAgIHRhYjJbMV0gPSB0YWIxW2ZmdF9zaXplXzJdLnJlOworCisgICAgICAgICAgICByZGZ0X2NhbGMociwgdGFiMik7CisgICAgICAgICAgICBmZnRfcmVmKHRhYl9yZWYsIHRhYjEsIGZmdF9uYml0cyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmZ0X3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHRhYltpXS5yZSA9IHRhYjJbaV07CisgICAgICAgICAgICAgICAgdGFiW2ldLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyciA9IGNoZWNrX2RpZmYoJnRhYl9yZWYtPnJlLCAmdGFiLT5yZSwgZmZ0X3NpemUgKiAyLCAwLjUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZmdF9zaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YWIyW2ldICAgID0gdGFiMVtpXS5yZTsKKyAgICAgICAgICAgICAgICB0YWIxW2ldLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJkZnRfY2FsYyhyLCB0YWIyKTsKKyAgICAgICAgICAgIGZmdF9yZWYodGFiX3JlZiwgdGFiMSwgZmZ0X25iaXRzKTsKKyAgICAgICAgICAgIHRhYl9yZWZbMF0uaW0gPSB0YWJfcmVmW2ZmdF9zaXplXzJdLnJlOworICAgICAgICAgICAgZXJyID0gY2hlY2tfZGlmZigmdGFiX3JlZi0+cmUsIHRhYjIsIGZmdF9zaXplLCAxLjApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyNlbmRpZiAvKiBDT05GSUdfUkRGVCAqLworI2lmIENPTkZJR19EQ1QKKyAgICBjYXNlIFRSQU5TRk9STV9EQ1Q6CisgICAgICAgIG1lbWNweSh0YWIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVENvbXBsZXgpKTsKKyAgICAgICAgZGN0X2NhbGMoZCwgJnRhYi0+cmUpOworICAgICAgICBpZiAoZG9faW52ZXJzZSkKKyAgICAgICAgICAgIGlkY3RfcmVmKCZ0YWJfcmVmLT5yZSwgJnRhYjEtPnJlLCBmZnRfbmJpdHMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkY3RfcmVmKCZ0YWJfcmVmLT5yZSwgJnRhYjEtPnJlLCBmZnRfbmJpdHMpOworICAgICAgICBlcnIgPSBjaGVja19kaWZmKCZ0YWJfcmVmLT5yZSwgJnRhYi0+cmUsIGZmdF9zaXplLCAxLjApOworICAgICAgICBicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfRENUICovCisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisgICAgfQorCisgICAgLyogZG8gYSBzcGVlZCB0ZXN0ICovCisKKyAgICBpZiAoZG9fc3BlZWQpIHsKKyAgICAgICAgaW50NjRfdCB0aW1lX3N0YXJ0LCBkdXJhdGlvbjsKKyAgICAgICAgaW50IG5iX2l0czsKKworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJTcGVlZCB0ZXN0Li4uXG4iKTsKKyAgICAgICAgLyogd2UgbWVhc3VyZSBkdXJpbmcgYWJvdXQgMSBzZWNvbmRzICovCisgICAgICAgIG5iX2l0cyA9IDE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHRpbWVfc3RhcnQgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBuYl9pdHM7IGl0KyspIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRyYW5zZm9ybSkgeworICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNGT1JNX01EQ1Q6CisgICAgICAgICAgICAgICAgICAgIGlmIChkb19pbnZlcnNlKQorICAgICAgICAgICAgICAgICAgICAgICAgaW1kY3RfY2FsYyhtLCAmdGFiLT5yZSwgJnRhYjEtPnJlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbWRjdF9jYWxjKG0sICZ0YWItPnJlLCAmdGFiMS0+cmUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFRSQU5TRk9STV9GRlQ6CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSh0YWIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVENvbXBsZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmZ0X2NhbGMocywgdGFiKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjaWYgRkZUX0ZMT0FUCisgICAgICAgICAgICAgICAgY2FzZSBUUkFOU0ZPUk1fUkRGVDoKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRhYjIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVFNhbXBsZSkpOworICAgICAgICAgICAgICAgICAgICByZGZ0X2NhbGMociwgdGFiMik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgVFJBTlNGT1JNX0RDVDoKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRhYjIsIHRhYjEsIGZmdF9zaXplICogc2l6ZW9mKEZGVFNhbXBsZSkpOworICAgICAgICAgICAgICAgICAgICBkY3RfY2FsYyhkLCB0YWIyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogRkZUX0ZMT0FUICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVyYXRpb24gPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSB0aW1lX3N0YXJ0OworICAgICAgICAgICAgaWYgKGR1cmF0aW9uID49IDEwMDAwMDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBuYl9pdHMgKj0gMjsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAidGltZTogJTAuMWYgdXMvdHJhbnNmb3JtIFt0b3RhbCB0aW1lPSUwLjJmIHMgaXRzPSVkXVxuIiwKKyAgICAgICAgICAgICAgIChkb3VibGUpIGR1cmF0aW9uIC8gbmJfaXRzLAorICAgICAgICAgICAgICAgKGRvdWJsZSkgZHVyYXRpb24gLyAxMDAwMDAwLjAsCisgICAgICAgICAgICAgICBuYl9pdHMpOworICAgIH0KKworICAgIHN3aXRjaCAodHJhbnNmb3JtKSB7CisjaWYgQ09ORklHX01EQ1QKKyAgICBjYXNlIFRSQU5TRk9STV9NRENUOgorICAgICAgICBtZGN0X2VuZChtKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYgLyogQ09ORklHX01EQ1QgKi8KKyAgICBjYXNlIFRSQU5TRk9STV9GRlQ6CisgICAgICAgIGZmdF9lbmQocyk7CisgICAgICAgIGJyZWFrOworI2lmIEZGVF9GTE9BVAorIyAgICBpZiBDT05GSUdfUkRGVAorICAgIGNhc2UgVFJBTlNGT1JNX1JERlQ6CisgICAgICAgIHJkZnRfZW5kKHIpOworICAgICAgICBicmVhazsKKyMgICAgZW5kaWYgLyogQ09ORklHX1JERlQgKi8KKyMgICAgaWYgQ09ORklHX0RDVAorICAgIGNhc2UgVFJBTlNGT1JNX0RDVDoKKyAgICAgICAgZGN0X2VuZChkKTsKKyAgICAgICAgYnJlYWs7CisjICAgIGVuZGlmIC8qIENPTkZJR19EQ1QgKi8KKyNlbmRpZiAvKiBGRlRfRkxPQVQgKi8KKyAgICB9CisKK2NsZWFudXA6CisgICAgYXZfZnJlZSh0YWIpOworICAgIGF2X2ZyZWUodGFiMSk7CisgICAgYXZfZnJlZSh0YWIyKTsKKyAgICBhdl9mcmVlKHRhYl9yZWYpOworICAgIGF2X2ZyZWUoZXhwdGFiKTsKKworI2lmICFBVkZGVAorICAgIGF2X2ZyZWUocyk7CisgICAgYXZfZnJlZShtKTsKKyNlbmRpZgorCisjaWYgIUFWRkZUICYmIEZGVF9GTE9BVAorICAgIGF2X2ZyZWUocik7CisgICAgYXZfZnJlZShkKTsKKyNlbmRpZgorCisgICAgaWYgKGVycikKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogJWQuXG4iLCBlcnIpOworCisgICAgcmV0dXJuICEhZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9nb2xvbWIuYyBiL2xpYmF2Y29kZWMvdGVzdHMvZ29sb21iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODViOGE5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvZ29sb21iLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nb2xvbWIuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL3B1dF9iaXRzLmgiCisKKyNkZWZpbmUgQ09VTlQgODE5MQorI2RlZmluZSBTSVpFIChDT1VOVCAqIDQpCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGksIHJldCA9IDA7CisgICAgdWludDhfdCAqdGVtcDsKKyAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIEdldEJpdENvbnRleHQgZ2I7CisKKyAgICB0ZW1wID0gYXZfbWFsbG9jKFNJWkUpOworICAgIGlmICghdGVtcCkKKyAgICAgICAgcmV0dXJuIDI7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYiwgdGVtcCwgU0laRSk7CisgICAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspCisgICAgICAgIHNldF91ZV9nb2xvbWIoJnBiLCBpKTsKKyAgICBmbHVzaF9wdXRfYml0cygmcGIpOworCisgICAgaW5pdF9nZXRfYml0cygmZ2IsIHRlbXAsIDggKiBTSVpFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykgeworICAgICAgICBpbnQgaiwgcyA9IHNob3dfYml0cygmZ2IsIDI1KTsKKworICAgICAgICBqID0gZ2V0X3VlX2dvbG9tYigmZ2IpOworICAgICAgICBpZiAoaiAhPSBpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdldF91ZV9nb2xvbWI6IGV4cGVjdGVkICVkLCBnb3QgJWQuIGJpdHM6ICU3eFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgaiwgcyk7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICB9CisgICAgfQorCisjZGVmaW5lIEVYVEVORChpKSAoKGkpIDw8IDMgfCAoaSkgJiA3KQorICAgIGluaXRfcHV0X2JpdHMoJnBiLCB0ZW1wLCBTSVpFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09VTlQ7IGkrKykKKyAgICAgICAgc2V0X3VlX2dvbG9tYigmcGIsIEVYVEVORChpKSk7CisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCB0ZW1wLCA4ICogU0laRSk7CisgICAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspIHsKKyAgICAgICAgaW50IGosIHMgPSBzaG93X2JpdHNfbG9uZygmZ2IsIDMyKTsKKworICAgICAgICBqID0gZ2V0X3VlX2dvbG9tYl9sb25nKCZnYik7CisgICAgICAgIGlmIChqICE9IEVYVEVORChpKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRfdWVfZ29sb21iX2xvbmc6IGV4cGVjdGVkICVkLCBnb3QgJWQuICIKKyAgICAgICAgICAgICAgICAgICAgImJpdHM6ICU4eFxuIiwgRVhURU5EKGkpLCBqLCBzKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyNkZWZpbmUgRVhURU5EX0woaSkgKChpKSA8PCA0IHwgKGkpICYgMTUpCisgICAgaW5pdF9wdXRfYml0cygmcGIsIHRlbXAsIFNJWkUpOworICAgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKQorICAgICAgICBzZXRfdWVfZ29sb21iX2xvbmcoJnBiLCBFWFRFTkRfTChpKSk7CisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCB0ZW1wLCA4ICogU0laRSk7CisgICAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspIHsKKyAgICAgICAgaW50IGosIHMgPSBzaG93X2JpdHNfbG9uZygmZ2IsIDMyKTsKKworICAgICAgICBqID0gZ2V0X3VlX2dvbG9tYl9sb25nKCZnYik7CisgICAgICAgIGlmIChqICE9IEVYVEVORF9MKGkpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImdldF91ZV9nb2xvbWJfbG9uZzogZXhwZWN0ZWQgJWQsIGdvdCAlZC4gIgorICAgICAgICAgICAgICAgICAgICAiYml0czogJTh4XG4iLCBFWFRFTkRfTChpKSwgaiwgcyk7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaW5pdF9wdXRfYml0cygmcGIsIHRlbXAsIFNJWkUpOworICAgIGZvciAoaSA9IDA7IGkgPCBDT1VOVDsgaSsrKQorICAgICAgICBzZXRfc2VfZ29sb21iKCZwYiwgaSAtIENPVU5UIC8gMik7CisgICAgZmx1c2hfcHV0X2JpdHMoJnBiKTsKKworICAgIGluaXRfZ2V0X2JpdHMoJmdiLCB0ZW1wLCA4ICogU0laRSk7CisgICAgZm9yIChpID0gMDsgaSA8IENPVU5UOyBpKyspIHsKKyAgICAgICAgaW50IGosIHMgPSBzaG93X2JpdHMoJmdiLCAyNSk7CisKKyAgICAgICAgaiA9IGdldF9zZV9nb2xvbWIoJmdiKTsKKyAgICAgICAgaWYgKGogIT0gaSAtIENPVU5UIC8gMikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRfc2VfZ29sb21iOiBleHBlY3RlZCAlZCwgZ290ICVkLiBiaXRzOiAlN3hcbiIsCisgICAgICAgICAgICAgICAgICAgIGkgLSBDT1VOVCAvIDIsIGosIHMpOworICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyZWUodGVtcCk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9odG1sc3VidGl0bGVzLmMgYi9saWJhdmNvZGVjL3Rlc3RzL2h0bWxzdWJ0aXRsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzg5ZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy9odG1sc3VidGl0bGVzLmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaHRtbHN1YnRpdGxlcy5jIgorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRlc3RfY2FzZXNbXSA9IHsKKyAgICAvKiBsYXRpbiBndWlsbGVtZXRzIGFuZCBvdGhlciA8ID4gZ2FyYmFnZSAqLworICAgICI8PGhlbGxvPj4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBndWlsbGVtZXRzCisgICAgIjw8PGI+aGVsbG88L2I+Pj4iLCAgICAgICAgICAgICAgICAgICAgIC8vIGd1aWxsZW1ldHMgKyB0YWdzCisgICAgIjwgaGVsbG8gPCAyMDAwID4gd29ybGQgPiIsICAgICAgICAgICAgIC8vIHVubGlrZWx5IHRhZ3MgZHVlIHRvIHNwYWNlcworICAgICI8aDE+VElUTEU8L2gxPiIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlbHkgdW5oYW5kbGVkIHRhZ3MKKyAgICAiPCBmb250IGNvbG9yPXJlZCA+cmVkPC9mb250PiIsICAgICAgICAgLy8gaW52YWxpZCBmb3JtYXQgb2YgdmFsaWQgdGFnCisgICAgIkZvbyA8Zm9vQGJhci5jb20+IiwgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBhIHRhZyAobm90IGFsbnVtKQorCisgICAgIjxiPiBmb28gPEk+IGJhciA8L0I+IGJsYSA8L2k+IiwgICAgICAgIC8vIGJyb2tlbiBuZXN0aW5nCisKKyAgICAiQTxicj5CPEJSLz5DPGJyICAvID5EPCAgQnIgPkU8YnJrPjxicmsvPiIsIC8vIG1pc2MgbGluZSBicmVha3MKK307CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgQVZCUHJpbnQgZHN0OworCisgICAgYXZfYnByaW50X2luaXQoJmRzdCwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModGVzdF9jYXNlcyk7IGkrKykgeworICAgICAgICBpbnQgcmV0ID0gZmZfaHRtbG1hcmt1cF90b19hc3MoTlVMTCwgJmRzdCwgdGVzdF9jYXNlc1tpXSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcHJpbnRmKCIlcyAtLT4gJXNcbiIsIHRlc3RfY2FzZXNbaV0sIGRzdC5zdHIpOworICAgICAgICBhdl9icHJpbnRfY2xlYXIoJmRzdCk7CisgICAgfQorICAgIGF2X2JwcmludF9maW5hbGl6ZSgmZHN0LCBOVUxMKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGVzdHMvaWlyZmlsdGVyLmMgYi9saWJhdmNvZGVjL3Rlc3RzL2lpcmZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2M2ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Rlc3RzL2lpcmZpbHRlci5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaWlyZmlsdGVyLmgiCisKKyNkZWZpbmUgRklMVF9PUkRFUiA0CisjZGVmaW5lIFNJWkUgMTAyNAorCitpbnQgbWFpbih2b2lkKQoreworICAgIHN0cnVjdCBGRklJUkZpbHRlckNvZWZmcyAqZmNvZWZmcyA9IE5VTEw7CisgICAgc3RydWN0IEZGSUlSRmlsdGVyU3RhdGUgICpmc3RhdGUgID0gTlVMTDsKKyAgICBmbG9hdCBjdXRvZmZfY29lZmYgPSAwLjQ7CisgICAgaW50MTZfdCB4W1NJWkVdLCB5W1NJWkVdOworICAgIGludCBpOworCisgICAgZmNvZWZmcyA9IGZmX2lpcl9maWx0ZXJfaW5pdF9jb2VmZnMoTlVMTCwgRkZfRklMVEVSX1RZUEVfQlVUVEVSV09SVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfRklMVEVSX01PREVfTE9XUEFTUywgRklMVF9PUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXRvZmZfY29lZmYsIDAuMCwgMC4wKTsKKyAgICBmc3RhdGUgID0gZmZfaWlyX2ZpbHRlcl9pbml0X3N0YXRlKEZJTFRfT1JERVIpOworCisgICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKKyAgICAgICAgeFtpXSA9IGxyaW50KDAuNzUgKiBJTlQxNl9NQVggKiBzaW4oMC41ICogTV9QSSAqIGkgKiBpIC8gU0laRSkpOworCisgICAgZmZfaWlyX2ZpbHRlcihmY29lZmZzLCBmc3RhdGUsIFNJWkUsIHgsIDEsIHksIDEpOworCisgICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKKyAgICAgICAgcHJpbnRmKCIlNmQgJTZkXG4iLCB4W2ldLCB5W2ldKTsKKworICAgIGZmX2lpcl9maWx0ZXJfZnJlZV9jb2VmZnNwKCZmY29lZmZzKTsKKyAgICBmZl9paXJfZmlsdGVyX2ZyZWVfc3RhdGVwKCZmc3RhdGUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9pbWdjb252ZXJ0LmMgYi9saWJhdmNvZGVjL3Rlc3RzL2ltZ2NvbnZlcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTk4ZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy9pbWdjb252ZXJ0LmMKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIE1pc2MgaW1hZ2UgY29udmVyc2lvbiByb3V0aW5lcworICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbWdjb252ZXJ0LmMiCisKKyNpZiBGRl9BUElfQVZQSUNUVVJFCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCitpbnQgbWFpbih2b2lkKXsKKyAgICBpbnQgaTsKKyAgICBpbnQgZXJyPTA7CisgICAgaW50IHNraXAgPSAwOworCisgICAgZm9yIChpPTA7IGk8QVZfUElYX0ZNVF9OQioyOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsKKyAgICAgICAgaWYoIWRlc2MgfHwgIWRlc2MtPm5hbWUpIHsKKyAgICAgICAgICAgIHNraXAgKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJTNkIHVudXNlZCBwaXhlbCBmb3JtYXQgdmFsdWVzXG4iLCBza2lwKTsKKyAgICAgICAgICAgIHNraXAgPSAwOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInBpeCBmbXQgJXMgeXV2X3BsYW46JWQgYXZnX2JwcDolZFxuIiwgZGVzYy0+bmFtZSwgaXNfeXV2X3BsYW5hcihkZXNjKSwgYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChkZXNjKSk7CisgICAgICAgIGlmICgoIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkpICE9IChkZXNjLT5uYl9jb21wb25lbnRzICE9IDIgJiYgZGVzYy0+bmJfY29tcG9uZW50cyAhPSA0KSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkFscGhhIGZsYWcgbWlzbWF0Y2hcbiIpOworICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYgLyogRkZfQVBJX0FWUElDVFVSRSAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9qcGVnMjAwMGR3dC5jIGIvbGliYXZjb2RlYy90ZXN0cy9qcGVnMjAwMGR3dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYjMzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Rlc3RzL2pwZWcyMDAwZHd0LmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBEaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybQorICogQ29weXJpZ2h0IChjKSAyMDA3IEthbWlsIE5vd29zYWQKKyAqIENvcHlyaWdodCAoYykgMjAxMyBOaWNvbGFzIEJlcnRyYW5kIDxuaWNvaW5hdHRlbmR1QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvanBlZzIwMDBkd3QuYyIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKworI2RlZmluZSBNQVhfVyAyNTYKKworc3RhdGljIGludCB0ZXN0X2R3dChpbnQgKmFycmF5LCBpbnQgKnJlZiwgaW50IGJvcmRlclsyXVsyXSwgaW50IGRlY29tcF9sZXZlbHMsIGludCB0eXBlLCBpbnQgbWF4X2RpZmYpIHsKKyAgICBpbnQgcmV0LCBqOworICAgIERXVENvbnRleHQgczE9e3t7MH19fSwgKnM9ICZzMTsKKyAgICBpbnQ2NF90IGVycjIgPSAwOworCisgICAgcmV0ID0gZmZfanBlZzIwMDBfZHd0X2luaXQocywgIGJvcmRlciwgZGVjb21wX2xldmVscywgdHlwZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZl9qcGVnMjAwMF9kd3RfaW5pdCBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0ID0gZmZfZHd0X2VuY29kZShzLCBhcnJheSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZl9kd3RfZW5jb2RlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICByZXQgPSBmZl9kd3RfZGVjb2RlKHMsIGFycmF5KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZmX2R3dF9lbmNvZGUgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciAoaiA9IDA7IGo8TUFYX1cgKiBNQVhfVzsgaisrKSB7CisgICAgICAgIGlmIChGRkFCUyhhcnJheVtqXSAtIHJlZltqXSkgPiBtYXhfZGlmZikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtaXNzbWF0Y2ggYXQgJWQgKCVkICE9ICVkKSBkZWNvbXA6JWQgYm9yZGVyICVkICVkICVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBqLCBhcnJheVtqXSwgcmVmW2pdLGRlY29tcF9sZXZlbHMsIGJvcmRlclswXVswXSwgYm9yZGVyWzBdWzFdLCBib3JkZXJbMV1bMF0sIGJvcmRlclsxXVsxXSk7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICBlcnIyICs9IChhcnJheVtqXSAtIHJlZltqXSkgKiAoYXJyYXlbal0gLSByZWZbal0pOworICAgICAgICBhcnJheVtqXSA9IHJlZltqXTsKKyAgICB9CisgICAgZmZfZHd0X2Rlc3Ryb3kocyk7CisKKyAgICBwcmludGYoIiVzLCBkZWNvbXA6JTJkIGJvcmRlciAlM2QgJTNkICUzZCAlM2QgbWlsbGktZXJyMjolOSJQUklkNjQiXG4iLAorICAgICAgICAgICB0eXBlID09IEZGX0RXVDUzID8gIjUvM2kiIDogIjkvN2kiLAorICAgICAgICAgICBkZWNvbXBfbGV2ZWxzLCBib3JkZXJbMF1bMF0sIGJvcmRlclswXVsxXSwgYm9yZGVyWzFdWzBdLCBib3JkZXJbMV1bMV0sCisgICAgICAgICAgIDEwMDAqZXJyMiAvICgoYm9yZGVyWzBdWzFdIC0gYm9yZGVyWzBdWzBdKSooYm9yZGVyWzFdWzFdIC0gYm9yZGVyWzFdWzBdKSkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9kd3RmKGZsb2F0ICphcnJheSwgZmxvYXQgKnJlZiwgaW50IGJvcmRlclsyXVsyXSwgaW50IGRlY29tcF9sZXZlbHMsIGZsb2F0IG1heF9kaWZmKSB7CisgICAgaW50IHJldCwgajsKKyAgICBEV1RDb250ZXh0IHMxPXt7ezB9fX0sICpzPSAmczE7CisgICAgZG91YmxlIGVycjIgPSAwOworCisgICAgcmV0ID0gZmZfanBlZzIwMDBfZHd0X2luaXQocywgIGJvcmRlciwgZGVjb21wX2xldmVscywgRkZfRFdUOTcpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmZfanBlZzIwMDBfZHd0X2luaXQgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldCA9IGZmX2R3dF9lbmNvZGUocywgYXJyYXkpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmZfZHd0X2VuY29kZSBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0ID0gZmZfZHd0X2RlY29kZShzLCBhcnJheSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZl9kd3RfZW5jb2RlIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKGogPSAwOyBqPE1BWF9XICogTUFYX1c7IGorKykgeworICAgICAgICBpZiAoRkZBQlMoYXJyYXlbal0gLSByZWZbal0pID4gbWF4X2RpZmYpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWlzc21hdGNoIGF0ICVkICglZiAhPSAlZikgZGVjb21wOiVkIGJvcmRlciAlZCAlZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaiwgYXJyYXlbal0sIHJlZltqXSxkZWNvbXBfbGV2ZWxzLCBib3JkZXJbMF1bMF0sIGJvcmRlclswXVsxXSwgYm9yZGVyWzFdWzBdLCBib3JkZXJbMV1bMV0pOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKyAgICAgICAgZXJyMiArPSAoYXJyYXlbal0gLSByZWZbal0pICogKGFycmF5W2pdIC0gcmVmW2pdKTsKKyAgICAgICAgYXJyYXlbal0gPSByZWZbal07CisgICAgfQorICAgIGZmX2R3dF9kZXN0cm95KHMpOworCisgICAgcHJpbnRmKCI5LzdmLCBkZWNvbXA6JTJkIGJvcmRlciAlM2QgJTNkICUzZCAlM2QgZXJyMjolMjAuM2ZcbiIsCisgICAgICAgICAgIGRlY29tcF9sZXZlbHMsIGJvcmRlclswXVswXSwgYm9yZGVyWzBdWzFdLCBib3JkZXJbMV1bMF0sIGJvcmRlclsxXVsxXSwKKyAgICAgICAgICAgZXJyMiAvICgoYm9yZGVyWzBdWzFdIC0gYm9yZGVyWzBdWzBdKSooYm9yZGVyWzFdWzFdIC0gYm9yZGVyWzFdWzBdKSkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXJyYXlbTUFYX1cgKiBNQVhfV107CitzdGF0aWMgaW50IHJlZiAgW01BWF9XICogTUFYX1ddOworc3RhdGljIGZsb2F0IGFycmF5ZltNQVhfVyAqIE1BWF9XXTsKK3N0YXRpYyBmbG9hdCByZWZmICBbTUFYX1cgKiBNQVhfV107CisKK2ludCBtYWluKHZvaWQpIHsKKyAgICBBVkxGRyBwcm5nOworICAgIGludCBpLGo7CisgICAgaW50IGJvcmRlclsyXVsyXTsKKyAgICBpbnQgcmV0LCBkZWNvbXBfbGV2ZWxzOworCisgICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOworCisgICAgZm9yIChpID0gMDsgaTxNQVhfVyAqIE1BWF9XOyBpKyspCisgICAgICAgIGFycmF5ZltpXSA9IHJlZmZbaV0gPSBhcnJheVtpXSA9IHJlZltpXSA9ICBhdl9sZmdfZ2V0KCZwcm5nKSAlIDIwNDg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgZm9yIChqPTA7IGo8NDsgaisrKQorICAgICAgICAgICAgYm9yZGVyW2o+PjFdW2omMV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIE1BWF9XOworICAgICAgICBpZiAoYm9yZGVyWzBdWzBdID49IGJvcmRlclswXVsxXSB8fCBib3JkZXJbMV1bMF0gPj0gYm9yZGVyWzFdWzFdKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlY29tcF9sZXZlbHMgPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIEZGX0RXVF9NQVhfREVDTFZMUzsKKworICAgICAgICByZXQgPSB0ZXN0X2R3dChhcnJheSwgcmVmLCBib3JkZXIsIGRlY29tcF9sZXZlbHMsIEZGX0RXVDUzLCAwKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IHRlc3RfZHd0KGFycmF5LCByZWYsIGJvcmRlciwgZGVjb21wX2xldmVscywgRkZfRFdUOTdfSU5ULCBGRk1JTig3KzUqZGVjb21wX2xldmVscywgMTUrMypkZWNvbXBfbGV2ZWxzKSk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSB0ZXN0X2R3dGYoYXJyYXlmLCByZWZmLCBib3JkZXIsIGRlY29tcF9sZXZlbHMsIDAuMDUpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGVzdHMvbWF0aG9wcy5jIGIvbGliYXZjb2RlYy90ZXN0cy9tYXRob3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhMDU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvbWF0aG9wcy5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgdW5zaWduZWQgdTsKKworICAgIGZvcih1PTA7IHU8NjU1MzY7IHUrKykgeworICAgICAgICB1bnNpZ25lZCBzID0gdSp1OworICAgICAgICB1bnNpZ25lZCByb290ID0gZmZfc3FydChzKTsKKyAgICAgICAgdW5zaWduZWQgcm9vdF9tMSA9IGZmX3NxcnQocy0xKTsKKyAgICAgICAgaWYgKHMgJiYgcm9vdCAhPSB1KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZmX3NxcnQgZmFpbGVkIGF0ICV1IHdpdGggJXVcbiIsIHMsIHJvb3QpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHUgJiYgcm9vdF9tMSAhPSB1IC0gMSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZl9zcXJ0IGZhaWxlZCBhdCAldSB3aXRoICV1XG4iLCBzLCByb290KTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9tanBlZ2VuY19odWZmbWFuLmMgYi9saWJhdmNvZGVjL3Rlc3RzL21qcGVnZW5jX2h1ZmZtYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQ5MmQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy9tanBlZ2VuY19odWZmbWFuLmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgV2lsbGlhbSBNYSwgU29maWEgS2ltLCBEdXN0aW4gV29vCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIE9wdGltYWwgSHVmZm1hbiBFbmNvZGluZyB0ZXN0cy4KKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAibGliYXZjb2RlYy9tanBlZ2VuYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWpwZWdlbmNfaHVmZm1hbi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWpwZWdlbmNfY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW8uaCIKKworLy8gVmFsaWRhdGUgdGhlIGNvbXB1dGVkIGxlbmd0aHMgc2F0aXNmeSB0aGUgSlBFRyByZXN0cmljdGlvbnMgYW5kIGlzIG9wdGltYWwuCitzdGF0aWMgaW50IGNoZWNrX2xlbmd0aHMoaW50IEwsIGludCBleHBlY3RlZF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ICpwcm9icywgaW50IG5wcm9icykKK3sKKyAgICBIdWZmVGFibGUgbGVuZ3Roc1syNTZdOworICAgIFBUYWJsZSB2YWxfY291bnRzWzI1Nl07CisgICAgaW50IGFjdHVhbF9sZW5ndGggPSAwLCBpLCBqLCBrLCBwcm9iLCBsZW5ndGg7CisgICAgaW50IHJldCA9IDA7CisgICAgZG91YmxlIGNhbnRvcl9tZWFzdXJlID0gMDsKKyAgICBhdl9hc3NlcnQwKG5wcm9icyA8PSAyNTYpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5wcm9iczsgaSsrKSB7CisgICAgICAgIHZhbF9jb3VudHNbaV0gPSAoUFRhYmxlKXsudmFsdWUgPSBpLCAucHJvYiA9IHByb2JzW2ldfTsKKyAgICB9CisKKyAgICBmZl9tanBlZ2VuY19odWZmbWFuX2NvbXB1dGVfYml0cyh2YWxfY291bnRzLCBsZW5ndGhzLCBucHJvYnMsIEwpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5wcm9iczsgaSsrKSB7CisgICAgICAgIC8vIEZpbmQgdGhlIHZhbHVlJ3MgcHJvYiBhbmQgbGVuZ3RoCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBucHJvYnM7IGorKykKKyAgICAgICAgICAgIGlmICh2YWxfY291bnRzW2pdLnZhbHVlID09IGkpIGJyZWFrOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnByb2JzOyBrKyspCisgICAgICAgICAgICBpZiAobGVuZ3Roc1trXS5jb2RlID09IGkpIGJyZWFrOworICAgICAgICBpZiAoIShqIDwgbnByb2JzICYmIGsgPCBucHJvYnMpKSByZXR1cm4gMTsKKyAgICAgICAgcHJvYiA9IHZhbF9jb3VudHNbal0ucHJvYjsKKyAgICAgICAgbGVuZ3RoID0gbGVuZ3Roc1trXS5sZW5ndGg7CisKKyAgICAgICAgaWYgKHByb2IpIHsKKyAgICAgICAgICAgIGFjdHVhbF9sZW5ndGggKz0gcHJvYiAqIGxlbmd0aDsKKyAgICAgICAgICAgIGNhbnRvcl9tZWFzdXJlICs9IDEuIC8gKDEgPDwgbGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW5ndGggPiBMIHx8IGxlbmd0aCA8IDEpIHJldHVybiAxOworICAgIH0KKyAgICAvLyBDaGVjayB0aGF0IHRoZSBjb2RlcyBjYW4gYmUgcHJlZml4LWZyZWUuCisgICAgaWYgKGNhbnRvcl9tZWFzdXJlID4gMSkgcmV0ID0gMTsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB0b3RhbCBsZW5ndGggaXMgb3B0aW1hbAorICAgIGlmIChhY3R1YWxfbGVuZ3RoICE9IGV4cGVjdGVkX2xlbmd0aCkgcmV0ID0gMTsKKworICAgIGlmIChyZXQgPT0gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICJDYW50b3IgbWVhc3VyZTogJWZcbiIKKyAgICAgICAgICAgICAgIkFjdHVhbCBsZW5ndGg6ICVkXG4iCisgICAgICAgICAgICAgICJFeHBlY3RlZCBsZW5ndGg6ICVkXG4iLAorICAgICAgICAgICAgICBjYW50b3JfbWVhc3VyZSwgYWN0dWFsX2xlbmd0aCwgZXhwZWN0ZWRfbGVuZ3RoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgaW50IHByb2JzX3plcm9lc1tdID0geworICAgIDYsIDYsIDAsIDAsIDAKK307CisKK3N0YXRpYyBjb25zdCBpbnQgcHJvYnNfc2tld2VkW10gPSB7CisgICAgMiwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMjAsIDAsIDIsIDAsIDEwLCA1LCAxLCAxLCA5LCAxLCAxLCA2LCAwLCA1LCAwLCAxLCAwLCA3LCA2LAorICAgIDEsIDEsIDUsIDAsIDAsIDAsIDAsIDExLCAwLCAwLCAwLCA1MSwgMSwgMCwgMjAsIDAsIDEsIDAsIDAsIDAsIDAsIDYsIDEwNiwgMSwgMCwgMSwKKyAgICAwLCAyLCAxLCAxNiwgMCwgMCwgNSwgMCwgMCwgMCwgNCwgMywgMTUsIDQsIDQsIDAsIDAsIDAsIDMsIDAsIDAsIDEsIDAsIDMsIDAsIDMsIDIsCisgICAgMiwgMCwgMCwgNCwgMywgNDAsIDEsIDIsIDAsIDIyLCAwLCAwLCAwLCA5LCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAxLCA2LCAxMSwgNCwgMTAsCisgICAgMjgsIDYsIDEsIDAsIDAsIDksIDksIDQsIDAsIDAsIDAsIDAsIDgsIDMzODQ0LCAyLCAwLCAyLCAxLCAxLCA1LCAwLCAwLCAxLCA5LCAxLCAwLAorICAgIDQsIDE0LCA0LCAwLCAwLCAzLCA4LCAwLCA1MSwgOSwgNiwgMSwgMSwgMiwgMiwgMywgMSwgNSwgNSwgMjksIDAsIDAsIDAsIDAsIDE0LCAyOSwKKyAgICA2LCA0LCAxMywgMTIsIDIsIDMsIDEsIDAsIDUsIDQsIDEsIDEsIDAsIDAsIDI5LCAxLCAwLCAwLCAwLCAwLCA0LCAwLCAwLCAxLCAwLCAxLAorICAgIDcsIDAsIDQyLCAwLCAwLCAwLCAwLCAwLCAyLCAwLCAzLCA5LCAwLCAwLCAwLCAyLCAxLCAwLCAwLCA2LCA1LCA2LCAxLCAyLCAzLCAwLCAwLAorICAgIDAsIDMsIDAsIDAsIDI4LCAwLCAyLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAyMywgMCwgMCwgMCwgMCwKKyAgICAwLCAyMSwgMSwgMCwgMywgMjQsIDIsIDAsIDAsIDcsIDAsIDAsIDEsIDUsIDEsIDIsIDAsIDUKK307CisKK3N0YXRpYyBjb25zdCBpbnQgcHJvYnNfc2F0W10gPSB7CisgICAgNzQsIDgsIDE0LCA3LCA5MzQ1LCA0MCwgMCwgMjAxNCwgMiwgMSwgMTE1LCAwLCAyLCAxLCAxOTQsIDM4OCwgMjAsIDAsIDAsIDIsIDEsIDEyMSwKKyAgICAxLCAxNTgzLCAwLCAxNiwgMjEsIDIsIDEzMiwgMiwgMTUsIDksIDEzLCAxLCAwLCAyMjkzLCAyLCA4LCA1LCAyLCAzMCwgMCwgMCwgNCwgNTQsCisgICAgNzgzLCA0LCAxLCAyLCA0LCAwLCAyMiwgOTMsIDEsIDE0MywgMTksIDAsIDM2LCAzMiwgNCwgNiwgMzMsIDMsIDQ1LCAwLCA4LCAxLCAwLCAxOCwKKyAgICAxNywgMSwgMCwgMSwgMCwgMCwgMSwgMTAwNCwgMzgsIDMsIDgsIDkwLCAyMywgMCwgMjgxOSwgMywgMCwgOTcwLCAxNTgsIDksIDYsIDQsIDQ4LAorICAgIDQsIDAsIDEsIDAsIDAsIDYwLCAzLCA2MiwgMCwgMiwgMiwgMiwgMjc5LCA2NiwgMTYsIDEsIDIwLCAwLCA3LCA5LCAzMiwgMTQxMSwgNiwgMywKKyAgICAyNywgMSwgNSwgNDksIDAsIDAsIDAsIDAsIDAsIDIsIDEwLCAxLCAxLCAyLCAzLCA4MDEsIDMsIDI1LCA1LCAxLCAxLCAwLCA2MzIsIDAsIDE0LAorICAgIDE4LCA1LCA4LCAyMDAsIDQsIDQsIDIyLCAxMiwgMCwgNCwgMSwgMCwgMiwgNCwgOSwgMywgMTYsIDcsIDIsIDIsIDIxMywgMCwgMiwgNjIwLAorICAgIDM5MzAzLCAwLCAxLCAwLCAyLCAxLCAxODM3ODEsIDEsIDAsIDAsIDAsIDk0LCA3LCAzLCA0LCAwLCA0LCAzMDYsIDQzLCAzNTIsIDc2LCAzNCwKKyAgICAxMywgMTEsIDAsIDUxLCAxLCAxMywgMTksIDAsIDI2LCAwLCA3Mjc2LCA0LCAyMDcsIDMxLCAxLCAyLCA0LCA2LCAxOSwgOCwgMTcsIDQsIDYsCisgICAgMCwgMTA4NSwgMCwgMCwgMCwgMywgNDg5LCAzNiwgMSwgMCwgMSwgOTQyMCwgMjk0LCAyOCwgMCwgNTcsIDUsIDAsIDksIDIsIDAsIDEsIDIsCisgICAgMiwgMCwgMCwgOSwgMiwgMjksIDIsIDIsIDcsIDAsIDUsIDQ5MCwgMCwgNywgNSwgMCwgMSwgOCwgMCwgMCwgMjMyNTUsIDAsIDEKK307CisKKy8vIFRlc3QgdGhlIGV4YW1wbGUgZ2l2ZW4gb24gQHNlZQorLy8gaHR0cDovL2d1cnUubXVsdGltZWRpYS5jeC9zbWFsbC10YXNrcy1mb3ItZmZtcGVnLworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBpLCByZXQgPSAwOworICAgIC8vIFByb2JhYmlsaXRpZXMgb2Ygc3ltYm9scyAwLi40CisgICAgUFRhYmxlIHZhbF9jb3VudHNbXSA9IHsKKyAgICAgICAgey52YWx1ZSA9IDAsIC5wcm9iID0gMX0sCisgICAgICAgIHsudmFsdWUgPSAxLCAucHJvYiA9IDJ9LAorICAgICAgICB7LnZhbHVlID0gMiwgLnByb2IgPSA1fSwKKyAgICAgICAgey52YWx1ZSA9IDMsIC5wcm9iID0gMTB9LAorICAgICAgICB7LnZhbHVlID0gNCwgLnByb2IgPSAyMX0sCisgICAgfTsKKyAgICAvLyBFeHBlY3RlZCBjb2RlIGxlbmd0aHMgZm9yIGVhY2ggc3ltYm9sCisgICAgc3RhdGljIGNvbnN0IEh1ZmZUYWJsZSBleHBlY3RlZFtdID0geworICAgICAgICB7LmNvZGUgPSAwLCAubGVuZ3RoID0gM30sCisgICAgICAgIHsuY29kZSA9IDEsIC5sZW5ndGggPSAzfSwKKyAgICAgICAgey5jb2RlID0gMiwgLmxlbmd0aCA9IDN9LAorICAgICAgICB7LmNvZGUgPSAzLCAubGVuZ3RoID0gM30sCisgICAgICAgIHsuY29kZSA9IDQsIC5sZW5ndGggPSAxfSwKKyAgICB9OworICAgIC8vIEFjdHVhbCBjb2RlIGxlbmd0aHMKKyAgICBIdWZmVGFibGUgZGlzdGluY3RzWzVdOworCisgICAgLy8gQnVpbGQgb3B0aW1hbCBodWZmbWFuIHRyZWUgdXNpbmcgYW4gaW50ZXJuYWwgZnVuY3Rpb24sIHRvIGFsbG93IGZvcgorICAgIC8vIHNtYWxsZXItdGhhbi1ub3JtYWwgdGVzdCBjYXNlcy4gVGhpcyBtdXRhdGVzIHZhbF9jb3VudHMgYnkgc29ydGluZy4KKyAgICBmZl9tanBlZ2VuY19odWZmbWFuX2NvbXB1dGVfYml0cyh2YWxfY291bnRzLCBkaXN0aW5jdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoZGlzdGluY3RzKSwgMyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZGlzdGluY3RzKTsgaSsrKSB7CisgICAgICAgIGlmIChkaXN0aW5jdHNbaV0uY29kZSAhPSBleHBlY3RlZFtpXS5jb2RlIHx8CisgICAgICAgICAgICBkaXN0aW5jdHNbaV0ubGVuZ3RoICE9IGV4cGVjdGVkW2ldLmxlbmd0aCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJCdWlsdCBodWZmbWFuIGRvZXMgbm90IGVxdWFsIGV4cGVjdGF0aW9ucy4gIgorICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6IGNvZGUgJWQgcHJvYmFiaWxpdHkgJWQsICIKKyAgICAgICAgICAgICAgICAgICAgIkFjdHVhbDogY29kZSAlZCBwcm9iYWJpbGl0eSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRbaV0uY29kZSwgZXhwZWN0ZWRbaV0ubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdHNbaV0uY29kZSwgZGlzdGluY3RzW2ldLmxlbmd0aCk7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgaGFuZGxpbmcgb2YgemVybyBwcm9iYWJpbGl0aWVzCisgICAgaWYgKGNoZWNrX2xlbmd0aHMoMTYsIDE4LCBwcm9ic196ZXJvZXMsIEZGX0FSUkFZX0VMRU1TKHByb2JzX3plcm9lcykpKQorICAgICAgICByZXQgPSAxOworICAgIC8vIENoZWNrIHNrZXdlZCBkaXN0cmlidXRpb24gb3ZlciAyNTYgd2l0aG91dCBzYXR1cmF0ZWQgbGVuZ3RocworICAgIGlmIChjaGVja19sZW5ndGhzKDE2LCA0MTI4MiwgcHJvYnNfc2tld2VkLCBGRl9BUlJBWV9FTEVNUyhwcm9ic19za2V3ZWQpKSkKKyAgICAgICAgcmV0ID0gMTsKKyAgICAvLyBDaGVjayBza2V3ZWQgZGlzdHJpYnV0aW9uIG92ZXIgMjU2IHdpdGggc2F0dXJhdGVkIGxlbmd0aHMKKyAgICBpZiAoY2hlY2tfbGVuZ3RocygxNiwgNjY5OTA0LCBwcm9ic19zYXQsIEZGX0FSUkFZX0VMRU1TKHByb2JzX3NhdCkpKQorICAgICAgICByZXQgPSAxOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGVzdHMvbW90aW9uLmMgYi9saWJhdmNvZGVjL3Rlc3RzL21vdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OWY5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Rlc3RzL21vdGlvbi5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIG1vdGlvbiB0ZXN0LgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tZV9jbXAuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisKKyN1bmRlZiBwcmludGYKKworI2RlZmluZSBXSURUSCA2NAorI2RlZmluZSBIRUlHSFQgNjQKKworc3RhdGljIHVpbnQ4X3QgaW1nMVtXSURUSCAqIEhFSUdIVF07CitzdGF0aWMgdWludDhfdCBpbWcyW1dJRFRIICogSEVJR0hUXTsKKworc3RhdGljIHZvaWQgZmlsbF9yYW5kb20odWludDhfdCAqdGFiLCBpbnQgc2l6ZSkKK3sKKyAgICBpbnQgaTsKKyAgICBBVkxGRyBwcm5nOworCisgICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOworICAgIGZvcihpPTA7aTxzaXplO2krKykgeworICAgICAgICB0YWJbaV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDI1NjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGhlbHAodm9pZCkKK3sKKyAgICBwcmludGYoIm1vdGlvbi10ZXN0IFstaF1cbiIKKyAgICAgICAgICAgInRlc3QgbW90aW9uIGltcGxlbWVudGF0aW9uc1xuIik7Cit9CisKKyNkZWZpbmUgTkJfSVRTIDUwMAorCitpbnQgZHVtbXk7CisKK3N0YXRpYyB2b2lkIHRlc3RfbW90aW9uKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgIG1lX2NtcF9mdW5jIHRlc3RfZnVuYywgbWVfY21wX2Z1bmMgcmVmX2Z1bmMpCit7CisgICAgaW50IHgsIHksIGQxLCBkMiwgaXQ7CisgICAgdWludDhfdCAqcHRyOworICAgIGludDY0X3QgdGk7CisgICAgcHJpbnRmKCJ0ZXN0aW5nICclcydcbiIsIG5hbWUpOworCisgICAgLyogdGVzdCBjb3JyZWN0bmVzcyAqLworICAgIGZvcihpdD0wO2l0PDIwO2l0KyspIHsKKworICAgICAgICBmaWxsX3JhbmRvbShpbWcxLCBXSURUSCAqIEhFSUdIVCk7CisgICAgICAgIGZpbGxfcmFuZG9tKGltZzIsIFdJRFRIICogSEVJR0hUKTsKKworICAgICAgICBmb3IoeT0wO3k8SEVJR0hULTE3O3krKykgeworICAgICAgICAgICAgZm9yKHg9MDt4PFdJRFRILTE3O3grKykgeworICAgICAgICAgICAgICAgIHB0ciA9IGltZzIgKyB5ICogV0lEVEggKyB4OworICAgICAgICAgICAgICAgIGQxID0gdGVzdF9mdW5jKE5VTEwsIGltZzEsIHB0ciwgV0lEVEgsIDgpOworICAgICAgICAgICAgICAgIGQyID0gcmVmX2Z1bmMoTlVMTCwgaW1nMSwgcHRyLCBXSURUSCwgOCk7CisgICAgICAgICAgICAgICAgaWYgKGQxICE9IGQyKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3I6IG1teD0lZCBjPSVkXG4iLCBkMSwgZDIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbW1zX2MoKTsKKworICAgIC8qIHNwZWVkIHRlc3QgKi8KKyAgICB0aSA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICBkMSA9IDA7CisgICAgZm9yKGl0PTA7aXQ8TkJfSVRTO2l0KyspIHsKKyAgICAgICAgZm9yKHk9MDt5PEhFSUdIVC0xNzt5KyspIHsKKyAgICAgICAgICAgIGZvcih4PTA7eDxXSURUSC0xNzt4KyspIHsKKyAgICAgICAgICAgICAgICBwdHIgPSBpbWcyICsgeSAqIFdJRFRIICsgeDsKKyAgICAgICAgICAgICAgICBkMSArPSB0ZXN0X2Z1bmMoTlVMTCwgaW1nMSwgcHRyLCBXSURUSCwgOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZW1tc19jKCk7CisgICAgZHVtbXkgPSBkMTsgLyogYXZvaWQgb3B0aW1pemF0aW9uICovCisgICAgdGkgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSB0aTsKKworICAgIHByaW50ZigiICAlMC4wZiBrb3Avc1xuIiwKKyAgICAgICAgICAgKGRvdWJsZSlOQl9JVFMgKiAoV0lEVEggLSAxNikgKiAoSEVJR0hUIC0gMTYpIC8KKyAgICAgICAgICAgKGRvdWJsZSkodGkgLyAxMDAwLjApKTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgQVZDb2RlY0NvbnRleHQgKmN0eDsKKyAgICBpbnQgYzsKKyAgICBNRUNtcENvbnRleHQgY2N0eCwgbW14Y3R4OworICAgIGludCBmbGFnc1syXSA9IHsgQVZfQ1BVX0ZMQUdfTU1YLCBBVl9DUFVfRkxBR19NTVhFWFQgfTsKKyAgICBpbnQgZmxhZ3Nfc2l6ZSA9IEhBVkVfTU1YRVhUID8gMiA6IDE7CisKKyAgICBpZiAoYXJnYyA+IDEpIHsKKyAgICAgICAgaGVscCgpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBwcmludGYoImZmbXBlZyBtb3Rpb24gdGVzdFxuIik7CisKKyAgICBjdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworICAgIGN0eC0+ZmxhZ3MgfD0gQVZfQ09ERUNfRkxBR19CSVRFWEFDVDsKKyAgICBhdl9mb3JjZV9jcHVfZmxhZ3MoMCk7CisgICAgbWVtc2V0KCZjY3R4LCAwLCBzaXplb2YoY2N0eCkpOworICAgIGZmX21lX2NtcF9pbml0KCZjY3R4LCBjdHgpOworICAgIGZvciAoYyA9IDA7IGMgPCBmbGFnc19zaXplOyBjKyspIHsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGF2X2ZvcmNlX2NwdV9mbGFncyhmbGFnc1tjXSk7CisgICAgICAgIG1lbXNldCgmbW14Y3R4LCAwLCBzaXplb2YobW14Y3R4KSk7CisgICAgICAgIGZmX21lX2NtcF9pbml0KCZtbXhjdHgsIGN0eCk7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgeworICAgICAgICAgICAgcHJpbnRmKCIlcyBmb3IgJWR4JWQgcGl4ZWxzXG4iLCBjID8gIm1teDIiIDogIm1teCIsCisgICAgICAgICAgICAgICAgICAgeCA/IDggOiAxNiwgeCA/IDggOiAxNik7CisgICAgICAgICAgICB0ZXN0X21vdGlvbigibW14IiwgICAgIG1teGN0eC5waXhfYWJzW3hdWzBdLCBjY3R4LnBpeF9hYnNbeF1bMF0pOworICAgICAgICAgICAgdGVzdF9tb3Rpb24oIm1teF94MiIsICBtbXhjdHgucGl4X2Fic1t4XVsxXSwgY2N0eC5waXhfYWJzW3hdWzFdKTsKKyAgICAgICAgICAgIHRlc3RfbW90aW9uKCJtbXhfeTIiLCAgbW14Y3R4LnBpeF9hYnNbeF1bMl0sIGNjdHgucGl4X2Fic1t4XVsyXSk7CisgICAgICAgICAgICB0ZXN0X21vdGlvbigibW14X3h5MiIsIG1teGN0eC5waXhfYWJzW3hdWzNdLCBjY3R4LnBpeF9hYnNbeF1bM10pOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWUoY3R4KTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9tcGVnMTJmcmFtZXJhdGUuYyBiL2xpYmF2Y29kZWMvdGVzdHMvbXBlZzEyZnJhbWVyYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1YmRiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdGVzdHMvbXBlZzEyZnJhbWVyYXRlLmMKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVnMTIuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWcxMmRhdGEuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaTsKKworI2RlZmluZSBURVNUX01BVENIKGZyYW1lX3JhdGUsIGNvZGUsIGV4dF9uLCBleHRfZCkgZG8geyBcCisgICAgICAgIEFWUmF0aW9uYWwgZnIgPSBmcmFtZV9yYXRlOyBcCisgICAgICAgIGludCBjLCBuLCBkOyBcCisgICAgICAgIGZmX21wZWcxMl9maW5kX2Jlc3RfZnJhbWVfcmF0ZShmciwgJmMsICZuLCAmZCwgMCk7IFwKKyAgICAgICAgaWYgKGMgIT0gY29kZSB8fCBuICE9IGV4dF9uIHx8IGQgIT0gZXh0X2QpIHsgXAorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBtYXRjaCAlZC8lZDogIiBcCisgICAgICAgICAgICAgICAgICAgImNvZGUgPSAlZCwgZXh0X24gPSAlZCwgZXh0X2QgPSAlZC5cbiIsIFwKKyAgICAgICAgICAgICAgICAgICBmci5udW0sIGZyLmRlbiwgYywgbiwgZCk7IFwKKyAgICAgICAgICAgIHJldHVybiAxOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIFRFU1RfRVhBQ1QoZnJuLCBmcmQpIGRvIHsgXAorICAgICAgICBBVlJhdGlvbmFsIGZyID0gKEFWUmF0aW9uYWwpIHsgZnJuLCBmcmQgfTsgXAorICAgICAgICBpbnQgYywgbiwgZDsgXAorICAgICAgICBmZl9tcGVnMTJfZmluZF9iZXN0X2ZyYW1lX3JhdGUoZnIsICZjLCAmbiwgJmQsIDApOyBcCisgICAgICAgIGlmIChhdl9jbXBfcShmciwgYXZfbXVsX3EoZmZfbXBlZzEyX2ZyYW1lX3JhdGVfdGFiW2NdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgbiArIDEsIGQgKyAxIH0pKSAhPSAwKSB7IFwKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZmluZCBleGFjdCAlZC8lZDogIiBcCisgICAgICAgICAgICAgICAgICAgImNvZGUgPSAlZCwgZXh0X24gPSAlZCwgZXh0X2QgPSAlZC5cbiIsIFwKKyAgICAgICAgICAgICAgICAgICBmci5udW0sIGZyLmRlbiwgYywgbiwgZCk7IFwKKyAgICAgICAgICAgIHJldHVybiAxOyBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKKyAgICAvLyBGcmFtZXJhdGVzIGluIHRoZSB0YWJsZSBtdXN0IGJlIGNob3NlbiBleGFjdGx5LgorICAgIGZvciAoaSA9IDE7IGkgPD0gODsgaSsrKQorICAgICAgICBURVNUX01BVENIKGZmX21wZWcxMl9mcmFtZV9yYXRlX3RhYltpXSwgaSwgMCwgMCk7CisKKyAgICAvLyBBcyBzaG91bGQgdGhlIHNhbWUgb25lcyB3aXRoIHNtYWxsIHBlcnR1cmJhdGlvbnMuCisgICAgLy8gKDEvMTAwMCB1c2VkIGhlcmUgdG8gYmUgc21hbGxlciB0aGFuIGhhbGYgdGhlIGRpZmZlcmVuY2UKKyAgICAvLyBiZXR3ZWVuIDI0IGFuZCAyNDAwMC8xMDAxLikKKyAgICBmb3IgKGkgPSAxOyBpIDw9IDg7IGkrKykgeworICAgICAgICBURVNUX01BVENIKGF2X3N1Yl9xKGZmX21wZWcxMl9mcmFtZV9yYXRlX3RhYltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCkgeyAxLCAxMDAwIH0pLCBpLCAwLCAwKTsKKyAgICAgICAgVEVTVF9NQVRDSChhdl9hZGRfcShmZl9tcGVnMTJfZnJhbWVfcmF0ZV90YWJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgMSwgMTAwMCB9KSwgaSwgMCwgMCk7CisgICAgfQorCisgICAgLy8gRXhhY3RseSBjb25zdHJ1Y3RhYmxlIGZyYW1lcmF0ZXMgc2hvdWxkIGJlIGV4YWN0LiAgTm90ZSB0aGF0IHNvbWUKKyAgICAvLyB2YWx1ZXMgY2FuIGJlIG1hZGUgaW4gbXVsdGlwbGUgd2F5cyAoZS5nLiAxMiA9IDI0IC8gMiA9PSA2MCAvIDUpLAorICAgIC8vIGFuZCB0aGVyZSBpcyBubyByZWFzb24gdG8gZmF2b3VyIGFueSBwYXJ0aWN1bGFyIGNob2ljZS4KKyAgICBURVNUX0VYQUNUKCAgICAgMSwgICAgMSk7CisgICAgVEVTVF9FWEFDVCggICAgIDIsICAgIDEpOworICAgIFRFU1RfRVhBQ1QoICAgIDEyLCAgICAxKTsKKyAgICBURVNUX0VYQUNUKCAxNTAwMCwgMTAwMSk7CisgICAgVEVTVF9FWEFDVCggICAgMTUsICAgIDEpOworICAgIFRFU1RfRVhBQ1QoICAgMTIwLCAgICAxKTsKKyAgICBURVNUX0VYQUNUKDEyMDAwMCwgMTAwMSk7CisgICAgVEVTVF9FWEFDVCggICAyMDAsICAgIDEpOworICAgIFRFU1RfRVhBQ1QoICAgMjQwLCAgICAxKTsKKworICAgIC8vIFZhbHVlcyBoaWdoZXIgdGhhbiAyNDAgKHRoZSBoaWdoZXN0IHJlcHJlc2VudGFibGUsIGFzIDYwICogNCAvIDEpCisgICAgLy8gc2hvdWxkIGJlIG1hcHBlZCB0byAyNDAuCisgICAgZm9yIChpID0gMjQwOyBpIDwgMTAwMDsgaSArPSAxMCkKKyAgICAgICAgVEVTVF9NQVRDSCgoKEFWUmF0aW9uYWwpIHsgaSwgMSB9KSwgOCwgMywgMCk7CisgICAgLy8gVmFsdWVzIGxvd2VyIHRoYW4gMjQwMDAvMzIwMzIgKHRoZSBsb3dlc3QgcmVwcmVzZW50YWJsZSwgYXMKKyAgICAvLyAyNDAwMC8xMDAxICogMSAvIDMyKSBzaG91bGQgYmUgbWFwcGVkIHRvIDI0MDAwLzMyMDMyLgorICAgIGZvciAoaSA9IDc0OyBpID4gMDsgaS0tKQorICAgICAgICBURVNUX01BVENIKCgoQVZSYXRpb25hbCkgeyBpLCAxMDAgfSksIDEsIDAsIDMxKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9vcHRpb25zLmMgYi9saWJhdmNvZGVjL3Rlc3RzL29wdGlvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTE5YTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy9vcHRpb25zLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9vcHRpb25zLmMiCisKK3N0YXRpYyBpbnQgZHVtbXlfaW5pdChBVkNvZGVjQ29udGV4dCAqY3R4KQoreworICAgIC8vVE9ETzogdGhpcyBjb2RlIHNob3VsZCBzZXQgZXZlcnkgcG9zc2libGUgcG9pbnRlciB0aGF0IGNvdWxkIGJlIHNldCBieSBjb2RlYyBhbmQgaXMgbm90IGFuIG9wdGlvbjsKKyAgICBjdHgtPmV4dHJhZGF0YV9zaXplID0gODsKKyAgICBjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyhjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkdW1teV9jbG9zZShBVkNvZGVjQ29udGV4dCAqY3R4KQoreworICAgIGF2X2ZyZWVwKCZjdHgtPmV4dHJhZGF0YSk7CisgICAgY3R4LT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHVtbXlfZW5jb2RlKEFWQ29kZWNDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QsIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCit7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgRHVtbXkxMkNvbnRleHQgeworICAgIEFWQ2xhc3MgICphdl9jbGFzczsKKyAgICBpbnQgICAgICBudW07CisgICAgY2hhciogICAgc3RyOworfSBEdW1teTEyQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgRHVtbXkzQ29udGV4dCB7CisgICAgdm9pZCAgICAgKmZha2VfYXZfY2xhc3M7CisgICAgaW50ICAgICAgbnVtOworICAgIGNoYXIqICAgIHN0cjsKK30gRHVtbXkzQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRHVtbXkxMkNvbnRleHQsIHgpCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkdW1teV9vcHRpb25zW10gPSB7CisgICAgeyAic3RyIiwgInNldCBzdHIiLCBPRkZTRVQoc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiaSdtIHNyYyBkZWZhdWx0IHZhbHVlIiB9LCAwLCAwLCBWRX0sCisgICAgeyAibnVtIiwgInNldCBudW0iLCBPRkZTRVQobnVtKSwgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAxNTAwMTAwOTAwIH0sICAgIDAsIElOVF9NQVgsIFZFfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGR1bW15X3YxX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImR1bW15X3YxX2NsYXNzIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZHVtbXlfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGR1bW15X3YyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImR1bW15X3YyX2NsYXNzIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gZHVtbXlfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKKy8qIGNvZGVjIHdpdGggb3B0aW9ucyAqLworc3RhdGljIEFWQ29kZWMgZHVtbXlfdjFfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJkdW1teV92MV9jb2RlYyIsCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FIC0gMSwKKyAgICAuZW5jb2RlMiAgICAgICAgICA9IGR1bW15X2VuY29kZSwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IGR1bW15X2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICAgPSBkdW1teV9jbG9zZSwKKyAgICAucHJpdl9jbGFzcyAgICAgICA9ICZkdW1teV92MV9jbGFzcywKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihEdW1teTEyQ29udGV4dCksCit9OworCisvKiBjb2RlYyB3aXRoIG9wdGlvbnMsIGRpZmZlcmVudCBjbGFzcyAqLworc3RhdGljIEFWQ29kZWMgZHVtbXlfdjJfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJkdW1teV92Ml9jb2RlYyIsCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FIC0gMiwKKyAgICAuZW5jb2RlMiAgICAgICAgICA9IGR1bW15X2VuY29kZSwKKyAgICAuaW5pdCAgICAgICAgICAgICA9IGR1bW15X2luaXQsCisgICAgLmNsb3NlICAgICAgICAgICAgPSBkdW1teV9jbG9zZSwKKyAgICAucHJpdl9jbGFzcyAgICAgICA9ICZkdW1teV92Ml9jbGFzcywKKyAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihEdW1teTEyQ29udGV4dCksCit9OworCisvKiBjb2RlYyB3aXRoIHByaXYgZGF0YSwgYnV0IG5vIGNsYXNzICovCitzdGF0aWMgQVZDb2RlYyBkdW1teV92M19lbmNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgID0gImR1bW15X3YzX2NvZGVjIiwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX05PTkUgLSAzLAorICAgIC5lbmNvZGUyICAgICAgICAgID0gZHVtbXlfZW5jb2RlLAorICAgIC5pbml0ICAgICAgICAgICAgID0gZHVtbXlfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IGR1bW15X2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKER1bW15M0NvbnRleHQpLAorfTsKKworLyogY29kZWMgd2l0aG91dCBwcml2IGRhdGEgKi8KK3N0YXRpYyBBVkNvZGVjIGR1bW15X3Y0X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAiZHVtbXlfdjRfY29kZWMiLAorICAgIC50eXBlICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSAtIDQsCisgICAgLmVuY29kZTIgICAgICAgICAgPSBkdW1teV9lbmNvZGUsCisgICAgLmluaXQgICAgICAgICAgICAgPSBkdW1teV9pbml0LAorICAgIC5jbG9zZSAgICAgICAgICAgID0gZHVtbXlfY2xvc2UsCit9OworCitzdGF0aWMgdm9pZCB0ZXN0X2NvcHlfcHJpbnRfY29kZWMoY29uc3QgQVZDb2RlY0NvbnRleHQgKmN0eCkKK3sKKyAgICBwcmludGYoIiUtMTRzOiAlZHglZCBwcnY6ICVzIiwKKyAgICAgICAgICAgY3R4LT5jb2RlYyA/IGN0eC0+Y29kZWMtPm5hbWUgOiAiTlVMTCIsCisgICAgICAgICAgIGN0eC0+d2lkdGgsIGN0eC0+aGVpZ2h0LAorICAgICAgICAgICBjdHgtPnByaXZfZGF0YSA/ICJzZXQiIDogIm51bGwiKTsKKyAgICBpZiAoY3R4LT5jb2RlYyAmJiBjdHgtPmNvZGVjLT5wcml2X2NsYXNzICYmIGN0eC0+Y29kZWMtPnByaXZfZGF0YV9zaXplKSB7CisgICAgICAgIGludDY0X3QgaTY0OworICAgICAgICBjaGFyICpzdHIgPSBOVUxMOworICAgICAgICBhdl9vcHRfZ2V0X2ludChjdHgtPnByaXZfZGF0YSwgIm51bSIsIDAsICZpNjQpOworICAgICAgICBhdl9vcHRfZ2V0KGN0eC0+cHJpdl9kYXRhLCAic3RyIiwgMCwgKHVpbnQ4X3QqKikmc3RyKTsKKyAgICAgICAgcHJpbnRmKCIgb3B0czogJSJQUklkNjQiICVzIiwgaTY0LCBzdHIpOworICAgICAgICBhdl9mcmVlKHN0cik7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9jb3B5KGNvbnN0IEFWQ29kZWMgKmMxLCBjb25zdCBBVkNvZGVjICpjMikKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqY3R4MSwgKmN0eDI7CisgICAgcHJpbnRmKCIlcyAtPiAlc1xuY2xvc2VkOlxuIiwgYzEgPyBjMS0+bmFtZSA6ICJOVUxMIiwgYzIgPyBjMi0+bmFtZSA6ICJOVUxMIik7CisgICAgY3R4MSA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoYzEpOworICAgIGN0eDIgPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGMyKTsKKyAgICBjdHgxLT53aWR0aCA9IGN0eDEtPmhlaWdodCA9IDEyODsKKyAgICBjdHgxLT50aW1lX2Jhc2UgPSAoQVZSYXRpb25hbCl7MTIsMzR9OworICAgIGlmIChjdHgyLT5jb2RlYyAmJiBjdHgyLT5jb2RlYy0+cHJpdl9jbGFzcyAmJiBjdHgyLT5jb2RlYy0+cHJpdl9kYXRhX3NpemUpIHsKKyAgICAgICAgYXZfb3B0X3NldChjdHgyLT5wcml2X2RhdGEsICJudW0iLCAiNjY3IiwgMCk7CisgICAgICAgIGF2X29wdF9zZXQoY3R4Mi0+cHJpdl9kYXRhLCAic3RyIiwgImknbSBkZXN0IHZhbHVlIGJlZm9yZSBjb3B5IiwgMCk7CisgICAgfQorICAgIGF2Y29kZWNfY29weV9jb250ZXh0KGN0eDIsIGN0eDEpOworICAgIHRlc3RfY29weV9wcmludF9jb2RlYyhjdHgxKTsKKyAgICB0ZXN0X2NvcHlfcHJpbnRfY29kZWMoY3R4Mik7CisgICAgaWYgKGN0eDEtPmNvZGVjKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIHByaW50Zigib3BlbmVkOlxuIik7CisgICAgICAgIHJldCA9IGF2Y29kZWNfb3BlbjIoY3R4MSwgY3R4MS0+Y29kZWMsIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhdmNvZGVjX29wZW4yIGZhaWxlZFxuIik7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChjdHgyLT5jb2RlYyAmJiBjdHgyLT5jb2RlYy0+cHJpdl9jbGFzcyAmJiBjdHgyLT5jb2RlYy0+cHJpdl9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgIGF2X29wdF9zZXQoY3R4Mi0+cHJpdl9kYXRhLCAibnVtIiwgIjY2NyIsIDApOworICAgICAgICAgICAgYXZfb3B0X3NldChjdHgyLT5wcml2X2RhdGEsICJzdHIiLCAiaSdtIGRlc3QgdmFsdWUgYmVmb3JlIGNvcHkiLCAwKTsKKyAgICAgICAgfQorICAgICAgICBhdmNvZGVjX2NvcHlfY29udGV4dChjdHgyLCBjdHgxKTsKKyAgICAgICAgdGVzdF9jb3B5X3ByaW50X2NvZGVjKGN0eDEpOworICAgICAgICB0ZXN0X2NvcHlfcHJpbnRfY29kZWMoY3R4Mik7CisgICAgICAgIGF2Y29kZWNfY2xvc2UoY3R4MSk7CisgICAgfQorICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZjdHgxKTsKKyAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmY3R4Mik7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgQVZDb2RlYyAqZHVtbXlfY29kZWNbXSA9IHsKKyAgICAgICAgJmR1bW15X3YxX2VuY29kZXIsCisgICAgICAgICZkdW1teV92Ml9lbmNvZGVyLAorICAgICAgICAmZHVtbXlfdjNfZW5jb2RlciwKKyAgICAgICAgJmR1bW15X3Y0X2VuY29kZXIsCisgICAgICAgIE5VTEwsCisgICAgfTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGR1bW15X2NvZGVjW2ldOyBpKyspCisgICAgICAgIGF2Y29kZWNfcmVnaXN0ZXIoZHVtbXlfY29kZWNbaV0pOworCisgICAgcHJpbnRmKCJ0ZXN0aW5nIGF2Y29kZWNfY29weV9jb250ZXh0KClcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhkdW1teV9jb2RlYyk7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IEZGX0FSUkFZX0VMRU1TKGR1bW15X2NvZGVjKTsgaisrKQorICAgICAgICAgICAgdGVzdF9jb3B5KGR1bW15X2NvZGVjW2ldLCBkdW1teV9jb2RlY1tqXSk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Rlc3RzL3BwYy9kY3QuYyBiL2xpYmF2Y29kZWMvdGVzdHMvcHBjL2RjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NWRiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Rlc3RzL3BwYy9kY3QuYwpAQCAtMCwwICsxLDMyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvcHBjL2ZkY3QuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGZkY3RfdGFiX2FyY2hbXSA9IHsKKyNpZiBIQVZFX0FMVElWRUMKKyAgICB7ICJhbHRpdmVjZmRjdCIsIGZmX2ZkY3RfYWx0aXZlYywgRkZfSURDVF9QRVJNX05PTkUsIEFWX0NQVV9GTEFHX0FMVElWRUMgfSwKKyNlbmRpZgorICAgIHsgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gaWRjdF90YWJfYXJjaFtdID0geworICAgIHsgMCB9Cit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9yYW5nZWNvZGVyLmMgYi9saWJhdmNvZGVjL3Rlc3RzL3JhbmdlY29kZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYThiYTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy9yYW5nZWNvZGVyLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9yYW5nZWNvZGVyLmgiCisKKyNkZWZpbmUgU0laRSAxMDI0MAorCitpbnQgbWFpbih2b2lkKQoreworICAgIFJhbmdlQ29kZXIgYzsKKyAgICB1aW50OF90IGJbOSAqIFNJWkVdID0gezB9OworICAgIHVpbnQ4X3Qgcls5ICogU0laRV07CisgICAgaW50IGk7CisgICAgdWludDhfdCBzdGF0ZVsxMF07CisgICAgQVZMRkcgcHJuZzsKKworICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKKworICAgIGZmX2luaXRfcmFuZ2VfZW5jb2RlcigmYywgYiwgU0laRSk7CisgICAgZmZfYnVpbGRfcmFjX3N0YXRlcygmYywgKDFMTCA8PCAzMikgLyAyMCwgMTI4ICsgNjQgKyAzMiArIDE2KTsKKworICAgIG1lbXNldChzdGF0ZSwgMTI4LCBzaXplb2Yoc3RhdGUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTSVpFOyBpKyspCisgICAgICAgIHJbaV0gPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgU0laRTsgaSsrKQorICAgICAgICBwdXRfcmFjKCZjLCBzdGF0ZSwgcltpXSAmIDEpOworCisgICAgZmZfcmFjX3Rlcm1pbmF0ZSgmYyk7CisKKyAgICBmZl9pbml0X3JhbmdlX2RlY29kZXIoJmMsIGIsIFNJWkUpOworCisgICAgbWVtc2V0KHN0YXRlLCAxMjgsIHNpemVvZihzdGF0ZSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykKKyAgICAgICAgaWYgKChyW2ldICYgMSkgIT0gZ2V0X3JhYygmYywgc3RhdGUpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAicmFjIGZhaWx1cmUgYXQgJWRcbiIsIGkpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy9zbm93ZW5jLmMgYi9saWJhdmNvZGVjL3Rlc3RzL3Nub3dlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWY5NGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy9zbm93ZW5jLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvc25vd2VuYy5jIgorCisjdW5kZWYgbWFsbG9jCisjdW5kZWYgZnJlZQorI3VuZGVmIHByaW50ZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorCitpbnQgbWFpbih2b2lkKXsKKyNkZWZpbmUgd2lkdGggIDI1NgorI2RlZmluZSBoZWlnaHQgMjU2CisgICAgaW50IGJ1ZmZlclsyXVt3aWR0aCpoZWlnaHRdOworICAgIFNub3dDb250ZXh0IHM7CisgICAgaW50IGk7CisgICAgQVZMRkcgcHJuZzsKKyAgICBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudD02OworICAgIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGU9MTsKKworICAgIHMudGVtcF9kd3RfYnVmZmVyICA9IGF2X21hbGxvY3pfYXJyYXkod2lkdGgsIHNpemVvZihEV1RFTEVNKSk7CisgICAgcy50ZW1wX2lkd3RfYnVmZmVyID0gYXZfbWFsbG9jel9hcnJheSh3aWR0aCwgc2l6ZW9mKElEV1RFTEVNKSk7CisKKyAgICBpZiAoIXMudGVtcF9kd3RfYnVmZmVyIHx8ICFzLnRlbXBfaWR3dF9idWZmZXIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOworCisgICAgcHJpbnRmKCJ0ZXN0aW5nIDUvMyBEV1RcbiIpOworICAgIGZvcihpPTA7IGk8d2lkdGgqaGVpZ2h0OyBpKyspCisgICAgICAgIGJ1ZmZlclswXVtpXSA9IGJ1ZmZlclsxXVtpXSA9IGF2X2xmZ19nZXQoJnBybmcpICUgNTQzMjEgLSAxMjM0NTsKKworICAgIGZmX3NwYXRpYWxfZHd0KGJ1ZmZlclswXSwgcy50ZW1wX2R3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7CisgICAgZmZfc3BhdGlhbF9pZHd0KChJRFdURUxFTSopYnVmZmVyWzBdLCBzLnRlbXBfaWR3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7CisKKyAgICBmb3IoaT0wOyBpPHdpZHRoKmhlaWdodDsgaSsrKQorICAgICAgICBpZihidWZmZXJbMF1baV0hPSBidWZmZXJbMV1baV0pIHByaW50ZigiZnNjazogJTZkICUxMmQgJTdkXG4iLGksIGJ1ZmZlclswXVtpXSwgYnVmZmVyWzFdW2ldKTsKKworICAgIHByaW50ZigidGVzdGluZyA5LzcgRFdUXG4iKTsKKyAgICBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlPTA7CisgICAgZm9yKGk9MDsgaTx3aWR0aCpoZWlnaHQ7IGkrKykKKyAgICAgICAgYnVmZmVyWzBdW2ldID0gYnVmZmVyWzFdW2ldID0gYXZfbGZnX2dldCgmcHJuZykgJSA1NDMyMSAtIDEyMzQ1OworCisgICAgZmZfc3BhdGlhbF9kd3QoYnVmZmVyWzBdLCBzLnRlbXBfZHd0X2J1ZmZlciwgd2lkdGgsIGhlaWdodCwgd2lkdGgsIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUsIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50KTsKKyAgICBmZl9zcGF0aWFsX2lkd3QoKElEV1RFTEVNKilidWZmZXJbMF0sIHMudGVtcF9pZHd0X2J1ZmZlciwgd2lkdGgsIGhlaWdodCwgd2lkdGgsIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUsIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50KTsKKworICAgIGZvcihpPTA7IGk8d2lkdGgqaGVpZ2h0OyBpKyspCisgICAgICAgIGlmKEZGQUJTKGJ1ZmZlclswXVtpXSAtIGJ1ZmZlclsxXVtpXSk+MjApIHByaW50ZigiZnNjazogJTZkICUxMmQgJTdkXG4iLGksIGJ1ZmZlclswXVtpXSwgYnVmZmVyWzFdW2ldKTsKKworICAgIHsKKyAgICBpbnQgbGV2ZWwsIG9yaWVudGF0aW9uLCB4LCB5OworICAgIGludDY0X3QgZXJyb3JzWzhdWzRdOworICAgIGludDY0X3QgZz0wOworCisgICAgICAgIG1lbXNldChlcnJvcnMsIDAsIHNpemVvZihlcnJvcnMpKTsKKyAgICAgICAgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ9MzsKKyAgICAgICAgcy5zcGF0aWFsX2RlY29tcG9zaXRpb25fdHlwZT0wOworICAgICAgICBmb3IobGV2ZWw9MDsgbGV2ZWw8cy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQ7IGxldmVsKyspeworICAgICAgICAgICAgZm9yKG9yaWVudGF0aW9uPWxldmVsID8gMSA6IDA7IG9yaWVudGF0aW9uPDQ7IG9yaWVudGF0aW9uKyspeworICAgICAgICAgICAgICAgIGludCB3PSB3aWR0aCAgPj4gKHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50LWxldmVsKTsKKyAgICAgICAgICAgICAgICBpbnQgaD0gaGVpZ2h0ID4+IChzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC1sZXZlbCk7CisgICAgICAgICAgICAgICAgaW50IHN0cmlkZT0gd2lkdGggIDw8IChzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC1sZXZlbCk7CisgICAgICAgICAgICAgICAgRFdURUxFTSAqYnVmPSBidWZmZXJbMF07CisgICAgICAgICAgICAgICAgaW50NjRfdCBlcnJvcj0wOworCisgICAgICAgICAgICAgICAgaWYob3JpZW50YXRpb24mMSkgYnVmKz13OworICAgICAgICAgICAgICAgIGlmKG9yaWVudGF0aW9uPjEpIGJ1Zis9c3RyaWRlPj4xOworCisgICAgICAgICAgICAgICAgbWVtc2V0KGJ1ZmZlclswXSwgMCwgc2l6ZW9mKGludCkqd2lkdGgqaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBidWZbdy8yICsgaC8yKnN0cmlkZV09IDI1NioyNTY7CisgICAgICAgICAgICAgICAgZmZfc3BhdGlhbF9pZHd0KChJRFdURUxFTSopYnVmZmVyWzBdLCBzLnRlbXBfaWR3dF9idWZmZXIsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl90eXBlLCBzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudCk7CisgICAgICAgICAgICAgICAgZm9yKHk9MDsgeTxoZWlnaHQ7IHkrKyl7CisgICAgICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8d2lkdGg7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGQ9IGJ1ZmZlclswXVt4ICsgeSp3aWR0aF07CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciArPSBkKmQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihGRkFCUyh3aWR0aC8yLXgpPDkgJiYgRkZBQlMoaGVpZ2h0LzIteSk8OSAmJiBsZXZlbD09MikgcHJpbnRmKCIlOCJQUklkNjQiICIsIGQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKEZGQUJTKGhlaWdodC8yLXkpPDkgJiYgbGV2ZWw9PTIpIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyb3I9IChpbnQpKHNxcnQoZXJyb3IpKzAuNSk7CisgICAgICAgICAgICAgICAgZXJyb3JzW2xldmVsXVtvcmllbnRhdGlvbl09IGVycm9yOworICAgICAgICAgICAgICAgIGlmKGcpIGc9YXZfZ2NkKGcsIGVycm9yKTsKKyAgICAgICAgICAgICAgICBlbHNlIGc9IGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByaW50Zigic3RhdGljIGludCBjb25zdCB2aXN1YWxfd2VpZ2h0W11bNF09e1xuIik7CisgICAgICAgIGZvcihsZXZlbD0wOyBsZXZlbDxzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudDsgbGV2ZWwrKyl7CisgICAgICAgICAgICBwcmludGYoIiAgeyIpOworICAgICAgICAgICAgZm9yKG9yaWVudGF0aW9uPTA7IG9yaWVudGF0aW9uPDQ7IG9yaWVudGF0aW9uKyspeworICAgICAgICAgICAgICAgIHByaW50ZigiJTgiUFJJZDY0IiwiLCBlcnJvcnNbbGV2ZWxdW29yaWVudGF0aW9uXS9nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaW50ZigifSxcbiIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigifTtcbiIpOworICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGV2ZWw9MjsKKyAgICAgICAgICAgIGludCB3PSB3aWR0aCAgPj4gKHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50LWxldmVsKTsKKyAgICAgICAgICAgIC8vaW50IGg9IGhlaWdodCA+PiAocy5zcGF0aWFsX2RlY29tcG9zaXRpb25fY291bnQtbGV2ZWwpOworICAgICAgICAgICAgaW50IHN0cmlkZT0gd2lkdGggIDw8IChzLnNwYXRpYWxfZGVjb21wb3NpdGlvbl9jb3VudC1sZXZlbCk7CisgICAgICAgICAgICBEV1RFTEVNICpidWY9IGJ1ZmZlclswXTsKKyAgICAgICAgICAgIGludDY0X3QgZXJyb3I9MDsKKworICAgICAgICAgICAgYnVmKz13OworICAgICAgICAgICAgYnVmKz1zdHJpZGU+PjE7CisKKyAgICAgICAgICAgIG1lbXNldChidWZmZXJbMF0sIDAsIHNpemVvZihpbnQpKndpZHRoKmhlaWdodCk7CisgICAgICAgICAgICBmb3IoeT0wOyB5PGhlaWdodDsgeSsrKXsKKyAgICAgICAgICAgICAgICBmb3IoeD0wOyB4PHdpZHRoOyB4KyspeworICAgICAgICAgICAgICAgICAgICBpbnQgdGFiWzRdPXswLDIsMywxfTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyWzBdW3grd2lkdGgqeV09IDI1NioyNTYqdGFiWyh4JjEpICsgMiooeSYxKV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmZfc3BhdGlhbF9kd3QoYnVmZmVyWzBdLCBzLnRlbXBfZHd0X2J1ZmZlciwgd2lkdGgsIGhlaWdodCwgd2lkdGgsIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX3R5cGUsIHMuc3BhdGlhbF9kZWNvbXBvc2l0aW9uX2NvdW50KTsKKyAgICAgICAgICAgIGZvcih5PTA7IHk8aGVpZ2h0OyB5KyspeworICAgICAgICAgICAgICAgIGZvcih4PTA7IHg8d2lkdGg7IHgrKyl7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZD0gYnVmZmVyWzBdW3ggKyB5KndpZHRoXTsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gZCpkOworICAgICAgICAgICAgICAgICAgICBpZihGRkFCUyh3aWR0aC8yLXgpPDkgJiYgRkZBQlMoaGVpZ2h0LzIteSk8OSkgcHJpbnRmKCIlOCJQUklkNjQiICIsIGQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZihGRkFCUyhoZWlnaHQvMi15KTw5KSBwcmludGYoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGVzdHMvdXRpbHMuYyBiL2xpYmF2Y29kZWMvdGVzdHMvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmJhN2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy91dGlscy5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorCitpbnQgbWFpbih2b2lkKXsKKyAgICBBVkNvZGVjICpjb2RlYyA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICB3aGlsZSAoY29kZWMgPSBhdl9jb2RlY19uZXh0KGNvZGVjKSkgeworICAgICAgICBpZiAoYXZfY29kZWNfaXNfZW5jb2Rlcihjb2RlYykpIHsKKyAgICAgICAgICAgIGlmIChjb2RlYy0+dHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjLT5zYW1wbGVfZm10cykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiRW5jb2RlciAlcyBpcyBtaXNzaW5nIHRoZSBzYW1wbGVfZm10cyBmaWVsZFxuIiwgY29kZWMtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXN0cy94ODYvZGN0LmMgYi9saWJhdmNvZGVjL3Rlc3RzL3g4Ni9kY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmIwM2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy90ZXN0cy94ODYvZGN0LmMKQEAgLTAsMCArMSwxMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy94ODYvZmRjdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMveDg2L3h2aWRpZGN0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QuaCIKKworI2lmIChDT05GSUdfUFJPUkVTX0RFQ09ERVIgfHwgQ09ORklHX1BST1JFU19MR1BMX0RFQ09ERVIpICYmIEFSQ0hfWDg2XzY0ICYmIEhBVkVfWDg2QVNNCit2b2lkIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF9zc2UyKHVpbnQxNl90ICpkc3QsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludDE2X3QgKnFtYXQpOworCisjZGVmaW5lIFBSX1dSQVAoSU5TTikgXAorc3RhdGljIHZvaWQgZmZfcHJvcmVzX2lkY3RfcHV0XzEwXyMjSU5TTiMjX3dyYXAoaW50MTZfdCAqZHN0KXsgXAorICAgIExPQ0FMX0FMSUdORUQoMTYsIGludDE2X3QsIHFtYXQsIFs2NF0pOyBcCisgICAgTE9DQUxfQUxJR05FRCgxNiwgaW50MTZfdCwgdG1wLCBbNjRdKTsgXAorICAgIGludCBpOyBcCisgXAorICAgIGZvcihpPTA7IGk8NjQ7IGkrKyl7IFwKKyAgICAgICAgcW1hdFtpXT00OyBcCisgICAgICAgIHRtcFtpXT0gZHN0W2ldOyBcCisgICAgfSBcCisgICAgZmZfcHJvcmVzX2lkY3RfcHV0XzEwXyMjSU5TTiAoZHN0LCAxNiwgdG1wLCBxbWF0KTsgXAorIFwKKyAgICBmb3IoaT0wOyBpPDY0OyBpKyspIHsgXAorICAgICAgICAgZHN0W2ldIC09IDUxMjsgXAorICAgIH0gXAorfQorCitQUl9XUkFQKHNzZTIpCisKKyMgaWYgSEFWRV9BVlhfRVhURVJOQUwKK3ZvaWQgZmZfcHJvcmVzX2lkY3RfcHV0XzEwX2F2eCh1aW50MTZfdCAqZHN0LCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludDE2X3QgKnFtYXQpOworUFJfV1JBUChhdngpCisjIGVuZGlmCisKKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gZmRjdF90YWJfYXJjaFtdID0geworI2lmIEhBVkVfTU1YX0lOTElORQorICAgIHsgIk1NWCIsICAgIGZmX2ZkY3RfbW14LCAgICBGRl9JRENUX1BFUk1fTk9ORSwgQVZfQ1BVX0ZMQUdfTU1YIH0sCisjZW5kaWYKKyNpZiBIQVZFX01NWEVYVF9JTkxJTkUKKyAgICB7ICJNTVhFWFQiLCBmZl9mZGN0X21teGV4dCwgRkZfSURDVF9QRVJNX05PTkUsIEFWX0NQVV9GTEFHX01NWEVYVCB9LAorI2VuZGlmCisjaWYgSEFWRV9TU0UyX0lOTElORQorICAgIHsgIlNTRTIiLCAgIGZmX2ZkY3Rfc3NlMiwgICBGRl9JRENUX1BFUk1fTk9ORSwgQVZfQ1BVX0ZMQUdfU1NFMiB9LAorI2VuZGlmCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWxnbyBpZGN0X3RhYl9hcmNoW10gPSB7CisjaWYgSEFWRV9NTVhfRVhURVJOQUwKKyAgICB7ICJTSU1QTEUtTU1YIiwgIGZmX3NpbXBsZV9pZGN0X21teCwgIEZGX0lEQ1RfUEVSTV9TSU1QTEUsIEFWX0NQVV9GTEFHX01NWCB9LAorI2VuZGlmCisjaWYgQ09ORklHX01QRUc0X0RFQ09ERVIgJiYgSEFWRV9YODZBU00KKyNpZiBBUkNIX1g4Nl8zMgorICAgIHsgIlhWSUQtTU1YIiwgICAgZmZfeHZpZF9pZGN0X21teCwgICAgRkZfSURDVF9QRVJNX05PTkUsICAgQVZfQ1BVX0ZMQUdfTU1YLCAgICAxIH0sCisgICAgeyAiWFZJRC1NTVhFWFQiLCBmZl94dmlkX2lkY3RfbW14ZXh0LCBGRl9JRENUX1BFUk1fTk9ORSwgICBBVl9DUFVfRkxBR19NTVhFWFQsIDEgfSwKKyNlbmRpZgorI2lmIEhBVkVfU1NFMl9FWFRFUk5BTAorICAgIHsgIlhWSUQtU1NFMiIsICAgZmZfeHZpZF9pZGN0X3NzZTIsICAgRkZfSURDVF9QRVJNX1NTRTIsICAgQVZfQ1BVX0ZMQUdfU1NFMiwgICAxIH0sCisjZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfTVBFRzRfREVDT0RFUiAmJiBIQVZFX1g4NkFTTSAqLworI2lmIChDT05GSUdfUFJPUkVTX0RFQ09ERVIgfHwgQ09ORklHX1BST1JFU19MR1BMX0RFQ09ERVIpICYmIEFSQ0hfWDg2XzY0ICYmIEhBVkVfWDg2QVNNCisgICAgeyAiUFItU1NFMiIsICAgICBmZl9wcm9yZXNfaWRjdF9wdXRfMTBfc3NlMl93cmFwLCBGRl9JRENUX1BFUk1fVFJBTlNQT1NFLCBBVl9DUFVfRkxBR19TU0UyLCAxIH0sCisjIGlmIEhBVkVfQVZYX0VYVEVSTkFMCisgICAgeyAiUFItQVZYIiwgICAgICBmZl9wcm9yZXNfaWRjdF9wdXRfMTBfYXZ4X3dyYXAsIEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0UsIEFWX0NQVV9GTEFHX0FWWCwgMSB9LAorIyBlbmRpZgorI2VuZGlmCisjaWYgSEFWRV9YODZBU00KKyNpZiBBUkNIX1g4Nl82NAorI2lmIEhBVkVfU1NFMl9FWFRFUk5BTAorICAgIHsgIlNJTVBMRTgtU1NFMiIsICAgZmZfc2ltcGxlX2lkY3Q4X3NzZTIsICBGRl9JRENUX1BFUk1fVFJBTlNQT1NFLCBBVl9DUFVfRkxBR19TU0UyfSwKKyAgICB7ICJTSU1QTEUxMC1TU0UyIiwgIGZmX3NpbXBsZV9pZGN0MTBfc3NlMiwgRkZfSURDVF9QRVJNX1RSQU5TUE9TRSwgQVZfQ1BVX0ZMQUdfU1NFMn0sCisgICAgeyAiU0lNUExFMTItU1NFMiIsICBmZl9zaW1wbGVfaWRjdDEyX3NzZTIsIEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0UsIEFWX0NQVV9GTEFHX1NTRTIsIDEgfSwKKyNlbmRpZgorI2lmIEhBVkVfQVZYX0VYVEVSTkFMCisgICAgeyAiU0lNUExFOC1BVlgiLCAgICBmZl9zaW1wbGVfaWRjdDhfYXZ4LCAgIEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0UsIEFWX0NQVV9GTEFHX0FWWH0sCisgICAgeyAiU0lNUExFMTAtQVZYIiwgICBmZl9zaW1wbGVfaWRjdDEwX2F2eCwgIEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0UsIEFWX0NQVV9GTEFHX0FWWH0sCisgICAgeyAiU0lNUExFMTItQVZYIiwgICBmZl9zaW1wbGVfaWRjdDEyX2F2eCwgIEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0UsIEFWX0NQVV9GTEFHX0FWWCwgIDEgfSwKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKyAgICB7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgaWRjdF9zaW1wbGVfbW14X3Blcm1bNjRdID0geworICAgIDB4MDAsIDB4MDgsIDB4MDQsIDB4MDksIDB4MDEsIDB4MEMsIDB4MDUsIDB4MEQsCisgICAgMHgxMCwgMHgxOCwgMHgxNCwgMHgxOSwgMHgxMSwgMHgxQywgMHgxNSwgMHgxRCwKKyAgICAweDIwLCAweDI4LCAweDI0LCAweDI5LCAweDIxLCAweDJDLCAweDI1LCAweDJELAorICAgIDB4MTIsIDB4MUEsIDB4MTYsIDB4MUIsIDB4MTMsIDB4MUUsIDB4MTcsIDB4MUYsCisgICAgMHgwMiwgMHgwQSwgMHgwNiwgMHgwQiwgMHgwMywgMHgwRSwgMHgwNywgMHgwRiwKKyAgICAweDMwLCAweDM4LCAweDM0LCAweDM5LCAweDMxLCAweDNDLCAweDM1LCAweDNELAorICAgIDB4MjIsIDB4MkEsIDB4MjYsIDB4MkIsIDB4MjMsIDB4MkUsIDB4MjcsIDB4MkYsCisgICAgMHgzMiwgMHgzQSwgMHgzNiwgMHgzQiwgMHgzMywgMHgzRSwgMHgzNywgMHgzRiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGlkY3Rfc3NlMl9yb3dfcGVybVs4XSA9IHsgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyB9OworCitzdGF0aWMgaW50IHBlcm11dGVfeDg2KGludDE2X3QgZHN0WzY0XSwgY29uc3QgaW50MTZfdCBzcmNbNjRdLAorICAgICAgICAgICAgICAgICAgICAgICBlbnVtIGlkY3RfcGVybXV0YXRpb25fdHlwZSBwZXJtX3R5cGUpCit7CisgICAgaW50IGk7CisKKyAgICBzd2l0Y2ggKHBlcm1fdHlwZSkgeworICAgIGNhc2UgRkZfSURDVF9QRVJNX1NJTVBMRToKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCisgICAgICAgICAgICBkc3RbaWRjdF9zaW1wbGVfbW14X3Blcm1baV1dID0gc3JjW2ldOworICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIEZGX0lEQ1RfUEVSTV9TU0UyOgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKKyAgICAgICAgICAgIGRzdFsoaSAmIDB4MzgpIHwgaWRjdF9zc2UyX3Jvd19wZXJtW2kgJiA3XV0gPSBzcmNbaV07CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXh0ZGVjLmMgYi9saWJhdmNvZGVjL3RleHRkZWMuYwppbmRleCBhNmM4NzIyLi45NjRkYTcyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3RleHRkZWMuYworKysgYi9saWJhdmNvZGVjL3RleHRkZWMuYwpAQCAtMzIsNiArMzIsNyBAQAogICAgIEFWQ2xhc3MgKmNsYXNzOwogICAgIGNvbnN0IGNoYXIgKmxpbmVicmVha3M7CiAgICAgaW50IGtlZXBfYXNzX21hcmt1cDsKKyAgICBpbnQgcmVhZG9yZGVyOwogfSBUZXh0Q29udGV4dDsKIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVGV4dENvbnRleHQsIHgpCkBAIC00OCwxNSArNDksMTIgQEAKICAgICBBVkJQcmludCBidWY7CiAgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKICAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKLSAgICBjb25zdCBUZXh0Q29udGV4dCAqdGV4dCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgY29uc3QgaW50IHRzX3N0YXJ0ICAgICA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzLCAgICAgIGF2Y3R4LT50aW1lX2Jhc2UsIChBVlJhdGlvbmFsKXsxLDEwMH0pOwotICAgIGNvbnN0IGludCB0c19kdXJhdGlvbiAgPSBhdnBrdC0+ZHVyYXRpb24gIT0gLTEgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EoYXZwa3QtPmR1cmF0aW9uLCBhdmN0eC0+dGltZV9iYXNlLCAoQVZSYXRpb25hbCl7MSwxMDB9KSA6IC0xOworICAgIFRleHRDb250ZXh0ICp0ZXh0ID0gYXZjdHgtPnByaXZfZGF0YTsKIAogICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CiAgICAgaWYgKHB0ciAmJiBhdnBrdC0+c2l6ZSA+IDAgJiYgKnB0cikgewogICAgICAgICBmZl9hc3NfYnByaW50X3RleHRfZXZlbnQoJmJ1ZiwgcHRyLCBhdnBrdC0+c2l6ZSwgdGV4dC0+bGluZWJyZWFrcywgdGV4dC0+a2VlcF9hc3NfbWFya3VwKTsKLSAgICAgICAgcmV0ID0gZmZfYXNzX2FkZF9yZWN0X2JwcmludChzdWIsICZidWYsIHRzX3N0YXJ0LCB0c19kdXJhdGlvbik7CisgICAgICAgIHJldCA9IGZmX2Fzc19hZGRfcmVjdChzdWIsIGJ1Zi5zdHIsIHRleHQtPnJlYWRvcmRlcisrLCAwLCBOVUxMLCBOVUxMKTsKICAgICB9CiAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZidWYsIE5VTEwpOwogICAgIGlmIChyZXQgPCAwKQpAQCAtNjUsNiArNjMsMTMgQEAKICAgICByZXR1cm4gYXZwa3QtPnNpemU7CiB9CiAKK3N0YXRpYyB2b2lkIHRleHRfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFRleHRDb250ZXh0ICp0ZXh0ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpZiAoIShhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfUk9fRkxVU0hfTk9PUCkpCisgICAgICAgIHRleHQtPnJlYWRvcmRlciA9IDA7Cit9CisKICNkZWZpbmUgREVDTEFSRV9DTEFTUyhkZWNuYW1lKSBzdGF0aWMgY29uc3QgQVZDbGFzcyBkZWNuYW1lICMjIF9kZWNvZGVyX2NsYXNzID0geyAgIFwKICAgICAuY2xhc3NfbmFtZSA9ICNkZWNuYW1lICIgZGVjb2RlciIsICAgICAgXAogICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsICAgICBcCkBAIC04NSw2ICs5MCw3IEBACiAgICAgLmRlY29kZSAgICAgICAgID0gdGV4dF9kZWNvZGVfZnJhbWUsCiAgICAgLmluaXQgICAgICAgICAgID0gZmZfYXNzX3N1YnRpdGxlX2hlYWRlcl9kZWZhdWx0LAogICAgIC5wcml2X2NsYXNzICAgICA9ICZ0ZXh0X2RlY29kZXJfY2xhc3MsCisgICAgLmZsdXNoICAgICAgICAgID0gdGV4dF9mbHVzaCwKIH07CiAjZW5kaWYKIApAQCAtMTEwLDYgKzExNiw3IEBACiAgICAgLmRlY29kZSAgICAgICAgID0gdGV4dF9kZWNvZGVfZnJhbWUsCiAgICAgLmluaXQgICAgICAgICAgID0gbGluZWJyZWFrX2luaXQsCiAgICAgLnByaXZfY2xhc3MgICAgID0gJnZwbGF5ZXJfZGVjb2Rlcl9jbGFzcywKKyAgICAuZmx1c2ggICAgICAgICAgPSB0ZXh0X2ZsdXNoLAogfTsKICNlbmRpZgogCkBAIC0xMjYsNiArMTMzLDcgQEAKICAgICAuZGVjb2RlICAgICAgICAgPSB0ZXh0X2RlY29kZV9mcmFtZSwKICAgICAuaW5pdCAgICAgICAgICAgPSBsaW5lYnJlYWtfaW5pdCwKICAgICAucHJpdl9jbGFzcyAgICAgPSAmc3RsX2RlY29kZXJfY2xhc3MsCisgICAgLmZsdXNoICAgICAgICAgID0gdGV4dF9mbHVzaCwKIH07CiAjZW5kaWYKIApAQCAtMTQyLDYgKzE1MCw3IEBACiAgICAgLmRlY29kZSAgICAgICAgID0gdGV4dF9kZWNvZGVfZnJhbWUsCiAgICAgLmluaXQgICAgICAgICAgID0gbGluZWJyZWFrX2luaXQsCiAgICAgLnByaXZfY2xhc3MgICAgID0gJnBqc19kZWNvZGVyX2NsYXNzLAorICAgIC5mbHVzaCAgICAgICAgICA9IHRleHRfZmx1c2gsCiB9OwogI2VuZGlmCiAKQEAgLTE1OCw2ICsxNjcsNyBAQAogICAgIC5kZWNvZGUgICAgICAgICA9IHRleHRfZGVjb2RlX2ZyYW1lLAogICAgIC5pbml0ICAgICAgICAgICA9IGxpbmVicmVha19pbml0LAogICAgIC5wcml2X2NsYXNzICAgICA9ICZzdWJ2aWV3ZXIxX2RlY29kZXJfY2xhc3MsCisgICAgLmZsdXNoICAgICAgICAgID0gdGV4dF9mbHVzaCwKIH07CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90ZXh0dXJlZHNwLmMgYi9saWJhdmNvZGVjL3RleHR1cmVkc3AuYwppbmRleCBjNWU2Y2M2Li5iN2RkOGJhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3RleHR1cmVkc3AuYworKysgYi9saWJhdmNvZGVjL3RleHR1cmVkc3AuYwpAQCAtMzUsNyArMzUsNyBAQAogI2RlZmluZSBSR0JBKHIsIGcsIGIsIGEpICgoKHVpbnQ4X3QpKHIpIDw8ICAwKSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KShnKSA8PCAgOCkgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCkoYikgPDwgMTYpIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQ4X3QpKGEpIDw8IDI0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkodWludDhfdCkoYSkgPDwgMjQpKQogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGV4dHJhY3RfY29sb3IodWludDMyX3QgY29sb3JzWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGNvbG9yMCwKQEAgLTE1OCw3ICsxNTgsNyBAQAogCiAgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYWxwaGEgPSBhbHBoYV92YWx1ZXNbeF07Ci0gICAgICAgICAgICB1aW50MzJfdCBwaXhlbCA9IGNvbG9yc1tjb2RlICYgM10gfCAoYWxwaGEgPDwgMjQpOworICAgICAgICAgICAgdWludDMyX3QgcGl4ZWwgPSBjb2xvcnNbY29kZSAmIDNdIHwgKCh1bnNpZ25lZClhbHBoYSA8PCAyNCk7CiAgICAgICAgICAgICBjb2RlID4+PSAyOwogCiAgICAgICAgICAgICBBVl9XTDMyKGRzdCArIHggKiA0LCBwaXhlbCk7CkBAIC0xNjcsNyArMTY3LDcgQEAKICAgICB9CiB9CiAKLS8qKiBDb252ZXJ0IGEgcHJlbXVsdGlwbGllZCBhbHBoYSBwaXhlbCB0byBhIHN0cmFpZ3RoIGFscGhhIHBpeGVsLiAqLworLyoqIENvbnZlcnQgYSBwcmVtdWx0aXBsaWVkIGFscGhhIHBpeGVsIHRvIGEgc3RyYWlnaHQgYWxwaGEgcGl4ZWwuICovCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHByZW11bHQyc3RyYWlnaHQodWludDhfdCAqc3JjKQogewogICAgIGludCByID0gc3JjWzBdOwpAQCAtMjkxLDcgKzI5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwaXhlbCA9IGNvbG9yc1tjb2RlICYgM10gfCAoYWxwaGEgPDwgMjQpOworICAgICAgICAgICAgcGl4ZWwgPSBjb2xvcnNbY29kZSAmIDNdIHwgKCh1bnNpZ25lZClhbHBoYSA8PCAyNCk7CiAgICAgICAgICAgICBjb2RlID4+PSAyOwogICAgICAgICAgICAgQVZfV0wzMihkc3QgKyB4ICogNCwgcGl4ZWwpOwogICAgICAgICB9CkBAIC00MTMsNyArNDEzLDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIHJndGNfYmxvY2tfaW50ZXJuYWwodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmNvbG9yX3RhYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqY29sb3JfdGFiLCBpbnQgbW9ubywgaW50IG9mZnNldCwgaW50IHBpeF9zaXplKQogewogICAgIHVpbnQ4X3QgaW5kaWNlc1sxNl07CiAgICAgaW50IHgsIHk7CkBAIC00MjksMTQgKzQyOSwyMCBAQAogICAgICAgICAgICAgaW50IGkgPSBpbmRpY2VzW3ggKyB5ICogNF07CiAgICAgICAgICAgICAvKiBJbnRlcnZhbCBleHBhbnNpb24gZnJvbSBbLTEgMV0gb3IgWzAgMV0gdG8gWzAgMjU1XS4gKi8KICAgICAgICAgICAgIGludCBjID0gY29sb3JfdGFiW2ldOwotICAgICAgICAgICAgdWludDMyX3QgcGl4ZWwgPSBSR0JBKGMsIGMsIGMsIDI1NVUpOwotICAgICAgICAgICAgQVZfV0wzMihkc3QgKyB4ICogNCArIHkgKiBzdHJpZGUsIHBpeGVsKTsKKworICAgICAgICAgICAgaWYgKG1vbm8peworICAgICAgICAgICAgICAgIGRzdCBbeCAqIHBpeF9zaXplICsgeSAqIHN0cmlkZSArIG9mZnNldF0gPSAodWludDhfdCljOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBwaXhlbCA9IFJHQkEoYywgYywgYywgMjU1VSk7CisgICAgICAgICAgICAgICAgQVZfV0wzMihkc3QgKyB4ICogcGl4X3NpemUgKyB5ICogc3RyaWRlLCBwaXhlbCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCByZ3RjMV9ibG9ja19pbnRlcm5hbCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmxvY2ssIGludCBzaWduKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJsb2NrLCBpbnQgc2lnbiwgaW50IG1vbm8sIGludCBvZmZzZXQsIGludCBwaXhfc2l6ZSkKIHsKICAgICBpbnQgY29sb3JfdGFibGVbOF07CiAgICAgaW50IHIwLCByMTsKQEAgLTQ3Miw3ICs0NzgsNyBAQAogICAgICAgICBjb2xvcl90YWJsZVs3XSA9IDI1NTsgIC8qIG1heCByYW5nZSAqLyAgLy8gYml0IGNvZGUgMTExCiAgICAgfQogCi0gICAgcmd0Y19ibG9ja19pbnRlcm5hbChkc3QsIHN0cmlkZSwgYmxvY2ssIGNvbG9yX3RhYmxlKTsKKyAgICByZ3RjX2Jsb2NrX2ludGVybmFsKGRzdCwgc3RyaWRlLCBibG9jaywgY29sb3JfdGFibGUsIG1vbm8sIG9mZnNldCwgcGl4X3NpemUpOwogfQogCiAvKioKQEAgLTQ4Niw3ICs0OTIsNyBAQAogICovCiBzdGF0aWMgaW50IHJndGMxc19ibG9jayh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKQogewotICAgIHJndGMxX2Jsb2NrX2ludGVybmFsKGRzdCwgc3RyaWRlLCBibG9jaywgMSk7CisgICAgcmd0YzFfYmxvY2tfaW50ZXJuYWwoZHN0LCBzdHJpZGUsIGJsb2NrLCAxLCAwLCAwLCA0KTsKIAogICAgIHJldHVybiA4OwogfQpAQCAtNTAyLDcgKzUwOCwzOSBAQAogICovCiBzdGF0aWMgaW50IHJndGMxdV9ibG9jayh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKQogewotICAgIHJndGMxX2Jsb2NrX2ludGVybmFsKGRzdCwgc3RyaWRlLCBibG9jaywgMCk7CisgICAgcmd0YzFfYmxvY2tfaW50ZXJuYWwoZHN0LCBzdHJpZGUsIGJsb2NrLCAwLCAwLCAwLCA0KTsKKworICAgIHJldHVybiA4OworfQorCisvKioKKyAqIERlY29tcHJlc3Mgb25lIGJsb2NrIG9mIGEgUkdUQzEgdGV4dHVyZSB3aXRoIHVuc2lnbmVkIGNvbXBvbmVudHMKKyAqIGFuZCBvdmVyd3JpdGUgdGhlIGFscGhhIGNvbXBvbmVudCBpbiAnZHN0JyAoUkdCQSBkYXRhKS4KKyAqCisgKiBAcGFyYW0gZHN0ICAgIG91dHB1dCBidWZmZXIuCisgKiBAcGFyYW0gc3RyaWRlIHNjYW5saW5lIGluIGJ5dGVzLgorICogQHBhcmFtIGJsb2NrICBibG9jayB0byBkZWNvbXByZXNzLgorICogQHJldHVybiBob3cgbXVjaCB0ZXh0dXJlIGRhdGEgaGFzIGJlZW4gY29uc3VtZWQuCisgKi8KK3N0YXRpYyBpbnQgcmd0YzF1X2FscGhhX2Jsb2NrKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spCit7CisgICAgcmd0YzFfYmxvY2tfaW50ZXJuYWwoZHN0LCBzdHJpZGUsIGJsb2NrLCAwLCAxLCAzLCA0KTsKKworICAgIHJldHVybiA4OworfQorCisvKioKKyAqIERlY29tcHJlc3Mgb25lIGJsb2NrIG9mIGEgUkdUQzEgdGV4dHVyZSB3aXRoIHVuc2lnbmVkIGNvbXBvbmVudHMKKyAqIHRvIEdyYXkgOC4KKyAqCisgKiBAcGFyYW0gZHN0ICAgIG91dHB1dCBidWZmZXIuCisgKiBAcGFyYW0gc3RyaWRlIHNjYW5saW5lIGluIGJ5dGVzLgorICogQHBhcmFtIGJsb2NrICBibG9jayB0byBkZWNvbXByZXNzLgorICogQHJldHVybiBob3cgbXVjaCB0ZXh0dXJlIGRhdGEgaGFzIGJlZW4gY29uc3VtZWQuCisgKi8KK3N0YXRpYyBpbnQgcmd0YzF1X2dyYXlfYmxvY2sodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jaykKK3sKKyAgICByZ3RjMV9ibG9ja19pbnRlcm5hbChkc3QsIHN0cmlkZSwgYmxvY2ssIDAsIDEsIDAsIDEpOwogCiAgICAgcmV0dXJuIDg7CiB9CkBAIC01MTYsOCArNTU0LDggQEAKICAgICBpbnQgeCwgeTsKIAogICAgIC8qIERlY29tcHJlc3MgdGhlIHR3byBjaGFubmVscyBzZXBhcmF0ZWx5IGFuZCBpbnRlcmxlYXZlIHRoZW0gYWZ0ZXJ3YXJkcy4gKi8KLSAgICByZ3RjMV9ibG9ja19pbnRlcm5hbChjMCwgMTYsIGJsb2NrLCBzaWduKTsKLSAgICByZ3RjMV9ibG9ja19pbnRlcm5hbChjMSwgMTYsIGJsb2NrICsgOCwgc2lnbik7CisgICAgcmd0YzFfYmxvY2tfaW50ZXJuYWwoYzAsIDE2LCBibG9jaywgc2lnbiwgMCwgMCwgNCk7CisgICAgcmd0YzFfYmxvY2tfaW50ZXJuYWwoYzEsIDE2LCBibG9jayArIDgsIHNpZ24sIDAsIDAsIDQpOwogCiAgICAgLyogQiBpcyByZWJ1aWx0IGV4YWN0bHkgbGlrZSBhIG5vcm1hbCBtYXAuICovCiAgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykgewpAQCAtNTk4LDE3ICs2MzYsMTkgQEAKIAogYXZfY29sZCB2b2lkIGZmX3RleHR1cmVkc3BfaW5pdChUZXh0dXJlRFNQQ29udGV4dCAqYykKIHsKLSAgICBjLT5keHQxX2Jsb2NrICAgPSBkeHQxX2Jsb2NrOwotICAgIGMtPmR4dDFhX2Jsb2NrICA9IGR4dDFhX2Jsb2NrOwotICAgIGMtPmR4dDJfYmxvY2sgICA9IGR4dDJfYmxvY2s7Ci0gICAgYy0+ZHh0M19ibG9jayAgID0gZHh0M19ibG9jazsKLSAgICBjLT5keHQ0X2Jsb2NrICAgPSBkeHQ0X2Jsb2NrOwotICAgIGMtPmR4dDVfYmxvY2sgICA9IGR4dDVfYmxvY2s7Ci0gICAgYy0+ZHh0NXlfYmxvY2sgID0gZHh0NXlfYmxvY2s7Ci0gICAgYy0+ZHh0NXlzX2Jsb2NrID0gZHh0NXlzX2Jsb2NrOwotICAgIGMtPnJndGMxc19ibG9jayA9IHJndGMxc19ibG9jazsKLSAgICBjLT5yZ3RjMXVfYmxvY2sgPSByZ3RjMXVfYmxvY2s7Ci0gICAgYy0+cmd0YzJzX2Jsb2NrID0gcmd0YzJzX2Jsb2NrOwotICAgIGMtPnJndGMydV9ibG9jayA9IHJndGMydV9ibG9jazsKLSAgICBjLT5keG4zZGNfYmxvY2sgPSBkeG4zZGNfYmxvY2s7CisgICAgYy0+ZHh0MV9ibG9jayAgICAgICAgID0gZHh0MV9ibG9jazsKKyAgICBjLT5keHQxYV9ibG9jayAgICAgICAgPSBkeHQxYV9ibG9jazsKKyAgICBjLT5keHQyX2Jsb2NrICAgICAgICAgPSBkeHQyX2Jsb2NrOworICAgIGMtPmR4dDNfYmxvY2sgICAgICAgICA9IGR4dDNfYmxvY2s7CisgICAgYy0+ZHh0NF9ibG9jayAgICAgICAgID0gZHh0NF9ibG9jazsKKyAgICBjLT5keHQ1X2Jsb2NrICAgICAgICAgPSBkeHQ1X2Jsb2NrOworICAgIGMtPmR4dDV5X2Jsb2NrICAgICAgICA9IGR4dDV5X2Jsb2NrOworICAgIGMtPmR4dDV5c19ibG9jayAgICAgICA9IGR4dDV5c19ibG9jazsKKyAgICBjLT5yZ3RjMXNfYmxvY2sgICAgICAgPSByZ3RjMXNfYmxvY2s7CisgICAgYy0+cmd0YzF1X2Jsb2NrICAgICAgID0gcmd0YzF1X2Jsb2NrOworICAgIGMtPnJndGMxdV9ncmF5X2Jsb2NrICA9IHJndGMxdV9ncmF5X2Jsb2NrOworICAgIGMtPnJndGMxdV9hbHBoYV9ibG9jayA9IHJndGMxdV9hbHBoYV9ibG9jazsKKyAgICBjLT5yZ3RjMnNfYmxvY2sgICAgICAgPSByZ3RjMnNfYmxvY2s7CisgICAgYy0+cmd0YzJ1X2Jsb2NrICAgICAgID0gcmd0YzJ1X2Jsb2NrOworICAgIGMtPmR4bjNkY19ibG9jayAgICAgICA9IGR4bjNkY19ibG9jazsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGV4dHVyZWRzcC5oIGIvbGliYXZjb2RlYy90ZXh0dXJlZHNwLmgKaW5kZXggMjZmM2I2NC4uOTBjZWIyYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90ZXh0dXJlZHNwLmgKKysrIGIvbGliYXZjb2RlYy90ZXh0dXJlZHNwLmgKQEAgLTQzLDE5ICs0MywyMSBAQAogI2RlZmluZSBURVhUVVJFX0JMT0NLX0ggNAogCiB0eXBlZGVmIHN0cnVjdCBUZXh0dXJlRFNQQ29udGV4dCB7Ci0gICAgaW50ICgqZHh0MV9ibG9jaykgICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKLSAgICBpbnQgKCpkeHQxYV9ibG9jaykgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOwotICAgIGludCAoKmR4dDJfYmxvY2spICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7Ci0gICAgaW50ICgqZHh0M19ibG9jaykgICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKLSAgICBpbnQgKCpkeHQ0X2Jsb2NrKSAgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOwotICAgIGludCAoKmR4dDVfYmxvY2spICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7Ci0gICAgaW50ICgqZHh0NXlfYmxvY2spICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKLSAgICBpbnQgKCpkeHQ1eXNfYmxvY2spKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOwotICAgIGludCAoKnJndGMxc19ibG9jaykodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7Ci0gICAgaW50ICgqcmd0YzF1X2Jsb2NrKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKLSAgICBpbnQgKCpyZ3RjMnNfYmxvY2spKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOwotICAgIGludCAoKnJndGMydV9ibG9jaykodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7Ci0gICAgaW50ICgqZHhuM2RjX2Jsb2NrKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKKyAgICBpbnQgKCpkeHQxX2Jsb2NrKSAgICAgICAgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOworICAgIGludCAoKmR4dDFhX2Jsb2NrKSAgICAgICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7CisgICAgaW50ICgqZHh0Ml9ibG9jaykgICAgICAgICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKKyAgICBpbnQgKCpkeHQzX2Jsb2NrKSAgICAgICAgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOworICAgIGludCAoKmR4dDRfYmxvY2spICAgICAgICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7CisgICAgaW50ICgqZHh0NV9ibG9jaykgICAgICAgICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKKyAgICBpbnQgKCpkeHQ1eV9ibG9jaykgICAgICAgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOworICAgIGludCAoKmR4dDV5c19ibG9jaykgICAgICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7CisgICAgaW50ICgqcmd0YzFzX2Jsb2NrKSAgICAgICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKKyAgICBpbnQgKCpyZ3RjMXVfYmxvY2spICAgICAgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOworICAgIGludCAoKnJndGMxdV9ncmF5X2Jsb2NrKSAodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7CisgICAgaW50ICgqcmd0YzF1X2FscGhhX2Jsb2NrKSh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKKyAgICBpbnQgKCpyZ3RjMnNfYmxvY2spICAgICAgKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgdWludDhfdCAqYmxvY2spOworICAgIGludCAoKnJndGMydV9ibG9jaykgICAgICAodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCB1aW50OF90ICpibG9jayk7CisgICAgaW50ICgqZHhuM2RjX2Jsb2NrKSAgICAgICh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKTsKIH0gVGV4dHVyZURTUENvbnRleHQ7CiAKIHZvaWQgZmZfdGV4dHVyZWRzcF9pbml0KFRleHR1cmVEU1BDb250ZXh0ICpjKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdGV4dHVyZWRzcGVuYy5jIGIvbGliYXZjb2RlYy90ZXh0dXJlZHNwZW5jLmMKaW5kZXggNzE2MDM5Ni4uM2Q2OGUwYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90ZXh0dXJlZHNwZW5jLmMKKysrIGIvbGliYXZjb2RlYy90ZXh0dXJlZHNwZW5jLmMKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgIGludCB4LCB5LCBrID0gMDsKICAgICBpbnQgYzBfcG9pbnQsIGhhbGZfcG9pbnQsIGMzX3BvaW50OwogICAgIHVpbnQ4X3QgY29sb3JbMTZdOwotICAgIGNvbnN0IGludCBpbmRleE1hcFs4XSA9IHsKKyAgICBzdGF0aWMgY29uc3QgaW50IGluZGV4TWFwWzhdID0gewogICAgICAgICAwIDw8IDMwLCAyIDw8IDMwLCAwIDw8IDMwLCAyIDw8IDMwLAogICAgICAgICAzIDw8IDMwLCAzIDw8IDMwLCAxIDw8IDMwLCAxIDw8IDMwLAogICAgIH07CkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICAgKiB0aGUgc2FtZSBpbnNpZGUgdGhhdCBzdWJpbnRlcnZhbC4KICAgICAgKgogICAgICAqIFJlbHlpbmcgb24gdGhpcyAxZCBhcHByb3hpbWF0aW9uIGlzbid0IGFsd2F5cyBvcHRpbWFsIGluIHRlcm1zIG9mCi0gICAgICogZXVjbGlkZWFuIGRpc3RhbmNlLCBidXQgaXQncyB2ZXJ5IGNsb3NlIGFuZCBhIGxvdCBmYXN0ZXIuCisgICAgICogRXVjbGlkZWFuIGRpc3RhbmNlLCBidXQgaXQncyB2ZXJ5IGNsb3NlIGFuZCBhIGxvdCBmYXN0ZXIuCiAgICAgICoKICAgICAgKiBodHRwOi8vY2Jsb29tcmFudHMuYmxvZ3Nwb3QuY29tLzIwMDgvMTIvMTItMDgtMDgtZHh0Yy1zdW1tYXJ5Lmh0bWwgKi8KICAgICBjMF9wb2ludCAgID0gKHN0b3BzWzFdICsgc3RvcHNbM10pID4+IDE7CkBAIC0zMDksNyArMzA5LDcgQEAKICAgICBpZiAoZmFicyh2ZmIpID4gbWFnbikKICAgICAgICAgbWFnbiA9IGZhYnModmZiKTsKIAotICAgIC8qIGlmIG1hZ25pdHVkbyBpcyB0b28gc21hbGwsIGRlZmF1bHQgdG8gbHVtaW5hbmNlICovCisgICAgLyogaWYgbWFnbml0dWRlIGlzIHRvbyBzbWFsbCwgZGVmYXVsdCB0byBsdW1pbmFuY2UgKi8KICAgICBpZiAobWFnbiA8IDQuMGYpIHsKICAgICAgICAgLyogSlBFRyBZQ2JDciBsdW1hIGNvZWZzLCBzY2FsZWQgYnkgMTAwMCAqLwogICAgICAgICB2X3IgPSAyOTk7CkBAIC0zNTksOCArMzU5LDggQEAKICAgICAvKiBBZGRpdGlvbmFsIG1hZ2ljIHRvIHNhdmUgYSBsb3Qgb2YgbXVsdGlwbGllcyBpbiB0aGUgYWNjdW11bGF0aW5nIGxvb3AuCiAgICAgICogVGhlIHRhYmxlcyBjb250YWluIHByZWNvbXB1dGVkIHByb2R1Y3RzIG9mIHdlaWdodHMgZm9yIGxlYXN0IHNxdWFyZXMKICAgICAgKiBzeXN0ZW0sIGFjY3VtdWxhdGVkIGluc2lkZSBvbmUgMzItYml0IHJlZ2lzdGVyICovCi0gICAgY29uc3QgaW50IHcxdGFiWzRdID0geyAzLCAwLCAyLCAxIH07Ci0gICAgY29uc3QgaW50IHByb2RzWzRdID0geyAweDA5MDAwMCwgMHgwMDA5MDAsIDB4MDQwMTAyLCAweDAxMDQwMiB9OworICAgIHN0YXRpYyBjb25zdCBpbnQgdzF0YWJbNF0gPSB7IDMsIDAsIDIsIDEgfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHByb2RzWzRdID0geyAweDA5MDAwMCwgMHgwMDA5MDAsIDB4MDQwMTAyLCAweDAxMDQwMiB9OwogCiAgICAgLyogQ2hlY2sgaWYgYWxsIHBpeGVscyBoYXZlIHRoZSBzYW1lIGluZGV4ICovCiAgICAgaWYgKChtYXNrIF4gKG1hc2sgPDwgMikpIDwgNCkgewpAQCAtNjQ3LDkgKzY0NywyNiBAQAogICAgIHJldHVybiAxNjsKIH0KIAorLyoqCisgKiBDb21wcmVzcyBvbmUgYmxvY2sgb2YgUkdCQSBwaXhlbHMgaW4gYSBSR1RDMVUgdGV4dHVyZSBhbmQgc3RvcmUgdGhlCisgKiByZXN1bHRpbmcgYnl0ZXMgaW4gJ2RzdCcuIFVzZSB0aGUgYWxwaGEgY2hhbm5lbCBvZiB0aGUgaW5wdXQgaW1hZ2UuCisgKgorICogQHBhcmFtIGRzdCAgICBvdXRwdXQgYnVmZmVyLgorICogQHBhcmFtIHN0cmlkZSBzY2FubGluZSBpbiBieXRlcy4KKyAqIEBwYXJhbSBibG9jayAgYmxvY2sgdG8gY29tcHJlc3MuCisgKiBAcmV0dXJuIGhvdyBtdWNoIHRleHR1cmUgZGF0YSBoYXMgYmVlbiB3cml0dGVuLgorICovCitzdGF0aWMgaW50IHJndGMxdV9hbHBoYV9ibG9jayh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKmJsb2NrKQoreworICAgIGNvbXByZXNzX2FscGhhKGRzdCwgc3RyaWRlLCBibG9jayk7CisKKyAgICByZXR1cm4gODsKK30KKwogYXZfY29sZCB2b2lkIGZmX3RleHR1cmVkc3BlbmNfaW5pdChUZXh0dXJlRFNQQ29udGV4dCAqYykKIHsKLSAgICBjLT5keHQxX2Jsb2NrICAgPSBkeHQxX2Jsb2NrOwotICAgIGMtPmR4dDVfYmxvY2sgICA9IGR4dDVfYmxvY2s7Ci0gICAgYy0+ZHh0NXlzX2Jsb2NrID0gZHh0NXlzX2Jsb2NrOworICAgIGMtPmR4dDFfYmxvY2sgICAgICAgICA9IGR4dDFfYmxvY2s7CisgICAgYy0+ZHh0NV9ibG9jayAgICAgICAgID0gZHh0NV9ibG9jazsKKyAgICBjLT5keHQ1eXNfYmxvY2sgICAgICAgPSBkeHQ1eXNfYmxvY2s7CisgICAgYy0+cmd0YzF1X2FscGhhX2Jsb2NrID0gcmd0YzF1X2FscGhhX2Jsb2NrOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90aHJlYWQuaCBiL2xpYmF2Y29kZWMvdGhyZWFkLmgKaW5kZXggYzg0OGQ3YS4uNTQwMTM1ZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90aHJlYWQuaAorKysgYi9saWJhdmNvZGVjL3RocmVhZC5oCkBAIC0yOSwxMiArMjksMTEgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKIAotI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRnJhbWUgewogICAgIEFWRnJhbWUgKmY7Ci0gICAgQVZDb2RlY0NvbnRleHQgKm93bmVyOworICAgIEFWQ29kZWNDb250ZXh0ICpvd25lclsyXTsKICAgICAvLyBwcm9ncmVzcy0+ZGF0YSBpcyBhbiBhcnJheSBvZiAyIGludHMgaG9sZGluZyBwcm9ncmVzcyBmb3IgdG9wL2JvdHRvbQogICAgIC8vIGZpZWxkcwogICAgIEFWQnVmZmVyUmVmICpwcm9ncmVzczsKQEAgLTEzMyw4ICsxMzIsMTAgQEAKIGludCBmZl90aHJlYWRfcmVmX2ZyYW1lKFRocmVhZEZyYW1lICpkc3QsIFRocmVhZEZyYW1lICpzcmMpOwogCiBpbnQgZmZfdGhyZWFkX2luaXQoQVZDb2RlY0NvbnRleHQgKnMpOworaW50IGZmX3NsaWNlX3RocmVhZF9leGVjdXRlX3dpdGhfbWFpbmZ1bmMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICBpbnQgKCphY3Rpb25fZnVuYzIpKEFWQ29kZWNDb250ZXh0ICpjLCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IHRocmVhZG5yKSwKKyAgICAgICAgaW50ICgqbWFpbl9mdW5jKShBVkNvZGVjQ29udGV4dCAqYyksIHZvaWQgKmFyZywgaW50ICpyZXQsIGludCBqb2JfY291bnQpOwogdm9pZCBmZl90aHJlYWRfZnJlZShBVkNvZGVjQ29udGV4dCAqcyk7Ci0KIGludCBmZl9hbGxvY19lbnRyaWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGNvdW50KTsKIHZvaWQgZmZfcmVzZXRfZW50cmllcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwogdm9pZCBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBmaWVsZCwgaW50IHRocmVhZCwgaW50IG4pOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90aWVydGV4c2Vxdi5jIGIvbGliYXZjb2RlYy90aWVydGV4c2Vxdi5jCmluZGV4IGRmMTJlZTMuLmFmMzlmNzQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdGllcnRleHNlcXYuYworKysgYi9saWJhdmNvZGVjL3RpZXJ0ZXhzZXF2LmMKQEAgLTI0LDggKzI0LDggQEAKICAqIFRpZXJ0ZXggTGltaXRlZCBTRVEgdmlkZW8gZGVjb2RlcgogICovCiAKLSNpbmNsdWRlICJhdmNvZGVjLmgiCiAjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC0yMTMsMTAgKzIxMywxNSBAQAogc3RhdGljIGF2X2NvbGQgaW50IHNlcXZpZGVvX2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBTZXFWaWRlb0NvbnRleHQgKnNlcSA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKIAogICAgIHNlcS0+YXZjdHggPSBhdmN0eDsKICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKIAorICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCAyNTYsIDEyOCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKICAgICBzZXEtPmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKICAgICBpZiAoIXNlcS0+ZnJhbWUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3RpZmYuYyBiL2xpYmF2Y29kZWMvdGlmZi5jCmluZGV4IDRiZTU4N2QuLjljMTNhNzUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdGlmZi5jCisrKyBiL2xpYmF2Y29kZWMvdGlmZi5jCkBAIC03NCw2ICs3NCw4IEBACiAgICAgaW50IGRlaW52ZXJ0X2J1Zl9zaXplOwogICAgIHVpbnQ4X3QgKnl1dl9saW5lOwogICAgIHVuc2lnbmVkIGludCB5dXZfbGluZV9zaXplOworICAgIHVpbnQ4X3QgKmZheF9idWZmZXI7CisgICAgdW5zaWduZWQgaW50IGZheF9idWZmZXJfc2l6ZTsKIAogICAgIGludCBnZW90YWdfY291bnQ7CiAgICAgVGlmZkdlb1RhZyAqZ2VvdGFnczsKQEAgLTIyNyw5ICsyMjksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc2VwLCBUaWZmQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCiB7CiAgICAgc3dpdGNoKHR5cGUpIHsKLSAgICBjYXNlIFRJRkZfRE9VQkxFOiByZXR1cm4gZmZfdGFkZF9kb3VibGVzX21ldGFkYXRhKGNvdW50LCBuYW1lLCBzZXAsICZzLT5nYiwgcy0+bGUsIGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGZyYW1lKSk7Ci0gICAgY2FzZSBUSUZGX1NIT1JUIDogcmV0dXJuIGZmX3RhZGRfc2hvcnRzX21ldGFkYXRhKGNvdW50LCBuYW1lLCBzZXAsICZzLT5nYiwgcy0+bGUsIDAsIGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGZyYW1lKSk7Ci0gICAgY2FzZSBUSUZGX1NUUklORzogcmV0dXJuIGZmX3RhZGRfc3RyaW5nX21ldGFkYXRhKGNvdW50LCBuYW1lLCAmcy0+Z2IsIHMtPmxlLCBhdnByaXZfZnJhbWVfZ2V0X21ldGFkYXRhcChmcmFtZSkpOworICAgIGNhc2UgVElGRl9ET1VCTEU6IHJldHVybiBmZl90YWRkX2RvdWJsZXNfbWV0YWRhdGEoY291bnQsIG5hbWUsIHNlcCwgJnMtPmdiLCBzLT5sZSwgJmZyYW1lLT5tZXRhZGF0YSk7CisgICAgY2FzZSBUSUZGX1NIT1JUIDogcmV0dXJuIGZmX3RhZGRfc2hvcnRzX21ldGFkYXRhKGNvdW50LCBuYW1lLCBzZXAsICZzLT5nYiwgcy0+bGUsIDAsICZmcmFtZS0+bWV0YWRhdGEpOworICAgIGNhc2UgVElGRl9TVFJJTkc6IHJldHVybiBmZl90YWRkX3N0cmluZ19tZXRhZGF0YShjb3VudCwgbmFtZSwgJnMtPmdiLCBzLT5sZSwgJmZyYW1lLT5tZXRhZGF0YSk7CiAgICAgZGVmYXVsdCAgICAgICAgIDogcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfTsKIH0KQEAgLTQwOCw3ICs0MTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNpemUsIGludCB3aWR0aCwgaW50IGxpbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpcF9zdGFydCwgaW50IGlzX3l1dikKIHsKLSAgICB1aW50NjRfdCBvdXRsZW4gPSB3aWR0aCAqIGxpbmVzOworICAgIHVpbnQ2NF90IG91dGxlbiA9IHdpZHRoICogKHVpbnQ2NF90KWxpbmVzOwogICAgIGludCByZXQsIGxpbmU7CiAgICAgdWludDhfdCAqYnVmID0gYXZfbWFsbG9jKG91dGxlbik7CiAgICAgaWYgKCFidWYpCkBAIC00NTIsOCArNDU0LDEwIEBACiB7CiAgICAgaW50IGksIHJldCA9IDA7CiAgICAgaW50IGxpbmU7Ci0gICAgdWludDhfdCAqc3JjMiA9IGF2X21hbGxvYygodW5zaWduZWQpc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICB1aW50OF90ICpzcmMyOworCisgICAgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKCZzLT5mYXhfYnVmZmVyLCAmcy0+ZmF4X2J1ZmZlcl9zaXplLCBzaXplKTsKKyAgICBzcmMyID0gcy0+ZmF4X2J1ZmZlcjsKIAogICAgIGlmICghc3JjMikgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKQEAgLTQ3NSw3ICs0NzksNiBAQAogICAgICAgICAgICAgaG9yaXpvbnRhbF9maWxsKHMtPmJwcCwgZHN0LCAxLCBkc3QsIDAsIHdpZHRoLCAwKTsKICAgICAgICAgICAgIGRzdCArPSBzdHJpZGU7CiAgICAgICAgIH0KLSAgICBhdl9mcmVlKHNyYzIpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTU2OCw3ICs1NzEsNyBAQAogICAgIGlmIChzLT5jb21wciA9PSBUSUZGX0NDSVRUX1JMRSB8fAogICAgICAgICBzLT5jb21wciA9PSBUSUZGX0czICAgICAgICB8fAogICAgICAgICBzLT5jb21wciA9PSBUSUZGX0c0KSB7Ci0gICAgICAgIGlmIChpc195dXYpCisgICAgICAgIGlmIChpc195dXYgfHwgcC0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfR1JBWTEyKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgcmV0dXJuIHRpZmZfdW5wYWNrX2ZheChzLCBkc3QsIHN0cmlkZSwgc3JjLCBzaXplLCB3aWR0aCwgbGluZXMpOwpAQCAtNzcyLDkgKzc3NSwxOCBAQAogICAgIGludCBvZmZzZXQgPSB0YWcgPT0gVElGRl9ZUkVTID8gMiA6IDA7CiAgICAgcy0+cmVzW29mZnNldCsrXSA9IG51bTsKICAgICBzLT5yZXNbb2Zmc2V0XSAgID0gZGVuOwotICAgIGlmIChzLT5yZXNbMF0gJiYgcy0+cmVzWzFdICYmIHMtPnJlc1syXSAmJiBzLT5yZXNbM10pCisgICAgaWYgKHMtPnJlc1swXSAmJiBzLT5yZXNbMV0gJiYgcy0+cmVzWzJdICYmIHMtPnJlc1szXSkgeworICAgICAgICB1aW50NjRfdCBudW0gPSBzLT5yZXNbMl0gKiAodWludDY0X3Qpcy0+cmVzWzFdOworICAgICAgICB1aW50NjRfdCBkZW4gPSBzLT5yZXNbMF0gKiAodWludDY0X3Qpcy0+cmVzWzNdOworICAgICAgICBpZiAobnVtID4gSU5UNjRfTUFYIHx8IGRlbiA+IElOVDY0X01BWCkgeworICAgICAgICAgICAgbnVtID0gbnVtID4+IDE7CisgICAgICAgICAgICBkZW4gPSBkZW4gPj4gMTsKKyAgICAgICAgfQogICAgICAgICBhdl9yZWR1Y2UoJnMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgJnMtPmF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKLSAgICAgICAgICAgICAgICAgIHMtPnJlc1syXSAqICh1aW50NjRfdClzLT5yZXNbMV0sIHMtPnJlc1swXSAqICh1aW50NjRfdClzLT5yZXNbM10sIElOVDMyX01BWCk7CisgICAgICAgICAgICAgICAgICBudW0sIGRlbiwgSU5UMzJfTUFYKTsKKyAgICAgICAgaWYgKCFzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pCisgICAgICAgICAgICBzLT5hdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKSB7MCwgMX07CisgICAgfQogfQogCiBzdGF0aWMgaW50IHRpZmZfZGVjb2RlX3RhZyhUaWZmQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCkBAIC04NjEsNiArODczLDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUSUZGX0NPTVBSOgogICAgICAgICBzLT5jb21wciAgICAgPSB2YWx1ZTsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJjb21wcmVzc2lvbjogJWRcbiIsIHMtPmNvbXByKTsKICAgICAgICAgcy0+cHJlZGljdG9yID0gMDsKICAgICAgICAgc3dpdGNoIChzLT5jb21wcikgewogICAgICAgICBjYXNlIFRJRkZfUkFXOgpAQCAtOTA0LDYgKzkxNywxMSBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIFRJRkZfU1RSSVBfT0ZGUzoKICAgICAgICAgaWYgKGNvdW50ID09IDEpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IElOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgInN0cmlwcG9zICV1IHRvbyBsYXJnZVxuIiwgdmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcy0+c3RyaXBwb3MgPSAwOwogICAgICAgICAgICAgcy0+c3RyaXBvZmYgPSB2YWx1ZTsKICAgICAgICAgfSBlbHNlCkBAIC05MTUsNiArOTMzLDExIEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVElGRl9TVFJJUF9TSVpFOgogICAgICAgICBpZiAoY291bnQgPT0gMSkgeworICAgICAgICAgICAgaWYgKHZhbHVlID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAic3RyaXBzaXplICV1IHRvbyBsYXJnZVxuIiwgdmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcy0+c3RyaXBzaXplc29mZiA9IDA7CiAgICAgICAgICAgICBzLT5zdHJpcHNpemUgICAgID0gdmFsdWU7CiAgICAgICAgICAgICBzLT5zdHJpcHMgICAgICAgID0gMTsKQEAgLTk4Niw2ICsxMDA5LDExIEBACiAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnBhbF9nYlsyXSwgY291bnQgLyAzICogb2ZmICogMik7CiAKICAgICAgICAgb2ZmID0gKHR5cGVfc2l6ZXNbdHlwZV0gLSAxKSA8PCAzOworICAgICAgICBpZiAob2ZmID4gMzFVKSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgInBhbGV0dGUgc2hpZnQgJWQgaXMgb3V0IG9mIHJhbmdlXG4iLCBvZmYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQgLyAzOyBpKyspIHsKICAgICAgICAgICAgIHVpbnQzMl90IHAgPSAweEZGMDAwMDAwOwogICAgICAgICAgICAgcCB8PSAoZmZfdGdldCgmcGFsX2diWzBdLCB0eXBlLCBzLT5sZSkgPj4gb2ZmKSA8PCAxNjsKQEAgLTEwMDgsNiArMTAzNiw3IEBACiAgICAgICAgICAgICBzLT5zdWJzYW1wbGluZ1tpXSA9IGZmX3RnZXQoJnMtPmdiLCB0eXBlLCBzLT5sZSk7CiAgICAgICAgICAgICBpZiAocy0+c3Vic2FtcGxpbmdbaV0gPD0gMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic3Vic2FtcGxpbmcgJWQgaXMgaW52YWxpZFxuIiwgcy0+c3Vic2FtcGxpbmdbaV0pOworICAgICAgICAgICAgICAgIHMtPnN1YnNhbXBsaW5nW2ldID0gMTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTAzNSw2ICsxMDY0LDEwIEBACiAgICAgICAgIEFERF9NRVRBREFUQShjb3VudCwgIk1vZGVsVGllcG9pbnRUYWciLCBOVUxMKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUSUZGX0dFT19LRVlfRElSRUNUT1JZOgorICAgICAgICBpZiAocy0+Z2VvdGFnX2NvdW50KSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJNdWx0aXBsZSBnZW8ga2V5IGRpcmVjdG9yaWVzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAgICAgICAgIEFERF9NRVRBREFUQSgxLCAiR2VvVElGRl9WZXJzaW9uIiwgTlVMTCk7CiAgICAgICAgIEFERF9NRVRBREFUQSgyLCAiR2VvVElGRl9LZXlfUmV2aXNpb24iLCAiLiIpOwogICAgICAgICBzLT5nZW90YWdfY291bnQgICA9IGZmX3RnZXRfc2hvcnQoJnMtPmdiLCBzLT5sZSk7CkBAIC0xMDQyLDcgKzEwNzUsOCBAQAogICAgICAgICAgICAgcy0+Z2VvdGFnX2NvdW50ID0gY291bnQgLyA0IC0gMTsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJHZW9USUZGIGtleSBkaXJlY3RvcnkgYnVmZmVyIHNob3J0ZXIgdGhhbiBzcGVjaWZpZWRcbiIpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcy0+Z2IpIDwgcy0+Z2VvdGFnX2NvdW50ICogc2l6ZW9mKGludDE2X3QpICogNCkgeworICAgICAgICBpZiAoICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJnMtPmdiKSA8IHMtPmdlb3RhZ19jb3VudCAqIHNpemVvZihpbnQxNl90KSAqIDQKKyAgICAgICAgICAgIHx8IHMtPmdlb3RhZ19jb3VudCA9PSAwKSB7CiAgICAgICAgICAgICBzLT5nZW90YWdfY291bnQgPSAwOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC0xMDgwLDYgKzExMTQsOCBAQAogICAgICAgICAgICAgICAgIGlmIChzLT5nZW90YWdzW2ldLmNvdW50ID09IDAKICAgICAgICAgICAgICAgICAgICAgfHwgcy0+Z2VvdGFnc1tpXS5vZmZzZXQgKyBzLT5nZW90YWdzW2ldLmNvdW50ID4gY291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgR2VvVElGRiBrZXkgJWRcbiIsIHMtPmdlb3RhZ3NbaV0ua2V5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmdlb3RhZ3NbaV0udmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEdXBsaWNhdGUgR2VvVElGRiBrZXkgJWRcbiIsIHMtPmdlb3RhZ3NbaV0ua2V5KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBjaGFyICphcCA9IGRvdWJsZXMyc3RyKCZkcFtzLT5nZW90YWdzW2ldLm9mZnNldF0sIHMtPmdlb3RhZ3NbaV0uY291bnQsICIsICIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWFwKSB7CkBAIC0xMTA2LDYgKzExNDIsOCBAQAogICAgICAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZzLT5nYiwgcG9zICsgcy0+Z2VvdGFnc1tpXS5vZmZzZXQsIFNFRUtfU0VUKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZzLT5nYikgPCBzLT5nZW90YWdzW2ldLmNvdW50KQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5nZW90YWdzW2ldLnZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgICAgICBhcCA9IGF2X21hbGxvYyhzLT5nZW90YWdzW2ldLmNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIHRlbXBvcmFyeSBidWZmZXJcbiIpOwpAQCAtMTIyNSw3ICsxMjYzLDcgQEAKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUeXBlIG9mIEdlb1RJRkYga2V5ICVkIGlzIHdyb25nXG4iLCBzLT5nZW90YWdzW2ldLmtleSk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICByZXQgPSBhdl9kaWN0X3NldChhdnByaXZfZnJhbWVfZ2V0X21ldGFkYXRhcChwKSwga2V5bmFtZSwgcy0+Z2VvdGFnc1tpXS52YWwsIDApOworICAgICAgICByZXQgPSBhdl9kaWN0X3NldCgmcC0+bWV0YWRhdGEsIGtleW5hbWUsIHMtPmdlb3RhZ3NbaV0udmFsLCAwKTsKICAgICAgICAgaWYgKHJldDwwKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIldyaXRpbmcgbWV0YWRhdGEgd2l0aCBrZXkgJyVzJyBmYWlsZWRcbiIsIGtleW5hbWUpOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTEyNjgsNiArMTMwNiw4IEBACiAgICAgICAgIHN0cmlkZSA9IHAtPmxpbmVzaXplW3BsYW5lXTsKICAgICAgICAgZHN0ID0gcC0+ZGF0YVtwbGFuZV07CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oZWlnaHQ7IGkgKz0gcy0+cnBzKSB7CisgICAgICAgICAgICBpZiAoaSkKKyAgICAgICAgICAgICAgICBkc3QgKz0gcy0+cnBzICogc3RyaWRlOwogICAgICAgICAgICAgaWYgKHMtPnN0cmlwc2l6ZXNvZmYpCiAgICAgICAgICAgICAgICAgc3NpemUgPSBmZl90Z2V0KCZzdHJpcHNpemVzLCBzLT5zc3R5cGUsIGxlKTsKICAgICAgICAgICAgIGVsc2UKQEAgLTEyODgsNyArMTMyOCw2IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3QgKz0gcy0+cnBzICogc3RyaWRlOwogICAgICAgICB9CiAgICAgICAgIGlmIChzLT5wcmVkaWN0b3IgPT0gMikgewogICAgICAgICAgICAgaWYgKHMtPnBob3RvbWV0cmljID09IFRJRkZfUEhPVE9NRVRSSUNfWUNCQ1IpIHsKQEAgLTEzMzIsMTAgKzEzNzEsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzLT5waG90b21ldHJpYyA9PSBUSUZGX1BIT1RPTUVUUklDX1dISVRFX0lTX1pFUk8pIHsKKyAgICAgICAgICAgIGludCBjID0gKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCA/ICgxPDxzLT5icHApIC0gMSA6IDI1NSk7CiAgICAgICAgICAgICBkc3QgPSBwLT5kYXRhW3BsYW5lXTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5oZWlnaHQ7IGkrKykgewogICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdHJpZGU7IGorKykKLSAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gKHMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCA/ICgxPDxzLT5icHApIC0gMSA6IDI1NSkgLSBkc3Rbal07CisgICAgICAgICAgICAgICAgICAgIGRzdFtqXSA9IGMgLSBkc3Rbal07CiAgICAgICAgICAgICAgICAgZHN0ICs9IHN0cmlkZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTM3Niw2ICsxNDE2LDkgQEAKIAogICAgIGZmX2x6d19kZWNvZGVfY2xvc2UoJnMtPmx6dyk7CiAgICAgYXZfZnJlZXAoJnMtPmRlaW52ZXJ0X2J1Zik7CisgICAgcy0+ZGVpbnZlcnRfYnVmX3NpemUgPSAwOworICAgIGF2X2ZyZWVwKCZzLT5mYXhfYnVmZmVyKTsKKyAgICBzLT5mYXhfYnVmZmVyX3NpemUgPSAwOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3RpZmZfY29tbW9uLmMgYi9saWJhdmNvZGVjL3RpZmZfY29tbW9uLmMKaW5kZXggMzUxMTlhZi4uMGFmNjJlZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90aWZmX2NvbW1vbi5jCisrKyBiL2xpYmF2Y29kZWMvdGlmZl9jb21tb24uYwpAQCAtOTcsNyArOTcsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgIG5vbSAgID0gZmZfdGdldF9sb25nKGdiLCBsZSk7CiAgICAgICAgIGRlbm9tID0gZmZfdGdldF9sb25nKGdiLCBsZSk7Ci0gICAgICAgIGF2X2JwcmludGYoJmJwLCAiJXMlN2k6JS03aSIsIGF1dG9fc2VwKGNvdW50LCBzZXAsIGksIDQpLCBub20sIGRlbm9tKTsKKyAgICAgICAgYXZfYnByaW50ZigmYnAsICIlcyU3IlBSSWQzMiI6JS03IlBSSWQzMiwgYXV0b19zZXAoY291bnQsIHNlcCwgaSwgNCksIG5vbSwgZGVub20pOwogICAgIH0KIAogICAgIGlmICgoaSA9IGF2X2JwcmludF9maW5hbGl6ZSgmYnAsICZhcCkpKSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3RpZmZlbmMuYyBiL2xpYmF2Y29kZWMvdGlmZmVuYy5jCmluZGV4IDNkMzdkMmUuLmY1OTgxNmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdGlmZmVuYy5jCisrKyBiL2xpYmF2Y29kZWMvdGlmZmVuYy5jCkBAIC0yNjUsNiArMjY1LDkgQEAKICAgICBzLT5zdWJzYW1wbGluZ1swXSA9IDE7CiAgICAgcy0+c3Vic2FtcGxpbmdbMV0gPSAxOwogCisgICAgaWYgKCFkZXNjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCiAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9CiAgICAgcy0+YnBwICAgICAgICAgID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpOwogICAgIHMtPmJwcF90YWJfc2l6ZSA9IGRlc2MtPm5iX2NvbXBvbmVudHM7CkBAIC01MjEsNiArNTI0LDE1IEBACiBzdGF0aWMgYXZfY29sZCBpbnQgZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIFRpZmZFbmNvZGVyQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyNpZiAhQ09ORklHX1pMSUIKKyAgICBpZiAocy0+Y29tcHIgPT0gVElGRl9ERUZMQVRFKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkRlZmxhdGUgY29tcHJlc3Npb24gbmVlZHMgemxpYiBjb21waWxlZCBpblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorI2VuZGlmCisKICNpZiBGRl9BUElfQ09ERURfRlJBTUUKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICAgICBhdmN0eC0+Y29kZWRfZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOwpAQCAtNTUxLDkgKzU2Myw3IEBACiAgICAgeyAicGFja2JpdHMiLCAgICAgICAgIE5VTEwsIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUSUZGX1BBQ0tCSVRTIH0sIDAsICAgICAgICAwLCAgICAgICAgICAgIFZFLCAiY29tcHJlc3Npb25fYWxnbyIgfSwKICAgICB7ICJyYXciLCAgICAgICAgICAgICAgTlVMTCwgMCwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFRJRkZfUkFXICAgICAgfSwgMCwgICAgICAgIDAsICAgICAgICAgICAgVkUsICJjb21wcmVzc2lvbl9hbGdvIiB9LAogICAgIHsgImx6dyIsICAgICAgICAgICAgICBOVUxMLCAwLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVElGRl9MWlcgICAgICB9LCAwLCAgICAgICAgMCwgICAgICAgICAgICBWRSwgImNvbXByZXNzaW9uX2FsZ28iIH0sCi0jaWYgQ09ORklHX1pMSUIKICAgICB7ICJkZWZsYXRlIiwgICAgICAgICAgTlVMTCwgMCwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFRJRkZfREVGTEFURSAgfSwgMCwgICAgICAgIDAsICAgICAgICAgICAgVkUsICJjb21wcmVzc2lvbl9hbGdvIiB9LAotI2VuZGlmCiAgICAgeyBOVUxMIH0sCiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3RyYWNlX2hlYWRlcnNfYnNmLmMgYi9saWJhdmNvZGVjL3RyYWNlX2hlYWRlcnNfYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhM2VmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdHJhY2VfaGVhZGVyc19ic2YuYwpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisKKyNpbmNsdWRlICJic2YuaCIKKyNpbmNsdWRlICJjYnMuaCIKKworCit0eXBlZGVmIHN0cnVjdCBUcmFjZUhlYWRlcnNDb250ZXh0IHsKKyAgICBDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmNiYzsKK30gVHJhY2VIZWFkZXJzQ29udGV4dDsKKworCitzdGF0aWMgaW50IHRyYWNlX2hlYWRlcnNfaW5pdChBVkJTRkNvbnRleHQgKmJzZikKK3sKKyAgICBUcmFjZUhlYWRlcnNDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gZmZfY2JzX2luaXQoJmN0eC0+Y2JjLCBic2YtPnBhcl9pbi0+Y29kZWNfaWQsIGJzZik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBjdHgtPmNiYy0+dHJhY2VfZW5hYmxlID0gMTsKKyAgICBjdHgtPmNiYy0+dHJhY2VfbGV2ZWwgID0gQVZfTE9HX0lORk87CisKKyAgICBpZiAoYnNmLT5wYXJfaW4tPmV4dHJhZGF0YSkgeworICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50IHBzOworCisgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19JTkZPLCAiRXh0cmFkYXRhXG4iKTsKKworICAgICAgICBlcnIgPSBmZl9jYnNfcmVhZF9leHRyYWRhdGEoY3R4LT5jYmMsICZwcywgYnNmLT5wYXJfaW4pOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlYWQgZXh0cmFkYXRhLlxuIik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChjdHgtPmNiYywgJnBzKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHJhY2VfaGVhZGVyc19jbG9zZShBVkJTRkNvbnRleHQgKmJzZikKK3sKKyAgICBUcmFjZUhlYWRlcnNDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKworICAgIGZmX2Nic19jbG9zZSgmY3R4LT5jYmMpOworfQorCitzdGF0aWMgaW50IHRyYWNlX2hlYWRlcnMoQVZCU0ZDb250ZXh0ICpic2YsIEFWUGFja2V0ICpwa3QpCit7CisgICAgVHJhY2VIZWFkZXJzQ29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCBhdTsKKyAgICBjaGFyIHRtcFsyNTZdID0geyAwIH07CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX2JzZl9nZXRfcGFja2V0X3JlZihic2YsIHBrdCk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkKKyAgICAgICAgYXZfc3RybGNhdCh0bXAsICIsIGtleSBmcmFtZSIsIHNpemVvZih0bXApKTsKKyAgICBpZiAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0NPUlJVUFQpCisgICAgICAgIGF2X3N0cmxjYXQodG1wLCAiLCBjb3JydXB0Iiwgc2l6ZW9mKHRtcCkpOworCisgICAgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBhdl9zdHJsY2F0Zih0bXAsIHNpemVvZih0bXApLCAiLCBwdHMgJSJQUklkNjQsIHBrdC0+cHRzKTsKKyAgICBlbHNlCisgICAgICAgIGF2X3N0cmxjYXQodG1wLCAiLCBubyBwdHMiLCBzaXplb2YodG1wKSk7CisgICAgaWYgKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBhdl9zdHJsY2F0Zih0bXAsIHNpemVvZih0bXApLCAiLCBkdHMgJSJQUklkNjQsIHBrdC0+ZHRzKTsKKyAgICBlbHNlCisgICAgICAgIGF2X3N0cmxjYXQodG1wLCAiLCBubyBkdHMiLCBzaXplb2YodG1wKSk7CisgICAgaWYgKHBrdC0+ZHVyYXRpb24gPiAwKQorICAgICAgICBhdl9zdHJsY2F0Zih0bXAsIHNpemVvZih0bXApLCAiLCBkdXJhdGlvbiAlIlBSSWQ2NCwgcGt0LT5kdXJhdGlvbik7CisKKyAgICBhdl9sb2coYnNmLCBBVl9MT0dfSU5GTywgIlBhY2tldDogJWQgYnl0ZXMlcy5cbiIsIHBrdC0+c2l6ZSwgdG1wKTsKKworICAgIGVyciA9IGZmX2Nic19yZWFkX3BhY2tldChjdHgtPmNiYywgJmF1LCBwa3QpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGZmX2Nic19mcmFnbWVudF91bmluaXQoY3R4LT5jYmMsICZhdSk7CisKKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgZmZfdHJhY2VfaGVhZGVyc19ic2YgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInRyYWNlX2hlYWRlcnMiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUcmFjZUhlYWRlcnNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSAmdHJhY2VfaGVhZGVyc19pbml0LAorICAgIC5jbG9zZSAgICAgICAgICA9ICZ0cmFjZV9oZWFkZXJzX2Nsb3NlLAorICAgIC5maWx0ZXIgICAgICAgICA9ICZ0cmFjZV9oZWFkZXJzLAorICAgIC5jb2RlY19pZHMgICAgICA9IGZmX2Nic19hbGxfY29kZWNfaWRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjEuYyBiL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjEuYwppbmRleCBkYTg0M2M0Li5lMTgyNDM4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3RydWVtb3Rpb24xLmMKKysrIGIvbGliYXZjb2RlYy90cnVlbW90aW9uMS5jCkBAIC0xNzcsMTAgKzE3NywxMCBAQAogICAgIGludCBsbywgaGk7CiAKICAgICBsbyA9IHlkdFtwMV07Ci0gICAgbG8gKz0gKGxvIDw8IDUpICsgKGxvIDw8IDEwKTsKKyAgICBsbyArPSAobG8gKiAzMikgKyAobG8gKiAxMDI0KTsKICAgICBoaSA9IHlkdFtwMl07Ci0gICAgaGkgKz0gKGhpIDw8IDUpICsgKGhpIDw8IDEwKTsKLSAgICByZXR1cm4gKGxvICsgKGhpIDw8IDE2KSkgPDwgMTsKKyAgICBoaSArPSAoaGkgKiAzMikgKyAoaGkgKiAxMDI0KTsKKyAgICByZXR1cm4gKGxvICsgKGhpICogKDFVIDw8IDE2KSkpICogMjsKIH0KIAogc3RhdGljIGludCBtYWtlX2NkdDE1X2VudHJ5KGludCBwMSwgaW50IHAyLCBpbnQxNl90ICpjZHQpCkBAIC0xODgsOSArMTg4LDkgQEAKICAgICBpbnQgciwgYiwgbG87CiAKICAgICBiID0gY2R0W3AyXTsKLSAgICByID0gY2R0W3AxXSA8PCAxMDsKKyAgICByID0gY2R0W3AxXSAqIDEwMjQ7CiAgICAgbG8gPSBiICsgcjsKLSAgICByZXR1cm4gKGxvICsgKGxvIDw8IDE2KSkgPDwgMTsKKyAgICByZXR1cm4gKGxvICsgKGxvICogKDFVIDw8IDE2KSkpICogMjsKIH0KIAogI2lmIEhBVkVfQklHRU5ESUFOCkBAIC00ODksOCArNDg5LDEwIEBACiAgICAgLyogdGhlcmUgaXMgYSB2ZXJ0aWNhbCBwcmVkaWN0b3IgZm9yIGVhY2ggcGl4ZWwgaW4gYSBsaW5lOyBlYWNoIHZlcnRpY2FsCiAgICAgICogcHJlZGljdG9yIGlzIDAgdG8gc3RhcnQgd2l0aCAqLwogICAgIGF2X2Zhc3RfbWFsbG9jKCZzLT52ZXJ0X3ByZWQsICZzLT52ZXJ0X3ByZWRfc2l6ZSwgcy0+YXZjdHgtPndpZHRoICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOwotICAgIGlmICghcy0+dmVydF9wcmVkKQorICAgIGlmICghcy0+dmVydF9wcmVkKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjIuYyBiL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjIuYwppbmRleCAyNDVhMzJhLi5iYzNmMTY4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3RydWVtb3Rpb24yLmMKKysrIGIvbGliYXZjb2RlYy90cnVlbW90aW9uMi5jCkBAIC02Myw2ICs2Myw3IEBACiAgICAgQVZGcmFtZSAqcGljOwogCiAgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgZXJyb3I7CiAgICAgQnN3YXBEU1BDb250ZXh0IGJkc3A7CiAKICAgICB1aW50OF90ICpidWZmZXI7CkBAIC0yNzIsNyArMjczLDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgZDsgaSsrKSB7CiAgICAgICAgIHYgPSBnZXRfYml0c19sb25nKCZjdHgtPmdiLCBtYik7CiAgICAgICAgIGlmICh2ICYgKDEgPDwgKG1iIC0gMSkpKQotICAgICAgICAgICAgY3R4LT5kZWx0YXNbc3RyZWFtX2lkXVtpXSA9IHYgLSAoMSA8PCBtYik7CisgICAgICAgICAgICBjdHgtPmRlbHRhc1tzdHJlYW1faWRdW2ldID0gdiAtICgxVSA8PCBtYik7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGN0eC0+ZGVsdGFzW3N0cmVhbV9pZF1baV0gPSB2OwogICAgIH0KQEAgLTI5OCwxNSArMjk5LDE1IEBACiAgICAgLyogZ2V0IHN0cmVhbSBsZW5ndGggaW4gZHdvcmRzICovCiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGJ1ZiwgYnVmX3NpemUpOwogICAgIGxlbiAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOwotICAgIHNraXAgPSBsZW4gKiA0ICsgNDsKIAogICAgIGlmIChsZW4gPT0gMCkKICAgICAgICAgcmV0dXJuIDQ7CiAKLSAgICBpZiAobGVuID49IElOVF9NQVggLyA0IC0gMSB8fCBsZW4gPCAwIHx8IHNraXAgPiBidWZfc2l6ZSkgeworICAgIGlmIChsZW4gPj0gSU5UX01BWCAvIDQgLSAxIHx8IGxlbiA8IDAgfHwgbGVuICogNCArIDQgPiBidWZfc2l6ZSkgewogICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IsIGludmFsaWQgc3RyZWFtIHNpemUuXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQorICAgIHNraXAgPSBsZW4gKiA0ICsgNDsKIAogICAgIHRva3MgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOwogICAgIGlmICh0b2tzICYgMSkgewpAQCAtMzk4LDYgKzM5OSw3IEBACiB7CiAgICAgaWYgKGN0eC0+dG9rX3B0cnNbdHlwZV0gPj0gY3R4LT50b2tfbGVuc1t0eXBlXSkgewogICAgICAgICBhdl9sb2coY3R4LT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVhZCB0b2tlbiBmcm9tIHN0cmVhbSAlaSBvdXQgb2YgYm91bmRzICglaT49JWkpXG4iLCB0eXBlLCBjdHgtPnRva19wdHJzW3R5cGVdLCBjdHgtPnRva19sZW5zW3R5cGVdKTsKKyAgICAgICAgY3R4LT5lcnJvciA9IDE7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBpZiAodHlwZSA8PSBUTTJfTU9UKSB7CkBAIC00NDEsMTUgKzQ0MywxNSBAQAogCiAvKiByZWNhbGN1bGF0ZSBsYXN0IGFuZCBkZWx0YSB2YWx1ZXMgZm9yIG5leHQgYmxvY2tzICovCiAjZGVmaW5lIFRNMl9SRUNBTENfQkxPQ0soQ0hSLCBzdHJpZGUsIGxhc3QsIENEKSB7XAotICAgIENEWzBdID0gQ0hSWzFdIC0gbGFzdFsxXTtcCi0gICAgQ0RbMV0gPSAoaW50KUNIUltzdHJpZGUgKyAxXSAtIChpbnQpQ0hSWzFdO1wKKyAgICBDRFswXSA9ICh1bnNpZ25lZClDSFJbICAgICAgICAgMV0gLSAodW5zaWduZWQpbGFzdFsxXTtcCisgICAgQ0RbMV0gPSAodW5zaWduZWQpQ0hSW3N0cmlkZSArIDFdIC0gKHVuc2lnbmVkKSBDSFJbMV07XAogICAgIGxhc3RbMF0gPSAoaW50KUNIUltzdHJpZGUgKyAwXTtcCiAgICAgbGFzdFsxXSA9IChpbnQpQ0hSW3N0cmlkZSArIDFdO30KIAogLyogY29tbW9uIG9wZXJhdGlvbnMgLSBhZGQgZGVsdGFzIHRvIDR4NCBibG9jayBvZiBsdW1hIG9yIDJ4MiBibG9ja3Mgb2YgY2hyb21hICovCiBzdGF0aWMgaW5saW5lIHZvaWQgdG0yX2FwcGx5X2RlbHRhcyhUTTJDb250ZXh0ICpjdHgsIGludCogWSwgaW50IHN0cmlkZSwgaW50ICpkZWx0YXMsIGludCAqbGFzdCkKIHsKLSAgICBpbnQgY3QsIGQ7CisgICAgdW5zaWduZWQgY3QsIGQ7CiAgICAgaW50IGksIGo7CiAKICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKXsKQEAgLTQ2NSw3ICs0NjcsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRtMl9oaWdoX2Nocm9tYShpbnQgKmRhdGEsIGludCBzdHJpZGUsIGludCAqbGFzdCwgaW50ICpDRCwgaW50ICpkZWx0YXMpCitzdGF0aWMgaW5saW5lIHZvaWQgdG0yX2hpZ2hfY2hyb21hKGludCAqZGF0YSwgaW50IHN0cmlkZSwgaW50ICpsYXN0LCB1bnNpZ25lZCAqQ0QsIGludCAqZGVsdGFzKQogewogICAgIGludCBpLCBqOwogICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKQEAgLTQ3OCw3ICs0ODAsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHRtMl9sb3dfY2hyb21hKGludCAqZGF0YSwgaW50IHN0cmlkZSwgaW50ICpjbGFzdCwgaW50ICpDRCwgaW50ICpkZWx0YXMsIGludCBieCkKK3N0YXRpYyBpbmxpbmUgdm9pZCB0bTJfbG93X2Nocm9tYShpbnQgKmRhdGEsIGludCBzdHJpZGUsIGludCAqY2xhc3QsIHVuc2lnbmVkICpDRCwgaW50ICpkZWx0YXMsIGludCBieCkKIHsKICAgICBpbnQgdDsKICAgICBpbnQgbDsKQEAgLTQ4OCw4ICs0OTAsOCBAQAogICAgICAgICBwcmV2ID0gY2xhc3RbLTNdOwogICAgIGVsc2UKICAgICAgICAgcHJldiA9IDA7Ci0gICAgdCAgICAgICAgPSAoQ0RbMF0gKyBDRFsxXSkgPj4gMTsKLSAgICBsICAgICAgICA9IChwcmV2IC0gQ0RbMF0gLSBDRFsxXSArIGNsYXN0WzFdKSA+PiAxOworICAgIHQgICAgICAgID0gKGludCkoQ0RbMF0gKyBDRFsxXSkgPj4gMTsKKyAgICBsICAgICAgICA9IChpbnQpKHByZXYgLSBDRFswXSAtIENEWzFdICsgY2xhc3RbMV0pID4+IDE7CiAgICAgQ0RbMV0gICAgPSBDRFswXSArIENEWzFdIC0gdDsKICAgICBDRFswXSAgICA9IHQ7CiAgICAgY2xhc3RbMF0gPSBsOwpAQCAtNTg1LDcgKzU4Nyw4IEBACiB7CiAgICAgaW50IGk7CiAgICAgaW50IGN0OwotICAgIGludCBsZWZ0LCByaWdodCwgZGlmZjsKKyAgICB1bnNpZ25lZCBsZWZ0LCByaWdodDsKKyAgICBpbnQgZGlmZjsKICAgICBpbnQgZGVsdGFzWzE2XTsKICAgICBUTTJfSU5JVF9QT0lOVEVSUygpOwogCkBAIC04MDksNiArODEyLDggQEAKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIlNraXBwaW5nIHVua25vd24gYmxvY2sgdHlwZSAlaVxuIiwgdHlwZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3R4LT5lcnJvcikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODg5LDYgKzg5NCw4IEBACiAgICAgaW50IG9mZnNldCAgICAgICAgICAgPSBUTTJfSEVBREVSX1NJWkU7CiAgICAgaW50IGksIHQsIHJldDsKIAorICAgIGwtPmVycm9yID0gMDsKKwogICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmbC0+YnVmZmVyLCAmbC0+YnVmZmVyX3NpemUsIGJ1Zl9zaXplKTsKICAgICBpZiAoIWwtPmJ1ZmZlcikgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSB0ZW1wb3JhcnkgYnVmZmVyXG4iKTsKQEAgLTkxNSw3ICs5MjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplIC0gb2Zmc2V0KTsKICAgICAgICAgaWYgKHQgPCAwKSB7CiAgICAgICAgICAgICBpbnQgaiA9IHRtMl9zdHJlYW1fb3JkZXJbaV07Ci0gICAgICAgICAgICBtZW1zZXQobC0+dG9rZW5zW2pdLCAwLCBzaXplb2YoKipsLT50b2tlbnMpICogbC0+dG9rX2xlbnNbal0pOworICAgICAgICAgICAgaWYgKGwtPnRva19sZW5zW2pdKQorICAgICAgICAgICAgICAgIG1lbXNldChsLT50b2tlbnNbal0sIDAsIHNpemVvZigqKmwtPnRva2VucykgKiBsLT50b2tfbGVuc1tqXSk7CiAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgfQogICAgICAgICBvZmZzZXQgKz0gdDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjJydC5jIGIvbGliYXZjb2RlYy90cnVlbW90aW9uMnJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhYjk5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdHJ1ZW1vdGlvbjJydC5jCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogRHVjayBUcnVlTW90aW9uIDIuMCBSZWFsIFRpbWUgZGVjb2RlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQorI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFRydWVNb3Rpb24yUlRDb250ZXh0IHsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIGludCBkZWx0YV9zaXplOworICAgIGludCBoc2NhbGU7Cit9IFRydWVNb3Rpb24yUlRDb250ZXh0OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWIyW10gPSB7CisgICAgNSwgLTcsIDM2LCAtMzYsCit9OworCitzdGF0aWMgY29uc3QgaW50MTZfdCBkZWx0YV90YWIzW10gPSB7CisgICAgMiwgLTMsIDgsIC04LCAxOCwgLTE4LCAzNiwgLTM2LAorfTsKKworc3RhdGljIGNvbnN0IGludDE2X3QgZGVsdGFfdGFiNFtdID0geworICAgIDEsIC0xLCAyLCAtMywgOCwgLTgsIDE4LCAtMTgsIDM2LCAtMzYsIDU0LCAtNTQsIDk2LCAtOTYsIDE0NCwgLTE0NCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQxNl90ICpjb25zdCBkZWx0YV90YWJzW10gPSB7CisgICAgZGVsdGFfdGFiMiwgZGVsdGFfdGFiMywgZGVsdGFfdGFiNCwKK307CisKKy8qIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBmcm9tIHRoZSBieXRlc3RyZWFtLCBvcgorICogQVZFUlJPUl9JTlZBTElEREFUQSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZGVjb2RpbmcgdGhlIGhlYWRlci4gKi8KK3N0YXRpYyBpbnQgdHJ1ZW1vdGlvbjJydF9kZWNvZGVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIFRydWVNb3Rpb24yUlRDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaGVhZGVyX3NpemU7CisgICAgdWludDhfdCBoZWFkZXJfYnVmZmVyWzEyOF0gPSB7IDAgfTsgIC8qIGxvZ2ljYWwgbWF4aW11bSBoZWFkZXIgc2l6ZSAqLworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCBzaXplID0gYXZwa3QtPnNpemU7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmIChzaXplIDwgMSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0IHBhY2tldCB0b28gc21hbGwgKCVkKVxuIiwgc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGhlYWRlcl9zaXplID0gKChidWZbMF0gPj4gNSkgfCAoYnVmWzBdIDw8IDMpKSAmIDB4N2Y7CisgICAgaWYgKGhlYWRlcl9zaXplIDwgMTApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGhlYWRlciBzaXplICglZClcbiIsIGhlYWRlcl9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKGhlYWRlcl9zaXplICsgMSA+IHNpemUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dCBwYWNrZXQgdG9vIHNtYWxsICglZClcbiIsIHNpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiB1bnNjcmFtYmxlIHRoZSBoZWFkZXIgYnl0ZXMgd2l0aCBhIFhPUiBvcGVyYXRpb24gKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgaGVhZGVyX3NpemU7IGkrKykKKyAgICAgICAgaGVhZGVyX2J1ZmZlcltpIC0gMV0gPSBidWZbaV0gXiBidWZbaSArIDFdOworCisgICAgcy0+ZGVsdGFfc2l6ZSA9IGhlYWRlcl9idWZmZXJbMV07CisgICAgcy0+aHNjYWxlID0gMSArICEhaGVhZGVyX2J1ZmZlclszXTsKKyAgICBpZiAocy0+ZGVsdGFfc2l6ZSA8IDIgfHwgcy0+ZGVsdGFfc2l6ZSA+IDQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaGVpZ2h0ID0gQVZfUkwxNihoZWFkZXJfYnVmZmVyICsgNSk7CisgICAgd2lkdGggID0gQVZfUkwxNihoZWFkZXJfYnVmZmVyICsgNyk7CisKKyAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkhlYWRlciBzaXplOiAlZFxuIiwgaGVhZGVyX3NpemUpOworICAgIHJldHVybiBoZWFkZXJfc2l6ZTsKK30KKworc3RhdGljIGludCB0cnVlbW90aW9uMnJ0X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgVHJ1ZU1vdGlvbjJSVENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKiBjb25zdCBwID0gZGF0YTsKKyAgICBHZXRCaXRDb250ZXh0ICpnYiA9ICZzLT5nYjsKKyAgICB1aW50OF90ICpkc3Q7CisgICAgaW50IHgsIHksIGRlbHRhX21vZGU7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IHRydWVtb3Rpb24ycnRfZGVjb2RlX2hlYWRlcihhdmN0eCwgYXZwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChhdmN0eC0+d2lkdGggKyBzLT5oc2NhbGUgLSAxKS8gcy0+aHNjYWxlICogYXZjdHgtPmhlaWdodCAqIHMtPmRlbHRhX3NpemUgPiBhdnBrdC0+c2l6ZSAqIDhMTCAqIDQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoZ2IsIGF2cGt0LT5kYXRhICsgcmV0LCBhdnBrdC0+c2l6ZSAtIHJldCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBwLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHNraXBfYml0cyhnYiwgMzIpOworICAgIGRlbHRhX21vZGUgPSBzLT5kZWx0YV9zaXplIC0gMjsKKyAgICBkc3QgPSBwLT5kYXRhWzBdOworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgaW50IGRpZmYgPSAwOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4ICs9IHMtPmhzY2FsZSkgeworICAgICAgICAgICAgZGlmZiAgKz0gZGVsdGFfdGFic1tkZWx0YV9tb2RlXVtnZXRfYml0cyhnYiwgcy0+ZGVsdGFfc2l6ZSldOworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF91aW50OCgoeSA/IGRzdFt4IC0gcC0+bGluZXNpemVbMF1dIDogMCkgKyBkaWZmKTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgaWYgKHMtPmhzY2FsZSA+IDEpIHsKKyAgICAgICAgZHN0ID0gcC0+ZGF0YVswXTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IGF2Y3R4LT53aWR0aDsgeCArPSBzLT5oc2NhbGUpCisgICAgICAgICAgICAgICAgZHN0W3hdID0gZHN0W3ggLSAxXTsKKyAgICAgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRzdCA9IHAtPmRhdGFbMF07CisgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoOyB4KyspCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3VpbnQ4KGRzdFt4XSArIChkc3RbeF0gLSAxMjgpIC8gMyk7CisgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBkc3QgPSBwLT5kYXRhWzFdOworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0ID4+IDI7IHkrKykgeworICAgICAgICBpbnQgZGlmZiA9IDA7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGggPj4gMjsgeCArPSBzLT5oc2NhbGUpIHsKKyAgICAgICAgICAgIGRpZmYgICs9IGRlbHRhX3RhYnNbZGVsdGFfbW9kZV1bZ2V0X2JpdHMoZ2IsIHMtPmRlbHRhX3NpemUpXTsKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfdWludDgoKHkgPyBkc3RbeCAtIHAtPmxpbmVzaXplWzFdXSA6IDEyOCkgKyBkaWZmKTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMV07CisgICAgfQorCisgICAgaWYgKHMtPmhzY2FsZSA+IDEpIHsKKyAgICAgICAgZHN0ID0gcC0+ZGF0YVsxXTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQgPj4gMjsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAxOyB4IDwgYXZjdHgtPndpZHRoID4+IDI7IHggKz0gcy0+aHNjYWxlKQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGRzdFt4IC0gMV07CisgICAgICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3QgPSBwLT5kYXRhWzFdOworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0ID4+IDI7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoID4+IDI7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSArPSAoZHN0W3hdIC0gMTI4KSAvIDg7CisgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVsxXTsKKyAgICB9CisKKyAgICBkc3QgPSBwLT5kYXRhWzJdOworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0ID4+IDI7IHkrKykgeworICAgICAgICBpbnQgZGlmZiA9IDA7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBhdmN0eC0+d2lkdGggPj4gMjsgeCArPSBzLT5oc2NhbGUpIHsKKyAgICAgICAgICAgIGRpZmYgICs9IGRlbHRhX3RhYnNbZGVsdGFfbW9kZV1bZ2V0X2JpdHMoZ2IsIHMtPmRlbHRhX3NpemUpXTsKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfdWludDgoKHkgPyBkc3RbeCAtIHAtPmxpbmVzaXplWzJdXSA6IDEyOCkgKyBkaWZmKTsKKyAgICAgICAgfQorICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMl07CisgICAgfQorCisgICAgaWYgKHMtPmhzY2FsZSA+IDEpIHsKKyAgICAgICAgZHN0ID0gcC0+ZGF0YVsyXTsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGF2Y3R4LT5oZWlnaHQgPj4gMjsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAxOyB4IDwgYXZjdHgtPndpZHRoID4+IDI7IHggKz0gcy0+aHNjYWxlKQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGRzdFt4IC0gMV07CisgICAgICAgICAgICBkc3QgKz0gcC0+bGluZXNpemVbMl07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3QgPSBwLT5kYXRhWzJdOworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0ID4+IDI7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYXZjdHgtPndpZHRoID4+IDI7IHgrKykKKyAgICAgICAgICAgIGRzdFt4XSArPSAoZHN0W3hdIC0gMTI4KSAvIDg7CisgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVsyXTsKKyAgICB9CisKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwLT5rZXlfZnJhbWUgPSAxOworICAgICpnb3RfZnJhbWUgPSAxOworCisgICAgcmV0dXJuIGF2cGt0LT5zaXplOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdHJ1ZW1vdGlvbjJydF9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQxMFA7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWQ29kZWMgZmZfdHJ1ZW1vdGlvbjJydF9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0cnVlbW90aW9uMnJ0IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRHVjayBUcnVlTW90aW9uIDIuMCBSZWFsIFRpbWUiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVFJVRU1PVElPTjJSVCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVHJ1ZU1vdGlvbjJSVENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgICA9IHRydWVtb3Rpb24ycnRfZGVjb2RlX2luaXQsCisgICAgLmRlY29kZSAgICAgICAgID0gdHJ1ZW1vdGlvbjJydF9kZWNvZGVfZnJhbWUsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdHNjYy5jIGIvbGliYXZjb2RlYy90c2NjLmMKaW5kZXggOGM1ZWM2OC4uY2I4NmI1OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90c2NjLmMKKysrIGIvbGliYXZjb2RlYy90c2NjLmMKQEAgLTMyLDcgKzMyLDYgQEAKICAqICB0aGVuIHRoaXMgY29kZWQgcGljdHVyZSBpcyBwYWNrZWQgd2l0aCBaTGliCiAgKgogICogU3VwcG9ydHM6IEJHUjgsQkdSNTU1LEJHUjI0IC0gb25seSBCR1I4IGFuZCBCR1I1NTUgdGVzdGVkCi0gKgogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtOTksMTEgKzk4LDE0IEBACiAKICAgICAvKiBtYWtlIHRoZSBwYWxldHRlIGF2YWlsYWJsZSBvbiB0aGUgd2F5IG91dCAqLwogICAgIGlmIChjLT5hdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsIE5VTEwpOworICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsICZzaXplKTsKIAotICAgICAgICBpZiAocGFsKSB7CisgICAgICAgIGlmIChwYWwgJiYgc2l6ZSA9PSBBVlBBTEVUVEVfU0laRSkgewogICAgICAgICAgICAgZnJhbWUtPnBhbGV0dGVfaGFzX2NoYW5nZWQgPSAxOwogICAgICAgICAgICAgbWVtY3B5KGMtPnBhbCwgcGFsLCBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgIH0gZWxzZSBpZiAocGFsKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBhbGV0dGUgc2l6ZSAlZCBpcyB3cm9uZ1xuIiwgc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KGZyYW1lLT5kYXRhWzFdLCBjLT5wYWwsIEFWUEFMRVRURV9TSVpFKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3RzY2MyLmMgYi9saWJhdmNvZGVjL3RzY2MyLmMKaW5kZXggOWJiN2FiMy4uYThjN2VlNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90c2NjMi5jCisrKyBiL2xpYmF2Y29kZWMvdHNjYzIuYwpAQCAtMjgsOSArMjgsMTAgQEAKIAogI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJtYXRob3BzLmgiCiAjaW5jbHVkZSAidHNjYzJkYXRhLmgiCiAKIHR5cGVkZWYgc3RydWN0IFRTQ0MyQ29udGV4dCB7CkBAIC0xNzksNyArMTgwLDcgQEAKICAgICAgICAgICAgICAgICBpZiAoYnBvcyA+PSAxNikKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgdmFsID0gc2lnbl9leHRlbmQoYWMgPj4gNCwgOCk7Ci0gICAgICAgICAgICAgICAgYy0+YmxvY2tbdHNjYzJfemlnemFnW2Jwb3MrK11dID0gdmFsOworICAgICAgICAgICAgICAgIGMtPmJsb2NrW2ZmX3ppZ3phZ19zY2FuW2Jwb3MrK11dID0gdmFsOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdHNjYzJfaWRjdDRfcHV0KGMtPmJsb2NrLCBxLCBkc3QgKyBrICogNCwgc3RyaWRlKTsKICAgICAgICAgfQpAQCAtMjM0LDE2ICsyMzUsMTMgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKChyZXQgPSBmZl9yZWdldF9idWZmZXIoYXZjdHgsIGMtPnBpYykpIDwgMCkgewotICAgICAgICByZXR1cm4gcmV0OworICAgIGlmIChmcmFtZV90eXBlID09IDApIHsKKyAgICAgICAgLy8gU2tpcCBkdXBsaWNhdGUgZnJhbWVzCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKICAgICB9CiAKLSAgICBpZiAoZnJhbWVfdHlwZSA9PSAwKSB7Ci0gICAgICAgICpnb3RfZnJhbWUgICAgICA9IDE7Ci0gICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIGMtPnBpYykpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIGlmICgocmV0ID0gZmZfcmVnZXRfYnVmZmVyKGF2Y3R4LCBjLT5waWMpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IDQpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdHNjYzJkYXRhLmggYi9saWJhdmNvZGVjL3RzY2MyZGF0YS5oCmluZGV4IDc4MDYyNjcuLjVlOGQxOGIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdHNjYzJkYXRhLmgKKysrIGIvbGliYXZjb2RlYy90c2NjMmRhdGEuaApAQCAtMjQsMTMgKzI0LDYgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCi1zdGF0aWMgY29uc3QgdWludDhfdCB0c2NjMl96aWd6YWdbMTZdID0gewotICAgMCwgIDEsICA0LCAgOCwKLSAgIDUsICAyLCAgMywgIDYsCi0gICA5LCAxMiwgMTMsIDEwLAotICAgNywgMTEsIDE0LCAxNQotfTsKLQogI2RlZmluZSBOVU1fVkxDX1NFVFMgMTMKIAogc3RhdGljIGNvbnN0IHVpbnQxNl90IHRzY2MyX3F1YW50c1tOVU1fVkxDX1NFVFNdWzNdID0gewpAQCAtOTEwLDE0ICs5MDMsMTQgQEAKICAgICAxNzIsIDE2OSwgMTY1LCAxNjIsIDEzMSwgMTMyLCAxMzAsIDEyNSwgMTIxLCAxMTQsIDExMCwgMTAxLCA5NgogfTsKIAotc3RhdGljIGNvbnN0IHVpbnQxNl90ICp0c2NjMl9hY192bGNfc3ltc1tOVU1fVkxDX1NFVFNdID0geworc3RhdGljIGNvbnN0IHVpbnQxNl90ICogY29uc3QgdHNjYzJfYWNfdmxjX3N5bXNbTlVNX1ZMQ19TRVRTXSA9IHsKICAgICBhY192bGNfZGVzYzBfc3ltcywgYWNfdmxjX2Rlc2MxX3N5bXMsIGFjX3ZsY19kZXNjMl9zeW1zLCBhY192bGNfZGVzYzNfc3ltcywKICAgICBhY192bGNfZGVzYzRfc3ltcywgYWNfdmxjX2Rlc2M1X3N5bXMsIGFjX3ZsY19kZXNjNl9zeW1zLCBhY192bGNfZGVzYzdfc3ltcywKICAgICBhY192bGNfZGVzYzhfc3ltcywgYWNfdmxjX2Rlc2M5X3N5bXMsIGFjX3ZsY19kZXNjQV9zeW1zLCBhY192bGNfZGVzY0Jfc3ltcywKICAgICBhY192bGNfZGVzY0Nfc3ltcywKIH07CiAKLXN0YXRpYyBjb25zdCB1aW50MTZfdCAqdHNjYzJfYWNfdmxjX2NvZGVzW05VTV9WTENfU0VUU10gPSB7CitzdGF0aWMgY29uc3QgdWludDE2X3QgKiBjb25zdCB0c2NjMl9hY192bGNfY29kZXNbTlVNX1ZMQ19TRVRTXSA9IHsKICAgICBhY192bGNfZGVzYzBfY29kZXMsIGFjX3ZsY19kZXNjMV9jb2RlcywgYWNfdmxjX2Rlc2MyX2NvZGVzLAogICAgIGFjX3ZsY19kZXNjM19jb2RlcywgYWNfdmxjX2Rlc2M0X2NvZGVzLCBhY192bGNfZGVzYzVfY29kZXMsCiAgICAgYWNfdmxjX2Rlc2M2X2NvZGVzLCBhY192bGNfZGVzYzdfY29kZXMsIGFjX3ZsY19kZXNjOF9jb2RlcywKQEAgLTkyNSw3ICs5MTgsNyBAQAogICAgIGFjX3ZsY19kZXNjQ19jb2RlcywKIH07CiAKLXN0YXRpYyBjb25zdCB1aW50OF90ICp0c2NjMl9hY192bGNfYml0c1tOVU1fVkxDX1NFVFNdID0geworc3RhdGljIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCB0c2NjMl9hY192bGNfYml0c1tOVU1fVkxDX1NFVFNdID0gewogICAgIGFjX3ZsY19kZXNjMF9iaXRzLCBhY192bGNfZGVzYzFfYml0cywgYWNfdmxjX2Rlc2MyX2JpdHMsIGFjX3ZsY19kZXNjM19iaXRzLAogICAgIGFjX3ZsY19kZXNjNF9iaXRzLCBhY192bGNfZGVzYzVfYml0cywgYWNfdmxjX2Rlc2M2X2JpdHMsIGFjX3ZsY19kZXNjN19iaXRzLAogICAgIGFjX3ZsY19kZXNjOF9iaXRzLCBhY192bGNfZGVzYzlfYml0cywgYWNfdmxjX2Rlc2NBX2JpdHMsIGFjX3ZsY19kZXNjQl9iaXRzLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90dGEuYyBiL2xpYmF2Y29kZWMvdHRhLmMKaW5kZXggMWUyZTljNC4uOGYwOTdiMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90dGEuYworKysgYi9saWJhdmNvZGVjL3R0YS5jCkBAIC0yNyw4ICsyNywxMyBAQAogICogQGF1dGhvciBBbGV4IEJlcmVnc3phc3ppCiAgKi8KIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAidHRhZGF0YS5oIgogI2luY2x1ZGUgInR0YWRzcC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKQEAgLTM2LDkgKzQxLDYgQEAKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ1bmFyeS5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAKICNkZWZpbmUgRk9STUFUX1NJTVBMRSAgICAxCiAjZGVmaW5lIEZPUk1BVF9FTkNSWVBURUQgMgpAQCAtMjgzLDcgKzI4NSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaykgewotICAgICAgICAgICAgaWYgKGsgPiBNSU5fQ0FDSEVfQklUUykgeworICAgICAgICAgICAgaWYgKGsgPiBNSU5fQ0FDSEVfQklUUyB8fCB1bmFyeSA+IElOVDMyX01BWCA+PiBrKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQpAQCAtMzEyLDggKzMxNCw4IEBACiAgICAgICAgICpwID0gMSArICgodmFsdWUgPj4gMSkgXiAoKHZhbHVlICYgMSkgLSAxKSk7CiAKICAgICAgICAgLy8gcnVuIGh5YnJpZCBmaWx0ZXIKLSAgICAgICAgcy0+ZHNwLnR0YWZpbHRlcl9wcm9jZXNzX2RlYyhmaWx0ZXItPnFtLCBmaWx0ZXItPmR4LCBmaWx0ZXItPmRsLCAmZmlsdGVyLT5lcnJvciwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXItPnNoaWZ0LCBmaWx0ZXItPnJvdW5kKTsKKyAgICAgICAgcy0+ZHNwLmZpbHRlcl9wcm9jZXNzKGZpbHRlci0+cW0sIGZpbHRlci0+ZHgsIGZpbHRlci0+ZGwsICZmaWx0ZXItPmVycm9yLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLT5zaGlmdCwgZmlsdGVyLT5yb3VuZCk7CiAKICAgICAgICAgLy8gZml4ZWQgb3JkZXIgcHJlZGljdGlvbgogI2RlZmluZSBQUkVEKHgsIGspIChpbnQzMl90KSgoKCh1aW50NjRfdCkoeCkgPDwgKGspKSAtICh4KSkgPj4gKGspKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90dGFkc3AuYyBiL2xpYmF2Y29kZWMvdHRhZHNwLmMKaW5kZXggMzBiN2FiOS4uMDU2YTJjNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90dGFkc3AuYworKysgYi9saWJhdmNvZGVjL3R0YWRzcC5jCkBAIC0xNiwxMSArMTYsMTMgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJ0dGFkc3AuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKIAotc3RhdGljIHZvaWQgdHRhZmlsdGVyX3Byb2Nlc3NfZGVjX2MoaW50MzJfdCAqcW0sIGludDMyX3QgKmR4LCBpbnQzMl90ICpkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmVycm9yLCBpbnQzMl90ICppbiwgaW50MzJfdCBzaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpIHsKK3N0YXRpYyB2b2lkIHR0YV9maWx0ZXJfcHJvY2Vzc19jKGludDMyX3QgKnFtLCBpbnQzMl90ICpkeCwgaW50MzJfdCAqZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICplcnJvciwgaW50MzJfdCAqaW4sIGludDMyX3Qgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvdW5kKSB7CiAgICAgaWYgKCplcnJvciA8IDApIHsKICAgICAgICAgcW1bMF0gLT0gZHhbMF07IHFtWzFdIC09IGR4WzFdOyBxbVsyXSAtPSBkeFsyXTsgcW1bM10gLT0gZHhbM107CiAgICAgICAgIHFtWzRdIC09IGR4WzRdOyBxbVs1XSAtPSBkeFs1XTsgcW1bNl0gLT0gZHhbNl07IHFtWzddIC09IGR4WzddOwpAQCAtMjksOCArMzEsOCBAQAogICAgICAgICBxbVs0XSArPSBkeFs0XTsgcW1bNV0gKz0gZHhbNV07IHFtWzZdICs9IGR4WzZdOyBxbVs3XSArPSBkeFs3XTsKICAgICB9CiAKLSAgICByb3VuZCArPSAgICBkbFswXSAqIHFtWzBdICsgZGxbMV0gKiBxbVsxXSArIGRsWzJdICogcW1bMl0gKyBkbFszXSAqIHFtWzNdICsKLSAgICAgICAgICAgICAgICBkbFs0XSAqIHFtWzRdICsgZGxbNV0gKiBxbVs1XSArIGRsWzZdICogcW1bNl0gKyBkbFs3XSAqIHFtWzddOworICAgIHJvdW5kICs9IGRsWzBdICogcW1bMF0gKyBkbFsxXSAqIHFtWzFdICsgZGxbMl0gKiBxbVsyXSArIGRsWzNdICogcW1bM10gKworICAgICAgICAgICAgIGRsWzRdICogcW1bNF0gKyBkbFs1XSAqIHFtWzVdICsgZGxbNl0gKiBxbVs2XSArIGRsWzddICogcW1bN107CiAKICAgICBkeFswXSA9IGR4WzFdOyBkeFsxXSA9IGR4WzJdOyBkeFsyXSA9IGR4WzNdOyBkeFszXSA9IGR4WzRdOwogICAgIGRsWzBdID0gZGxbMV07IGRsWzFdID0gZGxbMl07IGRsWzJdID0gZGxbM107IGRsWzNdID0gZGxbNF07CkBAIC01MCw3ICs1Miw3IEBACiAKIGF2X2NvbGQgdm9pZCBmZl90dGFkc3BfaW5pdChUVEFEU1BDb250ZXh0ICpjKQogewotICAgIGMtPnR0YWZpbHRlcl9wcm9jZXNzX2RlYyA9IHR0YWZpbHRlcl9wcm9jZXNzX2RlY19jOworICAgIGMtPmZpbHRlcl9wcm9jZXNzID0gdHRhX2ZpbHRlcl9wcm9jZXNzX2M7CiAKICAgICBpZiAoQVJDSF9YODYpCiAgICAgICAgIGZmX3R0YWRzcF9pbml0X3g4NihjKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdHRhZHNwLmggYi9saWJhdmNvZGVjL3R0YWRzcC5oCmluZGV4IDU2OTMwZjEuLjczN2Q5YmQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdHRhZHNwLmgKKysrIGIvbGliYXZjb2RlYy90dGFkc3AuaApAQCAtMjAsMTIgKzIwLDExIEBACiAjZGVmaW5lIEFWQ09ERUNfVFRBRFNQX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgInR0YWRhdGEuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgVFRBRFNQQ29udGV4dCB7Ci0gICAgdm9pZCAoKnR0YWZpbHRlcl9wcm9jZXNzX2RlYykoaW50MzJfdCAqcW0sIGludDMyX3QgKmR4LCBpbnQzMl90ICpkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICplcnJvciwgaW50MzJfdCAqaW4sIGludDMyX3Qgc2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3VuZCk7CisgICAgdm9pZCAoKmZpbHRlcl9wcm9jZXNzKShpbnQzMl90ICpxbSwgaW50MzJfdCAqZHgsIGludDMyX3QgKmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqZXJyb3IsIGludDMyX3QgKmluLCBpbnQzMl90IHNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3VuZCk7CiB9IFRUQURTUENvbnRleHQ7CiAKIHZvaWQgZmZfdHRhZHNwX2luaXQoVFRBRFNQQ29udGV4dCAqYyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3R0YWVuYy5jIGIvbGliYXZjb2RlYy90dGFlbmMuYwppbmRleCAwZGYxZmNiLi4zY2M1NGQ3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3R0YWVuYy5jCisrKyBiL2xpYmF2Y29kZWMvdHRhZW5jLmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2RlZmluZSBCSVRTVFJFQU1fV1JJVEVSX0xFCiAjaW5jbHVkZSAidHRhZGF0YS5oIgorI2luY2x1ZGUgInR0YWVuY2RzcC5oIgogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJwdXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC0yOSw2ICszMCw3IEBACiAgICAgY29uc3QgQVZDUkMgKmNyY190YWJsZTsKICAgICBpbnQgYnBzOwogICAgIFRUQUNoYW5uZWwgKmNoX2N0eDsKKyAgICBUVEFFbmNEU1BDb250ZXh0IGRzcDsKIH0gVFRBRW5jQ29udGV4dDsKIAogc3RhdGljIGF2X2NvbGQgaW50IHR0YV9lbmNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCkBAIC01Nyw0MCArNTksMTEgQEAKICAgICBpZiAoIXMtPmNoX2N0eCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAorICAgIGZmX3R0YWVuY2RzcF9pbml0KCZzLT5kc3ApOworCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCB0dGFmaWx0ZXJfcHJvY2VzcyhUVEFGaWx0ZXIgKmMsIGludDMyX3QgKmluKQotewotICAgIHJlZ2lzdGVyIGludDMyX3QgKmRsID0gYy0+ZGwsICpxbSA9IGMtPnFtLCAqZHggPSBjLT5keCwgc3VtID0gYy0+cm91bmQ7Ci0KLSAgICBpZiAoYy0+ZXJyb3IgPCAwKSB7Ci0gICAgICAgIHFtWzBdIC09IGR4WzBdOyBxbVsxXSAtPSBkeFsxXTsgcW1bMl0gLT0gZHhbMl07IHFtWzNdIC09IGR4WzNdOwotICAgICAgICBxbVs0XSAtPSBkeFs0XTsgcW1bNV0gLT0gZHhbNV07IHFtWzZdIC09IGR4WzZdOyBxbVs3XSAtPSBkeFs3XTsKLSAgICB9IGVsc2UgaWYgKGMtPmVycm9yID4gMCkgewotICAgICAgICBxbVswXSArPSBkeFswXTsgcW1bMV0gKz0gZHhbMV07IHFtWzJdICs9IGR4WzJdOyBxbVszXSArPSBkeFszXTsKLSAgICAgICAgcW1bNF0gKz0gZHhbNF07IHFtWzVdICs9IGR4WzVdOyBxbVs2XSArPSBkeFs2XTsgcW1bN10gKz0gZHhbN107Ci0gICAgfQotCi0gICAgc3VtICs9IGRsWzBdICogcW1bMF0gKyBkbFsxXSAqIHFtWzFdICsgZGxbMl0gKiBxbVsyXSArIGRsWzNdICogcW1bM10gKwotICAgICAgICAgICBkbFs0XSAqIHFtWzRdICsgZGxbNV0gKiBxbVs1XSArIGRsWzZdICogcW1bNl0gKyBkbFs3XSAqIHFtWzddOwotCi0gICAgZHhbMF0gPSBkeFsxXTsgZHhbMV0gPSBkeFsyXTsgZHhbMl0gPSBkeFszXTsgZHhbM10gPSBkeFs0XTsKLSAgICBkbFswXSA9IGRsWzFdOyBkbFsxXSA9IGRsWzJdOyBkbFsyXSA9IGRsWzNdOyBkbFszXSA9IGRsWzRdOwotCi0gICAgZHhbNF0gPSAoKGRsWzRdID4+IDMwKSB8IDEpOwotICAgIGR4WzVdID0gKChkbFs1XSA+PiAzMCkgfCAyKSAmIH4xOwotICAgIGR4WzZdID0gKChkbFs2XSA+PiAzMCkgfCAyKSAmIH4xOwotICAgIGR4WzddID0gKChkbFs3XSA+PiAzMCkgfCA0KSAmIH4zOwotCi0gICAgZGxbNF0gPSAtZGxbNV07IGRsWzVdID0gLWRsWzZdOwotICAgIGRsWzZdID0gKmluIC0gZGxbN107IGRsWzddID0gKmluOwotICAgIGRsWzVdICs9IGRsWzZdOyBkbFs0XSArPSBkbFs1XTsKLQotICAgICppbiAtPSAoc3VtID4+IGMtPnNoaWZ0KTsKLSAgICBjLT5lcnJvciA9ICppbjsKLX0KLQogc3RhdGljIGludDMyX3QgZ2V0X3NhbXBsZShjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50IHNhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQpCiB7CkBAIC0xMTQsOSArODcsMTIgQEAKIHsKICAgICBUVEFFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBQdXRCaXRDb250ZXh0IHBiOwotICAgIGludCByZXQsIGksIG91dF9ieXRlcywgY3VyX2NoYW4gPSAwLCByZXMgPSAwLCBzYW1wbGVzID0gMDsKKyAgICBpbnQgcmV0LCBpLCBvdXRfYnl0ZXMsIGN1cl9jaGFuLCByZXMsIHNhbXBsZXM7CisgICAgaW50NjRfdCBwa3Rfc2l6ZSA9ICBmcmFtZS0+bmJfc2FtcGxlcyAqIDJMTCAqIGF2Y3R4LT5jaGFubmVscyAqIHMtPmJwczsKIAotICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIGZyYW1lLT5uYl9zYW1wbGVzICogMiAqIGF2Y3R4LT5jaGFubmVscyAqIHMtPmJwcywgMCkpIDwgMCkKK3BrdF9hbGxvYzoKKyAgICBjdXJfY2hhbiA9IDAsIHJlcyA9IDAsIHNhbXBsZXMgPSAwOworICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIHBrdF9zaXplLCAwKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIGluaXRfcHV0X2JpdHMoJnBiLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwogCkBAIC0xNTIsNyArMTI4LDggQEAKICAgICAgICAgfQogICAgICAgICBjLT5wcmVkaWN0b3IgPSB0ZW1wOwogCi0gICAgICAgIHR0YWZpbHRlcl9wcm9jZXNzKGZpbHRlciwgJnZhbHVlKTsKKyAgICAgICAgcy0+ZHNwLmZpbHRlcl9wcm9jZXNzKGZpbHRlci0+cW0sIGZpbHRlci0+ZHgsIGZpbHRlci0+ZGwsICZmaWx0ZXItPmVycm9yLCAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXItPnNoaWZ0LCBmaWx0ZXItPnJvdW5kKTsKICAgICAgICAgb3V0dmFsID0gKHZhbHVlID4gMCkgPyAodmFsdWUgPDwgMSkgLSAxOiAtdmFsdWUgPDwgMTsKIAogICAgICAgICBrID0gcmljZS0+azA7CkBAIC0xNzQsNiArMTUxLDE0IEBACiAgICAgICAgICAgICAgICAgcmljZS0+azErKzsKIAogICAgICAgICAgICAgdW5hcnkgPSAxICsgKG91dHZhbCA+PiBrKTsKKyAgICAgICAgICAgIGlmICh1bmFyeSArIDEwMExMID4gcHV0X2JpdHNfbGVmdCgmcGIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBrdF9zaXplIDwgSU5UX01BWC8yKSB7CisgICAgICAgICAgICAgICAgICAgIHBrdF9zaXplICo9IDI7CisgICAgICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihhdnBrdCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gcGt0X2FsbG9jOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgIGlmICh1bmFyeSA+IDMxKSB7CiAgICAgICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMzEsIDB4N0ZGRkZGRkYpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90dGFlbmNkc3AuYyBiL2xpYmF2Y29kZWMvdHRhZW5jZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhNTk0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdHRhZW5jZHNwLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJ0dGFlbmNkc3AuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworc3RhdGljIHZvaWQgdHRhZW5jX2ZpbHRlcl9wcm9jZXNzX2MoaW50MzJfdCAqcW0sIGludDMyX3QgKmR4LCBpbnQzMl90ICpkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmVycm9yLCBpbnQzMl90ICppbiwgaW50MzJfdCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpIHsKKyAgICBpZiAoKmVycm9yIDwgMCkgeworICAgICAgICBxbVswXSAtPSBkeFswXTsgcW1bMV0gLT0gZHhbMV07IHFtWzJdIC09IGR4WzJdOyBxbVszXSAtPSBkeFszXTsKKyAgICAgICAgcW1bNF0gLT0gZHhbNF07IHFtWzVdIC09IGR4WzVdOyBxbVs2XSAtPSBkeFs2XTsgcW1bN10gLT0gZHhbN107CisgICAgfSBlbHNlIGlmICgqZXJyb3IgPiAwKSB7CisgICAgICAgIHFtWzBdICs9IGR4WzBdOyBxbVsxXSArPSBkeFsxXTsgcW1bMl0gKz0gZHhbMl07IHFtWzNdICs9IGR4WzNdOworICAgICAgICBxbVs0XSArPSBkeFs0XTsgcW1bNV0gKz0gZHhbNV07IHFtWzZdICs9IGR4WzZdOyBxbVs3XSArPSBkeFs3XTsKKyAgICB9CisKKyAgICByb3VuZCArPSBkbFswXSAqIHFtWzBdICsgZGxbMV0gKiBxbVsxXSArIGRsWzJdICogcW1bMl0gKyBkbFszXSAqIHFtWzNdICsKKyAgICAgICAgICAgICBkbFs0XSAqIHFtWzRdICsgZGxbNV0gKiBxbVs1XSArIGRsWzZdICogcW1bNl0gKyBkbFs3XSAqIHFtWzddOworCisgICAgZHhbMF0gPSBkeFsxXTsgZHhbMV0gPSBkeFsyXTsgZHhbMl0gPSBkeFszXTsgZHhbM10gPSBkeFs0XTsKKyAgICBkbFswXSA9IGRsWzFdOyBkbFsxXSA9IGRsWzJdOyBkbFsyXSA9IGRsWzNdOyBkbFszXSA9IGRsWzRdOworCisgICAgZHhbNF0gPSAoKGRsWzRdID4+IDMwKSB8IDEpOworICAgIGR4WzVdID0gKChkbFs1XSA+PiAzMCkgfCAyKSAmIH4xOworICAgIGR4WzZdID0gKChkbFs2XSA+PiAzMCkgfCAyKSAmIH4xOworICAgIGR4WzddID0gKChkbFs3XSA+PiAzMCkgfCA0KSAmIH4zOworCisgICAgZGxbNF0gPSAtZGxbNV07IGRsWzVdID0gLWRsWzZdOworICAgIGRsWzZdID0gKmluIC0gZGxbN107IGRsWzddID0gKmluOworICAgIGRsWzVdICs9IGRsWzZdOyBkbFs0XSArPSBkbFs1XTsKKworICAgICppbiAtPSAocm91bmQgPj4gc2hpZnQpOworICAgICplcnJvciA9ICppbjsKK30KKworYXZfY29sZCB2b2lkIGZmX3R0YWVuY2RzcF9pbml0KFRUQUVuY0RTUENvbnRleHQgKmMpCit7CisgICAgYy0+ZmlsdGVyX3Byb2Nlc3MgPSB0dGFlbmNfZmlsdGVyX3Byb2Nlc3NfYzsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfdHRhZW5jZHNwX2luaXRfeDg2KGMpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90dGFlbmNkc3AuaCBiL2xpYmF2Y29kZWMvdHRhZW5jZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwMDcyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdHRhZW5jZHNwLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVFRBRU5DRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19UVEFFTkNEU1BfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3R5cGVkZWYgc3RydWN0IFRUQUVuY0RTUENvbnRleHQgeworICAgIHZvaWQgKCpmaWx0ZXJfcHJvY2VzcykoaW50MzJfdCAqcW0sIGludDMyX3QgKmR4LCBpbnQzMl90ICpkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmVycm9yLCBpbnQzMl90ICppbiwgaW50MzJfdCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpOworfSBUVEFFbmNEU1BDb250ZXh0OworCit2b2lkIGZmX3R0YWVuY2RzcF9pbml0KFRUQUVuY0RTUENvbnRleHQgKmMpOwordm9pZCBmZl90dGFlbmNkc3BfaW5pdF94ODYoVFRBRW5jRFNQQ29udGV4dCAqYyk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1RUQUVOQ0RTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3R3aW52cS5oIGIvbGliYXZjb2RlYy90d2ludnEuaAppbmRleCAyMjhhNDg5Li4yNGU1ZWJjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3R3aW52cS5oCisrKyBiL2xpYmF2Y29kZWMvdHdpbnZxLmgKQEAgLTEwOSw3ICsxMDksNyBAQAogICogYml0cmF0ZS9zYW1wbGUgcmF0ZQogICovCiB0eXBlZGVmIHN0cnVjdCBUd2luVlFNb2RlVGFiIHsKLSAgICBzdHJ1Y3QgVHdpblZRRnJhbWVNb2RlIGZtb2RlWzNdOyAvLy88IGZyYW1lIHR5cGUtZGVwZW5kYW50IHBhcmFtZXRlcnMKKyAgICBzdHJ1Y3QgVHdpblZRRnJhbWVNb2RlIGZtb2RlWzNdOyAvLy88IGZyYW1lIHR5cGUtZGVwZW5kZW50IHBhcmFtZXRlcnMKIAogICAgIHVpbnQxNl90ICAgICBzaXplOyAgICAgICAgLy8vPCBmcmFtZSBzaXplIGluIHNhbXBsZXMKICAgICB1aW50OF90ICAgICAgbl9sc3A7ICAgICAgIC8vLzwgbnVtYmVyIG9mIGxzcCBjb2VmZmljaWVudHMKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdHdpbnZxZGVjLmMgYi9saWJhdmNvZGVjL3R3aW52cWRlYy5jCmluZGV4IDVmNGRkMzUuLmMyMzUzZjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdHdpbnZxZGVjLmMKKysrIGIvbGliYXZjb2RlYy90d2ludnFkZWMuYwpAQCAtMTQ5LDcgKzE0OSw3IEBACiAvKioKICAqIFN1bSB0byBkYXRhIGEgcGVyaW9kaWMgcGVhayBvZiBhIGdpdmVuIHBlcmlvZCwgd2lkdGggYW5kIHNoYXBlLgogICoKLSAqIEBwYXJhbSBwZXJpb2QgdGhlIHBlcmlvZCBvZiB0aGUgcGVhayBkaXZpc2VkIGJ5IDQwMC4wCisgKiBAcGFyYW0gcGVyaW9kIHRoZSBwZXJpb2Qgb2YgdGhlIHBlYWsgZGl2aWRlZCBieSA0MDAuMAogICovCiBzdGF0aWMgdm9pZCBhZGRfcGVhayhpbnQgcGVyaW9kLCBpbnQgd2lkdGgsIGNvbnN0IGZsb2F0ICpzaGFwZSwKICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHBwY19nYWluLCBmbG9hdCAqc3BlZWNoLCBpbnQgbGVuKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy90eGQuYyBiL2xpYmF2Y29kZWMvdHhkLmMKaW5kZXggZDdmZGRlMC4uOGIyMDQ3NSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy90eGQuYworKysgYi9saWJhdmNvZGVjL3R4ZC5jCkBAIC01Niw4ICs1Niw3IEBACiAgICAgZmxhZ3MgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKIAogICAgIGlmICh2ZXJzaW9uIDwgOCB8fCB2ZXJzaW9uID4gOSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInRleHR1cmUgZGF0YSB2ZXJzaW9uICVpIGlzIHVuc3VwcG9ydGVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJUZXh0dXJlIGRhdGEgdmVyc2lvbiAldSIsIHZlcnNpb24pOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCkBAIC02Niw3ICs2NSw3IEBACiAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAxNiB8fCBkZXB0aCA9PSAzMikgewogICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCQTsKICAgICB9IGVsc2UgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImRlcHRoIG9mICVpIGlzIHVuc3VwcG9ydGVkXG4iLCBkZXB0aCk7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiQ29sb3IgZGVwdGggb2YgJXUiLCBkZXB0aCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKQEAgLTE0OSw3ICsxNDgsNyBAQAogICAgIHJldHVybiBhdnBrdC0+c2l6ZTsKIAogdW5zdXBwb3J0ZWQ6Ci0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBkM2QgZm9ybWF0ICglMDh4KVxuIiwgZDNkX2Zvcm1hdCk7CisgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoYXZjdHgsICJkM2QgZm9ybWF0ICglMDh4KSIsIGQzZF9mb3JtYXQpOwogICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy91bHRpLmMgYi9saWJhdmNvZGVjL3VsdGkuYwppbmRleCBlNmY0Mzc0Li45ZTRjMDg4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3VsdGkuYworKysgYi9saWJhdmNvZGVjL3VsdGkuYwpAQCAtNTAsNiArNTAsOCBAQAogICAgIHMtPndpZHRoID0gYXZjdHgtPndpZHRoOwogICAgIHMtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CiAgICAgcy0+YmxvY2tzID0gKHMtPndpZHRoIC8gOCkgKiAocy0+aGVpZ2h0IC8gOCk7CisgICAgaWYgKHMtPmJsb2NrcyA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDEwUDsKICAgICBzLT51bHRpX2NvZGVib29rID0gdWx0aV9jb2RlYm9vazsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy91bmFyeS5oIGIvbGliYXZjb2RlYy91bmFyeS5oCmluZGV4IDkwOGRjOTMuLmQ1N2Y5ZjcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdW5hcnkuaAorKysgYi9saWJhdmNvZGVjL3VuYXJ5LmgKQEAgLTI4LDcgKzI4LDIwIEBACiAgKiBAcGFyYW0gZ2IgR2V0Qml0Q29udGV4dAogICogQHBhcmFtW2luXSBzdG9wIFRoZSBiaXRzdG9wIHZhbHVlICh1bmFyeSBjb2RlIG9mIDEncyBvciAwJ3MpCiAgKiBAcGFyYW1baW5dIGxlbiBNYXhpbXVtIGxlbmd0aAotICogQHJldHVybiBVbmFyeSBsZW5ndGgvaW5kZXgKKyAqIEByZXR1cm4gdW5hcnkgMCBiYXNlZCBjb2RlIGluZGV4LiBUaGlzIGlzIGFsc28gdGhlIGxlbmd0aCBpbiBiaXRzIG9mIHRoZQorICogY29kZSBleGNsdWRpbmcgdGhlIHN0b3AgYml0LgorICogKGluIGNhc2UgbGVuPTEpCisgKiAxICAgICAgICAgICAgMAorICogMCAgICAgICAgICAgIDEKKyAqIChpbiBjYXNlIGxlbj0yKQorICogMSAgICAgICAgICAgIDAKKyAqIDAxICAgICAgICAgICAxCisgKiAwMCAgICAgICAgICAgMgorICogKGluIGNhc2UgbGVuPTMpCisgKiAxICAgICAgICAgICAgMAorICogMDEgICAgICAgICAgIDEKKyAqIDAwMSAgICAgICAgICAyCisgKiAwMDAgICAgICAgICAgMwogICovCiBzdGF0aWMgaW5saW5lIGludCBnZXRfdW5hcnkoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBzdG9wLCBpbnQgbGVuKQogewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy91dGlscy5jIGIvbGliYXZjb2RlYy91dGlscy5jCmluZGV4IGY1MzI4MjQuLjU5ZDQxY2MgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdXRpbHMuYworKysgYi9saWJhdmNvZGVjL3V0aWxzLmMKQEAgLTI2LDcgKzI2LDYgQEAKICAqLwogCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0b21pYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCkBAIC0zNCw2ICszMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtX2ludGVybmFsLmgiCkBAIC00Myw4ICs0Myw5IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImRlY29kZS5oIgorI2luY2x1ZGUgImh3YWNjZWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCi0jaW5jbHVkZSAibWVfY21wLmgiCiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAiZnJhbWVfdGhyZWFkX2VuY29kZXIuaCIKQEAgLTU0LDYgKzU1LDcgQEAKICNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8ZmxvYXQuaD4KICNpZiBDT05GSUdfSUNPTlYKQEAgLTYzLDU4ICs2NSw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ZmdmVyc2lvbi5oIgogY29uc3QgY2hhciBhdl9jb2RlY19mZnZlcnNpb25bXSA9ICJGRm1wZWcgdmVyc2lvbiAiIEZGTVBFR19WRVJTSU9OOwogCi0jaWYgSEFWRV9QVEhSRUFEUyB8fCBIQVZFX1czMlRIUkVBRFMgfHwgSEFWRV9PUzJUSFJFQURTCi1zdGF0aWMgaW50IGRlZmF1bHRfbG9ja21ncl9jYih2b2lkICoqYXJnLCBlbnVtIEFWTG9ja09wIG9wKQotewotICAgIHZvaWQgKiB2b2xhdGlsZSAqIG11dGV4ID0gYXJnOwotICAgIGludCBlcnI7Ci0KLSAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgY2FzZSBBVl9MT0NLX0NSRUFURToKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBBVl9MT0NLX09CVEFJTjoKLSAgICAgICAgaWYgKCEqbXV0ZXgpIHsKLSAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdCAqdG1wID0gYXZfbWFsbG9jKHNpemVvZihwdGhyZWFkX211dGV4X3QpKTsKLSAgICAgICAgICAgIGlmICghdG1wKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IHB0aHJlYWRfbXV0ZXhfaW5pdCh0bXAsIE5VTEwpKSkgewotICAgICAgICAgICAgICAgIGF2X2ZyZWUodG1wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF2cHJpdl9hdG9taWNfcHRyX2NhcyhtdXRleCwgTlVMTCwgdG1wKSkgewotICAgICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSh0bXApOwotICAgICAgICAgICAgICAgIGF2X2ZyZWUodG1wKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICgoZXJyID0gcHRocmVhZF9tdXRleF9sb2NrKCptdXRleCkpKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJyKTsKLQotICAgICAgICByZXR1cm4gMDsKLSAgICBjYXNlIEFWX0xPQ0tfUkVMRUFTRToKLSAgICAgICAgaWYgKChlcnIgPSBwdGhyZWFkX211dGV4X3VubG9jaygqbXV0ZXgpKSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKGVycik7Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBBVl9MT0NLX0RFU1RST1k6Ci0gICAgICAgIGlmICgqbXV0ZXgpCi0gICAgICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koKm11dGV4KTsKLSAgICAgICAgYXZfZnJlZSgqbXV0ZXgpOwotICAgICAgICBhdnByaXZfYXRvbWljX3B0cl9jYXMobXV0ZXgsICptdXRleCwgTlVMTCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLX0KLXN0YXRpYyBpbnQgKCpsb2NrbWdyX2NiKSh2b2lkICoqbXV0ZXgsIGVudW0gQVZMb2NrT3Agb3ApID0gZGVmYXVsdF9sb2NrbWdyX2NiOwotI2Vsc2UKLXN0YXRpYyBpbnQgKCpsb2NrbWdyX2NiKSh2b2lkICoqbXV0ZXgsIGVudW0gQVZMb2NrT3Agb3ApID0gTlVMTDsKLSNlbmRpZgotCi0KLXZvbGF0aWxlIGludCBmZl9hdmNvZGVjX2xvY2tlZDsKLXN0YXRpYyBpbnQgdm9sYXRpbGUgZW50YW5nbGVkX3RocmVhZF9jb3VudGVyID0gMDsKLXN0YXRpYyB2b2lkICpjb2RlY19tdXRleDsKLXN0YXRpYyB2b2lkICphdmZvcm1hdF9tdXRleDsKK3N0YXRpYyBBVk11dGV4IGNvZGVjX211dGV4ID0gQVZfTVVURVhfSU5JVElBTElaRVI7CiAKIHZvaWQgYXZfZmFzdF9wYWRkZWRfbWFsbG9jKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50ICpzaXplLCBzaXplX3QgbWluX3NpemUpCiB7CkBAIC0xNDAsNzUgKzkxLDE5IEBACiAgICAgICAgIG1lbXNldCgqcCwgMCwgbWluX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKIH0KIAotLyogZW5jb2RlciBtYW5hZ2VtZW50ICovCi1zdGF0aWMgQVZDb2RlYyAqZmlyc3RfYXZjb2RlYyA9IE5VTEw7Ci1zdGF0aWMgQVZDb2RlYyAqKmxhc3RfYXZjb2RlYyA9ICZmaXJzdF9hdmNvZGVjOwotCi1BVkNvZGVjICphdl9jb2RlY19uZXh0KGNvbnN0IEFWQ29kZWMgKmMpCi17Ci0gICAgaWYgKGMpCi0gICAgICAgIHJldHVybiBjLT5uZXh0OwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGZpcnN0X2F2Y29kZWM7Ci19Ci0KLXN0YXRpYyBhdl9jb2xkIHZvaWQgYXZjb2RlY19pbml0KHZvaWQpCi17Ci0gICAgc3RhdGljIGludCBpbml0aWFsaXplZCA9IDA7Ci0KLSAgICBpZiAoaW5pdGlhbGl6ZWQgIT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIGluaXRpYWxpemVkID0gMTsKLQotICAgIGlmIChDT05GSUdfTUVfQ01QKQotICAgICAgICBmZl9tZV9jbXBfaW5pdF9zdGF0aWMoKTsKLX0KLQogaW50IGF2X2NvZGVjX2lzX2VuY29kZXIoY29uc3QgQVZDb2RlYyAqY29kZWMpCiB7Ci0gICAgcmV0dXJuIGNvZGVjICYmIChjb2RlYy0+ZW5jb2RlX3N1YiB8fCBjb2RlYy0+ZW5jb2RlMik7CisgICAgcmV0dXJuIGNvZGVjICYmIChjb2RlYy0+ZW5jb2RlX3N1YiB8fCBjb2RlYy0+ZW5jb2RlMiB8fGNvZGVjLT5zZW5kX2ZyYW1lKTsKIH0KIAogaW50IGF2X2NvZGVjX2lzX2RlY29kZXIoY29uc3QgQVZDb2RlYyAqY29kZWMpCiB7Ci0gICAgcmV0dXJuIGNvZGVjICYmIGNvZGVjLT5kZWNvZGU7CisgICAgcmV0dXJuIGNvZGVjICYmIChjb2RlYy0+ZGVjb2RlIHx8IGNvZGVjLT5yZWNlaXZlX2ZyYW1lKTsKIH0KIAotYXZfY29sZCB2b2lkIGF2Y29kZWNfcmVnaXN0ZXIoQVZDb2RlYyAqY29kZWMpCi17Ci0gICAgQVZDb2RlYyAqKnA7Ci0gICAgYXZjb2RlY19pbml0KCk7Ci0gICAgcCA9IGxhc3RfYXZjb2RlYzsKLSAgICBjb2RlYy0+bmV4dCA9IE5VTEw7Ci0KLSAgICB3aGlsZSgqcCB8fCBhdnByaXZfYXRvbWljX3B0cl9jYXMoKHZvaWQgKiB2b2xhdGlsZSAqKXAsIE5VTEwsIGNvZGVjKSkKLSAgICAgICAgcCA9ICYoKnApLT5uZXh0OwotICAgIGxhc3RfYXZjb2RlYyA9ICZjb2RlYy0+bmV4dDsKLQotICAgIGlmIChjb2RlYy0+aW5pdF9zdGF0aWNfZGF0YSkKLSAgICAgICAgY29kZWMtPmluaXRfc3RhdGljX2RhdGEoY29kZWMpOwotfQotCi0jaWYgRkZfQVBJX0VNVV9FREdFCi11bnNpZ25lZCBhdmNvZGVjX2dldF9lZGdlX3dpZHRoKHZvaWQpCi17Ci0gICAgcmV0dXJuIEVER0VfV0lEVEg7Ci19Ci0jZW5kaWYKLQotI2lmIEZGX0FQSV9TRVRfRElNRU5TSU9OUwotdm9pZCBhdmNvZGVjX3NldF9kaW1lbnNpb25zKEFWQ29kZWNDb250ZXh0ICpzLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgaW50IHJldCA9IGZmX3NldF9kaW1lbnNpb25zKHMsIHdpZHRoLCBoZWlnaHQpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBzZXQgZGltZW5zaW9ucyAlZCAlZFxuIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotfQotI2VuZGlmCi0KIGludCBmZl9zZXRfZGltZW5zaW9ucyhBVkNvZGVjQ29udGV4dCAqcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewotICAgIGludCByZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHdpZHRoLCBoZWlnaHQsIDAsIHMpOworICAgIGludCByZXQgPSBhdl9pbWFnZV9jaGVja19zaXplMih3aWR0aCwgaGVpZ2h0LCBzLT5tYXhfcGl4ZWxzLCBBVl9QSVhfRk1UX05PTkUsIDAsIHMpOwogCiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHdpZHRoID0gaGVpZ2h0ID0gMDsKQEAgLTM1MSw2ICsyNDYsOCBAQAogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTRCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE2TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEyTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTJCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNkxFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDE2QkU6CiAgICAgICAgIHdfYWxpZ24gPSAxNjsgLy9GSVhNRSBhc3N1bWUgMTYgcGl4ZWwgcGVyIG1hY3JvYmxvY2sKQEAgLTM3Myw2ICsyNzAsMTAgQEAKICAgICAgICAgICAgIHdfYWxpZ24gPSA0OwogICAgICAgICAgICAgaF9hbGlnbiA9IDQ7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0lOVEVSUExBWV9WSURFTykgeworICAgICAgICAgICAgd19hbGlnbiA9IDg7CisgICAgICAgICAgICBoX2FsaWduID0gODsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1BJWF9GTVRfUEFMODoKICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSODoKQEAgLTM4Miw3ICsyODMsOCBAQAogICAgICAgICAgICAgd19hbGlnbiA9IDQ7CiAgICAgICAgICAgICBoX2FsaWduID0gNDsKICAgICAgICAgfQotICAgICAgICBpZiAocy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSlYpIHsKKyAgICAgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0pWIHx8CisgICAgICAgICAgICBzLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9JTlRFUlBMQVlfVklERU8pIHsKICAgICAgICAgICAgIHdfYWxpZ24gPSA4OwogICAgICAgICAgICAgaF9hbGlnbiA9IDg7CiAgICAgICAgIH0KQEAgLTQxMCw3ICszMTIsMTAgQEAKIAogICAgICp3aWR0aCAgPSBGRkFMSUdOKCp3aWR0aCwgd19hbGlnbik7CiAgICAgKmhlaWdodCA9IEZGQUxJR04oKmhlaWdodCwgaF9hbGlnbik7Ci0gICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwgcy0+bG93cmVzKSB7CisgICAgaWYgKHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwgcy0+bG93cmVzIHx8CisgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNSAgfHwgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2IHx8CisgICAgICAgIHMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkYgfHwgcy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2QQorICAgICkgewogICAgICAgICAvLyBzb21lIG9mIHRoZSBvcHRpbWl6ZWQgY2hyb21hIE1DIHJlYWRzIG9uZSBsaW5lIHRvbyBtdWNoCiAgICAgICAgIC8vIHdoaWNoIGlzIGFsc28gZG9uZSBpbiBtcGVnIGRlY29kZXJzIHdpdGggbG93cmVzID4gMAogICAgICAgICAqaGVpZ2h0ICs9IDI7CkBAIC01MDAsMjAwICs0MDUsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgdXBkYXRlX2ZyYW1lX3Bvb2woQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKLXsKLSAgICBGcmFtZVBvb2wgKnBvb2wgPSBhdmN0eC0+aW50ZXJuYWwtPnBvb2w7Ci0gICAgaW50IGksIHJldDsKLQotICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX3R5cGUpIHsKLSAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzogewotICAgICAgICB1aW50OF90ICpkYXRhWzRdOwotICAgICAgICBpbnQgbGluZXNpemVbNF07Ci0gICAgICAgIGludCBzaXplWzRdID0geyAwIH07Ci0gICAgICAgIGludCB3ID0gZnJhbWUtPndpZHRoOwotICAgICAgICBpbnQgaCA9IGZyYW1lLT5oZWlnaHQ7Ci0gICAgICAgIGludCB0bXBzaXplLCB1bmFsaWduZWQ7Ci0KLSAgICAgICAgaWYgKHBvb2wtPmZvcm1hdCA9PSBmcmFtZS0+Zm9ybWF0ICYmCi0gICAgICAgICAgICBwb29sLT53aWR0aCA9PSBmcmFtZS0+d2lkdGggJiYgcG9vbC0+aGVpZ2h0ID09IGZyYW1lLT5oZWlnaHQpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICBhdmNvZGVjX2FsaWduX2RpbWVuc2lvbnMyKGF2Y3R4LCAmdywgJmgsIHBvb2wtPnN0cmlkZV9hbGlnbik7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgLy8gTk9URTogZG8gbm90IGFsaWduIGxpbmVzaXplcyBpbmRpdmlkdWFsbHksIHRoaXMgYnJlYWtzIGUuZy4gYXNzdW1wdGlvbnMKLSAgICAgICAgICAgIC8vIHRoYXQgbGluZXNpemVbMF0gPT0gMipsaW5lc2l6ZVsxXSBpbiB0aGUgTVBFRy1lbmNvZGVyIGZvciA0OjI6MgotICAgICAgICAgICAgcmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMobGluZXNpemUsIGF2Y3R4LT5waXhfZm10LCB3KTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAvLyBpbmNyZWFzZSBhbGlnbm1lbnQgb2YgdyBmb3IgbmV4dCB0cnkgKHJocyBnaXZlcyB0aGUgbG93ZXN0IGJpdCBzZXQgaW4gdykKLSAgICAgICAgICAgIHcgKz0gdyAmIH4odyAtIDEpOwotCi0gICAgICAgICAgICB1bmFsaWduZWQgPSAwOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgICAgICAgICB1bmFsaWduZWQgfD0gbGluZXNpemVbaV0gJSBwb29sLT5zdHJpZGVfYWxpZ25baV07Ci0gICAgICAgIH0gd2hpbGUgKHVuYWxpZ25lZCk7Ci0KLSAgICAgICAgdG1wc2l6ZSA9IGF2X2ltYWdlX2ZpbGxfcG9pbnRlcnMoZGF0YSwgYXZjdHgtPnBpeF9mbXQsIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGxpbmVzaXplKTsKLSAgICAgICAgaWYgKHRtcHNpemUgPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzICYmIGRhdGFbaSArIDFdOyBpKyspCi0gICAgICAgICAgICBzaXplW2ldID0gZGF0YVtpICsgMV0gLSBkYXRhW2ldOwotICAgICAgICBzaXplW2ldID0gdG1wc2l6ZSAtIChkYXRhW2ldIC0gZGF0YVswXSk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZwb29sLT5wb29sc1tpXSk7Ci0gICAgICAgICAgICBwb29sLT5saW5lc2l6ZVtpXSA9IGxpbmVzaXplW2ldOwotICAgICAgICAgICAgaWYgKHNpemVbaV0pIHsKLSAgICAgICAgICAgICAgICBwb29sLT5wb29sc1tpXSA9IGF2X2J1ZmZlcl9wb29sX2luaXQoc2l6ZVtpXSArIDE2ICsgU1RSSURFX0FMSUdOIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09ORklHX01FTU9SWV9QT0lTT05JTkcgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnVmZmVyX2FsbG9jeik7Ci0gICAgICAgICAgICAgICAgaWYgKCFwb29sLT5wb29sc1tpXSkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcG9vbC0+Zm9ybWF0ID0gZnJhbWUtPmZvcm1hdDsKLSAgICAgICAgcG9vbC0+d2lkdGggID0gZnJhbWUtPndpZHRoOwotICAgICAgICBwb29sLT5oZWlnaHQgPSBmcmFtZS0+aGVpZ2h0OwotCi0gICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86IHsKLSAgICAgICAgaW50IGNoICAgICA9IGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSk7IC8vYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGZyYW1lLT5jaGFubmVsX2xheW91dCk7Ci0gICAgICAgIGludCBwbGFuYXIgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihmcmFtZS0+Zm9ybWF0KTsKLSAgICAgICAgaW50IHBsYW5lcyA9IHBsYW5hciA/IGNoIDogMTsKLQotICAgICAgICBpZiAocG9vbC0+Zm9ybWF0ID09IGZyYW1lLT5mb3JtYXQgJiYgcG9vbC0+cGxhbmVzID09IHBsYW5lcyAmJgotICAgICAgICAgICAgcG9vbC0+Y2hhbm5lbHMgPT0gY2ggJiYgZnJhbWUtPm5iX3NhbXBsZXMgPT0gcG9vbC0+c2FtcGxlcykKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmcG9vbC0+cG9vbHNbMF0pOwotICAgICAgICByZXQgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZSgmcG9vbC0+bGluZXNpemVbMF0sIGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcywgZnJhbWUtPmZvcm1hdCwgMCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotCi0gICAgICAgIHBvb2wtPnBvb2xzWzBdID0gYXZfYnVmZmVyX3Bvb2xfaW5pdChwb29sLT5saW5lc2l6ZVswXSwgTlVMTCk7Ci0gICAgICAgIGlmICghcG9vbC0+cG9vbHNbMF0pIHsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIHBvb2wtPmZvcm1hdCAgICAgPSBmcmFtZS0+Zm9ybWF0OwotICAgICAgICBwb29sLT5wbGFuZXMgICAgID0gcGxhbmVzOwotICAgICAgICBwb29sLT5jaGFubmVscyAgID0gY2g7Ci0gICAgICAgIHBvb2wtPnNhbXBsZXMgPSBmcmFtZS0+bmJfc2FtcGxlczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOwotICAgIH0KLSAgICByZXR1cm4gMDsKLWZhaWw6Ci0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZwb29sLT5wb29sc1tpXSk7Ci0gICAgcG9vbC0+Zm9ybWF0ID0gLTE7Ci0gICAgcG9vbC0+cGxhbmVzID0gcG9vbC0+Y2hhbm5lbHMgPSBwb29sLT5zYW1wbGVzID0gMDsKLSAgICBwb29sLT53aWR0aCAgPSBwb29sLT5oZWlnaHQgPSAwOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgYXVkaW9fZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQotewotICAgIEZyYW1lUG9vbCAqcG9vbCA9IGF2Y3R4LT5pbnRlcm5hbC0+cG9vbDsKLSAgICBpbnQgcGxhbmVzID0gcG9vbC0+cGxhbmVzOwotICAgIGludCBpOwotCi0gICAgZnJhbWUtPmxpbmVzaXplWzBdID0gcG9vbC0+bGluZXNpemVbMF07Ci0KLSAgICBpZiAocGxhbmVzID4gQVZfTlVNX0RBVEFfUE9JTlRFUlMpIHsKLSAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBhdl9tYWxsb2N6X2FycmF5KHBsYW5lcywgc2l6ZW9mKCpmcmFtZS0+ZXh0ZW5kZWRfZGF0YSkpOwotICAgICAgICBmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmID0gcGxhbmVzIC0gQVZfTlVNX0RBVEFfUE9JTlRFUlM7Ci0gICAgICAgIGZyYW1lLT5leHRlbmRlZF9idWYgID0gYXZfbWFsbG9jel9hcnJheShmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmcmFtZS0+ZXh0ZW5kZWRfYnVmKSk7Ci0gICAgICAgIGlmICghZnJhbWUtPmV4dGVuZGVkX2RhdGEgfHwgIWZyYW1lLT5leHRlbmRlZF9idWYpIHsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZmcmFtZS0+ZXh0ZW5kZWRfZGF0YSk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmZnJhbWUtPmV4dGVuZGVkX2J1Zik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBmcmFtZS0+ZGF0YTsKLSAgICAgICAgYXZfYXNzZXJ0MChmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmID09IDApOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihwbGFuZXMsIEFWX05VTV9EQVRBX1BPSU5URVJTKTsgaSsrKSB7Ci0gICAgICAgIGZyYW1lLT5idWZbaV0gPSBhdl9idWZmZXJfcG9vbF9nZXQocG9vbC0+cG9vbHNbMF0pOwotICAgICAgICBpZiAoIWZyYW1lLT5idWZbaV0pCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW2ldID0gZnJhbWUtPmRhdGFbaV0gPSBmcmFtZS0+YnVmW2ldLT5kYXRhOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZjsgaSsrKSB7Ci0gICAgICAgIGZyYW1lLT5leHRlbmRlZF9idWZbaV0gPSBhdl9idWZmZXJfcG9vbF9nZXQocG9vbC0+cG9vbHNbMF0pOwotICAgICAgICBpZiAoIWZyYW1lLT5leHRlbmRlZF9idWZbaV0pCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW2kgKyBBVl9OVU1fREFUQV9QT0lOVEVSU10gPSBmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldLT5kYXRhOwotICAgIH0KLQotICAgIGlmIChhdmN0eC0+ZGVidWcgJiBGRl9ERUJVR19CVUZGRVJTKQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImRlZmF1bHRfZ2V0X2J1ZmZlciBjYWxsZWQgb24gZnJhbWUgJXAiLCBmcmFtZSk7Ci0KLSAgICByZXR1cm4gMDsKLWZhaWw6Ci0gICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOwotICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW9fZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqcGljKQotewotICAgIEZyYW1lUG9vbCAqcG9vbCA9IHMtPmludGVybmFsLT5wb29sOwotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGljLT5mb3JtYXQpOwotICAgIGludCBpOwotCi0gICAgaWYgKHBpYy0+ZGF0YVswXSkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicGljLT5kYXRhWzBdIT1OVUxMIGluIGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGlmICghZGVzYykgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgIlVuYWJsZSB0byBnZXQgcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3IgZm9yIGZvcm1hdCAlc1xuIiwKLSAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocGljLT5mb3JtYXQpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICBtZW1zZXQocGljLT5kYXRhLCAwLCBzaXplb2YocGljLT5kYXRhKSk7Ci0gICAgcGljLT5leHRlbmRlZF9kYXRhID0gcGljLT5kYXRhOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQgJiYgcG9vbC0+cG9vbHNbaV07IGkrKykgewotICAgICAgICBwaWMtPmxpbmVzaXplW2ldID0gcG9vbC0+bGluZXNpemVbaV07Ci0KLSAgICAgICAgcGljLT5idWZbaV0gPSBhdl9idWZmZXJfcG9vbF9nZXQocG9vbC0+cG9vbHNbaV0pOwotICAgICAgICBpZiAoIXBpYy0+YnVmW2ldKQotICAgICAgICAgICAgZ290byBmYWlsOwotCi0gICAgICAgIHBpYy0+ZGF0YVtpXSA9IHBpYy0+YnVmW2ldLT5kYXRhOwotICAgIH0KLSAgICBmb3IgKDsgaSA8IEFWX05VTV9EQVRBX1BPSU5URVJTOyBpKyspIHsKLSAgICAgICAgcGljLT5kYXRhW2ldID0gTlVMTDsKLSAgICAgICAgcGljLT5saW5lc2l6ZVtpXSA9IDA7Ci0gICAgfQotICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwKLSAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKQotICAgICAgICBhdnByaXZfc2V0X3N5c3RlbWF0aWNfcGFsMigodWludDMyX3QgKilwaWMtPmRhdGFbMV0sIHBpYy0+Zm9ybWF0KTsKLQotICAgIGlmIChzLT5kZWJ1ZyAmIEZGX0RFQlVHX0JVRkZFUlMpCi0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJkZWZhdWx0X2dldF9idWZmZXIgY2FsbGVkIG9uIHBpYyAlcFxuIiwgcGljKTsKLQotICAgIHJldHVybiAwOwotZmFpbDoKLSAgICBhdl9mcmFtZV91bnJlZihwaWMpOwotICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci19Ci0KIHZvaWQgZmZfY29sb3JfZnJhbWUoQVZGcmFtZSAqZnJhbWUsIGNvbnN0IGludCBjWzRdKQogewogICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZnJhbWUtPmZvcm1hdCk7CkBAIC03MTcsMjM3ICs0MjgsNiBAQAogICAgIH0KIH0KIAotaW50IGF2Y29kZWNfZGVmYXVsdF9nZXRfYnVmZmVyMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCi17Ci0gICAgaW50IHJldDsKLQotICAgIGlmICgocmV0ID0gdXBkYXRlX2ZyYW1lX3Bvb2woYXZjdHgsIGZyYW1lKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfdHlwZSkgewotICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICByZXR1cm4gdmlkZW9fZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUpOwotICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICByZXR1cm4gYXVkaW9fZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUpOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgYWRkX21ldGFkYXRhX2Zyb21fc2lkZV9kYXRhKEFWUGFja2V0ICphdnBrdCwgQVZGcmFtZSAqZnJhbWUpCi17Ci0gICAgaW50IHNpemU7Ci0gICAgY29uc3QgdWludDhfdCAqc2lkZV9tZXRhZGF0YTsKLQotICAgIEFWRGljdGlvbmFyeSAqKmZyYW1lX21kID0gYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoZnJhbWUpOwotCi0gICAgc2lkZV9tZXRhZGF0YSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2cGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9TVFJJTkdTX01FVEFEQVRBLCAmc2l6ZSk7Ci0gICAgcmV0dXJuIGF2X3BhY2tldF91bnBhY2tfZGljdGlvbmFyeShzaWRlX21ldGFkYXRhLCBzaXplLCBmcmFtZV9tZCk7Ci19Ci0KLWludCBmZl9pbml0X2J1ZmZlcl9pbmZvKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCi17Ci0gICAgQVZQYWNrZXQgKnBrdCA9IGF2Y3R4LT5pbnRlcm5hbC0+cGt0OwotICAgIGludCBpOwotICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICBlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHBhY2tldDsKLSAgICAgICAgZW51bSBBVkZyYW1lU2lkZURhdGFUeXBlIGZyYW1lOwotICAgIH0gc2RbXSA9IHsKLSAgICAgICAgeyBBVl9QS1RfREFUQV9SRVBMQVlHQUlOICwgICBBVl9GUkFNRV9EQVRBX1JFUExBWUdBSU4gfSwKLSAgICAgICAgeyBBVl9QS1RfREFUQV9ESVNQTEFZTUFUUklYLCBBVl9GUkFNRV9EQVRBX0RJU1BMQVlNQVRSSVggfSwKLSAgICAgICAgeyBBVl9QS1RfREFUQV9TVEVSRU8zRCwgICAgICBBVl9GUkFNRV9EQVRBX1NURVJFTzNEIH0sCi0gICAgICAgIHsgQVZfUEtUX0RBVEFfQVVESU9fU0VSVklDRV9UWVBFLCBBVl9GUkFNRV9EQVRBX0FVRElPX1NFUlZJQ0VfVFlQRSB9LAotICAgIH07Ci0KLSAgICBpZiAocGt0KSB7Ci0gICAgICAgIGZyYW1lLT5wa3RfcHRzID0gcGt0LT5wdHM7Ci0gICAgICAgIGF2X2ZyYW1lX3NldF9wa3RfcG9zICAgICAoZnJhbWUsIHBrdC0+cG9zKTsKLSAgICAgICAgYXZfZnJhbWVfc2V0X3BrdF9kdXJhdGlvbihmcmFtZSwgcGt0LT5kdXJhdGlvbik7Ci0gICAgICAgIGF2X2ZyYW1lX3NldF9wa3Rfc2l6ZSAgICAoZnJhbWUsIHBrdC0+c2l6ZSk7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNkKTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnBhY2tldF9zZCA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgc2RbaV0ucGFja2V0LCAmc2l6ZSk7Ci0gICAgICAgICAgICBpZiAocGFja2V0X3NkKSB7Ci0gICAgICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpmcmFtZV9zZCA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RbaV0uZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFmcmFtZV9zZCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgICAgICAgICAgICAgIG1lbWNweShmcmFtZV9zZC0+ZGF0YSwgcGFja2V0X3NkLCBzaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhZGRfbWV0YWRhdGFfZnJvbV9zaWRlX2RhdGEocGt0LCBmcmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZnJhbWUtPnBrdF9wdHMgPSBBVl9OT1BUU19WQUxVRTsKLSAgICAgICAgYXZfZnJhbWVfc2V0X3BrdF9wb3MgICAgIChmcmFtZSwgLTEpOwotICAgICAgICBhdl9mcmFtZV9zZXRfcGt0X2R1cmF0aW9uKGZyYW1lLCAwKTsKLSAgICAgICAgYXZfZnJhbWVfc2V0X3BrdF9zaXplICAgIChmcmFtZSwgLTEpOwotICAgIH0KLSAgICBmcmFtZS0+cmVvcmRlcmVkX29wYXF1ZSA9IGF2Y3R4LT5yZW9yZGVyZWRfb3BhcXVlOwotCi0gICAgaWYgKGZyYW1lLT5jb2xvcl9wcmltYXJpZXMgPT0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEKQotICAgICAgICBmcmFtZS0+Y29sb3JfcHJpbWFyaWVzID0gYXZjdHgtPmNvbG9yX3ByaW1hcmllczsKLSAgICBpZiAoZnJhbWUtPmNvbG9yX3RyYyA9PSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQpCi0gICAgICAgIGZyYW1lLT5jb2xvcl90cmMgPSBhdmN0eC0+Y29sb3JfdHJjOwotICAgIGlmIChhdl9mcmFtZV9nZXRfY29sb3JzcGFjZShmcmFtZSkgPT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEKQotICAgICAgICBhdl9mcmFtZV9zZXRfY29sb3JzcGFjZShmcmFtZSwgYXZjdHgtPmNvbG9yc3BhY2UpOwotICAgIGlmIChhdl9mcmFtZV9nZXRfY29sb3JfcmFuZ2UoZnJhbWUpID09IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEKQotICAgICAgICBhdl9mcmFtZV9zZXRfY29sb3JfcmFuZ2UoZnJhbWUsIGF2Y3R4LT5jb2xvcl9yYW5nZSk7Ci0gICAgaWYgKGZyYW1lLT5jaHJvbWFfbG9jYXRpb24gPT0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEKQotICAgICAgICBmcmFtZS0+Y2hyb21hX2xvY2F0aW9uID0gYXZjdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb247Ci0KLSAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlYy0+dHlwZSkgewotICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgICAgICA9IGF2Y3R4LT5waXhfZm10OwotICAgICAgICBpZiAoIWZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkKLSAgICAgICAgICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0KLSAgICAgICAgaWYgKGZyYW1lLT53aWR0aCAmJiBmcmFtZS0+aGVpZ2h0ICYmCi0gICAgICAgICAgICBhdl9pbWFnZV9jaGVja19zYXIoZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyBpbnZhbGlkIFNBUjogJXUvJXVcbiIsCi0gICAgICAgICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAotICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7Ci0gICAgICAgICAgICBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgMCwgMSB9OwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgIGlmICghZnJhbWUtPnNhbXBsZV9yYXRlKQotICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9yYXRlICAgID0gYXZjdHgtPnNhbXBsZV9yYXRlOwotICAgICAgICBpZiAoZnJhbWUtPmZvcm1hdCA8IDApCi0gICAgICAgICAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgPSBhdmN0eC0+c2FtcGxlX2ZtdDsKLSAgICAgICAgaWYgKCFmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpIHsKLSAgICAgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpIHsKLSAgICAgICAgICAgICAgICAgaWYgKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpICE9Ci0gICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5jb25zaXN0ZW50IGNoYW5uZWwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWd1cmF0aW9uLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmcmFtZS0+Y2hhbm5lbF9sYXlvdXQgPSBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+Y2hhbm5lbHMgPiBGRl9TQU5FX05CX0NIQU5ORUxTKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIG1hbnkgY2hhbm5lbHM6ICVkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyYW1lX3NldF9jaGFubmVscyhmcmFtZSwgYXZjdHgtPmNoYW5uZWxzKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgZmZfZGVjb2RlX2ZyYW1lX3Byb3BzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCi17Ci0gICAgcmV0dXJuIGZmX2luaXRfYnVmZmVyX2luZm8oYXZjdHgsIGZyYW1lKTsKLX0KLQotc3RhdGljIGludCBnZXRfYnVmZmVyX2ludGVybmFsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncykKLXsKLSAgICBjb25zdCBBVkhXQWNjZWwgKmh3YWNjZWwgPSBhdmN0eC0+aHdhY2NlbDsKLSAgICBpbnQgb3ZlcnJpZGVfZGltZW5zaW9ucyA9IDE7Ci0gICAgaW50IHJldDsKLQotICAgIGlmIChhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgMCwgYXZjdHgpKSA8IDAgfHwgYXZjdHgtPnBpeF9mbXQ8MCkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ2aWRlb19nZXRfYnVmZmVyOiBpbWFnZSBwYXJhbWV0ZXJzIGludmFsaWRcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgIGlmIChmcmFtZS0+d2lkdGggPD0gMCB8fCBmcmFtZS0+aGVpZ2h0IDw9IDApIHsKLSAgICAgICAgICAgIGZyYW1lLT53aWR0aCAgPSBGRk1BWChhdmN0eC0+d2lkdGgsICBBVl9DRUlMX1JTSElGVChhdmN0eC0+Y29kZWRfd2lkdGgsICBhdmN0eC0+bG93cmVzKSk7Ci0gICAgICAgICAgICBmcmFtZS0+aGVpZ2h0ID0gRkZNQVgoYXZjdHgtPmhlaWdodCwgQVZfQ0VJTF9SU0hJRlQoYXZjdHgtPmNvZGVkX2hlaWdodCwgYXZjdHgtPmxvd3JlcykpOwotICAgICAgICAgICAgb3ZlcnJpZGVfZGltZW5zaW9ucyA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0ID0gZmZfZGVjb2RlX2ZyYW1lX3Byb3BzKGF2Y3R4LCBmcmFtZSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBpZiAoaHdhY2NlbCkgewotICAgICAgICBpZiAoaHdhY2NlbC0+YWxsb2NfZnJhbWUpIHsKLSAgICAgICAgICAgIHJldCA9IGh3YWNjZWwtPmFsbG9jX2ZyYW1lKGF2Y3R4LCBmcmFtZSk7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgIH0gZWxzZQotICAgICAgICBhdmN0eC0+c3dfcGl4X2ZtdCA9IGF2Y3R4LT5waXhfZm10OwotCi0gICAgcmV0ID0gYXZjdHgtPmdldF9idWZmZXIyKGF2Y3R4LCBmcmFtZSwgZmxhZ3MpOwotCi1lbmQ6Ci0gICAgaWYgKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiAhb3ZlcnJpZGVfZGltZW5zaW9ucykgewotICAgICAgICBmcmFtZS0+d2lkdGggID0gYXZjdHgtPndpZHRoOwotICAgICAgICBmcmFtZS0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgZmZfZ2V0X2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCi17Ci0gICAgaW50IHJldCA9IGdldF9idWZmZXJfaW50ZXJuYWwoYXZjdHgsIGZyYW1lLCBmbGFncyk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJnZXRfYnVmZmVyKCkgZmFpbGVkXG4iKTsKLSAgICAgICAgZnJhbWUtPndpZHRoID0gZnJhbWUtPmhlaWdodCA9IDA7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcmVnZXRfYnVmZmVyX2ludGVybmFsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCi17Ci0gICAgQVZGcmFtZSAqdG1wOwotICAgIGludCByZXQ7Ci0KLSAgICBhdl9hc3NlcnQwKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyk7Ci0KLSAgICBpZiAoZnJhbWUtPmRhdGFbMF0gJiYgKGZyYW1lLT53aWR0aCAhPSBhdmN0eC0+d2lkdGggfHwgZnJhbWUtPmhlaWdodCAhPSBhdmN0eC0+aGVpZ2h0IHx8IGZyYW1lLT5mb3JtYXQgIT0gYXZjdHgtPnBpeF9mbXQpKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJQaWN0dXJlIGNoYW5nZWQgZnJvbSBzaXplOiVkeCVkIGZtdDolcyB0byBzaXplOiVkeCVkIGZtdDolcyBpbiByZWdldCBidWZmZXIoKVxuIiwKLSAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgYXZfZ2V0X3BpeF9mbXRfbmFtZShmcmFtZS0+Zm9ybWF0KSwgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGF2Y3R4LT5waXhfZm10KSk7Ci0gICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKLSAgICB9Ci0KLSAgICBmZl9pbml0X2J1ZmZlcl9pbmZvKGF2Y3R4LCBmcmFtZSk7Ci0KLSAgICBpZiAoIWZyYW1lLT5kYXRhWzBdKQotICAgICAgICByZXR1cm4gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpOwotCi0gICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkKLSAgICAgICAgcmV0dXJuIGZmX2RlY29kZV9mcmFtZV9wcm9wcyhhdmN0eCwgZnJhbWUpOwotCi0gICAgdG1wID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIXRtcCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIGF2X2ZyYW1lX21vdmVfcmVmKHRtcCwgZnJhbWUpOwotCi0gICAgcmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnRtcCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgYXZfZnJhbWVfY29weShmcmFtZSwgdG1wKTsKLSAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBmZl9yZWdldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKLXsKLSAgICBpbnQgcmV0ID0gcmVnZXRfYnVmZmVyX2ludGVybmFsKGF2Y3R4LCBmcmFtZSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicmVnZXRfYnVmZmVyKCkgZmFpbGVkXG4iKTsKLSAgICByZXR1cm4gcmV0OwotfQotCiBpbnQgYXZjb2RlY19kZWZhdWx0X2V4ZWN1dGUoQVZDb2RlY0NvbnRleHQgKmMsIGludCAoKmZ1bmMpKEFWQ29kZWNDb250ZXh0ICpjMiwgdm9pZCAqYXJnMiksIHZvaWQgKmFyZywgaW50ICpyZXQsIGludCBjb3VudCwgaW50IHNpemUpCiB7CiAgICAgaW50IGk7CkBAIC05NTcsNiArNDM3LDcgQEAKICAgICAgICAgaWYgKHJldCkKICAgICAgICAgICAgIHJldFtpXSA9IHI7CiAgICAgfQorICAgIGVtbXNfYygpOwogICAgIHJldHVybiAwOwogfQogCkBAIC05NjksNiArNDUwLDcgQEAKICAgICAgICAgaWYgKHJldCkKICAgICAgICAgICAgIHJldFtpXSA9IHI7CiAgICAgfQorICAgIGVtbXNfYygpOwogICAgIHJldHVybiAwOwogfQogCkBAIC05ODMsMTMzICs0NjUsNyBAQAogICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7CiB9CiAKLXN0YXRpYyBpbnQgaXNfaHdhY2NlbF9waXhfZm10KGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQotewotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7Ci0gICAgcmV0dXJuIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUw7Ci19Ci0KLWVudW0gQVZQaXhlbEZvcm1hdCBhdmNvZGVjX2RlZmF1bHRfZ2V0X2Zvcm1hdChzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKnMsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqZm10KQotewotICAgIHdoaWxlICgqZm10ICE9IEFWX1BJWF9GTVRfTk9ORSAmJiBpc19od2FjY2VsX3BpeF9mbXQoKmZtdCkpCi0gICAgICAgICsrZm10OwotICAgIHJldHVybiBmbXRbMF07Ci19Ci0KLXN0YXRpYyBBVkhXQWNjZWwgKmZpbmRfaHdhY2NlbChlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKLXsKLSAgICBBVkhXQWNjZWwgKmh3YWNjZWwgPSBOVUxMOwotCi0gICAgd2hpbGUgKChod2FjY2VsID0gYXZfaHdhY2NlbF9uZXh0KGh3YWNjZWwpKSkKLSAgICAgICAgaWYgKGh3YWNjZWwtPmlkID09IGNvZGVjX2lkCi0gICAgICAgICAgICAmJiBod2FjY2VsLT5waXhfZm10ID09IHBpeF9mbXQpCi0gICAgICAgICAgICByZXR1cm4gaHdhY2NlbDsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGludCBzZXR1cF9od2FjY2VsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgQVZIV0FjY2VsICpod2EgPSBmaW5kX2h3YWNjZWwoYXZjdHgtPmNvZGVjX2lkLCBmbXQpOwotICAgIGludCByZXQgICAgICAgID0gMDsKLQotICAgIGlmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAiSGFyZHdhcmUgYWNjZWxlcmF0ZWQgZGVjb2Rpbmcgd2l0aCBmcmFtZSB0aHJlYWRpbmcgaXMga25vd24gdG8gYmUgdW5zdGFibGUgYW5kIGl0cyB1c2UgaXMgZGlzY291cmFnZWQuXG4iKTsKLSAgICB9Ci0KLSAgICBpZiAoIWh3YSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBhbiBBVkhXQWNjZWwgZm9yIHRoZSBwaXhlbCBmb3JtYXQ6ICVzIiwKLSAgICAgICAgICAgICAgIG5hbWUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOwotICAgIH0KLQotICAgIGlmIChod2EtPmNhcGFiaWxpdGllcyAmIEhXQUNDRUxfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCAmJgotICAgICAgICBhdmN0eC0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIklnbm9yaW5nIGV4cGVyaW1lbnRhbCBod2FjY2VsOiAlc1xuIiwKLSAgICAgICAgICAgICAgIGh3YS0+bmFtZSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKLSAgICB9Ci0KLSAgICBpZiAoaHdhLT5wcml2X2RhdGFfc2l6ZSkgewotICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhID0gYXZfbWFsbG9jeihod2EtPnByaXZfZGF0YV9zaXplKTsKLSAgICAgICAgaWYgKCFhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICBpZiAoaHdhLT5pbml0KSB7Ci0gICAgICAgIHJldCA9IGh3YS0+aW5pdChhdmN0eCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXZjdHgtPmh3YWNjZWwgPSBod2E7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGZmX2dldF9mb3JtYXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZtdCkKLXsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0ICpjaG9pY2VzOwotICAgIGVudW0gQVZQaXhlbEZvcm1hdCByZXQ7Ci0gICAgdW5zaWduZWQgbiA9IDA7Ci0KLSAgICB3aGlsZSAoZm10W25dICE9IEFWX1BJWF9GTVRfTk9ORSkKLSAgICAgICAgKytuOwotCi0gICAgYXZfYXNzZXJ0MChuID49IDEpOwotICAgIGF2Y3R4LT5zd19waXhfZm10ID0gZm10W24gLSAxXTsKLSAgICBhdl9hc3NlcnQyKCFpc19od2FjY2VsX3BpeF9mbXQoYXZjdHgtPnN3X3BpeF9mbXQpKTsKLQotICAgIGNob2ljZXMgPSBhdl9tYWxsb2NfYXJyYXkobiArIDEsIHNpemVvZigqY2hvaWNlcykpOwotICAgIGlmICghY2hvaWNlcykKLSAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKLQotICAgIG1lbWNweShjaG9pY2VzLCBmbXQsIChuICsgMSkgKiBzaXplb2YoKmNob2ljZXMpKTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsICYmIGF2Y3R4LT5od2FjY2VsLT51bmluaXQpCi0gICAgICAgICAgICBhdmN0eC0+aHdhY2NlbC0+dW5pbml0KGF2Y3R4KTsKLSAgICAgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGEpOwotICAgICAgICBhdmN0eC0+aHdhY2NlbCA9IE5VTEw7Ci0KLSAgICAgICAgcmV0ID0gYXZjdHgtPmdldF9mb3JtYXQoYXZjdHgsIGNob2ljZXMpOwotCi0gICAgICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHJldCk7Ci0gICAgICAgIGlmICghZGVzYykgewotICAgICAgICAgICAgcmV0ID0gQVZfUElYX0ZNVF9OT05FOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMKSkKLSAgICAgICAgICAgIGJyZWFrOwotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzJkFWX0NPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVKQotICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICBpZiAoIXNldHVwX2h3YWNjZWwoYXZjdHgsIHJldCwgZGVzYy0+bmFtZSkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBSZW1vdmUgZmFpbGVkIGh3YWNjZWwgZnJvbSBjaG9pY2VzICovCi0gICAgICAgIGZvciAobiA9IDA7IGNob2ljZXNbbl0gIT0gcmV0OyBuKyspCi0gICAgICAgICAgICBhdl9hc3NlcnQwKGNob2ljZXNbbl0gIT0gQVZfUElYX0ZNVF9OT05FKTsKLQotICAgICAgICBkbwotICAgICAgICAgICAgY2hvaWNlc1tuXSA9IGNob2ljZXNbbiArIDFdOwotICAgICAgICB3aGlsZSAoY2hvaWNlc1tuKytdICE9IEFWX1BJWF9GTVRfTk9ORSk7Ci0gICAgfQotCi0gICAgYXZfZnJlZXAoJmNob2ljZXMpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KKyNpZiBGRl9BUElfQ09ERUNfR0VUX1NFVAogTUFLRV9BQ0NFU1NPUlMoQVZDb2RlY0NvbnRleHQsIGNvZGVjLCBBVlJhdGlvbmFsLCBwa3RfdGltZWJhc2UpCiBNQUtFX0FDQ0VTU09SUyhBVkNvZGVjQ29udGV4dCwgY29kZWMsIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICosIGNvZGVjX2Rlc2NyaXB0b3IpCiBNQUtFX0FDQ0VTU09SUyhBVkNvZGVjQ29udGV4dCwgY29kZWMsIGludCwgbG93cmVzKQpAQCAtMTEyNSwxMSArNDgxLDEwIEBACiB7CiAgICAgcmV0dXJuIGNvZGVjLT5tYXhfbG93cmVzOwogfQorI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGdldF9zdWJ0aXRsZV9kZWZhdWx0cyhBVlN1YnRpdGxlICpzdWIpCi17Ci0gICAgbWVtc2V0KHN1YiwgMCwgc2l6ZW9mKCpzdWIpKTsKLSAgICBzdWItPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworaW50IGF2cHJpdl9jb2RlY19nZXRfY2FwX3NraXBfZnJhbWVfZmlsbF9wYXJhbShjb25zdCBBVkNvZGVjICpjb2RlYyl7CisgICAgcmV0dXJuICEhKGNvZGVjLT5jYXBzX2ludGVybmFsICYgRkZfQ09ERUNfQ0FQX1NLSVBfRlJBTUVfRklMTF9QQVJBTSk7CiB9CiAKIHN0YXRpYyBpbnQ2NF90IGdldF9iaXRfcmF0ZShBVkNvZGVjQ29udGV4dCAqY3R4KQpAQCAtMTE1NSw2ICs1MTAsMTkgQEAKICAgICByZXR1cm4gYml0X3JhdGU7CiB9CiAKKworc3RhdGljIHZvaWQgZmZfbG9ja19hdmNvZGVjKEFWQ29kZWNDb250ZXh0ICpsb2dfY3R4LCBjb25zdCBBVkNvZGVjICpjb2RlYykKK3sKKyAgICBpZiAoIShjb2RlYy0+Y2Fwc19pbnRlcm5hbCAmIEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUpICYmIGNvZGVjLT5pbml0KQorICAgICAgICBmZl9tdXRleF9sb2NrKCZjb2RlY19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIGZmX3VubG9ja19hdmNvZGVjKGNvbnN0IEFWQ29kZWMgKmNvZGVjKQoreworICAgIGlmICghKGNvZGVjLT5jYXBzX2ludGVybmFsICYgRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSkgJiYgY29kZWMtPmluaXQpCisgICAgICAgIGZmX211dGV4X3VubG9jaygmY29kZWNfbXV0ZXgpOworfQorCiBpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBmZl9jb2RlY19vcGVuMl9yZWN1cnNpdmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkNvZGVjICpjb2RlYywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKIHsKICAgICBpbnQgcmV0ID0gMDsKQEAgLTExOTQsMTEgKzU2Miw5IEBACiAgICAgaWYgKG9wdGlvbnMpCiAgICAgICAgIGF2X2RpY3RfY29weSgmdG1wLCAqb3B0aW9ucywgMCk7CiAKLSAgICByZXQgPSBmZl9sb2NrX2F2Y29kZWMoYXZjdHgsIGNvZGVjKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmZl9sb2NrX2F2Y29kZWMoYXZjdHgsIGNvZGVjKTsKIAotICAgIGF2Y3R4LT5pbnRlcm5hbCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWQ29kZWNJbnRlcm5hbCkpOworICAgIGF2Y3R4LT5pbnRlcm5hbCA9IGF2X21hbGxvY3ooc2l6ZW9mKCphdmN0eC0+aW50ZXJuYWwpKTsKICAgICBpZiAoIWF2Y3R4LT5pbnRlcm5hbCkgewogICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGdvdG8gZW5kOwpAQCAtMTIxNiw2ICs1ODIsMzggQEAKICAgICAgICAgZ290byBmcmVlX2FuZF9lbmQ7CiAgICAgfQogCisgICAgYXZjdHgtPmludGVybmFsLT5jb21wYXRfZGVjb2RlX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5pbnRlcm5hbC0+Y29tcGF0X2RlY29kZV9mcmFtZSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgIH0KKworICAgIGF2Y3R4LT5pbnRlcm5hbC0+YnVmZmVyX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWF2Y3R4LT5pbnRlcm5hbC0+YnVmZmVyX2ZyYW1lKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmcmVlX2FuZF9lbmQ7CisgICAgfQorCisgICAgYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0ID0gYXZfcGFja2V0X2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+aW50ZXJuYWwtPmJ1ZmZlcl9wa3QpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICB9CisKKyAgICBhdmN0eC0+aW50ZXJuYWwtPmRzLmluX3BrdCA9IGF2X3BhY2tldF9hbGxvYygpOworICAgIGlmICghYXZjdHgtPmludGVybmFsLT5kcy5pbl9wa3QpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICB9CisKKyAgICBhdmN0eC0+aW50ZXJuYWwtPmxhc3RfcGt0X3Byb3BzID0gYXZfcGFja2V0X2FsbG9jKCk7CisgICAgaWYgKCFhdmN0eC0+aW50ZXJuYWwtPmxhc3RfcGt0X3Byb3BzKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmcmVlX2FuZF9lbmQ7CisgICAgfQorCisgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXNfbXVsdGlwbGllciA9IDE7CisKICAgICBpZiAoY29kZWMtPnByaXZfZGF0YV9zaXplID4gMCkgewogICAgICAgICBpZiAoIWF2Y3R4LT5wcml2X2RhdGEpIHsKICAgICAgICAgICAgIGF2Y3R4LT5wcml2X2RhdGEgPSBhdl9tYWxsb2N6KGNvZGVjLT5wcml2X2RhdGFfc2l6ZSk7CkBAIC0xMjU0LDggKzY1Miw4IEBACiAgICAgfQogCiAgICAgaWYgKChhdmN0eC0+Y29kZWRfd2lkdGggfHwgYXZjdHgtPmNvZGVkX2hlaWdodCB8fCBhdmN0eC0+d2lkdGggfHwgYXZjdHgtPmhlaWdodCkKLSAgICAgICAgJiYgKCAgYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+Y29kZWRfd2lkdGgsIGF2Y3R4LT5jb2RlZF9oZWlnaHQsIDAsIGF2Y3R4KSA8IDAKLSAgICAgICAgICAgfHwgYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsICAgICAgIGF2Y3R4LT5oZWlnaHQsICAgICAgIDAsIGF2Y3R4KSA8IDApKSB7CisgICAgICAgICYmICggIGF2X2ltYWdlX2NoZWNrX3NpemUyKGF2Y3R4LT5jb2RlZF93aWR0aCwgYXZjdHgtPmNvZGVkX2hlaWdodCwgYXZjdHgtPm1heF9waXhlbHMsIEFWX1BJWF9GTVRfTk9ORSwgMCwgYXZjdHgpIDwgMAorICAgICAgICAgICB8fCBhdl9pbWFnZV9jaGVja19zaXplMihhdmN0eC0+d2lkdGgsICAgICAgIGF2Y3R4LT5oZWlnaHQsICAgICAgIGF2Y3R4LT5tYXhfcGl4ZWxzLCBBVl9QSVhfRk1UX05PTkUsIDAsIGF2Y3R4KSA8IDApKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJZ25vcmluZyBpbnZhbGlkIHdpZHRoL2hlaWdodCB2YWx1ZXNcbiIpOwogICAgICAgICBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgMCwgMCk7CiAgICAgfQpAQCAtMTMzOSwxOCArNzM3LDExIEBACiAgICAgICAgIGF2Y3R4LT50aHJlYWRfY291bnQgPSAxOwogCiAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+bWF4X2xvd3JlcyA8IGF2Y3R4LT5sb3dyZXMgfHwgYXZjdHgtPmxvd3JlcyA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJUaGUgbWF4aW11bSB2YWx1ZSBmb3IgbG93cmVzIHN1cHBvcnRlZCBieSB0aGUgZGVjb2RlciBpcyAlZFxuIiwKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlRoZSBtYXhpbXVtIHZhbHVlIGZvciBsb3dyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZWNvZGVyIGlzICVkXG4iLAogICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjLT5tYXhfbG93cmVzKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICAgICAgYXZjdHgtPmxvd3JlcyA9IGF2Y3R4LT5jb2RlYy0+bWF4X2xvd3JlczsKICAgICB9CiAKLSNpZiBGRl9BUElfVklTTVYKLSAgICBpZiAoYXZjdHgtPmRlYnVnX212KQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlICd2aXNtdicgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsICIKLSAgICAgICAgICAgICAgICJzZWUgdGhlIGNvZGVjdmlldyBmaWx0ZXIgaW5zdGVhZC5cbiIpOwotI2VuZGlmCi0KICAgICBpZiAoYXZfY29kZWNfaXNfZW5jb2RlcihhdmN0eC0+Y29kZWMpKSB7CiAgICAgICAgIGludCBpOwogI2lmIEZGX0FQSV9DT0RFRF9GUkFNRQpAQCAtMTM2Miw2ICs3NTMsMTMgQEAKICAgICAgICAgfQogRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAjZW5kaWYKKworICAgICAgICBpZiAoYXZjdHgtPnRpbWVfYmFzZS5udW0gPD0gMCB8fCBhdmN0eC0+dGltZV9iYXNlLmRlbiA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlRoZSBlbmNvZGVyIHRpbWViYXNlIGlzIG5vdCBzZXQuXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOworICAgICAgICB9CisKICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlYy0+c2FtcGxlX2ZtdHMpIHsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGF2Y3R4LT5jb2RlYy0+c2FtcGxlX2ZtdHNbaV0gIT0gQVZfU0FNUExFX0ZNVF9OT05FOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPnNhbXBsZV9mbXQgPT0gYXZjdHgtPmNvZGVjLT5zYW1wbGVfZm10c1tpXSkKQEAgLTE0NzIsMTEgKzg3MCwxMSBAQAogICAgICAgICB9CiAgICAgICAgIGlmICggICAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8IGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgICAgICYmIGF2Y3R4LT5iaXRfcmF0ZT4wICYmIGF2Y3R4LT5iaXRfcmF0ZTwxMDAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQml0cmF0ZSAlIlBSSWQ2NCIgaXMgZXh0cmVtZWx5IGxvdywgbWF5YmUgeW91IG1lYW4gJSJQUklkNjQia1xuIiwgKGludDY0X3QpYXZjdHgtPmJpdF9yYXRlLCAoaW50NjRfdClhdmN0eC0+Yml0X3JhdGUpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkJpdHJhdGUgJSJQUklkNjQiIGlzIGV4dHJlbWVseSBsb3csIG1heWJlIHlvdSBtZWFuICUiUFJJZDY0ImtcbiIsIGF2Y3R4LT5iaXRfcmF0ZSwgYXZjdHgtPmJpdF9yYXRlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghYXZjdHgtPnJjX2luaXRpYWxfYnVmZmVyX29jY3VwYW5jeSkKLSAgICAgICAgICAgIGF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kgPSBhdmN0eC0+cmNfYnVmZmVyX3NpemUgKiAzIC8gNDsKKyAgICAgICAgICAgIGF2Y3R4LT5yY19pbml0aWFsX2J1ZmZlcl9vY2N1cGFuY3kgPSBhdmN0eC0+cmNfYnVmZmVyX3NpemUgKiAzTEwgLyA0OwogCiAgICAgICAgIGlmIChhdmN0eC0+dGlja3NfcGVyX2ZyYW1lICYmIGF2Y3R4LT50aW1lX2Jhc2UubnVtICYmCiAgICAgICAgICAgICBhdmN0eC0+dGlja3NfcGVyX2ZyYW1lID4gSU5UX01BWCAvIGF2Y3R4LT50aW1lX2Jhc2UubnVtKSB7CkBAIC0xNDg3LDYgKzg4NSwyNyBAQAogICAgICAgICAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuKTsKICAgICAgICAgICAgIGdvdG8gZnJlZV9hbmRfZW5kOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2Y3R4LT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAqZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopYXZjdHgtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgICAgICAgICBpZiAoZnJhbWVzX2N0eC0+Zm9ybWF0ICE9IGF2Y3R4LT5waXhfZm10KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJNaXNtYXRjaGluZyBBVkNvZGVjQ29udGV4dC5waXhfZm10IGFuZCBBVkhXRnJhbWVzQ29udGV4dC5mb3JtYXRcbiIpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmN0eC0+c3dfcGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUgJiYKKyAgICAgICAgICAgICAgICBhdmN0eC0+c3dfcGl4X2ZtdCAhPSBmcmFtZXNfY3R4LT5zd19mb3JtYXQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIk1pc21hdGNoaW5nIEFWQ29kZWNDb250ZXh0LnN3X3BpeF9mbXQgKCVzKSAiCisgICAgICAgICAgICAgICAgICAgICAgICJhbmQgQVZIV0ZyYW1lc0NvbnRleHQuc3dfZm9ybWF0ICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoYXZjdHgtPnN3X3BpeF9mbXQpLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGZyYW1lc19jdHgtPnN3X2Zvcm1hdCkpOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZyZWVfYW5kX2VuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2Y3R4LT5zd19waXhfZm10ID0gZnJhbWVzX2N0eC0+c3dfZm9ybWF0OworICAgICAgICB9CiAgICAgfQogCiAgICAgYXZjdHgtPnB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfcHRzID0KQEAgLTE1MDksMTEgKzkyOCw2IEBACiAKICAgICByZXQ9MDsKIAotI2lmIEZGX0FQSV9BVURJT0VOQ19ERUxBWQotICAgIGlmIChhdl9jb2RlY19pc19lbmNvZGVyKGF2Y3R4LT5jb2RlYykpCi0gICAgICAgIGF2Y3R4LT5kZWxheSA9IGF2Y3R4LT5pbml0aWFsX3BhZGRpbmc7Ci0jZW5kaWYKLQogICAgIGlmIChhdl9jb2RlY19pc19kZWNvZGVyKGF2Y3R4LT5jb2RlYykpIHsKICAgICAgICAgaWYgKCFhdmN0eC0+Yml0X3JhdGUpCiAgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUgPSBnZXRfYml0X3JhdGUoYXZjdHgpOwpAQCAtMTYxMSw2ICsxMDI1LDEzIEBACiAgICAgYXZfZnJlZXAoJmF2Y3R4LT5wcml2X2RhdGEpOwogICAgIGlmIChhdmN0eC0+aW50ZXJuYWwpIHsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmludGVybmFsLT50b19mcmVlKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmludGVybmFsLT5jb21wYXRfZGVjb2RlX2ZyYW1lKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmludGVybmFsLT5idWZmZXJfZnJhbWUpOworICAgICAgICBhdl9wYWNrZXRfZnJlZSgmYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0KTsKKyAgICAgICAgYXZfcGFja2V0X2ZyZWUoJmF2Y3R4LT5pbnRlcm5hbC0+bGFzdF9wa3RfcHJvcHMpOworCisgICAgICAgIGF2X3BhY2tldF9mcmVlKCZhdmN0eC0+aW50ZXJuYWwtPmRzLmluX3BrdCk7CisKICAgICAgICAgYXZfZnJlZXAoJmF2Y3R4LT5pbnRlcm5hbC0+cG9vbCk7CiAgICAgfQogICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwpOwpAQCAtMTYxOCw4OTUgKzEwMzksNiBAQAogICAgIGdvdG8gZW5kOwogfQogCi1pbnQgZmZfYWxsb2NfcGFja2V0MihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCwgaW50NjRfdCBzaXplLCBpbnQ2NF90IG1pbl9zaXplKQotewotICAgIGlmIChhdnBrdC0+c2l6ZSA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG5lZ2F0aXZlIHVzZXIgcGFja2V0IHNpemUgJWRcbiIsIGF2cGt0LT5zaXplKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0gICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPiBJTlRfTUFYIC0gQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWluaW11bSByZXF1aXJlZCBwYWNrZXQgc2l6ZSAlIlBSSWQ2NCIgKG1heCBhbGxvd2VkIGlzICVkKVxuIiwKLSAgICAgICAgICAgICAgIHNpemUsIElOVF9NQVggLSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICBpZiAoYXZjdHggJiYgMiptaW5fc2l6ZSA8IHNpemUpIHsgLy8gRklYTUUgVGhlIGZhY3RvciBuZWVkcyB0byBiZSBmaW5ldHVuZWQKLSAgICAgICAgYXZfYXNzZXJ0MCghYXZwa3QtPmRhdGEgfHwgYXZwa3QtPmRhdGEgIT0gYXZjdHgtPmludGVybmFsLT5ieXRlX2J1ZmZlcik7Ci0gICAgICAgIGlmICghYXZwa3QtPmRhdGEgfHwgYXZwa3QtPnNpemUgPCBzaXplKSB7Ci0gICAgICAgICAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXIsICZhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemUsIHNpemUpOwotICAgICAgICAgICAgYXZwa3QtPmRhdGEgPSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyOwotICAgICAgICAgICAgYXZwa3QtPnNpemUgPSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyX3NpemU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYXZwa3QtPmRhdGEpIHsKLSAgICAgICAgQVZCdWZmZXJSZWYgKmJ1ZiA9IGF2cGt0LT5idWY7Ci0KLSAgICAgICAgaWYgKGF2cGt0LT5zaXplIDwgc2l6ZSkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVc2VyIHBhY2tldCBpcyB0b28gc21hbGwgKCVkIDwgJSJQUklkNjQiKVxuIiwgYXZwa3QtPnNpemUsIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2X2luaXRfcGFja2V0KGF2cGt0KTsKLSAgICAgICAgYXZwa3QtPmJ1ZiAgICAgID0gYnVmOwotICAgICAgICBhdnBrdC0+c2l6ZSAgICAgPSBzaXplOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQgcmV0ID0gYXZfbmV3X3BhY2tldChhdnBrdCwgc2l6ZSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgcGFja2V0IG9mIHNpemUgJSJQUklkNjQiXG4iLCBzaXplKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci19Ci0KLWludCBmZl9hbGxvY19wYWNrZXQoQVZQYWNrZXQgKmF2cGt0LCBpbnQgc2l6ZSkKLXsKLSAgICByZXR1cm4gZmZfYWxsb2NfcGFja2V0MihOVUxMLCBhdnBrdCwgc2l6ZSwgMCk7Ci19Ci0KLS8qKgotICogUGFkIGxhc3QgZnJhbWUgd2l0aCBzaWxlbmNlLgotICovCi1zdGF0aWMgaW50IHBhZF9sYXN0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICpzLCBBVkZyYW1lICoqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCi17Ci0gICAgQVZGcmFtZSAqZnJhbWUgPSBOVUxMOwotICAgIGludCByZXQ7Ci0KLSAgICBpZiAoIShmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZnJhbWUtPmZvcm1hdCAgICAgICAgID0gc3JjLT5mb3JtYXQ7Ci0gICAgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ID0gc3JjLT5jaGFubmVsX2xheW91dDsKLSAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMoZnJhbWUsIGF2X2ZyYW1lX2dldF9jaGFubmVscyhzcmMpKTsKLSAgICBmcmFtZS0+bmJfc2FtcGxlcyAgICAgPSBzLT5mcmFtZV9zaXplOwotICAgIHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIoZnJhbWUsIDMyKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhmcmFtZSwgc3JjKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgaWYgKChyZXQgPSBhdl9zYW1wbGVzX2NvcHkoZnJhbWUtPmV4dGVuZGVkX2RhdGEsIHNyYy0+ZXh0ZW5kZWRfZGF0YSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPm5iX3NhbXBsZXMsIHMtPmNoYW5uZWxzLCBzLT5zYW1wbGVfZm10KSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgaWYgKChyZXQgPSBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKGZyYW1lLT5leHRlbmRlZF9kYXRhLCBzcmMtPm5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzIC0gc3JjLT5uYl9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jaGFubmVscywgcy0+c2FtcGxlX2ZtdCkpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgKmRzdCA9IGZyYW1lOwotCi0gICAgcmV0dXJuIDA7Ci0KLWZhaWw6Ci0gICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2Y29kZWNfZW5jb2RlX2F1ZGlvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BhY2tldF9wdHIpCi17Ci0gICAgQVZGcmFtZSAqZXh0ZW5kZWRfZnJhbWUgPSBOVUxMOwotICAgIEFWRnJhbWUgKnBhZGRlZF9mcmFtZSA9IE5VTEw7Ci0gICAgaW50IHJldDsKLSAgICBBVlBhY2tldCB1c2VyX3BrdCA9ICphdnBrdDsKLSAgICBpbnQgbmVlZHNfcmVhbGxvYyA9ICF1c2VyX3BrdC5kYXRhOwotCi0gICAgKmdvdF9wYWNrZXRfcHRyID0gMDsKLQotICAgIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RFTEFZKSAmJiAhZnJhbWUpIHsKLSAgICAgICAgYXZfcGFja2V0X3VucmVmKGF2cGt0KTsKLSAgICAgICAgYXZfaW5pdF9wYWNrZXQoYXZwa3QpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBlbnN1cmUgdGhhdCBleHRlbmRlZF9kYXRhIGlzIHByb3Blcmx5IHNldCAqLwotICAgIGlmIChmcmFtZSAmJiAhZnJhbWUtPmV4dGVuZGVkX2RhdGEpIHsKLSAgICAgICAgaWYgKGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGF2Y3R4LT5zYW1wbGVfZm10KSAmJgotICAgICAgICAgICAgYXZjdHgtPmNoYW5uZWxzID4gQVZfTlVNX0RBVEFfUE9JTlRFUlMpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRW5jb2RpbmcgdG8gYSBwbGFuYXIgc2FtcGxlIGZvcm1hdCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIG1vcmUgdGhhbiAlZCBjaGFubmVscywgYnV0IGV4dGVuZGVkX2RhdGEgaXMgbm90IHNldC5cbiIsCi0gICAgICAgICAgICAgICAgICAgQVZfTlVNX0RBVEFfUE9JTlRFUlMpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgfQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZXh0ZW5kZWRfZGF0YSBpcyBub3Qgc2V0LlxuIik7Ci0KLSAgICAgICAgZXh0ZW5kZWRfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOwotICAgICAgICBpZiAoIWV4dGVuZGVkX2ZyYW1lKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgICAgICBtZW1jcHkoZXh0ZW5kZWRfZnJhbWUsIGZyYW1lLCBzaXplb2YoQVZGcmFtZSkpOwotICAgICAgICBleHRlbmRlZF9mcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IGV4dGVuZGVkX2ZyYW1lLT5kYXRhOwotICAgICAgICBmcmFtZSA9IGV4dGVuZGVkX2ZyYW1lOwotICAgIH0KLQotICAgIC8qIGV4dHJhY3QgYXVkaW8gc2VydmljZSB0eXBlIG1ldGFkYXRhICovCi0gICAgaWYgKGZyYW1lKSB7Ci0gICAgICAgIEFWRnJhbWVTaWRlRGF0YSAqc2QgPSBhdl9mcmFtZV9nZXRfc2lkZV9kYXRhKGZyYW1lLCBBVl9GUkFNRV9EQVRBX0FVRElPX1NFUlZJQ0VfVFlQRSk7Ci0gICAgICAgIGlmIChzZCAmJiBzZC0+c2l6ZSA+PSBzaXplb2YoZW51bSBBVkF1ZGlvU2VydmljZVR5cGUpKQotICAgICAgICAgICAgYXZjdHgtPmF1ZGlvX3NlcnZpY2VfdHlwZSA9ICooZW51bSBBVkF1ZGlvU2VydmljZVR5cGUqKXNkLT5kYXRhOwotICAgIH0KLQotICAgIC8qIGNoZWNrIGZvciB2YWxpZCBmcmFtZSBzaXplICovCi0gICAgaWYgKGZyYW1lKSB7Ci0gICAgICAgIGlmIChhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9TTUFMTF9MQVNUX0ZSQU1FKSB7Ci0gICAgICAgICAgICBpZiAoZnJhbWUtPm5iX3NhbXBsZXMgPiBhdmN0eC0+ZnJhbWVfc2l6ZSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAibW9yZSBzYW1wbGVzIHRoYW4gZnJhbWUgc2l6ZSAoYXZjb2RlY19lbmNvZGVfYXVkaW8yKVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfVkFSSUFCTEVfRlJBTUVfU0laRSkpIHsKLSAgICAgICAgICAgIGlmIChmcmFtZS0+bmJfc2FtcGxlcyA8IGF2Y3R4LT5mcmFtZV9zaXplICYmCi0gICAgICAgICAgICAgICAgIWF2Y3R4LT5pbnRlcm5hbC0+bGFzdF9hdWRpb19mcmFtZSkgewotICAgICAgICAgICAgICAgIHJldCA9IHBhZF9sYXN0X2ZyYW1lKGF2Y3R4LCAmcGFkZGVkX2ZyYW1lLCBmcmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotCi0gICAgICAgICAgICAgICAgZnJhbWUgPSBwYWRkZWRfZnJhbWU7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5sYXN0X2F1ZGlvX2ZyYW1lID0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGZyYW1lLT5uYl9zYW1wbGVzICE9IGF2Y3R4LT5mcmFtZV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJuYl9zYW1wbGVzICglZCkgIT0gZnJhbWVfc2l6ZSAoJWQpIChhdmNvZGVjX2VuY29kZV9hdWRpbzIpXG4iLCBmcmFtZS0+bmJfc2FtcGxlcywgYXZjdHgtPmZyYW1lX3NpemUpOwotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGF2X2Fzc2VydDAoYXZjdHgtPmNvZGVjLT5lbmNvZGUyKTsKLQotICAgIHJldCA9IGF2Y3R4LT5jb2RlYy0+ZW5jb2RlMihhdmN0eCwgYXZwa3QsIGZyYW1lLCBnb3RfcGFja2V0X3B0cik7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgaWYgKCpnb3RfcGFja2V0X3B0cikgewotICAgICAgICAgICAgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfREVMQVkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF2cGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICAgICAgICAgIGF2cGt0LT5wdHMgPSBmcmFtZS0+cHRzOwotICAgICAgICAgICAgICAgIGlmICghYXZwa3QtPmR1cmF0aW9uKQotICAgICAgICAgICAgICAgICAgICBhdnBrdC0+ZHVyYXRpb24gPSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZwa3QtPmR0cyA9IGF2cGt0LT5wdHM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdnBrdC0+c2l6ZSA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGF2cGt0LT5kYXRhICYmIGF2cGt0LT5kYXRhID09IGF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXIpIHsKLSAgICAgICAgbmVlZHNfcmVhbGxvYyA9IDA7Ci0gICAgICAgIGlmICh1c2VyX3BrdC5kYXRhKSB7Ci0gICAgICAgICAgICBpZiAodXNlcl9wa3Quc2l6ZSA+PSBhdnBrdC0+c2l6ZSkgewotICAgICAgICAgICAgICAgIG1lbWNweSh1c2VyX3BrdC5kYXRhLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlByb3ZpZGVkIHBhY2tldCBpcyB0b28gc21hbGwsIG5lZWRzIHRvIGJlICVkXG4iLCBhdnBrdC0+c2l6ZSk7Ci0gICAgICAgICAgICAgICAgYXZwa3QtPnNpemUgPSB1c2VyX3BrdC5zaXplOwotICAgICAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZwa3QtPmJ1ZiAgICAgID0gdXNlcl9wa3QuYnVmOwotICAgICAgICAgICAgYXZwa3QtPmRhdGEgICAgID0gdXNlcl9wa3QuZGF0YTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhdl9kdXBfcGFja2V0KGF2cGt0KSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXJldCkgewotICAgICAgICBpZiAobmVlZHNfcmVhbGxvYyAmJiBhdnBrdC0+ZGF0YSkgewotICAgICAgICAgICAgcmV0ID0gYXZfYnVmZmVyX3JlYWxsb2MoJmF2cGt0LT5idWYsIGF2cGt0LT5zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgICAgICBpZiAocmV0ID49IDApCi0gICAgICAgICAgICAgICAgYXZwa3QtPmRhdGEgPSBhdnBrdC0+YnVmLT5kYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOwotICAgIH0KLQotICAgIGlmIChyZXQgPCAwIHx8ICEqZ290X3BhY2tldF9wdHIpIHsKLSAgICAgICAgYXZfcGFja2V0X3VucmVmKGF2cGt0KTsKLSAgICAgICAgYXZfaW5pdF9wYWNrZXQoYXZwa3QpOwotICAgICAgICBnb3RvIGVuZDsKLSAgICB9Ci0KLSAgICAvKiBOT1RFOiBpZiB3ZSBhZGQgYW55IGF1ZGlvIGVuY29kZXJzIHdoaWNoIG91dHB1dCBub24ta2V5ZnJhbWUgcGFja2V0cywKLSAgICAgKiAgICAgICB0aGlzIG5lZWRzIHRvIGJlIG1vdmVkIHRvIHRoZSBlbmNvZGVycywgYnV0IGZvciBub3cgd2UgY2FuIGRvIGl0Ci0gICAgICogICAgICAgaGVyZSB0byBzaW1wbGlmeSB0aGluZ3MgKi8KLSAgICBhdnBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwotCi1lbmQ6Ci0gICAgYXZfZnJhbWVfZnJlZSgmcGFkZGVkX2ZyYW1lKTsKLSAgICBhdl9mcmVlKGV4dGVuZGVkX2ZyYW1lKTsKLQotI2lmIEZGX0FQSV9BVURJT0VOQ19ERUxBWQotICAgIGF2Y3R4LT5kZWxheSA9IGF2Y3R4LT5pbml0aWFsX3BhZGRpbmc7Ci0jZW5kaWYKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBhdHRyaWJ1dGVfYWxpZ25fYXJnIGF2Y29kZWNfZW5jb2RlX3ZpZGVvMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKmF2cGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BhY2tldF9wdHIpCi17Ci0gICAgaW50IHJldDsKLSAgICBBVlBhY2tldCB1c2VyX3BrdCA9ICphdnBrdDsKLSAgICBpbnQgbmVlZHNfcmVhbGxvYyA9ICF1c2VyX3BrdC5kYXRhOwotCi0gICAgKmdvdF9wYWNrZXRfcHRyID0gMDsKLQotICAgIGlmKENPTkZJR19GUkFNRV9USFJFQURfRU5DT0RFUiAmJgotICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+ZnJhbWVfdGhyZWFkX2VuY29kZXIgJiYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUmRkZfVEhSRUFEX0ZSQU1FKSkKLSAgICAgICAgcmV0dXJuIGZmX3RocmVhZF92aWRlb19lbmNvZGVfZnJhbWUoYXZjdHgsIGF2cGt0LCBmcmFtZSwgZ290X3BhY2tldF9wdHIpOwotCi0gICAgaWYgKChhdmN0eC0+ZmxhZ3MmQVZfQ09ERUNfRkxBR19QQVNTMSkgJiYgYXZjdHgtPnN0YXRzX291dCkKLSAgICAgICAgYXZjdHgtPnN0YXRzX291dFswXSA9ICdcMCc7Ci0KLSAgICBpZiAoIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9ERUxBWSkgJiYgIWZyYW1lKSB7Ci0gICAgICAgIGF2X3BhY2tldF91bnJlZihhdnBrdCk7Ci0gICAgICAgIGF2X2luaXRfcGFja2V0KGF2cGt0KTsKLSAgICAgICAgYXZwa3QtPnNpemUgPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZShhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsIDAsIGF2Y3R4KSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLQotICAgIGlmIChmcmFtZSAmJiBmcmFtZS0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkFWRnJhbWUuZm9ybWF0IGlzIG5vdCBzZXRcbiIpOwotICAgIGlmIChmcmFtZSAmJiAoZnJhbWUtPndpZHRoID09IDAgfHwgZnJhbWUtPmhlaWdodCA9PSAwKSkKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkFWRnJhbWUud2lkdGggb3IgaGVpZ2h0IGlzIG5vdCBzZXRcbiIpOwotCi0gICAgYXZfYXNzZXJ0MChhdmN0eC0+Y29kZWMtPmVuY29kZTIpOwotCi0gICAgcmV0ID0gYXZjdHgtPmNvZGVjLT5lbmNvZGUyKGF2Y3R4LCBhdnBrdCwgZnJhbWUsIGdvdF9wYWNrZXRfcHRyKTsKLSAgICBhdl9hc3NlcnQwKHJldCA8PSAwKTsKLQotICAgIGlmIChhdnBrdC0+ZGF0YSAmJiBhdnBrdC0+ZGF0YSA9PSBhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyKSB7Ci0gICAgICAgIG5lZWRzX3JlYWxsb2MgPSAwOwotICAgICAgICBpZiAodXNlcl9wa3QuZGF0YSkgewotICAgICAgICAgICAgaWYgKHVzZXJfcGt0LnNpemUgPj0gYXZwa3QtPnNpemUpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkodXNlcl9wa3QuZGF0YSwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcm92aWRlZCBwYWNrZXQgaXMgdG9vIHNtYWxsLCBuZWVkcyB0byBiZSAlZFxuIiwgYXZwa3QtPnNpemUpOwotICAgICAgICAgICAgICAgIGF2cGt0LT5zaXplID0gdXNlcl9wa3Quc2l6ZTsKLSAgICAgICAgICAgICAgICByZXQgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF2cGt0LT5idWYgICAgICA9IHVzZXJfcGt0LmJ1ZjsKLSAgICAgICAgICAgIGF2cGt0LT5kYXRhICAgICA9IHVzZXJfcGt0LmRhdGE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYXZfZHVwX3BhY2tldChhdnBrdCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFyZXQpIHsKLSAgICAgICAgaWYgKCEqZ290X3BhY2tldF9wdHIpCi0gICAgICAgICAgICBhdnBrdC0+c2l6ZSA9IDA7Ci0gICAgICAgIGVsc2UgaWYgKCEoYXZjdHgtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfREVMQVkpKQotICAgICAgICAgICAgYXZwa3QtPnB0cyA9IGF2cGt0LT5kdHMgPSBmcmFtZS0+cHRzOwotCi0gICAgICAgIGlmIChuZWVkc19yZWFsbG9jICYmIGF2cGt0LT5kYXRhKSB7Ci0gICAgICAgICAgICByZXQgPSBhdl9idWZmZXJfcmVhbGxvYygmYXZwa3QtPmJ1ZiwgYXZwa3QtPnNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKLSAgICAgICAgICAgICAgICBhdnBrdC0+ZGF0YSA9IGF2cGt0LT5idWYtPmRhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBhdmN0eC0+ZnJhbWVfbnVtYmVyKys7Ci0gICAgfQotCi0gICAgaWYgKHJldCA8IDAgfHwgISpnb3RfcGFja2V0X3B0cikKLSAgICAgICAgYXZfcGFja2V0X3VucmVmKGF2cGt0KTsKLQotICAgIGVtbXNfYygpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBhdmNvZGVjX2VuY29kZV9zdWJ0aXRsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWU3VidGl0bGUgKnN1YikKLXsKLSAgICBpbnQgcmV0OwotICAgIGlmIChzdWItPnN0YXJ0X2Rpc3BsYXlfdGltZSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgInN0YXJ0X2Rpc3BsYXlfdGltZSBtdXN0IGJlIDAuXG4iKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHJldCA9IGF2Y3R4LT5jb2RlYy0+ZW5jb2RlX3N1YihhdmN0eCwgYnVmLCBidWZfc2l6ZSwgc3ViKTsKLSAgICBhdmN0eC0+ZnJhbWVfbnVtYmVyKys7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBBdHRlbXB0IHRvIGd1ZXNzIHByb3BlciBtb25vdG9uaWMgdGltZXN0YW1wcyBmb3IgZGVjb2RlZCB2aWRlbyBmcmFtZXMKLSAqIHdoaWNoIG1pZ2h0IGhhdmUgaW5jb3JyZWN0IHRpbWVzLiBJbnB1dCB0aW1lc3RhbXBzIG1heSB3cmFwIGFyb3VuZCwgaW4KLSAqIHdoaWNoIGNhc2UgdGhlIG91dHB1dCB3aWxsIGFzIHdlbGwuCi0gKgotICogQHBhcmFtIHB0cyB0aGUgcHRzIGZpZWxkIG9mIHRoZSBkZWNvZGVkIEFWUGFja2V0LCBhcyBwYXNzZWQgdGhyb3VnaAotICogQVZGcmFtZS5wa3RfcHRzCi0gKiBAcGFyYW0gZHRzIHRoZSBkdHMgZmllbGQgb2YgdGhlIGRlY29kZWQgQVZQYWNrZXQKLSAqIEByZXR1cm4gb25lIG9mIHRoZSBpbnB1dCB2YWx1ZXMsIG1heSBiZSBBVl9OT1BUU19WQUxVRQotICovCi1zdGF0aWMgaW50NjRfdCBndWVzc19jb3JyZWN0X3B0cyhBVkNvZGVjQ29udGV4dCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCByZW9yZGVyZWRfcHRzLCBpbnQ2NF90IGR0cykKLXsKLSAgICBpbnQ2NF90IHB0cyA9IEFWX05PUFRTX1ZBTFVFOwotCi0gICAgaWYgKGR0cyAhPSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICBjdHgtPnB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfZHRzICs9IGR0cyA8PSBjdHgtPnB0c19jb3JyZWN0aW9uX2xhc3RfZHRzOwotICAgICAgICBjdHgtPnB0c19jb3JyZWN0aW9uX2xhc3RfZHRzID0gZHRzOwotICAgIH0gZWxzZSBpZiAocmVvcmRlcmVkX3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X2R0cyA9IHJlb3JkZXJlZF9wdHM7Ci0KLSAgICBpZiAocmVvcmRlcmVkX3B0cyAhPSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICBjdHgtPnB0c19jb3JyZWN0aW9uX251bV9mYXVsdHlfcHRzICs9IHJlb3JkZXJlZF9wdHMgPD0gY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X3B0czsKLSAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X3B0cyA9IHJlb3JkZXJlZF9wdHM7Ci0gICAgfSBlbHNlIGlmKGR0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgY3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X3B0cyA9IGR0czsKLQotICAgIGlmICgoY3R4LT5wdHNfY29ycmVjdGlvbl9udW1fZmF1bHR5X3B0czw9Y3R4LT5wdHNfY29ycmVjdGlvbl9udW1fZmF1bHR5X2R0cyB8fCBkdHMgPT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgJiYgcmVvcmRlcmVkX3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgcHRzID0gcmVvcmRlcmVkX3B0czsKLSAgICBlbHNlCi0gICAgICAgIHB0cyA9IGR0czsKLQotICAgIHJldHVybiBwdHM7Ci19Ci0KLXN0YXRpYyBpbnQgYXBwbHlfcGFyYW1fY2hhbmdlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0KQotewotICAgIGludCBzaXplID0gMCwgcmV0OwotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7Ci0gICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgaW50NjRfdCB2YWw7Ci0KLSAgICBkYXRhID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1BBUkFNX0NIQU5HRSwgJnNpemUpOwotICAgIGlmICghZGF0YSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIShhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9QQVJBTV9DSEFOR0UpKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGhpcyBkZWNvZGVyIGRvZXMgbm90IHN1cHBvcnQgcGFyYW1ldGVyICIKLSAgICAgICAgICAgICAgICJjaGFuZ2VzLCBidXQgUEFSQU1fQ0hBTkdFIHNpZGUgZGF0YSB3YXMgc2VudCB0byBpdC5cbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLQotICAgIGlmIChzaXplIDwgNCkKLSAgICAgICAgZ290byBmYWlsOwotCi0gICAgZmxhZ3MgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZkYXRhKTsKLSAgICBzaXplIC09IDQ7Ci0KLSAgICBpZiAoZmxhZ3MgJiBBVl9TSURFX0RBVEFfUEFSQU1fQ0hBTkdFX0NIQU5ORUxfQ09VTlQpIHsKLSAgICAgICAgaWYgKHNpemUgPCA0KQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB2YWwgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZkYXRhKTsKLSAgICAgICAgaWYgKHZhbCA8PSAwIHx8IHZhbCA+IElOVF9NQVgpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaGFubmVsIGNvdW50Iik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotICAgICAgICBhdmN0eC0+Y2hhbm5lbHMgPSB2YWw7Ci0gICAgICAgIHNpemUgLT0gNDsKLSAgICB9Ci0gICAgaWYgKGZsYWdzICYgQVZfU0lERV9EQVRBX1BBUkFNX0NIQU5HRV9DSEFOTkVMX0xBWU9VVCkgewotICAgICAgICBpZiAoc2l6ZSA8IDgpCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGF2Y3R4LT5jaGFubmVsX2xheW91dCA9IGJ5dGVzdHJlYW1fZ2V0X2xlNjQoJmRhdGEpOwotICAgICAgICBzaXplIC09IDg7Ci0gICAgfQotICAgIGlmIChmbGFncyAmIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgaWYgKHNpemUgPCA0KQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB2YWwgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZkYXRhKTsKLSAgICAgICAgaWYgKHZhbCA8PSAwIHx8IHZhbCA+IElOVF9NQVgpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgcmF0ZSIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLSAgICAgICAgYXZjdHgtPnNhbXBsZV9yYXRlID0gdmFsOwotICAgICAgICBzaXplIC09IDQ7Ci0gICAgfQotICAgIGlmIChmbGFncyAmIEFWX1NJREVfREFUQV9QQVJBTV9DSEFOR0VfRElNRU5TSU9OUykgewotICAgICAgICBpZiAoc2l6ZSA8IDgpCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGF2Y3R4LT53aWR0aCAgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZkYXRhKTsKLSAgICAgICAgYXZjdHgtPmhlaWdodCA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJmRhdGEpOwotICAgICAgICBzaXplIC09IDg7Ci0gICAgICAgIHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci1mYWlsOgotICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUEFSQU1fQ0hBTkdFIHNpZGUgZGF0YSB0b28gc21hbGwuXG4iKTsKLSAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLX0KLQotc3RhdGljIGludCB1bnJlZmNvdW50X2ZyYW1lKEFWQ29kZWNJbnRlcm5hbCAqYXZjaSwgQVZGcmFtZSAqZnJhbWUpCi17Ci0gICAgaW50IHJldDsKLQotICAgIC8qIG1vdmUgdGhlIG9yaWdpbmFsIGZyYW1lIHRvIG91ciBiYWNrdXAgKi8KLSAgICBhdl9mcmFtZV91bnJlZihhdmNpLT50b19mcmVlKTsKLSAgICBhdl9mcmFtZV9tb3ZlX3JlZihhdmNpLT50b19mcmVlLCBmcmFtZSk7Ci0KLSAgICAvKiBub3cgY29weSBldmVyeXRoaW5nIGV4Y2VwdCB0aGUgQVZCdWZmZXJSZWZzIGJhY2sKLSAgICAgKiBub3RlIHRoYXQgd2UgbWFrZSBhIENPUFkgb2YgdGhlIHNpZGUgZGF0YSwgc28gY2FsbGluZyBhdl9mcmFtZV9mcmVlKCkgb24KLSAgICAgKiB0aGUgY2FsbGVyJ3MgZnJhbWUgd2lsbCB3b3JrIHByb3Blcmx5ICovCi0gICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhmcmFtZSwgYXZjaS0+dG9fZnJlZSk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBtZW1jcHkoZnJhbWUtPmRhdGEsICAgICBhdmNpLT50b19mcmVlLT5kYXRhLCAgICAgc2l6ZW9mKGZyYW1lLT5kYXRhKSk7Ci0gICAgbWVtY3B5KGZyYW1lLT5saW5lc2l6ZSwgYXZjaS0+dG9fZnJlZS0+bGluZXNpemUsIHNpemVvZihmcmFtZS0+bGluZXNpemUpKTsKLSAgICBpZiAoYXZjaS0+dG9fZnJlZS0+ZXh0ZW5kZWRfZGF0YSAhPSBhdmNpLT50b19mcmVlLT5kYXRhKSB7Ci0gICAgICAgIGludCBwbGFuZXMgPSBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoYXZjaS0+dG9fZnJlZSk7Ci0gICAgICAgIGludCBzaXplICAgPSBwbGFuZXMgKiBzaXplb2YoKmZyYW1lLT5leHRlbmRlZF9kYXRhKTsKLQotICAgICAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKLSAgICAgICAgfQotCi0gICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhID0gYXZfbWFsbG9jKHNpemUpOwotICAgICAgICBpZiAoIWZyYW1lLT5leHRlbmRlZF9kYXRhKSB7Ci0gICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgYXZjaS0+dG9fZnJlZS0+ZXh0ZW5kZWRfZGF0YSwKLSAgICAgICAgICAgICAgIHNpemUpOwotICAgIH0gZWxzZQotICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IGZyYW1lLT5kYXRhOwotCi0gICAgZnJhbWUtPmZvcm1hdCAgICAgICAgID0gYXZjaS0+dG9fZnJlZS0+Zm9ybWF0OwotICAgIGZyYW1lLT53aWR0aCAgICAgICAgICA9IGF2Y2ktPnRvX2ZyZWUtPndpZHRoOwotICAgIGZyYW1lLT5oZWlnaHQgICAgICAgICA9IGF2Y2ktPnRvX2ZyZWUtPmhlaWdodDsKLSAgICBmcmFtZS0+Y2hhbm5lbF9sYXlvdXQgPSBhdmNpLT50b19mcmVlLT5jaGFubmVsX2xheW91dDsKLSAgICBmcmFtZS0+bmJfc2FtcGxlcyAgICAgPSBhdmNpLT50b19mcmVlLT5uYl9zYW1wbGVzOwotICAgIGF2X2ZyYW1lX3NldF9jaGFubmVscyhmcmFtZSwgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGF2Y2ktPnRvX2ZyZWUpKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdmNvZGVjX2RlY29kZV92aWRlbzIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BpY3R1cmVfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWUGFja2V0ICphdnBrdCkKLXsKLSAgICBBVkNvZGVjSW50ZXJuYWwgKmF2Y2kgPSBhdmN0eC0+aW50ZXJuYWw7Ci0gICAgaW50IHJldDsKLSAgICAvLyBjb3B5IHRvIGVuc3VyZSB3ZSBkbyBub3QgY2hhbmdlIGF2cGt0Ci0gICAgQVZQYWNrZXQgdG1wID0gKmF2cGt0OwotCi0gICAgaWYgKCFhdmN0eC0+Y29kZWMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgaWYgKGF2Y3R4LT5jb2RlYy0+dHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1lZGlhIHR5cGUgZm9yIHZpZGVvXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICAqZ290X3BpY3R1cmVfcHRyID0gMDsKLSAgICBpZiAoKGF2Y3R4LT5jb2RlZF93aWR0aCB8fCBhdmN0eC0+Y29kZWRfaGVpZ2h0KSAmJiBhdl9pbWFnZV9jaGVja19zaXplKGF2Y3R4LT5jb2RlZF93aWR0aCwgYXZjdHgtPmNvZGVkX2hlaWdodCwgMCwgYXZjdHgpKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotCi0gICAgYXZfZnJhbWVfdW5yZWYocGljdHVyZSk7Ci0KLSAgICBpZiAoKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RFTEFZKSB8fCBhdnBrdC0+c2l6ZSB8fAotICAgICAgICAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9GUkFNRSkpIHsKLSAgICAgICAgaW50IGRpZF9zcGxpdCA9IGF2X3BhY2tldF9zcGxpdF9zaWRlX2RhdGEoJnRtcCk7Ci0gICAgICAgIHJldCA9IGFwcGx5X3BhcmFtX2NoYW5nZShhdmN0eCwgJnRtcCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFwcGx5aW5nIHBhcmFtZXRlciBjaGFuZ2VzLlxuIik7Ci0gICAgICAgICAgICBpZiAoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCi0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgYXZjdHgtPmludGVybmFsLT5wa3QgPSAmdG1wOwotICAgICAgICBpZiAoSEFWRV9USFJFQURTICYmIGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpCi0gICAgICAgICAgICByZXQgPSBmZl90aHJlYWRfZGVjb2RlX2ZyYW1lKGF2Y3R4LCBwaWN0dXJlLCBnb3RfcGljdHVyZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXApOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IGF2Y3R4LT5jb2RlYy0+ZGVjb2RlKGF2Y3R4LCBwaWN0dXJlLCBnb3RfcGljdHVyZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wKTsKLSAgICAgICAgICAgIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2Fwc19pbnRlcm5hbCAmIEZGX0NPREVDX0NBUF9TRVRTX1BLVF9EVFMpKQotICAgICAgICAgICAgICAgIHBpY3R1cmUtPnBrdF9kdHMgPSBhdnBrdC0+ZHRzOwotCi0gICAgICAgICAgICBpZighYXZjdHgtPmhhc19iX2ZyYW1lcyl7Ci0gICAgICAgICAgICAgICAgYXZfZnJhbWVfc2V0X3BrdF9wb3MocGljdHVyZSwgYXZwa3QtPnBvcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL0ZJWE1FIHRoZXNlIHNob3VsZCBiZSB1bmRlciBpZighYXZjdHgtPmhhc19iX2ZyYW1lcykKLSAgICAgICAgICAgIC8qIGdldF9idWZmZXIgaXMgc3VwcG9zZWQgdG8gc2V0IGZyYW1lIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgIGlmICghKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0RSMSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXBpY3R1cmUtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKSAgICBwaWN0dXJlLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0gICAgICAgICAgICAgICAgaWYgKCFwaWN0dXJlLT53aWR0aCkgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZS0+d2lkdGggICAgICAgICAgICAgICA9IGF2Y3R4LT53aWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoIXBpY3R1cmUtPmhlaWdodCkgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLT5oZWlnaHQgICAgICAgICAgICAgID0gYXZjdHgtPmhlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAocGljdHVyZS0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgICBwaWN0dXJlLT5mb3JtYXQgICAgICAgICAgICAgID0gYXZjdHgtPnBpeF9mbXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotZmFpbDoKLSAgICAgICAgZW1tc19jKCk7IC8vbmVlZGVkIHRvIGF2b2lkIGFuIGVtbXNfYygpIGNhbGwgYmVmb3JlIGV2ZXJ5IHJldHVybjsKLQotICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnBrdCA9IE5VTEw7Ci0gICAgICAgIGlmIChkaWRfc3BsaXQpIHsKLSAgICAgICAgICAgIGF2X3BhY2tldF9mcmVlX3NpZGVfZGF0YSgmdG1wKTsKLSAgICAgICAgICAgIGlmKHJldCA9PSB0bXAuc2l6ZSkKLSAgICAgICAgICAgICAgICByZXQgPSBhdnBrdC0+c2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqZ290X3BpY3R1cmVfcHRyKSB7Ci0gICAgICAgICAgICBpZiAoIWF2Y3R4LT5yZWZjb3VudGVkX2ZyYW1lcykgewotICAgICAgICAgICAgICAgIGludCBlcnIgPSB1bnJlZmNvdW50X2ZyYW1lKGF2Y2ksIHBpY3R1cmUpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhdmN0eC0+ZnJhbWVfbnVtYmVyKys7Ci0gICAgICAgICAgICBhdl9mcmFtZV9zZXRfYmVzdF9lZmZvcnRfdGltZXN0YW1wKHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1ZXNzX2NvcnJlY3RfcHRzKGF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLT5wa3RfcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLT5wa3RfZHRzKSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgYXZfZnJhbWVfdW5yZWYocGljdHVyZSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHJldCA9IDA7Ci0KLSAgICAvKiBtYW55IGRlY29kZXJzIGFzc2lnbiB3aG9sZSBBVkZyYW1lcywgdGh1cyBvdmVyd3JpdGluZyBleHRlbmRlZF9kYXRhOwotICAgICAqIG1ha2Ugc3VyZSBpdCdzIHNldCBjb3JyZWN0bHkgKi8KLSAgICBhdl9hc3NlcnQwKCFwaWN0dXJlLT5leHRlbmRlZF9kYXRhIHx8IHBpY3R1cmUtPmV4dGVuZGVkX2RhdGEgPT0gcGljdHVyZS0+ZGF0YSk7Ci0KLSNpZiBGRl9BUElfQVZDVFhfVElNRUJBU0UKLSAgICBpZiAoYXZjdHgtPmZyYW1lcmF0ZS5udW0gPiAwICYmIGF2Y3R4LT5mcmFtZXJhdGUuZGVuID4gMCkKLSAgICAgICAgYXZjdHgtPnRpbWVfYmFzZSA9IGF2X2ludl9xKGF2X211bF9xKGF2Y3R4LT5mcmFtZXJhdGUsIChBVlJhdGlvbmFsKXthdmN0eC0+dGlja3NfcGVyX2ZyYW1lLCAxfSkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdmNvZGVjX2RlY29kZV9hdWRpbzQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgQVZDb2RlY0ludGVybmFsICphdmNpID0gYXZjdHgtPmludGVybmFsOwotICAgIGludCByZXQgPSAwOwotCi0gICAgKmdvdF9mcmFtZV9wdHIgPSAwOwotCi0gICAgaWYgKCFhdnBrdC0+ZGF0YSAmJiBhdnBrdC0+c2l6ZSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgcGFja2V0OiBOVUxMIGRhdGEsIHNpemUgIT0gMFxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIGlmICghYXZjdHgtPmNvZGVjKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIGlmIChhdmN0eC0+Y29kZWMtPnR5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBtZWRpYSB0eXBlIGZvciBhdWRpb1xuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotCi0gICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOwotCi0gICAgaWYgKChhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9ERUxBWSkgfHwgYXZwa3QtPnNpemUgfHwgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpKSB7Ci0gICAgICAgIHVpbnQ4X3QgKnNpZGU7Ci0gICAgICAgIGludCBzaWRlX3NpemU7Ci0gICAgICAgIHVpbnQzMl90IGRpc2NhcmRfcGFkZGluZyA9IDA7Ci0gICAgICAgIHVpbnQ4X3Qgc2tpcF9yZWFzb24gPSAwOwotICAgICAgICB1aW50OF90IGRpc2NhcmRfcmVhc29uID0gMDsKLSAgICAgICAgLy8gY29weSB0byBlbnN1cmUgd2UgZG8gbm90IGNoYW5nZSBhdnBrdAotICAgICAgICBBVlBhY2tldCB0bXAgPSAqYXZwa3Q7Ci0gICAgICAgIGludCBkaWRfc3BsaXQgPSBhdl9wYWNrZXRfc3BsaXRfc2lkZV9kYXRhKCZ0bXApOwotICAgICAgICByZXQgPSBhcHBseV9wYXJhbV9jaGFuZ2UoYXZjdHgsICZ0bXApOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhcHBseWluZyBwYXJhbWV0ZXIgY2hhbmdlcy5cbiIpOwotICAgICAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+cGt0ID0gJnRtcDsKLSAgICAgICAgaWYgKEhBVkVfVEhSRUFEUyAmJiBhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKQotICAgICAgICAgICAgcmV0ID0gZmZfdGhyZWFkX2RlY29kZV9mcmFtZShhdmN0eCwgZnJhbWUsIGdvdF9mcmFtZV9wdHIsICZ0bXApOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IGF2Y3R4LT5jb2RlYy0+ZGVjb2RlKGF2Y3R4LCBmcmFtZSwgZ290X2ZyYW1lX3B0ciwgJnRtcCk7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKHJldCA8PSB0bXAuc2l6ZSk7Ci0gICAgICAgICAgICBmcmFtZS0+cGt0X2R0cyA9IGF2cGt0LT5kdHM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA+PSAwICYmICpnb3RfZnJhbWVfcHRyKSB7Ci0gICAgICAgICAgICBhdmN0eC0+ZnJhbWVfbnVtYmVyKys7Ci0gICAgICAgICAgICBhdl9mcmFtZV9zZXRfYmVzdF9lZmZvcnRfdGltZXN0YW1wKGZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndWVzc19jb3JyZWN0X3B0cyhhdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPnBrdF9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wa3RfZHRzKSk7Ci0gICAgICAgICAgICBpZiAoZnJhbWUtPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX05PTkUpCi0gICAgICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCA9IGF2Y3R4LT5zYW1wbGVfZm10OwotICAgICAgICAgICAgaWYgKCFmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpCi0gICAgICAgICAgICAgICAgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ID0gYXZjdHgtPmNoYW5uZWxfbGF5b3V0OwotICAgICAgICAgICAgaWYgKCFhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpKQotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3NldF9jaGFubmVscyhmcmFtZSwgYXZjdHgtPmNoYW5uZWxzKTsKLSAgICAgICAgICAgIGlmICghZnJhbWUtPnNhbXBsZV9yYXRlKQotICAgICAgICAgICAgICAgIGZyYW1lLT5zYW1wbGVfcmF0ZSA9IGF2Y3R4LT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpZGU9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGF2Y3R4LT5pbnRlcm5hbC0+cGt0LCBBVl9QS1RfREFUQV9TS0lQX1NBTVBMRVMsICZzaWRlX3NpemUpOwotICAgICAgICBpZihzaWRlICYmIHNpZGVfc2l6ZT49MTApIHsKLSAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzID0gQVZfUkwzMihzaWRlKTsKLSAgICAgICAgICAgIGRpc2NhcmRfcGFkZGluZyA9IEFWX1JMMzIoc2lkZSArIDQpOwotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJza2lwICVkIC8gZGlzY2FyZCAlZCBzYW1wbGVzIGR1ZSB0byBzaWRlIGRhdGFcbiIsCi0gICAgICAgICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMsIChpbnQpZGlzY2FyZF9wYWRkaW5nKTsKLSAgICAgICAgICAgIHNraXBfcmVhc29uID0gQVZfUkw4KHNpZGUgKyA4KTsKLSAgICAgICAgICAgIGRpc2NhcmRfcmVhc29uID0gQVZfUkw4KHNpZGUgKyA5KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMgJiYgKmdvdF9mcmFtZV9wdHIgJiYKLSAgICAgICAgICAgICEoYXZjdHgtPmZsYWdzMiAmIEFWX0NPREVDX0ZMQUcyX1NLSVBfTUFOVUFMKSkgewotICAgICAgICAgICAgaWYoZnJhbWUtPm5iX3NhbXBsZXMgPD0gYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMpewotICAgICAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMDsKLSAgICAgICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcyAtPSBmcmFtZS0+bmJfc2FtcGxlczsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgInNraXAgd2hvbGUgZnJhbWUsIHNraXAgbGVmdDogJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZfc2FtcGxlc19jb3B5KGZyYW1lLT5leHRlbmRlZF9kYXRhLCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgMCwgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzIC0gYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMsIGF2Y3R4LT5jaGFubmVscywgZnJhbWUtPmZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgaWYoYXZjdHgtPnBrdF90aW1lYmFzZS5udW0gJiYgYXZjdHgtPnNhbXBsZV9yYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlmZl90cyA9IGF2X3Jlc2NhbGVfcShhdmN0eC0+aW50ZXJuYWwtPnNraXBfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBhdmN0eC0+c2FtcGxlX3JhdGV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBrdF90aW1lYmFzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1lLT5wa3RfcHRzIT1BVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wa3RfcHRzICs9IGRpZmZfdHM7Ci0gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1lLT5wa3RfZHRzIT1BVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wa3RfZHRzICs9IGRpZmZfdHM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdl9mcmFtZV9nZXRfcGt0X2R1cmF0aW9uKGZyYW1lKSA+PSBkaWZmX3RzKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfc2V0X3BrdF9kdXJhdGlvbihmcmFtZSwgYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbihmcmFtZSkgLSBkaWZmX3RzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IHVwZGF0ZSB0aW1lc3RhbXBzIGZvciBza2lwcGVkIHNhbXBsZXMuXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJza2lwICVkLyVkIHNhbXBsZXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzLCBmcmFtZS0+bmJfc2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgLT0gYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXM7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5za2lwX3NhbXBsZXMgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpc2NhcmRfcGFkZGluZyA+IDAgJiYgZGlzY2FyZF9wYWRkaW5nIDw9IGZyYW1lLT5uYl9zYW1wbGVzICYmICpnb3RfZnJhbWVfcHRyICYmCi0gICAgICAgICAgICAhKGF2Y3R4LT5mbGFnczIgJiBBVl9DT0RFQ19GTEFHMl9TS0lQX01BTlVBTCkpIHsKLSAgICAgICAgICAgIGlmIChkaXNjYXJkX3BhZGRpbmcgPT0gZnJhbWUtPm5iX3NhbXBsZXMpIHsKLSAgICAgICAgICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmKGF2Y3R4LT5wa3RfdGltZWJhc2UubnVtICYmIGF2Y3R4LT5zYW1wbGVfcmF0ZSkgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpZmZfdHMgPSBhdl9yZXNjYWxlX3EoZnJhbWUtPm5iX3NhbXBsZXMgLSBkaXNjYXJkX3BhZGRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgYXZjdHgtPnNhbXBsZV9yYXRlfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5wa3RfdGltZWJhc2UpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbihmcmFtZSkgPj0gZGlmZl90cykKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX3NldF9wa3RfZHVyYXRpb24oZnJhbWUsIGF2X2ZyYW1lX2dldF9wa3RfZHVyYXRpb24oZnJhbWUpIC0gZGlmZl90cyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNvdWxkIG5vdCB1cGRhdGUgdGltZXN0YW1wcyBmb3IgZGlzY2FyZGVkIHNhbXBsZXMuXG4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJkaXNjYXJkICVkLyVkIHNhbXBsZXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIChpbnQpZGlzY2FyZF9wYWRkaW5nLCBmcmFtZS0+bmJfc2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgLT0gZGlzY2FyZF9wYWRkaW5nOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKChhdmN0eC0+ZmxhZ3MyICYgQVZfQ09ERUNfRkxBRzJfU0tJUF9NQU5VQUwpICYmICpnb3RfZnJhbWVfcHRyKSB7Ci0gICAgICAgICAgICBBVkZyYW1lU2lkZURhdGEgKmZzaWRlID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShmcmFtZSwgQVZfRlJBTUVfREFUQV9TS0lQX1NBTVBMRVMsIDEwKTsKLSAgICAgICAgICAgIGlmIChmc2lkZSkgewotICAgICAgICAgICAgICAgIEFWX1dMMzIoZnNpZGUtPmRhdGEsIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzKTsKLSAgICAgICAgICAgICAgICBBVl9XTDMyKGZzaWRlLT5kYXRhICsgNCwgZGlzY2FyZF9wYWRkaW5nKTsKLSAgICAgICAgICAgICAgICBBVl9XTDgoZnNpZGUtPmRhdGEgKyA4LCBza2lwX3JlYXNvbik7Ci0gICAgICAgICAgICAgICAgQVZfV0w4KGZzaWRlLT5kYXRhICsgOSwgZGlzY2FyZF9yZWFzb24pOwotICAgICAgICAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+c2tpcF9zYW1wbGVzID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotZmFpbDoKLSAgICAgICAgYXZjdHgtPmludGVybmFsLT5wa3QgPSBOVUxMOwotICAgICAgICBpZiAoZGlkX3NwbGl0KSB7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfZnJlZV9zaWRlX2RhdGEoJnRtcCk7Ci0gICAgICAgICAgICBpZihyZXQgPT0gdG1wLnNpemUpCi0gICAgICAgICAgICAgICAgcmV0ID0gYXZwa3QtPnNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocmV0ID49IDAgJiYgKmdvdF9mcmFtZV9wdHIpIHsKLSAgICAgICAgICAgIGlmICghYXZjdHgtPnJlZmNvdW50ZWRfZnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IHVucmVmY291bnRfZnJhbWUoYXZjaSwgZnJhbWUpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIFVURjhfTUFYX0JZVEVTIDQgLyogNSBhbmQgNiBieXRlcyBzZXF1ZW5jZXMgc2hvdWxkIG5vdCBiZSB1c2VkICovCi1zdGF0aWMgaW50IHJlY29kZV9zdWJ0aXRsZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqb3V0cGt0LCBjb25zdCBBVlBhY2tldCAqaW5wa3QpCi17Ci0jaWYgQ09ORklHX0lDT05WCi0gICAgaWNvbnZfdCBjZCA9IChpY29udl90KS0xOwotICAgIGludCByZXQgPSAwOwotICAgIGNoYXIgKmluYiwgKm91dGI7Ci0gICAgc2l6ZV90IGlubCwgb3V0bDsKLSAgICBBVlBhY2tldCB0bXA7Ci0jZW5kaWYKLQotICAgIGlmIChhdmN0eC0+c3ViX2NoYXJlbmNfbW9kZSAhPSBGRl9TVUJfQ0hBUkVOQ19NT0RFX1BSRV9ERUNPREVSIHx8IGlucGt0LT5zaXplID09IDApCi0gICAgICAgIHJldHVybiAwOwotCi0jaWYgQ09ORklHX0lDT05WCi0gICAgY2QgPSBpY29udl9vcGVuKCJVVEYtOCIsIGF2Y3R4LT5zdWJfY2hhcmVuYyk7Ci0gICAgYXZfYXNzZXJ0MChjZCAhPSAoaWNvbnZfdCktMSk7Ci0KLSAgICBpbmIgPSBpbnBrdC0+ZGF0YTsKLSAgICBpbmwgPSBpbnBrdC0+c2l6ZTsKLQotICAgIGlmIChpbmwgPj0gSU5UX01BWCAvIFVURjhfTUFYX0JZVEVTIC0gQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlN1YnRpdGxlcyBwYWNrZXQgaXMgdG9vIGJpZyBmb3IgcmVjb2RpbmdcbiIpOwotICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLQotICAgIHJldCA9IGF2X25ld19wYWNrZXQoJnRtcCwgaW5sICogVVRGOF9NQVhfQllURVMpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIGVuZDsKLSAgICBvdXRwa3QtPmJ1ZiAgPSB0bXAuYnVmOwotICAgIG91dHBrdC0+ZGF0YSA9IHRtcC5kYXRhOwotICAgIG91dHBrdC0+c2l6ZSA9IHRtcC5zaXplOwotICAgIG91dGIgPSBvdXRwa3QtPmRhdGE7Ci0gICAgb3V0bCA9IG91dHBrdC0+c2l6ZTsKLQotICAgIGlmIChpY29udihjZCwgJmluYiwgJmlubCwgJm91dGIsICZvdXRsKSA9PSAoc2l6ZV90KS0xIHx8Ci0gICAgICAgIGljb252KGNkLCBOVUxMLCBOVUxMLCAmb3V0YiwgJm91dGwpID09IChzaXplX3QpLTEgfHwKLSAgICAgICAgb3V0bCA+PSBvdXRwa3QtPnNpemUgfHwgaW5sICE9IDApIHsKLSAgICAgICAgcmV0ID0gRkZNSU4oQVZFUlJPUihlcnJubyksIC0xKTsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVjb2RlIHN1YnRpdGxlIGV2ZW50IFwiJXNcIiAiCi0gICAgICAgICAgICAgICAiZnJvbSAlcyB0byBVVEYtOFxuIiwgaW5wa3QtPmRhdGEsIGF2Y3R4LT5zdWJfY2hhcmVuYyk7Ci0gICAgICAgIGF2X3BhY2tldF91bnJlZigmdG1wKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIG91dHBrdC0+c2l6ZSAtPSBvdXRsOwotICAgIG1lbXNldChvdXRwa3QtPmRhdGEgKyBvdXRwa3QtPnNpemUsIDAsIG91dGwpOwotCi1lbmQ6Ci0gICAgaWYgKGNkICE9IChpY29udl90KS0xKQotICAgICAgICBpY29udl9jbG9zZShjZCk7Ci0gICAgcmV0dXJuIHJldDsKLSNlbHNlCi0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJyZXF1ZXN0aW5nIHN1YnRpdGxlcyByZWNvZGluZyB3aXRob3V0IGljb252Iik7Ci0gICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IHV0ZjhfY2hlY2soY29uc3QgdWludDhfdCAqc3RyKQotewotICAgIGNvbnN0IHVpbnQ4X3QgKmJ5dGU7Ci0gICAgdWludDMyX3QgY29kZXBvaW50LCBtaW47Ci0KLSAgICB3aGlsZSAoKnN0cikgewotICAgICAgICBieXRlID0gc3RyOwotICAgICAgICBHRVRfVVRGOChjb2RlcG9pbnQsICooYnl0ZSsrKSwgcmV0dXJuIDA7KTsKLSAgICAgICAgbWluID0gYnl0ZSAtIHN0ciA9PSAxID8gMCA6IGJ5dGUgLSBzdHIgPT0gMiA/IDB4ODAgOgotICAgICAgICAgICAgICAxIDw8ICg1ICogKGJ5dGUgLSBzdHIpIC0gNCk7Ci0gICAgICAgIGlmIChjb2RlcG9pbnQgPCBtaW4gfHwgY29kZXBvaW50ID49IDB4MTEwMDAwIHx8Ci0gICAgICAgICAgICBjb2RlcG9pbnQgPT0gMHhGRkZFIC8qIEJPTSAqLyB8fAotICAgICAgICAgICAgY29kZXBvaW50ID49IDB4RDgwMCAmJiBjb2RlcG9pbnQgPD0gMHhERkZGIC8qIHN1cnJvZ2F0ZXMgKi8pCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgc3RyID0gYnl0ZTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLWludCBhdmNvZGVjX2RlY29kZV9zdWJ0aXRsZTIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlN1YnRpdGxlICpzdWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3N1Yl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKLXsKLSAgICBpbnQgaSwgcmV0ID0gMDsKLQotICAgIGlmICghYXZwa3QtPmRhdGEgJiYgYXZwa3QtPnNpemUpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHBhY2tldDogTlVMTCBkYXRhLCBzaXplICE9IDBcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBpZiAoIWF2Y3R4LT5jb2RlYykKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICBpZiAoYXZjdHgtPmNvZGVjLT50eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWVkaWEgdHlwZSBmb3Igc3VidGl0bGVzXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KLSAgICAqZ290X3N1Yl9wdHIgPSAwOwotICAgIGdldF9zdWJ0aXRsZV9kZWZhdWx0cyhzdWIpOwotCi0gICAgaWYgKChhdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9ERUxBWSkgfHwgYXZwa3QtPnNpemUpIHsKLSAgICAgICAgQVZQYWNrZXQgcGt0X3JlY29kZWQ7Ci0gICAgICAgIEFWUGFja2V0IHRtcCA9ICphdnBrdDsKLSAgICAgICAgaW50IGRpZF9zcGxpdCA9IGF2X3BhY2tldF9zcGxpdF9zaWRlX2RhdGEoJnRtcCk7Ci0gICAgICAgIC8vYXBwbHlfcGFyYW1fY2hhbmdlKGF2Y3R4LCAmdG1wKTsKLQotICAgICAgICBpZiAoZGlkX3NwbGl0KSB7Ci0gICAgICAgICAgICAvKiBGRk1JTigpIHByZXZlbnRzIG92ZXJmbG93IGluIGNhc2UgdGhlIHBhY2tldCB3YXNuJ3QgYWxsb2NhdGVkIHdpdGgKLSAgICAgICAgICAgICAqIHByb3BlciBwYWRkaW5nLgotICAgICAgICAgICAgICogSWYgdGhlIHNpZGUgZGF0YSBpcyBzbWFsbGVyIHRoYW4gdGhlIGJ1ZmZlciBwYWRkaW5nIHNpemUsIHRoZQotICAgICAgICAgICAgICogcmVtYWluaW5nIGJ5dGVzIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiBmaWxsZWQgd2l0aCB6ZXJvcyBieSB0aGUKLSAgICAgICAgICAgICAqIG9yaWdpbmFsIHBhY2tldCBhbGxvY2F0aW9uIGFueXdheS4gKi8KLSAgICAgICAgICAgIG1lbXNldCh0bXAuZGF0YSArIHRtcC5zaXplLCAwLAotICAgICAgICAgICAgICAgICAgIEZGTUlOKGF2cGt0LT5zaXplIC0gdG1wLnNpemUsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBrdF9yZWNvZGVkID0gdG1wOwotICAgICAgICByZXQgPSByZWNvZGVfc3VidGl0bGUoYXZjdHgsICZwa3RfcmVjb2RlZCwgJnRtcCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAqZ290X3N1Yl9wdHIgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZjdHgtPmludGVybmFsLT5wa3QgPSAmcGt0X3JlY29kZWQ7Ci0KLSAgICAgICAgICAgIGlmIChhdmN0eC0+cGt0X3RpbWViYXNlLm51bSAmJiBhdnBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICAgICAgICAgIHN1Yi0+cHRzID0gYXZfcmVzY2FsZV9xKGF2cGt0LT5wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBrdF90aW1lYmFzZSwgQVZfVElNRV9CQVNFX1EpOwotICAgICAgICAgICAgcmV0ID0gYXZjdHgtPmNvZGVjLT5kZWNvZGUoYXZjdHgsIHN1YiwgZ290X3N1Yl9wdHIsICZwa3RfcmVjb2RlZCk7Ci0gICAgICAgICAgICBhdl9hc3NlcnQxKChyZXQgPj0gMCkgPj0gISEqZ290X3N1Yl9wdHIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgISEqZ290X3N1Yl9wdHIgPj0gISFzdWItPm51bV9yZWN0cyk7Ci0KLSAgICAgICAgICAgIGlmIChzdWItPm51bV9yZWN0cyAmJiAhc3ViLT5lbmRfZGlzcGxheV90aW1lICYmIGF2cGt0LT5kdXJhdGlvbiAmJgotICAgICAgICAgICAgICAgIGF2Y3R4LT5wa3RfdGltZWJhc2UubnVtKSB7Ci0gICAgICAgICAgICAgICAgQVZSYXRpb25hbCBtcyA9IHsgMSwgMTAwMCB9OwotICAgICAgICAgICAgICAgIHN1Yi0+ZW5kX2Rpc3BsYXlfdGltZSA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+ZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5wa3RfdGltZWJhc2UsIG1zKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Yi0+bnVtX3JlY3RzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoc3ViLT5yZWN0c1tpXS0+YXNzICYmICF1dGY4X2NoZWNrKHN1Yi0+cmVjdHNbaV0tPmFzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBVVEYtOCBpbiBkZWNvZGVkIHN1YnRpdGxlcyB0ZXh0OyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAibWF5YmUgbWlzc2luZyAtc3ViX2NoYXJlbmMgb3B0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgYXZzdWJ0aXRsZV9mcmVlKHN1Yik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRtcC5kYXRhICE9IHBrdF9yZWNvZGVkLmRhdGEpIHsgLy8gZGlkIHdlIHJlY29kZT8KLSAgICAgICAgICAgICAgICAvKiBwcmV2ZW50IGZyb20gZGVzdHJveWluZyBzaWRlIGRhdGEgZnJvbSBvcmlnaW5hbCBwYWNrZXQgKi8KLSAgICAgICAgICAgICAgICBwa3RfcmVjb2RlZC5zaWRlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgIHBrdF9yZWNvZGVkLnNpZGVfZGF0YV9lbGVtcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdF9yZWNvZGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfZGVzY3JpcHRvci0+cHJvcHMgJiBBVl9DT0RFQ19QUk9QX0JJVE1BUF9TVUIpCi0gICAgICAgICAgICAgICAgc3ViLT5mb3JtYXQgPSAwOwotICAgICAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmNvZGVjX2Rlc2NyaXB0b3ItPnByb3BzICYgQVZfQ09ERUNfUFJPUF9URVhUX1NVQikKLSAgICAgICAgICAgICAgICBzdWItPmZvcm1hdCA9IDE7Ci0gICAgICAgICAgICBhdmN0eC0+aW50ZXJuYWwtPnBrdCA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGlkX3NwbGl0KSB7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfZnJlZV9zaWRlX2RhdGEoJnRtcCk7Ci0gICAgICAgICAgICBpZihyZXQgPT0gdG1wLnNpemUpCi0gICAgICAgICAgICAgICAgcmV0ID0gYXZwa3QtPnNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmdvdF9zdWJfcHRyKQotICAgICAgICAgICAgYXZjdHgtPmZyYW1lX251bWJlcisrOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KIHZvaWQgYXZzdWJ0aXRsZV9mcmVlKEFWU3VidGl0bGUgKnN1YikKIHsKICAgICBpbnQgaTsKQEAgLTI1MjMsNyArMTA1NSw3IEBACiAKICAgICBhdl9mcmVlcCgmc3ViLT5yZWN0cyk7CiAKLSAgICBtZW1zZXQoc3ViLCAwLCBzaXplb2YoQVZTdWJ0aXRsZSkpOworICAgIG1lbXNldChzdWIsIDAsIHNpemVvZigqc3ViKSk7CiB9CiAKIGF2X2NvbGQgaW50IGF2Y29kZWNfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQpAQCAtMjU0Niw2ICsxMDc4LDEzIEBACiAgICAgICAgIGF2Y3R4LT5pbnRlcm5hbC0+Ynl0ZV9idWZmZXJfc2l6ZSA9IDA7CiAgICAgICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwtPmJ5dGVfYnVmZmVyKTsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmludGVybmFsLT50b19mcmVlKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmludGVybmFsLT5jb21wYXRfZGVjb2RlX2ZyYW1lKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYXZjdHgtPmludGVybmFsLT5idWZmZXJfZnJhbWUpOworICAgICAgICBhdl9wYWNrZXRfZnJlZSgmYXZjdHgtPmludGVybmFsLT5idWZmZXJfcGt0KTsKKyAgICAgICAgYXZfcGFja2V0X2ZyZWUoJmF2Y3R4LT5pbnRlcm5hbC0+bGFzdF9wa3RfcHJvcHMpOworCisgICAgICAgIGF2X3BhY2tldF9mcmVlKCZhdmN0eC0+aW50ZXJuYWwtPmRzLmluX3BrdCk7CisKICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHBvb2wtPnBvb2xzKTsgaSsrKQogICAgICAgICAgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZwb29sLT5wb29sc1tpXSk7CiAgICAgICAgIGF2X2ZyZWVwKCZhdmN0eC0+aW50ZXJuYWwtPnBvb2wpOwpAQCAtMjU1NCw2ICsxMDkzLDggQEAKICAgICAgICAgICAgIGF2Y3R4LT5od2FjY2VsLT51bmluaXQoYXZjdHgpOwogICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YSk7CiAKKyAgICAgICAgZmZfZGVjb2RlX2JzZnNfdW5pbml0KGF2Y3R4KTsKKwogICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmludGVybmFsKTsKICAgICB9CiAKQEAgLTI1NjIsNiArMTEwMyw5IEBACiAgICAgYXZfZnJlZXAoJmF2Y3R4LT5jb2RlZF9zaWRlX2RhdGEpOwogICAgIGF2Y3R4LT5uYl9jb2RlZF9zaWRlX2RhdGEgPSAwOwogCisgICAgYXZfYnVmZmVyX3VucmVmKCZhdmN0eC0+aHdfZnJhbWVzX2N0eCk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZhdmN0eC0+aHdfZGV2aWNlX2N0eCk7CisKICAgICBpZiAoYXZjdHgtPnByaXZfZGF0YSAmJiBhdmN0eC0+Y29kZWMgJiYgYXZjdHgtPmNvZGVjLT5wcml2X2NsYXNzKQogICAgICAgICBhdl9vcHRfZnJlZShhdmN0eC0+cHJpdl9kYXRhKTsKICAgICBhdl9vcHRfZnJlZShhdmN0eCk7CkBAIC0yNTgwLDcxICsxMTI0LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGVudW0gQVZDb2RlY0lEIHJlbWFwX2RlcHJlY2F0ZWRfY29kZWNfaWQoZW51bSBBVkNvZGVjSUQgaWQpCi17Ci0gICAgc3dpdGNoKGlkKXsKLSAgICAgICAgLy9UaGlzIGlzIGZvciBmdXR1cmUgZGVwcmVjYXRlYyBjb2RlYyBpZHMsIGl0cyBlbXB0eSBzaW5jZQotICAgICAgICAvL2xhc3QgbWFqb3IgYnVtcCBidXQgd2lsbCBmaWxsIHVwIGFnYWluIG92ZXIgdGltZSwgcGxlYXNlIGRvbid0IHJlbW92ZSBpdAotICAgICAgICBkZWZhdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJldHVybiBpZDsKLSAgICB9Ci19Ci0KLXN0YXRpYyBBVkNvZGVjICpmaW5kX2VuY2RlYyhlbnVtIEFWQ29kZWNJRCBpZCwgaW50IGVuY29kZXIpCi17Ci0gICAgQVZDb2RlYyAqcCwgKmV4cGVyaW1lbnRhbCA9IE5VTEw7Ci0gICAgcCA9IGZpcnN0X2F2Y29kZWM7Ci0gICAgaWQ9IHJlbWFwX2RlcHJlY2F0ZWRfY29kZWNfaWQoaWQpOwotICAgIHdoaWxlIChwKSB7Ci0gICAgICAgIGlmICgoZW5jb2RlciA/IGF2X2NvZGVjX2lzX2VuY29kZXIocCkgOiBhdl9jb2RlY19pc19kZWNvZGVyKHApKSAmJgotICAgICAgICAgICAgcC0+aWQgPT0gaWQpIHsKLSAgICAgICAgICAgIGlmIChwLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfRVhQRVJJTUVOVEFMICYmICFleHBlcmltZW50YWwpIHsKLSAgICAgICAgICAgICAgICBleHBlcmltZW50YWwgPSBwOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiBleHBlcmltZW50YWw7Ci19Ci0KLUFWQ29kZWMgKmF2Y29kZWNfZmluZF9lbmNvZGVyKGVudW0gQVZDb2RlY0lEIGlkKQotewotICAgIHJldHVybiBmaW5kX2VuY2RlYyhpZCwgMSk7Ci19Ci0KLUFWQ29kZWMgKmF2Y29kZWNfZmluZF9lbmNvZGVyX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBBVkNvZGVjICpwOwotICAgIGlmICghbmFtZSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgcCA9IGZpcnN0X2F2Y29kZWM7Ci0gICAgd2hpbGUgKHApIHsKLSAgICAgICAgaWYgKGF2X2NvZGVjX2lzX2VuY29kZXIocCkgJiYgc3RyY21wKG5hbWUsIHAtPm5hbWUpID09IDApCi0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgcCA9IHAtPm5leHQ7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi1BVkNvZGVjICphdmNvZGVjX2ZpbmRfZGVjb2RlcihlbnVtIEFWQ29kZWNJRCBpZCkKLXsKLSAgICByZXR1cm4gZmluZF9lbmNkZWMoaWQsIDApOwotfQotCi1BVkNvZGVjICphdmNvZGVjX2ZpbmRfZGVjb2Rlcl9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgQVZDb2RlYyAqcDsKLSAgICBpZiAoIW5hbWUpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHAgPSBmaXJzdF9hdmNvZGVjOwotICAgIHdoaWxlIChwKSB7Ci0gICAgICAgIGlmIChhdl9jb2RlY19pc19kZWNvZGVyKHApICYmIHN0cmNtcChuYW1lLCBwLT5uYW1lKSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIHAgPSBwLT5uZXh0OwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQogY29uc3QgY2hhciAqYXZjb2RlY19nZXRfbmFtZShlbnVtIEFWQ29kZWNJRCBpZCkKIHsKICAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqY2Q7CkBAIC0yNzE3LDEyICsxMTk2LDkgQEAKICAgICAgICAgICAgICAgICAgIiwgJWQgcmVmZXJlbmNlIGZyYW1lJXMiLAogICAgICAgICAgICAgICAgICBlbmMtPnJlZnMsIGVuYy0+cmVmcyA+IDEgPyAicyIgOiAiIik7CiAKLSAgICBpZiAoZW5jLT5jb2RlY190YWcpIHsKLSAgICAgICAgY2hhciB0YWdfYnVmWzMyXTsKLSAgICAgICAgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcodGFnX2J1Ziwgc2l6ZW9mKHRhZ19idWYpLCBlbmMtPmNvZGVjX3RhZyk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBidWZfc2l6ZSAtIHN0cmxlbihidWYpLAotICAgICAgICAgICAgICAgICAiICglcyAvIDB4JTA0WCkiLCB0YWdfYnVmLCBlbmMtPmNvZGVjX3RhZyk7Ci0gICAgfQorICAgIGlmIChlbmMtPmNvZGVjX3RhZykKKyAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIGJ1Zl9zaXplIC0gc3RybGVuKGJ1ZiksICIgKCVzIC8gMHglMDRYKSIsCisgICAgICAgICAgICAgICAgIGF2X2ZvdXJjYzJzdHIoZW5jLT5jb2RlY190YWcpLCBlbmMtPmNvZGVjX3RhZyk7CiAKICAgICBzd2l0Y2ggKGVuYy0+Y29kZWNfdHlwZSkgewogICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgpAQCAtMjc1Niw3ICsxMjMyLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9jb2xvcnNwYWNlX25hbWUoZW5jLT5jb2xvcnNwYWNlKSk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX0RFQlVHICYmCisgICAgICAgICAgICBpZiAoZW5jLT5maWVsZF9vcmRlciAhPSBBVl9GSUVMRF9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmllbGRfb3JkZXIgPSAicHJvZ3Jlc3NpdmUiOworICAgICAgICAgICAgICAgIGlmIChlbmMtPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1RUKQorICAgICAgICAgICAgICAgICAgICBmaWVsZF9vcmRlciA9ICJ0b3AgZmlyc3QiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVuYy0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQkIpCisgICAgICAgICAgICAgICAgICAgIGZpZWxkX29yZGVyID0gImJvdHRvbSBmaXJzdCI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5jLT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9UQikKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfb3JkZXIgPSAidG9wIGNvZGVkIGZpcnN0IChzd2FwcGVkKSI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5jLT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9CVCkKKyAgICAgICAgICAgICAgICAgICAgZmllbGRfb3JkZXIgPSAiYm90dG9tIGNvZGVkIGZpcnN0IChzd2FwcGVkKSI7CisKKyAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihkZXRhaWwsIHNpemVvZihkZXRhaWwpLCAiJXMsICIsIGZpZWxkX29yZGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF2X2xvZ19nZXRfbGV2ZWwoKSA+PSBBVl9MT0dfVkVSQk9TRSAmJgogICAgICAgICAgICAgICAgIGVuYy0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiAhPSBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQpCiAgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoZGV0YWlsLCBzaXplb2YoZGV0YWlsKSwgIiVzLCAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2Nocm9tYV9sb2NhdGlvbl9uYW1lKGVuYy0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbikpOwpAQCAtMjgyNSw2ICsxMzE1LDE0IEBACiAgICAgICAgICAgICAmJiBlbmMtPmJpdHNfcGVyX3Jhd19zYW1wbGUgIT0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoZW5jLT5zYW1wbGVfZm10KSAqIDgpCiAgICAgICAgICAgICBzbnByaW50ZihidWYgKyBzdHJsZW4oYnVmKSwgYnVmX3NpemUgLSBzdHJsZW4oYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICIgKCVkIGJpdCkiLCBlbmMtPmJpdHNfcGVyX3Jhd19zYW1wbGUpOworICAgICAgICBpZiAoYXZfbG9nX2dldF9sZXZlbCgpID49IEFWX0xPR19WRVJCT1NFKSB7CisgICAgICAgICAgICBpZiAoZW5jLT5pbml0aWFsX3BhZGRpbmcpCisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmICsgc3RybGVuKGJ1ZiksIGJ1Zl9zaXplIC0gc3RybGVuKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiwgZGVsYXkgJWQiLCBlbmMtPmluaXRpYWxfcGFkZGluZyk7CisgICAgICAgICAgICBpZiAoZW5jLT50cmFpbGluZ19wYWRkaW5nKQorICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBidWZfc2l6ZSAtIHN0cmxlbihidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIsIHBhZGRpbmcgJWQiLCBlbmMtPnRyYWlsaW5nX3BhZGRpbmcpOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZNRURJQV9UWVBFX0RBVEE6CiAgICAgICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX0RFQlVHKSB7CkBAIC0yODU3LDcgKzEzNTUsNyBAQAogICAgICAgICAgICAgICAgICAiLCAlIlBSSWQ2NCIga2IvcyIsIGJpdHJhdGUgLyAxMDAwKTsKICAgICB9IGVsc2UgaWYgKGVuYy0+cmNfbWF4X3JhdGUgPiAwKSB7CiAgICAgICAgIHNucHJpbnRmKGJ1ZiArIHN0cmxlbihidWYpLCBidWZfc2l6ZSAtIHN0cmxlbihidWYpLAotICAgICAgICAgICAgICAgICAiLCBtYXguICUiUFJJZDY0IiBrYi9zIiwgKGludDY0X3QpZW5jLT5yY19tYXhfcmF0ZSAvIDEwMDApOworICAgICAgICAgICAgICAgICAiLCBtYXguICUiUFJJZDY0IiBrYi9zIiwgZW5jLT5yY19tYXhfcmF0ZSAvIDEwMDApOwogICAgIH0KIH0KIApAQCAtMjkxMiwyMCArMTQxMCw2IEBACiAgICAgcmV0dXJuIExJQ0VOU0VfUFJFRklYIEZGTVBFR19MSUNFTlNFICsgc2l6ZW9mKExJQ0VOU0VfUFJFRklYKSAtIDE7CiB9CiAKLXZvaWQgYXZjb2RlY19mbHVzaF9idWZmZXJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBpZiAoSEFWRV9USFJFQURTICYmIGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfRlJBTUUpCi0gICAgICAgIGZmX3RocmVhZF9mbHVzaChhdmN0eCk7Ci0gICAgZWxzZSBpZiAoYXZjdHgtPmNvZGVjLT5mbHVzaCkKLSAgICAgICAgYXZjdHgtPmNvZGVjLT5mbHVzaChhdmN0eCk7Ci0KLSAgICBhdmN0eC0+cHRzX2NvcnJlY3Rpb25fbGFzdF9wdHMgPQotICAgIGF2Y3R4LT5wdHNfY29ycmVjdGlvbl9sYXN0X2R0cyA9IElOVDY0X01JTjsKLQotICAgIGlmICghYXZjdHgtPnJlZmNvdW50ZWRfZnJhbWVzKQotICAgICAgICBhdl9mcmFtZV91bnJlZihhdmN0eC0+aW50ZXJuYWwtPnRvX2ZyZWUpOwotfQotCiBpbnQgYXZfZ2V0X2V4YWN0X2JpdHNfcGVyX3NhbXBsZShlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKIHsKICAgICBzd2l0Y2ggKGNvZGVjX2lkKSB7CkBAIC0yOTczLDkgKzE0NTcsMTMgQEAKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMzJMRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJCRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMzJMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMjRMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GMTZMRToKICAgICAgICAgcmV0dXJuIDMyOwogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NEJFOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0Y2NExFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M2NEJFOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M2NExFOgogICAgICAgICByZXR1cm4gNjQ7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yOTkzLDYgKzE0ODEsNyBAQAogICAgICAgICBbQVZfU0FNUExFX0ZNVF9VOFAgXSA9IHsgQVZfQ09ERUNfSURfUENNX1U4LCAgICBBVl9DT0RFQ19JRF9QQ01fVTggICAgfSwKICAgICAgICAgW0FWX1NBTVBMRV9GTVRfUzE2UF0gPSB7IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwgQVZfQ09ERUNfSURfUENNX1MxNkJFIH0sCiAgICAgICAgIFtBVl9TQU1QTEVfRk1UX1MzMlBdID0geyBBVl9DT0RFQ19JRF9QQ01fUzMyTEUsIEFWX0NPREVDX0lEX1BDTV9TMzJCRSB9LAorICAgICAgICBbQVZfU0FNUExFX0ZNVF9TNjRQXSA9IHsgQVZfQ09ERUNfSURfUENNX1M2NExFLCBBVl9DT0RFQ19JRF9QQ01fUzY0QkUgfSwKICAgICAgICAgW0FWX1NBTVBMRV9GTVRfRkxUUF0gPSB7IEFWX0NPREVDX0lEX1BDTV9GMzJMRSwgQVZfQ09ERUNfSURfUENNX0YzMkJFIH0sCiAgICAgICAgIFtBVl9TQU1QTEVfRk1UX0RCTFBdID0geyBBVl9DT0RFQ19JRF9QQ01fRjY0TEUsIEFWX0NPREVDX0lEX1BDTV9GNjRCRSB9LAogICAgIH07CkBAIC0zMDIxLDIxICsxNTEwLDE3IEBACiAgICAgfQogfQogCi1pbnQgYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IGZyYW1lX2J5dGVzKQorc3RhdGljIGludCBnZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oZW51bSBBVkNvZGVjSUQgaWQsIGludCBzciwgaW50IGNoLCBpbnQgYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWcsIGludCBiaXRzX3Blcl9jb2RlZF9zYW1wbGUsIGludDY0X3QgYml0cmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiBleHRyYWRhdGEsIGludCBmcmFtZV9zaXplLCBpbnQgZnJhbWVfYnl0ZXMpCiB7Ci0gICAgaW50IGlkLCBzciwgY2gsIGJhLCB0YWcsIGJwczsKLQotICAgIGlkICA9IGF2Y3R4LT5jb2RlY19pZDsKLSAgICBzciAgPSBhdmN0eC0+c2FtcGxlX3JhdGU7Ci0gICAgY2ggID0gYXZjdHgtPmNoYW5uZWxzOwotICAgIGJhICA9IGF2Y3R4LT5ibG9ja19hbGlnbjsKLSAgICB0YWcgPSBhdmN0eC0+Y29kZWNfdGFnOwotICAgIGJwcyA9IGF2X2dldF9leGFjdF9iaXRzX3Blcl9zYW1wbGUoYXZjdHgtPmNvZGVjX2lkKTsKKyAgICBpbnQgYnBzID0gYXZfZ2V0X2V4YWN0X2JpdHNfcGVyX3NhbXBsZShpZCk7CisgICAgaW50IGZyYW1lY291bnQgPSAoYmEgPiAwICYmIGZyYW1lX2J5dGVzIC8gYmEgPiAwKSA/IGZyYW1lX2J5dGVzIC8gYmEgOiAxOwogCiAgICAgLyogY29kZWNzIHdpdGggYW4gZXhhY3QgY29uc3RhbnQgYml0cyBwZXIgc2FtcGxlICovCiAgICAgaWYgKGJwcyA+IDAgJiYgY2ggPiAwICYmIGZyYW1lX2J5dGVzID4gMCAmJiBjaCA8IDMyNzY4ICYmIGJwcyA8IDMyNzY4KQogICAgICAgICByZXR1cm4gKGZyYW1lX2J5dGVzICogOExMKSAvIChicHMgKiBjaCk7Ci0gICAgYnBzID0gYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICBicHMgPSBiaXRzX3Blcl9jb2RlZF9zYW1wbGU7CiAKICAgICAvKiBjb2RlY3Mgd2l0aCBhIGZpeGVkIHBhY2tldCBkdXJhdGlvbiAqLwogICAgIHN3aXRjaCAoaWQpIHsKQEAgLTMwNTEsNyArMTUzNiw3IEBACiAgICAgY2FzZSBBVl9DT0RFQ19JRF9HU01fTVM6ICAgICAgIHJldHVybiAgMzIwOwogICAgIGNhc2UgQVZfQ09ERUNfSURfTVAxOiAgICAgICAgICByZXR1cm4gIDM4NDsKICAgICBjYXNlIEFWX0NPREVDX0lEX0FUUkFDMTogICAgICAgcmV0dXJuICA1MTI7Ci0gICAgY2FzZSBBVl9DT0RFQ19JRF9BVFJBQzM6ICAgICAgIHJldHVybiAxMDI0OworICAgIGNhc2UgQVZfQ09ERUNfSURfQVRSQUMzOiAgICAgICByZXR1cm4gMTAyNCAqIGZyYW1lY291bnQ7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BVFJBQzNQOiAgICAgIHJldHVybiAyMDQ4OwogICAgIGNhc2UgQVZfQ09ERUNfSURfTVAyOgogICAgIGNhc2UgQVZfQ09ERUNfSURfTVVTRVBBQ0s3OiAgICByZXR1cm4gMTE1MjsKQEAgLTMwNjIsMTIgKzE1NDcsMTcgQEAKICAgICAgICAgLyogY2FsYyBmcm9tIHNhbXBsZSByYXRlICovCiAgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9UVEEpCiAgICAgICAgICAgICByZXR1cm4gMjU2ICogc3IgLyAyNDU7CisgICAgICAgIGVsc2UgaWYgKGlkID09IEFWX0NPREVDX0lEX0RTVCkKKyAgICAgICAgICAgIHJldHVybiA1ODggKiBzciAvIDQ0MTAwOwogCiAgICAgICAgIGlmIChjaCA+IDApIHsKICAgICAgICAgICAgIC8qIGNhbGMgZnJvbSBzYW1wbGUgcmF0ZSBhbmQgY2hhbm5lbHMgKi8KICAgICAgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fRENUKQogICAgICAgICAgICAgICAgIHJldHVybiAoNDgwIDw8IChzciAvIDIyMDUwKSkgLyBjaDsKICAgICAgICAgfQorCisgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9NUDMpCisgICAgICAgICAgICByZXR1cm4gc3IgPD0gMjQwMDAgPyA1NzYgOiAxMTUyOwogICAgIH0KIAogICAgIGlmIChiYSA+IDApIHsKQEAgLTMxMDAsNyArMTU5MCw3IEBACiAKICAgICAgICAgaWYgKGJwcyA+IDApIHsKICAgICAgICAgICAgIC8qIGNhbGMgZnJvbSBmcmFtZV9ieXRlcyBhbmQgYml0c19wZXJfY29kZWRfc2FtcGxlICovCi0gICAgICAgICAgICBpZiAoaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fRzcyNikKKyAgICAgICAgICAgIGlmIChpZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2IHx8IGlkID09IEFWX0NPREVDX0lEX0FEUENNX0c3MjZMRSkKICAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWVfYnl0ZXMgKiA4IC8gYnBzOwogICAgICAgICB9CiAKQEAgLTMxMTMsNiArMTYwMyw3IEBACiAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0RUSzoKICAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWVfYnl0ZXMgLyAoMTYgKiBjaCkgKiAyODsKICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fNFhNOgorICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREFUNDoKICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX0lTUzoKICAgICAgICAgICAgICAgICByZXR1cm4gKGZyYW1lX2J5dGVzIC0gNCAqIGNoKSAqIDIgLyBjaDsKICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1NNSlBFRzoKQEAgLTMxMjEsNyArMTYxMiw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIChmcmFtZV9ieXRlcyAtIDgpICogMiAvIGNoOwogICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9USFA6CiAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1RIUF9MRToKLSAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICBpZiAoZXh0cmFkYXRhKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWVfYnl0ZXMgKiAxNCAvICg4ICogY2gpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9YQToKQEAgLTMxNTYsNyArMTY0Nyw3IEBACiAgICAgICAgICAgICBpZiAoYmEgPiAwKSB7CiAgICAgICAgICAgICAgICAgLyogY2FsYyBmcm9tIGZyYW1lX2J5dGVzLCBjaGFubmVscywgYW5kIGJsb2NrX2FsaWduICovCiAgICAgICAgICAgICAgICAgaW50IGJsb2NrcyA9IGZyYW1lX2J5dGVzIC8gYmE7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGlkKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWOgogICAgICAgICAgICAgICAgICAgICBpZiAoYnBzIDwgMiB8fCBicHMgPiA1KQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0zMTY5LDIwICsxNjYwLDIyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBibG9ja3MgKiAoKGJhIC0gNCAqIGNoKSAqIDIgLyBjaCk7CiAgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9NUzoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJsb2NrcyAqICgyICsgKGJhIC0gNyAqIGNoKSAqIDIgLyBjaCk7CisgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9NVEFGOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmxvY2tzICogKGJhIC0gMTYpICogMiAvIGNoOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGJwcyA+IDApIHsKICAgICAgICAgICAgICAgICAvKiBjYWxjIGZyb20gZnJhbWVfYnl0ZXMsIGNoYW5uZWxzLCBhbmQgYml0c19wZXJfY29kZWRfc2FtcGxlICovCi0gICAgICAgICAgICAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGlkKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRFZEOgotICAgICAgICAgICAgICAgICAgICBpZihicHM8NCkKKyAgICAgICAgICAgICAgICAgICAgaWYoYnBzPDQgfHwgZnJhbWVfYnl0ZXM8MykKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMiAqIChmcmFtZV9ieXRlcyAvICgoYnBzICogMiAvIDgpICogY2gpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDIgKiAoKGZyYW1lX2J5dGVzIC0gMykgLyAoKGJwcyAqIDIgLyA4KSAqIGNoKSk7CiAgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fQkxVUkFZOgotICAgICAgICAgICAgICAgICAgICBpZihicHM8NCkKKyAgICAgICAgICAgICAgICAgICAgaWYoYnBzPDQgfHwgZnJhbWVfYnl0ZXM8NCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWVfYnl0ZXMgLyAoKEZGQUxJR04oY2gsIDIpICogYnBzKSAvIDgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGZyYW1lX2J5dGVzIC0gNCkgLyAoKEZGQUxJR04oY2gsIDIpICogYnBzKSAvIDgpOwogICAgICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUzMwMk06CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAyICogKGZyYW1lX2J5dGVzIC8gKChicHMgKyA0KSAvIDQpKSAvIGNoOwogICAgICAgICAgICAgICAgIH0KQEAgLTMxOTEsMTkgKzE2ODQsMzcgQEAKICAgICB9CiAKICAgICAvKiBGYWxsIGJhY2sgb24gdXNpbmcgZnJhbWVfc2l6ZSAqLwotICAgIGlmIChhdmN0eC0+ZnJhbWVfc2l6ZSA+IDEgJiYgZnJhbWVfYnl0ZXMpCi0gICAgICAgIHJldHVybiBhdmN0eC0+ZnJhbWVfc2l6ZTsKKyAgICBpZiAoZnJhbWVfc2l6ZSA+IDEgJiYgZnJhbWVfYnl0ZXMpCisgICAgICAgIHJldHVybiBmcmFtZV9zaXplOwogCiAgICAgLy9Gb3IgV01BIHdlIGN1cnJlbnRseSBoYXZlIG5vIG90aGVyIG1lYW5zIHRvIGNhbGN1bGF0ZSBkdXJhdGlvbiB0aHVzIHdlCiAgICAgLy9kbyBpdCBoZXJlIGJ5IGFzc3VtaW5nIENCUiwgd2hpY2ggaXMgdHJ1ZSBmb3IgYWxsIGtub3duIGNhc2VzLgotICAgIGlmIChhdmN0eC0+Yml0X3JhdGU+MCAmJiBmcmFtZV9ieXRlcz4wICYmIGF2Y3R4LT5zYW1wbGVfcmF0ZT4wICYmIGF2Y3R4LT5ibG9ja19hbGlnbj4xKSB7Ci0gICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01BVjEgfHwgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVYyKQotICAgICAgICAgICAgcmV0dXJuICAoZnJhbWVfYnl0ZXMgKiA4TEwgKiBhdmN0eC0+c2FtcGxlX3JhdGUpIC8gYXZjdHgtPmJpdF9yYXRlOworICAgIGlmIChiaXRyYXRlID4gMCAmJiBmcmFtZV9ieXRlcyA+IDAgJiYgc3IgPiAwICYmIGJhID4gMSkgeworICAgICAgICBpZiAoaWQgPT0gQVZfQ09ERUNfSURfV01BVjEgfHwgaWQgPT0gQVZfQ09ERUNfSURfV01BVjIpCisgICAgICAgICAgICByZXR1cm4gIChmcmFtZV9ieXRlcyAqIDhMTCAqIHNyKSAvIGJpdHJhdGU7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKK2ludCBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgZnJhbWVfYnl0ZXMpCit7CisgICAgcmV0dXJuIGdldF9hdWRpb19mcmFtZV9kdXJhdGlvbihhdmN0eC0+Y29kZWNfaWQsIGF2Y3R4LT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jaGFubmVscywgYXZjdHgtPmJsb2NrX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZywgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9ieXRlcyk7Cit9CisKK2ludCBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIGludCBmcmFtZV9ieXRlcykKK3sKKyAgICByZXR1cm4gZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKHBhci0+Y29kZWNfaWQsIHBhci0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmNoYW5uZWxzLCBwYXItPmJsb2NrX2FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5jb2RlY190YWcsIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5iaXRfcmF0ZSwgcGFyLT5leHRyYWRhdGEsIHBhci0+ZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2J5dGVzKTsKK30KKwogI2lmICFIQVZFX1RIUkVBRFMKIGludCBmZl90aHJlYWRfaW5pdChBVkNvZGVjQ29udGV4dCAqcykKIHsKQEAgLTMyMzMsMTQzICsxNzQ0LDM0IEBACiAgICAgcmV0dXJuIGk7CiB9CiAKLSNpZiBGRl9BUElfTUlTU0lOR19TQU1QTEUKLUZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLXZvaWQgYXZfbG9nX21pc3NpbmdfZmVhdHVyZSh2b2lkICphdmMsIGNvbnN0IGNoYXIgKmZlYXR1cmUsIGludCB3YW50X3NhbXBsZSkKK2NvbnN0IEFWQ29kZWNIV0NvbmZpZyAqYXZjb2RlY19nZXRfaHdfY29uZmlnKGNvbnN0IEFWQ29kZWMgKmNvZGVjLCBpbnQgaW5kZXgpCiB7Ci0gICAgYXZfbG9nKGF2YywgQVZfTE9HX1dBUk5JTkcsICIlcyBpcyBub3QgaW1wbGVtZW50ZWQuIFVwZGF0ZSB5b3VyIEZGbXBlZyAiCi0gICAgICAgICAgICAidmVyc2lvbiB0byB0aGUgbmV3ZXN0IG9uZSBmcm9tIEdpdC4gSWYgdGhlIHByb2JsZW0gc3RpbGwgIgotICAgICAgICAgICAgIm9jY3VycywgaXQgbWVhbnMgdGhhdCB5b3VyIGZpbGUgaGFzIGEgZmVhdHVyZSB3aGljaCBoYXMgbm90ICIKLSAgICAgICAgICAgICJiZWVuIGltcGxlbWVudGVkLlxuIiwgZmVhdHVyZSk7Ci0gICAgaWYod2FudF9zYW1wbGUpCi0gICAgICAgIGF2X2xvZ19hc2tfZm9yX3NhbXBsZShhdmMsIE5VTEwpOworICAgIGludCBpOworICAgIGlmICghY29kZWMtPmh3X2NvbmZpZ3MgfHwgaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBmb3IgKGkgPSAwOyBpIDw9IGluZGV4OyBpKyspCisgICAgICAgIGlmICghY29kZWMtPmh3X2NvbmZpZ3NbaV0pCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gJmNvZGVjLT5od19jb25maWdzW2luZGV4XS0+cHVibGljOwogfQogCi12b2lkIGF2X2xvZ19hc2tfZm9yX3NhbXBsZSh2b2lkICphdmMsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQorI2lmIEZGX0FQSV9VU0VSX1ZJU0lCTEVfQVZIV0FDQ0VMCitBVkhXQWNjZWwgKmF2X2h3YWNjZWxfbmV4dChjb25zdCBBVkhXQWNjZWwgKmh3YWNjZWwpCiB7Ci0gICAgdmFfbGlzdCBhcmd1bWVudF9saXN0OwotCi0gICAgdmFfc3RhcnQoYXJndW1lbnRfbGlzdCwgbXNnKTsKLQotICAgIGlmIChtc2cpCi0gICAgICAgIGF2X3Zsb2coYXZjLCBBVl9MT0dfV0FSTklORywgbXNnLCBhcmd1bWVudF9saXN0KTsKLSAgICBhdl9sb2coYXZjLCBBVl9MT0dfV0FSTklORywgIklmIHlvdSB3YW50IHRvIGhlbHAsIHVwbG9hZCBhIHNhbXBsZSAiCi0gICAgICAgICAgICAib2YgdGhpcyBmaWxlIHRvIGZ0cDovL3VwbG9hZC5mZm1wZWcub3JnL2luY29taW5nLyAiCi0gICAgICAgICAgICAiYW5kIGNvbnRhY3QgdGhlIGZmbXBlZy1kZXZlbCBtYWlsaW5nIGxpc3QuIChmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZylcbiIpOwotCi0gICAgdmFfZW5kKGFyZ3VtZW50X2xpc3QpOworICAgIHJldHVybiBOVUxMOwogfQotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0jZW5kaWYgLyogRkZfQVBJX01JU1NJTkdfU0FNUExFICovCi0KLXN0YXRpYyBBVkhXQWNjZWwgKmZpcnN0X2h3YWNjZWwgPSBOVUxMOwotc3RhdGljIEFWSFdBY2NlbCAqKmxhc3RfaHdhY2NlbCA9ICZmaXJzdF9od2FjY2VsOwogCiB2b2lkIGF2X3JlZ2lzdGVyX2h3YWNjZWwoQVZIV0FjY2VsICpod2FjY2VsKQogewotICAgIEFWSFdBY2NlbCAqKnAgPSBsYXN0X2h3YWNjZWw7Ci0gICAgaHdhY2NlbC0+bmV4dCA9IE5VTEw7Ci0gICAgd2hpbGUoKnAgfHwgYXZwcml2X2F0b21pY19wdHJfY2FzKCh2b2lkICogdm9sYXRpbGUgKilwLCBOVUxMLCBod2FjY2VsKSkKLSAgICAgICAgcCA9ICYoKnApLT5uZXh0OwotICAgIGxhc3RfaHdhY2NlbCA9ICZod2FjY2VsLT5uZXh0OwogfQorI2VuZGlmCiAKLUFWSFdBY2NlbCAqYXZfaHdhY2NlbF9uZXh0KGNvbnN0IEFWSFdBY2NlbCAqaHdhY2NlbCkKLXsKLSAgICByZXR1cm4gaHdhY2NlbCA/IGh3YWNjZWwtPm5leHQgOiBmaXJzdF9od2FjY2VsOwotfQotCisjaWYgRkZfQVBJX0xPQ0tNR1IKIGludCBhdl9sb2NrbWdyX3JlZ2lzdGVyKGludCAoKmNiKSh2b2lkICoqbXV0ZXgsIGVudW0gQVZMb2NrT3Agb3ApKQogewotICAgIGlmIChsb2NrbWdyX2NiKSB7Ci0gICAgICAgIC8vIFRoZXJlIGlzIG5vIGdvb2Qgd2F5IHRvIHJvbGxiYWNrIGEgZmFpbHVyZSB0byBkZXN0cm95IHRoZQotICAgICAgICAvLyBtdXRleCwgc28gd2UgaWdub3JlIGZhaWx1cmVzLgotICAgICAgICBsb2NrbWdyX2NiKCZjb2RlY19tdXRleCwgICAgQVZfTE9DS19ERVNUUk9ZKTsKLSAgICAgICAgbG9ja21ncl9jYigmYXZmb3JtYXRfbXV0ZXgsIEFWX0xPQ0tfREVTVFJPWSk7Ci0gICAgICAgIGxvY2ttZ3JfY2IgICAgID0gTlVMTDsKLSAgICAgICAgY29kZWNfbXV0ZXggICAgPSBOVUxMOwotICAgICAgICBhdmZvcm1hdF9tdXRleCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGNiKSB7Ci0gICAgICAgIHZvaWQgKm5ld19jb2RlY19tdXRleCAgICA9IE5VTEw7Ci0gICAgICAgIHZvaWQgKm5ld19hdmZvcm1hdF9tdXRleCA9IE5VTEw7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIGlmIChlcnIgPSBjYigmbmV3X2NvZGVjX211dGV4LCBBVl9MT0NLX0NSRUFURSkpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnIgPiAwID8gQVZFUlJPUl9VTktOT1dOIDogZXJyOwotICAgICAgICB9Ci0gICAgICAgIGlmIChlcnIgPSBjYigmbmV3X2F2Zm9ybWF0X211dGV4LCBBVl9MT0NLX0NSRUFURSkpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBmYWlsdXJlcyB0byBkZXN0cm95IHRoZSBuZXdseSBjcmVhdGVkIG11dGV4LgotICAgICAgICAgICAgY2IoJm5ld19jb2RlY19tdXRleCwgQVZfTE9DS19ERVNUUk9ZKTsKLSAgICAgICAgICAgIHJldHVybiBlcnIgPiAwID8gQVZFUlJPUl9VTktOT1dOIDogZXJyOwotICAgICAgICB9Ci0gICAgICAgIGxvY2ttZ3JfY2IgICAgID0gY2I7Ci0gICAgICAgIGNvZGVjX211dGV4ICAgID0gbmV3X2NvZGVjX211dGV4OwotICAgICAgICBhdmZvcm1hdF9tdXRleCA9IG5ld19hdmZvcm1hdF9tdXRleDsKLSAgICB9Ci0KICAgICByZXR1cm4gMDsKIH0KLQotaW50IGZmX2xvY2tfYXZjb2RlYyhBVkNvZGVjQ29udGV4dCAqbG9nX2N0eCwgY29uc3QgQVZDb2RlYyAqY29kZWMpCi17Ci0gICAgaWYgKGNvZGVjLT5jYXBzX2ludGVybmFsICYgRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8fCAhY29kZWMtPmluaXQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKGxvY2ttZ3JfY2IpIHsKLSAgICAgICAgaWYgKCgqbG9ja21ncl9jYikoJmNvZGVjX211dGV4LCBBVl9MT0NLX09CVEFJTikpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJmVudGFuZ2xlZF90aHJlYWRfY291bnRlciwgMSkgIT0gMSkgewotICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkluc3VmZmljaWVudCB0aHJlYWQgbG9ja2luZy4gQXQgbGVhc3QgJWQgdGhyZWFkcyBhcmUgIgotICAgICAgICAgICAgICAgImNhbGxpbmcgYXZjb2RlY19vcGVuMigpIGF0IHRoZSBzYW1lIHRpbWUgcmlnaHQgbm93LlxuIiwKLSAgICAgICAgICAgICAgIGVudGFuZ2xlZF90aHJlYWRfY291bnRlcik7Ci0gICAgICAgIGlmICghbG9ja21ncl9jYikKLSAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJObyBsb2NrIG1hbmFnZXIgaXMgc2V0LCBwbGVhc2Ugc2VlIGF2X2xvY2ttZ3JfcmVnaXN0ZXIoKVxuIik7Ci0gICAgICAgIGZmX2F2Y29kZWNfbG9ja2VkID0gMTsKLSAgICAgICAgZmZfdW5sb2NrX2F2Y29kZWMoY29kZWMpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBhdl9hc3NlcnQwKCFmZl9hdmNvZGVjX2xvY2tlZCk7Ci0gICAgZmZfYXZjb2RlY19sb2NrZWQgPSAxOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgZmZfdW5sb2NrX2F2Y29kZWMoY29uc3QgQVZDb2RlYyAqY29kZWMpCi17Ci0gICAgaWYgKGNvZGVjLT5jYXBzX2ludGVybmFsICYgRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8fCAhY29kZWMtPmluaXQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgYXZfYXNzZXJ0MChmZl9hdmNvZGVjX2xvY2tlZCk7Ci0gICAgZmZfYXZjb2RlY19sb2NrZWQgPSAwOwotICAgIGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJmVudGFuZ2xlZF90aHJlYWRfY291bnRlciwgLTEpOwotICAgIGlmIChsb2NrbWdyX2NiKSB7Ci0gICAgICAgIGlmICgoKmxvY2ttZ3JfY2IpKCZjb2RlY19tdXRleCwgQVZfTE9DS19SRUxFQVNFKSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGF2cHJpdl9sb2NrX2F2Zm9ybWF0KHZvaWQpCi17Ci0gICAgaWYgKGxvY2ttZ3JfY2IpIHsKLSAgICAgICAgaWYgKCgqbG9ja21ncl9jYikoJmF2Zm9ybWF0X211dGV4LCBBVl9MT0NLX09CVEFJTikpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgYXZwcml2X3VubG9ja19hdmZvcm1hdCh2b2lkKQotewotICAgIGlmIChsb2NrbWdyX2NiKSB7Ci0gICAgICAgIGlmICgoKmxvY2ttZ3JfY2IpKCZhdmZvcm1hdF9tdXRleCwgQVZfTE9DS19SRUxFQVNFKSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19CisjZW5kaWYKIAogdW5zaWduZWQgaW50IGF2cHJpdl90b3VwcGVyNCh1bnNpZ25lZCBpbnQgeCkKIHsKQEAgLTMzODMsNyArMTc4NSw4IEBACiB7CiAgICAgaW50IHJldDsKIAotICAgIGRzdC0+b3duZXIgPSBzcmMtPm93bmVyOworICAgIGRzdC0+b3duZXJbMF0gPSBzcmMtPm93bmVyWzBdOworICAgIGRzdC0+b3duZXJbMV0gPSBzcmMtPm93bmVyWzFdOwogCiAgICAgcmV0ID0gYXZfZnJhbWVfcmVmKGRzdC0+Ziwgc3JjLT5mKTsKICAgICBpZiAocmV0IDwgMCkKQEAgLTMzOTMsNyArMTc5Niw3IEBACiAKICAgICBpZiAoc3JjLT5wcm9ncmVzcyAmJgogICAgICAgICAhKGRzdC0+cHJvZ3Jlc3MgPSBhdl9idWZmZXJfcmVmKHNyYy0+cHJvZ3Jlc3MpKSkgewotICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoZHN0LT5vd25lciwgZHN0KTsKKyAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGRzdC0+b3duZXJbMF0sIGRzdCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCkBAIC0zNDA5LDcgKzE4MTIsNyBAQAogCiBpbnQgZmZfdGhyZWFkX2dldF9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBUaHJlYWRGcmFtZSAqZiwgaW50IGZsYWdzKQogewotICAgIGYtPm93bmVyID0gYXZjdHg7CisgICAgZi0+b3duZXJbMF0gPSBmLT5vd25lclsxXSA9IGF2Y3R4OwogICAgIHJldHVybiBmZl9nZXRfYnVmZmVyKGF2Y3R4LCBmLT5mLCBmbGFncyk7CiB9CiAKQEAgLTM1NTUsMyArMTk1OCwyNDAgQEAKIAogICAgIHJldHVybiBwcm9wczsKIH0KKworc3RhdGljIHZvaWQgY29kZWNfcGFyYW1ldGVyc19yZXNldChBVkNvZGVjUGFyYW1ldGVycyAqcGFyKQoreworICAgIGF2X2ZyZWVwKCZwYXItPmV4dHJhZGF0YSk7CisKKyAgICBtZW1zZXQocGFyLCAwLCBzaXplb2YoKnBhcikpOworCisgICAgcGFyLT5jb2RlY190eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1VOS05PV047CisgICAgcGFyLT5jb2RlY19pZCAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTk9ORTsKKyAgICBwYXItPmZvcm1hdCAgICAgICAgICAgICAgPSAtMTsKKyAgICBwYXItPmZpZWxkX29yZGVyICAgICAgICAgPSBBVl9GSUVMRF9VTktOT1dOOworICAgIHBhci0+Y29sb3JfcmFuZ2UgICAgICAgICA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEOworICAgIHBhci0+Y29sb3JfcHJpbWFyaWVzICAgICA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRDsKKyAgICBwYXItPmNvbG9yX3RyYyAgICAgICAgICAgPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQ7CisgICAgcGFyLT5jb2xvcl9zcGFjZSAgICAgICAgID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEOworICAgIHBhci0+Y2hyb21hX2xvY2F0aW9uICAgICA9IEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRDsKKyAgICBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDAsIDEgfTsKKyAgICBwYXItPnByb2ZpbGUgICAgICAgICAgICAgPSBGRl9QUk9GSUxFX1VOS05PV047CisgICAgcGFyLT5sZXZlbCAgICAgICAgICAgICAgID0gRkZfTEVWRUxfVU5LTk9XTjsKK30KKworQVZDb2RlY1BhcmFtZXRlcnMgKmF2Y29kZWNfcGFyYW1ldGVyc19hbGxvYyh2b2lkKQoreworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBhdl9tYWxsb2N6KHNpemVvZigqcGFyKSk7CisKKyAgICBpZiAoIXBhcikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY29kZWNfcGFyYW1ldGVyc19yZXNldChwYXIpOworICAgIHJldHVybiBwYXI7Cit9CisKK3ZvaWQgYXZjb2RlY19wYXJhbWV0ZXJzX2ZyZWUoQVZDb2RlY1BhcmFtZXRlcnMgKipwcGFyKQoreworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSAqcHBhcjsKKworICAgIGlmICghcGFyKQorICAgICAgICByZXR1cm47CisgICAgY29kZWNfcGFyYW1ldGVyc19yZXNldChwYXIpOworCisgICAgYXZfZnJlZXAocHBhcik7Cit9CisKK2ludCBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShBVkNvZGVjUGFyYW1ldGVycyAqZHN0LCBjb25zdCBBVkNvZGVjUGFyYW1ldGVycyAqc3JjKQoreworICAgIGNvZGVjX3BhcmFtZXRlcnNfcmVzZXQoZHN0KTsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHNpemVvZigqZHN0KSk7CisKKyAgICBkc3QtPmV4dHJhZGF0YSAgICAgID0gTlVMTDsKKyAgICBkc3QtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICBpZiAoc3JjLT5leHRyYWRhdGEpIHsKKyAgICAgICAgZHN0LT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHNyYy0+ZXh0cmFkYXRhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgaWYgKCFkc3QtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShkc3QtPmV4dHJhZGF0YSwgc3JjLT5leHRyYWRhdGEsIHNyYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBkc3QtPmV4dHJhZGF0YV9zaXplID0gc3JjLT5leHRyYWRhdGFfc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQoQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpjb2RlYykKK3sKKyAgICBjb2RlY19wYXJhbWV0ZXJzX3Jlc2V0KHBhcik7CisKKyAgICBwYXItPmNvZGVjX3R5cGUgPSBjb2RlYy0+Y29kZWNfdHlwZTsKKyAgICBwYXItPmNvZGVjX2lkICAgPSBjb2RlYy0+Y29kZWNfaWQ7CisgICAgcGFyLT5jb2RlY190YWcgID0gY29kZWMtPmNvZGVjX3RhZzsKKworICAgIHBhci0+Yml0X3JhdGUgICAgICAgICAgICAgID0gY29kZWMtPmJpdF9yYXRlOworICAgIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICBwYXItPmJpdHNfcGVyX3Jhd19zYW1wbGUgICA9IGNvZGVjLT5iaXRzX3Blcl9yYXdfc2FtcGxlOworICAgIHBhci0+cHJvZmlsZSAgICAgICAgICAgICAgID0gY29kZWMtPnByb2ZpbGU7CisgICAgcGFyLT5sZXZlbCAgICAgICAgICAgICAgICAgPSBjb2RlYy0+bGV2ZWw7CisKKyAgICBzd2l0Y2ggKHBhci0+Y29kZWNfdHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBwYXItPmZvcm1hdCAgICAgICAgICAgICAgPSBjb2RlYy0+cGl4X2ZtdDsKKyAgICAgICAgcGFyLT53aWR0aCAgICAgICAgICAgICAgID0gY29kZWMtPndpZHRoOworICAgICAgICBwYXItPmhlaWdodCAgICAgICAgICAgICAgPSBjb2RlYy0+aGVpZ2h0OworICAgICAgICBwYXItPmZpZWxkX29yZGVyICAgICAgICAgPSBjb2RlYy0+ZmllbGRfb3JkZXI7CisgICAgICAgIHBhci0+Y29sb3JfcmFuZ2UgICAgICAgICA9IGNvZGVjLT5jb2xvcl9yYW5nZTsKKyAgICAgICAgcGFyLT5jb2xvcl9wcmltYXJpZXMgICAgID0gY29kZWMtPmNvbG9yX3ByaW1hcmllczsKKyAgICAgICAgcGFyLT5jb2xvcl90cmMgICAgICAgICAgID0gY29kZWMtPmNvbG9yX3RyYzsKKyAgICAgICAgcGFyLT5jb2xvcl9zcGFjZSAgICAgICAgID0gY29kZWMtPmNvbG9yc3BhY2U7CisgICAgICAgIHBhci0+Y2hyb21hX2xvY2F0aW9uICAgICA9IGNvZGVjLT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uOworICAgICAgICBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBjb2RlYy0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICAgICAgcGFyLT52aWRlb19kZWxheSAgICAgICAgID0gY29kZWMtPmhhc19iX2ZyYW1lczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIHBhci0+Zm9ybWF0ICAgICAgICAgICA9IGNvZGVjLT5zYW1wbGVfZm10OworICAgICAgICBwYXItPmNoYW5uZWxfbGF5b3V0ICAgPSBjb2RlYy0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgICAgIHBhci0+Y2hhbm5lbHMgICAgICAgICA9IGNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgcGFyLT5zYW1wbGVfcmF0ZSAgICAgID0gY29kZWMtPnNhbXBsZV9yYXRlOworICAgICAgICBwYXItPmJsb2NrX2FsaWduICAgICAgPSBjb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgIHBhci0+ZnJhbWVfc2l6ZSAgICAgICA9IGNvZGVjLT5mcmFtZV9zaXplOworICAgICAgICBwYXItPmluaXRpYWxfcGFkZGluZyAgPSBjb2RlYy0+aW5pdGlhbF9wYWRkaW5nOworICAgICAgICBwYXItPnRyYWlsaW5nX3BhZGRpbmcgPSBjb2RlYy0+dHJhaWxpbmdfcGFkZGluZzsKKyAgICAgICAgcGFyLT5zZWVrX3ByZXJvbGwgICAgID0gY29kZWMtPnNlZWtfcHJlcm9sbDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CisgICAgICAgIHBhci0+d2lkdGggID0gY29kZWMtPndpZHRoOworICAgICAgICBwYXItPmhlaWdodCA9IGNvZGVjLT5oZWlnaHQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChjb2RlYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgIHBhci0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihjb2RlYy0+ZXh0cmFkYXRhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgaWYgKCFwYXItPmV4dHJhZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShwYXItPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IGNvZGVjLT5leHRyYWRhdGFfc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2Y29kZWNfcGFyYW1ldGVyc190b19jb250ZXh0KEFWQ29kZWNDb250ZXh0ICpjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyKQoreworICAgIGNvZGVjLT5jb2RlY190eXBlID0gcGFyLT5jb2RlY190eXBlOworICAgIGNvZGVjLT5jb2RlY19pZCAgID0gcGFyLT5jb2RlY19pZDsKKyAgICBjb2RlYy0+Y29kZWNfdGFnICA9IHBhci0+Y29kZWNfdGFnOworCisgICAgY29kZWMtPmJpdF9yYXRlICAgICAgICAgICAgICA9IHBhci0+Yml0X3JhdGU7CisgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIGNvZGVjLT5iaXRzX3Blcl9yYXdfc2FtcGxlICAgPSBwYXItPmJpdHNfcGVyX3Jhd19zYW1wbGU7CisgICAgY29kZWMtPnByb2ZpbGUgICAgICAgICAgICAgICA9IHBhci0+cHJvZmlsZTsKKyAgICBjb2RlYy0+bGV2ZWwgICAgICAgICAgICAgICAgID0gcGFyLT5sZXZlbDsKKworICAgIHN3aXRjaCAocGFyLT5jb2RlY190eXBlKSB7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86CisgICAgICAgIGNvZGVjLT5waXhfZm10ICAgICAgICAgICAgICAgID0gcGFyLT5mb3JtYXQ7CisgICAgICAgIGNvZGVjLT53aWR0aCAgICAgICAgICAgICAgICAgID0gcGFyLT53aWR0aDsKKyAgICAgICAgY29kZWMtPmhlaWdodCAgICAgICAgICAgICAgICAgPSBwYXItPmhlaWdodDsKKyAgICAgICAgY29kZWMtPmZpZWxkX29yZGVyICAgICAgICAgICAgPSBwYXItPmZpZWxkX29yZGVyOworICAgICAgICBjb2RlYy0+Y29sb3JfcmFuZ2UgICAgICAgICAgICA9IHBhci0+Y29sb3JfcmFuZ2U7CisgICAgICAgIGNvZGVjLT5jb2xvcl9wcmltYXJpZXMgICAgICAgID0gcGFyLT5jb2xvcl9wcmltYXJpZXM7CisgICAgICAgIGNvZGVjLT5jb2xvcl90cmMgICAgICAgICAgICAgID0gcGFyLT5jb2xvcl90cmM7CisgICAgICAgIGNvZGVjLT5jb2xvcnNwYWNlICAgICAgICAgICAgID0gcGFyLT5jb2xvcl9zcGFjZTsKKyAgICAgICAgY29kZWMtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gPSBwYXItPmNocm9tYV9sb2NhdGlvbjsKKyAgICAgICAgY29kZWMtPnNhbXBsZV9hc3BlY3RfcmF0aW8gICAgPSBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIGNvZGVjLT5oYXNfYl9mcmFtZXMgICAgICAgICAgID0gcGFyLT52aWRlb19kZWxheTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CisgICAgICAgIGNvZGVjLT5zYW1wbGVfZm10ICAgICAgID0gcGFyLT5mb3JtYXQ7CisgICAgICAgIGNvZGVjLT5jaGFubmVsX2xheW91dCAgID0gcGFyLT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgY29kZWMtPmNoYW5uZWxzICAgICAgICAgPSBwYXItPmNoYW5uZWxzOworICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgICAgICA9IHBhci0+c2FtcGxlX3JhdGU7CisgICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiAgICAgID0gcGFyLT5ibG9ja19hbGlnbjsKKyAgICAgICAgY29kZWMtPmZyYW1lX3NpemUgICAgICAgPSBwYXItPmZyYW1lX3NpemU7CisgICAgICAgIGNvZGVjLT5kZWxheSAgICAgICAgICAgID0KKyAgICAgICAgY29kZWMtPmluaXRpYWxfcGFkZGluZyAgPSBwYXItPmluaXRpYWxfcGFkZGluZzsKKyAgICAgICAgY29kZWMtPnRyYWlsaW5nX3BhZGRpbmcgPSBwYXItPnRyYWlsaW5nX3BhZGRpbmc7CisgICAgICAgIGNvZGVjLT5zZWVrX3ByZXJvbGwgICAgID0gcGFyLT5zZWVrX3ByZXJvbGw7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgorICAgICAgICBjb2RlYy0+d2lkdGggID0gcGFyLT53aWR0aDsKKyAgICAgICAgY29kZWMtPmhlaWdodCA9IHBhci0+aGVpZ2h0OworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocGFyLT5leHRyYWRhdGEpIHsKKyAgICAgICAgYXZfZnJlZXAoJmNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihwYXItPmV4dHJhZGF0YV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghY29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShjb2RlYy0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IHBhci0+ZXh0cmFkYXRhX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9hbGxvY19hNTNfc2VpKGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBzaXplX3QgcHJlZml4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipkYXRhLCBzaXplX3QgKnNlaV9zaXplKQoreworICAgIEFWRnJhbWVTaWRlRGF0YSAqc2lkZV9kYXRhID0gTlVMTDsKKyAgICB1aW50OF90ICpzZWlfZGF0YTsKKworICAgIGlmIChmcmFtZSkKKyAgICAgICAgc2lkZV9kYXRhID0gYXZfZnJhbWVfZ2V0X3NpZGVfZGF0YShmcmFtZSwgQVZfRlJBTUVfREFUQV9BNTNfQ0MpOworCisgICAgaWYgKCFzaWRlX2RhdGEpIHsKKyAgICAgICAgKmRhdGEgPSBOVUxMOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqc2VpX3NpemUgPSBzaWRlX2RhdGEtPnNpemUgKyAxMTsKKyAgICAqZGF0YSA9IGF2X21hbGxvY3ooKnNlaV9zaXplICsgcHJlZml4X2xlbik7CisgICAgaWYgKCEqZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzZWlfZGF0YSA9ICh1aW50OF90KikqZGF0YSArIHByZWZpeF9sZW47CisKKyAgICAvLyBjb3VudHJ5IGNvZGUKKyAgICBzZWlfZGF0YVswXSA9IDE4MTsKKyAgICBzZWlfZGF0YVsxXSA9IDA7CisgICAgc2VpX2RhdGFbMl0gPSA0OTsKKworICAgIC8qKgorICAgICAqICdHQTk0JyBpcyBzdGFuZGFyZCBpbiBOb3J0aCBBbWVyaWNhIGZvciBBVFNDLCBidXQgaGFyZCBjb2RpbmcKKyAgICAgKiB0aGlzIHN0eWxlIG1heSBub3QgYmUgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIC0tIG90aGVyIGZvcm1hdHMKKyAgICAgKiBkbyBleGlzdC4gVGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBzaWRlX2RhdGEKKyAgICAgKiBzbyB3ZSBhcmUgZ29pbmcgd2l0aCB0aGlzIHJpZ2h0IG5vdy4KKyAgICAgKi8KKyAgICBBVl9XTDMyKHNlaV9kYXRhICsgMywgTUtUQUcoJ0cnLCAnQScsICc5JywgJzQnKSk7CisgICAgc2VpX2RhdGFbN10gPSAzOworICAgIHNlaV9kYXRhWzhdID0gKChzaWRlX2RhdGEtPnNpemUvMykgJiAweDFmKSB8IDB4NDA7CisgICAgc2VpX2RhdGFbOV0gPSAwOworCisgICAgbWVtY3B5KHNlaV9kYXRhICsgMTAsIHNpZGVfZGF0YS0+ZGF0YSwgc2lkZV9kYXRhLT5zaXplKTsKKworICAgIHNlaV9kYXRhW3NpZGVfZGF0YS0+c2l6ZSsxMF0gPSAyNTU7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50NjRfdCBmZl9ndWVzc19jb2RlZF9iaXRyYXRlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZSA9IGF2Y3R4LT5mcmFtZXJhdGU7CisgICAgaW50IGJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgaW50NjRfdCBiaXRyYXRlOworCisgICAgaWYgKCEoZnJhbWVyYXRlLm51bSAmJiBmcmFtZXJhdGUuZGVuKSkKKyAgICAgICAgZnJhbWVyYXRlID0gYXZfaW52X3EoYXZjdHgtPnRpbWVfYmFzZSk7CisgICAgaWYgKCEoZnJhbWVyYXRlLm51bSAmJiBmcmFtZXJhdGUuZGVuKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIWJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICAgICAgYml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpOworICAgIH0KKyAgICBiaXRyYXRlID0gKGludDY0X3QpYml0c19wZXJfY29kZWRfc2FtcGxlICogYXZjdHgtPndpZHRoICogYXZjdHgtPmhlaWdodCAqCisgICAgICAgICAgICAgIGZyYW1lcmF0ZS5udW0gLyBmcmFtZXJhdGUuZGVuOworCisgICAgcmV0dXJuIGJpdHJhdGU7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3V0dmlkZW8uYyBiL2xpYmF2Y29kZWMvdXR2aWRlby5jCmluZGV4IGIxNGU1NmUuLjU4MjhkNWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdXR2aWRlby5jCisrKyBiL2xpYmF2Y29kZWMvdXR2aWRlby5jCkBAIC0zOSwzICszOSw5IEBACiAgICAgY29uc3QgSHVmZkVudHJ5ICphYSA9IGEsICpiYiA9IGI7CiAgICAgcmV0dXJuIChhYS0+bGVuIC0gYmItPmxlbikqMjU2ICsgYWEtPnN5bSAtIGJiLT5zeW07CiB9CisKK2ludCBmZl91dDEwX2h1ZmZfY21wX2xlbihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworICAgIGNvbnN0IEh1ZmZFbnRyeSAqYWEgPSBhLCAqYmIgPSBiOworICAgIHJldHVybiAoYWEtPmxlbiAtIGJiLT5sZW4pKjEwMjQgKyBhYS0+c3ltIC0gYmItPnN5bTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdXR2aWRlby5oIGIvbGliYXZjb2RlYy91dHZpZGVvLmgKaW5kZXggODRlZWM2Ni4uY2YwYmIyOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy91dHZpZGVvLmgKKysrIGIvbGliYXZjb2RlYy91dHZpZGVvLmgKQEAgLTMwLDcgKzMwLDkgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImJzd2FwZHNwLmgiCi0jaW5jbHVkZSAiaHVmZnl1dmVuY2RzcC5oIgorI2luY2x1ZGUgInV0dmlkZW9kc3AuaCIKKyNpbmNsdWRlICJsb3NzbGVzc192aWRlb2RzcC5oIgorI2luY2x1ZGUgImxvc3NsZXNzX3ZpZGVvZW5jZHNwLmgiCiAKIGVudW0gewogICAgIFBSRURfTk9ORSA9IDAsCkBAIC01NiwzOSArNTgsNDcgQEAKICAgICBVVFZJREVPX1JHQkEgPSBNS1RBRygweDAwLCAweDAwLCAweDAyLCAweDE4KSwKICAgICBVVFZJREVPXzQyMCAgPSBNS1RBRygnWScsICdWJywgJzEnLCAnMicpLAogICAgIFVUVklERU9fNDIyICA9IE1LVEFHKCdZJywgJ1UnLCAnWScsICcyJyksCisgICAgVVRWSURFT180NDQgID0gTUtUQUcoJ1knLCAnVicsICcyJywgJzQnKSwKIH07CiAKIC8qIE1hcHBpbmcgb2YgbGliYXZjb2RlYyBwcmVkaWN0aW9uIG1vZGVzIHRvIFV0IFZpZGVvJ3MgKi8KIGV4dGVybiBjb25zdCBpbnQgZmZfdXRfcHJlZF9vcmRlcls1XTsKIAotLyogT3JkZXIgb2YgUkdCKEEpIHBsYW5lcyBpbiBVdCBWaWRlbyAqLwotZXh0ZXJuIGNvbnN0IGludCBmZl91dF9yZ2Jfb3JkZXJbNF07Ci0KIHR5cGVkZWYgc3RydWN0IFV0dmlkZW9Db250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgVVRWaWRlb0RTUENvbnRleHQgdXRkc3A7CiAgICAgQnN3YXBEU1BDb250ZXh0IGJkc3A7Ci0gICAgSHVmZllVVkVuY0RTUENvbnRleHQgaGRzcDsKKyAgICBMTFZpZERTUENvbnRleHQgbGx2aWRkc3A7CisgICAgTExWaWRFbmNEU1BDb250ZXh0IGxsdmlkZW5jZHNwOwogCi0gICAgdWludDMyX3QgZnJhbWVfaW5mb19zaXplLCBmbGFncywgZnJhbWVfaW5mbzsKKyAgICB1aW50MzJfdCBmcmFtZV9pbmZvX3NpemUsIGZsYWdzLCBmcmFtZV9pbmZvLCBvZmZzZXQ7CiAgICAgaW50ICAgICAgcGxhbmVzOwogICAgIGludCAgICAgIHNsaWNlczsKICAgICBpbnQgICAgICBjb21wcmVzc2lvbjsKICAgICBpbnQgICAgICBpbnRlcmxhY2VkOwogICAgIGludCAgICAgIGZyYW1lX3ByZWQ7CisgICAgaW50ICAgICAgcHJvOworICAgIGludCAgICAgIHBhY2s7CiAKLSAgICBpbnQgICAgICBzbGljZV9zdHJpZGU7CisgICAgcHRyZGlmZl90IHNsaWNlX3N0cmlkZTsKICAgICB1aW50OF90ICpzbGljZV9iaXRzLCAqc2xpY2VfYnVmZmVyWzRdOwogICAgIGludCAgICAgIHNsaWNlX2JpdHNfc2l6ZTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnBhY2tlZF9zdHJlYW1bNF1bMjU2XTsKKyAgICBzaXplX3QgcGFja2VkX3N0cmVhbV9zaXplWzRdWzI1Nl07CisgICAgY29uc3QgdWludDhfdCAqY29udHJvbF9zdHJlYW1bNF1bMjU2XTsKKyAgICBzaXplX3QgY29udHJvbF9zdHJlYW1fc2l6ZVs0XVsyNTZdOwogfSBVdHZpZGVvQ29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgSHVmZkVudHJ5IHsKLSAgICB1aW50OF90ICBzeW07CisgICAgdWludDE2X3Qgc3ltOwogICAgIHVpbnQ4X3QgIGxlbjsKICAgICB1aW50MzJfdCBjb2RlOwogfSBIdWZmRW50cnk7CiAKIC8qIENvbXBhcmUgaHVmZm1hbiB0cmVlIG5vZGVzICovCiBpbnQgZmZfdXRfaHVmZl9jbXBfbGVuKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOworaW50IGZmX3V0MTBfaHVmZl9jbXBfbGVuKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpOwogCiAjZW5kaWYgLyogQVZDT0RFQ19VVFZJREVPX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdXR2aWRlb2RlYy5jIGIvbGliYXZjb2RlYy91dHZpZGVvZGVjLmMKaW5kZXggNzYwZDllNS4uODJjYjAzOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy91dHZpZGVvZGVjLmMKKysrIGIvbGliYXZjb2RlYy91dHZpZGVvZGVjLmMKQEAgLTI3LDE0ICsyNyw2MiBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKKyNkZWZpbmUgVU5DSEVDS0VEX0JJVFNUUkVBTV9SRUFERVIgMQorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImJzd2FwZHNwLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ1dHZpZGVvLmgiCiAKK3N0YXRpYyBpbnQgYnVpbGRfaHVmZjEwKGNvbnN0IHVpbnQ4X3QgKnNyYywgVkxDICp2bGMsIGludCAqZnN5bSkKK3sKKyAgICBpbnQgaTsKKyAgICBIdWZmRW50cnkgaGVbMTAyNF07CisgICAgaW50IGxhc3Q7CisgICAgdWludDMyX3QgY29kZXNbMTAyNF07CisgICAgdWludDhfdCBiaXRzWzEwMjRdOworICAgIHVpbnQxNl90IHN5bXNbMTAyNF07CisgICAgdWludDMyX3QgY29kZTsKKworICAgICpmc3ltID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IDEwMjQ7IGkrKykgeworICAgICAgICBoZVtpXS5zeW0gPSBpOworICAgICAgICBoZVtpXS5sZW4gPSAqc3JjKys7CisgICAgfQorICAgIHFzb3J0KGhlLCAxMDI0LCBzaXplb2YoKmhlKSwgZmZfdXQxMF9odWZmX2NtcF9sZW4pOworCisgICAgaWYgKCFoZVswXS5sZW4pIHsKKyAgICAgICAgKmZzeW0gPSBoZVswXS5zeW07CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGxhc3QgPSAxMDIzOworICAgIHdoaWxlIChoZVtsYXN0XS5sZW4gPT0gMjU1ICYmIGxhc3QpCisgICAgICAgIGxhc3QtLTsKKworICAgIGlmIChoZVtsYXN0XS5sZW4gPiAzMikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY29kZSA9IDE7CisgICAgZm9yIChpID0gbGFzdDsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgY29kZXNbaV0gPSBjb2RlID4+ICgzMiAtIGhlW2ldLmxlbik7CisgICAgICAgIGJpdHNbaV0gID0gaGVbaV0ubGVuOworICAgICAgICBzeW1zW2ldICA9IGhlW2ldLnN5bTsKKyAgICAgICAgY29kZSArPSAweDgwMDAwMDAwdSA+PiAoaGVbaV0ubGVuIC0gMSk7CisgICAgfQorI2RlZmluZSBWTENfQklUUyAxMQorICAgIHJldHVybiBmZl9pbml0X3ZsY19zcGFyc2UodmxjLCBWTENfQklUUywgbGFzdCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCAgc2l6ZW9mKCpiaXRzKSwgIHNpemVvZigqYml0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlcywgc2l6ZW9mKCpjb2RlcyksIHNpemVvZigqY29kZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcywgIHNpemVvZigqc3ltcyksICBzaXplb2YoKnN5bXMpLCAwKTsKK30KKwogc3RhdGljIGludCBidWlsZF9odWZmKGNvbnN0IHVpbnQ4X3QgKnNyYywgVkxDICp2bGMsIGludCAqZnN5bSkKIHsKICAgICBpbnQgaTsKQEAgLTcyLDE0ICsxMjAsMTI3IEBACiAgICAgICAgIGNvZGUgKz0gMHg4MDAwMDAwMHUgPj4gKGhlW2ldLmxlbiAtIDEpOwogICAgIH0KIAotICAgIHJldHVybiBmZl9pbml0X3ZsY19zcGFyc2UodmxjLCBGRk1JTihoZVtsYXN0XS5sZW4sIDExKSwgbGFzdCArIDEsCisgICAgcmV0dXJuIGZmX2luaXRfdmxjX3NwYXJzZSh2bGMsIFZMQ19CSVRTLCBsYXN0ICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMsICBzaXplb2YoKmJpdHMpLCAgc2l6ZW9mKCpiaXRzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzLCBzaXplb2YoKmNvZGVzKSwgc2l6ZW9mKCpjb2RlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zLCAgc2l6ZW9mKCpzeW1zKSwgIHNpemVvZigqc3ltcyksIDApOwogfQogCitzdGF0aWMgaW50IGRlY29kZV9wbGFuZTEwKFV0dmlkZW9Db250ZXh0ICpjLCBpbnQgcGxhbmVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICpodWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX3ByZWQpCit7CisgICAgaW50IGksIGosIHNsaWNlLCBwaXgsIHJldDsKKyAgICBpbnQgc3N0YXJ0LCBzZW5kOworICAgIFZMQyB2bGM7CisgICAgR2V0Qml0Q29udGV4dCBnYjsKKyAgICBpbnQgcHJldiwgZnN5bTsKKworICAgIGlmICgocmV0ID0gYnVpbGRfaHVmZjEwKGh1ZmYsICZ2bGMsICZmc3ltKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGJ1aWxkIEh1ZmZtYW4gY29kZXNcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoZnN5bSA+PSAwKSB7IC8vIGJ1aWxkX2h1ZmYgcmVwb3J0ZWQgYSBzeW1ib2wgdG8gZmlsbCBzbGljZXMgd2l0aAorICAgICAgICBzZW5kID0gMDsKKyAgICAgICAgZm9yIChzbGljZSA9IDA7IHNsaWNlIDwgYy0+c2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgICAgICB1aW50MTZfdCAqZGVzdDsKKworICAgICAgICAgICAgc3N0YXJ0ID0gc2VuZDsKKyAgICAgICAgICAgIHNlbmQgICA9IChoZWlnaHQgKiAoc2xpY2UgKyAxKSAvIGMtPnNsaWNlcyk7CisgICAgICAgICAgICBkZXN0ICAgPSBkc3QgKyBzc3RhcnQgKiBzdHJpZGU7CisKKyAgICAgICAgICAgIHByZXYgPSAweDIwMDsKKyAgICAgICAgICAgIGZvciAoaiA9IHNzdGFydDsgaiA8IHNlbmQ7IGorKykgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBpeCA9IGZzeW07CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VfcHJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldiArPSBwaXg7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ICY9IDB4M0ZGOworICAgICAgICAgICAgICAgICAgICAgICAgcGl4ICAgPSBwcmV2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlc3RbaV0gPSBwaXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlc3QgKz0gc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNlbmQgPSAwOworICAgIGZvciAoc2xpY2UgPSAwOyBzbGljZSA8IGMtPnNsaWNlczsgc2xpY2UrKykgeworICAgICAgICB1aW50MTZfdCAqZGVzdDsKKyAgICAgICAgaW50IHNsaWNlX2RhdGFfc3RhcnQsIHNsaWNlX2RhdGFfZW5kLCBzbGljZV9zaXplOworCisgICAgICAgIHNzdGFydCA9IHNlbmQ7CisgICAgICAgIHNlbmQgICA9IChoZWlnaHQgKiAoc2xpY2UgKyAxKSAvIGMtPnNsaWNlcyk7CisgICAgICAgIGRlc3QgICA9IGRzdCArIHNzdGFydCAqIHN0cmlkZTsKKworICAgICAgICAvLyBzbGljZSBvZmZzZXQgYW5kIHNpemUgdmFsaWRhdGlvbiB3YXMgZG9uZSBlYXJsaWVyCisgICAgICAgIHNsaWNlX2RhdGFfc3RhcnQgPSBzbGljZSA/IEFWX1JMMzIoc3JjICsgc2xpY2UgKiA0IC0gNCkgOiAwOworICAgICAgICBzbGljZV9kYXRhX2VuZCAgID0gQVZfUkwzMihzcmMgKyBzbGljZSAqIDQpOworICAgICAgICBzbGljZV9zaXplICAgICAgID0gc2xpY2VfZGF0YV9lbmQgLSBzbGljZV9kYXRhX3N0YXJ0OworCisgICAgICAgIGlmICghc2xpY2Vfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJQbGFuZSBoYXMgbW9yZSB0aGFuIG9uZSBzeW1ib2wgIgorICAgICAgICAgICAgICAgICAgICJ5ZXQgYSBzbGljZSBoYXMgYSBsZW5ndGggb2YgemVyby5cbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KGMtPnNsaWNlX2JpdHMgKyBzbGljZV9zaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgYy0+YmRzcC5ic3dhcF9idWYoKHVpbnQzMl90ICopIGMtPnNsaWNlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKShzcmMgKyBzbGljZV9kYXRhX3N0YXJ0ICsgYy0+c2xpY2VzICogNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzbGljZV9kYXRhX2VuZCAtIHNsaWNlX2RhdGFfc3RhcnQgKyAzKSA+PiAyKTsKKyAgICAgICAgaW5pdF9nZXRfYml0cygmZ2IsIGMtPnNsaWNlX2JpdHMsIHNsaWNlX3NpemUgKiA4KTsKKworICAgICAgICBwcmV2ID0gMHgyMDA7CisgICAgICAgIGZvciAoaiA9IHNzdGFydDsgaiA8IHNlbmQ7IGorKykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwaXggPSBnZXRfdmxjMigmZ2IsIHZsYy50YWJsZSwgVkxDX0JJVFMsIDMpOworICAgICAgICAgICAgICAgIGlmIChwaXggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGVjb2RpbmcgZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh1c2VfcHJlZCkgeworICAgICAgICAgICAgICAgICAgICBwcmV2ICs9IHBpeDsKKyAgICAgICAgICAgICAgICAgICAgcHJldiAmPSAweDNGRjsKKyAgICAgICAgICAgICAgICAgICAgcGl4ICAgPSBwcmV2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXN0W2ldID0gcGl4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzdCArPSBzdHJpZGU7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgIlNsaWNlIGRlY29kaW5nIHJhbiBvdXQgb2YgYml0c1xuIik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPiAzMikKKyAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIiVkIGJpdHMgbGVmdCBhZnRlciBkZWNvZGluZyBzbGljZVxuIiwgZ2V0X2JpdHNfbGVmdCgmZ2IpKTsKKyAgICB9CisKKyAgICBmZl9mcmVlX3ZsYygmdmxjKTsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmZl9mcmVlX3ZsYygmdmxjKTsKKyAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKK30KKworc3RhdGljIGludCBjb21wdXRlX2NtYXNrKGludCBwbGFuZV9ubywgaW50IGludGVybGFjZWQsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQoreworICAgIGNvbnN0IGludCBpc19sdW1hID0gKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSAmJiAhcGxhbmVfbm87CisKKyAgICBpZiAoaW50ZXJsYWNlZCkKKyAgICAgICAgcmV0dXJuIH4oMSArIDIgKiBpc19sdW1hKTsKKworICAgIHJldHVybiB+aXNfbHVtYTsKK30KKwogc3RhdGljIGludCBkZWNvZGVfcGxhbmUoVXR2aWRlb0NvbnRleHQgKmMsIGludCBwbGFuZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0ZXAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCB1c2VfcHJlZCkKIHsKQEAgLTg3LDggKzI0OCw1NSBAQAogICAgIGludCBzc3RhcnQsIHNlbmQ7CiAgICAgVkxDIHZsYzsKICAgICBHZXRCaXRDb250ZXh0IGdiOwotICAgIGludCBwcmV2LCBmc3ltOwotICAgIGNvbnN0IGludCBjbWFzayA9IH4oIXBsYW5lX25vICYmIGMtPmF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCk7CisgICAgaW50IHJldCwgcHJldiwgZnN5bTsKKyAgICBjb25zdCBpbnQgY21hc2sgPSBjb21wdXRlX2NtYXNrKHBsYW5lX25vLCBjLT5pbnRlcmxhY2VkLCBjLT5hdmN0eC0+cGl4X2ZtdCk7CisKKyAgICBpZiAoYy0+cGFjaykgeworICAgICAgICBzZW5kID0gMDsKKyAgICAgICAgZm9yIChzbGljZSA9IDA7IHNsaWNlIDwgYy0+c2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgICAgICBHZXRCaXRDb250ZXh0IGNiaXQsIHBiaXQ7CisgICAgICAgICAgICB1aW50OF90ICpkZXN0LCAqcDsKKworICAgICAgICAgICAgcmV0ID0gaW5pdF9nZXRfYml0czgoJmNiaXQsIGMtPmNvbnRyb2xfc3RyZWFtW3BsYW5lX25vXVtzbGljZV0sIGMtPmNvbnRyb2xfc3RyZWFtX3NpemVbcGxhbmVfbm9dW3NsaWNlXSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICByZXQgPSBpbml0X2dldF9iaXRzOCgmcGJpdCwgYy0+cGFja2VkX3N0cmVhbVtwbGFuZV9ub11bc2xpY2VdLCBjLT5wYWNrZWRfc3RyZWFtX3NpemVbcGxhbmVfbm9dW3NsaWNlXSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBzc3RhcnQgPSBzZW5kOworICAgICAgICAgICAgc2VuZCAgID0gKGhlaWdodCAqIChzbGljZSArIDEpIC8gYy0+c2xpY2VzKSAmIGNtYXNrOworICAgICAgICAgICAgZGVzdCAgID0gZHN0ICsgc3N0YXJ0ICogc3RyaWRlOworCisgICAgICAgICAgICBpZiAoMyAqICgoZHN0ICsgc2VuZCAqIHN0cmlkZSAtIGRlc3QgKyA3KS84KSA+IGdldF9iaXRzX2xlZnQoJmNiaXQpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBmb3IgKHAgPSBkZXN0OyBwIDwgZHN0ICsgc2VuZCAqIHN0cmlkZTsgcCArPSA4KSB7CisgICAgICAgICAgICAgICAgaW50IGJpdHMgPSBnZXRfYml0c19sZSgmY2JpdCwgMyk7CisKKyAgICAgICAgICAgICAgICBpZiAoYml0cyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICoodWludDY0X3QgKikgcCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3ViID0gMHg4MCA+PiAoOCAtIChiaXRzICsgMSkpLCBhZGQ7CisgICAgICAgICAgICAgICAgICAgIGludCBrOworCisgICAgICAgICAgICAgICAgICAgIGlmICgoYml0cyArIDEpICogOCA+IGdldF9iaXRzX2xlZnQoJnBiaXQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykgeworCisgICAgICAgICAgICAgICAgICAgICAgICBwW2tdID0gZ2V0X2JpdHNfbGUoJnBiaXQsIGJpdHMgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZCA9ICh+cFtrXSAmIHN1YikgPDwgKDggLSBiaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBba10gLT0gc3ViOworICAgICAgICAgICAgICAgICAgICAgICAgcFtrXSArPSBhZGQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKICAgICBpZiAoYnVpbGRfaHVmZihzcmMsICZ2bGMsICZmc3ltKSkgewogICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBidWlsZCBIdWZmbWFuIGNvZGVzXG4iKTsKQEAgLTEwNSw3ICszMTMsNyBAQAogCiAgICAgICAgICAgICBwcmV2ID0gMHg4MDsKICAgICAgICAgICAgIGZvciAoaiA9IHNzdGFydDsgaiA8IHNlbmQ7IGorKykgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHBpeCA9IGZzeW07CiAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VfcHJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgcHJldiArPSBwaXg7CkBAIC0xNDEsMjMgKzM0OSwxNiBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAKLSAgICAgICAgbWVtY3B5KGMtPnNsaWNlX2JpdHMsIHNyYyArIHNsaWNlX2RhdGFfc3RhcnQgKyBjLT5zbGljZXMgKiA0LAotICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZSk7CiAgICAgICAgIG1lbXNldChjLT5zbGljZV9iaXRzICsgc2xpY2Vfc2l6ZSwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CiAgICAgICAgIGMtPmJkc3AuYnN3YXBfYnVmKCh1aW50MzJfdCAqKSBjLT5zbGljZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKikgYy0+c2xpY2VfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopKHNyYyArIHNsaWNlX2RhdGFfc3RhcnQgKyBjLT5zbGljZXMgKiA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNsaWNlX2RhdGFfZW5kIC0gc2xpY2VfZGF0YV9zdGFydCArIDMpID4+IDIpOwogICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgYy0+c2xpY2VfYml0cywgc2xpY2Vfc2l6ZSAqIDgpOwogCiAgICAgICAgIHByZXYgPSAweDgwOwogICAgICAgICBmb3IgKGogPSBzc3RhcnQ7IGogPCBzZW5kOyBqKyspIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgewotICAgICAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coYy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJTbGljZSBkZWNvZGluZyByYW4gb3V0IG9mIGJpdHNcbiIpOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBpeCA9IGdldF92bGMyKCZnYiwgdmxjLnRhYmxlLCB2bGMuYml0cywgMyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgICAgIHBpeCA9IGdldF92bGMyKCZnYiwgdmxjLnRhYmxlLCBWTENfQklUUywgMyk7CiAgICAgICAgICAgICAgICAgaWYgKHBpeCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJEZWNvZGluZyBlcnJvclxuIik7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKQEAgLTE2OCw2ICszNjksMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGVzdFtpXSA9IHBpeDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZnYikgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAiU2xpY2UgZGVjb2RpbmcgcmFuIG91dCBvZiBiaXRzXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZXN0ICs9IHN0cmlkZTsKICAgICAgICAgfQogICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpID4gMzIpCkBAIC0xODMsMjYgKzM4OSwxMiBAQAogICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogfQogCi1zdGF0aWMgdm9pZCByZXN0b3JlX3JnYl9wbGFuZXModWludDhfdCAqc3JjLCBpbnQgc3RlcCwgaW50IHN0cmlkZSwgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgdWludDhfdCByLCBnLCBiOworI3VuZGVmIEEKKyN1bmRlZiBCCisjdW5kZWYgQwogCi0gICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgewotICAgICAgICAgICAgciA9IHNyY1tpXTsKLSAgICAgICAgICAgIGcgPSBzcmNbaSArIDFdOwotICAgICAgICAgICAgYiA9IHNyY1tpICsgMl07Ci0gICAgICAgICAgICBzcmNbaV0gICAgID0gciArIGcgLSAweDgwOwotICAgICAgICAgICAgc3JjW2kgKyAyXSA9IGIgKyBnIC0gMHg4MDsKLSAgICAgICAgfQotICAgICAgICBzcmMgKz0gc3RyaWRlOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgcmVzdG9yZV9tZWRpYW4odWludDhfdCAqc3JjLCBpbnQgc3RlcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNsaWNlcywgaW50IHJtb2RlKQorc3RhdGljIHZvaWQgcmVzdG9yZV9tZWRpYW5fcGxhbmFyKFV0dmlkZW9Db250ZXh0ICpjLCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2xpY2VzLCBpbnQgcm1vZGUpCiB7CiAgICAgaW50IGksIGosIHNsaWNlOwogICAgIGludCBBLCBCLCBDOwpAQCAtMjIxLDExICs0MTMsNyBAQAogCiAgICAgICAgIC8vIGZpcnN0IGxpbmUgLSBsZWZ0IG5laWdoYm91ciBwcmVkaWN0aW9uCiAgICAgICAgIGJzcmNbMF0gKz0gMHg4MDsKLSAgICAgICAgQSA9IGJzcmNbMF07Ci0gICAgICAgIGZvciAoaSA9IHN0ZXA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgewotICAgICAgICAgICAgYnNyY1tpXSArPSBBOwotICAgICAgICAgICAgQSAgICAgICAgPSBic3JjW2ldOwotICAgICAgICB9CisgICAgICAgIGMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWQoYnNyYywgYnNyYywgd2lkdGgsIDApOwogICAgICAgICBic3JjICs9IHN0cmlkZTsKICAgICAgICAgaWYgKHNsaWNlX2hlaWdodCA8PSAxKQogICAgICAgICAgICAgY29udGludWU7CkBAIC0yMzMsMjEgKzQyMSwyMSBAQAogICAgICAgICBDICAgICAgICA9IGJzcmNbLXN0cmlkZV07CiAgICAgICAgIGJzcmNbMF0gKz0gQzsKICAgICAgICAgQSAgICAgICAgPSBic3JjWzBdOwotICAgICAgICBmb3IgKGkgPSBzdGVwOyBpIDwgd2lkdGggKiBzdGVwOyBpICs9IHN0ZXApIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IEZGTUlOKHdpZHRoLCAxNik7IGkrKykgeyAvKiBzY2FsYXIgbG9vcCAoRFNQIG5lZWQgYWxpZ24gMTYpICovCiAgICAgICAgICAgICBCICAgICAgICA9IGJzcmNbaSAtIHN0cmlkZV07CiAgICAgICAgICAgICBic3JjW2ldICs9IG1pZF9wcmVkKEEsIEIsICh1aW50OF90KShBICsgQiAtIEMpKTsKICAgICAgICAgICAgIEMgICAgICAgID0gQjsKICAgICAgICAgICAgIEEgICAgICAgID0gYnNyY1tpXTsKICAgICAgICAgfQorICAgICAgICBpZiAod2lkdGggPiAxNikKKyAgICAgICAgICAgIGMtPmxsdmlkZHNwLmFkZF9tZWRpYW5fcHJlZChic3JjICsgMTYsIGJzcmMgLSBzdHJpZGUgKyAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3JjICsgMTYsIHdpZHRoIC0gMTYsICZBLCAmQik7CisKICAgICAgICAgYnNyYyArPSBzdHJpZGU7CiAgICAgICAgIC8vIHRoZSByZXN0IG9mIGxpbmVzIHVzZSBjb250aW51b3VzIG1lZGlhbiBwcmVkaWN0aW9uCiAgICAgICAgIGZvciAoaiA9IDI7IGogPCBzbGljZV9oZWlnaHQ7IGorKykgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7Ci0gICAgICAgICAgICAgICAgQiAgICAgICAgPSBic3JjW2kgLSBzdHJpZGVdOwotICAgICAgICAgICAgICAgIGJzcmNbaV0gKz0gbWlkX3ByZWQoQSwgQiwgKHVpbnQ4X3QpKEEgKyBCIC0gQykpOwotICAgICAgICAgICAgICAgIEMgICAgICAgID0gQjsKLSAgICAgICAgICAgICAgICBBICAgICAgICA9IGJzcmNbaV07Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBjLT5sbHZpZGRzcC5hZGRfbWVkaWFuX3ByZWQoYnNyYywgYnNyYyAtIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNyYywgd2lkdGgsICZBLCAmQik7CiAgICAgICAgICAgICBic3JjICs9IHN0cmlkZTsKICAgICAgICAgfQogICAgIH0KQEAgLTI1NywxNSArNDQ1LDE1IEBACiAgKiBzbyByZXN0b3JpbmcgZnVuY3Rpb24gc2hvdWxkIHRha2UgY2FyZSBvZiBwb3NzaWJsZSBwYWRkaW5nIGJldHdlZW4KICAqIHR3byBwYXJ0cyBvZiB0aGUgc2FtZSAibGluZSIuCiAgKi8KLXN0YXRpYyB2b2lkIHJlc3RvcmVfbWVkaWFuX2lsKHVpbnQ4X3QgKnNyYywgaW50IHN0ZXAsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzbGljZXMsIGludCBybW9kZSkKK3N0YXRpYyB2b2lkIHJlc3RvcmVfbWVkaWFuX3BsYW5hcl9pbChVdHZpZGVvQ29udGV4dCAqYywgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNsaWNlcywgaW50IHJtb2RlKQogewogICAgIGludCBpLCBqLCBzbGljZTsKICAgICBpbnQgQSwgQiwgQzsKICAgICB1aW50OF90ICpic3JjOwogICAgIGludCBzbGljZV9zdGFydCwgc2xpY2VfaGVpZ2h0OwogICAgIGNvbnN0IGludCBjbWFzayAgID0gfihybW9kZSA/IDMgOiAxKTsKLSAgICBjb25zdCBpbnQgc3RyaWRlMiA9IHN0cmlkZSA8PCAxOworICAgIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUyID0gc3RyaWRlIDw8IDE7CiAKICAgICBmb3IgKHNsaWNlID0gMDsgc2xpY2UgPCBzbGljZXM7IHNsaWNlKyspIHsKICAgICAgICAgc2xpY2Vfc3RhcnQgICAgPSAoKHNsaWNlICogaGVpZ2h0KSAvIHNsaWNlcykgJiBjbWFzazsKQEAgLTI3OSwxNSArNDY3LDggQEAKIAogICAgICAgICAvLyBmaXJzdCBsaW5lIC0gbGVmdCBuZWlnaGJvdXIgcHJlZGljdGlvbgogICAgICAgICBic3JjWzBdICs9IDB4ODA7Ci0gICAgICAgIEEgICAgICAgID0gYnNyY1swXTsKLSAgICAgICAgZm9yIChpID0gc3RlcDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7Ci0gICAgICAgICAgICBic3JjW2ldICs9IEE7Ci0gICAgICAgICAgICBBICAgICAgICA9IGJzcmNbaV07Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7Ci0gICAgICAgICAgICBic3JjW3N0cmlkZSArIGldICs9IEE7Ci0gICAgICAgICAgICBBICAgICAgICAgICAgICAgICA9IGJzcmNbc3RyaWRlICsgaV07Ci0gICAgICAgIH0KKyAgICAgICAgQSA9IGMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWQoYnNyYywgYnNyYywgd2lkdGgsIDApOworICAgICAgICBjLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKGJzcmMgKyBzdHJpZGUsIGJzcmMgKyBzdHJpZGUsIHdpZHRoLCBBKTsKICAgICAgICAgYnNyYyArPSBzdHJpZGUyOwogICAgICAgICBpZiAoc2xpY2VfaGVpZ2h0IDw9IDEpCiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTI5NSwzMiArNDc2LDEyMCBAQAogICAgICAgICBDICAgICAgICA9IGJzcmNbLXN0cmlkZTJdOwogICAgICAgICBic3JjWzBdICs9IEM7CiAgICAgICAgIEEgICAgICAgID0gYnNyY1swXTsKLSAgICAgICAgZm9yIChpID0gc3RlcDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBGRk1JTih3aWR0aCwgMTYpOyBpKyspIHsgLyogc2NhbGFyIGxvb3AgKERTUCBuZWVkIGFsaWduIDE2KSAqLwogICAgICAgICAgICAgQiAgICAgICAgPSBic3JjW2kgLSBzdHJpZGUyXTsKICAgICAgICAgICAgIGJzcmNbaV0gKz0gbWlkX3ByZWQoQSwgQiwgKHVpbnQ4X3QpKEEgKyBCIC0gQykpOwogICAgICAgICAgICAgQyAgICAgICAgPSBCOwogICAgICAgICAgICAgQSAgICAgICAgPSBic3JjW2ldOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgewotICAgICAgICAgICAgQiAgICAgICAgICAgICAgICAgPSBic3JjW2kgLSBzdHJpZGVdOwotICAgICAgICAgICAgYnNyY1tzdHJpZGUgKyBpXSArPSBtaWRfcHJlZChBLCBCLCAodWludDhfdCkoQSArIEIgLSBDKSk7Ci0gICAgICAgICAgICBDICAgICAgICAgICAgICAgICA9IEI7Ci0gICAgICAgICAgICBBICAgICAgICAgICAgICAgICA9IGJzcmNbc3RyaWRlICsgaV07Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKHdpZHRoID4gMTYpCisgICAgICAgICAgICBjLT5sbHZpZGRzcC5hZGRfbWVkaWFuX3ByZWQoYnNyYyArIDE2LCBic3JjIC0gc3RyaWRlMiArIDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzcmMgKyAxNiwgd2lkdGggLSAxNiwgJkEsICZCKTsKKworICAgICAgICBjLT5sbHZpZGRzcC5hZGRfbWVkaWFuX3ByZWQoYnNyYyArIHN0cmlkZSwgYnNyYyAtIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic3JjICsgc3RyaWRlLCB3aWR0aCwgJkEsICZCKTsKICAgICAgICAgYnNyYyArPSBzdHJpZGUyOwogICAgICAgICAvLyB0aGUgcmVzdCBvZiBsaW5lcyB1c2UgY29udGludW91cyBtZWRpYW4gcHJlZGljdGlvbgogICAgICAgICBmb3IgKGogPSAyOyBqIDwgc2xpY2VfaGVpZ2h0OyBqKyspIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgewotICAgICAgICAgICAgICAgIEIgICAgICAgID0gYnNyY1tpIC0gc3RyaWRlMl07Ci0gICAgICAgICAgICAgICAgYnNyY1tpXSArPSBtaWRfcHJlZChBLCBCLCAodWludDhfdCkoQSArIEIgLSBDKSk7Ci0gICAgICAgICAgICAgICAgQyAgICAgICAgPSBCOwotICAgICAgICAgICAgICAgIEEgICAgICAgID0gYnNyY1tpXTsKKyAgICAgICAgICAgIGMtPmxsdmlkZHNwLmFkZF9tZWRpYW5fcHJlZChic3JjLCBic3JjIC0gc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNyYywgd2lkdGgsICZBLCAmQik7CisgICAgICAgICAgICBjLT5sbHZpZGRzcC5hZGRfbWVkaWFuX3ByZWQoYnNyYyArIHN0cmlkZSwgYnNyYyAtIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNyYyArIHN0cmlkZSwgd2lkdGgsICZBLCAmQik7CisgICAgICAgICAgICBic3JjICs9IHN0cmlkZTI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfZ3JhZGllbnRfcGxhbmFyKFV0dmlkZW9Db250ZXh0ICpjLCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzbGljZXMsIGludCBybW9kZSkKK3sKKyAgICBpbnQgaSwgaiwgc2xpY2U7CisgICAgaW50IEEsIEIsIEM7CisgICAgdWludDhfdCAqYnNyYzsKKyAgICBpbnQgc2xpY2Vfc3RhcnQsIHNsaWNlX2hlaWdodDsKKyAgICBjb25zdCBpbnQgY21hc2sgPSB+cm1vZGU7CisgICAgaW50IG1pbl93aWR0aCA9IEZGTUlOKHdpZHRoLCAzMik7CisKKyAgICBmb3IgKHNsaWNlID0gMDsgc2xpY2UgPCBzbGljZXM7IHNsaWNlKyspIHsKKyAgICAgICAgc2xpY2Vfc3RhcnQgID0gKChzbGljZSAqIGhlaWdodCkgLyBzbGljZXMpICYgY21hc2s7CisgICAgICAgIHNsaWNlX2hlaWdodCA9ICgoKChzbGljZSArIDEpICogaGVpZ2h0KSAvIHNsaWNlcykgJiBjbWFzaykgLQorICAgICAgICAgICAgICAgICAgICAgICBzbGljZV9zdGFydDsKKworICAgICAgICBpZiAoIXNsaWNlX2hlaWdodCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBic3JjID0gc3JjICsgc2xpY2Vfc3RhcnQgKiBzdHJpZGU7CisKKyAgICAgICAgLy8gZmlyc3QgbGluZSAtIGxlZnQgbmVpZ2hib3VyIHByZWRpY3Rpb24KKyAgICAgICAgYnNyY1swXSArPSAweDgwOworICAgICAgICBjLT5sbHZpZGRzcC5hZGRfbGVmdF9wcmVkKGJzcmMsIGJzcmMsIHdpZHRoLCAwKTsKKyAgICAgICAgYnNyYyArPSBzdHJpZGU7CisgICAgICAgIGlmIChzbGljZV9oZWlnaHQgPD0gMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgc2xpY2VfaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgIC8vIHNlY29uZCBsaW5lIC0gZmlyc3QgZWxlbWVudCBoYXMgdG9wIHByZWRpY3Rpb24sIHRoZSByZXN0IHVzZXMgZ3JhZGllbnQKKyAgICAgICAgICAgIGJzcmNbMF0gPSAoYnNyY1swXSArIGJzcmNbLXN0cmlkZV0pICYgMHhGRjsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBtaW5fd2lkdGg7IGkrKykgeyAvKiBkc3AgbmVlZCBhbGlnbiAzMiAqLworICAgICAgICAgICAgICAgIEEgPSBic3JjW2kgLSBzdHJpZGVdOworICAgICAgICAgICAgICAgIEIgPSBic3JjW2kgLSAoc3RyaWRlICsgMSldOworICAgICAgICAgICAgICAgIEMgPSBic3JjW2kgLSAxXTsKKyAgICAgICAgICAgICAgICBic3JjW2ldID0gKEEgLSBCICsgQyArIGJzcmNbaV0pICYgMHhGRjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAqIHN0ZXA7IGkgKz0gc3RlcCkgewotICAgICAgICAgICAgICAgIEIgICAgICAgICAgICAgICAgID0gYnNyY1tpIC0gc3RyaWRlXTsKLSAgICAgICAgICAgICAgICBic3JjW2kgKyBzdHJpZGVdICs9IG1pZF9wcmVkKEEsIEIsICh1aW50OF90KShBICsgQiAtIEMpKTsKLSAgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgICA9IEI7Ci0gICAgICAgICAgICAgICAgQSAgICAgICAgICAgICAgICAgPSBic3JjW2kgKyBzdHJpZGVdOworICAgICAgICAgICAgaWYgKHdpZHRoID4gMzIpCisgICAgICAgICAgICAgICAgYy0+bGx2aWRkc3AuYWRkX2dyYWRpZW50X3ByZWQoYnNyYyArIDMyLCBzdHJpZGUsIHdpZHRoIC0gMzIpOworICAgICAgICAgICAgYnNyYyArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfZ3JhZGllbnRfcGxhbmFyX2lsKFV0dmlkZW9Db250ZXh0ICpjLCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHNsaWNlcywgaW50IHJtb2RlKQoreworICAgIGludCBpLCBqLCBzbGljZTsKKyAgICBpbnQgQSwgQiwgQzsKKyAgICB1aW50OF90ICpic3JjOworICAgIGludCBzbGljZV9zdGFydCwgc2xpY2VfaGVpZ2h0OworICAgIGNvbnN0IGludCBjbWFzayAgID0gfihybW9kZSA/IDMgOiAxKTsKKyAgICBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlMiA9IHN0cmlkZSA8PCAxOworICAgIGludCBtaW5fd2lkdGggPSBGRk1JTih3aWR0aCwgMzIpOworCisgICAgZm9yIChzbGljZSA9IDA7IHNsaWNlIDwgc2xpY2VzOyBzbGljZSsrKSB7CisgICAgICAgIHNsaWNlX3N0YXJ0ICAgID0gKChzbGljZSAqIGhlaWdodCkgLyBzbGljZXMpICYgY21hc2s7CisgICAgICAgIHNsaWNlX2hlaWdodCAgID0gKCgoKHNsaWNlICsgMSkgKiBoZWlnaHQpIC8gc2xpY2VzKSAmIGNtYXNrKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2Vfc3RhcnQ7CisgICAgICAgIHNsaWNlX2hlaWdodCA+Pj0gMTsKKyAgICAgICAgaWYgKCFzbGljZV9oZWlnaHQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBic3JjID0gc3JjICsgc2xpY2Vfc3RhcnQgKiBzdHJpZGU7CisKKyAgICAgICAgLy8gZmlyc3QgbGluZSAtIGxlZnQgbmVpZ2hib3VyIHByZWRpY3Rpb24KKyAgICAgICAgYnNyY1swXSArPSAweDgwOworICAgICAgICBBID0gYy0+bGx2aWRkc3AuYWRkX2xlZnRfcHJlZChic3JjLCBic3JjLCB3aWR0aCwgMCk7CisgICAgICAgIGMtPmxsdmlkZHNwLmFkZF9sZWZ0X3ByZWQoYnNyYyArIHN0cmlkZSwgYnNyYyArIHN0cmlkZSwgd2lkdGgsIEEpOworICAgICAgICBic3JjICs9IHN0cmlkZTI7CisgICAgICAgIGlmIChzbGljZV9oZWlnaHQgPD0gMSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGogPSAxOyBqIDwgc2xpY2VfaGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgIC8vIHNlY29uZCBsaW5lIC0gZmlyc3QgZWxlbWVudCBoYXMgdG9wIHByZWRpY3Rpb24sIHRoZSByZXN0IHVzZXMgZ3JhZGllbnQKKyAgICAgICAgICAgIGJzcmNbMF0gPSAoYnNyY1swXSArIGJzcmNbLXN0cmlkZTJdKSAmIDB4RkY7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbWluX3dpZHRoOyBpKyspIHsgLyogZHNwIG5lZWQgYWxpZ24gMzIgKi8KKyAgICAgICAgICAgICAgICBBID0gYnNyY1tpIC0gc3RyaWRlMl07CisgICAgICAgICAgICAgICAgQiA9IGJzcmNbaSAtIChzdHJpZGUyICsgMSldOworICAgICAgICAgICAgICAgIEMgPSBic3JjW2kgLSAxXTsKKyAgICAgICAgICAgICAgICBic3JjW2ldID0gKEEgLSBCICsgQyArIGJzcmNbaV0pICYgMHhGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3aWR0aCA+IDMyKQorICAgICAgICAgICAgICAgIGMtPmxsdmlkZHNwLmFkZF9ncmFkaWVudF9wcmVkKGJzcmMgKyAzMiwgc3RyaWRlMiwgd2lkdGggLSAzMik7CisKKyAgICAgICAgICAgIEEgPSBic3JjWy1zdHJpZGVdOworICAgICAgICAgICAgQiA9IGJzcmNbLSgxICsgc3RyaWRlICsgc3RyaWRlIC0gd2lkdGgpXTsKKyAgICAgICAgICAgIEMgPSBic3JjW3dpZHRoIC0gMV07CisgICAgICAgICAgICBic3JjW3N0cmlkZV0gPSAoQSAtIEIgKyBDICsgYnNyY1tzdHJpZGVdKSAmIDB4RkY7CisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgICAgIEEgPSBic3JjW2kgLSBzdHJpZGVdOworICAgICAgICAgICAgICAgIEIgPSBic3JjW2kgLSAoMSArIHN0cmlkZSldOworICAgICAgICAgICAgICAgIEMgPSBic3JjW2kgLSAxICsgc3RyaWRlXTsKKyAgICAgICAgICAgICAgICBic3JjW2kgKyBzdHJpZGVdID0gKEEgLSBCICsgQyArIGJzcmNbaSArIHN0cmlkZV0pICYgMHhGRjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJzcmMgKz0gc3RyaWRlMjsKICAgICAgICAgfQpAQCAtMzQ1LDEyMCArNjE0LDI5MCBAQAogCiAgICAgLyogcGFyc2UgcGxhbmUgc3RydWN0dXJlIHRvIGdldCBmcmFtZSBmbGFncyBhbmQgdmFsaWRhdGUgc2xpY2Ugb2Zmc2V0cyAqLwogICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYsIGJ1Zl9zaXplKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cGxhbmVzOyBpKyspIHsKLSAgICAgICAgcGxhbmVfc3RhcnRbaV0gPSBnYi5idWZmZXI7Ci0gICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmZ2IpIDwgMjU2ICsgNCAqIGMtPnNsaWNlcykgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgZGF0YSBmb3IgYSBwbGFuZVxuIik7CisKKyAgICBpZiAoYy0+cGFjaykgeworICAgICAgICBjb25zdCB1aW50OF90ICpwYWNrZWRfc3RyZWFtOworICAgICAgICBjb25zdCB1aW50OF90ICpjb250cm9sX3N0cmVhbTsKKyAgICAgICAgR2V0Qnl0ZUNvbnRleHQgcGI7CisgICAgICAgIHVpbnQzMl90IG5iX2NiczsKKyAgICAgICAgaW50IGxlZnQ7CisKKyAgICAgICAgYy0+ZnJhbWVfaW5mbyA9IFBSRURfR1JBRElFTlQgPDwgODsKKworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAzKTsKKyAgICAgICAgYy0+b2Zmc2V0ID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKKworICAgICAgICBpZiAoYnVmX3NpemUgPD0gYy0+b2Zmc2V0ICsgOExMKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmcGIsIGJ1ZiArIDggKyBjLT5vZmZzZXQsIGJ1Zl9zaXplIC0gOCAtIGMtPm9mZnNldCk7CisKKyAgICAgICAgbmJfY2JzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnBiKTsKKyAgICAgICAgaWYgKG5iX2NicyA+IGMtPm9mZnNldCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIHBhY2tlZF9zdHJlYW0gPSBidWYgKyA4OworICAgICAgICBjb250cm9sX3N0cmVhbSA9IHBhY2tlZF9zdHJlYW0gKyAoYy0+b2Zmc2V0IC0gbmJfY2JzKTsKKyAgICAgICAgbGVmdCA9IGNvbnRyb2xfc3RyZWFtIC0gcGFja2VkX3N0cmVhbTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT5zbGljZXM7IGorKykgeworICAgICAgICAgICAgICAgIGMtPnBhY2tlZF9zdHJlYW1baV1bal0gPSBwYWNrZWRfc3RyZWFtOworICAgICAgICAgICAgICAgIGMtPnBhY2tlZF9zdHJlYW1fc2l6ZVtpXVtqXSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZwYik7CisgICAgICAgICAgICAgICAgaWYgKGMtPnBhY2tlZF9zdHJlYW1fc2l6ZVtpXVtqXSA+IGxlZnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGxlZnQgLT0gYy0+cGFja2VkX3N0cmVhbV9zaXplW2ldW2pdOworICAgICAgICAgICAgICAgIHBhY2tlZF9zdHJlYW0gKz0gYy0+cGFja2VkX3N0cmVhbV9zaXplW2ldW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbGVmdCA9IGJ1ZiArIGJ1Zl9zaXplIC0gY29udHJvbF9zdHJlYW07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPnBsYW5lczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYy0+c2xpY2VzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBjLT5jb250cm9sX3N0cmVhbVtpXVtqXSA9IGNvbnRyb2xfc3RyZWFtOworICAgICAgICAgICAgICAgIGMtPmNvbnRyb2xfc3RyZWFtX3NpemVbaV1bal0gPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcGIpOworICAgICAgICAgICAgICAgIGlmIChjLT5jb250cm9sX3N0cmVhbV9zaXplW2ldW2pdID4gbGVmdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjLT5jb250cm9sX3N0cmVhbV9zaXplW2ldW2pdOworICAgICAgICAgICAgICAgIGNvbnRyb2xfc3RyZWFtICs9IGMtPmNvbnRyb2xfc3RyZWFtX3NpemVbaV1bal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMtPnBybykgeworICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IGMtPmZyYW1lX2luZm9fc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIGRhdGEgZm9yIGZyYW1lIGluZm9ybWF0aW9uXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9Ci0gICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgMjU2KTsKLSAgICAgICAgc2xpY2Vfc3RhcnQgPSAwOwotICAgICAgICBzbGljZV9lbmQgICA9IDA7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT5zbGljZXM7IGorKykgewotICAgICAgICAgICAgc2xpY2VfZW5kICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMnUoJmdiKTsKLSAgICAgICAgICAgIHNsaWNlX3NpemUgID0gc2xpY2VfZW5kIC0gc2xpY2Vfc3RhcnQ7Ci0gICAgICAgICAgICBpZiAoc2xpY2VfZW5kIDwgMCB8fCBzbGljZV9zaXplIDwgMCB8fAotICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBzbGljZV9lbmQpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBzbGljZSBzaXplXG4iKTsKKyAgICAgICAgYy0+ZnJhbWVfaW5mbyA9IGJ5dGVzdHJlYW0yX2dldF9sZTMydSgmZ2IpOworICAgICAgICBjLT5zbGljZXMgPSAoKGMtPmZyYW1lX2luZm8gPj4gMTYpICYgMHhmZikgKyAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIHBsYW5lX3N0YXJ0W2ldID0gZ2IuYnVmZmVyOworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCAxMDI0ICsgNCAqIGMtPnNsaWNlcykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGRhdGEgZm9yIGEgcGxhbmVcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2xpY2Vfc3RhcnQgPSBzbGljZV9lbmQ7Ci0gICAgICAgICAgICBtYXhfc2xpY2Vfc2l6ZSA9IEZGTUFYKG1heF9zbGljZV9zaXplLCBzbGljZV9zaXplKTsKKyAgICAgICAgICAgIHNsaWNlX3N0YXJ0ID0gMDsKKyAgICAgICAgICAgIHNsaWNlX2VuZCAgID0gMDsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjLT5zbGljZXM7IGorKykgeworICAgICAgICAgICAgICAgIHNsaWNlX2VuZCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzJ1KCZnYik7CisgICAgICAgICAgICAgICAgaWYgKHNsaWNlX2VuZCA8IDAgfHwgc2xpY2VfZW5kIDwgc2xpY2Vfc3RhcnQgfHwKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IHNsaWNlX2VuZCArIDEwMjRMTCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluY29ycmVjdCBzbGljZSBzaXplXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNsaWNlX3NpemUgID0gc2xpY2VfZW5kIC0gc2xpY2Vfc3RhcnQ7CisgICAgICAgICAgICAgICAgc2xpY2Vfc3RhcnQgPSBzbGljZV9lbmQ7CisgICAgICAgICAgICAgICAgbWF4X3NsaWNlX3NpemUgPSBGRk1BWChtYXhfc2xpY2Vfc2l6ZSwgc2xpY2Vfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwbGFuZV9zaXplID0gc2xpY2VfZW5kOworICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCBwbGFuZV9zaXplKTsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgMTAyNCk7CiAgICAgICAgIH0KLSAgICAgICAgcGxhbmVfc2l6ZSA9IHNsaWNlX2VuZDsKLSAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCBwbGFuZV9zaXplKTsKKyAgICAgICAgcGxhbmVfc3RhcnRbYy0+cGxhbmVzXSA9IGdiLmJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIHBsYW5lX3N0YXJ0W2ldID0gZ2IuYnVmZmVyOworICAgICAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCAyNTYgKyA0ICogYy0+c2xpY2VzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnN1ZmZpY2llbnQgZGF0YSBmb3IgYSBwbGFuZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2IsIDI1Nik7CisgICAgICAgICAgICBzbGljZV9zdGFydCA9IDA7CisgICAgICAgICAgICBzbGljZV9lbmQgICA9IDA7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgYy0+c2xpY2VzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBzbGljZV9lbmQgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTMydSgmZ2IpOworICAgICAgICAgICAgICAgIGlmIChzbGljZV9lbmQgPCAwIHx8IHNsaWNlX2VuZCA8IHNsaWNlX3N0YXJ0IHx8CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBzbGljZV9lbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3Qgc2xpY2Ugc2l6ZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzbGljZV9zaXplICA9IHNsaWNlX2VuZCAtIHNsaWNlX3N0YXJ0OworICAgICAgICAgICAgICAgIHNsaWNlX3N0YXJ0ID0gc2xpY2VfZW5kOworICAgICAgICAgICAgICAgIG1heF9zbGljZV9zaXplID0gRkZNQVgobWF4X3NsaWNlX3NpemUsIHNsaWNlX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGxhbmVfc2l6ZSA9IHNsaWNlX2VuZDsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgcGxhbmVfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcGxhbmVfc3RhcnRbYy0+cGxhbmVzXSA9IGdiLmJ1ZmZlcjsKKyAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBjLT5mcmFtZV9pbmZvX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBkYXRhIGZvciBmcmFtZSBpbmZvcm1hdGlvblxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBjLT5mcmFtZV9pbmZvID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzJ1KCZnYik7CiAgICAgfQotICAgIHBsYW5lX3N0YXJ0W2MtPnBsYW5lc10gPSBnYi5idWZmZXI7Ci0gICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KCZnYikgPCBjLT5mcmFtZV9pbmZvX3NpemUpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIGRhdGEgZm9yIGZyYW1lIGluZm9ybWF0aW9uXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotICAgIGMtPmZyYW1lX2luZm8gPSBieXRlc3RyZWFtMl9nZXRfbGUzMnUoJmdiKTsKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImZyYW1lIGluZm9ybWF0aW9uIGZsYWdzICUiUFJJWDMyIlxuIiwKICAgICAgICAgICAgYy0+ZnJhbWVfaW5mbyk7CiAKICAgICBjLT5mcmFtZV9wcmVkID0gKGMtPmZyYW1lX2luZm8gPj4gOCkgJiAzOwogCi0gICAgaWYgKGMtPmZyYW1lX3ByZWQgPT0gUFJFRF9HUkFESUVOVCkgewotICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJGcmFtZSB3aXRoIGdyYWRpZW50IHByZWRpY3Rpb24iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwotICAgIH0KKyAgICBtYXhfc2xpY2Vfc2l6ZSArPSA0KmF2Y3R4LT53aWR0aDsKIAotICAgIGF2X2Zhc3RfbWFsbG9jKCZjLT5zbGljZV9iaXRzLCAmYy0+c2xpY2VfYml0c19zaXplLAotICAgICAgICAgICAgICAgICAgIG1heF9zbGljZV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFjLT5wYWNrKSB7CisgICAgICAgIGF2X2Zhc3RfbWFsbG9jKCZjLT5zbGljZV9iaXRzLCAmYy0+c2xpY2VfYml0c19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2xpY2Vfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogCi0gICAgaWYgKCFjLT5zbGljZV9iaXRzKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZiAoIWMtPnNsaWNlX2JpdHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHN3aXRjaCAoYy0+YXZjdHgtPnBpeF9mbXQpIHsKLSAgICBjYXNlIEFWX1BJWF9GTVRfUkdCMjQ6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQOgogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+cGxhbmVzOyBpKyspIHsKLSAgICAgICAgICAgIHJldCA9IGRlY29kZV9wbGFuZShjLCBpLCBmcmFtZS5mLT5kYXRhWzBdICsgZmZfdXRfcmdiX29yZGVyW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBsYW5lcywgZnJhbWUuZi0+bGluZXNpemVbMF0sIGF2Y3R4LT53aWR0aCwKKyAgICAgICAgICAgIHJldCA9IGRlY29kZV9wbGFuZShjLCBpLCBmcmFtZS5mLT5kYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmYtPmxpbmVzaXplW2ldLCBhdmN0eC0+d2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCwgcGxhbmVfc3RhcnRbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZnJhbWVfcHJlZCA9PSBQUkVEX0xFRlQpOwogICAgICAgICAgICAgaWYgKHJldCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgaWYgKGMtPmZyYW1lX3ByZWQgPT0gUFJFRF9NRURJQU4pIHsKICAgICAgICAgICAgICAgICBpZiAoIWMtPmludGVybGFjZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tZWRpYW4oZnJhbWUuZi0+ZGF0YVswXSArIGZmX3V0X3JnYl9vcmRlcltpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGxhbmVzLCBmcmFtZS5mLT5saW5lc2l6ZVswXSwgYXZjdHgtPndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0LCBjLT5zbGljZXMsIDApOworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21lZGlhbl9wbGFuYXIoYywgZnJhbWUuZi0+ZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmYtPmxpbmVzaXplW2ldLCBhdmN0eC0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0LCBjLT5zbGljZXMsIDApOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbWVkaWFuX2lsKGZyYW1lLmYtPmRhdGFbMF0gKyBmZl91dF9yZ2Jfb3JkZXJbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBsYW5lcywgZnJhbWUuZi0+bGluZXNpemVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgYy0+c2xpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tZWRpYW5fcGxhbmFyX2lsKGMsIGZyYW1lLmYtPmRhdGFbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgYy0+c2xpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjLT5mcmFtZV9wcmVkID09IFBSRURfR1JBRElFTlQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWMtPmludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9ncmFkaWVudF9wbGFuYXIoYywgZnJhbWUuZi0+ZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuZi0+bGluZXNpemVbaV0sIGF2Y3R4LT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCwgYy0+c2xpY2VzLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX2dyYWRpZW50X3BsYW5hcl9pbChjLCBmcmFtZS5mLT5kYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LCBjLT5zbGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXN0b3JlX3JnYl9wbGFuZXMoZnJhbWUuZi0+ZGF0YVswXSwgYy0+cGxhbmVzLCBmcmFtZS5mLT5saW5lc2l6ZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIGMtPnV0ZHNwLnJlc3RvcmVfcmdiX3BsYW5lcyhmcmFtZS5mLT5kYXRhWzJdLCBmcmFtZS5mLT5kYXRhWzBdLCBmcmFtZS5mLT5kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuZi0+bGluZXNpemVbMl0sIGZyYW1lLmYtPmxpbmVzaXplWzBdLCBmcmFtZS5mLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BsYW5lMTAoYywgaSwgKHVpbnQxNl90ICopZnJhbWUuZi0+ZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmYtPmxpbmVzaXplW2ldIC8gMiwgYXZjdHgtPndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCwgcGxhbmVfc3RhcnRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zdGFydFtpICsgMV0gLSAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZnJhbWVfcHJlZCA9PSBQUkVEX0xFRlQpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGMtPnV0ZHNwLnJlc3RvcmVfcmdiX3BsYW5lczEwKCh1aW50MTZfdCAqKWZyYW1lLmYtPmRhdGFbMl0sICh1aW50MTZfdCAqKWZyYW1lLmYtPmRhdGFbMF0sICh1aW50MTZfdCAqKWZyYW1lLmYtPmRhdGFbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmYtPmxpbmVzaXplWzJdIC8gMiwgZnJhbWUuZi0+bGluZXNpemVbMF0gLyAyLCBmcmFtZS5mLT5saW5lc2l6ZVsxXSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICByZXQgPSBkZWNvZGVfcGxhbmUoYywgaSwgZnJhbWUuZi0+ZGF0YVtpXSwgMSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICByZXQgPSBkZWNvZGVfcGxhbmUoYywgaSwgZnJhbWUuZi0+ZGF0YVtpXSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoID4+ICEhaSwgYXZjdHgtPmhlaWdodCA+PiAhIWksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc3RhcnRbaV0sIGMtPmZyYW1lX3ByZWQgPT0gUFJFRF9MRUZUKTsKICAgICAgICAgICAgIGlmIChyZXQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIGlmIChjLT5mcmFtZV9wcmVkID09IFBSRURfTUVESUFOKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFjLT5pbnRlcmxhY2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbWVkaWFuKGZyYW1lLmYtPmRhdGFbaV0sIDEsIGZyYW1lLmYtPmxpbmVzaXplW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggPj4gISFpLCBhdmN0eC0+aGVpZ2h0ID4+ICEhaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAhaSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbWVkaWFuX3BsYW5hcihjLCBmcmFtZS5mLT5kYXRhW2ldLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCA+PiAhIWksIGF2Y3R4LT5oZWlnaHQgPj4gISFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAhaSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tZWRpYW5faWwoZnJhbWUuZi0+ZGF0YVtpXSwgMSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCAgPj4gISFpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aGVpZ2h0ID4+ICEhaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAhaSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbWVkaWFuX3BsYW5hcl9pbChjLCBmcmFtZS5mLT5kYXRhW2ldLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCAgPj4gISFpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA+PiAhIWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zbGljZXMsICFpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMtPmZyYW1lX3ByZWQgPT0gUFJFRF9HUkFESUVOVCkgeworICAgICAgICAgICAgICAgIGlmICghYy0+aW50ZXJsYWNlZCkgeworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX2dyYWRpZW50X3BsYW5hcihjLCBmcmFtZS5mLT5kYXRhW2ldLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoID4+ICEhaSwgYXZjdHgtPmhlaWdodCA+PiAhIWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNsaWNlcywgIWkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfZ3JhZGllbnRfcGxhbmFyX2lsKGMsIGZyYW1lLmYtPmRhdGFbaV0sIGZyYW1lLmYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggID4+ICEhaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmhlaWdodCA+PiAhIWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNsaWNlcywgIWkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BsYW5lKGMsIGksIGZyYW1lLmYtPmRhdGFbaV0sIDEsIGZyYW1lLmYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BsYW5lKGMsIGksIGZyYW1lLmYtPmRhdGFbaV0sIGZyYW1lLmYtPmxpbmVzaXplW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCA+PiAhIWksIGF2Y3R4LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfc3RhcnRbaV0sIGMtPmZyYW1lX3ByZWQgPT0gUFJFRF9MRUZUKTsKICAgICAgICAgICAgIGlmIChyZXQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIGlmIChjLT5mcmFtZV9wcmVkID09IFBSRURfTUVESUFOKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFjLT5pbnRlcmxhY2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfbWVkaWFuKGZyYW1lLmYtPmRhdGFbaV0sIDEsIGZyYW1lLmYtPmxpbmVzaXplW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggPj4gISFpLCBhdmN0eC0+aGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zbGljZXMsIDApOworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21lZGlhbl9wbGFuYXIoYywgZnJhbWUuZi0+ZGF0YVtpXSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGggPj4gISFpLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAwKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21lZGlhbl9pbChmcmFtZS5mLT5kYXRhW2ldLCAxLCBmcmFtZS5mLT5saW5lc2l6ZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoID4+ICEhaSwgYXZjdHgtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tZWRpYW5fcGxhbmFyX2lsKGMsIGZyYW1lLmYtPmRhdGFbaV0sIGZyYW1lLmYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoID4+ICEhaSwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNsaWNlcywgMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChjLT5mcmFtZV9wcmVkID09IFBSRURfR1JBRElFTlQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWMtPmludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9ncmFkaWVudF9wbGFuYXIoYywgZnJhbWUuZi0+ZGF0YVtpXSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCA+PiAhIWksIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNsaWNlcywgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9ncmFkaWVudF9wbGFuYXJfaWwoYywgZnJhbWUuZi0+ZGF0YVtpXSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCAgPj4gISFpLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zbGljZXMsIDApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BsYW5lKGMsIGksIGZyYW1lLmYtPmRhdGFbaV0sIGZyYW1lLmYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9zdGFydFtpXSwgYy0+ZnJhbWVfcHJlZCA9PSBQUkVEX0xFRlQpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKGMtPmZyYW1lX3ByZWQgPT0gUFJFRF9NRURJQU4pIHsKKyAgICAgICAgICAgICAgICBpZiAoIWMtPmludGVybGFjZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9tZWRpYW5fcGxhbmFyKGMsIGZyYW1lLmYtPmRhdGFbaV0sIGZyYW1lLmYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoLCBhdmN0eC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXN0b3JlX21lZGlhbl9wbGFuYXJfaWwoYywgZnJhbWUuZi0+ZGF0YVtpXSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zbGljZXMsIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYy0+ZnJhbWVfcHJlZCA9PSBQUkVEX0dSQURJRU5UKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjLT5pbnRlcmxhY2VkKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfZ3JhZGllbnRfcGxhbmFyKGMsIGZyYW1lLmYtPmRhdGFbaV0sIGZyYW1lLmYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNsaWNlcywgMCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdG9yZV9ncmFkaWVudF9wbGFuYXJfaWwoYywgZnJhbWUuZi0+ZGF0YVtpXSwgZnJhbWUuZi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VzLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gZGVjb2RlX3BsYW5lMTAoYywgaSwgKHVpbnQxNl90ICopZnJhbWUuZi0+ZGF0YVtpXSwgZnJhbWUuZi0+bGluZXNpemVbaV0gLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPndpZHRoID4+ICEhaSwgYXZjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYW5lX3N0YXJ0W2ldLCBwbGFuZV9zdGFydFtpICsgMV0gLSAxMDI0LCBjLT5mcmFtZV9wcmVkID09IFBSRURfTEVGVCk7CisgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgZnJhbWUuZi0+a2V5X2ZyYW1lID0gMTsKQEAgLTQ3NCw0MyArOTEzLDI0IEBACiBzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIFV0dmlkZW9Db250ZXh0ICogY29uc3QgYyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGhfc2hpZnQsIHZfc2hpZnQ7CiAKICAgICBjLT5hdmN0eCA9IGF2Y3R4OwogCisgICAgZmZfdXR2aWRlb2RzcF9pbml0KCZjLT51dGRzcCk7CiAgICAgZmZfYnN3YXBkc3BfaW5pdCgmYy0+YmRzcCk7Ci0KLSAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgMTYpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiSW5zdWZmaWNpZW50IGV4dHJhZGF0YSBzaXplICVkLCBzaG91bGQgYmUgYXQgbGVhc3QgMTZcbiIsCi0gICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVuY29kZXIgdmVyc2lvbiAlZC4lZC4lZC4lZFxuIiwKLSAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YVszXSwgYXZjdHgtPmV4dHJhZGF0YVsyXSwKLSAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YVsxXSwgYXZjdHgtPmV4dHJhZGF0YVswXSk7Ci0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJPcmlnaW5hbCBmb3JtYXQgJSJQUklYMzIiXG4iLAotICAgICAgICAgICBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyA0KSk7Ci0gICAgYy0+ZnJhbWVfaW5mb19zaXplID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgOCk7Ci0gICAgYy0+ZmxhZ3MgICAgICAgICAgID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgMTIpOwotCi0gICAgaWYgKGMtPmZyYW1lX2luZm9fc2l6ZSAhPSA0KQotICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJGcmFtZSBpbmZvIG5vdCA0IGJ5dGVzIik7Ci0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJFbmNvZGluZyBwYXJhbWV0ZXJzICUwOCJQUklYMzIiXG4iLCBjLT5mbGFncyk7Ci0gICAgYy0+c2xpY2VzICAgICAgPSAoYy0+ZmxhZ3MgPj4gMjQpICsgMTsKLSAgICBjLT5jb21wcmVzc2lvbiA9IGMtPmZsYWdzICYgMTsKLSAgICBjLT5pbnRlcmxhY2VkICA9IGMtPmZsYWdzICYgMHg4MDA7CisgICAgZmZfbGx2aWRkc3BfaW5pdCgmYy0+bGx2aWRkc3ApOwogCiAgICAgYy0+c2xpY2VfYml0c19zaXplID0gMDsKIAogICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX3RhZykgewogICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdSJywgJ0cnKToKICAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOwotICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1LVEFHKCdVJywgJ0wnLCAnUicsICdBJyk6CiAgICAgICAgIGMtPnBsYW5lcyAgICAgID0gNDsKLSAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1JHQkE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJBUDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNS1RBRygnVScsICdMJywgJ1knLCAnMCcpOgogICAgICAgICBjLT5wbGFuZXMgICAgICA9IDM7CkBAIC01MjIsNiArOTQyLDI2IEBACiAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOwogICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdVJywgJ0wnLCAnWScsICc0Jyk6CisgICAgICAgIGMtPnBsYW5lcyAgICAgID0gMzsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNDcwQkc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnUScsICdZJywgJzInKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBjLT5wcm8gICAgICAgICA9IDE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnUScsICdSJywgJ0cnKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBjLT5wcm8gICAgICAgICA9IDE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnUScsICdSJywgJ0EnKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSA0OworICAgICAgICBjLT5wcm8gICAgICAgICA9IDE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJBUDEwOworICAgICAgICBicmVhazsKICAgICBjYXNlIE1LVEFHKCdVJywgJ0wnLCAnSCcsICcwJyk6CiAgICAgICAgIGMtPnBsYW5lcyAgICAgID0gMzsKICAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CkBAIC01MzIsMTIgKzk3Miw5OCBAQAogICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKICAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTCcsICdIJywgJzQnKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTScsICdZJywgJzInKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBjLT5wYWNrICAgICAgICA9IDE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjJQOworICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdVJywgJ00nLCAnSCcsICcyJyk6CisgICAgICAgIGMtPnBsYW5lcyAgICAgID0gMzsKKyAgICAgICAgYy0+cGFjayAgICAgICAgPSAxOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTScsICdZJywgJzQnKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBjLT5wYWNrICAgICAgICA9IDE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOworICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdVJywgJ00nLCAnSCcsICc0Jyk6CisgICAgICAgIGMtPnBsYW5lcyAgICAgID0gMzsKKyAgICAgICAgYy0+cGFjayAgICAgICAgPSAxOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUtUQUcoJ1UnLCAnTScsICdSJywgJ0cnKToKKyAgICAgICAgYy0+cGxhbmVzICAgICAgPSAzOworICAgICAgICBjLT5wYWNrICAgICAgICA9IDE7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9HQlJQOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1LVEFHKCdVJywgJ00nLCAnUicsICdBJyk6CisgICAgICAgIGMtPnBsYW5lcyAgICAgID0gNDsKKyAgICAgICAgYy0+cGFjayAgICAgICAgPSAxOworICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR0JSQVA7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBVdCBWaWRlbyBGT1VSQ0MgcHJvdmlkZWQgKCUwOFgpXG4iLAogICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAorICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LCAmaF9zaGlmdCwgJnZfc2hpZnQpOworICAgIGlmICgoYXZjdHgtPndpZHRoICAmICgoMTw8aF9zaGlmdCktMSkpIHx8CisgICAgICAgIChhdmN0eC0+aGVpZ2h0ICYgKCgxPDx2X3NoaWZ0KS0xKSkpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiT2RkIGRpbWVuc2lvbnMiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGlmIChjLT5wYWNrICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSAxNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVuY29kZXIgdmVyc2lvbiAlZC4lZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFbM10sIGF2Y3R4LT5leHRyYWRhdGFbMl0sCisgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhWzFdLCBhdmN0eC0+ZXh0cmFkYXRhWzBdKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJPcmlnaW5hbCBmb3JtYXQgJSJQUklYMzIiXG4iLAorICAgICAgICAgICAgICAgQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgNCkpOworICAgICAgICBjLT5jb21wcmVzc2lvbiA9IGF2Y3R4LT5leHRyYWRhdGFbOF07CisgICAgICAgIGlmIChjLT5jb21wcmVzc2lvbiAhPSAyKQorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVW5rbm93biBjb21wcmVzc2lvbiB0eXBlIik7CisgICAgICAgIGMtPnNsaWNlcyAgICAgID0gYXZjdHgtPmV4dHJhZGF0YVs5XSArIDE7CisgICAgfSBlbHNlIGlmICghYy0+cHJvICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSAxNikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVuY29kZXIgdmVyc2lvbiAlZC4lZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFbM10sIGF2Y3R4LT5leHRyYWRhdGFbMl0sCisgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhWzFdLCBhdmN0eC0+ZXh0cmFkYXRhWzBdKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJPcmlnaW5hbCBmb3JtYXQgJSJQUklYMzIiXG4iLAorICAgICAgICAgICAgICAgQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhICsgNCkpOworICAgICAgICBjLT5mcmFtZV9pbmZvX3NpemUgPSBBVl9STDMyKGF2Y3R4LT5leHRyYWRhdGEgKyA4KTsKKyAgICAgICAgYy0+ZmxhZ3MgICAgICAgICAgID0gQVZfUkwzMihhdmN0eC0+ZXh0cmFkYXRhICsgMTIpOworCisgICAgICAgIGlmIChjLT5mcmFtZV9pbmZvX3NpemUgIT0gNCkKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkZyYW1lIGluZm8gbm90IDQgYnl0ZXMiKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJFbmNvZGluZyBwYXJhbWV0ZXJzICUwOCJQUklYMzIiXG4iLCBjLT5mbGFncyk7CisgICAgICAgIGMtPnNsaWNlcyAgICAgID0gKGMtPmZsYWdzID4+IDI0KSArIDE7CisgICAgICAgIGMtPmNvbXByZXNzaW9uID0gYy0+ZmxhZ3MgJiAxOworICAgICAgICBjLT5pbnRlcmxhY2VkICA9IGMtPmZsYWdzICYgMHg4MDA7CisgICAgfSBlbHNlIGlmIChjLT5wcm8gJiYgYXZjdHgtPmV4dHJhZGF0YV9zaXplID09IDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJFbmNvZGVyIHZlcnNpb24gJWQuJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhWzNdLCBhdmN0eC0+ZXh0cmFkYXRhWzJdLAorICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YVsxXSwgYXZjdHgtPmV4dHJhZGF0YVswXSk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiT3JpZ2luYWwgZm9ybWF0ICUiUFJJWDMyIlxuIiwKKyAgICAgICAgICAgICAgIEFWX1JCMzIoYXZjdHgtPmV4dHJhZGF0YSArIDQpKTsKKyAgICAgICAgYy0+aW50ZXJsYWNlZCAgPSAwOworICAgICAgICBjLT5mcmFtZV9pbmZvX3NpemUgPSA0OworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkluc3VmZmljaWVudCBleHRyYWRhdGEgc2l6ZSAlZCwgc2hvdWxkIGJlIGF0IGxlYXN0IDE2XG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTU2MCw0ICsxMDg2LDUgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAogICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3V0dmlkZW9kc3AuYyBiL2xpYmF2Y29kZWMvdXR2aWRlb2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MzFhNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3V0dmlkZW9kc3AuYwpAQCAtMCwwICsxLDgyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAidXR2aWRlb2RzcC5oIgorCitzdGF0aWMgdm9pZCByZXN0b3JlX3JnYl9wbGFuZXNfYyh1aW50OF90ICpzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemVfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgdWludDhfdCByLCBnLCBiOworICAgIGludCBpLCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICAgICByID0gc3JjX3JbaV07CisgICAgICAgICAgICBnID0gc3JjX2dbaV07CisgICAgICAgICAgICBiID0gc3JjX2JbaV07CisgICAgICAgICAgICBzcmNfcltpXSA9IHIgKyBnIC0gMHg4MDsKKyAgICAgICAgICAgIHNyY19iW2ldID0gYiArIGcgLSAweDgwOworICAgICAgICB9CisgICAgICAgIHNyY19yICs9IGxpbmVzaXplX3I7CisgICAgICAgIHNyY19nICs9IGxpbmVzaXplX2c7CisgICAgICAgIHNyY19iICs9IGxpbmVzaXplX2I7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZXN0b3JlX3JnYl9wbGFuZXMxMF9jKHVpbnQxNl90ICpzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKnNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemVfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgciwgZywgYjsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAgICAgciA9IHNyY19yW2ldOworICAgICAgICAgICAgZyA9IHNyY19nW2ldOworICAgICAgICAgICAgYiA9IHNyY19iW2ldOworICAgICAgICAgICAgc3JjX3JbaV0gPSAociArIGcgLSAweDIwMCkgJiAweDNGRjsKKyAgICAgICAgICAgIHNyY19iW2ldID0gKGIgKyBnIC0gMHgyMDApICYgMHgzRkY7CisgICAgICAgIH0KKyAgICAgICAgc3JjX3IgKz0gbGluZXNpemVfcjsKKyAgICAgICAgc3JjX2cgKz0gbGluZXNpemVfZzsKKyAgICAgICAgc3JjX2IgKz0gbGluZXNpemVfYjsKKyAgICB9Cit9CisKK2F2X2NvbGQgdm9pZCBmZl91dHZpZGVvZHNwX2luaXQoVVRWaWRlb0RTUENvbnRleHQgKmMpCit7CisgICAgYy0+cmVzdG9yZV9yZ2JfcGxhbmVzICAgPSByZXN0b3JlX3JnYl9wbGFuZXNfYzsKKyAgICBjLT5yZXN0b3JlX3JnYl9wbGFuZXMxMCA9IHJlc3RvcmVfcmdiX3BsYW5lczEwX2M7CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3V0dmlkZW9kc3BfaW5pdF94ODYoYyk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3V0dmlkZW9kc3AuaCBiL2xpYmF2Y29kZWMvdXR2aWRlb2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDI1NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3V0dmlkZW9kc3AuaApAQCAtMCwwICsxLDM5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19VVFZJREVPRFNQX0gKKyNkZWZpbmUgQVZDT0RFQ19VVFZJREVPRFNQX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVVRWaWRlb0RTUENvbnRleHQgeworICAgIHZvaWQgKCpyZXN0b3JlX3JnYl9wbGFuZXMpKHVpbnQ4X3QgKnNyY19yLCB1aW50OF90ICpzcmNfZywgdWludDhfdCAqc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplX3IsIHB0cmRpZmZfdCBsaW5lc2l6ZV9nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9iLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICAgIHZvaWQgKCpyZXN0b3JlX3JnYl9wbGFuZXMxMCkodWludDE2X3QgKnNyY19yLCB1aW50MTZfdCAqc3JjX2csIHVpbnQxNl90ICpzcmNfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9yLCBwdHJkaWZmX3QgbGluZXNpemVfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9iLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworfSBVVFZpZGVvRFNQQ29udGV4dDsKKwordm9pZCBmZl91dHZpZGVvZHNwX2luaXQoVVRWaWRlb0RTUENvbnRleHQgKmMpOwordm9pZCBmZl91dHZpZGVvZHNwX2luaXRfeDg2KFVUVmlkZW9EU1BDb250ZXh0ICpjKTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVVRWSURFT0RTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3V0dmlkZW9lbmMuYyBiL2xpYmF2Y29kZWMvdXR2aWRlb2VuYy5jCmluZGV4IDAwMTg1Y2YuLmRiMDBlMWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdXR2aWRlb2VuYy5jCisrKyBiL2xpYmF2Y29kZWMvdXR2aWRlb2VuYy5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSAiYnN3YXBkc3AuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAicHV0X2JpdHMuaCIKLSNpbmNsdWRlICJodWZmeXV2ZW5jZHNwLmgiCiAjaW5jbHVkZSAibWF0aG9wcy5oIgogI2luY2x1ZGUgInV0dmlkZW8uaCIKICNpbmNsdWRlICJodWZmbWFuLmgiCkBAIC02OCwxNSArNjcsMTYgQEAKICAgICBjLT5zbGljZV9zdHJpZGUgICAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgMzIpOwogCiAgICAgc3dpdGNoIChhdmN0eC0+cGl4X2ZtdCkgewotICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKICAgICAgICAgYy0+cGxhbmVzICAgICAgICA9IDM7CiAgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ1InLCAnRycpOwogICAgICAgICBvcmlnaW5hbF9mb3JtYXQgID0gVVRWSURFT19SR0I7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDoKICAgICAgICAgYy0+cGxhbmVzICAgICAgICA9IDQ7CiAgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ1InLCAnQScpOwogICAgICAgICBvcmlnaW5hbF9mb3JtYXQgID0gVVRWSURFT19SR0JBOworICAgICAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMzI7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgogICAgICAgICBpZiAoYXZjdHgtPndpZHRoICYgMSB8fCBhdmN0eC0+aGVpZ2h0ICYgMSkgewpAQCAtMTA0LDYgKzEwNCwxNCBAQAogICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnWScsICcyJyk7CiAgICAgICAgIG9yaWdpbmFsX2Zvcm1hdCAgPSBVVFZJREVPXzQyMjsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgICAgIGMtPnBsYW5lcyAgICAgICAgPSAzOworICAgICAgICBpZiAoYXZjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX0JUNzA5KQorICAgICAgICAgICAgYXZjdHgtPmNvZGVjX3RhZyA9IE1LVEFHKCdVJywgJ0wnLCAnSCcsICc0Jyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2Y3R4LT5jb2RlY190YWcgPSBNS1RBRygnVScsICdMJywgJ1knLCAnNCcpOworICAgICAgICBvcmlnaW5hbF9mb3JtYXQgID0gVVRWSURFT180NDQ7CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBwaXhlbCBmb3JtYXQ6ICVkXG4iLAogICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQpOwpAQCAtMTExLDcgKzExOSw3IEBACiAgICAgfQogCiAgICAgZmZfYnN3YXBkc3BfaW5pdCgmYy0+YmRzcCk7Ci0gICAgZmZfaHVmZnl1dmVuY2RzcF9pbml0KCZjLT5oZHNwKTsKKyAgICBmZl9sbHZpZGVuY2RzcF9pbml0KCZjLT5sbHZpZGVuY2RzcCk7CiAKICNpZiBGRl9BUElfUFJJVkFURV9PUFQKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKQEAgLTE2MCw3ICsxNjgsNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIC8qIGV4dHJhZGF0YSBzaXplIGlzIDQgKiAzMmJpdCAqLworICAgIC8qIGV4dHJhZGF0YSBzaXplIGlzIDQgKiAzMiBiaXRzICovCiAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMTY7CiAKICAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihhdmN0eC0+ZXh0cmFkYXRhX3NpemUgKwpAQCAtMjM0LDU5ICsyNDIsNTMgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbWFuZ2xlX3JnYl9wbGFuZXModWludDhfdCAqZHN0WzRdLCBpbnQgZHN0X3N0cmlkZSwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3N0YXRpYyB2b2lkIG1hbmdsZV9yZ2JfcGxhbmVzKHVpbnQ4X3QgKmRzdFs0XSwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpjb25zdCBzcmNbNF0sIGludCBwbGFuZXMsIGNvbnN0IGludCBzdHJpZGVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCiB7CiAgICAgaW50IGksIGo7CiAgICAgaW50IGsgPSAyICogZHN0X3N0cmlkZTsKKyAgICBjb25zdCB1aW50OF90ICpzZyA9IHNyY1swXTsKKyAgICBjb25zdCB1aW50OF90ICpzYiA9IHNyY1sxXTsKKyAgICBjb25zdCB1aW50OF90ICpzciA9IHNyY1syXTsKKyAgICBjb25zdCB1aW50OF90ICpzYSA9IHNyY1szXTsKICAgICB1bnNpZ25lZCBpbnQgZzsKIAogICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgewotICAgICAgICBpZiAoc3RlcCA9PSAzKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggKiBzdGVwOyBpICs9IHN0ZXApIHsKLSAgICAgICAgICAgICAgICBnICAgICAgICAgPSBzcmNbaSArIDFdOworICAgICAgICBpZiAocGxhbmVzID09IDMpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZyAgICAgICAgID0gc2dbaV07CiAgICAgICAgICAgICAgICAgZHN0WzBdW2tdID0gZzsKICAgICAgICAgICAgICAgICBnICAgICAgICArPSAweDgwOwotICAgICAgICAgICAgICAgIGRzdFsxXVtrXSA9IHNyY1tpICsgMl0gLSBnOwotICAgICAgICAgICAgICAgIGRzdFsyXVtrXSA9IHNyY1tpICsgMF0gLSBnOworICAgICAgICAgICAgICAgIGRzdFsxXVtrXSA9IHNiW2ldIC0gZzsKKyAgICAgICAgICAgICAgICBkc3RbMl1ba10gPSBzcltpXSAtIGc7CiAgICAgICAgICAgICAgICAgaysrOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogc3RlcDsgaSArPSBzdGVwKSB7Ci0gICAgICAgICAgICAgICAgZyAgICAgICAgID0gc3JjW2kgKyAxXTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZyAgICAgICAgID0gc2dbaV07CiAgICAgICAgICAgICAgICAgZHN0WzBdW2tdID0gZzsKICAgICAgICAgICAgICAgICBnICAgICAgICArPSAweDgwOwotICAgICAgICAgICAgICAgIGRzdFsxXVtrXSA9IHNyY1tpICsgMl0gLSBnOwotICAgICAgICAgICAgICAgIGRzdFsyXVtrXSA9IHNyY1tpICsgMF0gLSBnOwotICAgICAgICAgICAgICAgIGRzdFszXVtrXSA9IHNyY1tpICsgM107CisgICAgICAgICAgICAgICAgZHN0WzFdW2tdID0gc2JbaV0gLSBnOworICAgICAgICAgICAgICAgIGRzdFsyXVtrXSA9IHNyW2ldIC0gZzsKKyAgICAgICAgICAgICAgICBkc3RbM11ba10gPSBzYVtpXTsKICAgICAgICAgICAgICAgICBrKys7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzYSArPSBzdHJpZGVbM107CiAgICAgICAgIH0KICAgICAgICAgayArPSBkc3Rfc3RyaWRlIC0gd2lkdGg7Ci0gICAgICAgIHNyYyArPSBzdHJpZGU7CisgICAgICAgIHNnICs9IHN0cmlkZVswXTsKKyAgICAgICAgc2IgKz0gc3RyaWRlWzFdOworICAgICAgICBzciArPSBzdHJpZGVbMl07CiAgICAgfQogfQogCi0vKiBXcml0ZSBkYXRhIHRvIGEgcGxhbmUgd2l0aCBsZWZ0IHByZWRpY3Rpb24gKi8KLXN0YXRpYyB2b2lkIGxlZnRfcHJlZGljdCh1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgdWludDhfdCBwcmV2OwotCi0gICAgcHJldiA9IDB4ODA7IC8qIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSAqLwotICAgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7IGorKykgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2ldIC0gcHJldjsKLSAgICAgICAgICAgIHByZXYgICA9IHNyY1tpXTsKLSAgICAgICAgfQotICAgICAgICBzcmMgKz0gc3RyaWRlOwotICAgIH0KLX0KKyN1bmRlZiBBCisjdW5kZWYgQgogCiAvKiBXcml0ZSBkYXRhIHRvIGEgcGxhbmUgd2l0aCBtZWRpYW4gcHJlZGljdGlvbiAqLwotc3RhdGljIHZvaWQgbWVkaWFuX3ByZWRpY3QoVXR2aWRlb0NvbnRleHQgKmMsIHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorc3RhdGljIHZvaWQgbWVkaWFuX3ByZWRpY3QoVXR2aWRlb0NvbnRleHQgKmMsIHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIGludCBpLCBqOwogICAgIGludCBBLCBCOwpAQCAtMzEyLDcgKzMxNCw3IEBACiAKICAgICAvKiBSZXN0IG9mIHRoZSBjb2RlZCBwYXJ0IHVzZXMgbWVkaWFuIHByZWRpY3Rpb24gKi8KICAgICBmb3IgKGogPSAxOyBqIDwgaGVpZ2h0OyBqKyspIHsKLSAgICAgICAgYy0+aGRzcC5zdWJfaGZ5dV9tZWRpYW5fcHJlZChkc3QsIHNyYyAtIHN0cmlkZSwgc3JjLCB3aWR0aCwgJkEsICZCKTsKKyAgICAgICAgYy0+bGx2aWRlbmNkc3Auc3ViX21lZGlhbl9wcmVkKGRzdCwgc3JjIC0gc3RyaWRlLCBzcmMsIHdpZHRoLCAmQSwgJkIpOwogICAgICAgICBkc3QgKz0gd2lkdGg7CiAgICAgICAgIHNyYyArPSBzdHJpZGU7CiAgICAgfQpAQCAtMzcxLDcgKzM3Myw3IEBACiAgICAgICAgIHNyYyArPSB3aWR0aDsKICAgICB9CiAKLSAgICAvKiBQYWQgb3V0cHV0IHRvIGEgMzJiaXQgYm91bmRhcnkgKi8KKyAgICAvKiBQYWQgb3V0cHV0IHRvIGEgMzItYml0IGJvdW5kYXJ5ICovCiAgICAgY291bnQgPSBwdXRfYml0c19jb3VudCgmcGIpICYgMHgxRjsKIAogICAgIGlmIChjb3VudCkKQEAgLTM4Nyw3ICszODksNyBAQAogfQogCiBzdGF0aWMgaW50IGVuY29kZV9wbGFuZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IHBsYW5lX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgcGxhbmVfbm8sCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFB1dEJ5dGVDb250ZXh0ICpwYikKIHsKICAgICBVdHZpZGVvQ29udGV4dCAqYyAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOwpAQCAtNDE3LDggKzQxOSw3IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5zbGljZXM7IGkrKykgewogICAgICAgICAgICAgc3N0YXJ0ID0gc2VuZDsKICAgICAgICAgICAgIHNlbmQgICA9IGhlaWdodCAqIChpICsgMSkgLyBjLT5zbGljZXMgJiBjbWFzazsKLSAgICAgICAgICAgIGxlZnRfcHJlZGljdChzcmMgKyBzc3RhcnQgKiBzdHJpZGUsIGRzdCArIHNzdGFydCAqIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgd2lkdGgsIHNlbmQgLSBzc3RhcnQpOworICAgICAgICAgICAgYy0+bGx2aWRlbmNkc3Auc3ViX2xlZnRfcHJlZGljdChkc3QgKyBzc3RhcnQgKiB3aWR0aCwgc3JjICsgc3N0YXJ0ICogc3RyaWRlLCBzdHJpZGUsIHdpZHRoLCBzZW5kIC0gc3N0YXJ0KTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFBSRURfTUVESUFOOgpAQCAtNTYwLDE0ICs1NjEsMTQgQEAKICAgICB9CiAKICAgICAvKiBJbiBjYXNlIG9mIFJHQiwgbWFuZ2xlIHRoZSBwbGFuZXMgdG8gVXQgVmlkZW8ncyBmb3JtYXQgKi8KLSAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0JBIHx8IGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMjQpCi0gICAgICAgIG1hbmdsZV9yZ2JfcGxhbmVzKGMtPnNsaWNlX2J1ZmZlciwgYy0+c2xpY2Vfc3RyaWRlLCBwaWMtPmRhdGFbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnBsYW5lcywgcGljLT5saW5lc2l6ZVswXSwgd2lkdGgsIGhlaWdodCk7CisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfR0JSQVAgfHwgYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9HQlJQKQorICAgICAgICBtYW5nbGVfcmdiX3BsYW5lcyhjLT5zbGljZV9idWZmZXIsIGMtPnNsaWNlX3N0cmlkZSwgcGljLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5wbGFuZXMsIHBpYy0+bGluZXNpemUsIHdpZHRoLCBoZWlnaHQpOwogCiAgICAgLyogRGVhbCB3aXRoIHRoZSBwbGFuZXMgKi8KICAgICBzd2l0Y2ggKGF2Y3R4LT5waXhfZm10KSB7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OgotICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDoKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPnBsYW5lczsgaSsrKSB7CiAgICAgICAgICAgICByZXQgPSBlbmNvZGVfcGxhbmUoYXZjdHgsIGMtPnNsaWNlX2J1ZmZlcltpXSArIDIgKiBjLT5zbGljZV9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2xpY2VfYnVmZmVyW2ldLCBjLT5zbGljZV9zdHJpZGUsIGksCkBAIC01NzksNiArNTgwLDE3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5wbGFuZXM7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gZW5jb2RlX3BsYW5lKGF2Y3R4LCBwaWMtPmRhdGFbaV0sIGMtPnNsaWNlX2J1ZmZlclswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPmxpbmVzaXplW2ldLCBpLCB3aWR0aCwgaGVpZ2h0LCAmcGIpOworCisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBlbmNvZGluZyBwbGFuZSAlZC5cbiIsIGkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5wbGFuZXM7IGkrKykgewogICAgICAgICAgICAgcmV0ID0gZW5jb2RlX3BsYW5lKGF2Y3R4LCBwaWMtPmRhdGFbaV0sIGMtPnNsaWNlX2J1ZmZlclswXSwKQEAgLTYwOSw3ICs2MjEsNyBAQAogICAgIH0KIAogICAgIC8qCi0gICAgICogV3JpdGUgZnJhbWUgaW5mb3JtYXRpb24gKExFIDMyYml0IHVuc2lnbmVkKQorICAgICAqIFdyaXRlIGZyYW1lIGluZm9ybWF0aW9uIChMRSAzMi1iaXQgdW5zaWduZWQpCiAgICAgICogaW50byB0aGUgb3V0cHV0IHBhY2tldC4KICAgICAgKiBDb250YWlucyB0aGUgcHJlZGljdGlvbiBtZXRob2QuCiAgICAgICovCkBAIC02NjcsNyArNjc5LDcgQEAKICAgICAuY2xvc2UgICAgICAgICAgPSB1dHZpZGVvX2VuY29kZV9jbG9zZSwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUyB8IEFWX0NPREVDX0NBUF9JTlRSQV9PTkxZLAogICAgIC5waXhfZm10cyAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX1JHQkEsIEFWX1BJWF9GTVRfWVVWNDIyUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUkFQLCBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX05PTkUKICAgICAgICAgICAgICAgICAgICAgICB9LAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdjIxMGRlYy5jIGIvbGliYXZjb2RlYy92MjEwZGVjLmMKaW5kZXggOWFmOWFmNi4uOTkxOTlkZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92MjEwZGVjLmMKKysrIGIvbGliYXZjb2RlYy92MjEwZGVjLmMKQEAgLTE2MiwxMCArMTYyLDEwIEBACiB9OwogCiBzdGF0aWMgY29uc3QgQVZDbGFzcyB2MjEwZGVjX2NsYXNzID0gewotICAgICJWMjEwIERlY29kZXIiLAotICAgIGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIHYyMTBkZWNfb3B0aW9ucywKLSAgICBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNsYXNzX25hbWUgPSAiVjIxMCBEZWNvZGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gdjIxMGRlY19vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAogQVZDb2RlYyBmZl92MjEwX2RlY29kZXIgPSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3YyMTBlbmMuYyBiL2xpYmF2Y29kZWMvdjIxMGVuYy5jCmluZGV4IDAwYzg5ZGMuLmE2YWZiYmYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdjIxMGVuYy5jCisrKyBiL2xpYmF2Y29kZWMvdjIxMGVuYy5jCkBAIC04Niw3ICs4Niw4IEBACiB7CiAgICAgcy0+cGFja19saW5lXzggID0gdjIxMF9wbGFuYXJfcGFja184X2M7CiAgICAgcy0+cGFja19saW5lXzEwID0gdjIxMF9wbGFuYXJfcGFja18xMF9jOwotICAgIHMtPnNhbXBsZV9mYWN0b3IgPSAxOworICAgIHMtPnNhbXBsZV9mYWN0b3JfOCAgPSAxOworICAgIHMtPnNhbXBsZV9mYWN0b3JfMTAgPSAxOwogCiAgICAgaWYgKEFSQ0hfWDg2KQogICAgICAgICBmZl92MjEwZW5jX2luaXRfeDg2KHMpOwpAQCAtMTA5LDYgKzExMCw5IEBACiAKICAgICBmZl92MjEwZW5jX2luaXQocyk7CiAKKyAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMjA7CisgICAgYXZjdHgtPmJpdF9yYXRlID0gZmZfZ3Vlc3NfY29kZWRfYml0cmF0ZShhdmN0eCkgKiAxNiAvIDE1OworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEzMywxNSArMTM3LDE5IEBACiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICp5ID0gKGNvbnN0IHVpbnQxNl90ICopcGljLT5kYXRhWzBdOwogICAgICAgICBjb25zdCB1aW50MTZfdCAqdSA9IChjb25zdCB1aW50MTZfdCAqKXBpYy0+ZGF0YVsxXTsKICAgICAgICAgY29uc3QgdWludDE2X3QgKnYgPSAoY29uc3QgdWludDE2X3QgKilwaWMtPmRhdGFbMl07CisKKyAgICAgICAgY29uc3QgaW50IHNhbXBsZV9zaXplID0gNiAqIHMtPnNhbXBsZV9mYWN0b3JfMTA7CisgICAgICAgIGNvbnN0IGludCBzYW1wbGVfdyAgICA9IGF2Y3R4LT53aWR0aCAvIHNhbXBsZV9zaXplOworCiAgICAgICAgIGZvciAoaCA9IDA7IGggPCBhdmN0eC0+aGVpZ2h0OyBoKyspIHsKICAgICAgICAgICAgIHVpbnQzMl90IHZhbDsKLSAgICAgICAgICAgIHcgPSAoYXZjdHgtPndpZHRoIC8gKDYgKiBzLT5zYW1wbGVfZmFjdG9yKSkgKiA2ICogcy0+c2FtcGxlX2ZhY3RvcjsKKyAgICAgICAgICAgIHcgPSBzYW1wbGVfdyAqIHNhbXBsZV9zaXplOwogICAgICAgICAgICAgcy0+cGFja19saW5lXzEwKHksIHUsIHYsIGRzdCwgdyk7CiAKICAgICAgICAgICAgIHkgKz0gdzsKICAgICAgICAgICAgIHUgKz0gdyA+PiAxOwogICAgICAgICAgICAgdiArPSB3ID4+IDE7Ci0gICAgICAgICAgICBkc3QgKz0gKHcgLyAoNiAqIHMtPnNhbXBsZV9mYWN0b3IpKSAqIDE2ICogcy0+c2FtcGxlX2ZhY3RvcjsKKyAgICAgICAgICAgIGRzdCArPSBzYW1wbGVfdyAqIDE2ICogcy0+c2FtcGxlX2ZhY3Rvcl8xMDsKIAogICAgICAgICAgICAgZm9yICg7IHcgPCBhdmN0eC0+d2lkdGggLSA1OyB3ICs9IDYpIHsKICAgICAgICAgICAgICAgICBXUklURV9QSVhFTFModSwgeSwgdik7CkBAIC0xNzgsMTUgKzE4NiwxOSBAQAogICAgICAgICBjb25zdCB1aW50OF90ICp5ID0gcGljLT5kYXRhWzBdOwogICAgICAgICBjb25zdCB1aW50OF90ICp1ID0gcGljLT5kYXRhWzFdOwogICAgICAgICBjb25zdCB1aW50OF90ICp2ID0gcGljLT5kYXRhWzJdOworCisgICAgICAgIGNvbnN0IGludCBzYW1wbGVfc2l6ZSA9IDEyICogcy0+c2FtcGxlX2ZhY3Rvcl84OworICAgICAgICBjb25zdCBpbnQgc2FtcGxlX3cgICAgPSBhdmN0eC0+d2lkdGggLyBzYW1wbGVfc2l6ZTsKKwogICAgICAgICBmb3IgKGggPSAwOyBoIDwgYXZjdHgtPmhlaWdodDsgaCsrKSB7CiAgICAgICAgICAgICB1aW50MzJfdCB2YWw7Ci0gICAgICAgICAgICB3ID0gKGF2Y3R4LT53aWR0aCAvICgxMiAqIHMtPnNhbXBsZV9mYWN0b3IpKSAqIDEyICogcy0+c2FtcGxlX2ZhY3RvcjsKKyAgICAgICAgICAgIHcgPSBzYW1wbGVfdyAqIHNhbXBsZV9zaXplOwogICAgICAgICAgICAgcy0+cGFja19saW5lXzgoeSwgdSwgdiwgZHN0LCB3KTsKIAogICAgICAgICAgICAgeSArPSB3OwogICAgICAgICAgICAgdSArPSB3ID4+IDE7CiAgICAgICAgICAgICB2ICs9IHcgPj4gMTsKLSAgICAgICAgICAgIGRzdCArPSAodyAvICgxMiAqIHMtPnNhbXBsZV9mYWN0b3IpKSAqIDMyICogcy0+c2FtcGxlX2ZhY3RvcjsKKyAgICAgICAgICAgIGRzdCArPSBzYW1wbGVfdyAqIDMyICogcy0+c2FtcGxlX2ZhY3Rvcl84OwogCiAgICAgICAgICAgICBmb3IgKDsgdyA8IGF2Y3R4LT53aWR0aCAtIDU7IHcgKz0gNikgewogICAgICAgICAgICAgICAgIFdSSVRFX1BJWEVMUzgodSwgeSwgdik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3YyMTBlbmMuaCBiL2xpYmF2Y29kZWMvdjIxMGVuYy5oCmluZGV4IDg5OWE3ZDkuLjUxMzA1YzEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdjIxMGVuYy5oCisrKyBiL2xpYmF2Y29kZWMvdjIxMGVuYy5oCkBAIC0yOCw4ICsyOCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp2LCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCB3aWR0aCk7CiAgICAgdm9pZCAoKnBhY2tfbGluZV8xMCkoY29uc3QgdWludDE2X3QgKnksIGNvbnN0IHVpbnQxNl90ICp1LAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICp2LCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCB3aWR0aCk7Ci0gICAgaW50IHNhbXBsZV9mYWN0b3I7IC8qIFRoaXMgdmFsdWUgbXVzdCBiZSB0aGUgc2FtZSBmb3IgYm90aCA4LWFuZCAxMC1iaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zIG90aGVyd2lzZSB0aGUgb3V0cHV0IHdpbGwgYmUgaW5jb3JyZWN0LiAqLworICAgIGludCBzYW1wbGVfZmFjdG9yXzg7CisgICAgaW50IHNhbXBsZV9mYWN0b3JfMTA7CiB9IFYyMTBFbmNDb250ZXh0OwogCiB2b2lkIGZmX3YyMTBlbmNfaW5pdChWMjEwRW5jQ29udGV4dCAqcyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3YzMDhlbmMuYyBiL2xpYmF2Y29kZWMvdjMwOGVuYy5jCmluZGV4IGI2MGE3MmMuLmU4OGYxZjQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdjMwOGVuYy5jCisrKyBiL2xpYmF2Y29kZWMvdjMwOGVuYy5jCkBAIC0zMSw2ICszMSw5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAorICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKKyAgICBhdmN0eC0+Yml0X3JhdGUgPSBmZl9ndWVzc19jb2RlZF9iaXRyYXRlKGF2Y3R4KTsKKwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Y0MDhkZWMuYyBiL2xpYmF2Y29kZWMvdjQwOGRlYy5jCmluZGV4IGFjZmY5NWQuLjE5NmM1NzUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdjQwOGRlYy5jCisrKyBiL2xpYmF2Y29kZWMvdjQwOGRlYy5jCkBAIC04OCw2ICs4OCw3IEBACiAgICAgLmluaXQgICAgICAgICA9IHY0MDhfZGVjb2RlX2luaXQsCiAgICAgLmRlY29kZSAgICAgICA9IHY0MDhfZGVjb2RlX2ZyYW1lLAogICAgIC5jYXBhYmlsaXRpZXMgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICA9IEZGX0NPREVDX0NBUF9JTklUX1RIUkVBRFNBRkUsCiB9OwogI2VuZGlmCiAjaWYgQ09ORklHX1Y0MDhfREVDT0RFUgpAQCAtOTksNSArMTAwLDYgQEAKICAgICAuaW5pdCAgICAgICAgID0gdjQwOF9kZWNvZGVfaW5pdCwKICAgICAuZGVjb2RlICAgICAgID0gdjQwOF9kZWNvZGVfZnJhbWUsCiAgICAgLmNhcGFiaWxpdGllcyA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdjQwOGVuYy5jIGIvbGliYXZjb2RlYy92NDA4ZW5jLmMKaW5kZXggZjM3ZjM2MC4uZTEyOTY1YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92NDA4ZW5jLmMKKysrIGIvbGliYXZjb2RlYy92NDA4ZW5jLmMKQEAgLTI2LDYgKzI2LDggQEAKIAogc3RhdGljIGF2X2NvbGQgaW50IHY0MDhfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogeworICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAzMjsKKyAgICBhdmN0eC0+Yml0X3JhdGUgPSBmZl9ndWVzc19jb2RlZF9iaXRyYXRlKGF2Y3R4KTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92NDEwZW5jLmMgYi9saWJhdmNvZGVjL3Y0MTBlbmMuYwppbmRleCBmMzVmZjc1Li41ZTI0NTAyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3Y0MTBlbmMuYworKysgYi9saWJhdmNvZGVjL3Y0MTBlbmMuYwpAQCAtMzIsNiArMzIsOSBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKKyAgICBhdmN0eC0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMzI7CisgICAgYXZjdHgtPmJpdF9yYXRlID0gZmZfZ3Vlc3NfY29kZWRfYml0cmF0ZShhdmN0eCk7CisKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92NGwyX2J1ZmZlcnMuYyBiL2xpYmF2Y29kZWMvdjRsMl9idWZmZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmOTExZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdjRsMl9idWZmZXJzLmMKQEAgLTAsMCArMSw0NzggQEAKKy8qCisgKiBWNEwyIGJ1ZmZlciBoZWxwZXIgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBKb3JnZSBSYW1pcmV6IDxqb3JnZS5yYW1pcmV6LW9ydGl6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2NGwyX2NvbnRleHQuaCIKKyNpbmNsdWRlICJ2NGwyX2J1ZmZlcnMuaCIKKyNpbmNsdWRlICJ2NGwyX20ybS5oIgorCisjZGVmaW5lIFVTRUNfUEVSX1NFQyAxMDAwMDAwCisKK3N0YXRpYyBpbmxpbmUgVjRMMm0ybUNvbnRleHQgKmJ1Zl90b19tMm1jdHgoVjRMMkJ1ZmZlciAqYnVmKQoreworICAgIHJldHVybiBWNEwyX1RZUEVfSVNfT1VUUFVUKGJ1Zi0+Y29udGV4dC0+dHlwZSkgPworICAgICAgICBjb250YWluZXJfb2YoYnVmLT5jb250ZXh0LCBWNEwybTJtQ29udGV4dCwgb3V0cHV0KSA6CisgICAgICAgIGNvbnRhaW5lcl9vZihidWYtPmNvbnRleHQsIFY0TDJtMm1Db250ZXh0LCBjYXB0dXJlKTsKK30KKworc3RhdGljIGlubGluZSBBVkNvZGVjQ29udGV4dCAqbG9nZ2VyKFY0TDJCdWZmZXIgKmJ1ZikKK3sKKyAgICByZXR1cm4gYnVmX3RvX20ybWN0eChidWYpLT5hdmN0eDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHY0bDJfc2V0X3B0cyhWNEwyQnVmZmVyICpvdXQsIGludDY0X3QgcHRzKQoreworICAgIFY0TDJtMm1Db250ZXh0ICpzID0gYnVmX3RvX20ybWN0eChvdXQpOworICAgIEFWUmF0aW9uYWwgdjRsMl90aW1lYmFzZSA9IHsgMSwgVVNFQ19QRVJfU0VDIH07CisgICAgaW50NjRfdCB2NGwyX3B0czsKKworICAgIGlmIChwdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHB0cyA9IDA7CisKKyAgICAvKiBjb252ZXJ0IHB0cyB0byB2NGwyIHRpbWViYXNlICovCisgICAgdjRsMl9wdHMgPSBhdl9yZXNjYWxlX3EocHRzLCBzLT5hdmN0eC0+dGltZV9iYXNlLCB2NGwyX3RpbWViYXNlKTsKKyAgICBvdXQtPmJ1Zi50aW1lc3RhbXAudHZfdXNlYyA9IHY0bDJfcHRzICUgVVNFQ19QRVJfU0VDOworICAgIG91dC0+YnVmLnRpbWVzdGFtcC50dl9zZWMgPSB2NGwyX3B0cyAvIFVTRUNfUEVSX1NFQzsKK30KKworc3RhdGljIGlubGluZSB1aW50NjRfdCB2NGwyX2dldF9wdHMoVjRMMkJ1ZmZlciAqYXZidWYpCit7CisgICAgVjRMMm0ybUNvbnRleHQgKnMgPSBidWZfdG9fbTJtY3R4KGF2YnVmKTsKKyAgICBBVlJhdGlvbmFsIHY0bDJfdGltZWJhc2UgPSB7IDEsIFVTRUNfUEVSX1NFQyB9OworICAgIGludDY0X3QgdjRsMl9wdHM7CisKKyAgICAvKiBjb252ZXJ0IHB0cyBiYWNrIHRvIGVuY29kZXIgdGltZWJhc2UgKi8KKyAgICB2NGwyX3B0cyA9IChpbnQ2NF90KWF2YnVmLT5idWYudGltZXN0YW1wLnR2X3NlYyAqIFVTRUNfUEVSX1NFQyArCisgICAgICAgICAgICAgICAgICAgICAgICBhdmJ1Zi0+YnVmLnRpbWVzdGFtcC50dl91c2VjOworCisgICAgcmV0dXJuIGF2X3Jlc2NhbGVfcSh2NGwyX3B0cywgdjRsMl90aW1lYmFzZSwgcy0+YXZjdHgtPnRpbWVfYmFzZSk7Cit9CisKK3N0YXRpYyBlbnVtIEFWQ29sb3JQcmltYXJpZXMgdjRsMl9nZXRfY29sb3JfcHJpbWFyaWVzKFY0TDJCdWZmZXIgKmJ1ZikKK3sKKyAgICBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcgeWNiY3I7CisgICAgZW51bSB2NGwyX2NvbG9yc3BhY2UgY3M7CisKKyAgICBjcyA9IFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihidWYtPmJ1Zi50eXBlKSA/CisgICAgICAgIGJ1Zi0+Y29udGV4dC0+Zm9ybWF0LmZtdC5waXhfbXAuY29sb3JzcGFjZSA6CisgICAgICAgIGJ1Zi0+Y29udGV4dC0+Zm9ybWF0LmZtdC5waXguY29sb3JzcGFjZTsKKworICAgIHljYmNyID0gVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGJ1Zi0+YnVmLnR5cGUpID8KKyAgICAgICAgYnVmLT5jb250ZXh0LT5mb3JtYXQuZm10LnBpeF9tcC55Y2Jjcl9lbmM6CisgICAgICAgIGJ1Zi0+Y29udGV4dC0+Zm9ybWF0LmZtdC5waXgueWNiY3JfZW5jOworCisgICAgc3dpdGNoKHljYmNyKSB7CisgICAgY2FzZSBWNEwyX1lDQkNSX0VOQ19YVjcwOToKKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DXzcwOTogcmV0dXJuIEFWQ09MX1BSSV9CVDcwOTsKKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DX1hWNjAxOgorICAgIGNhc2UgVjRMMl9ZQ0JDUl9FTkNfNjAxOnJldHVybiBBVkNPTF9QUklfQlQ0NzBNOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaChjcykgeworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fQkc6IHJldHVybiBBVkNPTF9QUklfQlQ0NzBCRzsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9TTVBURTE3ME06IHJldHVybiBBVkNPTF9QUklfU01QVEUxNzBNOworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMjQwTTogcmV0dXJuIEFWQ09MX1BSSV9TTVBURTI0ME07CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfQlQyMDIwOiByZXR1cm4gQVZDT0xfUFJJX0JUMjAyMDsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEOworfQorCitzdGF0aWMgZW51bSBBVkNvbG9yUmFuZ2UgdjRsMl9nZXRfY29sb3JfcmFuZ2UoVjRMMkJ1ZmZlciAqYnVmKQoreworICAgIGVudW0gdjRsMl9xdWFudGl6YXRpb24gcXQ7CisKKyAgICBxdCA9IFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihidWYtPmJ1Zi50eXBlKSA/CisgICAgICAgIGJ1Zi0+Y29udGV4dC0+Zm9ybWF0LmZtdC5waXhfbXAucXVhbnRpemF0aW9uIDoKKyAgICAgICAgYnVmLT5jb250ZXh0LT5mb3JtYXQuZm10LnBpeC5xdWFudGl6YXRpb247CisKKyAgICBzd2l0Y2ggKHF0KSB7CisgICAgY2FzZSBWNEwyX1FVQU5USVpBVElPTl9MSU1fUkFOR0U6IHJldHVybiBBVkNPTF9SQU5HRV9NUEVHOworICAgIGNhc2UgVjRMMl9RVUFOVElaQVRJT05fRlVMTF9SQU5HRTogcmV0dXJuIEFWQ09MX1JBTkdFX0pQRUc7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgIHJldHVybiBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRDsKK30KKworc3RhdGljIGVudW0gQVZDb2xvclNwYWNlIHY0bDJfZ2V0X2NvbG9yX3NwYWNlKFY0TDJCdWZmZXIgKmJ1ZikKK3sKKyAgICBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcgeWNiY3I7CisgICAgZW51bSB2NGwyX2NvbG9yc3BhY2UgY3M7CisKKyAgICBjcyA9IFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihidWYtPmJ1Zi50eXBlKSA/CisgICAgICAgIGJ1Zi0+Y29udGV4dC0+Zm9ybWF0LmZtdC5waXhfbXAuY29sb3JzcGFjZSA6CisgICAgICAgIGJ1Zi0+Y29udGV4dC0+Zm9ybWF0LmZtdC5waXguY29sb3JzcGFjZTsKKworICAgIHljYmNyID0gVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGJ1Zi0+YnVmLnR5cGUpID8KKyAgICAgICAgYnVmLT5jb250ZXh0LT5mb3JtYXQuZm10LnBpeF9tcC55Y2Jjcl9lbmM6CisgICAgICAgIGJ1Zi0+Y29udGV4dC0+Zm9ybWF0LmZtdC5waXgueWNiY3JfZW5jOworCisgICAgc3dpdGNoKGNzKSB7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjogcmV0dXJuIEFWQ09MX1NQQ19SR0I7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfUkVDNzA5OiByZXR1cm4gQVZDT0xfU1BDX0JUNzA5OworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTTogcmV0dXJuIEFWQ09MX1NQQ19GQ0M7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRzogcmV0dXJuIEFWQ09MX1NQQ19CVDQ3MEJHOworICAgIGNhc2UgVjRMMl9DT0xPUlNQQUNFX1NNUFRFMTcwTTogcmV0dXJuIEFWQ09MX1NQQ19TTVBURTE3ME07CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUyNDBNOiByZXR1cm4gQVZDT0xfU1BDX1NNUFRFMjQwTTsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9CVDIwMjA6CisgICAgICAgIGlmICh5Y2JjciA9PSBWNEwyX1lDQkNSX0VOQ19CVDIwMjBfQ09OU1RfTFVNKQorICAgICAgICAgICAgcmV0dXJuIEFWQ09MX1NQQ19CVDIwMjBfQ0w7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICByZXR1cm4gQVZDT0xfU1BDX0JUMjAyMF9OQ0w7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEFWQ09MX1NQQ19VTlNQRUNJRklFRDsKK30KKworc3RhdGljIGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgdjRsMl9nZXRfY29sb3JfdHJjKFY0TDJCdWZmZXIgKmJ1ZikKK3sKKyAgICBlbnVtIHY0bDJfeWNiY3JfZW5jb2RpbmcgeWNiY3I7CisgICAgZW51bSB2NGwyX3hmZXJfZnVuYyB4ZmVyOworICAgIGVudW0gdjRsMl9jb2xvcnNwYWNlIGNzOworCisgICAgY3MgPSBWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoYnVmLT5idWYudHlwZSkgPworICAgICAgICBidWYtPmNvbnRleHQtPmZvcm1hdC5mbXQucGl4X21wLmNvbG9yc3BhY2UgOgorICAgICAgICBidWYtPmNvbnRleHQtPmZvcm1hdC5mbXQucGl4LmNvbG9yc3BhY2U7CisKKyAgICB5Y2JjciA9IFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihidWYtPmJ1Zi50eXBlKSA/CisgICAgICAgIGJ1Zi0+Y29udGV4dC0+Zm9ybWF0LmZtdC5waXhfbXAueWNiY3JfZW5jOgorICAgICAgICBidWYtPmNvbnRleHQtPmZvcm1hdC5mbXQucGl4LnljYmNyX2VuYzsKKworICAgIHhmZXIgPSBWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoYnVmLT5idWYudHlwZSkgPworICAgICAgICBidWYtPmNvbnRleHQtPmZvcm1hdC5mbXQucGl4X21wLnhmZXJfZnVuYzoKKyAgICAgICAgYnVmLT5jb250ZXh0LT5mb3JtYXQuZm10LnBpeC54ZmVyX2Z1bmM7CisKKyAgICBzd2l0Y2ggKHhmZXIpIHsKKyAgICBjYXNlIFY0TDJfWEZFUl9GVU5DXzcwOTogcmV0dXJuIEFWQ09MX1RSQ19CVDcwOTsKKyAgICBjYXNlIFY0TDJfWEZFUl9GVU5DX1NSR0I6IHJldHVybiBBVkNPTF9UUkNfSUVDNjE5NjZfMl8xOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoY3MpIHsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX006IHJldHVybiBBVkNPTF9UUkNfR0FNTUEyMjsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV80NzBfU1lTVEVNX0JHOiByZXR1cm4gQVZDT0xfVFJDX0dBTU1BMjg7CisgICAgY2FzZSBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNOiByZXR1cm4gQVZDT0xfVFJDX1NNUFRFMTcwTTsKKyAgICBjYXNlIFY0TDJfQ09MT1JTUEFDRV9TTVBURTI0ME06IHJldHVybiBBVkNPTF9UUkNfU01QVEUyNDBNOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAoeWNiY3IpIHsKKyAgICBjYXNlIFY0TDJfWUNCQ1JfRU5DX1hWNzA5OgorICAgIGNhc2UgVjRMMl9ZQ0JDUl9FTkNfWFY2MDE6IHJldHVybiBBVkNPTF9UUkNfQlQxMzYxX0VDRzsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEOworfQorCitzdGF0aWMgdm9pZCB2NGwyX2ZyZWVfYnVmZmVyKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqdW51c2VkKQoreworICAgIFY0TDJCdWZmZXIqIGF2YnVmID0gb3BhcXVlOworICAgIFY0TDJtMm1Db250ZXh0ICpzID0gYnVmX3RvX20ybWN0eChhdmJ1Zik7CisKKyAgICBpZiAoYXRvbWljX2ZldGNoX3N1YigmYXZidWYtPmNvbnRleHRfcmVmY291bnQsIDEpID09IDEpIHsKKyAgICAgICAgYXRvbWljX2ZldGNoX3N1Yl9leHBsaWNpdCgmcy0+cmVmY291bnQsIDEsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKTsKKworICAgICAgICBpZiAocy0+cmVpbml0KSB7CisgICAgICAgICAgICBpZiAoIWF0b21pY19sb2FkKCZzLT5yZWZjb3VudCkpCisgICAgICAgICAgICAgICAgc2VtX3Bvc3QoJnMtPnJlZnN5bmMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHMtPmRyYWluaW5nKSB7CisgICAgICAgICAgICAgICAgLyogbm8gbmVlZCB0byBxdWV1ZSBtb3JlIGJ1ZmZlcnMgdG8gdGhlIGRyaXZlciAqLworICAgICAgICAgICAgICAgIGF2YnVmLT5zdGF0dXMgPSBWNEwyQlVGX0FWQUlMQUJMRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGF2YnVmLT5jb250ZXh0LT5zdHJlYW1vbikKKyAgICAgICAgICAgICAgICBmZl92NGwyX2J1ZmZlcl9lbnF1ZXVlKGF2YnVmKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmYXZidWYtPmNvbnRleHRfcmVmKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdjRsMl9idWZfdG9fYnVmcmVmKFY0TDJCdWZmZXIgKmluLCBpbnQgcGxhbmUsIEFWQnVmZmVyUmVmICoqYnVmKQoreworICAgIFY0TDJtMm1Db250ZXh0ICpzID0gYnVmX3RvX20ybWN0eChpbik7CisKKyAgICBpZiAocGxhbmUgPj0gaW4tPm51bV9wbGFuZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAvKiBldmVuIHRob3VnaCBtb3N0IGVuY29kZXJzIHJldHVybiAwIGluIGRhdGFfb2Zmc2V0IGVuY29kaW5nIHZwOCBkb2VzIHJlcXVpcmUgdGhpcyB2YWx1ZSAqLworICAgICpidWYgPSBhdl9idWZmZXJfY3JlYXRlKChjaGFyICopaW4tPnBsYW5lX2luZm9bcGxhbmVdLm1tX2FkZHIgKyBpbi0+cGxhbmVzW3BsYW5lXS5kYXRhX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+cGxhbmVfaW5mb1twbGFuZV0ubGVuZ3RoLCB2NGwyX2ZyZWVfYnVmZmVyLCBpbiwgMCk7CisgICAgaWYgKCEqYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGluLT5jb250ZXh0X3JlZikKKyAgICAgICAgYXRvbWljX2ZldGNoX2FkZCgmaW4tPmNvbnRleHRfcmVmY291bnQsIDEpOworICAgIGVsc2UgeworICAgICAgICBpbi0+Y29udGV4dF9yZWYgPSBhdl9idWZmZXJfcmVmKHMtPnNlbGZfcmVmKTsKKyAgICAgICAgaWYgKCFpbi0+Y29udGV4dF9yZWYpIHsKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZihidWYpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBpbi0+Y29udGV4dF9yZWZjb3VudCA9IDE7CisgICAgfQorCisgICAgaW4tPnN0YXR1cyA9IFY0TDJCVUZfUkVUX1VTRVI7CisgICAgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgmcy0+cmVmY291bnQsIDEsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bDJfYnVmcmVmX3RvX2J1ZihWNEwyQnVmZmVyICpvdXQsIGludCBwbGFuZSwgY29uc3QgdWludDhfdCogZGF0YSwgaW50IHNpemUsIEFWQnVmZmVyUmVmKiBicmVmKQoreworICAgIHVuc2lnbmVkIGludCBieXRlc3VzZWQsIGxlbmd0aDsKKworICAgIGlmIChwbGFuZSA+PSBvdXQtPm51bV9wbGFuZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBieXRlc3VzZWQgPSBGRk1JTihzaXplLCBvdXQtPnBsYW5lX2luZm9bcGxhbmVdLmxlbmd0aCk7CisgICAgbGVuZ3RoID0gb3V0LT5wbGFuZV9pbmZvW3BsYW5lXS5sZW5ndGg7CisKKyAgICBtZW1jcHkob3V0LT5wbGFuZV9pbmZvW3BsYW5lXS5tbV9hZGRyLCBkYXRhLCBGRk1JTihzaXplLCBvdXQtPnBsYW5lX2luZm9bcGxhbmVdLmxlbmd0aCkpOworCisgICAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihvdXQtPmJ1Zi50eXBlKSkgeworICAgICAgICBvdXQtPnBsYW5lc1twbGFuZV0uYnl0ZXN1c2VkID0gYnl0ZXN1c2VkOworICAgICAgICBvdXQtPnBsYW5lc1twbGFuZV0ubGVuZ3RoID0gbGVuZ3RoOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dC0+YnVmLmJ5dGVzdXNlZCA9IGJ5dGVzdXNlZDsKKyAgICAgICAgb3V0LT5idWYubGVuZ3RoID0gbGVuZ3RoOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICAgICAgICAgIFY0TDJ1ZmZlciBpbnRlcmZhY2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbnQgZmZfdjRsMl9idWZmZXJfYXZmcmFtZV90b19idWYoY29uc3QgQVZGcmFtZSAqZnJhbWUsIFY0TDJCdWZmZXIqIG91dCkKK3sKKyAgICBpbnQgaSwgcmV0OworCisgICAgZm9yKGkgPSAwOyBpIDwgb3V0LT5udW1fcGxhbmVzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gdjRsMl9idWZyZWZfdG9fYnVmKG91dCwgaSwgZnJhbWUtPmJ1ZltpXS0+ZGF0YSwgZnJhbWUtPmJ1ZltpXS0+c2l6ZSwgZnJhbWUtPmJ1ZltpXSk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHY0bDJfc2V0X3B0cyhvdXQsIGZyYW1lLT5wdHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92NGwyX2J1ZmZlcl9idWZfdG9fYXZmcmFtZShBVkZyYW1lICpmcmFtZSwgVjRMMkJ1ZmZlciAqYXZidWYpCit7CisgICAgVjRMMm0ybUNvbnRleHQgKnMgPSBidWZfdG9fbTJtY3R4KGF2YnVmKTsKKyAgICBpbnQgaSwgcmV0OworCisgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworCisgICAgLyogMS4gZ2V0IHJlZmVyZW5jZXMgdG8gdGhlIGFjdHVhbCBkYXRhICovCisgICAgZm9yIChpID0gMDsgaSA8IGF2YnVmLT5udW1fcGxhbmVzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gdjRsMl9idWZfdG9fYnVmcmVmKGF2YnVmLCBpLCAmZnJhbWUtPmJ1ZltpXSk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGZyYW1lLT5saW5lc2l6ZVtpXSA9IGF2YnVmLT5wbGFuZV9pbmZvW2ldLmJ5dGVzcGVybGluZTsKKyAgICAgICAgZnJhbWUtPmRhdGFbaV0gPSBmcmFtZS0+YnVmW2ldLT5kYXRhOworICAgIH0KKworICAgIC8qIDEuMSBmaXh1cCBzcGVjaWFsIGNhc2VzICovCisgICAgc3dpdGNoIChhdmJ1Zi0+Y29udGV4dC0+YXZfcGl4X2ZtdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICBpZiAoYXZidWYtPm51bV9wbGFuZXMgPiAxKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZyYW1lLT5saW5lc2l6ZVsxXSA9IGF2YnVmLT5wbGFuZV9pbmZvWzBdLmJ5dGVzcGVybGluZTsKKyAgICAgICAgZnJhbWUtPmRhdGFbMV0gPSBmcmFtZS0+YnVmWzBdLT5kYXRhICsgYXZidWYtPnBsYW5lX2luZm9bMF0uYnl0ZXNwZXJsaW5lICogYXZidWYtPmNvbnRleHQtPmZvcm1hdC5mbXQucGl4X21wLmhlaWdodDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogMi4gZ2V0IGZyYW1lIGluZm9ybWF0aW9uICovCisgICAgZnJhbWUtPmtleV9mcmFtZSA9ICEhKGF2YnVmLT5idWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FKTsKKyAgICBmcmFtZS0+Zm9ybWF0ID0gYXZidWYtPmNvbnRleHQtPmF2X3BpeF9mbXQ7CisgICAgZnJhbWUtPmNvbG9yX3ByaW1hcmllcyA9IHY0bDJfZ2V0X2NvbG9yX3ByaW1hcmllcyhhdmJ1Zik7CisgICAgZnJhbWUtPmNvbG9yc3BhY2UgPSB2NGwyX2dldF9jb2xvcl9zcGFjZShhdmJ1Zik7CisgICAgZnJhbWUtPmNvbG9yX3JhbmdlID0gdjRsMl9nZXRfY29sb3JfcmFuZ2UoYXZidWYpOworICAgIGZyYW1lLT5jb2xvcl90cmMgPSB2NGwyX2dldF9jb2xvcl90cmMoYXZidWYpOworICAgIGZyYW1lLT5wdHMgPSB2NGwyX2dldF9wdHMoYXZidWYpOworCisgICAgLyogdGhlc2UgdHdvIHZhbHVlcyBhcmUgdXBkYXRlZCBhbHNvIGR1cmluZyByZS1pbml0IGluIHY0bDJfcHJvY2Vzc19kcml2ZXJfZXZlbnQgKi8KKyAgICBmcmFtZS0+aGVpZ2h0ID0gcy0+b3V0cHV0LmhlaWdodDsKKyAgICBmcmFtZS0+d2lkdGggPSBzLT5vdXRwdXQud2lkdGg7CisKKyAgICAvKiAzLiByZXBvcnQgZXJyb3JzIHVwc3RyZWFtICovCisgICAgaWYgKGF2YnVmLT5idWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0VSUk9SKSB7CisgICAgICAgIGF2X2xvZyhsb2dnZXIoYXZidWYpLCBBVl9MT0dfRVJST1IsICIlczogZHJpdmVyIGRlY29kZSBlcnJvclxuIiwgYXZidWYtPmNvbnRleHQtPm5hbWUpOworICAgICAgICBmcmFtZS0+ZGVjb2RlX2Vycm9yX2ZsYWdzIHw9IEZGX0RFQ09ERV9FUlJPUl9JTlZBTElEX0JJVFNUUkVBTTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3Y0bDJfYnVmZmVyX2J1Zl90b19hdnBrdChBVlBhY2tldCAqcGt0LCBWNEwyQnVmZmVyICphdmJ1ZikKK3sKKyAgICBpbnQgcmV0OworCisgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgcmV0ID0gdjRsMl9idWZfdG9fYnVmcmVmKGF2YnVmLCAwLCAmcGt0LT5idWYpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPnNpemUgPSBWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoYXZidWYtPmJ1Zi50eXBlKSA/IGF2YnVmLT5idWYubS5wbGFuZXNbMF0uYnl0ZXN1c2VkIDogYXZidWYtPmJ1Zi5ieXRlc3VzZWQ7CisgICAgcGt0LT5kYXRhID0gcGt0LT5idWYtPmRhdGE7CisKKyAgICBpZiAoYXZidWYtPmJ1Zi5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUUpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgaWYgKGF2YnVmLT5idWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0VSUk9SKSB7CisgICAgICAgIGF2X2xvZyhsb2dnZXIoYXZidWYpLCBBVl9MT0dfRVJST1IsICIlcyBkcml2ZXIgZW5jb2RlIGVycm9yXG4iLCBhdmJ1Zi0+Y29udGV4dC0+bmFtZSk7CisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfQ09SUlVQVDsKKyAgICB9CisKKyAgICBwa3QtPmR0cyA9IHBrdC0+cHRzID0gdjRsMl9nZXRfcHRzKGF2YnVmKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfdjRsMl9idWZmZXJfYXZwa3RfdG9fYnVmKGNvbnN0IEFWUGFja2V0ICpwa3QsIFY0TDJCdWZmZXIgKm91dCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gdjRsMl9idWZyZWZfdG9fYnVmKG91dCwgMCwgcGt0LT5kYXRhLCBwa3QtPnNpemUsIHBrdC0+YnVmKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgdjRsMl9zZXRfcHRzKG91dCwgcGt0LT5wdHMpOworCisgICAgaWYgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpCisgICAgICAgIG91dC0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92NGwyX2J1ZmZlcl9pbml0aWFsaXplKFY0TDJCdWZmZXIqIGF2YnVmLCBpbnQgaW5kZXgpCit7CisgICAgVjRMMkNvbnRleHQgKmN0eCA9IGF2YnVmLT5jb250ZXh0OworICAgIGludCByZXQsIGk7CisKKyAgICBhdmJ1Zi0+YnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgYXZidWYtPmJ1Zi50eXBlID0gY3R4LT50eXBlOworICAgIGF2YnVmLT5idWYuaW5kZXggPSBpbmRleDsKKworICAgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoY3R4LT50eXBlKSkgeworICAgICAgICBhdmJ1Zi0+YnVmLmxlbmd0aCA9IFZJREVPX01BWF9QTEFORVM7CisgICAgICAgIGF2YnVmLT5idWYubS5wbGFuZXMgPSBhdmJ1Zi0+cGxhbmVzOworICAgIH0KKworICAgIHJldCA9IGlvY3RsKGJ1Zl90b19tMm1jdHgoYXZidWYpLT5mZCwgVklESU9DX1FVRVJZQlVGLCAmYXZidWYtPmJ1Zik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKGVycm5vKTsKKworICAgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoY3R4LT50eXBlKSkgeworICAgICAgICBhdmJ1Zi0+bnVtX3BsYW5lcyA9IDA7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIC8qIGluIE1QLCB0aGUgVjRMMiBBUEkgc3RhdGVzIHRoYXQgYnVmLmxlbmd0aCBtZWFucyBudW1fcGxhbmVzICovCisgICAgICAgICAgICBpZiAoYXZidWYtPm51bV9wbGFuZXMgPj0gYXZidWYtPmJ1Zi5sZW5ndGgpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoYXZidWYtPmJ1Zi5tLnBsYW5lc1thdmJ1Zi0+bnVtX3BsYW5lc10ubGVuZ3RoKQorICAgICAgICAgICAgICAgIGF2YnVmLT5udW1fcGxhbmVzKys7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgYXZidWYtPm51bV9wbGFuZXMgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IGF2YnVmLT5udW1fcGxhbmVzOyBpKyspIHsKKworICAgICAgICBhdmJ1Zi0+cGxhbmVfaW5mb1tpXS5ieXRlc3BlcmxpbmUgPSBWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoY3R4LT50eXBlKSA/CisgICAgICAgICAgICBjdHgtPmZvcm1hdC5mbXQucGl4X21wLnBsYW5lX2ZtdFtpXS5ieXRlc3BlcmxpbmUgOgorICAgICAgICAgICAgY3R4LT5mb3JtYXQuZm10LnBpeC5ieXRlc3BlcmxpbmU7CisKKyAgICAgICAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihjdHgtPnR5cGUpKSB7CisgICAgICAgICAgICBhdmJ1Zi0+cGxhbmVfaW5mb1tpXS5sZW5ndGggPSBhdmJ1Zi0+YnVmLm0ucGxhbmVzW2ldLmxlbmd0aDsKKyAgICAgICAgICAgIGF2YnVmLT5wbGFuZV9pbmZvW2ldLm1tX2FkZHIgPSBtbWFwKE5VTEwsIGF2YnVmLT5idWYubS5wbGFuZXNbaV0ubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3RvX20ybWN0eChhdmJ1ZiktPmZkLCBhdmJ1Zi0+YnVmLm0ucGxhbmVzW2ldLm0ubWVtX29mZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdmJ1Zi0+cGxhbmVfaW5mb1tpXS5sZW5ndGggPSBhdmJ1Zi0+YnVmLmxlbmd0aDsKKyAgICAgICAgICAgIGF2YnVmLT5wbGFuZV9pbmZvW2ldLm1tX2FkZHIgPSBtbWFwKE5VTEwsIGF2YnVmLT5idWYubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl90b19tMm1jdHgoYXZidWYpLT5mZCwgYXZidWYtPmJ1Zi5tLm9mZnNldCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXZidWYtPnBsYW5lX2luZm9baV0ubW1fYWRkciA9PSBNQVBfRkFJTEVEKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdmJ1Zi0+c3RhdHVzID0gVjRMMkJVRl9BVkFJTEFCTEU7CisKKyAgICBpZiAoVjRMMl9UWVBFX0lTX09VVFBVVChjdHgtPnR5cGUpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChWNEwyX1RZUEVfSVNfTVVMVElQTEFOQVIoY3R4LT50eXBlKSkgeworICAgICAgICBhdmJ1Zi0+YnVmLm0ucGxhbmVzID0gYXZidWYtPnBsYW5lczsKKyAgICAgICAgYXZidWYtPmJ1Zi5sZW5ndGggICA9IGF2YnVmLT5udW1fcGxhbmVzOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZidWYtPmJ1Zi5ieXRlc3VzZWQgPSBhdmJ1Zi0+cGxhbmVzWzBdLmJ5dGVzdXNlZDsKKyAgICAgICAgYXZidWYtPmJ1Zi5sZW5ndGggICAgPSBhdmJ1Zi0+cGxhbmVzWzBdLmxlbmd0aDsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfdjRsMl9idWZmZXJfZW5xdWV1ZShhdmJ1Zik7Cit9CisKK2ludCBmZl92NGwyX2J1ZmZlcl9lbnF1ZXVlKFY0TDJCdWZmZXIqIGF2YnVmKQoreworICAgIGludCByZXQ7CisKKyAgICBhdmJ1Zi0+YnVmLmZsYWdzID0gYXZidWYtPmZsYWdzOworCisgICAgcmV0ID0gaW9jdGwoYnVmX3RvX20ybWN0eChhdmJ1ZiktPmZkLCBWSURJT0NfUUJVRiwgJmF2YnVmLT5idWYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CisKKyAgICBhdmJ1Zi0+c3RhdHVzID0gVjRMMkJVRl9JTl9EUklWRVI7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdjRsMl9idWZmZXJzLmggYi9saWJhdmNvZGVjL3Y0bDJfYnVmZmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNWNjOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Y0bDJfYnVmZmVycy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogVjRMMiBidWZmZXIgaGVscGVyIGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQWxleGlzIEJhbGxpZXIgPGFiYWxsaWVyQGdlbnRvby5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgSm9yZ2UgUmFtaXJleiA8am9yZ2UucmFtaXJlei1vcnRpekBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVjRMMl9CVUZGRVJTX0gKKyNkZWZpbmUgQVZDT0RFQ19WNEwyX0JVRkZFUlNfSAorCisjaW5jbHVkZSA8c3RkYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK2VudW0gVjRMMkJ1ZmZlcl9zdGF0dXMgeworICAgIFY0TDJCVUZfQVZBSUxBQkxFLAorICAgIFY0TDJCVUZfSU5fRFJJVkVSLAorICAgIFY0TDJCVUZfUkVUX1VTRVIsCit9OworCisvKioKKyAqIFY0TDJCdWZmZXIgKHdyYXBwZXIgZm9yIHY0bDJfYnVmZmVyIG1hbmFnZW1lbnQpCisgKi8KK3R5cGVkZWYgc3RydWN0IFY0TDJCdWZmZXIgeworICAgIC8qIGVhY2ggYnVmZmVyIG5lZWRzIHRvIGhhdmUgYSByZWZlcmVuY2UgdG8gaXRzIGNvbnRleHQgKi8KKyAgICBzdHJ1Y3QgVjRMMkNvbnRleHQgKmNvbnRleHQ7CisKKyAgICAvKiBUaGlzIG9iamVjdCBpcyByZWZjb3VudGVkIHBlci1wbGFuZSwgc28gd2UgbmVlZCB0byBrZWVwIHRyYWNrCisgICAgICogb2YgaG93IG1hbnkgY29udGV4dC1yZWZzIHdlIGFyZSBob2xkaW5nLiAqLworICAgIEFWQnVmZmVyUmVmICpjb250ZXh0X3JlZjsKKyAgICBhdG9taWNfdWludCBjb250ZXh0X3JlZmNvdW50OworCisgICAgLyoga2VlcCB0cmFjayBvZiB0aGUgbW1hcCBhZGRyZXNzIGFuZCBtbWFwIGxlbmd0aCAqLworICAgIHN0cnVjdCBWNEwyUGxhbmVfaW5mbyB7CisgICAgICAgIGludCBieXRlc3BlcmxpbmU7CisgICAgICAgIHZvaWQgKiBtbV9hZGRyOworICAgICAgICBzaXplX3QgbGVuZ3RoOworICAgIH0gcGxhbmVfaW5mb1tWSURFT19NQVhfUExBTkVTXTsKKworICAgIGludCBudW1fcGxhbmVzOworCisgICAgLyogdGhlIHY0bDJfYnVmZmVyIGJ1Zi5tLnBsYW5lcyBwb2ludGVyIHVzZXMgdGhlIHBsYW5lc1tdIG1lbSAqLworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisgICAgc3RydWN0IHY0bDJfcGxhbmUgcGxhbmVzW1ZJREVPX01BWF9QTEFORVNdOworCisgICAgaW50IGZsYWdzOworICAgIGVudW0gVjRMMkJ1ZmZlcl9zdGF0dXMgc3RhdHVzOworCit9IFY0TDJCdWZmZXI7CisKKy8qKgorICogRXh0cmFjdHMgdGhlIGRhdGEgZnJvbSBhIFY0TDJCdWZmZXIgdG8gYW4gQVZGcmFtZQorICoKKyAqIEBwYXJhbVtpbl0gZnJhbWUgVGhlIEFWRlJhbWUgdG8gcHVzaCB0aGUgaW5mb3JtYXRpb24gdG8KKyAqIEBwYXJhbVtpbl0gYnVmIFRoZSBWNEwyQnVmZmVyIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbQorICoKKyAqIEByZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBBVkVSUk9SKEVJTlZBTCkgaWYgdGhlIG51bWJlciBvZiBwbGFuZXMgaXMgaW5jb3JyZWN0LAorICogQVZFUlJPUihFTk9NRU0pIGlmIHRoZSBBVkJ1ZmZlclJlZiBjYW50IGJlIGNyZWF0ZWQuCisgKi8KK2ludCBmZl92NGwyX2J1ZmZlcl9idWZfdG9fYXZmcmFtZShBVkZyYW1lICpmcmFtZSwgVjRMMkJ1ZmZlciAqYnVmKTsKKworLyoqCisgKiBFeHRyYWN0cyB0aGUgZGF0YSBmcm9tIGEgVjRMMkJ1ZmZlciB0byBhbiBBVlBhY2tldAorICoKKyAqIEBwYXJhbVtpbl0gcGt0IFRoZSBBVlBhY2tldCB0byBwdXNoIHRoZSBpbmZvcm1hdGlvbiB0bworICogQHBhcmFtW2luXSBidWYgVGhlIFY0TDJCdWZmZXIgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tCisgKgorICogQHJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIEFWRVJST1IoRUlOVkFMKSBpZiB0aGUgbnVtYmVyIG9mIHBsYW5lcyBpcyBpbmNvcnJlY3QsCisgKiBBVkVSUk9SKEVOT01FTSkgaWYgdGhlIEFWQnVmZmVyUmVmIGNhbnQgYmUgY3JlYXRlZC4KKyAqCisgKi8KK2ludCBmZl92NGwyX2J1ZmZlcl9idWZfdG9fYXZwa3QoQVZQYWNrZXQgKnBrdCwgVjRMMkJ1ZmZlciAqYnVmKTsKKworLyoqCisgKiBFeHRyYWN0cyB0aGUgZGF0YSBmcm9tIGFuIEFWUGFja2V0IHRvIGEgVjRMMkJ1ZmZlcgorICoKKyAqIEBwYXJhbVtpbl0gIGZyYW1lIEFWUGFja2V0IHRvIGdldCB0aGUgZGF0YSBmcm9tCisgKiBAcGFyYW1baW5dICBhdmJ1ZiBWNEwyQmZ1ZmZlciB0byBwdXNoIHRoZSBpbmZvcm1hdGlvbiB0bworICoKKyAqIEByZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvdGhlcndpc2UKKyAqLworaW50IGZmX3Y0bDJfYnVmZmVyX2F2cGt0X3RvX2J1Zihjb25zdCBBVlBhY2tldCAqcGt0LCBWNEwyQnVmZmVyICpvdXQpOworCisvKioKKyAqIEV4dHJhY3RzIHRoZSBkYXRhIGZyb20gYW4gQVZGcmFtZSB0byBhIFY0TDJCdWZmZXIKKyAqCisgKiBAcGFyYW1baW5dICBmcmFtZSBBVkZyYW1lIHRvIGdldCB0aGUgZGF0YSBmcm9tCisgKiBAcGFyYW1baW5dICBhdmJ1ZiBWNEwyQmZ1ZmZlciB0byBwdXNoIHRoZSBpbmZvcm1hdGlvbiB0bworICoKKyAqIEByZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvdGhlcndpc2UKKyAqLworaW50IGZmX3Y0bDJfYnVmZmVyX2F2ZnJhbWVfdG9fYnVmKGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBWNEwyQnVmZmVyKiBvdXQpOworCisvKioKKyAqIEluaXRpYWxpemVzIGEgVjRMMkJ1ZmZlcgorICoKKyAqIEBwYXJhbVtpbl0gIGF2YnVmIFY0TDJCZnVmZmVyIHRvIGluaXRpYWxpemUKKyAqIEBwYXJhbVtpbl0gIGluZGV4IHY0bDIgYnVmZmVyIGlkCisgKgorICogQHJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG90aGVyd2lzZQorICovCitpbnQgZmZfdjRsMl9idWZmZXJfaW5pdGlhbGl6ZShWNEwyQnVmZmVyKiBhdmJ1ZiwgaW50IGluZGV4KTsKKworLyoqCisgKiBFbnF1ZXVlcyBhIFY0TDJCdWZmZXIKKyAqCisgKiBAcGFyYW1baW5dIGF2YnVmIFY0TDJCZnVmZmVyIHRvIHB1c2ggdG8gdGhlIGRyaXZlcgorICoKKyAqIEByZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvdGhlcndpc2UKKyAqLworaW50IGZmX3Y0bDJfYnVmZmVyX2VucXVldWUoVjRMMkJ1ZmZlciogYXZidWYpOworCisKKyNlbmRpZiAvLyBBVkNPREVDX1Y0TDJfQlVGRkVSU19ICmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Y0bDJfY29udGV4dC5jIGIvbGliYXZjb2RlYy92NGwyX2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNiMDQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92NGwyX2NvbnRleHQuYwpAQCAtMCwwICsxLDcxMCBAQAorLyoKKyAqIFY0TDIgY29udGV4dCBoZWxwZXIgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBKb3JnZSBSYW1pcmV6IDxqb3JnZS5yYW1pcmV6LW9ydGl6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8cG9sbC5oPgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2NGwyX2J1ZmZlcnMuaCIKKyNpbmNsdWRlICJ2NGwyX2ZtdC5oIgorI2luY2x1ZGUgInY0bDJfbTJtLmgiCisKK3N0cnVjdCB2NGwyX2Zvcm1hdF91cGRhdGUgeworICAgIHVpbnQzMl90IHY0bDJfZm10OworICAgIGludCB1cGRhdGVfdjRsMjsKKworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBhdl9mbXQ7CisgICAgaW50IHVwZGF0ZV9hdmZtdDsKK307CisKK3N0YXRpYyBpbmxpbmUgVjRMMm0ybUNvbnRleHQgKmN0eF90b19tMm1jdHgoVjRMMkNvbnRleHQgKmN0eCkKK3sKKyAgICByZXR1cm4gVjRMMl9UWVBFX0lTX09VVFBVVChjdHgtPnR5cGUpID8KKyAgICAgICAgY29udGFpbmVyX29mKGN0eCwgVjRMMm0ybUNvbnRleHQsIG91dHB1dCkgOgorICAgICAgICBjb250YWluZXJfb2YoY3R4LCBWNEwybTJtQ29udGV4dCwgY2FwdHVyZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgQVZDb2RlY0NvbnRleHQgKmxvZ2dlcihWNEwyQ29udGV4dCAqY3R4KQoreworICAgIHJldHVybiBjdHhfdG9fbTJtY3R4KGN0eCktPmF2Y3R4OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2NGwyX2dldF93aWR0aChzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKyAgICByZXR1cm4gVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGZtdC0+dHlwZSkgPyBmbXQtPmZtdC5waXhfbXAud2lkdGggOiBmbXQtPmZtdC5waXgud2lkdGg7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHY0bDJfZ2V0X2hlaWdodChzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKyAgICByZXR1cm4gVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGZtdC0+dHlwZSkgPyBmbXQtPmZtdC5waXhfbXAuaGVpZ2h0IDogZm10LT5mbXQucGl4LmhlaWdodDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgdjRsMl9yZXNvbHV0aW9uX2NoYW5nZWQoVjRMMkNvbnRleHQgKmN0eCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQyKQoreworICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10MSA9ICZjdHgtPmZvcm1hdDsKKyAgICBpbnQgcmV0ID0gIFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihjdHgtPnR5cGUpID8KKyAgICAgICAgZm10MS0+Zm10LnBpeF9tcC53aWR0aCAhPSBmbXQyLT5mbXQucGl4X21wLndpZHRoIHx8CisgICAgICAgIGZtdDEtPmZtdC5waXhfbXAuaGVpZ2h0ICE9IGZtdDItPmZtdC5waXhfbXAuaGVpZ2h0CisgICAgICAgIDoKKyAgICAgICAgZm10MS0+Zm10LnBpeC53aWR0aCAhPSBmbXQyLT5mbXQucGl4LndpZHRoIHx8CisgICAgICAgIGZtdDEtPmZtdC5waXguaGVpZ2h0ICE9IGZtdDItPmZtdC5waXguaGVpZ2h0OworCisgICAgaWYgKHJldCkKKyAgICAgICAgYXZfbG9nKGxvZ2dlcihjdHgpLCBBVl9MT0dfREVCVUcsICIlcyBjaGFuZ2VkICglZHglZCkgLT4gKCVkeCVkKVxuIiwKKyAgICAgICAgICAgIGN0eC0+bmFtZSwKKyAgICAgICAgICAgIHY0bDJfZ2V0X3dpZHRoKGZtdDEpLCB2NGwyX2dldF9oZWlnaHQoZm10MSksCisgICAgICAgICAgICB2NGwyX2dldF93aWR0aChmbXQyKSwgdjRsMl9nZXRfaGVpZ2h0KGZtdDIpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHY0bDJfdHlwZV9zdXBwb3J0ZWQoVjRMMkNvbnRleHQgKmN0eCkKK3sKKyAgICByZXR1cm4gY3R4LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgfHwKKyAgICAgICAgY3R4LT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSB8fAorICAgICAgICBjdHgtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFIHx8CisgICAgICAgIGN0eC0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdjRsMl9nZXRfZnJhbWVzaXplX2NvbXByZXNzZWQoVjRMMkNvbnRleHQqIGN0eCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIFY0TDJtMm1Db250ZXh0ICpzID0gY3R4X3RvX20ybWN0eChjdHgpOworICAgIGNvbnN0IGludCBTWl80SyA9IDB4MTAwMDsKKyAgICBpbnQgc2l6ZTsKKworICAgIGlmIChhdl9jb2RlY19pc19kZWNvZGVyKHMtPmF2Y3R4LT5jb2RlYykpCisgICAgICAgIHJldHVybiAoKHdpZHRoICogaGVpZ2h0ICogMyAvIDIpIC8gMikgKyAxMjg7CisKKyAgICAvKiBlbmNvZGVyICovCisgICAgc2l6ZSA9IEZGQUxJR04oaGVpZ2h0LCAzMikgKiBGRkFMSUdOKHdpZHRoLCAzMikgKiAzIC8gMiAvIDI7CisgICAgcmV0dXJuIEZGQUxJR04oc2l6ZSwgU1pfNEspOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdjRsMl9zYXZlX3RvX2NvbnRleHQoVjRMMkNvbnRleHQqIGN0eCwgc3RydWN0IHY0bDJfZm9ybWF0X3VwZGF0ZSAqZm10KQoreworICAgIGN0eC0+Zm9ybWF0LnR5cGUgPSBjdHgtPnR5cGU7CisKKyAgICBpZiAoZm10LT51cGRhdGVfYXZmbXQpCisgICAgICAgIGN0eC0+YXZfcGl4X2ZtdCA9IGZtdC0+YXZfZm10OworCisgICAgaWYgKFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihjdHgtPnR5cGUpKSB7CisgICAgICAgIC8qIHVwZGF0ZSB0aGUgc2l6ZXMgdG8gaGFuZGxlIHRoZSByZWNvbmZpZ3VyYXRpb24gb2YgdGhlIGNhcHR1cmUgc3RyZWFtIGF0IHJ1bnRpbWUgKi8KKyAgICAgICAgY3R4LT5mb3JtYXQuZm10LnBpeF9tcC5oZWlnaHQgPSBjdHgtPmhlaWdodDsKKyAgICAgICAgY3R4LT5mb3JtYXQuZm10LnBpeF9tcC53aWR0aCA9IGN0eC0+d2lkdGg7CisgICAgICAgIGlmIChmbXQtPnVwZGF0ZV92NGwyKSB7CisgICAgICAgICAgICBjdHgtPmZvcm1hdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0ID0gZm10LT52NGwyX2ZtdDsKKworICAgICAgICAgICAgLyogczVwLW1mYyByZXF1aXJlcyB0aGUgdXNlciB0byBzcGVjaWZ5IGEgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgICAgIGN0eC0+Zm9ybWF0LmZtdC5waXhfbXAucGxhbmVfZm10WzBdLnNpemVpbWFnZSA9CisgICAgICAgICAgICAgICAgdjRsMl9nZXRfZnJhbWVzaXplX2NvbXByZXNzZWQoY3R4LCBjdHgtPndpZHRoLCBjdHgtPmhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPmZvcm1hdC5mbXQucGl4LmhlaWdodCA9IGN0eC0+aGVpZ2h0OworICAgICAgICBjdHgtPmZvcm1hdC5mbXQucGl4LndpZHRoID0gY3R4LT53aWR0aDsKKyAgICAgICAgaWYgKGZtdC0+dXBkYXRlX3Y0bDIpIHsKKyAgICAgICAgICAgIGN0eC0+Zm9ybWF0LmZtdC5waXgucGl4ZWxmb3JtYXQgPSBmbXQtPnY0bDJfZm10OworCisgICAgICAgICAgICAvKiBzNXAtbWZjIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHNwZWNpZnkgYSBidWZmZXIgc2l6ZSAqLworICAgICAgICAgICAgY3R4LT5mb3JtYXQuZm10LnBpeC5zaXplaW1hZ2UgPQorICAgICAgICAgICAgICAgIHY0bDJfZ2V0X2ZyYW1lc2l6ZV9jb21wcmVzc2VkKGN0eCwgY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQpOworICAgICAgICB9CisgICAgfQorfQorCisvKioKKyAqIHJldHVybnMgMSBpZiByZWluaXQgd2FzIHN1Y2Nlc3NmdWwsIG5lZ2F0aXZlIGlmIGl0IGZhaWxlZAorICogcmV0dXJucyAwIGlmIHJlaW5pdCB3YXMgbm90IGV4ZWN1dGVkCisgKi8KK3N0YXRpYyBpbnQgdjRsMl9oYW5kbGVfZXZlbnQoVjRMMkNvbnRleHQgKmN0eCkKK3sKKyAgICBWNEwybTJtQ29udGV4dCAqcyA9IGN0eF90b19tMm1jdHgoY3R4KTsKKyAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgY2FwX2ZtdCA9IHMtPmNhcHR1cmUuZm9ybWF0OworICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBvdXRfZm10ID0gcy0+b3V0cHV0LmZvcm1hdDsKKyAgICBzdHJ1Y3QgdjRsMl9ldmVudCBldnQgPSB7IDAgfTsKKyAgICBpbnQgZnVsbF9yZWluaXQsIHJlaW5pdCwgcmV0OworCisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIFZJRElPQ19EUUVWRU5ULCAmZXZ0KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cobG9nZ2VyKGN0eCksIEFWX0xPR19FUlJPUiwgIiVzIFZJRElPQ19EUUVWRU5UXG4iLCBjdHgtPm5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoZXZ0LnR5cGUgIT0gVjRMMl9FVkVOVF9TT1VSQ0VfQ0hBTkdFKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldCA9IGlvY3RsKHMtPmZkLCBWSURJT0NfR19GTVQsICZvdXRfZm10KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX0VSUk9SLCAiJXMgVklESU9DX0dfRk1UXG4iLCBzLT5vdXRwdXQubmFtZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldCA9IGlvY3RsKHMtPmZkLCBWSURJT0NfR19GTVQsICZjYXBfZm10KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX0VSUk9SLCAiJXMgVklESU9DX0dfRk1UXG4iLCBzLT5jYXB0dXJlLm5hbWUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmdWxsX3JlaW5pdCA9IHY0bDJfcmVzb2x1dGlvbl9jaGFuZ2VkKCZzLT5vdXRwdXQsICZvdXRfZm10KTsKKyAgICBpZiAoZnVsbF9yZWluaXQpIHsKKyAgICAgICAgcy0+b3V0cHV0LmhlaWdodCA9IHY0bDJfZ2V0X2hlaWdodCgmb3V0X2ZtdCk7CisgICAgICAgIHMtPm91dHB1dC53aWR0aCA9IHY0bDJfZ2V0X3dpZHRoKCZvdXRfZm10KTsKKyAgICB9CisKKyAgICByZWluaXQgPSB2NGwyX3Jlc29sdXRpb25fY2hhbmdlZCgmcy0+Y2FwdHVyZSwgJmNhcF9mbXQpOworICAgIGlmIChyZWluaXQpIHsKKyAgICAgICAgcy0+Y2FwdHVyZS5oZWlnaHQgPSB2NGwyX2dldF9oZWlnaHQoJmNhcF9mbXQpOworICAgICAgICBzLT5jYXB0dXJlLndpZHRoID0gdjRsMl9nZXRfd2lkdGgoJmNhcF9mbXQpOworICAgIH0KKworICAgIGlmIChmdWxsX3JlaW5pdCB8fCByZWluaXQpCisgICAgICAgIHMtPnJlaW5pdCA9IDE7CisKKyAgICBpZiAoZnVsbF9yZWluaXQpIHsKKyAgICAgICAgcmV0ID0gZmZfdjRsMl9tMm1fY29kZWNfZnVsbF9yZWluaXQocyk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX0VSUk9SLCAidjRsMl9tMm1fY29kZWNfZnVsbF9yZWluaXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICAgICAgZ290byByZWluaXRfcnVuOworICAgIH0KKworICAgIGlmIChyZWluaXQpIHsKKyAgICAgICAgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMocy0+YXZjdHgsIHMtPmNhcHR1cmUud2lkdGgsIHMtPmNhcHR1cmUuaGVpZ2h0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBhdl9sb2cobG9nZ2VyKGN0eCksIEFWX0xPR19XQVJOSU5HLCAidXBkYXRlIGF2Y29kZWMgaGVpZ2h0IGFuZCB3aWR0aFxuIik7CisKKyAgICAgICAgcmV0ID0gZmZfdjRsMl9tMm1fY29kZWNfcmVpbml0KHMpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBhdl9sb2cobG9nZ2VyKGN0eCksIEFWX0xPR19FUlJPUiwgInY0bDJfbTJtX2NvZGVjX3JlaW5pdFxuIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorICAgICAgICBnb3RvIHJlaW5pdF9ydW47CisgICAgfQorCisgICAgLyogZHVtbXkgZXZlbnQgcmVjZWl2ZWQgKi8KKyAgICByZXR1cm4gMDsKKworICAgIC8qIHJlaW5pdCBleGVjdXRlZCAqLworcmVpbml0X3J1bjoKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB2NGwyX3N0b3BfZGVjb2RlKFY0TDJDb250ZXh0ICpjdHgpCit7CisgICAgc3RydWN0IHY0bDJfZGVjb2Rlcl9jbWQgY21kID0geworICAgICAgICAuY21kID0gVjRMMl9ERUNfQ01EX1NUT1AsCisgICAgICAgIC5mbGFncyA9IDAsCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gaW9jdGwoY3R4X3RvX20ybWN0eChjdHgpLT5mZCwgVklESU9DX0RFQ09ERVJfQ01ELCAmY21kKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIC8qIERFQ09ERVJfQ01EIGlzIG9wdGlvbmFsICovCisgICAgICAgIGlmIChlcnJubyA9PSBFTk9UVFkpCisgICAgICAgICAgICByZXR1cm4gZmZfdjRsMl9jb250ZXh0X3NldF9zdGF0dXMoY3R4LCBWSURJT0NfU1RSRUFNT0ZGKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2NGwyX3N0b3BfZW5jb2RlKFY0TDJDb250ZXh0ICpjdHgpCit7CisgICAgc3RydWN0IHY0bDJfZW5jb2Rlcl9jbWQgY21kID0geworICAgICAgICAuY21kID0gVjRMMl9FTkNfQ01EX1NUT1AsCisgICAgICAgIC5mbGFncyA9IDAsCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gaW9jdGwoY3R4X3RvX20ybWN0eChjdHgpLT5mZCwgVklESU9DX0VOQ09ERVJfQ01ELCAmY21kKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIC8qIEVOQ09ERVJfQ01EIGlzIG9wdGlvbmFsICovCisgICAgICAgIGlmIChlcnJubyA9PSBFTk9UVFkpCisgICAgICAgICAgICByZXR1cm4gZmZfdjRsMl9jb250ZXh0X3NldF9zdGF0dXMoY3R4LCBWSURJT0NfU1RSRUFNT0ZGKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIFY0TDJCdWZmZXIqIHY0bDJfZGVxdWV1ZV92NGwyYnVmKFY0TDJDb250ZXh0ICpjdHgsIGludCB0aW1lb3V0KQoreworICAgIHN0cnVjdCB2NGwyX3BsYW5lIHBsYW5lc1tWSURFT19NQVhfUExBTkVTXTsKKyAgICBzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmID0geyAwIH07CisgICAgVjRMMkJ1ZmZlciogYXZidWYgPSBOVUxMOworICAgIHN0cnVjdCBwb2xsZmQgcGZkID0geworICAgICAgICAuZXZlbnRzID0gIFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMUFJJIHwgUE9MTE9VVCB8IFBPTExXUk5PUk0sIC8qIGRlZmF1bHQgYmxvY2tpbmcgY2FwdHVyZSAqLworICAgICAgICAuZmQgPSBjdHhfdG9fbTJtY3R4KGN0eCktPmZkLAorICAgIH07CisgICAgaW50IGksIHJldDsKKworICAgIC8qIGlmIHdlIGFyZSBkcmFpbmluZyBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgY2FwdHVyZSBidWZmZXJzIHF1ZXVlZCBpbiB0aGUgZHJpdmVyIHdlIGFyZSBkb25lICovCisgICAgaWYgKCFWNEwyX1RZUEVfSVNfT1VUUFVUKGN0eC0+dHlwZSkgJiYgY3R4X3RvX20ybWN0eChjdHgpLT5kcmFpbmluZykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5udW1fYnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY3R4LT5idWZmZXJzW2ldLnN0YXR1cyA9PSBWNEwyQlVGX0lOX0RSSVZFUikKKyAgICAgICAgICAgICAgICBnb3RvIHN0YXJ0OworICAgICAgICB9CisgICAgICAgIGN0eC0+ZG9uZSA9IDE7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworc3RhcnQ6CisgICAgaWYgKFY0TDJfVFlQRV9JU19PVVRQVVQoY3R4LT50eXBlKSkKKyAgICAgICAgcGZkLmV2ZW50cyA9ICBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKyAgICBlbHNlIHsKKyAgICAgICAgLyogbm8gbmVlZCB0byBsaXN0ZW4gdG8gcmVxdWVzdHMgZm9yIG1vcmUgaW5wdXQgd2hpbGUgZHJhaW5pbmcgKi8KKyAgICAgICAgaWYgKGN0eF90b19tMm1jdHgoY3R4KS0+ZHJhaW5pbmcpCisgICAgICAgICAgICBwZmQuZXZlbnRzID0gIFBPTExJTiB8IFBPTExSRE5PUk0gfCBQT0xMUFJJOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgcmV0ID0gcG9sbCgmcGZkLCAxLCB0aW1lb3V0KTsKKyAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIDAuIGhhbmRsZSBlcnJvcnMgKi8KKyAgICBpZiAocGZkLnJldmVudHMgJiBQT0xMRVJSKSB7CisgICAgICAgIC8qIGlmIHdlIGFyZSB0cnlpbmcgdG8gZ2V0IGZyZWUgYnVmZmVycyBidXQgbm9uZSBoYXZlIGJlZW4gcXVldWVkIHlldAorICAgICAgICAgICBubyBuZWVkIHRvIHJhaXNlIGEgd2FybmluZyAqLworICAgICAgICBpZiAodGltZW91dCA9PSAwKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5udW1fYnVmZmVyczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGN0eC0+YnVmZmVyc1tpXS5zdGF0dXMgIT0gVjRMMkJVRl9BVkFJTEFCTEUpCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX1dBUk5JTkcsICIlcyBQT0xMRVJSXG4iLCBjdHgtPm5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX1dBUk5JTkcsICIlcyBQT0xMRVJSXG4iLCBjdHgtPm5hbWUpOworCisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIDEuIGhhbmRsZSByZXNvbHV0aW9uIGNoYW5nZXMgKi8KKyAgICBpZiAocGZkLnJldmVudHMgJiBQT0xMUFJJKSB7CisgICAgICAgIHJldCA9IHY0bDJfaGFuZGxlX2V2ZW50KGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAvKiBpZiByZS1pbml0IGZhaWxlZCwgYWJvcnQgKi8KKyAgICAgICAgICAgIGN0eC0+ZG9uZSA9IDE7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAvKiBpZiByZS1pbml0IHdhcyBzdWNjZXNzZnVsIGRyb3AgdGhlIGJ1ZmZlciAoaWYgdGhlcmUgd2FzIG9uZSkKKyAgICAgICAgICAgICAqIHNpbmNlIHdlIGhhZCB0byByZWNvbmZpZ3VyZSBjYXB0dXJlICh1bm1hcCBhbGwgYnVmZmVycykKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiAyLiBkZXF1ZXVlIHRoZSBidWZmZXIgKi8KKyAgICBpZiAocGZkLnJldmVudHMgJiAoUE9MTElOIHwgUE9MTFJETk9STSB8IFBPTExPVVQgfCBQT0xMV1JOT1JNKSkgeworCisgICAgICAgIGlmICghVjRMMl9UWVBFX0lTX09VVFBVVChjdHgtPnR5cGUpKSB7CisgICAgICAgICAgICAvKiB0aGVyZSBpcyBhIGNhcHR1cmUgYnVmZmVyIHJlYWR5ICovCisgICAgICAgICAgICBpZiAocGZkLnJldmVudHMgJiAoUE9MTElOIHwgUE9MTFJETk9STSkpCisgICAgICAgICAgICAgICAgZ290byBkZXF1ZXVlOworCisgICAgICAgICAgICAvKiB0aGUgZHJpdmVyIGlzIHJlYWR5IHRvIGFjY2VwdCBtb3JlIGlucHV0OyBpbnN0ZWFkIG9mIHdhaXRpbmcgZm9yIHRoZSBjYXB0dXJlCisgICAgICAgICAgICAgKiBidWZmZXIgdG8gY29tcGxldGUgd2UgcmV0dXJuIE5VTEwgc28gaW5wdXQgY2FuIHByb2NlZWQgKHdlIGFyZSBzaW5nbGUgdGhyZWFkZWQpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwZmQucmV2ZW50cyAmIChQT0xMT1VUIHwgUE9MTFdSTk9STSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworZGVxdWV1ZToKKyAgICAgICAgbWVtc2V0KCZidWYsIDAsIHNpemVvZihidWYpKTsKKyAgICAgICAgYnVmLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgICAgIGJ1Zi50eXBlID0gY3R4LT50eXBlOworICAgICAgICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGN0eC0+dHlwZSkpIHsKKyAgICAgICAgICAgIG1lbXNldChwbGFuZXMsIDAsIHNpemVvZihwbGFuZXMpKTsKKyAgICAgICAgICAgIGJ1Zi5sZW5ndGggPSBWSURFT19NQVhfUExBTkVTOworICAgICAgICAgICAgYnVmLm0ucGxhbmVzID0gcGxhbmVzOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gaW9jdGwoY3R4X3RvX20ybWN0eChjdHgpLT5mZCwgVklESU9DX0RRQlVGLCAmYnVmKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgaWYgKGVycm5vICE9IEVBR0FJTikgeworICAgICAgICAgICAgICAgIGN0eC0+ZG9uZSA9IDE7CisgICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVQSVBFKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2cobG9nZ2VyKGN0eCksIEFWX0xPR19ERUJVRywgIiVzIFZJRElPQ19EUUJVRiwgZXJybm8gKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bmFtZSwgYXZfZXJyMnN0cihBVkVSUk9SKGVycm5vKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBhdmJ1ZiA9ICZjdHgtPmJ1ZmZlcnNbYnVmLmluZGV4XTsKKyAgICAgICAgYXZidWYtPnN0YXR1cyA9IFY0TDJCVUZfQVZBSUxBQkxFOworICAgICAgICBhdmJ1Zi0+YnVmID0gYnVmOworICAgICAgICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGN0eC0+dHlwZSkpIHsKKyAgICAgICAgICAgIG1lbWNweShhdmJ1Zi0+cGxhbmVzLCBwbGFuZXMsIHNpemVvZihwbGFuZXMpKTsKKyAgICAgICAgICAgIGF2YnVmLT5idWYubS5wbGFuZXMgPSBhdmJ1Zi0+cGxhbmVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdmJ1ZjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIFY0TDJCdWZmZXIqIHY0bDJfZ2V0ZnJlZV92NGwyYnVmKFY0TDJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHRpbWVvdXQgPSAwOyAvKiByZXR1cm4gd2hlbiBubyBtb3JlIGJ1ZmZlcnMgdG8gZGVxdWV1ZSAqLworICAgIGludCBpOworCisgICAgLyogZ2V0IGJhY2sgYXMgbWFueSBvdXRwdXQgYnVmZmVycyBhcyBwb3NzaWJsZSAqLworICAgIGlmIChWNEwyX1RZUEVfSVNfT1VUUFVUKGN0eC0+dHlwZSkpIHsKKyAgICAgICAgICBkbyB7CisgICAgICAgICAgfSB3aGlsZSAodjRsMl9kZXF1ZXVlX3Y0bDJidWYoY3R4LCB0aW1lb3V0KSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bnVtX2J1ZmZlcnM7IGkrKykgeworICAgICAgICBpZiAoY3R4LT5idWZmZXJzW2ldLnN0YXR1cyA9PSBWNEwyQlVGX0FWQUlMQUJMRSkKKyAgICAgICAgICAgIHJldHVybiAmY3R4LT5idWZmZXJzW2ldOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHY0bDJfcmVsZWFzZV9idWZmZXJzKFY0TDJDb250ZXh0KiBjdHgpCit7CisgICAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgcmVxID0geworICAgICAgICAubWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUCwKKyAgICAgICAgLnR5cGUgPSBjdHgtPnR5cGUsCisgICAgICAgIC5jb3VudCA9IDAsIC8qIDAgLT4gdW5tYXBzIGJ1ZmZlcnMgZnJvbSB0aGUgZHJpdmVyICovCisgICAgfTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgVjRMMkJ1ZmZlciAqYnVmZmVyID0gJmN0eC0+YnVmZmVyc1tpXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgYnVmZmVyLT5udW1fcGxhbmVzOyBqKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCBWNEwyUGxhbmVfaW5mbyAqcCA9ICZidWZmZXItPnBsYW5lX2luZm9bal07CisgICAgICAgICAgICBpZiAocC0+bW1fYWRkciAmJiBwLT5sZW5ndGgpCisgICAgICAgICAgICAgICAgaWYgKG11bm1hcChwLT5tbV9hZGRyLCBwLT5sZW5ndGgpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGxvZ2dlcihjdHgpLCBBVl9MT0dfRVJST1IsICIlcyB1bm1hcCBwbGFuZSAoJXMpKVxuIiwgY3R4LT5uYW1lLCBhdl9lcnIyc3RyKEFWRVJST1IoZXJybm8pKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW9jdGwoY3R4X3RvX20ybWN0eChjdHgpLT5mZCwgVklESU9DX1JFUUJVRlMsICZyZXEpOworfQorCitzdGF0aWMgaW5saW5lIGludCB2NGwyX3RyeV9yYXdfZm9ybWF0KFY0TDJDb250ZXh0KiBjdHgsIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXQpCit7CisgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQgPSAmY3R4LT5mb3JtYXQ7CisgICAgdWludDMyX3QgdjRsMl9mbXQ7CisgICAgaW50IHJldDsKKworICAgIHY0bDJfZm10ID0gZmZfdjRsMl9mb3JtYXRfYXZmbXRfdG9fdjRsMihwaXhmbXQpOworICAgIGlmICghdjRsMl9mbXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKGN0eC0+dHlwZSkpCisgICAgICAgIGZtdC0+Zm10LnBpeF9tcC5waXhlbGZvcm1hdCA9IHY0bDJfZm10OworICAgIGVsc2UKKyAgICAgICAgZm10LT5mbXQucGl4LnBpeGVsZm9ybWF0ID0gdjRsMl9mbXQ7CisKKyAgICBmbXQtPnR5cGUgPSBjdHgtPnR5cGU7CisKKyAgICByZXQgPSBpb2N0bChjdHhfdG9fbTJtY3R4KGN0eCktPmZkLCBWSURJT0NfVFJZX0ZNVCwgZm10KTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdjRsMl9nZXRfcmF3X2Zvcm1hdChWNEwyQ29udGV4dCogY3R4LCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnApCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGZtdCA9IGN0eC0+YXZfcGl4X2ZtdDsKKyAgICBzdHJ1Y3QgdjRsMl9mbXRkZXNjIGZkZXNjOworICAgIGludCByZXQ7CisKKyAgICBtZW1zZXQoJmZkZXNjLCAwLCBzaXplb2YoZmRlc2MpKTsKKyAgICBmZGVzYy50eXBlID0gY3R4LT50eXBlOworCisgICAgaWYgKHBpeGZtdCAhPSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgcmV0ID0gdjRsMl90cnlfcmF3X2Zvcm1hdChjdHgsIHBpeGZtdCk7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICByZXQgPSBpb2N0bChjdHhfdG9fbTJtY3R4KGN0eCktPmZkLCBWSURJT0NfRU5VTV9GTVQsICZmZGVzYyk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgICAgIHBpeGZtdCA9IGZmX3Y0bDJfZm9ybWF0X3Y0bDJfdG9fYXZmbXQoZmRlc2MucGl4ZWxmb3JtYXQsIEFWX0NPREVDX0lEX1JBV1ZJREVPKTsKKyAgICAgICAgcmV0ID0gdjRsMl90cnlfcmF3X2Zvcm1hdChjdHgsIHBpeGZtdCk7CisgICAgICAgIGlmIChyZXQpeworICAgICAgICAgICAgZmRlc2MuaW5kZXgrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgKnAgPSBwaXhmbXQ7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIGludCB2NGwyX2dldF9jb2RlZF9mb3JtYXQoVjRMMkNvbnRleHQqIGN0eCwgdWludDMyX3QgKnApCit7CisgICAgc3RydWN0IHY0bDJfZm10ZGVzYyBmZGVzYzsKKyAgICB1aW50MzJfdCB2NGwyX2ZtdDsKKyAgICBpbnQgcmV0OworCisgICAgLyogdHJhbnNsYXRlIHRvIGEgdmFsaWQgdjRsMiBmb3JtYXQgKi8KKyAgICB2NGwyX2ZtdCA9IGZmX3Y0bDJfZm9ybWF0X2F2Y29kZWNfdG9fdjRsMihjdHgtPmF2X2NvZGVjX2lkKTsKKyAgICBpZiAoIXY0bDJfZm10KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgLyogY2hlY2sgaWYgdGhlIGRyaXZlciBzdXBwb3J0cyB0aGlzIGZvcm1hdCAqLworICAgIG1lbXNldCgmZmRlc2MsIDAsIHNpemVvZihmZGVzYykpOworICAgIGZkZXNjLnR5cGUgPSBjdHgtPnR5cGU7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHJldCA9IGlvY3RsKGN0eF90b19tMm1jdHgoY3R4KS0+ZmQsIFZJRElPQ19FTlVNX0ZNVCwgJmZkZXNjKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgaWYgKGZkZXNjLnBpeGVsZm9ybWF0ID09IHY0bDJfZm10KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZmRlc2MuaW5kZXgrKzsKKyAgICB9CisKKyAgICAqcCA9IHY0bDJfZm10OworCisgICAgcmV0dXJuIDA7Cit9CisKKyAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgKgorICAqICAgICAgICAgICAgIFY0TDIgQ29udGV4dCBJbnRlcmZhY2UKKyAgKgorICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IGZmX3Y0bDJfY29udGV4dF9zZXRfc3RhdHVzKFY0TDJDb250ZXh0KiBjdHgsIHVpbnQzMl90IGNtZCkKK3sKKyAgICBpbnQgdHlwZSA9IGN0eC0+dHlwZTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gaW9jdGwoY3R4X3RvX20ybWN0eChjdHgpLT5mZCwgY21kLCAmdHlwZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKGVycm5vKTsKKworICAgIGN0eC0+c3RyZWFtb24gPSAoY21kID09IFZJRElPQ19TVFJFQU1PTik7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3Y0bDJfY29udGV4dF9lbnF1ZXVlX2ZyYW1lKFY0TDJDb250ZXh0KiBjdHgsIGNvbnN0IEFWRnJhbWUqIGZyYW1lKQoreworICAgIFY0TDJtMm1Db250ZXh0ICpzID0gY3R4X3RvX20ybWN0eChjdHgpOworICAgIFY0TDJCdWZmZXIqIGF2YnVmOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIWZyYW1lKSB7CisgICAgICAgIHJldCA9IHY0bDJfc3RvcF9lbmNvZGUoY3R4KTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX0VSUk9SLCAiJXMgc3RvcF9lbmNvZGVcbiIsIGN0eC0+bmFtZSk7CisgICAgICAgIHMtPmRyYWluaW5nPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdmJ1ZiA9IHY0bDJfZ2V0ZnJlZV92NGwyYnVmKGN0eCk7CisgICAgaWYgKCFhdmJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldCA9IGZmX3Y0bDJfYnVmZmVyX2F2ZnJhbWVfdG9fYnVmKGZyYW1lLCBhdmJ1Zik7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBmZl92NGwyX2J1ZmZlcl9lbnF1ZXVlKGF2YnVmKTsKK30KKworaW50IGZmX3Y0bDJfY29udGV4dF9lbnF1ZXVlX3BhY2tldChWNEwyQ29udGV4dCogY3R4LCBjb25zdCBBVlBhY2tldCogcGt0KQoreworICAgIFY0TDJtMm1Db250ZXh0ICpzID0gY3R4X3RvX20ybWN0eChjdHgpOworICAgIFY0TDJCdWZmZXIqIGF2YnVmOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXBrdC0+c2l6ZSkgeworICAgICAgICByZXQgPSB2NGwyX3N0b3BfZGVjb2RlKGN0eCk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICBhdl9sb2cobG9nZ2VyKGN0eCksIEFWX0xPR19FUlJPUiwgIiVzIHN0b3BfZGVjb2RlXG4iLCBjdHgtPm5hbWUpOworICAgICAgICBzLT5kcmFpbmluZyA9IDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGF2YnVmID0gdjRsMl9nZXRmcmVlX3Y0bDJidWYoY3R4KTsKKyAgICBpZiAoIWF2YnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gZmZfdjRsMl9idWZmZXJfYXZwa3RfdG9fYnVmKHBrdCwgYXZidWYpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gZmZfdjRsMl9idWZmZXJfZW5xdWV1ZShhdmJ1Zik7Cit9CisKK2ludCBmZl92NGwyX2NvbnRleHRfZGVxdWV1ZV9mcmFtZShWNEwyQ29udGV4dCogY3R4LCBBVkZyYW1lKiBmcmFtZSkKK3sKKyAgICBWNEwyQnVmZmVyKiBhdmJ1ZiA9IE5VTEw7CisKKyAgICAvKgorICAgICAqIGJsb2NrcyB1bnRpbDoKKyAgICAgKiAgMS4gZGVjb2RlZCBmcmFtZSBhdmFpbGFibGUKKyAgICAgKiAgMi4gYW4gaW5wdXQgYnVmZmVyIGlzIHJlYWR5IHRvIGJlIGRlcXVldWVkCisgICAgICovCisgICAgYXZidWYgPSB2NGwyX2RlcXVldWVfdjRsMmJ1ZihjdHgsIC0xKTsKKyAgICBpZiAoIWF2YnVmKSB7CisgICAgICAgIGlmIChjdHgtPmRvbmUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfdjRsMl9idWZmZXJfYnVmX3RvX2F2ZnJhbWUoZnJhbWUsIGF2YnVmKTsKK30KKworaW50IGZmX3Y0bDJfY29udGV4dF9kZXF1ZXVlX3BhY2tldChWNEwyQ29udGV4dCogY3R4LCBBVlBhY2tldCogcGt0KQoreworICAgIFY0TDJCdWZmZXIqIGF2YnVmID0gTlVMTDsKKworICAgIC8qCisgICAgICogYmxvY2tzIHVudGlsOgorICAgICAqICAxLiBlbmNvZGVkIHBhY2tldCBhdmFpbGFibGUKKyAgICAgKiAgMi4gYW4gaW5wdXQgYnVmZmVyIHJlYWR5IHRvIGJlIGRlcXVldWVkCisgICAgICovCisgICAgYXZidWYgPSB2NGwyX2RlcXVldWVfdjRsMmJ1ZihjdHgsIC0xKTsKKyAgICBpZiAoIWF2YnVmKSB7CisgICAgICAgIGlmIChjdHgtPmRvbmUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfdjRsMl9idWZmZXJfYnVmX3RvX2F2cGt0KHBrdCwgYXZidWYpOworfQorCitpbnQgZmZfdjRsMl9jb250ZXh0X2dldF9mb3JtYXQoVjRMMkNvbnRleHQqIGN0eCkKK3sKKyAgICBzdHJ1Y3QgdjRsMl9mb3JtYXRfdXBkYXRlIGZtdCA9IHsgMCB9OworICAgIGludCByZXQ7CisKKyAgICBpZiAgKGN0eC0+YXZfY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKKyAgICAgICAgcmV0ID0gdjRsMl9nZXRfcmF3X2Zvcm1hdChjdHgsICZmbXQuYXZfZm10KTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgZm10LnVwZGF0ZV9hdmZtdCA9IDE7CisgICAgICAgIHY0bDJfc2F2ZV90b19jb250ZXh0KGN0eCwgJmZtdCk7CisKKyAgICAgICAgLyogZm9ybWF0IGhhcyBiZWVuIHRyaWVkIGFscmVhZHkgKi8KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSB2NGwyX2dldF9jb2RlZF9mb3JtYXQoY3R4LCAmZm10LnY0bDJfZm10KTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm10LnVwZGF0ZV92NGwyID0gMTsKKyAgICB2NGwyX3NhdmVfdG9fY29udGV4dChjdHgsICZmbXQpOworCisgICAgcmV0dXJuIGlvY3RsKGN0eF90b19tMm1jdHgoY3R4KS0+ZmQsIFZJRElPQ19UUllfRk1ULCAmY3R4LT5mb3JtYXQpOworfQorCitpbnQgZmZfdjRsMl9jb250ZXh0X3NldF9mb3JtYXQoVjRMMkNvbnRleHQqIGN0eCkKK3sKKyAgICByZXR1cm4gaW9jdGwoY3R4X3RvX20ybWN0eChjdHgpLT5mZCwgVklESU9DX1NfRk1ULCAmY3R4LT5mb3JtYXQpOworfQorCit2b2lkIGZmX3Y0bDJfY29udGV4dF9yZWxlYXNlKFY0TDJDb250ZXh0KiBjdHgpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICghY3R4LT5idWZmZXJzKQorICAgICAgICByZXR1cm47CisKKyAgICByZXQgPSB2NGwyX3JlbGVhc2VfYnVmZmVycyhjdHgpOworICAgIGlmIChyZXQpCisgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX1dBUk5JTkcsICJWNEwyIGZhaWxlZCB0byB1bm1hcCB0aGUgJXMgYnVmZmVyc1xuIiwgY3R4LT5uYW1lKTsKKworICAgIGF2X2ZyZWUoY3R4LT5idWZmZXJzKTsKKyAgICBjdHgtPmJ1ZmZlcnMgPSBOVUxMOworfQorCitpbnQgZmZfdjRsMl9jb250ZXh0X2luaXQoVjRMMkNvbnRleHQqIGN0eCkKK3sKKyAgICBWNEwybTJtQ29udGV4dCAqcyA9IGN0eF90b19tMm1jdHgoY3R4KTsKKyAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByZXE7CisgICAgaW50IHJldCwgaTsKKworICAgIGlmICghdjRsMl90eXBlX3N1cHBvcnRlZChjdHgpKSB7CisgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX0VSUk9SLCAidHlwZSAlaSBub3Qgc3VwcG9ydGVkXG4iLCBjdHgtPnR5cGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIFZJRElPQ19HX0ZNVCwgJmN0eC0+Zm9ybWF0KTsKKyAgICBpZiAocmV0KQorICAgICAgICBhdl9sb2cobG9nZ2VyKGN0eCksIEFWX0xPR19FUlJPUiwgIiVzIFZJRElPQ19HX0ZNVCBmYWlsZWRcbiIsIGN0eC0+bmFtZSk7CisKKyAgICBtZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworICAgIHJlcS5jb3VudCA9IGN0eC0+bnVtX2J1ZmZlcnM7CisgICAgcmVxLm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7CisgICAgcmVxLnR5cGUgPSBjdHgtPnR5cGU7CisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIFZJRElPQ19SRVFCVUZTLCAmcmVxKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJybm8pOworCisgICAgY3R4LT5udW1fYnVmZmVycyA9IHJlcS5jb3VudDsKKyAgICBjdHgtPmJ1ZmZlcnMgPSBhdl9tYWxsb2N6KGN0eC0+bnVtX2J1ZmZlcnMgKiBzaXplb2YoVjRMMkJ1ZmZlcikpOworICAgIGlmICghY3R4LT5idWZmZXJzKSB7CisgICAgICAgICAgICBhdl9sb2cobG9nZ2VyKGN0eCksIEFWX0xPR19FUlJPUiwgIiVzIG1hbGxvYyBlbm9tZW1cbiIsIGN0eC0+bmFtZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCByZXEuY291bnQ7IGkrKykgeworICAgICAgICBjdHgtPmJ1ZmZlcnNbaV0uY29udGV4dCA9IGN0eDsKKyAgICAgICAgcmV0ID0gZmZfdjRsMl9idWZmZXJfaW5pdGlhbGl6ZSgmY3R4LT5idWZmZXJzW2ldLCBpKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dnZXIoY3R4KSwgQVZfTE9HX0VSUk9SLCAiJXMgYnVmZmVyIGluaXRpYWxpemF0aW9uICglcylcbiIsIGN0eC0+bmFtZSwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoY3R4LT5idWZmZXJzKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9sb2cobG9nZ2VyKGN0eCksIEFWX0xPR19ERUJVRywgIiVzOiAlcyAlMDJkIGJ1ZmZlcnMgaW5pdGlhbGl6ZWQ6ICUwNHV4JTA0dSwgc2l6ZWltYWdlICUwOHUsIGJ5dGVzcGVybGluZSAlMDh1XG4iLCBjdHgtPm5hbWUsCisgICAgICAgIFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihjdHgtPnR5cGUpID8gYXZfZm91cmNjMnN0cihjdHgtPmZvcm1hdC5mbXQucGl4X21wLnBpeGVsZm9ybWF0KSA6IGF2X2ZvdXJjYzJzdHIoY3R4LT5mb3JtYXQuZm10LnBpeC5waXhlbGZvcm1hdCksCisgICAgICAgIHJlcS5jb3VudCwKKyAgICAgICAgdjRsMl9nZXRfd2lkdGgoJmN0eC0+Zm9ybWF0KSwKKyAgICAgICAgdjRsMl9nZXRfaGVpZ2h0KCZjdHgtPmZvcm1hdCksCisgICAgICAgIFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihjdHgtPnR5cGUpID8gY3R4LT5mb3JtYXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlIDogY3R4LT5mb3JtYXQuZm10LnBpeC5zaXplaW1hZ2UsCisgICAgICAgIFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihjdHgtPnR5cGUpID8gY3R4LT5mb3JtYXQuZm10LnBpeF9tcC5wbGFuZV9mbXRbMF0uYnl0ZXNwZXJsaW5lIDogY3R4LT5mb3JtYXQuZm10LnBpeC5ieXRlc3BlcmxpbmUpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Y0bDJfY29udGV4dC5oIGIvbGliYXZjb2RlYy92NGwyX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzJmMWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92NGwyX2NvbnRleHQuaApAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIFY0TDIgY29udGV4dCBoZWxwZXIgZnVuY3Rpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBKb3JnZSBSYW1pcmV6IDxqb3JnZS5yYW1pcmV6LW9ydGl6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WNEwyX0NPTlRFWFRfSAorI2RlZmluZSBBVkNPREVDX1Y0TDJfQ09OVEVYVF9ICisKKyNpbmNsdWRlIDxzdGRhdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAidjRsMl9idWZmZXJzLmgiCisKK3R5cGVkZWYgc3RydWN0IFY0TDJDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBjb250ZXh0IG5hbWUuCisgICAgICovCisgICAgY29uc3QgY2hhciogbmFtZTsKKworICAgIC8qKgorICAgICAqIFR5cGUgb2YgdGhpcyBidWZmZXIgY29udGV4dC4KKyAgICAgKiBTZWUgVjRMMl9CVUZfVFlQRV9WSURFT18qIGluIHZpZGVvZGV2Mi5oCisgICAgICogUmVhZG9ubHkgYWZ0ZXIgaW5pdC4KKyAgICAgKi8KKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKworICAgIC8qKgorICAgICAqIEFWUGl4ZWxGb3JtYXQgY29ycmVzcG9uZGluZyB0byB0aGlzIGJ1ZmZlciBjb250ZXh0LgorICAgICAqIEFWX1BJWF9GTVRfTk9ORSBtZWFucyB0aGlzIGlzIGFuIGVuY29kZWQgc3RyZWFtLgorICAgICAqLworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBhdl9waXhfZm10OworCisgICAgLyoqCisgICAgICogQVZDb2RlY0lEIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBidWZmZXIgY29udGV4dC4KKyAgICAgKiBBVl9DT0RFQ19JRF9SQVdWSURFTyBtZWFucyB0aGlzIGlzIGEgcmF3IHN0cmVhbSBhbmQgYXZfcGl4X2ZtdCBtdXN0IGJlIHNldCB0byBhIHZhbGlkIHZhbHVlLgorICAgICAqLworICAgIGVudW0gQVZDb2RlY0lEIGF2X2NvZGVjX2lkOworCisgICAgLyoqCisgICAgICogRm9ybWF0IHJldHVybmVkIGJ5IHRoZSBkcml2ZXIgYWZ0ZXIgaW5pdGlhbGl6aW5nIHRoZSBidWZmZXIgY29udGV4dC4KKyAgICAgKiBSZWFkb25seSBhZnRlciBpbml0LgorICAgICAqLworICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCBmb3JtYXQ7CisKKyAgICAvKioKKyAgICAgKiBXaWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBmcmFtZXMgaXQgcHJvZHVjZXMgKGluIGNhc2Ugb2YgYSBjYXB0dXJlIGNvbnRleHQsIGUuZy4gd2hlbiBkZWNvZGluZykKKyAgICAgKiBvciBhY2NlcHRzIChpbiBjYXNlIG9mIGFuIG91dHB1dCBjb250ZXh0LCBlLmcuIHdoZW4gZW5jb2RpbmcpLgorICAgICAqLworICAgIGludCB3aWR0aCwgaGVpZ2h0OworCisgICAgLyoqCisgICAgICogSW5kZXhlZCBhcnJheSBvZiBWNEwyQnVmZmVycworICAgICAqLworICAgIFY0TDJCdWZmZXIgKmJ1ZmZlcnM7CisKKyAgICAvKioKKyAgICAgKiBSZWFkb25seSBhZnRlciBpbml0LgorICAgICAqLworICAgIGludCBudW1fYnVmZmVyczsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdGhlIHN0cmVhbSBoYXMgYmVlbiBzdGFydGVkIChWSURJT0NfU1RSRUFNT04gaGFzIGJlZW4gc2VudCkuCisgICAgICovCisgICAgaW50IHN0cmVhbW9uOworCisgICAgLyoqCisgICAgICogIEVpdGhlciBubyBtb3JlIGJ1ZmZlcnMgYXZhaWxhYmxlIG9yIGFuIHVucmVjb3ZlcmFibGUgZXJyb3Igd2FzIG5vdGlmaWVkCisgICAgICogIGJ5IHRoZSBWNEwyIGtlcm5lbCBkcml2ZXI6IG9uY2Ugc2V0IHRoZSBjb250ZXh0IGhhcyB0byBiZSBleGl0ZWQuCisgICAgICovCisgICAgaW50IGRvbmU7CisKK30gVjRMMkNvbnRleHQ7CisKKy8qKgorICogSW5pdGlhbGl6ZXMgYSBWNEwyQ29udGV4dC4KKyAqCisgKiBAcGFyYW1baW5dIGN0eCBBIHBvaW50ZXIgdG8gYSBWNEwyQ29udGV4dC4gU2VlIFY0TDJDb250ZXh0IGRlc2NyaXB0aW9uIGZvciByZXF1aXJlZCB2YXJpYWJsZXMuCisgKiBAcmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZXJyb3Igb3RoZXJ3aXNlLgorICovCitpbnQgZmZfdjRsMl9jb250ZXh0X2luaXQoVjRMMkNvbnRleHQqIGN0eCk7CisKKy8qKgorICogU2V0cyB0aGUgVjRMMkNvbnRleHQgZm9ybWF0IGluIHRoZSB2NGwyIGRyaXZlci4KKyAqCisgKiBAcGFyYW1baW5dIGN0eCBBIHBvaW50ZXIgdG8gYSBWNEwyQ29udGV4dC4gU2VlIFY0TDJDb250ZXh0IGRlc2NyaXB0aW9uIGZvciByZXF1aXJlZCB2YXJpYWJsZXMuCisgKiBAcmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBhIG5lZ2F0aXZlIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgZXJyb3Igb3RoZXJ3aXNlLgorICovCitpbnQgZmZfdjRsMl9jb250ZXh0X3NldF9mb3JtYXQoVjRMMkNvbnRleHQqIGN0eCk7CisKKy8qKgorICogUXVlcmllcyB0aGUgZHJpdmVyIGZvciBhIHZhbGlkIHY0bDIgZm9ybWF0IGFuZCBjb3BpZXMgaXQgdG8gdGhlIGNvbnRleHQuCisgKgorICogQHBhcmFtW2luXSBjdHggQSBwb2ludGVyIHRvIGEgVjRMMkNvbnRleHQuIFNlZSBWNEwyQ29udGV4dCBkZXNjcmlwdGlvbiBmb3IgcmVxdWlyZWQgdmFyaWFibGVzLgorICogQHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGVycm9yIG90aGVyd2lzZS4KKyAqLworaW50IGZmX3Y0bDJfY29udGV4dF9nZXRfZm9ybWF0KFY0TDJDb250ZXh0KiBjdHgpOworCisvKioKKyAqIFJlbGVhc2VzIGEgVjRMMkNvbnRleHQuCisgKgorICogQHBhcmFtW2luXSBjdHggQSBwb2ludGVyIHRvIGEgVjRMMkNvbnRleHQuCisgKiAgICAgICAgICAgICAgIFRoZSBjYWxsZXIgaXMgcmVwb25zaWJsZSBmb3IgZnJlZWluZyBpdC4KKyAqICAgICAgICAgICAgICAgSXQgbXVzdCBub3QgYmUgdXNlZCBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKi8KK3ZvaWQgZmZfdjRsMl9jb250ZXh0X3JlbGVhc2UoVjRMMkNvbnRleHQqIGN0eCk7CisKKy8qKgorICogU2V0cyB0aGUgc3RhdHVzIG9mIGEgVjRMMkNvbnRleHQuCisgKgorICogQHBhcmFtW2luXSBjdHggQSBwb2ludGVyIHRvIGEgVjRMMkNvbnRleHQuCisgKiBAcGFyYW1baW5dIGNtZCBUaGUgc3RhdHVzIHRvIHNldCAoVklESU9DX1NUUkVBTU9OIG9yIFZJRElPQ19TVFJFQU1PRkYpLgorICogICAgICAgICAgICAgICAgV2FybmluZzogSWYgVklESU9DX1NUUkVBTU9GRiBpcyBzZW50IHRvIGEgYnVmZmVyIGNvbnRleHQgdGhhdCBzdGlsbCBoYXMgc29tZSBmcmFtZXMgYnVmZmVyZWQsCisgKiAgICAgICAgICAgICAgICB0aG9zZSBmcmFtZXMgd2lsbCBiZSBkcm9wcGVkLgorICogQHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGVycm9yIG90aGVyd2lzZS4KKyAqLworaW50IGZmX3Y0bDJfY29udGV4dF9zZXRfc3RhdHVzKFY0TDJDb250ZXh0KiBjdHgsIHVpbnQzMl90IGNtZCk7CisKKy8qKgorICogRGVxdWV1ZXMgYSBidWZmZXIgZnJvbSBhIFY0TDJDb250ZXh0IHRvIGFuIEFWUGFja2V0LgorICoKKyAqIFRoZSBwa3QgbXVzdCBiZSBub24gTlVMTC4KKyAqIEBwYXJhbVtpbl0gY3R4IFRoZSBWNEwyQ29udGV4dCB0byBkZXF1ZXVlIGZyb20uCisgKiBAcGFyYW1baW5vdXRdIHBrdCBUaGUgQVZQYWNrZXQgdG8gZGVxdWV1ZSB0by4KKyAqIEByZXR1cm4gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIEFWRVJST1IoRUFHQUlOKSBpZiBubyBidWZmZXIgd2FzIHJlYWR5LCBhbm90aGVyIG5lZ2F0aXZlIGVycm9yIGluIGNhc2Ugb2YgZXJyb3IuCisgKi8KK2ludCBmZl92NGwyX2NvbnRleHRfZGVxdWV1ZV9wYWNrZXQoVjRMMkNvbnRleHQqIGN0eCwgQVZQYWNrZXQqIHBrdCk7CisKKy8qKgorICogRGVxdWV1ZXMgYSBidWZmZXIgZnJvbSBhIFY0TDJDb250ZXh0IHRvIGFuIEFWRnJhbWUuCisgKgorICogVGhlIGZyYW1lIG11c3QgYmUgbm9uIE5VTEwuCisgKiBAcGFyYW1baW5dIGN0eCBUaGUgVjRMMkNvbnRleHQgdG8gZGVxdWV1ZSBmcm9tLgorICogQHBhcmFtW2lub3V0XSBmIFRoZSBBVkZyYW1lIHRvIGRlcXVldWUgdG8uCisgKiBAcmV0dXJuIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBBVkVSUk9SKEVBR0FJTikgaWYgbm8gYnVmZmVyIHdhcyByZWFkeSwgYW5vdGhlciBuZWdhdGl2ZSBlcnJvciBpbiBjYXNlIG9mIGVycm9yLgorICovCitpbnQgZmZfdjRsMl9jb250ZXh0X2RlcXVldWVfZnJhbWUoVjRMMkNvbnRleHQqIGN0eCwgQVZGcmFtZSogZik7CisKKy8qKgorICogRW5xdWV1ZXMgYSBidWZmZXIgdG8gYSBWNEwyQ29udGV4dCBmcm9tIGFuIEFWUGFja2V0CisgKgorICogVGhlIHBhY2tldCBtdXN0IGJlIG5vbiBOVUxMLgorICogV2hlbiB0aGUgc2l6ZSBvZiB0aGUgcGt0IGlzIG51bGwsIHRoZSBidWZmZXIgaXMgbm90IHF1ZXVlZCBidXQgYSBWNEwyX0RFQ19DTURfU1RPUCBjb21tYW5kIGlzIHNlbnQgaW5zdGVhZCB0byB0aGUgZHJpdmVyLgorICoKKyAqIEBwYXJhbVtpbl0gY3R4IFRoZSBWNEwyQ29udGV4dCB0byBlbnF1ZXVlIHRvLgorICogQHBhcmFtW2luXSBwa3QgQSBwb2ludGVyIHRvIGFuIEFWUGFja2V0LgorICogQHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBvdGhlcndpc2UuCisgKi8KK2ludCBmZl92NGwyX2NvbnRleHRfZW5xdWV1ZV9wYWNrZXQoVjRMMkNvbnRleHQqIGN0eCwgY29uc3QgQVZQYWNrZXQqIHBrdCk7CisKKy8qKgorICogRW5xdWV1ZXMgYSBidWZmZXIgdG8gYSBWNEwyQ29udGV4dCBmcm9tIGFuIEFWRnJhbWUKKyAqCisgKiBUaGUgZnJhbWUgbXVzdCBiZSBub24gTlVMTC4KKyAqCisgKiBAcGFyYW1baW5dIGN0eCBUaGUgVjRMMkNvbnRleHQgdG8gZW5xdWV1ZSB0by4KKyAqIEBwYXJhbVtpbl0gZiBBIHBvaW50ZXIgdG8gYW4gQVZGcmFtZSB0byBlbnF1ZXVlLgorICogQHJldHVybiAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBvdGhlcndpc2UuCisgKi8KK2ludCBmZl92NGwyX2NvbnRleHRfZW5xdWV1ZV9mcmFtZShWNEwyQ29udGV4dCogY3R4LCBjb25zdCBBVkZyYW1lKiBmKTsKKworI2VuZGlmIC8vIEFWQ09ERUNfVjRMMl9DT05URVhUX0gKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdjRsMl9mbXQuYyBiL2xpYmF2Y29kZWMvdjRsMl9mbXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY0N2UzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92NGwyX2ZtdC5jCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogVjRMMiBmb3JtYXQgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBKb3JnZSBSYW1pcmV6IDxqb3JnZS5yYW1pcmV6LW9ydGl6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxzZWFyY2guaD4KKyNpbmNsdWRlICJ2NGwyX2ZtdC5oIgorCisjZGVmaW5lIFY0TDJfRk1UKHgpIFY0TDJfUElYX0ZNVF8jI3gKKyNkZWZpbmUgQVZfQ09ERUMoeCkgQVZfQ09ERUNfSURfIyN4CisjZGVmaW5lIEFWX0ZNVCh4KSAgIEFWX1BJWF9GTVRfIyN4CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZm10X2NvbnZlcnNpb24geworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBhdmZtdDsKKyAgICBlbnVtIEFWQ29kZWNJRCBhdmNvZGVjOworICAgIHVpbnQzMl90IHY0bDJfZm10OworfSBmbXRfbWFwW10gPSB7CisgICAgeyBBVl9GTVQoUkdCNTU1TEUpLCAgICBBVl9DT0RFQyhSQVdWSURFTyksICAgIFY0TDJfRk1UKFJHQjU1NSkgfSwKKyAgICB7IEFWX0ZNVChSR0I1NTVCRSksICAgIEFWX0NPREVDKFJBV1ZJREVPKSwgICAgVjRMMl9GTVQoUkdCNTU1WCkgfSwKKyAgICB7IEFWX0ZNVChSR0I1NjVMRSksICAgIEFWX0NPREVDKFJBV1ZJREVPKSwgICAgVjRMMl9GTVQoUkdCNTY1KSB9LAorICAgIHsgQVZfRk1UKFJHQjU2NUJFKSwgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChSR0I1NjVYKSB9LAorICAgIHsgQVZfRk1UKEJHUjI0KSwgICAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChCR1IyNCkgfSwKKyAgICB7IEFWX0ZNVChSR0IyNCksICAgICAgIEFWX0NPREVDKFJBV1ZJREVPKSwgICAgVjRMMl9GTVQoUkdCMjQpIH0sCisgICAgeyBBVl9GTVQoQkdSMCksICAgICAgICBBVl9DT0RFQyhSQVdWSURFTyksICAgIFY0TDJfRk1UKEJHUjMyKSB9LAorICAgIHsgQVZfRk1UKDBSR0IpLCAgICAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChSR0IzMikgfSwKKyAgICB7IEFWX0ZNVChHUkFZOCksICAgICAgIEFWX0NPREVDKFJBV1ZJREVPKSwgICAgVjRMMl9GTVQoR1JFWSkgfSwKKyAgICB7IEFWX0ZNVChZVVY0MjBQKSwgICAgIEFWX0NPREVDKFJBV1ZJREVPKSwgICAgVjRMMl9GTVQoWVVWNDIwKSB9LAorICAgIHsgQVZfRk1UKFlVWVY0MjIpLCAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChZVVlWKSB9LAorICAgIHsgQVZfRk1UKFVZVlk0MjIpLCAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChVWVZZKSB9LAorICAgIHsgQVZfRk1UKFlVVjQyMlApLCAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChZVVY0MjJQKSB9LAorICAgIHsgQVZfRk1UKFlVVjQxMVApLCAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChZVVY0MTFQKSB9LAorICAgIHsgQVZfRk1UKFlVVjQxMFApLCAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChZVVY0MTApIH0sCisgICAgeyBBVl9GTVQoWVVWNDEwUCksICAgICBBVl9DT0RFQyhSQVdWSURFTyksICAgIFY0TDJfRk1UKFlWVTQxMCkgfSwKKyAgICB7IEFWX0ZNVChOVjEyKSwgICAgICAgIEFWX0NPREVDKFJBV1ZJREVPKSwgICAgVjRMMl9GTVQoTlYxMikgfSwKKyAgICB7IEFWX0ZNVChOT05FKSwgICAgICAgIEFWX0NPREVDKE1KUEVHKSwgICAgICAgVjRMMl9GTVQoTUpQRUcpIH0sCisgICAgeyBBVl9GTVQoTk9ORSksICAgICAgICBBVl9DT0RFQyhNSlBFRyksICAgICAgIFY0TDJfRk1UKEpQRUcpIH0sCisjaWZkZWYgVjRMMl9QSVhfRk1UX1NSR0dCOAorICAgIHsgQVZfRk1UKEJBWUVSX0JHR1I4KSwgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChTQkdHUjgpIH0sCisgICAgeyBBVl9GTVQoQkFZRVJfR0JSRzgpLCBBVl9DT0RFQyhSQVdWSURFTyksICAgIFY0TDJfRk1UKFNHQlJHOCkgfSwKKyAgICB7IEFWX0ZNVChCQVlFUl9HUkJHOCksIEFWX0NPREVDKFJBV1ZJREVPKSwgICAgVjRMMl9GTVQoU0dSQkc4KSB9LAorICAgIHsgQVZfRk1UKEJBWUVSX1JHR0I4KSwgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChTUkdHQjgpIH0sCisjZW5kaWYKKyNpZmRlZiBWNEwyX1BJWF9GTVRfWTE2CisgICAgeyBBVl9GTVQoR1JBWTE2TEUpLCAgICBBVl9DT0RFQyhSQVdWSURFTyksICAgIFY0TDJfRk1UKFkxNikgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9OVjEyTQorICAgIHsgQVZfRk1UKE5WMTIpLCAgICAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChOVjEyTSkgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9OVjIxTQorICAgIHsgQVZfRk1UKE5WMjEpLCAgICAgICAgQVZfQ09ERUMoUkFXVklERU8pLCAgICBWNEwyX0ZNVChOVjIxTSkgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9ZVVY0MjBNCisgICAgeyBBVl9GTVQoWVVWNDIwUCksICAgICBBVl9DT0RFQyhSQVdWSURFTyksICAgIFY0TDJfRk1UKFlVVjQyME0pIH0sCisjZW5kaWYKKyNpZmRlZiBWNEwyX1BJWF9GTVRfTlYxNk0KKyAgICB7IEFWX0ZNVChOVjE2KSwgICAgICAgIEFWX0NPREVDKFJBV1ZJREVPKSwgICAgVjRMMl9GTVQoTlYxNk0pIH0sCisjZW5kaWYKKyNpZmRlZiBWNEwyX1BJWF9GTVRfSDI2MworICAgIHsgQVZfRk1UKE5PTkUpLCAgICAgICAgQVZfQ09ERUMoSDI2MyksICAgICAgICBWNEwyX0ZNVChIMjYzKSB9LAorI2VuZGlmCisjaWZkZWYgVjRMMl9QSVhfRk1UX0gyNjQKKyAgICB7IEFWX0ZNVChOT05FKSwgICAgICAgIEFWX0NPREVDKEgyNjQpLCAgICAgICAgVjRMMl9GTVQoSDI2NCkgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9NUEVHNAorICAgIHsgQVZfRk1UKE5PTkUpLCAgICAgICAgQVZfQ09ERUMoTVBFRzQpLCAgICAgICBWNEwyX0ZNVChNUEVHNCkgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9DUElBMQorICAgIHsgQVZfRk1UKE5PTkUpLCAgICAgICAgQVZfQ09ERUMoQ1BJQSksICAgICAgICBWNEwyX0ZNVChDUElBMSkgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9EVgorICAgIHsgQVZfRk1UKE5PTkUpLCAgICAgICAgQVZfQ09ERUMoRFZWSURFTyksICAgICBWNEwyX0ZNVChEVikgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9NUEVHMQorICAgIHsgQVZfRk1UKE5PTkUpLCAgICAgICAgQVZfQ09ERUMoTVBFRzFWSURFTyksICBWNEwyX0ZNVChNUEVHMSkgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9NUEVHMgorICAgIHsgQVZfRk1UKE5PTkUpLCAgICAgICAgQVZfQ09ERUMoTVBFRzJWSURFTyksICBWNEwyX0ZNVChNUEVHMikgfSwKKyNlbmRpZgorI2lmZGVmIFY0TDJfUElYX0ZNVF9WUDgKKyAgICB7IEFWX0ZNVChOT05FKSwgICAgICAgIEFWX0NPREVDKFZQOCksICAgICAgICAgVjRMMl9GTVQoVlA4KSB9LAorI2VuZGlmCisjaWZkZWYgVjRMMl9QSVhfRk1UX1ZQOQorICAgIHsgQVZfRk1UKE5PTkUpLCAgICAgICAgQVZfQ09ERUMoVlA5KSwgICAgICAgICBWNEwyX0ZNVChWUDkpIH0sCisjZW5kaWYKKyNpZmRlZiBWNEwyX1BJWF9GTVRfSEVWQworICAgIHsgQVZfRk1UKE5PTkUpLCAgICAgICAgQVZfQ09ERUMoSEVWQyksICAgICAgICBWNEwyX0ZNVChIRVZDKSB9LAorI2VuZGlmCisjaWZkZWYgVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9HCisgICAgeyBBVl9GTVQoTk9ORSksICAgICAgICBBVl9DT0RFQyhWQzEpLCAgICAgICAgIFY0TDJfRk1UKFZDMV9BTk5FWF9HKSB9LAorI2VuZGlmCit9OworCit1aW50MzJfdCBmZl92NGwyX2Zvcm1hdF9hdmNvZGVjX3RvX3Y0bDIoZW51bSBBVkNvZGVjSUQgYXZjb2RlYykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZm10X21hcCk7IGkrKykgeworICAgICAgICBpZiAoZm10X21hcFtpXS5hdmNvZGVjID09IGF2Y29kZWMpCisgICAgICAgICAgICByZXR1cm4gZm10X21hcFtpXS52NGwyX2ZtdDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IGZmX3Y0bDJfZm9ybWF0X2F2Zm10X3RvX3Y0bDIoZW51bSBBVlBpeGVsRm9ybWF0IGF2Zm10KQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhmbXRfbWFwKTsgaSsrKSB7CisgICAgICAgIGlmIChmbXRfbWFwW2ldLmF2Zm10ID09IGF2Zm10KQorICAgICAgICAgICAgcmV0dXJuIGZtdF9tYXBbaV0udjRsMl9mbXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfdjRsMl9mb3JtYXRfdjRsMl90b19hdmZtdCh1aW50MzJfdCB2NGwyX2ZtdCwgZW51bSBBVkNvZGVjSUQgYXZjb2RlYykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZm10X21hcCk7IGkrKykgeworICAgICAgICBpZiAoZm10X21hcFtpXS5hdmNvZGVjICA9PSBhdmNvZGVjICYmCisgICAgICAgICAgICBmbXRfbWFwW2ldLnY0bDJfZm10ID09IHY0bDJfZm10KQorICAgICAgICAgICAgcmV0dXJuIGZtdF9tYXBbaV0uYXZmbXQ7CisgICAgfQorICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Y0bDJfZm10LmggYi9saWJhdmNvZGVjL3Y0bDJfZm10LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEzNjAwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdjRsMl9mbXQuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogVjRMMiBmb3JtYXQgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBKb3JnZSBSYW1pcmV6IDxqb3JnZS5yYW1pcmV6LW9ydGl6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WNEwyX0ZNVF9ICisjZGVmaW5lIEFWQ09ERUNfVjRMMl9GTVRfSAorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCitlbnVtIEFWUGl4ZWxGb3JtYXQgZmZfdjRsMl9mb3JtYXRfdjRsMl90b19hdmZtdCh1aW50MzJfdCB2NGwyX2ZtdCwgZW51bSBBVkNvZGVjSUQgYXZjb2RlYyk7Cit1aW50MzJfdCBmZl92NGwyX2Zvcm1hdF9hdmNvZGVjX3RvX3Y0bDIoZW51bSBBVkNvZGVjSUQgYXZjb2RlYyk7Cit1aW50MzJfdCBmZl92NGwyX2Zvcm1hdF9hdmZtdF90b192NGwyKGVudW0gQVZQaXhlbEZvcm1hdCBhdmZtdCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1Y0TDJfRk1UX0gqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92NGwyX20ybS5jIGIvbGliYXZjb2RlYy92NGwyX20ybS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyN2UxNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3Y0bDJfbTJtLmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBWNEwgbWVtMm1lbQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBKb3JnZSBSYW1pcmV6IDxqb3JnZS5yYW1pcmV6LW9ydGl6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorI2luY2x1ZGUgInY0bDJfY29udGV4dC5oIgorI2luY2x1ZGUgInY0bDJfZm10LmgiCisjaW5jbHVkZSAidjRsMl9tMm0uaCIKKworc3RhdGljIGlubGluZSBpbnQgdjRsMl9zcGxhbmVfdmlkZW8oc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQoreworICAgIGlmIChjYXAtPmNhcGFiaWxpdGllcyAmIChWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUKSAmJgorICAgICAgICBjYXAtPmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1NUUkVBTUlORykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoY2FwLT5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19NMk0pCisgICAgICAgIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHY0bDJfbXBsYW5lX3ZpZGVvKHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKyAgICBpZiAoY2FwLT5jYXBhYmlsaXRpZXMgJiAoVjRMMl9DQVBfVklERU9fQ0FQVFVSRV9NUExBTkUgfCBWNEwyX0NBUF9WSURFT19PVVRQVVRfTVBMQU5FKSAmJgorICAgICAgICBjYXAtPmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1NUUkVBTUlORykKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBpZiAoY2FwLT5jYXBhYmlsaXRpZXMgJiBWNEwyX0NBUF9WSURFT19NMk1fTVBMQU5FKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bDJfcHJlcGFyZV9jb250ZXh0cyhWNEwybTJtQ29udGV4dCogcykKK3sKKyAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKKyAgICBpbnQgcmV0OworCisgICAgcy0+Y2FwdHVyZS5kb25lID0gcy0+b3V0cHV0LmRvbmUgPSAwOworICAgIHMtPmNhcHR1cmUubmFtZSA9ICJjYXB0dXJlIjsKKyAgICBzLT5vdXRwdXQubmFtZSA9ICJvdXRwdXQgIjsKKyAgICBhdG9taWNfaW5pdCgmcy0+cmVmY291bnQsIDApOworICAgIHNlbV9pbml0KCZzLT5yZWZzeW5jLCAwLCAwKTsKKworICAgIG1lbXNldCgmY2FwLCAwLCBzaXplb2YoY2FwKSk7CisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIFZJRElPQ19RVUVSWUNBUCwgJmNhcCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19JTkZPLCAiZHJpdmVyICclcycgb24gY2FyZCAnJXMnXG4iLCBjYXAuZHJpdmVyLCBjYXAuY2FyZCk7CisKKyAgICBpZiAodjRsMl9tcGxhbmVfdmlkZW8oJmNhcCkpIHsKKyAgICAgICAgcy0+Y2FwdHVyZS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORTsKKyAgICAgICAgcy0+b3V0cHV0LnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmICh2NGwyX3NwbGFuZV92aWRlbygmY2FwKSkgeworICAgICAgICBzLT5jYXB0dXJlLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgICAgIHMtPm91dHB1dC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgdjRsMl9wcm9iZV9kcml2ZXIoVjRMMm0ybUNvbnRleHQqIHMpCit7CisgICAgaW50IHJldDsKKworICAgIHMtPmZkID0gb3BlbihzLT5kZXZuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKKyAgICBpZiAocy0+ZmQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CisKKyAgICByZXQgPSB2NGwyX3ByZXBhcmVfY29udGV4dHMocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9nZXRfZm9ybWF0KCZzLT5vdXRwdXQpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfREVCVUcsICJ2NGwyIG91dHB1dCBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfZ2V0X2Zvcm1hdCgmcy0+Y2FwdHVyZSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19ERUJVRywgInY0bDIgY2FwdHVyZSBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKK2RvbmU6CisgICAgaWYgKGNsb3NlKHMtPmZkKSA8IDApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiZmFpbHVyZSBjbG9zaW5nICVzICglcylcbiIsIHMtPmRldm5hbWUsIGF2X2VycjJzdHIoQVZFUlJPUihlcnJubykpKTsKKyAgICB9CisKKyAgICBzLT5mZCA9IC0xOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2NGwyX2NvbmZpZ3VyZV9jb250ZXh0cyhWNEwybTJtQ29udGV4dCogcykKK3sKKyAgICB2b2lkICpsb2dfY3R4ID0gcy0+YXZjdHg7CisgICAgaW50IHJldDsKKworICAgIHMtPmZkID0gb3BlbihzLT5kZXZuYW1lLCBPX1JEV1IgfCBPX05PTkJMT0NLLCAwKTsKKyAgICBpZiAocy0+ZmQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CisKKyAgICByZXQgPSB2NGwyX3ByZXBhcmVfY29udGV4dHMocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfc2V0X2Zvcm1hdCgmcy0+b3V0cHV0KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJjYW4ndCBzZXQgdjRsMiBvdXRwdXQgZm9ybWF0XG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfc2V0X2Zvcm1hdCgmcy0+Y2FwdHVyZSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiY2FuJ3QgdG8gc2V0IHY0bDIgY2FwdHVyZSBmb3JtYXRcbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9pbml0KCZzLT5vdXRwdXQpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIm5vIHY0bDIgb3V0cHV0IGNvbnRleHQncyBidWZmZXJzXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBkZWNvZGVyJ3MgYnVmZmVycyBuZWVkIHRvIGJlIHVwZGF0ZWQgYXQgYSBsYXRlciBzdGFnZSAqLworICAgIGlmICghYXZfY29kZWNfaXNfZGVjb2RlcihzLT5hdmN0eC0+Y29kZWMpKSB7CisgICAgICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9pbml0KCZzLT5jYXB0dXJlKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIm5vIHY0bDIgY2FwdHVyZSBjb250ZXh0J3MgYnVmZmVyc1xuIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGlmIChjbG9zZShzLT5mZCkgPCAwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiZXJyb3IgY2xvc2luZyAlcyAoJXMpXG4iLAorICAgICAgICAgICAgcy0+ZGV2bmFtZSwgYXZfZXJyMnN0cihBVkVSUk9SKGVycm5vKSkpOworICAgIH0KKyAgICBzLT5mZCA9IC0xOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICAgICAgICAgICAgICAgVjRMMiBNMk0gSW50ZXJmYWNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBmZl92NGwyX20ybV9jb2RlY19yZWluaXQoVjRMMm0ybUNvbnRleHQqIHMpCit7CisgICAgaW50IHJldDsKKworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicmVpbml0IGNvbnRleHRcbiIpOworCisgICAgLyogMS4gc3RyZWFtb2ZmICovCisgICAgcmV0ID0gZmZfdjRsMl9jb250ZXh0X3NldF9zdGF0dXMoJnMtPmNhcHR1cmUsIFZJRElPQ19TVFJFQU1PRkYpOworICAgIGlmIChyZXQpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2FwdHVyZSBWSURJT0NfU1RSRUFNT0ZGXG4iKTsKKworICAgIC8qIDIuIHVubWFwIHRoZSBjYXB0dXJlIGJ1ZmZlcnMgKHY0bDIgYW5kIGZmbXBlZyk6CisgICAgICogICAgd2UgbXVzdCB3YWl0IGZvciBhbGwgcmVmZXJlbmNlcyB0byBiZSByZWxlYXNlZCBiZWZvcmUgYmVpbmcgYWxsb3dlZAorICAgICAqICAgIHRvIHF1ZXVlIG5ldyBidWZmZXJzLgorICAgICAqLworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAid2FpdGluZyBmb3IgdXNlciB0byByZWxlYXNlIEFWQnVmZmVyUmVmc1xuIik7CisgICAgaWYgKGF0b21pY19sb2FkKCZzLT5yZWZjb3VudCkpCisgICAgICAgIHdoaWxlKHNlbV93YWl0KCZzLT5yZWZzeW5jKSA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7CisKKyAgICBmZl92NGwyX2NvbnRleHRfcmVsZWFzZSgmcy0+Y2FwdHVyZSk7CisKKyAgICAvKiAzLiBnZXQgdGhlIG5ldyBjYXB0dXJlIGZvcm1hdCAqLworICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9nZXRfZm9ybWF0KCZzLT5jYXB0dXJlKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAicXVlcnkgdGhlIG5ldyBjYXB0dXJlIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogNC4gc2V0IHRoZSBjYXB0dXJlIGZvcm1hdCAqLworICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9zZXRfZm9ybWF0KCZzLT5jYXB0dXJlKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2V0dGluZyBjYXB0dXJlIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogNS4gY29tcGxldGUgcmVpbml0ICovCisgICAgcy0+ZHJhaW5pbmcgPSAwOworICAgIHMtPnJlaW5pdCA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3Y0bDJfbTJtX2NvZGVjX2Z1bGxfcmVpbml0KFY0TDJtMm1Db250ZXh0ICpzKQoreworICAgIHZvaWQgKmxvZ19jdHggPSBzLT5hdmN0eDsKKyAgICBpbnQgcmV0OworCisgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19ERUJVRywgIiVzIGZ1bGwgcmVpbml0XG4iLCBzLT5kZXZuYW1lKTsKKworICAgIC8qIHdhaXQgZm9yIHBlbmRpbmcgYnVmZmVyIHJlZmVyZW5jZXMgKi8KKyAgICBpZiAoYXRvbWljX2xvYWQoJnMtPnJlZmNvdW50KSkKKyAgICAgICAgd2hpbGUoc2VtX3dhaXQoJnMtPnJlZnN5bmMpID09IC0xICYmIGVycm5vID09IEVJTlRSKTsKKworICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9zZXRfc3RhdHVzKCZzLT5vdXRwdXQsIFZJRElPQ19TVFJFQU1PRkYpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgVklESU9DX1NUUkVBTU9GRlxuIik7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0ID0gZmZfdjRsMl9jb250ZXh0X3NldF9zdGF0dXMoJnMtPmNhcHR1cmUsIFZJRElPQ19TVFJFQU1PRkYpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2FwdHVyZSBWSURJT0NfU1RSRUFNT0ZGXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgLyogcmVsZWFzZSBhbmQgdW5tbWFwIHRoZSBidWZmZXJzICovCisgICAgZmZfdjRsMl9jb250ZXh0X3JlbGVhc2UoJnMtPm91dHB1dCk7CisgICAgZmZfdjRsMl9jb250ZXh0X3JlbGVhc2UoJnMtPmNhcHR1cmUpOworCisgICAgLyogc3RhcnQgYWdhaW4gbm93IHRoYXQgd2Uga25vdyB0aGUgc3RyZWFtIGRpbWVuc2lvbnMgKi8KKyAgICBzLT5kcmFpbmluZyA9IDA7CisgICAgcy0+cmVpbml0ID0gMDsKKworICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9nZXRfZm9ybWF0KCZzLT5vdXRwdXQpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19ERUJVRywgInY0bDIgb3V0cHV0IGZvcm1hdCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfZ2V0X2Zvcm1hdCgmcy0+Y2FwdHVyZSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0RFQlVHLCAidjRsMiBjYXB0dXJlIGZvcm1hdCBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfc2V0X2Zvcm1hdCgmcy0+b3V0cHV0KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJjYW4ndCBzZXQgdjRsMiBvdXRwdXQgZm9ybWF0XG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfc2V0X2Zvcm1hdCgmcy0+Y2FwdHVyZSk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiY2FuJ3QgdG8gc2V0IHY0bDIgY2FwdHVyZSBmb3JtYXRcbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9pbml0KCZzLT5vdXRwdXQpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIm5vIHY0bDIgb3V0cHV0IGNvbnRleHQncyBidWZmZXJzXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvKiBkZWNvZGVyJ3MgYnVmZmVycyBuZWVkIHRvIGJlIHVwZGF0ZWQgYXQgYSBsYXRlciBzdGFnZSAqLworICAgIGlmICghYXZfY29kZWNfaXNfZGVjb2RlcihzLT5hdmN0eC0+Y29kZWMpKSB7CisgICAgICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9pbml0KCZzLT5jYXB0dXJlKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIm5vIHY0bDIgY2FwdHVyZSBjb250ZXh0J3MgYnVmZmVyc1xuIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHY0bDJfbTJtX2Rlc3Ryb3lfY29udGV4dCh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmNvbnRleHQpCit7CisgICAgVjRMMm0ybUNvbnRleHQgKnMgPSAoVjRMMm0ybUNvbnRleHQqKWNvbnRleHQ7CisKKyAgICBmZl92NGwyX2NvbnRleHRfcmVsZWFzZSgmcy0+Y2FwdHVyZSk7CisgICAgc2VtX2Rlc3Ryb3koJnMtPnJlZnN5bmMpOworCisgICAgY2xvc2Uocy0+ZmQpOworCisgICAgYXZfZnJlZShzKTsKK30KKworaW50IGZmX3Y0bDJfbTJtX2NvZGVjX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVjRMMm0ybVByaXYgKnByaXYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFY0TDJtMm1Db250ZXh0KiBzID0gcHJpdi0+Y29udGV4dDsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfdjRsMl9jb250ZXh0X3NldF9zdGF0dXMoJnMtPm91dHB1dCwgVklESU9DX1NUUkVBTU9GRik7CisgICAgaWYgKHJldCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVklESU9DX1NUUkVBTU9GRiAlc1xuIiwgcy0+b3V0cHV0Lm5hbWUpOworCisgICAgcmV0ID0gZmZfdjRsMl9jb250ZXh0X3NldF9zdGF0dXMoJnMtPmNhcHR1cmUsIFZJRElPQ19TVFJFQU1PRkYpOworICAgIGlmIChyZXQpCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVklESU9DX1NUUkVBTU9GRiAlc1xuIiwgcy0+Y2FwdHVyZS5uYW1lKTsKKworICAgIGZmX3Y0bDJfY29udGV4dF9yZWxlYXNlKCZzLT5vdXRwdXQpOworCisgICAgcy0+c2VsZl9yZWYgPSBOVUxMOworICAgIGF2X2J1ZmZlcl91bnJlZigmcHJpdi0+Y29udGV4dF9yZWYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl92NGwyX20ybV9jb2RlY19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgIHN0cnVjdCBkaXJlbnQgKmVudHJ5OworICAgIGNoYXIgbm9kZVtQQVRIX01BWF07CisgICAgRElSICpkaXJwOworCisgICAgVjRMMm0ybUNvbnRleHQgKnMgPSAoKFY0TDJtMm1Qcml2KilhdmN0eC0+cHJpdl9kYXRhKS0+Y29udGV4dDsKKyAgICBzLT5hdmN0eCA9IGF2Y3R4OworCisgICAgZGlycCA9IG9wZW5kaXIoIi9kZXYiKTsKKyAgICBpZiAoIWRpcnApCisgICAgICAgIHJldHVybiBBVkVSUk9SKGVycm5vKTsKKworICAgIGZvciAoZW50cnkgPSByZWFkZGlyKGRpcnApOyBlbnRyeTsgZW50cnkgPSByZWFkZGlyKGRpcnApKSB7CisKKyAgICAgICAgaWYgKHN0cm5jbXAoZW50cnktPmRfbmFtZSwgInZpZGVvIiwgNSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzbnByaW50Zihub2RlLCBzaXplb2Yobm9kZSksICIvZGV2LyVzIiwgZW50cnktPmRfbmFtZSk7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAicHJvYmluZyBkZXZpY2UgJXNcbiIsIG5vZGUpOworICAgICAgICBzdHJuY3B5KHMtPmRldm5hbWUsIG5vZGUsIHN0cmxlbihub2RlKSArIDEpOworICAgICAgICByZXQgPSB2NGwyX3Byb2JlX2RyaXZlcihzKTsKKyAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2xvc2VkaXIoZGlycCk7CisKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgYSB2YWxpZCBkZXZpY2VcbiIpOworICAgICAgICBtZW1zZXQocy0+ZGV2bmFtZSwgMCwgc2l6ZW9mKHMtPmRldm5hbWUpKTsKKworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0lORk8sICJVc2luZyBkZXZpY2UgJXNcbiIsIG5vZGUpOworCisgICAgcmV0dXJuIHY0bDJfY29uZmlndXJlX2NvbnRleHRzKHMpOworfQorCitpbnQgZmZfdjRsMl9tMm1fY3JlYXRlX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWNEwybTJtQ29udGV4dCAqKnMpCit7CisgICAgVjRMMm0ybVByaXYgKnByaXYgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgKnMgPSBhdl9tYWxsb2N6KHNpemVvZihWNEwybTJtQ29udGV4dCkpOworICAgIGlmICghKnMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBwcml2LT5jb250ZXh0X3JlZiA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QgKikgKnMsIHNpemVvZihWNEwybTJtQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2NGwyX20ybV9kZXN0cm95X2NvbnRleHQsIE5VTEwsIDApOworICAgIGlmICghcHJpdi0+Y29udGV4dF9yZWYpIHsKKyAgICAgICAgYXZfZnJlZXAocyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgLyogYXNzaWduIHRoZSBjb250ZXh0ICovCisgICAgcHJpdi0+Y29udGV4dCA9ICpzOworCisgICAgLyogcG9wdWxhdGUgaXQgKi8KKyAgICBwcml2LT5jb250ZXh0LT5jYXB0dXJlLm51bV9idWZmZXJzID0gcHJpdi0+bnVtX2NhcHR1cmVfYnVmZmVyczsKKyAgICBwcml2LT5jb250ZXh0LT5vdXRwdXQubnVtX2J1ZmZlcnMgID0gcHJpdi0+bnVtX291dHB1dF9idWZmZXJzOworICAgIHByaXYtPmNvbnRleHQtPnNlbGZfcmVmID0gcHJpdi0+Y29udGV4dF9yZWY7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdjRsMl9tMm0uaCBiL2xpYmF2Y29kZWMvdjRsMl9tMm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ2NzFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92NGwyX20ybS5oCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogVjRMMiBtZW0ybWVtIGhlbHBlciBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQWxleGlzIEJhbGxpZXIgPGFiYWxsaWVyQGdlbnRvby5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgSm9yZ2UgUmFtaXJleiA8am9yZ2UucmFtaXJlei1vcnRpekBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVjRMMl9NMk1fSAorI2RlZmluZSBBVkNPREVDX1Y0TDJfTTJNX0gKKworI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAidjRsMl9jb250ZXh0LmgiCisKKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoeyBcCisgICAgICAgIGNvbnN0IF9fdHlwZW9mX18oKCh0eXBlICopMCktPm1lbWJlciApICpfX21wdHIgPSAocHRyKTsgXAorICAgICAgICAodHlwZSAqKSgoY2hhciAqKV9fbXB0ciAtIG9mZnNldG9mKHR5cGUsbWVtYmVyKSApO30pCisKKyNkZWZpbmUgVjRMX00yTV9ERUZBVUxUX09QVFMgXAorICAgIHsgIm51bV9vdXRwdXRfYnVmZmVycyIsICJOdW1iZXIgb2YgYnVmZmVycyBpbiB0aGUgb3V0cHV0IGNvbnRleHQiLFwKKyAgICAgICAgT0ZGU0VUKG51bV9vdXRwdXRfYnVmZmVycyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMTYgfSwgNiwgSU5UX01BWCwgRkxBR1MgfQorCit0eXBlZGVmIHN0cnVjdCBWNEwybTJtQ29udGV4dCB7CisgICAgY2hhciBkZXZuYW1lW1BBVEhfTUFYXTsKKyAgICBpbnQgZmQ7CisKKyAgICAvKiB0aGUgY29kZWMgY29udGV4dCBxdWV1ZXMgKi8KKyAgICBWNEwyQ29udGV4dCBjYXB0dXJlOworICAgIFY0TDJDb250ZXh0IG91dHB1dDsKKworICAgIC8qIGR5bmFtaWMgc3RyZWFtIHJlY29uZmlnICovCisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIHNlbV90IHJlZnN5bmM7CisgICAgYXRvbWljX3VpbnQgcmVmY291bnQ7CisgICAgaW50IHJlaW5pdDsKKworICAgIC8qIG51bGwgZnJhbWUvcGFja2V0IHJlY2VpdmVkICovCisgICAgaW50IGRyYWluaW5nOworCisgICAgLyogUmVmZXJlbmNlIHRvIHNlbGY7IG9ubHkgdmFsaWQgd2hpbGUgY29kZWMgaXMgYWN0aXZlLiAqLworICAgIEFWQnVmZmVyUmVmICpzZWxmX3JlZjsKK30gVjRMMm0ybUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFY0TDJtMm1Qcml2Cit7CisgICAgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBWNEwybTJtQ29udGV4dCAqY29udGV4dDsKKyAgICBBVkJ1ZmZlclJlZiAgICAqY29udGV4dF9yZWY7CisKKyAgICBpbnQgbnVtX291dHB1dF9idWZmZXJzOworICAgIGludCBudW1fY2FwdHVyZV9idWZmZXJzOworfSBWNEwybTJtUHJpdjsKKworLyoqCisgKiBBbGxvY2F0ZSBhIG5ldyBjb250ZXh0IGFuZCByZWZlcmVuY2VzIGZvciBhIFY0TDIgTTJNIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbVtpbl0gY3R4IFRoZSBBVkNvZGVjQ29udGV4dCBpbnN0YW50aWF0ZWQgYnkgdGhlIGVuY29kZXIvZGVjb2Rlci4KKyAqIEBwYXJhbVtvdXRdIGN0eCBUaGUgVjRMMm0ybUNvbnRleHQuCisgKgorICogQHJldHVybnMgMCBpbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICovCitpbnQgZmZfdjRsMl9tMm1fY3JlYXRlX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWNEwybTJtQ29udGV4dCAqKnMpOworCisKKy8qKgorICogUHJvYmVzIHRoZSB2aWRlbyBub2RlcyBsb29raW5nIGZvciB0aGUgcmVxdWlyZWQgY29kZWMgY2FwYWJpbGl0aWVzLgorICoKKyAqIEBwYXJhbVtpbl0gY3R4IFRoZSBBVkNvZGVjQ29udGV4dCBpbnN0YW50aWF0ZWQgYnkgdGhlIGVuY29kZXIvZGVjb2Rlci4KKyAqCisgKiBAcmV0dXJucyAwIGlmIGEgZHJpdmVyIGlzIGZvdW5kLCBhIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UuCisgKi8KK2ludCBmZl92NGwyX20ybV9jb2RlY19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKy8qKgorICogUmVsZWFzZXMgYWxsIHRoZSBjb2RlYyByZXNvdXJjZXMgaWYgYWxsIEFWQnVmZmVyUmVmcyBoYXZlIGJlZW4gcmV0dXJuZWQgdG8gdGhlCisgKiBjdHguIE90aGVyd2lzZSBrZWVwIHRoZSBkcml2ZXIgb3Blbi4KKyAqCisgKiBAcGFyYW1baW5dIFRoZSBBVkNvZGVjQ29udGV4dCBpbnN0YW50aWF0ZWQgYnkgdGhlIGVuY29kZXIvZGVjb2Rlci4KKyAqCisgKiBAcmV0dXJucyAwCisgKgorICovCitpbnQgZmZfdjRsMl9tMm1fY29kZWNfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKy8qKgorICogUmVpbml0aWFsaXplcyB0aGUgVjRMMm0ybUNvbnRleHQgd2hlbiB0aGUgZHJpdmVyIGNhbm5vdCBjb250aW51ZSBwcm9jZXNzaW5nCisgKiB3aXRoIHRoZSBjYXB0dXJlIHBhcmFtZXRlcnMuCisgKgorICogQHBhcmFtW2luXSBjdHggVGhlIFY0TDJtMm1Db250ZXh0IGluc3RhbnRpYXRlZCBieSB0aGUgZW5jb2Rlci9kZWNvZGVyLgorICoKKyAqIEByZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBuZWdhdGl2ZSBudW1iZXIgb3RoZXJ3aXNlCisgKi8KK2ludCBmZl92NGwyX20ybV9jb2RlY19yZWluaXQoVjRMMm0ybUNvbnRleHQgKmN0eCk7CisKKy8qKgorICogUmVpbml0aWFsaXplcyB0aGUgVjRMMm0ybUNvbnRleHQgd2hlbiB0aGUgZHJpdmVyIGNhbm5vdCBjb250aW51ZSBwcm9jZXNzaW5nCisgKiB3aXRoIHRoZSAgYW55IG9mIHRoZSBjdXJyZW50IFY0TDJDb250ZXh0cyAoaWUsIGNoYW5nZXMgaW4gb3V0cHV0IGFuZCBjYXB0dXJlKS4KKyAqCisgKiBAcGFyYW1baW5dIGN0eCBUaGUgVjRMMm0ybUNvbnRleHQgaW5zdGFudGlhdGVkIGJ5IHRoZSBlbmNvZGVyL2RlY29kZXIuCisgKgorICogQHJldHVybnMgMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5lZ2F0aXZlIG51bWJlciBvdGhlcndpc2UKKyAqLworaW50IGZmX3Y0bDJfbTJtX2NvZGVjX2Z1bGxfcmVpbml0KFY0TDJtMm1Db250ZXh0ICpjdHgpOworCisjZW5kaWYgLyogQVZDT0RFQ19WNEwyX00yTV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Y0bDJfbTJtX2RlYy5jIGIvbGliYXZjb2RlYy92NGwyX20ybV9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E0NWJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92NGwyX20ybV9kZWMuYwpAQCAtMCwwICsxLDIzNiBAQAorLyoKKyAqIFY0TDIgbWVtMm1lbSBkZWNvZGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBKb3JnZSBSYW1pcmV6IDxqb3JnZS5yYW1pcmV6LW9ydGl6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kZWNvZGUuaCIKKworI2luY2x1ZGUgInY0bDJfY29udGV4dC5oIgorI2luY2x1ZGUgInY0bDJfbTJtLmgiCisjaW5jbHVkZSAidjRsMl9mbXQuaCIKKworc3RhdGljIGludCB2NGwyX3RyeV9zdGFydChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVjRMMm0ybUNvbnRleHQgKnMgPSAoKFY0TDJtMm1Qcml2KilhdmN0eC0+cHJpdl9kYXRhKS0+Y29udGV4dDsKKyAgICBWNEwyQ29udGV4dCAqY29uc3QgY2FwdHVyZSA9ICZzLT5jYXB0dXJlOworICAgIFY0TDJDb250ZXh0ICpjb25zdCBvdXRwdXQgPSAmcy0+b3V0cHV0OworICAgIHN0cnVjdCB2NGwyX3NlbGVjdGlvbiBzZWxlY3Rpb247CisgICAgaW50IHJldDsKKworICAgIC8qIDEuIHN0YXJ0IHRoZSBvdXRwdXQgcHJvY2VzcyAqLworICAgIGlmICghb3V0cHV0LT5zdHJlYW1vbikgeworICAgICAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfc2V0X3N0YXR1cyhvdXRwdXQsIFZJRElPQ19TVFJFQU1PTik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlZJRElPQ19TVFJFQU1PTiBvbiBvdXRwdXQgY29udGV4dFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNhcHR1cmUtPnN0cmVhbW9uKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8qIDIuIGdldCB0aGUgY2FwdHVyZSBmb3JtYXQgKi8KKyAgICBjYXB0dXJlLT5mb3JtYXQudHlwZSA9IGNhcHR1cmUtPnR5cGU7CisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIFZJRElPQ19HX0ZNVCwgJmNhcHR1cmUtPmZvcm1hdCk7CisgICAgaWYgKHJldCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVklESU9DX0dfRk1UIGlvY3RsXG4iKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiAyLjEgdXBkYXRlIHRoZSBBVkNvZGVjQ29udGV4dCAqLworICAgIGF2Y3R4LT5waXhfZm10ID0gZmZfdjRsMl9mb3JtYXRfdjRsMl90b19hdmZtdChjYXB0dXJlLT5mb3JtYXQuZm10LnBpeF9tcC5waXhlbGZvcm1hdCwgQVZfQ09ERUNfSURfUkFXVklERU8pOworICAgIGNhcHR1cmUtPmF2X3BpeF9mbXQgPSBhdmN0eC0+cGl4X2ZtdDsKKworICAgIC8qIDMuIHNldCB0aGUgY3JvcCBwYXJhbWV0ZXJzICovCisgICAgc2VsZWN0aW9uLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisgICAgc2VsZWN0aW9uLnIuaGVpZ2h0ID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBzZWxlY3Rpb24uci53aWR0aCA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICByZXQgPSBpb2N0bChzLT5mZCwgVklESU9DX1NfU0VMRUNUSU9OLCAmc2VsZWN0aW9uKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgICByZXQgPSBpb2N0bChzLT5mZCwgVklESU9DX0dfU0VMRUNUSU9OLCAmc2VsZWN0aW9uKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlZJRElPQ19HX1NFTEVDVElPTiBpb2N0bFxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImNyb3Agb3V0cHV0ICVkeCVkXG4iLCBzZWxlY3Rpb24uci53aWR0aCwgc2VsZWN0aW9uLnIuaGVpZ2h0KTsKKyAgICAgICAgICAgIC8qIHVwZGF0ZSB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0aW5nIGZyYW1lICovCisgICAgICAgICAgICBjYXB0dXJlLT5oZWlnaHQgPSBzZWxlY3Rpb24uci5oZWlnaHQ7CisgICAgICAgICAgICBjYXB0dXJlLT53aWR0aCAgPSBzZWxlY3Rpb24uci53aWR0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIDQuIGluaXQgdGhlIGNhcHR1cmUgY29udGV4dCBub3cgdGhhdCB3ZSBoYXZlIHRoZSBjYXB0dXJlIGZvcm1hdCAqLworICAgIGlmICghY2FwdHVyZS0+YnVmZmVycykgeworICAgICAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfaW5pdChjYXB0dXJlKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJjYW4ndCByZXF1ZXN0IG91dHB1dCBidWZmZXJzXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiA1LiBzdGFydCB0aGUgY2FwdHVyZSBwcm9jZXNzICovCisgICAgcmV0ID0gZmZfdjRsMl9jb250ZXh0X3NldF9zdGF0dXMoY2FwdHVyZSwgVklESU9DX1NUUkVBTU9OKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVklESU9DX1NUUkVBTU9OLCBvbiBjYXB0dXJlIGNvbnRleHRcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bDJfcHJlcGFyZV9kZWNvZGVyKFY0TDJtMm1Db250ZXh0ICpzKQoreworICAgIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiBzdWI7CisgICAgVjRMMkNvbnRleHQgKm91dHB1dCA9ICZzLT5vdXRwdXQ7CisgICAgaW50IHJldDsKKworICAgIC8qKgorICAgICAqIHJlcXVpcmVtZW50cworICAgICAqLworICAgIG1lbXNldCgmc3ViLCAwLCBzaXplb2Yoc3ViKSk7CisgICAgc3ViLnR5cGUgPSBWNEwyX0VWRU5UX1NPVVJDRV9DSEFOR0U7CisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIFZJRElPQ19TVUJTQ1JJQkVfRVZFTlQsICZzdWIpOworICAgIGlmICggcmV0IDwgMCkgeworICAgICAgICBpZiAob3V0cHV0LT5oZWlnaHQgPT0gMCB8fCBvdXRwdXQtPndpZHRoID09IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJ0aGUgdjRsMiBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBWSURJT0NfU1VCU0NSSUJFX0VWRU5UXG4iCisgICAgICAgICAgICAgICAgInlvdSBtdXN0IHByb3ZpZGUgY29kZWNfaGVpZ2h0IGFuZCBjb2RlY193aWR0aCBvbiBpbnB1dFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdjRsMl9yZWNlaXZlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgVjRMMm0ybUNvbnRleHQgKnMgPSAoKFY0TDJtMm1Qcml2KilhdmN0eC0+cHJpdl9kYXRhKS0+Y29udGV4dDsKKyAgICBWNEwyQ29udGV4dCAqY29uc3QgY2FwdHVyZSA9ICZzLT5jYXB0dXJlOworICAgIFY0TDJDb250ZXh0ICpjb25zdCBvdXRwdXQgPSAmcy0+b3V0cHV0OworICAgIEFWUGFja2V0IGF2cGt0ID0gezB9OworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZl9kZWNvZGVfZ2V0X3BhY2tldChhdmN0eCwgJmF2cGt0KTsKKyAgICBpZiAocmV0IDwgMCAmJiByZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+ZHJhaW5pbmcpCisgICAgICAgIGdvdG8gZGVxdWV1ZTsKKworICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9lbnF1ZXVlX3BhY2tldChvdXRwdXQsICZhdnBrdCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVOT01FTSkpCisgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIC8qIG5vIGlucHV0IGJ1ZmZlcnMgYXZhaWxhYmxlLCBjb250aW51ZSBkZXF1ZWluZyAqLworICAgIH0KKworICAgIGlmIChhdnBrdC5zaXplKSB7CisgICAgICAgIHJldCA9IHY0bDJfdHJ5X3N0YXJ0KGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworZGVxdWV1ZToKKyAgICByZXR1cm4gZmZfdjRsMl9jb250ZXh0X2RlcXVldWVfZnJhbWUoY2FwdHVyZSwgZnJhbWUpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdjRsMl9kZWNvZGVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVjRMMkNvbnRleHQgKmNhcHR1cmUsICpvdXRwdXQ7CisgICAgVjRMMm0ybUNvbnRleHQgKnM7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3Y0bDJfbTJtX2NyZWF0ZV9jb250ZXh0KGF2Y3R4LCAmcyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBjYXB0dXJlID0gJnMtPmNhcHR1cmU7CisgICAgb3V0cHV0ID0gJnMtPm91dHB1dDsKKworICAgIC8qIGlmIHRoZXNlIGRpbWVuc2lvbnMgYXJlIGludmFsaWQgKGllLCAwIG9yIHRvbyBzbWFsbCkgYW4gZXZlbnQgd2lsbCBiZSByYWlzZWQKKyAgICAgKiBieSB0aGUgdjRsMiBkcml2ZXI7IHRoaXMgZXZlbnQgd2lsbCB0cmlnZ2VyIGEgZnVsbCBwaXBlbGluZSByZWNvbmZpZyBhbmQKKyAgICAgKiB0aGUgcHJvcGVyIHZhbHVlcyB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBrZXJuZWwgZHJpdmVyLgorICAgICAqLworICAgIG91dHB1dC0+aGVpZ2h0ID0gY2FwdHVyZS0+aGVpZ2h0ID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBvdXRwdXQtPndpZHRoID0gY2FwdHVyZS0+d2lkdGggPSBhdmN0eC0+Y29kZWRfd2lkdGg7CisKKyAgICBvdXRwdXQtPmF2X2NvZGVjX2lkID0gYXZjdHgtPmNvZGVjX2lkOworICAgIG91dHB1dC0+YXZfcGl4X2ZtdCAgPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICBjYXB0dXJlLT5hdl9jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIGNhcHR1cmUtPmF2X3BpeF9mbXQgPSBhdmN0eC0+cGl4X2ZtdDsKKworICAgIHJldCA9IGZmX3Y0bDJfbTJtX2NvZGVjX2luaXQoYXZjdHgpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJjYW4ndCBjb25maWd1cmUgZGVjb2RlclxuIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHY0bDJfcHJlcGFyZV9kZWNvZGVyKHMpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihWNEwybTJtUHJpdiwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIFY0TF9NMk1fREVGQVVMVF9PUFRTLAorICAgIHsgIm51bV9jYXB0dXJlX2J1ZmZlcnMiLCAiTnVtYmVyIG9mIGJ1ZmZlcnMgaW4gdGhlIGNhcHR1cmUgY29udGV4dCIsCisgICAgICAgIE9GRlNFVChudW1fY2FwdHVyZV9idWZmZXJzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDIwfSwgMjAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMfSwKK307CisKKyNkZWZpbmUgTTJNREVDKE5BTUUsIExPTkdOQU1FLCBDT0RFQywgYnNmX25hbWUpIFwKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHY0bDJfbTJtXyAjIyBOQU1FICMjIF9kZWNfY2xhc3MgPSB7XAorICAgIC5jbGFzc19uYW1lID0gI05BTUUgIl92NGwyX20ybV9kZWNvZGVyIixcCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSxcCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLFwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCxcCit9O1wKK1wKK0FWQ29kZWMgZmZfICMjIE5BTUUgIyMgX3Y0bDJtMm1fZGVjb2RlciA9IHsgXAorICAgIC5uYW1lICAgICAgICAgICA9ICNOQU1FICJfdjRsMm0ybSIgLFwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVjRMMiBtZW0ybWVtICIgTE9OR05BTUUgIiBkZWNvZGVyIHdyYXBwZXIiKSxcCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLFwKKyAgICAuaWQgICAgICAgICAgICAgPSBDT0RFQyAsXAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWNEwybTJtUHJpdiksXAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ2NGwyX20ybV8gIyMgTkFNRSAjIyBfZGVjX2NsYXNzLFwKKyAgICAuaW5pdCAgICAgICAgICAgPSB2NGwyX2RlY29kZV9pbml0LFwKKyAgICAucmVjZWl2ZV9mcmFtZSAgPSB2NGwyX3JlY2VpdmVfZnJhbWUsXAorICAgIC5jbG9zZSAgICAgICAgICA9IGZmX3Y0bDJfbTJtX2NvZGVjX2VuZCxcCisgICAgLmJzZnMgICAgICAgICAgID0gYnNmX25hbWUsIFwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfSEFSRFdBUkUgfCBBVl9DT0RFQ19DQVBfREVMQVksIFwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAidjRsMm0ybSIsIFwKK307CisKK00yTURFQyhoMjY0LCAgIkguMjY0IiwgQVZfQ09ERUNfSURfSDI2NCwgICAgICAgImgyNjRfbXA0dG9hbm5leGIiKTsKK00yTURFQyhoZXZjLCAgIkhFVkMiLCAgQVZfQ09ERUNfSURfSEVWQywgICAgICAgImhldmNfbXA0dG9hbm5leGIiKTsKK00yTURFQyhtcGVnMSwgIk1QRUcxIiwgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgTlVMTCk7CitNMk1ERUMobXBlZzIsICJNUEVHMiIsIEFWX0NPREVDX0lEX01QRUcyVklERU8sIE5VTEwpOworTTJNREVDKG1wZWc0LCAiTVBFRzQiLCBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICBOVUxMKTsKK00yTURFQyhoMjYzLCAgIkguMjYzIiwgQVZfQ09ERUNfSURfSDI2MywgICAgICAgTlVMTCk7CitNMk1ERUModmMxICwgICJWQzEiLCAgIEFWX0NPREVDX0lEX1ZDMSwgICAgICAgIE5VTEwpOworTTJNREVDKHZwOCwgICAiVlA4IiwgICBBVl9DT0RFQ19JRF9WUDgsICAgICAgICBOVUxMKTsKK00yTURFQyh2cDksICAgIlZQOSIsICAgQVZfQ09ERUNfSURfVlA5LCAgICAgICAgTlVMTCk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3Y0bDJfbTJtX2VuYy5jIGIvbGliYXZjb2RlYy92NGwyX20ybV9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzllYTFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92NGwyX20ybV9lbmMuYwpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIFY0TDIgbWVtMm1lbSBlbmNvZGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBbGV4aXMgQmFsbGllciA8YWJhbGxpZXJAZ2VudG9vLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAxNyBKb3JnZSBSYW1pcmV6IDxqb3JnZS5yYW1pcmV6LW9ydGl6QGxpbmFyby5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzZWFyY2guaD4KKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAidjRsMl9jb250ZXh0LmgiCisjaW5jbHVkZSAidjRsMl9tMm0uaCIKKworI2RlZmluZSBNUEVHX0NJRCh4KSBWNEwyX0NJRF9NUEVHX1ZJREVPXyMjeAorI2RlZmluZSBNUEVHX1ZJREVPKHgpIFY0TDJfTVBFR19WSURFT18jI3gKKworc3RhdGljIGlubGluZSB2b2lkIHY0bDJfc2V0X3RpbWVwZXJmcmFtZShWNEwybTJtQ29udGV4dCAqcywgdW5zaWduZWQgaW50IG51bSwgdW5zaWduZWQgaW50IGRlbikKK3sKKyAgICBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHBhcm0gPSB7IDAgfTsKKworICAgIHBhcm0udHlwZSA9IFY0TDJfVFlQRV9JU19NVUxUSVBMQU5BUihzLT5vdXRwdXQudHlwZSkgPyBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUgOiBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKyAgICBwYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvciA9IGRlbjsKKyAgICBwYXJtLnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPSBudW07CisKKyAgICBpZiAoaW9jdGwocy0+ZmQsIFZJRElPQ19TX1BBUk0sICZwYXJtKSA8IDApCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gc2V0IHRpbWVwZXJmcmFtZSIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdjRsMl9zZXRfZXh0X2N0cmwoVjRMMm0ybUNvbnRleHQgKnMsIHVuc2lnbmVkIGludCBpZCwgc2lnbmVkIGludCB2YWx1ZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgY3RybHMgPSB7IDAgfTsKKyAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCBjdHJsID0geyAwIH07CisKKyAgICAvKiBzZXQgY3RybHMgKi8KKyAgICBjdHJscy5jdHJsX2NsYXNzID0gVjRMMl9DVFJMX0NMQVNTX01QRUc7CisgICAgY3RybHMuY29udHJvbHMgPSAmY3RybDsKKyAgICBjdHJscy5jb3VudCA9IDE7CisKKyAgICAvKiBzZXQgY3RybCovCisgICAgY3RybC52YWx1ZSA9IHZhbHVlOworICAgIGN0cmwuaWQgPSBpZCA7CisKKyAgICBpZiAoaW9jdGwocy0+ZmQsIFZJRElPQ19TX0VYVF9DVFJMUywgJmN0cmxzKSA8IDApCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gc2V0ICVzXG4iLCBuYW1lKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiRW5jb2RlcjogJXMgPSAlZFxuIiwgbmFtZSwgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCB2NGwyX2dldF9leHRfY3RybChWNEwybTJtQ29udGV4dCAqcywgdW5zaWduZWQgaW50IGlkLCBzaWduZWQgaW50ICp2YWx1ZSwgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgY3RybHMgPSB7IDAgfTsKKyAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCBjdHJsID0geyAwIH07CisgICAgaW50IHJldDsKKworICAgIC8qIHNldCBjdHJscyAqLworICAgIGN0cmxzLmN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfQ0xBU1NfTVBFRzsKKyAgICBjdHJscy5jb250cm9scyA9ICZjdHJsOworICAgIGN0cmxzLmNvdW50ID0gMTsKKworICAgIC8qIHNldCBjdHJsKi8KKyAgICBjdHJsLmlkID0gaWQgOworCisgICAgcmV0ID0gaW9jdGwocy0+ZmQsIFZJRElPQ19HX0VYVF9DVFJMUywgJmN0cmxzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIHNldCAlc1xuIiwgbmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgKnZhbHVlID0gY3RybC52YWx1ZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB2NGwyX2gyNjRfcHJvZmlsZV9mcm9tX2ZmKGludCBwKQoreworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaDI2NF9wcm9maWxlICB7CisgICAgICAgIHVuc2lnbmVkIGludCBmZm1wZWdfdmFsOworICAgICAgICB1bnNpZ25lZCBpbnQgdjRsMl92YWw7CisgICAgfSBwcm9maWxlW10gPSB7CisgICAgICAgIHsgRkZfUFJPRklMRV9IMjY0X0NPTlNUUkFJTkVEX0JBU0VMSU5FLCBNUEVHX1ZJREVPKEgyNjRfUFJPRklMRV9DT05TVFJBSU5FRF9CQVNFTElORSkgfSwKKyAgICAgICAgeyBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDRfUFJFRElDVElWRSwgTVBFR19WSURFTyhIMjY0X1BST0ZJTEVfSElHSF80NDRfUFJFRElDVElWRSkgfSwKKyAgICAgICAgeyBGRl9QUk9GSUxFX0gyNjRfSElHSF80MjJfSU5UUkEsIE1QRUdfVklERU8oSDI2NF9QUk9GSUxFX0hJR0hfNDIyX0lOVFJBKSB9LAorICAgICAgICB7IEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9JTlRSQSwgTVBFR19WSURFTyhIMjY0X1BST0ZJTEVfSElHSF80NDRfSU5UUkEpIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfMTBfSU5UUkEsIE1QRUdfVklERU8oSDI2NF9QUk9GSUxFX0hJR0hfMTBfSU5UUkEpIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfNDIyLCBNUEVHX1ZJREVPKEgyNjRfUFJPRklMRV9ISUdIXzQyMikgfSwKKyAgICAgICAgeyBGRl9QUk9GSUxFX0gyNjRfQkFTRUxJTkUsIE1QRUdfVklERU8oSDI2NF9QUk9GSUxFX0JBU0VMSU5FKSB9LAorICAgICAgICB7IEZGX1BST0ZJTEVfSDI2NF9FWFRFTkRFRCwgTVBFR19WSURFTyhIMjY0X1BST0ZJTEVfRVhURU5ERUQpIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0hfMTAsIE1QRUdfVklERU8oSDI2NF9QUk9GSUxFX0hJR0hfMTApIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9IMjY0X01BSU4sIE1QRUdfVklERU8oSDI2NF9QUk9GSUxFX01BSU4pIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9IMjY0X0hJR0gsIE1QRUdfVklERU8oSDI2NF9QUk9GSUxFX0hJR0gpIH0sCisgICAgfTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhwcm9maWxlKTsgaSsrKSB7CisgICAgICAgIGlmIChwcm9maWxlW2ldLmZmbXBlZ192YWwgPT0gcCkKKyAgICAgICAgICAgIHJldHVybiBwcm9maWxlW2ldLnY0bDJfdmFsOworICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOworfQorCitzdGF0aWMgaW5saW5lIGludCB2NGwyX21wZWc0X3Byb2ZpbGVfZnJvbV9mZihpbnQgcCkKK3sKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IG1wZWc0X3Byb2ZpbGUgeworICAgICAgICB1bnNpZ25lZCBpbnQgZmZtcGVnX3ZhbDsKKyAgICAgICAgdW5zaWduZWQgaW50IHY0bDJfdmFsOworICAgIH0gcHJvZmlsZVtdID0geworICAgICAgICB7IEZGX1BST0ZJTEVfTVBFRzRfQURWQU5DRURfQ09ESU5HLCBNUEVHX1ZJREVPKE1QRUc0X1BST0ZJTEVfQURWQU5DRURfQ09ESU5HX0VGRklDSUVOQ1kpIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9TSU1QTEUsIE1QRUdfVklERU8oTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9TSU1QTEUpIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9NUEVHNF9TSU1QTEVfU0NBTEFCTEUsIE1QRUdfVklERU8oTVBFRzRfUFJPRklMRV9TSU1QTEVfU0NBTEFCTEUpIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9NUEVHNF9TSU1QTEUsIE1QRUdfVklERU8oTVBFRzRfUFJPRklMRV9TSU1QTEUpIH0sCisgICAgICAgIHsgRkZfUFJPRklMRV9NUEVHNF9DT1JFLCBNUEVHX1ZJREVPKE1QRUc0X1BST0ZJTEVfQ09SRSkgfSwKKyAgICB9OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHByb2ZpbGUpOyBpKyspIHsKKyAgICAgICAgaWYgKHByb2ZpbGVbaV0uZmZtcGVnX3ZhbCA9PSBwKQorICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVbaV0udjRsMl92YWw7CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SKEVOT0VOVCk7Cit9CisKK3N0YXRpYyBpbnQgdjRsMl9jaGVja19iX2ZyYW1lX3N1cHBvcnQoVjRMMm0ybUNvbnRleHQgKnMpCit7CisgICAgaWYgKHMtPmF2Y3R4LT5tYXhfYl9mcmFtZXMpCisgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJFbmNvZGVyIGRvZXMgbm90IHN1cHBvcnQgYi1mcmFtZXMgeWV0XG4iKTsKKworICAgIHY0bDJfc2V0X2V4dF9jdHJsKHMsIE1QRUdfQ0lEKEJfRlJBTUVTKSwgMCwgIm51bWJlciBvZiBCLWZyYW1lcyIpOworICAgIHY0bDJfZ2V0X2V4dF9jdHJsKHMsIE1QRUdfQ0lEKEJfRlJBTUVTKSwgJnMtPmF2Y3R4LT5tYXhfYl9mcmFtZXMsICJudW1iZXIgb2YgQi1mcmFtZXMiKTsKKyAgICBpZiAocy0+YXZjdHgtPm1heF9iX2ZyYW1lcyA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMtPmF2Y3R4LCAiRFRTL1BUUyBjYWxjdWxhdGlvbiBmb3IgVjRMMiBlbmNvZGluZyIpOworCisgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworfQorCitzdGF0aWMgaW50IHY0bDJfcHJlcGFyZV9lbmNvZGVyKFY0TDJtMm1Db250ZXh0ICpzKQoreworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPmF2Y3R4OworICAgIGludCBxbWluX2NpZCwgcW1heF9jaWQsIHFtaW4sIHFtYXg7CisgICAgaW50IHJldCwgdmFsOworCisgICAgLyoqCisgICAgICogcmVxdWlyZW1lbnRzCisgICAgICovCisgICAgcmV0ID0gdjRsMl9jaGVja19iX2ZyYW1lX3N1cHBvcnQocyk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qKgorICAgICAqIHNldHRpbmdzcworICAgICAqLworICAgIGlmIChhdmN0eC0+ZnJhbWVyYXRlLm51bSB8fCBhdmN0eC0+ZnJhbWVyYXRlLmRlbikKKyAgICAgICAgdjRsMl9zZXRfdGltZXBlcmZyYW1lKHMsIGF2Y3R4LT5mcmFtZXJhdGUubnVtLCBhdmN0eC0+ZnJhbWVyYXRlLmRlbik7CisKKyAgICAvKiBzZXQgZXh0IGN0cmxzICovCisgICAgdjRsMl9zZXRfZXh0X2N0cmwocywgTVBFR19DSUQoSEVBREVSX01PREUpLCBNUEVHX1ZJREVPKEhFQURFUl9NT0RFX1NFUEFSQVRFKSwgImhlYWRlciBtb2RlIik7CisgICAgdjRsMl9zZXRfZXh0X2N0cmwocywgTVBFR19DSUQoQklUUkFURSkgLCBhdmN0eC0+Yml0X3JhdGUsICJiaXQgcmF0ZSIpOworICAgIHY0bDJfc2V0X2V4dF9jdHJsKHMsIE1QRUdfQ0lEKEdPUF9TSVpFKSwgYXZjdHgtPmdvcF9zaXplLCJnb3Agc2l6ZSIpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCisgICAgICAgICJFbmNvZGVyIENvbnRleHQ6IGlkICglZCksIHByb2ZpbGUgKCVkKSwgZnJhbWUgcmF0ZSglZC8lZCksIG51bWJlciBiLWZyYW1lcyAoJWQpLCAiCisgICAgICAgICJnb3Agc2l6ZSAoJWQpLCBiaXQgcmF0ZSAoJSJQUklkNjQiKSwgcW1pbiAoJWQpLCBxbWF4ICglZClcbiIsCisgICAgICAgIGF2Y3R4LT5jb2RlY19pZCwgYXZjdHgtPnByb2ZpbGUsIGF2Y3R4LT5mcmFtZXJhdGUubnVtLCBhdmN0eC0+ZnJhbWVyYXRlLmRlbiwKKyAgICAgICAgYXZjdHgtPm1heF9iX2ZyYW1lcywgYXZjdHgtPmdvcF9zaXplLCBhdmN0eC0+Yml0X3JhdGUsIGF2Y3R4LT5xbWluLCBhdmN0eC0+cW1heCk7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICAgICAgdmFsID0gdjRsMl9oMjY0X3Byb2ZpbGVfZnJvbV9mZihhdmN0eC0+cHJvZmlsZSk7CisgICAgICAgIGlmICh2YWwgPCAwKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImgyNjQgcHJvZmlsZSBub3QgZm91bmRcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2NGwyX3NldF9leHRfY3RybChzLCBNUEVHX0NJRChIMjY0X1BST0ZJTEUpLCB2YWwsICJoMjY0IHByb2ZpbGUiKTsKKyAgICAgICAgcW1pbl9jaWQgPSBNUEVHX0NJRChIMjY0X01JTl9RUCk7CisgICAgICAgIHFtYXhfY2lkID0gTVBFR19DSUQoSDI2NF9NQVhfUVApOworICAgICAgICBxbWluID0gMDsKKyAgICAgICAgcW1heCA9IDUxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgorICAgICAgICB2YWwgPSB2NGwyX21wZWc0X3Byb2ZpbGVfZnJvbV9mZihhdmN0eC0+cHJvZmlsZSk7CisgICAgICAgIGlmICh2YWwgPCAwKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIm1wZWc0IHByb2ZpbGUgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdjRsMl9zZXRfZXh0X2N0cmwocywgTVBFR19DSUQoTVBFRzRfUFJPRklMRSksIHZhbCwgIm1wZWc0IHByb2ZpbGUiKTsKKyAgICAgICAgcW1pbl9jaWQgPSBNUEVHX0NJRChNUEVHNF9NSU5fUVApOworICAgICAgICBxbWF4X2NpZCA9IE1QRUdfQ0lEKE1QRUc0X01BWF9RUCk7CisgICAgICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FQRUwpCisgICAgICAgICAgICB2NGwyX3NldF9leHRfY3RybChzLCBNUEVHX0NJRChNUEVHNF9RUEVMKSwgMSwgInFwZWwiKTsKKyAgICAgICAgcW1pbiA9IDE7CisgICAgICAgIHFtYXggPSAzMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzOgorICAgICAgICBxbWluX2NpZCA9IE1QRUdfQ0lEKEgyNjNfTUlOX1FQKTsKKyAgICAgICAgcW1heF9jaWQgPSBNUEVHX0NJRChIMjYzX01BWF9RUCk7CisgICAgICAgIHFtaW4gPSAxOworICAgICAgICBxbWF4ID0gMzE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfVlA4OgorICAgICAgICBxbWluX2NpZCA9IE1QRUdfQ0lEKFZQWF9NSU5fUVApOworICAgICAgICBxbWF4X2NpZCA9IE1QRUdfQ0lEKFZQWF9NQVhfUVApOworICAgICAgICBxbWluID0gMDsKKyAgICAgICAgcW1heCA9IDEyNzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDk6CisgICAgICAgIHFtaW5fY2lkID0gTVBFR19DSUQoVlBYX01JTl9RUCk7CisgICAgICAgIHFtYXhfY2lkID0gTVBFR19DSUQoVlBYX01BWF9RUCk7CisgICAgICAgIHFtaW4gPSAwOworICAgICAgICBxbWF4ID0gMjU1OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAocW1pbiAhPSBhdmN0eC0+cW1pbiB8fCBxbWF4ICE9IGF2Y3R4LT5xbWF4KQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRW5jb2RlciBhZGp1c3RlZDogcW1pbiAoJWQpLCBxbWF4ICglZClcbiIsIHFtaW4sIHFtYXgpOworCisgICAgdjRsMl9zZXRfZXh0X2N0cmwocywgcW1pbl9jaWQsIHFtaW4sICJtaW5pbXVtIHZpZGVvIHF1YW50aXplciBzY2FsZSIpOworICAgIHY0bDJfc2V0X2V4dF9jdHJsKHMsIHFtYXhfY2lkLCBxbWF4LCAibWF4aW11bSB2aWRlbyBxdWFudGl6ZXIgc2NhbGUiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHY0bDJfc2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIFY0TDJtMm1Db250ZXh0ICpzID0gKChWNEwybTJtUHJpdiopYXZjdHgtPnByaXZfZGF0YSktPmNvbnRleHQ7CisgICAgVjRMMkNvbnRleHQgKmNvbnN0IG91dHB1dCA9ICZzLT5vdXRwdXQ7CisKKyAgICByZXR1cm4gZmZfdjRsMl9jb250ZXh0X2VucXVldWVfZnJhbWUob3V0cHV0LCBmcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgdjRsMl9yZWNlaXZlX3BhY2tldChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBWNEwybTJtQ29udGV4dCAqcyA9ICgoVjRMMm0ybVByaXYqKWF2Y3R4LT5wcml2X2RhdGEpLT5jb250ZXh0OworICAgIFY0TDJDb250ZXh0ICpjb25zdCBjYXB0dXJlID0gJnMtPmNhcHR1cmU7CisgICAgVjRMMkNvbnRleHQgKmNvbnN0IG91dHB1dCA9ICZzLT5vdXRwdXQ7CisgICAgaW50IHJldDsKKworICAgIGlmIChzLT5kcmFpbmluZykKKyAgICAgICAgZ290byBkZXF1ZXVlOworCisgICAgaWYgKCFvdXRwdXQtPnN0cmVhbW9uKSB7CisgICAgICAgIHJldCA9IGZmX3Y0bDJfY29udGV4dF9zZXRfc3RhdHVzKG91dHB1dCwgVklESU9DX1NUUkVBTU9OKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJWSURJT0NfU1RSRUFNT0ZGIGZhaWxlZCBvbiBvdXRwdXQgY29udGV4dFxuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjYXB0dXJlLT5zdHJlYW1vbikgeworICAgICAgICByZXQgPSBmZl92NGwyX2NvbnRleHRfc2V0X3N0YXR1cyhjYXB0dXJlLCBWSURJT0NfU1RSRUFNT04pOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZJRElPQ19TVFJFQU1PTiBmYWlsZWQgb24gY2FwdHVyZSBjb250ZXh0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKK2RlcXVldWU6CisgICAgcmV0dXJuIGZmX3Y0bDJfY29udGV4dF9kZXF1ZXVlX3BhY2tldChjYXB0dXJlLCBhdnBrdCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2NGwyX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWNEwyQ29udGV4dCAqY2FwdHVyZSwgKm91dHB1dDsKKyAgICBWNEwybTJtQ29udGV4dCAqczsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfdjRsMl9tMm1fY3JlYXRlX2NvbnRleHQoYXZjdHgsICZzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGNhcHR1cmUgPSAmcy0+Y2FwdHVyZTsKKyAgICBvdXRwdXQgID0gJnMtPm91dHB1dDsKKworICAgIC8qIGNvbW1vbiBzZXR0aW5ncyBvdXRwdXQvY2FwdHVyZSAqLworICAgIG91dHB1dC0+aGVpZ2h0ID0gY2FwdHVyZS0+aGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKyAgICBvdXRwdXQtPndpZHRoID0gY2FwdHVyZS0+d2lkdGggPSBhdmN0eC0+d2lkdGg7CisKKyAgICAvKiBvdXRwdXQgY29udGV4dCAqLworICAgIG91dHB1dC0+YXZfY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBvdXRwdXQtPmF2X3BpeF9mbXQgPSBhdmN0eC0+cGl4X2ZtdDsKKworICAgIC8qIGNhcHR1cmUgY29udGV4dCAqLworICAgIGNhcHR1cmUtPmF2X2NvZGVjX2lkID0gYXZjdHgtPmNvZGVjX2lkOworICAgIGNhcHR1cmUtPmF2X3BpeF9mbXQgPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICByZXQgPSBmZl92NGwyX20ybV9jb2RlY19pbml0KGF2Y3R4KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiY2FuJ3QgY29uZmlndXJlIGVuY29kZXJcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiB2NGwyX3ByZXBhcmVfZW5jb2RlcihzKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVjRMMm0ybVByaXYsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICBWNExfTTJNX0RFRkFVTFRfT1BUUywKKyAgICB7ICJudW1fY2FwdHVyZV9idWZmZXJzIiwgIk51bWJlciBvZiBidWZmZXJzIGluIHRoZSBjYXB0dXJlIGNvbnRleHQiLAorICAgICAgICBPRkZTRVQobnVtX2NhcHR1cmVfYnVmZmVycyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA0IH0sIDQsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCisjZGVmaW5lIE0yTUVOQyhOQU1FLCBMT05HTkFNRSwgQ09ERUMpIFwKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHY0bDJfbTJtXyAjIyBOQU1FICMjIF9lbmNfY2xhc3MgPSB7XAorICAgIC5jbGFzc19uYW1lID0gI05BTUUgIl92NGwyX20ybV9lbmNvZGVyIixcCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSxcCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLFwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCxcCit9O1wKK1wKK0FWQ29kZWMgZmZfICMjIE5BTUUgIyMgX3Y0bDJtMm1fZW5jb2RlciA9IHsgXAorICAgIC5uYW1lICAgICAgICAgICA9ICNOQU1FICJfdjRsMm0ybSIgLFwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVjRMMiBtZW0ybWVtICIgTE9OR05BTUUgIiBlbmNvZGVyIHdyYXBwZXIiKSxcCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLFwKKyAgICAuaWQgICAgICAgICAgICAgPSBDT0RFQyAsXAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWNEwybTJtUHJpdiksXAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ2NGwyX20ybV8gIyMgTkFNRSAjI19lbmNfY2xhc3MsXAorICAgIC5pbml0ICAgICAgICAgICA9IHY0bDJfZW5jb2RlX2luaXQsXAorICAgIC5zZW5kX2ZyYW1lICAgICA9IHY0bDJfc2VuZF9mcmFtZSxcCisgICAgLnJlY2VpdmVfcGFja2V0ID0gdjRsMl9yZWNlaXZlX3BhY2tldCxcCisgICAgLmNsb3NlICAgICAgICAgID0gZmZfdjRsMl9tMm1fY29kZWNfZW5kLFwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfSEFSRFdBUkUgfCBBVl9DT0RFQ19DQVBfREVMQVksIFwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAidjRsMm0ybSIsIFwKK307CisKK00yTUVOQyhtcGVnNCwiTVBFRzQiLCBBVl9DT0RFQ19JRF9NUEVHNCk7CitNMk1FTkMoaDI2MywgIkguMjYzIiwgQVZfQ09ERUNfSURfSDI2Myk7CitNMk1FTkMoaDI2NCwgIkguMjY0IiwgQVZfQ09ERUNfSURfSDI2NCk7CitNMk1FTkMoaGV2YywgIkhFVkMiLCAgQVZfQ09ERUNfSURfSEVWQyk7CitNMk1FTkModnA4LCAgIlZQOCIsICAgQVZfQ09ERUNfSURfVlA4KTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmFhcGkuYyBiL2xpYmF2Y29kZWMvdmFhcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlYTc5MC4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL3ZhYXBpLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoKLSAqIFZpZGVvIEFjY2VsZXJhdGlvbiBBUEkgKHZpZGVvIGRlY29kaW5nKQotICogSFcgZGVjb2RlIGFjY2VsZXJhdGlvbiBmb3IgTVBFRy0yLCBNUEVHLTQsIEguMjY0IGFuZCBWQy0xCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgU3BsaXR0ZWQtRGVza3RvcCBTeXN0ZW1zCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCi0jaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCi0jaW5jbHVkZSAidmFhcGlfaW50ZXJuYWwuaCIKLQotLyoqCi0gKiBAYWRkdG9ncm91cCBWQUFQSV9EZWNvZGluZwotICoKLSAqIEB7Ci0gKi8KLQotc3RhdGljIHZvaWQgZGVzdHJveV9idWZmZXJzKFZBRGlzcGxheSBkaXNwbGF5LCBWQUJ1ZmZlcklEICpidWZmZXJzLCB1bnNpZ25lZCBpbnQgbl9idWZmZXJzKQotewotICAgIHVuc2lnbmVkIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuX2J1ZmZlcnM7IGkrKykgewotICAgICAgICBpZiAoYnVmZmVyc1tpXSAhPSBWQV9JTlZBTElEX0lEKSB7Ci0gICAgICAgICAgICB2YURlc3Ryb3lCdWZmZXIoZGlzcGxheSwgYnVmZmVyc1tpXSk7Ci0gICAgICAgICAgICBidWZmZXJzW2ldID0gVkFfSU5WQUxJRF9JRDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IGZmX3ZhYXBpX2NvbnRleHRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgRkZWQUNvbnRleHQgKiBjb25zdCB2YWN0eCA9IGZmX3ZhYXBpX2dldF9jb250ZXh0KGF2Y3R4KTsKLSAgICBjb25zdCBzdHJ1Y3QgdmFhcGlfY29udGV4dCAqIGNvbnN0IHVzZXJfdmFjdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OwotCi0gICAgaWYgKCF1c2VyX3ZhY3R4KSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSGFyZHdhcmUgYWNjZWxlcmF0aW9uIGNvbnRleHQgKGh3YWNjZWxfY29udGV4dCkgZG9lcyBub3QgZXhpc3QuXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKLSAgICB9Ci0KLSAgICB2YWN0eC0+ZGlzcGxheSAgICAgICAgICAgICAgPSB1c2VyX3ZhY3R4LT5kaXNwbGF5OwotICAgIHZhY3R4LT5jb25maWdfaWQgICAgICAgICAgICA9IHVzZXJfdmFjdHgtPmNvbmZpZ19pZDsKLSAgICB2YWN0eC0+Y29udGV4dF9pZCAgICAgICAgICAgPSB1c2VyX3ZhY3R4LT5jb250ZXh0X2lkOwotCi0gICAgdmFjdHgtPnBpY19wYXJhbV9idWZfaWQgICAgID0gVkFfSU5WQUxJRF9JRDsKLSAgICB2YWN0eC0+aXFfbWF0cml4X2J1Zl9pZCAgICAgPSBWQV9JTlZBTElEX0lEOwotICAgIHZhY3R4LT5iaXRwbGFuZV9idWZfaWQgICAgICA9IFZBX0lOVkFMSURfSUQ7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGZmX3ZhYXBpX2NvbnRleHRfZmluaShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludCBmZl92YWFwaV9yZW5kZXJfcGljdHVyZShGRlZBQ29udGV4dCAqdmFjdHgsIFZBU3VyZmFjZUlEIHN1cmZhY2UpCi17Ci0gICAgVkFCdWZmZXJJRCB2YV9idWZmZXJzWzNdOwotICAgIHVuc2lnbmVkIGludCBuX3ZhX2J1ZmZlcnMgPSAwOwotCi0gICAgaWYgKHZhY3R4LT5waWNfcGFyYW1fYnVmX2lkID09IFZBX0lOVkFMSURfSUQpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgdmFVbm1hcEJ1ZmZlcih2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPnBpY19wYXJhbV9idWZfaWQpOwotICAgIHZhX2J1ZmZlcnNbbl92YV9idWZmZXJzKytdID0gdmFjdHgtPnBpY19wYXJhbV9idWZfaWQ7Ci0KLSAgICBpZiAodmFjdHgtPmlxX21hdHJpeF9idWZfaWQgIT0gVkFfSU5WQUxJRF9JRCkgewotICAgICAgICB2YVVubWFwQnVmZmVyKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+aXFfbWF0cml4X2J1Zl9pZCk7Ci0gICAgICAgIHZhX2J1ZmZlcnNbbl92YV9idWZmZXJzKytdID0gdmFjdHgtPmlxX21hdHJpeF9idWZfaWQ7Ci0gICAgfQotCi0gICAgaWYgKHZhY3R4LT5iaXRwbGFuZV9idWZfaWQgIT0gVkFfSU5WQUxJRF9JRCkgewotICAgICAgICB2YVVubWFwQnVmZmVyKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+Yml0cGxhbmVfYnVmX2lkKTsKLSAgICAgICAgdmFfYnVmZmVyc1tuX3ZhX2J1ZmZlcnMrK10gPSB2YWN0eC0+Yml0cGxhbmVfYnVmX2lkOwotICAgIH0KLQotICAgIGlmICh2YUJlZ2luUGljdHVyZSh2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPmNvbnRleHRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UpICE9IFZBX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBpZiAodmFSZW5kZXJQaWN0dXJlKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+Y29udGV4dF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhX2J1ZmZlcnMsIG5fdmFfYnVmZmVycykgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlmICh2YVJlbmRlclBpY3R1cmUodmFjdHgtPmRpc3BsYXksIHZhY3R4LT5jb250ZXh0X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgdmFjdHgtPnNsaWNlX2J1Zl9pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWN0eC0+bl9zbGljZV9idWZfaWRzKSAhPSBWQV9TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKHZhRW5kUGljdHVyZSh2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPmNvbnRleHRfaWQpICE9IFZBX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGZmX3ZhYXBpX2NvbW1pdF9zbGljZXMoRkZWQUNvbnRleHQgKnZhY3R4KQotewotICAgIFZBQnVmZmVySUQgKnNsaWNlX2J1Zl9pZHM7Ci0gICAgVkFCdWZmZXJJRCBzbGljZV9wYXJhbV9idWZfaWQsIHNsaWNlX2RhdGFfYnVmX2lkOwotCi0gICAgaWYgKHZhY3R4LT5zbGljZV9jb3VudCA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHNsaWNlX2J1Zl9pZHMgPQotICAgICAgICBhdl9mYXN0X3JlYWxsb2ModmFjdHgtPnNsaWNlX2J1Zl9pZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdmFjdHgtPnNsaWNlX2J1Zl9pZHNfYWxsb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAodmFjdHgtPm5fc2xpY2VfYnVmX2lkcyArIDIpICogc2l6ZW9mKHNsaWNlX2J1Zl9pZHNbMF0pKTsKLSAgICBpZiAoIXNsaWNlX2J1Zl9pZHMpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB2YWN0eC0+c2xpY2VfYnVmX2lkcyA9IHNsaWNlX2J1Zl9pZHM7Ci0KLSAgICBzbGljZV9wYXJhbV9idWZfaWQgPSBWQV9JTlZBTElEX0lEOwotICAgIGlmICh2YUNyZWF0ZUJ1ZmZlcih2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPmNvbnRleHRfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICB2YWN0eC0+c2xpY2VfcGFyYW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFjdHgtPnNsaWNlX2NvdW50LCB2YWN0eC0+c2xpY2VfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAmc2xpY2VfcGFyYW1fYnVmX2lkKSAhPSBWQV9TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHZhY3R4LT5zbGljZV9jb3VudCA9IDA7Ci0KLSAgICBzbGljZV9kYXRhX2J1Zl9pZCA9IFZBX0lOVkFMSURfSUQ7Ci0gICAgaWYgKHZhQ3JlYXRlQnVmZmVyKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+Y29udGV4dF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgVkFTbGljZURhdGFCdWZmZXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICB2YWN0eC0+c2xpY2VfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAxLCAodm9pZCAqKXZhY3R4LT5zbGljZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAmc2xpY2VfZGF0YV9idWZfaWQpICE9IFZBX1NUQVRVU19TVUNDRVNTKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgdmFjdHgtPnNsaWNlX2RhdGEgPSBOVUxMOwotICAgIHZhY3R4LT5zbGljZV9kYXRhX3NpemUgPSAwOwotCi0gICAgc2xpY2VfYnVmX2lkc1t2YWN0eC0+bl9zbGljZV9idWZfaWRzKytdID0gc2xpY2VfcGFyYW1fYnVmX2lkOwotICAgIHNsaWNlX2J1Zl9pZHNbdmFjdHgtPm5fc2xpY2VfYnVmX2lkcysrXSA9IHNsaWNlX2RhdGFfYnVmX2lkOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCAqYWxsb2NfYnVmZmVyKEZGVkFDb250ZXh0ICp2YWN0eCwgaW50IHR5cGUsIHVuc2lnbmVkIGludCBzaXplLCB1aW50MzJfdCAqYnVmX2lkKQotewotICAgIHZvaWQgKmRhdGEgPSBOVUxMOwotCi0gICAgKmJ1Zl9pZCA9IFZBX0lOVkFMSURfSUQ7Ci0gICAgaWYgKHZhQ3JlYXRlQnVmZmVyKHZhY3R4LT5kaXNwbGF5LCB2YWN0eC0+Y29udGV4dF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgc2l6ZSwgMSwgTlVMTCwgYnVmX2lkKSA9PSBWQV9TVEFUVVNfU1VDQ0VTUykKLSAgICAgICAgdmFNYXBCdWZmZXIodmFjdHgtPmRpc3BsYXksICpidWZfaWQsICZkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotfQotCi12b2lkICpmZl92YWFwaV9hbGxvY19waWNfcGFyYW0oRkZWQUNvbnRleHQgKnZhY3R4LCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLSAgICByZXR1cm4gYWxsb2NfYnVmZmVyKHZhY3R4LCBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJUeXBlLCBzaXplLCAmdmFjdHgtPnBpY19wYXJhbV9idWZfaWQpOwotfQotCi12b2lkICpmZl92YWFwaV9hbGxvY19pcV9tYXRyaXgoRkZWQUNvbnRleHQgKnZhY3R4LCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLSAgICByZXR1cm4gYWxsb2NfYnVmZmVyKHZhY3R4LCBWQUlRTWF0cml4QnVmZmVyVHlwZSwgc2l6ZSwgJnZhY3R4LT5pcV9tYXRyaXhfYnVmX2lkKTsKLX0KLQotdWludDhfdCAqZmZfdmFhcGlfYWxsb2NfYml0cGxhbmUoRkZWQUNvbnRleHQgKnZhY3R4LCB1aW50MzJfdCBzaXplKQotewotICAgIHJldHVybiBhbGxvY19idWZmZXIodmFjdHgsIFZBQml0UGxhbmVCdWZmZXJUeXBlLCBzaXplLCAmdmFjdHgtPmJpdHBsYW5lX2J1Zl9pZCk7Ci19Ci0KLVZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJCYXNlICpmZl92YWFwaV9hbGxvY19zbGljZShGRlZBQ29udGV4dCAqdmFjdHgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgdWludDMyX3Qgc2l6ZSkKLXsKLSAgICB1aW50OF90ICpzbGljZV9wYXJhbXM7Ci0gICAgVkFTbGljZVBhcmFtZXRlckJ1ZmZlckJhc2UgKnNsaWNlX3BhcmFtOwotCi0gICAgaWYgKCF2YWN0eC0+c2xpY2VfZGF0YSkKLSAgICAgICAgdmFjdHgtPnNsaWNlX2RhdGEgPSBidWZmZXI7Ci0gICAgaWYgKHZhY3R4LT5zbGljZV9kYXRhICsgdmFjdHgtPnNsaWNlX2RhdGFfc2l6ZSAhPSBidWZmZXIpIHsKLSAgICAgICAgaWYgKGZmX3ZhYXBpX2NvbW1pdF9zbGljZXModmFjdHgpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB2YWN0eC0+c2xpY2VfZGF0YSA9IGJ1ZmZlcjsKLSAgICB9Ci0KLSAgICBzbGljZV9wYXJhbXMgPQotICAgICAgICBhdl9mYXN0X3JlYWxsb2ModmFjdHgtPnNsaWNlX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICZ2YWN0eC0+c2xpY2VfcGFyYW1zX2FsbG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgKHZhY3R4LT5zbGljZV9jb3VudCArIDEpICogdmFjdHgtPnNsaWNlX3BhcmFtX3NpemUpOwotICAgIGlmICghc2xpY2VfcGFyYW1zKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB2YWN0eC0+c2xpY2VfcGFyYW1zID0gc2xpY2VfcGFyYW1zOwotCi0gICAgc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlckJhc2UgKikoc2xpY2VfcGFyYW1zICsgdmFjdHgtPnNsaWNlX2NvdW50ICogdmFjdHgtPnNsaWNlX3BhcmFtX3NpemUpOwotICAgIHNsaWNlX3BhcmFtLT5zbGljZV9kYXRhX3NpemUgICA9IHNpemU7Ci0gICAgc2xpY2VfcGFyYW0tPnNsaWNlX2RhdGFfb2Zmc2V0ID0gdmFjdHgtPnNsaWNlX2RhdGFfc2l6ZTsKLSAgICBzbGljZV9wYXJhbS0+c2xpY2VfZGF0YV9mbGFnICAgPSBWQV9TTElDRV9EQVRBX0ZMQUdfQUxMOwotCi0gICAgdmFjdHgtPnNsaWNlX2NvdW50Kys7Ci0gICAgdmFjdHgtPnNsaWNlX2RhdGFfc2l6ZSArPSBzaXplOwotICAgIHJldHVybiBzbGljZV9wYXJhbTsKLX0KLQotdm9pZCBmZl92YWFwaV9jb21tb25fZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBGRlZBQ29udGV4dCAqIGNvbnN0IHZhY3R4ID0gZmZfdmFhcGlfZ2V0X2NvbnRleHQoYXZjdHgpOwotCi0gICAgZmZfZGxvZyhhdmN0eCwgImZmX3ZhYXBpX2NvbW1vbl9lbmRfZnJhbWUoKVxuIik7Ci0KLSAgICBkZXN0cm95X2J1ZmZlcnModmFjdHgtPmRpc3BsYXksICZ2YWN0eC0+cGljX3BhcmFtX2J1Zl9pZCwgMSk7Ci0gICAgZGVzdHJveV9idWZmZXJzKHZhY3R4LT5kaXNwbGF5LCAmdmFjdHgtPmlxX21hdHJpeF9idWZfaWQsIDEpOwotICAgIGRlc3Ryb3lfYnVmZmVycyh2YWN0eC0+ZGlzcGxheSwgJnZhY3R4LT5iaXRwbGFuZV9idWZfaWQsIDEpOwotICAgIGRlc3Ryb3lfYnVmZmVycyh2YWN0eC0+ZGlzcGxheSwgdmFjdHgtPnNsaWNlX2J1Zl9pZHMsIHZhY3R4LT5uX3NsaWNlX2J1Zl9pZHMpOwotICAgIGF2X2ZyZWVwKCZ2YWN0eC0+c2xpY2VfYnVmX2lkcyk7Ci0gICAgYXZfZnJlZXAoJnZhY3R4LT5zbGljZV9wYXJhbXMpOwotICAgIHZhY3R4LT5uX3NsaWNlX2J1Zl9pZHMgICAgID0gMDsKLSAgICB2YWN0eC0+c2xpY2VfYnVmX2lkc19hbGxvYyA9IDA7Ci0gICAgdmFjdHgtPnNsaWNlX2NvdW50ICAgICAgICAgPSAwOwotICAgIHZhY3R4LT5zbGljZV9wYXJhbXNfYWxsb2MgID0gMDsKLX0KLQotI2lmIENPTkZJR19IMjYzX1ZBQVBJX0hXQUNDRUwgIHx8IENPTkZJR19NUEVHMV9WQUFQSV9IV0FDQ0VMIHx8IFwKLSAgICBDT05GSUdfTVBFRzJfVkFBUElfSFdBQ0NFTCB8fCBDT05GSUdfTVBFRzRfVkFBUElfSFdBQ0NFTCB8fCBcCi0gICAgQ09ORklHX1ZDMV9WQUFQSV9IV0FDQ0VMICAgfHwgQ09ORklHX1dNVjNfVkFBUElfSFdBQ0NFTAotaW50IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBGRlZBQ29udGV4dCAqIGNvbnN0IHZhY3R4ID0gZmZfdmFhcGlfZ2V0X2NvbnRleHQoYXZjdHgpOwotICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBpbnQgcmV0OwotCi0gICAgcmV0ID0gZmZfdmFhcGlfY29tbWl0X3NsaWNlcyh2YWN0eCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZmluaXNoOwotCi0gICAgcmV0ID0gZmZfdmFhcGlfcmVuZGVyX3BpY3R1cmUodmFjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+ZikpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIGZpbmlzaDsKLQotICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIDAsIHMtPmF2Y3R4LT5oZWlnaHQpOwotCi1maW5pc2g6Ci0gICAgZmZfdmFhcGlfY29tbW9uX2VuZF9mcmFtZShhdmN0eCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZgotCi0vKiBAfSAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaS5oIGIvbGliYXZjb2RlYy92YWFwaS5oCmluZGV4IDdhMjlmNmYuLjJjZjdkYTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmFhcGkuaAorKysgYi9saWJhdmNvZGVjL3ZhYXBpLmgKQEAgLTM0LDYgKzM0LDggQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgInZlcnNpb24uaCIKIAorI2lmIEZGX0FQSV9TVFJVQ1RfVkFBUElfQ09OVEVYVAorCiAvKioKICAqIEBkZWZncm91cCBsYXZjX2NvZGVjX2h3YWNjZWxfdmFhcGkgVkEgQVBJIERlY29kaW5nCiAgKiBAaW5ncm91cCBsYXZjX2NvZGVjX2h3YWNjZWwKQEAgLTQ4LDggKzUwLDEwIEBACiAgKiBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb3IgdGhyb3VnaCBlYWNoIEFWQ29kZWNDb250ZXh0LmdldF9idWZmZXIoKQogICogZnVuY3Rpb24gY2FsbC4gSW4gYW55IGNhc2UsIHRoZXkgbXVzdCBiZSB2YWxpZCBwcmlvciB0byBjYWxsaW5nCiAgKiBkZWNvZGluZyBmdW5jdGlvbnMuCisgKgorICogRGVwcmVjYXRlZDogdXNlIEFWQ29kZWNDb250ZXh0Lmh3X2ZyYW1lc19jdHggaW5zdGVhZC4KICAqLwotc3RydWN0IHZhYXBpX2NvbnRleHQgeworc3RydWN0IGF0dHJpYnV0ZV9kZXByZWNhdGVkIHZhYXBpX2NvbnRleHQgewogICAgIC8qKgogICAgICAqIFdpbmRvdyBzeXN0ZW0gZGVwZW5kZW50IGRhdGEKICAgICAgKgpAQCAtNzMsMTE3ICs3NywxMCBAQAogICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyCiAgICAgICovCiAgICAgdWludDMyX3QgY29udGV4dF9pZDsKLQotI2lmIEZGX0FQSV9WQUFQSV9DT05URVhUCi0gICAgLyoqCi0gICAgICogVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyIElECi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYwotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgdWludDMyX3QgcGljX3BhcmFtX2J1Zl9pZDsKLQotICAgIC8qKgotICAgICAqIFZBSVFNYXRyaXhCdWZmZXIgSUQKLSAgICAgKgotICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAotICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICB1aW50MzJfdCBpcV9tYXRyaXhfYnVmX2lkOwotCi0gICAgLyoqCi0gICAgICogVkFCaXRQbGFuZUJ1ZmZlciBJRCAoZm9yIFZDLTEgZGVjb2RpbmcpCi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYwotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgdWludDMyX3QgYml0cGxhbmVfYnVmX2lkOwotCi0gICAgLyoqCi0gICAgICogU2xpY2UgcGFyYW1ldGVyL2RhdGEgYnVmZmVyIElEcwotICAgICAqCi0gICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIHVpbnQzMl90ICpzbGljZV9idWZfaWRzOwotCi0gICAgLyoqCi0gICAgICogTnVtYmVyIG9mIGVmZmVjdGl2ZSBzbGljZSBidWZmZXIgSURzIHRvIHNlbmQgdG8gdGhlIEhXCi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYwotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgdW5zaWduZWQgaW50IG5fc2xpY2VfYnVmX2lkczsKLQotICAgIC8qKgotICAgICAqIFNpemUgb2YgcHJlLWFsbG9jYXRlZCBzbGljZV9idWZfaWRzCi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYwotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgdW5zaWduZWQgaW50IHNsaWNlX2J1Zl9pZHNfYWxsb2M7Ci0KLSAgICAvKioKLSAgICAgKiBQb2ludGVyIHRvIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJzCi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYwotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgdm9pZCAqc2xpY2VfcGFyYW1zOwotCi0gICAgLyoqCi0gICAgICogU2l6ZSBvZiBhIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXIgZWxlbWVudAotICAgICAqCi0gICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIHVuc2lnbmVkIGludCBzbGljZV9wYXJhbV9zaXplOwotCi0gICAgLyoqCi0gICAgICogU2l6ZSBvZiBwcmUtYWxsb2NhdGVkIHNsaWNlX3BhcmFtcwotICAgICAqCi0gICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIHVuc2lnbmVkIGludCBzbGljZV9wYXJhbXNfYWxsb2M7Ci0KLSAgICAvKioKLSAgICAgKiBOdW1iZXIgb2Ygc2xpY2VzIGN1cnJlbnRseSBmaWxsZWQgaW4KLSAgICAgKgotICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAotICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICB1bnNpZ25lZCBpbnQgc2xpY2VfY291bnQ7Ci0KLSAgICAvKioKLSAgICAgKiBQb2ludGVyIHRvIHNsaWNlIGRhdGEgYnVmZmVyIGJhc2UKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYwotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgY29uc3QgdWludDhfdCAqc2xpY2VfZGF0YTsKLQotICAgIC8qKgotICAgICAqIEN1cnJlbnQgc2l6ZSBvZiBzbGljZSBkYXRhCi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYwotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgdWludDMyX3Qgc2xpY2VfZGF0YV9zaXplOwotI2VuZGlmCiB9OwogCiAvKiBAfSAqLwogCisjZW5kaWYgLyogRkZfQVBJX1NUUlVDVF9WQUFQSV9DT05URVhUICovCisKICNlbmRpZiAvKiBBVkNPREVDX1ZBQVBJX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmFhcGlfZGVjb2RlLmMgYi9saWJhdmNvZGVjL3ZhYXBpX2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYTZiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3ZhYXBpX2RlY29kZS5jCkBAIC0wLDAgKzEsNzMyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJkZWNvZGUuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZhYXBpX2RlY29kZS5oIgorCisKK2ludCBmZl92YWFwaV9kZWNvZGVfbWFrZV9wYXJhbV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKQoreworICAgIFZBQVBJRGVjb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgVkFCdWZmZXJJRCBidWZmZXI7CisKKyAgICBhdl9hc3NlcnQwKHBpYy0+bmJfcGFyYW1fYnVmZmVycyArIDEgPD0gTUFYX1BBUkFNX0JVRkZFUlMpOworCisgICAgdmFzID0gdmFDcmVhdGVCdWZmZXIoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHNpemUsIDEsICh2b2lkKilkYXRhLCAmYnVmZmVyKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgImJ1ZmZlciAodHlwZSAlZCk6ICVkICglcykuXG4iLAorICAgICAgICAgICAgICAgdHlwZSwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHBpYy0+cGFyYW1fYnVmZmVyc1twaWMtPm5iX3BhcmFtX2J1ZmZlcnMrK10gPSBidWZmZXI7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlBhcmFtIGJ1ZmZlciAodHlwZSAlZCwgJXp1IGJ5dGVzKSAiCisgICAgICAgICAgICJpcyAlI3guXG4iLCB0eXBlLCBzaXplLCBidWZmZXIpOworICAgIHJldHVybiAwOworfQorCisKK2ludCBmZl92YWFwaV9kZWNvZGVfbWFrZV9zbGljZV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW1zX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXJhbXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc2xpY2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNsaWNlX3NpemUpCit7CisgICAgVkFBUElEZWNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIFZBU3RhdHVzIHZhczsKKyAgICBpbnQgaW5kZXg7CisKKyAgICBhdl9hc3NlcnQwKHBpYy0+bmJfc2xpY2VzIDw9IHBpYy0+c2xpY2VzX2FsbG9jYXRlZCk7CisgICAgaWYgKHBpYy0+bmJfc2xpY2VzID09IHBpYy0+c2xpY2VzX2FsbG9jYXRlZCkgeworICAgICAgICBpZiAocGljLT5zbGljZXNfYWxsb2NhdGVkID4gMCkKKyAgICAgICAgICAgIHBpYy0+c2xpY2VzX2FsbG9jYXRlZCAqPSAyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwaWMtPnNsaWNlc19hbGxvY2F0ZWQgPSA2NDsKKworICAgICAgICBwaWMtPnNsaWNlX2J1ZmZlcnMgPQorICAgICAgICAgICAgYXZfcmVhbGxvY19hcnJheShwaWMtPnNsaWNlX2J1ZmZlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+c2xpY2VzX2FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHNpemVvZigqcGljLT5zbGljZV9idWZmZXJzKSk7CisgICAgICAgIGlmICghcGljLT5zbGljZV9idWZmZXJzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfYXNzZXJ0MChwaWMtPm5iX3NsaWNlcyArIDEgPD0gcGljLT5zbGljZXNfYWxsb2NhdGVkKTsKKworICAgIGluZGV4ID0gMiAqIHBpYy0+bmJfc2xpY2VzOworCisgICAgdmFzID0gdmFDcmVhdGVCdWZmZXIoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc19zaXplLCAxLCAodm9pZCopcGFyYW1zX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnBpYy0+c2xpY2VfYnVmZmVyc1tpbmRleF0pOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIHNsaWNlICIKKyAgICAgICAgICAgICAgICJwYXJhbWV0ZXIgYnVmZmVyOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU2xpY2UgJWQgcGFyYW0gYnVmZmVyICglenUgYnl0ZXMpICIKKyAgICAgICAgICAgImlzICUjeC5cbiIsIHBpYy0+bmJfc2xpY2VzLCBwYXJhbXNfc2l6ZSwKKyAgICAgICAgICAgcGljLT5zbGljZV9idWZmZXJzW2luZGV4XSk7CisKKyAgICB2YXMgPSB2YUNyZWF0ZUJ1ZmZlcihjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVkFTbGljZURhdGFCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlX3NpemUsIDEsICh2b2lkKilzbGljZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICZwaWMtPnNsaWNlX2J1ZmZlcnNbaW5kZXggKyAxXSk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgc2xpY2UgIgorICAgICAgICAgICAgICAgImRhdGEgYnVmZmVyIChzaXplICV6dSk6ICVkICglcykuXG4iLAorICAgICAgICAgICAgICAgc2xpY2Vfc2l6ZSwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICB2YURlc3Ryb3lCdWZmZXIoY3R4LT5od2N0eC0+ZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+c2xpY2VfYnVmZmVyc1tpbmRleF0pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiU2xpY2UgJWQgZGF0YSBidWZmZXIgKCV6dSBieXRlcykgIgorICAgICAgICAgICAiaXMgJSN4LlxuIiwgcGljLT5uYl9zbGljZXMsIHNsaWNlX3NpemUsCisgICAgICAgICAgIHBpYy0+c2xpY2VfYnVmZmVyc1tpbmRleCArIDFdKTsKKworICAgICsrcGljLT5uYl9zbGljZXM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZmX3ZhYXBpX2RlY29kZV9kZXN0cm95X2J1ZmZlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYykKK3sKKyAgICBWQUFQSURlY29kZUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgVkFTdGF0dXMgdmFzOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBpYy0+bmJfcGFyYW1fYnVmZmVyczsgaSsrKSB7CisgICAgICAgIHZhcyA9IHZhRGVzdHJveUJ1ZmZlcihjdHgtPmh3Y3R4LT5kaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5wYXJhbV9idWZmZXJzW2ldKTsKKyAgICAgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVzdHJveSAiCisgICAgICAgICAgICAgICAgICAgInBhcmFtZXRlciBidWZmZXIgJSN4OiAlZCAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgICAgICBwaWMtPnBhcmFtX2J1ZmZlcnNbaV0sIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyICogcGljLT5uYl9zbGljZXM7IGkrKykgeworICAgICAgICB2YXMgPSB2YURlc3Ryb3lCdWZmZXIoY3R4LT5od2N0eC0+ZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+c2xpY2VfYnVmZmVyc1tpXSk7CisgICAgICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlc3Ryb3kgc2xpY2UgIgorICAgICAgICAgICAgICAgICAgICJzbGljZSBidWZmZXIgJSN4OiAlZCAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgICAgICBwaWMtPnNsaWNlX2J1ZmZlcnNbaV0sIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGZmX3ZhYXBpX2RlY29kZV9pc3N1ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRGVjb2RlUGljdHVyZSAqcGljKQoreworICAgIFZBQVBJRGVjb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgaW50IGVycjsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRGVjb2RlIHRvIHN1cmZhY2UgJSN4LlxuIiwKKyAgICAgICAgICAgcGljLT5vdXRwdXRfc3VyZmFjZSk7CisKKyAgICB2YXMgPSB2YUJlZ2luUGljdHVyZShjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5vdXRwdXRfc3VyZmFjZSk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBiZWdpbiBwaWN0dXJlIGRlY29kZSAiCisgICAgICAgICAgICAgICAiaXNzdWU6ICVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsX3dpdGhfcGljdHVyZTsKKyAgICB9CisKKyAgICB2YXMgPSB2YVJlbmRlclBpY3R1cmUoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPnBhcmFtX2J1ZmZlcnMsIHBpYy0+bmJfcGFyYW1fYnVmZmVycyk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB1cGxvYWQgZGVjb2RlICIKKyAgICAgICAgICAgICAgICJwYXJhbWV0ZXJzOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbF93aXRoX3BpY3R1cmU7CisgICAgfQorCisgICAgdmFzID0gdmFSZW5kZXJQaWN0dXJlKGN0eC0+aHdjdHgtPmRpc3BsYXksIGN0eC0+dmFfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5zbGljZV9idWZmZXJzLCAyICogcGljLT5uYl9zbGljZXMpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gdXBsb2FkIHNsaWNlczogIgorICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsX3dpdGhfcGljdHVyZTsKKyAgICB9CisKKyAgICB2YXMgPSB2YUVuZFBpY3R1cmUoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb250ZXh0KTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVuZCBwaWN0dXJlIGRlY29kZSAiCisgICAgICAgICAgICAgICAiaXNzdWU6ICVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgaWYgKENPTkZJR19WQUFQSV8xIHx8IGN0eC0+aHdjdHgtPmRyaXZlcl9xdWlya3MgJgorICAgICAgICAgICAgQVZfVkFBUElfRFJJVkVSX1FVSVJLX1JFTkRFUl9QQVJBTV9CVUZGRVJTKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIGZhaWxfYXRfZW5kOworICAgIH0KKworICAgIGlmIChDT05GSUdfVkFBUElfMSB8fCBjdHgtPmh3Y3R4LT5kcml2ZXJfcXVpcmtzICYKKyAgICAgICAgQVZfVkFBUElfRFJJVkVSX1FVSVJLX1JFTkRFUl9QQVJBTV9CVUZGRVJTKQorICAgICAgICBmZl92YWFwaV9kZWNvZGVfZGVzdHJveV9idWZmZXJzKGF2Y3R4LCBwaWMpOworCisgICAgcGljLT5uYl9wYXJhbV9idWZmZXJzID0gMDsKKyAgICBwaWMtPm5iX3NsaWNlcyAgICAgICAgPSAwOworICAgIHBpYy0+c2xpY2VzX2FsbG9jYXRlZCA9IDA7CisgICAgYXZfZnJlZXAoJnBpYy0+c2xpY2VfYnVmZmVycyk7CisKKyAgICByZXR1cm4gMDsKKworZmFpbF93aXRoX3BpY3R1cmU6CisgICAgdmFzID0gdmFFbmRQaWN0dXJlKGN0eC0+aHdjdHgtPmRpc3BsYXksIGN0eC0+dmFfY29udGV4dCk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBlbmQgcGljdHVyZSBkZWNvZGUgIgorICAgICAgICAgICAgICAgImFmdGVyIGVycm9yOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgIH0KK2ZhaWw6CisgICAgZmZfdmFhcGlfZGVjb2RlX2Rlc3Ryb3lfYnVmZmVycyhhdmN0eCwgcGljKTsKK2ZhaWxfYXRfZW5kOgorICAgIHJldHVybiBlcnI7Cit9CisKK2ludCBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRGVjb2RlUGljdHVyZSAqcGljKQoreworICAgIGZmX3ZhYXBpX2RlY29kZV9kZXN0cm95X2J1ZmZlcnMoYXZjdHgsIHBpYyk7CisKKyAgICBwaWMtPm5iX3BhcmFtX2J1ZmZlcnMgPSAwOworICAgIHBpYy0+bmJfc2xpY2VzICAgICAgICA9IDA7CisgICAgcGljLT5zbGljZXNfYWxsb2NhdGVkID0gMDsKKyAgICBhdl9mcmVlcCgmcGljLT5zbGljZV9idWZmZXJzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICB1aW50MzJfdCBmb3VyY2M7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7Cit9IHZhYXBpX2Zvcm1hdF9tYXBbXSA9IHsKKyNkZWZpbmUgTUFQKHZhLCBhdikgeyBWQV9GT1VSQ0NfICMjIHZhLCBBVl9QSVhfRk1UXyAjIyBhdiB9CisgICAgLy8gNDowOjAKKyAgICBNQVAoWTgwMCwgR1JBWTgpLAorICAgIC8vIDQ6MjowCisgICAgTUFQKE5WMTIsIE5WMTIpLAorICAgIE1BUChZVjEyLCBZVVY0MjBQKSwKKyAgICBNQVAoSVlVViwgWVVWNDIwUCksCisjaWZkZWYgVkFfRk9VUkNDX0k0MjAKKyAgICBNQVAoSTQyMCwgWVVWNDIwUCksCisjZW5kaWYKKyAgICBNQVAoSU1DMywgWVVWNDIwUCksCisgICAgLy8gNDoxOjEKKyAgICBNQVAoNDExUCwgWVVWNDExUCksCisgICAgLy8gNDoyOjIKKyAgICBNQVAoNDIySCwgWVVWNDIyUCksCisjaWZkZWYgVkFfRk9VUkNDX1lWMTYKKyAgICBNQVAoWVYxNiwgWVVWNDIyUCksCisjZW5kaWYKKyAgICAvLyA0OjQ6MAorICAgIE1BUCg0MjJWLCBZVVY0NDBQKSwKKyAgICAvLyA0OjQ6NAorICAgIE1BUCg0NDRQLCBZVVY0NDRQKSwKKyAgICAvLyA0OjI6MCAxMC1iaXQKKyNpZmRlZiBWQV9GT1VSQ0NfUDAxMAorICAgIE1BUChQMDEwLCBQMDEwKSwKKyNlbmRpZgorI2lmZGVmIFZBX0ZPVVJDQ19JMDEwCisgICAgTUFQKEkwMTAsIFlVVjQyMFAxMCksCisjZW5kaWYKKyN1bmRlZiBNQVAKK307CisKK3N0YXRpYyBpbnQgdmFhcGlfZGVjb2RlX2ZpbmRfYmVzdF9mb3JtYXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRGV2aWNlQ29udGV4dCAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUNvbmZpZ0lEIGNvbmZpZ19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lcykKK3sKKyAgICBBVlZBQVBJRGV2aWNlQ29udGV4dCAqaHdjdHggPSBkZXZpY2UtPmh3Y3R4OworICAgIFZBU3RhdHVzIHZhczsKKyAgICBWQVN1cmZhY2VBdHRyaWIgKmF0dHI7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNvdXJjZV9mb3JtYXQsIGJlc3RfZm9ybWF0LCBmb3JtYXQ7CisgICAgdWludDMyX3QgYmVzdF9mb3VyY2MsIGZvdXJjYzsKKyAgICBpbnQgaSwgaiwgbmJfYXR0cjsKKworICAgIHNvdXJjZV9mb3JtYXQgPSBhdmN0eC0+c3dfcGl4X2ZtdDsKKyAgICBhdl9hc3NlcnQwKHNvdXJjZV9mb3JtYXQgIT0gQVZfUElYX0ZNVF9OT05FKTsKKworICAgIHZhcyA9IHZhUXVlcnlTdXJmYWNlQXR0cmlidXRlcyhod2N0eC0+ZGlzcGxheSwgY29uZmlnX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmbmJfYXR0cik7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBzdXJmYWNlIGF0dHJpYnV0ZXM6ICIKKyAgICAgICAgICAgICAgICIlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGF0dHIgPSBhdl9tYWxsb2NfYXJyYXkobmJfYXR0ciwgc2l6ZW9mKCphdHRyKSk7CisgICAgaWYgKCFhdHRyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdmFzID0gdmFRdWVyeVN1cmZhY2VBdHRyaWJ1dGVzKGh3Y3R4LT5kaXNwbGF5LCBjb25maWdfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHIsICZuYl9hdHRyKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IHN1cmZhY2UgYXR0cmlidXRlczogIgorICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGF2X2ZyZWVwKCZhdHRyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICBiZXN0X2Zvcm1hdCA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9hdHRyOyBpKyspIHsKKyAgICAgICAgaWYgKGF0dHJbaV0udHlwZSAhPSBWQVN1cmZhY2VBdHRyaWJQaXhlbEZvcm1hdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZvdXJjYyA9IGF0dHJbaV0udmFsdWUudmFsdWUuaTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IEZGX0FSUkFZX0VMRU1TKHZhYXBpX2Zvcm1hdF9tYXApOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChmb3VyY2MgPT0gdmFhcGlfZm9ybWF0X21hcFtqXS5mb3VyY2MpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogPj0gRkZfQVJSQVlfRUxFTVModmFhcGlfZm9ybWF0X21hcCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSWdub3JpbmcgdW5rbm93biBmb3JtYXQgJSN4LlxuIiwKKyAgICAgICAgICAgICAgICAgICBmb3VyY2MpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0ID0gdmFhcGlfZm9ybWF0X21hcFtqXS5waXhfZm10OworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkNvbnNpZGVyaW5nIGZvcm1hdCAlI3ggLT4gJXMuXG4iLAorICAgICAgICAgICAgICAgZm91cmNjLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKGZvcm1hdCkpOworCisgICAgICAgIGJlc3RfZm9ybWF0ID0gYXZfZmluZF9iZXN0X3BpeF9mbXRfb2ZfMihmb3JtYXQsIGJlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2Zvcm1hdCwgMCwgTlVMTCk7CisgICAgICAgIGlmIChmb3JtYXQgPT0gYmVzdF9mb3JtYXQpCisgICAgICAgICAgICBiZXN0X2ZvdXJjYyA9IGZvdXJjYzsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmYXR0cik7CisKKyAgICBpZiAoYmVzdF9mb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gdXNhYmxlIGZvcm1hdHMgZm9yIGRlY29kaW5nIVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJQaWNrZWQgJXMgKCUjeCkgYXMgYmVzdCBtYXRjaCBmb3IgJXMuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGJlc3RfZm9ybWF0KSwgYmVzdF9mb3VyY2MsCisgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoc291cmNlX2Zvcm1hdCkpOworCisgICAgZnJhbWVzLT5zd19mb3JtYXQgPSBiZXN0X2Zvcm1hdDsKKyAgICBpZiAoYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YSkgeworICAgICAgICBWQUFQSURlY29kZUNvbnRleHQgICAgKmN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgICAgIEFWVkFBUElGcmFtZXNDb250ZXh0ICphdmZjID0gZnJhbWVzLT5od2N0eDsKKworICAgICAgICBjdHgtPnBpeGVsX2Zvcm1hdF9hdHRyaWJ1dGUgPSAoVkFTdXJmYWNlQXR0cmliKSB7CisgICAgICAgICAgICAudHlwZSAgICAgICAgICA9IFZBU3VyZmFjZUF0dHJpYlBpeGVsRm9ybWF0LAorICAgICAgICAgICAgLnZhbHVlLnZhbHVlLmkgPSBiZXN0X2ZvdXJjYywKKyAgICAgICAgfTsKKworICAgICAgICBhdmZjLT5hdHRyaWJ1dGVzICAgID0gJmN0eC0+cGl4ZWxfZm9ybWF0X2F0dHJpYnV0ZTsKKyAgICAgICAgYXZmYy0+bmJfYXR0cmlidXRlcyA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOworICAgIGludCBjb2RlY19wcm9maWxlOworICAgIFZBUHJvZmlsZSB2YV9wcm9maWxlOworfSB2YWFwaV9wcm9maWxlX21hcFtdID0geworI2RlZmluZSBNQVAoYywgcCwgdikgeyBBVl9DT0RFQ19JRF8gIyMgYywgRkZfUFJPRklMRV8gIyMgcCwgVkFQcm9maWxlICMjIHYgfQorICAgIE1BUChNUEVHMlZJREVPLCAgTVBFRzJfU0lNUExFLCAgICBNUEVHMlNpbXBsZSApLAorICAgIE1BUChNUEVHMlZJREVPLCAgTVBFRzJfTUFJTiwgICAgICBNUEVHMk1haW4gICApLAorICAgIE1BUChIMjYzLCAgICAgICAgVU5LTk9XTiwgICAgICAgICBIMjYzQmFzZWxpbmUpLAorICAgIE1BUChNUEVHNCwgICAgICAgTVBFRzRfU0lNUExFLCAgICBNUEVHNFNpbXBsZSApLAorICAgIE1BUChNUEVHNCwgICAgICAgTVBFRzRfQURWQU5DRURfU0lNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1QRUc0QWR2YW5jZWRTaW1wbGUpLAorICAgIE1BUChNUEVHNCwgICAgICAgTVBFRzRfTUFJTiwgICAgICBNUEVHNE1haW4gICApLAorICAgIE1BUChIMjY0LCAgICAgICAgSDI2NF9DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRDb25zdHJhaW5lZEJhc2VsaW5lKSwKKyAgICBNQVAoSDI2NCwgICAgICAgIEgyNjRfTUFJTiwgICAgICAgSDI2NE1haW4gICAgKSwKKyAgICBNQVAoSDI2NCwgICAgICAgIEgyNjRfSElHSCwgICAgICAgSDI2NEhpZ2ggICAgKSwKKyNpZiBWQV9DSEVDS19WRVJTSU9OKDAsIDM3LCAwKQorICAgIE1BUChIRVZDLCAgICAgICAgSEVWQ19NQUlOLCAgICAgICBIRVZDTWFpbiAgICApLAorICAgIE1BUChIRVZDLCAgICAgICAgSEVWQ19NQUlOXzEwLCAgICBIRVZDTWFpbjEwICApLAorI2VuZGlmCisgICAgTUFQKE1KUEVHLCAgICAgICBNSlBFR19IVUZGTUFOX0JBU0VMSU5FX0RDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBFR0Jhc2VsaW5lKSwKKyAgICBNQVAoV01WMywgICAgICAgIFZDMV9TSU1QTEUsICAgICAgVkMxU2ltcGxlICAgKSwKKyAgICBNQVAoV01WMywgICAgICAgIFZDMV9NQUlOLCAgICAgICAgVkMxTWFpbiAgICAgKSwKKyAgICBNQVAoV01WMywgICAgICAgIFZDMV9DT01QTEVYLCAgICAgVkMxQWR2YW5jZWQgKSwKKyAgICBNQVAoV01WMywgICAgICAgIFZDMV9BRFZBTkNFRCwgICAgVkMxQWR2YW5jZWQgKSwKKyAgICBNQVAoVkMxLCAgICAgICAgIFZDMV9TSU1QTEUsICAgICAgVkMxU2ltcGxlICAgKSwKKyAgICBNQVAoVkMxLCAgICAgICAgIFZDMV9NQUlOLCAgICAgICAgVkMxTWFpbiAgICAgKSwKKyAgICBNQVAoVkMxLCAgICAgICAgIFZDMV9DT01QTEVYLCAgICAgVkMxQWR2YW5jZWQgKSwKKyAgICBNQVAoVkMxLCAgICAgICAgIFZDMV9BRFZBTkNFRCwgICAgVkMxQWR2YW5jZWQgKSwKKyNpZiBWQV9DSEVDS19WRVJTSU9OKDAsIDM1LCAwKQorICAgIE1BUChWUDgsICAgICAgICAgVU5LTk9XTiwgICAgICAgVlA4VmVyc2lvbjBfMyApLAorI2VuZGlmCisjaWYgVkFfQ0hFQ0tfVkVSU0lPTigwLCAzOCwgMCkKKyAgICBNQVAoVlA5LCAgICAgICAgIFZQOV8wLCAgICAgICAgICAgVlA5UHJvZmlsZTAgKSwKKyNlbmRpZgorI2lmIFZBX0NIRUNLX1ZFUlNJT04oMCwgMzksIDApCisgICAgTUFQKFZQOSwgICAgICAgICBWUDlfMiwgICAgICAgICAgIFZQOVByb2ZpbGUyICksCisjZW5kaWYKKyN1bmRlZiBNQVAKK307CisKKy8qCisgKiBTZXQgKnZhX2NvbmZpZyBhbmQgdGhlIGZyYW1lc19yZWYgZmllbGRzIGZyb20gdGhlIGN1cnJlbnQgY29kZWMgcGFyYW1ldGVycworICogaW4gYXZjdHguCisgKi8KK3N0YXRpYyBpbnQgdmFhcGlfZGVjb2RlX21ha2VfY29uZmlnKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpkZXZpY2VfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFDb25maWdJRCAqdmFfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmZyYW1lc19yZWYpCit7CisgICAgQVZWQUFQSUhXQ29uZmlnICAgICAgICpod2NvbmZpZyAgICA9IE5VTEw7CisgICAgQVZIV0ZyYW1lc0NvbnN0cmFpbnRzICpjb25zdHJhaW50cyA9IE5VTEw7CisgICAgVkFTdGF0dXMgdmFzOworICAgIGludCBlcnIsIGksIGo7CisgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmNvZGVjX2Rlc2M7CisgICAgVkFQcm9maWxlICpwcm9maWxlX2xpc3QgPSBOVUxMLCBtYXRjaGVkX3ZhX3Byb2ZpbGU7CisgICAgaW50IHByb2ZpbGVfY291bnQsIGV4YWN0X21hdGNoLCBtYXRjaGVkX2ZmX3Byb2ZpbGU7CisKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAgICAqZGV2aWNlID0gKEFWSFdEZXZpY2VDb250ZXh0KilkZXZpY2VfcmVmLT5kYXRhOworICAgIEFWVkFBUElEZXZpY2VDb250ZXh0ICpod2N0eCA9IGRldmljZS0+aHdjdHg7CisKKyAgICBjb2RlY19kZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChhdmN0eC0+Y29kZWNfaWQpOworICAgIGlmICghY29kZWNfZGVzYykgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBwcm9maWxlX2NvdW50ID0gdmFNYXhOdW1Qcm9maWxlcyhod2N0eC0+ZGlzcGxheSk7CisgICAgcHJvZmlsZV9saXN0ICA9IGF2X21hbGxvY19hcnJheShwcm9maWxlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZBUHJvZmlsZSkpOworICAgIGlmICghcHJvZmlsZV9saXN0KSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHZhcyA9IHZhUXVlcnlDb25maWdQcm9maWxlcyhod2N0eC0+ZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9saXN0LCAmcHJvZmlsZV9jb3VudCk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBwcm9maWxlczogIgorICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG1hdGNoZWRfdmFfcHJvZmlsZSA9IFZBUHJvZmlsZU5vbmU7CisgICAgZXhhY3RfbWF0Y2ggPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHZhYXBpX3Byb2ZpbGVfbWFwKTsgaSsrKSB7CisgICAgICAgIGludCBwcm9maWxlX21hdGNoID0gMDsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSB2YWFwaV9wcm9maWxlX21hcFtpXS5jb2RlY19pZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYXZjdHgtPnByb2ZpbGUgPT0gdmFhcGlfcHJvZmlsZV9tYXBbaV0uY29kZWNfcHJvZmlsZSB8fAorICAgICAgICAgICAgdmFhcGlfcHJvZmlsZV9tYXBbaV0uY29kZWNfcHJvZmlsZSA9PSBGRl9QUk9GSUxFX1VOS05PV04pCisgICAgICAgICAgICBwcm9maWxlX21hdGNoID0gMTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHByb2ZpbGVfY291bnQ7IGorKykgeworICAgICAgICAgICAgaWYgKHZhYXBpX3Byb2ZpbGVfbWFwW2ldLnZhX3Byb2ZpbGUgPT0gcHJvZmlsZV9saXN0W2pdKSB7CisgICAgICAgICAgICAgICAgZXhhY3RfbWF0Y2ggPSBwcm9maWxlX21hdGNoOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChqIDwgcHJvZmlsZV9jb3VudCkgeworICAgICAgICAgICAgbWF0Y2hlZF92YV9wcm9maWxlID0gdmFhcGlfcHJvZmlsZV9tYXBbaV0udmFfcHJvZmlsZTsKKyAgICAgICAgICAgIG1hdGNoZWRfZmZfcHJvZmlsZSA9IHZhYXBpX3Byb2ZpbGVfbWFwW2ldLmNvZGVjX3Byb2ZpbGU7CisgICAgICAgICAgICBpZiAoZXhhY3RfbWF0Y2gpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnByb2ZpbGVfbGlzdCk7CisKKyAgICBpZiAobWF0Y2hlZF92YV9wcm9maWxlID09IFZBUHJvZmlsZU5vbmUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBzdXBwb3J0IGZvciBjb2RlYyAlcyAiCisgICAgICAgICAgICAgICAicHJvZmlsZSAlZC5cbiIsIGNvZGVjX2Rlc2MtPm5hbWUsIGF2Y3R4LT5wcm9maWxlKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmICghZXhhY3RfbWF0Y2gpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsX2ZsYWdzICYKKyAgICAgICAgICAgIEFWX0hXQUNDRUxfRkxBR19BTExPV19QUk9GSUxFX01JU01BVENIKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ29kZWMgJXMgcHJvZmlsZSAlZCBub3QgIgorICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgZm9yIGhhcmR3YXJlIGRlY29kZS5cbiIsCisgICAgICAgICAgICAgICAgICAgY29kZWNfZGVzYy0+bmFtZSwgYXZjdHgtPnByb2ZpbGUpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlVzaW5nIHBvc3NpYmx5LSIKKyAgICAgICAgICAgICAgICAgICAiaW5jb21wYXRpYmxlIHByb2ZpbGUgJWQgaW5zdGVhZC5cbiIsCisgICAgICAgICAgICAgICAgICAgbWF0Y2hlZF9mZl9wcm9maWxlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDb2RlYyAlcyBwcm9maWxlICVkIG5vdCAiCisgICAgICAgICAgICAgICAgICAgInN1cHBvcnRlZCBmb3IgaGFyZHdhcmUgZGVjb2RlLlxuIiwKKyAgICAgICAgICAgICAgICAgICBjb2RlY19kZXNjLT5uYW1lLCBhdmN0eC0+cHJvZmlsZSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YXMgPSB2YUNyZWF0ZUNvbmZpZyhod2N0eC0+ZGlzcGxheSwgbWF0Y2hlZF92YV9wcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZBRW50cnlwb2ludFZMRCwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2YV9jb25maWcpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGRlY29kZSAiCisgICAgICAgICAgICAgICAiY29uZmlndXJhdGlvbjogJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaHdjb25maWcgPSBhdl9od2RldmljZV9od2NvbmZpZ19hbGxvYyhkZXZpY2VfcmVmKTsKKyAgICBpZiAoIWh3Y29uZmlnKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBod2NvbmZpZy0+Y29uZmlnX2lkID0gKnZhX2NvbmZpZzsKKworICAgIGNvbnN0cmFpbnRzID0KKyAgICAgICAgYXZfaHdkZXZpY2VfZ2V0X2h3ZnJhbWVfY29uc3RyYWludHMoZGV2aWNlX3JlZiwgaHdjb25maWcpOworICAgIGlmICghY29uc3RyYWludHMpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2RlZF93aWR0aCAgPCBjb25zdHJhaW50cy0+bWluX3dpZHRoICB8fAorICAgICAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0IDwgY29uc3RyYWludHMtPm1pbl9oZWlnaHQgfHwKKyAgICAgICAgYXZjdHgtPmNvZGVkX3dpZHRoICA+IGNvbnN0cmFpbnRzLT5tYXhfd2lkdGggIHx8CisgICAgICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQgPiBjb25zdHJhaW50cy0+bWF4X2hlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgaW1hZ2UgIgorICAgICAgICAgICAgICAgInNpemUgJWR4JWQgKGNvbnN0cmFpbnRzOiB3aWR0aCAlZC0lZCBoZWlnaHQgJWQtJWQpLlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlZF93aWR0aCwgYXZjdHgtPmNvZGVkX2hlaWdodCwKKyAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLT5taW5fd2lkdGgsICBjb25zdHJhaW50cy0+bWF4X3dpZHRoLAorICAgICAgICAgICAgICAgY29uc3RyYWludHMtPm1pbl9oZWlnaHQsIGNvbnN0cmFpbnRzLT5tYXhfaGVpZ2h0KTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmICghY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHMgfHwKKyAgICAgICAgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHNbMF0gPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSGFyZHdhcmUgZG9lcyBub3Qgb2ZmZXIgYW55ICIKKyAgICAgICAgICAgICAgICJ1c2FibGUgc3VyZmFjZSBmb3JtYXRzLlxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChmcmFtZXNfcmVmKSB7CisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmcmFtZXMgPSAoQVZIV0ZyYW1lc0NvbnRleHQgKilmcmFtZXNfcmVmLT5kYXRhOworCisgICAgICAgIGZyYW1lcy0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9WQUFQSTsKKyAgICAgICAgZnJhbWVzLT53aWR0aCA9IGF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgZnJhbWVzLT5oZWlnaHQgPSBhdmN0eC0+Y29kZWRfaGVpZ2h0OworCisgICAgICAgIGVyciA9IHZhYXBpX2RlY29kZV9maW5kX2Jlc3RfZm9ybWF0KGF2Y3R4LCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YV9jb25maWcsIGZyYW1lcyk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGZyYW1lcy0+aW5pdGlhbF9wb29sX3NpemUgPSAxOworICAgICAgICAvLyBBZGQgcGVyLWNvZGVjIG51bWJlciBvZiBzdXJmYWNlcyB1c2VkIGZvciBzdG9yaW5nIHJlZmVyZW5jZSBmcmFtZXMuCisgICAgICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX2lkKSB7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IRVZDOgorICAgICAgICAgICAgZnJhbWVzLT5pbml0aWFsX3Bvb2xfc2l6ZSArPSAxNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1ZQOToKKyAgICAgICAgICAgIGZyYW1lcy0+aW5pdGlhbF9wb29sX3NpemUgKz0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1ZQODoKKyAgICAgICAgICAgIGZyYW1lcy0+aW5pdGlhbF9wb29sX3NpemUgKz0gMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZnJhbWVzLT5pbml0aWFsX3Bvb2xfc2l6ZSArPSAyOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfaHdmcmFtZV9jb25zdHJhaW50c19mcmVlKCZjb25zdHJhaW50cyk7CisgICAgYXZfZnJlZXAoJmh3Y29uZmlnKTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2h3ZnJhbWVfY29uc3RyYWludHNfZnJlZSgmY29uc3RyYWludHMpOworICAgIGF2X2ZyZWVwKCZod2NvbmZpZyk7CisgICAgaWYgKCp2YV9jb25maWcgIT0gVkFfSU5WQUxJRF9JRCkgeworICAgICAgICB2YURlc3Ryb3lDb25maWcoaHdjdHgtPmRpc3BsYXksICp2YV9jb25maWcpOworICAgICAgICAqdmFfY29uZmlnID0gVkFfSU5WQUxJRF9JRDsKKyAgICB9CisgICAgYXZfZnJlZXAoJnByb2ZpbGVfbGlzdCk7CisgICAgcmV0dXJuIGVycjsKK30KKworaW50IGZmX3ZhYXBpX2NvbW1vbl9mcmFtZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19jdHgpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmh3X2ZyYW1lcyA9IChBVkhXRnJhbWVzQ29udGV4dCAqKWh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZIV0RldmljZUNvbnRleHQgKmRldmljZV9jdHggPSBod19mcmFtZXMtPmRldmljZV9jdHg7CisgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmh3Y3R4OworICAgIFZBQ29uZmlnSUQgdmFfY29uZmlnID0gVkFfSU5WQUxJRF9JRDsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGRldmljZV9jdHgtPnR5cGUgIT0gQVZfSFdERVZJQ0VfVFlQRV9WQUFQSSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBod2N0eCA9IGRldmljZV9jdHgtPmh3Y3R4OworCisgICAgZXJyID0gdmFhcGlfZGVjb2RlX21ha2VfY29uZmlnKGF2Y3R4LCBod19mcmFtZXMtPmRldmljZV9yZWYsICZ2YV9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3X2ZyYW1lc19jdHgpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAodmFfY29uZmlnICE9IFZBX0lOVkFMSURfSUQpCisgICAgICAgIHZhRGVzdHJveUNvbmZpZyhod2N0eC0+ZGlzcGxheSwgdmFfY29uZmlnKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfdmFhcGlfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRGVjb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgaW50IGVycjsKKworICAgIGN0eC0+dmFfY29uZmlnICA9IFZBX0lOVkFMSURfSUQ7CisgICAgY3R4LT52YV9jb250ZXh0ID0gVkFfSU5WQUxJRF9JRDsKKworI2lmIEZGX0FQSV9TVFJVQ1RfVkFBUElfQ09OVEVYVAorICAgIGlmIChhdmN0eC0+aHdhY2NlbF9jb250ZXh0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJVc2luZyBkZXByZWNhdGVkIHN0cnVjdCAiCisgICAgICAgICAgICAgICAidmFhcGlfY29udGV4dCBpbiBkZWNvZGUuXG4iKTsKKworICAgICAgICBjdHgtPmhhdmVfb2xkX2NvbnRleHQgPSAxOworICAgICAgICBjdHgtPm9sZF9jb250ZXh0ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKworICAgICAgICAvLyBSZWFsbHkgd2Ugb25seSB3YW50IHRoZSBWQUFQSSBkZXZpY2UgY29udGV4dCwgYnV0IHRoaXMKKyAgICAgICAgLy8gYWxsb2NhdGVzIGEgd2hvbGUgZ2VuZXJpYyBkZXZpY2UgY29udGV4dCBiZWNhdXNlIHdlIGRvbid0CisgICAgICAgIC8vIGhhdmUgYW55IG90aGVyIHdheSB0byBkZXRlcm1pbmUgaG93IGJpZyBpdCBzaG91bGQgYmUuCisgICAgICAgIGN0eC0+ZGV2aWNlX3JlZiA9CisgICAgICAgICAgICBhdl9od2RldmljZV9jdHhfYWxsb2MoQVZfSFdERVZJQ0VfVFlQRV9WQUFQSSk7CisgICAgICAgIGlmICghY3R4LT5kZXZpY2VfcmVmKSB7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5kZXZpY2UgPSAoQVZIV0RldmljZUNvbnRleHQqKWN0eC0+ZGV2aWNlX3JlZi0+ZGF0YTsKKyAgICAgICAgY3R4LT5od2N0eCAgPSBjdHgtPmRldmljZS0+aHdjdHg7CisKKyAgICAgICAgY3R4LT5od2N0eC0+ZGlzcGxheSA9IGN0eC0+b2xkX2NvbnRleHQtPmRpc3BsYXk7CisKKyAgICAgICAgLy8gVGhlIG9sZCBWQUFQSSBkZWNvZGUgc2V0dXAgYXNzdW1lZCB0aGlzIHF1aXJrIHdhcyBhbHdheXMKKyAgICAgICAgLy8gcHJlc2VudCwgc28gc2V0IGl0IGhlcmUgdG8gYXZvaWQgdGhlIGJlaGF2aW91ciBjaGFuZ2luZy4KKyAgICAgICAgY3R4LT5od2N0eC0+ZHJpdmVyX3F1aXJrcyA9CisgICAgICAgICAgICBBVl9WQUFQSV9EUklWRVJfUVVJUktfUkVOREVSX1BBUkFNX0JVRkZFUlM7CisKKyAgICB9CisjZW5kaWYKKworI2lmIEZGX0FQSV9TVFJVQ1RfVkFBUElfQ09OVEVYVAorICAgIGlmIChjdHgtPmhhdmVfb2xkX2NvbnRleHQpIHsKKyAgICAgICAgY3R4LT52YV9jb25maWcgID0gY3R4LT5vbGRfY29udGV4dC0+Y29uZmlnX2lkOworICAgICAgICBjdHgtPnZhX2NvbnRleHQgPSBjdHgtPm9sZF9jb250ZXh0LT5jb250ZXh0X2lkOworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVXNpbmcgdXNlci1zdXBwbGllZCBkZWNvZGVyICIKKyAgICAgICAgICAgICAgICJjb250ZXh0OiAlI3gvJSN4LlxuIiwgY3R4LT52YV9jb25maWcsIGN0eC0+dmFfY29udGV4dCk7CisgICAgfSBlbHNlIHsKKyNlbmRpZgorCisgICAgZXJyID0gZmZfZGVjb2RlX2dldF9od19mcmFtZXNfY3R4KGF2Y3R4LCBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgY3R4LT5mcmFtZXMgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWF2Y3R4LT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgIGN0eC0+aHdmYyAgID0gY3R4LT5mcmFtZXMtPmh3Y3R4OworICAgIGN0eC0+ZGV2aWNlID0gY3R4LT5mcmFtZXMtPmRldmljZV9jdHg7CisgICAgY3R4LT5od2N0eCAgPSBjdHgtPmRldmljZS0+aHdjdHg7CisKKyAgICBlcnIgPSB2YWFwaV9kZWNvZGVfbWFrZV9jb25maWcoYXZjdHgsIGN0eC0+ZnJhbWVzLT5kZXZpY2VfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT52YV9jb25maWcsIGF2Y3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICB2YXMgPSB2YUNyZWF0ZUNvbnRleHQoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlZF93aWR0aCwgYXZjdHgtPmNvZGVkX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkFfUFJPR1JFU1NJVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aHdmYy0+c3VyZmFjZV9pZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aHdmYy0+bmJfc3VyZmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHgtPnZhX2NvbnRleHQpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGRlY29kZSAiCisgICAgICAgICAgICAgICAiY29udGV4dDogJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJEZWNvZGUgY29udGV4dCBpbml0aWFsaXNlZDogIgorICAgICAgICAgICAiJSN4LyUjeC5cbiIsIGN0eC0+dmFfY29uZmlnLCBjdHgtPnZhX2NvbnRleHQpOworI2lmIEZGX0FQSV9TVFJVQ1RfVkFBUElfQ09OVEVYVAorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZmZfdmFhcGlfZGVjb2RlX3VuaW5pdChhdmN0eCk7CisgICAgcmV0dXJuIGVycjsKK30KKworaW50IGZmX3ZhYXBpX2RlY29kZV91bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRGVjb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBWQVN0YXR1cyB2YXM7CisKKyNpZiBGRl9BUElfU1RSVUNUX1ZBQVBJX0NPTlRFWFQKKyAgICBpZiAoY3R4LT5oYXZlX29sZF9jb250ZXh0KSB7CisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5kZXZpY2VfcmVmKTsKKyAgICB9IGVsc2UgeworI2VuZGlmCisKKyAgICBpZiAoY3R4LT52YV9jb250ZXh0ICE9IFZBX0lOVkFMSURfSUQpIHsKKyAgICAgICAgdmFzID0gdmFEZXN0cm95Q29udGV4dChjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQpOworICAgICAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBkZXN0cm95IGRlY29kZSAiCisgICAgICAgICAgICAgICAgICAgImNvbnRleHQgJSN4OiAlZCAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPnZhX2NvbnRleHQsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY3R4LT52YV9jb25maWcgIT0gVkFfSU5WQUxJRF9JRCkgeworICAgICAgICB2YXMgPSB2YURlc3Ryb3lDb25maWcoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb25maWcpOworICAgICAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBkZXN0cm95IGRlY29kZSAiCisgICAgICAgICAgICAgICAgICAgImNvbmZpZ3VyYXRpb24gJSN4OiAlZCAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPnZhX2NvbmZpZywgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICB9CisgICAgfQorCisjaWYgRkZfQVBJX1NUUlVDVF9WQUFQSV9DT05URVhUCisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmFhcGlfZGVjb2RlLmggYi9saWJhdmNvZGVjL3ZhYXBpX2RlY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNDE1ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3ZhYXBpX2RlY29kZS5oCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WQUFQSV9ERUNPREVfSAorI2RlZmluZSBBVkNPREVDX1ZBQVBJX0RFQ09ERV9ICisKKyNpbmNsdWRlIDx2YS92YS5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfdmFhcGkuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKworI2luY2x1ZGUgInZlcnNpb24uaCIKKyNpZiBGRl9BUElfU1RSVUNUX1ZBQVBJX0NPTlRFWFQKKyNpbmNsdWRlICJ2YWFwaS5oIgorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgVkFTdXJmYWNlSUQgZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQoQVZGcmFtZSAqcGljKQoreworICAgIHJldHVybiAodWludHB0cl90KXBpYy0+ZGF0YVszXTsKK30KKworZW51bSB7CisgICAgTUFYX1BBUkFNX0JVRkZFUlMgPSAxNiwKK307CisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRGVjb2RlUGljdHVyZSB7CisgICAgVkFTdXJmYWNlSUQgICAgICAgICAgIG91dHB1dF9zdXJmYWNlOworCisgICAgaW50ICAgICAgICAgICAgICAgIG5iX3BhcmFtX2J1ZmZlcnM7CisgICAgVkFCdWZmZXJJRCAgICAgICAgICAgIHBhcmFtX2J1ZmZlcnNbTUFYX1BBUkFNX0JVRkZFUlNdOworCisgICAgaW50ICAgICAgICAgICAgICAgIG5iX3NsaWNlczsKKyAgICBWQUJ1ZmZlcklEICAgICAgICAgICAqc2xpY2VfYnVmZmVyczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgc2xpY2VzX2FsbG9jYXRlZDsKK30gVkFBUElEZWNvZGVQaWN0dXJlOworCit0eXBlZGVmIHN0cnVjdCBWQUFQSURlY29kZUNvbnRleHQgeworICAgIFZBQ29uZmlnSUQgICAgICAgICAgICB2YV9jb25maWc7CisgICAgVkFDb250ZXh0SUQgICAgICAgICAgIHZhX2NvbnRleHQ7CisKKyNpZiBGRl9BUElfU1RSVUNUX1ZBQVBJX0NPTlRFWFQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgaGF2ZV9vbGRfY29udGV4dDsKKyAgICBzdHJ1Y3QgdmFhcGlfY29udGV4dCAqb2xkX2NvbnRleHQ7CisgICAgQVZCdWZmZXJSZWYgICAgICAgICAgKmRldmljZV9yZWY7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgQVZIV0RldmljZUNvbnRleHQgICAgKmRldmljZTsKKyAgICBBVlZBQVBJRGV2aWNlQ29udGV4dCAqaHdjdHg7CisKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAqZnJhbWVzOworICAgIEFWVkFBUElGcmFtZXNDb250ZXh0ICpod2ZjOworCisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICAgIHN1cmZhY2VfZm9ybWF0OworICAgIGludCAgICAgICAgICAgICAgICAgICBzdXJmYWNlX2NvdW50OworCisgICAgVkFTdXJmYWNlQXR0cmliICAgICAgIHBpeGVsX2Zvcm1hdF9hdHRyaWJ1dGU7Cit9IFZBQVBJRGVjb2RlQ29udGV4dDsKKworCitpbnQgZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSk7CisKK2ludCBmZl92YWFwaV9kZWNvZGVfbWFrZV9zbGljZV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcGFyYW1zX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXJhbXNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc2xpY2VfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNsaWNlX3NpemUpOworCitpbnQgZmZfdmFhcGlfZGVjb2RlX2lzc3VlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMpOworaW50IGZmX3ZhYXBpX2RlY29kZV9jYW5jZWwoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMpOworCitpbnQgZmZfdmFhcGlfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKK2ludCBmZl92YWFwaV9kZWNvZGVfdW5pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl92YWFwaV9jb21tb25fZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4KTsKKworI2VuZGlmIC8qIEFWQ09ERUNfVkFBUElfREVDT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlLmMgYi9saWJhdmNvZGVjL3ZhYXBpX2VuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2Yzg1YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3ZhYXBpX2VuY29kZS5jCkBAIC0wLDAgKzEsMTU4OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgInZhYXBpX2VuY29kZS5oIgorI2luY2x1ZGUgImF2Y29kZWMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaWN0dXJlX3R5cGVfbmFtZVtdID0geyAiSURSIiwgIkkiLCAiUCIsICJCIiB9OworCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9tYWtlX3BhY2tlZF9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBjaGFyICpkYXRhLCBzaXplX3QgYml0X2xlbikKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFTdGF0dXMgdmFzOworICAgIFZBQnVmZmVySUQgcGFyYW1fYnVmZmVyLCBkYXRhX2J1ZmZlcjsKKyAgICBWQUJ1ZmZlcklEICp0bXA7CisgICAgVkFFbmNQYWNrZWRIZWFkZXJQYXJhbWV0ZXJCdWZmZXIgcGFyYW1zID0geworICAgICAgICAudHlwZSA9IHR5cGUsCisgICAgICAgIC5iaXRfbGVuZ3RoID0gYml0X2xlbiwKKyAgICAgICAgLmhhc19lbXVsYXRpb25fYnl0ZXMgPSAxLAorICAgIH07CisKKyAgICB0bXAgPSBhdl9yZWFsbG9jX2FycmF5KHBpYy0+cGFyYW1fYnVmZmVycywgc2l6ZW9mKCp0bXApLCBwaWMtPm5iX3BhcmFtX2J1ZmZlcnMgKyAyKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBwaWMtPnBhcmFtX2J1ZmZlcnMgPSB0bXA7CisKKyAgICB2YXMgPSB2YUNyZWF0ZUJ1ZmZlcihjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVkFFbmNQYWNrZWRIZWFkZXJQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwYXJhbXMpLCAxLCAmcGFyYW1zLCAmcGFyYW1fYnVmZmVyKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBwYXJhbWV0ZXIgYnVmZmVyICIKKyAgICAgICAgICAgICAgICJmb3IgcGFja2VkIGhlYWRlciAodHlwZSAlZCk6ICVkICglcykuXG4iLAorICAgICAgICAgICAgICAgdHlwZSwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBwaWMtPnBhcmFtX2J1ZmZlcnNbcGljLT5uYl9wYXJhbV9idWZmZXJzKytdID0gcGFyYW1fYnVmZmVyOworCisgICAgdmFzID0gdmFDcmVhdGVCdWZmZXIoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFZBRW5jUGFja2VkSGVhZGVyRGF0YUJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdF9sZW4gKyA3KSAvIDgsIDEsIGRhdGEsICZkYXRhX2J1ZmZlcik7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgZGF0YSBidWZmZXIgIgorICAgICAgICAgICAgICAgImZvciBwYWNrZWQgaGVhZGVyICh0eXBlICVkKTogJWQgKCVzKS5cbiIsCisgICAgICAgICAgICAgICB0eXBlLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIHBpYy0+cGFyYW1fYnVmZmVyc1twaWMtPm5iX3BhcmFtX2J1ZmZlcnMrK10gPSBkYXRhX2J1ZmZlcjsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUGFja2VkIGhlYWRlciBidWZmZXIgKCVkKSBpcyAlI3gvJSN4ICIKKyAgICAgICAgICAgIiglenUgYml0cykuXG4iLCB0eXBlLCBwYXJhbV9idWZmZXIsIGRhdGFfYnVmZmVyLCBiaXRfbGVuKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfbWFrZV9wYXJhbV9idWZmZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgY2hhciAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFTdGF0dXMgdmFzOworICAgIFZBQnVmZmVySUQgKnRtcDsKKyAgICBWQUJ1ZmZlcklEIGJ1ZmZlcjsKKworICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkocGljLT5wYXJhbV9idWZmZXJzLCBzaXplb2YoKnRtcCksIHBpYy0+bmJfcGFyYW1fYnVmZmVycyArIDEpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHBpYy0+cGFyYW1fYnVmZmVycyA9IHRtcDsKKworICAgIHZhcyA9IHZhQ3JlYXRlQnVmZmVyKGN0eC0+aHdjdHgtPmRpc3BsYXksIGN0eC0+dmFfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBsZW4sIDEsIGRhdGEsICZidWZmZXIpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIHBhcmFtZXRlciBidWZmZXIgIgorICAgICAgICAgICAgICAgIih0eXBlICVkKTogJWQgKCVzKS5cbiIsIHR5cGUsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgcGljLT5wYXJhbV9idWZmZXJzW3BpYy0+bmJfcGFyYW1fYnVmZmVycysrXSA9IGJ1ZmZlcjsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUGFyYW0gYnVmZmVyICglZCkgaXMgJSN4LlxuIiwKKyAgICAgICAgICAgdHlwZSwgYnVmZmVyKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfd2FpdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljKQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQVN0YXR1cyB2YXM7CisKKyAgICBhdl9hc3NlcnQwKHBpYy0+ZW5jb2RlX2lzc3VlZCk7CisKKyAgICBpZiAocGljLT5lbmNvZGVfY29tcGxldGUpIHsKKyAgICAgICAgLy8gQWxyZWFkeSB3YWl0ZWQgZm9yIHRoaXMgcGljdHVyZS4KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJTeW5jIHRvIHBpYyAlIlBSSWQ2NCIvJSJQUklkNjQiICIKKyAgICAgICAgICAgIihpbnB1dCBzdXJmYWNlICUjeCkuXG4iLCBwaWMtPmRpc3BsYXlfb3JkZXIsCisgICAgICAgICAgIHBpYy0+ZW5jb2RlX29yZGVyLCBwaWMtPmlucHV0X3N1cmZhY2UpOworCisgICAgdmFzID0gdmFTeW5jU3VyZmFjZShjdHgtPmh3Y3R4LT5kaXNwbGF5LCBwaWMtPmlucHV0X3N1cmZhY2UpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc3luYyB0byBwaWN0dXJlIGNvbXBsZXRpb246ICIKKyAgICAgICAgICAgICAgICIlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIC8vIElucHV0IGlzIGRlZmluaXRlbHkgZmluaXNoZWQgd2l0aCBub3cuCisgICAgYXZfZnJhbWVfZnJlZSgmcGljLT5pbnB1dF9pbWFnZSk7CisKKyAgICBwaWMtPmVuY29kZV9jb21wbGV0ZSA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2lzc3VlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljKQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZVNsaWNlICpzbGljZTsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgaW50IGVyciwgaTsKKyAgICBjaGFyIGRhdGFbTUFYX1BBUkFNX0JVRkZFUl9TSVpFXTsKKyAgICBzaXplX3QgYml0X2xlbjsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSXNzdWluZyBlbmNvZGUgZm9yIHBpYyAlIlBSSWQ2NCIvJSJQUklkNjQiICIKKyAgICAgICAgICAgImFzIHR5cGUgJXMuXG4iLCBwaWMtPmRpc3BsYXlfb3JkZXIsIHBpYy0+ZW5jb2RlX29yZGVyLAorICAgICAgICAgICBwaWN0dXJlX3R5cGVfbmFtZVtwaWMtPnR5cGVdKTsKKyAgICBpZiAocGljLT5uYl9yZWZzID09IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJObyByZWZlcmVuY2UgcGljdHVyZXMuXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlJlZmVycyB0bzoiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpYy0+bmJfcmVmczsgaSsrKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiAlIlBSSWQ2NCIvJSJQUklkNjQsCisgICAgICAgICAgICAgICAgICAgcGljLT5yZWZzW2ldLT5kaXNwbGF5X29yZGVyLCBwaWMtPnJlZnNbaV0tPmVuY29kZV9vcmRlcik7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIuXG4iKTsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKHBpYy0+aW5wdXRfYXZhaWxhYmxlICYmICFwaWMtPmVuY29kZV9pc3N1ZWQpOworICAgIGZvciAoaSA9IDA7IGkgPCBwaWMtPm5iX3JlZnM7IGkrKykgeworICAgICAgICBhdl9hc3NlcnQwKHBpYy0+cmVmc1tpXSk7CisgICAgICAgIC8vIElmIHdlIGFyZSBzZXJpYWxpc2VkIHRoZW4gdGhlIHJlZmVyZW5jZXMgbXVzdCBoYXZlIGFscmVhZHkKKyAgICAgICAgLy8gY29tcGxldGVkLiAgSWYgbm90LCB0aGV5IG11c3QgaGF2ZSBiZWVuIGlzc3VlZCBidXQgbmVlZCBub3QKKyAgICAgICAgLy8gaGF2ZSBjb21wbGV0ZWQgeWV0LgorICAgICAgICBpZiAoY3R4LT5pc3N1ZV9tb2RlID09IElTU1VFX01PREVfU0VSSUFMSVNFX0VWRVJZVEhJTkcpCisgICAgICAgICAgICBhdl9hc3NlcnQwKHBpYy0+cmVmc1tpXS0+ZW5jb2RlX2NvbXBsZXRlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfYXNzZXJ0MChwaWMtPnJlZnNbaV0tPmVuY29kZV9pc3N1ZWQpOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiSW5wdXQgc3VyZmFjZSBpcyAlI3guXG4iLCBwaWMtPmlucHV0X3N1cmZhY2UpOworCisgICAgcGljLT5yZWNvbl9pbWFnZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFwaWMtPnJlY29uX2ltYWdlKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IGF2X2h3ZnJhbWVfZ2V0X2J1ZmZlcihjdHgtPnJlY29uX2ZyYW1lc19yZWYsIHBpYy0+cmVjb25faW1hZ2UsIDApOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBwaWMtPnJlY29uX3N1cmZhY2UgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClwaWMtPnJlY29uX2ltYWdlLT5kYXRhWzNdOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUmVjb24gc3VyZmFjZSBpcyAlI3guXG4iLCBwaWMtPnJlY29uX3N1cmZhY2UpOworCisgICAgcGljLT5vdXRwdXRfYnVmZmVyX3JlZiA9IGF2X2J1ZmZlcl9wb29sX2dldChjdHgtPm91dHB1dF9idWZmZXJfcG9vbCk7CisgICAgaWYgKCFwaWMtPm91dHB1dF9idWZmZXJfcmVmKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBwaWMtPm91dHB1dF9idWZmZXIgPSAoVkFCdWZmZXJJRCkodWludHB0cl90KXBpYy0+b3V0cHV0X2J1ZmZlcl9yZWYtPmRhdGE7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJPdXRwdXQgYnVmZmVyIGlzICUjeC5cbiIsCisgICAgICAgICAgIHBpYy0+b3V0cHV0X2J1ZmZlcik7CisKKyAgICBpZiAoY3R4LT5jb2RlYy0+cGljdHVyZV9wYXJhbXNfc2l6ZSA+IDApIHsKKyAgICAgICAgcGljLT5jb2RlY19waWN0dXJlX3BhcmFtcyA9IGF2X21hbGxvYyhjdHgtPmNvZGVjLT5waWN0dXJlX3BhcmFtc19zaXplKTsKKyAgICAgICAgaWYgKCFwaWMtPmNvZGVjX3BpY3R1cmVfcGFyYW1zKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBtZW1jcHkocGljLT5jb2RlY19waWN0dXJlX3BhcmFtcywgY3R4LT5jb2RlY19waWN0dXJlX3BhcmFtcywKKyAgICAgICAgICAgICAgIGN0eC0+Y29kZWMtPnBpY3R1cmVfcGFyYW1zX3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2Fzc2VydDAoIWN0eC0+Y29kZWNfcGljdHVyZV9wYXJhbXMpOworICAgIH0KKworICAgIHBpYy0+bmJfcGFyYW1fYnVmZmVycyA9IDA7CisKKyAgICBpZiAocGljLT5lbmNvZGVfb3JkZXIgPT0gMCkgeworICAgICAgICAvLyBHbG9iYWwgcGFyYW1ldGVyIGJ1ZmZlcnMgYXJlIHNldCBvbiB0aGUgZmlyc3QgcGljdHVyZSBvbmx5LgorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2dsb2JhbF9wYXJhbXM7IGkrKykgeworICAgICAgICAgICAgZXJyID0gdmFhcGlfZW5jb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFFbmNNaXNjUGFyYW1ldGVyQnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopY3R4LT5nbG9iYWxfcGFyYW1zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Z2xvYmFsX3BhcmFtc19zaXplW2ldKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0lEUiAmJiBjdHgtPmNvZGVjLT5pbml0X3NlcXVlbmNlX3BhcmFtcykgeworICAgICAgICBlcnIgPSB2YWFwaV9lbmNvZGVfbWFrZV9wYXJhbV9idWZmZXIoYXZjdHgsIHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBRW5jU2VxdWVuY2VQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jb2RlY19zZXF1ZW5jZV9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmNvZGVjLT5zZXF1ZW5jZV9wYXJhbXNfc2l6ZSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChjdHgtPmNvZGVjLT5pbml0X3BpY3R1cmVfcGFyYW1zKSB7CisgICAgICAgIGVyciA9IGN0eC0+Y29kZWMtPmluaXRfcGljdHVyZV9wYXJhbXMoYXZjdHgsIHBpYyk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXNlIHBpY3R1cmUgIgorICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXJzOiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gdmFhcGlfZW5jb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5jb2RlY19waWN0dXJlX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y29kZWMtPnBpY3R1cmVfcGFyYW1zX3NpemUpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JRFIpIHsKKyAgICAgICAgaWYgKGN0eC0+dmFfcGFja2VkX2hlYWRlcnMgJiBWQV9FTkNfUEFDS0VEX0hFQURFUl9TRVFVRU5DRSAmJgorICAgICAgICAgICAgY3R4LT5jb2RlYy0+d3JpdGVfc2VxdWVuY2VfaGVhZGVyKSB7CisgICAgICAgICAgICBiaXRfbGVuID0gOCAqIHNpemVvZihkYXRhKTsKKyAgICAgICAgICAgIGVyciA9IGN0eC0+Y29kZWMtPndyaXRlX3NlcXVlbmNlX2hlYWRlcihhdmN0eCwgZGF0YSwgJmJpdF9sZW4pOworICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB3cml0ZSBwZXItc2VxdWVuY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyOiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gdmFhcGlfZW5jb2RlX21ha2VfcGFja2VkX2hlYWRlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmNvZGVjLT5zZXF1ZW5jZV9oZWFkZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgYml0X2xlbik7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3R4LT52YV9wYWNrZWRfaGVhZGVycyAmIFZBX0VOQ19QQUNLRURfSEVBREVSX1BJQ1RVUkUgJiYKKyAgICAgICAgY3R4LT5jb2RlYy0+d3JpdGVfcGljdHVyZV9oZWFkZXIpIHsKKyAgICAgICAgYml0X2xlbiA9IDggKiBzaXplb2YoZGF0YSk7CisgICAgICAgIGVyciA9IGN0eC0+Y29kZWMtPndyaXRlX3BpY3R1cmVfaGVhZGVyKGF2Y3R4LCBwaWMsIGRhdGEsICZiaXRfbGVuKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIHBlci1waWN0dXJlICIKKyAgICAgICAgICAgICAgICAgICAiaGVhZGVyOiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gdmFhcGlfZW5jb2RlX21ha2VfcGFja2VkX2hlYWRlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y29kZWMtPnBpY3R1cmVfaGVhZGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgYml0X2xlbik7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChjdHgtPmNvZGVjLT53cml0ZV9leHRyYV9idWZmZXIpIHsKKyAgICAgICAgZm9yIChpID0gMDs7IGkrKykgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHNpemVvZihkYXRhKTsKKyAgICAgICAgICAgIGludCB0eXBlOworICAgICAgICAgICAgZXJyID0gY3R4LT5jb2RlYy0+d3JpdGVfZXh0cmFfYnVmZmVyKGF2Y3R4LCBwaWMsIGksICZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsICZsZW4pOworICAgICAgICAgICAgaWYgKGVyciA9PSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgZXh0cmEgIgorICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyICVkOiAlZC5cbiIsIGksIGVycik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcnIgPSB2YWFwaV9lbmNvZGVfbWFrZV9wYXJhbV9idWZmZXIoYXZjdHgsIHBpYywgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBsZW4pOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN0eC0+dmFfcGFja2VkX2hlYWRlcnMgJiBWQV9FTkNfUEFDS0VEX0hFQURFUl9NSVNDICYmCisgICAgICAgIGN0eC0+Y29kZWMtPndyaXRlX2V4dHJhX2hlYWRlcikgeworICAgICAgICBmb3IgKGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgICAgIGJpdF9sZW4gPSA4ICogc2l6ZW9mKGRhdGEpOworICAgICAgICAgICAgZXJyID0gY3R4LT5jb2RlYy0+d3JpdGVfZXh0cmFfaGVhZGVyKGF2Y3R4LCBwaWMsIGksICZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsICZiaXRfbGVuKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIGV4dHJhICIKKyAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciAlZDogJWQuXG4iLCBpLCBlcnIpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXJyID0gdmFhcGlfZW5jb2RlX21ha2VfcGFja2VkX2hlYWRlcihhdmN0eCwgcGljLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBiaXRfbGVuKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwaWMtPm5iX3NsaWNlcyA+IDApIHsKKyAgICAgICAgcGljLT5zbGljZXMgPSBhdl9tYWxsb2N6X2FycmF5KHBpYy0+bmJfc2xpY2VzLCBzaXplb2YoKnBpYy0+c2xpY2VzKSk7CisgICAgICAgIGlmICghcGljLT5zbGljZXMpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljLT5uYl9zbGljZXM7IGkrKykgeworICAgICAgICBzbGljZSA9ICZwaWMtPnNsaWNlc1tpXTsKKyAgICAgICAgc2xpY2UtPmluZGV4ID0gaTsKKworICAgICAgICBpZiAoY3R4LT5jb2RlYy0+c2xpY2VfcGFyYW1zX3NpemUgPiAwKSB7CisgICAgICAgICAgICBzbGljZS0+Y29kZWNfc2xpY2VfcGFyYW1zID0gYXZfbWFsbG9jeihjdHgtPmNvZGVjLT5zbGljZV9wYXJhbXNfc2l6ZSk7CisgICAgICAgICAgICBpZiAoIXNsaWNlLT5jb2RlY19zbGljZV9wYXJhbXMpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGN0eC0+Y29kZWMtPmluaXRfc2xpY2VfcGFyYW1zKSB7CisgICAgICAgICAgICBlcnIgPSBjdHgtPmNvZGVjLT5pbml0X3NsaWNlX3BhcmFtcyhhdmN0eCwgcGljLCBzbGljZSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpc2Ugc2xpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1ldGVyczogJWQuXG4iLCBlcnIpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdHgtPnZhX3BhY2tlZF9oZWFkZXJzICYgVkFfRU5DX1BBQ0tFRF9IRUFERVJfU0xJQ0UgJiYKKyAgICAgICAgICAgIGN0eC0+Y29kZWMtPndyaXRlX3NsaWNlX2hlYWRlcikgeworICAgICAgICAgICAgYml0X2xlbiA9IDggKiBzaXplb2YoZGF0YSk7CisgICAgICAgICAgICBlcnIgPSBjdHgtPmNvZGVjLT53cml0ZV9zbGljZV9oZWFkZXIoYXZjdHgsIHBpYywgc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgJmJpdF9sZW4pOworICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB3cml0ZSBwZXItc2xpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyOiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXJyID0gdmFhcGlfZW5jb2RlX21ha2VfcGFja2VkX2hlYWRlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmNvZGVjLT5zbGljZV9oZWFkZXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgYml0X2xlbik7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3R4LT5jb2RlYy0+aW5pdF9zbGljZV9wYXJhbXMpIHsKKyAgICAgICAgICAgIGVyciA9IHZhYXBpX2VuY29kZV9tYWtlX3BhcmFtX2J1ZmZlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBRW5jU2xpY2VQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlLT5jb2RlY19zbGljZV9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jb2RlYy0+c2xpY2VfcGFyYW1zX3NpemUpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgdmFzID0gdmFCZWdpblBpY3R1cmUoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+aW5wdXRfc3VyZmFjZSk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBiZWdpbiBwaWN0dXJlIGVuY29kZSBpc3N1ZTogIgorICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsX3dpdGhfcGljdHVyZTsKKyAgICB9CisKKyAgICB2YXMgPSB2YVJlbmRlclBpY3R1cmUoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPnBhcmFtX2J1ZmZlcnMsIHBpYy0+bmJfcGFyYW1fYnVmZmVycyk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB1cGxvYWQgZW5jb2RlIHBhcmFtZXRlcnM6ICIKKyAgICAgICAgICAgICAgICIlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbF93aXRoX3BpY3R1cmU7CisgICAgfQorCisgICAgdmFzID0gdmFFbmRQaWN0dXJlKGN0eC0+aHdjdHgtPmRpc3BsYXksIGN0eC0+dmFfY29udGV4dCk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBlbmQgcGljdHVyZSBlbmNvZGUgaXNzdWU6ICIKKyAgICAgICAgICAgICAgICIlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIC8vIHZhUmVuZGVyUGljdHVyZSgpIGhhcyBiZWVuIGNhbGxlZCBoZXJlLCBzbyB3ZSBzaG91bGQgbm90IGRlc3Ryb3kKKyAgICAgICAgLy8gdGhlIHBhcmFtZXRlciBidWZmZXJzIHVubGVzcyBzZXBhcmF0ZSBkZXN0cnVjdGlvbiBpcyByZXF1aXJlZC4KKyAgICAgICAgaWYgKENPTkZJR19WQUFQSV8xIHx8IGN0eC0+aHdjdHgtPmRyaXZlcl9xdWlya3MgJgorICAgICAgICAgICAgQVZfVkFBUElfRFJJVkVSX1FVSVJLX1JFTkRFUl9QQVJBTV9CVUZGRVJTKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnb3RvIGZhaWxfYXRfZW5kOworICAgIH0KKworICAgIGlmIChDT05GSUdfVkFBUElfMSB8fCBjdHgtPmh3Y3R4LT5kcml2ZXJfcXVpcmtzICYKKyAgICAgICAgQVZfVkFBUElfRFJJVkVSX1FVSVJLX1JFTkRFUl9QQVJBTV9CVUZGRVJTKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWMtPm5iX3BhcmFtX2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgdmFzID0gdmFEZXN0cm95QnVmZmVyKGN0eC0+aHdjdHgtPmRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT5wYXJhbV9idWZmZXJzW2ldKTsKKyAgICAgICAgICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBkZXN0cm95ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIGJ1ZmZlciAlI3g6ICVkICglcykuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwaWMtPnBhcmFtX2J1ZmZlcnNbaV0sIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgICAgICAgICAvLyBBbmQgaWdub3JlLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcGljLT5lbmNvZGVfaXNzdWVkID0gMTsKKworICAgIGlmIChjdHgtPmlzc3VlX21vZGUgPT0gSVNTVUVfTU9ERV9TRVJJQUxJU0VfRVZFUllUSElORykKKyAgICAgICAgcmV0dXJuIHZhYXBpX2VuY29kZV93YWl0KGF2Y3R4LCBwaWMpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7CisKK2ZhaWxfd2l0aF9waWN0dXJlOgorICAgIHZhRW5kUGljdHVyZShjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQpOworZmFpbDoKKyAgICBmb3IoaSA9IDA7IGkgPCBwaWMtPm5iX3BhcmFtX2J1ZmZlcnM7IGkrKykKKyAgICAgICAgdmFEZXN0cm95QnVmZmVyKGN0eC0+aHdjdHgtPmRpc3BsYXksIHBpYy0+cGFyYW1fYnVmZmVyc1tpXSk7CisgICAgZm9yIChpID0gMDsgaSA8IHBpYy0+bmJfc2xpY2VzOyBpKyspIHsKKyAgICAgICAgaWYgKHBpYy0+c2xpY2VzKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGljLT5zbGljZXNbaV0ucHJpdl9kYXRhKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwaWMtPnNsaWNlc1tpXS5jb2RlY19zbGljZV9wYXJhbXMpOworICAgICAgICB9CisgICAgfQorZmFpbF9hdF9lbmQ6CisgICAgYXZfZnJlZXAoJnBpYy0+Y29kZWNfcGljdHVyZV9wYXJhbXMpOworICAgIGF2X2ZyZWVwKCZwaWMtPnBhcmFtX2J1ZmZlcnMpOworICAgIGF2X2ZyZWVwKCZwaWMtPnNsaWNlcyk7CisgICAgYXZfZnJhbWVfZnJlZSgmcGljLT5yZWNvbl9pbWFnZSk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPm91dHB1dF9idWZmZXJfcmVmKTsKKyAgICBwaWMtPm91dHB1dF9idWZmZXIgPSBWQV9JTlZBTElEX0lEOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX291dHB1dChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpwaWMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQ29kZWRCdWZmZXJTZWdtZW50ICpidWZfbGlzdCwgKmJ1ZjsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IHZhYXBpX2VuY29kZV93YWl0KGF2Y3R4LCBwaWMpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgYnVmX2xpc3QgPSBOVUxMOworICAgIHZhcyA9IHZhTWFwQnVmZmVyKGN0eC0+aHdjdHgtPmRpc3BsYXksIHBpYy0+b3V0cHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAodm9pZCoqKSZidWZfbGlzdCk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBtYXAgb3V0cHV0IGJ1ZmZlcnM6ICIKKyAgICAgICAgICAgICAgICIlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGJ1ZiA9IGJ1Zl9saXN0OyBidWY7IGJ1ZiA9IGJ1Zi0+bmV4dCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIk91dHB1dCBidWZmZXI6ICV1IGJ5dGVzICIKKyAgICAgICAgICAgICAgICIoc3RhdHVzICUwOHgpLlxuIiwgYnVmLT5zaXplLCBidWYtPnN0YXR1cyk7CisKKyAgICAgICAgZXJyID0gYXZfbmV3X3BhY2tldChwa3QsIGJ1Zi0+c2l6ZSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsX21hcHBlZDsKKworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBidWYtPmJ1ZiwgYnVmLT5zaXplKTsKKyAgICB9CisKKyAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JRFIpCisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworCisgICAgcGt0LT5wdHMgPSBwaWMtPnB0czsKKworICAgIHZhcyA9IHZhVW5tYXBCdWZmZXIoY3R4LT5od2N0eC0+ZGlzcGxheSwgcGljLT5vdXRwdXRfYnVmZmVyKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHVubWFwIG91dHB1dCBidWZmZXJzOiAiCisgICAgICAgICAgICAgICAiJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXZfYnVmZmVyX3VucmVmKCZwaWMtPm91dHB1dF9idWZmZXJfcmVmKTsKKyAgICBwaWMtPm91dHB1dF9idWZmZXIgPSBWQV9JTlZBTElEX0lEOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJPdXRwdXQgcmVhZCBmb3IgcGljICUiUFJJZDY0Ii8lIlBSSWQ2NCIuXG4iLAorICAgICAgICAgICBwaWMtPmRpc3BsYXlfb3JkZXIsIHBpYy0+ZW5jb2RlX29yZGVyKTsKKyAgICByZXR1cm4gMDsKKworZmFpbF9tYXBwZWQ6CisgICAgdmFVbm1hcEJ1ZmZlcihjdHgtPmh3Y3R4LT5kaXNwbGF5LCBwaWMtPm91dHB1dF9idWZmZXIpOworZmFpbDoKKyAgICBhdl9idWZmZXJfdW5yZWYoJnBpYy0+b3V0cHV0X2J1ZmZlcl9yZWYpOworICAgIHBpYy0+b3V0cHV0X2J1ZmZlciA9IFZBX0lOVkFMSURfSUQ7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfZGlzY2FyZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljKQoreworICAgIHZhYXBpX2VuY29kZV93YWl0KGF2Y3R4LCBwaWMpOworCisgICAgaWYgKHBpYy0+b3V0cHV0X2J1ZmZlcl9yZWYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJEaXNjYXJkIG91dHB1dCBmb3IgcGljICIKKyAgICAgICAgICAgICAgICIlIlBSSWQ2NCIvJSJQUklkNjQiLlxuIiwKKyAgICAgICAgICAgICAgIHBpYy0+ZGlzcGxheV9vcmRlciwgcGljLT5lbmNvZGVfb3JkZXIpOworCisgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcGljLT5vdXRwdXRfYnVmZmVyX3JlZik7CisgICAgICAgIHBpYy0+b3V0cHV0X2J1ZmZlciA9IFZBX0lOVkFMSURfSUQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBWQUFQSUVuY29kZVBpY3R1cmUgKnZhYXBpX2VuY29kZV9hbGxvYyh2b2lkKQoreworICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljOworCisgICAgcGljID0gYXZfbWFsbG9jeihzaXplb2YoKnBpYykpOworICAgIGlmICghcGljKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHBpYy0+aW5wdXRfc3VyZmFjZSA9IFZBX0lOVkFMSURfSUQ7CisgICAgcGljLT5yZWNvbl9zdXJmYWNlID0gVkFfSU5WQUxJRF9JRDsKKyAgICBwaWMtPm91dHB1dF9idWZmZXIgPSBWQV9JTlZBTElEX0lEOworCisgICAgcmV0dXJuIHBpYzsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljKQoreworICAgIGludCBpOworCisgICAgaWYgKHBpYy0+ZW5jb2RlX2lzc3VlZCkKKyAgICAgICAgdmFhcGlfZW5jb2RlX2Rpc2NhcmQoYXZjdHgsIHBpYyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljLT5uYl9zbGljZXM7IGkrKykgeworICAgICAgICBpZiAocGljLT5zbGljZXMpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwaWMtPnNsaWNlc1tpXS5wcml2X2RhdGEpOworICAgICAgICAgICAgYXZfZnJlZXAoJnBpYy0+c2xpY2VzW2ldLmNvZGVjX3NsaWNlX3BhcmFtcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnBpYy0+Y29kZWNfcGljdHVyZV9wYXJhbXMpOworCisgICAgYXZfZnJhbWVfZnJlZSgmcGljLT5pbnB1dF9pbWFnZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcGljLT5yZWNvbl9pbWFnZSk7CisKKyAgICBhdl9mcmVlcCgmcGljLT5wYXJhbV9idWZmZXJzKTsKKyAgICBhdl9mcmVlcCgmcGljLT5zbGljZXMpOworICAgIC8vIE91dHB1dCBidWZmZXIgc2hvdWxkIGFscmVhZHkgYmUgZGVzdHJveWVkLgorICAgIGF2X2Fzc2VydDAocGljLT5vdXRwdXRfYnVmZmVyID09IFZBX0lOVkFMSURfSUQpOworCisgICAgYXZfZnJlZXAoJnBpYy0+cHJpdl9kYXRhKTsKKyAgICBhdl9mcmVlcCgmcGljLT5jb2RlY19waWN0dXJlX3BhcmFtcyk7CisKKyAgICBhdl9mcmVlKHBpYyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfc3RlcChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqdGFyZ2V0KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYzsKKyAgICBpbnQgaSwgZXJyOworCisgICAgaWYgKGN0eC0+aXNzdWVfbW9kZSA9PSBJU1NVRV9NT0RFX1NFUklBTElTRV9FVkVSWVRISU5HIHx8CisgICAgICAgIGN0eC0+aXNzdWVfbW9kZSA9PSBJU1NVRV9NT0RFX01JTklNSVNFX0xBVEVOQ1kpIHsKKyAgICAgICAgLy8gVGhlc2UgdHdvIG1vZGVzIGFyZSBlcXVpdmFsZW50LCBleGNlcHQgdGhhdCB3ZSB3YWl0IGZvcgorICAgICAgICAvLyBpbW1lZGlhdGUgY29tcGxldGlvbiBvbiBlYWNoIG9wZXJhdGlvbiBpZiBzZXJpYWxpc2VkLgorCisgICAgICAgIGlmICghdGFyZ2V0KSB7CisgICAgICAgICAgICAvLyBObyB0YXJnZXQsIG5vdGhpbmcgdG8gZG8geWV0LgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFyZ2V0LT5lbmNvZGVfY29tcGxldGUpIHsKKyAgICAgICAgICAgIC8vIEFscmVhZHkgZG9uZS4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcGljID0gdGFyZ2V0OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGljLT5uYl9yZWZzOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghcGljLT5yZWZzW2ldLT5lbmNvZGVfY29tcGxldGUpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSB2YWFwaV9lbmNvZGVfc3RlcChhdmN0eCwgcGljLT5yZWZzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IHZhYXBpX2VuY29kZV9pc3N1ZShhdmN0eCwgcGljKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgfSBlbHNlIGlmIChjdHgtPmlzc3VlX21vZGUgPT0gSVNTVUVfTU9ERV9NQVhJTUlTRV9USFJPVUdIUFVUKSB7CisgICAgICAgIGludCBhY3Rpdml0eTsKKworICAgICAgICAvLyBSdW4gdGhyb3VnaCB0aGUgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHBpY3R1cmVzIHJlcGVhdGVkbHkKKyAgICAgICAgLy8gYW5kIGlzc3VlIHRoZSBmaXJzdCBvbmUgZm91bmQgd2hpY2ggaGFzIGFsbCBkZXBlbmRlbmNpZXMKKyAgICAgICAgLy8gYXZhaWxhYmxlIChpbmNsdWRpbmcgcHJldmlvdXNseS1pc3N1ZWQgYnV0IG5vdCBuZWNlc3NhcmlseQorICAgICAgICAvLyBjb21wbGV0ZWQgcGljdHVyZXMpLgorICAgICAgICBkbyB7CisgICAgICAgICAgICBhY3Rpdml0eSA9IDA7CisgICAgICAgICAgICBmb3IgKHBpYyA9IGN0eC0+cGljX3N0YXJ0OyBwaWM7IHBpYyA9IHBpYy0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICghcGljLT5pbnB1dF9hdmFpbGFibGUgfHwgcGljLT5lbmNvZGVfaXNzdWVkKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGljLT5uYl9yZWZzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwaWMtPnJlZnNbaV0tPmVuY29kZV9pc3N1ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGkgPCBwaWMtPm5iX3JlZnMpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGVyciA9IHZhYXBpX2VuY29kZV9pc3N1ZShhdmN0eCwgcGljKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICBhY3Rpdml0eSA9IDE7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgYWdhaW4gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0LAorICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXNzdWluZyB0aGlzIHBpY3R1cmUgbWF5IGhhdmUgc2F0aXNmaWVkCisgICAgICAgICAgICAgICAgLy8gZm9yd2FyZCBkZXBlbmRlbmNpZXMgb2YgZWFybGllciBvbmVzLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlKGFjdGl2aXR5KTsKKworICAgICAgICAvLyBJZiB3ZSBoYWQgYSBkZWZpbmVkIHRhcmdldCBmb3IgdGhpcyBzdGVwIHRoZW4gaXQgd2lsbAorICAgICAgICAvLyBhbHdheXMgaGF2ZSBiZWVuIGlzc3VlZCBieSBub3cuCisgICAgICAgIGlmICh0YXJnZXQpIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAodGFyZ2V0LT5lbmNvZGVfaXNzdWVkICYmICJicm9rZW4gZGVwZW5kZW5jaWVzPyIpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9nZXRfbmV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKipwaWNfb3V0KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnN0YXJ0LCAqZW5kLCAqcGljOworICAgIGludCBpOworCisgICAgZm9yIChwaWMgPSBjdHgtPnBpY19zdGFydDsgcGljOyBwaWMgPSBwaWMtPm5leHQpIHsKKyAgICAgICAgaWYgKHBpYy0+bmV4dCkKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocGljLT5kaXNwbGF5X29yZGVyICsgMSA9PSBwaWMtPm5leHQtPmRpc3BsYXlfb3JkZXIpOworICAgICAgICBpZiAocGljLT5kaXNwbGF5X29yZGVyID09IGN0eC0+aW5wdXRfb3JkZXIpIHsKKyAgICAgICAgICAgICpwaWNfb3V0ID0gcGljOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwaWMgPSB2YWFwaV9lbmNvZGVfYWxsb2MoKTsKKyAgICBpZiAoIXBpYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChjdHgtPmlucHV0X29yZGVyID09IDAgfHwgY3R4LT5mb3JjZV9pZHIgfHwKKyAgICAgICAgY3R4LT5nb3BfY291bnRlciA+PSBhdmN0eC0+Z29wX3NpemUpIHsKKyAgICAgICAgcGljLT50eXBlID0gUElDVFVSRV9UWVBFX0lEUjsKKyAgICAgICAgY3R4LT5mb3JjZV9pZHIgPSAwOworICAgICAgICBjdHgtPmdvcF9jb3VudGVyID0gMTsKKyAgICAgICAgY3R4LT5wX2NvdW50ZXIgPSAwOworICAgIH0gZWxzZSBpZiAoY3R4LT5wX2NvdW50ZXIgPj0gY3R4LT5wX3Blcl9pKSB7CisgICAgICAgIHBpYy0+dHlwZSA9IFBJQ1RVUkVfVFlQRV9JOworICAgICAgICArK2N0eC0+Z29wX2NvdW50ZXI7CisgICAgICAgIGN0eC0+cF9jb3VudGVyID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBwaWMtPnR5cGUgPSBQSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgcGljLT5yZWZzWzBdID0gY3R4LT5waWNfZW5kOworICAgICAgICBwaWMtPm5iX3JlZnMgPSAxOworICAgICAgICArK2N0eC0+Z29wX2NvdW50ZXI7CisgICAgICAgICsrY3R4LT5wX2NvdW50ZXI7CisgICAgfQorICAgIHN0YXJ0ID0gZW5kID0gcGljOworCisgICAgaWYgKHBpYy0+dHlwZSAhPSBQSUNUVVJFX1RZUEVfSURSKSB7CisgICAgICAgIC8vIElmIHRoYXQgd2FzIG5vdCBhbiBJRFIgZnJhbWUsIGFkZCBCLWZyYW1lcyBkaXNwbGF5LWJlZm9yZSBhbmQKKyAgICAgICAgLy8gZW5jb2RlLWFmdGVyIGl0LCBidXQgbm90IGV4Y2VlZGluZyB0aGUgR09QIHNpemUuCisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+Yl9wZXJfcCAmJgorICAgICAgICAgICAgIGN0eC0+Z29wX2NvdW50ZXIgPCBhdmN0eC0+Z29wX3NpemU7IGkrKykgeworICAgICAgICAgICAgcGljID0gdmFhcGlfZW5jb2RlX2FsbG9jKCk7CisgICAgICAgICAgICBpZiAoIXBpYykKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgICAgIHBpYy0+dHlwZSA9IFBJQ1RVUkVfVFlQRV9COworICAgICAgICAgICAgcGljLT5yZWZzWzBdID0gY3R4LT5waWNfZW5kOworICAgICAgICAgICAgcGljLT5yZWZzWzFdID0gZW5kOworICAgICAgICAgICAgcGljLT5uYl9yZWZzID0gMjsKKworICAgICAgICAgICAgcGljLT5uZXh0ID0gc3RhcnQ7CisgICAgICAgICAgICBwaWMtPmRpc3BsYXlfb3JkZXIgPSBjdHgtPmlucHV0X29yZGVyICsgY3R4LT5iX3Blcl9wIC0gaSAtIDE7CisgICAgICAgICAgICBwaWMtPmVuY29kZV9vcmRlciAgPSBwaWMtPmRpc3BsYXlfb3JkZXIgKyAxOworICAgICAgICAgICAgc3RhcnQgPSBwaWM7CisKKyAgICAgICAgICAgICsrY3R4LT5nb3BfY291bnRlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdHgtPmlucHV0X29yZGVyID09IDApIHsKKyAgICAgICAgcGljLT5kaXNwbGF5X29yZGVyID0gMDsKKyAgICAgICAgcGljLT5lbmNvZGVfb3JkZXIgID0gMDsKKworICAgICAgICBjdHgtPnBpY19zdGFydCA9IGN0eC0+cGljX2VuZCA9IHBpYzsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDAsIHBpYyA9IHN0YXJ0OyBwaWM7IGkrKywgcGljID0gcGljLT5uZXh0KSB7CisgICAgICAgICAgICBwaWMtPmRpc3BsYXlfb3JkZXIgPSBjdHgtPmlucHV0X29yZGVyICsgaTsKKyAgICAgICAgICAgIGlmIChlbmQtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0lEUikKKyAgICAgICAgICAgICAgICBwaWMtPmVuY29kZV9vcmRlciA9IGN0eC0+aW5wdXRfb3JkZXIgKyBpOworICAgICAgICAgICAgZWxzZSBpZiAocGljID09IGVuZCkKKyAgICAgICAgICAgICAgICBwaWMtPmVuY29kZV9vcmRlciA9IGN0eC0+aW5wdXRfb3JkZXI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGljLT5lbmNvZGVfb3JkZXIgPSBjdHgtPmlucHV0X29yZGVyICsgaSArIDE7CisgICAgICAgIH0KKworICAgICAgICBhdl9hc3NlcnQwKGN0eC0+cGljX2VuZCk7CisgICAgICAgIGN0eC0+cGljX2VuZC0+bmV4dCA9IHN0YXJ0OworICAgICAgICBjdHgtPnBpY19lbmQgPSBlbmQ7CisgICAgfQorICAgICpwaWNfb3V0ID0gc3RhcnQ7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlBpY3R1cmVzOiIpOworICAgIGZvciAocGljID0gY3R4LT5waWNfc3RhcnQ7IHBpYzsgcGljID0gcGljLT5uZXh0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiICVzICglIlBSSWQ2NCIvJSJQUklkNjQiKSIsCisgICAgICAgICAgICAgICBwaWN0dXJlX3R5cGVfbmFtZVtwaWMtPnR5cGVdLAorICAgICAgICAgICAgICAgcGljLT5kaXNwbGF5X29yZGVyLCBwaWMtPmVuY29kZV9vcmRlcik7CisgICAgfQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHdoaWxlIChzdGFydCkgeworICAgICAgICBwaWMgPSBzdGFydC0+bmV4dDsKKyAgICAgICAgdmFhcGlfZW5jb2RlX2ZyZWUoYXZjdHgsIHN0YXJ0KTsKKyAgICAgICAgc3RhcnQgPSBwaWM7CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX3RydW5jYXRlX2dvcChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLCAqbGFzdF9waWMsICpuZXh0OworCisgICAgLy8gRmluZCB0aGUgbGFzdCBwaWN0dXJlIHdlIGFjdHVhbGx5IGhhdmUgaW5wdXQgZm9yLgorICAgIGZvciAocGljID0gY3R4LT5waWNfc3RhcnQ7IHBpYzsgcGljID0gcGljLT5uZXh0KSB7CisgICAgICAgIGlmICghcGljLT5pbnB1dF9hdmFpbGFibGUpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGFzdF9waWMgPSBwaWM7CisgICAgfQorCisgICAgaWYgKHBpYykgeworICAgICAgICBhdl9hc3NlcnQwKGxhc3RfcGljKTsKKworICAgICAgICBpZiAobGFzdF9waWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgIC8vIFNvbWUgZml4aW5nIHVwIGlzIHJlcXVpcmVkLiAgQ2hhbmdlIHRoZSB0eXBlIG9mIHRoaXMKKyAgICAgICAgICAgIC8vIHBpY3R1cmUgdG8gUCwgdGhlbiBtb2RpZnkgcHJlY2VkaW5nIEIgcmVmZXJlbmNlcyB3aGljaAorICAgICAgICAgICAgLy8gcG9pbnQgYmV5b25kIGl0IHRvIHBvaW50IGF0IGl0IGluc3RlYWQuCisKKyAgICAgICAgICAgIGxhc3RfcGljLT50eXBlID0gUElDVFVSRV9UWVBFX1A7CisgICAgICAgICAgICBsYXN0X3BpYy0+ZW5jb2RlX29yZGVyID0gbGFzdF9waWMtPnJlZnNbMV0tPmVuY29kZV9vcmRlcjsKKworICAgICAgICAgICAgZm9yIChwaWMgPSBjdHgtPnBpY19zdGFydDsgcGljICE9IGxhc3RfcGljOyBwaWMgPSBwaWMtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9CICYmCisgICAgICAgICAgICAgICAgICAgIHBpYy0+cmVmc1sxXSA9PSBsYXN0X3BpYy0+cmVmc1sxXSkKKyAgICAgICAgICAgICAgICAgICAgcGljLT5yZWZzWzFdID0gbGFzdF9waWM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxhc3RfcGljLT5uYl9yZWZzID0gMTsKKyAgICAgICAgICAgIGxhc3RfcGljLT5yZWZzWzFdID0gTlVMTDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbiB1c2UgdGhlIGN1cnJlbnQgc3RydWN0dXJlIChubyByZWZlcmVuY2VzIHBvaW50CisgICAgICAgICAgICAvLyBiZXlvbmQgdGhlIGVuZCksIGJ1dCB0aGVyZSBhcmUgdW51c2VkIHBpY3MgdG8gZGlzY2FyZC4KKyAgICAgICAgfQorCisgICAgICAgIC8vIERpc2NhcmQgYWxsIGZvbGxvd2luZyBwaWNzLCB0aGV5IHdpbGwgbmV2ZXIgYmUgdXNlZC4KKyAgICAgICAgZm9yIChwaWMgPSBsYXN0X3BpYy0+bmV4dDsgcGljOyBwaWMgPSBuZXh0KSB7CisgICAgICAgICAgICBuZXh0ID0gcGljLT5uZXh0OworICAgICAgICAgICAgdmFhcGlfZW5jb2RlX2ZyZWUoYXZjdHgsIHBpYyk7CisgICAgICAgIH0KKworICAgICAgICBsYXN0X3BpYy0+bmV4dCA9IE5VTEw7CisgICAgICAgIGN0eC0+cGljX2VuZCA9IGxhc3RfcGljOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSW5wdXQgaXMgYXZhaWxhYmxlIGZvciBhbGwgcGljdHVyZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgLy8gbWFuZ2xlIGFueXRoaW5nLgorICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUGljdHVyZXMgZW5kaW5nIHRydW5jYXRlZCBHT1A6Iik7CisgICAgZm9yIChwaWMgPSBjdHgtPnBpY19zdGFydDsgcGljOyBwaWMgPSBwaWMtPm5leHQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIgJXMgKCUiUFJJZDY0Ii8lIlBSSWQ2NCIpIiwKKyAgICAgICAgICAgICAgIHBpY3R1cmVfdHlwZV9uYW1lW3BpYy0+dHlwZV0sCisgICAgICAgICAgICAgICBwaWMtPmRpc3BsYXlfb3JkZXIsIHBpYy0+ZW5jb2RlX29yZGVyKTsKKyAgICB9CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2NsZWFyX29sZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLCAqb2xkOworICAgIGludCBpOworCisgICAgd2hpbGUgKGN0eC0+cGljX3N0YXJ0ICE9IGN0eC0+cGljX2VuZCkgeworICAgICAgICBvbGQgPSBjdHgtPnBpY19zdGFydDsKKyAgICAgICAgaWYgKG9sZC0+ZW5jb2RlX29yZGVyID4gY3R4LT5vdXRwdXRfb3JkZXIpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBmb3IgKHBpYyA9IG9sZC0+bmV4dDsgcGljOyBwaWMgPSBwaWMtPm5leHQpIHsKKyAgICAgICAgICAgIGlmIChwaWMtPmVuY29kZV9jb21wbGV0ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWMtPm5iX3JlZnM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwaWMtPnJlZnNbaV0gPT0gb2xkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIHN0aWxsIG5lZWQgdGhpcyBwaWN0dXJlIGJlY2F1c2UgaXQncyByZWZlcnJlZCB0bworICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBieSBhIGxhdGVyIG9uZSwgc28gaXQgYW5kIGFsbCBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICAgLy8gcGljdHVyZXMgaGF2ZSB0byBzdGF5LgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwaWMgPSBjdHgtPnBpY19zdGFydDsKKyAgICAgICAgY3R4LT5waWNfc3RhcnQgPSBwaWMtPm5leHQ7CisgICAgICAgIHZhYXBpX2VuY29kZV9mcmVlKGF2Y3R4LCBwaWMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfdmFhcGlfZW5jb2RlMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICppbnB1dF9pbWFnZSwgaW50ICpnb3RfcGFja2V0KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYzsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGlucHV0X2ltYWdlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRW5jb2RlIGZyYW1lOiAldXgldSAoJSJQUklkNjQiKS5cbiIsCisgICAgICAgICAgICAgICBpbnB1dF9pbWFnZS0+d2lkdGgsIGlucHV0X2ltYWdlLT5oZWlnaHQsIGlucHV0X2ltYWdlLT5wdHMpOworCisgICAgICAgIGlmIChpbnB1dF9pbWFnZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICBlcnIgPSB2YWFwaV9lbmNvZGVfdHJ1bmNhdGVfZ29wKGF2Y3R4KTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGN0eC0+Zm9yY2VfaWRyID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IHZhYXBpX2VuY29kZV9nZXRfbmV4dChhdmN0eCwgJnBpYyk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5wdXQgc2V0dXAgZmFpbGVkOiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgcGljLT5pbnB1dF9pbWFnZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghcGljLT5pbnB1dF9pbWFnZSkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGVyciA9IGF2X2ZyYW1lX3JlZihwaWMtPmlucHV0X2ltYWdlLCBpbnB1dF9pbWFnZSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBwaWMtPmlucHV0X3N1cmZhY2UgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClpbnB1dF9pbWFnZS0+ZGF0YVszXTsKKyAgICAgICAgcGljLT5wdHMgPSBpbnB1dF9pbWFnZS0+cHRzOworCisgICAgICAgIGlmIChjdHgtPmlucHV0X29yZGVyID09IDApCisgICAgICAgICAgICBjdHgtPmZpcnN0X3B0cyA9IHBpYy0+cHRzOworICAgICAgICBpZiAoY3R4LT5pbnB1dF9vcmRlciA9PSBjdHgtPmRlY29kZV9kZWxheSkKKyAgICAgICAgICAgIGN0eC0+ZHRzX3B0c19kaWZmID0gcGljLT5wdHMgLSBjdHgtPmZpcnN0X3B0czsKKyAgICAgICAgaWYgKGN0eC0+b3V0cHV0X2RlbGF5ID4gMCkKKyAgICAgICAgICAgIGN0eC0+dHNfcmluZ1tjdHgtPmlucHV0X29yZGVyICUgKDMgKiBjdHgtPm91dHB1dF9kZWxheSldID0gcGljLT5wdHM7CisKKyAgICAgICAgcGljLT5pbnB1dF9hdmFpbGFibGUgPSAxOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFjdHgtPmVuZF9vZl9zdHJlYW0pIHsKKyAgICAgICAgICAgIGVyciA9IHZhYXBpX2VuY29kZV90cnVuY2F0ZV9nb3AoYXZjdHgpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgY3R4LT5lbmRfb2Zfc3RyZWFtID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgICsrY3R4LT5pbnB1dF9vcmRlcjsKKyAgICArK2N0eC0+b3V0cHV0X29yZGVyOworICAgIGF2X2Fzc2VydDAoY3R4LT5vdXRwdXRfb3JkZXIgKyBjdHgtPm91dHB1dF9kZWxheSArIDEgPT0gY3R4LT5pbnB1dF9vcmRlcik7CisKKyAgICBmb3IgKHBpYyA9IGN0eC0+cGljX3N0YXJ0OyBwaWM7IHBpYyA9IHBpYy0+bmV4dCkKKyAgICAgICAgaWYgKHBpYy0+ZW5jb2RlX29yZGVyID09IGN0eC0+b3V0cHV0X29yZGVyKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAvLyBwaWMgY2FuIGJlIG51bGwgaGVyZSBpZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lmaWMgdGFyZ2V0IGluIHRoaXMKKyAgICAvLyBpdGVyYXRpb24uICBXZSBtaWdodCBzdGlsbCBpc3N1ZSBlbmNvZGVzIGlmIHRoaW5ncyBjYW4gYmUgb3ZlcmxhcHBlZCwKKyAgICAvLyBldmVuIHRob3VnaCB3ZSBkb24ndCBpbnRlbmQgdG8gb3V0cHV0IGFueXRoaW5nLgorCisgICAgZXJyID0gdmFhcGlfZW5jb2RlX3N0ZXAoYXZjdHgsIHBpYyk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFbmNvZGUgZmFpbGVkOiAlZC5cbiIsIGVycik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIXBpYykgeworICAgICAgICAqZ290X3BhY2tldCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gdmFhcGlfZW5jb2RlX291dHB1dChhdmN0eCwgcGljLCBwa3QpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJPdXRwdXQgZmFpbGVkOiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3R4LT5vdXRwdXRfZGVsYXkgPT0gMCkgeworICAgICAgICAgICAgcGt0LT5kdHMgPSBwa3QtPnB0czsKKyAgICAgICAgfSBlbHNlIGlmIChjdHgtPm91dHB1dF9vcmRlciA8IGN0eC0+ZGVjb2RlX2RlbGF5KSB7CisgICAgICAgICAgICBpZiAoY3R4LT50c19yaW5nW2N0eC0+b3V0cHV0X29yZGVyXSA8IElOVDY0X01JTiArIGN0eC0+ZHRzX3B0c19kaWZmKQorICAgICAgICAgICAgICAgIHBrdC0+ZHRzID0gSU5UNjRfTUlOOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHBrdC0+ZHRzID0gY3R4LT50c19yaW5nW2N0eC0+b3V0cHV0X29yZGVyXSAtIGN0eC0+ZHRzX3B0c19kaWZmOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGt0LT5kdHMgPSBjdHgtPnRzX3JpbmdbKGN0eC0+b3V0cHV0X29yZGVyIC0gY3R4LT5kZWNvZGVfZGVsYXkpICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzICogY3R4LT5vdXRwdXRfZGVsYXkpXTsKKyAgICAgICAgfQorCisgICAgICAgICpnb3RfcGFja2V0ID0gMTsKKyAgICB9CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfY2xlYXJfb2xkKGF2Y3R4KTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkxpc3QgY2xlYXJpbmcgZmFpbGVkOiAlZC5cbiIsIGVycik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICAvLyBVbmNsZWFyIHdoYXQgdG8gY2xlYW4gdXAgb24gZmFpbHVyZS4gIFRoZXJlIGFyZSBwcm9iYWJseSBzb21lIHRoaW5ncyB3ZQorICAgIC8vIGNvdWxkIGRvIHVzZWZ1bGx5IGNsZWFuIHVwIGhlcmUsIGJ1dCBmb3Igbm93IGp1c3QgbGVhdmUgdGhlbSBmb3IgdW5pbml0KCkKKyAgICAvLyB0byBkbyBpbnN0ZWFkLgorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWFwaV9lbmNvZGVfY29uZmlnX2F0dHJpYnV0ZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgaW50IGksIG4sIGVycjsKKyAgICBWQVByb2ZpbGUgICAgKnByb2ZpbGVzICAgID0gTlVMTDsKKyAgICBWQUVudHJ5cG9pbnQgKmVudHJ5cG9pbnRzID0gTlVMTDsKKyAgICBWQUNvbmZpZ0F0dHJpYiBhdHRyW10gPSB7CisgICAgICAgIHsgVkFDb25maWdBdHRyaWJSVEZvcm1hdCAgICAgICAgIH0sCisgICAgICAgIHsgVkFDb25maWdBdHRyaWJSYXRlQ29udHJvbCAgICAgIH0sCisgICAgICAgIHsgVkFDb25maWdBdHRyaWJFbmNNYXhSZWZGcmFtZXMgIH0sCisgICAgICAgIHsgVkFDb25maWdBdHRyaWJFbmNQYWNrZWRIZWFkZXJzIH0sCisgICAgfTsKKworICAgIG4gPSB2YU1heE51bVByb2ZpbGVzKGN0eC0+aHdjdHgtPmRpc3BsYXkpOworICAgIHByb2ZpbGVzID0gYXZfbWFsbG9jX2FycmF5KG4sIHNpemVvZihWQVByb2ZpbGUpKTsKKyAgICBpZiAoIXByb2ZpbGVzKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICB2YXMgPSB2YVF1ZXJ5Q29uZmlnUHJvZmlsZXMoY3R4LT5od2N0eC0+ZGlzcGxheSwgcHJvZmlsZXMsICZuKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBwcm9maWxlczogJWQgKCVzKS5cbiIsCisgICAgICAgICAgICAgICB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlmIChwcm9maWxlc1tpXSA9PSBjdHgtPnZhX3Byb2ZpbGUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPj0gbikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFbmNvZGluZyBwcm9maWxlIG5vdCBmb3VuZCAoJWQpLlxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+dmFfcHJvZmlsZSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG4gPSB2YU1heE51bUVudHJ5cG9pbnRzKGN0eC0+aHdjdHgtPmRpc3BsYXkpOworICAgIGVudHJ5cG9pbnRzID0gYXZfbWFsbG9jX2FycmF5KG4sIHNpemVvZihWQUVudHJ5cG9pbnQpKTsKKyAgICBpZiAoIWVudHJ5cG9pbnRzKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICB2YXMgPSB2YVF1ZXJ5Q29uZmlnRW50cnlwb2ludHMoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9wcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeXBvaW50cywgJm4pOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IGVudHJ5cG9pbnRzIGZvciAiCisgICAgICAgICAgICAgICAicHJvZmlsZSAldTogJWQgKCVzKS5cbiIsIGN0eC0+dmFfcHJvZmlsZSwKKyAgICAgICAgICAgICAgIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKGVudHJ5cG9pbnRzW2ldID09IGN0eC0+dmFfZW50cnlwb2ludCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA+PSBuKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVuY29kaW5nIGVudHJ5cG9pbnQgbm90IGZvdW5kICIKKyAgICAgICAgICAgICAgICIoJWQgLyAlZCkuXG4iLCBjdHgtPnZhX3Byb2ZpbGUsIGN0eC0+dmFfZW50cnlwb2ludCk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHZhcyA9IHZhR2V0Q29uZmlnQXR0cmlidXRlcyhjdHgtPmh3Y3R4LT5kaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZhX3Byb2ZpbGUsIGN0eC0+dmFfZW50cnlwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ciwgRkZfQVJSQVlfRUxFTVMoYXR0cikpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZmV0Y2ggY29uZmlnICIKKyAgICAgICAgICAgICAgICJhdHRyaWJ1dGVzOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhhdHRyKTsgaSsrKSB7CisgICAgICAgIGlmIChhdHRyW2ldLnZhbHVlID09IFZBX0FUVFJJQl9OT1RfU1VQUE9SVEVEKSB7CisgICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gdHJlYXQgdGhpcyBhcyAiZG9uJ3Qga25vdyIgYW5kIGhvcGUKKyAgICAgICAgICAgIC8vIGZvciB0aGUgYmVzdCwgYmVjYXVzZSB0aGUgSW50ZWwgTUpQRUcgZW5jb2RlciByZXR1cm5zIHRoaXMKKyAgICAgICAgICAgIC8vIGZvciBhbGwgdGhlIGludGVyZXN0aW5nIGF0dHJpYnV0ZXMuCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkF0dHJpYnV0ZSAoJWQpIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLAorICAgICAgICAgICAgICAgICAgIGF0dHJbaV0udHlwZSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGF0dHJbaV0udHlwZSkgeworICAgICAgICBjYXNlIFZBQ29uZmlnQXR0cmliUlRGb3JtYXQ6CisgICAgICAgICAgICBpZiAoIShjdHgtPnZhX3J0X2Zvcm1hdCAmIGF0dHJbaV0udmFsdWUpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJTdXJmYWNlIFJUIGZvcm1hdCAlI3ggIgorICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IHN1cHBvcnRlZCAobWFzayAlI3gpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52YV9ydF9mb3JtYXQsIGF0dHJbaV0udmFsdWUpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdHgtPmNvbmZpZ19hdHRyaWJ1dGVzW2N0eC0+bmJfY29uZmlnX2F0dHJpYnV0ZXMrK10gPQorICAgICAgICAgICAgICAgIChWQUNvbmZpZ0F0dHJpYikgeworICAgICAgICAgICAgICAgIC50eXBlICA9IFZBQ29uZmlnQXR0cmliUlRGb3JtYXQsCisgICAgICAgICAgICAgICAgLnZhbHVlID0gY3R4LT52YV9ydF9mb3JtYXQsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVkFDb25maWdBdHRyaWJSYXRlQ29udHJvbDoKKyAgICAgICAgICAgIC8vIEhhY2sgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IENCUiB3YXMgdGhlIG9ubHkKKyAgICAgICAgICAgIC8vIHVzYWJsZSBSQyBtb2RlIGZvciBhIGxvbmcgdGltZSwgc28gb2xkIGRyaXZlcnMgd2lsbAorICAgICAgICAgICAgLy8gb25seSBoYXZlIGl0LiAgTm9ybWFsIGRlZmF1bHQgb3B0aW9ucyBtYXkgbm93IGNob29zZQorICAgICAgICAgICAgLy8gVkJSIGFuZCB0aGVuIGZhaWwsIGhvd2V2ZXIsIHNvIG92ZXJyaWRlIGl0IGhlcmUgd2l0aAorICAgICAgICAgICAgLy8gQ0JSIGlmIHRoYXQgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIG1vZGUuCisgICAgICAgICAgICBpZiAoY3R4LT52YV9yY19tb2RlID09IFZBX1JDX1ZCUiAmJgorICAgICAgICAgICAgICAgICEoYXR0cltpXS52YWx1ZSAmIFZBX1JDX1ZCUikgJiYKKyAgICAgICAgICAgICAgICAoYXR0cltpXS52YWx1ZSAmIFZBX1JDX0NCUikpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVkJSIHJhdGUgY29udHJvbCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICJub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBkcml2ZXIgdmVyc2lvbjsgIgorICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgQ0JSIGluc3RlYWQuXG4iKTsKKyAgICAgICAgICAgICAgICBjdHgtPnZhX3JjX21vZGUgPSBWQV9SQ19DQlI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShjdHgtPnZhX3JjX21vZGUgJiBhdHRyW2ldLnZhbHVlKSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmF0ZSBjb250cm9sIG1vZGUgJSN4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBzdXBwb3J0ZWQgKG1hc2s6ICUjeCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZhX3JjX21vZGUsIGF0dHJbaV0udmFsdWUpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdHgtPmNvbmZpZ19hdHRyaWJ1dGVzW2N0eC0+bmJfY29uZmlnX2F0dHJpYnV0ZXMrK10gPQorICAgICAgICAgICAgICAgIChWQUNvbmZpZ0F0dHJpYikgeworICAgICAgICAgICAgICAgIC50eXBlICA9IFZBQ29uZmlnQXR0cmliUmF0ZUNvbnRyb2wsCisgICAgICAgICAgICAgICAgLnZhbHVlID0gY3R4LT52YV9yY19tb2RlLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZBQ29uZmlnQXR0cmliRW5jTWF4UmVmRnJhbWVzOgorICAgICAgICB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVmX2wwID0gYXR0cltpXS52YWx1ZSAmIDB4ZmZmZjsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCByZWZfbDEgPSAoYXR0cltpXS52YWx1ZSA+PiAxNikgJiAweGZmZmY7CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+Z29wX3NpemUgPiAxICYmIHJlZl9sMCA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlAgZnJhbWVzIGFyZSBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkICglI3gpLlxuIiwgYXR0cltpXS52YWx1ZSk7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmN0eC0+bWF4X2JfZnJhbWVzID4gMCAmJiByZWZfbDEgPCAxKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkIgZnJhbWVzIGFyZSBub3QgIgorICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkICglI3gpIGJ5IHRoZSB1bmRlcmx5aW5nIGRyaXZlci5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF0dHJbaV0udmFsdWUpOworICAgICAgICAgICAgICAgIGF2Y3R4LT5tYXhfYl9mcmFtZXMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFZBQ29uZmlnQXR0cmliRW5jUGFja2VkSGVhZGVyczoKKyAgICAgICAgICAgIGlmIChjdHgtPnZhX3BhY2tlZF9oZWFkZXJzICYgfmF0dHJbaV0udmFsdWUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzbid0IGZhdGFsLCBidXQgcGFja2VkIGhlYWRlcnMgYXJlIGFsd2F5cworICAgICAgICAgICAgICAgIC8vIHByZWZlcmFibGUgYmVjYXVzZSB0aGV5IGFyZSB1bmRlciBvdXIgY29udHJvbC4KKyAgICAgICAgICAgICAgICAvLyBXaGVuIGFic2VudCwgdGhlIGRyaXZlciBpcyBnZW5lcmF0aW5nIHRoZW0gYW5kIHNvbWUKKyAgICAgICAgICAgICAgICAvLyBmZWF0dXJlcyBtYXkgbm90IHdvcmsgKGUuZy4gVlVJIG9yIFNFSSBpbiBILjI2NCkuCisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIldhcm5pbmc6IHNvbWUgcGFja2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgKHdhbnQgJSN4LCBnb3QgJSN4KS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dmFfcGFja2VkX2hlYWRlcnMsIGF0dHJbaV0udmFsdWUpOworICAgICAgICAgICAgICAgIGN0eC0+dmFfcGFja2VkX2hlYWRlcnMgJj0gYXR0cltpXS52YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0eC0+Y29uZmlnX2F0dHJpYnV0ZXNbY3R4LT5uYl9jb25maWdfYXR0cmlidXRlcysrXSA9CisgICAgICAgICAgICAgICAgKFZBQ29uZmlnQXR0cmliKSB7CisgICAgICAgICAgICAgICAgLnR5cGUgID0gVkFDb25maWdBdHRyaWJFbmNQYWNrZWRIZWFkZXJzLAorICAgICAgICAgICAgICAgIC52YWx1ZSA9IGN0eC0+dmFfcGFja2VkX2hlYWRlcnMsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKDAgJiYgIlVuZXhwZWN0ZWQgY29uZmlnIGF0dHJpYnV0ZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVyciA9IDA7CitmYWlsOgorICAgIGF2X2ZyZWVwKCZwcm9maWxlcyk7CisgICAgYXZfZnJlZXAoJmVudHJ5cG9pbnRzKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdmFhcGlfZW5jb2RlX2luaXRfcmF0ZV9jb250cm9sKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJjX2JpdHNfcGVyX3NlY29uZDsKKyAgICBpbnQgcmNfdGFyZ2V0X3BlcmNlbnRhZ2U7CisgICAgaW50IHJjX3dpbmRvd19zaXplOworICAgIGludCBocmRfYnVmZmVyX3NpemU7CisgICAgaW50IGhyZF9pbml0aWFsX2J1ZmZlcl9mdWxsbmVzczsKKyAgICBpbnQgZnJfbnVtLCBmcl9kZW47CisKKyAgICBpZiAoYXZjdHgtPmJpdF9yYXRlID4gSU5UMzJfTUFYKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVGFyZ2V0IGJpdHJhdGUgb2YgMl4zMSBicHMgb3IgIgorICAgICAgICAgICAgICAgImhpZ2hlciBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5yY19idWZmZXJfc2l6ZSkKKyAgICAgICAgaHJkX2J1ZmZlcl9zaXplID0gYXZjdHgtPnJjX2J1ZmZlcl9zaXplOworICAgIGVsc2UKKyAgICAgICAgaHJkX2J1ZmZlcl9zaXplID0gYXZjdHgtPmJpdF9yYXRlOworICAgIGlmIChhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5KQorICAgICAgICBocmRfaW5pdGlhbF9idWZmZXJfZnVsbG5lc3MgPSBhdmN0eC0+cmNfaW5pdGlhbF9idWZmZXJfb2NjdXBhbmN5OworICAgIGVsc2UKKyAgICAgICAgaHJkX2luaXRpYWxfYnVmZmVyX2Z1bGxuZXNzID0gaHJkX2J1ZmZlcl9zaXplICogMyAvIDQ7CisKKyAgICBpZiAoY3R4LT52YV9yY19tb2RlID09IFZBX1JDX0NCUikgeworICAgICAgICByY19iaXRzX3Blcl9zZWNvbmQgICA9IGF2Y3R4LT5iaXRfcmF0ZTsKKyAgICAgICAgcmNfdGFyZ2V0X3BlcmNlbnRhZ2UgPSAxMDA7CisgICAgICAgIHJjX3dpbmRvd19zaXplICAgICAgID0gMTAwMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXZjdHgtPnJjX21heF9yYXRlIDwgYXZjdHgtPmJpdF9yYXRlKSB7CisgICAgICAgICAgICAvLyBNYXggcmF0ZSBpcyB1bnNldCBvciBpbnZhbGlkLCBqdXN0IHVzZSB0aGUgbm9ybWFsIGJpdHJhdGUuCisgICAgICAgICAgICByY19iaXRzX3Blcl9zZWNvbmQgICA9IGF2Y3R4LT5iaXRfcmF0ZTsKKyAgICAgICAgICAgIHJjX3RhcmdldF9wZXJjZW50YWdlID0gMTAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmNfYml0c19wZXJfc2Vjb25kICAgPSBhdmN0eC0+cmNfbWF4X3JhdGU7CisgICAgICAgICAgICByY190YXJnZXRfcGVyY2VudGFnZSA9IChhdmN0eC0+Yml0X3JhdGUgKiAxMDApIC8gcmNfYml0c19wZXJfc2Vjb25kOworICAgICAgICB9CisgICAgICAgIHJjX3dpbmRvd19zaXplID0gKGhyZF9idWZmZXJfc2l6ZSAqIDEwMDApIC8gYXZjdHgtPmJpdF9yYXRlOworICAgIH0KKworICAgIGN0eC0+cmNfcGFyYW1zLm1pc2MudHlwZSA9IFZBRW5jTWlzY1BhcmFtZXRlclR5cGVSYXRlQ29udHJvbDsKKyAgICBjdHgtPnJjX3BhcmFtcy5yYyA9IChWQUVuY01pc2NQYXJhbWV0ZXJSYXRlQ29udHJvbCkgeworICAgICAgICAuYml0c19wZXJfc2Vjb25kICAgPSByY19iaXRzX3Blcl9zZWNvbmQsCisgICAgICAgIC50YXJnZXRfcGVyY2VudGFnZSA9IHJjX3RhcmdldF9wZXJjZW50YWdlLAorICAgICAgICAud2luZG93X3NpemUgICAgICAgPSByY193aW5kb3dfc2l6ZSwKKyAgICAgICAgLmluaXRpYWxfcXAgICAgICAgID0gMCwKKyAgICAgICAgLm1pbl9xcCAgICAgICAgICAgID0gKGF2Y3R4LT5xbWluID4gMCA/IGF2Y3R4LT5xbWluIDogMCksCisgICAgICAgIC5iYXNpY191bml0X3NpemUgICA9IDAsCisgICAgfTsKKyAgICBjdHgtPmdsb2JhbF9wYXJhbXNbY3R4LT5uYl9nbG9iYWxfcGFyYW1zXSA9CisgICAgICAgICZjdHgtPnJjX3BhcmFtcy5taXNjOworICAgIGN0eC0+Z2xvYmFsX3BhcmFtc19zaXplW2N0eC0+bmJfZ2xvYmFsX3BhcmFtcysrXSA9CisgICAgICAgIHNpemVvZihjdHgtPnJjX3BhcmFtcyk7CisKKyAgICBjdHgtPmhyZF9wYXJhbXMubWlzYy50eXBlID0gVkFFbmNNaXNjUGFyYW1ldGVyVHlwZUhSRDsKKyAgICBjdHgtPmhyZF9wYXJhbXMuaHJkID0gKFZBRW5jTWlzY1BhcmFtZXRlckhSRCkgeworICAgICAgICAuaW5pdGlhbF9idWZmZXJfZnVsbG5lc3MgPSBocmRfaW5pdGlhbF9idWZmZXJfZnVsbG5lc3MsCisgICAgICAgIC5idWZmZXJfc2l6ZSAgICAgICAgICAgICA9IGhyZF9idWZmZXJfc2l6ZSwKKyAgICB9OworICAgIGN0eC0+Z2xvYmFsX3BhcmFtc1tjdHgtPm5iX2dsb2JhbF9wYXJhbXNdID0KKyAgICAgICAgJmN0eC0+aHJkX3BhcmFtcy5taXNjOworICAgIGN0eC0+Z2xvYmFsX3BhcmFtc19zaXplW2N0eC0+bmJfZ2xvYmFsX3BhcmFtcysrXSA9CisgICAgICAgIHNpemVvZihjdHgtPmhyZF9wYXJhbXMpOworCisgICAgaWYgKGF2Y3R4LT5mcmFtZXJhdGUubnVtID4gMCAmJiBhdmN0eC0+ZnJhbWVyYXRlLmRlbiA+IDApCisgICAgICAgIGF2X3JlZHVjZSgmZnJfbnVtLCAmZnJfZGVuLAorICAgICAgICAgICAgICAgICAgYXZjdHgtPmZyYW1lcmF0ZS5udW0sIGF2Y3R4LT5mcmFtZXJhdGUuZGVuLCA2NTUzNSk7CisgICAgZWxzZQorICAgICAgICBhdl9yZWR1Y2UoJmZyX251bSwgJmZyX2RlbiwKKyAgICAgICAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuLCBhdmN0eC0+dGltZV9iYXNlLm51bSwgNjU1MzUpOworCisgICAgY3R4LT5mcl9wYXJhbXMubWlzYy50eXBlID0gVkFFbmNNaXNjUGFyYW1ldGVyVHlwZUZyYW1lUmF0ZTsKKyAgICBjdHgtPmZyX3BhcmFtcy5mci5mcmFtZXJhdGUgPSAodW5zaWduZWQgaW50KWZyX2RlbiA8PCAxNiB8IGZyX251bTsKKworI2lmIFZBX0NIRUNLX1ZFUlNJT04oMCwgNDAsIDApCisgICAgY3R4LT5nbG9iYWxfcGFyYW1zW2N0eC0+bmJfZ2xvYmFsX3BhcmFtc10gPQorICAgICAgICAmY3R4LT5mcl9wYXJhbXMubWlzYzsKKyAgICBjdHgtPmdsb2JhbF9wYXJhbXNfc2l6ZVtjdHgtPm5iX2dsb2JhbF9wYXJhbXMrK10gPQorICAgICAgICBzaXplb2YoY3R4LT5mcl9wYXJhbXMpOworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdmFhcGlfZW5jb2RlX2ZyZWVfb3V0cHV0X2J1ZmZlcih2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgQVZDb2RlY0NvbnRleHQgICAqYXZjdHggPSBvcGFxdWU7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQnVmZmVySUQgYnVmZmVyX2lkOworCisgICAgYnVmZmVyX2lkID0gKFZBQnVmZmVySUQpKHVpbnRwdHJfdClkYXRhOworCisgICAgdmFEZXN0cm95QnVmZmVyKGN0eC0+aHdjdHgtPmRpc3BsYXksIGJ1ZmZlcl9pZCk7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkZyZWVkIG91dHB1dCBidWZmZXIgJSN4XG4iLCBidWZmZXJfaWQpOworfQorCitzdGF0aWMgQVZCdWZmZXJSZWYgKnZhYXBpX2VuY29kZV9hbGxvY19vdXRwdXRfYnVmZmVyKHZvaWQgKm9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCit7CisgICAgQVZDb2RlY0NvbnRleHQgICAqYXZjdHggPSBvcGFxdWU7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQnVmZmVySUQgYnVmZmVyX2lkOworICAgIFZBU3RhdHVzIHZhczsKKyAgICBBVkJ1ZmZlclJlZiAqcmVmOworCisgICAgLy8gVGhlIG91dHB1dCBidWZmZXIgc2l6ZSBpcyBmaXhlZCwgc28gaXQgbmVlZHMgdG8gYmUgbGFyZ2UgZW5vdWdoCisgICAgLy8gdG8gaG9sZCB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBjb21wcmVzc2VkIGZyYW1lLiAgV2UgYXNzdW1lIGhlcmUKKyAgICAvLyB0aGF0IHRoZSB1bmNvbXByZXNzZWQgZnJhbWUgcGx1cyBzb21lIGhlYWRlciBkYXRhIGlzIGFuIHVwcGVyCisgICAgLy8gYm91bmQgb24gdGhhdC4KKyAgICB2YXMgPSB2YUNyZWF0ZUJ1ZmZlcihjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVkFFbmNDb2RlZEJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMyAqIGN0eC0+c3VyZmFjZV93aWR0aCAqIGN0eC0+c3VyZmFjZV9oZWlnaHQgKworICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IDE2KSwgMSwgMCwgJmJ1ZmZlcl9pZCk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgYml0c3RyZWFtICIKKyAgICAgICAgICAgICAgICJvdXRwdXQgYnVmZmVyOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkFsbG9jYXRlZCBvdXRwdXQgYnVmZmVyICUjeFxuIiwgYnVmZmVyX2lkKTsKKworICAgIHJlZiA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QqKSh1aW50cHRyX3QpYnVmZmVyX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmZlcl9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFhcGlfZW5jb2RlX2ZyZWVfb3V0cHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LCBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7CisgICAgaWYgKCFyZWYpIHsKKyAgICAgICAgdmFEZXN0cm95QnVmZmVyKGN0eC0+aHdjdHgtPmRpc3BsYXksIGJ1ZmZlcl9pZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiByZWY7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWFwaV9lbmNvZGVfY3JlYXRlX3JlY29uX2ZyYW1lcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWVkFBUElIV0NvbmZpZyAqaHdjb25maWcgPSBOVUxMOworICAgIEFWSFdGcmFtZXNDb25zdHJhaW50cyAqY29uc3RyYWludHMgPSBOVUxMOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCByZWNvbl9mb3JtYXQ7CisgICAgaW50IGVyciwgaTsKKworICAgIGh3Y29uZmlnID0gYXZfaHdkZXZpY2VfaHdjb25maWdfYWxsb2MoY3R4LT5kZXZpY2VfcmVmKTsKKyAgICBpZiAoIWh3Y29uZmlnKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBod2NvbmZpZy0+Y29uZmlnX2lkID0gY3R4LT52YV9jb25maWc7CisKKyAgICBjb25zdHJhaW50cyA9IGF2X2h3ZGV2aWNlX2dldF9od2ZyYW1lX2NvbnN0cmFpbnRzKGN0eC0+ZGV2aWNlX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3Y29uZmlnKTsKKyAgICBpZiAoIWNvbnN0cmFpbnRzKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8vIFByb2JhYmx5IHdlIGNhbiB1c2UgdGhlIGlucHV0IHN1cmZhY2UgZm9ybWF0IGFzIHRoZSBzdXJmYWNlIGZvcm1hdAorICAgIC8vIG9mIHRoZSByZWNvbnN0cnVjdGVkIGZyYW1lcy4gIElmIG5vdCwgd2UganVzdCBwaWNrIHRoZSBmaXJzdCAob25seT8pCisgICAgLy8gZm9ybWF0IGluIHRoZSB2YWxpZCBsaXN0IGFuZCBob3BlIHRoYXQgaXQgYWxsIHdvcmtzLgorICAgIHJlY29uX2Zvcm1hdCA9IEFWX1BJWF9GTVRfTk9ORTsKKyAgICBpZiAoY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHNbaV0gIT0gQVZfUElYX0ZNVF9OT05FOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdHgtPmlucHV0X2ZyYW1lcy0+c3dfZm9ybWF0ID09CisgICAgICAgICAgICAgICAgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHNbaV0pIHsKKyAgICAgICAgICAgICAgICByZWNvbl9mb3JtYXQgPSBjdHgtPmlucHV0X2ZyYW1lcy0+c3dfZm9ybWF0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZWNvbl9mb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgICAgICAvLyBObyBtYXRjaC4gIEp1c3QgdXNlIHRoZSBmaXJzdCBpbiB0aGUgc3VwcG9ydGVkIGxpc3QgYW5kCisgICAgICAgICAgICAvLyBob3BlIGZvciB0aGUgYmVzdC4KKyAgICAgICAgICAgIHJlY29uX2Zvcm1hdCA9IGNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzWzBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm8gaWRlYSB3aGF0IHRvIHVzZTsgY29weSBpbnB1dCBmb3JtYXQuCisgICAgICAgIHJlY29uX2Zvcm1hdCA9IGN0eC0+aW5wdXRfZnJhbWVzLT5zd19mb3JtYXQ7CisgICAgfQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVXNpbmcgJXMgYXMgZm9ybWF0IG9mICIKKyAgICAgICAgICAgInJlY29uc3RydWN0ZWQgZnJhbWVzLlxuIiwgYXZfZ2V0X3BpeF9mbXRfbmFtZShyZWNvbl9mb3JtYXQpKTsKKworICAgIGlmIChjdHgtPnN1cmZhY2Vfd2lkdGggIDwgY29uc3RyYWludHMtPm1pbl93aWR0aCAgfHwKKyAgICAgICAgY3R4LT5zdXJmYWNlX2hlaWdodCA8IGNvbnN0cmFpbnRzLT5taW5faGVpZ2h0IHx8CisgICAgICAgIGN0eC0+c3VyZmFjZV93aWR0aCAgPiBjb25zdHJhaW50cy0+bWF4X3dpZHRoIHx8CisgICAgICAgIGN0eC0+c3VyZmFjZV9oZWlnaHQgPiBjb25zdHJhaW50cy0+bWF4X2hlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZW5jb2RpbmcgYXQgIgorICAgICAgICAgICAgICAgInNpemUgJWR4JWQgKGNvbnN0cmFpbnRzOiB3aWR0aCAlZC0lZCBoZWlnaHQgJWQtJWQpLlxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+c3VyZmFjZV93aWR0aCwgY3R4LT5zdXJmYWNlX2hlaWdodCwKKyAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLT5taW5fd2lkdGgsICBjb25zdHJhaW50cy0+bWF4X3dpZHRoLAorICAgICAgICAgICAgICAgY29uc3RyYWludHMtPm1pbl9oZWlnaHQsIGNvbnN0cmFpbnRzLT5tYXhfaGVpZ2h0KTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXZfZnJlZXAoJmh3Y29uZmlnKTsKKyAgICBhdl9od2ZyYW1lX2NvbnN0cmFpbnRzX2ZyZWUoJmNvbnN0cmFpbnRzKTsKKworICAgIGN0eC0+cmVjb25fZnJhbWVzX3JlZiA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGN0eC0+ZGV2aWNlX3JlZik7CisgICAgaWYgKCFjdHgtPnJlY29uX2ZyYW1lc19yZWYpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGN0eC0+cmVjb25fZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0KiljdHgtPnJlY29uX2ZyYW1lc19yZWYtPmRhdGE7CisKKyAgICBjdHgtPnJlY29uX2ZyYW1lcy0+Zm9ybWF0ICAgID0gQVZfUElYX0ZNVF9WQUFQSTsKKyAgICBjdHgtPnJlY29uX2ZyYW1lcy0+c3dfZm9ybWF0ID0gcmVjb25fZm9ybWF0OworICAgIGN0eC0+cmVjb25fZnJhbWVzLT53aWR0aCAgICAgPSBjdHgtPnN1cmZhY2Vfd2lkdGg7CisgICAgY3R4LT5yZWNvbl9mcmFtZXMtPmhlaWdodCAgICA9IGN0eC0+c3VyZmFjZV9oZWlnaHQ7CisgICAgLy8gQXQgbW9zdCB0aHJlZSBJRFIvSS9QIGZyYW1lcyBhbmQgdHdvIHJ1bnMgb2YgQiBmcmFtZXMgY2FuIGJlIGluCisgICAgLy8gZmxpZ2h0IGF0IGFueSBvbmUgdGltZS4KKyAgICBjdHgtPnJlY29uX2ZyYW1lcy0+aW5pdGlhbF9wb29sX3NpemUgPSAzICsgMiAqIGF2Y3R4LT5tYXhfYl9mcmFtZXM7CisKKyAgICBlcnIgPSBhdl9od2ZyYW1lX2N0eF9pbml0KGN0eC0+cmVjb25fZnJhbWVzX3JlZik7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdGlhbGlzZSByZWNvbnN0cnVjdGVkICIKKyAgICAgICAgICAgICAgICJmcmFtZSBjb250ZXh0OiAlZC5cbiIsIGVycik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSAwOworICBmYWlsOgorICAgIGF2X2ZyZWVwKCZod2NvbmZpZyk7CisgICAgYXZfaHdmcmFtZV9jb25zdHJhaW50c19mcmVlKCZjb25zdHJhaW50cyk7CisgICAgcmV0dXJuIGVycjsKK30KKworYXZfY29sZCBpbnQgZmZfdmFhcGlfZW5jb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVlZBQVBJRnJhbWVzQ29udGV4dCAqcmVjb25faHdjdHggPSBOVUxMOworICAgIFZBU3RhdHVzIHZhczsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKCFhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkEgaGFyZHdhcmUgZnJhbWVzIHJlZmVyZW5jZSBpcyAiCisgICAgICAgICAgICAgICAicmVxdWlyZWQgdG8gYXNzb2NpYXRlIHRoZSBlbmNvZGluZyBkZXZpY2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjdHgtPmNvZGVjX29wdGlvbnMgPSBjdHgtPmNvZGVjX29wdGlvbnNfZGF0YTsKKworICAgIGN0eC0+dmFfY29uZmlnICA9IFZBX0lOVkFMSURfSUQ7CisgICAgY3R4LT52YV9jb250ZXh0ID0gVkFfSU5WQUxJRF9JRDsKKworICAgIGN0eC0+cHJpdl9kYXRhID0gYXZfbWFsbG9jeihjdHgtPmNvZGVjLT5wcml2X2RhdGFfc2l6ZSk7CisgICAgaWYgKCFjdHgtPnByaXZfZGF0YSkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdHgtPmlucHV0X2ZyYW1lc19yZWYgPSBhdl9idWZmZXJfcmVmKGF2Y3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICBpZiAoIWN0eC0+aW5wdXRfZnJhbWVzX3JlZikgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgY3R4LT5pbnB1dF9mcmFtZXMgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWN0eC0+aW5wdXRfZnJhbWVzX3JlZi0+ZGF0YTsKKworICAgIGN0eC0+ZGV2aWNlX3JlZiA9IGF2X2J1ZmZlcl9yZWYoY3R4LT5pbnB1dF9mcmFtZXMtPmRldmljZV9yZWYpOworICAgIGlmICghY3R4LT5kZXZpY2VfcmVmKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBjdHgtPmRldmljZSA9IChBVkhXRGV2aWNlQ29udGV4dCopY3R4LT5kZXZpY2VfcmVmLT5kYXRhOworICAgIGN0eC0+aHdjdHggPSBjdHgtPmRldmljZS0+aHdjdHg7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfY29uZmlnX2F0dHJpYnV0ZXMoYXZjdHgpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICB2YXMgPSB2YUNyZWF0ZUNvbmZpZyhjdHgtPmh3Y3R4LT5kaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dmFfcHJvZmlsZSwgY3R4LT52YV9lbnRyeXBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y29uZmlnX2F0dHJpYnV0ZXMsIGN0eC0+bmJfY29uZmlnX2F0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+dmFfY29uZmlnKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBlbmNvZGUgcGlwZWxpbmUgIgorICAgICAgICAgICAgICAgImNvbmZpZ3VyYXRpb246ICVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IHZhYXBpX2VuY29kZV9jcmVhdGVfcmVjb25fZnJhbWVzKGF2Y3R4KTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcmVjb25faHdjdHggPSBjdHgtPnJlY29uX2ZyYW1lcy0+aHdjdHg7CisgICAgdmFzID0gdmFDcmVhdGVDb250ZXh0KGN0eC0+aHdjdHgtPmRpc3BsYXksIGN0eC0+dmFfY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnN1cmZhY2Vfd2lkdGgsIGN0eC0+c3VyZmFjZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZBX1BST0dSRVNTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbl9od2N0eC0+c3VyZmFjZV9pZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uX2h3Y3R4LT5uYl9zdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+dmFfY29udGV4dCk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgZW5jb2RlIHBpcGVsaW5lICIKKyAgICAgICAgICAgICAgICJjb250ZXh0OiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdHgtPm91dHB1dF9idWZmZXJfcG9vbCA9CisgICAgICAgIGF2X2J1ZmZlcl9wb29sX2luaXQyKHNpemVvZihWQUJ1ZmZlcklEKSwgYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWFwaV9lbmNvZGVfYWxsb2Nfb3V0cHV0X2J1ZmZlciwgTlVMTCk7CisgICAgaWYgKCFjdHgtPm91dHB1dF9idWZmZXJfcG9vbCkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT52YV9yY19tb2RlICYgflZBX1JDX0NRUCkgeworICAgICAgICBlcnIgPSB2YWFwaV9lbmNvZGVfaW5pdF9yYXRlX2NvbnRyb2woYXZjdHgpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5jb2RlYy0+Y29uZmlndXJlKSB7CisgICAgICAgIGVyciA9IGN0eC0+Y29kZWMtPmNvbmZpZ3VyZShhdmN0eCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPj0gMCkgeworI2lmIFZBX0NIRUNLX1ZFUlNJT04oMCwgMzYsIDApCisgICAgICAgIFZBQ29uZmlnQXR0cmliIGF0dHIgPSB7IFZBQ29uZmlnQXR0cmliRW5jUXVhbGl0eVJhbmdlIH07CisKKyAgICAgICAgdmFzID0gdmFHZXRDb25maWdBdHRyaWJ1dGVzKGN0eC0+aHdjdHgtPmRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZhX3Byb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnZhX2VudHJ5cG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0ciwgMSk7CisgICAgICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gcXVlcnkgcXVhbGl0eSAiCisgICAgICAgICAgICAgICAgICAgImF0dHJpYnV0ZTogd2lsbCB1c2UgZGVmYXVsdCBjb21wcmVzc2lvbiBsZXZlbC5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCA+IGF0dHIudmFsdWUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBjb21wcmVzc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICJsZXZlbDogdmFsaWQgcmFuZ2UgaXMgMC0lZCwgdXNpbmcgJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdHRyLnZhbHVlLCBhdHRyLnZhbHVlKTsKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPSBhdHRyLnZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdHgtPnF1YWxpdHlfcGFyYW1zLm1pc2MudHlwZSA9CisgICAgICAgICAgICAgICAgVkFFbmNNaXNjUGFyYW1ldGVyVHlwZVF1YWxpdHlMZXZlbDsKKyAgICAgICAgICAgIGN0eC0+cXVhbGl0eV9wYXJhbXMucXVhbGl0eS5xdWFsaXR5X2xldmVsID0KKyAgICAgICAgICAgICAgICBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWw7CisKKyAgICAgICAgICAgIGN0eC0+Z2xvYmFsX3BhcmFtc1tjdHgtPm5iX2dsb2JhbF9wYXJhbXNdID0KKyAgICAgICAgICAgICAgICAmY3R4LT5xdWFsaXR5X3BhcmFtcy5taXNjOworICAgICAgICAgICAgY3R4LT5nbG9iYWxfcGFyYW1zX3NpemVbY3R4LT5uYl9nbG9iYWxfcGFyYW1zKytdID0KKyAgICAgICAgICAgICAgICBzaXplb2YoY3R4LT5xdWFsaXR5X3BhcmFtcyk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGUgZW5jb2RlIGNvbXByZXNzaW9uIGxldmVsICIKKyAgICAgICAgICAgICAgICJvcHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgVkFBUEkgdmVyc2lvbi5cbiIpOworI2VuZGlmCisgICAgfQorCisgICAgY3R4LT5pbnB1dF9vcmRlciAgPSAwOworICAgIGN0eC0+b3V0cHV0X2RlbGF5ID0gYXZjdHgtPm1heF9iX2ZyYW1lczsKKyAgICBjdHgtPmRlY29kZV9kZWxheSA9IDE7CisgICAgY3R4LT5vdXRwdXRfb3JkZXIgPSAtIGN0eC0+b3V0cHV0X2RlbGF5IC0gMTsKKworICAgIC8vIEN1cnJlbnRseSB3ZSBuZXZlciBnZW5lcmF0ZSBJIGZyYW1lcywgb25seSBJRFIuCisgICAgY3R4LT5wX3Blcl9pID0gSU5UX01BWDsKKyAgICBjdHgtPmJfcGVyX3AgPSBhdmN0eC0+bWF4X2JfZnJhbWVzOworCisgICAgaWYgKGN0eC0+Y29kZWMtPnNlcXVlbmNlX3BhcmFtc19zaXplID4gMCkgeworICAgICAgICBjdHgtPmNvZGVjX3NlcXVlbmNlX3BhcmFtcyA9CisgICAgICAgICAgICBhdl9tYWxsb2N6KGN0eC0+Y29kZWMtPnNlcXVlbmNlX3BhcmFtc19zaXplKTsKKyAgICAgICAgaWYgKCFjdHgtPmNvZGVjX3NlcXVlbmNlX3BhcmFtcykgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjdHgtPmNvZGVjLT5waWN0dXJlX3BhcmFtc19zaXplID4gMCkgeworICAgICAgICBjdHgtPmNvZGVjX3BpY3R1cmVfcGFyYW1zID0KKyAgICAgICAgICAgIGF2X21hbGxvY3ooY3R4LT5jb2RlYy0+cGljdHVyZV9wYXJhbXNfc2l6ZSk7CisgICAgICAgIGlmICghY3R4LT5jb2RlY19waWN0dXJlX3BhcmFtcykgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGN0eC0+Y29kZWMtPmluaXRfc2VxdWVuY2VfcGFyYW1zKSB7CisgICAgICAgIGVyciA9IGN0eC0+Y29kZWMtPmluaXRfc2VxdWVuY2VfcGFyYW1zKGF2Y3R4KTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29kZWMgc2VxdWVuY2UgaW5pdGlhbGlzYXRpb24gIgorICAgICAgICAgICAgICAgICAgICJmYWlsZWQ6ICVkLlxuIiwgZXJyKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZSBzb21laG93LiAgKE5lZWRzIHRlc3Rpbmcgb24gYSBtYWNoaW5lCisgICAgLy8gd2hlcmUgaXQgYWN0dWFsbHkgb3ZlcmxhcHMgcHJvcGVybHksIHRob3VnaC4pCisgICAgY3R4LT5pc3N1ZV9tb2RlID0gSVNTVUVfTU9ERV9NQVhJTUlTRV9USFJPVUdIUFVUOworCisgICAgaWYgKGN0eC0+dmFfcGFja2VkX2hlYWRlcnMgJiBWQV9FTkNfUEFDS0VEX0hFQURFUl9TRVFVRU5DRSAmJgorICAgICAgICBjdHgtPmNvZGVjLT53cml0ZV9zZXF1ZW5jZV9oZWFkZXIpIHsKKyAgICAgICAgY2hhciBkYXRhW01BWF9QQVJBTV9CVUZGRVJfU0laRV07CisgICAgICAgIHNpemVfdCBiaXRfbGVuID0gOCAqIHNpemVvZihkYXRhKTsKKworICAgICAgICBlcnIgPSBjdHgtPmNvZGVjLT53cml0ZV9zZXF1ZW5jZV9oZWFkZXIoYXZjdHgsIGRhdGEsICZiaXRfbGVuKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIHNlcXVlbmNlIGhlYWRlciAiCisgICAgICAgICAgICAgICAgICAgImZvciBleHRyYWRhdGE6ICVkLlxuIiwgZXJyKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IChiaXRfbGVuICsgNykgLyA4OworICAgICAgICAgICAgYXZjdHgtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooYXZjdHgtPmV4dHJhZGF0YV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShhdmN0eC0+ZXh0cmFkYXRhLCBkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZmZfdmFhcGlfZW5jb2RlX2Nsb3NlKGF2Y3R4KTsKKyAgICByZXR1cm4gZXJyOworfQorCithdl9jb2xkIGludCBmZl92YWFwaV9lbmNvZGVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywgKm5leHQ7CisKKyAgICBmb3IgKHBpYyA9IGN0eC0+cGljX3N0YXJ0OyBwaWM7IHBpYyA9IG5leHQpIHsKKyAgICAgICAgbmV4dCA9IHBpYy0+bmV4dDsKKyAgICAgICAgdmFhcGlfZW5jb2RlX2ZyZWUoYXZjdHgsIHBpYyk7CisgICAgfQorCisgICAgYXZfYnVmZmVyX3Bvb2xfdW5pbml0KCZjdHgtPm91dHB1dF9idWZmZXJfcG9vbCk7CisKKyAgICBpZiAoY3R4LT52YV9jb250ZXh0ICE9IFZBX0lOVkFMSURfSUQpIHsKKyAgICAgICAgdmFEZXN0cm95Q29udGV4dChjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQpOworICAgICAgICBjdHgtPnZhX2NvbnRleHQgPSBWQV9JTlZBTElEX0lEOworICAgIH0KKworICAgIGlmIChjdHgtPnZhX2NvbmZpZyAhPSBWQV9JTlZBTElEX0lEKSB7CisgICAgICAgIHZhRGVzdHJveUNvbmZpZyhjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbmZpZyk7CisgICAgICAgIGN0eC0+dmFfY29uZmlnID0gVkFfSU5WQUxJRF9JRDsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmY3R4LT5jb2RlY19zZXF1ZW5jZV9wYXJhbXMpOworICAgIGF2X2ZyZWVwKCZjdHgtPmNvZGVjX3BpY3R1cmVfcGFyYW1zKTsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5yZWNvbl9mcmFtZXNfcmVmKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aW5wdXRfZnJhbWVzX3JlZik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPmRldmljZV9yZWYpOworCisgICAgYXZfZnJlZXAoJmN0eC0+cHJpdl9kYXRhKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaV9lbmNvZGUuaCBiL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiOWQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlLmgKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZBQVBJX0VOQ09ERV9ICisjZGVmaW5lIEFWQ09ERUNfVkFBUElfRU5DT0RFX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8dmEvdmEuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X3ZhYXBpLmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisKK3N0cnVjdCBWQUFQSUVuY29kZVR5cGU7CitzdHJ1Y3QgVkFBUElFbmNvZGVQaWN0dXJlOworCitlbnVtIHsKKyAgICBNQVhfQ09ORklHX0FUVFJJQlVURVMgID0gNCwKKyAgICBNQVhfR0xPQkFMX1BBUkFNUyAgICAgID0gNCwKKyAgICBNQVhfUElDVFVSRV9SRUZFUkVOQ0VTID0gMiwKKyAgICBNQVhfUkVPUkRFUl9ERUxBWSAgICAgID0gMTYsCisgICAgTUFYX1BBUkFNX0JVRkZFUl9TSVpFICA9IDEwMjQsCit9OworCitlbnVtIHsKKyAgICBQSUNUVVJFX1RZUEVfSURSID0gMCwKKyAgICBQSUNUVVJFX1RZUEVfSSAgID0gMSwKKyAgICBQSUNUVVJFX1RZUEVfUCAgID0gMiwKKyAgICBQSUNUVVJFX1RZUEVfQiAgID0gMywKK307CisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRW5jb2RlU2xpY2UgeworICAgIGludCAgICAgICAgICAgICBpbmRleDsKKyAgICB2b2lkICAgICAgICAgICAqcHJpdl9kYXRhOworICAgIHZvaWQgICAgICAgICAgICpjb2RlY19zbGljZV9wYXJhbXM7Cit9IFZBQVBJRW5jb2RlU2xpY2U7CisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRW5jb2RlUGljdHVyZSB7CisgICAgc3RydWN0IFZBQVBJRW5jb2RlUGljdHVyZSAqbmV4dDsKKworICAgIGludDY0X3QgICAgICAgICBkaXNwbGF5X29yZGVyOworICAgIGludDY0X3QgICAgICAgICBlbmNvZGVfb3JkZXI7CisgICAgaW50NjRfdCAgICAgICAgIHB0czsKKworICAgIGludCAgICAgICAgICAgICB0eXBlOworICAgIGludCAgICAgICAgICAgICBpbnB1dF9hdmFpbGFibGU7CisgICAgaW50ICAgICAgICAgICAgIGVuY29kZV9pc3N1ZWQ7CisgICAgaW50ICAgICAgICAgICAgIGVuY29kZV9jb21wbGV0ZTsKKworICAgIEFWRnJhbWUgICAgICAgICppbnB1dF9pbWFnZTsKKyAgICBWQVN1cmZhY2VJRCAgICAgaW5wdXRfc3VyZmFjZTsKKworICAgIEFWRnJhbWUgICAgICAgICpyZWNvbl9pbWFnZTsKKyAgICBWQVN1cmZhY2VJRCAgICAgcmVjb25fc3VyZmFjZTsKKworICAgIGludCAgICAgICAgICBuYl9wYXJhbV9idWZmZXJzOworICAgIFZBQnVmZmVySUQgICAgICpwYXJhbV9idWZmZXJzOworCisgICAgQVZCdWZmZXJSZWYgICAgKm91dHB1dF9idWZmZXJfcmVmOworICAgIFZBQnVmZmVySUQgICAgICBvdXRwdXRfYnVmZmVyOworCisgICAgdm9pZCAgICAgICAgICAgKnByaXZfZGF0YTsKKyAgICB2b2lkICAgICAgICAgICAqY29kZWNfcGljdHVyZV9wYXJhbXM7CisKKyAgICBpbnQgICAgICAgICAgbmJfcmVmczsKKyAgICBzdHJ1Y3QgVkFBUElFbmNvZGVQaWN0dXJlICpyZWZzW01BWF9QSUNUVVJFX1JFRkVSRU5DRVNdOworCisgICAgaW50ICAgICAgICAgIG5iX3NsaWNlczsKKyAgICBWQUFQSUVuY29kZVNsaWNlICpzbGljZXM7Cit9IFZBQVBJRW5jb2RlUGljdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElFbmNvZGVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIC8vIENvZGVjLXNwZWNpZmljIGhvb2tzLgorICAgIGNvbnN0IHN0cnVjdCBWQUFQSUVuY29kZVR5cGUgKmNvZGVjOworCisgICAgLy8gRW5jb2RpbmcgcHJvZmlsZSAoVkFQcm9maWxlWFhYKS4KKyAgICBWQVByb2ZpbGUgICAgICAgdmFfcHJvZmlsZTsKKyAgICAvLyBFbmNvZGluZyBlbnRyeXBvaW50ICh1c3VhbGx5IFZBRW50cnlvaW50RW5jU2xpY2UpLgorICAgIFZBRW50cnlwb2ludCAgICB2YV9lbnRyeXBvaW50OworICAgIC8vIFN1cmZhY2UgY29sb3VyL3NhbXBsaW5nIGZvcm1hdCAodXN1YWxseSBWQV9SVF9GT1JNQVRfWVVWNDIwKS4KKyAgICB1bnNpZ25lZCBpbnQgICAgdmFfcnRfZm9ybWF0OworICAgIC8vIFJhdGUgY29udHJvbCBtb2RlLgorICAgIHVuc2lnbmVkIGludCAgICB2YV9yY19tb2RlOworICAgIC8vIFN1cHBvcnRlZCBwYWNrZWQgaGVhZGVycyAoaW5pdGlhbGx5IHRoZSBkZXNpcmVkIHNldCwgbW9kaWZpZWQKKyAgICAvLyBsYXRlciB0byB3aGF0IGlzIGFjdHVhbGx5IHN1cHBvcnRlZCkuCisgICAgdW5zaWduZWQgaW50ICAgIHZhX3BhY2tlZF9oZWFkZXJzOworCisgICAgLy8gVGhlIHJlcXVpcmVkIHNpemUgb2Ygc3VyZmFjZXMuICBUaGlzIGlzIHByb2JhYmx5IHRoZSBpbnB1dAorICAgIC8vIHNpemUgKEFWQ29kZWNDb250ZXh0LndpZHRofGhlaWdodCkgYWxpZ25lZCB1cCB0byB3aGF0ZXZlcgorICAgIC8vIGJsb2NrIHNpemUgaXMgcmVxdWlyZWQgYnkgdGhlIGNvZGVjLgorICAgIGludCAgICAgICAgICAgICBzdXJmYWNlX3dpZHRoOworICAgIGludCAgICAgICAgICAgICBzdXJmYWNlX2hlaWdodDsKKworICAgIC8vIEV2ZXJ5dGhpbmcgYWJvdmUgdGhpcyBwb2ludCBtdXN0IGJlIHNldCBiZWZvcmUgY2FsbGluZworICAgIC8vIGZmX3ZhYXBpX2VuY29kZV9pbml0KCkuCisKKyAgICAvLyBDb2RlYy1zcGVjaWZpYyBzdGF0ZS4KKyAgICB2b2lkICpwcml2X2RhdGE7CisKKyAgICAvLyBDb25maWd1cmF0aW9uIGF0dHJpYnV0ZXMgdG8gdXNlIHdoZW4gY3JlYXRpbmcgdmFfY29uZmlnLgorICAgIFZBQ29uZmlnQXR0cmliICBjb25maWdfYXR0cmlidXRlc1tNQVhfQ09ORklHX0FUVFJJQlVURVNdOworICAgIGludCAgICAgICAgICBuYl9jb25maWdfYXR0cmlidXRlczsKKworICAgIFZBQ29uZmlnSUQgICAgICB2YV9jb25maWc7CisgICAgVkFDb250ZXh0SUQgICAgIHZhX2NvbnRleHQ7CisKKyAgICBBVkJ1ZmZlclJlZiAgICAqZGV2aWNlX3JlZjsKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqZGV2aWNlOworICAgIEFWVkFBUElEZXZpY2VDb250ZXh0ICpod2N0eDsKKworICAgIC8vIFRoZSBoYXJkd2FyZSBmcmFtZSBjb250ZXh0IGNvbnRhaW5pbmcgdGhlIGlucHV0IGZyYW1lcy4KKyAgICBBVkJ1ZmZlclJlZiAgICAqaW5wdXRfZnJhbWVzX3JlZjsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqaW5wdXRfZnJhbWVzOworCisgICAgLy8gVGhlIGhhcmR3YXJlIGZyYW1lIGNvbnRleHQgY29udGFpbmluZyB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZXMuCisgICAgQVZCdWZmZXJSZWYgICAgKnJlY29uX2ZyYW1lc19yZWY7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKnJlY29uX2ZyYW1lczsKKworICAgIC8vIFBvb2wgb2YgKHJldXNhYmxlKSBiaXRzdHJlYW0gb3V0cHV0IGJ1ZmZlcnMuCisgICAgQVZCdWZmZXJQb29sICAgKm91dHB1dF9idWZmZXJfcG9vbDsKKworICAgIC8vIEdsb2JhbCBwYXJhbWV0ZXJzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICAgLy8gc2VxdWVuY2UgKGluY2x1ZGVzIHJhdGUgY29udHJvbCBwYXJhbWV0ZXJzIGJlbG93KS4KKyAgICBWQUVuY01pc2NQYXJhbWV0ZXJCdWZmZXIgKmdsb2JhbF9wYXJhbXNbTUFYX0dMT0JBTF9QQVJBTVNdOworICAgIHNpemVfdCAgICAgICAgICBnbG9iYWxfcGFyYW1zX3NpemVbTUFYX0dMT0JBTF9QQVJBTVNdOworICAgIGludCAgICAgICAgICBuYl9nbG9iYWxfcGFyYW1zOworCisgICAgLy8gUmF0ZSBjb250cm9sIHBhcmFtZXRlcnMuCisgICAgc3RydWN0IHsKKyAgICAgICAgVkFFbmNNaXNjUGFyYW1ldGVyQnVmZmVyIG1pc2M7CisgICAgICAgIFZBRW5jTWlzY1BhcmFtZXRlclJhdGVDb250cm9sIHJjOworICAgIH0gcmNfcGFyYW1zOworICAgIHN0cnVjdCB7CisgICAgICAgIFZBRW5jTWlzY1BhcmFtZXRlckJ1ZmZlciBtaXNjOworICAgICAgICBWQUVuY01pc2NQYXJhbWV0ZXJIUkQgaHJkOworICAgIH0gaHJkX3BhcmFtczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBWQUVuY01pc2NQYXJhbWV0ZXJCdWZmZXIgbWlzYzsKKyAgICAgICAgVkFFbmNNaXNjUGFyYW1ldGVyRnJhbWVSYXRlIGZyOworICAgIH0gZnJfcGFyYW1zOworI2lmIFZBX0NIRUNLX1ZFUlNJT04oMCwgMzYsIDApCisgICAgc3RydWN0IHsKKyAgICAgICAgVkFFbmNNaXNjUGFyYW1ldGVyQnVmZmVyIG1pc2M7CisgICAgICAgIFZBRW5jTWlzY1BhcmFtZXRlckJ1ZmZlclF1YWxpdHlMZXZlbCBxdWFsaXR5OworICAgIH0gcXVhbGl0eV9wYXJhbXM7CisjZW5kaWYKKworICAgIC8vIFBlci1zZXF1ZW5jZSBwYXJhbWV0ZXIgc3RydWN0dXJlIChWQUVuY1NlcXVlbmNlUGFyYW1ldGVyQnVmZmVyKikuCisgICAgdm9pZCAgICAgICAgICAgKmNvZGVjX3NlcXVlbmNlX3BhcmFtczsKKworICAgIC8vIFBlci1zZXF1ZW5jZSBwYXJhbWV0ZXJzIGZvdW5kIGluIHRoZSBwZXItcGljdHVyZSBwYXJhbWV0ZXIKKyAgICAvLyBzdHJ1Y3R1cmUgKFZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlciopLgorICAgIHZvaWQgICAgICAgICAgICpjb2RlY19waWN0dXJlX3BhcmFtczsKKworICAgIC8vIEN1cnJlbnQgZW5jb2Rpbmcgd2luZG93LCBpbiBkaXNwbGF5IChpbnB1dCkgb3JkZXIuCisgICAgVkFBUElFbmNvZGVQaWN0dXJlICpwaWNfc3RhcnQsICpwaWNfZW5kOworCisgICAgLy8gTmV4dCBpbnB1dCBvcmRlciBpbmRleCAoZGlzcGxheSBvcmRlcikuCisgICAgaW50NjRfdCAgICAgICAgIGlucHV0X29yZGVyOworICAgIC8vIE51bWJlciBvZiBmcmFtZXMgdGhhdCBvdXRwdXQgaXMgYmVoaW5kIGlucHV0LgorICAgIGludDY0X3QgICAgICAgICBvdXRwdXRfZGVsYXk7CisgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBkZWNvZGUgb3V0cHV0IHdpbGwgbmVlZCB0byBiZSBkZWxheWVkLgorICAgIGludDY0X3QgICAgICAgICBkZWNvZGVfZGVsYXk7CisgICAgLy8gTmV4dCBvdXRwdXQgb3JkZXIgaW5kZXggKGVuY29kZSBvcmRlcikuCisgICAgaW50NjRfdCAgICAgICAgIG91dHB1dF9vcmRlcjsKKworICAgIGVudW0geworICAgICAgICAvLyBBbGwgZW5jb2RlIG9wZXJhdGlvbnMgYXJlIGRvbmUgaW5kZXBlbmRlbnRseSAoc3luY2hyb25pc2UKKyAgICAgICAgLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgZXZlcnkgb3BlcmF0aW9uKS4KKyAgICAgICAgSVNTVUVfTU9ERV9TRVJJQUxJU0VfRVZFUllUSElORyA9IDAsCisgICAgICAgIC8vIE92ZXJsYXAgYXMgbWFueSBvcGVyYXRpb25zIGFzIHBvc3NpYmxlLgorICAgICAgICBJU1NVRV9NT0RFX01BWElNSVNFX1RIUk9VR0hQVVQsCisgICAgICAgIC8vIE92ZXJsYXAgb3BlcmF0aW9ucyBvbmx5IHdoZW4gc2F0aXNmeWluZyBwYXJhbGxlbCBkZXBlbmRlbmNpZXMuCisgICAgICAgIElTU1VFX01PREVfTUlOSU1JU0VfTEFURU5DWSwKKyAgICB9IGlzc3VlX21vZGU7CisKKyAgICAvLyBUaW1lc3RhbXAgaGFuZGxpbmcuCisgICAgaW50NjRfdCAgICAgICAgIGZpcnN0X3B0czsKKyAgICBpbnQ2NF90ICAgICAgICAgZHRzX3B0c19kaWZmOworICAgIGludDY0X3QgICAgICAgICB0c19yaW5nW01BWF9SRU9SREVSX0RFTEFZICogM107CisKKyAgICAvLyBGcmFtZSB0eXBlIGRlY2lzaW9uLgorICAgIGludCBwX3Blcl9pOworICAgIGludCBiX3Blcl9wOworICAgIGludCBmb3JjZV9pZHI7CisgICAgaW50IGdvcF9jb3VudGVyOworICAgIGludCBwX2NvdW50ZXI7CisgICAgaW50IGVuZF9vZl9zdHJlYW07CisKKyAgICAvLyBDb2RlYy1sb2NhbCBvcHRpb25zIGFyZSBhbGxvY2F0ZWQgdG8gZm9sbG93IHRoaXMgc3RydWN0dXJlIGluCisgICAgLy8gbWVtb3J5IChpbiB0aGUgQVZDb2RlYyBkZWZpbml0aW9uLCBzZXQgcHJpdl9kYXRhX3NpemUgdG8KKyAgICAvLyBzaXplb2YoVkFBUElFbmNvZGVDb250ZXh0KSArIHNpemVvZihWQUFQSUVuY29kZUZvb09wdGlvbnMpKS4KKyAgICB2b2lkICpjb2RlY19vcHRpb25zOworICAgIGNoYXIgY29kZWNfb3B0aW9uc19kYXRhWzBdOworfSBWQUFQSUVuY29kZUNvbnRleHQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElFbmNvZGVUeXBlIHsKKyAgICBzaXplX3QgcHJpdl9kYXRhX3NpemU7CisKKyAgICAvLyBQZXJmb3JtIGFueSBleHRyYSBjb2RlYy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGFmdGVyIHRoZQorICAgIC8vIGNvZGVjIGNvbnRleHQgaXMgaW5pdGlhbGlzZWQgKHNldCB1cCB0aGUgcHJpdmF0ZSBkYXRhIGFuZAorICAgIC8vIGFkZCBhbnkgbmVjZXNzYXJ5IGdsb2JhbCBwYXJhbWV0ZXJzKS4KKyAgICBpbnQgKCpjb25maWd1cmUpKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKyAgICAvLyBUaGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZXM6CisgICAgLy8gc2l6ZW9mKFZBRW5je3R5cGV9UGFyYW1ldGVyQnVmZmVye2NvZGVjfSkuCisgICAgc2l6ZV90IHNlcXVlbmNlX3BhcmFtc19zaXplOworICAgIHNpemVfdCBwaWN0dXJlX3BhcmFtc19zaXplOworICAgIHNpemVfdCBzbGljZV9wYXJhbXNfc2l6ZTsKKworICAgIC8vIEZpbGwgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmVzLgorICAgIGludCAgKCppbml0X3NlcXVlbmNlX3BhcmFtcykoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKKyAgICBpbnQgICAoKmluaXRfcGljdHVyZV9wYXJhbXMpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljKTsKKyAgICBpbnQgICAgICgqaW5pdF9zbGljZV9wYXJhbXMpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVTbGljZSAqc2xpY2UpOworCisgICAgLy8gVGhlIHR5cGUgdXNlZCBieSB0aGUgcGFja2VkIGhlYWRlcjogdGhpcyBzaG91bGQgbG9vayBsaWtlCisgICAgLy8gVkFFbmNQYWNrZWRIZWFkZXJ7c29tZXRoaW5nfS4KKyAgICBpbnQgc2VxdWVuY2VfaGVhZGVyX3R5cGU7CisgICAgaW50IHBpY3R1cmVfaGVhZGVyX3R5cGU7CisgICAgaW50IHNsaWNlX2hlYWRlcl90eXBlOworCisgICAgLy8gV3JpdGUgdGhlIHBhY2tlZCBoZWFkZXIgZGF0YSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICAgIC8vIFRoZSBzZXF1ZW5jZSBoZWFkZXIgaXMgYWxzbyB1c2VkIHRvIGZpbGwgdGhlIGNvZGVjIGV4dHJhZGF0YQorICAgIC8vIHdoZW4gdGhlIGVuY29kZXIgaXMgc3RhcnRpbmcuCisgICAgaW50ICgqd3JpdGVfc2VxdWVuY2VfaGVhZGVyKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKTsKKyAgICBpbnQgICgqd3JpdGVfcGljdHVyZV9oZWFkZXIpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbik7CisgICAgaW50ICAgICgqd3JpdGVfc2xpY2VfaGVhZGVyKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlU2xpY2UgKnNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbik7CisKKyAgICAvLyBGaWxsIGFuIGV4dHJhIHBhcmFtZXRlciBzdHJ1Y3R1cmUsIHdoaWNoIHdpbGwgdGhlbiBiZQorICAgIC8vIHBhc3NlZCB0byB2YVJlbmRlclBpY3R1cmUoKS4gIFdpbGwgYmUgY2FsbGVkIHJlcGVhdGVkbHkKKyAgICAvLyB3aXRoIGluY3JlYXNpbmcgaW5kZXggYXJndW1lbnQgdW50aWwgQVZFUlJPUl9FT0YgaXMKKyAgICAvLyByZXR1cm5lZC4KKyAgICBpbnQgICAgKCp3cml0ZV9leHRyYV9idWZmZXIpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKTsKKworICAgIC8vIFdyaXRlIGFuIGV4dHJhIHBhY2tlZCBoZWFkZXIuICBXaWxsIGJlIGNhbGxlZCByZXBlYXRlZGx5CisgICAgLy8gd2l0aCBpbmNyZWFzaW5nIGluZGV4IGFyZ3VtZW50IHVudGlsIEFWRVJST1JfRU9GIGlzCisgICAgLy8gcmV0dXJuZWQuCisgICAgaW50ICAgICgqd3JpdGVfZXh0cmFfaGVhZGVyKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbik7Cit9IFZBQVBJRW5jb2RlVHlwZTsKKworCitpbnQgZmZfdmFhcGlfZW5jb2RlMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICppbnB1dF9pbWFnZSwgaW50ICpnb3RfcGFja2V0KTsKKworaW50IGZmX3ZhYXBpX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitpbnQgZmZfdmFhcGlfZW5jb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZBQVBJX0VOQ09ERV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZhYXBpX2VuY29kZV9oMjY0LmMgYi9saWJhdmNvZGVjL3ZhYXBpX2VuY29kZV9oMjY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhZDIxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlX2gyNjQuYwpAQCAtMCwwICsxLDEwOTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8dmEvdmEuaD4KKyNpbmNsdWRlIDx2YS92YV9lbmNfaDI2NC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJjYnMuaCIKKyNpbmNsdWRlICJjYnNfaDI2NC5oIgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0X3NlaS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmFhcGlfZW5jb2RlLmgiCisKK2VudW0geworICAgIFNFSV9USU1JTkcgICAgICAgICA9IDB4MDEsCisgICAgU0VJX0lERU5USUZJRVIgICAgID0gMHgwMiwKKyAgICBTRUlfUkVDT1ZFUllfUE9JTlQgPSAweDA0LAorfTsKKworLy8gUmFuZG9tICh2ZXJzaW9uIDQpIElTTyAxMTU3OCBVVUlELgorc3RhdGljIGNvbnN0IHVpbnQ4X3QgdmFhcGlfZW5jb2RlX2gyNjRfc2VpX2lkZW50aWZpZXJfdXVpZFsxNl0gPSB7CisgICAgMHg1OSwgMHg5NCwgMHg4YiwgMHgyOCwgMHgxMSwgMHhlYywgMHg0NSwgMHhhZiwKKyAgICAweDk2LCAweDc1LCAweDE5LCAweGQ0LCAweDFmLCAweGVhLCAweGE5LCAweDRkLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElFbmNvZGVIMjY0Q29udGV4dCB7CisgICAgaW50IG1iX3dpZHRoOworICAgIGludCBtYl9oZWlnaHQ7CisKKyAgICBpbnQgZml4ZWRfcXBfaWRyOworICAgIGludCBmaXhlZF9xcF9wOworICAgIGludCBmaXhlZF9xcF9iOworCisgICAgSDI2NFJhd0FVRCBhdWQ7CisgICAgSDI2NFJhd1NQUyBzcHM7CisgICAgSDI2NFJhd1BQUyBwcHM7CisgICAgSDI2NFJhd1NFSSBzZWk7CisgICAgSDI2NFJhd1NsaWNlIHNsaWNlOworCisgICAgSDI2NFJhd1NFSUJ1ZmZlcmluZ1BlcmlvZCBidWZmZXJpbmdfcGVyaW9kOworICAgIEgyNjRSYXdTRUlQaWNUaW1pbmcgcGljX3RpbWluZzsKKyAgICBIMjY0UmF3U0VJUmVjb3ZlcnlQb2ludCByZWNvdmVyeV9wb2ludDsKKyAgICBIMjY0UmF3U0VJVXNlckRhdGFVbnJlZ2lzdGVyZWQgaWRlbnRpZmllcjsKKyAgICBjaGFyICppZGVudGlmaWVyX3N0cmluZzsKKworICAgIGludCBmcmFtZV9udW07CisgICAgaW50IHBpY19vcmRlcl9jbnQ7CisgICAgaW50IG5leHRfZnJhbWVfbnVtOworICAgIGludDY0X3QgbGFzdF9pZHJfZnJhbWU7CisgICAgaW50NjRfdCBpZHJfcGljX2NvdW50OworCisgICAgaW50IHByaW1hcnlfcGljX3R5cGU7CisgICAgaW50IHNsaWNlX3R5cGU7CisKKyAgICBpbnQgY3BiX2RlbGF5OworICAgIGludCBkcGJfZGVsYXk7CisKKyAgICBDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmNiYzsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50IGN1cnJlbnRfYWNjZXNzX3VuaXQ7CisgICAgaW50IGF1ZF9uZWVkZWQ7CisgICAgaW50IHNlaV9uZWVkZWQ7CisgICAgaW50IHNlaV9jYnJfd29ya2Fyb3VuZF9uZWVkZWQ7Cit9IFZBQVBJRW5jb2RlSDI2NENvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRW5jb2RlSDI2NE9wdGlvbnMgeworICAgIGludCBxcDsKKyAgICBpbnQgcXVhbGl0eTsKKyAgICBpbnQgbG93X3Bvd2VyOworICAgIC8vIEVudHJvcHkgZW5jb2RlciB0eXBlLgorICAgIGludCBjb2RlcjsKKyAgICBpbnQgYXVkOworICAgIGludCBzZWk7CisgICAgaW50IHByb2ZpbGU7CisgICAgaW50IGxldmVsOworfSBWQUFQSUVuY29kZUgyNjRPcHRpb25zOworCisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2gyNjRfd3JpdGVfYWNjZXNzX3VuaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICphdSkKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjRDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX2Nic193cml0ZV9mcmFnbWVudF9kYXRhKHByaXYtPmNiYywgYXUpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIHBhY2tlZCBoZWFkZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoKmRhdGFfbGVuIDwgOCAqIGF1LT5kYXRhX3NpemUgLSBhdS0+ZGF0YV9iaXRfcGFkZGluZykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkFjY2VzcyB1bml0IHRvbyBsYXJnZTogIgorICAgICAgICAgICAgICAgIiV6dSA8ICV6dS5cbiIsICpkYXRhX2xlbiwKKyAgICAgICAgICAgICAgIDggKiBhdS0+ZGF0YV9zaXplIC0gYXUtPmRhdGFfYml0X3BhZGRpbmcpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TUEMpOworICAgIH0KKworICAgIG1lbWNweShkYXRhLCBhdS0+ZGF0YSwgYXUtPmRhdGFfc2l6ZSk7CisgICAgKmRhdGFfbGVuID0gOCAqIGF1LT5kYXRhX3NpemUgLSBhdS0+ZGF0YV9iaXRfcGFkZGluZzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9oMjY0X2FkZF9uYWwoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5hbF91bml0KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NENvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBIMjY0UmF3TkFMVW5pdEhlYWRlciAqaGVhZGVyID0gbmFsX3VuaXQ7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX2Nic19pbnNlcnRfdW5pdF9jb250ZW50KHByaXYtPmNiYywgYXUsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlci0+bmFsX3VuaXRfdHlwZSwgbmFsX3VuaXQsIE5VTEwpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFkZCBOQUwgdW5pdDogIgorICAgICAgICAgICAgICAgInR5cGUgPSAlZC5cbiIsIGhlYWRlci0+bmFsX3VuaXRfdHlwZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2gyNjRfd3JpdGVfc2VxdWVuY2VfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRhdGEsIHNpemVfdCAqZGF0YV9sZW4pCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVIMjY0Q29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgICAqYXUgPSAmcHJpdi0+Y3VycmVudF9hY2Nlc3NfdW5pdDsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKHByaXYtPmF1ZF9uZWVkZWQpIHsKKyAgICAgICAgZXJyID0gdmFhcGlfZW5jb2RlX2gyNjRfYWRkX25hbChhdmN0eCwgYXUsICZwcml2LT5hdWQpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgcHJpdi0+YXVkX25lZWRlZCA9IDA7CisgICAgfQorCisgICAgZXJyID0gdmFhcGlfZW5jb2RlX2gyNjRfYWRkX25hbChhdmN0eCwgYXUsICZwcml2LT5zcHMpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfaDI2NF9hZGRfbmFsKGF2Y3R4LCBhdSwgJnByaXYtPnBwcyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IHZhYXBpX2VuY29kZV9oMjY0X3dyaXRlX2FjY2Vzc191bml0KGF2Y3R4LCBkYXRhLCBkYXRhX2xlbiwgYXUpOworZmFpbDoKKyAgICBmZl9jYnNfZnJhZ21lbnRfdW5pbml0KHByaXYtPmNiYywgYXUpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2gyNjRfd3JpdGVfc2xpY2VfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVTbGljZSAqc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NENvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICAgKmF1ID0gJnByaXYtPmN1cnJlbnRfYWNjZXNzX3VuaXQ7CisgICAgaW50IGVycjsKKworICAgIGlmIChwcml2LT5hdWRfbmVlZGVkKSB7CisgICAgICAgIGVyciA9IHZhYXBpX2VuY29kZV9oMjY0X2FkZF9uYWwoYXZjdHgsIGF1LCAmcHJpdi0+YXVkKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHByaXYtPmF1ZF9uZWVkZWQgPSAwOworICAgIH0KKworICAgIGVyciA9IHZhYXBpX2VuY29kZV9oMjY0X2FkZF9uYWwoYXZjdHgsIGF1LCAmcHJpdi0+c2xpY2UpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfaDI2NF93cml0ZV9hY2Nlc3NfdW5pdChhdmN0eCwgZGF0YSwgZGF0YV9sZW4sIGF1KTsKK2ZhaWw6CisgICAgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChwcml2LT5jYmMsIGF1KTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9oMjY0X3dyaXRlX2V4dHJhX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbikKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjRDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVIMjY0T3B0aW9ucyAgKm9wdCA9IGN0eC0+Y29kZWNfb3B0aW9uczsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICAgKmF1ID0gJnByaXYtPmN1cnJlbnRfYWNjZXNzX3VuaXQ7CisgICAgaW50IGVyciwgaTsKKworICAgIGlmIChwcml2LT5zZWlfbmVlZGVkKSB7CisgICAgICAgIGlmIChwcml2LT5hdWRfbmVlZGVkKSB7CisgICAgICAgICAgICBlcnIgPSB2YWFwaV9lbmNvZGVfaDI2NF9hZGRfbmFsKGF2Y3R4LCBhdSwgJnByaXYtPmF1ZCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBwcml2LT5hdWRfbmVlZGVkID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmcHJpdi0+c2VpLCAwLCBzaXplb2YocHJpdi0+c2VpKSk7CisgICAgICAgIHByaXYtPnNlaS5uYWxfdW5pdF9oZWFkZXIubmFsX3VuaXRfdHlwZSA9IEgyNjRfTkFMX1NFSTsKKworICAgICAgICBpID0gMDsKKyAgICAgICAgaWYgKHBpYy0+ZW5jb2RlX29yZGVyID09IDAgJiYgb3B0LT5zZWkgJiBTRUlfSURFTlRJRklFUikgeworICAgICAgICAgICAgcHJpdi0+c2VpLnBheWxvYWRbaV0ucGF5bG9hZF90eXBlID0gSDI2NF9TRUlfVFlQRV9VU0VSX0RBVEFfVU5SRUdJU1RFUkVEOworICAgICAgICAgICAgcHJpdi0+c2VpLnBheWxvYWRbaV0ucGF5bG9hZC51c2VyX2RhdGFfdW5yZWdpc3RlcmVkID0gcHJpdi0+aWRlbnRpZmllcjsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3B0LT5zZWkgJiBTRUlfVElNSU5HKSB7CisgICAgICAgICAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JRFIpIHsKKyAgICAgICAgICAgICAgICBwcml2LT5zZWkucGF5bG9hZFtpXS5wYXlsb2FkX3R5cGUgPSBIMjY0X1NFSV9UWVBFX0JVRkZFUklOR19QRVJJT0Q7CisgICAgICAgICAgICAgICAgcHJpdi0+c2VpLnBheWxvYWRbaV0ucGF5bG9hZC5idWZmZXJpbmdfcGVyaW9kID0gcHJpdi0+YnVmZmVyaW5nX3BlcmlvZDsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2LT5zZWkucGF5bG9hZFtpXS5wYXlsb2FkX3R5cGUgPSBIMjY0X1NFSV9UWVBFX1BJQ19USU1JTkc7CisgICAgICAgICAgICBwcml2LT5zZWkucGF5bG9hZFtpXS5wYXlsb2FkLnBpY190aW1pbmcgPSBwcml2LT5waWNfdGltaW5nOworICAgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgIGlmIChvcHQtPnNlaSAmIFNFSV9SRUNPVkVSWV9QT0lOVCAmJiBwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgICAgIHByaXYtPnNlaS5wYXlsb2FkW2ldLnBheWxvYWRfdHlwZSA9IEgyNjRfU0VJX1RZUEVfUkVDT1ZFUllfUE9JTlQ7CisgICAgICAgICAgICBwcml2LT5zZWkucGF5bG9hZFtpXS5wYXlsb2FkLnJlY292ZXJ5X3BvaW50ID0gcHJpdi0+cmVjb3ZlcnlfcG9pbnQ7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKworICAgICAgICBwcml2LT5zZWkucGF5bG9hZF9jb3VudCA9IGk7CisgICAgICAgIGF2X2Fzc2VydDAocHJpdi0+c2VpLnBheWxvYWRfY291bnQgPiAwKTsKKworICAgICAgICBlcnIgPSB2YWFwaV9lbmNvZGVfaDI2NF9hZGRfbmFsKGF2Y3R4LCBhdSwgJnByaXYtPnNlaSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBwcml2LT5zZWlfbmVlZGVkID0gMDsKKworICAgICAgICBlcnIgPSB2YWFwaV9lbmNvZGVfaDI2NF93cml0ZV9hY2Nlc3NfdW5pdChhdmN0eCwgZGF0YSwgZGF0YV9sZW4sIGF1KTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChwcml2LT5jYmMsIGF1KTsKKworICAgICAgICAqdHlwZSA9IFZBRW5jUGFja2VkSGVhZGVyUmF3RGF0YTsKKyAgICAgICAgcmV0dXJuIDA7CisKKyNpZiAhQ09ORklHX1ZBQVBJXzEKKyAgICB9IGVsc2UgaWYgKHByaXYtPnNlaV9jYnJfd29ya2Fyb3VuZF9uZWVkZWQpIHsKKyAgICAgICAgLy8gSW5zZXJ0IGEgemVyby1sZW5ndGggaGVhZGVyIHVzaW5nIHRoZSBvbGQgU0VJIHR5cGUuICBUaGlzIGlzCisgICAgICAgIC8vIHJlcXVpcmVkIHRvIGF2b2lkIHRyaWdnZXJpbmcgYnJva2VuIGJlaGF2aW91ciBvbiBJbnRlbCBwbGF0Zm9ybXMKKyAgICAgICAgLy8gaW4gQ0JSIG1vZGUgd2hlcmUgYW4gaW52YWxpZCBTRUkgbWVzc2FnZSBpcyBnZW5lcmF0ZWQgYnkgdGhlCisgICAgICAgIC8vIGRyaXZlciBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgc3RyZWFtLgorICAgICAgICAqZGF0YV9sZW4gPSAwOworICAgICAgICAqdHlwZSA9IFZBRW5jUGFja2VkSGVhZGVySDI2NF9TRUk7CisgICAgICAgIHByaXYtPnNlaV9jYnJfd29ya2Fyb3VuZF9uZWVkZWQgPSAwOworICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKworZmFpbDoKKyAgICBmZl9jYnNfZnJhZ21lbnRfdW5pbml0KHByaXYtPmNiYywgYXUpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2gyNjRfaW5pdF9zZXF1ZW5jZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgICAgICAgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjRDb250ZXh0ICAgICAgICAgICAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NE9wdGlvbnMgICAgICAgICAgICAqb3B0ID0gY3R4LT5jb2RlY19vcHRpb25zOworICAgIEgyNjRSYXdTUFMgICAgICAgICAgICAgICAgICAgICAgICAqc3BzID0gJnByaXYtPnNwczsKKyAgICBIMjY0UmF3UFBTICAgICAgICAgICAgICAgICAgICAgICAgKnBwcyA9ICZwcml2LT5wcHM7CisgICAgVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlckgyNjQgKnZzZXEgPSBjdHgtPmNvZGVjX3NlcXVlbmNlX3BhcmFtczsKKyAgICBWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0ICAqdnBpYyA9IGN0eC0+Y29kZWNfcGljdHVyZV9wYXJhbXM7CisKKyAgICBtZW1zZXQoJnByaXYtPmN1cnJlbnRfYWNjZXNzX3VuaXQsIDAsCisgICAgICAgICAgIHNpemVvZihwcml2LT5jdXJyZW50X2FjY2Vzc191bml0KSk7CisKKyAgICBtZW1zZXQoc3BzLCAwLCBzaXplb2YoKnNwcykpOworICAgIG1lbXNldChwcHMsIDAsIHNpemVvZigqcHBzKSk7CisKKyAgICBzcHMtPm5hbF91bml0X2hlYWRlci5uYWxfcmVmX2lkYyAgID0gMzsKKyAgICBzcHMtPm5hbF91bml0X2hlYWRlci5uYWxfdW5pdF90eXBlID0gSDI2NF9OQUxfU1BTOworCisgICAgc3BzLT5wcm9maWxlX2lkYyA9IGF2Y3R4LT5wcm9maWxlICYgMHhmZjsKKyAgICBzcHMtPmNvbnN0cmFpbnRfc2V0MV9mbGFnID0KKyAgICAgICAgISEoYXZjdHgtPnByb2ZpbGUgJiBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORUQpOworICAgIHNwcy0+Y29uc3RyYWludF9zZXQzX2ZsYWcgPQorICAgICAgICAhIShhdmN0eC0+cHJvZmlsZSAmIEZGX1BST0ZJTEVfSDI2NF9JTlRSQSk7CisKKyAgICBzcHMtPmxldmVsX2lkYyA9IGF2Y3R4LT5sZXZlbDsKKworICAgIHNwcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSAwOworICAgIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgICAgPSAxOworCisgICAgc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ID0gNDsKKyAgICBzcHMtPnBpY19vcmRlcl9jbnRfdHlwZSAgICAgICAgPSAwOworICAgIHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0KKyAgICAgICAgYXZfY2xpcChhdl9sb2cyKGN0eC0+Yl9wZXJfcCArIDEpIC0gMiwgMCwgMTIpOworCisgICAgc3BzLT5tYXhfbnVtX3JlZl9mcmFtZXMgPQorICAgICAgICAoYXZjdHgtPnByb2ZpbGUgJiBGRl9QUk9GSUxFX0gyNjRfSU5UUkEpID8gMCA6CisgICAgICAgIDEgKyAoY3R4LT5iX3Blcl9wID4gMCk7CisKKyAgICBzcHMtPnBpY193aWR0aF9pbl9tYnNfbWludXMxICAgICAgICA9IHByaXYtPm1iX3dpZHRoICAtIDE7CisgICAgc3BzLT5waWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEgPSBwcml2LT5tYl9oZWlnaHQgLSAxOworCisgICAgc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnID0gMTsKKyAgICBzcHMtPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgPSAxOworCisgICAgaWYgKGF2Y3R4LT53aWR0aCAgIT0gMTYgKiBwcml2LT5tYl93aWR0aCB8fAorICAgICAgICBhdmN0eC0+aGVpZ2h0ICE9IDE2ICogcHJpdi0+bWJfaGVpZ2h0KSB7CisgICAgICAgIHNwcy0+ZnJhbWVfY3JvcHBpbmdfZmxhZyA9IDE7CisKKyAgICAgICAgc3BzLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0ICAgPSAwOworICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfcmlnaHRfb2Zmc2V0ICA9CisgICAgICAgICAgICAoMTYgKiBwcml2LT5tYl93aWR0aCAtIGF2Y3R4LT53aWR0aCkgLyAyOworICAgICAgICBzcHMtPmZyYW1lX2Nyb3BfdG9wX29mZnNldCAgICA9IDA7CisgICAgICAgIHNwcy0+ZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0KKyAgICAgICAgICAgICgxNiAqIHByaXYtPm1iX2hlaWdodCAtIGF2Y3R4LT5oZWlnaHQpIC8gMjsKKyAgICB9IGVsc2UgeworICAgICAgICBzcHMtPmZyYW1lX2Nyb3BwaW5nX2ZsYWcgPSAwOworICAgIH0KKworICAgIHNwcy0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gMTsKKworICAgIGlmIChhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gIT0gMCAmJgorICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gIT0gMCkgeworICAgICAgICBzdGF0aWMgY29uc3QgQVZSYXRpb25hbCBzYXJfaWRjW10gPSB7CisgICAgICAgICAgICB7ICAgMCwgIDAgfSwKKyAgICAgICAgICAgIHsgICAxLCAgMSB9LCB7ICAxMiwgMTEgfSwgeyAgMTAsIDExIH0sIHsgIDE2LCAxMSB9LAorICAgICAgICAgICAgeyAgNDAsIDMzIH0sIHsgIDI0LCAxMSB9LCB7ICAyMCwgMTEgfSwgeyAgMzIsIDExIH0sCisgICAgICAgICAgICB7ICA4MCwgMzMgfSwgeyAgMTgsIDExIH0sIHsgIDE1LCAxMSB9LCB7ICA2NCwgMzMgfSwKKyAgICAgICAgICAgIHsgMTYwLCA5OSB9LCB7ICAgNCwgIDMgfSwgeyAgIDMsICAyIH0sIHsgICAyLCAgMSB9LAorICAgICAgICB9OworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNhcl9pZGMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPT0gc2FyX2lkY1tpXS5udW0gJiYKKyAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPT0gc2FyX2lkY1tpXS5kZW4pIHsKKyAgICAgICAgICAgICAgICBzcHMtPnZ1aS5hc3BlY3RfcmF0aW9faWRjID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaSA+PSBGRl9BUlJBWV9FTEVNUyhzYXJfaWRjKSkgeworICAgICAgICAgICAgc3BzLT52dWkuYXNwZWN0X3JhdGlvX2lkYyA9IDI1NTsKKyAgICAgICAgICAgIHNwcy0+dnVpLnNhcl93aWR0aCAgPSBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW07CisgICAgICAgICAgICBzcHMtPnZ1aS5zYXJfaGVpZ2h0ID0gYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuOworICAgICAgICB9CisgICAgICAgIHNwcy0+dnVpLmFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2xvcl9yYW5nZSAgICAgIT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyAhPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICAhPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgICAgICAhPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgc3BzLT52dWkudmlkZW9fc2lnbmFsX3R5cGVfcHJlc2VudF9mbGFnID0gMTsKKyAgICAgICAgc3BzLT52dWkudmlkZW9fZm9ybWF0ICAgICAgPSA1OyAvLyBVbnNwZWNpZmllZC4KKyAgICAgICAgc3BzLT52dWkudmlkZW9fZnVsbF9yYW5nZV9mbGFnID0KKyAgICAgICAgICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHOworCisgICAgICAgIGlmIChhdmN0eC0+Y29sb3JfcHJpbWFyaWVzICE9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB8fAorICAgICAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICAhPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlICAgICAgIT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICBzcHMtPnZ1aS5jb2xvdXJfZGVzY3JpcHRpb25fcHJlc2VudF9mbGFnID0gMTsKKyAgICAgICAgICAgIHNwcy0+dnVpLmNvbG91cl9wcmltYXJpZXMgICAgICAgICA9IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXM7CisgICAgICAgICAgICBzcHMtPnZ1aS50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPSBhdmN0eC0+Y29sb3JfdHJjOworICAgICAgICAgICAgc3BzLT52dWkubWF0cml4X2NvZWZmaWNpZW50cyAgICAgID0gYXZjdHgtPmNvbG9yc3BhY2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcHMtPnZ1aS52aWRlb19mb3JtYXQgICAgICAgICAgICAgPSA1OworICAgICAgICBzcHMtPnZ1aS52aWRlb19mdWxsX3JhbmdlX2ZsYWcgICAgPSAwOworICAgICAgICBzcHMtPnZ1aS5jb2xvdXJfcHJpbWFyaWVzICAgICAgICAgPSBhdmN0eC0+Y29sb3JfcHJpbWFyaWVzOworICAgICAgICBzcHMtPnZ1aS50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPSBhdmN0eC0+Y29sb3JfdHJjOworICAgICAgICBzcHMtPnZ1aS5tYXRyaXhfY29lZmZpY2llbnRzICAgICAgPSBhdmN0eC0+Y29sb3JzcGFjZTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gIT0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHNwcy0+dnVpLmNocm9tYV9sb2NfaW5mb19wcmVzZW50X2ZsYWcgPSAxOworICAgICAgICBzcHMtPnZ1aS5jaHJvbWFfc2FtcGxlX2xvY190eXBlX3RvcF9maWVsZCAgICA9CisgICAgICAgIHNwcy0+dnVpLmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkID0KKyAgICAgICAgICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uIC0gMTsKKyAgICB9CisKKyAgICBzcHMtPnZ1aS50aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgPSAxOworICAgIGlmIChhdmN0eC0+ZnJhbWVyYXRlLm51bSA+IDAgJiYgYXZjdHgtPmZyYW1lcmF0ZS5kZW4gPiAwKSB7CisgICAgICAgIHNwcy0+dnVpLm51bV91bml0c19pbl90aWNrID0gYXZjdHgtPmZyYW1lcmF0ZS5kZW47CisgICAgICAgIHNwcy0+dnVpLnRpbWVfc2NhbGUgICAgICAgID0gMiAqIGF2Y3R4LT5mcmFtZXJhdGUubnVtOworICAgICAgICBzcHMtPnZ1aS5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwcy0+dnVpLm51bV91bml0c19pbl90aWNrID0gYXZjdHgtPnRpbWVfYmFzZS5udW07CisgICAgICAgIHNwcy0+dnVpLnRpbWVfc2NhbGUgICAgICAgID0gMiAqIGF2Y3R4LT50aW1lX2Jhc2UuZGVuOworICAgICAgICBzcHMtPnZ1aS5maXhlZF9mcmFtZV9yYXRlX2ZsYWcgPSAwOworICAgIH0KKworICAgIGlmIChvcHQtPnNlaSAmIFNFSV9USU1JTkcpIHsKKyAgICAgICAgSDI2NFJhd0hSRCAqaHJkID0gJnNwcy0+dnVpLm5hbF9ocmRfcGFyYW1ldGVyczsKKworICAgICAgICBzcHMtPnZ1aS5uYWxfaHJkX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gMTsKKworICAgICAgICBocmQtPmNwYl9jbnRfbWludXMxID0gMDsKKworICAgICAgICAvLyBUcnkgdG8gc2NhbGUgdGhlc2UgdG8gYSBzZW5zaWJsZSByYW5nZSBzbyB0aGF0IHRoZQorICAgICAgICAvLyBnb2xvbWIgZW5jb2RlIG9mIHRoZSB2YWx1ZSBpcyBub3Qgb3ZlcmxvbmcuCisgICAgICAgIGhyZC0+Yml0X3JhdGVfc2NhbGUgPQorICAgICAgICAgICAgYXZfY2xpcF91aW50cDIoYXZfbG9nMihhdmN0eC0+Yml0X3JhdGUpIC0gMTUgLSA2LCA0KTsKKyAgICAgICAgaHJkLT5iaXRfcmF0ZV92YWx1ZV9taW51czFbMF0gPQorICAgICAgICAgICAgKGF2Y3R4LT5iaXRfcmF0ZSA+PiBocmQtPmJpdF9yYXRlX3NjYWxlICsgNikgLSAxOworCisgICAgICAgIGhyZC0+Y3BiX3NpemVfc2NhbGUgPQorICAgICAgICAgICAgYXZfY2xpcF91aW50cDIoYXZfbG9nMihjdHgtPmhyZF9wYXJhbXMuaHJkLmJ1ZmZlcl9zaXplKSAtIDE1IC0gNCwgNCk7CisgICAgICAgIGhyZC0+Y3BiX3NpemVfdmFsdWVfbWludXMxWzBdID0KKyAgICAgICAgICAgIChjdHgtPmhyZF9wYXJhbXMuaHJkLmJ1ZmZlcl9zaXplID4+IGhyZC0+Y3BiX3NpemVfc2NhbGUgKyA0KSAtIDE7CisKKyAgICAgICAgLy8gQ0JSIG1vZGUgYXMgZGVmaW5lZCBmb3IgdGhlIEhSRCBjYW5ub3QgYmUgYWNoaWV2ZWQgd2l0aG91dCBmaWxsZXIKKyAgICAgICAgLy8gZGF0YSwgc28gdGhpcyBmbGFnIGNhbm5vdCBiZSBzZXQgZXZlbiB3aXRoIFZBQVBJIENCUiBtb2Rlcy4KKyAgICAgICAgaHJkLT5jYnJfZmxhZ1swXSA9IDA7CisKKyAgICAgICAgaHJkLT5pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X2xlbmd0aF9taW51czEgPSAyMzsKKyAgICAgICAgaHJkLT5jcGJfcmVtb3ZhbF9kZWxheV9sZW5ndGhfbWludXMxICAgICAgICAgPSAyMzsKKyAgICAgICAgaHJkLT5kcGJfb3V0cHV0X2RlbGF5X2xlbmd0aF9taW51czEgICAgICAgICAgPSA3OworICAgICAgICBocmQtPnRpbWVfb2Zmc2V0X2xlbmd0aCAgICAgICAgICAgICAgICAgICAgICA9IDA7CisKKyAgICAgICAgcHJpdi0+YnVmZmVyaW5nX3BlcmlvZC5zZXFfcGFyYW1ldGVyX3NldF9pZCA9IHNwcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICAgICAgLy8gVGhpcyBjYWxjdWxhdGlvbiBjYW4gZWFzaWx5IG92ZXJmbG93IDMyIGJpdHMuCisgICAgICAgIHByaXYtPmJ1ZmZlcmluZ19wZXJpb2QubmFsLmluaXRpYWxfY3BiX3JlbW92YWxfZGVsYXlbMF0gPSA5MDAwMCAqCisgICAgICAgICAgICAodWludDY0X3QpY3R4LT5ocmRfcGFyYW1zLmhyZC5pbml0aWFsX2J1ZmZlcl9mdWxsbmVzcyAvCisgICAgICAgICAgICBjdHgtPmhyZF9wYXJhbXMuaHJkLmJ1ZmZlcl9zaXplOworICAgICAgICBwcml2LT5idWZmZXJpbmdfcGVyaW9kLm5hbC5pbml0aWFsX2NwYl9yZW1vdmFsX2RlbGF5X29mZnNldFswXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3BzLT52dWkubmFsX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IDA7CisgICAgICAgIHNwcy0+dnVpLmxvd19kZWxheV9ocmRfZmxhZyA9IDEgLSBzcHMtPnZ1aS5maXhlZF9mcmFtZV9yYXRlX2ZsYWc7CisgICAgfQorCisgICAgc3BzLT52dWkuYml0c3RyZWFtX3Jlc3RyaWN0aW9uX2ZsYWcgICAgPSAxOworICAgIHNwcy0+dnVpLm1vdGlvbl92ZWN0b3JzX292ZXJfcGljX2JvdW5kYXJpZXNfZmxhZyA9IDE7CisgICAgc3BzLT52dWkubG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWwgPSAxNjsKKyAgICBzcHMtPnZ1aS5sb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwgICA9IDE2OworICAgIHNwcy0+dnVpLm1heF9udW1fcmVvcmRlcl9mcmFtZXMgICAgICAgID0gKGN0eC0+Yl9wZXJfcCA+IDApOworICAgIHNwcy0+dnVpLm1heF9kZWNfZnJhbWVfYnVmZmVyaW5nICAgICAgID0gc3BzLT5tYXhfbnVtX3JlZl9mcmFtZXM7CisKKyAgICBwcHMtPm5hbF91bml0X2hlYWRlci5uYWxfcmVmX2lkYyA9IDM7CisgICAgcHBzLT5uYWxfdW5pdF9oZWFkZXIubmFsX3VuaXRfdHlwZSA9IEgyNjRfTkFMX1BQUzsKKworICAgIHBwcy0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSAwOworICAgIHBwcy0+c2VxX3BhcmFtZXRlcl9zZXRfaWQgPSAwOworCisgICAgcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPQorICAgICAgICAhKHNwcy0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FIHx8CisgICAgICAgICAgc3BzLT5wcm9maWxlX2lkYyA9PSBGRl9QUk9GSUxFX0gyNjRfRVhURU5ERUQgfHwKKyAgICAgICAgICBzcHMtPnByb2ZpbGVfaWRjID09IEZGX1BST0ZJTEVfSDI2NF9DQVZMQ180NDQpOworICAgIGlmICghb3B0LT5jb2RlciAmJiBwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZykKKyAgICAgICAgcHBzLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgPSAwOworCisgICAgcHBzLT5udW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZV9taW51czEgPSAwOworICAgIHBwcy0+bnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxID0gMDsKKworICAgIHBwcy0+cGljX2luaXRfcXBfbWludXMyNiA9IHByaXYtPmZpeGVkX3FwX2lkciAtIDI2OworCisgICAgaWYgKHNwcy0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IMjY0X0JBU0VMSU5FIHx8CisgICAgICAgIHNwcy0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IMjY0X0VYVEVOREVEIHx8CisgICAgICAgIHNwcy0+cHJvZmlsZV9pZGMgPT0gRkZfUFJPRklMRV9IMjY0X01BSU4pIHsKKyAgICAgICAgcHBzLT5tb3JlX3Jic3BfZGF0YSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHBzLT5tb3JlX3Jic3BfZGF0YSA9IDE7CisKKyAgICAgICAgcHBzLT50cmFuc2Zvcm1fOHg4X21vZGVfZmxhZyA9IDE7CisgICAgfQorCisgICAgKnZzZXEgPSAoVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlckgyNjQpIHsKKyAgICAgICAgLnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gc3BzLT5zZXFfcGFyYW1ldGVyX3NldF9pZCwKKyAgICAgICAgLmxldmVsX2lkYyAgICAgICAgPSBzcHMtPmxldmVsX2lkYywKKyAgICAgICAgLmludHJhX3BlcmlvZCAgICAgPSBhdmN0eC0+Z29wX3NpemUsCisgICAgICAgIC5pbnRyYV9pZHJfcGVyaW9kID0gYXZjdHgtPmdvcF9zaXplLAorICAgICAgICAuaXBfcGVyaW9kICAgICAgICA9IGN0eC0+Yl9wZXJfcCArIDEsCisKKyAgICAgICAgLmJpdHNfcGVyX3NlY29uZCAgICAgICA9IGF2Y3R4LT5iaXRfcmF0ZSwKKyAgICAgICAgLm1heF9udW1fcmVmX2ZyYW1lcyAgICA9IHNwcy0+bWF4X251bV9yZWZfZnJhbWVzLAorICAgICAgICAucGljdHVyZV93aWR0aF9pbl9tYnMgID0gc3BzLT5waWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDEsCisgICAgICAgIC5waWN0dXJlX2hlaWdodF9pbl9tYnMgPSBzcHMtPnBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMSArIDEsCisKKyAgICAgICAgLnNlcV9maWVsZHMuYml0cyA9IHsKKyAgICAgICAgICAgIC5jaHJvbWFfZm9ybWF0X2lkYyAgICAgICAgICAgICAgICAgPSBzcHMtPmNocm9tYV9mb3JtYXRfaWRjLAorICAgICAgICAgICAgLmZyYW1lX21ic19vbmx5X2ZsYWcgICAgICAgICAgICAgICA9IHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZywKKyAgICAgICAgICAgIC5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnICAgICAgPSBzcHMtPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcsCisgICAgICAgICAgICAuc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZyAgID0gc3BzLT5zZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgICAgICAgICA9IHNwcy0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZywKKyAgICAgICAgICAgIC5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICAgICAgICAgPSBzcHMtPmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQsCisgICAgICAgICAgICAucGljX29yZGVyX2NudF90eXBlICAgICAgICAgICAgICAgID0gc3BzLT5waWNfb3JkZXJfY250X3R5cGUsCisgICAgICAgICAgICAubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0gc3BzLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQsCisgICAgICAgICAgICAuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgID0gc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZywKKyAgICAgICAgfSwKKworICAgICAgICAuYml0X2RlcHRoX2x1bWFfbWludXM4ICAgPSBzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCwKKyAgICAgICAgLmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ID0gc3BzLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCwKKworICAgICAgICAuZnJhbWVfY3JvcHBpbmdfZmxhZyAgICAgID0gc3BzLT5mcmFtZV9jcm9wcGluZ19mbGFnLAorICAgICAgICAuZnJhbWVfY3JvcF9sZWZ0X29mZnNldCAgID0gc3BzLT5mcmFtZV9jcm9wX2xlZnRfb2Zmc2V0LAorICAgICAgICAuZnJhbWVfY3JvcF9yaWdodF9vZmZzZXQgID0gc3BzLT5mcmFtZV9jcm9wX3JpZ2h0X29mZnNldCwKKyAgICAgICAgLmZyYW1lX2Nyb3BfdG9wX29mZnNldCAgICA9IHNwcy0+ZnJhbWVfY3JvcF90b3Bfb2Zmc2V0LAorICAgICAgICAuZnJhbWVfY3JvcF9ib3R0b21fb2Zmc2V0ID0gc3BzLT5mcmFtZV9jcm9wX2JvdHRvbV9vZmZzZXQsCisKKyAgICAgICAgLnZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyA9IHNwcy0+dnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnLAorCisgICAgICAgIC52dWlfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAuYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnID0gc3BzLT52dWkuYXNwZWN0X3JhdGlvX2luZm9fcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyAgICAgICA9IHNwcy0+dnVpLnRpbWluZ19pbmZvX3ByZXNlbnRfZmxhZywKKyAgICAgICAgICAgIC5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAgICAgPSBzcHMtPnZ1aS5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZywKKyAgICAgICAgICAgIC5sb2cyX21heF9tdl9sZW5ndGhfaG9yaXpvbnRhbCAgPSBzcHMtPnZ1aS5sb2cyX21heF9tdl9sZW5ndGhfaG9yaXpvbnRhbCwKKyAgICAgICAgICAgIC5sb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwgICAgPSBzcHMtPnZ1aS5sb2cyX21heF9tdl9sZW5ndGhfdmVydGljYWwsCisgICAgICAgIH0sCisKKyAgICAgICAgLmFzcGVjdF9yYXRpb19pZGMgID0gc3BzLT52dWkuYXNwZWN0X3JhdGlvX2lkYywKKyAgICAgICAgLnNhcl93aWR0aCAgICAgICAgID0gc3BzLT52dWkuc2FyX3dpZHRoLAorICAgICAgICAuc2FyX2hlaWdodCAgICAgICAgPSBzcHMtPnZ1aS5zYXJfaGVpZ2h0LAorICAgICAgICAubnVtX3VuaXRzX2luX3RpY2sgPSBzcHMtPnZ1aS5udW1fdW5pdHNfaW5fdGljaywKKyAgICAgICAgLnRpbWVfc2NhbGUgICAgICAgID0gc3BzLT52dWkudGltZV9zY2FsZSwKKyAgICB9OworCisgICAgKnZwaWMgPSAoVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVySDI2NCkgeworICAgICAgICAuQ3VyclBpYyA9IHsKKyAgICAgICAgICAgIC5waWN0dXJlX2lkID0gVkFfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIC5mbGFncyAgICAgID0gVkFfUElDVFVSRV9IMjY0X0lOVkFMSUQsCisgICAgICAgIH0sCisKKyAgICAgICAgLmNvZGVkX2J1ZiA9IFZBX0lOVkFMSURfSUQsCisKKyAgICAgICAgLnBpY19wYXJhbWV0ZXJfc2V0X2lkID0gcHBzLT5waWNfcGFyYW1ldGVyX3NldF9pZCwKKyAgICAgICAgLnNlcV9wYXJhbWV0ZXJfc2V0X2lkID0gcHBzLT5zZXFfcGFyYW1ldGVyX3NldF9pZCwKKworICAgICAgICAucGljX2luaXRfcXAgICAgICAgICAgICAgICAgICA9IHBwcy0+cGljX2luaXRfcXBfbWludXMyNiArIDI2LAorICAgICAgICAubnVtX3JlZl9pZHhfbDBfYWN0aXZlX21pbnVzMSA9IHBwcy0+bnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxLAorICAgICAgICAubnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSA9IHBwcy0+bnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxLAorCisgICAgICAgIC5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ICAgICAgICA9IHBwcy0+Y2hyb21hX3FwX2luZGV4X29mZnNldCwKKyAgICAgICAgLnNlY29uZF9jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ID0gcHBzLT5zZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCwKKworICAgICAgICAucGljX2ZpZWxkcy5iaXRzID0geworICAgICAgICAgICAgLmVudHJvcHlfY29kaW5nX21vZGVfZmxhZyAgICAgICAgPSBwcHMtPmVudHJvcHlfY29kaW5nX21vZGVfZmxhZywKKyAgICAgICAgICAgIC53ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcsCisgICAgICAgICAgICAud2VpZ2h0ZWRfYmlwcmVkX2lkYyAgICAgICAgICAgICA9IHBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2lkYywKKyAgICAgICAgICAgIC5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgICAgID0gcHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcsCisgICAgICAgICAgICAudHJhbnNmb3JtXzh4OF9tb2RlX2ZsYWcgICAgICAgICA9IHBwcy0+dHJhbnNmb3JtXzh4OF9tb2RlX2ZsYWcsCisgICAgICAgICAgICAuZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPQorICAgICAgICAgICAgICAgIHBwcy0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcsCisgICAgICAgICAgICAucmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnICA9IHBwcy0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgICAgICAgICAgPQorICAgICAgICAgICAgICAgIHBwcy0+Ym90dG9tX2ZpZWxkX3BpY19vcmRlcl9pbl9mcmFtZV9wcmVzZW50X2ZsYWcsCisgICAgICAgICAgICAucGljX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZyA9IHBwcy0+cGljX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZywKKyAgICAgICAgfSwKKyAgICB9OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2gyNjRfaW5pdF9waWN0dXJlX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpwaWMpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVIMjY0Q29udGV4dCAgICAgICAgICAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NE9wdGlvbnMgICAgICAgICAgICpvcHQgPSBjdHgtPmNvZGVjX29wdGlvbnM7CisgICAgSDI2NFJhd1NQUyAgICAgICAgICAgICAgICAgICAgICAgKnNwcyA9ICZwcml2LT5zcHM7CisgICAgVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVySDI2NCAqdnBpYyA9IHBpYy0+Y29kZWNfcGljdHVyZV9wYXJhbXM7CisgICAgaW50IGk7CisKKyAgICBtZW1zZXQoJnByaXYtPmN1cnJlbnRfYWNjZXNzX3VuaXQsIDAsCisgICAgICAgICAgIHNpemVvZihwcml2LT5jdXJyZW50X2FjY2Vzc191bml0KSk7CisKKyAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JRFIpIHsKKyAgICAgICAgYXZfYXNzZXJ0MChwaWMtPmRpc3BsYXlfb3JkZXIgPT0gcGljLT5lbmNvZGVfb3JkZXIpOworICAgICAgICBwcml2LT5mcmFtZV9udW0gICAgICA9IDA7CisgICAgICAgIHByaXYtPm5leHRfZnJhbWVfbnVtID0gMTsKKyAgICAgICAgcHJpdi0+Y3BiX2RlbGF5ICAgICAgPSAwOworICAgICAgICBwcml2LT5sYXN0X2lkcl9mcmFtZSA9IHBpYy0+ZGlzcGxheV9vcmRlcjsKKyAgICAgICAgKytwcml2LT5pZHJfcGljX2NvdW50OworCisgICAgICAgIHByaXYtPnNsaWNlX3R5cGUgICAgICAgPSA3OworICAgICAgICBwcml2LT5wcmltYXJ5X3BpY190eXBlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcml2LT5mcmFtZV9udW0gICAgICA9IHByaXYtPm5leHRfZnJhbWVfbnVtOworCisgICAgICAgIGlmIChwaWMtPnR5cGUgIT0gUElDVFVSRV9UWVBFX0IpIHsKKyAgICAgICAgICAgIC8vIFJlZmVyZW5jZSBwaWN0dXJlLCBzbyBmcmFtZV9udW0gYWR2YW5jZXMuCisgICAgICAgICAgICBwcml2LT5uZXh0X2ZyYW1lX251bSA9IChwcml2LT5mcmFtZV9udW0gKyAxKSAmCisgICAgICAgICAgICAgICAgKCgxIDw8ICg0ICsgc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0KSkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICArK3ByaXYtPmNwYl9kZWxheTsKKworICAgICAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICBwcml2LT5zbGljZV90eXBlICAgICAgID0gNzsKKyAgICAgICAgICAgIHByaXYtPnByaW1hcnlfcGljX3R5cGUgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfUCkgeworICAgICAgICAgICAgcHJpdi0+c2xpY2VfdHlwZSAgICAgICA9IDU7CisgICAgICAgICAgICBwcml2LT5wcmltYXJ5X3BpY190eXBlID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaXYtPnNsaWNlX3R5cGUgICAgICAgPSA2OworICAgICAgICAgICAgcHJpdi0+cHJpbWFyeV9waWNfdHlwZSA9IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpdi0+cGljX29yZGVyX2NudCA9IHBpYy0+ZGlzcGxheV9vcmRlciAtIHByaXYtPmxhc3RfaWRyX2ZyYW1lOworICAgIHByaXYtPmRwYl9kZWxheSAgICAgPSBwaWMtPmRpc3BsYXlfb3JkZXIgLSBwaWMtPmVuY29kZV9vcmRlciArIDE7CisKKyAgICBpZiAob3B0LT5hdWQpIHsKKyAgICAgICAgcHJpdi0+YXVkX25lZWRlZCA9IDE7CisgICAgICAgIHByaXYtPmF1ZC5uYWxfdW5pdF9oZWFkZXIubmFsX3VuaXRfdHlwZSA9IEgyNjRfTkFMX0FVRDsKKyAgICAgICAgcHJpdi0+YXVkLnByaW1hcnlfcGljX3R5cGUgPSBwcml2LT5wcmltYXJ5X3BpY190eXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaXYtPmF1ZF9uZWVkZWQgPSAwOworICAgIH0KKworICAgIGlmIChvcHQtPnNlaSAmIFNFSV9JREVOVElGSUVSICYmIHBpYy0+ZW5jb2RlX29yZGVyID09IDApCisgICAgICAgIHByaXYtPnNlaV9uZWVkZWQgPSAxOworI2lmICFDT05GSUdfVkFBUElfMQorICAgIGlmIChjdHgtPnZhX3JjX21vZGUgPT0gVkFfUkNfQ0JSKQorICAgICAgICBwcml2LT5zZWlfY2JyX3dvcmthcm91bmRfbmVlZGVkID0gMTsKKyNlbmRpZgorCisgICAgaWYgKG9wdC0+c2VpICYgU0VJX1RJTUlORykgeworICAgICAgICBtZW1zZXQoJnByaXYtPnBpY190aW1pbmcsIDAsIHNpemVvZihwcml2LT5waWNfdGltaW5nKSk7CisKKyAgICAgICAgcHJpdi0+cGljX3RpbWluZy5jcGJfcmVtb3ZhbF9kZWxheSA9IDIgKiBwcml2LT5jcGJfZGVsYXk7CisgICAgICAgIHByaXYtPnBpY190aW1pbmcuZHBiX291dHB1dF9kZWxheSAgPSAyICogcHJpdi0+ZHBiX2RlbGF5OworCisgICAgICAgIHByaXYtPnNlaV9uZWVkZWQgPSAxOworICAgIH0KKworICAgIGlmIChvcHQtPnNlaSAmIFNFSV9SRUNPVkVSWV9QT0lOVCAmJiBwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgcHJpdi0+cmVjb3ZlcnlfcG9pbnQucmVjb3ZlcnlfZnJhbWVfY250ID0gMDsKKyAgICAgICAgcHJpdi0+cmVjb3ZlcnlfcG9pbnQuZXhhY3RfbWF0Y2hfZmxhZyAgID0gMTsKKyAgICAgICAgcHJpdi0+cmVjb3ZlcnlfcG9pbnQuYnJva2VuX2xpbmtfZmxhZyAgID0gY3R4LT5iX3Blcl9wID4gMDsKKworICAgICAgICBwcml2LT5zZWlfbmVlZGVkID0gMTsKKyAgICB9CisKKyAgICB2cGljLT5DdXJyUGljID0gKFZBUGljdHVyZUgyNjQpIHsKKyAgICAgICAgLnBpY3R1cmVfaWQgICAgICAgICAgPSBwaWMtPnJlY29uX3N1cmZhY2UsCisgICAgICAgIC5mcmFtZV9pZHggICAgICAgICAgID0gcHJpdi0+ZnJhbWVfbnVtLAorICAgICAgICAuZmxhZ3MgICAgICAgICAgICAgICA9IDAsCisgICAgICAgIC5Ub3BGaWVsZE9yZGVyQ250ICAgID0gcHJpdi0+cGljX29yZGVyX2NudCwKKyAgICAgICAgLkJvdHRvbUZpZWxkT3JkZXJDbnQgPSBwcml2LT5waWNfb3JkZXJfY250LAorICAgIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGljLT5uYl9yZWZzOyBpKyspIHsKKyAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpyZWYgPSBwaWMtPnJlZnNbaV07CisgICAgICAgIHVuc2lnbmVkIGludCBmcmFtZV9udW0gPSAocmVmLT5lbmNvZGVfb3JkZXIgLSBwcml2LT5sYXN0X2lkcl9mcmFtZSkgJgorICAgICAgICAgICAgKCgxIDw8ICg0ICsgc3BzLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0KSkgLSAxKTsKKyAgICAgICAgdW5zaWduZWQgaW50IHBpY19vcmRlcl9jbnQgPSByZWYtPmRpc3BsYXlfb3JkZXIgLSBwcml2LT5sYXN0X2lkcl9mcmFtZTsKKworICAgICAgICBhdl9hc3NlcnQwKHJlZiAmJiByZWYtPmVuY29kZV9vcmRlciA8IHBpYy0+ZW5jb2RlX29yZGVyKTsKKyAgICAgICAgdnBpYy0+UmVmZXJlbmNlRnJhbWVzW2ldID0gKFZBUGljdHVyZUgyNjQpIHsKKyAgICAgICAgICAgIC5waWN0dXJlX2lkICAgICAgICAgID0gcmVmLT5yZWNvbl9zdXJmYWNlLAorICAgICAgICAgICAgLmZyYW1lX2lkeCAgICAgICAgICAgPSBmcmFtZV9udW0sCisgICAgICAgICAgICAuZmxhZ3MgICAgICAgICAgICAgICA9IFZBX1BJQ1RVUkVfSDI2NF9TSE9SVF9URVJNX1JFRkVSRU5DRSwKKyAgICAgICAgICAgIC5Ub3BGaWVsZE9yZGVyQ250ICAgID0gcGljX29yZGVyX2NudCwKKyAgICAgICAgICAgIC5Cb3R0b21GaWVsZE9yZGVyQ250ID0gcGljX29yZGVyX2NudCwKKyAgICAgICAgfTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBGRl9BUlJBWV9FTEVNUyh2cGljLT5SZWZlcmVuY2VGcmFtZXMpOyBpKyspIHsKKyAgICAgICAgdnBpYy0+UmVmZXJlbmNlRnJhbWVzW2ldID0gKFZBUGljdHVyZUgyNjQpIHsKKyAgICAgICAgICAgIC5waWN0dXJlX2lkID0gVkFfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIC5mbGFncyAgICAgID0gVkFfUElDVFVSRV9IMjY0X0lOVkFMSUQsCisgICAgICAgIH07CisgICAgfQorCisgICAgdnBpYy0+Y29kZWRfYnVmID0gcGljLT5vdXRwdXRfYnVmZmVyOworCisgICAgdnBpYy0+ZnJhbWVfbnVtID0gcHJpdi0+ZnJhbWVfbnVtOworCisgICAgdnBpYy0+cGljX2ZpZWxkcy5iaXRzLmlkcl9waWNfZmxhZyAgICAgICA9IChwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0lEUik7CisgICAgdnBpYy0+cGljX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9waWNfZmxhZyA9IChwaWMtPnR5cGUgIT0gUElDVFVSRV9UWVBFX0IpOworCisgICAgcGljLT5uYl9zbGljZXMgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2gyNjRfaW5pdF9zbGljZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVTbGljZSAqc2xpY2UpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVIMjY0Q29udGV4dCAgICAgICAgICAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIEgyNjRSYXdTUFMgICAgICAgICAgICAgICAgICAgICAgICpzcHMgPSAmcHJpdi0+c3BzOworICAgIEgyNjRSYXdQUFMgICAgICAgICAgICAgICAgICAgICAgICpwcHMgPSAmcHJpdi0+cHBzOworICAgIEgyNjRSYXdTbGljZUhlYWRlciAgICAgICAgICAgICAgICAqc2ggPSAmcHJpdi0+c2xpY2UuaGVhZGVyOworICAgIFZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQgKnZwaWMgPSBwaWMtPmNvZGVjX3BpY3R1cmVfcGFyYW1zOworICAgIFZBRW5jU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0ICp2c2xpY2UgPSBzbGljZS0+Y29kZWNfc2xpY2VfcGFyYW1zOworICAgIGludCBpOworCisgICAgaWYgKHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfSURSKSB7CisgICAgICAgIHNoLT5uYWxfdW5pdF9oZWFkZXIubmFsX3VuaXRfdHlwZSA9IEgyNjRfTkFMX0lEUl9TTElDRTsKKyAgICAgICAgc2gtPm5hbF91bml0X2hlYWRlci5uYWxfcmVmX2lkYyAgID0gMzsKKyAgICB9IGVsc2UgeworICAgICAgICBzaC0+bmFsX3VuaXRfaGVhZGVyLm5hbF91bml0X3R5cGUgPSBIMjY0X05BTF9TTElDRTsKKyAgICAgICAgc2gtPm5hbF91bml0X2hlYWRlci5uYWxfcmVmX2lkYyAgID0gcGljLT50eXBlICE9IFBJQ1RVUkVfVFlQRV9COworICAgIH0KKworICAgIC8vIE9ubHkgb25lIHNsaWNlIHBlciBmcmFtZS4KKyAgICBzaC0+Zmlyc3RfbWJfaW5fc2xpY2UgPSAwOworICAgIHNoLT5zbGljZV90eXBlICAgICAgICA9IHByaXYtPnNsaWNlX3R5cGU7CisKKyAgICBzaC0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSBwcHMtPnBpY19wYXJhbWV0ZXJfc2V0X2lkOworCisgICAgc2gtPmZyYW1lX251bSAgPSBwcml2LT5mcmFtZV9udW07CisgICAgc2gtPmlkcl9waWNfaWQgPSBwcml2LT5pZHJfcGljX2NvdW50OworCisgICAgc2gtPnBpY19vcmRlcl9jbnRfbHNiID0gcHJpdi0+cGljX29yZGVyX2NudCAmCisgICAgICAgICgoMSA8PCAoNCArIHNwcy0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0KSkgLSAxKTsKKworICAgIHNoLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkX2ZsYWcgPSAxOworCisgICAgaWYgKHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfQikKKyAgICAgICAgc2gtPnNsaWNlX3FwX2RlbHRhID0gcHJpdi0+Zml4ZWRfcXBfYiAtIChwcHMtPnBpY19pbml0X3FwX21pbnVzMjYgKyAyNik7CisgICAgZWxzZSBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9QKQorICAgICAgICBzaC0+c2xpY2VfcXBfZGVsdGEgPSBwcml2LT5maXhlZF9xcF9wIC0gKHBwcy0+cGljX2luaXRfcXBfbWludXMyNiArIDI2KTsKKyAgICBlbHNlCisgICAgICAgIHNoLT5zbGljZV9xcF9kZWx0YSA9IHByaXYtPmZpeGVkX3FwX2lkciAtIChwcHMtPnBpY19pbml0X3FwX21pbnVzMjYgKyAyNik7CisKKworICAgIHZzbGljZS0+bWFjcm9ibG9ja19hZGRyZXNzID0gc2gtPmZpcnN0X21iX2luX3NsaWNlOworICAgIHZzbGljZS0+bnVtX21hY3JvYmxvY2tzICAgID0gcHJpdi0+bWJfd2lkdGggKiBwcml2LT5tYl9oZWlnaHQ7CisKKyAgICB2c2xpY2UtPm1hY3JvYmxvY2tfaW5mbyA9IFZBX0lOVkFMSURfSUQ7CisKKyAgICB2c2xpY2UtPnNsaWNlX3R5cGUgICAgICAgICAgID0gc2gtPnNsaWNlX3R5cGUgJSA1OworICAgIHZzbGljZS0+cGljX3BhcmFtZXRlcl9zZXRfaWQgPSBzaC0+cGljX3BhcmFtZXRlcl9zZXRfaWQ7CisgICAgdnNsaWNlLT5pZHJfcGljX2lkICAgICAgICAgICA9IHNoLT5pZHJfcGljX2lkOworCisgICAgdnNsaWNlLT5waWNfb3JkZXJfY250X2xzYiA9IHNoLT5waWNfb3JkZXJfY250X2xzYjsKKworICAgIHZzbGljZS0+ZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnID0gc2gtPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyh2c2xpY2UtPlJlZlBpY0xpc3QwKTsgaSsrKSB7CisgICAgICAgIHZzbGljZS0+UmVmUGljTGlzdDBbaV0ucGljdHVyZV9pZCA9IFZBX0lOVkFMSURfSUQ7CisgICAgICAgIHZzbGljZS0+UmVmUGljTGlzdDBbaV0uZmxhZ3MgICAgICA9IFZBX1BJQ1RVUkVfSDI2NF9JTlZBTElEOworICAgICAgICB2c2xpY2UtPlJlZlBpY0xpc3QxW2ldLnBpY3R1cmVfaWQgPSBWQV9JTlZBTElEX0lEOworICAgICAgICB2c2xpY2UtPlJlZlBpY0xpc3QxW2ldLmZsYWdzICAgICAgPSBWQV9QSUNUVVJFX0gyNjRfSU5WQUxJRDsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKHBpYy0+bmJfcmVmcyA8PSAyKTsKKyAgICBpZiAocGljLT5uYl9yZWZzID49IDEpIHsKKyAgICAgICAgLy8gQmFja3dhcmQgcmVmZXJlbmNlIGZvciBQLSBvciBCLWZyYW1lLgorICAgICAgICBhdl9hc3NlcnQwKHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfUCB8fAorICAgICAgICAgICAgICAgICAgIHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfQik7CisgICAgICAgIHZzbGljZS0+UmVmUGljTGlzdDBbMF0gPSB2cGljLT5SZWZlcmVuY2VGcmFtZXNbMF07CisgICAgfQorICAgIGlmIChwaWMtPm5iX3JlZnMgPj0gMikgeworICAgICAgICAvLyBGb3J3YXJkIHJlZmVyZW5jZSBmb3IgQi1mcmFtZS4KKyAgICAgICAgYXZfYXNzZXJ0MChwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0IpOworICAgICAgICB2c2xpY2UtPlJlZlBpY0xpc3QxWzBdID0gdnBpYy0+UmVmZXJlbmNlRnJhbWVzWzFdOworICAgIH0KKworICAgIHZzbGljZS0+c2xpY2VfcXBfZGVsdGEgPSBzaC0+c2xpY2VfcXBfZGVsdGE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZhYXBpX2VuY29kZV9oMjY0X2NvbmZpZ3VyZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVIMjY0Q29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NE9wdGlvbnMgICpvcHQgPSBjdHgtPmNvZGVjX29wdGlvbnM7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX2Nic19pbml0KCZwcml2LT5jYmMsIEFWX0NPREVDX0lEX0gyNjQsIGF2Y3R4KTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIHByaXYtPm1iX3dpZHRoICA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCAgMTYpIC8gMTY7CisgICAgcHJpdi0+bWJfaGVpZ2h0ID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNikgLyAxNjsKKworICAgIGlmIChjdHgtPnZhX3JjX21vZGUgPT0gVkFfUkNfQ1FQKSB7CisgICAgICAgIHByaXYtPmZpeGVkX3FwX3AgPSBvcHQtPnFwOworICAgICAgICBpZiAoYXZjdHgtPmlfcXVhbnRfZmFjdG9yID4gMC4wKQorICAgICAgICAgICAgcHJpdi0+Zml4ZWRfcXBfaWRyID0gKGludCkoKHByaXYtPmZpeGVkX3FwX3AgKiBhdmN0eC0+aV9xdWFudF9mYWN0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5pX3F1YW50X29mZnNldCkgKyAwLjUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcml2LT5maXhlZF9xcF9pZHIgPSBwcml2LT5maXhlZF9xcF9wOworICAgICAgICBpZiAoYXZjdHgtPmJfcXVhbnRfZmFjdG9yID4gMC4wKQorICAgICAgICAgICAgcHJpdi0+Zml4ZWRfcXBfYiA9IChpbnQpKChwcml2LT5maXhlZF9xcF9wICogYXZjdHgtPmJfcXVhbnRfZmFjdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmJfcXVhbnRfb2Zmc2V0KSArIDAuNSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaXYtPmZpeGVkX3FwX2IgPSBwcml2LT5maXhlZF9xcF9wOworCisgICAgICAgIG9wdC0+c2VpICY9IH5TRUlfVElNSU5HOworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVXNpbmcgZml4ZWQgUVAgPSAiCisgICAgICAgICAgICAgICAiJWQgLyAlZCAvICVkIGZvciBJRFItIC8gUC0gLyBCLWZyYW1lcy5cbiIsCisgICAgICAgICAgICAgICBwcml2LT5maXhlZF9xcF9pZHIsIHByaXYtPmZpeGVkX3FwX3AsIHByaXYtPmZpeGVkX3FwX2IpOworCisgICAgfSBlbHNlIGlmIChjdHgtPnZhX3JjX21vZGUgPT0gVkFfUkNfQ0JSIHx8CisgICAgICAgICAgICAgICBjdHgtPnZhX3JjX21vZGUgPT0gVkFfUkNfVkJSKSB7CisgICAgICAgIC8vIFRoZXNlIHN0aWxsIG5lZWQgdG8gYmUgIHNldCBmb3IgcGljX2luaXRfcXAvc2xpY2VfcXBfZGVsdGEuCisgICAgICAgIHByaXYtPmZpeGVkX3FwX2lkciA9IDI2OworICAgICAgICBwcml2LT5maXhlZF9xcF9wICAgPSAyNjsKKyAgICAgICAgcHJpdi0+Zml4ZWRfcXBfYiAgID0gMjY7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyAlcy1iaXRyYXRlID0gJSJQUklkNjQiIGJwcy5cbiIsCisgICAgICAgICAgICAgICBjdHgtPnZhX3JjX21vZGUgPT0gVkFfUkNfQ0JSID8gImNvbnN0YW50IiA6ICJ2YXJpYWJsZSIsCisgICAgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYXNzZXJ0MCgwICYmICJJbnZhbGlkIFJDIG1vZGUuIik7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb21wcmVzc2lvbl9sZXZlbCA9PSBGRl9DT01QUkVTU0lPTl9ERUZBVUxUKQorICAgICAgICBhdmN0eC0+Y29tcHJlc3Npb25fbGV2ZWwgPSBvcHQtPnF1YWxpdHk7CisKKyAgICBpZiAob3B0LT5zZWkgJiBTRUlfSURFTlRJRklFUikgeworICAgICAgICBjb25zdCBjaGFyICpsYXZjICA9IExJQkFWQ09ERUNfSURFTlQ7CisgICAgICAgIGNvbnN0IGNoYXIgKnZhYXBpID0gVkFfVkVSU0lPTl9TOworICAgICAgICBjb25zdCBjaGFyICpkcml2ZXI7CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgbWVtY3B5KHByaXYtPmlkZW50aWZpZXIudXVpZF9pc29faWVjXzExNTc4LAorICAgICAgICAgICAgICAgdmFhcGlfZW5jb2RlX2gyNjRfc2VpX2lkZW50aWZpZXJfdXVpZCwKKyAgICAgICAgICAgICAgIHNpemVvZihwcml2LT5pZGVudGlmaWVyLnV1aWRfaXNvX2llY18xMTU3OCkpOworCisgICAgICAgIGRyaXZlciA9IHZhUXVlcnlWZW5kb3JTdHJpbmcoY3R4LT5od2N0eC0+ZGlzcGxheSk7CisgICAgICAgIGlmICghZHJpdmVyKQorICAgICAgICAgICAgZHJpdmVyID0gInVua25vd24gZHJpdmVyIjsKKworICAgICAgICBsZW4gPSBzbnByaW50ZihOVUxMLCAwLCAiJXMgLyBWQUFQSSAlcyAvICVzIiwgbGF2YywgdmFhcGksIGRyaXZlcik7CisgICAgICAgIGlmIChsZW4gPj0gMCkgeworICAgICAgICAgICAgcHJpdi0+aWRlbnRpZmllcl9zdHJpbmcgPSBhdl9tYWxsb2MobGVuICsgMSk7CisgICAgICAgICAgICBpZiAoIXByaXYtPmlkZW50aWZpZXJfc3RyaW5nKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIHNucHJpbnRmKHByaXYtPmlkZW50aWZpZXJfc3RyaW5nLCBsZW4gKyAxLAorICAgICAgICAgICAgICAgICAgICAgIiVzIC8gVkFBUEkgJXMgLyAlcyIsIGxhdmMsIHZhYXBpLCBkcml2ZXIpOworCisgICAgICAgICAgICBwcml2LT5pZGVudGlmaWVyLmRhdGEgPSBwcml2LT5pZGVudGlmaWVyX3N0cmluZzsKKyAgICAgICAgICAgIHByaXYtPmlkZW50aWZpZXIuZGF0YV9sZW5ndGggPSBsZW4gKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBWQUFQSUVuY29kZVR5cGUgdmFhcGlfZW5jb2RlX3R5cGVfaDI2NCA9IHsKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFZBQVBJRW5jb2RlSDI2NENvbnRleHQpLAorCisgICAgLmNvbmZpZ3VyZSAgICAgICAgICAgICA9ICZ2YWFwaV9lbmNvZGVfaDI2NF9jb25maWd1cmUsCisKKyAgICAuc2VxdWVuY2VfcGFyYW1zX3NpemUgID0gc2l6ZW9mKFZBRW5jU2VxdWVuY2VQYXJhbWV0ZXJCdWZmZXJIMjY0KSwKKyAgICAuaW5pdF9zZXF1ZW5jZV9wYXJhbXMgID0gJnZhYXBpX2VuY29kZV9oMjY0X2luaXRfc2VxdWVuY2VfcGFyYW1zLAorCisgICAgLnBpY3R1cmVfcGFyYW1zX3NpemUgICA9IHNpemVvZihWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0KSwKKyAgICAuaW5pdF9waWN0dXJlX3BhcmFtcyAgID0gJnZhYXBpX2VuY29kZV9oMjY0X2luaXRfcGljdHVyZV9wYXJhbXMsCisKKyAgICAuc2xpY2VfcGFyYW1zX3NpemUgICAgID0gc2l6ZW9mKFZBRW5jU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0KSwKKyAgICAuaW5pdF9zbGljZV9wYXJhbXMgICAgID0gJnZhYXBpX2VuY29kZV9oMjY0X2luaXRfc2xpY2VfcGFyYW1zLAorCisgICAgLnNlcXVlbmNlX2hlYWRlcl90eXBlICA9IFZBRW5jUGFja2VkSGVhZGVyU2VxdWVuY2UsCisgICAgLndyaXRlX3NlcXVlbmNlX2hlYWRlciA9ICZ2YWFwaV9lbmNvZGVfaDI2NF93cml0ZV9zZXF1ZW5jZV9oZWFkZXIsCisKKyAgICAuc2xpY2VfaGVhZGVyX3R5cGUgICAgID0gVkFFbmNQYWNrZWRIZWFkZXJIMjY0X1NsaWNlLAorICAgIC53cml0ZV9zbGljZV9oZWFkZXIgICAgPSAmdmFhcGlfZW5jb2RlX2gyNjRfd3JpdGVfc2xpY2VfaGVhZGVyLAorCisgICAgLndyaXRlX2V4dHJhX2hlYWRlciAgICA9ICZ2YWFwaV9lbmNvZGVfaDI2NF93cml0ZV9leHRyYV9oZWFkZXIsCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgdmFhcGlfZW5jb2RlX2gyNjRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjRPcHRpb25zICpvcHQgPQorICAgICAgICAoVkFBUElFbmNvZGVIMjY0T3B0aW9ucyopY3R4LT5jb2RlY19vcHRpb25zX2RhdGE7CisKKyAgICBjdHgtPmNvZGVjID0gJnZhYXBpX2VuY29kZV90eXBlX2gyNjQ7CisKKyAgICBpZiAoYXZjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9VTktOT1dOKQorICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IG9wdC0+cHJvZmlsZTsKKyAgICBpZiAoYXZjdHgtPmxldmVsID09IEZGX0xFVkVMX1VOS05PV04pCisgICAgICAgIGF2Y3R4LT5sZXZlbCA9IG9wdC0+bGV2ZWw7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5wcm9maWxlKSB7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfQkFTRUxJTkU6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJILjI2NCBiYXNlbGluZSBwcm9maWxlIGlzIG5vdCAiCisgICAgICAgICAgICAgICAic3VwcG9ydGVkLCB1c2luZyBjb25zdHJhaW5lZCBiYXNlbGluZSBwcm9maWxlIGluc3RlYWQuXG4iKTsKKyAgICAgICAgYXZjdHgtPnByb2ZpbGUgPSBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORURfQkFTRUxJTkU7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORURfQkFTRUxJTkU6CisgICAgICAgIGN0eC0+dmFfcHJvZmlsZSA9IFZBUHJvZmlsZUgyNjRDb25zdHJhaW5lZEJhc2VsaW5lOworICAgICAgICBpZiAoYXZjdHgtPm1heF9iX2ZyYW1lcyAhPSAwKSB7CisgICAgICAgICAgICBhdmN0eC0+bWF4X2JfZnJhbWVzID0gMDsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJILjI2NCBjb25zdHJhaW5lZCBiYXNlbGluZSBwcm9maWxlICIKKyAgICAgICAgICAgICAgICAgICAiZG9lc24ndCBzdXBwb3J0IGVuY29kaW5nIHdpdGggQiBmcmFtZXMsIGRpc2FibGluZyB0aGVtLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfTUFJTjoKKyAgICAgICAgY3R4LT52YV9wcm9maWxlID0gVkFQcm9maWxlSDI2NE1haW47CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0VYVEVOREVEOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkguMjY0IGV4dGVuZGVkIHByb2ZpbGUgIgorICAgICAgICAgICAgICAgImlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIGNhc2UgRkZfUFJPRklMRV9VTktOT1dOOgorICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0g6CisgICAgICAgIGN0eC0+dmFfcHJvZmlsZSA9IFZBUHJvZmlsZUgyNjRIaWdoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzEwOgorICAgIGNhc2UgRkZfUFJPRklMRV9IMjY0X0hJR0hfMTBfSU5UUkE6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSC4yNjQgMTAtYml0IHByb2ZpbGVzICIKKyAgICAgICAgICAgICAgICJhcmUgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80MjI6CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80MjJfSU5UUkE6CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDQ6CisgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF80NDRfUFJFRElDVElWRToKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9JTlRSQToKKyAgICBjYXNlIEZGX1BST0ZJTEVfSDI2NF9DQVZMQ180NDQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSC4yNjQgbm9uLTQ6MjowIHByb2ZpbGVzICIKKyAgICAgICAgICAgICAgICJhcmUgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIEguMjY0IHByb2ZpbGUgJWQuXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAob3B0LT5sb3dfcG93ZXIpIHsKKyNpZiBWQV9DSEVDS19WRVJTSU9OKDAsIDM5LCAyKQorICAgICAgICBjdHgtPnZhX2VudHJ5cG9pbnQgPSBWQUVudHJ5cG9pbnRFbmNTbGljZUxQOworI2Vsc2UKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJMb3ctcG93ZXIgZW5jb2RpbmcgaXMgbm90ICIKKyAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgd2l0aCB0aGlzIFZBQVBJIHZlcnNpb24uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyNlbmRpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGN0eC0+dmFfZW50cnlwb2ludCA9IFZBRW50cnlwb2ludEVuY1NsaWNlOworICAgIH0KKworICAgIC8vIE9ubHkgOC1iaXQgZW5jb2RlIGlzIHN1cHBvcnRlZC4KKyAgICBjdHgtPnZhX3J0X2Zvcm1hdCA9IFZBX1JUX0ZPUk1BVF9ZVVY0MjA7CisKKyAgICBpZiAoYXZjdHgtPmJpdF9yYXRlID4gMCkgeworICAgICAgICBpZiAoYXZjdHgtPnJjX21heF9yYXRlID09IGF2Y3R4LT5iaXRfcmF0ZSkKKyAgICAgICAgICAgIGN0eC0+dmFfcmNfbW9kZSA9IFZBX1JDX0NCUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3R4LT52YV9yY19tb2RlID0gVkFfUkNfVkJSOworICAgIH0gZWxzZQorICAgICAgICBjdHgtPnZhX3JjX21vZGUgPSBWQV9SQ19DUVA7CisKKyAgICBjdHgtPnZhX3BhY2tlZF9oZWFkZXJzID0KKyAgICAgICAgVkFfRU5DX1BBQ0tFRF9IRUFERVJfU0VRVUVOQ0UgfCAvLyBTUFMgYW5kIFBQUy4KKyAgICAgICAgVkFfRU5DX1BBQ0tFRF9IRUFERVJfU0xJQ0UgICAgfCAvLyBTbGljZSBoZWFkZXJzLgorICAgICAgICBWQV9FTkNfUEFDS0VEX0hFQURFUl9NSVNDOyAgICAgIC8vIFNFSS4KKworICAgIGN0eC0+c3VyZmFjZV93aWR0aCAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgIDE2KTsKKyAgICBjdHgtPnN1cmZhY2VfaGVpZ2h0ID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNik7CisKKyAgICByZXR1cm4gZmZfdmFhcGlfZW5jb2RlX2luaXQoYXZjdHgpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdmFhcGlfZW5jb2RlX2gyNjRfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjRDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAocHJpdikgeworICAgICAgICBmZl9jYnNfY2xvc2UoJnByaXYtPmNiYyk7CisgICAgICAgIGF2X2ZyZWVwKCZwcml2LT5pZGVudGlmaWVyX3N0cmluZyk7CisgICAgfQorCisgICAgcmV0dXJuIGZmX3ZhYXBpX2VuY29kZV9jbG9zZShhdmN0eCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIChvZmZzZXRvZihWQUFQSUVuY29kZUNvbnRleHQsIGNvZGVjX29wdGlvbnNfZGF0YSkgKyBcCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVkFBUElFbmNvZGVIMjY0T3B0aW9ucywgeCkpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIHZhYXBpX2VuY29kZV9oMjY0X29wdGlvbnNbXSA9IHsKKyAgICB7ICJxcCIsICJDb25zdGFudCBRUCAoZm9yIFAtZnJhbWVzOyBzY2FsZWQgYnkgcWZhY3Rvci9xb2Zmc2V0IGZvciBJL0IpIiwKKyAgICAgIE9GRlNFVChxcCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMjAgfSwgMCwgNTIsIEZMQUdTIH0sCisgICAgeyAicXVhbGl0eSIsICJTZXQgZW5jb2RlIHF1YWxpdHkgKHRyYWRlcyBvZmYgYWdhaW5zdCBzcGVlZCwgaGlnaGVyIGlzIGZhc3RlcikiLAorICAgICAgT0ZGU0VUKHF1YWxpdHkpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgOCwgRkxBR1MgfSwKKyAgICB7ICJsb3dfcG93ZXIiLCAiVXNlIGxvdy1wb3dlciBlbmNvZGluZyBtb2RlIChleHBlcmltZW50YWw6IG9ubHkgc3VwcG9ydGVkICIKKyAgICAgICJvbiBzb21lIHBsYXRmb3JtcywgZG9lcyBub3Qgc3VwcG9ydCBhbGwgZmVhdHVyZXMpIiwKKyAgICAgIE9GRlNFVChsb3dfcG93ZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJjb2RlciIsICJFbnRyb3B5IGNvZGVyIHR5cGUiLAorICAgICAgT0ZGU0VUKGNvZGVyKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDAsIDEsIEZMQUdTLCAiY29kZXIiIH0sCisgICAgICAgIHsgImNhdmxjIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJjb2RlciIgfSwKKyAgICAgICAgeyAiY2FiYWMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImNvZGVyIiB9LAorICAgICAgICB7ICJ2bGMiLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAwIH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiY29kZXIiIH0sCisgICAgICAgIHsgImFjIiwgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDEgfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJjb2RlciIgfSwKKworICAgIHsgImF1ZCIsICJJbmNsdWRlIEFVRCIsCisgICAgICBPRkZTRVQoYXVkKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTIH0sCisKKyAgICB7ICJzZWkiLCAiU2V0IFNFSSB0byBpbmNsdWRlIiwKKyAgICAgIE9GRlNFVChzZWkpLCBBVl9PUFRfVFlQRV9GTEFHUywKKyAgICAgIHsgLmk2NCA9IFNFSV9JREVOVElGSUVSIHwgU0VJX1RJTUlORyB8IFNFSV9SRUNPVkVSWV9QT0lOVCB9LAorICAgICAgMCwgSU5UX01BWCwgRkxBR1MsICJzZWkiIH0sCisgICAgeyAiaWRlbnRpZmllciIsICJJbmNsdWRlIGVuY29kZXIgdmVyc2lvbiBpZGVudGlmaWVyIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBTRUlfSURFTlRJRklFUiB9LAorICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJzZWkiIH0sCisgICAgeyAidGltaW5nIiwgIkluY2x1ZGUgdGltaW5nIHBhcmFtZXRlcnMgKGJ1ZmZlcmluZ19wZXJpb2QgYW5kIHBpY190aW1pbmcpIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBTRUlfVElNSU5HIH0sCisgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInNlaSIgfSwKKyAgICB7ICJyZWNvdmVyeV9wb2ludCIsICJJbmNsdWRlIHJlY292ZXJ5IHBvaW50cyB3aGVyZSBhcHByb3ByaWF0ZSIsCisgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gU0VJX1JFQ09WRVJZX1BPSU5UIH0sCisgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInNlaSIgfSwKKworICAgIHsgInByb2ZpbGUiLCAiU2V0IHByb2ZpbGUgKHByb2ZpbGVfaWRjIGFuZCBjb25zdHJhaW50X3NldCpfZmxhZykiLAorICAgICAgT0ZGU0VUKHByb2ZpbGUpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICB7IC5pNjQgPSBGRl9QUk9GSUxFX0gyNjRfSElHSCB9LCAweDAwMDAsIDB4ZmZmZiwgRkxBR1MsICJwcm9maWxlIiB9LAorCisjZGVmaW5lIFBST0ZJTEUobmFtZSwgdmFsdWUpICBuYW1lLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgXAorICAgICAgeyAuaTY0ID0gdmFsdWUgfSwgMCwgMCwgRkxBR1MsICJwcm9maWxlIgorICAgIHsgUFJPRklMRSgiY29uc3RyYWluZWRfYmFzZWxpbmUiLCBGRl9QUk9GSUxFX0gyNjRfQ09OU1RSQUlORURfQkFTRUxJTkUpIH0sCisgICAgeyBQUk9GSUxFKCJtYWluIiwgICAgICAgICAgICAgICAgIEZGX1BST0ZJTEVfSDI2NF9NQUlOKSB9LAorICAgIHsgUFJPRklMRSgiaGlnaCIsICAgICAgICAgICAgICAgICBGRl9QUk9GSUxFX0gyNjRfSElHSCkgfSwKKyN1bmRlZiBQUk9GSUxFCisKKyAgICB7ICJsZXZlbCIsICJTZXQgbGV2ZWwgKGxldmVsX2lkYykiLAorICAgICAgT0ZGU0VUKGxldmVsKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgeyAuaTY0ID0gNTEgfSwgMHgwMCwgMHhmZiwgRkxBR1MsICJsZXZlbCIgfSwKKworI2RlZmluZSBMRVZFTChuYW1lLCB2YWx1ZSkgbmFtZSwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIFwKKyAgICAgIHsgLmk2NCA9IHZhbHVlIH0sIDAsIDAsIEZMQUdTLCAibGV2ZWwiCisgICAgeyBMRVZFTCgiMSIsICAgMTApIH0sCisgICAgeyBMRVZFTCgiMS4xIiwgMTEpIH0sCisgICAgeyBMRVZFTCgiMS4yIiwgMTIpIH0sCisgICAgeyBMRVZFTCgiMS4zIiwgMTMpIH0sCisgICAgeyBMRVZFTCgiMiIsICAgMjApIH0sCisgICAgeyBMRVZFTCgiMi4xIiwgMjEpIH0sCisgICAgeyBMRVZFTCgiMi4yIiwgMjIpIH0sCisgICAgeyBMRVZFTCgiMyIsICAgMzApIH0sCisgICAgeyBMRVZFTCgiMy4xIiwgMzEpIH0sCisgICAgeyBMRVZFTCgiMy4yIiwgMzIpIH0sCisgICAgeyBMRVZFTCgiNCIsICAgNDApIH0sCisgICAgeyBMRVZFTCgiNC4xIiwgNDEpIH0sCisgICAgeyBMRVZFTCgiNC4yIiwgNDIpIH0sCisgICAgeyBMRVZFTCgiNSIsICAgNTApIH0sCisgICAgeyBMRVZFTCgiNS4xIiwgNTEpIH0sCisgICAgeyBMRVZFTCgiNS4yIiwgNTIpIH0sCisgICAgeyBMRVZFTCgiNiIsICAgNjApIH0sCisgICAgeyBMRVZFTCgiNi4xIiwgNjEpIH0sCisgICAgeyBMRVZFTCgiNi4yIiwgNjIpIH0sCisjdW5kZWYgTEVWRUwKKworICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IHZhYXBpX2VuY29kZV9oMjY0X2RlZmF1bHRzW10gPSB7CisgICAgeyAiYiIsICAgICAgICAgICAgICAiMCIgICB9LAorICAgIHsgImJmIiwgICAgICAgICAgICAgIjIiICAgfSwKKyAgICB7ICJnIiwgICAgICAgICAgICAgICIxMjAiIH0sCisgICAgeyAiaV9xZmFjdG9yIiwgICAgICAiMSIgICB9LAorICAgIHsgImlfcW9mZnNldCIsICAgICAgIjAiICAgfSwKKyAgICB7ICJiX3FmYWN0b3IiLCAgICAgICI2LzUiIH0sCisgICAgeyAiYl9xb2Zmc2V0IiwgICAgICAiMCIgICB9LAorICAgIHsgInFtaW4iLCAgICAgICAgICAgIjAiICAgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHZhYXBpX2VuY29kZV9oMjY0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImgyNjRfdmFhcGkiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSB2YWFwaV9lbmNvZGVfaDI2NF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl9oMjY0X3ZhYXBpX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfdmFhcGkiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJILjI2NC9BVkMgKFZBQVBJKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IChzaXplb2YoVkFBUElFbmNvZGVDb250ZXh0KSArCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWQUFQSUVuY29kZUgyNjRPcHRpb25zKSksCisgICAgLmluaXQgICAgICAgICAgID0gJnZhYXBpX2VuY29kZV9oMjY0X2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gJmZmX3ZhYXBpX2VuY29kZTIsCisgICAgLmNsb3NlICAgICAgICAgID0gJnZhYXBpX2VuY29kZV9oMjY0X2Nsb3NlLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ2YWFwaV9lbmNvZGVfaDI2NF9jbGFzcywKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSEFSRFdBUkUsCisgICAgLmRlZmF1bHRzICAgICAgID0gdmFhcGlfZW5jb2RlX2gyNjRfZGVmYXVsdHMsCisgICAgLnBpeF9mbXRzID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfVkFBUEksCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9LAorICAgIC53cmFwcGVyX25hbWUgICA9ICJ2YWFwaSIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaV9lbmNvZGVfaDI2NS5jIGIvbGliYXZjb2RlYy92YWFwaV9lbmNvZGVfaDI2NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMDNjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3ZhYXBpX2VuY29kZV9oMjY1LmMKQEAgLTAsMCArMSwxMDQ1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHZhL3ZhLmg+CisjaW5jbHVkZSA8dmEvdmFfZW5jX2hldmMuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiY2JzLmgiCisjaW5jbHVkZSAiY2JzX2gyNjUuaCIKKyNpbmNsdWRlICJoZXZjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwdXRfYml0cy5oIgorI2luY2x1ZGUgInZhYXBpX2VuY29kZS5oIgorCisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRW5jb2RlSDI2NUNvbnRleHQgeworICAgIHVuc2lnbmVkIGludCBjdHVfd2lkdGg7CisgICAgdW5zaWduZWQgaW50IGN0dV9oZWlnaHQ7CisKKyAgICBpbnQgZml4ZWRfcXBfaWRyOworICAgIGludCBmaXhlZF9xcF9wOworICAgIGludCBmaXhlZF9xcF9iOworCisgICAgSDI2NVJhd0FVRCBhdWQ7CisgICAgSDI2NVJhd1ZQUyB2cHM7CisgICAgSDI2NVJhd1NQUyBzcHM7CisgICAgSDI2NVJhd1BQUyBwcHM7CisgICAgSDI2NVJhd1NsaWNlIHNsaWNlOworCisgICAgaW50NjRfdCBsYXN0X2lkcl9mcmFtZTsKKyAgICBpbnQgcGljX29yZGVyX2NudDsKKworICAgIGludCBzbGljZV9uYWxfdW5pdDsKKyAgICBpbnQgc2xpY2VfdHlwZTsKKyAgICBpbnQgcGljX3R5cGU7CisKKyAgICBDb2RlZEJpdHN0cmVhbUNvbnRleHQgKmNiYzsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50IGN1cnJlbnRfYWNjZXNzX3VuaXQ7CisgICAgaW50IGF1ZF9uZWVkZWQ7Cit9IFZBQVBJRW5jb2RlSDI2NUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRW5jb2RlSDI2NU9wdGlvbnMgeworICAgIGludCBxcDsKKyAgICBpbnQgYXVkOworICAgIGludCBwcm9maWxlOworICAgIGludCBsZXZlbDsKK30gVkFBUElFbmNvZGVIMjY1T3B0aW9uczsKKworCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9oMjY1X3dyaXRlX2FjY2Vzc191bml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqYXUpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVIMjY1Q29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBmZl9jYnNfd3JpdGVfZnJhZ21lbnRfZGF0YShwcml2LT5jYmMsIGF1KTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB3cml0ZSBwYWNrZWQgaGVhZGVyLlxuIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaWYgKCpkYXRhX2xlbiA8IDggKiBhdS0+ZGF0YV9zaXplIC0gYXUtPmRhdGFfYml0X3BhZGRpbmcpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBY2Nlc3MgdW5pdCB0b28gbGFyZ2U6ICIKKyAgICAgICAgICAgICAgICIlenUgPCAlenUuXG4iLCAqZGF0YV9sZW4sCisgICAgICAgICAgICAgICA4ICogYXUtPmRhdGFfc2l6ZSAtIGF1LT5kYXRhX2JpdF9wYWRkaW5nKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1BDKTsKKyAgICB9CisKKyAgICBtZW1jcHkoZGF0YSwgYXUtPmRhdGEsIGF1LT5kYXRhX3NpemUpOworICAgICpkYXRhX2xlbiA9IDggKiBhdS0+ZGF0YV9zaXplIC0gYXUtPmRhdGFfYml0X3BhZGRpbmc7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfaDI2NV9hZGRfbmFsKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICphdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpuYWxfdW5pdCkKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjVDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisgICAgSDI2NVJhd05BTFVuaXRIZWFkZXIgKmhlYWRlciA9IG5hbF91bml0OworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBmZl9jYnNfaW5zZXJ0X3VuaXRfY29udGVudChwcml2LT5jYmMsIGF1LCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXItPm5hbF91bml0X3R5cGUsIG5hbF91bml0LCBOVUxMKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhZGQgTkFMIHVuaXQ6ICIKKyAgICAgICAgICAgICAgICJ0eXBlID0gJWQuXG4iLCBoZWFkZXItPm5hbF91bml0X3R5cGUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9oMjY1X3dyaXRlX3NlcXVlbmNlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NUNvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICAgKmF1ID0gJnByaXYtPmN1cnJlbnRfYWNjZXNzX3VuaXQ7CisgICAgaW50IGVycjsKKworICAgIGlmIChwcml2LT5hdWRfbmVlZGVkKSB7CisgICAgICAgIGVyciA9IHZhYXBpX2VuY29kZV9oMjY1X2FkZF9uYWwoYXZjdHgsIGF1LCAmcHJpdi0+YXVkKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHByaXYtPmF1ZF9uZWVkZWQgPSAwOworICAgIH0KKworICAgIGVyciA9IHZhYXBpX2VuY29kZV9oMjY1X2FkZF9uYWwoYXZjdHgsIGF1LCAmcHJpdi0+dnBzKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXJyID0gdmFhcGlfZW5jb2RlX2gyNjVfYWRkX25hbChhdmN0eCwgYXUsICZwcml2LT5zcHMpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfaDI2NV9hZGRfbmFsKGF2Y3R4LCBhdSwgJnByaXYtPnBwcyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IHZhYXBpX2VuY29kZV9oMjY1X3dyaXRlX2FjY2Vzc191bml0KGF2Y3R4LCBkYXRhLCBkYXRhX2xlbiwgYXUpOworZmFpbDoKKyAgICBmZl9jYnNfZnJhZ21lbnRfdW5pbml0KHByaXYtPmNiYywgYXUpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2gyNjVfd3JpdGVfc2xpY2VfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVTbGljZSAqc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NUNvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICAgKmF1ID0gJnByaXYtPmN1cnJlbnRfYWNjZXNzX3VuaXQ7CisgICAgaW50IGVycjsKKworICAgIGlmIChwcml2LT5hdWRfbmVlZGVkKSB7CisgICAgICAgIGVyciA9IHZhYXBpX2VuY29kZV9oMjY1X2FkZF9uYWwoYXZjdHgsIGF1LCAmcHJpdi0+YXVkKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHByaXYtPmF1ZF9uZWVkZWQgPSAwOworICAgIH0KKworICAgIGVyciA9IHZhYXBpX2VuY29kZV9oMjY1X2FkZF9uYWwoYXZjdHgsIGF1LCAmcHJpdi0+c2xpY2UpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfaDI2NV93cml0ZV9hY2Nlc3NfdW5pdChhdmN0eCwgZGF0YSwgZGF0YV9sZW4sIGF1KTsKK2ZhaWw6CisgICAgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChwcml2LT5jYmMsIGF1KTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9oMjY1X2luaXRfc2VxdWVuY2VfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAgICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVIMjY1Q29udGV4dCAgICAgICAgICAgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBIMjY1UmF3VlBTICAgICAgICAgICAgICAgICAgICAgICAgKnZwcyA9ICZwcml2LT52cHM7CisgICAgSDI2NVJhd1NQUyAgICAgICAgICAgICAgICAgICAgICAgICpzcHMgPSAmcHJpdi0+c3BzOworICAgIEgyNjVSYXdQUFMgICAgICAgICAgICAgICAgICAgICAgICAqcHBzID0gJnByaXYtPnBwczsKKyAgICBIMjY1UmF3VlVJICAgICAgICAgICAgICAgICAgICAgICAgKnZ1aSA9ICZzcHMtPnZ1aTsKKyAgICBWQUVuY1NlcXVlbmNlUGFyYW1ldGVyQnVmZmVySEVWQyAqdnNlcSA9IGN0eC0+Y29kZWNfc2VxdWVuY2VfcGFyYW1zOworICAgIFZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlckhFVkMgICp2cGljID0gY3R4LT5jb2RlY19waWN0dXJlX3BhcmFtczsKKyAgICBpbnQgaTsKKworICAgIG1lbXNldCgmcHJpdi0+Y3VycmVudF9hY2Nlc3NfdW5pdCwgMCwKKyAgICAgICAgICAgc2l6ZW9mKHByaXYtPmN1cnJlbnRfYWNjZXNzX3VuaXQpKTsKKworICAgIG1lbXNldCh2cHMsIDAsIHNpemVvZigqdnBzKSk7CisgICAgbWVtc2V0KHNwcywgMCwgc2l6ZW9mKCpzcHMpKTsKKyAgICBtZW1zZXQocHBzLCAwLCBzaXplb2YoKnBwcykpOworCisKKyAgICAvLyBWUFMKKworICAgIHZwcy0+bmFsX3VuaXRfaGVhZGVyID0gKEgyNjVSYXdOQUxVbml0SGVhZGVyKSB7CisgICAgICAgIC5uYWxfdW5pdF90eXBlICAgICAgICAgPSBIRVZDX05BTF9WUFMsCisgICAgICAgIC5udWhfbGF5ZXJfaWQgICAgICAgICAgPSAwLAorICAgICAgICAubnVoX3RlbXBvcmFsX2lkX3BsdXMxID0gMSwKKyAgICB9OworCisgICAgdnBzLT52cHNfdmlkZW9fcGFyYW1ldGVyX3NldF9pZCA9IDA7CisKKyAgICB2cHMtPnZwc19iYXNlX2xheWVyX2ludGVybmFsX2ZsYWcgID0gMTsKKyAgICB2cHMtPnZwc19iYXNlX2xheWVyX2F2YWlsYWJsZV9mbGFnID0gMTsKKyAgICB2cHMtPnZwc19tYXhfbGF5ZXJzX21pbnVzMSAgICAgICAgID0gMDsKKyAgICB2cHMtPnZwc19tYXhfc3ViX2xheWVyc19taW51czEgICAgID0gMDsKKyAgICB2cHMtPnZwc190ZW1wb3JhbF9pZF9uZXN0aW5nX2ZsYWcgID0gMTsKKworICAgIHZwcy0+cHJvZmlsZV90aWVyX2xldmVsID0gKEgyNjVSYXdQcm9maWxlVGllckxldmVsKSB7CisgICAgICAgIC5nZW5lcmFsX3Byb2ZpbGVfc3BhY2UgPSAwLAorICAgICAgICAuZ2VuZXJhbF9wcm9maWxlX2lkYyAgID0gYXZjdHgtPnByb2ZpbGUsCisgICAgICAgIC5nZW5lcmFsX3RpZXJfZmxhZyAgICAgPSAwLAorCisgICAgICAgIC5nZW5lcmFsX3Byb2dyZXNzaXZlX3NvdXJjZV9mbGFnICAgID0gMSwKKyAgICAgICAgLmdlbmVyYWxfaW50ZXJsYWNlZF9zb3VyY2VfZmxhZyAgICAgPSAwLAorICAgICAgICAuZ2VuZXJhbF9ub25fcGFja2VkX2NvbnN0cmFpbnRfZmxhZyA9IDEsCisgICAgICAgIC5nZW5lcmFsX2ZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnID0gMSwKKworICAgICAgICAuZ2VuZXJhbF9sZXZlbF9pZGMgICAgID0gYXZjdHgtPmxldmVsLAorICAgIH07CisgICAgdnBzLT5wcm9maWxlX3RpZXJfbGV2ZWwuZ2VuZXJhbF9wcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ1thdmN0eC0+cHJvZmlsZSAmIDMxXSA9IDE7CisKKyAgICB2cHMtPnZwc19zdWJfbGF5ZXJfb3JkZXJpbmdfaW5mb19wcmVzZW50X2ZsYWcgPSAwOworICAgIHZwcy0+dnBzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czFbMF0gICAgICA9IChjdHgtPmJfcGVyX3AgPiAwKSArIDE7CisgICAgdnBzLT52cHNfbWF4X251bV9yZW9yZGVyX3BpY3NbMF0gICAgICAgICAgICAgID0gKGN0eC0+Yl9wZXJfcCA+IDApOworICAgIHZwcy0+dnBzX21heF9sYXRlbmN5X2luY3JlYXNlX3BsdXMxWzBdICAgICAgICA9IDA7CisKKyAgICB2cHMtPnZwc19tYXhfbGF5ZXJfaWQgICAgICAgICAgICAgPSAwOworICAgIHZwcy0+dnBzX251bV9sYXllcl9zZXRzX21pbnVzMSAgICA9IDA7CisgICAgdnBzLT5sYXllcl9pZF9pbmNsdWRlZF9mbGFnWzBdWzBdID0gMTsKKworICAgIHZwcy0+dnBzX3RpbWluZ19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgaWYgKGF2Y3R4LT5mcmFtZXJhdGUubnVtID4gMCAmJiBhdmN0eC0+ZnJhbWVyYXRlLmRlbiA+IDApIHsKKyAgICAgICAgdnBzLT52cHNfbnVtX3VuaXRzX2luX3RpY2sgID0gYXZjdHgtPmZyYW1lcmF0ZS5kZW47CisgICAgICAgIHZwcy0+dnBzX3RpbWVfc2NhbGUgICAgICAgICA9IGF2Y3R4LT5mcmFtZXJhdGUubnVtOworICAgICAgICB2cHMtPnZwc19wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnID0gMTsKKyAgICAgICAgdnBzLT52cHNfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czEgICA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdnBzLT52cHNfbnVtX3VuaXRzX2luX3RpY2sgID0gYXZjdHgtPnRpbWVfYmFzZS5udW07CisgICAgICAgIHZwcy0+dnBzX3RpbWVfc2NhbGUgICAgICAgICA9IGF2Y3R4LT50aW1lX2Jhc2UuZGVuOworICAgICAgICB2cHMtPnZwc19wb2NfcHJvcG9ydGlvbmFsX3RvX3RpbWluZ19mbGFnID0gMDsKKyAgICB9CisgICAgdnBzLT52cHNfbnVtX2hyZF9wYXJhbWV0ZXJzID0gMDsKKworCisgICAgLy8gU1BTCisKKyAgICBzcHMtPm5hbF91bml0X2hlYWRlciA9IChIMjY1UmF3TkFMVW5pdEhlYWRlcikgeworICAgICAgICAubmFsX3VuaXRfdHlwZSAgICAgICAgID0gSEVWQ19OQUxfU1BTLAorICAgICAgICAubnVoX2xheWVyX2lkICAgICAgICAgID0gMCwKKyAgICAgICAgLm51aF90ZW1wb3JhbF9pZF9wbHVzMSA9IDEsCisgICAgfTsKKworICAgIHNwcy0+c3BzX3ZpZGVvX3BhcmFtZXRlcl9zZXRfaWQgPSB2cHMtPnZwc192aWRlb19wYXJhbWV0ZXJfc2V0X2lkOworCisgICAgc3BzLT5zcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxICAgID0gdnBzLT52cHNfbWF4X3N1Yl9sYXllcnNfbWludXMxOworICAgIHNwcy0+c3BzX3RlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyA9IHZwcy0+dnBzX3RlbXBvcmFsX2lkX25lc3RpbmdfZmxhZzsKKworICAgIHNwcy0+cHJvZmlsZV90aWVyX2xldmVsID0gdnBzLT5wcm9maWxlX3RpZXJfbGV2ZWw7CisKKyAgICBzcHMtPnNwc19zZXFfcGFyYW1ldGVyX3NldF9pZCA9IDA7CisKKyAgICBzcHMtPmNocm9tYV9mb3JtYXRfaWRjICAgICAgICAgID0gMTsgLy8gWVVWIDQ6MjowLgorICAgIHNwcy0+c2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcgPSAwOworCisgICAgc3BzLT5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzICA9IGN0eC0+c3VyZmFjZV93aWR0aDsKKyAgICBzcHMtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzID0gY3R4LT5zdXJmYWNlX2hlaWdodDsKKworICAgIGlmIChhdmN0eC0+d2lkdGggICE9IGN0eC0+c3VyZmFjZV93aWR0aCB8fAorICAgICAgICBhdmN0eC0+aGVpZ2h0ICE9IGN0eC0+c3VyZmFjZV9oZWlnaHQpIHsKKyAgICAgICAgc3BzLT5jb25mb3JtYW5jZV93aW5kb3dfZmxhZyA9IDE7CisgICAgICAgIHNwcy0+Y29uZl93aW5fbGVmdF9vZmZzZXQgICA9IDA7CisgICAgICAgIHNwcy0+Y29uZl93aW5fcmlnaHRfb2Zmc2V0ICA9CisgICAgICAgICAgICAoY3R4LT5zdXJmYWNlX3dpZHRoIC0gYXZjdHgtPndpZHRoKSAvIDI7CisgICAgICAgIHNwcy0+Y29uZl93aW5fdG9wX29mZnNldCAgICA9IDA7CisgICAgICAgIHNwcy0+Y29uZl93aW5fYm90dG9tX29mZnNldCA9CisgICAgICAgICAgICAoY3R4LT5zdXJmYWNlX2hlaWdodCAtIGF2Y3R4LT5oZWlnaHQpIC8gMjsKKyAgICB9IGVsc2UgeworICAgICAgICBzcHMtPmNvbmZvcm1hbmNlX3dpbmRvd19mbGFnID0gMDsKKyAgICB9CisKKyAgICBzcHMtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCA9CisgICAgICAgIGF2Y3R4LT5wcm9maWxlID09IEZGX1BST0ZJTEVfSEVWQ19NQUlOXzEwID8gMiA6IDA7CisgICAgc3BzLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCA9IHNwcy0+Yml0X2RlcHRoX2x1bWFfbWludXM4OworCisgICAgc3BzLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgPSA4OworCisgICAgc3BzLT5zcHNfc3ViX2xheWVyX29yZGVyaW5nX2luZm9fcHJlc2VudF9mbGFnID0KKyAgICAgICAgdnBzLT52cHNfc3ViX2xheWVyX29yZGVyaW5nX2luZm9fcHJlc2VudF9mbGFnOworICAgIGZvciAoaSA9IDA7IGkgPD0gc3BzLT5zcHNfbWF4X3N1Yl9sYXllcnNfbWludXMxOyBpKyspIHsKKyAgICAgICAgc3BzLT5zcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMVtpXSA9CisgICAgICAgICAgICB2cHMtPnZwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxW2ldOworICAgICAgICBzcHMtPnNwc19tYXhfbnVtX3Jlb3JkZXJfcGljc1tpXSA9CisgICAgICAgICAgICB2cHMtPnZwc19tYXhfbnVtX3Jlb3JkZXJfcGljc1tpXTsKKyAgICAgICAgc3BzLT5zcHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VfcGx1czFbaV0gPQorICAgICAgICAgICAgdnBzLT52cHNfbWF4X2xhdGVuY3lfaW5jcmVhc2VfcGx1czFbaV07CisgICAgfQorCisgICAgLy8gVGhlc2UgaGF2ZSB0byBjb21lIGZyb20gdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgZW5jb2Rlci4gIFdlIGhhdmUgbm8KKyAgICAvLyB3YXkgdG8gcXVlcnkgdGhlbSwgc28ganVzdCBoYXJkY29kZSBwYXJhbWV0ZXJzIHdoaWNoIHdvcmsgb24gdGhlIEludGVsCisgICAgLy8gZHJpdmVyLgorICAgIC8vIENUQiBzaXplIGZyb20gOHg4IHRvIDMyeDMyLgorICAgIHNwcy0+bG9nMl9taW5fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgICA9IDA7CisgICAgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplID0gMjsKKyAgICAvLyBUcmFuc2Zvcm0gc2l6ZSBmcm9tIDR4NCB0byAzMngzMi4KKyAgICBzcHMtPmxvZzJfbWluX2x1bWFfdHJhbnNmb3JtX2Jsb2NrX3NpemVfbWludXMyICAgPSAwOworICAgIHNwcy0+bG9nMl9kaWZmX21heF9taW5fbHVtYV90cmFuc2Zvcm1fYmxvY2tfc2l6ZSA9IDM7CisgICAgLy8gRnVsbCB0cmFuc2Zvcm0gaGllcmFyY2h5IGFsbG93ZWQgKDItNSkuCisgICAgc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlciA9IDM7CisgICAgc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYSA9IDM7CisgICAgLy8gQU1QIHdvcmtzLgorICAgIHNwcy0+YW1wX2VuYWJsZWRfZmxhZyA9IDE7CisgICAgLy8gU0FPIGFuZCB0ZW1wb3JhbCBNVlAgZG8gbm90IHdvcmsuCisgICAgc3BzLT5zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2VuYWJsZWRfZmxhZyA9IDA7CisgICAgc3BzLT5zcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyAgICAgICA9IDA7CisKKyAgICBzcHMtPnBjbV9lbmFibGVkX2ZsYWcgPSAwOworCisgICAgLy8gU1RSUFNzIHNob3VsZCBpZGVhbGx5IGJlIGhlcmUgcmF0aGVyIHRoYW4gZGVmaW5lZCBpbmRpdmlkdWFsbHkgaW4KKyAgICAvLyBlYWNoIHNsaWNlLCBidXQgdGhlIHN0cnVjdHVyZSBpc24ndCBjb21wbGV0ZWx5IGZpeGVkIHNvIGZvciBub3cKKyAgICAvLyBkb24ndCBib3RoZXIuCisgICAgc3BzLT5udW1fc2hvcnRfdGVybV9yZWZfcGljX3NldHMgICAgID0gMDsKKyAgICBzcHMtPmxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcgPSAwOworCisgICAgc3BzLT52dWlfcGFyYW1ldGVyc19wcmVzZW50X2ZsYWcgPSAxOworCisgICAgaWYgKGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSAwICYmCisgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSAwKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBBVlJhdGlvbmFsIHNhcl9pZGNbXSA9IHsKKyAgICAgICAgICAgIHsgICAwLCAgMCB9LAorICAgICAgICAgICAgeyAgIDEsICAxIH0sIHsgIDEyLCAxMSB9LCB7ICAxMCwgMTEgfSwgeyAgMTYsIDExIH0sCisgICAgICAgICAgICB7ICA0MCwgMzMgfSwgeyAgMjQsIDExIH0sIHsgIDIwLCAxMSB9LCB7ICAzMiwgMTEgfSwKKyAgICAgICAgICAgIHsgIDgwLCAzMyB9LCB7ICAxOCwgMTEgfSwgeyAgMTUsIDExIH0sIHsgIDY0LCAzMyB9LAorICAgICAgICAgICAgeyAxNjAsIDk5IH0sIHsgICA0LCAgMyB9LCB7ICAgMywgIDIgfSwgeyAgIDIsICAxIH0sCisgICAgICAgIH07CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc2FyX2lkYyk7IGkrKykgeworICAgICAgICAgICAgaWYgKGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA9PSBzYXJfaWRjW2ldLm51bSAmJgorICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9PSBzYXJfaWRjW2ldLmRlbikgeworICAgICAgICAgICAgICAgIHZ1aS0+YXNwZWN0X3JhdGlvX2lkYyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPj0gRkZfQVJSQVlfRUxFTVMoc2FyX2lkYykpIHsKKyAgICAgICAgICAgIHZ1aS0+YXNwZWN0X3JhdGlvX2lkYyA9IDI1NTsKKyAgICAgICAgICAgIHZ1aS0+c2FyX3dpZHRoICA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bTsKKyAgICAgICAgICAgIHZ1aS0+c2FyX2hlaWdodCA9IGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbjsKKyAgICAgICAgfQorICAgICAgICB2dWktPmFzcGVjdF9yYXRpb19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5jb2xvcl9yYW5nZSAgICAgIT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgYXZjdHgtPmNvbG9yX3ByaW1hcmllcyAhPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICAhPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgICAgICAhPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgdnVpLT52aWRlb19zaWduYWxfdHlwZV9wcmVzZW50X2ZsYWcgPSAxOworICAgICAgICB2dWktPnZpZGVvX2Zvcm1hdCAgICAgID0gNTsgLy8gVW5zcGVjaWZpZWQuCisgICAgICAgIHZ1aS0+dmlkZW9fZnVsbF9yYW5nZV9mbGFnID0KKyAgICAgICAgICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHOworCisgICAgICAgIGlmIChhdmN0eC0+Y29sb3JfcHJpbWFyaWVzICE9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB8fAorICAgICAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICAhPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgICAgIGF2Y3R4LT5jb2xvcnNwYWNlICAgICAgIT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICB2dWktPmNvbG91cl9kZXNjcmlwdGlvbl9wcmVzZW50X2ZsYWcgPSAxOworICAgICAgICAgICAgdnVpLT5jb2xvdXJfcHJpbWFyaWVzICAgICAgICAgPSBhdmN0eC0+Y29sb3JfcHJpbWFyaWVzOworICAgICAgICAgICAgdnVpLT50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPSBhdmN0eC0+Y29sb3JfdHJjOworICAgICAgICAgICAgdnVpLT5tYXRyaXhfY29lZmZpY2llbnRzICAgICAgPSBhdmN0eC0+Y29sb3JzcGFjZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHZ1aS0+dmlkZW9fZm9ybWF0ICAgICAgICAgICAgID0gNTsKKyAgICAgICAgdnVpLT52aWRlb19mdWxsX3JhbmdlX2ZsYWcgICAgPSAwOworICAgICAgICB2dWktPmNvbG91cl9wcmltYXJpZXMgICAgICAgICA9IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXM7CisgICAgICAgIHZ1aS0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzID0gYXZjdHgtPmNvbG9yX3RyYzsKKyAgICAgICAgdnVpLT5tYXRyaXhfY29lZmZpY2llbnRzICAgICAgPSBhdmN0eC0+Y29sb3JzcGFjZTsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gIT0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHZ1aS0+Y2hyb21hX2xvY19pbmZvX3ByZXNlbnRfZmxhZyA9IDE7CisgICAgICAgIHZ1aS0+Y2hyb21hX3NhbXBsZV9sb2NfdHlwZV90b3BfZmllbGQgICAgPQorICAgICAgICB2dWktPmNocm9tYV9zYW1wbGVfbG9jX3R5cGVfYm90dG9tX2ZpZWxkID0KKyAgICAgICAgICAgIGF2Y3R4LT5jaHJvbWFfc2FtcGxlX2xvY2F0aW9uIC0gMTsKKyAgICB9CisKKyAgICB2dWktPnZ1aV90aW1pbmdfaW5mb19wcmVzZW50X2ZsYWcgICAgICAgID0gMTsKKyAgICB2dWktPnZ1aV9udW1fdW5pdHNfaW5fdGljayAgICAgICAgICAgICAgID0gdnBzLT52cHNfbnVtX3VuaXRzX2luX3RpY2s7CisgICAgdnVpLT52dWlfdGltZV9zY2FsZSAgICAgICAgICAgICAgICAgICAgICA9IHZwcy0+dnBzX3RpbWVfc2NhbGU7CisgICAgdnVpLT52dWlfcG9jX3Byb3BvcnRpb25hbF90b190aW1pbmdfZmxhZyA9IHZwcy0+dnBzX3BvY19wcm9wb3J0aW9uYWxfdG9fdGltaW5nX2ZsYWc7CisgICAgdnVpLT52dWlfbnVtX3RpY2tzX3BvY19kaWZmX29uZV9taW51czEgICA9IHZwcy0+dnBzX251bV90aWNrc19wb2NfZGlmZl9vbmVfbWludXMxOworICAgIHZ1aS0+dnVpX2hyZF9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZyAgICAgPSAwOworCisgICAgdnVpLT5iaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZyAgICA9IDE7CisgICAgdnVpLT5tb3Rpb25fdmVjdG9yc19vdmVyX3BpY19ib3VuZGFyaWVzX2ZsYWcgPSAxOworICAgIHZ1aS0+cmVzdHJpY3RlZF9yZWZfcGljX2xpc3RzX2ZsYWcgPSAxOworICAgIHZ1aS0+bWF4X2J5dGVzX3Blcl9waWNfZGVub20gICAgICAgPSAwOworICAgIHZ1aS0+bWF4X2JpdHNfcGVyX21pbl9jdV9kZW5vbSAgICAgPSAwOworICAgIHZ1aS0+bG9nMl9tYXhfbXZfbGVuZ3RoX2hvcml6b250YWwgPSAxNTsKKyAgICB2dWktPmxvZzJfbWF4X212X2xlbmd0aF92ZXJ0aWNhbCAgID0gMTU7CisKKworICAgIC8vIFBQUworCisgICAgcHBzLT5uYWxfdW5pdF9oZWFkZXIgPSAoSDI2NVJhd05BTFVuaXRIZWFkZXIpIHsKKyAgICAgICAgLm5hbF91bml0X3R5cGUgICAgICAgICA9IEhFVkNfTkFMX1BQUywKKyAgICAgICAgLm51aF9sYXllcl9pZCAgICAgICAgICA9IDAsCisgICAgICAgIC5udWhfdGVtcG9yYWxfaWRfcGx1czEgPSAxLAorICAgIH07CisKKyAgICBwcHMtPnBwc19waWNfcGFyYW1ldGVyX3NldF9pZCA9IDA7CisgICAgcHBzLT5wcHNfc2VxX3BhcmFtZXRlcl9zZXRfaWQgPSBzcHMtPnNwc19zZXFfcGFyYW1ldGVyX3NldF9pZDsKKworICAgIHBwcy0+bnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxID0gMDsKKyAgICBwcHMtPm51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlX21pbnVzMSA9IDA7CisKKyAgICBwcHMtPmluaXRfcXBfbWludXMyNiA9IHByaXYtPmZpeGVkX3FwX2lkciAtIDI2OworCisgICAgcHBzLT5jdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWcgPSAoY3R4LT52YV9yY19tb2RlICE9IFZBX1JDX0NRUCk7CisgICAgcHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoICAgPSAwOworCisgICAgcHBzLT5wcHNfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgPSAxOworCisKKyAgICAvLyBGaWxsIFZBQVBJIHBhcmFtZXRlciBidWZmZXJzLgorCisgICAgKnZzZXEgPSAoVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlckhFVkMpIHsKKyAgICAgICAgLmdlbmVyYWxfcHJvZmlsZV9pZGMgPSB2cHMtPnByb2ZpbGVfdGllcl9sZXZlbC5nZW5lcmFsX3Byb2ZpbGVfaWRjLAorICAgICAgICAuZ2VuZXJhbF9sZXZlbF9pZGMgICA9IHZwcy0+cHJvZmlsZV90aWVyX2xldmVsLmdlbmVyYWxfbGV2ZWxfaWRjLAorICAgICAgICAuZ2VuZXJhbF90aWVyX2ZsYWcgICA9IHZwcy0+cHJvZmlsZV90aWVyX2xldmVsLmdlbmVyYWxfdGllcl9mbGFnLAorCisgICAgICAgIC5pbnRyYV9wZXJpb2QgICAgID0gYXZjdHgtPmdvcF9zaXplLAorICAgICAgICAuaW50cmFfaWRyX3BlcmlvZCA9IGF2Y3R4LT5nb3Bfc2l6ZSwKKyAgICAgICAgLmlwX3BlcmlvZCAgICAgICAgPSBjdHgtPmJfcGVyX3AgKyAxLAorICAgICAgICAuYml0c19wZXJfc2Vjb25kICAgPSBhdmN0eC0+Yml0X3JhdGUsCisKKyAgICAgICAgLnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXMgID0gc3BzLT5waWNfd2lkdGhfaW5fbHVtYV9zYW1wbGVzLAorICAgICAgICAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgPSBzcHMtPnBpY19oZWlnaHRfaW5fbHVtYV9zYW1wbGVzLAorCisgICAgICAgIC5zZXFfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAuY2hyb21hX2Zvcm1hdF9pZGMgICAgICAgICAgICAgPSBzcHMtPmNocm9tYV9mb3JtYXRfaWRjLAorICAgICAgICAgICAgLnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnICAgID0gc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZywKKyAgICAgICAgICAgIC5iaXRfZGVwdGhfbHVtYV9taW51czggICAgICAgICA9IHNwcy0+Yml0X2RlcHRoX2x1bWFfbWludXM4LAorICAgICAgICAgICAgLmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ICAgICAgID0gc3BzLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCwKKyAgICAgICAgICAgIC5zY2FsaW5nX2xpc3RfZW5hYmxlZF9mbGFnICAgICA9IHNwcy0+c2NhbGluZ19saXN0X2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5zdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZWRfZmxhZyA9CisgICAgICAgICAgICAgICAgc3BzLT5zdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5hbXBfZW5hYmxlZF9mbGFnICAgICAgICAgICAgICA9IHNwcy0+YW1wX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2VuYWJsZWRfZmxhZyA9CisgICAgICAgICAgICAgICAgc3BzLT5zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5wY21fZW5hYmxlZF9mbGFnICAgICAgICAgICAgICA9IHNwcy0+cGNtX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5wY21fbG9vcF9maWx0ZXJfZGlzYWJsZWRfZmxhZyA9IHNwcy0+cGNtX2xvb3BfZmlsdGVyX2Rpc2FibGVkX2ZsYWcsCisgICAgICAgICAgICAuc3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcgPSBzcHMtPnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnLAorICAgICAgICB9LAorCisgICAgICAgIC5sb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyA9CisgICAgICAgICAgICBzcHMtPmxvZzJfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVfbWludXMzLAorICAgICAgICAubG9nMl9kaWZmX21heF9taW5fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZSA9CisgICAgICAgICAgICBzcHMtPmxvZzJfZGlmZl9tYXhfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUsCisgICAgICAgIC5sb2cyX21pbl90cmFuc2Zvcm1fYmxvY2tfc2l6ZV9taW51czIgPQorICAgICAgICAgICAgc3BzLT5sb2cyX21pbl9sdW1hX3RyYW5zZm9ybV9ibG9ja19zaXplX21pbnVzMiwKKyAgICAgICAgLmxvZzJfZGlmZl9tYXhfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplID0KKyAgICAgICAgICAgIHNwcy0+bG9nMl9kaWZmX21heF9taW5fbHVtYV90cmFuc2Zvcm1fYmxvY2tfc2l6ZSwKKyAgICAgICAgLm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyID0KKyAgICAgICAgICAgIHNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50ZXIsCisgICAgICAgIC5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYSA9CisgICAgICAgICAgICBzcHMtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhLAorCisgICAgICAgIC5wY21fc2FtcGxlX2JpdF9kZXB0aF9sdW1hX21pbnVzMSA9CisgICAgICAgICAgICBzcHMtPnBjbV9zYW1wbGVfYml0X2RlcHRoX2x1bWFfbWludXMxLAorICAgICAgICAucGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hX21pbnVzMSA9CisgICAgICAgICAgICBzcHMtPnBjbV9zYW1wbGVfYml0X2RlcHRoX2Nocm9tYV9taW51czEsCisgICAgICAgIC5sb2cyX21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgPQorICAgICAgICAgICAgc3BzLT5sb2cyX21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMsCisgICAgICAgIC5sb2cyX21heF9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgPQorICAgICAgICAgICAgc3BzLT5sb2cyX21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZV9taW51czMgKworICAgICAgICAgICAgc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZSwKKworICAgICAgICAudnVpX3BhcmFtZXRlcnNfcHJlc2VudF9mbGFnID0gMCwKKyAgICB9OworCisgICAgKnZwaWMgPSAoVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVySEVWQykgeworICAgICAgICAuZGVjb2RlZF9jdXJyX3BpYyA9IHsKKyAgICAgICAgICAgIC5waWN0dXJlX2lkID0gVkFfSU5WQUxJRF9JRCwKKyAgICAgICAgICAgIC5mbGFncyAgICAgID0gVkFfUElDVFVSRV9IRVZDX0lOVkFMSUQsCisgICAgICAgIH0sCisKKyAgICAgICAgLmNvZGVkX2J1ZiA9IFZBX0lOVkFMSURfSUQsCisKKyAgICAgICAgLmNvbGxvY2F0ZWRfcmVmX3BpY19pbmRleCA9IDB4ZmYsCisKKyAgICAgICAgLmxhc3RfcGljdHVyZSA9IDAsCisKKyAgICAgICAgLnBpY19pbml0X3FwICAgICAgICAgICAgPSBwcHMtPmluaXRfcXBfbWludXMyNiArIDI2LAorICAgICAgICAuZGlmZl9jdV9xcF9kZWx0YV9kZXB0aCA9IHBwcy0+ZGlmZl9jdV9xcF9kZWx0YV9kZXB0aCwKKyAgICAgICAgLnBwc19jYl9xcF9vZmZzZXQgICAgICAgPSBwcHMtPnBwc19jYl9xcF9vZmZzZXQsCisgICAgICAgIC5wcHNfY3JfcXBfb2Zmc2V0ICAgICAgID0gcHBzLT5wcHNfY3JfcXBfb2Zmc2V0LAorCisgICAgICAgIC5udW1fdGlsZV9jb2x1bW5zX21pbnVzMSA9IHBwcy0+bnVtX3RpbGVfY29sdW1uc19taW51czEsCisgICAgICAgIC5udW1fdGlsZV9yb3dzX21pbnVzMSAgICA9IHBwcy0+bnVtX3RpbGVfcm93c19taW51czEsCisKKyAgICAgICAgLmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyID0gcHBzLT5sb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsX21pbnVzMiwKKyAgICAgICAgLmN0dV9tYXhfYml0c2l6ZV9hbGxvd2VkICAgICAgICAgID0gMCwKKworICAgICAgICAubnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxID0KKyAgICAgICAgICAgIHBwcy0+bnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxLAorICAgICAgICAubnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxID0KKyAgICAgICAgICAgIHBwcy0+bnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxLAorCisgICAgICAgIC5zbGljZV9waWNfcGFyYW1ldGVyX3NldF9pZCA9IHBwcy0+cHBzX3BpY19wYXJhbWV0ZXJfc2V0X2lkLAorCisgICAgICAgIC5waWNfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAuc2lnbl9kYXRhX2hpZGluZ19lbmFibGVkX2ZsYWcgID0gcHBzLT5zaWduX2RhdGFfaGlkaW5nX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgICAgPSBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZywKKyAgICAgICAgICAgIC50cmFuc2Zvcm1fc2tpcF9lbmFibGVkX2ZsYWcgICAgPSBwcHMtPnRyYW5zZm9ybV9za2lwX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5jdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWcgICAgICAgPSBwcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC53ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICAgPSBwcHMtPndlaWdodGVkX3ByZWRfZmxhZywKKyAgICAgICAgICAgIC53ZWlnaHRlZF9iaXByZWRfZmxhZyAgICAgICAgICAgPSBwcHMtPndlaWdodGVkX2JpcHJlZF9mbGFnLAorICAgICAgICAgICAgLnRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZWRfZmxhZyA9IHBwcy0+dHJhbnNxdWFudF9ieXBhc3NfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLnRpbGVzX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICA9IHBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLmVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnID0gcHBzLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5sb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnID0KKyAgICAgICAgICAgICAgICBwcHMtPmxvb3BfZmlsdGVyX2Fjcm9zc190aWxlc19lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAuc2NhbGluZ19saXN0X2RhdGFfcHJlc2VudF9mbGFnID0gKHNwcy0+c3BzX3NjYWxpbmdfbGlzdF9kYXRhX3ByZXNlbnRfZmxhZyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcy0+cHBzX3NjYWxpbmdfbGlzdF9kYXRhX3ByZXNlbnRfZmxhZyksCisgICAgICAgICAgICAuc2NyZWVuX2NvbnRlbnRfZmxhZyAgICAgICAgICAgID0gMCwKKyAgICAgICAgICAgIC5lbmFibGVfZ3B1X3dlaWdodGVkX3ByZWRpY3Rpb24gPSAwLAorICAgICAgICAgICAgLm5vX291dHB1dF9vZl9wcmlvcl9waWNzX2ZsYWcgICA9IDAsCisgICAgICAgIH0sCisgICAgfTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9oMjY1X2luaXRfcGljdHVyZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljKQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgICAgICAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NUNvbnRleHQgICAgICAgICAgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjVPcHRpb25zICAgICAgICAgICAqb3B0ID0gY3R4LT5jb2RlY19vcHRpb25zOworICAgIFZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlckhFVkMgKnZwaWMgPSBwaWMtPmNvZGVjX3BpY3R1cmVfcGFyYW1zOworICAgIGludCBpOworCisgICAgaWYgKHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfSURSKSB7CisgICAgICAgIGF2X2Fzc2VydDAocGljLT5kaXNwbGF5X29yZGVyID09IHBpYy0+ZW5jb2RlX29yZGVyKTsKKworICAgICAgICBwcml2LT5sYXN0X2lkcl9mcmFtZSA9IHBpYy0+ZGlzcGxheV9vcmRlcjsKKworICAgICAgICBwcml2LT5zbGljZV9uYWxfdW5pdCA9IEhFVkNfTkFMX0lEUl9XX1JBREw7CisgICAgICAgIHByaXYtPnNsaWNlX3R5cGUgICAgID0gSEVWQ19TTElDRV9JOworICAgICAgICBwcml2LT5waWNfdHlwZSAgICAgICA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYXNzZXJ0MChwaWMtPmVuY29kZV9vcmRlciA+IHByaXYtPmxhc3RfaWRyX2ZyYW1lKTsKKworICAgICAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgICAgICBwcml2LT5zbGljZV9uYWxfdW5pdCA9IEhFVkNfTkFMX0NSQV9OVVQ7CisgICAgICAgICAgICBwcml2LT5zbGljZV90eXBlICAgICA9IEhFVkNfU0xJQ0VfSTsKKyAgICAgICAgICAgIHByaXYtPnBpY190eXBlICAgICAgID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX1ApIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAocGljLT5yZWZzWzBdKTsKKyAgICAgICAgICAgIHByaXYtPnNsaWNlX25hbF91bml0ID0gSEVWQ19OQUxfVFJBSUxfUjsKKyAgICAgICAgICAgIHByaXYtPnNsaWNlX3R5cGUgICAgID0gSEVWQ19TTElDRV9QOworICAgICAgICAgICAgcHJpdi0+cGljX3R5cGUgICAgICAgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfYXNzZXJ0MChwaWMtPnJlZnNbMF0gJiYgcGljLT5yZWZzWzFdKTsKKyAgICAgICAgICAgIGlmIChwaWMtPnJlZnNbMV0tPnR5cGUgPT0gUElDVFVSRV9UWVBFX0kpCisgICAgICAgICAgICAgICAgcHJpdi0+c2xpY2VfbmFsX3VuaXQgPSBIRVZDX05BTF9SQVNMX047CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpdi0+c2xpY2VfbmFsX3VuaXQgPSBIRVZDX05BTF9UUkFJTF9OOworICAgICAgICAgICAgcHJpdi0+c2xpY2VfdHlwZSA9IEhFVkNfU0xJQ0VfQjsKKyAgICAgICAgICAgIHByaXYtPnBpY190eXBlICAgPSAyOworICAgICAgICB9CisgICAgfQorICAgIHByaXYtPnBpY19vcmRlcl9jbnQgPSBwaWMtPmRpc3BsYXlfb3JkZXIgLSBwcml2LT5sYXN0X2lkcl9mcmFtZTsKKworICAgIGlmIChvcHQtPmF1ZCkgeworICAgICAgICBwcml2LT5hdWRfbmVlZGVkID0gMTsKKyAgICAgICAgcHJpdi0+YXVkLm5hbF91bml0X2hlYWRlciA9IChIMjY1UmF3TkFMVW5pdEhlYWRlcikgeworICAgICAgICAgICAgLm5hbF91bml0X3R5cGUgICAgICAgICA9IEhFVkNfTkFMX0FVRCwKKyAgICAgICAgICAgIC5udWhfbGF5ZXJfaWQgICAgICAgICAgPSAwLAorICAgICAgICAgICAgLm51aF90ZW1wb3JhbF9pZF9wbHVzMSA9IDEsCisgICAgICAgIH07CisgICAgICAgIHByaXYtPmF1ZC5waWNfdHlwZSA9IHByaXYtPnBpY190eXBlOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaXYtPmF1ZF9uZWVkZWQgPSAwOworICAgIH0KKworICAgIHZwaWMtPmRlY29kZWRfY3Vycl9waWMgPSAoVkFQaWN0dXJlSEVWQykgeworICAgICAgICAucGljdHVyZV9pZCAgICA9IHBpYy0+cmVjb25fc3VyZmFjZSwKKyAgICAgICAgLnBpY19vcmRlcl9jbnQgPSBwcml2LT5waWNfb3JkZXJfY250LAorICAgICAgICAuZmxhZ3MgICAgICAgICA9IDAsCisgICAgfTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwaWMtPm5iX3JlZnM7IGkrKykgeworICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnJlZiA9IHBpYy0+cmVmc1tpXTsKKyAgICAgICAgYXZfYXNzZXJ0MChyZWYgJiYgcmVmLT5lbmNvZGVfb3JkZXIgPCBwaWMtPmVuY29kZV9vcmRlcik7CisKKyAgICAgICAgdnBpYy0+cmVmZXJlbmNlX2ZyYW1lc1tpXSA9IChWQVBpY3R1cmVIRVZDKSB7CisgICAgICAgICAgICAucGljdHVyZV9pZCAgICA9IHJlZi0+cmVjb25fc3VyZmFjZSwKKyAgICAgICAgICAgIC5waWNfb3JkZXJfY250ID0gcmVmLT5kaXNwbGF5X29yZGVyIC0gcHJpdi0+bGFzdF9pZHJfZnJhbWUsCisgICAgICAgICAgICAuZmxhZ3MgPSAocmVmLT5kaXNwbGF5X29yZGVyIDwgcGljLT5kaXNwbGF5X29yZGVyID8KKyAgICAgICAgICAgICAgICAgICAgICBWQV9QSUNUVVJFX0hFVkNfUlBTX1NUX0NVUlJfQkVGT1JFIDogMCkgfAorICAgICAgICAgICAgICAgICAgICAgKHJlZi0+ZGlzcGxheV9vcmRlciA+IHBpYy0+ZGlzcGxheV9vcmRlciA/CisgICAgICAgICAgICAgICAgICAgICAgVkFfUElDVFVSRV9IRVZDX1JQU19TVF9DVVJSX0FGVEVSICA6IDApLAorICAgICAgICB9OworICAgIH0KKyAgICBmb3IgKDsgaSA8IEZGX0FSUkFZX0VMRU1TKHZwaWMtPnJlZmVyZW5jZV9mcmFtZXMpOyBpKyspIHsKKyAgICAgICAgdnBpYy0+cmVmZXJlbmNlX2ZyYW1lc1tpXSA9IChWQVBpY3R1cmVIRVZDKSB7CisgICAgICAgICAgICAucGljdHVyZV9pZCA9IFZBX0lOVkFMSURfSUQsCisgICAgICAgICAgICAuZmxhZ3MgICAgICA9IFZBX1BJQ1RVUkVfSEVWQ19JTlZBTElELAorICAgICAgICB9OworICAgIH0KKworICAgIHZwaWMtPmNvZGVkX2J1ZiA9IHBpYy0+b3V0cHV0X2J1ZmZlcjsKKworICAgIHZwaWMtPm5hbF91bml0X3R5cGUgPSBwcml2LT5zbGljZV9uYWxfdW5pdDsKKworICAgIHN3aXRjaCAocGljLT50eXBlKSB7CisgICAgY2FzZSBQSUNUVVJFX1RZUEVfSURSOgorICAgICAgICB2cGljLT5waWNfZmllbGRzLmJpdHMuaWRyX3BpY19mbGFnICAgICAgID0gMTsKKyAgICAgICAgdnBpYy0+cGljX2ZpZWxkcy5iaXRzLmNvZGluZ190eXBlICAgICAgICA9IDE7CisgICAgICAgIHZwaWMtPnBpY19maWVsZHMuYml0cy5yZWZlcmVuY2VfcGljX2ZsYWcgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBJQ1RVUkVfVFlQRV9JOgorICAgICAgICB2cGljLT5waWNfZmllbGRzLmJpdHMuaWRyX3BpY19mbGFnICAgICAgID0gMDsKKyAgICAgICAgdnBpYy0+cGljX2ZpZWxkcy5iaXRzLmNvZGluZ190eXBlICAgICAgICA9IDE7CisgICAgICAgIHZwaWMtPnBpY19maWVsZHMuYml0cy5yZWZlcmVuY2VfcGljX2ZsYWcgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBJQ1RVUkVfVFlQRV9QOgorICAgICAgICB2cGljLT5waWNfZmllbGRzLmJpdHMuaWRyX3BpY19mbGFnICAgICAgID0gMDsKKyAgICAgICAgdnBpYy0+cGljX2ZpZWxkcy5iaXRzLmNvZGluZ190eXBlICAgICAgICA9IDI7CisgICAgICAgIHZwaWMtPnBpY19maWVsZHMuYml0cy5yZWZlcmVuY2VfcGljX2ZsYWcgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBJQ1RVUkVfVFlQRV9COgorICAgICAgICB2cGljLT5waWNfZmllbGRzLmJpdHMuaWRyX3BpY19mbGFnICAgICAgID0gMDsKKyAgICAgICAgdnBpYy0+cGljX2ZpZWxkcy5iaXRzLmNvZGluZ190eXBlICAgICAgICA9IDM7CisgICAgICAgIHZwaWMtPnBpY19maWVsZHMuYml0cy5yZWZlcmVuY2VfcGljX2ZsYWcgPSAwOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDAgJiYgImludmFsaWQgcGljdHVyZSB0eXBlIik7CisgICAgfQorCisgICAgcGljLT5uYl9zbGljZXMgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX2gyNjVfaW5pdF9zbGljZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVTbGljZSAqc2xpY2UpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NUNvbnRleHQgICAgICAgICAgICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgSDI2NVJhd1NQUyAgICAgICAgICAgICAgICAgICpzcHMgPSAmcHJpdi0+c3BzOworICAgIGNvbnN0IEgyNjVSYXdQUFMgICAgICAgICAgICAgICAgICAqcHBzID0gJnByaXYtPnBwczsKKyAgICBIMjY1UmF3U2xpY2VIZWFkZXIgICAgICAgICAgICAgICAgICpzaCA9ICZwcml2LT5zbGljZS5oZWFkZXI7CisgICAgVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVySEVWQyAgKnZwaWMgPSBwaWMtPmNvZGVjX3BpY3R1cmVfcGFyYW1zOworICAgIFZBRW5jU2xpY2VQYXJhbWV0ZXJCdWZmZXJIRVZDICAqdnNsaWNlID0gc2xpY2UtPmNvZGVjX3NsaWNlX3BhcmFtczsKKyAgICBpbnQgaTsKKworICAgIHNoLT5uYWxfdW5pdF9oZWFkZXIgPSAoSDI2NVJhd05BTFVuaXRIZWFkZXIpIHsKKyAgICAgICAgLm5hbF91bml0X3R5cGUgICAgICAgICA9IHByaXYtPnNsaWNlX25hbF91bml0LAorICAgICAgICAubnVoX2xheWVyX2lkICAgICAgICAgID0gMCwKKyAgICAgICAgLm51aF90ZW1wb3JhbF9pZF9wbHVzMSA9IDEsCisgICAgfTsKKworICAgIHNoLT5zbGljZV9waWNfcGFyYW1ldGVyX3NldF9pZCAgICAgID0gcHBzLT5wcHNfcGljX3BhcmFtZXRlcl9zZXRfaWQ7CisKKyAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG9uZSBzbGljZSBwZXIgZnJhbWUuCisgICAgc2gtPmZpcnN0X3NsaWNlX3NlZ21lbnRfaW5fcGljX2ZsYWcgPSAxOworICAgIHNoLT5zbGljZV9zZWdtZW50X2FkZHJlc3MgICAgICAgICAgID0gMDsKKworICAgIHNoLT5zbGljZV90eXBlID0gcHJpdi0+c2xpY2VfdHlwZTsKKworICAgIHNoLT5zbGljZV9waWNfb3JkZXJfY250X2xzYiA9IHByaXYtPnBpY19vcmRlcl9jbnQgJgorICAgICAgICAoMSA8PCAoc3BzLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgKyA0KSkgLSAxOworCisgICAgaWYgKHBpYy0+dHlwZSAhPSBQSUNUVVJFX1RZUEVfSURSKSB7CisgICAgICAgIEgyNjVSYXdTVFJlZlBpY1NldCAqcnBzOworICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnN0OworICAgICAgICBpbnQgdXNlZDsKKworICAgICAgICBzaC0+c2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZyA9IDA7CisKKyAgICAgICAgcnBzID0gJnNoLT5zaG9ydF90ZXJtX3JlZl9waWNfc2V0OworICAgICAgICBtZW1zZXQocnBzLCAwLCBzaXplb2YoKnJwcykpOworCisgICAgICAgIGZvciAoc3QgPSBjdHgtPnBpY19zdGFydDsgc3Q7IHN0ID0gc3QtPm5leHQpIHsKKyAgICAgICAgICAgIGlmIChzdC0+ZW5jb2RlX29yZGVyID49IHBpYy0+ZW5jb2RlX29yZGVyKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IHlldCBpbiBEUEIuCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1c2VkID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwaWMtPm5iX3JlZnM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwaWMtPnJlZnNbaV0gPT0gc3QpCisgICAgICAgICAgICAgICAgICAgIHVzZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF1c2VkKSB7CisgICAgICAgICAgICAgICAgLy8gVXN1YWxseSBlYWNoIHBpY3R1cmUgYWx3YXlzIHVzZXMgYWxsIG9mIHRoZSBvdGhlcnMgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gRFBCIGFzIHJlZmVyZW5jZXMuICBUaGUgb25lIGNhc2Ugd2UgaGF2ZSB0byB0cmVhdCBoZXJlIGlzCisgICAgICAgICAgICAgICAgLy8gYSBub24tSURSIElSQVAgcGljdHVyZSwgd2hpY2ggbWF5IG5lZWQgdG8gaG9sZCB1bnVzZWQKKyAgICAgICAgICAgICAgICAvLyByZWZlcmVuY2VzIGFjcm9zcyBpdHNlbGYgdG8gYmUgdXNlZCBmb3IgdGhlIGRlY29kaW5nIG9mCisgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIFJBU0wgcGljdHVyZXMuICBUaGlzIGxvb2tzIGZvciBzdWNoIGFuIFJBU0wKKyAgICAgICAgICAgICAgICAvLyBwaWN0dXJlLCBhbmQga2VlcHMgdGhlIHJlZmVyZW5jZSBpZiB0aGVyZSBpcyBvbmUuCisgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpycDsKKyAgICAgICAgICAgICAgICBmb3IgKHJwID0gY3R4LT5waWNfc3RhcnQ7IHJwOyBycCA9IHJwLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChycC0+ZW5jb2RlX29yZGVyIDwgcGljLT5lbmNvZGVfb3JkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJwLT50eXBlICE9IFBJQ1RVUkVfVFlQRV9CKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChycC0+cmVmc1swXSA9PSBzdCAmJiBycC0+cmVmc1sxXSA9PSBwaWMpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFycCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGlzIG9ubHkgd29ya3MgZm9yIG9uZSBpbnN0YW5jZSBvZiBlYWNoIChkZWx0YV9wb2Nfc05fbWludXMxCisgICAgICAgICAgICAvLyBpcyByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgZnJhbWUgaW4gdGhlIGxpc3QsIG5vdCByZWxhdGl2ZSB0bworICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgZnJhbWUgZGlyZWN0bHkpLgorICAgICAgICAgICAgaWYgKHN0LT5kaXNwbGF5X29yZGVyIDwgcGljLT5kaXNwbGF5X29yZGVyKSB7CisgICAgICAgICAgICAgICAgcnBzLT5kZWx0YV9wb2NfczBfbWludXMxW3Jwcy0+bnVtX25lZ2F0aXZlX3BpY3NdID0KKyAgICAgICAgICAgICAgICAgICAgcGljLT5kaXNwbGF5X29yZGVyIC0gc3QtPmRpc3BsYXlfb3JkZXIgLSAxOworICAgICAgICAgICAgICAgIHJwcy0+dXNlZF9ieV9jdXJyX3BpY19zMF9mbGFnW3Jwcy0+bnVtX25lZ2F0aXZlX3BpY3NdID0gdXNlZDsKKyAgICAgICAgICAgICAgICArK3Jwcy0+bnVtX25lZ2F0aXZlX3BpY3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJwcy0+ZGVsdGFfcG9jX3MxX21pbnVzMVtycHMtPm51bV9wb3NpdGl2ZV9waWNzXSA9CisgICAgICAgICAgICAgICAgICAgIHN0LT5kaXNwbGF5X29yZGVyIC0gcGljLT5kaXNwbGF5X29yZGVyIC0gMTsKKyAgICAgICAgICAgICAgICBycHMtPnVzZWRfYnlfY3Vycl9waWNfczFfZmxhZ1tycHMtPm51bV9wb3NpdGl2ZV9waWNzXSA9IHVzZWQ7CisgICAgICAgICAgICAgICAgKytycHMtPm51bV9wb3NpdGl2ZV9waWNzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2gtPm51bV9sb25nX3Rlcm1fc3BzICA9IDA7CisgICAgICAgIHNoLT5udW1fbG9uZ190ZXJtX3BpY3MgPSAwOworCisgICAgICAgIHNoLT5zbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnID0KKyAgICAgICAgICAgIHNwcy0+c3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWc7CisgICAgICAgIGlmIChzaC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZykgeworICAgICAgICAgICAgc2gtPmNvbGxvY2F0ZWRfZnJvbV9sMF9mbGFnID0gc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9COworICAgICAgICAgICAgc2gtPmNvbGxvY2F0ZWRfcmVmX2lkeCAgICAgID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHNoLT5udW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZyA9IDA7CisgICAgICAgIHNoLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gcHBzLT5udW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZV9taW51czE7CisgICAgICAgIHNoLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0gcHBzLT5udW1fcmVmX2lkeF9sMV9kZWZhdWx0X2FjdGl2ZV9taW51czE7CisgICAgfQorCisgICAgc2gtPnNsaWNlX3Nhb19sdW1hX2ZsYWcgPSBzaC0+c2xpY2Vfc2FvX2Nocm9tYV9mbGFnID0KKyAgICAgICAgc3BzLT5zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2VuYWJsZWRfZmxhZzsKKworICAgIGlmIChwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0IpCisgICAgICAgIHNoLT5zbGljZV9xcF9kZWx0YSA9IHByaXYtPmZpeGVkX3FwX2IgLSAocHBzLT5pbml0X3FwX21pbnVzMjYgKyAyNik7CisgICAgZWxzZSBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9QKQorICAgICAgICBzaC0+c2xpY2VfcXBfZGVsdGEgPSBwcml2LT5maXhlZF9xcF9wIC0gKHBwcy0+aW5pdF9xcF9taW51czI2ICsgMjYpOworICAgIGVsc2UKKyAgICAgICAgc2gtPnNsaWNlX3FwX2RlbHRhID0gcHJpdi0+Zml4ZWRfcXBfaWRyIC0gKHBwcy0+aW5pdF9xcF9taW51czI2ICsgMjYpOworCisKKyAgICAqdnNsaWNlID0gKFZBRW5jU2xpY2VQYXJhbWV0ZXJCdWZmZXJIRVZDKSB7CisgICAgICAgIC5zbGljZV9zZWdtZW50X2FkZHJlc3MgPSBzaC0+c2xpY2Vfc2VnbWVudF9hZGRyZXNzLAorICAgICAgICAubnVtX2N0dV9pbl9zbGljZSAgICAgID0gcHJpdi0+Y3R1X3dpZHRoICogcHJpdi0+Y3R1X2hlaWdodCwKKworICAgICAgICAuc2xpY2VfdHlwZSAgICAgICAgICAgICAgICAgPSBzaC0+c2xpY2VfdHlwZSwKKyAgICAgICAgLnNsaWNlX3BpY19wYXJhbWV0ZXJfc2V0X2lkID0gc2gtPnNsaWNlX3BpY19wYXJhbWV0ZXJfc2V0X2lkLAorCisgICAgICAgIC5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gc2gtPm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEsCisgICAgICAgIC5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxID0gc2gtPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEsCisKKyAgICAgICAgLmx1bWFfbG9nMl93ZWlnaHRfZGVub20gICAgICAgICA9IHNoLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLAorICAgICAgICAuZGVsdGFfY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gc2gtPmRlbHRhX2Nocm9tYV9sb2cyX3dlaWdodF9kZW5vbSwKKworICAgICAgICAubWF4X251bV9tZXJnZV9jYW5kID0gNSAtIHNoLT5maXZlX21pbnVzX21heF9udW1fbWVyZ2VfY2FuZCwKKworICAgICAgICAuc2xpY2VfcXBfZGVsdGEgICAgID0gc2gtPnNsaWNlX3FwX2RlbHRhLAorICAgICAgICAuc2xpY2VfY2JfcXBfb2Zmc2V0ID0gc2gtPnNsaWNlX2NiX3FwX29mZnNldCwKKyAgICAgICAgLnNsaWNlX2NyX3FwX29mZnNldCA9IHNoLT5zbGljZV9jcl9xcF9vZmZzZXQsCisKKyAgICAgICAgLnNsaWNlX2JldGFfb2Zmc2V0X2RpdjIgPSBzaC0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2MiwKKyAgICAgICAgLnNsaWNlX3RjX29mZnNldF9kaXYyICAgPSBzaC0+c2xpY2VfdGNfb2Zmc2V0X2RpdjIsCisKKyAgICAgICAgLnNsaWNlX2ZpZWxkcy5iaXRzID0geworICAgICAgICAgICAgLmxhc3Rfc2xpY2Vfb2ZfcGljX2ZsYWcgICAgICAgPSAxLAorICAgICAgICAgICAgLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgPSBzaC0+ZGVwZW5kZW50X3NsaWNlX3NlZ21lbnRfZmxhZywKKyAgICAgICAgICAgIC5jb2xvdXJfcGxhbmVfaWQgICAgICAgICAgICAgID0gc2gtPmNvbG91cl9wbGFuZV9pZCwKKyAgICAgICAgICAgIC5zbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnID0KKyAgICAgICAgICAgICAgICBzaC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5zbGljZV9zYW9fbHVtYV9mbGFnICAgICAgICAgID0gc2gtPnNsaWNlX3Nhb19sdW1hX2ZsYWcsCisgICAgICAgICAgICAuc2xpY2Vfc2FvX2Nocm9tYV9mbGFnICAgICAgICA9IHNoLT5zbGljZV9zYW9fY2hyb21hX2ZsYWcsCisgICAgICAgICAgICAubnVtX3JlZl9pZHhfYWN0aXZlX292ZXJyaWRlX2ZsYWcgPQorICAgICAgICAgICAgICAgIHNoLT5udW1fcmVmX2lkeF9hY3RpdmVfb3ZlcnJpZGVfZmxhZywKKyAgICAgICAgICAgIC5tdmRfbDFfemVyb19mbGFnICAgICAgICAgICAgID0gc2gtPm12ZF9sMV96ZXJvX2ZsYWcsCisgICAgICAgICAgICAuY2FiYWNfaW5pdF9mbGFnICAgICAgICAgICAgICA9IHNoLT5jYWJhY19pbml0X2ZsYWcsCisgICAgICAgICAgICAuc2xpY2VfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyA9CisgICAgICAgICAgICAgICAgc2gtPnNsaWNlX2RlYmxvY2tpbmdfZmlsdGVyX2Rpc2FibGVkX2ZsYWcsCisgICAgICAgICAgICAuc2xpY2VfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgPQorICAgICAgICAgICAgICAgIHNoLT5zbGljZV9sb29wX2ZpbHRlcl9hY3Jvc3Nfc2xpY2VzX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5jb2xsb2NhdGVkX2Zyb21fbDBfZmxhZyAgICAgID0gc2gtPmNvbGxvY2F0ZWRfZnJvbV9sMF9mbGFnLAorICAgICAgICB9LAorICAgIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModnNsaWNlLT5yZWZfcGljX2xpc3QwKTsgaSsrKSB7CisgICAgICAgIHZzbGljZS0+cmVmX3BpY19saXN0MFtpXS5waWN0dXJlX2lkID0gVkFfSU5WQUxJRF9JRDsKKyAgICAgICAgdnNsaWNlLT5yZWZfcGljX2xpc3QwW2ldLmZsYWdzICAgICAgPSBWQV9QSUNUVVJFX0hFVkNfSU5WQUxJRDsKKyAgICAgICAgdnNsaWNlLT5yZWZfcGljX2xpc3QxW2ldLnBpY3R1cmVfaWQgPSBWQV9JTlZBTElEX0lEOworICAgICAgICB2c2xpY2UtPnJlZl9waWNfbGlzdDFbaV0uZmxhZ3MgICAgICA9IFZBX1BJQ1RVUkVfSEVWQ19JTlZBTElEOworICAgIH0KKworICAgIGF2X2Fzc2VydDAocGljLT5uYl9yZWZzIDw9IDIpOworICAgIGlmIChwaWMtPm5iX3JlZnMgPj0gMSkgeworICAgICAgICAvLyBCYWNrd2FyZCByZWZlcmVuY2UgZm9yIFAtIG9yIEItZnJhbWUuCisgICAgICAgIGF2X2Fzc2VydDAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9QIHx8CisgICAgICAgICAgICAgICAgICAgcGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9CKTsKKyAgICAgICAgdnNsaWNlLT5yZWZfcGljX2xpc3QwWzBdID0gdnBpYy0+cmVmZXJlbmNlX2ZyYW1lc1swXTsKKyAgICB9CisgICAgaWYgKHBpYy0+bmJfcmVmcyA+PSAyKSB7CisgICAgICAgIC8vIEZvcndhcmQgcmVmZXJlbmNlIGZvciBCLWZyYW1lLgorICAgICAgICBhdl9hc3NlcnQwKHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfQik7CisgICAgICAgIHZzbGljZS0+cmVmX3BpY19saXN0MVswXSA9IHZwaWMtPnJlZmVyZW5jZV9mcmFtZXNbMV07CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWFwaV9lbmNvZGVfaDI2NV9jb25maWd1cmUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlSDI2NUNvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjVPcHRpb25zICAqb3B0ID0gY3R4LT5jb2RlY19vcHRpb25zOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBmZl9jYnNfaW5pdCgmcHJpdi0+Y2JjLCBBVl9DT0RFQ19JRF9IRVZDLCBhdmN0eCk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBwcml2LT5jdHVfd2lkdGggICAgID0gRkZBTElHTihjdHgtPnN1cmZhY2Vfd2lkdGgsICAzMikgLyAzMjsKKyAgICBwcml2LT5jdHVfaGVpZ2h0ICAgID0gRkZBTElHTihjdHgtPnN1cmZhY2VfaGVpZ2h0LCAzMikgLyAzMjsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJJbnB1dCAldXgldSAtPiBTdXJmYWNlICV1eCV1IC0+IENUVSAldXgldS5cbiIsCisgICAgICAgICAgIGF2Y3R4LT53aWR0aCwgYXZjdHgtPmhlaWdodCwgY3R4LT5zdXJmYWNlX3dpZHRoLAorICAgICAgICAgICBjdHgtPnN1cmZhY2VfaGVpZ2h0LCBwcml2LT5jdHVfd2lkdGgsIHByaXYtPmN0dV9oZWlnaHQpOworCisgICAgaWYgKGN0eC0+dmFfcmNfbW9kZSA9PSBWQV9SQ19DUVApIHsKKyAgICAgICAgcHJpdi0+Zml4ZWRfcXBfcCA9IG9wdC0+cXA7CisgICAgICAgIGlmIChhdmN0eC0+aV9xdWFudF9mYWN0b3IgPiAwLjApCisgICAgICAgICAgICBwcml2LT5maXhlZF9xcF9pZHIgPSAoaW50KSgocHJpdi0+Zml4ZWRfcXBfcCAqIGF2Y3R4LT5pX3F1YW50X2ZhY3RvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmlfcXVhbnRfb2Zmc2V0KSArIDAuNSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaXYtPmZpeGVkX3FwX2lkciA9IHByaXYtPmZpeGVkX3FwX3A7CisgICAgICAgIGlmIChhdmN0eC0+Yl9xdWFudF9mYWN0b3IgPiAwLjApCisgICAgICAgICAgICBwcml2LT5maXhlZF9xcF9iID0gKGludCkoKHByaXYtPmZpeGVkX3FwX3AgKiBhdmN0eC0+Yl9xdWFudF9mYWN0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yl9xdWFudF9vZmZzZXQpICsgMC41KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpdi0+Zml4ZWRfcXBfYiA9IHByaXYtPmZpeGVkX3FwX3A7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyBmaXhlZCBRUCA9ICIKKyAgICAgICAgICAgICAgICIlZCAvICVkIC8gJWQgZm9yIElEUi0gLyBQLSAvIEItZnJhbWVzLlxuIiwKKyAgICAgICAgICAgICAgIHByaXYtPmZpeGVkX3FwX2lkciwgcHJpdi0+Zml4ZWRfcXBfcCwgcHJpdi0+Zml4ZWRfcXBfYik7CisKKyAgICB9IGVsc2UgaWYgKGN0eC0+dmFfcmNfbW9kZSA9PSBWQV9SQ19DQlIgfHwKKyAgICAgICAgICAgICAgIGN0eC0+dmFfcmNfbW9kZSA9PSBWQV9SQ19WQlIpIHsKKyAgICAgICAgLy8gVGhlc2Ugc3RpbGwgbmVlZCB0byBiZSAgc2V0IGZvciBwaWNfaW5pdF9xcC9zbGljZV9xcF9kZWx0YS4KKyAgICAgICAgcHJpdi0+Zml4ZWRfcXBfaWRyID0gMzA7CisgICAgICAgIHByaXYtPmZpeGVkX3FwX3AgICA9IDMwOworICAgICAgICBwcml2LT5maXhlZF9xcF9iICAgPSAzMDsKKworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlVzaW5nICVzLWJpdHJhdGUgPSAlIlBSSWQ2NCIgYnBzLlxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+dmFfcmNfbW9kZSA9PSBWQV9SQ19DQlIgPyAiY29uc3RhbnQiIDogInZhcmlhYmxlIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQwKDAgJiYgIkludmFsaWQgUkMgbW9kZS4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IFZBQVBJRW5jb2RlVHlwZSB2YWFwaV9lbmNvZGVfdHlwZV9oMjY1ID0geworICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoVkFBUElFbmNvZGVIMjY1Q29udGV4dCksCisKKyAgICAuY29uZmlndXJlICAgICAgICAgICAgID0gJnZhYXBpX2VuY29kZV9oMjY1X2NvbmZpZ3VyZSwKKworICAgIC5zZXF1ZW5jZV9wYXJhbXNfc2l6ZSAgPSBzaXplb2YoVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlckhFVkMpLAorICAgIC5pbml0X3NlcXVlbmNlX3BhcmFtcyAgPSAmdmFhcGlfZW5jb2RlX2gyNjVfaW5pdF9zZXF1ZW5jZV9wYXJhbXMsCisKKyAgICAucGljdHVyZV9wYXJhbXNfc2l6ZSAgID0gc2l6ZW9mKFZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlckhFVkMpLAorICAgIC5pbml0X3BpY3R1cmVfcGFyYW1zICAgPSAmdmFhcGlfZW5jb2RlX2gyNjVfaW5pdF9waWN0dXJlX3BhcmFtcywKKworICAgIC5zbGljZV9wYXJhbXNfc2l6ZSAgICAgPSBzaXplb2YoVkFFbmNTbGljZVBhcmFtZXRlckJ1ZmZlckhFVkMpLAorICAgIC5pbml0X3NsaWNlX3BhcmFtcyAgICAgPSAmdmFhcGlfZW5jb2RlX2gyNjVfaW5pdF9zbGljZV9wYXJhbXMsCisKKyAgICAuc2VxdWVuY2VfaGVhZGVyX3R5cGUgID0gVkFFbmNQYWNrZWRIZWFkZXJTZXF1ZW5jZSwKKyAgICAud3JpdGVfc2VxdWVuY2VfaGVhZGVyID0gJnZhYXBpX2VuY29kZV9oMjY1X3dyaXRlX3NlcXVlbmNlX2hlYWRlciwKKworICAgIC5zbGljZV9oZWFkZXJfdHlwZSAgICAgPSBWQUVuY1BhY2tlZEhlYWRlckhFVkNfU2xpY2UsCisgICAgLndyaXRlX3NsaWNlX2hlYWRlciAgICA9ICZ2YWFwaV9lbmNvZGVfaDI2NV93cml0ZV9zbGljZV9oZWFkZXIsCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgdmFhcGlfZW5jb2RlX2gyNjVfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjVPcHRpb25zICpvcHQgPQorICAgICAgICAoVkFBUElFbmNvZGVIMjY1T3B0aW9ucyopY3R4LT5jb2RlY19vcHRpb25zX2RhdGE7CisKKyAgICBjdHgtPmNvZGVjID0gJnZhYXBpX2VuY29kZV90eXBlX2gyNjU7CisKKyAgICBpZiAoYXZjdHgtPnByb2ZpbGUgPT0gRkZfUFJPRklMRV9VTktOT1dOKQorICAgICAgICBhdmN0eC0+cHJvZmlsZSA9IG9wdC0+cHJvZmlsZTsKKyAgICBpZiAoYXZjdHgtPmxldmVsID09IEZGX0xFVkVMX1VOS05PV04pCisgICAgICAgIGF2Y3R4LT5sZXZlbCA9IG9wdC0+bGV2ZWw7CisKKyAgICBzd2l0Y2ggKGF2Y3R4LT5wcm9maWxlKSB7CisgICAgY2FzZSBGRl9QUk9GSUxFX0hFVkNfTUFJTjoKKyAgICBjYXNlIEZGX1BST0ZJTEVfVU5LTk9XTjoKKyAgICAgICAgY3R4LT52YV9wcm9maWxlID0gVkFQcm9maWxlSEVWQ01haW47CisgICAgICAgIGN0eC0+dmFfcnRfZm9ybWF0ID0gVkFfUlRfRk9STUFUX1lVVjQyMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX0hFVkNfTUFJTl8xMDoKKyNpZmRlZiBWQV9SVF9GT1JNQVRfWVVWNDIwXzEwQlBQCisgICAgICAgIGN0eC0+dmFfcHJvZmlsZSA9IFZBUHJvZmlsZUhFVkNNYWluMTA7CisgICAgICAgIGN0eC0+dmFfcnRfZm9ybWF0ID0gVkFfUlRfRk9STUFUX1lVVjQyMF8xMEJQUDsKKyAgICAgICAgYnJlYWs7CisjZWxzZQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIjEwLWJpdCBlbmNvZGluZyBpcyBub3QgIgorICAgICAgICAgICAgICAgInN1cHBvcnRlZCB3aXRoIHRoaXMgVkFBUEkgdmVyc2lvbi5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIEguMjY1IHByb2ZpbGUgJWQuXG4iLAorICAgICAgICAgICAgICAgYXZjdHgtPnByb2ZpbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBjdHgtPnZhX2VudHJ5cG9pbnQgPSBWQUVudHJ5cG9pbnRFbmNTbGljZTsKKworICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPiAwKSB7CisgICAgICAgIGlmIChhdmN0eC0+cmNfbWF4X3JhdGUgPT0gYXZjdHgtPmJpdF9yYXRlKQorICAgICAgICAgICAgY3R4LT52YV9yY19tb2RlID0gVkFfUkNfQ0JSOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjdHgtPnZhX3JjX21vZGUgPSBWQV9SQ19WQlI7CisgICAgfSBlbHNlCisgICAgICAgIGN0eC0+dmFfcmNfbW9kZSA9IFZBX1JDX0NRUDsKKworICAgIGN0eC0+dmFfcGFja2VkX2hlYWRlcnMgPQorICAgICAgICBWQV9FTkNfUEFDS0VEX0hFQURFUl9TRVFVRU5DRSB8IC8vIFZQUywgU1BTIGFuZCBQUFMuCisgICAgICAgIFZBX0VOQ19QQUNLRURfSEVBREVSX1NMSUNFOyAgICAgLy8gU2xpY2UgaGVhZGVycy4KKworICAgIGN0eC0+c3VyZmFjZV93aWR0aCAgPSBGRkFMSUdOKGF2Y3R4LT53aWR0aCwgIDE2KTsKKyAgICBjdHgtPnN1cmZhY2VfaGVpZ2h0ID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNik7CisKKyAgICByZXR1cm4gZmZfdmFhcGlfZW5jb2RlX2luaXQoYXZjdHgpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdmFhcGlfZW5jb2RlX2gyNjVfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZUgyNjVDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisKKyAgICBpZiAocHJpdikKKyAgICAgICAgZmZfY2JzX2Nsb3NlKCZwcml2LT5jYmMpOworCisgICAgcmV0dXJuIGZmX3ZhYXBpX2VuY29kZV9jbG9zZShhdmN0eCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIChvZmZzZXRvZihWQUFQSUVuY29kZUNvbnRleHQsIGNvZGVjX29wdGlvbnNfZGF0YSkgKyBcCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVkFBUElFbmNvZGVIMjY1T3B0aW9ucywgeCkpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIHZhYXBpX2VuY29kZV9oMjY1X29wdGlvbnNbXSA9IHsKKyAgICB7ICJxcCIsICJDb25zdGFudCBRUCAoZm9yIFAtZnJhbWVzOyBzY2FsZWQgYnkgcWZhY3Rvci9xb2Zmc2V0IGZvciBJL0IpIiwKKyAgICAgIE9GRlNFVChxcCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMjUgfSwgMCwgNTIsIEZMQUdTIH0sCisKKyAgICB7ICJhdWQiLCAiSW5jbHVkZSBBVUQiLAorICAgICAgT0ZGU0VUKGF1ZCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBGTEFHUyB9LAorCisgICAgeyAicHJvZmlsZSIsICJTZXQgcHJvZmlsZSAoZ2VuZXJhbF9wcm9maWxlX2lkYykiLAorICAgICAgT0ZGU0VUKHByb2ZpbGUpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICB7IC5pNjQgPSBGRl9QUk9GSUxFX0hFVkNfTUFJTiB9LCAweDAwLCAweGZmLCBGTEFHUywgInByb2ZpbGUiIH0sCisKKyNkZWZpbmUgUFJPRklMRShuYW1lLCB2YWx1ZSkgIG5hbWUsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCBcCisgICAgICB7IC5pNjQgPSB2YWx1ZSB9LCAwLCAwLCBGTEFHUywgInByb2ZpbGUiCisgICAgeyBQUk9GSUxFKCJtYWluIiwgICAgICAgICAgICAgICBGRl9QUk9GSUxFX0hFVkNfTUFJTikgfSwKKyAgICB7IFBST0ZJTEUoIm1haW4xMCIsICAgICAgICAgICAgIEZGX1BST0ZJTEVfSEVWQ19NQUlOXzEwKSB9LAorI3VuZGVmIFBST0ZJTEUKKworICAgIHsgImxldmVsIiwgIlNldCBsZXZlbCAoZ2VuZXJhbF9sZXZlbF9pZGMpIiwKKyAgICAgIE9GRlNFVChsZXZlbCksIEFWX09QVF9UWVBFX0lOVCwKKyAgICAgIHsgLmk2NCA9IDE1MyB9LCAweDAwLCAweGZmLCBGTEFHUywgImxldmVsIiB9LAorCisjZGVmaW5lIExFVkVMKG5hbWUsIHZhbHVlKSBuYW1lLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgXAorICAgICAgeyAuaTY0ID0gdmFsdWUgfSwgMCwgMCwgRkxBR1MsICJsZXZlbCIKKyAgICB7IExFVkVMKCIxIiwgICAgMzApIH0sCisgICAgeyBMRVZFTCgiMiIsICAgIDYwKSB9LAorICAgIHsgTEVWRUwoIjIuMSIsICA2MykgfSwKKyAgICB7IExFVkVMKCIzIiwgICAgOTApIH0sCisgICAgeyBMRVZFTCgiMy4xIiwgIDkzKSB9LAorICAgIHsgTEVWRUwoIjQiLCAgIDEyMCkgfSwKKyAgICB7IExFVkVMKCI0LjEiLCAxMjMpIH0sCisgICAgeyBMRVZFTCgiNSIsICAgMTUwKSB9LAorICAgIHsgTEVWRUwoIjUuMSIsIDE1MykgfSwKKyAgICB7IExFVkVMKCI1LjIiLCAxNTYpIH0sCisgICAgeyBMRVZFTCgiNiIsICAgMTgwKSB9LAorICAgIHsgTEVWRUwoIjYuMSIsIDE4MykgfSwKKyAgICB7IExFVkVMKCI2LjIiLCAxODYpIH0sCisjdW5kZWYgTEVWRUwKKworICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ29kZWNEZWZhdWx0IHZhYXBpX2VuY29kZV9oMjY1X2RlZmF1bHRzW10gPSB7CisgICAgeyAiYiIsICAgICAgICAgICAgICAiMCIgICB9LAorICAgIHsgImJmIiwgICAgICAgICAgICAgIjIiICAgfSwKKyAgICB7ICJnIiwgICAgICAgICAgICAgICIxMjAiIH0sCisgICAgeyAiaV9xZmFjdG9yIiwgICAgICAiMSIgICB9LAorICAgIHsgImlfcW9mZnNldCIsICAgICAgIjAiICAgfSwKKyAgICB7ICJiX3FmYWN0b3IiLCAgICAgICI2LzUiIH0sCisgICAgeyAiYl9xb2Zmc2V0IiwgICAgICAiMCIgICB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgdmFhcGlfZW5jb2RlX2gyNjVfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiaDI2NV92YWFwaSIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IHZhYXBpX2VuY29kZV9oMjY1X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2hldmNfdmFhcGlfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaGV2Y192YWFwaSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkguMjY1L0hFVkMgKFZBQVBJKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IChzaXplb2YoVkFBUElFbmNvZGVDb250ZXh0KSArCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWQUFQSUVuY29kZUgyNjVPcHRpb25zKSksCisgICAgLmluaXQgICAgICAgICAgID0gJnZhYXBpX2VuY29kZV9oMjY1X2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gJmZmX3ZhYXBpX2VuY29kZTIsCisgICAgLmNsb3NlICAgICAgICAgID0gJnZhYXBpX2VuY29kZV9oMjY1X2Nsb3NlLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ2YWFwaV9lbmNvZGVfaDI2NV9jbGFzcywKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSEFSRFdBUkUsCisgICAgLmRlZmF1bHRzICAgICAgID0gdmFhcGlfZW5jb2RlX2gyNjVfZGVmYXVsdHMsCisgICAgLnBpeF9mbXRzID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfVkFBUEksCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9LAorICAgIC53cmFwcGVyX25hbWUgICA9ICJ2YWFwaSIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaV9lbmNvZGVfbWpwZWcuYyBiL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlX21qcGVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0OWU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlX21qcGVnLmMKQEAgLTAsMCArMSw0MzIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHZhL3ZhLmg+CisjaW5jbHVkZSA8dmEvdmFfZW5jX2pwZWcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAianBlZ3RhYmxlcy5oIgorI2luY2x1ZGUgIm1qcGVnLmgiCisjaW5jbHVkZSAicHV0X2JpdHMuaCIKKyNpbmNsdWRlICJ2YWFwaV9lbmNvZGUuaCIKKworCisvLyBTdGFuZGFyZCBKUEVHIHF1YW50aXNhdGlvbiB0YWJsZXMsIGluIHppZ3phZyBvcmRlci4KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHZhYXBpX2VuY29kZV9tanBlZ19xdWFudF9sdW1pbmFuY2VbNjRdID0geworICAgIDE2LCAgMTEsICAxMiwgIDE0LCAgMTIsICAxMCwgIDE2LCAgMTQsCisgICAgMTMsICAxNCwgIDE4LCAgMTcsICAxNiwgIDE5LCAgMjQsICA0MCwKKyAgICAyNiwgIDI0LCAgMjIsICAyMiwgIDI0LCAgNDksICAzNSwgIDM3LAorICAgIDI5LCAgNDAsICA1OCwgIDUxLCAgNjEsICA2MCwgIDU3LCAgNTEsCisgICAgNTYsICA1NSwgIDY0LCAgNzIsICA5MiwgIDc4LCAgNjQsICA2OCwKKyAgICA4NywgIDY5LCAgNTUsICA1NiwgIDgwLCAxMDksICA4MSwgIDg3LAorICAgIDk1LCAgOTgsIDEwMywgMTA0LCAxMDMsICA2MiwgIDc3LCAxMTMsCisgICAxMjEsIDExMiwgMTAwLCAxMjAsICA5MiwgMTAxLCAxMDMsICA5OSwKK307CitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB2YWFwaV9lbmNvZGVfbWpwZWdfcXVhbnRfY2hyb21pbmFuY2VbNjRdID0geworICAgIDE3LCAgMTgsICAxOCwgIDI0LCAgMjEsICAyNCwgIDQ3LCAgMjYsCisgICAgMjYsICA0NywgIDk5LCAgNjYsICA1NiwgIDY2LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKKyAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAorICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCisgICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKK307CisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRW5jb2RlTUpQRUdDb250ZXh0IHsKKyAgICBpbnQgcXVhbGl0eTsKKyAgICBpbnQgY29tcG9uZW50X3N1YnNhbXBsZV9oWzNdOworICAgIGludCBjb21wb25lbnRfc3Vic2FtcGxlX3ZbM107CisKKyAgICBWQVFNYXRyaXhCdWZmZXJKUEVHIHF1YW50X3RhYmxlczsKKyAgICBWQUh1ZmZtYW5UYWJsZUJ1ZmZlckpQRUdCYXNlbGluZSBodWZmbWFuX3RhYmxlczsKK30gVkFBUElFbmNvZGVNSlBFR0NvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdmFhcGlfZW5jb2RlX21qcGVnX2NvcHlfaHVmZm1hbih1bnNpZ25lZCBjaGFyICpkc3RfbGVuZ3RocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3RfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY192YWx1ZXMpCit7CisgICAgaW50IGksIG10OworCisgICAgKytzcmNfbGVuZ3RoczsKKworICAgIG10ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgbXQgKz0gKGRzdF9sZW5ndGhzW2ldID0gc3JjX2xlbmd0aHNbaV0pOworCisgICAgZm9yIChpID0gMDsgaSA8IG10OyBpKyspCisgICAgICAgIGRzdF92YWx1ZXNbaV0gPSBzcmNfdmFsdWVzW2ldOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHZhYXBpX2VuY29kZV9tanBlZ19pbml0X3RhYmxlcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlTUpQRUdDb250ZXh0ICAgICAgICAgICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisgICAgVkFRTWF0cml4QnVmZmVySlBFRyAgICAgICAgICAgICAqcXVhbnQgPSAmcHJpdi0+cXVhbnRfdGFibGVzOworICAgIFZBSHVmZm1hblRhYmxlQnVmZmVySlBFR0Jhc2VsaW5lICpodWZmID0gJnByaXYtPmh1ZmZtYW5fdGFibGVzOworICAgIGludCBpOworCisgICAgcXVhbnQtPmxvYWRfbHVtX3F1YW50aXNlcl9tYXRyaXggPSAxOworICAgIHF1YW50LT5sb2FkX2Nocm9tYV9xdWFudGlzZXJfbWF0cml4ID0gMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisgICAgICAgIHF1YW50LT5sdW1fcXVhbnRpc2VyX21hdHJpeFtpXSA9CisgICAgICAgICAgICB2YWFwaV9lbmNvZGVfbWpwZWdfcXVhbnRfbHVtaW5hbmNlW2ldOworICAgICAgICBxdWFudC0+Y2hyb21hX3F1YW50aXNlcl9tYXRyaXhbaV0gPQorICAgICAgICAgICAgdmFhcGlfZW5jb2RlX21qcGVnX3F1YW50X2Nocm9taW5hbmNlW2ldOworICAgIH0KKworICAgIGh1ZmYtPmxvYWRfaHVmZm1hbl90YWJsZVswXSA9IDE7CisgICAgdmFhcGlfZW5jb2RlX21qcGVnX2NvcHlfaHVmZm1hbihodWZmLT5odWZmbWFuX3RhYmxlWzBdLm51bV9kY19jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmYtPmh1ZmZtYW5fdGFibGVbMF0uZGNfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX2JpdHNfZGNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYyk7CisgICAgdmFhcGlfZW5jb2RlX21qcGVnX2NvcHlfaHVmZm1hbihodWZmLT5odWZmbWFuX3RhYmxlWzBdLm51bV9hY19jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmYtPmh1ZmZtYW5fdGFibGVbMF0uYWNfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX2JpdHNfYWNfbHVtaW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9hY19sdW1pbmFuY2UpOworICAgIG1lbXNldChodWZmLT5odWZmbWFuX3RhYmxlWzBdLnBhZCwgMCwgc2l6ZW9mKGh1ZmYtPmh1ZmZtYW5fdGFibGVbMF0ucGFkKSk7CisKKyAgICBodWZmLT5sb2FkX2h1ZmZtYW5fdGFibGVbMV0gPSAxOworICAgIHZhYXBpX2VuY29kZV9tanBlZ19jb3B5X2h1ZmZtYW4oaHVmZi0+aHVmZm1hbl90YWJsZVsxXS5udW1fZGNfY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmLT5odWZmbWFuX3RhYmxlWzFdLmRjX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9tanBlZ19iaXRzX2RjX2Nocm9taW5hbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX3ZhbF9kYyk7CisgICAgdmFhcGlfZW5jb2RlX21qcGVnX2NvcHlfaHVmZm1hbihodWZmLT5odWZmbWFuX3RhYmxlWzFdLm51bV9hY19jb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh1ZmYtPmh1ZmZtYW5fdGFibGVbMV0uYWNfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X21qcGVnX2JpdHNfYWNfY2hyb21pbmFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfbWpwZWdfdmFsX2FjX2Nocm9taW5hbmNlKTsKKyAgICBtZW1zZXQoaHVmZi0+aHVmZm1hbl90YWJsZVsxXS5wYWQsIDAsIHNpemVvZihodWZmLT5odWZmbWFuX3RhYmxlWzFdLnBhZCkpOworfQorCitzdGF0aWMgdm9pZCB2YWFwaV9lbmNvZGVfbWpwZWdfd3JpdGVfbWFya2VyKFB1dEJpdENvbnRleHQgKnBiYywgaW50IG1hcmtlcikKK3sKKyAgICBwdXRfYml0cyhwYmMsIDgsIDB4ZmYpOworICAgIHB1dF9iaXRzKHBiYywgOCwgbWFya2VyKTsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfbWpwZWdfd3JpdGVfaW1hZ2VfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVNsaWNlICpzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgICAgICAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlckpQRUcgKnZwaWMgPSBwaWMtPmNvZGVjX3BpY3R1cmVfcGFyYW1zOworICAgIFZBRW5jU2xpY2VQYXJhbWV0ZXJCdWZmZXJKUEVHICp2c2xpY2UgPSBzbGljZS0+Y29kZWNfc2xpY2VfcGFyYW1zOworICAgIFZBQVBJRW5jb2RlTUpQRUdDb250ZXh0ICAgICAgICAgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBQdXRCaXRDb250ZXh0IHBiYzsKKyAgICBpbnQgdCwgaSwgcXVhbnRfc2NhbGU7CisKKyAgICBpbml0X3B1dF9iaXRzKCZwYmMsIGRhdGEsICpkYXRhX2xlbik7CisKKyAgICB2YWFwaV9lbmNvZGVfbWpwZWdfd3JpdGVfbWFya2VyKCZwYmMsIFNPSSk7CisKKyAgICAvLyBRdWFudGlzYXRpb24gdGFibGUgY29lZmZpY2llbnRzIGFyZSBzY2FsZWQgZm9yIHF1YWxpdHkgYnkgdGhlIGRyaXZlciwKKyAgICAvLyBzbyB3ZSBhbHNvIG5lZWQgdG8gZG8gaXQgb3Vyc2VsdmVzIGhlcmUgc28gdGhhdCBoZWFkZXJzIG1hdGNoLgorICAgIGlmIChwcml2LT5xdWFsaXR5IDwgNTApCisgICAgICAgIHF1YW50X3NjYWxlID0gNTAwMCAvIHByaXYtPnF1YWxpdHk7CisgICAgZWxzZQorICAgICAgICBxdWFudF9zY2FsZSA9IDIwMCAtIDIgKiBwcml2LT5xdWFsaXR5OworCisgICAgZm9yICh0ID0gMDsgdCA8IDI7IHQrKykgeworICAgICAgICBpbnQgcTsKKworICAgICAgICB2YWFwaV9lbmNvZGVfbWpwZWdfd3JpdGVfbWFya2VyKCZwYmMsIERRVCk7CisKKyAgICAgICAgcHV0X2JpdHMoJnBiYywgMTYsIDMgKyA2NCk7IC8vIExxCisgICAgICAgIHB1dF9iaXRzKCZwYmMsIDQsIDApOyAvLyBQcQorICAgICAgICBwdXRfYml0cygmcGJjLCA0LCB0KTsgLy8gVHEKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworICAgICAgICAgICAgcSA9IGlbdCA/IHByaXYtPnF1YW50X3RhYmxlcy5jaHJvbWFfcXVhbnRpc2VyX21hdHJpeAorICAgICAgICAgICAgICAgICAgICA6IHByaXYtPnF1YW50X3RhYmxlcy5sdW1fcXVhbnRpc2VyX21hdHJpeF07CisgICAgICAgICAgICBxID0gKHEgKiBxdWFudF9zY2FsZSkgLyAxMDA7CisgICAgICAgICAgICBpZiAocSA8IDEpICAgcSA9IDE7CisgICAgICAgICAgICBpZiAocSA+IDI1NSkgcSA9IDI1NTsKKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYmMsIDgsIHEpOworICAgICAgICB9CisgICAgfQorCisgICAgdmFhcGlfZW5jb2RlX21qcGVnX3dyaXRlX21hcmtlcigmcGJjLCBTT0YwKTsKKworICAgIHB1dF9iaXRzKCZwYmMsIDE2LCA4ICsgMyAqIHZwaWMtPm51bV9jb21wb25lbnRzKTsgLy8gTGYKKyAgICBwdXRfYml0cygmcGJjLCA4LCAgdnBpYy0+c2FtcGxlX2JpdF9kZXB0aCk7IC8vIFAKKyAgICBwdXRfYml0cygmcGJjLCAxNiwgdnBpYy0+cGljdHVyZV9oZWlnaHQpOyAgIC8vIFkKKyAgICBwdXRfYml0cygmcGJjLCAxNiwgdnBpYy0+cGljdHVyZV93aWR0aCk7ICAgIC8vIFgKKyAgICBwdXRfYml0cygmcGJjLCA4LCAgdnBpYy0+bnVtX2NvbXBvbmVudHMpOyAgIC8vIE5mCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdnBpYy0+bnVtX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICBwdXRfYml0cygmcGJjLCA4LCB2cGljLT5jb21wb25lbnRfaWRbaV0pOyAvLyBDaQorICAgICAgICBwdXRfYml0cygmcGJjLCA0LCBwcml2LT5jb21wb25lbnRfc3Vic2FtcGxlX2hbaV0pOyAvLyBIaQorICAgICAgICBwdXRfYml0cygmcGJjLCA0LCBwcml2LT5jb21wb25lbnRfc3Vic2FtcGxlX3ZbaV0pOyAvLyBWaQorICAgICAgICBwdXRfYml0cygmcGJjLCA4LCB2cGljLT5xdWFudGlzZXJfdGFibGVfc2VsZWN0b3JbaV0pOyAvLyBUcWkKKyAgICB9CisKKyAgICBmb3IgKHQgPSAwOyB0IDwgNDsgdCsrKSB7CisgICAgICAgIGludCBtdDsKKyAgICAgICAgdW5zaWduZWQgY2hhciAqbGVuZ3RocywgKnZhbHVlczsKKworICAgICAgICB2YWFwaV9lbmNvZGVfbWpwZWdfd3JpdGVfbWFya2VyKCZwYmMsIERIVCk7CisKKyAgICAgICAgaWYgKCh0ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgbGVuZ3RocyA9IHByaXYtPmh1ZmZtYW5fdGFibGVzLmh1ZmZtYW5fdGFibGVbdCAvIDJdLm51bV9kY19jb2RlczsKKyAgICAgICAgICAgIHZhbHVlcyAgPSBwcml2LT5odWZmbWFuX3RhYmxlcy5odWZmbWFuX3RhYmxlW3QgLyAyXS5kY192YWx1ZXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsZW5ndGhzID0gcHJpdi0+aHVmZm1hbl90YWJsZXMuaHVmZm1hbl90YWJsZVt0IC8gMl0ubnVtX2FjX2NvZGVzOworICAgICAgICAgICAgdmFsdWVzICA9IHByaXYtPmh1ZmZtYW5fdGFibGVzLmh1ZmZtYW5fdGFibGVbdCAvIDJdLmFjX3ZhbHVlczsKKyAgICAgICAgfQorCisgICAgICAgIG10ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgICBtdCArPSBsZW5ndGhzW2ldOworCisgICAgICAgIHB1dF9iaXRzKCZwYmMsIDE2LCAyICsgMTcgKyBtdCk7IC8vIExoCisgICAgICAgIHB1dF9iaXRzKCZwYmMsIDQsIHQgJiAxKTsgLy8gVGMKKyAgICAgICAgcHV0X2JpdHMoJnBiYywgNCwgdCAvIDIpOyAvLyBUaAorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgcHV0X2JpdHMoJnBiYywgOCwgbGVuZ3Roc1tpXSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtdDsgaSsrKQorICAgICAgICAgICAgcHV0X2JpdHMoJnBiYywgOCwgdmFsdWVzW2ldKTsKKyAgICB9CisKKyAgICB2YWFwaV9lbmNvZGVfbWpwZWdfd3JpdGVfbWFya2VyKCZwYmMsIFNPUyk7CisKKyAgICBhdl9hc3NlcnQwKHZwaWMtPm51bV9jb21wb25lbnRzID09IHZzbGljZS0+bnVtX2NvbXBvbmVudHMpOworCisgICAgcHV0X2JpdHMoJnBiYywgMTYsIDYgKyAyICogdnNsaWNlLT5udW1fY29tcG9uZW50cyk7IC8vIExzCisgICAgcHV0X2JpdHMoJnBiYywgOCwgIHZzbGljZS0+bnVtX2NvbXBvbmVudHMpOyAvLyBOcworCisgICAgZm9yIChpID0gMDsgaSA8IHZzbGljZS0+bnVtX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICBwdXRfYml0cygmcGJjLCA4LCB2c2xpY2UtPmNvbXBvbmVudHNbaV0uY29tcG9uZW50X3NlbGVjdG9yKTsgLy8gQ3NqCisgICAgICAgIHB1dF9iaXRzKCZwYmMsIDQsIHZzbGljZS0+Y29tcG9uZW50c1tpXS5kY190YWJsZV9zZWxlY3Rvcik7ICAvLyBUZGoKKyAgICAgICAgcHV0X2JpdHMoJnBiYywgNCwgdnNsaWNlLT5jb21wb25lbnRzW2ldLmFjX3RhYmxlX3NlbGVjdG9yKTsgIC8vIFRhagorICAgIH0KKworICAgIHB1dF9iaXRzKCZwYmMsIDgsIDApOyAvLyBTcworICAgIHB1dF9iaXRzKCZwYmMsIDgsIDYzKTsgLy8gU2UKKyAgICBwdXRfYml0cygmcGJjLCA0LCAwKTsgLy8gQWgKKyAgICBwdXRfYml0cygmcGJjLCA0LCAwKTsgLy8gQWwKKworICAgICpkYXRhX2xlbiA9IHB1dF9iaXRzX2NvdW50KCZwYmMpOworICAgIGZsdXNoX3B1dF9iaXRzKCZwYmMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX21qcGVnX3dyaXRlX2V4dHJhX2J1ZmZlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbikKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVNSlBFR0NvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChpbmRleCA9PSAwKSB7CisgICAgICAgIC8vIFdyaXRlIHF1YW50aXNhdGlvbiB0YWJsZXMuCisgICAgICAgIGlmICgqZGF0YV9sZW4gPCBzaXplb2YocHJpdi0+cXVhbnRfdGFibGVzKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICp0eXBlID0gVkFRTWF0cml4QnVmZmVyVHlwZTsKKyAgICAgICAgbWVtY3B5KGRhdGEsICZwcml2LT5xdWFudF90YWJsZXMsCisgICAgICAgICAgICAgICAqZGF0YV9sZW4gPSBzaXplb2YocHJpdi0+cXVhbnRfdGFibGVzKSk7CisKKyAgICB9IGVsc2UgaWYgKGluZGV4ID09IDEpIHsKKyAgICAgICAgLy8gV3JpdGUgaHVmZm1hbiB0YWJsZXMuCisgICAgICAgIGlmICgqZGF0YV9sZW4gPCBzaXplb2YocHJpdi0+aHVmZm1hbl90YWJsZXMpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgKnR5cGUgPSBWQUh1ZmZtYW5UYWJsZUJ1ZmZlclR5cGU7CisgICAgICAgIG1lbWNweShkYXRhLCAmcHJpdi0+aHVmZm1hbl90YWJsZXMsCisgICAgICAgICAgICAgICAqZGF0YV9sZW4gPSBzaXplb2YocHJpdi0+aHVmZm1hbl90YWJsZXMpKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX21qcGVnX2luaXRfcGljdHVyZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYykKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAgICAgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJKUEVHICp2cGljID0gcGljLT5jb2RlY19waWN0dXJlX3BhcmFtczsKKyAgICBWQUFQSUVuY29kZU1KUEVHQ29udGV4dCAgICAgICAgICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisKKyAgICB2cGljLT5yZWNvbnN0cnVjdGVkX3BpY3R1cmUgPSBwaWMtPnJlY29uX3N1cmZhY2U7CisgICAgdnBpYy0+Y29kZWRfYnVmID0gcGljLT5vdXRwdXRfYnVmZmVyOworCisgICAgdnBpYy0+cGljdHVyZV93aWR0aCAgPSBhdmN0eC0+d2lkdGg7CisgICAgdnBpYy0+cGljdHVyZV9oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OworCisgICAgdnBpYy0+cGljX2ZsYWdzLmJpdHMucHJvZmlsZSAgICAgID0gMDsKKyAgICB2cGljLT5waWNfZmxhZ3MuYml0cy5wcm9ncmVzc2l2ZSAgPSAwOworICAgIHZwaWMtPnBpY19mbGFncy5iaXRzLmh1ZmZtYW4gICAgICA9IDE7CisgICAgdnBpYy0+cGljX2ZsYWdzLmJpdHMuaW50ZXJsZWF2ZWQgID0gMDsKKyAgICB2cGljLT5waWNfZmxhZ3MuYml0cy5kaWZmZXJlbnRpYWwgPSAwOworCisgICAgdnBpYy0+c2FtcGxlX2JpdF9kZXB0aCA9IDg7CisgICAgdnBpYy0+bnVtX3NjYW4gPSAxOworCisgICAgdnBpYy0+bnVtX2NvbXBvbmVudHMgPSAzOworCisgICAgdnBpYy0+Y29tcG9uZW50X2lkWzBdID0gMTsKKyAgICB2cGljLT5jb21wb25lbnRfaWRbMV0gPSAyOworICAgIHZwaWMtPmNvbXBvbmVudF9pZFsyXSA9IDM7CisKKyAgICBwcml2LT5jb21wb25lbnRfc3Vic2FtcGxlX2hbMF0gPSAyOworICAgIHByaXYtPmNvbXBvbmVudF9zdWJzYW1wbGVfdlswXSA9IDI7CisgICAgcHJpdi0+Y29tcG9uZW50X3N1YnNhbXBsZV9oWzFdID0gMTsKKyAgICBwcml2LT5jb21wb25lbnRfc3Vic2FtcGxlX3ZbMV0gPSAxOworICAgIHByaXYtPmNvbXBvbmVudF9zdWJzYW1wbGVfaFsyXSA9IDE7CisgICAgcHJpdi0+Y29tcG9uZW50X3N1YnNhbXBsZV92WzJdID0gMTsKKworICAgIHZwaWMtPnF1YW50aXNlcl90YWJsZV9zZWxlY3RvclswXSA9IDA7CisgICAgdnBpYy0+cXVhbnRpc2VyX3RhYmxlX3NlbGVjdG9yWzFdID0gMTsKKyAgICB2cGljLT5xdWFudGlzZXJfdGFibGVfc2VsZWN0b3JbMl0gPSAxOworCisgICAgdnBpYy0+cXVhbGl0eSA9IHByaXYtPnF1YWxpdHk7CisKKyAgICBwaWMtPm5iX3NsaWNlcyA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfbWpwZWdfaW5pdF9zbGljZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVNsaWNlICpzbGljZSkKK3sKKyAgICBWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJKUEVHICp2cGljID0gcGljLT5jb2RlY19waWN0dXJlX3BhcmFtczsKKyAgICBWQUVuY1NsaWNlUGFyYW1ldGVyQnVmZmVySlBFRyAqdnNsaWNlID0gc2xpY2UtPmNvZGVjX3NsaWNlX3BhcmFtczsKKyAgICBpbnQgaTsKKworICAgIHZzbGljZS0+cmVzdGFydF9pbnRlcnZhbCA9IDA7CisKKyAgICB2c2xpY2UtPm51bV9jb21wb25lbnRzID0gdnBpYy0+bnVtX2NvbXBvbmVudHM7CisgICAgZm9yIChpID0gMDsgaSA8IHZzbGljZS0+bnVtX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICB2c2xpY2UtPmNvbXBvbmVudHNbaV0uY29tcG9uZW50X3NlbGVjdG9yID0gaSArIDE7CisgICAgICAgIHZzbGljZS0+Y29tcG9uZW50c1tpXS5kY190YWJsZV9zZWxlY3RvciA9IChpID4gMCk7CisgICAgICAgIHZzbGljZS0+Y29tcG9uZW50c1tpXS5hY190YWJsZV9zZWxlY3RvciA9IChpID4gMCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWFwaV9lbmNvZGVfbWpwZWdfY29uZmlndXJlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVNSlBFR0NvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKworICAgIHByaXYtPnF1YWxpdHkgPSBhdmN0eC0+Z2xvYmFsX3F1YWxpdHk7CisgICAgaWYgKHByaXYtPnF1YWxpdHkgPCAxIHx8IHByaXYtPnF1YWxpdHkgPiAxMDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHF1YWxpdHkgdmFsdWUgJWQgIgorICAgICAgICAgICAgICAgIihtdXN0IGJlIDEtMTAwKS5cbiIsIHByaXYtPnF1YWxpdHkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8vIEhhY2s6IHRoZSBpbXBsZW1lbnRhdGlvbiBjYWxscyB0aGUgSlBFRyBpbWFnZSBoZWFkZXIgKHdoaWNoIHdlCisgICAgLy8gd2lsbCB1c2UgaW4gdGhlIHNhbWUgd2F5IGFzIGEgc2xpY2UgaGVhZGVyKSBnZW5lcmljICJyYXcgZGF0YSIuCisgICAgLy8gVGhlcmVmb3JlLCBpZiBhZnRlciB0aGUgcGFja2VkIGhlYWRlciBjYXBhYmlsaXR5IGNoZWNrIHdlIGhhdmUKKyAgICAvLyBQQUNLRURfSEVBREVSX1JBV19EQVRBIGF2YWlsYWJsZSwgcmV3cml0ZSBpdCBhcworICAgIC8vIFBBQ0tFRF9IRUFERVJfU0xJQ0Ugc28gdGhhdCB0aGUgaGVhZGVyLXdyaXRpbmcgY29kZSBjYW4gZG8gdGhlCisgICAgLy8gcmlnaHQgdGhpbmcuCisgICAgaWYgKGN0eC0+dmFfcGFja2VkX2hlYWRlcnMgJiBWQV9FTkNfUEFDS0VEX0hFQURFUl9SQVdfREFUQSkgeworICAgICAgICBjdHgtPnZhX3BhY2tlZF9oZWFkZXJzICY9IH5WQV9FTkNfUEFDS0VEX0hFQURFUl9SQVdfREFUQTsKKyAgICAgICAgY3R4LT52YV9wYWNrZWRfaGVhZGVycyB8PSAgVkFfRU5DX1BBQ0tFRF9IRUFERVJfU0xJQ0U7CisgICAgfQorCisgICAgdmFhcGlfZW5jb2RlX21qcGVnX2luaXRfdGFibGVzKGF2Y3R4KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgVkFBUElFbmNvZGVUeXBlIHZhYXBpX2VuY29kZV90eXBlX21qcGVnID0geworICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoVkFBUElFbmNvZGVNSlBFR0NvbnRleHQpLAorCisgICAgLmNvbmZpZ3VyZSAgICAgICAgICAgICA9ICZ2YWFwaV9lbmNvZGVfbWpwZWdfY29uZmlndXJlLAorCisgICAgLnBpY3R1cmVfcGFyYW1zX3NpemUgICA9IHNpemVvZihWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJKUEVHKSwKKyAgICAuaW5pdF9waWN0dXJlX3BhcmFtcyAgID0gJnZhYXBpX2VuY29kZV9tanBlZ19pbml0X3BpY3R1cmVfcGFyYW1zLAorCisgICAgLnNsaWNlX3BhcmFtc19zaXplICAgICA9IHNpemVvZihWQUVuY1NsaWNlUGFyYW1ldGVyQnVmZmVySlBFRyksCisgICAgLmluaXRfc2xpY2VfcGFyYW1zICAgICA9ICZ2YWFwaV9lbmNvZGVfbWpwZWdfaW5pdF9zbGljZV9wYXJhbXMsCisKKyAgICAuc2xpY2VfaGVhZGVyX3R5cGUgICAgID0gVkFFbmNQYWNrZWRIZWFkZXJSYXdEYXRhLAorICAgIC53cml0ZV9zbGljZV9oZWFkZXIgICAgPSAmdmFhcGlfZW5jb2RlX21qcGVnX3dyaXRlX2ltYWdlX2hlYWRlciwKKworICAgIC53cml0ZV9leHRyYV9idWZmZXIgICAgPSAmdmFhcGlfZW5jb2RlX21qcGVnX3dyaXRlX2V4dHJhX2J1ZmZlciwKK307CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWFwaV9lbmNvZGVfbWpwZWdfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgY3R4LT5jb2RlYyA9ICZ2YWFwaV9lbmNvZGVfdHlwZV9tanBlZzsKKworICAgIGN0eC0+dmFfcHJvZmlsZSAgICA9IFZBUHJvZmlsZUpQRUdCYXNlbGluZTsKKyAgICBjdHgtPnZhX2VudHJ5cG9pbnQgPSBWQUVudHJ5cG9pbnRFbmNQaWN0dXJlOworCisgICAgY3R4LT52YV9ydF9mb3JtYXQgPSBWQV9SVF9GT1JNQVRfWVVWNDIwOworCisgICAgY3R4LT52YV9yY19tb2RlID0gVkFfUkNfQ1FQOworCisgICAgLy8gVGhlIEpQRUcgaW1hZ2UgaGVhZGVyIC0gc2VlIG5vdGUgYWJvdmUuCisgICAgY3R4LT52YV9wYWNrZWRfaGVhZGVycyA9CisgICAgICAgIFZBX0VOQ19QQUNLRURfSEVBREVSX1JBV19EQVRBOworCisgICAgY3R4LT5zdXJmYWNlX3dpZHRoICA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCAgOCk7CisgICAgY3R4LT5zdXJmYWNlX2hlaWdodCA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgOCk7CisKKyAgICByZXR1cm4gZmZfdmFhcGlfZW5jb2RlX2luaXQoYXZjdHgpOworfQorCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgdmFhcGlfZW5jb2RlX21qcGVnX2RlZmF1bHRzW10gPSB7CisgICAgeyAiZ2xvYmFsX3F1YWxpdHkiLCAiODAiIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB2YWFwaV9lbmNvZGVfbWpwZWdfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibWpwZWdfdmFhcGkiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX21qcGVnX3ZhYXBpX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1qcGVnX3ZhYXBpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTUpQRUcgKFZBQVBJKSIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NSlBFRywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkFBUElFbmNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSAmdmFhcGlfZW5jb2RlX21qcGVnX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gJmZmX3ZhYXBpX2VuY29kZTIsCisgICAgLmNsb3NlICAgICAgICAgID0gJmZmX3ZhYXBpX2VuY29kZV9jbG9zZSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmdmFhcGlfZW5jb2RlX21qcGVnX2NsYXNzLAorICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9IQVJEV0FSRSwKKyAgICAuZGVmYXVsdHMgICAgICAgPSB2YWFwaV9lbmNvZGVfbWpwZWdfZGVmYXVsdHMsCisgICAgLnBpeF9mbXRzID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfVkFBUEksCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9LAorICAgIC53cmFwcGVyX25hbWUgICA9ICJ2YWFwaSIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaV9lbmNvZGVfbXBlZzIuYyBiL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlX21wZWcyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkZjc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlX21wZWcyLmMKQEAgLTAsMCArMSw2NzkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHZhL3ZhLmg+CisjaW5jbHVkZSA8dmEvdmFfZW5jX21wZWcyLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJjYnMuaCIKKyNpbmNsdWRlICJjYnNfbXBlZzIuaCIKKyNpbmNsdWRlICJtcGVnMTIuaCIKKyNpbmNsdWRlICJ2YWFwaV9lbmNvZGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElFbmNvZGVNUEVHMkNvbnRleHQgeworICAgIGludCBtYl93aWR0aDsKKyAgICBpbnQgbWJfaGVpZ2h0OworCisgICAgaW50IHF1YW50X2k7CisgICAgaW50IHF1YW50X3A7CisgICAgaW50IHF1YW50X2I7CisKKyAgICBNUEVHMlJhd1NlcXVlbmNlSGVhZGVyIHNlcXVlbmNlX2hlYWRlcjsKKyAgICBNUEVHMlJhd0V4dGVuc2lvbkRhdGEgIHNlcXVlbmNlX2V4dGVuc2lvbjsKKyAgICBNUEVHMlJhd0V4dGVuc2lvbkRhdGEgIHNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uOworICAgIE1QRUcyUmF3R3JvdXBPZlBpY3R1cmVzSGVhZGVyIGdvcF9oZWFkZXI7CisgICAgTVBFRzJSYXdQaWN0dXJlSGVhZGVyICBwaWN0dXJlX2hlYWRlcjsKKyAgICBNUEVHMlJhd0V4dGVuc2lvbkRhdGEgIHBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbjsKKworICAgIGludDY0X3QgbGFzdF9pX2ZyYW1lOworCisgICAgdW5zaWduZWQgaW50IGJpdF9yYXRlOworICAgIHVuc2lnbmVkIGludCB2YnZfYnVmZmVyX3NpemU7CisKKyAgICBBVlJhdGlvbmFsIGZyYW1lX3JhdGU7CisKKyAgICB1bnNpZ25lZCBpbnQgZl9jb2RlX2hvcml6b250YWw7CisgICAgdW5zaWduZWQgaW50IGZfY29kZV92ZXJ0aWNhbDsKKworICAgIENvZGVkQml0c3RyZWFtQ29udGV4dCAqY2JjOworICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgY3VycmVudF9mcmFnbWVudDsKK30gVkFBUElFbmNvZGVNUEVHMkNvbnRleHQ7CisKKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfbXBlZzJfd3JpdGVfZnJhZ21lbnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkQml0c3RyZWFtRnJhZ21lbnQgKmZyYWcpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlTVBFRzJDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX2Nic193cml0ZV9mcmFnbWVudF9kYXRhKHByaXYtPmNiYywgZnJhZyk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd3JpdGUgcGFja2VkIGhlYWRlci5cbiIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmICgqZGF0YV9sZW4gPCA4ICogZnJhZy0+ZGF0YV9zaXplIC0gZnJhZy0+ZGF0YV9iaXRfcGFkZGluZykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkFjY2VzcyB1bml0IHRvbyBsYXJnZTogIgorICAgICAgICAgICAgICAgIiV6dSA8ICV6dS5cbiIsICpkYXRhX2xlbiwKKyAgICAgICAgICAgICAgIDggKiBmcmFnLT5kYXRhX3NpemUgLSBmcmFnLT5kYXRhX2JpdF9wYWRkaW5nKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1BDKTsKKyAgICB9CisKKyAgICBtZW1jcHkoZGF0YSwgZnJhZy0+ZGF0YSwgZnJhZy0+ZGF0YV9zaXplKTsKKyAgICAqZGF0YV9sZW4gPSA4ICogZnJhZy0+ZGF0YV9zaXplIC0gZnJhZy0+ZGF0YV9iaXRfcGFkZGluZzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9tcGVnMl9hZGRfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRCaXRzdHJlYW1GcmFnbWVudCAqZnJhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIHZvaWQgKmhlYWRlcikKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVNUEVHMkNvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gZmZfY2JzX2luc2VydF91bml0X2NvbnRlbnQocHJpdi0+Y2JjLCBmcmFnLCAtMSwgdHlwZSwgaGVhZGVyLCBOVUxMKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhZGQgaGVhZGVyOiAiCisgICAgICAgICAgICAgICAidHlwZSA9ICVkLlxuIiwgdHlwZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX21wZWcyX3dyaXRlX3NlcXVlbmNlX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbikKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVNUEVHMkNvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICAqZnJhZyA9ICZwcml2LT5jdXJyZW50X2ZyYWdtZW50OworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfbXBlZzJfYWRkX2hlYWRlcihhdmN0eCwgZnJhZywgTVBFRzJfU1RBUlRfU0VRVUVOQ0VfSEVBREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcml2LT5zZXF1ZW5jZV9oZWFkZXIpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfbXBlZzJfYWRkX2hlYWRlcihhdmN0eCwgZnJhZywgTVBFRzJfU1RBUlRfRVhURU5TSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcml2LT5zZXF1ZW5jZV9leHRlbnNpb24pOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfbXBlZzJfYWRkX2hlYWRlcihhdmN0eCwgZnJhZywgTVBFRzJfU1RBUlRfRVhURU5TSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcml2LT5zZXF1ZW5jZV9kaXNwbGF5X2V4dGVuc2lvbik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IHZhYXBpX2VuY29kZV9tcGVnMl9hZGRfaGVhZGVyKGF2Y3R4LCBmcmFnLCBNUEVHMl9TVEFSVF9HUk9VUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdi0+Z29wX2hlYWRlcik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IHZhYXBpX2VuY29kZV9tcGVnMl93cml0ZV9mcmFnbWVudChhdmN0eCwgZGF0YSwgZGF0YV9sZW4sIGZyYWcpOworZmFpbDoKKyAgICBmZl9jYnNfZnJhZ21lbnRfdW5pbml0KHByaXYtPmNiYywgZnJhZyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX21wZWcyX3dyaXRlX3BpY3R1cmVfaGVhZGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQVBJRW5jb2RlUGljdHVyZSAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGF0YSwgc2l6ZV90ICpkYXRhX2xlbikKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVNUEVHMkNvbnRleHQgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBDb2RlZEJpdHN0cmVhbUZyYWdtZW50ICAqZnJhZyA9ICZwcml2LT5jdXJyZW50X2ZyYWdtZW50OworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfbXBlZzJfYWRkX2hlYWRlcihhdmN0eCwgZnJhZywgTVBFRzJfU1RBUlRfUElDVFVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHJpdi0+cGljdHVyZV9oZWFkZXIpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfbXBlZzJfYWRkX2hlYWRlcihhdmN0eCwgZnJhZywgTVBFRzJfU1RBUlRfRVhURU5TSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcml2LT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24pOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSB2YWFwaV9lbmNvZGVfbXBlZzJfd3JpdGVfZnJhZ21lbnQoYXZjdHgsIGRhdGEsIGRhdGFfbGVuLCBmcmFnKTsKK2ZhaWw6CisgICAgZmZfY2JzX2ZyYWdtZW50X3VuaW5pdChwcml2LT5jYmMsIGZyYWcpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9tcGVnMl9pbml0X3NlcXVlbmNlX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZU1QRUcyQ29udGV4dCAgICAgICAgICAgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBNUEVHMlJhd1NlcXVlbmNlSGVhZGVyICAgICAgICAgICAgICAqc2ggPSAmcHJpdi0+c2VxdWVuY2VfaGVhZGVyOworICAgIE1QRUcyUmF3U2VxdWVuY2VFeHRlbnNpb24gICAgICAgICAgICpzZSA9ICZwcml2LT5zZXF1ZW5jZV9leHRlbnNpb24uZGF0YS5zZXF1ZW5jZTsKKyAgICBNUEVHMlJhd1NlcXVlbmNlRGlzcGxheUV4dGVuc2lvbiAgICpzZGUgPSAmcHJpdi0+c2VxdWVuY2VfZGlzcGxheV9leHRlbnNpb24uZGF0YS5zZXF1ZW5jZV9kaXNwbGF5OworICAgIE1QRUcyUmF3R3JvdXBPZlBpY3R1cmVzSGVhZGVyICAgICAqZ29waCA9ICZwcml2LT5nb3BfaGVhZGVyOworICAgIE1QRUcyUmF3UGljdHVyZUhlYWRlciAgICAgICAgICAgICAgICpwaCA9ICZwcml2LT5waWN0dXJlX2hlYWRlcjsKKyAgICBNUEVHMlJhd1BpY3R1cmVDb2RpbmdFeHRlbnNpb24gICAgICpwY2UgPSAmcHJpdi0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmRhdGEucGljdHVyZV9jb2Rpbmc7CisgICAgVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlck1QRUcyICp2c2VxID0gY3R4LT5jb2RlY19zZXF1ZW5jZV9wYXJhbXM7CisgICAgVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIgICp2cGljID0gY3R4LT5jb2RlY19waWN0dXJlX3BhcmFtczsKKyAgICBpbnQgY29kZSwgZXh0X24sIGV4dF9kOworCisgICAgbWVtc2V0KHNoLCAgIDAsIHNpemVvZigqc2gpKTsKKyAgICBtZW1zZXQoc2UsICAgMCwgc2l6ZW9mKCpzZSkpOworICAgIG1lbXNldChzZGUsICAwLCBzaXplb2YoKnNkZSkpOworICAgIG1lbXNldChnb3BoLCAwLCBzaXplb2YoKmdvcGgpKTsKKyAgICBtZW1zZXQocGgsICAgMCwgc2l6ZW9mKCpwaCkpOworICAgIG1lbXNldChwY2UsICAwLCBzaXplb2YoKnBjZSkpOworCisKKyAgICBpZiAoYXZjdHgtPmJpdF9yYXRlID4gMCkgeworICAgICAgICBwcml2LT5iaXRfcmF0ZSA9IChhdmN0eC0+Yml0X3JhdGUgKyAzOTkpIC8gNDAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVua25vd24gKG5vdCBhIGJpdHJhdGUtdGFyZ2V0dGluZyBtb2RlKSwgc28ganVzdCB1c2UgdGhlCisgICAgICAgIC8vIGhpZ2hlc3QgdmFsdWUuCisgICAgICAgIHByaXYtPmJpdF9yYXRlID0gMHgzZmZmZmZmZjsKKyAgICB9CisgICAgaWYgKGF2Y3R4LT5yY19idWZmZXJfc2l6ZSA+IDApIHsKKyAgICAgICAgcHJpdi0+dmJ2X2J1ZmZlcl9zaXplID0gKGF2Y3R4LT5yY19idWZmZXJfc2l6ZSArICgxIDw8IDE0KSAtIDEpID4+IDE0OworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVua25vd24sIHNvIGd1ZXNzIGEgdmFsdWUgZnJvbSB0aGUgYml0cmF0ZS4KKyAgICAgICAgcHJpdi0+dmJ2X2J1ZmZlcl9zaXplID0gcHJpdi0+Yml0X3JhdGUgPj4gMTQ7CisgICAgfQorCisgICAgc3dpdGNoIChhdmN0eC0+bGV2ZWwpIHsKKyAgICBjYXNlIDQ6IC8vIEhpZ2guCisgICAgY2FzZSA2OiAvLyBIaWdoIDE0NDAuCisgICAgICAgIHByaXYtPmZfY29kZV9ob3Jpem9udGFsID0gOTsKKyAgICAgICAgcHJpdi0+Zl9jb2RlX3ZlcnRpY2FsICAgPSA1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6IC8vIE1haW4uCisgICAgICAgIHByaXYtPmZfY29kZV9ob3Jpem9udGFsID0gODsKKyAgICAgICAgcHJpdi0+Zl9jb2RlX3ZlcnRpY2FsICAgPSA1OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDEwOiAvLyBMb3cuCisgICAgZGVmYXVsdDoKKyAgICAgICAgcHJpdi0+Zl9jb2RlX2hvcml6b250YWwgPSA3OworICAgICAgICBwcml2LT5mX2NvZGVfdmVydGljYWwgICA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKworCisgICAgLy8gU2VxdWVuY2UgaGVhZGVyCisKKyAgICBzaC0+c2VxdWVuY2VfaGVhZGVyX2NvZGUgPSBNUEVHMl9TVEFSVF9TRVFVRU5DRV9IRUFERVI7CisKKyAgICBzaC0+aG9yaXpvbnRhbF9zaXplX3ZhbHVlID0gYXZjdHgtPndpZHRoICAmIDB4ZmZmOworICAgIHNoLT52ZXJ0aWNhbF9zaXplX3ZhbHVlICAgPSBhdmN0eC0+aGVpZ2h0ICYgMHhmZmY7CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICE9IDAgJiYKKyAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuICE9IDApIHsKKyAgICAgICAgQVZSYXRpb25hbCBkYXIgPSBhdl9kaXZfcShhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCkgeyBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQgfSk7CisKKyAgICAgICAgaWYgKGF2X2NtcF9xKGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLCAoQVZSYXRpb25hbCkgeyAxLCAxIH0pID09IDApIHsKKyAgICAgICAgICAgIHNoLT5hc3BlY3RfcmF0aW9faW5mb3JtYXRpb24gPSAxOworICAgICAgICB9IGVsc2UgaWYgKGF2X2NtcF9xKGRhciwgKEFWUmF0aW9uYWwpIHsgMywgNCB9KSA9PSAwKSB7CisgICAgICAgICAgICBzaC0+YXNwZWN0X3JhdGlvX2luZm9ybWF0aW9uID0gMjsKKyAgICAgICAgfSBlbHNlIGlmIChhdl9jbXBfcShkYXIsIChBVlJhdGlvbmFsKSB7IDksIDE2IH0pID09IDApIHsKKyAgICAgICAgICAgIHNoLT5hc3BlY3RfcmF0aW9faW5mb3JtYXRpb24gPSAzOworICAgICAgICB9IGVsc2UgaWYgKGF2X2NtcF9xKGRhciwgKEFWUmF0aW9uYWwpIHsgMTAwLCAyMjEgfSkgPT0gMCkgeworICAgICAgICAgICAgc2gtPmFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbiA9IDQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiU2FtcGxlIGFzcGVjdCByYXRpbyAlZDolZCBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICJyZXByZXNlbnRhYmxlLCBzaWduYWxsaW5nIHNxdWFyZSBwaXhlbHMgaW5zdGVhZC5cbiIsCisgICAgICAgICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgICAgICBzaC0+YXNwZWN0X3JhdGlvX2luZm9ybWF0aW9uID0gMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVua25vd24gLSBhc3N1bWUgc3F1YXJlIHBpeGVscy4KKyAgICAgICAgc2gtPmFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbiA9IDE7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5mcmFtZXJhdGUubnVtID4gMCAmJiBhdmN0eC0+ZnJhbWVyYXRlLmRlbiA+IDApCisgICAgICAgIHByaXYtPmZyYW1lX3JhdGUgPSBhdmN0eC0+ZnJhbWVyYXRlOworICAgIGVsc2UKKyAgICAgICAgcHJpdi0+ZnJhbWVfcmF0ZSA9IGF2X2ludl9xKGF2Y3R4LT50aW1lX2Jhc2UpOworICAgIGZmX21wZWcxMl9maW5kX2Jlc3RfZnJhbWVfcmF0ZShwcml2LT5mcmFtZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZSwgJmV4dF9uLCAmZXh0X2QsIDApOworICAgIHNoLT5mcmFtZV9yYXRlX2NvZGUgPSBjb2RlOworCisgICAgc2gtPmJpdF9yYXRlX3ZhbHVlICAgICAgICA9IHByaXYtPmJpdF9yYXRlICYgMHgzZmZmZjsKKyAgICBzaC0+dmJ2X2J1ZmZlcl9zaXplX3ZhbHVlID0gcHJpdi0+dmJ2X2J1ZmZlcl9zaXplICYgMHgzZmY7CisKKyAgICBzaC0+Y29uc3RyYWluZWRfcGFyYW1ldGVyc19mbGFnICAgICA9IDA7CisgICAgc2gtPmxvYWRfaW50cmFfcXVhbnRpc2VyX21hdHJpeCAgICAgPSAwOworICAgIHNoLT5sb2FkX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4ID0gMDsKKworCisgICAgLy8gU2VxdWVuY2UgZXh0ZW5zaW9uCisKKyAgICBwcml2LT5zZXF1ZW5jZV9leHRlbnNpb24uZXh0ZW5zaW9uX3N0YXJ0X2NvZGUgPSBNUEVHMl9TVEFSVF9FWFRFTlNJT047CisgICAgcHJpdi0+c2VxdWVuY2VfZXh0ZW5zaW9uLmV4dGVuc2lvbl9zdGFydF9jb2RlX2lkZW50aWZpZXIgPQorICAgICAgICBNUEVHMl9FWFRFTlNJT05fU0VRVUVOQ0U7CisKKyAgICBzZS0+cHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiA9IGF2Y3R4LT5wcm9maWxlIDw8IDQgfCBhdmN0eC0+bGV2ZWw7CisgICAgc2UtPnByb2dyZXNzaXZlX3NlcXVlbmNlID0gMTsKKyAgICBzZS0+Y2hyb21hX2Zvcm1hdCAgICAgICAgPSAxOworCisgICAgc2UtPmhvcml6b250YWxfc2l6ZV9leHRlbnNpb24gPSBhdmN0eC0+d2lkdGggID4+IDEyOworICAgIHNlLT52ZXJ0aWNhbF9zaXplX2V4dGVuc2lvbiAgID0gYXZjdHgtPmhlaWdodCA+PiAxMjsKKworICAgIHNlLT5iaXRfcmF0ZV9leHRlbnNpb24gICAgICAgID0gcHJpdi0+Yml0X3JhdGUgPj4gMTg7CisgICAgc2UtPnZidl9idWZmZXJfc2l6ZV9leHRlbnNpb24gPSBwcml2LT52YnZfYnVmZmVyX3NpemUgPj4gMTA7CisgICAgc2UtPmxvd19kZWxheSAgICAgICAgICAgICAgICAgPSBjdHgtPmJfcGVyX3AgPT0gMDsKKworICAgIHNlLT5mcmFtZV9yYXRlX2V4dGVuc2lvbl9uID0gZXh0X247CisgICAgc2UtPmZyYW1lX3JhdGVfZXh0ZW5zaW9uX2QgPSBleHRfZDsKKworCisgICAgLy8gU2VxdWVuY2UgZGlzcGxheSBleHRlbnNpb24KKworICAgIHByaXYtPnNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uLmV4dGVuc2lvbl9zdGFydF9jb2RlID0KKyAgICAgICAgTVBFRzJfU1RBUlRfRVhURU5TSU9OOworICAgIHByaXYtPnNlcXVlbmNlX2Rpc3BsYXlfZXh0ZW5zaW9uLmV4dGVuc2lvbl9zdGFydF9jb2RlX2lkZW50aWZpZXIgPQorICAgICAgICBNUEVHMl9FWFRFTlNJT05fU0VRVUVOQ0VfRElTUExBWTsKKworICAgIHNkZS0+dmlkZW9fZm9ybWF0ID0gNTsKKyAgICBpZiAoYXZjdHgtPmNvbG9yX3ByaW1hcmllcyAhPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgYXZjdHgtPmNvbG9yX3RyYyAgICAgICAhPSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQgfHwKKyAgICAgICAgYXZjdHgtPmNvbG9yc3BhY2UgICAgICAhPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgc2RlLT5jb2xvdXJfZGVzY3JpcHRpb24gICAgICAgPSAxOworICAgICAgICBzZGUtPmNvbG91cl9wcmltYXJpZXMgICAgICAgICA9IGF2Y3R4LT5jb2xvcl9wcmltYXJpZXM7CisgICAgICAgIHNkZS0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzID0gYXZjdHgtPmNvbG9yX3RyYzsKKyAgICAgICAgc2RlLT5tYXRyaXhfY29lZmZpY2llbnRzICAgICAgPSBhdmN0eC0+Y29sb3JzcGFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZGUtPmNvbG91cl9kZXNjcmlwdGlvbiA9IDA7CisgICAgfQorCisgICAgc2RlLT5kaXNwbGF5X2hvcml6b250YWxfc2l6ZSA9IGF2Y3R4LT53aWR0aDsKKyAgICBzZGUtPmRpc3BsYXlfdmVydGljYWxfc2l6ZSAgID0gYXZjdHgtPmhlaWdodDsKKworCisgICAgLy8gR09QIGhlYWRlcgorCisgICAgZ29waC0+Z3JvdXBfc3RhcnRfY29kZSA9IE1QRUcyX1NUQVJUX0dST1VQOworCisgICAgZ29waC0+dGltZV9jb2RlICAgPSAwOworICAgIGdvcGgtPmNsb3NlZF9nb3AgID0gMTsKKyAgICBnb3BoLT5icm9rZW5fbGluayA9IDA7CisKKworICAgIC8vIERlZmF1bHRzIGZvciBwaWN0dXJlIGhlYWRlcgorCisgICAgcGgtPnBpY3R1cmVfc3RhcnRfY29kZSA9IE1QRUcyX1NUQVJUX1BJQ1RVUkU7CisKKyAgICBwaC0+dmJ2X2RlbGF5ID0gMHhmZmZmOyAvLyBOb3QgY3VycmVudGx5IGNhbGN1bGF0ZWQuCisKKyAgICBwaC0+ZnVsbF9wZWxfZm9yd2FyZF92ZWN0b3IgID0gMDsKKyAgICBwaC0+Zm9yd2FyZF9mX2NvZGUgICAgICAgICAgID0gNzsKKyAgICBwaC0+ZnVsbF9wZWxfYmFja3dhcmRfdmVjdG9yID0gMDsKKyAgICBwaC0+Zm9yd2FyZF9mX2NvZGUgICAgICAgICAgID0gNzsKKworCisgICAgLy8gRGVmYXVsdHMgZm9yIHBpY3R1cmUgY29kaW5nIGV4dGVuc2lvbgorCisgICAgcHJpdi0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmV4dGVuc2lvbl9zdGFydF9jb2RlID0KKyAgICAgICAgTVBFRzJfU1RBUlRfRVhURU5TSU9OOworICAgIHByaXYtPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5leHRlbnNpb25fc3RhcnRfY29kZV9pZGVudGlmaWVyID0KKyAgICAgICAgTVBFRzJfRVhURU5TSU9OX1BJQ1RVUkVfQ09ESU5HOworCisgICAgcGNlLT5pbnRyYV9kY19wcmVjaXNpb24gICAgICAgICA9IDA7CisgICAgcGNlLT5waWN0dXJlX3N0cnVjdHVyZSAgICAgICAgICA9IDM7CisgICAgcGNlLT50b3BfZmllbGRfZmlyc3QgICAgICAgICAgICA9IDA7CisgICAgcGNlLT5mcmFtZV9wcmVkX2ZyYW1lX2RjdCAgICAgICA9IDE7CisgICAgcGNlLT5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycyA9IDA7CisgICAgcGNlLT5xX3NjYWxlX3R5cGUgICAgICAgICAgICAgICA9IDA7CisgICAgcGNlLT5pbnRyYV92bGNfZm9ybWF0ICAgICAgICAgICA9IDA7CisgICAgcGNlLT5hbHRlcm5hdGVfc2NhbiAgICAgICAgICAgICA9IDA7CisgICAgcGNlLT5yZXBlYXRfZmlyc3RfZmllbGQgICAgICAgICA9IDA7CisgICAgcGNlLT5wcm9ncmVzc2l2ZV9mcmFtZSAgICAgICAgICA9IDE7CisgICAgcGNlLT5jb21wb3NpdGVfZGlzcGxheV9mbGFnICAgICA9IDA7CisKKworCisgICAgKnZzZXEgPSAoVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlck1QRUcyKSB7CisgICAgICAgIC5pbnRyYV9wZXJpb2QgPSBhdmN0eC0+Z29wX3NpemUsCisgICAgICAgIC5pcF9wZXJpb2QgICAgPSBjdHgtPmJfcGVyX3AgKyAxLAorCisgICAgICAgIC5waWN0dXJlX3dpZHRoICA9IGF2Y3R4LT53aWR0aCwKKyAgICAgICAgLnBpY3R1cmVfaGVpZ2h0ID0gYXZjdHgtPmhlaWdodCwKKworICAgICAgICAuYml0c19wZXJfc2Vjb25kICAgICAgICAgID0gYXZjdHgtPmJpdF9yYXRlLAorICAgICAgICAuZnJhbWVfcmF0ZSAgICAgICAgICAgICAgID0gYXZfcTJkKHByaXYtPmZyYW1lX3JhdGUpLAorICAgICAgICAuYXNwZWN0X3JhdGlvX2luZm9ybWF0aW9uID0gc2gtPmFzcGVjdF9yYXRpb19pbmZvcm1hdGlvbiwKKyAgICAgICAgLnZidl9idWZmZXJfc2l6ZSAgICAgICAgICA9IHByaXYtPnZidl9idWZmZXJfc2l6ZSwKKworICAgICAgICAuc2VxdWVuY2VfZXh0ZW5zaW9uLmJpdHMgPSB7CisgICAgICAgICAgICAucHJvZmlsZV9hbmRfbGV2ZWxfaW5kaWNhdGlvbiA9IHNlLT5wcm9maWxlX2FuZF9sZXZlbF9pbmRpY2F0aW9uLAorICAgICAgICAgICAgLnByb2dyZXNzaXZlX3NlcXVlbmNlICAgICAgICAgPSBzZS0+cHJvZ3Jlc3NpdmVfc2VxdWVuY2UsCisgICAgICAgICAgICAuY2hyb21hX2Zvcm1hdCAgICAgICAgICAgICAgICA9IHNlLT5jaHJvbWFfZm9ybWF0LAorICAgICAgICAgICAgLmxvd19kZWxheSAgICAgICAgICAgICAgICAgICAgPSBzZS0+bG93X2RlbGF5LAorICAgICAgICAgICAgLmZyYW1lX3JhdGVfZXh0ZW5zaW9uX24gICAgICAgPSBzZS0+ZnJhbWVfcmF0ZV9leHRlbnNpb25fbiwKKyAgICAgICAgICAgIC5mcmFtZV9yYXRlX2V4dGVuc2lvbl9kICAgICAgID0gc2UtPmZyYW1lX3JhdGVfZXh0ZW5zaW9uX2QsCisgICAgICAgIH0sCisKKyAgICAgICAgLm5ld19nb3BfaGVhZGVyID0gMSwKKyAgICAgICAgLmdvcF9oZWFkZXIuYml0cyA9IHsKKyAgICAgICAgICAgIC50aW1lX2NvZGUgICA9IGdvcGgtPnRpbWVfY29kZSwKKyAgICAgICAgICAgIC5jbG9zZWRfZ29wICA9IGdvcGgtPmNsb3NlZF9nb3AsCisgICAgICAgICAgICAuYnJva2VuX2xpbmsgPSBnb3BoLT5icm9rZW5fbGluaywKKyAgICAgICAgfSwKKyAgICB9OworCisgICAgKnZwaWMgPSAoVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIpIHsKKyAgICAgICAgLmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUgID0gVkFfSU5WQUxJRF9JRCwKKyAgICAgICAgLmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlID0gVkFfSU5WQUxJRF9JRCwKKyAgICAgICAgLnJlY29uc3RydWN0ZWRfcGljdHVyZSAgICAgID0gVkFfSU5WQUxJRF9JRCwKKyAgICAgICAgLmNvZGVkX2J1ZiAgICAgICAgICAgICAgICAgID0gVkFfSU5WQUxJRF9JRCwKKworICAgICAgICAudmJ2X2RlbGF5ID0gMHhmZmZmLAorICAgICAgICAuZl9jb2RlICAgID0geyB7IDE1LCAxNSB9LCB7IDE1LCAxNSB9IH0sCisKKyAgICAgICAgLnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzID0geworICAgICAgICAgICAgLmludHJhX2RjX3ByZWNpc2lvbiAgICAgICAgID0gcGNlLT5pbnRyYV9kY19wcmVjaXNpb24sCisgICAgICAgICAgICAucGljdHVyZV9zdHJ1Y3R1cmUgICAgICAgICAgPSBwY2UtPnBpY3R1cmVfc3RydWN0dXJlLAorICAgICAgICAgICAgLnRvcF9maWVsZF9maXJzdCAgICAgICAgICAgID0gcGNlLT50b3BfZmllbGRfZmlyc3QsCisgICAgICAgICAgICAuZnJhbWVfcHJlZF9mcmFtZV9kY3QgICAgICAgPSBwY2UtPmZyYW1lX3ByZWRfZnJhbWVfZGN0LAorICAgICAgICAgICAgLmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzID0gcGNlLT5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycywKKyAgICAgICAgICAgIC5xX3NjYWxlX3R5cGUgICAgICAgICAgICAgICA9IHBjZS0+cV9zY2FsZV90eXBlLAorICAgICAgICAgICAgLmludHJhX3ZsY19mb3JtYXQgICAgICAgICAgID0gcGNlLT5pbnRyYV92bGNfZm9ybWF0LAorICAgICAgICAgICAgLmFsdGVybmF0ZV9zY2FuICAgICAgICAgICAgID0gcGNlLT5hbHRlcm5hdGVfc2NhbiwKKyAgICAgICAgICAgIC5yZXBlYXRfZmlyc3RfZmllbGQgICAgICAgICA9IHBjZS0+cmVwZWF0X2ZpcnN0X2ZpZWxkLAorICAgICAgICAgICAgLnByb2dyZXNzaXZlX2ZyYW1lICAgICAgICAgID0gcGNlLT5wcm9ncmVzc2l2ZV9mcmFtZSwKKyAgICAgICAgICAgIC5jb21wb3NpdGVfZGlzcGxheV9mbGFnICAgICA9IHBjZS0+Y29tcG9zaXRlX2Rpc3BsYXlfZmxhZywKKyAgICAgICAgfSwKKworICAgICAgICAuY29tcG9zaXRlX2Rpc3BsYXkuYml0cyA9IHsKKyAgICAgICAgICAgIC52X2F4aXMgICAgICAgICAgICA9IHBjZS0+dl9heGlzLAorICAgICAgICAgICAgLmZpZWxkX3NlcXVlbmNlICAgID0gcGNlLT5maWVsZF9zZXF1ZW5jZSwKKyAgICAgICAgICAgIC5zdWJfY2FycmllciAgICAgICA9IHBjZS0+c3ViX2NhcnJpZXIsCisgICAgICAgICAgICAuYnVyc3RfYW1wbGl0dWRlICAgPSBwY2UtPmJ1cnN0X2FtcGxpdHVkZSwKKyAgICAgICAgICAgIC5zdWJfY2Fycmllcl9waGFzZSA9IHBjZS0+c3ViX2NhcnJpZXJfcGhhc2UsCisgICAgICAgIH0sCisgICAgfTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhYXBpX2VuY29kZV9tcGVnMl9pbml0X3BpY3R1cmVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYykKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICAgICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVNUEVHMkNvbnRleHQgICAgICAgICAgKnByaXYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBNUEVHMlJhd1BpY3R1cmVIZWFkZXIgICAgICAgICAgICAgICpwaCA9ICZwcml2LT5waWN0dXJlX2hlYWRlcjsKKyAgICBNUEVHMlJhd1BpY3R1cmVDb2RpbmdFeHRlbnNpb24gICAgKnBjZSA9ICZwcml2LT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uZGF0YS5waWN0dXJlX2NvZGluZzsKKyAgICBWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqdnBpYyA9IHBpYy0+Y29kZWNfcGljdHVyZV9wYXJhbXM7CisKKyAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JRFIgfHwgcGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JKSB7CisgICAgICAgIHBoLT50ZW1wb3JhbF9yZWZlcmVuY2UgID0gMDsKKyAgICAgICAgcGgtPnBpY3R1cmVfY29kaW5nX3R5cGUgPSAxOworICAgICAgICBwcml2LT5sYXN0X2lfZnJhbWUgPSBwaWMtPmRpc3BsYXlfb3JkZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGgtPnRlbXBvcmFsX3JlZmVyZW5jZSA9IHBpYy0+ZGlzcGxheV9vcmRlciAtIHByaXYtPmxhc3RfaV9mcmFtZTsKKyAgICAgICAgcGgtPnBpY3R1cmVfY29kaW5nX3R5cGUgPSBwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0IgPyAzIDogMjsKKyAgICB9CisKKyAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9QIHx8IHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfQikgeworICAgICAgICBwY2UtPmZfY29kZVswXVswXSA9IHByaXYtPmZfY29kZV9ob3Jpem9udGFsOworICAgICAgICBwY2UtPmZfY29kZVswXVsxXSA9IHByaXYtPmZfY29kZV92ZXJ0aWNhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBwY2UtPmZfY29kZVswXVswXSA9IDE1OworICAgICAgICBwY2UtPmZfY29kZVswXVsxXSA9IDE1OworICAgIH0KKyAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIHBjZS0+Zl9jb2RlWzFdWzBdID0gcHJpdi0+Zl9jb2RlX2hvcml6b250YWw7CisgICAgICAgIHBjZS0+Zl9jb2RlWzFdWzFdID0gcHJpdi0+Zl9jb2RlX3ZlcnRpY2FsOworICAgIH0gZWxzZSB7CisgICAgICAgIHBjZS0+Zl9jb2RlWzFdWzBdID0gMTU7CisgICAgICAgIHBjZS0+Zl9jb2RlWzFdWzFdID0gMTU7CisgICAgfQorCisgICAgdnBpYy0+cmVjb25zdHJ1Y3RlZF9waWN0dXJlID0gcGljLT5yZWNvbl9zdXJmYWNlOworICAgIHZwaWMtPmNvZGVkX2J1ZiAgICAgICAgICAgICA9IHBpYy0+b3V0cHV0X2J1ZmZlcjsKKworICAgIHN3aXRjaCAocGljLT50eXBlKSB7CisgICAgY2FzZSBQSUNUVVJFX1RZUEVfSURSOgorICAgIGNhc2UgUElDVFVSRV9UWVBFX0k6CisgICAgICAgIHZwaWMtPnBpY3R1cmVfdHlwZSA9IFZBRW5jUGljdHVyZVR5cGVJbnRyYTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQSUNUVVJFX1RZUEVfUDoKKyAgICAgICAgdnBpYy0+cGljdHVyZV90eXBlID0gVkFFbmNQaWN0dXJlVHlwZVByZWRpY3RpdmU7CisgICAgICAgIHZwaWMtPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUgPSBwaWMtPnJlZnNbMF0tPnJlY29uX3N1cmZhY2U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUElDVFVSRV9UWVBFX0I6CisgICAgICAgIHZwaWMtPnBpY3R1cmVfdHlwZSA9IFZBRW5jUGljdHVyZVR5cGVCaWRpcmVjdGlvbmFsOworICAgICAgICB2cGljLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlICA9IHBpYy0+cmVmc1swXS0+cmVjb25fc3VyZmFjZTsKKyAgICAgICAgdnBpYy0+YmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUgPSBwaWMtPnJlZnNbMV0tPnJlY29uX3N1cmZhY2U7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCAmJiAiaW52YWxpZCBwaWN0dXJlIHR5cGUiKTsKKyAgICB9CisKKyAgICB2cGljLT50ZW1wb3JhbF9yZWZlcmVuY2UgPSBwaC0+dGVtcG9yYWxfcmVmZXJlbmNlOworICAgIHZwaWMtPmZfY29kZVswXVswXSAgICAgICA9IHBjZS0+Zl9jb2RlWzBdWzBdOworICAgIHZwaWMtPmZfY29kZVswXVsxXSAgICAgICA9IHBjZS0+Zl9jb2RlWzBdWzFdOworICAgIHZwaWMtPmZfY29kZVsxXVswXSAgICAgICA9IHBjZS0+Zl9jb2RlWzFdWzBdOworICAgIHZwaWMtPmZfY29kZVsxXVsxXSAgICAgICA9IHBjZS0+Zl9jb2RlWzFdWzFdOworCisgICAgcGljLT5uYl9zbGljZXMgPSBwcml2LT5tYl9oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfbXBlZzJfaW5pdF9zbGljZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVTbGljZSAqc2xpY2UpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFFbmNTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUcyICAgKnZzbGljZSA9IHNsaWNlLT5jb2RlY19zbGljZV9wYXJhbXM7CisgICAgVkFBUElFbmNvZGVNUEVHMkNvbnRleHQgICAgICAgICAgICAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBxcDsKKworICAgIHZzbGljZS0+bWFjcm9ibG9ja19hZGRyZXNzID0gcHJpdi0+bWJfd2lkdGggKiBzbGljZS0+aW5kZXg7CisgICAgdnNsaWNlLT5udW1fbWFjcm9ibG9ja3MgICAgPSBwcml2LT5tYl93aWR0aDsKKworICAgIHN3aXRjaCAocGljLT50eXBlKSB7CisgICAgY2FzZSBQSUNUVVJFX1RZUEVfSURSOgorICAgIGNhc2UgUElDVFVSRV9UWVBFX0k6CisgICAgICAgIHFwID0gcHJpdi0+cXVhbnRfaTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQSUNUVVJFX1RZUEVfUDoKKyAgICAgICAgcXAgPSBwcml2LT5xdWFudF9wOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBJQ1RVUkVfVFlQRV9COgorICAgICAgICBxcCA9IHByaXYtPnF1YW50X2I7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCAmJiAiaW52YWxpZCBwaWN0dXJlIHR5cGUiKTsKKyAgICB9CisKKyAgICB2c2xpY2UtPnF1YW50aXNlcl9zY2FsZV9jb2RlID0gcXA7CisgICAgdnNsaWNlLT5pc19pbnRyYV9zbGljZSA9IChwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX0lEUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdmFhcGlfZW5jb2RlX21wZWcyX2NvbmZpZ3VyZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlTVBFRzJDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX2Nic19pbml0KCZwcml2LT5jYmMsIEFWX0NPREVDX0lEX01QRUcyVklERU8sIGF2Y3R4KTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIHByaXYtPm1iX3dpZHRoICA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCAgMTYpIC8gMTY7CisgICAgcHJpdi0+bWJfaGVpZ2h0ID0gRkZBTElHTihhdmN0eC0+aGVpZ2h0LCAxNikgLyAxNjsKKworICAgIGlmIChjdHgtPnZhX3JjX21vZGUgPT0gVkFfUkNfQ1FQKSB7CisgICAgICAgIHByaXYtPnF1YW50X3AgPSBhdl9jbGlwKGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSwgMSwgMzEpOworICAgICAgICBpZiAoYXZjdHgtPmlfcXVhbnRfZmFjdG9yID4gMC4wKQorICAgICAgICAgICAgcHJpdi0+cXVhbnRfaSA9IGF2X2NsaXAoKGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmlfcXVhbnRfZmFjdG9yICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aV9xdWFudF9vZmZzZXQpICsgMC41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMzEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcml2LT5xdWFudF9pID0gcHJpdi0+cXVhbnRfcDsKKyAgICAgICAgaWYgKGF2Y3R4LT5iX3F1YW50X2ZhY3RvciA+IDAuMCkKKyAgICAgICAgICAgIHByaXYtPnF1YW50X2IgPSBhdl9jbGlwKChhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iX3F1YW50X2ZhY3RvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmJfcXVhbnRfb2Zmc2V0KSArIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDMxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJpdi0+cXVhbnRfYiA9IHByaXYtPnF1YW50X3A7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyBmaXhlZCBxdWFudGlzZXIgIgorICAgICAgICAgICAgICAgIiVkIC8gJWQgLyAlZCBmb3IgSS0gLyBQLSAvIEItZnJhbWVzLlxuIiwKKyAgICAgICAgICAgICAgIHByaXYtPnF1YW50X2ksIHByaXYtPnF1YW50X3AsIHByaXYtPnF1YW50X2IpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYXNzZXJ0MCgwICYmICJJbnZhbGlkIFJDIG1vZGUuIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBWQUFQSUVuY29kZVR5cGUgdmFhcGlfZW5jb2RlX3R5cGVfbXBlZzIgPSB7CisgICAgLnByaXZfZGF0YV9zaXplICAgICAgICA9IHNpemVvZihWQUFQSUVuY29kZU1QRUcyQ29udGV4dCksCisKKyAgICAuY29uZmlndXJlICAgICAgICAgICAgID0gJnZhYXBpX2VuY29kZV9tcGVnMl9jb25maWd1cmUsCisKKyAgICAuc2VxdWVuY2VfcGFyYW1zX3NpemUgID0gc2l6ZW9mKFZBRW5jU2VxdWVuY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiksCisgICAgLmluaXRfc2VxdWVuY2VfcGFyYW1zICA9ICZ2YWFwaV9lbmNvZGVfbXBlZzJfaW5pdF9zZXF1ZW5jZV9wYXJhbXMsCisKKyAgICAucGljdHVyZV9wYXJhbXNfc2l6ZSAgID0gc2l6ZW9mKFZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyKSwKKyAgICAuaW5pdF9waWN0dXJlX3BhcmFtcyAgID0gJnZhYXBpX2VuY29kZV9tcGVnMl9pbml0X3BpY3R1cmVfcGFyYW1zLAorCisgICAgLnNsaWNlX3BhcmFtc19zaXplICAgICA9IHNpemVvZihWQUVuY1NsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzIpLAorICAgIC5pbml0X3NsaWNlX3BhcmFtcyAgICAgPSAmdmFhcGlfZW5jb2RlX21wZWcyX2luaXRfc2xpY2VfcGFyYW1zLAorCisgICAgLnNlcXVlbmNlX2hlYWRlcl90eXBlICA9IFZBRW5jUGFja2VkSGVhZGVyU2VxdWVuY2UsCisgICAgLndyaXRlX3NlcXVlbmNlX2hlYWRlciA9ICZ2YWFwaV9lbmNvZGVfbXBlZzJfd3JpdGVfc2VxdWVuY2VfaGVhZGVyLAorCisgICAgLnBpY3R1cmVfaGVhZGVyX3R5cGUgICA9IFZBRW5jUGFja2VkSGVhZGVyUGljdHVyZSwKKyAgICAud3JpdGVfcGljdHVyZV9oZWFkZXIgID0gJnZhYXBpX2VuY29kZV9tcGVnMl93cml0ZV9waWN0dXJlX2hlYWRlciwKK307CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWFwaV9lbmNvZGVfbXBlZzJfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgY3R4LT5jb2RlYyA9ICZ2YWFwaV9lbmNvZGVfdHlwZV9tcGVnMjsKKworICAgIHN3aXRjaCAoYXZjdHgtPnByb2ZpbGUpIHsKKyAgICBjYXNlIEZGX1BST0ZJTEVfTVBFRzJfU0lNUExFOgorICAgICAgICBjdHgtPnZhX3Byb2ZpbGUgPSBWQVByb2ZpbGVNUEVHMlNpbXBsZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX01QRUcyX01BSU46CisgICAgICAgIGN0eC0+dmFfcHJvZmlsZSA9IFZBUHJvZmlsZU1QRUcyTWFpbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX01QRUcyXzQyMjoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJNUEVHLTIgNDoyOjIgcHJvZmlsZSAiCisgICAgICAgICAgICAgICAiaXMgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgY2FzZSBGRl9QUk9GSUxFX01QRUcyX0hJR0g6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVBFRy0yIGhpZ2ggcHJvZmlsZSAiCisgICAgICAgICAgICAgICAiaXMgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgY2FzZSBGRl9QUk9GSUxFX01QRUcyX1NTOgorICAgIGNhc2UgRkZfUFJPRklMRV9NUEVHMl9TTlJfU0NBTEFCTEU6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVBFRy0yIHNjYWxhYmxlIHByb2ZpbGVzICIKKyAgICAgICAgICAgICAgICJhcmUgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIE1QRUctMiBwcm9maWxlICVkLlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgc3dpdGNoIChhdmN0eC0+bGV2ZWwpIHsKKyAgICBjYXNlIDQ6IC8vIEhpZ2gKKyAgICBjYXNlIDY6IC8vIEhpZ2ggMTQ0MAorICAgIGNhc2UgODogLy8gTWFpbgorICAgIGNhc2UgMTA6IC8vIExvdworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gTVBFRy0yIGxldmVsICVkLlxuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT5sZXZlbCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5oZWlnaHQgJSA0MDk2ID09IDAgfHwgYXZjdHgtPndpZHRoICUgNDA5NiA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTVBFRy0yIGRvZXMgbm90IHN1cHBvcnQgcGljdHVyZSAiCisgICAgICAgICAgICAgICAiaGVpZ2h0IG9yIHdpZHRoIGRpdmlzaWJsZSBieSA0MDk2LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY3R4LT52YV9lbnRyeXBvaW50ID0gVkFFbnRyeXBvaW50RW5jU2xpY2U7CisgICAgY3R4LT52YV9ydF9mb3JtYXQgID0gVkFfUlRfRk9STUFUX1lVVjQyMDsKKyAgICBjdHgtPnZhX3JjX21vZGUgICAgPSBWQV9SQ19DUVA7CisKKyAgICBjdHgtPnZhX3BhY2tlZF9oZWFkZXJzID0gVkFfRU5DX1BBQ0tFRF9IRUFERVJfU0VRVUVOQ0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQV9FTkNfUEFDS0VEX0hFQURFUl9QSUNUVVJFOworCisgICAgY3R4LT5zdXJmYWNlX3dpZHRoICA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCAgMTYpOworICAgIGN0eC0+c3VyZmFjZV9oZWlnaHQgPSBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQsIDE2KTsKKworICAgIHJldHVybiBmZl92YWFwaV9lbmNvZGVfaW5pdChhdmN0eCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWFwaV9lbmNvZGVfbXBlZzJfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSUVuY29kZU1QRUcyQ29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKHByaXYpCisgICAgICAgIGZmX2Nic19jbG9zZSgmcHJpdi0+Y2JjKTsKKworICAgIHJldHVybiBmZl92YWFwaV9lbmNvZGVfY2xvc2UoYXZjdHgpOworfQorCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgdmFhcGlfZW5jb2RlX21wZWcyX2RlZmF1bHRzW10gPSB7CisgICAgeyAicHJvZmlsZSIsICAgICAgICAiNCIgICB9LAorICAgIHsgImxldmVsIiwgICAgICAgICAgIjQiICAgfSwKKyAgICB7ICJiZiIsICAgICAgICAgICAgICIxIiAgIH0sCisgICAgeyAiZyIsICAgICAgICAgICAgICAiMTIwIiB9LAorICAgIHsgImlfcWZhY3RvciIsICAgICAgIjEiICAgfSwKKyAgICB7ICJpX3FvZmZzZXQiLCAgICAgICIwIiAgIH0sCisgICAgeyAiYl9xZmFjdG9yIiwgICAgICAiNi81IiB9LAorICAgIHsgImJfcW9mZnNldCIsICAgICAgIjAiICAgfSwKKyAgICB7ICJnbG9iYWxfcXVhbGl0eSIsICIxMCIgIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkNvZGVjIGZmX21wZWcyX3ZhYXBpX2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWcyX3ZhYXBpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVBFRy0yIChWQUFQSSkiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkFBUElFbmNvZGVDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSAmdmFhcGlfZW5jb2RlX21wZWcyX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgID0gJmZmX3ZhYXBpX2VuY29kZTIsCisgICAgLmNsb3NlICAgICAgICAgID0gJnZhYXBpX2VuY29kZV9tcGVnMl9jbG9zZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSEFSRFdBUkUsCisgICAgLmRlZmF1bHRzICAgICAgID0gdmFhcGlfZW5jb2RlX21wZWcyX2RlZmF1bHRzLAorICAgIC5waXhfZm10cyA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSkgeworICAgICAgICBBVl9QSVhfRk1UX1ZBQVBJLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUsCisgICAgfSwKKyAgICAud3JhcHBlcl9uYW1lICAgPSAidmFhcGkiLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlX3ZwOC5jIGIvbGliYXZjb2RlYy92YWFwaV9lbmNvZGVfdnA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjNTUyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdmFhcGlfZW5jb2RlX3ZwOC5jCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx2YS92YS5oPgorI2luY2x1ZGUgPHZhL3ZhX2VuY192cDguaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmFhcGlfZW5jb2RlLmgiCisjaW5jbHVkZSAidnA4LmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElFbmNvZGVWUDhDb250ZXh0IHsKKyAgICBpbnQgcV9pbmRleF9pOworICAgIGludCBxX2luZGV4X3A7Cit9IFZBQVBJRW5jb2RlVlA4Q29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElFbmNvZGVWUDhPcHRpb25zIHsKKyAgICBpbnQgbG9vcF9maWx0ZXJfbGV2ZWw7CisgICAgaW50IGxvb3BfZmlsdGVyX3NoYXJwbmVzczsKK30gVkFBUElFbmNvZGVWUDhPcHRpb25zOworCisKKyNkZWZpbmUgdnNlcV92YXIobmFtZSkgICAgIHZzZXEtPm5hbWUsIG5hbWUKKyNkZWZpbmUgdnNlcV9maWVsZChuYW1lKSAgIHZzZXEtPnNlcV9maWVsZHMuYml0cy5uYW1lLCBuYW1lCisjZGVmaW5lIHZwaWNfdmFyKG5hbWUpICAgICB2cGljLT5uYW1lLCBuYW1lCisjZGVmaW5lIHZwaWNfZmllbGQobmFtZSkgICB2cGljLT5waWNfZmllbGRzLmJpdHMubmFtZSwgbmFtZQorCisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX3ZwOF9pbml0X3NlcXVlbmNlX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlclZQOCAqdnNlcSA9IGN0eC0+Y29kZWNfc2VxdWVuY2VfcGFyYW1zOworCisgICAgdnNlcS0+ZnJhbWVfd2lkdGggID0gYXZjdHgtPndpZHRoOworICAgIHZzZXEtPmZyYW1lX2hlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICB2c2VxLT5mcmFtZV93aWR0aF9zY2FsZSAgPSAwOworICAgIHZzZXEtPmZyYW1lX2hlaWdodF9zY2FsZSA9IDA7CisKKyAgICB2c2VxLT5lcnJvcl9yZXNpbGllbnQgPSAwOworICAgIHZzZXEtPmtmX2F1dG8gPSAwOworCisgICAgaWYgKCEoY3R4LT52YV9yY19tb2RlICYgVkFfUkNfQ1FQKSkgeworICAgICAgICB2c2VxLT5iaXRzX3Blcl9zZWNvbmQgPSBhdmN0eC0+Yml0X3JhdGU7CisgICAgICAgIHZzZXEtPmludHJhX3BlcmlvZCAgICA9IGF2Y3R4LT5nb3Bfc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfdnA4X2luaXRfcGljdHVyZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpwaWMpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDggKnZwaWMgPSBwaWMtPmNvZGVjX3BpY3R1cmVfcGFyYW1zOworICAgIFZBQVBJRW5jb2RlVlA4T3B0aW9ucyAgICAgICAgICAgKm9wdCA9IGN0eC0+Y29kZWNfb3B0aW9uczsKKyAgICBpbnQgaTsKKworICAgIHZwaWMtPnJlY29uc3RydWN0ZWRfZnJhbWUgPSBwaWMtPnJlY29uX3N1cmZhY2U7CisKKyAgICB2cGljLT5jb2RlZF9idWYgPSBwaWMtPm91dHB1dF9idWZmZXI7CisKKyAgICBzd2l0Y2ggKHBpYy0+dHlwZSkgeworICAgIGNhc2UgUElDVFVSRV9UWVBFX0lEUjoKKyAgICBjYXNlIFBJQ1RVUkVfVFlQRV9JOgorICAgICAgICBhdl9hc3NlcnQwKHBpYy0+bmJfcmVmcyA9PSAwKTsKKyAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMuZm9yY2Vfa2YgPSAxOworICAgICAgICB2cGljLT5yZWZfbGFzdF9mcmFtZSA9CisgICAgICAgIHZwaWMtPnJlZl9nZl9mcmFtZSAgID0KKyAgICAgICAgdnBpYy0+cmVmX2FyZl9mcmFtZSAgPQorICAgICAgICAgICAgVkFfSU5WQUxJRF9TVVJGQUNFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBJQ1RVUkVfVFlQRV9QOgorICAgICAgICBhdl9hc3NlcnQwKHBpYy0+bmJfcmVmcyA9PSAxKTsKKyAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMubm9fcmVmX2xhc3QgPSAwOworICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5ub19yZWZfZ2YgICA9IDE7CisgICAgICAgIHZwaWMtPnJlZl9mbGFncy5iaXRzLm5vX3JlZl9hcmYgID0gMTsKKyAgICAgICAgdnBpYy0+cmVmX2xhc3RfZnJhbWUgPQorICAgICAgICB2cGljLT5yZWZfZ2ZfZnJhbWUgICA9CisgICAgICAgIHZwaWMtPnJlZl9hcmZfZnJhbWUgID0KKyAgICAgICAgICAgIHBpYy0+cmVmc1swXS0+cmVjb25fc3VyZmFjZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MCgwICYmICJpbnZhbGlkIHBpY3R1cmUgdHlwZSIpOworICAgIH0KKworICAgIHZwaWMtPnBpY19mbGFncy5iaXRzLmZyYW1lX3R5cGUgPSAocGljLT50eXBlICE9IFBJQ1RVUkVfVFlQRV9JRFIpOworICAgIHZwaWMtPnBpY19mbGFncy5iaXRzLnNob3dfZnJhbWUgPSAxOworCisgICAgdnBpYy0+cGljX2ZsYWdzLmJpdHMucmVmcmVzaF9sYXN0ICAgICAgICAgICAgPSAxOworICAgIHZwaWMtPnBpY19mbGFncy5iaXRzLnJlZnJlc2hfZ29sZGVuX2ZyYW1lICAgID0gMTsKKyAgICB2cGljLT5waWNfZmxhZ3MuYml0cy5yZWZyZXNoX2FsdGVybmF0ZV9mcmFtZSA9IDE7CisKKyAgICB2cGljLT5waWNfZmxhZ3MuYml0cy52ZXJzaW9uID0gMDsKKyAgICB2cGljLT5waWNfZmxhZ3MuYml0cy5sb29wX2ZpbHRlcl90eXBlID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICB2cGljLT5sb29wX2ZpbHRlcl9sZXZlbFtpXSA9IG9wdC0+bG9vcF9maWx0ZXJfbGV2ZWw7CisgICAgdnBpYy0+c2hhcnBuZXNzX2xldmVsID0gb3B0LT5sb29wX2ZpbHRlcl9zaGFycG5lc3M7CisKKyAgICB2cGljLT5jbGFtcF9xaW5kZXhfbG93ICA9IDA7CisgICAgdnBpYy0+Y2xhbXBfcWluZGV4X2hpZ2ggPSAxMjc7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfdnA4X3dyaXRlX3F1YW50X3RhYmxlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUFQSUVuY29kZVBpY3R1cmUgKnBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIGludCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkYXRhLCBzaXplX3QgKmRhdGFfbGVuKQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElFbmNvZGVWUDhDb250ZXh0ICpwcml2ID0gY3R4LT5wcml2X2RhdGE7CisgICAgVkFRTWF0cml4QnVmZmVyVlA4IHF1YW50OworICAgIGludCBpLCBxOworCisgICAgaWYgKGluZGV4ID4gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKCpkYXRhX2xlbiA8IHNpemVvZihxdWFudCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgKnR5cGUgICAgID0gVkFRTWF0cml4QnVmZmVyVHlwZTsKKyAgICAqZGF0YV9sZW4gPSBzaXplb2YocXVhbnQpOworCisgICAgaWYgKHBpYy0+dHlwZSA9PSBQSUNUVVJFX1RZUEVfUCkKKyAgICAgICAgcSA9IHByaXYtPnFfaW5kZXhfcDsKKyAgICBlbHNlCisgICAgICAgIHEgPSBwcml2LT5xX2luZGV4X2k7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBxdWFudC5xdWFudGl6YXRpb25faW5kZXhbaV0gPSBxOworICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgIHF1YW50LnF1YW50aXphdGlvbl9pbmRleF9kZWx0YVtpXSA9IDA7CisKKyAgICBtZW1jcHkoZGF0YSwgJnF1YW50LCBzaXplb2YocXVhbnQpKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZhYXBpX2VuY29kZV92cDhfY29uZmlndXJlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlVlA4Q29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgcHJpdi0+cV9pbmRleF9wID0gYXZfY2xpcChhdmN0eC0+Z2xvYmFsX3F1YWxpdHksIDAsIFZQOF9NQVhfUVVBTlQpOworICAgIGlmIChhdmN0eC0+aV9xdWFudF9mYWN0b3IgPiAwLjApCisgICAgICAgIHByaXYtPnFfaW5kZXhfaSA9IGF2X2NsaXAoKGF2Y3R4LT5nbG9iYWxfcXVhbGl0eSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5pX3F1YW50X2ZhY3RvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5pX3F1YW50X29mZnNldCkgKyAwLjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgVlA4X01BWF9RVUFOVCk7CisgICAgZWxzZQorICAgICAgICBwcml2LT5xX2luZGV4X2kgPSBwcml2LT5xX2luZGV4X3A7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IFZBQVBJRW5jb2RlVHlwZSB2YWFwaV9lbmNvZGVfdHlwZV92cDggPSB7CisgICAgLmNvbmZpZ3VyZSAgICAgICAgICAgICA9ICZ2YWFwaV9lbmNvZGVfdnA4X2NvbmZpZ3VyZSwKKworICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgPSBzaXplb2YoVkFBUElFbmNvZGVWUDhDb250ZXh0KSwKKworICAgIC5zZXF1ZW5jZV9wYXJhbXNfc2l6ZSAgPSBzaXplb2YoVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlclZQOCksCisgICAgLmluaXRfc2VxdWVuY2VfcGFyYW1zICA9ICZ2YWFwaV9lbmNvZGVfdnA4X2luaXRfc2VxdWVuY2VfcGFyYW1zLAorCisgICAgLnBpY3R1cmVfcGFyYW1zX3NpemUgICA9IHNpemVvZihWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDgpLAorICAgIC5pbml0X3BpY3R1cmVfcGFyYW1zICAgPSAmdmFhcGlfZW5jb2RlX3ZwOF9pbml0X3BpY3R1cmVfcGFyYW1zLAorCisgICAgLndyaXRlX2V4dHJhX2J1ZmZlciAgICA9ICZ2YWFwaV9lbmNvZGVfdnA4X3dyaXRlX3F1YW50X3RhYmxlLAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IHZhYXBpX2VuY29kZV92cDhfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGF2Y3R4LT5tYXhfYl9mcmFtZXMgPiAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQi1mcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIGN0eC0+Y29kZWMgPSAmdmFhcGlfZW5jb2RlX3R5cGVfdnA4OworCisgICAgY3R4LT52YV9wcm9maWxlICAgID0gVkFQcm9maWxlVlA4VmVyc2lvbjBfMzsKKyAgICBjdHgtPnZhX2VudHJ5cG9pbnQgPSBWQUVudHJ5cG9pbnRFbmNTbGljZTsKKyAgICBjdHgtPnZhX3J0X2Zvcm1hdCAgPSBWQV9SVF9GT1JNQVRfWVVWNDIwOworCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKSB7CisgICAgICAgIGN0eC0+dmFfcmNfbW9kZSA9IFZBX1JDX0NRUDsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA+IDApIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5yY19tYXhfcmF0ZSA9PSBhdmN0eC0+Yml0X3JhdGUpCisgICAgICAgICAgICBjdHgtPnZhX3JjX21vZGUgPSBWQV9SQ19DQlI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN0eC0+dmFfcmNfbW9kZSA9IFZBX1JDX1ZCUjsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPnZhX3JjX21vZGUgPSBWQV9SQ19DUVA7CisgICAgfQorCisgICAgLy8gUGFja2VkIGhlYWRlcnMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorICAgIGN0eC0+dmFfcGFja2VkX2hlYWRlcnMgPSAwOworCisgICAgY3R4LT5zdXJmYWNlX3dpZHRoICA9IEZGQUxJR04oYXZjdHgtPndpZHRoLCAgMTYpOworICAgIGN0eC0+c3VyZmFjZV9oZWlnaHQgPSBGRkFMSUdOKGF2Y3R4LT5oZWlnaHQsIDE2KTsKKworICAgIHJldHVybiBmZl92YWFwaV9lbmNvZGVfaW5pdChhdmN0eCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIChvZmZzZXRvZihWQUFQSUVuY29kZUNvbnRleHQsIGNvZGVjX29wdGlvbnNfZGF0YSkgKyBcCisgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YoVkFBUElFbmNvZGVWUDhPcHRpb25zLCB4KSkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0pCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdmFhcGlfZW5jb2RlX3ZwOF9vcHRpb25zW10gPSB7CisgICAgeyAibG9vcF9maWx0ZXJfbGV2ZWwiLCAiTG9vcCBmaWx0ZXIgbGV2ZWwiLAorICAgICAgT0ZGU0VUKGxvb3BfZmlsdGVyX2xldmVsKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxNiB9LCAwLCA2MywgRkxBR1MgfSwKKyAgICB7ICJsb29wX2ZpbHRlcl9zaGFycG5lc3MiLCAiTG9vcCBmaWx0ZXIgc2hhcnBuZXNzIiwKKyAgICAgIE9GRlNFVChsb29wX2ZpbHRlcl9zaGFycG5lc3MpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDQgfSwgMCwgMTUsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDb2RlY0RlZmF1bHQgdmFhcGlfZW5jb2RlX3ZwOF9kZWZhdWx0c1tdID0geworICAgIHsgImIiLCAgICAgICAgICAgICAgIjAiICAgfSwKKyAgICB7ICJiZiIsICAgICAgICAgICAgICIwIiAgIH0sCisgICAgeyAiZyIsICAgICAgICAgICAgICAiMTIwIiB9LAorICAgIHsgImdsb2JhbF9xdWFsaXR5IiwgIjQwIiAgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHZhYXBpX2VuY29kZV92cDhfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAidnA4X3ZhYXBpIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gdmFhcGlfZW5jb2RlX3ZwOF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl92cDhfdmFhcGlfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidnA4X3ZhYXBpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVlA4IChWQUFQSSkiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA4LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IChzaXplb2YoVkFBUElFbmNvZGVDb250ZXh0KSArCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWQUFQSUVuY29kZVZQOE9wdGlvbnMpKSwKKyAgICAuaW5pdCAgICAgICAgICAgPSAmdmFhcGlfZW5jb2RlX3ZwOF9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9ICZmZl92YWFwaV9lbmNvZGUyLAorICAgIC5jbG9zZSAgICAgICAgICA9ICZmZl92YWFwaV9lbmNvZGVfY2xvc2UsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnZhYXBpX2VuY29kZV92cDhfY2xhc3MsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0hBUkRXQVJFLAorICAgIC5kZWZhdWx0cyAgICAgICA9IHZhYXBpX2VuY29kZV92cDhfZGVmYXVsdHMsCisgICAgLnBpeF9mbXRzID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfVkFBUEksCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9LAorICAgIC53cmFwcGVyX25hbWUgICA9ICJ2YWFwaSIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaV9lbmNvZGVfdnA5LmMgYi9saWJhdmNvZGVjL3ZhYXBpX2VuY29kZV92cDkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTA4Njk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92YWFwaV9lbmNvZGVfdnA5LmMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHZhL3ZhLmg+CisjaW5jbHVkZSA8dmEvdmFfZW5jX3ZwOS5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2YWFwaV9lbmNvZGUuaCIKKworI2RlZmluZSBWUDlfTUFYX1FVQU5UIDI1NQorCisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRW5jb2RlVlA5Q29udGV4dCB7CisgICAgaW50IHFfaWR4X2lkcjsKKyAgICBpbnQgcV9pZHhfcDsKKyAgICBpbnQgcV9pZHhfYjsKKworICAgIC8vIFJlZmVyZW5jZSBkaXJlY3Rpb24gZm9yIEItbGlrZSBmcmFtZXM6CisgICAgLy8gMCAtIG1vc3QgcmVjZW50IFAvSURSIGZyYW1lIGlzIGxhc3QuCisgICAgLy8gMSAtIG1vc3QgcmVjZW50IFAgZnJhbWUgaXMgZ29sZGVuLgorICAgIGludCBsYXN0X3JlZl9kaXI7Cit9IFZBQVBJRW5jb2RlVlA5Q29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElFbmNvZGVWUDlPcHRpb25zIHsKKyAgICBpbnQgbG9vcF9maWx0ZXJfbGV2ZWw7CisgICAgaW50IGxvb3BfZmlsdGVyX3NoYXJwbmVzczsKK30gVkFBUElFbmNvZGVWUDlPcHRpb25zOworCisKKyNkZWZpbmUgdnNlcV92YXIobmFtZSkgICAgIHZzZXEtPm5hbWUsIG5hbWUKKyNkZWZpbmUgdnNlcV9maWVsZChuYW1lKSAgIHZzZXEtPnNlcV9maWVsZHMuYml0cy5uYW1lLCBuYW1lCisjZGVmaW5lIHZwaWNfdmFyKG5hbWUpICAgICB2cGljLT5uYW1lLCBuYW1lCisjZGVmaW5lIHZwaWNfZmllbGQobmFtZSkgICB2cGljLT5waWNfZmllbGRzLmJpdHMubmFtZSwgbmFtZQorCisKK3N0YXRpYyBpbnQgdmFhcGlfZW5jb2RlX3ZwOV9pbml0X3NlcXVlbmNlX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFFbmNTZXF1ZW5jZVBhcmFtZXRlckJ1ZmZlclZQOSAqdnNlcSA9IGN0eC0+Y29kZWNfc2VxdWVuY2VfcGFyYW1zOworICAgIFZBRW5jUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZQOSAgKnZwaWMgPSBjdHgtPmNvZGVjX3BpY3R1cmVfcGFyYW1zOworCisgICAgdnNlcS0+bWF4X2ZyYW1lX3dpZHRoICA9IGF2Y3R4LT53aWR0aDsKKyAgICB2c2VxLT5tYXhfZnJhbWVfaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKKworICAgIHZzZXEtPmtmX2F1dG8gPSAwOworCisgICAgaWYgKCEoY3R4LT52YV9yY19tb2RlICYgVkFfUkNfQ1FQKSkgeworICAgICAgICB2c2VxLT5iaXRzX3Blcl9zZWNvbmQgPSBhdmN0eC0+Yml0X3JhdGU7CisgICAgICAgIHZzZXEtPmludHJhX3BlcmlvZCAgICA9IGF2Y3R4LT5nb3Bfc2l6ZTsKKyAgICB9CisKKyAgICB2cGljLT5mcmFtZV93aWR0aF9zcmMgID0gYXZjdHgtPndpZHRoOworICAgIHZwaWMtPmZyYW1lX2hlaWdodF9zcmMgPSBhdmN0eC0+aGVpZ2h0OworICAgIHZwaWMtPmZyYW1lX3dpZHRoX2RzdCAgPSBhdmN0eC0+d2lkdGg7CisgICAgdnBpYy0+ZnJhbWVfaGVpZ2h0X2RzdCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9lbmNvZGVfdnA5X2luaXRfcGljdHVyZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFBUElFbmNvZGVQaWN0dXJlICpwaWMpCit7CisgICAgVkFBUElFbmNvZGVDb250ZXh0ICAgICAgICAgICAgICAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUVuY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDkgKnZwaWMgPSBwaWMtPmNvZGVjX3BpY3R1cmVfcGFyYW1zOworICAgIFZBQVBJRW5jb2RlVlA5Q29udGV4dCAgICAgICAgICAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlVlA5T3B0aW9ucyAgICAgICAgICAgKm9wdCA9IGN0eC0+Y29kZWNfb3B0aW9uczsKKyAgICBpbnQgaTsKKworICAgIHZwaWMtPnJlY29uc3RydWN0ZWRfZnJhbWUgPSBwaWMtPnJlY29uX3N1cmZhY2U7CisgICAgdnBpYy0+Y29kZWRfYnVmID0gcGljLT5vdXRwdXRfYnVmZmVyOworCisgICAgc3dpdGNoIChwaWMtPnR5cGUpIHsKKyAgICBjYXNlIFBJQ1RVUkVfVFlQRV9JRFI6CisgICAgICAgIGF2X2Fzc2VydDAocGljLT5uYl9yZWZzID09IDApOworICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5mb3JjZV9rZiA9IDE7CisgICAgICAgIHZwaWMtPnJlZnJlc2hfZnJhbWVfZmxhZ3MgPSAweDAxOworICAgICAgICBwcml2LT5sYXN0X3JlZl9kaXIgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFBJQ1RVUkVfVFlQRV9QOgorICAgICAgICBhdl9hc3NlcnQwKHBpYy0+bmJfcmVmcyA9PSAxKTsKKyAgICAgICAgaWYgKGF2Y3R4LT5tYXhfYl9mcmFtZXMgPiAwKSB7CisgICAgICAgICAgICBpZiAocHJpdi0+bGFzdF9yZWZfZGlyKSB7CisgICAgICAgICAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMucmVmX2ZyYW1lX2N0cmxfbDAgID0gMjsKKyAgICAgICAgICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5yZWZfZ2ZfaWR4ICAgICAgICAgPSAxOworICAgICAgICAgICAgICAgIHZwaWMtPnJlZl9mbGFncy5iaXRzLnJlZl9nZl9zaWduX2JpYXMgICA9IDE7CisgICAgICAgICAgICAgICAgdnBpYy0+cmVmcmVzaF9mcmFtZV9mbGFncyA9IDB4MDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZwaWMtPnJlZl9mbGFncy5iaXRzLnJlZl9mcmFtZV9jdHJsX2wwICA9IDE7CisgICAgICAgICAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMucmVmX2xhc3RfaWR4ICAgICAgID0gMDsKKyAgICAgICAgICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5yZWZfbGFzdF9zaWduX2JpYXMgPSAxOworICAgICAgICAgICAgICAgIHZwaWMtPnJlZnJlc2hfZnJhbWVfZmxhZ3MgPSAweDAyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMucmVmX2ZyYW1lX2N0cmxfbDAgID0gMTsKKyAgICAgICAgICAgIHZwaWMtPnJlZl9mbGFncy5iaXRzLnJlZl9sYXN0X2lkeCAgICAgICA9IDA7CisgICAgICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5yZWZfbGFzdF9zaWduX2JpYXMgPSAxOworICAgICAgICAgICAgdnBpYy0+cmVmcmVzaF9mcmFtZV9mbGFncyA9IDB4MDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBQSUNUVVJFX1RZUEVfQjoKKyAgICAgICAgYXZfYXNzZXJ0MChwaWMtPm5iX3JlZnMgPT0gMik7CisgICAgICAgIGlmIChwcml2LT5sYXN0X3JlZl9kaXIpIHsKKyAgICAgICAgICAgIHZwaWMtPnJlZl9mbGFncy5iaXRzLnJlZl9mcmFtZV9jdHJsX2wwICA9IDE7CisgICAgICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5yZWZfZnJhbWVfY3RybF9sMSAgPSAyOworICAgICAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMucmVmX2xhc3RfaWR4ICAgICAgID0gMDsKKyAgICAgICAgICAgIHZwaWMtPnJlZl9mbGFncy5iaXRzLnJlZl9sYXN0X3NpZ25fYmlhcyA9IDE7CisgICAgICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5yZWZfZ2ZfaWR4ICAgICAgICAgPSAxOworICAgICAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMucmVmX2dmX3NpZ25fYmlhcyAgID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZwaWMtPnJlZl9mbGFncy5iaXRzLnJlZl9mcmFtZV9jdHJsX2wwICA9IDI7CisgICAgICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5yZWZfZnJhbWVfY3RybF9sMSAgPSAxOworICAgICAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMucmVmX2xhc3RfaWR4ICAgICAgID0gMDsKKyAgICAgICAgICAgIHZwaWMtPnJlZl9mbGFncy5iaXRzLnJlZl9sYXN0X3NpZ25fYmlhcyA9IDA7CisgICAgICAgICAgICB2cGljLT5yZWZfZmxhZ3MuYml0cy5yZWZfZ2ZfaWR4ICAgICAgICAgPSAxOworICAgICAgICAgICAgdnBpYy0+cmVmX2ZsYWdzLmJpdHMucmVmX2dmX3NpZ25fYmlhcyAgID0gMTsKKyAgICAgICAgfQorICAgICAgICB2cGljLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzID0gMHgwMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MCgwICYmICJpbnZhbGlkIHBpY3R1cmUgdHlwZSIpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyh2cGljLT5yZWZlcmVuY2VfZnJhbWVzKTsgaSsrKQorICAgICAgICB2cGljLT5yZWZlcmVuY2VfZnJhbWVzW2ldID0gVkFfSU5WQUxJRF9TVVJGQUNFOworICAgIGlmIChwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX1ApIHsKKyAgICAgICAgYXZfYXNzZXJ0MChwaWMtPnJlZnNbMF0pOworICAgICAgICB2cGljLT5yZWZlcmVuY2VfZnJhbWVzW3ByaXYtPmxhc3RfcmVmX2Rpcl0gPQorICAgICAgICAgICAgcGljLT5yZWZzWzBdLT5yZWNvbl9zdXJmYWNlOworICAgIH0gZWxzZSBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9CKSB7CisgICAgICAgIGF2X2Fzc2VydDAocGljLT5yZWZzWzBdICYmIHBpYy0+cmVmc1sxXSk7CisgICAgICAgIHZwaWMtPnJlZmVyZW5jZV9mcmFtZXNbIXByaXYtPmxhc3RfcmVmX2Rpcl0gPQorICAgICAgICAgICAgcGljLT5yZWZzWzBdLT5yZWNvbl9zdXJmYWNlOworICAgICAgICB2cGljLT5yZWZlcmVuY2VfZnJhbWVzW3ByaXYtPmxhc3RfcmVmX2Rpcl0gPQorICAgICAgICAgICAgcGljLT5yZWZzWzFdLT5yZWNvbl9zdXJmYWNlOworICAgIH0KKworICAgIHZwaWMtPnBpY19mbGFncy5iaXRzLmZyYW1lX3R5cGUgPSAocGljLT50eXBlICE9IFBJQ1RVUkVfVFlQRV9JRFIpOworICAgIHZwaWMtPnBpY19mbGFncy5iaXRzLnNob3dfZnJhbWUgPSBwaWMtPmRpc3BsYXlfb3JkZXIgPD0gcGljLT5lbmNvZGVfb3JkZXI7CisKKyAgICBpZiAocGljLT50eXBlID09IFBJQ1RVUkVfVFlQRV9JRFIpCisgICAgICAgIHZwaWMtPmx1bWFfYWNfcWluZGV4ICAgICA9IHByaXYtPnFfaWR4X2lkcjsKKyAgICBlbHNlIGlmIChwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX1ApCisgICAgICAgIHZwaWMtPmx1bWFfYWNfcWluZGV4ICAgICA9IHByaXYtPnFfaWR4X3A7CisgICAgZWxzZQorICAgICAgICB2cGljLT5sdW1hX2FjX3FpbmRleCAgICAgPSBwcml2LT5xX2lkeF9iOworICAgIHZwaWMtPmx1bWFfZGNfcWluZGV4X2RlbHRhICAgPSAwOworICAgIHZwaWMtPmNocm9tYV9hY19xaW5kZXhfZGVsdGEgPSAwOworICAgIHZwaWMtPmNocm9tYV9kY19xaW5kZXhfZGVsdGEgPSAwOworCisgICAgdnBpYy0+ZmlsdGVyX2xldmVsICAgID0gb3B0LT5sb29wX2ZpbHRlcl9sZXZlbDsKKyAgICB2cGljLT5zaGFycG5lc3NfbGV2ZWwgPSBvcHQtPmxvb3BfZmlsdGVyX3NoYXJwbmVzczsKKworICAgIGlmIChhdmN0eC0+bWF4X2JfZnJhbWVzID4gMCAmJiBwaWMtPnR5cGUgPT0gUElDVFVSRV9UWVBFX1ApCisgICAgICAgIHByaXYtPmxhc3RfcmVmX2RpciA9ICFwcml2LT5sYXN0X3JlZl9kaXI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHZhYXBpX2VuY29kZV92cDlfY29uZmlndXJlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQUFQSUVuY29kZUNvbnRleHQgICAgICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRW5jb2RlVlA5Q29udGV4dCAqcHJpdiA9IGN0eC0+cHJpdl9kYXRhOworCisgICAgcHJpdi0+cV9pZHhfcCA9IGF2X2NsaXAoYXZjdHgtPmdsb2JhbF9xdWFsaXR5LCAwLCBWUDlfTUFYX1FVQU5UKTsKKyAgICBpZiAoYXZjdHgtPmlfcXVhbnRfZmFjdG9yID4gMC4wKQorICAgICAgICBwcml2LT5xX2lkeF9pZHIgPSBhdl9jbGlwKChhdmN0eC0+Z2xvYmFsX3F1YWxpdHkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aV9xdWFudF9mYWN0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+aV9xdWFudF9vZmZzZXQpICsgMC41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFZQOV9NQVhfUVVBTlQpOworICAgIGVsc2UKKyAgICAgICAgcHJpdi0+cV9pZHhfaWRyID0gcHJpdi0+cV9pZHhfcDsKKyAgICBpZiAoYXZjdHgtPmJfcXVhbnRfZmFjdG9yID4gMC4wKQorICAgICAgICBwcml2LT5xX2lkeF9iID0gYXZfY2xpcCgoYXZjdHgtPmdsb2JhbF9xdWFsaXR5ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5iX3F1YW50X2ZhY3RvciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Yl9xdWFudF9vZmZzZXQpICsgMC41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBWUDlfTUFYX1FVQU5UKTsKKyAgICBlbHNlCisgICAgICAgIHByaXYtPnFfaWR4X2IgPSBwcml2LT5xX2lkeF9wOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBWQUFQSUVuY29kZVR5cGUgdmFhcGlfZW5jb2RlX3R5cGVfdnA5ID0geworICAgIC5jb25maWd1cmUgICAgICAgICAgICAgPSAmdmFhcGlfZW5jb2RlX3ZwOV9jb25maWd1cmUsCisKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgID0gc2l6ZW9mKFZBQVBJRW5jb2RlVlA5Q29udGV4dCksCisKKyAgICAuc2VxdWVuY2VfcGFyYW1zX3NpemUgID0gc2l6ZW9mKFZBRW5jU2VxdWVuY2VQYXJhbWV0ZXJCdWZmZXJWUDkpLAorICAgIC5pbml0X3NlcXVlbmNlX3BhcmFtcyAgPSAmdmFhcGlfZW5jb2RlX3ZwOV9pbml0X3NlcXVlbmNlX3BhcmFtcywKKworICAgIC5waWN0dXJlX3BhcmFtc19zaXplICAgPSBzaXplb2YoVkFFbmNQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVlA5KSwKKyAgICAuaW5pdF9waWN0dXJlX3BhcmFtcyAgID0gJnZhYXBpX2VuY29kZV92cDlfaW5pdF9waWN0dXJlX3BhcmFtcywKK307CisKK3N0YXRpYyBhdl9jb2xkIGludCB2YWFwaV9lbmNvZGVfdnA5X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJRW5jb2RlQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGN0eC0+Y29kZWMgPSAmdmFhcGlfZW5jb2RlX3R5cGVfdnA5OworCisgICAgc3dpdGNoIChhdmN0eC0+cHJvZmlsZSkgeworICAgIGNhc2UgRkZfUFJPRklMRV9WUDlfMDoKKyAgICBjYXNlIEZGX1BST0ZJTEVfVU5LTk9XTjoKKyAgICAgICAgY3R4LT52YV9wcm9maWxlID0gVkFQcm9maWxlVlA5UHJvZmlsZTA7CisgICAgICAgIGN0eC0+dmFfcnRfZm9ybWF0ID0gVkFfUlRfRk9STUFUX1lVVjQyMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX1ZQOV8xOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZQOSBwcm9maWxlIDEgaXMgbm90ICIKKyAgICAgICAgICAgICAgICJzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIGNhc2UgRkZfUFJPRklMRV9WUDlfMjoKKyAgICAgICAgY3R4LT52YV9wcm9maWxlID0gVkFQcm9maWxlVlA5UHJvZmlsZTI7CisgICAgICAgIGN0eC0+dmFfcnRfZm9ybWF0ID0gVkFfUlRfRk9STUFUX1lVVjQyMF8xMEJQUDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGRl9QUk9GSUxFX1ZQOV8zOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZQOSBwcm9maWxlIDMgaXMgbm90ICIKKyAgICAgICAgICAgICAgICJzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBWUDkgcHJvZmlsZSAlZC5cbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGN0eC0+dmFfZW50cnlwb2ludCA9IFZBRW50cnlwb2ludEVuY1NsaWNlOworCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKSB7CisgICAgICAgIGN0eC0+dmFfcmNfbW9kZSA9IFZBX1JDX0NRUDsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA+IDApIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5iaXRfcmF0ZSA9PSBhdmN0eC0+cmNfbWF4X3JhdGUpCisgICAgICAgICAgICBjdHgtPnZhX3JjX21vZGUgPSBWQV9SQ19DQlI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN0eC0+dmFfcmNfbW9kZSA9IFZBX1JDX1ZCUjsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPnZhX3JjX21vZGUgPSBWQV9SQ19DUVA7CisgICAgfQorCisgICAgLy8gUGFja2VkIGhlYWRlcnMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgorICAgIGN0eC0+dmFfcGFja2VkX2hlYWRlcnMgPSAwOworCisgICAgLy8gU3VyZmFjZXMgbXVzdCBiZSBhbGlnbmVkIHRvIHN1cGVyYmxvY2sgYm91bmRhcmllcy4KKyAgICBjdHgtPnN1cmZhY2Vfd2lkdGggID0gRkZBTElHTihhdmN0eC0+d2lkdGgsICA2NCk7CisgICAgY3R4LT5zdXJmYWNlX2hlaWdodCA9IEZGQUxJR04oYXZjdHgtPmhlaWdodCwgNjQpOworCisgICAgcmV0dXJuIGZmX3ZhYXBpX2VuY29kZV9pbml0KGF2Y3R4KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgKG9mZnNldG9mKFZBQVBJRW5jb2RlQ29udGV4dCwgY29kZWNfb3B0aW9uc19kYXRhKSArIFwKKyAgICAgICAgICAgICAgICAgICBvZmZzZXRvZihWQUFQSUVuY29kZVZQOU9wdGlvbnMsIHgpKQorI2RlZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB2YWFwaV9lbmNvZGVfdnA5X29wdGlvbnNbXSA9IHsKKyAgICB7ICJsb29wX2ZpbHRlcl9sZXZlbCIsICJMb29wIGZpbHRlciBsZXZlbCIsCisgICAgICBPRkZTRVQobG9vcF9maWx0ZXJfbGV2ZWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDE2IH0sIDAsIDYzLCBGTEFHUyB9LAorICAgIHsgImxvb3BfZmlsdGVyX3NoYXJwbmVzcyIsICJMb29wIGZpbHRlciBzaGFycG5lc3MiLAorICAgICAgT0ZGU0VUKGxvb3BfZmlsdGVyX3NoYXJwbmVzcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gNCB9LCAwLCAxNSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNvZGVjRGVmYXVsdCB2YWFwaV9lbmNvZGVfdnA5X2RlZmF1bHRzW10gPSB7CisgICAgeyAicHJvZmlsZSIsICAgICAgICAiMCIgICB9LAorICAgIHsgImIiLCAgICAgICAgICAgICAgIjAiICAgfSwKKyAgICB7ICJiZiIsICAgICAgICAgICAgICIwIiAgIH0sCisgICAgeyAiZyIsICAgICAgICAgICAgICAiMjUwIiB9LAorICAgIHsgImdsb2JhbF9xdWFsaXR5IiwgIjEwMCIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHZhYXBpX2VuY29kZV92cDlfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAidnA5X3ZhYXBpIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gdmFhcGlfZW5jb2RlX3ZwOV9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZDb2RlYyBmZl92cDlfdmFhcGlfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidnA5X3ZhYXBpIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVlA5IChWQUFQSSkiKSwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA5LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IChzaXplb2YoVkFBUElFbmNvZGVDb250ZXh0KSArCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihWQUFQSUVuY29kZVZQOU9wdGlvbnMpKSwKKyAgICAuaW5pdCAgICAgICAgICAgPSAmdmFhcGlfZW5jb2RlX3ZwOV9pbml0LAorICAgIC5lbmNvZGUyICAgICAgICA9ICZmZl92YWFwaV9lbmNvZGUyLAorICAgIC5jbG9zZSAgICAgICAgICA9ICZmZl92YWFwaV9lbmNvZGVfY2xvc2UsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnZhYXBpX2VuY29kZV92cDlfY2xhc3MsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0hBUkRXQVJFLAorICAgIC5kZWZhdWx0cyAgICAgICA9IHZhYXBpX2VuY29kZV92cDlfZGVmYXVsdHMsCisgICAgLnBpeF9mbXRzID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfVkFBUEksCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9LAorICAgIC53cmFwcGVyX25hbWUgICA9ICJ2YWFwaSIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaV9oMjY0LmMgYi9saWJhdmNvZGVjL3ZhYXBpX2gyNjQuYwppbmRleCBkZWQyY2IzLi41ODU0NTg3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZhYXBpX2gyNjQuYworKysgYi9saWJhdmNvZGVjL3ZhYXBpX2gyNjQuYwpAQCAtMjAsOSArMjAsMTAgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSAidmFhcGlfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJoMjY0LmgiCi0jaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSAiaDI2NGRlYy5oIgorI2luY2x1ZGUgImgyNjRfcHMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCisjaW5jbHVkZSAidmFhcGlfZGVjb2RlLmgiCiAKIC8qKgogICogQGZpbGUKQEAgLTUyLDcgKzUzLDcgQEAKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnNlZGVzIHBpYydzIGZpZWxkIHR5cGUgaWYgbm9uemVyby4KICAqLwogc3RhdGljIHZvaWQgZmlsbF92YWFwaV9waWMoVkFQaWN0dXJlSDI2NCAqdmFfcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFBpY3R1cmUgICAqcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NFBpY3R1cmUgKnBpYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgIHBpY19zdHJ1Y3R1cmUpCiB7CiAgICAgaWYgKHBpY19zdHJ1Y3R1cmUgPT0gMCkKQEAgLTkwLDcgKzkxLDcgQEAKICAqIGF2YWlsYWJsZS4gIFRoZSBkZWNvZGVkIHBpY3R1cmUgYnVmZmVyJ3Mgc2l6ZSBtdXN0IGJlIGxhcmdlIGVub3VnaAogICogdG8gcmVjZWl2ZSB0aGUgbmV3IFZBIEFQSSBwaWN0dXJlIG9iamVjdC4KICAqLwotc3RhdGljIGludCBkcGJfYWRkKERQQiAqZHBiLCBIMjY0UGljdHVyZSAqcGljKQorc3RhdGljIGludCBkcGJfYWRkKERQQiAqZHBiLCBjb25zdCBIMjY0UGljdHVyZSAqcGljKQogewogICAgIGludCBpOwogCkBAIC0xMjIsNyArMTIzLDcgQEAKIAogLyoqIEZpbGwgaW4gVkEgQVBJIHJlZmVyZW5jZSBmcmFtZXMgYXJyYXkuICovCiBzdGF0aWMgaW50IGZpbGxfdmFhcGlfUmVmZXJlbmNlRnJhbWVzKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQgKnBpY19wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NENvbnRleHQgICAgICAgICAgICAgICAgICAqaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSDI2NENvbnRleHQgICAgICAgICAgICAqaCkKIHsKICAgICBEUEIgZHBiOwogICAgIGludCBpOwpAQCAtMTM0LDEzICsxMzUsMTMgQEAKICAgICAgICAgaW5pdF92YWFwaV9waWMoJmRwYi52YV9waWNzW2ldKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBoLT5zaG9ydF9yZWZfY291bnQ7IGkrKykgewotICAgICAgICBIMjY0UGljdHVyZSAqIGNvbnN0IHBpYyA9IGgtPnNob3J0X3JlZltpXTsKKyAgICAgICAgY29uc3QgSDI2NFBpY3R1cmUgKnBpYyA9IGgtPnNob3J0X3JlZltpXTsKICAgICAgICAgaWYgKHBpYyAmJiBwaWMtPnJlZmVyZW5jZSAmJiBkcGJfYWRkKCZkcGIsIHBpYykgPCAwKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICAgIEgyNjRQaWN0dXJlICogY29uc3QgcGljID0gaC0+bG9uZ19yZWZbaV07CisgICAgICAgIGNvbnN0IEgyNjRQaWN0dXJlICpwaWMgPSBoLT5sb25nX3JlZltpXTsKICAgICAgICAgaWYgKHBpYyAmJiBwaWMtPnJlZmVyZW5jZSAmJiBkcGJfYWRkKCZkcGIsIHBpYykgPCAwKQogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTE1Niw3ICsxNTcsNyBAQAogICogQHBhcmFtW2luXSAgcmVmX2NvdW50ICAgVGhlIG51bWJlciBvZiByZWZlcmVuY2UgcGljdHVyZXMgaW4gcmVmX2xpc3QKICAqLwogc3RhdGljIHZvaWQgZmlsbF92YWFwaV9SZWZQaWNMaXN0KFZBUGljdHVyZUgyNjQgUmVmUGljTGlzdFszMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSDI2NFJlZiAgKnJlZl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEgyNjRSZWYgKnJlZl9saXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgcmVmX2NvdW50KQogewogICAgIHVuc2lnbmVkIGludCBpLCBuID0gMDsKQEAgLTE4NCw3ICsxODUsNyBAQAogICogQHBhcmFtW291dF0gY2hyb21hX3dlaWdodCAgICAgICBWQSBBUEkgcGxhaW4gY2hyb21hIHdlaWdodCB0YWJsZQogICogQHBhcmFtW291dF0gY2hyb21hX29mZnNldCAgICAgICBWQSBBUEkgcGxhaW4gY2hyb21hIG9mZnNldCB0YWJsZQogICovCi1zdGF0aWMgdm9pZCBmaWxsX3ZhYXBpX3BsYWluX3ByZWRfd2VpZ2h0X3RhYmxlKEgyNjRDb250ZXh0ICAgKmgsCitzdGF0aWMgdm9pZCBmaWxsX3ZhYXBpX3BsYWluX3ByZWRfd2VpZ2h0X3RhYmxlKGNvbnN0IEgyNjRDb250ZXh0ICpoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICBsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpsdW1hX3dlaWdodF9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICBsdW1hX3dlaWdodFszMl0sCkBAIC0xOTMsMjggKzE5NCwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgICAgICAgICBjaHJvbWFfd2VpZ2h0WzMyXVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgICAgICAgICAgY2hyb21hX29mZnNldFszMl1bMl0pCiB7Ci0gICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOworICAgIGNvbnN0IEgyNjRTbGljZUNvbnRleHQgKnNsID0gJmgtPnNsaWNlX2N0eFswXTsKICAgICB1bnNpZ25lZCBpbnQgaSwgajsKIAotICAgICpsdW1hX3dlaWdodF9mbGFnICAgID0gc2wtPmx1bWFfd2VpZ2h0X2ZsYWdbbGlzdF07Ci0gICAgKmNocm9tYV93ZWlnaHRfZmxhZyAgPSBzbC0+Y2hyb21hX3dlaWdodF9mbGFnW2xpc3RdOworICAgICpsdW1hX3dlaWdodF9mbGFnICAgID0gc2wtPnB3dC5sdW1hX3dlaWdodF9mbGFnW2xpc3RdOworICAgICpjaHJvbWFfd2VpZ2h0X2ZsYWcgID0gc2wtPnB3dC5jaHJvbWFfd2VpZ2h0X2ZsYWdbbGlzdF07CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2wtPnJlZl9jb3VudFtsaXN0XTsgaSsrKSB7CiAgICAgICAgIC8qIFZBIEFQSSBhbHNvIHdhbnRzIHRoZSBpbmZlcnJlZCAoZGVmYXVsdCkgdmFsdWVzLCBub3QKICAgICAgICAgICAgb25seSB3aGF0IGlzIGF2YWlsYWJsZSBpbiB0aGUgYml0c3RyZWFtICg3LjQuMy4yKS4gKi8KLSAgICAgICAgaWYgKHNsLT5sdW1hX3dlaWdodF9mbGFnW2xpc3RdKSB7Ci0gICAgICAgICAgICBsdW1hX3dlaWdodFtpXSA9IHNsLT5sdW1hX3dlaWdodFtpXVtsaXN0XVswXTsKLSAgICAgICAgICAgIGx1bWFfb2Zmc2V0W2ldID0gc2wtPmx1bWFfd2VpZ2h0W2ldW2xpc3RdWzFdOworICAgICAgICBpZiAoc2wtPnB3dC5sdW1hX3dlaWdodF9mbGFnW2xpc3RdKSB7CisgICAgICAgICAgICBsdW1hX3dlaWdodFtpXSA9IHNsLT5wd3QubHVtYV93ZWlnaHRbaV1bbGlzdF1bMF07CisgICAgICAgICAgICBsdW1hX29mZnNldFtpXSA9IHNsLT5wd3QubHVtYV93ZWlnaHRbaV1bbGlzdF1bMV07CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsdW1hX3dlaWdodFtpXSA9IDEgPDwgc2wtPmx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgICAgICAgICBsdW1hX3dlaWdodFtpXSA9IDEgPDwgc2wtPnB3dC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tOwogICAgICAgICAgICAgbHVtYV9vZmZzZXRbaV0gPSAwOwogICAgICAgICB9CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChzbC0+Y2hyb21hX3dlaWdodF9mbGFnW2xpc3RdKSB7Ci0gICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodFtpXVtqXSA9IHNsLT5jaHJvbWFfd2VpZ2h0W2ldW2xpc3RdW2pdWzBdOwotICAgICAgICAgICAgICAgIGNocm9tYV9vZmZzZXRbaV1bal0gPSBzbC0+Y2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVsxXTsKKyAgICAgICAgICAgIGlmIChzbC0+cHd0LmNocm9tYV93ZWlnaHRfZmxhZ1tsaXN0XSkgeworICAgICAgICAgICAgICAgIGNocm9tYV93ZWlnaHRbaV1bal0gPSBzbC0+cHd0LmNocm9tYV93ZWlnaHRbaV1bbGlzdF1bal1bMF07CisgICAgICAgICAgICAgICAgY2hyb21hX29mZnNldFtpXVtqXSA9IHNsLT5wd3QuY2hyb21hX3dlaWdodFtpXVtsaXN0XVtqXVsxXTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hyb21hX3dlaWdodFtpXVtqXSA9IDEgPDwgc2wtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKKyAgICAgICAgICAgICAgICBjaHJvbWFfd2VpZ2h0W2ldW2pdID0gMSA8PCBzbC0+cHd0LmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbTsKICAgICAgICAgICAgICAgICBjaHJvbWFfb2Zmc2V0W2ldW2pdID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjI2LDkwICsyMjcsMTAzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl91bnVzZWQgdWludDMyX3QgICAgICAgc2l6ZSkKIHsKLSAgICBIMjY0Q29udGV4dCAqIGNvbnN0IGggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEZGVkFDb250ZXh0ICogY29uc3QgdmFjdHggPSBmZl92YWFwaV9nZXRfY29udGV4dChhdmN0eCk7Ci0gICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySDI2NCAqcGljX3BhcmFtOwotICAgIFZBSVFNYXRyaXhCdWZmZXJIMjY0ICppcV9tYXRyaXg7CisgICAgY29uc3QgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRGVjb2RlUGljdHVyZSAqcGljID0gaC0+Y3VyX3BpY19wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIGNvbnN0IFBQUyAqcHBzID0gaC0+cHMucHBzOworICAgIGNvbnN0IFNQUyAqc3BzID0gaC0+cHMuc3BzOworICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckgyNjQgcGljX3BhcmFtOworICAgIFZBSVFNYXRyaXhCdWZmZXJIMjY0IGlxX21hdHJpeDsKKyAgICBpbnQgZXJyOwogCi0gICAgZmZfZGxvZyhhdmN0eCwgInZhYXBpX2gyNjRfc3RhcnRfZnJhbWUoKVxuIik7CisgICAgcGljLT5vdXRwdXRfc3VyZmFjZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKGgtPmN1cl9waWNfcHRyLT5mKTsKIAotICAgIHZhY3R4LT5zbGljZV9wYXJhbV9zaXplID0gc2l6ZW9mKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0KTsKKyAgICBwaWNfcGFyYW0gPSAoVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySDI2NCkgeworICAgICAgICAucGljdHVyZV93aWR0aF9pbl9tYnNfbWludXMxICAgICAgICAgICAgICAgID0gaC0+bWJfd2lkdGggLSAxLAorICAgICAgICAucGljdHVyZV9oZWlnaHRfaW5fbWJzX21pbnVzMSAgICAgICAgICAgICAgID0gaC0+bWJfaGVpZ2h0IC0gMSwKKyAgICAgICAgLmJpdF9kZXB0aF9sdW1hX21pbnVzOCAgICAgICAgICAgICAgICAgICAgICA9IHNwcy0+Yml0X2RlcHRoX2x1bWEgLSA4LAorICAgICAgICAuYml0X2RlcHRoX2Nocm9tYV9taW51czggICAgICAgICAgICAgICAgICAgID0gc3BzLT5iaXRfZGVwdGhfY2hyb21hIC0gOCwKKyAgICAgICAgLm51bV9yZWZfZnJhbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcy0+cmVmX2ZyYW1lX2NvdW50LAorICAgICAgICAuc2VxX2ZpZWxkcy5iaXRzID0geworICAgICAgICAgICAgLmNocm9tYV9mb3JtYXRfaWRjICAgICAgICAgICAgICAgICAgICAgID0gc3BzLT5jaHJvbWFfZm9ybWF0X2lkYywKKyAgICAgICAgICAgIC5yZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcgICAgICAgICA9IHNwcy0+cmVzaWR1YWxfY29sb3JfdHJhbnNmb3JtX2ZsYWcsCisgICAgICAgICAgICAuZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnICAgPSBzcHMtPmdhcHNfaW5fZnJhbWVfbnVtX2FsbG93ZWRfZmxhZywKKyAgICAgICAgICAgIC5mcmFtZV9tYnNfb25seV9mbGFnICAgICAgICAgICAgICAgICAgICA9IHNwcy0+ZnJhbWVfbWJzX29ubHlfZmxhZywKKyAgICAgICAgICAgIC5tYl9hZGFwdGl2ZV9mcmFtZV9maWVsZF9mbGFnICAgICAgICAgICA9IHNwcy0+bWJfYWZmLAorICAgICAgICAgICAgLmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgICAgICAgICAgICAgID0gc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnLAorICAgICAgICAgICAgLk1pbkx1bWFCaVByZWRTaXplOHg4ICAgICAgICAgICAgICAgICAgID0gc3BzLT5sZXZlbF9pZGMgPj0gMzEsIC8qIEEuMy4zLjIgKi8KKyAgICAgICAgICAgIC5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICAgICAgICAgICAgICA9IHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtIC0gNCwKKyAgICAgICAgICAgIC5waWNfb3JkZXJfY250X3R5cGUgICAgICAgICAgICAgICAgICAgICA9IHNwcy0+cG9jX3R5cGUsCisgICAgICAgICAgICAubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICAgICAgPSBzcHMtPmxvZzJfbWF4X3BvY19sc2IgLSA0LAorICAgICAgICAgICAgLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnICAgICAgID0gc3BzLT5kZWx0YV9waWNfb3JkZXJfYWx3YXlzX3plcm9fZmxhZywKKyAgICAgICAgfSwKKyAgICAgICAgLm51bV9zbGljZV9ncm91cHNfbWludXMxICAgICAgICAgICAgICAgICAgICA9IHBwcy0+c2xpY2VfZ3JvdXBfY291bnQgLSAxLAorICAgICAgICAuc2xpY2VfZ3JvdXBfbWFwX3R5cGUgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT5tYl9zbGljZV9ncm91cF9tYXBfdHlwZSwKKyAgICAgICAgLnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSAgICAgICAgICAgICA9IDAsIC8qIEZNTyBpcyBub3QgaW1wbGVtZW50ZWQgKi8KKyAgICAgICAgLnBpY19pbml0X3FwX21pbnVzMjYgICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+aW5pdF9xcCAtIDI2LAorICAgICAgICAucGljX2luaXRfcXNfbWludXMyNiAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT5pbml0X3FzIC0gMjYsCisgICAgICAgIC5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgPSBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF0sCisgICAgICAgIC5zZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICAgICAgPSBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMV0sCisgICAgICAgIC5waWNfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAuZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICAgICAgICAgICAgICAgPSBwcHMtPmNhYmFjLAorICAgICAgICAgICAgLndlaWdodGVkX3ByZWRfZmxhZyAgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9wcmVkLAorICAgICAgICAgICAgLndlaWdodGVkX2JpcHJlZF9pZGMgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjLAorICAgICAgICAgICAgLnRyYW5zZm9ybV84eDhfbW9kZV9mbGFnICAgICAgICAgICAgICAgID0gcHBzLT50cmFuc2Zvcm1fOHg4X21vZGUsCisgICAgICAgICAgICAuZmllbGRfcGljX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FLAorICAgICAgICAgICAgLmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyAgICAgICAgICAgID0gcHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkLAorICAgICAgICAgICAgLnBpY19vcmRlcl9wcmVzZW50X2ZsYWcgICAgICAgICAgICAgICAgID0gcHBzLT5waWNfb3JkZXJfcHJlc2VudCwKKyAgICAgICAgICAgIC5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IHBwcy0+ZGVibG9ja2luZ19maWx0ZXJfcGFyYW1ldGVyc19wcmVzZW50LAorICAgICAgICAgICAgLnJlZHVuZGFudF9waWNfY250X3ByZXNlbnRfZmxhZyAgICAgICAgID0gcHBzLT5yZWR1bmRhbnRfcGljX2NudF9wcmVzZW50LAorICAgICAgICAgICAgLnJlZmVyZW5jZV9waWNfZmxhZyAgICAgICAgICAgICAgICAgICAgID0gaC0+bmFsX3JlZl9pZGMgIT0gMCwKKyAgICAgICAgfSwKKyAgICAgICAgLmZyYW1lX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPnBvYy5mcmFtZV9udW0sCisgICAgfTsKIAotICAgIC8qIEZpbGwgaW4gVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySDI2NC4gKi8KLSAgICBwaWNfcGFyYW0gPSBmZl92YWFwaV9hbGxvY19waWNfcGFyYW0odmFjdHgsIHNpemVvZihWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIMjY0KSk7Ci0gICAgaWYgKCFwaWNfcGFyYW0pCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBmaWxsX3ZhYXBpX3BpYygmcGljX3BhcmFtLT5DdXJyUGljLCBoLT5jdXJfcGljX3B0ciwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOwotICAgIGlmIChmaWxsX3ZhYXBpX1JlZmVyZW5jZUZyYW1lcyhwaWNfcGFyYW0sIGgpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHBpY19wYXJhbS0+cGljdHVyZV93aWR0aF9pbl9tYnNfbWludXMxICAgICAgICAgICAgICAgICAgICAgID0gaC0+bWJfd2lkdGggLSAxOwotICAgIHBpY19wYXJhbS0+cGljdHVyZV9oZWlnaHRfaW5fbWJzX21pbnVzMSAgICAgICAgICAgICAgICAgICAgID0gaC0+bWJfaGVpZ2h0IC0gMTsKLSAgICBwaWNfcGFyYW0tPmJpdF9kZXB0aF9sdW1hX21pbnVzOCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPnNwcy5iaXRfZGVwdGhfbHVtYSAtIDg7Ci0gICAgcGljX3BhcmFtLT5iaXRfZGVwdGhfY2hyb21hX21pbnVzOCAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMuYml0X2RlcHRoX2Nocm9tYSAtIDg7Ci0gICAgcGljX3BhcmFtLT5udW1fcmVmX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMucmVmX2ZyYW1lX2NvdW50OwotICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KLSAgICBwaWNfcGFyYW0tPnNlcV9maWVsZHMuYml0cy5jaHJvbWFfZm9ybWF0X2lkYyAgICAgICAgICAgICAgICA9IGgtPnNwcy5jaHJvbWFfZm9ybWF0X2lkYzsKLSAgICBwaWNfcGFyYW0tPnNlcV9maWVsZHMuYml0cy5yZXNpZHVhbF9jb2xvdXJfdHJhbnNmb3JtX2ZsYWcgICA9IGgtPnNwcy5yZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZzsgLyogWFhYOiBvbmx5IGZvciA0OjQ6NCBoaWdoIHByb2ZpbGU/ICovCi0gICAgcGljX3BhcmFtLT5zZXFfZmllbGRzLmJpdHMuZ2Fwc19pbl9mcmFtZV9udW1fdmFsdWVfYWxsb3dlZF9mbGFnID0gaC0+c3BzLmdhcHNfaW5fZnJhbWVfbnVtX2FsbG93ZWRfZmxhZzsKLSAgICBwaWNfcGFyYW0tPnNlcV9maWVsZHMuYml0cy5mcmFtZV9tYnNfb25seV9mbGFnICAgICAgICAgICAgICA9IGgtPnNwcy5mcmFtZV9tYnNfb25seV9mbGFnOwotICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy5iaXRzLm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgICAgID0gaC0+c3BzLm1iX2FmZjsKLSAgICBwaWNfcGFyYW0tPnNlcV9maWVsZHMuYml0cy5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnICAgICAgICA9IGgtPnNwcy5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOwotICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy5iaXRzLk1pbkx1bWFCaVByZWRTaXplOHg4ICAgICAgICAgICAgID0gaC0+c3BzLmxldmVsX2lkYyA+PSAzMTsgLyogQS4zLjMuMiAqLwotICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy5iaXRzLmxvZzJfbWF4X2ZyYW1lX251bV9taW51czQgICAgICAgID0gaC0+c3BzLmxvZzJfbWF4X2ZyYW1lX251bSAtIDQ7Ci0gICAgcGljX3BhcmFtLT5zZXFfZmllbGRzLmJpdHMucGljX29yZGVyX2NudF90eXBlICAgICAgICAgICAgICAgPSBoLT5zcHMucG9jX3R5cGU7Ci0gICAgcGljX3BhcmFtLT5zZXFfZmllbGRzLmJpdHMubG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ID0gaC0+c3BzLmxvZzJfbWF4X3BvY19sc2IgLSA0OwotICAgIHBpY19wYXJhbS0+c2VxX2ZpZWxkcy5iaXRzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnID0gaC0+c3BzLmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOwotICAgIHBpY19wYXJhbS0+bnVtX3NsaWNlX2dyb3Vwc19taW51czEgICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLnNsaWNlX2dyb3VwX2NvdW50IC0gMTsKLSAgICBwaWNfcGFyYW0tPnNsaWNlX2dyb3VwX21hcF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy5tYl9zbGljZV9ncm91cF9tYXBfdHlwZTsKLSAgICBwaWNfcGFyYW0tPnNsaWNlX2dyb3VwX2NoYW5nZV9yYXRlX21pbnVzMSAgICAgICAgICAgICAgICAgICA9IDA7IC8qIFhYWDogdW5pbXBsZW1lbnRlZCBpbiBGRm1wZWcgKi8KLSAgICBwaWNfcGFyYW0tPnBpY19pbml0X3FwX21pbnVzMjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy5pbml0X3FwIC0gMjY7Ci0gICAgcGljX3BhcmFtLT5waWNfaW5pdF9xc19taW51czI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5wcHMuaW5pdF9xcyAtIDI2OwotICAgIHBpY19wYXJhbS0+Y2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF07Ci0gICAgcGljX3BhcmFtLT5zZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICAgICAgICAgICAgPSBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFsxXTsKLSAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMudmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT5waWNfZmllbGRzLmJpdHMuZW50cm9weV9jb2RpbmdfbW9kZV9mbGFnICAgICAgICAgPSBoLT5wcHMuY2FiYWM7Ci0gICAgcGljX3BhcmFtLT5waWNfZmllbGRzLmJpdHMud2VpZ2h0ZWRfcHJlZF9mbGFnICAgICAgICAgICAgICAgPSBoLT5wcHMud2VpZ2h0ZWRfcHJlZDsKLSAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy53ZWlnaHRlZF9iaXByZWRfaWRjICAgICAgICAgICAgICA9IGgtPnBwcy53ZWlnaHRlZF9iaXByZWRfaWRjOwotICAgIHBpY19wYXJhbS0+cGljX2ZpZWxkcy5iaXRzLnRyYW5zZm9ybV84eDhfbW9kZV9mbGFnICAgICAgICAgID0gaC0+cHBzLnRyYW5zZm9ybV84eDhfbW9kZTsKLSAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy5maWVsZF9waWNfZmxhZyAgICAgICAgICAgICAgICAgICA9IGgtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUU7Ci0gICAgcGljX3BhcmFtLT5waWNfZmllbGRzLmJpdHMuY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnICAgICAgPSBoLT5wcHMuY29uc3RyYWluZWRfaW50cmFfcHJlZDsKLSAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy5waWNfb3JkZXJfcHJlc2VudF9mbGFnICAgICAgICAgICA9IGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudDsKLSAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IGgtPnBwcy5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQ7Ci0gICAgcGljX3BhcmFtLT5waWNfZmllbGRzLmJpdHMucmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnICAgPSBoLT5wcHMucmVkdW5kYW50X3BpY19jbnRfcHJlc2VudDsKLSAgICBwaWNfcGFyYW0tPnBpY19maWVsZHMuYml0cy5yZWZlcmVuY2VfcGljX2ZsYWcgICAgICAgICAgICAgICA9IGgtPm5hbF9yZWZfaWRjICE9IDA7Ci0gICAgcGljX3BhcmFtLT5mcmFtZV9udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5mcmFtZV9udW07CisgICAgZmlsbF92YWFwaV9waWMoJnBpY19wYXJhbS5DdXJyUGljLCBoLT5jdXJfcGljX3B0ciwgaC0+cGljdHVyZV9zdHJ1Y3R1cmUpOworICAgIGVyciA9IGZpbGxfdmFhcGlfUmVmZXJlbmNlRnJhbWVzKCZwaWNfcGFyYW0sIGgpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICAvKiBGaWxsIGluIFZBSVFNYXRyaXhCdWZmZXJIMjY0LiAqLwotICAgIGlxX21hdHJpeCA9IGZmX3ZhYXBpX2FsbG9jX2lxX21hdHJpeCh2YWN0eCwgc2l6ZW9mKFZBSVFNYXRyaXhCdWZmZXJIMjY0KSk7Ci0gICAgaWYgKCFpcV9tYXRyaXgpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBtZW1jcHkoaXFfbWF0cml4LT5TY2FsaW5nTGlzdDR4NCwgaC0+cHBzLnNjYWxpbmdfbWF0cml4NCwgc2l6ZW9mKGlxX21hdHJpeC0+U2NhbGluZ0xpc3Q0eDQpKTsKLSAgICBtZW1jcHkoaXFfbWF0cml4LT5TY2FsaW5nTGlzdDh4OFswXSwgaC0+cHBzLnNjYWxpbmdfbWF0cml4OFswXSwgc2l6ZW9mKGlxX21hdHJpeC0+U2NhbGluZ0xpc3Q4eDhbMF0pKTsKLSAgICBtZW1jcHkoaXFfbWF0cml4LT5TY2FsaW5nTGlzdDh4OFsxXSwgaC0+cHBzLnNjYWxpbmdfbWF0cml4OFszXSwgc2l6ZW9mKGlxX21hdHJpeC0+U2NhbGluZ0xpc3Q4eDhbMF0pKTsKKyAgICBlcnIgPSBmZl92YWFwaV9kZWNvZGVfbWFrZV9wYXJhbV9idWZmZXIoYXZjdHgsIHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpY19wYXJhbSwgc2l6ZW9mKHBpY19wYXJhbSkpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBtZW1jcHkoaXFfbWF0cml4LlNjYWxpbmdMaXN0NHg0LAorICAgICAgICAgICBwcHMtPnNjYWxpbmdfbWF0cml4NCwgc2l6ZW9mKGlxX21hdHJpeC5TY2FsaW5nTGlzdDR4NCkpOworICAgIG1lbWNweShpcV9tYXRyaXguU2NhbGluZ0xpc3Q4eDhbMF0sCisgICAgICAgICAgIHBwcy0+c2NhbGluZ19tYXRyaXg4WzBdLCBzaXplb2YoaXFfbWF0cml4LlNjYWxpbmdMaXN0OHg4WzBdKSk7CisgICAgbWVtY3B5KGlxX21hdHJpeC5TY2FsaW5nTGlzdDh4OFsxXSwKKyAgICAgICAgICAgcHBzLT5zY2FsaW5nX21hdHJpeDhbM10sIHNpemVvZihpcV9tYXRyaXguU2NhbGluZ0xpc3Q4eDhbMF0pKTsKKworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3BhcmFtX2J1ZmZlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUlRTWF0cml4QnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlxX21hdHJpeCwgc2l6ZW9mKGlxX21hdHJpeCkpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKICAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKGF2Y3R4LCBwaWMpOworICAgIHJldHVybiBlcnI7CiB9CiAKIC8qKiBFbmQgYSBoYXJkd2FyZSBkZWNvZGluZyBiYXNlZCBmcmFtZS4gKi8KIHN0YXRpYyBpbnQgdmFhcGlfaDI2NF9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIEZGVkFDb250ZXh0ICogY29uc3QgdmFjdHggPSBmZl92YWFwaV9nZXRfY29udGV4dChhdmN0eCk7Ci0gICAgSDI2NENvbnRleHQgKiBjb25zdCBoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBoLT5jdXJfcGljX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CiAgICAgSDI2NFNsaWNlQ29udGV4dCAqc2wgPSAmaC0+c2xpY2VfY3R4WzBdOwogICAgIGludCByZXQ7CiAKLSAgICBmZl9kbG9nKGF2Y3R4LCAidmFhcGlfaDI2NF9lbmRfZnJhbWUoKVxuIik7Ci0gICAgcmV0ID0gZmZfdmFhcGlfY29tbWl0X3NsaWNlcyh2YWN0eCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZmluaXNoOwotCi0gICAgcmV0ID0gZmZfdmFhcGlfcmVuZGVyX3BpY3R1cmUodmFjdHgsIGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKGgtPmN1cl9waWNfcHRyLT5mKSk7CisgICAgcmV0ID0gZmZfdmFhcGlfZGVjb2RlX2lzc3VlKGF2Y3R4LCBwaWMpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGZpbmlzaDsKIAogICAgIGZmX2gyNjRfZHJhd19ob3Jpel9iYW5kKGgsIHNsLCAwLCBoLT5hdmN0eC0+aGVpZ2h0KTsKIAogZmluaXNoOgotICAgIGZmX3ZhYXBpX2NvbW1vbl9lbmRfZnJhbWUoYXZjdHgpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTMxOCw1MyArMzMyLDc0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBzaXplKQogewotICAgIEZGVkFDb250ZXh0ICogY29uc3QgdmFjdHggPSBmZl92YWFwaV9nZXRfY29udGV4dChhdmN0eCk7Ci0gICAgSDI2NENvbnRleHQgKiBjb25zdCBoID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBIMjY0U2xpY2VDb250ZXh0ICpzbCAgPSAmaC0+c2xpY2VfY3R4WzBdOwotICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIMjY0ICpzbGljZV9wYXJhbTsKKyAgICBjb25zdCBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBoLT5jdXJfcGljX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgY29uc3QgSDI2NFNsaWNlQ29udGV4dCAqc2wgID0gJmgtPnNsaWNlX2N0eFswXTsKKyAgICBWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NCBzbGljZV9wYXJhbTsKKyAgICBpbnQgZXJyOwogCi0gICAgZmZfZGxvZyhhdmN0eCwgInZhYXBpX2gyNjRfZGVjb2RlX3NsaWNlKCk6IGJ1ZmZlciAlcCwgc2l6ZSAlZFxuIiwKLSAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSk7CisgICAgc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlckgyNjQpIHsKKyAgICAgICAgLnNsaWNlX2RhdGFfc2l6ZSAgICAgICAgICAgICAgID0gc2l6ZSwKKyAgICAgICAgLnNsaWNlX2RhdGFfb2Zmc2V0ICAgICAgICAgICAgID0gMCwKKyAgICAgICAgLnNsaWNlX2RhdGFfZmxhZyAgICAgICAgICAgICAgID0gVkFfU0xJQ0VfREFUQV9GTEFHX0FMTCwKKyAgICAgICAgLnNsaWNlX2RhdGFfYml0X29mZnNldCAgICAgICAgID0gZ2V0X2JpdHNfY291bnQoJnNsLT5nYiksCisgICAgICAgIC5maXJzdF9tYl9pbl9zbGljZSAgICAgICAgICAgICA9IChzbC0+bWJfeSA+PiBGSUVMRF9PUl9NQkFGRl9QSUNUVVJFKGgpKSAqIGgtPm1iX3dpZHRoICsgc2wtPm1iX3gsCisgICAgICAgIC5zbGljZV90eXBlICAgICAgICAgICAgICAgICAgICA9IGZmX2gyNjRfZ2V0X3NsaWNlX3R5cGUoc2wpLAorICAgICAgICAuZGlyZWN0X3NwYXRpYWxfbXZfcHJlZF9mbGFnICAgPSBzbC0+c2xpY2VfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiA/IHNsLT5kaXJlY3Rfc3BhdGlhbF9tdl9wcmVkIDogMCwKKyAgICAgICAgLm51bV9yZWZfaWR4X2wwX2FjdGl2ZV9taW51czEgID0gc2wtPmxpc3RfY291bnQgPiAwID8gc2wtPnJlZl9jb3VudFswXSAtIDEgOiAwLAorICAgICAgICAubnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSAgPSBzbC0+bGlzdF9jb3VudCA+IDEgPyBzbC0+cmVmX2NvdW50WzFdIC0gMSA6IDAsCisgICAgICAgIC5jYWJhY19pbml0X2lkYyAgICAgICAgICAgICAgICA9IHNsLT5jYWJhY19pbml0X2lkYywKKyAgICAgICAgLnNsaWNlX3FwX2RlbHRhICAgICAgICAgICAgICAgID0gc2wtPnFzY2FsZSAtIGgtPnBzLnBwcy0+aW5pdF9xcCwKKyAgICAgICAgLmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjID0gc2wtPmRlYmxvY2tpbmdfZmlsdGVyIDwgMiA/ICFzbC0+ZGVibG9ja2luZ19maWx0ZXIgOiBzbC0+ZGVibG9ja2luZ19maWx0ZXIsCisgICAgICAgIC5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiAgICA9IHNsLT5zbGljZV9hbHBoYV9jMF9vZmZzZXQgLyAyLAorICAgICAgICAuc2xpY2VfYmV0YV9vZmZzZXRfZGl2MiAgICAgICAgPSBzbC0+c2xpY2VfYmV0YV9vZmZzZXQgICAgIC8gMiwKKyAgICAgICAgLmx1bWFfbG9nMl93ZWlnaHRfZGVub20gICAgICAgID0gc2wtPnB3dC5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tLAorICAgICAgICAuY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tICAgICAgPSBzbC0+cHd0LmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSwKKyAgICB9OwogCi0gICAgLyogRmlsbCBpbiBWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NC4gKi8KLSAgICBzbGljZV9wYXJhbSA9IChWQVNsaWNlUGFyYW1ldGVyQnVmZmVySDI2NCAqKWZmX3ZhYXBpX2FsbG9jX3NsaWNlKHZhY3R4LCBidWZmZXIsIHNpemUpOwotICAgIGlmICghc2xpY2VfcGFyYW0pCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzbGljZV9wYXJhbS0+c2xpY2VfZGF0YV9iaXRfb2Zmc2V0ICAgICAgICAgID0gZ2V0X2JpdHNfY291bnQoJnNsLT5nYikgKyA4OyAvKiBiaXQgYnVmZmVyIHN0YXJ0ZWQgYmV5b25kIG5hbF91bml0X3R5cGUgKi8KLSAgICBzbGljZV9wYXJhbS0+Zmlyc3RfbWJfaW5fc2xpY2UgICAgICAgICAgICAgID0gKHNsLT5tYl95ID4+IEZJRUxEX09SX01CQUZGX1BJQ1RVUkUoaCkpICogaC0+bWJfd2lkdGggKyBzbC0+bWJfeDsKLSAgICBzbGljZV9wYXJhbS0+c2xpY2VfdHlwZSAgICAgICAgICAgICAgICAgICAgID0gZmZfaDI2NF9nZXRfc2xpY2VfdHlwZShzbCk7Ci0gICAgc2xpY2VfcGFyYW0tPmRpcmVjdF9zcGF0aWFsX212X3ByZWRfZmxhZyAgICA9IHNsLT5zbGljZV90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CID8gc2wtPmRpcmVjdF9zcGF0aWFsX212X3ByZWQgOiAwOwotICAgIHNsaWNlX3BhcmFtLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICAgPSBzbC0+bGlzdF9jb3VudCA+IDAgPyBzbC0+cmVmX2NvdW50WzBdIC0gMSA6IDA7Ci0gICAgc2xpY2VfcGFyYW0tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgICA9IHNsLT5saXN0X2NvdW50ID4gMSA/IHNsLT5yZWZfY291bnRbMV0gLSAxIDogMDsKLSAgICBzbGljZV9wYXJhbS0+Y2FiYWNfaW5pdF9pZGMgICAgICAgICAgICAgICAgID0gc2wtPmNhYmFjX2luaXRfaWRjOwotICAgIHNsaWNlX3BhcmFtLT5zbGljZV9xcF9kZWx0YSAgICAgICAgICAgICAgICAgPSBzbC0+cXNjYWxlIC0gaC0+cHBzLmluaXRfcXA7Ci0gICAgc2xpY2VfcGFyYW0tPmRpc2FibGVfZGVibG9ja2luZ19maWx0ZXJfaWRjICA9IHNsLT5kZWJsb2NraW5nX2ZpbHRlciA8IDIgPyAhc2wtPmRlYmxvY2tpbmdfZmlsdGVyIDogc2wtPmRlYmxvY2tpbmdfZmlsdGVyOwotICAgIHNsaWNlX3BhcmFtLT5zbGljZV9hbHBoYV9jMF9vZmZzZXRfZGl2MiAgICAgPSBzbC0+c2xpY2VfYWxwaGFfYzBfb2Zmc2V0IC8gMjsKLSAgICBzbGljZV9wYXJhbS0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2MiAgICAgICAgID0gc2wtPnNsaWNlX2JldGFfb2Zmc2V0ICAgICAvIDI7Ci0gICAgc2xpY2VfcGFyYW0tPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gICAgICAgICA9IHNsLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tOwotICAgIHNsaWNlX3BhcmFtLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gICAgICAgPSBzbC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tOwotCi0gICAgZmlsbF92YWFwaV9SZWZQaWNMaXN0KHNsaWNlX3BhcmFtLT5SZWZQaWNMaXN0MCwgc2wtPnJlZl9saXN0WzBdLCBzbC0+bGlzdF9jb3VudCA+IDAgPyBzbC0+cmVmX2NvdW50WzBdIDogMCk7Ci0gICAgZmlsbF92YWFwaV9SZWZQaWNMaXN0KHNsaWNlX3BhcmFtLT5SZWZQaWNMaXN0MSwgc2wtPnJlZl9saXN0WzFdLCBzbC0+bGlzdF9jb3VudCA+IDEgPyBzbC0+cmVmX2NvdW50WzFdIDogMCk7CisgICAgZmlsbF92YWFwaV9SZWZQaWNMaXN0KHNsaWNlX3BhcmFtLlJlZlBpY0xpc3QwLCBzbC0+cmVmX2xpc3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLT5saXN0X2NvdW50ID4gMCA/IHNsLT5yZWZfY291bnRbMF0gOiAwKTsKKyAgICBmaWxsX3ZhYXBpX1JlZlBpY0xpc3Qoc2xpY2VfcGFyYW0uUmVmUGljTGlzdDEsIHNsLT5yZWZfbGlzdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2wtPmxpc3RfY291bnQgPiAxID8gc2wtPnJlZl9jb3VudFsxXSA6IDApOwogCiAgICAgZmlsbF92YWFwaV9wbGFpbl9wcmVkX3dlaWdodF90YWJsZShoLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsaWNlX3BhcmFtLT5sdW1hX3dlaWdodF9sMF9mbGFnLCAgIHNsaWNlX3BhcmFtLT5sdW1hX3dlaWdodF9sMCwgICBzbGljZV9wYXJhbS0+bHVtYV9vZmZzZXRfbDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xpY2VfcGFyYW0tPmNocm9tYV93ZWlnaHRfbDBfZmxhZywgc2xpY2VfcGFyYW0tPmNocm9tYV93ZWlnaHRfbDAsIHNsaWNlX3BhcmFtLT5jaHJvbWFfb2Zmc2V0X2wwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGljZV9wYXJhbS5sdW1hX3dlaWdodF9sMF9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VfcGFyYW0ubHVtYV93ZWlnaHRfbDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZV9wYXJhbS5sdW1hX29mZnNldF9sMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGljZV9wYXJhbS5jaHJvbWFfd2VpZ2h0X2wwX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZV9wYXJhbS5jaHJvbWFfd2VpZ2h0X2wwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VfcGFyYW0uY2hyb21hX29mZnNldF9sMCk7CiAgICAgZmlsbF92YWFwaV9wbGFpbl9wcmVkX3dlaWdodF90YWJsZShoLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsaWNlX3BhcmFtLT5sdW1hX3dlaWdodF9sMV9mbGFnLCAgIHNsaWNlX3BhcmFtLT5sdW1hX3dlaWdodF9sMSwgICBzbGljZV9wYXJhbS0+bHVtYV9vZmZzZXRfbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xpY2VfcGFyYW0tPmNocm9tYV93ZWlnaHRfbDFfZmxhZywgc2xpY2VfcGFyYW0tPmNocm9tYV93ZWlnaHRfbDEsIHNsaWNlX3BhcmFtLT5jaHJvbWFfb2Zmc2V0X2wxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGljZV9wYXJhbS5sdW1hX3dlaWdodF9sMV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VfcGFyYW0ubHVtYV93ZWlnaHRfbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZV9wYXJhbS5sdW1hX29mZnNldF9sMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGljZV9wYXJhbS5jaHJvbWFfd2VpZ2h0X2wxX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZV9wYXJhbS5jaHJvbWFfd2VpZ2h0X2wxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VfcGFyYW0uY2hyb21hX29mZnNldF9sMSk7CisKKyAgICBlcnIgPSBmZl92YWFwaV9kZWNvZGVfbWFrZV9zbGljZV9idWZmZXIoYXZjdHgsIHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNsaWNlX3BhcmFtLCBzaXplb2Yoc2xpY2VfcGFyYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHNpemUpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgZmZfdmFhcGlfZGVjb2RlX2NhbmNlbChhdmN0eCwgcGljKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIAotQVZIV0FjY2VsIGZmX2gyNjRfdmFhcGlfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF92YWFwaSIsCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCi0gICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9WQUFQSSwKLSAgICAuc3RhcnRfZnJhbWUgICAgPSB2YWFwaV9oMjY0X3N0YXJ0X2ZyYW1lLAotICAgIC5lbmRfZnJhbWUgICAgICA9IHZhYXBpX2gyNjRfZW5kX2ZyYW1lLAotICAgIC5kZWNvZGVfc2xpY2UgICA9IHZhYXBpX2gyNjRfZGVjb2RlX3NsaWNlLAotICAgIC5pbml0ICAgICAgICAgICA9IGZmX3ZhYXBpX2NvbnRleHRfaW5pdCwKLSAgICAudW5pbml0ICAgICAgICAgPSBmZl92YWFwaV9jb250ZXh0X2ZpbmksCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGVkFDb250ZXh0KSwKK2NvbnN0IEFWSFdBY2NlbCBmZl9oMjY0X3ZhYXBpX2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgID0gImgyNjRfdmFhcGkiLAorICAgIC50eXBlICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAorICAgIC5waXhfZm10ICAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfVkFBUEksCisgICAgLnN0YXJ0X2ZyYW1lICAgICAgICAgID0gJnZhYXBpX2gyNjRfc3RhcnRfZnJhbWUsCisgICAgLmVuZF9mcmFtZSAgICAgICAgICAgID0gJnZhYXBpX2gyNjRfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9ICZ2YWFwaV9oMjY0X2RlY29kZV9zbGljZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkFBUElEZWNvZGVQaWN0dXJlKSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSAmZmZfdmFhcGlfZGVjb2RlX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgICAgICAgID0gJmZmX3ZhYXBpX2RlY29kZV91bmluaXQsCisgICAgLmZyYW1lX3BhcmFtcyAgICAgICAgID0gJmZmX3ZhYXBpX2NvbW1vbl9mcmFtZV9wYXJhbXMsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKFZBQVBJRGVjb2RlQ29udGV4dCksCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgID0gSFdBQ0NFTF9DQVBfQVNZTkNfU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZhYXBpX2hldmMuYyBiL2xpYmF2Y29kZWMvdmFhcGlfaGV2Yy5jCmluZGV4IDYyZjc4M2UuLjE5YWFiY2QgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmFhcGlfaGV2Yy5jCisrKyBiL2xpYmF2Y29kZWMvdmFhcGlfaGV2Yy5jCkBAIC0yMCwzOCArMjAsMzUgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSAidmFhcGlfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJoZXZjLmgiCi0jaW5jbHVkZSAibXBlZ3V0aWxzLmgiCisjaW5jbHVkZSA8dmEvdmEuaD4KKyNpbmNsdWRlIDx2YS92YV9kZWNfaGV2Yy5oPgogCi0vKioKLSAqIEBmaWxlCi0gKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgZ2x1ZSBjb2RlIGJldHdlZW4gRkZtcGVnJ3MgYW5kIFZBIEFQSSdzCi0gKiBzdHJ1Y3R1cmVzIGZvciBIRVZDIGRlY29kaW5nLgotICovCisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImhldmNkZWMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCisjaW5jbHVkZSAidmFhcGlfZGVjb2RlLmgiCiAKLXR5cGVkZWYgc3RydWN0IHZhYXBpX2hldmNfZnJhbWVfZGF0YSB7Ci0gICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySEVWQyAqcGljX3BhcmFtOwotICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIRVZDICpsYXN0X3NsaWNlX3BhcmFtOwotfSB2YWFwaV9oZXZjX2ZyYW1lX2RhdGE7Cit0eXBlZGVmIHN0cnVjdCBWQUFQSURlY29kZVBpY3R1cmVIRVZDIHsKKyAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIRVZDIHBpY19wYXJhbTsKKyAgICBWQVNsaWNlUGFyYW1ldGVyQnVmZmVySEVWQyBsYXN0X3NsaWNlX3BhcmFtOworICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RfYnVmZmVyOworICAgIHNpemVfdCAgICAgICAgIGxhc3Rfc2l6ZTsKIAotLyoqCi0gKiBJbml0aWFsaXplIGFuIGVtcHR5IFZBIEFQSSBwaWN0dXJlLgotICoKLSAqIFZBIEFQSSByZXF1aXJlcyBhIGZpeGVkLXNpemUgcmVmZXJlbmNlIHBpY3R1cmUgYXJyYXkuCi0gKi8KKyAgICBWQUFQSURlY29kZVBpY3R1cmUgcGljOworfSBWQUFQSURlY29kZVBpY3R1cmVIRVZDOworCiBzdGF0aWMgdm9pZCBpbml0X3ZhYXBpX3BpYyhWQVBpY3R1cmVIRVZDICp2YV9waWMpCiB7Ci0gICAgdmFfcGljLT5waWN0dXJlX2lkID0gVkFfSU5WQUxJRF9JRDsKLSAgICB2YV9waWMtPmZsYWdzID0gVkFfUElDVFVSRV9IRVZDX0lOVkFMSUQ7CisgICAgdmFfcGljLT5waWN0dXJlX2lkICAgID0gVkFfSU5WQUxJRF9JRDsKKyAgICB2YV9waWMtPmZsYWdzICAgICAgICAgPSBWQV9QSUNUVVJFX0hFVkNfSU5WQUxJRDsKICAgICB2YV9waWMtPnBpY19vcmRlcl9jbnQgPSAwOwogfQogCiBzdGF0aWMgdm9pZCBmaWxsX3ZhYXBpX3BpYyhWQVBpY3R1cmVIRVZDICp2YV9waWMsIGNvbnN0IEhFVkNGcmFtZSAqcGljLCBpbnQgcnBzX3R5cGUpCiB7Ci0gICAgdmFfcGljLT5waWN0dXJlX2lkID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocGljLT5mcmFtZSk7CisgICAgdmFfcGljLT5waWN0dXJlX2lkICAgID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocGljLT5mcmFtZSk7CiAgICAgdmFfcGljLT5waWNfb3JkZXJfY250ID0gcGljLT5wb2M7Ci0gICAgdmFfcGljLT5mbGFncyA9IHJwc190eXBlOworICAgIHZhX3BpYy0+ZmxhZ3MgICAgICAgICA9IHJwc190eXBlOwogCiAgICAgaWYgKHBpYy0+ZmxhZ3MgJiBIRVZDX0ZSQU1FX0ZMQUdfTE9OR19SRUYpCiAgICAgICAgIHZhX3BpYy0+ZmxhZ3MgfD0gVkFfUElDVFVSRV9IRVZDX0xPTkdfVEVSTV9SRUZFUkVOQ0U7CkBAIC01OSw5ICs1Niw4IEBACiAgICAgaWYgKHBpYy0+ZnJhbWUtPmludGVybGFjZWRfZnJhbWUpIHsKICAgICAgICAgdmFfcGljLT5mbGFncyB8PSBWQV9QSUNUVVJFX0hFVkNfRklFTERfUElDOwogCi0gICAgICAgIGlmICghcGljLT5mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0KSB7CisgICAgICAgIGlmICghcGljLT5mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0KQogICAgICAgICAgICAgdmFfcGljLT5mbGFncyB8PSBWQV9QSUNUVVJFX0hFVkNfQk9UVE9NX0ZJRUxEOwotICAgICAgICB9CiAgICAgfQogfQogCkBAIC03MCwxNyArNjYsMTcgQEAKICAgICBWQVN1cmZhY2VJRCBwaWNfc3VyZiA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHBpYy0+ZnJhbWUpOwogICAgIGludCBpOwogCi0gICAgZm9yIChpID0gMDsgaSA8IGgtPnJwc1tTVF9DVVJSX0JFRl0ubmJfcmVmczsgKytpKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGgtPnJwc1tTVF9DVVJSX0JFRl0ubmJfcmVmczsgaSsrKSB7CiAgICAgICAgIGlmIChwaWNfc3VyZiA9PSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChoLT5ycHNbU1RfQ1VSUl9CRUZdLnJlZltpXS0+ZnJhbWUpKQogICAgICAgICAgICAgcmV0dXJuIFZBX1BJQ1RVUkVfSEVWQ19SUFNfU1RfQ1VSUl9CRUZPUkU7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IGgtPnJwc1tTVF9DVVJSX0FGVF0ubmJfcmVmczsgKytpKSB7CisgICAgZm9yIChpID0gMDsgaSA8IGgtPnJwc1tTVF9DVVJSX0FGVF0ubmJfcmVmczsgaSsrKSB7CiAgICAgICAgIGlmIChwaWNfc3VyZiA9PSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChoLT5ycHNbU1RfQ1VSUl9BRlRdLnJlZltpXS0+ZnJhbWUpKQogICAgICAgICAgICAgcmV0dXJuIFZBX1BJQ1RVUkVfSEVWQ19SUFNfU1RfQ1VSUl9BRlRFUjsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgaC0+cnBzW0xUX0NVUlJdLm5iX3JlZnM7ICsraSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBoLT5ycHNbTFRfQ1VSUl0ubmJfcmVmczsgaSsrKSB7CiAgICAgICAgIGlmIChwaWNfc3VyZiA9PSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChoLT5ycHNbTFRfQ1VSUl0ucmVmW2ldLT5mcmFtZSkpCiAgICAgICAgICAgICByZXR1cm4gVkFfUElDVFVSRV9IRVZDX1JQU19MVF9DVVJSOwogICAgIH0KQEAgLTg4LDcgKzg0LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZmlsbF92YWFwaV9SZWZlcmVuY2VGcmFtZXMoY29uc3QgSEVWQ0NvbnRleHQgKmgsIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckhFVkMgKnBwKQorc3RhdGljIHZvaWQgZmlsbF92YWFwaV9yZWZlcmVuY2VfZnJhbWVzKGNvbnN0IEhFVkNDb250ZXh0ICpoLCBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIRVZDICpwcCkKIHsKICAgICBjb25zdCBIRVZDRnJhbWUgKmN1cnJlbnRfcGljdHVyZSA9IGgtPnJlZjsKICAgICBpbnQgaSwgaiwgcnBzX3R5cGU7CkBAIC0xMTEsMTYgKzEwNywyMzggQEAKICAgICB9CiB9CiAKK3N0YXRpYyBpbnQgdmFhcGlfaGV2Y19zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAgICAgICAgICAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl91bnVzZWQgdWludDMyX3QgICAgICAgc2l6ZSkKK3sKKyAgICBjb25zdCBIRVZDQ29udGV4dCAgICAgICAgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRGVjb2RlUGljdHVyZUhFVkMgKnBpYyA9IGgtPnJlZi0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgY29uc3QgSEVWQ1NQUyAgICAgICAgICAqc3BzID0gaC0+cHMuc3BzOworICAgIGNvbnN0IEhFVkNQUFMgICAgICAgICAgKnBwcyA9IGgtPnBzLnBwczsKKworICAgIGNvbnN0IFNjYWxpbmdMaXN0ICpzY2FsaW5nX2xpc3QgPSBOVUxMOworICAgIGludCBlcnIsIGk7CisKKyAgICBwaWMtPnBpYy5vdXRwdXRfc3VyZmFjZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKGgtPnJlZi0+ZnJhbWUpOworCisgICAgcGljLT5waWNfcGFyYW0gPSAoVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySEVWQykgeworICAgICAgICAucGljX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorICAgICAgICAuc2xpY2VfcGFyc2luZ19maWVsZHMudmFsdWUgICAgICAgICAgICAgICAgICAgPSAwLAorICAgICAgICAucGljX3dpZHRoX2luX2x1bWFfc2FtcGxlcyAgICAgICAgICAgICAgICAgICAgPSBzcHMtPndpZHRoLAorICAgICAgICAucGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgICAgICAgICAgICAgICAgICAgPSBzcHMtPmhlaWdodCwKKyAgICAgICAgLmxvZzJfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVfbWludXMzICAgICAgID0gc3BzLT5sb2cyX21pbl9jYl9zaXplIC0gMywKKyAgICAgICAgLnNwc19tYXhfZGVjX3BpY19idWZmZXJpbmdfbWludXMxICAgICAgICAgICAgID0gc3BzLT50ZW1wb3JhbF9sYXllcltzcHMtPm1heF9zdWJfbGF5ZXJzIC0gMV0ubWF4X2RlY19waWNfYnVmZmVyaW5nIC0gMSwKKyAgICAgICAgLmxvZzJfZGlmZl9tYXhfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUgICAgID0gc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9jb2RpbmdfYmxvY2tfc2l6ZSwKKyAgICAgICAgLmxvZzJfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplX21pbnVzMiAgICAgICAgID0gc3BzLT5sb2cyX21pbl90Yl9zaXplIC0gMiwKKyAgICAgICAgLmxvZzJfZGlmZl9tYXhfbWluX3RyYW5zZm9ybV9ibG9ja19zaXplICAgICAgID0gc3BzLT5sb2cyX21heF90cmFmb19zaXplICAtIHNwcy0+bG9nMl9taW5fdGJfc2l6ZSwKKyAgICAgICAgLm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyICAgICAgICAgID0gc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlciwKKyAgICAgICAgLm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhICAgICAgICAgID0gc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYSwKKyAgICAgICAgLm51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0cyAgICAgICAgICAgICAgICAgID0gc3BzLT5uYl9zdF9ycHMsCisgICAgICAgIC5udW1fbG9uZ190ZXJtX3JlZl9waWNfc3BzICAgICAgICAgICAgICAgICAgICA9IHNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHMsCisgICAgICAgIC5udW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZV9taW51czEgICAgICAgICA9IHBwcy0+bnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmUgLSAxLAorICAgICAgICAubnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmVfbWludXMxICAgICAgICAgPSBwcHMtPm51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlIC0gMSwKKyAgICAgICAgLmluaXRfcXBfbWludXMyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT5waWNfaW5pdF9xcF9taW51czI2LAorICAgICAgICAucHBzX2NiX3FwX29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBwcHMtPmNiX3FwX29mZnNldCwKKyAgICAgICAgLnBwc19jcl9xcF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT5jcl9xcF9vZmZzZXQsCisgICAgICAgIC5wY21fc2FtcGxlX2JpdF9kZXB0aF9sdW1hX21pbnVzMSAgICAgICAgICAgICA9IHNwcy0+cGNtLmJpdF9kZXB0aCAtIDEsCisgICAgICAgIC5wY21fc2FtcGxlX2JpdF9kZXB0aF9jaHJvbWFfbWludXMxICAgICAgICAgICA9IHNwcy0+cGNtLmJpdF9kZXB0aF9jaHJvbWEgLSAxLAorICAgICAgICAubG9nMl9taW5fcGNtX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVfbWludXMzICAgPSBzcHMtPnBjbS5sb2cyX21pbl9wY21fY2Jfc2l6ZSAtIDMsCisgICAgICAgIC5sb2cyX2RpZmZfbWF4X21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZSA9IHNwcy0+cGNtLmxvZzJfbWF4X3BjbV9jYl9zaXplIC0gc3BzLT5wY20ubG9nMl9taW5fcGNtX2NiX3NpemUsCisgICAgICAgIC5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+ZGlmZl9jdV9xcF9kZWx0YV9kZXB0aCwKKyAgICAgICAgLnBwc19iZXRhX29mZnNldF9kaXYyICAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT5iZXRhX29mZnNldCAvIDIsCisgICAgICAgIC5wcHNfdGNfb2Zmc2V0X2RpdjIgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHBwcy0+dGNfb2Zmc2V0IC8gMiwKKyAgICAgICAgLmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyICAgICAgICAgICAgID0gcHBzLT5sb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsIC0gMiwKKyAgICAgICAgLmJpdF9kZXB0aF9sdW1hX21pbnVzOCAgICAgICAgICAgICAgICAgICAgICAgID0gc3BzLT5iaXRfZGVwdGggLSA4LAorICAgICAgICAuYml0X2RlcHRoX2Nocm9tYV9taW51czggICAgICAgICAgICAgICAgICAgICAgPSBzcHMtPmJpdF9kZXB0aCAtIDgsCisgICAgICAgIC5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgICAgICAgICAgICA9IHNwcy0+bG9nMl9tYXhfcG9jX2xzYiAtIDQsCisgICAgICAgIC5udW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHMgICAgICAgICAgICAgICAgICA9IHBwcy0+bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzLAorICAgICAgICAucGljX2ZpZWxkcy5iaXRzID0geworICAgICAgICAgICAgLmNocm9tYV9mb3JtYXRfaWRjICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMsCisgICAgICAgICAgICAudGlsZXNfZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT50aWxlc19lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAuc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcgICAgICAgICAgICAgICAgID0gc3BzLT5zZXBhcmF0ZV9jb2xvdXJfcGxhbmVfZmxhZywKKyAgICAgICAgICAgIC5wY21fZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzcHMtPnBjbV9lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAuc2NhbGluZ19saXN0X2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgICAgID0gc3BzLT5zY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWcsCisgICAgICAgICAgICAudHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgID0gcHBzLT50cmFuc2Zvcm1fc2tpcF9lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAuYW1wX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3BzLT5hbXBfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLnN0cm9uZ19pbnRyYV9zbW9vdGhpbmdfZW5hYmxlZF9mbGFnICAgICAgICA9IHNwcy0+c3BzX3N0cm9uZ19pbnRyYV9zbW9vdGhpbmdfZW5hYmxlX2ZsYWcsCisgICAgICAgICAgICAuc2lnbl9kYXRhX2hpZGluZ19lbmFibGVkX2ZsYWcgICAgICAgICAgICAgID0gcHBzLT5zaWduX2RhdGFfaGlkaW5nX2ZsYWcsCisgICAgICAgICAgICAuY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnICAgICAgICAgICAgICAgID0gcHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcsCisgICAgICAgICAgICAuY3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgICAgID0gcHBzLT5jdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAud2VpZ2h0ZWRfcHJlZF9mbGFnICAgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWcsCisgICAgICAgICAgICAud2VpZ2h0ZWRfYmlwcmVkX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9iaXByZWRfZmxhZywKKyAgICAgICAgICAgIC50cmFuc3F1YW50X2J5cGFzc19lbmFibGVkX2ZsYWcgICAgICAgICAgICAgPSBwcHMtPnRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZV9mbGFnLAorICAgICAgICAgICAgLmVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnICAgICAgICAgICA9IHBwcy0+ZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAucHBzX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnID0gcHBzLT5zZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAubG9vcF9maWx0ZXJfYWNyb3NzX3RpbGVzX2VuYWJsZWRfZmxhZyAgICAgID0gcHBzLT5sb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLnBjbV9sb29wX2ZpbHRlcl9kaXNhYmxlZF9mbGFnICAgICAgICAgICAgICA9IHNwcy0+cGNtLmxvb3BfZmlsdGVyX2Rpc2FibGVfZmxhZywKKyAgICAgICAgfSwKKyAgICAgICAgLnNsaWNlX3BhcnNpbmdfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAubGlzdHNfbW9kaWZpY2F0aW9uX3ByZXNlbnRfZmxhZyAgICAgICAgICAgICA9IHBwcy0+bGlzdHNfbW9kaWZpY2F0aW9uX3ByZXNlbnRfZmxhZywKKyAgICAgICAgICAgIC5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnICAgICAgICAgICAgID0gc3BzLT5sb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnICAgICAgICAgICAgICAgPSBzcHMtPnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLmNhYmFjX2luaXRfcHJlc2VudF9mbGFnICAgICAgICAgICAgICAgICAgICAgPSBwcHMtPmNhYmFjX2luaXRfcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLm91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZyAgICAgICAgICAgICAgICAgICAgPSBwcHMtPm91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZywKKyAgICAgICAgICAgIC5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudHNfZW5hYmxlZF9mbGFnICAgICAgID0gcHBzLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudHNfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLnBwc19zbGljZV9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWcgICAgPSBwcHMtPnBpY19zbGljZV9sZXZlbF9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWcsCisgICAgICAgICAgICAuc2FtcGxlX2FkYXB0aXZlX29mZnNldF9lbmFibGVkX2ZsYWcgICAgICAgICA9IHNwcy0+c2FvX2VuYWJsZWQsCisgICAgICAgICAgICAuZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnICAgICA9IHBwcy0+ZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnLAorICAgICAgICAgICAgLnBwc19kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcgICAgICAgICAgPSBwcHMtPmRpc2FibGVfZGJmLAorICAgICAgICAgICAgLnNsaWNlX3NlZ21lbnRfaGVhZGVyX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWcgPSBwcHMtPnNsaWNlX2hlYWRlcl9leHRlbnNpb25fcHJlc2VudF9mbGFnLAorICAgICAgICAgICAgLlJhcFBpY0ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJU19JUkFQKGgpLAorICAgICAgICAgICAgLklkclBpY0ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBJU19JRFIoaCksCisgICAgICAgICAgICAuSW50cmFQaWNGbGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IElTX0lSQVAoaCksCisgICAgICAgIH0sCisgICAgfTsKKworICAgIGZpbGxfdmFhcGlfcGljKCZwaWMtPnBpY19wYXJhbS5DdXJyUGljLCBoLT5yZWYsIDApOworICAgIGZpbGxfdmFhcGlfcmVmZXJlbmNlX2ZyYW1lcyhoLCAmcGljLT5waWNfcGFyYW0pOworCisgICAgaWYgKHBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnKSB7CisgICAgICAgIHBpYy0+cGljX3BhcmFtLm51bV90aWxlX2NvbHVtbnNfbWludXMxID0gcHBzLT5udW1fdGlsZV9jb2x1bW5zIC0gMTsKKyAgICAgICAgcGljLT5waWNfcGFyYW0ubnVtX3RpbGVfcm93c19taW51czEgICAgPSBwcHMtPm51bV90aWxlX3Jvd3MgLSAxOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwcHMtPm51bV90aWxlX2NvbHVtbnM7IGkrKykKKyAgICAgICAgICAgIHBpYy0+cGljX3BhcmFtLmNvbHVtbl93aWR0aF9taW51czFbaV0gPSBwcHMtPmNvbHVtbl93aWR0aFtpXSAtIDE7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBwcy0+bnVtX3RpbGVfcm93czsgaSsrKQorICAgICAgICAgICAgcGljLT5waWNfcGFyYW0ucm93X2hlaWdodF9taW51czFbaV0gPSBwcHMtPnJvd19oZWlnaHRbaV0gLSAxOworICAgIH0KKworICAgIGlmIChoLT5zaC5zaG9ydF90ZXJtX3JlZl9waWNfc2V0X3Nwc19mbGFnID09IDAgJiYgaC0+c2guc2hvcnRfdGVybV9ycHMpIHsKKyAgICAgICAgcGljLT5waWNfcGFyYW0uc3RfcnBzX2JpdHMgPSBoLT5zaC5zaG9ydF90ZXJtX3JlZl9waWNfc2V0X3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGljLT5waWNfcGFyYW0uc3RfcnBzX2JpdHMgPSAwOworICAgIH0KKworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3BhcmFtX2J1ZmZlcihhdmN0eCwgJnBpYy0+cGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGljLT5waWNfcGFyYW0sIHNpemVvZihwaWMtPnBpY19wYXJhbSkpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAocHBzLT5zY2FsaW5nX2xpc3RfZGF0YV9wcmVzZW50X2ZsYWcpCisgICAgICAgIHNjYWxpbmdfbGlzdCA9ICZwcHMtPnNjYWxpbmdfbGlzdDsKKyAgICBlbHNlIGlmIChzcHMtPnNjYWxpbmdfbGlzdF9lbmFibGVfZmxhZykKKyAgICAgICAgc2NhbGluZ19saXN0ID0gJnNwcy0+c2NhbGluZ19saXN0OworCisgICAgaWYgKHNjYWxpbmdfbGlzdCkgeworICAgICAgICBWQUlRTWF0cml4QnVmZmVySEVWQyBpcV9tYXRyaXg7CisgICAgICAgIGludCBqOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgICAgIGlxX21hdHJpeC5TY2FsaW5nTGlzdDR4NFtpXVtqXSA9IHNjYWxpbmdfbGlzdC0+c2xbMF1baV1bal07CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgNjQ7IGorKykgeworICAgICAgICAgICAgICAgIGlxX21hdHJpeC5TY2FsaW5nTGlzdDh4OFtpXVtqXSAgID0gc2NhbGluZ19saXN0LT5zbFsxXVtpXVtqXTsKKyAgICAgICAgICAgICAgICBpcV9tYXRyaXguU2NhbGluZ0xpc3QxNngxNltpXVtqXSA9IHNjYWxpbmdfbGlzdC0+c2xbMl1baV1bal07CisgICAgICAgICAgICAgICAgaWYgKGkgPCAyKQorICAgICAgICAgICAgICAgICAgICBpcV9tYXRyaXguU2NhbGluZ0xpc3QzMngzMltpXVtqXSA9IHNjYWxpbmdfbGlzdC0+c2xbM11baSAqIDNdW2pdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXFfbWF0cml4LlNjYWxpbmdMaXN0REMxNngxNltpXSA9IHNjYWxpbmdfbGlzdC0+c2xfZGNbMF1baV07CisgICAgICAgICAgICBpZiAoaSA8IDIpCisgICAgICAgICAgICAgICAgaXFfbWF0cml4LlNjYWxpbmdMaXN0REMzMngzMltpXSA9IHNjYWxpbmdfbGlzdC0+c2xfZGNbMV1baSAqIDNdOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCAmcGljLT5waWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUlRTWF0cml4QnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpcV9tYXRyaXgsIHNpemVvZihpcV9tYXRyaXgpKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZmZfdmFhcGlfZGVjb2RlX2NhbmNlbChhdmN0eCwgJnBpYy0+cGljKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZhYXBpX2hldmNfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBjb25zdCBIRVZDQ29udGV4dCAgICAgICAgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRGVjb2RlUGljdHVyZUhFVkMgKnBpYyA9IGgtPnJlZi0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgaW50IHJldDsKKworICAgIGlmIChwaWMtPmxhc3Rfc2l6ZSkgeworICAgICAgICBwaWMtPmxhc3Rfc2xpY2VfcGFyYW0uTG9uZ1NsaWNlRmxhZ3MuZmllbGRzLkxhc3RTbGljZU9mUGljID0gMTsKKyAgICAgICAgcmV0ID0gZmZfdmFhcGlfZGVjb2RlX21ha2Vfc2xpY2VfYnVmZmVyKGF2Y3R4LCAmcGljLT5waWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGljLT5sYXN0X3NsaWNlX3BhcmFtLCBzaXplb2YocGljLT5sYXN0X3NsaWNlX3BhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+bGFzdF9idWZmZXIsIHBpYy0+bGFzdF9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisKKyAgICByZXQgPSBmZl92YWFwaV9kZWNvZGVfaXNzdWUoYXZjdHgsICZwaWMtPnBpYyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKGF2Y3R4LCAmcGljLT5waWMpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfcHJlZF93ZWlnaHRfdGFibGUoY29uc3QgSEVWQ0NvbnRleHQgKmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNsaWNlSGVhZGVyICpzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFTbGljZVBhcmFtZXRlckJ1ZmZlckhFVkMgKnNsaWNlX3BhcmFtKQoreworICAgIGludCBpOworCisgICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5kZWx0YV9sdW1hX3dlaWdodF9sMCwgICAwLCBzaXplb2Yoc2xpY2VfcGFyYW0tPmRlbHRhX2x1bWFfd2VpZ2h0X2wwKSk7CisgICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5kZWx0YV9sdW1hX3dlaWdodF9sMSwgICAwLCBzaXplb2Yoc2xpY2VfcGFyYW0tPmRlbHRhX2x1bWFfd2VpZ2h0X2wxKSk7CisgICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5sdW1hX29mZnNldF9sMCwgICAgICAgICAwLCBzaXplb2Yoc2xpY2VfcGFyYW0tPmx1bWFfb2Zmc2V0X2wwKSk7CisgICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5sdW1hX29mZnNldF9sMSwgICAgICAgICAwLCBzaXplb2Yoc2xpY2VfcGFyYW0tPmx1bWFfb2Zmc2V0X2wxKSk7CisgICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5kZWx0YV9jaHJvbWFfd2VpZ2h0X2wwLCAwLCBzaXplb2Yoc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV93ZWlnaHRfbDApKTsKKyAgICBtZW1zZXQoc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV93ZWlnaHRfbDEsIDAsIHNpemVvZihzbGljZV9wYXJhbS0+ZGVsdGFfY2hyb21hX3dlaWdodF9sMSkpOworICAgIG1lbXNldChzbGljZV9wYXJhbS0+Q2hyb21hT2Zmc2V0TDAsICAgICAgICAgMCwgc2l6ZW9mKHNsaWNlX3BhcmFtLT5DaHJvbWFPZmZzZXRMMCkpOworICAgIG1lbXNldChzbGljZV9wYXJhbS0+Q2hyb21hT2Zmc2V0TDEsICAgICAgICAgMCwgc2l6ZW9mKHNsaWNlX3BhcmFtLT5DaHJvbWFPZmZzZXRMMSkpOworCisgICAgc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV9sb2cyX3dlaWdodF9kZW5vbSA9IDA7CisgICAgc2xpY2VfcGFyYW0tPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gICAgICAgICA9IDA7CisKKyAgICBpZiAoc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9JIHx8CisgICAgICAgIChzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX1AgJiYgIWgtPnBzLnBwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnKSB8fAorICAgICAgICAoc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CICYmICFoLT5wcy5wcHMtPndlaWdodGVkX2JpcHJlZF9mbGFnKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2xpY2VfcGFyYW0tPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gPSBzaC0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbTsKKworICAgIGlmIChoLT5wcy5zcHMtPmNocm9tYV9mb3JtYXRfaWRjKSB7CisgICAgICAgIHNsaWNlX3BhcmFtLT5kZWx0YV9jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20gPSBzaC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tIC0gc2gtPmx1bWFfbG9nMl93ZWlnaHRfZGVub207CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDE1ICYmIGkgPCBzaC0+bmJfcmVmc1tMMF07IGkrKykgeworICAgICAgICBzbGljZV9wYXJhbS0+ZGVsdGFfbHVtYV93ZWlnaHRfbDBbaV0gPSBzaC0+bHVtYV93ZWlnaHRfbDBbaV0gLSAoMSA8PCBzaC0+bHVtYV9sb2cyX3dlaWdodF9kZW5vbSk7CisgICAgICAgIHNsaWNlX3BhcmFtLT5sdW1hX29mZnNldF9sMFtpXSA9IHNoLT5sdW1hX29mZnNldF9sMFtpXTsKKyAgICAgICAgc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV93ZWlnaHRfbDBbaV1bMF0gPSBzaC0+Y2hyb21hX3dlaWdodF9sMFtpXVswXSAtICgxIDw8IHNoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pOworICAgICAgICBzbGljZV9wYXJhbS0+ZGVsdGFfY2hyb21hX3dlaWdodF9sMFtpXVsxXSA9IHNoLT5jaHJvbWFfd2VpZ2h0X2wwW2ldWzFdIC0gKDEgPDwgc2gtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSk7CisgICAgICAgIHNsaWNlX3BhcmFtLT5DaHJvbWFPZmZzZXRMMFtpXVswXSA9IHNoLT5jaHJvbWFfb2Zmc2V0X2wwW2ldWzBdOworICAgICAgICBzbGljZV9wYXJhbS0+Q2hyb21hT2Zmc2V0TDBbaV1bMV0gPSBzaC0+Y2hyb21hX29mZnNldF9sMFtpXVsxXTsKKyAgICB9CisKKyAgICBpZiAoc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9CKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNSAmJiBpIDwgc2gtPm5iX3JlZnNbTDFdOyBpKyspIHsKKyAgICAgICAgICAgIHNsaWNlX3BhcmFtLT5kZWx0YV9sdW1hX3dlaWdodF9sMVtpXSA9IHNoLT5sdW1hX3dlaWdodF9sMVtpXSAtICgxIDw8IHNoLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKKyAgICAgICAgICAgIHNsaWNlX3BhcmFtLT5sdW1hX29mZnNldF9sMVtpXSA9IHNoLT5sdW1hX29mZnNldF9sMVtpXTsKKyAgICAgICAgICAgIHNsaWNlX3BhcmFtLT5kZWx0YV9jaHJvbWFfd2VpZ2h0X2wxW2ldWzBdID0gc2gtPmNocm9tYV93ZWlnaHRfbDFbaV1bMF0gLSAoMSA8PCBzaC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKKyAgICAgICAgICAgIHNsaWNlX3BhcmFtLT5kZWx0YV9jaHJvbWFfd2VpZ2h0X2wxW2ldWzFdID0gc2gtPmNocm9tYV93ZWlnaHRfbDFbaV1bMV0gLSAoMSA8PCBzaC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKKyAgICAgICAgICAgIHNsaWNlX3BhcmFtLT5DaHJvbWFPZmZzZXRMMVtpXVswXSA9IHNoLT5jaHJvbWFfb2Zmc2V0X2wxW2ldWzBdOworICAgICAgICAgICAgc2xpY2VfcGFyYW0tPkNocm9tYU9mZnNldEwxW2ldWzFdID0gc2gtPmNocm9tYV9vZmZzZXRfbDFbaV1bMV07CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXRpYyB1aW50OF90IGdldF9yZWZfcGljX2luZGV4KGNvbnN0IEhFVkNDb250ZXh0ICpoLCBjb25zdCBIRVZDRnJhbWUgKmZyYW1lKQogewotICAgIHZhYXBpX2hldmNfZnJhbWVfZGF0YSAqZnJhbWVfZGF0YSA9IGgtPnJlZi0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7Ci0gICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySEVWQyAqcHAgPSBmcmFtZV9kYXRhLT5waWNfcGFyYW07CisgICAgVkFBUElEZWNvZGVQaWN0dXJlSEVWQyAqcGljID0gaC0+cmVmLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIRVZDICpwcCA9ICZwaWMtPnBpY19wYXJhbTsKICAgICB1aW50OF90IGk7CiAKICAgICBpZiAoIWZyYW1lKQogICAgICAgICByZXR1cm4gMHhmZjsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhwcC0+UmVmZXJlbmNlRnJhbWVzKTsgKytpKSB7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHBwLT5SZWZlcmVuY2VGcmFtZXMpOyBpKyspIHsKICAgICAgICAgVkFTdXJmYWNlSUQgcGlkID0gcHAtPlJlZmVyZW5jZUZyYW1lc1tpXS5waWN0dXJlX2lkOwogICAgICAgICBpbnQgcG9jID0gcHAtPlJlZmVyZW5jZUZyYW1lc1tpXS5waWNfb3JkZXJfY250OwogICAgICAgICBpZiAocGlkICE9IFZBX0lOVkFMSURfSUQgJiYgcGlkID09IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKGZyYW1lLT5mcmFtZSkgJiYgcG9jID09IGZyYW1lLT5wb2MpCkBAIC0xMzAsMzUyICszNDgsODIgQEAKICAgICByZXR1cm4gMHhmZjsKIH0KIAotc3RhdGljIHZvaWQgZmlsbF9waWN0dXJlX3BhcmFtZXRlcnMoY29uc3QgSEVWQ0NvbnRleHQgKmgsIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckhFVkMgKnBwKQotewotICAgIGludCBpOwotCi0gICAgcHAtPnBpY19maWVsZHMudmFsdWUgPSAwOwotICAgIHBwLT5zbGljZV9wYXJzaW5nX2ZpZWxkcy52YWx1ZSA9IDA7Ci0KLSAgICBmaWxsX3ZhYXBpX3BpYygmcHAtPkN1cnJQaWMsIGgtPnJlZiwgMCk7Ci0gICAgZmlsbF92YWFwaV9SZWZlcmVuY2VGcmFtZXMoaCwgcHApOwotCi0gICAgcHAtPnBpY193aWR0aF9pbl9sdW1hX3NhbXBsZXMgID0gaC0+cHMuc3BzLT53aWR0aDsKLSAgICBwcC0+cGljX2hlaWdodF9pbl9sdW1hX3NhbXBsZXMgPSBoLT5wcy5zcHMtPmhlaWdodDsKLQotICAgIHBwLT5sb2cyX21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyA9IGgtPnBzLnNwcy0+bG9nMl9taW5fY2Jfc2l6ZSAtIDM7Ci0KLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLmNocm9tYV9mb3JtYXRfaWRjID0gaC0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYzsKLQotICAgIHBwLT5zcHNfbWF4X2RlY19waWNfYnVmZmVyaW5nX21pbnVzMSA9IGgtPnBzLnNwcy0+dGVtcG9yYWxfbGF5ZXJbaC0+cHMuc3BzLT5tYXhfc3ViX2xheWVycyAtIDFdLm1heF9kZWNfcGljX2J1ZmZlcmluZyAtIDE7Ci0gICAgcHAtPmxvZzJfZGlmZl9tYXhfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUgPSBoLT5wcy5zcHMtPmxvZzJfZGlmZl9tYXhfbWluX2NvZGluZ19ibG9ja19zaXplOwotICAgIHBwLT5sb2cyX21pbl90cmFuc2Zvcm1fYmxvY2tfc2l6ZV9taW51czIgPSBoLT5wcy5zcHMtPmxvZzJfbWluX3RiX3NpemUgLSAyOwotICAgIHBwLT5sb2cyX2RpZmZfbWF4X21pbl90cmFuc2Zvcm1fYmxvY2tfc2l6ZSA9IGgtPnBzLnNwcy0+bG9nMl9tYXhfdHJhZm9fc2l6ZSAgLSBoLT5wcy5zcHMtPmxvZzJfbWluX3RiX3NpemU7Ci0gICAgcHAtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyID0gaC0+cHMuc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlcjsKLSAgICBwcC0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmEgPSBoLT5wcy5zcHMtPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludHJhOwotICAgIHBwLT5udW1fc2hvcnRfdGVybV9yZWZfcGljX3NldHMgPSBoLT5wcy5zcHMtPm5iX3N0X3JwczsKLSAgICBwcC0+bnVtX2xvbmdfdGVybV9yZWZfcGljX3NwcyA9IGgtPnBzLnNwcy0+bnVtX2xvbmdfdGVybV9yZWZfcGljc19zcHM7Ci0KLSAgICBwcC0+bnVtX3JlZl9pZHhfbDBfZGVmYXVsdF9hY3RpdmVfbWludXMxID0gaC0+cHMucHBzLT5udW1fcmVmX2lkeF9sMF9kZWZhdWx0X2FjdGl2ZSAtIDE7Ci0gICAgcHAtPm51bV9yZWZfaWR4X2wxX2RlZmF1bHRfYWN0aXZlX21pbnVzMSA9IGgtPnBzLnBwcy0+bnVtX3JlZl9pZHhfbDFfZGVmYXVsdF9hY3RpdmUgLSAxOwotICAgIHBwLT5pbml0X3FwX21pbnVzMjYgPSBoLT5wcy5wcHMtPnBpY19pbml0X3FwX21pbnVzMjY7Ci0KLSAgICBwcC0+cHBzX2NiX3FwX29mZnNldCA9IGgtPnBzLnBwcy0+Y2JfcXBfb2Zmc2V0OwotICAgIHBwLT5wcHNfY3JfcXBfb2Zmc2V0ID0gaC0+cHMucHBzLT5jcl9xcF9vZmZzZXQ7Ci0KLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLnRpbGVzX2VuYWJsZWRfZmxhZyA9IGgtPnBzLnBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMuc2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcgPSBoLT5wcy5zcHMtPnNlcGFyYXRlX2NvbG91cl9wbGFuZV9mbGFnOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMucGNtX2VuYWJsZWRfZmxhZyA9IGgtPnBzLnNwcy0+cGNtX2VuYWJsZWRfZmxhZzsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLnNjYWxpbmdfbGlzdF9lbmFibGVkX2ZsYWcgPSBoLT5wcy5zcHMtPnNjYWxpbmdfbGlzdF9lbmFibGVfZmxhZzsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLnRyYW5zZm9ybV9za2lwX2VuYWJsZWRfZmxhZyA9IGgtPnBzLnBwcy0+dHJhbnNmb3JtX3NraXBfZW5hYmxlZF9mbGFnOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMuYW1wX2VuYWJsZWRfZmxhZyA9IGgtPnBzLnNwcy0+YW1wX2VuYWJsZWRfZmxhZzsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLnN0cm9uZ19pbnRyYV9zbW9vdGhpbmdfZW5hYmxlZF9mbGFnID0gaC0+cHMuc3BzLT5zcHNfc3Ryb25nX2ludHJhX3Ntb290aGluZ19lbmFibGVfZmxhZzsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLnNpZ25fZGF0YV9oaWRpbmdfZW5hYmxlZF9mbGFnID0gaC0+cHMucHBzLT5zaWduX2RhdGFfaGlkaW5nX2ZsYWc7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPSBoLT5wcy5wcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZzsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZyA9IGgtPnBzLnBwcy0+Y3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMud2VpZ2h0ZWRfcHJlZF9mbGFnID0gaC0+cHMucHBzLT53ZWlnaHRlZF9wcmVkX2ZsYWc7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy53ZWlnaHRlZF9iaXByZWRfZmxhZyA9IGgtPnBzLnBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2ZsYWc7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy50cmFuc3F1YW50X2J5cGFzc19lbmFibGVkX2ZsYWcgPSBoLT5wcy5wcHMtPnRyYW5zcXVhbnRfYnlwYXNzX2VuYWJsZV9mbGFnOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMuZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcgPSBoLT5wcy5wcHMtPmVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMucHBzX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnID0gaC0+cHMucHBzLT5zZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWc7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy5sb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnID0gaC0+cHMucHBzLT5sb29wX2ZpbHRlcl9hY3Jvc3NfdGlsZXNfZW5hYmxlZF9mbGFnOwotCi0gICAgcHAtPnBpY19maWVsZHMuYml0cy5wY21fbG9vcF9maWx0ZXJfZGlzYWJsZWRfZmxhZyA9IGgtPnBzLnNwcy0+cGNtLmxvb3BfZmlsdGVyX2Rpc2FibGVfZmxhZzsKLSAgICBwcC0+cGNtX3NhbXBsZV9iaXRfZGVwdGhfbHVtYV9taW51czEgPSBoLT5wcy5zcHMtPnBjbS5iaXRfZGVwdGggLSAxOwotICAgIHBwLT5wY21fc2FtcGxlX2JpdF9kZXB0aF9jaHJvbWFfbWludXMxID0gaC0+cHMuc3BzLT5wY20uYml0X2RlcHRoX2Nocm9tYSAtIDE7Ci0gICAgcHAtPmxvZzJfbWluX3BjbV9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyA9IGgtPnBzLnNwcy0+cGNtLmxvZzJfbWluX3BjbV9jYl9zaXplIC0gMzsKLSAgICBwcC0+bG9nMl9kaWZmX21heF9taW5fcGNtX2x1bWFfY29kaW5nX2Jsb2NrX3NpemUgPSBoLT5wcy5zcHMtPnBjbS5sb2cyX21heF9wY21fY2Jfc2l6ZSAtIGgtPnBzLnNwcy0+cGNtLmxvZzJfbWluX3BjbV9jYl9zaXplOwotCi0gICAgbWVtc2V0KHBwLT5jb2x1bW5fd2lkdGhfbWludXMxLCAwLCBzaXplb2YocHAtPmNvbHVtbl93aWR0aF9taW51czEpKTsKLSAgICBtZW1zZXQocHAtPnJvd19oZWlnaHRfbWludXMxLCAwLCBzaXplb2YocHAtPnJvd19oZWlnaHRfbWludXMxKSk7Ci0KLSAgICBpZiAoaC0+cHMucHBzLT50aWxlc19lbmFibGVkX2ZsYWcpIHsKLSAgICAgICAgcHAtPm51bV90aWxlX2NvbHVtbnNfbWludXMxID0gaC0+cHMucHBzLT5udW1fdGlsZV9jb2x1bW5zIC0gMTsKLSAgICAgICAgcHAtPm51bV90aWxlX3Jvd3NfbWludXMxID0gaC0+cHMucHBzLT5udW1fdGlsZV9yb3dzIC0gMTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+cHMucHBzLT5udW1fdGlsZV9jb2x1bW5zOyBpKyspCi0gICAgICAgICAgICBwcC0+Y29sdW1uX3dpZHRoX21pbnVzMVtpXSA9IGgtPnBzLnBwcy0+Y29sdW1uX3dpZHRoW2ldIC0gMTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaC0+cHMucHBzLT5udW1fdGlsZV9yb3dzOyBpKyspCi0gICAgICAgICAgICBwcC0+cm93X2hlaWdodF9taW51czFbaV0gPSBoLT5wcy5wcHMtPnJvd19oZWlnaHRbaV0gLSAxOwotICAgIH0KLQotICAgIHBwLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoID0gaC0+cHMucHBzLT5kaWZmX2N1X3FwX2RlbHRhX2RlcHRoOwotICAgIHBwLT5wcHNfYmV0YV9vZmZzZXRfZGl2MiA9IGgtPnBzLnBwcy0+YmV0YV9vZmZzZXQgLyAyOwotICAgIHBwLT5wcHNfdGNfb2Zmc2V0X2RpdjIgPSBoLT5wcy5wcHMtPnRjX29mZnNldCAvIDI7Ci0gICAgcHAtPmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyID0gaC0+cHMucHBzLT5sb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsIC0gMjsKLQotICAgIC8qIERpZmZlcmVudCBjaHJvbWEvbHVtYSBiaXQgZGVwdGhzIGFyZSBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBieSBmZm1wZWcuICovCi0gICAgcHAtPmJpdF9kZXB0aF9sdW1hX21pbnVzOCA9IGgtPnBzLnNwcy0+Yml0X2RlcHRoIC0gODsKLSAgICBwcC0+Yml0X2RlcHRoX2Nocm9tYV9taW51czggPSBoLT5wcy5zcHMtPmJpdF9kZXB0aCAtIDg7Ci0KLSAgICBwcC0+c2xpY2VfcGFyc2luZ19maWVsZHMuYml0cy5saXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnID0gaC0+cHMucHBzLT5saXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnOwotICAgIHBwLT5zbGljZV9wYXJzaW5nX2ZpZWxkcy5iaXRzLmxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcgPSBoLT5wcy5zcHMtPmxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWc7Ci0gICAgcHAtPnNsaWNlX3BhcnNpbmdfZmllbGRzLmJpdHMuc3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWcgPSBoLT5wcy5zcHMtPnNwc190ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnOwotICAgIHBwLT5zbGljZV9wYXJzaW5nX2ZpZWxkcy5iaXRzLmNhYmFjX2luaXRfcHJlc2VudF9mbGFnID0gaC0+cHMucHBzLT5jYWJhY19pbml0X3ByZXNlbnRfZmxhZzsKLSAgICBwcC0+c2xpY2VfcGFyc2luZ19maWVsZHMuYml0cy5vdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWcgPSBoLT5wcy5wcHMtPm91dHB1dF9mbGFnX3ByZXNlbnRfZmxhZzsKLSAgICBwcC0+c2xpY2VfcGFyc2luZ19maWVsZHMuYml0cy5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudHNfZW5hYmxlZF9mbGFnID0gaC0+cHMucHBzLT5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudHNfZW5hYmxlZF9mbGFnOwotICAgIHBwLT5zbGljZV9wYXJzaW5nX2ZpZWxkcy5iaXRzLnBwc19zbGljZV9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWcgPSBoLT5wcy5wcHMtPnBpY19zbGljZV9sZXZlbF9jaHJvbWFfcXBfb2Zmc2V0c19wcmVzZW50X2ZsYWc7Ci0gICAgcHAtPnNsaWNlX3BhcnNpbmdfZmllbGRzLmJpdHMuc2FtcGxlX2FkYXB0aXZlX29mZnNldF9lbmFibGVkX2ZsYWcgPSBoLT5wcy5zcHMtPnNhb19lbmFibGVkOwotICAgIHBwLT5zbGljZV9wYXJzaW5nX2ZpZWxkcy5iaXRzLmRlYmxvY2tpbmdfZmlsdGVyX292ZXJyaWRlX2VuYWJsZWRfZmxhZyA9IGgtPnBzLnBwcy0+ZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnOwotICAgIHBwLT5zbGljZV9wYXJzaW5nX2ZpZWxkcy5iaXRzLnBwc19kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcgPSBoLT5wcy5wcHMtPmRpc2FibGVfZGJmOwotICAgIHBwLT5zbGljZV9wYXJzaW5nX2ZpZWxkcy5iaXRzLnNsaWNlX3NlZ21lbnRfaGVhZGVyX2V4dGVuc2lvbl9wcmVzZW50X2ZsYWcgPSBoLT5wcy5wcHMtPnNsaWNlX2hlYWRlcl9leHRlbnNpb25fcHJlc2VudF9mbGFnOwotCi0gICAgcHAtPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA9IGgtPnBzLnNwcy0+bG9nMl9tYXhfcG9jX2xzYiAtIDQ7Ci0gICAgcHAtPm51bV9leHRyYV9zbGljZV9oZWFkZXJfYml0cyA9IGgtPnBzLnBwcy0+bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzOwotCi0gICAgaWYgKGgtPm5hbF91bml0X3R5cGUgPj0gTkFMX0JMQV9XX0xQICYmIGgtPm5hbF91bml0X3R5cGUgPD0gTkFMX0NSQV9OVVQpIHsKLSAgICAgICAgcHAtPnNsaWNlX3BhcnNpbmdfZmllbGRzLmJpdHMuUmFwUGljRmxhZyA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHAtPnNsaWNlX3BhcnNpbmdfZmllbGRzLmJpdHMuUmFwUGljRmxhZyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKElTX0lEUihoKSkgewotICAgICAgICBwcC0+c2xpY2VfcGFyc2luZ19maWVsZHMuYml0cy5JZHJQaWNGbGFnID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcC0+c2xpY2VfcGFyc2luZ19maWVsZHMuYml0cy5JZHJQaWNGbGFnID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoSVNfSVJBUChoKSkgewotICAgICAgICBwcC0+c2xpY2VfcGFyc2luZ19maWVsZHMuYml0cy5JbnRyYVBpY0ZsYWcgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBwLT5zbGljZV9wYXJzaW5nX2ZpZWxkcy5iaXRzLkludHJhUGljRmxhZyA9IDA7Ci0gICAgfQotCi0gICAgaWYgKGgtPnNoLnNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWcgPT0gMCAmJiBoLT5zaC5zaG9ydF90ZXJtX3JwcykgewotICAgICAgICBwcC0+c3RfcnBzX2JpdHMgPSBoLT5zaC5zaG9ydF90ZXJtX3JlZl9waWNfc2V0X3NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHAtPnN0X3Jwc19iaXRzID0gMDsKLSAgICB9Ci0KLSAgICAvKiBUT0RPICovCi0gICAgcHAtPnBpY19maWVsZHMuYml0cy5Ob1BpY1Jlb3JkZXJpbmdGbGFnID0gMDsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLk5vQmlQcmVkRmxhZyA9IDA7Ci19Ci0KLQotLyoqIEluaXRpYWxpemUgYW5kIHN0YXJ0IGRlY29kaW5nIGEgZnJhbWUgd2l0aCBWQSBBUEkuICovCi1zdGF0aWMgaW50IHZhYXBpX2hldmNfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgICAgICAgICAgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCBjb25zdCB1aW50OF90ICpidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90ICAgICAgIHNpemUpCi17Ci0gICAgSEVWQ0NvbnRleHQgKiBjb25zdCBoID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBGRlZBQ29udGV4dCAqIGNvbnN0IHZhY3R4ID0gZmZfdmFhcGlfZ2V0X2NvbnRleHQoYXZjdHgpOwotICAgIHZhYXBpX2hldmNfZnJhbWVfZGF0YSAqZnJhbWVfZGF0YSA9IGgtPnJlZi0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7Ci0gICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVySEVWQyAqcGljX3BhcmFtOwotICAgIFZBSVFNYXRyaXhCdWZmZXJIRVZDICppcV9tYXRyaXg7Ci0gICAgU2NhbGluZ0xpc3QgY29uc3QgKiBzY2FsaW5nX2xpc3Q7Ci0gICAgaW50IGksIGosIHBvczsKLQotICAgIGZmX2Rsb2coYXZjdHgsICJ2YWFwaV9oZXZjX3N0YXJ0X2ZyYW1lKClcbiIpOwotCi0gICAgdmFjdHgtPnNsaWNlX3BhcmFtX3NpemUgPSBzaXplb2YoVkFTbGljZVBhcmFtZXRlckJ1ZmZlckhFVkMpOwotCi0gICAgLyogRmlsbCBpbiBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJIRVZDLiAqLwotICAgIHBpY19wYXJhbSA9IGZmX3ZhYXBpX2FsbG9jX3BpY19wYXJhbSh2YWN0eCwgc2l6ZW9mKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckhFVkMpKTsKLSAgICBpZiAoIXBpY19wYXJhbSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIGZpbGxfcGljdHVyZV9wYXJhbWV0ZXJzKGgsIHBpY19wYXJhbSk7Ci0gICAgZnJhbWVfZGF0YS0+cGljX3BhcmFtID0gcGljX3BhcmFtOwotCi0gICAgLyogRmlsbCBpbiBWQUlRTWF0cml4QnVmZmVySEVWQy4gKi8KLSAgICBpZiAoaC0+cHMucHBzLT5zY2FsaW5nX2xpc3RfZGF0YV9wcmVzZW50X2ZsYWcpIHsKLSAgICAgICAgc2NhbGluZ19saXN0ID0gJmgtPnBzLnBwcy0+c2NhbGluZ19saXN0OwotICAgIH0gZWxzZSBpZiAoaC0+cHMuc3BzLT5zY2FsaW5nX2xpc3RfZW5hYmxlX2ZsYWcpIHsKLSAgICAgICAgc2NhbGluZ19saXN0ID0gJmgtPnBzLnNwcy0+c2NhbGluZ19saXN0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlxX21hdHJpeCA9IGZmX3ZhYXBpX2FsbG9jX2lxX21hdHJpeCh2YWN0eCwgc2l6ZW9mKFZBSVFNYXRyaXhCdWZmZXJIRVZDKSk7Ci0gICAgaWYgKCFpcV9tYXRyaXgpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA2OyArK2kpIHsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKLSAgICAgICAgICAgIHBvcyA9IDQgKiBmZl9oZXZjX2RpYWdfc2NhbjR4NF95W2pdICsgZmZfaGV2Y19kaWFnX3NjYW40eDRfeFtqXTsKLSAgICAgICAgICAgIGlxX21hdHJpeC0+U2NhbGluZ0xpc3Q0eDRbaV1bal0gPSBzY2FsaW5nX2xpc3QtPnNsWzBdW2ldW3Bvc107Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyArK2opIHsKLSAgICAgICAgICAgIHBvcyA9IDggKiBmZl9oZXZjX2RpYWdfc2Nhbjh4OF95W2pdICsgZmZfaGV2Y19kaWFnX3NjYW44eDhfeFtqXTsKLSAgICAgICAgICAgIGlxX21hdHJpeC0+U2NhbGluZ0xpc3Q4eDhbaV1bal0gPSBzY2FsaW5nX2xpc3QtPnNsWzFdW2ldW3Bvc107Ci0gICAgICAgICAgICBpcV9tYXRyaXgtPlNjYWxpbmdMaXN0MTZ4MTZbaV1bal0gPSBzY2FsaW5nX2xpc3QtPnNsWzJdW2ldW3Bvc107Ci0gICAgICAgICAgICBpZiAoaSA8IDIpIHsKLSAgICAgICAgICAgICAgICBpcV9tYXRyaXgtPlNjYWxpbmdMaXN0MzJ4MzJbaV1bal0gPSBzY2FsaW5nX2xpc3QtPnNsWzNdW2kgKiAzXVtwb3NdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlxX21hdHJpeC0+U2NhbGluZ0xpc3REQzE2eDE2W2ldID0gc2NhbGluZ19saXN0LT5zbF9kY1swXVtpXTsKLSAgICAgICAgaWYgKGkgPCAyKSB7Ci0gICAgICAgICAgICBpcV9tYXRyaXgtPlNjYWxpbmdMaXN0REMzMngzMltpXSA9IHNjYWxpbmdfbGlzdC0+c2xfZGNbMV1baSAqIDNdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKiBFbmQgYSBoYXJkd2FyZSBkZWNvZGluZyBiYXNlZCBmcmFtZS4gKi8KLXN0YXRpYyBpbnQgdmFhcGlfaGV2Y19lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIEZGVkFDb250ZXh0ICogY29uc3QgdmFjdHggPSBmZl92YWFwaV9nZXRfY29udGV4dChhdmN0eCk7Ci0gICAgSEVWQ0NvbnRleHQgKiBjb25zdCBoID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICB2YWFwaV9oZXZjX2ZyYW1lX2RhdGEgKmZyYW1lX2RhdGEgPSBoLT5yZWYtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwotICAgIGludCByZXQ7Ci0KLSAgICBmZl9kbG9nKGF2Y3R4LCAidmFhcGlfaGV2Y19lbmRfZnJhbWUoKVxuIik7Ci0KLSAgICBmcmFtZV9kYXRhLT5sYXN0X3NsaWNlX3BhcmFtLT5Mb25nU2xpY2VGbGFncy5maWVsZHMuTGFzdFNsaWNlT2ZQaWMgPSAxOwotCi0gICAgcmV0ID0gZmZfdmFhcGlfY29tbWl0X3NsaWNlcyh2YWN0eCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZmluaXNoOwotCi0gICAgcmV0ID0gZmZfdmFhcGlfcmVuZGVyX3BpY3R1cmUodmFjdHgsIGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKGgtPnJlZi0+ZnJhbWUpKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBmaW5pc2g7Ci0KLWZpbmlzaDoKLSAgICBmZl92YWFwaV9jb21tb25fZW5kX2ZyYW1lKGF2Y3R4KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZpbGxfcHJlZF93ZWlnaHRfdGFibGUoSEVWQ0NvbnRleHQgKiBjb25zdCBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJIRVZDICpzbGljZV9wYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbGljZUhlYWRlciAqIGNvbnN0IHNoKQotewotICAgIGludCBpOwotCi0gICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5kZWx0YV9sdW1hX3dlaWdodF9sMCwgMCwgc2l6ZW9mKHNsaWNlX3BhcmFtLT5kZWx0YV9sdW1hX3dlaWdodF9sMCkpOwotICAgIG1lbXNldChzbGljZV9wYXJhbS0+ZGVsdGFfbHVtYV93ZWlnaHRfbDEsIDAsIHNpemVvZihzbGljZV9wYXJhbS0+ZGVsdGFfbHVtYV93ZWlnaHRfbDEpKTsKLSAgICBtZW1zZXQoc2xpY2VfcGFyYW0tPmx1bWFfb2Zmc2V0X2wwLCAwLCBzaXplb2Yoc2xpY2VfcGFyYW0tPmx1bWFfb2Zmc2V0X2wwKSk7Ci0gICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5sdW1hX29mZnNldF9sMSwgMCwgc2l6ZW9mKHNsaWNlX3BhcmFtLT5sdW1hX29mZnNldF9sMSkpOwotICAgIG1lbXNldChzbGljZV9wYXJhbS0+ZGVsdGFfY2hyb21hX3dlaWdodF9sMCwgMCwgc2l6ZW9mKHNsaWNlX3BhcmFtLT5kZWx0YV9jaHJvbWFfd2VpZ2h0X2wwKSk7Ci0gICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5kZWx0YV9jaHJvbWFfd2VpZ2h0X2wxLCAwLCBzaXplb2Yoc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV93ZWlnaHRfbDEpKTsKLSAgICBtZW1zZXQoc2xpY2VfcGFyYW0tPkNocm9tYU9mZnNldEwwLCAwLCBzaXplb2Yoc2xpY2VfcGFyYW0tPkNocm9tYU9mZnNldEwwKSk7Ci0gICAgbWVtc2V0KHNsaWNlX3BhcmFtLT5DaHJvbWFPZmZzZXRMMSwgMCwgc2l6ZW9mKHNsaWNlX3BhcmFtLT5DaHJvbWFPZmZzZXRMMSkpOwotCi0gICAgc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV9sb2cyX3dlaWdodF9kZW5vbSA9IDA7Ci0gICAgc2xpY2VfcGFyYW0tPmx1bWFfbG9nMl93ZWlnaHRfZGVub20gPSAwOwotCi0gICAgaWYgKCAgc2gtPnNsaWNlX3R5cGUgPT0gSV9TTElDRQotICAgICAgfHwgKHNoLT5zbGljZV90eXBlID09IFBfU0xJQ0UgJiYgIWgtPnBzLnBwcy0+d2VpZ2h0ZWRfcHJlZF9mbGFnKQotICAgICAgfHwgKHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UgJiYgIWgtPnBzLnBwcy0+d2VpZ2h0ZWRfYmlwcmVkX2ZsYWcpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHNsaWNlX3BhcmFtLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gc2gtPmx1bWFfbG9nMl93ZWlnaHRfZGVub207Ci0KLSAgICBpZiAoaC0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYykgewotICAgICAgICBzbGljZV9wYXJhbS0+ZGVsdGFfY2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tID0gc2gtPmNocm9tYV9sb2cyX3dlaWdodF9kZW5vbSAtIHNoLT5sdW1hX2xvZzJfd2VpZ2h0X2Rlbm9tOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCAxNSAmJiBpIDwgc2gtPm5iX3JlZnNbTDBdOyArK2kpIHsKLSAgICAgICAgc2xpY2VfcGFyYW0tPmRlbHRhX2x1bWFfd2VpZ2h0X2wwW2ldID0gc2gtPmx1bWFfd2VpZ2h0X2wwW2ldIC0gKDEgPDwgc2gtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20pOwotICAgICAgICBzbGljZV9wYXJhbS0+bHVtYV9vZmZzZXRfbDBbaV0gPSBzaC0+bHVtYV9vZmZzZXRfbDBbaV07Ci0gICAgICAgIHNsaWNlX3BhcmFtLT5kZWx0YV9jaHJvbWFfd2VpZ2h0X2wwW2ldWzBdID0gc2gtPmNocm9tYV93ZWlnaHRfbDBbaV1bMF0gLSAoMSA8PCBzaC0+Y2hyb21hX2xvZzJfd2VpZ2h0X2Rlbm9tKTsKLSAgICAgICAgc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV93ZWlnaHRfbDBbaV1bMV0gPSBzaC0+Y2hyb21hX3dlaWdodF9sMFtpXVsxXSAtICgxIDw8IHNoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pOwotICAgICAgICBzbGljZV9wYXJhbS0+Q2hyb21hT2Zmc2V0TDBbaV1bMF0gPSBzaC0+Y2hyb21hX29mZnNldF9sMFtpXVswXTsKLSAgICAgICAgc2xpY2VfcGFyYW0tPkNocm9tYU9mZnNldEwwW2ldWzFdID0gc2gtPmNocm9tYV9vZmZzZXRfbDBbaV1bMV07Ci0gICAgfQotCi0gICAgaWYgKHNoLT5zbGljZV90eXBlID09IEJfU0xJQ0UpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE1ICYmIGkgPCBzaC0+bmJfcmVmc1tMMV07ICsraSkgewotICAgICAgICAgICAgc2xpY2VfcGFyYW0tPmRlbHRhX2x1bWFfd2VpZ2h0X2wxW2ldID0gc2gtPmx1bWFfd2VpZ2h0X2wxW2ldIC0gKDEgPDwgc2gtPmx1bWFfbG9nMl93ZWlnaHRfZGVub20pOwotICAgICAgICAgICAgc2xpY2VfcGFyYW0tPmx1bWFfb2Zmc2V0X2wxW2ldID0gc2gtPmx1bWFfb2Zmc2V0X2wxW2ldOwotICAgICAgICAgICAgc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV93ZWlnaHRfbDFbaV1bMF0gPSBzaC0+Y2hyb21hX3dlaWdodF9sMVtpXVswXSAtICgxIDw8IHNoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pOwotICAgICAgICAgICAgc2xpY2VfcGFyYW0tPmRlbHRhX2Nocm9tYV93ZWlnaHRfbDFbaV1bMV0gPSBzaC0+Y2hyb21hX3dlaWdodF9sMVtpXVsxXSAtICgxIDw8IHNoLT5jaHJvbWFfbG9nMl93ZWlnaHRfZGVub20pOwotICAgICAgICAgICAgc2xpY2VfcGFyYW0tPkNocm9tYU9mZnNldEwxW2ldWzBdID0gc2gtPmNocm9tYV9vZmZzZXRfbDFbaV1bMF07Ci0gICAgICAgICAgICBzbGljZV9wYXJhbS0+Q2hyb21hT2Zmc2V0TDFbaV1bMV0gPSBzaC0+Y2hyb21hX29mZnNldF9sMVtpXVsxXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKiogRGVjb2RlIHRoZSBnaXZlbiBoZXZjIHNsaWNlIHdpdGggVkEgQVBJLiAqLwogc3RhdGljIGludCB2YWFwaV9oZXZjX2RlY29kZV9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgICAgICBzaXplKQogewotICAgIEZGVkFDb250ZXh0ICogY29uc3QgdmFjdHggPSBmZl92YWFwaV9nZXRfY29udGV4dChhdmN0eCk7Ci0gICAgSEVWQ0NvbnRleHQgKiBjb25zdCBoID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICB2YWFwaV9oZXZjX2ZyYW1lX2RhdGEgKmZyYW1lX2RhdGEgPSBoLT5yZWYtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwotICAgIFNsaWNlSGVhZGVyICogY29uc3Qgc2ggPSAmaC0+c2g7Ci0gICAgVkFTbGljZVBhcmFtZXRlckJ1ZmZlckhFVkMgKnNsaWNlX3BhcmFtOwotICAgIGludCBpLCBsaXN0X2lkeDsKLSAgICB1aW50OF90IG5iX2xpc3QgPSBzaC0+c2xpY2VfdHlwZSA9PSBCX1NMSUNFID8gMiA6IDE7CisgICAgY29uc3QgSEVWQ0NvbnRleHQgICAgICAgICpoID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBTbGljZUhlYWRlciAgICAgICAqc2ggPSAmaC0+c2g7CisgICAgVkFBUElEZWNvZGVQaWN0dXJlSEVWQyAqcGljID0gaC0+cmVmLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKIAotICAgIGlmIChzaC0+c2xpY2VfdHlwZSA9PSBJX1NMSUNFKQotICAgICAgICBuYl9saXN0ID0gMDsKKyAgICBpbnQgbmJfbGlzdCA9IChzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0IpID8KKyAgICAgICAgICAgICAgICAgIDIgOiAoc2gtPnNsaWNlX3R5cGUgPT0gSEVWQ19TTElDRV9JID8gMCA6IDEpOwogCi0gICAgZmZfZGxvZyhhdmN0eCwgInZhYXBpX2hldmNfZGVjb2RlX3NsaWNlKCk6IGJ1ZmZlciAlcCwgc2l6ZSAlZFxuIiwgYnVmZmVyLCBzaXplKTsKKyAgICBpbnQgZXJyLCBpLCBsaXN0X2lkeDsKIAotICAgIC8qIEZpbGwgaW4gVkFTbGljZVBhcmFtZXRlckJ1ZmZlckgyNjQuICovCi0gICAgc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlckhFVkMgKilmZl92YWFwaV9hbGxvY19zbGljZSh2YWN0eCwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAoIXNsaWNlX3BhcmFtKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICBmcmFtZV9kYXRhLT5sYXN0X3NsaWNlX3BhcmFtID0gc2xpY2VfcGFyYW07Ci0KLSAgICAvKiBUaGUgYmFzZSBzdHJ1Y3R1cmUgY2hhbmdlZCwgc28gdGhpcyBoYXMgdG8gYmUgcmUtc2V0IGluIG9yZGVyIHRvIGJlIHZhbGlkIG9uIGV2ZXJ5IGJ5dGUgb3JkZXIuICovCi0gICAgc2xpY2VfcGFyYW0tPnNsaWNlX2RhdGFfZmxhZyA9IFZBX1NMSUNFX0RBVEFfRkxBR19BTEw7Ci0KLSAgICAvKiBBZGQgMSB0byB0aGUgYml0cyBjb3VudCBoZXJlIHRvIGFjY291bnQgZm9yIHRoZSBieXRlX2FsaWdubWVudCBiaXQsIHdoaWNoIGFsbHdheXMgaXMgYXQgbGVhc3Qgb25lIGJpdCBhbmQgbm90IGFjY291bnRlZCBmb3Igb3RoZXJ3aXNlLiAqLwotICAgIHNsaWNlX3BhcmFtLT5zbGljZV9kYXRhX2J5dGVfb2Zmc2V0ID0gKGdldF9iaXRzX2NvdW50KCZoLT5IRVZDbGMtPmdiKSArIDEgKyA3KSAvIDg7Ci0KLSAgICBzbGljZV9wYXJhbS0+c2xpY2Vfc2VnbWVudF9hZGRyZXNzID0gc2gtPnNsaWNlX3NlZ21lbnRfYWRkcjsKLQotICAgIHNsaWNlX3BhcmFtLT5Mb25nU2xpY2VGbGFncy52YWx1ZSA9IDA7Ci0gICAgc2xpY2VfcGFyYW0tPkxvbmdTbGljZUZsYWdzLmZpZWxkcy5kZXBlbmRlbnRfc2xpY2Vfc2VnbWVudF9mbGFnID0gc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWc7Ci0gICAgc2xpY2VfcGFyYW0tPkxvbmdTbGljZUZsYWdzLmZpZWxkcy5zbGljZV90eXBlID0gc2gtPnNsaWNlX3R5cGU7Ci0gICAgc2xpY2VfcGFyYW0tPkxvbmdTbGljZUZsYWdzLmZpZWxkcy5jb2xvcl9wbGFuZV9pZCA9IHNoLT5jb2xvdXJfcGxhbmVfaWQ7Ci0gICAgc2xpY2VfcGFyYW0tPkxvbmdTbGljZUZsYWdzLmZpZWxkcy5tdmRfbDFfemVyb19mbGFnID0gc2gtPm12ZF9sMV96ZXJvX2ZsYWc7Ci0gICAgc2xpY2VfcGFyYW0tPkxvbmdTbGljZUZsYWdzLmZpZWxkcy5jYWJhY19pbml0X2ZsYWcgPSBzaC0+Y2FiYWNfaW5pdF9mbGFnOwotICAgIHNsaWNlX3BhcmFtLT5Mb25nU2xpY2VGbGFncy5maWVsZHMuc2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyA9IHNoLT5zbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnOwotICAgIHNsaWNlX3BhcmFtLT5Mb25nU2xpY2VGbGFncy5maWVsZHMuc2xpY2VfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyA9IHNoLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWc7Ci0gICAgc2xpY2VfcGFyYW0tPkxvbmdTbGljZUZsYWdzLmZpZWxkcy5jb2xsb2NhdGVkX2Zyb21fbDBfZmxhZyA9IHNoLT5jb2xsb2NhdGVkX2xpc3QgPT0gTDAgPyAxIDogMDsKLSAgICBzbGljZV9wYXJhbS0+TG9uZ1NsaWNlRmxhZ3MuZmllbGRzLnNsaWNlX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnID0gc2gtPnNsaWNlX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnOwotCi0gICAgc2xpY2VfcGFyYW0tPkxvbmdTbGljZUZsYWdzLmZpZWxkcy5zbGljZV9zYW9fbHVtYV9mbGFnID0gc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1swXTsKLSAgICBpZiAoaC0+cHMuc3BzLT5jaHJvbWFfZm9ybWF0X2lkYykgewotICAgICAgICBzbGljZV9wYXJhbS0+TG9uZ1NsaWNlRmxhZ3MuZmllbGRzLnNsaWNlX3Nhb19jaHJvbWFfZmxhZyA9IHNoLT5zbGljZV9zYW1wbGVfYWRhcHRpdmVfb2Zmc2V0X2ZsYWdbMV07Ci0gICAgfQotCi0gICAgaWYgKHNoLT5zbGljZV90ZW1wb3JhbF9tdnBfZW5hYmxlZF9mbGFnKSB7Ci0gICAgICAgIHNsaWNlX3BhcmFtLT5jb2xsb2NhdGVkX3JlZl9pZHggPSBzaC0+Y29sbG9jYXRlZF9yZWZfaWR4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNsaWNlX3BhcmFtLT5jb2xsb2NhdGVkX3JlZl9pZHggPSAweEZGOwotICAgIH0KLQotICAgIHNsaWNlX3BhcmFtLT5zbGljZV9xcF9kZWx0YSA9IHNoLT5zbGljZV9xcF9kZWx0YTsKLSAgICBzbGljZV9wYXJhbS0+c2xpY2VfY2JfcXBfb2Zmc2V0ID0gc2gtPnNsaWNlX2NiX3FwX29mZnNldDsKLSAgICBzbGljZV9wYXJhbS0+c2xpY2VfY3JfcXBfb2Zmc2V0ID0gc2gtPnNsaWNlX2NyX3FwX29mZnNldDsKLSAgICBzbGljZV9wYXJhbS0+c2xpY2VfYmV0YV9vZmZzZXRfZGl2MiA9IHNoLT5iZXRhX29mZnNldCAvIDI7Ci0gICAgc2xpY2VfcGFyYW0tPnNsaWNlX3RjX29mZnNldF9kaXYyID0gc2gtPnRjX29mZnNldCAvIDI7Ci0KLSAgICBpZiAoc2gtPnNsaWNlX3R5cGUgPT0gSV9TTElDRSkgewotICAgICAgICBzbGljZV9wYXJhbS0+Zml2ZV9taW51c19tYXhfbnVtX21lcmdlX2NhbmQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNsaWNlX3BhcmFtLT5maXZlX21pbnVzX21heF9udW1fbWVyZ2VfY2FuZCA9IDUgLSBzaC0+bWF4X251bV9tZXJnZV9jYW5kOwotICAgIH0KLQotICAgIHNsaWNlX3BhcmFtLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxID0gc2gtPm5iX3JlZnNbTDBdID8gc2gtPm5iX3JlZnNbTDBdIC0gMSA6IDA7Ci0gICAgc2xpY2VfcGFyYW0tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgPSBzaC0+bmJfcmVmc1tMMV0gPyBzaC0+bmJfcmVmc1tMMV0gLSAxIDogMDsKLQotICAgIG1lbXNldChzbGljZV9wYXJhbS0+UmVmUGljTGlzdCwgMHhGRiwgc2l6ZW9mKHNsaWNlX3BhcmFtLT5SZWZQaWNMaXN0KSk7Ci0KLSAgICAvKiBoLT5yZWYtPnJlZlBpY0xpc3QgaXMgdXBkYXRlZCBiZWZvciBjYWxsaW5nIGVhY2ggc2xpY2UgKi8KLSAgICBmb3IgKGxpc3RfaWR4ID0gMDsgbGlzdF9pZHggPCBuYl9saXN0OyArK2xpc3RfaWR4KSB7Ci0gICAgICAgIFJlZlBpY0xpc3QgKnJwbCA9ICZoLT5yZWYtPnJlZlBpY0xpc3RbbGlzdF9pZHhdOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBycGwtPm5iX3JlZnM7ICsraSkgewotICAgICAgICAgICAgc2xpY2VfcGFyYW0tPlJlZlBpY0xpc3RbbGlzdF9pZHhdW2ldID0gZ2V0X3JlZl9waWNfaW5kZXgoaCwgcnBsLT5yZWZbaV0pOworICAgIGlmICghc2gtPmZpcnN0X3NsaWNlX2luX3BpY19mbGFnKSB7CisgICAgICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3NsaWNlX2J1ZmZlcihhdmN0eCwgJnBpYy0+cGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpYy0+bGFzdF9zbGljZV9wYXJhbSwgc2l6ZW9mKHBpYy0+bGFzdF9zbGljZV9wYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMtPmxhc3RfYnVmZmVyLCBwaWMtPmxhc3Rfc2l6ZSk7CisgICAgICAgIHBpYy0+bGFzdF9idWZmZXIgPSBOVUxMOworICAgICAgICBwaWMtPmxhc3Rfc2l6ZSAgID0gMDsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgZmZfdmFhcGlfZGVjb2RlX2NhbmNlbChhdmN0eCwgJnBpYy0+cGljKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gZmlsbF9wcmVkX3dlaWdodF90YWJsZShoLCBzbGljZV9wYXJhbSwgc2gpOworICAgIHBpYy0+bGFzdF9zbGljZV9wYXJhbSA9IChWQVNsaWNlUGFyYW1ldGVyQnVmZmVySEVWQykgeworICAgICAgICAuc2xpY2VfZGF0YV9zaXplICAgICAgICAgICAgICAgPSBzaXplLAorICAgICAgICAuc2xpY2VfZGF0YV9vZmZzZXQgICAgICAgICAgICAgPSAwLAorICAgICAgICAuc2xpY2VfZGF0YV9mbGFnICAgICAgICAgICAgICAgPSBWQV9TTElDRV9EQVRBX0ZMQUdfQUxMLAorICAgICAgICAvKiBBZGQgMSB0byB0aGUgYml0cyBjb3VudCBoZXJlIHRvIGFjY291bnQgZm9yIHRoZSBieXRlX2FsaWdubWVudCBiaXQsIHdoaWNoCisgICAgICAgICAqIGFsd2F5cyBpcyBhdCBsZWFzdCBvbmUgYml0IGFuZCBub3QgYWNjb3VudGVkIGZvciBvdGhlcndpc2UuICovCisgICAgICAgIC5zbGljZV9kYXRhX2J5dGVfb2Zmc2V0ICAgICAgICA9IChnZXRfYml0c19jb3VudCgmaC0+SEVWQ2xjLT5nYikgKyAxICsgNykgLyA4LAorICAgICAgICAuc2xpY2Vfc2VnbWVudF9hZGRyZXNzICAgICAgICAgPSBzaC0+c2xpY2Vfc2VnbWVudF9hZGRyLAorICAgICAgICAuc2xpY2VfcXBfZGVsdGEgICAgICAgICAgICAgICAgPSBzaC0+c2xpY2VfcXBfZGVsdGEsCisgICAgICAgIC5zbGljZV9jYl9xcF9vZmZzZXQgICAgICAgICAgICA9IHNoLT5zbGljZV9jYl9xcF9vZmZzZXQsCisgICAgICAgIC5zbGljZV9jcl9xcF9vZmZzZXQgICAgICAgICAgICA9IHNoLT5zbGljZV9jcl9xcF9vZmZzZXQsCisgICAgICAgIC5zbGljZV9iZXRhX29mZnNldF9kaXYyICAgICAgICA9IHNoLT5iZXRhX29mZnNldCAvIDIsCisgICAgICAgIC5zbGljZV90Y19vZmZzZXRfZGl2MiAgICAgICAgICA9IHNoLT50Y19vZmZzZXQgLyAyLAorICAgICAgICAuY29sbG9jYXRlZF9yZWZfaWR4ICAgICAgICAgICAgPSBzaC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyA/IHNoLT5jb2xsb2NhdGVkX3JlZl9pZHggOiAweEZGLAorICAgICAgICAuZml2ZV9taW51c19tYXhfbnVtX21lcmdlX2NhbmQgPSBzaC0+c2xpY2VfdHlwZSA9PSBIRVZDX1NMSUNFX0kgPyAwIDogNSAtIHNoLT5tYXhfbnVtX21lcmdlX2NhbmQsCisgICAgICAgIC5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICA9IHNoLT5uYl9yZWZzW0wwXSA/IHNoLT5uYl9yZWZzW0wwXSAtIDEgOiAwLAorICAgICAgICAubnVtX3JlZl9pZHhfbDFfYWN0aXZlX21pbnVzMSAgPSBzaC0+bmJfcmVmc1tMMV0gPyBzaC0+bmJfcmVmc1tMMV0gLSAxIDogMCwKKworICAgICAgICAuTG9uZ1NsaWNlRmxhZ3MuZmllbGRzID0geworICAgICAgICAgICAgLmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcgICAgICAgICAgICAgICAgID0gc2gtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50X2ZsYWcsCisgICAgICAgICAgICAuc2xpY2VfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzaC0+c2xpY2VfdHlwZSwKKyAgICAgICAgICAgIC5jb2xvcl9wbGFuZV9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNoLT5jb2xvdXJfcGxhbmVfaWQsCisgICAgICAgICAgICAubXZkX2wxX3plcm9fZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzaC0+bXZkX2wxX3plcm9fZmxhZywKKyAgICAgICAgICAgIC5jYWJhY19pbml0X2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNoLT5jYWJhY19pbml0X2ZsYWcsCisgICAgICAgICAgICAuc2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyAgICAgICAgICAgICAgPSBzaC0+c2xpY2VfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZywKKyAgICAgICAgICAgIC5zbGljZV9kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnICAgICAgICA9IHNoLT5kaXNhYmxlX2RlYmxvY2tpbmdfZmlsdGVyX2ZsYWcsCisgICAgICAgICAgICAuY29sbG9jYXRlZF9mcm9tX2wwX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgPSBzaC0+Y29sbG9jYXRlZF9saXN0ID09IEwwID8gMSA6IDAsCisgICAgICAgICAgICAuc2xpY2VfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcgPSBzaC0+c2xpY2VfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWcsCisgICAgICAgICAgICAuc2xpY2Vfc2FvX2x1bWFfZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzaC0+c2xpY2Vfc2FtcGxlX2FkYXB0aXZlX29mZnNldF9mbGFnWzBdLAorICAgICAgICAgICAgLnNsaWNlX3Nhb19jaHJvbWFfZmxhZyAgICAgICAgICAgICAgICAgICAgICAgID0gc2gtPnNsaWNlX3NhbXBsZV9hZGFwdGl2ZV9vZmZzZXRfZmxhZ1sxXSwKKyAgICAgICAgfSwKKyAgICB9OworCisgICAgbWVtc2V0KHBpYy0+bGFzdF9zbGljZV9wYXJhbS5SZWZQaWNMaXN0LCAweEZGLCBzaXplb2YocGljLT5sYXN0X3NsaWNlX3BhcmFtLlJlZlBpY0xpc3QpKTsKKworICAgIGZvciAobGlzdF9pZHggPSAwOyBsaXN0X2lkeCA8IG5iX2xpc3Q7IGxpc3RfaWR4KyspIHsKKyAgICAgICAgUmVmUGljTGlzdCAqcnBsID0gJmgtPnJlZi0+cmVmUGljTGlzdFtsaXN0X2lkeF07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJwbC0+bmJfcmVmczsgaSsrKQorICAgICAgICAgICAgcGljLT5sYXN0X3NsaWNlX3BhcmFtLlJlZlBpY0xpc3RbbGlzdF9pZHhdW2ldID0gZ2V0X3JlZl9waWNfaW5kZXgoaCwgcnBsLT5yZWZbaV0pOworICAgIH0KKworICAgIGZpbGxfcHJlZF93ZWlnaHRfdGFibGUoaCwgc2gsICZwaWMtPmxhc3Rfc2xpY2VfcGFyYW0pOworCisgICAgcGljLT5sYXN0X2J1ZmZlciA9IGJ1ZmZlcjsKKyAgICBwaWMtPmxhc3Rfc2l6ZSAgID0gc2l6ZTsKKworICAgIHJldHVybiAwOwogfQogCi1BVkhXQWNjZWwgZmZfaGV2Y192YWFwaV9od2FjY2VsID0geworY29uc3QgQVZIV0FjY2VsIGZmX2hldmNfdmFhcGlfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAiaGV2Y192YWFwaSIsCiAgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCkBAIC00ODMsOCArNDMxLDEwIEBACiAgICAgLnN0YXJ0X2ZyYW1lICAgICAgICAgID0gdmFhcGlfaGV2Y19zdGFydF9mcmFtZSwKICAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSB2YWFwaV9oZXZjX2VuZF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgICAgICAgPSB2YWFwaV9oZXZjX2RlY29kZV9zbGljZSwKLSAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBmZl92YWFwaV9jb250ZXh0X2luaXQsCi0gICAgLnVuaW5pdCAgICAgICAgICAgICAgID0gZmZfdmFhcGlfY29udGV4dF9maW5pLAotICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihGRlZBQ29udGV4dCksCi0gICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHZhYXBpX2hldmNfZnJhbWVfZGF0YSksCisgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZBQVBJRGVjb2RlUGljdHVyZUhFVkMpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICA9IGZmX3ZhYXBpX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9IGZmX3ZhYXBpX2RlY29kZV91bmluaXQsCisgICAgLmZyYW1lX3BhcmFtcyAgICAgICAgID0gZmZfdmFhcGlfY29tbW9uX2ZyYW1lX3BhcmFtcywKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgPSBzaXplb2YoVkFBUElEZWNvZGVDb250ZXh0KSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgICAgICAgPSBIV0FDQ0VMX0NBUF9BU1lOQ19TQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmFhcGlfaW50ZXJuYWwuaCBiL2xpYmF2Y29kZWMvdmFhcGlfaW50ZXJuYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2YWUxMy4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL3ZhYXBpX2ludGVybmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIFZpZGVvIEFjY2VsZXJhdGlvbiBBUEkgKHZpZGVvIGRlY29kaW5nKQotICogSFcgZGVjb2RlIGFjY2VsZXJhdGlvbiBmb3IgTVBFRy0yLCBNUEVHLTQsIEguMjY0IGFuZCBWQy0xCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgU3BsaXR0ZWQtRGVza3RvcCBTeXN0ZW1zCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZDT0RFQ19WQUFQSV9JTlRFUk5BTF9ICi0jZGVmaW5lIEFWQ09ERUNfVkFBUElfSU5URVJOQUxfSAotCi0jaW5jbHVkZSA8dmEvdmEuaD4KLSNpbmNsdWRlICJ2YWFwaS5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi0vKioKLSAqIEBhZGR0b2dyb3VwIFZBQVBJX0RlY29kaW5nCi0gKgotICogQHsKLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgVkFEaXNwbGF5IGRpc3BsYXk7ICAgICAgICAgICAgICAgICAgLy8vPCBXaW5kb3dpbmcgc3lzdGVtIGRlcGVuZGVudCBoYW5kbGUKLSAgICBWQUNvbmZpZ0lEIGNvbmZpZ19pZDsgICAgICAgICAgICAgICAvLy88IENvbmZpZ3VyYXRpb24gSUQKLSAgICBWQUNvbnRleHRJRCBjb250ZXh0X2lkOyAgICAgICAgICAgICAvLy88IENvbnRleHQgSUQgKHZpZGVvIGRlY29kZSBwaXBlbGluZSkKLSAgICBWQUJ1ZmZlcklEIHBpY19wYXJhbV9idWZfaWQ7ICAgICAgICAvLy88IFBpY3R1cmUgcGFyYW1ldGVyIGJ1ZmZlcgotICAgIFZBQnVmZmVySUQgaXFfbWF0cml4X2J1Zl9pZDsgICAgICAgIC8vLzwgSW52ZXJzZSBxdWFudGlzZXIgbWF0cml4IGJ1ZmZlcgotICAgIFZBQnVmZmVySUQgYml0cGxhbmVfYnVmX2lkOyAgICAgICAgIC8vLzwgQml0cGxhbmUgYnVmZmVyIChmb3IgVkMtMSBkZWNvZGluZykKLSAgICBWQUJ1ZmZlcklEICpzbGljZV9idWZfaWRzOyAgICAgICAgICAvLy88IFNsaWNlIHBhcmFtZXRlci9kYXRhIGJ1ZmZlcnMKLSAgICB1bnNpZ25lZCBpbnQgbl9zbGljZV9idWZfaWRzOyAgICAgICAvLy88IE51bWJlciBvZiBlZmZlY3RpdmUgc2xpY2UgYnVmZmVycwotICAgIHVuc2lnbmVkIGludCBzbGljZV9idWZfaWRzX2FsbG9jOyAgIC8vLzwgTnVtYmVyIG9mIGFsbG9jYXRlZCBzbGljZSBidWZmZXJzCi0gICAgdm9pZCAqc2xpY2VfcGFyYW1zOyAgICAgICAgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIHNsaWNlIHBhcmFtZXRlciBidWZmZXJzCi0gICAgdW5zaWduZWQgaW50IHNsaWNlX3BhcmFtX3NpemU7ICAgICAgLy8vPCBTaXplIG9mIGEgc2xpY2UgcGFyYW1ldGVyIGVsZW1lbnQKLSAgICB1bnNpZ25lZCBpbnQgc2xpY2VfcGFyYW1zX2FsbG9jOyAgICAvLy88IE51bWJlciBvZiBhbGxvY2F0ZWQgc2xpY2UgcGFyYW1ldGVycwotICAgIHVuc2lnbmVkIGludCBzbGljZV9jb3VudDsgICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIHNsaWNlcyBjdXJyZW50bHkgZmlsbGVkIGluCi0gICAgY29uc3QgdWludDhfdCAqc2xpY2VfZGF0YTsgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIHNsaWNlIGRhdGEgYnVmZmVyIGJhc2UKLSAgICB1bnNpZ25lZCBpbnQgc2xpY2VfZGF0YV9zaXplOyAgICAgICAvLy88IEN1cnJlbnQgc2l6ZSBvZiBzbGljZSBkYXRhCi19IEZGVkFDb250ZXh0OwotCi0vKiogRXh0cmFjdCB2YWFwaV9jb250ZXh0IGZyb20gYW4gQVZDb2RlY0NvbnRleHQgKi8KLXN0YXRpYyBpbmxpbmUgRkZWQUNvbnRleHQgKmZmX3ZhYXBpX2dldF9jb250ZXh0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICByZXR1cm4gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKLX0KLQotLyoqIEV4dHJhY3QgVkFTdXJmYWNlSUQgZnJvbSBhbiBBVkZyYW1lICovCi1zdGF0aWMgaW5saW5lIFZBU3VyZmFjZUlEIGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKEFWRnJhbWUgKnBpYykKLXsKLSAgICByZXR1cm4gKHVpbnRwdHJfdClwaWMtPmRhdGFbM107Ci19Ci0KLS8qKiBDb21tb24gQVZIV0FjY2VsLmluaXQoKSBpbXBsZW1lbnRhdGlvbiAqLwotaW50IGZmX3ZhYXBpX2NvbnRleHRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwotCi0vKiogQ29tbW9uIEFWSFdBY2NlbC51bmluaXQoKSBpbXBsZW1lbnRhdGlvbiAqLwotaW50IGZmX3ZhYXBpX2NvbnRleHRfZmluaShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwotCi0vKiogQ29tbW9uIEFWSFdBY2NlbC5lbmRfZnJhbWUoKSBpbXBsZW1lbnRhdGlvbiAqLwotdm9pZCBmZl92YWFwaV9jb21tb25fZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7Ci0KLS8qKiBBbGxvY2F0ZSBhIG5ldyBwaWN0dXJlIHBhcmFtZXRlciBidWZmZXIgKi8KLXZvaWQgKmZmX3ZhYXBpX2FsbG9jX3BpY19wYXJhbShGRlZBQ29udGV4dCAqdmFjdHgsIHVuc2lnbmVkIGludCBzaXplKTsKLQotLyoqIEFsbG9jYXRlIGEgbmV3IElRIG1hdHJpeCBidWZmZXIgKi8KLXZvaWQgKmZmX3ZhYXBpX2FsbG9jX2lxX21hdHJpeChGRlZBQ29udGV4dCAqdmFjdHgsIHVuc2lnbmVkIGludCBzaXplKTsKLQotLyoqIEFsbG9jYXRlIGEgbmV3IGJpdC1wbGFuZSBidWZmZXIgKi8KLXVpbnQ4X3QgKmZmX3ZhYXBpX2FsbG9jX2JpdHBsYW5lKEZGVkFDb250ZXh0ICp2YWN0eCwgdWludDMyX3Qgc2l6ZSk7Ci0KLS8qKgotICogQWxsb2NhdGUgYSBuZXcgc2xpY2UgZGVzY3JpcHRvciBmb3IgdGhlIGlucHV0IHNsaWNlLgotICoKLSAqIEBwYXJhbSB2YWN0eCB0aGUgVkEgQVBJIGNvbnRleHQKLSAqIEBwYXJhbSBidWZmZXIgdGhlIHNsaWNlIGRhdGEgYnVmZmVyIGJhc2UKLSAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBzbGljZSBpbiBieXRlcwotICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIHNsaWNlIHBhcmFtZXRlcgotICovCi1WQVNsaWNlUGFyYW1ldGVyQnVmZmVyQmFzZSAqZmZfdmFhcGlfYWxsb2Nfc2xpY2UoRkZWQUNvbnRleHQgKnZhY3R4LCBjb25zdCB1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IHNpemUpOwotCi1pbnQgZmZfdmFhcGlfbXBlZ19lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKLWludCBmZl92YWFwaV9jb21taXRfc2xpY2VzKEZGVkFDb250ZXh0ICp2YWN0eCk7Ci1pbnQgZmZfdmFhcGlfcmVuZGVyX3BpY3R1cmUoRkZWQUNvbnRleHQgKnZhY3R4LCBWQVN1cmZhY2VJRCBzdXJmYWNlKTsKLQotLyogQH0gKi8KLQotI2VuZGlmIC8qIEFWQ09ERUNfVkFBUElfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaV9tanBlZy5jIGIvbGliYXZjb2RlYy92YWFwaV9tanBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTAyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3ZhYXBpX21qcGVnLmMKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHZhL3ZhLmg+CisjaW5jbHVkZSA8dmEvdmFfZGVjX2pwZWcuaD4KKworI2luY2x1ZGUgImh3YWNjZWwuaCIKKyNpbmNsdWRlICJ2YWFwaV9kZWNvZGUuaCIKKyNpbmNsdWRlICJtanBlZ2RlYy5oIgorCitzdGF0aWMgaW50IHZhYXBpX21qcGVnX3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICAgICAgICAgICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90ICAgICAgIHNpemUpCit7CisgICAgY29uc3QgTUpwZWdEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYyA9IHMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckpQRUdCYXNlbGluZSBwcDsKKyAgICBpbnQgZXJyLCBpOworCisgICAgcGljLT5vdXRwdXRfc3VyZmFjZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPnBpY3R1cmVfcHRyKTsKKworICAgIHBwID0gKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlckpQRUdCYXNlbGluZSkgeworICAgICAgICAucGljdHVyZV93aWR0aCAgPSBhdmN0eC0+d2lkdGgsCisgICAgICAgIC5waWN0dXJlX2hlaWdodCA9IGF2Y3R4LT5oZWlnaHQsCisKKyAgICAgICAgLm51bV9jb21wb25lbnRzID0gcy0+bmJfY29tcG9uZW50cywKKyAgICB9OworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NvbXBvbmVudHM7IGkrKykgeworICAgICAgICBwcC5jb21wb25lbnRzW2ldLmNvbXBvbmVudF9pZCAgICAgICAgICAgICA9IHMtPmNvbXBvbmVudF9pZFtpXTsKKyAgICAgICAgcHAuY29tcG9uZW50c1tpXS5oX3NhbXBsaW5nX2ZhY3RvciAgICAgICAgPSBzLT5oX2NvdW50W2ldOworICAgICAgICBwcC5jb21wb25lbnRzW2ldLnZfc2FtcGxpbmdfZmFjdG9yICAgICAgICA9IHMtPnZfY291bnRbaV07CisgICAgICAgIHBwLmNvbXBvbmVudHNbaV0ucXVhbnRpc2VyX3RhYmxlX3NlbGVjdG9yID0gcy0+cXVhbnRfaW5kZXhbaV07CisgICAgfQorCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcCwgc2l6ZW9mKHBwKSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZmX3ZhYXBpX2RlY29kZV9jYW5jZWwoYXZjdHgsIHBpYyk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2YWFwaV9tanBlZ19lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIGNvbnN0IE1KcGVnRGVjb2RlQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBzLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKworICAgIHJldHVybiBmZl92YWFwaV9kZWNvZGVfaXNzdWUoYXZjdHgsIHBpYyk7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfbWpwZWdfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgc2l6ZSkKK3sKKyAgICBjb25zdCBNSnBlZ0RlY29kZUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZBQVBJRGVjb2RlUGljdHVyZSAqcGljID0gcy0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgVkFIdWZmbWFuVGFibGVCdWZmZXJKUEVHQmFzZWxpbmUgaHVmZjsKKyAgICBWQUlRTWF0cml4QnVmZmVySlBFR0Jhc2VsaW5lIHF1YW50OworICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJKUEVHQmFzZWxpbmUgc3A7CisgICAgaW50IGVyciwgaSwgajsKKworICAgIG1lbXNldCgmaHVmZiwgMCwgc2l6ZW9mKGh1ZmYpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGh1ZmYubG9hZF9odWZmbWFuX3RhYmxlW2ldID0gMTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspCisgICAgICAgICAgICBodWZmLmh1ZmZtYW5fdGFibGVbaV0ubnVtX2RjX2NvZGVzW2pdID0gcy0+cmF3X2h1ZmZtYW5fbGVuZ3Roc1swXVtpXVtqXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDEyOyBqKyspCisgICAgICAgICAgICBodWZmLmh1ZmZtYW5fdGFibGVbaV0uZGNfdmFsdWVzW2pdID0gcy0+cmF3X2h1ZmZtYW5fdmFsdWVzWzBdW2ldW2pdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKKyAgICAgICAgICAgIGh1ZmYuaHVmZm1hbl90YWJsZVtpXS5udW1fYWNfY29kZXNbal0gPSBzLT5yYXdfaHVmZm1hbl9sZW5ndGhzWzFdW2ldW2pdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTYyOyBqKyspCisgICAgICAgICAgICBodWZmLmh1ZmZtYW5fdGFibGVbaV0uYWNfdmFsdWVzW2pdID0gcy0+cmF3X2h1ZmZtYW5fdmFsdWVzWzFdW2ldW2pdOworICAgIH0KKworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3BhcmFtX2J1ZmZlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUh1ZmZtYW5UYWJsZUJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZodWZmLCBzaXplb2YoaHVmZikpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBtZW1zZXQoJnF1YW50LCAwLCBzaXplb2YocXVhbnQpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHF1YW50LmxvYWRfcXVhbnRpc2VyX3RhYmxlW2ldID0gMTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspCisgICAgICAgICAgICBxdWFudC5xdWFudGlzZXJfdGFibGVbaV1bal0gPSBzLT5xdWFudF9tYXRyaXhlc1tpXVtqXTsKKyAgICB9CisKKyAgICBlcnIgPSBmZl92YWFwaV9kZWNvZGVfbWFrZV9wYXJhbV9idWZmZXIoYXZjdHgsIHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFJUU1hdHJpeEJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxdWFudCwgc2l6ZW9mKHF1YW50KSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHNwID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJKUEVHQmFzZWxpbmUpIHsKKyAgICAgICAgLnNsaWNlX2RhdGFfc2l6ZSAgID0gc2l6ZSwKKyAgICAgICAgLnNsaWNlX2RhdGFfb2Zmc2V0ID0gMCwKKyAgICAgICAgLnNsaWNlX2RhdGFfZmxhZyAgID0gVkFfU0xJQ0VfREFUQV9GTEFHX0FMTCwKKworICAgICAgICAuc2xpY2VfaG9yaXpvbnRhbF9wb3NpdGlvbiA9IDAsCisgICAgICAgIC5zbGljZV92ZXJ0aWNhbF9wb3NpdGlvbiAgID0gMCwKKworICAgICAgICAucmVzdGFydF9pbnRlcnZhbCAgICAgICAgICA9IHMtPnJlc3RhcnRfaW50ZXJ2YWwsCisgICAgICAgIC5udW1fbWN1cyAgICAgICAgICAgICAgICAgID0gcy0+bWJfd2lkdGggKiBzLT5tYl9oZWlnaHQsCisgICAgfTsKKworICAgIHNwLm51bV9jb21wb25lbnRzID0gcy0+bmJfY29tcG9uZW50czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY29tcG9uZW50czsgaSsrKSB7CisgICAgICAgIHNwLmNvbXBvbmVudHNbaV0uY29tcG9uZW50X3NlbGVjdG9yID0gcy0+Y29tcG9uZW50X2lkW3MtPmNvbXBfaW5kZXhbaV1dOworICAgICAgICBzcC5jb21wb25lbnRzW2ldLmRjX3RhYmxlX3NlbGVjdG9yICA9IHMtPmRjX2luZGV4W2ldOworICAgICAgICBzcC5jb21wb25lbnRzW2ldLmFjX3RhYmxlX3NlbGVjdG9yICA9IHMtPmFjX2luZGV4W2ldOworICAgIH0KKworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3NsaWNlX2J1ZmZlcihhdmN0eCwgcGljLCAmc3AsIHNpemVvZihzcCksIGJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZmZfdmFhcGlfZGVjb2RlX2NhbmNlbChhdmN0eCwgcGljKTsKKyAgICByZXR1cm4gZXJyOworfQorCitjb25zdCBBVkhXQWNjZWwgZmZfbWpwZWdfdmFhcGlfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAibWpwZWdfdmFhcGkiLAorICAgIC50eXBlICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NSlBFRywKKyAgICAucGl4X2ZtdCAgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1ZBQVBJLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9ICZ2YWFwaV9tanBlZ19zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSAmdmFhcGlfbWpwZWdfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9ICZ2YWFwaV9tanBlZ19kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZBQVBJRGVjb2RlUGljdHVyZSksCisgICAgLmluaXQgICAgICAgICAgICAgICAgID0gJmZmX3ZhYXBpX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9ICZmZl92YWFwaV9kZWNvZGVfdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9ICZmZl92YWFwaV9jb21tb25fZnJhbWVfcGFyYW1zLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihWQUFQSURlY29kZUNvbnRleHQpLAorICAgIC5jYXBzX2ludGVybmFsICAgICAgICA9IEhXQUNDRUxfQ0FQX0FTWU5DX1NBRkUsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YWFwaV9tcGVnMi5jIGIvbGliYXZjb2RlYy92YWFwaV9tcGVnMi5jCmluZGV4IDUxOGZlYzAuLmFhZWQ0MzQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmFhcGlfbXBlZzIuYworKysgYi9saWJhdmNvZGVjL3ZhYXBpX21wZWcyLmMKQEAgLTIwLDk2ICsyMCwxMjIgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAiaHdhY2NlbC5oIgogI2luY2x1ZGUgIm1wZWd1dGlscy5oIgogI2luY2x1ZGUgIm1wZWd2aWRlby5oIgotI2luY2x1ZGUgInZhYXBpX2ludGVybmFsLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2YWFwaV9kZWNvZGUuaCIKIAogLyoqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBmX2NvZGUgKi8KLXN0YXRpYyBpbmxpbmUgaW50IG1wZWcyX2dldF9mX2NvZGUoTXBlZ0VuY0NvbnRleHQgKnMpCitzdGF0aWMgaW5saW5lIGludCBtcGVnMl9nZXRfZl9jb2RlKGNvbnN0IE1wZWdFbmNDb250ZXh0ICpzKQogewogICAgIHJldHVybiAocy0+bXBlZ19mX2NvZGVbMF1bMF0gPDwgMTIpIHwgKHMtPm1wZWdfZl9jb2RlWzBdWzFdIDw8IDgpIHwKICAgICAgICAgICAgKHMtPm1wZWdfZl9jb2RlWzFdWzBdIDw8ICA0KSB8ICBzLT5tcGVnX2ZfY29kZVsxXVsxXTsKIH0KIAogLyoqIERldGVybWluZSBmcmFtZSBzdGFydDogZmlyc3QgZmllbGQgZm9yIGZpZWxkIHBpY3R1cmUgb3IgZnJhbWUgcGljdHVyZSAqLwotc3RhdGljIGlubGluZSBpbnQgbXBlZzJfZ2V0X2lzX2ZyYW1lX3N0YXJ0KE1wZWdFbmNDb250ZXh0ICpzKQorc3RhdGljIGlubGluZSBpbnQgbXBlZzJfZ2V0X2lzX2ZyYW1lX3N0YXJ0KGNvbnN0IE1wZWdFbmNDb250ZXh0ICpzKQogewogICAgIHJldHVybiBzLT5maXJzdF9maWVsZCB8fCBzLT5waWN0dXJlX3N0cnVjdHVyZSA9PSBQSUNUX0ZSQU1FOwogfQogCiBzdGF0aWMgaW50IHZhYXBpX21wZWcyX3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgYXZfdW51c2VkIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgYXZfdW51c2VkIHVpbnQzMl90IHNpemUpCiB7Ci0gICAgc3RydWN0IE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgRkZWQUNvbnRleHQgKiBjb25zdCB2YWN0eCA9IGZmX3ZhYXBpX2dldF9jb250ZXh0KGF2Y3R4KTsKLSAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqcGljX3BhcmFtOwotICAgIFZBSVFNYXRyaXhCdWZmZXJNUEVHMiAqaXFfbWF0cml4OwotICAgIGludCBpOworICAgIGNvbnN0IE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYyA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyIHBpY19wYXJhbTsKKyAgICBWQUlRTWF0cml4QnVmZmVyTVBFRzIgaXFfbWF0cml4OworICAgIGludCBpLCBlcnI7CiAKLSAgICBmZl9kbG9nKGF2Y3R4LCAidmFhcGlfbXBlZzJfc3RhcnRfZnJhbWUoKVxuIik7CisgICAgcGljLT5vdXRwdXRfc3VyZmFjZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYpOwogCi0gICAgdmFjdHgtPnNsaWNlX3BhcmFtX3NpemUgPSBzaXplb2YoVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUcyKTsKLQotICAgIC8qIEZpbGwgaW4gVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzIgKi8KLSAgICBwaWNfcGFyYW0gPSBmZl92YWFwaV9hbGxvY19waWNfcGFyYW0odmFjdHgsIHNpemVvZihWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHMikpOwotICAgIGlmICghcGljX3BhcmFtKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgcGljX3BhcmFtLT5ob3Jpem9udGFsX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT53aWR0aDsKLSAgICBwaWNfcGFyYW0tPnZlcnRpY2FsX3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPmhlaWdodDsKLSAgICBwaWNfcGFyYW0tPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUgICAgICAgICAgICAgICAgICAgICAgICA9IFZBX0lOVkFMSURfSUQ7Ci0gICAgcGljX3BhcmFtLT5iYWNrd2FyZF9yZWZlcmVuY2VfcGljdHVyZSAgICAgICAgICAgICAgICAgICAgICAgPSBWQV9JTlZBTElEX0lEOwotICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGljdF90eXBlOwotICAgIHBpY19wYXJhbS0+Zl9jb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbXBlZzJfZ2V0X2ZfY29kZShzKTsKLSAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi52YWx1ZSAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5pbnRyYV9kY19wcmVjaXNpb24gPSBzLT5pbnRyYV9kY19wcmVjaXNpb247Ci0gICAgcGljX3BhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5waWN0dXJlX3N0cnVjdHVyZSAgPSBzLT5waWN0dXJlX3N0cnVjdHVyZTsKLSAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLnRvcF9maWVsZF9maXJzdCAgICA9IHMtPnRvcF9maWVsZF9maXJzdDsKLSAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLmZyYW1lX3ByZWRfZnJhbWVfZGN0ID0gcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3Q7Ci0gICAgcGljX3BhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5jb25jZWFsbWVudF9tb3Rpb25fdmVjdG9ycyA9IHMtPmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzOwotICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucV9zY2FsZV90eXBlICAgICAgID0gcy0+cV9zY2FsZV90eXBlOwotICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMuaW50cmFfdmxjX2Zvcm1hdCAgID0gcy0+aW50cmFfdmxjX2Zvcm1hdDsKLSAgICBwaWNfcGFyYW0tPnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzLmFsdGVybmF0ZV9zY2FuICAgICA9IHMtPmFsdGVybmF0ZV9zY2FuOwotICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucmVwZWF0X2ZpcnN0X2ZpZWxkID0gcy0+cmVwZWF0X2ZpcnN0X2ZpZWxkOwotICAgIHBpY19wYXJhbS0+cGljdHVyZV9jb2RpbmdfZXh0ZW5zaW9uLmJpdHMucHJvZ3Jlc3NpdmVfZnJhbWUgID0gcy0+cHJvZ3Jlc3NpdmVfZnJhbWU7Ci0gICAgcGljX3BhcmFtLT5waWN0dXJlX2NvZGluZ19leHRlbnNpb24uYml0cy5pc19maXJzdF9maWVsZCAgICAgPSBtcGVnMl9nZXRfaXNfZnJhbWVfc3RhcnQocyk7CisgICAgcGljX3BhcmFtID0gKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUcyKSB7CisgICAgICAgIC5ob3Jpem9udGFsX3NpemUgICAgICAgICAgICAgICAgID0gcy0+d2lkdGgsCisgICAgICAgIC52ZXJ0aWNhbF9zaXplICAgICAgICAgICAgICAgICAgID0gcy0+aGVpZ2h0LAorICAgICAgICAuZm9yd2FyZF9yZWZlcmVuY2VfcGljdHVyZSAgICAgICA9IFZBX0lOVkFMSURfSUQsCisgICAgICAgIC5iYWNrd2FyZF9yZWZlcmVuY2VfcGljdHVyZSAgICAgID0gVkFfSU5WQUxJRF9JRCwKKyAgICAgICAgLnBpY3R1cmVfY29kaW5nX3R5cGUgICAgICAgICAgICAgPSBzLT5waWN0X3R5cGUsCisgICAgICAgIC5mX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgID0gbXBlZzJfZ2V0X2ZfY29kZShzKSwKKyAgICAgICAgLnBpY3R1cmVfY29kaW5nX2V4dGVuc2lvbi5iaXRzID0geworICAgICAgICAgICAgLmludHJhX2RjX3ByZWNpc2lvbiAgICAgICAgICA9IHMtPmludHJhX2RjX3ByZWNpc2lvbiwKKyAgICAgICAgICAgIC5waWN0dXJlX3N0cnVjdHVyZSAgICAgICAgICAgPSBzLT5waWN0dXJlX3N0cnVjdHVyZSwKKyAgICAgICAgICAgIC50b3BfZmllbGRfZmlyc3QgICAgICAgICAgICAgPSBzLT50b3BfZmllbGRfZmlyc3QsCisgICAgICAgICAgICAuZnJhbWVfcHJlZF9mcmFtZV9kY3QgICAgICAgID0gcy0+ZnJhbWVfcHJlZF9mcmFtZV9kY3QsCisgICAgICAgICAgICAuY29uY2VhbG1lbnRfbW90aW9uX3ZlY3RvcnMgID0gcy0+Y29uY2VhbG1lbnRfbW90aW9uX3ZlY3RvcnMsCisgICAgICAgICAgICAucV9zY2FsZV90eXBlICAgICAgICAgICAgICAgID0gcy0+cV9zY2FsZV90eXBlLAorICAgICAgICAgICAgLmludHJhX3ZsY19mb3JtYXQgICAgICAgICAgICA9IHMtPmludHJhX3ZsY19mb3JtYXQsCisgICAgICAgICAgICAuYWx0ZXJuYXRlX3NjYW4gICAgICAgICAgICAgID0gcy0+YWx0ZXJuYXRlX3NjYW4sCisgICAgICAgICAgICAucmVwZWF0X2ZpcnN0X2ZpZWxkICAgICAgICAgID0gcy0+cmVwZWF0X2ZpcnN0X2ZpZWxkLAorICAgICAgICAgICAgLnByb2dyZXNzaXZlX2ZyYW1lICAgICAgICAgICA9IHMtPnByb2dyZXNzaXZlX2ZyYW1lLAorICAgICAgICAgICAgLmlzX2ZpcnN0X2ZpZWxkICAgICAgICAgICAgICA9IG1wZWcyX2dldF9pc19mcmFtZV9zdGFydChzKSwKKyAgICAgICAgfSwKKyAgICB9OwogCiAgICAgc3dpdGNoIChzLT5waWN0X3R5cGUpIHsKICAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9COgotICAgICAgICBwaWNfcGFyYW0tPmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+bmV4dF9waWN0dXJlLmYpOworICAgICAgICBwaWNfcGFyYW0uYmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUgPSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChzLT5uZXh0X3BpY3R1cmUuZik7CiAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAogICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX1A6Ci0gICAgICAgIHBpY19wYXJhbS0+Zm9yd2FyZF9yZWZlcmVuY2VfcGljdHVyZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPmxhc3RfcGljdHVyZS5mKTsKKyAgICAgICAgcGljX3BhcmFtLmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUgPSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChzLT5sYXN0X3BpY3R1cmUuZik7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8qIEZpbGwgaW4gVkFJUU1hdHJpeEJ1ZmZlck1QRUcyICovCi0gICAgaXFfbWF0cml4ID0gZmZfdmFhcGlfYWxsb2NfaXFfbWF0cml4KHZhY3R4LCBzaXplb2YoVkFJUU1hdHJpeEJ1ZmZlck1QRUcyKSk7Ci0gICAgaWYgKCFpcV9tYXRyaXgpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpcV9tYXRyaXgtPmxvYWRfaW50cmFfcXVhbnRpc2VyX21hdHJpeCAgICAgICAgICAgICAgPSAxOwotICAgIGlxX21hdHJpeC0+bG9hZF9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeCAgICAgICAgICA9IDE7Ci0gICAgaXFfbWF0cml4LT5sb2FkX2Nocm9tYV9pbnRyYV9xdWFudGlzZXJfbWF0cml4ICAgICAgID0gMTsKLSAgICBpcV9tYXRyaXgtPmxvYWRfY2hyb21hX25vbl9pbnRyYV9xdWFudGlzZXJfbWF0cml4ICAgPSAxOworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3BhcmFtX2J1ZmZlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGljX3BhcmFtLCBzaXplb2YocGljX3BhcmFtKSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlxX21hdHJpeC5sb2FkX2ludHJhX3F1YW50aXNlcl9tYXRyaXggICAgICAgICAgICAgID0gMTsKKyAgICBpcV9tYXRyaXgubG9hZF9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeCAgICAgICAgICA9IDE7CisgICAgaXFfbWF0cml4LmxvYWRfY2hyb21hX2ludHJhX3F1YW50aXNlcl9tYXRyaXggICAgICAgPSAxOworICAgIGlxX21hdHJpeC5sb2FkX2Nocm9tYV9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeCAgID0gMTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAgICAgICAgIGludCBuID0gcy0+aWRzcC5pZGN0X3Blcm11dGF0aW9uW2ZmX3ppZ3phZ19kaXJlY3RbaV1dOwotICAgICAgICBpcV9tYXRyaXgtPmludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0gICAgICAgICAgICA9IHMtPmludHJhX21hdHJpeFtuXTsKLSAgICAgICAgaXFfbWF0cml4LT5ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeFtpXSAgICAgICAgPSBzLT5pbnRlcl9tYXRyaXhbbl07Ci0gICAgICAgIGlxX21hdHJpeC0+Y2hyb21hX2ludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0gICAgID0gcy0+Y2hyb21hX2ludHJhX21hdHJpeFtuXTsKLSAgICAgICAgaXFfbWF0cml4LT5jaHJvbWFfbm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0gPSBzLT5jaHJvbWFfaW50ZXJfbWF0cml4W25dOworICAgICAgICBpcV9tYXRyaXguaW50cmFfcXVhbnRpc2VyX21hdHJpeFtpXSAgICAgICAgICAgID0gcy0+aW50cmFfbWF0cml4W25dOworICAgICAgICBpcV9tYXRyaXgubm9uX2ludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0gICAgICAgID0gcy0+aW50ZXJfbWF0cml4W25dOworICAgICAgICBpcV9tYXRyaXguY2hyb21hX2ludHJhX3F1YW50aXNlcl9tYXRyaXhbaV0gICAgID0gcy0+Y2hyb21hX2ludHJhX21hdHJpeFtuXTsKKyAgICAgICAgaXFfbWF0cml4LmNocm9tYV9ub25faW50cmFfcXVhbnRpc2VyX21hdHJpeFtpXSA9IHMtPmNocm9tYV9pbnRlcl9tYXRyaXhbbl07CiAgICAgfQorCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBSVFNYXRyaXhCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXFfbWF0cml4LCBzaXplb2YoaXFfbWF0cml4KSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKwogICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZmX3ZhYXBpX2RlY29kZV9jYW5jZWwoYXZjdHgsIHBpYyk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2YWFwaV9tcGVnMl9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1wZWdFbmNDb250ZXh0ICAgICAqcyAgID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYyA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZl92YWFwaV9kZWNvZGVfaXNzdWUoYXZjdHgsIHBpYyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIDAsIHMtPmF2Y3R4LT5oZWlnaHQpOworCitmYWlsOgorICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdmFhcGlfbXBlZzJfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQogewotICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgRkZWQUNvbnRleHQgKiBjb25zdCB2YWN0eCA9IGZmX3ZhYXBpX2dldF9jb250ZXh0KGF2Y3R4KTsKLSAgICBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzIgKnNsaWNlX3BhcmFtOworICAgIGNvbnN0IE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYyA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiBzbGljZV9wYXJhbTsKICAgICBHZXRCaXRDb250ZXh0IGdiOwogICAgIHVpbnQzMl90IHF1YW50aXNlcl9zY2FsZV9jb2RlLCBpbnRyYV9zbGljZV9mbGFnLCBtYWNyb2Jsb2NrX29mZnNldDsKLQotICAgIGZmX2Rsb2coYXZjdHgsICJ2YWFwaV9tcGVnMl9kZWNvZGVfc2xpY2UoKTogYnVmZmVyICVwLCBzaXplICVkXG4iLCBidWZmZXIsIHNpemUpOworICAgIGludCBlcnI7CiAKICAgICAvKiBEZXRlcm1pbmUgbWFjcm9ibG9ja19vZmZzZXQgKi8KICAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmZmVyLCA4ICogc2l6ZSk7CkBAIC0xMjQsMjcgKzE1MCw0MCBAQAogICAgIH0KICAgICBtYWNyb2Jsb2NrX29mZnNldCA9IGdldF9iaXRzX2NvdW50KCZnYik7CiAKLSAgICAvKiBGaWxsIGluIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqLwotICAgIHNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHMiAqKWZmX3ZhYXBpX2FsbG9jX3NsaWNlKHZhY3R4LCBidWZmZXIsIHNpemUpOwotICAgIGlmICghc2xpY2VfcGFyYW0pCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzbGljZV9wYXJhbS0+bWFjcm9ibG9ja19vZmZzZXQgICAgICAgICAgICAgID0gbWFjcm9ibG9ja19vZmZzZXQ7Ci0gICAgc2xpY2VfcGFyYW0tPnNsaWNlX2hvcml6b250YWxfcG9zaXRpb24gICAgICA9IHMtPm1iX3g7Ci0gICAgc2xpY2VfcGFyYW0tPnNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uICAgICAgICA9IHMtPm1iX3kgPj4gKHMtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpOwotICAgIHNsaWNlX3BhcmFtLT5xdWFudGlzZXJfc2NhbGVfY29kZSAgICAgICAgICAgPSBxdWFudGlzZXJfc2NhbGVfY29kZTsKLSAgICBzbGljZV9wYXJhbS0+aW50cmFfc2xpY2VfZmxhZyAgICAgICAgICAgICAgID0gaW50cmFfc2xpY2VfZmxhZzsKKyAgICBzbGljZV9wYXJhbSA9IChWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzIpIHsKKyAgICAgICAgLnNsaWNlX2RhdGFfc2l6ZSAgICAgICAgICAgID0gc2l6ZSwKKyAgICAgICAgLnNsaWNlX2RhdGFfb2Zmc2V0ICAgICAgICAgID0gMCwKKyAgICAgICAgLnNsaWNlX2RhdGFfZmxhZyAgICAgICAgICAgID0gVkFfU0xJQ0VfREFUQV9GTEFHX0FMTCwKKyAgICAgICAgLm1hY3JvYmxvY2tfb2Zmc2V0ICAgICAgICAgID0gbWFjcm9ibG9ja19vZmZzZXQsCisgICAgICAgIC5zbGljZV9ob3Jpem9udGFsX3Bvc2l0aW9uICA9IHMtPm1iX3gsCisgICAgICAgIC5zbGljZV92ZXJ0aWNhbF9wb3NpdGlvbiAgICA9IHMtPm1iX3kgPj4gKHMtPnBpY3R1cmVfc3RydWN0dXJlICE9IFBJQ1RfRlJBTUUpLAorICAgICAgICAucXVhbnRpc2VyX3NjYWxlX2NvZGUgICAgICAgPSBxdWFudGlzZXJfc2NhbGVfY29kZSwKKyAgICAgICAgLmludHJhX3NsaWNlX2ZsYWcgICAgICAgICAgID0gaW50cmFfc2xpY2VfZmxhZywKKyAgICB9OworCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2Vfc2xpY2VfYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGljZV9wYXJhbSwgc2l6ZW9mKHNsaWNlX3BhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKGF2Y3R4LCBwaWMpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIHJldHVybiAwOwogfQogCi1BVkhXQWNjZWwgZmZfbXBlZzJfdmFhcGlfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzJfdmFhcGkiLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLAotICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkFBUEksCi0gICAgLnN0YXJ0X2ZyYW1lICAgID0gdmFhcGlfbXBlZzJfc3RhcnRfZnJhbWUsCi0gICAgLmVuZF9mcmFtZSAgICAgID0gZmZfdmFhcGlfbXBlZ19lbmRfZnJhbWUsCi0gICAgLmRlY29kZV9zbGljZSAgID0gdmFhcGlfbXBlZzJfZGVjb2RlX3NsaWNlLAotICAgIC5pbml0ICAgICAgICAgICA9IGZmX3ZhYXBpX2NvbnRleHRfaW5pdCwKLSAgICAudW5pbml0ICAgICAgICAgPSBmZl92YWFwaV9jb250ZXh0X2ZpbmksCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZGVkFDb250ZXh0KSwKK2NvbnN0IEFWSFdBY2NlbCBmZl9tcGVnMl92YWFwaV9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJtcGVnMl92YWFwaSIsCisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9WQUFQSSwKKyAgICAuc3RhcnRfZnJhbWUgICAgICAgICAgPSAmdmFhcGlfbXBlZzJfc3RhcnRfZnJhbWUsCisgICAgLmVuZF9mcmFtZSAgICAgICAgICAgID0gJnZhYXBpX21wZWcyX2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgICAgICAgPSAmdmFhcGlfbXBlZzJfZGVjb2RlX3NsaWNlLAorICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQUFQSURlY29kZVBpY3R1cmUpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICA9ICZmZl92YWFwaV9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgICAgICAgPSAmZmZfdmFhcGlfZGVjb2RlX3VuaW5pdCwKKyAgICAuZnJhbWVfcGFyYW1zICAgICAgICAgPSAmZmZfdmFhcGlfY29tbW9uX2ZyYW1lX3BhcmFtcywKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgPSBzaXplb2YoVkFBUElEZWNvZGVDb250ZXh0KSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgICAgICAgPSBIV0FDQ0VMX0NBUF9BU1lOQ19TQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmFhcGlfbXBlZzQuYyBiL2xpYmF2Y29kZWMvdmFhcGlfbXBlZzQuYwppbmRleCBiNWI5NDZkLi4xMTg2MGZmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZhYXBpX21wZWc0LmMKKysrIGIvbGliYXZjb2RlYy92YWFwaV9tcGVnNC5jCkBAIC0yMCwxMSArMjAsMTIgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSAidmFhcGlfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImgyNjMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJtcGVnNHZpZGVvLmgiCiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCisjaW5jbHVkZSAidmFhcGlfZGVjb2RlLmgiCiAKIC8qKiBSZWNvbnN0cnVjdCBiaXRzdHJlYW0gaW50cmFfZGNfdmxjX3RociAqLwogc3RhdGljIGludCBtcGVnNF9nZXRfaW50cmFfZGNfdmxjX3RocihNcGVnNERlY0NvbnRleHQgKnMpCkBAIC00NSwxMjUgKzQ2LDE2OSBAQAogc3RhdGljIGludCB2YWFwaV9tcGVnNF9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGF2X3VudXNlZCBjb25zdCB1aW50OF90ICpidWZmZXIsIGF2X3VudXNlZCB1aW50MzJfdCBzaXplKQogewogICAgIE1wZWc0RGVjQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHMgPSAmY3R4LT5tOwotICAgIEZGVkFDb250ZXh0ICogY29uc3QgdmFjdHggPSBmZl92YWFwaV9nZXRfY29udGV4dChhdmN0eCk7Ci0gICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyTVBFRzQgKnBpY19wYXJhbTsKLSAgICBWQUlRTWF0cml4QnVmZmVyTVBFRzQgKmlxX21hdHJpeDsKLSAgICBpbnQgaTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZjdHgtPm07CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHNCBwaWNfcGFyYW07CisgICAgaW50IGksIGVycjsKIAotICAgIGZmX2Rsb2coYXZjdHgsICJ2YWFwaV9tcGVnNF9zdGFydF9mcmFtZSgpXG4iKTsKKyAgICBwaWMtPm91dHB1dF9zdXJmYWNlID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zik7CiAKLSAgICB2YWN0eC0+c2xpY2VfcGFyYW1fc2l6ZSA9IHNpemVvZihWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzQpOworICAgIHBpY19wYXJhbSA9IChWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHNCkgeworICAgICAgICAudm9wX3dpZHRoICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT53aWR0aCwKKyAgICAgICAgLnZvcF9oZWlnaHQgICAgICAgICAgICAgICAgICAgICAgID0gcy0+aGVpZ2h0LAorICAgICAgICAuZm9yd2FyZF9yZWZlcmVuY2VfcGljdHVyZSAgICAgICAgPSBWQV9JTlZBTElEX0lELAorICAgICAgICAuYmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUgICAgICAgPSBWQV9JTlZBTElEX0lELAorICAgICAgICAudm9sX2ZpZWxkcy5iaXRzID0geworICAgICAgICAgICAgLnNob3J0X3ZpZGVvX2hlYWRlciAgICAgICAgICAgPSBhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX0gyNjMsCisgICAgICAgICAgICAuY2hyb21hX2Zvcm1hdCAgICAgICAgICAgICAgICA9IENIUk9NQV80MjAsCisgICAgICAgICAgICAuaW50ZXJsYWNlZCAgICAgICAgICAgICAgICAgICA9ICFzLT5wcm9ncmVzc2l2ZV9zZXF1ZW5jZSwKKyAgICAgICAgICAgIC5vYm1jX2Rpc2FibGUgICAgICAgICAgICAgICAgID0gMSwKKyAgICAgICAgICAgIC5zcHJpdGVfZW5hYmxlICAgICAgICAgICAgICAgID0gY3R4LT52b2xfc3ByaXRlX3VzYWdlLAorICAgICAgICAgICAgLnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5ICAgICAgPSBzLT5zcHJpdGVfd2FycGluZ19hY2N1cmFjeSwKKyAgICAgICAgICAgIC5xdWFudF90eXBlICAgICAgICAgICAgICAgICAgID0gcy0+bXBlZ19xdWFudCwKKyAgICAgICAgICAgIC5xdWFydGVyX3NhbXBsZSAgICAgICAgICAgICAgID0gcy0+cXVhcnRlcl9zYW1wbGUsCisgICAgICAgICAgICAuZGF0YV9wYXJ0aXRpb25lZCAgICAgICAgICAgICA9IHMtPmRhdGFfcGFydGl0aW9uaW5nLAorICAgICAgICAgICAgLnJldmVyc2libGVfdmxjICAgICAgICAgICAgICAgPSBjdHgtPnJ2bGMsCisgICAgICAgICAgICAucmVzeW5jX21hcmtlcl9kaXNhYmxlICAgICAgICA9ICFjdHgtPnJlc3luY19tYXJrZXIsCisgICAgICAgIH0sCisgICAgICAgIC5ub19vZl9zcHJpdGVfd2FycGluZ19wb2ludHMgICAgICA9IGN0eC0+bnVtX3Nwcml0ZV93YXJwaW5nX3BvaW50cywKKyAgICAgICAgLnF1YW50X3ByZWNpc2lvbiAgICAgICAgICAgICAgICAgID0gcy0+cXVhbnRfcHJlY2lzaW9uLAorICAgICAgICAudm9wX2ZpZWxkcy5iaXRzID0geworICAgICAgICAgICAgLnZvcF9jb2RpbmdfdHlwZSAgICAgICAgICAgICAgPSBzLT5waWN0X3R5cGUgLSBBVl9QSUNUVVJFX1RZUEVfSSwKKyAgICAgICAgICAgIC5iYWNrd2FyZF9yZWZlcmVuY2Vfdm9wX2NvZGluZ190eXBlID0KKyAgICAgICAgICAgICAgICBzLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgPyBzLT5uZXh0X3BpY3R1cmUuZi0+cGljdF90eXBlIC0gQVZfUElDVFVSRV9UWVBFX0kgOiAwLAorICAgICAgICAgICAgLnZvcF9yb3VuZGluZ190eXBlICAgICAgICAgICAgPSBzLT5ub19yb3VuZGluZywKKyAgICAgICAgICAgIC5pbnRyYV9kY192bGNfdGhyICAgICAgICAgICAgID0gbXBlZzRfZ2V0X2ludHJhX2RjX3ZsY190aHIoY3R4KSwKKyAgICAgICAgICAgIC50b3BfZmllbGRfZmlyc3QgICAgICAgICAgICAgID0gcy0+dG9wX2ZpZWxkX2ZpcnN0LAorICAgICAgICAgICAgLmFsdGVybmF0ZV92ZXJ0aWNhbF9zY2FuX2ZsYWcgPSBzLT5hbHRlcm5hdGVfc2NhbiwKKyAgICAgICAgfSwKKyAgICAgICAgLnZvcF9mY29kZV9mb3J3YXJkICAgICAgICAgICAgICAgID0gcy0+Zl9jb2RlLAorICAgICAgICAudm9wX2Zjb2RlX2JhY2t3YXJkICAgICAgICAgICAgICAgPSBzLT5iX2NvZGUsCisgICAgICAgIC52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiAgICA9IGF2Y3R4LT5mcmFtZXJhdGUubnVtLAorICAgICAgICAubnVtX21hY3JvYmxvY2tzX2luX2dvYiAgICAgICAgICAgPSBzLT5tYl93aWR0aCAqIEgyNjNfR09CX0hFSUdIVChzLT5oZWlnaHQpLAorICAgICAgICAubnVtX2dvYnNfaW5fdm9wICAgICAgICAgICAgICAgICAgPQorICAgICAgICAgICAgKHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0KSAvIChzLT5tYl93aWR0aCAqIEgyNjNfR09CX0hFSUdIVChzLT5oZWlnaHQpKSwKKyAgICAgICAgLlRSQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGJfdGltZSwKKyAgICAgICAgLlRSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cHBfdGltZSwKKyAgICB9OwogCi0gICAgLyogRmlsbCBpbiBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJNUEVHNCAqLwotICAgIHBpY19wYXJhbSA9IGZmX3ZhYXBpX2FsbG9jX3BpY19wYXJhbSh2YWN0eCwgc2l6ZW9mKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlck1QRUc0KSk7Ci0gICAgaWYgKCFwaWNfcGFyYW0pCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBwaWNfcGFyYW0tPnZvcF93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT53aWR0aDsKLSAgICBwaWNfcGFyYW0tPnZvcF9oZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5oZWlnaHQ7Ci0gICAgcGljX3BhcmFtLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlICAgICAgICAgICAgICAgID0gVkFfSU5WQUxJRF9JRDsKLSAgICBwaWNfcGFyYW0tPmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlICAgICAgICAgICAgICAgPSBWQV9JTlZBTElEX0lEOwotICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMuc2hvcnRfdmlkZW9faGVhZGVyICAgICAgID0gYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjYzOwotICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLmNocm9tYV9mb3JtYXQgICAgICAgICAgICA9IENIUk9NQV80MjA7Ci0gICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMuaW50ZXJsYWNlZCAgICAgICAgICAgICAgID0gIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlOwotICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLm9ibWNfZGlzYWJsZSAgICAgICAgICAgICA9IDE7Ci0gICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMuc3ByaXRlX2VuYWJsZSAgICAgICAgICAgID0gY3R4LT52b2xfc3ByaXRlX3VzYWdlOwotICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5ICA9IHMtPnNwcml0ZV93YXJwaW5nX2FjY3VyYWN5OwotICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLnF1YW50X3R5cGUgICAgICAgICAgICAgICA9IHMtPm1wZWdfcXVhbnQ7Ci0gICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMucXVhcnRlcl9zYW1wbGUgICAgICAgICAgID0gcy0+cXVhcnRlcl9zYW1wbGU7Ci0gICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMuZGF0YV9wYXJ0aXRpb25lZCAgICAgICAgID0gcy0+ZGF0YV9wYXJ0aXRpb25pbmc7Ci0gICAgcGljX3BhcmFtLT52b2xfZmllbGRzLmJpdHMucmV2ZXJzaWJsZV92bGMgICAgICAgICAgID0gY3R4LT5ydmxjOwotICAgIHBpY19wYXJhbS0+dm9sX2ZpZWxkcy5iaXRzLnJlc3luY19tYXJrZXJfZGlzYWJsZSAgICA9ICFjdHgtPnJlc3luY19tYXJrZXI7Ci0gICAgcGljX3BhcmFtLT5ub19vZl9zcHJpdGVfd2FycGluZ19wb2ludHMgICAgICAgICAgICAgID0gY3R4LT5udW1fc3ByaXRlX3dhcnBpbmdfcG9pbnRzOwogICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm51bV9zcHJpdGVfd2FycGluZ19wb2ludHMgJiYgaSA8IDM7IGkrKykgewotICAgICAgICBwaWNfcGFyYW0tPnNwcml0ZV90cmFqZWN0b3J5X2R1W2ldICAgICAgICAgICAgICA9IGN0eC0+c3ByaXRlX3RyYWpbaV1bMF07Ci0gICAgICAgIHBpY19wYXJhbS0+c3ByaXRlX3RyYWplY3RvcnlfZHZbaV0gICAgICAgICAgICAgID0gY3R4LT5zcHJpdGVfdHJhaltpXVsxXTsKKyAgICAgICAgcGljX3BhcmFtLnNwcml0ZV90cmFqZWN0b3J5X2R1W2ldICAgICAgICAgICAgICA9IGN0eC0+c3ByaXRlX3RyYWpbaV1bMF07CisgICAgICAgIHBpY19wYXJhbS5zcHJpdGVfdHJhamVjdG9yeV9kdltpXSAgICAgICAgICAgICAgPSBjdHgtPnNwcml0ZV90cmFqW2ldWzFdOwogICAgIH0KLSAgICBwaWNfcGFyYW0tPnF1YW50X3ByZWNpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5xdWFudF9wcmVjaXNpb247Ci0gICAgcGljX3BhcmFtLT52b3BfZmllbGRzLnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KLSAgICBwaWNfcGFyYW0tPnZvcF9maWVsZHMuYml0cy52b3BfY29kaW5nX3R5cGUgICAgICAgICAgPSBzLT5waWN0X3R5cGUgLSBBVl9QSUNUVVJFX1RZUEVfSTsKLSAgICBwaWNfcGFyYW0tPnZvcF9maWVsZHMuYml0cy5iYWNrd2FyZF9yZWZlcmVuY2Vfdm9wX2NvZGluZ190eXBlID0gcy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CID8gcy0+bmV4dF9waWN0dXJlLmYtPnBpY3RfdHlwZSAtIEFWX1BJQ1RVUkVfVFlQRV9JIDogMDsKLSAgICBwaWNfcGFyYW0tPnZvcF9maWVsZHMuYml0cy52b3Bfcm91bmRpbmdfdHlwZSAgICAgICAgPSBzLT5ub19yb3VuZGluZzsKLSAgICBwaWNfcGFyYW0tPnZvcF9maWVsZHMuYml0cy5pbnRyYV9kY192bGNfdGhyICAgICAgICAgPSBtcGVnNF9nZXRfaW50cmFfZGNfdmxjX3RocihjdHgpOwotICAgIHBpY19wYXJhbS0+dm9wX2ZpZWxkcy5iaXRzLnRvcF9maWVsZF9maXJzdCAgICAgICAgICA9IHMtPnRvcF9maWVsZF9maXJzdDsKLSAgICBwaWNfcGFyYW0tPnZvcF9maWVsZHMuYml0cy5hbHRlcm5hdGVfdmVydGljYWxfc2Nhbl9mbGFnID0gcy0+YWx0ZXJuYXRlX3NjYW47Ci0gICAgcGljX3BhcmFtLT52b3BfZmNvZGVfZm9yd2FyZCAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+Zl9jb2RlOwotICAgIHBpY19wYXJhbS0+dm9wX2Zjb2RlX2JhY2t3YXJkICAgICAgICAgICAgICAgICAgICAgICA9IHMtPmJfY29kZTsKLSAgICBwaWNfcGFyYW0tPnZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uICAgICAgICAgICAgPSBhdmN0eC0+ZnJhbWVyYXRlLm51bTsKLSAgICBwaWNfcGFyYW0tPm51bV9tYWNyb2Jsb2Nrc19pbl9nb2IgICAgICAgICAgICAgICAgICAgPSBzLT5tYl93aWR0aCAqIEgyNjNfR09CX0hFSUdIVChzLT5oZWlnaHQpOwotICAgIHBpY19wYXJhbS0+bnVtX2dvYnNfaW5fdm9wICAgICAgICAgICAgICAgICAgICAgICAgICA9IChzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodCkgLyBwaWNfcGFyYW0tPm51bV9tYWNyb2Jsb2Nrc19pbl9nb2I7Ci0gICAgcGljX3BhcmFtLT5UUkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGJfdGltZTsKLSAgICBwaWNfcGFyYW0tPlRSRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5wcF90aW1lOwogCiAgICAgaWYgKHMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikKLSAgICAgICAgcGljX3BhcmFtLT5iYWNrd2FyZF9yZWZlcmVuY2VfcGljdHVyZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPm5leHRfcGljdHVyZS5mKTsKKyAgICAgICAgcGljX3BhcmFtLmJhY2t3YXJkX3JlZmVyZW5jZV9waWN0dXJlID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+bmV4dF9waWN0dXJlLmYpOwogICAgIGlmIChzLT5waWN0X3R5cGUgIT0gQVZfUElDVFVSRV9UWVBFX0kpCi0gICAgICAgIHBpY19wYXJhbS0+Zm9yd2FyZF9yZWZlcmVuY2VfcGljdHVyZSAgPSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChzLT5sYXN0X3BpY3R1cmUuZik7CisgICAgICAgIHBpY19wYXJhbS5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlICA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPmxhc3RfcGljdHVyZS5mKTsKIAotICAgIC8qIEZpbGwgaW4gVkFJUU1hdHJpeEJ1ZmZlck1QRUc0ICovCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWNfcGFyYW0sIHNpemVvZihwaWNfcGFyYW0pKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCiAgICAgLyogT25seSB0aGUgZmlyc3QgaW52ZXJzZSBxdWFudGlzYXRpb24gbWV0aG9kIHVzZXMgdGhlIHdlaWdodGluZyBtYXRyaWNlcyAqLwotICAgIGlmIChwaWNfcGFyYW0tPnZvbF9maWVsZHMuYml0cy5xdWFudF90eXBlKSB7Ci0gICAgICAgIGlxX21hdHJpeCA9IGZmX3ZhYXBpX2FsbG9jX2lxX21hdHJpeCh2YWN0eCwgc2l6ZW9mKFZBSVFNYXRyaXhCdWZmZXJNUEVHNCkpOwotICAgICAgICBpZiAoIWlxX21hdHJpeCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaXFfbWF0cml4LT5sb2FkX2ludHJhX3F1YW50X21hdCAgICAgICAgID0gMTsKLSAgICAgICAgaXFfbWF0cml4LT5sb2FkX25vbl9pbnRyYV9xdWFudF9tYXQgICAgID0gMTsKKyAgICBpZiAocGljX3BhcmFtLnZvbF9maWVsZHMuYml0cy5xdWFudF90eXBlKSB7CisgICAgICAgIFZBSVFNYXRyaXhCdWZmZXJNUEVHNCBpcV9tYXRyaXg7CisKKyAgICAgICAgaXFfbWF0cml4LmxvYWRfaW50cmFfcXVhbnRfbWF0ICAgICA9IDE7CisgICAgICAgIGlxX21hdHJpeC5sb2FkX25vbl9pbnRyYV9xdWFudF9tYXQgPSAxOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgbiA9IHMtPmlkc3AuaWRjdF9wZXJtdXRhdGlvbltmZl96aWd6YWdfZGlyZWN0W2ldXTsKLSAgICAgICAgICAgIGlxX21hdHJpeC0+aW50cmFfcXVhbnRfbWF0W2ldICAgICAgID0gcy0+aW50cmFfbWF0cml4W25dOwotICAgICAgICAgICAgaXFfbWF0cml4LT5ub25faW50cmFfcXVhbnRfbWF0W2ldICAgPSBzLT5pbnRlcl9tYXRyaXhbbl07CisgICAgICAgICAgICBpcV9tYXRyaXguaW50cmFfcXVhbnRfbWF0W2ldICAgICA9IHMtPmludHJhX21hdHJpeFtuXTsKKyAgICAgICAgICAgIGlxX21hdHJpeC5ub25faW50cmFfcXVhbnRfbWF0W2ldID0gcy0+aW50ZXJfbWF0cml4W25dOwogICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUlRTWF0cml4QnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpcV9tYXRyaXgsIHNpemVvZihpcV9tYXRyaXgpKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZmX3ZhYXBpX2RlY29kZV9jYW5jZWwoYXZjdHgsIHBpYyk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2YWFwaV9tcGVnNF9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYyA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZl92YWFwaV9kZWNvZGVfaXNzdWUoYXZjdHgsIHBpYyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIDAsIHMtPmF2Y3R4LT5oZWlnaHQpOworCitmYWlsOgorICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdmFhcGlfbXBlZzRfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQogewotICAgIE1wZWdFbmNDb250ZXh0ICogY29uc3QgcyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgRkZWQUNvbnRleHQgKiBjb25zdCB2YWN0eCA9IGZmX3ZhYXBpX2dldF9jb250ZXh0KGF2Y3R4KTsKLSAgICBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyTVBFRzQgKnNsaWNlX3BhcmFtOworICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYyA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJNUEVHNCBzbGljZV9wYXJhbTsKKyAgICBpbnQgZXJyOwogCi0gICAgZmZfZGxvZyhhdmN0eCwgInZhYXBpX21wZWc0X2RlY29kZV9zbGljZSgpOiBidWZmZXIgJXAsIHNpemUgJWRcbiIsIGJ1ZmZlciwgc2l6ZSk7CisgICAgc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUc0KSB7CisgICAgICAgIC5zbGljZV9kYXRhX3NpemUgICA9IHNpemUsCisgICAgICAgIC5zbGljZV9kYXRhX29mZnNldCA9IDAsCisgICAgICAgIC5zbGljZV9kYXRhX2ZsYWcgICA9IFZBX1NMSUNFX0RBVEFfRkxBR19BTEwsCisgICAgICAgIC5tYWNyb2Jsb2NrX29mZnNldCA9IGdldF9iaXRzX2NvdW50KCZzLT5nYikgJSA4LAorICAgICAgICAubWFjcm9ibG9ja19udW1iZXIgPSAwLAorICAgICAgICAucXVhbnRfc2NhbGUgICAgICAgPSBzLT5xc2NhbGUsCisgICAgfTsKIAotICAgIC8qIEZpbGwgaW4gVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUc0ICovCi0gICAgc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlck1QRUc0ICopZmZfdmFhcGlfYWxsb2Nfc2xpY2UodmFjdHgsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKCFzbGljZV9wYXJhbSkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHNsaWNlX3BhcmFtLT5tYWNyb2Jsb2NrX29mZnNldCAgICAgID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSAlIDg7Ci0gICAgc2xpY2VfcGFyYW0tPm1hY3JvYmxvY2tfbnVtYmVyICAgICAgPSAwOwotICAgIHNsaWNlX3BhcmFtLT5xdWFudF9zY2FsZSAgICAgICAgICAgID0gcy0+cXNjYWxlOworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3NsaWNlX2J1ZmZlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xpY2VfcGFyYW0sIHNpemVvZihzbGljZV9wYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgZmZfdmFhcGlfZGVjb2RlX2NhbmNlbChhdmN0eCwgcGljKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAogI2lmIENPTkZJR19NUEVHNF9WQUFQSV9IV0FDQ0VMCi1BVkhXQWNjZWwgZmZfbXBlZzRfdmFhcGlfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzRfdmFhcGkiLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKLSAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZBQVBJLAotICAgIC5zdGFydF9mcmFtZSAgICA9IHZhYXBpX21wZWc0X3N0YXJ0X2ZyYW1lLAotICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lLAotICAgIC5kZWNvZGVfc2xpY2UgICA9IHZhYXBpX21wZWc0X2RlY29kZV9zbGljZSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBmZl92YWFwaV9jb250ZXh0X2luaXQsCi0gICAgLnVuaW5pdCAgICAgICAgID0gZmZfdmFhcGlfY29udGV4dF9maW5pLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRlZBQ29udGV4dCksCitjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzRfdmFhcGlfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAibXBlZzRfdmFhcGkiLAorICAgIC50eXBlICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKKyAgICAucGl4X2ZtdCAgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1ZBQVBJLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9ICZ2YWFwaV9tcGVnNF9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSAmdmFhcGlfbXBlZzRfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9ICZ2YWFwaV9tcGVnNF9kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZBQVBJRGVjb2RlUGljdHVyZSksCisgICAgLmluaXQgICAgICAgICAgICAgICAgID0gJmZmX3ZhYXBpX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9ICZmZl92YWFwaV9kZWNvZGVfdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9ICZmZl92YWFwaV9jb21tb25fZnJhbWVfcGFyYW1zLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihWQUFQSURlY29kZUNvbnRleHQpLAorICAgIC5jYXBzX2ludGVybmFsICAgICAgICA9IEhXQUNDRUxfQ0FQX0FTWU5DX1NBRkUsCiB9OwogI2VuZGlmCiAKICNpZiBDT05GSUdfSDI2M19WQUFQSV9IV0FDQ0VMCi1BVkhXQWNjZWwgZmZfaDI2M192YWFwaV9od2FjY2VsID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJoMjYzX3ZhYXBpIiwKLSAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2MywKLSAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZBQVBJLAotICAgIC5zdGFydF9mcmFtZSAgICA9IHZhYXBpX21wZWc0X3N0YXJ0X2ZyYW1lLAotICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lLAotICAgIC5kZWNvZGVfc2xpY2UgICA9IHZhYXBpX21wZWc0X2RlY29kZV9zbGljZSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBmZl92YWFwaV9jb250ZXh0X2luaXQsCi0gICAgLnVuaW5pdCAgICAgICAgID0gZmZfdmFhcGlfY29udGV4dF9maW5pLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRlZBQ29udGV4dCksCitjb25zdCBBVkhXQWNjZWwgZmZfaDI2M192YWFwaV9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJoMjYzX3ZhYXBpIiwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2MywKKyAgICAucGl4X2ZtdCAgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1ZBQVBJLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9ICZ2YWFwaV9tcGVnNF9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSAmdmFhcGlfbXBlZzRfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9ICZ2YWFwaV9tcGVnNF9kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZBQVBJRGVjb2RlUGljdHVyZSksCisgICAgLmluaXQgICAgICAgICAgICAgICAgID0gJmZmX3ZhYXBpX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9ICZmZl92YWFwaV9kZWNvZGVfdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9ICZmZl92YWFwaV9jb21tb25fZnJhbWVfcGFyYW1zLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihWQUFQSURlY29kZUNvbnRleHQpLAorICAgIC5jYXBzX2ludGVybmFsICAgICAgICA9IEhXQUNDRUxfQ0FQX0FTWU5DX1NBRkUsCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZhYXBpX3ZjMS5jIGIvbGliYXZjb2RlYy92YWFwaV92YzEuYwppbmRleCA1ZGVkNWRiLi43NGJhNzgzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZhYXBpX3ZjMS5jCisrKyBiL2xpYmF2Y29kZWMvdmFhcGlfdmMxLmMKQEAgLTIwLDggKzIwLDkgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSAidmFhcGlfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2YWFwaV9kZWNvZGUuaCIKICNpbmNsdWRlICJ2YzEuaCIKICNpbmNsdWRlICJ2YzFkYXRhLmgiCiAKQEAgLTM5LDM1ICs0MCwzOCBAQAogfQogCiAvKiogQ2hlY2sgd2hldGhlciB0aGUgTVZUWVBFTUIgYml0cGxhbmUgaXMgcHJlc2VudCAqLwotc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19NVlRZUEVNQl9iaXRwbGFuZShWQzFDb250ZXh0ICp2KQorc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19NVlRZUEVNQl9iaXRwbGFuZShjb25zdCBWQzFDb250ZXh0ICp2KQogewogICAgIGlmICh2LT5tdl90eXBlX2lzX3JhdykKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmCisgICAgcmV0dXJuIHYtPmZjbSA9PSBQUk9HUkVTU0lWRSAmJgorICAgICAgICAgICAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgJiYgIXYtPnBfZnJhbWVfc2tpcHBlZCkgJiYKICAgICAgICAgICAgKHYtPm12X21vZGUgPT0gTVZfUE1PREVfTUlYRURfTVYgfHwKICAgICAgICAgICAgICh2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QICYmCiAgICAgICAgICAgICAgdi0+bXZfbW9kZTIgPT0gTVZfUE1PREVfTUlYRURfTVYpKTsKIH0KIAogLyoqIENoZWNrIHdoZXRoZXIgdGhlIFNLSVBNQiBiaXRwbGFuZSBpcyBwcmVzZW50ICovCi1zdGF0aWMgaW5saW5lIGludCB2YzFfaGFzX1NLSVBNQl9iaXRwbGFuZShWQzFDb250ZXh0ICp2KQorc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19TS0lQTUJfYml0cGxhbmUoY29uc3QgVkMxQ29udGV4dCAqdikKIHsKICAgICBpZiAodi0+c2tpcF9pc19yYXcpCiAgICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiB2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCB8fAotICAgICAgICAgICAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgIXYtPmJpX3R5cGUpOworICAgIHJldHVybiAodi0+ZmNtID09IFBST0dSRVNTSVZFIHx8IHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkgJiYKKyAgICAgICAgICAgKCh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCAmJiAhdi0+cF9mcmFtZV9za2lwcGVkKSB8fAorICAgICAgICAgICAgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmICF2LT5iaV90eXBlKSk7CiB9CiAKIC8qKiBDaGVjayB3aGV0aGVyIHRoZSBESVJFQ1RNQiBiaXRwbGFuZSBpcyBwcmVzZW50ICovCi1zdGF0aWMgaW5saW5lIGludCB2YzFfaGFzX0RJUkVDVE1CX2JpdHBsYW5lKFZDMUNvbnRleHQgKnYpCitzdGF0aWMgaW5saW5lIGludCB2YzFfaGFzX0RJUkVDVE1CX2JpdHBsYW5lKGNvbnN0IFZDMUNvbnRleHQgKnYpCiB7CiAgICAgaWYgKHYtPmRtYl9pc19yYXcpCiAgICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiB2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhdi0+YmlfdHlwZTsKKyAgICByZXR1cm4gKHYtPmZjbSA9PSBQUk9HUkVTU0lWRSB8fCB2LT5mY20gPT0gSUxBQ0VfRlJBTUUpICYmCisgICAgICAgICAgICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhdi0+YmlfdHlwZSk7CiB9CiAKIC8qKiBDaGVjayB3aGV0aGVyIHRoZSBBQ1BSRUQgYml0cGxhbmUgaXMgcHJlc2VudCAqLwotc3RhdGljIGlubGluZSBpbnQgdmMxX2hhc19BQ1BSRURfYml0cGxhbmUoVkMxQ29udGV4dCAqdikKK3N0YXRpYyBpbmxpbmUgaW50IHZjMV9oYXNfQUNQUkVEX2JpdHBsYW5lKGNvbnN0IFZDMUNvbnRleHQgKnYpCiB7CiAgICAgaWYgKHYtPmFjcHJlZF9pc19yYXcpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNzcsNyArODEsNyBAQAogfQogCiAvKiogQ2hlY2sgd2hldGhlciB0aGUgT1ZFUkZMQUdTIGJpdHBsYW5lIGlzIHByZXNlbnQgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHZjMV9oYXNfT1ZFUkZMQUdTX2JpdHBsYW5lKFZDMUNvbnRleHQgKnYpCitzdGF0aWMgaW5saW5lIGludCB2YzFfaGFzX09WRVJGTEFHU19iaXRwbGFuZShjb25zdCBWQzFDb250ZXh0ICp2KQogewogICAgIGlmICh2LT5vdmVyZmxnX2lzX3JhdykKICAgICAgICAgcmV0dXJuIDA7CkBAIC04OCwxMCArOTIsMjkgQEAKICAgICAgICAgICAgdi0+Y29uZG92ZXIgPT0gQ09ORE9WRVJfU0VMRUNUOwogfQogCi0vKiogUmVjb25zdHJ1Y3QgYml0c3RyZWFtIFBUWVBFICg3LjEuMS40LCBpbmRleCBpbnRvIFRhYmxlLTM1KSAqLwotc3RhdGljIGludCB2YzFfZ2V0X1BUWVBFKFZDMUNvbnRleHQgKnYpCisvKiogQ2hlY2sgd2hldGhlciB0aGUgRklFTERUWCBiaXRwbGFuZSBpcyBwcmVzZW50ICovCitzdGF0aWMgaW5saW5lIGludCB2YzFfaGFzX0ZJRUxEVFhfYml0cGxhbmUoY29uc3QgVkMxQ29udGV4dCAqdikKIHsKLSAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHMgPSAmdi0+czsKKyAgICBpZiAodi0+ZmllbGR0eF9pc19yYXcpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiB2LT5mY20gPT0gSUxBQ0VfRlJBTUUgJiYKKyAgICAgICAgICAgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JIHx8CisgICAgICAgICAgICAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0IgJiYgdi0+YmlfdHlwZSkpOworfQorCisvKiogQ2hlY2sgd2hldGhlciB0aGUgRk9SV0FSRE1CIGJpdHBsYW5lIGlzIHByZXNlbnQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHZjMV9oYXNfRk9SV0FSRE1CX2JpdHBsYW5lKGNvbnN0IFZDMUNvbnRleHQgKnYpCit7CisgICAgaWYgKHYtPmZtYl9pc19yYXcpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiB2LT5mY20gPT0gSUxBQ0VfRklFTEQgJiYKKyAgICAgICAgICAgKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CICYmICF2LT5iaV90eXBlKTsKK30KKworLyoqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBQVFlQRSAoNy4xLjEuNCwgaW5kZXggaW50byBUYWJsZS0zNSkgKi8KK3N0YXRpYyBpbnQgdmMxX2dldF9QVFlQRShjb25zdCBWQzFDb250ZXh0ICp2KQoreworICAgIGNvbnN0IE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CiAgICAgc3dpdGNoIChzLT5waWN0X3R5cGUpIHsKICAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9JOiByZXR1cm4gMDsKICAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9QOiByZXR1cm4gdi0+cF9mcmFtZV9za2lwcGVkID8gNCA6IDE7CkBAIC0xMDAsMjUgKzEyMywxMDMgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyoqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBNVk1PREUgKDcuMS4xLjMyKSAqLwotc3RhdGljIGlubGluZSBWQU12TW9kZVZDMSB2YzFfZ2V0X01WTU9ERShWQzFDb250ZXh0ICp2KQorLyoqIFJlY29uc3RydWN0IGJpdHN0cmVhbSBGUFRZUEUgKDkuMS4xLjQyLCBpbmRleCBpbnRvIFRhYmxlLTEwNSkgKi8KK3N0YXRpYyBpbnQgdmMxX2dldF9GUFRZUEUoY29uc3QgVkMxQ29udGV4dCAqdikKIHsKLSAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgfHwKKyAgICBjb25zdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIHN3aXRjaCAocy0+cGljdF90eXBlKSB7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfSTogcmV0dXJuIDA7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUDogcmV0dXJuIDM7CisgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQjogcmV0dXJuIHYtPmJpX3R5cGUgPyA3IDogNDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKiBSZWNvbnN0cnVjdCBiaXRzdHJlYW0gTVZNT0RFICg3LjEuMS4zMikgKi8KK3N0YXRpYyBpbmxpbmUgVkFNdk1vZGVWQzEgdmMxX2dldF9NVk1PREUoY29uc3QgVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAoKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmICF2LT5wX2ZyYW1lX3NraXBwZWQpIHx8CiAgICAgICAgICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQiAmJiAhdi0+YmlfdHlwZSkpCiAgICAgICAgIHJldHVybiBnZXRfVkFNdk1vZGVWQzEodi0+bXZfbW9kZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIC8qKiBSZWNvbnN0cnVjdCBiaXRzdHJlYW0gTVZNT0RFMiAoNy4xLjEuMzMpICovCi1zdGF0aWMgaW5saW5lIFZBTXZNb2RlVkMxIHZjMV9nZXRfTVZNT0RFMihWQzFDb250ZXh0ICp2KQorc3RhdGljIGlubGluZSBWQU12TW9kZVZDMSB2YzFfZ2V0X01WTU9ERTIoY29uc3QgVkMxQ29udGV4dCAqdikKIHsKLSAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgJiYgdi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9JTlRFTlNJVFlfQ09NUCkKKyAgICBpZiAoKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmICF2LT5wX2ZyYW1lX3NraXBwZWQpICYmCisgICAgICAgIHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVApCiAgICAgICAgIHJldHVybiBnZXRfVkFNdk1vZGVWQzEodi0+bXZfbW9kZTIpOwogICAgIHJldHVybiAwOwogfQogCithdl91bnVzZWQgc3RhdGljIGlubGluZSBpbnQgdmMxX2dldF9JTlRDT01QRklFTEQoY29uc3QgVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAoKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmICF2LT5wX2ZyYW1lX3NraXBwZWQpICYmCisgICAgICAgIHYtPmZjbSA9PSBJTEFDRV9GSUVMRCAmJgorICAgICAgICB2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QKQorICAgICAgICBzd2l0Y2ggKHYtPmludGNvbXBmaWVsZCkgeworICAgICAgICBjYXNlIDE6IHJldHVybiAxOworICAgICAgICBjYXNlIDI6IHJldHVybiAyOworICAgICAgICBjYXNlIDM6IHJldHVybiAwOworICAgICAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZjMV9nZXRfTFVNU0NBTEUoY29uc3QgVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAodi0+cy5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1AgJiYgIXYtPnBfZnJhbWVfc2tpcHBlZCkgeworICAgICAgICBpZiAoKHYtPmZjbSA9PSBQUk9HUkVTU0lWRSAmJiB2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QKSB8fAorICAgICAgICAgICAgKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSAmJiB2LT5pbnRjb21wKSkKKyAgICAgICAgICAgIHJldHVybiB2LT5sdW1zY2FsZTsKKyAgICAgICAgZWxzZSBpZiAodi0+ZmNtID09IElMQUNFX0ZJRUxEICYmIHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVApCisgICAgICAgICAgICBzd2l0Y2ggKHYtPmludGNvbXBmaWVsZCkgeworICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gdi0+bHVtc2NhbGU7CisgICAgICAgICAgICBjYXNlIDI6IHJldHVybiB2LT5sdW1zY2FsZTI7CisgICAgICAgICAgICBjYXNlIDM6IHJldHVybiB2LT5sdW1zY2FsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdmMxX2dldF9MVU1TSElGVChjb25zdCBWQzFDb250ZXh0ICp2KQoreworICAgIGlmICh2LT5zLnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfUCAmJiAhdi0+cF9mcmFtZV9za2lwcGVkKSB7CisgICAgICAgIGlmICgodi0+ZmNtID09IFBST0dSRVNTSVZFICYmIHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVApIHx8CisgICAgICAgICAgICAodi0+ZmNtID09IElMQUNFX0ZSQU1FICYmIHYtPmludGNvbXApKQorICAgICAgICAgICAgcmV0dXJuIHYtPmx1bXNoaWZ0OworICAgICAgICBlbHNlIGlmICh2LT5mY20gPT0gSUxBQ0VfRklFTEQgJiYgdi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9JTlRFTlNJVFlfQ09NUCkKKyAgICAgICAgICAgIHN3aXRjaCAodi0+aW50Y29tcGZpZWxkKSB7CisgICAgICAgICAgICBjYXNlIDE6IHJldHVybiB2LT5sdW1zaGlmdDsKKyAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuIHYtPmx1bXNoaWZ0MjsKKyAgICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHYtPmx1bXNoaWZ0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCithdl91bnVzZWQgc3RhdGljIGlubGluZSBpbnQgdmMxX2dldF9MVU1TQ0FMRTIoY29uc3QgVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAoKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmICF2LT5wX2ZyYW1lX3NraXBwZWQpICYmCisgICAgICAgIHYtPmZjbSA9PSBJTEFDRV9GSUVMRCAmJgorICAgICAgICB2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QICYmCisgICAgICAgIHYtPmludGNvbXBmaWVsZCA9PSAzKQorICAgICAgICByZXR1cm4gdi0+bHVtc2NhbGUyOworICAgIHJldHVybiAwOworfQorCithdl91bnVzZWQgc3RhdGljIGlubGluZSBpbnQgdmMxX2dldF9MVU1TSElGVDIoY29uc3QgVkMxQ29udGV4dCAqdikKK3sKKyAgICBpZiAoKHYtPnMucGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QICYmICF2LT5wX2ZyYW1lX3NraXBwZWQpICYmCisgICAgICAgIHYtPmZjbSA9PSBJTEFDRV9GSUVMRCAmJgorICAgICAgICB2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QICYmCisgICAgICAgIHYtPmludGNvbXBmaWVsZCA9PSAzKQorICAgICAgICByZXR1cm4gdi0+bHVtc2hpZnQyOworICAgIHJldHVybiAwOworfQorCiAvKiogUmVjb25zdHJ1Y3QgYml0c3RyZWFtIFRURlJNICg3LjEuMS40MSwgVGFibGUtNTMpICovCi1zdGF0aWMgaW5saW5lIGludCB2YzFfZ2V0X1RURlJNKFZDMUNvbnRleHQgKnYpCitzdGF0aWMgaW5saW5lIGludCB2YzFfZ2V0X1RURlJNKGNvbnN0IFZDMUNvbnRleHQgKnYpCiB7CiAgICAgc3dpdGNoICh2LT50dGZybSkgewogICAgIGNhc2UgVFRfOFg4OiByZXR1cm4gMDsKQEAgLTE0NiwxNDkgKzI0NywxNzIgQEAKIAogc3RhdGljIGludCB2YWFwaV92YzFfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBhdl91bnVzZWQgY29uc3QgdWludDhfdCAqYnVmZmVyLCBhdl91bnVzZWQgdWludDMyX3Qgc2l6ZSkKIHsKLSAgICBWQzFDb250ZXh0ICogY29uc3QgdiA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgTXBlZ0VuY0NvbnRleHQgKiBjb25zdCBzID0gJnYtPnM7Ci0gICAgRkZWQUNvbnRleHQgKiBjb25zdCB2YWN0eCA9IGZmX3ZhYXBpX2dldF9jb250ZXh0KGF2Y3R4KTsKLSAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWQzEgKnBpY19wYXJhbTsKKyAgICBjb25zdCBWQzFDb250ZXh0ICp2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjb25zdCBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIFZBQVBJRGVjb2RlUGljdHVyZSAqcGljID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVkMxIHBpY19wYXJhbTsKKyAgICBpbnQgZXJyOwogCi0gICAgZmZfZGxvZyhhdmN0eCwgInZhYXBpX3ZjMV9zdGFydF9mcmFtZSgpXG4iKTsKKyAgICBwaWMtPm91dHB1dF9zdXJmYWNlID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zik7CiAKLSAgICB2YWN0eC0+c2xpY2VfcGFyYW1fc2l6ZSA9IHNpemVvZihWQVNsaWNlUGFyYW1ldGVyQnVmZmVyVkMxKTsKLQotICAgIC8qIEZpbGwgaW4gVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVkMxICovCi0gICAgcGljX3BhcmFtID0gZmZfdmFhcGlfYWxsb2NfcGljX3BhcmFtKHZhY3R4LCBzaXplb2YoVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVkMxKSk7Ci0gICAgaWYgKCFwaWNfcGFyYW0pCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBwaWNfcGFyYW0tPmZvcndhcmRfcmVmZXJlbmNlX3BpY3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBWQV9JTlZBTElEX0lEOwotICAgIHBpY19wYXJhbS0+YmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFZBX0lOVkFMSURfSUQ7Ci0gICAgcGljX3BhcmFtLT5pbmxvb3BfZGVjb2RlZF9waWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gVkFfSU5WQUxJRF9JRDsKLSAgICBwaWNfcGFyYW0tPnNlcXVlbmNlX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOyAvKiByZXNldCBhbGwgYml0cyAqLwotICAgIHBpY19wYXJhbS0+c2VxdWVuY2VfZmllbGRzLmJpdHMucHVsbGRvd24gICAgICAgICAgICAgICAgICAgICAgICA9IHYtPmJyb2FkY2FzdDsKLSAgICBwaWNfcGFyYW0tPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLmludGVybGFjZSAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5pbnRlcmxhY2U7Ci0gICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMuYml0cy50ZmNudHJmbGFnICAgICAgICAgICAgICAgICAgICAgID0gdi0+dGZjbnRyZmxhZzsKLSAgICBwaWNfcGFyYW0tPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLmZpbnRlcnBmbGFnICAgICAgICAgICAgICAgICAgICAgPSB2LT5maW50ZXJwZmxhZzsKLSAgICBwaWNfcGFyYW0tPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLnBzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5wc2Y7Ci0gICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5tdWx0aXJlcyAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+bXVsdGlyZXM7Ci0gICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5vdmVybGFwICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+b3ZlcmxhcDsKLSAgICBwaWNfcGFyYW0tPnNlcXVlbmNlX2ZpZWxkcy5iaXRzLnN5bmNtYXJrZXIgICAgICAgICAgICAgICAgICAgICAgPSB2LT5yZXN5bmNfbWFya2VyOwotICAgIHBpY19wYXJhbS0+c2VxdWVuY2VfZmllbGRzLmJpdHMucmFuZ2VyZWQgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPnJhbmdlcmVkOwotICAgIHBpY19wYXJhbS0+c2VxdWVuY2VfZmllbGRzLmJpdHMubWF4X2JfZnJhbWVzICAgICAgICAgICAgICAgICAgICA9IHMtPmF2Y3R4LT5tYXhfYl9mcmFtZXM7Ci0jaWYgVkFfQ0hFQ0tfVkVSU0lPTigwLDMyLDApCi0gICAgcGljX3BhcmFtLT5zZXF1ZW5jZV9maWVsZHMuYml0cy5wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+cHJvZmlsZTsKKyAgICBwaWNfcGFyYW0gPSAoVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVkMxKSB7CisgICAgICAgIC5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlICAgICAgICAgPSBWQV9JTlZBTElEX0lELAorICAgICAgICAuYmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUgICAgICAgID0gVkFfSU5WQUxJRF9JRCwKKyAgICAgICAgLmlubG9vcF9kZWNvZGVkX3BpY3R1cmUgICAgICAgICAgICA9IFZBX0lOVkFMSURfSUQsCisgICAgICAgIC5zZXF1ZW5jZV9maWVsZHMuYml0cyA9IHsKKyAgICAgICAgICAgIC5wdWxsZG93biAgICAgICAgICAgICAgICAgICAgICA9IHYtPmJyb2FkY2FzdCwKKyAgICAgICAgICAgIC5pbnRlcmxhY2UgICAgICAgICAgICAgICAgICAgICA9IHYtPmludGVybGFjZSwKKyAgICAgICAgICAgIC50ZmNudHJmbGFnICAgICAgICAgICAgICAgICAgICA9IHYtPnRmY250cmZsYWcsCisgICAgICAgICAgICAuZmludGVycGZsYWcgICAgICAgICAgICAgICAgICAgPSB2LT5maW50ZXJwZmxhZywKKyAgICAgICAgICAgIC5wc2YgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPnBzZiwKKyAgICAgICAgICAgIC5tdWx0aXJlcyAgICAgICAgICAgICAgICAgICAgICA9IHYtPm11bHRpcmVzLAorICAgICAgICAgICAgLm92ZXJsYXAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+b3ZlcmxhcCwKKyAgICAgICAgICAgIC5zeW5jbWFya2VyICAgICAgICAgICAgICAgICAgICA9IHYtPnJlc3luY19tYXJrZXIsCisgICAgICAgICAgICAucmFuZ2VyZWQgICAgICAgICAgICAgICAgICAgICAgPSB2LT5yYW5nZXJlZCwKKyAgICAgICAgICAgIC5tYXhfYl9mcmFtZXMgICAgICAgICAgICAgICAgICA9IHMtPmF2Y3R4LT5tYXhfYl9mcmFtZXMsCisgICAgICAgICAgICAucHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5wcm9maWxlLAorICAgICAgICB9LAorICAgICAgICAuY29kZWRfd2lkdGggICAgICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPmNvZGVkX3dpZHRoLAorICAgICAgICAuY29kZWRfaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPmNvZGVkX2hlaWdodCwKKyAgICAgICAgLmVudHJ5cG9pbnRfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAuYnJva2VuX2xpbmsgICAgICAgICAgICAgICAgICAgPSB2LT5icm9rZW5fbGluaywKKyAgICAgICAgICAgIC5jbG9zZWRfZW50cnkgICAgICAgICAgICAgICAgICA9IHYtPmNsb3NlZF9lbnRyeSwKKyAgICAgICAgICAgIC5wYW5zY2FuX2ZsYWcgICAgICAgICAgICAgICAgICA9IHYtPnBhbnNjYW5mbGFnLAorICAgICAgICAgICAgLmxvb3BmaWx0ZXIgICAgICAgICAgICAgICAgICAgID0gcy0+bG9vcF9maWx0ZXIsCisgICAgICAgIH0sCisgICAgICAgIC5jb25kaXRpb25hbF9vdmVybGFwX2ZsYWcgICAgICAgICAgPSB2LT5jb25kb3ZlciwKKyAgICAgICAgLmZhc3RfdXZtY19mbGFnICAgICAgICAgICAgICAgICAgICA9IHYtPmZhc3R1dm1jLAorICAgICAgICAucmFuZ2VfbWFwcGluZ19maWVsZHMuYml0cyA9IHsKKyAgICAgICAgICAgIC5sdW1hX2ZsYWcgICAgICAgICAgICAgICAgICAgICA9IHYtPnJhbmdlX21hcHlfZmxhZywKKyAgICAgICAgICAgIC5sdW1hICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPnJhbmdlX21hcHksCisgICAgICAgICAgICAuY2hyb21hX2ZsYWcgICAgICAgICAgICAgICAgICAgPSB2LT5yYW5nZV9tYXB1dl9mbGFnLAorICAgICAgICAgICAgLmNocm9tYSAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+cmFuZ2VfbWFwdXYsCisgICAgICAgIH0sCisgICAgICAgIC5iX3BpY3R1cmVfZnJhY3Rpb24gICAgICAgICAgICAgICAgPSB2LT5iZnJhY3Rpb25fbHV0X2luZGV4LAorICAgICAgICAuY2JwX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgID0gKHYtPmZjbSA9PSBQUk9HUkVTU0lWRSA/IHYtPmNicHRhYiA6IHYtPmljYnB0YWIpLAorICAgICAgICAubWJfbW9kZV90YWJsZSAgICAgICAgICAgICAgICAgICAgID0gdi0+bWJtb2RldGFiLAorICAgICAgICAucmFuZ2VfcmVkdWN0aW9uX2ZyYW1lICAgICAgICAgICAgID0gdi0+cmFuZ2VyZWRmcm0sCisgICAgICAgIC5yb3VuZGluZ19jb250cm9sICAgICAgICAgICAgICAgICAgPSB2LT5ybmQsCisgICAgICAgIC5wb3N0X3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgPSB2LT5wb3N0cHJvYywKKyAgICAgICAgLnBpY3R1cmVfcmVzb2x1dGlvbl9pbmRleCAgICAgICAgICA9IHYtPnJlc3BpYywKKyAgICAgICAgLnBpY3R1cmVfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAucGljdHVyZV90eXBlICAgICAgICAgICAgICAgICAgPSAodi0+ZmNtID09IElMQUNFX0ZJRUxEID8gdmMxX2dldF9GUFRZUEUodikgOiB2YzFfZ2V0X1BUWVBFKHYpKSwKKyAgICAgICAgICAgIC5mcmFtZV9jb2RpbmdfbW9kZSAgICAgICAgICAgICA9IHYtPmZjbSwKKyAgICAgICAgICAgIC50b3BfZmllbGRfZmlyc3QgICAgICAgICAgICAgICA9IHYtPnRmZiwKKyAgICAgICAgICAgIC5pc19maXJzdF9maWVsZCAgICAgICAgICAgICAgICA9ICF2LT5zZWNvbmRfZmllbGQsCisgICAgICAgICAgICAuaW50ZW5zaXR5X2NvbXBlbnNhdGlvbiAgICAgICAgPSB2LT5pbnRjb21wLAorICAgICAgICB9LAorICAgICAgICAubHVtYV9zY2FsZSAgICAgICAgICAgICAgICAgICAgICAgID0gdmMxX2dldF9MVU1TQ0FMRSh2KSwKKyAgICAgICAgLmx1bWFfc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICA9IHZjMV9nZXRfTFVNU0hJRlQodiksCisjaWYgVkFfQ0hFQ0tfVkVSU0lPTigxLCAxLCAwKQorICAgICAgICAubHVtYV9zY2FsZTIgICAgICAgICAgICAgICAgICAgICAgID0gdmMxX2dldF9MVU1TQ0FMRTIodiksCisgICAgICAgIC5sdW1hX3NoaWZ0MiAgICAgICAgICAgICAgICAgICAgICAgPSB2YzFfZ2V0X0xVTVNISUZUMih2KSwKKyAgICAgICAgLmludGVuc2l0eV9jb21wZW5zYXRpb25fZmllbGQgICAgICA9IHZjMV9nZXRfSU5UQ09NUEZJRUxEKHYpLAogI2VuZGlmCi0gICAgcGljX3BhcmFtLT5jb2RlZF93aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPmNvZGVkX3dpZHRoOwotICAgIHBpY19wYXJhbS0+Y29kZWRfaGVpZ2h0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPmF2Y3R4LT5jb2RlZF9oZWlnaHQ7Ci0gICAgcGljX3BhcmFtLT5lbnRyeXBvaW50X2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KLSAgICBwaWNfcGFyYW0tPmVudHJ5cG9pbnRfZmllbGRzLmJpdHMuYnJva2VuX2xpbmsgICAgICAgICAgICAgICAgICAgPSB2LT5icm9rZW5fbGluazsKLSAgICBwaWNfcGFyYW0tPmVudHJ5cG9pbnRfZmllbGRzLmJpdHMuY2xvc2VkX2VudHJ5ICAgICAgICAgICAgICAgICAgPSB2LT5jbG9zZWRfZW50cnk7Ci0gICAgcGljX3BhcmFtLT5lbnRyeXBvaW50X2ZpZWxkcy5iaXRzLnBhbnNjYW5fZmxhZyAgICAgICAgICAgICAgICAgID0gdi0+cGFuc2NhbmZsYWc7Ci0gICAgcGljX3BhcmFtLT5lbnRyeXBvaW50X2ZpZWxkcy5iaXRzLmxvb3BmaWx0ZXIgICAgICAgICAgICAgICAgICAgID0gcy0+bG9vcF9maWx0ZXI7Ci0gICAgcGljX3BhcmFtLT5jb25kaXRpb25hbF9vdmVybGFwX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+Y29uZG92ZXI7Ci0gICAgcGljX3BhcmFtLT5mYXN0X3V2bWNfZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+ZmFzdHV2bWM7Ci0gICAgcGljX3BhcmFtLT5yYW5nZV9tYXBwaW5nX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMDsgLyogcmVzZXQgYWxsIGJpdHMgKi8KLSAgICBwaWNfcGFyYW0tPnJhbmdlX21hcHBpbmdfZmllbGRzLmJpdHMubHVtYV9mbGFnICAgICAgICAgICAgICAgICAgPSB2LT5yYW5nZV9tYXB5X2ZsYWc7Ci0gICAgcGljX3BhcmFtLT5yYW5nZV9tYXBwaW5nX2ZpZWxkcy5iaXRzLmx1bWEgICAgICAgICAgICAgICAgICAgICAgID0gdi0+cmFuZ2VfbWFweTsKLSAgICBwaWNfcGFyYW0tPnJhbmdlX21hcHBpbmdfZmllbGRzLmJpdHMuY2hyb21hX2ZsYWcgICAgICAgICAgICAgICAgPSB2LT5yYW5nZV9tYXB1dl9mbGFnOwotICAgIHBpY19wYXJhbS0+cmFuZ2VfbWFwcGluZ19maWVsZHMuYml0cy5jaHJvbWEgICAgICAgICAgICAgICAgICAgICA9IHYtPnJhbmdlX21hcHV2OwotICAgIHBpY19wYXJhbS0+Yl9waWN0dXJlX2ZyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPmJmcmFjdGlvbl9sdXRfaW5kZXg7Ci0gICAgcGljX3BhcmFtLT5jYnBfdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+Y2JwY3lfdmxjID8gdi0+Y2JwY3lfdmxjIC0gZmZfdmMxX2NicGN5X3BfdmxjIDogMDsKLSAgICBwaWNfcGFyYW0tPm1iX21vZGVfdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOyAvKiBYWFg6IGludGVybGFjZWQgZnJhbWUgKi8KLSAgICBwaWNfcGFyYW0tPnJhbmdlX3JlZHVjdGlvbl9mcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5yYW5nZXJlZGZybTsKLSAgICBwaWNfcGFyYW0tPnJvdW5kaW5nX2NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5ybmQ7Ci0gICAgcGljX3BhcmFtLT5wb3N0X3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+cG9zdHByb2M7Ci0gICAgcGljX3BhcmFtLT5waWN0dXJlX3Jlc29sdXRpb25faW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+cmVzcGljOwotICAgIHBpY19wYXJhbS0+bHVtYV9zY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPmx1bXNjYWxlOwotICAgIHBpY19wYXJhbS0+bHVtYV9zaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPmx1bXNoaWZ0OwotICAgIHBpY19wYXJhbS0+cGljdHVyZV9maWVsZHMudmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnBpY3R1cmVfdHlwZSAgICAgICAgICAgICAgICAgICAgID0gdmMxX2dldF9QVFlQRSh2KTsKLSAgICBwaWNfcGFyYW0tPnBpY3R1cmVfZmllbGRzLmJpdHMuZnJhbWVfY29kaW5nX21vZGUgICAgICAgICAgICAgICAgPSB2LT5mY207Ci0gICAgcGljX3BhcmFtLT5waWN0dXJlX2ZpZWxkcy5iaXRzLnRvcF9maWVsZF9maXJzdCAgICAgICAgICAgICAgICAgID0gdi0+dGZmOwotICAgIHBpY19wYXJhbS0+cGljdHVyZV9maWVsZHMuYml0cy5pc19maXJzdF9maWVsZCAgICAgICAgICAgICAgICAgICA9IHYtPmZjbSA9PSAwOyAvKiBYWFg6IGludGVybGFjZWQgZnJhbWUgKi8KLSAgICBwaWNfcGFyYW0tPnBpY3R1cmVfZmllbGRzLmJpdHMuaW50ZW5zaXR5X2NvbXBlbnNhdGlvbiAgICAgICAgICAgPSB2LT5tdl9tb2RlID09IE1WX1BNT0RFX0lOVEVOU0lUWV9DT01QOwotICAgIHBpY19wYXJhbS0+cmF3X2NvZGluZy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT5yYXdfY29kaW5nLmZsYWdzLm12X3R5cGVfbWIgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+bXZfdHlwZV9pc19yYXc7Ci0gICAgcGljX3BhcmFtLT5yYXdfY29kaW5nLmZsYWdzLmRpcmVjdF9tYiAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdi0+ZG1iX2lzX3JhdzsKLSAgICBwaWNfcGFyYW0tPnJhd19jb2RpbmcuZmxhZ3Muc2tpcF9tYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5za2lwX2lzX3JhdzsKLSAgICBwaWNfcGFyYW0tPnJhd19jb2RpbmcuZmxhZ3MuZmllbGRfdHggICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOyAvKiBYWFg6IGludGVybGFjZWQgZnJhbWUgKi8KLSAgICBwaWNfcGFyYW0tPnJhd19jb2RpbmcuZmxhZ3MuZm9yd2FyZF9tYiAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOyAvKiBYWFg6IGludGVybGFjZWQgZnJhbWUgKi8KLSAgICBwaWNfcGFyYW0tPnJhd19jb2RpbmcuZmxhZ3MuYWNfcHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5hY3ByZWRfaXNfcmF3OwotICAgIHBpY19wYXJhbS0+cmF3X2NvZGluZy5mbGFncy5vdmVyZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHYtPm92ZXJmbGdfaXNfcmF3OwotICAgIHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX212X3R5cGVfbWIgICAgICAgICAgICAgICAgID0gdmMxX2hhc19NVlRZUEVNQl9iaXRwbGFuZSh2KTsKLSAgICBwaWNfcGFyYW0tPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfZGlyZWN0X21iICAgICAgICAgICAgICAgICAgPSB2YzFfaGFzX0RJUkVDVE1CX2JpdHBsYW5lKHYpOwotICAgIHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9za2lwX21iICAgICAgICAgICAgICAgICAgICA9IHZjMV9oYXNfU0tJUE1CX2JpdHBsYW5lKHYpOwotICAgIHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9maWVsZF90eCAgICAgICAgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9mb3J3YXJkX21iICAgICAgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9hY19wcmVkICAgICAgICAgICAgICAgICAgICA9IHZjMV9oYXNfQUNQUkVEX2JpdHBsYW5lKHYpOwotICAgIHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9vdmVyZmxhZ3MgICAgICAgICAgICAgICAgICA9IHZjMV9oYXNfT1ZFUkZMQUdTX2JpdHBsYW5lKHYpOwotICAgIHBpY19wYXJhbS0+cmVmZXJlbmNlX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT5yZWZlcmVuY2VfZmllbGRzLmJpdHMucmVmZXJlbmNlX2Rpc3RhbmNlX2ZsYWcgICAgICAgID0gdi0+cmVmZGlzdF9mbGFnOwotICAgIHBpY19wYXJhbS0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9kaXN0YW5jZSAgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLm51bV9yZWZlcmVuY2VfcGljdHVyZXMgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+cmVmZXJlbmNlX2ZpZWxkcy5iaXRzLnJlZmVyZW5jZV9maWVsZF9waWNfaW5kaWNhdG9yICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+bXZfZmllbGRzLnZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5tdl9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdmMxX2dldF9NVk1PREUodik7Ci0gICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5tdl9tb2RlMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdmMxX2dldF9NVk1PREUyKHYpOwotICAgIHBpY19wYXJhbS0+bXZfZmllbGRzLmJpdHMubXZfdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHMtPm12X3RhYmxlX2luZGV4OwotICAgIHBpY19wYXJhbS0+bXZfZmllbGRzLmJpdHMudHdvX212X2Jsb2NrX3BhdHRlcm5fdGFibGUgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+bXZfZmllbGRzLmJpdHMuZm91cl9tdl9zd2l0Y2ggICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+bXZfZmllbGRzLmJpdHMuZm91cl9tdl9ibG9ja19wYXR0ZXJuX3RhYmxlICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+bXZfZmllbGRzLmJpdHMuZXh0ZW5kZWRfbXZfZmxhZyAgICAgICAgICAgICAgICAgICAgICA9IHYtPmV4dGVuZGVkX212OwotICAgIHBpY19wYXJhbS0+bXZfZmllbGRzLmJpdHMuZXh0ZW5kZWRfbXZfcmFuZ2UgICAgICAgICAgICAgICAgICAgICA9IHYtPm12cmFuZ2U7Ci0gICAgcGljX3BhcmFtLT5tdl9maWVsZHMuYml0cy5leHRlbmRlZF9kbXZfZmxhZyAgICAgICAgICAgICAgICAgICAgID0gdi0+ZXh0ZW5kZWRfZG12OwotICAgIHBpY19wYXJhbS0+bXZfZmllbGRzLmJpdHMuZXh0ZW5kZWRfZG12X3JhbmdlICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAqLwotICAgIHBpY19wYXJhbS0+cGljX3F1YW50aXplcl9maWVsZHMudmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxdWFudCAgICAgICAgICAgICAgICAgICAgID0gdi0+ZHF1YW50OwotICAgIHBpY19wYXJhbS0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5xdWFudGl6ZXIgICAgICAgICAgICAgICAgICA9IHYtPnF1YW50aXplcl9tb2RlOwotICAgIHBpY19wYXJhbS0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5oYWxmX3FwICAgICAgICAgICAgICAgICAgICA9IHYtPmhhbGZwcTsKLSAgICBwaWNfcGFyYW0tPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMucGljX3F1YW50aXplcl9zY2FsZSAgICAgICAgPSB2LT5wcTsKLSAgICBwaWNfcGFyYW0tPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMucGljX3F1YW50aXplcl90eXBlICAgICAgICAgPSB2LT5wcXVhbnRpemVyOwotICAgIHBpY19wYXJhbS0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5kcV9mcmFtZSAgICAgICAgICAgICAgICAgICA9IHYtPmRxdWFudGZybTsKLSAgICBwaWNfcGFyYW0tPnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMuZHFfcHJvZmlsZSAgICAgICAgICAgICAgICAgPSB2LT5kcXByb2ZpbGU7Ci0gICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX3NiX2VkZ2UgICAgICAgICAgICAgICAgID0gdi0+ZHFwcm9maWxlID09IERRUFJPRklMRV9TSU5HTEVfRURHRSAgPyB2LT5kcXNiZWRnZSA6IDA7Ci0gICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX2RiX2VkZ2UgICAgICAgICAgICAgICAgID0gdi0+ZHFwcm9maWxlID09IERRUFJPRklMRV9ET1VCTEVfRURHRVMgPyB2LT5kcXNiZWRnZSA6IDA7Ci0gICAgcGljX3BhcmFtLT5waWNfcXVhbnRpemVyX2ZpZWxkcy5iaXRzLmRxX2JpbmFyeV9sZXZlbCAgICAgICAgICAgID0gdi0+ZHFiaWxldmVsOwotICAgIHBpY19wYXJhbS0+cGljX3F1YW50aXplcl9maWVsZHMuYml0cy5hbHRfcGljX3F1YW50aXplciAgICAgICAgICA9IHYtPmFsdHBxOwotICAgIHBpY19wYXJhbS0+dHJhbnNmb3JtX2ZpZWxkcy52YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDA7IC8qIHJlc2V0IGFsbCBiaXRzICovCi0gICAgcGljX3BhcmFtLT50cmFuc2Zvcm1fZmllbGRzLmJpdHMudmFyaWFibGVfc2l6ZWRfdHJhbnNmb3JtX2ZsYWcgID0gdi0+dnN0cmFuc2Zvcm07Ci0gICAgcGljX3BhcmFtLT50cmFuc2Zvcm1fZmllbGRzLmJpdHMubWJfbGV2ZWxfdHJhbnNmb3JtX3R5cGVfZmxhZyAgID0gdi0+dHRtYmY7Ci0gICAgcGljX3BhcmFtLT50cmFuc2Zvcm1fZmllbGRzLmJpdHMuZnJhbWVfbGV2ZWxfdHJhbnNmb3JtX3R5cGUgICAgID0gdmMxX2dldF9UVEZSTSh2KTsKLSAgICBwaWNfcGFyYW0tPnRyYW5zZm9ybV9maWVsZHMuYml0cy50cmFuc2Zvcm1fYWNfY29kaW5nc2V0X2lkeDEgICAgPSB2LT5jX2FjX3RhYmxlX2luZGV4OwotICAgIHBpY19wYXJhbS0+dHJhbnNmb3JtX2ZpZWxkcy5iaXRzLnRyYW5zZm9ybV9hY19jb2RpbmdzZXRfaWR4MiAgICA9IHYtPnlfYWNfdGFibGVfaW5kZXg7Ci0gICAgcGljX3BhcmFtLT50cmFuc2Zvcm1fZmllbGRzLmJpdHMuaW50cmFfdHJhbnNmb3JtX2RjX3RhYmxlICAgICAgID0gdi0+cy5kY190YWJsZV9pbmRleDsKKyAgICAgICAgLnJhd19jb2RpbmcuZmxhZ3MgPSB7CisgICAgICAgICAgICAubXZfdHlwZV9tYiAgICAgICAgICAgICAgICAgICAgPSB2LT5tdl90eXBlX2lzX3JhdywKKyAgICAgICAgICAgIC5kaXJlY3RfbWIgICAgICAgICAgICAgICAgICAgICA9IHYtPmRtYl9pc19yYXcsCisgICAgICAgICAgICAuc2tpcF9tYiAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5za2lwX2lzX3JhdywKKyAgICAgICAgICAgIC5maWVsZF90eCAgICAgICAgICAgICAgICAgICAgICA9IHYtPmZpZWxkdHhfaXNfcmF3LAorICAgICAgICAgICAgLmZvcndhcmRfbWIgICAgICAgICAgICAgICAgICAgID0gdi0+Zm1iX2lzX3JhdywKKyAgICAgICAgICAgIC5hY19wcmVkICAgICAgICAgICAgICAgICAgICAgICA9IHYtPmFjcHJlZF9pc19yYXcsCisgICAgICAgICAgICAub3ZlcmZsYWdzICAgICAgICAgICAgICAgICAgICAgPSB2LT5vdmVyZmxnX2lzX3JhdywKKyAgICAgICAgfSwKKyAgICAgICAgLmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MgPSB7CisgICAgICAgICAgICAuYnBfbXZfdHlwZV9tYiAgICAgICAgICAgICAgICAgPSB2YzFfaGFzX01WVFlQRU1CX2JpdHBsYW5lKHYpLAorICAgICAgICAgICAgLmJwX2RpcmVjdF9tYiAgICAgICAgICAgICAgICAgID0gdmMxX2hhc19ESVJFQ1RNQl9iaXRwbGFuZSh2KSwKKyAgICAgICAgICAgIC5icF9za2lwX21iICAgICAgICAgICAgICAgICAgICA9IHZjMV9oYXNfU0tJUE1CX2JpdHBsYW5lKHYpLAorICAgICAgICAgICAgLmJwX2ZpZWxkX3R4ICAgICAgICAgICAgICAgICAgID0gdmMxX2hhc19GSUVMRFRYX2JpdHBsYW5lKHYpLAorICAgICAgICAgICAgLmJwX2ZvcndhcmRfbWIgICAgICAgICAgICAgICAgID0gdmMxX2hhc19GT1JXQVJETUJfYml0cGxhbmUodiksCisgICAgICAgICAgICAuYnBfYWNfcHJlZCAgICAgICAgICAgICAgICAgICAgPSB2YzFfaGFzX0FDUFJFRF9iaXRwbGFuZSh2KSwKKyAgICAgICAgICAgIC5icF9vdmVyZmxhZ3MgICAgICAgICAgICAgICAgICA9IHZjMV9oYXNfT1ZFUkZMQUdTX2JpdHBsYW5lKHYpLAorICAgICAgICB9LAorICAgICAgICAucmVmZXJlbmNlX2ZpZWxkcy5iaXRzID0geworICAgICAgICAgICAgLnJlZmVyZW5jZV9kaXN0YW5jZV9mbGFnICAgICAgID0gdi0+cmVmZGlzdF9mbGFnLAorICAgICAgICAgICAgLnJlZmVyZW5jZV9kaXN0YW5jZSAgICAgICAgICAgID0gdi0+cmVmZGlzdCwKKyAgICAgICAgICAgIC5udW1fcmVmZXJlbmNlX3BpY3R1cmVzICAgICAgICA9IHYtPm51bXJlZiwKKyAgICAgICAgICAgIC5yZWZlcmVuY2VfZmllbGRfcGljX2luZGljYXRvciA9IHYtPnJlZmZpZWxkLAorICAgICAgICB9LAorICAgICAgICAubXZfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAubXZfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgPSB2YzFfZ2V0X01WTU9ERSh2KSwKKyAgICAgICAgICAgIC5tdl9tb2RlMiAgICAgICAgICAgICAgICAgICAgICA9IHZjMV9nZXRfTVZNT0RFMih2KSwKKyAgICAgICAgICAgIC5tdl90YWJsZSAgICAgICAgICAgICAgICAgICAgICA9ICh2LT5mY20gPT0gUFJPR1JFU1NJVkUgPyBzLT5tdl90YWJsZV9pbmRleCA6IHYtPmltdnRhYiksCisgICAgICAgICAgICAudHdvX212X2Jsb2NrX3BhdHRlcm5fdGFibGUgICAgPSB2LT50d29tdmJwdGFiLAorICAgICAgICAgICAgLmZvdXJfbXZfc3dpdGNoICAgICAgICAgICAgICAgID0gdi0+Zm91cm12c3dpdGNoLAorICAgICAgICAgICAgLmZvdXJfbXZfYmxvY2tfcGF0dGVybl90YWJsZSAgID0gdi0+Zm91cm12YnB0YWIsCisgICAgICAgICAgICAuZXh0ZW5kZWRfbXZfZmxhZyAgICAgICAgICAgICAgPSB2LT5leHRlbmRlZF9tdiwKKyAgICAgICAgICAgIC5leHRlbmRlZF9tdl9yYW5nZSAgICAgICAgICAgICA9IHYtPm12cmFuZ2UsCisgICAgICAgICAgICAuZXh0ZW5kZWRfZG12X2ZsYWcgICAgICAgICAgICAgPSB2LT5leHRlbmRlZF9kbXYsCisgICAgICAgICAgICAuZXh0ZW5kZWRfZG12X3JhbmdlICAgICAgICAgICAgPSB2LT5kbXZyYW5nZSwKKyAgICAgICAgfSwKKyAgICAgICAgLnBpY19xdWFudGl6ZXJfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAuZHF1YW50ICAgICAgICAgICAgICAgICAgICAgICAgPSB2LT5kcXVhbnQsCisgICAgICAgICAgICAucXVhbnRpemVyICAgICAgICAgICAgICAgICAgICAgPSB2LT5xdWFudGl6ZXJfbW9kZSwKKyAgICAgICAgICAgIC5oYWxmX3FwICAgICAgICAgICAgICAgICAgICAgICA9IHYtPmhhbGZwcSwKKyAgICAgICAgICAgIC5waWNfcXVhbnRpemVyX3NjYWxlICAgICAgICAgICA9IHYtPnBxLAorICAgICAgICAgICAgLnBpY19xdWFudGl6ZXJfdHlwZSAgICAgICAgICAgID0gdi0+cHF1YW50aXplciwKKyAgICAgICAgICAgIC5kcV9mcmFtZSAgICAgICAgICAgICAgICAgICAgICA9IHYtPmRxdWFudGZybSwKKyAgICAgICAgICAgIC5kcV9wcm9maWxlICAgICAgICAgICAgICAgICAgICA9IHYtPmRxcHJvZmlsZSwKKyAgICAgICAgICAgIC5kcV9zYl9lZGdlICAgICAgICAgICAgICAgICAgICA9IHYtPmRxcHJvZmlsZSA9PSBEUVBST0ZJTEVfU0lOR0xFX0VER0UgID8gdi0+ZHFzYmVkZ2UgOiAwLAorICAgICAgICAgICAgLmRxX2RiX2VkZ2UgICAgICAgICAgICAgICAgICAgID0gdi0+ZHFwcm9maWxlID09IERRUFJPRklMRV9ET1VCTEVfRURHRVMgPyB2LT5kcXNiZWRnZSA6IDAsCisgICAgICAgICAgICAuZHFfYmluYXJ5X2xldmVsICAgICAgICAgICAgICAgPSB2LT5kcWJpbGV2ZWwsCisgICAgICAgICAgICAuYWx0X3BpY19xdWFudGl6ZXIgICAgICAgICAgICAgPSB2LT5hbHRwcSwKKyAgICAgICAgfSwKKyAgICAgICAgLnRyYW5zZm9ybV9maWVsZHMuYml0cyA9IHsKKyAgICAgICAgICAgIC52YXJpYWJsZV9zaXplZF90cmFuc2Zvcm1fZmxhZyA9IHYtPnZzdHJhbnNmb3JtLAorICAgICAgICAgICAgLm1iX2xldmVsX3RyYW5zZm9ybV90eXBlX2ZsYWcgID0gdi0+dHRtYmYsCisgICAgICAgICAgICAuZnJhbWVfbGV2ZWxfdHJhbnNmb3JtX3R5cGUgICAgPSB2YzFfZ2V0X1RURlJNKHYpLAorICAgICAgICAgICAgLnRyYW5zZm9ybV9hY19jb2RpbmdzZXRfaWR4MSAgID0gdi0+Y19hY190YWJsZV9pbmRleCwKKyAgICAgICAgICAgIC50cmFuc2Zvcm1fYWNfY29kaW5nc2V0X2lkeDIgICA9IHYtPnlfYWNfdGFibGVfaW5kZXgsCisgICAgICAgICAgICAuaW50cmFfdHJhbnNmb3JtX2RjX3RhYmxlICAgICAgPSB2LT5zLmRjX3RhYmxlX2luZGV4LAorICAgICAgICB9LAorICAgIH07CiAKICAgICBzd2l0Y2ggKHMtPnBpY3RfdHlwZSkgewogICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX0I6Ci0gICAgICAgIHBpY19wYXJhbS0+YmFja3dhcmRfcmVmZXJlbmNlX3BpY3R1cmUgPSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChzLT5uZXh0X3BpY3R1cmUuZik7CisgICAgICAgIHBpY19wYXJhbS5iYWNrd2FyZF9yZWZlcmVuY2VfcGljdHVyZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPm5leHRfcGljdHVyZS5mKTsKICAgICAgICAgLy8gZmFsbC10aHJvdWdoCiAgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfUDoKLSAgICAgICAgcGljX3BhcmFtLT5mb3J3YXJkX3JlZmVyZW5jZV9waWN0dXJlID0gZmZfdmFhcGlfZ2V0X3N1cmZhY2VfaWQocy0+bGFzdF9waWN0dXJlLmYpOworICAgICAgICBwaWNfcGFyYW0uZm9yd2FyZF9yZWZlcmVuY2VfcGljdHVyZSA9IGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHMtPmxhc3RfcGljdHVyZS5mKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC52YWx1ZSkgeworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3BhcmFtX2J1ZmZlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVBpY3R1cmVQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGljX3BhcmFtLCBzaXplb2YocGljX3BhcmFtKSk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKHBpY19wYXJhbS5iaXRwbGFuZV9wcmVzZW50LnZhbHVlICYgMHg3ZikgewogICAgICAgICB1aW50OF90ICpiaXRwbGFuZTsKICAgICAgICAgY29uc3QgdWludDhfdCAqZmZfYnBbM107CiAgICAgICAgIGludCB4LCB5LCBuOworICAgICAgICBzaXplX3Qgc2l6ZSA9IChzLT5tYl93aWR0aCAqIHMtPm1iX2hlaWdodCArIDEpIC8gMjsKKworICAgICAgICBiaXRwbGFuZSA9IGF2X21hbGxvY3ooc2l6ZSk7CisgICAgICAgIGlmICghYml0cGxhbmUpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQogCiAgICAgICAgIHN3aXRjaCAocy0+cGljdF90eXBlKSB7CiAgICAgICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX1A6Ci0gICAgICAgICAgICBmZl9icFswXSA9IHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9kaXJlY3RfbWIgID8gdi0+ZGlyZWN0X21iX3BsYW5lICAgIDogTlVMTDsKLSAgICAgICAgICAgIGZmX2JwWzFdID0gcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX3NraXBfbWIgICAgPyBzLT5tYnNraXBfdGFibGUgICAgICAgOiBOVUxMOwotICAgICAgICAgICAgZmZfYnBbMl0gPSBwaWNfcGFyYW0tPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfbXZfdHlwZV9tYiA/IHYtPm12X3R5cGVfbWJfcGxhbmUgICA6IE5VTEw7CisgICAgICAgICAgICBmZl9icFswXSA9IHBpY19wYXJhbS5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2RpcmVjdF9tYiAgPyB2LT5kaXJlY3RfbWJfcGxhbmUgICAgOiBOVUxMOworICAgICAgICAgICAgZmZfYnBbMV0gPSBwaWNfcGFyYW0uYml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9za2lwX21iICAgID8gcy0+bWJza2lwX3RhYmxlICAgICAgIDogTlVMTDsKKyAgICAgICAgICAgIGZmX2JwWzJdID0gcGljX3BhcmFtLmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfbXZfdHlwZV9tYiA/IHYtPm12X3R5cGVfbWJfcGxhbmUgICA6IE5VTEw7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfQjoKICAgICAgICAgICAgIGlmICghdi0+YmlfdHlwZSkgewotICAgICAgICAgICAgICAgIGZmX2JwWzBdID0gcGljX3BhcmFtLT5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2RpcmVjdF9tYiA/IHYtPmRpcmVjdF9tYl9wbGFuZSA6IE5VTEw7Ci0gICAgICAgICAgICAgICAgZmZfYnBbMV0gPSBwaWNfcGFyYW0tPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfc2tpcF9tYiAgID8gcy0+bWJza2lwX3RhYmxlICAgIDogTlVMTDsKLSAgICAgICAgICAgICAgICBmZl9icFsyXSA9IE5VTEw7IC8qIFhYWDogaW50ZXJsYWNlZCBmcmFtZSAoRk9SV0FSRCBwbGFuZSkgKi8KKyAgICAgICAgICAgICAgICBmZl9icFswXSA9IHBpY19wYXJhbS5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2RpcmVjdF9tYiAgPyB2LT5kaXJlY3RfbWJfcGxhbmUgIDogTlVMTDsKKyAgICAgICAgICAgICAgICBmZl9icFsxXSA9IHBpY19wYXJhbS5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX3NraXBfbWIgICAgPyBzLT5tYnNraXBfdGFibGUgICAgIDogTlVMTDsKKyAgICAgICAgICAgICAgICBmZl9icFsyXSA9IHBpY19wYXJhbS5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2ZvcndhcmRfbWIgPyB2LT5mb3J3YXJkX21iX3BsYW5lIDogTlVMTDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8qIGZhbGwtdGhyb3VnaCAoQkktdHlwZSkgKi8KICAgICAgICAgY2FzZSBBVl9QSUNUVVJFX1RZUEVfSToKLSAgICAgICAgICAgIGZmX2JwWzBdID0gTlVMTDsgLyogWFhYOiBpbnRlcmxhY2VkIGZyYW1lIChGSUVMRFRYIHBsYW5lKSAqLwotICAgICAgICAgICAgZmZfYnBbMV0gPSBwaWNfcGFyYW0tPmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfYWNfcHJlZCAgICA/IHYtPmFjcHJlZF9wbGFuZSAgICAgICA6IE5VTEw7Ci0gICAgICAgICAgICBmZl9icFsyXSA9IHBpY19wYXJhbS0+Yml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9vdmVyZmxhZ3MgID8gdi0+b3Zlcl9mbGFnc19wbGFuZSAgIDogTlVMTDsKKyAgICAgICAgICAgIGZmX2JwWzBdID0gcGljX3BhcmFtLmJpdHBsYW5lX3ByZXNlbnQuZmxhZ3MuYnBfZmllbGRfdHggICA/IHYtPmZpZWxkdHhfcGxhbmUgICAgICA6IE5VTEw7CisgICAgICAgICAgICBmZl9icFsxXSA9IHBpY19wYXJhbS5iaXRwbGFuZV9wcmVzZW50LmZsYWdzLmJwX2FjX3ByZWQgICAgPyB2LT5hY3ByZWRfcGxhbmUgICAgICAgOiBOVUxMOworICAgICAgICAgICAgZmZfYnBbMl0gPSBwaWNfcGFyYW0uYml0cGxhbmVfcHJlc2VudC5mbGFncy5icF9vdmVyZmxhZ3MgID8gdi0+b3Zlcl9mbGFnc19wbGFuZSAgIDogTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgZmZfYnBbMF0gPSBOVUxMOwpAQCAtMjk3LDI4ICs0MjEsNTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgYml0cGxhbmUgPSBmZl92YWFwaV9hbGxvY19iaXRwbGFuZSh2YWN0eCwgKHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0ICsgMSkgLyAyKTsKLSAgICAgICAgaWYgKCFiaXRwbGFuZSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLQogICAgICAgICBuID0gMDsKICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPm1iX2hlaWdodDsgeSsrKQogICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPm1iX3dpZHRoOyB4KyssIG4rKykKICAgICAgICAgICAgICAgICB2YzFfcGFja19iaXRwbGFuZXMoYml0cGxhbmUsIG4sIGZmX2JwLCB4LCB5LCBzLT5tYl9zdHJpZGUpOwogICAgICAgICBpZiAobiAmIDEpIC8qIG1vdmUgbGFzdCBuaWJibGUgdG8gdGhlIGhpZ2ggb3JkZXIgKi8KICAgICAgICAgICAgIGJpdHBsYW5lW24vMl0gPDw9IDQ7CisKKyAgICAgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUJpdFBsYW5lQnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHBsYW5lLCBzaXplKTsKKyAgICAgICAgYXZfZnJlZShiaXRwbGFuZSk7CisgICAgICAgIGlmIChlcnIpCisgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZmX3ZhYXBpX2RlY29kZV9jYW5jZWwoYXZjdHgsIHBpYyk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2YWFwaV92YzFfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQzFDb250ZXh0ICp2ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOworICAgIFZBQVBJRGVjb2RlUGljdHVyZSAqcGljID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3ZhYXBpX2RlY29kZV9pc3N1ZShhdmN0eCwgcGljKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZmZfbXBlZ19kcmF3X2hvcml6X2JhbmQocywgMCwgcy0+YXZjdHgtPmhlaWdodCk7CisKK2ZhaWw6CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCB2YWFwaV92YzFfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQogewotICAgIFZDMUNvbnRleHQgKiBjb25zdCB2ID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBNcGVnRW5jQ29udGV4dCAqIGNvbnN0IHMgPSAmdi0+czsKLSAgICBGRlZBQ29udGV4dCAqIGNvbnN0IHZhY3R4ID0gZmZfdmFhcGlfZ2V0X2NvbnRleHQoYXZjdHgpOwotICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKnNsaWNlX3BhcmFtOwotCi0gICAgZmZfZGxvZyhhdmN0eCwgInZhYXBpX3ZjMV9kZWNvZGVfc2xpY2UoKTogYnVmZmVyICVwLCBzaXplICVkXG4iLCBidWZmZXIsIHNpemUpOworICAgIGNvbnN0IFZDMUNvbnRleHQgKnYgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IE1wZWdFbmNDb250ZXh0ICpzID0gJnYtPnM7CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBWQVNsaWNlUGFyYW1ldGVyQnVmZmVyVkMxIHNsaWNlX3BhcmFtOworICAgIGludCBlcnI7CiAKICAgICAvKiBDdXJyZW50IGJpdCBidWZmZXIgaXMgYmV5b25kIGFueSBtYXJrZXIgZm9yIFZDLTEsIHNvIHNraXAgaXQgKi8KICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSAmJiBJU19NQVJLRVIoQVZfUkIzMihidWZmZXIpKSkgewpAQCAtMzI2LDM5ICs0NzMsNTUgQEAKICAgICAgICAgc2l6ZSAtPSA0OwogICAgIH0KIAotICAgIC8qIEZpbGwgaW4gVkFTbGljZVBhcmFtZXRlckJ1ZmZlclZDMSAqLwotICAgIHNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEgKilmZl92YWFwaV9hbGxvY19zbGljZSh2YWN0eCwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAoIXNsaWNlX3BhcmFtKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc2xpY2VfcGFyYW0tPm1hY3JvYmxvY2tfb2Zmc2V0ICAgICAgID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKTsKLSAgICBzbGljZV9wYXJhbS0+c2xpY2VfdmVydGljYWxfcG9zaXRpb24gPSBzLT5tYl95OworICAgIHNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWQzEpIHsKKyAgICAgICAgLnNsaWNlX2RhdGFfc2l6ZSAgICAgICAgID0gc2l6ZSwKKyAgICAgICAgLnNsaWNlX2RhdGFfb2Zmc2V0ICAgICAgID0gMCwKKyAgICAgICAgLnNsaWNlX2RhdGFfZmxhZyAgICAgICAgID0gVkFfU0xJQ0VfREFUQV9GTEFHX0FMTCwKKyAgICAgICAgLm1hY3JvYmxvY2tfb2Zmc2V0ICAgICAgID0gZ2V0X2JpdHNfY291bnQoJnMtPmdiKSwKKyAgICAgICAgLnNsaWNlX3ZlcnRpY2FsX3Bvc2l0aW9uID0gcy0+bWJfeSwKKyAgICB9OworCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2Vfc2xpY2VfYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbGljZV9wYXJhbSwgc2l6ZW9mKHNsaWNlX3BhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKGF2Y3R4LCBwaWMpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKwogICAgIHJldHVybiAwOwogfQogCiAjaWYgQ09ORklHX1dNVjNfVkFBUElfSFdBQ0NFTAotQVZIV0FjY2VsIGZmX3dtdjNfdmFhcGlfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAid212M192YWFwaSIsCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjMsCi0gICAgLnBpeF9mbXQgICAgICAgID0gQVZfUElYX0ZNVF9WQUFQSSwKLSAgICAuc3RhcnRfZnJhbWUgICAgPSB2YWFwaV92YzFfc3RhcnRfZnJhbWUsCi0gICAgLmVuZF9mcmFtZSAgICAgID0gZmZfdmFhcGlfbXBlZ19lbmRfZnJhbWUsCi0gICAgLmRlY29kZV9zbGljZSAgID0gdmFhcGlfdmMxX2RlY29kZV9zbGljZSwKLSAgICAuaW5pdCAgICAgICAgICAgPSBmZl92YWFwaV9jb250ZXh0X2luaXQsCi0gICAgLnVuaW5pdCAgICAgICAgID0gZmZfdmFhcGlfY29udGV4dF9maW5pLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRlZBQ29udGV4dCksCitjb25zdCBBVkhXQWNjZWwgZmZfd212M192YWFwaV9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJ3bXYzX3ZhYXBpIiwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01WMywKKyAgICAucGl4X2ZtdCAgICAgICAgICAgICAgPSBBVl9QSVhfRk1UX1ZBQVBJLAorICAgIC5zdGFydF9mcmFtZSAgICAgICAgICA9ICZ2YWFwaV92YzFfc3RhcnRfZnJhbWUsCisgICAgLmVuZF9mcmFtZSAgICAgICAgICAgID0gJnZhYXBpX3ZjMV9lbmRfZnJhbWUsCisgICAgLmRlY29kZV9zbGljZSAgICAgICAgID0gJnZhYXBpX3ZjMV9kZWNvZGVfc2xpY2UsCisgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZBQVBJRGVjb2RlUGljdHVyZSksCisgICAgLmluaXQgICAgICAgICAgICAgICAgID0gJmZmX3ZhYXBpX2RlY29kZV9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgICAgICA9ICZmZl92YWFwaV9kZWNvZGVfdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9ICZmZl92YWFwaV9jb21tb25fZnJhbWVfcGFyYW1zLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICA9IHNpemVvZihWQUFQSURlY29kZUNvbnRleHQpLAorICAgIC5jYXBzX2ludGVybmFsICAgICAgICA9IEhXQUNDRUxfQ0FQX0FTWU5DX1NBRkUsCiB9OwogI2VuZGlmCiAKLUFWSFdBY2NlbCBmZl92YzFfdmFhcGlfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAidmMxX3ZhYXBpIiwKLSAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVkMxLAotICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkFBUEksCi0gICAgLnN0YXJ0X2ZyYW1lICAgID0gdmFhcGlfdmMxX3N0YXJ0X2ZyYW1lLAotICAgIC5lbmRfZnJhbWUgICAgICA9IGZmX3ZhYXBpX21wZWdfZW5kX2ZyYW1lLAotICAgIC5kZWNvZGVfc2xpY2UgICA9IHZhYXBpX3ZjMV9kZWNvZGVfc2xpY2UsCi0gICAgLmluaXQgICAgICAgICAgID0gZmZfdmFhcGlfY29udGV4dF9pbml0LAotICAgIC51bmluaXQgICAgICAgICA9IGZmX3ZhYXBpX2NvbnRleHRfZmluaSwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZWQUNvbnRleHQpLAorY29uc3QgQVZIV0FjY2VsIGZmX3ZjMV92YWFwaV9od2FjY2VsID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJ2YzFfdmFhcGkiLAorICAgIC50eXBlICAgICAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQzEsCisgICAgLnBpeF9mbXQgICAgICAgICAgICAgID0gQVZfUElYX0ZNVF9WQUFQSSwKKyAgICAuc3RhcnRfZnJhbWUgICAgICAgICAgPSAmdmFhcGlfdmMxX3N0YXJ0X2ZyYW1lLAorICAgIC5lbmRfZnJhbWUgICAgICAgICAgICA9ICZ2YWFwaV92YzFfZW5kX2ZyYW1lLAorICAgIC5kZWNvZGVfc2xpY2UgICAgICAgICA9ICZ2YWFwaV92YzFfZGVjb2RlX3NsaWNlLAorICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQUFQSURlY29kZVBpY3R1cmUpLAorICAgIC5pbml0ICAgICAgICAgICAgICAgICA9ICZmZl92YWFwaV9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgICAgICAgPSAmZmZfdmFhcGlfZGVjb2RlX3VuaW5pdCwKKyAgICAuZnJhbWVfcGFyYW1zICAgICAgICAgPSAmZmZfdmFhcGlfY29tbW9uX2ZyYW1lX3BhcmFtcywKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICAgPSBzaXplb2YoVkFBUElEZWNvZGVDb250ZXh0KSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgICAgICAgPSBIV0FDQ0VMX0NBUF9BU1lOQ19TQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmFhcGlfdnA4LmMgYi9saWJhdmNvZGVjL3ZhYXBpX3ZwOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjZiMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3ZhYXBpX3ZwOC5jCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDx2YS92YS5oPgorI2luY2x1ZGUgPHZhL3ZhX2RlY192cDguaD4KKworI2luY2x1ZGUgImh3YWNjZWwuaCIKKyNpbmNsdWRlICJ2YWFwaV9kZWNvZGUuaCIKKyNpbmNsdWRlICJ2cDguaCIKKworc3RhdGljIFZBU3VyZmFjZUlEIHZhYXBpX3ZwOF9zdXJmYWNlX2lkKFZQOEZyYW1lICp2ZikKK3sKKyAgICBpZiAodmYpCisgICAgICAgIHJldHVybiBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZCh2Zi0+dGYuZik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gVkFfSU5WQUxJRF9TVVJGQUNFOworfQorCitzdGF0aWMgaW50IHZhYXBpX3ZwOF9zdGFydF9mcmFtZShBVkNvZGVjQ29udGV4dCAgICAgICAgICAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl91bnVzZWQgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIHVpbnQzMl90ICAgICAgIHNpemUpCit7CisgICAgY29uc3QgVlA4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9DVVJSRU5UXS0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgVkFQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVlA4IHBwOworICAgIFZBUHJvYmFiaWxpdHlEYXRhQnVmZmVyVlA4IHByb2I7CisgICAgVkFJUU1hdHJpeEJ1ZmZlclZQOCBxdWFudDsKKyAgICBpbnQgZXJyLCBpLCBqLCBrOworCisgICAgcGljLT5vdXRwdXRfc3VyZmFjZSA9IHZhYXBpX3ZwOF9zdXJmYWNlX2lkKHMtPmZyYW1lcFtWUDU2X0ZSQU1FX0NVUlJFTlRdKTsKKworICAgIHBwID0gKFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZQOCkgeworICAgICAgICAuZnJhbWVfd2lkdGggICAgICAgICAgICAgICAgICAgICA9IGF2Y3R4LT53aWR0aCwKKyAgICAgICAgLmZyYW1lX2hlaWdodCAgICAgICAgICAgICAgICAgICAgPSBhdmN0eC0+aGVpZ2h0LAorCisgICAgICAgIC5sYXN0X3JlZl9mcmFtZSAgICAgICAgICAgICAgICAgID0gdmFhcGlfdnA4X3N1cmZhY2VfaWQocy0+ZnJhbWVwW1ZQNTZfRlJBTUVfUFJFVklPVVNdKSwKKyAgICAgICAgLmdvbGRlbl9yZWZfZnJhbWUgICAgICAgICAgICAgICAgPSB2YWFwaV92cDhfc3VyZmFjZV9pZChzLT5mcmFtZXBbVlA1Nl9GUkFNRV9HT0xERU5dKSwKKyAgICAgICAgLmFsdF9yZWZfZnJhbWUgICAgICAgICAgICAgICAgICAgPSB2YWFwaV92cDhfc3VyZmFjZV9pZChzLT5mcmFtZXBbVlA1Nl9GUkFNRV9HT0xERU4yXSksCisgICAgICAgIC5vdXRfb2ZfbG9vcF9mcmFtZSAgICAgICAgICAgICAgID0gVkFfSU5WQUxJRF9TVVJGQUNFLAorCisgICAgICAgIC5waWNfZmllbGRzLmJpdHMgPSB7CisgICAgICAgICAgICAua2V5X2ZyYW1lICAgICAgICAgICAgICAgICAgID0gIXMtPmtleWZyYW1lLAorICAgICAgICAgICAgLnZlcnNpb24gICAgICAgICAgICAgICAgICAgICA9IHMtPnByb2ZpbGUsCisKKyAgICAgICAgICAgIC5zZWdtZW50YXRpb25fZW5hYmxlZCAgICAgICAgPSBzLT5zZWdtZW50YXRpb24uZW5hYmxlZCwKKyAgICAgICAgICAgIC51cGRhdGVfbWJfc2VnbWVudGF0aW9uX21hcCAgPSBzLT5zZWdtZW50YXRpb24udXBkYXRlX21hcCwKKyAgICAgICAgICAgIC51cGRhdGVfc2VnbWVudF9mZWF0dXJlX2RhdGEgPSBzLT5zZWdtZW50YXRpb24udXBkYXRlX2ZlYXR1cmVfZGF0YSwKKworICAgICAgICAgICAgLmZpbHRlcl90eXBlICAgICAgICAgICAgICAgICA9IHMtPmZpbHRlci5zaW1wbGUsCisgICAgICAgICAgICAuc2hhcnBuZXNzX2xldmVsICAgICAgICAgICAgID0gcy0+ZmlsdGVyLnNoYXJwbmVzcywKKworICAgICAgICAgICAgLmxvb3BfZmlsdGVyX2Fkal9lbmFibGUgICAgICA9IHMtPmxmX2RlbHRhLmVuYWJsZWQsCisgICAgICAgICAgICAubW9kZV9yZWZfbGZfZGVsdGFfdXBkYXRlICAgID0gcy0+bGZfZGVsdGEudXBkYXRlLAorCisgICAgICAgICAgICAuc2lnbl9iaWFzX2dvbGRlbiAgICAgICAgICAgID0gcy0+c2lnbl9iaWFzW1ZQNTZfRlJBTUVfR09MREVOXSwKKyAgICAgICAgICAgIC5zaWduX2JpYXNfYWx0ZXJuYXRlICAgICAgICAgPSBzLT5zaWduX2JpYXNbVlA1Nl9GUkFNRV9HT0xERU4yXSwKKworICAgICAgICAgICAgLm1iX25vX2NvZWZmX3NraXAgICAgICAgICAgICA9IHMtPm1ic2tpcF9lbmFibGVkLAorICAgICAgICAgICAgLmxvb3BfZmlsdGVyX2Rpc2FibGUgICAgICAgICA9IHMtPmZpbHRlci5sZXZlbCA9PSAwLAorICAgICAgICB9LAorCisgICAgICAgIC5wcm9iX3NraXBfZmFsc2UgICAgICAgICAgICAgICAgID0gcy0+cHJvYi0+bWJza2lwLAorICAgICAgICAucHJvYl9pbnRyYSAgICAgICAgICAgICAgICAgICAgICA9IHMtPnByb2ItPmludHJhLAorICAgICAgICAucHJvYl9sYXN0ICAgICAgICAgICAgICAgICAgICAgICA9IHMtPnByb2ItPmxhc3QsCisgICAgICAgIC5wcm9iX2dmICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cHJvYi0+Z29sZGVuLAorICAgIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBwcC5tYl9zZWdtZW50X3RyZWVfcHJvYnNbaV0gPSBzLT5wcm9iLT5zZWdtZW50aWRbaV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGlmIChzLT5zZWdtZW50YXRpb24uZW5hYmxlZCkgeworICAgICAgICAgICAgcHAubG9vcF9maWx0ZXJfbGV2ZWxbaV0gPSBzLT5zZWdtZW50YXRpb24uZmlsdGVyX2xldmVsW2ldOworICAgICAgICAgICAgaWYgKCFzLT5zZWdtZW50YXRpb24uYWJzb2x1dGVfdmFscykKKyAgICAgICAgICAgICAgICBwcC5sb29wX2ZpbHRlcl9sZXZlbFtpXSArPSBzLT5maWx0ZXIubGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcC5sb29wX2ZpbHRlcl9sZXZlbFtpXSA9IHMtPmZpbHRlci5sZXZlbDsKKyAgICAgICAgfQorICAgICAgICBwcC5sb29wX2ZpbHRlcl9sZXZlbFtpXSA9IGF2X2NsaXBfdWludHAyKHBwLmxvb3BfZmlsdGVyX2xldmVsW2ldLCA2KTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHBwLmxvb3BfZmlsdGVyX2RlbHRhc19yZWZfZnJhbWVbaV0gPSBzLT5sZl9kZWx0YS5yZWZbaV07CisgICAgICAgIHBwLmxvb3BfZmlsdGVyX2RlbHRhc19tb2RlW2ldID0gcy0+bGZfZGVsdGEubW9kZVtpICsgNF07CisgICAgfQorCisgICAgaWYgKHMtPmtleWZyYW1lKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtleWZyYW1lX3lfbW9kZV9wcm9ic1s0XSA9IHsKKyAgICAgICAgICAgIDE0NSwgMTU2LCAxNjMsIDEyOAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrZXlmcmFtZV91dl9tb2RlX3Byb2JzWzNdID0geworICAgICAgICAgICAgMTQyLCAxMTQsIDE4MworICAgICAgICB9OworICAgICAgICBtZW1jcHkocHAueV9tb2RlX3Byb2JzLCAga2V5ZnJhbWVfeV9tb2RlX3Byb2JzLCAgNCk7CisgICAgICAgIG1lbWNweShwcC51dl9tb2RlX3Byb2JzLCBrZXlmcmFtZV91dl9tb2RlX3Byb2JzLCAzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgcHAueV9tb2RlX3Byb2JzW2ldID0gcy0+cHJvYi0+cHJlZDE2eDE2W2ldOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgcHAudXZfbW9kZV9wcm9ic1tpXSA9IHMtPnByb2ItPnByZWQ4eDhjW2ldOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTk7IGorKykKKyAgICAgICAgICAgIHBwLm12X3Byb2JzW2ldW2pdID0gcy0+cHJvYi0+bXZjW2ldW2pdOworCisgICAgcHAuYm9vbF9jb2Rlcl9jdHgucmFuZ2UgPSBzLT5jb2Rlcl9zdGF0ZV9hdF9oZWFkZXJfZW5kLnJhbmdlOworICAgIHBwLmJvb2xfY29kZXJfY3R4LnZhbHVlID0gcy0+Y29kZXJfc3RhdGVfYXRfaGVhZGVyX2VuZC52YWx1ZTsKKyAgICBwcC5ib29sX2NvZGVyX2N0eC5jb3VudCA9IHMtPmNvZGVyX3N0YXRlX2F0X2hlYWRlcl9lbmQuYml0X2NvdW50OworCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcCwgc2l6ZW9mKHBwKSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBjb2VmZl9iYW5kc19pbnZlcnNlWzhdID0geworICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDUsIDYsIDQsIDE1CisgICAgICAgICAgICB9OworICAgICAgICAgICAgaW50IGNvZWZmX3BvcyA9IGNvZWZmX2JhbmRzX2ludmVyc2Vbal07CisKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzOyBrKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocHJvYi5kY3RfY29lZmZfcHJvYnNbaV1bal1ba10sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2ItPnRva2VuW2ldW2NvZWZmX3Bvc11ba10sIDExKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3BhcmFtX2J1ZmZlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVByb2JhYmlsaXR5QnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2IsIHNpemVvZihwcm9iKSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IGJhc2VfcWkgPSBzLT5zZWdtZW50YXRpb24uYmFzZV9xdWFudFtpXTsKKyAgICAgICAgaWYgKCFzLT5zZWdtZW50YXRpb24uYWJzb2x1dGVfdmFscykKKyAgICAgICAgICAgIGJhc2VfcWkgKz0gcy0+cXVhbnQueWFjX3FpOworCisgICAgICAgIHF1YW50LnF1YW50aXphdGlvbl9pbmRleFtpXVswXSA9IGF2X2NsaXBfdWludHAyKGJhc2VfcWksICAgICAgICAgICAgICAgICAgICAgICA3KTsKKyAgICAgICAgcXVhbnQucXVhbnRpemF0aW9uX2luZGV4W2ldWzFdID0gYXZfY2xpcF91aW50cDIoYmFzZV9xaSArIHMtPnF1YW50LnlkY19kZWx0YSwgIDcpOworICAgICAgICBxdWFudC5xdWFudGl6YXRpb25faW5kZXhbaV1bMl0gPSBhdl9jbGlwX3VpbnRwMihiYXNlX3FpICsgcy0+cXVhbnQueTJkY19kZWx0YSwgNyk7CisgICAgICAgIHF1YW50LnF1YW50aXphdGlvbl9pbmRleFtpXVszXSA9IGF2X2NsaXBfdWludHAyKGJhc2VfcWkgKyBzLT5xdWFudC55MmFjX2RlbHRhLCA3KTsKKyAgICAgICAgcXVhbnQucXVhbnRpemF0aW9uX2luZGV4W2ldWzRdID0gYXZfY2xpcF91aW50cDIoYmFzZV9xaSArIHMtPnF1YW50LnV2ZGNfZGVsdGEsIDcpOworICAgICAgICBxdWFudC5xdWFudGl6YXRpb25faW5kZXhbaV1bNV0gPSBhdl9jbGlwX3VpbnRwMihiYXNlX3FpICsgcy0+cXVhbnQudXZhY19kZWx0YSwgNyk7CisgICAgfQorCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBSVFNYXRyaXhCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVhbnQsIHNpemVvZihxdWFudCkpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKGF2Y3R4LCBwaWMpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfdnA4X2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgY29uc3QgVlA4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9DVVJSRU5UXS0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisKKyAgICByZXR1cm4gZmZfdmFhcGlfZGVjb2RlX2lzc3VlKGF2Y3R4LCBwaWMpOworfQorCitzdGF0aWMgaW50IHZhYXBpX3ZwOF9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgICAgIHNpemUpCit7CisgICAgY29uc3QgVlA4Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9DVVJSRU5UXS0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgVkFTbGljZVBhcmFtZXRlckJ1ZmZlclZQOCBzcDsKKyAgICBpbnQgZXJyLCBpOworCisgICAgdW5zaWduZWQgaW50IGhlYWRlcl9zaXplID0gMyArIDcgKiBzLT5rZXlmcmFtZTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyICsgaGVhZGVyX3NpemU7CisgICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSA9IHNpemUgLSBoZWFkZXJfc2l6ZTsKKworICAgIHNwID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWUDgpIHsKKyAgICAgICAgLnNsaWNlX2RhdGFfc2l6ZSAgID0gZGF0YV9zaXplLAorICAgICAgICAuc2xpY2VfZGF0YV9vZmZzZXQgPSAwLAorICAgICAgICAuc2xpY2VfZGF0YV9mbGFnICAgPSBWQV9TTElDRV9EQVRBX0ZMQUdfQUxMLAorCisgICAgICAgIC5tYWNyb2Jsb2NrX29mZnNldCA9ICg4ICogKHMtPmNvZGVyX3N0YXRlX2F0X2hlYWRlcl9lbmQuaW5wdXQgLSBkYXRhKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2Rlcl9zdGF0ZV9hdF9oZWFkZXJfZW5kLmJpdF9jb3VudCAtIDgpLAorICAgICAgICAubnVtX29mX3BhcnRpdGlvbnMgPSBzLT5udW1fY29lZmZfcGFydGl0aW9ucyArIDEsCisgICAgfTsKKworICAgIHNwLnBhcnRpdGlvbl9zaXplWzBdID0gcy0+aGVhZGVyX3BhcnRpdGlvbl9zaXplIC0gKChzcC5tYWNyb2Jsb2NrX29mZnNldCArIDcpIC8gOCk7CisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgc3AucGFydGl0aW9uX3NpemVbaSsxXSA9IHMtPmNvZWZmX3BhcnRpdGlvbl9zaXplW2ldOworCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2Vfc2xpY2VfYnVmZmVyKGF2Y3R4LCBwaWMsICZzcCwgc2l6ZW9mKHNwKSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKGF2Y3R4LCBwaWMpOworICAgIHJldHVybiBlcnI7Cit9CisKK2NvbnN0IEFWSFdBY2NlbCBmZl92cDhfdmFhcGlfaHdhY2NlbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAidnA4X3ZhYXBpIiwKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVlA4LAorICAgIC5waXhfZm10ICAgICAgICAgICAgICA9IEFWX1BJWF9GTVRfVkFBUEksCisgICAgLnN0YXJ0X2ZyYW1lICAgICAgICAgID0gJnZhYXBpX3ZwOF9zdGFydF9mcmFtZSwKKyAgICAuZW5kX2ZyYW1lICAgICAgICAgICAgPSAmdmFhcGlfdnA4X2VuZF9mcmFtZSwKKyAgICAuZGVjb2RlX3NsaWNlICAgICAgICAgPSAmdmFhcGlfdnA4X2RlY29kZV9zbGljZSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkFBUElEZWNvZGVQaWN0dXJlKSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSAmZmZfdmFhcGlfZGVjb2RlX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgICAgICAgID0gJmZmX3ZhYXBpX2RlY29kZV91bmluaXQsCisgICAgLmZyYW1lX3BhcmFtcyAgICAgICAgID0gJmZmX3ZhYXBpX2NvbW1vbl9mcmFtZV9wYXJhbXMsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKFZBQVBJRGVjb2RlQ29udGV4dCksCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgID0gSFdBQ0NFTF9DQVBfQVNZTkNfU0FGRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZhYXBpX3ZwOS5jIGIvbGliYXZjb2RlYy92YWFwaV92cDkuYwppbmRleCBiMzYwZGNiLi5mMzg0YmE3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZhYXBpX3ZwOS5jCisrKyBiL2xpYmF2Y29kZWMvdmFhcGlfdnA5LmMKQEAgLTIxLDcxICsyMSwxNyBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgotI2luY2x1ZGUgInZhYXBpX2ludGVybmFsLmgiCi0jaW5jbHVkZSAidnA5LmgiCiAKLXN0YXRpYyB2b2lkIGZpbGxfcGljdHVyZV9wYXJhbWV0ZXJzKEFWQ29kZWNDb250ZXh0ICAgICAgICAgICAgICAgICAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDlTaGFyZWRDb250ZXh0ICAgICAgICAgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQURlY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDkgKnBwKQorI2luY2x1ZGUgImh3YWNjZWwuaCIKKyNpbmNsdWRlICJ2YWFwaV9kZWNvZGUuaCIKKyNpbmNsdWRlICJ2cDlzaGFyZWQuaCIKKworc3RhdGljIFZBU3VyZmFjZUlEIHZhYXBpX3ZwOV9zdXJmYWNlX2lkKGNvbnN0IFZQOUZyYW1lICp2ZikKIHsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5zd19waXhfZm10KTsKLSAgICBpbnQgaTsKLQotICAgIHBwLT5mcmFtZV93aWR0aCA9IGF2Y3R4LT53aWR0aDsKLSAgICBwcC0+ZnJhbWVfaGVpZ2h0ID0gYXZjdHgtPmhlaWdodDsKLQotICAgIHBwLT5mcmFtZV9oZWFkZXJfbGVuZ3RoX2luX2J5dGVzID0gaC0+aC51bmNvbXByZXNzZWRfaGVhZGVyX3NpemU7Ci0gICAgcHAtPmZpcnN0X3BhcnRpdGlvbl9zaXplID0gaC0+aC5jb21wcmVzc2VkX2hlYWRlcl9zaXplOwotCi0gICAgcHAtPnByb2ZpbGUgPSBoLT5oLnByb2ZpbGU7Ci0KLSAgICBwcC0+ZmlsdGVyX2xldmVsID0gaC0+aC5maWx0ZXIubGV2ZWw7Ci0gICAgcHAtPnNoYXJwbmVzc19sZXZlbCA9IGgtPmguZmlsdGVyLnNoYXJwbmVzczsKLSAgICBwcC0+bG9nMl90aWxlX3Jvd3MgPSBoLT5oLnRpbGluZy5sb2cyX3RpbGVfcm93czsKLSAgICBwcC0+bG9nMl90aWxlX2NvbHVtbnMgPSBoLT5oLnRpbGluZy5sb2cyX3RpbGVfY29sczsKLQotICAgIHBwLT5waWNfZmllbGRzLmJpdHMuc3Vic2FtcGxpbmdfeCA9IHBpeGRlc2MtPmxvZzJfY2hyb21hX3c7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy5zdWJzYW1wbGluZ195ID0gcGl4ZGVzYy0+bG9nMl9jaHJvbWFfaDsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLmZyYW1lX3R5cGUgPSAhaC0+aC5rZXlmcmFtZTsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLnNob3dfZnJhbWUgPSAhaC0+aC5pbnZpc2libGU7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy5lcnJvcl9yZXNpbGllbnRfbW9kZSA9IGgtPmguZXJyb3JyZXM7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy5pbnRyYV9vbmx5ID0gaC0+aC5pbnRyYW9ubHk7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy5hbGxvd19oaWdoX3ByZWNpc2lvbl9tdiA9IGgtPmgua2V5ZnJhbWUgPyAwIDogaC0+aC5oaWdocHJlY2lzaW9ubXZzOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMubWNvbXBfZmlsdGVyX3R5cGUgPSBoLT5oLmZpbHRlcm1vZGUgXiAoaC0+aC5maWx0ZXJtb2RlIDw9IDEpOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMuZnJhbWVfcGFyYWxsZWxfZGVjb2RpbmdfbW9kZSA9IGgtPmgucGFyYWxsZWxtb2RlOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMucmVzZXRfZnJhbWVfY29udGV4dCA9IGgtPmgucmVzZXRjdHg7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy5yZWZyZXNoX2ZyYW1lX2NvbnRleHQgPSBoLT5oLnJlZnJlc2hjdHg7Ci0gICAgcHAtPnBpY19maWVsZHMuYml0cy5mcmFtZV9jb250ZXh0X2lkeCA9IGgtPmguZnJhbWVjdHhpZDsKLQotICAgIHBwLT5waWNfZmllbGRzLmJpdHMuc2VnbWVudGF0aW9uX2VuYWJsZWQgPSBoLT5oLnNlZ21lbnRhdGlvbi5lbmFibGVkOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMuc2VnbWVudGF0aW9uX3RlbXBvcmFsX3VwZGF0ZSA9IGgtPmguc2VnbWVudGF0aW9uLnRlbXBvcmFsOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMuc2VnbWVudGF0aW9uX3VwZGF0ZV9tYXAgPSBoLT5oLnNlZ21lbnRhdGlvbi51cGRhdGVfbWFwOwotCi0gICAgcHAtPnBpY19maWVsZHMuYml0cy5sYXN0X3JlZl9mcmFtZSA9IGgtPmgucmVmaWR4WzBdOwotICAgIHBwLT5waWNfZmllbGRzLmJpdHMubGFzdF9yZWZfZnJhbWVfc2lnbl9iaWFzID0gaC0+aC5zaWduYmlhc1swXTsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLmdvbGRlbl9yZWZfZnJhbWUgPSBoLT5oLnJlZmlkeFsxXTsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLmdvbGRlbl9yZWZfZnJhbWVfc2lnbl9iaWFzID0gaC0+aC5zaWduYmlhc1sxXTsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLmFsdF9yZWZfZnJhbWUgPSBoLT5oLnJlZmlkeFsyXTsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLmFsdF9yZWZfZnJhbWVfc2lnbl9iaWFzID0gaC0+aC5zaWduYmlhc1syXTsKLSAgICBwcC0+cGljX2ZpZWxkcy5iaXRzLmxvc3NsZXNzX2ZsYWcgPSBoLT5oLmxvc3NsZXNzOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykKLSAgICAgICAgcHAtPm1iX3NlZ21lbnRfdHJlZV9wcm9ic1tpXSA9IGgtPmguc2VnbWVudGF0aW9uLnByb2JbaV07Ci0KLSAgICBpZiAoaC0+aC5zZWdtZW50YXRpb24udGVtcG9yYWwpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgIHBwLT5zZWdtZW50X3ByZWRfcHJvYnNbaV0gPSBoLT5oLnNlZ21lbnRhdGlvbi5wcmVkX3Byb2JbaV07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWVtc2V0KHBwLT5zZWdtZW50X3ByZWRfcHJvYnMsIDI1NSwgc2l6ZW9mKHBwLT5zZWdtZW50X3ByZWRfcHJvYnMpKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgIGlmIChoLT5yZWZzW2ldLmYtPmJ1ZlswXSkgewotICAgICAgICAgICAgcHAtPnJlZmVyZW5jZV9mcmFtZXNbaV0gPSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChoLT5yZWZzW2ldLmYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHAtPnJlZmVyZW5jZV9mcmFtZXNbaV0gPSBWQV9JTlZBTElEX0lEOwotICAgICAgICB9Ci0gICAgfQorICAgIGlmICh2ZikKKyAgICAgICAgcmV0dXJuIGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKHZmLT50Zi5mKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBWQV9JTlZBTElEX1NVUkZBQ0U7CiB9CiAKIHN0YXRpYyBpbnQgdmFhcGlfdnA5X3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICAgICAgICAgICphdmN0eCwKQEAgLTkzLDY4ICszOSwxMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3VudXNlZCB1aW50MzJfdCAgICAgICBzaXplKQogewogICAgIGNvbnN0IFZQOVNoYXJlZENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIEZGVkFDb250ZXh0ICogY29uc3QgdmFjdHggPSBmZl92YWFwaV9nZXRfY29udGV4dChhdmN0eCk7Ci0gICAgVkFEZWNQaWN0dXJlUGFyYW1ldGVyQnVmZmVyVlA5ICpwaWNfcGFyYW07CisgICAgVkFBUElEZWNvZGVQaWN0dXJlICpwaWMgPSBoLT5mcmFtZXNbQ1VSX0ZSQU1FXS5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZTsKKyAgICBWQURlY1BpY3R1cmVQYXJhbWV0ZXJCdWZmZXJWUDkgcGljX3BhcmFtOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZjdHgtPnN3X3BpeF9mbXQpOworICAgIGludCBlcnIsIGk7CiAKLSAgICB2YWN0eC0+c2xpY2VfcGFyYW1fc2l6ZSA9IHNpemVvZihWQVNsaWNlUGFyYW1ldGVyQnVmZmVyVlA5KTsKKyAgICBwaWMtPm91dHB1dF9zdXJmYWNlID0gdmFhcGlfdnA5X3N1cmZhY2VfaWQoJmgtPmZyYW1lc1tDVVJfRlJBTUVdKTsKIAotICAgIHBpY19wYXJhbSA9IGZmX3ZhYXBpX2FsbG9jX3BpY19wYXJhbSh2YWN0eCwgc2l6ZW9mKFZBRGVjUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZQOSkpOwotICAgIGlmICghcGljX3BhcmFtKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgZmlsbF9waWN0dXJlX3BhcmFtZXRlcnMoYXZjdHgsIGgsIHBpY19wYXJhbSk7CisgICAgcGljX3BhcmFtID0gKFZBRGVjUGljdHVyZVBhcmFtZXRlckJ1ZmZlclZQOSkgeworICAgICAgICAuZnJhbWVfd2lkdGggICAgICAgICAgICAgICAgICAgICAgPSBhdmN0eC0+d2lkdGgsCisgICAgICAgIC5mcmFtZV9oZWlnaHQgICAgICAgICAgICAgICAgICAgICA9IGF2Y3R4LT5oZWlnaHQsCisKKyAgICAgICAgLnBpY19maWVsZHMuYml0cyA9IHsKKyAgICAgICAgICAgIC5zdWJzYW1wbGluZ194ICAgICAgICAgICAgICAgID0gcGl4ZGVzYy0+bG9nMl9jaHJvbWFfdywKKyAgICAgICAgICAgIC5zdWJzYW1wbGluZ195ICAgICAgICAgICAgICAgID0gcGl4ZGVzYy0+bG9nMl9jaHJvbWFfaCwKKyAgICAgICAgICAgIC5mcmFtZV90eXBlICAgICAgICAgICAgICAgICAgID0gIWgtPmgua2V5ZnJhbWUsCisgICAgICAgICAgICAuc2hvd19mcmFtZSAgICAgICAgICAgICAgICAgICA9ICFoLT5oLmludmlzaWJsZSwKKyAgICAgICAgICAgIC5lcnJvcl9yZXNpbGllbnRfbW9kZSAgICAgICAgID0gaC0+aC5lcnJvcnJlcywKKyAgICAgICAgICAgIC5pbnRyYV9vbmx5ICAgICAgICAgICAgICAgICAgID0gaC0+aC5pbnRyYW9ubHksCisgICAgICAgICAgICAuYWxsb3dfaGlnaF9wcmVjaXNpb25fbXYgICAgICA9IGgtPmgua2V5ZnJhbWUgPyAwIDogaC0+aC5oaWdocHJlY2lzaW9ubXZzLAorICAgICAgICAgICAgLm1jb21wX2ZpbHRlcl90eXBlICAgICAgICAgICAgPSBoLT5oLmZpbHRlcm1vZGUgXiAoaC0+aC5maWx0ZXJtb2RlIDw9IDEpLAorICAgICAgICAgICAgLmZyYW1lX3BhcmFsbGVsX2RlY29kaW5nX21vZGUgPSBoLT5oLnBhcmFsbGVsbW9kZSwKKyAgICAgICAgICAgIC5yZXNldF9mcmFtZV9jb250ZXh0ICAgICAgICAgID0gaC0+aC5yZXNldGN0eCwKKyAgICAgICAgICAgIC5yZWZyZXNoX2ZyYW1lX2NvbnRleHQgICAgICAgID0gaC0+aC5yZWZyZXNoY3R4LAorICAgICAgICAgICAgLmZyYW1lX2NvbnRleHRfaWR4ICAgICAgICAgICAgPSBoLT5oLmZyYW1lY3R4aWQsCisKKyAgICAgICAgICAgIC5zZWdtZW50YXRpb25fZW5hYmxlZCAgICAgICAgICA9IGgtPmguc2VnbWVudGF0aW9uLmVuYWJsZWQsCisgICAgICAgICAgICAuc2VnbWVudGF0aW9uX3RlbXBvcmFsX3VwZGF0ZSAgPSBoLT5oLnNlZ21lbnRhdGlvbi50ZW1wb3JhbCwKKyAgICAgICAgICAgIC5zZWdtZW50YXRpb25fdXBkYXRlX21hcCAgICAgICA9IGgtPmguc2VnbWVudGF0aW9uLnVwZGF0ZV9tYXAsCisKKyAgICAgICAgICAgIC5sYXN0X3JlZl9mcmFtZSAgICAgICAgICAgICAgICA9IGgtPmgucmVmaWR4WzBdLAorICAgICAgICAgICAgLmxhc3RfcmVmX2ZyYW1lX3NpZ25fYmlhcyAgICAgID0gaC0+aC5zaWduYmlhc1swXSwKKyAgICAgICAgICAgIC5nb2xkZW5fcmVmX2ZyYW1lICAgICAgICAgICAgICA9IGgtPmgucmVmaWR4WzFdLAorICAgICAgICAgICAgLmdvbGRlbl9yZWZfZnJhbWVfc2lnbl9iaWFzICAgID0gaC0+aC5zaWduYmlhc1sxXSwKKyAgICAgICAgICAgIC5hbHRfcmVmX2ZyYW1lICAgICAgICAgICAgICAgICA9IGgtPmgucmVmaWR4WzJdLAorICAgICAgICAgICAgLmFsdF9yZWZfZnJhbWVfc2lnbl9iaWFzICAgICAgID0gaC0+aC5zaWduYmlhc1syXSwKKyAgICAgICAgICAgIC5sb3NzbGVzc19mbGFnICAgICAgICAgICAgICAgICA9IGgtPmgubG9zc2xlc3MsCisgICAgICAgIH0sCisKKyAgICAgICAgLmZpbHRlcl9sZXZlbCAgICAgICAgICAgICAgICAgICAgICA9IGgtPmguZmlsdGVyLmxldmVsLAorICAgICAgICAuc2hhcnBuZXNzX2xldmVsICAgICAgICAgICAgICAgICAgID0gaC0+aC5maWx0ZXIuc2hhcnBuZXNzLAorICAgICAgICAubG9nMl90aWxlX3Jvd3MgICAgICAgICAgICAgICAgICAgID0gaC0+aC50aWxpbmcubG9nMl90aWxlX3Jvd3MsCisgICAgICAgIC5sb2cyX3RpbGVfY29sdW1ucyAgICAgICAgICAgICAgICAgPSBoLT5oLnRpbGluZy5sb2cyX3RpbGVfY29scywKKworICAgICAgICAuZnJhbWVfaGVhZGVyX2xlbmd0aF9pbl9ieXRlcyAgICAgID0gaC0+aC51bmNvbXByZXNzZWRfaGVhZGVyX3NpemUsCisgICAgICAgIC5maXJzdF9wYXJ0aXRpb25fc2l6ZSAgICAgICAgICAgICAgPSBoLT5oLmNvbXByZXNzZWRfaGVhZGVyX3NpemUsCisKKyAgICAgICAgLnByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPmgucHJvZmlsZSwKKyAgICAgICAgLmJpdF9kZXB0aCAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPmguYnBwLAorICAgIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKQorICAgICAgICBwaWNfcGFyYW0ubWJfc2VnbWVudF90cmVlX3Byb2JzW2ldID0gaC0+aC5zZWdtZW50YXRpb24ucHJvYltpXTsKKworICAgIGlmIChoLT5oLnNlZ21lbnRhdGlvbi50ZW1wb3JhbCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgcGljX3BhcmFtLnNlZ21lbnRfcHJlZF9wcm9ic1tpXSA9IGgtPmguc2VnbWVudGF0aW9uLnByZWRfcHJvYltpXTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1zZXQocGljX3BhcmFtLnNlZ21lbnRfcHJlZF9wcm9icywgMjU1LCBzaXplb2YocGljX3BhcmFtLnNlZ21lbnRfcHJlZF9wcm9icykpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaWYgKGgtPnJlZnNbaV0uZi0+YnVmWzBdKQorICAgICAgICAgICAgcGljX3BhcmFtLnJlZmVyZW5jZV9mcmFtZXNbaV0gPSBmZl92YWFwaV9nZXRfc3VyZmFjZV9pZChoLT5yZWZzW2ldLmYpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwaWNfcGFyYW0ucmVmZXJlbmNlX2ZyYW1lc1tpXSA9IFZBX0lOVkFMSURfSUQ7CisgICAgfQorCisgICAgZXJyID0gZmZfdmFhcGlfZGVjb2RlX21ha2VfcGFyYW1fYnVmZmVyKGF2Y3R4LCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUGljdHVyZVBhcmFtZXRlckJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaWNfcGFyYW0sIHNpemVvZihwaWNfcGFyYW0pKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKGF2Y3R4LCBwaWMpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZhYXBpX3ZwOV9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIEZGVkFDb250ZXh0ICogY29uc3QgdmFjdHggPSBmZl92YWFwaV9nZXRfY29udGV4dChhdmN0eCk7CiAgICAgY29uc3QgVlA5U2hhcmVkQ29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IHJldDsKKyAgICBWQUFQSURlY29kZVBpY3R1cmUgKnBpYyA9IGgtPmZyYW1lc1tDVVJfRlJBTUVdLmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogCi0gICAgcmV0ID0gZmZfdmFhcGlfY29tbWl0X3NsaWNlcyh2YWN0eCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZmluaXNoOwotCi0gICAgcmV0ID0gZmZfdmFhcGlfcmVuZGVyX3BpY3R1cmUodmFjdHgsIGZmX3ZhYXBpX2dldF9zdXJmYWNlX2lkKGgtPmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYpKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBmaW5pc2g7Ci0KLWZpbmlzaDoKLSAgICBmZl92YWFwaV9jb21tb25fZW5kX2ZyYW1lKGF2Y3R4KTsKLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBmZl92YWFwaV9kZWNvZGVfaXNzdWUoYXZjdHgsIHBpYyk7CiB9CiAKIHN0YXRpYyBpbnQgdmFhcGlfdnA5X2RlY29kZV9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICAgICAgc2l6ZSkKIHsKLSAgICBGRlZBQ29udGV4dCAqIGNvbnN0IHZhY3R4ID0gZmZfdmFhcGlfZ2V0X2NvbnRleHQoYXZjdHgpOwogICAgIGNvbnN0IFZQOVNoYXJlZENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWUDkgKnNsaWNlX3BhcmFtOwotICAgIGludCBpOworICAgIFZBQVBJRGVjb2RlUGljdHVyZSAqcGljID0gaC0+ZnJhbWVzW0NVUl9GUkFNRV0uaHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7CisgICAgVkFTbGljZVBhcmFtZXRlckJ1ZmZlclZQOSBzbGljZV9wYXJhbTsKKyAgICBpbnQgZXJyLCBpOwogCi0gICAgc2xpY2VfcGFyYW0gPSAoVkFTbGljZVBhcmFtZXRlckJ1ZmZlclZQOSopZmZfdmFhcGlfYWxsb2Nfc2xpY2UodmFjdHgsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKCFzbGljZV9wYXJhbSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgIHNsaWNlX3BhcmFtID0gKFZBU2xpY2VQYXJhbWV0ZXJCdWZmZXJWUDkpIHsKKyAgICAgICAgLnNsaWNlX2RhdGFfc2l6ZSAgID0gc2l6ZSwKKyAgICAgICAgLnNsaWNlX2RhdGFfb2Zmc2V0ID0gMCwKKyAgICAgICAgLnNsaWNlX2RhdGFfZmxhZyAgID0gVkFfU0xJQ0VfREFUQV9GTEFHX0FMTCwKKyAgICB9OwogCiAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgICBzbGljZV9wYXJhbS0+c2VnX3BhcmFtW2ldLnNlZ21lbnRfZmxhZ3MuZmllbGRzLnNlZ21lbnRfcmVmZXJlbmNlX2VuYWJsZWQgPSBoLT5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLnJlZl9lbmFibGVkOwotICAgICAgICBzbGljZV9wYXJhbS0+c2VnX3BhcmFtW2ldLnNlZ21lbnRfZmxhZ3MuZmllbGRzLnNlZ21lbnRfcmVmZXJlbmNlID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5yZWZfdmFsOwotICAgICAgICBzbGljZV9wYXJhbS0+c2VnX3BhcmFtW2ldLnNlZ21lbnRfZmxhZ3MuZmllbGRzLnNlZ21lbnRfcmVmZXJlbmNlX3NraXBwZWQgPSBoLT5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLnNraXBfZW5hYmxlZDsKKyAgICAgICAgc2xpY2VfcGFyYW0uc2VnX3BhcmFtW2ldID0gKFZBU2VnbWVudFBhcmFtZXRlclZQOSkgeworICAgICAgICAgICAgLnNlZ21lbnRfZmxhZ3MuZmllbGRzID0geworICAgICAgICAgICAgICAgIC5zZWdtZW50X3JlZmVyZW5jZV9lbmFibGVkID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5yZWZfZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAuc2VnbWVudF9yZWZlcmVuY2UgICAgICAgICA9IGgtPmguc2VnbWVudGF0aW9uLmZlYXRbaV0ucmVmX3ZhbCwKKyAgICAgICAgICAgICAgICAuc2VnbWVudF9yZWZlcmVuY2Vfc2tpcHBlZCA9IGgtPmguc2VnbWVudGF0aW9uLmZlYXRbaV0uc2tpcF9lbmFibGVkLAorICAgICAgICAgICAgfSwKIAotICAgICAgICBtZW1jcHkoc2xpY2VfcGFyYW0tPnNlZ19wYXJhbVtpXS5maWx0ZXJfbGV2ZWwsIGgtPmguc2VnbWVudGF0aW9uLmZlYXRbaV0ubGZsdmwsIHNpemVvZihzbGljZV9wYXJhbS0+c2VnX3BhcmFtW2ldLmZpbHRlcl9sZXZlbCkpOworICAgICAgICAgICAgLmx1bWFfZGNfcXVhbnRfc2NhbGUgICAgICAgICAgID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5xbXVsWzBdWzBdLAorICAgICAgICAgICAgLmx1bWFfYWNfcXVhbnRfc2NhbGUgICAgICAgICAgID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5xbXVsWzBdWzFdLAorICAgICAgICAgICAgLmNocm9tYV9kY19xdWFudF9zY2FsZSAgICAgICAgID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5xbXVsWzFdWzBdLAorICAgICAgICAgICAgLmNocm9tYV9hY19xdWFudF9zY2FsZSAgICAgICAgID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5xbXVsWzFdWzFdLAorICAgICAgICB9OwogCi0gICAgICAgIHNsaWNlX3BhcmFtLT5zZWdfcGFyYW1baV0ubHVtYV9kY19xdWFudF9zY2FsZSA9IGgtPmguc2VnbWVudGF0aW9uLmZlYXRbaV0ucW11bFswXVswXTsKLSAgICAgICAgc2xpY2VfcGFyYW0tPnNlZ19wYXJhbVtpXS5sdW1hX2FjX3F1YW50X3NjYWxlID0gaC0+aC5zZWdtZW50YXRpb24uZmVhdFtpXS5xbXVsWzBdWzFdOwotICAgICAgICBzbGljZV9wYXJhbS0+c2VnX3BhcmFtW2ldLmNocm9tYV9kY19xdWFudF9zY2FsZSA9IGgtPmguc2VnbWVudGF0aW9uLmZlYXRbaV0ucW11bFsxXVswXTsKLSAgICAgICAgc2xpY2VfcGFyYW0tPnNlZ19wYXJhbVtpXS5jaHJvbWFfYWNfcXVhbnRfc2NhbGUgPSBoLT5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLnFtdWxbMV1bMV07CisgICAgICAgIG1lbWNweShzbGljZV9wYXJhbS5zZWdfcGFyYW1baV0uZmlsdGVyX2xldmVsLCBoLT5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLmxmbHZsLCBzaXplb2Yoc2xpY2VfcGFyYW0uc2VnX3BhcmFtW2ldLmZpbHRlcl9sZXZlbCkpOworICAgIH0KKworICAgIGVyciA9IGZmX3ZhYXBpX2RlY29kZV9tYWtlX3NsaWNlX2J1ZmZlcihhdmN0eCwgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2xpY2VfcGFyYW0sIHNpemVvZihzbGljZV9wYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSk7CisgICAgaWYgKGVycikgeworICAgICAgICBmZl92YWFwaV9kZWNvZGVfY2FuY2VsKGF2Y3R4LCBwaWMpOworICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1BVkhXQWNjZWwgZmZfdnA5X3ZhYXBpX2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfdnA5X3ZhYXBpX2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgID0gInZwOV92YWFwaSIsCiAgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1ZQOSwKQEAgLTE2Miw3ICsxNzYsMTAgQEAKICAgICAuc3RhcnRfZnJhbWUgICAgICAgICAgPSB2YWFwaV92cDlfc3RhcnRfZnJhbWUsCiAgICAgLmVuZF9mcmFtZSAgICAgICAgICAgID0gdmFhcGlfdnA5X2VuZF9mcmFtZSwKICAgICAuZGVjb2RlX3NsaWNlICAgICAgICAgPSB2YWFwaV92cDlfZGVjb2RlX3NsaWNlLAotICAgIC5pbml0ICAgICAgICAgICAgICAgICA9IGZmX3ZhYXBpX2NvbnRleHRfaW5pdCwKLSAgICAudW5pbml0ICAgICAgICAgICAgICAgPSBmZl92YWFwaV9jb250ZXh0X2ZpbmksCi0gICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKEZGVkFDb250ZXh0KSwKKyAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkFBUElEZWNvZGVQaWN0dXJlKSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgICAgPSBmZl92YWFwaV9kZWNvZGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgICAgICAgPSBmZl92YWFwaV9kZWNvZGVfdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICAgICAgICA9IGZmX3ZhYXBpX2NvbW1vbl9mcmFtZV9wYXJhbXMsCisgICAgLnByaXZfZGF0YV9zaXplICAgICAgID0gc2l6ZW9mKFZBQVBJRGVjb2RlQ29udGV4dCksCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgID0gSFdBQ0NFTF9DQVBfQVNZTkNfU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZiLmMgYi9saWJhdmNvZGVjL3ZiLmMKaW5kZXggNTYwMTY1YS4uYzZkZDZmYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92Yi5jCisrKyBiL2xpYmF2Y29kZWMvdmIuYwpAQCAtMTA3LDYgKzEwNywxMCBAQAogICAgIGJsazIgICA9IDA7CiAgICAgZm9yIChibGsgPSAwOyBibGsgPCBibG9ja3M7IGJsaysrKSB7CiAgICAgICAgIGlmICghKGJsayAmIDMpKSB7CisgICAgICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmcpIDwgMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IGRhdGFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYmxvY2t0eXBlcyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnKTsKICAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKGJsb2NrdHlwZXMgJiAweEMwKSB7CkBAIC0yMDUsNiArMjA5LDEwIEBACiAgICAgaWYgKGZsYWdzICYgVkJfSEFTX0dNQykgewogICAgICAgICBpID0gKGludDE2X3QpYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJmMtPnN0cmVhbSk7CiAgICAgICAgIGogPSAoaW50MTZfdClieXRlc3RyZWFtMl9nZXRfbGUxNigmYy0+c3RyZWFtKTsKKyAgICAgICAgaWYgKEZGQUJTKGopID4gYXZjdHgtPmhlaWdodCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJHTVYgb3V0IG9mIHJhbmdlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAgICAgICAgIG9mZnNldCA9IGkgKyBqICogYXZjdHgtPndpZHRoOwogICAgIH0KICAgICBpZiAoZmxhZ3MgJiBWQl9IQVNfVklERU8pIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmJsZS5jIGIvbGliYXZjb2RlYy92YmxlLmMKaW5kZXggYmI5YzgxYy4uYzI1ZWU5OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92YmxlLmMKKysrIGIvbGliYXZjb2RlYy92YmxlLmMKQEAgLTI0LDE5ICsyNCwxOSBAQAogICogVkJMRSBEZWNvZGVyCiAgKi8KIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCi0KICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKIAorI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCi0jaW5jbHVkZSAiaHVmZnl1dmRzcC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibG9zc2xlc3NfdmlkZW9kc3AuaCIKICNpbmNsdWRlICJtYXRob3BzLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCiAKIHR5cGVkZWYgc3RydWN0IFZCTEVDb250ZXh0IHsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7Ci0gICAgSHVmZllVVkRTUENvbnRleHQgaGRzcDsKKyAgICBMTFZpZERTUENvbnRleHQgbGx2aWRkc3A7CiAKICAgICBpbnQgICAgICAgICAgICBzaXplOwogICAgIHVpbnQ4X3QgICAgICAgICp2YWw7IC8vLzwgVGhpcyBhcnJheSBmaXJzdCBob2xkcyB0aGUgbGVuZ3RocyBvZiB2bGMgc3ltYm9scyBhbmQgdGhlbiB0aGVpciB2YWx1ZS4KQEAgLTEwMiw4ICsxMDIsOCBAQAogICAgICAgICBpZiAoaSkgewogICAgICAgICAgICAgbGVmdCA9IDA7CiAgICAgICAgICAgICBsZWZ0X3RvcCA9IGRzdFstc3RyaWRlXTsKLSAgICAgICAgICAgIGN0eC0+aGRzcC5hZGRfaGZ5dV9tZWRpYW5fcHJlZChkc3QsIGRzdCAtIHN0cmlkZSwgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAmbGVmdCwgJmxlZnRfdG9wKTsKKyAgICAgICAgICAgIGN0eC0+bGx2aWRkc3AuYWRkX21lZGlhbl9wcmVkKGRzdCwgZHN0IC0gc3RyaWRlLCB2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgJmxlZnQsICZsZWZ0X3RvcCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkc3RbMF0gPSB2YWxbMF07CiAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgd2lkdGg7IGorKykKQEAgLTEyNSw2ICsxMjUsNyBAQAogICAgIGludCBvZmZzZXQgPSAwOwogICAgIGludCB3aWR0aF91diA9IGF2Y3R4LT53aWR0aCAvIDIsIGhlaWdodF91diA9IGF2Y3R4LT5oZWlnaHQgLyAyOwogICAgIGludCByZXQ7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OwogCiAgICAgaWYgKGF2cGt0LT5zaXplIDwgNCB8fCBhdnBrdC0+c2l6ZSAtIDQgPiBJTlRfTUFYLzgpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBhY2tldCBzaXplXG4iKTsKQEAgLTEzMiw3ICsxMzMsNyBAQAogICAgIH0KIAogICAgIC8qIEFsbG9jYXRlIGJ1ZmZlciAqLwotICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgcGljLCAwKSkgPCAwKQorICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIoYXZjdHgsICZmcmFtZSwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIC8qIFNldCBmbGFncyAqLwpAQCAtMTg0LDcgKzE4NSw3IEBACiAKICAgICAvKiBTdGFzaCBmb3IgbGF0ZXIgdXNlICovCiAgICAgY3R4LT5hdmN0eCA9IGF2Y3R4OwotICAgIGZmX2h1ZmZ5dXZkc3BfaW5pdCgmY3R4LT5oZHNwKTsKKyAgICBmZl9sbHZpZGRzcF9pbml0KCZjdHgtPmxsdmlkZHNwKTsKIAogICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOwogICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gODsKQEAgLTIxMiw1ICsyMTMsNyBAQAogICAgIC5pbml0ICAgICAgICAgICA9IHZibGVfZGVjb2RlX2luaXQsCiAgICAgLmNsb3NlICAgICAgICAgID0gdmJsZV9kZWNvZGVfY2xvc2UsCiAgICAgLmRlY29kZSAgICAgICAgID0gdmJsZV9kZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmluaXRfdGhyZWFkX2NvcHkgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh2YmxlX2RlY29kZV9pbml0KSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmMxLmMgYi9saWJhdmNvZGVjL3ZjMS5jCmluZGV4IDA4ZTFmMmMuLmU3NjI1MDcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmMxLmMKKysrIGIvbGliYXZjb2RlYy92YzEuYwpAQCAtMjQsNyArMjQsNiBAQAogLyoqCiAgKiBAZmlsZQogICogVkMtMSBhbmQgV01WMyBkZWNvZGVyIGNvbW1vbiBjb2RlCi0gKgogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgpAQCAtMzMsNyArMzIsNyBAQAogI2luY2x1ZGUgIm1wZWd2aWRlby5oIgogI2luY2x1ZGUgInZjMS5oIgogI2luY2x1ZGUgInZjMWRhdGEuaCIKLSNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgorI2luY2x1ZGUgIndtdjJkYXRhLmgiCiAjaW5jbHVkZSAidW5hcnkuaCIKICNpbmNsdWRlICJzaW1wbGVfaWRjdC5oIgogCkBAIC0zMTUsMTEgKzMxNCwxMSBAQAogICAgIHYtPm11bHRpcmVzICAgICAgICA9IGdldF9iaXRzMShnYik7CiAgICAgdi0+cmVzX2Zhc3R0eCAgICAgID0gZ2V0X2JpdHMxKGdiKTsKICAgICBpZiAoIXYtPnJlc19mYXN0dHgpIHsKLSAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4ICAgID0gZmZfc2ltcGxlX2lkY3RfODsKKyAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4ICAgID0gZmZfc2ltcGxlX2lkY3RfaW50MTZfOGJpdDsKICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg0ICAgID0gZmZfc2ltcGxlX2lkY3Q4NF9hZGQ7CiAgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzR4OCAgICA9IGZmX3NpbXBsZV9pZGN0NDhfYWRkOwogICAgICAgICB2LT52YzFkc3AudmMxX2ludl90cmFuc180eDQgICAgPSBmZl9zaW1wbGVfaWRjdDQ0X2FkZDsKLSAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfOHg4X2RjID0gZmZfc2ltcGxlX2lkY3RfYWRkXzg7CisgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzh4OF9kYyA9IGZmX3NpbXBsZV9pZGN0X2FkZF9pbnQxNl84Yml0OwogICAgICAgICB2LT52YzFkc3AudmMxX2ludl90cmFuc184eDRfZGMgPSBmZl9zaW1wbGVfaWRjdDg0X2FkZDsKICAgICAgICAgdi0+dmMxZHNwLnZjMV9pbnZfdHJhbnNfNHg4X2RjID0gZmZfc2ltcGxlX2lkY3Q0OF9hZGQ7CiAgICAgICAgIHYtPnZjMWRzcC52YzFfaW52X3RyYW5zXzR4NF9kYyA9IGZmX3NpbXBsZV9pZGN0NDRfYWRkOwpAQCAtMzkyLDcgKzM5MSw3IEBACiAgICAgICAgICAgICJQcm9maWxlICVpOlxuZnJtcnRxX3Bvc3Rwcm9jPSVpLCBiaXRydHFfcG9zdHByb2M9JWlcbiIKICAgICAgICAgICAgIkxvb3BGaWx0ZXI9JWksIE11bHRpUmVzPSVpLCBGYXN0VVZNQz0laSwgRXh0ZW5kZWQgTVY9JWlcbiIKICAgICAgICAgICAgIlJhbmdlcmVkPSVpLCBWU1RyYW5zZm9ybT0laSwgT3ZlcmxhcD0laSwgU3luY01hcmtlcj0laVxuIgotICAgICAgICAgICAiRFF1YW50PSVpLCBRdWFudGl6ZXIgbW9kZT0laSwgTWF4IEIgZnJhbWVzPSVpXG4iLAorICAgICAgICAgICAiRFF1YW50PSVpLCBRdWFudGl6ZXIgbW9kZT0laSwgTWF4IEItZnJhbWVzPSVpXG4iLAogICAgICAgICAgICB2LT5wcm9maWxlLCB2LT5mcm1ydHFfcG9zdHByb2MsIHYtPmJpdHJ0cV9wb3N0cHJvYywKICAgICAgICAgICAgdi0+cy5sb29wX2ZpbHRlciwgdi0+bXVsdGlyZXMsIHYtPmZhc3R1dm1jLCB2LT5leHRlbmRlZF9tdiwKICAgICAgICAgICAgdi0+cmFuZ2VyZWQsIHYtPnZzdHJhbnNmb3JtLCB2LT5vdmVybGFwLCB2LT5yZXN5bmNfbWFya2VyLApAQCAtNjMwLDcgKzYyOSw3IEBACiAgICAgaW50IHBxaW5kZXgsIGxvd3F1YW50LCBzdGF0dXM7CiAKICAgICB2LT5maWVsZF9tb2RlID0gMDsKLSAgICB2LT5mY20gPSAwOworICAgIHYtPmZjbSA9IFBST0dSRVNTSVZFOwogICAgIGlmICh2LT5maW50ZXJwZmxhZykKICAgICAgICAgdi0+aW50ZXJwZnJtID0gZ2V0X2JpdHMxKGdiKTsKICAgICBpZiAoIXYtPnMuYXZjdHgtPmNvZGVjKQpAQCAtNzY1LDkgKzc2NCwxMCBAQAogICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTUIgU2tpcCBwbGFuZSBlbmNvZGluZzogIgogICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CiAKLSAgICAgICAgLyogSG9wZWZ1bGx5IHRoaXMgaXMgY29ycmVjdCBmb3IgUCBmcmFtZXMgKi8KKyAgICAgICAgLyogSG9wZWZ1bGx5IHRoaXMgaXMgY29ycmVjdCBmb3IgUC1mcmFtZXMgKi8KICAgICAgICAgdi0+cy5tdl90YWJsZV9pbmRleCA9IGdldF9iaXRzKGdiLCAyKTsgLy9idXQgdXNpbmcgZmZfdmMxXyB0YWJsZXMKLSAgICAgICAgdi0+Y2JwY3lfdmxjID0gJmZmX3ZjMV9jYnBjeV9wX3ZsY1tnZXRfYml0cyhnYiwgMildOworICAgICAgICB2LT5jYnB0YWIgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgIHYtPmNicGN5X3ZsYyA9ICZmZl92YzFfY2JwY3lfcF92bGNbdi0+Y2JwdGFiXTsKIAogICAgICAgICBpZiAodi0+ZHF1YW50KSB7CiAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVk9QIERRdWFudCBpbmZvXG4iKTsKQEAgLTgwNSw3ICs4MDUsOCBAQAogICAgICAgICAgICAgICAgIkltb2RlOiAlaSwgSW52ZXJ0OiAlaVxuIiwgc3RhdHVzPj4xLCBzdGF0dXMmMSk7CiAKICAgICAgICAgdi0+cy5tdl90YWJsZV9pbmRleCA9IGdldF9iaXRzKGdiLCAyKTsKLSAgICAgICAgdi0+Y2JwY3lfdmxjICAgICAgICA9ICZmZl92YzFfY2JwY3lfcF92bGNbZ2V0X2JpdHMoZ2IsIDIpXTsKKyAgICAgICAgdi0+Y2JwdGFiICAgICAgICAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgdi0+Y2JwY3lfdmxjICAgICAgICA9ICZmZl92YzFfY2JwY3lfcF92bGNbdi0+Y2JwdGFiXTsKIAogICAgICAgICBpZiAodi0+ZHF1YW50KSB7CiAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiVk9QIERRdWFudCBpbmZvXG4iKTsKQEAgLTg0Niw3ICs4NDcsNiBAQAogewogICAgIGludCBwcWluZGV4LCBsb3dxdWFudDsKICAgICBpbnQgc3RhdHVzOwotICAgIGludCBtYm1vZGV0YWIsIGltdnRhYiwgaWNicHRhYiwgdHdvbXZicHRhYiwgZm91cm12YnB0YWI7IC8qIHVzZWZ1bCBvbmx5IGZvciBkZWJ1Z2dpbmcgKi8KICAgICBpbnQgZmllbGRfbW9kZSwgZmNtOwogCiAgICAgdi0+bnVtcmVmICAgICAgICAgID0gMDsKQEAgLTEwNTcsMjEgKzEwNTcsMjEgQEAKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBiaXRwbGFuZV9kZWNvZGluZyh2LT5zLm1ic2tpcF90YWJsZSwgJnYtPnNraXBfaXNfcmF3LCB2KTsKICAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiU0tJUE1CIHBsYW5lIGVuY29kaW5nOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICJJbW9kZTogJWksIEludmVydDogJWlcbiIsIHN0YXR1cz4+MSwgc3RhdHVzJjEpOwotICAgICAgICAgICAgICAgIG1ibW9kZXRhYiA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgICAgICB2LT5tYm1vZGV0YWIgPSBnZXRfYml0cyhnYiwgMik7CiAgICAgICAgICAgICAgICAgaWYgKHYtPmZvdXJtdnN3aXRjaCkKLSAgICAgICAgICAgICAgICAgICAgdi0+bWJtb2RlX3ZsYyA9ICZmZl92YzFfaW50ZnJfNG12X21ibW9kZV92bGNbbWJtb2RldGFiXTsKKyAgICAgICAgICAgICAgICAgICAgdi0+bWJtb2RlX3ZsYyA9ICZmZl92YzFfaW50ZnJfNG12X21ibW9kZV92bGNbdi0+bWJtb2RldGFiXTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHYtPm1ibW9kZV92bGMgPSAmZmZfdmMxX2ludGZyX25vbjRtdl9tYm1vZGVfdmxjW21ibW9kZXRhYl07Ci0gICAgICAgICAgICAgICAgaW12dGFiICAgICAgICAgPSBnZXRfYml0cyhnYiwgMik7Ci0gICAgICAgICAgICAgICAgdi0+aW12X3ZsYyAgICAgPSAmZmZfdmMxXzFyZWZfbXZkYXRhX3ZsY1tpbXZ0YWJdOworICAgICAgICAgICAgICAgICAgICB2LT5tYm1vZGVfdmxjID0gJmZmX3ZjMV9pbnRmcl9ub240bXZfbWJtb2RlX3ZsY1t2LT5tYm1vZGV0YWJdOworICAgICAgICAgICAgICAgIHYtPmltdnRhYiAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgICAgIHYtPmltdl92bGMgICAgID0gJmZmX3ZjMV8xcmVmX212ZGF0YV92bGNbdi0+aW12dGFiXTsKICAgICAgICAgICAgICAgICAvLyBpbnRlcmxhY2VkIHAtcGljdHVyZSBjYnBjeSByYW5nZSBpcyBbMSwgNjNdCi0gICAgICAgICAgICAgICAgaWNicHRhYiAgICAgICAgPSBnZXRfYml0cyhnYiwgMyk7Ci0gICAgICAgICAgICAgICAgdi0+Y2JwY3lfdmxjICAgPSAmZmZfdmMxX2ljYnBjeV92bGNbaWNicHRhYl07Ci0gICAgICAgICAgICAgICAgdHdvbXZicHRhYiAgICAgPSBnZXRfYml0cyhnYiwgMik7Ci0gICAgICAgICAgICAgICAgdi0+dHdvbXZicF92bGMgPSAmZmZfdmMxXzJtdl9ibG9ja19wYXR0ZXJuX3ZsY1t0d29tdmJwdGFiXTsKKyAgICAgICAgICAgICAgICB2LT5pY2JwdGFiICAgICA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgICAgICB2LT5jYnBjeV92bGMgICA9ICZmZl92YzFfaWNicGN5X3ZsY1t2LT5pY2JwdGFiXTsKKyAgICAgICAgICAgICAgICB2LT50d29tdmJwdGFiICAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgICAgICB2LT50d29tdmJwX3ZsYyA9ICZmZl92YzFfMm12X2Jsb2NrX3BhdHRlcm5fdmxjW3YtPnR3b212YnB0YWJdOwogICAgICAgICAgICAgICAgIGlmICh2LT5mb3VybXZzd2l0Y2gpIHsKLSAgICAgICAgICAgICAgICAgICAgZm91cm12YnB0YWIgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOwotICAgICAgICAgICAgICAgICAgICB2LT5mb3VybXZicF92bGMgPSAmZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX3ZsY1tmb3VybXZicHRhYl07CisgICAgICAgICAgICAgICAgICAgIHYtPmZvdXJtdmJwdGFiICAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgdi0+Zm91cm12YnBfdmxjID0gJmZmX3ZjMV80bXZfYmxvY2tfcGF0dGVybl92bGNbdi0+Zm91cm12YnB0YWJdOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTE1MywyOSArMTE1MywzMCBAQAogICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIk1CIFNraXAgcGxhbmUgZW5jb2Rpbmc6ICIKICAgICAgICAgICAgICAgICAgICAiSW1vZGU6ICVpLCBJbnZlcnQ6ICVpXG4iLCBzdGF0dXM+PjEsIHN0YXR1cyYxKTsKIAotICAgICAgICAgICAgLyogSG9wZWZ1bGx5IHRoaXMgaXMgY29ycmVjdCBmb3IgUCBmcmFtZXMgKi8KKyAgICAgICAgICAgIC8qIEhvcGVmdWxseSB0aGlzIGlzIGNvcnJlY3QgZm9yIFAtZnJhbWVzICovCiAgICAgICAgICAgICB2LT5zLm12X3RhYmxlX2luZGV4ID0gZ2V0X2JpdHMoZ2IsIDIpOyAvL2J1dCB1c2luZyBmZl92YzFfIHRhYmxlcwotICAgICAgICAgICAgdi0+Y2JwY3lfdmxjICAgICAgICA9ICZmZl92YzFfY2JwY3lfcF92bGNbZ2V0X2JpdHMoZ2IsIDIpXTsKKyAgICAgICAgICAgIHYtPmNicHRhYiAgICAgICAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2LT5jYnBjeV92bGMgICAgICAgID0gJmZmX3ZjMV9jYnBjeV9wX3ZsY1t2LT5jYnB0YWJdOwogICAgICAgICB9IGVsc2UgaWYgKHYtPmZjbSA9PSBJTEFDRV9GUkFNRSkgeyAvLyBmcmFtZSBpbnRlcmxhY2VkCiAgICAgICAgICAgICB2LT5xc19sYXN0ICAgICAgICAgID0gdi0+cy5xdWFydGVyX3NhbXBsZTsKICAgICAgICAgICAgIHYtPnMucXVhcnRlcl9zYW1wbGUgPSAxOwogICAgICAgICAgICAgdi0+cy5tc3BlbCAgICAgICAgICA9IDE7CiAgICAgICAgIH0gZWxzZSB7ICAgIC8vIGZpZWxkIGludGVybGFjZWQKLSAgICAgICAgICAgIG1ibW9kZXRhYiA9IGdldF9iaXRzKGdiLCAzKTsKLSAgICAgICAgICAgIGltdnRhYiA9IGdldF9iaXRzKGdiLCAyICsgdi0+bnVtcmVmKTsKKyAgICAgICAgICAgIHYtPm1ibW9kZXRhYiA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIHYtPmltdnRhYiA9IGdldF9iaXRzKGdiLCAyICsgdi0+bnVtcmVmKTsKICAgICAgICAgICAgIGlmICghdi0+bnVtcmVmKQotICAgICAgICAgICAgICAgIHYtPmltdl92bGMgPSAmZmZfdmMxXzFyZWZfbXZkYXRhX3ZsY1tpbXZ0YWJdOworICAgICAgICAgICAgICAgIHYtPmltdl92bGMgPSAmZmZfdmMxXzFyZWZfbXZkYXRhX3ZsY1t2LT5pbXZ0YWJdOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHYtPmltdl92bGMgPSAmZmZfdmMxXzJyZWZfbXZkYXRhX3ZsY1tpbXZ0YWJdOwotICAgICAgICAgICAgaWNicHRhYiA9IGdldF9iaXRzKGdiLCAzKTsKLSAgICAgICAgICAgIHYtPmNicGN5X3ZsYyA9ICZmZl92YzFfaWNicGN5X3ZsY1tpY2JwdGFiXTsKKyAgICAgICAgICAgICAgICB2LT5pbXZfdmxjID0gJmZmX3ZjMV8ycmVmX212ZGF0YV92bGNbdi0+aW12dGFiXTsKKyAgICAgICAgICAgIHYtPmljYnB0YWIgPSBnZXRfYml0cyhnYiwgMyk7CisgICAgICAgICAgICB2LT5jYnBjeV92bGMgPSAmZmZfdmMxX2ljYnBjeV92bGNbdi0+aWNicHRhYl07CiAgICAgICAgICAgICBpZiAoKHYtPm12X21vZGUgPT0gTVZfUE1PREVfSU5URU5TSVRZX0NPTVAgJiYKICAgICAgICAgICAgICAgICB2LT5tdl9tb2RlMiA9PSBNVl9QTU9ERV9NSVhFRF9NVikgfHwgdi0+bXZfbW9kZSA9PSBNVl9QTU9ERV9NSVhFRF9NVikgewotICAgICAgICAgICAgICAgIGZvdXJtdmJwdGFiICAgICA9IGdldF9iaXRzKGdiLCAyKTsKLSAgICAgICAgICAgICAgICB2LT5mb3VybXZicF92bGMgPSAmZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX3ZsY1tmb3VybXZicHRhYl07Ci0gICAgICAgICAgICAgICAgdi0+bWJtb2RlX3ZsYyA9ICZmZl92YzFfaWZfbW12X21ibW9kZV92bGNbbWJtb2RldGFiXTsKKyAgICAgICAgICAgICAgICB2LT5mb3VybXZicHRhYiAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICAgICAgdi0+Zm91cm12YnBfdmxjID0gJmZmX3ZjMV80bXZfYmxvY2tfcGF0dGVybl92bGNbdi0+Zm91cm12YnB0YWJdOworICAgICAgICAgICAgICAgIHYtPm1ibW9kZV92bGMgPSAmZmZfdmMxX2lmX21tdl9tYm1vZGVfdmxjW3YtPm1ibW9kZXRhYl07CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHYtPm1ibW9kZV92bGMgPSAmZmZfdmMxX2lmXzFtdl9tYm1vZGVfdmxjW21ibW9kZXRhYl07CisgICAgICAgICAgICAgICAgdi0+bWJtb2RlX3ZsYyA9ICZmZl92YzFfaWZfMW12X21ibW9kZV92bGNbdi0+bWJtb2RldGFiXTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAodi0+ZHF1YW50KSB7CkBAIC0xMjI5LDE4ICsxMjMwLDE4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIk1CIEZvcndhcmQgVHlwZSBwbGFuZSBlbmNvZGluZzogIgogICAgICAgICAgICAgICAgICAgICJJbW9kZTogJWksIEludmVydDogJWlcbiIsIHN0YXR1cz4+MSwgc3RhdHVzJjEpOwotICAgICAgICAgICAgbWJtb2RldGFiID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgdi0+bWJtb2RldGFiID0gZ2V0X2JpdHMoZ2IsIDMpOwogICAgICAgICAgICAgaWYgKHYtPm12X21vZGUgPT0gTVZfUE1PREVfTUlYRURfTVYpCi0gICAgICAgICAgICAgICAgdi0+bWJtb2RlX3ZsYyA9ICZmZl92YzFfaWZfbW12X21ibW9kZV92bGNbbWJtb2RldGFiXTsKKyAgICAgICAgICAgICAgICB2LT5tYm1vZGVfdmxjID0gJmZmX3ZjMV9pZl9tbXZfbWJtb2RlX3ZsY1t2LT5tYm1vZGV0YWJdOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHYtPm1ibW9kZV92bGMgPSAmZmZfdmMxX2lmXzFtdl9tYm1vZGVfdmxjW21ibW9kZXRhYl07Ci0gICAgICAgICAgICBpbXZ0YWIgICAgICAgPSBnZXRfYml0cyhnYiwgMyk7Ci0gICAgICAgICAgICB2LT5pbXZfdmxjICAgPSAmZmZfdmMxXzJyZWZfbXZkYXRhX3ZsY1tpbXZ0YWJdOwotICAgICAgICAgICAgaWNicHRhYiAgICAgID0gZ2V0X2JpdHMoZ2IsIDMpOwotICAgICAgICAgICAgdi0+Y2JwY3lfdmxjID0gJmZmX3ZjMV9pY2JwY3lfdmxjW2ljYnB0YWJdOworICAgICAgICAgICAgICAgIHYtPm1ibW9kZV92bGMgPSAmZmZfdmMxX2lmXzFtdl9tYm1vZGVfdmxjW3YtPm1ibW9kZXRhYl07CisgICAgICAgICAgICB2LT5pbXZ0YWIgICAgID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgdi0+aW12X3ZsYyAgID0gJmZmX3ZjMV8ycmVmX212ZGF0YV92bGNbdi0+aW12dGFiXTsKKyAgICAgICAgICAgIHYtPmljYnB0YWIgICA9IGdldF9iaXRzKGdiLCAzKTsKKyAgICAgICAgICAgIHYtPmNicGN5X3ZsYyA9ICZmZl92YzFfaWNicGN5X3ZsY1t2LT5pY2JwdGFiXTsKICAgICAgICAgICAgIGlmICh2LT5tdl9tb2RlID09IE1WX1BNT0RFX01JWEVEX01WKSB7Ci0gICAgICAgICAgICAgICAgZm91cm12YnB0YWIgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOwotICAgICAgICAgICAgICAgIHYtPmZvdXJtdmJwX3ZsYyA9ICZmZl92YzFfNG12X2Jsb2NrX3BhdHRlcm5fdmxjW2ZvdXJtdmJwdGFiXTsKKyAgICAgICAgICAgICAgICB2LT5mb3VybXZicHRhYiAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICAgICAgdi0+Zm91cm12YnBfdmxjID0gJmZmX3ZjMV80bXZfYmxvY2tfcGF0dGVybl92bGNbdi0+Zm91cm12YnB0YWJdOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdi0+bnVtcmVmID0gMTsgLy8gaW50ZXJsYWNlZCBmaWVsZCBCIHBpY3R1cmVzIGFyZSBhbHdheXMgMi1yZWYKICAgICAgICAgfSBlbHNlIGlmICh2LT5mY20gPT0gSUxBQ0VfRlJBTUUpIHsKQEAgLTEyNjQsMTcgKzEyNjUsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0RFQlVHLCAiTUIgU2tpcCBwbGFuZSBlbmNvZGluZzogIgogICAgICAgICAgICAgICAgICAgICJJbW9kZTogJWksIEludmVydDogJWlcbiIsIHN0YXR1cz4+MSwgc3RhdHVzJjEpOwotICAgICAgICAgICAgbWJtb2RldGFiICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOwotICAgICAgICAgICAgdi0+bWJtb2RlX3ZsYyAgID0gJmZmX3ZjMV9pbnRmcl9ub240bXZfbWJtb2RlX3ZsY1ttYm1vZGV0YWJdOwotICAgICAgICAgICAgaW12dGFiICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOwotICAgICAgICAgICAgdi0+aW12X3ZsYyAgICAgID0gJmZmX3ZjMV8xcmVmX212ZGF0YV92bGNbaW12dGFiXTsKKyAgICAgICAgICAgIHYtPm1ibW9kZXRhYiAgICAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIHYtPm1ibW9kZV92bGMgICA9ICZmZl92YzFfaW50ZnJfbm9uNG12X21ibW9kZV92bGNbdi0+bWJtb2RldGFiXTsKKyAgICAgICAgICAgIHYtPmltdnRhYiAgICAgICA9IGdldF9iaXRzKGdiLCAyKTsKKyAgICAgICAgICAgIHYtPmltdl92bGMgICAgICA9ICZmZl92YzFfMXJlZl9tdmRhdGFfdmxjW3YtPmltdnRhYl07CiAgICAgICAgICAgICAvLyBpbnRlcmxhY2VkIHAvYi1waWN0dXJlIGNicGN5IHJhbmdlIGlzIFsxLCA2M10KLSAgICAgICAgICAgIGljYnB0YWIgICAgICAgICA9IGdldF9iaXRzKGdiLCAzKTsKLSAgICAgICAgICAgIHYtPmNicGN5X3ZsYyAgICA9ICZmZl92YzFfaWNicGN5X3ZsY1tpY2JwdGFiXTsKLSAgICAgICAgICAgIHR3b212YnB0YWIgICAgICA9IGdldF9iaXRzKGdiLCAyKTsKLSAgICAgICAgICAgIHYtPnR3b212YnBfdmxjICA9ICZmZl92YzFfMm12X2Jsb2NrX3BhdHRlcm5fdmxjW3R3b212YnB0YWJdOwotICAgICAgICAgICAgZm91cm12YnB0YWIgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOwotICAgICAgICAgICAgdi0+Zm91cm12YnBfdmxjID0gJmZmX3ZjMV80bXZfYmxvY2tfcGF0dGVybl92bGNbZm91cm12YnB0YWJdOworICAgICAgICAgICAgdi0+aWNicHRhYiAgICAgID0gZ2V0X2JpdHMoZ2IsIDMpOworICAgICAgICAgICAgdi0+Y2JwY3lfdmxjICAgID0gJmZmX3ZjMV9pY2JwY3lfdmxjW3YtPmljYnB0YWJdOworICAgICAgICAgICAgdi0+dHdvbXZicHRhYiAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOworICAgICAgICAgICAgdi0+dHdvbXZicF92bGMgID0gJmZmX3ZjMV8ybXZfYmxvY2tfcGF0dGVybl92bGNbdi0+dHdvbXZicHRhYl07CisgICAgICAgICAgICB2LT5mb3VybXZicHRhYiAgICAgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2LT5mb3VybXZicF92bGMgPSAmZmZfdmMxXzRtdl9ibG9ja19wYXR0ZXJuX3ZsY1t2LT5mb3VybXZicHRhYl07CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB2LT5tdl9tb2RlICAgICAgICAgID0gZ2V0X2JpdHMxKGdiKSA/IE1WX1BNT0RFXzFNViA6IE1WX1BNT0RFXzFNVl9IUEVMX0JJTElOOwogICAgICAgICAgICAgdi0+cXNfbGFzdCAgICAgICAgICA9IHYtPnMucXVhcnRlcl9zYW1wbGU7CkBAIC0xMjkxLDcgKzEyOTIsOCBAQAogICAgICAgICAgICAgYXZfbG9nKHYtPnMuYXZjdHgsIEFWX0xPR19ERUJVRywgIk1CIFNraXAgcGxhbmUgZW5jb2Rpbmc6ICIKICAgICAgICAgICAgICAgICAgICAiSW1vZGU6ICVpLCBJbnZlcnQ6ICVpXG4iLCBzdGF0dXM+PjEsIHN0YXR1cyYxKTsKICAgICAgICAgICAgIHYtPnMubXZfdGFibGVfaW5kZXggPSBnZXRfYml0cyhnYiwgMik7Ci0gICAgICAgICAgICB2LT5jYnBjeV92bGMgPSAmZmZfdmMxX2NicGN5X3BfdmxjW2dldF9iaXRzKGdiLCAyKV07CisgICAgICAgICAgICB2LT5jYnB0YWIgPSBnZXRfYml0cyhnYiwgMik7CisgICAgICAgICAgICB2LT5jYnBjeV92bGMgPSAmZmZfdmMxX2NicGN5X3BfdmxjW3YtPmNicHRhYl07CiAgICAgICAgIH0KIAogICAgICAgICBpZiAodi0+ZHF1YW50KSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZjMS5oIGIvbGliYXZjb2RlYy92YzEuaAppbmRleCBlZWZiNjEzLi44ZmMwNzI5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZjMS5oCisrKyBiL2xpYmF2Y29kZWMvdmMxLmgKQEAgLTczLDcgKzczLDcgQEAKIH07CiAvL0B9CiAKLS8qKiBNViBtb2RlcyBmb3IgUCBmcmFtZXMgKi8KKy8qKiBNViBtb2RlcyBmb3IgUC1mcmFtZXMgKi8KIC8vQHsKIGVudW0gTVZNb2RlcyB7CiAgICAgTVZfUE1PREVfMU1WX0hQRUxfQklMSU4sCkBAIC05Niw3ICs5Niw3IEBACiB9OwogLy9AfQogCi0vKiogQG5hbWUgTVYgdHlwZXMgZm9yIEIgZnJhbWVzICovCisvKiogQG5hbWUgTVYgdHlwZXMgZm9yIEItZnJhbWVzICovCiAvL0B7CiBlbnVtIEJNVlR5cGVzIHsKICAgICBCTVZfVFlQRV9CQUNLV0FSRCwKQEAgLTEwNiw3ICsxMDYsNyBAQAogfTsKIC8vQH0KIAotLyoqIEBuYW1lIEJsb2NrIHR5cGVzIGZvciBQL0IgZnJhbWVzICovCisvKiogQG5hbWUgQmxvY2sgdHlwZXMgZm9yIFAvQi1mcmFtZXMgKi8KIC8vQHsKIGVudW0gVHJhbnNmb3JtVHlwZXMgewogICAgIFRUXzhYOCwKQEAgLTE5NCwxOCArMTk0LDE4IEBACiAKICAgICAvKiogQWR2YW5jZWQgUHJvZmlsZSAqLwogICAgIC8vQHsKLSAgICBpbnQgbGV2ZWw7ICAgICAgICAgICAgLy8vPCAzYml0cywgZm9yIEFkdmFuY2VkL1NpbXBsZSBQcm9maWxlLCBwcm92aWRlZCBieSBUUyBsYXllcgotICAgIGludCBjaHJvbWFmb3JtYXQ7ICAgICAvLy88IDJiaXRzLCAyPTQ6MjowLCBvbmx5IGRlZmluZWQKKyAgICBpbnQgbGV2ZWw7ICAgICAgICAgICAgLy8vPCAzIGJpdHMsIGZvciBBZHZhbmNlZC9TaW1wbGUgUHJvZmlsZSwgcHJvdmlkZWQgYnkgVFMgbGF5ZXIKKyAgICBpbnQgY2hyb21hZm9ybWF0OyAgICAgLy8vPCAyIGJpdHMsIDI9NDoyOjAsIG9ubHkgZGVmaW5lZAogICAgIGludCBwb3N0cHJvY2ZsYWc7ICAgICAvLy88IFBlci1mcmFtZSBwcm9jZXNzaW5nIHN1Z2dlc3Rpb24gZmxhZyBwcmVzZW50CiAgICAgaW50IGJyb2FkY2FzdDsgICAgICAgIC8vLzwgVEZGL1JGRiBwcmVzZW50CiAgICAgaW50IGludGVybGFjZTsgICAgICAgIC8vLzwgUHJvZ3Jlc3NpdmUvaW50ZXJsYWNlZCAoUlBURlRNIHN5bnRheCBlbGVtZW50KQogICAgIGludCB0ZmNudHJmbGFnOyAgICAgICAvLy88IFRGQ05UUiBwcmVzZW50CiAgICAgaW50IHBhbnNjYW5mbGFnOyAgICAgIC8vLzwgTlVNUEFOU0NBTldJTiwgVE9QTEVGVHtYLFl9LCBCT1RSSUdIVHtYLFl9IHByZXNlbnQKICAgICBpbnQgcmVmZGlzdF9mbGFnOyAgICAgLy8vPCBSRUZESVNUIHN5bnRheCBlbGVtZW50IHByZXNlbnQgaW4gSUksIElQLCBQSSBvciBQUCBmaWVsZCBwaWN0dXJlIGhlYWRlcnMKLSAgICBpbnQgZXh0ZW5kZWRfZG12OyAgICAgLy8vPCBBZGRpdGlvbmFsIGV4dGVuZGVkIGRtdiByYW5nZSBhdCBQL0IgZnJhbWUtbGV2ZWwKLSAgICBpbnQgY29sb3JfcHJpbTsgICAgICAgLy8vPCA4Yml0cywgY2hyb21hIGNvb3JkaW5hdGVzIG9mIHRoZSBjb2xvciBwcmltYXJpZXMKLSAgICBpbnQgdHJhbnNmZXJfY2hhcjsgICAgLy8vPCA4Yml0cywgT3B0by1lbGVjdHJvbmljIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcwotICAgIGludCBtYXRyaXhfY29lZjsgICAgICAvLy88IDhiaXRzLCBDb2xvciBwcmltYXJpZXMtPllDYkNyIHRyYW5zZm9ybSBtYXRyaXgKKyAgICBpbnQgZXh0ZW5kZWRfZG12OyAgICAgLy8vPCBBZGRpdGlvbmFsIGV4dGVuZGVkIGRtdiByYW5nZSBhdCBQL0ItZnJhbWUtbGV2ZWwKKyAgICBpbnQgY29sb3JfcHJpbTsgICAgICAgLy8vPCA4IGJpdHMsIGNocm9tYSBjb29yZGluYXRlcyBvZiB0aGUgY29sb3IgcHJpbWFyaWVzCisgICAgaW50IHRyYW5zZmVyX2NoYXI7ICAgIC8vLzwgOCBiaXRzLCBPcHRvLWVsZWN0cm9uaWMgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWNzCisgICAgaW50IG1hdHJpeF9jb2VmOyAgICAgIC8vLzwgOCBiaXRzLCBDb2xvciBwcmltYXJpZXMtPllDYkNyIHRyYW5zZm9ybSBtYXRyaXgKICAgICBpbnQgaHJkX3BhcmFtX2ZsYWc7ICAgLy8vPCBQcmVzZW5jZSBvZiBIeXBvdGhldGljYWwgUmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRGVjb2RlciBwYXJhbWV0ZXJzCiAgICAgaW50IHBzZjsgICAgICAgICAgICAgIC8vLzwgUHJvZ3Jlc3NpdmUgU2VnbWVudGVkIEZyYW1lCkBAIC0yMTUsMjMgKzIxNSwyMyBAQAogICAgICAqIFRPRE86IGNob29zZSBiZXR3ZWVuIGludHMsIHVpbnQ4X3RzIGFuZCBtb25vYml0IGZsYWdzCiAgICAgICovCiAgICAgLy9AewotICAgIGludCBwcm9maWxlOyAgICAgICAgICAvLy88IDJiaXRzLCBQcm9maWxlCi0gICAgaW50IGZybXJ0cV9wb3N0cHJvYzsgIC8vLzwgM2JpdHMsCi0gICAgaW50IGJpdHJ0cV9wb3N0cHJvYzsgIC8vLzwgNWJpdHMsIHF1YW50aXplZCBmcmFtZXJhdGUtYmFzZWQgcG9zdHByb2Nlc3Npbmcgc3RyZW5ndGgKKyAgICBpbnQgcHJvZmlsZTsgICAgICAgICAgLy8vPCAyIGJpdHMsIFByb2ZpbGUKKyAgICBpbnQgZnJtcnRxX3Bvc3Rwcm9jOyAgLy8vPCAzIGJpdHMsCisgICAgaW50IGJpdHJ0cV9wb3N0cHJvYzsgIC8vLzwgNSBiaXRzLCBxdWFudGl6ZWQgZnJhbWVyYXRlLWJhc2VkIHBvc3Rwcm9jZXNzaW5nIHN0cmVuZ3RoCiAgICAgaW50IG1heF9jb2RlZF93aWR0aCwgbWF4X2NvZGVkX2hlaWdodDsKICAgICBpbnQgZmFzdHV2bWM7ICAgICAgICAgLy8vPCBSb3VuZGluZyBvZiBxcGVsIHZlY3RvciB0byBocGVsID8gKG5vdCBpbiBTaW1wbGUpCiAgICAgaW50IGV4dGVuZGVkX212OyAgICAgIC8vLzwgRXh0IE1WIGluIFAvQiAobm90IGluIFNpbXBsZSkKLSAgICBpbnQgZHF1YW50OyAgICAgICAgICAgLy8vPCBIb3cgcXNjYWxlIHZhcmllcyB3aXRoIE1CcywgMmJpdHMgKG5vdCBpbiBTaW1wbGUpCisgICAgaW50IGRxdWFudDsgICAgICAgICAgIC8vLzwgSG93IHFzY2FsZSB2YXJpZXMgd2l0aCBNQnMsIDIgYml0cyAobm90IGluIFNpbXBsZSkKICAgICBpbnQgdnN0cmFuc2Zvcm07ICAgICAgLy8vPCB2YXJpYWJsZS1zaXplIFs0OF14WzQ4XSB0cmFuc2Zvcm0gdHlwZSArIGluZm8KICAgICBpbnQgb3ZlcmxhcDsgICAgICAgICAgLy8vPCBvdmVybGFwcGVkIHRyYW5zZm9ybXMgaW4gdXNlCi0gICAgaW50IHF1YW50aXplcl9tb2RlOyAgIC8vLzwgMmJpdHMsIHF1YW50aXplciBtb2RlIHVzZWQgZm9yIHNlcXVlbmNlLCBzZWUgUVVBTlRfKgorICAgIGludCBxdWFudGl6ZXJfbW9kZTsgICAvLy88IDIgYml0cywgcXVhbnRpemVyIG1vZGUgdXNlZCBmb3Igc2VxdWVuY2UsIHNlZSBRVUFOVF8qCiAgICAgaW50IGZpbnRlcnBmbGFnOyAgICAgIC8vLzwgSU5URVJQRlJNIHByZXNlbnQKICAgICAvL0B9CiAKICAgICAvKiogRnJhbWUgZGVjb2RpbmcgaW5mbyBmb3IgYWxsIHByb2ZpbGVzICovCiAgICAgLy9AewotICAgIHVpbnQ4X3QgbXZfbW9kZTsgICAgICAgICAgICAgLy8vPCBNViBjb2RpbmcgbW9uZGUKLSAgICB1aW50OF90IG12X21vZGUyOyAgICAgICAgICAgIC8vLzwgU2Vjb25kYXJ5IE1WIGNvZGluZyBtb2RlIChCIGZyYW1lcykKKyAgICB1aW50OF90IG12X21vZGU7ICAgICAgICAgICAgIC8vLzwgTVYgY29kaW5nIG1vZGUKKyAgICB1aW50OF90IG12X21vZGUyOyAgICAgICAgICAgIC8vLzwgU2Vjb25kYXJ5IE1WIGNvZGluZyBtb2RlIChCLWZyYW1lcykKICAgICBpbnQga194OyAgICAgICAgICAgICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIGJpdHMgZm9yIE1WcyAoZGVwZW5kcyBvbiBNViByYW5nZSkKICAgICBpbnQga195OyAgICAgICAgICAgICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIGJpdHMgZm9yIE1WcyAoZGVwZW5kcyBvbiBNViByYW5nZSkKICAgICBpbnQgcmFuZ2VfeCwgcmFuZ2VfeTsgICAgICAgIC8vLzwgTVYgcmFuZ2UKQEAgLTI5Niw2ICsyOTYsNyBAQAogICAgIHVpbnQ4X3QgKCpjdXJyX2x1dHkpWzI1Nl0gICwoKmN1cnJfbHV0dXYpWzI1Nl07CiAgICAgaW50IGxhc3RfdXNlX2ljLCAqY3Vycl91c2VfaWMsIG5leHRfdXNlX2ljLCBhdXhfdXNlX2ljOwogICAgIGludCBybmQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCByb3VuZGluZyBjb250cm9sCisgICAgaW50IGNicHRhYjsKIAogICAgIC8qKiBGcmFtZSBkZWNvZGluZyBpbmZvIGZvciBTL00gcHJvZmlsZXMgb25seSAqLwogICAgIC8vQHsKQEAgLTM2Nyw2ICszNjgsMTEgQEAKICAgICBpbnQgZnJmZCwgYnJmZDsgICAgICAgICAvLy88IHJlZmVyZW5jZSBmcmFtZSBkaXN0YW5jZSAoZm9yd2FyZCBvciBiYWNrd2FyZCkKICAgICBpbnQgZmlyc3RfcGljX2hlYWRlcl9mbGFnOwogICAgIGludCBwaWNfaGVhZGVyX2ZsYWc7CisgICAgaW50IG1ibW9kZXRhYjsKKyAgICBpbnQgaWNicHRhYjsKKyAgICBpbnQgaW12dGFiOworICAgIGludCB0d29tdmJwdGFiOworICAgIGludCBmb3VybXZicHRhYjsKIAogICAgIC8qKiBGcmFtZSBkZWNvZGluZyBpbmZvIGZvciBzcHJpdGUgbW9kZXMgKi8KICAgICAvL0B7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZjMV9ibG9jay5jIGIvbGliYXZjb2RlYy92YzFfYmxvY2suYwppbmRleCAyNTViYTFkLi5iMDZlZTlmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZjMV9ibG9jay5jCisrKyBiL2xpYmF2Y29kZWMvdmMxX2Jsb2NrLmMKQEAgLTU5NCw3ICs1OTQsNyBAQAogICAgICAgICBzY2FsZSA9IHMtPmNfZGNfc2NhbGU7CiAgICAgYmxvY2tbMF0gPSBkY2RpZmYgKiBzY2FsZTsKIAotICAgIGFjX3ZhbCAgPSBzLT5hY192YWxbMF1bMF0gKyBzLT5ibG9ja19pbmRleFtuXSAqIDE2OworICAgIGFjX3ZhbCAgPSBzLT5hY192YWxbMF1bcy0+YmxvY2tfaW5kZXhbbl1dOwogICAgIGFjX3ZhbDIgPSBhY192YWw7CiAgICAgaWYgKGRjX3ByZWRfZGlyKSAvLyBsZWZ0CiAgICAgICAgIGFjX3ZhbCAtPSAxNjsKQEAgLTc0NSw3ICs3NDUsNyBAQAogCiAgICAgc2NhbGUgPSBtcXVhbnQgKiAyICsgKChtcXVhbnQgPT0gdi0+cHEpID8gdi0+aGFsZnBxIDogMCk7CiAKLSAgICBhY192YWwgID0gcy0+YWNfdmFsWzBdWzBdICsgcy0+YmxvY2tfaW5kZXhbbl0gKiAxNjsKKyAgICBhY192YWwgID0gcy0+YWNfdmFsWzBdW3MtPmJsb2NrX2luZGV4W25dXTsKICAgICBhY192YWwyID0gYWNfdmFsOwogICAgIGlmIChkY19wcmVkX2RpcikgLy8gbGVmdAogICAgICAgICBhY192YWwgLT0gMTY7CkBAIC05NDYsNyArOTQ2LDcgQEAKICAgICBpZiAoIWFfYXZhaWwpIGRjX3ByZWRfZGlyID0gMTsKICAgICBpZiAoIWNfYXZhaWwpIGRjX3ByZWRfZGlyID0gMDsKICAgICBpZiAoIWFfYXZhaWwgJiYgIWNfYXZhaWwpIHVzZV9wcmVkID0gMDsKLSAgICBhY192YWwgPSBzLT5hY192YWxbMF1bMF0gKyBzLT5ibG9ja19pbmRleFtuXSAqIDE2OworICAgIGFjX3ZhbCA9IHMtPmFjX3ZhbFswXVtzLT5ibG9ja19pbmRleFtuXV07CiAgICAgYWNfdmFsMiA9IGFjX3ZhbDsKIAogICAgIHNjYWxlID0gbXF1YW50ICogMiArIHYtPmhhbGZwcTsKQEAgLTI0OTIsNyArMjQ5Miw3IEBACiAgICAgdWludDhfdCAqY29kZWRfdmFsOwogICAgIGludCBtYl9wb3M7CiAKLSAgICAvKiBzZWxlY3QgY29kaW5nbW9kZSB1c2VkIGZvciBWTEMgdGFibGVzIHNlbGVjdGlvbiAqLworICAgIC8qIHNlbGVjdCBjb2RpbmcgbW9kZSB1c2VkIGZvciBWTEMgdGFibGVzIHNlbGVjdGlvbiAqLwogICAgIHN3aXRjaCAodi0+eV9hY190YWJsZV9pbmRleCkgewogICAgIGNhc2UgMDoKICAgICAgICAgdi0+Y29kaW5nc2V0ID0gKHYtPnBxaW5kZXggPD0gOCkgPyBDU19ISUdIX1JBVEVfSU5UUkEgOiBDU19MT1dfTU9UX0lOVFJBOwpAQCAtMjY0MCw3ICsyNjQwLDcgQEAKICAgICBpbnQgbXFkaWZmOwogICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOwogCi0gICAgLyogc2VsZWN0IGNvZGluZ21vZGUgdXNlZCBmb3IgVkxDIHRhYmxlcyBzZWxlY3Rpb24gKi8KKyAgICAvKiBzZWxlY3QgY29kaW5nIG1vZGUgdXNlZCBmb3IgVkxDIHRhYmxlcyBzZWxlY3Rpb24gKi8KICAgICBzd2l0Y2ggKHYtPnlfYWNfdGFibGVfaW5kZXgpIHsKICAgICBjYXNlIDA6CiAgICAgICAgIHYtPmNvZGluZ3NldCA9ICh2LT5wcWluZGV4IDw9IDgpID8gQ1NfSElHSF9SQVRFX0lOVFJBIDogQ1NfTE9XX01PVF9JTlRSQTsKQEAgLTI3NjgsNyArMjc2OCw3IEBACiAgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmdi0+czsKICAgICBpbnQgYXBwbHlfbG9vcF9maWx0ZXI7CiAKLSAgICAvKiBzZWxlY3QgY29kaW5nbW9kZSB1c2VkIGZvciBWTEMgdGFibGVzIHNlbGVjdGlvbiAqLworICAgIC8qIHNlbGVjdCBjb2RpbmcgbW9kZSB1c2VkIGZvciBWTEMgdGFibGVzIHNlbGVjdGlvbiAqLwogICAgIHN3aXRjaCAodi0+Y19hY190YWJsZV9pbmRleCkgewogICAgIGNhc2UgMDoKICAgICAgICAgdi0+Y29kaW5nc2V0ID0gKHYtPnBxaW5kZXggPD0gOCkgPyBDU19ISUdIX1JBVEVfSU5UUkEgOiBDU19MT1dfTU9UX0lOVFJBOwpAQCAtMjg0NCw3ICsyODQ0LDcgQEAKIHsKICAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOwogCi0gICAgLyogc2VsZWN0IGNvZGluZ21vZGUgdXNlZCBmb3IgVkxDIHRhYmxlcyBzZWxlY3Rpb24gKi8KKyAgICAvKiBzZWxlY3QgY29kaW5nIG1vZGUgdXNlZCBmb3IgVkxDIHRhYmxlcyBzZWxlY3Rpb24gKi8KICAgICBzd2l0Y2ggKHYtPmNfYWNfdGFibGVfaW5kZXgpIHsKICAgICBjYXNlIDA6CiAgICAgICAgIHYtPmNvZGluZ3NldCA9ICh2LT5wcWluZGV4IDw9IDgpID8gQ1NfSElHSF9SQVRFX0lOVFJBIDogQ1NfTE9XX01PVF9JTlRSQTsKQEAgLTI5MzEsNyArMjkzMSwxNCBAQAogCiAgICAgdi0+cy5lc2MzX2xldmVsX2xlbmd0aCA9IDA7CiAgICAgaWYgKHYtPng4X3R5cGUpIHsKLSAgICAgICAgZmZfaW50cmF4OF9kZWNvZGVfcGljdHVyZSgmdi0+eDgsIDIqdi0+cHEgKyB2LT5oYWxmcHEsIHYtPnBxICogIXYtPnBxdWFudGl6ZXIpOworICAgICAgICBmZl9pbnRyYXg4X2RlY29kZV9waWN0dXJlKCZ2LT54OCwgJnYtPnMuY3VycmVudF9waWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2LT5zLmdiLCAmdi0+cy5tYl94LCAmdi0+cy5tYl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiB2LT5wcSArIHYtPmhhbGZwcSwgdi0+cHEgKiAhdi0+cHF1YW50aXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LT5zLmxvb3BfZmlsdGVyLCB2LT5zLmxvd19kZWxheSk7CisKKyAgICAgICAgZmZfZXJfYWRkX3NsaWNlKCZ2LT5zLmVyLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgKHYtPnMubWJfeCA+PiAxKSAtIDEsICh2LT5zLm1iX3kgPj4gMSkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgRVJfTUJfRU5EKTsKICAgICB9IGVsc2UgewogICAgICAgICB2LT5jdXJfYmxrX2lkeCAgICAgPSAgMDsKICAgICAgICAgdi0+bGVmdF9ibGtfaWR4ICAgID0gLTE7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZjMV9tYy5jIGIvbGliYXZjb2RlYy92YzFfbWMuYwppbmRleCA0NDY3NjQ2Li43NWM3NGNhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZjMV9tYy5jCisrKyBiL2xpYmF2Y29kZWMvdmMxX21jLmMKQEAgLTE4OCw3ICsxODgsNyBAQAogICAgIG14ID0gcy0+bXZbZGlyXVswXVswXTsKICAgICBteSA9IHMtPm12W2Rpcl1bMF1bMV07CiAKLSAgICAvLyBzdG9yZSBtb3Rpb24gdmVjdG9ycyBmb3IgZnVydGhlciB1c2UgaW4gQiBmcmFtZXMKKyAgICAvLyBzdG9yZSBtb3Rpb24gdmVjdG9ycyBmb3IgZnVydGhlciB1c2UgaW4gQi1mcmFtZXMKICAgICBpZiAocy0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICAgICAgIHMtPmN1cnJlbnRfcGljdHVyZS5tb3Rpb25fdmFsWzFdW3MtPmJsb2NrX2luZGV4W2ldICsgdi0+YmxvY2tzX29mZl1bMF0gPSBteDsKQEAgLTg2Nyw3ICs4NjcsNyBAQAogCiAgICAgaWYgKENPTkZJR19HUkFZICYmIHMtPmF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR1JBWSkKICAgICAgICAgcmV0dXJuOwotICAgIC8qIENocm9tYSBNQyBhbHdheXMgdXNlcyBxcGVsIGJsaWxpbmVhciAqLworICAgIC8qIENocm9tYSBNQyBhbHdheXMgdXNlcyBxcGVsIGJpbGluZWFyICovCiAgICAgdXZteCA9ICh1dm14ICYgMykgPDwgMTsKICAgICB1dm15ID0gKHV2bXkgJiAzKSA8PCAxOwogICAgIGlmICghdi0+cm5kKSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZjMV9wYXJzZXIuYyBiL2xpYmF2Y29kZWMvdmMxX3BhcnNlci5jCmluZGV4IDljYTYxNTQuLmJiNTQ5NDcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmMxX3BhcnNlci5jCisrKyBiL2xpYmF2Y29kZWMvdmMxX3BhcnNlci5jCkBAIC0xMTUsNiArMTE1LDE0IEBACiAgICAgfQogICAgIGlmIChhdmN0eC0+ZnJhbWVyYXRlLm51bSkKICAgICAgICAgYXZjdHgtPnRpbWVfYmFzZSA9IGF2X2ludl9xKGF2X211bF9xKGF2Y3R4LT5mcmFtZXJhdGUsIChBVlJhdGlvbmFsKXthdmN0eC0+dGlja3NfcGVyX2ZyYW1lLCAxfSkpOworICAgIHMtPmZvcm1hdCA9IHZwYy0+di5jaHJvbWFmb3JtYXQgPT0gMSA/IEFWX1BJWF9GTVRfWVVWNDIwUAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX1BJWF9GTVRfTk9ORTsKKyAgICBpZiAoYXZjdHgtPndpZHRoICYmIGF2Y3R4LT5oZWlnaHQpIHsKKyAgICAgICAgcy0+d2lkdGggICAgICAgID0gYXZjdHgtPndpZHRoOworICAgICAgICBzLT5oZWlnaHQgICAgICAgPSBhdmN0eC0+aGVpZ2h0OworICAgICAgICBzLT5jb2RlZF93aWR0aCAgPSBGRkFMSUdOKGF2Y3R4LT5jb2RlZF93aWR0aCwgIDE2KTsKKyAgICAgICAgcy0+Y29kZWRfaGVpZ2h0ID0gRkZBTElHTihhdmN0eC0+Y29kZWRfaGVpZ2h0LCAxNik7CisgICAgfQogfQogCiBzdGF0aWMgaW50IHZjMV9wYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmMxX3ByZWQuYyBiL2xpYmF2Y29kZWMvdmMxX3ByZWQuYwppbmRleCAxMzEzNGU1Li41NDcxMmY2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZjMV9wcmVkLmMKKysrIGIvbGliYXZjb2RlYy92YzFfcHJlZC5jCkBAIC00NjgsNyArNDY4LDcgQEAKICAgICBpbnQgQVsyXSwgQlsyXSwgQ1syXTsKICAgICBpbnQgcHggPSAwLCBweSA9IDA7CiAgICAgaW50IGFfdmFsaWQgPSAwLCBiX3ZhbGlkID0gMCwgY192YWxpZCA9IDA7Ci0gICAgaW50IGZpZWxkX2EsIGZpZWxkX2IsIGZpZWxkX2M7IC8vIDA6IHNhbWUsIDE6IG9wcG9zaXQKKyAgICBpbnQgZmllbGRfYSwgZmllbGRfYiwgZmllbGRfYzsgLy8gMDogc2FtZSwgMTogb3Bwb3NpdGUKICAgICBpbnQgdG90YWxfdmFsaWQsIG51bV9zYW1lZmllbGQsIG51bV9vcHBmaWVsZDsKICAgICBpbnQgcG9zX2MsIHBvc19iLCBuX2FkajsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YzFkYXRhLmggYi9saWJhdmNvZGVjL3ZjMWRhdGEuaAppbmRleCA3NjNjZDQ4Li45MGRkOGJhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZjMWRhdGEuaAorKysgYi9saWJhdmNvZGVjL3ZjMWRhdGEuaApAQCAtMjksOCArMjksMTAgQEAKICNkZWZpbmUgQVZDT0RFQ19WQzFEQVRBX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL3JhdGlvbmFsLmgiCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworI2luY2x1ZGUgInZsYy5oIgogCiAvKiogVGFibGUgZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBUVEJMSyBhbmQgVFRNQiAqLwogZXh0ZXJuIGNvbnN0IGludCBmZl92YzFfdHRibGtfdG9fdHRbM11bOF07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZjMWRlYy5jIGIvbGliYXZjb2RlYy92YzFkZWMuYwppbmRleCBmNjZhZmI5Li5jYmVmODlmIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZjMWRlYy5jCisrKyBiL2xpYmF2Y29kZWMvdmMxZGVjLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiYmxvY2tkc3AuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImh3YWNjZWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1wZWdfZXIuaCIKICNpbmNsdWRlICJtcGVndmlkZW8uaCIKQEAgLTM3LDcgKzM4LDYgQEAKICNpbmNsdWRlICJwcm9maWxlcy5oIgogI2luY2x1ZGUgInZjMS5oIgogI2luY2x1ZGUgInZjMWRhdGEuaCIKLSNpbmNsdWRlICJ2ZHBhdV9jb21wYXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKIAogCkBAIC0zMjQsNyArMzI0LDcgQEAKIGF2X2NvbGQgaW50IGZmX3ZjMV9kZWNvZGVfaW5pdF9hbGxvY190YWJsZXMoVkMxQ29udGV4dCAqdikKIHsKICAgICBNcGVnRW5jQ29udGV4dCAqcyA9ICZ2LT5zOwotICAgIGludCBpOworICAgIGludCBpLCByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgaW50IG1iX2hlaWdodCA9IEZGQUxJR04ocy0+bWJfaGVpZ2h0LCAyKTsKIAogICAgIC8qIEFsbG9jYXRlIG1iIGJpdHBsYW5lcyAqLwpAQCAtMzM0LDY3ICszMzQsNzAgQEAKICAgICB2LT5maWVsZHR4X3BsYW5lICAgID0gYXZfbWFsbG9jeihzLT5tYl9zdHJpZGUgKiBtYl9oZWlnaHQpOwogICAgIHYtPmFjcHJlZF9wbGFuZSAgICAgPSBhdl9tYWxsb2MgKHMtPm1iX3N0cmlkZSAqIG1iX2hlaWdodCk7CiAgICAgdi0+b3Zlcl9mbGFnc19wbGFuZSA9IGF2X21hbGxvYyAocy0+bWJfc3RyaWRlICogbWJfaGVpZ2h0KTsKKyAgICBpZiAoIXYtPm12X3R5cGVfbWJfcGxhbmUgfHwgIXYtPmRpcmVjdF9tYl9wbGFuZSB8fCAhdi0+Zm9yd2FyZF9tYl9wbGFuZSB8fAorICAgICAgICAhdi0+ZmllbGR0eF9wbGFuZSB8fCAhdi0+YWNwcmVkX3BsYW5lIHx8ICF2LT5vdmVyX2ZsYWdzX3BsYW5lKQorICAgICAgICBnb3RvIGVycm9yOwogCiAgICAgdi0+bl9hbGxvY2F0ZWRfYmxrcyA9IHMtPm1iX3dpZHRoICsgMjsKICAgICB2LT5ibG9jayAgICAgICAgICAgID0gYXZfbWFsbG9jKHNpemVvZigqdi0+YmxvY2spICogdi0+bl9hbGxvY2F0ZWRfYmxrcyk7CiAgICAgdi0+Y2JwX2Jhc2UgICAgICAgICA9IGF2X21hbGxvYyhzaXplb2Yodi0+Y2JwX2Jhc2VbMF0pICogMiAqIHMtPm1iX3N0cmlkZSk7CisgICAgaWYgKCF2LT5ibG9jayB8fCAhdi0+Y2JwX2Jhc2UpCisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgdi0+Y2JwICAgICAgICAgICAgICA9IHYtPmNicF9iYXNlICsgcy0+bWJfc3RyaWRlOwogICAgIHYtPnR0YmxrX2Jhc2UgICAgICAgPSBhdl9tYWxsb2Moc2l6ZW9mKHYtPnR0YmxrX2Jhc2VbMF0pICogMiAqIHMtPm1iX3N0cmlkZSk7CisgICAgaWYgKCF2LT50dGJsa19iYXNlKQorICAgICAgICBnb3RvIGVycm9yOwogICAgIHYtPnR0YmxrICAgICAgICAgICAgPSB2LT50dGJsa19iYXNlICsgcy0+bWJfc3RyaWRlOwogICAgIHYtPmlzX2ludHJhX2Jhc2UgICAgPSBhdl9tYWxsb2N6KHNpemVvZih2LT5pc19pbnRyYV9iYXNlWzBdKSAqIDIgKiBzLT5tYl9zdHJpZGUpOworICAgIGlmICghdi0+aXNfaW50cmFfYmFzZSkKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB2LT5pc19pbnRyYSAgICAgICAgID0gdi0+aXNfaW50cmFfYmFzZSArIHMtPm1iX3N0cmlkZTsKICAgICB2LT5sdW1hX212X2Jhc2UgICAgID0gYXZfbWFsbG9jeihzaXplb2Yodi0+bHVtYV9tdl9iYXNlWzBdKSAqIDIgKiBzLT5tYl9zdHJpZGUpOworICAgIGlmICghdi0+bHVtYV9tdl9iYXNlKQorICAgICAgICBnb3RvIGVycm9yOwogICAgIHYtPmx1bWFfbXYgICAgICAgICAgPSB2LT5sdW1hX212X2Jhc2UgKyBzLT5tYl9zdHJpZGU7CiAKICAgICAvKiBhbGxvY2F0ZSBibG9jayB0eXBlIGluZm8gaW4gdGhhdCB3YXkgc28gaXQgY291bGQgYmUgdXNlZCB3aXRoIHMtPmJsb2NrX2luZGV4W10gKi8KICAgICB2LT5tYl90eXBlX2Jhc2UgPSBhdl9tYWxsb2Mocy0+Yjhfc3RyaWRlICogKG1iX2hlaWdodCAqIDIgKyAxKSArIHMtPm1iX3N0cmlkZSAqIChtYl9oZWlnaHQgKyAxKSAqIDIpOworICAgIGlmICghdi0+bWJfdHlwZV9iYXNlKQorICAgICAgICBnb3RvIGVycm9yOwogICAgIHYtPm1iX3R5cGVbMF0gICA9IHYtPm1iX3R5cGVfYmFzZSArIHMtPmI4X3N0cmlkZSArIDE7CiAgICAgdi0+bWJfdHlwZVsxXSAgID0gdi0+bWJfdHlwZV9iYXNlICsgcy0+Yjhfc3RyaWRlICogKG1iX2hlaWdodCAqIDIgKyAxKSArIHMtPm1iX3N0cmlkZSArIDE7CiAgICAgdi0+bWJfdHlwZVsyXSAgID0gdi0+bWJfdHlwZVsxXSArIHMtPm1iX3N0cmlkZSAqIChtYl9oZWlnaHQgKyAxKTsKIAogICAgIC8qIGFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSBibG9jayBsZXZlbCBNViBpbmZvICovCiAgICAgdi0+YmxrX212X3R5cGVfYmFzZSA9IGF2X21hbGxvY3ooICAgICBzLT5iOF9zdHJpZGUgKiAobWJfaGVpZ2h0ICogMiArIDEpICsgcy0+bWJfc3RyaWRlICogKG1iX2hlaWdodCArIDEpICogMik7CisgICAgaWYgKCF2LT5ibGtfbXZfdHlwZV9iYXNlKQorICAgICAgICBnb3RvIGVycm9yOwogICAgIHYtPmJsa19tdl90eXBlICAgICAgPSB2LT5ibGtfbXZfdHlwZV9iYXNlICsgcy0+Yjhfc3RyaWRlICsgMTsKICAgICB2LT5tdl9mX2Jhc2UgICAgICAgID0gYXZfbWFsbG9jeigyICogKHMtPmI4X3N0cmlkZSAqIChtYl9oZWlnaHQgKiAyICsgMSkgKyBzLT5tYl9zdHJpZGUgKiAobWJfaGVpZ2h0ICsgMSkgKiAyKSk7CisgICAgaWYgKCF2LT5tdl9mX2Jhc2UpCisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgdi0+bXZfZlswXSAgICAgICAgICA9IHYtPm12X2ZfYmFzZSArIHMtPmI4X3N0cmlkZSArIDE7CiAgICAgdi0+bXZfZlsxXSAgICAgICAgICA9IHYtPm12X2ZbMF0gKyAocy0+Yjhfc3RyaWRlICogKG1iX2hlaWdodCAqIDIgKyAxKSArIHMtPm1iX3N0cmlkZSAqIChtYl9oZWlnaHQgKyAxKSAqIDIpOwogICAgIHYtPm12X2ZfbmV4dF9iYXNlICAgPSBhdl9tYWxsb2N6KDIgKiAocy0+Yjhfc3RyaWRlICogKG1iX2hlaWdodCAqIDIgKyAxKSArIHMtPm1iX3N0cmlkZSAqIChtYl9oZWlnaHQgKyAxKSAqIDIpKTsKKyAgICBpZiAoIXYtPm12X2ZfbmV4dF9iYXNlKQorICAgICAgICBnb3RvIGVycm9yOwogICAgIHYtPm12X2ZfbmV4dFswXSAgICAgPSB2LT5tdl9mX25leHRfYmFzZSArIHMtPmI4X3N0cmlkZSArIDE7CiAgICAgdi0+bXZfZl9uZXh0WzFdICAgICA9IHYtPm12X2ZfbmV4dFswXSArIChzLT5iOF9zdHJpZGUgKiAobWJfaGVpZ2h0ICogMiArIDEpICsgcy0+bWJfc3RyaWRlICogKG1iX2hlaWdodCArIDEpICogMik7CiAKLSAgICAvKiBJbml0IGNvZGVkIGJsb2NrcyBpbmZvICovCi0gICAgaWYgKHYtPnByb2ZpbGUgPT0gUFJPRklMRV9BRFZBTkNFRCkgewotLy8gICAgICAgIGlmIChhbGxvY19iaXRwbGFuZSgmdi0+b3Zlcl9mbGFnc19wbGFuZSwgcy0+bWJfd2lkdGgsIHMtPm1iX2hlaWdodCkgPCAwKQotLy8gICAgICAgICAgICByZXR1cm4gLTE7Ci0vLyAgICAgICAgaWYgKGFsbG9jX2JpdHBsYW5lKCZ2LT5hY19wcmVkX3BsYW5lLCBzLT5tYl93aWR0aCwgcy0+bWJfaGVpZ2h0KSA8IDApCi0vLyAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBmZl9pbnRyYXg4X2NvbW1vbl9pbml0KCZ2LT54OCxzKTsKLQogICAgIGlmIChzLT5hdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01WM0lNQUdFIHx8IHMtPmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzFJTUFHRSkgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogICAgICAgICAgICAgaWYgKCEodi0+c3Jfcm93c1tpID4+IDFdW2kgJiAxXSA9IGF2X21hbGxvYyh2LT5vdXRwdXRfd2lkdGgpKSkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KIAotICAgIGlmICghdi0+bXZfdHlwZV9tYl9wbGFuZSB8fCAhdi0+ZGlyZWN0X21iX3BsYW5lIHx8ICF2LT5hY3ByZWRfcGxhbmUgfHwgIXYtPm92ZXJfZmxhZ3NfcGxhbmUgfHwKLSAgICAgICAgIXYtPmJsb2NrIHx8ICF2LT5jYnBfYmFzZSB8fCAhdi0+dHRibGtfYmFzZSB8fCAhdi0+aXNfaW50cmFfYmFzZSB8fCAhdi0+bHVtYV9tdl9iYXNlIHx8Ci0gICAgICAgICF2LT5tYl90eXBlX2Jhc2UpIHsKLSAgICAgICAgYXZfZnJlZXAoJnYtPm12X3R5cGVfbWJfcGxhbmUpOwotICAgICAgICBhdl9mcmVlcCgmdi0+ZGlyZWN0X21iX3BsYW5lKTsKLSAgICAgICAgYXZfZnJlZXAoJnYtPmFjcHJlZF9wbGFuZSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZ2LT5vdmVyX2ZsYWdzX3BsYW5lKTsKLSAgICAgICAgYXZfZnJlZXAoJnYtPmJsb2NrKTsKLSAgICAgICAgYXZfZnJlZXAoJnYtPmNicF9iYXNlKTsKLSAgICAgICAgYXZfZnJlZXAoJnYtPnR0YmxrX2Jhc2UpOwotICAgICAgICBhdl9mcmVlcCgmdi0+aXNfaW50cmFfYmFzZSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZ2LT5sdW1hX212X2Jhc2UpOwotICAgICAgICBhdl9mcmVlcCgmdi0+bWJfdHlwZV9iYXNlKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9CisgICAgcmV0ID0gZmZfaW50cmF4OF9jb21tb25faW5pdChzLT5hdmN0eCwgJnYtPng4LCAmcy0+aWRzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrLCBzLT5ibG9ja19sYXN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWJfd2lkdGgsIHMtPm1iX2hlaWdodCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZXJyb3I7CiAKICAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgZmZfdmMxX2RlY29kZV9lbmQocy0+YXZjdHgpOworICAgIHJldHVybiByZXQ7CiB9CiAKIGF2X2NvbGQgdm9pZCBmZl92YzFfaW5pdF90cmFuc3Bvc2VkX3NjYW50YWJsZXMoVkMxQ29udGV4dCAqdikKQEAgLTQxNCw3ICs0MTcsNyBAQAogCiAvKiogSW5pdGlhbGl6ZSBhIFZDMS9XTVYzIGRlY29kZXIKICAqIEB0b2RvIFRPRE86IEhhbmRsZSBWQy0xIElEVXMgKFRyYW5zcG9ydCBsZXZlbD8pCi0gKiBAdG9kbyBUT0RPOiBEZWN5cGhlciByZW1haW5pbmcgYml0cyBpbiBleHRyYV9kYXRhCisgKiBAdG9kbyBUT0RPOiBEZWNpcGhlciByZW1haW5pbmcgYml0cyBpbiBleHRyYV9kYXRhCiAgKi8KIHN0YXRpYyBhdl9jb2xkIGludCB2YzFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewpAQCAtNjMxLDYgKzYzNCw4IEBACiAgICAgICAgIHVpbnQ4X3QgKmJ1ZjsKICAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKICAgICAgICAgaW50IG1ieV9zdGFydDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcmF3YnVmOworICAgICAgICBpbnQgcmF3X3NpemU7CiAgICAgfSAqc2xpY2VzID0gTlVMTCwgKnRtcDsKIAogICAgIHYtPnNlY29uZF9maWVsZCA9IDA7CkBAIC02NTIsMTUgKzY1Nyw2IEBACiAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKICAgICB9CiAKLSNpZiBGRl9BUElfQ0FQX1ZEUEFVCi0gICAgaWYgKHMtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzJkFWX0NPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVKSB7Ci0gICAgICAgIGlmICh2LT5wcm9maWxlIDwgUFJPRklMRV9BRFZBTkNFRCkKLSAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9WRFBBVV9XTVYzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfVkRQQVVfVkMxOwotICAgIH0KLSNlbmRpZgotCiAgICAgLy9mb3IgYWR2YW5jZWQgcHJvZmlsZSB3ZSBtYXkgbmVlZCB0byBwYXJzZSBhbmQgdW5lc2NhcGUgZGF0YQogICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxIHx8IGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzFJTUFHRSkgewogICAgICAgICBpbnQgYnVmX3NpemUyID0gMDsKQEAgLTY3OSwyMSArNjc1LDEzIEBACiAgICAgICAgICAgICAgICAgaWYgKHNpemUgPD0gMCkgY29udGludWU7CiAgICAgICAgICAgICAgICAgc3dpdGNoIChBVl9SQjMyKHN0YXJ0KSkgewogICAgICAgICAgICAgICAgIGNhc2UgVkMxX0NPREVfRlJBTUU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbAotI2lmIEZGX0FQSV9DQVBfVkRQQVUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IHMtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzJkFWX0NPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsKQogICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3N0YXJ0ID0gc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplMiA9IHZjMV91bmVzY2FwZV9idWZmZXIoc3RhcnQgKyA0LCBzaXplLCBidWYyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBWQzFfQ09ERV9GSUVMRDogewogICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUzOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwKLSNpZiBGRl9BUElfQ0FQX1ZEUEFVCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBzLT5hdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyZBVl9DT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+aHdhY2NlbCkKICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQgPSBzdGFydDsKICAgICAgICAgICAgICAgICAgICAgdG1wID0gYXZfcmVhbGxvY19hcnJheShzbGljZXMsIHNpemVvZigqc2xpY2VzKSwgKG5fc2xpY2VzKzEpKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCF0bXApIHsKQEAgLTcxMyw2ICs3MDEsOCBAQAogICAgICAgICAgICAgICAgICAgICAvKiBhc3N1bWluZyB0aGF0IHRoZSBmaWVsZCBtYXJrZXIgaXMgYXQgdGhlIGV4YWN0IG1pZGRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgaG9wZSBpdCdzIGNvcnJlY3QgKi8KICAgICAgICAgICAgICAgICAgICAgc2xpY2VzW25fc2xpY2VzXS5tYnlfc3RhcnQgPSBzLT5tYl9oZWlnaHQgKyAxID4+IDE7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlc1tuX3NsaWNlc10ucmF3YnVmID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgIHNsaWNlc1tuX3NsaWNlc10ucmF3X3NpemUgPSBzaXplICsgNDsKICAgICAgICAgICAgICAgICAgICAgbl9zbGljZXMxID0gbl9zbGljZXMgLSAxOyAvLyBpbmRleCBvZiB0aGUgbGFzdCBzbGljZSBvZiB0aGUgZmlyc3QgZmllbGQKICAgICAgICAgICAgICAgICAgICAgbl9zbGljZXMrKzsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC03NDAsNiArNzMwLDggQEAKICAgICAgICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmc2xpY2VzW25fc2xpY2VzXS5nYiwgc2xpY2VzW25fc2xpY2VzXS5idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUzIDw8IDMpOwogICAgICAgICAgICAgICAgICAgICBzbGljZXNbbl9zbGljZXNdLm1ieV9zdGFydCA9IGdldF9iaXRzKCZzbGljZXNbbl9zbGljZXNdLmdiLCA5KTsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2VzW25fc2xpY2VzXS5yYXdidWYgPSBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgc2xpY2VzW25fc2xpY2VzXS5yYXdfc2l6ZSA9IHNpemUgKyA0OwogICAgICAgICAgICAgICAgICAgICBuX3NsaWNlcysrOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC03NTUsMTEgKzc0Nyw3IEBACiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGZvdW5kIGZpZWxkIG1hcmtlciwgdW5lc2NhcGUgc2Vjb25kIGZpZWxkCi0gICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsCi0jaWYgRkZfQVBJX0NBUF9WRFBBVQotICAgICAgICAgICAgICAgICAgICB8fCBzLT5hdmN0eC0+Y29kZWMtPmNhcGFiaWxpdGllcyZBVl9DT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPmh3YWNjZWwpCiAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQgPSBkaXZpZGVyOwogICAgICAgICAgICAgICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoc2xpY2VzLCBzaXplb2YoKnNsaWNlcyksIChuX3NsaWNlcysxKSk7CiAgICAgICAgICAgICAgICAgaWYgKCF0bXApIHsKQEAgLTc3Niw2ICs3NjQsOCBAQAogICAgICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnNsaWNlc1tuX3NsaWNlc10uZ2IsIHNsaWNlc1tuX3NsaWNlc10uYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3NpemUzIDw8IDMpOwogICAgICAgICAgICAgICAgIHNsaWNlc1tuX3NsaWNlc10ubWJ5X3N0YXJ0ID0gcy0+bWJfaGVpZ2h0ICsgMSA+PiAxOworICAgICAgICAgICAgICAgIHNsaWNlc1tuX3NsaWNlc10ucmF3YnVmID0gZGl2aWRlcjsKKyAgICAgICAgICAgICAgICBzbGljZXNbbl9zbGljZXNdLnJhd19zaXplID0gYnVmICsgYnVmX3NpemUgLSBkaXZpZGVyOwogICAgICAgICAgICAgICAgIG5fc2xpY2VzMSA9IG5fc2xpY2VzIC0gMTsKICAgICAgICAgICAgICAgICBuX3NsaWNlcysrOwogICAgICAgICAgICAgfQpAQCAtOTA2LDE4ICs4OTYsOCBAQAogICAgIHMtPm1lLnFwZWxfcHV0ID0gcy0+cWRzcC5wdXRfcXBlbF9waXhlbHNfdGFiOwogICAgIHMtPm1lLnFwZWxfYXZnID0gcy0+cWRzcC5hdmdfcXBlbF9waXhlbHNfdGFiOwogCi0jaWYgRkZfQVBJX0NBUF9WRFBBVQotICAgIGlmICgoQ09ORklHX1ZDMV9WRFBBVV9ERUNPREVSKQotICAgICAgICAmJnMtPmF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzJkFWX0NPREVDX0NBUF9IV0FDQ0VMX1ZEUEFVKSB7Ci0gICAgICAgIGlmICh2LT5maWVsZF9tb2RlICYmIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQpIHsKLSAgICAgICAgICAgIGZmX3ZkcGF1X3ZjMV9kZWNvZGVfcGljdHVyZShzLCBidWZfc3RhcnQsIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQgLSBidWZfc3RhcnQpOwotICAgICAgICAgICAgZmZfdmRwYXVfdmMxX2RlY29kZV9waWN0dXJlKHMsIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQsIChidWYgKyBidWZfc2l6ZSkgLSBidWZfc3RhcnRfc2Vjb25kX2ZpZWxkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZmX3ZkcGF1X3ZjMV9kZWNvZGVfcGljdHVyZShzLCBidWZfc3RhcnQsIChidWYgKyBidWZfc2l6ZSkgLSBidWZfc3RhcnQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlCi0jZW5kaWYKICAgICBpZiAoYXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgcy0+bWJfeSA9IDA7CiAgICAgICAgIGlmICh2LT5maWVsZF9tb2RlICYmIGJ1Zl9zdGFydF9zZWNvbmRfZmllbGQpIHsKICAgICAgICAgICAgIC8vIGRlY29kZSBmaXJzdCBmaWVsZAogICAgICAgICAgICAgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBQSUNUX0JPVFRPTV9GSUVMRCAtIHYtPnRmZjsKQEAgLTk1MCw4ICs5MzAsMzYgQEAKICAgICAgICAgICAgIHMtPnBpY3R1cmVfc3RydWN0dXJlID0gUElDVF9GUkFNRTsKICAgICAgICAgICAgIGlmICgocmV0ID0gYXZjdHgtPmh3YWNjZWwtPnN0YXJ0X2ZyYW1lKGF2Y3R4LCBidWZfc3RhcnQsIChidWYgKyBidWZfc2l6ZSkgLSBidWZfc3RhcnQpKSA8IDApCiAgICAgICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoYXZjdHgsIGJ1Zl9zdGFydCwgKGJ1ZiArIGJ1Zl9zaXplKSAtIGJ1Zl9zdGFydCkpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycjsKKworICAgICAgICAgICAgaWYgKG5fc2xpY2VzID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBubyBzbGljZXMsIGRlY29kZSB0aGUgZnJhbWUgYXMtaXMKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoYXZjdHgsIGJ1Zl9zdGFydCwgKGJ1ZiArIGJ1Zl9zaXplKSAtIGJ1Zl9zdGFydCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRlY29kZSB0aGUgZnJhbWUgcGFydCBhcyB0aGUgZmlyc3Qgc2xpY2UKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoYXZjdHgsIGJ1Zl9zdGFydCwgc2xpY2VzWzBdLnJhd2J1ZiAtIGJ1Zl9zdGFydCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisKKyAgICAgICAgICAgICAgICAvLyBhbmQgcHJvY2VzcyB0aGUgc2xpY2VzIGFzIGFkZGl0aW9uYWwgc2xpY2VzIGFmdGVyd2FyZHMKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwIDsgaSA8IG5fc2xpY2VzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+Z2IgPSBzbGljZXNbaV0uZ2I7CisgICAgICAgICAgICAgICAgICAgIHMtPm1iX3kgPSBzbGljZXNbaV0ubWJ5X3N0YXJ0OworCisgICAgICAgICAgICAgICAgICAgIHYtPnBpY19oZWFkZXJfZmxhZyA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgICAgICAgICAgICAgICAgICBpZiAodi0+cGljX2hlYWRlcl9mbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmZfdmMxX3BhcnNlX2ZyYW1lX2hlYWRlcl9hZHYodiwgJnMtPmdiKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2codi0+cy5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiU2xpY2UgaGVhZGVyIGRhbWFnZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5lcnJfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZjdHgtPmh3YWNjZWwtPmRlY29kZV9zbGljZShhdmN0eCwgc2xpY2VzW2ldLnJhd2J1Ziwgc2xpY2VzW2ldLnJhd19zaXplKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKChyZXQgPSBhdmN0eC0+aHdhY2NlbC0+ZW5kX2ZyYW1lKGF2Y3R4KSkgPCAwKQogICAgICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICB9CkBAIC0xMTEwLDYgKzExMTgsMTAgQEAKICNlbmRpZgogI2lmIENPTkZJR19WQzFfRDNEMTFWQV9IV0FDQ0VMCiAgICAgQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCwKKyAgICBBVl9QSVhfRk1UX0QzRDExLAorI2VuZGlmCisjaWYgQ09ORklHX1ZDMV9OVkRFQ19IV0FDQ0VMCisgICAgQVZfUElYX0ZNVF9DVURBLAogI2VuZGlmCiAjaWYgQ09ORklHX1ZDMV9WQUFQSV9IV0FDQ0VMCiAgICAgQVZfUElYX0ZNVF9WQUFQSSwKQEAgLTExMzMsNiArMTE0NSwyNyBAQAogICAgIC5mbHVzaCAgICAgICAgICA9IGZmX21wZWdfZmx1c2gsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9ERUxBWSwKICAgICAucGl4X2ZtdHMgICAgICAgPSB2YzFfaHdhY2NlbF9waXhmbXRfbGlzdF80MjAsCisgICAgLmh3X2NvbmZpZ3MgICAgID0gKGNvbnN0IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsKltdKSB7CisjaWYgQ09ORklHX1ZDMV9EWFZBMl9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX0RYVkEyKHZjMSksCisjZW5kaWYKKyNpZiBDT05GSUdfVkMxX0QzRDExVkFfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9EM0QxMVZBKHZjMSksCisjZW5kaWYKKyNpZiBDT05GSUdfVkMxX0QzRDExVkEyX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfRDNEMTFWQTIodmMxKSwKKyNlbmRpZgorI2lmIENPTkZJR19WQzFfTlZERUNfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9OVkRFQyh2YzEpLAorI2VuZGlmCisjaWYgQ09ORklHX1ZDMV9WQUFQSV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZBQVBJKHZjMSksCisjZW5kaWYKKyNpZiBDT05GSUdfVkMxX1ZEUEFVX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfVkRQQVUodmMxKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICB9LAogICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX3ZjMV9wcm9maWxlcykKIH07CiAKQEAgLTExNDksMzggKzExODIsMjcgQEAKICAgICAuZmx1c2ggICAgICAgICAgPSBmZl9tcGVnX2ZsdXNoLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfREVMQVksCiAgICAgLnBpeF9mbXRzICAgICAgID0gdmMxX2h3YWNjZWxfcGl4Zm10X2xpc3RfNDIwLAotICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX3ZjMV9wcm9maWxlcykKLX07CisgICAgLmh3X2NvbmZpZ3MgICAgID0gKGNvbnN0IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsKltdKSB7CisjaWYgQ09ORklHX1dNVjNfRFhWQTJfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9EWFZBMih3bXYzKSwKICNlbmRpZgotCi0jaWYgQ09ORklHX1dNVjNfVkRQQVVfREVDT0RFUiAmJiBGRl9BUElfVkRQQVUKLUFWQ29kZWMgZmZfd212M192ZHBhdV9kZWNvZGVyID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJ3bXYzX3ZkcGF1IiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2luZG93cyBNZWRpYSBWaWRlbyA5IFZEUEFVIiksCi0gICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjMsCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZDMUNvbnRleHQpLAotICAgIC5pbml0ICAgICAgICAgICA9IHZjMV9kZWNvZGVfaW5pdCwKLSAgICAuY2xvc2UgICAgICAgICAgPSBmZl92YzFfZGVjb2RlX2VuZCwKLSAgICAuZGVjb2RlICAgICAgICAgPSB2YzFfZGVjb2RlX2ZyYW1lLAotICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfREVMQVkgfCBBVl9DT0RFQ19DQVBfSFdBQ0NFTF9WRFBBVSwKLSAgICAucGl4X2ZtdHMgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX1ZEUEFVX1dNVjMsIEFWX1BJWF9GTVRfTk9ORSB9LAotICAgIC5wcm9maWxlcyAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX3ZjMV9wcm9maWxlcykKLX07CisjaWYgQ09ORklHX1dNVjNfRDNEMTFWQV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX0QzRDExVkEod212MyksCiAjZW5kaWYKLQotI2lmIENPTkZJR19WQzFfVkRQQVVfREVDT0RFUiAmJiBGRl9BUElfVkRQQVUKLUFWQ29kZWMgZmZfdmMxX3ZkcGF1X2RlY29kZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gInZjMV92ZHBhdSIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNNUFRFIFZDLTEgVkRQQVUiKSwKLSAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfVkMxLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWQzFDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICAgPSB2YzFfZGVjb2RlX2luaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gZmZfdmMxX2RlY29kZV9lbmQsCi0gICAgLmRlY29kZSAgICAgICAgID0gdmMxX2RlY29kZV9mcmFtZSwKLSAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0hXQUNDRUxfVkRQQVUsCi0gICAgLnBpeF9mbXRzICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9WRFBBVV9WQzEsIEFWX1BJWF9GTVRfTk9ORSB9LAorI2lmIENPTkZJR19XTVYzX0QzRDExVkEyX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfRDNEMTFWQTIod212MyksCisjZW5kaWYKKyNpZiBDT05GSUdfV01WM19OVkRFQ19IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX05WREVDKHdtdjMpLAorI2VuZGlmCisjaWYgQ09ORklHX1dNVjNfVkFBUElfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9WQUFQSSh3bXYzKSwKKyNlbmRpZgorI2lmIENPTkZJR19XTVYzX1ZEUEFVX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfVkRQQVUod212MyksCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICAgICAgICAgfSwKICAgICAucHJvZmlsZXMgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTChmZl92YzFfcHJvZmlsZXMpCiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZjMWRzcC5jIGIvbGliYXZjb2RlYy92YzFkc3AuYwppbmRleCBhMTZjOGQ1Li45MjM5YTRhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZjMWRzcC5jCisrKyBiL2xpYmF2Y29kZWMvdmMxZHNwLmMKQEAgLTIyLDcgKzIyLDYgQEAKIC8qKgogICogQGZpbGUKICAqIFZDLTEgYW5kIFdNVjMgZGVjb2RlcgotICoKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCkBAIC0yMzksNyArMjM4LDcgQEAKIH0KIAogLyogRG8gaW52ZXJzZSB0cmFuc2Zvcm0gb24gOHg4IGJsb2NrICovCi1zdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4OF9kY19jKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4OF9kY19jKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogICAgIGludCBkYyA9IGJsb2NrWzBdOwpAQCAtMjU2LDcgKzI1NSw3IEBACiAgICAgICAgIGRlc3RbNV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNV0gKyBkYyk7CiAgICAgICAgIGRlc3RbNl0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNl0gKyBkYyk7CiAgICAgICAgIGRlc3RbN10gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbN10gKyBkYyk7Ci0gICAgICAgIGRlc3QgKz0gbGluZXNpemU7CisgICAgICAgIGRlc3QgKz0gc3RyaWRlOwogICAgIH0KIH0KIApAQCAtMzMwLDcgKzMyOSw3IEBACiB9CiAKIC8qIERvIGludmVyc2UgdHJhbnNmb3JtIG9uIDh4NCBwYXJ0IG9mIGJsb2NrICovCi1zdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4NF9kY19jKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4NF9kY19jKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogICAgIGludCBkYyA9IGJsb2NrWzBdOwpAQCAtMzQ3LDExICszNDYsMTEgQEAKICAgICAgICAgZGVzdFs1XSA9IGF2X2NsaXBfdWludDgoZGVzdFs1XSArIGRjKTsKICAgICAgICAgZGVzdFs2XSA9IGF2X2NsaXBfdWludDgoZGVzdFs2XSArIGRjKTsKICAgICAgICAgZGVzdFs3XSA9IGF2X2NsaXBfdWludDgoZGVzdFs3XSArIGRjKTsKLSAgICAgICAgZGVzdCArPSBsaW5lc2l6ZTsKKyAgICAgICAgZGVzdCArPSBzdHJpZGU7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4NF9jKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzh4NF9jKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogICAgIHJlZ2lzdGVyIGludCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDg7CkBAIC0zOTYsMTAgKzM5NSwxMCBAQAogICAgICAgICB0MyA9IDIyICogc3JjWyA4XSArIDEwICogc3JjWzI0XTsKICAgICAgICAgdDQgPSAyMiAqIHNyY1syNF0gLSAxMCAqIHNyY1sgOF07CiAKLSAgICAgICAgZGVzdFswICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzAgKiBsaW5lc2l6ZV0gKyAoKHQxICsgdDMpID4+IDcpKTsKLSAgICAgICAgZGVzdFsxICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzEgKiBsaW5lc2l6ZV0gKyAoKHQyIC0gdDQpID4+IDcpKTsKLSAgICAgICAgZGVzdFsyICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzIgKiBsaW5lc2l6ZV0gKyAoKHQyICsgdDQpID4+IDcpKTsKLSAgICAgICAgZGVzdFszICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzMgKiBsaW5lc2l6ZV0gKyAoKHQxIC0gdDMpID4+IDcpKTsKKyAgICAgICAgZGVzdFswICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZGVzdFswICogc3RyaWRlXSArICgodDEgKyB0MykgPj4gNykpOworICAgICAgICBkZXN0WzEgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzEgKiBzdHJpZGVdICsgKCh0MiAtIHQ0KSA+PiA3KSk7CisgICAgICAgIGRlc3RbMiAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMiAqIHN0cmlkZV0gKyAoKHQyICsgdDQpID4+IDcpKTsKKyAgICAgICAgZGVzdFszICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZGVzdFszICogc3RyaWRlXSArICgodDEgLSB0MykgPj4gNykpOwogCiAgICAgICAgIHNyYysrOwogICAgICAgICBkZXN0Kys7CkBAIC00MDcsNyArNDA2LDcgQEAKIH0KIAogLyogRG8gaW52ZXJzZSB0cmFuc2Zvcm0gb24gNHg4IHBhcnRzIG9mIGJsb2NrICovCi1zdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzR4OF9kY19jKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzR4OF9kY19jKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogICAgIGludCBkYyA9IGJsb2NrWzBdOwpAQCAtNDIwLDExICs0MTksMTEgQEAKICAgICAgICAgZGVzdFsxXSA9IGF2X2NsaXBfdWludDgoZGVzdFsxXSArIGRjKTsKICAgICAgICAgZGVzdFsyXSA9IGF2X2NsaXBfdWludDgoZGVzdFsyXSArIGRjKTsKICAgICAgICAgZGVzdFszXSA9IGF2X2NsaXBfdWludDgoZGVzdFszXSArIGRjKTsKLSAgICAgICAgZGVzdCArPSBsaW5lc2l6ZTsKKyAgICAgICAgZGVzdCArPSBzdHJpZGU7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzR4OF9jKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCB2YzFfaW52X3RyYW5zXzR4OF9jKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogICAgIHJlZ2lzdGVyIGludCB0MSwgdDIsIHQzLCB0NCwgdDUsIHQ2LCB0NywgdDg7CkBAIC00NjUsMTQgKzQ2NCwxNCBAQAogICAgICAgICB0MyA9ICA5ICogc3JjWyA4XSAtIDE2ICogc3JjWzI0XSArICA0ICogc3JjWzQwXSArIDE1ICogc3JjWzU2XTsKICAgICAgICAgdDQgPSAgNCAqIHNyY1sgOF0gLSAgOSAqIHNyY1syNF0gKyAxNSAqIHNyY1s0MF0gLSAxNiAqIHNyY1s1Nl07CiAKLSAgICAgICAgZGVzdFswICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzAgKiBsaW5lc2l6ZV0gKyAoKHQ1ICsgdDEpICAgICA+PiA3KSk7Ci0gICAgICAgIGRlc3RbMSAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFsxICogbGluZXNpemVdICsgKCh0NiArIHQyKSAgICAgPj4gNykpOwotICAgICAgICBkZXN0WzIgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMiAqIGxpbmVzaXplXSArICgodDcgKyB0MykgICAgID4+IDcpKTsKLSAgICAgICAgZGVzdFszICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzMgKiBsaW5lc2l6ZV0gKyAoKHQ4ICsgdDQpICAgICA+PiA3KSk7Ci0gICAgICAgIGRlc3RbNCAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFs0ICogbGluZXNpemVdICsgKCh0OCAtIHQ0ICsgMSkgPj4gNykpOwotICAgICAgICBkZXN0WzUgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNSAqIGxpbmVzaXplXSArICgodDcgLSB0MyArIDEpID4+IDcpKTsKLSAgICAgICAgZGVzdFs2ICogbGluZXNpemVdID0gYXZfY2xpcF91aW50OChkZXN0WzYgKiBsaW5lc2l6ZV0gKyAoKHQ2IC0gdDIgKyAxKSA+PiA3KSk7Ci0gICAgICAgIGRlc3RbNyAqIGxpbmVzaXplXSA9IGF2X2NsaXBfdWludDgoZGVzdFs3ICogbGluZXNpemVdICsgKCh0NSAtIHQxICsgMSkgPj4gNykpOworICAgICAgICBkZXN0WzAgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzAgKiBzdHJpZGVdICsgKCh0NSArIHQxKSAgICAgPj4gNykpOworICAgICAgICBkZXN0WzEgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzEgKiBzdHJpZGVdICsgKCh0NiArIHQyKSAgICAgPj4gNykpOworICAgICAgICBkZXN0WzIgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzIgKiBzdHJpZGVdICsgKCh0NyArIHQzKSAgICAgPj4gNykpOworICAgICAgICBkZXN0WzMgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzMgKiBzdHJpZGVdICsgKCh0OCArIHQ0KSAgICAgPj4gNykpOworICAgICAgICBkZXN0WzQgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzQgKiBzdHJpZGVdICsgKCh0OCAtIHQ0ICsgMSkgPj4gNykpOworICAgICAgICBkZXN0WzUgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzUgKiBzdHJpZGVdICsgKCh0NyAtIHQzICsgMSkgPj4gNykpOworICAgICAgICBkZXN0WzYgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzYgKiBzdHJpZGVdICsgKCh0NiAtIHQyICsgMSkgPj4gNykpOworICAgICAgICBkZXN0WzcgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzcgKiBzdHJpZGVdICsgKCh0NSAtIHQxICsgMSkgPj4gNykpOwogCiAgICAgICAgIHNyYysrOwogICAgICAgICBkZXN0Kys7CkBAIC00ODAsNyArNDc5LDcgQEAKIH0KIAogLyogRG8gaW52ZXJzZSB0cmFuc2Zvcm0gb24gNHg0IHBhcnQgb2YgYmxvY2sgKi8KLXN0YXRpYyB2b2lkIHZjMV9pbnZfdHJhbnNfNHg0X2RjX2ModWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK3N0YXRpYyB2b2lkIHZjMV9pbnZfdHJhbnNfNHg0X2RjX2ModWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgaW50IGk7CiAgICAgaW50IGRjID0gYmxvY2tbMF07CkBAIC00OTMsMTEgKzQ5MiwxMSBAQAogICAgICAgICBkZXN0WzFdID0gYXZfY2xpcF91aW50OChkZXN0WzFdICsgZGMpOwogICAgICAgICBkZXN0WzJdID0gYXZfY2xpcF91aW50OChkZXN0WzJdICsgZGMpOwogICAgICAgICBkZXN0WzNdID0gYXZfY2xpcF91aW50OChkZXN0WzNdICsgZGMpOwotICAgICAgICBkZXN0ICs9IGxpbmVzaXplOworICAgICAgICBkZXN0ICs9IHN0cmlkZTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHZjMV9pbnZfdHJhbnNfNHg0X2ModWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK3N0YXRpYyB2b2lkIHZjMV9pbnZfdHJhbnNfNHg0X2ModWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgaW50IGk7CiAgICAgcmVnaXN0ZXIgaW50IHQxLCB0MiwgdDMsIHQ0OwpAQCAtNTI3LDEwICs1MjYsMTAgQEAKICAgICAgICAgdDMgPSAyMiAqIHNyY1s4XSArIDEwICogc3JjWzI0XTsKICAgICAgICAgdDQgPSAyMiAqIHNyY1syNF0gLSAxMCAqIHNyY1s4XTsKIAotICAgICAgICBkZXN0WzAgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMCAqIGxpbmVzaXplXSArICgodDEgKyB0MykgPj4gNykpOwotICAgICAgICBkZXN0WzEgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMSAqIGxpbmVzaXplXSArICgodDIgLSB0NCkgPj4gNykpOwotICAgICAgICBkZXN0WzIgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMiAqIGxpbmVzaXplXSArICgodDIgKyB0NCkgPj4gNykpOwotICAgICAgICBkZXN0WzMgKiBsaW5lc2l6ZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMyAqIGxpbmVzaXplXSArICgodDEgLSB0MykgPj4gNykpOworICAgICAgICBkZXN0WzAgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzAgKiBzdHJpZGVdICsgKCh0MSArIHQzKSA+PiA3KSk7CisgICAgICAgIGRlc3RbMSAqIHN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbMSAqIHN0cmlkZV0gKyAoKHQyIC0gdDQpID4+IDcpKTsKKyAgICAgICAgZGVzdFsyICogc3RyaWRlXSA9IGF2X2NsaXBfdWludDgoZGVzdFsyICogc3RyaWRlXSArICgodDIgKyB0NCkgPj4gNykpOworICAgICAgICBkZXN0WzMgKiBzdHJpZGVdID0gYXZfY2xpcF91aW50OChkZXN0WzMgKiBzdHJpZGVdICsgKCh0MSAtIHQzKSA+PiA3KSk7CiAKICAgICAgICAgc3JjKys7CiAgICAgICAgIGRlc3QrKzsKQEAgLTc4Myw3ICs3ODIsNyBAQAogICAgICAgQyAqIHNyY1tzdHJpZGUgKyBhXSArIEQgKiBzcmNbc3RyaWRlICsgYSArIDFdICsgMzIgLSA0KSA+PiA2KQogc3RhdGljIHZvaWQgcHV0X25vX3JuZF92YzFfY2hyb21hX21jOF9jKHVpbnQ4X3QgKmRzdCAvKiBhbGlnbiA4ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYyAvKiBhbGlnbiAxICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkKIHsKICAgICBjb25zdCBpbnQgQSA9ICg4IC0geCkgKiAoOCAtIHkpOwogICAgIGNvbnN0IGludCBCID0gICAgICh4KSAqICg4IC0geSk7CkBAIC04MDgsNyArODA3LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgcHV0X25vX3JuZF92YzFfY2hyb21hX21jNF9jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkKIHsKICAgICBjb25zdCBpbnQgQSA9ICg4IC0geCkgKiAoOCAtIHkpOwogICAgIGNvbnN0IGludCBCID0gICAgICh4KSAqICg4IC0geSk7CkBAIC04MzEsNyArODMwLDcgQEAKICNkZWZpbmUgYXZnMihhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCiBzdGF0aWMgdm9pZCBhdmdfbm9fcm5kX3ZjMV9jaHJvbWFfbWM4X2ModWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjIC8qIGFsaWduIDEgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KQogewogICAgIGNvbnN0IGludCBBID0gKDggLSB4KSAqICg4IC0geSk7CiAgICAgY29uc3QgaW50IEIgPSAgICAgKHgpICogKDggLSB5KTsKQEAgLTg1Nyw3ICs4NTYsNyBAQAogCiBzdGF0aWMgdm9pZCBhdmdfbm9fcm5kX3ZjMV9jaHJvbWFfbWM0X2ModWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjIC8qIGFsaWduIDEgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KQogewogICAgIGNvbnN0IGludCBBID0gKDggLSB4KSAqICg4IC0geSk7CiAgICAgY29uc3QgaW50IEIgPSAoICAgIHgpICogKDggLSB5KTsKQEAgLTEwMzUsNCArMTAzNCw2IEBACiAgICAgICAgIGZmX3ZjMWRzcF9pbml0X3BwYyhkc3ApOwogICAgIGlmIChBUkNIX1g4NikKICAgICAgICAgZmZfdmMxZHNwX2luaXRfeDg2KGRzcCk7CisgICAgaWYgKEFSQ0hfTUlQUykKKyAgICAgICAgZmZfdmMxZHNwX2luaXRfbWlwcyhkc3ApOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92YzFkc3AuaCBiL2xpYmF2Y29kZWMvdmMxZHNwLmgKaW5kZXggZTJmNzVhYy4uMTZiMzUyOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92YzFkc3AuaAorKysgYi9saWJhdmNvZGVjL3ZjMWRzcC5oCkBAIC0yMiw3ICsyMiw2IEBACiAvKioKICAqIEBmaWxlCiAgKiBWQy0xIGFuZCBXTVYzIGRlY29kZXIKLSAqCiAgKi8KIAogI2lmbmRlZiBBVkNPREVDX1ZDMURTUF9ICkBAIC0zNiwxMyArMzUsMTMgQEAKIHR5cGVkZWYgc3RydWN0IFZDMURTUENvbnRleHQgewogICAgIC8qIHZjMSBmdW5jdGlvbnMgKi8KICAgICB2b2lkICgqdmMxX2ludl90cmFuc184eDgpKGludDE2X3QgKmIpOwotICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4NCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4OCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4NCkodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4OF9kYykodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4NF9kYykodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4OF9kYykodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4NF9kYykodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4NCkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4OCkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4NCkodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4OF9kYykodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzh4NF9kYykodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4OF9kYykodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOworICAgIHZvaWQgKCp2YzFfaW52X3RyYW5zXzR4NF9kYykodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOwogICAgIHZvaWQgKCp2YzFfdl9vdmVybGFwKSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpOwogICAgIHZvaWQgKCp2YzFfaF9vdmVybGFwKSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpOwogICAgIHZvaWQgKCp2YzFfdl9zX292ZXJsYXApKGludDE2X3QgKnRvcCwgIGludDE2X3QgKmJvdHRvbSk7CkBAIC04OCw1ICs4Nyw2IEBACiB2b2lkIGZmX3ZjMWRzcF9pbml0X2FybShWQzFEU1BDb250ZXh0KiBkc3ApOwogdm9pZCBmZl92YzFkc3BfaW5pdF9wcGMoVkMxRFNQQ29udGV4dCAqYyk7CiB2b2lkIGZmX3ZjMWRzcF9pbml0X3g4NihWQzFEU1BDb250ZXh0KiBkc3ApOwordm9pZCBmZl92YzFkc3BfaW5pdF9taXBzKFZDMURTUENvbnRleHQqIGRzcCk7CiAKICNlbmRpZiAvKiBBVkNPREVDX1ZDMURTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZjMmVuYy5jIGIvbGliYXZjb2RlYy92YzJlbmMuYwppbmRleCA1NDcyNjA5Li5kMDEwMWUwIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZjMmVuYy5jCisrKyBiL2xpYmF2Y29kZWMvdmMyZW5jLmMKQEAgLTE5LDIwICsxOSw2MSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlICJsaWJhdnV0aWwvZmZ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAiZGlyYWMuaCIKICNpbmNsdWRlICJwdXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmVyc2lvbi5oIgogCiAjaW5jbHVkZSAidmMyZW5jX2R3dC5oIgogI2luY2x1ZGUgImRpcmFjdGFiLmgiCiAKLS8qIFF1YW50aXphdGlvbnMgYWJvdmUgdGhpcyB1c3VhbGx5IHplcm8gY29lZmZpY2llbnRzIGFuZCBsb3dlciB0aGUgcXVhbGl0eSAqLwotI2RlZmluZSBNQVhfUVVBTlRfSU5ERVggMTAwCisvKiBUaGUgbGltaXRlZCBzaXplIHJlc29sdXRpb24gb2YgZWFjaCBzbGljZSBmb3JjZXMgdXMgdG8gZG8gdGhpcyAqLworI2RlZmluZSBTU0laRV9ST1VORChiKSAoRkZBTElHTigoYiksIHMtPnNpemVfc2NhbGVyKSArIDQgKyBzLT5wcmVmaXhfYnl0ZXMpCiAKLSNkZWZpbmUgQ09FRl9MVVRfVEFCIDIwNDgKKy8qIERlY2lkZXMgdGhlIGN1dG9mZiBwb2ludCBpbiAjIG9mIHNsaWNlcyB0byBkaXN0cmlidXRlIHRoZSBsZWZ0b3ZlciBieXRlcyAqLworI2RlZmluZSBTTElDRV9SRURJU1RfVE9UQUwgMTUwCisKK3R5cGVkZWYgc3RydWN0IFZDMkJhc2VWaWRlb0Zvcm1hdCB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisgICAgaW50IHdpZHRoLCBoZWlnaHQsIGludGVybGFjZWQsIGxldmVsOworICAgIGNvbnN0IGNoYXIgKm5hbWU7Cit9IFZDMkJhc2VWaWRlb0Zvcm1hdDsKKworc3RhdGljIGNvbnN0IFZDMkJhc2VWaWRlb0Zvcm1hdCBiYXNlX3ZpZGVvX2ZtdHNbXSA9IHsKKyAgICB7IDAgfSwgLyogQ3VzdG9tIGZvcm1hdCwgaGVyZSBqdXN0IHRvIG1ha2UgaW5kZXhpbmcgZXF1YWwgdG8gYmFzZV92ZiAqLworICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgIHsgMTAwMSwgMTUwMDAgfSwgIDE3NiwgIDEyMCwgMCwgMSwgICAgICJRU0lGNTI1IiB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgIHsgICAgMiwgICAgMjUgfSwgIDE3NiwgIDE0NCwgMCwgMSwgICAgICJRQ0lGIiAgICB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgIHsgMTAwMSwgMTUwMDAgfSwgIDM1MiwgIDI0MCwgMCwgMSwgICAgICJTSUY1MjUiICB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgIHsgICAgMiwgICAgMjUgfSwgIDM1MiwgIDI4OCwgMCwgMSwgICAgICJDSUYiICAgICB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgIHsgMTAwMSwgMTUwMDAgfSwgIDcwNCwgIDQ4MCwgMCwgMSwgICAgICI0U0lGNTI1IiB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgIHsgICAgMiwgICAgMjUgfSwgIDcwNCwgIDU3NiwgMCwgMSwgICAgICI0Q0lGIiAgICB9LAorCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgeyAxMDAxLCAzMDAwMCB9LCAgNzIwLCAgNDgwLCAxLCAyLCAgICJTRDQ4MEktNjAiIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgeyAgICAxLCAgICAyNSB9LCAgNzIwLCAgNTc2LCAxLCAyLCAgICJTRDU3NkktNTAiIH0sCisKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCB7IDEwMDEsIDYwMDAwIH0sIDEyODAsICA3MjAsIDAsIDMsICAiSEQ3MjBQLTYwIiAgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCB7ICAgIDEsICAgIDUwIH0sIDEyODAsICA3MjAsIDAsIDMsICAiSEQ3MjBQLTUwIiAgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCB7IDEwMDEsIDMwMDAwIH0sIDE5MjAsIDEwODAsIDEsIDMsICAiSEQxMDgwSS02MCIgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCB7ICAgIDEsICAgIDI1IH0sIDE5MjAsIDEwODAsIDEsIDMsICAiSEQxMDgwSS01MCIgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCB7IDEwMDEsIDYwMDAwIH0sIDE5MjAsIDEwODAsIDAsIDMsICAiSEQxMDgwUC02MCIgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCB7ICAgIDEsICAgIDUwIH0sIDE5MjAsIDEwODAsIDAsIDMsICAiSEQxMDgwUC01MCIgfSwKKworICAgIHsgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIHsgICAgMSwgICAgMjQgfSwgMjA0OCwgMTA4MCwgMCwgNCwgICAgICAgICJEQzJLIiB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIHsgICAgMSwgICAgMjQgfSwgNDA5NiwgMjE2MCwgMCwgNSwgICAgICAgICJEQzRLIiB9LAorCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgeyAxMDAxLCA2MDAwMCB9LCAzODQwLCAyMTYwLCAwLCA2LCAiVUhEVFYgNEstNjAiIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgeyAgICAxLCAgICA1MCB9LCAzODQwLCAyMTYwLCAwLCA2LCAiVUhEVFYgNEstNTAiIH0sCisKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCB7IDEwMDEsIDYwMDAwIH0sIDc2ODAsIDQzMjAsIDAsIDcsICJVSERUViA4Sy02MCIgfSwKKyAgICB7IEFWX1BJWF9GTVRfWVVWNDIyUDEwLCB7ICAgIDEsICAgIDUwIH0sIDc2ODAsIDQzMjAsIDAsIDcsICJVSERUViA4Sy01MCIgfSwKKworICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIHsgMTAwMSwgMjQwMDAgfSwgMTkyMCwgMTA4MCwgMCwgMywgICJIRDEwODBQLTI0IiB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIHsgMTAwMSwgMzAwMDAgfSwgIDcyMCwgIDQ4NiwgMSwgMiwgICJTRCBQcm80ODYiICB9LAorfTsKK3N0YXRpYyBjb25zdCBpbnQgYmFzZV92aWRlb19mbXRzX2xlbiA9IEZGX0FSUkFZX0VMRU1TKGJhc2VfdmlkZW9fZm10cyk7CiAKIGVudW0gVkMyX1FNIHsKICAgICBWQzJfUU1fREVGID0gMCwKQEAgLTYxLDExICsxMDIsMTMgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgU2xpY2VBcmdzIHsKICAgICBQdXRCaXRDb250ZXh0IHBiOworICAgIGludCBjYWNoZVtESVJBQ19NQVhfUVVBTlRfSU5ERVhdOwogICAgIHZvaWQgKmN0eDsKICAgICBpbnQgeDsKICAgICBpbnQgeTsKICAgICBpbnQgcXVhbnRfaWR4OwogICAgIGludCBiaXRzX2NlaWw7CisgICAgaW50IGJpdHNfZmxvb3I7CiAgICAgaW50IGJ5dGVzOwogfSBTbGljZUFyZ3M7CiAKQEAgLTkxLDYgKzEzNCw3IEBACiAgICAgLyogRm9yIGNvbnZlcnNpb24gZnJvbSB1bnNpZ25lZCBwaXhlbCB2YWx1ZXMgdG8gc2lnbmVkICovCiAgICAgaW50IGRpZmZfb2Zmc2V0OwogICAgIGludCBicHA7CisgICAgaW50IGJwcF9pZHg7CiAKICAgICAvKiBQaWN0dXJlIG51bWJlciAqLwogICAgIHVpbnQzMl90IHBpY3R1cmVfbnVtYmVyOwpAQCAtMTAyLDEwICsxNDYsMTAgQEAKIAogICAgIC8qIFF1YW50aXphdGlvbiBtYXRyaXggKi8KICAgICB1aW50OF90IHF1YW50W01BWF9EV1RfTEVWRUxTXVs0XTsKKyAgICBpbnQgY3VzdG9tX3F1YW50X21hdHJpeDsKIAotICAgIC8qIENvZWZmaWNpZW50IExVVCAqLwotICAgIHVpbnQzMl90ICpjb2VmX2x1dF92YWw7Ci0gICAgdWludDhfdCAgKmNvZWZfbHV0X2xlbjsKKyAgICAvKiBEaXZpc2lvbiBMVVQgKi8KKyAgICB1aW50MzJfdCBxbWFnaWNfbHV0WzExNl1bMl07CiAKICAgICBpbnQgbnVtX3g7IC8qICNzbGljZXMgaG9yaXpvbnRhbGx5ICovCiAgICAgaW50IG51bV95OyAvKiAjc2xpY2VzIHZlcnRpY2FsbHkgKi8KQEAgLTExNSw5ICsxNTksMTEgQEAKICAgICBpbnQgY2hyb21hX3lfc2hpZnQ7CiAKICAgICAvKiBSYXRlIGNvbnRyb2wgc3R1ZmYgKi8KKyAgICBpbnQgZnJhbWVfbWF4X2J5dGVzOwogICAgIGludCBzbGljZV9tYXhfYnl0ZXM7CisgICAgaW50IHNsaWNlX21pbl9ieXRlczsKICAgICBpbnQgcV9jZWlsOwotICAgIGludCBxX3N0YXJ0OworICAgIGludCBxX2F2ZzsKIAogICAgIC8qIE9wdGlvbnMgKi8KICAgICBkb3VibGUgdG9sZXJhbmNlOwpAQCAtMTM0LDE5ICsxODAsNiBAQAogICAgIGVudW0gRGlyYWNQYXJzZUNvZGVzIGxhc3RfcGFyc2VfY29kZTsKIH0gVkMyRW5jQ29udGV4dDsKIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBwdXRfcGFkZGluZyhQdXRCaXRDb250ZXh0ICpwYiwgaW50IGJ5dGVzKQotewotICAgIGludCBiaXRzID0gYnl0ZXMqODsKLSAgICBpZiAoIWJpdHMpCi0gICAgICAgIHJldHVybjsKLSAgICB3aGlsZSAoYml0cyA+IDMxKSB7Ci0gICAgICAgIHB1dF9iaXRzKHBiLCAzMSwgMCk7Ci0gICAgICAgIGJpdHMgLT0gMzE7Ci0gICAgfQotICAgIGlmIChiaXRzKQotICAgICAgICBwdXRfYml0cyhwYiwgYml0cywgMCk7Ci19Ci0KIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgcHV0X3ZjMl91ZV91aW50KFB1dEJpdENvbnRleHQgKnBiLCB1aW50MzJfdCB2YWwpCiB7CiAgICAgaW50IGk7CkBAIC0xNzUsNyArMjA4LDcgQEAKICAgICBwdXRfYml0cyhwYiwgYml0cyoyICsgMSwgKHBiaXRzIDw8IDEpIHwgMSk7CiB9CiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBjb3VudF92YzJfdWVfdWludCh1aW50MTZfdCB2YWwpCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgY291bnRfdmMyX3VlX3VpbnQodWludDMyX3QgdmFsKQogewogICAgIGludCB0b3BiaXQgPSAxLCBtYXh2YWwgPSAxOwogCkBAIC0xOTEsMzcgKzIyNCw2IEBACiAgICAgcmV0dXJuIGZmX2xvZzIodG9wYml0KSoyICsgMTsKIH0KIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBnZXRfdmMyX3VlX3VpbnQodWludDE2X3QgdmFsLCB1aW50OF90ICpuYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmV2YWwpCi17Ci0gICAgaW50IGk7Ci0gICAgaW50IHBiaXRzID0gMCwgYml0cyA9IDAsIHRvcGJpdCA9IDEsIG1heHZhbCA9IDE7Ci0KLSAgICBpZiAoIXZhbCsrKSB7Ci0gICAgICAgICpuYml0cyA9IDE7Ci0gICAgICAgICpldmFsID0gMTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlICh2YWwgPiBtYXh2YWwpIHsKLSAgICAgICAgdG9wYml0IDw8PSAxOwotICAgICAgICBtYXh2YWwgPDw9IDE7Ci0gICAgICAgIG1heHZhbCB8PSAgMTsKLSAgICB9Ci0KLSAgICBiaXRzID0gZmZfbG9nMih0b3BiaXQpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGJpdHM7IGkrKykgewotICAgICAgICB0b3BiaXQgPj49IDE7Ci0gICAgICAgIHBiaXRzIDw8PSAyOwotICAgICAgICBpZiAodmFsICYgdG9wYml0KQotICAgICAgICAgICAgcGJpdHMgfD0gMHgxOwotICAgIH0KLQotICAgICpuYml0cyA9IGJpdHMqMiArIDE7Ci0gICAgKmV2YWwgPSAocGJpdHMgPDwgMSkgfCAxOwotfQotCiAvKiBWQy0yIDEwLjQgLSBwYXJzZV9pbmZvKCkgKi8KIHN0YXRpYyB2b2lkIGVuY29kZV9wYXJzZV9pbmZvKFZDMkVuY0NvbnRleHQgKnMsIGVudW0gRGlyYWNQYXJzZUNvZGVzIHBjb2RlKQogewpAQCAtMzMxLDMxICszMzMsOSBAQAogLyogVkMtMiAxMS4zLjggLSBzaWduYWxfcmFuZ2UoKSAqLwogc3RhdGljIHZvaWQgZW5jb2RlX3NpZ25hbF9yYW5nZShWQzJFbmNDb250ZXh0ICpzKQogewotICAgIGludCBpZHg7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+YXZjdHg7Ci0gICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpmbXQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKLSAgICBjb25zdCBpbnQgZGVwdGggPSBmbXQtPmNvbXBbMF0uZGVwdGg7Ci0gICAgaWYgKGRlcHRoID09IDggJiYgYXZjdHgtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUcpIHsKLSAgICAgICAgaWR4ID0gMTsKLSAgICAgICAgcy0+YnBwID0gMTsKLSAgICAgICAgcy0+ZGlmZl9vZmZzZXQgPSAxMjg7Ci0gICAgfSBlbHNlIGlmIChkZXB0aCA9PSA4ICYmIChhdmN0eC0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfTVBFRyB8fAotICAgICAgICAgICAgICAgYXZjdHgtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEKSkgewotICAgICAgICBpZHggPSAyOwotICAgICAgICBzLT5icHAgPSAxOwotICAgICAgICBzLT5kaWZmX29mZnNldCA9IDEyODsKLSAgICB9IGVsc2UgaWYgKGRlcHRoID09IDEwKSB7Ci0gICAgICAgIGlkeCA9IDM7Ci0gICAgICAgIHMtPmJwcCA9IDI7Ci0gICAgICAgIHMtPmRpZmZfb2Zmc2V0ID0gNTEyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlkeCA9IDQ7Ci0gICAgICAgIHMtPmJwcCA9IDI7Ci0gICAgICAgIHMtPmRpZmZfb2Zmc2V0ID0gMjA0ODsKLSAgICB9CiAgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCAhcy0+c3RyaWN0X2NvbXBsaWFuY2UpOwogICAgIGlmICghcy0+c3RyaWN0X2NvbXBsaWFuY2UpCi0gICAgICAgIHB1dF92YzJfdWVfdWludCgmcy0+cGIsIGlkeCk7CisgICAgICAgIHB1dF92YzJfdWVfdWludCgmcy0+cGIsIHMtPmJwcF9pZHgpOwogfQogCiAvKiBWQy0yIDExLjMuOSAtIGNvbG9yX3NwZWMoKSAqLwpAQCAtNDU5LDEwICs0MzksMjMgQEAKICAgICB7IDAsICAwLCAgMCwgIDB9CiB9OwogCi1zdGF0aWMgdm9pZCBpbml0X2N1c3RvbV9xbShWQzJFbmNDb250ZXh0ICpzKQorc3RhdGljIHZvaWQgaW5pdF9xdWFudF9tYXRyaXgoVkMyRW5jQ29udGV4dCAqcykKIHsKICAgICBpbnQgbGV2ZWwsIG9yaWVudGF0aW9uOwogCisgICAgaWYgKHMtPndhdmVsZXRfZGVwdGggPD0gNCAmJiBzLT5xdWFudF9tYXRyaXggPT0gVkMyX1FNX0RFRikgeworICAgICAgICBzLT5jdXN0b21fcXVhbnRfbWF0cml4ID0gMDsKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgcy0+d2F2ZWxldF9kZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgcy0+cXVhbnRbbGV2ZWxdWzBdID0gZmZfZGlyYWNfZGVmYXVsdF9xbWF0W3MtPndhdmVsZXRfaWR4XVtsZXZlbF1bMF07CisgICAgICAgICAgICBzLT5xdWFudFtsZXZlbF1bMV0gPSBmZl9kaXJhY19kZWZhdWx0X3FtYXRbcy0+d2F2ZWxldF9pZHhdW2xldmVsXVsxXTsKKyAgICAgICAgICAgIHMtPnF1YW50W2xldmVsXVsyXSA9IGZmX2RpcmFjX2RlZmF1bHRfcW1hdFtzLT53YXZlbGV0X2lkeF1bbGV2ZWxdWzJdOworICAgICAgICAgICAgcy0+cXVhbnRbbGV2ZWxdWzNdID0gZmZfZGlyYWNfZGVmYXVsdF9xbWF0W3MtPndhdmVsZXRfaWR4XVtsZXZlbF1bM107CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHMtPmN1c3RvbV9xdWFudF9tYXRyaXggPSAxOworCiAgICAgaWYgKHMtPnF1YW50X21hdHJpeCA9PSBWQzJfUU1fREVGKSB7CiAgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IHMtPndhdmVsZXRfZGVwdGg7IGxldmVsKyspIHsKICAgICAgICAgICAgIGZvciAob3JpZW50YXRpb24gPSAwOyBvcmllbnRhdGlvbiA8IDQ7IG9yaWVudGF0aW9uKyspIHsKQEAgLTQ5MCwyNSArNDgzLDE1IEBACiAvKiBWQy0yIDEyLjMuNC4yIC0gcXVhbnRfbWF0cml4KCkgKi8KIHN0YXRpYyB2b2lkIGVuY29kZV9xdWFudF9tYXRyaXgoVkMyRW5jQ29udGV4dCAqcykKIHsKLSAgICBpbnQgbGV2ZWwsIGN1c3RvbV9xdWFudF9tYXRyaXggPSAwOwotICAgIGlmIChzLT53YXZlbGV0X2RlcHRoID4gNCB8fCBzLT5xdWFudF9tYXRyaXggIT0gVkMyX1FNX0RFRikKLSAgICAgICAgY3VzdG9tX3F1YW50X21hdHJpeCA9IDE7Ci0gICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBjdXN0b21fcXVhbnRfbWF0cml4KTsKLSAgICBpZiAoY3VzdG9tX3F1YW50X21hdHJpeCkgewotICAgICAgICBpbml0X2N1c3RvbV9xbShzKTsKKyAgICBpbnQgbGV2ZWw7CisgICAgcHV0X2JpdHMoJnMtPnBiLCAxLCBzLT5jdXN0b21fcXVhbnRfbWF0cml4KTsKKyAgICBpZiAocy0+Y3VzdG9tX3F1YW50X21hdHJpeCkgewogICAgICAgICBwdXRfdmMyX3VlX3VpbnQoJnMtPnBiLCBzLT5xdWFudFswXVswXSk7CiAgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IHMtPndhdmVsZXRfZGVwdGg7IGxldmVsKyspIHsKICAgICAgICAgICAgIHB1dF92YzJfdWVfdWludCgmcy0+cGIsIHMtPnF1YW50W2xldmVsXVsxXSk7CiAgICAgICAgICAgICBwdXRfdmMyX3VlX3VpbnQoJnMtPnBiLCBzLT5xdWFudFtsZXZlbF1bMl0pOwogICAgICAgICAgICAgcHV0X3ZjMl91ZV91aW50KCZzLT5wYiwgcy0+cXVhbnRbbGV2ZWxdWzNdKTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IHMtPndhdmVsZXRfZGVwdGg7IGxldmVsKyspIHsKLSAgICAgICAgICAgIHMtPnF1YW50W2xldmVsXVswXSA9IGZmX2RpcmFjX2RlZmF1bHRfcW1hdFtzLT53YXZlbGV0X2lkeF1bbGV2ZWxdWzBdOwotICAgICAgICAgICAgcy0+cXVhbnRbbGV2ZWxdWzFdID0gZmZfZGlyYWNfZGVmYXVsdF9xbWF0W3MtPndhdmVsZXRfaWR4XVtsZXZlbF1bMV07Ci0gICAgICAgICAgICBzLT5xdWFudFtsZXZlbF1bMl0gPSBmZl9kaXJhY19kZWZhdWx0X3FtYXRbcy0+d2F2ZWxldF9pZHhdW2xldmVsXVsyXTsKLSAgICAgICAgICAgIHMtPnF1YW50W2xldmVsXVszXSA9IGZmX2RpcmFjX2RlZmF1bHRfcW1hdFtzLT53YXZlbGV0X2lkeF1bbGV2ZWxdWzNdOwotICAgICAgICB9CiAgICAgfQogfQogCkBAIC01MjcsNyArNTEwLDYgQEAKIHsKICAgICBlbmNvZGVfdHJhbnNmb3JtX3BhcmFtcyhzKTsKICAgICBhdnByaXZfYWxpZ25fcHV0X2JpdHMoJnMtPnBiKTsKLSAgICAvKiBDb250aW51ZWQgYWZ0ZXIgRFdUIGluIGVuY29kZV90cmFuc2Zvcm1fZGF0YSgpICovCiB9CiAKIC8qIFZDLTIgMTIgLSBwaWN0dXJlX3BhcnNlKCkgKi8KQEAgLTUzOSwyOSArNTIxLDcgQEAKICAgICBlbmNvZGVfd2F2ZWxldF90cmFuc2Zvcm0ocyk7CiB9CiAKLSNkZWZpbmUgUVVBTlQoYykgIFwKLSAgICBjIDw8PSAyOyAgICAgIFwKLSAgICBjIC89IHFmYWN0b3I7IFwKLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjb2VmZl9xdWFudGl6ZV9nZXQocWNvZWYgY29lZmYsIGludCBxZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbGVuLCB1aW50MzJfdCAqZXZhbCkKLXsKLSAgICBRVUFOVChjb2VmZikKLSAgICBnZXRfdmMyX3VlX3VpbnQoYWJzKGNvZWZmKSwgbGVuLCBldmFsKTsKLSAgICBpZiAoY29lZmYpIHsKLSAgICAgICAgKmV2YWwgPSAoKmV2YWwgPDwgMSkgfCAoY29lZmYgPCAwKTsKLSAgICAgICAgKmxlbiArPSAxOwotICAgIH0KLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjb2VmZl9xdWFudGl6ZV9lbmNvZGUoUHV0Qml0Q29udGV4dCAqcGIsIHFjb2VmIGNvZWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHFmYWN0b3IpCi17Ci0gICAgUVVBTlQoY29lZmYpCi0gICAgcHV0X3ZjMl91ZV91aW50KHBiLCBhYnMoY29lZmYpKTsKLSAgICBpZiAoY29lZmYpCi0gICAgICAgIHB1dF9iaXRzKHBiLCAxLCBjb2VmZiA8IDApOwotfQorI2RlZmluZSBRVUFOVChjLCBtdWwsIGFkZCwgc2hpZnQpICgoKG11bCkgKiAoYykgKyAoYWRkKSkgPj4gKHNoaWZ0KSkKIAogLyogVkMtMiAxMy41LjUuMiAtIHNsaWNlX2JhbmQoKSAqLwogc3RhdGljIHZvaWQgZW5jb2RlX3N1YmJhbmQoVkMyRW5jQ29udGV4dCAqcywgUHV0Qml0Q29udGV4dCAqcGIsIGludCBzeCwgaW50IHN5LApAQCAtNTY5LDM0ICs1MjksMzYgQEAKIHsKICAgICBpbnQgeCwgeTsKIAotICAgIGludCBsZWZ0ICAgPSBiLT53aWR0aCAgKiAoc3grMCkgLyBzLT5udW1feDsKLSAgICBpbnQgcmlnaHQgID0gYi0+d2lkdGggICogKHN4KzEpIC8gcy0+bnVtX3g7Ci0gICAgaW50IHRvcCAgICA9IGItPmhlaWdodCAqIChzeSswKSAvIHMtPm51bV95OwotICAgIGludCBib3R0b20gPSBiLT5oZWlnaHQgKiAoc3krMSkgLyBzLT5udW1feTsKLQotICAgIGludCBxZmFjdG9yID0gZmZfZGlyYWNfcXNjYWxlX3RhYltxdWFudF07Ci0gICAgdWludDhfdCAgKmxlbl9sdXQgPSAmcy0+Y29lZl9sdXRfbGVuWzIqcXVhbnQqQ09FRl9MVVRfVEFCICsgQ09FRl9MVVRfVEFCXTsKLSAgICB1aW50MzJfdCAqdmFsX2x1dCA9ICZzLT5jb2VmX2x1dF92YWxbMipxdWFudCpDT0VGX0xVVF9UQUIgKyBDT0VGX0xVVF9UQUJdOworICAgIGNvbnN0IGludCBsZWZ0ICAgPSBiLT53aWR0aCAgKiAoc3grMCkgLyBzLT5udW1feDsKKyAgICBjb25zdCBpbnQgcmlnaHQgID0gYi0+d2lkdGggICogKHN4KzEpIC8gcy0+bnVtX3g7CisgICAgY29uc3QgaW50IHRvcCAgICA9IGItPmhlaWdodCAqIChzeSswKSAvIHMtPm51bV95OworICAgIGNvbnN0IGludCBib3R0b20gPSBiLT5oZWlnaHQgKiAoc3krMSkgLyBzLT5udW1feTsKIAogICAgIGR3dGNvZWYgKmNvZWZmID0gYi0+YnVmICsgdG9wICogYi0+c3RyaWRlOworICAgIGNvbnN0IHVpbnQ2NF90IHFfbSA9ICgodWludDY0X3QpKHMtPnFtYWdpY19sdXRbcXVhbnRdWzBdKSkgPDwgMjsKKyAgICBjb25zdCB1aW50NjRfdCBxX2EgPSBzLT5xbWFnaWNfbHV0W3F1YW50XVsxXTsKKyAgICBjb25zdCBpbnQgcV9zID0gYXZfbG9nMihmZl9kaXJhY19xc2NhbGVfdGFiW3F1YW50XSkgKyAzMjsKIAogICAgIGZvciAoeSA9IHRvcDsgeSA8IGJvdHRvbTsgeSsrKSB7CiAgICAgICAgIGZvciAoeCA9IGxlZnQ7IHggPCByaWdodDsgeCsrKSB7Ci0gICAgICAgICAgICBpZiAoY29lZmZbeF0gPj0gLUNPRUZfTFVUX1RBQiAmJiBjb2VmZlt4XSA8IENPRUZfTFVUX1RBQikKLSAgICAgICAgICAgICAgICBwdXRfYml0cyhwYiwgbGVuX2x1dFtjb2VmZlt4XV0sIHZhbF9sdXRbY29lZmZbeF1dKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBjb2VmZl9xdWFudGl6ZV9lbmNvZGUocGIsIGNvZWZmW3hdLCBxZmFjdG9yKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGNfYWJzID0gUVVBTlQoRkZBQlMoY29lZmZbeF0pLCBxX20sIHFfYSwgcV9zKTsKKyAgICAgICAgICAgIHB1dF92YzJfdWVfdWludChwYiwgY19hYnMpOworICAgICAgICAgICAgaWYgKGNfYWJzKQorICAgICAgICAgICAgICAgIHB1dF9iaXRzKHBiLCAxLCBjb2VmZlt4XSA8IDApOwogICAgICAgICB9CiAgICAgICAgIGNvZWZmICs9IGItPnN0cmlkZTsKICAgICB9CiB9CiAKLXN0YXRpYyBpbnQgY291bnRfaHFfc2xpY2UoVkMyRW5jQ29udGV4dCAqcywgaW50IHNsaWNlX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzbGljZV95LCBpbnQgcXVhbnRfaWR4KQorc3RhdGljIGludCBjb3VudF9ocV9zbGljZShTbGljZUFyZ3MgKnNsaWNlLCBpbnQgcXVhbnRfaWR4KQogewotICAgIGludCB4LCB5LCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHFmYWN0b3I7CisgICAgaW50IHgsIHk7CiAgICAgdWludDhfdCBxdWFudHNbTUFYX0RXVF9MRVZFTFNdWzRdOwogICAgIGludCBiaXRzID0gMCwgcCwgbGV2ZWwsIG9yaWVudGF0aW9uOworICAgIFZDMkVuY0NvbnRleHQgKnMgPSBzbGljZS0+Y3R4OworCisgICAgaWYgKHNsaWNlLT5jYWNoZVtxdWFudF9pZHhdKQorICAgICAgICByZXR1cm4gc2xpY2UtPmNhY2hlW3F1YW50X2lkeF07CiAKICAgICBiaXRzICs9IDgqcy0+cHJlZml4X2J5dGVzOwogICAgIGJpdHMgKz0gODsgLyogcXVhbnRfaWR4ICovCkBAIC02MTEsMjkgKzU3MywyNSBAQAogICAgICAgICBiaXRzICs9IDg7CiAgICAgICAgIGZvciAobGV2ZWwgPSAwOyBsZXZlbCA8IHMtPndhdmVsZXRfZGVwdGg7IGxldmVsKyspIHsKICAgICAgICAgICAgIGZvciAob3JpZW50YXRpb24gPSAhIWxldmVsOyBvcmllbnRhdGlvbiA8IDQ7IG9yaWVudGF0aW9uKyspIHsKLSAgICAgICAgICAgICAgICBkd3Rjb2VmICpidWY7CiAgICAgICAgICAgICAgICAgU3ViQmFuZCAqYiA9ICZzLT5wbGFuZVtwXS5iYW5kW2xldmVsXVtvcmllbnRhdGlvbl07CiAKLSAgICAgICAgICAgICAgICBxdWFudF9pZHggPSBxdWFudHNbbGV2ZWxdW29yaWVudGF0aW9uXTsKLSAgICAgICAgICAgICAgICBxZmFjdG9yID0gZmZfZGlyYWNfcXNjYWxlX3RhYltxdWFudF9pZHhdOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBxX2lkeCA9IHF1YW50c1tsZXZlbF1bb3JpZW50YXRpb25dOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90IHFfbSA9ICgodWludDY0X3Qpcy0+cW1hZ2ljX2x1dFtxX2lkeF1bMF0pIDw8IDI7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QgcV9hID0gcy0+cW1hZ2ljX2x1dFtxX2lkeF1bMV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHFfcyA9IGF2X2xvZzIoZmZfZGlyYWNfcXNjYWxlX3RhYltxX2lkeF0pICsgMzI7CiAKLSAgICAgICAgICAgICAgICBsZWZ0ICAgPSBiLT53aWR0aCAgKiBzbGljZV94ICAgIC8gcy0+bnVtX3g7Ci0gICAgICAgICAgICAgICAgcmlnaHQgID0gYi0+d2lkdGggICooc2xpY2VfeCsxKSAvIHMtPm51bV94OwotICAgICAgICAgICAgICAgIHRvcCAgICA9IGItPmhlaWdodCAqIHNsaWNlX3kgICAgLyBzLT5udW1feTsKLSAgICAgICAgICAgICAgICBib3R0b20gPSBiLT5oZWlnaHQgKihzbGljZV95KzEpIC8gcy0+bnVtX3k7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGxlZnQgICA9IGItPndpZHRoICAqIHNsaWNlLT54ICAgIC8gcy0+bnVtX3g7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJpZ2h0ICA9IGItPndpZHRoICAqKHNsaWNlLT54KzEpIC8gcy0+bnVtX3g7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHRvcCAgICA9IGItPmhlaWdodCAqIHNsaWNlLT55ICAgIC8gcy0+bnVtX3k7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGJvdHRvbSA9IGItPmhlaWdodCAqKHNsaWNlLT55KzEpIC8gcy0+bnVtX3k7CiAKLSAgICAgICAgICAgICAgICBidWYgPSBiLT5idWYgKyB0b3AgKiBiLT5zdHJpZGU7CisgICAgICAgICAgICAgICAgZHd0Y29lZiAqYnVmID0gYi0+YnVmICsgdG9wICogYi0+c3RyaWRlOwogCiAgICAgICAgICAgICAgICAgZm9yICh5ID0gdG9wOyB5IDwgYm90dG9tOyB5KyspIHsKICAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gbGVmdDsgeCA8IHJpZ2h0OyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHFjb2VmIGNvZWZmID0gKHFjb2VmKWJ1Zlt4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2VmZiA+PSAtQ09FRl9MVVRfVEFCICYmIGNvZWZmIDwgQ09FRl9MVVRfVEFCKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSBzLT5jb2VmX2x1dF9sZW5bMipxdWFudF9pZHgqQ09FRl9MVVRfVEFCICsgY29lZmYgKyBDT0VGX0xVVF9UQUJdOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUFOVChjb2VmZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IGNvdW50X3ZjMl91ZV91aW50KGFicyhjb2VmZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gISFjb2VmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNfYWJzID0gUVVBTlQoRkZBQlMoYnVmW3hdKSwgcV9tLCBxX2EsIHFfcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiaXRzICs9IGNvdW50X3ZjMl91ZV91aW50KGNfYWJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgKz0gISFjX2FiczsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBidWYgKz0gYi0+c3RyaWRlOwogICAgICAgICAgICAgICAgIH0KQEAgLTY0Niw2ICs2MDQsOCBAQAogICAgICAgICBiaXRzICs9IHBhZF9jKjg7CiAgICAgfQogCisgICAgc2xpY2UtPmNhY2hlW3F1YW50X2lkeF0gPSBiaXRzOworCiAgICAgcmV0dXJuIGJpdHM7CiB9CiAKQEAgLTY1Niw1MyArNjE2LDEwNSBAQAogewogICAgIFNsaWNlQXJncyAqc2xpY2VfZGF0ID0gYXJnOwogICAgIFZDMkVuY0NvbnRleHQgKnMgPSBzbGljZV9kYXQtPmN0eDsKLSAgICBjb25zdCBpbnQgc3ggPSBzbGljZV9kYXQtPng7Ci0gICAgY29uc3QgaW50IHN5ID0gc2xpY2VfZGF0LT55OwotICAgIGludCBxdWFudF9idWZbMl0sIGJpdHNfYnVmWzJdLCBxdWFudCA9IHMtPnFfc3RhcnQsIHJhbmdlID0gcy0+cV9zdGFydC8zOwotICAgIGNvbnN0IGludDY0X3QgdG9wID0gc2xpY2VfZGF0LT5iaXRzX2NlaWw7Ci0gICAgY29uc3QgZG91YmxlIHBlcmNlbnQgPSBzLT50b2xlcmFuY2U7Ci0gICAgY29uc3QgZG91YmxlIGJvdHRvbSA9IHRvcCAtIHRvcCoocGVyY2VudC8xMDAuMGYpOwotICAgIGludCBiaXRzID0gY291bnRfaHFfc2xpY2Uocywgc3gsIHN5LCBxdWFudCk7Ci0gICAgcmFuZ2UgLT0gcmFuZ2UgJiAxOyAvKiBNYWtlIGl0IGFuIGV2ZW4gbnVtYmVyICovCisgICAgY29uc3QgaW50IHRvcCA9IHNsaWNlX2RhdC0+Yml0c19jZWlsOworICAgIGNvbnN0IGludCBib3R0b20gPSBzbGljZV9kYXQtPmJpdHNfZmxvb3I7CisgICAgaW50IHF1YW50X2J1ZlsyXSA9IHstMSwgLTF9OworICAgIGludCBxdWFudCA9IHNsaWNlX2RhdC0+cXVhbnRfaWR4LCBzdGVwID0gMTsKKyAgICBpbnQgYml0c19sYXN0LCBiaXRzID0gY291bnRfaHFfc2xpY2Uoc2xpY2VfZGF0LCBxdWFudCk7CiAgICAgd2hpbGUgKChiaXRzID4gdG9wKSB8fCAoYml0cyA8IGJvdHRvbSkpIHsKLSAgICAgICAgcmFuZ2UgKj0gYml0cyA+IHRvcCA/ICsxIDogLTE7Ci0gICAgICAgIHF1YW50ID0gYXZfY2xpcChxdWFudCArIHJhbmdlLCAwLCBzLT5xX2NlaWwpOwotICAgICAgICBiaXRzID0gY291bnRfaHFfc2xpY2Uocywgc3gsIHN5LCBxdWFudCk7Ci0gICAgICAgIHJhbmdlID0gYXZfY2xpcChyYW5nZS8yLCAxLCBzLT5xX2NlaWwpOworICAgICAgICBjb25zdCBpbnQgc2lnbmVkX3N0ZXAgPSBiaXRzID4gdG9wID8gK3N0ZXAgOiAtc3RlcDsKKyAgICAgICAgcXVhbnQgID0gYXZfY2xpcChxdWFudCArIHNpZ25lZF9zdGVwLCAwLCBzLT5xX2NlaWwtMSk7CisgICAgICAgIGJpdHMgICA9IGNvdW50X2hxX3NsaWNlKHNsaWNlX2RhdCwgcXVhbnQpOwogICAgICAgICBpZiAocXVhbnRfYnVmWzFdID09IHF1YW50KSB7Ci0gICAgICAgICAgICBxdWFudCA9IGJpdHNfYnVmWzBdIDwgYml0cyA/IHF1YW50X2J1ZlswXSA6IHF1YW50OwotICAgICAgICAgICAgYml0cyA9IGJpdHNfYnVmWzBdIDwgYml0cyA/IGJpdHNfYnVmWzBdIDogYml0czsKKyAgICAgICAgICAgIHF1YW50ID0gRkZNQVgocXVhbnRfYnVmWzBdLCBxdWFudCk7CisgICAgICAgICAgICBiaXRzICA9IHF1YW50ID09IHF1YW50X2J1ZlswXSA/IGJpdHNfbGFzdCA6IGJpdHM7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBzdGVwICAgICAgICAgPSBhdl9jbGlwKHN0ZXAvMiwgMSwgKHMtPnFfY2VpbC0xKS8yKTsKICAgICAgICAgcXVhbnRfYnVmWzFdID0gcXVhbnRfYnVmWzBdOwogICAgICAgICBxdWFudF9idWZbMF0gPSBxdWFudDsKLSAgICAgICAgYml0c19idWZbMV0gPSBiaXRzX2J1ZlswXTsKLSAgICAgICAgYml0c19idWZbMF0gPSBiaXRzOworICAgICAgICBiaXRzX2xhc3QgICAgPSBiaXRzOwogICAgIH0KLSAgICBzbGljZV9kYXQtPnF1YW50X2lkeCA9IGF2X2NsaXAocXVhbnQsIDAsIHMtPnFfY2VpbCk7Ci0gICAgc2xpY2VfZGF0LT5ieXRlcyA9IEZGQUxJR04oKGJpdHMgPj4gMyksIHMtPnNpemVfc2NhbGVyKSArIDQgKyBzLT5wcmVmaXhfYnl0ZXM7Ci0KKyAgICBzbGljZV9kYXQtPnF1YW50X2lkeCA9IGF2X2NsaXAocXVhbnQsIDAsIHMtPnFfY2VpbC0xKTsKKyAgICBzbGljZV9kYXQtPmJ5dGVzID0gU1NJWkVfUk9VTkQoYml0cyA+PiAzKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY2FsY19zbGljZV9zaXplcyhWQzJFbmNDb250ZXh0ICpzKQorc3RhdGljIGludCBjYWxjX3NsaWNlX3NpemVzKFZDMkVuY0NvbnRleHQgKnMpCiB7Ci0gICAgaW50IHNsaWNlX3gsIHNsaWNlX3k7CisgICAgaW50IGksIGosIHNsaWNlX3gsIHNsaWNlX3ksIGJ5dGVzX2xlZnQgPSAwOworICAgIGludCBieXRlc190b3BbU0xJQ0VfUkVESVNUX1RPVEFMXSA9IHswfTsKKyAgICBpbnQ2NF90IHRvdGFsX2J5dGVzX25lZWRlZCA9IDA7CisgICAgaW50IHNsaWNlX3JlZGlzdF9yYW5nZSA9IEZGTUlOKFNMSUNFX1JFRElTVF9UT1RBTCwgcy0+bnVtX3gqcy0+bnVtX3kpOwogICAgIFNsaWNlQXJncyAqZW5jX2FyZ3MgPSBzLT5zbGljZV9hcmdzOworICAgIFNsaWNlQXJncyAqdG9wX2xvY1tTTElDRV9SRURJU1RfVE9UQUxdID0ge05VTEx9OworCisgICAgaW5pdF9xdWFudF9tYXRyaXgocyk7CiAKICAgICBmb3IgKHNsaWNlX3kgPSAwOyBzbGljZV95IDwgcy0+bnVtX3k7IHNsaWNlX3krKykgewogICAgICAgICBmb3IgKHNsaWNlX3ggPSAwOyBzbGljZV94IDwgcy0+bnVtX3g7IHNsaWNlX3grKykgewogICAgICAgICAgICAgU2xpY2VBcmdzICphcmdzID0gJmVuY19hcmdzW3MtPm51bV94KnNsaWNlX3kgKyBzbGljZV94XTsKICAgICAgICAgICAgIGFyZ3MtPmN0eCA9IHM7Ci0gICAgICAgICAgICBhcmdzLT54ID0gc2xpY2VfeDsKLSAgICAgICAgICAgIGFyZ3MtPnkgPSBzbGljZV95OwotICAgICAgICAgICAgYXJncy0+Yml0c19jZWlsID0gcy0+c2xpY2VfbWF4X2J5dGVzIDw8IDM7CisgICAgICAgICAgICBhcmdzLT54ICAgPSBzbGljZV94OworICAgICAgICAgICAgYXJncy0+eSAgID0gc2xpY2VfeTsKKyAgICAgICAgICAgIGFyZ3MtPmJpdHNfY2VpbCAgPSBzLT5zbGljZV9tYXhfYnl0ZXMgPDwgMzsKKyAgICAgICAgICAgIGFyZ3MtPmJpdHNfZmxvb3IgPSBzLT5zbGljZV9taW5fYnl0ZXMgPDwgMzsKKyAgICAgICAgICAgIG1lbXNldChhcmdzLT5jYWNoZSwgMCwgcy0+cV9jZWlsKnNpemVvZigqYXJncy0+Y2FjaGUpKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qIERldGVybWluZSBxdWFudGl6YXRpb24gaW5kaWNlcyBhbmQgYnl0ZXMgcGVyIHNsaWNlICovCisgICAgLyogRmlyc3QgcGFzcyAtIGRldGVybWluZSBiYXNlbGluZSBzbGljZSBzaXplcyB3LnIudC4gbWF4X3NsaWNlX3NpemUgKi8KICAgICBzLT5hdmN0eC0+ZXhlY3V0ZShzLT5hdmN0eCwgcmF0ZV9jb250cm9sLCBlbmNfYXJncywgTlVMTCwgcy0+bnVtX3gqcy0+bnVtX3ksCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNsaWNlQXJncykpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV94KnMtPm51bV95OyBpKyspIHsKKyAgICAgICAgU2xpY2VBcmdzICphcmdzID0gJmVuY19hcmdzW2ldOworICAgICAgICBieXRlc19sZWZ0ICs9IGFyZ3MtPmJ5dGVzOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2xpY2VfcmVkaXN0X3JhbmdlOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChhcmdzLT5ieXRlcyA+IGJ5dGVzX3RvcFtqXSkgeworICAgICAgICAgICAgICAgIGJ5dGVzX3RvcFtqXSA9IGFyZ3MtPmJ5dGVzOworICAgICAgICAgICAgICAgIHRvcF9sb2Nbal0gICA9IGFyZ3M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBieXRlc19sZWZ0ID0gcy0+ZnJhbWVfbWF4X2J5dGVzIC0gYnl0ZXNfbGVmdDsKKworICAgIC8qIFNlY29uZCBwYXNzIC0gZGlzdHJpYnV0ZSBsZWZ0b3ZlciBieXRlcyAqLworICAgIHdoaWxlIChieXRlc19sZWZ0ID4gMCkgeworICAgICAgICBpbnQgZGlzdHJpYnV0ZWQgPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2xpY2VfcmVkaXN0X3JhbmdlOyBpKyspIHsKKyAgICAgICAgICAgIFNsaWNlQXJncyAqYXJnczsKKyAgICAgICAgICAgIGludCBiaXRzLCBieXRlcywgZGlmZiwgcHJldl9ieXRlcywgbmV3X2lkeDsKKyAgICAgICAgICAgIGlmIChieXRlc19sZWZ0IDw9IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoIXRvcF9sb2NbaV0gfHwgIXRvcF9sb2NbaV0tPnF1YW50X2lkeCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGFyZ3MgPSB0b3BfbG9jW2ldOworICAgICAgICAgICAgcHJldl9ieXRlcyA9IGFyZ3MtPmJ5dGVzOworICAgICAgICAgICAgbmV3X2lkeCA9IEZGTUFYKGFyZ3MtPnF1YW50X2lkeCAtIDEsIDApOworICAgICAgICAgICAgYml0cyAgPSBjb3VudF9ocV9zbGljZShhcmdzLCBuZXdfaWR4KTsKKyAgICAgICAgICAgIGJ5dGVzID0gU1NJWkVfUk9VTkQoYml0cyA+PiAzKTsKKyAgICAgICAgICAgIGRpZmYgID0gYnl0ZXMgLSBwcmV2X2J5dGVzOworICAgICAgICAgICAgaWYgKChieXRlc19sZWZ0IC0gZGlmZikgPiAwKSB7CisgICAgICAgICAgICAgICAgYXJncy0+cXVhbnRfaWR4ID0gbmV3X2lkeDsKKyAgICAgICAgICAgICAgICBhcmdzLT5ieXRlcyA9IGJ5dGVzOworICAgICAgICAgICAgICAgIGJ5dGVzX2xlZnQgLT0gZGlmZjsKKyAgICAgICAgICAgICAgICBkaXN0cmlidXRlZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZGlzdHJpYnV0ZWQpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX3gqcy0+bnVtX3k7IGkrKykgeworICAgICAgICBTbGljZUFyZ3MgKmFyZ3MgPSAmZW5jX2FyZ3NbaV07CisgICAgICAgIHRvdGFsX2J5dGVzX25lZWRlZCArPSBhcmdzLT5ieXRlczsKKyAgICAgICAgcy0+cV9hdmcgPSAocy0+cV9hdmcgKyBhcmdzLT5xdWFudF9pZHgpLzI7CisgICAgfQorCisgICAgcmV0dXJuIHRvdGFsX2J5dGVzX25lZWRlZDsKIH0KIAogLyogVkMtMiAxMy41LjMgLSBocV9zbGljZSAqLwpAQCAtNzE4LDggKzczMCwxMCBAQAogICAgIHVpbnQ4X3QgcXVhbnRzW01BWF9EV1RfTEVWRUxTXVs0XTsKICAgICBpbnQgcCwgbGV2ZWwsIG9yaWVudGF0aW9uOwogCi0gICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKHBiKTsKLSAgICBwdXRfcGFkZGluZyhwYiwgcy0+cHJlZml4X2J5dGVzKTsKKyAgICAvKiBUaGUgcmVmZXJlbmNlIGRlY29kZXIgaWdub3JlcyBpdCwgYW5kIGl0cyB0eXBpY2FsIGxlbmd0aCBpcyAwICovCisgICAgbWVtc2V0KHB1dF9iaXRzX3B0cihwYiksIDAsIHMtPnByZWZpeF9ieXRlcyk7CisgICAgc2tpcF9wdXRfYnl0ZXMocGIsIHMtPnByZWZpeF9ieXRlcyk7CisKICAgICBwdXRfYml0cyhwYiwgOCwgcXVhbnRfaWR4KTsKIAogICAgIC8qIFNsaWNlIHF1YW50aXphdGlvbiAoc2xpY2VfcXVhbnRpemVycygpIGluIHRoZSBzcGVjcykgKi8KQEAgLTc1MCw3ICs3NjQsMTAgQEAKICAgICAgICAgICAgIHBhZF9jID0gKHBhZF9zKnMtPnNpemVfc2NhbGVyKSAtIGJ5dGVzX2xlbjsKICAgICAgICAgfQogICAgICAgICBwYi0+YnVmW2J5dGVzX3N0YXJ0XSA9IHBhZF9zOwotICAgICAgICBwdXRfcGFkZGluZyhwYiwgcGFkX2MpOworICAgICAgICBmbHVzaF9wdXRfYml0cyhwYik7CisgICAgICAgIC8qIHZjMi1yZWZlcmVuY2UgdXNlcyB0aGF0IHBhZGRpbmcgdGhhdCBkZWNvZGVzIHRvICcwJyBjb2VmZnMgKi8KKyAgICAgICAgbWVtc2V0KHB1dF9iaXRzX3B0cihwYiksIDB4RkYsIHBhZF9jKTsKKyAgICAgICAgc2tpcF9wdXRfYnl0ZXMocGIsIHBhZF9jKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTc3MCw4ICs3ODcsNyBAQAogICAgIGZvciAoc2xpY2VfeSA9IDA7IHNsaWNlX3kgPCBzLT5udW1feTsgc2xpY2VfeSsrKSB7CiAgICAgICAgIGZvciAoc2xpY2VfeCA9IDA7IHNsaWNlX3ggPCBzLT5udW1feDsgc2xpY2VfeCsrKSB7CiAgICAgICAgICAgICBTbGljZUFyZ3MgKmFyZ3MgPSAmZW5jX2FyZ3Nbcy0+bnVtX3gqc2xpY2VfeSArIHNsaWNlX3hdOwotICAgICAgICAgICAgaW5pdF9wdXRfYml0cygmYXJncy0+cGIsIGJ1ZiArIHNraXAsIGFyZ3MtPmJ5dGVzKTsKLSAgICAgICAgICAgIHMtPnFfc3RhcnQgPSAocy0+cV9zdGFydCArIGFyZ3MtPnF1YW50X2lkeCkvMjsKKyAgICAgICAgICAgIGluaXRfcHV0X2JpdHMoJmFyZ3MtPnBiLCBidWYgKyBza2lwLCBhcmdzLT5ieXRlcytzLT5wcmVmaXhfYnl0ZXMpOwogICAgICAgICAgICAgc2tpcCArPSBhcmdzLT5ieXRlczsKICAgICAgICAgfQogICAgIH0KQEAgLTgxOSw4ICs4MzUsNiBAQAogICogb2YgbGV2ZWxzLiBUaGUgcmVzdCBvZiB0aGUgYXJlYXMgY2FuIGJlIHRob3VnaHQgYXMgdGhlIGRldGFpbHMgbmVlZGVkCiAgKiB0byByZXN0b3JlIHRoZSBpbWFnZSBwZXJmZWN0bHkgdG8gaXRzIG9yaWdpbmFsIHNpemUuCiAgKi8KLQotCiBzdGF0aWMgaW50IGR3dF9wbGFuZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmFyZykKIHsKICAgICBUcmFuc2Zvcm1BcmdzICp0cmFuc2Zvcm1fZGF0ID0gYXJnOwpAQCAtODY3LDcgKzg4MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtZW1zZXQoYnVmLCAwLCAocC0+Y29lZl9zdHJpZGUqcC0+ZHd0X2hlaWdodCAtIHAtPmhlaWdodCpwLT53aWR0aCkqc2l6ZW9mKGR3dGNvZWYpKTsKKyAgICBtZW1zZXQoYnVmLCAwLCBwLT5jb2VmX3N0cmlkZSAqIChwLT5kd3RfaGVpZ2h0IC0gcC0+aGVpZ2h0KSAqIHNpemVvZihkd3Rjb2VmKSk7CiAKICAgICBmb3IgKGxldmVsID0gcy0+d2F2ZWxldF9kZXB0aC0xOyBsZXZlbCA+PSAwOyBsZXZlbC0tKSB7CiAgICAgICAgIGNvbnN0IFN1YkJhbmQgKmIgPSAmcC0+YmFuZFtsZXZlbF1bMF07CkBAIC04NzgsMTAgKzg5MiwzNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBlbmNvZGVfZnJhbWUoVkMyRW5jQ29udGV4dCAqcywgY29uc3QgQVZGcmFtZSAqZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXV4X2RhdGEsIGludCBmaWVsZCkKK3N0YXRpYyBpbnQgZW5jb2RlX2ZyYW1lKFZDMkVuY0NvbnRleHQgKnMsIEFWUGFja2V0ICphdnBrdCwgY29uc3QgQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphdXhfZGF0YSwgY29uc3QgaW50IGhlYWRlcl9zaXplLCBpbnQgZmllbGQpCiB7Ci0gICAgaW50IGk7CisgICAgaW50IGksIHJldDsKKyAgICBpbnQ2NF90IG1heF9mcmFtZV9ieXRlczsKKworICAgICAvKiBUaHJlYWRlZCBEV1QgdHJhbnNmb3JtICovCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBzLT50cmFuc2Zvcm1fYXJnc1tpXS5jdHggICA9IHM7CisgICAgICAgIHMtPnRyYW5zZm9ybV9hcmdzW2ldLmZpZWxkID0gZmllbGQ7CisgICAgICAgIHMtPnRyYW5zZm9ybV9hcmdzW2ldLnBsYW5lID0gJnMtPnBsYW5lW2ldOworICAgICAgICBzLT50cmFuc2Zvcm1fYXJnc1tpXS5pZGF0YSA9IGZyYW1lLT5kYXRhW2ldOworICAgICAgICBzLT50cmFuc2Zvcm1fYXJnc1tpXS5pc3RyaWRlID0gZnJhbWUtPmxpbmVzaXplW2ldOworICAgIH0KKyAgICBzLT5hdmN0eC0+ZXhlY3V0ZShzLT5hdmN0eCwgZHd0X3BsYW5lLCBzLT50cmFuc2Zvcm1fYXJncywgTlVMTCwgMywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVHJhbnNmb3JtQXJncykpOworCisgICAgLyogQ2FsY3VsYXRlIHBlci1zbGljZSBxdWFudGl6ZXJzIGFuZCBzaXplcyAqLworICAgIG1heF9mcmFtZV9ieXRlcyA9IGhlYWRlcl9zaXplICsgY2FsY19zbGljZV9zaXplcyhzKTsKKworICAgIGlmIChmaWVsZCA8IDIpIHsKKyAgICAgICAgcmV0ID0gZmZfYWxsb2NfcGFja2V0MihzLT5hdmN0eCwgYXZwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2ZyYW1lX2J5dGVzIDw8IHMtPmludGVybGFjZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2ZyYW1lX2J5dGVzIDw8IHMtPmludGVybGFjZWQpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGdldHRpbmcgb3V0cHV0IHBhY2tldC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgYXZwa3QtPmRhdGEsIGF2cGt0LT5zaXplKTsKKyAgICB9CiAKICAgICAvKiBTZXF1ZW5jZSBoZWFkZXIgKi8KICAgICBlbmNvZGVfcGFyc2VfaW5mbyhzLCBESVJBQ19QQ09ERV9TRVFfSEVBREVSKTsKQEAgLTg5Nyw3NCArOTM3LDY0IEBACiAgICAgZW5jb2RlX3BhcnNlX2luZm8ocywgRElSQUNfUENPREVfUElDVFVSRV9IUSk7CiAgICAgZW5jb2RlX3BpY3R1cmVfc3RhcnQocyk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIHMtPnRyYW5zZm9ybV9hcmdzW2ldLmN0eCAgID0gczsKLSAgICAgICAgcy0+dHJhbnNmb3JtX2FyZ3NbaV0uZmllbGQgPSBmaWVsZDsKLSAgICAgICAgcy0+dHJhbnNmb3JtX2FyZ3NbaV0ucGxhbmUgPSAmcy0+cGxhbmVbaV07Ci0gICAgICAgIHMtPnRyYW5zZm9ybV9hcmdzW2ldLmlkYXRhID0gZnJhbWUtPmRhdGFbaV07Ci0gICAgICAgIHMtPnRyYW5zZm9ybV9hcmdzW2ldLmlzdHJpZGUgPSBmcmFtZS0+bGluZXNpemVbaV07Ci0gICAgfQotCi0gICAgLyogRG8gYSBEV1QgdHJhbnNmb3JtICovCi0gICAgcy0+YXZjdHgtPmV4ZWN1dGUocy0+YXZjdHgsIGR3dF9wbGFuZSwgcy0+dHJhbnNmb3JtX2FyZ3MsIE5VTEwsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFRyYW5zZm9ybUFyZ3MpKTsKLQotICAgIC8qIENhbGN1bGF0ZSBwZXItc2xpY2UgcXVhbnRpemVycyBhbmQgc2l6ZXMgKi8KLSAgICBjYWxjX3NsaWNlX3NpemVzKHMpOwotCi0gICAgLyogSW5pdCBwbGFuZXMgYW5kIGVuY29kZSBzbGljZXMgKi8KKyAgICAvKiBFbmNvZGUgc2xpY2VzICovCiAgICAgZW5jb2RlX3NsaWNlcyhzKTsKIAogICAgIC8qIEVuZCBzZXF1ZW5jZSAqLwogICAgIGVuY29kZV9wYXJzZV9pbmZvKHMsIERJUkFDX1BDT0RFX0VORF9TRVEpOworCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBhdl9jb2xkIGludCB2YzJfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpmcmFtZSwgaW50ICpnb3RfcGFja2V0X3B0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X3BhY2tldCkKIHsKLSAgICBpbnQgcmV0OwotICAgIGludCBtYXhfZnJhbWVfYnl0ZXMsIHNpZ19zaXplID0gMjU2OworICAgIGludCByZXQgPSAwOworICAgIGludCBzbGljZV9jZWlsLCBzaWdfc2l6ZSA9IDI1NjsKICAgICBWQzJFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBjb25zdCBjaGFyIGF1eF9kYXRhW10gPSAiRkZtcGVnIHZlcnNpb24gIkZGTVBFR19WRVJTSU9OOwotICAgIGNvbnN0IGludCBhdXhfZGF0YV9zaXplID0gc2l6ZW9mKGF1eF9kYXRhKTsKKyAgICBjb25zdCBpbnQgYml0ZXhhY3QgPSBhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0JJVEVYQUNUOworICAgIGNvbnN0IGNoYXIgKmF1eF9kYXRhID0gYml0ZXhhY3QgPyAiTGF2YyIgOiBMSUJBVkNPREVDX0lERU5UOworICAgIGNvbnN0IGludCBhdXhfZGF0YV9zaXplID0gYml0ZXhhY3QgPyBzaXplb2YoIkxhdmMiKSA6IHNpemVvZihMSUJBVkNPREVDX0lERU5UKTsKICAgICBjb25zdCBpbnQgaGVhZGVyX3NpemUgPSAxMDAgKyBhdXhfZGF0YV9zaXplOwogICAgIGludDY0X3Qgcl9iaXRyYXRlID0gYXZjdHgtPmJpdF9yYXRlID4+IChzLT5pbnRlcmxhY2VkKTsKIAogICAgIHMtPmF2Y3R4ID0gYXZjdHg7Ci0gICAgcy0+c2l6ZV9zY2FsZXIgPSAxOworICAgIHMtPnNpemVfc2NhbGVyID0gMjsKICAgICBzLT5wcmVmaXhfYnl0ZXMgPSAwOwogICAgIHMtPmxhc3RfcGFyc2VfY29kZSA9IDA7CiAgICAgcy0+bmV4dF9wYXJzZV9vZmZzZXQgPSAwOwogCiAgICAgLyogUmF0ZSBjb250cm9sICovCi0gICAgbWF4X2ZyYW1lX2J5dGVzID0gKGF2X3Jlc2NhbGUocl9iaXRyYXRlLCBzLT5hdmN0eC0+dGltZV9iYXNlLm51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+dGltZV9iYXNlLmRlbikgPj4gMykgLSBoZWFkZXJfc2l6ZTsKKyAgICBzLT5mcmFtZV9tYXhfYnl0ZXMgPSAoYXZfcmVzY2FsZShyX2JpdHJhdGUsIHMtPmF2Y3R4LT50aW1lX2Jhc2UubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuKSA+PiAzKSAtIGhlYWRlcl9zaXplOworICAgIHMtPnNsaWNlX21heF9ieXRlcyA9IHNsaWNlX2NlaWwgPSBhdl9yZXNjYWxlKHMtPmZyYW1lX21heF9ieXRlcywgMSwgcy0+bnVtX3gqcy0+bnVtX3kpOwogCiAgICAgLyogRmluZCBhbiBhcHByb3ByaWF0ZSBzaXplIHNjYWxlciAqLwogICAgIHdoaWxlIChzaWdfc2l6ZSA+IDI1NSkgewotICAgICAgICBzLT5zbGljZV9tYXhfYnl0ZXMgPSBGRkFMSUdOKGF2X3Jlc2NhbGUobWF4X2ZyYW1lX2J5dGVzLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm51bV94KnMtPm51bV95KSwgcy0+c2l6ZV9zY2FsZXIpOwotICAgICAgICBzLT5zbGljZV9tYXhfYnl0ZXMgKz0gNCArIHMtPnByZWZpeF9ieXRlczsKLSAgICAgICAgc2lnX3NpemUgPSBzLT5zbGljZV9tYXhfYnl0ZXMvcy0+c2l6ZV9zY2FsZXI7IC8qIFNpZ25hbGxlZCBzbGl6ZSBzaXplICovCisgICAgICAgIGludCByX3NpemUgPSBTU0laRV9ST1VORChzLT5zbGljZV9tYXhfYnl0ZXMpOworICAgICAgICBpZiAocl9zaXplID4gc2xpY2VfY2VpbCkgeworICAgICAgICAgICAgcy0+c2xpY2VfbWF4X2J5dGVzIC09IHJfc2l6ZSAtIHNsaWNlX2NlaWw7CisgICAgICAgICAgICByX3NpemUgPSBTU0laRV9ST1VORChzLT5zbGljZV9tYXhfYnl0ZXMpOworICAgICAgICB9CisgICAgICAgIHNpZ19zaXplID0gcl9zaXplL3MtPnNpemVfc2NhbGVyOyAvKiBTaWduYWxsZWQgc2xpemUgc2l6ZSAqLwogICAgICAgICBzLT5zaXplX3NjYWxlciA8PD0gMTsKICAgICB9CiAKLSAgICByZXQgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBhdnBrdCwgbWF4X2ZyYW1lX2J5dGVzKjIsIDApOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBvdXRwdXQgcGFja2V0LlxuIik7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW5pdF9wdXRfYml0cygmcy0+cGIsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7Ci0gICAgfQorICAgIHMtPnNsaWNlX21pbl9ieXRlcyA9IHMtPnNsaWNlX21heF9ieXRlcyAtIHMtPnNsaWNlX21heF9ieXRlcyoocy0+dG9sZXJhbmNlLzEwMC4wZik7CiAKLSAgICBlbmNvZGVfZnJhbWUocywgZnJhbWUsIGF1eF9kYXRhLCBzLT5pbnRlcmxhY2VkKTsKLSAgICBpZiAocy0+aW50ZXJsYWNlZCkKLSAgICAgICAgZW5jb2RlX2ZyYW1lKHMsIGZyYW1lLCBOVUxMLCAyKTsKKyAgICByZXQgPSBlbmNvZGVfZnJhbWUocywgYXZwa3QsIGZyYW1lLCBhdXhfZGF0YSwgaGVhZGVyX3NpemUsIHMtPmludGVybGFjZWQpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHMtPmludGVybGFjZWQpIHsKKyAgICAgICAgcmV0ID0gZW5jb2RlX2ZyYW1lKHMsIGF2cGt0LCBmcmFtZSwgYXV4X2RhdGEsIGhlYWRlcl9zaXplLCAyKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCiAgICAgZmx1c2hfcHV0X2JpdHMoJnMtPnBiKTsKICAgICBhdnBrdC0+c2l6ZSA9IHB1dF9iaXRzX2NvdW50KCZzLT5wYikgPj4gMzsKIAotICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CisgICAgKmdvdF9wYWNrZXQgPSAxOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC05NzQsMzAgKzEwMDQsMzEgQEAKICAgICBpbnQgaTsKICAgICBWQzJFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKIAorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJRYXZnOiAlaVxuIiwgcy0+cV9hdmcpOworCiAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICBmZl92YzJlbmNfZnJlZV90cmFuc2Zvcm1zKCZzLT50cmFuc2Zvcm1fYXJnc1tpXS50KTsKICAgICAgICAgYXZfZnJlZXAoJnMtPnBsYW5lW2ldLmNvZWZfYnVmKTsKICAgICB9CiAKICAgICBhdl9mcmVlcCgmcy0+c2xpY2VfYXJncyk7Ci0gICAgYXZfZnJlZXAoJnMtPmNvZWZfbHV0X2xlbik7Ci0gICAgYXZfZnJlZXAoJnMtPmNvZWZfbHV0X3ZhbCk7CiAKICAgICByZXR1cm4gMDsKIH0KIAotCiBzdGF0aWMgYXZfY29sZCBpbnQgdmMyX2VuY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKICAgICBQbGFuZSAqcDsKICAgICBTdWJCYW5kICpiOwotICAgIGludCBpLCBqLCBsZXZlbCwgbywgc2hpZnQ7CisgICAgaW50IGksIGxldmVsLCBvLCBzaGlmdCwgcmV0OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZm10ID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CisgICAgY29uc3QgaW50IGRlcHRoID0gZm10LT5jb21wWzBdLmRlcHRoOwogICAgIFZDMkVuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogCiAgICAgcy0+cGljdHVyZV9udW1iZXIgPSAwOwogCiAgICAgLyogVG90YWwgYWxsb3dlZCBxdWFudGl6YXRpb24gcmFuZ2UgKi8KLSAgICBzLT5xX2NlaWwgICAgPSBNQVhfUVVBTlRfSU5ERVg7CisgICAgcy0+cV9jZWlsICAgID0gRElSQUNfTUFYX1FVQU5UX0lOREVYOwogCiAgICAgcy0+dmVyLm1ham9yID0gMjsKICAgICBzLT52ZXIubWlub3IgPSAwOwpAQCAtMTAwNyw0NCArMTAzOCwzMSBAQAogICAgIHMtPmJhc2VfdmYgICA9IC0xOwogICAgIHMtPnN0cmljdF9jb21wbGlhbmNlID0gMTsKIAorICAgIHMtPnFfYXZnID0gMDsKKyAgICBzLT5zbGljZV9tYXhfYnl0ZXMgPSAwOworICAgIHMtPnNsaWNlX21pbl9ieXRlcyA9IDA7CisKICAgICAvKiBNYXJrIHVua25vd24gYXMgcHJvZ3Jlc3NpdmUgKi8KICAgICBzLT5pbnRlcmxhY2VkID0gISgoYXZjdHgtPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1VOS05PV04pIHx8CiAgICAgICAgICAgICAgICAgICAgICAgKGF2Y3R4LT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9QUk9HUkVTU0lWRSkpOwogCi0gICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUDEwKSB7Ci0gICAgICAgIGlmIChhdmN0eC0+d2lkdGggPT0gMTI4MCAmJiBhdmN0eC0+aGVpZ2h0ID09IDcyMCkgewotICAgICAgICAgICAgcy0+bGV2ZWwgPSAzOwotICAgICAgICAgICAgaWYgKGF2Y3R4LT50aW1lX2Jhc2UubnVtID09IDEwMDEgJiYgYXZjdHgtPnRpbWVfYmFzZS5kZW4gPT0gNjAwMDApCi0gICAgICAgICAgICAgICAgcy0+YmFzZV92ZiA9IDk7Ci0gICAgICAgICAgICBpZiAoYXZjdHgtPnRpbWVfYmFzZS5udW0gPT0gMSAmJiBhdmN0eC0+dGltZV9iYXNlLmRlbiA9PSA1MCkKLSAgICAgICAgICAgICAgICBzLT5iYXNlX3ZmID0gMTA7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPndpZHRoID09IDE5MjAgJiYgYXZjdHgtPmhlaWdodCA9PSAxMDgwKSB7Ci0gICAgICAgICAgICBzLT5sZXZlbCA9IDM7Ci0gICAgICAgICAgICBpZiAocy0+aW50ZXJsYWNlZCkgewotICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+dGltZV9iYXNlLm51bSA9PSAxMDAxICYmIGF2Y3R4LT50aW1lX2Jhc2UuZGVuID09IDMwMDAwKQotICAgICAgICAgICAgICAgICAgICBzLT5iYXNlX3ZmID0gMTE7Ci0gICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT50aW1lX2Jhc2UubnVtID09IDEgJiYgYXZjdHgtPnRpbWVfYmFzZS5kZW4gPT0gNTApCi0gICAgICAgICAgICAgICAgICAgIHMtPmJhc2VfdmYgPSAxMjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT50aW1lX2Jhc2UubnVtID09IDEwMDEgJiYgYXZjdHgtPnRpbWVfYmFzZS5kZW4gPT0gNjAwMDApCi0gICAgICAgICAgICAgICAgICAgIHMtPmJhc2VfdmYgPSAxMzsKLSAgICAgICAgICAgICAgICBpZiAoYXZjdHgtPnRpbWVfYmFzZS5udW0gPT0gMSAmJiBhdmN0eC0+dGltZV9iYXNlLmRlbiA9PSA1MCkKLSAgICAgICAgICAgICAgICAgICAgcy0+YmFzZV92ZiA9IDE0OwotICAgICAgICAgICAgICAgIGlmIChhdmN0eC0+dGltZV9iYXNlLm51bSA9PSAxMDAxICYmIGF2Y3R4LT50aW1lX2Jhc2UuZGVuID09IDI0MDAwKQotICAgICAgICAgICAgICAgICAgICBzLT5iYXNlX3ZmID0gMjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPndpZHRoID09IDM4NDAgJiYgYXZjdHgtPmhlaWdodCA9PSAyMTYwKSB7Ci0gICAgICAgICAgICBzLT5sZXZlbCA9IDY7Ci0gICAgICAgICAgICBpZiAoYXZjdHgtPnRpbWVfYmFzZS5udW0gPT0gMTAwMSAmJiBhdmN0eC0+dGltZV9iYXNlLmRlbiA9PSA2MDAwMCkKLSAgICAgICAgICAgICAgICBzLT5iYXNlX3ZmID0gMTc7Ci0gICAgICAgICAgICBpZiAoYXZjdHgtPnRpbWVfYmFzZS5udW0gPT0gMSAmJiBhdmN0eC0+dGltZV9iYXNlLmRlbiA9PSA1MCkKLSAgICAgICAgICAgICAgICBzLT5iYXNlX3ZmID0gMTg7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocy0+aW50ZXJsYWNlZCAmJiBzLT5iYXNlX3ZmIDw9IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnRlcmxhY2luZyBub3Qgc3VwcG9ydGVkIHdpdGggbm9uIHN0YW5kYXJkIGZvcm1hdHMhXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYmFzZV92aWRlb19mbXRzX2xlbjsgaSsrKSB7CisgICAgICAgIGNvbnN0IFZDMkJhc2VWaWRlb0Zvcm1hdCAqZm10ID0gJmJhc2VfdmlkZW9fZm10c1tpXTsKKyAgICAgICAgaWYgKGF2Y3R4LT5waXhfZm10ICE9IGZtdC0+cGl4X2ZtdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYXZjdHgtPnRpbWVfYmFzZS5udW0gIT0gZm10LT50aW1lX2Jhc2UubnVtKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChhdmN0eC0+dGltZV9iYXNlLmRlbiAhPSBmbXQtPnRpbWVfYmFzZS5kZW4pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGF2Y3R4LT53aWR0aCAhPSBmbXQtPndpZHRoKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChhdmN0eC0+aGVpZ2h0ICE9IGZtdC0+aGVpZ2h0KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzLT5pbnRlcmxhY2VkICE9IGZtdC0+aW50ZXJsYWNlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBzLT5iYXNlX3ZmID0gaTsKKyAgICAgICAgcy0+bGV2ZWwgICA9IGJhc2VfdmlkZW9fZm10c1tpXS5sZXZlbDsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgaWYgKHMtPmludGVybGFjZWQpCkBAIC0xMDYzLDE5ICsxMDgxLDQzIEBACiAgICAgfQogCiAgICAgaWYgKHMtPmJhc2VfdmYgPD0gMCkgewotICAgICAgICBpZiAoYXZjdHgtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8PSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPCBGRl9DT01QTElBTkNFX1NUUklDVCkgewogICAgICAgICAgICAgcy0+c3RyaWN0X2NvbXBsaWFuY2UgPSBzLT5iYXNlX3ZmID0gMDsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEaXNhYmxpbmcgc3RyaWN0IGNvbXBsaWFuY2VcbiIpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkZvcm1hdCBkb2VzIG5vdCBzdHJpY3RseSBjb21wbHkgd2l0aCBWQzIgc3BlY3NcbiIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkdpdmVuIGZvcm1hdCBkb2VzIG5vdCBzdHJpY3RseSBjb21wbHkgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgInRoZSBzcGVjaWZpY2F0aW9ucywgcGxlYXNlIGFkZCBhIC1zdHJpY3QgLTEgZmxhZyB0byB1c2UgaXRcbiIpOworICAgICAgICAgICAgICAgICAgICJ0aGUgc3BlY2lmaWNhdGlvbnMsIGRlY3JlYXNlIHN0cmljdG5lc3MgdG8gdXNlIGl0LlxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlNlbGVjdGVkIGJhc2UgdmlkZW8gZm9ybWF0ID0gJWlcbiIsIHMtPmJhc2VfdmYpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiU2VsZWN0ZWQgYmFzZSB2aWRlbyBmb3JtYXQgPSAlaSAoJXMpXG4iLAorICAgICAgICAgICAgICAgcy0+YmFzZV92ZiwgYmFzZV92aWRlb19mbXRzW3MtPmJhc2VfdmZdLm5hbWUpOwogICAgIH0KIAotICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LCAmcy0+Y2hyb21hX3hfc2hpZnQsICZzLT5jaHJvbWFfeV9zaGlmdCk7CisgICAgLyogQ2hyb21hIHN1YnNhbXBsaW5nICovCisgICAgcmV0ID0gYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZzLT5jaHJvbWFfeF9zaGlmdCwgJnMtPmNocm9tYV95X3NoaWZ0KTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogQml0IGRlcHRoIGFuZCBjb2xvciByYW5nZSBpbmRleCAqLworICAgIGlmIChkZXB0aCA9PSA4ICYmIGF2Y3R4LT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHKSB7CisgICAgICAgIHMtPmJwcCA9IDE7CisgICAgICAgIHMtPmJwcF9pZHggPSAxOworICAgICAgICBzLT5kaWZmX29mZnNldCA9IDEyODsKKyAgICB9IGVsc2UgaWYgKGRlcHRoID09IDggJiYgKGF2Y3R4LT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9NUEVHIHx8CisgICAgICAgICAgICAgICBhdmN0eC0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQpKSB7CisgICAgICAgIHMtPmJwcCA9IDE7CisgICAgICAgIHMtPmJwcF9pZHggPSAyOworICAgICAgICBzLT5kaWZmX29mZnNldCA9IDEyODsKKyAgICB9IGVsc2UgaWYgKGRlcHRoID09IDEwKSB7CisgICAgICAgIHMtPmJwcCA9IDI7CisgICAgICAgIHMtPmJwcF9pZHggPSAzOworICAgICAgICBzLT5kaWZmX29mZnNldCA9IDUxMjsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5icHAgPSAyOworICAgICAgICBzLT5icHBfaWR4ID0gNDsKKyAgICAgICAgcy0+ZGlmZl9vZmZzZXQgPSAyMDQ4OworICAgIH0KIAogICAgIC8qIFBsYW5lcyBpbml0aWFsaXphdGlvbiAqLwogICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKQEAgLTEwODgsNyArMTEzMCw3IEBACiAgICAgICAgIHAtPmR3dF93aWR0aCAgPSB3ID0gRkZBTElHTihwLT53aWR0aCwgICgxIDw8IHMtPndhdmVsZXRfZGVwdGgpKTsKICAgICAgICAgcC0+ZHd0X2hlaWdodCA9IGggPSBGRkFMSUdOKHAtPmhlaWdodCwgKDEgPDwgcy0+d2F2ZWxldF9kZXB0aCkpOwogICAgICAgICBwLT5jb2VmX3N0cmlkZSA9IEZGQUxJR04ocC0+ZHd0X3dpZHRoLCAzMik7Ci0gICAgICAgIHAtPmNvZWZfYnVmID0gYXZfbWFsbG9jKHAtPmNvZWZfc3RyaWRlKnAtPmR3dF9oZWlnaHQqc2l6ZW9mKGR3dGNvZWYpKTsKKyAgICAgICAgcC0+Y29lZl9idWYgPSBhdl9tYWxsb2N6KHAtPmNvZWZfc3RyaWRlKnAtPmR3dF9oZWlnaHQqc2l6ZW9mKGR3dGNvZWYpKTsKICAgICAgICAgaWYgKCFwLT5jb2VmX2J1ZikKICAgICAgICAgICAgIGdvdG8gYWxsb2NfZmFpbDsKICAgICAgICAgZm9yIChsZXZlbCA9IHMtPndhdmVsZXRfZGVwdGgtMTsgbGV2ZWwgPj0gMDsgbGV2ZWwtLSkgewpAQCAtMTEwNiw4ICsxMTQ4LDkgQEAKIAogICAgICAgICAvKiBEV1QgaW5pdCAqLwogICAgICAgICBpZiAoZmZfdmMyZW5jX2luaXRfdHJhbnNmb3Jtcygmcy0+dHJhbnNmb3JtX2FyZ3NbaV0udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZVswXS5jb2VmX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZVswXS5kd3RfaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVbaV0uY29lZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBsYW5lW2ldLmR3dF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNsaWNlX3dpZHRoLCBzLT5zbGljZV9oZWlnaHQpKQogICAgICAgICAgICAgZ290byBhbGxvY19mYWlsOwogICAgIH0KIApAQCAtMTExNSwyNCArMTE1OCwyNCBAQAogICAgIHMtPm51bV94ID0gcy0+cGxhbmVbMF0uZHd0X3dpZHRoL3MtPnNsaWNlX3dpZHRoOwogICAgIHMtPm51bV95ID0gcy0+cGxhbmVbMF0uZHd0X2hlaWdodC9zLT5zbGljZV9oZWlnaHQ7CiAKLSAgICBzLT5zbGljZV9hcmdzID0gYXZfbWFsbG9jKHMtPm51bV94KnMtPm51bV95KnNpemVvZihTbGljZUFyZ3MpKTsKKyAgICBzLT5zbGljZV9hcmdzID0gYXZfY2FsbG9jKHMtPm51bV94KnMtPm51bV95LCBzaXplb2YoU2xpY2VBcmdzKSk7CiAgICAgaWYgKCFzLT5zbGljZV9hcmdzKQogICAgICAgICBnb3RvIGFsbG9jX2ZhaWw7CiAKLSAgICAvKiBMb29rdXAgdGFibGVzICovCi0gICAgcy0+Y29lZl9sdXRfbGVuID0gYXZfbWFsbG9jKDIqQ09FRl9MVVRfVEFCKnMtPnFfY2VpbCpzaXplb2YoKnMtPmNvZWZfbHV0X2xlbikpOwotICAgIGlmICghcy0+Y29lZl9sdXRfbGVuKQotICAgICAgICBnb3RvIGFsbG9jX2ZhaWw7Ci0KLSAgICBzLT5jb2VmX2x1dF92YWwgPSBhdl9tYWxsb2MoMipDT0VGX0xVVF9UQUIqcy0+cV9jZWlsKnNpemVvZigqcy0+Y29lZl9sdXRfdmFsKSk7Ci0gICAgaWYgKCFzLT5jb2VmX2x1dF92YWwpCi0gICAgICAgIGdvdG8gYWxsb2NfZmFpbDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5xX2NlaWw7IGkrKykgewotICAgICAgICBmb3IgKGogPSAtQ09FRl9MVVRfVEFCOyBqIDwgQ09FRl9MVVRfVEFCOyBqKyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgICpsZW5fbHV0ID0gJnMtPmNvZWZfbHV0X2xlblsyKmkqQ09FRl9MVVRfVEFCICsgQ09FRl9MVVRfVEFCXTsKLSAgICAgICAgICAgIHVpbnQzMl90ICp2YWxfbHV0ID0gJnMtPmNvZWZfbHV0X3ZhbFsyKmkqQ09FRl9MVVRfVEFCICsgQ09FRl9MVVRfVEFCXTsKLSAgICAgICAgICAgIGNvZWZmX3F1YW50aXplX2dldChqLCBmZl9kaXJhY19xc2NhbGVfdGFiW2ldLCAmbGVuX2x1dFtqXSwgJnZhbF9sdXRbal0pOworICAgIGZvciAoaSA9IDA7IGkgPCAxMTY7IGkrKykgeworICAgICAgICBjb25zdCB1aW50NjRfdCBxZiA9IGZmX2RpcmFjX3FzY2FsZV90YWJbaV07CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG0gPSBhdl9sb2cyKHFmKTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgdCA9ICgxVUxMIDw8IChtICsgMzIpKSAvIHFmOworICAgICAgICBjb25zdCB1aW50MzJfdCByID0gKHQqcWYgKyBxZikgJiBVSU5UMzJfTUFYOworICAgICAgICBpZiAoIShxZiAmIChxZiAtIDEpKSkgeworICAgICAgICAgICAgcy0+cW1hZ2ljX2x1dFtpXVswXSA9IDB4RkZGRkZGRkY7CisgICAgICAgICAgICBzLT5xbWFnaWNfbHV0W2ldWzFdID0gMHhGRkZGRkZGRjsKKyAgICAgICAgfSBlbHNlIGlmIChyIDw9IDEgPDwgbSkgeworICAgICAgICAgICAgcy0+cW1hZ2ljX2x1dFtpXVswXSA9IHQgKyAxOworICAgICAgICAgICAgcy0+cW1hZ2ljX2x1dFtpXVsxXSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5xbWFnaWNfbHV0W2ldWzBdID0gdDsKKyAgICAgICAgICAgIHMtPnFtYWdpY19sdXRbaV1bMV0gPSB0OwogICAgICAgICB9CiAgICAgfQogCkBAIC0xMTQ2LDEzICsxMTg5LDE1IEBACiAKICNkZWZpbmUgVkMyRU5DX0ZMQUdTIChBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNKQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHZjMmVuY19vcHRpb25zW10gPSB7Ci0gICAgeyJ0b2xlcmFuY2UiLCAgICAgIk1heCB1bmRlcnNob290IGluIHBlcmNlbnQiLCBvZmZzZXRvZihWQzJFbmNDb250ZXh0LCB0b2xlcmFuY2UpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gMTAuMGZ9LCAwLjBmLCA0NS4wZiwgVkMyRU5DX0ZMQUdTLCAidG9sZXJhbmNlIn0sCi0gICAgeyJzbGljZV93aWR0aCIsICAgIlNsaWNlIHdpZHRoIiwgIG9mZnNldG9mKFZDMkVuY0NvbnRleHQsIHNsaWNlX3dpZHRoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEyOH0sIDMyLCAxMDI0LCBWQzJFTkNfRkxBR1MsICJzbGljZV93aWR0aCJ9LAotICAgIHsic2xpY2VfaGVpZ2h0IiwgICJTbGljZSBoZWlnaHQiLCBvZmZzZXRvZihWQzJFbmNDb250ZXh0LCBzbGljZV9oZWlnaHQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNjR9LCA4LCAxMDI0LCBWQzJFTkNfRkxBR1MsICJzbGljZV9oZWlnaHQifSwKLSAgICB7IndhdmVsZXRfZGVwdGgiLCAiVHJhbnNmb3JtIGRlcHRoIiwgb2Zmc2V0b2YoVkMyRW5jQ29udGV4dCwgd2F2ZWxldF9kZXB0aCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA1fSwgMSwgNSwgVkMyRU5DX0ZMQUdTLCAid2F2ZWxldF9kZXB0aCJ9LAorICAgIHsidG9sZXJhbmNlIiwgICAgICJNYXggdW5kZXJzaG9vdCBpbiBwZXJjZW50Iiwgb2Zmc2V0b2YoVkMyRW5jQ29udGV4dCwgdG9sZXJhbmNlKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibCA9IDUuMGZ9LCAwLjBmLCA0NS4wZiwgVkMyRU5DX0ZMQUdTLCAidG9sZXJhbmNlIn0sCisgICAgeyJzbGljZV93aWR0aCIsICAgIlNsaWNlIHdpZHRoIiwgIG9mZnNldG9mKFZDMkVuY0NvbnRleHQsIHNsaWNlX3dpZHRoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDMyfSwgMzIsIDEwMjQsIFZDMkVOQ19GTEFHUywgInNsaWNlX3dpZHRoIn0sCisgICAgeyJzbGljZV9oZWlnaHQiLCAgIlNsaWNlIGhlaWdodCIsIG9mZnNldG9mKFZDMkVuY0NvbnRleHQsIHNsaWNlX2hlaWdodCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxNn0sIDgsIDEwMjQsIFZDMkVOQ19GTEFHUywgInNsaWNlX2hlaWdodCJ9LAorICAgIHsid2F2ZWxldF9kZXB0aCIsICJUcmFuc2Zvcm0gZGVwdGgiLCBvZmZzZXRvZihWQzJFbmNDb250ZXh0LCB3YXZlbGV0X2RlcHRoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDR9LCAxLCA1LCBWQzJFTkNfRkxBR1MsICJ3YXZlbGV0X2RlcHRoIn0sCiAgICAgeyJ3YXZlbGV0X3R5cGUiLCAgIlRyYW5zZm9ybSB0eXBlIiwgIG9mZnNldG9mKFZDMkVuY0NvbnRleHQsIHdhdmVsZXRfaWR4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFZDMl9UUkFOU0ZPUk1fOV83fSwgMCwgVkMyX1RSQU5TRk9STVNfTkIsIFZDMkVOQ19GTEFHUywgIndhdmVsZXRfaWR4In0sCi0gICAgICAgIHsiOV83IiwgICAgICAgIkRlc2xhdXJpZXJzLUR1YnVjICg5LDcpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVkMyX1RSQU5TRk9STV85Xzd9LCBJTlRfTUlOLCBJTlRfTUFYLCBWQzJFTkNfRkxBR1MsICJ3YXZlbGV0X2lkeCJ9LAotICAgICAgICB7IjVfMyIsICAgICAgICJMZUdhbGwgKDUsMykiLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZDMl9UUkFOU0ZPUk1fNV8zfSwgSU5UX01JTiwgSU5UX01BWCwgVkMyRU5DX0ZMQUdTLCAid2F2ZWxldF9pZHgifSwKKyAgICAgICAgeyI5XzciLCAgICAgICAgICAiRGVzbGF1cmllcnMtRHVidWMgKDksNykiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBWQzJfVFJBTlNGT1JNXzlfN30sICAgIElOVF9NSU4sIElOVF9NQVgsIFZDMkVOQ19GTEFHUywgIndhdmVsZXRfaWR4In0sCisgICAgICAgIHsiNV8zIiwgICAgICAgICAgIkxlR2FsbCAoNSwzKSIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVkMyX1RSQU5TRk9STV81XzN9LCAgICBJTlRfTUlOLCBJTlRfTUFYLCBWQzJFTkNfRkxBR1MsICJ3YXZlbGV0X2lkeCJ9LAorICAgICAgICB7ImhhYXIiLCAgICAgICAgICJIYWFyICh3aXRoIHNoaWZ0KSIsICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZDMl9UUkFOU0ZPUk1fSEFBUl9TfSwgSU5UX01JTiwgSU5UX01BWCwgVkMyRU5DX0ZMQUdTLCAid2F2ZWxldF9pZHgifSwKKyAgICAgICAgeyJoYWFyX25vc2hpZnQiLCAiSGFhciAod2l0aG91dCBzaGlmdCkiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBWQzJfVFJBTlNGT1JNX0hBQVJ9LCAgIElOVF9NSU4sIElOVF9NQVgsIFZDMkVOQ19GTEFHUywgIndhdmVsZXRfaWR4In0sCiAgICAgeyJxbSIsICJDdXN0b20gcXVhbnRpemF0aW9uIG1hdHJpeCIsIG9mZnNldG9mKFZDMkVuY0NvbnRleHQsIHF1YW50X21hdHJpeCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBWQzJfUU1fREVGfSwgMCwgVkMyX1FNX05CLCBWQzJFTkNfRkxBR1MsICJxdWFudF9tYXRyaXgifSwKICAgICAgICAgeyJkZWZhdWx0IiwgICAiRGVmYXVsdCBmcm9tIHRoZSBzcGVjaWZpY2F0aW9ucyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZDMl9RTV9ERUZ9LCBJTlRfTUlOLCBJTlRfTUFYLCBWQzJFTkNfRkxBR1MsICJxdWFudF9tYXRyaXgifSwKICAgICAgICAgeyJjb2xvciIsICAgICAiUHJldmVudHMgbG93IGJpdHJhdGUgZGlzY29sb3JhdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZDMl9RTV9DT0x9LCBJTlRfTUlOLCBJTlRfTUFYLCBWQzJFTkNfRkxBR1MsICJxdWFudF9tYXRyaXgifSwKQEAgLTExODEsMTYgKzEyMjYsMTcgQEAKIH07CiAKIEFWQ29kZWMgZmZfdmMyX2VuY29kZXIgPSB7Ci0gICAgLm5hbWUgPSAidmMyIiwKLSAgICAubG9uZ19uYW1lID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNNUFRFIFZDLTIiKSwKLSAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgPSBBVl9DT0RFQ19JRF9ESVJBQywKKyAgICAubmFtZSAgICAgICAgICAgPSAidmMyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU01QVEUgVkMtMiIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9ESVJBQywKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkMyRW5jQ29udGV4dCksCi0gICAgLmluaXQgPSB2YzJfZW5jb2RlX2luaXQsCi0gICAgLmNsb3NlID0gdmMyX2VuY29kZV9lbmQsCi0gICAgLmNhcGFiaWxpdGllcyA9IEFWX0NPREVDX0NBUF9TTElDRV9USFJFQURTLAotICAgIC5lbmNvZGUyID0gdmMyX2VuY29kZV9mcmFtZSwKLSAgICAucHJpdl9jbGFzcyA9ICZ2YzJlbmNfY2xhc3MsCi0gICAgLmRlZmF1bHRzID0gdmMyZW5jX2RlZmF1bHRzLAotICAgIC5waXhfZm10cyA9IGFsbG93ZWRfcGl4X2ZtdHMKKyAgICAuaW5pdCAgICAgICAgICAgPSB2YzJfZW5jb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0gdmMyX2VuY29kZV9lbmQsCisgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKKyAgICAuZW5jb2RlMiAgICAgICAgPSB2YzJfZW5jb2RlX2ZyYW1lLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ2YzJlbmNfY2xhc3MsCisgICAgLmRlZmF1bHRzICAgICAgID0gdmMyZW5jX2RlZmF1bHRzLAorICAgIC5waXhfZm10cyAgICAgICA9IGFsbG93ZWRfcGl4X2ZtdHMKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZjMmVuY19kd3QuYyBiL2xpYmF2Y29kZWMvdmMyZW5jX2R3dC5jCmluZGV4IGViMzQxNjguLmQyMmFmOGEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmMyZW5jX2R3dC5jCisrKyBiL2xpYmF2Y29kZWMvdmMyZW5jX2R3dC5jCkBAIC0yMTEsMTkgKzIxMSw3MSBAQAogICAgIGRlaW50ZXJsZWF2ZShkYXRhLCBzdHJpZGUsIHdpZHRoLCBoZWlnaHQsIHN5bnRoKTsKIH0KIAotYXZfY29sZCBpbnQgZmZfdmMyZW5jX2luaXRfdHJhbnNmb3JtcyhWQzJUcmFuc2Zvcm1Db250ZXh0ICpzLCBpbnQgcF93aWR0aCwgaW50IHBfaGVpZ2h0KQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBkd3RfaGFhcihWQzJUcmFuc2Zvcm1Db250ZXh0ICp0LCBkd3Rjb2VmICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzKQoreworICAgIGludCB4LCB5OworICAgIGR3dGNvZWYgKnN5bnRoID0gdC0+YnVmZmVyLCAqc3ludGhsID0gc3ludGgsICpkYXRhbCA9IGRhdGE7CisgICAgY29uc3QgcHRyZGlmZl90IHN5bnRoX3dpZHRoICA9IHdpZHRoICA8PCAxOworICAgIGNvbnN0IHB0cmRpZmZfdCBzeW50aF9oZWlnaHQgPSBoZWlnaHQgPDwgMTsKKworICAgIC8qIEhvcml6b250YWwgc3ludGhlc2lzLiAqLworICAgIGZvciAoeSA9IDA7IHkgPCBzeW50aF9oZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3ludGhfd2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgc3ludGhsW3kqc3ludGhfd2lkdGggKyB4ICsgMV0gPSAoZGF0YWxbeSpzdHJpZGUgKyB4ICsgMV0gPDwgcykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YWxbeSpzdHJpZGUgKyB4XSA8PCBzKTsKKyAgICAgICAgICAgIHN5bnRobFt5KnN5bnRoX3dpZHRoICsgeF0gPSAoZGF0YWxbeSpzdHJpZGUgKyB4ICsgMF0gPDwgcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3ludGhsW3kqc3ludGhfd2lkdGggKyB4ICsgMV0gKyAxKSA+PiAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFZlcnRpY2FsIHN5bnRoZXNpcy4gKi8KKyAgICBmb3IgKHggPSAwOyB4IDwgc3ludGhfd2lkdGg7IHgrKykgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc3ludGhfaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICAgICAgICAgIHN5bnRobFsoeSArIDEpKnN5bnRoX3dpZHRoICsgeF0gPSBzeW50aGxbKHkgKyAxKSpzeW50aF93aWR0aCArIHhdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aGxbeSpzeW50aF93aWR0aCArIHhdOworICAgICAgICAgICAgc3ludGhsW3kqc3ludGhfd2lkdGggKyB4XSA9IHN5bnRobFt5KnN5bnRoX3dpZHRoICsgeF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoc3ludGhsWyh5ICsgMSkqc3ludGhfd2lkdGggKyB4XSArIDEpID4+IDEpOworICAgICAgICB9CisgICAgfQorCisgICAgZGVpbnRlcmxlYXZlKGRhdGEsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCwgc3ludGgpOworfQorCitzdGF0aWMgdm9pZCB2YzJfc3ViYmFuZF9kd3RfaGFhcihWQzJUcmFuc2Zvcm1Db250ZXh0ICp0LCBkd3Rjb2VmICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGR3dF9oYWFyKHQsIGRhdGEsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZjMl9zdWJiYW5kX2R3dF9oYWFyX3NoaWZ0KFZDMlRyYW5zZm9ybUNvbnRleHQgKnQsIGR3dGNvZWYgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgZHd0X2hhYXIodCwgZGF0YSwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCAxKTsKK30KKworYXZfY29sZCBpbnQgZmZfdmMyZW5jX2luaXRfdHJhbnNmb3JtcyhWQzJUcmFuc2Zvcm1Db250ZXh0ICpzLCBpbnQgcF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwX2hlaWdodCwgaW50IHNsaWNlX3csIGludCBzbGljZV9oKQogewogICAgIHMtPnZjMl9zdWJiYW5kX2R3dFtWQzJfVFJBTlNGT1JNXzlfN10gICAgPSB2YzJfc3ViYmFuZF9kd3RfOTc7CiAgICAgcy0+dmMyX3N1YmJhbmRfZHd0W1ZDMl9UUkFOU0ZPUk1fNV8zXSAgICA9IHZjMl9zdWJiYW5kX2R3dF81MzsKKyAgICBzLT52YzJfc3ViYmFuZF9kd3RbVkMyX1RSQU5TRk9STV9IQUFSXSAgID0gdmMyX3N1YmJhbmRfZHd0X2hhYXI7CisgICAgcy0+dmMyX3N1YmJhbmRfZHd0W1ZDMl9UUkFOU0ZPUk1fSEFBUl9TXSA9IHZjMl9zdWJiYW5kX2R3dF9oYWFyX3NoaWZ0OwogCi0gICAgcy0+YnVmZmVyID0gYXZfbWFsbG9jKDIqcF93aWR0aCpwX2hlaWdodCpzaXplb2YoZHd0Y29lZikpOworICAgIC8qIFBhZCBieSB0aGUgc2xpY2Ugc2l6ZSwgb25seSBtYXR0ZXJzIGZvciBub24tSGFhciB3YXZlbGV0cyAqLworICAgIHMtPmJ1ZmZlciA9IGF2X2NhbGxvYygocF9zdHJpZGUgKyBzbGljZV93KSoocF9oZWlnaHQgKyBzbGljZV9oKSwgc2l6ZW9mKGR3dGNvZWYpKTsKICAgICBpZiAoIXMtPmJ1ZmZlcikKICAgICAgICAgcmV0dXJuIDE7CiAKKyAgICBzLT5wYWRkaW5nID0gKHNsaWNlX2ggPj4gMSkqcF9zdHJpZGUgKyAoc2xpY2VfdyA+PiAxKTsKKyAgICBzLT5idWZmZXIgKz0gcy0+cGFkZGluZzsKKwogICAgIHJldHVybiAwOwogfQogCiBhdl9jb2xkIHZvaWQgZmZfdmMyZW5jX2ZyZWVfdHJhbnNmb3JtcyhWQzJUcmFuc2Zvcm1Db250ZXh0ICpzKQogewotICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIpOworICAgIGF2X2ZyZWUocy0+YnVmZmVyIC0gcy0+cGFkZGluZyk7CisgICAgcy0+YnVmZmVyID0gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmMyZW5jX2R3dC5oIGIvbGliYXZjb2RlYy92YzJlbmNfZHd0LmgKaW5kZXggOGUxYjYxNC4uYTY5MzJiYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92YzJlbmNfZHd0LmgKKysrIGIvbGliYXZjb2RlYy92YzJlbmNfZHd0LmgKQEAgLTI1LDEwICsyNSw3IEBACiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKLXR5cGVkZWYgaW50MTZfdCBkd3Rjb2VmOwotdHlwZWRlZiBpbnQzMl90IHFjb2VmOyAgIC8qIFF1YW50aXphdGlvbiBuZWVkcyBtb3JlIHByZWNpc2lvbiAqLwotCi0vKiBPbmx5IERlc2xhdXJpZXJzLUR1YnVjICg5LDcpIGFuZCBMZUdhbGwgKDUsMykgc3VwcG9ydGVkISAqLwordHlwZWRlZiBpbnQzMl90IGR3dGNvZWY7CiAKIGVudW0gVkMyVHJhbnNmb3JtVHlwZSB7CiAgICAgVkMyX1RSQU5TRk9STV85XzcgICAgPSAwLCAgIC8qIERlc2xhdXJpZXJzLUR1YnVjICg5LDcpICAqLwpAQCAtNDQsMTIgKzQxLDE0IEBACiAKIHR5cGVkZWYgc3RydWN0IFZDMlRyYW5zZm9ybUNvbnRleHQgewogICAgIGR3dGNvZWYgKmJ1ZmZlcjsKKyAgICBpbnQgcGFkZGluZzsKICAgICB2b2lkICgqdmMyX3N1YmJhbmRfZHd0W1ZDMl9UUkFOU0ZPUk1TX05CXSkoc3RydWN0IFZDMlRyYW5zZm9ybUNvbnRleHQgKnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3dGNvZWYgKmRhdGEsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiB9IFZDMlRyYW5zZm9ybUNvbnRleHQ7CiAKLWludCAgZmZfdmMyZW5jX2luaXRfdHJhbnNmb3JtcyhWQzJUcmFuc2Zvcm1Db250ZXh0ICp0LCBpbnQgcF93aWR0aCwgaW50IHBfaGVpZ2h0KTsKK2ludCAgZmZfdmMyZW5jX2luaXRfdHJhbnNmb3JtcyhWQzJUcmFuc2Zvcm1Db250ZXh0ICp0LCBpbnQgcF9zdHJpZGUsIGludCBwX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xpY2VfdywgaW50IHNsaWNlX2gpOwogdm9pZCBmZl92YzJlbmNfZnJlZV90cmFuc2Zvcm1zKFZDMlRyYW5zZm9ybUNvbnRleHQgKnQpOwogCiAjZW5kaWYgLyogQVZDT0RFQ19WQzJFTkNfRFdUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmRhLmMgYi9saWJhdmNvZGVjL3ZkYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjcwMTQwLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvdmRhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLQotI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKLQotI2luY2x1ZGUgInZkYS5oIgotI2luY2x1ZGUgInZkYV92dF9pbnRlcm5hbC5oIgotCi0jaWYgQ09ORklHX0gyNjRfVkRBX0hXQUNDRUwKLUFWVkRBQ29udGV4dCAqYXZfdmRhX2FsbG9jX2NvbnRleHQodm9pZCkKLXsKLSAgICBBVlZEQUNvbnRleHQgKnJldCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpyZXQpKTsKLQotICAgIGlmIChyZXQpIHsKLSAgICAgICAgcmV0LT5vdXRwdXRfY2FsbGJhY2sgPSBmZl92ZGFfb3V0cHV0X2NhbGxiYWNrOwotICAgICAgICByZXQtPmN2X3BpeF9mbXRfdHlwZSA9IGtDVlBpeGVsRm9ybWF0VHlwZV80MjJZcENiQ3I4OwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLWludCBhdl92ZGFfZGVmYXVsdF9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICByZXR1cm4gYXZfdmRhX2RlZmF1bHRfaW5pdDIoYXZjdHgsIE5VTEwpOwotfQotCi1pbnQgYXZfdmRhX2RlZmF1bHRfaW5pdDIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVlZEQUNvbnRleHQgKnZkYWN0eCkKLXsKLSAgICBhdmN0eC0+aHdhY2NlbF9jb250ZXh0ID0gdmRhY3R4ID86IGF2X3ZkYV9hbGxvY19jb250ZXh0KCk7Ci0gICAgaWYgKCFhdmN0eC0+aHdhY2NlbF9jb250ZXh0KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHJldHVybiBmZl92ZGFfZGVmYXVsdF9pbml0KGF2Y3R4KTsKLX0KLQotdm9pZCBhdl92ZGFfZGVmYXVsdF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBmZl92ZGFfZGVmYXVsdF9mcmVlKGF2Y3R4KTsKLSAgICBhdl9mcmVlcCgmYXZjdHgtPmh3YWNjZWxfY29udGV4dCk7Ci19Ci0KLXZvaWQgZmZfdmRhX2RlZmF1bHRfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgQVZWREFDb250ZXh0ICp2ZGEgPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OwotICAgIGlmICh2ZGEgJiYgdmRhLT5kZWNvZGVyKQotICAgICAgICBWREFEZWNvZGVyRGVzdHJveSh2ZGEtPmRlY29kZXIpOwotfQotCi0jZWxzZQotQVZWREFDb250ZXh0ICphdl92ZGFfYWxsb2NfY29udGV4dCh2b2lkKQotewotICAgIHJldHVybiBOVUxMOwotfQotCi1pbnQgYXZfdmRhX2RlZmF1bHRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKLX0KLQotdm9pZCBhdl92ZGFfZGVmYXVsdF9mcmVlKEFWQ29kZWNDb250ZXh0ICpjdHgpCi17Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmRhLmggYi9saWJhdmNvZGVjL3ZkYS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGUxNGUzLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMvdmRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIFZEQSBIVyBhY2NlbGVyYXRpb24KLSAqCi0gKiBjb3B5cmlnaHQgKGMpIDIwMTEgU2ViYXN0aWVuIFp3aWNrZXJ0Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZDT0RFQ19WREFfSAotI2RlZmluZSBBVkNPREVDX1ZEQV9ICi0KLS8qKgotICogQGZpbGUKLSAqIEBpbmdyb3VwIGxhdmNfY29kZWNfaHdhY2NlbF92ZGEKLSAqIFB1YmxpYyBsaWJhdmNvZGVjIFZEQSBoZWFkZXIuCi0gKi8KLQotI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLS8vIGVtbWludHJpbi5oIGlzIHVuYWJsZSB0byBjb21waWxlIHdpdGggLXN0ZD1jOTkgLVdlcnJvcj1taXNzaW5nLXByb3RvdHlwZXMKLS8vIGh0dHA6Ly9vcGVucmFkYXIuYXBwc3BvdC5jb20vODAyNjM5MAotI3VuZGVmIF9fR05VQ19TVERDX0lOTElORV9fCi0KLSNkZWZpbmUgUGljdHVyZSBRdWlja2RyYXdQaWN0dXJlCi0jaW5jbHVkZSA8VmlkZW9EZWNvZGVBY2NlbGVyYXRpb24vVkRBRGVjb2Rlci5oPgotI3VuZGVmIFBpY3R1cmUKLQotI2luY2x1ZGUgImxpYmF2Y29kZWMvdmVyc2lvbi5oIgotCi0vLyBleHRyYSBmbGFncyBub3QgZGVmaW5lZCBpbiBWREFEZWNvZGVyLmgKLWVudW0gewotICAgIGtWREFEZWNvZGVJbmZvX0FzeW5jaHJvbm91cyA9IDFVTCA8PCAwLAotICAgIGtWREFEZWNvZGVJbmZvX0ZyYW1lRHJvcHBlZCA9IDFVTCA8PCAxCi19OwotCi0vKioKLSAqIEBkZWZncm91cCBsYXZjX2NvZGVjX2h3YWNjZWxfdmRhIFZEQQotICogQGluZ3JvdXAgbGF2Y19jb2RlY19od2FjY2VsCi0gKgotICogQHsKLSAqLwotCi0vKioKLSAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gcHJvdmlkZSB0aGUgbmVjZXNzYXJ5IGNvbmZpZ3VyYXRpb25zIGFuZCBkYXRhCi0gKiB0byB0aGUgVkRBIEZGbXBlZyBIV0FjY2VsIGltcGxlbWVudGF0aW9uLgotICoKLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG1ha2UgaXQgYXZhaWxhYmxlIGFzIEFWQ29kZWNDb250ZXh0Lmh3YWNjZWxfY29udGV4dC4KLSAqLwotc3RydWN0IHZkYV9jb250ZXh0IHsKLSAgICAvKioKLSAgICAgKiBWREEgZGVjb2RlciBvYmplY3QuCi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQvVW5zZXQgYnkgbGliYXZjb2RlYy4KLSAgICAgKi8KLSAgICBWREFEZWNvZGVyICAgICAgICAgIGRlY29kZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgQ29yZSBWaWRlbyBwaXhlbCBidWZmZXIgdGhhdCBjb250YWlucyB0aGUgY3VycmVudCBpbWFnZSBkYXRhLgotICAgICAqCi0gICAgICogZW5jb2Rpbmc6IHVudXNlZAotICAgICAqIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4gVW5zZXQgYnkgdXNlci4KLSAgICAgKi8KLSAgICBDVlBpeGVsQnVmZmVyUmVmICAgIGN2X2J1ZmZlcjsKLQotICAgIC8qKgotICAgICAqIFVzZSB0aGUgaGFyZHdhcmUgZGVjb2RlciBpbiBzeW5jaHJvbm91cyBtb2RlLgotICAgICAqCi0gICAgICogZW5jb2Rpbmc6IHVudXNlZAotICAgICAqIGRlY29kaW5nOiBTZXQgYnkgdXNlci4KLSAgICAgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgIHVzZV9zeW5jX2RlY29kaW5nOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZyYW1lIHdpZHRoLgotICAgICAqCi0gICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0L1Vuc2V0IGJ5IHVzZXIuCi0gICAgICovCi0gICAgaW50ICAgICAgICAgICAgICAgICB3aWR0aDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmcmFtZSBoZWlnaHQuCi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQvVW5zZXQgYnkgdXNlci4KLSAgICAgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgIGhlaWdodDsKLQotICAgIC8qKgotICAgICAqIFRoZSBmcmFtZSBmb3JtYXQuCi0gICAgICoKLSAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQvVW5zZXQgYnkgdXNlci4KLSAgICAgKi8KLSAgICBpbnQgICAgICAgICAgICAgICAgIGZvcm1hdDsKLQotICAgIC8qKgotICAgICAqIFRoZSBwaXhlbCBmb3JtYXQgZm9yIG91dHB1dCBpbWFnZSBidWZmZXJzLgotICAgICAqCi0gICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0L1Vuc2V0IGJ5IHVzZXIuCi0gICAgICovCi0gICAgT1NUeXBlICAgICAgICAgICAgICBjdl9waXhfZm10X3R5cGU7Ci0KLSAgICAvKioKLSAgICAgKiB1bnVzZWQKLSAgICAgKi8KLSAgICB1aW50OF90ICAgICAgICAgICAgICpwcml2X2JpdHN0cmVhbTsKLQotICAgIC8qKgotICAgICAqIHVudXNlZAotICAgICAqLwotICAgIGludCAgICAgICAgICAgICAgICAgcHJpdl9iaXRzdHJlYW1fc2l6ZTsKLQotICAgIC8qKgotICAgICAqIHVudXNlZAotICAgICAqLwotICAgIGludCAgICAgICAgICAgICAgICAgcHJpdl9hbGxvY2F0ZWRfc2l6ZTsKLQotICAgIC8qKgotICAgICAqIFVzZSBhdl9idWZmZXIgdG8gbWFuYWdlIGJ1ZmZlci4KLSAgICAgKiBXaGVuIHRoZSBmbGFnIGlzIHNldCwgdGhlIENWUGl4ZWxCdWZmZXJzIHJldHVybmVkIGJ5IHRoZSBkZWNvZGVyIHdpbGwKLSAgICAgKiBiZSByZWxlYXNlZCBhdXRvbWF0aWNhbGx5LCBzbyB5b3UgaGF2ZSB0byByZXRhaW4gdGhlbSBpZiBuZWNlc3NhcnkuCi0gICAgICogTm90IHNldHRpbmcgdGhpcyBmbGFnIG1heSBjYXVzZSBtZW1vcnkgbGVhay4KLSAgICAgKgotICAgICAqIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiBkZWNvZGluZzogU2V0IGJ5IHVzZXIuCi0gICAgICovCi0gICAgaW50ICAgICAgICAgICAgICAgICB1c2VfcmVmX2J1ZmZlcjsKLX07Ci0KLS8qKiBDcmVhdGUgdGhlIHZpZGVvIGRlY29kZXIuICovCi1pbnQgZmZfdmRhX2NyZWF0ZV9kZWNvZGVyKHN0cnVjdCB2ZGFfY29udGV4dCAqdmRhX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZXh0cmFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFkYXRhX3NpemUpOwotCi0vKiogRGVzdHJveSB0aGUgdmlkZW8gZGVjb2Rlci4gKi8KLWludCBmZl92ZGFfZGVzdHJveV9kZWNvZGVyKHN0cnVjdCB2ZGFfY29udGV4dCAqdmRhX2N0eCk7Ci0KLS8qKgotICogVGhpcyBzdHJ1Y3QgaG9sZHMgYWxsIHRoZSBpbmZvcm1hdGlvbiB0aGF0IG5lZWRzIHRvIGJlIHBhc3NlZAotICogYmV0d2VlbiB0aGUgY2FsbGVyIGFuZCBsaWJhdmNvZGVjIGZvciBpbml0aWFsaXppbmcgVkRBIGRlY29kaW5nLgotICogSXRzIHNpemUgaXMgbm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFCSSwgaXQgbXVzdCBiZSBhbGxvY2F0ZWQgd2l0aAotICogYXZfdmRhX2FsbG9jX2NvbnRleHQoKSBhbmQgZnJlZWQgd2l0aCBhdl9mcmVlKCkuCi0gKi8KLXR5cGVkZWYgc3RydWN0IEFWVkRBQ29udGV4dCB7Ci0gICAgLyoqCi0gICAgICogVkRBIGRlY29kZXIgb2JqZWN0LiBDcmVhdGVkIGFuZCBmcmVlZCBieSB0aGUgY2FsbGVyLgotICAgICAqLwotICAgIFZEQURlY29kZXIgZGVjb2RlcjsKLQotICAgIC8qKgotICAgICAqIFRoZSBvdXRwdXQgY2FsbGJhY2sgdGhhdCBtdXN0IGJlIHBhc3NlZCB0byBWREFEZWNvZGVyQ3JlYXRlLgotICAgICAqIFNldCBieSBhdl92ZGFfYWxsb2NfY29udGV4dCgpLgotICAgICAqLwotICAgIFZEQURlY29kZXJPdXRwdXRDYWxsYmFjayBvdXRwdXRfY2FsbGJhY2s7Ci0KLSAgICAvKioKLSAgICAgKiBDVlBpeGVsQnVmZmVyIEZvcm1hdCBUeXBlIHRoYXQgVkRBIHdpbGwgdXNlIGZvciBkZWNvZGVkIGZyYW1lczsgc2V0IGJ5Ci0gICAgICogdGhlIGNhbGxlci4KLSAgICAgKi8KLSAgICBPU1R5cGUgY3ZfcGl4X2ZtdF90eXBlOwotfSBBVlZEQUNvbnRleHQ7Ci0KLS8qKgotICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBWREEgY29udGV4dC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgZ2V0X2Zvcm1hdCgpIGNhbGxiYWNrIHdoZW4gdGhlIGNhbGxlcgotICogc2VsZWN0cyB0aGUgQVZfUElYX0ZNVF9WREEgZm9ybWF0LiBUaGUgY2FsbGVyIG11c3QgdGhlbiBjcmVhdGUgdGhlIGRlY29kZXIKLSAqIG9iamVjdCAodXNpbmcgdGhlIG91dHB1dCBjYWxsYmFjayBwcm92aWRlZCBieSBsaWJhdmNvZGVjKSB0aGF0IHdpbGwgYmUgdXNlZAotICogZm9yIFZEQS1hY2NlbGVyYXRlZCBkZWNvZGluZy4KLSAqCi0gKiBXaGVuIGRlY29kaW5nIHdpdGggVkRBIGlzIGZpbmlzaGVkLCB0aGUgY2FsbGVyIG11c3QgZGVzdHJveSB0aGUgZGVjb2RlcgotICogb2JqZWN0IGFuZCBmcmVlIHRoZSBWREEgY29udGV4dCB1c2luZyBhdl9mcmVlKCkuCi0gKgotICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGNvbnRleHQgb3IgTlVMTCBvbiBmYWlsdXJlCi0gKi8KLUFWVkRBQ29udGV4dCAqYXZfdmRhX2FsbG9jX2NvbnRleHQodm9pZCk7Ci0KLS8qKgotICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhbmQgc2V0cyB1cCB0aGUgVkRBIGNvbnRleHQgdXNpbmcKLSAqIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uLgotICoKLSAqIEBwYXJhbSBhdmN0eCB0aGUgY29ycmVzcG9uZGluZyBjb2RlYyBjb250ZXh0Ci0gKgotICogQHJldHVybiA+PSAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKLSAqLwotaW50IGF2X3ZkYV9kZWZhdWx0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKLQotLyoqCi0gKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuZCBzZXRzIHVwIHRoZSBWREEgY29udGV4dCB1c2luZwotICogYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24uCi0gKgotICogQHBhcmFtIGF2Y3R4IHRoZSBjb3JyZXNwb25kaW5nIGNvZGVjIGNvbnRleHQKLSAqIEBwYXJhbSB2ZGFjdHggdGhlIFZEQSBjb250ZXh0IHRvIHVzZQotICoKLSAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCi0gKi8KLWludCBhdl92ZGFfZGVmYXVsdF9pbml0MihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWVkRBQ29udGV4dCAqdmRhY3R4KTsKLQotLyoqCi0gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHRvIGZyZWUgdGhlIFZEQSBjb250ZXh0IGluaXRpYWxpemVkIHdpdGgKLSAqIGF2X3ZkYV9kZWZhdWx0X2luaXQoKS4KLSAqCi0gKiBAcGFyYW0gYXZjdHggdGhlIGNvcnJlc3BvbmRpbmcgY29kZWMgY29udGV4dAotICovCi12b2lkIGF2X3ZkYV9kZWZhdWx0X2ZyZWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKLQotLyoqCi0gKiBAfQotICovCi0KLSNlbmRpZiAvKiBBVkNPREVDX1ZEQV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZkYV9oMjY0LmMgYi9saWJhdmNvZGVjL3ZkYV9oMjY0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTI2YzAuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy92ZGFfaDI2NC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qCi0gKiBWREEgSDI2NCBIVyBhY2NlbGVyYXRpb24uCi0gKgotICogY29weXJpZ2h0IChjKSAyMDExIFNlYmFzdGllbiBad2lja2VydAotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZEaWN0aW9uYXJ5Lmg+Ci0jaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ0ZOdW1iZXIuaD4KLSNpbmNsdWRlIDxDb3JlRm91bmRhdGlvbi9DRkRhdGEuaD4KLQotI2luY2x1ZGUgInZkYS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKLSNpbmNsdWRlICJoMjY0LmgiCi0KLXN0cnVjdCB2ZGFfYnVmZmVyIHsKLSAgICBDVlBpeGVsQnVmZmVyUmVmIGN2X2J1ZmZlcjsKLX07Ci0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJ2ZGFfdnRfaW50ZXJuYWwuaCIKLQotLyogRGVjb2RlciBjYWxsYmFjayB0aGF0IGFkZHMgdGhlIHZkYSBmcmFtZSB0byB0aGUgcXVldWUgaW4gZGlzcGxheSBvcmRlci4gKi8KLXN0YXRpYyB2b2lkIHZkYV9kZWNvZGVyX2NhbGxiYWNrKHZvaWQgKnZkYV9od19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWYgdXNlcl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1NTdGF0dXMgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5mb0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZJbWFnZUJ1ZmZlclJlZiBpbWFnZV9idWZmZXIpCi17Ci0gICAgc3RydWN0IHZkYV9jb250ZXh0ICp2ZGFfY3R4ID0gdmRhX2h3X2N0eDsKLQotICAgIGlmIChpbmZvRmxhZ3MgJiBrVkRBRGVjb2RlSW5mb19GcmFtZURyb3BwZWQpCi0gICAgICAgIHZkYV9jdHgtPmN2X2J1ZmZlciA9IE5VTEw7Ci0KLSAgICBpZiAoIWltYWdlX2J1ZmZlcikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKHZkYV9jdHgtPmN2X3BpeF9mbXRfdHlwZSAhPSBDVlBpeGVsQnVmZmVyR2V0UGl4ZWxGb3JtYXRUeXBlKGltYWdlX2J1ZmZlcikpCi0gICAgICAgIHJldHVybjsKLQotICAgIHZkYV9jdHgtPmN2X2J1ZmZlciA9IENWUGl4ZWxCdWZmZXJSZXRhaW4oaW1hZ2VfYnVmZmVyKTsKLX0KLQotc3RhdGljIGludCB2ZGFfc3luY19kZWNvZGUoVlRDb250ZXh0ICpjdHgsIHN0cnVjdCB2ZGFfY29udGV4dCAqdmRhX2N0eCkKLXsKLSAgICBPU1N0YXR1cyBzdGF0dXM7Ci0gICAgQ0ZEYXRhUmVmIGNvZGVkX2ZyYW1lOwotICAgIHVpbnQzMl90IGZsdXNoX2ZsYWdzID0gMSA8PCAwOyAvLy88IGtWREFEZWNvZGVyRmx1c2hfZW1pdEZyYW1lcwotCi0gICAgY29kZWRfZnJhbWUgPSBDRkRhdGFDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJpdHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmJpdHN0cmVhbV9zaXplKTsKLQotICAgIHN0YXR1cyA9IFZEQURlY29kZXJEZWNvZGUodmRhX2N0eC0+ZGVjb2RlciwgMCwgY29kZWRfZnJhbWUsIE5VTEwpOwotCi0gICAgaWYgKGtWREFEZWNvZGVyTm9FcnIgPT0gc3RhdHVzKQotICAgICAgICBzdGF0dXMgPSBWREFEZWNvZGVyRmx1c2godmRhX2N0eC0+ZGVjb2RlciwgZmx1c2hfZmxhZ3MpOwotCi0gICAgQ0ZSZWxlYXNlKGNvZGVkX2ZyYW1lKTsKLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLQotc3RhdGljIGludCB2ZGFfb2xkX2gyNjRfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl91bnVzZWQgY29uc3QgdWludDhfdCAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl91bnVzZWQgdWludDMyX3Qgc2l6ZSkKLXsKLSAgICBWVENvbnRleHQgKnZkYSA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7Ci0gICAgc3RydWN0IHZkYV9jb250ZXh0ICp2ZGFfY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKLQotICAgIGlmICghdmRhX2N0eC0+ZGVjb2RlcikKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgdmRhLT5iaXRzdHJlYW1fc2l6ZSA9IDA7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2ZGFfb2xkX2gyNjRfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCi17Ci0gICAgVlRDb250ZXh0ICp2ZGEgICAgICAgICAgICAgID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKLSAgICBzdHJ1Y3QgdmRhX2NvbnRleHQgKnZkYV9jdHggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OwotICAgIHZvaWQgKnRtcDsKLQotICAgIGlmICghdmRhX2N0eC0+ZGVjb2RlcikKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgdG1wID0gYXZfZmFzdF9yZWFsbG9jKHZkYS0+Yml0c3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmdmRhLT5hbGxvY2F0ZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmRhLT5iaXRzdHJlYW1fc2l6ZSArIHNpemUgKyA0KTsKLSAgICBpZiAoIXRtcCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIHZkYS0+Yml0c3RyZWFtID0gdG1wOwotCi0gICAgQVZfV0IzMih2ZGEtPmJpdHN0cmVhbSArIHZkYS0+Yml0c3RyZWFtX3NpemUsIHNpemUpOwotICAgIG1lbWNweSh2ZGEtPmJpdHN0cmVhbSArIHZkYS0+Yml0c3RyZWFtX3NpemUgKyA0LCBidWZmZXIsIHNpemUpOwotCi0gICAgdmRhLT5iaXRzdHJlYW1fc2l6ZSArPSBzaXplICsgNDsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB2ZGFfaDI2NF9yZWxlYXNlX2J1ZmZlcih2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCi17Ci0gICAgc3RydWN0IHZkYV9idWZmZXIgKmNvbnRleHQgPSBvcGFxdWU7Ci0gICAgQ1ZQaXhlbEJ1ZmZlclJlbGVhc2UoY29udGV4dC0+Y3ZfYnVmZmVyKTsKLSAgICBhdl9mcmVlKGNvbnRleHQpOwotfQotCi1zdGF0aWMgaW50IHZkYV9vbGRfaDI2NF9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIEgyNjRDb250ZXh0ICpoICAgICAgICAgICAgICAgICAgICAgID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBWVENvbnRleHQgKnZkYSAgICAgICAgICAgICAgICAgICAgICA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7Ci0gICAgc3RydWN0IHZkYV9jb250ZXh0ICp2ZGFfY3R4ICAgICAgICAgPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OwotICAgIEFWRnJhbWUgKmZyYW1lICAgICAgICAgICAgICAgICAgICAgID0gaC0+Y3VyX3BpY19wdHItPmY7Ci0gICAgc3RydWN0IHZkYV9idWZmZXIgKmNvbnRleHQ7Ci0gICAgQVZCdWZmZXJSZWYgKmJ1ZmZlcjsKLSAgICBpbnQgc3RhdHVzOwotCi0gICAgaWYgKCF2ZGFfY3R4LT5kZWNvZGVyIHx8ICF2ZGEtPmJpdHN0cmVhbSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgc3RhdHVzID0gdmRhX3N5bmNfZGVjb2RlKHZkYSwgdmRhX2N0eCk7Ci0gICAgZnJhbWUtPmRhdGFbM10gPSAodm9pZCopdmRhX2N0eC0+Y3ZfYnVmZmVyOwotCi0gICAgaWYgKHN0YXR1cykKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lICglZClcbiIsIHN0YXR1cyk7Ci0KLSAgICBpZiAoIXZkYV9jdHgtPnVzZV9yZWZfYnVmZmVyIHx8IHN0YXR1cykKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLQotICAgIGNvbnRleHQgPSBhdl9tYWxsb2N6KHNpemVvZigqY29udGV4dCkpOwotICAgIGJ1ZmZlciA9IGF2X2J1ZmZlcl9jcmVhdGUoTlVMTCwgMCwgdmRhX2gyNjRfcmVsZWFzZV9idWZmZXIsIGNvbnRleHQsIDApOwotICAgIGlmICghY29udGV4dCB8fCAhYnVmZmVyKSB7Ci0gICAgICAgIENWUGl4ZWxCdWZmZXJSZWxlYXNlKHZkYV9jdHgtPmN2X2J1ZmZlcik7Ci0gICAgICAgIGF2X2ZyZWUoY29udGV4dCk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBjb250ZXh0LT5jdl9idWZmZXIgPSB2ZGFfY3R4LT5jdl9idWZmZXI7Ci0gICAgZnJhbWUtPmJ1ZlszXSA9IGJ1ZmZlcjsKLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLWludCBmZl92ZGFfY3JlYXRlX2RlY29kZXIoc3RydWN0IHZkYV9jb250ZXh0ICp2ZGFfY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpleHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRyYWRhdGFfc2l6ZSkKLXsKLSAgICBPU1N0YXR1cyBzdGF0dXM7Ci0gICAgQ0ZOdW1iZXJSZWYgaGVpZ2h0OwotICAgIENGTnVtYmVyUmVmIHdpZHRoOwotICAgIENGTnVtYmVyUmVmIGZvcm1hdDsKLSAgICBDRkRhdGFSZWYgYXZjX2RhdGE7Ci0gICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBjb25maWdfaW5mbzsKLSAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGJ1ZmZlcl9hdHRyaWJ1dGVzOwotICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgaW9fc3VyZmFjZV9wcm9wZXJ0aWVzOwotICAgIENGTnVtYmVyUmVmIGN2X3BpeF9mbXQ7Ci0KLSAgICB2ZGFfY3R4LT5wcml2X2JpdHN0cmVhbSA9IE5VTEw7Ci0gICAgdmRhX2N0eC0+cHJpdl9hbGxvY2F0ZWRfc2l6ZSA9IDA7Ci0KLSAgICAvKiBFYWNoIFZDTCBOQUwgaW4gdGhlIGJpdHN0cmVhbSBzZW50IHRvIHRoZSBkZWNvZGVyCi0gICAgICogaXMgcHJlY2VkZWQgYnkgYSA0IGJ5dGVzIGxlbmd0aCBoZWFkZXIuCi0gICAgICogQ2hhbmdlIHRoZSBhdmNDIGF0b20gaGVhZGVyIGlmIG5lZWRlZCwgdG8gc2lnbmFsIGhlYWRlcnMgb2YgNCBieXRlcy4gKi8KLSAgICBpZiAoZXh0cmFkYXRhX3NpemUgPj0gNCAmJiAoZXh0cmFkYXRhWzRdICYgMHgwMykgIT0gMHgwMykgewotICAgICAgICB1aW50OF90ICpyd19leHRyYWRhdGE7Ci0KLSAgICAgICAgaWYgKCEocndfZXh0cmFkYXRhID0gYXZfbWFsbG9jKGV4dHJhZGF0YV9zaXplKSkpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgICAgIG1lbWNweShyd19leHRyYWRhdGEsIGV4dHJhZGF0YSwgZXh0cmFkYXRhX3NpemUpOwotCi0gICAgICAgIHJ3X2V4dHJhZGF0YVs0XSB8PSAweDAzOwotCi0gICAgICAgIGF2Y19kYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIHJ3X2V4dHJhZGF0YSwgZXh0cmFkYXRhX3NpemUpOwotCi0gICAgICAgIGF2X2ZyZWVwKCZyd19leHRyYWRhdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2Y19kYXRhID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGV4dHJhZGF0YSwgZXh0cmFkYXRhX3NpemUpOwotICAgIH0KLQotICAgIGNvbmZpZ19pbmZvID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKLQotICAgIGhlaWdodCAgID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyU0ludDMyVHlwZSwgJnZkYV9jdHgtPmhlaWdodCk7Ci0gICAgd2lkdGggICAgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJTSW50MzJUeXBlLCAmdmRhX2N0eC0+d2lkdGgpOwotICAgIGZvcm1hdCAgID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyU0ludDMyVHlwZSwgJnZkYV9jdHgtPmZvcm1hdCk7Ci0KLSAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywga1ZEQURlY29kZXJDb25maWd1cmF0aW9uX0hlaWdodCwgaGVpZ2h0KTsKLSAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywga1ZEQURlY29kZXJDb25maWd1cmF0aW9uX1dpZHRoLCB3aWR0aCk7Ci0gICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoY29uZmlnX2luZm8sIGtWREFEZWNvZGVyQ29uZmlndXJhdGlvbl9Tb3VyY2VGb3JtYXQsIGZvcm1hdCk7Ci0gICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoY29uZmlnX2luZm8sIGtWREFEZWNvZGVyQ29uZmlndXJhdGlvbl9hdmNDRGF0YSwgYXZjX2RhdGEpOwotCi0gICAgYnVmZmVyX2F0dHJpYnV0ZXMgPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotICAgIGlvX3N1cmZhY2VfcHJvcGVydGllcyA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7Ci0gICAgY3ZfcGl4X2ZtdCAgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGTnVtYmVyU0ludDMyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZGFfY3R4LT5jdl9waXhfZm10X3R5cGUpOwotICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGJ1ZmZlcl9hdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtDVlBpeGVsQnVmZmVyUGl4ZWxGb3JtYXRUeXBlS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGN2X3BpeF9mbXQpOwotICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGJ1ZmZlcl9hdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtDVlBpeGVsQnVmZmVySU9TdXJmYWNlUHJvcGVydGllc0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpb19zdXJmYWNlX3Byb3BlcnRpZXMpOwotCi0gICAgc3RhdHVzID0gVkRBRGVjb2RlckNyZWF0ZShjb25maWdfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9hdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZEQURlY29kZXJPdXRwdXRDYWxsYmFjayAqKXZkYV9kZWNvZGVyX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRhX2N0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZGFfY3R4LT5kZWNvZGVyKTsKLQotICAgIENGUmVsZWFzZShoZWlnaHQpOwotICAgIENGUmVsZWFzZSh3aWR0aCk7Ci0gICAgQ0ZSZWxlYXNlKGZvcm1hdCk7Ci0gICAgQ0ZSZWxlYXNlKGF2Y19kYXRhKTsKLSAgICBDRlJlbGVhc2UoY29uZmlnX2luZm8pOwotICAgIENGUmVsZWFzZShpb19zdXJmYWNlX3Byb3BlcnRpZXMpOwotICAgIENGUmVsZWFzZShjdl9waXhfZm10KTsKLSAgICBDRlJlbGVhc2UoYnVmZmVyX2F0dHJpYnV0ZXMpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotaW50IGZmX3ZkYV9kZXN0cm95X2RlY29kZXIoc3RydWN0IHZkYV9jb250ZXh0ICp2ZGFfY3R4KQotewotICAgIE9TU3RhdHVzIHN0YXR1cyA9IGtWREFEZWNvZGVyTm9FcnI7Ci0KLSAgICBpZiAodmRhX2N0eC0+ZGVjb2RlcikKLSAgICAgICAgc3RhdHVzID0gVkRBRGVjb2RlckRlc3Ryb3kodmRhX2N0eC0+ZGVjb2Rlcik7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1BVkhXQWNjZWwgZmZfaDI2NF92ZGFfb2xkX2h3YWNjZWwgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gImgyNjRfdmRhIiwKLSAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKLSAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZEQV9WTEQsCi0gICAgLnN0YXJ0X2ZyYW1lICAgID0gdmRhX29sZF9oMjY0X3N0YXJ0X2ZyYW1lLAotICAgIC5kZWNvZGVfc2xpY2UgICA9IHZkYV9vbGRfaDI2NF9kZWNvZGVfc2xpY2UsCi0gICAgLmVuZF9mcmFtZSAgICAgID0gdmRhX29sZF9oMjY0X2VuZF9mcmFtZSwKLSAgICAudW5pbml0ICAgICAgICAgPSBmZl92aWRlb3Rvb2xib3hfdW5pbml0LAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWVENvbnRleHQpLAotfTsKLQotdm9pZCBmZl92ZGFfb3V0cHV0X2NhbGxiYWNrKHZvaWQgKm9wYXF1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWYgdXNlcl9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmZvRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZJbWFnZUJ1ZmZlclJlZiBpbWFnZV9idWZmZXIpCi17Ci0gICAgQVZDb2RlY0NvbnRleHQgKmN0eCA9IG9wYXF1ZTsKLSAgICBWVENvbnRleHQgKnZkYSA9IGN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOwotCi0KLSAgICBpZiAodmRhLT5mcmFtZSkgewotICAgICAgICBDVlBpeGVsQnVmZmVyUmVsZWFzZSh2ZGEtPmZyYW1lKTsKLSAgICAgICAgdmRhLT5mcmFtZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKCFpbWFnZV9idWZmZXIpCi0gICAgICAgIHJldHVybjsKLQotICAgIHZkYS0+ZnJhbWUgPSBDVlBpeGVsQnVmZmVyUmV0YWluKGltYWdlX2J1ZmZlcik7Ci19Ci0KLXN0YXRpYyBpbnQgdmRhX2gyNjRfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBIMjY0Q29udGV4dCAqaCAgICAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIFZUQ29udGV4dCAqdmRhICAgICAgICA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7Ci0gICAgQVZWREFDb250ZXh0ICp2ZGFfY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKLSAgICBBVkZyYW1lICpmcmFtZSAgICAgICAgPSBoLT5jdXJfcGljX3B0ci0+ZjsKLSAgICB1aW50MzJfdCBmbHVzaF9mbGFncyAgPSAxIDw8IDA7IC8vLzwga1ZEQURlY29kZXJGbHVzaF9lbWl0RnJhbWVzCi0gICAgQ0ZEYXRhUmVmIGNvZGVkX2ZyYW1lOwotICAgIE9TU3RhdHVzIHN0YXR1czsKLQotICAgIGlmICghdmRhLT5iaXRzdHJlYW1fc2l6ZSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0KLQotICAgIGNvZGVkX2ZyYW1lID0gQ0ZEYXRhQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRhLT5iaXRzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRhLT5iaXRzdHJlYW1fc2l6ZSk7Ci0KLSAgICBzdGF0dXMgPSBWREFEZWNvZGVyRGVjb2RlKHZkYV9jdHgtPmRlY29kZXIsIDAsIGNvZGVkX2ZyYW1lLCBOVUxMKTsKLQotICAgIGlmIChzdGF0dXMgPT0ga1ZEQURlY29kZXJOb0VycikKLSAgICAgICAgc3RhdHVzID0gVkRBRGVjb2RlckZsdXNoKHZkYV9jdHgtPmRlY29kZXIsIGZsdXNoX2ZsYWdzKTsKLQotICAgIENGUmVsZWFzZShjb2RlZF9mcmFtZSk7Ci0KLSAgICBpZiAoIXZkYS0+ZnJhbWUpCi0gICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Ci0KLSAgICBpZiAoc3RhdHVzICE9IGtWREFEZWNvZGVyTm9FcnIpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIGZyYW1lICglZClcbiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Ci0gICAgfQotCi0gICAgcmV0dXJuIGZmX3ZpZGVvdG9vbGJveF9idWZmZXJfY3JlYXRlKHZkYSwgZnJhbWUpOwotfQotCi1pbnQgZmZfdmRhX2RlZmF1bHRfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgQVZWREFDb250ZXh0ICp2ZGFfY3R4ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBrVkRBRGVjb2Rlck5vRXJyOwotICAgIENGTnVtYmVyUmVmIGhlaWdodDsKLSAgICBDRk51bWJlclJlZiB3aWR0aDsKLSAgICBDRk51bWJlclJlZiBmb3JtYXQ7Ci0gICAgQ0ZEYXRhUmVmIGF2Y19kYXRhOwotICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgY29uZmlnX2luZm87Ci0gICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBidWZmZXJfYXR0cmlidXRlczsKLSAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGlvX3N1cmZhY2VfcHJvcGVydGllczsKLSAgICBDRk51bWJlclJlZiBjdl9waXhfZm10OwotICAgIGludDMyX3QgZm10ID0gJ2F2YzEnLCBwaXhfZm10ID0gdmRhX2N0eC0+Y3ZfcGl4X2ZtdF90eXBlOwotCi0gICAgLy8ga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMFlwQ2JDcjhQbGFuYXI7Ci0KLSAgICBhdmNfZGF0YSA9IGZmX3ZpZGVvdG9vbGJveF9hdmNjX2V4dHJhZGF0YV9jcmVhdGUoYXZjdHgpOwotCi0gICAgY29uZmlnX2luZm8gPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotCi0gICAgaGVpZ2h0ID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyU0ludDMyVHlwZSwgJmF2Y3R4LT5oZWlnaHQpOwotICAgIHdpZHRoICA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlclNJbnQzMlR5cGUsICZhdmN0eC0+d2lkdGgpOwotICAgIGZvcm1hdCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlclNJbnQzMlR5cGUsICZmbXQpOwotICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGNvbmZpZ19pbmZvLCBrVkRBRGVjb2RlckNvbmZpZ3VyYXRpb25fSGVpZ2h0LCBoZWlnaHQpOwotICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGNvbmZpZ19pbmZvLCBrVkRBRGVjb2RlckNvbmZpZ3VyYXRpb25fV2lkdGgsIHdpZHRoKTsKLSAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywga1ZEQURlY29kZXJDb25maWd1cmF0aW9uX2F2Y0NEYXRhLCBhdmNfZGF0YSk7Ci0gICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoY29uZmlnX2luZm8sIGtWREFEZWNvZGVyQ29uZmlndXJhdGlvbl9Tb3VyY2VGb3JtYXQsIGZvcm1hdCk7Ci0KLSAgICBidWZmZXJfYXR0cmlidXRlcyA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7Ci0gICAgaW9fc3VyZmFjZV9wcm9wZXJ0aWVzID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKLSAgICBjdl9waXhfZm10ICAgICAgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRk51bWJlclNJbnQzMlR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpeF9mbXQpOwotCi0gICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoYnVmZmVyX2F0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAga0NWUGl4ZWxCdWZmZXJQaXhlbEZvcm1hdFR5cGVLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3ZfcGl4X2ZtdCk7Ci0gICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoYnVmZmVyX2F0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAga0NWUGl4ZWxCdWZmZXJJT1N1cmZhY2VQcm9wZXJ0aWVzS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGlvX3N1cmZhY2VfcHJvcGVydGllcyk7Ci0KLSAgICBzdGF0dXMgPSBWREFEZWNvZGVyQ3JlYXRlKGNvbmZpZ19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyX2F0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVkRBRGVjb2Rlck91dHB1dENhbGxiYWNrICopZmZfdmRhX291dHB1dF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZkYV9jdHgtPmRlY29kZXIpOwotCi0gICAgQ0ZSZWxlYXNlKGZvcm1hdCk7Ci0gICAgQ0ZSZWxlYXNlKGhlaWdodCk7Ci0gICAgQ0ZSZWxlYXNlKHdpZHRoKTsKLSAgICBDRlJlbGVhc2UoYXZjX2RhdGEpOwotICAgIENGUmVsZWFzZShjb25maWdfaW5mbyk7Ci0gICAgQ0ZSZWxlYXNlKGN2X3BpeF9mbXQpOwotICAgIENGUmVsZWFzZShpb19zdXJmYWNlX3Byb3BlcnRpZXMpOwotICAgIENGUmVsZWFzZShidWZmZXJfYXR0cmlidXRlcyk7Ci0KLSAgICBpZiAoc3RhdHVzICE9IGtWREFEZWNvZGVyTm9FcnIpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgaW5pdGlhbGl6ZSBWREEgJWRcbiIsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgc3dpdGNoIChzdGF0dXMpIHsKLSAgICBjYXNlIGtWREFEZWNvZGVySGFyZHdhcmVOb3RTdXBwb3J0ZWRFcnI6Ci0gICAgY2FzZSBrVkRBRGVjb2RlckZvcm1hdE5vdFN1cHBvcnRlZEVycjoKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKLSAgICBjYXNlIGtWREFEZWNvZGVyQ29uZmlndXJhdGlvbkVycm9yOgotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIGNhc2Uga1ZEQURlY29kZXJEZWNvZGVyRmFpbGVkRXJyOgotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBjYXNlIGtWREFEZWNvZGVyTm9FcnI6Ci0gICAgICAgIHJldHVybiAwOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047Ci0gICAgfQotfQotCi1BVkhXQWNjZWwgZmZfaDI2NF92ZGFfaHdhY2NlbCA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF92ZGEiLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAotICAgIC5waXhfZm10ICAgICAgICA9IEFWX1BJWF9GTVRfVkRBLAotICAgIC5hbGxvY19mcmFtZSAgICA9IGZmX3ZpZGVvdG9vbGJveF9hbGxvY19mcmFtZSwKLSAgICAuc3RhcnRfZnJhbWUgICAgPSBmZl92aWRlb3Rvb2xib3hfaDI2NF9zdGFydF9mcmFtZSwKLSAgICAuZGVjb2RlX3NsaWNlICAgPSBmZl92aWRlb3Rvb2xib3hfaDI2NF9kZWNvZGVfc2xpY2UsCi0gICAgLmVuZF9mcmFtZSAgICAgID0gdmRhX2gyNjRfZW5kX2ZyYW1lLAotICAgIC51bmluaXQgICAgICAgICA9IGZmX3ZpZGVvdG9vbGJveF91bmluaXQsCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZUQ29udGV4dCksCi19OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92ZGFfaDI2NF9kZWMuYyBiL2xpYmF2Y29kZWMvdmRhX2gyNjRfZGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTI2OTMuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy92ZGFfaDI2NF9kZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDEyLCBYaWRvcm4gUXVhbgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSAqIEBmaWxlCi0gKiBILjI2NCBkZWNvZGVyIHZpYSBWREEKLSAqIEBhdXRob3IgWGlkb3JuIFF1YW4gPHF1YW54dW56aGVuQGdtYWlsLmNvbT4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Q29yZUZvdW5kYXRpb24vQ29yZUZvdW5kYXRpb24uaD4KLQotI2luY2x1ZGUgInZkYS5oIgotI2luY2x1ZGUgImgyNjQuaCIKLSNpbmNsdWRlICJhdmNvZGVjLmgiCi0KLSNpZm5kZWYga0NGQ29yZUZvdW5kYXRpb25WZXJzaW9uTnVtYmVyMTBfNwotI2RlZmluZSBrQ0ZDb3JlRm91bmRhdGlvblZlcnNpb25OdW1iZXIxMF83ICAgICAgNjM1LjAwCi0jZW5kaWYKLQotZXh0ZXJuIEFWQ29kZWMgZmZfaDI2NF9kZWNvZGVyLCBmZl9oMjY0X3ZkYV9kZWNvZGVyOwotCi1zdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHZkYV9waXhmbXRzX3ByaW9yXzEwXzdbXSA9IHsKLSAgICBBVl9QSVhfRk1UX1VZVlk0MjIsCi0gICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAotICAgIEFWX1BJWF9GTVRfTk9ORQotfTsKLQotc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCB2ZGFfcGl4Zm10c1tdID0gewotICAgIEFWX1BJWF9GTVRfVVlWWTQyMiwKLSAgICBBVl9QSVhfRk1UX1lVWVY0MjIsCi0gICAgQVZfUElYX0ZNVF9OVjEyLAotICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwKLSAgICBBVl9QSVhfRk1UX05PTkUKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBIMjY0Q29udGV4dCBoMjY0Y3R4OwotICAgIGludCBoMjY0X2luaXRpYWxpemVkOwotICAgIHN0cnVjdCB2ZGFfY29udGV4dCB2ZGFfY3R4OwotICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OwotCi0gICAgLyogZm9yIGJhY2tpbmctdXAgZmllbGRzIHNldCBieSB1c2VyLgotICAgICAqIHdlIGhhdmUgdG8gZ2FpbiBmdWxsIGNvbnRyb2wgb2Ygc3VjaCBmaWVsZHMgaGVyZSAqLwotICAgIHZvaWQgKmh3YWNjZWxfY29udGV4dDsKLSAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKCpnZXRfZm9ybWF0KShzdHJ1Y3QgQVZDb2RlY0NvbnRleHQgKnMsIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqIGZtdCk7Ci0gICAgaW50ICgqZ2V0X2J1ZmZlcjIpKHN0cnVjdCBBVkNvZGVjQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7Ci19IFZEQURlY29kZXJDb250ZXh0OwotCi1zdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGdldF9mb3JtYXQoc3RydWN0IEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpmbXQpCi17Ci0gICAgcmV0dXJuIEFWX1BJWF9GTVRfVkRBX1ZMRDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIENWUGl4ZWxCdWZmZXJSZWYgY3ZfYnVmZmVyOwotfSBWREFCdWZmZXJDb250ZXh0OwotCi1zdGF0aWMgdm9pZCByZWxlYXNlX2J1ZmZlcih2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCi17Ci0gICAgVkRBQnVmZmVyQ29udGV4dCAqY29udGV4dCA9IG9wYXF1ZTsKLSAgICBDVlBpeGVsQnVmZmVyVW5sb2NrQmFzZUFkZHJlc3MoY29udGV4dC0+Y3ZfYnVmZmVyLCAwKTsKLSAgICBDVlBpeGVsQnVmZmVyUmVsZWFzZShjb250ZXh0LT5jdl9idWZmZXIpOwotICAgIGF2X2ZyZWUoY29udGV4dCk7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2J1ZmZlcjIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpwaWMsIGludCBmbGFnKQotewotICAgIFZEQUJ1ZmZlckNvbnRleHQgKmNvbnRleHQgPSBhdl9tYWxsb2N6KHNpemVvZihWREFCdWZmZXJDb250ZXh0KSk7Ci0gICAgQVZCdWZmZXJSZWYgKmJ1ZmZlciA9IGF2X2J1ZmZlcl9jcmVhdGUoTlVMTCwgMCwgcmVsZWFzZV9idWZmZXIsIGNvbnRleHQsIDApOwotICAgIGlmICghY29udGV4dCB8fCAhYnVmZmVyKSB7Ci0gICAgICAgIGF2X2ZyZWUoY29udGV4dCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgcGljLT5idWZbMF0gPSBidWZmZXI7Ci0gICAgcGljLT5kYXRhWzBdID0gKHZvaWQgKikxOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIFZEQURlY29kZXJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGN0eC0+aHdhY2NlbF9jb250ZXh0ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKLSAgICBhdmN0eC0+aHdhY2NlbF9jb250ZXh0ID0gJmN0eC0+dmRhX2N0eDsKLSAgICBjdHgtPmdldF9mb3JtYXQgPSBhdmN0eC0+Z2V0X2Zvcm1hdDsKLSAgICBhdmN0eC0+Z2V0X2Zvcm1hdCA9IGdldF9mb3JtYXQ7Ci0gICAgY3R4LT5nZXRfYnVmZmVyMiA9IGF2Y3R4LT5nZXRfYnVmZmVyMjsKLSAgICBhdmN0eC0+Z2V0X2J1ZmZlcjIgPSBnZXRfYnVmZmVyMjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJlc3RvcmVfY29udGV4dChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgVkRBRGVjb2RlckNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgYXZjdHgtPmh3YWNjZWxfY29udGV4dCA9IGN0eC0+aHdhY2NlbF9jb250ZXh0OwotICAgIGF2Y3R4LT5nZXRfZm9ybWF0ID0gY3R4LT5nZXRfZm9ybWF0OwotICAgIGF2Y3R4LT5nZXRfYnVmZmVyMiA9IGN0eC0+Z2V0X2J1ZmZlcjI7Ci19Ci0KLXN0YXRpYyBpbnQgdmRhZGVjX2RlY29kZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCi17Ci0gICAgVkRBRGVjb2RlckNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZGcmFtZSAqcGljID0gZGF0YTsKLSAgICBpbnQgcmV0OwotCi0gICAgc2V0X2NvbnRleHQoYXZjdHgpOwotICAgIHJldCA9IGZmX2gyNjRfZGVjb2Rlci5kZWNvZGUoYXZjdHgsIGRhdGEsIGdvdF9mcmFtZSwgYXZwa3QpOwotICAgIHJlc3RvcmVfY29udGV4dChhdmN0eCk7Ci0gICAgaWYgKCpnb3RfZnJhbWUpIHsKLSAgICAgICAgQVZCdWZmZXJSZWYgKmJ1ZmZlciA9IHBpYy0+YnVmWzBdOwotICAgICAgICBWREFCdWZmZXJDb250ZXh0ICpjb250ZXh0ID0gYXZfYnVmZmVyX2dldF9vcGFxdWUoYnVmZmVyKTsKLSAgICAgICAgQ1ZQaXhlbEJ1ZmZlclJlZiBjdl9idWZmZXIgPSAoQ1ZQaXhlbEJ1ZmZlclJlZilwaWMtPmRhdGFbM107Ci0KLSAgICAgICAgQ1ZQaXhlbEJ1ZmZlclJldGFpbihjdl9idWZmZXIpOwotICAgICAgICBDVlBpeGVsQnVmZmVyTG9ja0Jhc2VBZGRyZXNzKGN2X2J1ZmZlciwgMCk7Ci0gICAgICAgIGNvbnRleHQtPmN2X2J1ZmZlciA9IGN2X2J1ZmZlcjsKLSAgICAgICAgcGljLT5mb3JtYXQgPSBjdHgtPnBpeF9mbXQ7Ci0gICAgICAgIGlmIChDVlBpeGVsQnVmZmVySXNQbGFuYXIoY3ZfYnVmZmVyKSkgewotICAgICAgICAgICAgaW50IGksIGNvdW50ID0gQ1ZQaXhlbEJ1ZmZlckdldFBsYW5lQ291bnQoY3ZfYnVmZmVyKTsKLSAgICAgICAgICAgIGF2X2Fzc2VydDAoY291bnQgPCA0KTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcGljLT5kYXRhW2ldID0gQ1ZQaXhlbEJ1ZmZlckdldEJhc2VBZGRyZXNzT2ZQbGFuZShjdl9idWZmZXIsIGkpOwotICAgICAgICAgICAgICAgIHBpYy0+bGluZXNpemVbaV0gPSBDVlBpeGVsQnVmZmVyR2V0Qnl0ZXNQZXJSb3dPZlBsYW5lKGN2X2J1ZmZlciwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwaWMtPmRhdGFbMF0gPSBDVlBpeGVsQnVmZmVyR2V0QmFzZUFkZHJlc3MoY3ZfYnVmZmVyKTsKLSAgICAgICAgICAgIHBpYy0+bGluZXNpemVbMF0gPSBDVlBpeGVsQnVmZmVyR2V0Qnl0ZXNQZXJSb3coY3ZfYnVmZmVyKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBhdmN0eC0+cGl4X2ZtdCA9IGN0eC0+cGl4X2ZtdDsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBhdl9jb2xkIGludCB2ZGFkZWNfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIFZEQURlY29kZXJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIC8qIHJlbGVhc2UgYnVmZmVycyBhbmQgZGVjb2RlciAqLwotICAgIGZmX3ZkYV9kZXN0cm95X2RlY29kZXIoJmN0eC0+dmRhX2N0eCk7Ci0gICAgLyogY2xvc2UgSC4yNjQgZGVjb2RlciAqLwotICAgIGlmIChjdHgtPmgyNjRfaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgc2V0X2NvbnRleHQoYXZjdHgpOwotICAgICAgICBmZl9oMjY0X2RlY29kZXIuY2xvc2UoYXZjdHgpOwotICAgICAgICByZXN0b3JlX2NvbnRleHQoYXZjdHgpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGF2X2NvbGQgaW50IHZkYWRlY19pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBWREFEZWNvZGVyQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBzdHJ1Y3QgdmRhX2NvbnRleHQgKnZkYV9jdHggPSAmY3R4LT52ZGFfY3R4OwotICAgIE9TU3RhdHVzIHN0YXR1czsKLSAgICBpbnQgcmV0LCBpOwotCi0gICAgY3R4LT5oMjY0X2luaXRpYWxpemVkID0gMDsKLQotICAgIC8qIGluaXQgcGl4X2ZtdHMgb2YgY29kZWMgKi8KLSAgICBpZiAoIWZmX2gyNjRfdmRhX2RlY29kZXIucGl4X2ZtdHMpIHsKLSAgICAgICAgaWYgKGtDRkNvcmVGb3VuZGF0aW9uVmVyc2lvbk51bWJlciA8IGtDRkNvcmVGb3VuZGF0aW9uVmVyc2lvbk51bWJlcjEwXzcpCi0gICAgICAgICAgICBmZl9oMjY0X3ZkYV9kZWNvZGVyLnBpeF9mbXRzID0gdmRhX3BpeGZtdHNfcHJpb3JfMTBfNzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZmZfaDI2NF92ZGFfZGVjb2Rlci5waXhfZm10cyA9IHZkYV9waXhmbXRzOwotICAgIH0KLQotICAgIC8qIGluaXQgdmRhICovCi0gICAgbWVtc2V0KHZkYV9jdHgsIDAsIHNpemVvZihzdHJ1Y3QgdmRhX2NvbnRleHQpKTsKLSAgICB2ZGFfY3R4LT53aWR0aCA9IGF2Y3R4LT53aWR0aDsKLSAgICB2ZGFfY3R4LT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OwotICAgIHZkYV9jdHgtPmZvcm1hdCA9ICdhdmMxJzsKLSAgICB2ZGFfY3R4LT51c2Vfc3luY19kZWNvZGluZyA9IDE7Ci0gICAgdmRhX2N0eC0+dXNlX3JlZl9idWZmZXIgPSAxOwotICAgIGN0eC0+cGl4X2ZtdCA9IGF2Y3R4LT5nZXRfZm9ybWF0KGF2Y3R4LCBhdmN0eC0+Y29kZWMtPnBpeF9mbXRzKTsKLSAgICBzd2l0Y2ggKGN0eC0+cGl4X2ZtdCkgewotICAgIGNhc2UgQVZfUElYX0ZNVF9VWVZZNDIyOgotICAgICAgICB2ZGFfY3R4LT5jdl9waXhfZm10X3R5cGUgPSAnMnZ1eSc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOgotICAgICAgICB2ZGFfY3R4LT5jdl9waXhfZm10X3R5cGUgPSAneXV2cyc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgotICAgICAgICB2ZGFfY3R4LT5jdl9waXhfZm10X3R5cGUgPSAnNDIwdic7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgotICAgICAgICB2ZGFfY3R4LT5jdl9waXhfZm10X3R5cGUgPSAneTQyMCc7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0OiAlZFxuIiwgYXZjdHgtPnBpeF9mbXQpOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0gICAgc3RhdHVzID0gZmZfdmRhX2NyZWF0ZV9kZWNvZGVyKHZkYV9jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBrVkRBRGVjb2Rlck5vRXJyKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gaW5pdCBWREEgZGVjb2RlcjogJWQuXG4iLCBzdGF0dXMpOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0KLSAgICAvKiBpbml0IEguMjY0IGRlY29kZXIgKi8KLSAgICBzZXRfY29udGV4dChhdmN0eCk7Ci0gICAgcmV0ID0gZmZfaDI2NF9kZWNvZGVyLmluaXQoYXZjdHgpOwotICAgIHJlc3RvcmVfY29udGV4dChhdmN0eCk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBILjI2NCBkZWNvZGVyLlxuIik7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBjdHgtPmgyNjRfaW5pdGlhbGl6ZWQgPSAxOwotCi0gICAgZm9yIChpID0gMDsgaSA8IE1BWF9TUFNfQ09VTlQ7IGkrKykgewotICAgICAgICBTUFMgKnNwcyA9IGN0eC0+aDI2NGN0eC5zcHNfYnVmZmVyc1tpXTsKLSAgICAgICAgaWYgKHNwcyAmJiAoc3BzLT5iaXRfZGVwdGhfbHVtYSAhPSA4IHx8Ci0gICAgICAgICAgICAgICAgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAyIHx8Ci0gICAgICAgICAgICAgICAgc3BzLT5jaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGb3JtYXQgaXMgbm90IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLQotZmFpbGVkOgotICAgIHZkYWRlY19jbG9zZShhdmN0eCk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCB2ZGFkZWNfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIHNldF9jb250ZXh0KGF2Y3R4KTsKLSAgICBmZl9oMjY0X2RlY29kZXIuZmx1c2goYXZjdHgpOwotICAgIHJlc3RvcmVfY29udGV4dChhdmN0eCk7Ci19Ci0KLUFWQ29kZWMgZmZfaDI2NF92ZGFfZGVjb2RlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAiaDI2NF92ZGEiLAotICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWREFEZWNvZGVyQ29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgID0gdmRhZGVjX2luaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gdmRhZGVjX2Nsb3NlLAotICAgIC5kZWNvZGUgICAgICAgICA9IHZkYWRlY19kZWNvZGUsCi0gICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZLAotICAgIC5mbHVzaCAgICAgICAgICA9IHZkYWRlY19mbHVzaCwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSC4yNjQgKFZEQSBhY2NlbGVyYXRpb24pIiksCi19OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92ZGFfdnRfaW50ZXJuYWwuaCBiL2xpYmF2Y29kZWMvdmRhX3Z0X2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjYzY2MuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy92ZGFfdnRfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2lmbmRlZiBBVkNPREVDX1ZEQV9WVF9JTlRFUk5BTF9ICi0jZGVmaW5lIEFWQ09ERUNfVkRBX1ZUX0lOVEVSTkFMX0gKLQotdm9pZCBmZl92ZGFfb3V0cHV0X2NhbGxiYWNrKHZvaWQgKnZkYV9od19jdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmIHVzZXJfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPU1N0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5mb0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWSW1hZ2VCdWZmZXJSZWYgaW1hZ2VfYnVmZmVyKTsKLQotaW50IGZmX3ZkYV9kZWZhdWx0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKLXZvaWQgZmZfdmRhX2RlZmF1bHRfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwotCi10eXBlZGVmIHN0cnVjdCBWVENvbnRleHQgewotICAgIC8vIFRoZSBjdXJyZW50IGJpdHN0cmVhbSBidWZmZXIuCi0gICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICpiaXRzdHJlYW07Ci0KLSAgICAvLyBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBiaXRzdHJlYW0uCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbV9zaXplOwotCi0gICAgLy8gVGhlIHJlZmVyZW5jZSBzaXplIHVzZWQgZm9yIGZhc3QgcmVhbGxvY2F0aW9uLgotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWRfc2l6ZTsKLQotICAgIC8vIFRoZSBjb3JlIHZpZGVvIGJ1ZmZlcgotICAgIENWSW1hZ2VCdWZmZXJSZWYgICAgICAgICAgICBmcmFtZTsKLX0gVlRDb250ZXh0OwotCi1pbnQgZmZfdmlkZW90b29sYm94X2FsbG9jX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpOwotaW50IGZmX3ZpZGVvdG9vbGJveF91bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKLWludCBmZl92aWRlb3Rvb2xib3hfYnVmZmVyX2NyZWF0ZShWVENvbnRleHQgKnZ0Y3R4LCBBVkZyYW1lICpmcmFtZSk7Ci1pbnQgZmZfdmlkZW90b29sYm94X2gyNjRfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKTsKLWludCBmZl92aWRlb3Rvb2xib3hfaDI2NF9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpOwotQ0ZEYXRhUmVmIGZmX3ZpZGVvdG9vbGJveF9hdmNjX2V4dHJhZGF0YV9jcmVhdGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KTsKLSNlbmRpZiAvKiBBVkNPREVDX1ZEQV9WVF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZkcGF1LmMgYi9saWJhdmNvZGVjL3ZkcGF1LmMKaW5kZXggYTAxYzQ0NS4uMWIyZWM5OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92ZHBhdS5jCisrKyBiL2xpYmF2Y29kZWMvdmRwYXUuYwpAQCAtMjIsMTkgKzIyLDE4IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImRlY29kZS5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAiaDI2NC5oIgorI2luY2x1ZGUgImgyNjRkZWMuaCIKICNpbmNsdWRlICJ2YzEuaCIKLQotI3VuZGVmIE5ERUJVRwotI2luY2x1ZGUgPGFzc2VydC5oPgotCiAjaW5jbHVkZSAidmRwYXUuaCIKLSNpbmNsdWRlICJ2ZHBhdV9jb21wYXQuaCIKICNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgogCisvLyBYWFg6IGF0IHRoZSB0aW1lIG9mIGFkZGluZyB0aGlzIGlmZGVmZXJ5LCBhdl9hc3NlcnQqIHdhc24ndCB1c2Ugb3V0c2lkZS4KKy8vIFdoZW4gZHJvcHBpbmcgaXQsIG1ha2Ugc3VyZSBvdGhlciBhdl9hc3NlcnQqIHdlcmUgbm90IGFkZGVkIHNpbmNlIHRoZW4uCisKIC8qKgogICogQGFkZHRvZ3JvdXAgVkRQQVVfRGVjb2RpbmcKICAqCkBAIC0xMTIsNiArMTExLDI1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK2ludCBmZl92ZHBhdV9jb21tb25fZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4KQoreworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpod19mcmFtZXMgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgVmRwQ2hyb21hVHlwZSB0eXBlOworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKworICAgIGlmIChhdl92ZHBhdV9nZXRfc3VyZmFjZV9wYXJhbWV0ZXJzKGF2Y3R4LCAmdHlwZSwgJndpZHRoLCAmaGVpZ2h0KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGh3X2ZyYW1lcy0+Zm9ybWF0ICAgID0gQVZfUElYX0ZNVF9WRFBBVTsKKyAgICBod19mcmFtZXMtPnN3X2Zvcm1hdCA9IGF2Y3R4LT5zd19waXhfZm10OworICAgIGh3X2ZyYW1lcy0+d2lkdGggICAgID0gd2lkdGg7CisgICAgaHdfZnJhbWVzLT5oZWlnaHQgICAgPSBoZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKK30KKwogaW50IGZmX3ZkcGF1X2NvbW1vbl9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVmRwRGVjb2RlclByb2ZpbGUgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpCiB7CkBAIC0xMjAsNiArMTM4LDggQEAKICAgICBWZHBWaWRlb1N1cmZhY2VRdWVyeUNhcGFiaWxpdGllcyAqc3VyZmFjZV9xdWVyeV9jYXBzOwogICAgIFZkcERlY29kZXJRdWVyeUNhcGFiaWxpdGllcyAqZGVjb2Rlcl9xdWVyeV9jYXBzOwogICAgIFZkcERlY29kZXJDcmVhdGUgKmNyZWF0ZTsKKyAgICBWZHBHZXRJbmZvcm1hdGlvblN0cmluZyAqaW5mbzsKKyAgICBjb25zdCBjaGFyICppbmZvX3N0cmluZzsKICAgICB2b2lkICpmdW5jOwogICAgIFZkcFN0YXR1cyBzdGF0dXM7CiAgICAgVmRwQm9vbCBzdXBwb3J0ZWQ7CkBAIC0xMjcsMzggKzE0Nyw3MCBAQAogICAgIFZkcENocm9tYVR5cGUgdHlwZTsKICAgICB1aW50MzJfdCB3aWR0aDsKICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgaW50IHJldDsKIAogICAgIHZkY3R4LT53aWR0aCAgICAgICAgICAgID0gVUlOVDMyX01BWDsKICAgICB2ZGN0eC0+aGVpZ2h0ICAgICAgICAgICA9IFVJTlQzMl9NQVg7CiAKLSAgICBpZiAoIWh3Y3R4KSB7Ci0gICAgICAgIHZkY3R4LT5kZXZpY2UgID0gVkRQX0lOVkFMSURfSEFORExFOwotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiaHdhY2NlbF9jb250ZXh0IGhhcyBub3QgYmVlbiBzZXR1cCBieSB0aGUgdXNlciBhcHBsaWNhdGlvbiwgY2Fubm90IGluaXRpYWxpemVcbiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoaHdjdHgtPmNvbnRleHQuZGVjb2RlciAhPSBWRFBfSU5WQUxJRF9IQU5ETEUpIHsKLSAgICAgICAgdmRjdHgtPmRlY29kZXIgPSBod2N0eC0+Y29udGV4dC5kZWNvZGVyOwotICAgICAgICB2ZGN0eC0+cmVuZGVyICA9IGh3Y3R4LT5jb250ZXh0LnJlbmRlcjsKLSAgICAgICAgdmRjdHgtPmRldmljZSAgPSBWRFBfSU5WQUxJRF9IQU5ETEU7Ci0gICAgICAgIHJldHVybiAwOyAvKiBEZWNvZGVyIGNyZWF0ZWQgYnkgdXNlciAqLwotICAgIH0KLSAgICBod2N0eC0+cmVzZXQgICAgICAgICAgICA9IDA7Ci0KLSAgICB2ZGN0eC0+ZGV2aWNlICAgICAgICAgICA9IGh3Y3R4LT5kZXZpY2U7Ci0gICAgdmRjdHgtPmdldF9wcm9jX2FkZHJlc3MgPSBod2N0eC0+Z2V0X3Byb2NfYWRkcmVzczsKLQotICAgIGlmIChod2N0eC0+ZmxhZ3MgJiBBVl9IV0FDQ0VMX0ZMQUdfSUdOT1JFX0xFVkVMKQotICAgICAgICBsZXZlbCA9IDA7Ci0gICAgZWxzZSBpZiAobGV2ZWwgPCAwKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9UU1VQKTsKLQogICAgIGlmIChhdl92ZHBhdV9nZXRfc3VyZmFjZV9wYXJhbWV0ZXJzKGF2Y3R4LCAmdHlwZSwgJndpZHRoLCAmaGVpZ2h0KSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKIAotICAgIGlmICghKGh3Y3R4LT5mbGFncyAmIEFWX0hXQUNDRUxfRkxBR19BTExPV19ISUdIX0RFUFRIKSAmJgotICAgICAgICB0eXBlICE9IFZEUF9DSFJPTUFfVFlQRV80MjApCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgaWYgKGh3Y3R4KSB7CisgICAgICAgIGh3Y3R4LT5yZXNldCAgICAgICAgICAgID0gMDsKKworICAgICAgICBpZiAoaHdjdHgtPmNvbnRleHQuZGVjb2RlciAhPSBWRFBfSU5WQUxJRF9IQU5ETEUpIHsKKyAgICAgICAgICAgIHZkY3R4LT5kZWNvZGVyID0gaHdjdHgtPmNvbnRleHQuZGVjb2RlcjsKKyAgICAgICAgICAgIHZkY3R4LT5yZW5kZXIgID0gaHdjdHgtPmNvbnRleHQucmVuZGVyOworICAgICAgICAgICAgdmRjdHgtPmRldmljZSAgPSBWRFBfSU5WQUxJRF9IQU5ETEU7CisgICAgICAgICAgICByZXR1cm4gMDsgLyogRGVjb2RlciBjcmVhdGVkIGJ5IHVzZXIgKi8KKyAgICAgICAgfQorCisgICAgICAgIHZkY3R4LT5kZXZpY2UgICAgICAgICAgID0gaHdjdHgtPmRldmljZTsKKyAgICAgICAgdmRjdHgtPmdldF9wcm9jX2FkZHJlc3MgPSBod2N0eC0+Z2V0X3Byb2NfYWRkcmVzczsKKworICAgICAgICBpZiAoaHdjdHgtPmZsYWdzICYgQVZfSFdBQ0NFTF9GTEFHX0lHTk9SRV9MRVZFTCkKKyAgICAgICAgICAgIGxldmVsID0gMDsKKworICAgICAgICBpZiAoIShod2N0eC0+ZmxhZ3MgJiBBVl9IV0FDQ0VMX0ZMQUdfQUxMT1dfSElHSF9ERVBUSCkgJiYKKyAgICAgICAgICAgIHR5cGUgIT0gVkRQX0NIUk9NQV9UWVBFXzQyMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHg7CisgICAgICAgIEFWVkRQQVVEZXZpY2VDb250ZXh0ICpkZXZfY3R4OworCisgICAgICAgIHJldCA9IGZmX2RlY29kZV9nZXRfaHdfZnJhbWVzX2N0eChhdmN0eCwgQVZfSFdERVZJQ0VfVFlQRV9WRFBBVSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBmcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilhdmN0eC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICAgICAgZGV2X2N0eCA9IGZyYW1lc19jdHgtPmRldmljZV9jdHgtPmh3Y3R4OworCisgICAgICAgIHZkY3R4LT5kZXZpY2UgICAgICAgICAgID0gZGV2X2N0eC0+ZGV2aWNlOworICAgICAgICB2ZGN0eC0+Z2V0X3Byb2NfYWRkcmVzcyA9IGRldl9jdHgtPmdldF9wcm9jX2FkZHJlc3M7CisKKyAgICAgICAgaWYgKGF2Y3R4LT5od2FjY2VsX2ZsYWdzICYgQVZfSFdBQ0NFTF9GTEFHX0lHTk9SRV9MRVZFTCkKKyAgICAgICAgICAgIGxldmVsID0gMDsKKyAgICB9CisKKyAgICBpZiAobGV2ZWwgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9UU1VQKTsKKworICAgIHN0YXR1cyA9IHZkY3R4LT5nZXRfcHJvY19hZGRyZXNzKHZkY3R4LT5kZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRQX0ZVTkNfSURfR0VUX0lORk9STUFUSU9OX1NUUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnVuYyk7CisgICAgaWYgKHN0YXR1cyAhPSBWRFBfU1RBVFVTX09LKQorICAgICAgICByZXR1cm4gdmRwYXVfZXJyb3Ioc3RhdHVzKTsKKyAgICBlbHNlCisgICAgICAgIGluZm8gPSBmdW5jOworCisgICAgc3RhdHVzID0gaW5mbygmaW5mb19zdHJpbmcpOworICAgIGlmIChzdGF0dXMgIT0gVkRQX1NUQVRVU19PSykKKyAgICAgICAgcmV0dXJuIHZkcGF1X2Vycm9yKHN0YXR1cyk7CisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDICYmIHN0cm5jbXAoaW5mb19zdHJpbmcsICJOVklESUEgIiwgNykgPT0gMCAmJgorICAgICAgICAhKGF2Y3R4LT5od2FjY2VsX2ZsYWdzICYgQVZfSFdBQ0NFTF9GTEFHX0FMTE9XX1BST0ZJTEVfTUlTTUFUQ0gpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJIRVZDIHdpdGggTlZJRElBIFZEUEFVIGRyaXZlcnMgaXMgYnVnZ3ksIHNraXBwaW5nLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1RTVVApOworICAgIH0KIAogICAgIHN0YXR1cyA9IHZkY3R4LT5nZXRfcHJvY19hZGRyZXNzKHZkY3R4LT5kZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkRQX0ZVTkNfSURfVklERU9fU1VSRkFDRV9RVUVSWV9DQVBBQklMSVRJRVMsCkBAIC0yNTYsNyArMzA4LDcgQEAKICAgICBpZiAodmRjdHgtPmRldmljZSA9PSBWRFBfSU5WQUxJRF9IQU5ETEUpCiAgICAgICAgIHJldHVybiAwOyAvKiBEZWNvZGVyIGNyZWF0ZWQgYnkgdXNlciAqLwogICAgIGlmIChhdmN0eC0+Y29kZWRfd2lkdGggPT0gdmRjdHgtPndpZHRoICYmCi0gICAgICAgIGF2Y3R4LT5jb2RlZF9oZWlnaHQgPT0gdmRjdHgtPmhlaWdodCAmJiAhaHdjdHgtPnJlc2V0KQorICAgICAgICBhdmN0eC0+Y29kZWRfaGVpZ2h0ID09IHZkY3R4LT5oZWlnaHQgJiYgKCFod2N0eCB8fCAhaHdjdHgtPnJlc2V0KSkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBhdmN0eC0+aHdhY2NlbC0+dW5pbml0KGF2Y3R4KTsKQEAgLTI4NiwzNCArMzM4LDE2IEBACiAgICAgaWYgKHZhbCA8IDApCiAgICAgICAgIHJldHVybiB2YWw7CiAKLSNpZiBGRl9BUElfQlVGU19WRFBBVQotRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGF2X2Fzc2VydDAoc2l6ZW9mKGh3Y3R4LT5pbmZvKSA8PSBzaXplb2YocGljX2N0eC0+aW5mbykpOwotICAgIG1lbWNweSgmaHdjdHgtPmluZm8sICZwaWNfY3R4LT5pbmZvLCBzaXplb2YoaHdjdHgtPmluZm8pKTsKLSAgICBod2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnMgPSBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVyczsKLSAgICBod2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZCA9IHBpY19jdHgtPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQ7Ci0gICAgaHdjdHgtPmJpdHN0cmVhbV9idWZmZXJzX2FsbG9jYXRlZCA9IHBpY19jdHgtPmJpdHN0cmVhbV9idWZmZXJzX2FsbG9jYXRlZDsKLUZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotI2VuZGlmCi0KLSAgICBpZiAoIWh3Y3R4LT5yZW5kZXIgJiYgaHdjdHgtPnJlbmRlcjIpIHsKKyAgICBpZiAoaHdjdHggJiYgIWh3Y3R4LT5yZW5kZXIgJiYgaHdjdHgtPnJlbmRlcjIpIHsKICAgICAgICAgc3RhdHVzID0gaHdjdHgtPnJlbmRlcjIoYXZjdHgsIGZyYW1lLCAodm9pZCAqKSZwaWNfY3R4LT5pbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVyc191c2VkLCBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVycyk7CiAgICAgfSBlbHNlCi0gICAgc3RhdHVzID0gdmRjdHgtPnJlbmRlcih2ZGN0eC0+ZGVjb2Rlciwgc3VyZiwgKHZvaWQgKikmcGljX2N0eC0+aW5mbywKKyAgICBzdGF0dXMgPSB2ZGN0eC0+cmVuZGVyKHZkY3R4LT5kZWNvZGVyLCBzdXJmLCAmcGljX2N0eC0+aW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY19jdHgtPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNfY3R4LT5iaXRzdHJlYW1fYnVmZmVycyk7CiAKICAgICBhdl9mcmVlcCgmcGljX2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnMpOwogCi0jaWYgRkZfQVBJX0JVRlNfVkRQQVUKLUZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKLSAgICBod2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnMgPSBOVUxMOwotICAgIGh3Y3R4LT5iaXRzdHJlYW1fYnVmZmVyc191c2VkID0gMDsKLSAgICBod2N0eC0+Yml0c3RyZWFtX2J1ZmZlcnNfYWxsb2NhdGVkID0gMDsKLUZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotI2VuZGlmCi0KICAgICByZXR1cm4gdmRwYXVfZXJyb3Ioc3RhdHVzKTsKIH0KIApAQCAtMzU1LDM0NSArMzg5LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLyogT2Jzb2xldGUgbm9uLWh3YWNjZWwgVkRQQVUgc3VwcG9ydCBiZWxvdy4uLiAqLwotCi0jaWYgRkZfQVBJX1ZEUEFVCi12b2lkIGZmX3ZkcGF1X2FkZF9kYXRhX2NodW5rKHVpbnQ4X3QgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQotewotICAgIHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKnJlbmRlciA9IChzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlKilkYXRhOwotICAgIGFzc2VydChyZW5kZXIpOwotCi0gICAgcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVycz0gYXZfZmFzdF9yZWFsbG9jKAotICAgICAgICByZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzLAotICAgICAgICAmcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVyc19hbGxvY2F0ZWQsCi0gICAgICAgIHNpemVvZigqcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVycykqKHJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZCArIDEpCi0gICAgKTsKLQotICAgIHJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNbcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVyc191c2VkXS5zdHJ1Y3RfdmVyc2lvbiAgPSBWRFBfQklUU1RSRUFNX0JVRkZFUl9WRVJTSU9OOwotICAgIHJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNbcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVyc191c2VkXS5iaXRzdHJlYW0gICAgICAgPSBidWY7Ci0gICAgcmVuZGVyLT5iaXRzdHJlYW1fYnVmZmVyc1tyZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzX3VzZWRdLmJpdHN0cmVhbV9ieXRlcyA9IGJ1Zl9zaXplOwotICAgIHJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZCsrOwotfQotCi0jaWYgQ09ORklHX0gyNjRfVkRQQVVfREVDT0RFUgotdm9pZCBmZl92ZHBhdV9oMjY0X3NldF9yZWZlcmVuY2VfZnJhbWVzKEgyNjRDb250ZXh0ICpoKQotewotICAgIHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKnJlbmRlciwgKnJlbmRlcl9yZWY7Ci0gICAgVmRwUmVmZXJlbmNlRnJhbWVIMjY0ICpyZiwgKnJmMjsKLSAgICBIMjY0UGljdHVyZSAqcGljOwotICAgIGludCBpLCBsaXN0LCBwaWNfZnJhbWVfaWR4OwotCi0gICAgcmVuZGVyID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKiloLT5jdXJfcGljX3B0ci0+Zi0+ZGF0YVswXTsKLSAgICBhc3NlcnQocmVuZGVyKTsKLQotICAgIHJmID0gJnJlbmRlci0+aW5mby5oMjY0LnJlZmVyZW5jZUZyYW1lc1swXTsKLSNkZWZpbmUgSDI2NF9SRl9DT1VOVCBGRl9BUlJBWV9FTEVNUyhyZW5kZXItPmluZm8uaDI2NC5yZWZlcmVuY2VGcmFtZXMpCi0KLSAgICBmb3IgKGxpc3QgPSAwOyBsaXN0IDwgMjsgKytsaXN0KSB7Ci0gICAgICAgIEgyNjRQaWN0dXJlICoqbHAgPSBsaXN0ID8gaC0+bG9uZ19yZWYgOiBoLT5zaG9ydF9yZWY7Ci0gICAgICAgIGludCBscyA9IGxpc3QgPyAxNiA6IGgtPnNob3J0X3JlZl9jb3VudDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbHM7ICsraSkgewotICAgICAgICAgICAgcGljID0gbHBbaV07Ci0gICAgICAgICAgICBpZiAoIXBpYyB8fCAhcGljLT5yZWZlcmVuY2UpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBwaWNfZnJhbWVfaWR4ID0gcGljLT5sb25nX3JlZiA/IHBpYy0+cGljX2lkIDogcGljLT5mcmFtZV9udW07Ci0KLSAgICAgICAgICAgIHJlbmRlcl9yZWYgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqKXBpYy0+Zi0+ZGF0YVswXTsKLSAgICAgICAgICAgIGFzc2VydChyZW5kZXJfcmVmKTsKLQotICAgICAgICAgICAgcmYyID0gJnJlbmRlci0+aW5mby5oMjY0LnJlZmVyZW5jZUZyYW1lc1swXTsKLSAgICAgICAgICAgIHdoaWxlIChyZjIgIT0gcmYpIHsKLSAgICAgICAgICAgICAgICBpZiAoCi0gICAgICAgICAgICAgICAgICAgIChyZjItPnN1cmZhY2UgPT0gcmVuZGVyX3JlZi0+c3VyZmFjZSkKLSAgICAgICAgICAgICAgICAgICAgJiYgKHJmMi0+aXNfbG9uZ190ZXJtID09IHBpYy0+bG9uZ19yZWYpCi0gICAgICAgICAgICAgICAgICAgICYmIChyZjItPmZyYW1lX2lkeCA9PSBwaWNfZnJhbWVfaWR4KQotICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgKytyZjI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmYyICE9IHJmKSB7Ci0gICAgICAgICAgICAgICAgcmYyLT50b3BfaXNfcmVmZXJlbmNlICAgIHw9IChwaWMtPnJlZmVyZW5jZSAmIFBJQ1RfVE9QX0ZJRUxEKSAgICA/IFZEUF9UUlVFIDogVkRQX0ZBTFNFOwotICAgICAgICAgICAgICAgIHJmMi0+Ym90dG9tX2lzX3JlZmVyZW5jZSB8PSAocGljLT5yZWZlcmVuY2UgJiBQSUNUX0JPVFRPTV9GSUVMRCkgPyBWRFBfVFJVRSA6IFZEUF9GQUxTRTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJmID49ICZyZW5kZXItPmluZm8uaDI2NC5yZWZlcmVuY2VGcmFtZXNbSDI2NF9SRl9DT1VOVF0pCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIHJmLT5zdXJmYWNlICAgICAgICAgICAgID0gcmVuZGVyX3JlZi0+c3VyZmFjZTsKLSAgICAgICAgICAgIHJmLT5pc19sb25nX3Rlcm0gICAgICAgID0gcGljLT5sb25nX3JlZjsKLSAgICAgICAgICAgIHJmLT50b3BfaXNfcmVmZXJlbmNlICAgID0gKHBpYy0+cmVmZXJlbmNlICYgUElDVF9UT1BfRklFTEQpICAgID8gVkRQX1RSVUUgOiBWRFBfRkFMU0U7Ci0gICAgICAgICAgICByZi0+Ym90dG9tX2lzX3JlZmVyZW5jZSA9IChwaWMtPnJlZmVyZW5jZSAmIFBJQ1RfQk9UVE9NX0ZJRUxEKSA/IFZEUF9UUlVFIDogVkRQX0ZBTFNFOwotICAgICAgICAgICAgcmYtPmZpZWxkX29yZGVyX2NudFswXSAgPSBwaWMtPmZpZWxkX3BvY1swXTsKLSAgICAgICAgICAgIHJmLT5maWVsZF9vcmRlcl9jbnRbMV0gID0gcGljLT5maWVsZF9wb2NbMV07Ci0gICAgICAgICAgICByZi0+ZnJhbWVfaWR4ICAgICAgICAgICA9IHBpY19mcmFtZV9pZHg7Ci0KLSAgICAgICAgICAgICsrcmY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKDsgcmYgPCAmcmVuZGVyLT5pbmZvLmgyNjQucmVmZXJlbmNlRnJhbWVzW0gyNjRfUkZfQ09VTlRdOyArK3JmKSB7Ci0gICAgICAgIHJmLT5zdXJmYWNlICAgICAgICAgICAgID0gVkRQX0lOVkFMSURfSEFORExFOwotICAgICAgICByZi0+aXNfbG9uZ190ZXJtICAgICAgICA9IDA7Ci0gICAgICAgIHJmLT50b3BfaXNfcmVmZXJlbmNlICAgID0gMDsKLSAgICAgICAgcmYtPmJvdHRvbV9pc19yZWZlcmVuY2UgPSAwOwotICAgICAgICByZi0+ZmllbGRfb3JkZXJfY250WzBdICA9IDA7Ci0gICAgICAgIHJmLT5maWVsZF9vcmRlcl9jbnRbMV0gID0gMDsKLSAgICAgICAgcmYtPmZyYW1lX2lkeCAgICAgICAgICAgPSAwOwotICAgIH0KLX0KLQotdm9pZCBmZl92ZHBhdV9oMjY0X3BpY3R1cmVfc3RhcnQoSDI2NENvbnRleHQgKmgpCi17Ci0gICAgc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqcmVuZGVyOwotICAgIGludCBpOwotCi0gICAgcmVuZGVyID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKiloLT5jdXJfcGljX3B0ci0+Zi0+ZGF0YVswXTsKLSAgICBhc3NlcnQocmVuZGVyKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgICAgaW50IGZvYyA9IGgtPmN1cl9waWNfcHRyLT5maWVsZF9wb2NbaV07Ci0gICAgICAgIGlmIChmb2MgPT0gSU5UX01BWCkKLSAgICAgICAgICAgIGZvYyA9IDA7Ci0gICAgICAgIHJlbmRlci0+aW5mby5oMjY0LmZpZWxkX29yZGVyX2NudFtpXSA9IGZvYzsKLSAgICB9Ci0KLSAgICByZW5kZXItPmluZm8uaDI2NC5mcmFtZV9udW0gPSBoLT5mcmFtZV9udW07Ci19Ci0KLXZvaWQgZmZfdmRwYXVfaDI2NF9waWN0dXJlX2NvbXBsZXRlKEgyNjRDb250ZXh0ICpoKQotewotICAgIHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKnJlbmRlcjsKLQotICAgIHJlbmRlciA9IChzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICopaC0+Y3VyX3BpY19wdHItPmYtPmRhdGFbMF07Ci0gICAgYXNzZXJ0KHJlbmRlcik7Ci0KLSAgICByZW5kZXItPmluZm8uaDI2NC5zbGljZV9jb3VudCA9IGgtPmN1cnJlbnRfc2xpY2U7Ci0gICAgaWYgKHJlbmRlci0+aW5mby5oMjY0LnNsaWNlX2NvdW50IDwgMSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcmVuZGVyLT5pbmZvLmgyNjQuaXNfcmVmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoaC0+Y3VyX3BpY19wdHItPnJlZmVyZW5jZSAmIDMpID8gVkRQX1RSVUUgOiBWRFBfRkFMU0U7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQuZmllbGRfcGljX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FOwotICAgIHJlbmRlci0+aW5mby5oMjY0LmJvdHRvbV9maWVsZF9mbGFnICAgICAgICAgICAgICAgICAgICAgID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQ7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQubnVtX3JlZl9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMucmVmX2ZyYW1lX2NvdW50OwotICAgIHJlbmRlci0+aW5mby5oMjY0Lm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgICAgICAgICAgID0gaC0+c3BzLm1iX2FmZiAmJiAhcmVuZGVyLT5pbmZvLmgyNjQuZmllbGRfcGljX2ZsYWc7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQuY29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnICAgICAgICAgICAgPSBoLT5wcHMuY29uc3RyYWluZWRfaW50cmFfcHJlZDsKLSAgICByZW5kZXItPmluZm8uaDI2NC53ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy53ZWlnaHRlZF9wcmVkOwotICAgIHJlbmRlci0+aW5mby5oMjY0LndlaWdodGVkX2JpcHJlZF9pZGMgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGM7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQuZnJhbWVfbWJzX29ubHlfZmxhZyAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZzsKLSAgICByZW5kZXItPmluZm8uaDI2NC50cmFuc2Zvcm1fOHg4X21vZGVfZmxhZyAgICAgICAgICAgICAgICA9IGgtPnBwcy50cmFuc2Zvcm1fOHg4X21vZGU7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQuY2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICAgICAgICAgPSBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFswXTsKLSAgICByZW5kZXItPmluZm8uaDI2NC5zZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICA9IGgtPnBwcy5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdOwotICAgIHJlbmRlci0+aW5mby5oMjY0LnBpY19pbml0X3FwX21pbnVzMjYgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLmluaXRfcXAgLSAyNjsKLSAgICByZW5kZXItPmluZm8uaDI2NC5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICAgICAgICAgICA9IGgtPnBwcy5yZWZfY291bnRbMF0gLSAxOwotICAgIHJlbmRlci0+aW5mby5oMjY0Lm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgICAgICAgICAgID0gaC0+cHBzLnJlZl9jb3VudFsxXSAtIDE7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQubG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAgICAgICAgICAgICAgPSBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtIC0gNDsKLSAgICByZW5kZXItPmluZm8uaDI2NC5waWNfb3JkZXJfY250X3R5cGUgICAgICAgICAgICAgICAgICAgICA9IGgtPnNwcy5wb2NfdHlwZTsKLSAgICByZW5kZXItPmluZm8uaDI2NC5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgICAgICA9IGgtPnNwcy5wb2NfdHlwZSA/IDAgOiBoLT5zcHMubG9nMl9tYXhfcG9jX2xzYiAtIDQ7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgICAgICAgPSBoLT5zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAgICAgICAgICAgICAgPSBoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKLSAgICByZW5kZXItPmluZm8uaDI2NC5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgICAgICAgICAgICAgICA9IGgtPnBwcy5jYWJhYzsKLSAgICByZW5kZXItPmluZm8uaDI2NC5waWNfb3JkZXJfcHJlc2VudF9mbGFnICAgICAgICAgICAgICAgICA9IGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudDsKLSAgICByZW5kZXItPmluZm8uaDI2NC5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IGgtPnBwcy5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQ7Ci0gICAgcmVuZGVyLT5pbmZvLmgyNjQucmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnICAgICAgICAgPSBoLT5wcHMucmVkdW5kYW50X3BpY19jbnRfcHJlc2VudDsKLSAgICBtZW1jcHkocmVuZGVyLT5pbmZvLmgyNjQuc2NhbGluZ19saXN0c180eDQsIGgtPnBwcy5zY2FsaW5nX21hdHJpeDQsIHNpemVvZihyZW5kZXItPmluZm8uaDI2NC5zY2FsaW5nX2xpc3RzXzR4NCkpOwotICAgIG1lbWNweShyZW5kZXItPmluZm8uaDI2NC5zY2FsaW5nX2xpc3RzXzh4OFswXSwgaC0+cHBzLnNjYWxpbmdfbWF0cml4OFswXSwgc2l6ZW9mKHJlbmRlci0+aW5mby5oMjY0LnNjYWxpbmdfbGlzdHNfOHg4WzBdKSk7Ci0gICAgbWVtY3B5KHJlbmRlci0+aW5mby5oMjY0LnNjYWxpbmdfbGlzdHNfOHg4WzFdLCBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzNdLCBzaXplb2YocmVuZGVyLT5pbmZvLmgyNjQuc2NhbGluZ19saXN0c184eDhbMF0pKTsKLQotICAgIGZmX2gyNjRfZHJhd19ob3Jpel9iYW5kKGgsICZoLT5zbGljZV9jdHhbMF0sIDAsIGgtPmF2Y3R4LT5oZWlnaHQpOwotICAgIHJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZCA9IDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0gyNjRfVkRQQVVfREVDT0RFUiAqLwotCi0jaWYgQ09ORklHX01QRUdfVkRQQVVfREVDT0RFUiB8fCBDT05GSUdfTVBFRzFfVkRQQVVfREVDT0RFUgotdm9pZCBmZl92ZHBhdV9tcGVnX3BpY3R1cmVfY29tcGxldGUoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgaW50IHNsaWNlX2NvdW50KQotewotICAgIHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKnJlbmRlciwgKmxhc3QsICpuZXh0OwotICAgIGludCBpOwotCi0gICAgaWYgKCFzLT5jdXJyZW50X3BpY3R1cmVfcHRyKSByZXR1cm47Ci0KLSAgICByZW5kZXIgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqKXMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGFbMF07Ci0gICAgYXNzZXJ0KHJlbmRlcik7Ci0KLSAgICAvKiBmaWxsIFZkcFBpY3R1cmVJbmZvTVBFRzFPcjIgc3RydWN0ICovCi0gICAgcmVuZGVyLT5pbmZvLm1wZWcucGljdHVyZV9zdHJ1Y3R1cmUgICAgICAgICAgPSBzLT5waWN0dXJlX3N0cnVjdHVyZTsKLSAgICByZW5kZXItPmluZm8ubXBlZy5waWN0dXJlX2NvZGluZ190eXBlICAgICAgICA9IHMtPnBpY3RfdHlwZTsKLSAgICByZW5kZXItPmluZm8ubXBlZy5pbnRyYV9kY19wcmVjaXNpb24gICAgICAgICA9IHMtPmludHJhX2RjX3ByZWNpc2lvbjsKLSAgICByZW5kZXItPmluZm8ubXBlZy5mcmFtZV9wcmVkX2ZyYW1lX2RjdCAgICAgICA9IHMtPmZyYW1lX3ByZWRfZnJhbWVfZGN0OwotICAgIHJlbmRlci0+aW5mby5tcGVnLmNvbmNlYWxtZW50X21vdGlvbl92ZWN0b3JzID0gcy0+Y29uY2VhbG1lbnRfbW90aW9uX3ZlY3RvcnM7Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWcuaW50cmFfdmxjX2Zvcm1hdCAgICAgICAgICAgPSBzLT5pbnRyYV92bGNfZm9ybWF0OwotICAgIHJlbmRlci0+aW5mby5tcGVnLmFsdGVybmF0ZV9zY2FuICAgICAgICAgICAgID0gcy0+YWx0ZXJuYXRlX3NjYW47Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWcucV9zY2FsZV90eXBlICAgICAgICAgICAgICAgPSBzLT5xX3NjYWxlX3R5cGU7Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWcudG9wX2ZpZWxkX2ZpcnN0ICAgICAgICAgICAgPSBzLT50b3BfZmllbGRfZmlyc3Q7Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWcuZnVsbF9wZWxfZm9yd2FyZF92ZWN0b3IgICAgPSBzLT5mdWxsX3BlbFswXTsgLy8gTVBFRy0xIG9ubHkuICBTZXQgMCBmb3IgTVBFRy0yCi0gICAgcmVuZGVyLT5pbmZvLm1wZWcuZnVsbF9wZWxfYmFja3dhcmRfdmVjdG9yICAgPSBzLT5mdWxsX3BlbFsxXTsgLy8gTVBFRy0xIG9ubHkuICBTZXQgMCBmb3IgTVBFRy0yCi0gICAgcmVuZGVyLT5pbmZvLm1wZWcuZl9jb2RlWzBdWzBdICAgICAgICAgICAgICAgPSBzLT5tcGVnX2ZfY29kZVswXVswXTsgLy8gRm9yIE1QRUctMSBmaWxsIGJvdGggaG9yaXouICYgdmVydC4KLSAgICByZW5kZXItPmluZm8ubXBlZy5mX2NvZGVbMF1bMV0gICAgICAgICAgICAgICA9IHMtPm1wZWdfZl9jb2RlWzBdWzFdOwotICAgIHJlbmRlci0+aW5mby5tcGVnLmZfY29kZVsxXVswXSAgICAgICAgICAgICAgID0gcy0+bXBlZ19mX2NvZGVbMV1bMF07Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWcuZl9jb2RlWzFdWzFdICAgICAgICAgICAgICAgPSBzLT5tcGVnX2ZfY29kZVsxXVsxXTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkgewotICAgICAgICByZW5kZXItPmluZm8ubXBlZy5pbnRyYV9xdWFudGl6ZXJfbWF0cml4W2ldICAgICA9IHMtPmludHJhX21hdHJpeFtpXTsKLSAgICAgICAgcmVuZGVyLT5pbmZvLm1wZWcubm9uX2ludHJhX3F1YW50aXplcl9tYXRyaXhbaV0gPSBzLT5pbnRlcl9tYXRyaXhbaV07Ci0gICAgfQotCi0gICAgcmVuZGVyLT5pbmZvLm1wZWcuZm9yd2FyZF9yZWZlcmVuY2UgICAgICAgICAgPSBWRFBfSU5WQUxJRF9IQU5ETEU7Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWcuYmFja3dhcmRfcmVmZXJlbmNlICAgICAgICAgPSBWRFBfSU5WQUxJRF9IQU5ETEU7Ci0KLSAgICBzd2l0Y2gocy0+cGljdF90eXBlKXsKLSAgICBjYXNlICBBVl9QSUNUVVJFX1RZUEVfQjoKLSAgICAgICAgbmV4dCA9IChzdHJ1Y3QgdmRwYXVfcmVuZGVyX3N0YXRlICopcy0+bmV4dF9waWN0dXJlLmYtPmRhdGFbMF07Ci0gICAgICAgIGFzc2VydChuZXh0KTsKLSAgICAgICAgcmVuZGVyLT5pbmZvLm1wZWcuYmFja3dhcmRfcmVmZXJlbmNlICAgICA9IG5leHQtPnN1cmZhY2U7Ci0gICAgICAgIC8vIG5vIHJldHVybiBoZXJlLCBnb2luZyB0byBzZXQgZm9yd2FyZCBwcmVkaWN0aW9uCi0gICAgY2FzZSAgQVZfUElDVFVSRV9UWVBFX1A6Ci0gICAgICAgIGxhc3QgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqKXMtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzBdOwotICAgICAgICBpZiAoIWxhc3QpIC8vIEZJWE1FOiBEb2VzIHRoaXMgdGVzdCBtYWtlIHNlbnNlPwotICAgICAgICAgICAgbGFzdCA9IHJlbmRlcjsgLy8gcHJlZGljdCBzZWNvbmQgZmllbGQgZnJvbSB0aGUgZmlyc3QKLSAgICAgICAgcmVuZGVyLT5pbmZvLm1wZWcuZm9yd2FyZF9yZWZlcmVuY2UgICAgICA9IGxhc3QtPnN1cmZhY2U7Ci0gICAgfQotCi0gICAgZmZfdmRwYXVfYWRkX2RhdGFfY2h1bmsocy0+Y3VycmVudF9waWN0dXJlX3B0ci0+Zi0+ZGF0YVswXSwgYnVmLCBidWZfc2l6ZSk7Ci0KLSAgICByZW5kZXItPmluZm8ubXBlZy5zbGljZV9jb3VudCAgICAgICAgICAgICAgICA9IHNsaWNlX2NvdW50OwotCi0gICAgaWYgKHNsaWNlX2NvdW50KQotICAgICAgICBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChzLCAwLCBzLT5hdmN0eC0+aGVpZ2h0KTsKLSAgICByZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQgICAgICAgICAgICAgICA9IDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX01QRUdfVkRQQVVfREVDT0RFUiB8fCBDT05GSUdfTVBFRzFfVkRQQVVfREVDT0RFUiAqLwotCi0jaWYgQ09ORklHX1ZDMV9WRFBBVV9ERUNPREVSCi12b2lkIGZmX3ZkcGF1X3ZjMV9kZWNvZGVfcGljdHVyZShNcGVnRW5jQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKQotewotICAgIFZDMUNvbnRleHQgKnYgPSBzLT5hdmN0eC0+cHJpdl9kYXRhOwotICAgIHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKnJlbmRlciwgKmxhc3QsICpuZXh0OwotCi0gICAgcmVuZGVyID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilzLT5jdXJyZW50X3BpY3R1cmUuZi0+ZGF0YVswXTsKLSAgICBhc3NlcnQocmVuZGVyKTsKLQotICAgIC8qICBmaWxsIEx2UGljdHVyZUluZm9WQzEgc3RydWN0ICovCi0gICAgcmVuZGVyLT5pbmZvLnZjMS5mcmFtZV9jb2RpbmdfbW9kZSAgPSB2LT5mY20gPyB2LT5mY20gKyAxIDogMDsKLSAgICByZW5kZXItPmluZm8udmMxLnBvc3Rwcm9jZmxhZyAgICAgICA9IHYtPnBvc3Rwcm9jZmxhZzsKLSAgICByZW5kZXItPmluZm8udmMxLnB1bGxkb3duICAgICAgICAgICA9IHYtPmJyb2FkY2FzdDsKLSAgICByZW5kZXItPmluZm8udmMxLmludGVybGFjZSAgICAgICAgICA9IHYtPmludGVybGFjZTsKLSAgICByZW5kZXItPmluZm8udmMxLnRmY250cmZsYWcgICAgICAgICA9IHYtPnRmY250cmZsYWc7Ci0gICAgcmVuZGVyLT5pbmZvLnZjMS5maW50ZXJwZmxhZyAgICAgICAgPSB2LT5maW50ZXJwZmxhZzsKLSAgICByZW5kZXItPmluZm8udmMxLnBzZiAgICAgICAgICAgICAgICA9IHYtPnBzZjsKLSAgICByZW5kZXItPmluZm8udmMxLmRxdWFudCAgICAgICAgICAgICA9IHYtPmRxdWFudDsKLSAgICByZW5kZXItPmluZm8udmMxLnBhbnNjYW5fZmxhZyAgICAgICA9IHYtPnBhbnNjYW5mbGFnOwotICAgIHJlbmRlci0+aW5mby52YzEucmVmZGlzdF9mbGFnICAgICAgID0gdi0+cmVmZGlzdF9mbGFnOwotICAgIHJlbmRlci0+aW5mby52YzEucXVhbnRpemVyICAgICAgICAgID0gdi0+cXVhbnRpemVyX21vZGU7Ci0gICAgcmVuZGVyLT5pbmZvLnZjMS5leHRlbmRlZF9tdiAgICAgICAgPSB2LT5leHRlbmRlZF9tdjsKLSAgICByZW5kZXItPmluZm8udmMxLmV4dGVuZGVkX2RtdiAgICAgICA9IHYtPmV4dGVuZGVkX2RtdjsKLSAgICByZW5kZXItPmluZm8udmMxLm92ZXJsYXAgICAgICAgICAgICA9IHYtPm92ZXJsYXA7Ci0gICAgcmVuZGVyLT5pbmZvLnZjMS52c3RyYW5zZm9ybSAgICAgICAgPSB2LT52c3RyYW5zZm9ybTsKLSAgICByZW5kZXItPmluZm8udmMxLmxvb3BmaWx0ZXIgICAgICAgICA9IHYtPnMubG9vcF9maWx0ZXI7Ci0gICAgcmVuZGVyLT5pbmZvLnZjMS5mYXN0dXZtYyAgICAgICAgICAgPSB2LT5mYXN0dXZtYzsKLSAgICByZW5kZXItPmluZm8udmMxLnJhbmdlX21hcHlfZmxhZyAgICA9IHYtPnJhbmdlX21hcHlfZmxhZzsKLSAgICByZW5kZXItPmluZm8udmMxLnJhbmdlX21hcHkgICAgICAgICA9IHYtPnJhbmdlX21hcHk7Ci0gICAgcmVuZGVyLT5pbmZvLnZjMS5yYW5nZV9tYXB1dl9mbGFnICAgPSB2LT5yYW5nZV9tYXB1dl9mbGFnOwotICAgIHJlbmRlci0+aW5mby52YzEucmFuZ2VfbWFwdXYgICAgICAgID0gdi0+cmFuZ2VfbWFwdXY7Ci0gICAgLyogU3BlY2lmaWMgdG8gc2ltcGxlL21haW4gcHJvZmlsZSBvbmx5ICovCi0gICAgcmVuZGVyLT5pbmZvLnZjMS5tdWx0aXJlcyAgICAgICAgICAgPSB2LT5tdWx0aXJlczsKLSAgICByZW5kZXItPmluZm8udmMxLnN5bmNtYXJrZXIgICAgICAgICA9IHYtPnJlc3luY19tYXJrZXI7Ci0gICAgcmVuZGVyLT5pbmZvLnZjMS5yYW5nZXJlZCAgICAgICAgICAgPSB2LT5yYW5nZXJlZCB8ICh2LT5yYW5nZXJlZGZybSA8PCAxKTsKLSAgICByZW5kZXItPmluZm8udmMxLm1heGJmcmFtZXMgICAgICAgICA9IHYtPnMubWF4X2JfZnJhbWVzOwotCi0gICAgcmVuZGVyLT5pbmZvLnZjMS5kZWJsb2NrRW5hYmxlICAgICAgPSB2LT5wb3N0cHJvY2ZsYWcgJiAxOwotICAgIHJlbmRlci0+aW5mby52YzEucHF1YW50ICAgICAgICAgICAgID0gdi0+cHE7Ci0KLSAgICByZW5kZXItPmluZm8udmMxLmZvcndhcmRfcmVmZXJlbmNlICA9IFZEUF9JTlZBTElEX0hBTkRMRTsKLSAgICByZW5kZXItPmluZm8udmMxLmJhY2t3YXJkX3JlZmVyZW5jZSA9IFZEUF9JTlZBTElEX0hBTkRMRTsKLQotICAgIGlmICh2LT5iaV90eXBlKQotICAgICAgICByZW5kZXItPmluZm8udmMxLnBpY3R1cmVfdHlwZSA9IDQ7Ci0gICAgZWxzZQotICAgICAgICByZW5kZXItPmluZm8udmMxLnBpY3R1cmVfdHlwZSA9IHMtPnBpY3RfdHlwZSAtIDEgKyBzLT5waWN0X3R5cGUgLyAzOwotCi0gICAgc3dpdGNoKHMtPnBpY3RfdHlwZSl7Ci0gICAgY2FzZSAgQVZfUElDVFVSRV9UWVBFX0I6Ci0gICAgICAgIG5leHQgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqKXMtPm5leHRfcGljdHVyZS5mLT5kYXRhWzBdOwotICAgICAgICBhc3NlcnQobmV4dCk7Ci0gICAgICAgIHJlbmRlci0+aW5mby52YzEuYmFja3dhcmRfcmVmZXJlbmNlID0gbmV4dC0+c3VyZmFjZTsKLSAgICAgICAgLy8gbm8gYnJlYWsgaGVyZSwgZ29pbmcgdG8gc2V0IGZvcndhcmQgcHJlZGljdGlvbgotICAgIGNhc2UgIEFWX1BJQ1RVUkVfVFlQRV9QOgotICAgICAgICBsYXN0ID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilzLT5sYXN0X3BpY3R1cmUuZi0+ZGF0YVswXTsKLSAgICAgICAgaWYgKCFsYXN0KSAvLyBGSVhNRTogRG9lcyB0aGlzIHRlc3QgbWFrZSBzZW5zZT8KLSAgICAgICAgICAgIGxhc3QgPSByZW5kZXI7IC8vIHByZWRpY3Qgc2Vjb25kIGZpZWxkIGZyb20gdGhlIGZpcnN0Ci0gICAgICAgIHJlbmRlci0+aW5mby52YzEuZm9yd2FyZF9yZWZlcmVuY2UgPSBsYXN0LT5zdXJmYWNlOwotICAgIH0KLQotICAgIGZmX3ZkcGF1X2FkZF9kYXRhX2NodW5rKHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGFbMF0sIGJ1ZiwgYnVmX3NpemUpOwotCi0gICAgcmVuZGVyLT5pbmZvLnZjMS5zbGljZV9jb3VudCAgICAgICAgICA9IDE7Ci0KLSAgICBmZl9tcGVnX2RyYXdfaG9yaXpfYmFuZChzLCAwLCBzLT5hdmN0eC0+aGVpZ2h0KTsKLSAgICByZW5kZXItPmJpdHN0cmVhbV9idWZmZXJzX3VzZWQgICAgICAgID0gMDsKLX0KLSNlbmRpZiAvKiAoQ09ORklHX1ZDMV9WRFBBVV9ERUNPREVSICovCi0KLSNpZiBDT05GSUdfTVBFRzRfVkRQQVVfREVDT0RFUgotdm9pZCBmZl92ZHBhdV9tcGVnNF9kZWNvZGVfcGljdHVyZShNcGVnNERlY0NvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmX3NpemUpCi17Ci0gICAgTXBlZ0VuY0NvbnRleHQgKnMgPSAmY3R4LT5tOwotICAgIHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKnJlbmRlciwgKmxhc3QsICpuZXh0OwotICAgIGludCBpOwotCi0gICAgaWYgKCFzLT5jdXJyZW50X3BpY3R1cmVfcHRyKSByZXR1cm47Ci0KLSAgICByZW5kZXIgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqKXMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmYtPmRhdGFbMF07Ci0gICAgYXNzZXJ0KHJlbmRlcik7Ci0KLSAgICAvKiBmaWxsIFZkcFBpY3R1cmVJbmZvTVBFRzRQYXJ0MiBzdHJ1Y3QgKi8KLSAgICByZW5kZXItPmluZm8ubXBlZzQudHJkWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cHBfdGltZTsKLSAgICByZW5kZXItPmluZm8ubXBlZzQudHJiWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cGJfdGltZTsKLSAgICByZW5kZXItPmluZm8ubXBlZzQudHJkWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gcy0+cHBfZmllbGRfdGltZSA+PiAxOwotICAgIHJlbmRlci0+aW5mby5tcGVnNC50cmJbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5wYl9maWVsZF90aW1lID4+IDE7Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWc0LnZvcF90aW1lX2luY3JlbWVudF9yZXNvbHV0aW9uICAgICA9IHMtPmF2Y3R4LT50aW1lX2Jhc2UuZGVuOwotICAgIHJlbmRlci0+aW5mby5tcGVnNC52b3BfY29kaW5nX3R5cGUgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIHJlbmRlci0+aW5mby5tcGVnNC52b3BfZmNvZGVfZm9yd2FyZCAgICAgICAgICAgICAgICAgPSBzLT5mX2NvZGU7Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWc0LnZvcF9mY29kZV9iYWNrd2FyZCAgICAgICAgICAgICAgICA9IHMtPmJfY29kZTsKLSAgICByZW5kZXItPmluZm8ubXBlZzQucmVzeW5jX21hcmtlcl9kaXNhYmxlICAgICAgICAgICAgID0gIWN0eC0+cmVzeW5jX21hcmtlcjsKLSAgICByZW5kZXItPmluZm8ubXBlZzQuaW50ZXJsYWNlZCAgICAgICAgICAgICAgICAgICAgICAgID0gIXMtPnByb2dyZXNzaXZlX3NlcXVlbmNlOwotICAgIHJlbmRlci0+aW5mby5tcGVnNC5xdWFudF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgPSBzLT5tcGVnX3F1YW50OwotICAgIHJlbmRlci0+aW5mby5tcGVnNC5xdWFydGVyX3NhbXBsZSAgICAgICAgICAgICAgICAgICAgPSBzLT5xdWFydGVyX3NhbXBsZTsKLSAgICByZW5kZXItPmluZm8ubXBlZzQuc2hvcnRfdmlkZW9faGVhZGVyICAgICAgICAgICAgICAgID0gcy0+YXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9IMjYzOwotICAgIHJlbmRlci0+aW5mby5tcGVnNC5yb3VuZGluZ19jb250cm9sICAgICAgICAgICAgICAgICAgPSBzLT5ub19yb3VuZGluZzsKLSAgICByZW5kZXItPmluZm8ubXBlZzQuYWx0ZXJuYXRlX3ZlcnRpY2FsX3NjYW5fZmxhZyAgICAgID0gcy0+YWx0ZXJuYXRlX3NjYW47Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWc0LnRvcF9maWVsZF9maXJzdCAgICAgICAgICAgICAgICAgICA9IHMtPnRvcF9maWVsZF9maXJzdDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7ICsraSkgewotICAgICAgICByZW5kZXItPmluZm8ubXBlZzQuaW50cmFfcXVhbnRpemVyX21hdHJpeFtpXSAgICAgPSBzLT5pbnRyYV9tYXRyaXhbaV07Ci0gICAgICAgIHJlbmRlci0+aW5mby5tcGVnNC5ub25faW50cmFfcXVhbnRpemVyX21hdHJpeFtpXSA9IHMtPmludGVyX21hdHJpeFtpXTsKLSAgICB9Ci0gICAgcmVuZGVyLT5pbmZvLm1wZWc0LmZvcndhcmRfcmVmZXJlbmNlICAgICAgICAgICAgICAgICA9IFZEUF9JTlZBTElEX0hBTkRMRTsKLSAgICByZW5kZXItPmluZm8ubXBlZzQuYmFja3dhcmRfcmVmZXJlbmNlICAgICAgICAgICAgICAgID0gVkRQX0lOVkFMSURfSEFORExFOwotCi0gICAgc3dpdGNoIChzLT5waWN0X3R5cGUpIHsKLSAgICBjYXNlIEFWX1BJQ1RVUkVfVFlQRV9COgotICAgICAgICBuZXh0ID0gKHN0cnVjdCB2ZHBhdV9yZW5kZXJfc3RhdGUgKilzLT5uZXh0X3BpY3R1cmUuZi0+ZGF0YVswXTsKLSAgICAgICAgYXNzZXJ0KG5leHQpOwotICAgICAgICByZW5kZXItPmluZm8ubXBlZzQuYmFja3dhcmRfcmVmZXJlbmNlICAgICA9IG5leHQtPnN1cmZhY2U7Ci0gICAgICAgIHJlbmRlci0+aW5mby5tcGVnNC52b3BfY29kaW5nX3R5cGUgICAgICAgID0gMjsKLSAgICAgICAgLy8gbm8gYnJlYWsgaGVyZSwgZ29pbmcgdG8gc2V0IGZvcndhcmQgcHJlZGljdGlvbgotICAgIGNhc2UgQVZfUElDVFVSRV9UWVBFX1A6Ci0gICAgICAgIGxhc3QgPSAoc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSAqKXMtPmxhc3RfcGljdHVyZS5mLT5kYXRhWzBdOwotICAgICAgICBhc3NlcnQobGFzdCk7Ci0gICAgICAgIHJlbmRlci0+aW5mby5tcGVnNC5mb3J3YXJkX3JlZmVyZW5jZSAgICAgID0gbGFzdC0+c3VyZmFjZTsKLSAgICB9Ci0KLSAgICBmZl92ZHBhdV9hZGRfZGF0YV9jaHVuayhzLT5jdXJyZW50X3BpY3R1cmVfcHRyLT5mLT5kYXRhWzBdLCBidWYsIGJ1Zl9zaXplKTsKLQotICAgIGZmX21wZWdfZHJhd19ob3Jpel9iYW5kKHMsIDAsIHMtPmF2Y3R4LT5oZWlnaHQpOwotICAgIHJlbmRlci0+Yml0c3RyZWFtX2J1ZmZlcnNfdXNlZCA9IDA7Ci19Ci0jZW5kaWYgLyogQ09ORklHX01QRUc0X1ZEUEFVX0RFQ09ERVIgKi8KLSNlbmRpZiAvKiBGRl9BUElfVkRQQVUgKi8KLQorI2lmIEZGX0FQSV9WRFBBVV9QUk9GSUxFCiBpbnQgYXZfdmRwYXVfZ2V0X3Byb2ZpbGUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWZHBEZWNvZGVyUHJvZmlsZSAqcHJvZmlsZSkKIHsKICNkZWZpbmUgUFJPRklMRShwcm9mKSAgICAgICAgICAgICAgICAgICAgICBcCkBAIC03NDAsMTAgKzQzNiwxMSBAQAogICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAjdW5kZWYgUFJPRklMRQogfQorI2VuZGlmIC8qIEZGX0FQSV9WRFBBVV9QUk9GSUxFICovCiAKIEFWVkRQQVVDb250ZXh0ICphdl92ZHBhdV9hbGxvY19jb250ZXh0KHZvaWQpCiB7Ci0gICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKEFWVkRQQVVDb250ZXh0KSk7CisgICAgcmV0dXJuIGF2X21hbGxvY3ooc2l6ZW9mKFZEUEFVSFdDb250ZXh0KSk7CiB9CiAKIGludCBhdl92ZHBhdV9iaW5kX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWZHBEZXZpY2UgZGV2aWNlLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92ZHBhdS5oIGIvbGliYXZjb2RlYy92ZHBhdS5oCmluZGV4IGU4NWU0ZDkuLjRkOTk5NDMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmRwYXUuaAorKysgYi9saWJhdmNvZGVjL3ZkcGF1LmgKQEAgLTUwLDIyICs1MCwxMyBAQAogICovCiAKICNpbmNsdWRlIDx2ZHBhdS92ZHBhdS5oPgotI2luY2x1ZGUgPHZkcGF1L3ZkcGF1X3gxMS5oPgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2Y29uZmlnLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAKLSNpZiBGRl9BUElfQlVGU19WRFBBVQotdW5pb24gQVZWRFBBVVBpY3R1cmVJbmZvIHsKLSAgICBWZHBQaWN0dXJlSW5mb0gyNjQgICAgICAgIGgyNjQ7Ci0gICAgVmRwUGljdHVyZUluZm9NUEVHMU9yMiAgICBtcGVnOwotICAgIFZkcFBpY3R1cmVJbmZvVkMxICAgICAgICAgIHZjMTsKLSAgICBWZHBQaWN0dXJlSW5mb01QRUc0UGFydDIgbXBlZzQ7Ci19OwotI2VuZGlmCi0KIHN0cnVjdCBBVkNvZGVjQ29udGV4dDsKIHN0cnVjdCBBVkZyYW1lOwogCkBAIC0xMDIsNDAgKzkzLDYgQEAKICAgICAgKi8KICAgICBWZHBEZWNvZGVyUmVuZGVyICpyZW5kZXI7CiAKLSNpZiBGRl9BUElfQlVGU19WRFBBVQotICAgIC8qKgotICAgICAqIFZEUEFVIHBpY3R1cmUgaW5mb3JtYXRpb24KLSAgICAgKgotICAgICAqIFNldCBieSBsaWJhdmNvZGVjLgotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgdW5pb24gQVZWRFBBVVBpY3R1cmVJbmZvIGluZm87Ci0KLSAgICAvKioKLSAgICAgKiBBbGxvY2F0ZWQgc2l6ZSBvZiB0aGUgYml0c3RyZWFtX2J1ZmZlcnMgdGFibGUuCi0gICAgICoKLSAgICAgKiBTZXQgYnkgbGliYXZjb2RlYy4KLSAgICAgKi8KLSAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotICAgIGludCBiaXRzdHJlYW1fYnVmZmVyc19hbGxvY2F0ZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBVc2VmdWwgYml0c3RyZWFtIGJ1ZmZlcnMgaW4gdGhlIGJpdHN0cmVhbSBidWZmZXJzIHRhYmxlLgotICAgICAqCi0gICAgICogU2V0IGJ5IGxpYmF2Y29kZWMuCi0gICAgICovCi0gICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICBpbnQgYml0c3RyZWFtX2J1ZmZlcnNfdXNlZDsKLQotICAgLyoqCi0gICAgICogVGFibGUgb2YgYml0c3RyZWFtIGJ1ZmZlcnMuCi0gICAgICogVGhlIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIGZyZWVpbmcgdGhpcyBidWZmZXIgdXNpbmcgYXZfZnJlZXAoKS4KLSAgICAgKgotICAgICAqIFNldCBieSBsaWJhdmNvZGVjLgotICAgICAqLwotICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCi0gICAgVmRwQml0c3RyZWFtQnVmZmVyICpiaXRzdHJlYW1fYnVmZmVyczsKLSNlbmRpZgogICAgIEFWVkRQQVVfUmVuZGVyMiByZW5kZXIyOwogfSBBVlZEUEFVQ29udGV4dDsKIApAQCAtMjE0LDQwICsxNzEsNiBAQAogaW50IGF2X3ZkcGF1X2dldF9wcm9maWxlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVmRwRGVjb2RlclByb2ZpbGUgKnByb2ZpbGUpOwogI2VuZGlmCiAKLSNpZiBGRl9BUElfQ0FQX1ZEUEFVCi0vKiogQGJyaWVmIFRoZSB2aWRlb1N1cmZhY2UgaXMgdXNlZCBmb3IgcmVuZGVyaW5nLiAqLwotI2RlZmluZSBGRl9WRFBBVV9TVEFURV9VU0VEX0ZPUl9SRU5ERVIgMQotCi0vKioKLSAqIEBicmllZiBUaGUgdmlkZW9TdXJmYWNlIGlzIG5lZWRlZCBmb3IgcmVmZXJlbmNlL3ByZWRpY3Rpb24uCi0gKiBUaGUgY29kZWMgbWFuaXB1bGF0ZXMgdGhpcy4KLSAqLwotI2RlZmluZSBGRl9WRFBBVV9TVEFURV9VU0VEX0ZPUl9SRUZFUkVOQ0UgMgotCi0vKioKLSAqIEBicmllZiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGFzIGEgY2FsbGJhY2sgYmV0d2VlbiB0aGUgRkZtcGVnCi0gKiBkZWNvZGVyICh2ZF8pIGFuZCBwcmVzZW50YXRpb24gKHZvXykgbW9kdWxlLgotICogVGhpcyBpcyB1c2VkIGZvciBkZWZpbmluZyBhIHZpZGVvIGZyYW1lIGNvbnRhaW5pbmcgc3VyZmFjZSwKLSAqIHBpY3R1cmUgcGFyYW1ldGVyLCBiaXRzdHJlYW0gaW5mb3JtYXRpb24gZXRjIHdoaWNoIGFyZSBwYXNzZWQKLSAqIGJldHdlZW4gdGhlIEZGbXBlZyBkZWNvZGVyIGFuZCBpdHMgY2xpZW50cy4KLSAqLwotc3RydWN0IHZkcGF1X3JlbmRlcl9zdGF0ZSB7Ci0gICAgVmRwVmlkZW9TdXJmYWNlIHN1cmZhY2U7IC8vLzwgVXNlZCBhcyByZW5kZXJlZCBzdXJmYWNlLCBuZXZlciBjaGFuZ2VkLgotCi0gICAgaW50IHN0YXRlOyAvLy88IEhvbGRzIEZGX1ZEUEFVX1NUQVRFXyogdmFsdWVzLgotCi0gICAgLyoqIHBpY3R1cmUgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGZvciBhbGwgc3VwcG9ydGVkIGNvZGVjcyAqLwotICAgIHVuaW9uIEFWVkRQQVVQaWN0dXJlSW5mbyBpbmZvOwotCi0gICAgLyoqIERlc2NyaWJlIHNpemUvbG9jYXRpb24gb2YgdGhlIGNvbXByZXNzZWQgdmlkZW8gZGF0YS4KLSAgICAgICAgU2V0IHRvIDAgd2hlbiBmcmVlaW5nIGJpdHN0cmVhbV9idWZmZXJzLiAqLwotICAgIGludCBiaXRzdHJlYW1fYnVmZmVyc19hbGxvY2F0ZWQ7Ci0gICAgaW50IGJpdHN0cmVhbV9idWZmZXJzX3VzZWQ7Ci0gICAgLyoqIFRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoaXMgYnVmZmVyIHVzaW5nIGF2X2ZyZWVwKCkuICovCi0gICAgVmRwQml0c3RyZWFtQnVmZmVyICpiaXRzdHJlYW1fYnVmZmVyczsKLX07Ci0jZW5kaWYKLQogLyogQH0qLwogCiAjZW5kaWYgLyogQVZDT0RFQ19WRFBBVV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZkcGF1X2NvbXBhdC5oIGIvbGliYXZjb2RlYy92ZHBhdV9jb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0YjA4Ni4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL3ZkcGF1X2NvbXBhdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIFZpZGVvIERlY29kZSBhbmQgUHJlc2VudGF0aW9uIEFQSSBmb3IgVU5JWCAoVkRQQVUpIGlzIHVzZWQgZm9yCi0gKiBIVyBkZWNvZGUgYWNjZWxlcmF0aW9uIGZvciBNUEVHLTEvMiwgSC4yNjQgYW5kIFZDLTEuCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDA4IE5WSURJQQotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZuZGVmIEFWQ09ERUNfVkRQQVVfQ09NUEFUX0gKLSNkZWZpbmUgQVZDT0RFQ19WRFBBVV9DT01QQVRfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJoMjY0LmgiCi0jaW5jbHVkZSAibXBlZzR2aWRlby5oIgotCi12b2lkIGZmX3ZkcGF1X2FkZF9kYXRhX2NodW5rKHVpbnQ4X3QgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplKTsKLQotdm9pZCBmZl92ZHBhdV9tcGVnX3BpY3R1cmVfY29tcGxldGUoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgaW50IHNsaWNlX2NvdW50KTsKLQotdm9pZCBmZl92ZHBhdV9oMjY0X3BpY3R1cmVfc3RhcnQoSDI2NENvbnRleHQgKmgpOwotdm9pZCBmZl92ZHBhdV9oMjY0X3NldF9yZWZlcmVuY2VfZnJhbWVzKEgyNjRDb250ZXh0ICpoKTsKLXZvaWQgZmZfdmRwYXVfaDI2NF9waWN0dXJlX2NvbXBsZXRlKEgyNjRDb250ZXh0ICpoKTsKLQotdm9pZCBmZl92ZHBhdV92YzFfZGVjb2RlX3BpY3R1cmUoTXBlZ0VuY0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSk7Ci0KLXZvaWQgZmZfdmRwYXVfbXBlZzRfZGVjb2RlX3BpY3R1cmUoTXBlZzREZWNDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSk7Ci0KLSNlbmRpZiAvKiBBVkNPREVDX1ZEUEFVX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZkcGF1X2gyNjQuYyBiL2xpYmF2Y29kZWMvdmRwYXVfaDI2NC5jCmluZGV4IDEwMzc2YWMuLjJhMjYwZjcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmRwYXVfaDI2NC5jCisrKyBiL2xpYmF2Y29kZWMvdmRwYXVfaDI2NC5jCkBAIC0yNSw3ICsyNSw5IEBACiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiaDI2NGRlYy5oIgorI2luY2x1ZGUgImgyNjRfcHMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCiAjaW5jbHVkZSAibXBlZ3V0aWxzLmgiCiAjaW5jbHVkZSAidmRwYXUuaCIKICNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgpAQCAtMTIwLDYgKzEyMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBzaXplKQogewogICAgIEgyNjRDb250ZXh0ICogY29uc3QgaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgUFBTICpwcHMgPSBoLT5wcy5wcHM7CisgICAgY29uc3QgU1BTICpzcHMgPSBoLT5wcy5zcHM7CiAgICAgSDI2NFBpY3R1cmUgKnBpYyA9IGgtPmN1cl9waWNfcHRyOwogICAgIHN0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQgKnBpY19jdHggPSBwaWMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwogICAgIFZkcFBpY3R1cmVJbmZvSDI2NCAqaW5mbyA9ICZwaWNfY3R4LT5pbmZvLmgyNjQ7CkBAIC0xMzIsNDAgKzEzNiw0MCBAQAogICAgIGluZm8tPmZpZWxkX29yZGVyX2NudFswXSAgICAgICAgICAgICAgICAgICAgID0gaDI2NF9mb2MocGljLT5maWVsZF9wb2NbMF0pOwogICAgIGluZm8tPmZpZWxkX29yZGVyX2NudFsxXSAgICAgICAgICAgICAgICAgICAgID0gaDI2NF9mb2MocGljLT5maWVsZF9wb2NbMV0pOwogICAgIGluZm8tPmlzX3JlZmVyZW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gaC0+bmFsX3JlZl9pZGMgIT0gMDsKLSAgICBpbmZvLT5mcmFtZV9udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPmZyYW1lX251bTsKKyAgICBpbmZvLT5mcmFtZV9udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGgtPnBvYy5mcmFtZV9udW07CiAgICAgaW5mby0+ZmllbGRfcGljX2ZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5waWN0dXJlX3N0cnVjdHVyZSAhPSBQSUNUX0ZSQU1FOwogICAgIGluZm8tPmJvdHRvbV9maWVsZF9mbGFnICAgICAgICAgICAgICAgICAgICAgID0gaC0+cGljdHVyZV9zdHJ1Y3R1cmUgPT0gUElDVF9CT1RUT01fRklFTEQ7Ci0gICAgaW5mby0+bnVtX3JlZl9mcmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMucmVmX2ZyYW1lX2NvdW50OwotICAgIGluZm8tPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgICAgICAgICAgID0gaC0+c3BzLm1iX2FmZiAmJiAhaW5mby0+ZmllbGRfcGljX2ZsYWc7Ci0gICAgaW5mby0+Y29uc3RyYWluZWRfaW50cmFfcHJlZF9mbGFnICAgICAgICAgICAgPSBoLT5wcHMuY29uc3RyYWluZWRfaW50cmFfcHJlZDsKLSAgICBpbmZvLT53ZWlnaHRlZF9wcmVkX2ZsYWcgICAgICAgICAgICAgICAgICAgICA9IGgtPnBwcy53ZWlnaHRlZF9wcmVkOwotICAgIGluZm8tPndlaWdodGVkX2JpcHJlZF9pZGMgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLndlaWdodGVkX2JpcHJlZF9pZGM7Ci0gICAgaW5mby0+ZnJhbWVfbWJzX29ubHlfZmxhZyAgICAgICAgICAgICAgICAgICAgPSBoLT5zcHMuZnJhbWVfbWJzX29ubHlfZmxhZzsKLSAgICBpbmZvLT50cmFuc2Zvcm1fOHg4X21vZGVfZmxhZyAgICAgICAgICAgICAgICA9IGgtPnBwcy50cmFuc2Zvcm1fOHg4X21vZGU7Ci0gICAgaW5mby0+Y2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICAgICAgICAgPSBoLT5wcHMuY2hyb21hX3FwX2luZGV4X29mZnNldFswXTsKLSAgICBpbmZvLT5zZWNvbmRfY2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICA9IGgtPnBwcy5jaHJvbWFfcXBfaW5kZXhfb2Zmc2V0WzFdOwotICAgIGluZm8tPnBpY19pbml0X3FwX21pbnVzMjYgICAgICAgICAgICAgICAgICAgID0gaC0+cHBzLmluaXRfcXAgLSAyNjsKLSAgICBpbmZvLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICAgICAgICAgICA9IGgtPnBwcy5yZWZfY291bnRbMF0gLSAxOwotICAgIGluZm8tPm51bV9yZWZfaWR4X2wxX2FjdGl2ZV9taW51czEgICAgICAgICAgID0gaC0+cHBzLnJlZl9jb3VudFsxXSAtIDE7Ci0gICAgaW5mby0+bG9nMl9tYXhfZnJhbWVfbnVtX21pbnVzNCAgICAgICAgICAgICAgPSBoLT5zcHMubG9nMl9tYXhfZnJhbWVfbnVtIC0gNDsKLSAgICBpbmZvLT5waWNfb3JkZXJfY250X3R5cGUgICAgICAgICAgICAgICAgICAgICA9IGgtPnNwcy5wb2NfdHlwZTsKLSAgICBpbmZvLT5sb2cyX21heF9waWNfb3JkZXJfY250X2xzYl9taW51czQgICAgICA9IGgtPnNwcy5wb2NfdHlwZSA/IDAgOiBoLT5zcHMubG9nMl9tYXhfcG9jX2xzYiAtIDQ7Ci0gICAgaW5mby0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgICAgICAgPSBoLT5zcHMuZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWc7Ci0gICAgaW5mby0+ZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZyAgICAgICAgICAgICAgPSBoLT5zcHMuZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZzsKKyAgICBpbmZvLT5udW1fcmVmX2ZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcy0+cmVmX2ZyYW1lX2NvdW50OworICAgIGluZm8tPm1iX2FkYXB0aXZlX2ZyYW1lX2ZpZWxkX2ZsYWcgICAgICAgICAgID0gc3BzLT5tYl9hZmYgJiYgIWluZm8tPmZpZWxkX3BpY19mbGFnOworICAgIGluZm8tPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZyAgICAgICAgICAgID0gcHBzLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkOworICAgIGluZm8tPndlaWdodGVkX3ByZWRfZmxhZyAgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9wcmVkOworICAgIGluZm8tPndlaWdodGVkX2JpcHJlZF9pZGMgICAgICAgICAgICAgICAgICAgID0gcHBzLT53ZWlnaHRlZF9iaXByZWRfaWRjOworICAgIGluZm8tPmZyYW1lX21ic19vbmx5X2ZsYWcgICAgICAgICAgICAgICAgICAgID0gc3BzLT5mcmFtZV9tYnNfb25seV9mbGFnOworICAgIGluZm8tPnRyYW5zZm9ybV84eDhfbW9kZV9mbGFnICAgICAgICAgICAgICAgID0gcHBzLT50cmFuc2Zvcm1fOHg4X21vZGU7CisgICAgaW5mby0+Y2hyb21hX3FwX2luZGV4X29mZnNldCAgICAgICAgICAgICAgICAgPSBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMF07CisgICAgaW5mby0+c2Vjb25kX2Nocm9tYV9xcF9pbmRleF9vZmZzZXQgICAgICAgICAgPSBwcHMtPmNocm9tYV9xcF9pbmRleF9vZmZzZXRbMV07CisgICAgaW5mby0+cGljX2luaXRfcXBfbWludXMyNiAgICAgICAgICAgICAgICAgICAgPSBwcHMtPmluaXRfcXAgLSAyNjsKKyAgICBpbmZvLT5udW1fcmVmX2lkeF9sMF9hY3RpdmVfbWludXMxICAgICAgICAgICA9IHBwcy0+cmVmX2NvdW50WzBdIC0gMTsKKyAgICBpbmZvLT5udW1fcmVmX2lkeF9sMV9hY3RpdmVfbWludXMxICAgICAgICAgICA9IHBwcy0+cmVmX2NvdW50WzFdIC0gMTsKKyAgICBpbmZvLT5sb2cyX21heF9mcmFtZV9udW1fbWludXM0ICAgICAgICAgICAgICA9IHNwcy0+bG9nMl9tYXhfZnJhbWVfbnVtIC0gNDsKKyAgICBpbmZvLT5waWNfb3JkZXJfY250X3R5cGUgICAgICAgICAgICAgICAgICAgICA9IHNwcy0+cG9jX3R5cGU7CisgICAgaW5mby0+bG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0ICAgICAgPSBzcHMtPnBvY190eXBlID8gMCA6IHNwcy0+bG9nMl9tYXhfcG9jX2xzYiAtIDQ7CisgICAgaW5mby0+ZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcgICAgICAgPSBzcHMtPmRlbHRhX3BpY19vcmRlcl9hbHdheXNfemVyb19mbGFnOworICAgIGluZm8tPmRpcmVjdF84eDhfaW5mZXJlbmNlX2ZsYWcgICAgICAgICAgICAgID0gc3BzLT5kaXJlY3RfOHg4X2luZmVyZW5jZV9mbGFnOwogI2lmZGVmIFZEUF9ERUNPREVSX1BST0ZJTEVfSDI2NF9ISUdIXzQ0NF9QUkVESUNUSVZFCi0gICAgaW5mbzItPnFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZyAgPSBoLT5zcHMudHJhbnNmb3JtX2J5cGFzczsKLSAgICBpbmZvMi0+c2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcgICAgICAgICAgICA9IGgtPnNwcy5yZXNpZHVhbF9jb2xvcl90cmFuc2Zvcm1fZmxhZzsKKyAgICBpbmZvMi0+cXBwcmltZV95X3plcm9fdHJhbnNmb3JtX2J5cGFzc19mbGFnICA9IHNwcy0+dHJhbnNmb3JtX2J5cGFzczsKKyAgICBpbmZvMi0+c2VwYXJhdGVfY29sb3VyX3BsYW5lX2ZsYWcgICAgICAgICAgICA9IHNwcy0+cmVzaWR1YWxfY29sb3JfdHJhbnNmb3JtX2ZsYWc7CiAjZW5kaWYKLSAgICBpbmZvLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgICAgICAgICAgICAgICA9IGgtPnBwcy5jYWJhYzsKLSAgICBpbmZvLT5waWNfb3JkZXJfcHJlc2VudF9mbGFnICAgICAgICAgICAgICAgICA9IGgtPnBwcy5waWNfb3JkZXJfcHJlc2VudDsKLSAgICBpbmZvLT5kZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyA9IGgtPnBwcy5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQ7Ci0gICAgaW5mby0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnICAgICAgICAgPSBoLT5wcHMucmVkdW5kYW50X3BpY19jbnRfcHJlc2VudDsKKyAgICBpbmZvLT5lbnRyb3B5X2NvZGluZ19tb2RlX2ZsYWcgICAgICAgICAgICAgICA9IHBwcy0+Y2FiYWM7CisgICAgaW5mby0+cGljX29yZGVyX3ByZXNlbnRfZmxhZyAgICAgICAgICAgICAgICAgPSBwcHMtPnBpY19vcmRlcl9wcmVzZW50OworICAgIGluZm8tPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnID0gcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9wYXJhbWV0ZXJzX3ByZXNlbnQ7CisgICAgaW5mby0+cmVkdW5kYW50X3BpY19jbnRfcHJlc2VudF9mbGFnICAgICAgICAgPSBwcHMtPnJlZHVuZGFudF9waWNfY250X3ByZXNlbnQ7CiAKLSAgICBtZW1jcHkoaW5mby0+c2NhbGluZ19saXN0c180eDQsIGgtPnBwcy5zY2FsaW5nX21hdHJpeDQsCisgICAgbWVtY3B5KGluZm8tPnNjYWxpbmdfbGlzdHNfNHg0LCBwcHMtPnNjYWxpbmdfbWF0cml4NCwKICAgICAgICAgICAgc2l6ZW9mKGluZm8tPnNjYWxpbmdfbGlzdHNfNHg0KSk7Ci0gICAgbWVtY3B5KGluZm8tPnNjYWxpbmdfbGlzdHNfOHg4WzBdLCBoLT5wcHMuc2NhbGluZ19tYXRyaXg4WzBdLAorICAgIG1lbWNweShpbmZvLT5zY2FsaW5nX2xpc3RzXzh4OFswXSwgcHBzLT5zY2FsaW5nX21hdHJpeDhbMF0sCiAgICAgICAgICAgIHNpemVvZihpbmZvLT5zY2FsaW5nX2xpc3RzXzh4OFswXSkpOwotICAgIG1lbWNweShpbmZvLT5zY2FsaW5nX2xpc3RzXzh4OFsxXSwgaC0+cHBzLnNjYWxpbmdfbWF0cml4OFszXSwKKyAgICBtZW1jcHkoaW5mby0+c2NhbGluZ19saXN0c184eDhbMV0sIHBwcy0+c2NhbGluZ19tYXRyaXg4WzNdLAogICAgICAgICAgICBzaXplb2YoaW5mby0+c2NhbGluZ19saXN0c184eDhbMV0pKTsKIAogICAgIHZkcGF1X2gyNjRfc2V0X3JlZmVyZW5jZV9mcmFtZXMoYXZjdHgpOwpAQCAtMjM3LDggKzI0MSw4IEBACiAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAgICAgY2FzZSBGRl9QUk9GSUxFX0gyNjRfSElHSF8xMDoKLSAgICAgICAgLyogWFhYOiBIaWdoIDEwIGNhbiBiZSB0cmVhdGVkIGFzIEhpZ2ggc28gbG9uZyBhcyBvbmx5IDgtYml0cyBwZXIKLSAgICAgICAgICogZm9ybWF0cyBhcmUgc3VwcG9ydGVkLiAqLworICAgICAgICAvKiBYWFg6IEhpZ2ggMTAgY2FuIGJlIHRyZWF0ZWQgYXMgSGlnaCBzbyBsb25nIGFzIG9ubHkgOCBiaXRzIHBlcgorICAgICAgICAgKiBmb3JtYXQgYXJlIHN1cHBvcnRlZC4gKi8KICAgICAgICAgcHJvZmlsZSA9IFZEUF9ERUNPREVSX1BST0ZJTEVfSDI2NF9ISUdIOwogICAgICAgICBicmVhazsKICNpZmRlZiBWRFBfREVDT0RFUl9QUk9GSUxFX0gyNjRfSElHSF80NDRfUFJFRElDVElWRQpAQCAtMjU4LDcgKzI2Miw3IEBACiAgICAgcmV0dXJuIGZmX3ZkcGF1X2NvbW1vbl9pbml0KGF2Y3R4LCBwcm9maWxlLCBsZXZlbCk7CiB9CiAKLUFWSFdBY2NlbCBmZl9oMjY0X3ZkcGF1X2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfaDI2NF92ZHBhdV9od2FjY2VsID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJoMjY0X3ZkcGF1IiwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2NCwKQEAgLTI2OSw1ICsyNzMsNyBAQAogICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0KSwKICAgICAuaW5pdCAgICAgICAgICAgPSB2ZHBhdV9oMjY0X2luaXQsCiAgICAgLnVuaW5pdCAgICAgICAgID0gZmZfdmRwYXVfY29tbW9uX3VuaW5pdCwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSBmZl92ZHBhdV9jb21tb25fZnJhbWVfcGFyYW1zLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWRFBBVUNvbnRleHQpLAorICAgIC5jYXBzX2ludGVybmFsICA9IEhXQUNDRUxfQ0FQX0FTWU5DX1NBRkUsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92ZHBhdV9oZXZjLmMgYi9saWJhdmNvZGVjL3ZkcGF1X2hldmMuYwppbmRleCAzYzFkYzVmLi40MjExMzViIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZkcGF1X2hldmMuYworKysgYi9saWJhdmNvZGVjL3ZkcGF1X2hldmMuYwpAQCAtMjQsNyArMjQsOSBAQAogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAiaGV2Yy5oIgorI2luY2x1ZGUgImhldmNfZGF0YS5oIgorI2luY2x1ZGUgImhldmNkZWMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCiAjaW5jbHVkZSAidmRwYXUuaCIKICNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgogCkBAIC01Myw4ICs1NSw4IEBACiAgICAgaW5mby0+Yml0X2RlcHRoX2x1bWFfbWludXM4ID0gc3BzLT5iaXRfZGVwdGggLSA4OwogICAgIGluZm8tPmJpdF9kZXB0aF9jaHJvbWFfbWludXM4ID0gc3BzLT5iaXRfZGVwdGggLSA4OwogICAgIGluZm8tPmxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNCA9IHNwcy0+bG9nMl9tYXhfcG9jX2xzYiAtIDQ7Ci0gICAgLyoqIFByb3ZpZGVzIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBudWhfdGVtcG9yYWxfaWQgb2YgdGhlIGZyYW1lCi0gICAgICAgIHRvIGJlIGRlY29kZWQuICovCisgICAgLyogUHJvdmlkZSB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgbnVoX3RlbXBvcmFsX2lkIG9mIHRoZSBmcmFtZQorICAgICAgIHRvIGJlIGRlY29kZWQuICovCiAgICAgaW5mby0+c3BzX21heF9kZWNfcGljX2J1ZmZlcmluZ19taW51czEgPSBzcHMtPnRlbXBvcmFsX2xheWVyW3Nwcy0+bWF4X3N1Yl9sYXllcnMgLSAxXS5tYXhfZGVjX3BpY19idWZmZXJpbmcgLSAxOwogICAgIGluZm8tPmxvZzJfbWluX2x1bWFfY29kaW5nX2Jsb2NrX3NpemVfbWludXMzID0gc3BzLT5sb2cyX21pbl9jYl9zaXplIC0gMzsKICAgICBpbmZvLT5sb2cyX2RpZmZfbWF4X21pbl9sdW1hX2NvZGluZ19ibG9ja19zaXplID0gc3BzLT5sb2cyX2RpZmZfbWF4X21pbl9jb2RpbmdfYmxvY2tfc2l6ZTsKQEAgLTYzLDM0ICs2NSwzNCBAQAogICAgIGluZm8tPm1heF90cmFuc2Zvcm1faGllcmFyY2h5X2RlcHRoX2ludGVyID0gc3BzLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRlcjsKICAgICBpbmZvLT5tYXhfdHJhbnNmb3JtX2hpZXJhcmNoeV9kZXB0aF9pbnRyYSA9IHNwcy0+bWF4X3RyYW5zZm9ybV9oaWVyYXJjaHlfZGVwdGhfaW50cmE7CiAgICAgaW5mby0+c2NhbGluZ19saXN0X2VuYWJsZWRfZmxhZyA9IHNwcy0+c2NhbGluZ19saXN0X2VuYWJsZV9mbGFnOwotICAgIC8qKiBTY2FsaW5nIGxpc3RzLCBpbiBkaWFnb25hbCBvcmRlciwgdG8gYmUgdXNlZCBmb3IgdGhpcyBmcmFtZS4gKi8KKyAgICAvKiBTY2FsaW5nIGxpc3RzLCBpbiBkaWFnb25hbCBvcmRlciwgdG8gYmUgdXNlZCBmb3IgdGhpcyBmcmFtZS4gKi8KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IDE2OyBqKyspIHsKLSAgICAgICAgICAgIC8qKiBTY2FsaW5nIExpc3QgZm9yIDR4NCBxdWFudGl6YXRpb24gbWF0cml4LAotICAgICAgICAgICAgICAgIGluZGV4ZWQgYXMgU2NhbGluZ0xpc3Q0eDRbbWF0cml4SWRdW2ldLiAqLworICAgICAgICAgICAgLyogU2NhbGluZyBMaXN0IGZvciA0eDQgcXVhbnRpemF0aW9uIG1hdHJpeCwKKyAgICAgICAgICAgICAgIGluZGV4ZWQgYXMgU2NhbGluZ0xpc3Q0eDRbbWF0cml4SWRdW2ldLiAqLwogICAgICAgICAgICAgdWludDhfdCBwb3MgPSA0ICogZmZfaGV2Y19kaWFnX3NjYW40eDRfeVtqXSArIGZmX2hldmNfZGlhZ19zY2FuNHg0X3hbal07CiAgICAgICAgICAgICBpbmZvLT5TY2FsaW5nTGlzdDR4NFtpXVtqXSA9IHNsLT5zbFswXVtpXVtwb3NdOwogICAgICAgICB9CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgNjQ7IGorKykgewogICAgICAgICAgICAgdWludDhfdCBwb3MgPSA4ICogZmZfaGV2Y19kaWFnX3NjYW44eDhfeVtqXSArIGZmX2hldmNfZGlhZ19zY2FuOHg4X3hbal07Ci0gICAgICAgICAgICAvKiogU2NhbGluZyBMaXN0IGZvciA4eDggcXVhbnRpemF0aW9uIG1hdHJpeCwKLSAgICAgICAgICAgICAgICBpbmRleGVkIGFzIFNjYWxpbmdMaXN0OHg4W21hdHJpeElkXVtpXS4gKi8KKyAgICAgICAgICAgIC8qIFNjYWxpbmcgTGlzdCBmb3IgOHg4IHF1YW50aXphdGlvbiBtYXRyaXgsCisgICAgICAgICAgICAgICBpbmRleGVkIGFzIFNjYWxpbmdMaXN0OHg4W21hdHJpeElkXVtpXS4gKi8KICAgICAgICAgICAgIGluZm8tPlNjYWxpbmdMaXN0OHg4W2ldW2pdID0gc2wtPnNsWzFdW2ldW3Bvc107Ci0gICAgICAgICAgICAvKiogU2NhbGluZyBMaXN0IGZvciAxNngxNiBxdWFudGl6YXRpb24gbWF0cml4LAotICAgICAgICAgICAgICAgIGluZGV4ZWQgYXMgU2NhbGluZ0xpc3QxNngxNlttYXRyaXhJZF1baV0uICovCisgICAgICAgICAgICAvKiBTY2FsaW5nIExpc3QgZm9yIDE2eDE2IHF1YW50aXphdGlvbiBtYXRyaXgsCisgICAgICAgICAgICAgICBpbmRleGVkIGFzIFNjYWxpbmdMaXN0MTZ4MTZbbWF0cml4SWRdW2ldLiAqLwogICAgICAgICAgICAgaW5mby0+U2NhbGluZ0xpc3QxNngxNltpXVtqXSA9IHNsLT5zbFsyXVtpXVtwb3NdOwogICAgICAgICAgICAgaWYgKGkgPCAyKSB7Ci0gICAgICAgICAgICAgICAgLyoqIFNjYWxpbmcgTGlzdCBmb3IgMzJ4MzIgcXVhbnRpemF0aW9uIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgaW5kZXhlZCBhcyBTY2FsaW5nTGlzdDMyeDMyW21hdHJpeElkXVtpXS4gKi8KKyAgICAgICAgICAgICAgICAvKiBTY2FsaW5nIExpc3QgZm9yIDMyeDMyIHF1YW50aXphdGlvbiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgaW5kZXhlZCBhcyBTY2FsaW5nTGlzdDMyeDMyW21hdHJpeElkXVtpXS4gKi8KICAgICAgICAgICAgICAgICBpbmZvLT5TY2FsaW5nTGlzdDMyeDMyW2ldW2pdID0gc2wtPnNsWzNdW2kgKiAzXVtwb3NdOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8qKiBTY2FsaW5nIExpc3QgREMgQ29lZmZpY2llbnRzIGZvciAxNngxNiwKLSAgICAgICAgICAgIGluZGV4ZWQgYXMgU2NhbGluZ0xpc3REQ0NvZWZmMTZ4MTZbbWF0cml4SWRdLiAqLworICAgICAgICAvKiBTY2FsaW5nIExpc3QgREMgQ29lZmZpY2llbnRzIGZvciAxNngxNiwKKyAgICAgICAgICAgaW5kZXhlZCBhcyBTY2FsaW5nTGlzdERDQ29lZmYxNngxNlttYXRyaXhJZF0uICovCiAgICAgICAgIGluZm8tPlNjYWxpbmdMaXN0RENDb2VmZjE2eDE2W2ldID0gc2wtPnNsX2RjWzBdW2ldOwogICAgICAgICBpZiAoaSA8IDIpIHsKLSAgICAgICAgICAgIC8qKiBTY2FsaW5nIExpc3QgREMgQ29lZmZpY2llbnRzIGZvciAzMngzMiwKLSAgICAgICAgICAgICAgICBpbmRleGVkIGFzIFNjYWxpbmdMaXN0RENDb2VmZjMyeDMyW21hdHJpeElkXS4gKi8KKyAgICAgICAgICAgIC8qIFNjYWxpbmcgTGlzdCBEQyBDb2VmZmljaWVudHMgZm9yIDMyeDMyLAorICAgICAgICAgICAgICAgaW5kZXhlZCBhcyBTY2FsaW5nTGlzdERDQ29lZmYzMngzMlttYXRyaXhJZF0uICovCiAgICAgICAgICAgICBpbmZvLT5TY2FsaW5nTGlzdERDQ29lZmYzMngzMltpXSA9IHNsLT5zbF9kY1sxXVtpICogM107CiAgICAgICAgIH0KICAgICB9CkBAIC05OCwzMiArMTAwLDI4IEBACiAgICAgaW5mby0+c2FtcGxlX2FkYXB0aXZlX29mZnNldF9lbmFibGVkX2ZsYWcgPSBzcHMtPnNhb19lbmFibGVkOwogICAgIGluZm8tPnBjbV9lbmFibGVkX2ZsYWcgPSBzcHMtPnBjbV9lbmFibGVkX2ZsYWc7CiAgICAgaWYgKGluZm8tPnBjbV9lbmFibGVkX2ZsYWcpIHsKLSAgICAgICAgLyoqIE9ubHkgbmVlZHMgdG8gYmUgc2V0IGlmIHBjbV9lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KKyAgICAgICAgLyogT25seSBuZWVkcyB0byBiZSBzZXQgaWYgcGNtX2VuYWJsZWRfZmxhZyBpcyBzZXQuIElnbm9yZWQgb3RoZXJ3aXNlLiAqLwogICAgICAgICBpbmZvLT5wY21fc2FtcGxlX2JpdF9kZXB0aF9sdW1hX21pbnVzMSA9IHNwcy0+cGNtLmJpdF9kZXB0aCAtIDE7Ci0gICAgICAgIC8qKiBPbmx5IG5lZWRzIHRvIGJlIHNldCBpZiBwY21fZW5hYmxlZF9mbGFnIGlzIHNldC4gSWdub3JlZCBvdGhlcndpc2UuICovCisgICAgICAgIC8qIE9ubHkgbmVlZHMgdG8gYmUgc2V0IGlmIHBjbV9lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KICAgICAgICAgaW5mby0+cGNtX3NhbXBsZV9iaXRfZGVwdGhfY2hyb21hX21pbnVzMSA9IHNwcy0+cGNtLmJpdF9kZXB0aF9jaHJvbWEgLSAxOwotICAgICAgICAvKiogT25seSBuZWVkcyB0byBiZSBzZXQgaWYgcGNtX2VuYWJsZWRfZmxhZyBpcyBzZXQuIElnbm9yZWQgb3RoZXJ3aXNlLiAqLworICAgICAgICAvKiBPbmx5IG5lZWRzIHRvIGJlIHNldCBpZiBwY21fZW5hYmxlZF9mbGFnIGlzIHNldC4gSWdub3JlZCBvdGhlcndpc2UuICovCiAgICAgICAgIGluZm8tPmxvZzJfbWluX3BjbV9sdW1hX2NvZGluZ19ibG9ja19zaXplX21pbnVzMyA9IHNwcy0+cGNtLmxvZzJfbWluX3BjbV9jYl9zaXplIC0gMzsKLSAgICAgICAgLyoqIE9ubHkgbmVlZHMgdG8gYmUgc2V0IGlmIHBjbV9lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KKyAgICAgICAgLyogT25seSBuZWVkcyB0byBiZSBzZXQgaWYgcGNtX2VuYWJsZWRfZmxhZyBpcyBzZXQuIElnbm9yZWQgb3RoZXJ3aXNlLiAqLwogICAgICAgICBpbmZvLT5sb2cyX2RpZmZfbWF4X21pbl9wY21fbHVtYV9jb2RpbmdfYmxvY2tfc2l6ZSA9IHNwcy0+cGNtLmxvZzJfbWF4X3BjbV9jYl9zaXplIC0gc3BzLT5wY20ubG9nMl9taW5fcGNtX2NiX3NpemU7Ci0gICAgICAgIC8qKiBPbmx5IG5lZWRzIHRvIGJlIHNldCBpZiBwY21fZW5hYmxlZF9mbGFnIGlzIHNldC4gSWdub3JlZCBvdGhlcndpc2UuICovCisgICAgICAgIC8qIE9ubHkgbmVlZHMgdG8gYmUgc2V0IGlmIHBjbV9lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KICAgICAgICAgaW5mby0+cGNtX2xvb3BfZmlsdGVyX2Rpc2FibGVkX2ZsYWcgPSBzcHMtPnBjbS5sb29wX2ZpbHRlcl9kaXNhYmxlX2ZsYWc7CiAgICAgfQotICAgIC8qKiBQZXIgc3BlYywgd2hlbiB6ZXJvLCBhc3N1bWUgc2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZwotICAgICAgICBpcyBhbHNvIHplcm8uICovCisgICAgLyogUGVyIHNwZWMsIHdoZW4gemVybywgYXNzdW1lIHNob3J0X3Rlcm1fcmVmX3BpY19zZXRfc3BzX2ZsYWcKKyAgICAgICBpcyBhbHNvIHplcm8uICovCiAgICAgaW5mby0+bnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzID0gc3BzLT5uYl9zdF9ycHM7CiAgICAgaW5mby0+bG9uZ190ZXJtX3JlZl9waWNzX3ByZXNlbnRfZmxhZyA9IHNwcy0+bG9uZ190ZXJtX3JlZl9waWNzX3ByZXNlbnRfZmxhZzsKLSAgICAvKiogT25seSBuZWVkZWQgaWYgbG9uZ190ZXJtX3JlZl9waWNzX3ByZXNlbnRfZmxhZyBpcyBzZXQuIElnbm9yZWQKLSAgICAgICAgb3RoZXJ3aXNlLiAqLworICAgIC8qIE9ubHkgbmVlZGVkIGlmIGxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcgaXMgc2V0LiBJZ25vcmVkCisgICAgICAgb3RoZXJ3aXNlLiAqLwogICAgIGluZm8tPm51bV9sb25nX3Rlcm1fcmVmX3BpY3Nfc3BzID0gc3BzLT5udW1fbG9uZ190ZXJtX3JlZl9waWNzX3NwczsKICAgICBpbmZvLT5zcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZyA9IHNwcy0+c3BzX3RlbXBvcmFsX212cF9lbmFibGVkX2ZsYWc7CiAgICAgaW5mby0+c3Ryb25nX2ludHJhX3Ntb290aGluZ19lbmFibGVkX2ZsYWcgPSBzcHMtPnNwc19zdHJvbmdfaW50cmFfc21vb3RoaW5nX2VuYWJsZV9mbGFnOwotICAgIC8qKiBAfSAqLwogCi0gICAgLyoqIFxuYW1lIEhFVkMgUGljdHVyZSBQYXJhbWV0ZXIgU2V0Ci0gICAgICoKLSAgICAgKiBDb3BpZXMgb2YgdGhlIEhFVkMgUGljdHVyZSBQYXJhbWV0ZXIgU2V0IGJpdHN0cmVhbSBmaWVsZHMuCi0gICAgICogQHsgKi8KKyAgICAvKiBDb3B5IHRoZSBIRVZDIFBpY3R1cmUgUGFyYW1ldGVyIFNldCBiaXRzdHJlYW0gZmllbGRzLiAqLwogICAgIGluZm8tPmRlcGVuZGVudF9zbGljZV9zZWdtZW50c19lbmFibGVkX2ZsYWcgPSBwcHMtPmRlcGVuZGVudF9zbGljZV9zZWdtZW50c19lbmFibGVkX2ZsYWc7CiAgICAgaW5mby0+b3V0cHV0X2ZsYWdfcHJlc2VudF9mbGFnID0gcHBzLT5vdXRwdXRfZmxhZ19wcmVzZW50X2ZsYWc7CiAgICAgaW5mby0+bnVtX2V4dHJhX3NsaWNlX2hlYWRlcl9iaXRzID0gcHBzLT5udW1fZXh0cmFfc2xpY2VfaGVhZGVyX2JpdHM7CkBAIC0xMzUsNyArMTMzLDcgQEAKICAgICBpbmZvLT5jb25zdHJhaW5lZF9pbnRyYV9wcmVkX2ZsYWcgPSBwcHMtPmNvbnN0cmFpbmVkX2ludHJhX3ByZWRfZmxhZzsKICAgICBpbmZvLT50cmFuc2Zvcm1fc2tpcF9lbmFibGVkX2ZsYWcgPSBwcHMtPnRyYW5zZm9ybV9za2lwX2VuYWJsZWRfZmxhZzsKICAgICBpbmZvLT5jdV9xcF9kZWx0YV9lbmFibGVkX2ZsYWcgPSBwcHMtPmN1X3FwX2RlbHRhX2VuYWJsZWRfZmxhZzsKLSAgICAvKiogT25seSBuZWVkZWQgaWYgY3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnIGlzIHNldC4gSWdub3JlZCBvdGhlcndpc2UuICovCisgICAgLyogT25seSBuZWVkZWQgaWYgY3VfcXBfZGVsdGFfZW5hYmxlZF9mbGFnIGlzIHNldC4gSWdub3JlZCBvdGhlcndpc2UuICovCiAgICAgaW5mby0+ZGlmZl9jdV9xcF9kZWx0YV9kZXB0aCA9IHBwcy0+ZGlmZl9jdV9xcF9kZWx0YV9kZXB0aDsKICAgICBpbmZvLT5wcHNfY2JfcXBfb2Zmc2V0ID0gcHBzLT5jYl9xcF9vZmZzZXQ7CiAgICAgaW5mby0+cHBzX2NyX3FwX29mZnNldCA9IHBwcy0+Y3JfcXBfb2Zmc2V0OwpAQCAtMTQ2LDU4ICsxNDQsNTMgQEAKICAgICBpbmZvLT50aWxlc19lbmFibGVkX2ZsYWcgPSBwcHMtPnRpbGVzX2VuYWJsZWRfZmxhZzsKICAgICBpbmZvLT5lbnRyb3B5X2NvZGluZ19zeW5jX2VuYWJsZWRfZmxhZyA9IHBwcy0+ZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWc7CiAgICAgaWYgKGluZm8tPnRpbGVzX2VuYWJsZWRfZmxhZykgewotICAgICAgICAvKiogT25seSB2YWxpZCBpZiB0aWxlc19lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KKyAgICAgICAgLyogT25seSB2YWxpZCBpZiB0aWxlc19lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KICAgICAgICAgaW5mby0+bnVtX3RpbGVfY29sdW1uc19taW51czEgPSBwcHMtPm51bV90aWxlX2NvbHVtbnMgLSAxOwotICAgICAgICAvKiogT25seSB2YWxpZCBpZiB0aWxlc19lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KKyAgICAgICAgLyogT25seSB2YWxpZCBpZiB0aWxlc19lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KICAgICAgICAgaW5mby0+bnVtX3RpbGVfcm93c19taW51czEgPSBwcHMtPm51bV90aWxlX3Jvd3MgLSAxOwotICAgICAgICAvKiogT25seSB2YWxpZCBpZiB0aWxlc19lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KKyAgICAgICAgLyogT25seSB2YWxpZCBpZiB0aWxlc19lbmFibGVkX2ZsYWcgaXMgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4gKi8KICAgICAgICAgaW5mby0+dW5pZm9ybV9zcGFjaW5nX2ZsYWcgPSBwcHMtPnVuaWZvcm1fc3BhY2luZ19mbGFnOwotICAgICAgICAvKiogT25seSBuZWVkIHRvIHNldCAwLi5udW1fdGlsZV9jb2x1bW5zX21pbnVzMS4gVGhlIHN0cnVjdAotICAgICAgICAgICAgZGVmaW5pdGlvbiByZXNlcnZlcyB1cCB0byB0aGUgbWF4aW11bSBvZiAyMC4gSW52YWxpZCB2YWx1ZXMgYXJlCi0gICAgICAgICAgICBpZ25vcmVkLiAqLworICAgICAgICAvKiBPbmx5IG5lZWQgdG8gc2V0IDAuLm51bV90aWxlX2NvbHVtbnNfbWludXMxLiBUaGUgc3RydWN0CisgICAgICAgICAgIGRlZmluaXRpb24gcmVzZXJ2ZXMgdXAgdG8gdGhlIG1heGltdW0gb2YgMjAuIEludmFsaWQgdmFsdWVzIGFyZQorICAgICAgICAgICBpZ25vcmVkLiAqLwogICAgICAgICBmb3IgKHNzaXplX3QgaSA9IDA7IGkgPCBwcHMtPm51bV90aWxlX2NvbHVtbnM7IGkrKykgewogICAgICAgICAgICAgaW5mby0+Y29sdW1uX3dpZHRoX21pbnVzMVtpXSA9IHBwcy0+Y29sdW1uX3dpZHRoW2ldIC0gMTsKICAgICAgICAgfQotICAgICAgICAvKiogT25seSBuZWVkIHRvIHNldCAwLi5udW1fdGlsZV9yb3dzX21pbnVzMS4gVGhlIHN0cnVjdAotICAgICAgICAgIGRlZmluaXRpb24gcmVzZXJ2ZXMgdXAgdG8gdGhlIG1heGltdW0gb2YgMjIuIEludmFsaWQgdmFsdWVzIGFyZQotICAgICAgICAgIGlnbm9yZWQuKi8KKyAgICAgICAgLyogT25seSBuZWVkIHRvIHNldCAwLi5udW1fdGlsZV9yb3dzX21pbnVzMS4gVGhlIHN0cnVjdAorICAgICAgICAgICBkZWZpbml0aW9uIHJlc2VydmVzIHVwIHRvIHRoZSBtYXhpbXVtIG9mIDIyLiBJbnZhbGlkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgaWdub3JlZC4qLwogICAgICAgICBmb3IgKHNzaXplX3QgaSA9IDA7IGkgPCBwcHMtPm51bV90aWxlX3Jvd3M7IGkrKykgewogICAgICAgICAgICAgaW5mby0+cm93X2hlaWdodF9taW51czFbaV0gPSBwcHMtPnJvd19oZWlnaHRbaV0gLSAxOwogICAgICAgICB9Ci0gICAgICAgIC8qKiBPbmx5IG5lZWRlZCBpZiB0aWxlc19lbmFibGVkX2ZsYWcgaXMgc2V0LiBJbnZhbGlkIHZhbHVlcyBhcmUKLSAgICAgICAgICBpZ25vcmVkLiAqLworICAgICAgICAvKiBPbmx5IG5lZWRlZCBpZiB0aWxlc19lbmFibGVkX2ZsYWcgaXMgc2V0LiBJbnZhbGlkIHZhbHVlcyBhcmUKKyAgICAgICAgICAgaWdub3JlZC4gKi8KICAgICAgICAgaW5mby0+bG9vcF9maWx0ZXJfYWNyb3NzX3RpbGVzX2VuYWJsZWRfZmxhZyA9IHBwcy0+bG9vcF9maWx0ZXJfYWNyb3NzX3RpbGVzX2VuYWJsZWRfZmxhZzsKICAgICB9CiAgICAgaW5mby0+cHBzX2xvb3BfZmlsdGVyX2Fjcm9zc19zbGljZXNfZW5hYmxlZF9mbGFnID0gcHBzLT5zZXFfbG9vcF9maWx0ZXJfYWNyb3NzX3NsaWNlc19lbmFibGVkX2ZsYWc7CiAgICAgaW5mby0+ZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgPSBwcHMtPmRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnOwotICAgIC8qKiBPbmx5IHZhbGlkIGlmIGRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnIGlzIHNldC4gSWdub3JlZAotICAgICAgICBvdGhlcndpc2UuICovCisgICAgLyogT25seSB2YWxpZCBpZiBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyBpcyBzZXQuIElnbm9yZWQKKyAgICAgICBvdGhlcndpc2UuICovCiAgICAgaW5mby0+ZGVibG9ja2luZ19maWx0ZXJfb3ZlcnJpZGVfZW5hYmxlZF9mbGFnID0gcHBzLT5kZWJsb2NraW5nX2ZpbHRlcl9vdmVycmlkZV9lbmFibGVkX2ZsYWc7Ci0gICAgLyoqIE9ubHkgdmFsaWQgaWYgZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgaXMgc2V0LiBJZ25vcmVkCi0gICAgICAgIG90aGVyd2lzZS4gKi8KKyAgICAvKiBPbmx5IHZhbGlkIGlmIGRlYmxvY2tpbmdfZmlsdGVyX2NvbnRyb2xfcHJlc2VudF9mbGFnIGlzIHNldC4gSWdub3JlZAorICAgICAgIG90aGVyd2lzZS4gKi8KICAgICBpbmZvLT5wcHNfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyA9IHBwcy0+ZGlzYWJsZV9kYmY7Ci0gICAgLyoqIE9ubHkgdmFsaWQgaWYgZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgaXMgc2V0IGFuZAotICAgICAgICBwcHNfZGVibG9ja2luZ19maWx0ZXJfZGlzYWJsZWRfZmxhZyBpcyBub3Qgc2V0LiBJZ25vcmVkIG90aGVyd2lzZS4qLworICAgIC8qIE9ubHkgdmFsaWQgaWYgZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgaXMgc2V0IGFuZAorICAgICAgIHBwc19kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnIGlzIG5vdCBzZXQuIElnbm9yZWQgb3RoZXJ3aXNlLiovCiAgICAgaW5mby0+cHBzX2JldGFfb2Zmc2V0X2RpdjIgPSBwcHMtPmJldGFfb2Zmc2V0IC8gMjsKLSAgICAvKiogT25seSB2YWxpZCBpZiBkZWJsb2NraW5nX2ZpbHRlcl9jb250cm9sX3ByZXNlbnRfZmxhZyBpcyBzZXQgYW5kCi0gICAgICAgIHBwc19kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnIGlzIG5vdCBzZXQuIElnbm9yZWQgb3RoZXJ3aXNlLiAqLworICAgIC8qIE9ubHkgdmFsaWQgaWYgZGVibG9ja2luZ19maWx0ZXJfY29udHJvbF9wcmVzZW50X2ZsYWcgaXMgc2V0IGFuZAorICAgICAgIHBwc19kZWJsb2NraW5nX2ZpbHRlcl9kaXNhYmxlZF9mbGFnIGlzIG5vdCBzZXQuIElnbm9yZWQgb3RoZXJ3aXNlLiAqLwogICAgIGluZm8tPnBwc190Y19vZmZzZXRfZGl2MiA9IHBwcy0+dGNfb2Zmc2V0IC8gMjsKICAgICBpbmZvLT5saXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnID0gcHBzLT5saXN0c19tb2RpZmljYXRpb25fcHJlc2VudF9mbGFnOwogICAgIGluZm8tPmxvZzJfcGFyYWxsZWxfbWVyZ2VfbGV2ZWxfbWludXMyID0gcHBzLT5sb2cyX3BhcmFsbGVsX21lcmdlX2xldmVsIC0gMjsKICAgICBpbmZvLT5zbGljZV9zZWdtZW50X2hlYWRlcl9leHRlbnNpb25fcHJlc2VudF9mbGFnID0gcHBzLT5zbGljZV9oZWFkZXJfZXh0ZW5zaW9uX3ByZXNlbnRfZmxhZzsKIAotICAgIC8qKiBcbmFtZSBIRVZDIFNsaWNlIFNlZ21lbnQgSGVhZGVyCi0gICAgICoKLSAgICAgKiBDb3BpZXMgb2YgdGhlIEhFVkMgU2xpY2UgU2VnbWVudCBIZWFkZXIgYml0c3RyZWFtIGZpZWxkcyBhbmQgY2FsY3VsYXRlZAotICAgICAqIHZhbHVlcyBkZXRhaWxlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbi4KLSAgICAgKiBAeyAqLwotICAgIC8qKiBTZXQgdG8gMSBpZiBuYWxfdW5pdF90eXBlIGlzIGVxdWFsIHRvIElEUl9XX1JBREwgb3IgSURSX05fTFAuCi0gICAgICAgIFNldCB0byB6ZXJvIG90aGVyd2lzZS4gKi8KKyAgICAvKiBTZXQgdG8gMSBpZiBuYWxfdW5pdF90eXBlIGlzIGVxdWFsIHRvIElEUl9XX1JBREwgb3IgSURSX05fTFAuCisgICAgICAgU2V0IHRvIHplcm8gb3RoZXJ3aXNlLiAqLwogICAgIGluZm8tPklEUlBpY0ZsYWcgPSBJU19JRFIoaCk7Ci0gICAgLyoqIFNldCB0byAxIGlmIG5hbF91bml0X3R5cGUgaW4gdGhlIHJhbmdlIG9mIEJMQV9XX0xQIHRvCi0gICAgICAgIFJTVl9JUkFQX1ZDTDIzLCBpbmNsdXNpdmUuIFNldCB0byB6ZXJvIG90aGVyd2lzZS4qLworICAgIC8qIFNldCB0byAxIGlmIG5hbF91bml0X3R5cGUgaW4gdGhlIHJhbmdlIG9mIEJMQV9XX0xQIHRvCisgICAgICAgUlNWX0lSQVBfVkNMMjMsIGluY2x1c2l2ZS4gU2V0IHRvIHplcm8gb3RoZXJ3aXNlLiovCiAgICAgaW5mby0+UkFQUGljRmxhZyA9IElTX0lSQVAoaCk7Ci0gICAgLyoqIFNlZSBzZWN0aW9uIDcuNC43LjEgb2YgdGhlIHNwZWNpZmljYXRpb24uICovCisgICAgLyogU2VlIHNlY3Rpb24gNy40LjcuMSBvZiB0aGUgc3BlY2lmaWNhdGlvbi4gKi8KICAgICBpbmZvLT5DdXJyUnBzSWR4ID0gc3BzLT5uYl9zdF9ycHM7CiAgICAgaWYgKHNoLT5zaG9ydF90ZXJtX3JlZl9waWNfc2V0X3Nwc19mbGFnID09IDEpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzcHMtPm5iX3N0X3JwczsgaSsrKSB7CkBAIC0yMDcsMzUgKzIwMCwzMyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIC8qKiBTZWUgc2VjdGlvbiA3LjQuNy4yIG9mIHRoZSBzcGVjaWZpY2F0aW9uLiAqLworICAgIC8qIFNlZSBzZWN0aW9uIDcuNC43LjIgb2YgdGhlIHNwZWNpZmljYXRpb24uICovCiAgICAgaW5mby0+TnVtUG9jVG90YWxDdXJyID0gZmZfaGV2Y19mcmFtZV9uYl9yZWZzKGgpOwogICAgIGlmIChzaC0+c2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZyA9PSAwICYmIHNoLT5zaG9ydF90ZXJtX3JwcykgewotICAgICAgICAvKiogQ29ycmVzcG9uZHMgdG8gc3BlY2lmaWNhdGlvbiBmaWVsZCwgTnVtRGVsdGFQb2NzW1JlZlJwc0lkeF0uCi0gICAgICAgICAgICBPbmx5IGFwcGxpY2FibGUgd2hlbiBzaG9ydF90ZXJtX3JlZl9waWNfc2V0X3Nwc19mbGFnID09IDAuCi0gICAgICAgICAgICBJbXBsZW1lbnRhdGlvbnMgd2lsbCBpZ25vcmUgdGhpcyB2YWx1ZSBpbiBvdGhlciBjYXNlcy4gU2VlIDcuNC44LiAqLworICAgICAgICAvKiBDb3JyZXNwb25kcyB0byBzcGVjaWZpY2F0aW9uIGZpZWxkLCBOdW1EZWx0YVBvY3NbUmVmUnBzSWR4XS4KKyAgICAgICAgICAgT25seSBhcHBsaWNhYmxlIHdoZW4gc2hvcnRfdGVybV9yZWZfcGljX3NldF9zcHNfZmxhZyA9PSAwLgorICAgICAgICAgICBJbXBsZW1lbnRhdGlvbnMgd2lsbCBpZ25vcmUgdGhpcyB2YWx1ZSBpbiBvdGhlciBjYXNlcy4gU2VlIDcuNC44LiAqLwogICAgICAgICBpbmZvLT5OdW1EZWx0YVBvY3NPZlJlZlJwc0lkeCA9IHNoLT5zaG9ydF90ZXJtX3Jwcy0+cnBzX2lkeF9udW1fZGVsdGFfcG9jczsKICAgICB9Ci0gICAgLyoqIFNlY3Rpb24gNy42LjMuMSBvZiB0aGUgSC4yNjUvSEVWQyBTcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhlIHN5bnRheCBvZgotICAgICAgICB0aGUgc2xpY2Vfc2VnbWVudF9oZWFkZXIuIFRoaXMgaGVhZGVyIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQKLSAgICAgICAgc29tZSBWRFBBVSBpbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSB0byBza2lwLiBUaGUgVkRQQVUgQVBJCi0gICAgICAgIHJlcXVpcmVzIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gdHJhY2sgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gdGhlCi0gICAgICAgIHNsaWNlIGhlYWRlciBmb3Igc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggc2hvcnQgdGVybSBhbmQgbG9uZyB0ZXJtCi0gICAgICAgIHJlZmVyZW5jZSBwaWN0dXJlcy4gRmlyc3QsIFZEUEFVIHJlcXVpcmVzIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGJ5Ci0gICAgICAgIHRoZSBzaG9ydF90ZXJtX3JlZl9waWNfc2V0IGFycmF5IGluIHRoZSBzbGljZV9zZWdtZW50X2hlYWRlci4gKi8KKyAgICAvKiBTZWN0aW9uIDcuNi4zLjEgb2YgdGhlIEguMjY1L0hFVkMgU3BlY2lmaWNhdGlvbiBkZWZpbmVzIHRoZSBzeW50YXggb2YKKyAgICAgICB0aGUgc2xpY2Vfc2VnbWVudF9oZWFkZXIuIFRoaXMgaGVhZGVyIGNvbnRhaW5zIGluZm9ybWF0aW9uIHRoYXQKKyAgICAgICBzb21lIFZEUEFVIGltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIHRvIHNraXAuIFRoZSBWRFBBVSBBUEkKKyAgICAgICByZXF1aXJlcyBjbGllbnQgYXBwbGljYXRpb25zIHRvIHRyYWNrIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGluIHRoZQorICAgICAgIHNsaWNlIGhlYWRlciBmb3Igc3RydWN0dXJlcyBhc3NvY2lhdGVkIHdpdGggc2hvcnQgdGVybSBhbmQgbG9uZyB0ZXJtCisgICAgICAgcmVmZXJlbmNlIHBpY3R1cmVzLiBGaXJzdCwgVkRQQVUgcmVxdWlyZXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgYnkKKyAgICAgICB0aGUgc2hvcnRfdGVybV9yZWZfcGljX3NldCBhcnJheSBpbiB0aGUgc2xpY2Vfc2VnbWVudF9oZWFkZXIuICovCiAgICAgaW5mby0+TnVtU2hvcnRUZXJtUGljdHVyZVNsaWNlSGVhZGVyQml0cyA9IHNoLT5zaG9ydF90ZXJtX3JlZl9waWNfc2V0X3NpemU7Ci0gICAgLyoqIFNlY29uZCwgVkRQQVUgcmVxdWlyZXMgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIGxvbmcgdGVybSByZWZlcmVuY2UKLSAgICAgICAgcGljdHVyZXMgaW4gdGhlIHNsaWNlX3NlZ21lbnRfaGVhZGVyLiBUaGlzIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIKLSAgICAgICAgb2YgYml0cyB1c2VkIGZvciB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIGJlZ2lubmluZyB3aXRoCi0gICAgICAgICJpZihsb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnKSIuICovCisgICAgLyogU2Vjb25kLCBWRFBBVSByZXF1aXJlcyB0aGUgbnVtYmVyIG9mIGJpdHMgdXNlZCBmb3IgbG9uZyB0ZXJtIHJlZmVyZW5jZQorICAgICAgIHBpY3R1cmVzIGluIHRoZSBzbGljZV9zZWdtZW50X2hlYWRlci4gVGhpcyBpcyBlcXVhbCB0byB0aGUgbnVtYmVyCisgICAgICAgb2YgYml0cyB1c2VkIGZvciB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIGJlZ2lubmluZyB3aXRoCisgICAgICAgImlmKGxvbmdfdGVybV9yZWZfcGljc19wcmVzZW50X2ZsYWcpIi4gKi8KICAgICBpbmZvLT5OdW1Mb25nVGVybVBpY3R1cmVTbGljZUhlYWRlckJpdHMgPSBzaC0+bG9uZ190ZXJtX3JlZl9waWNfc2V0X3NpemU7Ci0gICAgLyoqIEB9ICovCiAKLSAgICAvKiogU2xpY2UgRGVjb2RpbmcgUHJvY2VzcyAtIFBpY3R1cmUgT3JkZXIgQ291bnQgKi8KLSAgICAvKiogVGhlIHZhbHVlIG9mIFBpY09yZGVyQ250VmFsIG9mIHRoZSBwaWN0dXJlIGluIHRoZSBhY2Nlc3MgdW5pdAotICAgICAgICBjb250YWluaW5nIHRoZSBTRUkgbWVzc2FnZS4gVGhlIHBpY3R1cmUgYmVpbmcgZGVjb2RlZC4gKi8KKyAgICAvKiBUaGUgdmFsdWUgb2YgUGljT3JkZXJDbnRWYWwgb2YgdGhlIHBpY3R1cmUgaW4gdGhlIGFjY2VzcyB1bml0CisgICAgICAgY29udGFpbmluZyB0aGUgU0VJIG1lc3NhZ2UuIFRoZSBwaWN0dXJlIGJlaW5nIGRlY29kZWQuICovCiAgICAgaW5mby0+Q3VyclBpY09yZGVyQ250VmFsID0gaC0+cG9jOwogCi0gICAgLyoqIFNsaWNlIERlY29kaW5nIFByb2Nlc3MgLSBSZWZlcmVuY2UgUGljdHVyZSBTZXRzICovCisgICAgLyogU2xpY2UgRGVjb2RpbmcgUHJvY2VzcyAtIFJlZmVyZW5jZSBQaWN0dXJlIFNldHMgKi8KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgICAgICAgaW5mby0+UmVmUGljc1tpXSA9IFZEUF9JTlZBTElEX0hBTkRMRTsKICAgICAgICAgaW5mby0+UGljT3JkZXJDbnRWYWxbaV0gPSAwOwpAQCAtMjQ1LDIxICsyMzYsMjEgQEAKICAgICAgICAgY29uc3QgSEVWQ0ZyYW1lICpmcmFtZSA9ICZoLT5EUEJbaV07CiAgICAgICAgIGlmIChmcmFtZSAhPSBoLT5yZWYgJiYgKGZyYW1lLT5mbGFncyAmIChIRVZDX0ZSQU1FX0ZMQUdfTE9OR19SRUYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEVWQ19GUkFNRV9GTEFHX1NIT1JUX1JFRikpKSB7Ci0gICAgICAgICAgICBpZiAoaiA+IDE2KSB7CisgICAgICAgICAgICBpZiAoaiA+IDE1KSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICJWRFBBVSBvbmx5IHN1cHBvcnRzIHVwIHRvIDE2IHJlZmVyZW5jZXMgaW4gdGhlIERQQi4gIgogICAgICAgICAgICAgICAgICAgICAgIlRoaXMgZnJhbWUgbWF5IG5vdCBiZSBkZWNvZGVkIGNvcnJlY3RseS5cbiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLyoqIEFycmF5IG9mIHZpZGVvIHJlZmVyZW5jZSBzdXJmYWNlcy4KLSAgICAgICAgICAgICAgICBTZXQgYW55IHVudXNlZCBwb3NpdGlvbnMgdG8gVkRQX0lOVkFMSURfSEFORExFLiAqLworICAgICAgICAgICAgLyogQXJyYXkgb2YgdmlkZW8gcmVmZXJlbmNlIHN1cmZhY2VzLgorICAgICAgICAgICAgICAgU2V0IGFueSB1bnVzZWQgcG9zaXRpb25zIHRvIFZEUF9JTlZBTElEX0hBTkRMRS4gKi8KICAgICAgICAgICAgIGluZm8tPlJlZlBpY3Nbal0gPSBmZl92ZHBhdV9nZXRfc3VyZmFjZV9pZChmcmFtZS0+ZnJhbWUpOwotICAgICAgICAgICAgLyoqIEFycmF5IG9mIHBpY3R1cmUgb3JkZXIgY291bnRzLiBUaGVzZSBjb3JyZXNwb25kIHRvIHBvc2l0aW9ucwotICAgICAgICAgICAgICAgIGluIHRoZSBSZWZQaWNzIGFycmF5LiAqLworICAgICAgICAgICAgLyogQXJyYXkgb2YgcGljdHVyZSBvcmRlciBjb3VudHMuIFRoZXNlIGNvcnJlc3BvbmQgdG8gcG9zaXRpb25zCisgICAgICAgICAgICAgICBpbiB0aGUgUmVmUGljcyBhcnJheS4gKi8KICAgICAgICAgICAgIGluZm8tPlBpY09yZGVyQ250VmFsW2pdID0gZnJhbWUtPnBvYzsKLSAgICAgICAgICAgIC8qKiBBcnJheSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHBhcnRpY3VsYXIgUmVmUGljIGlzCi0gICAgICAgICAgICAgICAgYSBsb25nIHRlcm0gcmVmZXJlbmNlLiBBIHZhbHVlIG9mICIxIiBpbmRpY2F0ZXMgYSBsb25nLXRlcm0KLSAgICAgICAgICAgICAgICByZWZlcmVuY2UuICovCisgICAgICAgICAgICAvKiBBcnJheSB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHBhcnRpY3VsYXIgUmVmUGljIGlzCisgICAgICAgICAgICAgICBhIGxvbmcgdGVybSByZWZlcmVuY2UuIEEgdmFsdWUgb2YgIjEiIGluZGljYXRlcyBhIGxvbmctdGVybQorICAgICAgICAgICAgICAgcmVmZXJlbmNlLiAqLwogICAgICAgICAgICAgLy8gWFhYOiBTZXR0aW5nIHRoaXMgY2F1c2VkIGdsaXRjaGVzIGluIHRoZSBudmlkaWEgaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgIC8vIEFsd2F5cyBzZXR0aW5nIGl0IHRvIHplcm8sIHByb2R1Y2VzIGNvcnJlY3QgcmVzdWx0cwogICAgICAgICAgICAgLy9pbmZvLT5Jc0xvbmdUZXJtW2pdID0gZnJhbWUtPmZsYWdzICYgSEVWQ19GUkFNRV9GTEFHX0xPTkdfUkVGOwpAQCAtMjY3LDggKzI1OCw4IEBACiAgICAgICAgICAgICBqKys7CiAgICAgICAgIH0KICAgICB9Ci0gICAgLyoqIENvcHkgb2Ygc3BlY2lmaWNhdGlvbiBmaWVsZCwgc2VlIFNlY3Rpb24gOC4zLjIgb2YgdGhlCi0gICAgICAgIEguMjY1L0hFVkMgU3BlY2lmaWNhdGlvbi4gKi8KKyAgICAvKiBDb3B5IG9mIHNwZWNpZmljYXRpb24gZmllbGQsIHNlZSBTZWN0aW9uIDguMy4yIG9mIHRoZQorICAgICAgIEguMjY1L0hFVkMgU3BlY2lmaWNhdGlvbi4gKi8KICAgICBpbmZvLT5OdW1Qb2NTdEN1cnJCZWZvcmUgPSBoLT5ycHNbU1RfQ1VSUl9CRUZdLm5iX3JlZnM7CiAgICAgaWYgKGluZm8tPk51bVBvY1N0Q3VyckJlZm9yZSA+IDgpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKQEAgLTI3Niw4ICsyNjcsOCBAQAogICAgICAgICAgICAgICJUaGlzIGZyYW1lIG1heSBub3QgYmUgZGVjb2RlZCBjb3JyZWN0bHkuXG4iKTsKICAgICAgICAgaW5mby0+TnVtUG9jU3RDdXJyQmVmb3JlID0gODsKICAgICB9Ci0gICAgLyoqIENvcHkgb2Ygc3BlY2lmaWNhdGlvbiBmaWVsZCwgc2VlIFNlY3Rpb24gOC4zLjIgb2YgdGhlCi0gICAgICAgIEguMjY1L0hFVkMgU3BlY2lmaWNhdGlvbi4gKi8KKyAgICAvKiBDb3B5IG9mIHNwZWNpZmljYXRpb24gZmllbGQsIHNlZSBTZWN0aW9uIDguMy4yIG9mIHRoZQorICAgICAgIEguMjY1L0hFVkMgU3BlY2lmaWNhdGlvbi4gKi8KICAgICBpbmZvLT5OdW1Qb2NTdEN1cnJBZnRlciA9IGgtPnJwc1tTVF9DVVJSX0FGVF0ubmJfcmVmczsKICAgICBpZiAoaW5mby0+TnVtUG9jU3RDdXJyQWZ0ZXIgPiA4KSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCkBAIC0yODUsOCArMjc2LDggQEAKICAgICAgICAgICAgICAiVGhpcyBmcmFtZSBtYXkgbm90IGJlIGRlY29kZWQgY29ycmVjdGx5LlxuIik7CiAgICAgICAgIGluZm8tPk51bVBvY1N0Q3VyckFmdGVyID0gODsKICAgICB9Ci0gICAgLyoqIENvcHkgb2Ygc3BlY2lmaWNhdGlvbiBmaWVsZCwgc2VlIFNlY3Rpb24gOC4zLjIgb2YgdGhlCi0gICAgICAgIEguMjY1L0hFVkMgU3BlY2lmaWNhdGlvbi4gKi8KKyAgICAvKiBDb3B5IG9mIHNwZWNpZmljYXRpb24gZmllbGQsIHNlZSBTZWN0aW9uIDguMy4yIG9mIHRoZQorICAgICAgIEguMjY1L0hFVkMgU3BlY2lmaWNhdGlvbi4gKi8KICAgICBpbmZvLT5OdW1Qb2NMdEN1cnIgPSBoLT5ycHNbTFRfQ1VSUl0ubmJfcmVmczsKICAgICBpZiAoaW5mby0+TnVtUG9jTHRDdXJyID4gOCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLApAQCAtMjk0LDggKzI4NSw4IEBACiAgICAgICAgICAgICAgIlRoaXMgZnJhbWUgbWF5IG5vdCBiZSBkZWNvZGVkIGNvcnJlY3RseS5cbiIpOwogICAgICAgICBpbmZvLT5OdW1Qb2NMdEN1cnIgPSA4OwogICAgIH0KLSAgICAvKiogUmVmZXJlbmNlIFBpY3R1cmUgU2V0IGxpc3QsIG9uZSBvZiB0aGUgc2hvcnQtdGVybSBSUFMuIFRoZXNlCi0gICAgICAgIGNvcnJlc3BvbmQgdG8gcG9zaXRpb25zIGluIHRoZSBSZWZQaWNzIGFycmF5LiAqLworICAgIC8qIFJlZmVyZW5jZSBQaWN0dXJlIFNldCBsaXN0LCBvbmUgb2YgdGhlIHNob3J0LXRlcm0gUlBTLiBUaGVzZQorICAgICAgIGNvcnJlc3BvbmQgdG8gcG9zaXRpb25zIGluIHRoZSBSZWZQaWNzIGFycmF5LiAqLwogICAgIGZvciAoc3NpemVfdCBpID0gMCwgaiA9IDA7IGkgPCBoLT5ycHNbU1RfQ1VSUl9CRUZdLm5iX3JlZnM7IGkrKykgewogICAgICAgICBIRVZDRnJhbWUgKmZyYW1lID0gaC0+cnBzW1NUX0NVUlJfQkVGXS5yZWZbaV07CiAgICAgICAgIGlmIChmcmFtZSkgewpAQCAtMzE3LDggKzMwOCw4IEBACiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAibWlzc2luZyBTVFIgQmVmb3JlIGZyYW1lOiAlemRcbiIsIGkpOwogICAgICAgICB9CiAgICAgfQotICAgIC8qKiBSZWZlcmVuY2UgUGljdHVyZSBTZXQgbGlzdCwgb25lIG9mIHRoZSBzaG9ydC10ZXJtIFJQUy4gVGhlc2UKLSAgICAgICAgY29ycmVzcG9uZCB0byBwb3NpdGlvbnMgaW4gdGhlIFJlZlBpY3MgYXJyYXkuICovCisgICAgLyogUmVmZXJlbmNlIFBpY3R1cmUgU2V0IGxpc3QsIG9uZSBvZiB0aGUgc2hvcnQtdGVybSBSUFMuIFRoZXNlCisgICAgICAgY29ycmVzcG9uZCB0byBwb3NpdGlvbnMgaW4gdGhlIFJlZlBpY3MgYXJyYXkuICovCiAgICAgZm9yIChzc2l6ZV90IGkgPSAwLCBqID0gMDsgaSA8IGgtPnJwc1tTVF9DVVJSX0FGVF0ubmJfcmVmczsgaSsrKSB7CiAgICAgICAgIEhFVkNGcmFtZSAqZnJhbWUgPSBoLT5ycHNbU1RfQ1VSUl9BRlRdLnJlZltpXTsKICAgICAgICAgaWYgKGZyYW1lKSB7CkBAIC0zNDAsOCArMzMxLDggQEAKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJtaXNzaW5nIFNUUiBBZnRlciBmcmFtZTogJXpkXG4iLCBpKTsKICAgICAgICAgfQogICAgIH0KLSAgICAvKiogUmVmZXJlbmNlIFBpY3R1cmUgU2V0IGxpc3QsIG9uZSBvZiB0aGUgbG9uZy10ZXJtIFJQUy4gVGhlc2UKLSAgICAgICAgY29ycmVzcG9uZCB0byBwb3NpdGlvbnMgaW4gdGhlIFJlZlBpY3MgYXJyYXkuICovCisgICAgLyogUmVmZXJlbmNlIFBpY3R1cmUgU2V0IGxpc3QsIG9uZSBvZiB0aGUgbG9uZy10ZXJtIFJQUy4gVGhlc2UKKyAgICAgICBjb3JyZXNwb25kIHRvIHBvc2l0aW9ucyBpbiB0aGUgUmVmUGljcyBhcnJheS4gKi8KICAgICBmb3IgKHNzaXplX3QgaSA9IDAsIGogPSAwOyBpIDwgaC0+cnBzW0xUX0NVUlJdLm5iX3JlZnM7IGkrKykgewogICAgICAgICBIRVZDRnJhbWUgKmZyYW1lID0gaC0+cnBzW0xUX0NVUlJdLnJlZltpXTsKICAgICAgICAgaWYgKGZyYW1lKSB7CkBAIC00MjIsNyArNDEzLDcgQEAKICAgICByZXR1cm4gZmZfdmRwYXVfY29tbW9uX2luaXQoYXZjdHgsIHByb2ZpbGUsIGxldmVsKTsKIH0KIAotQVZIV0FjY2VsIGZmX2hldmNfdmRwYXVfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl9oZXZjX3ZkcGF1X2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImhldmNfdmRwYXUiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLApAQCAtNDMzLDUgKzQyNCw3IEBACiAgICAgLmZyYW1lX3ByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQpLAogICAgIC5pbml0ICAgICAgICAgICA9IHZkcGF1X2hldmNfaW5pdCwKICAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICA9IGZmX3ZkcGF1X2NvbW1vbl9mcmFtZV9wYXJhbXMsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZEUEFVQ29udGV4dCksCisgICAgLmNhcHNfaW50ZXJuYWwgID0gSFdBQ0NFTF9DQVBfQVNZTkNfU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZkcGF1X2ludGVybmFsLmggYi9saWJhdmNvZGVjL3ZkcGF1X2ludGVybmFsLmgKaW5kZXggOGE2MzczMy4uNGQ2M2U1MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92ZHBhdV9pbnRlcm5hbC5oCisrKyBiL2xpYmF2Y29kZWMvdmRwYXVfaW50ZXJuYWwuaApAQCAtMjQsMTUgKzI0LDE1IEBACiAjaWZuZGVmIEFWQ09ERUNfVkRQQVVfSU5URVJOQUxfSAogI2RlZmluZSBBVkNPREVDX1ZEUEFVX0lOVEVSTkFMX0gKIAotI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgPHN0ZGludC5oPgotI2lmIENPTkZJR19WRFBBVQogI2luY2x1ZGUgPHZkcGF1L3ZkcGF1Lmg+Ci0jZW5kaWYKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X3ZkcGF1LmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAidmRwYXUuaCIKIAogLyoqIEV4dHJhY3QgVmRwVmlkZW9TdXJmYWNlIGZyb20gYW4gQVZGcmFtZSAqLwogc3RhdGljIGlubGluZSB1aW50cHRyX3QgZmZfdmRwYXVfZ2V0X3N1cmZhY2VfaWQoQVZGcmFtZSAqcGljKQpAQCAtNDAsOCArNDAsNiBAQAogICAgIHJldHVybiAodWludHB0cl90KXBpYy0+ZGF0YVszXTsKIH0KIAotc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dDsKLSNpZiBDT05GSUdfVkRQQVUKIHVuaW9uIFZEUEFVUGljdHVyZUluZm8gewogICAgIFZkcFBpY3R1cmVJbmZvSDI2NCAgICAgICAgaDI2NDsKICAgICBWZHBQaWN0dXJlSW5mb01QRUcxT3IyICAgIG1wZWc7CkBAIC01NSw4ICs1Myw2IEBACiAjZW5kaWYKIH07CiAKLSNpbmNsdWRlICJ2ZHBhdS5oIgotCiB0eXBlZGVmIHN0cnVjdCBWRFBBVUhXQ29udGV4dCB7CiAgICAgQVZWRFBBVUNvbnRleHQgY29udGV4dDsKICAgICBWZHBEZXZpY2UgZGV2aWNlOwpAQCAtMTE0LDggKzExMCw2IEBACiAKIGludCBmZl92ZHBhdV9jb21tb25faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZkcERlY29kZXJQcm9maWxlIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKTsKLSNlbmRpZiAvL0NPTkZJR19WRFBBVQotCiBpbnQgZmZfdmRwYXVfY29tbW9uX3VuaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOwogCiBpbnQgZmZfdmRwYXVfY29tbW9uX3N0YXJ0X2ZyYW1lKHN0cnVjdCB2ZHBhdV9waWN0dXJlX2NvbnRleHQgKnBpYywKQEAgLTEyNSw1ICsxMTksNyBAQAogaW50IGZmX3ZkcGF1X21wZWdfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CiBpbnQgZmZfdmRwYXVfYWRkX2J1ZmZlcihzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0ICpwaWMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJ1Zl9zaXplKTsKK2ludCBmZl92ZHBhdV9jb21tb25fZnJhbWVfcGFyYW1zKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4KTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfVkRQQVVfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92ZHBhdV9tcGVnMTIuYyBiL2xpYmF2Y29kZWMvdmRwYXVfbXBlZzEyLmMKaW5kZXggM2FjMmNiOC4uZDI4NmU3ZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92ZHBhdV9tcGVnMTIuYworKysgYi9saWJhdmNvZGVjL3ZkcGF1X21wZWcxMi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8dmRwYXUvdmRwYXUuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCiAjaW5jbHVkZSAibXBlZ3ZpZGVvLmgiCiAjaW5jbHVkZSAidmRwYXUuaCIKICNpbmNsdWRlICJ2ZHBhdV9pbnRlcm5hbC5oIgpAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZEUF9ERUNPREVSX0xFVkVMX01QRUcxX05BKTsKIH0KIAotQVZIV0FjY2VsIGZmX21wZWcxX3ZkcGF1X2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzFfdmRwYXVfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzFfdmRwYXUiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLApAQCAtMTE0LDYgKzExNSw3IEBACiAgICAgLmluaXQgICAgICAgICAgID0gdmRwYXVfbXBlZzFfaW5pdCwKICAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWRFBBVUNvbnRleHQpLAorICAgIC5jYXBzX2ludGVybmFsICA9IEhXQUNDRUxfQ0FQX0FTWU5DX1NBRkUsCiB9OwogI2VuZGlmCiAKQEAgLTEzNiw3ICsxMzgsNyBAQAogICAgIHJldHVybiBmZl92ZHBhdV9jb21tb25faW5pdChhdmN0eCwgcHJvZmlsZSwgVkRQX0RFQ09ERVJfTEVWRUxfTVBFRzJfSEwpOwogfQogCi1BVkhXQWNjZWwgZmZfbXBlZzJfdmRwYXVfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl9tcGVnMl92ZHBhdV9od2FjY2VsID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnMl92ZHBhdSIsCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCkBAIC0xNDcsNiArMTQ5LDggQEAKICAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgID0gdmRwYXVfbXBlZzJfaW5pdCwKICAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICA9IGZmX3ZkcGF1X2NvbW1vbl9mcmFtZV9wYXJhbXMsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZEUEFVQ29udGV4dCksCisgICAgLmNhcHNfaW50ZXJuYWwgID0gSFdBQ0NFTF9DQVBfQVNZTkNfU0FGRSwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmRwYXVfbXBlZzQuYyBiL2xpYmF2Y29kZWMvdmRwYXVfbXBlZzQuYwppbmRleCA0NmEwMGNiLi45NmY4MzAyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZkcGF1X21wZWc0LmMKKysrIGIvbGliYXZjb2RlYy92ZHBhdV9tcGVnNC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8dmRwYXUvdmRwYXUuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCiAjaW5jbHVkZSAibXBlZzR2aWRlby5oIgogI2luY2x1ZGUgInZkcGF1LmgiCiAjaW5jbHVkZSAidmRwYXVfaW50ZXJuYWwuaCIKQEAgLTEwOSw3ICsxMTAsNyBAQAogICAgIHJldHVybiBmZl92ZHBhdV9jb21tb25faW5pdChhdmN0eCwgcHJvZmlsZSwgYXZjdHgtPmxldmVsKTsKIH0KIAotQVZIV0FjY2VsIGZmX21wZWc0X3ZkcGF1X2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzRfdmRwYXVfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzRfdmRwYXUiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKQEAgLTEyMCw1ICsxMjEsNyBAQAogICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0KSwKICAgICAuaW5pdCAgICAgICAgICAgPSB2ZHBhdV9tcGVnNF9pbml0LAogICAgIC51bmluaXQgICAgICAgICA9IGZmX3ZkcGF1X2NvbW1vbl91bmluaXQsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gZmZfdmRwYXVfY29tbW9uX2ZyYW1lX3BhcmFtcywKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVkRQQVVDb250ZXh0KSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBIV0FDQ0VMX0NBUF9BU1lOQ19TQUZFLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdmRwYXVfdmMxLmMgYi9saWJhdmNvZGVjL3ZkcGF1X3ZjMS5jCmluZGV4IGZmZDY1MDUuLjY3MWJhZjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmRwYXVfdmMxLmMKKysrIGIvbGliYXZjb2RlYy92ZHBhdV92YzEuYwpAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPHZkcGF1L3ZkcGF1Lmg+CiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaHdhY2NlbC5oIgogI2luY2x1ZGUgInZjMS5oIgogI2luY2x1ZGUgInZkcGF1LmgiCiAjaW5jbHVkZSAidmRwYXVfaW50ZXJuYWwuaCIKQEAgLTEzNSw3ICsxMzYsNyBAQAogfQogCiAjaWYgQ09ORklHX1dNVjNfVkRQQVVfSFdBQ0NFTAotQVZIV0FjY2VsIGZmX3dtdjNfdmRwYXVfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl93bXYzX3ZkcGF1X2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gIndtM192ZHBhdSIsCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dNVjMsCkBAIC0xNDYsMTEgKzE0NywxMyBAQAogICAgIC5mcmFtZV9wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmRwYXVfcGljdHVyZV9jb250ZXh0KSwKICAgICAuaW5pdCAgICAgICAgICAgPSB2ZHBhdV92YzFfaW5pdCwKICAgICAudW5pbml0ICAgICAgICAgPSBmZl92ZHBhdV9jb21tb25fdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICA9IGZmX3ZkcGF1X2NvbW1vbl9mcmFtZV9wYXJhbXMsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZEUEFVQ29udGV4dCksCisgICAgLmNhcHNfaW50ZXJuYWwgID0gSFdBQ0NFTF9DQVBfQVNZTkNfU0FGRSwKIH07CiAjZW5kaWYKIAotQVZIV0FjY2VsIGZmX3ZjMV92ZHBhdV9od2FjY2VsID0geworY29uc3QgQVZIV0FjY2VsIGZmX3ZjMV92ZHBhdV9od2FjY2VsID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJ2YzFfdmRwYXUiLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9WQzEsCkBAIC0xNjEsNSArMTY0LDcgQEAKICAgICAuZnJhbWVfcHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHZkcGF1X3BpY3R1cmVfY29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgID0gdmRwYXVfdmMxX2luaXQsCiAgICAgLnVuaW5pdCAgICAgICAgID0gZmZfdmRwYXVfY29tbW9uX3VuaW5pdCwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSBmZl92ZHBhdV9jb21tb25fZnJhbWVfcGFyYW1zLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWRFBBVUNvbnRleHQpLAorICAgIC5jYXBzX2ludGVybmFsICA9IEhXQUNDRUxfQ0FQX0FTWU5DX1NBRkUsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92ZXJzaW9uLmggYi9saWJhdmNvZGVjL3ZlcnNpb24uaAppbmRleCAzN2EzNWUwLi42ODk1ZjFhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZlcnNpb24uaAorKysgYi9saWJhdmNvZGVjL3ZlcnNpb24uaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKICAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTI4LDkgKzI3LDkgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC92ZXJzaW9uLmgiCiAKLSNkZWZpbmUgTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SICA1NwotI2RlZmluZSBMSUJBVkNPREVDX1ZFUlNJT05fTUlOT1IgIDI0Ci0jZGVmaW5lIExJQkFWQ09ERUNfVkVSU0lPTl9NSUNSTyAxMDIKKyNkZWZpbmUgTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SICA1OAorI2RlZmluZSBMSUJBVkNPREVDX1ZFUlNJT05fTUlOT1IgIDE4CisjZGVmaW5lIExJQkFWQ09ERUNfVkVSU0lPTl9NSUNSTyAxMDAKIAogI2RlZmluZSBMSUJBVkNPREVDX1ZFUlNJT05fSU5UICBBVl9WRVJTSU9OX0lOVChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCQVZDT0RFQ19WRVJTSU9OX01JTk9SLCBcCkBAIC01MiwxMzYgKzUxLDE4IEBACiAgKiBhdCBvbmNlIHRocm91Z2ggdGhlIGJ1bXAuIFRoaXMgaW1wcm92ZXMgdGhlIGdpdCBiaXNlY3QtYWJpbGl0eSBvZiB0aGUgY2hhbmdlLgogICovCiAKLSNpZm5kZWYgRkZfQVBJX1ZJTUFfREVDT0RFUgotI2RlZmluZSBGRl9BUElfVklNQV9ERUNPREVSICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0FVRElPX0NPTlZFUlQKLSNkZWZpbmUgRkZfQVBJX0FVRElPX0NPTlZFUlQgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfQVZDT0RFQ19SRVNBTVBMRQotI2RlZmluZSBGRl9BUElfQVZDT0RFQ19SRVNBTVBMRSAgRkZfQVBJX0FVRElPX0NPTlZFUlQKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfR0VUQ0hST01BCi0jZGVmaW5lIEZGX0FQSV9HRVRDSFJPTUEgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX01JU1NJTkdfU0FNUExFCi0jZGVmaW5lIEZGX0FQSV9NSVNTSU5HX1NBTVBMRSAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKICNpZm5kZWYgRkZfQVBJX0xPV1JFUwotI2RlZmluZSBGRl9BUElfTE9XUkVTICAgICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9DQVBfVkRQQVUKLSNkZWZpbmUgRkZfQVBJX0NBUF9WRFBBVSAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfQlVGU19WRFBBVQotI2RlZmluZSBGRl9BUElfQlVGU19WRFBBVSAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9WT1hXQVJFCi0jZGVmaW5lIEZGX0FQSV9WT1hXQVJFICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX1NFVF9ESU1FTlNJT05TCi0jZGVmaW5lIEZGX0FQSV9TRVRfRElNRU5TSU9OUyAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCisjZGVmaW5lIEZGX0FQSV9MT1dSRVMgICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTkpCiAjZW5kaWYKICNpZm5kZWYgRkZfQVBJX0RFQlVHX01WCiAjZGVmaW5lIEZGX0FQSV9ERUJVR19NViAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCiAjZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0FDX1ZMQwotI2RlZmluZSBGRl9BUElfQUNfVkxDICAgICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9PTERfTVNNUEVHNAotI2RlZmluZSBGRl9BUElfT0xEX01TTVBFRzQgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9BU1BFQ1RfRVhURU5ERUQKLSNkZWZpbmUgRkZfQVBJX0FTUEVDVF9FWFRFTkRFRCAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfQVJDSF9BTFBIQQotI2RlZmluZSBGRl9BUElfQVJDSF9BTFBIQSAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9YVk1DCi0jZGVmaW5lIEZGX0FQSV9YVk1DICAgICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0VSUk9SX1JBVEUKLSNkZWZpbmUgRkZfQVBJX0VSUk9SX1JBVEUgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfUVNDQUxFX1RZUEUKLSNkZWZpbmUgRkZfQVBJX1FTQ0FMRV9UWVBFICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfTUJfVFlQRQotI2RlZmluZSBGRl9BUElfTUJfVFlQRSAgICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9NQVhfQkZSQU1FUwotI2RlZmluZSBGRl9BUElfTUFYX0JGUkFNRVMgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9ORUdfTElORVNJWkVTCi0jZGVmaW5lIEZGX0FQSV9ORUdfTElORVNJWkVTICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0VNVV9FREdFCi0jZGVmaW5lIEZGX0FQSV9FTVVfRURHRSAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0FSQ0hfU0g0Ci0jZGVmaW5lIEZGX0FQSV9BUkNIX1NINCAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0FSQ0hfU1BBUkMKLSNkZWZpbmUgRkZfQVBJX0FSQ0hfU1BBUkMgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfVU5VU0VEX01FTUJFUlMKLSNkZWZpbmUgRkZfQVBJX1VOVVNFRF9NRU1CRVJTICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfSURDVF9YVklETU1YCi0jZGVmaW5lIEZGX0FQSV9JRENUX1hWSURNTVggICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0lOUFVUX1BSRVNFUlZFRAotI2RlZmluZSBGRl9BUElfSU5QVVRfUFJFU0VSVkVEICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9OT1JNQUxJWkVfQVFQCi0jZGVmaW5lIEZGX0FQSV9OT1JNQUxJWkVfQVFQICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0dNQwotI2RlZmluZSBGRl9BUElfR01DICAgICAgICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9NVjAKLSNkZWZpbmUgRkZfQVBJX01WMCAgICAgICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfQ09ERUNfTkFNRQotI2RlZmluZSBGRl9BUElfQ09ERUNfTkFNRSAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU4KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9BRkQKLSNkZWZpbmUgRkZfQVBJX0FGRCAgICAgICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfVklTTVYKLS8qIFhYWDogZG9uJ3QgZm9yZ2V0IHRvIGRyb3AgdGhlIC12aXNtdiBkb2N1bWVudGF0aW9uICovCi0jZGVmaW5lIEZGX0FQSV9WSVNNViAgICAgICAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0FVRElPRU5DX0RFTEFZCi0jZGVmaW5lIEZGX0FQSV9BVURJT0VOQ19ERUxBWSAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX1ZBQVBJX0NPTlRFWFQKLSNkZWZpbmUgRkZfQVBJX1ZBQVBJX0NPTlRFWFQgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgogI2lmbmRlZiBGRl9BUElfQVZDVFhfVElNRUJBU0UKICNkZWZpbmUgRkZfQVBJX0FWQ1RYX1RJTUVCQVNFICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKICNlbmRpZgotI2lmbmRlZiBGRl9BUElfTVBWX09QVAotI2RlZmluZSBGRl9BUElfTVBWX09QVCAgICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9TVFJFQU1fQ09ERUNfVEFHCi0jZGVmaW5lIEZGX0FQSV9TVFJFQU1fQ09ERUNfVEFHICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTkpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX1FVQU5UX0JJQVMKLSNkZWZpbmUgRkZfQVBJX1FVQU5UX0JJQVMgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfUkNfU1RSQVRFR1kKLSNkZWZpbmUgRkZfQVBJX1JDX1NUUkFURUdZICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKLSNlbmRpZgogI2lmbmRlZiBGRl9BUElfQ09ERURfRlJBTUUKICNkZWZpbmUgRkZfQVBJX0NPREVEX0ZSQU1FICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKICNlbmRpZgotI2lmbmRlZiBGRl9BUElfTU9USU9OX0VTVAotI2RlZmluZSBGRl9BUElfTU9USU9OX0VTVCAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9XSVRIT1VUX1BSRUZJWAotI2RlZmluZSBGRl9BUElfV0lUSE9VVF9QUkVGSVggICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQotI2VuZGlmCiAjaWZuZGVmIEZGX0FQSV9TSURFREFUQV9PTkxZX1BLVAogI2RlZmluZSBGRl9BUElfU0lERURBVEFfT05MWV9QS1QgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQogI2VuZGlmCkBAIC0yMTIsNSArOTMsNDUgQEAKICNpZm5kZWYgRkZfQVBJX1BSSVZBVEVfT1BUCiAjZGVmaW5lIEZGX0FQSV9QUklWQVRFX09QVCAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKICNlbmRpZgorI2lmbmRlZiBGRl9BUElfQVNTX1RJTUlORworI2RlZmluZSBGRl9BUElfQVNTX1RJTUlORyAgICAgICAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTkpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX09MRF9CU0YKKyNkZWZpbmUgRkZfQVBJX09MRF9CU0YgICAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9DT1BZX0NPTlRFWFQKKyNkZWZpbmUgRkZfQVBJX0NPUFlfQ09OVEVYVCAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9HRVRfQ09OVEVYVF9ERUZBVUxUUworI2RlZmluZSBGRl9BUElfR0VUX0NPTlRFWFRfREVGQVVMVFMgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9OVkVOQ19PTERfTkFNRQorI2RlZmluZSBGRl9BUElfTlZFTkNfT0xEX05BTUUgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9TVFJVQ1RfVkFBUElfQ09OVEVYVAorI2RlZmluZSBGRl9BUElfU1RSVUNUX1ZBQVBJX0NPTlRFWFQgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9NRVJHRV9TRF9BUEkKKyNkZWZpbmUgRkZfQVBJX01FUkdFX1NEX0FQSSAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfVEFHX1NUUklORworI2RlZmluZSBGRl9BUElfVEFHX1NUUklORyAgICAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9HRVRDSFJPTUEKKyNkZWZpbmUgRkZfQVBJX0dFVENIUk9NQSAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfQ09ERUNfR0VUX1NFVAorI2RlZmluZSBGRl9BUElfQ09ERUNfR0VUX1NFVCAgICAgKExJQkFWQ09ERUNfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9VU0VSX1ZJU0lCTEVfQVZIV0FDQ0VMCisjZGVmaW5lIEZGX0FQSV9VU0VSX1ZJU0lCTEVfQVZIV0FDQ0VMIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfTE9DS01HUgorI2RlZmluZSBGRl9BUElfTE9DS01HUiAoTElCQVZDT0RFQ19WRVJTSU9OX01BSk9SIDwgNTkpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX05FWFQKKyNkZWZpbmUgRkZfQVBJX05FWFQgICAgICAgICAgICAgIChMSUJBVkNPREVDX1ZFUlNJT05fTUFKT1IgPCA1OSkKKyNlbmRpZgorCiAKICNlbmRpZiAvKiBBVkNPREVDX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92aWRlb2RzcC5jIGIvbGliYXZjb2RlYy92aWRlb2RzcC5jCmluZGV4IGJhNjE4YTcuLmNlOWU5ZWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdmlkZW9kc3AuYworKysgYi9saWJhdmNvZGVjL3ZpZGVvZHNwLmMKQEAgLTUyLDQgKzUyLDYgQEAKICAgICAgICAgZmZfdmlkZW9kc3BfaW5pdF9wcGMoY3R4LCBicGMpOwogICAgIGlmIChBUkNIX1g4NikKICAgICAgICAgZmZfdmlkZW9kc3BfaW5pdF94ODYoY3R4LCBicGMpOworICAgIGlmIChBUkNIX01JUFMpCisgICAgICAgIGZmX3ZpZGVvZHNwX2luaXRfbWlwcyhjdHgsIGJwYyk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZpZGVvZHNwLmggYi9saWJhdmNvZGVjL3ZpZGVvZHNwLmgKaW5kZXggZmMwMWEzMS4uYzA1NDVmMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92aWRlb2RzcC5oCisrKyBiL2xpYmF2Y29kZWMvdmlkZW9kc3AuaApAQCAtODMsNSArODMsNiBAQAogdm9pZCBmZl92aWRlb2RzcF9pbml0X2FybShWaWRlb0RTUENvbnRleHQgKmN0eCwgaW50IGJwYyk7CiB2b2lkIGZmX3ZpZGVvZHNwX2luaXRfcHBjKFZpZGVvRFNQQ29udGV4dCAqY3R4LCBpbnQgYnBjKTsKIHZvaWQgZmZfdmlkZW9kc3BfaW5pdF94ODYoVmlkZW9EU1BDb250ZXh0ICpjdHgsIGludCBicGMpOwordm9pZCBmZl92aWRlb2RzcF9pbml0X21pcHMoVmlkZW9EU1BDb250ZXh0ICpjdHgsIGludCBicGMpOwogCiAjZW5kaWYgLyogQVZDT0RFQ19WSURFT0RTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZpZGVvdG9vbGJveC5jIGIvbGliYXZjb2RlYy92aWRlb3Rvb2xib3guYwppbmRleCAyZjRkNTMxLi5hYzQ1ZTIzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZpZGVvdG9vbGJveC5jCisrKyBiL2xpYmF2Y29kZWMvdmlkZW90b29sYm94LmMKQEAgLTIxLDI3ICsyMSw0MyBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpZiBDT05GSUdfVklERU9UT09MQk9YCi0jICBpbmNsdWRlICJ2aWRlb3Rvb2xib3guaCIKLSNlbHNlCi0jICBpbmNsdWRlICJ2ZGEuaCIKLSNlbmRpZgotI2luY2x1ZGUgInZkYV92dF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvdG9vbGJveC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfdmlkZW90b29sYm94LmgiCisjaW5jbHVkZSAidnRfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKLSNpbmNsdWRlICJoMjY0LmgiCisjaW5jbHVkZSAiZGVjb2RlLmgiCisjaW5jbHVkZSAiaDI2NGRlYy5oIgorI2luY2x1ZGUgImhldmNkZWMuaCIKICNpbmNsdWRlICJtcGVndmlkZW8uaCIKKyNpbmNsdWRlIDxUYXJnZXRDb25kaXRpb25hbHMuaD4KIAogI2lmbmRlZiBrVlRWaWRlb0RlY29kZXJTcGVjaWZpY2F0aW9uX1JlcXVpcmVIYXJkd2FyZUFjY2VsZXJhdGVkVmlkZW9EZWNvZGVyCiAjICBkZWZpbmUga1ZUVmlkZW9EZWNvZGVyU3BlY2lmaWNhdGlvbl9SZXF1aXJlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRGVjb2RlciBDRlNUUigiUmVxdWlyZUhhcmR3YXJlQWNjZWxlcmF0ZWRWaWRlb0RlY29kZXIiKQogI2VuZGlmCisjaWZuZGVmIGtWVFZpZGVvRGVjb2RlclNwZWNpZmljYXRpb25fRW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRGVjb2RlcgorIyAgZGVmaW5lIGtWVFZpZGVvRGVjb2RlclNwZWNpZmljYXRpb25fRW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRGVjb2RlciBDRlNUUigiRW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRGVjb2RlciIpCisjZW5kaWYKKworI2lmICFIQVZFX0tDTVZJREVPQ09ERUNUWVBFX0hFVkMKK2VudW0geyBrQ01WaWRlb0NvZGVjVHlwZV9IRVZDID0gJ2h2YzEnIH07CisjZW5kaWYKIAogI2RlZmluZSBWSURFT1RPT0xCT1hfRVNEU19FWFRSQURBVEFfUEFERElORyAgMTIKIAordHlwZWRlZiBzdHJ1Y3QgVlRIV0ZyYW1lIHsKKyAgICBDVlBpeGVsQnVmZmVyUmVmIHBpeGJ1ZjsKKyAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eDsKK30gVlRIV0ZyYW1lOworCiBzdGF0aWMgdm9pZCB2aWRlb3Rvb2xib3hfYnVmZmVyX3JlbGVhc2Uodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQogewotICAgIENWUGl4ZWxCdWZmZXJSZWYgY3ZfYnVmZmVyID0gKENWSW1hZ2VCdWZmZXJSZWYpZGF0YTsKLSAgICBDVlBpeGVsQnVmZmVyUmVsZWFzZShjdl9idWZmZXIpOworICAgIFZUSFdGcmFtZSAqcmVmID0gKFZUSFdGcmFtZSAqKWRhdGE7CisgICAgYXZfYnVmZmVyX3VucmVmKCZyZWYtPmh3X2ZyYW1lc19jdHgpOworICAgIENWUGl4ZWxCdWZmZXJSZWxlYXNlKHJlZi0+cGl4YnVmKTsKKworICAgIGF2X2ZyZWUoZGF0YSk7CiB9CiAKIHN0YXRpYyBpbnQgdmlkZW90b29sYm94X2J1ZmZlcl9jb3B5KFZUQ29udGV4dCAqdnRjdHgsCkBAIC02NCwxNSArODAsNTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB2aWRlb3Rvb2xib3hfcG9zdHByb2NfZnJhbWUodm9pZCAqYXZjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIFZUSFdGcmFtZSAqcmVmID0gKFZUSFdGcmFtZSAqKWZyYW1lLT5idWZbMF0tPmRhdGE7CisKKyAgICBpZiAoIXJlZi0+cGl4YnVmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gZnJhbWUgZGVjb2RlZD9cbiIpOworICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGZyYW1lLT5kYXRhWzNdID0gKHVpbnQ4X3QqKXJlZi0+cGl4YnVmOworCisgICAgaWYgKHJlZi0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgZnJhbWUtPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKHJlZi0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgIGlmICghZnJhbWUtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBpbnQgZmZfdmlkZW90b29sYm94X2FsbG9jX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCiB7CisgICAgc2l6ZV90ICAgICAgc2l6ZSA9IHNpemVvZihWVEhXRnJhbWUpOworICAgIHVpbnQ4X3QgICAgKmRhdGEgPSBOVUxMOworICAgIEFWQnVmZmVyUmVmICpidWYgPSBOVUxMOworICAgIGludCByZXQgPSBmZl9hdHRhY2hfZGVjb2RlX2RhdGEoZnJhbWUpOworICAgIEZyYW1lRGVjb2RlRGF0YSAqZmRkOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZGF0YSA9IGF2X21hbGxvY3ooc2l6ZSk7CisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGJ1ZiA9IGF2X2J1ZmZlcl9jcmVhdGUoZGF0YSwgc2l6ZSwgdmlkZW90b29sYm94X2J1ZmZlcl9yZWxlYXNlLCBOVUxMLCAwKTsKKyAgICBpZiAoIWJ1ZikgeworICAgICAgICBhdl9mcmVlcCgmZGF0YSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGZyYW1lLT5idWZbMF0gPSBidWY7CisKKyAgICBmZGQgPSAoRnJhbWVEZWNvZGVEYXRhKilmcmFtZS0+cHJpdmF0ZV9yZWYtPmRhdGE7CisgICAgZmRkLT5wb3N0X3Byb2Nlc3MgPSB2aWRlb3Rvb2xib3hfcG9zdHByb2NfZnJhbWU7CisKICAgICBmcmFtZS0+d2lkdGggID0gYXZjdHgtPndpZHRoOwogICAgIGZyYW1lLT5oZWlnaHQgPSBhdmN0eC0+aGVpZ2h0OwogICAgIGZyYW1lLT5mb3JtYXQgPSBhdmN0eC0+cGl4X2ZtdDsKLSAgICBmcmFtZS0+YnVmWzBdID0gYXZfYnVmZmVyX2FsbG9jKDEpOwotCi0gICAgaWYgKCFmcmFtZS0+YnVmWzBdKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC04MSwxMCArMTM2LDExIEBACiAKIENGRGF0YVJlZiBmZl92aWRlb3Rvb2xib3hfYXZjY19leHRyYWRhdGFfY3JlYXRlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKLSAgICBIMjY0Q29udGV4dCAqaCAgICAgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZUQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBDRkRhdGFSZWYgZGF0YSA9IE5VTEw7CiAgICAgdWludDhfdCAqcDsKLSAgICBpbnQgdnRfZXh0cmFkYXRhX3NpemUgPSA2ICsgMyArIGgtPnNwcy5kYXRhX3NpemUgKyA0ICsgaC0+cHBzLmRhdGFfc2l6ZTsKKyAgICBpbnQgdnRfZXh0cmFkYXRhX3NpemUgPSA2ICsgMiArIGgtPnBzLnNwcy0+ZGF0YV9zaXplICsgMyArIGgtPnBzLnBwcy0+ZGF0YV9zaXplOwogICAgIHVpbnQ4X3QgKnZ0X2V4dHJhZGF0YSA9IGF2X21hbGxvYyh2dF9leHRyYWRhdGFfc2l6ZSk7CiAgICAgaWYgKCF2dF9leHRyYWRhdGEpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtOTIsMjEgKzE0OCwxODIgQEAKICAgICBwID0gdnRfZXh0cmFkYXRhOwogCiAgICAgQVZfVzgocCArIDAsIDEpOyAvKiB2ZXJzaW9uICovCi0gICAgQVZfVzgocCArIDEsIGgtPnNwcy5kYXRhWzBdKTsgLyogcHJvZmlsZSAqLwotICAgIEFWX1c4KHAgKyAyLCBoLT5zcHMuZGF0YVsxXSk7IC8qIHByb2ZpbGUgY29tcGF0ICovCi0gICAgQVZfVzgocCArIDMsIGgtPnNwcy5kYXRhWzJdKTsgLyogbGV2ZWwgKi8KKyAgICBBVl9XOChwICsgMSwgaC0+cHMuc3BzLT5kYXRhWzFdKTsgLyogcHJvZmlsZSAqLworICAgIEFWX1c4KHAgKyAyLCBoLT5wcy5zcHMtPmRhdGFbMl0pOyAvKiBwcm9maWxlIGNvbXBhdCAqLworICAgIEFWX1c4KHAgKyAzLCBoLT5wcy5zcHMtPmRhdGFbM10pOyAvKiBsZXZlbCAqLwogICAgIEFWX1c4KHAgKyA0LCAweGZmKTsgLyogNiBiaXRzIHJlc2VydmVkICgxMTExMTEpICsgMiBiaXRzIG5hbCBzaXplIGxlbmd0aCAtIDMgKDExKSAqLwogICAgIEFWX1c4KHAgKyA1LCAweGUxKTsgLyogMyBiaXRzIHJlc2VydmVkICgxMTEpICsgNSBiaXRzIG51bWJlciBvZiBzcHMgKDAwMDAxKSAqLwotICAgIEFWX1dCMTYocCArIDYsIGgtPnNwcy5kYXRhX3NpemUgKyAxKTsKLSAgICBBVl9XOChwICsgOCwgTkFMX1NQUyB8ICgzIDw8IDUpKTsgLy8gTkFMIHVuaXQgaGVhZGVyCi0gICAgbWVtY3B5KHAgKyA5LCBoLT5zcHMuZGF0YSwgaC0+c3BzLmRhdGFfc2l6ZSk7Ci0gICAgcCArPSA5ICsgaC0+c3BzLmRhdGFfc2l6ZTsKKyAgICBBVl9XQjE2KHAgKyA2LCBoLT5wcy5zcHMtPmRhdGFfc2l6ZSk7CisgICAgbWVtY3B5KHAgKyA4LCBoLT5wcy5zcHMtPmRhdGEsIGgtPnBzLnNwcy0+ZGF0YV9zaXplKTsKKyAgICBwICs9IDggKyBoLT5wcy5zcHMtPmRhdGFfc2l6ZTsKICAgICBBVl9XOChwICsgMCwgMSk7IC8qIG51bWJlciBvZiBwcHMgKi8KLSAgICBBVl9XQjE2KHAgKyAxLCBoLT5wcHMuZGF0YV9zaXplICsgMSk7Ci0gICAgQVZfVzgocCArIDMsIE5BTF9QUFMgfCAoMyA8PCA1KSk7IC8vIE5BTCB1bml0IGhlYWRlcgotICAgIG1lbWNweShwICsgNCwgaC0+cHBzLmRhdGEsIGgtPnBwcy5kYXRhX3NpemUpOworICAgIEFWX1dCMTYocCArIDEsIGgtPnBzLnBwcy0+ZGF0YV9zaXplKTsKKyAgICBtZW1jcHkocCArIDMsIGgtPnBzLnBwcy0+ZGF0YSwgaC0+cHMucHBzLT5kYXRhX3NpemUpOwogCi0gICAgcCArPSA0ICsgaC0+cHBzLmRhdGFfc2l6ZTsKKyAgICBwICs9IDMgKyBoLT5wcy5wcHMtPmRhdGFfc2l6ZTsKKyAgICBhdl9hc3NlcnQwKHAgLSB2dF9leHRyYWRhdGEgPT0gdnRfZXh0cmFkYXRhX3NpemUpOworCisgICAgLy8gc2F2ZSBzcHMgaGVhZGVyIChwcm9maWxlL2xldmVsKSB1c2VkIHRvIGNyZWF0ZSBkZWNvZGVyIHNlc3Npb24sCisgICAgLy8gc28gd2UgY2FuIGRldGVjdCBjaGFuZ2VzIGFuZCByZWNyZWF0ZSBpdC4KKyAgICBpZiAodnRjdHgpCisgICAgICAgIG1lbWNweSh2dGN0eC0+c3BzLCBoLT5wcy5zcHMtPmRhdGEgKyAxLCAzKTsKKworICAgIGRhdGEgPSBDRkRhdGFDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdnRfZXh0cmFkYXRhLCB2dF9leHRyYWRhdGFfc2l6ZSk7CisgICAgYXZfZnJlZSh2dF9leHRyYWRhdGEpOworICAgIHJldHVybiBkYXRhOworfQorCitDRkRhdGFSZWYgZmZfdmlkZW90b29sYm94X2h2Y2NfZXh0cmFkYXRhX2NyZWF0ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSEVWQ0NvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGNvbnN0IEhFVkNWUFMgKnZwcyA9IChjb25zdCBIRVZDVlBTICopaC0+cHMudnBzX2xpc3RbMF0tPmRhdGE7CisgICAgY29uc3QgSEVWQ1NQUyAqc3BzID0gKGNvbnN0IEhFVkNTUFMgKiloLT5wcy5zcHNfbGlzdFswXS0+ZGF0YTsKKyAgICBpbnQgaSwgbnVtX3BwcyA9IDA7CisgICAgY29uc3QgSEVWQ1BQUyAqcHBzID0gaC0+cHMucHBzOworICAgIFBUTENvbW1vbiBwdGxjID0gdnBzLT5wdGwuZ2VuZXJhbF9wdGw7CisgICAgVlVJIHZ1aSA9IHNwcy0+dnVpOworICAgIHVpbnQ4X3QgcGFyYWxsZWxpc21UeXBlOworICAgIENGRGF0YVJlZiBkYXRhID0gTlVMTDsKKyAgICB1aW50OF90ICpwOworICAgIGludCB2dF9leHRyYWRhdGFfc2l6ZSA9IDIzICsgNSArIHZwcy0+ZGF0YV9zaXplICsgNSArIHNwcy0+ZGF0YV9zaXplICsgMzsKKyAgICB1aW50OF90ICp2dF9leHRyYWRhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgSEVWQ19NQVhfUFBTX0NPVU5UOyBpKyspIHsKKyAgICAgICAgaWYgKGgtPnBzLnBwc19saXN0W2ldKSB7CisgICAgICAgICAgICBjb25zdCBIRVZDUFBTICpwcHMgPSAoY29uc3QgSEVWQ1BQUyAqKWgtPnBzLnBwc19saXN0W2ldLT5kYXRhOworICAgICAgICAgICAgdnRfZXh0cmFkYXRhX3NpemUgKz0gMiArIHBwcy0+ZGF0YV9zaXplOworICAgICAgICAgICAgbnVtX3BwcysrOworICAgICAgICB9CisgICAgfQorCisgICAgdnRfZXh0cmFkYXRhID0gYXZfbWFsbG9jKHZ0X2V4dHJhZGF0YV9zaXplKTsKKyAgICBpZiAoIXZ0X2V4dHJhZGF0YSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcCA9IHZ0X2V4dHJhZGF0YTsKKworICAgIC8qIHVuc2lnbmVkIGludCg4KSBjb25maWd1cmF0aW9uVmVyc2lvbiA9IDE7ICovCisgICAgQVZfVzgocCArIDAsIDEpOworCisgICAgLyoKKyAgICAgKiB1bnNpZ25lZCBpbnQoMikgZ2VuZXJhbF9wcm9maWxlX3NwYWNlOworICAgICAqIHVuc2lnbmVkIGludCgxKSBnZW5lcmFsX3RpZXJfZmxhZzsKKyAgICAgKiB1bnNpZ25lZCBpbnQoNSkgZ2VuZXJhbF9wcm9maWxlX2lkYzsKKyAgICAgKi8KKyAgICBBVl9XOChwICsgMSwgcHRsYy5wcm9maWxlX3NwYWNlIDw8IDYgfAorICAgICAgICAgICAgICAgICBwdGxjLnRpZXJfZmxhZyAgICAgPDwgNSB8CisgICAgICAgICAgICAgICAgIHB0bGMucHJvZmlsZV9pZGMpOworCisgICAgLyogdW5zaWduZWQgaW50KDMyKSBnZW5lcmFsX3Byb2ZpbGVfY29tcGF0aWJpbGl0eV9mbGFnczsgKi8KKyAgICBtZW1jcHkocCArIDIsIHB0bGMucHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWcsIDQpOworCisgICAgLyogdW5zaWduZWQgaW50KDQ4KSBnZW5lcmFsX2NvbnN0cmFpbnRfaW5kaWNhdG9yX2ZsYWdzOyAqLworICAgIEFWX1c4KHAgKyA2LCBwdGxjLnByb2dyZXNzaXZlX3NvdXJjZV9mbGFnICAgIDw8IDcgfAorICAgICAgICAgICAgICAgICBwdGxjLmludGVybGFjZWRfc291cmNlX2ZsYWcgICAgIDw8IDYgfAorICAgICAgICAgICAgICAgICBwdGxjLm5vbl9wYWNrZWRfY29uc3RyYWludF9mbGFnIDw8IDUgfAorICAgICAgICAgICAgICAgICBwdGxjLmZyYW1lX29ubHlfY29uc3RyYWludF9mbGFnIDw8IDQpOworICAgIEFWX1c4KHAgKyA3LCAwKTsKKyAgICBBVl9XTjMyKHAgKyA4LCAwKTsKKworICAgIC8qIHVuc2lnbmVkIGludCg4KSBnZW5lcmFsX2xldmVsX2lkYzsgKi8KKyAgICBBVl9XOChwICsgMTIsIHB0bGMubGV2ZWxfaWRjKTsKKworICAgIC8qCisgICAgICogYml0KDQpIHJlc2VydmVkID0g4oCYMTExMeKAmWI7CisgICAgICogdW5zaWduZWQgaW50KDEyKSBtaW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjOworICAgICAqLworICAgIEFWX1c4KHAgKyAxMywgMHhmMCB8ICh2dWkubWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYyA+PiA0KSk7CisgICAgQVZfVzgocCArIDE0LCB2dWkubWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYyAmIDB4ZmYpOworCisgICAgLyoKKyAgICAgKiBiaXQoNikgcmVzZXJ2ZWQgPSDigJgxMTExMTHigJliOworICAgICAqIHVuc2lnbmVkIGludCgyKSBwYXJhbGxlbGlzbVR5cGU7CisgICAgICovCisgICAgaWYgKCF2dWkubWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYykKKyAgICAgICAgcGFyYWxsZWxpc21UeXBlID0gMDsKKyAgICBlbHNlIGlmIChwcHMtPmVudHJvcHlfY29kaW5nX3N5bmNfZW5hYmxlZF9mbGFnICYmIHBwcy0+dGlsZXNfZW5hYmxlZF9mbGFnKQorICAgICAgICBwYXJhbGxlbGlzbVR5cGUgPSAwOworICAgIGVsc2UgaWYgKHBwcy0+ZW50cm9weV9jb2Rpbmdfc3luY19lbmFibGVkX2ZsYWcpCisgICAgICAgIHBhcmFsbGVsaXNtVHlwZSA9IDM7CisgICAgZWxzZSBpZiAocHBzLT50aWxlc19lbmFibGVkX2ZsYWcpCisgICAgICAgIHBhcmFsbGVsaXNtVHlwZSA9IDI7CisgICAgZWxzZQorICAgICAgICBwYXJhbGxlbGlzbVR5cGUgPSAxOworICAgIEFWX1c4KHAgKyAxNSwgMHhmYyB8IHBhcmFsbGVsaXNtVHlwZSk7CisKKyAgICAvKgorICAgICAqIGJpdCg2KSByZXNlcnZlZCA9IOKAmDExMTExMeKAmWI7CisgICAgICogdW5zaWduZWQgaW50KDIpIGNocm9tYUZvcm1hdDsKKyAgICAgKi8KKyAgICBBVl9XOChwICsgMTYsIHNwcy0+Y2hyb21hX2Zvcm1hdF9pZGMgfCAweGZjKTsKKworICAgIC8qCisgICAgICogYml0KDUpIHJlc2VydmVkID0g4oCYMTExMTHigJliOworICAgICAqIHVuc2lnbmVkIGludCgzKSBiaXREZXB0aEx1bWFNaW51czg7CisgICAgICovCisgICAgQVZfVzgocCArIDE3LCAoc3BzLT5iaXRfZGVwdGggLSA4KSB8IDB4ZmMpOworCisgICAgLyoKKyAgICAgKiBiaXQoNSkgcmVzZXJ2ZWQgPSDigJgxMTExMeKAmWI7CisgICAgICogdW5zaWduZWQgaW50KDMpIGJpdERlcHRoQ2hyb21hTWludXM4OworICAgICAqLworICAgIEFWX1c4KHAgKyAxOCwgKHNwcy0+Yml0X2RlcHRoX2Nocm9tYSAtIDgpIHwgMHhmYyk7CisKKyAgICAvKiBiaXQoMTYpIGF2Z0ZyYW1lUmF0ZTsgKi8KKyAgICBBVl9XQjE2KHAgKyAxOSwgMCk7CisKKyAgICAvKgorICAgICAqIGJpdCgyKSBjb25zdGFudEZyYW1lUmF0ZTsKKyAgICAgKiBiaXQoMykgbnVtVGVtcG9yYWxMYXllcnM7CisgICAgICogYml0KDEpIHRlbXBvcmFsSWROZXN0ZWQ7CisgICAgICogdW5zaWduZWQgaW50KDIpIGxlbmd0aFNpemVNaW51c09uZTsKKyAgICAgKi8KKyAgICBBVl9XOChwICsgMjEsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IDYgfAorICAgICAgICAgICAgICAgICAgc3BzLT5tYXhfc3ViX2xheWVycyAgICAgICAgICAgPDwgMyB8CisgICAgICAgICAgICAgICAgICBzcHMtPnRlbXBvcmFsX2lkX25lc3RpbmdfZmxhZyA8PCAyIHwKKyAgICAgICAgICAgICAgICAgIDMpOworCisgICAgLyogdW5zaWduZWQgaW50KDgpIG51bU9mQXJyYXlzOyAqLworICAgIEFWX1c4KHAgKyAyMiwgMyk7CisKKyAgICBwICs9IDIzOworICAgIC8qIHZwcyAqLworICAgIC8qCisgICAgICogYml0KDEpIGFycmF5X2NvbXBsZXRlbmVzczsKKyAgICAgKiB1bnNpZ25lZCBpbnQoMSkgcmVzZXJ2ZWQgPSAwOworICAgICAqIHVuc2lnbmVkIGludCg2KSBOQUxfdW5pdF90eXBlOworICAgICAqLworICAgIEFWX1c4KHAsIDEgPDwgNyB8CisgICAgICAgICAgICAgSEVWQ19OQUxfVlBTICYgMHgzZik7CisgICAgLyogdW5zaWduZWQgaW50KDE2KSBudW1OYWx1czsgKi8KKyAgICBBVl9XQjE2KHAgKyAxLCAxKTsKKyAgICAvKiB1bnNpZ25lZCBpbnQoMTYpIG5hbFVuaXRMZW5ndGg7ICovCisgICAgQVZfV0IxNihwICsgMywgdnBzLT5kYXRhX3NpemUpOworICAgIC8qIGJpdCg4Km5hbFVuaXRMZW5ndGgpIG5hbFVuaXQ7ICovCisgICAgbWVtY3B5KHAgKyA1LCB2cHMtPmRhdGEsIHZwcy0+ZGF0YV9zaXplKTsKKyAgICBwICs9IDUgKyB2cHMtPmRhdGFfc2l6ZTsKKworICAgIC8qIHNwcyAqLworICAgIEFWX1c4KHAsIDEgPDwgNyB8CisgICAgICAgICAgICAgSEVWQ19OQUxfU1BTICYgMHgzZik7CisgICAgQVZfV0IxNihwICsgMSwgMSk7CisgICAgQVZfV0IxNihwICsgMywgc3BzLT5kYXRhX3NpemUpOworICAgIG1lbWNweShwICsgNSwgc3BzLT5kYXRhLCBzcHMtPmRhdGFfc2l6ZSk7CisgICAgcCArPSA1ICsgc3BzLT5kYXRhX3NpemU7CisKKyAgICAvKiBwcHMgKi8KKyAgICBBVl9XOChwLCAxIDw8IDcgfAorICAgICAgICAgICAgIEhFVkNfTkFMX1BQUyAmIDB4M2YpOworICAgIEFWX1dCMTYocCArIDEsIG51bV9wcHMpOworICAgIHAgKz0gMzsKKyAgICBmb3IgKGkgPSAwOyBpIDwgSEVWQ19NQVhfUFBTX0NPVU5UOyBpKyspIHsKKyAgICAgICAgaWYgKGgtPnBzLnBwc19saXN0W2ldKSB7CisgICAgICAgICAgICBjb25zdCBIRVZDUFBTICpwcHMgPSAoY29uc3QgSEVWQ1BQUyAqKWgtPnBzLnBwc19saXN0W2ldLT5kYXRhOworICAgICAgICAgICAgQVZfV0IxNihwLCBwcHMtPmRhdGFfc2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkocCArIDIsIHBwcy0+ZGF0YSwgcHBzLT5kYXRhX3NpemUpOworICAgICAgICAgICAgcCArPSAyICsgcHBzLT5kYXRhX3NpemU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBhdl9hc3NlcnQwKHAgLSB2dF9leHRyYWRhdGEgPT0gdnRfZXh0cmFkYXRhX3NpemUpOwogCiAgICAgZGF0YSA9IENGRGF0YUNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCB2dF9leHRyYWRhdGEsIHZ0X2V4dHJhZGF0YV9zaXplKTsKQEAgLTExNCwzMyArMzMxLDEyIEBACiAgICAgcmV0dXJuIGRhdGE7CiB9CiAKLWludCBmZl92aWRlb3Rvb2xib3hfYnVmZmVyX2NyZWF0ZShWVENvbnRleHQgKnZ0Y3R4LCBBVkZyYW1lICpmcmFtZSkKLXsKLSAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5idWZbMF0pOwotCi0gICAgZnJhbWUtPmJ1ZlswXSA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QqKXZ0Y3R4LT5mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodnRjdHgtPmZyYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb3Rvb2xib3hfYnVmZmVyX3JlbGVhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7Ci0gICAgaWYgKCFmcmFtZS0+YnVmWzBdKSB7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgZnJhbWUtPmRhdGFbM10gPSAodWludDhfdCopdnRjdHgtPmZyYW1lOwotICAgIHZ0Y3R4LT5mcmFtZSA9IE5VTEw7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQogaW50IGZmX3ZpZGVvdG9vbGJveF9oMjY0X3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkKIHsKICAgICBWVENvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKLSAgICBIMjY0Q29udGV4dCAqaCAgPSBhdmN0eC0+cHJpdl9kYXRhOwotCi0gICAgdnRjdHgtPmJpdHN0cmVhbV9zaXplID0gMDsKKyAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKICAgICBpZiAoaC0+aXNfYXZjID09IDEpIHsKICAgICAgICAgcmV0dXJuIHZpZGVvdG9vbGJveF9idWZmZXJfY29weSh2dGN0eCwgYnVmZmVyLCBzaXplKTsKQEAgLTE0OSwxNiArMzQ1LDM1IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBmZl92aWRlb3Rvb2xib3hfaDI2NF9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCitzdGF0aWMgaW50IHZpZGVvdG9vbGJveF9oMjY0X2RlY29kZV9wYXJhbXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKQogewogICAgIFZUQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOwotICAgIEgyNjRDb250ZXh0ICpoICA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgdm9pZCAqdG1wOworICAgIEgyNjRDb250ZXh0ICpoID0gYXZjdHgtPnByaXZfZGF0YTsKIAotICAgIGlmIChoLT5pc19hdmMgPT0gMSkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgLy8gc2F2ZSBzcHMgaGVhZGVyIChwcm9maWxlL2xldmVsKSB1c2VkIHRvIGNyZWF0ZSBkZWNvZGVyIHNlc3Npb24KKyAgICBpZiAoIXZ0Y3R4LT5zcHNbMF0pCisgICAgICAgIG1lbWNweSh2dGN0eC0+c3BzLCBoLT5wcy5zcHMtPmRhdGEgKyAxLCAzKTsKKworICAgIGlmICh0eXBlID09IEgyNjRfTkFMX1NQUykgeworICAgICAgICBpZiAoc2l6ZSA+IDQgJiYgbWVtY21wKHZ0Y3R4LT5zcHMsIGJ1ZmZlciArIDEsIDMpICE9IDApIHsKKyAgICAgICAgICAgIHZ0Y3R4LT5yZWNvbmZpZ19uZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgbWVtY3B5KHZ0Y3R4LT5zcHMsIGJ1ZmZlciArIDEsIDMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcGFzcy10aHJvdWdoIFNQUy9QUFMgY2hhbmdlcyB0byB0aGUgZGVjb2RlcgorICAgIHJldHVybiBmZl92aWRlb3Rvb2xib3hfaDI2NF9kZWNvZGVfc2xpY2UoYXZjdHgsIGJ1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW90b29sYm94X2NvbW1vbl9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgVlRDb250ZXh0ICp2dGN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgdm9pZCAqdG1wOwogCiAgICAgdG1wID0gYXZfZmFzdF9yZWFsbG9jKHZ0Y3R4LT5iaXRzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2dGN0eC0+YWxsb2NhdGVkX3NpemUsCkBAIC0xNzYsNiArMzkxLDE4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK2ludCBmZl92aWRlb3Rvb2xib3hfaDI2NF9kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgSDI2NENvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGgtPmlzX2F2YyA9PSAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiB2aWRlb3Rvb2xib3hfY29tbW9uX2RlY29kZV9zbGljZShhdmN0eCwgYnVmZmVyLCBzaXplKTsKK30KKwogaW50IGZmX3ZpZGVvdG9vbGJveF91bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewogICAgIFZUQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOwpAQCAtMTg5LDYgKzQxNiw4MyBAQAogfQogCiAjaWYgQ09ORklHX1ZJREVPVE9PTEJPWAorLy8gUmV0dXJuIHRoZSBBVlZpZGVvdG9vbGJveENvbnRleHQgdGhhdCBtYXR0ZXJzIGN1cnJlbnRseS4gV2hlcmUgaXQgY29tZXMgZnJvbQorLy8gZGVwZW5kcyBvbiB0aGUgQVBJIHVzZWQuCitzdGF0aWMgQVZWaWRlb3Rvb2xib3hDb250ZXh0ICp2aWRlb3Rvb2xib3hfZ2V0X2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIC8vIFNvbWV3aGF0IHRyaWNreSBiZWNhdXNlIHRoZSB1c2VyIGNhbiBjYWxsIGF2X3ZpZGVvdG9vbGJveF9kZWZhdWx0X2ZyZWUoKQorICAgIC8vIGF0IGFueSB0aW1lLCBldmVuIHdoZW4gdGhlIGNvZGVjIGlzIGNsb3NlZC4KKyAgICBpZiAoYXZjdHgtPmludGVybmFsICYmIGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGEpIHsKKyAgICAgICAgVlRDb250ZXh0ICp2dGN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgICAgIGlmICh2dGN0eC0+dnRfY3R4KQorICAgICAgICAgICAgcmV0dXJuIHZ0Y3R4LT52dF9jdHg7CisgICAgfQorICAgIHJldHVybiBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworfQorCitzdGF0aWMgaW50IHZpZGVvdG9vbGJveF9idWZmZXJfY3JlYXRlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgVlRDb250ZXh0ICp2dGN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgQ1ZQaXhlbEJ1ZmZlclJlZiBwaXhidWYgPSAoQ1ZQaXhlbEJ1ZmZlclJlZil2dGN0eC0+ZnJhbWU7CisgICAgT1NUeXBlIHBpeGVsX2Zvcm1hdCA9IENWUGl4ZWxCdWZmZXJHZXRQaXhlbEZvcm1hdFR5cGUocGl4YnVmKTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3dfZm9ybWF0ID0gYXZfbWFwX3ZpZGVvdG9vbGJveF9mb3JtYXRfdG9fcGl4Zm10KHBpeGVsX2Zvcm1hdCk7CisgICAgaW50IHdpZHRoID0gQ1ZQaXhlbEJ1ZmZlckdldFdpZHRoKHBpeGJ1Zik7CisgICAgaW50IGhlaWdodCA9IENWUGl4ZWxCdWZmZXJHZXRIZWlnaHQocGl4YnVmKTsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqY2FjaGVkX2ZyYW1lczsKKyAgICBWVEhXRnJhbWUgKnJlZjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFmcmFtZS0+YnVmWzBdIHx8IGZyYW1lLT5kYXRhWzNdKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidmlkZW90b29sYm94OiBpbnZhbGlkIHN0YXRlXG4iKTsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYoZnJhbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICByZWYgPSAoVlRIV0ZyYW1lICopZnJhbWUtPmJ1ZlswXS0+ZGF0YTsKKworICAgIGlmIChyZWYtPnBpeGJ1ZikKKyAgICAgICAgQ1ZQaXhlbEJ1ZmZlclJlbGVhc2UocmVmLT5waXhidWYpOworICAgIHJlZi0+cGl4YnVmID0gdnRjdHgtPmZyYW1lOworICAgIHZ0Y3R4LT5mcmFtZSA9IE5VTEw7CisKKyAgICAvLyBPbGQgQVBJIGNvZGUgcGF0aC4KKyAgICBpZiAoIXZ0Y3R4LT5jYWNoZWRfaHdfZnJhbWVzX2N0eCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYWNoZWRfZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0Kil2dGN0eC0+Y2FjaGVkX2h3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICBpZiAoY2FjaGVkX2ZyYW1lcy0+c3dfZm9ybWF0ICE9IHN3X2Zvcm1hdCB8fAorICAgICAgICBjYWNoZWRfZnJhbWVzLT53aWR0aCAhPSB3aWR0aCB8fAorICAgICAgICBjYWNoZWRfZnJhbWVzLT5oZWlnaHQgIT0gaGVpZ2h0KSB7CisgICAgICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4ID0gYXZfaHdmcmFtZV9jdHhfYWxsb2MoY2FjaGVkX2ZyYW1lcy0+ZGV2aWNlX3JlZik7CisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpod19mcmFtZXM7CisgICAgICAgIGlmICghaHdfZnJhbWVzX2N0eCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaHdfZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0Kilod19mcmFtZXNfY3R4LT5kYXRhOworICAgICAgICBod19mcmFtZXMtPmZvcm1hdCA9IGNhY2hlZF9mcmFtZXMtPmZvcm1hdDsKKyAgICAgICAgaHdfZnJhbWVzLT5zd19mb3JtYXQgPSBzd19mb3JtYXQ7CisgICAgICAgIGh3X2ZyYW1lcy0+d2lkdGggPSB3aWR0aDsKKyAgICAgICAgaHdfZnJhbWVzLT5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgcmV0ID0gYXZfaHdmcmFtZV9jdHhfaW5pdChod19mcmFtZXNfY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmaHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZ2dGN0eC0+Y2FjaGVkX2h3X2ZyYW1lc19jdHgpOworICAgICAgICB2dGN0eC0+Y2FjaGVkX2h3X2ZyYW1lc19jdHggPSBod19mcmFtZXNfY3R4OworICAgIH0KKworICAgIGF2X2J1ZmZlcl91bnJlZigmcmVmLT5od19mcmFtZXNfY3R4KTsKKyAgICByZWYtPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKHZ0Y3R4LT5jYWNoZWRfaHdfZnJhbWVzX2N0eCk7CisgICAgaWYgKCFyZWYtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgdmlkZW90b29sYm94X3dyaXRlX21wNF9kZXNjcl9sZW5ndGgoUHV0Qnl0ZUNvbnRleHQgKnBiLCBpbnQgbGVuZ3RoKQogewogICAgIGludCBpOwpAQCAtMzI0LDcgKzYyOCw3IEBACiB7CiAgICAgT1NTdGF0dXMgc3RhdHVzOwogICAgIENNU2FtcGxlQnVmZmVyUmVmIHNhbXBsZV9idWY7Ci0gICAgQVZWaWRlb3Rvb2xib3hDb250ZXh0ICp2aWRlb3Rvb2xib3ggPSBhdmN0eC0+aHdhY2NlbF9jb250ZXh0OworICAgIEFWVmlkZW90b29sYm94Q29udGV4dCAqdmlkZW90b29sYm94ID0gdmlkZW90b29sYm94X2dldF9jb250ZXh0KGF2Y3R4KTsKICAgICBWVENvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKIAogICAgIHNhbXBsZV9idWYgPSB2aWRlb3Rvb2xib3hfc2FtcGxlX2J1ZmZlcl9jcmVhdGUodmlkZW90b29sYm94LT5jbV9mbXRfZGVzYywKQEAgLTM0NywxMDggKzY1MSwyNSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXRpYyBpbnQgdmlkZW90b29sYm94X2NvbW1vbl9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKK3N0YXRpYyBDTVZpZGVvRm9ybWF0RGVzY3JpcHRpb25SZWYgdmlkZW90b29sYm94X2Zvcm1hdF9kZXNjX2NyZWF0ZShDTVZpZGVvQ29kZWNUeXBlIGNvZGVjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmIGRlY29kZXJfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkKIHsKLSAgICBpbnQgc3RhdHVzOwotICAgIEFWVmlkZW90b29sYm94Q29udGV4dCAqdmlkZW90b29sYm94ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKLSAgICBWVENvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBDTUZvcm1hdERlc2NyaXB0aW9uUmVmIGNtX2ZtdF9kZXNjOworICAgIE9TU3RhdHVzIHN0YXR1czsKIAotICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPmJ1ZlswXSk7CisgICAgc3RhdHVzID0gQ01WaWRlb0Zvcm1hdERlc2NyaXB0aW9uQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfc3BlYywgLy8gRGljdGlvbmFyeSBvZiBleHRlbnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtX2ZtdF9kZXNjKTsKIAotICAgIGlmICghdmlkZW90b29sYm94LT5zZXNzaW9uIHx8ICF2dGN0eC0+Yml0c3RyZWFtKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoc3RhdHVzKQorICAgICAgICByZXR1cm4gTlVMTDsKIAotICAgIHN0YXR1cyA9IHZpZGVvdG9vbGJveF9zZXNzaW9uX2RlY29kZV9mcmFtZShhdmN0eCk7Ci0KLSAgICBpZiAoc3RhdHVzKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlY29kZSBmcmFtZSAoJWQpXG4iLCBzdGF0dXMpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOwotICAgIH0KLQotICAgIGlmICghdnRjdHgtPmZyYW1lKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOwotCi0gICAgcmV0dXJuIGZmX3ZpZGVvdG9vbGJveF9idWZmZXJfY3JlYXRlKHZ0Y3R4LCBmcmFtZSk7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkZW90b29sYm94X2gyNjRfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKLXsKLSAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZGcmFtZSAqZnJhbWUgPSBoLT5jdXJfcGljX3B0ci0+ZjsKLQotICAgIHJldHVybiB2aWRlb3Rvb2xib3hfY29tbW9uX2VuZF9mcmFtZShhdmN0eCwgZnJhbWUpOwotfQotCi1zdGF0aWMgaW50IHZpZGVvdG9vbGJveF9tcGVnX3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKQotewotICAgIFZUQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOwotCi0gICAgcmV0dXJuIHZpZGVvdG9vbGJveF9idWZmZXJfY29weSh2dGN0eCwgYnVmZmVyLCBzaXplKTsKLX0KLQotc3RhdGljIGludCB2aWRlb3Rvb2xib3hfbXBlZ19kZWNvZGVfc2xpY2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkKLXsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB2aWRlb3Rvb2xib3hfbXBlZ19lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQotewotICAgIE1wZWdFbmNDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBBVkZyYW1lICpmcmFtZSA9IHMtPmN1cnJlbnRfcGljdHVyZV9wdHItPmY7Ci0KLSAgICByZXR1cm4gdmlkZW90b29sYm94X2NvbW1vbl9lbmRfZnJhbWUoYXZjdHgsIGZyYW1lKTsKLX0KLQotc3RhdGljIENGRGljdGlvbmFyeVJlZiB2aWRlb3Rvb2xib3hfZGVjb2Rlcl9jb25maWdfY3JlYXRlKENNVmlkZW9Db2RlY1R5cGUgY29kZWNfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCi17Ci0gICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBjb25maWdfaW5mbyA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7Ci0KLSAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBrVlRWaWRlb0RlY29kZXJTcGVjaWZpY2F0aW9uX1JlcXVpcmVIYXJkd2FyZUFjY2VsZXJhdGVkVmlkZW9EZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtDRkJvb2xlYW5UcnVlKTsKLQotICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUpIHsKLSAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBhdmNfaW5mbzsKLSAgICAgICAgQ0ZEYXRhUmVmIGRhdGEgPSBOVUxMOwotCi0gICAgICAgIGF2Y19pbmZvID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeUtleUNhbGxCYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKLQotICAgICAgICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKLSAgICAgICAgY2FzZSBrQ01WaWRlb0NvZGVjVHlwZV9NUEVHNFZpZGVvIDoKLSAgICAgICAgICAgIGRhdGEgPSB2aWRlb3Rvb2xib3hfZXNkc19leHRyYWRhdGFfY3JlYXRlKGF2Y3R4KTsKLSAgICAgICAgICAgIGlmIChkYXRhKQotICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGF2Y19pbmZvLCBDRlNUUigiZXNkcyIpLCBkYXRhKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIGtDTVZpZGVvQ29kZWNUeXBlX0gyNjQgOgotICAgICAgICAgICAgZGF0YSA9IGZmX3ZpZGVvdG9vbGJveF9hdmNjX2V4dHJhZGF0YV9jcmVhdGUoYXZjdHgpOwotICAgICAgICAgICAgaWYgKGRhdGEpCi0gICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoYXZjX2luZm8sIENGU1RSKCJhdmNDIiksIGRhdGEpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGNvbmZpZ19pbmZvLAotICAgICAgICAgICAgICAgIGtDTUZvcm1hdERlc2NyaXB0aW9uRXh0ZW5zaW9uX1NhbXBsZURlc2NyaXB0aW9uRXh0ZW5zaW9uQXRvbXMsCi0gICAgICAgICAgICAgICAgYXZjX2luZm8pOwotCi0gICAgICAgIGlmIChkYXRhKQotICAgICAgICAgICAgQ0ZSZWxlYXNlKGRhdGEpOwotCi0gICAgICAgIENGUmVsZWFzZShhdmNfaW5mbyk7Ci0gICAgfQotICAgIHJldHVybiBjb25maWdfaW5mbzsKKyAgICByZXR1cm4gY21fZm10X2Rlc2M7CiB9CiAKIHN0YXRpYyBDRkRpY3Rpb25hcnlSZWYgdmlkZW90b29sYm94X2J1ZmZlcl9hdHRyaWJ1dGVzX2NyZWF0ZShpbnQgd2lkdGgsCkBAIC00NzQsMTAgKzY5NSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwogCi0gICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoYnVmZmVyX2F0dHJpYnV0ZXMsIGtDVlBpeGVsQnVmZmVyUGl4ZWxGb3JtYXRUeXBlS2V5LCBjdl9waXhfZm10KTsKKyAgICBpZiAocGl4X2ZtdCkKKyAgICAgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoYnVmZmVyX2F0dHJpYnV0ZXMsIGtDVlBpeGVsQnVmZmVyUGl4ZWxGb3JtYXRUeXBlS2V5LCBjdl9waXhfZm10KTsKICAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShidWZmZXJfYXR0cmlidXRlcywga0NWUGl4ZWxCdWZmZXJJT1N1cmZhY2VQcm9wZXJ0aWVzS2V5LCBpb19zdXJmYWNlX3Byb3BlcnRpZXMpOwogICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGJ1ZmZlcl9hdHRyaWJ1dGVzLCBrQ1ZQaXhlbEJ1ZmZlcldpZHRoS2V5LCB3KTsKICAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShidWZmZXJfYXR0cmlidXRlcywga0NWUGl4ZWxCdWZmZXJIZWlnaHRLZXksIGgpOworI2lmIFRBUkdFVF9PU19JUEhPTkUKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShidWZmZXJfYXR0cmlidXRlcywga0NWUGl4ZWxCdWZmZXJPcGVuR0xFU0NvbXBhdGliaWxpdHlLZXksIGtDRkJvb2xlYW5UcnVlKTsKKyNlbHNlCisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoYnVmZmVyX2F0dHJpYnV0ZXMsIGtDVlBpeGVsQnVmZmVySU9TdXJmYWNlT3BlbkdMVGV4dHVyZUNvbXBhdGliaWxpdHlLZXksIGtDRkJvb2xlYW5UcnVlKTsKKyNlbmRpZgogCiAgICAgQ0ZSZWxlYXNlKGlvX3N1cmZhY2VfcHJvcGVydGllcyk7CiAgICAgQ0ZSZWxlYXNlKGN2X3BpeF9mbXQpOwpAQCAtNDg3LDMwICs3MTQsNjMgQEAKICAgICByZXR1cm4gYnVmZmVyX2F0dHJpYnV0ZXM7CiB9CiAKLXN0YXRpYyBDTVZpZGVvRm9ybWF0RGVzY3JpcHRpb25SZWYgdmlkZW90b29sYm94X2Zvcm1hdF9kZXNjX2NyZWF0ZShDTVZpZGVvQ29kZWNUeXBlIGNvZGVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmIGRlY29kZXJfc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkKK3N0YXRpYyBDRkRpY3Rpb25hcnlSZWYgdmlkZW90b29sYm94X2RlY29kZXJfY29uZmlnX2NyZWF0ZShDTVZpZGVvQ29kZWNUeXBlIGNvZGVjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIENNRm9ybWF0RGVzY3JpcHRpb25SZWYgY21fZm10X2Rlc2M7Ci0gICAgT1NTdGF0dXMgc3RhdHVzOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgY29uZmlnX2luZm8gPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlLZXlDYWxsQmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwogCi0gICAgc3RhdHVzID0gQ01WaWRlb0Zvcm1hdERlc2NyaXB0aW9uQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfc3BlYywgLy8gRGljdGlvbmFyeSBvZiBleHRlbnNpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNtX2ZtdF9kZXNjKTsKKyAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShjb25maWdfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY190eXBlID09IGtDTVZpZGVvQ29kZWNUeXBlX0hFVkMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVFZpZGVvRGVjb2RlclNwZWNpZmljYXRpb25fRW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRGVjb2RlciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZUVmlkZW9EZWNvZGVyU3BlY2lmaWNhdGlvbl9SZXF1aXJlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZCb29sZWFuVHJ1ZSk7CiAKLSAgICBpZiAoc3RhdHVzKQotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGF2Y19pbmZvOworICAgIENGRGF0YVJlZiBkYXRhID0gTlVMTDsKIAotICAgIHJldHVybiBjbV9mbXRfZGVzYzsKKyAgICBhdmNfaW5mbyA9IENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7CisKKyAgICBzd2l0Y2ggKGNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIGtDTVZpZGVvQ29kZWNUeXBlX01QRUc0VmlkZW8gOgorICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgZGF0YSA9IHZpZGVvdG9vbGJveF9lc2RzX2V4dHJhZGF0YV9jcmVhdGUoYXZjdHgpOworICAgICAgICBpZiAoZGF0YSkKKyAgICAgICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGF2Y19pbmZvLCBDRlNUUigiZXNkcyIpLCBkYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ01WaWRlb0NvZGVjVHlwZV9IMjY0IDoKKyAgICAgICAgZGF0YSA9IGZmX3ZpZGVvdG9vbGJveF9hdmNjX2V4dHJhZGF0YV9jcmVhdGUoYXZjdHgpOworICAgICAgICBpZiAoZGF0YSkKKyAgICAgICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGF2Y19pbmZvLCBDRlNUUigiYXZjQyIpLCBkYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ01WaWRlb0NvZGVjVHlwZV9IRVZDIDoKKyAgICAgICAgZGF0YSA9IGZmX3ZpZGVvdG9vbGJveF9odmNjX2V4dHJhZGF0YV9jcmVhdGUoYXZjdHgpOworICAgICAgICBpZiAoZGF0YSkKKyAgICAgICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGF2Y19pbmZvLCBDRlNUUigiaHZjQyIpLCBkYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoY29uZmlnX2luZm8sCisgICAgICAgICAgICBrQ01Gb3JtYXREZXNjcmlwdGlvbkV4dGVuc2lvbl9TYW1wbGVEZXNjcmlwdGlvbkV4dGVuc2lvbkF0b21zLAorICAgICAgICAgICAgYXZjX2luZm8pOworCisgICAgaWYgKGRhdGEpCisgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKworICAgIENGUmVsZWFzZShhdmNfaW5mbyk7CisgICAgcmV0dXJuIGNvbmZpZ19pbmZvOwogfQogCi1zdGF0aWMgaW50IHZpZGVvdG9vbGJveF9kZWZhdWx0X2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQorc3RhdGljIGludCB2aWRlb3Rvb2xib3hfc3RhcnQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIEFWVmlkZW90b29sYm94Q29udGV4dCAqdmlkZW90b29sYm94ID0gYXZjdHgtPmh3YWNjZWxfY29udGV4dDsKKyAgICBBVlZpZGVvdG9vbGJveENvbnRleHQgKnZpZGVvdG9vbGJveCA9IHZpZGVvdG9vbGJveF9nZXRfY29udGV4dChhdmN0eCk7CiAgICAgT1NTdGF0dXMgc3RhdHVzOwogICAgIFZURGVjb21wcmVzc2lvbk91dHB1dENhbGxiYWNrUmVjb3JkIGRlY29kZXJfY2I7CiAgICAgQ0ZEaWN0aW9uYXJ5UmVmIGRlY29kZXJfc3BlYzsKQEAgLTUyOCw2ICs3ODgsOSBAQAogICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NCA6CiAgICAgICAgIHZpZGVvdG9vbGJveC0+Y21fY29kZWNfdHlwZSA9IGtDTVZpZGVvQ29kZWNUeXBlX0gyNjQ7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfSEVWQyA6CisgICAgICAgIHZpZGVvdG9vbGJveC0+Y21fY29kZWNfdHlwZSA9IGtDTVZpZGVvQ29kZWNUeXBlX0hFVkM7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTyA6CiAgICAgICAgIHZpZGVvdG9vbGJveC0+Y21fY29kZWNfdHlwZSA9IGtDTVZpZGVvQ29kZWNUeXBlX01QRUcxVmlkZW87CiAgICAgICAgIGJyZWFrOwpAQCAtNTQzLDYgKzgwNiwxMSBAQAogCiAgICAgZGVjb2Rlcl9zcGVjID0gdmlkZW90b29sYm94X2RlY29kZXJfY29uZmlnX2NyZWF0ZSh2aWRlb3Rvb2xib3gtPmNtX2NvZGVjX3R5cGUsIGF2Y3R4KTsKIAorICAgIGlmICghZGVjb2Rlcl9zcGVjKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiZGVjb2RlciBzcGVjaWZpY2F0aW9uIGNyZWF0aW9uIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKICAgICB2aWRlb3Rvb2xib3gtPmNtX2ZtdF9kZXNjID0gdmlkZW90b29sYm94X2Zvcm1hdF9kZXNjX2NyZWF0ZSh2aWRlb3Rvb2xib3gtPmNtX2NvZGVjX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlcl9zcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT53aWR0aCwKQEAgLTU3NiwzMyArODQ0LDI2MCBAQAogCiAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICBjYXNlIGtWVFZpZGVvRGVjb2Rlck5vdEF2YWlsYWJsZU5vd0VycjoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlZpZGVvVG9vbGJveCBzZXNzaW9uIG5vdCBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKICAgICBjYXNlIGtWVFZpZGVvRGVjb2RlclVuc3VwcG9ydGVkRGF0YUZvcm1hdEVycjoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlZpZGVvVG9vbGJveCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZm9ybWF0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgY2FzZSBrVlRDb3VsZE5vdEZpbmRWaWRlb0RlY29kZXJFcnI6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJWaWRlb1Rvb2xib3ggZGVjb2RlciBmb3IgdGhpcyBmb3JtYXQgbm90IGZvdW5kLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgY2FzZSBrVlRWaWRlb0RlY29kZXJNYWxmdW5jdGlvbkVycjoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlZpZGVvVG9vbGJveCBtYWxmdW5jdGlvbi5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIGNhc2Uga1ZUVmlkZW9EZWNvZGVyQmFkRGF0YUVyciA6CisgICAgY2FzZSBrVlRWaWRlb0RlY29kZXJCYWREYXRhRXJyOgorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiVmlkZW9Ub29sYm94IHJlcG9ydGVkIGludmFsaWQgZGF0YS5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICBjYXNlIDA6CiAgICAgICAgIHJldHVybiAwOwogICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJVbmtub3duIFZpZGVvVG9vbGJveCBzZXNzaW9uIGNyZWF0aW9uIGVycm9yICVkXG4iLCAoaW50KXN0YXR1cyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCB2aWRlb3Rvb2xib3hfZGVmYXVsdF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3N0YXRpYyB2b2lkIHZpZGVvdG9vbGJveF9zdG9wKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKLSAgICBBVlZpZGVvdG9vbGJveENvbnRleHQgKnZpZGVvdG9vbGJveCA9IGF2Y3R4LT5od2FjY2VsX2NvbnRleHQ7CisgICAgQVZWaWRlb3Rvb2xib3hDb250ZXh0ICp2aWRlb3Rvb2xib3ggPSB2aWRlb3Rvb2xib3hfZ2V0X2NvbnRleHQoYXZjdHgpOworICAgIGlmICghdmlkZW90b29sYm94KQorICAgICAgICByZXR1cm47CiAKLSAgICBpZiAodmlkZW90b29sYm94KSB7Ci0gICAgICAgIGlmICh2aWRlb3Rvb2xib3gtPmNtX2ZtdF9kZXNjKQotICAgICAgICAgICAgQ0ZSZWxlYXNlKHZpZGVvdG9vbGJveC0+Y21fZm10X2Rlc2MpOworICAgIGlmICh2aWRlb3Rvb2xib3gtPmNtX2ZtdF9kZXNjKSB7CisgICAgICAgIENGUmVsZWFzZSh2aWRlb3Rvb2xib3gtPmNtX2ZtdF9kZXNjKTsKKyAgICAgICAgdmlkZW90b29sYm94LT5jbV9mbXRfZGVzYyA9IE5VTEw7CisgICAgfQogCi0gICAgICAgIGlmICh2aWRlb3Rvb2xib3gtPnNlc3Npb24pCi0gICAgICAgICAgICBWVERlY29tcHJlc3Npb25TZXNzaW9uSW52YWxpZGF0ZSh2aWRlb3Rvb2xib3gtPnNlc3Npb24pOworICAgIGlmICh2aWRlb3Rvb2xib3gtPnNlc3Npb24pIHsKKyAgICAgICAgVlREZWNvbXByZXNzaW9uU2Vzc2lvbkludmFsaWRhdGUodmlkZW90b29sYm94LT5zZXNzaW9uKTsKKyAgICAgICAgQ0ZSZWxlYXNlKHZpZGVvdG9vbGJveC0+c2Vzc2lvbik7CisgICAgICAgIHZpZGVvdG9vbGJveC0+c2Vzc2lvbiA9IE5VTEw7CiAgICAgfQogfQogCi1BVkhXQWNjZWwgZmZfaDI2M192aWRlb3Rvb2xib3hfaHdhY2NlbCA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICp2aWRlb3Rvb2xib3hfZXJyb3Jfc3RyaW5nKE9TU3RhdHVzIHN0YXR1cykKK3sKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIGtWVFZpZGVvRGVjb2RlckJhZERhdGFFcnI6CisgICAgICAgICAgICByZXR1cm4gImJhZCBkYXRhIjsKKyAgICAgICAgY2FzZSBrVlRWaWRlb0RlY29kZXJNYWxmdW5jdGlvbkVycjoKKyAgICAgICAgICAgIHJldHVybiAiZGVjb2RlciBtYWxmdW5jdGlvbiI7CisgICAgICAgIGNhc2Uga1ZUSW52YWxpZFNlc3Npb25FcnI6CisgICAgICAgICAgICByZXR1cm4gImludmFsaWQgc2Vzc2lvbiI7CisgICAgfQorICAgIHJldHVybiAidW5rbm93biI7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW90b29sYm94X2NvbW1vbl9lbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBPU1N0YXR1cyBzdGF0dXM7CisgICAgQVZWaWRlb3Rvb2xib3hDb250ZXh0ICp2aWRlb3Rvb2xib3ggPSB2aWRlb3Rvb2xib3hfZ2V0X2NvbnRleHQoYXZjdHgpOworICAgIFZUQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworCisgICAgaWYgKHZ0Y3R4LT5yZWNvbmZpZ19uZWVkZWQgPT0gdHJ1ZSkgeworICAgICAgICB2dGN0eC0+cmVjb25maWdfbmVlZGVkID0gZmFsc2U7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJWaWRlb1Rvb2xib3ggZGVjb2RlciBuZWVkcyByZWNvbmZpZywgcmVzdGFydGluZy4uXG4iKTsKKyAgICAgICAgdmlkZW90b29sYm94X3N0b3AoYXZjdHgpOworICAgICAgICBpZiAodmlkZW90b29sYm94X3N0YXJ0KGF2Y3R4KSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghdmlkZW90b29sYm94LT5zZXNzaW9uIHx8ICF2dGN0eC0+Yml0c3RyZWFtIHx8ICF2dGN0eC0+Yml0c3RyZWFtX3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3RhdHVzID0gdmlkZW90b29sYm94X3Nlc3Npb25fZGVjb2RlX2ZyYW1lKGF2Y3R4KTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0ga1ZUVmlkZW9EZWNvZGVyTWFsZnVuY3Rpb25FcnIgfHwgc3RhdHVzID09IGtWVEludmFsaWRTZXNzaW9uRXJyKQorICAgICAgICAgICAgdnRjdHgtPnJlY29uZmlnX25lZWRlZCA9IHRydWU7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlY29kZSBmcmFtZSAoJXMsICVkKVxuIiwgdmlkZW90b29sYm94X2Vycm9yX3N0cmluZyhzdGF0dXMpLCAoaW50KXN0YXR1cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKCF2dGN0eC0+ZnJhbWUpIHsKKyAgICAgICAgdnRjdHgtPnJlY29uZmlnX25lZWRlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIHZpZGVvdG9vbGJveF9idWZmZXJfY3JlYXRlKGF2Y3R4LCBmcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW90b29sYm94X2gyNjRfZW5kX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIMjY0Q29udGV4dCAqaCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBoLT5jdXJfcGljX3B0ci0+ZjsKKyAgICBWVENvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gdmlkZW90b29sYm94X2NvbW1vbl9lbmRfZnJhbWUoYXZjdHgsIGZyYW1lKTsKKyAgICB2dGN0eC0+Yml0c3RyZWFtX3NpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW90b29sYm94X2hldmNfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW90b29sYm94X2hldmNfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgcmV0dXJuIHZpZGVvdG9vbGJveF9jb21tb25fZGVjb2RlX3NsaWNlKGF2Y3R4LCBidWZmZXIsIHNpemUpOworfQorCisKK3N0YXRpYyBpbnQgdmlkZW90b29sYm94X2hldmNfZGVjb2RlX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgcmV0dXJuIHZpZGVvdG9vbGJveF9jb21tb25fZGVjb2RlX3NsaWNlKGF2Y3R4LCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IHZpZGVvdG9vbGJveF9oZXZjX2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgSEVWQ0NvbnRleHQgKmggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gaC0+cmVmLT5mcmFtZTsKKyAgICBWVENvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPmludGVybmFsLT5od2FjY2VsX3ByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gdmlkZW90b29sYm94X2NvbW1vbl9lbmRfZnJhbWUoYXZjdHgsIGZyYW1lKTsKKyAgICB2dGN0eC0+Yml0c3RyZWFtX3NpemUgPSAwOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW90b29sYm94X21wZWdfc3RhcnRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpCit7CisgICAgVlRDb250ZXh0ICp2dGN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisKKyAgICByZXR1cm4gdmlkZW90b29sYm94X2J1ZmZlcl9jb3B5KHZ0Y3R4LCBidWZmZXIsIHNpemUpOworfQorCitzdGF0aWMgaW50IHZpZGVvdG9vbGJveF9tcGVnX2RlY29kZV9zbGljZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGVvdG9vbGJveF9tcGVnX2VuZF9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgTXBlZ0VuY0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gcy0+Y3VycmVudF9waWN0dXJlX3B0ci0+ZjsKKworICAgIHJldHVybiB2aWRlb3Rvb2xib3hfY29tbW9uX2VuZF9mcmFtZShhdmN0eCwgZnJhbWUpOworfQorCitzdGF0aWMgaW50IHZpZGVvdG9vbGJveF91bmluaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZUQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+aW50ZXJuYWwtPmh3YWNjZWxfcHJpdl9kYXRhOworICAgIGlmICghdnRjdHgpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmZfdmlkZW90b29sYm94X3VuaW5pdChhdmN0eCk7CisKKyAgICBpZiAodnRjdHgtPnZ0X2N0eCkKKyAgICAgICAgdmlkZW90b29sYm94X3N0b3AoYXZjdHgpOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZ2dGN0eC0+Y2FjaGVkX2h3X2ZyYW1lc19jdHgpOworICAgIGF2X2ZyZWVwKCZ2dGN0eC0+dnRfY3R4KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGVvdG9vbGJveF9jb21tb25faW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVlRDb250ZXh0ICp2dGN0eCA9IGF2Y3R4LT5pbnRlcm5hbC0+aHdhY2NlbF9wcml2X2RhdGE7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmh3X2ZyYW1lczsKKyAgICBpbnQgZXJyOworCisgICAgLy8gT2xkIEFQSSAtIGRvIG5vdGhpbmcuCisgICAgaWYgKGF2Y3R4LT5od2FjY2VsX2NvbnRleHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFhdmN0eC0+aHdfZnJhbWVzX2N0eCAmJiAhYXZjdHgtPmh3X2RldmljZV9jdHgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRWl0aGVyIGh3X2ZyYW1lc19jdHggb3IgaHdfZGV2aWNlX2N0eCBtdXN0IGJlIHNldC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHZ0Y3R4LT52dF9jdHggPSBhdl92aWRlb3Rvb2xib3hfYWxsb2NfY29udGV4dCgpOworICAgIGlmICghdnRjdHgtPnZ0X2N0eCkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgaHdfZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0KilhdmN0eC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmN0eC0+aHdfZnJhbWVzX2N0eCA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGF2Y3R4LT5od19kZXZpY2VfY3R4KTsKKyAgICAgICAgaWYgKCFhdmN0eC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaHdfZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0KilhdmN0eC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICAgICAgaHdfZnJhbWVzLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1ZJREVPVE9PTEJPWDsKKyAgICAgICAgaHdfZnJhbWVzLT5zd19mb3JtYXQgPSBBVl9QSVhfRk1UX05WMTI7IC8vIHNhbWUgYXMgYXZfdmlkZW90b29sYm94X2FsbG9jX2NvbnRleHQoKQorICAgICAgICBod19mcmFtZXMtPndpZHRoID0gYXZjdHgtPndpZHRoOworICAgICAgICBod19mcmFtZXMtPmhlaWdodCA9IGF2Y3R4LT5oZWlnaHQ7CisKKyAgICAgICAgZXJyID0gYXZfaHdmcmFtZV9jdHhfaW5pdChhdmN0eC0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmF2Y3R4LT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZ0Y3R4LT5jYWNoZWRfaHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoYXZjdHgtPmh3X2ZyYW1lc19jdHgpOworICAgIGlmICghdnRjdHgtPmNhY2hlZF9od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHZ0Y3R4LT52dF9jdHgtPmN2X3BpeF9mbXRfdHlwZSA9CisgICAgICAgIGF2X21hcF92aWRlb3Rvb2xib3hfZm9ybWF0X2Zyb21fcGl4Zm10KGh3X2ZyYW1lcy0+c3dfZm9ybWF0KTsKKyAgICBpZiAoIXZ0Y3R4LT52dF9jdHgtPmN2X3BpeF9mbXRfdHlwZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gc3dfZm9ybWF0LlxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IHZpZGVvdG9vbGJveF9zdGFydChhdmN0eCk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHZpZGVvdG9vbGJveF91bmluaXQoYXZjdHgpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmlkZW90b29sYm94X2ZyYW1lX3BhcmFtcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19jdHgpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICBmcmFtZXNfY3R4LT5mb3JtYXQgICAgICAgICAgICA9IEFWX1BJWF9GTVRfVklERU9UT09MQk9YOworICAgIGZyYW1lc19jdHgtPndpZHRoICAgICAgICAgICAgID0gYXZjdHgtPmNvZGVkX3dpZHRoOworICAgIGZyYW1lc19jdHgtPmhlaWdodCAgICAgICAgICAgID0gYXZjdHgtPmNvZGVkX2hlaWdodDsKKyAgICBmcmFtZXNfY3R4LT5zd19mb3JtYXQgICAgICAgICA9IEFWX1BJWF9GTVRfTlYxMjsKKworICAgIHJldHVybiAwOworfQorCitjb25zdCBBVkhXQWNjZWwgZmZfaDI2M192aWRlb3Rvb2xib3hfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAiaDI2M192aWRlb3Rvb2xib3giLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYzLApAQCAtNjExLDExICsxMTA2LDI5IEBACiAgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmlkZW90b29sYm94X21wZWdfc3RhcnRfZnJhbWUsCiAgICAgLmRlY29kZV9zbGljZSAgID0gdmlkZW90b29sYm94X21wZWdfZGVjb2RlX3NsaWNlLAogICAgIC5lbmRfZnJhbWUgICAgICA9IHZpZGVvdG9vbGJveF9tcGVnX2VuZF9mcmFtZSwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSB2aWRlb3Rvb2xib3hfZnJhbWVfcGFyYW1zLAorICAgIC5pbml0ICAgICAgICAgICA9IHZpZGVvdG9vbGJveF9jb21tb25faW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSB2aWRlb3Rvb2xib3hfdW5pbml0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWVENvbnRleHQpLAorfTsKKworY29uc3QgQVZIV0FjY2VsIGZmX2hldmNfdmlkZW90b29sYm94X2h3YWNjZWwgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImhldmNfdmlkZW90b29sYm94IiwKKyAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfSEVWQywKKyAgICAucGl4X2ZtdCAgICAgICAgPSBBVl9QSVhfRk1UX1ZJREVPVE9PTEJPWCwKKyAgICAuYWxsb2NfZnJhbWUgICAgPSBmZl92aWRlb3Rvb2xib3hfYWxsb2NfZnJhbWUsCisgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmlkZW90b29sYm94X2hldmNfc3RhcnRfZnJhbWUsCisgICAgLmRlY29kZV9zbGljZSAgID0gdmlkZW90b29sYm94X2hldmNfZGVjb2RlX3NsaWNlLAorICAgIC5kZWNvZGVfcGFyYW1zICA9IHZpZGVvdG9vbGJveF9oZXZjX2RlY29kZV9wYXJhbXMsCisgICAgLmVuZF9mcmFtZSAgICAgID0gdmlkZW90b29sYm94X2hldmNfZW5kX2ZyYW1lLAorICAgIC5mcmFtZV9wYXJhbXMgICA9IHZpZGVvdG9vbGJveF9mcmFtZV9wYXJhbXMsCisgICAgLmluaXQgICAgICAgICAgID0gdmlkZW90b29sYm94X2NvbW1vbl9pbml0LAogICAgIC51bmluaXQgICAgICAgICA9IGZmX3ZpZGVvdG9vbGJveF91bmluaXQsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZUQ29udGV4dCksCiB9OwogCi1BVkhXQWNjZWwgZmZfaDI2NF92aWRlb3Rvb2xib3hfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl9oMjY0X3ZpZGVvdG9vbGJveF9od2FjY2VsID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJoMjY0X3ZpZGVvdG9vbGJveCIsCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCkBAIC02MjMsMTIgKzExMzYsMTUgQEAKICAgICAuYWxsb2NfZnJhbWUgICAgPSBmZl92aWRlb3Rvb2xib3hfYWxsb2NfZnJhbWUsCiAgICAgLnN0YXJ0X2ZyYW1lICAgID0gZmZfdmlkZW90b29sYm94X2gyNjRfc3RhcnRfZnJhbWUsCiAgICAgLmRlY29kZV9zbGljZSAgID0gZmZfdmlkZW90b29sYm94X2gyNjRfZGVjb2RlX3NsaWNlLAorICAgIC5kZWNvZGVfcGFyYW1zICA9IHZpZGVvdG9vbGJveF9oMjY0X2RlY29kZV9wYXJhbXMsCiAgICAgLmVuZF9mcmFtZSAgICAgID0gdmlkZW90b29sYm94X2gyNjRfZW5kX2ZyYW1lLAotICAgIC51bmluaXQgICAgICAgICA9IGZmX3ZpZGVvdG9vbGJveF91bmluaXQsCisgICAgLmZyYW1lX3BhcmFtcyAgID0gdmlkZW90b29sYm94X2ZyYW1lX3BhcmFtcywKKyAgICAuaW5pdCAgICAgICAgICAgPSB2aWRlb3Rvb2xib3hfY29tbW9uX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgID0gdmlkZW90b29sYm94X3VuaW5pdCwKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVlRDb250ZXh0KSwKIH07CiAKLUFWSFdBY2NlbCBmZl9tcGVnMV92aWRlb3Rvb2xib3hfaHdhY2NlbCA9IHsKK2NvbnN0IEFWSFdBY2NlbCBmZl9tcGVnMV92aWRlb3Rvb2xib3hfaHdhY2NlbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibXBlZzFfdmlkZW90b29sYm94IiwKICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmlkICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTywKQEAgLTYzNywxMSArMTE1MywxMyBAQAogICAgIC5zdGFydF9mcmFtZSAgICA9IHZpZGVvdG9vbGJveF9tcGVnX3N0YXJ0X2ZyYW1lLAogICAgIC5kZWNvZGVfc2xpY2UgICA9IHZpZGVvdG9vbGJveF9tcGVnX2RlY29kZV9zbGljZSwKICAgICAuZW5kX2ZyYW1lICAgICAgPSB2aWRlb3Rvb2xib3hfbXBlZ19lbmRfZnJhbWUsCi0gICAgLnVuaW5pdCAgICAgICAgID0gZmZfdmlkZW90b29sYm94X3VuaW5pdCwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSB2aWRlb3Rvb2xib3hfZnJhbWVfcGFyYW1zLAorICAgIC5pbml0ICAgICAgICAgICA9IHZpZGVvdG9vbGJveF9jb21tb25faW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSB2aWRlb3Rvb2xib3hfdW5pbml0LAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWVENvbnRleHQpLAogfTsKIAotQVZIV0FjY2VsIGZmX21wZWcyX3ZpZGVvdG9vbGJveF9od2FjY2VsID0geworY29uc3QgQVZIV0FjY2VsIGZmX21wZWcyX3ZpZGVvdG9vbGJveF9od2FjY2VsID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJtcGVnMl92aWRlb3Rvb2xib3giLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLApAQCAtNjUwLDExICsxMTY4LDEzIEBACiAgICAgLnN0YXJ0X2ZyYW1lICAgID0gdmlkZW90b29sYm94X21wZWdfc3RhcnRfZnJhbWUsCiAgICAgLmRlY29kZV9zbGljZSAgID0gdmlkZW90b29sYm94X21wZWdfZGVjb2RlX3NsaWNlLAogICAgIC5lbmRfZnJhbWUgICAgICA9IHZpZGVvdG9vbGJveF9tcGVnX2VuZF9mcmFtZSwKLSAgICAudW5pbml0ICAgICAgICAgPSBmZl92aWRlb3Rvb2xib3hfdW5pbml0LAorICAgIC5mcmFtZV9wYXJhbXMgICA9IHZpZGVvdG9vbGJveF9mcmFtZV9wYXJhbXMsCisgICAgLmluaXQgICAgICAgICAgID0gdmlkZW90b29sYm94X2NvbW1vbl9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IHZpZGVvdG9vbGJveF91bmluaXQsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZUQ29udGV4dCksCiB9OwogCi1BVkhXQWNjZWwgZmZfbXBlZzRfdmlkZW90b29sYm94X2h3YWNjZWwgPSB7Citjb25zdCBBVkhXQWNjZWwgZmZfbXBlZzRfdmlkZW90b29sYm94X2h3YWNjZWwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gIm1wZWc0X3ZpZGVvdG9vbGJveCIsCiAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUc0LApAQCAtNjYzLDcgKzExODMsOSBAQAogICAgIC5zdGFydF9mcmFtZSAgICA9IHZpZGVvdG9vbGJveF9tcGVnX3N0YXJ0X2ZyYW1lLAogICAgIC5kZWNvZGVfc2xpY2UgICA9IHZpZGVvdG9vbGJveF9tcGVnX2RlY29kZV9zbGljZSwKICAgICAuZW5kX2ZyYW1lICAgICAgPSB2aWRlb3Rvb2xib3hfbXBlZ19lbmRfZnJhbWUsCi0gICAgLnVuaW5pdCAgICAgICAgID0gZmZfdmlkZW90b29sYm94X3VuaW5pdCwKKyAgICAuZnJhbWVfcGFyYW1zICAgPSB2aWRlb3Rvb2xib3hfZnJhbWVfcGFyYW1zLAorICAgIC5pbml0ICAgICAgICAgICA9IHZpZGVvdG9vbGJveF9jb21tb25faW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSB2aWRlb3Rvb2xib3hfdW5pbml0LAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWVENvbnRleHQpLAogfTsKIApAQCAtNjg5LDEzICsxMjExLDEzIEBACiAgICAgYXZjdHgtPmh3YWNjZWxfY29udGV4dCA9IHZ0Y3R4ID86IGF2X3ZpZGVvdG9vbGJveF9hbGxvY19jb250ZXh0KCk7CiAgICAgaWYgKCFhdmN0eC0+aHdhY2NlbF9jb250ZXh0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHJldHVybiB2aWRlb3Rvb2xib3hfZGVmYXVsdF9pbml0KGF2Y3R4KTsKKyAgICByZXR1cm4gdmlkZW90b29sYm94X3N0YXJ0KGF2Y3R4KTsKIH0KIAogdm9pZCBhdl92aWRlb3Rvb2xib3hfZGVmYXVsdF9mcmVlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKIAotICAgIHZpZGVvdG9vbGJveF9kZWZhdWx0X2ZyZWUoYXZjdHgpOworICAgIHZpZGVvdG9vbGJveF9zdG9wKGF2Y3R4KTsKICAgICBhdl9mcmVlcCgmYXZjdHgtPmh3YWNjZWxfY29udGV4dCk7CiB9CiAjZW5kaWYgLyogQ09ORklHX1ZJREVPVE9PTEJPWCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92aWRlb3Rvb2xib3guaCBiL2xpYmF2Y29kZWMvdmlkZW90b29sYm94LmgKaW5kZXggYTQ4NjM4ZS4uYWYyZGIwZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92aWRlb3Rvb2xib3guaAorKysgYi9saWJhdmNvZGVjL3ZpZGVvdG9vbGJveC5oCkBAIC01OCw3ICs1OCw4IEBACiAKICAgICAvKioKICAgICAgKiBDVlBpeGVsQnVmZmVyIEZvcm1hdCBUeXBlIHRoYXQgVmlkZW90b29sYm94IHdpbGwgdXNlIGZvciBkZWNvZGVkIGZyYW1lcy4KLSAgICAgKiBzZXQgYnkgdGhlIGNhbGxlci4KKyAgICAgKiBzZXQgYnkgdGhlIGNhbGxlci4gSWYgdGhpcyBpcyBzZXQgdG8gMCwgdGhlbiBubyBzcGVjaWZpYyBmb3JtYXQgaXMKKyAgICAgKiByZXF1ZXN0ZWQgZnJvbSB0aGUgZGVjb2RlciwgYW5kIGl0cyBuYXRpdmUgZm9ybWF0IGlzIG91dHB1dC4KICAgICAgKi8KICAgICBPU1R5cGUgY3ZfcGl4X2ZtdF90eXBlOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZpZGVvdG9vbGJveGVuYy5jIGIvbGliYXZjb2RlYy92aWRlb3Rvb2xib3hlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFiYTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92aWRlb3Rvb2xib3hlbmMuYwpAQCAtMCwwICsxLDI2MzggQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMTUgUmljayBLZXJuIDxrZXJucmpAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8VmlkZW9Ub29sYm94L1ZpZGVvVG9vbGJveC5oPgorI2luY2x1ZGUgPENvcmVWaWRlby9Db3JlVmlkZW8uaD4KKyNpbmNsdWRlIDxDb3JlTWVkaWEvQ29yZU1lZGlhLmg+CisjaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+CisjaW5jbHVkZSA8QXZhaWxhYmlsaXR5Lmg+CisjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgImgyNjQuaCIKKyNpbmNsdWRlICJoMjY0X3NlaS5oIgorI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpZiAhSEFWRV9LQ01WSURFT0NPREVDVFlQRV9IRVZDCitlbnVtIHsga0NNVmlkZW9Db2RlY1R5cGVfSEVWQyA9ICdodmMxJyB9OworI2VuZGlmCisKK3R5cGVkZWYgT1NTdGF0dXMgKCpnZXRQYXJhbWV0ZXJTZXRBdEluZGV4KShDTUZvcm1hdERlc2NyaXB0aW9uUmVmIHZpZGVvRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGFyYW1ldGVyU2V0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBhcmFtZXRlclNldFBvaW50ZXJPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwYXJhbWV0ZXJTZXRTaXplT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcGFyYW1ldGVyU2V0Q291bnRPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpOQUxVbml0SGVhZGVyTGVuZ3RoT3V0KTsKKworLy9UaGVzZSBzeW1ib2xzIG1heSBub3QgYmUgcHJlc2VudAorc3RhdGljIHN0cnVjdHsKKyAgICBDRlN0cmluZ1JlZiBrQ1ZJbWFnZUJ1ZmZlckNvbG9yUHJpbWFyaWVzX0lUVV9SXzIwMjA7CisgICAgQ0ZTdHJpbmdSZWYga0NWSW1hZ2VCdWZmZXJUcmFuc2ZlckZ1bmN0aW9uX0lUVV9SXzIwMjA7CisgICAgQ0ZTdHJpbmdSZWYga0NWSW1hZ2VCdWZmZXJZQ2JDck1hdHJpeF9JVFVfUl8yMDIwOworCisgICAgQ0ZTdHJpbmdSZWYga1ZUQ29tcHJlc3Npb25Qcm9wZXJ0eUtleV9IMjY0RW50cm9weU1vZGU7CisgICAgQ0ZTdHJpbmdSZWYga1ZUSDI2NEVudHJvcHlNb2RlX0NBVkxDOworICAgIENGU3RyaW5nUmVmIGtWVEgyNjRFbnRyb3B5TW9kZV9DQUJBQzsKKworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lXzRfMDsKKyAgICBDRlN0cmluZ1JlZiBrVlRQcm9maWxlTGV2ZWxfSDI2NF9CYXNlbGluZV80XzI7CisgICAgQ0ZTdHJpbmdSZWYga1ZUUHJvZmlsZUxldmVsX0gyNjRfQmFzZWxpbmVfNV8wOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lXzVfMTsKKyAgICBDRlN0cmluZ1JlZiBrVlRQcm9maWxlTGV2ZWxfSDI2NF9CYXNlbGluZV81XzI7CisgICAgQ0ZTdHJpbmdSZWYga1ZUUHJvZmlsZUxldmVsX0gyNjRfQmFzZWxpbmVfQXV0b0xldmVsOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNF8yOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNV8xOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNV8yOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fQXV0b0xldmVsOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfM18wOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfM18xOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfM18yOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNF8wOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNF8xOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNF8yOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNV8xOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNV8yOworICAgIENGU3RyaW5nUmVmIGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfQXV0b0xldmVsOworCisgICAgQ0ZTdHJpbmdSZWYga1ZUUHJvZmlsZUxldmVsX0hFVkNfTWFpbl9BdXRvTGV2ZWw7CisgICAgQ0ZTdHJpbmdSZWYga1ZUUHJvZmlsZUxldmVsX0hFVkNfTWFpbjEwX0F1dG9MZXZlbDsKKworICAgIENGU3RyaW5nUmVmIGtWVENvbXByZXNzaW9uUHJvcGVydHlLZXlfUmVhbFRpbWU7CisKKyAgICBDRlN0cmluZ1JlZiBrVlRWaWRlb0VuY29kZXJTcGVjaWZpY2F0aW9uX0VuYWJsZUhhcmR3YXJlQWNjZWxlcmF0ZWRWaWRlb0VuY29kZXI7CisgICAgQ0ZTdHJpbmdSZWYga1ZUVmlkZW9FbmNvZGVyU3BlY2lmaWNhdGlvbl9SZXF1aXJlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRW5jb2RlcjsKKworICAgIGdldFBhcmFtZXRlclNldEF0SW5kZXggQ01WaWRlb0Zvcm1hdERlc2NyaXB0aW9uR2V0SEVWQ1BhcmFtZXRlclNldEF0SW5kZXg7Cit9IGNvbXBhdF9rZXlzOworCisjZGVmaW5lIEdFVF9TWU0oc3ltYm9sLCBkZWZhdWx0VmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitkb3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0ZTdHJpbmdSZWYqIGhhbmRsZSA9IChDRlN0cmluZ1JlZiopZGxzeW0oUlRMRF9ERUZBVUxULCAjc3ltYm9sKTsgICBcCisgICAgaWYoIWhhbmRsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbXBhdF9rZXlzLnN5bWJvbCA9IENGU1RSKGRlZmF1bHRWYWwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbXBhdF9rZXlzLnN5bWJvbCA9ICpoYW5kbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9d2hpbGUoMCkKKworc3RhdGljIHB0aHJlYWRfb25jZV90IG9uY2VfY3RybCA9IFBUSFJFQURfT05DRV9JTklUOworCitzdGF0aWMgdm9pZCBsb2FkVlRFbmNTeW1ib2xzKCl7CisgICAgY29tcGF0X2tleXMuQ01WaWRlb0Zvcm1hdERlc2NyaXB0aW9uR2V0SEVWQ1BhcmFtZXRlclNldEF0SW5kZXggPQorICAgICAgICAoZ2V0UGFyYW1ldGVyU2V0QXRJbmRleClkbHN5bSgKKyAgICAgICAgICAgIFJUTERfREVGQVVMVCwKKyAgICAgICAgICAgICJDTVZpZGVvRm9ybWF0RGVzY3JpcHRpb25HZXRIRVZDUGFyYW1ldGVyU2V0QXRJbmRleCIKKyAgICAgICAgKTsKKworICAgIEdFVF9TWU0oa0NWSW1hZ2VCdWZmZXJDb2xvclByaW1hcmllc19JVFVfUl8yMDIwLCAgICJJVFVfUl8yMDIwIik7CisgICAgR0VUX1NZTShrQ1ZJbWFnZUJ1ZmZlclRyYW5zZmVyRnVuY3Rpb25fSVRVX1JfMjAyMCwgIklUVV9SXzIwMjAiKTsKKyAgICBHRVRfU1lNKGtDVkltYWdlQnVmZmVyWUNiQ3JNYXRyaXhfSVRVX1JfMjAyMCwgICAgICAiSVRVX1JfMjAyMCIpOworCisgICAgR0VUX1NZTShrVlRDb21wcmVzc2lvblByb3BlcnR5S2V5X0gyNjRFbnRyb3B5TW9kZSwgIkgyNjRFbnRyb3B5TW9kZSIpOworICAgIEdFVF9TWU0oa1ZUSDI2NEVudHJvcHlNb2RlX0NBVkxDLCAiQ0FWTEMiKTsKKyAgICBHRVRfU1lNKGtWVEgyNjRFbnRyb3B5TW9kZV9DQUJBQywgIkNBQkFDIik7CisKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lXzRfMCwgICAgICAgIkgyNjRfQmFzZWxpbmVfNF8wIik7CisgICAgR0VUX1NZTShrVlRQcm9maWxlTGV2ZWxfSDI2NF9CYXNlbGluZV80XzIsICAgICAgICJIMjY0X0Jhc2VsaW5lXzRfMiIpOworICAgIEdFVF9TWU0oa1ZUUHJvZmlsZUxldmVsX0gyNjRfQmFzZWxpbmVfNV8wLCAgICAgICAiSDI2NF9CYXNlbGluZV81XzAiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lXzVfMSwgICAgICAgIkgyNjRfQmFzZWxpbmVfNV8xIik7CisgICAgR0VUX1NZTShrVlRQcm9maWxlTGV2ZWxfSDI2NF9CYXNlbGluZV81XzIsICAgICAgICJIMjY0X0Jhc2VsaW5lXzVfMiIpOworICAgIEdFVF9TWU0oa1ZUUHJvZmlsZUxldmVsX0gyNjRfQmFzZWxpbmVfQXV0b0xldmVsLCAiSDI2NF9CYXNlbGluZV9BdXRvTGV2ZWwiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNF8yLCAgICAgICAgICAgIkgyNjRfTWFpbl80XzIiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNV8xLCAgICAgICAgICAgIkgyNjRfTWFpbl81XzEiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNV8yLCAgICAgICAgICAgIkgyNjRfTWFpbl81XzIiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fQXV0b0xldmVsLCAgICAgIkgyNjRfTWFpbl9BdXRvTGV2ZWwiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfM18wLCAgICAgICAgICAgIkgyNjRfSGlnaF8zXzAiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfM18xLCAgICAgICAgICAgIkgyNjRfSGlnaF8zXzEiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfM18yLCAgICAgICAgICAgIkgyNjRfSGlnaF8zXzIiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNF8wLCAgICAgICAgICAgIkgyNjRfSGlnaF80XzAiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNF8xLCAgICAgICAgICAgIkgyNjRfSGlnaF80XzEiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNF8yLCAgICAgICAgICAgIkgyNjRfSGlnaF80XzIiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNV8xLCAgICAgICAgICAgIkgyNjRfSGlnaF81XzEiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNV8yLCAgICAgICAgICAgIkgyNjRfSGlnaF81XzIiKTsKKyAgICBHRVRfU1lNKGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfQXV0b0xldmVsLCAgICAgIkgyNjRfSGlnaF9BdXRvTGV2ZWwiKTsKKworICAgIEdFVF9TWU0oa1ZUUHJvZmlsZUxldmVsX0hFVkNfTWFpbl9BdXRvTGV2ZWwsICAgICAiSEVWQ19NYWluX0F1dG9MZXZlbCIpOworICAgIEdFVF9TWU0oa1ZUUHJvZmlsZUxldmVsX0hFVkNfTWFpbjEwX0F1dG9MZXZlbCwgICAiSEVWQ19NYWluMTBfQXV0b0xldmVsIik7CisKKyAgICBHRVRfU1lNKGtWVENvbXByZXNzaW9uUHJvcGVydHlLZXlfUmVhbFRpbWUsICJSZWFsVGltZSIpOworCisgICAgR0VUX1NZTShrVlRWaWRlb0VuY29kZXJTcGVjaWZpY2F0aW9uX0VuYWJsZUhhcmR3YXJlQWNjZWxlcmF0ZWRWaWRlb0VuY29kZXIsCisgICAgICAgICAgICAiRW5hYmxlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRW5jb2RlciIpOworICAgIEdFVF9TWU0oa1ZUVmlkZW9FbmNvZGVyU3BlY2lmaWNhdGlvbl9SZXF1aXJlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRW5jb2RlciwKKyAgICAgICAgICAgICJSZXF1aXJlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRW5jb2RlciIpOworfQorCit0eXBlZGVmIGVudW0gVlRfSDI2NFByb2ZpbGUgeworICAgIEgyNjRfUFJPRl9BVVRPLAorICAgIEgyNjRfUFJPRl9CQVNFTElORSwKKyAgICBIMjY0X1BST0ZfTUFJTiwKKyAgICBIMjY0X1BST0ZfSElHSCwKKyAgICBIMjY0X1BST0ZfQ09VTlQKK30gVlRfSDI2NFByb2ZpbGU7CisKK3R5cGVkZWYgZW51bSBWVEgyNjRFbnRyb3B5eworICAgIFZUX0VOVFJPUFlfTk9UX1NFVCwKKyAgICBWVF9DQVZMQywKKyAgICBWVF9DQUJBQworfSBWVEgyNjRFbnRyb3B5OworCit0eXBlZGVmIGVudW0gVlRfSEVWQ1Byb2ZpbGUgeworICAgIEhFVkNfUFJPRl9BVVRPLAorICAgIEhFVkNfUFJPRl9NQUlOLAorICAgIEhFVkNfUFJPRl9NQUlOMTAsCisgICAgSEVWQ19QUk9GX0NPVU5UCit9IFZUX0hFVkNQcm9maWxlOworCitzdGF0aWMgY29uc3QgdWludDhfdCBzdGFydF9jb2RlW10gPSB7IDAsIDAsIDAsIDEgfTsKKwordHlwZWRlZiBzdHJ1Y3QgRXh0cmFTRUkgeworICB2b2lkICpkYXRhOworICBzaXplX3Qgc2l6ZTsKK30gRXh0cmFTRUk7CisKK3R5cGVkZWYgc3RydWN0IEJ1Zk5vZGUgeworICAgIENNU2FtcGxlQnVmZmVyUmVmIGNtX2J1ZmZlcjsKKyAgICBFeHRyYVNFSSAqc2VpOworICAgIHN0cnVjdCBCdWZOb2RlKiBuZXh0OworICAgIGludCBlcnJvcjsKK30gQnVmTm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgVlRFbmNDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZDsKKyAgICBWVENvbXByZXNzaW9uU2Vzc2lvblJlZiBzZXNzaW9uOworICAgIENGU3RyaW5nUmVmIHljYmNyX21hdHJpeDsKKyAgICBDRlN0cmluZ1JlZiBjb2xvcl9wcmltYXJpZXM7CisgICAgQ0ZTdHJpbmdSZWYgdHJhbnNmZXJfZnVuY3Rpb247CisgICAgZ2V0UGFyYW1ldGVyU2V0QXRJbmRleCBnZXRfcGFyYW1fc2V0X2Z1bmM7CisKKyAgICBwdGhyZWFkX211dGV4X3QgbG9jazsKKyAgICBwdGhyZWFkX2NvbmRfdCAgY3Zfc2FtcGxlX3NlbnQ7CisKKyAgICBpbnQgYXN5bmNfZXJyb3I7CisKKyAgICBCdWZOb2RlICpxX2hlYWQ7CisgICAgQnVmTm9kZSAqcV90YWlsOworCisgICAgaW50NjRfdCBmcmFtZV9jdF9vdXQ7CisgICAgaW50NjRfdCBmcmFtZV9jdF9pbjsKKworICAgIGludDY0X3QgZmlyc3RfcHRzOworICAgIGludDY0X3QgZHRzX2RlbHRhOworCisgICAgaW50NjRfdCBwcm9maWxlOworICAgIGludDY0X3QgbGV2ZWw7CisgICAgaW50NjRfdCBlbnRyb3B5OworICAgIGludDY0X3QgcmVhbHRpbWU7CisgICAgaW50NjRfdCBmcmFtZXNfYmVmb3JlOworICAgIGludDY0X3QgZnJhbWVzX2FmdGVyOworCisgICAgaW50NjRfdCBhbGxvd19zdzsKKworICAgIGJvb2wgZmx1c2hpbmc7CisgICAgYm9vbCBoYXNfYl9mcmFtZXM7CisgICAgYm9vbCB3YXJuZWRfY29sb3JfcmFuZ2U7CisgICAgYm9vbCBhNTNfY2M7Cit9IFZURW5jQ29udGV4dDsKKworc3RhdGljIGludCB2dGVuY19wb3B1bGF0ZV9leHRyYWRhdGEoQVZDb2RlY0NvbnRleHQgICAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTVZpZGVvQ29kZWNUeXBlIGNvZGVjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiAgICAgIHByb2ZpbGVfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRk51bWJlclJlZiAgICAgIGdhbW1hX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmICBlbmNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZiAgcGl4ZWxfYnVmZmVyX2luZm8pOworCisvKioKKyAqIE5VTEwtc2FmZSByZWxlYXNlIG9mICpyZWZQdHIsIGFuZCBzZXRzIHZhbHVlIHRvIE5VTEwuCisgKi8KK3N0YXRpYyB2b2lkIHZ0X3JlbGVhc2VfbnVtKENGTnVtYmVyUmVmKiByZWZQdHIpeworICAgIGlmICghKnJlZlB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0ZSZWxlYXNlKCpyZWZQdHIpOworICAgICpyZWZQdHIgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzZXRfYXN5bmNfZXJyb3IoVlRFbmNDb250ZXh0ICp2dGN0eCwgaW50IGVycikKK3sKKyAgICBCdWZOb2RlICppbmZvOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ2dGN0eC0+bG9jayk7CisKKyAgICB2dGN0eC0+YXN5bmNfZXJyb3IgPSBlcnI7CisKKyAgICBpbmZvID0gdnRjdHgtPnFfaGVhZDsKKyAgICB2dGN0eC0+cV9oZWFkID0gdnRjdHgtPnFfdGFpbCA9IE5VTEw7CisKKyAgICB3aGlsZSAoaW5mbykgeworICAgICAgICBCdWZOb2RlICpuZXh0ID0gaW5mby0+bmV4dDsKKyAgICAgICAgQ0ZSZWxlYXNlKGluZm8tPmNtX2J1ZmZlcik7CisgICAgICAgIGF2X2ZyZWUoaW5mbyk7CisgICAgICAgIGluZm8gPSBuZXh0OworICAgIH0KKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2dGN0eC0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2ZyYW1lX3F1ZXVlKFZURW5jQ29udGV4dCAqdnRjdHgpCit7CisgICAgc2V0X2FzeW5jX2Vycm9yKHZ0Y3R4LCAwKTsKK30KKworc3RhdGljIGludCB2dGVuY19xX3BvcChWVEVuY0NvbnRleHQgKnZ0Y3R4LCBib29sIHdhaXQsIENNU2FtcGxlQnVmZmVyUmVmICpidWYsIEV4dHJhU0VJICoqc2VpKQoreworICAgIEJ1Zk5vZGUgKmluZm87CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnZ0Y3R4LT5sb2NrKTsKKworICAgIGlmICh2dGN0eC0+YXN5bmNfZXJyb3IpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnZ0Y3R4LT5sb2NrKTsKKyAgICAgICAgcmV0dXJuIHZ0Y3R4LT5hc3luY19lcnJvcjsKKyAgICB9CisKKyAgICBpZiAodnRjdHgtPmZsdXNoaW5nICYmIHZ0Y3R4LT5mcmFtZV9jdF9pbiA9PSB2dGN0eC0+ZnJhbWVfY3Rfb3V0KSB7CisgICAgICAgICpidWYgPSBOVUxMOworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2dGN0eC0+bG9jayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHdoaWxlICghdnRjdHgtPnFfaGVhZCAmJiAhdnRjdHgtPmFzeW5jX2Vycm9yICYmIHdhaXQpIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnZ0Y3R4LT5jdl9zYW1wbGVfc2VudCwgJnZ0Y3R4LT5sb2NrKTsKKyAgICB9CisKKyAgICBpZiAoIXZ0Y3R4LT5xX2hlYWQpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnZ0Y3R4LT5sb2NrKTsKKyAgICAgICAgKmJ1ZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGluZm8gPSB2dGN0eC0+cV9oZWFkOworICAgIHZ0Y3R4LT5xX2hlYWQgPSB2dGN0eC0+cV9oZWFkLT5uZXh0OworICAgIGlmICghdnRjdHgtPnFfaGVhZCkgeworICAgICAgICB2dGN0eC0+cV90YWlsID0gTlVMTDsKKyAgICB9CisKKyAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdnRjdHgtPmxvY2spOworCisgICAgKmJ1ZiA9IGluZm8tPmNtX2J1ZmZlcjsKKyAgICBpZiAoc2VpICYmICpidWYpIHsKKyAgICAgICAgKnNlaSA9IGluZm8tPnNlaTsKKyAgICB9IGVsc2UgaWYgKGluZm8tPnNlaSkgeworICAgICAgICBpZiAoaW5mby0+c2VpLT5kYXRhKSBhdl9mcmVlKGluZm8tPnNlaS0+ZGF0YSk7CisgICAgICAgIGF2X2ZyZWUoaW5mby0+c2VpKTsKKyAgICB9CisgICAgYXZfZnJlZShpbmZvKTsKKworICAgIHZ0Y3R4LT5mcmFtZV9jdF9vdXQrKzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2dGVuY19xX3B1c2goVlRFbmNDb250ZXh0ICp2dGN0eCwgQ01TYW1wbGVCdWZmZXJSZWYgYnVmZmVyLCBFeHRyYVNFSSAqc2VpKQoreworICAgIEJ1Zk5vZGUgKmluZm8gPSBhdl9tYWxsb2Moc2l6ZW9mKEJ1Zk5vZGUpKTsKKyAgICBpZiAoIWluZm8pIHsKKyAgICAgICAgc2V0X2FzeW5jX2Vycm9yKHZ0Y3R4LCBBVkVSUk9SKEVOT01FTSkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0ZSZXRhaW4oYnVmZmVyKTsKKyAgICBpbmZvLT5jbV9idWZmZXIgPSBidWZmZXI7CisgICAgaW5mby0+c2VpID0gc2VpOworICAgIGluZm8tPm5leHQgPSBOVUxMOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ2dGN0eC0+bG9jayk7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmdnRjdHgtPmN2X3NhbXBsZV9zZW50KTsKKworICAgIGlmICghdnRjdHgtPnFfaGVhZCkgeworICAgICAgICB2dGN0eC0+cV9oZWFkID0gaW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICB2dGN0eC0+cV90YWlsLT5uZXh0ID0gaW5mbzsKKyAgICB9CisKKyAgICB2dGN0eC0+cV90YWlsID0gaW5mbzsKKworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ2dGN0eC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQgY291bnRfbmFsdXMoc2l6ZV90IGxlbmd0aF9jb2RlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIENNU2FtcGxlQnVmZmVyUmVmIHNhbXBsZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqY291bnQpCit7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgaW50IHN0YXR1czsKKyAgICBpbnQgbmFsdV9jdCA9IDA7CisgICAgdWludDhfdCBzaXplX2J1Zls0XTsKKyAgICBzaXplX3Qgc3JjX3NpemUgPSBDTVNhbXBsZUJ1ZmZlckdldFRvdGFsU2FtcGxlU2l6ZShzYW1wbGVfYnVmZmVyKTsKKyAgICBDTUJsb2NrQnVmZmVyUmVmIGJsb2NrID0gQ01TYW1wbGVCdWZmZXJHZXREYXRhQnVmZmVyKHNhbXBsZV9idWZmZXIpOworCisgICAgaWYgKGxlbmd0aF9jb2RlX3NpemUgPiA0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHdoaWxlIChvZmZzZXQgPCBzcmNfc2l6ZSkgeworICAgICAgICBzaXplX3QgY3Vycl9zcmNfbGVuOworICAgICAgICBzaXplX3QgYm94X2xlbiA9IDA7CisgICAgICAgIHNpemVfdCBpOworCisgICAgICAgIHN0YXR1cyA9IENNQmxvY2tCdWZmZXJDb3B5RGF0YUJ5dGVzKGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF9jb2RlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfYnVmKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoX2NvZGVfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBib3hfbGVuIDw8PSA4OworICAgICAgICAgICAgYm94X2xlbiB8PSBzaXplX2J1ZltpXTsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJfc3JjX2xlbiA9IGJveF9sZW4gKyBsZW5ndGhfY29kZV9zaXplOworICAgICAgICBvZmZzZXQgKz0gY3Vycl9zcmNfbGVuOworCisgICAgICAgIG5hbHVfY3QrKzsKKyAgICB9CisKKyAgICAqY291bnQgPSBuYWx1X2N0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgQ01WaWRlb0NvZGVjVHlwZSBnZXRfY21fY29kZWNfdHlwZShlbnVtIEFWQ29kZWNJRCBpZCkKK3sKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OiByZXR1cm4ga0NNVmlkZW9Db2RlY1R5cGVfSDI2NDsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6IHJldHVybiBrQ01WaWRlb0NvZGVjVHlwZV9IRVZDOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKioKKyAqIEdldCB0aGUgcGFyYW1ldGVyIHNldHMgZnJvbSBhIENNU2FtcGxlQnVmZmVyUmVmLgorICogQHBhcmFtIGRzdCBJZiAqZHN0IGlzbid0IE5VTEwsIHRoZSBwYXJhbWV0ZXJzIGFyZSBjb3BpZWQgaW50byBleGlzdGluZworICogICAgICAgICAgICBtZW1vcnkuICpkc3Rfc2l6ZSBtdXN0IGJlIHNldCBhY2NvcmRpbmdseSB3aGVuICpkc3QgIT0gTlVMTC4KKyAqICAgICAgICAgICAgSWYgKmRzdCBpcyBOVUxMLCBpdCB3aWxsIGJlIGFsbG9jYXRlZC4KKyAqICAgICAgICAgICAgSW4gYWxsIGNhc2VzLCAqZHN0X3NpemUgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBzdGFydGluZworICogICAgICAgICAgICBhdCAqZHN0LgorICovCitzdGF0aWMgaW50IGdldF9wYXJhbXNfc2l6ZSgKKyAgICBBVkNvZGVjQ29udGV4dCAgICAgICAgICAgICAgKmF2Y3R4LAorICAgIENNVmlkZW9Gb3JtYXREZXNjcmlwdGlvblJlZiB2aWRfZm10LAorICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAqc2l6ZSkKK3sKKyAgICBWVEVuY0NvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisgICAgc2l6ZV90IHBzX2NvdW50OworICAgIGludCBpc19jb3VudF9iYWQgPSAwOworICAgIHNpemVfdCBpOworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gdnRjdHgtPmdldF9wYXJhbV9zZXRfZnVuYyh2aWRfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpc19jb3VudF9iYWQgPSAxOworICAgICAgICBwc19jb3VudCAgICAgPSAwOworICAgICAgICBzdGF0dXMgICAgICAgPSAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBwc19jb3VudCB8fCBpc19jb3VudF9iYWQ7IGkrKykgeworICAgICAgICBjb25zdCB1aW50OF90ICpwczsKKyAgICAgICAgc2l6ZV90IHBzX3NpemU7CisgICAgICAgIHN0YXR1cyA9IHZ0Y3R4LT5nZXRfcGFyYW1fc2V0X2Z1bmModmlkX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogV2hlbiBwc19jb3VudCBpcyBpbnZhbGlkLCBzdGF0dXMgIT0gMCBlbmRzIHRoZSBsb29wIG5vcm1hbGx5CisgICAgICAgICAgICAgKiB1bmxlc3Mgd2UgZGlkbid0IGdldCBhbnkgcGFyYW1ldGVyIHNldHMuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChpID4gMCAmJiBpc19jb3VudF9iYWQpIHN0YXR1cyA9IDA7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdG90YWxfc2l6ZSArPSBwc19zaXplICsgc2l6ZW9mKHN0YXJ0X2NvZGUpOworICAgIH0KKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBnZXR0aW5nIHBhcmFtZXRlciBzZXQgc2l6ZXM6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IHRvdGFsX3NpemU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29weV9wYXJhbV9zZXRzKAorICAgIEFWQ29kZWNDb250ZXh0ICAgICAgICAgICAgICAqYXZjdHgsCisgICAgQ01WaWRlb0Zvcm1hdERlc2NyaXB0aW9uUmVmIHZpZF9mbXQsCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgICpkc3QsCisgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgIGRzdF9zaXplKQoreworICAgIFZURW5jQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHNpemVfdCBwc19jb3VudDsKKyAgICBpbnQgaXNfY291bnRfYmFkID0gMDsKKyAgICBpbnQgc3RhdHVzOworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIHNpemVfdCBpOworCisgICAgc3RhdHVzID0gdnRjdHgtPmdldF9wYXJhbV9zZXRfZnVuYyh2aWRfZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpc19jb3VudF9iYWQgPSAxOworICAgICAgICBwc19jb3VudCAgICAgPSAwOworICAgICAgICBzdGF0dXMgICAgICAgPSAwOworICAgIH0KKworCisgICAgZm9yIChpID0gMDsgaSA8IHBzX2NvdW50IHx8IGlzX2NvdW50X2JhZDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBzOworICAgICAgICBzaXplX3QgcHNfc2l6ZTsKKyAgICAgICAgc2l6ZV90IG5leHRfb2Zmc2V0OworCisgICAgICAgIHN0YXR1cyA9IHZ0Y3R4LT5nZXRfcGFyYW1fc2V0X2Z1bmModmlkX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoaSA+IDAgJiYgaXNfY291bnRfYmFkKSBzdGF0dXMgPSAwOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG5leHRfb2Zmc2V0ID0gb2Zmc2V0ICsgc2l6ZW9mKHN0YXJ0X2NvZGUpICsgcHNfc2l6ZTsKKyAgICAgICAgaWYgKGRzdF9zaXplIDwgbmV4dF9vZmZzZXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3I6IGJ1ZmZlciB0b28gc21hbGwgZm9yIHBhcmFtZXRlciBzZXRzLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KGRzdCArIG9mZnNldCwgc3RhcnRfY29kZSwgc2l6ZW9mKHN0YXJ0X2NvZGUpKTsKKyAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihzdGFydF9jb2RlKTsKKworICAgICAgICBtZW1jcHkoZHN0ICsgb2Zmc2V0LCBwcywgcHNfc2l6ZSk7CisgICAgICAgIG9mZnNldCA9IG5leHRfb2Zmc2V0OworICAgIH0KKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBnZXR0aW5nIHBhcmFtZXRlciBzZXQgZGF0YTogJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNldF9leHRyYWRhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBDTVNhbXBsZUJ1ZmZlclJlZiBzYW1wbGVfYnVmZmVyKQoreworICAgIENNVmlkZW9Gb3JtYXREZXNjcmlwdGlvblJlZiB2aWRfZm10OworICAgIHNpemVfdCB0b3RhbF9zaXplOworICAgIGludCBzdGF0dXM7CisKKyAgICB2aWRfZm10ID0gQ01TYW1wbGVCdWZmZXJHZXRGb3JtYXREZXNjcmlwdGlvbihzYW1wbGVfYnVmZmVyKTsKKyAgICBpZiAoIXZpZF9mbXQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyB2aWRlbyBmb3JtYXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgc3RhdHVzID0gZ2V0X3BhcmFtc19zaXplKGF2Y3R4LCB2aWRfZm10LCAmdG90YWxfc2l6ZSk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgcGFyYW1ldGVyIHNldHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBhdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeih0b3RhbF9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFhdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHRvdGFsX3NpemU7CisKKyAgICBzdGF0dXMgPSBjb3B5X3BhcmFtX3NldHMoYXZjdHgsIHZpZF9mbXQsIGF2Y3R4LT5leHRyYWRhdGEsIHRvdGFsX3NpemUpOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjb3B5IHBhcmFtIHNldHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnRlbmNfb3V0cHV0X2NhbGxiYWNrKAorICAgIHZvaWQgKmN0eCwKKyAgICB2b2lkICpzb3VyY2VGcmFtZUN0eCwKKyAgICBPU1N0YXR1cyBzdGF0dXMsCisgICAgVlRFbmNvZGVJbmZvRmxhZ3MgZmxhZ3MsCisgICAgQ01TYW1wbGVCdWZmZXJSZWYgc2FtcGxlX2J1ZmZlcikKK3sKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBjdHg7CisgICAgVlRFbmNDb250ZXh0ICAgKnZ0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBFeHRyYVNFSSAqc2VpID0gc291cmNlRnJhbWVDdHg7CisKKyAgICBpZiAodnRjdHgtPmFzeW5jX2Vycm9yKSB7CisgICAgICAgIGlmKHNhbXBsZV9idWZmZXIpIENGUmVsZWFzZShzYW1wbGVfYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChzdGF0dXMgfHwgIXNhbXBsZV9idWZmZXIpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBlbmNvZGluZyBmcmFtZTogJWRcbiIsIChpbnQpc3RhdHVzKTsKKyAgICAgICAgc2V0X2FzeW5jX2Vycm9yKHZ0Y3R4LCBBVkVSUk9SX0VYVEVSTkFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghYXZjdHgtPmV4dHJhZGF0YSAmJiAoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSkgeworICAgICAgICBpbnQgc2V0X3N0YXR1cyA9IHNldF9leHRyYWRhdGEoYXZjdHgsIHNhbXBsZV9idWZmZXIpOworICAgICAgICBpZiAoc2V0X3N0YXR1cykgeworICAgICAgICAgICAgc2V0X2FzeW5jX2Vycm9yKHZ0Y3R4LCBzZXRfc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZ0ZW5jX3FfcHVzaCh2dGN0eCwgc2FtcGxlX2J1ZmZlciwgc2VpKTsKK30KKworc3RhdGljIGludCBnZXRfbGVuZ3RoX2NvZGVfc2l6ZSgKKyAgICBBVkNvZGVjQ29udGV4dCAgICAqYXZjdHgsCisgICAgQ01TYW1wbGVCdWZmZXJSZWYgc2FtcGxlX2J1ZmZlciwKKyAgICBzaXplX3QgICAgICAgICAgICAqc2l6ZSkKK3sKKyAgICBWVEVuY0NvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBDTVZpZGVvRm9ybWF0RGVzY3JpcHRpb25SZWYgdmlkX2ZtdDsKKyAgICBpbnQgaXNpemU7CisgICAgaW50IHN0YXR1czsKKworICAgIHZpZF9mbXQgPSBDTVNhbXBsZUJ1ZmZlckdldEZvcm1hdERlc2NyaXB0aW9uKHNhbXBsZV9idWZmZXIpOworICAgIGlmICghdmlkX2ZtdCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGdldHRpbmcgYnVmZmVyIGZvcm1hdCBkZXNjcmlwdGlvbi5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB2dGN0eC0+Z2V0X3BhcmFtX3NldF9mdW5jKHZpZF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzaXplKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZ2V0dGluZyBsZW5ndGggY29kZSBzaXplOiAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgKnNpemUgPSBpc2l6ZTsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICoKKyAqIElmIHByb2ZpbGVfbGV2ZWxfdmFsIGlzIE5VTEwgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgZG9uJ3Qgc3BlY2lmeSB0aGUKKyAqIHByb2ZpbGUvbGV2ZWwgdG8gdGhlIGVuY29kZXIuCisgKi8KK3N0YXRpYyBib29sIGdldF92dF9oMjY0X3Byb2ZpbGVfbGV2ZWwoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiAgICAqcHJvZmlsZV9sZXZlbF92YWwpCit7CisgICAgVlRFbmNDb250ZXh0ICp2dGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwcm9maWxlID0gdnRjdHgtPnByb2ZpbGU7CisKKyAgICBpZiAocHJvZmlsZSA9PSBIMjY0X1BST0ZfQVVUTyAmJiB2dGN0eC0+bGV2ZWwpIHsKKyAgICAgICAgLy9OZWVkIHRvIHBpY2sgYSBwcm9maWxlIGlmIGxldmVsIGlzIG5vdCBhdXRvLXNlbGVjdGVkLgorICAgICAgICBwcm9maWxlID0gdnRjdHgtPmhhc19iX2ZyYW1lcyA/IEgyNjRfUFJPRl9NQUlOIDogSDI2NF9QUk9GX0JBU0VMSU5FOworICAgIH0KKworICAgICpwcm9maWxlX2xldmVsX3ZhbCA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBIMjY0X1BST0ZfQVVUTzoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGNhc2UgSDI2NF9QUk9GX0JBU0VMSU5FOgorICAgICAgICAgICAgc3dpdGNoICh2dGN0eC0+bGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlICAwOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lX0F1dG9MZXZlbDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxMzogKnByb2ZpbGVfbGV2ZWxfdmFsID0ga1ZUUHJvZmlsZUxldmVsX0gyNjRfQmFzZWxpbmVfMV8zOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMwOiAqcHJvZmlsZV9sZXZlbF92YWwgPSBrVlRQcm9maWxlTGV2ZWxfSDI2NF9CYXNlbGluZV8zXzA7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzE6ICpwcm9maWxlX2xldmVsX3ZhbCA9IGtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lXzNfMTsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzMjogKnByb2ZpbGVfbGV2ZWxfdmFsID0ga1ZUUHJvZmlsZUxldmVsX0gyNjRfQmFzZWxpbmVfM18yOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQwOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lXzRfMDsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0MTogKnByb2ZpbGVfbGV2ZWxfdmFsID0ga1ZUUHJvZmlsZUxldmVsX0gyNjRfQmFzZWxpbmVfNF8xOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQyOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lXzRfMjsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1MDogKnByb2ZpbGVfbGV2ZWxfdmFsID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRfa2V5cy5rVlRQcm9maWxlTGV2ZWxfSDI2NF9CYXNlbGluZV81XzA7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTE6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfQmFzZWxpbmVfNV8xOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUyOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X0Jhc2VsaW5lXzVfMjsgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEgyNjRfUFJPRl9NQUlOOgorICAgICAgICAgICAgc3dpdGNoICh2dGN0eC0+bGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBjYXNlICAwOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fQXV0b0xldmVsOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMwOiAqcHJvZmlsZV9sZXZlbF92YWwgPSBrVlRQcm9maWxlTGV2ZWxfSDI2NF9NYWluXzNfMDsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzMTogKnByb2ZpbGVfbGV2ZWxfdmFsID0ga1ZUUHJvZmlsZUxldmVsX0gyNjRfTWFpbl8zXzE7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzI6ICpwcm9maWxlX2xldmVsX3ZhbCA9IGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fM18yOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQwOiAqcHJvZmlsZV9sZXZlbF92YWwgPSBrVlRQcm9maWxlTGV2ZWxfSDI2NF9NYWluXzRfMDsgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0MTogKnByb2ZpbGVfbGV2ZWxfdmFsID0ga1ZUUHJvZmlsZUxldmVsX0gyNjRfTWFpbl80XzE7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDI6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfTWFpbl80XzI7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTA6ICpwcm9maWxlX2xldmVsX3ZhbCA9IGtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNV8wOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUxOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNV8xOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUyOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X01haW5fNV8yOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSDI2NF9QUk9GX0hJR0g6CisgICAgICAgICAgICBzd2l0Y2ggKHZ0Y3R4LT5sZXZlbCkgeworICAgICAgICAgICAgICAgIGNhc2UgIDA6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfSGlnaF9BdXRvTGV2ZWw7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzA6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfSGlnaF8zXzA7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzE6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfSGlnaF8zXzE7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzI6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfSGlnaF8zXzI7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDA6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfSGlnaF80XzA7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDE6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfSGlnaF80XzE7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDI6ICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0gyNjRfSGlnaF80XzI7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTA6ICpwcm9maWxlX2xldmVsX3ZhbCA9IGtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNV8wOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUxOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNV8xOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUyOiAqcHJvZmlsZV9sZXZlbF92YWwgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVFByb2ZpbGVMZXZlbF9IMjY0X0hpZ2hfNV8yOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghKnByb2ZpbGVfbGV2ZWxfdmFsKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBQcm9maWxlL0xldmVsLlxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICoKKyAqIElmIHByb2ZpbGVfbGV2ZWxfdmFsIGlzIE5VTEwgYW5kIHRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwgZG9uJ3Qgc3BlY2lmeSB0aGUKKyAqIHByb2ZpbGUvbGV2ZWwgdG8gdGhlIGVuY29kZXIuCisgKi8KK3N0YXRpYyBib29sIGdldF92dF9oZXZjX3Byb2ZpbGVfbGV2ZWwoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiAgICAqcHJvZmlsZV9sZXZlbF92YWwpCit7CisgICAgVlRFbmNDb250ZXh0ICp2dGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwcm9maWxlID0gdnRjdHgtPnByb2ZpbGU7CisKKyAgICAqcHJvZmlsZV9sZXZlbF92YWwgPSBOVUxMOworCisgICAgc3dpdGNoIChwcm9maWxlKSB7CisgICAgICAgIGNhc2UgSEVWQ19QUk9GX0FVVE86CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBIRVZDX1BST0ZfTUFJTjoKKyAgICAgICAgICAgICpwcm9maWxlX2xldmVsX3ZhbCA9CisgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUUHJvZmlsZUxldmVsX0hFVkNfTWFpbl9BdXRvTGV2ZWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBIRVZDX1BST0ZfTUFJTjEwOgorICAgICAgICAgICAgKnByb2ZpbGVfbGV2ZWxfdmFsID0KKyAgICAgICAgICAgICAgICBjb21wYXRfa2V5cy5rVlRQcm9maWxlTGV2ZWxfSEVWQ19NYWluMTBfQXV0b0xldmVsOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCEqcHJvZmlsZV9sZXZlbF92YWwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFByb2ZpbGUvTGV2ZWwuXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IGdldF9jdl9waXhlbF9mb3JtYXQoQVZDb2RlY0NvbnRleHQqIGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkNvbG9yUmFuZ2UgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBhdl9waXhlbF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiByYW5nZV9ndWVzc2VkKQoreworICAgIGlmIChyYW5nZV9ndWVzc2VkKSAqcmFuZ2VfZ3Vlc3NlZCA9IHJhbmdlICE9IEFWQ09MX1JBTkdFX01QRUcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZSAhPSBBVkNPTF9SQU5HRV9KUEVHOworCisgICAgLy9NUEVHIHJhbmdlIGlzIHVzZWQgd2hlbiBubyByYW5nZSBpcyBzZXQKKyAgICBpZiAoZm10ID09IEFWX1BJWF9GTVRfTlYxMikgeworICAgICAgICAqYXZfcGl4ZWxfZm9ybWF0ID0gcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMFlwQ2JDcjhCaVBsYW5hckZ1bGxSYW5nZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMFlwQ2JDcjhCaVBsYW5hclZpZGVvUmFuZ2U7CisgICAgfSBlbHNlIGlmIChmbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSB7CisgICAgICAgICphdl9waXhlbF9mb3JtYXQgPSByYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIwWXBDYkNyOFBsYW5hckZ1bGxSYW5nZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NWUGl4ZWxGb3JtYXRUeXBlXzQyMFlwQ2JDcjhQbGFuYXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWRkX2NvbG9yX2F0dHIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGRpY3QpIHsKKyAgICBWVEVuY0NvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmICh2dGN0eC0+Y29sb3JfcHJpbWFyaWVzKSB7CisgICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGRpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDVkltYWdlQnVmZmVyQ29sb3JQcmltYXJpZXNLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0Y3R4LT5jb2xvcl9wcmltYXJpZXMpOworICAgIH0KKworICAgIGlmICh2dGN0eC0+dHJhbnNmZXJfZnVuY3Rpb24pIHsKKyAgICAgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUoZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NWSW1hZ2VCdWZmZXJUcmFuc2ZlckZ1bmN0aW9uS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dGN0eC0+dHJhbnNmZXJfZnVuY3Rpb24pOworICAgIH0KKworICAgIGlmICh2dGN0eC0+eWNiY3JfbWF0cml4KSB7CisgICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGRpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDVkltYWdlQnVmZmVyWUNiQ3JNYXRyaXhLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZ0Y3R4LT55Y2Jjcl9tYXRyaXgpOworICAgIH0KK30KKworc3RhdGljIGludCBjcmVhdGVfY3ZfcGl4ZWxfYnVmZmVyX2luZm8oQVZDb2RlY0NvbnRleHQqIGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiogZGljdCkKK3sKKyAgICBDRk51bWJlclJlZiBjdl9jb2xvcl9mb3JtYXRfbnVtID0gTlVMTDsKKyAgICBDRk51bWJlclJlZiB3aWR0aF9udW0gPSBOVUxMOworICAgIENGTnVtYmVyUmVmIGhlaWdodF9udW0gPSBOVUxMOworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgcGl4ZWxfYnVmZmVyX2luZm8gPSBOVUxMOworICAgIGludCBjdl9jb2xvcl9mb3JtYXQ7CisgICAgaW50IHN0YXR1cyA9IGdldF9jdl9waXhlbF9mb3JtYXQoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvbG9yX3JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdl9jb2xvcl9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKHN0YXR1cykgcmV0dXJuIHN0YXR1czsKKworICAgIHBpeGVsX2J1ZmZlcl9pbmZvID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZDb3B5U3RyaW5nRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7CisKKyAgICBpZiAoIXBpeGVsX2J1ZmZlcl9pbmZvKSBnb3RvIHBiaW5mb19ub21lbTsKKworICAgIGN2X2NvbG9yX2Zvcm1hdF9udW0gPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZOdW1iZXJTSW50MzJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3ZfY29sb3JfZm9ybWF0KTsKKyAgICBpZiAoIWN2X2NvbG9yX2Zvcm1hdF9udW0pIGdvdG8gcGJpbmZvX25vbWVtOworCisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUocGl4ZWxfYnVmZmVyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAga0NWUGl4ZWxCdWZmZXJQaXhlbEZvcm1hdFR5cGVLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgY3ZfY29sb3JfZm9ybWF0X251bSk7CisgICAgdnRfcmVsZWFzZV9udW0oJmN2X2NvbG9yX2Zvcm1hdF9udW0pOworCisgICAgd2lkdGhfbnVtID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZOdW1iZXJTSW50MzJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdmN0eC0+d2lkdGgpOworICAgIGlmICghd2lkdGhfbnVtKSByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUocGl4ZWxfYnVmZmVyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAga0NWUGl4ZWxCdWZmZXJXaWR0aEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aF9udW0pOworICAgIHZ0X3JlbGVhc2VfbnVtKCZ3aWR0aF9udW0pOworCisgICAgaGVpZ2h0X251bSA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRk51bWJlclNJbnQzMlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdmN0eC0+aGVpZ2h0KTsKKyAgICBpZiAoIWhlaWdodF9udW0pIGdvdG8gcGJpbmZvX25vbWVtOworCisgICAgQ0ZEaWN0aW9uYXJ5U2V0VmFsdWUocGl4ZWxfYnVmZmVyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAga0NWUGl4ZWxCdWZmZXJIZWlnaHRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0X251bSk7CisgICAgdnRfcmVsZWFzZV9udW0oJmhlaWdodF9udW0pOworCisgICAgYWRkX2NvbG9yX2F0dHIoYXZjdHgsIHBpeGVsX2J1ZmZlcl9pbmZvKTsKKworICAgICpkaWN0ID0gcGl4ZWxfYnVmZmVyX2luZm87CisgICAgcmV0dXJuIDA7CisKK3BiaW5mb19ub21lbToKKyAgICB2dF9yZWxlYXNlX251bSgmY3ZfY29sb3JfZm9ybWF0X251bSk7CisgICAgdnRfcmVsZWFzZV9udW0oJndpZHRoX251bSk7CisgICAgdnRfcmVsZWFzZV9udW0oJmhlaWdodF9udW0pOworICAgIGlmIChwaXhlbF9idWZmZXJfaW5mbykgQ0ZSZWxlYXNlKHBpeGVsX2J1ZmZlcl9pbmZvKTsKKworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2N2X2NvbG9yX3ByaW1hcmllcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgKnByaW1hcmllcykKK3sKKyAgICBlbnVtIEFWQ29sb3JQcmltYXJpZXMgcHJpID0gYXZjdHgtPmNvbG9yX3ByaW1hcmllczsKKyAgICBzd2l0Y2ggKHByaSkgeworICAgICAgICBjYXNlIEFWQ09MX1BSSV9VTlNQRUNJRklFRDoKKyAgICAgICAgICAgICpwcmltYXJpZXMgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVkNPTF9QUklfQlQ3MDk6CisgICAgICAgICAgICAqcHJpbWFyaWVzID0ga0NWSW1hZ2VCdWZmZXJDb2xvclByaW1hcmllc19JVFVfUl83MDlfMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDT0xfUFJJX0JUMjAyMDoKKyAgICAgICAgICAgICpwcmltYXJpZXMgPSBjb21wYXRfa2V5cy5rQ1ZJbWFnZUJ1ZmZlckNvbG9yUHJpbWFyaWVzX0lUVV9SXzIwMjA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb2xvciBwcmltYXJpZXMgJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGF2X2NvbG9yX3ByaW1hcmllc19uYW1lKHByaSkpOworICAgICAgICAgICAgKnByaW1hcmllcyA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2N2X3RyYW5zZmVyX2Z1bmN0aW9uKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmICp0cmFuc2Zlcl9mbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRk51bWJlclJlZiAqZ2FtbWFfbGV2ZWwpCit7CisgICAgZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyB0cmMgPSBhdmN0eC0+Y29sb3JfdHJjOworICAgIEZsb2F0MzIgZ2FtbWE7CisgICAgKmdhbW1hX2xldmVsID0gTlVMTDsKKworICAgIHN3aXRjaCAodHJjKSB7CisgICAgICAgIGNhc2UgQVZDT0xfVFJDX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgKnRyYW5zZmVyX2ZuYyA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFWQ09MX1RSQ19CVDcwOToKKyAgICAgICAgICAgICp0cmFuc2Zlcl9mbmMgPSBrQ1ZJbWFnZUJ1ZmZlclRyYW5zZmVyRnVuY3Rpb25fSVRVX1JfNzA5XzI7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFWQ09MX1RSQ19TTVBURTI0ME06CisgICAgICAgICAgICAqdHJhbnNmZXJfZm5jID0ga0NWSW1hZ2VCdWZmZXJUcmFuc2ZlckZ1bmN0aW9uX1NNUFRFXzI0ME1fMTk5NTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDT0xfVFJDX0dBTU1BMjI6CisgICAgICAgICAgICBnYW1tYSA9IDIuMjsKKyAgICAgICAgICAgICp0cmFuc2Zlcl9mbmMgPSBrQ1ZJbWFnZUJ1ZmZlclRyYW5zZmVyRnVuY3Rpb25fVXNlR2FtbWE7CisgICAgICAgICAgICAqZ2FtbWFfbGV2ZWwgPSBDRk51bWJlckNyZWF0ZShOVUxMLCBrQ0ZOdW1iZXJGbG9hdDMyVHlwZSwgJmdhbW1hKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDT0xfVFJDX0dBTU1BMjg6CisgICAgICAgICAgICBnYW1tYSA9IDIuODsKKyAgICAgICAgICAgICp0cmFuc2Zlcl9mbmMgPSBrQ1ZJbWFnZUJ1ZmZlclRyYW5zZmVyRnVuY3Rpb25fVXNlR2FtbWE7CisgICAgICAgICAgICAqZ2FtbWFfbGV2ZWwgPSBDRk51bWJlckNyZWF0ZShOVUxMLCBrQ0ZOdW1iZXJGbG9hdDMyVHlwZSwgJmdhbW1hKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDT0xfVFJDX0JUMjAyMF8xMDoKKyAgICAgICAgY2FzZSBBVkNPTF9UUkNfQlQyMDIwXzEyOgorICAgICAgICAgICAgKnRyYW5zZmVyX2ZuYyA9IGNvbXBhdF9rZXlzLmtDVkltYWdlQnVmZmVyVHJhbnNmZXJGdW5jdGlvbl9JVFVfUl8yMDIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVHJhbnNmZXIgZnVuY3Rpb24gJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGF2X2NvbG9yX3RyYW5zZmVyX25hbWUodHJjKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2N2X3ljYmNyX21hdHJpeChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIENGU3RyaW5nUmVmICptYXRyaXgpIHsKKyAgICBzd2l0Y2goYXZjdHgtPmNvbG9yc3BhY2UpIHsKKyAgICAgICAgY2FzZSBBVkNPTF9TUENfQlQ3MDk6CisgICAgICAgICAgICAqbWF0cml4ID0ga0NWSW1hZ2VCdWZmZXJZQ2JDck1hdHJpeF9JVFVfUl83MDlfMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDT0xfU1BDX1VOU1BFQ0lGSUVEOgorICAgICAgICAgICAgKm1hdHJpeCA9IE5VTEw7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEFWQ09MX1NQQ19CVDQ3MEJHOgorICAgICAgICBjYXNlIEFWQ09MX1NQQ19TTVBURTE3ME06CisgICAgICAgICAgICAqbWF0cml4ID0ga0NWSW1hZ2VCdWZmZXJZQ2JDck1hdHJpeF9JVFVfUl82MDFfNDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDT0xfU1BDX1NNUFRFMjQwTToKKyAgICAgICAgICAgICptYXRyaXggPSBrQ1ZJbWFnZUJ1ZmZlcllDYkNyTWF0cml4X1NNUFRFXzI0ME1fMTk5NTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgQVZDT0xfU1BDX0JUMjAyMF9OQ0w6CisgICAgICAgICAgICAqbWF0cml4ID0gY29tcGF0X2tleXMua0NWSW1hZ2VCdWZmZXJZQ2JDck1hdHJpeF9JVFVfUl8yMDIwOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ29sb3Igc3BhY2UgJXMgaXMgbm90IHN1cHBvcnRlZC5cbiIsIGF2X2NvbG9yX3NwYWNlX25hbWUoYXZjdHgtPmNvbG9yc3BhY2UpKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dGVuY19jcmVhdGVfZW5jb2RlcihBVkNvZGVjQ29udGV4dCAgICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01WaWRlb0NvZGVjVHlwZSBjb2RlY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlN0cmluZ1JlZiAgICAgIHByb2ZpbGVfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGTnVtYmVyUmVmICAgICAgZ2FtbWFfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZiAgZW5jX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGRGljdGlvbmFyeVJlZiAgcGl4ZWxfYnVmZmVyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZUQ29tcHJlc3Npb25TZXNzaW9uUmVmICpzZXNzaW9uKQoreworICAgIFZURW5jQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFNJbnQzMiAgICAgICBiaXRfcmF0ZSA9IGF2Y3R4LT5iaXRfcmF0ZTsKKyAgICBTSW50MzIgICAgICAgbWF4X3JhdGUgPSBhdmN0eC0+cmNfbWF4X3JhdGU7CisgICAgQ0ZOdW1iZXJSZWYgIGJpdF9yYXRlX251bTsKKyAgICBDRk51bWJlclJlZiAgYnl0ZXNfcGVyX3NlY29uZDsKKyAgICBDRk51bWJlclJlZiAgb25lX3NlY29uZDsKKyAgICBDRkFycmF5UmVmICAgZGF0YV9yYXRlX2xpbWl0czsKKyAgICBpbnQ2NF90ICAgICAgYnl0ZXNfcGVyX3NlY29uZF92YWx1ZSA9IDA7CisgICAgaW50NjRfdCAgICAgIG9uZV9zZWNvbmRfdmFsdWUgPSAwOworICAgIHZvaWQgICAgICAgICAqbnVtc1syXTsKKworICAgIGludCBzdGF0dXMgPSBWVENvbXByZXNzaW9uU2Vzc2lvbkNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9idWZmZXJfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRlbmNfb3V0cHV0X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbik7CisKKyAgICBpZiAoc3RhdHVzIHx8ICF2dGN0eC0+c2Vzc2lvbikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yOiBjYW5ub3QgY3JlYXRlIGNvbXByZXNzaW9uIHNlc3Npb246ICVkXG4iLCBzdGF0dXMpOworCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKyAgICAgICAgaWYgKCF2dGN0eC0+YWxsb3dfc3cpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVHJ5IC1hbGxvd19zdyAxLiBUaGUgaGFyZHdhcmUgZW5jb2RlciBtYXkgYmUgYnVzeSwgb3Igbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBiaXRfcmF0ZV9udW0gPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRk51bWJlclNJbnQzMlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpdF9yYXRlKTsKKyAgICBpZiAoIWJpdF9yYXRlX251bSkgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0YXR1cyA9IFZUU2Vzc2lvblNldFByb3BlcnR5KHZ0Y3R4LT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVENvbXByZXNzaW9uUHJvcGVydHlLZXlfQXZlcmFnZUJpdFJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0X3JhdGVfbnVtKTsKKyAgICBDRlJlbGVhc2UoYml0X3JhdGVfbnVtKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIGJpdHJhdGUgcHJvcGVydHk6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBpZiAodnRjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYgbWF4X3JhdGUgPiAwKSB7CisgICAgICAgIC8vIGtWVENvbXByZXNzaW9uUHJvcGVydHlLZXlfRGF0YVJhdGVMaW1pdHMgaXMgbm90IGF2YWlsYWJsZSBmb3IgSEVWQworICAgICAgICBieXRlc19wZXJfc2Vjb25kX3ZhbHVlID0gbWF4X3JhdGUgPj4gMzsKKyAgICAgICAgYnl0ZXNfcGVyX3NlY29uZCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZOdW1iZXJTSW50NjRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX3Blcl9zZWNvbmRfdmFsdWUpOworICAgICAgICBpZiAoIWJ5dGVzX3Blcl9zZWNvbmQpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgb25lX3NlY29uZF92YWx1ZSA9IDE7CisgICAgICAgIG9uZV9zZWNvbmQgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGTnVtYmVyU0ludDY0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvbmVfc2Vjb25kX3ZhbHVlKTsKKyAgICAgICAgaWYgKCFvbmVfc2Vjb25kKSB7CisgICAgICAgICAgICBDRlJlbGVhc2UoYnl0ZXNfcGVyX3NlY29uZCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIG51bXNbMF0gPSAodm9pZCAqKWJ5dGVzX3Blcl9zZWNvbmQ7CisgICAgICAgIG51bXNbMV0gPSAodm9pZCAqKW9uZV9zZWNvbmQ7CisgICAgICAgIGRhdGFfcmF0ZV9saW1pdHMgPSBDRkFycmF5Q3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICoqKW51bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpOworCisgICAgICAgIGlmICghZGF0YV9yYXRlX2xpbWl0cykgeworICAgICAgICAgICAgQ0ZSZWxlYXNlKGJ5dGVzX3Blcl9zZWNvbmQpOworICAgICAgICAgICAgQ0ZSZWxlYXNlKG9uZV9zZWNvbmQpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBWVFNlc3Npb25TZXRQcm9wZXJ0eSh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZUQ29tcHJlc3Npb25Qcm9wZXJ0eUtleV9EYXRhUmF0ZUxpbWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9yYXRlX2xpbWl0cyk7CisKKyAgICAgICAgQ0ZSZWxlYXNlKGJ5dGVzX3Blcl9zZWNvbmQpOworICAgICAgICBDRlJlbGVhc2Uob25lX3NlY29uZCk7CisgICAgICAgIENGUmVsZWFzZShkYXRhX3JhdGVfbGltaXRzKTsKKworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHNldHRpbmcgbWF4IGJpdHJhdGUgcHJvcGVydHk6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodnRjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgLy8ga1ZUQ29tcHJlc3Npb25Qcm9wZXJ0eUtleV9Qcm9maWxlTGV2ZWwgaXMgbm90IGF2YWlsYWJsZSBmb3IgSEVWQworICAgICAgICBpZiAocHJvZmlsZV9sZXZlbCkgeworICAgICAgICAgICAgc3RhdHVzID0gVlRTZXNzaW9uU2V0UHJvcGVydHkodnRjdHgtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZUQ29tcHJlc3Npb25Qcm9wZXJ0eUtleV9Qcm9maWxlTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9sZXZlbCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIHByb2ZpbGUvbGV2ZWwgcHJvcGVydHk6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF2Y3R4LT5nb3Bfc2l6ZSA+IDApIHsKKyAgICAgICAgQ0ZOdW1iZXJSZWYgaW50ZXJ2YWwgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRk51bWJlckludFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2Y3R4LT5nb3Bfc2l6ZSk7CisgICAgICAgIGlmICghaW50ZXJ2YWwpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBWVFNlc3Npb25TZXRQcm9wZXJ0eSh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZUQ29tcHJlc3Npb25Qcm9wZXJ0eUtleV9NYXhLZXlGcmFtZUludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbCk7CisgICAgICAgIENGUmVsZWFzZShpbnRlcnZhbCk7CisKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nICdtYXgga2V5LWZyYW1lIGludGVydmFsJyBwcm9wZXJ0eTogJWRcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh2dGN0eC0+ZnJhbWVzX2JlZm9yZSkgeworICAgICAgICBzdGF0dXMgPSBWVFNlc3Npb25TZXRQcm9wZXJ0eSh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZUQ29tcHJlc3Npb25Qcm9wZXJ0eUtleV9Nb3JlRnJhbWVzQmVmb3JlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRkJvb2xlYW5UcnVlKTsKKworICAgICAgICBpZiAoc3RhdHVzID09IGtWVFByb3BlcnR5Tm90U3VwcG9ydGVkRXJyKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiZnJhbWVzX2JlZm9yZSBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLiBJZ25vcmluZy5cbiIpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIGZyYW1lc19iZWZvcmUgcHJvcGVydHk6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZ0Y3R4LT5mcmFtZXNfYWZ0ZXIpIHsKKyAgICAgICAgc3RhdHVzID0gVlRTZXNzaW9uU2V0UHJvcGVydHkodnRjdHgtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVENvbXByZXNzaW9uUHJvcGVydHlLZXlfTW9yZUZyYW1lc0FmdGVyRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZCb29sZWFuVHJ1ZSk7CisKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBrVlRQcm9wZXJ0eU5vdFN1cHBvcnRlZEVycikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgImZyYW1lc19hZnRlciBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLiBJZ25vcmluZy5cbiIpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIGZyYW1lc19hZnRlciBwcm9wZXJ0eTogJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICE9IDApIHsKKyAgICAgICAgQ0ZOdW1iZXJSZWYgbnVtOworICAgICAgICBDRk51bWJlclJlZiBkZW47CisgICAgICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgcGFyOworICAgICAgICBBVlJhdGlvbmFsICphdnBhciA9ICZhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgICAgICBhdl9yZWR1Y2UoJmF2cGFyLT5udW0sICZhdnBhci0+ZGVuLAorICAgICAgICAgICAgICAgICAgIGF2cGFyLT5udW0sICBhdnBhci0+ZGVuLAorICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRik7CisKKyAgICAgICAgbnVtID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGTnVtYmVySW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2cGFyLT5udW0pOworCisgICAgICAgIGRlbiA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRk51bWJlckludFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdnBhci0+ZGVuKTsKKworCisKKyAgICAgICAgcGFyID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKworICAgICAgICBpZiAoIXBhciB8fCAhbnVtIHx8ICFkZW4pIHsKKyAgICAgICAgICAgIGlmIChwYXIpIENGUmVsZWFzZShwYXIpOworICAgICAgICAgICAgaWYgKG51bSkgQ0ZSZWxlYXNlKG51bSk7CisgICAgICAgICAgICBpZiAoZGVuKSBDRlJlbGVhc2UoZGVuKTsKKworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKAorICAgICAgICAgICAgcGFyLAorICAgICAgICAgICAga0NNRm9ybWF0RGVzY3JpcHRpb25LZXlfUGl4ZWxBc3BlY3RSYXRpb0hvcml6b250YWxTcGFjaW5nLAorICAgICAgICAgICAgbnVtKTsKKworICAgICAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZSgKKyAgICAgICAgICAgIHBhciwKKyAgICAgICAgICAgIGtDTUZvcm1hdERlc2NyaXB0aW9uS2V5X1BpeGVsQXNwZWN0UmF0aW9WZXJ0aWNhbFNwYWNpbmcsCisgICAgICAgICAgICBkZW4pOworCisgICAgICAgIHN0YXR1cyA9IFZUU2Vzc2lvblNldFByb3BlcnR5KHZ0Y3R4LT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlRDb21wcmVzc2lvblByb3BlcnR5S2V5X1BpeGVsQXNwZWN0UmF0aW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcik7CisKKyAgICAgICAgQ0ZSZWxlYXNlKHBhcik7CisgICAgICAgIENGUmVsZWFzZShudW0pOworICAgICAgICBDRlJlbGVhc2UoZGVuKTsKKworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsCisgICAgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJFcnJvciBzZXR0aW5nIHBpeGVsIGFzcGVjdCByYXRpbyB0byAlZDolZDogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGlmICh2dGN0eC0+dHJhbnNmZXJfZnVuY3Rpb24pIHsKKyAgICAgICAgc3RhdHVzID0gVlRTZXNzaW9uU2V0UHJvcGVydHkodnRjdHgtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtWVENvbXByZXNzaW9uUHJvcGVydHlLZXlfVHJhbnNmZXJGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRjdHgtPnRyYW5zZmVyX2Z1bmN0aW9uKTsKKworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IHNldCB0cmFuc2ZlciBmdW5jdGlvbjogJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIGlmICh2dGN0eC0+eWNiY3JfbWF0cml4KSB7CisgICAgICAgIHN0YXR1cyA9IFZUU2Vzc2lvblNldFByb3BlcnR5KHZ0Y3R4LT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlRDb21wcmVzc2lvblByb3BlcnR5S2V5X1lDYkNyTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dGN0eC0+eWNiY3JfbWF0cml4KTsKKworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IHNldCB5Y2JjciBtYXRyaXg6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBpZiAodnRjdHgtPmNvbG9yX3ByaW1hcmllcykgeworICAgICAgICBzdGF0dXMgPSBWVFNlc3Npb25TZXRQcm9wZXJ0eSh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZUQ29tcHJlc3Npb25Qcm9wZXJ0eUtleV9Db2xvclByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnRjdHgtPmNvbG9yX3ByaW1hcmllcyk7CisKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNvdWxkIG5vdCBzZXQgY29sb3IgcHJpbWFyaWVzOiAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnYW1tYV9sZXZlbCkgeworICAgICAgICBzdGF0dXMgPSBWVFNlc3Npb25TZXRQcm9wZXJ0eSh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NWSW1hZ2VCdWZmZXJHYW1tYUxldmVsS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYV9sZXZlbCk7CisKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNvdWxkIG5vdCBzZXQgZ2FtbWEgbGV2ZWw6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF2dGN0eC0+aGFzX2JfZnJhbWVzKSB7CisgICAgICAgIHN0YXR1cyA9IFZUU2Vzc2lvblNldFByb3BlcnR5KHZ0Y3R4LT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlRDb21wcmVzc2lvblByb3BlcnR5S2V5X0FsbG93RnJhbWVSZW9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZCb29sZWFuRmFsc2UpOworCisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc2V0dGluZyAnYWxsb3cgZnJhbWUgcmVvcmRlcmluZycgcHJvcGVydHk6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodnRjdHgtPmVudHJvcHkgIT0gVlRfRU5UUk9QWV9OT1RfU0VUKSB7CisgICAgICAgIENGU3RyaW5nUmVmIGVudHJvcHkgPSB2dGN0eC0+ZW50cm9weSA9PSBWVF9DQUJBQyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdF9rZXlzLmtWVEgyNjRFbnRyb3B5TW9kZV9DQUJBQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUSDI2NEVudHJvcHlNb2RlX0NBVkxDOworCisgICAgICAgIHN0YXR1cyA9IFZUU2Vzc2lvblNldFByb3BlcnR5KHZ0Y3R4LT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRfa2V5cy5rVlRDb21wcmVzc2lvblByb3BlcnR5S2V5X0gyNjRFbnRyb3B5TW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cm9weSk7CisKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIGVudHJvcHkgcHJvcGVydHk6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZ0Y3R4LT5yZWFsdGltZSkgeworICAgICAgICBzdGF0dXMgPSBWVFNlc3Npb25TZXRQcm9wZXJ0eSh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUQ29tcHJlc3Npb25Qcm9wZXJ0eUtleV9SZWFsVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGQm9vbGVhblRydWUpOworCisgICAgICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc2V0dGluZyByZWFsdGltZSBwcm9wZXJ0eTogJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXMgPSBWVENvbXByZXNzaW9uU2Vzc2lvblByZXBhcmVUb0VuY29kZUZyYW1lcyh2dGN0eC0+c2Vzc2lvbik7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yOiBjYW5ub3QgcHJlcGFyZSBlbmNvZGVyOiAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnRlbmNfY29uZmlndXJlX2VuY29kZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgZW5jX2luZm87CisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBwaXhlbF9idWZmZXJfaW5mbzsKKyAgICBDTVZpZGVvQ29kZWNUeXBlICAgICAgIGNvZGVjX3R5cGU7CisgICAgVlRFbmNDb250ZXh0ICAgICAgICAgICAqdnRjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIENGU3RyaW5nUmVmICAgICAgICAgICAgcHJvZmlsZV9sZXZlbDsKKyAgICBDRk51bWJlclJlZiAgICAgICAgICAgIGdhbW1hX2xldmVsID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKworICAgIGNvZGVjX3R5cGUgPSBnZXRfY21fY29kZWNfdHlwZShhdmN0eC0+Y29kZWNfaWQpOworICAgIGlmICghY29kZWNfdHlwZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yOiBubyBtYXBwaW5nIGZvciBBVkNvZGVjSUQgJWRcbiIsIGF2Y3R4LT5jb2RlY19pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgdnRjdHgtPmNvZGVjX2lkID0gYXZjdHgtPmNvZGVjX2lkOworCisgICAgaWYgKHZ0Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgIHZ0Y3R4LT5nZXRfcGFyYW1fc2V0X2Z1bmMgPSBDTVZpZGVvRm9ybWF0RGVzY3JpcHRpb25HZXRIMjY0UGFyYW1ldGVyU2V0QXRJbmRleDsKKworICAgICAgICB2dGN0eC0+aGFzX2JfZnJhbWVzID0gYXZjdHgtPm1heF9iX2ZyYW1lcyA+IDA7CisgICAgICAgIGlmKHZ0Y3R4LT5oYXNfYl9mcmFtZXMgJiYgdnRjdHgtPnByb2ZpbGUgPT0gSDI2NF9QUk9GX0JBU0VMSU5FKXsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDYW5ub3QgdXNlIEItZnJhbWVzIHdpdGggYmFzZWxpbmUgcHJvZmlsZS4gT3V0cHV0IHdpbGwgbm90IGNvbnRhaW4gQi1mcmFtZXMuXG4iKTsKKyAgICAgICAgICAgIHZ0Y3R4LT5oYXNfYl9mcmFtZXMgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2dGN0eC0+ZW50cm9weSA9PSBWVF9DQUJBQyAmJiB2dGN0eC0+cHJvZmlsZSA9PSBIMjY0X1BST0ZfQkFTRUxJTkUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDQUJBQyBlbnRyb3B5IHJlcXVpcmVzICdtYWluJyBvciAnaGlnaCcgcHJvZmlsZSwgYnV0IGJhc2VsaW5lIHdhcyByZXF1ZXN0ZWQuIEVuY29kZSB3aWxsIG5vdCB1c2UgQ0FCQUMgZW50cm9weS5cbiIpOworICAgICAgICAgICAgdnRjdHgtPmVudHJvcHkgPSBWVF9FTlRST1BZX05PVF9TRVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWdldF92dF9oMjY0X3Byb2ZpbGVfbGV2ZWwoYXZjdHgsICZwcm9maWxlX2xldmVsKSkgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9IGVsc2UgeworICAgICAgICB2dGN0eC0+Z2V0X3BhcmFtX3NldF9mdW5jID0gY29tcGF0X2tleXMuQ01WaWRlb0Zvcm1hdERlc2NyaXB0aW9uR2V0SEVWQ1BhcmFtZXRlclNldEF0SW5kZXg7CisgICAgICAgIGlmICghdnRjdHgtPmdldF9wYXJhbV9zZXRfZnVuYykgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgaWYgKCFnZXRfdnRfaGV2Y19wcm9maWxlX2xldmVsKGF2Y3R4LCAmcHJvZmlsZV9sZXZlbCkpIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZW5jX2luZm8gPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKAorICAgICAgICBrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAyMCwKKyAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLAorICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcworICAgICk7CisKKyAgICBpZiAoIWVuY19pbmZvKSByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKyAgICBpZiAoIXZ0Y3R4LT5hbGxvd19zdykgeworICAgICAgICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShlbmNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0X2tleXMua1ZUVmlkZW9FbmNvZGVyU3BlY2lmaWNhdGlvbl9SZXF1aXJlSGFyZHdhcmVBY2NlbGVyYXRlZFZpZGVvRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGQm9vbGVhblRydWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIENGRGljdGlvbmFyeVNldFZhbHVlKGVuY19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRfa2V5cy5rVlRWaWRlb0VuY29kZXJTcGVjaWZpY2F0aW9uX0VuYWJsZUhhcmR3YXJlQWNjZWxlcmF0ZWRWaWRlb0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRkJvb2xlYW5UcnVlKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1ZJREVPVE9PTEJPWCkgeworICAgICAgICBzdGF0dXMgPSBjcmVhdGVfY3ZfcGl4ZWxfYnVmZmVyX2luZm8oYXZjdHgsICZwaXhlbF9idWZmZXJfaW5mbyk7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICBnb3RvIGluaXRfY2xlYW51cDsKKyAgICB9IGVsc2UgeworICAgICAgICBwaXhlbF9idWZmZXJfaW5mbyA9IE5VTEw7CisgICAgfQorCisgICAgdnRjdHgtPmR0c19kZWx0YSA9IHZ0Y3R4LT5oYXNfYl9mcmFtZXMgPyAtMSA6IDA7CisKKyAgICBnZXRfY3ZfdHJhbnNmZXJfZnVuY3Rpb24oYXZjdHgsICZ2dGN0eC0+dHJhbnNmZXJfZnVuY3Rpb24sICZnYW1tYV9sZXZlbCk7CisgICAgZ2V0X2N2X3ljYmNyX21hdHJpeChhdmN0eCwgJnZ0Y3R4LT55Y2Jjcl9tYXRyaXgpOworICAgIGdldF9jdl9jb2xvcl9wcmltYXJpZXMoYXZjdHgsICZ2dGN0eC0+Y29sb3JfcHJpbWFyaWVzKTsKKworCisgICAgaWYgKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgeworICAgICAgICBzdGF0dXMgPSB2dGVuY19wb3B1bGF0ZV9leHRyYWRhdGEoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbW1hX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbF9idWZmZXJfaW5mbyk7CisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICBnb3RvIGluaXRfY2xlYW51cDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB2dGVuY19jcmVhdGVfZW5jb2RlcihhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfYnVmZmVyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZ0Y3R4LT5zZXNzaW9uKTsKKworaW5pdF9jbGVhbnVwOgorICAgIGlmIChnYW1tYV9sZXZlbCkKKyAgICAgICAgQ0ZSZWxlYXNlKGdhbW1hX2xldmVsKTsKKworICAgIGlmIChwaXhlbF9idWZmZXJfaW5mbykKKyAgICAgICAgQ0ZSZWxlYXNlKHBpeGVsX2J1ZmZlcl9pbmZvKTsKKworICAgIENGUmVsZWFzZShlbmNfaW5mbyk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnRlbmNfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVlRFbmNDb250ZXh0ICAgICp2dGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQ0ZCb29sZWFuUmVmICAgIGhhc19iX2ZyYW1lc19jZmJvb2w7CisgICAgaW50ICAgICAgICAgICAgIHN0YXR1czsKKworICAgIHB0aHJlYWRfb25jZSgmb25jZV9jdHJsLCBsb2FkVlRFbmNTeW1ib2xzKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmdnRjdHgtPmxvY2ssIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZ2dGN0eC0+Y3Zfc2FtcGxlX3NlbnQsIE5VTEwpOworCisgICAgdnRjdHgtPnNlc3Npb24gPSBOVUxMOworICAgIHN0YXR1cyA9IHZ0ZW5jX2NvbmZpZ3VyZV9lbmNvZGVyKGF2Y3R4KTsKKyAgICBpZiAoc3RhdHVzKSByZXR1cm4gc3RhdHVzOworCisgICAgc3RhdHVzID0gVlRTZXNzaW9uQ29weVByb3BlcnR5KHZ0Y3R4LT5zZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVlRDb21wcmVzc2lvblByb3BlcnR5S2V5X0FsbG93RnJhbWVSZW9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZBbGxvY2F0b3JEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFzX2JfZnJhbWVzX2NmYm9vbCk7CisKKyAgICBpZiAoIXN0YXR1cyAmJiBoYXNfYl9mcmFtZXNfY2Zib29sKSB7CisgICAgICAgIC8vU29tZSBkZXZpY2VzIGRvbid0IG91dHB1dCBCLWZyYW1lcyBmb3IgbWFpbiBwcm9maWxlLCBldmVuIGlmIHJlcXVlc3RlZC4KKyAgICAgICAgdnRjdHgtPmhhc19iX2ZyYW1lcyA9IENGQm9vbGVhbkdldFZhbHVlKGhhc19iX2ZyYW1lc19jZmJvb2wpOworICAgICAgICBDRlJlbGVhc2UoaGFzX2JfZnJhbWVzX2NmYm9vbCk7CisgICAgfQorICAgIGF2Y3R4LT5oYXNfYl9mcmFtZXMgPSB2dGN0eC0+aGFzX2JfZnJhbWVzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZ0ZW5jX2dldF9mcmFtZV9pbmZvKENNU2FtcGxlQnVmZmVyUmVmIGJ1ZmZlciwgYm9vbCAqaXNfa2V5X2ZyYW1lKQoreworICAgIENGQXJyYXlSZWYgICAgICBhdHRhY2htZW50czsKKyAgICBDRkRpY3Rpb25hcnlSZWYgYXR0YWNobWVudDsKKyAgICBDRkJvb2xlYW5SZWYgICAgbm90X3N5bmM7CisgICAgQ0ZJbmRleCAgICAgICAgIGxlbjsKKworICAgIGF0dGFjaG1lbnRzID0gQ01TYW1wbGVCdWZmZXJHZXRTYW1wbGVBdHRhY2htZW50c0FycmF5KGJ1ZmZlciwgZmFsc2UpOworICAgIGxlbiA9ICFhdHRhY2htZW50cyA/IDAgOiBDRkFycmF5R2V0Q291bnQoYXR0YWNobWVudHMpOworCisgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgKmlzX2tleV9mcmFtZSA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdHRhY2htZW50ID0gQ0ZBcnJheUdldFZhbHVlQXRJbmRleChhdHRhY2htZW50cywgMCk7CisKKyAgICBpZiAoQ0ZEaWN0aW9uYXJ5R2V0VmFsdWVJZlByZXNlbnQoYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NNU2FtcGxlQXR0YWNobWVudEtleV9Ob3RTeW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqKikmbm90X3N5bmMpKQorICAgIHsKKyAgICAgICAgKmlzX2tleV9mcmFtZSA9ICFDRkJvb2xlYW5HZXRWYWx1ZShub3Rfc3luYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmlzX2tleV9mcmFtZSA9IHRydWU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGlzX3Bvc3Rfc2VpX25hbF90eXBlKGludCBuYWxfdHlwZSl7CisgICAgcmV0dXJuIG5hbF90eXBlICE9IEgyNjRfTkFMX1NFSSAmJgorICAgICAgICAgICBuYWxfdHlwZSAhPSBIMjY0X05BTF9TUFMgJiYKKyAgICAgICAgICAgbmFsX3R5cGUgIT0gSDI2NF9OQUxfUFBTICYmCisgICAgICAgICAgIG5hbF90eXBlICE9IEgyNjRfTkFMX0FVRDsKK30KKworLyoKKyAqIEZpbmRzIHRoZSBzZWkgbWVzc2FnZSBzdGFydC9zaXplIG9mIHR5cGUgZmluZF9zZWlfdHlwZS4KKyAqIElmIG1vcmUgdGhhbiBvbmUgb2YgdGhhdCB0eXBlIGV4aXN0cywgdGhlIGxhc3Qgb25lIGlzIHJldHVybmVkLgorICovCitzdGF0aWMgaW50IGZpbmRfc2VpX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICAqbmFsX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgbmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICoqc2VpX2VuZCkKK3sKKyAgICBpbnQgbmFsX3R5cGU7CisgICAgc2l6ZV90IHNlaV9wYXlsb2FkX3NpemUgPSAwOworICAgIGludCBzZWlfcGF5bG9hZF90eXBlID0gMDsKKyAgICAqc2VpX2VuZCA9IE5VTEw7CisgICAgdWludDhfdCAqbmFsX3N0YXJ0ID0gbmFsX2RhdGE7CisKKyAgICBpZiAoIW5hbF9zaXplKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG5hbF90eXBlID0gKm5hbF9kYXRhICYgMHgxRjsKKyAgICBpZiAobmFsX3R5cGUgIT0gSDI2NF9OQUxfU0VJKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG5hbF9kYXRhKys7CisgICAgbmFsX3NpemUtLTsKKworICAgIGlmIChuYWxfZGF0YVtuYWxfc2l6ZSAtIDFdID09IDB4ODApCisgICAgICAgIG5hbF9zaXplLS07CisKKyAgICB3aGlsZSAobmFsX3NpemUgPiAwICYmICpuYWxfZGF0YSA+IDApIHsKKyAgICAgICAgZG97CisgICAgICAgICAgICBzZWlfcGF5bG9hZF90eXBlICs9ICpuYWxfZGF0YTsKKyAgICAgICAgICAgIG5hbF9kYXRhKys7CisgICAgICAgICAgICBuYWxfc2l6ZS0tOworICAgICAgICB9IHdoaWxlIChuYWxfc2l6ZSA+IDAgJiYgKm5hbF9kYXRhID09IDB4RkYpOworCisgICAgICAgIGlmICghbmFsX3NpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5leHBlY3RlZCBlbmQgb2YgU0VJIE5BTCBVbml0IHBhcnNpbmcgdHlwZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBkb3sKKyAgICAgICAgICAgIHNlaV9wYXlsb2FkX3NpemUgKz0gKm5hbF9kYXRhOworICAgICAgICAgICAgbmFsX2RhdGErKzsKKyAgICAgICAgICAgIG5hbF9zaXplLS07CisgICAgICAgIH0gd2hpbGUgKG5hbF9zaXplID4gMCAmJiAqbmFsX2RhdGEgPT0gMHhGRik7CisKKyAgICAgICAgaWYgKG5hbF9zaXplIDwgc2VpX3BheWxvYWRfc2l6ZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmV4cGVjdGVkIGVuZCBvZiBTRUkgTkFMIFVuaXQgcGFyc2luZyBzaXplLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIG5hbF9kYXRhICs9IHNlaV9wYXlsb2FkX3NpemU7CisgICAgICAgIG5hbF9zaXplIC09IHNlaV9wYXlsb2FkX3NpemU7CisgICAgfQorCisgICAgKnNlaV9lbmQgPSBuYWxfZGF0YTsKKworICAgIHJldHVybiBuYWxfZGF0YSAtIG5hbF9zdGFydCArIDE7Cit9CisKKy8qKgorICogQ29waWVzIHRoZSBkYXRhIGluc2VydGluZyBlbXVsYXRpb24gcHJldmVudGlvbiBieXRlcyBhcyBuZWVkZWQuCisgKiBFeGlzdGluZyBkYXRhIGluIHRoZSBkZXN0aW5hdGlvbiBjYW4gYmUgdGFrZW4gaW50byBhY2NvdW50IGJ5IHByb3ZpZGluZworICogZHN0IHdpdGggYSBkc3Rfb2Zmc2V0ID4gMC4KKyAqCisgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIG9uIHN1Y2Nlc3MuIE9uIGZhaWx1cmUsIHRoZSBuZWdhdGl2ZSBvZgorICogICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBjb3B5IHNyYyBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGludCBjb3B5X2VtdWxhdGlvbl9wcmV2KGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCAgICAgICAgZHN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICBkc3Rfc2l6ZSkKK3sKKyAgICBpbnQgemVyb3MgPSAwOworICAgIGludCB3cm90ZV9ieXRlczsKKyAgICB1aW50OF90KiBkc3Rfc3RhcnQ7CisgICAgdWludDhfdCogZHN0X2VuZCA9IGRzdCArIGRzdF9zaXplOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19lbmQgPSBzcmMgKyBzcmNfc2l6ZTsKKyAgICBpbnQgc3RhcnRfYXQgPSBkc3Rfb2Zmc2V0ID4gMiA/IGRzdF9vZmZzZXQgLSAyIDogMDsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSBzdGFydF9hdDsgaSA8IGRzdF9vZmZzZXQgJiYgaSA8IGRzdF9zaXplOyBpKyspIHsKKyAgICAgICAgaWYgKCFkc3RbaV0pCisgICAgICAgICAgICB6ZXJvcysrOworICAgICAgICBlbHNlCisgICAgICAgICAgICB6ZXJvcyA9IDA7CisgICAgfQorCisgICAgZHN0ICs9IGRzdF9vZmZzZXQ7CisgICAgZHN0X3N0YXJ0ID0gZHN0OworICAgIGZvciAoOyBzcmMgPCBzcmNfZW5kOyBzcmMrKywgZHN0KyspIHsKKyAgICAgICAgaWYgKHplcm9zID09IDIpIHsKKyAgICAgICAgICAgIGludCBpbnNlcnRfZXAzX2J5dGUgPSAqc3JjIDw9IDM7CisgICAgICAgICAgICBpZiAoaW5zZXJ0X2VwM19ieXRlKSB7CisgICAgICAgICAgICAgICAgaWYgKGRzdCA8IGRzdF9lbmQpCisgICAgICAgICAgICAgICAgICAgICpkc3QgPSAzOworICAgICAgICAgICAgICAgIGRzdCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6ZXJvcyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZHN0IDwgZHN0X2VuZCkKKyAgICAgICAgICAgICpkc3QgPSAqc3JjOworCisgICAgICAgIGlmICghKnNyYykKKyAgICAgICAgICAgIHplcm9zKys7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHplcm9zID0gMDsKKyAgICB9CisKKyAgICB3cm90ZV9ieXRlcyA9IGRzdCAtIGRzdF9zdGFydDsKKworICAgIGlmIChkc3QgPiBkc3RfZW5kKQorICAgICAgICByZXR1cm4gLXdyb3RlX2J5dGVzOworCisgICAgcmV0dXJuIHdyb3RlX2J5dGVzOworfQorCitzdGF0aWMgaW50IHdyaXRlX3NlaShjb25zdCBFeHRyYVNFSSAqc2VpLAorICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHNlaV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBkc3Rfc2l6ZSkKK3sKKyAgICB1aW50OF90ICpzZWlfc3RhcnQgPSBkc3Q7CisgICAgc2l6ZV90IHJlbWFpbmluZ19zZWlfc2l6ZSA9IHNlaS0+c2l6ZTsKKyAgICBzaXplX3QgcmVtYWluaW5nX2RzdF9zaXplID0gZHN0X3NpemU7CisgICAgaW50IGhlYWRlcl9ieXRlczsKKyAgICBpbnQgYnl0ZXNfd3JpdHRlbjsKKyAgICBzc2l6ZV90IG9mZnNldDsKKworICAgIGlmICghcmVtYWluaW5nX2RzdF9zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworCisgICAgd2hpbGUgKHNlaV90eXBlICYmIHJlbWFpbmluZ19kc3Rfc2l6ZSAhPSAwKSB7CisgICAgICAgIGludCBzZWlfYnl0ZSA9IHNlaV90eXBlID4gMjU1ID8gMjU1IDogc2VpX3R5cGU7CisgICAgICAgICpkc3QgPSBzZWlfYnl0ZTsKKworICAgICAgICBzZWlfdHlwZSAtPSBzZWlfYnl0ZTsKKyAgICAgICAgZHN0Kys7CisgICAgICAgIHJlbWFpbmluZ19kc3Rfc2l6ZS0tOworICAgIH0KKworICAgIGlmICghZHN0X3NpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisKKyAgICB3aGlsZSAocmVtYWluaW5nX3NlaV9zaXplICYmIHJlbWFpbmluZ19kc3Rfc2l6ZSAhPSAwKSB7CisgICAgICAgIGludCBzaXplX2J5dGUgPSByZW1haW5pbmdfc2VpX3NpemUgPiAyNTUgPyAyNTUgOiByZW1haW5pbmdfc2VpX3NpemU7CisgICAgICAgICpkc3QgPSBzaXplX2J5dGU7CisKKyAgICAgICAgcmVtYWluaW5nX3NlaV9zaXplIC09IHNpemVfYnl0ZTsKKyAgICAgICAgZHN0Kys7CisgICAgICAgIHJlbWFpbmluZ19kc3Rfc2l6ZS0tOworICAgIH0KKworICAgIGlmIChyZW1haW5pbmdfZHN0X3NpemUgPCBzZWktPnNpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisKKyAgICBoZWFkZXJfYnl0ZXMgPSBkc3QgLSBzZWlfc3RhcnQ7CisKKyAgICBvZmZzZXQgPSBoZWFkZXJfYnl0ZXM7CisgICAgYnl0ZXNfd3JpdHRlbiA9IGNvcHlfZW11bGF0aW9uX3ByZXYoc2VpLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlaS0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWlfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zaXplKTsKKyAgICBpZiAoYnl0ZXNfd3JpdHRlbiA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisKKyAgICBieXRlc193cml0dGVuICs9IGhlYWRlcl9ieXRlczsKKyAgICByZXR1cm4gYnl0ZXNfd3JpdHRlbjsKK30KKworLyoqCisgKiBDb3BpZXMgTkFMIHVuaXRzIGFuZCByZXBsYWNlcyBsZW5ndGggY29kZXMgd2l0aAorICogSC4yNjQgQW5uZXggQiBzdGFydCBjb2Rlcy4gT24gZmFpbHVyZSwgdGhlIGNvbnRlbnRzIG9mCisgKiBkc3RfZGF0YSBtYXkgaGF2ZSBiZWVuIG1vZGlmaWVkLgorICoKKyAqIEBwYXJhbSBsZW5ndGhfY29kZV9zaXplIEJ5dGUgbGVuZ3RoIG9mIGVhY2ggbGVuZ3RoIGNvZGUKKyAqIEBwYXJhbSBzYW1wbGVfYnVmZmVyIE5BTCB1bml0cyBwcmVmaXhlZCB3aXRoIGxlbmd0aCBjb2Rlcy4KKyAqIEBwYXJhbSBzZWkgT3B0aW9uYWwgQTUzIGNsb3NlZCBjYXB0aW9ucyBTRUkgZGF0YS4KKyAqIEBwYXJhbSBkc3RfZGF0YSBNdXN0IGJlIHplcm9lZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICogICAgICAgICAgICAgICAgIENvbnRhaW5zIHRoZSBjb3BpZWQgTkFMIHVuaXRzIHByZWZpeGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICBzdGFydCBjb2RlcyB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgKiAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5LgorICogQHBhcmFtIGRzdF9zaXplIExlbmd0aCBvZiBkc3RfZGF0YQorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MKKyAqICAgICAgICAgQVZFUlJPUl9JTlZBTElEREFUQSBpZiBsZW5ndGhfY29kZV9zaXplIGlzIGludmFsaWQKKyAqICAgICAgICAgQVZFUlJPUl9CVUZGRVJfVE9PX1NNQUxMIGlmIGRzdF9kYXRhIGlzIHRvbyBzbWFsbAorICogICAgICAgICBvciBpZiBhIGxlbmd0aF9jb2RlIGluIHNyY19kYXRhIHNwZWNpZmllcyBkYXRhIGJleW9uZAorICogICAgICAgICB0aGUgZW5kIG9mIGl0cyBidWZmZXIuCisgKi8KK3N0YXRpYyBpbnQgY29weV9yZXBsYWNlX2xlbmd0aF9jb2RlcygKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgc2l6ZV90ICAgICAgICBsZW5ndGhfY29kZV9zaXplLAorICAgIENNU2FtcGxlQnVmZmVyUmVmIHNhbXBsZV9idWZmZXIsCisgICAgRXh0cmFTRUkgICAgICAqc2VpLAorICAgIHVpbnQ4X3QgICAgICAgKmRzdF9kYXRhLAorICAgIHNpemVfdCAgICAgICAgZHN0X3NpemUpCit7CisgICAgc2l6ZV90IHNyY19zaXplID0gQ01TYW1wbGVCdWZmZXJHZXRUb3RhbFNhbXBsZVNpemUoc2FtcGxlX2J1ZmZlcik7CisgICAgc2l6ZV90IHJlbWFpbmluZ19zcmNfc2l6ZSA9IHNyY19zaXplOworICAgIHNpemVfdCByZW1haW5pbmdfZHN0X3NpemUgPSBkc3Rfc2l6ZTsKKyAgICBzaXplX3Qgc3JjX29mZnNldCA9IDA7CisgICAgaW50IHdyb3RlX3NlaSA9IDA7CisgICAgaW50IHN0YXR1czsKKyAgICB1aW50OF90IHNpemVfYnVmWzRdOworICAgIHVpbnQ4X3QgbmFsX3R5cGU7CisgICAgQ01CbG9ja0J1ZmZlclJlZiBibG9jayA9IENNU2FtcGxlQnVmZmVyR2V0RGF0YUJ1ZmZlcihzYW1wbGVfYnVmZmVyKTsKKworICAgIGlmIChsZW5ndGhfY29kZV9zaXplID4gNCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB3aGlsZSAocmVtYWluaW5nX3NyY19zaXplID4gMCkgeworICAgICAgICBzaXplX3QgY3Vycl9zcmNfbGVuOworICAgICAgICBzaXplX3QgY3Vycl9kc3RfbGVuOworICAgICAgICBzaXplX3QgYm94X2xlbiA9IDA7CisgICAgICAgIHNpemVfdCBpOworCisgICAgICAgIHVpbnQ4X3QgICAgICAgKmRzdF9ib3g7CisKKyAgICAgICAgc3RhdHVzID0gQ01CbG9ja0J1ZmZlckNvcHlEYXRhQnl0ZXMoYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF9jb2RlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfYnVmKTsKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgY29weSBsZW5ndGg6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBDTUJsb2NrQnVmZmVyQ29weURhdGFCeXRlcyhibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX29mZnNldCArIGxlbmd0aF9jb2RlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYWxfdHlwZSk7CisKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgY29weSB0eXBlOiAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICB9CisKKyAgICAgICAgbmFsX3R5cGUgJj0gMHgxRjsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoX2NvZGVfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBib3hfbGVuIDw8PSA4OworICAgICAgICAgICAgYm94X2xlbiB8PSBzaXplX2J1ZltpXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWkgJiYgIXdyb3RlX3NlaSAmJiBpc19wb3N0X3NlaV9uYWxfdHlwZShuYWxfdHlwZSkpIHsKKyAgICAgICAgICAgIC8vTm8gU0VJIE5BTCB1bml0IC0gaW5zZXJ0LgorICAgICAgICAgICAgaW50IHdyb3RlX2J5dGVzOworCisgICAgICAgICAgICBtZW1jcHkoZHN0X2RhdGEsIHN0YXJ0X2NvZGUsIHNpemVvZihzdGFydF9jb2RlKSk7CisgICAgICAgICAgICBkc3RfZGF0YSArPSBzaXplb2Yoc3RhcnRfY29kZSk7CisgICAgICAgICAgICByZW1haW5pbmdfZHN0X3NpemUgLT0gc2l6ZW9mKHN0YXJ0X2NvZGUpOworCisgICAgICAgICAgICAqZHN0X2RhdGEgPSBIMjY0X05BTF9TRUk7CisgICAgICAgICAgICBkc3RfZGF0YSsrOworICAgICAgICAgICAgcmVtYWluaW5nX2RzdF9zaXplLS07CisKKyAgICAgICAgICAgIHdyb3RlX2J5dGVzID0gd3JpdGVfc2VpKHNlaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEgyNjRfU0VJX1RZUEVfVVNFUl9EQVRBX1JFR0lTVEVSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19kc3Rfc2l6ZSk7CisKKyAgICAgICAgICAgIGlmICh3cm90ZV9ieXRlcyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHdyb3RlX2J5dGVzOworCisgICAgICAgICAgICByZW1haW5pbmdfZHN0X3NpemUgLT0gd3JvdGVfYnl0ZXM7CisgICAgICAgICAgICBkc3RfZGF0YSArPSB3cm90ZV9ieXRlczsKKworICAgICAgICAgICAgaWYgKHJlbWFpbmluZ19kc3Rfc2l6ZSA8PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisKKyAgICAgICAgICAgICpkc3RfZGF0YSA9IDB4ODA7CisKKyAgICAgICAgICAgIGRzdF9kYXRhKys7CisgICAgICAgICAgICByZW1haW5pbmdfZHN0X3NpemUtLTsKKworICAgICAgICAgICAgd3JvdGVfc2VpID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJfc3JjX2xlbiA9IGJveF9sZW4gKyBsZW5ndGhfY29kZV9zaXplOworICAgICAgICBjdXJyX2RzdF9sZW4gPSBib3hfbGVuICsgc2l6ZW9mKHN0YXJ0X2NvZGUpOworCisgICAgICAgIGlmIChyZW1haW5pbmdfc3JjX3NpemUgPCBjdXJyX3NyY19sZW4pIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVtYWluaW5nX2RzdF9zaXplIDwgY3Vycl9kc3RfbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICB9CisKKyAgICAgICAgZHN0X2JveCA9IGRzdF9kYXRhICsgc2l6ZW9mKHN0YXJ0X2NvZGUpOworCisgICAgICAgIG1lbWNweShkc3RfZGF0YSwgc3RhcnRfY29kZSwgc2l6ZW9mKHN0YXJ0X2NvZGUpKTsKKyAgICAgICAgc3RhdHVzID0gQ01CbG9ja0J1ZmZlckNvcHlEYXRhQnl0ZXMoYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19vZmZzZXQgKyBsZW5ndGhfY29kZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3hfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYm94KTsKKworICAgICAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBjb3B5IGRhdGE6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VpICYmICF3cm90ZV9zZWkgJiYgbmFsX3R5cGUgPT0gSDI2NF9OQUxfU0VJKSB7CisgICAgICAgICAgICAvL0ZvdW5kIFNFSSBOQUwgdW5pdCAtIGFwcGVuZC4KKyAgICAgICAgICAgIGludCB3cm90ZV9ieXRlczsKKyAgICAgICAgICAgIGludCBvbGRfc2VpX2xlbmd0aDsKKyAgICAgICAgICAgIGludCBleHRyYV9ieXRlczsKKyAgICAgICAgICAgIHVpbnQ4X3QgKm5ld19zZWk7CisgICAgICAgICAgICBvbGRfc2VpX2xlbmd0aCA9IGZpbmRfc2VpX2VuZChhdmN0eCwgZHN0X2JveCwgYm94X2xlbiwgJm5ld19zZWkpOworICAgICAgICAgICAgaWYgKG9sZF9zZWlfbGVuZ3RoIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworCisgICAgICAgICAgICB3cm90ZV9ieXRlcyA9IHdyaXRlX3NlaShzZWksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0X1NFSV9UWVBFX1VTRVJfREFUQV9SRUdJU1RFUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3NlaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19kc3Rfc2l6ZSAtIG9sZF9zZWlfbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmICh3cm90ZV9ieXRlcyA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHdyb3RlX2J5dGVzOworCisgICAgICAgICAgICBpZiAobmV3X3NlaSArIHdyb3RlX2J5dGVzID49IGRzdF9kYXRhICsgcmVtYWluaW5nX2RzdF9zaXplKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisKKyAgICAgICAgICAgIG5ld19zZWlbd3JvdGVfYnl0ZXMrK10gPSAweDgwOworICAgICAgICAgICAgZXh0cmFfYnl0ZXMgPSB3cm90ZV9ieXRlcyAtIChkc3RfYm94ICsgYm94X2xlbiAtIG5ld19zZWkpOworCisgICAgICAgICAgICBkc3RfZGF0YSArPSBleHRyYV9ieXRlczsKKyAgICAgICAgICAgIHJlbWFpbmluZ19kc3Rfc2l6ZSAtPSBleHRyYV9ieXRlczsKKworICAgICAgICAgICAgd3JvdGVfc2VpID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY19vZmZzZXQgKz0gY3Vycl9zcmNfbGVuOworICAgICAgICBkc3RfZGF0YSArPSBjdXJyX2RzdF9sZW47CisKKyAgICAgICAgcmVtYWluaW5nX3NyY19zaXplIC09IGN1cnJfc3JjX2xlbjsKKyAgICAgICAgcmVtYWluaW5nX2RzdF9zaXplIC09IGN1cnJfZHN0X2xlbjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXR1cm5zIGEgc3VmZmljaWVudCBudW1iZXIgb2YgYnl0ZXMgdG8gY29udGFpbiB0aGUgc2VpIGRhdGEuCisgKiBJdCBtYXkgYmUgZ3JlYXRlciB0aGFuIHRoZSBtaW5pbXVtIHJlcXVpcmVkLgorICovCitzdGF0aWMgaW50IGdldF9zZWlfbXNnX2J5dGVzKGNvbnN0IEV4dHJhU0VJKiBzZWksIGludCB0eXBlKXsKKyAgICBpbnQgY29waWVkX3NpemU7CisgICAgaWYgKHNlaS0+c2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGNvcGllZF9zaXplID0gLWNvcHlfZW11bGF0aW9uX3ByZXYoc2VpLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VpLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgIGlmICgoc2VpLT5zaXplICUgMjU1KSA9PSAwKSAvL21heSByZXN1bHQgaW4gYW4gZXh0cmEgYnl0ZQorICAgICAgICBjb3BpZWRfc2l6ZSsrOworCisgICAgcmV0dXJuIGNvcGllZF9zaXplICsgc2VpLT5zaXplIC8gMjU1ICsgMSArIHR5cGUgLyAyNTUgKyAxOworfQorCitzdGF0aWMgaW50IHZ0ZW5jX2NtX3RvX2F2cGFja2V0KAorICAgIEFWQ29kZWNDb250ZXh0ICAgICphdmN0eCwKKyAgICBDTVNhbXBsZUJ1ZmZlclJlZiBzYW1wbGVfYnVmZmVyLAorICAgIEFWUGFja2V0ICAgICAgICAgICpwa3QsCisgICAgRXh0cmFTRUkgICAgICAgICAgKnNlaSkKK3sKKyAgICBWVEVuY0NvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGludCAgICAgc3RhdHVzOworICAgIGJvb2wgICAgaXNfa2V5X2ZyYW1lOworICAgIGJvb2wgICAgYWRkX2hlYWRlcjsKKyAgICBzaXplX3QgIGxlbmd0aF9jb2RlX3NpemU7CisgICAgc2l6ZV90ICBoZWFkZXJfc2l6ZSA9IDA7CisgICAgc2l6ZV90ICBpbl9idWZfc2l6ZTsKKyAgICBzaXplX3QgIG91dF9idWZfc2l6ZTsKKyAgICBzaXplX3QgIHNlaV9uYWx1X3NpemUgPSAwOworICAgIGludDY0X3QgZHRzX2RlbHRhOworICAgIGludDY0X3QgdGltZV9iYXNlX251bTsKKyAgICBpbnQgbmFsdV9jb3VudDsKKyAgICBDTVRpbWUgIHB0czsKKyAgICBDTVRpbWUgIGR0czsKKyAgICBDTVZpZGVvRm9ybWF0RGVzY3JpcHRpb25SZWYgdmlkX2ZtdDsKKworCisgICAgdnRlbmNfZ2V0X2ZyYW1lX2luZm8oc2FtcGxlX2J1ZmZlciwgJmlzX2tleV9mcmFtZSk7CisgICAgc3RhdHVzID0gZ2V0X2xlbmd0aF9jb2RlX3NpemUoYXZjdHgsIHNhbXBsZV9idWZmZXIsICZsZW5ndGhfY29kZV9zaXplKTsKKyAgICBpZiAoc3RhdHVzKSByZXR1cm4gc3RhdHVzOworCisgICAgYWRkX2hlYWRlciA9IGlzX2tleV9mcmFtZSAmJiAhKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUik7CisKKyAgICBpZiAoYWRkX2hlYWRlcikgeworICAgICAgICB2aWRfZm10ID0gQ01TYW1wbGVCdWZmZXJHZXRGb3JtYXREZXNjcmlwdGlvbihzYW1wbGVfYnVmZmVyKTsKKyAgICAgICAgaWYgKCF2aWRfZm10KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBnZXQgZm9ybWF0IGRlc2NyaXB0aW9uLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzdGF0dXMgPSBnZXRfcGFyYW1zX3NpemUoYXZjdHgsIHZpZF9mbXQsICZoZWFkZXJfc2l6ZSk7CisgICAgICAgIGlmIChzdGF0dXMpIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gY291bnRfbmFsdXMobGVuZ3RoX2NvZGVfc2l6ZSwgc2FtcGxlX2J1ZmZlciwgJm5hbHVfY291bnQpOworICAgIGlmKHN0YXR1cykKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgIGlmIChzZWkpIHsKKyAgICAgICAgc2l6ZV90IG1zZ19zaXplID0gZ2V0X3NlaV9tc2dfYnl0ZXMoc2VpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0X1NFSV9UWVBFX1VTRVJfREFUQV9SRUdJU1RFUkVEKTsKKworICAgICAgICBzZWlfbmFsdV9zaXplID0gc2l6ZW9mKHN0YXJ0X2NvZGUpICsgMSArIG1zZ19zaXplICsgMTsKKyAgICB9CisKKyAgICBpbl9idWZfc2l6ZSA9IENNU2FtcGxlQnVmZmVyR2V0VG90YWxTYW1wbGVTaXplKHNhbXBsZV9idWZmZXIpOworICAgIG91dF9idWZfc2l6ZSA9IGhlYWRlcl9zaXplICsKKyAgICAgICAgICAgICAgICAgICBpbl9idWZfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgc2VpX25hbHVfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgbmFsdV9jb3VudCAqICgoaW50KXNpemVvZihzdGFydF9jb2RlKSAtIChpbnQpbGVuZ3RoX2NvZGVfc2l6ZSk7CisKKyAgICBzdGF0dXMgPSBmZl9hbGxvY19wYWNrZXQyKGF2Y3R4LCBwa3QsIG91dF9idWZfc2l6ZSwgb3V0X2J1Zl9zaXplKTsKKyAgICBpZiAoc3RhdHVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgIGlmIChhZGRfaGVhZGVyKSB7CisgICAgICAgIHN0YXR1cyA9IGNvcHlfcGFyYW1fc2V0cyhhdmN0eCwgdmlkX2ZtdCwgcGt0LT5kYXRhLCBvdXRfYnVmX3NpemUpOworICAgICAgICBpZihzdGF0dXMpIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gY29weV9yZXBsYWNlX2xlbmd0aF9jb2RlcygKKyAgICAgICAgYXZjdHgsCisgICAgICAgIGxlbmd0aF9jb2RlX3NpemUsCisgICAgICAgIHNhbXBsZV9idWZmZXIsCisgICAgICAgIHNlaSwKKyAgICAgICAgcGt0LT5kYXRhICsgaGVhZGVyX3NpemUsCisgICAgICAgIHBrdC0+c2l6ZSAtIGhlYWRlcl9zaXplCisgICAgKTsKKworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBjb3B5aW5nIHBhY2tldCBkYXRhOiAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBpZiAoaXNfa2V5X2ZyYW1lKSB7CisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgIH0KKworICAgIHB0cyA9IENNU2FtcGxlQnVmZmVyR2V0UHJlc2VudGF0aW9uVGltZVN0YW1wKHNhbXBsZV9idWZmZXIpOworICAgIGR0cyA9IENNU2FtcGxlQnVmZmVyR2V0RGVjb2RlVGltZVN0YW1wICAgICAgKHNhbXBsZV9idWZmZXIpOworCisgICAgaWYgKENNVElNRV9JU19JTlZBTElEKGR0cykpIHsKKyAgICAgICAgaWYgKCF2dGN0eC0+aGFzX2JfZnJhbWVzKSB7CisgICAgICAgICAgICBkdHMgPSBwdHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRUUyBpcyBpbnZhbGlkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGR0c19kZWx0YSA9IHZ0Y3R4LT5kdHNfZGVsdGEgPj0gMCA/IHZ0Y3R4LT5kdHNfZGVsdGEgOiAwOworICAgIHRpbWVfYmFzZV9udW0gPSBhdmN0eC0+dGltZV9iYXNlLm51bTsKKyAgICBwa3QtPnB0cyA9IHB0cy52YWx1ZSAvIHRpbWVfYmFzZV9udW07CisgICAgcGt0LT5kdHMgPSBkdHMudmFsdWUgLyB0aW1lX2Jhc2VfbnVtIC0gZHRzX2RlbHRhOworICAgIHBrdC0+c2l6ZSA9IG91dF9idWZfc2l6ZTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogY29udGlndW91c19idWZfc2l6ZSBpcyAwIGlmIG5vdCBjb250aWd1b3VzLCBhbmQgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICogY29udGFpbmluZyBhbGwgcGxhbmVzIGlmIHNvLgorICovCitzdGF0aWMgaW50IGdldF9jdl9waXhlbF9pbmZvKAorICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICBjb25zdCBBVkZyYW1lICAqZnJhbWUsCisgICAgaW50ICAgICAgICAgICAgKmNvbG9yLAorICAgIGludCAgICAgICAgICAgICpwbGFuZV9jb3VudCwKKyAgICBzaXplX3QgICAgICAgICAqd2lkdGhzLAorICAgIHNpemVfdCAgICAgICAgICpoZWlnaHRzLAorICAgIHNpemVfdCAgICAgICAgICpzdHJpZGVzLAorICAgIHNpemVfdCAgICAgICAgICpjb250aWd1b3VzX2J1Zl9zaXplKQoreworICAgIFZURW5jQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBhdl9mb3JtYXQgICAgICAgPSBmcmFtZS0+Zm9ybWF0OworICAgIGludCBhdl9jb2xvcl9yYW5nZSAgPSBmcmFtZS0+Y29sb3JfcmFuZ2U7CisgICAgaW50IGk7CisgICAgaW50IHJhbmdlX2d1ZXNzZWQ7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IGdldF9jdl9waXhlbF9mb3JtYXQoYXZjdHgsIGF2X2Zvcm1hdCwgYXZfY29sb3JfcmFuZ2UsIGNvbG9yLCAmcmFuZ2VfZ3Vlc3NlZCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBhdl9sb2coYXZjdHgsCisgICAgICAgICAgICBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAiQ291bGQgbm90IGdldCBwaXhlbCBmb3JtYXQgZm9yIGNvbG9yIGZvcm1hdCAnJXMnIHJhbmdlICclcycuXG4iLAorICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShhdl9mb3JtYXQpLAorICAgICAgICAgICAgYXZfY29sb3JfcmFuZ2UgPiBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCAmJgorICAgICAgICAgICAgYXZfY29sb3JfcmFuZ2UgPCBBVkNPTF9SQU5HRV9OQiA/CisgICAgICAgICAgICAgICBhdl9jb2xvcl9yYW5nZV9uYW1lKGF2X2NvbG9yX3JhbmdlKSA6CisgICAgICAgICAgICAgICAiVW5rbm93biIpOworCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHJhbmdlX2d1ZXNzZWQpIHsKKyAgICAgICAgaWYgKCF2dGN0eC0+d2FybmVkX2NvbG9yX3JhbmdlKSB7CisgICAgICAgICAgICB2dGN0eC0+d2FybmVkX2NvbG9yX3JhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwKKyAgICAgICAgICAgICAgICAgICBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiQ29sb3IgcmFuZ2Ugbm90IHNldCBmb3IgJXMuIFVzaW5nIE1QRUcgcmFuZ2UuXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoYXZfZm9ybWF0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2ggKGF2X2Zvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICAqcGxhbmVfY291bnQgPSAyOworCisgICAgICAgIHdpZHRocyBbMF0gPSBhdmN0eC0+d2lkdGg7CisgICAgICAgIGhlaWdodHNbMF0gPSBhdmN0eC0+aGVpZ2h0OworICAgICAgICBzdHJpZGVzWzBdID0gZnJhbWUgPyBmcmFtZS0+bGluZXNpemVbMF0gOiBhdmN0eC0+d2lkdGg7CisKKyAgICAgICAgd2lkdGhzIFsxXSA9IChhdmN0eC0+d2lkdGggICsgMSkgLyAyOworICAgICAgICBoZWlnaHRzWzFdID0gKGF2Y3R4LT5oZWlnaHQgKyAxKSAvIDI7CisgICAgICAgIHN0cmlkZXNbMV0gPSBmcmFtZSA/IGZyYW1lLT5saW5lc2l6ZVsxXSA6IChhdmN0eC0+d2lkdGggKyAxKSAmIC0yOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICAqcGxhbmVfY291bnQgPSAzOworCisgICAgICAgIHdpZHRocyBbMF0gPSBhdmN0eC0+d2lkdGg7CisgICAgICAgIGhlaWdodHNbMF0gPSBhdmN0eC0+aGVpZ2h0OworICAgICAgICBzdHJpZGVzWzBdID0gZnJhbWUgPyBmcmFtZS0+bGluZXNpemVbMF0gOiBhdmN0eC0+d2lkdGg7CisKKyAgICAgICAgd2lkdGhzIFsxXSA9IChhdmN0eC0+d2lkdGggICsgMSkgLyAyOworICAgICAgICBoZWlnaHRzWzFdID0gKGF2Y3R4LT5oZWlnaHQgKyAxKSAvIDI7CisgICAgICAgIHN0cmlkZXNbMV0gPSBmcmFtZSA/IGZyYW1lLT5saW5lc2l6ZVsxXSA6IChhdmN0eC0+d2lkdGggKyAxKSAvIDI7CisKKyAgICAgICAgd2lkdGhzIFsyXSA9IChhdmN0eC0+d2lkdGggICsgMSkgLyAyOworICAgICAgICBoZWlnaHRzWzJdID0gKGF2Y3R4LT5oZWlnaHQgKyAxKSAvIDI7CisgICAgICAgIHN0cmlkZXNbMl0gPSBmcmFtZSA/IGZyYW1lLT5saW5lc2l6ZVsyXSA6IChhdmN0eC0+d2lkdGggKyAxKSAvIDI7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKAorICAgICAgICAgICAgICAgYXZjdHgsCisgICAgICAgICAgICAgICBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBmcmFtZSBmb3JtYXQgaW5mbyBmb3IgY29sb3IgJWQgcmFuZ2UgJWQuXG4iLAorICAgICAgICAgICAgICAgYXZfZm9ybWF0LAorICAgICAgICAgICAgICAgYXZfY29sb3JfcmFuZ2UpOworCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgKmNvbnRpZ3VvdXNfYnVmX3NpemUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAqcGxhbmVfY291bnQ7IGkrKykgeworICAgICAgICBpZiAoaSA8ICpwbGFuZV9jb3VudCAtIDEgJiYKKyAgICAgICAgICAgIGZyYW1lLT5kYXRhW2ldICsgc3RyaWRlc1tpXSAqIGhlaWdodHNbaV0gIT0gZnJhbWUtPmRhdGFbaSArIDFdKSB7CisgICAgICAgICAgICAqY29udGlndW91c19idWZfc2l6ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgICpjb250aWd1b3VzX2J1Zl9zaXplICs9IHN0cmlkZXNbaV0gKiBoZWlnaHRzW2ldOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjaWYgIVRBUkdFVF9PU19JUEhPTkUKKy8vTm90IHVzZWQgb24gaU9TIC0gZnJhbWUgaXMgYWx3YXlzIGNvcGllZC4KK3N0YXRpYyB2b2lkIGZyZWVfYXZmcmFtZSgKKyAgICB2b2lkICAgICAgICpyZWxlYXNlX2N0eCwKKyAgICBjb25zdCB2b2lkICpkYXRhLAorICAgIHNpemVfdCAgICAgIHNpemUsCisgICAgc2l6ZV90ICAgICAgcGxhbmVfY291bnQsCisgICAgY29uc3Qgdm9pZCAqcGxhbmVfYWRkcmVzc2VzW10pCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSByZWxlYXNlX2N0eDsKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7Cit9CisjZWxzZQorLy9Ob3QgdXNlZCBvbiBPU1ggLSBmcmFtZSBpcyBuZXZlciBjb3BpZWQuCitzdGF0aWMgaW50IGNvcHlfYXZmcmFtZV90b19waXhlbF9idWZmZXIoQVZDb2RlY0NvbnRleHQgICAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAgICAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZQaXhlbEJ1ZmZlclJlZiBjdl9pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICAgICAqcGxhbmVfc3RyaWRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgICAgICpwbGFuZV9yb3dzKQoreworICAgIGludCBpLCBqOworICAgIHNpemVfdCBwbGFuZV9jb3VudDsKKyAgICBpbnQgc3RhdHVzOworICAgIGludCByb3dzOworICAgIGludCBzcmNfc3RyaWRlOworICAgIGludCBkc3Rfc3RyaWRlOworICAgIHVpbnQ4X3QgKnNyY19hZGRyOworICAgIHVpbnQ4X3QgKmRzdF9hZGRyOworICAgIHNpemVfdCBjb3B5X2J5dGVzOworCisgICAgc3RhdHVzID0gQ1ZQaXhlbEJ1ZmZlckxvY2tCYXNlQWRkcmVzcyhjdl9pbWcsIDApOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgYXZfbG9nKAorICAgICAgICAgICAgYXZjdHgsCisgICAgICAgICAgICBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAiRXJyb3I6IENvdWxkIG5vdCBsb2NrIGJhc2UgYWRkcmVzcyBvZiBDVlBpeGVsQnVmZmVyOiAlZC5cbiIsCisgICAgICAgICAgICBzdGF0dXMKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBpZiAoQ1ZQaXhlbEJ1ZmZlcklzUGxhbmFyKGN2X2ltZykpIHsKKyAgICAgICAgcGxhbmVfY291bnQgPSBDVlBpeGVsQnVmZmVyR2V0UGxhbmVDb3VudChjdl9pbWcpOworICAgICAgICBmb3IgKGkgPSAwOyBmcmFtZS0+ZGF0YVtpXTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA9PSBwbGFuZV9jb3VudCkgeworICAgICAgICAgICAgICAgIENWUGl4ZWxCdWZmZXJVbmxvY2tCYXNlQWRkcmVzcyhjdl9pbWcsIDApOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRXJyb3I6IGRpZmZlcmVudCBudW1iZXIgb2YgcGxhbmVzIGluIEFWRnJhbWUgYW5kIENWUGl4ZWxCdWZmZXIuXG4iCisgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RfYWRkciA9ICh1aW50OF90KilDVlBpeGVsQnVmZmVyR2V0QmFzZUFkZHJlc3NPZlBsYW5lKGN2X2ltZywgaSk7CisgICAgICAgICAgICBzcmNfYWRkciA9ICh1aW50OF90KilmcmFtZS0+ZGF0YVtpXTsKKyAgICAgICAgICAgIGRzdF9zdHJpZGUgPSBDVlBpeGVsQnVmZmVyR2V0Qnl0ZXNQZXJSb3dPZlBsYW5lKGN2X2ltZywgaSk7CisgICAgICAgICAgICBzcmNfc3RyaWRlID0gcGxhbmVfc3RyaWRlc1tpXTsKKyAgICAgICAgICAgIHJvd3MgPSBwbGFuZV9yb3dzW2ldOworCisgICAgICAgICAgICBpZiAoZHN0X3N0cmlkZSA9PSBzcmNfc3RyaWRlKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdF9hZGRyLCBzcmNfYWRkciwgc3JjX3N0cmlkZSAqIHJvd3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3B5X2J5dGVzID0gZHN0X3N0cmlkZSA8IHNyY19zdHJpZGUgPyBkc3Rfc3RyaWRlIDogc3JjX3N0cmlkZTsKKworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByb3dzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdF9hZGRyICsgaiAqIGRzdF9zdHJpZGUsIHNyY19hZGRyICsgaiAqIHNyY19zdHJpZGUsIGNvcHlfYnl0ZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcmFtZS0+ZGF0YVsxXSkgeworICAgICAgICAgICAgQ1ZQaXhlbEJ1ZmZlclVubG9ja0Jhc2VBZGRyZXNzKGN2X2ltZywgMCk7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsCisgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJFcnJvcjogZGlmZmVyZW50IG51bWJlciBvZiBwbGFuZXMgaW4gQVZGcmFtZSBhbmQgbm9uLXBsYW5hciBDVlBpeGVsQnVmZmVyLlxuIgorICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKworICAgICAgICBkc3RfYWRkciA9ICh1aW50OF90KilDVlBpeGVsQnVmZmVyR2V0QmFzZUFkZHJlc3MoY3ZfaW1nKTsKKyAgICAgICAgc3JjX2FkZHIgPSAodWludDhfdCopZnJhbWUtPmRhdGFbMF07CisgICAgICAgIGRzdF9zdHJpZGUgPSBDVlBpeGVsQnVmZmVyR2V0Qnl0ZXNQZXJSb3coY3ZfaW1nKTsKKyAgICAgICAgc3JjX3N0cmlkZSA9IHBsYW5lX3N0cmlkZXNbMF07CisgICAgICAgIHJvd3MgPSBwbGFuZV9yb3dzWzBdOworCisgICAgICAgIGlmIChkc3Rfc3RyaWRlID09IHNyY19zdHJpZGUpIHsKKyAgICAgICAgICAgIG1lbWNweShkc3RfYWRkciwgc3JjX2FkZHIsIHNyY19zdHJpZGUgKiByb3dzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlfYnl0ZXMgPSBkc3Rfc3RyaWRlIDwgc3JjX3N0cmlkZSA/IGRzdF9zdHJpZGUgOiBzcmNfc3RyaWRlOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcm93czsgaisrKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdF9hZGRyICsgaiAqIGRzdF9zdHJpZGUsIHNyY19hZGRyICsgaiAqIHNyY19zdHJpZGUsIGNvcHlfYnl0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzID0gQ1ZQaXhlbEJ1ZmZlclVubG9ja0Jhc2VBZGRyZXNzKGN2X2ltZywgMCk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yOiBDb3VsZCBub3QgdW5sb2NrIENWUGl4ZWxCdWZmZXIgYmFzZSBhZGRyZXNzOiAlZC5cbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8vIVRBUkdFVF9PU19JUEhPTkUKKworc3RhdGljIGludCBjcmVhdGVfY3ZfcGl4ZWxfYnVmZmVyKEFWQ29kZWNDb250ZXh0ICAgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgICAgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWUGl4ZWxCdWZmZXJSZWYgKmN2X2ltZykKK3sKKyAgICBpbnQgcGxhbmVfY291bnQ7CisgICAgaW50IGNvbG9yOworICAgIHNpemVfdCB3aWR0aHMgW0FWX05VTV9EQVRBX1BPSU5URVJTXTsKKyAgICBzaXplX3QgaGVpZ2h0c1tBVl9OVU1fREFUQV9QT0lOVEVSU107CisgICAgc2l6ZV90IHN0cmlkZXNbQVZfTlVNX0RBVEFfUE9JTlRFUlNdOworICAgIGludCBzdGF0dXM7CisgICAgc2l6ZV90IGNvbnRpZ3VvdXNfYnVmX3NpemU7CisjaWYgVEFSR0VUX09TX0lQSE9ORQorICAgIENWUGl4ZWxCdWZmZXJQb29sUmVmIHBpeF9idWZfcG9vbDsKKyAgICBWVEVuY0NvbnRleHQqIHZ0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyNlbHNlCisgICAgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBwaXhfYnVmX2F0dGFjaG1lbnRzID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlTXV0YWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDRkFsbG9jYXRvckRlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZDb3B5U3RyaW5nRGljdGlvbmFyeUtleUNhbGxCYWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKTsKKworICAgIGlmICghcGl4X2J1Zl9hdHRhY2htZW50cykgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyNlbmRpZgorCisgICAgaWYgKGF2Y3R4LT5waXhfZm10ID09IEFWX1BJWF9GTVRfVklERU9UT09MQk9YKSB7CisgICAgICAgIGF2X2Fzc2VydDAoZnJhbWUtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1ZJREVPVE9PTEJPWCk7CisKKyAgICAgICAgKmN2X2ltZyA9IChDVlBpeGVsQnVmZmVyUmVmKWZyYW1lLT5kYXRhWzNdOworICAgICAgICBhdl9hc3NlcnQwKCpjdl9pbWcpOworCisgICAgICAgIENGUmV0YWluKCpjdl9pbWcpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBtZW1zZXQod2lkdGhzLCAgMCwgc2l6ZW9mKHdpZHRocykpOworICAgIG1lbXNldChoZWlnaHRzLCAwLCBzaXplb2YoaGVpZ2h0cykpOworICAgIG1lbXNldChzdHJpZGVzLCAwLCBzaXplb2Yoc3RyaWRlcykpOworCisgICAgc3RhdHVzID0gZ2V0X2N2X3BpeGVsX2luZm8oCisgICAgICAgIGF2Y3R4LAorICAgICAgICBmcmFtZSwKKyAgICAgICAgJmNvbG9yLAorICAgICAgICAmcGxhbmVfY291bnQsCisgICAgICAgIHdpZHRocywKKyAgICAgICAgaGVpZ2h0cywKKyAgICAgICAgc3RyaWRlcywKKyAgICAgICAgJmNvbnRpZ3VvdXNfYnVmX3NpemUKKyAgICApOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBhdl9sb2coCisgICAgICAgICAgICBhdmN0eCwKKyAgICAgICAgICAgIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICJFcnJvcjogQ2Fubm90IGNvbnZlcnQgZm9ybWF0ICVkIGNvbG9yX3JhbmdlICVkOiAlZFxuIiwKKyAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQsCisgICAgICAgICAgICBmcmFtZS0+Y29sb3JfcmFuZ2UsCisgICAgICAgICAgICBzdGF0dXMKKyAgICAgICAgKTsKKworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyNpZiBUQVJHRVRfT1NfSVBIT05FCisgICAgcGl4X2J1Zl9wb29sID0gVlRDb21wcmVzc2lvblNlc3Npb25HZXRQaXhlbEJ1ZmZlclBvb2wodnRjdHgtPnNlc3Npb24pOworICAgIGlmICghcGl4X2J1Zl9wb29sKSB7CisgICAgICAgIC8qIE9uIGlPUywgdGhlIFZUIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgd2hlbiB0aGUgQVBQIHN3aXRjaGVzIGZyb20KKyAgICAgICAgICogZm9yZWdyb3VuZCB0byBiYWNrZ3JvdW5kIGFuZCB2aWNlIHZlcnNhLiBGZXRjaCB0aGUgYWN0dWFsIGVycm9yIGNvZGUKKyAgICAgICAgICogb2YgdGhlIFZUIHNlc3Npb24gdG8gZGV0ZWN0IHRoYXQgY2FzZSBhbmQgcmVzdGFydCB0aGUgVlQgc2Vzc2lvbgorICAgICAgICAgKiBhY2NvcmRpbmdseS4gKi8KKyAgICAgICAgT1NTdGF0dXMgdnRzdGF0dXM7CisKKyAgICAgICAgdnRzdGF0dXMgPSBWVENvbXByZXNzaW9uU2Vzc2lvblByZXBhcmVUb0VuY29kZUZyYW1lcyh2dGN0eC0+c2Vzc2lvbik7CisgICAgICAgIGlmICh2dHN0YXR1cyA9PSBrVlRJbnZhbGlkU2Vzc2lvbkVycikgeworICAgICAgICAgICAgQ0ZSZWxlYXNlKHZ0Y3R4LT5zZXNzaW9uKTsKKyAgICAgICAgICAgIHZ0Y3R4LT5zZXNzaW9uID0gTlVMTDsKKyAgICAgICAgICAgIHN0YXR1cyA9IHZ0ZW5jX2NvbmZpZ3VyZV9lbmNvZGVyKGF2Y3R4KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkKKyAgICAgICAgICAgICAgICBwaXhfYnVmX3Bvb2wgPSBWVENvbXByZXNzaW9uU2Vzc2lvbkdldFBpeGVsQnVmZmVyUG9vbCh2dGN0eC0+c2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwaXhfYnVmX3Bvb2wpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBwaXhlbCBidWZmZXIgcG9vbC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlZUIHNlc3Npb24gcmVzdGFydGVkIGJlY2F1c2Ugb2YgYSAiCisgICAgICAgICAgICAgICAgICAgImtWVEludmFsaWRTZXNzaW9uRXJyIGVycm9yLlxuIik7CisgICAgfQorCisgICAgc3RhdHVzID0gQ1ZQaXhlbEJ1ZmZlclBvb2xDcmVhdGVQaXhlbEJ1ZmZlcihOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4X2J1Zl9wb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZfaW1nKTsKKworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgcGl4ZWwgYnVmZmVyIGZyb20gcG9vbDogJWQuXG4iLCBzdGF0dXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBjb3B5X2F2ZnJhbWVfdG9fcGl4ZWxfYnVmZmVyKGF2Y3R4LCBmcmFtZSwgKmN2X2ltZywgc3RyaWRlcywgaGVpZ2h0cyk7CisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBDRlJlbGVhc2UoKmN2X2ltZyk7CisgICAgICAgICpjdl9pbWcgPSBOVUxMOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyNlbHNlCisgICAgQVZGcmFtZSAqZW5jX2ZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWVuY19mcmFtZSkgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0YXR1cyA9IGF2X2ZyYW1lX3JlZihlbmNfZnJhbWUsIGZyYW1lKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmVuY19mcmFtZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3RhdHVzID0gQ1ZQaXhlbEJ1ZmZlckNyZWF0ZVdpdGhQbGFuYXJCeXRlcygKKyAgICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwKKyAgICAgICAgZW5jX2ZyYW1lLT53aWR0aCwKKyAgICAgICAgZW5jX2ZyYW1lLT5oZWlnaHQsCisgICAgICAgIGNvbG9yLAorICAgICAgICBOVUxMLAorICAgICAgICBjb250aWd1b3VzX2J1Zl9zaXplLAorICAgICAgICBwbGFuZV9jb3VudCwKKyAgICAgICAgKHZvaWQgKiopZW5jX2ZyYW1lLT5kYXRhLAorICAgICAgICB3aWR0aHMsCisgICAgICAgIGhlaWdodHMsCisgICAgICAgIHN0cmlkZXMsCisgICAgICAgIGZyZWVfYXZmcmFtZSwKKyAgICAgICAgZW5jX2ZyYW1lLAorICAgICAgICBOVUxMLAorICAgICAgICBjdl9pbWcKKyAgICApOworCisgICAgYWRkX2NvbG9yX2F0dHIoYXZjdHgsIHBpeF9idWZfYXR0YWNobWVudHMpOworICAgIENWQnVmZmVyU2V0QXR0YWNobWVudHMoKmN2X2ltZywgcGl4X2J1Zl9hdHRhY2htZW50cywga0NWQXR0YWNobWVudE1vZGVfU2hvdWxkUHJvcGFnYXRlKTsKKyAgICBDRlJlbGVhc2UocGl4X2J1Zl9hdHRhY2htZW50cyk7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3I6IENvdWxkIG5vdCBjcmVhdGUgQ1ZQaXhlbEJ1ZmZlcjogJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2VuY29kZXJfZGljdF9oMjY0KGNvbnN0IEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmKiBkaWN0X291dCkKK3sKKyAgICBDRkRpY3Rpb25hcnlSZWYgZGljdCA9IE5VTEw7CisgICAgaWYgKGZyYW1lLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX0kpIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqa2V5c1tdID0geyBrVlRFbmNvZGVGcmFtZU9wdGlvbktleV9Gb3JjZUtleUZyYW1lIH07CisgICAgICAgIGNvbnN0IHZvaWQgKnZhbHNbXSA9IHsga0NGQm9vbGVhblRydWUgfTsKKworICAgICAgICBkaWN0ID0gQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXMsIHZhbHMsIDEsIE5VTEwsIE5VTEwpOworICAgICAgICBpZighZGljdCkgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICAqZGljdF9vdXQgPSBkaWN0OworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ0ZW5jX3NlbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZURW5jQ29udGV4dCAgICp2dGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICAqZnJhbWUpCit7CisgICAgQ01UaW1lIHRpbWU7CisgICAgQ0ZEaWN0aW9uYXJ5UmVmIGZyYW1lX2RpY3Q7CisgICAgQ1ZQaXhlbEJ1ZmZlclJlZiBjdl9pbWcgPSBOVUxMOworICAgIEFWRnJhbWVTaWRlRGF0YSAqc2lkZV9kYXRhID0gTlVMTDsKKyAgICBFeHRyYVNFSSAqc2VpID0gTlVMTDsKKyAgICBpbnQgc3RhdHVzID0gY3JlYXRlX2N2X3BpeGVsX2J1ZmZlcihhdmN0eCwgZnJhbWUsICZjdl9pbWcpOworCisgICAgaWYgKHN0YXR1cykgcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1cyA9IGNyZWF0ZV9lbmNvZGVyX2RpY3RfaDI2NChmcmFtZSwgJmZyYW1lX2RpY3QpOworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKGN2X2ltZyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc2lkZV9kYXRhID0gYXZfZnJhbWVfZ2V0X3NpZGVfZGF0YShmcmFtZSwgQVZfRlJBTUVfREFUQV9BNTNfQ0MpOworICAgIGlmICh2dGN0eC0+YTUzX2NjICYmIHNpZGVfZGF0YSAmJiBzaWRlX2RhdGEtPnNpemUpIHsKKyAgICAgICAgc2VpID0gYXZfbWFsbG9jeihzaXplb2YoKnNlaSkpOworICAgICAgICBpZiAoIXNlaSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY2xvc2VkIGNhcHRpb25zLCBza2lwcGluZ1xuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gZmZfYWxsb2NfYTUzX3NlaShmcmFtZSwgMCwgJnNlaS0+ZGF0YSwgJnNlaS0+c2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGNsb3NlZCBjYXB0aW9ucywgc2tpcHBpbmdcbiIpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoc2VpKTsKKyAgICAgICAgICAgICAgICBzZWkgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdGltZSA9IENNVGltZU1ha2UoZnJhbWUtPnB0cyAqIGF2Y3R4LT50aW1lX2Jhc2UubnVtLCBhdmN0eC0+dGltZV9iYXNlLmRlbik7CisgICAgc3RhdHVzID0gVlRDb21wcmVzc2lvblNlc3Npb25FbmNvZGVGcmFtZSgKKyAgICAgICAgdnRjdHgtPnNlc3Npb24sCisgICAgICAgIGN2X2ltZywKKyAgICAgICAgdGltZSwKKyAgICAgICAga0NNVGltZUludmFsaWQsCisgICAgICAgIGZyYW1lX2RpY3QsCisgICAgICAgIHNlaSwKKyAgICAgICAgTlVMTAorICAgICk7CisKKyAgICBpZiAoZnJhbWVfZGljdCkgQ0ZSZWxlYXNlKGZyYW1lX2RpY3QpOworICAgIENGUmVsZWFzZShjdl9pbWcpOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yOiBjYW5ub3QgZW5jb2RlIGZyYW1lOiAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB2dGVuY19mcmFtZSgKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgQVZQYWNrZXQgICAgICAgKnBrdCwKKyAgICBjb25zdCBBVkZyYW1lICAqZnJhbWUsCisgICAgaW50ICAgICAgICAgICAgKmdvdF9wYWNrZXQpCit7CisgICAgVlRFbmNDb250ZXh0ICp2dGN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYm9vbCBnZXRfZnJhbWU7CisgICAgaW50IHN0YXR1czsKKyAgICBDTVNhbXBsZUJ1ZmZlclJlZiBidWYgPSBOVUxMOworICAgIEV4dHJhU0VJICpzZWkgPSBOVUxMOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIHN0YXR1cyA9IHZ0ZW5jX3NlbmRfZnJhbWUoYXZjdHgsIHZ0Y3R4LCBmcmFtZSk7CisKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgc3RhdHVzID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgICAgIGdvdG8gZW5kX25vcGt0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZ0Y3R4LT5mcmFtZV9jdF9pbiA9PSAwKSB7CisgICAgICAgICAgICB2dGN0eC0+Zmlyc3RfcHRzID0gZnJhbWUtPnB0czsKKyAgICAgICAgfSBlbHNlIGlmKHZ0Y3R4LT5mcmFtZV9jdF9pbiA9PSAxICYmIHZ0Y3R4LT5oYXNfYl9mcmFtZXMpIHsKKyAgICAgICAgICAgIHZ0Y3R4LT5kdHNfZGVsdGEgPSBmcmFtZS0+cHRzIC0gdnRjdHgtPmZpcnN0X3B0czsKKyAgICAgICAgfQorCisgICAgICAgIHZ0Y3R4LT5mcmFtZV9jdF9pbisrOworICAgIH0gZWxzZSBpZighdnRjdHgtPmZsdXNoaW5nKSB7CisgICAgICAgIHZ0Y3R4LT5mbHVzaGluZyA9IHRydWU7CisKKyAgICAgICAgc3RhdHVzID0gVlRDb21wcmVzc2lvblNlc3Npb25Db21wbGV0ZUZyYW1lcyh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ01UaW1lSW5kZWZpbml0ZSk7CisKKyAgICAgICAgaWYgKHN0YXR1cykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBmbHVzaGluZyBmcmFtZXM6ICVkXG4iLCBzdGF0dXMpOworICAgICAgICAgICAgc3RhdHVzID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgICAgIGdvdG8gZW5kX25vcGt0OworICAgICAgICB9CisgICAgfQorCisgICAgKmdvdF9wYWNrZXQgPSAwOworICAgIGdldF9mcmFtZSA9IHZ0Y3R4LT5kdHNfZGVsdGEgPj0gMCB8fCAhZnJhbWU7CisgICAgaWYgKCFnZXRfZnJhbWUpIHsKKyAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgZ290byBlbmRfbm9wa3Q7CisgICAgfQorCisgICAgc3RhdHVzID0gdnRlbmNfcV9wb3AodnRjdHgsICFmcmFtZSwgJmJ1ZiwgJnNlaSk7CisgICAgaWYgKHN0YXR1cykgZ290byBlbmRfbm9wa3Q7CisgICAgaWYgKCFidWYpICAgZ290byBlbmRfbm9wa3Q7CisKKyAgICBzdGF0dXMgPSB2dGVuY19jbV90b19hdnBhY2tldChhdmN0eCwgYnVmLCBwa3QsIHNlaSk7CisgICAgaWYgKHNlaSkgeworICAgICAgICBpZiAoc2VpLT5kYXRhKSBhdl9mcmVlKHNlaS0+ZGF0YSk7CisgICAgICAgIGF2X2ZyZWUoc2VpKTsKKyAgICB9CisgICAgQ0ZSZWxlYXNlKGJ1Zik7CisgICAgaWYgKHN0YXR1cykgZ290byBlbmRfbm9wa3Q7CisKKyAgICAqZ290X3BhY2tldCA9IDE7CisgICAgcmV0dXJuIDA7CisKK2VuZF9ub3BrdDoKKyAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IHZ0ZW5jX3BvcHVsYXRlX2V4dHJhZGF0YShBVkNvZGVjQ29udGV4dCAgICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNVmlkZW9Db2RlY1R5cGUgY29kZWNfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmICAgICAgcHJvZmlsZV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGTnVtYmVyUmVmICAgICAgZ2FtbWFfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRpY3Rpb25hcnlSZWYgIGVuY19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZEaWN0aW9uYXJ5UmVmICBwaXhlbF9idWZmZXJfaW5mbykKK3sKKyAgICBWVEVuY0NvbnRleHQgKnZ0Y3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaW50IHlfc2l6ZSA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQ7CisgICAgaW50IGNocm9tYV9zaXplID0gKGF2Y3R4LT53aWR0aCAvIDIpICogKGF2Y3R4LT5oZWlnaHQgLyAyKTsKKyAgICBDTVNhbXBsZUJ1ZmZlclJlZiBidWYgPSBOVUxMOworICAgIGludCBzdGF0dXM7CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWUtPmJ1ZlswXSA9IGF2X2J1ZmZlcl9hbGxvYyh5X3NpemUgKyAyICogY2hyb21hX3NpemUpOworCisgICAgaWYoIWZyYW1lLT5idWZbMF0peworICAgICAgICBzdGF0dXMgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gcGVfY2xlYW51cDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSB2dGVuY19jcmVhdGVfZW5jb2RlcihhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2FtbWFfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxfYnVmZmVyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZ0Y3R4LT5zZXNzaW9uKTsKKyAgICBpZiAoc3RhdHVzKQorICAgICAgICBnb3RvIHBlX2NsZWFudXA7CisKKyAgICBmcmFtZS0+ZGF0YVswXSA9IGZyYW1lLT5idWZbMF0tPmRhdGE7CisgICAgbWVtc2V0KGZyYW1lLT5kYXRhWzBdLCAgIDAsICAgICAgeV9zaXplKTsKKworICAgIGZyYW1lLT5kYXRhWzFdID0gZnJhbWUtPmJ1ZlswXS0+ZGF0YSArIHlfc2l6ZTsKKyAgICBtZW1zZXQoZnJhbWUtPmRhdGFbMV0sIDEyOCwgY2hyb21hX3NpemUpOworCisKKyAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSB7CisgICAgICAgIGZyYW1lLT5kYXRhWzJdID0gZnJhbWUtPmJ1ZlswXS0+ZGF0YSArIHlfc2l6ZSArIGNocm9tYV9zaXplOworICAgICAgICBtZW1zZXQoZnJhbWUtPmRhdGFbMl0sIDEyOCwgY2hyb21hX3NpemUpOworICAgIH0KKworICAgIGZyYW1lLT5saW5lc2l6ZVswXSA9IGF2Y3R4LT53aWR0aDsKKworICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApIHsKKyAgICAgICAgZnJhbWUtPmxpbmVzaXplWzFdID0KKyAgICAgICAgZnJhbWUtPmxpbmVzaXplWzJdID0gKGF2Y3R4LT53aWR0aCArIDEpIC8gMjsKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZS0+bGluZXNpemVbMV0gPSAoYXZjdHgtPndpZHRoICsgMSkgLyAyOworICAgIH0KKworICAgIGZyYW1lLT5mb3JtYXQgICAgICAgICAgPSBhdmN0eC0+cGl4X2ZtdDsKKyAgICBmcmFtZS0+d2lkdGggICAgICAgICAgID0gYXZjdHgtPndpZHRoOworICAgIGZyYW1lLT5oZWlnaHQgICAgICAgICAgPSBhdmN0eC0+aGVpZ2h0OworICAgIGZyYW1lLT5jb2xvcnNwYWNlICAgICAgPSBhdmN0eC0+Y29sb3JzcGFjZTsKKyAgICBmcmFtZS0+Y29sb3JfcmFuZ2UgICAgID0gYXZjdHgtPmNvbG9yX3JhbmdlOworICAgIGZyYW1lLT5jb2xvcl90cmMgICAgICAgPSBhdmN0eC0+Y29sb3JfdHJjOworICAgIGZyYW1lLT5jb2xvcl9wcmltYXJpZXMgPSBhdmN0eC0+Y29sb3JfcHJpbWFyaWVzOworCisgICAgZnJhbWUtPnB0cyA9IDA7CisgICAgc3RhdHVzID0gdnRlbmNfc2VuZF9mcmFtZShhdmN0eCwgdnRjdHgsIGZyYW1lKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc2VuZGluZyBmcmFtZTogJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIGdvdG8gcGVfY2xlYW51cDsKKyAgICB9CisKKyAgICAvL1BvcHVsYXRlcyBleHRyYWRhdGEgLSBvdXRwdXQgZnJhbWVzIGFyZSBmbHVzaGVkIGFuZCBwYXJhbSBzZXRzIGFyZSBhdmFpbGFibGUuCisgICAgc3RhdHVzID0gVlRDb21wcmVzc2lvblNlc3Npb25Db21wbGV0ZUZyYW1lcyh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDTVRpbWVJbmRlZmluaXRlKTsKKworICAgIGlmIChzdGF0dXMpCisgICAgICAgIGdvdG8gcGVfY2xlYW51cDsKKworICAgIHN0YXR1cyA9IHZ0ZW5jX3FfcG9wKHZ0Y3R4LCAwLCAmYnVmLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAicG9wcGluZzogJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIGdvdG8gcGVfY2xlYW51cDsKKyAgICB9CisKKyAgICBDRlJlbGVhc2UoYnVmKTsKKworCisKK3BlX2NsZWFudXA6CisgICAgaWYodnRjdHgtPnNlc3Npb24pCisgICAgICAgIENGUmVsZWFzZSh2dGN0eC0+c2Vzc2lvbik7CisKKyAgICB2dGN0eC0+c2Vzc2lvbiA9IE5VTEw7CisgICAgdnRjdHgtPmZyYW1lX2N0X291dCA9IDA7CisKKyAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworCisgICAgYXZfYXNzZXJ0MChzdGF0dXMgIT0gMCB8fCAoYXZjdHgtPmV4dHJhZGF0YSAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPiAwKSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdnRlbmNfY2xvc2UoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFZURW5jQ29udGV4dCAqdnRjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnZ0Y3R4LT5jdl9zYW1wbGVfc2VudCk7CisgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZ2dGN0eC0+bG9jayk7CisKKyAgICBpZighdnRjdHgtPnNlc3Npb24pIHJldHVybiAwOworCisgICAgVlRDb21wcmVzc2lvblNlc3Npb25Db21wbGV0ZUZyYW1lcyh2dGN0eC0+c2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDTVRpbWVJbmRlZmluaXRlKTsKKyAgICBjbGVhcl9mcmFtZV9xdWV1ZSh2dGN0eCk7CisgICAgQ0ZSZWxlYXNlKHZ0Y3R4LT5zZXNzaW9uKTsKKyAgICB2dGN0eC0+c2Vzc2lvbiA9IE5VTEw7CisKKyAgICBpZiAodnRjdHgtPmNvbG9yX3ByaW1hcmllcykgeworICAgICAgICBDRlJlbGVhc2UodnRjdHgtPmNvbG9yX3ByaW1hcmllcyk7CisgICAgICAgIHZ0Y3R4LT5jb2xvcl9wcmltYXJpZXMgPSBOVUxMOworICAgIH0KKworICAgIGlmICh2dGN0eC0+dHJhbnNmZXJfZnVuY3Rpb24pIHsKKyAgICAgICAgQ0ZSZWxlYXNlKHZ0Y3R4LT50cmFuc2Zlcl9mdW5jdGlvbik7CisgICAgICAgIHZ0Y3R4LT50cmFuc2Zlcl9mdW5jdGlvbiA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHZ0Y3R4LT55Y2Jjcl9tYXRyaXgpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKHZ0Y3R4LT55Y2Jjcl9tYXRyaXgpOworICAgICAgICB2dGN0eC0+eWNiY3JfbWF0cml4ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfVklERU9UT09MQk9YLAorICAgIEFWX1BJWF9GTVRfTlYxMiwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCisjZGVmaW5lIFZFIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KKyNkZWZpbmUgQ09NTU9OX09QVElPTlMgXAorICAgIHsgImFsbG93X3N3IiwgIkFsbG93IHNvZnR3YXJlIGVuY29kaW5nIiwgT0ZGU0VUKGFsbG93X3N3KSwgQVZfT1BUX1RZUEVfQk9PTCwgXAorICAgICAgICB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sIFwKKyAgICB7ICJyZWFsdGltZSIsICJIaW50IHRoYXQgZW5jb2Rpbmcgc2hvdWxkIGhhcHBlbiBpbiByZWFsLXRpbWUgaWYgbm90IGZhc3RlciAoZS5nLiBjYXB0dXJpbmcgZnJvbSBjYW1lcmEpLiIsIFwKKyAgICAgICAgT0ZGU0VUKHJlYWx0aW1lKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBWRSB9LCBcCisgICAgeyAiZnJhbWVzX2JlZm9yZSIsICJPdGhlciBmcmFtZXMgd2lsbCBjb21lIGJlZm9yZSB0aGUgZnJhbWVzIGluIHRoaXMgc2Vzc2lvbi4gVGhpcyBoZWxwcyBzbW9vdGggY29uY2F0ZW5hdGlvbiBpc3N1ZXMuIiwgXAorICAgICAgICBPRkZTRVQoZnJhbWVzX2JlZm9yZSksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkUgfSwgXAorICAgIHsgImZyYW1lc19hZnRlciIsICJPdGhlciBmcmFtZXMgd2lsbCBjb21lIGFmdGVyIHRoZSBmcmFtZXMgaW4gdGhpcyBzZXNzaW9uLiBUaGlzIGhlbHBzIHNtb290aCBjb25jYXRlbmF0aW9uIGlzc3Vlcy4iLCBcCisgICAgICAgIE9GRlNFVChmcmFtZXNfYWZ0ZXIpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIFZFIH0sCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFZURW5jQ29udGV4dCwgeCkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBoMjY0X29wdGlvbnNbXSA9IHsKKyAgICB7ICJwcm9maWxlIiwgIlByb2ZpbGUiLCBPRkZTRVQocHJvZmlsZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gSDI2NF9QUk9GX0FVVE8gfSwgSDI2NF9QUk9GX0FVVE8sIEgyNjRfUFJPRl9DT1VOVCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgImJhc2VsaW5lIiwgIkJhc2VsaW5lIFByb2ZpbGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gSDI2NF9QUk9GX0JBU0VMSU5FIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAicHJvZmlsZSIgfSwKKyAgICB7ICJtYWluIiwgICAgICJNYWluIFByb2ZpbGUiLCAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEgyNjRfUFJPRl9NQUlOICAgICB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgInByb2ZpbGUiIH0sCisgICAgeyAiaGlnaCIsICAgICAiSGlnaCBQcm9maWxlIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBIMjY0X1BST0ZfSElHSCAgICAgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJwcm9maWxlIiB9LAorCisgICAgeyAibGV2ZWwiLCAiTGV2ZWwiLCBPRkZTRVQobGV2ZWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgNTIsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiMS4zIiwgIkxldmVsIDEuMywgb25seSBhdmFpbGFibGUgd2l0aCBCYXNlbGluZSBQcm9maWxlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDEzIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiMy4wIiwgIkxldmVsIDMuMCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAzMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImxldmVsIiB9LAorICAgIHsgIjMuMSIsICJMZXZlbCAzLjEiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMzEgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICIzLjIiLCAiTGV2ZWwgMy4yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDMyIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiNC4wIiwgIkxldmVsIDQuMCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSA0MCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImxldmVsIiB9LAorICAgIHsgIjQuMSIsICJMZXZlbCA0LjEiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gNDEgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI0LjIiLCAiTGV2ZWwgNC4yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDQyIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAibGV2ZWwiIH0sCisgICAgeyAiNS4wIiwgIkxldmVsIDUuMCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSA1MCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImxldmVsIiB9LAorICAgIHsgIjUuMSIsICJMZXZlbCA1LjEiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gNTEgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJsZXZlbCIgfSwKKyAgICB7ICI1LjIiLCAiTGV2ZWwgNS4yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDUyIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAibGV2ZWwiIH0sCisKKyAgICB7ICJjb2RlciIsICJFbnRyb3B5IGNvZGluZyIsIE9GRlNFVChlbnRyb3B5KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBWVF9FTlRST1BZX05PVF9TRVQgfSwgVlRfRU5UUk9QWV9OT1RfU0VULCBWVF9DQUJBQywgVkUsICJjb2RlciIgfSwKKyAgICB7ICJjYXZsYyIsICJDQVZMQyBlbnRyb3B5IGNvZGluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBWVF9DQVZMQyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImNvZGVyIiB9LAorICAgIHsgInZsYyIsICAgIkNBVkxDIGVudHJvcHkgY29kaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFZUX0NBVkxDIH0sIElOVF9NSU4sIElOVF9NQVgsIFZFLCAiY29kZXIiIH0sCisgICAgeyAiY2FiYWMiLCAiQ0FCQUMgZW50cm9weSBjb2RpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVlRfQ0FCQUMgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJjb2RlciIgfSwKKyAgICB7ICJhYyIsICAgICJDQUJBQyBlbnRyb3B5IGNvZGluZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBWVF9DQUJBQyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgImNvZGVyIiB9LAorCisgICAgeyAiYTUzY2MiLCAiVXNlIEE1MyBDbG9zZWQgQ2FwdGlvbnMgKGlmIGF2YWlsYWJsZSkiLCBPRkZTRVQoYTUzX2NjKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAxfSwgMCwgMSwgVkUgfSwKKworICAgIENPTU1PTl9PUFRJT05TCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBoMjY0X3ZpZGVvdG9vbGJveF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJoMjY0X3ZpZGVvdG9vbGJveCIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGgyNjRfb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWQ29kZWMgZmZfaDI2NF92aWRlb3Rvb2xib3hfZW5jb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICA9ICJoMjY0X3ZpZGVvdG9vbGJveCIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVmlkZW9Ub29sYm94IEguMjY0IEVuY29kZXIiKSwKKyAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoVlRFbmNDb250ZXh0KSwKKyAgICAucGl4X2ZtdHMgICAgICAgICA9IHBpeF9mbXRzLAorICAgIC5pbml0ICAgICAgICAgICAgID0gdnRlbmNfaW5pdCwKKyAgICAuZW5jb2RlMiAgICAgICAgICA9IHZ0ZW5jX2ZyYW1lLAorICAgIC5jbG9zZSAgICAgICAgICAgID0gdnRlbmNfY2xvc2UsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBBVl9DT0RFQ19DQVBfREVMQVksCisgICAgLnByaXZfY2xhc3MgICAgICAgPSAmaDI2NF92aWRlb3Rvb2xib3hfY2xhc3MsCisgICAgLmNhcHNfaW50ZXJuYWwgICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZGX0NPREVDX0NBUF9JTklUX0NMRUFOVVAsCit9OworCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaGV2Y19vcHRpb25zW10gPSB7CisgICAgeyAicHJvZmlsZSIsICJQcm9maWxlIiwgT0ZGU0VUKHByb2ZpbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEhFVkNfUFJPRl9BVVRPIH0sIEhFVkNfUFJPRl9BVVRPLCBIRVZDX1BST0ZfQ09VTlQsIFZFLCAicHJvZmlsZSIgfSwKKyAgICB7ICJtYWluIiwgICAgICJNYWluIFByb2ZpbGUiLCAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEhFVkNfUFJPRl9NQUlOICAgfSwgSU5UX01JTiwgSU5UX01BWCwgVkUsICJwcm9maWxlIiB9LAorICAgIHsgIm1haW4xMCIsICAgIk1haW4xMCBQcm9maWxlIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gSEVWQ19QUk9GX01BSU4xMCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBWRSwgInByb2ZpbGUiIH0sCisKKyAgICBDT01NT05fT1BUSU9OUworICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaGV2Y192aWRlb3Rvb2xib3hfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiaGV2Y192aWRlb3Rvb2xib3giLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBoZXZjX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVkNvZGVjIGZmX2hldmNfdmlkZW90b29sYm94X2VuY29kZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgPSAiaGV2Y192aWRlb3Rvb2xib3giLAorICAgIC5sb25nX25hbWUgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZpZGVvVG9vbGJveCBILjI2NSBFbmNvZGVyIiksCisgICAgLnR5cGUgICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmlkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IRVZDLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgID0gc2l6ZW9mKFZURW5jQ29udGV4dCksCisgICAgLnBpeF9mbXRzICAgICAgICAgPSBwaXhfZm10cywKKyAgICAuaW5pdCAgICAgICAgICAgICA9IHZ0ZW5jX2luaXQsCisgICAgLmVuY29kZTIgICAgICAgICAgPSB2dGVuY19mcmFtZSwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IHZ0ZW5jX2Nsb3NlLAorICAgIC5jYXBhYmlsaXRpZXMgICAgID0gQVZfQ09ERUNfQ0FQX0RFTEFZIHwgQVZfQ09ERUNfQ0FQX0hBUkRXQVJFLAorICAgIC5wcml2X2NsYXNzICAgICAgID0gJmhldmNfdmlkZW90b29sYm94X2NsYXNzLAorICAgIC5jYXBzX2ludGVybmFsICAgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSB8CisgICAgICAgICAgICAgICAgICAgICAgICBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAorICAgIC53cmFwcGVyX25hbWUgICAgID0gInZpZGVvdG9vbGJveCIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92bGMuaCBiL2xpYmF2Y29kZWMvdmxjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjY2RkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdmxjLmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWQ09ERUNfVkxDX0gKKyNkZWZpbmUgQVZDT0RFQ19WTENfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgVkxDX1RZUEUgaW50MTZfdAorCit0eXBlZGVmIHN0cnVjdCBWTEMgeworICAgIGludCBiaXRzOworICAgIFZMQ19UWVBFICgqdGFibGUpWzJdOyAvLy88IGNvZGUsIGJpdHMKKyAgICBpbnQgdGFibGVfc2l6ZSwgdGFibGVfYWxsb2NhdGVkOworfSBWTEM7CisKK3R5cGVkZWYgc3RydWN0IFJMX1ZMQ19FTEVNIHsKKyAgICBpbnQxNl90IGxldmVsOworICAgIGludDhfdCBsZW47CisgICAgdWludDhfdCBydW47Cit9IFJMX1ZMQ19FTEVNOworCisjZGVmaW5lIGluaXRfdmxjKHZsYywgbmJfYml0cywgbmJfY29kZXMsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgYml0cywgYml0c193cmFwLCBiaXRzX3NpemUsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICBjb2RlcywgY29kZXNfd3JhcCwgY29kZXNfc2l6ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGZsYWdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9pbml0X3ZsY19zcGFyc2UodmxjLCBuYl9iaXRzLCBuYl9jb2RlcywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzLCBiaXRzX3dyYXAsIGJpdHNfc2l6ZSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzLCBjb2Rlc193cmFwLCBjb2Rlc19zaXplLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCwgZmxhZ3MpCisKK2ludCBmZl9pbml0X3ZsY19zcGFyc2UoVkxDICp2bGMsIGludCBuYl9iaXRzLCBpbnQgbmJfY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJpdHMsIGludCBiaXRzX3dyYXAsIGludCBiaXRzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNvZGVzLCBpbnQgY29kZXNfd3JhcCwgaW50IGNvZGVzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnN5bWJvbHMsIGludCBzeW1ib2xzX3dyYXAsIGludCBzeW1ib2xzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7Cit2b2lkIGZmX2ZyZWVfdmxjKFZMQyAqdmxjKTsKKworI2RlZmluZSBJTklUX1ZMQ19MRSAgICAgICAgICAgICAyCisjZGVmaW5lIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDIDQKKworI2RlZmluZSBJTklUX1ZMQ19TUEFSU0VfU1RBVElDKHZsYywgYml0cywgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgc3RhdGljX3NpemUpIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljIFZMQ19UWVBFIHRhYmxlW3N0YXRpY19zaXplXVsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZsYyktPnRhYmxlICAgICAgICAgICA9IHRhYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHZsYyktPnRhYmxlX2FsbG9jYXRlZCA9IHN0YXRpY19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZfaW5pdF92bGNfc3BhcnNlKHZsYywgYml0cywgYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgaSwgaiwgICAgICAgIFwKKyAgICAgICAgICAgIElOSVRfVkxDX1VTRV9ORVdfU1RBVElDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIElOSVRfTEVfVkxDX1NQQVJTRV9TVEFUSUModmxjLCBiaXRzLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCBzdGF0aWNfc2l6ZSkgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWMgVkxDX1RZUEUgdGFibGVbc3RhdGljX3NpemVdWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmxjKS0+dGFibGUgICAgICAgICAgID0gdGFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAodmxjKS0+dGFibGVfYWxsb2NhdGVkID0gc3RhdGljX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmZl9pbml0X3ZsY19zcGFyc2UodmxjLCBiaXRzLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCBpLCBqLCAgICAgICAgXAorICAgICAgICAgICAgSU5JVF9WTENfVVNFX05FV19TVEFUSUMgfCBJTklUX1ZMQ19MRSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgSU5JVF9WTENfU1RBVElDKHZsYywgYml0cywgYSwgYiwgYywgZCwgZSwgZiwgZywgc3RhdGljX3NpemUpICAgICAgIFwKKyAgICBJTklUX1ZMQ19TUEFSU0VfU1RBVElDKHZsYywgYml0cywgYSwgYiwgYywgZCwgZSwgZiwgZywgTlVMTCwgMCwgMCwgc3RhdGljX3NpemUpCisKKyNkZWZpbmUgSU5JVF9MRV9WTENfU1RBVElDKHZsYywgYml0cywgYSwgYiwgYywgZCwgZSwgZiwgZywgc3RhdGljX3NpemUpIFwKKyAgICBJTklUX0xFX1ZMQ19TUEFSU0VfU1RBVElDKHZsYywgYml0cywgYSwgYiwgYywgZCwgZSwgZiwgZywgTlVMTCwgMCwgMCwgc3RhdGljX3NpemUpCisKKyNlbmRpZiAvKiBBVkNPREVDX1ZMQ19IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZtbmMuYyBiL2xpYmF2Y29kZWMvdm1uYy5jCmluZGV4IDQ5YWJiNzcuLjMwYjE0MTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdm1uYy5jCisrKyBiL2xpYmF2Y29kZWMvdm1uYy5jCkBAIC0yODcsMTcgKzI4NywyNCBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHJlY3RzOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlY3RfeCwgcmVjdF95LCByZWN0X3csIHJlY3RfaDsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgZmcgPSB2bW5jX2dldF9waXhlbChnYiwgYnBwLCBjLT5iaWdlbmRpYW4pOwogICAgICAgICAgICAgICAgICAgICB4eSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKICAgICAgICAgICAgICAgICAgICAgd2ggPSBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggICAoeHkgPj4gNCkgKyAod2ggPj4gNCkgKyAxID4gdyAtIGkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh4eSAmIDB4RikgKyAod2ggJiAweEYpKzEgPiBoIC0gaikgeworCisgICAgICAgICAgICAgICAgICAgIHJlY3RfeCA9IHh5ID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIHJlY3RfeSA9IHh5ICYgMHhGOworICAgICAgICAgICAgICAgICAgICByZWN0X3cgPSAod2ggPj4gNCkgKyAxOworICAgICAgICAgICAgICAgICAgICByZWN0X2ggPSAod2ggJiAweEYpICsgMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocmVjdF94ICsgcmVjdF93ID4gdyAtIGkgfHwgcmVjdF95ICsgcmVjdF9oID4gaCAtIGopIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVjdGFuZ2xlIG91dHNpZGUgcGljdHVyZVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBwYWludF9yZWN0KGRzdDIsIHh5ID4+IDQsIHh5ICYgMHhGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aD4+NCkrMSwgKHdoICYgMHhGKSsxLCBmZywgYnBwLCBzdHJpZGUpOworCisgICAgICAgICAgICAgICAgICAgIHBhaW50X3JlY3QoZHN0MiwgcmVjdF94LCByZWN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdF93LCByZWN0X2gsIGZnLCBicHAsIHN0cmlkZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNzQsNiArMzgxLDEyIEBACiAgICAgICAgIHcgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiKTsKICAgICAgICAgaCAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpOwogICAgICAgICBlbmMgPSBieXRlc3RyZWFtMl9nZXRfYmUzMihnYik7CisgICAgICAgIGlmICgoZHggKyB3ID4gYy0+d2lkdGgpIHx8IChkeSArIGggPiBjLT5oZWlnaHQpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkluY29ycmVjdCBmcmFtZSBzaXplOiAlaXglaSslaXglaSBvZiAlaXglaVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdywgaCwgZHgsIGR5LCBjLT53aWR0aCwgYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAgICAgICAgIG91dHB0ciA9IGMtPnBpYy0+ZGF0YVswXSArIGR4ICogYy0+YnBwMiArIGR5ICogYy0+cGljLT5saW5lc2l6ZVswXTsKICAgICAgICAgc2l6ZV9sZWZ0ID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpOwogICAgICAgICBzd2l0Y2ggKGVuYykgewpAQCAtNDUxLDEyICs0NjQsNiBAQAogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgMik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDAwMDAwMDAwOiAvLyByYXcgcmVjdGFuZ2xlIGRhdGEKLSAgICAgICAgICAgIGlmICgoZHggKyB3ID4gYy0+d2lkdGgpIHx8IChkeSArIGggPiBjLT5oZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3QgZnJhbWUgc2l6ZTogJWl4JWkrJWl4JWkgb2YgJWl4JWlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHcsIGgsIGR4LCBkeSwgYy0+d2lkdGgsIGMtPmhlaWdodCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoc2l6ZV9sZWZ0IDwgdyAqIGggKiBjLT5icHAyKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kIG9mIGRhdGEhIChuZWVkICVpIGdvdCAlaSlcbiIsCkBAIC00NjcsMTIgKzQ3NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgYy0+cGljLT5saW5lc2l6ZVswXSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDAwMDAwMDA1OiAvLyBIZXhUaWxlIGVuY29kZWQgcmVjdGFuZ2xlCi0gICAgICAgICAgICBpZiAoKGR4ICsgdyA+IGMtPndpZHRoKSB8fCAoZHkgKyBoID4gYy0+aGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGZyYW1lIHNpemU6ICVpeCVpKyVpeCVpIG9mICVpeCVpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICB3LCBoLCBkeCwgZHksIGMtPndpZHRoLCBjLT5oZWlnaHQpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVzID0gZGVjb2RlX2hleHRpbGUoYywgb3V0cHRyLCBnYiwgdywgaCwgYy0+cGljLT5saW5lc2l6ZVswXSk7CiAgICAgICAgICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92b3JiaXMuYyBiL2xpYmF2Y29kZWMvdm9yYmlzLmMKaW5kZXggODZkMTA0MC4uY2NhMmFhNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92b3JiaXMuYworKysgYi9saWJhdmNvZGVjL3ZvcmJpcy5jCkBAIC0yNiwxMCArMjYsOSBAQAogICogQGF1dGhvciBEZW5lcyBCYWxhdG9uaSAgKCBkYmFsYXRvbmkgcHJvZ3JhbW96byBodSApCiAgKi8KIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCi0jaW5jbHVkZSAiYXZjb2RlYy5oIgotI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogCisjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgInZvcmJpcy5oIgogCiAKQEAgLTU3LDE0ICs1Niw5IEBACiBpbnQgZmZfdm9yYmlzX2xlbjJ2bGModWludDhfdCAqYml0cywgdWludDMyX3QgKmNvZGVzLCB1bnNpZ25lZCBudW0pCiB7CiAgICAgdWludDMyX3QgZXhpdF9hdF9sZXZlbFszM10gPSB7IDQwNCB9OwotCiAgICAgdW5zaWduZWQgaSwgaiwgcCwgY29kZTsKIAotI2lmZGVmIERFQlVHCi0gICAgR2V0Qml0Q29udGV4dCBnYjsKLSNlbmRpZgotCi0gICAgZm9yIChwID0gMDsgKGJpdHNbcF0gPT0gMCkgJiYgKHAgPCBudW0pOyArK3ApCisgICAgZm9yIChwID0gMDsgKHAgPCBudW0pICYmIChiaXRzW3BdID09IDApOyArK3ApCiAgICAgICAgIDsKICAgICBpZiAocCA9PSBudW0pCiAgICAgICAgIHJldHVybiAwOwpAQCAtNzMsMTkgKzY3LDExIEBACiAgICAgaWYgKGJpdHNbcF0gPiAzMikKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgZm9yIChpID0gMDsgaSA8IGJpdHNbcF07ICsraSkKLSAgICAgICAgZXhpdF9hdF9sZXZlbFtpKzFdID0gMSA8PCBpOwotCi0jaWZkZWYgREVCVUcKLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgJXUuIG9mICV1IGNvZGUgbGVuICVkIGNvZGUgJWQgLSAiLCBwLCBudW0sIGJpdHNbcF0sIGNvZGVzW3BdKTsKLSAgICBpbml0X2dldF9iaXRzKCZnYiwgKHVpbnQ4X3QgKikmY29kZXNbcF0sIGJpdHNbcF0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBiaXRzW3BdOyArK2kpCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiVzIiwgZ2V0X2JpdHMxKCZnYikgPyAiMSIgOiAiMCIpOwotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7Ci0jZW5kaWYKKyAgICAgICAgZXhpdF9hdF9sZXZlbFtpKzFdID0gMXUgPDwgaTsKIAogICAgICsrcDsKIAotICAgIGZvciAoaSA9IHA7IChiaXRzW2ldID09IDApICYmIChpIDwgbnVtKTsgKytpKQorICAgIGZvciAoaSA9IHA7IChpIDwgbnVtKSAmJiAoYml0c1tpXSA9PSAwKTsgKytpKQogICAgICAgICA7CiAgICAgaWYgKGkgPT0gbnVtKQogICAgICAgICByZXR1cm4gMDsKQEAgLTEwNSwxNyArOTEsOCBAQAogICAgICAgICBleGl0X2F0X2xldmVsW2ldID0gMDsKICAgICAgICAgLy8gY29uc3RydWN0IGNvZGUgKGFwcGVuZCAwcyB0byBlbmQpIGFuZCBpbnRyb2R1Y2UgbmV3IGV4aXRzCiAgICAgICAgIGZvciAoaiA9IGkgKyAxIDtqIDw9IGJpdHNbcF07ICsraikKLSAgICAgICAgICAgIGV4aXRfYXRfbGV2ZWxbal0gPSBjb2RlICsgKDEgPDwgKGogLSAxKSk7CisgICAgICAgICAgICBleGl0X2F0X2xldmVsW2pdID0gY29kZSArICgxdSA8PCAoaiAtIDEpKTsKICAgICAgICAgY29kZXNbcF0gPSBjb2RlOwotCi0jaWZkZWYgREVCVUcKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICVkLiBjb2RlIGxlbiAlZCBjb2RlICVkIC0gIiwgcCwgYml0c1twXSwgY29kZXNbcF0pOwotICAgICAgICBpbml0X2dldF9iaXRzKCZnYiwgKHVpbnQ4X3QgKikmY29kZXNbcF0sIGJpdHNbcF0pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYml0c1twXTsgKytpKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJXMiLCBnZXRfYml0czEoJmdiKSA/ICIxIiA6ICIwIik7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7Ci0jZW5kaWYKLQogICAgIH0KIAogICAgIC8vbm8gZXhpdHMgc2hvdWxkIGJlIGxlZnQgKHVuZGVyc3BlY2lmaWVkIHRyZWUgLSBpZS4gdW51c2VkIHZhbGlkIHZsY3MgLSBub3QgYWxsb3dlZCBieSBTUEVDKQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92b3JiaXNfcGFyc2VyLmggYi9saWJhdmNvZGVjL3ZvcmJpc19wYXJzZXIuaAppbmRleCA4MWZkYTNiLi43ODk5MzJhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZvcmJpc19wYXJzZXIuaAorKysgYi9saWJhdmNvZGVjL3ZvcmJpc19wYXJzZXIuaApAQCAtMSw1ICsxLDQgQEAKIC8qCi0gKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKICAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTMzLDkgKzMyLDYgQEAKIAogLyoqCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgVm9yYmlzIHBhcnNlciB1c2luZyBoZWFkZXJzIGluIHRoZSBleHRyYWRhdGEuCi0gKgotICogQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKLSAqIEBwYXJhbSBzICAgICBWb3JiaXMgcGFyc2VyIGNvbnRleHQKICAqLwogQVZWb3JiaXNQYXJzZUNvbnRleHQgKmF2X3ZvcmJpc19wYXJzZV9pbml0KGNvbnN0IHVpbnQ4X3QgKmV4dHJhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0cmFkYXRhX3NpemUpOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92b3JiaXNkZWMuYyBiL2xpYmF2Y29kZWMvdm9yYmlzZGVjLmMKaW5kZXggMjI1ZjFlOS4uMDBlOWNkOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92b3JiaXNkZWMuYworKysgYi9saWJhdmNvZGVjL3ZvcmJpc2RlYy5jCkBAIC0yOSwxNCArMjksMTQgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAotI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCi0jaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgotI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgotI2luY2x1ZGUgImZmdC5oIgotI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgogCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiZmZ0LmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInZvcmJpcy5oIgogI2luY2x1ZGUgInZvcmJpc2RzcC5oIgogI2luY2x1ZGUgInhpcGguaCIKQEAgLTczMSw3ICs3MzEsNyBAQAogICAgICAgICBpZiAoIXJlc19zZXR1cC0+Y2xhc3NpZnMpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgIGZmX2Rsb2coTlVMTCwgIiAgICBiZWdpbiAlZCBlbmQgJWQgcGFydC5zaXplICVkIGNsYXNzaWYucyAlZCBjbGFzc2Jvb2sgJWQgXG4iLAorICAgICAgICBmZl9kbG9nKE5VTEwsICIgICAgYmVnaW4gJSJQUkl1MzIiIGVuZCAlIlBSSXUzMiIgcGFydC5zaXplICV1IGNsYXNzaWYucyAlIlBSSXU4IiBjbGFzc2Jvb2sgJSJQUkl1OCJcbiIsCiAgICAgICAgICAgICAgICAgcmVzX3NldHVwLT5iZWdpbiwgcmVzX3NldHVwLT5lbmQsIHJlc19zZXR1cC0+cGFydGl0aW9uX3NpemUsCiAgICAgICAgICAgICAgICAgcmVzX3NldHVwLT5jbGFzc2lmaWNhdGlvbnMsIHJlc19zZXR1cC0+Y2xhc3Nib29rKTsKIApAQCAtODc2LDcgKzg3Niw3IEBACiAgICAgfQogCiAgICAgZm9yIChpZHggPSAwOyBpZHggPD0gbjsgKytpZHgpIHsKLSAgICAgICAgZmZfZGxvZyhOVUxMLCAiZmxvb3IwIG1hcDogbWFwIGF0IHBvcyAlZCBpcyAlZFxuIiwgaWR4LCBtYXBbaWR4XSk7CisgICAgICAgIGZmX2Rsb2coTlVMTCwgImZsb29yMCBtYXA6IG1hcCBhdCBwb3MgJWQgaXMgJSJQUklkMzIiXG4iLCBpZHgsIG1hcFtpZHhdKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTEwMTIsNyArMTAxMiw3IEBACiAgICAgaWYgKCF2Yy0+ZmRzcCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIGZmX2Rsb2coTlVMTCwgIiB2b3JiaXMgdmVyc2lvbiAlZCBcbiBhdWRpb19jaGFubmVscyAlZCBcbiBhdWRpb19zYW1wbGVyYXRlICVkIFxuIGJpdHJhdGVfbWF4ICVkIFxuIGJpdHJhdGVfbm9tICVkIFxuIGJpdHJhdGVfbWluICVkIFxuIGJsa18wICVkIGJsa18xICVkIFxuICIsCisgICAgZmZfZGxvZyhOVUxMLCAiIHZvcmJpcyB2ZXJzaW9uICUiUFJJdTMyIiBcbiBhdWRpb19jaGFubmVscyAlIlBSSXU4IiBcbiBhdWRpb19zYW1wbGVyYXRlICUiUFJJdTMyIiBcbiBiaXRyYXRlX21heCAlIlBSSXUzMiIgXG4gYml0cmF0ZV9ub20gJSJQUkl1MzIiIFxuIGJpdHJhdGVfbWluICUiUFJJdTMyIiBcbiBibGtfMCAlIlBSSXUzMiIgYmxrXzEgJSJQUkl1MzIiIFxuICIsCiAgICAgICAgICAgICB2Yy0+dmVyc2lvbiwgdmMtPmF1ZGlvX2NoYW5uZWxzLCB2Yy0+YXVkaW9fc2FtcGxlcmF0ZSwgdmMtPmJpdHJhdGVfbWF4aW11bSwgdmMtPmJpdHJhdGVfbm9taW5hbCwgdmMtPmJpdHJhdGVfbWluaW11bSwgdmMtPmJsb2Nrc2l6ZVswXSwgdmMtPmJsb2Nrc2l6ZVsxXSk7CiAKIC8qCkBAIC0xODYyLDYgKzE4NjIsNyBAQAogICAgIC5kZWNvZGUgICAgICAgICAgPSB2b3JiaXNfZGVjb2RlX2ZyYW1lLAogICAgIC5mbHVzaCAgICAgICAgICAgPSB2b3JiaXNfZGVjb2RlX2ZsdXNoLAogICAgIC5jYXBhYmlsaXRpZXMgICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5jYXBzX2ludGVybmFsICAgPSBGRl9DT0RFQ19DQVBfSU5JVF9DTEVBTlVQLAogICAgIC5jaGFubmVsX2xheW91dHMgPSBmZl92b3JiaXNfY2hhbm5lbF9sYXlvdXRzLAogICAgIC5zYW1wbGVfZm10cyAgICAgPSAoY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdFtdKSB7IEFWX1NBTVBMRV9GTVRfRkxUUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdm9yYmlzZW5jLmMgYi9saWJhdmNvZGVjL3ZvcmJpc2VuYy5jCmluZGV4IDI5NzRjYTIuLjE4YTY3OWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdm9yYmlzZW5jLmMKKysrIGIvbGliYXZjb2RlYy92b3JiaXNlbmMuYwpAQCAtMjUsNiArMjUsNyBAQAogICovCiAKICNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtMzMsNiArMzQsOSBAQAogI2luY2x1ZGUgInZvcmJpcy5oIgogI2luY2x1ZGUgInZvcmJpc19lbmNfZGF0YS5oIgogCisjaW5jbHVkZSAiYXVkaW9fZnJhbWVfcXVldWUuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9idWZmZXJxdWV1ZS5oIgorCiAjZGVmaW5lIEJJVFNUUkVBTV9XUklURVJfTEUKICNpbmNsdWRlICJwdXRfYml0cy5oIgogCkBAIC0xMDgsOCArMTEyLDEyIEBACiAgICAgZmxvYXQgKnNhbXBsZXM7CiAgICAgZmxvYXQgKmZsb29yOyAgLy8gYWxzbyB1c2VkIGZvciB0bXAgdmFsdWVzIGZvciBtZGN0CiAgICAgZmxvYXQgKmNvZWZmczsgLy8gYWxzbyB1c2VkIGZvciByZXNpZHVlIGFmdGVyIGZsb29yCisgICAgZmxvYXQgKnNjcmF0Y2g7IC8vIHVzZWQgZm9yIHRtcCB2YWx1ZXMgZm9yIHBzeSBtb2RlbAogICAgIGZsb2F0IHF1YWxpdHk7CiAKKyAgICBBdWRpb0ZyYW1lUXVldWUgYWZxOworICAgIHN0cnVjdCBGRkJ1ZlF1ZXVlIGJ1ZnF1ZXVlOworCiAgICAgaW50IG5jb2RlYm9va3M7CiAgICAgdm9yYmlzX2VuY19jb2RlYm9vayAqY29kZWJvb2tzOwogCkBAIC0xMjYsNiArMTM0LDggQEAKICAgICB2b3JiaXNfZW5jX21vZGUgKm1vZGVzOwogCiAgICAgaW50NjRfdCBuZXh0X3B0czsKKworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOwogfSB2b3JiaXNfZW5jX2NvbnRleHQ7CiAKICNkZWZpbmUgTUFYX0NIQU5ORUxTICAgICAyCkBAIC0yMzYsNiArMjQ2LDI2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBhdl9jb2xkIGludCBkc3BfaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvcmJpc19lbmNfY29udGV4dCAqdmVuYykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIHZlbmMtPmZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfQklURVhBQ1QpOworICAgIGlmICghdmVuYy0+ZmRzcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8vIGluaXQgd2luZG93cworICAgIHZlbmMtPndpblswXSA9IGZmX3ZvcmJpc192d2luW3ZlbmMtPmxvZzJfYmxvY2tzaXplWzBdIC0gNl07CisgICAgdmVuYy0+d2luWzFdID0gZmZfdm9yYmlzX3Z3aW5bdmVuYy0+bG9nMl9ibG9ja3NpemVbMV0gLSA2XTsKKworICAgIGlmICgocmV0ID0gZmZfbWRjdF9pbml0KCZ2ZW5jLT5tZGN0WzBdLCB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVswXSwgMCwgMS4wKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gZmZfbWRjdF9pbml0KCZ2ZW5jLT5tZGN0WzFdLCB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVsxXSwgMCwgMS4wKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY3JlYXRlX3ZvcmJpc19jb250ZXh0KHZvcmJpc19lbmNfY29udGV4dCAqdmVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKQEAgLTMyMiw3ICszNTIsNyBAQAogICAgICAgICAgICAgYy0+Ym9va3Nbal0gPSBmbG9vcl9jbGFzc2VzW2ldLm5ib29rc1tqXTsKICAgICB9CiAgICAgZmMtPm11bHRpcGxpZXIgPSAyOwotICAgIGZjLT5yYW5nZWJpdHMgID0gdmVuYy0+bG9nMl9ibG9ja3NpemVbMF0gLSAxOworICAgIGZjLT5yYW5nZWJpdHMgID0gdmVuYy0+bG9nMl9ibG9ja3NpemVbMV0gLSAxOwogCiAgICAgZmMtPnZhbHVlcyA9IDI7CiAgICAgZm9yIChpID0gMDsgaSA8IGZjLT5wYXJ0aXRpb25zOyBpKyspCkBAIC00MDksMjkgKzQzOSwyOSBAQAogICAgICAgICBtYy0+YW5nbGVbMF0gICAgID0gMTsKICAgICB9CiAKLSAgICB2ZW5jLT5ubW9kZXMgPSAxOworICAgIHZlbmMtPm5tb2RlcyA9IDI7CiAgICAgdmVuYy0+bW9kZXMgID0gYXZfbWFsbG9jKHNpemVvZih2b3JiaXNfZW5jX21vZGUpICogdmVuYy0+bm1vZGVzKTsKICAgICBpZiAoIXZlbmMtPm1vZGVzKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgLy8gc2luZ2xlIG1vZGUKKyAgICAvLyBTaG9ydCBibG9jawogICAgIHZlbmMtPm1vZGVzWzBdLmJsb2NrZmxhZyA9IDA7CiAgICAgdmVuYy0+bW9kZXNbMF0ubWFwcGluZyAgID0gMDsKKyAgICAvLyBMb25nIGJsb2NrCisgICAgdmVuYy0+bW9kZXNbMV0uYmxvY2tmbGFnID0gMTsKKyAgICB2ZW5jLT5tb2Rlc1sxXS5tYXBwaW5nICAgPSAwOwogCiAgICAgdmVuYy0+aGF2ZV9zYXZlZCA9IDA7CiAgICAgdmVuYy0+c2F2ZWQgICAgICA9IGF2X21hbGxvY19hcnJheShzaXplb2YoZmxvYXQpICogdmVuYy0+Y2hhbm5lbHMsICgxIDw8IHZlbmMtPmxvZzJfYmxvY2tzaXplWzFdKSAvIDIpOwogICAgIHZlbmMtPnNhbXBsZXMgICAgPSBhdl9tYWxsb2NfYXJyYXkoc2l6ZW9mKGZsb2F0KSAqIHZlbmMtPmNoYW5uZWxzLCAoMSA8PCB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVsxXSkpOwogICAgIHZlbmMtPmZsb29yICAgICAgPSBhdl9tYWxsb2NfYXJyYXkoc2l6ZW9mKGZsb2F0KSAqIHZlbmMtPmNoYW5uZWxzLCAoMSA8PCB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVsxXSkgLyAyKTsKICAgICB2ZW5jLT5jb2VmZnMgICAgID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZihmbG9hdCkgKiB2ZW5jLT5jaGFubmVscywgKDEgPDwgdmVuYy0+bG9nMl9ibG9ja3NpemVbMV0pIC8gMik7Ci0gICAgaWYgKCF2ZW5jLT5zYXZlZCB8fCAhdmVuYy0+c2FtcGxlcyB8fCAhdmVuYy0+Zmxvb3IgfHwgIXZlbmMtPmNvZWZmcykKKyAgICB2ZW5jLT5zY3JhdGNoICAgID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZihmbG9hdCkgKiB2ZW5jLT5jaGFubmVscywgKDEgPDwgdmVuYy0+bG9nMl9ibG9ja3NpemVbMV0pKTsKKworICAgIGlmICghdmVuYy0+c2F2ZWQgfHwgIXZlbmMtPnNhbXBsZXMgfHwgIXZlbmMtPmZsb29yIHx8ICF2ZW5jLT5jb2VmZnMgfHwgIXZlbmMtPnNjcmF0Y2gpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICB2ZW5jLT53aW5bMF0gPSBmZl92b3JiaXNfdndpblt2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVswXSAtIDZdOwotICAgIHZlbmMtPndpblsxXSA9IGZmX3ZvcmJpc192d2luW3ZlbmMtPmxvZzJfYmxvY2tzaXplWzFdIC0gNl07Ci0KLSAgICBpZiAoKHJldCA9IGZmX21kY3RfaW5pdCgmdmVuYy0+bWRjdFswXSwgdmVuYy0+bG9nMl9ibG9ja3NpemVbMF0sIDAsIDEuMCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoKHJldCA9IGZmX21kY3RfaW5pdCgmdmVuYy0+bWRjdFsxXSwgdmVuYy0+bG9nMl9ibG9ja3NpemVbMV0sIDAsIDEuMCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGRzcF9pbml0KGF2Y3R4LCB2ZW5jKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgcmV0dXJuIDA7CkBAIC05NjcsNzEgKzk5NywxMzggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhcHBseV93aW5kb3dfYW5kX21kY3Qodm9yYmlzX2VuY19jb250ZXh0ICp2ZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKiphdWRpbywgaW50IHNhbXBsZXMpCitzdGF0aWMgaW50IGFwcGx5X3dpbmRvd19hbmRfbWRjdCh2b3JiaXNfZW5jX2NvbnRleHQgKnZlbmMpCiB7Ci0gICAgaW50IGksIGNoYW5uZWw7Ci0gICAgY29uc3QgZmxvYXQgKiB3aW4gPSB2ZW5jLT53aW5bMF07Ci0gICAgaW50IHdpbmRvd19sZW4gPSAxIDw8ICh2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVswXSAtIDEpOwotICAgIGZsb2F0IG4gPSAoZmxvYXQpKDEgPDwgdmVuYy0+bG9nMl9ibG9ja3NpemVbMF0pIC8gNC4wOwotICAgIC8vIEZJWE1FIHVzZSBkc3AKKyAgICBpbnQgY2hhbm5lbDsKKyAgICBjb25zdCBmbG9hdCAqIHdpbiA9IHZlbmMtPndpblsxXTsKKyAgICBpbnQgd2luZG93X2xlbiA9IDEgPDwgKHZlbmMtPmxvZzJfYmxvY2tzaXplWzFdIC0gMSk7CisgICAgZmxvYXQgbiA9IChmbG9hdCkoMSA8PCB2ZW5jLT5sb2cyX2Jsb2Nrc2l6ZVsxXSkgLyA0LjA7CisgICAgQVZGbG9hdERTUENvbnRleHQgKmZkc3AgPSB2ZW5jLT5mZHNwOwogCi0gICAgaWYgKCF2ZW5jLT5oYXZlX3NhdmVkICYmICFzYW1wbGVzKQotICAgICAgICByZXR1cm4gMDsKKyAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgdmVuYy0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgeworICAgICAgICBmbG9hdCAqb2Zmc2V0ID0gdmVuYy0+c2FtcGxlcyArIGNoYW5uZWwgKiB3aW5kb3dfbGVuICogMjsKIAotICAgIGlmICh2ZW5jLT5oYXZlX3NhdmVkKSB7Ci0gICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB2ZW5jLT5jaGFubmVsczsgY2hhbm5lbCsrKQotICAgICAgICAgICAgbWVtY3B5KHZlbmMtPnNhbXBsZXMgKyBjaGFubmVsICogd2luZG93X2xlbiAqIDIsCi0gICAgICAgICAgICAgICAgICAgdmVuYy0+c2F2ZWQgKyBjaGFubmVsICogd2luZG93X2xlbiwgc2l6ZW9mKGZsb2F0KSAqIHdpbmRvd19sZW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB2ZW5jLT5jaGFubmVsczsgY2hhbm5lbCsrKQotICAgICAgICAgICAgbWVtc2V0KHZlbmMtPnNhbXBsZXMgKyBjaGFubmVsICogd2luZG93X2xlbiAqIDIsIDAsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIHdpbmRvd19sZW4pOwotICAgIH0KKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWwob2Zmc2V0LCBvZmZzZXQsIHdpbiwgd2luZG93X2xlbik7CisgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3NjYWxhcihvZmZzZXQsIG9mZnNldCwgMS9uLCB3aW5kb3dfbGVuKTsKIAotICAgIGlmIChzYW1wbGVzKSB7Ci0gICAgICAgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB2ZW5jLT5jaGFubmVsczsgY2hhbm5lbCsrKSB7Ci0gICAgICAgICAgICBmbG9hdCAqIG9mZnNldCA9IHZlbmMtPnNhbXBsZXMgKyBjaGFubmVsKndpbmRvd19sZW4qMiArIHdpbmRvd19sZW47Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKQotICAgICAgICAgICAgICAgIG9mZnNldFtpXSA9IGF1ZGlvW2NoYW5uZWxdW2ldIC8gbiAqIHdpblt3aW5kb3dfbGVuIC0gaSAtIDFdOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHZlbmMtPmNoYW5uZWxzOyBjaGFubmVsKyspCi0gICAgICAgICAgICBtZW1zZXQodmVuYy0+c2FtcGxlcyArIGNoYW5uZWwgKiB3aW5kb3dfbGVuICogMiArIHdpbmRvd19sZW4sCi0gICAgICAgICAgICAgICAgICAgMCwgc2l6ZW9mKGZsb2F0KSAqIHdpbmRvd19sZW4pOwotICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IHdpbmRvd19sZW47CiAKLSAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgdmVuYy0+Y2hhbm5lbHM7IGNoYW5uZWwrKykKLSAgICAgICAgdmVuYy0+bWRjdFswXS5tZGN0X2NhbGMoJnZlbmMtPm1kY3RbMF0sIHZlbmMtPmNvZWZmcyArIGNoYW5uZWwgKiB3aW5kb3dfbGVuLAorICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKG9mZnNldCwgb2Zmc2V0LCB3aW4sIHdpbmRvd19sZW4pOworICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF9zY2FsYXIob2Zmc2V0LCBvZmZzZXQsIDEvbiwgd2luZG93X2xlbik7CisKKyAgICAgICAgdmVuYy0+bWRjdFsxXS5tZGN0X2NhbGMoJnZlbmMtPm1kY3RbMV0sIHZlbmMtPmNvZWZmcyArIGNoYW5uZWwgKiB3aW5kb3dfbGVuLAogICAgICAgICAgICAgICAgICAgICAgdmVuYy0+c2FtcGxlcyArIGNoYW5uZWwgKiB3aW5kb3dfbGVuICogMik7Ci0KLSAgICBpZiAoc2FtcGxlcykgewotICAgICAgICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgdmVuYy0+Y2hhbm5lbHM7IGNoYW5uZWwrKykgewotICAgICAgICAgICAgZmxvYXQgKm9mZnNldCA9IHZlbmMtPnNhdmVkICsgY2hhbm5lbCAqIHdpbmRvd19sZW47Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlczsgaSsrKQotICAgICAgICAgICAgICAgIG9mZnNldFtpXSA9IGF1ZGlvW2NoYW5uZWxdW2ldIC8gbiAqIHdpbltpXTsKLSAgICAgICAgfQotICAgICAgICB2ZW5jLT5oYXZlX3NhdmVkID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgICB2ZW5jLT5oYXZlX3NhdmVkID0gMDsKICAgICB9CiAgICAgcmV0dXJuIDE7CiB9CiAKKy8qIFVzZWQgZm9yIHBhZGRpbmcgdGhlIGxhc3QgZW5jb2RlZCBwYWNrZXQgKi8KK3N0YXRpYyBBVkZyYW1lICpzcGF3bl9lbXB0eV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBjaGFubmVscykKK3sKKyAgICBBVkZyYW1lICpmID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpbnQgY2g7CisKKyAgICBpZiAoIWYpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZi0+Zm9ybWF0ID0gYXZjdHgtPnNhbXBsZV9mbXQ7CisgICAgZi0+bmJfc2FtcGxlcyA9IGF2Y3R4LT5mcmFtZV9zaXplOworICAgIGYtPmNoYW5uZWxfbGF5b3V0ID0gYXZjdHgtPmNoYW5uZWxfbGF5b3V0OworCisgICAgaWYgKGF2X2ZyYW1lX2dldF9idWZmZXIoZiwgNCkpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIHNpemVfdCBicHMgPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShmLT5mb3JtYXQpOworICAgICAgICBtZW1zZXQoZi0+ZXh0ZW5kZWRfZGF0YVtjaF0sIDAsIGJwcyAqIGYtPm5iX3NhbXBsZXMpOworICAgIH0KKyAgICByZXR1cm4gZjsKK30KKworLyogU2V0IHVwIGF1ZGlvIHNhbXBsZXMgZm9yIHBzeSBhbmFseXNpcyBhbmQgd2luZG93L21kY3QgKi8KK3N0YXRpYyB2b2lkIG1vdmVfYXVkaW8odm9yYmlzX2VuY19jb250ZXh0ICp2ZW5jLCBpbnQgc2Zfc2l6ZSkKK3sKKyAgICBBVkZyYW1lICpjdXIgPSBOVUxMOworICAgIGludCBmcmFtZV9zaXplID0gMSA8PCAodmVuYy0+bG9nMl9ibG9ja3NpemVbMV0gLSAxKTsKKyAgICBpbnQgc3ViZnJhbWVzID0gZnJhbWVfc2l6ZSAvIHNmX3NpemU7CisgICAgaW50IHNmLCBjaDsKKworICAgIC8qIENvcHkgc2FtcGxlcyBmcm9tIGxhc3QgZnJhbWUgaW50byBjdXJyZW50IGZyYW1lICovCisgICAgaWYgKHZlbmMtPmhhdmVfc2F2ZWQpCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHZlbmMtPmNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgbWVtY3B5KHZlbmMtPnNhbXBsZXMgKyAyICogY2ggKiBmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgIHZlbmMtPnNhdmVkICsgY2ggKiBmcmFtZV9zaXplLCBzaXplb2YoZmxvYXQpICogZnJhbWVfc2l6ZSk7CisgICAgZWxzZQorICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCB2ZW5jLT5jaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIG1lbXNldCh2ZW5jLT5zYW1wbGVzICsgMiAqIGNoICogZnJhbWVfc2l6ZSwgMCwgc2l6ZW9mKGZsb2F0KSAqIGZyYW1lX3NpemUpOworCisgICAgZm9yIChzZiA9IDA7IHNmIDwgc3ViZnJhbWVzOyBzZisrKSB7CisgICAgICAgIGN1ciA9IGZmX2J1ZnF1ZXVlX2dldCgmdmVuYy0+YnVmcXVldWUpOworCisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHZlbmMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBmbG9hdCAqb2Zmc2V0ID0gdmVuYy0+c2FtcGxlcyArIDIgKiBjaCAqIGZyYW1lX3NpemUgKyBmcmFtZV9zaXplOworICAgICAgICAgICAgZmxvYXQgKnNhdmUgPSB2ZW5jLT5zYXZlZCArIGNoICogZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICppbnB1dCA9IChmbG9hdCAqKSBjdXItPmV4dGVuZGVkX2RhdGFbY2hdOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGxlbiAgPSBjdXItPm5iX3NhbXBsZXMgKiBzaXplb2YoZmxvYXQpOworCisgICAgICAgICAgICBtZW1jcHkob2Zmc2V0ICsgc2Yqc2Zfc2l6ZSwgaW5wdXQsIGxlbik7CisgICAgICAgICAgICBtZW1jcHkoc2F2ZSArIHNmKnNmX3NpemUsIGlucHV0LCBsZW4pOyAgIC8vIE1vdmUgc2FtcGxlcyBmb3IgbmV4dCBmcmFtZQorICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmN1cik7CisgICAgfQorICAgIHZlbmMtPmhhdmVfc2F2ZWQgPSAxOworICAgIG1lbWNweSh2ZW5jLT5zY3JhdGNoLCB2ZW5jLT5zYW1wbGVzLCAyICogdmVuYy0+Y2hhbm5lbHMgKiBmcmFtZV9zaXplKTsKK30KKwogc3RhdGljIGludCB2b3JiaXNfZW5jb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXRfcHRyKQogewogICAgIHZvcmJpc19lbmNfY29udGV4dCAqdmVuYyA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgZmxvYXQgKiphdWRpbyA9IGZyYW1lID8gKGZsb2F0ICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhIDogTlVMTDsKLSAgICBpbnQgc2FtcGxlcyA9IGZyYW1lID8gZnJhbWUtPm5iX3NhbXBsZXMgOiAwOworICAgIGludCBpLCByZXQsIG5lZWRfbW9yZTsKKyAgICBpbnQgZnJhbWVfc2l6ZSA9IDEgPDwgKHZlbmMtPmxvZzJfYmxvY2tzaXplWzFdIC0gMSk7CiAgICAgdm9yYmlzX2VuY19tb2RlICptb2RlOwogICAgIHZvcmJpc19lbmNfbWFwcGluZyAqbWFwcGluZzsKICAgICBQdXRCaXRDb250ZXh0IHBiOwotICAgIGludCBpLCByZXQ7CiAKLSAgICBpZiAoIWFwcGx5X3dpbmRvd19hbmRfbWRjdCh2ZW5jLCBhdWRpbywgc2FtcGxlcykpCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIEFWRnJhbWUgKmNsb25lOworICAgICAgICBpZiAoKHJldCA9IGZmX2FmX3F1ZXVlX2FkZCgmdmVuYy0+YWZxLCBmcmFtZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGNsb25lID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworICAgICAgICBpZiAoIWNsb25lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZmZfYnVmcXVldWVfYWRkKGF2Y3R4LCAmdmVuYy0+YnVmcXVldWUsIGNsb25lKTsKKyAgICB9IGVsc2UKKyAgICAgICAgaWYgKCF2ZW5jLT5hZnEucmVtYWluaW5nX3NhbXBsZXMpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgIG5lZWRfbW9yZSA9IHZlbmMtPmJ1ZnF1ZXVlLmF2YWlsYWJsZSAqIGF2Y3R4LT5mcmFtZV9zaXplIDwgZnJhbWVfc2l6ZTsKKyAgICBuZWVkX21vcmUgPSBmcmFtZSAmJiBuZWVkX21vcmU7CisgICAgaWYgKG5lZWRfbW9yZSkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgc2FtcGxlcyA9IDEgPDwgKHZlbmMtPmxvZzJfYmxvY2tzaXplWzBdIC0gMSk7CisKKyAgICAvKiBQYWQgdGhlIGJ1ZnF1ZXVlIHdpdGggZW1wdHkgZnJhbWVzIGZvciBlbmNvZGluZyB0aGUgbGFzdCBwYWNrZXQuICovCisgICAgaWYgKCFmcmFtZSkgeworICAgICAgICBpZiAodmVuYy0+YnVmcXVldWUuYXZhaWxhYmxlICogYXZjdHgtPmZyYW1lX3NpemUgPCBmcmFtZV9zaXplKSB7CisgICAgICAgICAgICBpbnQgZnJhbWVzX25lZWRlZCA9IChmcmFtZV9zaXplL2F2Y3R4LT5mcmFtZV9zaXplKSAtIHZlbmMtPmJ1ZnF1ZXVlLmF2YWlsYWJsZTsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzX25lZWRlZDsgaSsrKSB7CisgICAgICAgICAgICAgICBBVkZyYW1lICplbXB0eSA9IHNwYXduX2VtcHR5X2ZyYW1lKGF2Y3R4LCB2ZW5jLT5jaGFubmVscyk7CisgICAgICAgICAgICAgICBpZiAoIWVtcHR5KQorICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgICAgIGZmX2J1ZnF1ZXVlX2FkZChhdmN0eCwgJnZlbmMtPmJ1ZnF1ZXVlLCBlbXB0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtb3ZlX2F1ZGlvKHZlbmMsIGF2Y3R4LT5mcmFtZV9zaXplKTsKKworICAgIGlmICghYXBwbHlfd2luZG93X2FuZF9tZGN0KHZlbmMpKQorICAgICAgICByZXR1cm4gMDsKIAogICAgIGlmICgocmV0ID0gZmZfYWxsb2NfcGFja2V0MihhdmN0eCwgYXZwa3QsIDgxOTIsIDApKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC0xMDQ1LDMzICsxMTQyLDMzIEBACiAKICAgICBwdXRfYml0cygmcGIsIDEsIDApOyAvLyBtYWdpYyBiaXQKIAotICAgIHB1dF9iaXRzKCZwYiwgaWxvZyh2ZW5jLT5ubW9kZXMgLSAxKSwgMCk7IC8vIDAgYml0cywgdGhlIG1vZGUKKyAgICBwdXRfYml0cygmcGIsIGlsb2codmVuYy0+bm1vZGVzIC0gMSksIDEpOyAvLyBNb2RlIGZvciBjdXJyZW50IGZyYW1lCiAKLSAgICBtb2RlICAgID0gJnZlbmMtPm1vZGVzWzBdOworICAgIG1vZGUgICAgPSAmdmVuYy0+bW9kZXNbMV07CiAgICAgbWFwcGluZyA9ICZ2ZW5jLT5tYXBwaW5nc1ttb2RlLT5tYXBwaW5nXTsKICAgICBpZiAobW9kZS0+YmxvY2tmbGFnKSB7Ci0gICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7Ci0gICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7CisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMSk7IC8vIFByZXZpb3VzIHdpbmRvd2ZsYWcKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAxKTsgLy8gTmV4dCB3aW5kb3dmbGFnCiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IHZlbmMtPmNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgdm9yYmlzX2VuY19mbG9vciAqZmMgPSAmdmVuYy0+Zmxvb3JzW21hcHBpbmctPmZsb29yW21hcHBpbmctPm11eFtpXV1dOwogICAgICAgICB1aW50MTZfdCBwb3N0c1tNQVhfRkxPT1JfVkFMVUVTXTsKLSAgICAgICAgZmxvb3JfZml0KHZlbmMsIGZjLCAmdmVuYy0+Y29lZmZzW2kgKiBzYW1wbGVzXSwgcG9zdHMsIHNhbXBsZXMpOwotICAgICAgICBpZiAoZmxvb3JfZW5jb2RlKHZlbmMsIGZjLCAmcGIsIHBvc3RzLCAmdmVuYy0+Zmxvb3JbaSAqIHNhbXBsZXNdLCBzYW1wbGVzKSkgeworICAgICAgICBmbG9vcl9maXQodmVuYywgZmMsICZ2ZW5jLT5jb2VmZnNbaSAqIGZyYW1lX3NpemVdLCBwb3N0cywgZnJhbWVfc2l6ZSk7CisgICAgICAgIGlmIChmbG9vcl9lbmNvZGUodmVuYywgZmMsICZwYiwgcG9zdHMsICZ2ZW5jLT5mbG9vcltpICogZnJhbWVfc2l6ZV0sIGZyYW1lX3NpemUpKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIm91dHB1dCBidWZmZXIgaXMgdG9vIHNtYWxsXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgdmVuYy0+Y2hhbm5lbHMgKiBzYW1wbGVzOyBpKyspCisgICAgZm9yIChpID0gMDsgaSA8IHZlbmMtPmNoYW5uZWxzICogZnJhbWVfc2l6ZTsgaSsrKQogICAgICAgICB2ZW5jLT5jb2VmZnNbaV0gLz0gdmVuYy0+Zmxvb3JbaV07CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgbWFwcGluZy0+Y291cGxpbmdfc3RlcHM7IGkrKykgewotICAgICAgICBmbG9hdCAqbWFnID0gdmVuYy0+Y29lZmZzICsgbWFwcGluZy0+bWFnbml0dWRlW2ldICogc2FtcGxlczsKLSAgICAgICAgZmxvYXQgKmFuZyA9IHZlbmMtPmNvZWZmcyArIG1hcHBpbmctPmFuZ2xlW2ldICAgICAqIHNhbXBsZXM7CisgICAgICAgIGZsb2F0ICptYWcgPSB2ZW5jLT5jb2VmZnMgKyBtYXBwaW5nLT5tYWduaXR1ZGVbaV0gKiBmcmFtZV9zaXplOworICAgICAgICBmbG9hdCAqYW5nID0gdmVuYy0+Y29lZmZzICsgbWFwcGluZy0+YW5nbGVbaV0gICAgICogZnJhbWVfc2l6ZTsKICAgICAgICAgaW50IGo7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCBzYW1wbGVzOyBqKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGZyYW1lX3NpemU7IGorKykgewogICAgICAgICAgICAgZmxvYXQgYSA9IGFuZ1tqXTsKICAgICAgICAgICAgIGFuZ1tqXSAtPSBtYWdbal07CiAgICAgICAgICAgICBpZiAobWFnW2pdID4gMCkKQEAgLTEwODIsNyArMTE3OSw3IEBACiAgICAgfQogCiAgICAgaWYgKHJlc2lkdWVfZW5jb2RlKHZlbmMsICZ2ZW5jLT5yZXNpZHVlc1ttYXBwaW5nLT5yZXNpZHVlW21hcHBpbmctPm11eFswXV1dLAotICAgICAgICAgICAgICAgICAgICAgICAmcGIsIHZlbmMtPmNvZWZmcywgc2FtcGxlcywgdmVuYy0+Y2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICZwYiwgdmVuYy0+Y29lZmZzLCBmcmFtZV9zaXplLCB2ZW5jLT5jaGFubmVscykpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJvdXRwdXQgYnVmZmVyIGlzIHRvbyBzbWFsbFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQpAQCAtMTA5MCwxNSArMTE4NywxNCBAQAogICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CiAgICAgYXZwa3QtPnNpemUgPSBwdXRfYml0c19jb3VudCgmcGIpID4+IDM7CiAKLSAgICBhdnBrdC0+ZHVyYXRpb24gPSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwgYXZjdHgtPmZyYW1lX3NpemUpOwotICAgIGlmIChmcmFtZSkgewotICAgICAgICBpZiAoZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgIGF2cGt0LT5wdHMgPSBmZl9zYW1wbGVzX3RvX3RpbWVfYmFzZShhdmN0eCwgZnJhbWUtPnB0cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZwa3QtPnB0cyA9IHZlbmMtPm5leHRfcHRzOworICAgIGZmX2FmX3F1ZXVlX3JlbW92ZSgmdmVuYy0+YWZxLCBmcmFtZV9zaXplLCAmYXZwa3QtPnB0cywgJmF2cGt0LT5kdXJhdGlvbik7CisKKyAgICBpZiAoZnJhbWVfc2l6ZSA+IGF2cGt0LT5kdXJhdGlvbikgeworICAgICAgICB1aW50OF90ICpzaWRlID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEoYXZwa3QsIEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUywgMTApOworICAgICAgICBpZiAoIXNpZGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBBVl9XTDMyKCZzaWRlWzRdLCBmcmFtZV9zaXplIC0gYXZwa3QtPmR1cmF0aW9uKTsKICAgICB9Ci0gICAgaWYgKGF2cGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgIHZlbmMtPm5leHRfcHRzID0gYXZwa3QtPnB0cyArIGF2cGt0LT5kdXJhdGlvbjsKIAogICAgICpnb3RfcGFja2V0X3B0ciA9IDE7CiAgICAgcmV0dXJuIDA7CkBAIC0xMTU1LDkgKzEyNTEsMTMgQEAKICAgICBhdl9mcmVlcCgmdmVuYy0+c2FtcGxlcyk7CiAgICAgYXZfZnJlZXAoJnZlbmMtPmZsb29yKTsKICAgICBhdl9mcmVlcCgmdmVuYy0+Y29lZmZzKTsKKyAgICBhdl9mcmVlcCgmdmVuYy0+c2NyYXRjaCk7CisgICAgYXZfZnJlZXAoJnZlbmMtPmZkc3ApOwogCiAgICAgZmZfbWRjdF9lbmQoJnZlbmMtPm1kY3RbMF0pOwogICAgIGZmX21kY3RfZW5kKCZ2ZW5jLT5tZGN0WzFdKTsKKyAgICBmZl9hZl9xdWV1ZV9jbG9zZSgmdmVuYy0+YWZxKTsKKyAgICBmZl9idWZxdWV1ZV9kaXNjYXJkX2FsbCgmdmVuYy0+YnVmcXVldWUpOwogCiAgICAgYXZfZnJlZXAoJmF2Y3R4LT5leHRyYWRhdGEpOwogCkBAIC0xMTg4LDcgKzEyODgsOSBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHJldDsKIAotICAgIGF2Y3R4LT5mcmFtZV9zaXplID0gMSA8PCAodmVuYy0+bG9nMl9ibG9ja3NpemVbMF0gLSAxKTsKKyAgICBhdmN0eC0+ZnJhbWVfc2l6ZSA9IDY0OworCisgICAgZmZfYWZfcXVldWVfaW5pdChhdmN0eCwgJnZlbmMtPmFmcSk7CiAKICAgICByZXR1cm4gMDsKIGVycm9yOgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDMuYyBiL2xpYmF2Y29kZWMvdnAzLmMKaW5kZXggNWJiZjQ3Yi4uMWQ4Mzc1MyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDMuYworKysgYi9saWJhdmNvZGVjL3ZwMy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDAzLTIwMDQgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTk0NiwxNCArOTQ2LDE2IEBACiAgICAgaW50IG51bV9jb2VmZnMgICAgICA9IHMtPm51bV9jb2RlZF9mcmFnc1twbGFuZV1bY29lZmZfaW5kZXhdOwogICAgIGludDE2X3QgKmRjdF90b2tlbnMgPSBzLT5kY3RfdG9rZW5zW3BsYW5lXVtjb2VmZl9pbmRleF07CiAKLSAgICAvKiBsb2NhbCByZWZlcmVuY2VzIHRvIHN0cnVjdHVyZSBtZW1iZXJzIHRvIGF2b2lkIHJlcGVhdGVkIGRlZmVyZW5jZXMgKi8KKyAgICAvKiBsb2NhbCByZWZlcmVuY2VzIHRvIHN0cnVjdHVyZSBtZW1iZXJzIHRvIGF2b2lkIHJlcGVhdGVkIGRlcmVmZXJlbmNlcyAqLwogICAgIGludCAqY29kZWRfZnJhZ21lbnRfbGlzdCAgID0gcy0+Y29kZWRfZnJhZ21lbnRfbGlzdFtwbGFuZV07CiAgICAgVnAzRnJhZ21lbnQgKmFsbF9mcmFnbWVudHMgPSBzLT5hbGxfZnJhZ21lbnRzOwogICAgIFZMQ19UWVBFKCp2bGNfdGFibGUpWzJdID0gdGFibGUtPnRhYmxlOwogCi0gICAgaWYgKG51bV9jb2VmZnMgPCAwKQorICAgIGlmIChudW1fY29lZmZzIDwgMCkgewogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBjb2VmZmljZW50cyBhdCBsZXZlbCAlZFxuIiwgY29lZmZfaW5kZXgpOworICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIGNvZWZmaWNpZW50cyBhdCBsZXZlbCAlZFxuIiwgY29lZmZfaW5kZXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CiAKICAgICBpZiAoZW9iX3J1biA+IG51bV9jb2VmZnMpIHsKICAgICAgICAgY29lZmZfaSAgICAgID0KQEAgLTk3OCw2ICs5ODAsOSBAQAogICAgICAgICAgICAgaWYgKGVvYl9ydW5fZ2V0X2JpdHNbdG9rZW5dKQogICAgICAgICAgICAgICAgIGVvYl9ydW4gKz0gZ2V0X2JpdHMoZ2IsIGVvYl9ydW5fZ2V0X2JpdHNbdG9rZW5dKTsKIAorICAgICAgICAgICAgaWYgKCFlb2JfcnVuKQorICAgICAgICAgICAgICAgIGVvYl9ydW4gPSBJTlRfTUFYOworCiAgICAgICAgICAgICAvLyByZWNvcmQgb25seSB0aGUgbnVtYmVyIG9mIGJsb2NrcyBlbmRlZCBpbiB0aGlzIHBsYW5lLAogICAgICAgICAgICAgLy8gYW55IHNwaWxsIHdpbGwgYmUgcmVjb3JkZWQgaW4gdGhlIG5leHQgcGxhbmUuCiAgICAgICAgICAgICBpZiAoZW9iX3J1biA+IG51bV9jb2VmZnMgLSBjb2VmZl9pKSB7CkBAIC0xMDcxLDYgKzEwNzYsOSBAQAogCiAgICAgcy0+ZGN0X3Rva2Vuc1swXVswXSA9IHMtPmRjdF90b2tlbnNfYmFzZTsKIAorICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IDE2KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIC8qIGZldGNoIHRoZSBEQyB0YWJsZSBpbmRleGVzICovCiAgICAgZGNfeV90YWJsZSA9IGdldF9iaXRzKGdiLCA0KTsKICAgICBkY19jX3RhYmxlID0gZ2V0X2JpdHMoZ2IsIDQpOwpAQCAtMTA4MCw2ICsxMDg4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgcmVzaWR1YWxfZW9iX3J1bik7CiAgICAgaWYgKHJlc2lkdWFsX2VvYl9ydW4gPCAwKQogICAgICAgICByZXR1cm4gcmVzaWR1YWxfZW9iX3J1bjsKKyAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCA4KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIC8qIHJldmVyc2UgcHJlZGljdGlvbiBvZiB0aGUgWS1wbGFuZSBEQyBjb2VmZmljaWVudHMgKi8KICAgICByZXZlcnNlX2RjX3ByZWRpY3Rpb24ocywgMCwgcy0+ZnJhZ21lbnRfd2lkdGhbMF0sIHMtPmZyYWdtZW50X2hlaWdodFswXSk7CkBAIC0xMTAyLDYgKzExMTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhZ21lbnRfd2lkdGhbMV0sIHMtPmZyYWdtZW50X2hlaWdodFsxXSk7CiAgICAgfQogCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgLyogZmV0Y2ggdGhlIEFDIHRhYmxlIGluZGV4ZXMgKi8KICAgICBhY195X3RhYmxlID0gZ2V0X2JpdHMoZ2IsIDQpOwogICAgIGFjX2NfdGFibGUgPSBnZXRfYml0cyhnYiwgNCk7CkBAIC0xMTI0LDcgKzExMzYsNyBAQAogICAgICAgICBjX3RhYmxlc1tpXSA9ICZzLT5hY192bGNfNFthY19jX3RhYmxlXTsKICAgICB9CiAKLSAgICAvKiBkZWNvZGUgYWxsIEFDIGNvZWZmaWNlbnRzICovCisgICAgLyogZGVjb2RlIGFsbCBBQyBjb2VmZmljaWVudHMgKi8KICAgICBmb3IgKGkgPSAxOyBpIDw9IDYzOyBpKyspIHsKICAgICAgICAgcmVzaWR1YWxfZW9iX3J1biA9IHVucGFja192bGNzKHMsIGdiLCB5X3RhYmxlc1tpXSwgaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJlc2lkdWFsX2VvYl9ydW4pOwpAQCAtMTMyMiw3ICsxMzM0LDcgQEAKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKICAgICAgICAgICAgIC8qIFRoaXMgY29kZSBiYXNpY2FsbHkganVzdCBkZWJsb2NrcyBvbiB0aGUgZWRnZXMgb2YgY29kZWQgYmxvY2tzLgogICAgICAgICAgICAgICogSG93ZXZlciwgaXQgaGFzIHRvIGJlIG11Y2ggbW9yZSBjb21wbGljYXRlZCBiZWNhdXNlIG9mIHRoZQotICAgICAgICAgICAgICogYnJhaW5kYW1hZ2VkIGRlYmxvY2sgb3JkZXJpbmcgdXNlZCBpbiBWUDMvVGhlb3JhLiBPcmRlciBtYXR0ZXJzCisgICAgICAgICAgICAgKiBicmFpbiBkYW1hZ2VkIGRlYmxvY2sgb3JkZXJpbmcgdXNlZCBpbiBWUDMvVGhlb3JhLiBPcmRlciBtYXR0ZXJzCiAgICAgICAgICAgICAgKiBiZWNhdXNlIHNvbWUgcGl4ZWxzIGdldCBmaWx0ZXJlZCB0d2ljZS4gKi8KICAgICAgICAgICAgIGlmIChzLT5hbGxfZnJhZ21lbnRzW2ZyYWdtZW50XS5jb2RpbmdfbWV0aG9kICE9IE1PREVfQ09QWSkgewogICAgICAgICAgICAgICAgIC8qIGRvIG5vdCBwZXJmb3JtIGxlZnQgZWRnZSBmaWx0ZXIgZm9yIGxlZnQgY29sdW1ucyBmcmFncyAqLwpAQCAtMTU5NSw3ICsxNjA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RlLCBpdCBpcyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgYWxsIE1DIGNhc2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aCBwdXRfbm9fcm5kX3BpeGVsc19sMiB3aGljaCB3b3VsZCBsb29rIG1vcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBsaWtlIHRoZSBWUDMgc291cmNlIGJ1dCB0aGlzIHdvdWxkIGJlIHNsb3dlciBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHB1dF9ub19ybmRfcGl4ZWxzX3RhYiBpcyBiZXR0ZXIgb3B0aW16ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwdXRfbm9fcm5kX3BpeGVsc190YWIgaXMgYmV0dGVyIG9wdGltaXplZCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb3Rpb25faGFsZnBlbF9pbmRleCAhPSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhkc3AucHV0X25vX3JuZF9waXhlbHNfdGFiWzFdW21vdGlvbl9oYWxmcGVsX2luZGV4XSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9wbGFuZSArIGZpcnN0X3BpeGVsLApAQCAtMTc1NCw3ICsxNzY2LDkgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgICBzLT5xcHNbaV0gPSAtMTsKIAotICAgIGF2Y29kZWNfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKGF2Y3R4LT5waXhfZm10LCAmcy0+Y2hyb21hX3hfc2hpZnQsICZzLT5jaHJvbWFfeV9zaGlmdCk7CisgICAgcmV0ID0gYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoYXZjdHgtPnBpeF9mbXQsICZzLT5jaHJvbWFfeF9zaGlmdCwgJnMtPmNocm9tYV95X3NoaWZ0KTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgcy0+eV9zdXBlcmJsb2NrX3dpZHRoICA9IChzLT53aWR0aCAgKyAzMSkgLyAzMjsKICAgICBzLT55X3N1cGVyYmxvY2tfaGVpZ2h0ID0gKHMtPmhlaWdodCArIDMxKSAvIDMyOwpAQCAtMTk5Niw2ICsyMDEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqYXZwa3QpCiB7CisgICAgQVZGcmFtZSAgICAgKmZyYW1lICA9IGRhdGE7CiAgICAgY29uc3QgdWludDhfdCAqYnVmICA9IGF2cGt0LT5kYXRhOwogICAgIGludCBidWZfc2l6ZSAgICAgICAgPSBhdnBrdC0+c2l6ZTsKICAgICBWcDNEZWNvZGVDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKQEAgLTIwMjIsOCArMjAzNyw5IEBACiAgICAgICAgICAgICAgICAgcmV0ID0gdnAzX2RlY29kZV9pbml0KGF2Y3R4KTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgdnAzX2RlY29kZV9lbmQoYXZjdHgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOwogICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gMikgewogICAgICAgICAgICAgdnAzX2RlY29kZV9lbmQoYXZjdHgpOwogICAgICAgICAgICAgcmV0ID0gdGhlb3JhX2RlY29kZV90YWJsZXMoYXZjdHgsICZnYik7CkBAIC0yMDMxLDggKzIwNDcsOSBAQAogICAgICAgICAgICAgICAgIHJldCA9IHZwM19kZWNvZGVfaW5pdChhdmN0eCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIHZwM19kZWNvZGVfZW5kKGF2Y3R4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKICAgICAgICAgfQogCiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLApAQCAtMjE2NywxMiArMjE4NCwxMiBAQAogICAgIC8qIG91dHB1dCBmcmFtZSwgb2Zmc2V0IGFzIG5lZWRlZCAqLwogICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGRhdGEsIHMtPmN1cnJlbnRfZnJhbWUuZikpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIEFWRnJhbWUgKmRzdCA9IGRhdGE7Ci0gICAgICAgIGludCBvZmYgPSAocy0+b2Zmc2V0X3ggPj4gKGkgJiYgcy0+Y2hyb21hX3lfc2hpZnQpKSArCi0gICAgICAgICAgICAgICAgICAocy0+b2Zmc2V0X3kgPj4gKGkgJiYgcy0+Y2hyb21hX3lfc2hpZnQpKSAqIGRzdC0+bGluZXNpemVbaV07Ci0gICAgICAgIGRzdC0+ZGF0YVtpXSArPSBvZmY7Ci0gICAgfQorCisgICAgZnJhbWUtPmNyb3BfbGVmdCAgID0gcy0+b2Zmc2V0X3g7CisgICAgZnJhbWUtPmNyb3BfcmlnaHQgID0gYXZjdHgtPmNvZGVkX3dpZHRoIC0gYXZjdHgtPndpZHRoIC0gcy0+b2Zmc2V0X3g7CisgICAgZnJhbWUtPmNyb3BfdG9wICAgID0gcy0+b2Zmc2V0X3k7CisgICAgZnJhbWUtPmNyb3BfYm90dG9tID0gYXZjdHgtPmNvZGVkX2hlaWdodCAtIGF2Y3R4LT5oZWlnaHQgLSBzLT5vZmZzZXRfeTsKKwogICAgICpnb3RfZnJhbWUgPSAxOwogCiAgICAgaWYgKCFIQVZFX1RIUkVBRFMgfHwgIShzLT5hdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlICYgRkZfVEhSRUFEX0ZSQU1FKSkgewpAQCAtMjM0MiwxNiArMjM1OSw2IEBACiAgICAgICAgIC8vIHRvIG5vcm1hbCBheGlzIChbMCwwXSB1cHBlciBsZWZ0KQogICAgICAgICBzLT5vZmZzZXRfeCA9IG9mZnNldF94OwogICAgICAgICBzLT5vZmZzZXRfeSA9IHMtPmhlaWdodCAtIHZpc2libGVfaGVpZ2h0IC0gb2Zmc2V0X3k7Ci0KLSAgICAgICAgaWYgKChzLT5vZmZzZXRfeCAmIDB4MUYpICYmICEoYXZjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19VTkFMSUdORUQpKSB7Ci0gICAgICAgICAgICBzLT5vZmZzZXRfeCAmPSB+MHgxRjsKLSAgICAgICAgICAgIGlmICghcy0+b2Zmc2V0X3hfd2FybmVkKSB7Ci0gICAgICAgICAgICAgICAgcy0+b2Zmc2V0X3hfd2FybmVkID0gMTsKLSAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiUmVkdWNpbmcgb2Zmc2V0X3ggZnJvbSAlZCB0byAlZCIKLSAgICAgICAgICAgICAgICAgICAgImNocm9tYSBzYW1wbGVzIHRvIHByZXNlcnZlIGFsaWdubWVudC5cbiIsCi0gICAgICAgICAgICAgICAgICAgIG9mZnNldF94LCBzLT5vZmZzZXRfeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoY29sb3JzcGFjZSA9PSAxKQpAQCAtMjU2NCw3ICsyNTcxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCiAgICAgLmZsdXNoICAgICAgICAgICAgICAgICA9IHZwM19kZWNvZGVfZmx1c2gsCiAgICAgLmluaXRfdGhyZWFkX2NvcHkgICAgICA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKHZwM19pbml0X3RocmVhZF9jb3B5KSwKLSAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQodnAzX3VwZGF0ZV90aHJlYWRfY29udGV4dCkKKyAgICAudXBkYXRlX3RocmVhZF9jb250ZXh0ID0gT05MWV9JRl9USFJFQURTX0VOQUJMRUQodnAzX3VwZGF0ZV90aHJlYWRfY29udGV4dCksCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgICA9IEZGX0NPREVDX0NBUF9FWFBPUlRTX0NST1BQSU5HLAogfTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwM2RhdGEuaCBiL2xpYmF2Y29kZWMvdnAzZGF0YS5oCmluZGV4IGRhMzFmNmQuLjM4ODRiY2EgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdnAzZGF0YS5oCisrKyBiL2xpYmF2Y29kZWMvdnAzZGF0YS5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGNvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDNkc3AuYyBiL2xpYmF2Y29kZWMvdnAzZHNwLmMKaW5kZXggZDhhM2UwYS4uZmRhYTI5MiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDNkc3AuYworKysgYi9saWJhdmNvZGVjL3ZwM2RzcC5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNCBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAwNCBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtNDEsOSArNDEsOSBAQAogI2RlZmluZSB4QzZTMiAyNTA4MAogI2RlZmluZSB4QzdTMSAxMjc4NQogCi0jZGVmaW5lIE0oYSwgYikgKCgoYSkgKiAoYikpID4+IDE2KQorI2RlZmluZSBNKGEsIGIpICgoaW50KSgoU1VJTlQpKGEpICogKGIpKSA+PiAxNikKIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBpZGN0KHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaWRjdCh1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqaW5wdXQsIGludCB0eXBlKQogewogICAgIGludDE2X3QgKmlwID0gaW5wdXQ7CkBAIC0xOTQsMjEgKzE5NCwyMSBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgdnAzX2lkY3RfcHV0X2ModWludDhfdCAqZGVzdCAvKiBhbGlnbiA4ICovLCBpbnQgbGluZV9zaXplLAorc3RhdGljIHZvaWQgdnAzX2lkY3RfcHV0X2ModWludDhfdCAqZGVzdCAvKiBhbGlnbiA4ICovLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2sgLyogYWxpZ24gMTYgKi8pCiB7Ci0gICAgaWRjdChkZXN0LCBsaW5lX3NpemUsIGJsb2NrLCAxKTsKKyAgICBpZGN0KGRlc3QsIHN0cmlkZSwgYmxvY2ssIDEpOwogICAgIG1lbXNldChibG9jaywgMCwgc2l6ZW9mKCpibG9jaykgKiA2NCk7CiB9CiAKLXN0YXRpYyB2b2lkIHZwM19pZGN0X2FkZF9jKHVpbnQ4X3QgKmRlc3QgLyogYWxpZ24gOCAqLywgaW50IGxpbmVfc2l6ZSwKK3N0YXRpYyB2b2lkIHZwM19pZGN0X2FkZF9jKHVpbnQ4X3QgKmRlc3QgLyogYWxpZ24gOCAqLywgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrIC8qIGFsaWduIDE2ICovKQogewotICAgIGlkY3QoZGVzdCwgbGluZV9zaXplLCBibG9jaywgMik7CisgICAgaWRjdChkZXN0LCBzdHJpZGUsIGJsb2NrLCAyKTsKICAgICBtZW1zZXQoYmxvY2ssIDAsIHNpemVvZigqYmxvY2spICogNjQpOwogfQogCi1zdGF0aWMgdm9pZCB2cDNfaWRjdF9kY19hZGRfYyh1aW50OF90ICpkZXN0IC8qIGFsaWduIDggKi8sIGludCBsaW5lX3NpemUsCitzdGF0aWMgdm9pZCB2cDNfaWRjdF9kY19hZGRfYyh1aW50OF90ICpkZXN0IC8qIGFsaWduIDggKi8sIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jayAvKiBhbGlnbiAxNiAqLykKIHsKICAgICBpbnQgaSwgZGMgPSAoYmxvY2tbMF0gKyAxNSkgPj4gNTsKQEAgLTIyMiwxNyArMjIyLDE3IEBACiAgICAgICAgIGRlc3RbNV0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNV0gKyBkYyk7CiAgICAgICAgIGRlc3RbNl0gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbNl0gKyBkYyk7CiAgICAgICAgIGRlc3RbN10gPSBhdl9jbGlwX3VpbnQ4KGRlc3RbN10gKyBkYyk7Ci0gICAgICAgIGRlc3QgICArPSBsaW5lX3NpemU7CisgICAgICAgIGRlc3QgICArPSBzdHJpZGU7CiAgICAgfQogICAgIGJsb2NrWzBdID0gMDsKIH0KIAotc3RhdGljIHZvaWQgdnAzX3ZfbG9vcF9maWx0ZXJfYyh1aW50OF90ICpmaXJzdF9waXhlbCwgaW50IHN0cmlkZSwKK3N0YXRpYyB2b2lkIHZwM192X2xvb3BfZmlsdGVyX2ModWludDhfdCAqZmlyc3RfcGl4ZWwsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYm91bmRpbmdfdmFsdWVzKQogewogICAgIHVuc2lnbmVkIGNoYXIgKmVuZDsKICAgICBpbnQgZmlsdGVyX3ZhbHVlOwotICAgIGNvbnN0IGludCBuc3RyaWRlID0gLXN0cmlkZTsKKyAgICBjb25zdCBwdHJkaWZmX3QgbnN0cmlkZSA9IC1zdHJpZGU7CiAKICAgICBmb3IgKGVuZCA9IGZpcnN0X3BpeGVsICsgODsgZmlyc3RfcGl4ZWwgPCBlbmQ7IGZpcnN0X3BpeGVsKyspIHsKICAgICAgICAgZmlsdGVyX3ZhbHVlID0gKGZpcnN0X3BpeGVsWzIgKiBuc3RyaWRlXSAtIGZpcnN0X3BpeGVsW3N0cmlkZV0pICsKQEAgLTI0NCw3ICsyNDQsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgdnAzX2hfbG9vcF9maWx0ZXJfYyh1aW50OF90ICpmaXJzdF9waXhlbCwgaW50IHN0cmlkZSwKK3N0YXRpYyB2b2lkIHZwM19oX2xvb3BfZmlsdGVyX2ModWludDhfdCAqZmlyc3RfcGl4ZWwsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYm91bmRpbmdfdmFsdWVzKQogewogICAgIHVuc2lnbmVkIGNoYXIgKmVuZDsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnAzZHNwLmggYi9saWJhdmNvZGVjL3ZwM2RzcC5oCmluZGV4IGI5NWFkYWUuLjJmZGFkMTYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdnAzZHNwLmgKKysrIGIvbGliYXZjb2RlYy92cDNkc3AuaApAQCAtMzgsMTEgKzM4LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOwogCi0gICAgdm9pZCAoKmlkY3RfcHV0KSh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci0gICAgdm9pZCAoKmlkY3RfYWRkKSh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci0gICAgdm9pZCAoKmlkY3RfZGNfYWRkKSh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci0gICAgdm9pZCAoKnZfbG9vcF9maWx0ZXIpKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50ICpib3VuZGluZ192YWx1ZXMpOwotICAgIHZvaWQgKCpoX2xvb3BfZmlsdGVyKSh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCAqYm91bmRpbmdfdmFsdWVzKTsKKyAgICB2b2lkICgqaWRjdF9wdXQpKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKKyAgICB2b2lkICgqaWRjdF9hZGQpKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKKyAgICB2b2lkICgqaWRjdF9kY19hZGQpKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKKyAgICB2b2lkICgqdl9sb29wX2ZpbHRlcikodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgKmJvdW5kaW5nX3ZhbHVlcyk7CisgICAgdm9pZCAoKmhfbG9vcF9maWx0ZXIpKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwgaW50ICpib3VuZGluZ192YWx1ZXMpOwogfSBWUDNEU1BDb250ZXh0OwogCiB2b2lkIGZmX3ZwM2RzcF9pbml0KFZQM0RTUENvbnRleHQgKmMsIGludCBmbGFncyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwNS5jIGIvbGliYXZjb2RlYy92cDUuYwppbmRleCA1YmNmOWI2Li5jYjA4Y2VjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZwNS5jCisrKyBiL2xpYmF2Y29kZWMvdnA1LmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNpbmNsdWRlICJ2cDU2LmgiCkBAIC0zOSw4ICszOCwxMSBAQAogewogICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CiAgICAgaW50IHJvd3MsIGNvbHM7CisgICAgaW50IHJldDsKIAotICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKCZzLT5jLCBidWYsIGJ1Zl9zaXplKTsKKyAgICByZXQgPSBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+YywgYnVmLCBidWZfc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAgICAgcy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmtleV9mcmFtZSA9ICF2cDU2X3JhY19nZXQoYyk7CiAgICAgdnA1Nl9yYWNfZ2V0KGMpOwogICAgIGZmX3ZwNTZfaW5pdF9kZXF1YW50KHMsIHZwNTZfcmFjX2dldHMoYywgNikpOwpAQCAtNTEsNyArNTMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIHZwNTZfcmFjX2dldHMoYywgMik7CiAgICAgICAgIGlmICh2cDU2X3JhY19nZXQoYykpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW50ZXJsYWNpbmcgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLT5hdmN0eCwgIkludGVybGFjaW5nIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgIH0KICAgICAgICAgcm93cyA9IHZwNTZfcmFjX2dldHMoYywgOCk7ICAvKiBudW1iZXIgb2Ygc3RvcmVkIG1hY3JvYmxvY2sgcm93cyAqLwpAQCAtMTcxLDcgKzE3Myw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZwNV9wYXJzZV9jb2VmZihWUDU2Q29udGV4dCAqcykKK3N0YXRpYyBpbnQgdnA1X3BhcnNlX2NvZWZmKFZQNTZDb250ZXh0ICpzKQogewogICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7CiAgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKQEAgLTE4MSw2ICsxODMsMTEgQEAKICAgICBpbnQgYiwgaSwgY2csIGlkeCwgY3R4LCBjdHhfbGFzdDsKICAgICBpbnQgcHQgPSAwOyAgICAvKiBwbGFuZSB0eXBlICgwIGZvciBZLCAxIGZvciBVIG9yIFYpICovCiAKKyAgICBpZiAoYy0+ZW5kIDw9IGMtPmJ1ZmZlciAmJiBjLT5iaXRzID49IDApIHsKKyAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJFbmQgb2YgQUMgc3RyZWFtIHJlYWNoZWQgaW4gdnA1X3BhcnNlX2NvZWZmXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCiAgICAgZm9yIChiPTA7IGI8NjsgYisrKSB7CiAgICAgICAgIGludCBjdCA9IDE7ICAgIC8qIGNvZGUgdHlwZSAqLwogCkBAIC0yNDYsNiArMjUzLDcgQEAKICAgICAgICAgICAgICAgICBzLT5jb2VmZl9jdHhbZmZfdnA1Nl9iNnRvNFtiXV1baV0gPSA1OwogICAgICAgICBzLT5hYm92ZV9ibG9ja3Nbcy0+YWJvdmVfYmxvY2tfaWR4W2JdXS5ub3RfbnVsbF9kYyA9IHMtPmNvZWZmX2N0eFtmZl92cDU2X2I2dG80W2JdXVswXTsKICAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHZwNV9kZWZhdWx0X21vZGVsc19pbml0KFZQNTZDb250ZXh0ICpzKQpAQCAtMjcwLDYgKzI3OCw3IEBACiAKICAgICBpZiAoKHJldCA9IGZmX3ZwNTZfaW5pdChhdmN0eCwgMSwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKKyAgICBmZl92cDVkc3BfaW5pdCgmcy0+dnA1NmRzcCk7CiAgICAgcy0+dnA1Nl9jb29yZF9kaXYgPSB2cDVfY29vcmRfZGl2OwogICAgIHMtPnBhcnNlX3ZlY3Rvcl9hZGp1c3RtZW50ID0gdnA1X3BhcnNlX3ZlY3Rvcl9hZGp1c3RtZW50OwogICAgIHMtPnBhcnNlX2NvZWZmID0gdnA1X3BhcnNlX2NvZWZmOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDU2LmMgYi9saWJhdmNvZGVjL3ZwNTYuYwppbmRleCA2MzE5MjQ4Li5iNjlmZTZjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZwNTYuYworKysgYi9saWJhdmNvZGVjL3ZwNTYuYwpAQCAtMjYxLDYgKzI2MSwyNSBAQAogICAgIHJldHVybiBzLT5tYl90eXBlOwogfQogCitzdGF0aWMgVlA1Nm1iIHZwNTZfY29uY2VhbF9tdihWUDU2Q29udGV4dCAqcywgaW50IHJvdywgaW50IGNvbCkKK3sKKyAgICBWUDU2bXYgKm12LCB2ZWN0ID0gezAsMH07CisgICAgaW50IGI7CisKKyAgICBzLT5tYl90eXBlID0gVlA1Nl9NQl9JTlRFUl9OT1ZFQ19QRjsKKyAgICBzLT5tYWNyb2Jsb2Nrc1tyb3cgKiBzLT5tYl93aWR0aCArIGNvbF0udHlwZSA9IHMtPm1iX3R5cGU7CisKKyAgICBtdiA9ICZ2ZWN0OworCisgICAgcy0+bWFjcm9ibG9ja3Nbcm93KnMtPm1iX3dpZHRoICsgY29sXS5tdiA9ICptdjsKKworICAgIC8qIHNhbWUgdmVjdG9yIGZvciBhbGwgYmxvY2tzICovCisgICAgZm9yIChiPTA7IGI8NjsgYisrKQorICAgICAgICBzLT5tdltiXSA9ICptdjsKKworICAgIHJldHVybiBzLT5tYl90eXBlOworfQorCiBzdGF0aWMgdm9pZCB2cDU2X2FkZF9wcmVkaWN0b3JzX2RjKFZQNTZDb250ZXh0ICpzLCBWUDU2RnJhbWUgcmVmX2ZyYW1lKQogewogICAgIGludCBpZHggPSBzLT5pZGN0X3NjYW50YWJsZVswXTsKQEAgLTM4MSwyMCArNDAwLDExIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCB2cDU2X2RlY29kZV9tYihWUDU2Q29udGV4dCAqcywgaW50IHJvdywgaW50IGNvbCwgaW50IGlzX2FscGhhKQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB2cDU2X3JlbmRlcl9tYihWUDU2Q29udGV4dCAqcywgaW50IHJvdywgaW50IGNvbCwgaW50IGlzX2FscGhhLCBWUDU2bWIgbWJfdHlwZSkKIHsKLSAgICBBVkZyYW1lICpmcmFtZV9jdXJyZW50LCAqZnJhbWVfcmVmOwotICAgIFZQNTZtYiBtYl90eXBlOwotICAgIFZQNTZGcmFtZSByZWZfZnJhbWU7CiAgICAgaW50IGIsIGFiLCBiX21heCwgcGxhbmUsIG9mZjsKLQotICAgIGlmIChzLT5mcmFtZXNbVlA1Nl9GUkFNRV9DVVJSRU5UXS0+a2V5X2ZyYW1lKQotICAgICAgICBtYl90eXBlID0gVlA1Nl9NQl9JTlRSQTsKLSAgICBlbHNlCi0gICAgICAgIG1iX3R5cGUgPSB2cDU2X2RlY29kZV9tdihzLCByb3csIGNvbCk7Ci0gICAgcmVmX2ZyYW1lID0gZmZfdnA1Nl9yZWZlcmVuY2VfZnJhbWVbbWJfdHlwZV07Ci0KLSAgICBzLT5wYXJzZV9jb2VmZihzKTsKKyAgICBBVkZyYW1lICpmcmFtZV9jdXJyZW50LCAqZnJhbWVfcmVmOworICAgIFZQNTZGcmFtZSByZWZfZnJhbWUgPSBmZl92cDU2X3JlZmVyZW5jZV9mcmFtZVttYl90eXBlXTsKIAogICAgIHZwNTZfYWRkX3ByZWRpY3RvcnNfZGMocywgcmVmX2ZyYW1lKTsKIApAQCAtNDUzLDYgKzQ2MywzOSBAQAogICAgIH0KIH0KIAorc3RhdGljIGludCB2cDU2X2RlY29kZV9tYihWUDU2Q29udGV4dCAqcywgaW50IHJvdywgaW50IGNvbCwgaW50IGlzX2FscGhhKQoreworICAgIFZQNTZtYiBtYl90eXBlOworICAgIGludCByZXQ7CisKKyAgICBpZiAocy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmtleV9mcmFtZSkKKyAgICAgICAgbWJfdHlwZSA9IFZQNTZfTUJfSU5UUkE7CisgICAgZWxzZQorICAgICAgICBtYl90eXBlID0gdnA1Nl9kZWNvZGVfbXYocywgcm93LCBjb2wpOworCisgICAgcmV0ID0gcy0+cGFyc2VfY29lZmYocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICB2cDU2X3JlbmRlcl9tYihzLCByb3csIGNvbCwgaXNfYWxwaGEsIG1iX3R5cGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA1Nl9jb25jZWFsX21iKFZQNTZDb250ZXh0ICpzLCBpbnQgcm93LCBpbnQgY29sLCBpbnQgaXNfYWxwaGEpCit7CisgICAgVlA1Nm1iIG1iX3R5cGU7CisKKyAgICBpZiAocy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmtleV9mcmFtZSkKKyAgICAgICAgbWJfdHlwZSA9IFZQNTZfTUJfSU5UUkE7CisgICAgZWxzZQorICAgICAgICBtYl90eXBlID0gdnA1Nl9jb25jZWFsX212KHMsIHJvdywgY29sKTsKKworICAgIHZwNTZfcmVuZGVyX21iKHMsIHJvdywgY29sLCBpc19hbHBoYSwgbWJfdHlwZSk7CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCB2cDU2X3NpemVfY2hhbmdlZChWUDU2Q29udGV4dCAqcykKIHsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5hdmN0eDsKQEAgLTQ2NCw2ICs1MDcsOCBAQAogICAgIHMtPnBsYW5lX2hlaWdodFswXSA9IHMtPnBsYW5lX2hlaWdodFszXSA9IGF2Y3R4LT5jb2RlZF9oZWlnaHQ7CiAgICAgcy0+cGxhbmVfaGVpZ2h0WzFdID0gcy0+cGxhbmVfaGVpZ2h0WzJdID0gYXZjdHgtPmNvZGVkX2hlaWdodC8yOwogCisgICAgcy0+aGF2ZV91bmRhbWFnZWRfZnJhbWUgPSAwOworCiAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQogICAgICAgICBzLT5zdHJpZGVbaV0gPSBzLT5mbGlwICogcy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmxpbmVzaXplW2ldOwogCkBAIC01MjksMTMgKzU3NCwxOCBAQAogICAgIH0KIAogICAgIHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpOwotICAgIGlmIChyZXQgPCAwKQorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChyZXMgPT0gVlA1Nl9TSVpFX0NIQU5HRSkKKyAgICAgICAgICAgIGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCAwLCAwKTsKICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKICAgICBpZiAoYXZjdHgtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUCkgewogICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5hbHBoYV9jb250ZXh0LT5mcmFtZXNbVlA1Nl9GUkFNRV9DVVJSRU5UXSk7CiAgICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKHMtPmFscGhhX2NvbnRleHQtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLCBwKSkgPCAwKSB7CiAgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihwKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gVlA1Nl9TSVpFX0NIQU5HRSkKKyAgICAgICAgICAgICAgICBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgMCwgMCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfQpAQCAtNTY5LDggKzYxOSwxMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcy0+ZGlzY2FyZF9mcmFtZSA9IDA7CiAgICAgYXZjdHgtPmV4ZWN1dGUyKGF2Y3R4LCBmZl92cDU2X2RlY29kZV9tYnMsIDAsIDAsIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKSArIDEpOwogCisgICAgaWYgKHMtPmRpc2NhcmRfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgaWYgKChyZXMgPSBhdl9mcmFtZV9yZWYoZGF0YSwgcCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJlczsKICAgICAqZ290X2ZyYW1lID0gMTsKQEAgLTU4OSw2ICs2NDMsNyBAQAogICAgIGludCBibG9jaywgeSwgdXY7CiAgICAgcHRyZGlmZl90IHN0cmlkZV95LCBzdHJpZGVfdXY7CiAgICAgaW50IHJlczsKKyAgICBpbnQgZGFtYWdlZCA9IDA7CiAKICAgICBpZiAocC0+a2V5X2ZyYW1lKSB7CiAgICAgICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOwpAQCAtNjUzLDcgKzcwOCwxOCBAQAogICAgICAgICBzLT5ibG9ja19vZmZzZXRbNV0gPSBzLT5ibG9ja19vZmZzZXRbNF07CiAKICAgICAgICAgZm9yIChtYl9jb2w9MDsgbWJfY29sPHMtPm1iX3dpZHRoOyBtYl9jb2wrKykgewotICAgICAgICAgICAgdnA1Nl9kZWNvZGVfbWIocywgbWJfcm93LCBtYl9jb2wsIGlzX2FscGhhKTsKKyAgICAgICAgICAgIGlmICghZGFtYWdlZCkgeworICAgICAgICAgICAgICAgIGludCByZXQgPSB2cDU2X2RlY29kZV9tYihzLCBtYl9yb3csIG1iX2NvbCwgaXNfYWxwaGEpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRhbWFnZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPmhhdmVfdW5kYW1hZ2VkX2ZyYW1lIHx8ICFhdmN0eC0+ZXJyb3JfY29uY2VhbG1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRpc2NhcmRfZnJhbWUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGFtYWdlZCkKKyAgICAgICAgICAgICAgICB2cDU2X2NvbmNlYWxfbWIocywgbWJfcm93LCBtYl9jb2wsIGlzX2FscGhhKTsKIAogICAgICAgICAgICAgZm9yICh5PTA7IHk8NDsgeSsrKSB7CiAgICAgICAgICAgICAgICAgcy0+YWJvdmVfYmxvY2tfaWR4W3ldICs9IDI7CkBAIC02NjcsNiArNzMzLDkgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmICghZGFtYWdlZCkKKyAgICAgICAgcy0+aGF2ZV91bmRhbWFnZWRfZnJhbWUgPSAxOworCiBuZXh0OgogICAgIGlmIChwLT5rZXlfZnJhbWUgfHwgcy0+Z29sZGVuX2ZyYW1lKSB7CiAgICAgICAgIGF2X2ZyYW1lX3VucmVmKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0dPTERFTl0pOwpAQCAtNjk5LDcgKzc2OCw2IEBACiAgICAgZmZfaHBlbGRzcF9pbml0KCZzLT5oZHNwLCBhdmN0eC0+ZmxhZ3MpOwogICAgIGZmX3ZpZGVvZHNwX2luaXQoJnMtPnZkc3AsIDgpOwogICAgIGZmX3ZwM2RzcF9pbml0KCZzLT52cDNkc3AsIGF2Y3R4LT5mbGFncyk7Ci0gICAgZmZfdnA1NmRzcF9pbml0KCZzLT52cDU2ZHNwLCBhdmN0eC0+Y29kZWMtPmlkKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewogI2RlZmluZSBUUkFOU1BPU0UoeCkgKCgoeCkgPj4gMykgfCAoKCh4KSAmIDcpIDw8IDMpKQogICAgICAgICBzLT5pZGN0X3NjYW50YWJsZVtpXSA9IFRSQU5TUE9TRShmZl96aWd6YWdfZGlyZWN0W2ldKTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA1Ni5oIGIvbGliYXZjb2RlYy92cDU2LmgKaW5kZXggNTZjMzA5MS4uYjhkZGE5ZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDU2LmgKKysrIGIvbGliYXZjb2RlYy92cDU2LmgKQEAgLTI2LDYgKzI2LDcgQEAKICNpZm5kZWYgQVZDT0RFQ19WUDU2X0gKICNkZWZpbmUgQVZDT0RFQ19WUDU2X0gKIAorI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImhwZWxkc3AuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCkBAIC03Miw5ICs3Myw5IEBACiB0eXBlZGVmIHZvaWQgKCpWUDU2UGFyc2VWZWN0b3JBZGp1c3RtZW50KShWUDU2Q29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQNTZtdiAqdmVjdCk7CiB0eXBlZGVmIHZvaWQgKCpWUDU2RmlsdGVyKShWUDU2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MSwgaW50IG9mZnNldDIsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0MSwgaW50IG9mZnNldDIsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDU2bXYgbXYsIGludCBtYXNrLCBpbnQgc2VsZWN0LCBpbnQgbHVtYSk7Ci10eXBlZGVmIHZvaWQgKCpWUDU2UGFyc2VDb2VmZikoVlA1NkNvbnRleHQgKnMpOwordHlwZWRlZiBpbnQgICgqVlA1NlBhcnNlQ29lZmYpKFZQNTZDb250ZXh0ICpzKTsKIHR5cGVkZWYgdm9pZCAoKlZQNTZEZWZhdWx0TW9kZWxzSW5pdCkoVlA1NkNvbnRleHQgKnMpOwogdHlwZWRlZiB2b2lkICgqVlA1NlBhcnNlVmVjdG9yTW9kZWxzKShWUDU2Q29udGV4dCAqcyk7CiB0eXBlZGVmIGludCAgKCpWUDU2UGFyc2VDb2VmZk1vZGVscykoVlA1NkNvbnRleHQgKnMpOwpAQCAtMTc5LDcgKzE4MCw3IEBACiAgICAgaW50IGZsaXA7ICAvKiBhcmUgd2UgZmxpcHBpbmcgPyAqLwogICAgIGludCBmcmJpOyAgLyogZmlyc3Qgcm93IGJsb2NrIGluZGV4IGluIE1CICovCiAgICAgaW50IHNyYmk7ICAvKiBzZWNvbmQgcm93IGJsb2NrIGluZGV4IGluIE1CICovCi0gICAgaW50IHN0cmlkZVs0XTsgIC8qIHN0cmlkZSBmb3IgZWFjaCBwbGFuICovCisgICAgcHRyZGlmZl90IHN0cmlkZVs0XTsgIC8qIHN0cmlkZSBmb3IgZWFjaCBwbGFuICovCiAKICAgICBjb25zdCB1aW50OF90ICp2cDU2X2Nvb3JkX2RpdjsKICAgICBWUDU2UGFyc2VWZWN0b3JBZGp1c3RtZW50IHBhcnNlX3ZlY3Rvcl9hZGp1c3RtZW50OwpAQCAtMjAzLDYgKzIwNCw5IEBACiAgICAgVkxDIHJ1bnZfdmxjWzJdOwogICAgIFZMQyByYWN0X3ZsY1syXVszXVs2XTsKICAgICB1bnNpZ25lZCBpbnQgbmJfbnVsbFsyXVsyXTsgICAgICAgLyogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIE5VTEwgREMvQUMgKi8KKworICAgIGludCBoYXZlX3VuZGFtYWdlZF9mcmFtZTsKKyAgICBpbnQgZGlzY2FyZF9mcmFtZTsKIH07CiAKIApAQCAtMjIxLDcgKzIyNSw3IEBACiAgKi8KIAogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdnA1Nl9ub3JtX3NoaWZ0WzI1Nl07Ci12b2lkIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKFZQNTZSYW5nZUNvZGVyICpjLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7CitpbnQgZmZfdnA1Nl9pbml0X3JhbmdlX2RlY29kZXIoVlA1NlJhbmdlQ29kZXIgKmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKTsKIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdW5zaWduZWQgaW50IHZwNTZfcmFjX3Jlbm9ybShWUDU2UmFuZ2VDb2RlciAqYykKIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA1NmRzcC5jIGIvbGliYXZjb2RlYy92cDU2ZHNwLmMKaW5kZXggZmE1MzNlYy4uOWYyOTlkYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDU2ZHNwLmMKKysrIGIvbGliYXZjb2RlYy92cDU2ZHNwLmMKQEAgLTI2LDYgKzI2LDIzIEBACiAjaW5jbHVkZSAidnA1NmRzcC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKIAorI2RlZmluZSBWUDU2X0VER0VfRklMVEVSKHBmeCwgc3VmLCBwaXhfaW5jLCBsaW5lX2luYykgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgcGZ4ICMjIF9lZGdlX2ZpbHRlcl8gIyMgc3VmKHVpbnQ4X3QgKnl1diwgcHRyZGlmZl90IHN0cmlkZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBwaXgyX2luYyA9IDIgKiBwaXhfaW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaT0wOyBpPDEyOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2ID0gKHl1dlstcGl4Ml9pbmNdICsgMyooeXV2WzBdLXl1dlstcGl4X2luY10pIC0geXV2W3BpeF9pbmNdICsgNCk+PjM7XAorICAgICAgICB2ID0gcGZ4IyNfYWRqdXN0KHYsIHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB5dXZbLXBpeF9pbmNdID0gYXZfY2xpcF91aW50OCh5dXZbLXBpeF9pbmNdICsgdik7ICAgICAgICAgICAgICAgXAorICAgICAgICB5dXZbMF0gPSBhdl9jbGlwX3VpbnQ4KHl1dlswXSAtIHYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB5dXYgKz0gbGluZV9pbmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjaWYgQ09ORklHX1ZQNV9ERUNPREVSCiAvKiBHaXZlcyB2ZXJ5IHNpbWlsYXIgcmVzdWx0IHRoYW4gdGhlIHZwNiB2ZXJzaW9uIGV4Y2VwdCBpbiBhIGZldyBjYXNlcyAqLwogc3RhdGljIGludCB2cDVfYWRqdXN0KGludCB2LCBpbnQgdCkKIHsKQEAgLTQzLDYgKzYwLDE4IEBACiAgICAgcmV0dXJuIHY7CiB9CiAKKworVlA1Nl9FREdFX0ZJTFRFUih2cDUsIGhvciwgMSwgc3RyaWRlKQorVlA1Nl9FREdFX0ZJTFRFUih2cDUsIHZlciwgc3RyaWRlLCAxKQorCithdl9jb2xkIHZvaWQgZmZfdnA1ZHNwX2luaXQoVlA1NkRTUENvbnRleHQgKnMpCit7CisgICAgcy0+ZWRnZV9maWx0ZXJfaG9yID0gdnA1X2VkZ2VfZmlsdGVyX2hvcjsKKyAgICBzLT5lZGdlX2ZpbHRlcl92ZXIgPSB2cDVfZWRnZV9maWx0ZXJfdmVyOworfQorI2VuZGlmIC8qIENPTkZJR19WUDVfREVDT0RFUiAqLworCisjaWYgQ09ORklHX1ZQNl9ERUNPREVSCiBzdGF0aWMgaW50IHZwNl9hZGp1c3QoaW50IHYsIGludCB0KQogewogICAgIGludCBWID0gdiwgcyA9IHYgPj4gMzE7CkBAIC01Niw0MyArODUsMTkgQEAKICAgICByZXR1cm4gVjsKIH0KIAotCi0jZGVmaW5lIFZQNTZfRURHRV9GSUxURVIocGZ4LCBzdWYsIHBpeF9pbmMsIGxpbmVfaW5jKSAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBwZngjI19lZGdlX2ZpbHRlcl8jI3N1Zih1aW50OF90ICp5dXYsIGludCBzdHJpZGUsIGludCB0KSAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHBpeDJfaW5jID0gMiAqIHBpeF9pbmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGksIHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpPTA7IGk8MTI7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHYgPSAoeXV2Wy1waXgyX2luY10gKyAzKih5dXZbMF0teXV2Wy1waXhfaW5jXSkgLSB5dXZbcGl4X2luY10gKyA0KT4+MztcCi0gICAgICAgIHYgPSBwZngjI19hZGp1c3QodiwgdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHl1dlstcGl4X2luY10gPSBhdl9jbGlwX3VpbnQ4KHl1dlstcGl4X2luY10gKyB2KTsgICAgICAgICAgICAgICBcCi0gICAgICAgIHl1dlswXSA9IGF2X2NsaXBfdWludDgoeXV2WzBdIC0gdik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHl1diArPSBsaW5lX2luYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLVZQNTZfRURHRV9GSUxURVIodnA1LCBob3IsIDEsIHN0cmlkZSkKLVZQNTZfRURHRV9GSUxURVIodnA1LCB2ZXIsIHN0cmlkZSwgMSkKIFZQNTZfRURHRV9GSUxURVIodnA2LCBob3IsIDEsIHN0cmlkZSkKIFZQNTZfRURHRV9GSUxURVIodnA2LCB2ZXIsIHN0cmlkZSwgMSkKIAotYXZfY29sZCB2b2lkIGZmX3ZwNTZkc3BfaW5pdChWUDU2RFNQQ29udGV4dCAqcywgZW51bSBBVkNvZGVjSUQgY29kZWMpCithdl9jb2xkIHZvaWQgZmZfdnA2ZHNwX2luaXQoVlA1NkRTUENvbnRleHQgKnMpCiB7Ci0gICAgaWYgKGNvZGVjID09IEFWX0NPREVDX0lEX1ZQNSkgewotICAgICAgICBzLT5lZGdlX2ZpbHRlcl9ob3IgPSB2cDVfZWRnZV9maWx0ZXJfaG9yOwotICAgICAgICBzLT5lZGdlX2ZpbHRlcl92ZXIgPSB2cDVfZWRnZV9maWx0ZXJfdmVyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMtPmVkZ2VfZmlsdGVyX2hvciA9IHZwNl9lZGdlX2ZpbHRlcl9ob3I7Ci0gICAgICAgIHMtPmVkZ2VfZmlsdGVyX3ZlciA9IHZwNl9lZGdlX2ZpbHRlcl92ZXI7CisgICAgcy0+ZWRnZV9maWx0ZXJfaG9yID0gdnA2X2VkZ2VfZmlsdGVyX2hvcjsKKyAgICBzLT5lZGdlX2ZpbHRlcl92ZXIgPSB2cDZfZWRnZV9maWx0ZXJfdmVyOwogCi0gICAgICAgIGlmIChDT05GSUdfVlA2X0RFQ09ERVIpIHsKLSAgICAgICAgICAgIHMtPnZwNl9maWx0ZXJfZGlhZzQgPSBmZl92cDZfZmlsdGVyX2RpYWc0X2M7CisgICAgcy0+dnA2X2ZpbHRlcl9kaWFnNCA9IGZmX3ZwNl9maWx0ZXJfZGlhZzRfYzsKIAotICAgICAgICAgICAgaWYgKEFSQ0hfQVJNKQotICAgICAgICAgICAgICAgIGZmX3ZwNmRzcF9pbml0X2FybShzLCBjb2RlYyk7Ci0gICAgICAgICAgICBpZiAoQVJDSF9YODYpCi0gICAgICAgICAgICAgICAgZmZfdnA2ZHNwX2luaXRfeDg2KHMsIGNvZGVjKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIGZmX3ZwNmRzcF9pbml0X2FybShzKTsKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3ZwNmRzcF9pbml0X3g4NihzKTsKIH0KKyNlbmRpZiAvKiBDT05GSUdfVlA2X0RFQ09ERVIgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA1NmRzcC5oIGIvbGliYXZjb2RlYy92cDU2ZHNwLmgKaW5kZXggNzgwN2JhYS4uZTM1ZTIzMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDU2ZHNwLmgKKysrIGIvbGliYXZjb2RlYy92cDU2ZHNwLmgKQEAgLTIxLDIyICsyMSwyNCBAQAogI2lmbmRlZiBBVkNPREVDX1ZQNTZEU1BfSAogI2RlZmluZSBBVkNPREVDX1ZQNTZEU1BfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAiYXZjb2RlYy5oIgogCiB0eXBlZGVmIHN0cnVjdCBWUDU2RFNQQ29udGV4dCB7Ci0gICAgdm9pZCAoKmVkZ2VfZmlsdGVyX2hvcikodWludDhfdCAqeXV2LCBpbnQgc3RyaWRlLCBpbnQgdCk7Ci0gICAgdm9pZCAoKmVkZ2VfZmlsdGVyX3ZlcikodWludDhfdCAqeXV2LCBpbnQgc3RyaWRlLCBpbnQgdCk7CisgICAgdm9pZCAoKmVkZ2VfZmlsdGVyX2hvcikodWludDhfdCAqeXV2LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgdCk7CisgICAgdm9pZCAoKmVkZ2VfZmlsdGVyX3ZlcikodWludDhfdCAqeXV2LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgdCk7CiAKLSAgICB2b2lkICgqdnA2X2ZpbHRlcl9kaWFnNCkodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgdm9pZCAoKnZwNl9maWx0ZXJfZGlhZzQpKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoX3dlaWdodHMsY29uc3QgaW50MTZfdCAqdl93ZWlnaHRzKTsKIH0gVlA1NkRTUENvbnRleHQ7CiAKLXZvaWQgZmZfdnA2X2ZpbHRlcl9kaWFnNF9jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl92cDZfZmlsdGVyX2RpYWc0X2ModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoX3dlaWdodHMsIGNvbnN0IGludDE2X3QgKnZfd2VpZ2h0cyk7CiAKLXZvaWQgZmZfdnA1NmRzcF9pbml0KFZQNTZEU1BDb250ZXh0ICpzLCBlbnVtIEFWQ29kZWNJRCBjb2RlYyk7Ci12b2lkIGZmX3ZwNmRzcF9pbml0X2FybShWUDU2RFNQQ29udGV4dCAqcywgZW51bSBBVkNvZGVjSUQgY29kZWMpOwotdm9pZCBmZl92cDZkc3BfaW5pdF94ODYoVlA1NkRTUENvbnRleHQqIGMsIGVudW0gQVZDb2RlY0lEIGNvZGVjKTsKK3ZvaWQgZmZfdnA1ZHNwX2luaXQoVlA1NkRTUENvbnRleHQgKnMpOwordm9pZCBmZl92cDZkc3BfaW5pdChWUDU2RFNQQ29udGV4dCAqcyk7CisKK3ZvaWQgZmZfdnA2ZHNwX2luaXRfYXJtKFZQNTZEU1BDb250ZXh0ICpzKTsKK3ZvaWQgZmZfdnA2ZHNwX2luaXRfeDg2KFZQNTZEU1BDb250ZXh0ICpzKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfVlA1NkRTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwNTZyYWMuYyBiL2xpYmF2Y29kZWMvdnA1NnJhYy5jCmluZGV4IDYwNjFiN2UuLmU3MDMwMmIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdnA1NnJhYy5jCisrKyBiL2xpYmF2Y29kZWMvdnA1NnJhYy5jCkBAIC0zNywxMSArMzcsMTQgQEAKICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCiB9OwogCi12b2lkIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKFZQNTZSYW5nZUNvZGVyICpjLCBjb25zdCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK2ludCBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2RlcihWUDU2UmFuZ2VDb2RlciAqYywgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCiB7CiAgICAgYy0+aGlnaCA9IDI1NTsKICAgICBjLT5iaXRzID0gLTE2OwogICAgIGMtPmJ1ZmZlciA9IGJ1ZjsKICAgICBjLT5lbmQgPSBidWYgKyBidWZfc2l6ZTsKKyAgICBpZiAoYnVmX3NpemUgPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICBjLT5jb2RlX3dvcmQgPSBieXRlc3RyZWFtX2dldF9iZTI0KCZjLT5idWZmZXIpOworICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDYuYyBiL2xpYmF2Y29kZWMvdnA2LmMKaW5kZXggYTJiYjQ1Ny4uNjQ1ZmM1YyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDYuYworKysgYi9saWJhdmNvZGVjL3ZwNi5jCkBAIC00MCw4ICs0MCw4IEBACiAKICNkZWZpbmUgVlA2X01BWF9IVUZGX1NJWkUgMTIKIAotc3RhdGljIHZvaWQgdnA2X3BhcnNlX2NvZWZmKFZQNTZDb250ZXh0ICpzKTsKLXN0YXRpYyB2b2lkIHZwNl9wYXJzZV9jb2VmZl9odWZmbWFuKFZQNTZDb250ZXh0ICpzKTsKK3N0YXRpYyBpbnQgdnA2X3BhcnNlX2NvZWZmKFZQNTZDb250ZXh0ICpzKTsKK3N0YXRpYyBpbnQgdnA2X3BhcnNlX2NvZWZmX2h1ZmZtYW4oVlA1NkNvbnRleHQgKnMpOwogCiBzdGF0aWMgaW50IHZwNl9wYXJzZV9oZWFkZXIoVlA1NkNvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQogewpAQCAtNTIsNiArNTIsNyBAQAogICAgIGludCBzdWJfdmVyc2lvbjsKICAgICBpbnQgcm93cywgY29sczsKICAgICBpbnQgcmVzID0gMDsKKyAgICBpbnQgcmV0OwogICAgIGludCBzZXBhcmF0ZWRfY29lZmYgPSBidWZbMF0gJiAxOwogCiAgICAgcy0+ZnJhbWVzW1ZQNTZfRlJBTUVfQ1VSUkVOVF0tPmtleV9mcmFtZSA9ICEoYnVmWzBdICYgMHg4MCk7CkBAIC05Myw3ICs5NCw3IEBACiAgICAgICAgICAgICAgICAgcy0+YXZjdHgtPmNvZGVkX3dpZHRoICA9IDE2ICogY29sczsKICAgICAgICAgICAgICAgICBzLT5hdmN0eC0+Y29kZWRfaGVpZ2h0ID0gMTYgKiByb3dzOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMocy0+YXZjdHgsIDE2ICogY29scywgMTYgKiByb3dzKTsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhzLT5hdmN0eCwgMTYgKiBjb2xzLCAxNiAqIHJvd3MpOwogICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogCkBAIC0xMDUsNyArMTA2LDkgQEAKICAgICAgICAgICAgIHJlcyA9IFZQNTZfU0laRV9DSEFOR0U7CiAgICAgICAgIH0KIAotICAgICAgICBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2RlcihjLCBidWYrNiwgYnVmX3NpemUtNik7CisgICAgICAgIHJldCA9IGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKGMsIGJ1Zis2LCBidWZfc2l6ZS02KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIHZwNTZfcmFjX2dldHMoYywgMik7CiAKICAgICAgICAgcGFyc2VfZmlsdGVyX2luZm8gPSBzLT5maWx0ZXJfaGVhZGVyOwpAQCAtMTIyLDcgKzEyNSw5IEBACiAgICAgICAgICAgICBidWYgKz0gMjsKICAgICAgICAgICAgIGJ1Zl9zaXplIC09IDI7CiAgICAgICAgIH0KLSAgICAgICAgZmZfdnA1Nl9pbml0X3JhbmdlX2RlY29kZXIoYywgYnVmKzEsIGJ1Zl9zaXplLTEpOworICAgICAgICByZXQgPSBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2RlcihjLCBidWYrMSwgYnVmX3NpemUtMSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgICAgICBzLT5nb2xkZW5fZnJhbWUgPSB2cDU2X3JhY19nZXQoYyk7CiAgICAgICAgIGlmIChzLT5maWx0ZXJfaGVhZGVyKSB7CkBAIC0xNTcsMTUgKzE2MiwxNiBAQAogICAgICAgICBidWYgICAgICArPSBjb2VmZl9vZmZzZXQ7CiAgICAgICAgIGJ1Zl9zaXplIC09IGNvZWZmX29mZnNldDsKICAgICAgICAgaWYgKGJ1Zl9zaXplIDwgMCkgewotICAgICAgICAgICAgaWYgKHMtPmZyYW1lc1tWUDU2X0ZSQU1FX0NVUlJFTlRdLT5rZXlfZnJhbWUpCi0gICAgICAgICAgICAgICAgZmZfc2V0X2RpbWVuc2lvbnMocy0+YXZjdHgsIDAsIDApOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgICAgIGlmIChzLT51c2VfaHVmZm1hbikgewogICAgICAgICAgICAgcy0+cGFyc2VfY29lZmYgPSB2cDZfcGFyc2VfY29lZmZfaHVmZm1hbjsKICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJnMtPmdiLCBidWYsIGJ1Zl9zaXplPDwzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKCZzLT5jYywgYnVmLCBidWZfc2l6ZSk7CisgICAgICAgICAgICByZXQgPSBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+Y2MsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgcy0+Y2NwID0gJnMtPmNjOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE3Myw2ICsxNzksMTAgQEAKICAgICB9CiAKICAgICByZXR1cm4gcmVzOworZmFpbDoKKyAgICBpZiAocmVzID09IFZQNTZfU0laRV9DSEFOR0UpCisgICAgICAgIGZmX3NldF9kaW1lbnNpb25zKHMtPmF2Y3R4LCAwLCAwKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCB2cDZfY29lZmZfb3JkZXJfdGFibGVfaW5pdChWUDU2Q29udGV4dCAqcykKQEAgLTM4MCw3ICszOTAsNyBAQAogICAgIHJldHVybiB2YWw7CiB9CiAKLXN0YXRpYyB2b2lkIHZwNl9wYXJzZV9jb2VmZl9odWZmbWFuKFZQNTZDb250ZXh0ICpzKQorc3RhdGljIGludCB2cDZfcGFyc2VfY29lZmZfaHVmZm1hbihWUDU2Q29udGV4dCAqcykKIHsKICAgICBWUDU2TW9kZWwgKm1vZGVsID0gcy0+bW9kZWxwOwogICAgIHVpbnQ4X3QgKnBlcm11dGUgPSBzLT5pZGN0X3NjYW50YWJsZTsKQEAgLTQwMiw3ICs0MTIsNyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8PSAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgIGNvZWZmID0gZ2V0X3ZsYzIoJnMtPmdiLCB2bGNfY29lZmYtPnRhYmxlLCBGRl9IVUZGTUFOX0JJVFMsIDMpOwogICAgICAgICAgICAgICAgIGlmIChjb2VmZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2VmZl9pZHgpIHsKQEAgLTQzNyw5ICs0NDcsMTAgQEAKICAgICAgICAgICAgIHZsY19jb2VmZiA9ICZzLT5yYWN0X3ZsY1twdF1bY3RdW2NnXTsKICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdnA2X3BhcnNlX2NvZWZmKFZQNTZDb250ZXh0ICpzKQorc3RhdGljIGludCB2cDZfcGFyc2VfY29lZmYoVlA1NkNvbnRleHQgKnMpCiB7CiAgICAgVlA1NlJhbmdlQ29kZXIgKmMgPSBzLT5jY3A7CiAgICAgVlA1Nk1vZGVsICptb2RlbCA9IHMtPm1vZGVscDsKQEAgLTQ0OSw2ICs0NjAsMTEgQEAKICAgICBpbnQgYiwgaSwgY2csIGlkeCwgY3R4OwogICAgIGludCBwdCA9IDA7ICAgIC8qIHBsYW5lIHR5cGUgKDAgZm9yIFksIDEgZm9yIFUgb3IgVikgKi8KIAorICAgIGlmIChjLT5lbmQgPD0gYy0+YnVmZmVyICYmIGMtPmJpdHMgPj0gMCkgeworICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkVuZCBvZiBBQyBzdHJlYW0gcmVhY2hlZCBpbiB2cDZfcGFyc2VfY29lZmZcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKICAgICBmb3IgKGI9MDsgYjw2OyBiKyspIHsKICAgICAgICAgaW50IGN0ID0gMTsgICAgLyogY29kZSB0eXBlICovCiAgICAgICAgIGludCBydW4gPSAxOwpAQCAtNTEyLDkgKzUyOCwxMCBAQAogICAgICAgICBzLT5sZWZ0X2Jsb2NrW2ZmX3ZwNTZfYjZ0bzRbYl1dLm5vdF9udWxsX2RjID0KICAgICAgICAgcy0+YWJvdmVfYmxvY2tzW3MtPmFib3ZlX2Jsb2NrX2lkeFtiXV0ubm90X251bGxfZGMgPSAhIXMtPmJsb2NrX2NvZWZmW2JdWzBdOwogICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB2cDZfYmxvY2tfdmFyaWFuY2UodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorc3RhdGljIGludCB2cDZfYmxvY2tfdmFyaWFuY2UodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogewogICAgIGludCBzdW0gPSAwLCBzcXVhcmVfc3VtID0gMDsKICAgICBpbnQgeSwgeDsKQEAgLTUyOSw3ICs1NDYsNyBAQAogICAgIHJldHVybiAoMTYqc3F1YXJlX3N1bSAtIHN1bSpzdW0pID4+IDg7CiB9CiAKLXN0YXRpYyB2b2lkIHZwNl9maWx0ZXJfaHY0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAorc3RhdGljIHZvaWQgdnA2X2ZpbHRlcl9odjQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEsIGNvbnN0IGludDE2X3QgKndlaWdodHMpCiB7CiAgICAgaW50IHgsIHk7CkBAIC01NDcsNyArNTY0LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgdnA2X2ZpbHRlcl9kaWFnMihWUDU2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoX3dlaWdodCwgaW50IHZfd2VpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaF93ZWlnaHQsIGludCB2X3dlaWdodCkKIHsKICAgICB1aW50OF90ICp0bXAgPSBzLT5lZGdlX2VtdV9idWZmZXIrMTY7CiAgICAgcy0+aDI2NGNocm9tYS5wdXRfaDI2NF9jaHJvbWFfcGl4ZWxzX3RhYlswXSh0bXAsIHNyYywgc3RyaWRlLCA5LCBoX3dlaWdodCwgMCk7CkBAIC01NTUsNyArNTcyLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgdnA2X2ZpbHRlcihWUDU2Q29udGV4dCAqcywgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQxLCBpbnQgb2Zmc2V0MiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldDEsIGludCBvZmZzZXQyLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICBWUDU2bXYgbXYsIGludCBtYXNrLCBpbnQgc2VsZWN0LCBpbnQgbHVtYSkKIHsKICAgICBpbnQgZmlsdGVyNCA9IDA7CkBAIC02MTQsNiArNjMxLDcgQEAKICAgICBpZiAoKHJldCA9IGZmX3ZwNTZfaW5pdChhdmN0eCwgYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9WUDYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjdHgtPmNvZGVjLT5pZCA9PSBBVl9DT0RFQ19JRF9WUDZBKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OworICAgIGZmX3ZwNmRzcF9pbml0KCZzLT52cDU2ZHNwKTsKIAogICAgIHZwNl9kZWNvZGVfaW5pdF9jb250ZXh0KHMpOwogCkBAIC02MjEsNiArNjM5LDcgQEAKICAgICAgICAgcy0+YWxwaGFfY29udGV4dCA9IGF2X21hbGxvY3ooc2l6ZW9mKFZQNTZDb250ZXh0KSk7CiAgICAgICAgIGZmX3ZwNTZfaW5pdF9jb250ZXh0KGF2Y3R4LCBzLT5hbHBoYV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mbGlwID09IC0xLCBzLT5oYXNfYWxwaGEpOworICAgICAgICBmZl92cDZkc3BfaW5pdCgmcy0+YWxwaGFfY29udGV4dC0+dnA1NmRzcCk7CiAgICAgICAgIHZwNl9kZWNvZGVfaW5pdF9jb250ZXh0KHMtPmFscGhhX2NvbnRleHQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDZkc3AuYyBiL2xpYmF2Y29kZWMvdnA2ZHNwLmMKaW5kZXggNjdjNmJlMC4uZjdmNjg1NiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDZkc3AuYworKysgYi9saWJhdmNvZGVjL3ZwNmRzcC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAidnA1NmRzcC5oIgogCiAKLXZvaWQgZmZfdnA2X2ZpbHRlcl9kaWFnNF9jKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl92cDZfZmlsdGVyX2RpYWc0X2ModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoX3dlaWdodHMsIGNvbnN0IGludDE2X3QgKnZfd2VpZ2h0cykKIHsKICAgICBpbnQgeCwgeTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA4LmMgYi9saWJhdmNvZGVjL3ZwOC5jCmluZGV4IDY0MDM3ZmMuLjYyYjlmOGIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdnA4LmMKKysrIGIvbGliYXZjb2RlYy92cDguYwpAQCAtMjcsNyArMjcsOSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgorI2luY2x1ZGUgImh3YWNjZWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1hdGhvcHMuaCIKICNpbmNsdWRlICJyZWN0YW5nbGUuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ2cDguaCIKQEAgLTcxLDE2ICs3MywzMCBAQAogICAgIGlmICgocmV0ID0gZmZfdGhyZWFkX2dldF9idWZmZXIocy0+YXZjdHgsICZmLT50ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiA/IEFWX0dFVF9CVUZGRVJfRkxBR19SRUYgOiAwKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwotICAgIGlmICghKGYtPnNlZ19tYXAgPSBhdl9idWZmZXJfYWxsb2N6KHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0KSkpIHsKLSAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKHMtPmF2Y3R4LCAmZi0+dGYpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICghKGYtPnNlZ19tYXAgPSBhdl9idWZmZXJfYWxsb2N6KHMtPm1iX3dpZHRoICogcy0+bWJfaGVpZ2h0KSkpCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAocy0+YXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgY29uc3QgQVZIV0FjY2VsICpod2FjY2VsID0gcy0+YXZjdHgtPmh3YWNjZWw7CisgICAgICAgIGlmIChod2FjY2VsLT5mcmFtZV9wcml2X2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgZi0+aHdhY2NlbF9wcml2X2J1ZiA9IGF2X2J1ZmZlcl9hbGxvY3ooaHdhY2NlbC0+ZnJhbWVfcHJpdl9kYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKCFmLT5od2FjY2VsX3ByaXZfYnVmKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGYtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlID0gZi0+aHdhY2NlbF9wcml2X2J1Zi0+ZGF0YTsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9idWZmZXJfdW5yZWYoJmYtPnNlZ19tYXApOworICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihzLT5hdmN0eCwgJmYtPnRmKTsKKyAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogfQogCiBzdGF0aWMgdm9pZCB2cDhfcmVsZWFzZV9mcmFtZShWUDhDb250ZXh0ICpzLCBWUDhGcmFtZSAqZikKIHsKICAgICBhdl9idWZmZXJfdW5yZWYoJmYtPnNlZ19tYXApOworICAgIGF2X2J1ZmZlcl91bnJlZigmZi0+aHdhY2NlbF9wcml2X2J1Zik7CisgICAgZi0+aHdhY2NlbF9waWN0dXJlX3ByaXZhdGUgPSBOVUxMOwogICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihzLT5hdmN0eCwgJmYtPnRmKTsKIH0KIApAQCAtOTgsNiArMTE0LDEyIEBACiAgICAgICAgIHZwOF9yZWxlYXNlX2ZyYW1lKHMsIGRzdCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQorICAgIGlmIChzcmMtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlKSB7CisgICAgICAgIGRzdC0+aHdhY2NlbF9wcml2X2J1ZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5od2FjY2VsX3ByaXZfYnVmKTsKKyAgICAgICAgaWYgKCFkc3QtPmh3YWNjZWxfcHJpdl9idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBkc3QtPmh3YWNjZWxfcGljdHVyZV9wcml2YXRlID0gZHN0LT5od2FjY2VsX3ByaXZfYnVmLT5kYXRhOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQpAQCAtMTM5LDEyICsxNjEsMjggQEAKICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRkFUQUwsICJSYW4gb3V0IG9mIGZyZWUgZnJhbWVzIVxuIik7CiAgICAgICAgIGFib3J0KCk7CiAgICAgfQotICAgIGlmIChmcmFtZS0+dGYuZi0+ZGF0YVswXSkKKyAgICBpZiAoZnJhbWUtPnRmLmYtPmJ1ZlswXSkKICAgICAgICAgdnA4X3JlbGVhc2VfZnJhbWUocywgZnJhbWUpOwogCiAgICAgcmV0dXJuIGZyYW1lOwogfQogCitzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGdldF9waXhlbF9mb3JtYXQoVlA4Q29udGV4dCAqcykKK3sKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyNpZiBDT05GSUdfVlA4X1ZBQVBJX0hXQUNDRUwKKyAgICAgICAgQVZfUElYX0ZNVF9WQUFQSSwKKyNlbmRpZgorI2lmIENPTkZJR19WUDhfTlZERUNfSFdBQ0NFTAorICAgICAgICBBVl9QSVhfRk1UX0NVREEsCisjZW5kaWYKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUsCisgICAgfTsKKworICAgIHJldHVybiBmZl9nZXRfZm9ybWF0KHMtPmF2Y3R4LCBwaXhfZm10cyk7Cit9CisKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lCiBpbnQgdXBkYXRlX2RpbWVuc2lvbnMoVlA4Q29udGV4dCAqcywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgaXNfdnA3KQogewpAQCAtMTYwLDYgKzE5OCwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKKyAgICBpZiAoIXMtPmFjdHVhbGx5X3dlYnAgJiYgIWlzX3ZwNykgeworICAgICAgICBzLT5waXhfZm10ID0gZ2V0X3BpeGVsX2Zvcm1hdChzKTsKKyAgICAgICAgaWYgKHMtPnBpeF9mbXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBzLT5waXhfZm10OworICAgIH0KKwogICAgIHMtPm1iX3dpZHRoICA9IChzLT5hdmN0eC0+Y29kZWRfd2lkdGggICsgMTUpIC8gMTY7CiAgICAgcy0+bWJfaGVpZ2h0ID0gKHMtPmF2Y3R4LT5jb2RlZF9oZWlnaHQgKyAxNSkgLyAxNjsKIApAQCAtMjE3LDggKzI2Miw5IEBACiAgICAgaW50IGk7CiAKICAgICBzLT5zZWdtZW50YXRpb24udXBkYXRlX21hcCA9IHZwOF9yYWNfZ2V0KGMpOworICAgIHMtPnNlZ21lbnRhdGlvbi51cGRhdGVfZmVhdHVyZV9kYXRhID0gdnA4X3JhY19nZXQoYyk7CiAKLSAgICBpZiAodnA4X3JhY19nZXQoYykpIHsgLy8gdXBkYXRlIHNlZ21lbnQgZmVhdHVyZSBkYXRhCisgICAgaWYgKHMtPnNlZ21lbnRhdGlvbi51cGRhdGVfZmVhdHVyZV9kYXRhKSB7CiAgICAgICAgIHMtPnNlZ21lbnRhdGlvbi5hYnNvbHV0ZV92YWxzID0gdnA4X3JhY19nZXQoYyk7CiAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKQEAgLTI2MCw2ICszMDYsNyBAQAogewogICAgIGNvbnN0IHVpbnQ4X3QgKnNpemVzID0gYnVmOwogICAgIGludCBpOworICAgIGludCByZXQ7CiAKICAgICBzLT5udW1fY29lZmZfcGFydGl0aW9ucyA9IDEgPDwgdnA4X3JhY19nZXRfdWludCgmcy0+YywgMik7CiAKQEAgLTI3MiwxMSArMzE5LDE2IEBACiAgICAgICAgIGludCBzaXplID0gQVZfUkwyNChzaXplcyArIDMgKiBpKTsKICAgICAgICAgaWYgKGJ1Zl9zaXplIC0gc2l6ZSA8IDApCiAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHMtPmNvZWZmX3BhcnRpdGlvbl9zaXplW2ldID0gc2l6ZTsKIAotICAgICAgICBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+Y29lZmZfcGFydGl0aW9uW2ldLCBidWYsIHNpemUpOworICAgICAgICByZXQgPSBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+Y29lZmZfcGFydGl0aW9uW2ldLCBidWYsIHNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIGJ1ZiAgICAgICs9IHNpemU7CiAgICAgICAgIGJ1Zl9zaXplIC09IHNpemU7CiAgICAgfQorCisgICAgcy0+Y29lZmZfcGFydGl0aW9uX3NpemVbaV0gPSBidWZfc2l6ZTsKICAgICBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+Y29lZmZfcGFydGl0aW9uW2ldLCBidWYsIGJ1Zl9zaXplKTsKIAogICAgIHJldHVybiAwOwpAQCAtMzA2LDI4ICszNTgsMjggQEAKICAgICBWUDU2UmFuZ2VDb2RlciAqYyA9ICZzLT5jOwogICAgIGludCBpLCBiYXNlX3FpOwogCi0gICAgaW50IHlhY19xaSAgICAgPSB2cDhfcmFjX2dldF91aW50KGMsIDcpOwotICAgIGludCB5ZGNfZGVsdGEgID0gdnA4X3JhY19nZXRfc2ludChjLCA0KTsKLSAgICBpbnQgeTJkY19kZWx0YSA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNCk7Ci0gICAgaW50IHkyYWNfZGVsdGEgPSB2cDhfcmFjX2dldF9zaW50KGMsIDQpOwotICAgIGludCB1dmRjX2RlbHRhID0gdnA4X3JhY19nZXRfc2ludChjLCA0KTsKLSAgICBpbnQgdXZhY19kZWx0YSA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNCk7CisgICAgcy0+cXVhbnQueWFjX3FpICAgICA9IHZwOF9yYWNfZ2V0X3VpbnQoYywgNyk7CisgICAgcy0+cXVhbnQueWRjX2RlbHRhICA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNCk7CisgICAgcy0+cXVhbnQueTJkY19kZWx0YSA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNCk7CisgICAgcy0+cXVhbnQueTJhY19kZWx0YSA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNCk7CisgICAgcy0+cXVhbnQudXZkY19kZWx0YSA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNCk7CisgICAgcy0+cXVhbnQudXZhY19kZWx0YSA9IHZwOF9yYWNfZ2V0X3NpbnQoYywgNCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgIGlmIChzLT5zZWdtZW50YXRpb24uZW5hYmxlZCkgewogICAgICAgICAgICAgYmFzZV9xaSA9IHMtPnNlZ21lbnRhdGlvbi5iYXNlX3F1YW50W2ldOwogICAgICAgICAgICAgaWYgKCFzLT5zZWdtZW50YXRpb24uYWJzb2x1dGVfdmFscykKLSAgICAgICAgICAgICAgICBiYXNlX3FpICs9IHlhY19xaTsKKyAgICAgICAgICAgICAgICBiYXNlX3FpICs9IHMtPnF1YW50LnlhY19xaTsKICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBiYXNlX3FpID0geWFjX3FpOworICAgICAgICAgICAgYmFzZV9xaSA9IHMtPnF1YW50LnlhY19xaTsKIAotICAgICAgICBzLT5xbWF0W2ldLmx1bWFfcW11bFswXSAgICA9IHZwOF9kY19xbG9va3VwW2F2X2NsaXBfdWludHAyKGJhc2VfcWkgKyB5ZGNfZGVsdGEsICA3KV07CisgICAgICAgIHMtPnFtYXRbaV0ubHVtYV9xbXVsWzBdICAgID0gdnA4X2RjX3Fsb29rdXBbYXZfY2xpcF91aW50cDIoYmFzZV9xaSArIHMtPnF1YW50LnlkY19kZWx0YSwgIDcpXTsKICAgICAgICAgcy0+cW1hdFtpXS5sdW1hX3FtdWxbMV0gICAgPSB2cDhfYWNfcWxvb2t1cFthdl9jbGlwX3VpbnRwMihiYXNlX3FpLCAgICAgICAgICAgICAgNyldOwotICAgICAgICBzLT5xbWF0W2ldLmx1bWFfZGNfcW11bFswXSA9IHZwOF9kY19xbG9va3VwW2F2X2NsaXBfdWludHAyKGJhc2VfcWkgKyB5MmRjX2RlbHRhLCA3KV0gKiAyOworICAgICAgICBzLT5xbWF0W2ldLmx1bWFfZGNfcW11bFswXSA9IHZwOF9kY19xbG9va3VwW2F2X2NsaXBfdWludHAyKGJhc2VfcWkgKyBzLT5xdWFudC55MmRjX2RlbHRhLCA3KV0gKiAyOwogICAgICAgICAvKiAxMDE1ODE+PjE2IGlzIGVxdWl2YWxlbnQgdG8gMTU1LzEwMCAqLwotICAgICAgICBzLT5xbWF0W2ldLmx1bWFfZGNfcW11bFsxXSA9IHZwOF9hY19xbG9va3VwW2F2X2NsaXBfdWludHAyKGJhc2VfcWkgKyB5MmFjX2RlbHRhLCA3KV0gKiAxMDE1ODEgPj4gMTY7Ci0gICAgICAgIHMtPnFtYXRbaV0uY2hyb21hX3FtdWxbMF0gID0gdnA4X2RjX3Fsb29rdXBbYXZfY2xpcF91aW50cDIoYmFzZV9xaSArIHV2ZGNfZGVsdGEsIDcpXTsKLSAgICAgICAgcy0+cW1hdFtpXS5jaHJvbWFfcW11bFsxXSAgPSB2cDhfYWNfcWxvb2t1cFthdl9jbGlwX3VpbnRwMihiYXNlX3FpICsgdXZhY19kZWx0YSwgNyldOworICAgICAgICBzLT5xbWF0W2ldLmx1bWFfZGNfcW11bFsxXSA9IHZwOF9hY19xbG9va3VwW2F2X2NsaXBfdWludHAyKGJhc2VfcWkgKyBzLT5xdWFudC55MmFjX2RlbHRhLCA3KV0gKiAxMDE1ODEgPj4gMTY7CisgICAgICAgIHMtPnFtYXRbaV0uY2hyb21hX3FtdWxbMF0gID0gdnA4X2RjX3Fsb29rdXBbYXZfY2xpcF91aW50cDIoYmFzZV9xaSArIHMtPnF1YW50LnV2ZGNfZGVsdGEsIDcpXTsKKyAgICAgICAgcy0+cW1hdFtpXS5jaHJvbWFfcW11bFsxXSAgPSB2cDhfYWNfcWxvb2t1cFthdl9jbGlwX3VpbnRwMihiYXNlX3FpICsgcy0+cXVhbnQudXZhY19kZWx0YSwgNyldOwogCiAgICAgICAgIHMtPnFtYXRbaV0ubHVtYV9kY19xbXVsWzFdID0gRkZNQVgocy0+cW1hdFtpXS5sdW1hX2RjX3FtdWxbMV0sIDgpOwogICAgICAgICBzLT5xbWF0W2ldLmNocm9tYV9xbXVsWzBdICA9IEZGTUlOKHMtPnFtYXRbaV0uY2hyb21hX3FtdWxbMF0sIDEzMik7CkBAIC00MzMsOCArNDg1LDggQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGZhZGUodWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAotICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsCitzdGF0aWMgdm9pZCBmYWRlKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwgaW50IGJldGEpCiB7CkBAIC01MTcsNyArNTY5LDkgQEAKIAogICAgIG1lbWNweShzLT5wdXRfcGl4ZWxzX3RhYiwgcy0+dnA4ZHNwLnB1dF92cDhfZXBlbF9waXhlbHNfdGFiLCBzaXplb2Yocy0+cHV0X3BpeGVsc190YWIpKTsKIAotICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKGMsIGJ1ZiwgcGFydDFfc2l6ZSk7CisgICAgcmV0ID0gZmZfdnA1Nl9pbml0X3JhbmdlX2RlY29kZXIoYywgYnVmLCBwYXJ0MV9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICBidWYgICAgICArPSBwYXJ0MV9zaXplOwogICAgIGJ1Zl9zaXplIC09IHBhcnQxX3NpemU7CiAKQEAgLTU0MSw3ICs1OTUsNyBAQAogICAgICAgICAgICAgICAgICAgIHNpemVvZih2cDdfbXZfZGVmYXVsdF9wcm9iW2ldKSk7CiAgICAgICAgIG1lbXNldCgmcy0+c2VnbWVudGF0aW9uLCAwLCBzaXplb2Yocy0+c2VnbWVudGF0aW9uKSk7CiAgICAgICAgIG1lbXNldCgmcy0+bGZfZGVsdGEsIDAsIHNpemVvZihzLT5sZl9kZWx0YSkpOwotICAgICAgICBtZW1jcHkocy0+cHJvYlswXS5zY2FuLCB6aWd6YWdfc2Nhbiwgc2l6ZW9mKHMtPnByb2JbMF0uc2NhbikpOworICAgICAgICBtZW1jcHkocy0+cHJvYlswXS5zY2FuLCBmZl96aWd6YWdfc2Nhbiwgc2l6ZW9mKHMtPnByb2JbMF0uc2NhbikpOwogICAgIH0KIAogICAgIGlmIChzLT5rZXlmcmFtZSB8fCBzLT5wcm9maWxlID4gMCkKQEAgLTU2OSw3ICs2MjMsOSBAQAogICAgIHMtPmxmX2RlbHRhLmVuYWJsZWQgICAgICAgID0gMDsKIAogICAgIHMtPm51bV9jb2VmZl9wYXJ0aXRpb25zID0gMTsKLSAgICBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+Y29lZmZfcGFydGl0aW9uWzBdLCBidWYsIGJ1Zl9zaXplKTsKKyAgICByZXQgPSBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+Y29lZmZfcGFydGl0aW9uWzBdLCBidWYsIGJ1Zl9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmICghcy0+bWFjcm9ibG9ja3NfYmFzZSB8fCAvKiBmaXJzdCBmcmFtZSAqLwogICAgICAgICB3aWR0aCAhPSBzLT5hdmN0eC0+d2lkdGggfHwgaGVpZ2h0ICE9IHMtPmF2Y3R4LT5oZWlnaHQgfHwKQEAgLTYwMCw2ICs2NTYsOCBAQAogICAgICAgICAgICAgcy0+ZmFkZV9wcmVzZW50ID0gdnA4X3JhY19nZXQoYyk7CiAgICAgfQogCisgICAgaWYgKGMtPmVuZCA8PSBjLT5idWZmZXIgJiYgYy0+Yml0cyA+PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAvKiBFLiBGYWRpbmcgaW5mb3JtYXRpb24gZm9yIHByZXZpb3VzIGZyYW1lICovCiAgICAgaWYgKHMtPmZhZGVfcHJlc2VudCAmJiB2cDhfcmFjX2dldChjKSkgewogICAgICAgICBpZiAoKHJldCA9IHZwN19mYWRlX2ZyYW1lKHMgLGMpKSA8IDApCkBAIC02MTMsNyArNjcxLDcgQEAKICAgICAvKiBHLiBEQ1QgY29lZmZpY2llbnQgb3JkZXJpbmcgc3BlY2lmaWNhdGlvbiAqLwogICAgIGlmICh2cDhfcmFjX2dldChjKSkKICAgICAgICAgZm9yIChpID0gMTsgaSA8IDE2OyBpKyspCi0gICAgICAgICAgICBzLT5wcm9iWzBdLnNjYW5baV0gPSB6aWd6YWdfc2Nhblt2cDhfcmFjX2dldF91aW50KGMsIDQpXTsKKyAgICAgICAgICAgIHMtPnByb2JbMF0uc2NhbltpXSA9IGZmX3ppZ3phZ19zY2FuW3ZwOF9yYWNfZ2V0X3VpbnQoYywgNCldOwogCiAgICAgLyogSC4gTG9vcCBmaWx0ZXIgbGV2ZWxzICAqLwogICAgIGlmIChzLT5wcm9maWxlID4gMCkKQEAgLTY1NSw2ICs3MTMsOCBAQAogICAgIGJ1ZiAgICAgICs9IDM7CiAgICAgYnVmX3NpemUgLT0gMzsKIAorICAgIHMtPmhlYWRlcl9wYXJ0aXRpb25fc2l6ZSA9IGhlYWRlcl9zaXplOworCiAgICAgaWYgKHMtPnByb2ZpbGUgPiAzKQogICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBwcm9maWxlICVkXG4iLCBzLT5wcm9maWxlKTsKIApAQCAtNjk4LDcgKzc1OCw5IEBACiAgICAgICAgIG1lbXNldCgmcy0+bGZfZGVsdGEsIDAsIHNpemVvZihzLT5sZl9kZWx0YSkpOwogICAgIH0KIAotICAgIGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKGMsIGJ1ZiwgaGVhZGVyX3NpemUpOworICAgIHJldCA9IGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKGMsIGJ1ZiwgaGVhZGVyX3NpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogICAgIGJ1ZiAgICAgICs9IGhlYWRlcl9zaXplOwogICAgIGJ1Zl9zaXplIC09IGhlYWRlcl9zaXplOwogCkBAIC03MTgsOSArNzgwLDExIEBACiAgICAgcy0+ZmlsdGVyLmxldmVsICAgICA9IHZwOF9yYWNfZ2V0X3VpbnQoYywgNik7CiAgICAgcy0+ZmlsdGVyLnNoYXJwbmVzcyA9IHZwOF9yYWNfZ2V0X3VpbnQoYywgMyk7CiAKLSAgICBpZiAoKHMtPmxmX2RlbHRhLmVuYWJsZWQgPSB2cDhfcmFjX2dldChjKSkpCi0gICAgICAgIGlmICh2cDhfcmFjX2dldChjKSkKKyAgICBpZiAoKHMtPmxmX2RlbHRhLmVuYWJsZWQgPSB2cDhfcmFjX2dldChjKSkpIHsKKyAgICAgICAgcy0+bGZfZGVsdGEudXBkYXRlID0gdnA4X3JhY19nZXQoYyk7CisgICAgICAgIGlmIChzLT5sZl9kZWx0YS51cGRhdGUpCiAgICAgICAgICAgICB1cGRhdGVfbGZfZGVsdGFzKHMpOworICAgIH0KIAogICAgIGlmIChzZXR1cF9wYXJ0aXRpb25zKHMsIGJ1ZiwgYnVmX3NpemUpKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYXJ0aXRpb25zXG4iKTsKQEAgLTc2MCwxMSArODI0LDE4IEBACiAgICAgICAgIHZwNzhfdXBkYXRlX3ByZWQxNngxNl9wcmVkOHg4X212Y19wcm9iYWJpbGl0aWVzKHMsIFZQOF9NVkNfU0laRSk7CiAgICAgfQogCisgICAgLy8gUmVjb3JkIHRoZSBlbnRyb3B5IGNvZGVyIHN0YXRlIGhlcmUgc28gdGhhdCBod2FjY2VscyBjYW4gdXNlIGl0LgorICAgIHMtPmMuY29kZV93b3JkID0gdnA1Nl9yYWNfcmVub3JtKCZzLT5jKTsKKyAgICBzLT5jb2Rlcl9zdGF0ZV9hdF9oZWFkZXJfZW5kLmlucHV0ICAgICA9IHMtPmMuYnVmZmVyIC0gKC1zLT5jLmJpdHMgLyA4KTsKKyAgICBzLT5jb2Rlcl9zdGF0ZV9hdF9oZWFkZXJfZW5kLnJhbmdlICAgICA9IHMtPmMuaGlnaDsKKyAgICBzLT5jb2Rlcl9zdGF0ZV9hdF9oZWFkZXJfZW5kLnZhbHVlICAgICA9IHMtPmMuY29kZV93b3JkID4+IDE2OworICAgIHMtPmNvZGVyX3N0YXRlX2F0X2hlYWRlcl9lbmQuYml0X2NvdW50ID0gLXMtPmMuYml0cyAlIDg7CisKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKLXZvaWQgY2xhbXBfbXYoVlA4Q29udGV4dCAqcywgVlA1Nm12ICpkc3QsIGNvbnN0IFZQNTZtdiAqc3JjKQordm9pZCBjbGFtcF9tdihWUDhtdmJvdW5kcyAqcywgVlA1Nm12ICpkc3QsIGNvbnN0IFZQNTZtdiAqc3JjKQogewogICAgIGRzdC0+eCA9IGF2X2NsaXAoc3JjLT54LCBhdl9jbGlwKHMtPm12X21pbi54LCBJTlQxNl9NSU4sIElOVDE2X01BWCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NsaXAocy0+bXZfbWF4LngsIElOVDE2X01JTiwgSU5UMTZfTUFYKSk7CkBAIC0xMDIzLDcgKzEwOTQsNyBAQAogfQogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZQotdm9pZCB2cDhfZGVjb2RlX212cyhWUDhDb250ZXh0ICpzLCBWUDhNYWNyb2Jsb2NrICptYiwKK3ZvaWQgdnA4X2RlY29kZV9tdnMoVlA4Q29udGV4dCAqcywgVlA4bXZib3VuZHMgKm12X2JvdW5kcywgVlA4TWFjcm9ibG9jayAqbWIsCiAgICAgICAgICAgICAgICAgICAgIGludCBtYl94LCBpbnQgbWJfeSwgaW50IGxheW91dCkKIHsKICAgICBWUDhNYWNyb2Jsb2NrICptYl9lZGdlWzNdID0geyAwICAgICAgLyogdG9wICovLApAQCAtMTA5NCw3ICsxMTY1LDcgQEAKICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdnA4X21vZGVfY29udGV4dHNbY250W0NOVF9ORUFSRVNUXV1bMV0pKSB7CiAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB2cDhfbW9kZV9jb250ZXh0c1tjbnRbQ05UX05FQVJdXVsyXSkpIHsKICAgICAgICAgICAgICAgICAvKiBDaG9vc2UgdGhlIGJlc3QgbXYgb3V0IG9mIDAsMCBhbmQgdGhlIG5lYXJlc3QgbXYgKi8KLSAgICAgICAgICAgICAgICBjbGFtcF9tdihzLCAmbWItPm12LCAmbmVhcl9tdltDTlRfWkVSTyArIChjbnRbQ05UX05FQVJFU1RdID49IGNudFtDTlRfWkVST10pXSk7CisgICAgICAgICAgICAgICAgY2xhbXBfbXYobXZfYm91bmRzLCAmbWItPm12LCAmbmVhcl9tdltDTlRfWkVSTyArIChjbnRbQ05UX05FQVJFU1RdID49IGNudFtDTlRfWkVST10pXSk7CiAgICAgICAgICAgICAgICAgY250W0NOVF9TUExJVE1WXSA9ICgobWJfZWRnZVtWUDhfRURHRV9MRUZUXS0+bW9kZSAgICA9PSBWUDhfTVZNT0RFX1NQTElUKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWJfZWRnZVtWUDhfRURHRV9UT1BdLT5tb2RlICAgICA9PSBWUDhfTVZNT0RFX1NQTElUKSkgKiAyICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYl9lZGdlW1ZQOF9FREdFX1RPUExFRlRdLT5tb2RlID09IFZQOF9NVk1PREVfU1BMSVQpOwpAQCAtMTEwOCwxMSArMTE3OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICBtYi0+Ym12WzBdID0gbWItPm12OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xhbXBfbXYocywgJm1iLT5tdiwgJm5lYXJfbXZbQ05UX05FQVJdKTsKKyAgICAgICAgICAgICAgICBjbGFtcF9tdihtdl9ib3VuZHMsICZtYi0+bXYsICZuZWFyX212W0NOVF9ORUFSXSk7CiAgICAgICAgICAgICAgICAgbWItPmJtdlswXSA9IG1iLT5tdjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNsYW1wX212KHMsICZtYi0+bXYsICZuZWFyX212W0NOVF9ORUFSRVNUXSk7CisgICAgICAgICAgICBjbGFtcF9tdihtdl9ib3VuZHMsICZtYi0+bXYsICZuZWFyX212W0NOVF9ORUFSRVNUXSk7CiAgICAgICAgICAgICBtYi0+Ym12WzBdID0gbWItPm12OwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTExNTgsMTQgKzEyMjksMTUgQEAKIH0KIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKLXZvaWQgZGVjb2RlX21iX21vZGUoVlA4Q29udGV4dCAqcywgVlA4TWFjcm9ibG9jayAqbWIsIGludCBtYl94LCBpbnQgbWJfeSwKK3ZvaWQgZGVjb2RlX21iX21vZGUoVlA4Q29udGV4dCAqcywgVlA4bXZib3VuZHMgKm12X2JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgVlA4TWFjcm9ibG9jayAqbWIsIGludCBtYl94LCBpbnQgbWJfeSwKICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2VnbWVudCwgdWludDhfdCAqcmVmLCBpbnQgbGF5b3V0LCBpbnQgaXNfdnA3KQogewogICAgIFZQNTZSYW5nZUNvZGVyICpjID0gJnMtPmM7Ci0gICAgY29uc3QgY2hhciAqdnA3X2ZlYXR1cmVfbmFtZVtdID0geyAicS1pbmRleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGYtZGVsdGEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRpYWwtZ29sZGVuLXVwZGF0ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmxpdC1waXRjaCIgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZwN19mZWF0dXJlX25hbWVbXSA9IHsgInEtaW5kZXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGYtZGVsdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydGlhbC1nb2xkZW4tdXBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsaXQtcGl0Y2giIH07CiAgICAgaWYgKGlzX3ZwNykgewogICAgICAgICBpbnQgaTsKICAgICAgICAgKnNlZ21lbnQgPSAwOwpAQCAtMTIyMiw3ICsxMjk0LDcgQEAKICAgICAgICAgaWYgKGlzX3ZwNykKICAgICAgICAgICAgIHZwN19kZWNvZGVfbXZzKHMsIG1iLCBtYl94LCBtYl95LCBsYXlvdXQpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cDhfZGVjb2RlX212cyhzLCBtYiwgbWJfeCwgbWJfeSwgbGF5b3V0KTsKKyAgICAgICAgICAgIHZwOF9kZWNvZGVfbXZzKHMsIG12X2JvdW5kcywgbWIsIG1iX3gsIG1iX3ksIGxheW91dCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gaW50cmEgTUIsIDE2LjEKICAgICAgICAgbWItPm1vZGUgPSB2cDhfcmFjX2dldF90cmVlKGMsIHZwOF9wcmVkMTZ4MTZfdHJlZV9pbnRlciwgcy0+cHJvYi0+cHJlZDE2eDE2KTsKQEAgLTEzNTAsNyArMTQyMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgcW11bFsyXSkKIHsKICAgICByZXR1cm4gZGVjb2RlX2Jsb2NrX2NvZWZmc19pbnRlcm5hbChyLCBibG9jaywgcHJvYnMsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5fcHJvYiwgcW11bCwgemlnemFnX3NjYW4sIElTX1ZQOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5fcHJvYiwgcW11bCwgZmZfemlnemFnX3NjYW4sIElTX1ZQOCk7CiB9CiAjZW5kaWYKIApAQCAtMTM5OCw3ICsxNDcwLDcgQEAKICAgICAgICAgLy8gZGVjb2RlIERDIHZhbHVlcyBhbmQgZG8gaGFkYW1hcmQKICAgICAgICAgbm56ID0gZGVjb2RlX2Jsb2NrX2NvZWZmcyhjLCB0ZC0+YmxvY2tfZGMsIHMtPnByb2ItPnRva2VuWzFdLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5uel9wcmVkLCBzLT5xbWF0W3NlZ21lbnRdLmx1bWFfZGNfcW11bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aWd6YWdfc2NhbiwgaXNfdnA3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl96aWd6YWdfc2NhbiwgaXNfdnA3KTsKICAgICAgICAgbF9ubnpbOF0gPSB0X25uels4XSA9ICEhbm56OwogCiAgICAgICAgIGlmIChpc192cDcgJiYgbWItPm1vZGUgPiBNT0RFX0k0eDQpIHsKQEAgLTE0NjAsNyArMTUzMiw3IEBACiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZQogdm9pZCBiYWNrdXBfbWJfYm9yZGVyKHVpbnQ4X3QgKnRvcF9ib3JkZXIsIHVpbnQ4X3QgKnNyY195LAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY19jYiwgdWludDhfdCAqc3JjX2NyLAotICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IHV2bGluZXNpemUsIGludCBzaW1wbGUpCisgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplLCBwdHJkaWZmX3QgdXZsaW5lc2l6ZSwgaW50IHNpbXBsZSkKIHsKICAgICBBVl9DT1BZMTI4KHRvcF9ib3JkZXIsIHNyY195ICsgMTUgKiBsaW5lc2l6ZSk7CiAgICAgaWYgKCFzaW1wbGUpIHsKQEAgLTE0NzEsNyArMTU0Myw3IEBACiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lCiB2b2lkIHhjaGdfbWJfYm9yZGVyKHVpbnQ4X3QgKnRvcF9ib3JkZXIsIHVpbnQ4X3QgKnNyY195LCB1aW50OF90ICpzcmNfY2IsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY19jciwgaW50IGxpbmVzaXplLCBpbnQgdXZsaW5lc2l6ZSwgaW50IG1iX3gsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY19jciwgcHRyZGlmZl90IGxpbmVzaXplLCBwdHJkaWZmX3QgdXZsaW5lc2l6ZSwgaW50IG1iX3gsCiAgICAgICAgICAgICAgICAgICAgIGludCBtYl95LCBpbnQgbWJfd2lkdGgsIGludCBzaW1wbGUsIGludCB4Y2hnKQogewogICAgIHVpbnQ4X3QgKnRvcF9ib3JkZXJfbTEgPSB0b3BfYm9yZGVyIC0gMzI7ICAgICAvLyBmb3IgVEwgcHJlZGljdGlvbgpAQCAtMTYyNCw3ICsxNjk2LDggQEAKICAgICAgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykgewogICAgICAgICAgICAgdWludDhfdCAqdG9wcmlnaHQgPSBwdHIgKyA0IC0gcy0+bGluZXNpemU7CiAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvcHkgPSAwLCBsaW5lc2l6ZSA9IHMtPmxpbmVzaXplOworICAgICAgICAgICAgICAgIGludCBjb3B5ID0gMDsKKyAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemUgPSBzLT5saW5lc2l6ZTsKICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBwdHIgKyA0ICogeDsKICAgICAgICAgICAgICAgICBMT0NBTF9BTElHTkVEKDQsIHVpbnQ4X3QsIGNvcHlfZHN0LCBbNSAqIDhdKTsKIApAQCAtMTczMCw3ICsxODAzLDcgQEAKICAgICB1aW50OF90ICpzcmMgPSByZWYtPmYtPmRhdGFbMF07CiAKICAgICBpZiAoQVZfUk4zMkEobXYpKSB7Ci0gICAgICAgIGludCBzcmNfbGluZXNpemUgPSBsaW5lc2l6ZTsKKyAgICAgICAgcHRyZGlmZl90IHNyY19saW5lc2l6ZSA9IGxpbmVzaXplOwogCiAgICAgICAgIGludCBteCA9IChtdi0+eCAqIDIpICYgNywgbXhfaWR4ID0gc3VicGVsX2lkeFswXVtteF07CiAgICAgICAgIGludCBteSA9IChtdi0+eSAqIDIpICYgNywgbXlfaWR4ID0gc3VicGVsX2lkeFswXVtteV07CkBAIC0yMDc2LDggKzIxNDksOCBAQAogICAgIGludCBmaWx0ZXJfbGV2ZWwgPSBmLT5maWx0ZXJfbGV2ZWw7CiAgICAgaW50IGlubmVyX2xpbWl0ID0gZi0+aW5uZXJfbGltaXQ7CiAgICAgaW50IGlubmVyX2ZpbHRlciA9IGYtPmlubmVyX2ZpbHRlcjsKLSAgICBpbnQgbGluZXNpemUgPSBzLT5saW5lc2l6ZTsKLSAgICBpbnQgdXZsaW5lc2l6ZSA9IHMtPnV2bGluZXNpemU7CisgICAgcHRyZGlmZl90IGxpbmVzaXplICAgPSBzLT5saW5lc2l6ZTsKKyAgICBwdHJkaWZmX3QgdXZsaW5lc2l6ZSA9IHMtPnV2bGluZXNpemU7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaGV2X3RocmVzaF9sdXRbMl1bNjRdID0gewogICAgICAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsCiAgICAgICAgICAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKQEAgLTIxNjMsNyArMjIzNiw3IEBACiAgICAgaW50IGZpbHRlcl9sZXZlbCA9IGYtPmZpbHRlcl9sZXZlbDsKICAgICBpbnQgaW5uZXJfbGltaXQgID0gZi0+aW5uZXJfbGltaXQ7CiAgICAgaW50IGlubmVyX2ZpbHRlciA9IGYtPmlubmVyX2ZpbHRlcjsKLSAgICBpbnQgbGluZXNpemUgICAgID0gcy0+bGluZXNpemU7CisgICAgcHRyZGlmZl90IGxpbmVzaXplID0gcy0+bGluZXNpemU7CiAKICAgICBpZiAoIWZpbHRlcl9sZXZlbCkKICAgICAgICAgcmV0dXJuOwpAQCAtMjE5Niw4ICsyMjY5LDggQEAKICAgICBWUDhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBpbnQgbWJfeCwgbWJfeTsKIAotICAgIHMtPm12X21pbi55ID0gLU1BUkdJTjsKLSAgICBzLT5tdl9tYXgueSA9ICgocy0+bWJfaGVpZ2h0IC0gMSkgPDwgNikgKyBNQVJHSU47CisgICAgcy0+bXZfYm91bmRzLm12X21pbi55ID0gLU1BUkdJTjsKKyAgICBzLT5tdl9ib3VuZHMubXZfbWF4LnkgPSAoKHMtPm1iX2hlaWdodCAtIDEpIDw8IDYpICsgTUFSR0lOOwogICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBzLT5tYl9oZWlnaHQ7IG1iX3krKykgewogICAgICAgICBWUDhNYWNyb2Jsb2NrICptYiA9IHMtPm1hY3JvYmxvY2tzX2Jhc2UgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocy0+bWJfd2lkdGggKyAxKSAqIChtYl95ICsgMSkgKyAxKTsKQEAgLTIyMDUsMjAgKzIyNzgsMjAgQEAKIAogICAgICAgICBBVl9XTjMyQShzLT5pbnRyYTR4NF9wcmVkX21vZGVfbGVmdCwgRENfUFJFRCAqIDB4MDEwMTAxMDEpOwogCi0gICAgICAgIHMtPm12X21pbi54ID0gLU1BUkdJTjsKLSAgICAgICAgcy0+bXZfbWF4LnggPSAoKHMtPm1iX3dpZHRoIC0gMSkgPDwgNikgKyBNQVJHSU47CisgICAgICAgIHMtPm12X2JvdW5kcy5tdl9taW4ueCA9IC1NQVJHSU47CisgICAgICAgIHMtPm12X2JvdW5kcy5tdl9tYXgueCA9ICgocy0+bWJfd2lkdGggLSAxKSA8PCA2KSArIE1BUkdJTjsKICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IHMtPm1iX3dpZHRoOyBtYl94KyssIG1iX3h5KyssIG1iKyspIHsKICAgICAgICAgICAgIGlmIChtYl95ID09IDApCiAgICAgICAgICAgICAgICAgQVZfV04zMkEoKG1iIC0gcy0+bWJfd2lkdGggLSAxKS0+aW50cmE0eDRfcHJlZF9tb2RlX3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICBEQ19QUkVEICogMHgwMTAxMDEwMSk7Ci0gICAgICAgICAgICBkZWNvZGVfbWJfbW9kZShzLCBtYiwgbWJfeCwgbWJfeSwgY3VyZnJhbWUtPnNlZ19tYXAtPmRhdGEgKyBtYl94eSwKKyAgICAgICAgICAgIGRlY29kZV9tYl9tb2RlKHMsICZzLT5tdl9ib3VuZHMsIG1iLCBtYl94LCBtYl95LCBjdXJmcmFtZS0+c2VnX21hcC0+ZGF0YSArIG1iX3h5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9mcmFtZSAmJiBwcmV2X2ZyYW1lLT5zZWdfbWFwID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZnJhbWUtPnNlZ19tYXAtPmRhdGEgKyBtYl94eSA6IE5VTEwsIDEsIGlzX3ZwNyk7Ci0gICAgICAgICAgICBzLT5tdl9taW4ueCAtPSA2NDsKLSAgICAgICAgICAgIHMtPm12X21heC54IC09IDY0OworICAgICAgICAgICAgcy0+bXZfYm91bmRzLm12X21pbi54IC09IDY0OworICAgICAgICAgICAgcy0+bXZfYm91bmRzLm12X21heC54IC09IDY0OwogICAgICAgICB9Ci0gICAgICAgIHMtPm12X21pbi55IC09IDY0OwotICAgICAgICBzLT5tdl9tYXgueSAtPSA2NDsKKyAgICAgICAgcy0+bXZfYm91bmRzLm12X21pbi55IC09IDY0OworICAgICAgICBzLT5tdl9ib3VuZHMubXZfbWF4LnkgLT0gNjQ7CiAgICAgfQogfQogCkBAIC0yMjM4LDE1ICsyMzExLDE1IEBACiAjZGVmaW5lIGNoZWNrX3RocmVhZF9wb3ModGQsIG90ZCwgbWJfeF9jaGVjaywgbWJfeV9jaGVjaykgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGludCB0bXAgPSAobWJfeV9jaGVjayA8PCAxNikgfCAobWJfeF9jaGVjayAmIDB4RkZGRik7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChvdGQtPnRocmVhZF9tYl9wb3MgPCB0bXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChhdG9taWNfbG9hZCgmb3RkLT50aHJlYWRfbWJfcG9zKSA8IHRtcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm90ZC0+bG9jayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB0ZC0+d2FpdF9tYl9wb3MgPSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdG9taWNfc3RvcmUoJnRkLT53YWl0X21iX3BvcywgdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgaWYgKG90ZC0+dGhyZWFkX21iX3BvcyA+PSB0bXApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGF0b21pY19sb2FkKCZvdGQtPnRocmVhZF9tYl9wb3MpID49IHRtcCkgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJm90ZC0+Y29uZCwgJm90ZC0+bG9jayk7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICB9IHdoaWxlICgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB0ZC0+d2FpdF9tYl9wb3MgPSBJTlRfTUFYOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdG9taWNfc3RvcmUoJnRkLT53YWl0X21iX3BvcywgSU5UX01BWCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmb3RkLT5sb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoMCkKQEAgLTIyNTcsMTIgKzIzMzAsMTAgQEAKICAgICAgICAgaW50IHNsaWNlZF90aHJlYWRpbmcgPSAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfU0xJQ0UpICYmIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtX2pvYnMgPiAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaW50IGlzX251bGwgICAgICAgICAgPSAhbmV4dF90ZCB8fCAhcHJldl90ZDsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaW50IHBvc19jaGVjayAgICAgICAgPSAoaXNfbnVsbCkgPyAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobmV4dF90ZCAhPSB0ZCAmJiAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID49IG5leHRfdGQtPndhaXRfbWJfcG9zKSB8fCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldl90ZCAhPSB0ZCAmJiAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zID49IHByZXZfdGQtPndhaXRfbWJfcG9zKTsgICAgIFwKLSAgICAgICAgdGQtPnRocmVhZF9tYl9wb3MgPSBwb3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHBvc19jaGVjayAgICAgICAgPSAoaXNfbnVsbCkgPyAxIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChuZXh0X3RkICE9IHRkICYmIHBvcyA+PSBhdG9taWNfbG9hZCgmbmV4dF90ZC0+d2FpdF9tYl9wb3MpKSB8fCAgIFwKKyAgICAgICAgICAgIChwcmV2X3RkICE9IHRkICYmIHBvcyA+PSBhdG9taWNfbG9hZCgmcHJldl90ZC0+d2FpdF9tYl9wb3MpKTsgICAgIFwKKyAgICAgICAgYXRvbWljX3N0b3JlKCZ0ZC0+dGhyZWFkX21iX3BvcywgcG9zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaWYgKHNsaWNlZF90aHJlYWRpbmcgJiYgcG9zX2NoZWNrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmdGQtPmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJnRkLT5jb25kKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIyNzQsMTIgKzIzNDUsMTIgQEAKICNkZWZpbmUgdXBkYXRlX3Bvcyh0ZCwgbWJfeSwgbWJfeCkgd2hpbGUoMCkKICNlbmRpZgogCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGRlY29kZV9tYl9yb3dfbm9fZmlsdGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGVjb2RlX21iX3Jvd19ub19maWx0ZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICp0ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgam9ibnIsIGludCB0aHJlYWRuciwgaW50IGlzX3ZwNykKIHsKICAgICBWUDhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBWUDhUaHJlYWREYXRhICpwcmV2X3RkLCAqbmV4dF90ZCwgKnRkID0gJnMtPnRocmVhZF9kYXRhW3RocmVhZG5yXTsKLSAgICBpbnQgbWJfeSA9IHRkLT50aHJlYWRfbWJfcG9zID4+IDE2OworICAgIGludCBtYl95ID0gYXRvbWljX2xvYWQoJnRkLT50aHJlYWRfbWJfcG9zKSA+PiAxNjsKICAgICBpbnQgbWJfeCwgbWJfeHkgPSBtYl95ICogcy0+bWJfd2lkdGg7CiAgICAgaW50IG51bV9qb2JzID0gcy0+bnVtX2pvYnM7CiAgICAgVlA4RnJhbWUgKmN1cmZyYW1lID0gcy0+Y3VyZnJhbWUsICpwcmV2X2ZyYW1lID0gcy0+cHJldl9mcmFtZTsKQEAgLTIyOTAsNiArMjM2MSwxMCBAQAogICAgICAgICBjdXJmcmFtZS0+dGYuZi0+ZGF0YVsxXSArICA4ICogbWJfeSAqIHMtPnV2bGluZXNpemUsCiAgICAgICAgIGN1cmZyYW1lLT50Zi5mLT5kYXRhWzJdICsgIDggKiBtYl95ICogcy0+dXZsaW5lc2l6ZQogICAgIH07CisKKyAgICBpZiAoYy0+ZW5kIDw9IGMtPmJ1ZmZlciAmJiBjLT5iaXRzID49IDApCisgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIGlmIChtYl95ID09IDApCiAgICAgICAgIHByZXZfdGQgPSB0ZDsKICAgICBlbHNlCkBAIC0yMzE0LDEwICsyMzg5LDEyIEBACiAgICAgaWYgKCFpc192cDcgfHwgbWJfeSA9PSAwKQogICAgICAgICBtZW1zZXQodGQtPmxlZnRfbm56LCAwLCBzaXplb2YodGQtPmxlZnRfbm56KSk7CiAKLSAgICBzLT5tdl9taW4ueCA9IC1NQVJHSU47Ci0gICAgcy0+bXZfbWF4LnggPSAoKHMtPm1iX3dpZHRoIC0gMSkgPDwgNikgKyBNQVJHSU47CisgICAgdGQtPm12X2JvdW5kcy5tdl9taW4ueCA9IC1NQVJHSU47CisgICAgdGQtPm12X2JvdW5kcy5tdl9tYXgueCA9ICgocy0+bWJfd2lkdGggLSAxKSA8PCA2KSArIE1BUkdJTjsKIAogICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrLCBtYl94eSsrLCBtYisrKSB7CisgICAgICAgIGlmIChjLT5lbmQgPD0gYy0+YnVmZmVyICYmIGMtPmJpdHMgPj0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAvLyBXYWl0IGZvciBwcmV2aW91cyB0aHJlYWQgdG8gcmVhZCBtYl94KzIsIGFuZCByZWFjaCBtYl95LTEuCiAgICAgICAgIGlmIChwcmV2X3RkICE9IHRkKSB7CiAgICAgICAgICAgICBpZiAodGhyZWFkbnIgIT0gMCkgewpAQCAtMjMzNyw3ICsyNDE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMl0gLSBkc3RbMV0sIDIpOwogCiAgICAgICAgIGlmICghcy0+bWJfbGF5b3V0KQotICAgICAgICAgICAgZGVjb2RlX21iX21vZGUocywgbWIsIG1iX3gsIG1iX3ksIGN1cmZyYW1lLT5zZWdfbWFwLT5kYXRhICsgbWJfeHksCisgICAgICAgICAgICBkZWNvZGVfbWJfbW9kZShzLCAmdGQtPm12X2JvdW5kcywgbWIsIG1iX3gsIG1iX3ksIGN1cmZyYW1lLT5zZWdfbWFwLT5kYXRhICsgbWJfeHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2ZyYW1lICYmIHByZXZfZnJhbWUtPnNlZ19tYXAgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9mcmFtZS0+c2VnX21hcC0+ZGF0YSArIG1iX3h5IDogTlVMTCwgMCwgaXNfdnA3KTsKIApAQCAtMjM4NCw4ICsyNDYxLDggQEAKICAgICAgICAgZHN0WzBdICAgICAgKz0gMTY7CiAgICAgICAgIGRzdFsxXSAgICAgICs9IDg7CiAgICAgICAgIGRzdFsyXSAgICAgICs9IDg7Ci0gICAgICAgIHMtPm12X21pbi54IC09IDY0OwotICAgICAgICBzLT5tdl9tYXgueCAtPSA2NDsKKyAgICAgICAgdGQtPm12X2JvdW5kcy5tdl9taW4ueCAtPSA2NDsKKyAgICAgICAgdGQtPm12X2JvdW5kcy5tdl9tYXgueCAtPSA2NDsKIAogICAgICAgICBpZiAobWJfeCA9PSBzLT5tYl93aWR0aCArIDEpIHsKICAgICAgICAgICAgIHVwZGF0ZV9wb3ModGQsIG1iX3ksIHMtPm1iX3dpZHRoICsgMyk7CkBAIC0yMzkzLDE4ICsyNDcwLDE5IEBACiAgICAgICAgICAgICB1cGRhdGVfcG9zKHRkLCBtYl95LCBtYl94KTsKICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdnA3X2RlY29kZV9tYl9yb3dfbm9fZmlsdGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsCitzdGF0aWMgaW50IHZwN19kZWNvZGVfbWJfcm93X25vX2ZpbHRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2JuciwgaW50IHRocmVhZG5yKQogewotICAgIGRlY29kZV9tYl9yb3dfbm9fZmlsdGVyKGF2Y3R4LCB0ZGF0YSwgam9ibnIsIHRocmVhZG5yLCAxKTsKKyAgICByZXR1cm4gZGVjb2RlX21iX3Jvd19ub19maWx0ZXIoYXZjdHgsIHRkYXRhLCBqb2JuciwgdGhyZWFkbnIsIDEpOwogfQogCi1zdGF0aWMgdm9pZCB2cDhfZGVjb2RlX21iX3Jvd19ub19maWx0ZXIoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICp0ZGF0YSwKK3N0YXRpYyBpbnQgdnA4X2RlY29kZV9tYl9yb3dfbm9fZmlsdGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpCiB7Ci0gICAgZGVjb2RlX21iX3Jvd19ub19maWx0ZXIoYXZjdHgsIHRkYXRhLCBqb2JuciwgdGhyZWFkbnIsIDApOworICAgIHJldHVybiBkZWNvZGVfbWJfcm93X25vX2ZpbHRlcihhdmN0eCwgdGRhdGEsIGpvYm5yLCB0aHJlYWRuciwgMCk7CiB9CiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsdGVyX21iX3JvdyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLApAQCAtMjQxMiw3ICsyNDkwLDcgQEAKIHsKICAgICBWUDhDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBWUDhUaHJlYWREYXRhICp0ZCA9ICZzLT50aHJlYWRfZGF0YVt0aHJlYWRucl07Ci0gICAgaW50IG1iX3gsIG1iX3kgPSB0ZC0+dGhyZWFkX21iX3BvcyA+PiAxNiwgbnVtX2pvYnMgPSBzLT5udW1fam9iczsKKyAgICBpbnQgbWJfeCwgbWJfeSA9IGF0b21pY19sb2FkKCZ0ZC0+dGhyZWFkX21iX3BvcykgPj4gMTYsIG51bV9qb2JzID0gcy0+bnVtX2pvYnM7CiAgICAgQVZGcmFtZSAqY3VyZnJhbWUgPSBzLT5jdXJmcmFtZS0+dGYuZjsKICAgICBWUDhNYWNyb2Jsb2NrICptYjsKICAgICBWUDhUaHJlYWREYXRhICpwcmV2X3RkLCAqbmV4dF90ZDsKQEAgLTI0ODcsMTkgKzI1NjUsMjQgQEAKICAgICBWUDhUaHJlYWREYXRhICpuZXh0X3RkID0gTlVMTCwgKnByZXZfdGQgPSBOVUxMOwogICAgIFZQOEZyYW1lICpjdXJmcmFtZSA9IHMtPmN1cmZyYW1lOwogICAgIGludCBtYl95LCBudW1fam9icyA9IHMtPm51bV9qb2JzOworICAgIGludCByZXQ7CiAKICAgICB0ZC0+dGhyZWFkX25yID0gdGhyZWFkbnI7CisgICAgdGQtPm12X2JvdW5kcy5tdl9taW4ueSAgID0gLU1BUkdJTiAtIDY0ICogdGhyZWFkbnI7CisgICAgdGQtPm12X2JvdW5kcy5tdl9tYXgueSAgID0gKChzLT5tYl9oZWlnaHQgLSAxKSA8PCA2KSArIE1BUkdJTiAtIDY0ICogdGhyZWFkbnI7CiAgICAgZm9yIChtYl95ID0gam9ibnI7IG1iX3kgPCBzLT5tYl9oZWlnaHQ7IG1iX3kgKz0gbnVtX2pvYnMpIHsKLSAgICAgICAgaWYgKG1iX3kgPj0gcy0+bWJfaGVpZ2h0KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHRkLT50aHJlYWRfbWJfcG9zID0gbWJfeSA8PCAxNjsKLSAgICAgICAgcy0+ZGVjb2RlX21iX3Jvd19ub19maWx0ZXIoYXZjdHgsIHRkYXRhLCBqb2JuciwgdGhyZWFkbnIpOworICAgICAgICBhdG9taWNfc3RvcmUoJnRkLT50aHJlYWRfbWJfcG9zLCBtYl95IDw8IDE2KTsKKyAgICAgICAgcmV0ID0gcy0+ZGVjb2RlX21iX3Jvd19ub19maWx0ZXIoYXZjdHgsIHRkYXRhLCBqb2JuciwgdGhyZWFkbnIpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgdXBkYXRlX3Bvcyh0ZCwgcy0+bWJfaGVpZ2h0LCBJTlRfTUFYICYgMHhGRkZGKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICAgICAgaWYgKHMtPmRlYmxvY2tfZmlsdGVyKQogICAgICAgICAgICAgcy0+ZmlsdGVyX21iX3JvdyhhdmN0eCwgdGRhdGEsIGpvYm5yLCB0aHJlYWRucik7CiAgICAgICAgIHVwZGF0ZV9wb3ModGQsIG1iX3ksIElOVF9NQVggJiAweEZGRkYpOwogCi0gICAgICAgIHMtPm12X21pbi55IC09IDY0OwotICAgICAgICBzLT5tdl9tYXgueSAtPSA2NDsKKyAgICAgICAgdGQtPm12X2JvdW5kcy5tdl9taW4ueSAtPSA2NCAqIG51bV9qb2JzOworICAgICAgICB0ZC0+bXZfYm91bmRzLm12X21heC55IC09IDY0ICogbnVtX2pvYnM7CiAKICAgICAgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPT0gRkZfVEhSRUFEX0ZSQU1FKQogICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmY3VyZnJhbWUtPnRmLCBtYl95LCAwKTsKQEAgLTI1MjAsNyArMjYwMyw2IEBACiAgICAgcmV0dXJuIHZwNzhfZGVjb2RlX21iX3Jvd19zbGljZWQoYXZjdHgsIHRkYXRhLCBqb2JuciwgdGhyZWFkbnIsIElTX1ZQOCk7CiB9CiAKLQogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKIGludCB2cDc4X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCwgaW50IGlzX3ZwNykKQEAgLTI1MzgsNiArMjYyMCwxNyBAQAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGVycjsKIAorICAgIGlmIChzLT5hY3R1YWxseV93ZWJwKSB7CisgICAgICAgIC8vIGF2Y3R4LT5waXhfZm10IGFscmVhZHkgc2V0IGluIGNhbGxlci4KKyAgICB9IGVsc2UgaWYgKCFpc192cDcgJiYgcy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgcy0+cGl4X2ZtdCA9IGdldF9waXhlbF9mb3JtYXQocyk7CisgICAgICAgIGlmIChzLT5waXhfZm10IDwgMCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKyAgICAgICAgYXZjdHgtPnBpeF9mbXQgPSBzLT5waXhfZm10OworICAgIH0KKwogICAgIHByZXZfZnJhbWUgPSBzLT5mcmFtZXBbVlA1Nl9GUkFNRV9DVVJSRU5UXTsKIAogICAgIHJlZmVyZW5jZWQgPSBzLT51cGRhdGVfbGFzdCB8fCBzLT51cGRhdGVfZ29sZGVuID09IFZQNTZfRlJBTUVfQ1VSUkVOVCB8fApAQCAtMjU1Niw3ICsyNjQ5LDcgQEAKIAogICAgIC8vIHJlbGVhc2Ugbm8gbG9uZ2VyIHJlZmVyZW5jZWQgZnJhbWVzCiAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLSAgICAgICAgaWYgKHMtPmZyYW1lc1tpXS50Zi5mLT5kYXRhWzBdICYmCisgICAgICAgIGlmIChzLT5mcmFtZXNbaV0udGYuZi0+YnVmWzBdICYmCiAgICAgICAgICAgICAmcy0+ZnJhbWVzW2ldICE9IHByZXZfZnJhbWUgJiYKICAgICAgICAgICAgICZzLT5mcmFtZXNbaV0gIT0gcy0+ZnJhbWVwW1ZQNTZfRlJBTUVfUFJFVklPVVNdICYmCiAgICAgICAgICAgICAmcy0+ZnJhbWVzW2ldICE9IHMtPmZyYW1lcFtWUDU2X0ZSQU1FX0dPTERFTl0gICAmJgpAQCAtMjYwOSw1NSArMjcwMiw3MCBAQAogCiAgICAgcy0+bmV4dF9mcmFtZXBbVlA1Nl9GUkFNRV9DVVJSRU5UXSA9IGN1cmZyYW1lOwogCi0gICAgaWYgKGF2Y3R4LT5jb2RlYy0+dXBkYXRlX3RocmVhZF9jb250ZXh0KQotICAgICAgICBmZl90aHJlYWRfZmluaXNoX3NldHVwKGF2Y3R4KTsKKyAgICBmZl90aHJlYWRfZmluaXNoX3NldHVwKGF2Y3R4KTsKIAotICAgIHMtPmxpbmVzaXplICAgPSBjdXJmcmFtZS0+dGYuZi0+bGluZXNpemVbMF07Ci0gICAgcy0+dXZsaW5lc2l6ZSA9IGN1cmZyYW1lLT50Zi5mLT5saW5lc2l6ZVsxXTsKKyAgICBpZiAoYXZjdHgtPmh3YWNjZWwpIHsKKyAgICAgICAgcmV0ID0gYXZjdHgtPmh3YWNjZWwtPnN0YXJ0X2ZyYW1lKGF2Y3R4LCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0gICAgbWVtc2V0KHMtPnRvcF9ubnosIDAsIHMtPm1iX3dpZHRoICogc2l6ZW9mKCpzLT50b3Bfbm56KSk7Ci0gICAgLyogWmVybyBtYWNyb2Jsb2NrIHN0cnVjdHVyZXMgZm9yIHRvcC90b3AtbGVmdCBwcmVkaWN0aW9uCi0gICAgICogZnJvbSBvdXRzaWRlIHRoZSBmcmFtZS4gKi8KLSAgICBpZiAoIXMtPm1iX2xheW91dCkKLSAgICAgICAgbWVtc2V0KHMtPm1hY3JvYmxvY2tzICsgcy0+bWJfaGVpZ2h0ICogMiAtIDEsIDAsCi0gICAgICAgICAgICAgICAocy0+bWJfd2lkdGggKyAxKSAqIHNpemVvZigqcy0+bWFjcm9ibG9ja3MpKTsKLSAgICBpZiAoIXMtPm1iX2xheW91dCAmJiBzLT5rZXlmcmFtZSkKLSAgICAgICAgbWVtc2V0KHMtPmludHJhNHg0X3ByZWRfbW9kZV90b3AsIERDX1BSRUQsIHMtPm1iX3dpZHRoICogNCk7CisgICAgICAgIHJldCA9IGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoYXZjdHgsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBlcnI7CiAKLSAgICBtZW1zZXQocy0+cmVmX2NvdW50LCAwLCBzaXplb2Yocy0+cmVmX2NvdW50KSk7CisgICAgICAgIHJldCA9IGF2Y3R4LT5od2FjY2VsLT5lbmRfZnJhbWUoYXZjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZXJyOwogCi0gICAgaWYgKHMtPm1iX2xheW91dCA9PSAxKSB7Ci0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgcHJldmlvdXMgZnJhbWUgaGFzIHJlYWQgaXRzIHNlZ21lbnRhdGlvbiBtYXAsCi0gICAgICAgIC8vIGlmIHdlIHJlLXVzZSB0aGUgc2FtZSBtYXAuCi0gICAgICAgIGlmIChwcmV2X2ZyYW1lICYmIHMtPnNlZ21lbnRhdGlvbi5lbmFibGVkICYmCi0gICAgICAgICAgICAhcy0+c2VnbWVudGF0aW9uLnVwZGF0ZV9tYXApCi0gICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnByZXZfZnJhbWUtPnRmLCAxLCAwKTsKLSAgICAgICAgaWYgKGlzX3ZwNykKLSAgICAgICAgICAgIHZwN19kZWNvZGVfbXZfbWJfbW9kZXMoYXZjdHgsIGN1cmZyYW1lLCBwcmV2X2ZyYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5saW5lc2l6ZSAgID0gY3VyZnJhbWUtPnRmLmYtPmxpbmVzaXplWzBdOworICAgICAgICBzLT51dmxpbmVzaXplID0gY3VyZnJhbWUtPnRmLmYtPmxpbmVzaXplWzFdOworCisgICAgICAgIG1lbXNldChzLT50b3Bfbm56LCAwLCBzLT5tYl93aWR0aCAqIHNpemVvZigqcy0+dG9wX25ueikpOworICAgICAgICAvKiBaZXJvIG1hY3JvYmxvY2sgc3RydWN0dXJlcyBmb3IgdG9wL3RvcC1sZWZ0IHByZWRpY3Rpb24KKyAgICAgICAgICogZnJvbSBvdXRzaWRlIHRoZSBmcmFtZS4gKi8KKyAgICAgICAgaWYgKCFzLT5tYl9sYXlvdXQpCisgICAgICAgICAgICBtZW1zZXQocy0+bWFjcm9ibG9ja3MgKyBzLT5tYl9oZWlnaHQgKiAyIC0gMSwgMCwKKyAgICAgICAgICAgICAgICAgICAocy0+bWJfd2lkdGggKyAxKSAqIHNpemVvZigqcy0+bWFjcm9ibG9ja3MpKTsKKyAgICAgICAgaWYgKCFzLT5tYl9sYXlvdXQgJiYgcy0+a2V5ZnJhbWUpCisgICAgICAgICAgICBtZW1zZXQocy0+aW50cmE0eDRfcHJlZF9tb2RlX3RvcCwgRENfUFJFRCwgcy0+bWJfd2lkdGggKiA0KTsKKworICAgICAgICBtZW1zZXQocy0+cmVmX2NvdW50LCAwLCBzaXplb2Yocy0+cmVmX2NvdW50KSk7CisKKyAgICAgICAgaWYgKHMtPm1iX2xheW91dCA9PSAxKSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHByZXZpb3VzIGZyYW1lIGhhcyByZWFkIGl0cyBzZWdtZW50YXRpb24gbWFwLAorICAgICAgICAgICAgLy8gaWYgd2UgcmUtdXNlIHRoZSBzYW1lIG1hcC4KKyAgICAgICAgICAgIGlmIChwcmV2X2ZyYW1lICYmIHMtPnNlZ21lbnRhdGlvbi5lbmFibGVkICYmCisgICAgICAgICAgICAgICAgIXMtPnNlZ21lbnRhdGlvbi51cGRhdGVfbWFwKQorICAgICAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcHJldl9mcmFtZS0+dGYsIDEsIDApOworICAgICAgICAgICAgaWYgKGlzX3ZwNykKKyAgICAgICAgICAgICAgICB2cDdfZGVjb2RlX212X21iX21vZGVzKGF2Y3R4LCBjdXJmcmFtZSwgcHJldl9mcmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdnA4X2RlY29kZV9tdl9tYl9tb2RlcyhhdmN0eCwgY3VyZnJhbWUsIHByZXZfZnJhbWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPT0gRkZfVEhSRUFEX0ZSQU1FKQorICAgICAgICAgICAgbnVtX2pvYnMgPSAxOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB2cDhfZGVjb2RlX212X21iX21vZGVzKGF2Y3R4LCBjdXJmcmFtZSwgcHJldl9mcmFtZSk7CisgICAgICAgICAgICBudW1fam9icyA9IEZGTUlOKHMtPm51bV9jb2VmZl9wYXJ0aXRpb25zLCBhdmN0eC0+dGhyZWFkX2NvdW50KTsKKyAgICAgICAgcy0+bnVtX2pvYnMgICA9IG51bV9qb2JzOworICAgICAgICBzLT5jdXJmcmFtZSAgID0gY3VyZnJhbWU7CisgICAgICAgIHMtPnByZXZfZnJhbWUgPSBwcmV2X2ZyYW1lOworICAgICAgICBzLT5tdl9ib3VuZHMubXZfbWluLnkgICA9IC1NQVJHSU47CisgICAgICAgIHMtPm12X2JvdW5kcy5tdl9tYXgueSAgID0gKChzLT5tYl9oZWlnaHQgLSAxKSA8PCA2KSArIE1BUkdJTjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BWF9USFJFQURTOyBpKyspIHsKKyAgICAgICAgICAgIFZQOFRocmVhZERhdGEgKnRkID0gJnMtPnRocmVhZF9kYXRhW2ldOworICAgICAgICAgICAgYXRvbWljX2luaXQoJnRkLT50aHJlYWRfbWJfcG9zLCAwKTsKKyAgICAgICAgICAgIGF0b21pY19pbml0KCZ0ZC0+d2FpdF9tYl9wb3MsIElOVF9NQVgpOworICAgICAgICB9CisgICAgICAgIGlmIChpc192cDcpCisgICAgICAgICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIHZwN19kZWNvZGVfbWJfcm93X3NsaWNlZCwgcy0+dGhyZWFkX2RhdGEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2pvYnMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmN0eC0+ZXhlY3V0ZTIoYXZjdHgsIHZwOF9kZWNvZGVfbWJfcm93X3NsaWNlZCwgcy0+dGhyZWFkX2RhdGEsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2pvYnMpOwogICAgIH0KIAotICAgIGlmIChhdmN0eC0+YWN0aXZlX3RocmVhZF90eXBlID09IEZGX1RIUkVBRF9GUkFNRSkKLSAgICAgICAgbnVtX2pvYnMgPSAxOwotICAgIGVsc2UKLSAgICAgICAgbnVtX2pvYnMgPSBGRk1JTihzLT5udW1fY29lZmZfcGFydGl0aW9ucywgYXZjdHgtPnRocmVhZF9jb3VudCk7Ci0gICAgcy0+bnVtX2pvYnMgICA9IG51bV9qb2JzOwotICAgIHMtPmN1cmZyYW1lICAgPSBjdXJmcmFtZTsKLSAgICBzLT5wcmV2X2ZyYW1lID0gcHJldl9mcmFtZTsKLSAgICBzLT5tdl9taW4ueSAgID0gLU1BUkdJTjsKLSAgICBzLT5tdl9tYXgueSAgID0gKChzLT5tYl9oZWlnaHQgLSAxKSA8PCA2KSArIE1BUkdJTjsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX1RIUkVBRFM7IGkrKykgewotICAgICAgICBzLT50aHJlYWRfZGF0YVtpXS50aHJlYWRfbWJfcG9zID0gMDsKLSAgICAgICAgcy0+dGhyZWFkX2RhdGFbaV0ud2FpdF9tYl9wb3MgICA9IElOVF9NQVg7Ci0gICAgfQotICAgIGlmIChpc192cDcpCi0gICAgICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgdnA3X2RlY29kZV9tYl9yb3dfc2xpY2VkLCBzLT50aHJlYWRfZGF0YSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bV9qb2JzKTsKLSAgICBlbHNlCi0gICAgICAgIGF2Y3R4LT5leGVjdXRlMihhdmN0eCwgdnA4X2RlY29kZV9tYl9yb3dfc2xpY2VkLCBzLT50aHJlYWRfZGF0YSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bV9qb2JzKTsKLQogICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJmN1cmZyYW1lLT50ZiwgSU5UX01BWCwgMCk7CiAgICAgbWVtY3B5KCZzLT5mcmFtZXBbMF0sICZzLT5uZXh0X2ZyYW1lcFswXSwgc2l6ZW9mKHMtPmZyYW1lcFswXSkgKiA0KTsKIApAQCAtMjcyNyw2ICsyODM1LDcgQEAKIAogICAgIHMtPmF2Y3R4ID0gYXZjdHg7CiAgICAgcy0+dnA3ICAgPSBhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1ZQNzsKKyAgICBzLT5waXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOwogICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOwogICAgIGF2Y3R4LT5pbnRlcm5hbC0+YWxsb2NhdGVfcHJvZ3Jlc3MgPSAxOwogCkBAIC0yNzQ2LDcgKzI4NTUsNyBAQAogICAgIH0KIAogICAgIC8qIGRvZXMgbm90IGNoYW5nZSBmb3IgVlA4ICovCi0gICAgbWVtY3B5KHMtPnByb2JbMF0uc2NhbiwgemlnemFnX3NjYW4sIHNpemVvZihzLT5wcm9iWzBdLnNjYW4pKTsKKyAgICBtZW1jcHkocy0+cHJvYlswXS5zY2FuLCBmZl96aWd6YWdfc2Nhbiwgc2l6ZW9mKHMtPnByb2JbMF0uc2NhbikpOwogCiAgICAgaWYgKChyZXQgPSB2cDhfaW5pdF9mcmFtZXMocykpIDwgMCkgewogICAgICAgICBmZl92cDhfZGVjb2RlX2ZyZWUoYXZjdHgpOwpAQCAtMjgwMCwxMyArMjkwOSwxNCBAQAogICAgICAgICBzLT5tYl9oZWlnaHQgPSBzX3NyYy0+bWJfaGVpZ2h0OwogICAgIH0KIAorICAgIHMtPnBpeF9mbXQgICAgICA9IHNfc3JjLT5waXhfZm10OwogICAgIHMtPnByb2JbMF0gICAgICA9IHNfc3JjLT5wcm9iWyFzX3NyYy0+dXBkYXRlX3Byb2JhYmlsaXRpZXNdOwogICAgIHMtPnNlZ21lbnRhdGlvbiA9IHNfc3JjLT5zZWdtZW50YXRpb247CiAgICAgcy0+bGZfZGVsdGEgICAgID0gc19zcmMtPmxmX2RlbHRhOwogICAgIG1lbWNweShzLT5zaWduX2JpYXMsIHNfc3JjLT5zaWduX2JpYXMsIHNpemVvZihzLT5zaWduX2JpYXMpKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzX3NyYy0+ZnJhbWVzKTsgaSsrKSB7Ci0gICAgICAgIGlmIChzX3NyYy0+ZnJhbWVzW2ldLnRmLmYtPmRhdGFbMF0pIHsKKyAgICAgICAgaWYgKHNfc3JjLT5mcmFtZXNbaV0udGYuZi0+YnVmWzBdKSB7CiAgICAgICAgICAgICBpbnQgcmV0ID0gdnA4X3JlZl9mcmFtZShzLCAmcy0+ZnJhbWVzW2ldLCAmc19zcmMtPmZyYW1lc1tpXSk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtMjg1Myw1ICsyOTYzLDE0IEBACiAgICAgLmZsdXNoICAgICAgICAgICAgICAgICA9IHZwOF9kZWNvZGVfZmx1c2gsCiAgICAgLmluaXRfdGhyZWFkX2NvcHkgICAgICA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKHZwOF9kZWNvZGVfaW5pdF90aHJlYWRfY29weSksCiAgICAgLnVwZGF0ZV90aHJlYWRfY29udGV4dCA9IE9OTFlfSUZfVEhSRUFEU19FTkFCTEVEKHZwOF9kZWNvZGVfdXBkYXRlX3RocmVhZF9jb250ZXh0KSwKKyAgICAuaHdfY29uZmlncyAgICAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNIV0NvbmZpZ0ludGVybmFsKltdKSB7CisjaWYgQ09ORklHX1ZQOF9WQUFQSV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9WQUFQSSh2cDgpLAorI2VuZGlmCisjaWYgQ09ORklHX1ZQOF9OVkRFQ19IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9OVkRFQyh2cDgpLAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKIH07CiAjZW5kaWYgLyogQ09ORklHX1ZQN19ERUNPREVSICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwOC5oIGIvbGliYXZjb2RlYy92cDguaAppbmRleCBjZmQ4MmFhLi43MGQyMWUzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZwOC5oCisrKyBiL2xpYmF2Y29kZWMvdnA4LmgKQEAgLTI2LDYgKzI2LDggQEAKICNpZm5kZWYgQVZDT0RFQ19WUDhfSAogI2RlZmluZSBBVkNPREVDX1ZQOF9ICiAKKyNpbmNsdWRlIDxzdGRhdG9taWMuaD4KKwogI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCiAKQEAgLTkxLDYgKzkzLDE2IEBACiAgICAgVlA1Nm12IGJtdlsxNl07CiB9IFZQOE1hY3JvYmxvY2s7CiAKK3R5cGVkZWYgc3RydWN0IFZQOGludG12IHsKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKK30gVlA4aW50bXY7CisKK3R5cGVkZWYgc3RydWN0IFZQOG12Ym91bmRzIHsKKyAgICBWUDhpbnRtdiBtdl9taW47CisgICAgVlA4aW50bXYgbXZfbWF4OworfSBWUDhtdmJvdW5kczsKKwogdHlwZWRlZiBzdHJ1Y3QgVlA4VGhyZWFkRGF0YSB7CiAgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBibG9jaylbNl1bNF1bMTZdOwogICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYmxvY2tfZGMpWzE2XTsKQEAgLTExNCwyOCArMTI2LDMwIEBACiAgICAgcHRocmVhZF9tdXRleF90IGxvY2s7CiAgICAgcHRocmVhZF9jb25kX3QgY29uZDsKICNlbmRpZgotICAgIGludCB0aHJlYWRfbWJfcG9zOyAvLyAobWJfeSA8PCAxNikgfCAobWJfeCAmIDB4RkZGRikKLSAgICBpbnQgd2FpdF9tYl9wb3M7IC8vIFdoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHdhaXRpbmcgb24uCisgICAgYXRvbWljX2ludCB0aHJlYWRfbWJfcG9zOyAvLyAobWJfeSA8PCAxNikgfCAobWJfeCAmIDB4RkZGRikKKyAgICBhdG9taWNfaW50IHdhaXRfbWJfcG9zOyAvLyBXaGF0IHRoZSBjdXJyZW50IHRocmVhZCBpcyB3YWl0aW5nIG9uLgogCiAjZGVmaW5lIEVER0VfRU1VX0xJTkVTSVpFIDMyCiAgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBlZGdlX2VtdV9idWZmZXIpWzIxICogRURHRV9FTVVfTElORVNJWkVdOwogICAgIFZQOEZpbHRlclN0cmVuZ3RoICpmaWx0ZXJfc3RyZW5ndGg7CisgICAgVlA4bXZib3VuZHMgbXZfYm91bmRzOwogfSBWUDhUaHJlYWREYXRhOwogCiB0eXBlZGVmIHN0cnVjdCBWUDhGcmFtZSB7CiAgICAgVGhyZWFkRnJhbWUgdGY7CiAgICAgQVZCdWZmZXJSZWYgKnNlZ19tYXA7Ci19IFZQOEZyYW1lOwogCi10eXBlZGVmIHN0cnVjdCBWUDhpbnRtdiB7Ci0gICAgaW50IHg7Ci0gICAgaW50IHk7Ci19IFZQOGludG12OworICAgIEFWQnVmZmVyUmVmICpod2FjY2VsX3ByaXZfYnVmOworICAgIHZvaWQgKmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOworfSBWUDhGcmFtZTsKIAogI2RlZmluZSBNQVhfVEhSRUFEUyA4CiB0eXBlZGVmIHN0cnVjdCBWUDhDb250ZXh0IHsKICAgICBWUDhUaHJlYWREYXRhICp0aHJlYWRfZGF0YTsKICAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgaW50IGFjdHVhbGx5X3dlYnA7CisKICAgICBWUDhGcmFtZSAqZnJhbWVwWzRdOwogICAgIFZQOEZyYW1lICpuZXh0X2ZyYW1lcFs0XTsKICAgICBWUDhGcmFtZSAqY3VyZnJhbWU7CkBAIC0xNDMsMTUgKzE1NywxNCBAQAogCiAgICAgdWludDE2X3QgbWJfd2lkdGg7ICAgLyogbnVtYmVyIG9mIGhvcml6b250YWwgTUIgKi8KICAgICB1aW50MTZfdCBtYl9oZWlnaHQ7ICAvKiBudW1iZXIgb2YgdmVydGljYWwgTUIgKi8KLSAgICBpbnQgbGluZXNpemU7Ci0gICAgaW50IHV2bGluZXNpemU7CisgICAgcHRyZGlmZl90IGxpbmVzaXplOworICAgIHB0cmRpZmZfdCB1dmxpbmVzaXplOwogCiAgICAgdWludDhfdCBrZXlmcmFtZTsKICAgICB1aW50OF90IGRlYmxvY2tfZmlsdGVyOwogICAgIHVpbnQ4X3QgbWJza2lwX2VuYWJsZWQ7CiAgICAgdWludDhfdCBwcm9maWxlOwotICAgIFZQOGludG12IG12X21pbjsKLSAgICBWUDhpbnRtdiBtdl9tYXg7CisgICAgVlA4bXZib3VuZHMgbXZfYm91bmRzOwogCiAgICAgaW50OF90IHNpZ25fYmlhc1s0XTsgLy8vPCBvbmUgc3RhdGUgWzAsIDFdIHBlciByZWYgZnJhbWUgdHlwZQogICAgIGludCByZWZfY291bnRbM107CkBAIC0xNjUsNiArMTc4LDcgQEAKICAgICAgICAgdWludDhfdCBlbmFibGVkOwogICAgICAgICB1aW50OF90IGFic29sdXRlX3ZhbHM7CiAgICAgICAgIHVpbnQ4X3QgdXBkYXRlX21hcDsKKyAgICAgICAgdWludDhfdCB1cGRhdGVfZmVhdHVyZV9kYXRhOwogICAgICAgICBpbnQ4X3QgYmFzZV9xdWFudFs0XTsKICAgICAgICAgaW50OF90IGZpbHRlcl9sZXZlbFs0XTsgICAgIC8vLzwgYmFzZSBsb29wIGZpbHRlciBsZXZlbAogICAgIH0gc2VnbWVudGF0aW9uOwpAQCAtMTkyLDggKzIwNiwxOSBAQAogICAgICAgICBpbnQxNl90IGNocm9tYV9xbXVsWzJdOwogICAgIH0gcW1hdFs0XTsKIAorICAgIC8vIFJhdyBxdWFudGlzYXRpb24gdmFsdWVzLCB3aGljaCBtYXkgYmUgbmVlZGVkIGJ5IGh3YWNjZWwgZGVjb2RlLgorICAgIHN0cnVjdCB7CisgICAgICAgIGludCB5YWNfcWk7CisgICAgICAgIGludCB5ZGNfZGVsdGE7CisgICAgICAgIGludCB5MmRjX2RlbHRhOworICAgICAgICBpbnQgeTJhY19kZWx0YTsKKyAgICAgICAgaW50IHV2ZGNfZGVsdGE7CisgICAgICAgIGludCB1dmFjX2RlbHRhOworICAgIH0gcXVhbnQ7CisKICAgICBzdHJ1Y3QgewogICAgICAgICB1aW50OF90IGVuYWJsZWQ7ICAgIC8vLzwgd2hldGhlciBlYWNoIG1iIGNhbiBoYXZlIGEgZGlmZmVyZW50IHN0cmVuZ3RoIGJhc2VkIG9uIG1vZGUvcmVmCisgICAgICAgIHVpbnQ4X3QgdXBkYXRlOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBmaWx0ZXIgc3RyZW5ndGggYWRqdXN0bWVudCBmb3IgdGhlIGZvbGxvd2luZyBtYWNyb2Jsb2NrIG1vZGVzOgpAQCAtMjIxLDkgKzI0NiwyMyBAQAogCiAgICAgVlA1NlJhbmdlQ29kZXIgYzsgICAvLy88IGhlYWRlciBjb250ZXh0LCBpbmNsdWRlcyBtYiBtb2RlcyBhbmQgbW90aW9uIHZlY3RvcnMKIAorICAgIC8qIFRoaXMgY29udGFpbnMgdGhlIGVudHJvcHkgY29kZXIgc3RhdGUgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyCisgICAgICogYmxvY2ssIGluIHRoZSBmb3JtIHNwZWNpZmllZCBieSB0aGUgc3RhbmRhcmQuICBGb3IgdXNlIGJ5CisgICAgICogaHdhY2NlbHMsIHNvIHRoYXQgYSBoYXJkd2FyZSBkZWNvZGVyIGhhcyB0aGUgaW5mb3JtYXRpb24gdG8KKyAgICAgKiBzdGFydCBkZWNvZGluZyBhdCB0aGUgbWFjcm9ibG9jayBsYXllci4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dDsKKyAgICAgICAgdWludDMyX3QgcmFuZ2U7CisgICAgICAgIHVpbnQzMl90IHZhbHVlOworICAgICAgICBpbnQgYml0X2NvdW50OworICAgIH0gY29kZXJfc3RhdGVfYXRfaGVhZGVyX2VuZDsKKworICAgIGludCBoZWFkZXJfcGFydGl0aW9uX3NpemU7CisKICAgICAvKioKICAgICAgKiBUaGVzZSBhcmUgYWxsIG9mIHRoZSB1cGRhdGFibGUgcHJvYmFiaWxpdGllcyBmb3IgYmluYXJ5IGRlY2lzaW9ucy4KLSAgICAgKiBUaGV5IGFyZSBvbmx5IGltcGxpY3RseSByZXNldCBvbiBrZXlmcmFtZXMsIG1ha2luZyBpdCBxdWl0ZSBsaWtlbHkKKyAgICAgKiBUaGV5IGFyZSBvbmx5IGltcGxpY2l0bHkgcmVzZXQgb24ga2V5ZnJhbWVzLCBtYWtpbmcgaXQgcXVpdGUgbGlrZWx5CiAgICAgICogZm9yIGFuIGludGVyZnJhbWUgdG8gZGVzeW5jIGlmIGEgcHJpb3IgZnJhbWUncyBoZWFkZXIgd2FzIGNvcnJ1cHQKICAgICAgKiBvciBtaXNzaW5nIG91dHJpZ2h0IQogICAgICAqLwpAQCAtMjU4LDYgKzI5Nyw3IEBACiAgICAgICovCiAgICAgaW50IG51bV9jb2VmZl9wYXJ0aXRpb25zOwogICAgIFZQNTZSYW5nZUNvZGVyIGNvZWZmX3BhcnRpdGlvbls4XTsKKyAgICBpbnQgY29lZmZfcGFydGl0aW9uX3NpemVbOF07CiAgICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7CiAgICAgVlA4RFNQQ29udGV4dCB2cDhkc3A7CiAgICAgSDI2NFByZWRDb250ZXh0IGhwYzsKQEAgLTI3MSwxMSArMzExLDExIEBACiAgICAgLyoqCiAgICAgICogVGhpcyBkZXNjcmliZXMgdGhlIG1hY3JvYmxvY2sgbWVtb3J5IGxheW91dC4KICAgICAgKiAwIC0+IE9ubHkgd2lkdGgraGVpZ2h0KjIrMSBtYWNyb2Jsb2NrcyBhbGxvY2F0ZWQgKGZyYW1lL3NpbmdsZSB0aHJlYWQpLgotICAgICAqIDEgLT4gTWFjcm9ibG9ja3MgZm9yIGVudGlyZSBmcmFtZSBhbGxvY2VkIChzbGljZWQgdGhyZWFkKS4KKyAgICAgKiAxIC0+IE1hY3JvYmxvY2tzIGZvciBlbnRpcmUgZnJhbWUgYWxsb2NhdGVkIChzbGljZWQgdGhyZWFkKS4KICAgICAgKi8KICAgICBpbnQgbWJfbGF5b3V0OwogCi0gICAgdm9pZCAoKmRlY29kZV9tYl9yb3dfbm9fZmlsdGVyKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHZvaWQgKnRkYXRhLCBpbnQgam9ibnIsIGludCB0aHJlYWRucik7CisgICAgaW50ICgqZGVjb2RlX21iX3Jvd19ub19maWx0ZXIpKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqdGRhdGEsIGludCBqb2JuciwgaW50IHRocmVhZG5yKTsKICAgICB2b2lkICgqZmlsdGVyX21iX3JvdykoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICp0ZGF0YSwgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIpOwogCiAgICAgaW50IHZwNzsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA4X3BhcnNlci5jIGIvbGliYXZjb2RlYy92cDhfcGFyc2VyLmMKaW5kZXggYWZjN2Y5OS4uZTJkOTFiMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDhfcGFyc2VyLmMKKysrIGIvbGliYXZjb2RlYy92cDhfcGFyc2VyLmMKQEAgLTEsNiArMSw0IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDA4IE1pY2hhZWwgTmllZGVybWF5ZXIKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMTgsMTUgKzE2LDU5IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgInBhcnNlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKIAogc3RhdGljIGludCBwYXJzZShBVkNvZGVjUGFyc2VyQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAogICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqcG91dGJ1ZiwgaW50ICpwb3V0YnVmX3NpemUsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQogewotICAgIHMtPnBpY3RfdHlwZSA9IChidWZbMF0gJiAweDAxKSA/IEFWX1BJQ1RVUkVfVFlQRV9QCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfUElDVFVSRV9UWVBFX0k7CisgICAgdW5zaWduZWQgaW50IGZyYW1lX3R5cGU7CisgICAgdW5zaWduZWQgaW50IHByb2ZpbGU7CisKKyAgICAqcG91dGJ1ZiAgICAgID0gYnVmOworICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKKworICAgIGlmIChidWZfc2l6ZSA8IDMpCisgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKworICAgIGZyYW1lX3R5cGUgPSBidWZbMF0gJiAxOworICAgIHByb2ZpbGUgICAgPSAoYnVmWzBdID4+IDEpICYgNzsKKyAgICBpZiAocHJvZmlsZSA+IDMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHByb2ZpbGUgJXUuXG4iLCBwcm9maWxlKTsKKyAgICAgICAgcmV0dXJuIGJ1Zl9zaXplOworICAgIH0KKworICAgIGF2Y3R4LT5wcm9maWxlID0gcHJvZmlsZTsKKyAgICBzLT5rZXlfZnJhbWUgICA9IGZyYW1lX3R5cGUgPT0gMDsKKyAgICBzLT5waWN0X3R5cGUgICA9IGZyYW1lX3R5cGUgPyBBVl9QSUNUVVJFX1RZUEVfUCA6IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIHMtPmZvcm1hdCAgICAgID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgIHMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfUFJPR1JFU1NJVkU7CisgICAgcy0+cGljdHVyZV9zdHJ1Y3R1cmUgPSBBVl9QSUNUVVJFX1NUUlVDVFVSRV9GUkFNRTsKKworICAgIGlmIChmcmFtZV90eXBlID09IDApIHsKKyAgICAgICAgdW5zaWduZWQgaW50IHN5bmNfY29kZTsKKyAgICAgICAgdW5zaWduZWQgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICAgICAgaWYgKGJ1Zl9zaXplIDwgMTApCisgICAgICAgICAgICByZXR1cm4gYnVmX3NpemU7CisKKyAgICAgICAgc3luY19jb2RlID0gQVZfUkwyNChidWYgKyAzKTsKKyAgICAgICAgaWYgKHN5bmNfY29kZSAhPSAweDJhMDE5ZCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN5bmMgY29kZSAlMDZ4LlxuIiwgc3luY19jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBidWZfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHdpZHRoICA9IEFWX1JMMTYoYnVmICsgNikgJiAweDNmZmY7CisgICAgICAgIGhlaWdodCA9IEFWX1JMMTYoYnVmICsgOCkgJiAweDNmZmY7CisKKyAgICAgICAgcy0+d2lkdGggICAgICAgID0gd2lkdGg7CisgICAgICAgIHMtPmhlaWdodCAgICAgICA9IGhlaWdodDsKKyAgICAgICAgcy0+Y29kZWRfd2lkdGggID0gRkZBTElHTih3aWR0aCwgIDE2KTsKKyAgICAgICAgcy0+Y29kZWRfaGVpZ2h0ID0gRkZBTElHTihoZWlnaHQsIDE2KTsKKyAgICB9CiAKICAgICAqcG91dGJ1ZiAgICAgID0gYnVmOwogICAgICpwb3V0YnVmX3NpemUgPSBidWZfc2l6ZTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA4ZGF0YS5oIGIvbGliYXZjb2RlYy92cDhkYXRhLmgKaW5kZXggZjlkYmY1Ni4uNWU2ZGVhNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDhkYXRhLmgKKysrIGIvbGliYXZjb2RlYy92cDhkYXRhLmgKQEAgLTcwOCwxNCArNzA4LDYgQEAKICAgICB9LAogfTsKIAotLy8gZml4bWU6IGNvcGllZCBmcm9tIGgyNjRkYXRhLmgKLXN0YXRpYyBjb25zdCB1aW50OF90IHppZ3phZ19zY2FuWzE2XT17Ci0gICAgMCArIDAgKiA0LCAxICsgMCAqIDQsIDAgKyAxICogNCwgMCArIDIgKiA0LAotICAgIDEgKyAxICogNCwgMiArIDAgKiA0LCAzICsgMCAqIDQsIDIgKyAxICogNCwKLSAgICAxICsgMiAqIDQsIDAgKyAzICogNCwgMSArIDMgKiA0LCAyICsgMiAqIDQsCi0gICAgMyArIDEgKiA0LCAzICsgMiAqIDQsIDIgKyAzICogNCwgMyArIDMgKiA0LAotfTsKLQogc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA4X2RjX3Fsb29rdXBbVlA4X01BWF9RVUFOVCArIDFdID0gewogICAgICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxNywKICAgICAgMTgsICAxOSwgIDIwLCAgMjAsICAyMSwgIDIxLCAgMjIsICAyMiwgIDIzLCAgMjMsICAyNCwgIDI1LCAgMjUsICAyNiwgIDI3LCAgMjgsCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwOGRzcC5jIGIvbGliYXZjb2RlYy92cDhkc3AuYwppbmRleCAwN2JlYTY5Li5mZWQ1YzY3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZwOGRzcC5jCisrKyBiL2xpYmF2Y29kZWMvdnA4ZHNwLmMKQEAgLTUzLDcgKzUzLDggQEAKICNpZiBDT05GSUdfVlA3X0RFQ09ERVIKIHN0YXRpYyB2b2lkIHZwN19sdW1hX2RjX3dodF9jKGludDE2X3QgYmxvY2tbNF1bNF1bMTZdLCBpbnQxNl90IGRjWzE2XSkKIHsKLSAgICBpbnQgaSwgYTEsIGIxLCBjMSwgZDE7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgYTEsIGIxLCBjMSwgZDE7CiAgICAgaW50MTZfdCB0bXBbMTZdOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewpAQCAtNjEsMTAgKzYyLDEwIEBACiAgICAgICAgIGIxID0gKGRjW2kgKiA0ICsgMF0gLSBkY1tpICogNCArIDJdKSAqIDIzMTcwOwogICAgICAgICBjMSA9IGRjW2kgKiA0ICsgMV0gKiAxMjU0MCAtIGRjW2kgKiA0ICsgM10gKiAzMDI3NDsKICAgICAgICAgZDEgPSBkY1tpICogNCArIDFdICogMzAyNzQgKyBkY1tpICogNCArIDNdICogMTI1NDA7Ci0gICAgICAgIHRtcFtpICogNCArIDBdID0gKGExICsgZDEpID4+IDE0OwotICAgICAgICB0bXBbaSAqIDQgKyAzXSA9IChhMSAtIGQxKSA+PiAxNDsKLSAgICAgICAgdG1wW2kgKiA0ICsgMV0gPSAoYjEgKyBjMSkgPj4gMTQ7Ci0gICAgICAgIHRtcFtpICogNCArIDJdID0gKGIxIC0gYzEpID4+IDE0OworICAgICAgICB0bXBbaSAqIDQgKyAwXSA9IChpbnQpKGExICsgZDEpID4+IDE0OworICAgICAgICB0bXBbaSAqIDQgKyAzXSA9IChpbnQpKGExIC0gZDEpID4+IDE0OworICAgICAgICB0bXBbaSAqIDQgKyAxXSA9IChpbnQpKGIxICsgYzEpID4+IDE0OworICAgICAgICB0bXBbaSAqIDQgKyAyXSA9IChpbnQpKGIxIC0gYzEpID4+IDE0OwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKQEAgLTczLDEwICs3NCwxMCBAQAogICAgICAgICBjMSA9IHRtcFtpICsgNF0gKiAxMjU0MCAtIHRtcFtpICsgMTJdICogMzAyNzQ7CiAgICAgICAgIGQxID0gdG1wW2kgKyA0XSAqIDMwMjc0ICsgdG1wW2kgKyAxMl0gKiAxMjU0MDsKICAgICAgICAgQVZfWkVSTzY0KGRjICsgaSAqIDQpOwotICAgICAgICBibG9ja1swXVtpXVswXSA9IChhMSArIGQxICsgMHgyMDAwMCkgPj4gMTg7Ci0gICAgICAgIGJsb2NrWzNdW2ldWzBdID0gKGExIC0gZDEgKyAweDIwMDAwKSA+PiAxODsKLSAgICAgICAgYmxvY2tbMV1baV1bMF0gPSAoYjEgKyBjMSArIDB4MjAwMDApID4+IDE4OwotICAgICAgICBibG9ja1syXVtpXVswXSA9IChiMSAtIGMxICsgMHgyMDAwMCkgPj4gMTg7CisgICAgICAgIGJsb2NrWzBdW2ldWzBdID0gKGludCkoYTEgKyBkMSArIDB4MjAwMDApID4+IDE4OworICAgICAgICBibG9ja1szXVtpXVswXSA9IChpbnQpKGExIC0gZDEgKyAweDIwMDAwKSA+PiAxODsKKyAgICAgICAgYmxvY2tbMV1baV1bMF0gPSAoaW50KShiMSArIGMxICsgMHgyMDAwMCkgPj4gMTg7CisgICAgICAgIGJsb2NrWzJdW2ldWzBdID0gKGludCkoYjEgLSBjMSArIDB4MjAwMDApID4+IDE4OwogICAgIH0KIH0KIApAQCAtOTUsNyArOTYsOCBAQAogCiBzdGF0aWMgdm9pZCB2cDdfaWRjdF9hZGRfYyh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBwdHJkaWZmX3Qgc3RyaWRlKQogewotICAgIGludCBpLCBhMSwgYjEsIGMxLCBkMTsKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCBhMSwgYjEsIGMxLCBkMTsKICAgICBpbnQxNl90IHRtcFsxNl07CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CkBAIC0xMDQsMTAgKzEwNiwxMCBAQAogICAgICAgICBjMSA9IGJsb2NrW2kgKiA0ICsgMV0gKiAxMjU0MCAtIGJsb2NrW2kgKiA0ICsgM10gKiAzMDI3NDsKICAgICAgICAgZDEgPSBibG9ja1tpICogNCArIDFdICogMzAyNzQgKyBibG9ja1tpICogNCArIDNdICogMTI1NDA7CiAgICAgICAgIEFWX1pFUk82NChibG9jayArIGkgKiA0KTsKLSAgICAgICAgdG1wW2kgKiA0ICsgMF0gPSAoYTEgKyBkMSkgPj4gMTQ7Ci0gICAgICAgIHRtcFtpICogNCArIDNdID0gKGExIC0gZDEpID4+IDE0OwotICAgICAgICB0bXBbaSAqIDQgKyAxXSA9IChiMSArIGMxKSA+PiAxNDsKLSAgICAgICAgdG1wW2kgKiA0ICsgMl0gPSAoYjEgLSBjMSkgPj4gMTQ7CisgICAgICAgIHRtcFtpICogNCArIDBdID0gKGludCkoYTEgKyBkMSkgPj4gMTQ7CisgICAgICAgIHRtcFtpICogNCArIDNdID0gKGludCkoYTEgLSBkMSkgPj4gMTQ7CisgICAgICAgIHRtcFtpICogNCArIDFdID0gKGludCkoYjEgKyBjMSkgPj4gMTQ7CisgICAgICAgIHRtcFtpICogNCArIDJdID0gKGludCkoYjEgLSBjMSkgPj4gMTQ7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewpAQCAtMTE2LDEzICsxMTgsMTMgQEAKICAgICAgICAgYzEgPSB0bXBbaSArIDRdICogMTI1NDAgLSB0bXBbaSArIDEyXSAqIDMwMjc0OwogICAgICAgICBkMSA9IHRtcFtpICsgNF0gKiAzMDI3NCArIHRtcFtpICsgMTJdICogMTI1NDA7CiAgICAgICAgIGRzdFswICogc3RyaWRlICsgaV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFswICogc3RyaWRlICsgaV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGExICsgZDEgKyAweDIwMDAwKSA+PiAxOCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkoYTEgKyBkMSArIDB4MjAwMDApID4+IDE4KSk7CiAgICAgICAgIGRzdFszICogc3RyaWRlICsgaV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFszICogc3RyaWRlICsgaV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGExIC0gZDEgKyAweDIwMDAwKSA+PiAxOCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkoYTEgLSBkMSArIDB4MjAwMDApID4+IDE4KSk7CiAgICAgICAgIGRzdFsxICogc3RyaWRlICsgaV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFsxICogc3RyaWRlICsgaV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGIxICsgYzEgKyAweDIwMDAwKSA+PiAxOCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkoYjEgKyBjMSArIDB4MjAwMDApID4+IDE4KSk7CiAgICAgICAgIGRzdFsyICogc3RyaWRlICsgaV0gPSBhdl9jbGlwX3VpbnQ4KGRzdFsyICogc3RyaWRlICsgaV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGIxIC0gYzEgKyAweDIwMDAwKSA+PiAxOCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludCkoYjEgLSBjMSArIDB4MjAwMDApID4+IDE4KSk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwOGRzcC5oIGIvbGliYXZjb2RlYy92cDhkc3AuaAppbmRleCAwNDAxYzkyLi5lYWFlNGFlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZwOGRzcC5oCisrKyBiL2xpYmF2Y29kZWMvdnA4ZHNwLmgKQEAgLTcwLDEyICs3MCwxMiBAQAogICAgIHZvaWQgKCp2cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGUpKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGZsaW0pOwogCiAgICAgLyoqCi0gICAgICogZmlyc3QgZGltZW5zaW9uOiB3aWR0aD4+MywgaGVpZ2h0IGlzIGFzc3VtZWQgZXF1YWwgdG8gd2lkdGgKKyAgICAgKiBmaXJzdCBkaW1lbnNpb246IDQtbG9nMih3aWR0aCkKICAgICAgKiBzZWNvbmQgZGltZW5zaW9uOiAwIGlmIG5vIHZlcnRpY2FsIGludGVycG9sYXRpb24gaXMgbmVlZGVkOwogICAgICAqICAgICAgICAgICAgICAgICAgIDEgNC10YXAgdmVydGljYWwgaW50ZXJwb2xhdGlvbiBmaWx0ZXIgKG15ICYgMSkKICAgICAgKiAgICAgICAgICAgICAgICAgICAyIDYtdGFwIHZlcnRpY2FsIGludGVycG9sYXRpb24gZmlsdGVyICghKG15ICYgMSkpCiAgICAgICogdGhpcmQgZGltZW5zaW9uOiBzYW1lIGFzIHNlY29uZCBkaW1lbnNpb24sIGZvciBob3Jpem9udGFsIGludGVycG9sYXRpb24KLSAgICAgKiBzbyBzb21ldGhpbmcgbGlrZSBwdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYlt3aWR0aD4+M11bMiohIW15LShteSYxKV1bMiohIW14LShteCYxKV0oLi4uLCBteCwgbXkpCisgICAgICogc28gc29tZXRoaW5nIGxpa2UgcHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbNC1sb2cyKHdpZHRoKV1bMiohIW15LShteSYxKV1bMiohIW14LShteCYxKV0oLi4uLCBteCwgbXkpCiAgICAgICovCiAgICAgdnA4X21jX2Z1bmMgcHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbM11bM11bM107CiAgICAgdnA4X21jX2Z1bmMgcHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiWzNdWzNdWzNdOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDkuYyBiL2xpYmF2Y29kZWMvdnA5LmMKaW5kZXggNWQ4YWQxMi4uYjExNzhjOSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDkuYworKysgYi9saWJhdmNvZGVjL3ZwOS5jCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKyNpbmNsdWRlICJod2FjY2VsLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJwcm9maWxlcy5oIgogI2luY2x1ZGUgInRocmVhZC5oIgpAQCAtMzAsMTc2ICszMSw5NyBAQAogI2luY2x1ZGUgInZwNTYuaCIKICNpbmNsdWRlICJ2cDkuaCIKICNpbmNsdWRlICJ2cDlkYXRhLmgiCi0jaW5jbHVkZSAidnA5ZHNwLmgiCisjaW5jbHVkZSAidnA5ZGVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKIAogI2RlZmluZSBWUDlfU1lOQ0NPREUgMHg0OTgzNDIKIAotc3RydWN0IFZQOUZpbHRlciB7Ci0gICAgdWludDhfdCBsZXZlbFs4ICogOF07Ci0gICAgdWludDhfdCAvKiBiaXQ9Y29sICovIG1hc2tbMiAvKiAwPXksIDE9dXYgKi9dWzIgLyogMD1jb2wsIDE9cm93ICovXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzggLyogcm93cyAqL11bNCAvKiAwPTE2LCAxPTgsIDI9NCwgMz1pbm5lcjQgKi9dOwotfTsKKyNpZiBIQVZFX1RIUkVBRFMKK3N0YXRpYyB2b2lkIHZwOV9mcmVlX2VudHJpZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KSB7CisgICAgVlA5Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKLXR5cGVkZWYgc3RydWN0IFZQOUJsb2NrIHsKLSAgICB1aW50OF90IHNlZ19pZCwgaW50cmEsIGNvbXAsIHJlZlsyXSwgbW9kZVs0XSwgdXZtb2RlLCBza2lwOwotICAgIGVudW0gRmlsdGVyTW9kZSBmaWx0ZXI7Ci0gICAgVlA1Nm12IG12WzQgLyogYl9pZHggKi9dWzIgLyogcmVmICovXTsKLSAgICBlbnVtIEJsb2NrU2l6ZSBiczsKLSAgICBlbnVtIFR4Zm1Nb2RlIHR4LCB1dnR4OwotICAgIGVudW0gQmxvY2tMZXZlbCBibDsKLSAgICBlbnVtIEJsb2NrUGFydGl0aW9uIGJwOwotfSBWUDlCbG9jazsKLQotdHlwZWRlZiBzdHJ1Y3QgVlA5Q29udGV4dCB7Ci0gICAgVlA5U2hhcmVkQ29udGV4dCBzOwotCi0gICAgVlA5RFNQQ29udGV4dCBkc3A7Ci0gICAgVmlkZW9EU1BDb250ZXh0IHZkc3A7Ci0gICAgR2V0Qml0Q29udGV4dCBnYjsKLSAgICBWUDU2UmFuZ2VDb2RlciBjOwotICAgIFZQNTZSYW5nZUNvZGVyICpjX2I7Ci0gICAgdW5zaWduZWQgY19iX3NpemU7Ci0gICAgVlA5QmxvY2sgKmJfYmFzZSwgKmI7Ci0gICAgaW50IHBhc3M7Ci0gICAgaW50IHJvdywgcm93NywgY29sLCBjb2w3OwotICAgIHVpbnQ4X3QgKmRzdFszXTsKLSAgICBwdHJkaWZmX3QgeV9zdHJpZGUsIHV2X3N0cmlkZTsKLQotICAgIHVpbnQ4X3Qgc3NfaCwgc3NfdjsKLSAgICB1aW50OF90IGxhc3RfYnBwLCBicHAsIGJwcF9pbmRleCwgYnl0ZXNwZXJwaXhlbDsKLSAgICB1aW50OF90IGxhc3Rfa2V5ZnJhbWU7Ci0gICAgLy8gc2JfY29scy9yb3dzLCByb3dzL2NvbHMgYW5kIGxhc3RfZm10IGFyZSB1c2VkIGZvciBhbGxvY2F0aW5nIGFsbCBpbnRlcm5hbAotICAgIC8vIGFycmF5cywgYW5kIGFyZSB0aHVzIHBlci10aHJlYWQuIHcvaCBhbmQgZ2ZfZm10IGFyZSBzeW5jZWQgYmV0d2VlbiB0aHJlYWRzCi0gICAgLy8gYW5kIGFyZSB0aGVyZWZvcmUgcGVyLXN0cmVhbS4gcGl4X2ZtdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBpbiB0aGUgaGVhZGVyCi0gICAgLy8gb2YgdGhlIGN1cnJlbnRseSBwcm9jZXNzZWQgZnJhbWUuCi0gICAgaW50IHcsIGg7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGxhc3RfZm10LCBnZl9mbXQ7Ci0gICAgdW5zaWduZWQgc2JfY29scywgc2Jfcm93cywgcm93cywgY29sczsKLSAgICBUaHJlYWRGcmFtZSBuZXh0X3JlZnNbOF07Ci0KLSAgICBzdHJ1Y3QgewotICAgICAgICB1aW50OF90IGxpbV9sdXRbNjRdOwotICAgICAgICB1aW50OF90IG1ibGltX2x1dFs2NF07Ci0gICAgfSBmaWx0ZXJfbHV0OwotICAgIHVuc2lnbmVkIHRpbGVfcm93X3N0YXJ0LCB0aWxlX3Jvd19lbmQsIHRpbGVfY29sX3N0YXJ0LCB0aWxlX2NvbF9lbmQ7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgcHJvYl9jb250ZXh0IHA7Ci0gICAgICAgIHVpbnQ4X3QgY29lZls0XVsyXVsyXVs2XVs2XVszXTsKLSAgICB9IHByb2JfY3R4WzRdOwotICAgIHN0cnVjdCB7Ci0gICAgICAgIHByb2JfY29udGV4dCBwOwotICAgICAgICB1aW50OF90IGNvZWZbNF1bMl1bMl1bNl1bNl1bMTFdOwotICAgIH0gcHJvYjsKLSAgICBzdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCB5X21vZGVbNF1bMTBdOwotICAgICAgICB1bnNpZ25lZCB1dl9tb2RlWzEwXVsxMF07Ci0gICAgICAgIHVuc2lnbmVkIGZpbHRlcls0XVszXTsKLSAgICAgICAgdW5zaWduZWQgbXZfbW9kZVs3XVs0XTsKLSAgICAgICAgdW5zaWduZWQgaW50cmFbNF1bMl07Ci0gICAgICAgIHVuc2lnbmVkIGNvbXBbNV1bMl07Ci0gICAgICAgIHVuc2lnbmVkIHNpbmdsZV9yZWZbNV1bMl1bMl07Ci0gICAgICAgIHVuc2lnbmVkIGNvbXBfcmVmWzVdWzJdOwotICAgICAgICB1bnNpZ25lZCB0eDMycFsyXVs0XTsKLSAgICAgICAgdW5zaWduZWQgdHgxNnBbMl1bM107Ci0gICAgICAgIHVuc2lnbmVkIHR4OHBbMl1bMl07Ci0gICAgICAgIHVuc2lnbmVkIHNraXBbM11bMl07Ci0gICAgICAgIHVuc2lnbmVkIG12X2pvaW50WzRdOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdW5zaWduZWQgc2lnblsyXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNsYXNzZXNbMTFdOwotICAgICAgICAgICAgdW5zaWduZWQgY2xhc3MwWzJdOwotICAgICAgICAgICAgdW5zaWduZWQgYml0c1sxMF1bMl07Ci0gICAgICAgICAgICB1bnNpZ25lZCBjbGFzczBfZnBbMl1bNF07Ci0gICAgICAgICAgICB1bnNpZ25lZCBmcFs0XTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNsYXNzMF9ocFsyXTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGhwWzJdOwotICAgICAgICB9IG12X2NvbXBbMl07Ci0gICAgICAgIHVuc2lnbmVkIHBhcnRpdGlvbls0XVs0XVs0XTsKLSAgICAgICAgdW5zaWduZWQgY29lZls0XVsyXVsyXVs2XVs2XVszXTsKLSAgICAgICAgdW5zaWduZWQgZW9iWzRdWzJdWzJdWzZdWzZdWzJdOwotICAgIH0gY291bnRzOwotCi0gICAgLy8gY29udGV4dHVhbCAobGVmdC9hYm92ZSkgY2FjaGUKLSAgICBERUNMQVJFX0FMSUdORUQoMTYsIHVpbnQ4X3QsIGxlZnRfeV9ubnpfY3R4KVsxNl07Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBsZWZ0X21vZGVfY3R4KVsxNl07Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCBWUDU2bXYsIGxlZnRfbXZfY3R4KVsxNl1bMl07Ci0gICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBsZWZ0X3V2X25uel9jdHgpWzJdWzE2XTsKLSAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9wYXJ0aXRpb25fY3R4KVs4XTsKLSAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9za2lwX2N0eClbOF07Ci0gICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxlZnRfdHhmbV9jdHgpWzhdOwotICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBsZWZ0X3NlZ3ByZWRfY3R4KVs4XTsKLSAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9pbnRyYV9jdHgpWzhdOwotICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBsZWZ0X2NvbXBfY3R4KVs4XTsKLSAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9yZWZfY3R4KVs4XTsKLSAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9maWx0ZXJfY3R4KVs4XTsKLSAgICB1aW50OF90ICphYm92ZV9wYXJ0aXRpb25fY3R4OwotICAgIHVpbnQ4X3QgKmFib3ZlX21vZGVfY3R4OwotICAgIC8vIEZJWE1FIG1heWJlIG1lcmdlIHNvbWUgb2YgdGhlIGJlbG93IGluIGEgZmxhZ3MgZmllbGQ/Ci0gICAgdWludDhfdCAqYWJvdmVfeV9ubnpfY3R4OwotICAgIHVpbnQ4X3QgKmFib3ZlX3V2X25uel9jdHhbMl07Ci0gICAgdWludDhfdCAqYWJvdmVfc2tpcF9jdHg7IC8vIDFiaXQKLSAgICB1aW50OF90ICphYm92ZV90eGZtX2N0eDsgLy8gMmJpdAotICAgIHVpbnQ4X3QgKmFib3ZlX3NlZ3ByZWRfY3R4OyAvLyAxYml0Ci0gICAgdWludDhfdCAqYWJvdmVfaW50cmFfY3R4OyAvLyAxYml0Ci0gICAgdWludDhfdCAqYWJvdmVfY29tcF9jdHg7IC8vIDFiaXQKLSAgICB1aW50OF90ICphYm92ZV9yZWZfY3R4OyAvLyAyYml0Ci0gICAgdWludDhfdCAqYWJvdmVfZmlsdGVyX2N0eDsKLSAgICBWUDU2bXYgKCphYm92ZV9tdl9jdHgpWzJdOwotCi0gICAgLy8gd2hvbGUtZnJhbWUgY2FjaGUKLSAgICB1aW50OF90ICppbnRyYV9wcmVkX2RhdGFbM107Ci0gICAgc3RydWN0IFZQOUZpbHRlciAqbGZsdmw7Ci0gICAgREVDTEFSRV9BTElHTkVEKDMyLCB1aW50OF90LCBlZGdlX2VtdV9idWZmZXIpWzEzNSAqIDE0NCAqIDJdOwotCi0gICAgLy8gYmxvY2sgcmVjb25zdHJ1Y3Rpb24gaW50ZXJtZWRpYXRlcwotICAgIGludCBibG9ja19hbGxvY191c2luZ18ycGFzczsKLSAgICBpbnQxNl90ICpibG9ja19iYXNlLCAqYmxvY2ssICp1dmJsb2NrX2Jhc2VbMl0sICp1dmJsb2NrWzJdOwotICAgIHVpbnQ4X3QgKmVvYl9iYXNlLCAqdXZlb2JfYmFzZVsyXSwgKmVvYiwgKnV2ZW9iWzJdOwotICAgIHN0cnVjdCB7IGludCB4LCB5OyB9IG1pbl9tdiwgbWF4X212OwotICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgdWludDhfdCwgdG1wX3kpWzY0ICogNjQgKiAyXTsKLSAgICBERUNMQVJFX0FMSUdORUQoMzIsIHVpbnQ4X3QsIHRtcF91dilbMl1bNjQgKiA2NCAqIDJdOwotICAgIHVpbnQxNl90IG12c2NhbGVbM11bMl07Ci0gICAgdWludDhfdCBtdnN0ZXBbM11bMl07Ci19IFZQOUNvbnRleHQ7Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGJ3aF90YWJbMl1bTl9CU19TSVpFU11bMl0gPSB7Ci0gICAgewotICAgICAgICB7IDE2LCAxNiB9LCB7IDE2LCA4IH0sIHsgOCwgMTYgfSwgeyA4LCA4IH0sIHsgOCwgNCB9LCB7IDQsIDggfSwKLSAgICAgICAgeyA0LCA0IH0sIHsgNCwgMiB9LCB7IDIsIDQgfSwgeyAyLCAyIH0sIHsgMiwgMSB9LCB7IDEsIDIgfSwgeyAxLCAxIH0sCi0gICAgfSwgewotICAgICAgICB7IDgsIDggfSwgeyA4LCA0IH0sIHsgNCwgOCB9LCB7IDQsIDQgfSwgeyA0LCAyIH0sIHsgMiwgNCB9LAotICAgICAgICB7IDIsIDIgfSwgeyAyLCAxIH0sIHsgMSwgMiB9LCB7IDEsIDEgfSwgeyAxLCAxIH0sIHsgMSwgMSB9LCB7IDEsIDEgfSwKKyAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSAmIEZGX1RIUkVBRF9TTElDRSkgIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZzLT5wcm9ncmVzc19tdXRleCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZzLT5wcm9ncmVzc19jb25kKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmVudHJpZXMpOwogICAgIH0KLX07Cit9CiAKLXN0YXRpYyB2b2lkIHZwOV91bnJlZl9mcmFtZShBVkNvZGVjQ29udGV4dCAqY3R4LCBWUDlGcmFtZSAqZikKK3N0YXRpYyBpbnQgdnA5X2FsbG9jX2VudHJpZXMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgbikgeworICAgIFZQOUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBpOworCisgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpICB7CisgICAgICAgIGlmIChzLT5lbnRyaWVzKQorICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmVudHJpZXMpOworCisgICAgICAgIHMtPmVudHJpZXMgPSBhdl9tYWxsb2NfYXJyYXkobiwgc2l6ZW9mKGF0b21pY19pbnQpKTsKKworICAgICAgICBpZiAoIXMtPmVudHJpZXMpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5lbnRyaWVzKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIGF0b21pY19pbml0KCZzLT5lbnRyaWVzW2ldLCAwKTsKKworICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJnMtPnByb2dyZXNzX211dGV4LCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9jb25kX2luaXQoJnMtPnByb2dyZXNzX2NvbmQsIE5VTEwpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnA5X3JlcG9ydF90aWxlX3Byb2dyZXNzKFZQOUNvbnRleHQgKnMsIGludCBmaWVsZCwgaW50IG4pIHsKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnMtPnByb2dyZXNzX211dGV4KTsKKyAgICBhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCZzLT5lbnRyaWVzW2ZpZWxkXSwgbiwgbWVtb3J5X29yZGVyX3JlbGVhc2UpOworICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnMtPnByb2dyZXNzX2NvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5wcm9ncmVzc19tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkIHZwOV9hd2FpdF90aWxlX3Byb2dyZXNzKFZQOUNvbnRleHQgKnMsIGludCBmaWVsZCwgaW50IG4pIHsKKyAgICBpZiAoYXRvbWljX2xvYWRfZXhwbGljaXQoJnMtPmVudHJpZXNbZmllbGRdLCBtZW1vcnlfb3JkZXJfYWNxdWlyZSkgPj0gbikKKyAgICAgICAgcmV0dXJuOworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5wcm9ncmVzc19tdXRleCk7CisgICAgd2hpbGUgKGF0b21pY19sb2FkX2V4cGxpY2l0KCZzLT5lbnRyaWVzW2ZpZWxkXSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpICE9IG4pCisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZzLT5wcm9ncmVzc19jb25kLCAmcy0+cHJvZ3Jlc3NfbXV0ZXgpOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5wcm9ncmVzc19tdXRleCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgdnA5X2ZyZWVfZW50cmllcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpIHt9CitzdGF0aWMgaW50IHZwOV9hbGxvY19lbnRyaWVzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IG4pIHsgcmV0dXJuIDA7IH0KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB2cDlfZnJhbWVfdW5yZWYoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWUDlGcmFtZSAqZikKIHsKLSAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoY3R4LCAmZi0+dGYpOworICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJmYtPnRmKTsKICAgICBhdl9idWZmZXJfdW5yZWYoJmYtPmV4dHJhZGF0YSk7CiAgICAgYXZfYnVmZmVyX3VucmVmKCZmLT5od2FjY2VsX3ByaXZfYnVmKTsKICAgICBmLT5zZWdtZW50YXRpb25fbWFwID0gTlVMTDsKICAgICBmLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgdnA5X2FsbG9jX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICpjdHgsIFZQOUZyYW1lICpmKQorc3RhdGljIGludCB2cDlfZnJhbWVfYWxsb2MoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBWUDlGcmFtZSAqZikKIHsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgVlA5Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IHJldCwgc3o7CiAKLSAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGN0eCwgJmYtPnRmLCBBVl9HRVRfQlVGRkVSX0ZMQUdfUkVGKSkgPCAwKQorICAgIHJldCA9IGZmX3RocmVhZF9nZXRfYnVmZmVyKGF2Y3R4LCAmZi0+dGYsIEFWX0dFVF9CVUZGRVJfRkxBR19SRUYpOworICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OworCiAgICAgc3ogPSA2NCAqIHMtPnNiX2NvbHMgKiBzLT5zYl9yb3dzOwotICAgIGlmICghKGYtPmV4dHJhZGF0YSA9IGF2X2J1ZmZlcl9hbGxvY3ooc3ogKiAoMSArIHNpemVvZihzdHJ1Y3QgVlA5bXZyZWZQYWlyKSkpKSkgeworICAgIGYtPmV4dHJhZGF0YSA9IGF2X2J1ZmZlcl9hbGxvY3ooc3ogKiAoMSArIHNpemVvZihWUDltdnJlZlBhaXIpKSk7CisgICAgaWYgKCFmLT5leHRyYWRhdGEpIHsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAogICAgIGYtPnNlZ21lbnRhdGlvbl9tYXAgPSBmLT5leHRyYWRhdGEtPmRhdGE7Ci0gICAgZi0+bXYgPSAoc3RydWN0IFZQOW12cmVmUGFpciAqKSAoZi0+ZXh0cmFkYXRhLT5kYXRhICsgc3opOworICAgIGYtPm12ID0gKFZQOW12cmVmUGFpciAqKSAoZi0+ZXh0cmFkYXRhLT5kYXRhICsgc3opOwogCi0gICAgaWYgKGN0eC0+aHdhY2NlbCkgewotICAgICAgICBjb25zdCBBVkhXQWNjZWwgKmh3YWNjZWwgPSBjdHgtPmh3YWNjZWw7CisgICAgaWYgKGF2Y3R4LT5od2FjY2VsKSB7CisgICAgICAgIGNvbnN0IEFWSFdBY2NlbCAqaHdhY2NlbCA9IGF2Y3R4LT5od2FjY2VsOwogICAgICAgICBhdl9hc3NlcnQwKCFmLT5od2FjY2VsX3BpY3R1cmVfcHJpdmF0ZSk7CiAgICAgICAgIGlmIChod2FjY2VsLT5mcmFtZV9wcml2X2RhdGFfc2l6ZSkgewogICAgICAgICAgICAgZi0+aHdhY2NlbF9wcml2X2J1ZiA9IGF2X2J1ZmZlcl9hbGxvY3ooaHdhY2NlbC0+ZnJhbWVfcHJpdl9kYXRhX3NpemUpOwpAQCAtMjEyLDE5ICsxMzQsMjEgQEAKICAgICByZXR1cm4gMDsKIAogZmFpbDoKLSAgICB2cDlfdW5yZWZfZnJhbWUoY3R4LCBmKTsKKyAgICB2cDlfZnJhbWVfdW5yZWYoYXZjdHgsIGYpOwogICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiB9CiAKLXN0YXRpYyBpbnQgdnA5X3JlZl9mcmFtZShBVkNvZGVjQ29udGV4dCAqY3R4LCBWUDlGcmFtZSAqZHN0LCBWUDlGcmFtZSAqc3JjKQorc3RhdGljIGludCB2cDlfZnJhbWVfcmVmKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVlA5RnJhbWUgKmRzdCwgVlA5RnJhbWUgKnNyYykKIHsKLSAgICBpbnQgcmVzOworICAgIGludCByZXQ7CiAKLSAgICBpZiAoKHJlcyA9IGZmX3RocmVhZF9yZWZfZnJhbWUoJmRzdC0+dGYsICZzcmMtPnRmKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiByZXM7Ci0gICAgfSBlbHNlIGlmICghKGRzdC0+ZXh0cmFkYXRhID0gYXZfYnVmZmVyX3JlZihzcmMtPmV4dHJhZGF0YSkpKSB7CisgICAgcmV0ID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmZHN0LT50ZiwgJnNyYy0+dGYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZHN0LT5leHRyYWRhdGEgPSBhdl9idWZmZXJfcmVmKHNyYy0+ZXh0cmFkYXRhKTsKKyAgICBpZiAoIWRzdC0+ZXh0cmFkYXRhKQogICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQogCiAgICAgZHN0LT5zZWdtZW50YXRpb25fbWFwID0gc3JjLT5zZWdtZW50YXRpb25fbWFwOwogICAgIGRzdC0+bXYgPSBzcmMtPm12OwpAQCAtMjQwLDQ0ICsxNjQsNjMgQEAKICAgICByZXR1cm4gMDsKIAogZmFpbDoKLSAgICB2cDlfdW5yZWZfZnJhbWUoY3R4LCBkc3QpOworICAgIHZwOV9mcmFtZV91bnJlZihhdmN0eCwgZHN0KTsKICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogfQogCi1zdGF0aWMgaW50IHVwZGF0ZV9zaXplKEFWQ29kZWNDb250ZXh0ICpjdHgsIGludCB3LCBpbnQgaCkKK3N0YXRpYyBpbnQgdXBkYXRlX3NpemUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgdywgaW50IGgpCiB7Ci0jZGVmaW5lIEhXQUNDRUxfTUFYIChDT05GSUdfVlA5X0RYVkEyX0hXQUNDRUwgKyBDT05GSUdfVlA5X0QzRDExVkFfSFdBQ0NFTCArIENPTkZJR19WUDlfVkFBUElfSFdBQ0NFTCkKKyNkZWZpbmUgSFdBQ0NFTF9NQVggKENPTkZJR19WUDlfRFhWQTJfSFdBQ0NFTCArIFwKKyAgICAgICAgICAgICAgICAgICAgIENPTkZJR19WUDlfRDNEMTFWQV9IV0FDQ0VMICogMiArIFwKKyAgICAgICAgICAgICAgICAgICAgIENPTkZJR19WUDlfTlZERUNfSFdBQ0NFTCArIFwKKyAgICAgICAgICAgICAgICAgICAgIENPTkZJR19WUDlfVkFBUElfSFdBQ0NFTCkKICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbSFdBQ0NFTF9NQVggKyAyXSwgKmZtdHAgPSBwaXhfZm10czsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgVlA5Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgdWludDhfdCAqcDsKLSAgICBpbnQgYnl0ZXNwZXJwaXhlbCA9IHMtPmJ5dGVzcGVycGl4ZWwsIHJlcywgY29scywgcm93czsKKyAgICBpbnQgYnl0ZXNwZXJwaXhlbCA9IHMtPmJ5dGVzcGVycGl4ZWwsIHJldCwgY29scywgcm93czsKKyAgICBpbnQgbGZsdmxfbGVuLCBpOwogCiAgICAgYXZfYXNzZXJ0MCh3ID4gMCAmJiBoID4gMCk7CiAKICAgICBpZiAoIShzLT5waXhfZm10ID09IHMtPmdmX2ZtdCAmJiB3ID09IHMtPncgJiYgaCA9PSBzLT5oKSkgewotICAgICAgICBpZiAoKHJlcyA9IGZmX3NldF9kaW1lbnNpb25zKGN0eCwgdywgaCkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIGlmICgocmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHcsIGgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgIGlmIChzLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgeworICAgICAgICBzd2l0Y2ggKHMtPnBpeF9mbXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTA6CiAjaWYgQ09ORklHX1ZQOV9EWFZBMl9IV0FDQ0VMCiAgICAgICAgICAgICAqZm10cCsrID0gQVZfUElYX0ZNVF9EWFZBMl9WTEQ7CiAjZW5kaWYKICNpZiBDT05GSUdfVlA5X0QzRDExVkFfSFdBQ0NFTAogICAgICAgICAgICAgKmZtdHArKyA9IEFWX1BJWF9GTVRfRDNEMTFWQV9WTEQ7CisgICAgICAgICAgICAqZm10cCsrID0gQVZfUElYX0ZNVF9EM0QxMTsKKyNlbmRpZgorI2lmIENPTkZJR19WUDlfTlZERUNfSFdBQ0NFTAorICAgICAgICAgICAgKmZtdHArKyA9IEFWX1BJWF9GTVRfQ1VEQTsKICNlbmRpZgogI2lmIENPTkZJR19WUDlfVkFBUElfSFdBQ0NFTAogICAgICAgICAgICAgKmZtdHArKyA9IEFWX1BJWF9GTVRfVkFBUEk7CiAjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEyOgorI2lmIENPTkZJR19WUDlfTlZERUNfSFdBQ0NFTAorICAgICAgICAgICAgKmZtdHArKyA9IEFWX1BJWF9GTVRfQ1VEQTsKKyNlbmRpZgorI2lmIENPTkZJR19WUDlfVkFBUElfSFdBQ0NFTAorICAgICAgICAgICAgKmZtdHArKyA9IEFWX1BJWF9GTVRfVkFBUEk7CisjZW5kaWYKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgKmZtdHArKyA9IHMtPnBpeF9mbXQ7CiAgICAgICAgICpmbXRwID0gQVZfUElYX0ZNVF9OT05FOwogCi0gICAgICAgIHJlcyA9IGZmX3RocmVhZF9nZXRfZm9ybWF0KGN0eCwgcGl4X2ZtdHMpOwotICAgICAgICBpZiAocmVzIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIHJldCA9IGZmX3RocmVhZF9nZXRfZm9ybWF0KGF2Y3R4LCBwaXhfZm10cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICBjdHgtPnBpeF9mbXQgPSByZXM7CisgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gcmV0OwogICAgICAgICBzLT5nZl9mbXQgID0gcy0+cGl4X2ZtdDsKICAgICAgICAgcy0+dyA9IHc7CiAgICAgICAgIHMtPmggPSBoOwpAQCAtMjk0LDEzICsyMzcsMTQgQEAKICAgICBzLT5zYl9yb3dzICAgPSAoaCArIDYzKSA+PiA2OwogICAgIHMtPmNvbHMgICAgICA9ICh3ICsgNykgPj4gMzsKICAgICBzLT5yb3dzICAgICAgPSAoaCArIDcpID4+IDM7CisgICAgbGZsdmxfbGVuICAgID0gYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfU0xJQ0UgPyBzLT5zYl9yb3dzIDogMTsKIAogI2RlZmluZSBhc3NpZ24odmFyLCB0eXBlLCBuKSB2YXIgPSAodHlwZSkgcDsgcCArPSBzLT5zYl9jb2xzICogKG4pICogc2l6ZW9mKCp2YXIpCiAgICAgYXZfZnJlZXAoJnMtPmludHJhX3ByZWRfZGF0YVswXSk7CiAgICAgLy8gRklYTUUgd2Ugc2xpZ2h0bHkgb3Zlci1hbGxvY2F0ZSBoZXJlIGZvciBzdWJzYW1wbGVkIGNocm9tYSwgYnV0IGEgbGl0dGxlCiAgICAgLy8gYml0IG9mIHBhZGRpbmcgc2hvdWxkbid0IGFmZmVjdCBwZXJmb3JtYW5jZS4uLgogICAgIHAgPSBhdl9tYWxsb2Mocy0+c2JfY29scyAqICgxMjggKyAxOTIgKiBieXRlc3BlcnBpeGVsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5sZmx2bCkgKyAxNiAqIHNpemVvZigqcy0+YWJvdmVfbXZfY3R4KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZmx2bF9sZW4gKiBzaXplb2YoKnMtPmxmbHZsKSArIDE2ICogc2l6ZW9mKCpzLT5hYm92ZV9tdl9jdHgpKSk7CiAgICAgaWYgKCFwKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIGFzc2lnbihzLT5pbnRyYV9wcmVkX2RhdGFbMF0sICB1aW50OF90ICosICAgICAgICAgICAgIDY0ICogYnl0ZXNwZXJwaXhlbCk7CkBAIC0zMTksNjUgKzI2Myw3OCBAQAogICAgIGFzc2lnbihzLT5hYm92ZV9jb21wX2N0eCwgICAgICB1aW50OF90ICosICAgICAgICAgICAgICA4KTsKICAgICBhc3NpZ24ocy0+YWJvdmVfcmVmX2N0eCwgICAgICAgdWludDhfdCAqLCAgICAgICAgICAgICAgOCk7CiAgICAgYXNzaWduKHMtPmFib3ZlX2ZpbHRlcl9jdHgsICAgIHVpbnQ4X3QgKiwgICAgICAgICAgICAgIDgpOwotICAgIGFzc2lnbihzLT5sZmx2bCwgICAgICAgICAgICAgICBzdHJ1Y3QgVlA5RmlsdGVyICosICAgICAxKTsKKyAgICBhc3NpZ24ocy0+bGZsdmwsICAgICAgICAgICAgICAgVlA5RmlsdGVyICosICAgICAgICAgICAgbGZsdmxfbGVuKTsKICN1bmRlZiBhc3NpZ24KIAotICAgIC8vIHRoZXNlIHdpbGwgYmUgcmUtYWxsb2NhdGVkIGEgbGl0dGxlIGxhdGVyCi0gICAgYXZfZnJlZXAoJnMtPmJfYmFzZSk7Ci0gICAgYXZfZnJlZXAoJnMtPmJsb2NrX2Jhc2UpOworICAgIGlmIChzLT50ZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YWN0aXZlX3RpbGVfY29sczsgaSsrKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+dGRbaV0uYl9iYXNlKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT50ZFtpXS5ibG9ja19iYXNlKTsKKyAgICAgICAgfQorICAgIH0KIAotICAgIGlmIChzLT5icHAgIT0gcy0+bGFzdF9icHApIHsKLSAgICAgICAgZmZfdnA5ZHNwX2luaXQoJnMtPmRzcCwgcy0+YnBwLCBjdHgtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19CSVRFWEFDVCk7Ci0gICAgICAgIGZmX3ZpZGVvZHNwX2luaXQoJnMtPnZkc3AsIHMtPmJwcCk7Ci0gICAgICAgIHMtPmxhc3RfYnBwID0gcy0+YnBwOworICAgIGlmIChzLT5zLmguYnBwICE9IHMtPmxhc3RfYnBwKSB7CisgICAgICAgIGZmX3ZwOWRzcF9pbml0KCZzLT5kc3AsIHMtPnMuaC5icHAsIGF2Y3R4LT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfQklURVhBQ1QpOworICAgICAgICBmZl92aWRlb2RzcF9pbml0KCZzLT52ZHNwLCBzLT5zLmguYnBwKTsKKyAgICAgICAgcy0+bGFzdF9icHAgPSBzLT5zLmguYnBwOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVwZGF0ZV9ibG9ja19idWZmZXJzKEFWQ29kZWNDb250ZXh0ICpjdHgpCitzdGF0aWMgaW50IHVwZGF0ZV9ibG9ja19idWZmZXJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IGk7CisgICAgVlA5Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IGNocm9tYV9ibG9ja3MsIGNocm9tYV9lb2JzLCBieXRlc3BlcnBpeGVsID0gcy0+Ynl0ZXNwZXJwaXhlbDsKKyAgICBWUDlUaWxlRGF0YSAqdGQgPSAmcy0+dGRbMF07CiAKLSAgICBpZiAocy0+Yl9iYXNlICYmIHMtPmJsb2NrX2Jhc2UgJiYgcy0+YmxvY2tfYWxsb2NfdXNpbmdfMnBhc3MgPT0gcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS51c2VzXzJwYXNzKQorICAgIGlmICh0ZC0+Yl9iYXNlICYmIHRkLT5ibG9ja19iYXNlICYmIHMtPmJsb2NrX2FsbG9jX3VzaW5nXzJwYXNzID09IHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udXNlc18ycGFzcykKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBhdl9mcmVlKHMtPmJfYmFzZSk7Ci0gICAgYXZfZnJlZShzLT5ibG9ja19iYXNlKTsKKyAgICBhdl9mcmVlKHRkLT5iX2Jhc2UpOworICAgIGF2X2ZyZWUodGQtPmJsb2NrX2Jhc2UpOwogICAgIGNocm9tYV9ibG9ja3MgPSA2NCAqIDY0ID4+IChzLT5zc19oICsgcy0+c3Nfdik7CiAgICAgY2hyb21hX2VvYnMgICA9IDE2ICogMTYgPj4gKHMtPnNzX2ggKyBzLT5zc192KTsKICAgICBpZiAocy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS51c2VzXzJwYXNzKSB7CiAgICAgICAgIGludCBzYnMgPSBzLT5zYl9jb2xzICogcy0+c2Jfcm93czsKIAotICAgICAgICBzLT5iX2Jhc2UgPSBhdl9tYWxsb2NfYXJyYXkocy0+Y29scyAqIHMtPnJvd3MsIHNpemVvZihWUDlCbG9jaykpOwotICAgICAgICBzLT5ibG9ja19iYXNlID0gYXZfbWFsbG9jeigoKDY0ICogNjQgKyAyICogY2hyb21hX2Jsb2NrcykgKiBieXRlc3BlcnBpeGVsICogc2l6ZW9mKGludDE2X3QpICsKKyAgICAgICAgdGQtPmJfYmFzZSA9IGF2X21hbGxvY19hcnJheShzLT5jb2xzICogcy0+cm93cywgc2l6ZW9mKFZQOUJsb2NrKSk7CisgICAgICAgIHRkLT5ibG9ja19iYXNlID0gYXZfbWFsbG9jeigoKDY0ICogNjQgKyAyICogY2hyb21hX2Jsb2NrcykgKiBieXRlc3BlcnBpeGVsICogc2l6ZW9mKGludDE2X3QpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICogMTYgKyAyICogY2hyb21hX2VvYnMpICogc2JzKTsKLSAgICAgICAgaWYgKCFzLT5iX2Jhc2UgfHwgIXMtPmJsb2NrX2Jhc2UpCisgICAgICAgIGlmICghdGQtPmJfYmFzZSB8fCAhdGQtPmJsb2NrX2Jhc2UpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBzLT51dmJsb2NrX2Jhc2VbMF0gPSBzLT5ibG9ja19iYXNlICsgc2JzICogNjQgKiA2NCAqIGJ5dGVzcGVycGl4ZWw7Ci0gICAgICAgIHMtPnV2YmxvY2tfYmFzZVsxXSA9IHMtPnV2YmxvY2tfYmFzZVswXSArIHNicyAqIGNocm9tYV9ibG9ja3MgKiBieXRlc3BlcnBpeGVsOwotICAgICAgICBzLT5lb2JfYmFzZSA9ICh1aW50OF90ICopIChzLT51dmJsb2NrX2Jhc2VbMV0gKyBzYnMgKiBjaHJvbWFfYmxvY2tzICogYnl0ZXNwZXJwaXhlbCk7Ci0gICAgICAgIHMtPnV2ZW9iX2Jhc2VbMF0gPSBzLT5lb2JfYmFzZSArIDE2ICogMTYgKiBzYnM7Ci0gICAgICAgIHMtPnV2ZW9iX2Jhc2VbMV0gPSBzLT51dmVvYl9iYXNlWzBdICsgY2hyb21hX2VvYnMgKiBzYnM7CisgICAgICAgIHRkLT51dmJsb2NrX2Jhc2VbMF0gPSB0ZC0+YmxvY2tfYmFzZSArIHNicyAqIDY0ICogNjQgKiBieXRlc3BlcnBpeGVsOworICAgICAgICB0ZC0+dXZibG9ja19iYXNlWzFdID0gdGQtPnV2YmxvY2tfYmFzZVswXSArIHNicyAqIGNocm9tYV9ibG9ja3MgKiBieXRlc3BlcnBpeGVsOworICAgICAgICB0ZC0+ZW9iX2Jhc2UgPSAodWludDhfdCAqKSAodGQtPnV2YmxvY2tfYmFzZVsxXSArIHNicyAqIGNocm9tYV9ibG9ja3MgKiBieXRlc3BlcnBpeGVsKTsKKyAgICAgICAgdGQtPnV2ZW9iX2Jhc2VbMF0gPSB0ZC0+ZW9iX2Jhc2UgKyAxNiAqIDE2ICogc2JzOworICAgICAgICB0ZC0+dXZlb2JfYmFzZVsxXSA9IHRkLT51dmVvYl9iYXNlWzBdICsgY2hyb21hX2VvYnMgKiBzYnM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcy0+Yl9iYXNlID0gYXZfbWFsbG9jKHNpemVvZihWUDlCbG9jaykpOwotICAgICAgICBzLT5ibG9ja19iYXNlID0gYXZfbWFsbG9jeigoNjQgKiA2NCArIDIgKiBjaHJvbWFfYmxvY2tzKSAqIGJ5dGVzcGVycGl4ZWwgKiBzaXplb2YoaW50MTZfdCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAqIDE2ICsgMiAqIGNocm9tYV9lb2JzKTsKLSAgICAgICAgaWYgKCFzLT5iX2Jhc2UgfHwgIXMtPmJsb2NrX2Jhc2UpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBzLT51dmJsb2NrX2Jhc2VbMF0gPSBzLT5ibG9ja19iYXNlICsgNjQgKiA2NCAqIGJ5dGVzcGVycGl4ZWw7Ci0gICAgICAgIHMtPnV2YmxvY2tfYmFzZVsxXSA9IHMtPnV2YmxvY2tfYmFzZVswXSArIGNocm9tYV9ibG9ja3MgKiBieXRlc3BlcnBpeGVsOwotICAgICAgICBzLT5lb2JfYmFzZSA9ICh1aW50OF90ICopIChzLT51dmJsb2NrX2Jhc2VbMV0gKyBjaHJvbWFfYmxvY2tzICogYnl0ZXNwZXJwaXhlbCk7Ci0gICAgICAgIHMtPnV2ZW9iX2Jhc2VbMF0gPSBzLT5lb2JfYmFzZSArIDE2ICogMTY7Ci0gICAgICAgIHMtPnV2ZW9iX2Jhc2VbMV0gPSBzLT51dmVvYl9iYXNlWzBdICsgY2hyb21hX2VvYnM7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzLT5hY3RpdmVfdGlsZV9jb2xzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzLT50ZFtpXS5iX2Jhc2UgJiYgcy0+dGRbaV0uYmxvY2tfYmFzZSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUocy0+dGRbaV0uYl9iYXNlKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHMtPnRkW2ldLmJsb2NrX2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5hY3RpdmVfdGlsZV9jb2xzOyBpKyspIHsKKyAgICAgICAgICAgIHMtPnRkW2ldLmJfYmFzZSA9IGF2X21hbGxvYyhzaXplb2YoVlA5QmxvY2spKTsKKyAgICAgICAgICAgIHMtPnRkW2ldLmJsb2NrX2Jhc2UgPSBhdl9tYWxsb2N6KCg2NCAqIDY0ICsgMiAqIGNocm9tYV9ibG9ja3MpICogYnl0ZXNwZXJwaXhlbCAqIHNpemVvZihpbnQxNl90KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAqIDE2ICsgMiAqIGNocm9tYV9lb2JzKTsKKyAgICAgICAgICAgIGlmICghcy0+dGRbaV0uYl9iYXNlIHx8ICFzLT50ZFtpXS5ibG9ja19iYXNlKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBzLT50ZFtpXS51dmJsb2NrX2Jhc2VbMF0gPSBzLT50ZFtpXS5ibG9ja19iYXNlICsgNjQgKiA2NCAqIGJ5dGVzcGVycGl4ZWw7CisgICAgICAgICAgICBzLT50ZFtpXS51dmJsb2NrX2Jhc2VbMV0gPSBzLT50ZFtpXS51dmJsb2NrX2Jhc2VbMF0gKyBjaHJvbWFfYmxvY2tzICogYnl0ZXNwZXJwaXhlbDsKKyAgICAgICAgICAgIHMtPnRkW2ldLmVvYl9iYXNlID0gKHVpbnQ4X3QgKikgKHMtPnRkW2ldLnV2YmxvY2tfYmFzZVsxXSArIGNocm9tYV9ibG9ja3MgKiBieXRlc3BlcnBpeGVsKTsKKyAgICAgICAgICAgIHMtPnRkW2ldLnV2ZW9iX2Jhc2VbMF0gPSBzLT50ZFtpXS5lb2JfYmFzZSArIDE2ICogMTY7CisgICAgICAgICAgICBzLT50ZFtpXS51dmVvYl9iYXNlWzFdID0gcy0+dGRbaV0udXZlb2JfYmFzZVswXSArIGNocm9tYV9lb2JzOworICAgICAgICB9CiAgICAgfQogICAgIHMtPmJsb2NrX2FsbG9jX3VzaW5nXzJwYXNzID0gcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS51c2VzXzJwYXNzOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKLS8vIGZvciBzb21lIHJlYXNvbiB0aGUgc2lnbiBiaXQgaXMgYXQgdGhlIGVuZCwgbm90IHRoZSBzdGFydCwgb2YgYSBiaXQgc2VxdWVuY2UKKy8vIFRoZSBzaWduIGJpdCBpcyBhdCB0aGUgZW5kLCBub3QgdGhlIHN0YXJ0LCBvZiBhIGJpdCBzZXF1ZW5jZQogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9zYml0c19pbnYoR2V0Qml0Q29udGV4dCAqZ2IsIGludCBuKQogewogICAgIGludCB2ID0gZ2V0X2JpdHMoZ2IsIG4pOwpAQCAtMzg2LDcgKzM0MywxMSBAQAogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaW52X3JlY2VudGVyX25vbm5lZyhpbnQgdiwgaW50IG0pCiB7Ci0gICAgcmV0dXJuIHYgPiAyICogbSA/IHYgOiB2ICYgMSA/IG0gLSAoKHYgKyAxKSA+PiAxKSA6IG0gKyAodiA+PiAxKTsKKyAgICBpZiAodiA+IDIgKiBtKQorICAgICAgICByZXR1cm4gdjsKKyAgICBpZiAodiAmIDEpCisgICAgICAgIHJldHVybiBtIC0gKCh2ICsgMSkgPj4gMSk7CisgICAgcmV0dXJuIG0gKyAodiA+PiAxKTsKIH0KIAogLy8gZGlmZmVyZW50aWFsIGZvcndhcmQgcHJvYmFiaWxpdHkgdXBkYXRlcwpAQCAtNDE3LDEzICszNzgsMTMgQEAKIAogICAgIC8qIFRoaXMgY29kZSBpcyB0cnlpbmcgdG8gZG8gYSBkaWZmZXJlbnRpYWwgcHJvYmFiaWxpdHkgdXBkYXRlLiBGb3IgYQogICAgICAqIGN1cnJlbnQgcHJvYmFiaWxpdHkgQSBpbiB0aGUgcmFuZ2UgWzEsIDI1NV0sIHRoZSBkaWZmZXJlbmNlIHRvIGEgbmV3Ci0gICAgICogcHJvYmFiaWxpdHkgb2YgYW55IHZhbHVlIGNhbiBiZSBleHByZXNzZWQgZGlmZmVyZW50aWFsbHkgYXMgMS1BLDI1NS1BCisgICAgICogcHJvYmFiaWxpdHkgb2YgYW55IHZhbHVlIGNhbiBiZSBleHByZXNzZWQgZGlmZmVyZW50aWFsbHkgYXMgMS1BLCAyNTUtQQogICAgICAqIHdoZXJlIHNvbWUgcGFydCBvZiB0aGlzIChhYnNvbHV0ZSByYW5nZSkgZXhpc3RzIGJvdGggaW4gcG9zaXRpdmUgYXMKICAgICAgKiB3ZWxsIGFzIHRoZSBuZWdhdGl2ZSBwYXJ0LCB3aGVyZWFzIGFub3RoZXIgcGFydCBvbmx5IGV4aXN0cyBpbiBvbmUKICAgICAgKiBoYWxmLiBXZSdyZSB0cnlpbmcgdG8gY29kZSB0aGlzIHNoYXJlZCBwYXJ0IGRpZmZlcmVudGlhbGx5LCBpLmUuCiAgICAgICogdGltZXMgdHdvIHdoZXJlIHRoZSB2YWx1ZSBvZiB0aGUgbG93ZXN0IGJpdCBzcGVjaWZpZXMgdGhlIHNpZ24sIGFuZAogICAgICAqIHRoZSBzaW5nbGUgcGFydCBpcyB0aGVuIGNvZGVkIG9uIHRvcCBvZiB0aGlzLiBUaGlzIGFic29sdXRlIGRpZmZlcmVuY2UKLSAgICAgKiB0aGVuIGFnYWluIGhhcyBhIHZhbHVlIG9mIFswLDI1NF0sIGJ1dCBhIGJpZ2dlciB2YWx1ZSBpbiB0aGlzIHJhbmdlCisgICAgICogdGhlbiBhZ2FpbiBoYXMgYSB2YWx1ZSBvZiBbMCwgMjU0XSwgYnV0IGEgYmlnZ2VyIHZhbHVlIGluIHRoaXMgcmFuZ2UKICAgICAgKiBpbmRpY2F0ZXMgdGhhdCB3ZSdyZSBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWUgQSwgc28gd2UKICAgICAgKiBjYW4gY29kZSB0aGlzIGFzIGEgVkxDIGNvZGUsIHNpbmNlIGhpZ2hlciB2YWx1ZXMgYXJlIGluY3JlYXNpbmdseQogICAgICAqIHVubGlrZWx5LiBUaGUgZmlyc3QgMjAgdmFsdWVzIGluIGludl9tYXBfdGFibGVbXSBhbGxvdyAnY2hlYXAsIHJvdWdoJwpAQCAtNDQ4LDM0ICs0MDksMzQgQEAKICAgICAgICAgICAgICAgICAgICAgMjU1IC0gaW52X3JlY2VudGVyX25vbm5lZyhpbnZfbWFwX3RhYmxlW2RdLCAyNTUgLSBwKTsKIH0KIAotc3RhdGljIGludCByZWFkX2NvbG9yc3BhY2VfZGV0YWlscyhBVkNvZGVjQ29udGV4dCAqY3R4KQorc3RhdGljIGludCByZWFkX2NvbG9yc3BhY2VfZGV0YWlscyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZDb2xvclNwYWNlIGNvbG9yc3BhY2VzWzhdID0gewogICAgICAgICBBVkNPTF9TUENfVU5TUEVDSUZJRUQsIEFWQ09MX1NQQ19CVDQ3MEJHLCBBVkNPTF9TUENfQlQ3MDksIEFWQ09MX1NQQ19TTVBURTE3ME0sCiAgICAgICAgIEFWQ09MX1NQQ19TTVBURTI0ME0sIEFWQ09MX1NQQ19CVDIwMjBfTkNMLCBBVkNPTF9TUENfUkVTRVJWRUQsIEFWQ09MX1NQQ19SR0IsCiAgICAgfTsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IGJpdHMgPSBjdHgtPnByb2ZpbGUgPD0gMSA/IDAgOiAxICsgZ2V0X2JpdHMxKCZzLT5nYik7IC8vIDA6OCwgMToxMCwgMjoxMgorICAgIFZQOUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCBiaXRzID0gYXZjdHgtPnByb2ZpbGUgPD0gMSA/IDAgOiAxICsgZ2V0X2JpdHMxKCZzLT5nYik7IC8vIDA6OCwgMToxMCwgMjoxMgogCiAgICAgcy0+YnBwX2luZGV4ID0gYml0czsKLSAgICBzLT5icHAgPSA4ICsgYml0cyAqIDI7Ci0gICAgcy0+Ynl0ZXNwZXJwaXhlbCA9ICg3ICsgcy0+YnBwKSA+PiAzOwotICAgIGN0eC0+Y29sb3JzcGFjZSA9IGNvbG9yc3BhY2VzW2dldF9iaXRzKCZzLT5nYiwgMyldOwotICAgIGlmIChjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX1JHQikgeyAvLyBSR0IgPSBwcm9maWxlIDEKKyAgICBzLT5zLmguYnBwID0gOCArIGJpdHMgKiAyOworICAgIHMtPmJ5dGVzcGVycGl4ZWwgPSAoNyArIHMtPnMuaC5icHApID4+IDM7CisgICAgYXZjdHgtPmNvbG9yc3BhY2UgPSBjb2xvcnNwYWNlc1tnZXRfYml0cygmcy0+Z2IsIDMpXTsKKyAgICBpZiAoYXZjdHgtPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX1JHQikgeyAvLyBSR0IgPSBwcm9maWxlIDEKICAgICAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10X3JnYlszXSA9IHsKICAgICAgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJQMTAsIEFWX1BJWF9GTVRfR0JSUDEyCiAgICAgICAgIH07CiAgICAgICAgIHMtPnNzX2ggPSBzLT5zc192ID0gMDsKLSAgICAgICAgY3R4LT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CiAgICAgICAgIHMtPnBpeF9mbXQgPSBwaXhfZm10X3JnYltiaXRzXTsKLSAgICAgICAgaWYgKGN0eC0+cHJvZmlsZSAmIDEpIHsKKyAgICAgICAgaWYgKGF2Y3R4LT5wcm9maWxlICYgMSkgewogICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUmVzZXJ2ZWQgYml0IHNldCBpbiBSR0JcbiIpOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUmVzZXJ2ZWQgYml0IHNldCBpbiBSR0JcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUkdCIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZmlsZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICBjdHgtPnByb2ZpbGUpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJSR0Igbm90IHN1cHBvcnRlZCBpbiBwcm9maWxlICVkXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTQ4NywxOCArNDQ4LDE4IEBACiAgICAgICAgICAgICB7IHsgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyIH0sCiAgICAgICAgICAgICAgIHsgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsIEFWX1BJWF9GTVRfWVVWNDIwUDEyIH0gfQogICAgICAgICB9OwotICAgICAgICBjdHgtPmNvbG9yX3JhbmdlID0gZ2V0X2JpdHMxKCZzLT5nYikgPyBBVkNPTF9SQU5HRV9KUEVHIDogQVZDT0xfUkFOR0VfTVBFRzsKLSAgICAgICAgaWYgKGN0eC0+cHJvZmlsZSAmIDEpIHsKKyAgICAgICAgYXZjdHgtPmNvbG9yX3JhbmdlID0gZ2V0X2JpdHMxKCZzLT5nYikgPyBBVkNPTF9SQU5HRV9KUEVHIDogQVZDT0xfUkFOR0VfTVBFRzsKKyAgICAgICAgaWYgKGF2Y3R4LT5wcm9maWxlICYgMSkgewogICAgICAgICAgICAgcy0+c3NfaCA9IGdldF9iaXRzMSgmcy0+Z2IpOwogICAgICAgICAgICAgcy0+c3NfdiA9IGdldF9iaXRzMSgmcy0+Z2IpOwogICAgICAgICAgICAgcy0+cGl4X2ZtdCA9IHBpeF9mbXRfZm9yX3NzW2JpdHNdW3MtPnNzX3ZdW3MtPnNzX2hdOwogICAgICAgICAgICAgaWYgKHMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiWVVWIDQ6MjowIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZmlsZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wcm9maWxlKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIllVViA0OjI6MCBub3Qgc3VwcG9ydGVkIGluIHByb2ZpbGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5wcm9maWxlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0X2JpdHMxKCZzLT5nYikpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJQcm9maWxlICVkIGNvbG9yIGRldGFpbHMgcmVzZXJ2ZWQgYml0IHNldFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wcm9maWxlKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlByb2ZpbGUgJWQgY29sb3IgZGV0YWlscyByZXNlcnZlZCBiaXQgc2V0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+cHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC01MTAsNDggKzQ3MSw1MSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY29kZV9mcmFtZV9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmN0eCwKK3N0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lX2hlYWRlcihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IHNpemUsIGludCAqcmVmKQogewotICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKLSAgICBpbnQgYywgaSwgaiwgaywgbCwgbSwgbiwgdywgaCwgbWF4LCBzaXplMiwgcmVzLCBzaGFycDsKKyAgICBWUDlDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgYywgaSwgaiwgaywgbCwgbSwgbiwgdywgaCwgbWF4LCBzaXplMiwgcmV0LCBzaGFycDsKICAgICBpbnQgbGFzdF9pbnZpc2libGU7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YTI7CiAKICAgICAvKiBnZW5lcmFsIGhlYWRlciAqLwotICAgIGlmICgocmVzID0gaW5pdF9nZXRfYml0czgoJnMtPmdiLCBkYXRhLCBzaXplKSkgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGJpdHN0cmVhbSByZWFkZXJcbiIpOwotICAgICAgICByZXR1cm4gcmVzOworICAgIGlmICgocmV0ID0gaW5pdF9nZXRfYml0czgoJnMtPmdiLCBkYXRhLCBzaXplKSkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgYml0c3RyZWFtIHJlYWRlclxuIik7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIGlmIChnZXRfYml0cygmcy0+Z2IsIDIpICE9IDB4MikgeyAvLyBmcmFtZSBtYXJrZXIKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSBtYXJrZXJcbiIpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgbWFya2VyXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIGN0eC0+cHJvZmlsZSAgPSBnZXRfYml0czEoJnMtPmdiKTsKLSAgICBjdHgtPnByb2ZpbGUgfD0gZ2V0X2JpdHMxKCZzLT5nYikgPDwgMTsKLSAgICBpZiAoY3R4LT5wcm9maWxlID09IDMpIGN0eC0+cHJvZmlsZSArPSBnZXRfYml0czEoJnMtPmdiKTsKLSAgICBpZiAoY3R4LT5wcm9maWxlID4gMykgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJQcm9maWxlICVkIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLCBjdHgtPnByb2ZpbGUpOworICAgIGF2Y3R4LT5wcm9maWxlICA9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIGF2Y3R4LT5wcm9maWxlIHw9IGdldF9iaXRzMSgmcy0+Z2IpIDw8IDE7CisgICAgaWYgKGF2Y3R4LT5wcm9maWxlID09IDMpIGF2Y3R4LT5wcm9maWxlICs9IGdldF9iaXRzMSgmcy0+Z2IpOworICAgIGlmIChhdmN0eC0+cHJvZmlsZSA+IDMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQcm9maWxlICVkIGlzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iLCBhdmN0eC0+cHJvZmlsZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KLSAgICBzLT5zLmgucHJvZmlsZSA9IGN0eC0+cHJvZmlsZTsKKyAgICBzLT5zLmgucHJvZmlsZSA9IGF2Y3R4LT5wcm9maWxlOwogICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgewogICAgICAgICAqcmVmID0gZ2V0X2JpdHMoJnMtPmdiLCAzKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQorCiAgICAgcy0+bGFzdF9rZXlmcmFtZSAgPSBzLT5zLmgua2V5ZnJhbWU7Ci0gICAgcy0+cy5oLmtleWZyYW1lICAgICA9ICFnZXRfYml0czEoJnMtPmdiKTsKLSAgICBsYXN0X2ludmlzaWJsZSAgICA9IHMtPnMuaC5pbnZpc2libGU7Ci0gICAgcy0+cy5oLmludmlzaWJsZSAgICA9ICFnZXRfYml0czEoJnMtPmdiKTsKLSAgICBzLT5zLmguZXJyb3JyZXMgICAgID0gZ2V0X2JpdHMxKCZzLT5nYik7CisgICAgcy0+cy5oLmtleWZyYW1lICAgPSAhZ2V0X2JpdHMxKCZzLT5nYik7CisKKyAgICBsYXN0X2ludmlzaWJsZSAgID0gcy0+cy5oLmludmlzaWJsZTsKKyAgICBzLT5zLmguaW52aXNpYmxlID0gIWdldF9iaXRzMSgmcy0+Z2IpOworICAgIHMtPnMuaC5lcnJvcnJlcyAgPSBnZXRfYml0czEoJnMtPmdiKTsKICAgICBzLT5zLmgudXNlX2xhc3RfZnJhbWVfbXZzID0gIXMtPnMuaC5lcnJvcnJlcyAmJiAhbGFzdF9pbnZpc2libGU7CisKICAgICBpZiAocy0+cy5oLmtleWZyYW1lKSB7CiAgICAgICAgIGlmIChnZXRfYml0c19sb25nKCZzLT5nYiwgMjQpICE9IFZQOV9TWU5DQ09ERSkgeyAvLyBzeW5jY29kZQotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzeW5jIGNvZGVcbiIpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN5bmMgY29kZVxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQotICAgICAgICBpZiAoKHJlcyA9IHJlYWRfY29sb3JzcGFjZV9kZXRhaWxzKGN0eCkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIGlmICgocmV0ID0gcmVhZF9jb2xvcnNwYWNlX2RldGFpbHMoYXZjdHgpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAvLyBmb3IgcHJvZmlsZSAxLCBoZXJlIGZvbGxvd3MgdGhlIHN1YnNhbXBsaW5nIGJpdHMKICAgICAgICAgcy0+cy5oLnJlZnJlc2hyZWZtYXNrID0gMHhmZjsKICAgICAgICAgdyA9IGdldF9iaXRzKCZzLT5nYiwgMTYpICsgMTsKQEAgLTU1OSwyNCArNTIzLDI0IEBACiAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgLy8gZGlzcGxheSBzaXplCiAgICAgICAgICAgICBza2lwX2JpdHMoJnMtPmdiLCAzMik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcy0+cy5oLmludHJhb25seSAgPSBzLT5zLmguaW52aXNpYmxlID8gZ2V0X2JpdHMxKCZzLT5nYikgOiAwOwotICAgICAgICBzLT5zLmgucmVzZXRjdHggICA9IHMtPnMuaC5lcnJvcnJlcyA/IDAgOiBnZXRfYml0cygmcy0+Z2IsIDIpOworICAgICAgICBzLT5zLmguaW50cmFvbmx5ID0gcy0+cy5oLmludmlzaWJsZSA/IGdldF9iaXRzMSgmcy0+Z2IpIDogMDsKKyAgICAgICAgcy0+cy5oLnJlc2V0Y3R4ICA9IHMtPnMuaC5lcnJvcnJlcyA/IDAgOiBnZXRfYml0cygmcy0+Z2IsIDIpOwogICAgICAgICBpZiAocy0+cy5oLmludHJhb25seSkgewogICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xvbmcoJnMtPmdiLCAyNCkgIT0gVlA5X1NZTkNDT0RFKSB7IC8vIHN5bmNjb2RlCi0gICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzeW5jIGNvZGVcbiIpOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzeW5jIGNvZGVcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGN0eC0+cHJvZmlsZSA+PSAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXMgPSByZWFkX2NvbG9yc3BhY2VfZGV0YWlscyhjdHgpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBpZiAoYXZjdHgtPnByb2ZpbGUgPj0gMSkgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcmVhZF9jb2xvcnNwYWNlX2RldGFpbHMoYXZjdHgpKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHMtPnNzX2ggPSBzLT5zc192ID0gMTsKLSAgICAgICAgICAgICAgICBzLT5icHAgPSA4OworICAgICAgICAgICAgICAgIHMtPnMuaC5icHAgPSA4OwogICAgICAgICAgICAgICAgIHMtPmJwcF9pbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgcy0+Ynl0ZXNwZXJwaXhlbCA9IDE7CiAgICAgICAgICAgICAgICAgcy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKLSAgICAgICAgICAgICAgICBjdHgtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ0NzBCRzsKLSAgICAgICAgICAgICAgICBjdHgtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKKyAgICAgICAgICAgICAgICBhdmN0eC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOworICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX01QRUc7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzLT5zLmgucmVmcmVzaHJlZm1hc2sgPSBnZXRfYml0cygmcy0+Z2IsIDgpOwogICAgICAgICAgICAgdyA9IGdldF9iaXRzKCZzLT5nYiwgMTYpICsgMTsKQEAgLTU5NCw3ICs1NTgsNyBAQAogICAgICAgICAgICAgaWYgKCFzLT5zLnJlZnNbcy0+cy5oLnJlZmlkeFswXV0uZi0+YnVmWzBdIHx8CiAgICAgICAgICAgICAgICAgIXMtPnMucmVmc1tzLT5zLmgucmVmaWR4WzFdXS5mLT5idWZbMF0gfHwKICAgICAgICAgICAgICAgICAhcy0+cy5yZWZzW3MtPnMuaC5yZWZpZHhbMl1dLmYtPmJ1ZlswXSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBhbGwgcmVmZXJlbmNlcyBhcmUgYXZhaWxhYmxlXG4iKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBhbGwgcmVmZXJlbmNlcyBhcmUgYXZhaWxhYmxlXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgewpAQCAtNjQyLDYgKzYwNiw4IEBACiAgICAgcy0+cy5oLnJlZnJlc2hjdHggICA9IHMtPnMuaC5lcnJvcnJlcyA/IDAgOiBnZXRfYml0czEoJnMtPmdiKTsKICAgICBzLT5zLmgucGFyYWxsZWxtb2RlID0gcy0+cy5oLmVycm9ycmVzID8gMSA6IGdldF9iaXRzMSgmcy0+Z2IpOwogICAgIHMtPnMuaC5mcmFtZWN0eGlkICAgPSBjID0gZ2V0X2JpdHMoJnMtPmdiLCAyKTsKKyAgICBpZiAocy0+cy5oLmtleWZyYW1lIHx8IHMtPnMuaC5pbnRyYW9ubHkpCisgICAgICAgIHMtPnMuaC5mcmFtZWN0eGlkID0gMDsgLy8gQlVHOiBsaWJ2cHggaWdub3JlcyB0aGlzIGZpZWxkIGluIGtleWZyYW1lcwogCiAgICAgLyogbG9vcGZpbHRlciBoZWFkZXIgZGF0YSAqLwogICAgIGlmIChzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmVycm9ycmVzIHx8IHMtPnMuaC5pbnRyYW9ubHkpIHsKQEAgLTY1OCw4ICs2MjQsMjAgQEAKICAgICBzaGFycCA9IGdldF9iaXRzKCZzLT5nYiwgMyk7CiAgICAgLy8gaWYgc2hhcnBuZXNzIGNoYW5nZWQsIHJlaW5pdCBsaW0vbWJsaW0gTFVUcy4gaWYgaXQgZGlkbid0IGNoYW5nZSwga2VlcAogICAgIC8vIHRoZSBvbGQgY2FjaGUgdmFsdWVzIHNpbmNlIHRoZXkgYXJlIHN0aWxsIHZhbGlkCi0gICAgaWYgKHMtPnMuaC5maWx0ZXIuc2hhcnBuZXNzICE9IHNoYXJwKQotICAgICAgICBtZW1zZXQocy0+ZmlsdGVyX2x1dC5saW1fbHV0LCAwLCBzaXplb2Yocy0+ZmlsdGVyX2x1dC5saW1fbHV0KSk7CisgICAgaWYgKHMtPnMuaC5maWx0ZXIuc2hhcnBuZXNzICE9IHNoYXJwKSB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gNjM7IGkrKykgeworICAgICAgICAgICAgaW50IGxpbWl0ID0gaTsKKworICAgICAgICAgICAgaWYgKHNoYXJwID4gMCkgeworICAgICAgICAgICAgICAgIGxpbWl0ID4+PSAoc2hhcnAgKyAzKSA+PiAyOworICAgICAgICAgICAgICAgIGxpbWl0ID0gRkZNSU4obGltaXQsIDkgLSBzaGFycCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW1pdCA9IEZGTUFYKGxpbWl0LCAxKTsKKworICAgICAgICAgICAgcy0+ZmlsdGVyX2x1dC5saW1fbHV0W2ldID0gbGltaXQ7CisgICAgICAgICAgICBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtpXSA9IDIgKiAoaSArIDIpICsgbGltaXQ7CisgICAgICAgIH0KKyAgICB9CiAgICAgcy0+cy5oLmZpbHRlci5zaGFycG5lc3MgPSBzaGFycDsKICAgICBpZiAoKHMtPnMuaC5sZl9kZWx0YS5lbmFibGVkID0gZ2V0X2JpdHMxKCZzLT5nYikpKSB7CiAgICAgICAgIGlmICgocy0+cy5oLmxmX2RlbHRhLnVwZGF0ZWQgPSBnZXRfYml0czEoJnMtPmdiKSkpIHsKQEAgLTY4MCw3ICs2NTgsNyBAQAogICAgIHMtPnMuaC5sb3NzbGVzcyAgICA9IHMtPnMuaC55YWNfcWkgPT0gMCAmJiBzLT5zLmgueWRjX3FkZWx0YSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHMtPnMuaC51dmRjX3FkZWx0YSA9PSAwICYmIHMtPnMuaC51dmFjX3FkZWx0YSA9PSAwOwogICAgIGlmIChzLT5zLmgubG9zc2xlc3MpCi0gICAgICAgIGN0eC0+cHJvcGVydGllcyB8PSBGRl9DT0RFQ19QUk9QRVJUWV9MT1NTTEVTUzsKKyAgICAgICAgYXZjdHgtPnByb3BlcnRpZXMgfD0gRkZfQ09ERUNfUFJPUEVSVFlfTE9TU0xFU1M7CiAKICAgICAvKiBzZWdtZW50YXRpb24gaGVhZGVyIGluZm8gKi8KICAgICBpZiAoKHMtPnMuaC5zZWdtZW50YXRpb24uZW5hYmxlZCA9IGdldF9iaXRzMSgmcy0+Z2IpKSkgewpAQCAtNjg4LDExICs2NjYsMTAgQEAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspCiAgICAgICAgICAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5wcm9iW2ldID0gZ2V0X2JpdHMxKCZzLT5nYikgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHMoJnMtPmdiLCA4KSA6IDI1NTsKLSAgICAgICAgICAgIGlmICgocy0+cy5oLnNlZ21lbnRhdGlvbi50ZW1wb3JhbCA9IGdldF9iaXRzMSgmcy0+Z2IpKSkgeworICAgICAgICAgICAgaWYgKChzLT5zLmguc2VnbWVudGF0aW9uLnRlbXBvcmFsID0gZ2V0X2JpdHMxKCZzLT5nYikpKQogICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgICAgICAgICAgICAgICAgIHMtPnMuaC5zZWdtZW50YXRpb24ucHJlZF9wcm9iW2ldID0gZ2V0X2JpdHMxKCZzLT5nYikgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0cygmcy0+Z2IsIDgpIDogMjU1OwotICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CkBAIC03MjYsMTAgKzcwMywxMCBAQAogICAgICAgICBxdXZhYyA9IGF2X2NsaXBfdWludHAyKHF5YWMgKyBzLT5zLmgudXZhY19xZGVsdGEsIDgpOwogICAgICAgICBxeWFjICA9IGF2X2NsaXBfdWludHAyKHF5YWMsIDgpOwogCi0gICAgICAgIHMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtpXS5xbXVsWzBdWzBdID0gdnA5X2RjX3Fsb29rdXBbcy0+YnBwX2luZGV4XVtxeWRjXTsKLSAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLnFtdWxbMF1bMV0gPSB2cDlfYWNfcWxvb2t1cFtzLT5icHBfaW5kZXhdW3F5YWNdOwotICAgICAgICBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbaV0ucW11bFsxXVswXSA9IHZwOV9kY19xbG9va3VwW3MtPmJwcF9pbmRleF1bcXV2ZGNdOwotICAgICAgICBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbaV0ucW11bFsxXVsxXSA9IHZwOV9hY19xbG9va3VwW3MtPmJwcF9pbmRleF1bcXV2YWNdOworICAgICAgICBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbaV0ucW11bFswXVswXSA9IGZmX3ZwOV9kY19xbG9va3VwW3MtPmJwcF9pbmRleF1bcXlkY107CisgICAgICAgIHMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtpXS5xbXVsWzBdWzFdID0gZmZfdnA5X2FjX3Fsb29rdXBbcy0+YnBwX2luZGV4XVtxeWFjXTsKKyAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLnFtdWxbMV1bMF0gPSBmZl92cDlfZGNfcWxvb2t1cFtzLT5icHBfaW5kZXhdW3F1dmRjXTsKKyAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLnFtdWxbMV1bMV0gPSBmZl92cDlfYWNfcWxvb2t1cFtzLT5icHBfaW5kZXhdW3F1dmFjXTsKIAogICAgICAgICBzaCA9IHMtPnMuaC5maWx0ZXIubGV2ZWwgPj0gMzI7CiAgICAgICAgIGlmIChzLT5zLmguc2VnbWVudGF0aW9uLmVuYWJsZWQgJiYgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLmxmX2VuYWJsZWQpIHsKQEAgLTc0Myw3ICs3MjAsNyBAQAogICAgICAgICBpZiAocy0+cy5oLmxmX2RlbHRhLmVuYWJsZWQpIHsKICAgICAgICAgICAgIHMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtpXS5sZmx2bFswXVswXSA9CiAgICAgICAgICAgICBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbaV0ubGZsdmxbMF1bMV0gPQotICAgICAgICAgICAgICAgIGF2X2NsaXBfdWludHAyKGxmbHZsICsgKHMtPnMuaC5sZl9kZWx0YS5yZWZbMF0gPDwgc2gpLCA2KTsKKyAgICAgICAgICAgICAgICBhdl9jbGlwX3VpbnRwMihsZmx2bCArIChzLT5zLmgubGZfZGVsdGEucmVmWzBdICogKDEgPDwgc2gpKSwgNik7CiAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgNDsgaisrKSB7CiAgICAgICAgICAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ldLmxmbHZsW2pdWzBdID0KICAgICAgICAgICAgICAgICAgICAgYXZfY2xpcF91aW50cDIobGZsdmwgKyAoKHMtPnMuaC5sZl9kZWx0YS5yZWZbal0gKwpAQCAtNzU5LDEwICs3MzYsMTAgQEAKICAgICB9CiAKICAgICAvKiB0aWxpbmcgaW5mbyAqLwotICAgIGlmICgocmVzID0gdXBkYXRlX3NpemUoY3R4LCB3LCBoKSkgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIgZm9yICVkeCVkIEAgJWRcbiIsCisgICAgaWYgKChyZXQgPSB1cGRhdGVfc2l6ZShhdmN0eCwgdywgaCkpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIgZm9yICVkeCVkIEAgJWRcbiIsCiAgICAgICAgICAgICAgICB3LCBoLCBzLT5waXhfZm10KTsKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgZm9yIChzLT5zLmgudGlsaW5nLmxvZzJfdGlsZV9jb2xzID0gMDsKICAgICAgICAgIHMtPnNiX2NvbHMgPiAoNjQgPDwgcy0+cy5oLnRpbGluZy5sb2cyX3RpbGVfY29scyk7CkBAIC03NzgsMTIgKzc1NSwzNiBAQAogICAgIHMtPnMuaC50aWxpbmcubG9nMl90aWxlX3Jvd3MgPSBkZWNvZGUwMTIoJnMtPmdiKTsKICAgICBzLT5zLmgudGlsaW5nLnRpbGVfcm93cyA9IDEgPDwgcy0+cy5oLnRpbGluZy5sb2cyX3RpbGVfcm93czsKICAgICBpZiAocy0+cy5oLnRpbGluZy50aWxlX2NvbHMgIT0gKDEgPDwgcy0+cy5oLnRpbGluZy5sb2cyX3RpbGVfY29scykpIHsKKyAgICAgICAgaW50IG5fcmFuZ2VfY29kZXJzOworICAgICAgICBWUDU2UmFuZ2VDb2RlciAqcmM7CisKKyAgICAgICAgaWYgKHMtPnRkKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YWN0aXZlX3RpbGVfY29sczsgaSsrKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShzLT50ZFtpXS5iX2Jhc2UpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUocy0+dGRbaV0uYmxvY2tfYmFzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mcmVlKHMtPnRkKTsKKyAgICAgICAgfQorCiAgICAgICAgIHMtPnMuaC50aWxpbmcudGlsZV9jb2xzID0gMSA8PCBzLT5zLmgudGlsaW5nLmxvZzJfdGlsZV9jb2xzOwotICAgICAgICBzLT5jX2IgPSBhdl9mYXN0X3JlYWxsb2Mocy0+Y19iLCAmcy0+Y19iX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVlA1NlJhbmdlQ29kZXIpICogcy0+cy5oLnRpbGluZy50aWxlX2NvbHMpOwotICAgICAgICBpZiAoIXMtPmNfYikgewotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUmFuIG91dCBvZiBtZW1vcnkgZHVyaW5nIHJhbmdlIGNvZGVyIGluaXRcbiIpOworICAgICAgICB2cDlfZnJlZV9lbnRyaWVzKGF2Y3R4KTsKKyAgICAgICAgcy0+YWN0aXZlX3RpbGVfY29scyA9IGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPT0gRkZfVEhSRUFEX1NMSUNFID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnMuaC50aWxpbmcudGlsZV9jb2xzIDogMTsKKyAgICAgICAgdnA5X2FsbG9jX2VudHJpZXMoYXZjdHgsIHMtPnNiX3Jvd3MpOworICAgICAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfU0xJQ0UpIHsKKyAgICAgICAgICAgIG5fcmFuZ2VfY29kZXJzID0gNDsgLy8gbWF4X3RpbGVfcm93cworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbl9yYW5nZV9jb2RlcnMgPSBzLT5zLmgudGlsaW5nLnRpbGVfY29sczsKKyAgICAgICAgfQorICAgICAgICBzLT50ZCA9IGF2X21hbGxvY3pfYXJyYXkocy0+YWN0aXZlX3RpbGVfY29scywgc2l6ZW9mKFZQOVRpbGVEYXRhKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3JhbmdlX2NvZGVycyAqIHNpemVvZihWUDU2UmFuZ2VDb2RlcikpOworICAgICAgICBpZiAoIXMtPnRkKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcmMgPSAoVlA1NlJhbmdlQ29kZXIgKikgJnMtPnRkW3MtPmFjdGl2ZV90aWxlX2NvbHNdOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YWN0aXZlX3RpbGVfY29sczsgaSsrKSB7CisgICAgICAgICAgICBzLT50ZFtpXS5zID0gczsKKyAgICAgICAgICAgIHMtPnRkW2ldLmNfYiA9IHJjOworICAgICAgICAgICAgcmMgKz0gbl9yYW5nZV9jb2RlcnM7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc5MywxNyArNzk0LDE3IEBACiAgICAgICAgICAgICBBVkZyYW1lICpyZWYgPSBzLT5zLnJlZnNbcy0+cy5oLnJlZmlkeFtpXV0uZjsKICAgICAgICAgICAgIGludCByZWZ3ID0gcmVmLT53aWR0aCwgcmVmaCA9IHJlZi0+aGVpZ2h0OwogCi0gICAgICAgICAgICBpZiAocmVmLT5mb3JtYXQgIT0gY3R4LT5waXhfZm10KSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgaWYgKHJlZi0+Zm9ybWF0ICE9IGF2Y3R4LT5waXhfZm10KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJSZWYgcGl4Zm10ICglcykgZGlkIG5vdCBtYXRjaCBjdXJyZW50IGZyYW1lICglcykiLAogICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHJlZi0+Zm9ybWF0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjdHgtPnBpeF9mbXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShhdmN0eC0+cGl4X2ZtdCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfSBlbHNlIGlmIChyZWZ3ID09IHcgJiYgcmVmaCA9PSBoKSB7CiAgICAgICAgICAgICAgICAgcy0+bXZzY2FsZVtpXVswXSA9IHMtPm12c2NhbGVbaV1bMV0gPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAodyAqIDIgPCByZWZ3IHx8IGggKiAyIDwgcmVmaCB8fCB3ID4gMTYgKiByZWZ3IHx8IGggPiAxNiAqIHJlZmgpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHJlZiBmcmFtZSBkaW1lbnNpb25zICVkeCVkIGZvciBmcmFtZSBzaXplICVkeCVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmdywgcmVmaCwgdywgaCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtODE4LDE5ICs4MTksMTkgQEAKIAogICAgIGlmIChzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmVycm9ycmVzIHx8IChzLT5zLmguaW50cmFvbmx5ICYmIHMtPnMuaC5yZXNldGN0eCA9PSAzKSkgewogICAgICAgICBzLT5wcm9iX2N0eFswXS5wID0gcy0+cHJvYl9jdHhbMV0ucCA9IHMtPnByb2JfY3R4WzJdLnAgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYl9jdHhbM10ucCA9IHZwOV9kZWZhdWx0X3Byb2JzOwotICAgICAgICBtZW1jcHkocy0+cHJvYl9jdHhbMF0uY29lZiwgdnA5X2RlZmF1bHRfY29lZl9wcm9icywKLSAgICAgICAgICAgICAgIHNpemVvZih2cDlfZGVmYXVsdF9jb2VmX3Byb2JzKSk7Ci0gICAgICAgIG1lbWNweShzLT5wcm9iX2N0eFsxXS5jb2VmLCB2cDlfZGVmYXVsdF9jb2VmX3Byb2JzLAotICAgICAgICAgICAgICAgc2l6ZW9mKHZwOV9kZWZhdWx0X2NvZWZfcHJvYnMpKTsKLSAgICAgICAgbWVtY3B5KHMtPnByb2JfY3R4WzJdLmNvZWYsIHZwOV9kZWZhdWx0X2NvZWZfcHJvYnMsCi0gICAgICAgICAgICAgICBzaXplb2YodnA5X2RlZmF1bHRfY29lZl9wcm9icykpOwotICAgICAgICBtZW1jcHkocy0+cHJvYl9jdHhbM10uY29lZiwgdnA5X2RlZmF1bHRfY29lZl9wcm9icywKLSAgICAgICAgICAgICAgIHNpemVvZih2cDlfZGVmYXVsdF9jb2VmX3Byb2JzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iX2N0eFszXS5wID0gZmZfdnA5X2RlZmF1bHRfcHJvYnM7CisgICAgICAgIG1lbWNweShzLT5wcm9iX2N0eFswXS5jb2VmLCBmZl92cDlfZGVmYXVsdF9jb2VmX3Byb2JzLAorICAgICAgICAgICAgICAgc2l6ZW9mKGZmX3ZwOV9kZWZhdWx0X2NvZWZfcHJvYnMpKTsKKyAgICAgICAgbWVtY3B5KHMtPnByb2JfY3R4WzFdLmNvZWYsIGZmX3ZwOV9kZWZhdWx0X2NvZWZfcHJvYnMsCisgICAgICAgICAgICAgICBzaXplb2YoZmZfdnA5X2RlZmF1bHRfY29lZl9wcm9icykpOworICAgICAgICBtZW1jcHkocy0+cHJvYl9jdHhbMl0uY29lZiwgZmZfdnA5X2RlZmF1bHRfY29lZl9wcm9icywKKyAgICAgICAgICAgICAgIHNpemVvZihmZl92cDlfZGVmYXVsdF9jb2VmX3Byb2JzKSk7CisgICAgICAgIG1lbWNweShzLT5wcm9iX2N0eFszXS5jb2VmLCBmZl92cDlfZGVmYXVsdF9jb2VmX3Byb2JzLAorICAgICAgICAgICAgICAgc2l6ZW9mKGZmX3ZwOV9kZWZhdWx0X2NvZWZfcHJvYnMpKTsKICAgICB9IGVsc2UgaWYgKHMtPnMuaC5pbnRyYW9ubHkgJiYgcy0+cy5oLnJlc2V0Y3R4ID09IDIpIHsKLSAgICAgICAgcy0+cHJvYl9jdHhbY10ucCA9IHZwOV9kZWZhdWx0X3Byb2JzOwotICAgICAgICBtZW1jcHkocy0+cHJvYl9jdHhbY10uY29lZiwgdnA5X2RlZmF1bHRfY29lZl9wcm9icywKLSAgICAgICAgICAgICAgIHNpemVvZih2cDlfZGVmYXVsdF9jb2VmX3Byb2JzKSk7CisgICAgICAgIHMtPnByb2JfY3R4W2NdLnAgPSBmZl92cDlfZGVmYXVsdF9wcm9iczsKKyAgICAgICAgbWVtY3B5KHMtPnByb2JfY3R4W2NdLmNvZWYsIGZmX3ZwOV9kZWZhdWx0X2NvZWZfcHJvYnMsCisgICAgICAgICAgICAgICBzaXplb2YoZmZfdnA5X2RlZmF1bHRfY29lZl9wcm9icykpOwogICAgIH0KIAogICAgIC8vIG5leHQgMTYgYml0cyBpcyBzaXplIG9mIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgKGFyaXRoLWNvZGVkKQpAQCAtODM5LDI0ICs4NDAsMzAgQEAKIAogICAgIGRhdGEyID0gYWxpZ25fZ2V0X2JpdHMoJnMtPmdiKTsKICAgICBpZiAoc2l6ZTIgPiBzaXplIC0gKGRhdGEyIC0gZGF0YSkpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb21wcmVzc2VkIGhlYWRlciBzaXplXG4iKTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvbXByZXNzZWQgaGVhZGVyIHNpemVcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9Ci0gICAgZmZfdnA1Nl9pbml0X3JhbmdlX2RlY29kZXIoJnMtPmMsIGRhdGEyLCBzaXplMik7CisgICAgcmV0ID0gZmZfdnA1Nl9pbml0X3JhbmdlX2RlY29kZXIoJnMtPmMsIGRhdGEyLCBzaXplMik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMTI4KSkgeyAvLyBtYXJrZXIgYml0Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk1hcmtlciBiaXQgd2FzIHNldFxuIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWFya2VyIGJpdCB3YXMgc2V0XG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKHMtPnMuaC5rZXlmcmFtZSB8fCBzLT5zLmguaW50cmFvbmx5KSB7Ci0gICAgICAgIG1lbXNldChzLT5jb3VudHMuY29lZiwgMCwgc2l6ZW9mKHMtPmNvdW50cy5jb2VmKSk7Ci0gICAgICAgIG1lbXNldChzLT5jb3VudHMuZW9iLCAgMCwgc2l6ZW9mKHMtPmNvdW50cy5lb2IpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtZW1zZXQoJnMtPmNvdW50cywgMCwgc2l6ZW9mKHMtPmNvdW50cykpOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5hY3RpdmVfdGlsZV9jb2xzOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPnMuaC5rZXlmcmFtZSB8fCBzLT5zLmguaW50cmFvbmx5KSB7CisgICAgICAgICAgICBtZW1zZXQocy0+dGRbaV0uY291bnRzLmNvZWYsIDAsIHNpemVvZihzLT50ZFswXS5jb3VudHMuY29lZikpOworICAgICAgICAgICAgbWVtc2V0KHMtPnRkW2ldLmNvdW50cy5lb2IsICAwLCBzaXplb2Yocy0+dGRbMF0uY291bnRzLmVvYikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtc2V0KCZzLT50ZFtpXS5jb3VudHMsIDAsIHNpemVvZihzLT50ZFswXS5jb3VudHMpKTsKKyAgICAgICAgfQogICAgIH0KLSAgICAvLyBGSVhNRSBpcyBpdCBmYXN0ZXIgdG8gbm90IGNvcHkgaGVyZSwgYnV0IGRvIGl0IGRvd24gaW4gdGhlIGZ3IHVwZGF0ZXMKLSAgICAvLyBhcyBleHBsaWNpdCBjb3BpZXMgaWYgdGhlIGZ3IHVwZGF0ZSBpcyBtaXNzaW5nIChhbmQgc2tpcCB0aGUgY29weSB1cG9uCi0gICAgLy8gZncgdXBkYXRlKT8KKworICAgIC8qIEZJWE1FIGlzIGl0IGZhc3RlciB0byBub3QgY29weSBoZXJlLCBidXQgZG8gaXQgZG93biBpbiB0aGUgZncgdXBkYXRlcworICAgICAqIGFzIGV4cGxpY2l0IGNvcGllcyBpZiB0aGUgZncgdXBkYXRlIGlzIG1pc3NpbmcgKGFuZCBza2lwIHRoZSBjb3B5IHVwb24KKyAgICAgKiBmdyB1cGRhdGUpPyAqLwogICAgIHMtPnByb2IucCA9IHMtPnByb2JfY3R4W2NdLnA7CiAKICAgICAvLyB0eGZtIHVwZGF0ZXMKQEAgLTg5NywxMyArOTA0LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gPj0gMyAmJiBsID09IDApIC8vIGRjIG9ubHkgaGFzIDMgcHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IDM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbbl0gPSB1cGRhdGVfcHJvYigmcy0+YywgcltuXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbbl0gPSByW25dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbM10gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmcFszXSwgZmZfdnA5X21vZGVsX3BhcmV0bzhbcFsyXV0sIDgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKQEAgLTkxNSw3ICs5MjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtID4gMyAmJiBsID09IDApIC8vIGRjIG9ubHkgaGFzIDMgcHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHAsIHIsIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBbM10gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmcFszXSwgZmZfdnA5X21vZGVsX3BhcmV0bzhbcFsyXV0sIDgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChzLT5zLmgudHhmbW1vZGUgPT0gaSkKQEAgLTk4Niw3ICs5OTIsOCBAQAogICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAzOyBrKyspCiAgICAgICAgICAgICAgICAgICAgIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCAyNTIpKQogICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnBhcnRpdGlvblszIC0gaV1bal1ba10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9wcm9iKCZzLT5jLCBzLT5wcm9iLnAucGFydGl0aW9uWzMgLSBpXVtqXVtrXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Byb2IoJnMtPmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnBhcnRpdGlvblszIC0gaV1bal1ba10pOwogCiAgICAgICAgIC8vIG12IGZpZWxkcyBkb24ndCB1c2UgdGhlIHVwZGF0ZV9wcm9iIHN1YmV4cCBtb2RlbCBmb3Igc29tZSByZWFzb24KICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKQEAgLTk5NSw3ICsxMDAyLDggQEAKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKLSAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfY29tcFtpXS5zaWduID0gKHZwOF9yYWNfZ2V0X3VpbnQoJnMtPmMsIDcpIDw8IDEpIHwgMTsKKyAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfY29tcFtpXS5zaWduID0KKyAgICAgICAgICAgICAgICAgICAgKHZwOF9yYWNfZ2V0X3VpbnQoJnMtPmMsIDcpIDw8IDEpIHwgMTsKIAogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCiAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmMsIDI1MikpCkBAIC0xMDAzLDcgKzEwMTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKHZwOF9yYWNfZ2V0X3VpbnQoJnMtPmMsIDcpIDw8IDEpIHwgMTsKIAogICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmMsIDI1MikpCi0gICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X2NvbXBbaV0uY2xhc3MwID0gKHZwOF9yYWNfZ2V0X3VpbnQoJnMtPmMsIDcpIDw8IDEpIHwgMTsKKyAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfY29tcFtpXS5jbGFzczAgPQorICAgICAgICAgICAgICAgICAgICAodnA4X3JhY19nZXRfdWludCgmcy0+YywgNykgPDwgMSkgfCAxOwogCiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTA7IGorKykKICAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgMjUyKSkKQEAgLTEwNDAsMjM1NCArMTA0OSwxMyBAQAogICAgIHJldHVybiAoZGF0YTIgLSBkYXRhKSArIHNpemUyOwogfQogCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGNsYW1wX212KFZQNTZtdiAqZHN0LCBjb25zdCBWUDU2bXYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA5Q29udGV4dCAqcykKLXsKLSAgICBkc3QtPnggPSBhdl9jbGlwKHNyYy0+eCwgcy0+bWluX212LngsIHMtPm1heF9tdi54KTsKLSAgICBkc3QtPnkgPSBhdl9jbGlwKHNyYy0+eSwgcy0+bWluX212LnksIHMtPm1heF9tdi55KTsKLX0KLQotc3RhdGljIHZvaWQgZmluZF9yZWZfbXZzKFZQOUNvbnRleHQgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVlA1Nm12ICpwbXYsIGludCByZWYsIGludCB6LCBpbnQgaWR4LCBpbnQgc2IpCi17Ci0gICAgc3RhdGljIGNvbnN0IGludDhfdCBtdl9yZWZfYmxrX29mZltOX0JTX1NJWkVTXVs4XVsyXSA9IHsKLSAgICAgICAgW0JTXzY0eDY0XSA9IHt7ICAzLCAtMSB9LCB7IC0xLCAgMyB9LCB7ICA0LCAtMSB9LCB7IC0xLCAgNCB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDYsIC0xIH19LAotICAgICAgICBbQlNfNjR4MzJdID0ge3sgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDQsIC0xIH0sIHsgLTEsICAyIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyAtMSwgLTEgfSwgeyAgMCwgLTMgfSwgeyAtMywgIDAgfSwgeyAgMiwgLTEgfX0sCi0gICAgICAgIFtCU18zMng2NF0gPSB7eyAtMSwgIDAgfSwgeyAgMCwgLTEgfSwgeyAtMSwgIDQgfSwgeyAgMiwgLTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IC0xLCAtMSB9LCB7IC0zLCAgMCB9LCB7ICAwLCAtMyB9LCB7IC0xLCAgMiB9fSwKLSAgICAgICAgW0JTXzMyeDMyXSA9IHt7ICAxLCAtMSB9LCB7IC0xLCAgMSB9LCB7ICAyLCAtMSB9LCB7IC0xLCAgMiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0zIH0sIHsgLTMsICAwIH0sIHsgLTMsIC0zIH19LAotICAgICAgICBbQlNfMzJ4MTZdID0ge3sgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDIsIC0xIH0sIHsgLTEsIC0xIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyAtMSwgIDEgfSwgeyAgMCwgLTMgfSwgeyAtMywgIDAgfSwgeyAtMywgLTMgfX0sCi0gICAgICAgIFtCU18xNngzMl0gPSB7eyAtMSwgIDAgfSwgeyAgMCwgLTEgfSwgeyAtMSwgIDIgfSwgeyAtMSwgLTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAtMSB9LCB7IC0zLCAgMCB9LCB7ICAwLCAtMyB9LCB7IC0zLCAtMyB9fSwKLSAgICAgICAgW0JTXzE2eDE2XSA9IHt7ICAwLCAtMSB9LCB7IC0xLCAgMCB9LCB7ICAxLCAtMSB9LCB7IC0xLCAgMSB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0zIH0sIHsgLTMsICAwIH0sIHsgLTMsIC0zIH19LAotICAgICAgICBbQlNfMTZ4OF0gID0ge3sgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDEsIC0xIH0sIHsgLTEsIC0xIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyAgMCwgLTIgfSwgeyAtMiwgIDAgfSwgeyAtMiwgLTEgfSwgeyAtMSwgLTIgfX0sCi0gICAgICAgIFtCU184eDE2XSAgPSB7eyAtMSwgIDAgfSwgeyAgMCwgLTEgfSwgeyAtMSwgIDEgfSwgeyAtMSwgLTEgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IC0yLCAgMCB9LCB7ICAwLCAtMiB9LCB7IC0xLCAtMiB9LCB7IC0yLCAtMSB9fSwKLSAgICAgICAgW0JTXzh4OF0gICA9IHt7ICAwLCAtMSB9LCB7IC0xLCAgMCB9LCB7IC0xLCAtMSB9LCB7ICAwLCAtMiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgLTIsICAwIH0sIHsgLTEsIC0yIH0sIHsgLTIsIC0xIH0sIHsgLTIsIC0yIH19LAotICAgICAgICBbQlNfOHg0XSAgID0ge3sgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgLTEsIC0xIH0sIHsgIDAsIC0yIH0sCi0gICAgICAgICAgICAgICAgICAgICAgeyAtMiwgIDAgfSwgeyAtMSwgLTIgfSwgeyAtMiwgLTEgfSwgeyAtMiwgLTIgfX0sCi0gICAgICAgIFtCU180eDhdICAgPSB7eyAgMCwgLTEgfSwgeyAtMSwgIDAgfSwgeyAtMSwgLTEgfSwgeyAgMCwgLTIgfSwKLSAgICAgICAgICAgICAgICAgICAgICB7IC0yLCAgMCB9LCB7IC0xLCAtMiB9LCB7IC0yLCAtMSB9LCB7IC0yLCAtMiB9fSwKLSAgICAgICAgW0JTXzR4NF0gICA9IHt7ICAwLCAtMSB9LCB7IC0xLCAgMCB9LCB7IC0xLCAtMSB9LCB7ICAwLCAtMiB9LAotICAgICAgICAgICAgICAgICAgICAgIHsgLTIsICAwIH0sIHsgLTEsIC0yIH0sIHsgLTIsIC0xIH0sIHsgLTIsIC0yIH19LAotICAgIH07Ci0gICAgVlA5QmxvY2sgKmIgPSBzLT5iOwotICAgIGludCByb3cgPSBzLT5yb3csIGNvbCA9IHMtPmNvbCwgcm93NyA9IHMtPnJvdzc7Ci0gICAgY29uc3QgaW50OF90ICgqcClbMl0gPSBtdl9yZWZfYmxrX29mZltiLT5ic107Ci0jZGVmaW5lIElOVkFMSURfTVYgMHg4MDAwODAwMFUKLSAgICB1aW50MzJfdCBtZW0gPSBJTlZBTElEX01WLCBtZW1fc3ViOHg4ID0gSU5WQUxJRF9NVjsKLSAgICBpbnQgaTsKLQotI2RlZmluZSBSRVRVUk5fRElSRUNUX01WKG12KSBcCi0gICAgZG8geyBcCi0gICAgICAgIHVpbnQzMl90IG0gPSBBVl9STjMyQSgmbXYpOyBcCi0gICAgICAgIGlmICghaWR4KSB7IFwKLSAgICAgICAgICAgIEFWX1dOMzJBKHBtdiwgbSk7IFwKLSAgICAgICAgICAgIHJldHVybjsgXAotICAgICAgICB9IGVsc2UgaWYgKG1lbSA9PSBJTlZBTElEX01WKSB7IFwKLSAgICAgICAgICAgIG1lbSA9IG07IFwKLSAgICAgICAgfSBlbHNlIGlmIChtICE9IG1lbSkgeyBcCi0gICAgICAgICAgICBBVl9XTjMyQShwbXYsIG0pOyBcCi0gICAgICAgICAgICByZXR1cm47IFwKLSAgICAgICAgfSBcCi0gICAgfSB3aGlsZSAoMCkKLQotICAgIGlmIChzYiA+PSAwKSB7Ci0gICAgICAgIGlmIChzYiA9PSAyIHx8IHNiID09IDEpIHsKLSAgICAgICAgICAgIFJFVFVSTl9ESVJFQ1RfTVYoYi0+bXZbMF1bel0pOwotICAgICAgICB9IGVsc2UgaWYgKHNiID09IDMpIHsKLSAgICAgICAgICAgIFJFVFVSTl9ESVJFQ1RfTVYoYi0+bXZbMl1bel0pOwotICAgICAgICAgICAgUkVUVVJOX0RJUkVDVF9NVihiLT5tdlsxXVt6XSk7Ci0gICAgICAgICAgICBSRVRVUk5fRElSRUNUX01WKGItPm12WzBdW3pdKTsKLSAgICAgICAgfQotCi0jZGVmaW5lIFJFVFVSTl9NVihtdikgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAoc2IgPiAwKSB7IFwKLSAgICAgICAgICAgIFZQNTZtdiB0bXA7IFwKLSAgICAgICAgICAgIHVpbnQzMl90IG07IFwKLSAgICAgICAgICAgIGF2X2Fzc2VydDIoaWR4ID09IDEpOyBcCi0gICAgICAgICAgICBhdl9hc3NlcnQyKG1lbSAhPSBJTlZBTElEX01WKTsgXAotICAgICAgICAgICAgaWYgKG1lbV9zdWI4eDggPT0gSU5WQUxJRF9NVikgeyBcCi0gICAgICAgICAgICAgICAgY2xhbXBfbXYoJnRtcCwgJm12LCBzKTsgXAotICAgICAgICAgICAgICAgIG0gPSBBVl9STjMyQSgmdG1wKTsgXAotICAgICAgICAgICAgICAgIGlmIChtICE9IG1lbSkgeyBcCi0gICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKHBtdiwgbSk7IFwKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyBcCi0gICAgICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgICAgbWVtX3N1Yjh4OCA9IEFWX1JOMzJBKCZtdik7IFwKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtX3N1Yjh4OCAhPSBBVl9STjMyQSgmbXYpKSB7IFwKLSAgICAgICAgICAgICAgICBjbGFtcF9tdigmdG1wLCAmbXYsIHMpOyBcCi0gICAgICAgICAgICAgICAgbSA9IEFWX1JOMzJBKCZ0bXApOyBcCi0gICAgICAgICAgICAgICAgaWYgKG0gIT0gbWVtKSB7IFwKLSAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEocG12LCBtKTsgXAotICAgICAgICAgICAgICAgIH0gZWxzZSB7IFwKLSAgICAgICAgICAgICAgICAgICAgLyogQlVHIEknbSBwcmV0dHkgc3VyZSB0aGlzIGlzbid0IHRoZSBpbnRlbnRpb24gKi8gXAotICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQShwbXYsIDApOyBcCi0gICAgICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgICAgcmV0dXJuOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfSBlbHNlIHsgXAotICAgICAgICAgICAgdWludDMyX3QgbSA9IEFWX1JOMzJBKCZtdik7IFwKLSAgICAgICAgICAgIGlmICghaWR4KSB7IFwKLSAgICAgICAgICAgICAgICBjbGFtcF9tdihwbXYsICZtdiwgcyk7IFwKLSAgICAgICAgICAgICAgICByZXR1cm47IFwKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtID09IElOVkFMSURfTVYpIHsgXAotICAgICAgICAgICAgICAgIG1lbSA9IG07IFwKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobSAhPSBtZW0pIHsgXAotICAgICAgICAgICAgICAgIGNsYW1wX212KHBtdiwgJm12LCBzKTsgXAotICAgICAgICAgICAgICAgIHJldHVybjsgXAotICAgICAgICAgICAgfSBcCi0gICAgICAgIH0gXAotICAgIH0gd2hpbGUgKDApCi0KLSAgICAgICAgaWYgKHJvdyA+IDApIHsKLSAgICAgICAgICAgIHN0cnVjdCBWUDltdnJlZlBhaXIgKm12ID0gJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0ubXZbKHJvdyAtIDEpICogcy0+c2JfY29scyAqIDggKyBjb2xdOwotICAgICAgICAgICAgaWYgKG12LT5yZWZbMF0gPT0gcmVmKSB7Ci0gICAgICAgICAgICAgICAgUkVUVVJOX01WKHMtPmFib3ZlX212X2N0eFsyICogY29sICsgKHNiICYgMSldWzBdKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobXYtPnJlZlsxXSA9PSByZWYpIHsKLSAgICAgICAgICAgICAgICBSRVRVUk5fTVYocy0+YWJvdmVfbXZfY3R4WzIgKiBjb2wgKyAoc2IgJiAxKV1bMV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjb2wgPiBzLT50aWxlX2NvbF9zdGFydCkgewotICAgICAgICAgICAgc3RydWN0IFZQOW12cmVmUGFpciAqbXYgPSAmcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS5tdltyb3cgKiBzLT5zYl9jb2xzICogOCArIGNvbCAtIDFdOwotICAgICAgICAgICAgaWYgKG12LT5yZWZbMF0gPT0gcmVmKSB7Ci0gICAgICAgICAgICAgICAgUkVUVVJOX01WKHMtPmxlZnRfbXZfY3R4WzIgKiByb3c3ICsgKHNiID4+IDEpXVswXSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG12LT5yZWZbMV0gPT0gcmVmKSB7Ci0gICAgICAgICAgICAgICAgUkVUVVJOX01WKHMtPmxlZnRfbXZfY3R4WzIgKiByb3c3ICsgKHNiID4+IDEpXVsxXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaSA9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaSA9IDA7Ci0gICAgfQotCi0gICAgLy8gcHJldmlvdXNseSBjb2RlZCBNVnMgaW4gdGhpcyBuZWlnaGJvdXJob29kLCB1c2luZyBzYW1lIHJlZmVyZW5jZSBmcmFtZQotICAgIGZvciAoOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgIGludCBjID0gcFtpXVswXSArIGNvbCwgciA9IHBbaV1bMV0gKyByb3c7Ci0KLSAgICAgICAgaWYgKGMgPj0gcy0+dGlsZV9jb2xfc3RhcnQgJiYgYyA8IHMtPmNvbHMgJiYgciA+PSAwICYmIHIgPCBzLT5yb3dzKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgVlA5bXZyZWZQYWlyICptdiA9ICZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLm12W3IgKiBzLT5zYl9jb2xzICogOCArIGNdOwotCi0gICAgICAgICAgICBpZiAobXYtPnJlZlswXSA9PSByZWYpIHsKLSAgICAgICAgICAgICAgICBSRVRVUk5fTVYobXYtPm12WzBdKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobXYtPnJlZlsxXSA9PSByZWYpIHsKLSAgICAgICAgICAgICAgICBSRVRVUk5fTVYobXYtPm12WzFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE1WIGF0IHRoaXMgcG9zaXRpb24gaW4gcHJldmlvdXMgZnJhbWUsIHVzaW5nIHNhbWUgcmVmZXJlbmNlIGZyYW1lCi0gICAgaWYgKHMtPnMuaC51c2VfbGFzdF9mcmFtZV9tdnMpIHsKLSAgICAgICAgc3RydWN0IFZQOW12cmVmUGFpciAqbXYgPSAmcy0+cy5mcmFtZXNbUkVGX0ZSQU1FX01WUEFJUl0ubXZbcm93ICogcy0+c2JfY29scyAqIDggKyBjb2xdOwotCi0gICAgICAgIGlmICghcy0+cy5mcmFtZXNbUkVGX0ZSQU1FX01WUEFJUl0udXNlc18ycGFzcykKLSAgICAgICAgICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcygmcy0+cy5mcmFtZXNbUkVGX0ZSQU1FX01WUEFJUl0udGYsIHJvdyA+PiAzLCAwKTsKLSAgICAgICAgaWYgKG12LT5yZWZbMF0gPT0gcmVmKSB7Ci0gICAgICAgICAgICBSRVRVUk5fTVYobXYtPm12WzBdKTsKLSAgICAgICAgfSBlbHNlIGlmIChtdi0+cmVmWzFdID09IHJlZikgewotICAgICAgICAgICAgUkVUVVJOX01WKG12LT5tdlsxXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSNkZWZpbmUgUkVUVVJOX1NDQUxFX01WKG12LCBzY2FsZSkgXAotICAgIGRvIHsgXAotICAgICAgICBpZiAoc2NhbGUpIHsgXAotICAgICAgICAgICAgVlA1Nm12IG12X3RlbXAgPSB7IC1tdi54LCAtbXYueSB9OyBcCi0gICAgICAgICAgICBSRVRVUk5fTVYobXZfdGVtcCk7IFwKLSAgICAgICAgfSBlbHNlIHsgXAotICAgICAgICAgICAgUkVUVVJOX01WKG12KTsgXAotICAgICAgICB9IFwKLSAgICB9IHdoaWxlICgwKQotCi0gICAgLy8gcHJldmlvdXNseSBjb2RlZCBNVnMgaW4gdGhpcyBuZWlnaGJvdXJob29kLCB1c2luZyBkaWZmZXJlbnQgcmVmZXJlbmNlIGZyYW1lCi0gICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgICBpbnQgYyA9IHBbaV1bMF0gKyBjb2wsIHIgPSBwW2ldWzFdICsgcm93OwotCi0gICAgICAgIGlmIChjID49IHMtPnRpbGVfY29sX3N0YXJ0ICYmIGMgPCBzLT5jb2xzICYmIHIgPj0gMCAmJiByIDwgcy0+cm93cykgewotICAgICAgICAgICAgc3RydWN0IFZQOW12cmVmUGFpciAqbXYgPSAmcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS5tdltyICogcy0+c2JfY29scyAqIDggKyBjXTsKLQotICAgICAgICAgICAgaWYgKG12LT5yZWZbMF0gIT0gcmVmICYmIG12LT5yZWZbMF0gPj0gMCkgewotICAgICAgICAgICAgICAgIFJFVFVSTl9TQ0FMRV9NVihtdi0+bXZbMF0sIHMtPnMuaC5zaWduYmlhc1ttdi0+cmVmWzBdXSAhPSBzLT5zLmguc2lnbmJpYXNbcmVmXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobXYtPnJlZlsxXSAhPSByZWYgJiYgbXYtPnJlZlsxXSA+PSAwICYmCi0gICAgICAgICAgICAgICAgLy8gQlVHIC0gbGlidnB4IGhhcyB0aGlzIGNvbmRpdGlvbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIKLSAgICAgICAgICAgICAgICAvLyB3ZSB1c2VkIHRoZSBmaXJzdCByZWYgTVYgYW5kIHByZS1zY2FsaW5nCi0gICAgICAgICAgICAgICAgQVZfUk4zMkEoJm12LT5tdlswXSkgIT0gQVZfUk4zMkEoJm12LT5tdlsxXSkpIHsKLSAgICAgICAgICAgICAgICBSRVRVUk5fU0NBTEVfTVYobXYtPm12WzFdLCBzLT5zLmguc2lnbmJpYXNbbXYtPnJlZlsxXV0gIT0gcy0+cy5oLnNpZ25iaWFzW3JlZl0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTVYgYXQgdGhpcyBwb3NpdGlvbiBpbiBwcmV2aW91cyBmcmFtZSwgdXNpbmcgZGlmZmVyZW50IHJlZmVyZW5jZSBmcmFtZQotICAgIGlmIChzLT5zLmgudXNlX2xhc3RfZnJhbWVfbXZzKSB7Ci0gICAgICAgIHN0cnVjdCBWUDltdnJlZlBhaXIgKm12ID0gJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9NVlBBSVJdLm12W3JvdyAqIHMtPnNiX2NvbHMgKiA4ICsgY29sXTsKLQotICAgICAgICAvLyBubyBuZWVkIHRvIGF3YWl0X3Byb2dyZXNzLCBiZWNhdXNlIHdlIGFscmVhZHkgZGlkIHRoYXQgYWJvdmUKLSAgICAgICAgaWYgKG12LT5yZWZbMF0gIT0gcmVmICYmIG12LT5yZWZbMF0gPj0gMCkgewotICAgICAgICAgICAgUkVUVVJOX1NDQUxFX01WKG12LT5tdlswXSwgcy0+cy5oLnNpZ25iaWFzW212LT5yZWZbMF1dICE9IHMtPnMuaC5zaWduYmlhc1tyZWZdKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobXYtPnJlZlsxXSAhPSByZWYgJiYgbXYtPnJlZlsxXSA+PSAwICYmCi0gICAgICAgICAgICAvLyBCVUcgLSBsaWJ2cHggaGFzIHRoaXMgY29uZGl0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgotICAgICAgICAgICAgLy8gd2UgdXNlZCB0aGUgZmlyc3QgcmVmIE1WIGFuZCBwcmUtc2NhbGluZwotICAgICAgICAgICAgQVZfUk4zMkEoJm12LT5tdlswXSkgIT0gQVZfUk4zMkEoJm12LT5tdlsxXSkpIHsKLSAgICAgICAgICAgIFJFVFVSTl9TQ0FMRV9NVihtdi0+bXZbMV0sIHMtPnMuaC5zaWduYmlhc1ttdi0+cmVmWzFdXSAhPSBzLT5zLmguc2lnbmJpYXNbcmVmXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBVl9aRVJPMzIocG12KTsKLSAgICBjbGFtcF9tdihwbXYsIHBtdiwgcyk7Ci0jdW5kZWYgSU5WQUxJRF9NVgotI3VuZGVmIFJFVFVSTl9NVgotI3VuZGVmIFJFVFVSTl9TQ0FMRV9NVgotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgcmVhZF9tdl9jb21wb25lbnQoVlA5Q29udGV4dCAqcywgaW50IGlkeCwgaW50IGhwKQotewotICAgIGludCBiaXQsIHNpZ24gPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLm12X2NvbXBbaWR4XS5zaWduKTsKLSAgICBpbnQgbiwgYyA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9tdl9jbGFzc190cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfY29tcFtpZHhdLmNsYXNzZXMpOwotCi0gICAgcy0+Y291bnRzLm12X2NvbXBbaWR4XS5zaWduW3NpZ25dKys7Ci0gICAgcy0+Y291bnRzLm12X2NvbXBbaWR4XS5jbGFzc2VzW2NdKys7Ci0gICAgaWYgKGMpIHsKLSAgICAgICAgaW50IG07Ci0KLSAgICAgICAgZm9yIChuID0gMCwgbSA9IDA7IG0gPCBjOyBtKyspIHsKLSAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAubXZfY29tcFtpZHhdLmJpdHNbbV0pOwotICAgICAgICAgICAgbiB8PSBiaXQgPDwgbTsKLSAgICAgICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2lkeF0uYml0c1ttXVtiaXRdKys7Ci0gICAgICAgIH0KLSAgICAgICAgbiA8PD0gMzsKLSAgICAgICAgYml0ID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X212X2ZwX3RyZWUsIHMtPnByb2IucC5tdl9jb21wW2lkeF0uZnApOwotICAgICAgICBuIHw9IGJpdCA8PCAxOwotICAgICAgICBzLT5jb3VudHMubXZfY29tcFtpZHhdLmZwW2JpdF0rKzsKLSAgICAgICAgaWYgKGhwKSB7Ci0gICAgICAgICAgICBiaXQgPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLm12X2NvbXBbaWR4XS5ocCk7Ci0gICAgICAgICAgICBzLT5jb3VudHMubXZfY29tcFtpZHhdLmhwW2JpdF0rKzsKLSAgICAgICAgICAgIG4gfD0gYml0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbiB8PSAxOwotICAgICAgICAgICAgLy8gYnVnIGluIGxpYnZweCAtIHdlIGNvdW50IGZvciBidyBlbnRyb3B5IHB1cnBvc2VzIGV2ZW4gaWYgdGhlCi0gICAgICAgICAgICAvLyBiaXQgd2Fzbid0IGNvZGVkCi0gICAgICAgICAgICBzLT5jb3VudHMubXZfY29tcFtpZHhdLmhwWzFdKys7Ci0gICAgICAgIH0KLSAgICAgICAgbiArPSA4IDw8IGM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbiA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAubXZfY29tcFtpZHhdLmNsYXNzMCk7Ci0gICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2lkeF0uY2xhc3MwW25dKys7Ci0gICAgICAgIGJpdCA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9tdl9mcF90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5tdl9jb21wW2lkeF0uY2xhc3MwX2ZwW25dKTsKLSAgICAgICAgcy0+Y291bnRzLm12X2NvbXBbaWR4XS5jbGFzczBfZnBbbl1bYml0XSsrOwotICAgICAgICBuID0gKG4gPDwgMykgfCAoYml0IDw8IDEpOwotICAgICAgICBpZiAoaHApIHsKLSAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAubXZfY29tcFtpZHhdLmNsYXNzMF9ocCk7Ci0gICAgICAgICAgICBzLT5jb3VudHMubXZfY29tcFtpZHhdLmNsYXNzMF9ocFtiaXRdKys7Ci0gICAgICAgICAgICBuIHw9IGJpdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG4gfD0gMTsKLSAgICAgICAgICAgIC8vIGJ1ZyBpbiBsaWJ2cHggLSB3ZSBjb3VudCBmb3IgYncgZW50cm9weSBwdXJwb3NlcyBldmVuIGlmIHRoZQotICAgICAgICAgICAgLy8gYml0IHdhc24ndCBjb2RlZAotICAgICAgICAgICAgcy0+Y291bnRzLm12X2NvbXBbaWR4XS5jbGFzczBfaHBbMV0rKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzaWduID8gLShuICsgMSkgOiAobiArIDEpOwotfQotCi1zdGF0aWMgdm9pZCBmaWxsX212KFZQOUNvbnRleHQgKnMsCi0gICAgICAgICAgICAgICAgICAgIFZQNTZtdiAqbXYsIGludCBtb2RlLCBpbnQgc2IpCi17Ci0gICAgVlA5QmxvY2sgKmIgPSBzLT5iOwotCi0gICAgaWYgKG1vZGUgPT0gWkVST01WKSB7Ci0gICAgICAgIEFWX1pFUk82NChtdik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGhwOwotCi0gICAgICAgIC8vIEZJWE1FIGNhY2hlIHRoaXMgdmFsdWUgYW5kIHJldXNlIGZvciBvdGhlciBzdWJibG9ja3MKLSAgICAgICAgZmluZF9yZWZfbXZzKHMsICZtdlswXSwgYi0+cmVmWzBdLCAwLCBtb2RlID09IE5FQVJNViwKLSAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT0gTkVXTVYgPyAtMSA6IHNiKTsKLSAgICAgICAgLy8gRklYTUUgbWF5YmUgbW92ZSB0aGlzIGNvZGUgaW50byBmaW5kX3JlZl9tdnMoKQotICAgICAgICBpZiAoKG1vZGUgPT0gTkVXTVYgfHwgc2IgPT0gLTEpICYmCi0gICAgICAgICAgICAhKGhwID0gcy0+cy5oLmhpZ2hwcmVjaXNpb25tdnMgJiYgYWJzKG12WzBdLngpIDwgNjQgJiYgYWJzKG12WzBdLnkpIDwgNjQpKSB7Ci0gICAgICAgICAgICBpZiAobXZbMF0ueSAmIDEpIHsKLSAgICAgICAgICAgICAgICBpZiAobXZbMF0ueSA8IDApCi0gICAgICAgICAgICAgICAgICAgIG12WzBdLnkrKzsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIG12WzBdLnktLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtdlswXS54ICYgMSkgewotICAgICAgICAgICAgICAgIGlmIChtdlswXS54IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgbXZbMF0ueCsrOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbXZbMF0ueC0tOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtb2RlID09IE5FV01WKSB7Ci0gICAgICAgICAgICBlbnVtIE1WSm9pbnQgaiA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9tdl9qb2ludF90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5tdl9qb2ludCk7Ci0KLSAgICAgICAgICAgIHMtPmNvdW50cy5tdl9qb2ludFtqXSsrOwotICAgICAgICAgICAgaWYgKGogPj0gTVZfSk9JTlRfVikKLSAgICAgICAgICAgICAgICBtdlswXS55ICs9IHJlYWRfbXZfY29tcG9uZW50KHMsIDAsIGhwKTsKLSAgICAgICAgICAgIGlmIChqICYgMSkKLSAgICAgICAgICAgICAgICBtdlswXS54ICs9IHJlYWRfbXZfY29tcG9uZW50KHMsIDEsIGhwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiLT5jb21wKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRSBjYWNoZSB0aGlzIHZhbHVlIGFuZCByZXVzZSBmb3Igb3RoZXIgc3ViYmxvY2tzCi0gICAgICAgICAgICBmaW5kX3JlZl9tdnMocywgJm12WzFdLCBiLT5yZWZbMV0sIDEsIG1vZGUgPT0gTkVBUk1WLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPT0gTkVXTVYgPyAtMSA6IHNiKTsKLSAgICAgICAgICAgIGlmICgobW9kZSA9PSBORVdNViB8fCBzYiA9PSAtMSkgJiYKLSAgICAgICAgICAgICAgICAhKGhwID0gcy0+cy5oLmhpZ2hwcmVjaXNpb25tdnMgJiYgYWJzKG12WzFdLngpIDwgNjQgJiYgYWJzKG12WzFdLnkpIDwgNjQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG12WzFdLnkgJiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtdlsxXS55IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG12WzFdLnkrKzsKLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgbXZbMV0ueS0tOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobXZbMV0ueCAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG12WzFdLnggPCAwKQotICAgICAgICAgICAgICAgICAgICAgICAgbXZbMV0ueCsrOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBtdlsxXS54LS07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1vZGUgPT0gTkVXTVYpIHsKLSAgICAgICAgICAgICAgICBlbnVtIE1WSm9pbnQgaiA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9tdl9qb2ludF90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfam9pbnQpOwotCi0gICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X2pvaW50W2pdKys7Ci0gICAgICAgICAgICAgICAgaWYgKGogPj0gTVZfSk9JTlRfVikKLSAgICAgICAgICAgICAgICAgICAgbXZbMV0ueSArPSByZWFkX212X2NvbXBvbmVudChzLCAwLCBocCk7Ci0gICAgICAgICAgICAgICAgaWYgKGogJiAxKQotICAgICAgICAgICAgICAgICAgICBtdlsxXS54ICs9IHJlYWRfbXZfY29tcG9uZW50KHMsIDEsIGhwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzZXRjdHhfMmQodWludDhfdCAqcHRyLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgdikKLXsKLSAgICBzd2l0Y2ggKHcpIHsKLSAgICBjYXNlIDE6Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICpwdHIgPSB2OwotICAgICAgICAgICAgcHRyICs9IHN0cmlkZTsKLSAgICAgICAgfSB3aGlsZSAoLS1oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOiB7Ci0gICAgICAgIGludCB2MTYgPSB2ICogMHgwMTAxOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBBVl9XTjE2QShwdHIsIHYxNik7Ci0gICAgICAgICAgICBwdHIgKz0gc3RyaWRlOwotICAgICAgICB9IHdoaWxlICgtLWgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSA0OiB7Ci0gICAgICAgIHVpbnQzMl90IHYzMiA9IHYgKiAweDAxMDEwMTAxOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBBVl9XTjMyQShwdHIsIHYzMik7Ci0gICAgICAgICAgICBwdHIgKz0gc3RyaWRlOwotICAgICAgICB9IHdoaWxlICgtLWgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSA4OiB7Ci0jaWYgSEFWRV9GQVNUXzY0QklUCi0gICAgICAgIHVpbnQ2NF90IHY2NCA9IHYgKiAweDAxMDEwMTAxMDEwMTAxMDFVTEw7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIEFWX1dONjRBKHB0ciwgdjY0KTsKLSAgICAgICAgICAgIHB0ciArPSBzdHJpZGU7Ci0gICAgICAgIH0gd2hpbGUgKC0taCk7Ci0jZWxzZQotICAgICAgICB1aW50MzJfdCB2MzIgPSB2ICogMHgwMTAxMDEwMTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgQVZfV04zMkEocHRyLCAgICAgdjMyKTsKLSAgICAgICAgICAgIEFWX1dOMzJBKHB0ciArIDQsIHYzMik7Ci0gICAgICAgICAgICBwdHIgKz0gc3RyaWRlOwotICAgICAgICB9IHdoaWxlICgtLWgpOwotI2VuZGlmCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY29kZV9tb2RlKEFWQ29kZWNDb250ZXh0ICpjdHgpCi17Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbGVmdF9jdHhbTl9CU19TSVpFU10gPSB7Ci0gICAgICAgIDB4MCwgMHg4LCAweDAsIDB4OCwgMHhjLCAweDgsIDB4YywgMHhlLCAweGMsIDB4ZSwgMHhmLCAweGUsIDB4ZgotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgYWJvdmVfY3R4W05fQlNfU0laRVNdID0gewotICAgICAgICAweDAsIDB4MCwgMHg4LCAweDgsIDB4OCwgMHhjLCAweGMsIDB4YywgMHhlLCAweGUsIDB4ZSwgMHhmLCAweGYKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1heF90eF9mb3JfYmxfYnBbTl9CU19TSVpFU10gPSB7Ci0gICAgICAgIFRYXzMyWDMyLCBUWF8zMlgzMiwgVFhfMzJYMzIsIFRYXzMyWDMyLCBUWF8xNlgxNiwgVFhfMTZYMTYsCi0gICAgICAgIFRYXzE2WDE2LCBUWF84WDgsIFRYXzhYOCwgVFhfOFg4LCBUWF80WDQsIFRYXzRYNCwgVFhfNFg0Ci0gICAgfTsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7Ci0gICAgVlA5QmxvY2sgKmIgPSBzLT5iOwotICAgIGludCByb3cgPSBzLT5yb3csIGNvbCA9IHMtPmNvbCwgcm93NyA9IHMtPnJvdzc7Ci0gICAgZW51bSBUeGZtTW9kZSBtYXhfdHggPSBtYXhfdHhfZm9yX2JsX2JwW2ItPmJzXTsKLSAgICBpbnQgYnc0ID0gYndoX3RhYlsxXVtiLT5ic11bMF0sIHc0ID0gRkZNSU4ocy0+Y29scyAtIGNvbCwgYnc0KTsKLSAgICBpbnQgYmg0ID0gYndoX3RhYlsxXVtiLT5ic11bMV0sIGg0ID0gRkZNSU4ocy0+cm93cyAtIHJvdywgYmg0KSwgeTsKLSAgICBpbnQgaGF2ZV9hID0gcm93ID4gMCwgaGF2ZV9sID0gY29sID4gcy0+dGlsZV9jb2xfc3RhcnQ7Ci0gICAgaW50IHZyZWYsIGZpbHRlcl9pZDsKLQotICAgIGlmICghcy0+cy5oLnNlZ21lbnRhdGlvbi5lbmFibGVkKSB7Ci0gICAgICAgIGItPnNlZ19pZCA9IDA7Ci0gICAgfSBlbHNlIGlmIChzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkgewotICAgICAgICBiLT5zZWdfaWQgPSAhcy0+cy5oLnNlZ21lbnRhdGlvbi51cGRhdGVfbWFwID8gMCA6Ci0gICAgICAgICAgICAgICAgICAgIHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9zZWdtZW50YXRpb25fdHJlZSwgcy0+cy5oLnNlZ21lbnRhdGlvbi5wcm9iKTsKLSAgICB9IGVsc2UgaWYgKCFzLT5zLmguc2VnbWVudGF0aW9uLnVwZGF0ZV9tYXAgfHwKLSAgICAgICAgICAgICAgIChzLT5zLmguc2VnbWVudGF0aW9uLnRlbXBvcmFsICYmCi0gICAgICAgICAgICAgICAgdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywKLSAgICAgICAgICAgICAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5wcmVkX3Byb2Jbcy0+YWJvdmVfc2VncHJlZF9jdHhbY29sXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZWZ0X3NlZ3ByZWRfY3R4W3JvdzddXSkpKSB7Ci0gICAgICAgIGlmICghcy0+cy5oLmVycm9ycmVzICYmIHMtPnMuZnJhbWVzW1JFRl9GUkFNRV9TRUdNQVBdLnNlZ21lbnRhdGlvbl9tYXApIHsKLSAgICAgICAgICAgIGludCBwcmVkID0gOCwgeDsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnJlZnNlZ21hcCA9IHMtPnMuZnJhbWVzW1JFRl9GUkFNRV9TRUdNQVBdLnNlZ21lbnRhdGlvbl9tYXA7Ci0KLSAgICAgICAgICAgIGlmICghcy0+cy5mcmFtZXNbUkVGX0ZSQU1FX1NFR01BUF0udXNlc18ycGFzcykKLSAgICAgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9TRUdNQVBdLnRmLCByb3cgPj4gMywgMCk7Ci0gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDQ7IHkrKykgewotICAgICAgICAgICAgICAgIGludCBpZHhfYmFzZSA9ICh5ICsgcm93KSAqIDggKiBzLT5zYl9jb2xzICsgY29sOwotICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3NDsgeCsrKQotICAgICAgICAgICAgICAgICAgICBwcmVkID0gRkZNSU4ocHJlZCwgcmVmc2VnbWFwW2lkeF9iYXNlICsgeF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZfYXNzZXJ0MShwcmVkIDwgOCk7Ci0gICAgICAgICAgICBiLT5zZWdfaWQgPSBwcmVkOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYi0+c2VnX2lkID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbXNldCgmcy0+YWJvdmVfc2VncHJlZF9jdHhbY29sXSwgMSwgdzQpOwotICAgICAgICBtZW1zZXQoJnMtPmxlZnRfc2VncHJlZF9jdHhbcm93N10sIDEsIGg0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBiLT5zZWdfaWQgPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfc2VnbWVudGF0aW9uX3RyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5wcm9iKTsKLQotICAgICAgICBtZW1zZXQoJnMtPmFib3ZlX3NlZ3ByZWRfY3R4W2NvbF0sIDAsIHc0KTsKLSAgICAgICAgbWVtc2V0KCZzLT5sZWZ0X3NlZ3ByZWRfY3R4W3JvdzddLCAwLCBoNCk7Ci0gICAgfQotICAgIGlmIChzLT5zLmguc2VnbWVudGF0aW9uLmVuYWJsZWQgJiYKLSAgICAgICAgKHMtPnMuaC5zZWdtZW50YXRpb24udXBkYXRlX21hcCB8fCBzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkpIHsKLSAgICAgICAgc2V0Y3R4XzJkKCZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnNlZ21lbnRhdGlvbl9tYXBbcm93ICogOCAqIHMtPnNiX2NvbHMgKyBjb2xdLAotICAgICAgICAgICAgICAgICAgYnc0LCBiaDQsIDggKiBzLT5zYl9jb2xzLCBiLT5zZWdfaWQpOwotICAgIH0KLQotICAgIGItPnNraXAgPSBzLT5zLmguc2VnbWVudGF0aW9uLmVuYWJsZWQgJiYKLSAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ItPnNlZ19pZF0uc2tpcF9lbmFibGVkOwotICAgIGlmICghYi0+c2tpcCkgewotICAgICAgICBpbnQgYyA9IHMtPmxlZnRfc2tpcF9jdHhbcm93N10gKyBzLT5hYm92ZV9za2lwX2N0eFtjb2xdOwotICAgICAgICBiLT5za2lwID0gdnA1Nl9yYWNfZ2V0X3Byb2IoJnMtPmMsIHMtPnByb2IucC5za2lwW2NdKTsKLSAgICAgICAgcy0+Y291bnRzLnNraXBbY11bYi0+c2tpcF0rKzsKLSAgICB9Ci0KLSAgICBpZiAocy0+cy5oLmtleWZyYW1lIHx8IHMtPnMuaC5pbnRyYW9ubHkpIHsKLSAgICAgICAgYi0+aW50cmEgPSAxOwotICAgIH0gZWxzZSBpZiAocy0+cy5oLnNlZ21lbnRhdGlvbi5lbmFibGVkICYmIHMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtiLT5zZWdfaWRdLnJlZl9lbmFibGVkKSB7Ci0gICAgICAgIGItPmludHJhID0gIXMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtiLT5zZWdfaWRdLnJlZl92YWw7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaW50IGMsIGJpdDsKLQotICAgICAgICBpZiAoaGF2ZV9hICYmIGhhdmVfbCkgewotICAgICAgICAgICAgYyA9IHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdICsgcy0+bGVmdF9pbnRyYV9jdHhbcm93N107Ci0gICAgICAgICAgICBjICs9IChjID09IDIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYyA9IGhhdmVfYSA/IDIgKiBzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSA6Ci0gICAgICAgICAgICAgICAgaGF2ZV9sID8gMiAqIHMtPmxlZnRfaW50cmFfY3R4W3JvdzddIDogMDsKLSAgICAgICAgfQotICAgICAgICBiaXQgPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLmludHJhW2NdKTsKLSAgICAgICAgcy0+Y291bnRzLmludHJhW2NdW2JpdF0rKzsKLSAgICAgICAgYi0+aW50cmEgPSAhYml0OwotICAgIH0KLQotICAgIGlmICgoYi0+aW50cmEgfHwgIWItPnNraXApICYmIHMtPnMuaC50eGZtbW9kZSA9PSBUWF9TV0lUQ0hBQkxFKSB7Ci0gICAgICAgIGludCBjOwotICAgICAgICBpZiAoaGF2ZV9hKSB7Ci0gICAgICAgICAgICBpZiAoaGF2ZV9sKSB7Ci0gICAgICAgICAgICAgICAgYyA9IChzLT5hYm92ZV9za2lwX2N0eFtjb2xdID8gbWF4X3R4IDoKLSAgICAgICAgICAgICAgICAgICAgIHMtPmFib3ZlX3R4Zm1fY3R4W2NvbF0pICsKLSAgICAgICAgICAgICAgICAgICAgKHMtPmxlZnRfc2tpcF9jdHhbcm93N10gPyBtYXhfdHggOgotICAgICAgICAgICAgICAgICAgICAgcy0+bGVmdF90eGZtX2N0eFtyb3c3XSkgPiBtYXhfdHg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGMgPSBzLT5hYm92ZV9za2lwX2N0eFtjb2xdID8gMSA6Ci0gICAgICAgICAgICAgICAgICAgIChzLT5hYm92ZV90eGZtX2N0eFtjb2xdICogMiA+IG1heF90eCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoaGF2ZV9sKSB7Ci0gICAgICAgICAgICBjID0gcy0+bGVmdF9za2lwX2N0eFtyb3c3XSA/IDEgOgotICAgICAgICAgICAgICAgIChzLT5sZWZ0X3R4Zm1fY3R4W3JvdzddICogMiA+IG1heF90eCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjID0gMTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKG1heF90eCkgewotICAgICAgICBjYXNlIFRYXzMyWDMyOgotICAgICAgICAgICAgYi0+dHggPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnR4MzJwW2NdWzBdKTsKLSAgICAgICAgICAgIGlmIChiLT50eCkgewotICAgICAgICAgICAgICAgIGItPnR4ICs9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAudHgzMnBbY11bMV0pOwotICAgICAgICAgICAgICAgIGlmIChiLT50eCA9PSAyKQotICAgICAgICAgICAgICAgICAgICBiLT50eCArPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnR4MzJwW2NdWzJdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPmNvdW50cy50eDMycFtjXVtiLT50eF0rKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRYXzE2WDE2OgotICAgICAgICAgICAgYi0+dHggPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnR4MTZwW2NdWzBdKTsKLSAgICAgICAgICAgIGlmIChiLT50eCkKLSAgICAgICAgICAgICAgICBiLT50eCArPSB2cDU2X3JhY19nZXRfcHJvYigmcy0+Yywgcy0+cHJvYi5wLnR4MTZwW2NdWzFdKTsKLSAgICAgICAgICAgIHMtPmNvdW50cy50eDE2cFtjXVtiLT50eF0rKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRYXzhYODoKLSAgICAgICAgICAgIGItPnR4ID0gdnA1Nl9yYWNfZ2V0X3Byb2IoJnMtPmMsIHMtPnByb2IucC50eDhwW2NdKTsKLSAgICAgICAgICAgIHMtPmNvdW50cy50eDhwW2NdW2ItPnR4XSsrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFhfNFg0OgotICAgICAgICAgICAgYi0+dHggPSBUWF80WDQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGItPnR4ID0gRkZNSU4obWF4X3R4LCBzLT5zLmgudHhmbW1vZGUpOwotICAgIH0KLQotICAgIGlmIChzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkgewotICAgICAgICB1aW50OF90ICphID0gJnMtPmFib3ZlX21vZGVfY3R4W2NvbCAqIDJdOwotICAgICAgICB1aW50OF90ICpsID0gJnMtPmxlZnRfbW9kZV9jdHhbKHJvdzcpIDw8IDFdOwotCi0gICAgICAgIGItPmNvbXAgPSAwOwotICAgICAgICBpZiAoYi0+YnMgPiBCU184eDgpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FIHRoZSBtZW1vcnkgc3RvcmFnZSBpbnRlcm1lZGlhdGVzIGhlcmUgYXJlbid0IHJlYWxseQotICAgICAgICAgICAgLy8gbmVjZXNzYXJ5LCB0aGV5J3JlIGp1c3QgdGhlcmUgdG8gbWFrZSB0aGUgY29kZSBzbGlnaHRseQotICAgICAgICAgICAgLy8gc2ltcGxlciBmb3Igbm93Ci0gICAgICAgICAgICBiLT5tb2RlWzBdID0gYVswXSA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9pbnRyYW1vZGVfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzW2FbMF1dW2xbMF1dKTsKLSAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU184eDQpIHsKLSAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA5X2RlZmF1bHRfa2ZfeW1vZGVfcHJvYnNbYVsxXV1bYi0+bW9kZVswXV0pOwotICAgICAgICAgICAgICAgIGxbMF0gPSBhWzFdID0gYi0+bW9kZVsxXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbFswXSA9IGFbMV0gPSBiLT5tb2RlWzFdID0gYi0+bW9kZVswXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU180eDgpIHsKLSAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0gYVswXSA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9pbnRyYW1vZGVfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDlfZGVmYXVsdF9rZl95bW9kZV9wcm9ic1thWzBdXVtsWzFdXSk7Ci0gICAgICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzh4NCkgewotICAgICAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzW2FbMV1dW2ItPm1vZGVbMl1dKTsKLSAgICAgICAgICAgICAgICAgICAgbFsxXSA9IGFbMV0gPSBiLT5tb2RlWzNdOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxbMV0gPSBhWzFdID0gYi0+bW9kZVszXSA9IGItPm1vZGVbMl07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0gYi0+bW9kZVswXTsKLSAgICAgICAgICAgICAgICBsWzFdID0gYVsxXSA9IGItPm1vZGVbM10gPSBiLT5tb2RlWzFdOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYi0+bW9kZVswXSA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9pbnRyYW1vZGVfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzWyphXVsqbF0pOwotICAgICAgICAgICAgYi0+bW9kZVszXSA9IGItPm1vZGVbMl0gPSBiLT5tb2RlWzFdID0gYi0+bW9kZVswXTsKLSAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgY2FuIHByb2JhYmx5IGJlIG9wdGltaXplZAotICAgICAgICAgICAgbWVtc2V0KGEsIGItPm1vZGVbMF0sIGJ3aF90YWJbMF1bYi0+YnNdWzBdKTsKLSAgICAgICAgICAgIG1lbXNldChsLCBiLT5tb2RlWzBdLCBid2hfdGFiWzBdW2ItPmJzXVsxXSk7Ci0gICAgICAgIH0KLSAgICAgICAgYi0+dXZtb2RlID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOV9kZWZhdWx0X2tmX3V2bW9kZV9wcm9ic1tiLT5tb2RlWzNdXSk7Ci0gICAgfSBlbHNlIGlmIChiLT5pbnRyYSkgewotICAgICAgICBiLT5jb21wID0gMDsKLSAgICAgICAgaWYgKGItPmJzID4gQlNfOHg4KSB7Ci0gICAgICAgICAgICBiLT5tb2RlWzBdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnlfbW9kZVswXSk7Ci0gICAgICAgICAgICBzLT5jb3VudHMueV9tb2RlWzBdW2ItPm1vZGVbMF1dKys7Ci0gICAgICAgICAgICBpZiAoYi0+YnMgIT0gQlNfOHg0KSB7Ci0gICAgICAgICAgICAgICAgYi0+bW9kZVsxXSA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9pbnRyYW1vZGVfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlWzBdKTsKLSAgICAgICAgICAgICAgICBzLT5jb3VudHMueV9tb2RlWzBdW2ItPm1vZGVbMV1dKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGItPm1vZGVbMV0gPSBiLT5tb2RlWzBdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzR4OCkgewotICAgICAgICAgICAgICAgIGItPm1vZGVbMl0gPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50cmFtb2RlX3RyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnlfbW9kZVswXSk7Ci0gICAgICAgICAgICAgICAgcy0+Y291bnRzLnlfbW9kZVswXVtiLT5tb2RlWzJdXSsrOwotICAgICAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU184eDQpIHsKLSAgICAgICAgICAgICAgICAgICAgYi0+bW9kZVszXSA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9pbnRyYW1vZGVfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnlfbW9kZVswXSk7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmNvdW50cy55X21vZGVbMF1bYi0+bW9kZVszXV0rKzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gYi0+bW9kZVsyXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGItPm1vZGVbMl0gPSBiLT5tb2RlWzBdOwotICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzFdOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2l6ZV9ncm91cFsxMF0gPSB7Ci0gICAgICAgICAgICAgICAgMywgMywgMywgMywgMiwgMiwgMiwgMSwgMSwgMQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGludCBzeiA9IHNpemVfZ3JvdXBbYi0+YnNdOwotCi0gICAgICAgICAgICBiLT5tb2RlWzBdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnlfbW9kZVtzel0pOwotICAgICAgICAgICAgYi0+bW9kZVsxXSA9IGItPm1vZGVbMl0gPSBiLT5tb2RlWzNdID0gYi0+bW9kZVswXTsKLSAgICAgICAgICAgIHMtPmNvdW50cy55X21vZGVbc3pdW2ItPm1vZGVbM11dKys7Ci0gICAgICAgIH0KLSAgICAgICAgYi0+dXZtb2RlID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludHJhbW9kZV90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC51dl9tb2RlW2ItPm1vZGVbM11dKTsKLSAgICAgICAgcy0+Y291bnRzLnV2X21vZGVbYi0+bW9kZVszXV1bYi0+dXZtb2RlXSsrOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGludGVyX21vZGVfY3R4X2x1dFsxNF1bMTRdID0gewotICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCi0gICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKLSAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAotICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCi0gICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKLSAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAotICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCi0gICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKLSAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAotICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCi0gICAgICAgICAgICB7IDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDIsIDIsIDEsIDMgfSwKLSAgICAgICAgICAgIHsgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgMiwgMiwgMSwgMyB9LAotICAgICAgICAgICAgeyA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCAxLCAxLCAwLCAzIH0sCi0gICAgICAgICAgICB7IDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDMsIDMsIDMsIDQgfSwKLSAgICAgICAgfTsKLQotICAgICAgICBpZiAocy0+cy5oLnNlZ21lbnRhdGlvbi5lbmFibGVkICYmIHMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtiLT5zZWdfaWRdLnJlZl9lbmFibGVkKSB7Ci0gICAgICAgICAgICBhdl9hc3NlcnQyKHMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtiLT5zZWdfaWRdLnJlZl92YWwgIT0gMCk7Ci0gICAgICAgICAgICBiLT5jb21wID0gMDsKLSAgICAgICAgICAgIGItPnJlZlswXSA9IHMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtiLT5zZWdfaWRdLnJlZl92YWwgLSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmVhZCBjb21wX3ByZWQgZmxhZwotICAgICAgICAgICAgaWYgKHMtPnMuaC5jb21wcHJlZG1vZGUgIT0gUFJFRF9TV0lUQ0hBQkxFKSB7Ci0gICAgICAgICAgICAgICAgYi0+Y29tcCA9IHMtPnMuaC5jb21wcHJlZG1vZGUgPT0gUFJFRF9DT01QUkVGOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgYzsKLQotICAgICAgICAgICAgICAgIC8vIEZJWE1FIGFkZCBpbnRyYSBhcyByZWY9MHhmZiAob3IgLTEpIHRvIG1ha2UgdGhlc2UgZWFzaWVyPwotICAgICAgICAgICAgICAgIGlmIChoYXZlX2EpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0gJiYgcy0+bGVmdF9jb21wX2N0eFtyb3c3XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDIgKyAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gcy0+cy5oLmZpeGNvbXByZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5sZWZ0X2NvbXBfY3R4W3JvdzddKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDIgKyAocy0+YWJvdmVfaW50cmFfY3R4W2NvbF0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gcy0+cy5oLmZpeGNvbXByZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKCFzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IHMtPnMuaC5maXhjb21wcmVmKSBeCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZWZ0X3JlZl9jdHhbcm93ICYgN10gPT0gcy0+cy5oLmZpeGNvbXByZWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0gPyAzIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICghcy0+YWJvdmVfaW50cmFfY3R4W2NvbF0gJiYgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IHMtPnMuaC5maXhjb21wcmVmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZV9sKSB7Ci0gICAgICAgICAgICAgICAgICAgIGMgPSBzLT5sZWZ0X2NvbXBfY3R4W3JvdzddID8gMyA6Ci0gICAgICAgICAgICAgICAgICAgICghcy0+bGVmdF9pbnRyYV9jdHhbcm93N10gJiYgcy0+bGVmdF9yZWZfY3R4W3JvdzddID09IHMtPnMuaC5maXhjb21wcmVmKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYi0+Y29tcCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAuY29tcFtjXSk7Ci0gICAgICAgICAgICAgICAgcy0+Y291bnRzLmNvbXBbY11bYi0+Y29tcF0rKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gcmVhZCBhY3R1YWwgcmVmZXJlbmNlcwotICAgICAgICAgICAgLy8gRklYTUUgcHJvYmFibHkgY2FjaGUgYSBmZXcgdmFyaWFibGVzIGhlcmUgdG8gcHJldmVudCByZXBldGl0aXZlCi0gICAgICAgICAgICAvLyBtZW1vcnkgYWNjZXNzZXMgYmVsb3cKLSAgICAgICAgICAgIGlmIChiLT5jb21wKSAvKiB0d28gcmVmZXJlbmNlcyAqLyB7Ci0gICAgICAgICAgICAgICAgaW50IGZpeF9pZHggPSBzLT5zLmguc2lnbmJpYXNbcy0+cy5oLmZpeGNvbXByZWZdLCB2YXJfaWR4ID0gIWZpeF9pZHgsIGMsIGJpdDsKLQotICAgICAgICAgICAgICAgIGItPnJlZltmaXhfaWR4XSA9IHMtPnMuaC5maXhjb21wcmVmOwotICAgICAgICAgICAgICAgIC8vIEZJWE1FIGNhbiB0aGlzIGNvZGVibG9iIGJlIHJlcGxhY2VkIGJ5IHNvbWUgc29ydCBvZiBMVVQ/Ci0gICAgICAgICAgICAgICAgaWYgKGhhdmVfYSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaGF2ZV9sKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWJvdmVfaW50cmFfY3R4W2NvbF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDEgKyAyICogKHMtPmxlZnRfcmVmX2N0eFtyb3c3XSAhPSBzLT5zLmgudmFyY29tcHJlZlsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxICsgMiAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVmbCA9IHMtPmxlZnRfcmVmX2N0eFtyb3c3XSwgcmVmYSA9IHMtPmFib3ZlX3JlZl9jdHhbY29sXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZsID09IHJlZmEgJiYgcmVmYSA9PSBzLT5zLmgudmFyY29tcHJlZlsxXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5sZWZ0X2NvbXBfY3R4W3JvdzddICYmICFzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVmYSA9PSBzLT5zLmguZml4Y29tcHJlZiAmJiByZWZsID09IHMtPnMuaC52YXJjb21wcmVmWzBdKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlZmwgPT0gcy0+cy5oLmZpeGNvbXByZWYgJiYgcmVmYSA9PSBzLT5zLmgudmFyY29tcHJlZlswXSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChyZWZhID09IHJlZmwpID8gMyA6IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5sZWZ0X2NvbXBfY3R4W3JvdzddKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZhID09IHMtPnMuaC52YXJjb21wcmVmWzFdICYmIHJlZmwgIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChyZWZsID09IHMtPnMuaC52YXJjb21wcmVmWzFdICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmEgIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pID8gMiA6IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZsID09IHMtPnMuaC52YXJjb21wcmVmWzFdICYmIHJlZmEgIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChyZWZhID09IHMtPnMuaC52YXJjb21wcmVmWzFdICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmwgIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pID8gMiA6IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKHJlZmwgPT0gcmVmYSkgPyA0IDogMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWJvdmVfaW50cmFfY3R4W2NvbF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+YWJvdmVfY29tcF9jdHhbY29sXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmFib3ZlX3JlZl9jdHhbY29sXSAhPSBzLT5zLmgudmFyY29tcHJlZlsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzICogKHMtPmFib3ZlX3JlZl9jdHhbY29sXSAhPSBzLT5zLmgudmFyY29tcHJlZlsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhdmVfbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmxlZnRfcmVmX2N0eFtyb3c3XSAhPSBzLT5zLmgudmFyY29tcHJlZlsxXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gMyAqIChzLT5sZWZ0X3JlZl9jdHhbcm93N10gIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYyA9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAuY29tcF9yZWZbY10pOwotICAgICAgICAgICAgICAgIGItPnJlZlt2YXJfaWR4XSA9IHMtPnMuaC52YXJjb21wcmVmW2JpdF07Ci0gICAgICAgICAgICAgICAgcy0+Y291bnRzLmNvbXBfcmVmW2NdW2JpdF0rKzsKLSAgICAgICAgICAgIH0gZWxzZSAvKiBzaW5nbGUgcmVmZXJlbmNlICovIHsKLSAgICAgICAgICAgICAgICBpbnQgYml0LCBjOwotCi0gICAgICAgICAgICAgICAgaWYgKGhhdmVfYSAmJiAhcy0+YWJvdmVfaW50cmFfY3R4W2NvbF0pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfbCAmJiAhcy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5sZWZ0X2NvbXBfY3R4W3JvdzddKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDEgKyAoIXMtPnMuaC5maXhjb21wcmVmIHx8ICFzLT5sZWZ0X3JlZl9jdHhbcm93N10gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXMtPmFib3ZlX3JlZl9jdHhbY29sXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICgzICogIXMtPmFib3ZlX3JlZl9jdHhbY29sXSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzLT5zLmguZml4Y29tcHJlZiB8fCAhcy0+bGVmdF9yZWZfY3R4W3JvdzddKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gKDMgKiAhcy0+bGVmdF9yZWZfY3R4W3JvdzddKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcy0+cy5oLmZpeGNvbXByZWYgfHwgIXMtPmFib3ZlX3JlZl9jdHhbY29sXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyICogIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSArIDIgKiAhcy0+YWJvdmVfcmVmX2N0eFtjb2xdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArICghcy0+cy5oLmZpeGNvbXByZWYgfHwgIXMtPmFib3ZlX3JlZl9jdHhbY29sXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqICghcy0+YWJvdmVfcmVmX2N0eFtjb2xdKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZV9sICYmICFzLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxICsgKCFzLT5zLmguZml4Y29tcHJlZiB8fCAhcy0+bGVmdF9yZWZfY3R4W3JvdzddKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKCFzLT5sZWZ0X3JlZl9jdHhbcm93N10pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYyA9IDI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKCZzLT5jLCBzLT5wcm9iLnAuc2luZ2xlX3JlZltjXVswXSk7Ci0gICAgICAgICAgICAgICAgcy0+Y291bnRzLnNpbmdsZV9yZWZbY11bMF1bYml0XSsrOwotICAgICAgICAgICAgICAgIGlmICghYml0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGItPnJlZlswXSA9IDA7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY2FuIHRoaXMgY29kZWJsb2IgYmUgcmVwbGFjZWQgYnkgc29tZSBzb3J0IG9mIExVVD8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfYSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWJvdmVfaW50cmFfY3R4W2NvbF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxICsgMiAqIChzLT5zLmguZml4Y29tcHJlZiA9PSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5hYm92ZV9yZWZfY3R4W2NvbF0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxICsgMiAqIChzLT5zLmguZml4Y29tcHJlZiA9PSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5sZWZ0X3JlZl9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQgKiAocy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5sZWZ0X2NvbXBfY3R4W3JvdzddKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+bGVmdF9yZWZfY3R4W3JvdzddID09IHMtPmFib3ZlX3JlZl9jdHhbY29sXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzICogKHMtPnMuaC5maXhjb21wcmVmID09IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5sZWZ0X3JlZl9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxICsgMiAqIChzLT5zLmguZml4Y29tcHJlZiA9PSAxIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMgKiAocy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zLmguZml4Y29tcHJlZiA9PSAxIHx8IHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+bGVmdF9jb21wX2N0eFtyb3c3XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPmFib3ZlX3JlZl9jdHhbY29sXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDEgKyAyICogKHMtPnMuaC5maXhjb21wcmVmID09IDEgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMyAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gMSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnMuaC5maXhjb21wcmVmID09IDEgfHwgcy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcy0+YWJvdmVfcmVmX2N0eFtjb2xdKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcy0+bGVmdF9yZWZfY3R4W3JvdzddKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmxlZnRfcmVmX2N0eFtyb3c3XSA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXMtPmxlZnRfcmVmX2N0eFtyb3c3XSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDIgKiAocy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWJvdmVfaW50cmFfY3R4W2NvbF0gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzLT5hYm92ZV9jb21wX2N0eFtjb2xdICYmICFzLT5hYm92ZV9yZWZfY3R4W2NvbF0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+YWJvdmVfY29tcF9jdHhbY29sXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMyAqIChzLT5zLmguZml4Y29tcHJlZiA9PSAxIHx8IHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhhdmVfbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmxlZnRfaW50cmFfY3R4W3JvdzddIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzLT5sZWZ0X2NvbXBfY3R4W3JvdzddICYmICFzLT5sZWZ0X3JlZl9jdHhbcm93N10pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMyAqIChzLT5zLmguZml4Y29tcHJlZiA9PSAxIHx8IHMtPmxlZnRfcmVmX2N0eFtyb3c3XSA9PSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQgKiAocy0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYml0ID0gdnA1Nl9yYWNfZ2V0X3Byb2IoJnMtPmMsIHMtPnByb2IucC5zaW5nbGVfcmVmW2NdWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgcy0+Y291bnRzLnNpbmdsZV9yZWZbY11bMV1bYml0XSsrOwotICAgICAgICAgICAgICAgICAgICBiLT5yZWZbMF0gPSAxICsgYml0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiLT5icyA8PSBCU184eDgpIHsKLSAgICAgICAgICAgIGlmIChzLT5zLmguc2VnbWVudGF0aW9uLmVuYWJsZWQgJiYgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ItPnNlZ19pZF0uc2tpcF9lbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgYi0+bW9kZVswXSA9IGItPm1vZGVbMV0gPSBiLT5tb2RlWzJdID0gYi0+bW9kZVszXSA9IFpFUk9NVjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2ZmWzEwXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgMywgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMAotICAgICAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIG5lZWRzIHRvIHVzZSB0aGUgTFVUIHRhYmxlcyBmcm9tIGZpbmRfcmVmX212cwotICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugbm90IGFsbCBhcmUgLTEsMC8wLC0xCi0gICAgICAgICAgICAgICAgaW50IGMgPSBpbnRlcl9tb2RlX2N0eF9sdXRbcy0+YWJvdmVfbW9kZV9jdHhbY29sICsgb2ZmW2ItPmJzXV1dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcy0+bGVmdF9tb2RlX2N0eFtyb3c3ICsgb2ZmW2ItPmJzXV1dOwotCi0gICAgICAgICAgICAgICAgYi0+bW9kZVswXSA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9pbnRlcl9tb2RlX3RyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbY10pOwotICAgICAgICAgICAgICAgIGItPm1vZGVbMV0gPSBiLT5tb2RlWzJdID0gYi0+bW9kZVszXSA9IGItPm1vZGVbMF07Ci0gICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X21vZGVbY11bYi0+bW9kZVswXSAtIDEwXSsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHMtPnMuaC5maWx0ZXJtb2RlID09IEZJTFRFUl9TV0lUQ0hBQkxFKSB7Ci0gICAgICAgICAgICBpbnQgYzsKLQotICAgICAgICAgICAgaWYgKGhhdmVfYSAmJiBzLT5hYm92ZV9tb2RlX2N0eFtjb2xdID49IE5FQVJFU1RNVikgewotICAgICAgICAgICAgICAgIGlmIChoYXZlX2wgJiYgcy0+bGVmdF9tb2RlX2N0eFtyb3c3XSA+PSBORUFSRVNUTVYpIHsKLSAgICAgICAgICAgICAgICAgICAgYyA9IHMtPmFib3ZlX2ZpbHRlcl9jdHhbY29sXSA9PSBzLT5sZWZ0X2ZpbHRlcl9jdHhbcm93N10gPwotICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGVmdF9maWx0ZXJfY3R4W3JvdzddIDogMzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjID0gcy0+YWJvdmVfZmlsdGVyX2N0eFtjb2xdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZV9sICYmIHMtPmxlZnRfbW9kZV9jdHhbcm93N10gPj0gTkVBUkVTVE1WKSB7Ci0gICAgICAgICAgICAgICAgYyA9IHMtPmxlZnRfZmlsdGVyX2N0eFtyb3c3XTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYyA9IDM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbHRlcl9pZCA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9maWx0ZXJfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLmZpbHRlcltjXSk7Ci0gICAgICAgICAgICBzLT5jb3VudHMuZmlsdGVyW2NdW2ZpbHRlcl9pZF0rKzsKLSAgICAgICAgICAgIGItPmZpbHRlciA9IHZwOV9maWx0ZXJfbHV0W2ZpbHRlcl9pZF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiLT5maWx0ZXIgPSBzLT5zLmguZmlsdGVybW9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiLT5icyA+IEJTXzh4OCkgewotICAgICAgICAgICAgaW50IGMgPSBpbnRlcl9tb2RlX2N0eF9sdXRbcy0+YWJvdmVfbW9kZV9jdHhbY29sXV1bcy0+bGVmdF9tb2RlX2N0eFtyb3c3XV07Ci0KLSAgICAgICAgICAgIGItPm1vZGVbMF0gPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfaW50ZXJfbW9kZV90cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbY10pOwotICAgICAgICAgICAgcy0+Y291bnRzLm12X21vZGVbY11bYi0+bW9kZVswXSAtIDEwXSsrOwotICAgICAgICAgICAgZmlsbF9tdihzLCBiLT5tdlswXSwgYi0+bW9kZVswXSwgMCk7Ci0KLSAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU184eDQpIHsKLSAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludGVyX21vZGVfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfbW9kZVtjXSk7Ci0gICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X21vZGVbY11bYi0+bW9kZVsxXSAtIDEwXSsrOwotICAgICAgICAgICAgICAgIGZpbGxfbXYocywgYi0+bXZbMV0sIGItPm1vZGVbMV0sIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gYi0+bW9kZVswXTsKLSAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzFdWzBdLCAmYi0+bXZbMF1bMF0pOwotICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMV1bMV0sICZiLT5tdlswXVsxXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU180eDgpIHsKLSAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludGVyX21vZGVfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfbW9kZVtjXSk7Ci0gICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X21vZGVbY11bYi0+bW9kZVsyXSAtIDEwXSsrOwotICAgICAgICAgICAgICAgIGZpbGxfbXYocywgYi0+bXZbMl0sIGItPm1vZGVbMl0sIDIpOwotCi0gICAgICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzh4NCkgewotICAgICAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gdnA4X3JhY19nZXRfdHJlZSgmcy0+YywgdnA5X2ludGVyX21vZGVfdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbY10pOwotICAgICAgICAgICAgICAgICAgICBzLT5jb3VudHMubXZfbW9kZVtjXVtiLT5tb2RlWzNdIC0gMTBdKys7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGxfbXYocywgYi0+bXZbM10sIGItPm1vZGVbM10sIDMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzJdOwotICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzNdWzBdLCAmYi0+bXZbMl1bMF0pOwotICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzNdWzFdLCAmYi0+bXZbMl1bMV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYi0+bW9kZVsyXSA9IGItPm1vZGVbMF07Ci0gICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlsyXVswXSwgJmItPm12WzBdWzBdKTsKLSAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzJdWzFdLCAmYi0+bXZbMF1bMV0pOwotICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzFdOwotICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbM11bMF0sICZiLT5tdlsxXVswXSk7Ci0gICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlszXVsxXSwgJmItPm12WzFdWzFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbGxfbXYocywgYi0+bXZbMF0sIGItPm1vZGVbMF0sIC0xKTsKLSAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMV1bMF0sICZiLT5tdlswXVswXSk7Ci0gICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzJdWzBdLCAmYi0+bXZbMF1bMF0pOwotICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlszXVswXSwgJmItPm12WzBdWzBdKTsKLSAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMV1bMV0sICZiLT5tdlswXVsxXSk7Ci0gICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzJdWzFdLCAmYi0+bXZbMF1bMV0pOwotICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlszXVsxXSwgJmItPm12WzBdWzFdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZyZWYgPSBiLT5yZWZbYi0+Y29tcCA/IHMtPnMuaC5zaWduYmlhc1tzLT5zLmgudmFyY29tcHJlZlswXV0gOiAwXTsKLSAgICB9Ci0KLSNpZiBIQVZFX0ZBU1RfNjRCSVQKLSNkZWZpbmUgU1BMQVRfQ1RYKHZhciwgdmFsLCBuKSBcCi0gICAgc3dpdGNoIChuKSB7IFwKLSAgICBjYXNlIDE6ICB2YXIgPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IFwKLSAgICBjYXNlIDI6ICBBVl9XTjE2QSgmdmFyLCB2YWwgKiAgICAgICAgICAgICAweDAxMDEpOyAgICAgYnJlYWs7IFwKLSAgICBjYXNlIDQ6ICBBVl9XTjMyQSgmdmFyLCB2YWwgKiAgICAgICAgIDB4MDEwMTAxMDEpOyAgICAgYnJlYWs7IFwKLSAgICBjYXNlIDg6ICBBVl9XTjY0QSgmdmFyLCB2YWwgKiAweDAxMDEwMTAxMDEwMTAxMDFVTEwpOyAgYnJlYWs7IFwKLSAgICBjYXNlIDE2OiB7IFwKLSAgICAgICAgdWludDY0X3QgdjY0ID0gdmFsICogMHgwMTAxMDEwMTAxMDEwMTAxVUxMOyBcCi0gICAgICAgIEFWX1dONjRBKCAgICAgICAgICAgICAgJnZhciwgICAgIHY2NCk7IFwKLSAgICAgICAgQVZfV042NEEoJigodWludDhfdCAqKSAmdmFyKVs4XSwgdjY0KTsgXAotICAgICAgICBicmVhazsgXAotICAgIH0gXAotICAgIH0KLSNlbHNlCi0jZGVmaW5lIFNQTEFUX0NUWCh2YXIsIHZhbCwgbikgXAotICAgIHN3aXRjaCAobikgeyBcCi0gICAgY2FzZSAxOiAgdmFyID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAotICAgIGNhc2UgMjogIEFWX1dOMTZBKCZ2YXIsIHZhbCAqICAgICAweDAxMDEpOyAgYnJlYWs7IFwKLSAgICBjYXNlIDQ6ICBBVl9XTjMyQSgmdmFyLCB2YWwgKiAweDAxMDEwMTAxKTsgIGJyZWFrOyBcCi0gICAgY2FzZSA4OiB7IFwKLSAgICAgICAgdWludDMyX3QgdjMyID0gdmFsICogMHgwMTAxMDEwMTsgXAotICAgICAgICBBVl9XTjMyQSggICAgICAgICAgICAgICZ2YXIsICAgICB2MzIpOyBcCi0gICAgICAgIEFWX1dOMzJBKCYoKHVpbnQ4X3QgKikgJnZhcilbNF0sIHYzMik7IFwKLSAgICAgICAgYnJlYWs7IFwKLSAgICB9IFwKLSAgICBjYXNlIDE2OiB7IFwKLSAgICAgICAgdWludDMyX3QgdjMyID0gdmFsICogMHgwMTAxMDEwMTsgXAotICAgICAgICBBVl9XTjMyQSggICAgICAgICAgICAgICZ2YXIsICAgICAgdjMyKTsgXAotICAgICAgICBBVl9XTjMyQSgmKCh1aW50OF90ICopICZ2YXIpWzRdLCAgdjMyKTsgXAotICAgICAgICBBVl9XTjMyQSgmKCh1aW50OF90ICopICZ2YXIpWzhdLCAgdjMyKTsgXAotICAgICAgICBBVl9XTjMyQSgmKCh1aW50OF90ICopICZ2YXIpWzEyXSwgdjMyKTsgXAotICAgICAgICBicmVhazsgXAotICAgIH0gXAotICAgIH0KLSNlbmRpZgotCi0gICAgc3dpdGNoIChid2hfdGFiWzFdW2ItPmJzXVswXSkgewotI2RlZmluZSBTRVRfQ1RYUyhkaXIsIG9mZiwgbikgXAotICAgIGRvIHsgXAotICAgICAgICBTUExBVF9DVFgocy0+ZGlyIyNfc2tpcF9jdHhbb2ZmXSwgICAgICBiLT5za2lwLCAgICAgICAgICBuKTsgXAotICAgICAgICBTUExBVF9DVFgocy0+ZGlyIyNfdHhmbV9jdHhbb2ZmXSwgICAgICBiLT50eCwgICAgICAgICAgICBuKTsgXAotICAgICAgICBTUExBVF9DVFgocy0+ZGlyIyNfcGFydGl0aW9uX2N0eFtvZmZdLCBkaXIjI19jdHhbYi0+YnNdLCBuKTsgXAotICAgICAgICBpZiAoIXMtPnMuaC5rZXlmcmFtZSAmJiAhcy0+cy5oLmludHJhb25seSkgeyBcCi0gICAgICAgICAgICBTUExBVF9DVFgocy0+ZGlyIyNfaW50cmFfY3R4W29mZl0sIGItPmludHJhLCAgIG4pOyBcCi0gICAgICAgICAgICBTUExBVF9DVFgocy0+ZGlyIyNfY29tcF9jdHhbb2ZmXSwgIGItPmNvbXAsICAgIG4pOyBcCi0gICAgICAgICAgICBTUExBVF9DVFgocy0+ZGlyIyNfbW9kZV9jdHhbb2ZmXSwgIGItPm1vZGVbM10sIG4pOyBcCi0gICAgICAgICAgICBpZiAoIWItPmludHJhKSB7IFwKLSAgICAgICAgICAgICAgICBTUExBVF9DVFgocy0+ZGlyIyNfcmVmX2N0eFtvZmZdLCB2cmVmLCBuKTsgXAotICAgICAgICAgICAgICAgIGlmIChzLT5zLmguZmlsdGVybW9kZSA9PSBGSUxURVJfU1dJVENIQUJMRSkgeyBcCi0gICAgICAgICAgICAgICAgICAgIFNQTEFUX0NUWChzLT5kaXIjI19maWx0ZXJfY3R4W29mZl0sIGZpbHRlcl9pZCwgbik7IFwKLSAgICAgICAgICAgICAgICB9IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IFwKLSAgICB9IHdoaWxlICgwKQotICAgIGNhc2UgMTogU0VUX0NUWFMoYWJvdmUsIGNvbCwgMSk7IGJyZWFrOwotICAgIGNhc2UgMjogU0VUX0NUWFMoYWJvdmUsIGNvbCwgMik7IGJyZWFrOwotICAgIGNhc2UgNDogU0VUX0NUWFMoYWJvdmUsIGNvbCwgNCk7IGJyZWFrOwotICAgIGNhc2UgODogU0VUX0NUWFMoYWJvdmUsIGNvbCwgOCk7IGJyZWFrOwotICAgIH0KLSAgICBzd2l0Y2ggKGJ3aF90YWJbMV1bYi0+YnNdWzFdKSB7Ci0gICAgY2FzZSAxOiBTRVRfQ1RYUyhsZWZ0LCByb3c3LCAxKTsgYnJlYWs7Ci0gICAgY2FzZSAyOiBTRVRfQ1RYUyhsZWZ0LCByb3c3LCAyKTsgYnJlYWs7Ci0gICAgY2FzZSA0OiBTRVRfQ1RYUyhsZWZ0LCByb3c3LCA0KTsgYnJlYWs7Ci0gICAgY2FzZSA4OiBTRVRfQ1RYUyhsZWZ0LCByb3c3LCA4KTsgYnJlYWs7Ci0gICAgfQotI3VuZGVmIFNQTEFUX0NUWAotI3VuZGVmIFNFVF9DVFhTCi0KLSAgICBpZiAoIXMtPnMuaC5rZXlmcmFtZSAmJiAhcy0+cy5oLmludHJhb25seSkgewotICAgICAgICBpZiAoYi0+YnMgPiBCU184eDgpIHsKLSAgICAgICAgICAgIGludCBtdjAgPSBBVl9STjMyQSgmYi0+bXZbM11bMF0pLCBtdjEgPSBBVl9STjMyQSgmYi0+bXZbM11bMV0pOwotCi0gICAgICAgICAgICBBVl9DT1BZMzIoJnMtPmxlZnRfbXZfY3R4W3JvdzcgKiAyICsgMF1bMF0sICZiLT5tdlsxXVswXSk7Ci0gICAgICAgICAgICBBVl9DT1BZMzIoJnMtPmxlZnRfbXZfY3R4W3JvdzcgKiAyICsgMF1bMV0sICZiLT5tdlsxXVsxXSk7Ci0gICAgICAgICAgICBBVl9XTjMyQSgmcy0+bGVmdF9tdl9jdHhbcm93NyAqIDIgKyAxXVswXSwgbXYwKTsKLSAgICAgICAgICAgIEFWX1dOMzJBKCZzLT5sZWZ0X212X2N0eFtyb3c3ICogMiArIDFdWzFdLCBtdjEpOwotICAgICAgICAgICAgQVZfQ09QWTMyKCZzLT5hYm92ZV9tdl9jdHhbY29sICogMiArIDBdWzBdLCAmYi0+bXZbMl1bMF0pOwotICAgICAgICAgICAgQVZfQ09QWTMyKCZzLT5hYm92ZV9tdl9jdHhbY29sICogMiArIDBdWzFdLCAmYi0+bXZbMl1bMV0pOwotICAgICAgICAgICAgQVZfV04zMkEoJnMtPmFib3ZlX212X2N0eFtjb2wgKiAyICsgMV1bMF0sIG12MCk7Ci0gICAgICAgICAgICBBVl9XTjMyQSgmcy0+YWJvdmVfbXZfY3R4W2NvbCAqIDIgKyAxXVsxXSwgbXYxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCBuLCBtdjAgPSBBVl9STjMyQSgmYi0+bXZbM11bMF0pLCBtdjEgPSBBVl9STjMyQSgmYi0+bXZbM11bMV0pOwotCi0gICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgdzQgKiAyOyBuKyspIHsKLSAgICAgICAgICAgICAgICBBVl9XTjMyQSgmcy0+YWJvdmVfbXZfY3R4W2NvbCAqIDIgKyBuXVswXSwgbXYwKTsKLSAgICAgICAgICAgICAgICBBVl9XTjMyQSgmcy0+YWJvdmVfbXZfY3R4W2NvbCAqIDIgKyBuXVsxXSwgbXYxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBoNCAqIDI7IG4rKykgewotICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZzLT5sZWZ0X212X2N0eFtyb3c3ICogMiArIG5dWzBdLCBtdjApOwotICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZzLT5sZWZ0X212X2N0eFtyb3c3ICogMiArIG5dWzFdLCBtdjEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRklYTUUga2luZGEgdWdseQotICAgIGZvciAoeSA9IDA7IHkgPCBoNDsgeSsrKSB7Ci0gICAgICAgIGludCB4LCBvID0gKHJvdyArIHkpICogcy0+c2JfY29scyAqIDggKyBjb2w7Ci0gICAgICAgIHN0cnVjdCBWUDltdnJlZlBhaXIgKm12ID0gJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0ubXZbb107Ci0KLSAgICAgICAgaWYgKGItPmludHJhKSB7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzQ7IHgrKykgewotICAgICAgICAgICAgICAgIG12W3hdLnJlZlswXSA9Ci0gICAgICAgICAgICAgICAgbXZbeF0ucmVmWzFdID0gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYi0+Y29tcCkgewotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc0OyB4KyspIHsKLSAgICAgICAgICAgICAgICBtdlt4XS5yZWZbMF0gPSBiLT5yZWZbMF07Ci0gICAgICAgICAgICAgICAgbXZbeF0ucmVmWzFdID0gYi0+cmVmWzFdOwotICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmbXZbeF0ubXZbMF0sICZiLT5tdlszXVswXSk7Ci0gICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZtdlt4XS5tdlsxXSwgJmItPm12WzNdWzFdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3NDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgbXZbeF0ucmVmWzBdID0gYi0+cmVmWzBdOwotICAgICAgICAgICAgICAgIG12W3hdLnJlZlsxXSA9IC0xOwotICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmbXZbeF0ubXZbMF0sICZiLT5tdlszXVswXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIEZJWE1FIG1lcmdlIGNudC9lb2IgYXJndW1lbnRzPwotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50Ci1kZWNvZGVfY29lZmZzX2JfZ2VuZXJpYyhWUDU2UmFuZ2VDb2RlciAqYywgaW50MTZfdCAqY29lZiwgaW50IG5fY29lZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3R4MzJ4MzIsIGludCBpczhiaXRzcGVycGl4ZWwsIGludCBicHAsIHVuc2lnbmVkICgqY250KVs2XVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICgqZW9iKVs2XVsyXSwgdWludDhfdCAoKnApWzZdWzExXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBubnosIGNvbnN0IGludDE2X3QgKnNjYW4sIGNvbnN0IGludDE2X3QgKCpuYilbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpiYW5kX2NvdW50cywgY29uc3QgaW50MTZfdCAqcW11bCkKLXsKLSAgICBpbnQgaSA9IDAsIGJhbmQgPSAwLCBiYW5kX2xlZnQgPSBiYW5kX2NvdW50c1tiYW5kXTsKLSAgICB1aW50OF90ICp0cCA9IHBbMF1bbm56XTsKLSAgICB1aW50OF90IGNhY2hlWzEwMjRdOwotCi0gICAgZG8gewotICAgICAgICBpbnQgdmFsLCByYzsKLQotICAgICAgICB2YWwgPSB2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzBdKTsgLy8gZW9iCi0gICAgICAgIGVvYltiYW5kXVtubnpdW3ZhbF0rKzsKLSAgICAgICAgaWYgKCF2YWwpCi0gICAgICAgICAgICBicmVhazsKLQotICAgIHNraXBfZW9iOgotICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbMV0pKSB7IC8vIHplcm8KLSAgICAgICAgICAgIGNudFtiYW5kXVtubnpdWzBdKys7Ci0gICAgICAgICAgICBpZiAoIS0tYmFuZF9sZWZ0KQotICAgICAgICAgICAgICAgIGJhbmRfbGVmdCA9IGJhbmRfY291bnRzWysrYmFuZF07Ci0gICAgICAgICAgICBjYWNoZVtzY2FuW2ldXSA9IDA7Ci0gICAgICAgICAgICBubnogPSAoMSArIGNhY2hlW25iW2ldWzBdXSArIGNhY2hlW25iW2ldWzFdXSkgPj4gMTsKLSAgICAgICAgICAgIHRwID0gcFtiYW5kXVtubnpdOwotICAgICAgICAgICAgaWYgKCsraSA9PSBuX2NvZWZmcykKLSAgICAgICAgICAgICAgICBicmVhazsgLy9pbnZhbGlkIGlucHV0OyBibG9ja3Mgc2hvdWxkIGVuZCB3aXRoIEVPQgotICAgICAgICAgICAgZ290byBza2lwX2VvYjsKLSAgICAgICAgfQotCi0gICAgICAgIHJjID0gc2NhbltpXTsKLSAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzJdKSkgeyAvLyBvbmUKLSAgICAgICAgICAgIGNudFtiYW5kXVtubnpdWzFdKys7Ci0gICAgICAgICAgICB2YWwgPSAxOwotICAgICAgICAgICAgY2FjaGVbcmNdID0gMTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGZpbGwgaW4gcFszLTEwXSAobW9kZWwgZmlsbCkgLSBvbmx5IG9uY2UgcGVyIGZyYW1lIGZvciBlYWNoIHBvcwotICAgICAgICAgICAgaWYgKCF0cFszXSkKLSAgICAgICAgICAgICAgICBtZW1jcHkoJnRwWzNdLCB2cDlfbW9kZWxfcGFyZXRvOFt0cFsyXV0sIDgpOwotCi0gICAgICAgICAgICBjbnRbYmFuZF1bbm56XVsyXSsrOwotICAgICAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzNdKSkgeyAvLyAyLCAzLCA0Ci0gICAgICAgICAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzRdKSkgewotICAgICAgICAgICAgICAgICAgICBjYWNoZVtyY10gPSB2YWwgPSAyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IDMgKyB2cDU2X3JhY19nZXRfcHJvYihjLCB0cFs1XSk7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlW3JjXSA9IDM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICghdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB0cFs2XSkpIHsgLy8gY2F0MS8yCi0gICAgICAgICAgICAgICAgY2FjaGVbcmNdID0gNDsKLSAgICAgICAgICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbN10pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IDUgKyB2cDU2X3JhY19nZXRfcHJvYihjLCAxNTkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCAgPSA3ICsgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE2NSkgPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgIHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0NSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsgLy8gY2F0IDMtNgotICAgICAgICAgICAgICAgIGNhY2hlW3JjXSA9IDU7Ci0gICAgICAgICAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzhdKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbOV0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgID0gMTEgKyAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTczKSA8PCAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNDgpIDw8IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgIHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgID0gMTkgKyAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTc2KSA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNTUpIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MCkgPDwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAgdnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTM1KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbMTBdKSkgewotICAgICAgICAgICAgICAgICAgICB2YWwgID0gMzUgKyAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTgwKSA8PCA0KTsKLSAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE1NykgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNDEpIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTM0KSA8PCAxKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgIHZwNTZfcmFjX2dldF9wcm9iKGMsIDEzMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsID0gNjc7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghaXM4Yml0c3BlcnBpeGVsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnBwID09IDEyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9IHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1NSkgPDwgMTc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9IHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1NSkgPDwgMTY7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICh2cDU2X3JhY19nZXRfcHJvYihjLCAyNTUpIDw8IDE1KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1NSkgPDwgMTQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAyNTQpIDw8IDEzKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1NCkgPDwgMTIpOwotICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMjU0KSA8PCAxMSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAyNTIpIDw8IDEwKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI0OSkgPDwgOSk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAyNDMpIDw8IDgpOwotICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMjMwKSA8PCA3KTsKLSAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE5NikgPDwgNik7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNzcpIDw8IDUpOwotICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTUzKSA8PCA0KTsKLSAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MCkgPDwgMyk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxMzMpIDw8IDIpOwotICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTMwKSA8PCAxKTsKLSAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgIHZwNTZfcmFjX2dldF9wcm9iKGMsIDEyOSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZGVmaW5lIFNUT1JFX0NPRUYoYywgaSwgdikgZG8geyBcCi0gICAgaWYgKGlzOGJpdHNwZXJwaXhlbCkgeyBcCi0gICAgICAgIGNbaV0gPSB2OyBcCi0gICAgfSBlbHNlIHsgXAotICAgICAgICBBVl9XTjMyQSgmY1tpICogMl0sIHYpOyBcCi0gICAgfSBcCi19IHdoaWxlICgwKQotICAgICAgICBpZiAoIS0tYmFuZF9sZWZ0KQotICAgICAgICAgICAgYmFuZF9sZWZ0ID0gYmFuZF9jb3VudHNbKytiYW5kXTsKLSAgICAgICAgaWYgKGlzX3R4MzJ4MzIpCi0gICAgICAgICAgICBTVE9SRV9DT0VGKGNvZWYsIHJjLCAoKHZwOF9yYWNfZ2V0KGMpID8gLXZhbCA6IHZhbCkgKiBxbXVsWyEhaV0pIC8gMik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFNUT1JFX0NPRUYoY29lZiwgcmMsICh2cDhfcmFjX2dldChjKSA/IC12YWwgOiB2YWwpICogcW11bFshIWldKTsKLSAgICAgICAgbm56ID0gKDEgKyBjYWNoZVtuYltpXVswXV0gKyBjYWNoZVtuYltpXVsxXV0pID4+IDE7Ci0gICAgICAgIHRwID0gcFtiYW5kXVtubnpdOwotICAgIH0gd2hpbGUgKCsraSA8IG5fY29lZmZzKTsKLQotICAgIHJldHVybiBpOwotfQotCi1zdGF0aWMgaW50IGRlY29kZV9jb2VmZnNfYl84YnBwKFZQOUNvbnRleHQgKnMsIGludDE2X3QgKmNvZWYsIGludCBuX2NvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKCpjbnQpWzZdWzNdLCB1bnNpZ25lZCAoKmVvYilbNl1bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKCpwKVs2XVsxMV0sIGludCBubnosIGNvbnN0IGludDE2X3QgKnNjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKCpuYilbMl0sIGNvbnN0IGludDE2X3QgKmJhbmRfY291bnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpxbXVsKQotewotICAgIHJldHVybiBkZWNvZGVfY29lZmZzX2JfZ2VuZXJpYygmcy0+YywgY29lZiwgbl9jb2VmZnMsIDAsIDEsIDgsIGNudCwgZW9iLCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubnosIHNjYW4sIG5iLCBiYW5kX2NvdW50cywgcW11bCk7Ci19Ci0KLXN0YXRpYyBpbnQgZGVjb2RlX2NvZWZmc19iMzJfOGJwcChWUDlDb250ZXh0ICpzLCBpbnQxNl90ICpjb2VmLCBpbnQgbl9jb2VmZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKCpjbnQpWzZdWzNdLCB1bnNpZ25lZCAoKmVvYilbNl1bMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAoKnApWzZdWzExXSwgaW50IG5ueiwgY29uc3QgaW50MTZfdCAqc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICgqbmIpWzJdLCBjb25zdCBpbnQxNl90ICpiYW5kX2NvdW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpxbXVsKQotewotICAgIHJldHVybiBkZWNvZGVfY29lZmZzX2JfZ2VuZXJpYygmcy0+YywgY29lZiwgbl9jb2VmZnMsIDEsIDEsIDgsIGNudCwgZW9iLCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubnosIHNjYW4sIG5iLCBiYW5kX2NvdW50cywgcW11bCk7Ci19Ci0KLXN0YXRpYyBpbnQgZGVjb2RlX2NvZWZmc19iXzE2YnBwKFZQOUNvbnRleHQgKnMsIGludDE2X3QgKmNvZWYsIGludCBuX2NvZWZmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICgqY250KVs2XVszXSwgdW5zaWduZWQgKCplb2IpWzZdWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAoKnApWzZdWzExXSwgaW50IG5ueiwgY29uc3QgaW50MTZfdCAqc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKCpuYilbMl0sIGNvbnN0IGludDE2X3QgKmJhbmRfY291bnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqcW11bCkKLXsKLSAgICByZXR1cm4gZGVjb2RlX2NvZWZmc19iX2dlbmVyaWMoJnMtPmMsIGNvZWYsIG5fY29lZmZzLCAwLCAwLCBzLT5icHAsIGNudCwgZW9iLCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubnosIHNjYW4sIG5iLCBiYW5kX2NvdW50cywgcW11bCk7Ci19Ci0KLXN0YXRpYyBpbnQgZGVjb2RlX2NvZWZmc19iMzJfMTZicHAoVlA5Q29udGV4dCAqcywgaW50MTZfdCAqY29lZiwgaW50IG5fY29lZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAoKmNudClbNl1bM10sIHVuc2lnbmVkICgqZW9iKVs2XVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAoKnApWzZdWzExXSwgaW50IG5ueiwgY29uc3QgaW50MTZfdCAqc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAoKm5iKVsyXSwgY29uc3QgaW50MTZfdCAqYmFuZF9jb3VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnFtdWwpCi17Ci0gICAgcmV0dXJuIGRlY29kZV9jb2VmZnNfYl9nZW5lcmljKCZzLT5jLCBjb2VmLCBuX2NvZWZmcywgMSwgMCwgcy0+YnBwLCBjbnQsIGVvYiwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm56LCBzY2FuLCBuYiwgYmFuZF9jb3VudHMsIHFtdWwpOwotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGVjb2RlX2NvZWZmcyhBVkNvZGVjQ29udGV4dCAqY3R4LCBpbnQgaXM4Yml0c3BlcnBpeGVsKQotewotICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKLSAgICBWUDlCbG9jayAqYiA9IHMtPmI7Ci0gICAgaW50IHJvdyA9IHMtPnJvdywgY29sID0gcy0+Y29sOwotICAgIHVpbnQ4X3QgKCpwKVs2XVsxMV0gPSBzLT5wcm9iLmNvZWZbYi0+dHhdWzAgLyogeSAqL11bIWItPmludHJhXTsKLSAgICB1bnNpZ25lZCAoKmMpWzZdWzNdID0gcy0+Y291bnRzLmNvZWZbYi0+dHhdWzAgLyogeSAqL11bIWItPmludHJhXTsKLSAgICB1bnNpZ25lZCAoKmUpWzZdWzJdID0gcy0+Y291bnRzLmVvYltiLT50eF1bMCAvKiB5ICovXVshYi0+aW50cmFdOwotICAgIGludCB3NCA9IGJ3aF90YWJbMV1bYi0+YnNdWzBdIDw8IDEsIGg0ID0gYndoX3RhYlsxXVtiLT5ic11bMV0gPDwgMTsKLSAgICBpbnQgZW5kX3ggPSBGRk1JTigyICogKHMtPmNvbHMgLSBjb2wpLCB3NCk7Ci0gICAgaW50IGVuZF95ID0gRkZNSU4oMiAqIChzLT5yb3dzIC0gcm93KSwgaDQpOwotICAgIGludCBuLCBwbCwgeCwgeSwgcmVzOwotICAgIGludDE2X3QgKCpxbXVsKVsyXSA9IHMtPnMuaC5zZWdtZW50YXRpb24uZmVhdFtiLT5zZWdfaWRdLnFtdWw7Ci0gICAgaW50IHR4ID0gNCAqIHMtPnMuaC5sb3NzbGVzcyArIGItPnR4OwotICAgIGNvbnN0IGludDE2X3QgKiBjb25zdCAqeXNjYW5zID0gdnA5X3NjYW5zW3R4XTsKLSAgICBjb25zdCBpbnQxNl90ICgqIGNvbnN0ICp5bmJzKVsyXSA9IHZwOV9zY2Fuc19uYlt0eF07Ci0gICAgY29uc3QgaW50MTZfdCAqdXZzY2FuID0gdnA5X3NjYW5zW2ItPnV2dHhdW0RDVF9EQ1RdOwotICAgIGNvbnN0IGludDE2X3QgKCp1dm5iKVsyXSA9IHZwOV9zY2Fuc19uYltiLT51dnR4XVtEQ1RfRENUXTsKLSAgICB1aW50OF90ICphID0gJnMtPmFib3ZlX3lfbm56X2N0eFtjb2wgKiAyXTsKLSAgICB1aW50OF90ICpsID0gJnMtPmxlZnRfeV9ubnpfY3R4Wyhyb3cgJiA3KSA8PCAxXTsKLSAgICBzdGF0aWMgY29uc3QgaW50MTZfdCBiYW5kX2NvdW50c1s0XVs4XSA9IHsKLSAgICAgICAgeyAxLCAyLCAzLCA0LCAgMywgICAxNiAtIDEzIH0sCi0gICAgICAgIHsgMSwgMiwgMywgNCwgMTEsICAgNjQgLSAyMSB9LAotICAgICAgICB7IDEsIDIsIDMsIDQsIDExLCAgMjU2IC0gMjEgfSwKLSAgICAgICAgeyAxLCAyLCAzLCA0LCAxMSwgMTAyNCAtIDIxIH0sCi0gICAgfTsKLSAgICBjb25zdCBpbnQxNl90ICp5X2JhbmRfY291bnRzID0gYmFuZF9jb3VudHNbYi0+dHhdOwotICAgIGNvbnN0IGludDE2X3QgKnV2X2JhbmRfY291bnRzID0gYmFuZF9jb3VudHNbYi0+dXZ0eF07Ci0gICAgaW50IGJ5dGVzcGVycGl4ZWwgPSBpczhiaXRzcGVycGl4ZWwgPyAxIDogMjsKLSAgICBpbnQgdG90YWxfY29lZmYgPSAwOwotCi0jZGVmaW5lIE1FUkdFKGxhLCBlbmQsIHN0ZXAsIHJkKSBcCi0gICAgZm9yIChuID0gMDsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCi0gICAgICAgIGxhW25dID0gISFyZCgmbGFbbl0pCi0jZGVmaW5lIE1FUkdFX0NUWChzdGVwLCByZCkgXAotICAgIGRvIHsgXAotICAgICAgICBNRVJHRShsLCBlbmRfeSwgc3RlcCwgcmQpOyBcCi0gICAgICAgIE1FUkdFKGEsIGVuZF94LCBzdGVwLCByZCk7IFwKLSAgICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIERFQ09ERV9ZX0NPRUZfTE9PUChzdGVwLCBtb2RlX2luZGV4LCB2KSBcCi0gICAgZm9yIChuID0gMCwgeSA9IDA7IHkgPCBlbmRfeTsgeSArPSBzdGVwKSB7IFwKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGVuZF94OyB4ICs9IHN0ZXAsIG4gKz0gc3RlcCAqIHN0ZXApIHsgXAotICAgICAgICAgICAgZW51bSBUeGZtVHlwZSB0eHRwID0gdnA5X2ludHJhX3R4Zm1fdHlwZVtiLT5tb2RlW21vZGVfaW5kZXhdXTsgXAotICAgICAgICAgICAgcmVzID0gKGlzOGJpdHNwZXJwaXhlbCA/IGRlY29kZV9jb2VmZnNfYiMjdiMjXzhicHAgOiBkZWNvZGVfY29lZmZzX2IjI3YjI18xNmJwcCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHMtPmJsb2NrICsgMTYgKiBuICogYnl0ZXNwZXJwaXhlbCwgMTYgKiBzdGVwICogc3RlcCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMsIGUsIHAsIGFbeF0gKyBsW3ldLCB5c2NhbnNbdHh0cF0sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bmJzW3R4dHBdLCB5X2JhbmRfY291bnRzLCBxbXVsWzBdKTsgXAotICAgICAgICAgICAgYVt4XSA9IGxbeV0gPSAhIXJlczsgXAotICAgICAgICAgICAgdG90YWxfY29lZmYgfD0gISFyZXM7IFwKLSAgICAgICAgICAgIGlmIChzdGVwID49IDQpIHsgXAotICAgICAgICAgICAgICAgIEFWX1dOMTZBKCZzLT5lb2Jbbl0sIHJlcyk7IFwKLSAgICAgICAgICAgIH0gZWxzZSB7IFwKLSAgICAgICAgICAgICAgICBzLT5lb2Jbbl0gPSByZXM7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IFwKLSAgICB9Ci0KLSNkZWZpbmUgU1BMQVQobGEsIGVuZCwgc3RlcCwgY29uZCkgXAotICAgIGlmIChzdGVwID09IDIpIHsgXAotICAgICAgICBmb3IgKG4gPSAxOyBuIDwgZW5kOyBuICs9IHN0ZXApIFwKLSAgICAgICAgICAgIGxhW25dID0gbGFbbiAtIDFdOyBcCi0gICAgfSBlbHNlIGlmIChzdGVwID09IDQpIHsgXAotICAgICAgICBpZiAoY29uZCkgeyBcCi0gICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZW5kOyBuICs9IHN0ZXApIFwKLSAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbGFbbl0sIGxhW25dICogMHgwMTAxMDEwMSk7IFwKLSAgICAgICAgfSBlbHNlIHsgXAotICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCi0gICAgICAgICAgICAgICAgbWVtc2V0KCZsYVtuICsgMV0sIGxhW25dLCBGRk1JTihlbmQgLSBuIC0gMSwgMykpOyBcCi0gICAgICAgIH0gXAotICAgIH0gZWxzZSAvKiBzdGVwID09IDggKi8geyBcCi0gICAgICAgIGlmIChjb25kKSB7IFwKLSAgICAgICAgICAgIGlmIChIQVZFX0ZBU1RfNjRCSVQpIHsgXAotICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBlbmQ7IG4gKz0gc3RlcCkgXAotICAgICAgICAgICAgICAgICAgICBBVl9XTjY0QSgmbGFbbl0sIGxhW25dICogMHgwMTAxMDEwMTAxMDEwMTAxVUxMKTsgXAotICAgICAgICAgICAgfSBlbHNlIHsgXAotICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBlbmQ7IG4gKz0gc3RlcCkgeyBcCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHYzMiA9IGxhW25dICogMHgwMTAxMDEwMTsgXAotICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbGFbbl0sICAgICB2MzIpOyBcCi0gICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZsYVtuICsgNF0sIHYzMik7IFwKLSAgICAgICAgICAgICAgICB9IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IGVsc2UgeyBcCi0gICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZW5kOyBuICs9IHN0ZXApIFwKLSAgICAgICAgICAgICAgICBtZW1zZXQoJmxhW24gKyAxXSwgbGFbbl0sIEZGTUlOKGVuZCAtIG4gLSAxLCA3KSk7IFwKLSAgICAgICAgfSBcCi0gICAgfQotI2RlZmluZSBTUExBVF9DVFgoc3RlcCkgXAotICAgIGRvIHsgXAotICAgICAgICBTUExBVChhLCBlbmRfeCwgc3RlcCwgZW5kX3ggPT0gdzQpOyBcCi0gICAgICAgIFNQTEFUKGwsIGVuZF95LCBzdGVwLCBlbmRfeSA9PSBoNCk7IFwKLSAgICB9IHdoaWxlICgwKQotCi0gICAgLyogeSB0b2tlbnMgKi8KLSAgICBzd2l0Y2ggKGItPnR4KSB7Ci0gICAgY2FzZSBUWF80WDQ6Ci0gICAgICAgIERFQ09ERV9ZX0NPRUZfTE9PUCgxLCBiLT5icyA+IEJTXzh4OCA/IG4gOiAwLCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFhfOFg4OgotICAgICAgICBNRVJHRV9DVFgoMiwgQVZfUk4xNkEpOwotICAgICAgICBERUNPREVfWV9DT0VGX0xPT1AoMiwgMCwpOwotICAgICAgICBTUExBVF9DVFgoMik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgVFhfMTZYMTY6Ci0gICAgICAgIE1FUkdFX0NUWCg0LCBBVl9STjMyQSk7Ci0gICAgICAgIERFQ09ERV9ZX0NPRUZfTE9PUCg0LCAwLCk7Ci0gICAgICAgIFNQTEFUX0NUWCg0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUWF8zMlgzMjoKLSAgICAgICAgTUVSR0VfQ1RYKDgsIEFWX1JONjRBKTsKLSAgICAgICAgREVDT0RFX1lfQ09FRl9MT09QKDgsIDAsIDMyKTsKLSAgICAgICAgU1BMQVRfQ1RYKDgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSNkZWZpbmUgREVDT0RFX1VWX0NPRUZfTE9PUChzdGVwLCB2KSBcCi0gICAgZm9yIChuID0gMCwgeSA9IDA7IHkgPCBlbmRfeTsgeSArPSBzdGVwKSB7IFwKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGVuZF94OyB4ICs9IHN0ZXAsIG4gKz0gc3RlcCAqIHN0ZXApIHsgXAotICAgICAgICAgICAgcmVzID0gKGlzOGJpdHNwZXJwaXhlbCA/IGRlY29kZV9jb2VmZnNfYiMjdiMjXzhicHAgOiBkZWNvZGVfY29lZmZzX2IjI3YjI18xNmJwcCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHMtPnV2YmxvY2tbcGxdICsgMTYgKiBuICogYnl0ZXNwZXJwaXhlbCwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICogc3RlcCAqIHN0ZXAsIGMsIGUsIHAsIGFbeF0gKyBsW3ldLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZzY2FuLCB1dm5iLCB1dl9iYW5kX2NvdW50cywgcW11bFsxXSk7IFwKLSAgICAgICAgICAgIGFbeF0gPSBsW3ldID0gISFyZXM7IFwKLSAgICAgICAgICAgIHRvdGFsX2NvZWZmIHw9ICEhcmVzOyBcCi0gICAgICAgICAgICBpZiAoc3RlcCA+PSA0KSB7IFwKLSAgICAgICAgICAgICAgICBBVl9XTjE2QSgmcy0+dXZlb2JbcGxdW25dLCByZXMpOyBcCi0gICAgICAgICAgICB9IGVsc2UgeyBcCi0gICAgICAgICAgICAgICAgcy0+dXZlb2JbcGxdW25dID0gcmVzOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfSBcCi0gICAgfQotCi0gICAgcCA9IHMtPnByb2IuY29lZltiLT51dnR4XVsxIC8qIHV2ICovXVshYi0+aW50cmFdOwotICAgIGMgPSBzLT5jb3VudHMuY29lZltiLT51dnR4XVsxIC8qIHV2ICovXVshYi0+aW50cmFdOwotICAgIGUgPSBzLT5jb3VudHMuZW9iW2ItPnV2dHhdWzEgLyogdXYgKi9dWyFiLT5pbnRyYV07Ci0gICAgdzQgPj49IHMtPnNzX2g7Ci0gICAgZW5kX3ggPj49IHMtPnNzX2g7Ci0gICAgaDQgPj49IHMtPnNzX3Y7Ci0gICAgZW5kX3kgPj49IHMtPnNzX3Y7Ci0gICAgZm9yIChwbCA9IDA7IHBsIDwgMjsgcGwrKykgewotICAgICAgICBhID0gJnMtPmFib3ZlX3V2X25uel9jdHhbcGxdW2NvbCA8PCAhcy0+c3NfaF07Ci0gICAgICAgIGwgPSAmcy0+bGVmdF91dl9ubnpfY3R4W3BsXVsocm93ICYgNykgPDwgIXMtPnNzX3ZdOwotICAgICAgICBzd2l0Y2ggKGItPnV2dHgpIHsKLSAgICAgICAgY2FzZSBUWF80WDQ6Ci0gICAgICAgICAgICBERUNPREVfVVZfQ09FRl9MT09QKDEsKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRYXzhYODoKLSAgICAgICAgICAgIE1FUkdFX0NUWCgyLCBBVl9STjE2QSk7Ci0gICAgICAgICAgICBERUNPREVfVVZfQ09FRl9MT09QKDIsKTsKLSAgICAgICAgICAgIFNQTEFUX0NUWCgyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRYXzE2WDE2OgotICAgICAgICAgICAgTUVSR0VfQ1RYKDQsIEFWX1JOMzJBKTsKLSAgICAgICAgICAgIERFQ09ERV9VVl9DT0VGX0xPT1AoNCwpOwotICAgICAgICAgICAgU1BMQVRfQ1RYKDQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFhfMzJYMzI6Ci0gICAgICAgICAgICBNRVJHRV9DVFgoOCwgQVZfUk42NEEpOwotICAgICAgICAgICAgREVDT0RFX1VWX0NPRUZfTE9PUCg4LCAzMik7Ci0gICAgICAgICAgICBTUExBVF9DVFgoOCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0b3RhbF9jb2VmZjsKLX0KLQotc3RhdGljIGludCBkZWNvZGVfY29lZmZzXzhicHAoQVZDb2RlY0NvbnRleHQgKmN0eCkKLXsKLSAgICByZXR1cm4gZGVjb2RlX2NvZWZmcyhjdHgsIDEpOwotfQotCi1zdGF0aWMgaW50IGRlY29kZV9jb2VmZnNfMTZicHAoQVZDb2RlY0NvbnRleHQgKmN0eCkKLXsKLSAgICByZXR1cm4gZGVjb2RlX2NvZWZmcyhjdHgsIDApOwotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgY2hlY2tfaW50cmFfbW9kZShWUDlDb250ZXh0ICpzLCBpbnQgbW9kZSwgdWludDhfdCAqKmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RfZWRnZSwgcHRyZGlmZl90IHN0cmlkZV9lZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0X2lubmVyLCBwdHJkaWZmX3Qgc3RyaWRlX2lubmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbCwgaW50IGNvbCwgaW50IHgsIGludCB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IHksIGVudW0gVHhmbU1vZGUgdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcCwgaW50IHNzX2gsIGludCBzc192LCBpbnQgYnl0ZXNwZXJwaXhlbCkKLXsKLSAgICBpbnQgaGF2ZV90b3AgPSByb3cgPiAwIHx8IHkgPiAwOwotICAgIGludCBoYXZlX2xlZnQgPSBjb2wgPiBzLT50aWxlX2NvbF9zdGFydCB8fCB4ID4gMDsKLSAgICBpbnQgaGF2ZV9yaWdodCA9IHggPCB3IC0gMTsKLSAgICBpbnQgYnBwID0gcy0+YnBwOwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1vZGVfY29udlsxMF1bMiAvKiBoYXZlX2xlZnQgKi9dWzIgLyogaGF2ZV90b3AgKi9dID0gewotICAgICAgICBbVkVSVF9QUkVEXSAgICAgICAgICAgID0geyB7IERDXzEyN19QUkVELCAgICAgICAgICBWRVJUX1BSRUQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBEQ18xMjdfUFJFRCwgICAgICAgICAgVkVSVF9QUkVEIH0gfSwKLSAgICAgICAgW0hPUl9QUkVEXSAgICAgICAgICAgICA9IHsgeyBEQ18xMjlfUFJFRCwgICAgICAgICAgRENfMTI5X1BSRUQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBIT1JfUFJFRCwgICAgICAgICAgICAgSE9SX1BSRUQgfSB9LAotICAgICAgICBbRENfUFJFRF0gICAgICAgICAgICAgID0geyB7IERDXzEyOF9QUkVELCAgICAgICAgICBUT1BfRENfUFJFRCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IExFRlRfRENfUFJFRCwgICAgICAgICBEQ19QUkVEIH0gfSwKLSAgICAgICAgW0RJQUdfRE9XTl9MRUZUX1BSRURdICA9IHsgeyBEQ18xMjdfUFJFRCwgICAgICAgICAgRElBR19ET1dOX0xFRlRfUFJFRCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IERDXzEyN19QUkVELCAgICAgICAgICBESUFHX0RPV05fTEVGVF9QUkVEIH0gfSwKLSAgICAgICAgW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSA9IHsgeyBESUFHX0RPV05fUklHSFRfUFJFRCwgRElBR19ET1dOX1JJR0hUX1BSRUQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBESUFHX0RPV05fUklHSFRfUFJFRCwgRElBR19ET1dOX1JJR0hUX1BSRUQgfSB9LAotICAgICAgICBbVkVSVF9SSUdIVF9QUkVEXSAgICAgID0geyB7IFZFUlRfUklHSFRfUFJFRCwgICAgICBWRVJUX1JJR0hUX1BSRUQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBWRVJUX1JJR0hUX1BSRUQsICAgICAgVkVSVF9SSUdIVF9QUkVEIH0gfSwKLSAgICAgICAgW0hPUl9ET1dOX1BSRURdICAgICAgICA9IHsgeyBIT1JfRE9XTl9QUkVELCAgICAgICAgSE9SX0RPV05fUFJFRCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEhPUl9ET1dOX1BSRUQsICAgICAgICBIT1JfRE9XTl9QUkVEIH0gfSwKLSAgICAgICAgW1ZFUlRfTEVGVF9QUkVEXSAgICAgICA9IHsgeyBEQ18xMjdfUFJFRCwgICAgICAgICAgVkVSVF9MRUZUX1BSRUQgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBEQ18xMjdfUFJFRCwgICAgICAgICAgVkVSVF9MRUZUX1BSRUQgfSB9LAotICAgICAgICBbSE9SX1VQX1BSRURdICAgICAgICAgID0geyB7IERDXzEyOV9QUkVELCAgICAgICAgICBEQ18xMjlfUFJFRCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEhPUl9VUF9QUkVELCAgICAgICAgICBIT1JfVVBfUFJFRCB9IH0sCi0gICAgICAgIFtUTV9WUDhfUFJFRF0gICAgICAgICAgPSB7IHsgRENfMTI5X1BSRUQsICAgICAgICAgIFZFUlRfUFJFRCB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEhPUl9QUkVELCAgICAgICAgICAgICBUTV9WUDhfUFJFRCB9IH0sCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgdWludDhfdCBuZWVkc19sZWZ0OjE7Ci0gICAgICAgIHVpbnQ4X3QgbmVlZHNfdG9wOjE7Ci0gICAgICAgIHVpbnQ4X3QgbmVlZHNfdG9wbGVmdDoxOwotICAgICAgICB1aW50OF90IG5lZWRzX3RvcHJpZ2h0OjE7Ci0gICAgICAgIHVpbnQ4X3QgaW52ZXJ0X2xlZnQ6MTsKLSAgICB9IGVkZ2VzW05fSU5UUkFfUFJFRF9NT0RFU10gPSB7Ci0gICAgICAgIFtWRVJUX1BSRURdICAgICAgICAgICAgPSB7IC5uZWVkc190b3AgID0gMSB9LAotICAgICAgICBbSE9SX1BSRURdICAgICAgICAgICAgID0geyAubmVlZHNfbGVmdCA9IDEgfSwKLSAgICAgICAgW0RDX1BSRURdICAgICAgICAgICAgICA9IHsgLm5lZWRzX3RvcCAgPSAxLCAubmVlZHNfbGVmdCA9IDEgfSwKLSAgICAgICAgW0RJQUdfRE9XTl9MRUZUX1BSRURdICA9IHsgLm5lZWRzX3RvcCAgPSAxLCAubmVlZHNfdG9wcmlnaHQgPSAxIH0sCi0gICAgICAgIFtESUFHX0RPV05fUklHSFRfUFJFRF0gPSB7IC5uZWVkc19sZWZ0ID0gMSwgLm5lZWRzX3RvcCA9IDEsIC5uZWVkc190b3BsZWZ0ID0gMSB9LAotICAgICAgICBbVkVSVF9SSUdIVF9QUkVEXSAgICAgID0geyAubmVlZHNfbGVmdCA9IDEsIC5uZWVkc190b3AgPSAxLCAubmVlZHNfdG9wbGVmdCA9IDEgfSwKLSAgICAgICAgW0hPUl9ET1dOX1BSRURdICAgICAgICA9IHsgLm5lZWRzX2xlZnQgPSAxLCAubmVlZHNfdG9wID0gMSwgLm5lZWRzX3RvcGxlZnQgPSAxIH0sCi0gICAgICAgIFtWRVJUX0xFRlRfUFJFRF0gICAgICAgPSB7IC5uZWVkc190b3AgID0gMSwgLm5lZWRzX3RvcHJpZ2h0ID0gMSB9LAotICAgICAgICBbSE9SX1VQX1BSRURdICAgICAgICAgID0geyAubmVlZHNfbGVmdCA9IDEsIC5pbnZlcnRfbGVmdCA9IDEgfSwKLSAgICAgICAgW1RNX1ZQOF9QUkVEXSAgICAgICAgICA9IHsgLm5lZWRzX2xlZnQgPSAxLCAubmVlZHNfdG9wID0gMSwgLm5lZWRzX3RvcGxlZnQgPSAxIH0sCi0gICAgICAgIFtMRUZUX0RDX1BSRURdICAgICAgICAgPSB7IC5uZWVkc19sZWZ0ID0gMSB9LAotICAgICAgICBbVE9QX0RDX1BSRURdICAgICAgICAgID0geyAubmVlZHNfdG9wICA9IDEgfSwKLSAgICAgICAgW0RDXzEyOF9QUkVEXSAgICAgICAgICA9IHsgMCB9LAotICAgICAgICBbRENfMTI3X1BSRURdICAgICAgICAgID0geyAwIH0sCi0gICAgICAgIFtEQ18xMjlfUFJFRF0gICAgICAgICAgPSB7IDAgfQotICAgIH07Ci0KLSAgICBhdl9hc3NlcnQyKG1vZGUgPj0gMCAmJiBtb2RlIDwgMTApOwotICAgIG1vZGUgPSBtb2RlX2NvbnZbbW9kZV1baGF2ZV9sZWZ0XVtoYXZlX3RvcF07Ci0gICAgaWYgKGVkZ2VzW21vZGVdLm5lZWRzX3RvcCkgewotICAgICAgICB1aW50OF90ICp0b3AsICp0b3BsZWZ0OwotICAgICAgICBpbnQgbl9weF9uZWVkID0gNCA8PCB0eCwgbl9weF9oYXZlID0gKCgocy0+Y29scyAtIGNvbCkgPDwgIXNzX2gpIC0geCkgKiA0OwotICAgICAgICBpbnQgbl9weF9uZWVkX3RyID0gMDsKLQotICAgICAgICBpZiAodHggPT0gVFhfNFg0ICYmIGVkZ2VzW21vZGVdLm5lZWRzX3RvcHJpZ2h0ICYmIGhhdmVfcmlnaHQpCi0gICAgICAgICAgICBuX3B4X25lZWRfdHIgPSA0OwotCi0gICAgICAgIC8vIGlmIHRvcCBvZiBzYjY0LXJvdywgdXNlIHMtPmludHJhX3ByZWRfZGF0YVtdIGluc3RlYWQgb2YKLSAgICAgICAgLy8gZHN0Wy1zdHJpZGVdIGZvciBpbnRyYSBwcmVkaWN0aW9uIChpdCBjb250YWlucyBwcmUtIGluc3RlYWQgb2YKLSAgICAgICAgLy8gcG9zdC1sb29wZmlsdGVyIGRhdGEpCi0gICAgICAgIGlmIChoYXZlX3RvcCkgewotICAgICAgICAgICAgdG9wID0gIShyb3cgJiA3KSAmJiAheSA/Ci0gICAgICAgICAgICAgICAgcy0+aW50cmFfcHJlZF9kYXRhW3BdICsgKGNvbCAqICg4ID4+IHNzX2gpICsgeCAqIDQpICogYnl0ZXNwZXJwaXhlbCA6Ci0gICAgICAgICAgICAgICAgeSA9PSAwID8gJmRzdF9lZGdlWy1zdHJpZGVfZWRnZV0gOiAmZHN0X2lubmVyWy1zdHJpZGVfaW5uZXJdOwotICAgICAgICAgICAgaWYgKGhhdmVfbGVmdCkKLSAgICAgICAgICAgICAgICB0b3BsZWZ0ID0gIShyb3cgJiA3KSAmJiAheSA/Ci0gICAgICAgICAgICAgICAgICAgIHMtPmludHJhX3ByZWRfZGF0YVtwXSArIChjb2wgKiAoOCA+PiBzc19oKSArIHggKiA0KSAqIGJ5dGVzcGVycGl4ZWwgOgotICAgICAgICAgICAgICAgICAgICB5ID09IDAgfHwgeCA9PSAwID8gJmRzdF9lZGdlWy1zdHJpZGVfZWRnZV0gOgotICAgICAgICAgICAgICAgICAgICAmZHN0X2lubmVyWy1zdHJpZGVfaW5uZXJdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhdmVfdG9wICYmCi0gICAgICAgICAgICAoIWVkZ2VzW21vZGVdLm5lZWRzX3RvcGxlZnQgfHwgKGhhdmVfbGVmdCAmJiB0b3AgPT0gdG9wbGVmdCkpICYmCi0gICAgICAgICAgICAodHggIT0gVFhfNFg0IHx8ICFlZGdlc1ttb2RlXS5uZWVkc190b3ByaWdodCB8fCBoYXZlX3JpZ2h0KSAmJgotICAgICAgICAgICAgbl9weF9uZWVkICsgbl9weF9uZWVkX3RyIDw9IG5fcHhfaGF2ZSkgewotICAgICAgICAgICAgKmEgPSB0b3A7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaGF2ZV90b3ApIHsKLSAgICAgICAgICAgICAgICBpZiAobl9weF9uZWVkIDw9IG5fcHhfaGF2ZSkgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKmEsIHRvcCwgbl9weF9uZWVkICogYnl0ZXNwZXJwaXhlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSNkZWZpbmUgbWVtc2V0X2JwcChjLCBpMSwgdiwgaTIsIG51bSkgZG8geyBcCi0gICAgaWYgKGJ5dGVzcGVycGl4ZWwgPT0gMSkgeyBcCi0gICAgICAgIG1lbXNldCgmKGMpWyhpMSldLCAodilbKGkyKV0sIChudW0pKTsgXAotICAgIH0gZWxzZSB7IFwKLSAgICAgICAgaW50IG4sIHZhbCA9IEFWX1JOMTZBKCYodilbKGkyKSAqIDJdKTsgXAotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKG51bSk7IG4rKykgeyBcCi0gICAgICAgICAgICBBVl9XTjE2QSgmKGMpWygoaTEpICsgbikgKiAyXSwgdmFsKTsgXAotICAgICAgICB9IFwKLSAgICB9IFwKLX0gd2hpbGUgKDApCi0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgqYSwgdG9wLCBuX3B4X2hhdmUgKiBieXRlc3BlcnBpeGVsKTsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0X2JwcCgqYSwgbl9weF9oYXZlLCAoKmEpLCBuX3B4X2hhdmUgLSAxLCBuX3B4X25lZWQgLSBuX3B4X2hhdmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0jZGVmaW5lIG1lbXNldF92YWwoYywgdmFsLCBudW0pIGRvIHsgXAotICAgIGlmIChieXRlc3BlcnBpeGVsID09IDEpIHsgXAotICAgICAgICBtZW1zZXQoKGMpLCAodmFsKSwgKG51bSkpOyBcCi0gICAgfSBlbHNlIHsgXAotICAgICAgICBpbnQgbjsgXAotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKG51bSk7IG4rKykgeyBcCi0gICAgICAgICAgICBBVl9XTjE2QSgmKGMpW24gKiAyXSwgKHZhbCkpOyBcCi0gICAgICAgIH0gXAotICAgIH0gXAotfSB3aGlsZSAoMCkKLSAgICAgICAgICAgICAgICBtZW1zZXRfdmFsKCphLCAoMTI4IDw8IChicHAgLSA4KSkgLSAxLCBuX3B4X25lZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVkZ2VzW21vZGVdLm5lZWRzX3RvcGxlZnQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGF2ZV9sZWZ0ICYmIGhhdmVfdG9wKSB7Ci0jZGVmaW5lIGFzc2lnbl9icHAoYywgaTEsIHYsIGkyKSBkbyB7IFwKLSAgICBpZiAoYnl0ZXNwZXJwaXhlbCA9PSAxKSB7IFwKLSAgICAgICAgKGMpWyhpMSldID0gKHYpWyhpMildOyBcCi0gICAgfSBlbHNlIHsgXAotICAgICAgICBBVl9DT1BZMTYoJihjKVsoaTEpICogMl0sICYodilbKGkyKSAqIDJdKTsgXAotICAgIH0gXAotfSB3aGlsZSAoMCkKLSAgICAgICAgICAgICAgICAgICAgYXNzaWduX2JwcCgqYSwgLTEsIHRvcGxlZnQsIC0xKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotI2RlZmluZSBhc3NpZ25fdmFsKGMsIGksIHYpIGRvIHsgXAotICAgIGlmIChieXRlc3BlcnBpeGVsID09IDEpIHsgXAotICAgICAgICAoYylbKGkpXSA9ICh2KTsgXAotICAgIH0gZWxzZSB7IFwKLSAgICAgICAgQVZfV04xNkEoJihjKVsoaSkgKiAyXSwgKHYpKTsgXAotICAgIH0gXAotfSB3aGlsZSAoMCkKLSAgICAgICAgICAgICAgICAgICAgYXNzaWduX3ZhbCgoKmEpLCAtMSwgKDEyOCA8PCAoYnBwIC0gOCkpICsgKGhhdmVfdG9wID8gKzEgOiAtMSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0eCA9PSBUWF80WDQgJiYgZWRnZXNbbW9kZV0ubmVlZHNfdG9wcmlnaHQpIHsKLSAgICAgICAgICAgICAgICBpZiAoaGF2ZV90b3AgJiYgaGF2ZV9yaWdodCAmJgotICAgICAgICAgICAgICAgICAgICBuX3B4X25lZWQgKyBuX3B4X25lZWRfdHIgPD0gbl9weF9oYXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSgmKCphKVs0ICogYnl0ZXNwZXJwaXhlbF0sICZ0b3BbNCAqIGJ5dGVzcGVycGl4ZWxdLCA0ICogYnl0ZXNwZXJwaXhlbCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0X2JwcCgqYSwgNCwgKmEsIDMsIDQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoZWRnZXNbbW9kZV0ubmVlZHNfbGVmdCkgewotICAgICAgICBpZiAoaGF2ZV9sZWZ0KSB7Ci0gICAgICAgICAgICBpbnQgbl9weF9uZWVkID0gNCA8PCB0eCwgaSwgbl9weF9oYXZlID0gKCgocy0+cm93cyAtIHJvdykgPDwgIXNzX3YpIC0geSkgKiA0OwotICAgICAgICAgICAgdWludDhfdCAqZHN0ID0geCA9PSAwID8gZHN0X2VkZ2UgOiBkc3RfaW5uZXI7Ci0gICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlID0geCA9PSAwID8gc3RyaWRlX2VkZ2UgOiBzdHJpZGVfaW5uZXI7Ci0KLSAgICAgICAgICAgIGlmIChlZGdlc1ttb2RlXS5pbnZlcnRfbGVmdCkgewotICAgICAgICAgICAgICAgIGlmIChuX3B4X25lZWQgPD0gbl9weF9oYXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX3B4X25lZWQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbl9icHAobCwgaSwgJmRzdFtpICogc3RyaWRlXSwgLTEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX3B4X2hhdmU7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbl9icHAobCwgaSwgJmRzdFtpICogc3RyaWRlXSwgLTEpOwotICAgICAgICAgICAgICAgICAgICBtZW1zZXRfYnBwKGwsIG5fcHhfaGF2ZSwgbCwgbl9weF9oYXZlIC0gMSwgbl9weF9uZWVkIC0gbl9weF9oYXZlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChuX3B4X25lZWQgPD0gbl9weF9oYXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX3B4X25lZWQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbl9icHAobCwgbl9weF9uZWVkIC0gMSAtIGksICZkc3RbaSAqIHN0cmlkZV0sIC0xKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9weF9oYXZlOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25fYnBwKGwsIG5fcHhfbmVlZCAtIDEgLSBpLCAmZHN0W2kgKiBzdHJpZGVdLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbXNldF9icHAobCwgMCwgbCwgbl9weF9uZWVkIC0gbl9weF9oYXZlLCBuX3B4X25lZWQgLSBuX3B4X2hhdmUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbXNldF92YWwobCwgKDEyOCA8PCAoYnBwIC0gOCkpICsgMSwgNCA8PCB0eCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kZTsKLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBpbnRyYV9yZWNvbihBVkNvZGVjQ29udGV4dCAqY3R4LCBwdHJkaWZmX3QgeV9vZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB1dl9vZmYsIGludCBieXRlc3BlcnBpeGVsKQotewotICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKLSAgICBWUDlCbG9jayAqYiA9IHMtPmI7Ci0gICAgaW50IHJvdyA9IHMtPnJvdywgY29sID0gcy0+Y29sOwotICAgIGludCB3NCA9IGJ3aF90YWJbMV1bYi0+YnNdWzBdIDw8IDEsIHN0ZXAxZCA9IDEgPDwgYi0+dHgsIG47Ci0gICAgaW50IGg0ID0gYndoX3RhYlsxXVtiLT5ic11bMV0gPDwgMSwgeCwgeSwgc3RlcCA9IDEgPDwgKGItPnR4ICogMik7Ci0gICAgaW50IGVuZF94ID0gRkZNSU4oMiAqIChzLT5jb2xzIC0gY29sKSwgdzQpOwotICAgIGludCBlbmRfeSA9IEZGTUlOKDIgKiAocy0+cm93cyAtIHJvdyksIGg0KTsKLSAgICBpbnQgdHggPSA0ICogcy0+cy5oLmxvc3NsZXNzICsgYi0+dHgsIHV2dHggPSBiLT51dnR4ICsgNCAqIHMtPnMuaC5sb3NzbGVzczsKLSAgICBpbnQgdXZzdGVwMWQgPSAxIDw8IGItPnV2dHgsIHA7Ci0gICAgdWludDhfdCAqZHN0ID0gcy0+ZHN0WzBdLCAqZHN0X3IgPSBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmRhdGFbMF0gKyB5X29mZjsKLSAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGFfYnVmLCBbOTZdKTsKLSAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGwsIFs2NF0pOwotCi0gICAgZm9yIChuID0gMCwgeSA9IDA7IHkgPCBlbmRfeTsgeSArPSBzdGVwMWQpIHsKLSAgICAgICAgdWludDhfdCAqcHRyID0gZHN0LCAqcHRyX3IgPSBkc3RfcjsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGVuZF94OyB4ICs9IHN0ZXAxZCwgcHRyICs9IDQgKiBzdGVwMWQgKiBieXRlc3BlcnBpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9yICs9IDQgKiBzdGVwMWQgKiBieXRlc3BlcnBpeGVsLCBuICs9IHN0ZXApIHsKLSAgICAgICAgICAgIGludCBtb2RlID0gYi0+bW9kZVtiLT5icyA+IEJTXzh4OCAmJiBiLT50eCA9PSBUWF80WDQgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKiAyICsgeCA6IDBdOwotICAgICAgICAgICAgdWludDhfdCAqYSA9ICZhX2J1ZlszMl07Ci0gICAgICAgICAgICBlbnVtIFR4Zm1UeXBlIHR4dHAgPSB2cDlfaW50cmFfdHhmbV90eXBlW21vZGVdOwotICAgICAgICAgICAgaW50IGVvYiA9IGItPnNraXAgPyAwIDogYi0+dHggPiBUWF84WDggPyBBVl9STjE2QSgmcy0+ZW9iW25dKSA6IHMtPmVvYltuXTsKLQotICAgICAgICAgICAgbW9kZSA9IGNoZWNrX2ludHJhX21vZGUocywgbW9kZSwgJmEsIHB0cl9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5saW5lc2l6ZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgcy0+eV9zdHJpZGUsIGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHgsIHc0LCByb3csIHksIGItPnR4LCAwLCAwLCAwLCBieXRlc3BlcnBpeGVsKTsKLSAgICAgICAgICAgIHMtPmRzcC5pbnRyYV9wcmVkW2ItPnR4XVttb2RlXShwdHIsIHMtPnlfc3RyaWRlLCBsLCBhKTsKLSAgICAgICAgICAgIGlmIChlb2IpCi0gICAgICAgICAgICAgICAgcy0+ZHNwLml0eGZtX2FkZFt0eF1bdHh0cF0ocHRyLCBzLT55X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9jayArIDE2ICogbiAqIGJ5dGVzcGVycGl4ZWwsIGVvYik7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0X3IgKz0gNCAqIHN0ZXAxZCAqIHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+bGluZXNpemVbMF07Ci0gICAgICAgIGRzdCAgICs9IDQgKiBzdGVwMWQgKiBzLT55X3N0cmlkZTsKLSAgICB9Ci0KLSAgICAvLyBVL1YKLSAgICB3NCA+Pj0gcy0+c3NfaDsKLSAgICBlbmRfeCA+Pj0gcy0+c3NfaDsKLSAgICBlbmRfeSA+Pj0gcy0+c3NfdjsKLSAgICBzdGVwID0gMSA8PCAoYi0+dXZ0eCAqIDIpOwotICAgIGZvciAocCA9IDA7IHAgPCAyOyBwKyspIHsKLSAgICAgICAgZHN0ICAgPSBzLT5kc3RbMSArIHBdOwotICAgICAgICBkc3RfciA9IHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+ZGF0YVsxICsgcF0gKyB1dl9vZmY7Ci0gICAgICAgIGZvciAobiA9IDAsIHkgPSAwOyB5IDwgZW5kX3k7IHkgKz0gdXZzdGVwMWQpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGRzdCwgKnB0cl9yID0gZHN0X3I7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZW5kX3g7IHggKz0gdXZzdGVwMWQsIHB0ciArPSA0ICogdXZzdGVwMWQgKiBieXRlc3BlcnBpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfciArPSA0ICogdXZzdGVwMWQgKiBieXRlc3BlcnBpeGVsLCBuICs9IHN0ZXApIHsKLSAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IGItPnV2bW9kZTsKLSAgICAgICAgICAgICAgICB1aW50OF90ICphID0gJmFfYnVmWzMyXTsKLSAgICAgICAgICAgICAgICBpbnQgZW9iID0gYi0+c2tpcCA/IDAgOiBiLT51dnR4ID4gVFhfOFg4ID8gQVZfUk4xNkEoJnMtPnV2ZW9iW3BdW25dKSA6IHMtPnV2ZW9iW3BdW25dOwotCi0gICAgICAgICAgICAgICAgbW9kZSA9IGNoZWNrX2ludHJhX21vZGUocywgbW9kZSwgJmEsIHB0cl9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+bGluZXNpemVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBzLT51dl9zdHJpZGUsIGwsIGNvbCwgeCwgdzQsIHJvdywgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT51dnR4LCBwICsgMSwgcy0+c3NfaCwgcy0+c3NfdiwgYnl0ZXNwZXJwaXhlbCk7Ci0gICAgICAgICAgICAgICAgcy0+ZHNwLmludHJhX3ByZWRbYi0+dXZ0eF1bbW9kZV0ocHRyLCBzLT51dl9zdHJpZGUsIGwsIGEpOwotICAgICAgICAgICAgICAgIGlmIChlb2IpCi0gICAgICAgICAgICAgICAgICAgIHMtPmRzcC5pdHhmbV9hZGRbdXZ0eF1bRENUX0RDVF0ocHRyLCBzLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZibG9ja1twXSArIDE2ICogbiAqIGJ5dGVzcGVycGl4ZWwsIGVvYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3RfciArPSA0ICogdXZzdGVwMWQgKiBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmxpbmVzaXplWzFdOwotICAgICAgICAgICAgZHN0ICAgKz0gNCAqIHV2c3RlcDFkICogcy0+dXZfc3RyaWRlOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBpbnRyYV9yZWNvbl84YnBwKEFWQ29kZWNDb250ZXh0ICpjdHgsIHB0cmRpZmZfdCB5X29mZiwgcHRyZGlmZl90IHV2X29mZikKLXsKLSAgICBpbnRyYV9yZWNvbihjdHgsIHlfb2ZmLCB1dl9vZmYsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRyYV9yZWNvbl8xNmJwcChBVkNvZGVjQ29udGV4dCAqY3R4LCBwdHJkaWZmX3QgeV9vZmYsIHB0cmRpZmZfdCB1dl9vZmYpCi17Ci0gICAgaW50cmFfcmVjb24oY3R4LCB5X29mZiwgdXZfb2ZmLCAyKTsKLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtY19sdW1hX3Vuc2NhbGVkKFZQOUNvbnRleHQgKnMsIHZwOV9tY19mdW5jICgqbWMpWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBwdHJkaWZmX3QgcmVmX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRGcmFtZSAqcmVmX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB5LCBwdHJkaWZmX3QgeCwgY29uc3QgVlA1Nm12ICptdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYncsIGludCBiaCwgaW50IHcsIGludCBoLCBpbnQgYnl0ZXNwZXJwaXhlbCkKLXsKLSAgICBpbnQgbXggPSBtdi0+eCwgbXkgPSBtdi0+eSwgdGg7Ci0KLSAgICB5ICs9IG15ID4+IDM7Ci0gICAgeCArPSBteCA+PiAzOwotICAgIHJlZiArPSB5ICogcmVmX3N0cmlkZSArIHggKiBieXRlc3BlcnBpeGVsOwotICAgIG14ICY9IDc7Ci0gICAgbXkgJj0gNzsKLSAgICAvLyBGSVhNRSBiaWxpbmVhciBmaWx0ZXIgb25seSBuZWVkcyAwLzEgcGl4ZWxzLCBub3QgMy80Ci0gICAgLy8gd2UgdXNlICs3IGJlY2F1c2UgdGhlIGxhc3QgNyBwaXhlbHMgb2YgZWFjaCBzYnJvdyBjYW4gYmUgY2hhbmdlZCBpbgotICAgIC8vIHRoZSBsb25nZXN0IGxvb3BmaWx0ZXIgb2YgdGhlIG5leHQgc2Jyb3cKLSAgICB0aCA9ICh5ICsgYmggKyA0ICogISFteSArIDcpID4+IDY7Ci0gICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKHJlZl9mcmFtZSwgRkZNQVgodGgsIDApLCAwKTsKLSAgICBpZiAoeCA8ICEhbXggKiAzIHx8IHkgPCAhIW15ICogMyB8fAotICAgICAgICB4ICsgISFteCAqIDQgPiB3IC0gYncgfHwgeSArICEhbXkgKiA0ID4gaCAtIGJoKSB7Ci0gICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYgLSAhIW15ICogMyAqIHJlZl9zdHJpZGUgLSAhIW14ICogMyAqIGJ5dGVzcGVycGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAsIHJlZl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidyArICEhbXggKiA3LCBiaCArICEhbXkgKiA3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAtICEhbXggKiAzLCB5IC0gISFteSAqIDMsIHcsIGgpOwotICAgICAgICByZWYgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAhIW15ICogMyAqIDE2MCArICEhbXggKiAzICogYnl0ZXNwZXJwaXhlbDsKLSAgICAgICAgcmVmX3N0cmlkZSA9IDE2MDsKLSAgICB9Ci0gICAgbWNbISFteF1bISFteV0oZHN0LCBkc3Rfc3RyaWRlLCByZWYsIHJlZl9zdHJpZGUsIGJoLCBteCA8PCAxLCBteSA8PCAxKTsKLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtY19jaHJvbWFfdW5zY2FsZWQoVlA5Q29udGV4dCAqcywgdnA5X21jX2Z1bmMgKCptYylbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RfdSwgdWludDhfdCAqZHN0X3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlZl91LCBwdHJkaWZmX3Qgc3JjX3N0cmlkZV91LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmX3YsIHB0cmRpZmZfdCBzcmNfc3RyaWRlX3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRGcmFtZSAqcmVmX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHksIHB0cmRpZmZfdCB4LCBjb25zdCBWUDU2bXYgKm12LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ3LCBpbnQgYmgsIGludCB3LCBpbnQgaCwgaW50IGJ5dGVzcGVycGl4ZWwpCi17Ci0gICAgaW50IG14ID0gbXYtPnggPDwgIXMtPnNzX2gsIG15ID0gbXYtPnkgPDwgIXMtPnNzX3YsIHRoOwotCi0gICAgeSArPSBteSA+PiA0OwotICAgIHggKz0gbXggPj4gNDsKLSAgICByZWZfdSArPSB5ICogc3JjX3N0cmlkZV91ICsgeCAqIGJ5dGVzcGVycGl4ZWw7Ci0gICAgcmVmX3YgKz0geSAqIHNyY19zdHJpZGVfdiArIHggKiBieXRlc3BlcnBpeGVsOwotICAgIG14ICY9IDE1OwotICAgIG15ICY9IDE1OwotICAgIC8vIEZJWE1FIGJpbGluZWFyIGZpbHRlciBvbmx5IG5lZWRzIDAvMSBwaXhlbHMsIG5vdCAzLzQKLSAgICAvLyB3ZSB1c2UgKzcgYmVjYXVzZSB0aGUgbGFzdCA3IHBpeGVscyBvZiBlYWNoIHNicm93IGNhbiBiZSBjaGFuZ2VkIGluCi0gICAgLy8gdGhlIGxvbmdlc3QgbG9vcGZpbHRlciBvZiB0aGUgbmV4dCBzYnJvdwotICAgIHRoID0gKHkgKyBiaCArIDQgKiAhIW15ICsgNykgPj4gKDYgLSBzLT5zc192KTsKLSAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MocmVmX2ZyYW1lLCBGRk1BWCh0aCwgMCksIDApOwotICAgIGlmICh4IDwgISFteCAqIDMgfHwgeSA8ICEhbXkgKiAzIHx8Ci0gICAgICAgIHggKyAhIW14ICogNCA+IHcgLSBidyB8fCB5ICsgISFteSAqIDQgPiBoIC0gYmgpIHsKLSAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl91IC0gISFteSAqIDMgKiBzcmNfc3RyaWRlX3UgLSAhIW14ICogMyAqIGJ5dGVzcGVycGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAsIHNyY19zdHJpZGVfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3ICsgISFteCAqIDcsIGJoICsgISFteSAqIDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gISFteCAqIDMsIHkgLSAhIW15ICogMywgdywgaCk7Ci0gICAgICAgIHJlZl91ID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgISFteSAqIDMgKiAxNjAgKyAhIW14ICogMyAqIGJ5dGVzcGVycGl4ZWw7Ci0gICAgICAgIG1jWyEhbXhdWyEhbXldKGRzdF91LCBkc3Rfc3RyaWRlLCByZWZfdSwgMTYwLCBiaCwgbXgsIG15KTsKLQotICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWMocy0+ZWRnZV9lbXVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3YgLSAhIW15ICogMyAqIHNyY19zdHJpZGVfdiAtICEhbXggKiAzICogYnl0ZXNwZXJwaXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCwgc3JjX3N0cmlkZV92LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncgKyAhIW14ICogNywgYmggKyAhIW15ICogNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSAhIW14ICogMywgeSAtICEhbXkgKiAzLCB3LCBoKTsKLSAgICAgICAgcmVmX3YgPSBzLT5lZGdlX2VtdV9idWZmZXIgKyAhIW15ICogMyAqIDE2MCArICEhbXggKiAzICogYnl0ZXNwZXJwaXhlbDsKLSAgICAgICAgbWNbISFteF1bISFteV0oZHN0X3YsIGRzdF9zdHJpZGUsIHJlZl92LCAxNjAsIGJoLCBteCwgbXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1jWyEhbXhdWyEhbXldKGRzdF91LCBkc3Rfc3RyaWRlLCByZWZfdSwgc3JjX3N0cmlkZV91LCBiaCwgbXgsIG15KTsKLSAgICAgICAgbWNbISFteF1bISFteV0oZHN0X3YsIGRzdF9zdHJpZGUsIHJlZl92LCBzcmNfc3RyaWRlX3YsIGJoLCBteCwgbXkpOwotICAgIH0KLX0KLQotI2RlZmluZSBtY19sdW1hX2RpcihzLCBtYywgZHN0LCBkc3RfbHMsIHNyYywgc3JjX2xzLCB0cmVmLCByb3csIGNvbCwgbXYsIFwKLSAgICAgICAgICAgICAgICAgICAgcHgsIHB5LCBwdywgcGgsIGJ3LCBiaCwgdywgaCwgaSkgXAotICAgIG1jX2x1bWFfdW5zY2FsZWQocywgcy0+ZHNwLm1jLCBkc3QsIGRzdF9scywgc3JjLCBzcmNfbHMsIHRyZWYsIHJvdywgY29sLCBcCi0gICAgICAgICAgICAgICAgICAgICBtdiwgYncsIGJoLCB3LCBoLCBieXRlc3BlcnBpeGVsKQotI2RlZmluZSBtY19jaHJvbWFfZGlyKHMsIG1jLCBkc3R1LCBkc3R2LCBkc3RfbHMsIHNyY3UsIHNyY3VfbHMsIHNyY3YsIHNyY3ZfbHMsIHRyZWYsIFwKLSAgICAgICAgICAgICAgICAgICAgICByb3csIGNvbCwgbXYsIHB4LCBweSwgcHcsIHBoLCBidywgYmgsIHcsIGgsIGkpIFwKLSAgICBtY19jaHJvbWFfdW5zY2FsZWQocywgcy0+ZHNwLm1jLCBkc3R1LCBkc3R2LCBkc3RfbHMsIHNyY3UsIHNyY3VfbHMsIHNyY3YsIHNyY3ZfbHMsIHRyZWYsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgcm93LCBjb2wsIG12LCBidywgYmgsIHcsIGgsIGJ5dGVzcGVycGl4ZWwpCi0jZGVmaW5lIFNDQUxFRCAwCi0jZGVmaW5lIEZOKHgpIHgjI184YnBwCi0jZGVmaW5lIEJZVEVTX1BFUl9QSVhFTCAxCi0jaW5jbHVkZSAidnA5X21jX3RlbXBsYXRlLmMiCi0jdW5kZWYgRk4KLSN1bmRlZiBCWVRFU19QRVJfUElYRUwKLSNkZWZpbmUgRk4oeCkgeCMjXzE2YnBwCi0jZGVmaW5lIEJZVEVTX1BFUl9QSVhFTCAyCi0jaW5jbHVkZSAidnA5X21jX3RlbXBsYXRlLmMiCi0jdW5kZWYgbWNfbHVtYV9kaXIKLSN1bmRlZiBtY19jaHJvbWFfZGlyCi0jdW5kZWYgRk4KLSN1bmRlZiBCWVRFU19QRVJfUElYRUwKLSN1bmRlZiBTQ0FMRUQKLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtY19sdW1hX3NjYWxlZChWUDlDb250ZXh0ICpzLCB2cDlfc2NhbGVkX21jX2Z1bmMgc21jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDlfbWNfZnVuYyAoKm1jKVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBwdHJkaWZmX3QgcmVmX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkRnJhbWUgKnJlZl9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHksIHB0cmRpZmZfdCB4LCBjb25zdCBWUDU2bXYgKmluX212LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHgsIGludCBweSwgaW50IHB3LCBpbnQgcGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidywgaW50IGJoLCBpbnQgdywgaW50IGgsIGludCBieXRlc3BlcnBpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc2NhbGUsIGNvbnN0IHVpbnQ4X3QgKnN0ZXApCi17Ci0gICAgaWYgKHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+d2lkdGggPT0gcmVmX2ZyYW1lLT5mLT53aWR0aCAmJgotICAgICAgICBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmhlaWdodCA9PSByZWZfZnJhbWUtPmYtPmhlaWdodCkgewotICAgICAgICBtY19sdW1hX3Vuc2NhbGVkKHMsIG1jLCBkc3QsIGRzdF9zdHJpZGUsIHJlZiwgcmVmX3N0cmlkZSwgcmVmX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHksIHgsIGluX212LCBidywgYmgsIHcsIGgsIGJ5dGVzcGVycGl4ZWwpOwotICAgIH0gZWxzZSB7Ci0jZGVmaW5lIHNjYWxlX212KG4sIGRpbSkgKCgoaW50NjRfdCkobikgKiBzY2FsZVtkaW1dKSA+PiAxNCkKLSAgICBpbnQgbXgsIG15OwotICAgIGludCByZWZid19tMSwgcmVmYmhfbTE7Ci0gICAgaW50IHRoOwotICAgIFZQNTZtdiBtdjsKLQotICAgIG12LnggPSBhdl9jbGlwKGluX212LT54LCAtKHggKyBwdyAtIHB4ICsgNCkgPDwgMywgKHMtPmNvbHMgKiA4IC0geCArIHB4ICsgMykgPDwgMyk7Ci0gICAgbXYueSA9IGF2X2NsaXAoaW5fbXYtPnksIC0oeSArIHBoIC0gcHkgKyA0KSA8PCAzLCAocy0+cm93cyAqIDggLSB5ICsgcHkgKyAzKSA8PCAzKTsKLSAgICAvLyBCVUcgbGlidnB4IHNlZW1zIHRvIHNjYWxlIHRoZSB0d28gY29tcG9uZW50cyBzZXBhcmF0ZWx5LiBUaGlzIGludHJvZHVjZXMKLSAgICAvLyByb3VuZGluZyBlcnJvcnMgYnV0IHdlIGhhdmUgdG8gcmVwcm9kdWNlIHRoZW0gdG8gYmUgZXhhY3RseSBjb21wYXRpYmxlCi0gICAgLy8gd2l0aCB0aGUgb3V0cHV0IGZyb20gbGlidnB4Li4uCi0gICAgbXggPSBzY2FsZV9tdihtdi54ICogMiwgMCkgKyBzY2FsZV9tdih4ICogMTYsIDApOwotICAgIG15ID0gc2NhbGVfbXYobXYueSAqIDIsIDEpICsgc2NhbGVfbXYoeSAqIDE2LCAxKTsKLQotICAgIHkgPSBteSA+PiA0OwotICAgIHggPSBteCA+PiA0OwotICAgIHJlZiArPSB5ICogcmVmX3N0cmlkZSArIHggKiBieXRlc3BlcnBpeGVsOwotICAgIG14ICY9IDE1OwotICAgIG15ICY9IDE1OwotICAgIHJlZmJ3X20xID0gKChidyAtIDEpICogc3RlcFswXSArIG14KSA+PiA0OwotICAgIHJlZmJoX20xID0gKChiaCAtIDEpICogc3RlcFsxXSArIG15KSA+PiA0OwotICAgIC8vIEZJWE1FIGJpbGluZWFyIGZpbHRlciBvbmx5IG5lZWRzIDAvMSBwaXhlbHMsIG5vdCAzLzQKLSAgICAvLyB3ZSB1c2UgKzcgYmVjYXVzZSB0aGUgbGFzdCA3IHBpeGVscyBvZiBlYWNoIHNicm93IGNhbiBiZSBjaGFuZ2VkIGluCi0gICAgLy8gdGhlIGxvbmdlc3QgbG9vcGZpbHRlciBvZiB0aGUgbmV4dCBzYnJvdwotICAgIHRoID0gKHkgKyByZWZiaF9tMSArIDQgKyA3KSA+PiA2OwotICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhyZWZfZnJhbWUsIEZGTUFYKHRoLCAwKSwgMCk7Ci0gICAgaWYgKHggPCAzIHx8IHkgPCAzIHx8IHggKyA0ID49IHcgLSByZWZid19tMSB8fCB5ICsgNCA+PSBoIC0gcmVmYmhfbTEpIHsKLSAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAtIDMgKiByZWZfc3RyaWRlIC0gMyAqIGJ5dGVzcGVycGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODgsIHJlZl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZid19tMSArIDgsIHJlZmJoX20xICsgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSAzLCB5IC0gMywgdywgaCk7Ci0gICAgICAgIHJlZiA9IHMtPmVkZ2VfZW11X2J1ZmZlciArIDMgKiAyODggKyAzICogYnl0ZXNwZXJwaXhlbDsKLSAgICAgICAgcmVmX3N0cmlkZSA9IDI4ODsKLSAgICB9Ci0gICAgc21jKGRzdCwgZHN0X3N0cmlkZSwgcmVmLCByZWZfc3RyaWRlLCBiaCwgbXgsIG15LCBzdGVwWzBdLCBzdGVwWzFdKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgbWNfY2hyb21hX3NjYWxlZChWUDlDb250ZXh0ICpzLCB2cDlfc2NhbGVkX21jX2Z1bmMgc21jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOV9tY19mdW5jICgqbWMpWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF91LCB1aW50OF90ICpkc3RfdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWZfdSwgcHRyZGlmZl90IHNyY19zdHJpZGVfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWZfdiwgcHRyZGlmZl90IHNyY19zdHJpZGVfdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRGcmFtZSAqcmVmX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB5LCBwdHJkaWZmX3QgeCwgY29uc3QgVlA1Nm12ICppbl9tdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHgsIGludCBweSwgaW50IHB3LCBpbnQgcGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ3LCBpbnQgYmgsIGludCB3LCBpbnQgaCwgaW50IGJ5dGVzcGVycGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKnNjYWxlLCBjb25zdCB1aW50OF90ICpzdGVwKQotewotICAgIGlmIChzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPndpZHRoID09IHJlZl9mcmFtZS0+Zi0+d2lkdGggJiYKLSAgICAgICAgcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5oZWlnaHQgPT0gcmVmX2ZyYW1lLT5mLT5oZWlnaHQpIHsKLSAgICAgICAgbWNfY2hyb21hX3Vuc2NhbGVkKHMsIG1jLCBkc3RfdSwgZHN0X3YsIGRzdF9zdHJpZGUsIHJlZl91LCBzcmNfc3RyaWRlX3UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfdiwgc3JjX3N0cmlkZV92LCByZWZfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB5LCB4LCBpbl9tdiwgYncsIGJoLCB3LCBoLCBieXRlc3BlcnBpeGVsKTsKLSAgICB9IGVsc2UgewotICAgIGludCBteCwgbXk7Ci0gICAgaW50IHJlZmJ3X20xLCByZWZiaF9tMTsKLSAgICBpbnQgdGg7Ci0gICAgVlA1Nm12IG12OwotCi0gICAgaWYgKHMtPnNzX2gpIHsKLSAgICAgICAgLy8gQlVHIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avd2VibS9pc3N1ZXMvZGV0YWlsP2lkPTgyMAotICAgICAgICBtdi54ID0gYXZfY2xpcChpbl9tdi0+eCwgLSh4ICsgcHcgLSBweCArIDQpIDw8IDQsIChzLT5jb2xzICogNCAtIHggKyBweCArIDMpIDw8IDQpOwotICAgICAgICBteCA9IHNjYWxlX212KG12LngsIDApICsgKHNjYWxlX212KHggKiAxNiwgMCkgJiB+MTUpICsgKHNjYWxlX212KHggKiAzMiwgMCkgJiAxNSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXYueCA9IGF2X2NsaXAoaW5fbXYtPngsIC0oeCArIHB3IC0gcHggKyA0KSA8PCAzLCAocy0+Y29scyAqIDggLSB4ICsgcHggKyAzKSA8PCAzKTsKLSAgICAgICAgbXggPSBzY2FsZV9tdihtdi54IDw8IDEsIDApICsgc2NhbGVfbXYoeCAqIDE2LCAwKTsKLSAgICB9Ci0gICAgaWYgKHMtPnNzX3YpIHsKLSAgICAgICAgLy8gQlVHIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avd2VibS9pc3N1ZXMvZGV0YWlsP2lkPTgyMAotICAgICAgICBtdi55ID0gYXZfY2xpcChpbl9tdi0+eSwgLSh5ICsgcGggLSBweSArIDQpIDw8IDQsIChzLT5yb3dzICogNCAtIHkgKyBweSArIDMpIDw8IDQpOwotICAgICAgICBteSA9IHNjYWxlX212KG12LnksIDEpICsgKHNjYWxlX212KHkgKiAxNiwgMSkgJiB+MTUpICsgKHNjYWxlX212KHkgKiAzMiwgMSkgJiAxNSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbXYueSA9IGF2X2NsaXAoaW5fbXYtPnksIC0oeSArIHBoIC0gcHkgKyA0KSA8PCAzLCAocy0+cm93cyAqIDggLSB5ICsgcHkgKyAzKSA8PCAzKTsKLSAgICAgICAgbXkgPSBzY2FsZV9tdihtdi55IDw8IDEsIDEpICsgc2NhbGVfbXYoeSAqIDE2LCAxKTsKLSAgICB9Ci0jdW5kZWYgc2NhbGVfbXYKLSAgICB5ID0gbXkgPj4gNDsKLSAgICB4ID0gbXggPj4gNDsKLSAgICByZWZfdSArPSB5ICogc3JjX3N0cmlkZV91ICsgeCAqIGJ5dGVzcGVycGl4ZWw7Ci0gICAgcmVmX3YgKz0geSAqIHNyY19zdHJpZGVfdiArIHggKiBieXRlc3BlcnBpeGVsOwotICAgIG14ICY9IDE1OwotICAgIG15ICY9IDE1OwotICAgIHJlZmJ3X20xID0gKChidyAtIDEpICogc3RlcFswXSArIG14KSA+PiA0OwotICAgIHJlZmJoX20xID0gKChiaCAtIDEpICogc3RlcFsxXSArIG15KSA+PiA0OwotICAgIC8vIEZJWE1FIGJpbGluZWFyIGZpbHRlciBvbmx5IG5lZWRzIDAvMSBwaXhlbHMsIG5vdCAzLzQKLSAgICAvLyB3ZSB1c2UgKzcgYmVjYXVzZSB0aGUgbGFzdCA3IHBpeGVscyBvZiBlYWNoIHNicm93IGNhbiBiZSBjaGFuZ2VkIGluCi0gICAgLy8gdGhlIGxvbmdlc3QgbG9vcGZpbHRlciBvZiB0aGUgbmV4dCBzYnJvdwotICAgIHRoID0gKHkgKyByZWZiaF9tMSArIDQgKyA3KSA+PiAoNiAtIHMtPnNzX3YpOwotICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhyZWZfZnJhbWUsIEZGTUFYKHRoLCAwKSwgMCk7Ci0gICAgaWYgKHggPCAzIHx8IHkgPCAzIHx8IHggKyA0ID49IHcgLSByZWZid19tMSB8fCB5ICsgNCA+PSBoIC0gcmVmYmhfbTEpIHsKLSAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHMtPmVkZ2VfZW11X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl91IC0gMyAqIHNyY19zdHJpZGVfdSAtIDMgKiBieXRlc3BlcnBpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg4LCBzcmNfc3RyaWRlX3UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZid19tMSArIDgsIHJlZmJoX20xICsgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSAzLCB5IC0gMywgdywgaCk7Ci0gICAgICAgIHJlZl91ID0gcy0+ZWRnZV9lbXVfYnVmZmVyICsgMyAqIDI4OCArIDMgKiBieXRlc3BlcnBpeGVsOwotICAgICAgICBzbWMoZHN0X3UsIGRzdF9zdHJpZGUsIHJlZl91LCAyODgsIGJoLCBteCwgbXksIHN0ZXBbMF0sIHN0ZXBbMV0pOwotCi0gICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyhzLT5lZGdlX2VtdV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfdiAtIDMgKiBzcmNfc3RyaWRlX3YgLSAzICogYnl0ZXNwZXJwaXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OCwgc3JjX3N0cmlkZV92LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmYndfbTEgKyA4LCByZWZiaF9tMSArIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gMywgeSAtIDMsIHcsIGgpOwotICAgICAgICByZWZfdiA9IHMtPmVkZ2VfZW11X2J1ZmZlciArIDMgKiAyODggKyAzICogYnl0ZXNwZXJwaXhlbDsKLSAgICAgICAgc21jKGRzdF92LCBkc3Rfc3RyaWRlLCByZWZfdiwgMjg4LCBiaCwgbXgsIG15LCBzdGVwWzBdLCBzdGVwWzFdKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbWMoZHN0X3UsIGRzdF9zdHJpZGUsIHJlZl91LCBzcmNfc3RyaWRlX3UsIGJoLCBteCwgbXksIHN0ZXBbMF0sIHN0ZXBbMV0pOwotICAgICAgICBzbWMoZHN0X3YsIGRzdF9zdHJpZGUsIHJlZl92LCBzcmNfc3RyaWRlX3YsIGJoLCBteCwgbXksIHN0ZXBbMF0sIHN0ZXBbMV0pOwotICAgIH0KLSAgICB9Ci19Ci0KLSNkZWZpbmUgbWNfbHVtYV9kaXIocywgbWMsIGRzdCwgZHN0X2xzLCBzcmMsIHNyY19scywgdHJlZiwgcm93LCBjb2wsIG12LCBcCi0gICAgICAgICAgICAgICAgICAgIHB4LCBweSwgcHcsIHBoLCBidywgYmgsIHcsIGgsIGkpIFwKLSAgICBtY19sdW1hX3NjYWxlZChzLCBzLT5kc3AucyMjbWMsIHMtPmRzcC5tYywgZHN0LCBkc3RfbHMsIHNyYywgc3JjX2xzLCB0cmVmLCByb3csIGNvbCwgXAotICAgICAgICAgICAgICAgICAgIG12LCBweCwgcHksIHB3LCBwaCwgYncsIGJoLCB3LCBoLCBieXRlc3BlcnBpeGVsLCBcCi0gICAgICAgICAgICAgICAgICAgcy0+bXZzY2FsZVtiLT5yZWZbaV1dLCBzLT5tdnN0ZXBbYi0+cmVmW2ldXSkKLSNkZWZpbmUgbWNfY2hyb21hX2RpcihzLCBtYywgZHN0dSwgZHN0diwgZHN0X2xzLCBzcmN1LCBzcmN1X2xzLCBzcmN2LCBzcmN2X2xzLCB0cmVmLCBcCi0gICAgICAgICAgICAgICAgICAgICAgcm93LCBjb2wsIG12LCBweCwgcHksIHB3LCBwaCwgYncsIGJoLCB3LCBoLCBpKSBcCi0gICAgbWNfY2hyb21hX3NjYWxlZChzLCBzLT5kc3AucyMjbWMsIHMtPmRzcC5tYywgZHN0dSwgZHN0diwgZHN0X2xzLCBzcmN1LCBzcmN1X2xzLCBzcmN2LCBzcmN2X2xzLCB0cmVmLCBcCi0gICAgICAgICAgICAgICAgICAgICByb3csIGNvbCwgbXYsIHB4LCBweSwgcHcsIHBoLCBidywgYmgsIHcsIGgsIGJ5dGVzcGVycGl4ZWwsIFwKLSAgICAgICAgICAgICAgICAgICAgIHMtPm12c2NhbGVbYi0+cmVmW2ldXSwgcy0+bXZzdGVwW2ItPnJlZltpXV0pCi0jZGVmaW5lIFNDQUxFRCAxCi0jZGVmaW5lIEZOKHgpIHgjI19zY2FsZWRfOGJwcAotI2RlZmluZSBCWVRFU19QRVJfUElYRUwgMQotI2luY2x1ZGUgInZwOV9tY190ZW1wbGF0ZS5jIgotI3VuZGVmIEZOCi0jdW5kZWYgQllURVNfUEVSX1BJWEVMCi0jZGVmaW5lIEZOKHgpIHgjI19zY2FsZWRfMTZicHAKLSNkZWZpbmUgQllURVNfUEVSX1BJWEVMIDIKLSNpbmNsdWRlICJ2cDlfbWNfdGVtcGxhdGUuYyIKLSN1bmRlZiBtY19sdW1hX2RpcgotI3VuZGVmIG1jX2Nocm9tYV9kaXIKLSN1bmRlZiBGTgotI3VuZGVmIEJZVEVTX1BFUl9QSVhFTAotI3VuZGVmIFNDQUxFRAotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGludGVyX3JlY29uKEFWQ29kZWNDb250ZXh0ICpjdHgsIGludCBieXRlc3BlcnBpeGVsKQotewotICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKLSAgICBWUDlCbG9jayAqYiA9IHMtPmI7Ci0gICAgaW50IHJvdyA9IHMtPnJvdywgY29sID0gcy0+Y29sOwotCi0gICAgaWYgKHMtPm12c2NhbGVbYi0+cmVmWzBdXVswXSB8fCAoYi0+Y29tcCAmJiBzLT5tdnNjYWxlW2ItPnJlZlsxXV1bMF0pKSB7Ci0gICAgICAgIGlmIChieXRlc3BlcnBpeGVsID09IDEpIHsKLSAgICAgICAgICAgIGludGVyX3ByZWRfc2NhbGVkXzhicHAoY3R4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludGVyX3ByZWRfc2NhbGVkXzE2YnBwKGN0eCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYnl0ZXNwZXJwaXhlbCA9PSAxKSB7Ci0gICAgICAgICAgICBpbnRlcl9wcmVkXzhicHAoY3R4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludGVyX3ByZWRfMTZicHAoY3R4KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIWItPnNraXApIHsKLSAgICAgICAgLyogbW9zdGx5IGNvcGllZCBpbnRyYV9yZWNvbigpICovCi0KLSAgICAgICAgaW50IHc0ID0gYndoX3RhYlsxXVtiLT5ic11bMF0gPDwgMSwgc3RlcDFkID0gMSA8PCBiLT50eCwgbjsKLSAgICAgICAgaW50IGg0ID0gYndoX3RhYlsxXVtiLT5ic11bMV0gPDwgMSwgeCwgeSwgc3RlcCA9IDEgPDwgKGItPnR4ICogMik7Ci0gICAgICAgIGludCBlbmRfeCA9IEZGTUlOKDIgKiAocy0+Y29scyAtIGNvbCksIHc0KTsKLSAgICAgICAgaW50IGVuZF95ID0gRkZNSU4oMiAqIChzLT5yb3dzIC0gcm93KSwgaDQpOwotICAgICAgICBpbnQgdHggPSA0ICogcy0+cy5oLmxvc3NsZXNzICsgYi0+dHgsIHV2dHggPSBiLT51dnR4ICsgNCAqIHMtPnMuaC5sb3NzbGVzczsKLSAgICAgICAgaW50IHV2c3RlcDFkID0gMSA8PCBiLT51dnR4LCBwOwotICAgICAgICB1aW50OF90ICpkc3QgPSBzLT5kc3RbMF07Ci0KLSAgICAgICAgLy8geSBpdHhmbSBhZGQKLSAgICAgICAgZm9yIChuID0gMCwgeSA9IDA7IHkgPCBlbmRfeTsgeSArPSBzdGVwMWQpIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGRzdDsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBlbmRfeDsgeCArPSBzdGVwMWQsCi0gICAgICAgICAgICAgICAgIHB0ciArPSA0ICogc3RlcDFkICogYnl0ZXNwZXJwaXhlbCwgbiArPSBzdGVwKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVvYiA9IGItPnR4ID4gVFhfOFg4ID8gQVZfUk4xNkEoJnMtPmVvYltuXSkgOiBzLT5lb2Jbbl07Ci0KLSAgICAgICAgICAgICAgICBpZiAoZW9iKQotICAgICAgICAgICAgICAgICAgICBzLT5kc3AuaXR4Zm1fYWRkW3R4XVtEQ1RfRENUXShwdHIsIHMtPnlfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5ibG9jayArIDE2ICogbiAqIGJ5dGVzcGVycGl4ZWwsIGVvYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3QgKz0gNCAqIHMtPnlfc3RyaWRlICogc3RlcDFkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdXYgaXR4Zm0gYWRkCi0gICAgICAgIGVuZF94ID4+PSBzLT5zc19oOwotICAgICAgICBlbmRfeSA+Pj0gcy0+c3NfdjsKLSAgICAgICAgc3RlcCA9IDEgPDwgKGItPnV2dHggKiAyKTsKLSAgICAgICAgZm9yIChwID0gMDsgcCA8IDI7IHArKykgewotICAgICAgICAgICAgZHN0ID0gcy0+ZHN0W3AgKyAxXTsKLSAgICAgICAgICAgIGZvciAobiA9IDAsIHkgPSAwOyB5IDwgZW5kX3k7IHkgKz0gdXZzdGVwMWQpIHsKLSAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSBkc3Q7Ci0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGVuZF94OyB4ICs9IHV2c3RlcDFkLAotICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQgKiB1dnN0ZXAxZCAqIGJ5dGVzcGVycGl4ZWwsIG4gKz0gc3RlcCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgZW9iID0gYi0+dXZ0eCA+IFRYXzhYOCA/IEFWX1JOMTZBKCZzLT51dmVvYltwXVtuXSkgOiBzLT51dmVvYltwXVtuXTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZW9iKQotICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLml0eGZtX2FkZFt1dnR4XVtEQ1RfRENUXShwdHIsIHMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXZibG9ja1twXSArIDE2ICogbiAqIGJ5dGVzcGVycGl4ZWwsIGVvYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRzdCArPSA0ICogdXZzdGVwMWQgKiBzLT51dl9zdHJpZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVyX3JlY29uXzhicHAoQVZDb2RlY0NvbnRleHQgKmN0eCkKLXsKLSAgICBpbnRlcl9yZWNvbihjdHgsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlcl9yZWNvbl8xNmJwcChBVkNvZGVjQ29udGV4dCAqY3R4KQotewotICAgIGludGVyX3JlY29uKGN0eCwgMik7Ci19Ci0KLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgbWFza19lZGdlcyh1aW50OF90ICgqbWFzaylbOF1bNF0sIGludCBzc19oLCBpbnQgc3NfdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X2FuZF83LCBpbnQgY29sX2FuZF83LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IGNvbF9lbmQsIGludCByb3dfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gVHhmbU1vZGUgdHgsIGludCBza2lwX2ludGVyKQotewotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB3aWRlX2ZpbHRlcl9jb2xfbWFza1syXSA9IHsgMHgxMSwgMHgwMSB9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCB3aWRlX2ZpbHRlcl9yb3dfbWFza1syXSA9IHsgMHgwMywgMHgwNyB9OwotCi0gICAgLy8gRklYTUUgSSdtIHByZXR0eSBzdXJlIGFsbCBsb29wcyBjYW4gYmUgcmVwbGFjZWQgYnkgYSBzaW5nbGUgTFVUIGlmCi0gICAgLy8gd2UgbWFrZSBWUDlGaWx0ZXIubWFzayB1aW50NjRfdCAoaS5lLiByb3cvY29sIGFsbCBzaW5nbGUgdmFyaWFibGUpCi0gICAgLy8gYW5kIG1ha2UgdGhlIExVVCA1LWluZGV4ZWQgKGJsLCBicCwgaXNfdXYsIHR4IGFuZCByb3cvY29sKSwgYW5kIHRoZW4KLSAgICAvLyB1c2Ugcm93X2FuZF83L2NvbF9hbmRfNyBhcyBzaGlmdHMgKDEqY29sX2FuZF83Kzgqcm93X2FuZF83KQotCi0gICAgLy8gdGhlIGludGVuZGVkIGJlaGF2aW91ciBvZiB0aGUgdnA5IGxvb3BmaWx0ZXIgaXMgdG8gd29yayBvbiA4LXBpeGVsCi0gICAgLy8gZWRnZXMuIFRoaXMgbWVhbnMgdGhhdCBmb3IgVVYsIHdlIHdvcmsgb24gdHdvIHN1YnNhbXBsZWQgYmxvY2tzIGF0Ci0gICAgLy8gYSB0aW1lLCBhbmQgd2Ugb25seSB1c2UgdGhlIHRvcGxlZnQgYmxvY2sncyBtb2RlIGluZm9ybWF0aW9uIHRvIHNldAotICAgIC8vIHRoaW5ncyBsaWtlIGJsb2NrIHN0cmVuZ3RoLiBUaHVzLCBmb3IgYW55IGJsb2NrIHNpemUgc21hbGxlciB0aGFuCi0gICAgLy8gMTZ4MTYsIGlnbm9yZSB0aGUgb2RkIHBvcnRpb24gb2YgdGhlIGJsb2NrLgotICAgIGlmICh0eCA9PSBUWF80WDQgJiYgKHNzX3YgfCBzc19oKSkgewotICAgICAgICBpZiAoaCA9PSBzc192KSB7Ci0gICAgICAgICAgICBpZiAocm93X2FuZF83ICYgMSkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICBpZiAoIXJvd19lbmQpCi0gICAgICAgICAgICAgICAgaCArPSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3ID09IHNzX2gpIHsKLSAgICAgICAgICAgIGlmIChjb2xfYW5kXzcgJiAxKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGlmICghY29sX2VuZCkKLSAgICAgICAgICAgICAgICB3ICs9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodHggPT0gVFhfNFg0ICYmICFza2lwX2ludGVyKSB7Ci0gICAgICAgIGludCB0ID0gMSA8PCBjb2xfYW5kXzcsIG1fY29sID0gKHQgPDwgdykgLSB0LCB5OwotICAgICAgICAvLyBvbiAzMi1weCBlZGdlcywgdXNlIHRoZSA4LXB4IHdpZGUgbG9vcGZpbHRlcjsgZWxzZSwgdXNlIDQtcHggd2lkZQotICAgICAgICBpbnQgbV9yb3dfOCA9IG1fY29sICYgd2lkZV9maWx0ZXJfY29sX21hc2tbc3NfaF0sIG1fcm93XzQgPSBtX2NvbCAtIG1fcm93Xzg7Ci0KLSAgICAgICAgZm9yICh5ID0gcm93X2FuZF83OyB5IDwgaCArIHJvd19hbmRfNzsgeSsrKSB7Ci0gICAgICAgICAgICBpbnQgY29sX21hc2tfaWQgPSAyIC0gISh5ICYgd2lkZV9maWx0ZXJfcm93X21hc2tbc3Nfdl0pOwotCi0gICAgICAgICAgICBtYXNrWzBdW3ldWzFdIHw9IG1fcm93Xzg7Ci0gICAgICAgICAgICBtYXNrWzBdW3ldWzJdIHw9IG1fcm93XzQ7Ci0gICAgICAgICAgICAvLyBmb3Igb2RkIGxpbmVzLCBpZiB0aGUgb2RkIGNvbCBpcyBub3QgYmVpbmcgZmlsdGVyZWQsCi0gICAgICAgICAgICAvLyBza2lwIG9kZCByb3cgYWxzbzoKLSAgICAgICAgICAgIC8vIC4tLS0uIDwtLSBhCi0gICAgICAgICAgICAvLyB8ICAgfAotICAgICAgICAgICAgLy8gfF9fX3wgPC0tIGIKLSAgICAgICAgICAgIC8vIF4gICBeCi0gICAgICAgICAgICAvLyBjICAgZAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIGlmIGEvYyBhcmUgZXZlbiByb3cvY29sIGFuZCBiL2QgYXJlIG9kZCwgYW5kIGQgaXMgc2tpcHBlZCwKLSAgICAgICAgICAgIC8vIGUuZy4gcmlnaHQgZWRnZSBvZiBzaXplLTY2eDY2LndlYm0sIHRoZW4gc2tpcCBiIGFsc28gKGJ1ZykKLSAgICAgICAgICAgIGlmICgoc3NfaCAmIHNzX3YpICYmIChjb2xfZW5kICYgMSkgJiYgKHkgJiAxKSkgewotICAgICAgICAgICAgICAgIG1hc2tbMV1beV1bY29sX21hc2tfaWRdIHw9ICh0IDw8ICh3IC0gMSkpIC0gdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFza1sxXVt5XVtjb2xfbWFza19pZF0gfD0gbV9jb2w7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXNzX2gpCi0gICAgICAgICAgICAgICAgbWFza1swXVt5XVszXSB8PSBtX2NvbDsKLSAgICAgICAgICAgIGlmICghc3NfdikgewotICAgICAgICAgICAgICAgIGlmIChzc19oICYmIChjb2xfZW5kICYgMSkpCi0gICAgICAgICAgICAgICAgICAgIG1hc2tbMV1beV1bM10gfD0gKHQgPDwgKHcgLSAxKSkgLSB0OwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgbWFza1sxXVt5XVszXSB8PSBtX2NvbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCB5LCB0ID0gMSA8PCBjb2xfYW5kXzcsIG1fY29sID0gKHQgPDwgdykgLSB0OwotCi0gICAgICAgIGlmICghc2tpcF9pbnRlcikgewotICAgICAgICAgICAgaW50IG1hc2tfaWQgPSAodHggPT0gVFhfOFg4KTsKLSAgICAgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBtYXNrc1s0XSA9IHsgMHhmZiwgMHg1NSwgMHgxMSwgMHgwMSB9OwotICAgICAgICAgICAgaW50IGwyID0gdHggKyBzc19oIC0gMSwgc3RlcDFkOwotICAgICAgICAgICAgaW50IG1fcm93ID0gbV9jb2wgJiBtYXNrc1tsMl07Ci0KLSAgICAgICAgICAgIC8vIGF0IG9kZCBVViBjb2wvcm93IGVkZ2VzIHR4MTYvdHgzMiBsb29wZmlsdGVyIGVkZ2VzLCBmb3JjZQotICAgICAgICAgICAgLy8gOHdkIGxvb3BmaWx0ZXIgdG8gcHJldmVudCBnb2luZyBvZmYgdGhlIHZpc2libGUgZWRnZS4KLSAgICAgICAgICAgIGlmIChzc19oICYmIHR4ID4gVFhfOFg4ICYmICh3IF4gKHcgLSAxKSkgPT0gMSkgewotICAgICAgICAgICAgICAgIGludCBtX3Jvd18xNiA9ICgodCA8PCAodyAtIDEpKSAtIHQpICYgbWFza3NbbDJdOwotICAgICAgICAgICAgICAgIGludCBtX3Jvd184ID0gbV9yb3cgLSBtX3Jvd18xNjsKLQotICAgICAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzc7IHkrKykgewotICAgICAgICAgICAgICAgICAgICBtYXNrWzBdW3ldWzBdIHw9IG1fcm93XzE2OwotICAgICAgICAgICAgICAgICAgICBtYXNrWzBdW3ldWzFdIHw9IG1fcm93Xzg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKHkgPSByb3dfYW5kXzc7IHkgPCBoICsgcm93X2FuZF83OyB5KyspCi0gICAgICAgICAgICAgICAgICAgIG1hc2tbMF1beV1bbWFza19pZF0gfD0gbV9yb3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGwyID0gdHggKyBzc192IC0gMTsKLSAgICAgICAgICAgIHN0ZXAxZCA9IDEgPDwgbDI7Ci0gICAgICAgICAgICBpZiAoc3NfdiAmJiB0eCA+IFRYXzhYOCAmJiAoaCBeIChoIC0gMSkpID09IDEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHkgPSByb3dfYW5kXzc7IHkgPCBoICsgcm93X2FuZF83IC0gMTsgeSArPSBzdGVwMWQpCi0gICAgICAgICAgICAgICAgICAgIG1hc2tbMV1beV1bMF0gfD0gbV9jb2w7Ci0gICAgICAgICAgICAgICAgaWYgKHkgLSByb3dfYW5kXzcgPT0gaCAtIDEpCi0gICAgICAgICAgICAgICAgICAgIG1hc2tbMV1beV1bMV0gfD0gbV9jb2w7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzc7IHkgKz0gc3RlcDFkKQotICAgICAgICAgICAgICAgICAgICBtYXNrWzFdW3ldW21hc2tfaWRdIHw9IG1fY29sOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHR4ICE9IFRYXzRYNCkgewotICAgICAgICAgICAgaW50IG1hc2tfaWQ7Ci0KLSAgICAgICAgICAgIG1hc2tfaWQgPSAodHggPT0gVFhfOFg4KSB8fCAoaCA9PSBzc192KTsKLSAgICAgICAgICAgIG1hc2tbMV1bcm93X2FuZF83XVttYXNrX2lkXSB8PSBtX2NvbDsKLSAgICAgICAgICAgIG1hc2tfaWQgPSAodHggPT0gVFhfOFg4KSB8fCAodyA9PSBzc19oKTsKLSAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzc7IHkrKykKLSAgICAgICAgICAgICAgICBtYXNrWzBdW3ldW21hc2tfaWRdIHw9IHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQgdDggPSB0ICYgd2lkZV9maWx0ZXJfY29sX21hc2tbc3NfaF0sIHQ0ID0gdCAtIHQ4OwotCi0gICAgICAgICAgICBmb3IgKHkgPSByb3dfYW5kXzc7IHkgPCBoICsgcm93X2FuZF83OyB5KyspIHsKLSAgICAgICAgICAgICAgICBtYXNrWzBdW3ldWzJdIHw9IHQ0OwotICAgICAgICAgICAgICAgIG1hc2tbMF1beV1bMV0gfD0gdDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtYXNrWzFdW3Jvd19hbmRfN11bMiAtICEocm93X2FuZF83ICYgd2lkZV9maWx0ZXJfcm93X21hc2tbc3Nfdl0pXSB8PSBtX2NvbDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgZGVjb2RlX2IoQVZDb2RlY0NvbnRleHQgKmN0eCwgaW50IHJvdywgaW50IGNvbCwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBWUDlGaWx0ZXIgKmxmbHZsLCBwdHJkaWZmX3QgeW9mZiwgcHRyZGlmZl90IHV2b2ZmLAotICAgICAgICAgICAgICAgICAgICAgZW51bSBCbG9ja0xldmVsIGJsLCBlbnVtIEJsb2NrUGFydGl0aW9uIGJwKQotewotICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKLSAgICBWUDlCbG9jayAqYiA9IHMtPmI7Ci0gICAgZW51bSBCbG9ja1NpemUgYnMgPSBibCAqIDMgKyBicDsKLSAgICBpbnQgYnl0ZXNwZXJwaXhlbCA9IHMtPmJ5dGVzcGVycGl4ZWw7Ci0gICAgaW50IHc0ID0gYndoX3RhYlsxXVtic11bMF0sIGg0ID0gYndoX3RhYlsxXVtic11bMV0sIGx2bDsKLSAgICBpbnQgZW11WzJdOwotICAgIEFWRnJhbWUgKmYgPSBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmY7Ci0KLSAgICBzLT5yb3cgPSByb3c7Ci0gICAgcy0+cm93NyA9IHJvdyAmIDc7Ci0gICAgcy0+Y29sID0gY29sOwotICAgIHMtPmNvbDcgPSBjb2wgJiA3OwotICAgIHMtPm1pbl9tdi54ID0gLSgxMjggKyBjb2wgKiA2NCk7Ci0gICAgcy0+bWluX212LnkgPSAtKDEyOCArIHJvdyAqIDY0KTsKLSAgICBzLT5tYXhfbXYueCA9IDEyOCArIChzLT5jb2xzIC0gY29sIC0gdzQpICogNjQ7Ci0gICAgcy0+bWF4X212LnkgPSAxMjggKyAocy0+cm93cyAtIHJvdyAtIGg0KSAqIDY0OwotICAgIGlmIChzLT5wYXNzIDwgMikgewotICAgICAgICBiLT5icyA9IGJzOwotICAgICAgICBiLT5ibCA9IGJsOwotICAgICAgICBiLT5icCA9IGJwOwotICAgICAgICBkZWNvZGVfbW9kZShjdHgpOwotICAgICAgICBiLT51dnR4ID0gYi0+dHggLSAoKHMtPnNzX2ggJiYgdzQgKiAyID09ICgxIDw8IGItPnR4KSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zc192ICYmIGg0ICogMiA9PSAoMSA8PCBiLT50eCkpKTsKLQotICAgICAgICBpZiAoIWItPnNraXApIHsKLSAgICAgICAgICAgIGludCBoYXNfY29lZmZzOwotCi0gICAgICAgICAgICBpZiAoYnl0ZXNwZXJwaXhlbCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgaGFzX2NvZWZmcyA9IGRlY29kZV9jb2VmZnNfOGJwcChjdHgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBoYXNfY29lZmZzID0gZGVjb2RlX2NvZWZmc18xNmJwcChjdHgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFoYXNfY29lZmZzICYmIGItPmJzIDw9IEJTXzh4OCAmJiAhYi0+aW50cmEpIHsKLSAgICAgICAgICAgICAgICBiLT5za2lwID0gMTsKLSAgICAgICAgICAgICAgICBtZW1zZXQoJnMtPmFib3ZlX3NraXBfY3R4W2NvbF0sIDEsIHc0KTsKLSAgICAgICAgICAgICAgICBtZW1zZXQoJnMtPmxlZnRfc2tpcF9jdHhbcy0+cm93N10sIDEsIGg0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCByb3c3ID0gcy0+cm93NzsKLQotI2RlZmluZSBTUExBVF9aRVJPX0NUWCh2LCBuKSBcCi0gICAgc3dpdGNoIChuKSB7IFwKLSAgICBjYXNlIDE6ICB2ID0gMDsgICAgICAgICAgYnJlYWs7IFwKLSAgICBjYXNlIDI6ICBBVl9aRVJPMTYoJnYpOyAgYnJlYWs7IFwKLSAgICBjYXNlIDQ6ICBBVl9aRVJPMzIoJnYpOyAgYnJlYWs7IFwKLSAgICBjYXNlIDg6ICBBVl9aRVJPNjQoJnYpOyAgYnJlYWs7IFwKLSAgICBjYXNlIDE2OiBBVl9aRVJPMTI4KCZ2KTsgYnJlYWs7IFwKLSAgICB9Ci0jZGVmaW5lIFNQTEFUX1pFUk9fWVVWKGRpciwgdmFyLCBvZmYsIG4sIGRpcjIpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgU1BMQVRfWkVST19DVFgocy0+ZGlyIyNfeV8jI3ZhcltvZmYgKiAyXSwgbiAqIDIpOyBcCi0gICAgICAgIGlmIChzLT5zc18jI2RpcjIpIHsgXAotICAgICAgICAgICAgU1BMQVRfWkVST19DVFgocy0+ZGlyIyNfdXZfIyN2YXJbMF1bb2ZmXSwgbik7IFwKLSAgICAgICAgICAgIFNQTEFUX1pFUk9fQ1RYKHMtPmRpciMjX3V2XyMjdmFyWzFdW29mZl0sIG4pOyBcCi0gICAgICAgIH0gZWxzZSB7IFwKLSAgICAgICAgICAgIFNQTEFUX1pFUk9fQ1RYKHMtPmRpciMjX3V2XyMjdmFyWzBdW29mZiAqIDJdLCBuICogMik7IFwKLSAgICAgICAgICAgIFNQTEFUX1pFUk9fQ1RYKHMtPmRpciMjX3V2XyMjdmFyWzFdW29mZiAqIDJdLCBuICogMik7IFwKLSAgICAgICAgfSBcCi0gICAgfSB3aGlsZSAoMCkKLQotICAgICAgICAgICAgc3dpdGNoICh3NCkgewotICAgICAgICAgICAgY2FzZSAxOiBTUExBVF9aRVJPX1lVVihhYm92ZSwgbm56X2N0eCwgY29sLCAxLCBoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6IFNQTEFUX1pFUk9fWVVWKGFib3ZlLCBubnpfY3R4LCBjb2wsIDIsIGgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNDogU1BMQVRfWkVST19ZVVYoYWJvdmUsIG5uel9jdHgsIGNvbCwgNCwgaCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4OiBTUExBVF9aRVJPX1lVVihhYm92ZSwgbm56X2N0eCwgY29sLCA4LCBoKTsgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGg0KSB7Ci0gICAgICAgICAgICBjYXNlIDE6IFNQTEFUX1pFUk9fWVVWKGxlZnQsIG5uel9jdHgsIHJvdzcsIDEsIHYpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogU1BMQVRfWkVST19ZVVYobGVmdCwgbm56X2N0eCwgcm93NywgMiwgdik7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OiBTUExBVF9aRVJPX1lVVihsZWZ0LCBubnpfY3R4LCByb3c3LCA0LCB2KTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDg6IFNQTEFUX1pFUk9fWVVWKGxlZnQsIG5uel9jdHgsIHJvdzcsIDgsIHYpOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5wYXNzID09IDEpIHsKLSAgICAgICAgICAgIHMtPmIrKzsKLSAgICAgICAgICAgIHMtPmJsb2NrICs9IHc0ICogaDQgKiA2NCAqIGJ5dGVzcGVycGl4ZWw7Ci0gICAgICAgICAgICBzLT51dmJsb2NrWzBdICs9IHc0ICogaDQgKiA2NCAqIGJ5dGVzcGVycGl4ZWwgPj4gKHMtPnNzX2ggKyBzLT5zc192KTsKLSAgICAgICAgICAgIHMtPnV2YmxvY2tbMV0gKz0gdzQgKiBoNCAqIDY0ICogYnl0ZXNwZXJwaXhlbCA+PiAocy0+c3NfaCArIHMtPnNzX3YpOwotICAgICAgICAgICAgcy0+ZW9iICs9IDQgKiB3NCAqIGg0OwotICAgICAgICAgICAgcy0+dXZlb2JbMF0gKz0gNCAqIHc0ICogaDQgPj4gKHMtPnNzX2ggKyBzLT5zc192KTsKLSAgICAgICAgICAgIHMtPnV2ZW9iWzFdICs9IDQgKiB3NCAqIGg0ID4+IChzLT5zc19oICsgcy0+c3Nfdik7Ci0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGVtdWxhdGVkIG92ZXJoYW5ncyBpZiB0aGUgc3RyaWRlIG9mIHRoZSB0YXJnZXQgYnVmZmVyIGNhbid0IGhvbGQuIFRoaXMKLSAgICAvLyBtYWtlcyBpdCBwb3NzaWJsZSB0byBzdXBwb3J0IGVtdS1lZGdlIGFuZCBzbyBvbiBldmVuIGlmIHdlIGhhdmUgbGFyZ2UgYmxvY2sKLSAgICAvLyBvdmVyaGFuZ3MKLSAgICBlbXVbMF0gPSAoY29sICsgdzQpICogOCAqIGJ5dGVzcGVycGl4ZWwgPiBmLT5saW5lc2l6ZVswXSB8fAotICAgICAgICAgICAgIChyb3cgKyBoNCkgPiBzLT5yb3dzOwotICAgIGVtdVsxXSA9ICgoY29sICsgdzQpICogOCA+PiBzLT5zc19oKSAqIGJ5dGVzcGVycGl4ZWwgPiBmLT5saW5lc2l6ZVsxXSB8fAotICAgICAgICAgICAgIChyb3cgKyBoNCkgPiBzLT5yb3dzOwotICAgIGlmIChlbXVbMF0pIHsKLSAgICAgICAgcy0+ZHN0WzBdID0gcy0+dG1wX3k7Ci0gICAgICAgIHMtPnlfc3RyaWRlID0gMTI4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMtPmRzdFswXSA9IGYtPmRhdGFbMF0gKyB5b2ZmOwotICAgICAgICBzLT55X3N0cmlkZSA9IGYtPmxpbmVzaXplWzBdOwotICAgIH0KLSAgICBpZiAoZW11WzFdKSB7Ci0gICAgICAgIHMtPmRzdFsxXSA9IHMtPnRtcF91dlswXTsKLSAgICAgICAgcy0+ZHN0WzJdID0gcy0+dG1wX3V2WzFdOwotICAgICAgICBzLT51dl9zdHJpZGUgPSAxMjg7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy0+ZHN0WzFdID0gZi0+ZGF0YVsxXSArIHV2b2ZmOwotICAgICAgICBzLT5kc3RbMl0gPSBmLT5kYXRhWzJdICsgdXZvZmY7Ci0gICAgICAgIHMtPnV2X3N0cmlkZSA9IGYtPmxpbmVzaXplWzFdOwotICAgIH0KLSAgICBpZiAoYi0+aW50cmEpIHsKLSAgICAgICAgaWYgKHMtPmJwcCA+IDgpIHsKLSAgICAgICAgICAgIGludHJhX3JlY29uXzE2YnBwKGN0eCwgeW9mZiwgdXZvZmYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50cmFfcmVjb25fOGJwcChjdHgsIHlvZmYsIHV2b2ZmKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzLT5icHAgPiA4KSB7Ci0gICAgICAgICAgICBpbnRlcl9yZWNvbl8xNmJwcChjdHgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50ZXJfcmVjb25fOGJwcChjdHgpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChlbXVbMF0pIHsKLSAgICAgICAgaW50IHcgPSBGRk1JTihzLT5jb2xzIC0gY29sLCB3NCkgKiA4LCBoID0gRkZNSU4ocy0+cm93cyAtIHJvdywgaDQpICogOCwgbiwgbyA9IDA7Ci0KLSAgICAgICAgZm9yIChuID0gMDsgbyA8IHc7IG4rKykgewotICAgICAgICAgICAgaW50IGJ3ID0gNjQgPj4gbjsKLQotICAgICAgICAgICAgYXZfYXNzZXJ0MihuIDw9IDQpOwotICAgICAgICAgICAgaWYgKHcgJiBidykgewotICAgICAgICAgICAgICAgIHMtPmRzcC5tY1tuXVswXVswXVswXVswXShmLT5kYXRhWzBdICsgeW9mZiArIG8gKiBieXRlc3BlcnBpeGVsLCBmLT5saW5lc2l6ZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dG1wX3kgKyBvICogYnl0ZXNwZXJwaXhlbCwgMTI4LCBoLCAwLCAwKTsKLSAgICAgICAgICAgICAgICBvICs9IGJ3OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChlbXVbMV0pIHsKLSAgICAgICAgaW50IHcgPSBGRk1JTihzLT5jb2xzIC0gY29sLCB3NCkgKiA4ID4+IHMtPnNzX2g7Ci0gICAgICAgIGludCBoID0gRkZNSU4ocy0+cm93cyAtIHJvdywgaDQpICogOCA+PiBzLT5zc192LCBuLCBvID0gMDsKLQotICAgICAgICBmb3IgKG4gPSBzLT5zc19oOyBvIDwgdzsgbisrKSB7Ci0gICAgICAgICAgICBpbnQgYncgPSA2NCA+PiBuOwotCi0gICAgICAgICAgICBhdl9hc3NlcnQyKG4gPD0gNCk7Ci0gICAgICAgICAgICBpZiAodyAmIGJ3KSB7Ci0gICAgICAgICAgICAgICAgcy0+ZHNwLm1jW25dWzBdWzBdWzBdWzBdKGYtPmRhdGFbMV0gKyB1dm9mZiArIG8gKiBieXRlc3BlcnBpeGVsLCBmLT5saW5lc2l6ZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dG1wX3V2WzBdICsgbyAqIGJ5dGVzcGVycGl4ZWwsIDEyOCwgaCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgcy0+ZHNwLm1jW25dWzBdWzBdWzBdWzBdKGYtPmRhdGFbMl0gKyB1dm9mZiArIG8gKiBieXRlc3BlcnBpeGVsLCBmLT5saW5lc2l6ZVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dG1wX3V2WzFdICsgbyAqIGJ5dGVzcGVycGl4ZWwsIDEyOCwgaCwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgbyArPSBidzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHBpY2sgZmlsdGVyIGxldmVsIGFuZCBmaW5kIGVkZ2VzIHRvIGFwcGx5IGZpbHRlciB0bwotICAgIGlmIChzLT5zLmguZmlsdGVyLmxldmVsICYmCi0gICAgICAgIChsdmwgPSBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5sZmx2bFtiLT5pbnRyYSA/IDAgOiBiLT5yZWZbMF0gKyAxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ItPm1vZGVbM10gIT0gWkVST01WXSkgPiAwKSB7Ci0gICAgICAgIGludCB4X2VuZCA9IEZGTUlOKHMtPmNvbHMgLSBjb2wsIHc0KSwgeV9lbmQgPSBGRk1JTihzLT5yb3dzIC0gcm93LCBoNCk7Ci0gICAgICAgIGludCBza2lwX2ludGVyID0gIWItPmludHJhICYmIGItPnNraXAsIGNvbDcgPSBzLT5jb2w3LCByb3c3ID0gcy0+cm93NzsKLQotICAgICAgICBzZXRjdHhfMmQoJmxmbHZsLT5sZXZlbFtyb3c3ICogOCArIGNvbDddLCB3NCwgaDQsIDgsIGx2bCk7Ci0gICAgICAgIG1hc2tfZWRnZXMobGZsdmwtPm1hc2tbMF0sIDAsIDAsIHJvdzcsIGNvbDcsIHhfZW5kLCB5X2VuZCwgMCwgMCwgYi0+dHgsIHNraXBfaW50ZXIpOwotICAgICAgICBpZiAocy0+c3NfaCB8fCBzLT5zc192KQotICAgICAgICAgICAgbWFza19lZGdlcyhsZmx2bC0+bWFza1sxXSwgcy0+c3NfaCwgcy0+c3Nfdiwgcm93NywgY29sNywgeF9lbmQsIHlfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2xzICYgMSAmJiBjb2wgKyB3NCA+PSBzLT5jb2xzID8gcy0+Y29scyAmIDcgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICBzLT5yb3dzICYgMSAmJiByb3cgKyBoNCA+PSBzLT5yb3dzID8gcy0+cm93cyAmIDcgOiAwLAotICAgICAgICAgICAgICAgICAgICAgICBiLT51dnR4LCBza2lwX2ludGVyKTsKLQotICAgICAgICBpZiAoIXMtPmZpbHRlcl9sdXQubGltX2x1dFtsdmxdKSB7Ci0gICAgICAgICAgICBpbnQgc2hhcnAgPSBzLT5zLmguZmlsdGVyLnNoYXJwbmVzczsKLSAgICAgICAgICAgIGludCBsaW1pdCA9IGx2bDsKLQotICAgICAgICAgICAgaWYgKHNoYXJwID4gMCkgewotICAgICAgICAgICAgICAgIGxpbWl0ID4+PSAoc2hhcnAgKyAzKSA+PiAyOwotICAgICAgICAgICAgICAgIGxpbWl0ID0gRkZNSU4obGltaXQsIDkgLSBzaGFycCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsaW1pdCA9IEZGTUFYKGxpbWl0LCAxKTsKLQotICAgICAgICAgICAgcy0+ZmlsdGVyX2x1dC5saW1fbHV0W2x2bF0gPSBsaW1pdDsKLSAgICAgICAgICAgIHMtPmZpbHRlcl9sdXQubWJsaW1fbHV0W2x2bF0gPSAyICogKGx2bCArIDIpICsgbGltaXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocy0+cGFzcyA9PSAyKSB7Ci0gICAgICAgIHMtPmIrKzsKLSAgICAgICAgcy0+YmxvY2sgKz0gdzQgKiBoNCAqIDY0ICogYnl0ZXNwZXJwaXhlbDsKLSAgICAgICAgcy0+dXZibG9ja1swXSArPSB3NCAqIGg0ICogNjQgKiBieXRlc3BlcnBpeGVsID4+IChzLT5zc192ICsgcy0+c3NfaCk7Ci0gICAgICAgIHMtPnV2YmxvY2tbMV0gKz0gdzQgKiBoNCAqIDY0ICogYnl0ZXNwZXJwaXhlbCA+PiAocy0+c3NfdiArIHMtPnNzX2gpOwotICAgICAgICBzLT5lb2IgKz0gNCAqIHc0ICogaDQ7Ci0gICAgICAgIHMtPnV2ZW9iWzBdICs9IDQgKiB3NCAqIGg0ID4+IChzLT5zc192ICsgcy0+c3NfaCk7Ci0gICAgICAgIHMtPnV2ZW9iWzFdICs9IDQgKiB3NCAqIGg0ID4+IChzLT5zc192ICsgcy0+c3NfaCk7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBkZWNvZGVfc2IoQVZDb2RlY0NvbnRleHQgKmN0eCwgaW50IHJvdywgaW50IGNvbCwgc3RydWN0IFZQOUZpbHRlciAqbGZsdmwsCitzdGF0aWMgdm9pZCBkZWNvZGVfc2IoVlA5VGlsZURhdGEgKnRkLCBpbnQgcm93LCBpbnQgY29sLCBWUDlGaWx0ZXIgKmxmbHZsLAogICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB5b2ZmLCBwdHJkaWZmX3QgdXZvZmYsIGVudW0gQmxvY2tMZXZlbCBibCkKIHsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgVlA5Q29udGV4dCAqcyA9IHRkLT5zOwogICAgIGludCBjID0gKChzLT5hYm92ZV9wYXJ0aXRpb25fY3R4W2NvbF0gPj4gKDMgLSBibCkpICYgMSkgfAotICAgICAgICAgICAgKCgocy0+bGVmdF9wYXJ0aXRpb25fY3R4W3JvdyAmIDB4N10gPj4gKDMgLSBibCkpICYgMSkgPDwgMSk7Ci0gICAgY29uc3QgdWludDhfdCAqcCA9IHMtPnMuaC5rZXlmcmFtZSB8fCBzLT5zLmguaW50cmFvbmx5ID8gdnA5X2RlZmF1bHRfa2ZfcGFydGl0aW9uX3Byb2JzW2JsXVtjXSA6CisgICAgICAgICAgICAoKCh0ZC0+bGVmdF9wYXJ0aXRpb25fY3R4W3JvdyAmIDB4N10gPj4gKDMgLSBibCkpICYgMSkgPDwgMSk7CisgICAgY29uc3QgdWludDhfdCAqcCA9IHMtPnMuaC5rZXlmcmFtZSB8fCBzLT5zLmguaW50cmFvbmx5ID8gZmZfdnA5X2RlZmF1bHRfa2ZfcGFydGl0aW9uX3Byb2JzW2JsXVtjXSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5wYXJ0aXRpb25bYmxdW2NdOwogICAgIGVudW0gQmxvY2tQYXJ0aXRpb24gYnA7CiAgICAgcHRyZGlmZl90IGhicyA9IDQgPj4gYmw7CkBAIC0zMzk2LDc1ICsxMDY0LDc1IEBACiAgICAgaW50IGJ5dGVzcGVycGl4ZWwgPSBzLT5ieXRlc3BlcnBpeGVsOwogCiAgICAgaWYgKGJsID09IEJMXzhYOCkgewotICAgICAgICBicCA9IHZwOF9yYWNfZ2V0X3RyZWUoJnMtPmMsIHZwOV9wYXJ0aXRpb25fdHJlZSwgcCk7Ci0gICAgICAgIGRlY29kZV9iKGN0eCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwsIGJwKTsKKyAgICAgICAgYnAgPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfcGFydGl0aW9uX3RyZWUsIHApOworICAgICAgICBmZl92cDlfZGVjb2RlX2Jsb2NrKHRkLCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCwgYnApOwogICAgIH0gZWxzZSBpZiAoY29sICsgaGJzIDwgcy0+Y29scykgeyAvLyBGSVhNRSB3aHkgbm90IDw9PwogICAgICAgICBpZiAocm93ICsgaGJzIDwgcy0+cm93cykgeyAvLyBGSVhNRSB3aHkgbm90IDw9PwotICAgICAgICAgICAgYnAgPSB2cDhfcmFjX2dldF90cmVlKCZzLT5jLCB2cDlfcGFydGl0aW9uX3RyZWUsIHApOworICAgICAgICAgICAgYnAgPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfcGFydGl0aW9uX3RyZWUsIHApOwogICAgICAgICAgICAgc3dpdGNoIChicCkgewogICAgICAgICAgICAgY2FzZSBQQVJUSVRJT05fTk9ORToKLSAgICAgICAgICAgICAgICBkZWNvZGVfYihjdHgsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsLCBicCk7CisgICAgICAgICAgICAgICAgZmZfdnA5X2RlY29kZV9ibG9jayh0ZCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwsIGJwKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEFSVElUSU9OX0g6Ci0gICAgICAgICAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCwgYnApOworICAgICAgICAgICAgICAgIGZmX3ZwOV9kZWNvZGVfYmxvY2sodGQsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsLCBicCk7CiAgICAgICAgICAgICAgICAgeW9mZiAgKz0gaGJzICogOCAqIHlfc3RyaWRlOwogICAgICAgICAgICAgICAgIHV2b2ZmICs9IGhicyAqIDggKiB1dl9zdHJpZGUgPj4gcy0+c3NfdjsKLSAgICAgICAgICAgICAgICBkZWNvZGVfYihjdHgsIHJvdyArIGhicywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsLCBicCk7CisgICAgICAgICAgICAgICAgZmZfdnA5X2RlY29kZV9ibG9jayh0ZCwgcm93ICsgaGJzLCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwsIGJwKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEFSVElUSU9OX1Y6Ci0gICAgICAgICAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCwgYnApOworICAgICAgICAgICAgICAgIGZmX3ZwOV9kZWNvZGVfYmxvY2sodGQsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsLCBicCk7CiAgICAgICAgICAgICAgICAgeW9mZiAgKz0gaGJzICogOCAqIGJ5dGVzcGVycGl4ZWw7CiAgICAgICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogOCAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaDsKLSAgICAgICAgICAgICAgICBkZWNvZGVfYihjdHgsIHJvdywgY29sICsgaGJzLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsLCBicCk7CisgICAgICAgICAgICAgICAgZmZfdnA5X2RlY29kZV9ibG9jayh0ZCwgcm93LCBjb2wgKyBoYnMsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwsIGJwKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgUEFSVElUSU9OX1NQTElUOgotICAgICAgICAgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7Ci0gICAgICAgICAgICAgICAgZGVjb2RlX3NiKGN0eCwgcm93LCBjb2wgKyBoYnMsIGxmbHZsLAorICAgICAgICAgICAgICAgIGRlY29kZV9zYih0ZCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwgKyAxKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2IodGQsIHJvdywgY29sICsgaGJzLCBsZmx2bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeW9mZiArIDggKiBoYnMgKiBieXRlc3BlcnBpeGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1dm9mZiArICg4ICogaGJzICogYnl0ZXNwZXJwaXhlbCA+PiBzLT5zc19oKSwgYmwgKyAxKTsKICAgICAgICAgICAgICAgICB5b2ZmICArPSBoYnMgKiA4ICogeV9zdHJpZGU7CiAgICAgICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogOCAqIHV2X3N0cmlkZSA+PiBzLT5zc192OwotICAgICAgICAgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdyArIGhicywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7Ci0gICAgICAgICAgICAgICAgZGVjb2RlX3NiKGN0eCwgcm93ICsgaGJzLCBjb2wgKyBoYnMsIGxmbHZsLAorICAgICAgICAgICAgICAgIGRlY29kZV9zYih0ZCwgcm93ICsgaGJzLCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwgKyAxKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2IodGQsIHJvdyArIGhicywgY29sICsgaGJzLCBsZmx2bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgeW9mZiArIDggKiBoYnMgKiBieXRlc3BlcnBpeGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1dm9mZiArICg4ICogaGJzICogYnl0ZXNwZXJwaXhlbCA+PiBzLT5zc19oKSwgYmwgKyAxKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KCZzLT5jLCBwWzFdKSkgeworICAgICAgICB9IGVsc2UgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkodGQtPmMsIHBbMV0pKSB7CiAgICAgICAgICAgICBicCA9IFBBUlRJVElPTl9TUExJVDsKLSAgICAgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7Ci0gICAgICAgICAgICBkZWNvZGVfc2IoY3R4LCByb3csIGNvbCArIGhicywgbGZsdmwsCisgICAgICAgICAgICBkZWNvZGVfc2IodGQsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CisgICAgICAgICAgICBkZWNvZGVfc2IodGQsIHJvdywgY29sICsgaGJzLCBsZmx2bCwKICAgICAgICAgICAgICAgICAgICAgICB5b2ZmICsgOCAqIGhicyAqIGJ5dGVzcGVycGl4ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgdXZvZmYgKyAoOCAqIGhicyAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaCksIGJsICsgMSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBicCA9IFBBUlRJVElPTl9IOwotICAgICAgICAgICAgZGVjb2RlX2IoY3R4LCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCwgYnApOworICAgICAgICAgICAgZmZfdnA5X2RlY29kZV9ibG9jayh0ZCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwsIGJwKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAocm93ICsgaGJzIDwgcy0+cm93cykgeyAvLyBGSVhNRSB3aHkgbm90IDw9PwotICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+YywgcFsyXSkpIHsKKyAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkodGQtPmMsIHBbMl0pKSB7CiAgICAgICAgICAgICBicCA9IFBBUlRJVElPTl9TUExJVDsKLSAgICAgICAgICAgIGRlY29kZV9zYihjdHgsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CisgICAgICAgICAgICBkZWNvZGVfc2IodGQsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CiAgICAgICAgICAgICB5b2ZmICArPSBoYnMgKiA4ICogeV9zdHJpZGU7CiAgICAgICAgICAgICB1dm9mZiArPSBoYnMgKiA4ICogdXZfc3RyaWRlID4+IHMtPnNzX3Y7Ci0gICAgICAgICAgICBkZWNvZGVfc2IoY3R4LCByb3cgKyBoYnMsIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICAgICAgZGVjb2RlX3NiKHRkLCByb3cgKyBoYnMsIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnAgPSBQQVJUSVRJT05fVjsKLSAgICAgICAgICAgIGRlY29kZV9iKGN0eCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwsIGJwKTsKKyAgICAgICAgICAgIGZmX3ZwOV9kZWNvZGVfYmxvY2sodGQsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsLCBicCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBicCA9IFBBUlRJVElPTl9TUExJVDsKLSAgICAgICAgZGVjb2RlX3NiKGN0eCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYmwgKyAxKTsKKyAgICAgICAgZGVjb2RlX3NiKHRkLCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOwogICAgIH0KLSAgICBzLT5jb3VudHMucGFydGl0aW9uW2JsXVtjXVticF0rKzsKKyAgICB0ZC0+Y291bnRzLnBhcnRpdGlvbltibF1bY11bYnBdKys7CiB9CiAKLXN0YXRpYyB2b2lkIGRlY29kZV9zYl9tZW0oQVZDb2RlY0NvbnRleHQgKmN0eCwgaW50IHJvdywgaW50IGNvbCwgc3RydWN0IFZQOUZpbHRlciAqbGZsdmwsCitzdGF0aWMgdm9pZCBkZWNvZGVfc2JfbWVtKFZQOVRpbGVEYXRhICp0ZCwgaW50IHJvdywgaW50IGNvbCwgVlA5RmlsdGVyICpsZmx2bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHlvZmYsIHB0cmRpZmZfdCB1dm9mZiwgZW51bSBCbG9ja0xldmVsIGJsKQogewotICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKLSAgICBWUDlCbG9jayAqYiA9IHMtPmI7CisgICAgY29uc3QgVlA5Q29udGV4dCAqcyA9IHRkLT5zOworICAgIFZQOUJsb2NrICpiID0gdGQtPmI7CiAgICAgcHRyZGlmZl90IGhicyA9IDQgPj4gYmw7CiAgICAgQVZGcmFtZSAqZiA9IHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZjsKICAgICBwdHJkaWZmX3QgeV9zdHJpZGUgPSBmLT5saW5lc2l6ZVswXSwgdXZfc3RyaWRlID0gZi0+bGluZXNpemVbMV07CkBAIC0zNDcyLDIyMSArMTE0MCw0MyBAQAogCiAgICAgaWYgKGJsID09IEJMXzhYOCkgewogICAgICAgICBhdl9hc3NlcnQyKGItPmJsID09IEJMXzhYOCk7Ci0gICAgICAgIGRlY29kZV9iKGN0eCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYi0+YmwsIGItPmJwKTsKLSAgICB9IGVsc2UgaWYgKHMtPmItPmJsID09IGJsKSB7Ci0gICAgICAgIGRlY29kZV9iKGN0eCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYi0+YmwsIGItPmJwKTsKKyAgICAgICAgZmZfdnA5X2RlY29kZV9ibG9jayh0ZCwgcm93LCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYi0+YmwsIGItPmJwKTsKKyAgICB9IGVsc2UgaWYgKHRkLT5iLT5ibCA9PSBibCkgeworICAgICAgICBmZl92cDlfZGVjb2RlX2Jsb2NrKHRkLCByb3csIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBiLT5ibCwgYi0+YnApOwogICAgICAgICBpZiAoYi0+YnAgPT0gUEFSVElUSU9OX0ggJiYgcm93ICsgaGJzIDwgcy0+cm93cykgewogICAgICAgICAgICAgeW9mZiAgKz0gaGJzICogOCAqIHlfc3RyaWRlOwogICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogOCAqIHV2X3N0cmlkZSA+PiBzLT5zc192OwotICAgICAgICAgICAgZGVjb2RlX2IoY3R4LCByb3cgKyBoYnMsIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBiLT5ibCwgYi0+YnApOworICAgICAgICAgICAgZmZfdnA5X2RlY29kZV9ibG9jayh0ZCwgcm93ICsgaGJzLCBjb2wsIGxmbHZsLCB5b2ZmLCB1dm9mZiwgYi0+YmwsIGItPmJwKTsKICAgICAgICAgfSBlbHNlIGlmIChiLT5icCA9PSBQQVJUSVRJT05fViAmJiBjb2wgKyBoYnMgPCBzLT5jb2xzKSB7CiAgICAgICAgICAgICB5b2ZmICArPSBoYnMgKiA4ICogYnl0ZXNwZXJwaXhlbDsKICAgICAgICAgICAgIHV2b2ZmICs9IGhicyAqIDggKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2g7Ci0gICAgICAgICAgICBkZWNvZGVfYihjdHgsIHJvdywgY29sICsgaGJzLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGItPmJsLCBiLT5icCk7CisgICAgICAgICAgICBmZl92cDlfZGVjb2RlX2Jsb2NrKHRkLCByb3csIGNvbCArIGhicywgbGZsdmwsIHlvZmYsIHV2b2ZmLCBiLT5ibCwgYi0+YnApOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZGVjb2RlX3NiX21lbShjdHgsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CisgICAgICAgIGRlY29kZV9zYl9tZW0odGQsIHJvdywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CiAgICAgICAgIGlmIChjb2wgKyBoYnMgPCBzLT5jb2xzKSB7IC8vIEZJWE1FIHdoeSBub3QgPD0/CiAgICAgICAgICAgICBpZiAocm93ICsgaGJzIDwgcy0+cm93cykgewotICAgICAgICAgICAgICAgIGRlY29kZV9zYl9tZW0oY3R4LCByb3csIGNvbCArIGhicywgbGZsdmwsIHlvZmYgKyA4ICogaGJzICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2JfbWVtKHRkLCByb3csIGNvbCArIGhicywgbGZsdmwsIHlvZmYgKyA4ICogaGJzICogYnl0ZXNwZXJwaXhlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2b2ZmICsgKDggKiBoYnMgKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2gpLCBibCArIDEpOwogICAgICAgICAgICAgICAgIHlvZmYgICs9IGhicyAqIDggKiB5X3N0cmlkZTsKICAgICAgICAgICAgICAgICB1dm9mZiArPSBoYnMgKiA4ICogdXZfc3RyaWRlID4+IHMtPnNzX3Y7Ci0gICAgICAgICAgICAgICAgZGVjb2RlX3NiX21lbShjdHgsIHJvdyArIGhicywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7Ci0gICAgICAgICAgICAgICAgZGVjb2RlX3NiX21lbShjdHgsIHJvdyArIGhicywgY29sICsgaGJzLCBsZmx2bCwKKyAgICAgICAgICAgICAgICBkZWNvZGVfc2JfbWVtKHRkLCByb3cgKyBoYnMsIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICAgICAgICAgIGRlY29kZV9zYl9tZW0odGQsIHJvdyArIGhicywgY29sICsgaGJzLCBsZmx2bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvZmYgKyA4ICogaGJzICogYnl0ZXNwZXJwaXhlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV2b2ZmICsgKDggKiBoYnMgKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2gpLCBibCArIDEpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICB5b2ZmICArPSBoYnMgKiA4ICogYnl0ZXNwZXJwaXhlbDsKICAgICAgICAgICAgICAgICB1dm9mZiArPSBoYnMgKiA4ICogYnl0ZXNwZXJwaXhlbCA+PiBzLT5zc19oOwotICAgICAgICAgICAgICAgIGRlY29kZV9zYl9tZW0oY3R4LCByb3csIGNvbCArIGhicywgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOworICAgICAgICAgICAgICAgIGRlY29kZV9zYl9tZW0odGQsIHJvdywgY29sICsgaGJzLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAocm93ICsgaGJzIDwgcy0+cm93cykgewogICAgICAgICAgICAgeW9mZiAgKz0gaGJzICogOCAqIHlfc3RyaWRlOwogICAgICAgICAgICAgdXZvZmYgKz0gaGJzICogOCAqIHV2X3N0cmlkZSA+PiBzLT5zc192OwotICAgICAgICAgICAgZGVjb2RlX3NiX21lbShjdHgsIHJvdyArIGhicywgY29sLCBsZmx2bCwgeW9mZiwgdXZvZmYsIGJsICsgMSk7CisgICAgICAgICAgICBkZWNvZGVfc2JfbWVtKHRkLCByb3cgKyBoYnMsIGNvbCwgbGZsdmwsIHlvZmYsIHV2b2ZmLCBibCArIDEpOwogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZpbHRlcl9wbGFuZV9jb2xzKFZQOUNvbnRleHQgKnMsIGludCBjb2wsIGludCBzc19oLCBpbnQgc3NfdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbHZsLCB1aW50OF90ICgqbWFzaylbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGxzKQotewotICAgIGludCB5LCB4LCBieXRlc3BlcnBpeGVsID0gcy0+Ynl0ZXNwZXJwaXhlbDsKLQotICAgIC8vIGZpbHRlciBlZGdlcyBiZXR3ZWVuIGNvbHVtbnMgKGUuZy4gYmxvY2sxIHwgYmxvY2syKQotICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5ICs9IDIgPDwgc3NfdiwgZHN0ICs9IDE2ICogbHMsIGx2bCArPSAxNiA8PCBzc192KSB7Ci0gICAgICAgIHVpbnQ4X3QgKnB0ciA9IGRzdCwgKmwgPSBsdmwsICpobWFzazEgPSBtYXNrW3ldLCAqaG1hc2syID0gbWFza1t5ICsgMSArIHNzX3ZdOwotICAgICAgICB1bnNpZ25lZCBobTEgPSBobWFzazFbMF0gfCBobWFzazFbMV0gfCBobWFzazFbMl0sIGhtMTMgPSBobWFzazFbM107Ci0gICAgICAgIHVuc2lnbmVkIGhtMiA9IGhtYXNrMlsxXSB8IGhtYXNrMlsyXSwgaG0yMyA9IGhtYXNrMlszXTsKLSAgICAgICAgdW5zaWduZWQgaG0gPSBobTEgfCBobTIgfCBobTEzIHwgaG0yMzsKLQotICAgICAgICBmb3IgKHggPSAxOyBobSAmIH4oeCAtIDEpOyB4IDw8PSAxLCBwdHIgKz0gOCAqIGJ5dGVzcGVycGl4ZWwgPj4gc3NfaCkgewotICAgICAgICAgICAgaWYgKGNvbCB8fCB4ID4gMSkgewotICAgICAgICAgICAgICAgIGlmIChobTEgJiB4KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMID0gKmwsIEggPSBMID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF07Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhtYXNrMVswXSAmIHgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChobWFzazJbMF0gJiB4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihsWzggPDwgc3Nfdl0gPT0gTCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzE2WzBdKHB0ciwgbHMsIEUsIEksIEgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFsyXVswXShwdHIsIGxzLCBFLCBJLCBIKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChobTIgJiB4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMID0gbFs4IDw8IHNzX3ZdOwotICAgICAgICAgICAgICAgICAgICAgICAgSCB8PSAoTCA+PiA0KSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgRSB8PSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgSSB8PSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWyEhKGhtYXNrMVsxXSAmIHgpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbISEoaG1hc2syWzFdICYgeCldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswXShwdHIsIGxzLCBFLCBJLCBIKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WyEhKGhtYXNrMVsxXSAmIHgpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0ocHRyLCBscywgRSwgSSwgSCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhtMiAmIHgpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IEwgPSBsWzggPDwgc3Nfdl0sIEggPSBMID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF07Ci0KLSAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbISEoaG1hc2syWzFdICYgeCldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzBdKHB0ciArIDggKiBscywgbHMsIEUsIEksIEgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzc19oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHggJiAweEFBKQotICAgICAgICAgICAgICAgICAgICBsICs9IDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChobTEzICYgeCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTCA9ICpsLCBIID0gTCA+PiA0OwotICAgICAgICAgICAgICAgICAgICBpbnQgRSA9IHMtPmZpbHRlcl9sdXQubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyX2x1dC5saW1fbHV0W0xdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChobTIzICYgeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTCA9IGxbOCA8PCBzc192XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEggfD0gKEwgPj4gNCkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIEUgfD0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIEkgfD0gcy0+ZmlsdGVyX2x1dC5saW1fbHV0W0xdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfbWl4MlswXVswXVswXShwdHIgKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHMsIEUsIEksIEgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbMF1bMF0ocHRyICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzLCBFLCBJLCBIKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0yMyAmIHgpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IEwgPSBsWzggPDwgc3Nfdl0sIEggPSBMID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF07Ci0KLSAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbMF1bMF0ocHRyICsgOCAqIGxzICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzLCBFLCBJLCBIKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbCsrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZpbHRlcl9wbGFuZV9yb3dzKFZQOUNvbnRleHQgKnMsIGludCByb3csIGludCBzc19oLCBpbnQgc3NfdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbHZsLCB1aW50OF90ICgqbWFzaylbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGxzKQotewotICAgIGludCB5LCB4LCBieXRlc3BlcnBpeGVsID0gcy0+Ynl0ZXNwZXJwaXhlbDsKLQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sxCi0gICAgLy8gZmlsdGVyIGVkZ2VzIGJldHdlZW4gcm93cyAoZS5nLiAtLS0tLS0pCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazIKLSAgICBmb3IgKHkgPSAwOyB5IDwgODsgeSsrLCBkc3QgKz0gOCAqIGxzID4+IHNzX3YpIHsKLSAgICAgICAgdWludDhfdCAqcHRyID0gZHN0LCAqbCA9IGx2bCwgKnZtYXNrID0gbWFza1t5XTsKLSAgICAgICAgdW5zaWduZWQgdm0gPSB2bWFza1swXSB8IHZtYXNrWzFdIHwgdm1hc2tbMl0sIHZtMyA9IHZtYXNrWzNdOwotCi0gICAgICAgIGZvciAoeCA9IDE7IHZtICYgfih4IC0gMSk7IHggPDw9ICgyIDw8IHNzX2gpLCBwdHIgKz0gMTYgKiBieXRlc3BlcnBpeGVsLCBsICs9IDIgPDwgc3NfaCkgewotICAgICAgICAgICAgaWYgKHJvdyB8fCB5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKHZtICYgeCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTCA9ICpsLCBIID0gTCA+PiA0OwotICAgICAgICAgICAgICAgICAgICBpbnQgRSA9IHMtPmZpbHRlcl9sdXQubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyX2x1dC5saW1fbHV0W0xdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2bWFza1swXSAmIHgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2bWFza1swXSAmICh4IDw8ICgxICsgc3NfaCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MihsWzEgKyBzc19oXSA9PSBMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfMTZbMV0ocHRyLCBscywgRSwgSSwgSCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WzJdWzFdKHB0ciwgbHMsIEUsIEksIEgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZtICYgKHggPDwgKDEgKyBzc19oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEwgPSBsWzEgKyBzc19oXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEggfD0gKEwgPj4gNCkgPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIEUgfD0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIEkgfD0gcy0+ZmlsdGVyX2x1dC5saW1fbHV0W0xdIDw8IDg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfbWl4MlshISh2bWFza1sxXSAmICB4KV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyEhKHZtYXNrWzFdICYgKHggPDwgKDEgKyBzc19oKSkpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0ocHRyLCBscywgRSwgSSwgSCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFshISh2bWFza1sxXSAmIHgpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0ocHRyLCBscywgRSwgSSwgSCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZtICYgKHggPDwgKDEgKyBzc19oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IEwgPSBsWzEgKyBzc19oXSwgSCA9IEwgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSwgSSA9IHMtPmZpbHRlcl9sdXQubGltX2x1dFtMXTsKLQotICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFshISh2bWFza1sxXSAmICh4IDw8ICgxICsgc3NfaCkpKV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMV0ocHRyICsgOCAqIGJ5dGVzcGVycGl4ZWwsIGxzLCBFLCBJLCBIKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXNzX3YpIHsKLSAgICAgICAgICAgICAgICBpZiAodm0zICYgeCkgewotICAgICAgICAgICAgICAgICAgICBpbnQgTCA9ICpsLCBIID0gTCA+PiA0OwotICAgICAgICAgICAgICAgICAgICBpbnQgRSA9IHMtPmZpbHRlcl9sdXQubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyX2x1dC5saW1fbHV0W0xdOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICh2bTMgJiAoeCA8PCAoMSArIHNzX2gpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTCA9IGxbMSArIHNzX2hdOwotICAgICAgICAgICAgICAgICAgICAgICAgSCB8PSAoTCA+PiA0KSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgRSB8PSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSA8PCA4OwotICAgICAgICAgICAgICAgICAgICAgICAgSSB8PSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF0gPDwgODsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWzBdWzBdWzFdKHB0ciArIGxzICogNCwgbHMsIEUsIEksIEgpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbMF1bMV0ocHRyICsgbHMgKiA0LCBscywgRSwgSSwgSCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZtMyAmICh4IDw8ICgxICsgc3NfaCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBMID0gbFsxICsgc3NfaF0sIEggPSBMID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF07Ci0KLSAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbMF1bMV0ocHRyICsgbHMgKiA0ICsgOCAqIGJ5dGVzcGVycGl4ZWwsIGxzLCBFLCBJLCBIKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNzX3YpIHsKLSAgICAgICAgICAgIGlmICh5ICYgMSkKLSAgICAgICAgICAgICAgICBsdmwgKz0gMTY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsdmwgKz0gODsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgbG9vcGZpbHRlcl9zYihBVkNvZGVjQ29udGV4dCAqY3R4LCBzdHJ1Y3QgVlA5RmlsdGVyICpsZmx2bCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IGNvbCwgcHRyZGlmZl90IHlvZmYsIHB0cmRpZmZfdCB1dm9mZikKLXsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7Ci0gICAgQVZGcmFtZSAqZiA9IHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZjsKLSAgICB1aW50OF90ICpkc3QgPSBmLT5kYXRhWzBdICsgeW9mZjsKLSAgICBwdHJkaWZmX3QgbHNfeSA9IGYtPmxpbmVzaXplWzBdLCBsc191diA9IGYtPmxpbmVzaXplWzFdOwotICAgIHVpbnQ4X3QgKCp1dl9tYXNrcylbOF1bNF0gPSBsZmx2bC0+bWFza1tzLT5zc19oIHwgcy0+c3Nfdl07Ci0gICAgaW50IHA7Ci0KLSAgICAvLyBGSVhNRSBpbiBob3cgZmFyIGNhbiB3ZSBpbnRlcmxlYXZlIHRoZSB2L2ggbG9vcGZpbHRlciBjYWxscz8gRS5nLgotICAgIC8vIGlmIHlvdSB0aGluayBvZiB0aGVtIGFzIGFjdGluZyBvbiBhIDh4OCBibG9jayBtYXgsIHdlIGNhbiBpbnRlcmxlYXZlCi0gICAgLy8gZWFjaCB2L2ggd2l0aGluIHRoZSBzaW5nbGUgeCBsb29wLCBidXQgdGhhdCBvbmx5IHdvcmtzIGlmIHdlIHdvcmsgb24KLSAgICAvLyA4IHBpeGVsIGJsb2NrcywgYW5kIHdlIHdvbid0IGFsd2F5cyBkbyB0aGF0ICh3ZSB3YW50IGF0IGxlYXN0IDE2cHgKLSAgICAvLyB0byB1c2UgU1NFMiBvcHRpbWl6YXRpb25zLCBwZXJoYXBzIDMyIGZvciBBVlgyKQotCi0gICAgZmlsdGVyX3BsYW5lX2NvbHMocywgY29sLCAwLCAwLCBsZmx2bC0+bGV2ZWwsIGxmbHZsLT5tYXNrWzBdWzBdLCBkc3QsIGxzX3kpOwotICAgIGZpbHRlcl9wbGFuZV9yb3dzKHMsIHJvdywgMCwgMCwgbGZsdmwtPmxldmVsLCBsZmx2bC0+bWFza1swXVsxXSwgZHN0LCBsc195KTsKLQotICAgIGZvciAocCA9IDA7IHAgPCAyOyBwKyspIHsKLSAgICAgICAgZHN0ID0gZi0+ZGF0YVsxICsgcF0gKyB1dm9mZjsKLSAgICAgICAgZmlsdGVyX3BsYW5lX2NvbHMocywgY29sLCBzLT5zc19oLCBzLT5zc192LCBsZmx2bC0+bGV2ZWwsIHV2X21hc2tzWzBdLCBkc3QsIGxzX3V2KTsKLSAgICAgICAgZmlsdGVyX3BsYW5lX3Jvd3Mocywgcm93LCBzLT5zc19oLCBzLT5zc192LCBsZmx2bC0+bGV2ZWwsIHV2X21hc2tzWzFdLCBkc3QsIGxzX3V2KTsKLSAgICB9Ci19Ci0KIHN0YXRpYyB2b2lkIHNldF90aWxlX29mZnNldChpbnQgKnN0YXJ0LCBpbnQgKmVuZCwgaW50IGlkeCwgaW50IGxvZzJfbiwgaW50IG4pCiB7CiAgICAgaW50IHNiX3N0YXJ0ID0gKCBpZHggICAgICAqIG4pID4+IGxvZzJfbjsKQEAgLTM2OTUsMzcyICsxMTg1LDM3NSBAQAogICAgICplbmQgICA9IEZGTUlOKHNiX2VuZCwgICBuKSA8PCAzOwogfQogCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGFkYXB0X3Byb2IodWludDhfdCAqcCwgdW5zaWduZWQgY3QwLCB1bnNpZ25lZCBjdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9jb3VudCwgaW50IHVwZGF0ZV9mYWN0b3IpCi17Ci0gICAgdW5zaWduZWQgY3QgPSBjdDAgKyBjdDEsIHAyLCBwMTsKLQotICAgIGlmICghY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgIHAxID0gKnA7Ci0gICAgcDIgPSAoKGN0MCA8PCA4KSArIChjdCA+PiAxKSkgLyBjdDsKLSAgICBwMiA9IGF2X2NsaXAocDIsIDEsIDI1NSk7Ci0gICAgY3QgPSBGRk1JTihjdCwgbWF4X2NvdW50KTsKLSAgICB1cGRhdGVfZmFjdG9yID0gRkFTVERJVih1cGRhdGVfZmFjdG9yICogY3QsIG1heF9jb3VudCk7Ci0KLSAgICAvLyAocDEgKiAoMjU2IC0gdXBkYXRlX2ZhY3RvcikgKyBwMiAqIHVwZGF0ZV9mYWN0b3IgKyAxMjgpID4+IDgKLSAgICAqcCA9IHAxICsgKCgocDIgLSBwMSkgKiB1cGRhdGVfZmFjdG9yICsgMTI4KSA+PiA4KTsKLX0KLQotc3RhdGljIHZvaWQgYWRhcHRfcHJvYnMoVlA5Q29udGV4dCAqcykKLXsKLSAgICBpbnQgaSwgaiwgaywgbCwgbTsKLSAgICBwcm9iX2NvbnRleHQgKnAgPSAmcy0+cHJvYl9jdHhbcy0+cy5oLmZyYW1lY3R4aWRdLnA7Ci0gICAgaW50IHVmID0gKHMtPnMuaC5rZXlmcmFtZSB8fCBzLT5zLmguaW50cmFvbmx5IHx8ICFzLT5sYXN0X2tleWZyYW1lKSA/IDExMiA6IDEyODsKLQotICAgIC8vIGNvZWZmaWNpZW50cwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspCi0gICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMjsgaysrKQotICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCA2OyBsKyspCi0gICAgICAgICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCA2OyBtKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnBwID0gcy0+cHJvYl9jdHhbcy0+cy5oLmZyYW1lY3R4aWRdLmNvZWZbaV1bal1ba11bbF1bbV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqZSA9IHMtPmNvdW50cy5lb2JbaV1bal1ba11bbF1bbV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPmNvdW50cy5jb2VmW2ldW2pdW2tdW2xdW21dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobCA9PSAwICYmIG0gPj0gMykgLy8gZGMgb25seSBoYXMgMyBwdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFswXSwgZVswXSwgZVsxXSwgMjQsIHVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzBdLCBjWzFdICsgY1syXSwgMjQsIHVmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjWzFdLCBjWzJdLCAyNCwgdWYpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICBpZiAocy0+cy5oLmtleWZyYW1lIHx8IHMtPnMuaC5pbnRyYW9ubHkpIHsKLSAgICAgICAgbWVtY3B5KHAtPnNraXAsICBzLT5wcm9iLnAuc2tpcCwgIHNpemVvZihwLT5za2lwKSk7Ci0gICAgICAgIG1lbWNweShwLT50eDMycCwgcy0+cHJvYi5wLnR4MzJwLCBzaXplb2YocC0+dHgzMnApKTsKLSAgICAgICAgbWVtY3B5KHAtPnR4MTZwLCBzLT5wcm9iLnAudHgxNnAsIHNpemVvZihwLT50eDE2cCkpOwotICAgICAgICBtZW1jcHkocC0+dHg4cCwgIHMtPnByb2IucC50eDhwLCAgc2l6ZW9mKHAtPnR4OHApKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIHNraXAgZmxhZwotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgIGFkYXB0X3Byb2IoJnAtPnNraXBbaV0sIHMtPmNvdW50cy5za2lwW2ldWzBdLCBzLT5jb3VudHMuc2tpcFtpXVsxXSwgMjAsIDEyOCk7Ci0KLSAgICAvLyBpbnRyYS9pbnRlciBmbGFnCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgYWRhcHRfcHJvYigmcC0+aW50cmFbaV0sIHMtPmNvdW50cy5pbnRyYVtpXVswXSwgcy0+Y291bnRzLmludHJhW2ldWzFdLCAyMCwgMTI4KTsKLQotICAgIC8vIGNvbXBwcmVkIGZsYWcKLSAgICBpZiAocy0+cy5oLmNvbXBwcmVkbW9kZSA9PSBQUkVEX1NXSVRDSEFCTEUpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0gICAgICAgICAgYWRhcHRfcHJvYigmcC0+Y29tcFtpXSwgcy0+Y291bnRzLmNvbXBbaV1bMF0sIHMtPmNvdW50cy5jb21wW2ldWzFdLCAyMCwgMTI4KTsKLSAgICB9Ci0KLSAgICAvLyByZWZlcmVuY2UgZnJhbWVzCi0gICAgaWYgKHMtPnMuaC5jb21wcHJlZG1vZGUgIT0gUFJFRF9TSU5HTEVSRUYpIHsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCi0gICAgICAgICAgYWRhcHRfcHJvYigmcC0+Y29tcF9yZWZbaV0sIHMtPmNvdW50cy5jb21wX3JlZltpXVswXSwKLSAgICAgICAgICAgICAgICAgICAgIHMtPmNvdW50cy5jb21wX3JlZltpXVsxXSwgMjAsIDEyOCk7Ci0gICAgfQotCi0gICAgaWYgKHMtPnMuaC5jb21wcHJlZG1vZGUgIT0gUFJFRF9DT01QUkVGKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgdWludDhfdCAqcHAgPSBwLT5zaW5nbGVfcmVmW2ldOwotICAgICAgICAgIHVuc2lnbmVkICgqYylbMl0gPSBzLT5jb3VudHMuc2luZ2xlX3JlZltpXTsKLQotICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdWzBdLCBjWzBdWzFdLCAyMCwgMTI4KTsKLSAgICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXVswXSwgY1sxXVsxXSwgMjAsIDEyOCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gYmxvY2sgcGFydGl0aW9uaW5nCi0gICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotICAgICAgICAgICAgdWludDhfdCAqcHAgPSBwLT5wYXJ0aXRpb25baV1bal07Ci0gICAgICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPmNvdW50cy5wYXJ0aXRpb25baV1bal07Ci0KLSAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdLCBjWzFdICsgY1syXSArIGNbM10sIDIwLCAxMjgpOwotICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMV0sIGNbMV0sIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKLSAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjWzJdLCBjWzNdLCAyMCwgMTI4KTsKLSAgICAgICAgfQotCi0gICAgLy8gdHggc2l6ZQotICAgIGlmIChzLT5zLmgudHhmbW1vZGUgPT0gVFhfU1dJVENIQUJMRSkgewotICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgIHVuc2lnbmVkICpjMTYgPSBzLT5jb3VudHMudHgxNnBbaV0sICpjMzIgPSBzLT5jb3VudHMudHgzMnBbaV07Ci0KLSAgICAgICAgICBhZGFwdF9wcm9iKCZwLT50eDhwW2ldLCBzLT5jb3VudHMudHg4cFtpXVswXSwgcy0+Y291bnRzLnR4OHBbaV1bMV0sIDIwLCAxMjgpOwotICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPnR4MTZwW2ldWzBdLCBjMTZbMF0sIGMxNlsxXSArIGMxNlsyXSwgMjAsIDEyOCk7Ci0gICAgICAgICAgYWRhcHRfcHJvYigmcC0+dHgxNnBbaV1bMV0sIGMxNlsxXSwgYzE2WzJdLCAyMCwgMTI4KTsKLSAgICAgICAgICBhZGFwdF9wcm9iKCZwLT50eDMycFtpXVswXSwgYzMyWzBdLCBjMzJbMV0gKyBjMzJbMl0gKyBjMzJbM10sIDIwLCAxMjgpOwotICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPnR4MzJwW2ldWzFdLCBjMzJbMV0sIGMzMlsyXSArIGMzMlszXSwgMjAsIDEyOCk7Ci0gICAgICAgICAgYWRhcHRfcHJvYigmcC0+dHgzMnBbaV1bMl0sIGMzMlsyXSwgYzMyWzNdLCAyMCwgMTI4KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBpbnRlcnBvbGF0aW9uIGZpbHRlcgotICAgIGlmIChzLT5zLmguZmlsdGVybW9kZSA9PSBGSUxURVJfU1dJVENIQUJMRSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgICAgICB1aW50OF90ICpwcCA9IHAtPmZpbHRlcltpXTsKLSAgICAgICAgICAgIHVuc2lnbmVkICpjID0gcy0+Y291bnRzLmZpbHRlcltpXTsKLQotICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMF0sIGNbMF0sIGNbMV0gKyBjWzJdLCAyMCwgMTI4KTsKLSAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzFdLCBjWzJdLCAyMCwgMTI4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGludGVyIG1vZGVzCi0gICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykgewotICAgICAgICB1aW50OF90ICpwcCA9IHAtPm12X21vZGVbaV07Ci0gICAgICAgIHVuc2lnbmVkICpjID0gcy0+Y291bnRzLm12X21vZGVbaV07Ci0KLSAgICAgICAgYWRhcHRfcHJvYigmcHBbMF0sIGNbMl0sIGNbMV0gKyBjWzBdICsgY1szXSwgMjAsIDEyOCk7Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzBdLCBjWzFdICsgY1szXSwgMjAsIDEyOCk7Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjWzFdLCBjWzNdLCAyMCwgMTI4KTsKLSAgICB9Ci0KLSAgICAvLyBtdiBqb2ludHMKLSAgICB7Ci0gICAgICAgIHVpbnQ4X3QgKnBwID0gcC0+bXZfam9pbnQ7Ci0gICAgICAgIHVuc2lnbmVkICpjID0gcy0+Y291bnRzLm12X2pvaW50OwotCi0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdLCBjWzFdICsgY1syXSArIGNbM10sIDIwLCAxMjgpOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXSwgY1syXSArIGNbM10sIDIwLCAxMjgpOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1syXSwgY1szXSwgMjAsIDEyOCk7Ci0gICAgfQotCi0gICAgLy8gbXYgY29tcG9uZW50cwotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgdWludDhfdCAqcHA7Ci0gICAgICAgIHVuc2lnbmVkICpjLCAoKmMyKVsyXSwgc3VtOwotCi0gICAgICAgIGFkYXB0X3Byb2IoJnAtPm12X2NvbXBbaV0uc2lnbiwgcy0+Y291bnRzLm12X2NvbXBbaV0uc2lnblswXSwKLSAgICAgICAgICAgICAgICAgICBzLT5jb3VudHMubXZfY29tcFtpXS5zaWduWzFdLCAyMCwgMTI4KTsKLQotICAgICAgICBwcCA9IHAtPm12X2NvbXBbaV0uY2xhc3NlczsKLSAgICAgICAgYyA9IHMtPmNvdW50cy5tdl9jb21wW2ldLmNsYXNzZXM7Ci0gICAgICAgIHN1bSA9IGNbMV0gKyBjWzJdICsgY1szXSArIGNbNF0gKyBjWzVdICsgY1s2XSArIGNbN10gKyBjWzhdICsgY1s5XSArIGNbMTBdOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFswXSwgY1swXSwgc3VtLCAyMCwgMTI4KTsKLSAgICAgICAgc3VtIC09IGNbMV07Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzFdLCBzdW0sIDIwLCAxMjgpOwotICAgICAgICBzdW0gLT0gY1syXSArIGNbM107Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjWzJdICsgY1szXSwgc3VtLCAyMCwgMTI4KTsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbM10sIGNbMl0sIGNbM10sIDIwLCAxMjgpOwotICAgICAgICBzdW0gLT0gY1s0XSArIGNbNV07Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzRdLCBjWzRdICsgY1s1XSwgc3VtLCAyMCwgMTI4KTsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbNV0sIGNbNF0sIGNbNV0sIDIwLCAxMjgpOwotICAgICAgICBzdW0gLT0gY1s2XTsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbNl0sIGNbNl0sIHN1bSwgMjAsIDEyOCk7Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzddLCBjWzddICsgY1s4XSwgY1s5XSArIGNbMTBdLCAyMCwgMTI4KTsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbOF0sIGNbN10sIGNbOF0sIDIwLCAxMjgpOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFs5XSwgY1s5XSwgY1sxMF0sIDIwLCAxMjgpOwotCi0gICAgICAgIGFkYXB0X3Byb2IoJnAtPm12X2NvbXBbaV0uY2xhc3MwLCBzLT5jb3VudHMubXZfY29tcFtpXS5jbGFzczBbMF0sCi0gICAgICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X2NvbXBbaV0uY2xhc3MwWzFdLCAyMCwgMTI4KTsKLSAgICAgICAgcHAgPSBwLT5tdl9jb21wW2ldLmJpdHM7Ci0gICAgICAgIGMyID0gcy0+Y291bnRzLm12X2NvbXBbaV0uYml0czsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDEwOyBqKyspCi0gICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFtqXSwgYzJbal1bMF0sIGMyW2pdWzFdLCAyMCwgMTI4KTsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7Ci0gICAgICAgICAgICBwcCA9IHAtPm12X2NvbXBbaV0uY2xhc3MwX2ZwW2pdOwotICAgICAgICAgICAgYyA9IHMtPmNvdW50cy5tdl9jb21wW2ldLmNsYXNzMF9mcFtqXTsKLSAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdLCBjWzFdICsgY1syXSArIGNbM10sIDIwLCAxMjgpOwotICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMV0sIGNbMV0sIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKLSAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjWzJdLCBjWzNdLCAyMCwgMTI4KTsKLSAgICAgICAgfQotICAgICAgICBwcCA9IHAtPm12X2NvbXBbaV0uZnA7Ci0gICAgICAgIGMgPSBzLT5jb3VudHMubXZfY29tcFtpXS5mcDsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbMF0sIGNbMF0sIGNbMV0gKyBjWzJdICsgY1szXSwgMjAsIDEyOCk7Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzFdLCBjWzJdICsgY1szXSwgMjAsIDEyOCk7Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjWzJdLCBjWzNdLCAyMCwgMTI4KTsKLQotICAgICAgICBpZiAocy0+cy5oLmhpZ2hwcmVjaXNpb25tdnMpIHsKLSAgICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPm12X2NvbXBbaV0uY2xhc3MwX2hwLCBzLT5jb3VudHMubXZfY29tcFtpXS5jbGFzczBfaHBbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgIHMtPmNvdW50cy5tdl9jb21wW2ldLmNsYXNzMF9ocFsxXSwgMjAsIDEyOCk7Ci0gICAgICAgICAgICBhZGFwdF9wcm9iKCZwLT5tdl9jb21wW2ldLmhwLCBzLT5jb3VudHMubXZfY29tcFtpXS5ocFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcy0+Y291bnRzLm12X2NvbXBbaV0uaHBbMV0sIDIwLCAxMjgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8geSBpbnRyYSBtb2RlcwotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgdWludDhfdCAqcHAgPSBwLT55X21vZGVbaV07Ci0gICAgICAgIHVuc2lnbmVkICpjID0gcy0+Y291bnRzLnlfbW9kZVtpXSwgc3VtLCBzMjsKLQotICAgICAgICBzdW0gPSBjWzBdICsgY1sxXSArIGNbM10gKyBjWzRdICsgY1s1XSArIGNbNl0gKyBjWzddICsgY1s4XSArIGNbOV07Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjW0RDX1BSRURdLCBzdW0sIDIwLCAxMjgpOwotICAgICAgICBzdW0gLT0gY1tUTV9WUDhfUFJFRF07Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjW1RNX1ZQOF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKLSAgICAgICAgc3VtIC09IGNbVkVSVF9QUkVEXTsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbMl0sIGNbVkVSVF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKLSAgICAgICAgczIgPSBjW0hPUl9QUkVEXSArIGNbRElBR19ET1dOX1JJR0hUX1BSRURdICsgY1tWRVJUX1JJR0hUX1BSRURdOwotICAgICAgICBzdW0gLT0gczI7Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzNdLCBzMiwgc3VtLCAyMCwgMTI4KTsKLSAgICAgICAgczIgLT0gY1tIT1JfUFJFRF07Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzRdLCBjW0hPUl9QUkVEXSwgczIsIDIwLCAxMjgpOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFs1XSwgY1tESUFHX0RPV05fUklHSFRfUFJFRF0sIGNbVkVSVF9SSUdIVF9QUkVEXSwgMjAsIDEyOCk7Ci0gICAgICAgIHN1bSAtPSBjW0RJQUdfRE9XTl9MRUZUX1BSRURdOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFs2XSwgY1tESUFHX0RPV05fTEVGVF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKLSAgICAgICAgc3VtIC09IGNbVkVSVF9MRUZUX1BSRURdOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFs3XSwgY1tWRVJUX0xFRlRfUFJFRF0sIHN1bSwgMjAsIDEyOCk7Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzhdLCBjW0hPUl9ET1dOX1BSRURdLCBjW0hPUl9VUF9QUkVEXSwgMjAsIDEyOCk7Ci0gICAgfQotCi0gICAgLy8gdXYgaW50cmEgbW9kZXMKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgICAgICB1aW50OF90ICpwcCA9IHAtPnV2X21vZGVbaV07Ci0gICAgICAgIHVuc2lnbmVkICpjID0gcy0+Y291bnRzLnV2X21vZGVbaV0sIHN1bSwgczI7Ci0KLSAgICAgICAgc3VtID0gY1swXSArIGNbMV0gKyBjWzNdICsgY1s0XSArIGNbNV0gKyBjWzZdICsgY1s3XSArIGNbOF0gKyBjWzldOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFswXSwgY1tEQ19QUkVEXSwgc3VtLCAyMCwgMTI4KTsKLSAgICAgICAgc3VtIC09IGNbVE1fVlA4X1BSRURdOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1tUTV9WUDhfUFJFRF0sIHN1bSwgMjAsIDEyOCk7Ci0gICAgICAgIHN1bSAtPSBjW1ZFUlRfUFJFRF07Ci0gICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjW1ZFUlRfUFJFRF0sIHN1bSwgMjAsIDEyOCk7Ci0gICAgICAgIHMyID0gY1tIT1JfUFJFRF0gKyBjW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSArIGNbVkVSVF9SSUdIVF9QUkVEXTsKLSAgICAgICAgc3VtIC09IHMyOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFszXSwgczIsIHN1bSwgMjAsIDEyOCk7Ci0gICAgICAgIHMyIC09IGNbSE9SX1BSRURdOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFs0XSwgY1tIT1JfUFJFRF0sIHMyLCAyMCwgMTI4KTsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbNV0sIGNbRElBR19ET1dOX1JJR0hUX1BSRURdLCBjW1ZFUlRfUklHSFRfUFJFRF0sIDIwLCAxMjgpOwotICAgICAgICBzdW0gLT0gY1tESUFHX0RPV05fTEVGVF9QUkVEXTsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbNl0sIGNbRElBR19ET1dOX0xFRlRfUFJFRF0sIHN1bSwgMjAsIDEyOCk7Ci0gICAgICAgIHN1bSAtPSBjW1ZFUlRfTEVGVF9QUkVEXTsKLSAgICAgICAgYWRhcHRfcHJvYigmcHBbN10sIGNbVkVSVF9MRUZUX1BSRURdLCBzdW0sIDIwLCAxMjgpOwotICAgICAgICBhZGFwdF9wcm9iKCZwcFs4XSwgY1tIT1JfRE9XTl9QUkVEXSwgY1tIT1JfVVBfUFJFRF0sIDIwLCAxMjgpOwotICAgIH0KLX0KLQogc3RhdGljIHZvaWQgZnJlZV9idWZmZXJzKFZQOUNvbnRleHQgKnMpCiB7CisgICAgaW50IGk7CisKICAgICBhdl9mcmVlcCgmcy0+aW50cmFfcHJlZF9kYXRhWzBdKTsKLSAgICBhdl9mcmVlcCgmcy0+Yl9iYXNlKTsKLSAgICBhdl9mcmVlcCgmcy0+YmxvY2tfYmFzZSk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPmFjdGl2ZV90aWxlX2NvbHM7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmcy0+dGRbaV0uYl9iYXNlKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnRkW2ldLmJsb2NrX2Jhc2UpOworICAgIH0KIH0KIAotc3RhdGljIGF2X2NvbGQgaW50IHZwOV9kZWNvZGVfZnJlZShBVkNvZGVjQ29udGV4dCAqY3R4KQorc3RhdGljIGF2X2NvbGQgaW50IHZwOV9kZWNvZGVfZnJlZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZQOUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICBpZiAocy0+cy5mcmFtZXNbaV0udGYuZi0+YnVmWzBdKQotICAgICAgICAgICAgdnA5X3VucmVmX2ZyYW1lKGN0eCwgJnMtPnMuZnJhbWVzW2ldKTsKKyAgICAgICAgICAgIHZwOV9mcmFtZV91bnJlZihhdmN0eCwgJnMtPnMuZnJhbWVzW2ldKTsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+cy5mcmFtZXNbaV0udGYuZik7CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgaWYgKHMtPnMucmVmc1tpXS5mLT5idWZbMF0pCi0gICAgICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoY3R4LCAmcy0+cy5yZWZzW2ldKTsKKyAgICAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJnMtPnMucmVmc1tpXSk7CiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnMucmVmc1tpXS5mKTsKICAgICAgICAgaWYgKHMtPm5leHRfcmVmc1tpXS5mLT5idWZbMF0pCi0gICAgICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoY3R4LCAmcy0+bmV4dF9yZWZzW2ldKTsKKyAgICAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJnMtPm5leHRfcmVmc1tpXSk7CiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm5leHRfcmVmc1tpXS5mKTsKICAgICB9Ci0gICAgZnJlZV9idWZmZXJzKHMpOwotICAgIGF2X2ZyZWVwKCZzLT5jX2IpOwotICAgIHMtPmNfYl9zaXplID0gMDsKIAorICAgIGZyZWVfYnVmZmVycyhzKTsKKyAgICB2cDlfZnJlZV9lbnRyaWVzKGF2Y3R4KTsKKyAgICBhdl9mcmVlcCgmcy0+dGQpOwogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRlY29kZV90aWxlcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgc2l6ZSkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBWUDlUaWxlRGF0YSAqdGQgPSAmcy0+dGRbMF07CisgICAgaW50IHJvdywgY29sLCB0aWxlX3JvdywgdGlsZV9jb2wsIHJldDsKKyAgICBpbnQgYnl0ZXNwZXJwaXhlbDsKKyAgICBpbnQgdGlsZV9yb3dfc3RhcnQsIHRpbGVfcm93X2VuZCwgdGlsZV9jb2xfc3RhcnQsIHRpbGVfY29sX2VuZDsKKyAgICBBVkZyYW1lICpmOworICAgIHB0cmRpZmZfdCB5b2ZmLCB1dm9mZiwgbHNfeSwgbHNfdXY7CiAKLXN0YXRpYyBpbnQgdnA5X2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqY3R4LCB2b2lkICpmcmFtZSwKKyAgICBmID0gcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mOworICAgIGxzX3kgPSBmLT5saW5lc2l6ZVswXTsKKyAgICBsc191diA9Zi0+bGluZXNpemVbMV07CisgICAgYnl0ZXNwZXJwaXhlbCA9IHMtPmJ5dGVzcGVycGl4ZWw7CisKKyAgICB5b2ZmID0gdXZvZmYgPSAwOworICAgIGZvciAodGlsZV9yb3cgPSAwOyB0aWxlX3JvdyA8IHMtPnMuaC50aWxpbmcudGlsZV9yb3dzOyB0aWxlX3JvdysrKSB7CisgICAgICAgIHNldF90aWxlX29mZnNldCgmdGlsZV9yb3dfc3RhcnQsICZ0aWxlX3Jvd19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICB0aWxlX3Jvdywgcy0+cy5oLnRpbGluZy5sb2cyX3RpbGVfcm93cywgcy0+c2Jfcm93cyk7CisKKyAgICAgICAgZm9yICh0aWxlX2NvbCA9IDA7IHRpbGVfY29sIDwgcy0+cy5oLnRpbGluZy50aWxlX2NvbHM7IHRpbGVfY29sKyspIHsKKyAgICAgICAgICAgIGludDY0X3QgdGlsZV9zaXplOworCisgICAgICAgICAgICBpZiAodGlsZV9jb2wgPT0gcy0+cy5oLnRpbGluZy50aWxlX2NvbHMgLSAxICYmCisgICAgICAgICAgICAgICAgdGlsZV9yb3cgPT0gcy0+cy5oLnRpbGluZy50aWxlX3Jvd3MgLSAxKSB7CisgICAgICAgICAgICAgICAgdGlsZV9zaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGlsZV9zaXplID0gQVZfUkIzMihkYXRhKTsKKyAgICAgICAgICAgICAgICBkYXRhICs9IDQ7CisgICAgICAgICAgICAgICAgc2l6ZSAtPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRpbGVfc2l6ZSA+IHNpemUpIHsKKyAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLCBJTlRfTUFYLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKCZ0ZC0+Y19iW3RpbGVfY29sXSwgZGF0YSwgdGlsZV9zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmdGQtPmNfYlt0aWxlX2NvbF0sIDEyOCkpIHsgLy8gbWFya2VyIGJpdAorICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYsIElOVF9NQVgsIDApOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSArPSB0aWxlX3NpemU7CisgICAgICAgICAgICBzaXplIC09IHRpbGVfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAocm93ID0gdGlsZV9yb3dfc3RhcnQ7IHJvdyA8IHRpbGVfcm93X2VuZDsKKyAgICAgICAgICAgICByb3cgKz0gOCwgeW9mZiArPSBsc195ICogNjQsIHV2b2ZmICs9IGxzX3V2ICogNjQgPj4gcy0+c3NfdikgeworICAgICAgICAgICAgVlA5RmlsdGVyICpsZmx2bF9wdHIgPSBzLT5sZmx2bDsKKyAgICAgICAgICAgIHB0cmRpZmZfdCB5b2ZmMiA9IHlvZmYsIHV2b2ZmMiA9IHV2b2ZmOworCisgICAgICAgICAgICBmb3IgKHRpbGVfY29sID0gMDsgdGlsZV9jb2wgPCBzLT5zLmgudGlsaW5nLnRpbGVfY29sczsgdGlsZV9jb2wrKykgeworICAgICAgICAgICAgICAgIHNldF90aWxlX29mZnNldCgmdGlsZV9jb2xfc3RhcnQsICZ0aWxlX2NvbF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfY29sLCBzLT5zLmgudGlsaW5nLmxvZzJfdGlsZV9jb2xzLCBzLT5zYl9jb2xzKTsKKyAgICAgICAgICAgICAgICB0ZC0+dGlsZV9jb2xfc3RhcnQgPSB0aWxlX2NvbF9zdGFydDsKKyAgICAgICAgICAgICAgICBpZiAocy0+cGFzcyAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh0ZC0+bGVmdF9wYXJ0aXRpb25fY3R4LCAwLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHRkLT5sZWZ0X3NraXBfY3R4LCAwLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnMuaC5rZXlmcmFtZSB8fCBzLT5zLmguaW50cmFvbmx5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQodGQtPmxlZnRfbW9kZV9jdHgsIERDX1BSRUQsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCh0ZC0+bGVmdF9tb2RlX2N0eCwgTkVBUkVTVE1WLCA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQodGQtPmxlZnRfeV9ubnpfY3R4LCAwLCAxNik7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh0ZC0+bGVmdF91dl9ubnpfY3R4LCAwLCAzMik7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCh0ZC0+bGVmdF9zZWdwcmVkX2N0eCwgMCwgOCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGQtPmMgPSAmdGQtPmNfYlt0aWxlX2NvbF07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChjb2wgPSB0aWxlX2NvbF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgIGNvbCA8IHRpbGVfY29sX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgIGNvbCArPSA4LCB5b2ZmMiArPSA2NCAqIGJ5dGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICB1dm9mZjIgKz0gNjQgKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2gsIGxmbHZsX3B0cisrKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FIGludGVncmF0ZSB3aXRoIGxmIGNvZGUgKGkuZS4gemVybyBhZnRlciBlYWNoCisgICAgICAgICAgICAgICAgICAgIC8vIHVzZSwgc2ltaWxhciB0byBpbnZ0eGZtIGNvZWZmaWNpZW50cywgb3Igc2ltaWxhcikKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3MgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGxmbHZsX3B0ci0+bWFzaywgMCwgc2l6ZW9mKGxmbHZsX3B0ci0+bWFzaykpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3MgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3NiX21lbSh0ZCwgcm93LCBjb2wsIGxmbHZsX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW9mZjIsIHV2b2ZmMiwgQkxfNjRYNjQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX3NiKHRkLCByb3csIGNvbCwgbGZsdmxfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvZmYyLCB1dm9mZjIsIEJMXzY0WDY0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPnBhc3MgPT0gMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gYmFja3VwIHByZS1sb29wZmlsdGVyIHJlY29uc3RydWN0aW9uIGRhdGEgZm9yIGludHJhCisgICAgICAgICAgICAvLyBwcmVkaWN0aW9uIG9mIG5leHQgcm93IG9mIHNiNjRzCisgICAgICAgICAgICBpZiAocm93ICsgOCA8IHMtPnJvd3MpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+aW50cmFfcHJlZF9kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBmLT5kYXRhWzBdICsgeW9mZiArIDYzICogbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgOCAqIHMtPmNvbHMgKiBieXRlc3BlcnBpeGVsKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+aW50cmFfcHJlZF9kYXRhWzFdLAorICAgICAgICAgICAgICAgICAgICAgICBmLT5kYXRhWzFdICsgdXZvZmYgKyAoKDY0ID4+IHMtPnNzX3YpIC0gMSkgKiBsc191diwKKyAgICAgICAgICAgICAgICAgICAgICAgOCAqIHMtPmNvbHMgKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2gpOworICAgICAgICAgICAgICAgIG1lbWNweShzLT5pbnRyYV9wcmVkX2RhdGFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGYtPmRhdGFbMl0gKyB1dm9mZiArICgoNjQgPj4gcy0+c3NfdikgLSAxKSAqIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICAgICA4ICogcy0+Y29scyAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxvb3BmaWx0ZXIgb25lIHJvdworICAgICAgICAgICAgaWYgKHMtPnMuaC5maWx0ZXIubGV2ZWwpIHsKKyAgICAgICAgICAgICAgICB5b2ZmMiA9IHlvZmY7CisgICAgICAgICAgICAgICAgdXZvZmYyID0gdXZvZmY7CisgICAgICAgICAgICAgICAgbGZsdmxfcHRyID0gcy0+bGZsdmw7CisgICAgICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBzLT5jb2xzOworICAgICAgICAgICAgICAgICAgICAgY29sICs9IDgsIHlvZmYyICs9IDY0ICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgIHV2b2ZmMiArPSA2NCAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaCwgbGZsdmxfcHRyKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmZfdnA5X2xvb3BmaWx0ZXJfc2IoYXZjdHgsIGxmbHZsX3B0ciwgcm93LCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvZmYyLCB1dm9mZjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRklYTUUgbWF5YmUgd2UgY2FuIG1ha2UgdGhpcyBtb3JlIGZpbmVncmFpbmVkIGJ5IHJ1bm5pbmcgdGhlCisgICAgICAgICAgICAvLyBsb29wZmlsdGVyIHBlci1ibG9jayBpbnN0ZWFkIG9mIGFmdGVyIGVhY2ggc2Jyb3cKKyAgICAgICAgICAgIC8vIEluIGZhY3QgdGhhdCB3b3VsZCBhbHNvIG1ha2UgaW50cmEgcHJlZCBsZWZ0IHByZXBhcmF0aW9uIGVhc2llcj8KKyAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYsIHJvdyA+PiAzLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2lmIEhBVkVfVEhSRUFEUworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUKK2ludCBkZWNvZGVfdGlsZXNfbXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICp0ZGF0YSwgaW50IGpvYm5yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVhZG5yKQoreworICAgIFZQOUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIFZQOVRpbGVEYXRhICp0ZCA9ICZzLT50ZFtqb2Jucl07CisgICAgcHRyZGlmZl90IHV2b2ZmLCB5b2ZmLCBsc195LCBsc191djsKKyAgICBpbnQgYnl0ZXNwZXJwaXhlbCA9IHMtPmJ5dGVzcGVycGl4ZWwsIHJvdywgY29sLCB0aWxlX3JvdzsKKyAgICB1bnNpZ25lZCB0aWxlX2NvbHNfbGVuOworICAgIGludCB0aWxlX3Jvd19zdGFydCwgdGlsZV9yb3dfZW5kLCB0aWxlX2NvbF9zdGFydCwgdGlsZV9jb2xfZW5kOworICAgIFZQOUZpbHRlciAqbGZsdmxfcHRyX2Jhc2U7CisgICAgQVZGcmFtZSAqZjsKKworICAgIGYgPSBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmY7CisgICAgbHNfeSA9IGYtPmxpbmVzaXplWzBdOworICAgIGxzX3V2ID1mLT5saW5lc2l6ZVsxXTsKKworICAgIHNldF90aWxlX29mZnNldCgmdGlsZV9jb2xfc3RhcnQsICZ0aWxlX2NvbF9lbmQsCisgICAgICAgICAgICAgICAgICAgIGpvYm5yLCBzLT5zLmgudGlsaW5nLmxvZzJfdGlsZV9jb2xzLCBzLT5zYl9jb2xzKTsKKyAgICB0ZC0+dGlsZV9jb2xfc3RhcnQgID0gdGlsZV9jb2xfc3RhcnQ7CisgICAgdXZvZmYgPSAoNjQgKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2gpKih0aWxlX2NvbF9zdGFydCA+PiAzKTsKKyAgICB5b2ZmID0gKDY0ICogYnl0ZXNwZXJwaXhlbCkqKHRpbGVfY29sX3N0YXJ0ID4+IDMpOworICAgIGxmbHZsX3B0cl9iYXNlID0gcy0+bGZsdmwrKHRpbGVfY29sX3N0YXJ0ID4+IDMpOworCisgICAgZm9yICh0aWxlX3JvdyA9IDA7IHRpbGVfcm93IDwgcy0+cy5oLnRpbGluZy50aWxlX3Jvd3M7IHRpbGVfcm93KyspIHsKKyAgICAgICAgc2V0X3RpbGVfb2Zmc2V0KCZ0aWxlX3Jvd19zdGFydCwgJnRpbGVfcm93X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfcm93LCBzLT5zLmgudGlsaW5nLmxvZzJfdGlsZV9yb3dzLCBzLT5zYl9yb3dzKTsKKworICAgICAgICB0ZC0+YyA9ICZ0ZC0+Y19iW3RpbGVfcm93XTsKKyAgICAgICAgZm9yIChyb3cgPSB0aWxlX3Jvd19zdGFydDsgcm93IDwgdGlsZV9yb3dfZW5kOworICAgICAgICAgICAgIHJvdyArPSA4LCB5b2ZmICs9IGxzX3kgKiA2NCwgdXZvZmYgKz0gbHNfdXYgKiA2NCA+PiBzLT5zc192KSB7CisgICAgICAgICAgICBwdHJkaWZmX3QgeW9mZjIgPSB5b2ZmLCB1dm9mZjIgPSB1dm9mZjsKKyAgICAgICAgICAgIFZQOUZpbHRlciAqbGZsdmxfcHRyID0gbGZsdmxfcHRyX2Jhc2Urcy0+c2JfY29scyoocm93ID4+IDMpOworCisgICAgICAgICAgICBtZW1zZXQodGQtPmxlZnRfcGFydGl0aW9uX2N0eCwgMCwgOCk7CisgICAgICAgICAgICBtZW1zZXQodGQtPmxlZnRfc2tpcF9jdHgsIDAsIDgpOworICAgICAgICAgICAgaWYgKHMtPnMuaC5rZXlmcmFtZSB8fCBzLT5zLmguaW50cmFvbmx5KSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHRkLT5sZWZ0X21vZGVfY3R4LCBEQ19QUkVELCAxNik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbXNldCh0ZC0+bGVmdF9tb2RlX2N0eCwgTkVBUkVTVE1WLCA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldCh0ZC0+bGVmdF95X25uel9jdHgsIDAsIDE2KTsKKyAgICAgICAgICAgIG1lbXNldCh0ZC0+bGVmdF91dl9ubnpfY3R4LCAwLCAzMik7CisgICAgICAgICAgICBtZW1zZXQodGQtPmxlZnRfc2VncHJlZF9jdHgsIDAsIDgpOworCisgICAgICAgICAgICBmb3IgKGNvbCA9IHRpbGVfY29sX3N0YXJ0OworICAgICAgICAgICAgICAgICBjb2wgPCB0aWxlX2NvbF9lbmQ7CisgICAgICAgICAgICAgICAgIGNvbCArPSA4LCB5b2ZmMiArPSA2NCAqIGJ5dGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgIHV2b2ZmMiArPSA2NCAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaCwgbGZsdmxfcHRyKyspIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBpbnRlZ3JhdGUgd2l0aCBsZiBjb2RlIChpLmUuIHplcm8gYWZ0ZXIgZWFjaAorICAgICAgICAgICAgICAgIC8vIHVzZSwgc2ltaWxhciB0byBpbnZ0eGZtIGNvZWZmaWNpZW50cywgb3Igc2ltaWxhcikKKyAgICAgICAgICAgICAgICBtZW1zZXQobGZsdmxfcHRyLT5tYXNrLCAwLCBzaXplb2YobGZsdmxfcHRyLT5tYXNrKSk7CisgICAgICAgICAgICAgICAgZGVjb2RlX3NiKHRkLCByb3csIGNvbCwgbGZsdmxfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvZmYyLCB1dm9mZjIsIEJMXzY0WDY0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmFja3VwIHByZS1sb29wZmlsdGVyIHJlY29uc3RydWN0aW9uIGRhdGEgZm9yIGludHJhCisgICAgICAgICAgICAvLyBwcmVkaWN0aW9uIG9mIG5leHQgcm93IG9mIHNiNjRzCisgICAgICAgICAgICB0aWxlX2NvbHNfbGVuID0gdGlsZV9jb2xfZW5kIC0gdGlsZV9jb2xfc3RhcnQ7CisgICAgICAgICAgICBpZiAocm93ICsgOCA8IHMtPnJvd3MpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+aW50cmFfcHJlZF9kYXRhWzBdICsgKHRpbGVfY29sX3N0YXJ0ICogOCAqIGJ5dGVzcGVycGl4ZWwpLAorICAgICAgICAgICAgICAgICAgICAgICBmLT5kYXRhWzBdICsgeW9mZiArIDYzICogbHNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgOCAqIHRpbGVfY29sc19sZW4gKiBieXRlc3BlcnBpeGVsKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocy0+aW50cmFfcHJlZF9kYXRhWzFdICsgKHRpbGVfY29sX3N0YXJ0ICogOCAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaCksCisgICAgICAgICAgICAgICAgICAgICAgIGYtPmRhdGFbMV0gKyB1dm9mZiArICgoNjQgPj4gcy0+c3NfdikgLSAxKSAqIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICAgICA4ICogdGlsZV9jb2xzX2xlbiAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHMtPmludHJhX3ByZWRfZGF0YVsyXSArICh0aWxlX2NvbF9zdGFydCAqIDggKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2gpLAorICAgICAgICAgICAgICAgICAgICAgICBmLT5kYXRhWzJdICsgdXZvZmYgKyAoKDY0ID4+IHMtPnNzX3YpIC0gMSkgKiBsc191diwKKyAgICAgICAgICAgICAgICAgICAgICAgOCAqIHRpbGVfY29sc19sZW4gKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2gpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2cDlfcmVwb3J0X3RpbGVfcHJvZ3Jlc3Mocywgcm93ID4+IDMsIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZQoraW50IGxvb3BmaWx0ZXJfcHJvYyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgcHRyZGlmZl90IHV2b2ZmLCB5b2ZmLCBsc195LCBsc191djsKKyAgICBWUDlGaWx0ZXIgKmxmbHZsX3B0cjsKKyAgICBpbnQgYnl0ZXNwZXJwaXhlbCA9IHMtPmJ5dGVzcGVycGl4ZWwsIGNvbCwgaTsKKyAgICBBVkZyYW1lICpmOworCisgICAgZiA9IHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZjsKKyAgICBsc195ID0gZi0+bGluZXNpemVbMF07CisgICAgbHNfdXYgPWYtPmxpbmVzaXplWzFdOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnNiX3Jvd3M7IGkrKykgeworICAgICAgICB2cDlfYXdhaXRfdGlsZV9wcm9ncmVzcyhzLCBpLCBzLT5zLmgudGlsaW5nLnRpbGVfY29scyk7CisKKyAgICAgICAgaWYgKHMtPnMuaC5maWx0ZXIubGV2ZWwpIHsKKyAgICAgICAgICAgIHlvZmYgPSAobHNfeSAqIDY0KSppOworICAgICAgICAgICAgdXZvZmYgPSAgKGxzX3V2ICogNjQgPj4gcy0+c3NfdikqaTsKKyAgICAgICAgICAgIGxmbHZsX3B0ciA9IHMtPmxmbHZsK3MtPnNiX2NvbHMqaTsKKyAgICAgICAgICAgIGZvciAoY29sID0gMDsgY29sIDwgcy0+Y29sczsKKyAgICAgICAgICAgICAgICAgY29sICs9IDgsIHlvZmYgKz0gNjQgKiBieXRlc3BlcnBpeGVsLAorICAgICAgICAgICAgICAgICB1dm9mZiArPSA2NCAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaCwgbGZsdmxfcHRyKyspIHsKKyAgICAgICAgICAgICAgICBmZl92cDlfbG9vcGZpbHRlcl9zYihhdmN0eCwgbGZsdmxfcHRyLCBpIDw8IDMsIGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b2ZmLCB1dm9mZik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB2cDlfZGVjb2RlX2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHBrdC0+ZGF0YTsKICAgICBpbnQgc2l6ZSA9IHBrdC0+c2l6ZTsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7Ci0gICAgaW50IHJlcywgdGlsZV9yb3csIHRpbGVfY29sLCBpLCByZWYsIHJvdywgY29sOworICAgIFZQOUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGksIGosIHJlZjsKICAgICBpbnQgcmV0YWluX3NlZ21hcF9yZWYgPSBzLT5zLmZyYW1lc1tSRUZfRlJBTUVfU0VHTUFQXS5zZWdtZW50YXRpb25fbWFwICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzLT5zLmguc2VnbWVudGF0aW9uLmVuYWJsZWQgfHwgIXMtPnMuaC5zZWdtZW50YXRpb24udXBkYXRlX21hcCk7Ci0gICAgcHRyZGlmZl90IHlvZmYsIHV2b2ZmLCBsc195LCBsc191djsKICAgICBBVkZyYW1lICpmOwotICAgIGludCBieXRlc3BlcnBpeGVsOwogCi0gICAgaWYgKChyZXMgPSBkZWNvZGVfZnJhbWVfaGVhZGVyKGN0eCwgZGF0YSwgc2l6ZSwgJnJlZikpIDwgMCkgewotICAgICAgICByZXR1cm4gcmVzOwotICAgIH0gZWxzZSBpZiAocmVzID09IDApIHsKKyAgICBpZiAoKHJldCA9IGRlY29kZV9mcmFtZV9oZWFkZXIoYXZjdHgsIGRhdGEsIHNpemUsICZyZWYpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CiAgICAgICAgIGlmICghcy0+cy5yZWZzW3JlZl0uZi0+YnVmWzBdKSB7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJSZXF1ZXN0ZWQgcmVmZXJlbmNlICVkIG5vdCBhdmFpbGFibGVcbiIsIHJlZik7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlJlcXVlc3RlZCByZWZlcmVuY2UgJWQgbm90IGF2YWlsYWJsZVxuIiwgcmVmKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9Ci0gICAgICAgIGlmICgocmVzID0gYXZfZnJhbWVfcmVmKGZyYW1lLCBzLT5zLnJlZnNbcmVmXS5mKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZnJhbWUsIHMtPnMucmVmc1tyZWZdLmYpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAoKEFWRnJhbWUgKilmcmFtZSktPnB0cyA9IHBrdC0+cHRzOworI2lmIEZGX0FQSV9QS1RfUFRTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgICAgICgoQVZGcmFtZSAqKWZyYW1lKS0+cGt0X3B0cyA9IHBrdC0+cHRzOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKICAgICAgICAgKChBVkZyYW1lICopZnJhbWUpLT5wa3RfZHRzID0gcGt0LT5kdHM7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgICAgIGlmIChzLT5uZXh0X3JlZnNbaV0uZi0+YnVmWzBdKQotICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihjdHgsICZzLT5uZXh0X3JlZnNbaV0pOworICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJnMtPm5leHRfcmVmc1tpXSk7CiAgICAgICAgICAgICBpZiAocy0+cy5yZWZzW2ldLmYtPmJ1ZlswXSAmJgotICAgICAgICAgICAgICAgIChyZXMgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZzLT5uZXh0X3JlZnNbaV0sICZzLT5zLnJlZnNbaV0pKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICAocmV0ID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmcy0+bmV4dF9yZWZzW2ldLCAmcy0+cy5yZWZzW2ldKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KICAgICAgICAgKmdvdF9mcmFtZSA9IDE7CiAgICAgICAgIHJldHVybiBwa3QtPnNpemU7CiAgICAgfQotICAgIGRhdGEgKz0gcmVzOwotICAgIHNpemUgLT0gcmVzOworICAgIGRhdGEgKz0gcmV0OworICAgIHNpemUgLT0gcmV0OwogCiAgICAgaWYgKCFyZXRhaW5fc2VnbWFwX3JlZiB8fCBzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkgewogICAgICAgICBpZiAocy0+cy5mcmFtZXNbUkVGX0ZSQU1FX1NFR01BUF0udGYuZi0+YnVmWzBdKQotICAgICAgICAgICAgdnA5X3VucmVmX2ZyYW1lKGN0eCwgJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9TRUdNQVBdKTsKKyAgICAgICAgICAgIHZwOV9mcmFtZV91bnJlZihhdmN0eCwgJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9TRUdNQVBdKTsKICAgICAgICAgaWYgKCFzLT5zLmgua2V5ZnJhbWUgJiYgIXMtPnMuaC5pbnRyYW9ubHkgJiYgIXMtPnMuaC5lcnJvcnJlcyAmJiBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmJ1ZlswXSAmJgotICAgICAgICAgICAgKHJlcyA9IHZwOV9yZWZfZnJhbWUoY3R4LCAmcy0+cy5mcmFtZXNbUkVGX0ZSQU1FX1NFR01BUF0sICZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIChyZXQgPSB2cDlfZnJhbWVfcmVmKGF2Y3R4LCAmcy0+cy5mcmFtZXNbUkVGX0ZSQU1FX1NFR01BUF0sICZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgaWYgKHMtPnMuZnJhbWVzW1JFRl9GUkFNRV9NVlBBSVJdLnRmLmYtPmJ1ZlswXSkKLSAgICAgICAgdnA5X3VucmVmX2ZyYW1lKGN0eCwgJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9NVlBBSVJdKTsKKyAgICAgICAgdnA5X2ZyYW1lX3VucmVmKGF2Y3R4LCAmcy0+cy5mcmFtZXNbUkVGX0ZSQU1FX01WUEFJUl0pOwogICAgIGlmICghcy0+cy5oLmludHJhb25seSAmJiAhcy0+cy5oLmtleWZyYW1lICYmICFzLT5zLmguZXJyb3JyZXMgJiYgcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5idWZbMF0gJiYKLSAgICAgICAgKHJlcyA9IHZwOV9yZWZfZnJhbWUoY3R4LCAmcy0+cy5mcmFtZXNbUkVGX0ZSQU1FX01WUEFJUl0sICZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdKSkgPCAwKQotICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAocmV0ID0gdnA5X2ZyYW1lX3JlZihhdmN0eCwgJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9NVlBBSVJdLCAmcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICBpZiAocy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5idWZbMF0pCi0gICAgICAgIHZwOV91bnJlZl9mcmFtZShjdHgsICZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdKTsKLSAgICBpZiAoKHJlcyA9IHZwOV9hbGxvY19mcmFtZShjdHgsICZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdKSkgPCAwKQotICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB2cDlfZnJhbWVfdW5yZWYoYXZjdHgsICZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdKTsKKyAgICBpZiAoKHJldCA9IHZwOV9mcmFtZV9hbGxvYyhhdmN0eCwgJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0pKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAgICAgZiA9IHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZjsKICAgICBmLT5rZXlfZnJhbWUgPSBzLT5zLmgua2V5ZnJhbWU7CiAgICAgZi0+cGljdF90eXBlID0gKHMtPnMuaC5rZXlmcmFtZSB8fCBzLT5zLmguaW50cmFvbmx5KSA/IEFWX1BJQ1RVUkVfVFlQRV9JIDogQVZfUElDVFVSRV9UWVBFX1A7Ci0gICAgbHNfeSA9IGYtPmxpbmVzaXplWzBdOwotICAgIGxzX3V2ID1mLT5saW5lc2l6ZVsxXTsKIAogICAgIGlmIChzLT5zLmZyYW1lc1tSRUZfRlJBTUVfU0VHTUFQXS50Zi5mLT5idWZbMF0gJiYKICAgICAgICAgKHMtPnMuZnJhbWVzW1JFRl9GUkFNRV9NVlBBSVJdLnRmLmYtPndpZHRoICAhPSBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPndpZHRoIHx8CiAgICAgICAgICBzLT5zLmZyYW1lc1tSRUZfRlJBTUVfTVZQQUlSXS50Zi5mLT5oZWlnaHQgIT0gcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5oZWlnaHQpKSB7Ci0gICAgICAgIHZwOV91bnJlZl9mcmFtZShjdHgsICZzLT5zLmZyYW1lc1tSRUZfRlJBTUVfU0VHTUFQXSk7CisgICAgICAgIHZwOV9mcmFtZV91bnJlZihhdmN0eCwgJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9TRUdNQVBdKTsKICAgICB9CiAKICAgICAvLyByZWYgZnJhbWUgc2V0dXAKICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgICAgIGlmIChzLT5uZXh0X3JlZnNbaV0uZi0+YnVmWzBdKQotICAgICAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGN0eCwgJnMtPm5leHRfcmVmc1tpXSk7CisgICAgICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoYXZjdHgsICZzLT5uZXh0X3JlZnNbaV0pOwogICAgICAgICBpZiAocy0+cy5oLnJlZnJlc2hyZWZtYXNrICYgKDEgPDwgaSkpIHsKLSAgICAgICAgICAgIHJlcyA9IGZmX3RocmVhZF9yZWZfZnJhbWUoJnMtPm5leHRfcmVmc1tpXSwgJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYpOworICAgICAgICAgICAgcmV0ID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmcy0+bmV4dF9yZWZzW2ldLCAmcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zik7CiAgICAgICAgIH0gZWxzZSBpZiAocy0+cy5yZWZzW2ldLmYtPmJ1ZlswXSkgewotICAgICAgICAgICAgcmVzID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmcy0+bmV4dF9yZWZzW2ldLCAmcy0+cy5yZWZzW2ldKTsKKyAgICAgICAgICAgIHJldCA9IGZmX3RocmVhZF9yZWZfZnJhbWUoJnMtPm5leHRfcmVmc1tpXSwgJnMtPnMucmVmc1tpXSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlcyA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgaWYgKGN0eC0+aHdhY2NlbCkgewotICAgICAgICByZXMgPSBjdHgtPmh3YWNjZWwtPnN0YXJ0X2ZyYW1lKGN0eCwgTlVMTCwgMCk7Ci0gICAgICAgIGlmIChyZXMgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgcmVzID0gY3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoY3R4LCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7Ci0gICAgICAgIGlmIChyZXMgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgcmVzID0gY3R4LT5od2FjY2VsLT5lbmRfZnJhbWUoY3R4KTsKLSAgICAgICAgaWYgKHJlcyA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmVzOworICAgIGlmIChhdmN0eC0+aHdhY2NlbCkgeworICAgICAgICByZXQgPSBhdmN0eC0+aHdhY2NlbC0+c3RhcnRfZnJhbWUoYXZjdHgsIE5VTEwsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IGF2Y3R4LT5od2FjY2VsLT5kZWNvZGVfc2xpY2UoYXZjdHgsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSBhdmN0eC0+aHdhY2NlbC0+ZW5kX2ZyYW1lKGF2Y3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9CiAKICAgICAvLyBtYWluIHRpbGUgZGVjb2RlIGxvb3AKLSAgICBieXRlc3BlcnBpeGVsID0gcy0+Ynl0ZXNwZXJwaXhlbDsKICAgICBtZW1zZXQocy0+YWJvdmVfcGFydGl0aW9uX2N0eCwgMCwgcy0+Y29scyk7CiAgICAgbWVtc2V0KHMtPmFib3ZlX3NraXBfY3R4LCAwLCBzLT5jb2xzKTsKICAgICBpZiAocy0+cy5oLmtleWZyYW1lIHx8IHMtPnMuaC5pbnRyYW9ubHkpIHsKQEAgLTQwNzMsMTEgKzE1NjYsMTEgQEAKICAgICBtZW1zZXQocy0+YWJvdmVfdXZfbm56X2N0eFsxXSwgMCwgcy0+c2JfY29scyAqIDE2ID4+IHMtPnNzX2gpOwogICAgIG1lbXNldChzLT5hYm92ZV9zZWdwcmVkX2N0eCwgMCwgcy0+Y29scyk7CiAgICAgcy0+cGFzcyA9IHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udXNlc18ycGFzcyA9Ci0gICAgICAgIGN0eC0+YWN0aXZlX3RocmVhZF90eXBlID09IEZGX1RIUkVBRF9GUkFNRSAmJiBzLT5zLmgucmVmcmVzaGN0eCAmJiAhcy0+cy5oLnBhcmFsbGVsbW9kZTsKLSAgICBpZiAoKHJlcyA9IHVwZGF0ZV9ibG9ja19idWZmZXJzKGN0eCkpIDwgMCkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgIGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgPT0gRkZfVEhSRUFEX0ZSQU1FICYmIHMtPnMuaC5yZWZyZXNoY3R4ICYmICFzLT5zLmgucGFyYWxsZWxtb2RlOworICAgIGlmICgocmV0ID0gdXBkYXRlX2Jsb2NrX2J1ZmZlcnMoYXZjdHgpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIGJsb2NrIGJ1ZmZlcnNcbiIpOwotICAgICAgICByZXR1cm4gcmVzOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBpZiAocy0+cy5oLnJlZnJlc2hjdHggJiYgcy0+cy5oLnBhcmFsbGVsbW9kZSkgewogICAgICAgICBpbnQgaiwgaywgbCwgbTsKQEAgLTQwOTMsMjUgKzE1ODYsMzYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBzLT5wcm9iX2N0eFtzLT5zLmguZnJhbWVjdHhpZF0ucCA9IHMtPnByb2IucDsKLSAgICAgICAgZmZfdGhyZWFkX2ZpbmlzaF9zZXR1cChjdHgpOworICAgICAgICBmZl90aHJlYWRfZmluaXNoX3NldHVwKGF2Y3R4KTsKICAgICB9IGVsc2UgaWYgKCFzLT5zLmgucmVmcmVzaGN0eCkgewotICAgICAgICBmZl90aHJlYWRfZmluaXNoX3NldHVwKGN0eCk7CisgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOwogICAgIH0KIAotICAgIGRvIHsKLSAgICAgICAgeW9mZiA9IHV2b2ZmID0gMDsKLSAgICAgICAgcy0+YiA9IHMtPmJfYmFzZTsKLSAgICAgICAgcy0+YmxvY2sgPSBzLT5ibG9ja19iYXNlOwotICAgICAgICBzLT51dmJsb2NrWzBdID0gcy0+dXZibG9ja19iYXNlWzBdOwotICAgICAgICBzLT51dmJsb2NrWzFdID0gcy0+dXZibG9ja19iYXNlWzFdOwotICAgICAgICBzLT5lb2IgPSBzLT5lb2JfYmFzZTsKLSAgICAgICAgcy0+dXZlb2JbMF0gPSBzLT51dmVvYl9iYXNlWzBdOwotICAgICAgICBzLT51dmVvYlsxXSA9IHMtPnV2ZW9iX2Jhc2VbMV07CisjaWYgSEFWRV9USFJFQURTCisgICAgaWYgKGF2Y3R4LT5hY3RpdmVfdGhyZWFkX3R5cGUgJiBGRl9USFJFQURfU0xJQ0UpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNiX3Jvd3M7IGkrKykKKyAgICAgICAgICAgIGF0b21pY19zdG9yZSgmcy0+ZW50cmllc1tpXSwgMCk7CisgICAgfQorI2VuZGlmCiAKLSAgICAgICAgZm9yICh0aWxlX3JvdyA9IDA7IHRpbGVfcm93IDwgcy0+cy5oLnRpbGluZy50aWxlX3Jvd3M7IHRpbGVfcm93KyspIHsKLSAgICAgICAgICAgIHNldF90aWxlX29mZnNldCgmcy0+dGlsZV9yb3dfc3RhcnQsICZzLT50aWxlX3Jvd19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9yb3csIHMtPnMuaC50aWxpbmcubG9nMl90aWxlX3Jvd3MsIHMtPnNiX3Jvd3MpOwotICAgICAgICAgICAgaWYgKHMtPnBhc3MgIT0gMikgeworICAgIGRvIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmFjdGl2ZV90aWxlX2NvbHM7IGkrKykgeworICAgICAgICAgICAgcy0+dGRbaV0uYiA9IHMtPnRkW2ldLmJfYmFzZTsKKyAgICAgICAgICAgIHMtPnRkW2ldLmJsb2NrID0gcy0+dGRbaV0uYmxvY2tfYmFzZTsKKyAgICAgICAgICAgIHMtPnRkW2ldLnV2YmxvY2tbMF0gPSBzLT50ZFtpXS51dmJsb2NrX2Jhc2VbMF07CisgICAgICAgICAgICBzLT50ZFtpXS51dmJsb2NrWzFdID0gcy0+dGRbaV0udXZibG9ja19iYXNlWzFdOworICAgICAgICAgICAgcy0+dGRbaV0uZW9iID0gcy0+dGRbaV0uZW9iX2Jhc2U7CisgICAgICAgICAgICBzLT50ZFtpXS51dmVvYlswXSA9IHMtPnRkW2ldLnV2ZW9iX2Jhc2VbMF07CisgICAgICAgICAgICBzLT50ZFtpXS51dmVvYlsxXSA9IHMtPnRkW2ldLnV2ZW9iX2Jhc2VbMV07CisgICAgICAgIH0KKworI2lmIEhBVkVfVEhSRUFEUworICAgICAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfU0xJQ0UpIHsKKyAgICAgICAgICAgIGludCB0aWxlX3JvdywgdGlsZV9jb2w7CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDEoIXMtPnBhc3MpOworCisgICAgICAgICAgICBmb3IgKHRpbGVfcm93ID0gMDsgdGlsZV9yb3cgPCBzLT5zLmgudGlsaW5nLnRpbGVfcm93czsgdGlsZV9yb3crKykgewogICAgICAgICAgICAgICAgIGZvciAodGlsZV9jb2wgPSAwOyB0aWxlX2NvbCA8IHMtPnMuaC50aWxpbmcudGlsZV9jb2xzOyB0aWxlX2NvbCsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGlsZV9zaXplOwogCkBAIC00MTIzLDEwNyArMTYyNywzOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSA0OwogICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSA0OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aWxlX3NpemUgPiBzaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLCBJTlRfTUFYLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGVfc2l6ZSA+IHNpemUpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmZl92cDU2X2luaXRfcmFuZ2VfZGVjb2Rlcigmcy0+Y19iW3RpbGVfY29sXSwgZGF0YSwgdGlsZV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoJnMtPmNfYlt0aWxlX2NvbF0sIDEyOCkpIHsgLy8gbWFya2VyIGJpdAotICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGhyZWFkX3JlcG9ydF9wcm9ncmVzcygmcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50ZiwgSU5UX01BWCwgMCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGZmX3ZwNTZfaW5pdF9yYW5nZV9kZWNvZGVyKCZzLT50ZFt0aWxlX2NvbF0uY19iW3RpbGVfcm93XSwgZGF0YSwgdGlsZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICBpZiAodnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSgmcy0+dGRbdGlsZV9jb2xdLmNfYlt0aWxlX3Jvd10sIDEyOCkpIC8vIG1hcmtlciBiaXQKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gdGlsZV9zaXplOwogICAgICAgICAgICAgICAgICAgICBzaXplIC09IHRpbGVfc2l6ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAocm93ID0gcy0+dGlsZV9yb3dfc3RhcnQ7IHJvdyA8IHMtPnRpbGVfcm93X2VuZDsKLSAgICAgICAgICAgICAgICAgcm93ICs9IDgsIHlvZmYgKz0gbHNfeSAqIDY0LCB1dm9mZiArPSBsc191diAqIDY0ID4+IHMtPnNzX3YpIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgVlA5RmlsdGVyICpsZmx2bF9wdHIgPSBzLT5sZmx2bDsKLSAgICAgICAgICAgICAgICBwdHJkaWZmX3QgeW9mZjIgPSB5b2ZmLCB1dm9mZjIgPSB1dm9mZjsKLQotICAgICAgICAgICAgICAgIGZvciAodGlsZV9jb2wgPSAwOyB0aWxlX2NvbCA8IHMtPnMuaC50aWxpbmcudGlsZV9jb2xzOyB0aWxlX2NvbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldF90aWxlX29mZnNldCgmcy0+dGlsZV9jb2xfc3RhcnQsICZzLT50aWxlX2NvbF9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2NvbCwgcy0+cy5oLnRpbGluZy5sb2cyX3RpbGVfY29scywgcy0+c2JfY29scyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3MgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxlZnRfcGFydGl0aW9uX2N0eCwgMCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocy0+bGVmdF9za2lwX2N0eCwgMCwgOCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+cy5oLmtleWZyYW1lIHx8IHMtPnMuaC5pbnRyYW9ubHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocy0+bGVmdF9tb2RlX2N0eCwgRENfUFJFRCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQocy0+bGVmdF9tb2RlX2N0eCwgTkVBUkVTVE1WLCA4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5sZWZ0X3lfbm56X2N0eCwgMCwgMTYpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxlZnRfdXZfbm56X2N0eCwgMCwgMzIpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmxlZnRfc2VncHJlZF9jdHgsIDAsIDgpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnMtPmMsICZzLT5jX2JbdGlsZV9jb2xdLCBzaXplb2Yocy0+YykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChjb2wgPSBzLT50aWxlX2NvbF9zdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb2wgPCBzLT50aWxlX2NvbF9lbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY29sICs9IDgsIHlvZmYyICs9IDY0ICogYnl0ZXNwZXJwaXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1dm9mZjIgKz0gNjQgKiBieXRlc3BlcnBpeGVsID4+IHMtPnNzX2gsIGxmbHZsX3B0cisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBpbnRlZ3JhdGUgd2l0aCBsZiBjb2RlIChpLmUuIHplcm8gYWZ0ZXIgZWFjaAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlLCBzaW1pbGFyIHRvIGludnR4Zm0gY29lZmZpY2llbnRzLCBvciBzaW1pbGFyKQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3MgIT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChsZmx2bF9wdHItPm1hc2ssIDAsIHNpemVvZihsZmx2bF9wdHItPm1hc2spKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3MgPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9zYl9tZW0oY3R4LCByb3csIGNvbCwgbGZsdmxfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW9mZjIsIHV2b2ZmMiwgQkxfNjRYNjQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfc2IoY3R4LCByb3csIGNvbCwgbGZsdmxfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b2ZmMiwgdXZvZmYyLCBCTF82NFg2NCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBhc3MgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZzLT5jX2JbdGlsZV9jb2xdLCAmcy0+Yywgc2l6ZW9mKHMtPmMpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChzLT5wYXNzID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gYmFja3VwIHByZS1sb29wZmlsdGVyIHJlY29uc3RydWN0aW9uIGRhdGEgZm9yIGludHJhCi0gICAgICAgICAgICAgICAgLy8gcHJlZGljdGlvbiBvZiBuZXh0IHJvdyBvZiBzYjY0cwotICAgICAgICAgICAgICAgIGlmIChyb3cgKyA4IDwgcy0+cm93cykgewotICAgICAgICAgICAgICAgICAgICBtZW1jcHkocy0+aW50cmFfcHJlZF9kYXRhWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+ZGF0YVswXSArIHlvZmYgKyA2MyAqIGxzX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA4ICogcy0+Y29scyAqIGJ5dGVzcGVycGl4ZWwpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkocy0+aW50cmFfcHJlZF9kYXRhWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZi0+ZGF0YVsxXSArIHV2b2ZmICsgKCg2NCA+PiBzLT5zc192KSAtIDEpICogbHNfdXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA4ICogcy0+Y29scyAqIGJ5dGVzcGVycGl4ZWwgPj4gcy0+c3NfaCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShzLT5pbnRyYV9wcmVkX2RhdGFbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmLT5kYXRhWzJdICsgdXZvZmYgKyAoKDY0ID4+IHMtPnNzX3YpIC0gMSkgKiBsc191diwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDggKiBzLT5jb2xzICogYnl0ZXNwZXJwaXhlbCA+PiBzLT5zc19oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBsb29wZmlsdGVyIG9uZSByb3cKLSAgICAgICAgICAgICAgICBpZiAocy0+cy5oLmZpbHRlci5sZXZlbCkgewotICAgICAgICAgICAgICAgICAgICB5b2ZmMiA9IHlvZmY7Ci0gICAgICAgICAgICAgICAgICAgIHV2b2ZmMiA9IHV2b2ZmOwotICAgICAgICAgICAgICAgICAgICBsZmx2bF9wdHIgPSBzLT5sZmx2bDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChjb2wgPSAwOyBjb2wgPCBzLT5jb2xzOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbCArPSA4LCB5b2ZmMiArPSA2NCAqIGJ5dGVzcGVycGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXZvZmYyICs9IDY0ICogYnl0ZXNwZXJwaXhlbCA+PiBzLT5zc19oLCBsZmx2bF9wdHIrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbG9vcGZpbHRlcl9zYihjdHgsIGxmbHZsX3B0ciwgcm93LCBjb2wsIHlvZmYyLCB1dm9mZjIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRklYTUUgbWF5YmUgd2UgY2FuIG1ha2UgdGhpcyBtb3JlIGZpbmVncmFpbmVkIGJ5IHJ1bm5pbmcgdGhlCi0gICAgICAgICAgICAgICAgLy8gbG9vcGZpbHRlciBwZXItYmxvY2sgaW5zdGVhZCBvZiBhZnRlciBlYWNoIHNicm93Ci0gICAgICAgICAgICAgICAgLy8gSW4gZmFjdCB0aGF0IHdvdWxkIGFsc28gbWFrZSBpbnRyYSBwcmVkIGxlZnQgcHJlcGFyYXRpb24gZWFzaWVyPwotICAgICAgICAgICAgICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYsIHJvdyA+PiAzLCAwKTsKKyAgICAgICAgICAgIGZmX3NsaWNlX3RocmVhZF9leGVjdXRlX3dpdGhfbWFpbmZ1bmMoYXZjdHgsIGRlY29kZV90aWxlc19tdCwgbG9vcGZpbHRlcl9wcm9jLCBzLT50ZCwgTlVMTCwgcy0+cy5oLnRpbGluZy50aWxlX2NvbHMpOworICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBkZWNvZGVfdGlsZXMoYXZjdHgsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBmZl90aHJlYWRfcmVwb3J0X3Byb2dyZXNzKCZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLCBJTlRfTUFYLCAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgLy8gU3VtIGFsbCBjb3VudHMgZmllbGRzIGludG8gdGRbMF0uY291bnRzIGZvciB0aWxlIHRocmVhZGluZworICAgICAgICBpZiAoYXZjdHgtPmFjdGl2ZV90aHJlYWRfdHlwZSA9PSBGRl9USFJFQURfU0xJQ0UpCisgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcy0+cy5oLnRpbGluZy50aWxlX2NvbHM7IGkrKykKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZW9mKHMtPnRkW2ldLmNvdW50cykgLyBzaXplb2YodW5zaWduZWQpOyBqKyspCisgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgKikmcy0+dGRbMF0uY291bnRzKVtqXSArPSAoKHVuc2lnbmVkICopJnMtPnRkW2ldLmNvdW50cylbal07CisKICAgICAgICAgaWYgKHMtPnBhc3MgPCAyICYmIHMtPnMuaC5yZWZyZXNoY3R4ICYmICFzLT5zLmgucGFyYWxsZWxtb2RlKSB7Ci0gICAgICAgICAgICBhZGFwdF9wcm9icyhzKTsKLSAgICAgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoY3R4KTsKKyAgICAgICAgICAgIGZmX3ZwOV9hZGFwdF9wcm9icyhzKTsKKyAgICAgICAgICAgIGZmX3RocmVhZF9maW5pc2hfc2V0dXAoYXZjdHgpOwogICAgICAgICB9CiAgICAgfSB3aGlsZSAocy0+cGFzcysrID09IDEpOwogICAgIGZmX3RocmVhZF9yZXBvcnRfcHJvZ3Jlc3MoJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYsIElOVF9NQVgsIDApOwpAQCAtNDIzMiw0MiArMTY2Nyw0MiBAQAogICAgIC8vIHJlZiBmcmFtZSBzZXR1cAogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgaWYgKHMtPnMucmVmc1tpXS5mLT5idWZbMF0pCi0gICAgICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoY3R4LCAmcy0+cy5yZWZzW2ldKTsKKyAgICAgICAgICAgIGZmX3RocmVhZF9yZWxlYXNlX2J1ZmZlcihhdmN0eCwgJnMtPnMucmVmc1tpXSk7CiAgICAgICAgIGlmIChzLT5uZXh0X3JlZnNbaV0uZi0+YnVmWzBdICYmCi0gICAgICAgICAgICAocmVzID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmcy0+cy5yZWZzW2ldLCAmcy0+bmV4dF9yZWZzW2ldKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIChyZXQgPSBmZl90aHJlYWRfcmVmX2ZyYW1lKCZzLT5zLnJlZnNbaV0sICZzLT5uZXh0X3JlZnNbaV0pKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIGlmICghcy0+cy5oLmludmlzaWJsZSkgewotICAgICAgICBpZiAoKHJlcyA9IGF2X2ZyYW1lX3JlZihmcmFtZSwgcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9yZWYoZnJhbWUsIHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICpnb3RfZnJhbWUgPSAxOwogICAgIH0KIAogICAgIHJldHVybiBwa3QtPnNpemU7CiB9CiAKLXN0YXRpYyB2b2lkIHZwOV9kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmN0eCkKK3N0YXRpYyB2b2lkIHZwOV9kZWNvZGVfZmx1c2goQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBWUDlDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBpbnQgaTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0gICAgICAgIHZwOV91bnJlZl9mcmFtZShjdHgsICZzLT5zLmZyYW1lc1tpXSk7CisgICAgICAgIHZwOV9mcmFtZV91bnJlZihhdmN0eCwgJnMtPnMuZnJhbWVzW2ldKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoY3R4LCAmcy0+cy5yZWZzW2ldKTsKKyAgICAgICAgZmZfdGhyZWFkX3JlbGVhc2VfYnVmZmVyKGF2Y3R4LCAmcy0+cy5yZWZzW2ldKTsKIH0KIAotc3RhdGljIGludCBpbml0X2ZyYW1lcyhBVkNvZGVjQ29udGV4dCAqY3R4KQorc3RhdGljIGludCBpbml0X2ZyYW1lcyhBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0gICAgVlA5Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIFZQOUNvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICBzLT5zLmZyYW1lc1tpXS50Zi5mID0gYXZfZnJhbWVfYWxsb2MoKTsKICAgICAgICAgaWYgKCFzLT5zLmZyYW1lc1tpXS50Zi5mKSB7Ci0gICAgICAgICAgICB2cDlfZGVjb2RlX2ZyZWUoY3R4KTsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZSBidWZmZXIgJWRcbiIsIGkpOworICAgICAgICAgICAgdnA5X2RlY29kZV9mcmVlKGF2Y3R4KTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZFxuIiwgaSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CiAgICAgfQpAQCAtNDI3NSw4ICsxNzEwLDggQEAKICAgICAgICAgcy0+cy5yZWZzW2ldLmYgPSBhdl9mcmFtZV9hbGxvYygpOwogICAgICAgICBzLT5uZXh0X3JlZnNbaV0uZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CiAgICAgICAgIGlmICghcy0+cy5yZWZzW2ldLmYgfHwgIXMtPm5leHRfcmVmc1tpXS5mKSB7Ci0gICAgICAgICAgICB2cDlfZGVjb2RlX2ZyZWUoY3R4KTsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZSBidWZmZXIgJWRcbiIsIGkpOworICAgICAgICAgICAgdnA5X2RlY29kZV9mcmVlKGF2Y3R4KTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGZyYW1lIGJ1ZmZlciAlZFxuIiwgaSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CiAgICAgfQpAQCAtNDI4NCwxNSArMTcxOSwxNSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgYXZfY29sZCBpbnQgdnA5X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICpjdHgpCitzdGF0aWMgYXZfY29sZCBpbnQgdnA5X2RlY29kZV9pbml0KEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKLSAgICBWUDlDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgVlA5Q29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAKLSAgICBjdHgtPmludGVybmFsLT5hbGxvY2F0ZV9wcm9ncmVzcyA9IDE7CisgICAgYXZjdHgtPmludGVybmFsLT5hbGxvY2F0ZV9wcm9ncmVzcyA9IDE7CiAgICAgcy0+bGFzdF9icHAgPSAwOwogICAgIHMtPnMuaC5maWx0ZXIuc2hhcnBuZXNzID0gLTE7CiAKLSAgICByZXR1cm4gaW5pdF9mcmFtZXMoY3R4KTsKKyAgICByZXR1cm4gaW5pdF9mcmFtZXMoYXZjdHgpOwogfQogCiAjaWYgSEFWRV9USFJFQURTCkBAIC00MzAzLDIzICsxNzM4LDIzIEBACiAKIHN0YXRpYyBpbnQgdnA5X2RlY29kZV91cGRhdGVfdGhyZWFkX2NvbnRleHQoQVZDb2RlY0NvbnRleHQgKmRzdCwgY29uc3QgQVZDb2RlY0NvbnRleHQgKnNyYykKIHsKLSAgICBpbnQgaSwgcmVzOworICAgIGludCBpLCByZXQ7CiAgICAgVlA5Q29udGV4dCAqcyA9IGRzdC0+cHJpdl9kYXRhLCAqc3NyYyA9IHNyYy0+cHJpdl9kYXRhOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICBpZiAocy0+cy5mcmFtZXNbaV0udGYuZi0+YnVmWzBdKQotICAgICAgICAgICAgdnA5X3VucmVmX2ZyYW1lKGRzdCwgJnMtPnMuZnJhbWVzW2ldKTsKKyAgICAgICAgICAgIHZwOV9mcmFtZV91bnJlZihkc3QsICZzLT5zLmZyYW1lc1tpXSk7CiAgICAgICAgIGlmIChzc3JjLT5zLmZyYW1lc1tpXS50Zi5mLT5idWZbMF0pIHsKLSAgICAgICAgICAgIGlmICgocmVzID0gdnA5X3JlZl9mcmFtZShkc3QsICZzLT5zLmZyYW1lc1tpXSwgJnNzcmMtPnMuZnJhbWVzW2ldKSkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBpZiAoKHJldCA9IHZwOV9mcmFtZV9yZWYoZHN0LCAmcy0+cy5mcmFtZXNbaV0sICZzc3JjLT5zLmZyYW1lc1tpXSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICAgaWYgKHMtPnMucmVmc1tpXS5mLT5idWZbMF0pCiAgICAgICAgICAgICBmZl90aHJlYWRfcmVsZWFzZV9idWZmZXIoZHN0LCAmcy0+cy5yZWZzW2ldKTsKICAgICAgICAgaWYgKHNzcmMtPm5leHRfcmVmc1tpXS5mLT5idWZbMF0pIHsKLSAgICAgICAgICAgIGlmICgocmVzID0gZmZfdGhyZWFkX3JlZl9mcmFtZSgmcy0+cy5yZWZzW2ldLCAmc3NyYy0+bmV4dF9yZWZzW2ldKSkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX3RocmVhZF9yZWZfZnJhbWUoJnMtPnMucmVmc1tpXSwgJnNzcmMtPm5leHRfcmVmc1tpXSkpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfQogCkBAIC00MzM1LDcgKzE3NzAsNyBAQAogICAgIHMtPmdmX2ZtdCA9IHNzcmMtPmdmX2ZtdDsKICAgICBzLT53ID0gc3NyYy0+dzsKICAgICBzLT5oID0gc3NyYy0+aDsKLSAgICBzLT5icHAgPSBzc3JjLT5icHA7CisgICAgcy0+cy5oLmJwcCA9IHNzcmMtPnMuaC5icHA7CiAgICAgcy0+YnBwX2luZGV4ID0gc3NyYy0+YnBwX2luZGV4OwogICAgIHMtPnBpeF9mbXQgPSBzc3JjLT5waXhfZm10OwogICAgIG1lbWNweSgmcy0+cHJvYl9jdHgsICZzc3JjLT5wcm9iX2N0eCwgc2l6ZW9mKHMtPnByb2JfY3R4KSk7CkBAIC00MzU2LDkgKzE3OTEsMjkgQEAKICAgICAuaW5pdCAgICAgICAgICAgICAgICAgID0gdnA5X2RlY29kZV9pbml0LAogICAgIC5jbG9zZSAgICAgICAgICAgICAgICAgPSB2cDlfZGVjb2RlX2ZyZWUsCiAgICAgLmRlY29kZSAgICAgICAgICAgICAgICA9IHZwOV9kZWNvZGVfZnJhbWUsCi0gICAgLmNhcGFiaWxpdGllcyAgICAgICAgICA9IEFWX0NPREVDX0NBUF9EUjEgfCBBVl9DT0RFQ19DQVBfRlJBTUVfVEhSRUFEUywKKyAgICAuY2FwYWJpbGl0aWVzICAgICAgICAgID0gQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9GUkFNRV9USFJFQURTIHwgQVZfQ09ERUNfQ0FQX1NMSUNFX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgICAgICAgICA9IEZGX0NPREVDX0NBUF9TTElDRV9USFJFQURfSEFTX01GLAogICAgIC5mbHVzaCAgICAgICAgICAgICAgICAgPSB2cDlfZGVjb2RlX2ZsdXNoLAogICAgIC5pbml0X3RocmVhZF9jb3B5ICAgICAgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh2cDlfZGVjb2RlX2luaXRfdGhyZWFkX2NvcHkpLAogICAgIC51cGRhdGVfdGhyZWFkX2NvbnRleHQgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRCh2cDlfZGVjb2RlX3VwZGF0ZV90aHJlYWRfY29udGV4dCksCiAgICAgLnByb2ZpbGVzICAgICAgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKGZmX3ZwOV9wcm9maWxlcyksCisgICAgLmJzZnMgICAgICAgICAgICAgICAgICA9ICJ2cDlfc3VwZXJmcmFtZV9zcGxpdCIsCisgICAgLmh3X2NvbmZpZ3MgICAgICAgICAgICA9IChjb25zdCBBVkNvZGVjSFdDb25maWdJbnRlcm5hbCpbXSkgeworI2lmIENPTkZJR19WUDlfRFhWQTJfSFdBQ0NFTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXQUNDRUxfRFhWQTIodnA5KSwKKyNlbmRpZgorI2lmIENPTkZJR19WUDlfRDNEMTFWQV9IV0FDQ0VMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdBQ0NFTF9EM0QxMVZBKHZwOSksCisjZW5kaWYKKyNpZiBDT05GSUdfVlA5X0QzRDExVkEyX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX0QzRDExVkEyKHZwOSksCisjZW5kaWYKKyNpZiBDT05GSUdfVlA5X05WREVDX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX05WREVDKHZwOSksCisjZW5kaWYKKyNpZiBDT05GSUdfVlA5X1ZBQVBJX0hXQUNDRUwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV0FDQ0VMX1ZBQVBJKHZwOSksCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA5LmggYi9saWJhdmNvZGVjL3ZwOS5oCmluZGV4IGRmNWJkNGQuLmM4ZDA3YWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdnA5LmgKKysrIGIvbGliYXZjb2RlYy92cDkuaApAQCAtMjQsNDIgKzI0LDYgQEAKICNpZm5kZWYgQVZDT0RFQ19WUDlfSAogI2RlZmluZSBBVkNPREVDX1ZQOV9ICiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgInRocmVhZC5oIgotI2luY2x1ZGUgInZwNTYuaCIKLQotZW51bSBCbG9ja0xldmVsIHsKLSAgICBCTF82NFg2NCwKLSAgICBCTF8zMlgzMiwKLSAgICBCTF8xNlgxNiwKLSAgICBCTF84WDgsCi19OwotCi1lbnVtIEJsb2NrUGFydGl0aW9uIHsKLSAgICBQQVJUSVRJT05fTk9ORSwgICAgLy8gWyBdIDwtLgotICAgIFBBUlRJVElPTl9ILCAgICAgICAvLyBbLV0gICB8Ci0gICAgUEFSVElUSU9OX1YsICAgICAgIC8vIFt8XSAgIHwKLSAgICBQQVJUSVRJT05fU1BMSVQsICAgLy8gWytdIC0tJwotfTsKLQotZW51bSBCbG9ja1NpemUgewotICAgIEJTXzY0eDY0LAotICAgIEJTXzY0eDMyLAotICAgIEJTXzMyeDY0LAotICAgIEJTXzMyeDMyLAotICAgIEJTXzMyeDE2LAotICAgIEJTXzE2eDMyLAotICAgIEJTXzE2eDE2LAotICAgIEJTXzE2eDgsCi0gICAgQlNfOHgxNiwKLSAgICBCU184eDgsCi0gICAgQlNfOHg0LAotICAgIEJTXzR4OCwKLSAgICBCU180eDQsCi0gICAgTl9CU19TSVpFUywKLX07Ci0KIGVudW0gVHhmbU1vZGUgewogICAgIFRYXzRYNCwKICAgICBUWF84WDgsCkBAIC05NywxMTUgKzYxLDEzIEBACiAgICAgTl9JTlRSQV9QUkVEX01PREVTCiB9OwogCi1lbnVtIEludGVyUHJlZE1vZGUgewotICAgIE5FQVJFU1RNViA9IDEwLAotICAgIE5FQVJNViA9IDExLAotICAgIFpFUk9NViA9IDEyLAotICAgIE5FV01WID0gMTMsCi19OwotCiBlbnVtIEZpbHRlck1vZGUgewogICAgIEZJTFRFUl84VEFQX1NNT09USCwKICAgICBGSUxURVJfOFRBUF9SRUdVTEFSLAogICAgIEZJTFRFUl84VEFQX1NIQVJQLAogICAgIEZJTFRFUl9CSUxJTkVBUiwKLSAgICBGSUxURVJfU1dJVENIQUJMRSwKKyAgICBOX0ZJTFRFUlMsCisgICAgRklMVEVSX1NXSVRDSEFCTEUgPSBOX0ZJTFRFUlMsCiB9OwogCi1lbnVtIENvbXBQcmVkTW9kZSB7Ci0gICAgUFJFRF9TSU5HTEVSRUYsCi0gICAgUFJFRF9DT01QUkVGLAotICAgIFBSRURfU1dJVENIQUJMRSwKLX07Ci0KLXN0cnVjdCBWUDltdnJlZlBhaXIgewotICAgIFZQNTZtdiBtdlsyXTsKLSAgICBpbnQ4X3QgcmVmWzJdOwotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgVlA5RnJhbWUgewotICAgIFRocmVhZEZyYW1lIHRmOwotICAgIEFWQnVmZmVyUmVmICpleHRyYWRhdGE7Ci0gICAgdWludDhfdCAqc2VnbWVudGF0aW9uX21hcDsKLSAgICBzdHJ1Y3QgVlA5bXZyZWZQYWlyICptdjsKLSAgICBpbnQgdXNlc18ycGFzczsKLQotICAgIEFWQnVmZmVyUmVmICpod2FjY2VsX3ByaXZfYnVmOwotICAgIHZvaWQgKmh3YWNjZWxfcGljdHVyZV9wcml2YXRlOwotfSBWUDlGcmFtZTsKLQotdHlwZWRlZiBzdHJ1Y3QgVlA5Qml0c3RyZWFtSGVhZGVyIHsKLSAgICAvLyBiaXRzdHJlYW0gaGVhZGVyCi0gICAgdWludDhfdCBwcm9maWxlOwotICAgIHVpbnQ4X3Qga2V5ZnJhbWU7Ci0gICAgdWludDhfdCBpbnZpc2libGU7Ci0gICAgdWludDhfdCBlcnJvcnJlczsKLSAgICB1aW50OF90IGludHJhb25seTsKLSAgICB1aW50OF90IHJlc2V0Y3R4OwotICAgIHVpbnQ4X3QgcmVmcmVzaHJlZm1hc2s7Ci0gICAgdWludDhfdCBoaWdocHJlY2lzaW9ubXZzOwotICAgIGVudW0gRmlsdGVyTW9kZSBmaWx0ZXJtb2RlOwotICAgIHVpbnQ4X3QgYWxsb3djb21waW50ZXI7Ci0gICAgdWludDhfdCByZWZyZXNoY3R4OwotICAgIHVpbnQ4X3QgcGFyYWxsZWxtb2RlOwotICAgIHVpbnQ4X3QgZnJhbWVjdHhpZDsKLSAgICB1aW50OF90IHVzZV9sYXN0X2ZyYW1lX212czsKLSAgICB1aW50OF90IHJlZmlkeFszXTsKLSAgICB1aW50OF90IHNpZ25iaWFzWzNdOwotICAgIHVpbnQ4X3QgZml4Y29tcHJlZjsKLSAgICB1aW50OF90IHZhcmNvbXByZWZbMl07Ci0gICAgc3RydWN0IHsKLSAgICAgICAgdWludDhfdCBsZXZlbDsKLSAgICAgICAgaW50OF90IHNoYXJwbmVzczsKLSAgICB9IGZpbHRlcjsKLSAgICBzdHJ1Y3QgewotICAgICAgICB1aW50OF90IGVuYWJsZWQ7Ci0gICAgICAgIHVpbnQ4X3QgdXBkYXRlZDsKLSAgICAgICAgaW50OF90IG1vZGVbMl07Ci0gICAgICAgIGludDhfdCByZWZbNF07Ci0gICAgfSBsZl9kZWx0YTsKLSAgICB1aW50OF90IHlhY19xaTsKLSAgICBpbnQ4X3QgeWRjX3FkZWx0YSwgdXZkY19xZGVsdGEsIHV2YWNfcWRlbHRhOwotICAgIHVpbnQ4X3QgbG9zc2xlc3M7Ci0jZGVmaW5lIE1BWF9TRUdNRU5UIDgKLSAgICBzdHJ1Y3QgewotICAgICAgICB1aW50OF90IGVuYWJsZWQ7Ci0gICAgICAgIHVpbnQ4X3QgdGVtcG9yYWw7Ci0gICAgICAgIHVpbnQ4X3QgYWJzb2x1dGVfdmFsczsKLSAgICAgICAgdWludDhfdCB1cGRhdGVfbWFwOwotICAgICAgICB1aW50OF90IHByb2JbN107Ci0gICAgICAgIHVpbnQ4X3QgcHJlZF9wcm9iWzNdOwotICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgdWludDhfdCBxX2VuYWJsZWQ7Ci0gICAgICAgICAgICB1aW50OF90IGxmX2VuYWJsZWQ7Ci0gICAgICAgICAgICB1aW50OF90IHJlZl9lbmFibGVkOwotICAgICAgICAgICAgdWludDhfdCBza2lwX2VuYWJsZWQ7Ci0gICAgICAgICAgICB1aW50OF90IHJlZl92YWw7Ci0gICAgICAgICAgICBpbnQxNl90IHFfdmFsOwotICAgICAgICAgICAgaW50OF90IGxmX3ZhbDsKLSAgICAgICAgICAgIGludDE2X3QgcW11bFsyXVsyXTsKLSAgICAgICAgICAgIHVpbnQ4X3QgbGZsdmxbNF1bMl07Ci0gICAgICAgIH0gZmVhdFtNQVhfU0VHTUVOVF07Ci0gICAgfSBzZWdtZW50YXRpb247Ci0gICAgZW51bSBUeGZtTW9kZSB0eGZtbW9kZTsKLSAgICBlbnVtIENvbXBQcmVkTW9kZSBjb21wcHJlZG1vZGU7Ci0gICAgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgbG9nMl90aWxlX2NvbHMsIGxvZzJfdGlsZV9yb3dzOwotICAgICAgICB1bnNpZ25lZCB0aWxlX2NvbHMsIHRpbGVfcm93czsKLSAgICB9IHRpbGluZzsKLQotICAgIGludCB1bmNvbXByZXNzZWRfaGVhZGVyX3NpemU7Ci0gICAgaW50IGNvbXByZXNzZWRfaGVhZGVyX3NpemU7Ci19IFZQOUJpdHN0cmVhbUhlYWRlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgVlA5U2hhcmVkQ29udGV4dCB7Ci0gICAgVlA5Qml0c3RyZWFtSGVhZGVyIGg7Ci0KLSAgICBUaHJlYWRGcmFtZSByZWZzWzhdOwotI2RlZmluZSBDVVJfRlJBTUUgMAotI2RlZmluZSBSRUZfRlJBTUVfTVZQQUlSIDEKLSNkZWZpbmUgUkVGX0ZSQU1FX1NFR01BUCAyCi0gICAgVlA5RnJhbWUgZnJhbWVzWzNdOwotfSBWUDlTaGFyZWRDb250ZXh0OwotCiAjZW5kaWYgLyogQVZDT0RFQ19WUDlfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlfbWNfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMvdnA5X21jX3RlbXBsYXRlLmMKaW5kZXggMzhkOWE2ZC4uMzFlNjkyZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDlfbWNfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL3ZwOV9tY190ZW1wbGF0ZS5jCkBAIC0yNywxOSArMjcsMTkgQEAKICAgICAoVlA1Nm12KSB7IC54ID0gUk9VTkRFRF9ESVYoYS54ICsgYi54ICsgYy54ICsgZC54LCA0KSwgXAogICAgICAgICAgICAgICAgLnkgPSBST1VOREVEX0RJVihhLnkgKyBiLnkgKyBjLnkgKyBkLnksIDQpIH0KIAotc3RhdGljIHZvaWQgRk4oaW50ZXJfcHJlZCkoQVZDb2RlY0NvbnRleHQgKmN0eCkKK3N0YXRpYyB2b2lkIEZOKGludGVyX3ByZWQpKFZQOVRpbGVEYXRhICp0ZCkKIHsKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBid2xvZ190YWJbMl1bTl9CU19TSVpFU10gPSB7CiAgICAgICAgIHsgMCwgMCwgMSwgMSwgMSwgMiwgMiwgMiwgMywgMywgMywgNCwgNCB9LAogICAgICAgICB7IDEsIDEsIDIsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQgfSwKICAgICB9OwotICAgIFZQOUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKLSAgICBWUDlCbG9jayAqYiA9IHMtPmI7Ci0gICAgaW50IHJvdyA9IHMtPnJvdywgY29sID0gcy0+Y29sOworICAgIFZQOUNvbnRleHQgKnMgPSB0ZC0+czsKKyAgICBWUDlCbG9jayAqYiA9IHRkLT5iOworICAgIGludCByb3cgPSB0ZC0+cm93LCBjb2wgPSB0ZC0+Y29sOwogICAgIFRocmVhZEZyYW1lICp0cmVmMSA9ICZzLT5zLnJlZnNbcy0+cy5oLnJlZmlkeFtiLT5yZWZbMF1dXSwgKnRyZWYyOwogICAgIEFWRnJhbWUgKnJlZjEgPSB0cmVmMS0+ZiwgKnJlZjI7CiAgICAgaW50IHcxID0gcmVmMS0+d2lkdGgsIGgxID0gcmVmMS0+aGVpZ2h0LCB3MiwgaDI7Ci0gICAgcHRyZGlmZl90IGxzX3kgPSBzLT55X3N0cmlkZSwgbHNfdXYgPSBzLT51dl9zdHJpZGU7CisgICAgcHRyZGlmZl90IGxzX3kgPSB0ZC0+eV9zdHJpZGUsIGxzX3V2ID0gdGQtPnV2X3N0cmlkZTsKICAgICBpbnQgYnl0ZXNwZXJwaXhlbCA9IEJZVEVTX1BFUl9QSVhFTDsKIAogICAgIGlmIChiLT5jb21wKSB7CkBAIC01NSwyNiArNTUsMjYgQEAKIAogI2lmIFNDQUxFRCA9PSAwCiAgICAgICAgIGlmIChiLT5icyA9PSBCU184eDQpIHsKLSAgICAgICAgICAgIG1jX2x1bWFfZGlyKHMsIG1jWzNdW2ItPmZpbHRlcl1bMF0sIHMtPmRzdFswXSwgbHNfeSwKKyAgICAgICAgICAgIG1jX2x1bWFfZGlyKHRkLCBtY1szXVtiLT5maWx0ZXJdWzBdLCB0ZC0+ZHN0WzBdLCBsc195LAogICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVswXSwgcmVmMS0+bGluZXNpemVbMF0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIGNvbCA8PCAzLCAmYi0+bXZbMF1bMF0sLCwsLCA4LCA0LCB3MSwgaDEsIDApOwotICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbM11bYi0+ZmlsdGVyXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFswXSArIDQgKiBsc195LCBsc195LAorICAgICAgICAgICAgbWNfbHVtYV9kaXIodGQsIG1jWzNdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzBdICsgNCAqIGxzX3ksIGxzX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzBdLCByZWYxLT5saW5lc2l6ZVswXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAocm93IDw8IDMpICsgNCwgY29sIDw8IDMsICZiLT5tdlsyXVswXSwsLCwsIDgsIDQsIHcxLCBoMSwgMCk7CiAgICAgICAgICAgICB3MSA9ICh3MSArIHMtPnNzX2gpID4+IHMtPnNzX2g7CiAgICAgICAgICAgICBpZiAocy0+c3NfdikgewogICAgICAgICAgICAgICAgIGgxID0gKGgxICsgMSkgPj4gMTsKICAgICAgICAgICAgICAgICB1dm12ID0gUk9VTkRFRF9ESVZfTVZ4MihiLT5tdlswXVswXSwgYi0+bXZbMl1bMF0pOwotICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdLCB0ZC0+ZHN0WzJdLCBsc191diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMV0sIHJlZjEtPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDIsIGNvbCA8PCAoMyAtIHMtPnNzX2gpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV2bXYsLCwsLCA4ID4+IHMtPnNzX2gsIDQsIHcxLCBoMSwgMCk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdLCB0ZC0+ZHN0WzJdLCBsc191diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMV0sIHJlZjEtPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIGNvbCA8PCAoMyAtIHMtPnNzX2gpLApAQCAtODcsOCArODcsOCBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHV2bXYgPSBST1VOREVEX0RJVl9NVngyKGItPm12WzBdWzBdLCBiLT5tdlsyXVswXSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0gKyA0ICogbHNfdXYsIHMtPmRzdFsyXSArIDQgKiBsc191diwgbHNfdXYsCisgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdICsgNCAqIGxzX3V2LCB0ZC0+ZHN0WzJdICsgNCAqIGxzX3V2LCBsc191diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMV0sIHJlZjEtPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvdyA8PCAzKSArIDQsIGNvbCA8PCAoMyAtIHMtPnNzX2gpLApAQCAtOTYsMjYgKzk2LDI2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChiLT5jb21wKSB7Ci0gICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbM11bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgICAgIG1jX2x1bWFfZGlyKHRkLCBtY1szXVtiLT5maWx0ZXJdWzFdLCB0ZC0+ZHN0WzBdLCBsc195LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMF0sIHJlZjItPmxpbmVzaXplWzBdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgY29sIDw8IDMsICZiLT5tdlswXVsxXSwsLCwsIDgsIDQsIHcyLCBoMiwgMSk7Ci0gICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbM11bYi0+ZmlsdGVyXVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMF0gKyA0ICogbHNfeSwgbHNfeSwKKyAgICAgICAgICAgICAgICBtY19sdW1hX2Rpcih0ZCwgbWNbM11bYi0+ZmlsdGVyXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzBdICsgNCAqIGxzX3ksIGxzX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVswXSwgcmVmMi0+bGluZXNpemVbMF0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCBjb2wgPDwgMywgJmItPm12WzJdWzFdLCwsLCwgOCwgNCwgdzIsIGgyLCAxKTsKICAgICAgICAgICAgICAgICB3MiA9ICh3MiArIHMtPnNzX2gpID4+IHMtPnNzX2g7CiAgICAgICAgICAgICAgICAgaWYgKHMtPnNzX3YpIHsKICAgICAgICAgICAgICAgICAgICAgaDIgPSAoaDIgKyAxKSA+PiAxOwogICAgICAgICAgICAgICAgICAgICB1dm12ID0gUk9VTkRFRF9ESVZfTVZ4MihiLT5tdlswXVsxXSwgYi0+bXZbMl1bMV0pOwotICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzMgKyBzLT5zc19oXVtiLT5maWx0ZXJdWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSwgcy0+ZHN0WzJdLCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsxXSwgcmVmMi0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsyXSwgcmVmMi0+bGluZXNpemVbMl0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAyLCBjb2wgPDwgKDMgLSBzLT5zc19oKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXZtdiwsLCwsIDggPj4gcy0+c3NfaCwgNCwgdzIsIGgyLCAxKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzMgKyBzLT5zc19oXVtiLT5maWx0ZXJdWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSwgcy0+ZHN0WzJdLCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsxXSwgcmVmMi0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsyXSwgcmVmMi0+bGluZXNpemVbMl0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCBjb2wgPDwgKDMgLSBzLT5zc19oKSwKQEAgLTEyOCw4ICsxMjgsOCBAQAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgdXZtdiA9IFJPVU5ERURfRElWX01WeDIoYi0+bXZbMF1bMV0sIGItPm12WzJdWzFdKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzMgKyBzLT5zc19oXVtiLT5maWx0ZXJdWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSArIDQgKiBsc191diwgcy0+ZHN0WzJdICsgNCAqIGxzX3V2LCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbMyArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSArIDQgKiBsc191diwgdGQtPmRzdFsyXSArIDQgKiBsc191diwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsxXSwgcmVmMi0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsyXSwgcmVmMi0+bGluZXNpemVbMl0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCBjb2wgPDwgKDMgLSBzLT5zc19oKSwKQEAgLTEzNywzMiArMTM3LDMyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGItPmJzID09IEJTXzR4OCkgewotICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVswXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgbWNfbHVtYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMF0sIHRkLT5kc3RbMF0sIGxzX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzBdLCByZWYxLT5saW5lc2l6ZVswXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgY29sIDw8IDMsICZiLT5tdlswXVswXSwsLCwsIDQsIDgsIHcxLCBoMSwgMCk7Ci0gICAgICAgICAgICBtY19sdW1hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzBdLCBzLT5kc3RbMF0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfeSwKKyAgICAgICAgICAgIG1jX2x1bWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzBdLCB0ZC0+ZHN0WzBdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzBdLCByZWYxLT5saW5lc2l6ZVswXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgKGNvbCA8PCAzKSArIDQsICZiLT5tdlsxXVswXSwsLCwsIDQsIDgsIHcxLCBoMSwgMCk7CiAgICAgICAgICAgICBoMSA9IChoMSArIHMtPnNzX3YpID4+IHMtPnNzX3Y7CiAgICAgICAgICAgICBpZiAocy0+c3NfaCkgewogICAgICAgICAgICAgICAgIHcxID0gKHcxICsgMSkgPj4gMTsKICAgICAgICAgICAgICAgICB1dm12ID0gUk9VTkRFRF9ESVZfTVZ4MihiLT5tdlswXVswXSwgYi0+bXZbMV1bMF0pOwotICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSwgcy0+ZHN0WzJdLCBsc191diwKKyAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzFdLCByZWYxLT5saW5lc2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMl0sIHJlZjEtPmxpbmVzaXplWzJdLCB0cmVmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAoMyAtIHMtPnNzX3YpLCBjb2wgPDwgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dm12LCwsLCwgNCwgOCA+PiBzLT5zc192LCB3MSwgaDEsIDApOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbNF1bYi0+ZmlsdGVyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0sIHRkLT5kc3RbMl0sIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsxXSwgcmVmMS0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzJdLCByZWYxLT5saW5lc2l6ZVsyXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgKDMgLSBzLT5zc192KSwgY29sIDw8IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYi0+bXZbMF1bMF0sLCwsLCA0LCA4ID4+IHMtPnNzX3YsIHcxLCBoMSwgMCk7Ci0gICAgICAgICAgICAgICAgbWNfY2hyb21hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzFdICsgNCAqIGJ5dGVzcGVycGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMl0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCisgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbNF1bYi0+ZmlsdGVyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0gKyA0ICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMl0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzFdLCByZWYxLT5saW5lc2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMl0sIHJlZjEtPmxpbmVzaXplWzJdLCB0cmVmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAoMyAtIHMtPnNzX3YpLCAoY29sIDw8IDMpICsgNCwKQEAgLTE3MCwzMiArMTcwLDMyIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChiLT5jb21wKSB7Ci0gICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgICAgIG1jX2x1bWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLCB0ZC0+ZHN0WzBdLCBsc195LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMF0sIHJlZjItPmxpbmVzaXplWzBdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgY29sIDw8IDMsICZiLT5tdlswXVsxXSwsLCwsIDQsIDgsIHcyLCBoMiwgMSk7Ci0gICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3ksCisgICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMV0sIHRkLT5kc3RbMF0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzBdLCByZWYyLT5saW5lc2l6ZVswXSwgdHJlZjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIChjb2wgPDwgMykgKyA0LCAmYi0+bXZbMV1bMV0sLCwsLCA0LCA4LCB3MiwgaDIsIDEpOwogICAgICAgICAgICAgICAgIGgyID0gKGgyICsgcy0+c3NfdikgPj4gcy0+c3NfdjsKICAgICAgICAgICAgICAgICBpZiAocy0+c3NfaCkgewogICAgICAgICAgICAgICAgICAgICB3MiA9ICh3MiArIDEpID4+IDE7CiAgICAgICAgICAgICAgICAgICAgIHV2bXYgPSBST1VOREVEX0RJVl9NVngyKGItPm12WzBdWzFdLCBiLT5tdlsxXVsxXSk7Ci0gICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsxXSwgcmVmMi0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsyXSwgcmVmMi0+bGluZXNpemVbMl0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAoMyAtIHMtPnNzX3YpLCBjb2wgPDwgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXZtdiwsLCwsIDQsIDggPj4gcy0+c3NfdiwgdzIsIGgyLCAxKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzFdLCBzLT5kc3RbMl0sIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0sIHRkLT5kc3RbMl0sIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMV0sIHJlZjItPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMl0sIHJlZjItPmxpbmVzaXplWzJdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgKDMgLSBzLT5zc192KSwgY29sIDw8IDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmItPm12WzBdWzFdLCwsLCwgNCwgOCA+PiBzLT5zc192LCB3MiwgaDIsIDEpOwotICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzFdICsgNCAqIGJ5dGVzcGVycGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzJdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0gKyA0ICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzJdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMV0sIHJlZjItPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMl0sIHJlZjItPmxpbmVzaXplWzJdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgKDMgLSBzLT5zc192KSwgKGNvbCA8PCAzKSArIDQsCkBAIC0yMDUsMjUgKzIwNSwyNyBAQAogICAgICAgICB9IGVsc2UKICNlbmRpZgogICAgICAgICB7CisjaWYgU0NBTEVEID09IDAKICAgICAgICAgICAgIGF2X2Fzc2VydDIoYi0+YnMgPT0gQlNfNHg0KTsKKyNlbmRpZgogCiAgICAgICAgICAgICAvLyBGSVhNRSBpZiB0d28gaG9yaXpvbnRhbGx5IGFkamFjZW50IGJsb2NrcyBoYXZlIHRoZSBzYW1lIE1WLAogICAgICAgICAgICAgLy8gZG8gYSB3OCBpbnN0ZWFkIG9mIGEgdzQgY2FsbAotICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVswXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgbWNfbHVtYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMF0sIHRkLT5kc3RbMF0sIGxzX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzBdLCByZWYxLT5saW5lc2l6ZVswXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgY29sIDw8IDMsICZiLT5tdlswXVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDgsIDgsIDQsIDQsIHcxLCBoMSwgMCk7Ci0gICAgICAgICAgICBtY19sdW1hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzBdLCBzLT5kc3RbMF0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfeSwKKyAgICAgICAgICAgIG1jX2x1bWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzBdLCB0ZC0+ZHN0WzBdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzBdLCByZWYxLT5saW5lc2l6ZVswXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgKGNvbCA8PCAzKSArIDQsICZiLT5tdlsxXVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsIDgsIDgsIDQsIDQsIHcxLCBoMSwgMCk7Ci0gICAgICAgICAgICBtY19sdW1hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzBdICsgNCAqIGxzX3ksIGxzX3ksCisgICAgICAgICAgICBtY19sdW1hX2Rpcih0ZCwgbWNbNF1bYi0+ZmlsdGVyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMF0gKyA0ICogbHNfeSwgbHNfeSwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMF0sIHJlZjEtPmxpbmVzaXplWzBdLCB0cmVmMSwKICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCBjb2wgPDwgMywgJmItPm12WzJdWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgOCwgNCwgNCwgdzEsIGgxLCAwKTsKLSAgICAgICAgICAgIG1jX2x1bWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMF0gKyA0ICogbHNfeSArIDQgKiBieXRlc3BlcnBpeGVsLCBsc195LAorICAgICAgICAgICAgbWNfbHVtYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzBdICsgNCAqIGxzX3kgKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfeSwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMF0sIHJlZjEtPmxpbmVzaXplWzBdLCB0cmVmMSwKICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCAoY29sIDw8IDMpICsgNCwgJmItPm12WzNdWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgNCwgNCwgOCwgOCwgNCwgNCwgdzEsIGgxLCAwKTsKQEAgLTIzMywyNCArMjM1LDI0IEBACiAgICAgICAgICAgICAgICAgICAgIHcxID0gKHcxICsgMSkgPj4gMTsKICAgICAgICAgICAgICAgICAgICAgdXZtdiA9IFJPVU5ERURfRElWX01WeDQoYi0+bXZbMF1bMF0sIGItPm12WzFdWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT5tdlsyXVswXSwgYi0+bXZbM11bMF0pOwotICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzFdLCBzLT5kc3RbMl0sIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0sIHRkLT5kc3RbMl0sIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMV0sIHJlZjEtPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMl0sIHJlZjEtPmxpbmVzaXplWzJdLCB0cmVmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMiwgY29sIDw8IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV2bXYsIDAsIDAsIDQsIDQsIDQsIDQsIHcxLCBoMSwgMCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdXZtdiA9IFJPVU5ERURfRElWX01WeDIoYi0+bXZbMF1bMF0sIGItPm12WzJdWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSwgcy0+ZHN0WzJdLCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbNF1bYi0+ZmlsdGVyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdLCB0ZC0+ZHN0WzJdLCBsc191diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzFdLCByZWYxLT5saW5lc2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzJdLCByZWYxLT5saW5lc2l6ZVsyXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDIsIGNvbCA8PCAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dm12LCAwLCAwLCA4LCA0LCA0LCA0LCB3MSwgaDEsIDApOwogICAgICAgICAgICAgICAgICAgICB1dm12ID0gUk9VTkRFRF9ESVZfTVZ4MihiLT5tdlsxXVswXSwgYi0+bXZbM11bMF0pOwotICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzFdICsgNCAqIGJ5dGVzcGVycGl4ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzJdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0gKyA0ICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzJdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMV0sIHJlZjEtPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjEtPmRhdGFbMl0sIHJlZjEtPmxpbmVzaXplWzJdLCB0cmVmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMiwgKGNvbCA8PCAzKSArIDQsCkBAIC0yNjAsOCArMjYyLDggQEAKICAgICAgICAgICAgICAgICBpZiAocy0+c3NfaCkgewogICAgICAgICAgICAgICAgICAgICB3MSA9ICh3MSArIDEpID4+IDE7CiAgICAgICAgICAgICAgICAgICAgIHV2bXYgPSBST1VOREVEX0RJVl9NVngyKGItPm12WzBdWzBdLCBiLT5tdlsxXVswXSk7Ci0gICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsxXSwgcmVmMS0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCBjb2wgPDwgMiwKQEAgLTI3MCwzNSArMjcyLDM1IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIGJvdHRvbSBibG9jawogICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3dlYm0vaXNzdWVzL2RldGFpbD9pZD05OTMKICAgICAgICAgICAgICAgICAgICAgdXZtdiA9IFJPVU5ERURfRElWX01WeDIoYi0+bXZbMV1bMF0sIGItPm12WzJdWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSArIDQgKiBsc191diwgcy0+ZHN0WzJdICsgNCAqIGxzX3V2LCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbNF1bYi0+ZmlsdGVyXVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdICsgNCAqIGxzX3V2LCB0ZC0+ZHN0WzJdICsgNCAqIGxzX3V2LCBsc191diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzFdLCByZWYxLT5saW5lc2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzJdLCByZWYxLT5saW5lc2l6ZVsyXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvdyA8PCAzKSArIDQsIGNvbCA8PCAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dm12LCAwLCA0LCA0LCA4LCA0LCA0LCB3MSwgaDEsIDApOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsxXSwgcmVmMS0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCBjb2wgPDwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYi0+bXZbMF1bMF0sIDAsIDAsIDgsIDgsIDQsIDQsIHcxLCBoMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0gKyA0ICogYnl0ZXNwZXJwaXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMl0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSArIDQgKiBieXRlc3BlcnBpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMl0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsxXSwgcmVmMS0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCAoY29sIDw8IDMpICsgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYi0+bXZbMV1bMF0sIDQsIDAsIDgsIDgsIDQsIDQsIHcxLCBoMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0gKyA0ICogbHNfdXYsIHMtPmRzdFsyXSArIDQgKiBsc191diwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSArIDQgKiBsc191diwgdGQtPmRzdFsyXSArIDQgKiBsc191diwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsxXSwgcmVmMS0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCBjb2wgPDwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYi0+bXZbMl1bMF0sIDAsIDQsIDgsIDgsIDQsIDQsIHcxLCBoMSwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0gKyA0ICogbHNfdXYgKyA0ICogYnl0ZXNwZXJwaXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMl0gKyA0ICogbHNfdXYgKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSArIDQgKiBsc191diArIDQgKiBieXRlc3BlcnBpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMl0gKyA0ICogbHNfdXYgKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsxXSwgcmVmMS0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCAoY29sIDw8IDMpICsgNCwKQEAgLTMwNywxOCArMzA5LDE4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChiLT5jb21wKSB7Ci0gICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgICAgIG1jX2x1bWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLCB0ZC0+ZHN0WzBdLCBsc195LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMF0sIHJlZjItPmxpbmVzaXplWzBdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgY29sIDw8IDMsICZiLT5tdlswXVsxXSwgMCwgMCwgOCwgOCwgNCwgNCwgdzIsIGgyLCAxKTsKLSAgICAgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzFdLCBzLT5kc3RbMF0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfeSwKKyAgICAgICAgICAgICAgICBtY19sdW1hX2Rpcih0ZCwgbWNbNF1bYi0+ZmlsdGVyXVsxXSwgdGQtPmRzdFswXSArIDQgKiBieXRlc3BlcnBpeGVsLCBsc195LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMF0sIHJlZjItPmxpbmVzaXplWzBdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgKGNvbCA8PCAzKSArIDQsICZiLT5tdlsxXVsxXSwgNCwgMCwgOCwgOCwgNCwgNCwgdzIsIGgyLCAxKTsKLSAgICAgICAgICAgICAgICBtY19sdW1hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFswXSArIDQgKiBsc195LCBsc195LAorICAgICAgICAgICAgICAgIG1jX2x1bWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMF0gKyA0ICogbHNfeSwgbHNfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzBdLCByZWYyLT5saW5lc2l6ZVswXSwgdHJlZjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvdyA8PCAzKSArIDQsIGNvbCA8PCAzLCAmYi0+bXZbMl1bMV0sIDAsIDQsIDgsIDgsIDQsIDQsIHcyLCBoMiwgMSk7Ci0gICAgICAgICAgICAgICAgbWNfbHVtYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMF0gKyA0ICogbHNfeSArIDQgKiBieXRlc3BlcnBpeGVsLCBsc195LAorICAgICAgICAgICAgICAgIG1jX2x1bWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMF0gKyA0ICogbHNfeSArIDQgKiBieXRlc3BlcnBpeGVsLCBsc195LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMF0sIHJlZjItPmxpbmVzaXplWzBdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm93IDw8IDMpICsgNCwgKGNvbCA8PCAzKSArIDQsICZiLT5tdlszXVsxXSwgNCwgNCwgOCwgOCwgNCwgNCwgdzIsIGgyLCAxKTsKICAgICAgICAgICAgICAgICBpZiAocy0+c3NfdikgewpAQCAtMzI3LDI0ICszMjksMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHcyID0gKHcyICsgMSkgPj4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgIHV2bXYgPSBST1VOREVEX0RJVl9NVng0KGItPm12WzBdWzFdLCBiLT5tdlsxXVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGItPm12WzJdWzFdLCBiLT5tdlszXVsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSwgcy0+ZHN0WzJdLCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0sIHRkLT5kc3RbMl0sIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzFdLCByZWYyLT5saW5lc2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsyXSwgcmVmMi0+bGluZXNpemVbMl0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMiwgY29sIDw8IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dm12LCAwLCAwLCA0LCA0LCA0LCA0LCB3MiwgaDIsIDEpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgdXZtdiA9IFJPVU5ERURfRElWX01WeDIoYi0+bXZbMF1bMV0sIGItPm12WzJdWzFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbNF1bYi0+ZmlsdGVyXVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzFdLCBzLT5kc3RbMl0sIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbNF1bYi0+ZmlsdGVyXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMV0sIHJlZjItPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzJdLCByZWYyLT5saW5lc2l6ZVsyXSwgdHJlZjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAyLCBjb2wgPDwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV2bXYsIDAsIDAsIDgsIDQsIDQsIDQsIHcyLCBoMiwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB1dm12ID0gUk9VTkRFRF9ESVZfTVZ4MihiLT5tdlsxXVsxXSwgYi0+bXZbM11bMV0pOwotICAgICAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0gKyA0ICogYnl0ZXNwZXJwaXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzJdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3V2LAorICAgICAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbNF1bYi0+ZmlsdGVyXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSArIDQgKiBieXRlc3BlcnBpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzJdICsgNCAqIGJ5dGVzcGVycGl4ZWwsIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzFdLCByZWYyLT5saW5lc2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsyXSwgcmVmMi0+bGluZXNpemVbMl0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMiwgKGNvbCA8PCAzKSArIDQsCkBAIC0zNTQsOCArMzU2LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnNzX2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHcyID0gKHcyICsgMSkgPj4gMTsKICAgICAgICAgICAgICAgICAgICAgICAgIHV2bXYgPSBST1VOREVEX0RJVl9NVngyKGItPm12WzBdWzFdLCBiLT5tdlsxXVsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSwgcy0+ZHN0WzJdLCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0sIHRkLT5kc3RbMl0sIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzFdLCByZWYyLT5saW5lc2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsyXSwgcmVmMi0+bGluZXNpemVbMl0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3cgPDwgMywgY29sIDw8IDIsCkBAIC0zNjQsMzUgKzM2NiwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gYm90dG9tIGJsb2NrCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3dlYm0vaXNzdWVzL2RldGFpbD9pZD05OTMKICAgICAgICAgICAgICAgICAgICAgICAgIHV2bXYgPSBST1VOREVEX0RJVl9NVngyKGItPm12WzFdWzFdLCBiLT5tdlsyXVsxXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSArIDQgKiBsc191diwgcy0+ZHN0WzJdICsgNCAqIGxzX3V2LCBsc191diwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMV0gKyA0ICogbHNfdXYsIHRkLT5kc3RbMl0gKyA0ICogbHNfdXYsIGxzX3V2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzFdLCByZWYyLT5saW5lc2l6ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsyXSwgcmVmMi0+bGluZXNpemVbMl0sIHRyZWYyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocm93IDw8IDMpICsgNCwgY29sIDw8IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dm12LCAwLCA0LCA0LCA4LCA0LCA0LCB3MiwgaDIsIDEpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdLCB0ZC0+ZHN0WzJdLCBsc191diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsxXSwgcmVmMi0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMl0sIHJlZjItPmxpbmVzaXplWzJdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDw8IDMsIGNvbCA8PCAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYi0+bXZbMF1bMV0sIDAsIDAsIDgsIDgsIDQsIDQsIHcyLCBoMiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSArIDQgKiBieXRlc3BlcnBpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMl0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdICsgNCAqIGJ5dGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMl0gKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMV0sIHJlZjItPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzJdLCByZWYyLT5saW5lc2l6ZVsyXSwgdHJlZjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCAoY29sIDw8IDMpICsgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmItPm12WzFdWzFdLCA0LCAwLCA4LCA4LCA0LCA0LCB3MiwgaDIsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWNfY2hyb21hX2RpcihzLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0gKyA0ICogbHNfdXYsIHMtPmRzdFsyXSArIDQgKiBsc191diwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdICsgNCAqIGxzX3V2LCB0ZC0+ZHN0WzJdICsgNCAqIGxzX3V2LCBsc191diwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmMi0+ZGF0YVsxXSwgcmVmMi0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMl0sIHJlZjItPmxpbmVzaXplWzJdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJvdyA8PCAzKSArIDQsIGNvbCA8PCAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYi0+bXZbMl1bMV0sIDAsIDQsIDgsIDgsIDQsIDQsIHcyLCBoMiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHMsIG1jWzRdW2ItPmZpbHRlcl1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzdFsxXSArIDQgKiBsc191diArIDQgKiBieXRlc3BlcnBpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMl0gKyA0ICogbHNfdXYgKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICBtY19jaHJvbWFfZGlyKHRkLCBtY1s0XVtiLT5maWx0ZXJdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+ZHN0WzFdICsgNCAqIGxzX3V2ICsgNCAqIGJ5dGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3RbMl0gKyA0ICogbHNfdXYgKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMV0sIHJlZjItPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzJdLCByZWYyLT5saW5lc2l6ZVsyXSwgdHJlZjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyb3cgPDwgMykgKyA0LCAoY29sIDw8IDMpICsgNCwKQEAgLTQwMywyOSArNDA1LDMxIEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpbnQgYndsID0gYndsb2dfdGFiWzBdW2ItPmJzXTsKLSAgICAgICAgaW50IGJ3ID0gYndoX3RhYlswXVtiLT5ic11bMF0gKiA0LCBiaCA9IGJ3aF90YWJbMF1bYi0+YnNdWzFdICogNDsKLSAgICAgICAgaW50IHV2YncgPSBid2hfdGFiW3MtPnNzX2hdW2ItPmJzXVswXSAqIDQsIHV2YmggPSBid2hfdGFiW3MtPnNzX3ZdW2ItPmJzXVsxXSAqIDQ7CisgICAgICAgIGludCBidyA9IGZmX3ZwOV9id2hfdGFiWzBdW2ItPmJzXVswXSAqIDQ7CisgICAgICAgIGludCBiaCA9IGZmX3ZwOV9id2hfdGFiWzBdW2ItPmJzXVsxXSAqIDQ7CisgICAgICAgIGludCB1dmJ3ID0gZmZfdnA5X2J3aF90YWJbcy0+c3NfaF1bYi0+YnNdWzBdICogNDsKKyAgICAgICAgaW50IHV2YmggPSBmZl92cDlfYndoX3RhYltzLT5zc192XVtiLT5ic11bMV0gKiA0OwogCi0gICAgICAgIG1jX2x1bWFfZGlyKHMsIG1jW2J3bF1bYi0+ZmlsdGVyXVswXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICBtY19sdW1hX2Rpcih0ZCwgbWNbYndsXVtiLT5maWx0ZXJdWzBdLCB0ZC0+ZHN0WzBdLCBsc195LAogICAgICAgICAgICAgICAgICAgICByZWYxLT5kYXRhWzBdLCByZWYxLT5saW5lc2l6ZVswXSwgdHJlZjEsCiAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCBjb2wgPDwgMywgJmItPm12WzBdWzBdLCAwLCAwLCBidywgYmgsIGJ3LCBiaCwgdzEsIGgxLCAwKTsKICAgICAgICAgdzEgPSAodzEgKyBzLT5zc19oKSA+PiBzLT5zc19oOwogICAgICAgICBoMSA9IChoMSArIHMtPnNzX3YpID4+IHMtPnNzX3Y7Ci0gICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbYndsICsgcy0+c3NfaF1bYi0+ZmlsdGVyXVswXSwKLSAgICAgICAgICAgICAgICAgICAgICBzLT5kc3RbMV0sIHMtPmRzdFsyXSwgbHNfdXYsCisgICAgICAgIG1jX2Nocm9tYV9kaXIodGQsIG1jW2J3bCArIHMtPnNzX2hdW2ItPmZpbHRlcl1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsxXSwgcmVmMS0+bGluZXNpemVbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgcmVmMS0+ZGF0YVsyXSwgcmVmMS0+bGluZXNpemVbMl0sIHRyZWYxLAogICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAoMyAtIHMtPnNzX3YpLCBjb2wgPDwgKDMgLSBzLT5zc19oKSwKICAgICAgICAgICAgICAgICAgICAgICAmYi0+bXZbMF1bMF0sIDAsIDAsIHV2YncsIHV2YmgsIHV2YncsIHV2YmgsIHcxLCBoMSwgMCk7CiAKICAgICAgICAgaWYgKGItPmNvbXApIHsKLSAgICAgICAgICAgIG1jX2x1bWFfZGlyKHMsIG1jW2J3bF1bYi0+ZmlsdGVyXVsxXSwgcy0+ZHN0WzBdLCBsc195LAorICAgICAgICAgICAgbWNfbHVtYV9kaXIodGQsIG1jW2J3bF1bYi0+ZmlsdGVyXVsxXSwgdGQtPmRzdFswXSwgbHNfeSwKICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMF0sIHJlZjItPmxpbmVzaXplWzBdLCB0cmVmMiwKICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAzLCBjb2wgPDwgMywgJmItPm12WzBdWzFdLCAwLCAwLCBidywgYmgsIGJ3LCBiaCwgdzIsIGgyLCAxKTsKICAgICAgICAgICAgIHcyID0gKHcyICsgcy0+c3NfaCkgPj4gcy0+c3NfaDsKICAgICAgICAgICAgIGgyID0gKGgyICsgcy0+c3NfdikgPj4gcy0+c3NfdjsKLSAgICAgICAgICAgIG1jX2Nocm9tYV9kaXIocywgbWNbYndsICsgcy0+c3NfaF1bYi0+ZmlsdGVyXVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHN0WzFdLCBzLT5kc3RbMl0sIGxzX3V2LAorICAgICAgICAgICAgbWNfY2hyb21hX2Rpcih0ZCwgbWNbYndsICsgcy0+c3NfaF1bYi0+ZmlsdGVyXVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmRzdFsxXSwgdGQtPmRzdFsyXSwgbHNfdXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZjItPmRhdGFbMV0sIHJlZjItPmxpbmVzaXplWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICByZWYyLT5kYXRhWzJdLCByZWYyLT5saW5lc2l6ZVsyXSwgdHJlZjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyA8PCAoMyAtIHMtPnNzX3YpLCBjb2wgPDwgKDMgLSBzLT5zc19oKSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA5X3BhcnNlci5jIGIvbGliYXZjb2RlYy92cDlfcGFyc2VyLmMKaW5kZXggMmU5MjM1ZS4uOTUzMWYzNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDlfcGFyc2VyLmMKKysrIGIvbGliYXZjb2RlYy92cDlfcGFyc2VyLmMKQEAgLTI1LDIwICsyNSwxOSBAQAogI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJwYXJzZXIuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgVlA5UGFyc2VDb250ZXh0IHsKLSAgICBpbnQgbl9mcmFtZXM7IC8vIDEtOAotICAgIGludCBzaXplWzhdOwotICAgIGludDY0X3QgcHRzOwotfSBWUDlQYXJzZUNvbnRleHQ7Ci0KLXN0YXRpYyBpbnQgcGFyc2VfZnJhbWUoQVZDb2RlY1BhcnNlckNvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3N0YXRpYyBpbnQgcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqb3V0X2RhdGEsIGludCAqb3V0X3NpemUsCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQogewotICAgIFZQOVBhcnNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOwogICAgIEdldEJpdENvbnRleHQgZ2I7Ci0gICAgaW50IHJlcywgcHJvZmlsZSwga2V5ZnJhbWUsIGludmlzaWJsZTsKKyAgICBpbnQgcmVzLCBwcm9maWxlLCBrZXlmcmFtZTsKIAotICAgIGlmICgocmVzID0gaW5pdF9nZXRfYml0czgoJmdiLCBidWYsIHNpemUpKSA8IDApCi0gICAgICAgIHJldHVybiByZXM7CisgICAgKm91dF9kYXRhID0gZGF0YTsKKyAgICAqb3V0X3NpemUgPSBzaXplOworCisgICAgaWYgKChyZXMgPSBpbml0X2dldF9iaXRzOCgmZ2IsIGRhdGEsIHNpemUpKSA8IDApCisgICAgICAgIHJldHVybiBzaXplOyAvLyBwYXJzZXJzIGNhbid0IHJldHVybiBlcnJvcnMKICAgICBnZXRfYml0cygmZ2IsIDIpOyAvLyBmcmFtZSBtYXJrZXIKICAgICBwcm9maWxlICA9IGdldF9iaXRzMSgmZ2IpOwogICAgIHByb2ZpbGUgfD0gZ2V0X2JpdHMxKCZnYikgPDwgMTsKQEAgLTQ2LDEwICs0NSw4IEBACiAKICAgICBpZiAoZ2V0X2JpdHMxKCZnYikpIHsKICAgICAgICAga2V5ZnJhbWUgPSAwOwotICAgICAgICBpbnZpc2libGUgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGtleWZyYW1lICA9ICFnZXRfYml0czEoJmdiKTsKLSAgICAgICAgaW52aXNpYmxlID0gIWdldF9iaXRzMSgmZ2IpOwogICAgIH0KIAogICAgIGlmICgha2V5ZnJhbWUpIHsKQEAgLTYwLDk3ICs1NywxMCBAQAogICAgICAgICBjdHgtPmtleV9mcmFtZSA9IDE7CiAgICAgfQogCi0gICAgaWYgKCFpbnZpc2libGUpIHsKLSAgICAgICAgaWYgKGN0eC0+cHRzID09IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICAgICAgY3R4LT5wdHMgPSBzLT5wdHM7Ci0gICAgICAgIHMtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoY3R4LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgcy0+cHRzID0gY3R4LT5wdHM7Ci0gICAgICAgIGN0eC0+cHRzID0gQVZfTk9QVFNfVkFMVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcGFyc2UoQVZDb2RlY1BhcnNlckNvbnRleHQgKmN0eCwKLSAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAotICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqb3V0X2RhdGEsIGludCAqb3V0X3NpemUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQotewotICAgIFZQOVBhcnNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOwotICAgIGludCBmdWxsX3NpemUgPSBzaXplOwotICAgIGludCBtYXJrZXI7Ci0KLSAgICBpZiAoc2l6ZSA8PSAwKSB7Ci0gICAgICAgICpvdXRfc2l6ZSA9IDA7Ci0gICAgICAgICpvdXRfZGF0YSA9IGRhdGE7Ci0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKHMtPm5fZnJhbWVzID4gMCkgewotICAgICAgICAqb3V0X2RhdGEgPSBkYXRhOwotICAgICAgICAqb3V0X3NpemUgPSBzLT5zaXplWy0tcy0+bl9mcmFtZXNdOwotICAgICAgICBwYXJzZV9mcmFtZShjdHgsICpvdXRfZGF0YSwgKm91dF9zaXplKTsKLQotICAgICAgICByZXR1cm4gcy0+bl9mcmFtZXMgPiAwID8gKm91dF9zaXplIDogc2l6ZSAvKiBpLmUuIGluY2x1ZGUgaWR4IHRhaWwgKi87Ci0gICAgfQotCi0gICAgbWFya2VyID0gZGF0YVtzaXplIC0gMV07Ci0gICAgaWYgKChtYXJrZXIgJiAweGUwKSA9PSAweGMwKSB7Ci0gICAgICAgIGludCBuYnl0ZXMgPSAxICsgKChtYXJrZXIgPj4gMykgJiAweDMpOwotICAgICAgICBpbnQgbl9mcmFtZXMgPSAxICsgKG1hcmtlciAmIDB4NyksIGlkeF9zeiA9IDIgKyBuX2ZyYW1lcyAqIG5ieXRlczsKLQotICAgICAgICBpZiAoc2l6ZSA+PSBpZHhfc3ogJiYgZGF0YVtzaXplIC0gaWR4X3N6XSA9PSBtYXJrZXIpIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlkeCA9IGRhdGEgKyBzaXplICsgMSAtIGlkeF9zejsKLSAgICAgICAgICAgIGludCBmaXJzdCA9IDE7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAobmJ5dGVzKSB7Ci0jZGVmaW5lIGNhc2VfbihhLCByZCkgXAotICAgICAgICAgICAgY2FzZSBhOiBcCi0gICAgICAgICAgICAgICAgd2hpbGUgKG5fZnJhbWVzLS0pIHsgXAotICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzeiA9IHJkOyBcCi0gICAgICAgICAgICAgICAgICAgIGlkeCArPSBhOyBcCi0gICAgICAgICAgICAgICAgICAgIGlmIChzeiA9PSAwIHx8IHN6ID4gc2l6ZSkgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzLT5uX2ZyYW1lcyA9IDA7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfc2l6ZSA9IHNpemU7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfZGF0YSA9IGRhdGE7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgc3VwZXJmcmFtZSBwYWNrZXQgc2l6ZTogJXUgZnJhbWUgc2l6ZTogJWRcbiIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeiwgc2l6ZSk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsX3NpemU7IFwKLSAgICAgICAgICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgeyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IDA7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfZGF0YSA9IGRhdGE7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICpvdXRfc2l6ZSA9IHN6OyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzLT5uX2ZyYW1lcyA9IG5fZnJhbWVzOyBcCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPnNpemVbbl9mcmFtZXNdID0gc3o7IFwKLSAgICAgICAgICAgICAgICAgICAgfSBcCi0gICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gc3o7IFwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSAtPSBzejsgXAotICAgICAgICAgICAgICAgIH0gXAotICAgICAgICAgICAgICAgIHBhcnNlX2ZyYW1lKGN0eCwgKm91dF9kYXRhLCAqb3V0X3NpemUpOyBcCi0gICAgICAgICAgICAgICAgcmV0dXJuIHMtPm5fZnJhbWVzID4gMCA/ICpvdXRfc2l6ZSA6IGZ1bGxfc2l6ZQotCi0gICAgICAgICAgICAgICAgY2FzZV9uKDEsICppZHgpOwotICAgICAgICAgICAgICAgIGNhc2VfbigyLCBBVl9STDE2KGlkeCkpOwotICAgICAgICAgICAgICAgIGNhc2VfbigzLCBBVl9STDI0KGlkeCkpOwotICAgICAgICAgICAgICAgIGNhc2Vfbig0LCBBVl9STDMyKGlkeCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgKm91dF9kYXRhID0gZGF0YTsKLSAgICAqb3V0X3NpemUgPSBzaXplOwotICAgIHBhcnNlX2ZyYW1lKGN0eCwgZGF0YSwgc2l6ZSk7Ci0KICAgICByZXR1cm4gc2l6ZTsKIH0KIAogQVZDb2RlY1BhcnNlciBmZl92cDlfcGFyc2VyID0gewogICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfVlA5IH0sCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZQOVBhcnNlQ29udGV4dCksCiAgICAgLnBhcnNlcl9wYXJzZSAgID0gcGFyc2UsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlfcmF3X3Jlb3JkZXJfYnNmLmMgYi9saWJhdmNvZGVjL3ZwOV9yYXdfcmVvcmRlcl9ic2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWYzZGFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92cDlfcmF3X3Jlb3JkZXJfYnNmLmMKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRtYXRoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJic2YuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgInB1dF9iaXRzLmgiCisKKyNkZWZpbmUgRlJBTUVfU0xPVFMgOAorCit0eXBlZGVmIHN0cnVjdCBWUDlSYXdSZW9yZGVyRnJhbWUgeworICAgIEFWUGFja2V0ICAgICpwYWNrZXQ7CisgICAgaW50ICAgICAgICAgIG5lZWRzX291dHB1dDsKKyAgICBpbnQgICAgICAgICAgbmVlZHNfZGlzcGxheTsKKworICAgIGludDY0X3QgICAgICBwdHM7CisgICAgaW50NjRfdCAgICAgIHNlcXVlbmNlOworICAgIHVuc2lnbmVkIGludCBzbG90czsKKworICAgIHVuc2lnbmVkIGludCBwcm9maWxlOworCisgICAgdW5zaWduZWQgaW50IHNob3dfZXhpc3RpbmdfZnJhbWU7CisgICAgdW5zaWduZWQgaW50IGZyYW1lX3RvX3Nob3c7CisKKyAgICB1bnNpZ25lZCBpbnQgZnJhbWVfdHlwZTsKKyAgICB1bnNpZ25lZCBpbnQgc2hvd19mcmFtZTsKKyAgICB1bnNpZ25lZCBpbnQgcmVmcmVzaF9mcmFtZV9mbGFnczsKK30gVlA5UmF3UmVvcmRlckZyYW1lOworCit0eXBlZGVmIHN0cnVjdCBWUDlSYXdSZW9yZGVyQ29udGV4dCB7CisgICAgaW50NjRfdCBzZXF1ZW5jZTsKKyAgICBWUDlSYXdSZW9yZGVyRnJhbWUgKnNsb3RbRlJBTUVfU0xPVFNdOworICAgIFZQOVJhd1Jlb3JkZXJGcmFtZSAqbmV4dF9mcmFtZTsKK30gVlA5UmF3UmVvcmRlckNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIHZwOV9yYXdfcmVvcmRlcl9mcmFtZV9mcmVlKFZQOVJhd1Jlb3JkZXJGcmFtZSAqKmZyYW1lKQoreworICAgIGlmICgqZnJhbWUpCisgICAgICAgIGF2X3BhY2tldF9mcmVlKCYoKmZyYW1lKS0+cGFja2V0KTsKKyAgICBhdl9mcmVlcChmcmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHZwOV9yYXdfcmVvcmRlcl9jbGVhcl9zbG90KFZQOVJhd1Jlb3JkZXJDb250ZXh0ICpjdHgsIGludCBzKQoreworICAgIGlmIChjdHgtPnNsb3Rbc10pIHsKKyAgICAgICAgY3R4LT5zbG90W3NdLT5zbG90cyAmPSB+KDEgPDwgcyk7CisgICAgICAgIGlmIChjdHgtPnNsb3Rbc10tPnNsb3RzID09IDApCisgICAgICAgICAgICB2cDlfcmF3X3Jlb3JkZXJfZnJhbWVfZnJlZSgmY3R4LT5zbG90W3NdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3R4LT5zbG90W3NdID0gTlVMTDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdnA5X3Jhd19yZW9yZGVyX2ZyYW1lX3BhcnNlKEFWQlNGQ29udGV4dCAqYnNmLCBWUDlSYXdSZW9yZGVyRnJhbWUgKmZyYW1lKQoreworICAgIEdldEJpdENvbnRleHQgYmM7CisgICAgaW50IGVycjsKKworICAgIHVuc2lnbmVkIGludCBmcmFtZV9tYXJrZXI7CisgICAgdW5zaWduZWQgaW50IHByb2ZpbGVfbG93X2JpdCwgcHJvZmlsZV9oaWdoX2JpdCwgcmVzZXJ2ZWRfemVybzsKKyAgICB1bnNpZ25lZCBpbnQgZXJyb3JfcmVzaWxpZW50X21vZGU7CisgICAgdW5zaWduZWQgaW50IGZyYW1lX3N5bmNfY29kZTsKKworICAgIGVyciA9IGluaXRfZ2V0X2JpdHMoJmJjLCBmcmFtZS0+cGFja2V0LT5kYXRhLCA4ICogZnJhbWUtPnBhY2tldC0+c2l6ZSk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGZyYW1lX21hcmtlciA9IGdldF9iaXRzKCZiYywgMik7CisgICAgaWYgKGZyYW1lX21hcmtlciAhPSAyKSB7CisgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgbWFya2VyOiAldS5cbiIsCisgICAgICAgICAgICAgICBmcmFtZV9tYXJrZXIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBwcm9maWxlX2xvd19iaXQgID0gZ2V0X2JpdHMxKCZiYyk7CisgICAgcHJvZmlsZV9oaWdoX2JpdCA9IGdldF9iaXRzMSgmYmMpOworICAgIGZyYW1lLT5wcm9maWxlID0gKHByb2ZpbGVfaGlnaF9iaXQgPDwgMSkgfCBwcm9maWxlX2xvd19iaXQ7CisgICAgaWYgKGZyYW1lLT5wcm9maWxlID09IDMpIHsKKyAgICAgICAgcmVzZXJ2ZWRfemVybyA9IGdldF9iaXRzMSgmYmMpOworICAgICAgICBpZiAocmVzZXJ2ZWRfemVybyAhPSAwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJQcm9maWxlIHJlc2VydmVkX3plcm8gYml0IHNldDogIgorICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBwcm9maWxlIG9yIGludmFsaWQgYml0c3RyZWFtLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZyYW1lLT5zaG93X2V4aXN0aW5nX2ZyYW1lID0gZ2V0X2JpdHMxKCZiYyk7CisgICAgaWYgKGZyYW1lLT5zaG93X2V4aXN0aW5nX2ZyYW1lKSB7CisgICAgICAgIGZyYW1lLT5mcmFtZV90b19zaG93ID0gZ2V0X2JpdHMoJmJjLCAzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZnJhbWUtPmZyYW1lX3R5cGUgPSBnZXRfYml0czEoJmJjKTsKKyAgICBmcmFtZS0+c2hvd19mcmFtZSA9IGdldF9iaXRzMSgmYmMpOworICAgIGVycm9yX3Jlc2lsaWVudF9tb2RlID0gZ2V0X2JpdHMxKCZiYyk7CisKKyAgICBpZiAoZnJhbWUtPmZyYW1lX3R5cGUgPT0gMCkgeworICAgICAgICBmcmFtZV9zeW5jX2NvZGUgPSBnZXRfYml0cygmYmMsIDI0KTsKKyAgICAgICAgaWYgKGZyYW1lX3N5bmNfY29kZSAhPSAweDQ5ODM0MikgeworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSBzeW5jIGNvZGU6ICUwNnguXG4iLAorICAgICAgICAgICAgICAgICAgIGZyYW1lX3N5bmNfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBmcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9IDB4ZmY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGludHJhX29ubHk7CisKKyAgICAgICAgaWYgKGZyYW1lLT5zaG93X2ZyYW1lID09IDApCisgICAgICAgICAgICBpbnRyYV9vbmx5ID0gZ2V0X2JpdHMxKCZiYyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGludHJhX29ubHkgPSAwOworICAgICAgICBpZiAoZXJyb3JfcmVzaWxpZW50X21vZGUgPT0gMCkgeworICAgICAgICAgICAgLy8gcmVzZXRfZnJhbWVfY29udGV4dAorICAgICAgICAgICAgc2tpcF9iaXRzKCZiYywgMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGludHJhX29ubHkpIHsKKyAgICAgICAgICAgIGZyYW1lX3N5bmNfY29kZSA9IGdldF9iaXRzKCZiYywgMjQpOworICAgICAgICAgICAgaWYgKGZyYW1lX3N5bmNfY29kZSAhPSAweDQ5ODM0MikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgc3luYyBjb2RlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICIlMDZ4LlxuIiwgZnJhbWVfc3luY19jb2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFtZS0+cHJvZmlsZSA+IDApIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29sb3Jfc3BhY2U7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lLT5wcm9maWxlID49IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdGVuX29yX3R3ZWx2ZV9iaXQKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZiYywgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbG9yX3NwYWNlID0gZ2V0X2JpdHMoJmJjLCAzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29sb3Jfc3BhY2UgIT0gNyAvKiBDU19SR0IgKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY29sb3JfcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZiYywgMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+cHJvZmlsZSA9PSAxIHx8IGZyYW1lLT5wcm9maWxlID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmJjLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+cHJvZmlsZSA9PSAxIHx8IGZyYW1lLT5wcm9maWxlID09IDMpCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmJjLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9IGdldF9iaXRzKCZiYywgOCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyA9IGdldF9iaXRzKCZiYywgOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cDlfcmF3X3Jlb3JkZXJfbWFrZV9vdXRwdXQoQVZCU0ZDb250ZXh0ICpic2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOVJhd1Jlb3JkZXJGcmFtZSAqbGFzdF9mcmFtZSkKK3sKKyAgICBWUDlSYXdSZW9yZGVyQ29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisgICAgVlA5UmF3UmVvcmRlckZyYW1lICpuZXh0X291dHB1dCA9IGxhc3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgKm5leHRfZGlzcGxheSA9IGxhc3RfZnJhbWUsICpmcmFtZTsKKyAgICBpbnQgcywgZXJyOworCisgICAgZm9yIChzID0gMDsgcyA8IEZSQU1FX1NMT1RTOyBzKyspIHsKKyAgICAgICAgZnJhbWUgPSBjdHgtPnNsb3Rbc107CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGZyYW1lLT5uZWVkc19vdXRwdXQgJiYgKCFuZXh0X291dHB1dCB8fAorICAgICAgICAgICAgZnJhbWUtPnNlcXVlbmNlIDwgbmV4dF9vdXRwdXQtPnNlcXVlbmNlKSkKKyAgICAgICAgICAgIG5leHRfb3V0cHV0ID0gZnJhbWU7CisgICAgICAgIGlmIChmcmFtZS0+bmVlZHNfZGlzcGxheSAmJiAoIW5leHRfZGlzcGxheSB8fAorICAgICAgICAgICAgZnJhbWUtPnB0cyA8IG5leHRfZGlzcGxheS0+cHRzKSkKKyAgICAgICAgICAgIG5leHRfZGlzcGxheSA9IGZyYW1lOworICAgIH0KKworICAgIGlmICghbmV4dF9vdXRwdXQgJiYgIW5leHRfZGlzcGxheSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgaWYgKCFuZXh0X2Rpc3BsYXkgfHwgKG5leHRfb3V0cHV0ICYmCisgICAgICAgIG5leHRfb3V0cHV0LT5zZXF1ZW5jZSA8IG5leHRfZGlzcGxheS0+c2VxdWVuY2UpKQorICAgICAgICBmcmFtZSA9IG5leHRfb3V0cHV0OworICAgIGVsc2UKKyAgICAgICAgZnJhbWUgPSBuZXh0X2Rpc3BsYXk7CisKKyAgICBpZiAoZnJhbWUtPm5lZWRzX291dHB1dCAmJiBmcmFtZS0+bmVlZHNfZGlzcGxheSAmJgorICAgICAgICBuZXh0X291dHB1dCA9PSBuZXh0X2Rpc3BsYXkpIHsKKyAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0RFQlVHLCAiT3V0cHV0IGFuZCBkaXNwbGF5IGZyYW1lICIKKyAgICAgICAgICAgICAgICIlIlBSSWQ2NCIgKCUiUFJJZDY0IikgaW4gb3JkZXIuXG4iLAorICAgICAgICAgICAgICAgZnJhbWUtPnNlcXVlbmNlLCBmcmFtZS0+cHRzKTsKKworICAgICAgICBhdl9wYWNrZXRfbW92ZV9yZWYob3V0LCBmcmFtZS0+cGFja2V0KTsKKworICAgICAgICBmcmFtZS0+bmVlZHNfb3V0cHV0ID0gZnJhbWUtPm5lZWRzX2Rpc3BsYXkgPSAwOworICAgIH0gZWxzZSBpZiAoZnJhbWUtPm5lZWRzX291dHB1dCkgeworICAgICAgICBpZiAoZnJhbWUtPm5lZWRzX2Rpc3BsYXkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19ERUJVRywgIk91dHB1dCBmcmFtZSAlIlBSSWQ2NCIgIgorICAgICAgICAgICAgICAgICAgICIoJSJQUklkNjQiKSBmb3IgbGF0ZXIgZGlzcGxheS5cbiIsCisgICAgICAgICAgICAgICAgICAgZnJhbWUtPnNlcXVlbmNlLCBmcmFtZS0+cHRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19ERUJVRywgIk91dHB1dCB1bnNob3duIGZyYW1lICIKKyAgICAgICAgICAgICAgICAgICAiJSJQUklkNjQiICglIlBSSWQ2NCIpIHRvIGtlZXAgb3JkZXIuXG4iLAorICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zZXF1ZW5jZSwgZnJhbWUtPnB0cyk7CisgICAgICAgIH0KKworICAgICAgICBhdl9wYWNrZXRfbW92ZV9yZWYob3V0LCBmcmFtZS0+cGFja2V0KTsKKyAgICAgICAgb3V0LT5wdHMgPSBvdXQtPmR0czsKKworICAgICAgICBmcmFtZS0+bmVlZHNfb3V0cHV0ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBQdXRCaXRDb250ZXh0IHBiOworCisgICAgICAgIGF2X2Fzc2VydDAoIWZyYW1lLT5uZWVkc19vdXRwdXQgJiYgZnJhbWUtPm5lZWRzX2Rpc3BsYXkpOworCisgICAgICAgIGlmIChmcmFtZS0+c2xvdHMgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiQXR0ZW1wdGluZyB0byBkaXNwbGF5IGZyYW1lICIKKyAgICAgICAgICAgICAgICAgICAid2hpY2ggaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZT9cbiIpOworICAgICAgICAgICAgZnJhbWUtPm5lZWRzX2Rpc3BsYXkgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBzID0gZmZfY3R6KGZyYW1lLT5zbG90cyk7CisgICAgICAgIGF2X2Fzc2VydDAocyA8IEZSQU1FX1NMT1RTKTsKKworICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfREVCVUcsICJEaXNwbGF5IGZyYW1lICUiUFJJZDY0IiAiCisgICAgICAgICAgICAgICAiKCUiUFJJZDY0IikgZnJvbSBzbG90ICVkLlxuIiwKKyAgICAgICAgICAgICAgIGZyYW1lLT5zZXF1ZW5jZSwgZnJhbWUtPnB0cywgcyk7CisKKyAgICAgICAgZXJyID0gYXZfbmV3X3BhY2tldChvdXQsIDIpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgaW5pdF9wdXRfYml0cygmcGIsIG91dC0+ZGF0YSwgMik7CisKKyAgICAgICAgLy8gZnJhbWVfbWFya2VyCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMiwgMik7CisgICAgICAgIC8vIHByb2ZpbGVfbG93X2JpdAorICAgICAgICBwdXRfYml0cygmcGIsIDEsIGZyYW1lLT5wcm9maWxlICYgMSk7CisgICAgICAgIC8vIHByb2ZpbGVfaGlnaF9iaXQKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAoZnJhbWUtPnByb2ZpbGUgPj4gMSkgJiAxKTsKKyAgICAgICAgaWYgKGZyYW1lLT5wcm9maWxlID09IDMpIHsKKyAgICAgICAgICAgIC8vIHJlc2VydmVkX3plcm8KKyAgICAgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2hvd19leGlzdGluZ19mcmFtZQorICAgICAgICBwdXRfYml0cygmcGIsIDEsIDEpOworICAgICAgICAvLyBmcmFtZV90b19zaG93X21hcF9pZHgKKyAgICAgICAgcHV0X2JpdHMoJnBiLCAzLCBzKTsKKworICAgICAgICB3aGlsZSAocHV0X2JpdHNfY291bnQoJnBiKSA8IDE2KQorICAgICAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsKKworICAgICAgICBmbHVzaF9wdXRfYml0cygmcGIpOworICAgICAgICBvdXQtPnB0cyA9IG91dC0+ZHRzID0gZnJhbWUtPnB0czsKKworICAgICAgICBmcmFtZS0+bmVlZHNfZGlzcGxheSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA5X3Jhd19yZW9yZGVyX2ZpbHRlcihBVkJTRkNvbnRleHQgKmJzZiwgQVZQYWNrZXQgKm91dCkKK3sKKyAgICBWUDlSYXdSZW9yZGVyQ29udGV4dCAqY3R4ID0gYnNmLT5wcml2X2RhdGE7CisgICAgVlA5UmF3UmVvcmRlckZyYW1lICpmcmFtZTsKKyAgICBBVlBhY2tldCAqaW47CisgICAgaW50IGVyciwgczsKKworICAgIGlmIChjdHgtPm5leHRfZnJhbWUpIHsKKyAgICAgICAgZnJhbWUgPSBjdHgtPm5leHRfZnJhbWU7CisKKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBmZl9ic2ZfZ2V0X3BhY2tldChic2YsICZpbik7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgICAgIHJldHVybiB2cDlfcmF3X3Jlb3JkZXJfbWFrZV9vdXRwdXQoYnNmLCBvdXQsIE5VTEwpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbi0+ZGF0YVtpbi0+c2l6ZSAtIDFdICYgMHhlMCA9PSAweGMwKSB7CisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfRVJST1IsICJJbnB1dCBpbiBzdXBlcmZyYW1lcyBpcyBub3QgIgorICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIGF2X3BhY2tldF9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICB9CisKKyAgICAgICAgZnJhbWUgPSBhdl9tYWxsb2N6KHNpemVvZigqZnJhbWUpKTsKKyAgICAgICAgaWYgKCFmcmFtZSkgeworICAgICAgICAgICAgYXZfcGFja2V0X2ZyZWUoJmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZS0+cGFja2V0ICAgPSBpbjsKKyAgICAgICAgZnJhbWUtPnB0cyAgICAgID0gaW4tPnB0czsKKyAgICAgICAgZnJhbWUtPnNlcXVlbmNlID0gKytjdHgtPnNlcXVlbmNlOworICAgICAgICBlcnIgPSB2cDlfcmF3X3Jlb3JkZXJfZnJhbWVfcGFyc2UoYnNmLCBmcmFtZSk7CisgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhic2YsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBwYXJzZSBpbnB1dCAiCisgICAgICAgICAgICAgICAgICAgImZyYW1lOiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBmcmFtZS0+bmVlZHNfb3V0cHV0ICA9IDE7CisgICAgICAgIGZyYW1lLT5uZWVkc19kaXNwbGF5ID0gZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRTsKKworICAgICAgICBpZiAoZnJhbWUtPnNob3dfZXhpc3RpbmdfZnJhbWUpCisgICAgICAgICAgICBhdl9sb2coYnNmLCBBVl9MT0dfREVCVUcsICJTaG93IGZyYW1lICUiUFJJZDY0IiAiCisgICAgICAgICAgICAgICAgICAgIiglIlBSSWQ2NCIpOiBzaG93ICV1LlxuIiwgZnJhbWUtPnNlcXVlbmNlLAorICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wdHMsIGZyYW1lLT5mcmFtZV90b19zaG93KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0RFQlVHLCAiTmV3IGZyYW1lICUiUFJJZDY0IiAiCisgICAgICAgICAgICAgICAgICAgIiglIlBSSWQ2NCIpOiB0eXBlICV1IHNob3cgJXUgcmVmcmVzaCAlMDJ4LlxuIiwKKyAgICAgICAgICAgICAgICAgICBmcmFtZS0+c2VxdWVuY2UsIGZyYW1lLT5wdHMsIGZyYW1lLT5mcmFtZV90eXBlLAorICAgICAgICAgICAgICAgICAgIGZyYW1lLT5zaG93X2ZyYW1lLCBmcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyk7CisKKyAgICAgICAgY3R4LT5uZXh0X2ZyYW1lID0gZnJhbWU7CisgICAgfQorCisgICAgZm9yIChzID0gMDsgcyA8IEZSQU1FX1NMT1RTOyBzKyspIHsKKyAgICAgICAgaWYgKCEoZnJhbWUtPnJlZnJlc2hfZnJhbWVfZmxhZ3MgJiAoMSA8PCBzKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGN0eC0+c2xvdFtzXSAmJiBjdHgtPnNsb3Rbc10tPm5lZWRzX2Rpc3BsYXkgJiYKKyAgICAgICAgICAgIGN0eC0+c2xvdFtzXS0+c2xvdHMgPT0gKDEgPDwgcykpIHsKKyAgICAgICAgICAgIC8vIFdlIGFyZSBvdmVyd3JpdGluZyB0aGlzIHNsb3QsIHdoaWNoIGlzIGxhc3QgcmVmZXJlbmNlCisgICAgICAgICAgICAvLyB0byB0aGUgZnJhbWUgcHJldmlvdXNseSBwcmVzZW50IGluIGl0LiAgSW4gb3JkZXIgdG8gYmUKKyAgICAgICAgICAgIC8vIGEgdmFsaWQgc3RyZWFtLCB0aGF0IGZyYW1lIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4KKyAgICAgICAgICAgIC8vIGRpc3BsYXllZCBiZWZvcmUgdGhlIHB0cyBvZiB0aGUgY3VycmVudCBmcmFtZS4KKyAgICAgICAgICAgIGVyciA9IHZwOV9yYXdfcmVvcmRlcl9tYWtlX291dHB1dChic2YsIG91dCwgY3R4LT5zbG90W3NdKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgb3ZlcndyaXRpbmcgc2xvdCAlZDogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzLCBlcnIpOworICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBzbG90IGFueXdheSwgc28gd2UgZG9uJ3QgZW5kIHVwCisgICAgICAgICAgICAgICAgLy8gaW4gYW4gaW5maW5pdGUgbG9vcC4KKyAgICAgICAgICAgICAgICB2cDlfcmF3X3Jlb3JkZXJfY2xlYXJfc2xvdChjdHgsIHMpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdnA5X3Jhd19yZW9yZGVyX2NsZWFyX3Nsb3QoY3R4LCBzKTsKKyAgICB9CisKKyAgICBmb3IgKHMgPSAwOyBzIDwgRlJBTUVfU0xPVFM7IHMrKykgeworICAgICAgICBpZiAoIShmcmFtZS0+cmVmcmVzaF9mcmFtZV9mbGFncyAmICgxIDw8IHMpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjdHgtPnNsb3Rbc10gPSBmcmFtZTsKKyAgICB9CisgICAgZnJhbWUtPnNsb3RzID0gZnJhbWUtPnJlZnJlc2hfZnJhbWVfZmxhZ3M7CisKKyAgICBpZiAoIWZyYW1lLT5yZWZyZXNoX2ZyYW1lX2ZsYWdzKSB7CisgICAgICAgIGVyciA9IHZwOV9yYXdfcmVvcmRlcl9tYWtlX291dHB1dChic2YsIG91dCwgZnJhbWUpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGJzZiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBvdXRwdXQgIgorICAgICAgICAgICAgICAgICAgICJmb3IgdHJhbnNpZW50IGZyYW1lLlxuIik7CisgICAgICAgICAgICBjdHgtPm5leHRfZnJhbWUgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmcmFtZS0+bmVlZHNfZGlzcGxheSkgeworICAgICAgICAgICAgdnA5X3Jhd19yZW9yZGVyX2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgICAgIGN0eC0+bmV4dF9mcmFtZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY3R4LT5uZXh0X2ZyYW1lID0gTlVMTDsKKyAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworCitmYWlsOgorICAgIHZwOV9yYXdfcmVvcmRlcl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdnA5X3Jhd19yZW9yZGVyX2Nsb3NlKEFWQlNGQ29udGV4dCAqYnNmKQoreworICAgIFZQOVJhd1Jlb3JkZXJDb250ZXh0ICpjdHggPSBic2YtPnByaXZfZGF0YTsKKyAgICBpbnQgczsKKworICAgIGZvciAocyA9IDA7IHMgPCBGUkFNRV9TTE9UUzsgcysrKQorICAgICAgICB2cDlfcmF3X3Jlb3JkZXJfY2xlYXJfc2xvdChjdHgsIHMpOworfQorCitzdGF0aWMgY29uc3QgZW51bSBBVkNvZGVjSUQgdnA5X3Jhd19yZW9yZGVyX2NvZGVjX2lkc1tdID0geworICAgIEFWX0NPREVDX0lEX1ZQOSwgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX3ZwOV9yYXdfcmVvcmRlcl9ic2YgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInZwOV9yYXdfcmVvcmRlciIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZQOVJhd1Jlb3JkZXJDb250ZXh0KSwKKyAgICAuY2xvc2UgICAgICAgICAgPSAmdnA5X3Jhd19yZW9yZGVyX2Nsb3NlLAorICAgIC5maWx0ZXIgICAgICAgICA9ICZ2cDlfcmF3X3Jlb3JkZXJfZmlsdGVyLAorICAgIC5jb2RlY19pZHMgICAgICA9IHZwOV9yYXdfcmVvcmRlcl9jb2RlY19pZHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlfc3VwZXJmcmFtZV9ic2YuYyBiL2xpYmF2Y29kZWMvdnA5X3N1cGVyZnJhbWVfYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI1NjlhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdnA5X3N1cGVyZnJhbWVfYnNmLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBWcDkgaW52aXNpYmxlIChhbHQtcmVmKSBmcmFtZSB0byBzdXBlcmZyYW1lIG1lcmdlIGJpdHN0cmVhbSBmaWx0ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnNmLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKworI2RlZmluZSBNQVhfQ0FDSEUgOAordHlwZWRlZiBzdHJ1Y3QgVlA5QlNGQ29udGV4dCB7CisgICAgaW50IG5fY2FjaGU7CisgICAgQVZQYWNrZXQgKmNhY2hlW01BWF9DQUNIRV07Cit9IFZQOUJTRkNvbnRleHQ7CisKK3N0YXRpYyB2b2lkIHN0YXRzKEFWUGFja2V0ICogY29uc3QgKmluLCBpbnQgbl9pbiwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpfbWF4LCB1bnNpZ25lZCAqX3N1bSkKK3sKKyAgICBpbnQgbjsKKyAgICB1bnNpZ25lZCBtYXggPSAwLCBzdW0gPSAwOworCisgICAgZm9yIChuID0gMDsgbiA8IG5faW47IG4rKykgeworICAgICAgICB1bnNpZ25lZCBzeiA9IGluW25dLT5zaXplOworCisgICAgICAgIGlmIChzeiA+IG1heCkKKyAgICAgICAgICAgIG1heCA9IHN6OworICAgICAgICBzdW0gKz0gc3o7CisgICAgfQorCisgICAgKl9tYXggPSBtYXg7CisgICAgKl9zdW0gPSBzdW07Cit9CisKK3N0YXRpYyBpbnQgbWVyZ2Vfc3VwZXJmcmFtZShBVlBhY2tldCAqIGNvbnN0ICppbiwgaW50IG5faW4sIEFWUGFja2V0ICpvdXQpCit7CisgICAgdW5zaWduZWQgbWF4LCBzdW0sIG1hZywgbWFya2VyLCBuLCBzejsKKyAgICB1aW50OF90ICpwdHI7CisgICAgaW50IHJlczsKKworICAgIHN0YXRzKGluLCBuX2luLCAmbWF4LCAmc3VtKTsKKyAgICBtYWcgPSBhdl9sb2cyKG1heCkgPj4gMzsKKyAgICBtYXJrZXIgPSAweEMwICsgKG1hZyA8PCAzKSArIChuX2luIC0gMSk7CisgICAgc3ogPSBzdW0gKyAyICsgKG1hZyArIDEpICogbl9pbjsKKyAgICByZXMgPSBhdl9uZXdfcGFja2V0KG91dCwgc3opOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworICAgIHB0ciA9IG91dC0+ZGF0YTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgbl9pbjsgbisrKSB7CisgICAgICAgIG1lbWNweShwdHIsIGluW25dLT5kYXRhLCBpbltuXS0+c2l6ZSk7CisgICAgICAgIHB0ciArPSBpbltuXS0+c2l6ZTsKKyAgICB9CisKKyNkZWZpbmUgd2xvb3AobWFnLCB3cikgXAorICAgIGRvIHsgXAorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbl9pbjsgbisrKSB7IFwKKyAgICAgICAgICAgIHdyOyBcCisgICAgICAgICAgICBwdHIgKz0gbWFnICsgMTsgXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgLy8gd3JpdGUgc3VwZXJmcmFtZSB3aXRoIG1hcmtlciAxMTBbbWFnOjJdW25mcmFtZXM6M10KKyAgICAqcHRyKysgPSBtYXJrZXI7CisgICAgc3dpdGNoIChtYWcpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHdsb29wKG1hZywgKnB0ciA9IGluW25dLT5zaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB3bG9vcChtYWcsIEFWX1dMMTYocHRyLCBpbltuXS0+c2l6ZSkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHdsb29wKG1hZywgQVZfV0wyNChwdHIsIGluW25dLT5zaXplKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgICAgd2xvb3AobWFnLCBBVl9XTDMyKHB0ciwgaW5bbl0tPnNpemUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICpwdHIrKyA9IG1hcmtlcjsKKyAgICBhdl9hc3NlcnQwKHB0ciA9PSAmb3V0LT5kYXRhW291dC0+c2l6ZV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnA5X3N1cGVyZnJhbWVfZmlsdGVyKEFWQlNGQ29udGV4dCAqY3R4LCBBVlBhY2tldCAqb3V0KQoreworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgVlA5QlNGQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0ICppbjsKKyAgICBpbnQgcmVzLCBpbnZpc2libGUsIHByb2ZpbGUsIG1hcmtlciwgdXNlc19zdXBlcmZyYW1lX3N5bnRheCA9IDAsIG47CisKKyAgICByZXMgPSBmZl9ic2ZfZ2V0X3BhY2tldChjdHgsICZpbik7CisgICAgaWYgKHJlcyA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICBtYXJrZXIgPSBpbi0+ZGF0YVtpbi0+c2l6ZSAtIDFdOworICAgIGlmICgobWFya2VyICYgMHhlMCkgPT0gMHhjMCkgeworICAgICAgICBpbnQgbmJ5dGVzID0gMSArICgobWFya2VyID4+IDMpICYgMHgzKTsKKyAgICAgICAgaW50IG5fZnJhbWVzID0gMSArIChtYXJrZXIgJiAweDcpLCBpZHhfc3ogPSAyICsgbl9mcmFtZXMgKiBuYnl0ZXM7CisKKyAgICAgICAgdXNlc19zdXBlcmZyYW1lX3N5bnRheCA9IGluLT5zaXplID49IGlkeF9zeiAmJiBpbi0+ZGF0YVtpbi0+c2l6ZSAtIGlkeF9zel0gPT0gbWFya2VyOworICAgIH0KKworICAgIGlmICgocmVzID0gaW5pdF9nZXRfYml0czgoJmdiLCBpbi0+ZGF0YSwgaW4tPnNpemUpKSA8IDApCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgIGdldF9iaXRzKCZnYiwgMik7IC8vIGZyYW1lIG1hcmtlcgorICAgIHByb2ZpbGUgID0gZ2V0X2JpdHMxKCZnYik7CisgICAgcHJvZmlsZSB8PSBnZXRfYml0czEoJmdiKSA8PCAxOworICAgIGlmIChwcm9maWxlID09IDMpIHByb2ZpbGUgKz0gZ2V0X2JpdHMxKCZnYik7CisKKyAgICBpZiAoZ2V0X2JpdHMxKCZnYikpIHsKKyAgICAgICAgaW52aXNpYmxlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBnZXRfYml0czEoJmdiKTsgLy8ga2V5ZnJhbWUKKyAgICAgICAgaW52aXNpYmxlID0gIWdldF9iaXRzMSgmZ2IpOworICAgIH0KKworICAgIGlmICh1c2VzX3N1cGVyZnJhbWVfc3ludGF4ICYmIHMtPm5fY2FjaGUgPiAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJNaXhpbmcgb2Ygc3VwZXJmcmFtZSBzeW50YXggYW5kIG5ha2VkIFZQOSBmcmFtZXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXMgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9IGVsc2UgaWYgKCghaW52aXNpYmxlIHx8IHVzZXNfc3VwZXJmcmFtZV9zeW50YXgpICYmICFzLT5uX2NhY2hlKSB7CisgICAgICAgIC8vIHBhc3N0aHJvdWdoCisgICAgICAgIGF2X3BhY2tldF9tb3ZlX3JlZihvdXQsIGluKTsKKyAgICAgICAgZ290byBkb25lOworICAgIH0gZWxzZSBpZiAocy0+bl9jYWNoZSArIDEgPj0gTUFYX0NBQ0hFKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUb28gbWFueSBpbnZpc2libGUgZnJhbWVzIik7CisgICAgICAgIHJlcyA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisKKyAgICBhdl9wYWNrZXRfbW92ZV9yZWYocy0+Y2FjaGVbcy0+bl9jYWNoZSsrXSwgaW4pOworCisgICAgaWYgKGludmlzaWJsZSkgeworICAgICAgICByZXMgPSBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIGdvdG8gZG9uZTsKKyAgICB9CisgICAgYXZfYXNzZXJ0MChzLT5uX2NhY2hlID4gMCk7CisKKyAgICAvLyBidWlsZCBzdXBlcmZyYW1lCisgICAgaWYgKChyZXMgPSBtZXJnZV9zdXBlcmZyYW1lKHMtPmNhY2hlLCBzLT5uX2NhY2hlLCBvdXQpKSA8IDApCisgICAgICAgIGdvdG8gZG9uZTsKKworICAgIHJlcyA9IGF2X3BhY2tldF9jb3B5X3Byb3BzKG91dCwgcy0+Y2FjaGVbcy0+bl9jYWNoZSAtIDFdKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgZ290byBkb25lOworCisgICAgZm9yIChuID0gMDsgbiA8IHMtPm5fY2FjaGU7IG4rKykKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKHMtPmNhY2hlW25dKTsKKyAgICBzLT5uX2NhY2hlID0gMDsKKworZG9uZToKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKG91dCk7CisgICAgYXZfcGFja2V0X2ZyZWUoJmluKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IHZwOV9zdXBlcmZyYW1lX2luaXQoQVZCU0ZDb250ZXh0ICpjdHgpCit7CisgICAgVlA5QlNGQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBuOworCisgICAgLy8gYWxsb2MgY2FjaGUgcGFja2V0cworICAgIGZvciAobiA9IDA7IG4gPCBNQVhfQ0FDSEU7IG4rKykgeworICAgICAgICBzLT5jYWNoZVtuXSA9IGF2X3BhY2tldF9hbGxvYygpOworICAgICAgICBpZiAoIXMtPmNhY2hlW25dKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnA5X3N1cGVyZnJhbWVfY2xvc2UoQVZCU0ZDb250ZXh0ICpjdHgpCit7CisgICAgVlA5QlNGQ29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGludCBuOworCisgICAgLy8gZnJlZSBjYWNoZWQgZGF0YQorICAgIGZvciAobiA9IDA7IG4gPCBNQVhfQ0FDSEU7IG4rKykKKyAgICAgICAgYXZfcGFja2V0X2ZyZWUoJnMtPmNhY2hlW25dKTsKK30KKworc3RhdGljIGNvbnN0IGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkc1tdID0geworICAgIEFWX0NPREVDX0lEX1ZQOSwgQVZfQ09ERUNfSURfTk9ORSwKK307CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX3ZwOV9zdXBlcmZyYW1lX2JzZiA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidnA5X3N1cGVyZnJhbWUiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihWUDlCU0ZDb250ZXh0KSwKKyAgICAuZmlsdGVyICAgICAgICAgPSB2cDlfc3VwZXJmcmFtZV9maWx0ZXIsCisgICAgLmluaXQgICAgICAgICAgID0gdnA5X3N1cGVyZnJhbWVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2cDlfc3VwZXJmcmFtZV9jbG9zZSwKKyAgICAuY29kZWNfaWRzICAgICAgPSBjb2RlY19pZHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlfc3VwZXJmcmFtZV9zcGxpdF9ic2YuYyBiL2xpYmF2Y29kZWMvdnA5X3N1cGVyZnJhbWVfc3BsaXRfYnNmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0YWEzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdnA5X3N1cGVyZnJhbWVfc3BsaXRfYnNmLmMKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogVGhpcyBiaXRzdHJlYW0gZmlsdGVyIHNwbGl0cyBWUDkgc3VwZXJmcmFtZXMgaW50byBwYWNrZXRzIGNvbnRhaW5pbmcKKyAqIGp1c3Qgb25lIGZyYW1lLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJic2YuaCIKKyNpbmNsdWRlICJieXRlc3RyZWFtLmgiCisjaW5jbHVkZSAiZ2V0X2JpdHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgVlA5U0ZTcGxpdENvbnRleHQgeworICAgIEFWUGFja2V0IGJ1ZmZlcl9wa3Q7CisKKyAgICBpbnQgbmJfZnJhbWVzOworICAgIGludCBuZXh0X2ZyYW1lOworICAgIHNpemVfdCBuZXh0X2ZyYW1lX29mZnNldDsKKyAgICBpbnQgc2l6ZXNbOF07Cit9IFZQOVNGU3BsaXRDb250ZXh0OworCitzdGF0aWMgaW50IHZwOV9zdXBlcmZyYW1lX3NwbGl0X2ZpbHRlcihBVkJTRkNvbnRleHQgKmN0eCwgQVZQYWNrZXQgKm91dCkKK3sKKyAgICBWUDlTRlNwbGl0Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0ICppbjsKKyAgICBpbnQgaSwgaiwgcmV0LCBtYXJrZXI7CisgICAgaW50IGlzX3N1cGVyZnJhbWUgPSAhIXMtPmJ1ZmZlcl9wa3QuZGF0YTsKKworICAgIGlmICghcy0+YnVmZmVyX3BrdC5kYXRhKSB7CisgICAgICAgIHJldCA9IGZmX2JzZl9nZXRfcGFja2V0X3JlZihjdHgsICZzLT5idWZmZXJfcGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpbiA9ICZzLT5idWZmZXJfcGt0OworCisgICAgICAgIG1hcmtlciA9IGluLT5kYXRhW2luLT5zaXplIC0gMV07CisgICAgICAgIGlmICgobWFya2VyICYgMHhlMCkgPT0gMHhjMCkgeworICAgICAgICAgICAgaW50IGxlbmd0aF9zaXplID0gMSArICgobWFya2VyID4+IDMpICYgMHgzKTsKKyAgICAgICAgICAgIGludCAgIG5iX2ZyYW1lcyA9IDEgKyAobWFya2VyICYgMHg3KTsKKyAgICAgICAgICAgIGludCAgICBpZHhfc2l6ZSA9IDIgKyBuYl9mcmFtZXMgKiBsZW5ndGhfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGluLT5zaXplID49IGlkeF9zaXplICYmIGluLT5kYXRhW2luLT5zaXplIC0gaWR4X3NpemVdID09IG1hcmtlcikgeworICAgICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0IGJjOworICAgICAgICAgICAgICAgIGludDY0X3QgdG90YWxfc2l6ZSA9IDA7CisKKyAgICAgICAgICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZiYywgaW4tPmRhdGEgKyBpbi0+c2l6ZSArIDEgLSBpZHhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2ZyYW1lcyAqIGxlbmd0aF9zaXplKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9mcmFtZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGhfc2l6ZTsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZSB8PSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmYmMpIDw8IChqICogOCk7CisKKyAgICAgICAgICAgICAgICAgICAgdG90YWxfc2l6ZSArPSBmcmFtZV9zaXplOworICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVfc2l6ZSA8IDAgfHwgdG90YWxfc2l6ZSA+IGluLT5zaXplIC0gaWR4X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSBzaXplIGluIGEgc3VwZXJmcmFtZTogJWRcbiIsIGZyYW1lX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHMtPnNpemVzW2ldID0gZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcy0+bmJfZnJhbWVzICAgICAgICAgPSBuYl9mcmFtZXM7CisgICAgICAgICAgICAgICAgcy0+bmV4dF9mcmFtZSAgICAgICAgPSAwOworICAgICAgICAgICAgICAgIHMtPm5leHRfZnJhbWVfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICBpc19zdXBlcmZyYW1lICAgICAgICA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfc3VwZXJmcmFtZSkgeworICAgICAgICBHZXRCaXRDb250ZXh0IGdiOworICAgICAgICBpbnQgcHJvZmlsZSwgaW52aXNpYmxlID0gMDsKKworICAgICAgICByZXQgPSBhdl9wYWNrZXRfcmVmKG91dCwgJnMtPmJ1ZmZlcl9wa3QpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBvdXQtPmRhdGEgKz0gcy0+bmV4dF9mcmFtZV9vZmZzZXQ7CisgICAgICAgIG91dC0+c2l6ZSAgPSBzLT5zaXplc1tzLT5uZXh0X2ZyYW1lXTsKKworICAgICAgICBzLT5uZXh0X2ZyYW1lX29mZnNldCArPSBvdXQtPnNpemU7CisgICAgICAgIHMtPm5leHRfZnJhbWUrKzsKKworICAgICAgICBpZiAocy0+bmV4dF9mcmFtZSA+PSBzLT5uYl9mcmFtZXMpCisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnMtPmJ1ZmZlcl9wa3QpOworCisgICAgICAgIHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgb3V0LT5kYXRhLCBvdXQtPnNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBnZXRfYml0cygmZ2IsIDIpOyAvLyBmcmFtZV9tYXJrZXIKKyAgICAgICAgcHJvZmlsZSAgPSBnZXRfYml0czEoJmdiKTsKKyAgICAgICAgcHJvZmlsZSB8PSBnZXRfYml0czEoJmdiKSA8PCAxOworICAgICAgICBpZiAocHJvZmlsZSA9PSAzKQorICAgICAgICAgICAgZ2V0X2JpdHMxKCZnYik7CisgICAgICAgIGlmICghZ2V0X2JpdHMxKCZnYikpIHsKKyAgICAgICAgICAgIGdldF9iaXRzMSgmZ2IpOworICAgICAgICAgICAgaW52aXNpYmxlID0gIWdldF9iaXRzMSgmZ2IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludmlzaWJsZSkKKyAgICAgICAgICAgIG91dC0+cHRzID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9wYWNrZXRfbW92ZV9yZWYob3V0LCAmcy0+YnVmZmVyX3BrdCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGlmIChyZXQgPCAwKQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYob3V0KTsKKyAgICBhdl9wYWNrZXRfdW5yZWYoJnMtPmJ1ZmZlcl9wa3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHZwOV9zdXBlcmZyYW1lX3NwbGl0X3VuaW5pdChBVkJTRkNvbnRleHQgKmN0eCkKK3sKKyAgICBWUDlTRlNwbGl0Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOworICAgIGF2X3BhY2tldF91bnJlZigmcy0+YnVmZmVyX3BrdCk7Cit9CisKK2NvbnN0IEFWQml0U3RyZWFtRmlsdGVyIGZmX3ZwOV9zdXBlcmZyYW1lX3NwbGl0X2JzZiA9IHsKKyAgICAubmFtZSA9ICJ2cDlfc3VwZXJmcmFtZV9zcGxpdCIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZQOVNGU3BsaXRDb250ZXh0KSwKKyAgICAuY2xvc2UgICAgICAgICAgPSB2cDlfc3VwZXJmcmFtZV9zcGxpdF91bmluaXQsCisgICAgLmZpbHRlciAgICAgICAgID0gdnA5X3N1cGVyZnJhbWVfc3BsaXRfZmlsdGVyLAorICAgIC5jb2RlY19pZHMgICAgICA9IChjb25zdCBlbnVtIEFWQ29kZWNJRCBbXSl7IEFWX0NPREVDX0lEX1ZQOSwgQVZfQ09ERUNfSURfTk9ORSB9LAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA5YmxvY2suYyBiL2xpYmF2Y29kZWMvdnA5YmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzNmN2E3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92cDlibG9jay5jCkBAIC0wLDAgKzEsMTQ0OSBAQAorLyoKKyAqIFZQOSBjb21wYXRpYmxlIHZpZGVvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvZHNwLmgiCisjaW5jbHVkZSAidnA1Ni5oIgorI2luY2x1ZGUgInZwOS5oIgorI2luY2x1ZGUgInZwOWRhdGEuaCIKKyNpbmNsdWRlICJ2cDlkZWMuaCIKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBzZXRjdHhfMmQodWludDhfdCAqcHRyLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgdikKK3sKKyAgICBzd2l0Y2ggKHcpIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgICpwdHIgPSB2OworICAgICAgICAgICAgcHRyICs9IHN0cmlkZTsKKyAgICAgICAgfSB3aGlsZSAoLS1oKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOiB7CisgICAgICAgIGludCB2MTYgPSB2ICogMHgwMTAxOworICAgICAgICBkbyB7CisgICAgICAgICAgICBBVl9XTjE2QShwdHIsIHYxNik7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9IHdoaWxlICgtLWgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA0OiB7CisgICAgICAgIHVpbnQzMl90IHYzMiA9IHYgKiAweDAxMDEwMTAxOworICAgICAgICBkbyB7CisgICAgICAgICAgICBBVl9XTjMyQShwdHIsIHYzMik7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9IHdoaWxlICgtLWgpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSA4OiB7CisjaWYgSEFWRV9GQVNUXzY0QklUCisgICAgICAgIHVpbnQ2NF90IHY2NCA9IHYgKiAweDAxMDEwMTAxMDEwMTAxMDFVTEw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIEFWX1dONjRBKHB0ciwgdjY0KTsKKyAgICAgICAgICAgIHB0ciArPSBzdHJpZGU7CisgICAgICAgIH0gd2hpbGUgKC0taCk7CisjZWxzZQorICAgICAgICB1aW50MzJfdCB2MzIgPSB2ICogMHgwMTAxMDEwMTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgQVZfV04zMkEocHRyLCAgICAgdjMyKTsKKyAgICAgICAgICAgIEFWX1dOMzJBKHB0ciArIDQsIHYzMik7CisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlOworICAgICAgICB9IHdoaWxlICgtLWgpOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9tb2RlKFZQOVRpbGVEYXRhICp0ZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBsZWZ0X2N0eFtOX0JTX1NJWkVTXSA9IHsKKyAgICAgICAgMHgwLCAweDgsIDB4MCwgMHg4LCAweGMsIDB4OCwgMHhjLCAweGUsIDB4YywgMHhlLCAweGYsIDB4ZSwgMHhmCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBhYm92ZV9jdHhbTl9CU19TSVpFU10gPSB7CisgICAgICAgIDB4MCwgMHgwLCAweDgsIDB4OCwgMHg4LCAweGMsIDB4YywgMHhjLCAweGUsIDB4ZSwgMHhlLCAweGYsIDB4ZgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWF4X3R4X2Zvcl9ibF9icFtOX0JTX1NJWkVTXSA9IHsKKyAgICAgICAgVFhfMzJYMzIsIFRYXzMyWDMyLCBUWF8zMlgzMiwgVFhfMzJYMzIsIFRYXzE2WDE2LCBUWF8xNlgxNiwKKyAgICAgICAgVFhfMTZYMTYsIFRYXzhYOCwgICBUWF84WDgsICAgVFhfOFg4LCAgIFRYXzRYNCwgICBUWF80WDQsICBUWF80WDQKKyAgICB9OworICAgIFZQOUNvbnRleHQgKnMgPSB0ZC0+czsKKyAgICBWUDlCbG9jayAqYiA9IHRkLT5iOworICAgIGludCByb3cgPSB0ZC0+cm93LCBjb2wgPSB0ZC0+Y29sLCByb3c3ID0gdGQtPnJvdzc7CisgICAgZW51bSBUeGZtTW9kZSBtYXhfdHggPSBtYXhfdHhfZm9yX2JsX2JwW2ItPmJzXTsKKyAgICBpbnQgYnc0ID0gZmZfdnA5X2J3aF90YWJbMV1bYi0+YnNdWzBdLCB3NCA9IEZGTUlOKHMtPmNvbHMgLSBjb2wsIGJ3NCk7CisgICAgaW50IGJoNCA9IGZmX3ZwOV9id2hfdGFiWzFdW2ItPmJzXVsxXSwgaDQgPSBGRk1JTihzLT5yb3dzIC0gcm93LCBiaDQpLCB5OworICAgIGludCBoYXZlX2EgPSByb3cgPiAwLCBoYXZlX2wgPSBjb2wgPiB0ZC0+dGlsZV9jb2xfc3RhcnQ7CisgICAgaW50IHZyZWYsIGZpbHRlcl9pZDsKKworICAgIGlmICghcy0+cy5oLnNlZ21lbnRhdGlvbi5lbmFibGVkKSB7CisgICAgICAgIGItPnNlZ19pZCA9IDA7CisgICAgfSBlbHNlIGlmIChzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkgeworICAgICAgICBiLT5zZWdfaWQgPSAhcy0+cy5oLnNlZ21lbnRhdGlvbi51cGRhdGVfbWFwID8gMCA6CisgICAgICAgICAgICAgICAgICAgIHZwOF9yYWNfZ2V0X3RyZWUodGQtPmMsIGZmX3ZwOV9zZWdtZW50YXRpb25fdHJlZSwgcy0+cy5oLnNlZ21lbnRhdGlvbi5wcm9iKTsKKyAgICB9IGVsc2UgaWYgKCFzLT5zLmguc2VnbWVudGF0aW9uLnVwZGF0ZV9tYXAgfHwKKyAgICAgICAgICAgICAgIChzLT5zLmguc2VnbWVudGF0aW9uLnRlbXBvcmFsICYmCisgICAgICAgICAgICAgICAgdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeSh0ZC0+YywKKyAgICAgICAgICAgICAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5wcmVkX3Byb2Jbcy0+YWJvdmVfc2VncHJlZF9jdHhbY29sXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+bGVmdF9zZWdwcmVkX2N0eFtyb3c3XV0pKSkgeworICAgICAgICBpZiAoIXMtPnMuaC5lcnJvcnJlcyAmJiBzLT5zLmZyYW1lc1tSRUZfRlJBTUVfU0VHTUFQXS5zZWdtZW50YXRpb25fbWFwKSB7CisgICAgICAgICAgICBpbnQgcHJlZCA9IDgsIHg7CisgICAgICAgICAgICB1aW50OF90ICpyZWZzZWdtYXAgPSBzLT5zLmZyYW1lc1tSRUZfRlJBTUVfU0VHTUFQXS5zZWdtZW50YXRpb25fbWFwOworCisgICAgICAgICAgICBpZiAoIXMtPnMuZnJhbWVzW1JFRl9GUkFNRV9TRUdNQVBdLnVzZXNfMnBhc3MpCisgICAgICAgICAgICAgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKCZzLT5zLmZyYW1lc1tSRUZfRlJBTUVfU0VHTUFQXS50Ziwgcm93ID4+IDMsIDApOworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4X2Jhc2UgPSAoeSArIHJvdykgKiA4ICogcy0+c2JfY29scyArIGNvbDsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzQ7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IEZGTUlOKHByZWQsIHJlZnNlZ21hcFtpZHhfYmFzZSArIHhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2Fzc2VydDEocHJlZCA8IDgpOworICAgICAgICAgICAgYi0+c2VnX2lkID0gcHJlZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGItPnNlZ19pZCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJnMtPmFib3ZlX3NlZ3ByZWRfY3R4W2NvbF0sIDEsIHc0KTsKKyAgICAgICAgbWVtc2V0KCZ0ZC0+bGVmdF9zZWdwcmVkX2N0eFtyb3c3XSwgMSwgaDQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGItPnNlZ19pZCA9IHZwOF9yYWNfZ2V0X3RyZWUodGQtPmMsIGZmX3ZwOV9zZWdtZW50YXRpb25fdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zLmguc2VnbWVudGF0aW9uLnByb2IpOworCisgICAgICAgIG1lbXNldCgmcy0+YWJvdmVfc2VncHJlZF9jdHhbY29sXSwgMCwgdzQpOworICAgICAgICBtZW1zZXQoJnRkLT5sZWZ0X3NlZ3ByZWRfY3R4W3JvdzddLCAwLCBoNCk7CisgICAgfQorICAgIGlmIChzLT5zLmguc2VnbWVudGF0aW9uLmVuYWJsZWQgJiYKKyAgICAgICAgKHMtPnMuaC5zZWdtZW50YXRpb24udXBkYXRlX21hcCB8fCBzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkpIHsKKyAgICAgICAgc2V0Y3R4XzJkKCZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnNlZ21lbnRhdGlvbl9tYXBbcm93ICogOCAqIHMtPnNiX2NvbHMgKyBjb2xdLAorICAgICAgICAgICAgICAgICAgYnc0LCBiaDQsIDggKiBzLT5zYl9jb2xzLCBiLT5zZWdfaWQpOworICAgIH0KKworICAgIGItPnNraXAgPSBzLT5zLmguc2VnbWVudGF0aW9uLmVuYWJsZWQgJiYKKyAgICAgICAgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ItPnNlZ19pZF0uc2tpcF9lbmFibGVkOworICAgIGlmICghYi0+c2tpcCkgeworICAgICAgICBpbnQgYyA9IHRkLT5sZWZ0X3NraXBfY3R4W3JvdzddICsgcy0+YWJvdmVfc2tpcF9jdHhbY29sXTsKKyAgICAgICAgYi0+c2tpcCA9IHZwNTZfcmFjX2dldF9wcm9iKHRkLT5jLCBzLT5wcm9iLnAuc2tpcFtjXSk7CisgICAgICAgIHRkLT5jb3VudHMuc2tpcFtjXVtiLT5za2lwXSsrOworICAgIH0KKworICAgIGlmIChzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkgeworICAgICAgICBiLT5pbnRyYSA9IDE7CisgICAgfSBlbHNlIGlmIChzLT5zLmguc2VnbWVudGF0aW9uLmVuYWJsZWQgJiYgcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ItPnNlZ19pZF0ucmVmX2VuYWJsZWQpIHsKKyAgICAgICAgYi0+aW50cmEgPSAhcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ItPnNlZ19pZF0ucmVmX3ZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgYywgYml0OworCisgICAgICAgIGlmIChoYXZlX2EgJiYgaGF2ZV9sKSB7CisgICAgICAgICAgICBjID0gcy0+YWJvdmVfaW50cmFfY3R4W2NvbF0gKyB0ZC0+bGVmdF9pbnRyYV9jdHhbcm93N107CisgICAgICAgICAgICBjICs9IChjID09IDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYyA9IGhhdmVfYSA/IDIgKiBzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSA6CisgICAgICAgICAgICAgICAgaGF2ZV9sID8gMiAqIHRkLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSA6IDA7CisgICAgICAgIH0KKyAgICAgICAgYml0ID0gdnA1Nl9yYWNfZ2V0X3Byb2IodGQtPmMsIHMtPnByb2IucC5pbnRyYVtjXSk7CisgICAgICAgIHRkLT5jb3VudHMuaW50cmFbY11bYml0XSsrOworICAgICAgICBiLT5pbnRyYSA9ICFiaXQ7CisgICAgfQorCisgICAgaWYgKChiLT5pbnRyYSB8fCAhYi0+c2tpcCkgJiYgcy0+cy5oLnR4Zm1tb2RlID09IFRYX1NXSVRDSEFCTEUpIHsKKyAgICAgICAgaW50IGM7CisgICAgICAgIGlmIChoYXZlX2EpIHsKKyAgICAgICAgICAgIGlmIChoYXZlX2wpIHsKKyAgICAgICAgICAgICAgICBjID0gKHMtPmFib3ZlX3NraXBfY3R4W2NvbF0gPyBtYXhfdHggOgorICAgICAgICAgICAgICAgICAgICAgcy0+YWJvdmVfdHhmbV9jdHhbY29sXSkgKworICAgICAgICAgICAgICAgICAgICAodGQtPmxlZnRfc2tpcF9jdHhbcm93N10gPyBtYXhfdHggOgorICAgICAgICAgICAgICAgICAgICAgdGQtPmxlZnRfdHhmbV9jdHhbcm93N10pID4gbWF4X3R4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjID0gcy0+YWJvdmVfc2tpcF9jdHhbY29sXSA/IDEgOgorICAgICAgICAgICAgICAgICAgICAocy0+YWJvdmVfdHhmbV9jdHhbY29sXSAqIDIgPiBtYXhfdHgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGhhdmVfbCkgeworICAgICAgICAgICAgYyA9IHRkLT5sZWZ0X3NraXBfY3R4W3JvdzddID8gMSA6CisgICAgICAgICAgICAgICAgKHRkLT5sZWZ0X3R4Zm1fY3R4W3JvdzddICogMiA+IG1heF90eCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjID0gMTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1heF90eCkgeworICAgICAgICBjYXNlIFRYXzMyWDMyOgorICAgICAgICAgICAgYi0+dHggPSB2cDU2X3JhY19nZXRfcHJvYih0ZC0+Yywgcy0+cHJvYi5wLnR4MzJwW2NdWzBdKTsKKyAgICAgICAgICAgIGlmIChiLT50eCkgeworICAgICAgICAgICAgICAgIGItPnR4ICs9IHZwNTZfcmFjX2dldF9wcm9iKHRkLT5jLCBzLT5wcm9iLnAudHgzMnBbY11bMV0pOworICAgICAgICAgICAgICAgIGlmIChiLT50eCA9PSAyKQorICAgICAgICAgICAgICAgICAgICBiLT50eCArPSB2cDU2X3JhY19nZXRfcHJvYih0ZC0+Yywgcy0+cHJvYi5wLnR4MzJwW2NdWzJdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRkLT5jb3VudHMudHgzMnBbY11bYi0+dHhdKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWF8xNlgxNjoKKyAgICAgICAgICAgIGItPnR4ID0gdnA1Nl9yYWNfZ2V0X3Byb2IodGQtPmMsIHMtPnByb2IucC50eDE2cFtjXVswXSk7CisgICAgICAgICAgICBpZiAoYi0+dHgpCisgICAgICAgICAgICAgICAgYi0+dHggKz0gdnA1Nl9yYWNfZ2V0X3Byb2IodGQtPmMsIHMtPnByb2IucC50eDE2cFtjXVsxXSk7CisgICAgICAgICAgICB0ZC0+Y291bnRzLnR4MTZwW2NdW2ItPnR4XSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFhfOFg4OgorICAgICAgICAgICAgYi0+dHggPSB2cDU2X3JhY19nZXRfcHJvYih0ZC0+Yywgcy0+cHJvYi5wLnR4OHBbY10pOworICAgICAgICAgICAgdGQtPmNvdW50cy50eDhwW2NdW2ItPnR4XSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFhfNFg0OgorICAgICAgICAgICAgYi0+dHggPSBUWF80WDQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGItPnR4ID0gRkZNSU4obWF4X3R4LCBzLT5zLmgudHhmbW1vZGUpOworICAgIH0KKworICAgIGlmIChzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkgeworICAgICAgICB1aW50OF90ICphID0gJnMtPmFib3ZlX21vZGVfY3R4W2NvbCAqIDJdOworICAgICAgICB1aW50OF90ICpsID0gJnRkLT5sZWZ0X21vZGVfY3R4Wyhyb3c3KSA8PCAxXTsKKworICAgICAgICBiLT5jb21wID0gMDsKKyAgICAgICAgaWYgKGItPmJzID4gQlNfOHg4KSB7CisgICAgICAgICAgICAvLyBGSVhNRSB0aGUgbWVtb3J5IHN0b3JhZ2UgaW50ZXJtZWRpYXRlcyBoZXJlIGFyZW4ndCByZWFsbHkKKyAgICAgICAgICAgIC8vIG5lY2Vzc2FyeSwgdGhleSdyZSBqdXN0IHRoZXJlIHRvIG1ha2UgdGhlIGNvZGUgc2xpZ2h0bHkKKyAgICAgICAgICAgIC8vIHNpbXBsZXIgZm9yIG5vdworICAgICAgICAgICAgYi0+bW9kZVswXSA9CisgICAgICAgICAgICBhWzBdICAgICAgID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdnA5X2RlZmF1bHRfa2ZfeW1vZGVfcHJvYnNbYVswXV1bbFswXV0pOworICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzh4NCkgeworICAgICAgICAgICAgICAgIGItPm1vZGVbMV0gPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdnA5X2RlZmF1bHRfa2ZfeW1vZGVfcHJvYnNbYVsxXV1bYi0+bW9kZVswXV0pOworICAgICAgICAgICAgICAgIGxbMF0gICAgICAgPQorICAgICAgICAgICAgICAgIGFbMV0gICAgICAgPSBiLT5tb2RlWzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsWzBdICAgICAgID0KKyAgICAgICAgICAgICAgICBhWzFdICAgICAgID0KKyAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gYi0+bW9kZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU180eDgpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0KKyAgICAgICAgICAgICAgICBhWzBdICAgICAgID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzW2FbMF1dW2xbMV1dKTsKKyAgICAgICAgICAgICAgICBpZiAoYi0+YnMgIT0gQlNfOHg0KSB7CisgICAgICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3ZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzW2FbMV1dW2ItPm1vZGVbMl1dKTsKKyAgICAgICAgICAgICAgICAgICAgbFsxXSAgICAgICA9CisgICAgICAgICAgICAgICAgICAgIGFbMV0gICAgICAgPSBiLT5tb2RlWzNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxbMV0gICAgICAgPQorICAgICAgICAgICAgICAgICAgICBhWzFdICAgICAgID0KKyAgICAgICAgICAgICAgICAgICAgYi0+bW9kZVszXSA9IGItPm1vZGVbMl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0gYi0+bW9kZVswXTsKKyAgICAgICAgICAgICAgICBsWzFdICAgICAgID0KKyAgICAgICAgICAgICAgICBhWzFdICAgICAgID0KKyAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gYi0+bW9kZVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGItPm1vZGVbMF0gPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZl92cDlfZGVmYXVsdF9rZl95bW9kZV9wcm9ic1sqYV1bKmxdKTsKKyAgICAgICAgICAgIGItPm1vZGVbM10gPQorICAgICAgICAgICAgYi0+bW9kZVsyXSA9CisgICAgICAgICAgICBiLT5tb2RlWzFdID0gYi0+bW9kZVswXTsKKyAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgY2FuIHByb2JhYmx5IGJlIG9wdGltaXplZAorICAgICAgICAgICAgbWVtc2V0KGEsIGItPm1vZGVbMF0sIGZmX3ZwOV9id2hfdGFiWzBdW2ItPmJzXVswXSk7CisgICAgICAgICAgICBtZW1zZXQobCwgYi0+bW9kZVswXSwgZmZfdnA5X2J3aF90YWJbMF1bYi0+YnNdWzFdKTsKKyAgICAgICAgfQorICAgICAgICBiLT51dm1vZGUgPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdnA5X2RlZmF1bHRfa2ZfdXZtb2RlX3Byb2JzW2ItPm1vZGVbM11dKTsKKyAgICB9IGVsc2UgaWYgKGItPmludHJhKSB7CisgICAgICAgIGItPmNvbXAgPSAwOworICAgICAgICBpZiAoYi0+YnMgPiBCU184eDgpIHsKKyAgICAgICAgICAgIGItPm1vZGVbMF0gPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfaW50cmFtb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlWzBdKTsKKyAgICAgICAgICAgIHRkLT5jb3VudHMueV9tb2RlWzBdW2ItPm1vZGVbMF1dKys7CisgICAgICAgICAgICBpZiAoYi0+YnMgIT0gQlNfOHg0KSB7CisgICAgICAgICAgICAgICAgYi0+bW9kZVsxXSA9IHZwOF9yYWNfZ2V0X3RyZWUodGQtPmMsIGZmX3ZwOV9pbnRyYW1vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlWzBdKTsKKyAgICAgICAgICAgICAgICB0ZC0+Y291bnRzLnlfbW9kZVswXVtiLT5tb2RlWzFdXSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gYi0+bW9kZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU180eDgpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC55X21vZGVbMF0pOworICAgICAgICAgICAgICAgIHRkLT5jb3VudHMueV9tb2RlWzBdW2ItPm1vZGVbMl1dKys7CisgICAgICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzh4NCkgeworICAgICAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAueV9tb2RlWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgdGQtPmNvdW50cy55X21vZGVbMF1bYi0+bW9kZVszXV0rKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gYi0+bW9kZVsyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGItPm1vZGVbMl0gPSBiLT5tb2RlWzBdOworICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2l6ZV9ncm91cFsxMF0gPSB7CisgICAgICAgICAgICAgICAgMywgMywgMywgMywgMiwgMiwgMiwgMSwgMSwgMQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGludCBzeiA9IHNpemVfZ3JvdXBbYi0+YnNdOworCisgICAgICAgICAgICBiLT5tb2RlWzBdID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLnlfbW9kZVtzel0pOworICAgICAgICAgICAgYi0+bW9kZVsxXSA9CisgICAgICAgICAgICBiLT5tb2RlWzJdID0KKyAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzBdOworICAgICAgICAgICAgdGQtPmNvdW50cy55X21vZGVbc3pdW2ItPm1vZGVbM11dKys7CisgICAgICAgIH0KKyAgICAgICAgYi0+dXZtb2RlID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludHJhbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC51dl9tb2RlW2ItPm1vZGVbM11dKTsKKyAgICAgICAgdGQtPmNvdW50cy51dl9tb2RlW2ItPm1vZGVbM11dW2ItPnV2bW9kZV0rKzsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBpbnRlcl9tb2RlX2N0eF9sdXRbMTRdWzE0XSA9IHsKKyAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAorICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCisgICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKKyAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAorICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCisgICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKKyAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAorICAgICAgICAgICAgeyA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA1LCA1LCA1LCA1IH0sCisgICAgICAgICAgICB7IDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDUsIDUsIDUsIDUgfSwKKyAgICAgICAgICAgIHsgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNSwgNSwgNSwgNSB9LAorICAgICAgICAgICAgeyA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCAyLCAyLCAxLCAzIH0sCisgICAgICAgICAgICB7IDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDIsIDIsIDEsIDMgfSwKKyAgICAgICAgICAgIHsgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgMSwgMSwgMCwgMyB9LAorICAgICAgICAgICAgeyA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCA1LCAzLCAzLCAzLCA0IH0sCisgICAgICAgIH07CisKKyAgICAgICAgaWYgKHMtPnMuaC5zZWdtZW50YXRpb24uZW5hYmxlZCAmJiBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5yZWZfZW5hYmxlZCkgeworICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5yZWZfdmFsICE9IDApOworICAgICAgICAgICAgYi0+Y29tcCA9IDA7CisgICAgICAgICAgICBiLT5yZWZbMF0gPSBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5yZWZfdmFsIC0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHJlYWQgY29tcF9wcmVkIGZsYWcKKyAgICAgICAgICAgIGlmIChzLT5zLmguY29tcHByZWRtb2RlICE9IFBSRURfU1dJVENIQUJMRSkgeworICAgICAgICAgICAgICAgIGItPmNvbXAgPSBzLT5zLmguY29tcHByZWRtb2RlID09IFBSRURfQ09NUFJFRjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGM7CisKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBhZGQgaW50cmEgYXMgcmVmPTB4ZmYgKG9yIC0xKSB0byBtYWtlIHRoZXNlIGVhc2llcj8KKyAgICAgICAgICAgICAgICBpZiAoaGF2ZV9hKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXZlX2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdICYmIHRkLT5sZWZ0X2NvbXBfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMiArICh0ZC0+bGVmdF9pbnRyYV9jdHhbcm93N10gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+bGVmdF9yZWZfY3R4W3JvdzddID09IHMtPnMuaC5maXhjb21wcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGQtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMiArIChzLT5hYm92ZV9pbnRyYV9jdHhbY29sXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSBzLT5zLmguZml4Y29tcHJlZik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAoIXMtPmFib3ZlX2ludHJhX2N0eFtjb2xdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gcy0+cy5oLmZpeGNvbXByZWYpIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF0ZC0+bGVmdF9pbnRyYV9jdHhbcm93N10gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5sZWZ0X3JlZl9jdHhbcm93ICYgN10gPT0gcy0+cy5oLmZpeGNvbXByZWYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0gPyAzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICghcy0+YWJvdmVfaW50cmFfY3R4W2NvbF0gJiYgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IHMtPnMuaC5maXhjb21wcmVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZV9sKSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSB0ZC0+bGVmdF9jb21wX2N0eFtyb3c3XSA/IDMgOgorICAgICAgICAgICAgICAgICAgICAoIXRkLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSAmJiB0ZC0+bGVmdF9yZWZfY3R4W3JvdzddID09IHMtPnMuaC5maXhjb21wcmVmKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYi0+Y29tcCA9IHZwNTZfcmFjX2dldF9wcm9iKHRkLT5jLCBzLT5wcm9iLnAuY29tcFtjXSk7CisgICAgICAgICAgICAgICAgdGQtPmNvdW50cy5jb21wW2NdW2ItPmNvbXBdKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlYWQgYWN0dWFsIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIC8vIEZJWE1FIHByb2JhYmx5IGNhY2hlIGEgZmV3IHZhcmlhYmxlcyBoZXJlIHRvIHByZXZlbnQgcmVwZXRpdGl2ZQorICAgICAgICAgICAgLy8gbWVtb3J5IGFjY2Vzc2VzIGJlbG93CisgICAgICAgICAgICBpZiAoYi0+Y29tcCkgeyAvKiB0d28gcmVmZXJlbmNlcyAqLworICAgICAgICAgICAgICAgIGludCBmaXhfaWR4ID0gcy0+cy5oLnNpZ25iaWFzW3MtPnMuaC5maXhjb21wcmVmXSwgdmFyX2lkeCA9ICFmaXhfaWR4LCBjLCBiaXQ7CisKKyAgICAgICAgICAgICAgICBiLT5yZWZbZml4X2lkeF0gPSBzLT5zLmguZml4Y29tcHJlZjsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBjYW4gdGhpcyBjb2RlYmxvYiBiZSByZXBsYWNlZCBieSBzb21lIHNvcnQgb2YgTFVUPworICAgICAgICAgICAgICAgIGlmIChoYXZlX2EpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRkLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAodGQtPmxlZnRfcmVmX2N0eFtyb3c3XSAhPSBzLT5zLmgudmFyY29tcHJlZlsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZC0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdICE9IHMtPnMuaC52YXJjb21wcmVmWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZmwgPSB0ZC0+bGVmdF9yZWZfY3R4W3JvdzddLCByZWZhID0gcy0+YWJvdmVfcmVmX2N0eFtjb2xdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmwgPT0gcmVmYSAmJiByZWZhID09IHMtPnMuaC52YXJjb21wcmVmWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRkLT5sZWZ0X2NvbXBfY3R4W3JvdzddICYmICFzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmVmYSA9PSBzLT5zLmguZml4Y29tcHJlZiAmJiByZWZsID09IHMtPnMuaC52YXJjb21wcmVmWzBdKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlZmwgPT0gcy0+cy5oLmZpeGNvbXByZWYgJiYgcmVmYSA9PSBzLT5zLmgudmFyY29tcHJlZlswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChyZWZhID09IHJlZmwpID8gMyA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0ZC0+bGVmdF9jb21wX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmYSA9PSBzLT5zLmgudmFyY29tcHJlZlsxXSAmJiByZWZsICE9IHMtPnMuaC52YXJjb21wcmVmWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAocmVmbCA9PSBzLT5zLmgudmFyY29tcHJlZlsxXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZhICE9IHMtPnMuaC52YXJjb21wcmVmWzFdKSA/IDIgOiA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcy0+YWJvdmVfY29tcF9jdHhbY29sXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVmbCA9PSBzLT5zLmgudmFyY29tcHJlZlsxXSAmJiByZWZhICE9IHMtPnMuaC52YXJjb21wcmVmWzFdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAocmVmYSA9PSBzLT5zLmgudmFyY29tcHJlZlsxXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZsICE9IHMtPnMuaC52YXJjb21wcmVmWzFdKSA/IDIgOiA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChyZWZsID09IHJlZmEpID8gNCA6IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMyAqIChzLT5hYm92ZV9yZWZfY3R4W2NvbF0gIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXZlX2wpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRkLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGQtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHRkLT5sZWZ0X3JlZl9jdHhbcm93N10gIT0gcy0+cy5oLnZhcmNvbXByZWZbMV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMgKiAodGQtPmxlZnRfcmVmX2N0eFtyb3c3XSAhPSBzLT5zLmgudmFyY29tcHJlZlsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYml0ID0gdnA1Nl9yYWNfZ2V0X3Byb2IodGQtPmMsIHMtPnByb2IucC5jb21wX3JlZltjXSk7CisgICAgICAgICAgICAgICAgYi0+cmVmW3Zhcl9pZHhdID0gcy0+cy5oLnZhcmNvbXByZWZbYml0XTsKKyAgICAgICAgICAgICAgICB0ZC0+Y291bnRzLmNvbXBfcmVmW2NdW2JpdF0rKzsKKyAgICAgICAgICAgIH0gZWxzZSAvKiBzaW5nbGUgcmVmZXJlbmNlICovIHsKKyAgICAgICAgICAgICAgICBpbnQgYml0LCBjOworCisgICAgICAgICAgICAgICAgaWYgKGhhdmVfYSAmJiAhcy0+YWJvdmVfaW50cmFfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfbCAmJiAhdGQtPmxlZnRfaW50cmFfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGQtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+YWJvdmVfY29tcF9jdHhbY29sXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArICghcy0+cy5oLmZpeGNvbXByZWYgfHwgIXRkLT5sZWZ0X3JlZl9jdHhbcm93N10gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXMtPmFib3ZlX3JlZl9jdHhbY29sXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICgzICogIXMtPmFib3ZlX3JlZl9jdHhbY29sXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzLT5zLmguZml4Y29tcHJlZiB8fCAhdGQtPmxlZnRfcmVmX2N0eFtyb3c3XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICgzICogIXRkLT5sZWZ0X3JlZl9jdHhbcm93N10pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFzLT5zLmguZml4Y29tcHJlZiB8fCAhcy0+YWJvdmVfcmVmX2N0eFtjb2xdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDIgKiAhdGQtPmxlZnRfcmVmX2N0eFtyb3c3XSArIDIgKiAhcy0+YWJvdmVfcmVmX2N0eFtjb2xdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArICghcy0+cy5oLmZpeGNvbXByZWYgfHwgIXMtPmFib3ZlX3JlZl9jdHhbY29sXSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqICghcy0+YWJvdmVfcmVmX2N0eFtjb2xdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZV9sICYmICF0ZC0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRkLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGQtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxICsgKCFzLT5zLmguZml4Y29tcHJlZiB8fCAhdGQtPmxlZnRfcmVmX2N0eFtyb3c3XSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqICghdGQtPmxlZnRfcmVmX2N0eFtyb3c3XSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYml0ID0gdnA1Nl9yYWNfZ2V0X3Byb2IodGQtPmMsIHMtPnByb2IucC5zaW5nbGVfcmVmW2NdWzBdKTsKKyAgICAgICAgICAgICAgICB0ZC0+Y291bnRzLnNpbmdsZV9yZWZbY11bMF1bYml0XSsrOworICAgICAgICAgICAgICAgIGlmICghYml0KSB7CisgICAgICAgICAgICAgICAgICAgIGItPnJlZlswXSA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY2FuIHRoaXMgY29kZWJsb2IgYmUgcmVwbGFjZWQgYnkgc29tZSBzb3J0IG9mIExVVD8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVfbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZC0+bGVmdF9pbnRyYV9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAocy0+cy5oLmZpeGNvbXByZWYgPT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcy0+YWJvdmVfcmVmX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+YWJvdmVfaW50cmFfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRkLT5sZWZ0X2ludHJhX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGQtPmxlZnRfY29tcF9jdHhbcm93N10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAxICsgMiAqIChzLT5zLmguZml4Y29tcHJlZiA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPmxlZnRfcmVmX2N0eFtyb3c3XSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGQtPmxlZnRfcmVmX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gNCAqICh0ZC0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5hYm92ZV9jb21wX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZC0+bGVmdF9jb21wX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRkLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gcy0+YWJvdmVfcmVmX2N0eFtjb2xdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMgKiAocy0+cy5oLmZpeGNvbXByZWYgPT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0ZC0+bGVmdF9yZWZfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMSArIDIgKiAocy0+cy5oLmZpeGNvbXByZWYgPT0gMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzICogKHRkLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnMuaC5maXhjb21wcmVmID09IDEgfHwgcy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZC0+bGVmdF9jb21wX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPmFib3ZlX3JlZl9jdHhbY29sXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDEgKyAyICogKHMtPnMuaC5maXhjb21wcmVmID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zLmguZml4Y29tcHJlZiA9PSAxIHx8IHRkLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzLT5hYm92ZV9yZWZfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZC0+bGVmdF9yZWZfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHRkLT5sZWZ0X3JlZl9jdHhbcm93N10gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0ZC0+bGVmdF9yZWZfY3R4W3JvdzddKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSA0ICogKHMtPmFib3ZlX3JlZl9jdHhbY29sXSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMiAqICh0ZC0+bGVmdF9yZWZfY3R4W3JvdzddID09IDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmFib3ZlX2ludHJhX2N0eFtjb2xdIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghcy0+YWJvdmVfY29tcF9jdHhbY29sXSAmJiAhcy0+YWJvdmVfcmVmX2N0eFtjb2xdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmFib3ZlX2NvbXBfY3R4W2NvbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDMgKiAocy0+cy5oLmZpeGNvbXByZWYgPT0gMSB8fCBzLT5hYm92ZV9yZWZfY3R4W2NvbF0gPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQgKiAocy0+YWJvdmVfcmVmX2N0eFtjb2xdID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoYXZlX2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZC0+bGVmdF9pbnRyYV9jdHhbcm93N10gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIXRkLT5sZWZ0X2NvbXBfY3R4W3JvdzddICYmICF0ZC0+bGVmdF9yZWZfY3R4W3JvdzddKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZC0+bGVmdF9jb21wX2N0eFtyb3c3XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAzICogKHMtPnMuaC5maXhjb21wcmVmID09IDEgfHwgdGQtPmxlZnRfcmVmX2N0eFtyb3c3XSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IDQgKiAodGQtPmxlZnRfcmVmX2N0eFtyb3c3XSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKHRkLT5jLCBzLT5wcm9iLnAuc2luZ2xlX3JlZltjXVsxXSk7CisgICAgICAgICAgICAgICAgICAgIHRkLT5jb3VudHMuc2luZ2xlX3JlZltjXVsxXVtiaXRdKys7CisgICAgICAgICAgICAgICAgICAgIGItPnJlZlswXSA9IDEgKyBiaXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGItPmJzIDw9IEJTXzh4OCkgeworICAgICAgICAgICAgaWYgKHMtPnMuaC5zZWdtZW50YXRpb24uZW5hYmxlZCAmJiBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5za2lwX2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzBdID0KKyAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0KKyAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0KKyAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gWkVST01WOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBvZmZbMTBdID0geworICAgICAgICAgICAgICAgICAgICAzLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgbmVlZHMgdG8gdXNlIHRoZSBMVVQgdGFibGVzIGZyb20gZmluZF9yZWZfbXZzCisgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBub3QgYWxsIGFyZSAtMSwwLzAsLTEKKyAgICAgICAgICAgICAgICBpbnQgYyA9IGludGVyX21vZGVfY3R4X2x1dFtzLT5hYm92ZV9tb2RlX2N0eFtjb2wgKyBvZmZbYi0+YnNdXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZC0+bGVmdF9tb2RlX2N0eFtyb3c3ICsgb2ZmW2ItPmJzXV1dOworCisgICAgICAgICAgICAgICAgYi0+bW9kZVswXSA9IHZwOF9yYWNfZ2V0X3RyZWUodGQtPmMsIGZmX3ZwOV9pbnRlcl9tb2RlX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbY10pOworICAgICAgICAgICAgICAgIGItPm1vZGVbMV0gPQorICAgICAgICAgICAgICAgIGItPm1vZGVbMl0gPQorICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzBdOworICAgICAgICAgICAgICAgIHRkLT5jb3VudHMubXZfbW9kZVtjXVtiLT5tb2RlWzBdIC0gMTBdKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+cy5oLmZpbHRlcm1vZGUgPT0gRklMVEVSX1NXSVRDSEFCTEUpIHsKKyAgICAgICAgICAgIGludCBjOworCisgICAgICAgICAgICBpZiAoaGF2ZV9hICYmIHMtPmFib3ZlX21vZGVfY3R4W2NvbF0gPj0gTkVBUkVTVE1WKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhdmVfbCAmJiB0ZC0+bGVmdF9tb2RlX2N0eFtyb3c3XSA+PSBORUFSRVNUTVYpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHMtPmFib3ZlX2ZpbHRlcl9jdHhbY29sXSA9PSB0ZC0+bGVmdF9maWx0ZXJfY3R4W3JvdzddID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5sZWZ0X2ZpbHRlcl9jdHhbcm93N10gOiAzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBzLT5hYm92ZV9maWx0ZXJfY3R4W2NvbF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChoYXZlX2wgJiYgdGQtPmxlZnRfbW9kZV9jdHhbcm93N10gPj0gTkVBUkVTVE1WKSB7CisgICAgICAgICAgICAgICAgYyA9IHRkLT5sZWZ0X2ZpbHRlcl9jdHhbcm93N107CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWx0ZXJfaWQgPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfZmlsdGVyX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5maWx0ZXJbY10pOworICAgICAgICAgICAgdGQtPmNvdW50cy5maWx0ZXJbY11bZmlsdGVyX2lkXSsrOworICAgICAgICAgICAgYi0+ZmlsdGVyID0gZmZfdnA5X2ZpbHRlcl9sdXRbZmlsdGVyX2lkXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGItPmZpbHRlciA9IHMtPnMuaC5maWx0ZXJtb2RlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGItPmJzID4gQlNfOHg4KSB7CisgICAgICAgICAgICBpbnQgYyA9IGludGVyX21vZGVfY3R4X2x1dFtzLT5hYm92ZV9tb2RlX2N0eFtjb2xdXVt0ZC0+bGVmdF9tb2RlX2N0eFtyb3c3XV07CisKKyAgICAgICAgICAgIGItPm1vZGVbMF0gPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfaW50ZXJfbW9kZV90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbY10pOworICAgICAgICAgICAgdGQtPmNvdW50cy5tdl9tb2RlW2NdW2ItPm1vZGVbMF0gLSAxMF0rKzsKKyAgICAgICAgICAgIGZmX3ZwOV9maWxsX212KHRkLCBiLT5tdlswXSwgYi0+bW9kZVswXSwgMCk7CisKKyAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU184eDQpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludGVyX21vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfbW9kZVtjXSk7CisgICAgICAgICAgICAgICAgdGQtPmNvdW50cy5tdl9tb2RlW2NdW2ItPm1vZGVbMV0gLSAxMF0rKzsKKyAgICAgICAgICAgICAgICBmZl92cDlfZmlsbF9tdih0ZCwgYi0+bXZbMV0sIGItPm1vZGVbMV0sIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzFdID0gYi0+bW9kZVswXTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzFdWzBdLCAmYi0+bXZbMF1bMF0pOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMV1bMV0sICZiLT5tdlswXVsxXSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChiLT5icyAhPSBCU180eDgpIHsKKyAgICAgICAgICAgICAgICBiLT5tb2RlWzJdID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludGVyX21vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfbW9kZVtjXSk7CisgICAgICAgICAgICAgICAgdGQtPmNvdW50cy5tdl9tb2RlW2NdW2ItPm1vZGVbMl0gLSAxMF0rKzsKKyAgICAgICAgICAgICAgICBmZl92cDlfZmlsbF9tdih0ZCwgYi0+bXZbMl0sIGItPm1vZGVbMl0sIDIpOworCisgICAgICAgICAgICAgICAgaWYgKGItPmJzICE9IEJTXzh4NCkgeworICAgICAgICAgICAgICAgICAgICBiLT5tb2RlWzNdID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X2ludGVyX21vZGVfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X21vZGVbY10pOworICAgICAgICAgICAgICAgICAgICB0ZC0+Y291bnRzLm12X21vZGVbY11bYi0+bW9kZVszXSAtIDEwXSsrOworICAgICAgICAgICAgICAgICAgICBmZl92cDlfZmlsbF9tdih0ZCwgYi0+bXZbM10sIGItPm1vZGVbM10sIDMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzJdOworICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzNdWzBdLCAmYi0+bXZbMl1bMF0pOworICAgICAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzNdWzFdLCAmYi0+bXZbMl1bMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYi0+bW9kZVsyXSA9IGItPm1vZGVbMF07CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlsyXVswXSwgJmItPm12WzBdWzBdKTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzJdWzFdLCAmYi0+bXZbMF1bMV0pOworICAgICAgICAgICAgICAgIGItPm1vZGVbM10gPSBiLT5tb2RlWzFdOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbM11bMF0sICZiLT5tdlsxXVswXSk7CisgICAgICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlszXVsxXSwgJmItPm12WzFdWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZmX3ZwOV9maWxsX212KHRkLCBiLT5tdlswXSwgYi0+bW9kZVswXSwgLTEpOworICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlsxXVswXSwgJmItPm12WzBdWzBdKTsKKyAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMl1bMF0sICZiLT5tdlswXVswXSk7CisgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzNdWzBdLCAmYi0+bXZbMF1bMF0pOworICAgICAgICAgICAgQVZfQ09QWTMyKCZiLT5tdlsxXVsxXSwgJmItPm12WzBdWzFdKTsKKyAgICAgICAgICAgIEFWX0NPUFkzMigmYi0+bXZbMl1bMV0sICZiLT5tdlswXVsxXSk7CisgICAgICAgICAgICBBVl9DT1BZMzIoJmItPm12WzNdWzFdLCAmYi0+bXZbMF1bMV0pOworICAgICAgICB9CisKKyAgICAgICAgdnJlZiA9IGItPnJlZltiLT5jb21wID8gcy0+cy5oLnNpZ25iaWFzW3MtPnMuaC52YXJjb21wcmVmWzBdXSA6IDBdOworICAgIH0KKworI2lmIEhBVkVfRkFTVF82NEJJVAorI2RlZmluZSBTUExBVF9DVFgodmFyLCB2YWwsIG4pIFwKKyAgICBzd2l0Y2ggKG4pIHsgXAorICAgIGNhc2UgMTogIHZhciA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgIGNhc2UgMjogIEFWX1dOMTZBKCZ2YXIsIHZhbCAqICAgICAgICAgICAgIDB4MDEwMSk7ICAgICBicmVhazsgXAorICAgIGNhc2UgNDogIEFWX1dOMzJBKCZ2YXIsIHZhbCAqICAgICAgICAgMHgwMTAxMDEwMSk7ICAgICBicmVhazsgXAorICAgIGNhc2UgODogIEFWX1dONjRBKCZ2YXIsIHZhbCAqIDB4MDEwMTAxMDEwMTAxMDEwMVVMTCk7ICBicmVhazsgXAorICAgIGNhc2UgMTY6IHsgXAorICAgICAgICB1aW50NjRfdCB2NjQgPSB2YWwgKiAweDAxMDEwMTAxMDEwMTAxMDFVTEw7IFwKKyAgICAgICAgQVZfV042NEEoICAgICAgICAgICAgICAmdmFyLCAgICAgdjY0KTsgXAorICAgICAgICBBVl9XTjY0QSgmKCh1aW50OF90ICopICZ2YXIpWzhdLCB2NjQpOyBcCisgICAgICAgIGJyZWFrOyBcCisgICAgfSBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgU1BMQVRfQ1RYKHZhciwgdmFsLCBuKSBcCisgICAgc3dpdGNoIChuKSB7IFwKKyAgICBjYXNlIDE6ICB2YXIgPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyBcCisgICAgY2FzZSAyOiAgQVZfV04xNkEoJnZhciwgdmFsICogICAgIDB4MDEwMSk7ICBicmVhazsgXAorICAgIGNhc2UgNDogIEFWX1dOMzJBKCZ2YXIsIHZhbCAqIDB4MDEwMTAxMDEpOyAgYnJlYWs7IFwKKyAgICBjYXNlIDg6IHsgXAorICAgICAgICB1aW50MzJfdCB2MzIgPSB2YWwgKiAweDAxMDEwMTAxOyBcCisgICAgICAgIEFWX1dOMzJBKCAgICAgICAgICAgICAgJnZhciwgICAgIHYzMik7IFwKKyAgICAgICAgQVZfV04zMkEoJigodWludDhfdCAqKSAmdmFyKVs0XSwgdjMyKTsgXAorICAgICAgICBicmVhazsgXAorICAgIH0gXAorICAgIGNhc2UgMTY6IHsgXAorICAgICAgICB1aW50MzJfdCB2MzIgPSB2YWwgKiAweDAxMDEwMTAxOyBcCisgICAgICAgIEFWX1dOMzJBKCAgICAgICAgICAgICAgJnZhciwgICAgICB2MzIpOyBcCisgICAgICAgIEFWX1dOMzJBKCYoKHVpbnQ4X3QgKikgJnZhcilbNF0sICB2MzIpOyBcCisgICAgICAgIEFWX1dOMzJBKCYoKHVpbnQ4X3QgKikgJnZhcilbOF0sICB2MzIpOyBcCisgICAgICAgIEFWX1dOMzJBKCYoKHVpbnQ4X3QgKikgJnZhcilbMTJdLCB2MzIpOyBcCisgICAgICAgIGJyZWFrOyBcCisgICAgfSBcCisgICAgfQorI2VuZGlmCisKKyAgICBzd2l0Y2ggKGZmX3ZwOV9id2hfdGFiWzFdW2ItPmJzXVswXSkgeworI2RlZmluZSBTRVRfQ1RYUyhwZXJmLCBkaXIsIG9mZiwgbikgXAorICAgIGRvIHsgXAorICAgICAgICBTUExBVF9DVFgocGVyZi0+ZGlyIyNfc2tpcF9jdHhbb2ZmXSwgICAgICBiLT5za2lwLCAgICAgICAgICBuKTsgXAorICAgICAgICBTUExBVF9DVFgocGVyZi0+ZGlyIyNfdHhmbV9jdHhbb2ZmXSwgICAgICBiLT50eCwgICAgICAgICAgICBuKTsgXAorICAgICAgICBTUExBVF9DVFgocGVyZi0+ZGlyIyNfcGFydGl0aW9uX2N0eFtvZmZdLCBkaXIjI19jdHhbYi0+YnNdLCBuKTsgXAorICAgICAgICBpZiAoIXMtPnMuaC5rZXlmcmFtZSAmJiAhcy0+cy5oLmludHJhb25seSkgeyBcCisgICAgICAgICAgICBTUExBVF9DVFgocGVyZi0+ZGlyIyNfaW50cmFfY3R4W29mZl0sIGItPmludHJhLCAgIG4pOyBcCisgICAgICAgICAgICBTUExBVF9DVFgocGVyZi0+ZGlyIyNfY29tcF9jdHhbb2ZmXSwgIGItPmNvbXAsICAgIG4pOyBcCisgICAgICAgICAgICBTUExBVF9DVFgocGVyZi0+ZGlyIyNfbW9kZV9jdHhbb2ZmXSwgIGItPm1vZGVbM10sIG4pOyBcCisgICAgICAgICAgICBpZiAoIWItPmludHJhKSB7IFwKKyAgICAgICAgICAgICAgICBTUExBVF9DVFgocGVyZi0+ZGlyIyNfcmVmX2N0eFtvZmZdLCB2cmVmLCBuKTsgXAorICAgICAgICAgICAgICAgIGlmIChzLT5zLmguZmlsdGVybW9kZSA9PSBGSUxURVJfU1dJVENIQUJMRSkgeyBcCisgICAgICAgICAgICAgICAgICAgIFNQTEFUX0NUWChwZXJmLT5kaXIjI19maWx0ZXJfY3R4W29mZl0sIGZpbHRlcl9pZCwgbik7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9IHdoaWxlICgwKQorICAgIGNhc2UgMTogU0VUX0NUWFMocywgYWJvdmUsIGNvbCwgMSk7IGJyZWFrOworICAgIGNhc2UgMjogU0VUX0NUWFMocywgYWJvdmUsIGNvbCwgMik7IGJyZWFrOworICAgIGNhc2UgNDogU0VUX0NUWFMocywgYWJvdmUsIGNvbCwgNCk7IGJyZWFrOworICAgIGNhc2UgODogU0VUX0NUWFMocywgYWJvdmUsIGNvbCwgOCk7IGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKGZmX3ZwOV9id2hfdGFiWzFdW2ItPmJzXVsxXSkgeworICAgIGNhc2UgMTogU0VUX0NUWFModGQsIGxlZnQsIHJvdzcsIDEpOyBicmVhazsKKyAgICBjYXNlIDI6IFNFVF9DVFhTKHRkLCBsZWZ0LCByb3c3LCAyKTsgYnJlYWs7CisgICAgY2FzZSA0OiBTRVRfQ1RYUyh0ZCwgbGVmdCwgcm93NywgNCk7IGJyZWFrOworICAgIGNhc2UgODogU0VUX0NUWFModGQsIGxlZnQsIHJvdzcsIDgpOyBicmVhazsKKyAgICB9CisjdW5kZWYgU1BMQVRfQ1RYCisjdW5kZWYgU0VUX0NUWFMKKworICAgIGlmICghcy0+cy5oLmtleWZyYW1lICYmICFzLT5zLmguaW50cmFvbmx5KSB7CisgICAgICAgIGlmIChiLT5icyA+IEJTXzh4OCkgeworICAgICAgICAgICAgaW50IG12MCA9IEFWX1JOMzJBKCZiLT5tdlszXVswXSksIG12MSA9IEFWX1JOMzJBKCZiLT5tdlszXVsxXSk7CisKKyAgICAgICAgICAgIEFWX0NPUFkzMigmdGQtPmxlZnRfbXZfY3R4W3JvdzcgKiAyICsgMF1bMF0sICZiLT5tdlsxXVswXSk7CisgICAgICAgICAgICBBVl9DT1BZMzIoJnRkLT5sZWZ0X212X2N0eFtyb3c3ICogMiArIDBdWzFdLCAmYi0+bXZbMV1bMV0pOworICAgICAgICAgICAgQVZfV04zMkEoJnRkLT5sZWZ0X212X2N0eFtyb3c3ICogMiArIDFdWzBdLCBtdjApOworICAgICAgICAgICAgQVZfV04zMkEoJnRkLT5sZWZ0X212X2N0eFtyb3c3ICogMiArIDFdWzFdLCBtdjEpOworICAgICAgICAgICAgQVZfQ09QWTMyKCZzLT5hYm92ZV9tdl9jdHhbY29sICogMiArIDBdWzBdLCAmYi0+bXZbMl1bMF0pOworICAgICAgICAgICAgQVZfQ09QWTMyKCZzLT5hYm92ZV9tdl9jdHhbY29sICogMiArIDBdWzFdLCAmYi0+bXZbMl1bMV0pOworICAgICAgICAgICAgQVZfV04zMkEoJnMtPmFib3ZlX212X2N0eFtjb2wgKiAyICsgMV1bMF0sIG12MCk7CisgICAgICAgICAgICBBVl9XTjMyQSgmcy0+YWJvdmVfbXZfY3R4W2NvbCAqIDIgKyAxXVsxXSwgbXYxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBuLCBtdjAgPSBBVl9STjMyQSgmYi0+bXZbM11bMF0pLCBtdjEgPSBBVl9STjMyQSgmYi0+bXZbM11bMV0pOworCisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgdzQgKiAyOyBuKyspIHsKKyAgICAgICAgICAgICAgICBBVl9XTjMyQSgmcy0+YWJvdmVfbXZfY3R4W2NvbCAqIDIgKyBuXVswXSwgbXYwKTsKKyAgICAgICAgICAgICAgICBBVl9XTjMyQSgmcy0+YWJvdmVfbXZfY3R4W2NvbCAqIDIgKyBuXVsxXSwgbXYxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBoNCAqIDI7IG4rKykgeworICAgICAgICAgICAgICAgIEFWX1dOMzJBKCZ0ZC0+bGVmdF9tdl9jdHhbcm93NyAqIDIgKyBuXVswXSwgbXYwKTsKKyAgICAgICAgICAgICAgICBBVl9XTjMyQSgmdGQtPmxlZnRfbXZfY3R4W3JvdzcgKiAyICsgbl1bMV0sIG12MSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRSBraW5kYSB1Z2x5CisgICAgZm9yICh5ID0gMDsgeSA8IGg0OyB5KyspIHsKKyAgICAgICAgaW50IHgsIG8gPSAocm93ICsgeSkgKiBzLT5zYl9jb2xzICogOCArIGNvbDsKKyAgICAgICAgVlA5bXZyZWZQYWlyICptdiA9ICZzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLm12W29dOworCisgICAgICAgIGlmIChiLT5pbnRyYSkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc0OyB4KyspIHsKKyAgICAgICAgICAgICAgICBtdlt4XS5yZWZbMF0gPQorICAgICAgICAgICAgICAgIG12W3hdLnJlZlsxXSA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGItPmNvbXApIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3NDsgeCsrKSB7CisgICAgICAgICAgICAgICAgbXZbeF0ucmVmWzBdID0gYi0+cmVmWzBdOworICAgICAgICAgICAgICAgIG12W3hdLnJlZlsxXSA9IGItPnJlZlsxXTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJm12W3hdLm12WzBdLCAmYi0+bXZbM11bMF0pOworICAgICAgICAgICAgICAgIEFWX0NPUFkzMigmbXZbeF0ubXZbMV0sICZiLT5tdlszXVsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzQ7IHgrKykgeworICAgICAgICAgICAgICAgIG12W3hdLnJlZlswXSA9IGItPnJlZlswXTsKKyAgICAgICAgICAgICAgICBtdlt4XS5yZWZbMV0gPSAtMTsKKyAgICAgICAgICAgICAgICBBVl9DT1BZMzIoJm12W3hdLm12WzBdLCAmYi0+bXZbM11bMF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBGSVhNRSBtZXJnZSBjbnQvZW9iIGFyZ3VtZW50cz8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludAorZGVjb2RlX2NvZWZmc19iX2dlbmVyaWMoVlA1NlJhbmdlQ29kZXIgKmMsIGludDE2X3QgKmNvZWYsIGludCBuX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc190eDMyeDMyLCBpbnQgaXM4Yml0c3BlcnBpeGVsLCBpbnQgYnBwLCB1bnNpZ25lZCAoKmNudClbNl1bM10sCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAoKmVvYilbNl1bMl0sIHVpbnQ4X3QgKCpwKVs2XVsxMV0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbm56LCBjb25zdCBpbnQxNl90ICpzY2FuLCBjb25zdCBpbnQxNl90ICgqbmIpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqYmFuZF9jb3VudHMsIGludDE2X3QgKnFtdWwpCit7CisgICAgaW50IGkgPSAwLCBiYW5kID0gMCwgYmFuZF9sZWZ0ID0gYmFuZF9jb3VudHNbYmFuZF07CisgICAgY29uc3QgdWludDhfdCAqdHAgPSBwWzBdW25uel07CisgICAgdWludDhfdCBjYWNoZVsxMDI0XTsKKworICAgIGRvIHsKKyAgICAgICAgaW50IHZhbCwgcmM7CisKKyAgICAgICAgdmFsID0gdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB0cFswXSk7IC8vIGVvYgorICAgICAgICBlb2JbYmFuZF1bbm56XVt2YWxdKys7CisgICAgICAgIGlmICghdmFsKQorICAgICAgICAgICAgYnJlYWs7CisKK3NraXBfZW9iOgorICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbMV0pKSB7IC8vIHplcm8KKyAgICAgICAgICAgIGNudFtiYW5kXVtubnpdWzBdKys7CisgICAgICAgICAgICBpZiAoIS0tYmFuZF9sZWZ0KQorICAgICAgICAgICAgICAgIGJhbmRfbGVmdCA9IGJhbmRfY291bnRzWysrYmFuZF07CisgICAgICAgICAgICBjYWNoZVtzY2FuW2ldXSA9IDA7CisgICAgICAgICAgICBubnogICAgICAgICAgICA9ICgxICsgY2FjaGVbbmJbaV1bMF1dICsgY2FjaGVbbmJbaV1bMV1dKSA+PiAxOworICAgICAgICAgICAgdHAgICAgICAgICAgICAgPSBwW2JhbmRdW25uel07CisgICAgICAgICAgICBpZiAoKytpID09IG5fY29lZmZzKQorICAgICAgICAgICAgICAgIGJyZWFrOyAgLy9pbnZhbGlkIGlucHV0OyBibG9ja3Mgc2hvdWxkIGVuZCB3aXRoIEVPQgorICAgICAgICAgICAgZ290byBza2lwX2VvYjsKKyAgICAgICAgfQorCisgICAgICAgIHJjID0gc2NhbltpXTsKKyAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzJdKSkgeyAvLyBvbmUKKyAgICAgICAgICAgIGNudFtiYW5kXVtubnpdWzFdKys7CisgICAgICAgICAgICB2YWwgICAgICAgPSAxOworICAgICAgICAgICAgY2FjaGVbcmNdID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNudFtiYW5kXVtubnpdWzJdKys7CisgICAgICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbM10pKSB7IC8vIDIsIDMsIDQKKyAgICAgICAgICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbNF0pKSB7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlW3JjXSA9IHZhbCA9IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsICAgICAgID0gMyArIHZwNTZfcmFjX2dldF9wcm9iKGMsIHRwWzVdKTsKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVbcmNdID0gMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzZdKSkgeyAvLyBjYXQxLzIKKyAgICAgICAgICAgICAgICBjYWNoZVtyY10gPSA0OworICAgICAgICAgICAgICAgIGlmICghdnA1Nl9yYWNfZ2V0X3Byb2JfYnJhbmNoeShjLCB0cFs3XSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsICA9ICB2cDU2X3JhY19nZXRfcHJvYihjLCAxNTkpICsgNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB2YWwgID0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE2NSkgPDwgMSkgKyA3OworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gIHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0NSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gY2F0IDMtNgorICAgICAgICAgICAgICAgIGNhY2hlW3JjXSA9IDU7CisgICAgICAgICAgICAgICAgaWYgKCF2cDU2X3JhY19nZXRfcHJvYl9icmFuY2h5KGMsIHRwWzhdKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbOV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgID0gMTEgKyAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTczKSA8PCAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNDgpIDw8IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgIHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgID0gMTkgKyAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTc2KSA8PCAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSAgICAgICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNTUpIDw8IDIpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAgICAgKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MCkgPDwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICAgICAgdnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTM1KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXZwNTZfcmFjX2dldF9wcm9iX2JyYW5jaHkoYywgdHBbMTBdKSkgeworICAgICAgICAgICAgICAgICAgICB2YWwgID0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE4MCkgPDwgNCkgKyAzNTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNTcpIDw8IDMpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MSkgPDwgMik7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTM0KSA8PCAxKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICB2cDU2X3JhY19nZXRfcHJvYihjLCAxMzApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IDY3OworICAgICAgICAgICAgICAgICAgICBpZiAoIWlzOGJpdHNwZXJwaXhlbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJwcCA9PSAxMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSB2cDU2X3JhY19nZXRfcHJvYihjLCAyNTUpIDw8IDE3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSB2cDU2X3JhY19nZXRfcHJvYihjLCAyNTUpIDw8IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9ICAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMjU1KSA8PCAxNSk7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgKz0gICh2cDU2X3JhY19nZXRfcHJvYihjLCAyNTUpIDw8IDE0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB2YWwgKz0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1NCkgPDwgMTMpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1NCkgPDwgMTIpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1NCkgPDwgMTEpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI1MikgPDwgMTApOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDI0OSkgPDwgOSk7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMjQzKSA8PCA4KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICh2cDU2X3JhY19nZXRfcHJvYihjLCAyMzApIDw8IDcpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE5NikgPDwgNik7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTc3KSA8PCA1KTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICh2cDU2X3JhY19nZXRfcHJvYihjLCAxNTMpIDw8IDQpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gKHZwNTZfcmFjX2dldF9wcm9iKGMsIDE0MCkgPDwgMyk7CisgICAgICAgICAgICAgICAgICAgIHZhbCArPSAodnA1Nl9yYWNfZ2V0X3Byb2IoYywgMTMzKSA8PCAyKTsKKyAgICAgICAgICAgICAgICAgICAgdmFsICs9ICh2cDU2X3JhY19nZXRfcHJvYihjLCAxMzApIDw8IDEpOworICAgICAgICAgICAgICAgICAgICB2YWwgKz0gIHZwNTZfcmFjX2dldF9wcm9iKGMsIDEyOSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZGVmaW5lIFNUT1JFX0NPRUYoYywgaSwgdikgZG8geyBcCisgICAgaWYgKGlzOGJpdHNwZXJwaXhlbCkgeyBcCisgICAgICAgIGNbaV0gPSB2OyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBBVl9XTjMyQSgmY1tpICogMl0sIHYpOyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorICAgICAgICBpZiAoIS0tYmFuZF9sZWZ0KQorICAgICAgICAgICAgYmFuZF9sZWZ0ID0gYmFuZF9jb3VudHNbKytiYW5kXTsKKyAgICAgICAgaWYgKGlzX3R4MzJ4MzIpCisgICAgICAgICAgICBTVE9SRV9DT0VGKGNvZWYsIHJjLCAoaW50KSgodnA4X3JhY19nZXQoYykgPyAtdmFsIDogdmFsKSAqICh1bnNpZ25lZClxbXVsWyEhaV0pIC8gMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNUT1JFX0NPRUYoY29lZiwgcmMsICh2cDhfcmFjX2dldChjKSA/IC12YWwgOiB2YWwpICogKHVuc2lnbmVkKXFtdWxbISFpXSk7CisgICAgICAgIG5ueiA9ICgxICsgY2FjaGVbbmJbaV1bMF1dICsgY2FjaGVbbmJbaV1bMV1dKSA+PiAxOworICAgICAgICB0cCA9IHBbYmFuZF1bbm56XTsKKyAgICB9IHdoaWxlICgrK2kgPCBuX2NvZWZmcyk7CisKKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29lZmZzX2JfOGJwcChWUDlUaWxlRGF0YSAqdGQsIGludDE2X3QgKmNvZWYsIGludCBuX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKCpjbnQpWzZdWzNdLCB1bnNpZ25lZCAoKmVvYilbNl1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKCpwKVs2XVsxMV0sIGludCBubnosIGNvbnN0IGludDE2X3QgKnNjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKCpuYilbMl0sIGNvbnN0IGludDE2X3QgKmJhbmRfY291bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpxbXVsKQoreworICAgIHJldHVybiBkZWNvZGVfY29lZmZzX2JfZ2VuZXJpYyh0ZC0+YywgY29lZiwgbl9jb2VmZnMsIDAsIDEsIDgsIGNudCwgZW9iLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubnosIHNjYW4sIG5iLCBiYW5kX2NvdW50cywgcW11bCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2NvZWZmc19iMzJfOGJwcChWUDlUaWxlRGF0YSAqdGQsIGludDE2X3QgKmNvZWYsIGludCBuX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAoKmNudClbNl1bM10sIHVuc2lnbmVkICgqZW9iKVs2XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICgqcClbNl1bMTFdLCBpbnQgbm56LCBjb25zdCBpbnQxNl90ICpzY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKCpuYilbMl0sIGNvbnN0IGludDE2X3QgKmJhbmRfY291bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnFtdWwpCit7CisgICAgcmV0dXJuIGRlY29kZV9jb2VmZnNfYl9nZW5lcmljKHRkLT5jLCBjb2VmLCBuX2NvZWZmcywgMSwgMSwgOCwgY250LCBlb2IsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ueiwgc2NhbiwgbmIsIGJhbmRfY291bnRzLCBxbXVsKTsKK30KKworc3RhdGljIGludCBkZWNvZGVfY29lZmZzX2JfMTZicHAoVlA5VGlsZURhdGEgKnRkLCBpbnQxNl90ICpjb2VmLCBpbnQgbl9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAoKmNudClbNl1bM10sIHVuc2lnbmVkICgqZW9iKVs2XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKCpwKVs2XVsxMV0sIGludCBubnosIGNvbnN0IGludDE2X3QgKnNjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICgqbmIpWzJdLCBjb25zdCBpbnQxNl90ICpiYW5kX2NvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnFtdWwpCit7CisgICAgcmV0dXJuIGRlY29kZV9jb2VmZnNfYl9nZW5lcmljKHRkLT5jLCBjb2VmLCBuX2NvZWZmcywgMCwgMCwgdGQtPnMtPnMuaC5icHAsIGNudCwgZW9iLCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubnosIHNjYW4sIG5iLCBiYW5kX2NvdW50cywgcW11bCk7Cit9CisKK3N0YXRpYyBpbnQgZGVjb2RlX2NvZWZmc19iMzJfMTZicHAoVlA5VGlsZURhdGEgKnRkLCBpbnQxNl90ICpjb2VmLCBpbnQgbl9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICgqY250KVs2XVszXSwgdW5zaWduZWQgKCplb2IpWzZdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICgqcClbNl1bMTFdLCBpbnQgbm56LCBjb25zdCBpbnQxNl90ICpzY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICgqbmIpWzJdLCBjb25zdCBpbnQxNl90ICpiYW5kX2NvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcW11bCkKK3sKKyAgICByZXR1cm4gZGVjb2RlX2NvZWZmc19iX2dlbmVyaWModGQtPmMsIGNvZWYsIG5fY29lZmZzLCAxLCAwLCB0ZC0+cy0+cy5oLmJwcCwgY250LCBlb2IsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ueiwgc2NhbiwgbmIsIGJhbmRfY291bnRzLCBxbXVsKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGRlY29kZV9jb2VmZnMoVlA5VGlsZURhdGEgKnRkLCBpbnQgaXM4Yml0c3BlcnBpeGVsKQoreworICAgIFZQOUNvbnRleHQgKnMgPSB0ZC0+czsKKyAgICBWUDlCbG9jayAqYiA9IHRkLT5iOworICAgIGludCByb3cgPSB0ZC0+cm93LCBjb2wgPSB0ZC0+Y29sOworICAgIHVpbnQ4X3QgKCpwKVs2XVsxMV0gPSBzLT5wcm9iLmNvZWZbYi0+dHhdWzAgLyogeSAqL11bIWItPmludHJhXTsKKyAgICB1bnNpZ25lZCAoKmMpWzZdWzNdID0gdGQtPmNvdW50cy5jb2VmW2ItPnR4XVswIC8qIHkgKi9dWyFiLT5pbnRyYV07CisgICAgdW5zaWduZWQgKCplKVs2XVsyXSA9IHRkLT5jb3VudHMuZW9iW2ItPnR4XVswIC8qIHkgKi9dWyFiLT5pbnRyYV07CisgICAgaW50IHc0ID0gZmZfdnA5X2J3aF90YWJbMV1bYi0+YnNdWzBdIDw8IDEsIGg0ID0gZmZfdnA5X2J3aF90YWJbMV1bYi0+YnNdWzFdIDw8IDE7CisgICAgaW50IGVuZF94ID0gRkZNSU4oMiAqIChzLT5jb2xzIC0gY29sKSwgdzQpOworICAgIGludCBlbmRfeSA9IEZGTUlOKDIgKiAocy0+cm93cyAtIHJvdyksIGg0KTsKKyAgICBpbnQgbiwgcGwsIHgsIHksIHJldDsKKyAgICBpbnQxNl90ICgqcW11bClbMl0gPSBzLT5zLmguc2VnbWVudGF0aW9uLmZlYXRbYi0+c2VnX2lkXS5xbXVsOworICAgIGludCB0eCA9IDQgKiBzLT5zLmgubG9zc2xlc3MgKyBiLT50eDsKKyAgICBjb25zdCBpbnQxNl90ICogY29uc3QgKnlzY2FucyA9IGZmX3ZwOV9zY2Fuc1t0eF07CisgICAgY29uc3QgaW50MTZfdCAoKiBjb25zdCAqIHluYnMpWzJdID0gZmZfdnA5X3NjYW5zX25iW3R4XTsKKyAgICBjb25zdCBpbnQxNl90ICp1dnNjYW4gPSBmZl92cDlfc2NhbnNbYi0+dXZ0eF1bRENUX0RDVF07CisgICAgY29uc3QgaW50MTZfdCAoKnV2bmIpWzJdID0gZmZfdnA5X3NjYW5zX25iW2ItPnV2dHhdW0RDVF9EQ1RdOworICAgIHVpbnQ4X3QgKmEgPSAmcy0+YWJvdmVfeV9ubnpfY3R4W2NvbCAqIDJdOworICAgIHVpbnQ4X3QgKmwgPSAmdGQtPmxlZnRfeV9ubnpfY3R4Wyhyb3cgJiA3KSA8PCAxXTsKKyAgICBzdGF0aWMgY29uc3QgaW50MTZfdCBiYW5kX2NvdW50c1s0XVs4XSA9IHsKKyAgICAgICAgeyAxLCAyLCAzLCA0LCAgMywgICAxNiAtIDEzIH0sCisgICAgICAgIHsgMSwgMiwgMywgNCwgMTEsICAgNjQgLSAyMSB9LAorICAgICAgICB7IDEsIDIsIDMsIDQsIDExLCAgMjU2IC0gMjEgfSwKKyAgICAgICAgeyAxLCAyLCAzLCA0LCAxMSwgMTAyNCAtIDIxIH0sCisgICAgfTsKKyAgICBjb25zdCBpbnQxNl90ICp5X2JhbmRfY291bnRzID0gYmFuZF9jb3VudHNbYi0+dHhdOworICAgIGNvbnN0IGludDE2X3QgKnV2X2JhbmRfY291bnRzID0gYmFuZF9jb3VudHNbYi0+dXZ0eF07CisgICAgaW50IGJ5dGVzcGVycGl4ZWwgPSBpczhiaXRzcGVycGl4ZWwgPyAxIDogMjsKKyAgICBpbnQgdG90YWxfY29lZmYgPSAwOworCisjZGVmaW5lIE1FUkdFKGxhLCBlbmQsIHN0ZXAsIHJkKSBcCisgICAgZm9yIChuID0gMDsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCisgICAgICAgIGxhW25dID0gISFyZCgmbGFbbl0pCisjZGVmaW5lIE1FUkdFX0NUWChzdGVwLCByZCkgXAorICAgIGRvIHsgXAorICAgICAgICBNRVJHRShsLCBlbmRfeSwgc3RlcCwgcmQpOyBcCisgICAgICAgIE1FUkdFKGEsIGVuZF94LCBzdGVwLCByZCk7IFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIERFQ09ERV9ZX0NPRUZfTE9PUChzdGVwLCBtb2RlX2luZGV4LCB2KSBcCisgICAgZm9yIChuID0gMCwgeSA9IDA7IHkgPCBlbmRfeTsgeSArPSBzdGVwKSB7IFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGVuZF94OyB4ICs9IHN0ZXAsIG4gKz0gc3RlcCAqIHN0ZXApIHsgXAorICAgICAgICAgICAgZW51bSBUeGZtVHlwZSB0eHRwID0gZmZfdnA5X2ludHJhX3R4Zm1fdHlwZVtiLT5tb2RlW21vZGVfaW5kZXhdXTsgXAorICAgICAgICAgICAgcmV0ID0gKGlzOGJpdHNwZXJwaXhlbCA/IGRlY29kZV9jb2VmZnNfYiMjdiMjXzhicHAgOiBkZWNvZGVfY29lZmZzX2IjI3YjI18xNmJwcCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRkLCB0ZC0+YmxvY2sgKyAxNiAqIG4gKiBieXRlc3BlcnBpeGVsLCAxNiAqIHN0ZXAgKiBzdGVwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYywgZSwgcCwgYVt4XSArIGxbeV0sIHlzY2Fuc1t0eHRwXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHluYnNbdHh0cF0sIHlfYmFuZF9jb3VudHMsIHFtdWxbMF0pOyBcCisgICAgICAgICAgICBhW3hdID0gbFt5XSA9ICEhcmV0OyBcCisgICAgICAgICAgICB0b3RhbF9jb2VmZiB8PSAhIXJldDsgXAorICAgICAgICAgICAgaWYgKHN0ZXAgPj0gNCkgeyBcCisgICAgICAgICAgICAgICAgQVZfV04xNkEoJnRkLT5lb2Jbbl0sIHJldCk7IFwKKyAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICB0ZC0+ZW9iW25dID0gcmV0OyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZGVmaW5lIFNQTEFUKGxhLCBlbmQsIHN0ZXAsIGNvbmQpIFwKKyAgICBpZiAoc3RlcCA9PSAyKSB7IFwKKyAgICAgICAgZm9yIChuID0gMTsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCisgICAgICAgICAgICBsYVtuXSA9IGxhW24gLSAxXTsgXAorICAgIH0gZWxzZSBpZiAoc3RlcCA9PSA0KSB7IFwKKyAgICAgICAgaWYgKGNvbmQpIHsgXAorICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCisgICAgICAgICAgICAgICAgQVZfV04zMkEoJmxhW25dLCBsYVtuXSAqIDB4MDEwMTAxMDEpOyBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBlbmQ7IG4gKz0gc3RlcCkgXAorICAgICAgICAgICAgICAgIG1lbXNldCgmbGFbbiArIDFdLCBsYVtuXSwgRkZNSU4oZW5kIC0gbiAtIDEsIDMpKTsgXAorICAgICAgICB9IFwKKyAgICB9IGVsc2UgLyogc3RlcCA9PSA4ICovIHsgXAorICAgICAgICBpZiAoY29uZCkgeyBcCisgICAgICAgICAgICBpZiAoSEFWRV9GQVNUXzY0QklUKSB7IFwKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZW5kOyBuICs9IHN0ZXApIFwKKyAgICAgICAgICAgICAgICAgICAgQVZfV042NEEoJmxhW25dLCBsYVtuXSAqIDB4MDEwMTAxMDEwMTAxMDEwMVVMTCk7IFwKKyAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgZW5kOyBuICs9IHN0ZXApIHsgXAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2MzIgPSBsYVtuXSAqIDB4MDEwMTAxMDE7IFwKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEoJmxhW25dLCAgICAgdjMyKTsgXAorICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQSgmbGFbbiArIDRdLCB2MzIpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGVuZDsgbiArPSBzdGVwKSBcCisgICAgICAgICAgICAgICAgbWVtc2V0KCZsYVtuICsgMV0sIGxhW25dLCBGRk1JTihlbmQgLSBuIC0gMSwgNykpOyBcCisgICAgICAgIH0gXAorICAgIH0KKyNkZWZpbmUgU1BMQVRfQ1RYKHN0ZXApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgU1BMQVQoYSwgZW5kX3gsIHN0ZXAsIGVuZF94ID09IHc0KTsgXAorICAgICAgICBTUExBVChsLCBlbmRfeSwgc3RlcCwgZW5kX3kgPT0gaDQpOyBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIC8qIHkgdG9rZW5zICovCisgICAgc3dpdGNoIChiLT50eCkgeworICAgIGNhc2UgVFhfNFg0OgorICAgICAgICBERUNPREVfWV9DT0VGX0xPT1AoMSwgYi0+YnMgPiBCU184eDggPyBuIDogMCwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRYXzhYODoKKyAgICAgICAgTUVSR0VfQ1RYKDIsIEFWX1JOMTZBKTsKKyAgICAgICAgREVDT0RFX1lfQ09FRl9MT09QKDIsIDAsKTsKKyAgICAgICAgU1BMQVRfQ1RYKDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRYXzE2WDE2OgorICAgICAgICBNRVJHRV9DVFgoNCwgQVZfUk4zMkEpOworICAgICAgICBERUNPREVfWV9DT0VGX0xPT1AoNCwgMCwpOworICAgICAgICBTUExBVF9DVFgoNCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVFhfMzJYMzI6CisgICAgICAgIE1FUkdFX0NUWCg4LCBBVl9STjY0QSk7CisgICAgICAgIERFQ09ERV9ZX0NPRUZfTE9PUCg4LCAwLCAzMik7CisgICAgICAgIFNQTEFUX0NUWCg4KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjZGVmaW5lIERFQ09ERV9VVl9DT0VGX0xPT1Aoc3RlcCwgdikgXAorICAgIGZvciAobiA9IDAsIHkgPSAwOyB5IDwgZW5kX3k7IHkgKz0gc3RlcCkgeyBcCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBlbmRfeDsgeCArPSBzdGVwLCBuICs9IHN0ZXAgKiBzdGVwKSB7IFwKKyAgICAgICAgICAgIHJldCA9IChpczhiaXRzcGVycGl4ZWwgPyBkZWNvZGVfY29lZmZzX2IjI3YjI184YnBwIDogZGVjb2RlX2NvZWZmc19iIyN2IyNfMTZicHApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZCwgdGQtPnV2YmxvY2tbcGxdICsgMTYgKiBuICogYnl0ZXNwZXJwaXhlbCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICogc3RlcCAqIHN0ZXAsIGMsIGUsIHAsIGFbeF0gKyBsW3ldLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZzY2FuLCB1dm5iLCB1dl9iYW5kX2NvdW50cywgcW11bFsxXSk7IFwKKyAgICAgICAgICAgIGFbeF0gPSBsW3ldID0gISFyZXQ7IFwKKyAgICAgICAgICAgIHRvdGFsX2NvZWZmIHw9ICEhcmV0OyBcCisgICAgICAgICAgICBpZiAoc3RlcCA+PSA0KSB7IFwKKyAgICAgICAgICAgICAgICBBVl9XTjE2QSgmdGQtPnV2ZW9iW3BsXVtuXSwgcmV0KTsgXAorICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgIHRkLT51dmVvYltwbF1bbl0gPSByZXQ7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICB9CisKKyAgICBwID0gcy0+cHJvYi5jb2VmW2ItPnV2dHhdWzEgLyogdXYgKi9dWyFiLT5pbnRyYV07CisgICAgYyA9IHRkLT5jb3VudHMuY29lZltiLT51dnR4XVsxIC8qIHV2ICovXVshYi0+aW50cmFdOworICAgIGUgPSB0ZC0+Y291bnRzLmVvYltiLT51dnR4XVsxIC8qIHV2ICovXVshYi0+aW50cmFdOworICAgIHc0ID4+PSBzLT5zc19oOworICAgIGVuZF94ID4+PSBzLT5zc19oOworICAgIGg0ID4+PSBzLT5zc192OworICAgIGVuZF95ID4+PSBzLT5zc192OworICAgIGZvciAocGwgPSAwOyBwbCA8IDI7IHBsKyspIHsKKyAgICAgICAgYSA9ICZzLT5hYm92ZV91dl9ubnpfY3R4W3BsXVtjb2wgPDwgIXMtPnNzX2hdOworICAgICAgICBsID0gJnRkLT5sZWZ0X3V2X25uel9jdHhbcGxdWyhyb3cgJiA3KSA8PCAhcy0+c3Nfdl07CisgICAgICAgIHN3aXRjaCAoYi0+dXZ0eCkgeworICAgICAgICBjYXNlIFRYXzRYNDoKKyAgICAgICAgICAgIERFQ09ERV9VVl9DT0VGX0xPT1AoMSwpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFhfOFg4OgorICAgICAgICAgICAgTUVSR0VfQ1RYKDIsIEFWX1JOMTZBKTsKKyAgICAgICAgICAgIERFQ09ERV9VVl9DT0VGX0xPT1AoMiwpOworICAgICAgICAgICAgU1BMQVRfQ1RYKDIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgVFhfMTZYMTY6CisgICAgICAgICAgICBNRVJHRV9DVFgoNCwgQVZfUk4zMkEpOworICAgICAgICAgICAgREVDT0RFX1VWX0NPRUZfTE9PUCg0LCk7CisgICAgICAgICAgICBTUExBVF9DVFgoNCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBUWF8zMlgzMjoKKyAgICAgICAgICAgIE1FUkdFX0NUWCg4LCBBVl9STjY0QSk7CisgICAgICAgICAgICBERUNPREVfVVZfQ09FRl9MT09QKDgsIDMyKTsKKyAgICAgICAgICAgIFNQTEFUX0NUWCg4KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRvdGFsX2NvZWZmOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jb2VmZnNfOGJwcChWUDlUaWxlRGF0YSAqdGQpCit7CisgICAgcmV0dXJuIGRlY29kZV9jb2VmZnModGQsIDEpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9jb2VmZnNfMTZicHAoVlA5VGlsZURhdGEgKnRkKQoreworICAgIHJldHVybiBkZWNvZGVfY29lZmZzKHRkLCAwKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtYXNrX2VkZ2VzKHVpbnQ4X3QgKCptYXNrKVs4XVs0XSwgaW50IHNzX2gsIGludCBzc192LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfYW5kXzcsIGludCBjb2xfYW5kXzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgY29sX2VuZCwgaW50IHJvd19lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBUeGZtTW9kZSB0eCwgaW50IHNraXBfaW50ZXIpCit7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHdpZGVfZmlsdGVyX2NvbF9tYXNrWzJdID0geyAweDExLCAweDAxIH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHdpZGVfZmlsdGVyX3Jvd19tYXNrWzJdID0geyAweDAzLCAweDA3IH07CisKKyAgICAvLyBGSVhNRSBJJ20gcHJldHR5IHN1cmUgYWxsIGxvb3BzIGNhbiBiZSByZXBsYWNlZCBieSBhIHNpbmdsZSBMVVQgaWYKKyAgICAvLyB3ZSBtYWtlIFZQOUZpbHRlci5tYXNrIHVpbnQ2NF90IChpLmUuIHJvdy9jb2wgYWxsIHNpbmdsZSB2YXJpYWJsZSkKKyAgICAvLyBhbmQgbWFrZSB0aGUgTFVUIDUtaW5kZXhlZCAoYmwsIGJwLCBpc191diwgdHggYW5kIHJvdy9jb2wpLCBhbmQgdGhlbgorICAgIC8vIHVzZSByb3dfYW5kXzcvY29sX2FuZF83IGFzIHNoaWZ0cyAoMSpjb2xfYW5kXzcrOCpyb3dfYW5kXzcpCisKKyAgICAvLyB0aGUgaW50ZW5kZWQgYmVoYXZpb3VyIG9mIHRoZSB2cDkgbG9vcGZpbHRlciBpcyB0byB3b3JrIG9uIDgtcGl4ZWwKKyAgICAvLyBlZGdlcy4gVGhpcyBtZWFucyB0aGF0IGZvciBVViwgd2Ugd29yayBvbiB0d28gc3Vic2FtcGxlZCBibG9ja3MgYXQKKyAgICAvLyBhIHRpbWUsIGFuZCB3ZSBvbmx5IHVzZSB0aGUgdG9wbGVmdCBibG9jaydzIG1vZGUgaW5mb3JtYXRpb24gdG8gc2V0CisgICAgLy8gdGhpbmdzIGxpa2UgYmxvY2sgc3RyZW5ndGguIFRodXMsIGZvciBhbnkgYmxvY2sgc2l6ZSBzbWFsbGVyIHRoYW4KKyAgICAvLyAxNngxNiwgaWdub3JlIHRoZSBvZGQgcG9ydGlvbiBvZiB0aGUgYmxvY2suCisgICAgaWYgKHR4ID09IFRYXzRYNCAmJiAoc3NfdiB8IHNzX2gpKSB7CisgICAgICAgIGlmIChoID09IHNzX3YpIHsKKyAgICAgICAgICAgIGlmIChyb3dfYW5kXzcgJiAxKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGlmICghcm93X2VuZCkKKyAgICAgICAgICAgICAgICBoICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHcgPT0gc3NfaCkgeworICAgICAgICAgICAgaWYgKGNvbF9hbmRfNyAmIDEpCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgaWYgKCFjb2xfZW5kKQorICAgICAgICAgICAgICAgIHcgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0eCA9PSBUWF80WDQgJiYgIXNraXBfaW50ZXIpIHsKKyAgICAgICAgaW50IHQgPSAxIDw8IGNvbF9hbmRfNywgbV9jb2wgPSAodCA8PCB3KSAtIHQsIHk7CisgICAgICAgIC8vIG9uIDMyLXB4IGVkZ2VzLCB1c2UgdGhlIDgtcHggd2lkZSBsb29wZmlsdGVyOyBlbHNlLCB1c2UgNC1weCB3aWRlCisgICAgICAgIGludCBtX3Jvd184ID0gbV9jb2wgJiB3aWRlX2ZpbHRlcl9jb2xfbWFza1tzc19oXSwgbV9yb3dfNCA9IG1fY29sIC0gbV9yb3dfODsKKworICAgICAgICBmb3IgKHkgPSByb3dfYW5kXzc7IHkgPCBoICsgcm93X2FuZF83OyB5KyspIHsKKyAgICAgICAgICAgIGludCBjb2xfbWFza19pZCA9IDIgLSAhKHkgJiB3aWRlX2ZpbHRlcl9yb3dfbWFza1tzc192XSk7CisKKyAgICAgICAgICAgIG1hc2tbMF1beV1bMV0gfD0gbV9yb3dfODsKKyAgICAgICAgICAgIG1hc2tbMF1beV1bMl0gfD0gbV9yb3dfNDsKKyAgICAgICAgICAgIC8vIGZvciBvZGQgbGluZXMsIGlmIHRoZSBvZGQgY29sIGlzIG5vdCBiZWluZyBmaWx0ZXJlZCwKKyAgICAgICAgICAgIC8vIHNraXAgb2RkIHJvdyBhbHNvOgorICAgICAgICAgICAgLy8gLi0tLS4gPC0tIGEKKyAgICAgICAgICAgIC8vIHwgICB8CisgICAgICAgICAgICAvLyB8X19ffCA8LS0gYgorICAgICAgICAgICAgLy8gXiAgIF4KKyAgICAgICAgICAgIC8vIGMgICBkCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gaWYgYS9jIGFyZSBldmVuIHJvdy9jb2wgYW5kIGIvZCBhcmUgb2RkLCBhbmQgZCBpcyBza2lwcGVkLAorICAgICAgICAgICAgLy8gZS5nLiByaWdodCBlZGdlIG9mIHNpemUtNjZ4NjYud2VibSwgdGhlbiBza2lwIGIgYWxzbyAoYnVnKQorICAgICAgICAgICAgaWYgKChzc19oICYgc3NfdikgJiYgKGNvbF9lbmQgJiAxKSAmJiAoeSAmIDEpKSB7CisgICAgICAgICAgICAgICAgbWFza1sxXVt5XVtjb2xfbWFza19pZF0gfD0gKHQgPDwgKHcgLSAxKSkgLSB0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtYXNrWzFdW3ldW2NvbF9tYXNrX2lkXSB8PSBtX2NvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3NfaCkKKyAgICAgICAgICAgICAgICBtYXNrWzBdW3ldWzNdIHw9IG1fY29sOworICAgICAgICAgICAgaWYgKCFzc192KSB7CisgICAgICAgICAgICAgICAgaWYgKHNzX2ggJiYgKGNvbF9lbmQgJiAxKSkKKyAgICAgICAgICAgICAgICAgICAgbWFza1sxXVt5XVszXSB8PSAodCA8PCAodyAtIDEpKSAtIHQ7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtYXNrWzFdW3ldWzNdIHw9IG1fY29sOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHksIHQgPSAxIDw8IGNvbF9hbmRfNywgbV9jb2wgPSAodCA8PCB3KSAtIHQ7CisKKyAgICAgICAgaWYgKCFza2lwX2ludGVyKSB7CisgICAgICAgICAgICBpbnQgbWFza19pZCA9ICh0eCA9PSBUWF84WDgpOworICAgICAgICAgICAgaW50IGwyID0gdHggKyBzc19oIC0gMSwgc3RlcDFkOworICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1hc2tzWzRdID0geyAweGZmLCAweDU1LCAweDExLCAweDAxIH07CisgICAgICAgICAgICBpbnQgbV9yb3cgPSBtX2NvbCAmIG1hc2tzW2wyXTsKKworICAgICAgICAgICAgLy8gYXQgb2RkIFVWIGNvbC9yb3cgZWRnZXMgdHgxNi90eDMyIGxvb3BmaWx0ZXIgZWRnZXMsIGZvcmNlCisgICAgICAgICAgICAvLyA4d2QgbG9vcGZpbHRlciB0byBwcmV2ZW50IGdvaW5nIG9mZiB0aGUgdmlzaWJsZSBlZGdlLgorICAgICAgICAgICAgaWYgKHNzX2ggJiYgdHggPiBUWF84WDggJiYgKHcgXiAodyAtIDEpKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgaW50IG1fcm93XzE2ID0gKCh0IDw8ICh3IC0gMSkpIC0gdCkgJiBtYXNrc1tsMl07CisgICAgICAgICAgICAgICAgaW50IG1fcm93XzggPSBtX3JvdyAtIG1fcm93XzE2OworCisgICAgICAgICAgICAgICAgZm9yICh5ID0gcm93X2FuZF83OyB5IDwgaCArIHJvd19hbmRfNzsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1hc2tbMF1beV1bMF0gfD0gbV9yb3dfMTY7CisgICAgICAgICAgICAgICAgICAgIG1hc2tbMF1beV1bMV0gfD0gbV9yb3dfODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzc7IHkrKykKKyAgICAgICAgICAgICAgICAgICAgbWFza1swXVt5XVttYXNrX2lkXSB8PSBtX3JvdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbDIgPSB0eCArIHNzX3YgLSAxOworICAgICAgICAgICAgc3RlcDFkID0gMSA8PCBsMjsKKyAgICAgICAgICAgIGlmIChzc192ICYmIHR4ID4gVFhfOFg4ICYmIChoIF4gKGggLSAxKSkgPT0gMSkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzcgLSAxOyB5ICs9IHN0ZXAxZCkKKyAgICAgICAgICAgICAgICAgICAgbWFza1sxXVt5XVswXSB8PSBtX2NvbDsKKyAgICAgICAgICAgICAgICBpZiAoeSAtIHJvd19hbmRfNyA9PSBoIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgbWFza1sxXVt5XVsxXSB8PSBtX2NvbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gcm93X2FuZF83OyB5IDwgaCArIHJvd19hbmRfNzsgeSArPSBzdGVwMWQpCisgICAgICAgICAgICAgICAgICAgIG1hc2tbMV1beV1bbWFza19pZF0gfD0gbV9jb2w7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHggIT0gVFhfNFg0KSB7CisgICAgICAgICAgICBpbnQgbWFza19pZDsKKworICAgICAgICAgICAgbWFza19pZCA9ICh0eCA9PSBUWF84WDgpIHx8IChoID09IHNzX3YpOworICAgICAgICAgICAgbWFza1sxXVtyb3dfYW5kXzddW21hc2tfaWRdIHw9IG1fY29sOworICAgICAgICAgICAgbWFza19pZCA9ICh0eCA9PSBUWF84WDgpIHx8ICh3ID09IHNzX2gpOworICAgICAgICAgICAgZm9yICh5ID0gcm93X2FuZF83OyB5IDwgaCArIHJvd19hbmRfNzsgeSsrKQorICAgICAgICAgICAgICAgIG1hc2tbMF1beV1bbWFza19pZF0gfD0gdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCB0OCA9IHQgJiB3aWRlX2ZpbHRlcl9jb2xfbWFza1tzc19oXSwgdDQgPSB0IC0gdDg7CisKKyAgICAgICAgICAgIGZvciAoeSA9IHJvd19hbmRfNzsgeSA8IGggKyByb3dfYW5kXzc7IHkrKykgeworICAgICAgICAgICAgICAgIG1hc2tbMF1beV1bMl0gfD0gdDQ7CisgICAgICAgICAgICAgICAgbWFza1swXVt5XVsxXSB8PSB0ODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hc2tbMV1bcm93X2FuZF83XVsyIC0gIShyb3dfYW5kXzcgJiB3aWRlX2ZpbHRlcl9yb3dfbWFza1tzc192XSldIHw9IG1fY29sOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX3ZwOV9kZWNvZGVfYmxvY2soVlA5VGlsZURhdGEgKnRkLCBpbnQgcm93LCBpbnQgY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOUZpbHRlciAqbGZsdmwsIHB0cmRpZmZfdCB5b2ZmLCBwdHJkaWZmX3QgdXZvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBCbG9ja0xldmVsIGJsLCBlbnVtIEJsb2NrUGFydGl0aW9uIGJwKQoreworICAgIFZQOUNvbnRleHQgKnMgPSB0ZC0+czsKKyAgICBWUDlCbG9jayAqYiA9IHRkLT5iOworICAgIGVudW0gQmxvY2tTaXplIGJzID0gYmwgKiAzICsgYnA7CisgICAgaW50IGJ5dGVzcGVycGl4ZWwgPSBzLT5ieXRlc3BlcnBpeGVsOworICAgIGludCB3NCA9IGZmX3ZwOV9id2hfdGFiWzFdW2JzXVswXSwgaDQgPSBmZl92cDlfYndoX3RhYlsxXVtic11bMV0sIGx2bDsKKyAgICBpbnQgZW11WzJdOworICAgIEFWRnJhbWUgKmYgPSBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmY7CisKKyAgICB0ZC0+cm93ID0gcm93OworICAgIHRkLT5yb3c3ID0gcm93ICYgNzsKKyAgICB0ZC0+Y29sID0gY29sOworICAgIHRkLT5jb2w3ID0gY29sICYgNzsKKworICAgIHRkLT5taW5fbXYueCA9IC0oMTI4ICsgY29sICogNjQpOworICAgIHRkLT5taW5fbXYueSA9IC0oMTI4ICsgcm93ICogNjQpOworICAgIHRkLT5tYXhfbXYueCA9IDEyOCArIChzLT5jb2xzIC0gY29sIC0gdzQpICogNjQ7CisgICAgdGQtPm1heF9tdi55ID0gMTI4ICsgKHMtPnJvd3MgLSByb3cgLSBoNCkgKiA2NDsKKworICAgIGlmIChzLT5wYXNzIDwgMikgeworICAgICAgICBiLT5icyA9IGJzOworICAgICAgICBiLT5ibCA9IGJsOworICAgICAgICBiLT5icCA9IGJwOworICAgICAgICBkZWNvZGVfbW9kZSh0ZCk7CisgICAgICAgIGItPnV2dHggPSBiLT50eCAtICgocy0+c3NfaCAmJiB3NCAqIDIgPT0gKDEgPDwgYi0+dHgpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnNzX3YgJiYgaDQgKiAyID09ICgxIDw8IGItPnR4KSkpOworCisgICAgICAgIGlmICghYi0+c2tpcCkgeworICAgICAgICAgICAgaW50IGhhc19jb2VmZnM7CisKKyAgICAgICAgICAgIGlmIChieXRlc3BlcnBpeGVsID09IDEpIHsKKyAgICAgICAgICAgICAgICBoYXNfY29lZmZzID0gZGVjb2RlX2NvZWZmc184YnBwKHRkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFzX2NvZWZmcyA9IGRlY29kZV9jb2VmZnNfMTZicHAodGQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFoYXNfY29lZmZzICYmIGItPmJzIDw9IEJTXzh4OCAmJiAhYi0+aW50cmEpIHsKKyAgICAgICAgICAgICAgICBiLT5za2lwID0gMTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnMtPmFib3ZlX3NraXBfY3R4W2NvbF0sIDEsIHc0KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJnRkLT5sZWZ0X3NraXBfY3R4W3RkLT5yb3c3XSwgMSwgaDQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHJvdzcgPSB0ZC0+cm93NzsKKworI2RlZmluZSBTUExBVF9aRVJPX0NUWCh2LCBuKSBcCisgICAgc3dpdGNoIChuKSB7IFwKKyAgICBjYXNlIDE6ICB2ID0gMDsgICAgICAgICAgYnJlYWs7IFwKKyAgICBjYXNlIDI6ICBBVl9aRVJPMTYoJnYpOyAgYnJlYWs7IFwKKyAgICBjYXNlIDQ6ICBBVl9aRVJPMzIoJnYpOyAgYnJlYWs7IFwKKyAgICBjYXNlIDg6ICBBVl9aRVJPNjQoJnYpOyAgYnJlYWs7IFwKKyAgICBjYXNlIDE2OiBBVl9aRVJPMTI4KCZ2KTsgYnJlYWs7IFwKKyAgICB9CisjZGVmaW5lIFNQTEFUX1pFUk9fWVVWKGRpciwgdmFyLCBvZmYsIG4sIGRpcjIpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgU1BMQVRfWkVST19DVFgoZGlyIyNfeV8jI3ZhcltvZmYgKiAyXSwgbiAqIDIpOyBcCisgICAgICAgIGlmIChzLT5zc18jI2RpcjIpIHsgXAorICAgICAgICAgICAgU1BMQVRfWkVST19DVFgoZGlyIyNfdXZfIyN2YXJbMF1bb2ZmXSwgbik7IFwKKyAgICAgICAgICAgIFNQTEFUX1pFUk9fQ1RYKGRpciMjX3V2XyMjdmFyWzFdW29mZl0sIG4pOyBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIFNQTEFUX1pFUk9fQ1RYKGRpciMjX3V2XyMjdmFyWzBdW29mZiAqIDJdLCBuICogMik7IFwKKyAgICAgICAgICAgIFNQTEFUX1pFUk9fQ1RYKGRpciMjX3V2XyMjdmFyWzFdW29mZiAqIDJdLCBuICogMik7IFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSAoMCkKKworICAgICAgICAgICAgc3dpdGNoICh3NCkgeworICAgICAgICAgICAgY2FzZSAxOiBTUExBVF9aRVJPX1lVVihzLT5hYm92ZSwgbm56X2N0eCwgY29sLCAxLCBoKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IFNQTEFUX1pFUk9fWVVWKHMtPmFib3ZlLCBubnpfY3R4LCBjb2wsIDIsIGgpOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDogU1BMQVRfWkVST19ZVVYocy0+YWJvdmUsIG5uel9jdHgsIGNvbCwgNCwgaCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OiBTUExBVF9aRVJPX1lVVihzLT5hYm92ZSwgbm56X2N0eCwgY29sLCA4LCBoKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGg0KSB7CisgICAgICAgICAgICBjYXNlIDE6IFNQTEFUX1pFUk9fWVVWKHRkLT5sZWZ0LCBubnpfY3R4LCByb3c3LCAxLCB2KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IFNQTEFUX1pFUk9fWVVWKHRkLT5sZWZ0LCBubnpfY3R4LCByb3c3LCAyLCB2KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IFNQTEFUX1pFUk9fWVVWKHRkLT5sZWZ0LCBubnpfY3R4LCByb3c3LCA0LCB2KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg6IFNQTEFUX1pFUk9fWVVWKHRkLT5sZWZ0LCBubnpfY3R4LCByb3c3LCA4LCB2KTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+cGFzcyA9PSAxKSB7CisgICAgICAgICAgICBzLT50ZFswXS5iKys7CisgICAgICAgICAgICBzLT50ZFswXS5ibG9jayArPSB3NCAqIGg0ICogNjQgKiBieXRlc3BlcnBpeGVsOworICAgICAgICAgICAgcy0+dGRbMF0udXZibG9ja1swXSArPSB3NCAqIGg0ICogNjQgKiBieXRlc3BlcnBpeGVsID4+IChzLT5zc19oICsgcy0+c3Nfdik7CisgICAgICAgICAgICBzLT50ZFswXS51dmJsb2NrWzFdICs9IHc0ICogaDQgKiA2NCAqIGJ5dGVzcGVycGl4ZWwgPj4gKHMtPnNzX2ggKyBzLT5zc192KTsKKyAgICAgICAgICAgIHMtPnRkWzBdLmVvYiArPSA0ICogdzQgKiBoNDsKKyAgICAgICAgICAgIHMtPnRkWzBdLnV2ZW9iWzBdICs9IDQgKiB3NCAqIGg0ID4+IChzLT5zc19oICsgcy0+c3Nfdik7CisgICAgICAgICAgICBzLT50ZFswXS51dmVvYlsxXSArPSA0ICogdzQgKiBoNCA+PiAocy0+c3NfaCArIHMtPnNzX3YpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBlbXVsYXRlZCBvdmVyaGFuZ3MgaWYgdGhlIHN0cmlkZSBvZiB0aGUgdGFyZ2V0IGJ1ZmZlciBjYW4ndCBob2xkLiBUaGlzCisgICAgLy8gbWFrZXMgaXQgcG9zc2libGUgdG8gc3VwcG9ydCBlbXUtZWRnZSBhbmQgc28gb24gZXZlbiBpZiB3ZSBoYXZlIGxhcmdlIGJsb2NrCisgICAgLy8gb3ZlcmhhbmdzCisgICAgZW11WzBdID0gKGNvbCArIHc0KSAqIDggKiBieXRlc3BlcnBpeGVsID4gZi0+bGluZXNpemVbMF0gfHwKKyAgICAgICAgICAgICAocm93ICsgaDQpID4gcy0+cm93czsKKyAgICBlbXVbMV0gPSAoKGNvbCArIHc0KSAqIDggPj4gcy0+c3NfaCkgKiBieXRlc3BlcnBpeGVsID4gZi0+bGluZXNpemVbMV0gfHwKKyAgICAgICAgICAgICAocm93ICsgaDQpID4gcy0+cm93czsKKyAgICBpZiAoZW11WzBdKSB7CisgICAgICAgIHRkLT5kc3RbMF0gPSB0ZC0+dG1wX3k7CisgICAgICAgIHRkLT55X3N0cmlkZSA9IDEyODsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZC0+ZHN0WzBdID0gZi0+ZGF0YVswXSArIHlvZmY7CisgICAgICAgIHRkLT55X3N0cmlkZSA9IGYtPmxpbmVzaXplWzBdOworICAgIH0KKyAgICBpZiAoZW11WzFdKSB7CisgICAgICAgIHRkLT5kc3RbMV0gPSB0ZC0+dG1wX3V2WzBdOworICAgICAgICB0ZC0+ZHN0WzJdID0gdGQtPnRtcF91dlsxXTsKKyAgICAgICAgdGQtPnV2X3N0cmlkZSA9IDEyODsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZC0+ZHN0WzFdID0gZi0+ZGF0YVsxXSArIHV2b2ZmOworICAgICAgICB0ZC0+ZHN0WzJdID0gZi0+ZGF0YVsyXSArIHV2b2ZmOworICAgICAgICB0ZC0+dXZfc3RyaWRlID0gZi0+bGluZXNpemVbMV07CisgICAgfQorICAgIGlmIChiLT5pbnRyYSkgeworICAgICAgICBpZiAocy0+cy5oLmJwcCA+IDgpIHsKKyAgICAgICAgICAgIGZmX3ZwOV9pbnRyYV9yZWNvbl8xNmJwcCh0ZCwgeW9mZiwgdXZvZmYpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmZfdnA5X2ludHJhX3JlY29uXzhicHAodGQsIHlvZmYsIHV2b2ZmKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzLT5zLmguYnBwID4gOCkgeworICAgICAgICAgICAgZmZfdnA5X2ludGVyX3JlY29uXzE2YnBwKHRkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZmX3ZwOV9pbnRlcl9yZWNvbl84YnBwKHRkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW11WzBdKSB7CisgICAgICAgIGludCB3ID0gRkZNSU4ocy0+Y29scyAtIGNvbCwgdzQpICogOCwgaCA9IEZGTUlOKHMtPnJvd3MgLSByb3csIGg0KSAqIDgsIG4sIG8gPSAwOworCisgICAgICAgIGZvciAobiA9IDA7IG8gPCB3OyBuKyspIHsKKyAgICAgICAgICAgIGludCBidyA9IDY0ID4+IG47CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDIobiA8PSA0KTsKKyAgICAgICAgICAgIGlmICh3ICYgYncpIHsKKyAgICAgICAgICAgICAgICBzLT5kc3AubWNbbl1bMF1bMF1bMF1bMF0oZi0+ZGF0YVswXSArIHlvZmYgKyBvICogYnl0ZXNwZXJwaXhlbCwgZi0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT50bXBfeSArIG8gKiBieXRlc3BlcnBpeGVsLCAxMjgsIGgsIDAsIDApOworICAgICAgICAgICAgICAgIG8gKz0gYnc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVtdVsxXSkgeworICAgICAgICBpbnQgdyA9IEZGTUlOKHMtPmNvbHMgLSBjb2wsIHc0KSAqIDggPj4gcy0+c3NfaDsKKyAgICAgICAgaW50IGggPSBGRk1JTihzLT5yb3dzIC0gcm93LCBoNCkgKiA4ID4+IHMtPnNzX3YsIG4sIG8gPSAwOworCisgICAgICAgIGZvciAobiA9IHMtPnNzX2g7IG8gPCB3OyBuKyspIHsKKyAgICAgICAgICAgIGludCBidyA9IDY0ID4+IG47CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDIobiA8PSA0KTsKKyAgICAgICAgICAgIGlmICh3ICYgYncpIHsKKyAgICAgICAgICAgICAgICBzLT5kc3AubWNbbl1bMF1bMF1bMF1bMF0oZi0+ZGF0YVsxXSArIHV2b2ZmICsgbyAqIGJ5dGVzcGVycGl4ZWwsIGYtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+dG1wX3V2WzBdICsgbyAqIGJ5dGVzcGVycGl4ZWwsIDEyOCwgaCwgMCwgMCk7CisgICAgICAgICAgICAgICAgcy0+ZHNwLm1jW25dWzBdWzBdWzBdWzBdKGYtPmRhdGFbMl0gKyB1dm9mZiArIG8gKiBieXRlc3BlcnBpeGVsLCBmLT5saW5lc2l6ZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnRtcF91dlsxXSArIG8gKiBieXRlc3BlcnBpeGVsLCAxMjgsIGgsIDAsIDApOworICAgICAgICAgICAgICAgIG8gKz0gYnc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBwaWNrIGZpbHRlciBsZXZlbCBhbmQgZmluZCBlZGdlcyB0byBhcHBseSBmaWx0ZXIgdG8KKyAgICBpZiAocy0+cy5oLmZpbHRlci5sZXZlbCAmJgorICAgICAgICAobHZsID0gcy0+cy5oLnNlZ21lbnRhdGlvbi5mZWF0W2ItPnNlZ19pZF0ubGZsdmxbYi0+aW50cmEgPyAwIDogYi0+cmVmWzBdICsgMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiLT5tb2RlWzNdICE9IFpFUk9NVl0pID4gMCkgeworICAgICAgICBpbnQgeF9lbmQgPSBGRk1JTihzLT5jb2xzIC0gY29sLCB3NCksIHlfZW5kID0gRkZNSU4ocy0+cm93cyAtIHJvdywgaDQpOworICAgICAgICBpbnQgc2tpcF9pbnRlciA9ICFiLT5pbnRyYSAmJiBiLT5za2lwLCBjb2w3ID0gdGQtPmNvbDcsIHJvdzcgPSB0ZC0+cm93NzsKKworICAgICAgICBzZXRjdHhfMmQoJmxmbHZsLT5sZXZlbFtyb3c3ICogOCArIGNvbDddLCB3NCwgaDQsIDgsIGx2bCk7CisgICAgICAgIG1hc2tfZWRnZXMobGZsdmwtPm1hc2tbMF0sIDAsIDAsIHJvdzcsIGNvbDcsIHhfZW5kLCB5X2VuZCwgMCwgMCwgYi0+dHgsIHNraXBfaW50ZXIpOworICAgICAgICBpZiAocy0+c3NfaCB8fCBzLT5zc192KQorICAgICAgICAgICAgbWFza19lZGdlcyhsZmx2bC0+bWFza1sxXSwgcy0+c3NfaCwgcy0+c3Nfdiwgcm93NywgY29sNywgeF9lbmQsIHlfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5jb2xzICYgMSAmJiBjb2wgKyB3NCA+PSBzLT5jb2xzID8gcy0+Y29scyAmIDcgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5yb3dzICYgMSAmJiByb3cgKyBoNCA+PSBzLT5yb3dzID8gcy0+cm93cyAmIDcgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICBiLT51dnR4LCBza2lwX2ludGVyKTsKKyAgICB9CisKKyAgICBpZiAocy0+cGFzcyA9PSAyKSB7CisgICAgICAgIHMtPnRkWzBdLmIrKzsKKyAgICAgICAgcy0+dGRbMF0uYmxvY2sgKz0gdzQgKiBoNCAqIDY0ICogYnl0ZXNwZXJwaXhlbDsKKyAgICAgICAgcy0+dGRbMF0udXZibG9ja1swXSArPSB3NCAqIGg0ICogNjQgKiBieXRlc3BlcnBpeGVsID4+IChzLT5zc192ICsgcy0+c3NfaCk7CisgICAgICAgIHMtPnRkWzBdLnV2YmxvY2tbMV0gKz0gdzQgKiBoNCAqIDY0ICogYnl0ZXNwZXJwaXhlbCA+PiAocy0+c3NfdiArIHMtPnNzX2gpOworICAgICAgICBzLT50ZFswXS5lb2IgKz0gNCAqIHc0ICogaDQ7CisgICAgICAgIHMtPnRkWzBdLnV2ZW9iWzBdICs9IDQgKiB3NCAqIGg0ID4+IChzLT5zc192ICsgcy0+c3NfaCk7CisgICAgICAgIHMtPnRkWzBdLnV2ZW9iWzFdICs9IDQgKiB3NCAqIGg0ID4+IChzLT5zc192ICsgcy0+c3NfaCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlkYXRhLmMgYi9saWJhdmNvZGVjL3ZwOWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWY4YTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92cDlkYXRhLmMKQEAgLTAsMCArMSwyMjQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplIGdtYWlsIGNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidnA5LmgiCisjaW5jbHVkZSAidnA5ZGF0YS5oIgorCitjb25zdCB1aW50OF90IGZmX3ZwOV9id2hfdGFiWzJdW05fQlNfU0laRVNdWzJdID0geworICAgIHsKKyAgICAgICAgeyAxNiwgMTYgfSwgeyAxNiwgOCB9LCB7IDgsIDE2IH0sIHsgOCwgOCB9LCB7IDgsIDQgfSwgeyA0LCA4IH0sCisgICAgICAgIHsgIDQsICA0IH0sIHsgIDQsIDIgfSwgeyAyLCAgNCB9LCB7IDIsIDIgfSwgeyAyLCAxIH0sIHsgMSwgMiB9LCB7IDEsIDEgfSwKKyAgICB9LCB7CisgICAgICAgIHsgIDgsICA4IH0sIHsgIDgsIDQgfSwgeyA0LCAgOCB9LCB7IDQsIDQgfSwgeyA0LCAyIH0sIHsgMiwgNCB9LAorICAgICAgICB7ICAyLCAgMiB9LCB7ICAyLCAxIH0sIHsgMSwgIDIgfSwgeyAxLCAxIH0sIHsgMSwgMSB9LCB7IDEsIDEgfSwgeyAxLCAxIH0sCisgICAgfQorfTsKKworY29uc3QgaW50OF90IGZmX3ZwOV9wYXJ0aXRpb25fdHJlZVszXVsyXSA9IHsKKyAgICB7IC1QQVJUSVRJT05fTk9ORSwgMSB9LCAgICAgICAgICAgICAgICAgICAgICAvLyAnMCcKKyAgICAgICAgeyAtUEFSVElUSU9OX0gsIDIgfSwgICAgICAgICAgICAgICAgICAgICAvLyAnMTAnCisgICAgICAgICAgICB7IC1QQVJUSVRJT05fViwgLVBBUlRJVElPTl9TUExJVCB9LCAgLy8gJzExMCcsICcxMTEnCit9OworCitjb25zdCB1aW50OF90IGZmX3ZwOV9kZWZhdWx0X2tmX3BhcnRpdGlvbl9wcm9ic1s0XVs0XVszXSA9IHsKKyAgICB7IC8qIDY0eDY0IC0+IDMyeDMyICovCisgICAgICAgIHsgMTc0LCAgMzUsICA0OSB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKKyAgICAgICAgeyAgNjgsICAxMSwgIDI3IH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCisgICAgICAgIHsgIDU3LCAgMTUsICAgOSB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAorICAgICAgICB7ICAxMiwgICAzLCAgIDMgfSAvKiBhL2wgYm90aCBzcGxpdCAqLworICAgIH0sIHsgLyogMzJ4MzIgLT4gMTZ4MTYgKi8KKyAgICAgICAgeyAxNTAsICA0MCwgIDM5IH0gLyogYS9sIGJvdGggbm90IHNwbGl0ICovLAorICAgICAgICB7ICA3OCwgIDEyLCAgMjYgfSAvKiBhIHNwbGl0LCBsIG5vdCBzcGxpdCAqLywKKyAgICAgICAgeyAgNjcsICAzMywgIDExIH0gLyogbCBzcGxpdCwgYSBub3Qgc3BsaXQgKi8sCisgICAgICAgIHsgIDI0LCAgIDcsICAgNSB9IC8qIGEvbCBib3RoIHNwbGl0ICovLAorICAgIH0sIHsgLyogMTZ4MTYgLT4gOHg4ICovCisgICAgICAgIHsgMTQ5LCAgNTMsICA1MyB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKKyAgICAgICAgeyAgOTQsICAyMCwgIDQ4IH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCisgICAgICAgIHsgIDgzLCAgNTMsICAyNCB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAorICAgICAgICB7ICA1MiwgIDE4LCAgMTggfSAvKiBhL2wgYm90aCBzcGxpdCAqLywKKyAgICB9LCB7IC8qIDh4OCAtPiA0eDQgKi8KKyAgICAgICAgeyAxNTgsICA5NywgIDk0IH0gLyogYS9sIGJvdGggbm90IHNwbGl0ICovLAorICAgICAgICB7ICA5MywgIDI0LCAgOTkgfSAvKiBhIHNwbGl0LCBsIG5vdCBzcGxpdCAqLywKKyAgICAgICAgeyAgODUsIDExOSwgIDQ0IH0gLyogbCBzcGxpdCwgYSBub3Qgc3BsaXQgKi8sCisgICAgICAgIHsgIDYyLCAgNTksICA2NyB9IC8qIGEvbCBib3RoIHNwbGl0ICovLAorICAgIH0sCit9OworCitjb25zdCBpbnQ4X3QgZmZfdnA5X3NlZ21lbnRhdGlvbl90cmVlWzddWzJdID0geworICAgIHsgMSwgMiB9LAorICAgICAgICB7IDMsIDQgfSwKKyAgICAgICAgeyA1LCA2IH0sCisgICAgICAgICAgICB7IC0wLCAtMSB9LCAgLy8gJzAweCcKKyAgICAgICAgICAgIHsgLTIsIC0zIH0sICAvLyAnMDF4JworICAgICAgICAgICAgeyAtNCwgLTUgfSwgIC8vICcxMHgnCisgICAgICAgICAgICB7IC02LCAtNyB9LCAgLy8gJzExeCcKK307CisKK2NvbnN0IGludDhfdCBmZl92cDlfaW50cmFtb2RlX3RyZWVbOV1bMl0gPSB7CisgICAgeyAtRENfUFJFRCwgMSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJzAnCisgICAgICAgIHsgLVRNX1ZQOF9QUkVELCAyIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJzEwJworICAgICAgICAgICAgeyAtVkVSVF9QUkVELCAzIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICcxMTAnCisgICAgICAgICAgICAgICAgeyA0LCA2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgLUhPUl9QUkVELCA1IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJzExMTAwJworICAgICAgICAgICAgICAgICAgICAgICAgeyAtRElBR19ET1dOX1JJR0hUX1BSRUQsIC1WRVJUX1JJR0hUX1BSRUQgfSwgIC8vICcxMTEwMXgnCisgICAgICAgICAgICAgICAgICAgIHsgLURJQUdfRE9XTl9MRUZUX1BSRUQsIDcgfSwgICAgICAgICAgICAgICAgICAgICAgLy8gJzExMTEwJworICAgICAgICAgICAgICAgICAgICAgICAgeyAtVkVSVF9MRUZUX1BSRUQsIDggfSwgICAgICAgICAgICAgICAgICAgICAgIC8vICcxMTExMTAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAtSE9SX0RPV05fUFJFRCwgLUhPUl9VUF9QUkVEIH0sICAgICAgICAgLy8gJzExMTExMXgnCit9OworCitjb25zdCB1aW50OF90IGZmX3ZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzWzEwXVsxMF1bOV0gPSB7CisgICAgeyAvKiBhYm92ZSA9IHYgKi8KKyAgICAgICAgeyAgNDMsICA0NiwgMTY4LCAxMzQsIDEwNywgMTI4LCAgNjksIDE0MiwgIDkyIH0gLyogbGVmdCA9IHYgKi8sCisgICAgICAgIHsgIDQ0LCAgMjksICA2OCwgMTU5LCAyMDEsIDE3NywgIDUwLCAgNTcsICA3NyB9IC8qIGxlZnQgPSBoICovLAorICAgICAgICB7ICA2MywgIDM2LCAxMjYsIDE0NiwgMTIzLCAxNTgsICA2MCwgIDkwLCAgOTYgfSAvKiBsZWZ0ID0gZGMgKi8sCisgICAgICAgIHsgIDU4LCAgMzgsICA3NiwgMTE0LCAgOTcsIDE3MiwgIDc4LCAxMzMsICA5MiB9IC8qIGxlZnQgPSBkNDUgKi8sCisgICAgICAgIHsgIDQ2LCAgNDEsICA3NiwgMTQwLCAgNjMsIDE4NCwgIDY5LCAxMTIsICA1NyB9IC8qIGxlZnQgPSBkMTM1ICovLAorICAgICAgICB7ICAzOCwgIDMyLCAgODUsIDE0MCwgIDQ2LCAxMTIsICA1NCwgMTUxLCAxMzMgfSAvKiBsZWZ0ID0gZDExNyAqLywKKyAgICAgICAgeyAgMzksICAyNywgIDYxLCAxMzEsIDExMCwgMTc1LCAgNDQsICA3NSwgMTM2IH0gLyogbGVmdCA9IGQxNTMgKi8sCisgICAgICAgIHsgIDQ3LCAgMzUsICA4MCwgMTAwLCAgNzQsIDE0MywgIDY0LCAxNjMsICA3NCB9IC8qIGxlZnQgPSBkNjMgKi8sCisgICAgICAgIHsgIDUyLCAgMzAsICA3NCwgMTEzLCAxMzAsIDE3NSwgIDUxLCAgNjQsICA1OCB9IC8qIGxlZnQgPSBkMjcgKi8sCisgICAgICAgIHsgIDM2LCAgNjEsIDExNiwgMTE0LCAxMjgsIDE2MiwgIDgwLCAxMjUsICA4MiB9IC8qIGxlZnQgPSB0bSAqLworICAgIH0sIHsgLyogYWJvdmUgPSBoICovCisgICAgICAgIHsgIDU1LCAgNDQsICA2OCwgMTY2LCAxNzksIDE5MiwgIDU3LCAgNTcsIDEwOCB9IC8qIGxlZnQgPSB2ICovLAorICAgICAgICB7ICA0MiwgIDI2LCAgMTEsIDE5OSwgMjQxLCAyMjgsICAyMywgIDE1LCAgODUgfSAvKiBsZWZ0ID0gaCAqLywKKyAgICAgICAgeyAgODIsICAyNiwgIDI2LCAxNzEsIDIwOCwgMjA0LCAgNDQsICAzMiwgMTA1IH0gLyogbGVmdCA9IGRjICovLAorICAgICAgICB7ICA2OCwgIDQyLCAgMTksIDEzMSwgMTYwLCAxOTksICA1NSwgIDUyLCAgODMgfSAvKiBsZWZ0ID0gZDQ1ICovLAorICAgICAgICB7ICA1OCwgIDUwLCAgMjUsIDEzOSwgMTE1LCAyMzIsICAzOSwgIDUyLCAxMTggfSAvKiBsZWZ0ID0gZDEzNSAqLywKKyAgICAgICAgeyAgNTAsICAzNSwgIDMzLCAxNTMsIDEwNCwgMTYyLCAgNjQsICA1OSwgMTMxIH0gLyogbGVmdCA9IGQxMTcgKi8sCisgICAgICAgIHsgIDQ0LCAgMjQsICAxNiwgMTUwLCAxNzcsIDIwMiwgIDMzLCAgMTksIDE1NiB9IC8qIGxlZnQgPSBkMTUzICovLAorICAgICAgICB7ICA1MywgIDQ5LCAgMjEsIDExMCwgMTE2LCAxNjgsICA1OSwgIDgwLCAgNzYgfSAvKiBsZWZ0ID0gZDYzICovLAorICAgICAgICB7ICA1NSwgIDI3LCAgMTIsIDE1MywgMjAzLCAyMTgsICAyNiwgIDI3LCAgNDkgfSAvKiBsZWZ0ID0gZDI3ICovLAorICAgICAgICB7ICAzOCwgIDcyLCAgMTksIDE2OCwgMjAzLCAyMTIsICA1MCwgIDUwLCAxMDcgfSAvKiBsZWZ0ID0gdG0gKi8KKyAgICB9LCB7IC8qIGFib3ZlID0gZGMgKi8KKyAgICAgICAgeyAgOTIsICA0NSwgMTAyLCAxMzYsIDExNiwgMTgwLCAgNzQsICA5MCwgMTAwIH0gLyogbGVmdCA9IHYgKi8sCisgICAgICAgIHsgIDczLCAgMzIsICAxOSwgMTg3LCAyMjIsIDIxNSwgIDQ2LCAgMzQsIDEwMCB9IC8qIGxlZnQgPSBoICovLAorICAgICAgICB7IDEzNywgIDMwLCAgNDIsIDE0OCwgMTUxLCAyMDcsICA3MCwgIDUyLCAgOTEgfSAvKiBsZWZ0ID0gZGMgKi8sCisgICAgICAgIHsgIDkxLCAgMzAsICAzMiwgMTE2LCAxMjEsIDE4NiwgIDkzLCAgODYsICA5NCB9IC8qIGxlZnQgPSBkNDUgKi8sCisgICAgICAgIHsgIDcyLCAgMzUsICAzNiwgMTQ5LCAgNjgsIDIwNiwgIDY4LCAgNjMsIDEwNSB9IC8qIGxlZnQgPSBkMTM1ICovLAorICAgICAgICB7ICA3MywgIDMxLCAgMjgsIDEzOCwgIDU3LCAxMjQsICA1NSwgMTIyLCAxNTEgfSAvKiBsZWZ0ID0gZDExNyAqLywKKyAgICAgICAgeyAgNjcsICAyMywgIDIxLCAxNDAsIDEyNiwgMTk3LCAgNDAsICAzNywgMTcxIH0gLyogbGVmdCA9IGQxNTMgKi8sCisgICAgICAgIHsgIDc0LCAgMzIsICAyNywgMTA3LCAgODYsIDE2MCwgIDYzLCAxMzQsIDEwMiB9IC8qIGxlZnQgPSBkNjMgKi8sCisgICAgICAgIHsgIDg2LCAgMjcsICAyOCwgMTI4LCAxNTQsIDIxMiwgIDQ1LCAgNDMsICA1MyB9IC8qIGxlZnQgPSBkMjcgKi8sCisgICAgICAgIHsgIDU5LCAgNjcsICA0NCwgMTQwLCAxNjEsIDIwMiwgIDc4LCAgNjcsIDExOSB9IC8qIGxlZnQgPSB0bSAqLworICAgIH0sIHsgLyogYWJvdmUgPSBkNDUgKi8KKyAgICAgICAgeyAgNTksICAzOCwgIDgzLCAxMTIsIDEwMywgMTYyLCAgOTgsIDEzNiwgIDkwIH0gLyogbGVmdCA9IHYgKi8sCisgICAgICAgIHsgIDYyLCAgMzAsICAyMywgMTU4LCAyMDAsIDIwNywgIDU5LCAgNTcsICA1MCB9IC8qIGxlZnQgPSBoICovLAorICAgICAgICB7IDEwMywgIDI2LCAgMzYsIDEyOSwgMTMyLCAyMDEsICA4MywgIDgwLCAgOTMgfSAvKiBsZWZ0ID0gZGMgKi8sCisgICAgICAgIHsgIDY3LCAgMzAsICAyOSwgIDg0LCAgODYsIDE5MSwgMTAyLCAgOTEsICA1OSB9IC8qIGxlZnQgPSBkNDUgKi8sCisgICAgICAgIHsgIDYwLCAgMzIsICAzMywgMTEyLCAgNzEsIDIyMCwgIDY0LCAgODksIDEwNCB9IC8qIGxlZnQgPSBkMTM1ICovLAorICAgICAgICB7ICA1MywgIDI2LCAgMzQsIDEzMCwgIDU2LCAxNDksICA4NCwgMTIwLCAxMDMgfSAvKiBsZWZ0ID0gZDExNyAqLywKKyAgICAgICAgeyAgNTMsICAyMSwgIDIzLCAxMzMsIDEwOSwgMjEwLCAgNTYsICA3NywgMTcyIH0gLyogbGVmdCA9IGQxNTMgKi8sCisgICAgICAgIHsgIDYxLCAgMjksICAyOSwgIDkzLCAgOTcsIDE2NSwgIDgzLCAxNzUsIDE2MiB9IC8qIGxlZnQgPSBkNjMgKi8sCisgICAgICAgIHsgIDc3LCAgMTksICAyOSwgMTEyLCAxNDIsIDIyOCwgIDU1LCAgNjYsICAzNiB9IC8qIGxlZnQgPSBkMjcgKi8sCisgICAgICAgIHsgIDQ3LCAgNDcsICA0MywgMTE0LCAxMzcsIDE4MSwgMTAwLCAgOTksICA5NSB9IC8qIGxlZnQgPSB0bSAqLworICAgIH0sIHsgLyogYWJvdmUgPSBkMTM1ICovCisgICAgICAgIHsgIDUzLCAgNDAsICA1NSwgMTM5LCAgNjksIDE4MywgIDYxLCAgODAsIDExMCB9IC8qIGxlZnQgPSB2ICovLAorICAgICAgICB7ICA0MCwgIDI5LCAgMTksIDE2MSwgMTgwLCAyMDcsICA0MywgIDI0LCAgOTEgfSAvKiBsZWZ0ID0gaCAqLywKKyAgICAgICAgeyAgNjksICAyMywgIDI5LCAxMjgsICA4MywgMTk5LCAgNDYsICA0NCwgMTAxIH0gLyogbGVmdCA9IGRjICovLAorICAgICAgICB7ICA2MCwgIDM0LCAgMTksIDEwNSwgIDYxLCAxOTgsICA1MywgIDY0LCAgODkgfSAvKiBsZWZ0ID0gZDQ1ICovLAorICAgICAgICB7ICA1MiwgIDMxLCAgMjIsIDE1OCwgIDQwLCAyMDksICA1OCwgIDYyLCAgODkgfSAvKiBsZWZ0ID0gZDEzNSAqLywKKyAgICAgICAgeyAgNDQsICAzMSwgIDI5LCAxNDcsICA0NiwgMTU4LCAgNTYsIDEwMiwgMTk4IH0gLyogbGVmdCA9IGQxMTcgKi8sCisgICAgICAgIHsgIDM1LCAgMTksICAxMiwgMTM1LCAgODcsIDIwOSwgIDQxLCAgNDUsIDE2NyB9IC8qIGxlZnQgPSBkMTUzICovLAorICAgICAgICB7ICA1MSwgIDM4LCAgMjUsIDExMywgIDU4LCAxNjQsICA3MCwgIDkzLCAgOTcgfSAvKiBsZWZ0ID0gZDYzICovLAorICAgICAgICB7ICA1NSwgIDI1LCAgMjEsIDExOCwgIDk1LCAyMTUsICAzOCwgIDM5LCAgNjYgfSAvKiBsZWZ0ID0gZDI3ICovLAorICAgICAgICB7ICA0NywgIDU0LCAgMzQsIDE0NiwgMTA4LCAyMDMsICA3MiwgMTAzLCAxNTEgfSAvKiBsZWZ0ID0gdG0gKi8KKyAgICB9LCB7IC8qIGFib3ZlID0gZDExNyAqLworICAgICAgICB7ICA0NiwgIDI3LCAgODAsIDE1MCwgIDU1LCAxMjQsICA1NSwgMTIxLCAxMzUgfSAvKiBsZWZ0ID0gdiAqLywKKyAgICAgICAgeyAgMzYsICAyMywgIDI3LCAxNjUsIDE0OSwgMTY2LCAgNTQsICA2NCwgMTE4IH0gLyogbGVmdCA9IGggKi8sCisgICAgICAgIHsgIDY0LCAgMTksICAzNywgMTU2LCAgNjYsIDEzOCwgIDQ5LCAgOTUsIDEzMyB9IC8qIGxlZnQgPSBkYyAqLywKKyAgICAgICAgeyAgNTMsICAyMSwgIDM2LCAxMzEsICA2MywgMTYzLCAgNjAsIDEwOSwgIDgxIH0gLyogbGVmdCA9IGQ0NSAqLywKKyAgICAgICAgeyAgNDAsICAyNiwgIDM1LCAxNTQsICA0MCwgMTg1LCAgNTEsICA5NywgMTIzIH0gLyogbGVmdCA9IGQxMzUgKi8sCisgICAgICAgIHsgIDM1LCAgMTksICAzNCwgMTc5LCAgMTksICA5NywgIDQ4LCAxMjksIDEyNCB9IC8qIGxlZnQgPSBkMTE3ICovLAorICAgICAgICB7ICAzNiwgIDIwLCAgMjYsIDEzNiwgIDYyLCAxNjQsICAzMywgIDc3LCAxNTQgfSAvKiBsZWZ0ID0gZDE1MyAqLywKKyAgICAgICAgeyAgNDUsICAyNiwgIDI4LCAxMjksICA0NSwgMTI5LCAgNDksIDE0NywgMTIzIH0gLyogbGVmdCA9IGQ2MyAqLywKKyAgICAgICAgeyAgNDUsICAxOCwgIDMyLCAxMzAsICA5MCwgMTU3LCAgNDAsICA3OSwgIDkxIH0gLyogbGVmdCA9IGQyNyAqLywKKyAgICAgICAgeyAgMzgsICA0NCwgIDUxLCAxMzYsICA3NCwgMTYyLCAgNTcsICA5NywgMTIxIH0gLyogbGVmdCA9IHRtICovCisgICAgfSwgeyAvKiBhYm92ZSA9IGQxNTMgKi8KKyAgICAgICAgeyAgNTYsICAzOSwgIDU4LCAxMzMsIDExNywgMTczLCAgNDgsICA1MywgMTg3IH0gLyogbGVmdCA9IHYgKi8sCisgICAgICAgIHsgIDM1LCAgMjEsICAxMiwgMTYxLCAyMTIsIDIwNywgIDIwLCAgMjMsIDE0NSB9IC8qIGxlZnQgPSBoICovLAorICAgICAgICB7ICA3NSwgIDE3LCAgMjIsIDEzNiwgMTM4LCAxODUsICAzMiwgIDM0LCAxNjYgfSAvKiBsZWZ0ID0gZGMgKi8sCisgICAgICAgIHsgIDU2LCAgMjksICAxOSwgMTE3LCAxMDksIDE4MSwgIDU1LCAgNjgsIDExMiB9IC8qIGxlZnQgPSBkNDUgKi8sCisgICAgICAgIHsgIDQ3LCAgMjksICAxNywgMTUzLCAgNjQsIDIyMCwgIDU5LCAgNTEsIDExNCB9IC8qIGxlZnQgPSBkMTM1ICovLAorICAgICAgICB7ICA0NiwgIDE2LCAgMjQsIDEzNiwgIDc2LCAxNDcsICA0MSwgIDY0LCAxNzIgfSAvKiBsZWZ0ID0gZDExNyAqLywKKyAgICAgICAgeyAgMzQsICAxNywgIDExLCAxMDgsIDE1MiwgMTg3LCAgMTMsICAxNSwgMjA5IH0gLyogbGVmdCA9IGQxNTMgKi8sCisgICAgICAgIHsgIDU1LCAgMzAsICAxOCwgMTIyLCAgNzksIDE3OSwgIDQ0LCAgODgsIDExNiB9IC8qIGxlZnQgPSBkNjMgKi8sCisgICAgICAgIHsgIDUxLCAgMjQsICAxNCwgMTE1LCAxMzMsIDIwOSwgIDMyLCAgMjYsIDEwNCB9IC8qIGxlZnQgPSBkMjcgKi8sCisgICAgICAgIHsgIDM3LCAgNDksICAyNSwgMTI5LCAxNjgsIDE2NCwgIDQxLCAgNTQsIDE0OCB9IC8qIGxlZnQgPSB0bSAqLworICAgIH0sIHsgLyogYWJvdmUgPSBkNjMgKi8KKyAgICAgICAgeyAgNDgsICAzNCwgIDg2LCAxMDEsICA5MiwgMTQ2LCAgNzgsIDE3OSwgMTM0IH0gLyogbGVmdCA9IHYgKi8sCisgICAgICAgIHsgIDQ3LCAgMjIsICAyNCwgMTM4LCAxODcsIDE3OCwgIDY4LCAgNjksICA1OSB9IC8qIGxlZnQgPSBoICovLAorICAgICAgICB7ICA3OCwgIDIzLCAgMzksIDExMSwgMTE3LCAxNzAsICA3NCwgMTI0LCAgOTQgfSAvKiBsZWZ0ID0gZGMgKi8sCisgICAgICAgIHsgIDU2LCAgMjUsICAzMywgMTA1LCAxMTIsIDE4NywgIDk1LCAxNzcsIDEyOSB9IC8qIGxlZnQgPSBkNDUgKi8sCisgICAgICAgIHsgIDQ4LCAgMzEsICAyNywgMTE0LCAgNjMsIDE4MywgIDgyLCAxMTYsICA1NiB9IC8qIGxlZnQgPSBkMTM1ICovLAorICAgICAgICB7ICA0MywgIDI4LCAgMzcsIDEyMSwgIDYzLCAxMjMsICA2MSwgMTkyLCAxNjkgfSAvKiBsZWZ0ID0gZDExNyAqLywKKyAgICAgICAgeyAgNDIsICAxNywgIDI0LCAxMDksICA5NywgMTc3LCAgNTYsICA3NiwgMTIyIH0gLyogbGVmdCA9IGQxNTMgKi8sCisgICAgICAgIHsgIDQ2LCAgMjMsICAzMiwgIDc0LCAgODYsIDE1MCwgIDY3LCAxODMsICA4OCB9IC8qIGxlZnQgPSBkNjMgKi8sCisgICAgICAgIHsgIDU4LCAgMTgsICAyOCwgMTA1LCAxMzksIDE4MiwgIDcwLCAgOTIsICA2MyB9IC8qIGxlZnQgPSBkMjcgKi8sCisgICAgICAgIHsgIDM2LCAgMzgsICA0OCwgIDkyLCAxMjIsIDE2NSwgIDg4LCAxMzcsICA5MSB9IC8qIGxlZnQgPSB0bSAqLworICAgIH0sIHsgLyogYWJvdmUgPSBkMjcgKi8KKyAgICAgICAgeyAgNjIsICA0NCwgIDYxLCAxMjMsIDEwNSwgMTg5LCAgNDgsICA1NywgIDY0IH0gLyogbGVmdCA9IHYgKi8sCisgICAgICAgIHsgIDQ3LCAgMjUsICAxNywgMTc1LCAyMjIsIDIyMCwgIDI0LCAgMzAsICA4NiB9IC8qIGxlZnQgPSBoICovLAorICAgICAgICB7ICA4MiwgIDIyLCAgMzIsIDEyNywgMTQzLCAyMTMsICAzOSwgIDQxLCAgNzAgfSAvKiBsZWZ0ID0gZGMgKi8sCisgICAgICAgIHsgIDY4LCAgMzYsICAxNywgMTA2LCAxMDIsIDIwNiwgIDU5LCAgNzQsICA3NCB9IC8qIGxlZnQgPSBkNDUgKi8sCisgICAgICAgIHsgIDU3LCAgMzksICAyMywgMTUxLCAgNjgsIDIxNiwgIDU1LCAgNjMsICA1OCB9IC8qIGxlZnQgPSBkMTM1ICovLAorICAgICAgICB7ICA0OSwgIDMwLCAgMzUsIDE0MSwgIDcwLCAxNjgsICA4MiwgIDQwLCAxMTUgfSAvKiBsZWZ0ID0gZDExNyAqLywKKyAgICAgICAgeyAgNTEsICAyNSwgIDE1LCAxMzYsIDEyOSwgMjAyLCAgMzgsICAzNSwgMTM5IH0gLyogbGVmdCA9IGQxNTMgKi8sCisgICAgICAgIHsgIDU5LCAgMzksICAxOSwgMTE0LCAgNzUsIDE4MCwgIDc3LCAxMDQsICA0MiB9IC8qIGxlZnQgPSBkNjMgKi8sCisgICAgICAgIHsgIDY4LCAgMjYsICAxNiwgMTExLCAxNDEsIDIxNSwgIDI5LCAgMjgsICAyOCB9IC8qIGxlZnQgPSBkMjcgKi8sCisgICAgICAgIHsgIDQwLCAgNjEsICAyNiwgMTI2LCAxNTIsIDIwNiwgIDYxLCAgNTksICA5MyB9IC8qIGxlZnQgPSB0bSAqLworICAgIH0sIHsgLyogYWJvdmUgPSB0bSAqLworICAgICAgICB7ICA0NCwgIDc4LCAxMTUsIDEzMiwgMTE5LCAxNzMsICA3MSwgMTEyLCAgOTMgfSAvKiBsZWZ0ID0gdiAqLywKKyAgICAgICAgeyAgMzksICAzOCwgIDIxLCAxODQsIDIyNywgMjA2LCAgNDIsICAzMiwgIDY0IH0gLyogbGVmdCA9IGggKi8sCisgICAgICAgIHsgIDY1LCAgNzAsICA2MCwgMTU1LCAxNTksIDE5OSwgIDYxLCAgNjAsICA4MSB9IC8qIGxlZnQgPSBkYyAqLywKKyAgICAgICAgeyAgNTgsICA0NywgIDM2LCAxMjQsIDEzNywgMTkzLCAgODAsICA4MiwgIDc4IH0gLyogbGVmdCA9IGQ0NSAqLywKKyAgICAgICAgeyAgNDksICA1MCwgIDM1LCAxNDQsICA5NSwgMjA1LCAgNjMsICA3OCwgIDU5IH0gLyogbGVmdCA9IGQxMzUgKi8sCisgICAgICAgIHsgIDQxLCAgNTMsICA1MiwgMTQ4LCAgNzEsIDE0MiwgIDY1LCAxMjgsICA1MSB9IC8qIGxlZnQgPSBkMTE3ICovLAorICAgICAgICB7ICA0MCwgIDM2LCAgMjgsIDE0MywgMTQzLCAyMDIsICA0MCwgIDU1LCAxMzcgfSAvKiBsZWZ0ID0gZDE1MyAqLywKKyAgICAgICAgeyAgNDIsICA0NCwgIDQ0LCAxMDQsIDEwNSwgMTY0LCAgNjQsIDEzMCwgIDgwIH0gLyogbGVmdCA9IGQ2MyAqLywKKyAgICAgICAgeyAgNTIsICAzNCwgIDI5LCAxMjksIDE4MywgMjI3LCAgNDIsICAzNSwgIDQzIH0gLyogbGVmdCA9IGQyNyAqLywKKyAgICAgICAgeyAgNDMsICA4MSwgIDUzLCAxNDAsIDE2OSwgMjA0LCAgNjgsICA4NCwgIDcyIH0gLyogbGVmdCA9IHRtICovCisgICAgfQorfTsKKworY29uc3QgdWludDhfdCBmZl92cDlfZGVmYXVsdF9rZl91dm1vZGVfcHJvYnNbMTBdWzldID0geworICAgIHsgMTE4LCAgMTUsIDEyMywgMTQ4LCAxMzEsIDEwMSwgIDQ0LCAgOTMsIDEzMSB9IC8qIHkgPSB2ICovLAorICAgIHsgMTEzLCAgMTIsICAyMywgMTg4LCAyMjYsIDE0MiwgIDI2LCAgMzIsIDEyNSB9IC8qIHkgPSBoICovLAorICAgIHsgMTQ0LCAgMTEsICA1NCwgMTU3LCAxOTUsIDEzMCwgIDQ2LCAgNTgsIDEwOCB9IC8qIHkgPSBkYyAqLywKKyAgICB7IDEyMCwgIDExLCAgNTAsIDEyMywgMTYzLCAxMzUsICA2NCwgIDc3LCAxMDMgfSAvKiB5ID0gZDQ1ICovLAorICAgIHsgMTEzLCAgIDksICAzNiwgMTU1LCAxMTEsIDE1NywgIDMyLCAgNDQsIDE2MSB9IC8qIHkgPSBkMTM1ICovLAorICAgIHsgMTE2LCAgIDksICA1NSwgMTc2LCAgNzYsICA5NiwgIDM3LCAgNjEsIDE0OSB9IC8qIHkgPSBkMTE3ICovLAorICAgIHsgMTE1LCAgIDksICAyOCwgMTQxLCAxNjEsIDE2NywgIDIxLCAgMjUsIDE5MyB9IC8qIHkgPSBkMTUzICovLAorICAgIHsgMTE2LCAgMTIsICA2NCwgMTIwLCAxNDAsIDEyNSwgIDQ5LCAxMTUsIDEyMSB9IC8qIHkgPSBkNjMgKi8sCisgICAgeyAxMjAsICAxMiwgIDMyLCAxNDUsIDE5NSwgMTQyLCAgMzIsICAzOCwgIDg2IH0gLyogeSA9IGQyNyAqLywKKyAgICB7IDEwMiwgIDE5LCAgNjYsIDE2MiwgMTgyLCAxMjIsICAzNSwgIDU5LCAxMjggfSAvKiB5ID0gdG0gKi8KK307CisKK2NvbnN0IGludDhfdCBmZl92cDlfaW50ZXJfbW9kZV90cmVlWzNdWzJdID0geworICAgIHsgLVpFUk9NViwgMSB9LCAgICAgICAgICAgICAgIC8vICcwJworICAgICAgICB7IC1ORUFSRVNUTVYsIDIgfSwgICAgICAgIC8vICcxMCcKKyAgICAgICAgICAgIHsgLU5FQVJNViwgLU5FV01WIH0sICAvLyAnMTF4JworfTsKKworY29uc3QgaW50OF90IGZmX3ZwOV9maWx0ZXJfdHJlZVsyXVsyXSA9IHsKKyAgICB7IC0wLCAgMSB9LCAgICAgLy8gJzAnCisgICAgICAgIHsgLTEsIC0yIH0sIC8vICcxeCcKK307CisKK2NvbnN0IGVudW0gRmlsdGVyTW9kZSBmZl92cDlfZmlsdGVyX2x1dFszXSA9IHsKKyAgICBGSUxURVJfOFRBUF9SRUdVTEFSLAorICAgIEZJTFRFUl84VEFQX1NNT09USCwKKyAgICBGSUxURVJfOFRBUF9TSEFSUCwKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X2RjX3Fsb29rdXBbM11bMjU2XSA9IHsKKyAgICB7CisgICAgICAgICAgICA0LCAgICAgOCwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMiwKKyAgICAgICAgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDE5LAorICAgICAgICAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjYsCisgICAgICAgICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMyLCAgICAzMywKKyAgICAgICAgICAgMzQsICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOCwgICAgMzksICAgIDQwLAorICAgICAgICAgICA0MSwgICAgNDIsICAgIDQzLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwgICAgNDcsCisgICAgICAgICAgIDQ4LCAgICA0OCwgICAgNDksICAgIDUwLCAgICA1MSwgICAgNTIsICAgIDUzLCAgICA1MywKKyAgICAgICAgICAgNTQsICAgIDU1LCAgICA1NiwgICAgNTcsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLAorICAgICAgICAgICA2MSwgICAgNjIsICAgIDYyLCAgICA2MywgICAgNjQsICAgIDY1LCAgICA2NiwgICAgNjYsCisgICAgICAgICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MCwgICAgNzEsICAgIDcyLCAgICA3MywKKyAgICAgICAgICAgNzQsICAgIDc0LCAgICA3NSwgICAgNzYsICAgIDc3LCAgICA3OCwgICAgNzgsICAgIDc5LAorICAgICAgICAgICA4MCwgICAgODEsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDg0LCAgICA4NSwgICAgODUsCisgICAgICAgICAgIDg3LCAgICA4OCwgICAgOTAsICAgIDkyLCAgICA5MywgICAgOTUsICAgIDk2LCAgICA5OCwKKyAgICAgICAgICAgOTksICAgMTAxLCAgIDEwMiwgICAxMDQsICAgMTA1LCAgIDEwNywgICAxMDgsICAgMTEwLAorICAgICAgICAgIDExMSwgICAxMTMsICAgMTE0LCAgIDExNiwgICAxMTcsICAgMTE4LCAgIDEyMCwgICAxMjEsCisgICAgICAgICAgMTIzLCAgIDEyNSwgICAxMjcsICAgMTI5LCAgIDEzMSwgICAxMzQsICAgMTM2LCAgIDEzOCwKKyAgICAgICAgICAxNDAsICAgMTQyLCAgIDE0NCwgICAxNDYsICAgMTQ4LCAgIDE1MCwgICAxNTIsICAgMTU0LAorICAgICAgICAgIDE1NiwgICAxNTgsICAgMTYxLCAgIDE2NCwgICAxNjYsICAgMTY5LCAgIDE3MiwgICAxNzQsCisgICAgICAgICAgMTc3LCAgIDE4MCwgICAxODIsICAgMTg1LCAgIDE4NywgICAxOTAsICAgMTkyLCAgIDE5NSwKKyAgICAgICAgICAxOTksICAgMjAyLCAgIDIwNSwgICAyMDgsICAgMjExLCAgIDIxNCwgICAyMTcsICAgMjIwLAorICAgICAgICAgIDIyMywgICAyMjYsICAgMjMwLCAgIDIzMywgICAyMzcsICAgMjQwLCAgIDI0MywgICAyNDcsCisgICAgICAgICAgMjUwLCAgIDI1MywgICAyNTcsICAgMjYxLCAgIDI2NSwgICAyNjksICAgMjcyLCAgIDI3NiwKKyAgICAgICAgICAyODAsICAgMjg0LCAgIDI4OCwgICAyOTIsICAgMjk2LCAgIDMwMCwgICAzMDQsICAgMzA5LAorICAgICAgICAgIDMxMywgICAzMTcsICAgMzIyLCAgIDMyNiwgICAzMzAsICAgMzM1LCAgIDM0MCwgICAzNDQsCisgICAgICAgICAgMzQ5LCAgIDM1NCwgICAzNTksICAgMzY0LCAgIDM2OSwgICAzNzQsICAgMzc5LCAgIDM4NCwKKyAgICAgICAgICAzODksICAgMzk1LCAgIDQwMCwgICA0MDYsICAgNDExLCAgIDQxNywgICA0MjMsICAgNDI5LAorICAgICAgICAgIDQzNSwgICA0NDEsICAgNDQ3LCAgIDQ1NCwgICA0NjEsICAgNDY3LCAgIDQ3NSwgICA0ODIsCisgICAgICAgICAgNDg5LCAgIDQ5NywgICA1MDUsICAgNTEzLCAgIDUyMiwgICA1MzAsICAgNTM5LCAgIDU0OSwKKyAgICAgICAgICA1NTksICAgNTY5LCAgIDU3OSwgICA1OTAsICAgNjAyLCAgIDYxNCwgICA2MjYsICAgNjQwLAorICAgICAgICAgIDY1NCwgICA2NjgsICAgNjg0LCAgIDcwMCwgICA3MTcsICAgNzM2LCAgIDc1NSwgICA3NzUsCisgICAgICAgICAgNzk2LCAgIDgxOSwgICA4NDMsICAgODY5LCAgIDg5NiwgICA5MjUsICAgOTU1LCAgIDk4OCwKKyAgICAgICAgIDEwMjIsICAxMDU4LCAgMTA5OCwgIDExMzksICAxMTg0LCAgMTIzMiwgIDEyODIsICAxMzM2LAorICAgIH0sIHsKKyAgICAgICAgICAgIDQsICAgICA5LCAgICAxMCwgICAgMTMsICAgIDE1LCAgICAxNywgICAgMjAsICAgIDIyLAorICAgICAgICAgICAyNSwgICAgMjgsICAgIDMxLCAgICAzNCwgICAgMzcsICAgIDQwLCAgICA0MywgICAgNDcsCisgICAgICAgICAgIDUwLCAgICA1MywgICAgNTcsICAgIDYwLCAgICA2NCwgICAgNjgsICAgIDcxLCAgICA3NSwKKyAgICAgICAgICAgNzgsICAgIDgyLCAgICA4NiwgICAgOTAsICAgIDkzLCAgICA5NywgICAxMDEsICAgMTA1LAorICAgICAgICAgIDEwOSwgICAxMTMsICAgMTE2LCAgIDEyMCwgICAxMjQsICAgMTI4LCAgIDEzMiwgICAxMzYsCisgICAgICAgICAgMTQwLCAgIDE0MywgICAxNDcsICAgMTUxLCAgIDE1NSwgICAxNTksICAgMTYzLCAgIDE2NiwKKyAgICAgICAgICAxNzAsICAgMTc0LCAgIDE3OCwgICAxODIsICAgMTg1LCAgIDE4OSwgICAxOTMsICAgMTk3LAorICAgICAgICAgIDIwMCwgICAyMDQsICAgMjA4LCAgIDIxMiwgICAyMTUsICAgMjE5LCAgIDIyMywgICAyMjYsCisgICAgICAgICAgMjMwLCAgIDIzMywgICAyMzcsICAgMjQxLCAgIDI0NCwgICAyNDgsICAgMjUxLCAgIDI1NSwKKyAgICAgICAgICAyNTksICAgMjYyLCAgIDI2NiwgICAyNjksICAgMjczLCAgIDI3NiwgICAyODAsICAgMjgzLAorICAgICAgICAgIDI4NywgICAyOTAsICAgMjkzLCAgIDI5NywgICAzMDAsICAgMzA0LCAgIDMwNywgICAzMTAsCisgICAgICAgICAgMzE0LCAgIDMxNywgICAzMjEsICAgMzI0LCAgIDMyNywgICAzMzEsICAgMzM0LCAgIDMzNywKKyAgICAgICAgICAzNDMsICAgMzUwLCAgIDM1NiwgICAzNjIsICAgMzY5LCAgIDM3NSwgICAzODEsICAgMzg3LAorICAgICAgICAgIDM5NCwgICA0MDAsICAgNDA2LCAgIDQxMiwgICA0MTgsICAgNDI0LCAgIDQzMCwgICA0MzYsCisgICAgICAgICAgNDQyLCAgIDQ0OCwgICA0NTQsICAgNDYwLCAgIDQ2NiwgICA0NzIsICAgNDc4LCAgIDQ4NCwKKyAgICAgICAgICA0OTAsICAgNDk5LCAgIDUwNywgICA1MTYsICAgNTI1LCAgIDUzMywgICA1NDIsICAgNTUwLAorICAgICAgICAgIDU1OSwgICA1NjcsICAgNTc2LCAgIDU4NCwgICA1OTIsICAgNjAxLCAgIDYwOSwgICA2MTcsCisgICAgICAgICAgNjI1LCAgIDYzNCwgICA2NDQsICAgNjU1LCAgIDY2NiwgICA2NzYsICAgNjg3LCAgIDY5OCwKKyAgICAgICAgICA3MDgsICAgNzE4LCAgIDcyOSwgICA3MzksICAgNzQ5LCAgIDc1OSwgICA3NzAsICAgNzgyLAorICAgICAgICAgIDc5NSwgICA4MDcsICAgODE5LCAgIDgzMSwgICA4NDQsICAgODU2LCAgIDg2OCwgICA4ODAsCisgICAgICAgICAgODkxLCAgIDkwNiwgICA5MjAsICAgOTMzLCAgIDk0NywgICA5NjEsICAgOTc1LCAgIDk4OCwKKyAgICAgICAgIDEwMDEsICAxMDE1LCAgMTAzMCwgIDEwNDUsICAxMDYxLCAgMTA3NiwgIDEwOTAsICAxMTA1LAorICAgICAgICAgMTEyMCwgIDExMzcsICAxMTUzLCAgMTE3MCwgIDExODYsICAxMjAyLCAgMTIxOCwgIDEyMzYsCisgICAgICAgICAxMjUzLCAgMTI3MSwgIDEyODgsICAxMzA2LCAgMTMyMywgIDEzNDIsICAxMzYxLCAgMTM3OSwKKyAgICAgICAgIDEzOTgsICAxNDE2LCAgMTQzNiwgIDE0NTYsICAxNDc2LCAgMTQ5NiwgIDE1MTYsICAxNTM3LAorICAgICAgICAgMTU1OSwgIDE1ODAsICAxNjAxLCAgMTYyNCwgIDE2NDcsICAxNjcwLCAgMTY5MiwgIDE3MTcsCisgICAgICAgICAxNzQxLCAgMTc2NiwgIDE3OTEsICAxODE3LCAgMTg0NCwgIDE4NzEsICAxOTAwLCAgMTkyOSwKKyAgICAgICAgIDE5NTgsICAxOTkwLCAgMjAyMSwgIDIwNTQsICAyMDg4LCAgMjEyMywgIDIxNTksICAyMTk3LAorICAgICAgICAgMjIzNiwgIDIyNzYsICAyMzE5LCAgMjM2MywgIDI0MTAsICAyNDU4LCAgMjUwOCwgIDI1NjEsCisgICAgICAgICAyNjE2LCAgMjY3NSwgIDI3MzcsICAyODAyLCAgMjg3MSwgIDI5NDQsICAzMDIwLCAgMzEwMiwKKyAgICAgICAgIDMxODgsICAzMjgwLCAgMzM3NSwgIDM0NzgsICAzNTg2LCAgMzcwMiwgIDM4MjMsICAzOTUzLAorICAgICAgICAgNDA4OSwgIDQyMzYsICA0Mzk0LCAgNDU1OSwgIDQ3MzcsICA0OTI5LCAgNTEzMCwgIDUzNDcsCisgICAgfSwgeworICAgICAgICAgICAgNCwgICAgMTIsICAgIDE4LCAgICAyNSwgICAgMzMsICAgIDQxLCAgICA1MCwgICAgNjAsCisgICAgICAgICAgIDcwLCAgICA4MCwgICAgOTEsICAgMTAzLCAgIDExNSwgICAxMjcsICAgMTQwLCAgIDE1MywKKyAgICAgICAgICAxNjYsICAgMTgwLCAgIDE5NCwgICAyMDgsICAgMjIyLCAgIDIzNywgICAyNTEsICAgMjY2LAorICAgICAgICAgIDI4MSwgICAyOTYsICAgMzEyLCAgIDMyNywgICAzNDMsICAgMzU4LCAgIDM3NCwgICAzOTAsCisgICAgICAgICAgNDA1LCAgIDQyMSwgICA0MzcsICAgNDUzLCAgIDQ2OSwgICA0ODQsICAgNTAwLCAgIDUxNiwKKyAgICAgICAgICA1MzIsICAgNTQ4LCAgIDU2NCwgICA1ODAsICAgNTk2LCAgIDYxMSwgICA2MjcsICAgNjQzLAorICAgICAgICAgIDY1OSwgICA2NzQsICAgNjkwLCAgIDcwNiwgICA3MjEsICAgNzM3LCAgIDc1MiwgICA3NjgsCisgICAgICAgICAgNzgzLCAgIDc5OCwgICA4MTQsICAgODI5LCAgIDg0NCwgICA4NTksICAgODc0LCAgIDg4OSwKKyAgICAgICAgICA5MDQsICAgOTE5LCAgIDkzNCwgICA5NDksICAgOTY0LCAgIDk3OCwgICA5OTMsICAxMDA4LAorICAgICAgICAgMTAyMiwgIDEwMzcsICAxMDUxLCAgMTA2NSwgIDEwODAsICAxMDk0LCAgMTEwOCwgIDExMjIsCisgICAgICAgICAxMTM2LCAgMTE1MSwgIDExNjUsICAxMTc5LCAgMTE5MiwgIDEyMDYsICAxMjIwLCAgMTIzNCwKKyAgICAgICAgIDEyNDgsICAxMjYxLCAgMTI3NSwgIDEyODgsICAxMzAyLCAgMTMxNSwgIDEzMjksICAxMzQyLAorICAgICAgICAgMTM2OCwgIDEzOTMsICAxNDE5LCAgMTQ0NCwgIDE0NjksICAxNDk0LCAgMTUxOSwgIDE1NDQsCisgICAgICAgICAxNTY5LCAgMTU5NCwgIDE2MTgsICAxNjQzLCAgMTY2OCwgIDE2OTIsICAxNzE3LCAgMTc0MSwKKyAgICAgICAgIDE3NjUsICAxNzg5LCAgMTgxNCwgIDE4MzgsICAxODYyLCAgMTg4NSwgIDE5MDksICAxOTMzLAorICAgICAgICAgMTk1NywgIDE5OTIsICAyMDI3LCAgMjA2MSwgIDIwOTYsICAyMTMwLCAgMjE2NSwgIDIxOTksCisgICAgICAgICAyMjMzLCAgMjI2NywgIDIzMDAsICAyMzM0LCAgMjM2NywgIDI0MDAsICAyNDM0LCAgMjQ2NywKKyAgICAgICAgIDI0OTksICAyNTMyLCAgMjU3NSwgIDI2MTgsICAyNjYxLCAgMjcwNCwgIDI3NDYsICAyNzg4LAorICAgICAgICAgMjgzMCwgIDI4NzIsICAyOTEzLCAgMjk1NCwgIDI5OTUsICAzMDM2LCAgMzA3NiwgIDMxMjcsCisgICAgICAgICAzMTc3LCAgMzIyNiwgIDMyNzUsICAzMzI0LCAgMzM3MywgIDM0MjEsICAzNDY5LCAgMzUxNywKKyAgICAgICAgIDM1NjUsICAzNjIxLCAgMzY3NywgIDM3MzMsICAzNzg4LCAgMzg0MywgIDM4OTcsICAzOTUxLAorICAgICAgICAgNDAwNSwgIDQwNTgsICA0MTE5LCAgNDE4MSwgIDQyNDEsICA0MzAxLCAgNDM2MSwgIDQ0MjAsCisgICAgICAgICA0NDc5LCAgNDU0NiwgIDQ2MTIsICA0Njc3LCAgNDc0MiwgIDQ4MDcsICA0ODcxLCAgNDk0MiwKKyAgICAgICAgIDUwMTMsICA1MDgzLCAgNTE1MywgIDUyMjIsICA1MjkxLCAgNTM2NywgIDU0NDIsICA1NTE3LAorICAgICAgICAgNTU5MSwgIDU2NjUsICA1NzQ1LCAgNTgyNSwgIDU5MDUsICA1OTg0LCAgNjA2MywgIDYxNDksCisgICAgICAgICA2MjM0LCAgNjMxOSwgIDY0MDQsICA2NDk1LCAgNjU4NywgIDY2NzgsICA2NzY5LCAgNjg2NywKKyAgICAgICAgIDY5NjYsICA3MDY0LCAgNzE2MywgIDcyNjksICA3Mzc2LCAgNzQ4MywgIDc1OTksICA3NzE1LAorICAgICAgICAgNzgzMiwgIDc5NTgsICA4MDg1LCAgODIxNCwgIDgzNTIsICA4NDkyLCAgODYzNSwgIDg3ODgsCisgICAgICAgICA4OTQ1LCAgOTEwNCwgIDkyNzUsICA5NDUwLCAgOTYzOSwgIDk4MzIsIDEwMDMxLCAxMDI0NSwKKyAgICAgICAgMTA0NjUsIDEwNzAyLCAxMDk0NiwgMTEyMTAsIDExNDgyLCAxMTc3NiwgMTIwODEsIDEyNDA5LAorICAgICAgICAxMjc1MCwgMTMxMTgsIDEzNTAxLCAxMzkxMywgMTQzNDMsIDE0ODA3LCAxNTI5MCwgMTU4MTIsCisgICAgICAgIDE2MzU2LCAxNjk0MywgMTc1NzUsIDE4MjM3LCAxODk0OSwgMTk3MTgsIDIwNTIxLCAyMTM4NywKKyAgICB9Cit9OworCitjb25zdCBpbnQxNl90IGZmX3ZwOV9hY19xbG9va3VwWzNdWzI1Nl0gPSB7CisgICAgeworICAgICAgICAgICAgNCwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsCisgICAgICAgICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwKKyAgICAgICAgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLAorICAgICAgICAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsCisgICAgICAgICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwKKyAgICAgICAgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LAorICAgICAgICAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsCisgICAgICAgICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwKKyAgICAgICAgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LAorICAgICAgICAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDg0LCAgICA4NSwgICAgODYsCisgICAgICAgICAgIDg3LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwKKyAgICAgICAgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLAorICAgICAgICAgIDEwNCwgICAxMDYsICAgMTA4LCAgIDExMCwgICAxMTIsICAgMTE0LCAgIDExNiwgICAxMTgsCisgICAgICAgICAgMTIwLCAgIDEyMiwgICAxMjQsICAgMTI2LCAgIDEyOCwgICAxMzAsICAgMTMyLCAgIDEzNCwKKyAgICAgICAgICAxMzYsICAgMTM4LCAgIDE0MCwgICAxNDIsICAgMTQ0LCAgIDE0NiwgICAxNDgsICAgMTUwLAorICAgICAgICAgIDE1MiwgICAxNTUsICAgMTU4LCAgIDE2MSwgICAxNjQsICAgMTY3LCAgIDE3MCwgICAxNzMsCisgICAgICAgICAgMTc2LCAgIDE3OSwgICAxODIsICAgMTg1LCAgIDE4OCwgICAxOTEsICAgMTk0LCAgIDE5NywKKyAgICAgICAgICAyMDAsICAgMjAzLCAgIDIwNywgICAyMTEsICAgMjE1LCAgIDIxOSwgICAyMjMsICAgMjI3LAorICAgICAgICAgIDIzMSwgICAyMzUsICAgMjM5LCAgIDI0MywgICAyNDcsICAgMjUxLCAgIDI1NSwgICAyNjAsCisgICAgICAgICAgMjY1LCAgIDI3MCwgICAyNzUsICAgMjgwLCAgIDI4NSwgICAyOTAsICAgMjk1LCAgIDMwMCwKKyAgICAgICAgICAzMDUsICAgMzExLCAgIDMxNywgICAzMjMsICAgMzI5LCAgIDMzNSwgICAzNDEsICAgMzQ3LAorICAgICAgICAgIDM1MywgICAzNTksICAgMzY2LCAgIDM3MywgICAzODAsICAgMzg3LCAgIDM5NCwgICA0MDEsCisgICAgICAgICAgNDA4LCAgIDQxNiwgICA0MjQsICAgNDMyLCAgIDQ0MCwgICA0NDgsICAgNDU2LCAgIDQ2NSwKKyAgICAgICAgICA0NzQsICAgNDgzLCAgIDQ5MiwgICA1MDEsICAgNTEwLCAgIDUyMCwgICA1MzAsICAgNTQwLAorICAgICAgICAgIDU1MCwgICA1NjAsICAgNTcxLCAgIDU4MiwgICA1OTMsICAgNjA0LCAgIDYxNSwgICA2MjcsCisgICAgICAgICAgNjM5LCAgIDY1MSwgICA2NjMsICAgNjc2LCAgIDY4OSwgICA3MDIsICAgNzE1LCAgIDcyOSwKKyAgICAgICAgICA3NDMsICAgNzU3LCAgIDc3MSwgICA3ODYsICAgODAxLCAgIDgxNiwgICA4MzIsICAgODQ4LAorICAgICAgICAgIDg2NCwgICA4ODEsICAgODk4LCAgIDkxNSwgICA5MzMsICAgOTUxLCAgIDk2OSwgICA5ODgsCisgICAgICAgICAxMDA3LCAgMTAyNiwgIDEwNDYsICAxMDY2LCAgMTA4NywgIDExMDgsICAxMTI5LCAgMTE1MSwKKyAgICAgICAgIDExNzMsICAxMTk2LCAgMTIxOSwgIDEyNDMsICAxMjY3LCAgMTI5MiwgIDEzMTcsICAxMzQzLAorICAgICAgICAgMTM2OSwgIDEzOTYsICAxNDIzLCAgMTQ1MSwgIDE0NzksICAxNTA4LCAgMTUzNywgIDE1NjcsCisgICAgICAgICAxNTk3LCAgMTYyOCwgIDE2NjAsICAxNjkyLCAgMTcyNSwgIDE3NTksICAxNzkzLCAgMTgyOCwKKyAgICB9LCB7CisgICAgICAgICAgICA0LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDIxLCAgICAyNCwKKyAgICAgICAgICAgMjcsICAgIDMwLCAgICAzMywgICAgMzcsICAgIDQwLCAgICA0NCwgICAgNDgsICAgIDUxLAorICAgICAgICAgICA1NSwgICAgNTksICAgIDYzLCAgICA2NywgICAgNzEsICAgIDc1LCAgICA3OSwgICAgODMsCisgICAgICAgICAgIDg4LCAgICA5MiwgICAgOTYsICAgMTAwLCAgIDEwNSwgICAxMDksICAgMTE0LCAgIDExOCwKKyAgICAgICAgICAxMjIsICAgMTI3LCAgIDEzMSwgICAxMzYsICAgMTQwLCAgIDE0NSwgICAxNDksICAgMTU0LAorICAgICAgICAgIDE1OCwgICAxNjMsICAgMTY4LCAgIDE3MiwgICAxNzcsICAgMTgxLCAgIDE4NiwgICAxOTAsCisgICAgICAgICAgMTk1LCAgIDE5OSwgICAyMDQsICAgMjA4LCAgIDIxMywgICAyMTcsICAgMjIyLCAgIDIyNiwKKyAgICAgICAgICAyMzEsICAgMjM1LCAgIDI0MCwgICAyNDQsICAgMjQ5LCAgIDI1MywgICAyNTgsICAgMjYyLAorICAgICAgICAgIDI2NywgICAyNzEsICAgMjc1LCAgIDI4MCwgICAyODQsICAgMjg5LCAgIDI5MywgICAyOTcsCisgICAgICAgICAgMzAyLCAgIDMwNiwgICAzMTEsICAgMzE1LCAgIDMxOSwgICAzMjQsICAgMzI4LCAgIDMzMiwKKyAgICAgICAgICAzMzcsICAgMzQxLCAgIDM0NSwgICAzNDksICAgMzU0LCAgIDM1OCwgICAzNjIsICAgMzY3LAorICAgICAgICAgIDM3MSwgICAzNzUsICAgMzc5LCAgIDM4NCwgICAzODgsICAgMzkyLCAgIDM5NiwgICA0MDEsCisgICAgICAgICAgNDA5LCAgIDQxNywgICA0MjUsICAgNDMzLCAgIDQ0MSwgICA0NDksICAgNDU4LCAgIDQ2NiwKKyAgICAgICAgICA0NzQsICAgNDgyLCAgIDQ5MCwgICA0OTgsICAgNTA2LCAgIDUxNCwgICA1MjMsICAgNTMxLAorICAgICAgICAgIDUzOSwgICA1NDcsICAgNTU1LCAgIDU2MywgICA1NzEsICAgNTc5LCAgIDU4OCwgICA1OTYsCisgICAgICAgICAgNjA0LCAgIDYxNiwgICA2MjgsICAgNjQwLCAgIDY1MiwgICA2NjQsICAgNjc2LCAgIDY4OCwKKyAgICAgICAgICA3MDAsICAgNzEzLCAgIDcyNSwgICA3MzcsICAgNzQ5LCAgIDc2MSwgICA3NzMsICAgNzg1LAorICAgICAgICAgIDc5NywgICA4MDksICAgODI1LCAgIDg0MSwgICA4NTcsICAgODczLCAgIDg4OSwgICA5MDUsCisgICAgICAgICAgOTIyLCAgIDkzOCwgICA5NTQsICAgOTcwLCAgIDk4NiwgIDEwMDIsICAxMDE4LCAgMTAzOCwKKyAgICAgICAgIDEwNTgsICAxMDc4LCAgMTA5OCwgIDExMTgsICAxMTM4LCAgMTE1OCwgIDExNzgsICAxMTk4LAorICAgICAgICAgMTIxOCwgIDEyNDIsICAxMjY2LCAgMTI5MCwgIDEzMTQsICAxMzM4LCAgMTM2MiwgIDEzODYsCisgICAgICAgICAxNDExLCAgMTQzNSwgIDE0NjMsICAxNDkxLCAgMTUxOSwgIDE1NDcsICAxNTc1LCAgMTYwMywKKyAgICAgICAgIDE2MzEsICAxNjYzLCAgMTY5NSwgIDE3MjcsICAxNzU5LCAgMTc5MSwgIDE4MjMsICAxODU5LAorICAgICAgICAgMTg5NSwgIDE5MzEsICAxOTY3LCAgMjAwMywgIDIwMzksICAyMDc5LCAgMjExOSwgIDIxNTksCisgICAgICAgICAyMTk5LCAgMjIzOSwgIDIyODMsICAyMzI3LCAgMjM3MSwgIDI0MTUsICAyNDU5LCAgMjUwNywKKyAgICAgICAgIDI1NTUsICAyNjAzLCAgMjY1MSwgIDI3MDMsICAyNzU1LCAgMjgwNywgIDI4NTksICAyOTE1LAorICAgICAgICAgMjk3MSwgIDMwMjcsICAzMDgzLCAgMzE0MywgIDMyMDMsICAzMjYzLCAgMzMyNywgIDMzOTEsCisgICAgICAgICAzNDU1LCAgMzUyMywgIDM1OTEsICAzNjU5LCAgMzczMSwgIDM4MDMsICAzODc2LCAgMzk1MiwKKyAgICAgICAgIDQwMjgsICA0MTA0LCAgNDE4NCwgIDQyNjQsICA0MzQ4LCAgNDQzMiwgIDQ1MTYsICA0NjA0LAorICAgICAgICAgNDY5MiwgIDQ3ODQsICA0ODc2LCAgNDk3MiwgIDUwNjgsICA1MTY4LCAgNTI2OCwgIDUzNzIsCisgICAgICAgICA1NDc2LCAgNTU4NCwgIDU2OTIsICA1ODA0LCAgNTkxNiwgIDYwMzIsICA2MTQ4LCAgNjI2OCwKKyAgICAgICAgIDYzODgsICA2NTEyLCAgNjY0MCwgIDY3NjgsICA2OTAwLCAgNzAzNiwgIDcxNzIsICA3MzEyLAorICAgIH0sIHsKKyAgICAgICAgICAgIDQsICAgIDEzLCAgICAxOSwgICAgMjcsICAgIDM1LCAgICA0NCwgICAgNTQsICAgIDY0LAorICAgICAgICAgICA3NSwgICAgODcsICAgIDk5LCAgIDExMiwgICAxMjYsICAgMTM5LCAgIDE1NCwgICAxNjgsCisgICAgICAgICAgMTgzLCAgIDE5OSwgICAyMTQsICAgMjMwLCAgIDI0NywgICAyNjMsICAgMjgwLCAgIDI5NywKKyAgICAgICAgICAzMTQsICAgMzMxLCAgIDM0OSwgICAzNjYsICAgMzg0LCAgIDQwMiwgICA0MjAsICAgNDM4LAorICAgICAgICAgIDQ1NiwgICA0NzUsICAgNDkzLCAgIDUxMSwgICA1MzAsICAgNTQ4LCAgIDU2NywgICA1ODYsCisgICAgICAgICAgNjA0LCAgIDYyMywgICA2NDIsICAgNjYwLCAgIDY3OSwgICA2OTgsICAgNzE2LCAgIDczNSwKKyAgICAgICAgICA3NTMsICAgNzcyLCAgIDc5MSwgICA4MDksICAgODI4LCAgIDg0NiwgICA4NjUsICAgODg0LAorICAgICAgICAgIDkwMiwgICA5MjAsICAgOTM5LCAgIDk1NywgICA5NzYsICAgOTk0LCAgMTAxMiwgIDEwMzAsCisgICAgICAgICAxMDQ5LCAgMTA2NywgIDEwODUsICAxMTAzLCAgMTEyMSwgIDExMzksICAxMTU3LCAgMTE3NSwKKyAgICAgICAgIDExOTMsICAxMjExLCAgMTIyOSwgIDEyNDYsICAxMjY0LCAgMTI4MiwgIDEyOTksICAxMzE3LAorICAgICAgICAgMTMzNSwgIDEzNTIsICAxMzcwLCAgMTM4NywgIDE0MDUsICAxNDIyLCAgMTQ0MCwgIDE0NTcsCisgICAgICAgICAxNDc0LCAgMTQ5MSwgIDE1MDksICAxNTI2LCAgMTU0MywgIDE1NjAsICAxNTc3LCAgMTU5NSwKKyAgICAgICAgIDE2MjcsICAxNjYwLCAgMTY5MywgIDE3MjUsICAxNzU4LCAgMTc5MSwgIDE4MjQsICAxODU2LAorICAgICAgICAgMTg4OSwgIDE5MjIsICAxOTU0LCAgMTk4NywgIDIwMjAsICAyMDUyLCAgMjA4NSwgIDIxMTgsCisgICAgICAgICAyMTUwLCAgMjE4MywgIDIyMTYsICAyMjQ4LCAgMjI4MSwgIDIzMTMsICAyMzQ2LCAgMjM3OCwKKyAgICAgICAgIDI0MTEsICAyNDU5LCAgMjUwOCwgIDI1NTYsICAyNjA1LCAgMjY1MywgIDI3MDEsICAyNzUwLAorICAgICAgICAgMjc5OCwgIDI4NDcsICAyODk1LCAgMjk0MywgIDI5OTIsICAzMDQwLCAgMzA4OCwgIDMxMzcsCisgICAgICAgICAzMTg1LCAgMzIzNCwgIDMyOTgsICAzMzYyLCAgMzQyNiwgIDM0OTEsICAzNTU1LCAgMzYxOSwKKyAgICAgICAgIDM2ODQsICAzNzQ4LCAgMzgxMiwgIDM4NzYsICAzOTQxLCAgNDAwNSwgIDQwNjksICA0MTQ5LAorICAgICAgICAgNDIzMCwgIDQzMTAsICA0MzkwLCAgNDQ3MCwgIDQ1NTAsICA0NjMxLCAgNDcxMSwgIDQ3OTEsCisgICAgICAgICA0ODcxLCAgNDk2NywgIDUwNjQsICA1MTYwLCAgNTI1NiwgIDUzNTIsICA1NDQ4LCAgNTU0NCwKKyAgICAgICAgIDU2NDEsICA1NzM3LCAgNTg0OSwgIDU5NjEsICA2MDczLCAgNjE4NSwgIDYyOTcsICA2NDEwLAorICAgICAgICAgNjUyMiwgIDY2NTAsICA2Nzc4LCAgNjkwNiwgIDcwMzQsICA3MTYyLCAgNzI5MCwgIDc0MzUsCisgICAgICAgICA3NTc5LCAgNzcyMywgIDc4NjcsICA4MDExLCAgODE1NSwgIDgzMTUsICA4NDc1LCAgODYzNSwKKyAgICAgICAgIDg3OTUsICA4OTU2LCAgOTEzMiwgIDkzMDgsICA5NDg0LCAgOTY2MCwgIDk4MzYsIDEwMDI4LAorICAgICAgICAxMDIyMCwgMTA0MTIsIDEwNjA0LCAxMDgxMiwgMTEwMjAsIDExMjI4LCAxMTQzNywgMTE2NjEsCisgICAgICAgIDExODg1LCAxMjEwOSwgMTIzMzMsIDEyNTczLCAxMjgxMywgMTMwNTMsIDEzMzA5LCAxMzU2NSwKKyAgICAgICAgMTM4MjEsIDE0MDkzLCAxNDM2NSwgMTQ2MzcsIDE0OTI1LCAxNTIxMywgMTU1MDIsIDE1ODA2LAorICAgICAgICAxNjExMCwgMTY0MTQsIDE2NzM0LCAxNzA1NCwgMTczOTAsIDE3NzI2LCAxODA2MiwgMTg0MTQsCisgICAgICAgIDE4NzY2LCAxOTEzNCwgMTk1MDIsIDE5ODg2LCAyMDI3MCwgMjA2NzAsIDIxMDcwLCAyMTQ4NiwKKyAgICAgICAgMjE5MDIsIDIyMzM0LCAyMjc2NiwgMjMyMTQsIDIzNjYyLCAyNDEyNiwgMjQ1OTAsIDI1MDcwLAorICAgICAgICAyNTU1MSwgMjYwNDcsIDI2NTU5LCAyNzA3MSwgMjc1OTksIDI4MTQzLCAyODY4NywgMjkyNDcsCisgICAgfQorfTsKKworY29uc3QgZW51bSBUeGZtVHlwZSBmZl92cDlfaW50cmFfdHhmbV90eXBlWzE0XSA9IHsKKyAgICBbVkVSVF9QUkVEXSAgICAgICAgICAgID0gQURTVF9EQ1QsCisgICAgW0hPUl9QUkVEXSAgICAgICAgICAgICA9IERDVF9BRFNULAorICAgIFtEQ19QUkVEXSAgICAgICAgICAgICAgPSBEQ1RfRENULAorICAgIFtESUFHX0RPV05fTEVGVF9QUkVEXSAgPSBEQ1RfRENULAorICAgIFtESUFHX0RPV05fUklHSFRfUFJFRF0gPSBBRFNUX0FEU1QsCisgICAgW1ZFUlRfUklHSFRfUFJFRF0gICAgICA9IEFEU1RfRENULAorICAgIFtIT1JfRE9XTl9QUkVEXSAgICAgICAgPSBEQ1RfQURTVCwKKyAgICBbVkVSVF9MRUZUX1BSRURdICAgICAgID0gQURTVF9EQ1QsCisgICAgW0hPUl9VUF9QUkVEXSAgICAgICAgICA9IERDVF9BRFNULAorICAgIFtUTV9WUDhfUFJFRF0gICAgICAgICAgPSBBRFNUX0FEU1QsCisgICAgW05FQVJFU1RNVl0gICAgICAgICAgICA9IERDVF9EQ1QsCisgICAgW05FQVJNVl0gICAgICAgICAgICAgICA9IERDVF9EQ1QsCisgICAgW1pFUk9NVl0gICAgICAgICAgICAgICA9IERDVF9EQ1QsCisgICAgW05FV01WXSAgICAgICAgICAgICAgICA9IERDVF9EQ1QsCit9OworCitjb25zdCBpbnQxNl90IGZmX3ZwOV9kZWZhdWx0X3NjYW5fNHg0WzE2XSA9IHsKKyAgICAgMCwgIDEsICA0LCAgNSwKKyAgICAgMiwgIDgsICAzLCAgNiwKKyAgICAxMiwgIDksICA3LCAxMCwKKyAgICAxMywgMTEsIDE0LCAxNSwKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X2NvbF9zY2FuXzR4NFsxNl0gPSB7CisgICAgIDAsICAxLCAgMiwgIDQsCisgICAgIDMsICA1LCAgNiwgIDgsCisgICAgIDcsICA5LCAxMCwgMTIsCisgICAgMTMsIDExLCAxNCwgMTUsCit9OworCitjb25zdCBpbnQxNl90IGZmX3ZwOV9yb3dfc2Nhbl80eDRbMTZdID0geworICAgICAwLCAgNCwgIDEsICA4LAorICAgICA1LCAxMiwgIDksICAyLAorICAgICA2LCAxMywgIDMsIDEwLAorICAgICA3LCAxNCwgMTEsIDE1LAorfTsKKworY29uc3QgaW50MTZfdCBmZl92cDlfZGVmYXVsdF9zY2FuXzh4OFs2NF0gPSB7CisgICAgIDAsICAxLCAgOCwgIDIsICA5LCAxNiwgMTAsICAzLAorICAgIDE3LCAyNCwgMTgsIDExLCAgNCwgMjUsIDMyLCAxOSwKKyAgICAxMiwgMjYsICA1LCAzMywgMjAsIDI3LCA0MCwgMTMsCisgICAgMzQsICA2LCA0MSwgMjgsIDIxLCAzNSwgNDIsIDQ4LAorICAgIDE0LCAgNywgMzYsIDI5LCA0MywgNTYsIDQ5LCAyMiwKKyAgICAxNSwgMzcsIDUwLCA0NCwgNTcsIDMwLCAyMywgNTEsCisgICAgNDUsIDU4LCAzOCwgMzEsIDUyLCA1OSwgMzksIDQ2LAorICAgIDUzLCA2MCwgNDcsIDU0LCA2MSwgNTUsIDYyLCA2MywKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X2NvbF9zY2FuXzh4OFs2NF0gPSB7CisgICAgIDAsICAxLCAgMiwgIDgsICAzLCAgOSwgIDQsIDEwLAorICAgIDE2LCAgNSwgMTEsIDE3LCAxMiwgMTgsICA2LCAyNCwKKyAgICAxOSwgMTMsIDI1LCAgNywgMjYsIDIwLCAzMiwgMTQsCisgICAgMjcsIDIxLCAzMywgMjgsIDM0LCAxNSwgMjIsIDM1LAorICAgIDQwLCAyOSwgNDEsIDM2LCAyMywgMzAsIDQyLCAzNywKKyAgICA0OCwgNDMsIDMxLCA0NCwgNDksIDM4LCA1MCwgNTYsCisgICAgNDUsIDM5LCA1MSwgNTcsIDUyLCA0NiwgNTgsIDUzLAorICAgIDU5LCA0NywgNjAsIDU0LCA2MSwgNTUsIDYyLCA2MywKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X3Jvd19zY2FuXzh4OFs2NF0gPSB7CisgICAgIDAsICA4LCAxNiwgIDEsICA5LCAyNCwgIDIsIDE3LAorICAgIDMyLCAxMCwgMjUsICAzLCA0MCwgMTgsIDExLCAzMywKKyAgICAyNiwgMTksICA0LCA0OCwgNDEsIDM0LCAxMiwgMjcsCisgICAgNTYsIDIwLCAgNSwgNDIsIDM1LCAxMywgNDksIDI4LAorICAgICA2LCAyMSwgNDMsIDM2LCAxNCwgNTAsIDI5LCA1NywKKyAgICAgNywgNDQsIDIyLCAzNywgNTEsIDE1LCA1OCwgMzAsCisgICAgMjMsIDQ1LCA1MiwgMzgsIDU5LCAzMSwgNDYsIDUzLAorICAgIDM5LCA2MCwgNDcsIDYxLCA1NCwgNjIsIDU1LCA2MywKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X2RlZmF1bHRfc2Nhbl8xNngxNlsyNTZdID0geworICAgICAgMCwgICAxLCAgMTYsICAgMiwgIDE3LCAgMzIsICAgMywgIDE4LCAgMzMsICA0OCwgICA0LCAgMzQsICAxOSwgIDQ5LCAgMjAsICAgNSwKKyAgICAgMzUsICA2NCwgIDUwLCAgMzYsICA2NSwgIDIxLCAgIDYsICA1MSwgIDgwLCAgNjYsICAzNywgIDIyLCAgNTIsICAgNywgIDgxLCAgNjcsCisgICAgIDM4LCAgODIsICA1MywgIDIzLCAgOTYsICA2OCwgICA4LCAgODMsICA5NywgIDU0LCAgMzksICA2OSwgMTEyLCAgMjQsICA5OCwgIDg0LAorICAgICA3MCwgIDU1LCAgIDksICA0MCwgIDg1LCAgOTksIDExMywgMTI4LCAgMjUsIDExNCwgMTAwLCAgNzEsICA4NiwgIDU2LCAgMTAsICA0MSwKKyAgICAxMTUsIDEwMSwgMTI5LCAxMTYsICA3MiwgIDg3LCAgMjYsIDEzMCwgMTQ0LCAxMDIsICA1NywgIDExLCAgNDIsIDExNywgMTMxLCAxNDUsCisgICAgIDg4LCAxMDMsICAyNywgIDczLCAxMzIsIDExOCwgMTQ2LCAgNTgsIDE2MCwgIDEyLCAgNDMsIDEzMywgMTQ3LCAxMDQsICA4OSwgMTE5LAorICAgIDE2MSwgIDc0LCAxNDgsIDEzNCwgIDI4LCAxNjIsICA1OSwgIDEzLCAxNzYsIDEyMCwgMTQ5LCAgOTAsIDEzNSwgMTA1LCAxNjMsICA0NCwKKyAgICAgNzUsIDE3NywgMTY0LCAgMjksIDE1MCwgMTIxLCAxMzYsIDE3OCwgMTY1LCAgMTQsIDEwNiwgIDYwLCAgOTEsIDE1MSwgIDQ1LCAxNzksCisgICAgMTkyLCAxMzcsIDE2NiwgMTIyLCAgNzYsIDE4MCwgMTUyLCAgMzAsICA2MSwgIDE1LCAxMDcsIDE2NywgMTgxLCAxOTMsICA5MiwgMjA4LAorICAgICA0NiwgMTM4LCAxMjMsIDE1MywgMTk0LCAgNzcsIDE2OCwgMTgyLCAgMzEsIDE5NSwgMjA5LCAxODMsIDEwOCwgMTM5LCAgNjIsIDE1NCwKKyAgICAgNDcsIDE5NiwgIDkzLCAxNjksIDIxMCwgMTk3LCAyMjQsIDEyNCwgMTg0LCAyMTEsICA3OCwgMTA5LCAxNzAsIDE1NSwgIDYzLCAxOTgsCisgICAgMjEyLCAxODUsIDIyNSwgMjQwLCAxNDAsICA5NCwgMTk5LCAxMjUsICA3OSwgMjEzLCAyMjYsIDE3MSwgMTg2LCAxNTYsIDIxNCwgMjAwLAorICAgIDExMCwgMjI3LCAxNDEsICA5NSwgMjQxLCAyMTUsIDIyOCwgMjAxLCAxMjYsIDI0MiwgMTg3LCAxNzIsIDE1NywgMjI5LCAxMTEsIDIxNiwKKyAgICAyNDMsIDE0MiwgMjAyLCAyMzAsIDEyNywgMjE3LCAyNDQsIDE3MywgMTg4LCAyMzEsIDE1OCwgMjAzLCAxNDMsIDI0NSwgMjE4LCAyMzIsCisgICAgMTg5LCAyNDYsIDE1OSwgMTc0LCAyMzMsIDI0NywgMjE5LCAyMDQsIDE3NSwgMTkwLCAyNDgsIDIzNCwgMjA1LCAyMjAsIDI0OSwgMTkxLAorICAgIDIzNSwgMjIxLCAyNTAsIDIwNiwgMjIyLCAyNTEsIDIzNiwgMjA3LCAyMzcsIDIyMywgMjUyLCAyMzgsIDI1MywgMjM5LCAyNTQsIDI1NSwKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X2NvbF9zY2FuXzE2eDE2WzI1Nl0gPSB7CisgICAgICAwLCAgIDEsICAgMiwgICAzLCAgMTYsICAgNCwgIDE3LCAgIDUsICAxOCwgICA2LCAgMTksICAzMiwgIDIwLCAgIDcsICAzMywgIDIxLAorICAgICAzNCwgICA4LCAgMzUsICAyMiwgIDQ4LCAgMzYsICAgOSwgIDQ5LCAgMjMsICA1MCwgIDM3LCAgMTAsICAzOCwgIDUxLCAgMjQsICA2NCwKKyAgICAgNTIsICAxMSwgIDY1LCAgMzksICAyNSwgIDUzLCAgNjYsICA1NCwgIDQwLCAgNjcsICAxMiwgIDgwLCAgMjYsICA2OCwgIDU1LCAgODEsCisgICAgIDQxLCAgNjksICAxMywgIDI3LCAgODIsICA1NiwgIDcwLCAgODMsICA0MiwgIDE0LCAgODQsICA5NiwgIDcxLCAgMjgsICA1NywgIDg1LAorICAgICA5NywgIDE1LCAgNzIsICA5OCwgIDQzLCAgODYsICA1OCwgIDk5LCAgMjksICA4NywgMTAwLCAxMTIsICA3MywgIDQ0LCAxMDEsICA1OSwKKyAgICAgMzAsIDExMywgIDg4LCAxMTQsICA3NCwgMTI4LCAxMDIsICA0NSwgIDMxLCAxMTUsICA2MCwgMTAzLCAgODksIDExNiwgIDc1LCAxMjksCisgICAgMTE3LCAgNDYsIDEwNCwgIDkwLCAgNjEsIDEzMCwgMTE4LCAxMzEsIDEzMiwgMTA1LCAgNzYsICA0NywgMTE5LCAxNDQsICA5MSwgIDYyLAorICAgIDEzMywgMTA2LCAxNDUsIDEyMCwgMTQ2LCAxMzQsICA3NywgMTQ3LCAxMjEsICA5MiwgMTM1LCAxNDgsICA2MywgMTA3LCAxMzYsIDEyMiwKKyAgICAgOTMsIDE0OSwgMTYwLCAgNzgsIDE1MCwgMTM3LCAxMDgsIDE2MSwgMTYyLCAxNTEsIDEyMywgIDc5LCAxMzgsIDE2MywgMTUyLCAgOTQsCisgICAgMTY0LCAxMDksIDE2NSwgMTUzLCAxMjQsIDEzOSwgMTc2LCAxNjYsICA5NSwgMTc3LCAxNjcsIDExMCwgMTU0LCAxNzgsIDEyNSwgMTc5LAorICAgIDE0MCwgMTY4LCAxNTUsIDExMSwgMTgwLCAxOTIsIDE4MSwgMTY5LCAxNDEsIDEyNiwgMTgyLCAxOTMsIDE5NCwgMTU2LCAxODMsIDE3MCwKKyAgICAxOTUsIDEyNywgMTQyLCAxOTYsIDE4NCwgMjA4LCAxOTcsIDE1NywgMTcxLCAxNDMsIDE4NSwgMTk4LCAyMDksIDE5OSwgMjEwLCAxNzIsCisgICAgMTU4LCAxODYsIDIxMSwgMjI0LCAyMTIsIDIwMCwgMjQwLCAxNTksIDIxMywgMjI1LCAxODcsIDIwMSwgMTczLCAyMjYsIDIxNCwgMjE1LAorICAgIDIyNywgMjAyLCAyMjgsIDE4OCwgMjQxLCAyMTYsIDE3NCwgMjI5LCAyNDIsIDIwMywgMjQzLCAyMTcsIDIzMCwgMTc1LCAxODksIDI0NCwKKyAgICAyMzEsIDIwNCwgMjE4LCAyMzIsIDI0NSwgMjE5LCAyNDYsIDE5MCwgMjMzLCAyMDUsIDE5MSwgMjQ3LCAyMzQsIDI0OCwgMjIwLCAyMDYsCisgICAgMjQ5LCAyMzUsIDIyMSwgMjA3LCAyNTAsIDIzNiwgMjIyLCAyNTEsIDIyMywgMjM3LCAyMzgsIDI1MiwgMjM5LCAyNTMsIDI1NCwgMjU1LAorfTsKKworY29uc3QgaW50MTZfdCBmZl92cDlfcm93X3NjYW5fMTZ4MTZbMjU2XSA9IHsKKyAgICAgIDAsICAxNiwgIDMyLCAgIDEsICA0OCwgIDE3LCAgNjQsICAzMywgICAyLCAgODAsICAxOCwgIDQ5LCAgOTYsICAzNCwgICAzLCAgNjUsCisgICAgIDE5LCAxMTIsICA1MCwgIDgxLCAgMzUsICAgNCwgMTI4LCAgNjYsICAyMCwgIDk3LCAgNTEsICA4MiwgICA1LCAxNDQsICAzNiwgIDY3LAorICAgIDExMywgIDk4LCAgMjEsICA1MiwgMTYwLCAgODMsIDEyOSwgIDM3LCAgNjgsICAgNiwgMTE0LCAxNzYsICA5OSwgIDUzLCAgMjIsICA4NCwKKyAgICAxNDUsICAzOCwgIDY5LCAxMzAsICAgNywgMTE1LCAxOTIsIDEwMCwgIDU0LCAgMjMsICA4NSwgMTYxLCAxNDYsIDEzMSwgIDM5LCAgNzAsCisgICAgMjA4LCAxMTYsICAgOCwgMTAxLCAxNzcsICA1NSwgIDg2LCAgMjQsIDE2MiwgMTQ3LCAxMzIsICA3MSwgMjI0LCAxMTcsICA0MCwgMTAyLAorICAgICAgOSwgMTQ4LCAgNTYsICA4NywgMTkzLCAxNjMsIDI0MCwgMTMzLCAxNzgsICAyNSwgMTE4LCAgNzIsICA0MSwgMTAzLCAxNjQsICAxMCwKKyAgICAxNDksICA4OCwgMTM0LCAyMDksIDE3OSwgIDU3LCAxMTksIDE5NCwgIDI2LCAgNzMsIDE2NSwgMTUwLCAxMDQsICA0MiwgMTM1LCAgMTEsCisgICAgMTgwLCAxMjAsICA4OSwgMjI1LCAxOTUsICA1OCwgIDI3LCAyMTAsIDE1MSwgMTgxLCAxNjYsICA3NCwgIDQzLCAxMDUsICAxMiwgMTM2LAorICAgICA5MCwgIDU5LCAyNDEsIDEyMSwgIDI4LCAxOTYsIDE2NywgMjExLCAxNTIsICA0NCwgMTgyLCAxMzcsICA3NSwgIDEzLCAyMjYsIDEwNiwKKyAgICAxMjIsICA2MCwgMTk3LCAgOTEsIDE2OCwgIDI5LCAxODMsIDE1MywgIDE0LCAgNzYsIDIxMiwgMTM4LCAgNDUsIDEwNywgIDE1LCAxOTgsCisgICAgIDkyLCAyMjcsIDE2OSwgIDMwLCAxMjMsIDE1NCwgIDYxLCAyNDIsIDE4NCwgMjEzLCAxMzksICA0NiwgIDc3LCAgMzEsIDEwOCwgMTcwLAorICAgIDE5OSwgMTg1LCAxMjQsIDIyOCwgIDkzLCAxNTUsIDIxNCwgIDYyLCAxNDAsIDI0MywgIDc4LCAgNDcsIDIwMCwgMTA5LCAxODYsIDE3MSwKKyAgICAyMDEsICA5NCwgIDYzLCAyMTUsIDIyOSwgMTU2LCAgNzksIDEyNSwgMTQxLCAxMTAsIDIxNiwgMTg3LCAxNzIsIDI0NCwgMjAyLCAyMzAsCisgICAgMjE3LCAgOTUsIDE1NywgMTI2LCAyNDUsIDExMSwgMTQyLCAyMzEsIDE4OCwgMTI3LCAxNTgsIDIxOCwgMTczLCAyMzIsIDI0NiwgMjMzLAorICAgIDIwMywgMTQzLCAyNDcsIDE3NCwgMTg5LCAxNTksIDIxOSwgMjA0LCAyNDgsIDIzNCwgMjQ5LCAxNzUsIDE5MCwgMjIwLCAyMDUsIDI1MCwKKyAgICAyMzUsIDE5MSwgMjIxLCAyNTEsIDIzNiwgMjA2LCAyNTIsIDIyMiwgMjA3LCAyMzcsIDIyMywgMjUzLCAyMzgsIDI1NCwgMjM5LCAyNTUsCit9OworCitjb25zdCBpbnQxNl90IGZmX3ZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJbMTAyNF0gPSB7CisgICAgICAgMCwgICAgMSwgICAzMiwgICAgMiwgICAzMywgICA2NCwgICAgMywgICAzNCwgICA2NSwgICAgNCwgICA5NiwgICAzNSwgICA2NiwgICAgNSwgICAzNiwgICA5NywgICA2NywgIDEyOCwgICA5OCwgICA2OCwgICAzNywgICAgNiwgIDEyOSwgICA5OSwgICAgNywgIDE2MCwgICA2OSwgICAzOCwgIDEzMCwgIDEwMCwgIDE2MSwgIDEzMSwKKyAgICAgIDM5LCAgIDcwLCAgICA4LCAgMTAxLCAgMTYyLCAgMTMyLCAgMTkyLCAgIDcxLCAgIDQwLCAgICA5LCAgMTAyLCAgMTYzLCAgMTMzLCAgMTkzLCAgIDcyLCAgMjI0LCAgMTAzLCAgIDQxLCAgMTY0LCAgIDEwLCAgMTk0LCAgMTM0LCAgMTY1LCAgIDczLCAgMTA0LCAgMTM1LCAgMjI1LCAgIDQyLCAgMTk1LCAgIDExLCAgMjU2LCAgMTY2LAorICAgICAyMjYsICAxOTYsICAgNzQsICAxMDUsICAxMzYsICAgNDMsICAgMTIsICAxNjcsICAxOTcsICAyMjcsICAyNTcsICAgNzUsICAxMDYsICAxMzcsICAyMjgsICAgNDQsICAxOTgsICAxNjgsICAyNTgsICAyODgsICAgMTMsICAyMjksICAgNzYsICAxMDcsICAxOTksICAxMzgsICAyNTksICAxNjksICAyODksICAgNDUsICAyMzAsICAyNjAsCisgICAgIDIwMCwgIDEwOCwgICAxNCwgIDE3MCwgIDEzOSwgIDMyMCwgIDI5MCwgICA3NywgIDIzMSwgIDI2MSwgICA0NiwgIDIwMSwgIDE0MCwgIDI5MSwgIDEwOSwgIDIzMiwgIDMyMSwgIDI2MiwgIDE3MSwgICA3OCwgIDI5MiwgICAxNSwgIDMyMiwgIDIwMiwgIDI2MywgIDM1MiwgIDE3MiwgIDI5MywgIDIzMywgIDE0MSwgIDMyMywgIDExMCwKKyAgICAgIDQ3LCAgMjAzLCAgMjY0LCAgMjM0LCAgMjk0LCAgMzUzLCAgMzI0LCAgIDE2LCAgIDc5LCAgMjA0LCAgMjY1LCAgMjk1LCAgMzI1LCAgMTczLCAgMzU0LCAgMTQyLCAgMjM1LCAgMzg0LCAgIDQ4LCAgMjk2LCAgMTExLCAgMjY2LCAgMzU1LCAgMzI2LCAgIDgwLCAgIDE3LCAgMjA1LCAgMjM2LCAgMTc0LCAgMzU2LCAgMzg1LCAgMzI3LAorICAgICAxNDMsICAyOTcsICAyNjcsICAzNTcsICAzODYsICAxMTIsICAgNDksICAzMjgsICAyOTgsICAyMDYsICA0MTYsICAyMzcsICAzNTgsICAzODcsICAgODEsICAxNzUsICAgMTgsICAzMjksICAzNTksICAzODgsICAyOTksICAzMzAsICAzODksICAxMTMsICA0MTcsICAyMzgsICAzNjAsICAgNTAsICAyMDcsICA0MTgsICAzOTAsICAzMzEsCisgICAgICAxOSwgIDQ0OCwgIDM2MSwgICA4MiwgIDQxOSwgIDM5MSwgIDIzOSwgICA1MSwgIDM2MiwgIDQyMCwgIDExNCwgIDQ0OSwgIDQ4MCwgIDQyMSwgICA4MywgIDM2MywgIDQ1MCwgIDQyMiwgIDUxMiwgIDQ1MSwgIDQyMywgIDExNSwgIDQ1MiwgIDQ4MSwgIDQ1MywgIDQ4MiwgIDQ1NCwgIDU0NCwgIDQ4MywgIDQ1NSwgIDUxMywgIDQ4NCwKKyAgICAgNTE0LCAgNDg1LCAgNTE1LCAgNDg2LCAgNTQ1LCAgNTc2LCAgNDg3LCAgNTQ2LCAgNTQ3LCAgNjA4LCAgNTc3LCAgNTc4LCAgNTc5LCAgNjA5LCAgNjEwLCAgNjExLCAgIDIwLCAgMTQ0LCAgMjY4LCAgMzkyLCAgNTE2LCAgNjQwLCAgIDIxLCAgIDUyLCAgMTQ1LCAgMTc2LCAgMjY5LCAgMzAwLCAgMzkzLCAgNDI0LCAgNTE3LCAgNTQ4LAorICAgICA2NDEsICA2NzIsICAgMjIsICAgNTMsICAgODQsICAxNDYsICAxNzcsICAyMDgsICAyNzAsICAzMDEsICAzMzIsICAzOTQsICA0MjUsICA0NTYsICA1MTgsICA1NDksICA1ODAsICA2NDIsICA2NzMsICA3MDQsICAgMjMsICAgNTQsICAgODUsICAxMTYsICAxNDcsICAxNzgsICAyMDksICAyNDAsICAyNzEsICAzMDIsICAzMzMsICAzNjQsCisgICAgIDM5NSwgIDQyNiwgIDQ1NywgIDQ4OCwgIDUxOSwgIDU1MCwgIDU4MSwgIDYxMiwgIDY0MywgIDY3NCwgIDcwNSwgIDczNiwgICA1NSwgICA4NiwgIDExNywgIDE3OSwgIDIxMCwgIDI0MSwgIDMwMywgIDMzNCwgIDM2NSwgIDQyNywgIDQ1OCwgIDQ4OSwgIDU1MSwgIDU4MiwgIDYxMywgIDY3NSwgIDcwNiwgIDczNywgICA4NywgIDExOCwKKyAgICAgMjExLCAgMjQyLCAgMzM1LCAgMzY2LCAgNDU5LCAgNDkwLCAgNTgzLCAgNjE0LCAgNzA3LCAgNzM4LCAgMTE5LCAgMjQzLCAgMzY3LCAgNDkxLCAgNjE1LCAgNzM5LCAgIDI0LCAgMTQ4LCAgMjcyLCAgMzk2LCAgNTIwLCAgNjQ0LCAgNzY4LCAgIDI1LCAgIDU2LCAgMTQ5LCAgMTgwLCAgMjczLCAgMzA0LCAgMzk3LCAgNDI4LCAgNTIxLAorICAgICA1NTIsICA2NDUsICA2NzYsICA3NjksICA4MDAsICAgMjYsICAgNTcsICAgODgsICAxNTAsICAxODEsICAyMTIsICAyNzQsICAzMDUsICAzMzYsICAzOTgsICA0MjksICA0NjAsICA1MjIsICA1NTMsICA1ODQsICA2NDYsICA2NzcsICA3MDgsICA3NzAsICA4MDEsICA4MzIsICAgMjcsICAgNTgsICAgODksICAxMjAsICAxNTEsICAxODIsCisgICAgIDIxMywgIDI0NCwgIDI3NSwgIDMwNiwgIDMzNywgIDM2OCwgIDM5OSwgIDQzMCwgIDQ2MSwgIDQ5MiwgIDUyMywgIDU1NCwgIDU4NSwgIDYxNiwgIDY0NywgIDY3OCwgIDcwOSwgIDc0MCwgIDc3MSwgIDgwMiwgIDgzMywgIDg2NCwgICA1OSwgICA5MCwgIDEyMSwgIDE4MywgIDIxNCwgIDI0NSwgIDMwNywgIDMzOCwgIDM2OSwgIDQzMSwKKyAgICAgNDYyLCAgNDkzLCAgNTU1LCAgNTg2LCAgNjE3LCAgNjc5LCAgNzEwLCAgNzQxLCAgODAzLCAgODM0LCAgODY1LCAgIDkxLCAgMTIyLCAgMjE1LCAgMjQ2LCAgMzM5LCAgMzcwLCAgNDYzLCAgNDk0LCAgNTg3LCAgNjE4LCAgNzExLCAgNzQyLCAgODM1LCAgODY2LCAgMTIzLCAgMjQ3LCAgMzcxLCAgNDk1LCAgNjE5LCAgNzQzLCAgODY3LAorICAgICAgMjgsICAxNTIsICAyNzYsICA0MDAsICA1MjQsICA2NDgsICA3NzIsICA4OTYsICAgMjksICAgNjAsICAxNTMsICAxODQsICAyNzcsICAzMDgsICA0MDEsICA0MzIsICA1MjUsICA1NTYsICA2NDksICA2ODAsICA3NzMsICA4MDQsICA4OTcsICA5MjgsICAgMzAsICAgNjEsICAgOTIsICAxNTQsICAxODUsICAyMTYsICAyNzgsICAzMDksCisgICAgIDM0MCwgIDQwMiwgIDQzMywgIDQ2NCwgIDUyNiwgIDU1NywgIDU4OCwgIDY1MCwgIDY4MSwgIDcxMiwgIDc3NCwgIDgwNSwgIDgzNiwgIDg5OCwgIDkyOSwgIDk2MCwgICAzMSwgICA2MiwgICA5MywgIDEyNCwgIDE1NSwgIDE4NiwgIDIxNywgIDI0OCwgIDI3OSwgIDMxMCwgIDM0MSwgIDM3MiwgIDQwMywgIDQzNCwgIDQ2NSwgIDQ5NiwKKyAgICAgNTI3LCAgNTU4LCAgNTg5LCAgNjIwLCAgNjUxLCAgNjgyLCAgNzEzLCAgNzQ0LCAgNzc1LCAgODA2LCAgODM3LCAgODY4LCAgODk5LCAgOTMwLCAgOTYxLCAgOTkyLCAgIDYzLCAgIDk0LCAgMTI1LCAgMTg3LCAgMjE4LCAgMjQ5LCAgMzExLCAgMzQyLCAgMzczLCAgNDM1LCAgNDY2LCAgNDk3LCAgNTU5LCAgNTkwLCAgNjIxLCAgNjgzLAorICAgICA3MTQsICA3NDUsICA4MDcsICA4MzgsICA4NjksICA5MzEsICA5NjIsICA5OTMsICAgOTUsICAxMjYsICAyMTksICAyNTAsICAzNDMsICAzNzQsICA0NjcsICA0OTgsICA1OTEsICA2MjIsICA3MTUsICA3NDYsICA4MzksICA4NzAsICA5NjMsICA5OTQsICAxMjcsICAyNTEsICAzNzUsICA0OTksICA2MjMsICA3NDcsICA4NzEsICA5OTUsCisgICAgIDE1NiwgIDI4MCwgIDQwNCwgIDUyOCwgIDY1MiwgIDc3NiwgIDkwMCwgIDE1NywgIDE4OCwgIDI4MSwgIDMxMiwgIDQwNSwgIDQzNiwgIDUyOSwgIDU2MCwgIDY1MywgIDY4NCwgIDc3NywgIDgwOCwgIDkwMSwgIDkzMiwgIDE1OCwgIDE4OSwgIDIyMCwgIDI4MiwgIDMxMywgIDM0NCwgIDQwNiwgIDQzNywgIDQ2OCwgIDUzMCwgIDU2MSwKKyAgICAgNTkyLCAgNjU0LCAgNjg1LCAgNzE2LCAgNzc4LCAgODA5LCAgODQwLCAgOTAyLCAgOTMzLCAgOTY0LCAgMTU5LCAgMTkwLCAgMjIxLCAgMjUyLCAgMjgzLCAgMzE0LCAgMzQ1LCAgMzc2LCAgNDA3LCAgNDM4LCAgNDY5LCAgNTAwLCAgNTMxLCAgNTYyLCAgNTkzLCAgNjI0LCAgNjU1LCAgNjg2LCAgNzE3LCAgNzQ4LCAgNzc5LCAgODEwLAorICAgICA4NDEsICA4NzIsICA5MDMsICA5MzQsICA5NjUsICA5OTYsICAxOTEsICAyMjIsICAyNTMsICAzMTUsICAzNDYsICAzNzcsICA0MzksICA0NzAsICA1MDEsICA1NjMsICA1OTQsICA2MjUsICA2ODcsICA3MTgsICA3NDksICA4MTEsICA4NDIsICA4NzMsICA5MzUsICA5NjYsICA5OTcsICAyMjMsICAyNTQsICAzNDcsICAzNzgsICA0NzEsCisgICAgIDUwMiwgIDU5NSwgIDYyNiwgIDcxOSwgIDc1MCwgIDg0MywgIDg3NCwgIDk2NywgIDk5OCwgIDI1NSwgIDM3OSwgIDUwMywgIDYyNywgIDc1MSwgIDg3NSwgIDk5OSwgIDI4NCwgIDQwOCwgIDUzMiwgIDY1NiwgIDc4MCwgIDkwNCwgIDI4NSwgIDMxNiwgIDQwOSwgIDQ0MCwgIDUzMywgIDU2NCwgIDY1NywgIDY4OCwgIDc4MSwgIDgxMiwKKyAgICAgOTA1LCAgOTM2LCAgMjg2LCAgMzE3LCAgMzQ4LCAgNDEwLCAgNDQxLCAgNDcyLCAgNTM0LCAgNTY1LCAgNTk2LCAgNjU4LCAgNjg5LCAgNzIwLCAgNzgyLCAgODEzLCAgODQ0LCAgOTA2LCAgOTM3LCAgOTY4LCAgMjg3LCAgMzE4LCAgMzQ5LCAgMzgwLCAgNDExLCAgNDQyLCAgNDczLCAgNTA0LCAgNTM1LCAgNTY2LCAgNTk3LCAgNjI4LAorICAgICA2NTksICA2OTAsICA3MjEsICA3NTIsICA3ODMsICA4MTQsICA4NDUsICA4NzYsICA5MDcsICA5MzgsICA5NjksIDEwMDAsICAzMTksICAzNTAsICAzODEsICA0NDMsICA0NzQsICA1MDUsICA1NjcsICA1OTgsICA2MjksICA2OTEsICA3MjIsICA3NTMsICA4MTUsICA4NDYsICA4NzcsICA5MzksICA5NzAsIDEwMDEsICAzNTEsICAzODIsCisgICAgIDQ3NSwgIDUwNiwgIDU5OSwgIDYzMCwgIDcyMywgIDc1NCwgIDg0NywgIDg3OCwgIDk3MSwgMTAwMiwgIDM4MywgIDUwNywgIDYzMSwgIDc1NSwgIDg3OSwgMTAwMywgIDQxMiwgIDUzNiwgIDY2MCwgIDc4NCwgIDkwOCwgIDQxMywgIDQ0NCwgIDUzNywgIDU2OCwgIDY2MSwgIDY5MiwgIDc4NSwgIDgxNiwgIDkwOSwgIDk0MCwgIDQxNCwKKyAgICAgNDQ1LCAgNDc2LCAgNTM4LCAgNTY5LCAgNjAwLCAgNjYyLCAgNjkzLCAgNzI0LCAgNzg2LCAgODE3LCAgODQ4LCAgOTEwLCAgOTQxLCAgOTcyLCAgNDE1LCAgNDQ2LCAgNDc3LCAgNTA4LCAgNTM5LCAgNTcwLCAgNjAxLCAgNjMyLCAgNjYzLCAgNjk0LCAgNzI1LCAgNzU2LCAgNzg3LCAgODE4LCAgODQ5LCAgODgwLCAgOTExLCAgOTQyLAorICAgICA5NzMsIDEwMDQsICA0NDcsICA0NzgsICA1MDksICA1NzEsICA2MDIsICA2MzMsICA2OTUsICA3MjYsICA3NTcsICA4MTksICA4NTAsICA4ODEsICA5NDMsICA5NzQsIDEwMDUsICA0NzksICA1MTAsICA2MDMsICA2MzQsICA3MjcsICA3NTgsICA4NTEsICA4ODIsICA5NzUsIDEwMDYsICA1MTEsICA2MzUsICA3NTksICA4ODMsIDEwMDcsCisgICAgIDU0MCwgIDY2NCwgIDc4OCwgIDkxMiwgIDU0MSwgIDU3MiwgIDY2NSwgIDY5NiwgIDc4OSwgIDgyMCwgIDkxMywgIDk0NCwgIDU0MiwgIDU3MywgIDYwNCwgIDY2NiwgIDY5NywgIDcyOCwgIDc5MCwgIDgyMSwgIDg1MiwgIDkxNCwgIDk0NSwgIDk3NiwgIDU0MywgIDU3NCwgIDYwNSwgIDYzNiwgIDY2NywgIDY5OCwgIDcyOSwgIDc2MCwKKyAgICAgNzkxLCAgODIyLCAgODUzLCAgODg0LCAgOTE1LCAgOTQ2LCAgOTc3LCAxMDA4LCAgNTc1LCAgNjA2LCAgNjM3LCAgNjk5LCAgNzMwLCAgNzYxLCAgODIzLCAgODU0LCAgODg1LCAgOTQ3LCAgOTc4LCAxMDA5LCAgNjA3LCAgNjM4LCAgNzMxLCAgNzYyLCAgODU1LCAgODg2LCAgOTc5LCAxMDEwLCAgNjM5LCAgNzYzLCAgODg3LCAxMDExLAorICAgICA2NjgsICA3OTIsICA5MTYsICA2NjksICA3MDAsICA3OTMsICA4MjQsICA5MTcsICA5NDgsICA2NzAsICA3MDEsICA3MzIsICA3OTQsICA4MjUsICA4NTYsICA5MTgsICA5NDksICA5ODAsICA2NzEsICA3MDIsICA3MzMsICA3NjQsICA3OTUsICA4MjYsICA4NTcsICA4ODgsICA5MTksICA5NTAsICA5ODEsIDEwMTIsICA3MDMsICA3MzQsCisgICAgIDc2NSwgIDgyNywgIDg1OCwgIDg4OSwgIDk1MSwgIDk4MiwgMTAxMywgIDczNSwgIDc2NiwgIDg1OSwgIDg5MCwgIDk4MywgMTAxNCwgIDc2NywgIDg5MSwgMTAxNSwgIDc5NiwgIDkyMCwgIDc5NywgIDgyOCwgIDkyMSwgIDk1MiwgIDc5OCwgIDgyOSwgIDg2MCwgIDkyMiwgIDk1MywgIDk4NCwgIDc5OSwgIDgzMCwgIDg2MSwgIDg5MiwKKyAgICAgOTIzLCAgOTU0LCAgOTg1LCAxMDE2LCAgODMxLCAgODYyLCAgODkzLCAgOTU1LCAgOTg2LCAxMDE3LCAgODYzLCAgODk0LCAgOTg3LCAxMDE4LCAgODk1LCAxMDE5LCAgOTI0LCAgOTI1LCAgOTU2LCAgOTI2LCAgOTU3LCAgOTg4LCAgOTI3LCAgOTU4LCAgOTg5LCAxMDIwLCAgOTU5LCAgOTkwLCAxMDIxLCAgOTkxLCAxMDIyLCAxMDIzLAorfTsKKworY29uc3QgaW50MTZfdCAqIGNvbnN0IGZmX3ZwOV9zY2Fuc1s1XVs0XSA9IHsKKyAgICB7CisgICAgICAgIGZmX3ZwOV9kZWZhdWx0X3NjYW5fNHg0LCBmZl92cDlfY29sX3NjYW5fNHg0LAorICAgICAgICBmZl92cDlfcm93X3NjYW5fNHg0LCBmZl92cDlfZGVmYXVsdF9zY2FuXzR4NAorICAgIH0sIHsKKyAgICAgICAgZmZfdnA5X2RlZmF1bHRfc2Nhbl84eDgsIGZmX3ZwOV9jb2xfc2Nhbl84eDgsCisgICAgICAgIGZmX3ZwOV9yb3dfc2Nhbl84eDgsIGZmX3ZwOV9kZWZhdWx0X3NjYW5fOHg4CisgICAgfSwgeworICAgICAgICBmZl92cDlfZGVmYXVsdF9zY2FuXzE2eDE2LCBmZl92cDlfY29sX3NjYW5fMTZ4MTYsCisgICAgICAgIGZmX3ZwOV9yb3dfc2Nhbl8xNngxNiwgZmZfdnA5X2RlZmF1bHRfc2Nhbl8xNngxNgorICAgIH0sIHsKKyAgICAgICAgZmZfdnA5X2RlZmF1bHRfc2Nhbl8zMngzMiwgZmZfdnA5X2RlZmF1bHRfc2Nhbl8zMngzMiwKKyAgICAgICAgZmZfdnA5X2RlZmF1bHRfc2Nhbl8zMngzMiwgZmZfdnA5X2RlZmF1bHRfc2Nhbl8zMngzMgorICAgIH0sIHsgLy8gbG9zc2xlc3MKKyAgICAgICAgZmZfdnA5X2RlZmF1bHRfc2Nhbl80eDQsIGZmX3ZwOV9kZWZhdWx0X3NjYW5fNHg0LAorICAgICAgICBmZl92cDlfZGVmYXVsdF9zY2FuXzR4NCwgZmZfdnA5X2RlZmF1bHRfc2Nhbl80eDQKKyAgICB9Cit9OworCitjb25zdCBpbnQxNl90IGZmX3ZwOV9kZWZhdWx0X3NjYW5fNHg0X25iWzE2XVsyXSA9IHsKKyAgICB7ICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB7ICA0LCAgMSB9LCB7ICAxLCAgMSB9LAorICAgIHsgIDQsICA0IH0sIHsgIDIsICAyIH0sIHsgIDUsICAyIH0sIHsgIDgsICA4IH0sCisgICAgeyAgOCwgIDUgfSwgeyAgNiwgIDMgfSwgeyAgOSwgIDYgfSwgeyAxMiwgIDkgfSwKKyAgICB7IDEwLCAgNyB9LCB7IDEzLCAxMCB9LCB7IDE0LCAxMSB9LCB7ICAwLCAgMCB9LAorfTsKKworY29uc3QgaW50MTZfdCBmZl92cDlfY29sX3NjYW5fNHg0X25iWzE2XVsyXSA9IHsKKyAgICB7ICAwLCAgMCB9LCB7ICAxLCAgMSB9LCB7ICAwLCAgMCB9LCB7ICAyLCAgMiB9LAorICAgIHsgIDQsICA0IH0sIHsgIDUsICA1IH0sIHsgIDQsICA0IH0sIHsgIDYsICA2IH0sCisgICAgeyAgOCwgIDggfSwgeyAgOSwgIDkgfSwgeyAgOCwgIDggfSwgeyAxMiwgMTIgfSwKKyAgICB7IDEwLCAxMCB9LCB7IDEzLCAxMyB9LCB7IDE0LCAxNCB9LCB7ICAwLCAgMCB9LAorfTsKKworY29uc3QgaW50MTZfdCBmZl92cDlfcm93X3NjYW5fNHg0X25iWzE2XVsyXSA9IHsKKyAgICB7ICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB7ICA0LCAgNCB9LCB7ICAxLCAgMSB9LAorICAgIHsgIDgsICA4IH0sIHsgIDUsICA1IH0sIHsgIDEsICAxIH0sIHsgIDIsICAyIH0sCisgICAgeyAgOSwgIDkgfSwgeyAgMiwgIDIgfSwgeyAgNiwgIDYgfSwgeyAgMywgIDMgfSwKKyAgICB7IDEwLCAxMCB9LCB7ICA3LCAgNyB9LCB7IDExLCAxMSB9LCB7ICAwLCAgMCB9LAorfTsKKworY29uc3QgaW50MTZfdCBmZl92cDlfZGVmYXVsdF9zY2FuXzh4OF9uYls2NF1bMl0gPSB7CisgICAgeyAgMCwgIDAgfSwgeyAgMCwgIDAgfSwgeyAgMSwgIDEgfSwgeyAgOCwgIDEgfSwKKyAgICB7ICA4LCAgOCB9LCB7ICA5LCAgMiB9LCB7ICAyLCAgMiB9LCB7IDE2LCAgOSB9LAorICAgIHsgMTYsIDE2IH0sIHsgMTcsIDEwIH0sIHsgMTAsICAzIH0sIHsgIDMsICAzIH0sCisgICAgeyAyNCwgMTcgfSwgeyAyNCwgMjQgfSwgeyAxOCwgMTEgfSwgeyAxMSwgIDQgfSwKKyAgICB7IDI1LCAxOCB9LCB7ICA0LCAgNCB9LCB7IDMyLCAyNSB9LCB7IDE5LCAxMiB9LAorICAgIHsgMjYsIDE5IH0sIHsgMzIsIDMyIH0sIHsgMTIsICA1IH0sIHsgMzMsIDI2IH0sCisgICAgeyAgNSwgIDUgfSwgeyA0MCwgMzMgfSwgeyAyNywgMjAgfSwgeyAyMCwgMTMgfSwKKyAgICB7IDM0LCAyNyB9LCB7IDQxLCAzNCB9LCB7IDQwLCA0MCB9LCB7IDEzLCAgNiB9LAorICAgIHsgIDYsICA2IH0sIHsgMzUsIDI4IH0sIHsgMjgsIDIxIH0sIHsgNDIsIDM1IH0sCisgICAgeyA0OCwgNDggfSwgeyA0OCwgNDEgfSwgeyAyMSwgMTQgfSwgeyAxNCwgIDcgfSwKKyAgICB7IDM2LCAyOSB9LCB7IDQ5LCA0MiB9LCB7IDQzLCAzNiB9LCB7IDU2LCA0OSB9LAorICAgIHsgMjksIDIyIH0sIHsgMjIsIDE1IH0sIHsgNTAsIDQzIH0sIHsgNDQsIDM3IH0sCisgICAgeyA1NywgNTAgfSwgeyAzNywgMzAgfSwgeyAzMCwgMjMgfSwgeyA1MSwgNDQgfSwKKyAgICB7IDU4LCA1MSB9LCB7IDM4LCAzMSB9LCB7IDQ1LCAzOCB9LCB7IDUyLCA0NSB9LAorICAgIHsgNTksIDUyIH0sIHsgNDYsIDM5IH0sIHsgNTMsIDQ2IH0sIHsgNjAsIDUzIH0sCisgICAgeyA1NCwgNDcgfSwgeyA2MSwgNTQgfSwgeyA2MiwgNTUgfSwgeyAgMCwgIDAgfSwKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X2NvbF9zY2FuXzh4OF9uYls2NF1bMl0gPSB7CisgICAgeyAgMCwgIDAgfSwgeyAgMSwgIDEgfSwgeyAgMCwgIDAgfSwgeyAgMiwgIDIgfSwKKyAgICB7ICA4LCAgOCB9LCB7ICAzLCAgMyB9LCB7ICA5LCAgOSB9LCB7ICA4LCAgOCB9LAorICAgIHsgIDQsICA0IH0sIHsgMTAsIDEwIH0sIHsgMTYsIDE2IH0sIHsgMTEsIDExIH0sCisgICAgeyAxNywgMTcgfSwgeyAgNSwgIDUgfSwgeyAxNiwgMTYgfSwgeyAxOCwgMTggfSwKKyAgICB7IDEyLCAxMiB9LCB7IDI0LCAyNCB9LCB7ICA2LCAgNiB9LCB7IDI1LCAyNSB9LAorICAgIHsgMTksIDE5IH0sIHsgMjQsIDI0IH0sIHsgMTMsIDEzIH0sIHsgMjYsIDI2IH0sCisgICAgeyAyMCwgMjAgfSwgeyAzMiwgMzIgfSwgeyAyNywgMjcgfSwgeyAzMywgMzMgfSwKKyAgICB7IDE0LCAxNCB9LCB7IDIxLCAyMSB9LCB7IDM0LCAzNCB9LCB7IDMyLCAzMiB9LAorICAgIHsgMjgsIDI4IH0sIHsgNDAsIDQwIH0sIHsgMzUsIDM1IH0sIHsgMjIsIDIyIH0sCisgICAgeyAyOSwgMjkgfSwgeyA0MSwgNDEgfSwgeyAzNiwgMzYgfSwgeyA0MCwgNDAgfSwKKyAgICB7IDQyLCA0MiB9LCB7IDMwLCAzMCB9LCB7IDQzLCA0MyB9LCB7IDQ4LCA0OCB9LAorICAgIHsgMzcsIDM3IH0sIHsgNDksIDQ5IH0sIHsgNDgsIDQ4IH0sIHsgNDQsIDQ0IH0sCisgICAgeyAzOCwgMzggfSwgeyA1MCwgNTAgfSwgeyA1NiwgNTYgfSwgeyA1MSwgNTEgfSwKKyAgICB7IDQ1LCA0NSB9LCB7IDU3LCA1NyB9LCB7IDUyLCA1MiB9LCB7IDU4LCA1OCB9LAorICAgIHsgNDYsIDQ2IH0sIHsgNTksIDU5IH0sIHsgNTMsIDUzIH0sIHsgNjAsIDYwIH0sCisgICAgeyA1NCwgNTQgfSwgeyA2MSwgNjEgfSwgeyA2MiwgNjIgfSwgeyAgMCwgIDAgfSwKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X3Jvd19zY2FuXzh4OF9uYls2NF1bMl0gPSB7CisgICAgeyAgMCwgIDAgfSwgeyAgOCwgIDggfSwgeyAgMCwgIDAgfSwgeyAgMSwgIDEgfSwKKyAgICB7IDE2LCAxNiB9LCB7ICAxLCAgMSB9LCB7ICA5LCAgOSB9LCB7IDI0LCAyNCB9LAorICAgIHsgIDIsICAyIH0sIHsgMTcsIDE3IH0sIHsgIDIsICAyIH0sIHsgMzIsIDMyIH0sCisgICAgeyAxMCwgMTAgfSwgeyAgMywgIDMgfSwgeyAyNSwgMjUgfSwgeyAxOCwgMTggfSwKKyAgICB7IDExLCAxMSB9LCB7ICAzLCAgMyB9LCB7IDQwLCA0MCB9LCB7IDMzLCAzMyB9LAorICAgIHsgMjYsIDI2IH0sIHsgIDQsICA0IH0sIHsgMTksIDE5IH0sIHsgNDgsIDQ4IH0sCisgICAgeyAxMiwgMTIgfSwgeyAgNCwgIDQgfSwgeyAzNCwgMzQgfSwgeyAyNywgMjcgfSwKKyAgICB7ICA1LCAgNSB9LCB7IDQxLCA0MSB9LCB7IDIwLCAyMCB9LCB7ICA1LCAgNSB9LAorICAgIHsgMTMsIDEzIH0sIHsgMzUsIDM1IH0sIHsgMjgsIDI4IH0sIHsgIDYsICA2IH0sCisgICAgeyA0MiwgNDIgfSwgeyAyMSwgMjEgfSwgeyA0OSwgNDkgfSwgeyAgNiwgIDYgfSwKKyAgICB7IDM2LCAzNiB9LCB7IDE0LCAxNCB9LCB7IDI5LCAyOSB9LCB7IDQzLCA0MyB9LAorICAgIHsgIDcsICA3IH0sIHsgNTAsIDUwIH0sIHsgMjIsIDIyIH0sIHsgMTUsIDE1IH0sCisgICAgeyAzNywgMzcgfSwgeyA0NCwgNDQgfSwgeyAzMCwgMzAgfSwgeyA1MSwgNTEgfSwKKyAgICB7IDIzLCAyMyB9LCB7IDM4LCAzOCB9LCB7IDQ1LCA0NSB9LCB7IDMxLCAzMSB9LAorICAgIHsgNTIsIDUyIH0sIHsgMzksIDM5IH0sIHsgNTMsIDUzIH0sIHsgNDYsIDQ2IH0sCisgICAgeyA1NCwgNTQgfSwgeyA0NywgNDcgfSwgeyA1NSwgNTUgfSwgeyAgMCwgIDAgfSwKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X2RlZmF1bHRfc2Nhbl8xNngxNl9uYlsyNTZdWzJdID0geworICAgIHsgICAwLCAgIDAgfSwgeyAgIDAsICAgMCB9LCB7ICAgMSwgICAxIH0sIHsgIDE2LCAgIDEgfSwKKyAgICB7ICAxNiwgIDE2IH0sIHsgICAyLCAgIDIgfSwgeyAgMTcsICAgMiB9LCB7ICAzMiwgIDE3IH0sCisgICAgeyAgMzIsICAzMiB9LCB7ICAgMywgICAzIH0sIHsgIDMzLCAgMTggfSwgeyAgMTgsICAgMyB9LAorICAgIHsgIDQ4LCAgMzMgfSwgeyAgMTksICAgNCB9LCB7ICAgNCwgICA0IH0sIHsgIDM0LCAgMTkgfSwKKyAgICB7ICA0OCwgIDQ4IH0sIHsgIDQ5LCAgMzQgfSwgeyAgMzUsICAyMCB9LCB7ICA2NCwgIDQ5IH0sCisgICAgeyAgMjAsICAgNSB9LCB7ICAgNSwgICA1IH0sIHsgIDUwLCAgMzUgfSwgeyAgNjQsICA2NCB9LAorICAgIHsgIDY1LCAgNTAgfSwgeyAgMzYsICAyMSB9LCB7ICAyMSwgICA2IH0sIHsgIDUxLCAgMzYgfSwKKyAgICB7ICAgNiwgICA2IH0sIHsgIDgwLCAgNjUgfSwgeyAgNjYsICA1MSB9LCB7ICAzNywgIDIyIH0sCisgICAgeyAgODEsICA2NiB9LCB7ICA1MiwgIDM3IH0sIHsgIDIyLCAgIDcgfSwgeyAgODAsICA4MCB9LAorICAgIHsgIDY3LCAgNTIgfSwgeyAgIDcsICAgNyB9LCB7ICA4MiwgIDY3IH0sIHsgIDk2LCAgODEgfSwKKyAgICB7ICA1MywgIDM4IH0sIHsgIDM4LCAgMjMgfSwgeyAgNjgsICA1MyB9LCB7ICA5NiwgIDk2IH0sCisgICAgeyAgMjMsICAgOCB9LCB7ICA5NywgIDgyIH0sIHsgIDgzLCAgNjggfSwgeyAgNjksICA1NCB9LAorICAgIHsgIDU0LCAgMzkgfSwgeyAgIDgsICAgOCB9LCB7ICAzOSwgIDI0IH0sIHsgIDg0LCAgNjkgfSwKKyAgICB7ICA5OCwgIDgzIH0sIHsgMTEyLCAgOTcgfSwgeyAxMTIsIDExMiB9LCB7ICAyNCwgICA5IH0sCisgICAgeyAxMTMsICA5OCB9LCB7ICA5OSwgIDg0IH0sIHsgIDcwLCAgNTUgfSwgeyAgODUsICA3MCB9LAorICAgIHsgIDU1LCAgNDAgfSwgeyAgIDksICAgOSB9LCB7ICA0MCwgIDI1IH0sIHsgMTE0LCAgOTkgfSwKKyAgICB7IDEwMCwgIDg1IH0sIHsgMTI4LCAxMTMgfSwgeyAxMTUsIDEwMCB9LCB7ICA3MSwgIDU2IH0sCisgICAgeyAgODYsICA3MSB9LCB7ICAyNSwgIDEwIH0sIHsgMTI5LCAxMTQgfSwgeyAxMjgsIDEyOCB9LAorICAgIHsgMTAxLCAgODYgfSwgeyAgNTYsICA0MSB9LCB7ICAxMCwgIDEwIH0sIHsgIDQxLCAgMjYgfSwKKyAgICB7IDExNiwgMTAxIH0sIHsgMTMwLCAxMTUgfSwgeyAxNDQsIDEyOSB9LCB7ICA4NywgIDcyIH0sCisgICAgeyAxMDIsICA4NyB9LCB7ICAyNiwgIDExIH0sIHsgIDcyLCAgNTcgfSwgeyAxMzEsIDExNiB9LAorICAgIHsgMTE3LCAxMDIgfSwgeyAxNDUsIDEzMCB9LCB7ICA1NywgIDQyIH0sIHsgMTQ0LCAxNDQgfSwKKyAgICB7ICAxMSwgIDExIH0sIHsgIDQyLCAgMjcgfSwgeyAxMzIsIDExNyB9LCB7IDE0NiwgMTMxIH0sCisgICAgeyAxMDMsICA4OCB9LCB7ICA4OCwgIDczIH0sIHsgMTE4LCAxMDMgfSwgeyAxNjAsIDE0NSB9LAorICAgIHsgIDczLCAgNTggfSwgeyAxNDcsIDEzMiB9LCB7IDEzMywgMTE4IH0sIHsgIDI3LCAgMTIgfSwKKyAgICB7IDE2MSwgMTQ2IH0sIHsgIDU4LCAgNDMgfSwgeyAgMTIsICAxMiB9LCB7IDE2MCwgMTYwIH0sCisgICAgeyAxMTksIDEwNCB9LCB7IDE0OCwgMTMzIH0sIHsgIDg5LCAgNzQgfSwgeyAxMzQsIDExOSB9LAorICAgIHsgMTA0LCAgODkgfSwgeyAxNjIsIDE0NyB9LCB7ICA0MywgIDI4IH0sIHsgIDc0LCAgNTkgfSwKKyAgICB7IDE3NiwgMTYxIH0sIHsgMTYzLCAxNDggfSwgeyAgMjgsICAxMyB9LCB7IDE0OSwgMTM0IH0sCisgICAgeyAxMjAsIDEwNSB9LCB7IDEzNSwgMTIwIH0sIHsgMTc3LCAxNjIgfSwgeyAxNjQsIDE0OSB9LAorICAgIHsgIDEzLCAgMTMgfSwgeyAxMDUsICA5MCB9LCB7ICA1OSwgIDQ0IH0sIHsgIDkwLCAgNzUgfSwKKyAgICB7IDE1MCwgMTM1IH0sIHsgIDQ0LCAgMjkgfSwgeyAxNzgsIDE2MyB9LCB7IDE3NiwgMTc2IH0sCisgICAgeyAxMzYsIDEyMSB9LCB7IDE2NSwgMTUwIH0sIHsgMTIxLCAxMDYgfSwgeyAgNzUsICA2MCB9LAorICAgIHsgMTc5LCAxNjQgfSwgeyAxNTEsIDEzNiB9LCB7ICAyOSwgIDE0IH0sIHsgIDYwLCAgNDUgfSwKKyAgICB7ICAxNCwgIDE0IH0sIHsgMTA2LCAgOTEgfSwgeyAxNjYsIDE1MSB9LCB7IDE4MCwgMTY1IH0sCisgICAgeyAxOTIsIDE3NyB9LCB7ICA5MSwgIDc2IH0sIHsgMTkyLCAxOTIgfSwgeyAgNDUsICAzMCB9LAorICAgIHsgMTM3LCAxMjIgfSwgeyAxMjIsIDEwNyB9LCB7IDE1MiwgMTM3IH0sIHsgMTkzLCAxNzggfSwKKyAgICB7ICA3NiwgIDYxIH0sIHsgMTY3LCAxNTIgfSwgeyAxODEsIDE2NiB9LCB7ICAzMCwgIDE1IH0sCisgICAgeyAxOTQsIDE3OSB9LCB7IDIwOCwgMTkzIH0sIHsgMTgyLCAxNjcgfSwgeyAxMDcsICA5MiB9LAorICAgIHsgMTM4LCAxMjMgfSwgeyAgNjEsICA0NiB9LCB7IDE1MywgMTM4IH0sIHsgIDQ2LCAgMzEgfSwKKyAgICB7IDE5NSwgMTgwIH0sIHsgIDkyLCAgNzcgfSwgeyAxNjgsIDE1MyB9LCB7IDIwOSwgMTk0IH0sCisgICAgeyAxOTYsIDE4MSB9LCB7IDIwOCwgMjA4IH0sIHsgMTIzLCAxMDggfSwgeyAxODMsIDE2OCB9LAorICAgIHsgMjEwLCAxOTUgfSwgeyAgNzcsICA2MiB9LCB7IDEwOCwgIDkzIH0sIHsgMTY5LCAxNTQgfSwKKyAgICB7IDE1NCwgMTM5IH0sIHsgIDYyLCAgNDcgfSwgeyAxOTcsIDE4MiB9LCB7IDIxMSwgMTk2IH0sCisgICAgeyAxODQsIDE2OSB9LCB7IDIyNCwgMjA5IH0sIHsgMjI0LCAyMjQgfSwgeyAxMzksIDEyNCB9LAorICAgIHsgIDkzLCAgNzggfSwgeyAxOTgsIDE4MyB9LCB7IDEyNCwgMTA5IH0sIHsgIDc4LCAgNjMgfSwKKyAgICB7IDIxMiwgMTk3IH0sIHsgMjI1LCAyMTAgfSwgeyAxNzAsIDE1NSB9LCB7IDE4NSwgMTcwIH0sCisgICAgeyAxNTUsIDE0MCB9LCB7IDIxMywgMTk4IH0sIHsgMTk5LCAxODQgfSwgeyAxMDksICA5NCB9LAorICAgIHsgMjI2LCAyMTEgfSwgeyAxNDAsIDEyNSB9LCB7ICA5NCwgIDc5IH0sIHsgMjQwLCAyMjUgfSwKKyAgICB7IDIxNCwgMTk5IH0sIHsgMjI3LCAyMTIgfSwgeyAyMDAsIDE4NSB9LCB7IDEyNSwgMTEwIH0sCisgICAgeyAyNDEsIDIyNiB9LCB7IDE4NiwgMTcxIH0sIHsgMTcxLCAxNTYgfSwgeyAxNTYsIDE0MSB9LAorICAgIHsgMjI4LCAyMTMgfSwgeyAxMTAsICA5NSB9LCB7IDIxNSwgMjAwIH0sIHsgMjQyLCAyMjcgfSwKKyAgICB7IDE0MSwgMTI2IH0sIHsgMjAxLCAxODYgfSwgeyAyMjksIDIxNCB9LCB7IDEyNiwgMTExIH0sCisgICAgeyAyMTYsIDIwMSB9LCB7IDI0MywgMjI4IH0sIHsgMTcyLCAxNTcgfSwgeyAxODcsIDE3MiB9LAorICAgIHsgMjMwLCAyMTUgfSwgeyAxNTcsIDE0MiB9LCB7IDIwMiwgMTg3IH0sIHsgMTQyLCAxMjcgfSwKKyAgICB7IDI0NCwgMjI5IH0sIHsgMjE3LCAyMDIgfSwgeyAyMzEsIDIxNiB9LCB7IDE4OCwgMTczIH0sCisgICAgeyAyNDUsIDIzMCB9LCB7IDE1OCwgMTQzIH0sIHsgMTczLCAxNTggfSwgeyAyMzIsIDIxNyB9LAorICAgIHsgMjQ2LCAyMzEgfSwgeyAyMTgsIDIwMyB9LCB7IDIwMywgMTg4IH0sIHsgMTc0LCAxNTkgfSwKKyAgICB7IDE4OSwgMTc0IH0sIHsgMjQ3LCAyMzIgfSwgeyAyMzMsIDIxOCB9LCB7IDIwNCwgMTg5IH0sCisgICAgeyAyMTksIDIwNCB9LCB7IDI0OCwgMjMzIH0sIHsgMTkwLCAxNzUgfSwgeyAyMzQsIDIxOSB9LAorICAgIHsgMjIwLCAyMDUgfSwgeyAyNDksIDIzNCB9LCB7IDIwNSwgMTkwIH0sIHsgMjIxLCAyMDYgfSwKKyAgICB7IDI1MCwgMjM1IH0sIHsgMjM1LCAyMjAgfSwgeyAyMDYsIDE5MSB9LCB7IDIzNiwgMjIxIH0sCisgICAgeyAyMjIsIDIwNyB9LCB7IDI1MSwgMjM2IH0sIHsgMjM3LCAyMjIgfSwgeyAyNTIsIDIzNyB9LAorICAgIHsgMjM4LCAyMjMgfSwgeyAyNTMsIDIzOCB9LCB7IDI1NCwgMjM5IH0sIHsgICAwLCAgIDAgfSwKK307CisKK2NvbnN0IGludDE2X3QgZmZfdnA5X2NvbF9zY2FuXzE2eDE2X25iWzI1Nl1bMl0gPSB7CisgICAgeyAgIDAsICAgMCB9LCB7ICAgMSwgICAxIH0sIHsgICAyLCAgIDIgfSwgeyAgIDAsICAgMCB9LAorICAgIHsgICAzLCAgIDMgfSwgeyAgMTYsICAxNiB9LCB7ICAgNCwgICA0IH0sIHsgIDE3LCAgMTcgfSwKKyAgICB7ICAgNSwgICA1IH0sIHsgIDE4LCAgMTggfSwgeyAgMTYsICAxNiB9LCB7ICAxOSwgIDE5IH0sCisgICAgeyAgIDYsICAgNiB9LCB7ICAzMiwgIDMyIH0sIHsgIDIwLCAgMjAgfSwgeyAgMzMsICAzMyB9LAorICAgIHsgICA3LCAgIDcgfSwgeyAgMzQsICAzNCB9LCB7ICAyMSwgIDIxIH0sIHsgIDMyLCAgMzIgfSwKKyAgICB7ICAzNSwgIDM1IH0sIHsgICA4LCAgIDggfSwgeyAgNDgsICA0OCB9LCB7ICAyMiwgIDIyIH0sCisgICAgeyAgNDksICA0OSB9LCB7ICAzNiwgIDM2IH0sIHsgICA5LCAgIDkgfSwgeyAgMzcsICAzNyB9LAorICAgIHsgIDUwLCAgNTAgfSwgeyAgMjMsICAyMyB9LCB7ICA0OCwgIDQ4IH0sIHsgIDUxLCAgNTEgfSwKKyAgICB7ICAxMCwgIDEwIH0sIHsgIDY0LCAgNjQgfSwgeyAgMzgsICAzOCB9LCB7ICAyNCwgIDI0IH0sCisgICAgeyAgNTIsICA1MiB9LCB7ICA2NSwgIDY1IH0sIHsgIDUzLCAgNTMgfSwgeyAgMzksICAzOSB9LAorICAgIHsgIDY2LCAgNjYgfSwgeyAgMTEsICAxMSB9LCB7ICA2NCwgIDY0IH0sIHsgIDI1LCAgMjUgfSwKKyAgICB7ICA2NywgIDY3IH0sIHsgIDU0LCAgNTQgfSwgeyAgODAsICA4MCB9LCB7ICA0MCwgIDQwIH0sCisgICAgeyAgNjgsICA2OCB9LCB7ICAxMiwgIDEyIH0sIHsgIDI2LCAgMjYgfSwgeyAgODEsICA4MSB9LAorICAgIHsgIDU1LCAgNTUgfSwgeyAgNjksICA2OSB9LCB7ICA4MiwgIDgyIH0sIHsgIDQxLCAgNDEgfSwKKyAgICB7ICAxMywgIDEzIH0sIHsgIDgzLCAgODMgfSwgeyAgODAsICA4MCB9LCB7ICA3MCwgIDcwIH0sCisgICAgeyAgMjcsICAyNyB9LCB7ICA1NiwgIDU2IH0sIHsgIDg0LCAgODQgfSwgeyAgOTYsICA5NiB9LAorICAgIHsgIDE0LCAgMTQgfSwgeyAgNzEsICA3MSB9LCB7ICA5NywgIDk3IH0sIHsgIDQyLCAgNDIgfSwKKyAgICB7ICA4NSwgIDg1IH0sIHsgIDU3LCAgNTcgfSwgeyAgOTgsICA5OCB9LCB7ICAyOCwgIDI4IH0sCisgICAgeyAgODYsICA4NiB9LCB7ICA5OSwgIDk5IH0sIHsgIDk2LCAgOTYgfSwgeyAgNzIsICA3MiB9LAorICAgIHsgIDQzLCAgNDMgfSwgeyAxMDAsIDEwMCB9LCB7ICA1OCwgIDU4IH0sIHsgIDI5LCAgMjkgfSwKKyAgICB7IDExMiwgMTEyIH0sIHsgIDg3LCAgODcgfSwgeyAxMTMsIDExMyB9LCB7ICA3MywgIDczIH0sCisgICAgeyAxMTIsIDExMiB9LCB7IDEwMSwgMTAxIH0sIHsgIDQ0LCAgNDQgfSwgeyAgMzAsICAzMCB9LAorICAgIHsgMTE0LCAxMTQgfSwgeyAgNTksICA1OSB9LCB7IDEwMiwgMTAyIH0sIHsgIDg4LCAgODggfSwKKyAgICB7IDExNSwgMTE1IH0sIHsgIDc0LCAgNzQgfSwgeyAxMjgsIDEyOCB9LCB7IDExNiwgMTE2IH0sCisgICAgeyAgNDUsICA0NSB9LCB7IDEwMywgMTAzIH0sIHsgIDg5LCAgODkgfSwgeyAgNjAsICA2MCB9LAorICAgIHsgMTI5LCAxMjkgfSwgeyAxMTcsIDExNyB9LCB7IDEzMCwgMTMwIH0sIHsgMTMxLCAxMzEgfSwKKyAgICB7IDEwNCwgMTA0IH0sIHsgIDc1LCAgNzUgfSwgeyAgNDYsICA0NiB9LCB7IDExOCwgMTE4IH0sCisgICAgeyAxMjgsIDEyOCB9LCB7ICA5MCwgIDkwIH0sIHsgIDYxLCAgNjEgfSwgeyAxMzIsIDEzMiB9LAorICAgIHsgMTA1LCAxMDUgfSwgeyAxNDQsIDE0NCB9LCB7IDExOSwgMTE5IH0sIHsgMTQ1LCAxNDUgfSwKKyAgICB7IDEzMywgMTMzIH0sIHsgIDc2LCAgNzYgfSwgeyAxNDYsIDE0NiB9LCB7IDEyMCwgMTIwIH0sCisgICAgeyAgOTEsICA5MSB9LCB7IDEzNCwgMTM0IH0sIHsgMTQ3LCAxNDcgfSwgeyAgNjIsICA2MiB9LAorICAgIHsgMTA2LCAxMDYgfSwgeyAxMzUsIDEzNSB9LCB7IDEyMSwgMTIxIH0sIHsgIDkyLCAgOTIgfSwKKyAgICB7IDE0OCwgMTQ4IH0sIHsgMTQ0LCAxNDQgfSwgeyAgNzcsICA3NyB9LCB7IDE0OSwgMTQ5IH0sCisgICAgeyAxMzYsIDEzNiB9LCB7IDEwNywgMTA3IH0sIHsgMTYwLCAxNjAgfSwgeyAxNjEsIDE2MSB9LAorICAgIHsgMTUwLCAxNTAgfSwgeyAxMjIsIDEyMiB9LCB7ICA3OCwgIDc4IH0sIHsgMTM3LCAxMzcgfSwKKyAgICB7IDE2MiwgMTYyIH0sIHsgMTUxLCAxNTEgfSwgeyAgOTMsICA5MyB9LCB7IDE2MywgMTYzIH0sCisgICAgeyAxMDgsIDEwOCB9LCB7IDE2NCwgMTY0IH0sIHsgMTUyLCAxNTIgfSwgeyAxMjMsIDEyMyB9LAorICAgIHsgMTM4LCAxMzggfSwgeyAxNjAsIDE2MCB9LCB7IDE2NSwgMTY1IH0sIHsgIDk0LCAgOTQgfSwKKyAgICB7IDE3NiwgMTc2IH0sIHsgMTY2LCAxNjYgfSwgeyAxMDksIDEwOSB9LCB7IDE1MywgMTUzIH0sCisgICAgeyAxNzcsIDE3NyB9LCB7IDEyNCwgMTI0IH0sIHsgMTc4LCAxNzggfSwgeyAxMzksIDEzOSB9LAorICAgIHsgMTY3LCAxNjcgfSwgeyAxNTQsIDE1NCB9LCB7IDExMCwgMTEwIH0sIHsgMTc5LCAxNzkgfSwKKyAgICB7IDE3NiwgMTc2IH0sIHsgMTgwLCAxODAgfSwgeyAxNjgsIDE2OCB9LCB7IDE0MCwgMTQwIH0sCisgICAgeyAxMjUsIDEyNSB9LCB7IDE4MSwgMTgxIH0sIHsgMTkyLCAxOTIgfSwgeyAxOTMsIDE5MyB9LAorICAgIHsgMTU1LCAxNTUgfSwgeyAxODIsIDE4MiB9LCB7IDE2OSwgMTY5IH0sIHsgMTk0LCAxOTQgfSwKKyAgICB7IDEyNiwgMTI2IH0sIHsgMTQxLCAxNDEgfSwgeyAxOTUsIDE5NSB9LCB7IDE4MywgMTgzIH0sCisgICAgeyAxOTIsIDE5MiB9LCB7IDE5NiwgMTk2IH0sIHsgMTU2LCAxNTYgfSwgeyAxNzAsIDE3MCB9LAorICAgIHsgMTQyLCAxNDIgfSwgeyAxODQsIDE4NCB9LCB7IDE5NywgMTk3IH0sIHsgMjA4LCAyMDggfSwKKyAgICB7IDE5OCwgMTk4IH0sIHsgMjA5LCAyMDkgfSwgeyAxNzEsIDE3MSB9LCB7IDE1NywgMTU3IH0sCisgICAgeyAxODUsIDE4NSB9LCB7IDIxMCwgMjEwIH0sIHsgMjA4LCAyMDggfSwgeyAyMTEsIDIxMSB9LAorICAgIHsgMTk5LCAxOTkgfSwgeyAyMjQsIDIyNCB9LCB7IDE1OCwgMTU4IH0sIHsgMjEyLCAyMTIgfSwKKyAgICB7IDIyNCwgMjI0IH0sIHsgMTg2LCAxODYgfSwgeyAyMDAsIDIwMCB9LCB7IDE3MiwgMTcyIH0sCisgICAgeyAyMjUsIDIyNSB9LCB7IDIxMywgMjEzIH0sIHsgMjE0LCAyMTQgfSwgeyAyMjYsIDIyNiB9LAorICAgIHsgMjAxLCAyMDEgfSwgeyAyMjcsIDIyNyB9LCB7IDE4NywgMTg3IH0sIHsgMjQwLCAyNDAgfSwKKyAgICB7IDIxNSwgMjE1IH0sIHsgMTczLCAxNzMgfSwgeyAyMjgsIDIyOCB9LCB7IDI0MSwgMjQxIH0sCisgICAgeyAyMDIsIDIwMiB9LCB7IDI0MiwgMjQyIH0sIHsgMjE2LCAyMTYgfSwgeyAyMjksIDIyOSB9LAorICAgIHsgMTc0LCAxNzQgfSwgeyAxODgsIDE4OCB9LCB7IDI0MywgMjQzIH0sIHsgMjMwLCAyMzAgfSwKKyAgICB7IDIwMywgMjAzIH0sIHsgMjE3LCAyMTcgfSwgeyAyMzEsIDIzMSB9LCB7IDI0NCwgMjQ0IH0sCisgICAgeyAyMTgsIDIxOCB9LCB7IDI0NSwgMjQ1IH0sIHsgMTg5LCAxODkgfSwgeyAyMzIsIDIzMiB9LAorICAgIHsgMjA0LCAyMDQgfSwgeyAxOTAsIDE5MCB9LCB7IDI0NiwgMjQ2IH0sIHsgMjMzLCAyMzMgfSwKKyAgICB7IDI0NywgMjQ3IH0sIHsgMjE5LCAyMTkgfSwgeyAyMDUsIDIwNSB9LCB7IDI0OCwgMjQ4IH0sCisgICAgeyAyMzQsIDIzNCB9LCB7IDIyMCwgMjIwIH0sIHsgMjA2LCAyMDYgfSwgeyAyNDksIDI0OSB9LAorICAgIHsgMjM1LCAyMzUgfSwgeyAyMjEsIDIyMSB9LCB7IDI1MCwgMjUwIH0sIHsgMjIyLCAyMjIgfSwKKyAgICB7IDIzNiwgMjM2IH0sIHsgMjM3LCAyMzcgfSwgeyAyNTEsIDI1MSB9LCB7IDIzOCwgMjM4IH0sCisgICAgeyAyNTIsIDI1MiB9LCB7IDI1MywgMjUzIH0sIHsgMjU0LCAyNTQgfSwgeyAgIDAsICAgMCB9LAorfTsKKworY29uc3QgaW50MTZfdCBmZl92cDlfcm93X3NjYW5fMTZ4MTZfbmJbMjU2XVsyXSA9IHsKKyAgICB7ICAgMCwgICAwIH0sIHsgIDE2LCAgMTYgfSwgeyAgIDAsICAgMCB9LCB7ICAzMiwgIDMyIH0sCisgICAgeyAgIDEsICAgMSB9LCB7ICA0OCwgIDQ4IH0sIHsgIDE3LCAgMTcgfSwgeyAgIDEsICAgMSB9LAorICAgIHsgIDY0LCAgNjQgfSwgeyAgIDIsICAgMiB9LCB7ICAzMywgIDMzIH0sIHsgIDgwLCAgODAgfSwKKyAgICB7ICAxOCwgIDE4IH0sIHsgICAyLCAgIDIgfSwgeyAgNDksICA0OSB9LCB7ICAgMywgICAzIH0sCisgICAgeyAgOTYsICA5NiB9LCB7ICAzNCwgIDM0IH0sIHsgIDY1LCAgNjUgfSwgeyAgMTksICAxOSB9LAorICAgIHsgICAzLCAgIDMgfSwgeyAxMTIsIDExMiB9LCB7ICA1MCwgIDUwIH0sIHsgICA0LCAgIDQgfSwKKyAgICB7ICA4MSwgIDgxIH0sIHsgIDM1LCAgMzUgfSwgeyAgNjYsICA2NiB9LCB7ICAgNCwgICA0IH0sCisgICAgeyAxMjgsIDEyOCB9LCB7ICAyMCwgIDIwIH0sIHsgIDUxLCAgNTEgfSwgeyAgOTcsICA5NyB9LAorICAgIHsgIDgyLCAgODIgfSwgeyAgIDUsICAgNSB9LCB7ICAzNiwgIDM2IH0sIHsgMTQ0LCAxNDQgfSwKKyAgICB7ICA2NywgIDY3IH0sIHsgMTEzLCAxMTMgfSwgeyAgMjEsICAyMSB9LCB7ICA1MiwgIDUyIH0sCisgICAgeyAgIDUsICAgNSB9LCB7ICA5OCwgIDk4IH0sIHsgMTYwLCAxNjAgfSwgeyAgODMsICA4MyB9LAorICAgIHsgIDM3LCAgMzcgfSwgeyAgIDYsICAgNiB9LCB7ICA2OCwgIDY4IH0sIHsgMTI5LCAxMjkgfSwKKyAgICB7ICAyMiwgIDIyIH0sIHsgIDUzLCAgNTMgfSwgeyAxMTQsIDExNCB9LCB7ICAgNiwgICA2IH0sCisgICAgeyAgOTksICA5OSB9LCB7IDE3NiwgMTc2IH0sIHsgIDg0LCAgODQgfSwgeyAgMzgsICAzOCB9LAorICAgIHsgICA3LCAgIDcgfSwgeyAgNjksICA2OSB9LCB7IDE0NSwgMTQ1IH0sIHsgMTMwLCAxMzAgfSwKKyAgICB7IDExNSwgMTE1IH0sIHsgIDIzLCAgMjMgfSwgeyAgNTQsICA1NCB9LCB7IDE5MiwgMTkyIH0sCisgICAgeyAxMDAsIDEwMCB9LCB7ICAgNywgICA3IH0sIHsgIDg1LCAgODUgfSwgeyAxNjEsIDE2MSB9LAorICAgIHsgIDM5LCAgMzkgfSwgeyAgNzAsICA3MCB9LCB7ICAgOCwgICA4IH0sIHsgMTQ2LCAxNDYgfSwKKyAgICB7IDEzMSwgMTMxIH0sIHsgMTE2LCAxMTYgfSwgeyAgNTUsICA1NSB9LCB7IDIwOCwgMjA4IH0sCisgICAgeyAxMDEsIDEwMSB9LCB7ICAyNCwgIDI0IH0sIHsgIDg2LCAgODYgfSwgeyAgIDgsICAgOCB9LAorICAgIHsgMTMyLCAxMzIgfSwgeyAgNDAsICA0MCB9LCB7ICA3MSwgIDcxIH0sIHsgMTc3LCAxNzcgfSwKKyAgICB7IDE0NywgMTQ3IH0sIHsgMjI0LCAyMjQgfSwgeyAxMTcsIDExNyB9LCB7IDE2MiwgMTYyIH0sCisgICAgeyAgIDksICAgOSB9LCB7IDEwMiwgMTAyIH0sIHsgIDU2LCAgNTYgfSwgeyAgMjUsICAyNSB9LAorICAgIHsgIDg3LCAgODcgfSwgeyAxNDgsIDE0OCB9LCB7ICAgOSwgICA5IH0sIHsgMTMzLCAxMzMgfSwKKyAgICB7ICA3MiwgIDcyIH0sIHsgMTE4LCAxMTggfSwgeyAxOTMsIDE5MyB9LCB7IDE2MywgMTYzIH0sCisgICAgeyAgNDEsICA0MSB9LCB7IDEwMywgMTAzIH0sIHsgMTc4LCAxNzggfSwgeyAgMTAsICAxMCB9LAorICAgIHsgIDU3LCAgNTcgfSwgeyAxNDksIDE0OSB9LCB7IDEzNCwgMTM0IH0sIHsgIDg4LCAgODggfSwKKyAgICB7ICAyNiwgIDI2IH0sIHsgMTE5LCAxMTkgfSwgeyAgMTAsICAxMCB9LCB7IDE2NCwgMTY0IH0sCisgICAgeyAxMDQsIDEwNCB9LCB7ICA3MywgIDczIH0sIHsgMjA5LCAyMDkgfSwgeyAxNzksIDE3OSB9LAorICAgIHsgIDQyLCAgNDIgfSwgeyAgMTEsICAxMSB9LCB7IDE5NCwgMTk0IH0sIHsgMTM1LCAxMzUgfSwKKyAgICB7IDE2NSwgMTY1IH0sIHsgMTUwLCAxNTAgfSwgeyAgNTgsICA1OCB9LCB7ICAyNywgIDI3IH0sCisgICAgeyAgODksICA4OSB9LCB7ICAxMSwgIDExIH0sIHsgMTIwLCAxMjAgfSwgeyAgNzQsICA3NCB9LAorICAgIHsgIDQzLCAgNDMgfSwgeyAyMjUsIDIyNSB9LCB7IDEwNSwgMTA1IH0sIHsgIDEyLCAgMTIgfSwKKyAgICB7IDE4MCwgMTgwIH0sIHsgMTUxLCAxNTEgfSwgeyAxOTUsIDE5NSB9LCB7IDEzNiwgMTM2IH0sCisgICAgeyAgMjgsICAyOCB9LCB7IDE2NiwgMTY2IH0sIHsgMTIxLCAxMjEgfSwgeyAgNTksICA1OSB9LAorICAgIHsgIDEyLCAgMTIgfSwgeyAyMTAsIDIxMCB9LCB7ICA5MCwgIDkwIH0sIHsgMTA2LCAxMDYgfSwKKyAgICB7ICA0NCwgIDQ0IH0sIHsgMTgxLCAxODEgfSwgeyAgNzUsICA3NSB9LCB7IDE1MiwgMTUyIH0sCisgICAgeyAgMTMsICAxMyB9LCB7IDE2NywgMTY3IH0sIHsgMTM3LCAxMzcgfSwgeyAgMTMsICAxMyB9LAorICAgIHsgIDYwLCAgNjAgfSwgeyAxOTYsIDE5NiB9LCB7IDEyMiwgMTIyIH0sIHsgIDI5LCAgMjkgfSwKKyAgICB7ICA5MSwgIDkxIH0sIHsgIDE0LCAgMTQgfSwgeyAxODIsIDE4MiB9LCB7ICA3NiwgIDc2IH0sCisgICAgeyAyMTEsIDIxMSB9LCB7IDE1MywgMTUzIH0sIHsgIDE0LCAgMTQgfSwgeyAxMDcsIDEwNyB9LAorICAgIHsgMTM4LCAxMzggfSwgeyAgNDUsICA0NSB9LCB7IDIyNiwgMjI2IH0sIHsgMTY4LCAxNjggfSwKKyAgICB7IDE5NywgMTk3IH0sIHsgMTIzLCAxMjMgfSwgeyAgMzAsICAzMCB9LCB7ICA2MSwgIDYxIH0sCisgICAgeyAgMTUsICAxNSB9LCB7ICA5MiwgIDkyIH0sIHsgMTU0LCAxNTQgfSwgeyAxODMsIDE4MyB9LAorICAgIHsgMTY5LCAxNjkgfSwgeyAxMDgsIDEwOCB9LCB7IDIxMiwgMjEyIH0sIHsgIDc3LCAgNzcgfSwKKyAgICB7IDEzOSwgMTM5IH0sIHsgMTk4LCAxOTggfSwgeyAgNDYsICA0NiB9LCB7IDEyNCwgMTI0IH0sCisgICAgeyAyMjcsIDIyNyB9LCB7ICA2MiwgIDYyIH0sIHsgIDMxLCAgMzEgfSwgeyAxODQsIDE4NCB9LAorICAgIHsgIDkzLCAgOTMgfSwgeyAxNzAsIDE3MCB9LCB7IDE1NSwgMTU1IH0sIHsgMTg1LCAxODUgfSwKKyAgICB7ICA3OCwgIDc4IH0sIHsgIDQ3LCAgNDcgfSwgeyAxOTksIDE5OSB9LCB7IDIxMywgMjEzIH0sCisgICAgeyAxNDAsIDE0MCB9LCB7ICA2MywgIDYzIH0sIHsgMTA5LCAxMDkgfSwgeyAxMjUsIDEyNSB9LAorICAgIHsgIDk0LCAgOTQgfSwgeyAyMDAsIDIwMCB9LCB7IDE3MSwgMTcxIH0sIHsgMTU2LCAxNTYgfSwKKyAgICB7IDIyOCwgMjI4IH0sIHsgMTg2LCAxODYgfSwgeyAyMTQsIDIxNCB9LCB7IDIwMSwgMjAxIH0sCisgICAgeyAgNzksICA3OSB9LCB7IDE0MSwgMTQxIH0sIHsgMTEwLCAxMTAgfSwgeyAyMjksIDIyOSB9LAorICAgIHsgIDk1LCAgOTUgfSwgeyAxMjYsIDEyNiB9LCB7IDIxNSwgMjE1IH0sIHsgMTcyLCAxNzIgfSwKKyAgICB7IDExMSwgMTExIH0sIHsgMTQyLCAxNDIgfSwgeyAyMDIsIDIwMiB9LCB7IDE1NywgMTU3IH0sCisgICAgeyAyMTYsIDIxNiB9LCB7IDIzMCwgMjMwIH0sIHsgMjE3LCAyMTcgfSwgeyAxODcsIDE4NyB9LAorICAgIHsgMTI3LCAxMjcgfSwgeyAyMzEsIDIzMSB9LCB7IDE1OCwgMTU4IH0sIHsgMTczLCAxNzMgfSwKKyAgICB7IDE0MywgMTQzIH0sIHsgMjAzLCAyMDMgfSwgeyAxODgsIDE4OCB9LCB7IDIzMiwgMjMyIH0sCisgICAgeyAyMTgsIDIxOCB9LCB7IDIzMywgMjMzIH0sIHsgMTU5LCAxNTkgfSwgeyAxNzQsIDE3NCB9LAorICAgIHsgMjA0LCAyMDQgfSwgeyAxODksIDE4OSB9LCB7IDIzNCwgMjM0IH0sIHsgMjE5LCAyMTkgfSwKKyAgICB7IDE3NSwgMTc1IH0sIHsgMjA1LCAyMDUgfSwgeyAyMzUsIDIzNSB9LCB7IDIyMCwgMjIwIH0sCisgICAgeyAxOTAsIDE5MCB9LCB7IDIzNiwgMjM2IH0sIHsgMjA2LCAyMDYgfSwgeyAxOTEsIDE5MSB9LAorICAgIHsgMjIxLCAyMjEgfSwgeyAyMDcsIDIwNyB9LCB7IDIzNywgMjM3IH0sIHsgMjIyLCAyMjIgfSwKKyAgICB7IDIzOCwgMjM4IH0sIHsgMjIzLCAyMjMgfSwgeyAyMzksIDIzOSB9LCB7ICAgMCwgICAwIH0sCit9OworCitjb25zdCBpbnQxNl90IGZmX3ZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmJbMTAyNF1bMl0gPSB7CisgICAgeyAgICAwLCAgICAwIH0sIHsgICAgMCwgICAgMCB9LCB7ICAgIDEsICAgIDEgfSwgeyAgIDMyLCAgICAxIH0sCisgICAgeyAgIDMyLCAgIDMyIH0sIHsgICAgMiwgICAgMiB9LCB7ICAgMzMsICAgIDIgfSwgeyAgIDY0LCAgIDMzIH0sCisgICAgeyAgICAzLCAgICAzIH0sIHsgICA2NCwgICA2NCB9LCB7ICAgMzQsICAgIDMgfSwgeyAgIDY1LCAgIDM0IH0sCisgICAgeyAgICA0LCAgICA0IH0sIHsgICAzNSwgICAgNCB9LCB7ICAgOTYsICAgNjUgfSwgeyAgIDY2LCAgIDM1IH0sCisgICAgeyAgIDk2LCAgIDk2IH0sIHsgICA5NywgICA2NiB9LCB7ICAgNjcsICAgMzYgfSwgeyAgIDM2LCAgICA1IH0sCisgICAgeyAgICA1LCAgICA1IH0sIHsgIDEyOCwgICA5NyB9LCB7ICAgOTgsICAgNjcgfSwgeyAgICA2LCAgICA2IH0sCisgICAgeyAgMTI4LCAgMTI4IH0sIHsgICA2OCwgICAzNyB9LCB7ICAgMzcsICAgIDYgfSwgeyAgMTI5LCAgIDk4IH0sCisgICAgeyAgIDk5LCAgIDY4IH0sIHsgIDE2MCwgIDEyOSB9LCB7ICAxMzAsICAgOTkgfSwgeyAgIDM4LCAgICA3IH0sCisgICAgeyAgIDY5LCAgIDM4IH0sIHsgICAgNywgICAgNyB9LCB7ICAxMDAsICAgNjkgfSwgeyAgMTYxLCAgMTMwIH0sCisgICAgeyAgMTMxLCAgMTAwIH0sIHsgIDE2MCwgIDE2MCB9LCB7ICAgNzAsICAgMzkgfSwgeyAgIDM5LCAgICA4IH0sCisgICAgeyAgICA4LCAgICA4IH0sIHsgIDEwMSwgICA3MCB9LCB7ICAxNjIsICAxMzEgfSwgeyAgMTMyLCAgMTAxIH0sCisgICAgeyAgMTkyLCAgMTYxIH0sIHsgICA3MSwgICA0MCB9LCB7ICAxOTIsICAxOTIgfSwgeyAgMTAyLCAgIDcxIH0sCisgICAgeyAgIDQwLCAgICA5IH0sIHsgIDE2MywgIDEzMiB9LCB7ICAgIDksICAgIDkgfSwgeyAgMTkzLCAgMTYyIH0sCisgICAgeyAgMTMzLCAgMTAyIH0sIHsgIDE2NCwgIDEzMyB9LCB7ICAgNzIsICAgNDEgfSwgeyAgMTAzLCAgIDcyIH0sCisgICAgeyAgMTM0LCAgMTAzIH0sIHsgIDIyNCwgIDE5MyB9LCB7ICAgNDEsICAgMTAgfSwgeyAgMTk0LCAgMTYzIH0sCisgICAgeyAgIDEwLCAgIDEwIH0sIHsgIDIyNCwgIDIyNCB9LCB7ICAxNjUsICAxMzQgfSwgeyAgMjI1LCAgMTk0IH0sCisgICAgeyAgMTk1LCAgMTY0IH0sIHsgICA3MywgICA0MiB9LCB7ICAxMDQsICAgNzMgfSwgeyAgMTM1LCAgMTA0IH0sCisgICAgeyAgIDQyLCAgIDExIH0sIHsgICAxMSwgICAxMSB9LCB7ICAxNjYsICAxMzUgfSwgeyAgMTk2LCAgMTY1IH0sCisgICAgeyAgMjI2LCAgMTk1IH0sIHsgIDI1NiwgIDIyNSB9LCB7ICAgNzQsICAgNDMgfSwgeyAgMTA1LCAgIDc0IH0sCisgICAgeyAgMTM2LCAgMTA1IH0sIHsgIDIyNywgIDE5NiB9LCB7ICAgNDMsICAgMTIgfSwgeyAgMTk3LCAgMTY2IH0sCisgICAgeyAgMTY3LCAgMTM2IH0sIHsgIDI1NywgIDIyNiB9LCB7ICAyNTYsICAyNTYgfSwgeyAgIDEyLCAgIDEyIH0sCisgICAgeyAgMjI4LCAgMTk3IH0sIHsgICA3NSwgICA0NCB9LCB7ICAxMDYsICAgNzUgfSwgeyAgMTk4LCAgMTY3IH0sCisgICAgeyAgMTM3LCAgMTA2IH0sIHsgIDI1OCwgIDIyNyB9LCB7ICAxNjgsICAxMzcgfSwgeyAgMjg4LCAgMjU3IH0sCisgICAgeyAgIDQ0LCAgIDEzIH0sIHsgIDIyOSwgIDE5OCB9LCB7ICAyNTksICAyMjggfSwgeyAgMTk5LCAgMTY4IH0sCisgICAgeyAgMTA3LCAgIDc2IH0sIHsgICAxMywgICAxMyB9LCB7ICAxNjksICAxMzggfSwgeyAgMTM4LCAgMTA3IH0sCisgICAgeyAgMjg4LCAgMjg4IH0sIHsgIDI4OSwgIDI1OCB9LCB7ICAgNzYsICAgNDUgfSwgeyAgMjMwLCAgMTk5IH0sCisgICAgeyAgMjYwLCAgMjI5IH0sIHsgICA0NSwgICAxNCB9LCB7ICAyMDAsICAxNjkgfSwgeyAgMTM5LCAgMTA4IH0sCisgICAgeyAgMjkwLCAgMjU5IH0sIHsgIDEwOCwgICA3NyB9LCB7ICAyMzEsICAyMDAgfSwgeyAgMzIwLCAgMjg5IH0sCisgICAgeyAgMjYxLCAgMjMwIH0sIHsgIDE3MCwgIDEzOSB9LCB7ICAgNzcsICAgNDYgfSwgeyAgMjkxLCAgMjYwIH0sCisgICAgeyAgIDE0LCAgIDE0IH0sIHsgIDMyMSwgIDI5MCB9LCB7ICAyMDEsICAxNzAgfSwgeyAgMjYyLCAgMjMxIH0sCisgICAgeyAgMzIwLCAgMzIwIH0sIHsgIDE3MSwgIDE0MCB9LCB7ICAyOTIsICAyNjEgfSwgeyAgMjMyLCAgMjAxIH0sCisgICAgeyAgMTQwLCAgMTA5IH0sIHsgIDMyMiwgIDI5MSB9LCB7ICAxMDksICAgNzggfSwgeyAgIDQ2LCAgIDE1IH0sCisgICAgeyAgMjAyLCAgMTcxIH0sIHsgIDI2MywgIDIzMiB9LCB7ICAyMzMsICAyMDIgfSwgeyAgMjkzLCAgMjYyIH0sCisgICAgeyAgMzUyLCAgMzIxIH0sIHsgIDMyMywgIDI5MiB9LCB7ICAgMTUsICAgMTUgfSwgeyAgIDc4LCAgIDQ3IH0sCisgICAgeyAgMjAzLCAgMTcyIH0sIHsgIDI2NCwgIDIzMyB9LCB7ICAyOTQsICAyNjMgfSwgeyAgMzI0LCAgMjkzIH0sCisgICAgeyAgMTcyLCAgMTQxIH0sIHsgIDM1MywgIDMyMiB9LCB7ICAxNDEsICAxMTAgfSwgeyAgMjM0LCAgMjAzIH0sCisgICAgeyAgMzUyLCAgMzUyIH0sIHsgICA0NywgICAxNiB9LCB7ICAyOTUsICAyNjQgfSwgeyAgMTEwLCAgIDc5IH0sCisgICAgeyAgMjY1LCAgMjM0IH0sIHsgIDM1NCwgIDMyMyB9LCB7ICAzMjUsICAyOTQgfSwgeyAgIDc5LCAgIDQ4IH0sCisgICAgeyAgIDE2LCAgIDE2IH0sIHsgIDIwNCwgIDE3MyB9LCB7ICAyMzUsICAyMDQgfSwgeyAgMTczLCAgMTQyIH0sCisgICAgeyAgMzU1LCAgMzI0IH0sIHsgIDM4NCwgIDM1MyB9LCB7ICAzMjYsICAyOTUgfSwgeyAgMTQyLCAgMTExIH0sCisgICAgeyAgMjk2LCAgMjY1IH0sIHsgIDI2NiwgIDIzNSB9LCB7ICAzNTYsICAzMjUgfSwgeyAgMzg1LCAgMzU0IH0sCisgICAgeyAgMTExLCAgIDgwIH0sIHsgICA0OCwgICAxNyB9LCB7ICAzMjcsICAyOTYgfSwgeyAgMjk3LCAgMjY2IH0sCisgICAgeyAgMjA1LCAgMTc0IH0sIHsgIDM4NCwgIDM4NCB9LCB7ICAyMzYsICAyMDUgfSwgeyAgMzU3LCAgMzI2IH0sCisgICAgeyAgMzg2LCAgMzU1IH0sIHsgICA4MCwgICA0OSB9LCB7ICAxNzQsICAxNDMgfSwgeyAgIDE3LCAgIDE3IH0sCisgICAgeyAgMzI4LCAgMjk3IH0sIHsgIDM1OCwgIDMyNyB9LCB7ICAzODcsICAzNTYgfSwgeyAgMjk4LCAgMjY3IH0sCisgICAgeyAgMzI5LCAgMjk4IH0sIHsgIDM4OCwgIDM1NyB9LCB7ICAxMTIsICAgODEgfSwgeyAgNDE2LCAgMzg1IH0sCisgICAgeyAgMjM3LCAgMjA2IH0sIHsgIDM1OSwgIDMyOCB9LCB7ICAgNDksICAgMTggfSwgeyAgMjA2LCAgMTc1IH0sCisgICAgeyAgNDE3LCAgMzg2IH0sIHsgIDM4OSwgIDM1OCB9LCB7ICAzMzAsICAyOTkgfSwgeyAgIDE4LCAgIDE4IH0sCisgICAgeyAgNDE2LCAgNDE2IH0sIHsgIDM2MCwgIDMyOSB9LCB7ICAgODEsICAgNTAgfSwgeyAgNDE4LCAgMzg3IH0sCisgICAgeyAgMzkwLCAgMzU5IH0sIHsgIDIzOCwgIDIwNyB9LCB7ICAgNTAsICAgMTkgfSwgeyAgMzYxLCAgMzMwIH0sCisgICAgeyAgNDE5LCAgMzg4IH0sIHsgIDExMywgICA4MiB9LCB7ICA0NDgsICA0MTcgfSwgeyAgNDQ4LCAgNDQ4IH0sCisgICAgeyAgNDIwLCAgMzg5IH0sIHsgICA4MiwgICA1MSB9LCB7ICAzNjIsICAzMzEgfSwgeyAgNDQ5LCAgNDE4IH0sCisgICAgeyAgNDIxLCAgMzkwIH0sIHsgIDQ4MCwgIDQ4MCB9LCB7ICA0NTAsICA0MTkgfSwgeyAgNDIyLCAgMzkxIH0sCisgICAgeyAgMTE0LCAgIDgzIH0sIHsgIDQ1MSwgIDQyMCB9LCB7ICA0ODAsICA0NDkgfSwgeyAgNDUyLCAgNDIxIH0sCisgICAgeyAgNDgxLCAgNDUwIH0sIHsgIDQ1MywgIDQyMiB9LCB7ICA1MTIsICA1MTIgfSwgeyAgNDgyLCAgNDUxIH0sCisgICAgeyAgNDU0LCAgNDIzIH0sIHsgIDUxMiwgIDQ4MSB9LCB7ICA0ODMsICA0NTIgfSwgeyAgNTEzLCAgNDgyIH0sCisgICAgeyAgNDg0LCAgNDUzIH0sIHsgIDUxNCwgIDQ4MyB9LCB7ICA0ODUsICA0NTQgfSwgeyAgNTQ0LCAgNTEzIH0sCisgICAgeyAgNTQ0LCAgNTQ0IH0sIHsgIDQ4NiwgIDQ1NSB9LCB7ICA1NDUsICA1MTQgfSwgeyAgNTQ2LCAgNTE1IH0sCisgICAgeyAgNTc2LCAgNTc2IH0sIHsgIDU3NiwgIDU0NSB9LCB7ICA1NzcsICA1NDYgfSwgeyAgNTc4LCAgNTQ3IH0sCisgICAgeyAgNjA4LCAgNTc3IH0sIHsgIDYwOSwgIDU3OCB9LCB7ICA2MTAsICA1NzkgfSwgeyAgIDE5LCAgIDE5IH0sCisgICAgeyAgMTQzLCAgMTEyIH0sIHsgIDI2NywgIDIzNiB9LCB7ICAzOTEsICAzNjAgfSwgeyAgNTE1LCAgNDg0IH0sCisgICAgeyAgNjA4LCAgNjA4IH0sIHsgICAyMCwgICAyMCB9LCB7ICAgNTEsICAgMjAgfSwgeyAgMTQ0LCAgMTEzIH0sCisgICAgeyAgMTc1LCAgMTQ0IH0sIHsgIDI2OCwgIDIzNyB9LCB7ICAyOTksICAyNjggfSwgeyAgMzkyLCAgMzYxIH0sCisgICAgeyAgNDIzLCAgMzkyIH0sIHsgIDUxNiwgIDQ4NSB9LCB7ICA1NDcsICA1MTYgfSwgeyAgNjQwLCAgNjA5IH0sCisgICAgeyAgNjQwLCAgNjQwIH0sIHsgICAyMSwgICAyMSB9LCB7ICAgNTIsICAgMjEgfSwgeyAgIDgzLCAgIDUyIH0sCisgICAgeyAgMTQ1LCAgMTE0IH0sIHsgIDE3NiwgIDE0NSB9LCB7ICAyMDcsICAxNzYgfSwgeyAgMjY5LCAgMjM4IH0sCisgICAgeyAgMzAwLCAgMjY5IH0sIHsgIDMzMSwgIDMwMCB9LCB7ICAzOTMsICAzNjIgfSwgeyAgNDI0LCAgMzkzIH0sCisgICAgeyAgNDU1LCAgNDI0IH0sIHsgIDUxNywgIDQ4NiB9LCB7ICA1NDgsICA1MTcgfSwgeyAgNTc5LCAgNTQ4IH0sCisgICAgeyAgNjQxLCAgNjEwIH0sIHsgIDY3MiwgIDY0MSB9LCB7ICA2NzIsICA2NzIgfSwgeyAgIDIyLCAgIDIyIH0sCisgICAgeyAgIDUzLCAgIDIyIH0sIHsgICA4NCwgICA1MyB9LCB7ICAxMTUsICAgODQgfSwgeyAgMTQ2LCAgMTE1IH0sCisgICAgeyAgMTc3LCAgMTQ2IH0sIHsgIDIwOCwgIDE3NyB9LCB7ICAyMzksICAyMDggfSwgeyAgMjcwLCAgMjM5IH0sCisgICAgeyAgMzAxLCAgMjcwIH0sIHsgIDMzMiwgIDMwMSB9LCB7ICAzNjMsICAzMzIgfSwgeyAgMzk0LCAgMzYzIH0sCisgICAgeyAgNDI1LCAgMzk0IH0sIHsgIDQ1NiwgIDQyNSB9LCB7ICA0ODcsICA0NTYgfSwgeyAgNTE4LCAgNDg3IH0sCisgICAgeyAgNTQ5LCAgNTE4IH0sIHsgIDU4MCwgIDU0OSB9LCB7ICA2MTEsICA1ODAgfSwgeyAgNjQyLCAgNjExIH0sCisgICAgeyAgNjczLCAgNjQyIH0sIHsgIDcwNCwgIDY3MyB9LCB7ICA3MDQsICA3MDQgfSwgeyAgIDU0LCAgIDIzIH0sCisgICAgeyAgIDg1LCAgIDU0IH0sIHsgIDExNiwgICA4NSB9LCB7ICAxNzgsICAxNDcgfSwgeyAgMjA5LCAgMTc4IH0sCisgICAgeyAgMjQwLCAgMjA5IH0sIHsgIDMwMiwgIDI3MSB9LCB7ICAzMzMsICAzMDIgfSwgeyAgMzY0LCAgMzMzIH0sCisgICAgeyAgNDI2LCAgMzk1IH0sIHsgIDQ1NywgIDQyNiB9LCB7ICA0ODgsICA0NTcgfSwgeyAgNTUwLCAgNTE5IH0sCisgICAgeyAgNTgxLCAgNTUwIH0sIHsgIDYxMiwgIDU4MSB9LCB7ICA2NzQsICA2NDMgfSwgeyAgNzA1LCAgNjc0IH0sCisgICAgeyAgNzM2LCAgNzA1IH0sIHsgICA4NiwgICA1NSB9LCB7ICAxMTcsICAgODYgfSwgeyAgMjEwLCAgMTc5IH0sCisgICAgeyAgMjQxLCAgMjEwIH0sIHsgIDMzNCwgIDMwMyB9LCB7ICAzNjUsICAzMzQgfSwgeyAgNDU4LCAgNDI3IH0sCisgICAgeyAgNDg5LCAgNDU4IH0sIHsgIDU4MiwgIDU1MSB9LCB7ICA2MTMsICA1ODIgfSwgeyAgNzA2LCAgNjc1IH0sCisgICAgeyAgNzM3LCAgNzA2IH0sIHsgIDExOCwgICA4NyB9LCB7ICAyNDIsICAyMTEgfSwgeyAgMzY2LCAgMzM1IH0sCisgICAgeyAgNDkwLCAgNDU5IH0sIHsgIDYxNCwgIDU4MyB9LCB7ICA3MzgsICA3MDcgfSwgeyAgIDIzLCAgIDIzIH0sCisgICAgeyAgMTQ3LCAgMTE2IH0sIHsgIDI3MSwgIDI0MCB9LCB7ICAzOTUsICAzNjQgfSwgeyAgNTE5LCAgNDg4IH0sCisgICAgeyAgNjQzLCAgNjEyIH0sIHsgIDczNiwgIDczNiB9LCB7ICAgMjQsICAgMjQgfSwgeyAgIDU1LCAgIDI0IH0sCisgICAgeyAgMTQ4LCAgMTE3IH0sIHsgIDE3OSwgIDE0OCB9LCB7ICAyNzIsICAyNDEgfSwgeyAgMzAzLCAgMjcyIH0sCisgICAgeyAgMzk2LCAgMzY1IH0sIHsgIDQyNywgIDM5NiB9LCB7ICA1MjAsICA0ODkgfSwgeyAgNTUxLCAgNTIwIH0sCisgICAgeyAgNjQ0LCAgNjEzIH0sIHsgIDY3NSwgIDY0NCB9LCB7ICA3NjgsICA3MzcgfSwgeyAgNzY4LCAgNzY4IH0sCisgICAgeyAgIDI1LCAgIDI1IH0sIHsgICA1NiwgICAyNSB9LCB7ICAgODcsICAgNTYgfSwgeyAgMTQ5LCAgMTE4IH0sCisgICAgeyAgMTgwLCAgMTQ5IH0sIHsgIDIxMSwgIDE4MCB9LCB7ICAyNzMsICAyNDIgfSwgeyAgMzA0LCAgMjczIH0sCisgICAgeyAgMzM1LCAgMzA0IH0sIHsgIDM5NywgIDM2NiB9LCB7ICA0MjgsICAzOTcgfSwgeyAgNDU5LCAgNDI4IH0sCisgICAgeyAgNTIxLCAgNDkwIH0sIHsgIDU1MiwgIDUyMSB9LCB7ICA1ODMsICA1NTIgfSwgeyAgNjQ1LCAgNjE0IH0sCisgICAgeyAgNjc2LCAgNjQ1IH0sIHsgIDcwNywgIDY3NiB9LCB7ICA3NjksICA3MzggfSwgeyAgODAwLCAgNzY5IH0sCisgICAgeyAgODAwLCAgODAwIH0sIHsgICAyNiwgICAyNiB9LCB7ICAgNTcsICAgMjYgfSwgeyAgIDg4LCAgIDU3IH0sCisgICAgeyAgMTE5LCAgIDg4IH0sIHsgIDE1MCwgIDExOSB9LCB7ICAxODEsICAxNTAgfSwgeyAgMjEyLCAgMTgxIH0sCisgICAgeyAgMjQzLCAgMjEyIH0sIHsgIDI3NCwgIDI0MyB9LCB7ICAzMDUsICAyNzQgfSwgeyAgMzM2LCAgMzA1IH0sCisgICAgeyAgMzY3LCAgMzM2IH0sIHsgIDM5OCwgIDM2NyB9LCB7ICA0MjksICAzOTggfSwgeyAgNDYwLCAgNDI5IH0sCisgICAgeyAgNDkxLCAgNDYwIH0sIHsgIDUyMiwgIDQ5MSB9LCB7ICA1NTMsICA1MjIgfSwgeyAgNTg0LCAgNTUzIH0sCisgICAgeyAgNjE1LCAgNTg0IH0sIHsgIDY0NiwgIDYxNSB9LCB7ICA2NzcsICA2NDYgfSwgeyAgNzA4LCAgNjc3IH0sCisgICAgeyAgNzM5LCAgNzA4IH0sIHsgIDc3MCwgIDczOSB9LCB7ICA4MDEsICA3NzAgfSwgeyAgODMyLCAgODAxIH0sCisgICAgeyAgODMyLCAgODMyIH0sIHsgICA1OCwgICAyNyB9LCB7ICAgODksICAgNTggfSwgeyAgMTIwLCAgIDg5IH0sCisgICAgeyAgMTgyLCAgMTUxIH0sIHsgIDIxMywgIDE4MiB9LCB7ICAyNDQsICAyMTMgfSwgeyAgMzA2LCAgMjc1IH0sCisgICAgeyAgMzM3LCAgMzA2IH0sIHsgIDM2OCwgIDMzNyB9LCB7ICA0MzAsICAzOTkgfSwgeyAgNDYxLCAgNDMwIH0sCisgICAgeyAgNDkyLCAgNDYxIH0sIHsgIDU1NCwgIDUyMyB9LCB7ICA1ODUsICA1NTQgfSwgeyAgNjE2LCAgNTg1IH0sCisgICAgeyAgNjc4LCAgNjQ3IH0sIHsgIDcwOSwgIDY3OCB9LCB7ICA3NDAsICA3MDkgfSwgeyAgODAyLCAgNzcxIH0sCisgICAgeyAgODMzLCAgODAyIH0sIHsgIDg2NCwgIDgzMyB9LCB7ICAgOTAsICAgNTkgfSwgeyAgMTIxLCAgIDkwIH0sCisgICAgeyAgMjE0LCAgMTgzIH0sIHsgIDI0NSwgIDIxNCB9LCB7ICAzMzgsICAzMDcgfSwgeyAgMzY5LCAgMzM4IH0sCisgICAgeyAgNDYyLCAgNDMxIH0sIHsgIDQ5MywgIDQ2MiB9LCB7ICA1ODYsICA1NTUgfSwgeyAgNjE3LCAgNTg2IH0sCisgICAgeyAgNzEwLCAgNjc5IH0sIHsgIDc0MSwgIDcxMCB9LCB7ICA4MzQsICA4MDMgfSwgeyAgODY1LCAgODM0IH0sCisgICAgeyAgMTIyLCAgIDkxIH0sIHsgIDI0NiwgIDIxNSB9LCB7ICAzNzAsICAzMzkgfSwgeyAgNDk0LCAgNDYzIH0sCisgICAgeyAgNjE4LCAgNTg3IH0sIHsgIDc0MiwgIDcxMSB9LCB7ICA4NjYsICA4MzUgfSwgeyAgIDI3LCAgIDI3IH0sCisgICAgeyAgMTUxLCAgMTIwIH0sIHsgIDI3NSwgIDI0NCB9LCB7ICAzOTksICAzNjggfSwgeyAgNTIzLCAgNDkyIH0sCisgICAgeyAgNjQ3LCAgNjE2IH0sIHsgIDc3MSwgIDc0MCB9LCB7ICA4NjQsICA4NjQgfSwgeyAgIDI4LCAgIDI4IH0sCisgICAgeyAgIDU5LCAgIDI4IH0sIHsgIDE1MiwgIDEyMSB9LCB7ICAxODMsICAxNTIgfSwgeyAgMjc2LCAgMjQ1IH0sCisgICAgeyAgMzA3LCAgMjc2IH0sIHsgIDQwMCwgIDM2OSB9LCB7ICA0MzEsICA0MDAgfSwgeyAgNTI0LCAgNDkzIH0sCisgICAgeyAgNTU1LCAgNTI0IH0sIHsgIDY0OCwgIDYxNyB9LCB7ICA2NzksICA2NDggfSwgeyAgNzcyLCAgNzQxIH0sCisgICAgeyAgODAzLCAgNzcyIH0sIHsgIDg5NiwgIDg2NSB9LCB7ICA4OTYsICA4OTYgfSwgeyAgIDI5LCAgIDI5IH0sCisgICAgeyAgIDYwLCAgIDI5IH0sIHsgICA5MSwgICA2MCB9LCB7ICAxNTMsICAxMjIgfSwgeyAgMTg0LCAgMTUzIH0sCisgICAgeyAgMjE1LCAgMTg0IH0sIHsgIDI3NywgIDI0NiB9LCB7ICAzMDgsICAyNzcgfSwgeyAgMzM5LCAgMzA4IH0sCisgICAgeyAgNDAxLCAgMzcwIH0sIHsgIDQzMiwgIDQwMSB9LCB7ICA0NjMsICA0MzIgfSwgeyAgNTI1LCAgNDk0IH0sCisgICAgeyAgNTU2LCAgNTI1IH0sIHsgIDU4NywgIDU1NiB9LCB7ICA2NDksICA2MTggfSwgeyAgNjgwLCAgNjQ5IH0sCisgICAgeyAgNzExLCAgNjgwIH0sIHsgIDc3MywgIDc0MiB9LCB7ICA4MDQsICA3NzMgfSwgeyAgODM1LCAgODA0IH0sCisgICAgeyAgODk3LCAgODY2IH0sIHsgIDkyOCwgIDg5NyB9LCB7ICA5MjgsICA5MjggfSwgeyAgIDMwLCAgIDMwIH0sCisgICAgeyAgIDYxLCAgIDMwIH0sIHsgICA5MiwgICA2MSB9LCB7ICAxMjMsICAgOTIgfSwgeyAgMTU0LCAgMTIzIH0sCisgICAgeyAgMTg1LCAgMTU0IH0sIHsgIDIxNiwgIDE4NSB9LCB7ICAyNDcsICAyMTYgfSwgeyAgMjc4LCAgMjQ3IH0sCisgICAgeyAgMzA5LCAgMjc4IH0sIHsgIDM0MCwgIDMwOSB9LCB7ICAzNzEsICAzNDAgfSwgeyAgNDAyLCAgMzcxIH0sCisgICAgeyAgNDMzLCAgNDAyIH0sIHsgIDQ2NCwgIDQzMyB9LCB7ICA0OTUsICA0NjQgfSwgeyAgNTI2LCAgNDk1IH0sCisgICAgeyAgNTU3LCAgNTI2IH0sIHsgIDU4OCwgIDU1NyB9LCB7ICA2MTksICA1ODggfSwgeyAgNjUwLCAgNjE5IH0sCisgICAgeyAgNjgxLCAgNjUwIH0sIHsgIDcxMiwgIDY4MSB9LCB7ICA3NDMsICA3MTIgfSwgeyAgNzc0LCAgNzQzIH0sCisgICAgeyAgODA1LCAgNzc0IH0sIHsgIDgzNiwgIDgwNSB9LCB7ICA4NjcsICA4MzYgfSwgeyAgODk4LCAgODY3IH0sCisgICAgeyAgOTI5LCAgODk4IH0sIHsgIDk2MCwgIDkyOSB9LCB7ICA5NjAsICA5NjAgfSwgeyAgIDYyLCAgIDMxIH0sCisgICAgeyAgIDkzLCAgIDYyIH0sIHsgIDEyNCwgICA5MyB9LCB7ICAxODYsICAxNTUgfSwgeyAgMjE3LCAgMTg2IH0sCisgICAgeyAgMjQ4LCAgMjE3IH0sIHsgIDMxMCwgIDI3OSB9LCB7ICAzNDEsICAzMTAgfSwgeyAgMzcyLCAgMzQxIH0sCisgICAgeyAgNDM0LCAgNDAzIH0sIHsgIDQ2NSwgIDQzNCB9LCB7ICA0OTYsICA0NjUgfSwgeyAgNTU4LCAgNTI3IH0sCisgICAgeyAgNTg5LCAgNTU4IH0sIHsgIDYyMCwgIDU4OSB9LCB7ICA2ODIsICA2NTEgfSwgeyAgNzEzLCAgNjgyIH0sCisgICAgeyAgNzQ0LCAgNzEzIH0sIHsgIDgwNiwgIDc3NSB9LCB7ICA4MzcsICA4MDYgfSwgeyAgODY4LCAgODM3IH0sCisgICAgeyAgOTMwLCAgODk5IH0sIHsgIDk2MSwgIDkzMCB9LCB7ICA5OTIsICA5NjEgfSwgeyAgIDk0LCAgIDYzIH0sCisgICAgeyAgMTI1LCAgIDk0IH0sIHsgIDIxOCwgIDE4NyB9LCB7ICAyNDksICAyMTggfSwgeyAgMzQyLCAgMzExIH0sCisgICAgeyAgMzczLCAgMzQyIH0sIHsgIDQ2NiwgIDQzNSB9LCB7ICA0OTcsICA0NjYgfSwgeyAgNTkwLCAgNTU5IH0sCisgICAgeyAgNjIxLCAgNTkwIH0sIHsgIDcxNCwgIDY4MyB9LCB7ICA3NDUsICA3MTQgfSwgeyAgODM4LCAgODA3IH0sCisgICAgeyAgODY5LCAgODM4IH0sIHsgIDk2MiwgIDkzMSB9LCB7ICA5OTMsICA5NjIgfSwgeyAgMTI2LCAgIDk1IH0sCisgICAgeyAgMjUwLCAgMjE5IH0sIHsgIDM3NCwgIDM0MyB9LCB7ICA0OTgsICA0NjcgfSwgeyAgNjIyLCAgNTkxIH0sCisgICAgeyAgNzQ2LCAgNzE1IH0sIHsgIDg3MCwgIDgzOSB9LCB7ICA5OTQsICA5NjMgfSwgeyAgMTU1LCAgMTI0IH0sCisgICAgeyAgMjc5LCAgMjQ4IH0sIHsgIDQwMywgIDM3MiB9LCB7ICA1MjcsICA0OTYgfSwgeyAgNjUxLCAgNjIwIH0sCisgICAgeyAgNzc1LCAgNzQ0IH0sIHsgIDg5OSwgIDg2OCB9LCB7ICAxNTYsICAxMjUgfSwgeyAgMTg3LCAgMTU2IH0sCisgICAgeyAgMjgwLCAgMjQ5IH0sIHsgIDMxMSwgIDI4MCB9LCB7ICA0MDQsICAzNzMgfSwgeyAgNDM1LCAgNDA0IH0sCisgICAgeyAgNTI4LCAgNDk3IH0sIHsgIDU1OSwgIDUyOCB9LCB7ICA2NTIsICA2MjEgfSwgeyAgNjgzLCAgNjUyIH0sCisgICAgeyAgNzc2LCAgNzQ1IH0sIHsgIDgwNywgIDc3NiB9LCB7ICA5MDAsICA4NjkgfSwgeyAgOTMxLCAgOTAwIH0sCisgICAgeyAgMTU3LCAgMTI2IH0sIHsgIDE4OCwgIDE1NyB9LCB7ICAyMTksICAxODggfSwgeyAgMjgxLCAgMjUwIH0sCisgICAgeyAgMzEyLCAgMjgxIH0sIHsgIDM0MywgIDMxMiB9LCB7ICA0MDUsICAzNzQgfSwgeyAgNDM2LCAgNDA1IH0sCisgICAgeyAgNDY3LCAgNDM2IH0sIHsgIDUyOSwgIDQ5OCB9LCB7ICA1NjAsICA1MjkgfSwgeyAgNTkxLCAgNTYwIH0sCisgICAgeyAgNjUzLCAgNjIyIH0sIHsgIDY4NCwgIDY1MyB9LCB7ICA3MTUsICA2ODQgfSwgeyAgNzc3LCAgNzQ2IH0sCisgICAgeyAgODA4LCAgNzc3IH0sIHsgIDgzOSwgIDgwOCB9LCB7ICA5MDEsICA4NzAgfSwgeyAgOTMyLCAgOTAxIH0sCisgICAgeyAgOTYzLCAgOTMyIH0sIHsgIDE1OCwgIDEyNyB9LCB7ICAxODksICAxNTggfSwgeyAgMjIwLCAgMTg5IH0sCisgICAgeyAgMjUxLCAgMjIwIH0sIHsgIDI4MiwgIDI1MSB9LCB7ICAzMTMsICAyODIgfSwgeyAgMzQ0LCAgMzEzIH0sCisgICAgeyAgMzc1LCAgMzQ0IH0sIHsgIDQwNiwgIDM3NSB9LCB7ICA0MzcsICA0MDYgfSwgeyAgNDY4LCAgNDM3IH0sCisgICAgeyAgNDk5LCAgNDY4IH0sIHsgIDUzMCwgIDQ5OSB9LCB7ICA1NjEsICA1MzAgfSwgeyAgNTkyLCAgNTYxIH0sCisgICAgeyAgNjIzLCAgNTkyIH0sIHsgIDY1NCwgIDYyMyB9LCB7ICA2ODUsICA2NTQgfSwgeyAgNzE2LCAgNjg1IH0sCisgICAgeyAgNzQ3LCAgNzE2IH0sIHsgIDc3OCwgIDc0NyB9LCB7ICA4MDksICA3NzggfSwgeyAgODQwLCAgODA5IH0sCisgICAgeyAgODcxLCAgODQwIH0sIHsgIDkwMiwgIDg3MSB9LCB7ICA5MzMsICA5MDIgfSwgeyAgOTY0LCAgOTMzIH0sCisgICAgeyAgOTk1LCAgOTY0IH0sIHsgIDE5MCwgIDE1OSB9LCB7ICAyMjEsICAxOTAgfSwgeyAgMjUyLCAgMjIxIH0sCisgICAgeyAgMzE0LCAgMjgzIH0sIHsgIDM0NSwgIDMxNCB9LCB7ICAzNzYsICAzNDUgfSwgeyAgNDM4LCAgNDA3IH0sCisgICAgeyAgNDY5LCAgNDM4IH0sIHsgIDUwMCwgIDQ2OSB9LCB7ICA1NjIsICA1MzEgfSwgeyAgNTkzLCAgNTYyIH0sCisgICAgeyAgNjI0LCAgNTkzIH0sIHsgIDY4NiwgIDY1NSB9LCB7ICA3MTcsICA2ODYgfSwgeyAgNzQ4LCAgNzE3IH0sCisgICAgeyAgODEwLCAgNzc5IH0sIHsgIDg0MSwgIDgxMCB9LCB7ICA4NzIsICA4NDEgfSwgeyAgOTM0LCAgOTAzIH0sCisgICAgeyAgOTY1LCAgOTM0IH0sIHsgIDk5NiwgIDk2NSB9LCB7ICAyMjIsICAxOTEgfSwgeyAgMjUzLCAgMjIyIH0sCisgICAgeyAgMzQ2LCAgMzE1IH0sIHsgIDM3NywgIDM0NiB9LCB7ICA0NzAsICA0MzkgfSwgeyAgNTAxLCAgNDcwIH0sCisgICAgeyAgNTk0LCAgNTYzIH0sIHsgIDYyNSwgIDU5NCB9LCB7ICA3MTgsICA2ODcgfSwgeyAgNzQ5LCAgNzE4IH0sCisgICAgeyAgODQyLCAgODExIH0sIHsgIDg3MywgIDg0MiB9LCB7ICA5NjYsICA5MzUgfSwgeyAgOTk3LCAgOTY2IH0sCisgICAgeyAgMjU0LCAgMjIzIH0sIHsgIDM3OCwgIDM0NyB9LCB7ICA1MDIsICA0NzEgfSwgeyAgNjI2LCAgNTk1IH0sCisgICAgeyAgNzUwLCAgNzE5IH0sIHsgIDg3NCwgIDg0MyB9LCB7ICA5OTgsICA5NjcgfSwgeyAgMjgzLCAgMjUyIH0sCisgICAgeyAgNDA3LCAgMzc2IH0sIHsgIDUzMSwgIDUwMCB9LCB7ICA2NTUsICA2MjQgfSwgeyAgNzc5LCAgNzQ4IH0sCisgICAgeyAgOTAzLCAgODcyIH0sIHsgIDI4NCwgIDI1MyB9LCB7ICAzMTUsICAyODQgfSwgeyAgNDA4LCAgMzc3IH0sCisgICAgeyAgNDM5LCAgNDA4IH0sIHsgIDUzMiwgIDUwMSB9LCB7ICA1NjMsICA1MzIgfSwgeyAgNjU2LCAgNjI1IH0sCisgICAgeyAgNjg3LCAgNjU2IH0sIHsgIDc4MCwgIDc0OSB9LCB7ICA4MTEsICA3ODAgfSwgeyAgOTA0LCAgODczIH0sCisgICAgeyAgOTM1LCAgOTA0IH0sIHsgIDI4NSwgIDI1NCB9LCB7ICAzMTYsICAyODUgfSwgeyAgMzQ3LCAgMzE2IH0sCisgICAgeyAgNDA5LCAgMzc4IH0sIHsgIDQ0MCwgIDQwOSB9LCB7ICA0NzEsICA0NDAgfSwgeyAgNTMzLCAgNTAyIH0sCisgICAgeyAgNTY0LCAgNTMzIH0sIHsgIDU5NSwgIDU2NCB9LCB7ICA2NTcsICA2MjYgfSwgeyAgNjg4LCAgNjU3IH0sCisgICAgeyAgNzE5LCAgNjg4IH0sIHsgIDc4MSwgIDc1MCB9LCB7ICA4MTIsICA3ODEgfSwgeyAgODQzLCAgODEyIH0sCisgICAgeyAgOTA1LCAgODc0IH0sIHsgIDkzNiwgIDkwNSB9LCB7ICA5NjcsICA5MzYgfSwgeyAgMjg2LCAgMjU1IH0sCisgICAgeyAgMzE3LCAgMjg2IH0sIHsgIDM0OCwgIDMxNyB9LCB7ICAzNzksICAzNDggfSwgeyAgNDEwLCAgMzc5IH0sCisgICAgeyAgNDQxLCAgNDEwIH0sIHsgIDQ3MiwgIDQ0MSB9LCB7ICA1MDMsICA0NzIgfSwgeyAgNTM0LCAgNTAzIH0sCisgICAgeyAgNTY1LCAgNTM0IH0sIHsgIDU5NiwgIDU2NSB9LCB7ICA2MjcsICA1OTYgfSwgeyAgNjU4LCAgNjI3IH0sCisgICAgeyAgNjg5LCAgNjU4IH0sIHsgIDcyMCwgIDY4OSB9LCB7ICA3NTEsICA3MjAgfSwgeyAgNzgyLCAgNzUxIH0sCisgICAgeyAgODEzLCAgNzgyIH0sIHsgIDg0NCwgIDgxMyB9LCB7ICA4NzUsICA4NDQgfSwgeyAgOTA2LCAgODc1IH0sCisgICAgeyAgOTM3LCAgOTA2IH0sIHsgIDk2OCwgIDkzNyB9LCB7ICA5OTksICA5NjggfSwgeyAgMzE4LCAgMjg3IH0sCisgICAgeyAgMzQ5LCAgMzE4IH0sIHsgIDM4MCwgIDM0OSB9LCB7ICA0NDIsICA0MTEgfSwgeyAgNDczLCAgNDQyIH0sCisgICAgeyAgNTA0LCAgNDczIH0sIHsgIDU2NiwgIDUzNSB9LCB7ICA1OTcsICA1NjYgfSwgeyAgNjI4LCAgNTk3IH0sCisgICAgeyAgNjkwLCAgNjU5IH0sIHsgIDcyMSwgIDY5MCB9LCB7ICA3NTIsICA3MjEgfSwgeyAgODE0LCAgNzgzIH0sCisgICAgeyAgODQ1LCAgODE0IH0sIHsgIDg3NiwgIDg0NSB9LCB7ICA5MzgsICA5MDcgfSwgeyAgOTY5LCAgOTM4IH0sCisgICAgeyAxMDAwLCAgOTY5IH0sIHsgIDM1MCwgIDMxOSB9LCB7ICAzODEsICAzNTAgfSwgeyAgNDc0LCAgNDQzIH0sCisgICAgeyAgNTA1LCAgNDc0IH0sIHsgIDU5OCwgIDU2NyB9LCB7ICA2MjksICA1OTggfSwgeyAgNzIyLCAgNjkxIH0sCisgICAgeyAgNzUzLCAgNzIyIH0sIHsgIDg0NiwgIDgxNSB9LCB7ICA4NzcsICA4NDYgfSwgeyAgOTcwLCAgOTM5IH0sCisgICAgeyAxMDAxLCAgOTcwIH0sIHsgIDM4MiwgIDM1MSB9LCB7ICA1MDYsICA0NzUgfSwgeyAgNjMwLCAgNTk5IH0sCisgICAgeyAgNzU0LCAgNzIzIH0sIHsgIDg3OCwgIDg0NyB9LCB7IDEwMDIsICA5NzEgfSwgeyAgNDExLCAgMzgwIH0sCisgICAgeyAgNTM1LCAgNTA0IH0sIHsgIDY1OSwgIDYyOCB9LCB7ICA3ODMsICA3NTIgfSwgeyAgOTA3LCAgODc2IH0sCisgICAgeyAgNDEyLCAgMzgxIH0sIHsgIDQ0MywgIDQxMiB9LCB7ICA1MzYsICA1MDUgfSwgeyAgNTY3LCAgNTM2IH0sCisgICAgeyAgNjYwLCAgNjI5IH0sIHsgIDY5MSwgIDY2MCB9LCB7ICA3ODQsICA3NTMgfSwgeyAgODE1LCAgNzg0IH0sCisgICAgeyAgOTA4LCAgODc3IH0sIHsgIDkzOSwgIDkwOCB9LCB7ICA0MTMsICAzODIgfSwgeyAgNDQ0LCAgNDEzIH0sCisgICAgeyAgNDc1LCAgNDQ0IH0sIHsgIDUzNywgIDUwNiB9LCB7ICA1NjgsICA1MzcgfSwgeyAgNTk5LCAgNTY4IH0sCisgICAgeyAgNjYxLCAgNjMwIH0sIHsgIDY5MiwgIDY2MSB9LCB7ICA3MjMsICA2OTIgfSwgeyAgNzg1LCAgNzU0IH0sCisgICAgeyAgODE2LCAgNzg1IH0sIHsgIDg0NywgIDgxNiB9LCB7ICA5MDksICA4NzggfSwgeyAgOTQwLCAgOTA5IH0sCisgICAgeyAgOTcxLCAgOTQwIH0sIHsgIDQxNCwgIDM4MyB9LCB7ICA0NDUsICA0MTQgfSwgeyAgNDc2LCAgNDQ1IH0sCisgICAgeyAgNTA3LCAgNDc2IH0sIHsgIDUzOCwgIDUwNyB9LCB7ICA1NjksICA1MzggfSwgeyAgNjAwLCAgNTY5IH0sCisgICAgeyAgNjMxLCAgNjAwIH0sIHsgIDY2MiwgIDYzMSB9LCB7ICA2OTMsICA2NjIgfSwgeyAgNzI0LCAgNjkzIH0sCisgICAgeyAgNzU1LCAgNzI0IH0sIHsgIDc4NiwgIDc1NSB9LCB7ICA4MTcsICA3ODYgfSwgeyAgODQ4LCAgODE3IH0sCisgICAgeyAgODc5LCAgODQ4IH0sIHsgIDkxMCwgIDg3OSB9LCB7ICA5NDEsICA5MTAgfSwgeyAgOTcyLCAgOTQxIH0sCisgICAgeyAxMDAzLCAgOTcyIH0sIHsgIDQ0NiwgIDQxNSB9LCB7ICA0NzcsICA0NDYgfSwgeyAgNTA4LCAgNDc3IH0sCisgICAgeyAgNTcwLCAgNTM5IH0sIHsgIDYwMSwgIDU3MCB9LCB7ICA2MzIsICA2MDEgfSwgeyAgNjk0LCAgNjYzIH0sCisgICAgeyAgNzI1LCAgNjk0IH0sIHsgIDc1NiwgIDcyNSB9LCB7ICA4MTgsICA3ODcgfSwgeyAgODQ5LCAgODE4IH0sCisgICAgeyAgODgwLCAgODQ5IH0sIHsgIDk0MiwgIDkxMSB9LCB7ICA5NzMsICA5NDIgfSwgeyAxMDA0LCAgOTczIH0sCisgICAgeyAgNDc4LCAgNDQ3IH0sIHsgIDUwOSwgIDQ3OCB9LCB7ICA2MDIsICA1NzEgfSwgeyAgNjMzLCAgNjAyIH0sCisgICAgeyAgNzI2LCAgNjk1IH0sIHsgIDc1NywgIDcyNiB9LCB7ICA4NTAsICA4MTkgfSwgeyAgODgxLCAgODUwIH0sCisgICAgeyAgOTc0LCAgOTQzIH0sIHsgMTAwNSwgIDk3NCB9LCB7ICA1MTAsICA0NzkgfSwgeyAgNjM0LCAgNjAzIH0sCisgICAgeyAgNzU4LCAgNzI3IH0sIHsgIDg4MiwgIDg1MSB9LCB7IDEwMDYsICA5NzUgfSwgeyAgNTM5LCAgNTA4IH0sCisgICAgeyAgNjYzLCAgNjMyIH0sIHsgIDc4NywgIDc1NiB9LCB7ICA5MTEsICA4ODAgfSwgeyAgNTQwLCAgNTA5IH0sCisgICAgeyAgNTcxLCAgNTQwIH0sIHsgIDY2NCwgIDYzMyB9LCB7ICA2OTUsICA2NjQgfSwgeyAgNzg4LCAgNzU3IH0sCisgICAgeyAgODE5LCAgNzg4IH0sIHsgIDkxMiwgIDg4MSB9LCB7ICA5NDMsICA5MTIgfSwgeyAgNTQxLCAgNTEwIH0sCisgICAgeyAgNTcyLCAgNTQxIH0sIHsgIDYwMywgIDU3MiB9LCB7ICA2NjUsICA2MzQgfSwgeyAgNjk2LCAgNjY1IH0sCisgICAgeyAgNzI3LCAgNjk2IH0sIHsgIDc4OSwgIDc1OCB9LCB7ICA4MjAsICA3ODkgfSwgeyAgODUxLCAgODIwIH0sCisgICAgeyAgOTEzLCAgODgyIH0sIHsgIDk0NCwgIDkxMyB9LCB7ICA5NzUsICA5NDQgfSwgeyAgNTQyLCAgNTExIH0sCisgICAgeyAgNTczLCAgNTQyIH0sIHsgIDYwNCwgIDU3MyB9LCB7ICA2MzUsICA2MDQgfSwgeyAgNjY2LCAgNjM1IH0sCisgICAgeyAgNjk3LCAgNjY2IH0sIHsgIDcyOCwgIDY5NyB9LCB7ICA3NTksICA3MjggfSwgeyAgNzkwLCAgNzU5IH0sCisgICAgeyAgODIxLCAgNzkwIH0sIHsgIDg1MiwgIDgyMSB9LCB7ICA4ODMsICA4NTIgfSwgeyAgOTE0LCAgODgzIH0sCisgICAgeyAgOTQ1LCAgOTE0IH0sIHsgIDk3NiwgIDk0NSB9LCB7IDEwMDcsICA5NzYgfSwgeyAgNTc0LCAgNTQzIH0sCisgICAgeyAgNjA1LCAgNTc0IH0sIHsgIDYzNiwgIDYwNSB9LCB7ICA2OTgsICA2NjcgfSwgeyAgNzI5LCAgNjk4IH0sCisgICAgeyAgNzYwLCAgNzI5IH0sIHsgIDgyMiwgIDc5MSB9LCB7ICA4NTMsICA4MjIgfSwgeyAgODg0LCAgODUzIH0sCisgICAgeyAgOTQ2LCAgOTE1IH0sIHsgIDk3NywgIDk0NiB9LCB7IDEwMDgsICA5NzcgfSwgeyAgNjA2LCAgNTc1IH0sCisgICAgeyAgNjM3LCAgNjA2IH0sIHsgIDczMCwgIDY5OSB9LCB7ICA3NjEsICA3MzAgfSwgeyAgODU0LCAgODIzIH0sCisgICAgeyAgODg1LCAgODU0IH0sIHsgIDk3OCwgIDk0NyB9LCB7IDEwMDksICA5NzggfSwgeyAgNjM4LCAgNjA3IH0sCisgICAgeyAgNzYyLCAgNzMxIH0sIHsgIDg4NiwgIDg1NSB9LCB7IDEwMTAsICA5NzkgfSwgeyAgNjY3LCAgNjM2IH0sCisgICAgeyAgNzkxLCAgNzYwIH0sIHsgIDkxNSwgIDg4NCB9LCB7ICA2NjgsICA2MzcgfSwgeyAgNjk5LCAgNjY4IH0sCisgICAgeyAgNzkyLCAgNzYxIH0sIHsgIDgyMywgIDc5MiB9LCB7ICA5MTYsICA4ODUgfSwgeyAgOTQ3LCAgOTE2IH0sCisgICAgeyAgNjY5LCAgNjM4IH0sIHsgIDcwMCwgIDY2OSB9LCB7ICA3MzEsICA3MDAgfSwgeyAgNzkzLCAgNzYyIH0sCisgICAgeyAgODI0LCAgNzkzIH0sIHsgIDg1NSwgIDgyNCB9LCB7ICA5MTcsICA4ODYgfSwgeyAgOTQ4LCAgOTE3IH0sCisgICAgeyAgOTc5LCAgOTQ4IH0sIHsgIDY3MCwgIDYzOSB9LCB7ICA3MDEsICA2NzAgfSwgeyAgNzMyLCAgNzAxIH0sCisgICAgeyAgNzYzLCAgNzMyIH0sIHsgIDc5NCwgIDc2MyB9LCB7ICA4MjUsICA3OTQgfSwgeyAgODU2LCAgODI1IH0sCisgICAgeyAgODg3LCAgODU2IH0sIHsgIDkxOCwgIDg4NyB9LCB7ICA5NDksICA5MTggfSwgeyAgOTgwLCAgOTQ5IH0sCisgICAgeyAxMDExLCAgOTgwIH0sIHsgIDcwMiwgIDY3MSB9LCB7ICA3MzMsICA3MDIgfSwgeyAgNzY0LCAgNzMzIH0sCisgICAgeyAgODI2LCAgNzk1IH0sIHsgIDg1NywgIDgyNiB9LCB7ICA4ODgsICA4NTcgfSwgeyAgOTUwLCAgOTE5IH0sCisgICAgeyAgOTgxLCAgOTUwIH0sIHsgMTAxMiwgIDk4MSB9LCB7ICA3MzQsICA3MDMgfSwgeyAgNzY1LCAgNzM0IH0sCisgICAgeyAgODU4LCAgODI3IH0sIHsgIDg4OSwgIDg1OCB9LCB7ICA5ODIsICA5NTEgfSwgeyAxMDEzLCAgOTgyIH0sCisgICAgeyAgNzY2LCAgNzM1IH0sIHsgIDg5MCwgIDg1OSB9LCB7IDEwMTQsICA5ODMgfSwgeyAgNzk1LCAgNzY0IH0sCisgICAgeyAgOTE5LCAgODg4IH0sIHsgIDc5NiwgIDc2NSB9LCB7ICA4MjcsICA3OTYgfSwgeyAgOTIwLCAgODg5IH0sCisgICAgeyAgOTUxLCAgOTIwIH0sIHsgIDc5NywgIDc2NiB9LCB7ICA4MjgsICA3OTcgfSwgeyAgODU5LCAgODI4IH0sCisgICAgeyAgOTIxLCAgODkwIH0sIHsgIDk1MiwgIDkyMSB9LCB7ICA5ODMsICA5NTIgfSwgeyAgNzk4LCAgNzY3IH0sCisgICAgeyAgODI5LCAgNzk4IH0sIHsgIDg2MCwgIDgyOSB9LCB7ICA4OTEsICA4NjAgfSwgeyAgOTIyLCAgODkxIH0sCisgICAgeyAgOTUzLCAgOTIyIH0sIHsgIDk4NCwgIDk1MyB9LCB7IDEwMTUsICA5ODQgfSwgeyAgODMwLCAgNzk5IH0sCisgICAgeyAgODYxLCAgODMwIH0sIHsgIDg5MiwgIDg2MSB9LCB7ICA5NTQsICA5MjMgfSwgeyAgOTg1LCAgOTU0IH0sCisgICAgeyAxMDE2LCAgOTg1IH0sIHsgIDg2MiwgIDgzMSB9LCB7ICA4OTMsICA4NjIgfSwgeyAgOTg2LCAgOTU1IH0sCisgICAgeyAxMDE3LCAgOTg2IH0sIHsgIDg5NCwgIDg2MyB9LCB7IDEwMTgsICA5ODcgfSwgeyAgOTIzLCAgODkyIH0sCisgICAgeyAgOTI0LCAgODkzIH0sIHsgIDk1NSwgIDkyNCB9LCB7ICA5MjUsICA4OTQgfSwgeyAgOTU2LCAgOTI1IH0sCisgICAgeyAgOTg3LCAgOTU2IH0sIHsgIDkyNiwgIDg5NSB9LCB7ICA5NTcsICA5MjYgfSwgeyAgOTg4LCAgOTU3IH0sCisgICAgeyAxMDE5LCAgOTg4IH0sIHsgIDk1OCwgIDkyNyB9LCB7ICA5ODksICA5NTggfSwgeyAxMDIwLCAgOTg5IH0sCisgICAgeyAgOTkwLCAgOTU5IH0sIHsgMTAyMSwgIDk5MCB9LCB7IDEwMjIsICA5OTEgfSwgeyAgICAwLCAgICAwIH0sCit9OworCitjb25zdCBpbnQxNl90ICgqIGNvbnN0IGZmX3ZwOV9zY2Fuc19uYls1XVs0XSlbMl0gPSB7CisgICAgeworICAgICAgICBmZl92cDlfZGVmYXVsdF9zY2FuXzR4NF9uYiwgZmZfdnA5X2NvbF9zY2FuXzR4NF9uYiwKKyAgICAgICAgZmZfdnA5X3Jvd19zY2FuXzR4NF9uYiwgZmZfdnA5X2RlZmF1bHRfc2Nhbl80eDRfbmIKKyAgICB9LCB7CisgICAgICAgIGZmX3ZwOV9kZWZhdWx0X3NjYW5fOHg4X25iLCBmZl92cDlfY29sX3NjYW5fOHg4X25iLAorICAgICAgICBmZl92cDlfcm93X3NjYW5fOHg4X25iLCBmZl92cDlfZGVmYXVsdF9zY2FuXzh4OF9uYgorICAgIH0sIHsKKyAgICAgICAgZmZfdnA5X2RlZmF1bHRfc2Nhbl8xNngxNl9uYiwgZmZfdnA5X2NvbF9zY2FuXzE2eDE2X25iLAorICAgICAgICBmZl92cDlfcm93X3NjYW5fMTZ4MTZfbmIsIGZmX3ZwOV9kZWZhdWx0X3NjYW5fMTZ4MTZfbmIKKyAgICB9LCB7CisgICAgICAgIGZmX3ZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmIsIGZmX3ZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmIsCisgICAgICAgIGZmX3ZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmIsIGZmX3ZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmIKKyAgICB9LCB7IC8vIGxvc3NsZXNzCisgICAgICAgIGZmX3ZwOV9kZWZhdWx0X3NjYW5fNHg0X25iLCBmZl92cDlfZGVmYXVsdF9zY2FuXzR4NF9uYiwKKyAgICAgICAgZmZfdnA5X2RlZmF1bHRfc2Nhbl80eDRfbmIsIGZmX3ZwOV9kZWZhdWx0X3NjYW5fNHg0X25iCisgICAgfQorfTsKKworY29uc3QgdWludDhfdCBmZl92cDlfbW9kZWxfcGFyZXRvOFsyNTZdWzhdID0geworICAgIHsgICA2LCAgODYsIDEyOCwgIDExLCAgODcsICA0MiwgIDkxLCAgNTIgfSwKKyAgICB7ICAgMywgIDg2LCAxMjgsICAgNiwgIDg2LCAgMjMsICA4OCwgIDI5IH0sCisgICAgeyAgIDYsICA4NiwgMTI4LCAgMTEsICA4NywgIDQyLCAgOTEsICA1MiB9LAorICAgIHsgICA5LCAgODYsIDEyOSwgIDE3LCAgODgsICA2MSwgIDk0LCAgNzYgfSwKKyAgICB7ICAxMiwgIDg2LCAxMjksICAyMiwgIDg4LCAgNzcsICA5NywgIDkzIH0sCisgICAgeyAgMTUsICA4NywgMTI5LCAgMjgsICA4OSwgIDkzLCAxMDAsIDExMCB9LAorICAgIHsgIDE3LCAgODcsIDEyOSwgIDMzLCAgOTAsIDEwNSwgMTAzLCAxMjMgfSwKKyAgICB7ICAyMCwgIDg4LCAxMzAsICAzOCwgIDkxLCAxMTgsIDEwNiwgMTM2IH0sCisgICAgeyAgMjMsICA4OCwgMTMwLCAgNDMsICA5MSwgMTI4LCAxMDgsIDE0NiB9LAorICAgIHsgIDI2LCAgODksIDEzMSwgIDQ4LCAgOTIsIDEzOSwgMTExLCAxNTYgfSwKKyAgICB7ICAyOCwgIDg5LCAxMzEsICA1MywgIDkzLCAxNDcsIDExNCwgMTYzIH0sCisgICAgeyAgMzEsICA5MCwgMTMxLCAgNTgsICA5NCwgMTU2LCAxMTcsIDE3MSB9LAorICAgIHsgIDM0LCAgOTAsIDEzMSwgIDYyLCAgOTQsIDE2MywgMTE5LCAxNzcgfSwKKyAgICB7ICAzNywgIDkwLCAxMzIsICA2NiwgIDk1LCAxNzEsIDEyMiwgMTg0IH0sCisgICAgeyAgMzksICA5MCwgMTMyLCAgNzAsICA5NiwgMTc3LCAxMjQsIDE4OSB9LAorICAgIHsgIDQyLCAgOTEsIDEzMiwgIDc1LCAgOTcsIDE4MywgMTI3LCAxOTQgfSwKKyAgICB7ICA0NCwgIDkxLCAxMzIsICA3OSwgIDk3LCAxODgsIDEyOSwgMTk4IH0sCisgICAgeyAgNDcsICA5MiwgMTMzLCAgODMsICA5OCwgMTkzLCAxMzIsIDIwMiB9LAorICAgIHsgIDQ5LCAgOTIsIDEzMywgIDg2LCAgOTksIDE5NywgMTM0LCAyMDUgfSwKKyAgICB7ICA1MiwgIDkzLCAxMzMsICA5MCwgMTAwLCAyMDEsIDEzNywgMjA4IH0sCisgICAgeyAgNTQsICA5MywgMTMzLCAgOTQsIDEwMCwgMjA0LCAxMzksIDIxMSB9LAorICAgIHsgIDU3LCAgOTQsIDEzNCwgIDk4LCAxMDEsIDIwOCwgMTQyLCAyMTQgfSwKKyAgICB7ICA1OSwgIDk0LCAxMzQsIDEwMSwgMTAyLCAyMTEsIDE0NCwgMjE2IH0sCisgICAgeyAgNjIsICA5NCwgMTM1LCAxMDUsIDEwMywgMjE0LCAxNDYsIDIxOCB9LAorICAgIHsgIDY0LCAgOTQsIDEzNSwgMTA4LCAxMDMsIDIxNiwgMTQ4LCAyMjAgfSwKKyAgICB7ICA2NiwgIDk1LCAxMzUsIDExMSwgMTA0LCAyMTksIDE1MSwgMjIyIH0sCisgICAgeyAgNjgsICA5NSwgMTM1LCAxMTQsIDEwNSwgMjIxLCAxNTMsIDIyMyB9LAorICAgIHsgIDcxLCAgOTYsIDEzNiwgMTE3LCAxMDYsIDIyNCwgMTU1LCAyMjUgfSwKKyAgICB7ICA3MywgIDk2LCAxMzYsIDEyMCwgMTA2LCAyMjUsIDE1NywgMjI2IH0sCisgICAgeyAgNzYsICA5NywgMTM2LCAxMjMsIDEwNywgMjI3LCAxNTksIDIyOCB9LAorICAgIHsgIDc4LCAgOTcsIDEzNiwgMTI2LCAxMDgsIDIyOSwgMTYwLCAyMjkgfSwKKyAgICB7ICA4MCwgIDk4LCAxMzcsIDEyOSwgMTA5LCAyMzEsIDE2MiwgMjMxIH0sCisgICAgeyAgODIsICA5OCwgMTM3LCAxMzEsIDEwOSwgMjMyLCAxNjQsIDIzMiB9LAorICAgIHsgIDg0LCAgOTgsIDEzOCwgMTM0LCAxMTAsIDIzNCwgMTY2LCAyMzMgfSwKKyAgICB7ICA4NiwgIDk4LCAxMzgsIDEzNywgMTExLCAyMzUsIDE2OCwgMjM0IH0sCisgICAgeyAgODksICA5OSwgMTM4LCAxNDAsIDExMiwgMjM2LCAxNzAsIDIzNSB9LAorICAgIHsgIDkxLCAgOTksIDEzOCwgMTQyLCAxMTIsIDIzNywgMTcxLCAyMzUgfSwKKyAgICB7ICA5MywgMTAwLCAxMzksIDE0NSwgMTEzLCAyMzgsIDE3MywgMjM2IH0sCisgICAgeyAgOTUsIDEwMCwgMTM5LCAxNDcsIDExNCwgMjM5LCAxNzQsIDIzNyB9LAorICAgIHsgIDk3LCAxMDEsIDE0MCwgMTQ5LCAxMTUsIDI0MCwgMTc2LCAyMzggfSwKKyAgICB7ICA5OSwgMTAxLCAxNDAsIDE1MSwgMTE1LCAyNDEsIDE3NywgMjM4IH0sCisgICAgeyAxMDEsIDEwMiwgMTQwLCAxNTQsIDExNiwgMjQyLCAxNzksIDIzOSB9LAorICAgIHsgMTAzLCAxMDIsIDE0MCwgMTU2LCAxMTcsIDI0MiwgMTgwLCAyMzkgfSwKKyAgICB7IDEwNSwgMTAzLCAxNDEsIDE1OCwgMTE4LCAyNDMsIDE4MiwgMjQwIH0sCisgICAgeyAxMDcsIDEwMywgMTQxLCAxNjAsIDExOCwgMjQzLCAxODMsIDI0MCB9LAorICAgIHsgMTA5LCAxMDQsIDE0MSwgMTYyLCAxMTksIDI0NCwgMTg1LCAyNDEgfSwKKyAgICB7IDExMSwgMTA0LCAxNDEsIDE2NCwgMTE5LCAyNDQsIDE4NiwgMjQxIH0sCisgICAgeyAxMTMsIDEwNCwgMTQyLCAxNjYsIDEyMCwgMjQ1LCAxODcsIDI0MiB9LAorICAgIHsgMTE0LCAxMDQsIDE0MiwgMTY4LCAxMjEsIDI0NSwgMTg4LCAyNDIgfSwKKyAgICB7IDExNiwgMTA1LCAxNDMsIDE3MCwgMTIyLCAyNDYsIDE5MCwgMjQzIH0sCisgICAgeyAxMTgsIDEwNSwgMTQzLCAxNzEsIDEyMiwgMjQ2LCAxOTEsIDI0MyB9LAorICAgIHsgMTIwLCAxMDYsIDE0MywgMTczLCAxMjMsIDI0NywgMTkyLCAyNDQgfSwKKyAgICB7IDEyMSwgMTA2LCAxNDMsIDE3NSwgMTI0LCAyNDcsIDE5MywgMjQ0IH0sCisgICAgeyAxMjMsIDEwNywgMTQ0LCAxNzcsIDEyNSwgMjQ4LCAxOTUsIDI0NCB9LAorICAgIHsgMTI1LCAxMDcsIDE0NCwgMTc4LCAxMjUsIDI0OCwgMTk2LCAyNDQgfSwKKyAgICB7IDEyNywgMTA4LCAxNDUsIDE4MCwgMTI2LCAyNDksIDE5NywgMjQ1IH0sCisgICAgeyAxMjgsIDEwOCwgMTQ1LCAxODEsIDEyNywgMjQ5LCAxOTgsIDI0NSB9LAorICAgIHsgMTMwLCAxMDksIDE0NSwgMTgzLCAxMjgsIDI0OSwgMTk5LCAyNDUgfSwKKyAgICB7IDEzMiwgMTA5LCAxNDUsIDE4NCwgMTI4LCAyNDksIDIwMCwgMjQ1IH0sCisgICAgeyAxMzQsIDExMCwgMTQ2LCAxODYsIDEyOSwgMjUwLCAyMDEsIDI0NiB9LAorICAgIHsgMTM1LCAxMTAsIDE0NiwgMTg3LCAxMzAsIDI1MCwgMjAyLCAyNDYgfSwKKyAgICB7IDEzNywgMTExLCAxNDcsIDE4OSwgMTMxLCAyNTEsIDIwMywgMjQ2IH0sCisgICAgeyAxMzgsIDExMSwgMTQ3LCAxOTAsIDEzMSwgMjUxLCAyMDQsIDI0NiB9LAorICAgIHsgMTQwLCAxMTIsIDE0NywgMTkyLCAxMzIsIDI1MSwgMjA1LCAyNDcgfSwKKyAgICB7IDE0MSwgMTEyLCAxNDcsIDE5MywgMTMyLCAyNTEsIDIwNiwgMjQ3IH0sCisgICAgeyAxNDMsIDExMywgMTQ4LCAxOTQsIDEzMywgMjUxLCAyMDcsIDI0NyB9LAorICAgIHsgMTQ0LCAxMTMsIDE0OCwgMTk1LCAxMzQsIDI1MSwgMjA3LCAyNDcgfSwKKyAgICB7IDE0NiwgMTE0LCAxNDksIDE5NywgMTM1LCAyNTIsIDIwOCwgMjQ4IH0sCisgICAgeyAxNDcsIDExNCwgMTQ5LCAxOTgsIDEzNSwgMjUyLCAyMDksIDI0OCB9LAorICAgIHsgMTQ5LCAxMTUsIDE0OSwgMTk5LCAxMzYsIDI1MiwgMjEwLCAyNDggfSwKKyAgICB7IDE1MCwgMTE1LCAxNDksIDIwMCwgMTM3LCAyNTIsIDIxMCwgMjQ4IH0sCisgICAgeyAxNTIsIDExNSwgMTUwLCAyMDEsIDEzOCwgMjUyLCAyMTEsIDI0OCB9LAorICAgIHsgMTUzLCAxMTUsIDE1MCwgMjAyLCAxMzgsIDI1MiwgMjEyLCAyNDggfSwKKyAgICB7IDE1NSwgMTE2LCAxNTEsIDIwNCwgMTM5LCAyNTMsIDIxMywgMjQ5IH0sCisgICAgeyAxNTYsIDExNiwgMTUxLCAyMDUsIDEzOSwgMjUzLCAyMTMsIDI0OSB9LAorICAgIHsgMTU4LCAxMTcsIDE1MSwgMjA2LCAxNDAsIDI1MywgMjE0LCAyNDkgfSwKKyAgICB7IDE1OSwgMTE3LCAxNTEsIDIwNywgMTQxLCAyNTMsIDIxNSwgMjQ5IH0sCisgICAgeyAxNjEsIDExOCwgMTUyLCAyMDgsIDE0MiwgMjUzLCAyMTYsIDI0OSB9LAorICAgIHsgMTYyLCAxMTgsIDE1MiwgMjA5LCAxNDIsIDI1MywgMjE2LCAyNDkgfSwKKyAgICB7IDE2MywgMTE5LCAxNTMsIDIxMCwgMTQzLCAyNTMsIDIxNywgMjQ5IH0sCisgICAgeyAxNjQsIDExOSwgMTUzLCAyMTEsIDE0MywgMjUzLCAyMTcsIDI0OSB9LAorICAgIHsgMTY2LCAxMjAsIDE1MywgMjEyLCAxNDQsIDI1NCwgMjE4LCAyNTAgfSwKKyAgICB7IDE2NywgMTIwLCAxNTMsIDIxMiwgMTQ1LCAyNTQsIDIxOSwgMjUwIH0sCisgICAgeyAxNjgsIDEyMSwgMTU0LCAyMTMsIDE0NiwgMjU0LCAyMjAsIDI1MCB9LAorICAgIHsgMTY5LCAxMjEsIDE1NCwgMjE0LCAxNDYsIDI1NCwgMjIwLCAyNTAgfSwKKyAgICB7IDE3MSwgMTIyLCAxNTUsIDIxNSwgMTQ3LCAyNTQsIDIyMSwgMjUwIH0sCisgICAgeyAxNzIsIDEyMiwgMTU1LCAyMTYsIDE0NywgMjU0LCAyMjEsIDI1MCB9LAorICAgIHsgMTczLCAxMjMsIDE1NSwgMjE3LCAxNDgsIDI1NCwgMjIyLCAyNTAgfSwKKyAgICB7IDE3NCwgMTIzLCAxNTUsIDIxNywgMTQ5LCAyNTQsIDIyMiwgMjUwIH0sCisgICAgeyAxNzYsIDEyNCwgMTU2LCAyMTgsIDE1MCwgMjU0LCAyMjMsIDI1MCB9LAorICAgIHsgMTc3LCAxMjQsIDE1NiwgMjE5LCAxNTAsIDI1NCwgMjIzLCAyNTAgfSwKKyAgICB7IDE3OCwgMTI1LCAxNTcsIDIyMCwgMTUxLCAyNTQsIDIyNCwgMjUxIH0sCisgICAgeyAxNzksIDEyNSwgMTU3LCAyMjAsIDE1MSwgMjU0LCAyMjQsIDI1MSB9LAorICAgIHsgMTgwLCAxMjYsIDE1NywgMjIxLCAxNTIsIDI1NCwgMjI1LCAyNTEgfSwKKyAgICB7IDE4MSwgMTI2LCAxNTcsIDIyMSwgMTUyLCAyNTQsIDIyNSwgMjUxIH0sCisgICAgeyAxODMsIDEyNywgMTU4LCAyMjIsIDE1MywgMjU0LCAyMjYsIDI1MSB9LAorICAgIHsgMTg0LCAxMjcsIDE1OCwgMjIzLCAxNTQsIDI1NCwgMjI2LCAyNTEgfSwKKyAgICB7IDE4NSwgMTI4LCAxNTksIDIyNCwgMTU1LCAyNTUsIDIyNywgMjUxIH0sCisgICAgeyAxODYsIDEyOCwgMTU5LCAyMjQsIDE1NSwgMjU1LCAyMjcsIDI1MSB9LAorICAgIHsgMTg3LCAxMjksIDE2MCwgMjI1LCAxNTYsIDI1NSwgMjI4LCAyNTEgfSwKKyAgICB7IDE4OCwgMTMwLCAxNjAsIDIyNSwgMTU2LCAyNTUsIDIyOCwgMjUxIH0sCisgICAgeyAxODksIDEzMSwgMTYwLCAyMjYsIDE1NywgMjU1LCAyMjgsIDI1MSB9LAorICAgIHsgMTkwLCAxMzEsIDE2MCwgMjI2LCAxNTgsIDI1NSwgMjI4LCAyNTEgfSwKKyAgICB7IDE5MSwgMTMyLCAxNjEsIDIyNywgMTU5LCAyNTUsIDIyOSwgMjUxIH0sCisgICAgeyAxOTIsIDEzMiwgMTYxLCAyMjcsIDE1OSwgMjU1LCAyMjksIDI1MSB9LAorICAgIHsgMTkzLCAxMzMsIDE2MiwgMjI4LCAxNjAsIDI1NSwgMjMwLCAyNTIgfSwKKyAgICB7IDE5NCwgMTMzLCAxNjIsIDIyOSwgMTYwLCAyNTUsIDIzMCwgMjUyIH0sCisgICAgeyAxOTUsIDEzNCwgMTYzLCAyMzAsIDE2MSwgMjU1LCAyMzEsIDI1MiB9LAorICAgIHsgMTk2LCAxMzQsIDE2MywgMjMwLCAxNjEsIDI1NSwgMjMxLCAyNTIgfSwKKyAgICB7IDE5NywgMTM1LCAxNjMsIDIzMSwgMTYyLCAyNTUsIDIzMSwgMjUyIH0sCisgICAgeyAxOTgsIDEzNSwgMTYzLCAyMzEsIDE2MiwgMjU1LCAyMzEsIDI1MiB9LAorICAgIHsgMTk5LCAxMzYsIDE2NCwgMjMyLCAxNjMsIDI1NSwgMjMyLCAyNTIgfSwKKyAgICB7IDIwMCwgMTM2LCAxNjQsIDIzMiwgMTY0LCAyNTUsIDIzMiwgMjUyIH0sCisgICAgeyAyMDEsIDEzNywgMTY1LCAyMzMsIDE2NSwgMjU1LCAyMzMsIDI1MiB9LAorICAgIHsgMjAxLCAxMzcsIDE2NSwgMjMzLCAxNjUsIDI1NSwgMjMzLCAyNTIgfSwKKyAgICB7IDIwMiwgMTM4LCAxNjYsIDIzMywgMTY2LCAyNTUsIDIzMywgMjUyIH0sCisgICAgeyAyMDMsIDEzOCwgMTY2LCAyMzMsIDE2NiwgMjU1LCAyMzMsIDI1MiB9LAorICAgIHsgMjA0LCAxMzksIDE2NiwgMjM0LCAxNjcsIDI1NSwgMjM0LCAyNTIgfSwKKyAgICB7IDIwNSwgMTM5LCAxNjYsIDIzNCwgMTY3LCAyNTUsIDIzNCwgMjUyIH0sCisgICAgeyAyMDYsIDE0MCwgMTY3LCAyMzUsIDE2OCwgMjU1LCAyMzUsIDI1MiB9LAorICAgIHsgMjA2LCAxNDAsIDE2NywgMjM1LCAxNjgsIDI1NSwgMjM1LCAyNTIgfSwKKyAgICB7IDIwNywgMTQxLCAxNjgsIDIzNiwgMTY5LCAyNTUsIDIzNSwgMjUyIH0sCisgICAgeyAyMDgsIDE0MSwgMTY4LCAyMzYsIDE3MCwgMjU1LCAyMzUsIDI1MiB9LAorICAgIHsgMjA5LCAxNDIsIDE2OSwgMjM3LCAxNzEsIDI1NSwgMjM2LCAyNTIgfSwKKyAgICB7IDIwOSwgMTQzLCAxNjksIDIzNywgMTcxLCAyNTUsIDIzNiwgMjUyIH0sCisgICAgeyAyMTAsIDE0NCwgMTY5LCAyMzcsIDE3MiwgMjU1LCAyMzYsIDI1MiB9LAorICAgIHsgMjExLCAxNDQsIDE2OSwgMjM3LCAxNzIsIDI1NSwgMjM2LCAyNTIgfSwKKyAgICB7IDIxMiwgMTQ1LCAxNzAsIDIzOCwgMTczLCAyNTUsIDIzNywgMjUyIH0sCisgICAgeyAyMTMsIDE0NSwgMTcwLCAyMzgsIDE3MywgMjU1LCAyMzcsIDI1MiB9LAorICAgIHsgMjE0LCAxNDYsIDE3MSwgMjM5LCAxNzQsIDI1NSwgMjM3LCAyNTMgfSwKKyAgICB7IDIxNCwgMTQ2LCAxNzEsIDIzOSwgMTc0LCAyNTUsIDIzNywgMjUzIH0sCisgICAgeyAyMTUsIDE0NywgMTcyLCAyNDAsIDE3NSwgMjU1LCAyMzgsIDI1MyB9LAorICAgIHsgMjE1LCAxNDcsIDE3MiwgMjQwLCAxNzUsIDI1NSwgMjM4LCAyNTMgfSwKKyAgICB7IDIxNiwgMTQ4LCAxNzMsIDI0MCwgMTc2LCAyNTUsIDIzOCwgMjUzIH0sCisgICAgeyAyMTcsIDE0OCwgMTczLCAyNDAsIDE3NiwgMjU1LCAyMzgsIDI1MyB9LAorICAgIHsgMjE4LCAxNDksIDE3MywgMjQxLCAxNzcsIDI1NSwgMjM5LCAyNTMgfSwKKyAgICB7IDIxOCwgMTQ5LCAxNzMsIDI0MSwgMTc4LCAyNTUsIDIzOSwgMjUzIH0sCisgICAgeyAyMTksIDE1MCwgMTc0LCAyNDEsIDE3OSwgMjU1LCAyMzksIDI1MyB9LAorICAgIHsgMjE5LCAxNTEsIDE3NCwgMjQxLCAxNzksIDI1NSwgMjM5LCAyNTMgfSwKKyAgICB7IDIyMCwgMTUyLCAxNzUsIDI0MiwgMTgwLCAyNTUsIDI0MCwgMjUzIH0sCisgICAgeyAyMjEsIDE1MiwgMTc1LCAyNDIsIDE4MCwgMjU1LCAyNDAsIDI1MyB9LAorICAgIHsgMjIyLCAxNTMsIDE3NiwgMjQyLCAxODEsIDI1NSwgMjQwLCAyNTMgfSwKKyAgICB7IDIyMiwgMTUzLCAxNzYsIDI0MiwgMTgxLCAyNTUsIDI0MCwgMjUzIH0sCisgICAgeyAyMjMsIDE1NCwgMTc3LCAyNDMsIDE4MiwgMjU1LCAyNDAsIDI1MyB9LAorICAgIHsgMjIzLCAxNTQsIDE3NywgMjQzLCAxODIsIDI1NSwgMjQwLCAyNTMgfSwKKyAgICB7IDIyNCwgMTU1LCAxNzgsIDI0NCwgMTgzLCAyNTUsIDI0MSwgMjUzIH0sCisgICAgeyAyMjQsIDE1NSwgMTc4LCAyNDQsIDE4MywgMjU1LCAyNDEsIDI1MyB9LAorICAgIHsgMjI1LCAxNTYsIDE3OCwgMjQ0LCAxODQsIDI1NSwgMjQxLCAyNTMgfSwKKyAgICB7IDIyNSwgMTU3LCAxNzgsIDI0NCwgMTg0LCAyNTUsIDI0MSwgMjUzIH0sCisgICAgeyAyMjYsIDE1OCwgMTc5LCAyNDQsIDE4NSwgMjU1LCAyNDIsIDI1MyB9LAorICAgIHsgMjI3LCAxNTgsIDE3OSwgMjQ0LCAxODUsIDI1NSwgMjQyLCAyNTMgfSwKKyAgICB7IDIyOCwgMTU5LCAxODAsIDI0NSwgMTg2LCAyNTUsIDI0MiwgMjUzIH0sCisgICAgeyAyMjgsIDE1OSwgMTgwLCAyNDUsIDE4NiwgMjU1LCAyNDIsIDI1MyB9LAorICAgIHsgMjI5LCAxNjAsIDE4MSwgMjQ1LCAxODcsIDI1NSwgMjQyLCAyNTMgfSwKKyAgICB7IDIyOSwgMTYwLCAxODEsIDI0NSwgMTg3LCAyNTUsIDI0MiwgMjUzIH0sCisgICAgeyAyMzAsIDE2MSwgMTgyLCAyNDYsIDE4OCwgMjU1LCAyNDMsIDI1MyB9LAorICAgIHsgMjMwLCAxNjIsIDE4MiwgMjQ2LCAxODgsIDI1NSwgMjQzLCAyNTMgfSwKKyAgICB7IDIzMSwgMTYzLCAxODMsIDI0NiwgMTg5LCAyNTUsIDI0MywgMjUzIH0sCisgICAgeyAyMzEsIDE2MywgMTgzLCAyNDYsIDE4OSwgMjU1LCAyNDMsIDI1MyB9LAorICAgIHsgMjMyLCAxNjQsIDE4NCwgMjQ3LCAxOTAsIDI1NSwgMjQzLCAyNTMgfSwKKyAgICB7IDIzMiwgMTY0LCAxODQsIDI0NywgMTkwLCAyNTUsIDI0MywgMjUzIH0sCisgICAgeyAyMzMsIDE2NSwgMTg1LCAyNDcsIDE5MSwgMjU1LCAyNDQsIDI1MyB9LAorICAgIHsgMjMzLCAxNjUsIDE4NSwgMjQ3LCAxOTEsIDI1NSwgMjQ0LCAyNTMgfSwKKyAgICB7IDIzNCwgMTY2LCAxODUsIDI0NywgMTkyLCAyNTUsIDI0NCwgMjUzIH0sCisgICAgeyAyMzQsIDE2NywgMTg1LCAyNDcsIDE5MiwgMjU1LCAyNDQsIDI1MyB9LAorICAgIHsgMjM1LCAxNjgsIDE4NiwgMjQ4LCAxOTMsIDI1NSwgMjQ0LCAyNTMgfSwKKyAgICB7IDIzNSwgMTY4LCAxODYsIDI0OCwgMTkzLCAyNTUsIDI0NCwgMjUzIH0sCisgICAgeyAyMzYsIDE2OSwgMTg3LCAyNDgsIDE5NCwgMjU1LCAyNDQsIDI1MyB9LAorICAgIHsgMjM2LCAxNjksIDE4NywgMjQ4LCAxOTQsIDI1NSwgMjQ0LCAyNTMgfSwKKyAgICB7IDIzNiwgMTcwLCAxODgsIDI0OCwgMTk1LCAyNTUsIDI0NSwgMjUzIH0sCisgICAgeyAyMzYsIDE3MCwgMTg4LCAyNDgsIDE5NSwgMjU1LCAyNDUsIDI1MyB9LAorICAgIHsgMjM3LCAxNzEsIDE4OSwgMjQ5LCAxOTYsIDI1NSwgMjQ1LCAyNTQgfSwKKyAgICB7IDIzNywgMTcyLCAxODksIDI0OSwgMTk2LCAyNTUsIDI0NSwgMjU0IH0sCisgICAgeyAyMzgsIDE3MywgMTkwLCAyNDksIDE5NywgMjU1LCAyNDUsIDI1NCB9LAorICAgIHsgMjM4LCAxNzMsIDE5MCwgMjQ5LCAxOTcsIDI1NSwgMjQ1LCAyNTQgfSwKKyAgICB7IDIzOSwgMTc0LCAxOTEsIDI0OSwgMTk4LCAyNTUsIDI0NSwgMjU0IH0sCisgICAgeyAyMzksIDE3NCwgMTkxLCAyNDksIDE5OCwgMjU1LCAyNDUsIDI1NCB9LAorICAgIHsgMjQwLCAxNzUsIDE5MiwgMjQ5LCAxOTksIDI1NSwgMjQ2LCAyNTQgfSwKKyAgICB7IDI0MCwgMTc2LCAxOTIsIDI0OSwgMTk5LCAyNTUsIDI0NiwgMjU0IH0sCisgICAgeyAyNDAsIDE3NywgMTkzLCAyNTAsIDIwMCwgMjU1LCAyNDYsIDI1NCB9LAorICAgIHsgMjQwLCAxNzcsIDE5MywgMjUwLCAyMDAsIDI1NSwgMjQ2LCAyNTQgfSwKKyAgICB7IDI0MSwgMTc4LCAxOTQsIDI1MCwgMjAxLCAyNTUsIDI0NiwgMjU0IH0sCisgICAgeyAyNDEsIDE3OCwgMTk0LCAyNTAsIDIwMSwgMjU1LCAyNDYsIDI1NCB9LAorICAgIHsgMjQyLCAxNzksIDE5NSwgMjUwLCAyMDIsIDI1NSwgMjQ2LCAyNTQgfSwKKyAgICB7IDI0MiwgMTgwLCAxOTUsIDI1MCwgMjAyLCAyNTUsIDI0NiwgMjU0IH0sCisgICAgeyAyNDIsIDE4MSwgMTk2LCAyNTAsIDIwMywgMjU1LCAyNDcsIDI1NCB9LAorICAgIHsgMjQyLCAxODEsIDE5NiwgMjUwLCAyMDMsIDI1NSwgMjQ3LCAyNTQgfSwKKyAgICB7IDI0MywgMTgyLCAxOTcsIDI1MSwgMjA0LCAyNTUsIDI0NywgMjU0IH0sCisgICAgeyAyNDMsIDE4MywgMTk3LCAyNTEsIDIwNCwgMjU1LCAyNDcsIDI1NCB9LAorICAgIHsgMjQ0LCAxODQsIDE5OCwgMjUxLCAyMDUsIDI1NSwgMjQ3LCAyNTQgfSwKKyAgICB7IDI0NCwgMTg0LCAxOTgsIDI1MSwgMjA1LCAyNTUsIDI0NywgMjU0IH0sCisgICAgeyAyNDQsIDE4NSwgMTk5LCAyNTEsIDIwNiwgMjU1LCAyNDcsIDI1NCB9LAorICAgIHsgMjQ0LCAxODUsIDE5OSwgMjUxLCAyMDYsIDI1NSwgMjQ3LCAyNTQgfSwKKyAgICB7IDI0NSwgMTg2LCAyMDAsIDI1MSwgMjA3LCAyNTUsIDI0NywgMjU0IH0sCisgICAgeyAyNDUsIDE4NywgMjAwLCAyNTEsIDIwNywgMjU1LCAyNDcsIDI1NCB9LAorICAgIHsgMjQ2LCAxODgsIDIwMSwgMjUyLCAyMDcsIDI1NSwgMjQ4LCAyNTQgfSwKKyAgICB7IDI0NiwgMTg4LCAyMDEsIDI1MiwgMjA3LCAyNTUsIDI0OCwgMjU0IH0sCisgICAgeyAyNDYsIDE4OSwgMjAyLCAyNTIsIDIwOCwgMjU1LCAyNDgsIDI1NCB9LAorICAgIHsgMjQ2LCAxOTAsIDIwMiwgMjUyLCAyMDgsIDI1NSwgMjQ4LCAyNTQgfSwKKyAgICB7IDI0NywgMTkxLCAyMDMsIDI1MiwgMjA5LCAyNTUsIDI0OCwgMjU0IH0sCisgICAgeyAyNDcsIDE5MSwgMjAzLCAyNTIsIDIwOSwgMjU1LCAyNDgsIDI1NCB9LAorICAgIHsgMjQ3LCAxOTIsIDIwNCwgMjUyLCAyMTAsIDI1NSwgMjQ4LCAyNTQgfSwKKyAgICB7IDI0NywgMTkzLCAyMDQsIDI1MiwgMjEwLCAyNTUsIDI0OCwgMjU0IH0sCisgICAgeyAyNDgsIDE5NCwgMjA1LCAyNTIsIDIxMSwgMjU1LCAyNDgsIDI1NCB9LAorICAgIHsgMjQ4LCAxOTQsIDIwNSwgMjUyLCAyMTEsIDI1NSwgMjQ4LCAyNTQgfSwKKyAgICB7IDI0OCwgMTk1LCAyMDYsIDI1MiwgMjEyLCAyNTUsIDI0OSwgMjU0IH0sCisgICAgeyAyNDgsIDE5NiwgMjA2LCAyNTIsIDIxMiwgMjU1LCAyNDksIDI1NCB9LAorICAgIHsgMjQ5LCAxOTcsIDIwNywgMjUzLCAyMTMsIDI1NSwgMjQ5LCAyNTQgfSwKKyAgICB7IDI0OSwgMTk3LCAyMDcsIDI1MywgMjEzLCAyNTUsIDI0OSwgMjU0IH0sCisgICAgeyAyNDksIDE5OCwgMjA4LCAyNTMsIDIxNCwgMjU1LCAyNDksIDI1NCB9LAorICAgIHsgMjQ5LCAxOTksIDIwOSwgMjUzLCAyMTQsIDI1NSwgMjQ5LCAyNTQgfSwKKyAgICB7IDI1MCwgMjAwLCAyMTAsIDI1MywgMjE1LCAyNTUsIDI0OSwgMjU0IH0sCisgICAgeyAyNTAsIDIwMCwgMjEwLCAyNTMsIDIxNSwgMjU1LCAyNDksIDI1NCB9LAorICAgIHsgMjUwLCAyMDEsIDIxMSwgMjUzLCAyMTUsIDI1NSwgMjQ5LCAyNTQgfSwKKyAgICB7IDI1MCwgMjAyLCAyMTEsIDI1MywgMjE1LCAyNTUsIDI0OSwgMjU0IH0sCisgICAgeyAyNTAsIDIwMywgMjEyLCAyNTMsIDIxNiwgMjU1LCAyNDksIDI1NCB9LAorICAgIHsgMjUwLCAyMDMsIDIxMiwgMjUzLCAyMTYsIDI1NSwgMjQ5LCAyNTQgfSwKKyAgICB7IDI1MSwgMjA0LCAyMTMsIDI1MywgMjE3LCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTEsIDIwNSwgMjEzLCAyNTMsIDIxNywgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUxLCAyMDYsIDIxNCwgMjU0LCAyMTgsIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MSwgMjA2LCAyMTUsIDI1NCwgMjE4LCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTIsIDIwNywgMjE2LCAyNTQsIDIxOSwgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUyLCAyMDgsIDIxNiwgMjU0LCAyMTksIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MiwgMjA5LCAyMTcsIDI1NCwgMjIwLCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTIsIDIxMCwgMjE3LCAyNTQsIDIyMCwgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUyLCAyMTEsIDIxOCwgMjU0LCAyMjEsIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MiwgMjEyLCAyMTgsIDI1NCwgMjIxLCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTMsIDIxMywgMjE5LCAyNTQsIDIyMiwgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUzLCAyMTMsIDIyMCwgMjU0LCAyMjIsIDI1NSwgMjUwLCAyNTQgfSwKKyAgICB7IDI1MywgMjE0LCAyMjEsIDI1NCwgMjIzLCAyNTUsIDI1MCwgMjU0IH0sCisgICAgeyAyNTMsIDIxNSwgMjIxLCAyNTQsIDIyMywgMjU1LCAyNTAsIDI1NCB9LAorICAgIHsgMjUzLCAyMTYsIDIyMiwgMjU0LCAyMjQsIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1MywgMjE3LCAyMjMsIDI1NCwgMjI0LCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTMsIDIxOCwgMjI0LCAyNTQsIDIyNSwgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjUzLCAyMTksIDIyNCwgMjU0LCAyMjUsIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1NCwgMjIwLCAyMjUsIDI1NCwgMjI1LCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTQsIDIyMSwgMjI2LCAyNTQsIDIyNSwgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjU0LCAyMjIsIDIyNywgMjU1LCAyMjYsIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1NCwgMjIzLCAyMjcsIDI1NSwgMjI2LCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTQsIDIyNCwgMjI4LCAyNTUsIDIyNywgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjU0LCAyMjUsIDIyOSwgMjU1LCAyMjcsIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1NCwgMjI2LCAyMzAsIDI1NSwgMjI4LCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTQsIDIyNywgMjMwLCAyNTUsIDIyOSwgMjU1LCAyNTEsIDI1NCB9LAorICAgIHsgMjU1LCAyMjgsIDIzMSwgMjU1LCAyMzAsIDI1NSwgMjUxLCAyNTQgfSwKKyAgICB7IDI1NSwgMjI5LCAyMzIsIDI1NSwgMjMwLCAyNTUsIDI1MSwgMjU0IH0sCisgICAgeyAyNTUsIDIzMCwgMjMzLCAyNTUsIDIzMSwgMjU1LCAyNTIsIDI1NCB9LAorICAgIHsgMjU1LCAyMzEsIDIzNCwgMjU1LCAyMzEsIDI1NSwgMjUyLCAyNTQgfSwKKyAgICB7IDI1NSwgMjMyLCAyMzUsIDI1NSwgMjMyLCAyNTUsIDI1MiwgMjU0IH0sCisgICAgeyAyNTUsIDIzMywgMjM2LCAyNTUsIDIzMiwgMjU1LCAyNTIsIDI1NCB9LAorICAgIHsgMjU1LCAyMzUsIDIzNywgMjU1LCAyMzMsIDI1NSwgMjUyLCAyNTQgfSwKKyAgICB7IDI1NSwgMjM2LCAyMzgsIDI1NSwgMjM0LCAyNTUsIDI1MiwgMjU0IH0sCisgICAgeyAyNTUsIDIzOCwgMjQwLCAyNTUsIDIzNSwgMjU1LCAyNTIsIDI1NSB9LAorICAgIHsgMjU1LCAyMzksIDI0MSwgMjU1LCAyMzUsIDI1NSwgMjUyLCAyNTQgfSwKKyAgICB7IDI1NSwgMjQxLCAyNDMsIDI1NSwgMjM2LCAyNTUsIDI1MiwgMjU0IH0sCisgICAgeyAyNTUsIDI0MywgMjQ1LCAyNTUsIDIzNywgMjU1LCAyNTIsIDI1NCB9LAorICAgIHsgMjU1LCAyNDYsIDI0NywgMjU1LCAyMzksIDI1NSwgMjUzLCAyNTUgfSwKK307CisKK2NvbnN0IFByb2JDb250ZXh0IGZmX3ZwOV9kZWZhdWx0X3Byb2JzID0geworICAgIHsgLyogeV9tb2RlICovCisgICAgICAgIHsgIDY1LCAgMzIsICAxOCwgMTQ0LCAxNjIsIDE5NCwgIDQxLCAgNTEsICA5OCB9IC8qIGJzaXplIDwgOHg4ICovLAorICAgICAgICB7IDEzMiwgIDY4LCAgMTgsIDE2NSwgMjE3LCAxOTYsICA0NSwgIDQwLCAgNzggfSAvKiBic2l6ZSA8IDE2eDE2ICovLAorICAgICAgICB7IDE3MywgIDgwLCAgMTksIDE3NiwgMjQwLCAxOTMsICA2NCwgIDM1LCAgNDYgfSAvKiBic2l6ZSA8IDMyeDMyICovLAorICAgICAgICB7IDIyMSwgMTM1LCAgMzgsIDE5NCwgMjQ4LCAxMjEsICA5NiwgIDg1LCAgMjkgfSAvKiBic2l6ZSA+PSAzMngzMiAqLworICAgIH0sIHsgLyogdXZfbW9kZSAqLworICAgICAgICB7ICA0OCwgIDEyLCAxNTQsIDE1NSwgMTM5LCAgOTAsICAzNCwgMTE3LCAxMTkgfSAvKiB5ID0gdiAqLywKKyAgICAgICAgeyAgNjcsICAgNiwgIDI1LCAyMDQsIDI0MywgMTU4LCAgMTMsICAyMSwgIDk2IH0gLyogeSA9IGggKi8sCisgICAgICAgIHsgMTIwLCAgIDcsICA3NiwgMTc2LCAyMDgsIDEyNiwgIDI4LCAgNTQsIDEwMyB9IC8qIHkgPSBkYyAqLywKKyAgICAgICAgeyAgOTcsICAgNSwgIDQ0LCAxMzEsIDE3NiwgMTM5LCAgNDgsICA2OCwgIDk3IH0gLyogeSA9IGQ0NSAqLywKKyAgICAgICAgeyAgODMsICAgNSwgIDQyLCAxNTYsIDExMSwgMTUyLCAgMjYsICA0OSwgMTUyIH0gLyogeSA9IGQxMzUgKi8sCisgICAgICAgIHsgIDgwLCAgIDUsICA1OCwgMTc4LCAgNzQsICA4MywgIDMzLCAgNjIsIDE0NSB9IC8qIHkgPSBkMTE3ICovLAorICAgICAgICB7ICA4NiwgICA1LCAgMzIsIDE1NCwgMTkyLCAxNjgsICAxNCwgIDIyLCAxNjMgfSAvKiB5ID0gZDE1MyAqLywKKyAgICAgICAgeyAgNzcsICAgNywgIDY0LCAxMTYsIDEzMiwgMTIyLCAgMzcsIDEyNiwgMTIwIH0gLyogeSA9IGQ2MyAqLywKKyAgICAgICAgeyAgODUsICAgNSwgIDMyLCAxNTYsIDIxNiwgMTQ4LCAgMTksICAyOSwgIDczIH0gLyogeSA9IGQyNyAqLywKKyAgICAgICAgeyAxMDEsICAyMSwgMTA3LCAxODEsIDE5MiwgMTAzLCAgMTksICA2NywgMTI1IH0gLyogeSA9IHRtICovCisgICAgfSwgeyAvKiBmaWx0ZXIgKi8KKyAgICAgICAgeyAyMzUsIDE2MiwgfSwKKyAgICAgICAgeyAgMzYsIDI1NSwgfSwKKyAgICAgICAgeyAgMzQsICAgMywgfSwKKyAgICAgICAgeyAxNDksIDE0NCwgfSwKKyAgICB9LCB7IC8qIG12X21vZGUgKi8KKyAgICAgICAgeyAgMiwgMTczLCAgMzQgfSwgIC8vIDAgPSBib3RoIHplcm8gbXYKKyAgICAgICAgeyAgNywgMTQ1LCAgODUgfSwgIC8vIDEgPSBvbmUgemVybyBtdiArIG9uZSBhIHByZWRpY3RlZCBtdgorICAgICAgICB7ICA3LCAxNjYsICA2MyB9LCAgLy8gMiA9IHR3byBwcmVkaWN0ZWQgbXZzCisgICAgICAgIHsgIDcsICA5NCwgIDY2IH0sICAvLyAzID0gb25lIHByZWRpY3RlZC96ZXJvIGFuZCBvbmUgbmV3IG12CisgICAgICAgIHsgIDgsICA2NCwgIDQ2IH0sICAvLyA0ID0gdHdvIG5ldyBtdnMKKyAgICAgICAgeyAxNywgIDgxLCAgMzEgfSwgIC8vIDUgPSBvbmUgaW50cmEgbmVpZ2hib3IgKyB4CisgICAgICAgIHsgMjUsICAyOSwgIDMwIH0sICAvLyA2ID0gdHdvIGludHJhIG5laWdoYm9ycworICAgIH0sIHsgLyogaW50cmEgKi8KKyAgICAgICAgOSwgMTAyLCAxODcsIDIyNQorICAgIH0sIHsgLyogY29tcCAqLworICAgICAgICAyMzksIDE4MywgMTE5LCAgOTYsICA0MQorICAgIH0sIHsgLyogc2luZ2xlX3JlZiAqLworICAgICAgICB7ICAzMywgIDE2IH0sCisgICAgICAgIHsgIDc3LCAgNzQgfSwKKyAgICAgICAgeyAxNDIsIDE0MiB9LAorICAgICAgICB7IDE3MiwgMTcwIH0sCisgICAgICAgIHsgMjM4LCAyNDcgfQorICAgIH0sIHsgLyogY29tcF9yZWYgKi8KKyAgICAgICAgNTAsIDEyNiwgMTIzLCAyMjEsIDIyNgorICAgIH0sIHsgLyogdHgzMnAgKi8KKyAgICAgICAgeyAzLCAxMzYsIDM3LCB9LAorICAgICAgICB7IDUsICA1MiwgMTMsIH0sCisgICAgfSwgeyAvKiB0eDE2cCAqLworICAgICAgICB7IDIwLCAxNTIsIH0sCisgICAgICAgIHsgMTUsIDEwMSwgfSwKKyAgICB9LCB7IC8qIHR4OHAgKi8KKyAgICAgICAgMTAwLCA2NgorICAgIH0sIHsgLyogc2tpcCAqLworICAgICAgICAxOTIsIDEyOCwgNjQKKyAgICB9LCB7IC8qIG12X2pvaW50ICovCisgICAgICAgIDMyLCA2NCwgOTYKKyAgICB9LCB7CisgICAgICAgIHsgLyogbXYgdmVydGljYWwgY29tcG9uZW50ICovCisgICAgICAgICAgICAxMjgsIC8qIHNpZ24gKi8KKyAgICAgICAgICAgIHsgMjI0LCAxNDQsIDE5MiwgMTY4LCAxOTIsIDE3NiwgMTkyLCAxOTgsIDE5OCwgMjQ1IH0sIC8qIGNsYXNzICovCisgICAgICAgICAgICAyMTYsIC8qIGNsYXNzMCAqLworICAgICAgICAgICAgeyAxMzYsIDE0MCwgMTQ4LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDIzNCwgMjM0LCAyNDAgfSwgLyogYml0cyAqLworICAgICAgICAgICAgeyAvKiBjbGFzczBfZnAgKi8KKyAgICAgICAgICAgICAgICB7IDEyOCwgMTI4LCA2NCB9LAorICAgICAgICAgICAgICAgIHsgIDk2LCAxMTIsIDY0IH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7IDY0LCA5NiwgNjQgfSwgLyogZnAgKi8KKyAgICAgICAgICAgIDE2MCwgLyogY2xhc3MwX2hwIGJpdCAqLworICAgICAgICAgICAgMTI4LCAvKiBocCAqLworICAgICAgICB9LCB7IC8qIG12IGhvcml6b250YWwgY29tcG9uZW50ICovCisgICAgICAgICAgICAxMjgsIC8qIHNpZ24gKi8KKyAgICAgICAgICAgIHsgMjE2LCAxMjgsIDE3NiwgMTYwLCAxNzYsIDE3NiwgMTkyLCAxOTgsIDE5OCwgMjA4IH0sIC8qIGNsYXNzICovCisgICAgICAgICAgICAyMDgsIC8qIGNsYXNzMCAqLworICAgICAgICAgICAgeyAxMzYsIDE0MCwgMTQ4LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDIzNCwgMjM0LCAyNDAgfSwgLyogYml0cyAqLworICAgICAgICAgICAgeyAvKiBjbGFzczBfZnAgKi8KKyAgICAgICAgICAgICAgICB7IDEyOCwgMTI4LCA2NCB9LAorICAgICAgICAgICAgICAgIHsgIDk2LCAxMTIsIDY0IH0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7IDY0LCA5NiwgNjQgfSwgLyogZnAgKi8KKyAgICAgICAgICAgIDE2MCwgLyogY2xhc3MwX2hwIGJpdCAqLworICAgICAgICAgICAgMTI4LCAvKiBocCAqLworICAgICAgICB9CisgICAgfSwgeyAvKiBwYXJ0aXRpb24gKi8KKyAgICAgICAgeyAvKiA2NHg2NCAtPiAzMngzMiAqLworICAgICAgICAgICAgeyAyMjIsICAzNCwgIDMwIH0gLyogYS9sIGJvdGggbm90IHNwbGl0ICovLAorICAgICAgICAgICAgeyAgNzIsICAxNiwgIDQ0IH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCisgICAgICAgICAgICB7ICA1OCwgIDMyLCAgMTIgfSAvKiBsIHNwbGl0LCBhIG5vdCBzcGxpdCAqLywKKyAgICAgICAgICAgIHsgIDEwLCAgIDcsICAgNiB9IC8qIGEvbCBib3RoIHNwbGl0ICovLAorICAgICAgICB9LCB7IC8qIDMyeDMyIC0+IDE2eDE2ICovCisgICAgICAgICAgICB7IDE3NywgIDU4LCAgNTkgfSAvKiBhL2wgYm90aCBub3Qgc3BsaXQgKi8sCisgICAgICAgICAgICB7ICA2OCwgIDI2LCAgNjMgfSAvKiBhIHNwbGl0LCBsIG5vdCBzcGxpdCAqLywKKyAgICAgICAgICAgIHsgIDUyLCAgNzksICAyNSB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAorICAgICAgICAgICAgeyAgMTcsICAxNCwgIDEyIH0gLyogYS9sIGJvdGggc3BsaXQgKi8sCisgICAgICAgIH0sIHsgLyogMTZ4MTYgLT4gOHg4ICovCisgICAgICAgICAgICB7IDE3NCwgIDczLCAgODcgfSAvKiBhL2wgYm90aCBub3Qgc3BsaXQgKi8sCisgICAgICAgICAgICB7ICA5MiwgIDQxLCAgODMgfSAvKiBhIHNwbGl0LCBsIG5vdCBzcGxpdCAqLywKKyAgICAgICAgICAgIHsgIDgyLCAgOTksICA1MCB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAorICAgICAgICAgICAgeyAgNTMsICAzOSwgIDM5IH0gLyogYS9sIGJvdGggc3BsaXQgKi8sCisgICAgICAgIH0sIHsgLyogOHg4IC0+IDR4NCAqLworICAgICAgICAgICAgeyAxOTksIDEyMiwgMTQxIH0gLyogYS9sIGJvdGggbm90IHNwbGl0ICovLAorICAgICAgICAgICAgeyAxNDcsICA2MywgMTU5IH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCisgICAgICAgICAgICB7IDE0OCwgMTMzLCAxMTggfSAvKiBsIHNwbGl0LCBhIG5vdCBzcGxpdCAqLywKKyAgICAgICAgICAgIHsgMTIxLCAxMDQsIDExNCB9IC8qIGEvbCBib3RoIHNwbGl0ICovLAorICAgICAgICB9CisgICAgfSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZmZfdnA5X2RlZmF1bHRfY29lZl9wcm9ic1s0XVsyXVsyXVs2XVs2XVszXSA9IHsKKyAgICB7IC8qIHR4ID0gNHg0ICovCisgICAgICAgIHsgLyogYmxvY2sgVHlwZSAwICovCisgICAgICAgICAgICB7IC8qIEludHJhICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxOTUsICAyOSwgMTgzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDg0LCAgNDksIDEzNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgOCwgIDQyLCAgNzEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDMxLCAxMDcsIDE2OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzNSwgIDk5LCAxNTkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTcsICA4MiwgMTQwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA4LCAgNjYsIDExNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDQ0LCAgNzYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOSwgIDMyIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA0MCwgMTMyLCAyMDEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjksIDExNCwgMTg3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEzLCAgOTEsIDE1NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNywgIDc1LCAxMjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA1OCwgIDk1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjgsICA0NyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNjksIDE0MiwgMjIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDQyLCAxMjIsIDIwMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNSwgIDkxLCAxNTkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDYsICA2NywgMTIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDIsICA3NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMzEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgMTAyLCAxNDgsIDIyOCB9LAorICAgICAgICAgICAgICAgICAgICB7ICA2NywgMTE3LCAyMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTcsICA4MiwgMTU0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA2LCAgNTksIDExNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDM5LCAgNzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNSwgIDI5IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7IDE1NiwgIDU3LCAyMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxMTksICA1NywgMjEyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDU4LCAgNDgsIDE2MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyOSwgIDQwLCAxMjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTIsICAzMCwgIDgxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgMTIsICAzMSB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMTkxLCAxMDcsIDIyNiB9LAorICAgICAgICAgICAgICAgICAgICB7IDEyNCwgMTE3LCAyMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjUsICA5OSwgMTU1IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICAyOSwgMTQ4LCAyMTAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMzcsIDEyNiwgMTk0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA4LCAgOTMsIDE1NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDY4LCAxMTggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzOSwgIDY5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICAzMyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNDEsIDE1MSwgMjEzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI3LCAxMjMsIDE5MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDgyLCAxNDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1OCwgMTA1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzIsICA2MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEzLCAgMjYgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDU5LCAxNTksIDIyMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyMywgMTI2LCAxOTggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDQsICA4OCwgMTUxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjYsIDExNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM4LCAgNzEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDM0IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7IDExNCwgMTM2LCAyMzIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTEsIDExNCwgMjA3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDExLCAgODMsIDE1NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDU2LCAxMDUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMywgIDY1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICAzNCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxNDksICA2NSwgMjM0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTIxLCAgNTcsIDIxNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICA2MSwgIDQ5LCAxNjYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjgsICAzNiwgMTE0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEyLCAgMjUsICA3NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDE2LCAgNDIgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgeyAvKiBibG9jayBUeXBlIDEgKi8KKyAgICAgICAgICAgIHsgLyogSW50cmEgKi8KKyAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLworICAgICAgICAgICAgICAgICAgICB7IDIxNCwgIDQ5LCAyMjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxMzIsICA2MywgMTg4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDQyLCAgNjUsIDEzNyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgODUsIDEzNywgMjIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTA0LCAxMzEsIDIxNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICA0OSwgMTExLCAxOTIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjEsICA4NywgMTU1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNDksICA4NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE2LCAgMjggfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCisgICAgICAgICAgICAgICAgICAgIHsgIDg5LCAxNjMsIDIzMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICA5MCwgMTM3LCAyMjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjksIDEwMCwgMTgzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgNzAsIDEzNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDQyLCAgODEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDMzIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLworICAgICAgICAgICAgICAgICAgICB7IDEwOCwgMTY3LCAyMzcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTUsIDEzMywgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAgOTcsIDE3OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDcyLCAxMzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NSwgIDg1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTksICAzOCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxMjQsIDE0NiwgMjQwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDY2LCAxMjQsIDIyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNywgIDg4LCAxNzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDQsICA1OCwgMTIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzYsICA3NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMzcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCisgICAgICAgICAgICAgICAgICAgIHsgMTQxLCAgNzksIDI0MSB9LAorICAgICAgICAgICAgICAgICAgICB7IDEyNiwgIDcwLCAyMjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNjYsICA1OCwgMTgyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMwLCAgNDQsIDEzNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMiwgIDM0LCAgOTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICAyMCwgIDQ3IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCB7IC8qIEludGVyICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAyMjksICA5OSwgMjQ5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTQzLCAxMTEsIDIzNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICA0NiwgMTA5LCAxOTIgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDgyLCAxNTgsIDIzNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICA5NCwgMTQ2LCAyMjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjUsIDExNywgMTkxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA5LCAgODcsIDE0OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDU2LCAgOTkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMywgIDU3IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA4MywgMTY3LCAyMzcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNjgsIDE0NSwgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAxMDMsIDE3NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDcyLCAxMzEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MSwgIDc5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjAsICAzOSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgOTksIDE2NywgMjM5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDQ3LCAxNDEsIDIyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgMTA0LCAxNzggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA3MywgMTMzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDQsICA4NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDIyLCAgNDcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgMTI3LCAxNDUsIDI0MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICA3MSwgMTI5LCAyMjggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTcsICA5MywgMTc3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgNjEsIDEyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQxLCAgODQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyMSwgIDUyIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7IDE1NywgIDc4LCAyNDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxNDAsICA3MiwgMjMxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDY5LCAgNTgsIDE4NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzMSwgIDQ0LCAxMzcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTQsICAzOCwgMTA1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA4LCAgMjMsICA2MSB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSwgeyAvKiB0eCA9IDh4OCAqLworICAgICAgICB7IC8qIGJsb2NrIFR5cGUgMCAqLworICAgICAgICAgICAgeyAvKiBJbnRyYSAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMTI1LCAgMzQsIDE4NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICA1MiwgIDQxLCAxMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDYsICAzMSwgIDU2IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICAzNywgMTA5LCAxNTMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTEsIDEwMiwgMTQ3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDIzLCAgODcsIDEyOCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgOCwgIDY3LCAxMDEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MSwgIDYzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTksICAyOSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMzEsIDE1NCwgMTg1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE3LCAxMjcsIDE3NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNiwgIDk2LCAxNDUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA3MywgMTE0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTEsICA4MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDI4LCAgNDUgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDIzLCAxNjMsIDIwMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgMTMxLCAxODUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA5MywgMTQ4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjcsIDExMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQxLCAgNjkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDI0IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICAyOSwgMTc2LCAyMTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTIsIDE0NSwgMjAxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAxMDEsIDE1NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDY5LCAxMTEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzOSwgIDYzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTQsICAyMyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTcsIDE5MiwgMjMzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI1LCAxNTQsIDIxNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNiwgMTA5LCAxNjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA3OCwgMTE4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDgsICA2OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDIxLCAgMjkgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHsgLyogSW50ZXIgKi8KKyAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLworICAgICAgICAgICAgICAgICAgICB7IDIwMiwgMTA1LCAyNDUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxMDgsIDEwNiwgMjE2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE4LCAgOTAsIDE0NCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMzMsIDE3MiwgMjE5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDY0LCAxNDksIDIwNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNCwgMTE3LCAxNzcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsICA5MCwgMTQxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNjEsICA5NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM3LCAgNTcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCisgICAgICAgICAgICAgICAgICAgIHsgIDMzLCAxNzksIDIyMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMSwgMTQwLCAxOTggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4OSwgMTQ4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsIDEwNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMzLCAgNTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMiwgIDIxIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLworICAgICAgICAgICAgICAgICAgICB7ICAzMCwgMTgxLCAyMjEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDgsIDE0MSwgMTk4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgODcsIDE0NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU4LCAxMDAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMSwgIDU1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAyMCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMzIsIDE4NiwgMjI0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA3LCAxNDIsIDE5OCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg2LCAxNDMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1OCwgMTAwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzEsICA1NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEyLCAgMjIgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDU3LCAxOTIsIDIyNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyMCwgMTQzLCAyMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA5NiwgMTU0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjgsIDExMiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQyLCAgNjkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOSwgIDMyIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIHsgLyogYmxvY2sgVHlwZSAxICovCisgICAgICAgICAgICB7IC8qIEludHJhICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAyMTIsICAzNSwgMjE1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTEzLCAgNDcsIDE2OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyOSwgIDQ4LCAxMDUgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDc0LCAxMjksIDIwMyB9LAorICAgICAgICAgICAgICAgICAgICB7IDEwNiwgMTIwLCAyMDMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDksIDEwNywgMTc4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE5LCAgODQsIDE0NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDUwLCAgODQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNSwgIDI1IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA3MSwgMTcyLCAyMTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDQsIDE0MSwgMjA5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAxMDIsIDE3MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNiwgIDc2LCAxMzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA1MSwgIDg5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjQsICA0MiB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNjQsIDE4NSwgMjMxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMxLCAxNDgsIDIxNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgOCwgMTAzLCAxNzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA3NCwgMTMxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDYsICA4MSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMzAgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDY1LCAxOTYsIDIzNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyNSwgMTU3LCAyMjEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsIDEwNSwgMTc0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjcsIDEyMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM4LCAgNjkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNSwgIDMwIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7ICA2NSwgMjA0LCAyMzggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMzAsIDE1NiwgMjI0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA3LCAxMDcsIDE3NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDcwLCAxMjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MiwgIDczIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAzNCB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMjI1LCAgODYsIDI1MSB9LAorICAgICAgICAgICAgICAgICAgICB7IDE0NCwgMTA0LCAyMzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDIsICA5OSwgMTgxIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICA4NSwgMTc1LCAyMzkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxMTIsIDE2NSwgMjI5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI5LCAxMzYsIDIwMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMiwgMTAzLCAxNjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDYsICA3NywgMTIzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNTMsICA4NCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNzUsIDE4MywgMjM5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMwLCAxNTUsIDIyMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgMTA2LCAxNzEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3NCwgMTI4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDQsICA3NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMjggfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDczLCAxODUsIDI0MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyNywgMTU5LCAyMjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsIDEwNywgMTcyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzUsIDEyNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQyLCAgNzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDI5IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICA2MiwgMTkwLCAyMzggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjEsIDE1OSwgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAxMDcsIDE3MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDcyLCAxMjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MCwgIDcxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAzMiB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNjEsIDE5OSwgMjQwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI3LCAxNjEsIDIyNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgMTEzLCAxODAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3NiwgMTI5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDYsICA4MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDIzLCAgNDEgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sIHsgLyogdHggPSAxNngxNiAqLworICAgICAgICB7IC8qIGJsb2NrIFR5cGUgMCAqLworICAgICAgICAgICAgeyAvKiBJbnRyYSAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgICA3LCAgMjcsIDE1MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNSwgIDMwLCAgOTUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNiwgIDMwIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICA1MCwgIDc1LCAxMjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTcsICA3NSwgMTI0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI3LCAgNjcsIDEwOCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgIDU0LCAgODYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMywgIDUyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAxOCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNDMsIDEyNSwgMTUxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI2LCAxMDgsIDE0OCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNywgIDgzLCAxMjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA1OSwgIDg5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzgsICA2MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMjcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDIzLCAxNDQsIDE2MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMywgMTEyLCAxNTQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA3NSwgMTE3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTAsICA4MSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMxLCAgNTEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDIzIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICAxOCwgMTYyLCAxODUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDYsIDEyMywgMTcxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzgsIDEyNSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDUxLCAgODYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMSwgIDU0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTQsICAyMyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMTUsIDE5OSwgMjI3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAxNTAsIDIwNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDkxLCAxNDYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NSwgIDk1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzAsICA1MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDExLCAgMjAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHsgLyogSW50ZXIgKi8KKyAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLworICAgICAgICAgICAgICAgICAgICB7ICAxOSwgIDU1LCAyNDAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTksICA1OSwgMTk2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAgNTIsIDEwNSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNDEsIDE2NiwgMjA3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTA0LCAxNTMsIDE5OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzMSwgMTIzLCAxODEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMTQsIDEwMSwgMTUyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA1LCAgNzIsIDEwNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM2LCAgNTIgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCisgICAgICAgICAgICAgICAgICAgIHsgIDM1LCAxNzYsIDIxMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMiwgMTMxLCAxOTAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA4OCwgMTQ0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsIDEwMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM2LCAgNjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNiwgIDI4IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLworICAgICAgICAgICAgICAgICAgICB7ICAyOCwgMTgzLCAyMTMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDgsIDEzNCwgMTkxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgODYsIDE0MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU2LCAgOTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMCwgIDUzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAyMCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMjAsIDE5MCwgMjE1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA0LCAxMzUsIDE5MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg0LCAxMzkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1MywgIDkxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjgsICA0OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDExLCAgMjAgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDEzLCAxOTYsIDIxNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgMTM3LCAxOTIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4NiwgMTQzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTcsICA5OSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMyLCAgNTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMywgIDI0IH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIHsgLyogYmxvY2sgVHlwZSAxICovCisgICAgICAgICAgICB7IC8qIEludHJhICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAyMTEsICAyOSwgMjE3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDk2LCAgNDcsIDE1NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyMiwgIDQzLCAgODcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDc4LCAxMjAsIDE5MyB9LAorICAgICAgICAgICAgICAgICAgICB7IDExMSwgMTE2LCAxODYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDYsIDEwMiwgMTY0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAgODAsIDEyOCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDQ5LCAgNzYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDI4IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA3MSwgMTYxLCAyMDMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDIsIDEzMiwgMTkyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgOTgsIDE1MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDY5LCAxMDkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NCwgIDcwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAyOSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTcsIDE4NiwgMjExIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMwLCAxNDAsIDE5NiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDkzLCAxNDYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2MiwgMTAyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzgsICA2NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE2LCAgMjcgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDQ3LCAxOTksIDIxNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNCwgMTQ1LCAxOTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4OCwgMTQyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTcsICA5OCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM2LCAgNjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNSwgIDI2IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7ICAyNiwgMjE5LCAyMjkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsIDE1NSwgMjA3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgOTQsIDE1MSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDYwLCAxMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzNiwgIDYyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTYsICAyOCB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMjMzLCAgMjksIDI0OCB9LAorICAgICAgICAgICAgICAgICAgICB7IDE0NiwgIDQ3LCAyMjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDMsICA1MiwgMTQwIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7IDEwMCwgMTYzLCAyMzIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAxNzksIDE2MSwgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDYzLCAxNDIsIDIwNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzNywgMTEzLCAxNzQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjYsICA4OSwgMTM3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE4LCAgNjgsICA5NyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgODUsIDE4MSwgMjMwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDMyLCAxNDYsIDIwOSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNywgMTAwLCAxNjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA3MSwgMTIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDUsICA3NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMzAgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDY1LCAxODcsIDIzMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAyMCwgMTQ4LCAyMDcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA5NywgMTU5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjgsIDExNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQwLCAgNzAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDI5IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICA0MCwgMTk0LCAyMjcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDgsIDE0NywgMjA0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgOTQsIDE1NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDY1LCAxMTIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzOSwgIDY2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTQsICAyNiB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMTYsIDIwOCwgMjI4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAzLCAxNTEsIDIwNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDk4LCAxNjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2NywgMTE3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDEsICA3NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMzEgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0sIHsgLyogdHggPSAzMngzMiAqLworICAgICAgICB7IC8qIGJsb2NrIFR5cGUgMCAqLworICAgICAgICAgICAgeyAvKiBJbnRyYSAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgIDE3LCAgMzgsIDE0MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNywgIDM0LCAgODAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDI5IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7ICAzNywgIDc1LCAxMjggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDEsICA3NiwgMTI4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI2LCAgNjYsIDExNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMiwgIDUyLCAgOTQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICAzMiwgIDU1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTAsICAxNiB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTAsIDEyNywgMTU0IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDM3LCAxMDksIDE1MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNiwgIDgyLCAxMjEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsICA1OSwgIDg1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzUsICA1NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEzLCAgMjAgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgIDQwLCAxNDIsIDE2NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNywgMTEwLCAxNTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA3MSwgMTEyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDQsICA3MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDI3LCAgNDUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMSwgIDE3IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICAzMCwgMTc1LCAxODggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDksIDEyNCwgMTY5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzQsIDExNiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQ4LCAgNzggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMCwgIDQ5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTEsICAxOCB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgMTAsIDIyMiwgMjIzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAxNTAsIDE5NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDgzLCAxMjggfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0OCwgIDc5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjcsICA0NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDExLCAgMTcgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIHsgLyogSW50ZXIgKi8KKyAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLworICAgICAgICAgICAgICAgICAgICB7ICAzNiwgIDQxLCAyMzUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjksICAzNiwgMTkzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgMjcsIDExMSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgODUsIDE2NSwgMjIyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTc3LCAxNjIsIDIxNSB9LAorICAgICAgICAgICAgICAgICAgICB7IDExMCwgMTM1LCAxOTUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNTcsIDExMywgMTY4IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDIzLCAgODMsIDEyMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgIDQ5LCAgNjEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCisgICAgICAgICAgICAgICAgICAgIHsgIDg1LCAxOTAsIDIyMyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzNiwgMTM5LCAyMDAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDUsICA5MCwgMTQ2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsIDEwMyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM4LCAgNjUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDMwIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLworICAgICAgICAgICAgICAgICAgICB7ICA3MiwgMjAyLCAyMjMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjMsIDE0MSwgMTk5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAgODYsIDE0MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU2LCAgOTcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzNiwgIDYxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTYsICAyNyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTUsIDIxOCwgMjI1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDEzLCAxNDUsIDIwMCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg2LCAxNDEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NywgIDk5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzUsICA2MSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEzLCAgMjIgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDE1LCAyMzUsIDIxMiB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgMTMyLCAxODQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4NCwgMTM5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTcsICA5NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM0LCAgNTYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDIzIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIHsgLyogYmxvY2sgVHlwZSAxICovCisgICAgICAgICAgICB7IC8qIEludHJhICovCisgICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxODEsICAyMSwgMjAxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDYxLCAgMzcsIDEyMyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxMCwgIDM4LCAgNzEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCisgICAgICAgICAgICAgICAgICAgIHsgIDQ3LCAxMDYsIDE3MiB9LAorICAgICAgICAgICAgICAgICAgICB7ICA5NSwgMTA0LCAxNzMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDIsICA5MywgMTU5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDE4LCAgNzcsIDEzMSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDUwLCAgODEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDIzIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLworICAgICAgICAgICAgICAgICAgICB7ICA2MiwgMTQ3LCAxOTkgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNDQsIDEzMCwgMTg5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI4LCAxMDIsIDE1NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxOCwgIDc1LCAxMTUgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA0NCwgIDY1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAxOSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNTUsIDE1MywgMjEwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDI0LCAxMzAsIDE5NCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDkzLCAxNDYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2MSwgIDk3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzEsICA1MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEwLCAgMTYgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCisgICAgICAgICAgICAgICAgICAgIHsgIDQ5LCAxODYsIDIyMyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAxNywgMTQ4LCAyMDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA5NiwgMTQyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTMsICA4MyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDI2LCAgNDQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMSwgIDE3IH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLworICAgICAgICAgICAgICAgICAgICB7ICAxMywgMjE3LCAyMTIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsIDEzNiwgMTgwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzgsIDEyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDUwLCAgODMgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyOSwgIDQ5IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTQsICAyMyB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLworICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCisgICAgICAgICAgICAgICAgICAgIHsgMTk3LCAgMTMsIDI0NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICA4MiwgIDE3LCAyMjIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMjUsICAxNywgMTYyIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLworICAgICAgICAgICAgICAgICAgICB7IDEyNiwgMTg2LCAyNDcgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAyMzQsIDE5MSwgMjQzIH0sCisgICAgICAgICAgICAgICAgICAgIHsgMTc2LCAxNzcsIDIzNCB9LAorICAgICAgICAgICAgICAgICAgICB7IDEwNCwgMTU4LCAyMjAgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgNjYsIDEyOCwgMTg2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDU1LCAgOTAsIDEzNyB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAxMTEsIDE5NywgMjQyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgIDQ2LCAxNTgsIDIxOSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgOSwgMTA0LCAxNzEgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA2NSwgMTI1IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDQsICA4MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgOTEgfQorICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCisgICAgICAgICAgICAgICAgICAgIHsgMTA0LCAyMDgsIDI0NSB9LAorICAgICAgICAgICAgICAgICAgICB7ICAzOSwgMTY4LCAyMjQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDMsIDEwOSwgMTYyIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzksIDEyNCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDUwLCAxMDIgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MywgMTAyIH0KKyAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLworICAgICAgICAgICAgICAgICAgICB7ICA4NCwgMjIwLCAyNDYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgMzEsIDE3NywgMjMxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAyLCAxMTUsIDE4MCB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDc5LCAxMzQgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NSwgIDc3IH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsICA3OSB9CisgICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgeyAgNDMsIDI0MywgMjQwIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICA4LCAxODAsIDIxNyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgMTE1LCAxNjYgfSwKKyAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4NCwgMTIxIH0sCisgICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTEsICA2NyB9LAorICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE2LCAgIDYgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK307CisKK2NvbnN0IGludDhfdCBmZl92cDlfbXZfam9pbnRfdHJlZVszXVsyXSA9IHsKKyAgICB7IC1NVl9KT0lOVF9aRVJPLCAxIH0sICAgICAgICAgICAgICAgICAgLy8gJzAnCisgICAgICAgIHsgLU1WX0pPSU5UX0gsIDIgfSwgICAgICAgICAgICAgICAgIC8vICcxMCcKKyAgICAgICAgICAgIHsgLU1WX0pPSU5UX1YsIC1NVl9KT0lOVF9IViB9LCAgLy8gJzExeCcKK307CisKK2NvbnN0IGludDhfdCBmZl92cDlfbXZfY2xhc3NfdHJlZVsxMF1bMl0gPSB7CisgICAgeyAtMCwgICAxIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnMCcKKyAgICAgICAgeyAtMSwgICAyIH0sICAgICAgICAgICAgICAgICAgICAgIC8vICcxMCcKKyAgICAgICAgICAgIHsgIDMsICAgNCB9LAorICAgICAgICAgICAgICAgIHsgLTIsICAtMyB9LCAgICAgICAgICAgICAgLy8gJzExMHgnCisgICAgICAgICAgICAgICAgeyAgNSwgICA2IH0sCisgICAgICAgICAgICAgICAgICAgIHsgLTQsICAtNSB9LCAgICAgICAgICAvLyAnMTExMHgnCisgICAgICAgICAgICAgICAgICAgIHsgLTYsICAgNyB9LCAgICAgICAgICAvLyAnMTExMTAnCisgICAgICAgICAgICAgICAgICAgICAgICB7ICA4LCAgIDkgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC03LCAgLTggfSwgIC8vICcxMTExMTB4JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLTksIC0xMCB9LCAgLy8gJzExMTExMXgnCit9OworCitjb25zdCBpbnQ4X3QgZmZfdnA5X212X2ZwX3RyZWVbM11bMl0gPSB7CisgICAgeyAtMCwgIDEgfSwgICAgICAgICAgLy8gJzAnCisgICAgICAgIHsgLTEsICAyIH0sICAgICAgLy8gJzEwJworICAgICAgICAgICAgeyAtMiwgLTMgfSwgIC8vICcxMXgnCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlkYXRhLmggYi9saWJhdmNvZGVjL3ZwOWRhdGEuaAppbmRleCBjYjEyZTdlLi4wODZkYmRlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZwOWRhdGEuaAorKysgYi9saWJhdmNvZGVjL3ZwOWRhdGEuaApAQCAtMjQsMjI1NCArMjQsNDggQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCi0jaW5jbHVkZSAidnA5LmgiCisjaW5jbHVkZSAidnA5ZGVjLmgiCiAKLXN0YXRpYyBjb25zdCBpbnQ4X3QgdnA5X3BhcnRpdGlvbl90cmVlWzNdWzJdID0gewotICAgIHsgLVBBUlRJVElPTl9OT05FLCAxIH0sICAgICAgICAgICAgICAgLy8gJzAnCi0gICAgIHsgLVBBUlRJVElPTl9ILCAyIH0sICAgICAgICAgICAgICAgICAvLyAnMTAnCi0gICAgICB7IC1QQVJUSVRJT05fViwgLVBBUlRJVElPTl9TUExJVCB9LCAvLyAnMTEwJywgJzExMScKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHZwOV9kZWZhdWx0X2tmX3BhcnRpdGlvbl9wcm9ic1s0XVs0XVszXSA9IHsKLSAgICB7IC8qIDY0eDY0IC0+IDMyeDMyICovCi0gICAgICAgIHsgMTc0LCAgMzUsICA0OSB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKLSAgICAgICAgeyAgNjgsICAxMSwgIDI3IH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCi0gICAgICAgIHsgIDU3LCAgMTUsICAgOSB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAotICAgICAgICB7ICAxMiwgICAzLCAgIDMgfSAvKiBhL2wgYm90aCBzcGxpdCAqLwotICAgIH0sIHsgLyogMzJ4MzIgLT4gMTZ4MTYgKi8KLSAgICAgICAgeyAxNTAsICA0MCwgIDM5IH0gLyogYS9sIGJvdGggbm90IHNwbGl0ICovLAotICAgICAgICB7ICA3OCwgIDEyLCAgMjYgfSAvKiBhIHNwbGl0LCBsIG5vdCBzcGxpdCAqLywKLSAgICAgICAgeyAgNjcsICAzMywgIDExIH0gLyogbCBzcGxpdCwgYSBub3Qgc3BsaXQgKi8sCi0gICAgICAgIHsgIDI0LCAgIDcsICAgNSB9IC8qIGEvbCBib3RoIHNwbGl0ICovLAotICAgIH0sIHsgLyogMTZ4MTYgLT4gOHg4ICovCi0gICAgICAgIHsgMTQ5LCAgNTMsICA1MyB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKLSAgICAgICAgeyAgOTQsICAyMCwgIDQ4IH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCi0gICAgICAgIHsgIDgzLCAgNTMsICAyNCB9IC8qIGwgc3BsaXQsIGEgbm90IHNwbGl0ICovLAotICAgICAgICB7ICA1MiwgIDE4LCAgMTggfSAvKiBhL2wgYm90aCBzcGxpdCAqLywKLSAgICB9LCB7IC8qIDh4OCAtPiA0eDQgKi8KLSAgICAgICAgeyAxNTgsICA5NywgIDk0IH0gLyogYS9sIGJvdGggbm90IHNwbGl0ICovLAotICAgICAgICB7ICA5MywgIDI0LCAgOTkgfSAvKiBhIHNwbGl0LCBsIG5vdCBzcGxpdCAqLywKLSAgICAgICAgeyAgODUsIDExOSwgIDQ0IH0gLyogbCBzcGxpdCwgYSBub3Qgc3BsaXQgKi8sCi0gICAgICAgIHsgIDYyLCAgNTksICA2NyB9IC8qIGEvbCBib3RoIHNwbGl0ICovLAotICAgIH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IHZwOV9zZWdtZW50YXRpb25fdHJlZVs3XVsyXSA9IHsKLSAgICB7IDEsIDIgfSwKLSAgICAgeyAzLCA0IH0sCi0gICAgIHsgNSwgNiB9LAotICAgICAgeyAtMCwgLTEgfSwgLy8gJzAweCcKLSAgICAgIHsgLTIsIC0zIH0sIC8vICcwMXgnCi0gICAgICB7IC00LCAtNSB9LCAvLyAnMTB4JwotICAgICAgeyAtNiwgLTcgfSwgLy8gJzExeCcKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3QgdnA5X2ludHJhbW9kZV90cmVlWzldWzJdID0gewotICAgIHsgLURDX1BSRUQsIDEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJzAnCi0gICAgIHsgLVRNX1ZQOF9QUkVELCAyIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnMTAnCi0gICAgICB7IC1WRVJUX1BSRUQsIDMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnMTEwJwotICAgICAgIHsgNCwgNiB9LAotICAgICAgICB7IC1IT1JfUFJFRCwgNSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJzExMTAwJwotICAgICAgICAgeyAtRElBR19ET1dOX1JJR0hUX1BSRUQsIC1WRVJUX1JJR0hUX1BSRUQgfSwgLy8gJzExMTAxeCcKLSAgICAgICAgeyAtRElBR19ET1dOX0xFRlRfUFJFRCwgNyB9LCAgICAgICAgICAgICAgICAgIC8vICcxMTExMCcKLSAgICAgICAgIHsgLVZFUlRfTEVGVF9QUkVELCA4IH0sICAgICAgICAgICAgICAgICAgICAgIC8vICcxMTExMTAnCi0gICAgICAgICAgeyAtSE9SX0RPV05fUFJFRCwgLUhPUl9VUF9QUkVEIH0sICAgICAgICAgICAvLyAnMTExMTExeCcKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzWzEwXVsxMF1bOV0gPSB7Ci0gICAgeyAvKiBhYm92ZSA9IHYgKi8KLSAgICAgICAgeyAgNDMsICA0NiwgMTY4LCAxMzQsIDEwNywgMTI4LCAgNjksIDE0MiwgIDkyIH0gLyogbGVmdCA9IHYgKi8sCi0gICAgICAgIHsgIDQ0LCAgMjksICA2OCwgMTU5LCAyMDEsIDE3NywgIDUwLCAgNTcsICA3NyB9IC8qIGxlZnQgPSBoICovLAotICAgICAgICB7ICA2MywgIDM2LCAxMjYsIDE0NiwgMTIzLCAxNTgsICA2MCwgIDkwLCAgOTYgfSAvKiBsZWZ0ID0gZGMgKi8sCi0gICAgICAgIHsgIDU4LCAgMzgsICA3NiwgMTE0LCAgOTcsIDE3MiwgIDc4LCAxMzMsICA5MiB9IC8qIGxlZnQgPSBkNDUgKi8sCi0gICAgICAgIHsgIDQ2LCAgNDEsICA3NiwgMTQwLCAgNjMsIDE4NCwgIDY5LCAxMTIsICA1NyB9IC8qIGxlZnQgPSBkMTM1ICovLAotICAgICAgICB7ICAzOCwgIDMyLCAgODUsIDE0MCwgIDQ2LCAxMTIsICA1NCwgMTUxLCAxMzMgfSAvKiBsZWZ0ID0gZDExNyAqLywKLSAgICAgICAgeyAgMzksICAyNywgIDYxLCAxMzEsIDExMCwgMTc1LCAgNDQsICA3NSwgMTM2IH0gLyogbGVmdCA9IGQxNTMgKi8sCi0gICAgICAgIHsgIDQ3LCAgMzUsICA4MCwgMTAwLCAgNzQsIDE0MywgIDY0LCAxNjMsICA3NCB9IC8qIGxlZnQgPSBkNjMgKi8sCi0gICAgICAgIHsgIDUyLCAgMzAsICA3NCwgMTEzLCAxMzAsIDE3NSwgIDUxLCAgNjQsICA1OCB9IC8qIGxlZnQgPSBkMjcgKi8sCi0gICAgICAgIHsgIDM2LCAgNjEsIDExNiwgMTE0LCAxMjgsIDE2MiwgIDgwLCAxMjUsICA4MiB9IC8qIGxlZnQgPSB0bSAqLwotICAgIH0sIHsgLyogYWJvdmUgPSBoICovCi0gICAgICAgIHsgIDU1LCAgNDQsICA2OCwgMTY2LCAxNzksIDE5MiwgIDU3LCAgNTcsIDEwOCB9IC8qIGxlZnQgPSB2ICovLAotICAgICAgICB7ICA0MiwgIDI2LCAgMTEsIDE5OSwgMjQxLCAyMjgsICAyMywgIDE1LCAgODUgfSAvKiBsZWZ0ID0gaCAqLywKLSAgICAgICAgeyAgODIsICAyNiwgIDI2LCAxNzEsIDIwOCwgMjA0LCAgNDQsICAzMiwgMTA1IH0gLyogbGVmdCA9IGRjICovLAotICAgICAgICB7ICA2OCwgIDQyLCAgMTksIDEzMSwgMTYwLCAxOTksICA1NSwgIDUyLCAgODMgfSAvKiBsZWZ0ID0gZDQ1ICovLAotICAgICAgICB7ICA1OCwgIDUwLCAgMjUsIDEzOSwgMTE1LCAyMzIsICAzOSwgIDUyLCAxMTggfSAvKiBsZWZ0ID0gZDEzNSAqLywKLSAgICAgICAgeyAgNTAsICAzNSwgIDMzLCAxNTMsIDEwNCwgMTYyLCAgNjQsICA1OSwgMTMxIH0gLyogbGVmdCA9IGQxMTcgKi8sCi0gICAgICAgIHsgIDQ0LCAgMjQsICAxNiwgMTUwLCAxNzcsIDIwMiwgIDMzLCAgMTksIDE1NiB9IC8qIGxlZnQgPSBkMTUzICovLAotICAgICAgICB7ICA1MywgIDQ5LCAgMjEsIDExMCwgMTE2LCAxNjgsICA1OSwgIDgwLCAgNzYgfSAvKiBsZWZ0ID0gZDYzICovLAotICAgICAgICB7ICA1NSwgIDI3LCAgMTIsIDE1MywgMjAzLCAyMTgsICAyNiwgIDI3LCAgNDkgfSAvKiBsZWZ0ID0gZDI3ICovLAotICAgICAgICB7ICAzOCwgIDcyLCAgMTksIDE2OCwgMjAzLCAyMTIsICA1MCwgIDUwLCAxMDcgfSAvKiBsZWZ0ID0gdG0gKi8KLSAgICB9LCB7IC8qIGFib3ZlID0gZGMgKi8KLSAgICAgICAgeyAgOTIsICA0NSwgMTAyLCAxMzYsIDExNiwgMTgwLCAgNzQsICA5MCwgMTAwIH0gLyogbGVmdCA9IHYgKi8sCi0gICAgICAgIHsgIDczLCAgMzIsICAxOSwgMTg3LCAyMjIsIDIxNSwgIDQ2LCAgMzQsIDEwMCB9IC8qIGxlZnQgPSBoICovLAotICAgICAgICB7IDEzNywgIDMwLCAgNDIsIDE0OCwgMTUxLCAyMDcsICA3MCwgIDUyLCAgOTEgfSAvKiBsZWZ0ID0gZGMgKi8sCi0gICAgICAgIHsgIDkxLCAgMzAsICAzMiwgMTE2LCAxMjEsIDE4NiwgIDkzLCAgODYsICA5NCB9IC8qIGxlZnQgPSBkNDUgKi8sCi0gICAgICAgIHsgIDcyLCAgMzUsICAzNiwgMTQ5LCAgNjgsIDIwNiwgIDY4LCAgNjMsIDEwNSB9IC8qIGxlZnQgPSBkMTM1ICovLAotICAgICAgICB7ICA3MywgIDMxLCAgMjgsIDEzOCwgIDU3LCAxMjQsICA1NSwgMTIyLCAxNTEgfSAvKiBsZWZ0ID0gZDExNyAqLywKLSAgICAgICAgeyAgNjcsICAyMywgIDIxLCAxNDAsIDEyNiwgMTk3LCAgNDAsICAzNywgMTcxIH0gLyogbGVmdCA9IGQxNTMgKi8sCi0gICAgICAgIHsgIDc0LCAgMzIsICAyNywgMTA3LCAgODYsIDE2MCwgIDYzLCAxMzQsIDEwMiB9IC8qIGxlZnQgPSBkNjMgKi8sCi0gICAgICAgIHsgIDg2LCAgMjcsICAyOCwgMTI4LCAxNTQsIDIxMiwgIDQ1LCAgNDMsICA1MyB9IC8qIGxlZnQgPSBkMjcgKi8sCi0gICAgICAgIHsgIDU5LCAgNjcsICA0NCwgMTQwLCAxNjEsIDIwMiwgIDc4LCAgNjcsIDExOSB9IC8qIGxlZnQgPSB0bSAqLwotICAgIH0sIHsgLyogYWJvdmUgPSBkNDUgKi8KLSAgICAgICAgeyAgNTksICAzOCwgIDgzLCAxMTIsIDEwMywgMTYyLCAgOTgsIDEzNiwgIDkwIH0gLyogbGVmdCA9IHYgKi8sCi0gICAgICAgIHsgIDYyLCAgMzAsICAyMywgMTU4LCAyMDAsIDIwNywgIDU5LCAgNTcsICA1MCB9IC8qIGxlZnQgPSBoICovLAotICAgICAgICB7IDEwMywgIDI2LCAgMzYsIDEyOSwgMTMyLCAyMDEsICA4MywgIDgwLCAgOTMgfSAvKiBsZWZ0ID0gZGMgKi8sCi0gICAgICAgIHsgIDY3LCAgMzAsICAyOSwgIDg0LCAgODYsIDE5MSwgMTAyLCAgOTEsICA1OSB9IC8qIGxlZnQgPSBkNDUgKi8sCi0gICAgICAgIHsgIDYwLCAgMzIsICAzMywgMTEyLCAgNzEsIDIyMCwgIDY0LCAgODksIDEwNCB9IC8qIGxlZnQgPSBkMTM1ICovLAotICAgICAgICB7ICA1MywgIDI2LCAgMzQsIDEzMCwgIDU2LCAxNDksICA4NCwgMTIwLCAxMDMgfSAvKiBsZWZ0ID0gZDExNyAqLywKLSAgICAgICAgeyAgNTMsICAyMSwgIDIzLCAxMzMsIDEwOSwgMjEwLCAgNTYsICA3NywgMTcyIH0gLyogbGVmdCA9IGQxNTMgKi8sCi0gICAgICAgIHsgIDYxLCAgMjksICAyOSwgIDkzLCAgOTcsIDE2NSwgIDgzLCAxNzUsIDE2MiB9IC8qIGxlZnQgPSBkNjMgKi8sCi0gICAgICAgIHsgIDc3LCAgMTksICAyOSwgMTEyLCAxNDIsIDIyOCwgIDU1LCAgNjYsICAzNiB9IC8qIGxlZnQgPSBkMjcgKi8sCi0gICAgICAgIHsgIDQ3LCAgNDcsICA0MywgMTE0LCAxMzcsIDE4MSwgMTAwLCAgOTksICA5NSB9IC8qIGxlZnQgPSB0bSAqLwotICAgIH0sIHsgLyogYWJvdmUgPSBkMTM1ICovCi0gICAgICAgIHsgIDUzLCAgNDAsICA1NSwgMTM5LCAgNjksIDE4MywgIDYxLCAgODAsIDExMCB9IC8qIGxlZnQgPSB2ICovLAotICAgICAgICB7ICA0MCwgIDI5LCAgMTksIDE2MSwgMTgwLCAyMDcsICA0MywgIDI0LCAgOTEgfSAvKiBsZWZ0ID0gaCAqLywKLSAgICAgICAgeyAgNjksICAyMywgIDI5LCAxMjgsICA4MywgMTk5LCAgNDYsICA0NCwgMTAxIH0gLyogbGVmdCA9IGRjICovLAotICAgICAgICB7ICA2MCwgIDM0LCAgMTksIDEwNSwgIDYxLCAxOTgsICA1MywgIDY0LCAgODkgfSAvKiBsZWZ0ID0gZDQ1ICovLAotICAgICAgICB7ICA1MiwgIDMxLCAgMjIsIDE1OCwgIDQwLCAyMDksICA1OCwgIDYyLCAgODkgfSAvKiBsZWZ0ID0gZDEzNSAqLywKLSAgICAgICAgeyAgNDQsICAzMSwgIDI5LCAxNDcsICA0NiwgMTU4LCAgNTYsIDEwMiwgMTk4IH0gLyogbGVmdCA9IGQxMTcgKi8sCi0gICAgICAgIHsgIDM1LCAgMTksICAxMiwgMTM1LCAgODcsIDIwOSwgIDQxLCAgNDUsIDE2NyB9IC8qIGxlZnQgPSBkMTUzICovLAotICAgICAgICB7ICA1MSwgIDM4LCAgMjUsIDExMywgIDU4LCAxNjQsICA3MCwgIDkzLCAgOTcgfSAvKiBsZWZ0ID0gZDYzICovLAotICAgICAgICB7ICA1NSwgIDI1LCAgMjEsIDExOCwgIDk1LCAyMTUsICAzOCwgIDM5LCAgNjYgfSAvKiBsZWZ0ID0gZDI3ICovLAotICAgICAgICB7ICA0NywgIDU0LCAgMzQsIDE0NiwgMTA4LCAyMDMsICA3MiwgMTAzLCAxNTEgfSAvKiBsZWZ0ID0gdG0gKi8KLSAgICB9LCB7IC8qIGFib3ZlID0gZDExNyAqLwotICAgICAgICB7ICA0NiwgIDI3LCAgODAsIDE1MCwgIDU1LCAxMjQsICA1NSwgMTIxLCAxMzUgfSAvKiBsZWZ0ID0gdiAqLywKLSAgICAgICAgeyAgMzYsICAyMywgIDI3LCAxNjUsIDE0OSwgMTY2LCAgNTQsICA2NCwgMTE4IH0gLyogbGVmdCA9IGggKi8sCi0gICAgICAgIHsgIDY0LCAgMTksICAzNywgMTU2LCAgNjYsIDEzOCwgIDQ5LCAgOTUsIDEzMyB9IC8qIGxlZnQgPSBkYyAqLywKLSAgICAgICAgeyAgNTMsICAyMSwgIDM2LCAxMzEsICA2MywgMTYzLCAgNjAsIDEwOSwgIDgxIH0gLyogbGVmdCA9IGQ0NSAqLywKLSAgICAgICAgeyAgNDAsICAyNiwgIDM1LCAxNTQsICA0MCwgMTg1LCAgNTEsICA5NywgMTIzIH0gLyogbGVmdCA9IGQxMzUgKi8sCi0gICAgICAgIHsgIDM1LCAgMTksICAzNCwgMTc5LCAgMTksICA5NywgIDQ4LCAxMjksIDEyNCB9IC8qIGxlZnQgPSBkMTE3ICovLAotICAgICAgICB7ICAzNiwgIDIwLCAgMjYsIDEzNiwgIDYyLCAxNjQsICAzMywgIDc3LCAxNTQgfSAvKiBsZWZ0ID0gZDE1MyAqLywKLSAgICAgICAgeyAgNDUsICAyNiwgIDI4LCAxMjksICA0NSwgMTI5LCAgNDksIDE0NywgMTIzIH0gLyogbGVmdCA9IGQ2MyAqLywKLSAgICAgICAgeyAgNDUsICAxOCwgIDMyLCAxMzAsICA5MCwgMTU3LCAgNDAsICA3OSwgIDkxIH0gLyogbGVmdCA9IGQyNyAqLywKLSAgICAgICAgeyAgMzgsICA0NCwgIDUxLCAxMzYsICA3NCwgMTYyLCAgNTcsICA5NywgMTIxIH0gLyogbGVmdCA9IHRtICovCi0gICAgfSwgeyAvKiBhYm92ZSA9IGQxNTMgKi8KLSAgICAgICAgeyAgNTYsICAzOSwgIDU4LCAxMzMsIDExNywgMTczLCAgNDgsICA1MywgMTg3IH0gLyogbGVmdCA9IHYgKi8sCi0gICAgICAgIHsgIDM1LCAgMjEsICAxMiwgMTYxLCAyMTIsIDIwNywgIDIwLCAgMjMsIDE0NSB9IC8qIGxlZnQgPSBoICovLAotICAgICAgICB7ICA3NSwgIDE3LCAgMjIsIDEzNiwgMTM4LCAxODUsICAzMiwgIDM0LCAxNjYgfSAvKiBsZWZ0ID0gZGMgKi8sCi0gICAgICAgIHsgIDU2LCAgMjksICAxOSwgMTE3LCAxMDksIDE4MSwgIDU1LCAgNjgsIDExMiB9IC8qIGxlZnQgPSBkNDUgKi8sCi0gICAgICAgIHsgIDQ3LCAgMjksICAxNywgMTUzLCAgNjQsIDIyMCwgIDU5LCAgNTEsIDExNCB9IC8qIGxlZnQgPSBkMTM1ICovLAotICAgICAgICB7ICA0NiwgIDE2LCAgMjQsIDEzNiwgIDc2LCAxNDcsICA0MSwgIDY0LCAxNzIgfSAvKiBsZWZ0ID0gZDExNyAqLywKLSAgICAgICAgeyAgMzQsICAxNywgIDExLCAxMDgsIDE1MiwgMTg3LCAgMTMsICAxNSwgMjA5IH0gLyogbGVmdCA9IGQxNTMgKi8sCi0gICAgICAgIHsgIDU1LCAgMzAsICAxOCwgMTIyLCAgNzksIDE3OSwgIDQ0LCAgODgsIDExNiB9IC8qIGxlZnQgPSBkNjMgKi8sCi0gICAgICAgIHsgIDUxLCAgMjQsICAxNCwgMTE1LCAxMzMsIDIwOSwgIDMyLCAgMjYsIDEwNCB9IC8qIGxlZnQgPSBkMjcgKi8sCi0gICAgICAgIHsgIDM3LCAgNDksICAyNSwgMTI5LCAxNjgsIDE2NCwgIDQxLCAgNTQsIDE0OCB9IC8qIGxlZnQgPSB0bSAqLwotICAgIH0sIHsgLyogYWJvdmUgPSBkNjMgKi8KLSAgICAgICAgeyAgNDgsICAzNCwgIDg2LCAxMDEsICA5MiwgMTQ2LCAgNzgsIDE3OSwgMTM0IH0gLyogbGVmdCA9IHYgKi8sCi0gICAgICAgIHsgIDQ3LCAgMjIsICAyNCwgMTM4LCAxODcsIDE3OCwgIDY4LCAgNjksICA1OSB9IC8qIGxlZnQgPSBoICovLAotICAgICAgICB7ICA3OCwgIDIzLCAgMzksIDExMSwgMTE3LCAxNzAsICA3NCwgMTI0LCAgOTQgfSAvKiBsZWZ0ID0gZGMgKi8sCi0gICAgICAgIHsgIDU2LCAgMjUsICAzMywgMTA1LCAxMTIsIDE4NywgIDk1LCAxNzcsIDEyOSB9IC8qIGxlZnQgPSBkNDUgKi8sCi0gICAgICAgIHsgIDQ4LCAgMzEsICAyNywgMTE0LCAgNjMsIDE4MywgIDgyLCAxMTYsICA1NiB9IC8qIGxlZnQgPSBkMTM1ICovLAotICAgICAgICB7ICA0MywgIDI4LCAgMzcsIDEyMSwgIDYzLCAxMjMsICA2MSwgMTkyLCAxNjkgfSAvKiBsZWZ0ID0gZDExNyAqLywKLSAgICAgICAgeyAgNDIsICAxNywgIDI0LCAxMDksICA5NywgMTc3LCAgNTYsICA3NiwgMTIyIH0gLyogbGVmdCA9IGQxNTMgKi8sCi0gICAgICAgIHsgIDQ2LCAgMjMsICAzMiwgIDc0LCAgODYsIDE1MCwgIDY3LCAxODMsICA4OCB9IC8qIGxlZnQgPSBkNjMgKi8sCi0gICAgICAgIHsgIDU4LCAgMTgsICAyOCwgMTA1LCAxMzksIDE4MiwgIDcwLCAgOTIsICA2MyB9IC8qIGxlZnQgPSBkMjcgKi8sCi0gICAgICAgIHsgIDM2LCAgMzgsICA0OCwgIDkyLCAxMjIsIDE2NSwgIDg4LCAxMzcsICA5MSB9IC8qIGxlZnQgPSB0bSAqLwotICAgIH0sIHsgLyogYWJvdmUgPSBkMjcgKi8KLSAgICAgICAgeyAgNjIsICA0NCwgIDYxLCAxMjMsIDEwNSwgMTg5LCAgNDgsICA1NywgIDY0IH0gLyogbGVmdCA9IHYgKi8sCi0gICAgICAgIHsgIDQ3LCAgMjUsICAxNywgMTc1LCAyMjIsIDIyMCwgIDI0LCAgMzAsICA4NiB9IC8qIGxlZnQgPSBoICovLAotICAgICAgICB7ICA4MiwgIDIyLCAgMzIsIDEyNywgMTQzLCAyMTMsICAzOSwgIDQxLCAgNzAgfSAvKiBsZWZ0ID0gZGMgKi8sCi0gICAgICAgIHsgIDY4LCAgMzYsICAxNywgMTA2LCAxMDIsIDIwNiwgIDU5LCAgNzQsICA3NCB9IC8qIGxlZnQgPSBkNDUgKi8sCi0gICAgICAgIHsgIDU3LCAgMzksICAyMywgMTUxLCAgNjgsIDIxNiwgIDU1LCAgNjMsICA1OCB9IC8qIGxlZnQgPSBkMTM1ICovLAotICAgICAgICB7ICA0OSwgIDMwLCAgMzUsIDE0MSwgIDcwLCAxNjgsICA4MiwgIDQwLCAxMTUgfSAvKiBsZWZ0ID0gZDExNyAqLywKLSAgICAgICAgeyAgNTEsICAyNSwgIDE1LCAxMzYsIDEyOSwgMjAyLCAgMzgsICAzNSwgMTM5IH0gLyogbGVmdCA9IGQxNTMgKi8sCi0gICAgICAgIHsgIDU5LCAgMzksICAxOSwgMTE0LCAgNzUsIDE4MCwgIDc3LCAxMDQsICA0MiB9IC8qIGxlZnQgPSBkNjMgKi8sCi0gICAgICAgIHsgIDY4LCAgMjYsICAxNiwgMTExLCAxNDEsIDIxNSwgIDI5LCAgMjgsICAyOCB9IC8qIGxlZnQgPSBkMjcgKi8sCi0gICAgICAgIHsgIDQwLCAgNjEsICAyNiwgMTI2LCAxNTIsIDIwNiwgIDYxLCAgNTksICA5MyB9IC8qIGxlZnQgPSB0bSAqLwotICAgIH0sIHsgLyogYWJvdmUgPSB0bSAqLwotICAgICAgICB7ICA0NCwgIDc4LCAxMTUsIDEzMiwgMTE5LCAxNzMsICA3MSwgMTEyLCAgOTMgfSAvKiBsZWZ0ID0gdiAqLywKLSAgICAgICAgeyAgMzksICAzOCwgIDIxLCAxODQsIDIyNywgMjA2LCAgNDIsICAzMiwgIDY0IH0gLyogbGVmdCA9IGggKi8sCi0gICAgICAgIHsgIDY1LCAgNzAsICA2MCwgMTU1LCAxNTksIDE5OSwgIDYxLCAgNjAsICA4MSB9IC8qIGxlZnQgPSBkYyAqLywKLSAgICAgICAgeyAgNTgsICA0NywgIDM2LCAxMjQsIDEzNywgMTkzLCAgODAsICA4MiwgIDc4IH0gLyogbGVmdCA9IGQ0NSAqLywKLSAgICAgICAgeyAgNDksICA1MCwgIDM1LCAxNDQsICA5NSwgMjA1LCAgNjMsICA3OCwgIDU5IH0gLyogbGVmdCA9IGQxMzUgKi8sCi0gICAgICAgIHsgIDQxLCAgNTMsICA1MiwgMTQ4LCAgNzEsIDE0MiwgIDY1LCAxMjgsICA1MSB9IC8qIGxlZnQgPSBkMTE3ICovLAotICAgICAgICB7ICA0MCwgIDM2LCAgMjgsIDE0MywgMTQzLCAyMDIsICA0MCwgIDU1LCAxMzcgfSAvKiBsZWZ0ID0gZDE1MyAqLywKLSAgICAgICAgeyAgNDIsICA0NCwgIDQ0LCAxMDQsIDEwNSwgMTY0LCAgNjQsIDEzMCwgIDgwIH0gLyogbGVmdCA9IGQ2MyAqLywKLSAgICAgICAgeyAgNTIsICAzNCwgIDI5LCAxMjksIDE4MywgMjI3LCAgNDIsICAzNSwgIDQzIH0gLyogbGVmdCA9IGQyNyAqLywKLSAgICAgICAgeyAgNDMsICA4MSwgIDUzLCAxNDAsIDE2OSwgMjA0LCAgNjgsICA4NCwgIDcyIH0gLyogbGVmdCA9IHRtICovCi0gICAgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgdnA5X2RlZmF1bHRfa2ZfdXZtb2RlX3Byb2JzWzEwXVs5XSA9IHsKLSAgICB7IDExOCwgIDE1LCAxMjMsIDE0OCwgMTMxLCAxMDEsICA0NCwgIDkzLCAxMzEgfSAvKiB5ID0gdiAqLywKLSAgICB7IDExMywgIDEyLCAgMjMsIDE4OCwgMjI2LCAxNDIsICAyNiwgIDMyLCAxMjUgfSAvKiB5ID0gaCAqLywKLSAgICB7IDE0NCwgIDExLCAgNTQsIDE1NywgMTk1LCAxMzAsICA0NiwgIDU4LCAxMDggfSAvKiB5ID0gZGMgKi8sCi0gICAgeyAxMjAsICAxMSwgIDUwLCAxMjMsIDE2MywgMTM1LCAgNjQsICA3NywgMTAzIH0gLyogeSA9IGQ0NSAqLywKLSAgICB7IDExMywgICA5LCAgMzYsIDE1NSwgMTExLCAxNTcsICAzMiwgIDQ0LCAxNjEgfSAvKiB5ID0gZDEzNSAqLywKLSAgICB7IDExNiwgICA5LCAgNTUsIDE3NiwgIDc2LCAgOTYsICAzNywgIDYxLCAxNDkgfSAvKiB5ID0gZDExNyAqLywKLSAgICB7IDExNSwgICA5LCAgMjgsIDE0MSwgMTYxLCAxNjcsICAyMSwgIDI1LCAxOTMgfSAvKiB5ID0gZDE1MyAqLywKLSAgICB7IDExNiwgIDEyLCAgNjQsIDEyMCwgMTQwLCAxMjUsICA0OSwgMTE1LCAxMjEgfSAvKiB5ID0gZDYzICovLAotICAgIHsgMTIwLCAgMTIsICAzMiwgMTQ1LCAxOTUsIDE0MiwgIDMyLCAgMzgsICA4NiB9IC8qIHkgPSBkMjcgKi8sCi0gICAgeyAxMDIsICAxOSwgIDY2LCAxNjIsIDE4MiwgMTIyLCAgMzUsICA1OSwgMTI4IH0gLyogeSA9IHRtICovCi19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IHZwOV9pbnRlcl9tb2RlX3RyZWVbM11bMl0gPSB7Ci0gICAgeyAtWkVST01WLCAxIH0sICAgICAgICAvLyAnMCcKLSAgICAgeyAtTkVBUkVTVE1WLCAyIH0sICAgIC8vICcxMCcKLSAgICAgIHsgLU5FQVJNViwgLU5FV01WIH0sIC8vICcxMXgnCi19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IHZwOV9maWx0ZXJfdHJlZVsyXVsyXSA9IHsKLSAgICB7IC0wLCAxIH0sICAgLy8gJzAnCi0gICAgIHsgLTEsIC0yIH0sIC8vICcxeCcKLX07Ci0KLXN0YXRpYyBjb25zdCBlbnVtIEZpbHRlck1vZGUgdnA5X2ZpbHRlcl9sdXRbM10gPSB7Ci0gICAgRklMVEVSXzhUQVBfUkVHVUxBUiwKLSAgICBGSUxURVJfOFRBUF9TTU9PVEgsCi0gICAgRklMVEVSXzhUQVBfU0hBUlAsCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfZGNfcWxvb2t1cFszXVsyNTZdID0gewotICAgIHsKLSAgICAgICAgICAgIDQsICAgICA4LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEyLAotICAgICAgICAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMTksCi0gICAgICAgICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNiwKLSAgICAgICAgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAzMiwgICAgMzIsICAgIDMzLAotICAgICAgICAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsICAgIDM4LCAgICAzOSwgICAgNDAsCi0gICAgICAgICAgIDQxLCAgICA0MiwgICAgNDMsICAgIDQzLCAgICA0NCwgICAgNDUsICAgIDQ2LCAgICA0NywKLSAgICAgICAgICAgNDgsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDUzLAotICAgICAgICAgICA1NCwgICAgNTUsICAgIDU2LCAgICA1NywgICAgNTcsICAgIDU4LCAgICA1OSwgICAgNjAsCi0gICAgICAgICAgIDYxLCAgICA2MiwgICAgNjIsICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NiwKLSAgICAgICAgICAgNjcsICAgIDY4LCAgICA2OSwgICAgNzAsICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLAotICAgICAgICAgICA3NCwgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LCAgICA3OCwgICAgNzksCi0gICAgICAgICAgIDgwLCAgICA4MSwgICAgODEsICAgIDgyLCAgICA4MywgICAgODQsICAgIDg1LCAgICA4NSwKLSAgICAgICAgICAgODcsICAgIDg4LCAgICA5MCwgICAgOTIsICAgIDkzLCAgICA5NSwgICAgOTYsICAgIDk4LAotICAgICAgICAgICA5OSwgICAxMDEsICAgMTAyLCAgIDEwNCwgICAxMDUsICAgMTA3LCAgIDEwOCwgICAxMTAsCi0gICAgICAgICAgMTExLCAgIDExMywgICAxMTQsICAgMTE2LCAgIDExNywgICAxMTgsICAgMTIwLCAgIDEyMSwKLSAgICAgICAgICAxMjMsICAgMTI1LCAgIDEyNywgICAxMjksICAgMTMxLCAgIDEzNCwgICAxMzYsICAgMTM4LAotICAgICAgICAgIDE0MCwgICAxNDIsICAgMTQ0LCAgIDE0NiwgICAxNDgsICAgMTUwLCAgIDE1MiwgICAxNTQsCi0gICAgICAgICAgMTU2LCAgIDE1OCwgICAxNjEsICAgMTY0LCAgIDE2NiwgICAxNjksICAgMTcyLCAgIDE3NCwKLSAgICAgICAgICAxNzcsICAgMTgwLCAgIDE4MiwgICAxODUsICAgMTg3LCAgIDE5MCwgICAxOTIsICAgMTk1LAotICAgICAgICAgIDE5OSwgICAyMDIsICAgMjA1LCAgIDIwOCwgICAyMTEsICAgMjE0LCAgIDIxNywgICAyMjAsCi0gICAgICAgICAgMjIzLCAgIDIyNiwgICAyMzAsICAgMjMzLCAgIDIzNywgICAyNDAsICAgMjQzLCAgIDI0NywKLSAgICAgICAgICAyNTAsICAgMjUzLCAgIDI1NywgICAyNjEsICAgMjY1LCAgIDI2OSwgICAyNzIsICAgMjc2LAotICAgICAgICAgIDI4MCwgICAyODQsICAgMjg4LCAgIDI5MiwgICAyOTYsICAgMzAwLCAgIDMwNCwgICAzMDksCi0gICAgICAgICAgMzEzLCAgIDMxNywgICAzMjIsICAgMzI2LCAgIDMzMCwgICAzMzUsICAgMzQwLCAgIDM0NCwKLSAgICAgICAgICAzNDksICAgMzU0LCAgIDM1OSwgICAzNjQsICAgMzY5LCAgIDM3NCwgICAzNzksICAgMzg0LAotICAgICAgICAgIDM4OSwgICAzOTUsICAgNDAwLCAgIDQwNiwgICA0MTEsICAgNDE3LCAgIDQyMywgICA0MjksCi0gICAgICAgICAgNDM1LCAgIDQ0MSwgICA0NDcsICAgNDU0LCAgIDQ2MSwgICA0NjcsICAgNDc1LCAgIDQ4MiwKLSAgICAgICAgICA0ODksICAgNDk3LCAgIDUwNSwgICA1MTMsICAgNTIyLCAgIDUzMCwgICA1MzksICAgNTQ5LAotICAgICAgICAgIDU1OSwgICA1NjksICAgNTc5LCAgIDU5MCwgICA2MDIsICAgNjE0LCAgIDYyNiwgICA2NDAsCi0gICAgICAgICAgNjU0LCAgIDY2OCwgICA2ODQsICAgNzAwLCAgIDcxNywgICA3MzYsICAgNzU1LCAgIDc3NSwKLSAgICAgICAgICA3OTYsICAgODE5LCAgIDg0MywgICA4NjksICAgODk2LCAgIDkyNSwgICA5NTUsICAgOTg4LAotICAgICAgICAgMTAyMiwgIDEwNTgsICAxMDk4LCAgMTEzOSwgIDExODQsICAxMjMyLCAgMTI4MiwgIDEzMzYsCi0gICAgfSwgewotICAgICAgICAgICAgNCwgICAgIDksICAgIDEwLCAgICAxMywgICAgMTUsICAgIDE3LCAgICAyMCwgICAgMjIsCi0gICAgICAgICAgIDI1LCAgICAyOCwgICAgMzEsICAgIDM0LCAgICAzNywgICAgNDAsICAgIDQzLCAgICA0NywKLSAgICAgICAgICAgNTAsICAgIDUzLCAgICA1NywgICAgNjAsICAgIDY0LCAgICA2OCwgICAgNzEsICAgIDc1LAotICAgICAgICAgICA3OCwgICAgODIsICAgIDg2LCAgICA5MCwgICAgOTMsICAgIDk3LCAgIDEwMSwgICAxMDUsCi0gICAgICAgICAgMTA5LCAgIDExMywgICAxMTYsICAgMTIwLCAgIDEyNCwgICAxMjgsICAgMTMyLCAgIDEzNiwKLSAgICAgICAgICAxNDAsICAgMTQzLCAgIDE0NywgICAxNTEsICAgMTU1LCAgIDE1OSwgICAxNjMsICAgMTY2LAotICAgICAgICAgIDE3MCwgICAxNzQsICAgMTc4LCAgIDE4MiwgICAxODUsICAgMTg5LCAgIDE5MywgICAxOTcsCi0gICAgICAgICAgMjAwLCAgIDIwNCwgICAyMDgsICAgMjEyLCAgIDIxNSwgICAyMTksICAgMjIzLCAgIDIyNiwKLSAgICAgICAgICAyMzAsICAgMjMzLCAgIDIzNywgICAyNDEsICAgMjQ0LCAgIDI0OCwgICAyNTEsICAgMjU1LAotICAgICAgICAgIDI1OSwgICAyNjIsICAgMjY2LCAgIDI2OSwgICAyNzMsICAgMjc2LCAgIDI4MCwgICAyODMsCi0gICAgICAgICAgMjg3LCAgIDI5MCwgICAyOTMsICAgMjk3LCAgIDMwMCwgICAzMDQsICAgMzA3LCAgIDMxMCwKLSAgICAgICAgICAzMTQsICAgMzE3LCAgIDMyMSwgICAzMjQsICAgMzI3LCAgIDMzMSwgICAzMzQsICAgMzM3LAotICAgICAgICAgIDM0MywgICAzNTAsICAgMzU2LCAgIDM2MiwgICAzNjksICAgMzc1LCAgIDM4MSwgICAzODcsCi0gICAgICAgICAgMzk0LCAgIDQwMCwgICA0MDYsICAgNDEyLCAgIDQxOCwgICA0MjQsICAgNDMwLCAgIDQzNiwKLSAgICAgICAgICA0NDIsICAgNDQ4LCAgIDQ1NCwgICA0NjAsICAgNDY2LCAgIDQ3MiwgICA0NzgsICAgNDg0LAotICAgICAgICAgIDQ5MCwgICA0OTksICAgNTA3LCAgIDUxNiwgICA1MjUsICAgNTMzLCAgIDU0MiwgICA1NTAsCi0gICAgICAgICAgNTU5LCAgIDU2NywgICA1NzYsICAgNTg0LCAgIDU5MiwgICA2MDEsICAgNjA5LCAgIDYxNywKLSAgICAgICAgICA2MjUsICAgNjM0LCAgIDY0NCwgICA2NTUsICAgNjY2LCAgIDY3NiwgICA2ODcsICAgNjk4LAotICAgICAgICAgIDcwOCwgICA3MTgsICAgNzI5LCAgIDczOSwgICA3NDksICAgNzU5LCAgIDc3MCwgICA3ODIsCi0gICAgICAgICAgNzk1LCAgIDgwNywgICA4MTksICAgODMxLCAgIDg0NCwgICA4NTYsICAgODY4LCAgIDg4MCwKLSAgICAgICAgICA4OTEsICAgOTA2LCAgIDkyMCwgICA5MzMsICAgOTQ3LCAgIDk2MSwgICA5NzUsICAgOTg4LAotICAgICAgICAgMTAwMSwgIDEwMTUsICAxMDMwLCAgMTA0NSwgIDEwNjEsICAxMDc2LCAgMTA5MCwgIDExMDUsCi0gICAgICAgICAxMTIwLCAgMTEzNywgIDExNTMsICAxMTcwLCAgMTE4NiwgIDEyMDIsICAxMjE4LCAgMTIzNiwKLSAgICAgICAgIDEyNTMsICAxMjcxLCAgMTI4OCwgIDEzMDYsICAxMzIzLCAgMTM0MiwgIDEzNjEsICAxMzc5LAotICAgICAgICAgMTM5OCwgIDE0MTYsICAxNDM2LCAgMTQ1NiwgIDE0NzYsICAxNDk2LCAgMTUxNiwgIDE1MzcsCi0gICAgICAgICAxNTU5LCAgMTU4MCwgIDE2MDEsICAxNjI0LCAgMTY0NywgIDE2NzAsICAxNjkyLCAgMTcxNywKLSAgICAgICAgIDE3NDEsICAxNzY2LCAgMTc5MSwgIDE4MTcsICAxODQ0LCAgMTg3MSwgIDE5MDAsICAxOTI5LAotICAgICAgICAgMTk1OCwgIDE5OTAsICAyMDIxLCAgMjA1NCwgIDIwODgsICAyMTIzLCAgMjE1OSwgIDIxOTcsCi0gICAgICAgICAyMjM2LCAgMjI3NiwgIDIzMTksICAyMzYzLCAgMjQxMCwgIDI0NTgsICAyNTA4LCAgMjU2MSwKLSAgICAgICAgIDI2MTYsICAyNjc1LCAgMjczNywgIDI4MDIsICAyODcxLCAgMjk0NCwgIDMwMjAsICAzMTAyLAotICAgICAgICAgMzE4OCwgIDMyODAsICAzMzc1LCAgMzQ3OCwgIDM1ODYsICAzNzAyLCAgMzgyMywgIDM5NTMsCi0gICAgICAgICA0MDg5LCAgNDIzNiwgIDQzOTQsICA0NTU5LCAgNDczNywgIDQ5MjksICA1MTMwLCAgNTM0NywKLSAgICB9LCB7Ci0gICAgICAgICAgICA0LCAgICAxMiwgICAgMTgsICAgIDI1LCAgICAzMywgICAgNDEsICAgIDUwLCAgICA2MCwKLSAgICAgICAgICAgNzAsICAgIDgwLCAgICA5MSwgICAxMDMsICAgMTE1LCAgIDEyNywgICAxNDAsICAgMTUzLAotICAgICAgICAgIDE2NiwgICAxODAsICAgMTk0LCAgIDIwOCwgICAyMjIsICAgMjM3LCAgIDI1MSwgICAyNjYsCi0gICAgICAgICAgMjgxLCAgIDI5NiwgICAzMTIsICAgMzI3LCAgIDM0MywgICAzNTgsICAgMzc0LCAgIDM5MCwKLSAgICAgICAgICA0MDUsICAgNDIxLCAgIDQzNywgICA0NTMsICAgNDY5LCAgIDQ4NCwgICA1MDAsICAgNTE2LAotICAgICAgICAgIDUzMiwgICA1NDgsICAgNTY0LCAgIDU4MCwgICA1OTYsICAgNjExLCAgIDYyNywgICA2NDMsCi0gICAgICAgICAgNjU5LCAgIDY3NCwgICA2OTAsICAgNzA2LCAgIDcyMSwgICA3MzcsICAgNzUyLCAgIDc2OCwKLSAgICAgICAgICA3ODMsICAgNzk4LCAgIDgxNCwgICA4MjksICAgODQ0LCAgIDg1OSwgICA4NzQsICAgODg5LAotICAgICAgICAgIDkwNCwgICA5MTksICAgOTM0LCAgIDk0OSwgICA5NjQsICAgOTc4LCAgIDk5MywgIDEwMDgsCi0gICAgICAgICAxMDIyLCAgMTAzNywgIDEwNTEsICAxMDY1LCAgMTA4MCwgIDEwOTQsICAxMTA4LCAgMTEyMiwKLSAgICAgICAgIDExMzYsICAxMTUxLCAgMTE2NSwgIDExNzksICAxMTkyLCAgMTIwNiwgIDEyMjAsICAxMjM0LAotICAgICAgICAgMTI0OCwgIDEyNjEsICAxMjc1LCAgMTI4OCwgIDEzMDIsICAxMzE1LCAgMTMyOSwgIDEzNDIsCi0gICAgICAgICAxMzY4LCAgMTM5MywgIDE0MTksICAxNDQ0LCAgMTQ2OSwgIDE0OTQsICAxNTE5LCAgMTU0NCwKLSAgICAgICAgIDE1NjksICAxNTk0LCAgMTYxOCwgIDE2NDMsICAxNjY4LCAgMTY5MiwgIDE3MTcsICAxNzQxLAotICAgICAgICAgMTc2NSwgIDE3ODksICAxODE0LCAgMTgzOCwgIDE4NjIsICAxODg1LCAgMTkwOSwgIDE5MzMsCi0gICAgICAgICAxOTU3LCAgMTk5MiwgIDIwMjcsICAyMDYxLCAgMjA5NiwgIDIxMzAsICAyMTY1LCAgMjE5OSwKLSAgICAgICAgIDIyMzMsICAyMjY3LCAgMjMwMCwgIDIzMzQsICAyMzY3LCAgMjQwMCwgIDI0MzQsICAyNDY3LAotICAgICAgICAgMjQ5OSwgIDI1MzIsICAyNTc1LCAgMjYxOCwgIDI2NjEsICAyNzA0LCAgMjc0NiwgIDI3ODgsCi0gICAgICAgICAyODMwLCAgMjg3MiwgIDI5MTMsICAyOTU0LCAgMjk5NSwgIDMwMzYsICAzMDc2LCAgMzEyNywKLSAgICAgICAgIDMxNzcsICAzMjI2LCAgMzI3NSwgIDMzMjQsICAzMzczLCAgMzQyMSwgIDM0NjksICAzNTE3LAotICAgICAgICAgMzU2NSwgIDM2MjEsICAzNjc3LCAgMzczMywgIDM3ODgsICAzODQzLCAgMzg5NywgIDM5NTEsCi0gICAgICAgICA0MDA1LCAgNDA1OCwgIDQxMTksICA0MTgxLCAgNDI0MSwgIDQzMDEsICA0MzYxLCAgNDQyMCwKLSAgICAgICAgIDQ0NzksICA0NTQ2LCAgNDYxMiwgIDQ2NzcsICA0NzQyLCAgNDgwNywgIDQ4NzEsICA0OTQyLAotICAgICAgICAgNTAxMywgIDUwODMsICA1MTUzLCAgNTIyMiwgIDUyOTEsICA1MzY3LCAgNTQ0MiwgIDU1MTcsCi0gICAgICAgICA1NTkxLCAgNTY2NSwgIDU3NDUsICA1ODI1LCAgNTkwNSwgIDU5ODQsICA2MDYzLCAgNjE0OSwKLSAgICAgICAgIDYyMzQsICA2MzE5LCAgNjQwNCwgIDY0OTUsICA2NTg3LCAgNjY3OCwgIDY3NjksICA2ODY3LAotICAgICAgICAgNjk2NiwgIDcwNjQsICA3MTYzLCAgNzI2OSwgIDczNzYsICA3NDgzLCAgNzU5OSwgIDc3MTUsCi0gICAgICAgICA3ODMyLCAgNzk1OCwgIDgwODUsICA4MjE0LCAgODM1MiwgIDg0OTIsICA4NjM1LCAgODc4OCwKLSAgICAgICAgIDg5NDUsICA5MTA0LCAgOTI3NSwgIDk0NTAsICA5NjM5LCAgOTgzMiwgMTAwMzEsIDEwMjQ1LAotICAgICAgICAxMDQ2NSwgMTA3MDIsIDEwOTQ2LCAxMTIxMCwgMTE0ODIsIDExNzc2LCAxMjA4MSwgMTI0MDksCi0gICAgICAgIDEyNzUwLCAxMzExOCwgMTM1MDEsIDEzOTEzLCAxNDM0MywgMTQ4MDcsIDE1MjkwLCAxNTgxMiwKLSAgICAgICAgMTYzNTYsIDE2OTQzLCAxNzU3NSwgMTgyMzcsIDE4OTQ5LCAxOTcxOCwgMjA1MjEsIDIxMzg3LAotICAgIH0KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9hY19xbG9va3VwWzNdWzI1Nl0gPSB7Ci0gICAgewotICAgICAgICAgICAgNCwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsCi0gICAgICAgICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwKLSAgICAgICAgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLAotICAgICAgICAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LCAgICAzNywgICAgMzgsCi0gICAgICAgICAgIDM5LCAgICA0MCwgICAgNDEsICAgIDQyLCAgICA0MywgICAgNDQsICAgIDQ1LCAgICA0NiwKLSAgICAgICAgICAgNDcsICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUxLCAgICA1MiwgICAgNTMsICAgIDU0LAotICAgICAgICAgICA1NSwgICAgNTYsICAgIDU3LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjIsCi0gICAgICAgICAgIDYzLCAgICA2NCwgICAgNjUsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY5LCAgICA3MCwKLSAgICAgICAgICAgNzEsICAgIDcyLCAgICA3MywgICAgNzQsICAgIDc1LCAgICA3NiwgICAgNzcsICAgIDc4LAotICAgICAgICAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDg0LCAgICA4NSwgICAgODYsCi0gICAgICAgICAgIDg3LCAgICA4OCwgICAgODksICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkzLCAgICA5NCwKLSAgICAgICAgICAgOTUsICAgIDk2LCAgICA5NywgICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLAotICAgICAgICAgIDEwNCwgICAxMDYsICAgMTA4LCAgIDExMCwgICAxMTIsICAgMTE0LCAgIDExNiwgICAxMTgsCi0gICAgICAgICAgMTIwLCAgIDEyMiwgICAxMjQsICAgMTI2LCAgIDEyOCwgICAxMzAsICAgMTMyLCAgIDEzNCwKLSAgICAgICAgICAxMzYsICAgMTM4LCAgIDE0MCwgICAxNDIsICAgMTQ0LCAgIDE0NiwgICAxNDgsICAgMTUwLAotICAgICAgICAgIDE1MiwgICAxNTUsICAgMTU4LCAgIDE2MSwgICAxNjQsICAgMTY3LCAgIDE3MCwgICAxNzMsCi0gICAgICAgICAgMTc2LCAgIDE3OSwgICAxODIsICAgMTg1LCAgIDE4OCwgICAxOTEsICAgMTk0LCAgIDE5NywKLSAgICAgICAgICAyMDAsICAgMjAzLCAgIDIwNywgICAyMTEsICAgMjE1LCAgIDIxOSwgICAyMjMsICAgMjI3LAotICAgICAgICAgIDIzMSwgICAyMzUsICAgMjM5LCAgIDI0MywgICAyNDcsICAgMjUxLCAgIDI1NSwgICAyNjAsCi0gICAgICAgICAgMjY1LCAgIDI3MCwgICAyNzUsICAgMjgwLCAgIDI4NSwgICAyOTAsICAgMjk1LCAgIDMwMCwKLSAgICAgICAgICAzMDUsICAgMzExLCAgIDMxNywgICAzMjMsICAgMzI5LCAgIDMzNSwgICAzNDEsICAgMzQ3LAotICAgICAgICAgIDM1MywgICAzNTksICAgMzY2LCAgIDM3MywgICAzODAsICAgMzg3LCAgIDM5NCwgICA0MDEsCi0gICAgICAgICAgNDA4LCAgIDQxNiwgICA0MjQsICAgNDMyLCAgIDQ0MCwgICA0NDgsICAgNDU2LCAgIDQ2NSwKLSAgICAgICAgICA0NzQsICAgNDgzLCAgIDQ5MiwgICA1MDEsICAgNTEwLCAgIDUyMCwgICA1MzAsICAgNTQwLAotICAgICAgICAgIDU1MCwgICA1NjAsICAgNTcxLCAgIDU4MiwgICA1OTMsICAgNjA0LCAgIDYxNSwgICA2MjcsCi0gICAgICAgICAgNjM5LCAgIDY1MSwgICA2NjMsICAgNjc2LCAgIDY4OSwgICA3MDIsICAgNzE1LCAgIDcyOSwKLSAgICAgICAgICA3NDMsICAgNzU3LCAgIDc3MSwgICA3ODYsICAgODAxLCAgIDgxNiwgICA4MzIsICAgODQ4LAotICAgICAgICAgIDg2NCwgICA4ODEsICAgODk4LCAgIDkxNSwgICA5MzMsICAgOTUxLCAgIDk2OSwgICA5ODgsCi0gICAgICAgICAxMDA3LCAgMTAyNiwgIDEwNDYsICAxMDY2LCAgMTA4NywgIDExMDgsICAxMTI5LCAgMTE1MSwKLSAgICAgICAgIDExNzMsICAxMTk2LCAgMTIxOSwgIDEyNDMsICAxMjY3LCAgMTI5MiwgIDEzMTcsICAxMzQzLAotICAgICAgICAgMTM2OSwgIDEzOTYsICAxNDIzLCAgMTQ1MSwgIDE0NzksICAxNTA4LCAgMTUzNywgIDE1NjcsCi0gICAgICAgICAxNTk3LCAgMTYyOCwgIDE2NjAsICAxNjkyLCAgMTcyNSwgIDE3NTksICAxNzkzLCAgMTgyOCwKLSAgICB9LCB7Ci0gICAgICAgICAgICA0LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNiwgICAgMTgsICAgIDIxLCAgICAyNCwKLSAgICAgICAgICAgMjcsICAgIDMwLCAgICAzMywgICAgMzcsICAgIDQwLCAgICA0NCwgICAgNDgsICAgIDUxLAotICAgICAgICAgICA1NSwgICAgNTksICAgIDYzLCAgICA2NywgICAgNzEsICAgIDc1LCAgICA3OSwgICAgODMsCi0gICAgICAgICAgIDg4LCAgICA5MiwgICAgOTYsICAgMTAwLCAgIDEwNSwgICAxMDksICAgMTE0LCAgIDExOCwKLSAgICAgICAgICAxMjIsICAgMTI3LCAgIDEzMSwgICAxMzYsICAgMTQwLCAgIDE0NSwgICAxNDksICAgMTU0LAotICAgICAgICAgIDE1OCwgICAxNjMsICAgMTY4LCAgIDE3MiwgICAxNzcsICAgMTgxLCAgIDE4NiwgICAxOTAsCi0gICAgICAgICAgMTk1LCAgIDE5OSwgICAyMDQsICAgMjA4LCAgIDIxMywgICAyMTcsICAgMjIyLCAgIDIyNiwKLSAgICAgICAgICAyMzEsICAgMjM1LCAgIDI0MCwgICAyNDQsICAgMjQ5LCAgIDI1MywgICAyNTgsICAgMjYyLAotICAgICAgICAgIDI2NywgICAyNzEsICAgMjc1LCAgIDI4MCwgICAyODQsICAgMjg5LCAgIDI5MywgICAyOTcsCi0gICAgICAgICAgMzAyLCAgIDMwNiwgICAzMTEsICAgMzE1LCAgIDMxOSwgICAzMjQsICAgMzI4LCAgIDMzMiwKLSAgICAgICAgICAzMzcsICAgMzQxLCAgIDM0NSwgICAzNDksICAgMzU0LCAgIDM1OCwgICAzNjIsICAgMzY3LAotICAgICAgICAgIDM3MSwgICAzNzUsICAgMzc5LCAgIDM4NCwgICAzODgsICAgMzkyLCAgIDM5NiwgICA0MDEsCi0gICAgICAgICAgNDA5LCAgIDQxNywgICA0MjUsICAgNDMzLCAgIDQ0MSwgICA0NDksICAgNDU4LCAgIDQ2NiwKLSAgICAgICAgICA0NzQsICAgNDgyLCAgIDQ5MCwgICA0OTgsICAgNTA2LCAgIDUxNCwgICA1MjMsICAgNTMxLAotICAgICAgICAgIDUzOSwgICA1NDcsICAgNTU1LCAgIDU2MywgICA1NzEsICAgNTc5LCAgIDU4OCwgICA1OTYsCi0gICAgICAgICAgNjA0LCAgIDYxNiwgICA2MjgsICAgNjQwLCAgIDY1MiwgICA2NjQsICAgNjc2LCAgIDY4OCwKLSAgICAgICAgICA3MDAsICAgNzEzLCAgIDcyNSwgICA3MzcsICAgNzQ5LCAgIDc2MSwgICA3NzMsICAgNzg1LAotICAgICAgICAgIDc5NywgICA4MDksICAgODI1LCAgIDg0MSwgICA4NTcsICAgODczLCAgIDg4OSwgICA5MDUsCi0gICAgICAgICAgOTIyLCAgIDkzOCwgICA5NTQsICAgOTcwLCAgIDk4NiwgIDEwMDIsICAxMDE4LCAgMTAzOCwKLSAgICAgICAgIDEwNTgsICAxMDc4LCAgMTA5OCwgIDExMTgsICAxMTM4LCAgMTE1OCwgIDExNzgsICAxMTk4LAotICAgICAgICAgMTIxOCwgIDEyNDIsICAxMjY2LCAgMTI5MCwgIDEzMTQsICAxMzM4LCAgMTM2MiwgIDEzODYsCi0gICAgICAgICAxNDExLCAgMTQzNSwgIDE0NjMsICAxNDkxLCAgMTUxOSwgIDE1NDcsICAxNTc1LCAgMTYwMywKLSAgICAgICAgIDE2MzEsICAxNjYzLCAgMTY5NSwgIDE3MjcsICAxNzU5LCAgMTc5MSwgIDE4MjMsICAxODU5LAotICAgICAgICAgMTg5NSwgIDE5MzEsICAxOTY3LCAgMjAwMywgIDIwMzksICAyMDc5LCAgMjExOSwgIDIxNTksCi0gICAgICAgICAyMTk5LCAgMjIzOSwgIDIyODMsICAyMzI3LCAgMjM3MSwgIDI0MTUsICAyNDU5LCAgMjUwNywKLSAgICAgICAgIDI1NTUsICAyNjAzLCAgMjY1MSwgIDI3MDMsICAyNzU1LCAgMjgwNywgIDI4NTksICAyOTE1LAotICAgICAgICAgMjk3MSwgIDMwMjcsICAzMDgzLCAgMzE0MywgIDMyMDMsICAzMjYzLCAgMzMyNywgIDMzOTEsCi0gICAgICAgICAzNDU1LCAgMzUyMywgIDM1OTEsICAzNjU5LCAgMzczMSwgIDM4MDMsICAzODc2LCAgMzk1MiwKLSAgICAgICAgIDQwMjgsICA0MTA0LCAgNDE4NCwgIDQyNjQsICA0MzQ4LCAgNDQzMiwgIDQ1MTYsICA0NjA0LAotICAgICAgICAgNDY5MiwgIDQ3ODQsICA0ODc2LCAgNDk3MiwgIDUwNjgsICA1MTY4LCAgNTI2OCwgIDUzNzIsCi0gICAgICAgICA1NDc2LCAgNTU4NCwgIDU2OTIsICA1ODA0LCAgNTkxNiwgIDYwMzIsICA2MTQ4LCAgNjI2OCwKLSAgICAgICAgIDYzODgsICA2NTEyLCAgNjY0MCwgIDY3NjgsICA2OTAwLCAgNzAzNiwgIDcxNzIsICA3MzEyLAotICAgIH0sIHsKLSAgICAgICAgICAgIDQsICAgIDEzLCAgICAxOSwgICAgMjcsICAgIDM1LCAgICA0NCwgICAgNTQsICAgIDY0LAotICAgICAgICAgICA3NSwgICAgODcsICAgIDk5LCAgIDExMiwgICAxMjYsICAgMTM5LCAgIDE1NCwgICAxNjgsCi0gICAgICAgICAgMTgzLCAgIDE5OSwgICAyMTQsICAgMjMwLCAgIDI0NywgICAyNjMsICAgMjgwLCAgIDI5NywKLSAgICAgICAgICAzMTQsICAgMzMxLCAgIDM0OSwgICAzNjYsICAgMzg0LCAgIDQwMiwgICA0MjAsICAgNDM4LAotICAgICAgICAgIDQ1NiwgICA0NzUsICAgNDkzLCAgIDUxMSwgICA1MzAsICAgNTQ4LCAgIDU2NywgICA1ODYsCi0gICAgICAgICAgNjA0LCAgIDYyMywgICA2NDIsICAgNjYwLCAgIDY3OSwgICA2OTgsICAgNzE2LCAgIDczNSwKLSAgICAgICAgICA3NTMsICAgNzcyLCAgIDc5MSwgICA4MDksICAgODI4LCAgIDg0NiwgICA4NjUsICAgODg0LAotICAgICAgICAgIDkwMiwgICA5MjAsICAgOTM5LCAgIDk1NywgICA5NzYsICAgOTk0LCAgMTAxMiwgIDEwMzAsCi0gICAgICAgICAxMDQ5LCAgMTA2NywgIDEwODUsICAxMTAzLCAgMTEyMSwgIDExMzksICAxMTU3LCAgMTE3NSwKLSAgICAgICAgIDExOTMsICAxMjExLCAgMTIyOSwgIDEyNDYsICAxMjY0LCAgMTI4MiwgIDEyOTksICAxMzE3LAotICAgICAgICAgMTMzNSwgIDEzNTIsICAxMzcwLCAgMTM4NywgIDE0MDUsICAxNDIyLCAgMTQ0MCwgIDE0NTcsCi0gICAgICAgICAxNDc0LCAgMTQ5MSwgIDE1MDksICAxNTI2LCAgMTU0MywgIDE1NjAsICAxNTc3LCAgMTU5NSwKLSAgICAgICAgIDE2MjcsICAxNjYwLCAgMTY5MywgIDE3MjUsICAxNzU4LCAgMTc5MSwgIDE4MjQsICAxODU2LAotICAgICAgICAgMTg4OSwgIDE5MjIsICAxOTU0LCAgMTk4NywgIDIwMjAsICAyMDUyLCAgMjA4NSwgIDIxMTgsCi0gICAgICAgICAyMTUwLCAgMjE4MywgIDIyMTYsICAyMjQ4LCAgMjI4MSwgIDIzMTMsICAyMzQ2LCAgMjM3OCwKLSAgICAgICAgIDI0MTEsICAyNDU5LCAgMjUwOCwgIDI1NTYsICAyNjA1LCAgMjY1MywgIDI3MDEsICAyNzUwLAotICAgICAgICAgMjc5OCwgIDI4NDcsICAyODk1LCAgMjk0MywgIDI5OTIsICAzMDQwLCAgMzA4OCwgIDMxMzcsCi0gICAgICAgICAzMTg1LCAgMzIzNCwgIDMyOTgsICAzMzYyLCAgMzQyNiwgIDM0OTEsICAzNTU1LCAgMzYxOSwKLSAgICAgICAgIDM2ODQsICAzNzQ4LCAgMzgxMiwgIDM4NzYsICAzOTQxLCAgNDAwNSwgIDQwNjksICA0MTQ5LAotICAgICAgICAgNDIzMCwgIDQzMTAsICA0MzkwLCAgNDQ3MCwgIDQ1NTAsICA0NjMxLCAgNDcxMSwgIDQ3OTEsCi0gICAgICAgICA0ODcxLCAgNDk2NywgIDUwNjQsICA1MTYwLCAgNTI1NiwgIDUzNTIsICA1NDQ4LCAgNTU0NCwKLSAgICAgICAgIDU2NDEsICA1NzM3LCAgNTg0OSwgIDU5NjEsICA2MDczLCAgNjE4NSwgIDYyOTcsICA2NDEwLAotICAgICAgICAgNjUyMiwgIDY2NTAsICA2Nzc4LCAgNjkwNiwgIDcwMzQsICA3MTYyLCAgNzI5MCwgIDc0MzUsCi0gICAgICAgICA3NTc5LCAgNzcyMywgIDc4NjcsICA4MDExLCAgODE1NSwgIDgzMTUsICA4NDc1LCAgODYzNSwKLSAgICAgICAgIDg3OTUsICA4OTU2LCAgOTEzMiwgIDkzMDgsICA5NDg0LCAgOTY2MCwgIDk4MzYsIDEwMDI4LAotICAgICAgICAxMDIyMCwgMTA0MTIsIDEwNjA0LCAxMDgxMiwgMTEwMjAsIDExMjI4LCAxMTQzNywgMTE2NjEsCi0gICAgICAgIDExODg1LCAxMjEwOSwgMTIzMzMsIDEyNTczLCAxMjgxMywgMTMwNTMsIDEzMzA5LCAxMzU2NSwKLSAgICAgICAgMTM4MjEsIDE0MDkzLCAxNDM2NSwgMTQ2MzcsIDE0OTI1LCAxNTIxMywgMTU1MDIsIDE1ODA2LAotICAgICAgICAxNjExMCwgMTY0MTQsIDE2NzM0LCAxNzA1NCwgMTczOTAsIDE3NzI2LCAxODA2MiwgMTg0MTQsCi0gICAgICAgIDE4NzY2LCAxOTEzNCwgMTk1MDIsIDE5ODg2LCAyMDI3MCwgMjA2NzAsIDIxMDcwLCAyMTQ4NiwKLSAgICAgICAgMjE5MDIsIDIyMzM0LCAyMjc2NiwgMjMyMTQsIDIzNjYyLCAyNDEyNiwgMjQ1OTAsIDI1MDcwLAotICAgICAgICAyNTU1MSwgMjYwNDcsIDI2NTU5LCAyNzA3MSwgMjc1OTksIDI4MTQzLCAyODY4NywgMjkyNDcsCi0gICAgfQotfTsKLQotc3RhdGljIGNvbnN0IGVudW0gVHhmbVR5cGUgdnA5X2ludHJhX3R4Zm1fdHlwZVsxNF0gPSB7Ci0gICAgW1ZFUlRfUFJFRF0gICAgICAgICAgICA9IEFEU1RfRENULAotICAgIFtIT1JfUFJFRF0gICAgICAgICAgICAgPSBEQ1RfQURTVCwKLSAgICBbRENfUFJFRF0gICAgICAgICAgICAgID0gRENUX0RDVCwKLSAgICBbRElBR19ET1dOX0xFRlRfUFJFRF0gID0gRENUX0RDVCwKLSAgICBbRElBR19ET1dOX1JJR0hUX1BSRURdID0gQURTVF9BRFNULAotICAgIFtWRVJUX1JJR0hUX1BSRURdICAgICAgPSBBRFNUX0RDVCwKLSAgICBbSE9SX0RPV05fUFJFRF0gICAgICAgID0gRENUX0FEU1QsCi0gICAgW1ZFUlRfTEVGVF9QUkVEXSAgICAgICA9IEFEU1RfRENULAotICAgIFtIT1JfVVBfUFJFRF0gICAgICAgICAgPSBEQ1RfQURTVCwKLSAgICBbVE1fVlA4X1BSRURdICAgICAgICAgID0gQURTVF9BRFNULAotICAgIFtORUFSRVNUTVZdICAgICAgICAgICAgPSBEQ1RfRENULAotICAgIFtORUFSTVZdICAgICAgICAgICAgICAgPSBEQ1RfRENULAotICAgIFtaRVJPTVZdICAgICAgICAgICAgICAgPSBEQ1RfRENULAotICAgIFtORVdNVl0gICAgICAgICAgICAgICAgPSBEQ1RfRENULAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2RlZmF1bHRfc2Nhbl80eDRbMTZdID0gewotICAgICAwLCAgMSwgIDQsICA1LAotICAgICAyLCAgOCwgIDMsICA2LAotICAgIDEyLCAgOSwgIDcsIDEwLAotICAgIDEzLCAxMSwgMTQsIDE1LAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2NvbF9zY2FuXzR4NFsxNl0gPSB7Ci0gICAgIDAsICAxLCAgMiwgIDQsCi0gICAgIDMsICA1LCAgNiwgIDgsCi0gICAgIDcsICA5LCAxMCwgMTIsCi0gICAgMTMsIDExLCAxNCwgMTUsCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfcm93X3NjYW5fNHg0WzE2XSA9IHsKLSAgICAgMCwgIDQsICAxLCAgOCwKLSAgICAgNSwgMTIsICA5LCAgMiwKLSAgICAgNiwgMTMsICAzLCAxMCwKLSAgICAgNywgMTQsIDExLCAxNSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9kZWZhdWx0X3NjYW5fOHg4WzY0XSA9IHsKLSAgICAgMCwgIDEsICA4LCAgMiwgIDksIDE2LCAxMCwgIDMsCi0gICAgMTcsIDI0LCAxOCwgMTEsICA0LCAyNSwgMzIsIDE5LAotICAgIDEyLCAyNiwgIDUsIDMzLCAyMCwgMjcsIDQwLCAxMywKLSAgICAzNCwgIDYsIDQxLCAyOCwgMjEsIDM1LCA0MiwgNDgsCi0gICAgMTQsICA3LCAzNiwgMjksIDQzLCA1NiwgNDksIDIyLAotICAgIDE1LCAzNywgNTAsIDQ0LCA1NywgMzAsIDIzLCA1MSwKLSAgICA0NSwgNTgsIDM4LCAzMSwgNTIsIDU5LCAzOSwgNDYsCi0gICAgNTMsIDYwLCA0NywgNTQsIDYxLCA1NSwgNjIsIDYzLAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2NvbF9zY2FuXzh4OFs2NF0gPSB7Ci0gICAgIDAsICAxLCAgMiwgIDgsICAzLCAgOSwgIDQsIDEwLAotICAgIDE2LCAgNSwgMTEsIDE3LCAxMiwgMTgsICA2LCAyNCwKLSAgICAxOSwgMTMsIDI1LCAgNywgMjYsIDIwLCAzMiwgMTQsCi0gICAgMjcsIDIxLCAzMywgMjgsIDM0LCAxNSwgMjIsIDM1LAotICAgIDQwLCAyOSwgNDEsIDM2LCAyMywgMzAsIDQyLCAzNywKLSAgICA0OCwgNDMsIDMxLCA0NCwgNDksIDM4LCA1MCwgNTYsCi0gICAgNDUsIDM5LCA1MSwgNTcsIDUyLCA0NiwgNTgsIDUzLAotICAgIDU5LCA0NywgNjAsIDU0LCA2MSwgNTUsIDYyLCA2MywKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9yb3dfc2Nhbl84eDhbNjRdID0gewotICAgICAwLCAgOCwgMTYsICAxLCAgOSwgMjQsICAyLCAxNywKLSAgICAzMiwgMTAsIDI1LCAgMywgNDAsIDE4LCAxMSwgMzMsCi0gICAgMjYsIDE5LCAgNCwgNDgsIDQxLCAzNCwgMTIsIDI3LAotICAgIDU2LCAyMCwgIDUsIDQyLCAzNSwgMTMsIDQ5LCAyOCwKLSAgICAgNiwgMjEsIDQzLCAzNiwgMTQsIDUwLCAyOSwgNTcsCi0gICAgIDcsIDQ0LCAyMiwgMzcsIDUxLCAxNSwgNTgsIDMwLAotICAgIDIzLCA0NSwgNTIsIDM4LCA1OSwgMzEsIDQ2LCA1MywKLSAgICAzOSwgNjAsIDQ3LCA2MSwgNTQsIDYyLCA1NSwgNjMsCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfZGVmYXVsdF9zY2FuXzE2eDE2WzI1Nl0gPSB7Ci0gICAgICAwLCAgIDEsICAxNiwgICAyLCAgMTcsICAzMiwgICAzLCAgMTgsICAzMywgIDQ4LCAgIDQsICAzNCwgIDE5LCAgNDksICAyMCwgICA1LAotICAgICAzNSwgIDY0LCAgNTAsICAzNiwgIDY1LCAgMjEsICAgNiwgIDUxLCAgODAsICA2NiwgIDM3LCAgMjIsICA1MiwgICA3LCAgODEsICA2NywKLSAgICAgMzgsICA4MiwgIDUzLCAgMjMsICA5NiwgIDY4LCAgIDgsICA4MywgIDk3LCAgNTQsICAzOSwgIDY5LCAxMTIsICAyNCwgIDk4LCAgODQsCi0gICAgIDcwLCAgNTUsICAgOSwgIDQwLCAgODUsICA5OSwgMTEzLCAxMjgsICAyNSwgMTE0LCAxMDAsICA3MSwgIDg2LCAgNTYsICAxMCwgIDQxLAotICAgIDExNSwgMTAxLCAxMjksIDExNiwgIDcyLCAgODcsICAyNiwgMTMwLCAxNDQsIDEwMiwgIDU3LCAgMTEsICA0MiwgMTE3LCAxMzEsIDE0NSwKLSAgICAgODgsIDEwMywgIDI3LCAgNzMsIDEzMiwgMTE4LCAxNDYsICA1OCwgMTYwLCAgMTIsICA0MywgMTMzLCAxNDcsIDEwNCwgIDg5LCAxMTksCi0gICAgMTYxLCAgNzQsIDE0OCwgMTM0LCAgMjgsIDE2MiwgIDU5LCAgMTMsIDE3NiwgMTIwLCAxNDksICA5MCwgMTM1LCAxMDUsIDE2MywgIDQ0LAotICAgICA3NSwgMTc3LCAxNjQsICAyOSwgMTUwLCAxMjEsIDEzNiwgMTc4LCAxNjUsICAxNCwgMTA2LCAgNjAsICA5MSwgMTUxLCAgNDUsIDE3OSwKLSAgICAxOTIsIDEzNywgMTY2LCAxMjIsICA3NiwgMTgwLCAxNTIsICAzMCwgIDYxLCAgMTUsIDEwNywgMTY3LCAxODEsIDE5MywgIDkyLCAyMDgsCi0gICAgIDQ2LCAxMzgsIDEyMywgMTUzLCAxOTQsICA3NywgMTY4LCAxODIsICAzMSwgMTk1LCAyMDksIDE4MywgMTA4LCAxMzksICA2MiwgMTU0LAotICAgICA0NywgMTk2LCAgOTMsIDE2OSwgMjEwLCAxOTcsIDIyNCwgMTI0LCAxODQsIDIxMSwgIDc4LCAxMDksIDE3MCwgMTU1LCAgNjMsIDE5OCwKLSAgICAyMTIsIDE4NSwgMjI1LCAyNDAsIDE0MCwgIDk0LCAxOTksIDEyNSwgIDc5LCAyMTMsIDIyNiwgMTcxLCAxODYsIDE1NiwgMjE0LCAyMDAsCi0gICAgMTEwLCAyMjcsIDE0MSwgIDk1LCAyNDEsIDIxNSwgMjI4LCAyMDEsIDEyNiwgMjQyLCAxODcsIDE3MiwgMTU3LCAyMjksIDExMSwgMjE2LAotICAgIDI0MywgMTQyLCAyMDIsIDIzMCwgMTI3LCAyMTcsIDI0NCwgMTczLCAxODgsIDIzMSwgMTU4LCAyMDMsIDE0MywgMjQ1LCAyMTgsIDIzMiwKLSAgICAxODksIDI0NiwgMTU5LCAxNzQsIDIzMywgMjQ3LCAyMTksIDIwNCwgMTc1LCAxOTAsIDI0OCwgMjM0LCAyMDUsIDIyMCwgMjQ5LCAxOTEsCi0gICAgMjM1LCAyMjEsIDI1MCwgMjA2LCAyMjIsIDI1MSwgMjM2LCAyMDcsIDIzNywgMjIzLCAyNTIsIDIzOCwgMjUzLCAyMzksIDI1NCwgMjU1LAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2NvbF9zY2FuXzE2eDE2WzI1Nl0gPSB7Ci0gICAgICAwLCAgIDEsICAgMiwgICAzLCAgMTYsICAgNCwgIDE3LCAgIDUsICAxOCwgICA2LCAgMTksICAzMiwgIDIwLCAgIDcsICAzMywgIDIxLAotICAgICAzNCwgICA4LCAgMzUsICAyMiwgIDQ4LCAgMzYsICAgOSwgIDQ5LCAgMjMsICA1MCwgIDM3LCAgMTAsICAzOCwgIDUxLCAgMjQsICA2NCwKLSAgICAgNTIsICAxMSwgIDY1LCAgMzksICAyNSwgIDUzLCAgNjYsICA1NCwgIDQwLCAgNjcsICAxMiwgIDgwLCAgMjYsICA2OCwgIDU1LCAgODEsCi0gICAgIDQxLCAgNjksICAxMywgIDI3LCAgODIsICA1NiwgIDcwLCAgODMsICA0MiwgIDE0LCAgODQsICA5NiwgIDcxLCAgMjgsICA1NywgIDg1LAotICAgICA5NywgIDE1LCAgNzIsICA5OCwgIDQzLCAgODYsICA1OCwgIDk5LCAgMjksICA4NywgMTAwLCAxMTIsICA3MywgIDQ0LCAxMDEsICA1OSwKLSAgICAgMzAsIDExMywgIDg4LCAxMTQsICA3NCwgMTI4LCAxMDIsICA0NSwgIDMxLCAxMTUsICA2MCwgMTAzLCAgODksIDExNiwgIDc1LCAxMjksCi0gICAgMTE3LCAgNDYsIDEwNCwgIDkwLCAgNjEsIDEzMCwgMTE4LCAxMzEsIDEzMiwgMTA1LCAgNzYsICA0NywgMTE5LCAxNDQsICA5MSwgIDYyLAotICAgIDEzMywgMTA2LCAxNDUsIDEyMCwgMTQ2LCAxMzQsICA3NywgMTQ3LCAxMjEsICA5MiwgMTM1LCAxNDgsICA2MywgMTA3LCAxMzYsIDEyMiwKLSAgICAgOTMsIDE0OSwgMTYwLCAgNzgsIDE1MCwgMTM3LCAxMDgsIDE2MSwgMTYyLCAxNTEsIDEyMywgIDc5LCAxMzgsIDE2MywgMTUyLCAgOTQsCi0gICAgMTY0LCAxMDksIDE2NSwgMTUzLCAxMjQsIDEzOSwgMTc2LCAxNjYsICA5NSwgMTc3LCAxNjcsIDExMCwgMTU0LCAxNzgsIDEyNSwgMTc5LAotICAgIDE0MCwgMTY4LCAxNTUsIDExMSwgMTgwLCAxOTIsIDE4MSwgMTY5LCAxNDEsIDEyNiwgMTgyLCAxOTMsIDE5NCwgMTU2LCAxODMsIDE3MCwKLSAgICAxOTUsIDEyNywgMTQyLCAxOTYsIDE4NCwgMjA4LCAxOTcsIDE1NywgMTcxLCAxNDMsIDE4NSwgMTk4LCAyMDksIDE5OSwgMjEwLCAxNzIsCi0gICAgMTU4LCAxODYsIDIxMSwgMjI0LCAyMTIsIDIwMCwgMjQwLCAxNTksIDIxMywgMjI1LCAxODcsIDIwMSwgMTczLCAyMjYsIDIxNCwgMjE1LAotICAgIDIyNywgMjAyLCAyMjgsIDE4OCwgMjQxLCAyMTYsIDE3NCwgMjI5LCAyNDIsIDIwMywgMjQzLCAyMTcsIDIzMCwgMTc1LCAxODksIDI0NCwKLSAgICAyMzEsIDIwNCwgMjE4LCAyMzIsIDI0NSwgMjE5LCAyNDYsIDE5MCwgMjMzLCAyMDUsIDE5MSwgMjQ3LCAyMzQsIDI0OCwgMjIwLCAyMDYsCi0gICAgMjQ5LCAyMzUsIDIyMSwgMjA3LCAyNTAsIDIzNiwgMjIyLCAyNTEsIDIyMywgMjM3LCAyMzgsIDI1MiwgMjM5LCAyNTMsIDI1NCwgMjU1LAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X3Jvd19zY2FuXzE2eDE2WzI1Nl0gPSB7Ci0gICAgICAwLCAgMTYsICAzMiwgICAxLCAgNDgsICAxNywgIDY0LCAgMzMsICAgMiwgIDgwLCAgMTgsICA0OSwgIDk2LCAgMzQsICAgMywgIDY1LAotICAgICAxOSwgMTEyLCAgNTAsICA4MSwgIDM1LCAgIDQsIDEyOCwgIDY2LCAgMjAsICA5NywgIDUxLCAgODIsICAgNSwgMTQ0LCAgMzYsICA2NywKLSAgICAxMTMsICA5OCwgIDIxLCAgNTIsIDE2MCwgIDgzLCAxMjksICAzNywgIDY4LCAgIDYsIDExNCwgMTc2LCAgOTksICA1MywgIDIyLCAgODQsCi0gICAgMTQ1LCAgMzgsICA2OSwgMTMwLCAgIDcsIDExNSwgMTkyLCAxMDAsICA1NCwgIDIzLCAgODUsIDE2MSwgMTQ2LCAxMzEsICAzOSwgIDcwLAotICAgIDIwOCwgMTE2LCAgIDgsIDEwMSwgMTc3LCAgNTUsICA4NiwgIDI0LCAxNjIsIDE0NywgMTMyLCAgNzEsIDIyNCwgMTE3LCAgNDAsIDEwMiwKLSAgICAgIDksIDE0OCwgIDU2LCAgODcsIDE5MywgMTYzLCAyNDAsIDEzMywgMTc4LCAgMjUsIDExOCwgIDcyLCAgNDEsIDEwMywgMTY0LCAgMTAsCi0gICAgMTQ5LCAgODgsIDEzNCwgMjA5LCAxNzksICA1NywgMTE5LCAxOTQsICAyNiwgIDczLCAxNjUsIDE1MCwgMTA0LCAgNDIsIDEzNSwgIDExLAotICAgIDE4MCwgMTIwLCAgODksIDIyNSwgMTk1LCAgNTgsICAyNywgMjEwLCAxNTEsIDE4MSwgMTY2LCAgNzQsICA0MywgMTA1LCAgMTIsIDEzNiwKLSAgICAgOTAsICA1OSwgMjQxLCAxMjEsICAyOCwgMTk2LCAxNjcsIDIxMSwgMTUyLCAgNDQsIDE4MiwgMTM3LCAgNzUsICAxMywgMjI2LCAxMDYsCi0gICAgMTIyLCAgNjAsIDE5NywgIDkxLCAxNjgsICAyOSwgMTgzLCAxNTMsICAxNCwgIDc2LCAyMTIsIDEzOCwgIDQ1LCAxMDcsICAxNSwgMTk4LAotICAgICA5MiwgMjI3LCAxNjksICAzMCwgMTIzLCAxNTQsICA2MSwgMjQyLCAxODQsIDIxMywgMTM5LCAgNDYsICA3NywgIDMxLCAxMDgsIDE3MCwKLSAgICAxOTksIDE4NSwgMTI0LCAyMjgsICA5MywgMTU1LCAyMTQsICA2MiwgMTQwLCAyNDMsICA3OCwgIDQ3LCAyMDAsIDEwOSwgMTg2LCAxNzEsCi0gICAgMjAxLCAgOTQsICA2MywgMjE1LCAyMjksIDE1NiwgIDc5LCAxMjUsIDE0MSwgMTEwLCAyMTYsIDE4NywgMTcyLCAyNDQsIDIwMiwgMjMwLAotICAgIDIxNywgIDk1LCAxNTcsIDEyNiwgMjQ1LCAxMTEsIDE0MiwgMjMxLCAxODgsIDEyNywgMTU4LCAyMTgsIDE3MywgMjMyLCAyNDYsIDIzMywKLSAgICAyMDMsIDE0MywgMjQ3LCAxNzQsIDE4OSwgMTU5LCAyMTksIDIwNCwgMjQ4LCAyMzQsIDI0OSwgMTc1LCAxOTAsIDIyMCwgMjA1LCAyNTAsCi0gICAgMjM1LCAxOTEsIDIyMSwgMjUxLCAyMzYsIDIwNiwgMjUyLCAyMjIsIDIwNywgMjM3LCAyMjMsIDI1MywgMjM4LCAyNTQsIDIzOSwgMjU1LAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMlsxMDI0XSA9IHsKLSAgICAgICAwLCAgICAxLCAgIDMyLCAgICAyLCAgIDMzLCAgIDY0LCAgICAzLCAgIDM0LCAgIDY1LCAgICA0LCAgIDk2LCAgIDM1LCAgIDY2LCAgICA1LCAgIDM2LCAgIDk3LCAgIDY3LCAgMTI4LCAgIDk4LCAgIDY4LCAgIDM3LCAgICA2LCAgMTI5LCAgIDk5LCAgICA3LCAgMTYwLCAgIDY5LCAgIDM4LCAgMTMwLCAgMTAwLCAgMTYxLCAgMTMxLAotICAgICAgMzksICAgNzAsICAgIDgsICAxMDEsICAxNjIsICAxMzIsICAxOTIsICAgNzEsICAgNDAsICAgIDksICAxMDIsICAxNjMsICAxMzMsICAxOTMsICAgNzIsICAyMjQsICAxMDMsICAgNDEsICAxNjQsICAgMTAsICAxOTQsICAxMzQsICAxNjUsICAgNzMsICAxMDQsICAxMzUsICAyMjUsICAgNDIsICAxOTUsICAgMTEsICAyNTYsICAxNjYsCi0gICAgIDIyNiwgIDE5NiwgICA3NCwgIDEwNSwgIDEzNiwgICA0MywgICAxMiwgIDE2NywgIDE5NywgIDIyNywgIDI1NywgICA3NSwgIDEwNiwgIDEzNywgIDIyOCwgICA0NCwgIDE5OCwgIDE2OCwgIDI1OCwgIDI4OCwgICAxMywgIDIyOSwgICA3NiwgIDEwNywgIDE5OSwgIDEzOCwgIDI1OSwgIDE2OSwgIDI4OSwgICA0NSwgIDIzMCwgIDI2MCwKLSAgICAgMjAwLCAgMTA4LCAgIDE0LCAgMTcwLCAgMTM5LCAgMzIwLCAgMjkwLCAgIDc3LCAgMjMxLCAgMjYxLCAgIDQ2LCAgMjAxLCAgMTQwLCAgMjkxLCAgMTA5LCAgMjMyLCAgMzIxLCAgMjYyLCAgMTcxLCAgIDc4LCAgMjkyLCAgIDE1LCAgMzIyLCAgMjAyLCAgMjYzLCAgMzUyLCAgMTcyLCAgMjkzLCAgMjMzLCAgMTQxLCAgMzIzLCAgMTEwLAotICAgICAgNDcsICAyMDMsICAyNjQsICAyMzQsICAyOTQsICAzNTMsICAzMjQsICAgMTYsICAgNzksICAyMDQsICAyNjUsICAyOTUsICAzMjUsICAxNzMsICAzNTQsICAxNDIsICAyMzUsICAzODQsICAgNDgsICAyOTYsICAxMTEsICAyNjYsICAzNTUsICAzMjYsICAgODAsICAgMTcsICAyMDUsICAyMzYsICAxNzQsICAzNTYsICAzODUsICAzMjcsCi0gICAgIDE0MywgIDI5NywgIDI2NywgIDM1NywgIDM4NiwgIDExMiwgICA0OSwgIDMyOCwgIDI5OCwgIDIwNiwgIDQxNiwgIDIzNywgIDM1OCwgIDM4NywgICA4MSwgIDE3NSwgICAxOCwgIDMyOSwgIDM1OSwgIDM4OCwgIDI5OSwgIDMzMCwgIDM4OSwgIDExMywgIDQxNywgIDIzOCwgIDM2MCwgICA1MCwgIDIwNywgIDQxOCwgIDM5MCwgIDMzMSwKLSAgICAgIDE5LCAgNDQ4LCAgMzYxLCAgIDgyLCAgNDE5LCAgMzkxLCAgMjM5LCAgIDUxLCAgMzYyLCAgNDIwLCAgMTE0LCAgNDQ5LCAgNDgwLCAgNDIxLCAgIDgzLCAgMzYzLCAgNDUwLCAgNDIyLCAgNTEyLCAgNDUxLCAgNDIzLCAgMTE1LCAgNDUyLCAgNDgxLCAgNDUzLCAgNDgyLCAgNDU0LCAgNTQ0LCAgNDgzLCAgNDU1LCAgNTEzLCAgNDg0LAotICAgICA1MTQsICA0ODUsICA1MTUsICA0ODYsICA1NDUsICA1NzYsICA0ODcsICA1NDYsICA1NDcsICA2MDgsICA1NzcsICA1NzgsICA1NzksICA2MDksICA2MTAsICA2MTEsICAgMjAsICAxNDQsICAyNjgsICAzOTIsICA1MTYsICA2NDAsICAgMjEsICAgNTIsICAxNDUsICAxNzYsICAyNjksICAzMDAsICAzOTMsICA0MjQsICA1MTcsICA1NDgsCi0gICAgIDY0MSwgIDY3MiwgICAyMiwgICA1MywgICA4NCwgIDE0NiwgIDE3NywgIDIwOCwgIDI3MCwgIDMwMSwgIDMzMiwgIDM5NCwgIDQyNSwgIDQ1NiwgIDUxOCwgIDU0OSwgIDU4MCwgIDY0MiwgIDY3MywgIDcwNCwgICAyMywgICA1NCwgICA4NSwgIDExNiwgIDE0NywgIDE3OCwgIDIwOSwgIDI0MCwgIDI3MSwgIDMwMiwgIDMzMywgIDM2NCwKLSAgICAgMzk1LCAgNDI2LCAgNDU3LCAgNDg4LCAgNTE5LCAgNTUwLCAgNTgxLCAgNjEyLCAgNjQzLCAgNjc0LCAgNzA1LCAgNzM2LCAgIDU1LCAgIDg2LCAgMTE3LCAgMTc5LCAgMjEwLCAgMjQxLCAgMzAzLCAgMzM0LCAgMzY1LCAgNDI3LCAgNDU4LCAgNDg5LCAgNTUxLCAgNTgyLCAgNjEzLCAgNjc1LCAgNzA2LCAgNzM3LCAgIDg3LCAgMTE4LAotICAgICAyMTEsICAyNDIsICAzMzUsICAzNjYsICA0NTksICA0OTAsICA1ODMsICA2MTQsICA3MDcsICA3MzgsICAxMTksICAyNDMsICAzNjcsICA0OTEsICA2MTUsICA3MzksICAgMjQsICAxNDgsICAyNzIsICAzOTYsICA1MjAsICA2NDQsICA3NjgsICAgMjUsICAgNTYsICAxNDksICAxODAsICAyNzMsICAzMDQsICAzOTcsICA0MjgsICA1MjEsCi0gICAgIDU1MiwgIDY0NSwgIDY3NiwgIDc2OSwgIDgwMCwgICAyNiwgICA1NywgICA4OCwgIDE1MCwgIDE4MSwgIDIxMiwgIDI3NCwgIDMwNSwgIDMzNiwgIDM5OCwgIDQyOSwgIDQ2MCwgIDUyMiwgIDU1MywgIDU4NCwgIDY0NiwgIDY3NywgIDcwOCwgIDc3MCwgIDgwMSwgIDgzMiwgICAyNywgICA1OCwgICA4OSwgIDEyMCwgIDE1MSwgIDE4MiwKLSAgICAgMjEzLCAgMjQ0LCAgMjc1LCAgMzA2LCAgMzM3LCAgMzY4LCAgMzk5LCAgNDMwLCAgNDYxLCAgNDkyLCAgNTIzLCAgNTU0LCAgNTg1LCAgNjE2LCAgNjQ3LCAgNjc4LCAgNzA5LCAgNzQwLCAgNzcxLCAgODAyLCAgODMzLCAgODY0LCAgIDU5LCAgIDkwLCAgMTIxLCAgMTgzLCAgMjE0LCAgMjQ1LCAgMzA3LCAgMzM4LCAgMzY5LCAgNDMxLAotICAgICA0NjIsICA0OTMsICA1NTUsICA1ODYsICA2MTcsICA2NzksICA3MTAsICA3NDEsICA4MDMsICA4MzQsICA4NjUsICAgOTEsICAxMjIsICAyMTUsICAyNDYsICAzMzksICAzNzAsICA0NjMsICA0OTQsICA1ODcsICA2MTgsICA3MTEsICA3NDIsICA4MzUsICA4NjYsICAxMjMsICAyNDcsICAzNzEsICA0OTUsICA2MTksICA3NDMsICA4NjcsCi0gICAgICAyOCwgIDE1MiwgIDI3NiwgIDQwMCwgIDUyNCwgIDY0OCwgIDc3MiwgIDg5NiwgICAyOSwgICA2MCwgIDE1MywgIDE4NCwgIDI3NywgIDMwOCwgIDQwMSwgIDQzMiwgIDUyNSwgIDU1NiwgIDY0OSwgIDY4MCwgIDc3MywgIDgwNCwgIDg5NywgIDkyOCwgICAzMCwgICA2MSwgICA5MiwgIDE1NCwgIDE4NSwgIDIxNiwgIDI3OCwgIDMwOSwKLSAgICAgMzQwLCAgNDAyLCAgNDMzLCAgNDY0LCAgNTI2LCAgNTU3LCAgNTg4LCAgNjUwLCAgNjgxLCAgNzEyLCAgNzc0LCAgODA1LCAgODM2LCAgODk4LCAgOTI5LCAgOTYwLCAgIDMxLCAgIDYyLCAgIDkzLCAgMTI0LCAgMTU1LCAgMTg2LCAgMjE3LCAgMjQ4LCAgMjc5LCAgMzEwLCAgMzQxLCAgMzcyLCAgNDAzLCAgNDM0LCAgNDY1LCAgNDk2LAotICAgICA1MjcsICA1NTgsICA1ODksICA2MjAsICA2NTEsICA2ODIsICA3MTMsICA3NDQsICA3NzUsICA4MDYsICA4MzcsICA4NjgsICA4OTksICA5MzAsICA5NjEsICA5OTIsICAgNjMsICAgOTQsICAxMjUsICAxODcsICAyMTgsICAyNDksICAzMTEsICAzNDIsICAzNzMsICA0MzUsICA0NjYsICA0OTcsICA1NTksICA1OTAsICA2MjEsICA2ODMsCi0gICAgIDcxNCwgIDc0NSwgIDgwNywgIDgzOCwgIDg2OSwgIDkzMSwgIDk2MiwgIDk5MywgICA5NSwgIDEyNiwgIDIxOSwgIDI1MCwgIDM0MywgIDM3NCwgIDQ2NywgIDQ5OCwgIDU5MSwgIDYyMiwgIDcxNSwgIDc0NiwgIDgzOSwgIDg3MCwgIDk2MywgIDk5NCwgIDEyNywgIDI1MSwgIDM3NSwgIDQ5OSwgIDYyMywgIDc0NywgIDg3MSwgIDk5NSwKLSAgICAgMTU2LCAgMjgwLCAgNDA0LCAgNTI4LCAgNjUyLCAgNzc2LCAgOTAwLCAgMTU3LCAgMTg4LCAgMjgxLCAgMzEyLCAgNDA1LCAgNDM2LCAgNTI5LCAgNTYwLCAgNjUzLCAgNjg0LCAgNzc3LCAgODA4LCAgOTAxLCAgOTMyLCAgMTU4LCAgMTg5LCAgMjIwLCAgMjgyLCAgMzEzLCAgMzQ0LCAgNDA2LCAgNDM3LCAgNDY4LCAgNTMwLCAgNTYxLAotICAgICA1OTIsICA2NTQsICA2ODUsICA3MTYsICA3NzgsICA4MDksICA4NDAsICA5MDIsICA5MzMsICA5NjQsICAxNTksICAxOTAsICAyMjEsICAyNTIsICAyODMsICAzMTQsICAzNDUsICAzNzYsICA0MDcsICA0MzgsICA0NjksICA1MDAsICA1MzEsICA1NjIsICA1OTMsICA2MjQsICA2NTUsICA2ODYsICA3MTcsICA3NDgsICA3NzksICA4MTAsCi0gICAgIDg0MSwgIDg3MiwgIDkwMywgIDkzNCwgIDk2NSwgIDk5NiwgIDE5MSwgIDIyMiwgIDI1MywgIDMxNSwgIDM0NiwgIDM3NywgIDQzOSwgIDQ3MCwgIDUwMSwgIDU2MywgIDU5NCwgIDYyNSwgIDY4NywgIDcxOCwgIDc0OSwgIDgxMSwgIDg0MiwgIDg3MywgIDkzNSwgIDk2NiwgIDk5NywgIDIyMywgIDI1NCwgIDM0NywgIDM3OCwgIDQ3MSwKLSAgICAgNTAyLCAgNTk1LCAgNjI2LCAgNzE5LCAgNzUwLCAgODQzLCAgODc0LCAgOTY3LCAgOTk4LCAgMjU1LCAgMzc5LCAgNTAzLCAgNjI3LCAgNzUxLCAgODc1LCAgOTk5LCAgMjg0LCAgNDA4LCAgNTMyLCAgNjU2LCAgNzgwLCAgOTA0LCAgMjg1LCAgMzE2LCAgNDA5LCAgNDQwLCAgNTMzLCAgNTY0LCAgNjU3LCAgNjg4LCAgNzgxLCAgODEyLAotICAgICA5MDUsICA5MzYsICAyODYsICAzMTcsICAzNDgsICA0MTAsICA0NDEsICA0NzIsICA1MzQsICA1NjUsICA1OTYsICA2NTgsICA2ODksICA3MjAsICA3ODIsICA4MTMsICA4NDQsICA5MDYsICA5MzcsICA5NjgsICAyODcsICAzMTgsICAzNDksICAzODAsICA0MTEsICA0NDIsICA0NzMsICA1MDQsICA1MzUsICA1NjYsICA1OTcsICA2MjgsCi0gICAgIDY1OSwgIDY5MCwgIDcyMSwgIDc1MiwgIDc4MywgIDgxNCwgIDg0NSwgIDg3NiwgIDkwNywgIDkzOCwgIDk2OSwgMTAwMCwgIDMxOSwgIDM1MCwgIDM4MSwgIDQ0MywgIDQ3NCwgIDUwNSwgIDU2NywgIDU5OCwgIDYyOSwgIDY5MSwgIDcyMiwgIDc1MywgIDgxNSwgIDg0NiwgIDg3NywgIDkzOSwgIDk3MCwgMTAwMSwgIDM1MSwgIDM4MiwKLSAgICAgNDc1LCAgNTA2LCAgNTk5LCAgNjMwLCAgNzIzLCAgNzU0LCAgODQ3LCAgODc4LCAgOTcxLCAxMDAyLCAgMzgzLCAgNTA3LCAgNjMxLCAgNzU1LCAgODc5LCAxMDAzLCAgNDEyLCAgNTM2LCAgNjYwLCAgNzg0LCAgOTA4LCAgNDEzLCAgNDQ0LCAgNTM3LCAgNTY4LCAgNjYxLCAgNjkyLCAgNzg1LCAgODE2LCAgOTA5LCAgOTQwLCAgNDE0LAotICAgICA0NDUsICA0NzYsICA1MzgsICA1NjksICA2MDAsICA2NjIsICA2OTMsICA3MjQsICA3ODYsICA4MTcsICA4NDgsICA5MTAsICA5NDEsICA5NzIsICA0MTUsICA0NDYsICA0NzcsICA1MDgsICA1MzksICA1NzAsICA2MDEsICA2MzIsICA2NjMsICA2OTQsICA3MjUsICA3NTYsICA3ODcsICA4MTgsICA4NDksICA4ODAsICA5MTEsICA5NDIsCi0gICAgIDk3MywgMTAwNCwgIDQ0NywgIDQ3OCwgIDUwOSwgIDU3MSwgIDYwMiwgIDYzMywgIDY5NSwgIDcyNiwgIDc1NywgIDgxOSwgIDg1MCwgIDg4MSwgIDk0MywgIDk3NCwgMTAwNSwgIDQ3OSwgIDUxMCwgIDYwMywgIDYzNCwgIDcyNywgIDc1OCwgIDg1MSwgIDg4MiwgIDk3NSwgMTAwNiwgIDUxMSwgIDYzNSwgIDc1OSwgIDg4MywgMTAwNywKLSAgICAgNTQwLCAgNjY0LCAgNzg4LCAgOTEyLCAgNTQxLCAgNTcyLCAgNjY1LCAgNjk2LCAgNzg5LCAgODIwLCAgOTEzLCAgOTQ0LCAgNTQyLCAgNTczLCAgNjA0LCAgNjY2LCAgNjk3LCAgNzI4LCAgNzkwLCAgODIxLCAgODUyLCAgOTE0LCAgOTQ1LCAgOTc2LCAgNTQzLCAgNTc0LCAgNjA1LCAgNjM2LCAgNjY3LCAgNjk4LCAgNzI5LCAgNzYwLAotICAgICA3OTEsICA4MjIsICA4NTMsICA4ODQsICA5MTUsICA5NDYsICA5NzcsIDEwMDgsICA1NzUsICA2MDYsICA2MzcsICA2OTksICA3MzAsICA3NjEsICA4MjMsICA4NTQsICA4ODUsICA5NDcsICA5NzgsIDEwMDksICA2MDcsICA2MzgsICA3MzEsICA3NjIsICA4NTUsICA4ODYsICA5NzksIDEwMTAsICA2MzksICA3NjMsICA4ODcsIDEwMTEsCi0gICAgIDY2OCwgIDc5MiwgIDkxNiwgIDY2OSwgIDcwMCwgIDc5MywgIDgyNCwgIDkxNywgIDk0OCwgIDY3MCwgIDcwMSwgIDczMiwgIDc5NCwgIDgyNSwgIDg1NiwgIDkxOCwgIDk0OSwgIDk4MCwgIDY3MSwgIDcwMiwgIDczMywgIDc2NCwgIDc5NSwgIDgyNiwgIDg1NywgIDg4OCwgIDkxOSwgIDk1MCwgIDk4MSwgMTAxMiwgIDcwMywgIDczNCwKLSAgICAgNzY1LCAgODI3LCAgODU4LCAgODg5LCAgOTUxLCAgOTgyLCAxMDEzLCAgNzM1LCAgNzY2LCAgODU5LCAgODkwLCAgOTgzLCAxMDE0LCAgNzY3LCAgODkxLCAxMDE1LCAgNzk2LCAgOTIwLCAgNzk3LCAgODI4LCAgOTIxLCAgOTUyLCAgNzk4LCAgODI5LCAgODYwLCAgOTIyLCAgOTUzLCAgOTg0LCAgNzk5LCAgODMwLCAgODYxLCAgODkyLAotICAgICA5MjMsICA5NTQsICA5ODUsIDEwMTYsICA4MzEsICA4NjIsICA4OTMsICA5NTUsICA5ODYsIDEwMTcsICA4NjMsICA4OTQsICA5ODcsIDEwMTgsICA4OTUsIDEwMTksICA5MjQsICA5MjUsICA5NTYsICA5MjYsICA5NTcsICA5ODgsICA5MjcsICA5NTgsICA5ODksIDEwMjAsICA5NTksICA5OTAsIDEwMjEsICA5OTEsIDEwMjIsIDEwMjMsCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCAqIGNvbnN0IHZwOV9zY2Fuc1s1XVs0XSA9IHsKLSAgICB7Ci0gICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fNHg0LCB2cDlfY29sX3NjYW5fNHg0LAotICAgICAgICB2cDlfcm93X3NjYW5fNHg0LCB2cDlfZGVmYXVsdF9zY2FuXzR4NAotICAgIH0sIHsKLSAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl84eDgsIHZwOV9jb2xfc2Nhbl84eDgsCi0gICAgICAgIHZwOV9yb3dfc2Nhbl84eDgsIHZwOV9kZWZhdWx0X3NjYW5fOHg4Ci0gICAgfSwgewotICAgICAgICB2cDlfZGVmYXVsdF9zY2FuXzE2eDE2LCB2cDlfY29sX3NjYW5fMTZ4MTYsCi0gICAgICAgIHZwOV9yb3dfc2Nhbl8xNngxNiwgdnA5X2RlZmF1bHRfc2Nhbl8xNngxNgotICAgIH0sIHsKLSAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMiwgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMiwKLSAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMiwgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMgotICAgIH0sIHsgLy8gbG9zc2xlc3MKLSAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl80eDQsIHZwOV9kZWZhdWx0X3NjYW5fNHg0LAotICAgICAgICB2cDlfZGVmYXVsdF9zY2FuXzR4NCwgdnA5X2RlZmF1bHRfc2Nhbl80eDQKLSAgICB9Ci19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfZGVmYXVsdF9zY2FuXzR4NF9uYlsxNl1bMl0gPSB7Ci0gICAgeyAgMCwgIDAgfSwgeyAgMCwgIDAgfSwgeyAgNCwgIDEgfSwgeyAgMSwgIDEgfSwKLSAgICB7ICA0LCAgNCB9LCB7ICAyLCAgMiB9LCB7ICA1LCAgMiB9LCB7ICA4LCAgOCB9LAotICAgIHsgIDgsICA1IH0sIHsgIDYsICAzIH0sIHsgIDksICA2IH0sIHsgMTIsICA5IH0sCi0gICAgeyAxMCwgIDcgfSwgeyAxMywgMTAgfSwgeyAxNCwgMTEgfSwgeyAgMCwgIDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9jb2xfc2Nhbl80eDRfbmJbMTZdWzJdID0gewotICAgIHsgIDAsICAwIH0sIHsgIDEsICAxIH0sIHsgIDAsICAwIH0sIHsgIDIsICAyIH0sCi0gICAgeyAgNCwgIDQgfSwgeyAgNSwgIDUgfSwgeyAgNCwgIDQgfSwgeyAgNiwgIDYgfSwKLSAgICB7ICA4LCAgOCB9LCB7ICA5LCAgOSB9LCB7ICA4LCAgOCB9LCB7IDEyLCAxMiB9LAotICAgIHsgMTAsIDEwIH0sIHsgMTMsIDEzIH0sIHsgMTQsIDE0IH0sIHsgIDAsICAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfcm93X3NjYW5fNHg0X25iWzE2XVsyXSA9IHsKLSAgICB7ICAwLCAgMCB9LCB7ICAwLCAgMCB9LCB7ICA0LCAgNCB9LCB7ICAxLCAgMSB9LAotICAgIHsgIDgsICA4IH0sIHsgIDUsICA1IH0sIHsgIDEsICAxIH0sIHsgIDIsICAyIH0sCi0gICAgeyAgOSwgIDkgfSwgeyAgMiwgIDIgfSwgeyAgNiwgIDYgfSwgeyAgMywgIDMgfSwKLSAgICB7IDEwLCAxMCB9LCB7ICA3LCAgNyB9LCB7IDExLCAxMSB9LCB7ICAwLCAgMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X2RlZmF1bHRfc2Nhbl84eDhfbmJbNjRdWzJdID0gewotICAgIHsgIDAsICAwIH0sIHsgIDAsICAwIH0sIHsgIDEsICAxIH0sIHsgIDgsICAxIH0sCi0gICAgeyAgOCwgIDggfSwgeyAgOSwgIDIgfSwgeyAgMiwgIDIgfSwgeyAxNiwgIDkgfSwKLSAgICB7IDE2LCAxNiB9LCB7IDE3LCAxMCB9LCB7IDEwLCAgMyB9LCB7ICAzLCAgMyB9LAotICAgIHsgMjQsIDE3IH0sIHsgMjQsIDI0IH0sIHsgMTgsIDExIH0sIHsgMTEsICA0IH0sCi0gICAgeyAyNSwgMTggfSwgeyAgNCwgIDQgfSwgeyAzMiwgMjUgfSwgeyAxOSwgMTIgfSwKLSAgICB7IDI2LCAxOSB9LCB7IDMyLCAzMiB9LCB7IDEyLCAgNSB9LCB7IDMzLCAyNiB9LAotICAgIHsgIDUsICA1IH0sIHsgNDAsIDMzIH0sIHsgMjcsIDIwIH0sIHsgMjAsIDEzIH0sCi0gICAgeyAzNCwgMjcgfSwgeyA0MSwgMzQgfSwgeyA0MCwgNDAgfSwgeyAxMywgIDYgfSwKLSAgICB7ICA2LCAgNiB9LCB7IDM1LCAyOCB9LCB7IDI4LCAyMSB9LCB7IDQyLCAzNSB9LAotICAgIHsgNDgsIDQ4IH0sIHsgNDgsIDQxIH0sIHsgMjEsIDE0IH0sIHsgMTQsICA3IH0sCi0gICAgeyAzNiwgMjkgfSwgeyA0OSwgNDIgfSwgeyA0MywgMzYgfSwgeyA1NiwgNDkgfSwKLSAgICB7IDI5LCAyMiB9LCB7IDIyLCAxNSB9LCB7IDUwLCA0MyB9LCB7IDQ0LCAzNyB9LAotICAgIHsgNTcsIDUwIH0sIHsgMzcsIDMwIH0sIHsgMzAsIDIzIH0sIHsgNTEsIDQ0IH0sCi0gICAgeyA1OCwgNTEgfSwgeyAzOCwgMzEgfSwgeyA0NSwgMzggfSwgeyA1MiwgNDUgfSwKLSAgICB7IDU5LCA1MiB9LCB7IDQ2LCAzOSB9LCB7IDUzLCA0NiB9LCB7IDYwLCA1MyB9LAotICAgIHsgNTQsIDQ3IH0sIHsgNjEsIDU0IH0sIHsgNjIsIDU1IH0sIHsgIDAsICAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfY29sX3NjYW5fOHg4X25iWzY0XVsyXSA9IHsKLSAgICB7ICAwLCAgMCB9LCB7ICAxLCAgMSB9LCB7ICAwLCAgMCB9LCB7ICAyLCAgMiB9LAotICAgIHsgIDgsICA4IH0sIHsgIDMsICAzIH0sIHsgIDksICA5IH0sIHsgIDgsICA4IH0sCi0gICAgeyAgNCwgIDQgfSwgeyAxMCwgMTAgfSwgeyAxNiwgMTYgfSwgeyAxMSwgMTEgfSwKLSAgICB7IDE3LCAxNyB9LCB7ICA1LCAgNSB9LCB7IDE2LCAxNiB9LCB7IDE4LCAxOCB9LAotICAgIHsgMTIsIDEyIH0sIHsgMjQsIDI0IH0sIHsgIDYsICA2IH0sIHsgMjUsIDI1IH0sCi0gICAgeyAxOSwgMTkgfSwgeyAyNCwgMjQgfSwgeyAxMywgMTMgfSwgeyAyNiwgMjYgfSwKLSAgICB7IDIwLCAyMCB9LCB7IDMyLCAzMiB9LCB7IDI3LCAyNyB9LCB7IDMzLCAzMyB9LAotICAgIHsgMTQsIDE0IH0sIHsgMjEsIDIxIH0sIHsgMzQsIDM0IH0sIHsgMzIsIDMyIH0sCi0gICAgeyAyOCwgMjggfSwgeyA0MCwgNDAgfSwgeyAzNSwgMzUgfSwgeyAyMiwgMjIgfSwKLSAgICB7IDI5LCAyOSB9LCB7IDQxLCA0MSB9LCB7IDM2LCAzNiB9LCB7IDQwLCA0MCB9LAotICAgIHsgNDIsIDQyIH0sIHsgMzAsIDMwIH0sIHsgNDMsIDQzIH0sIHsgNDgsIDQ4IH0sCi0gICAgeyAzNywgMzcgfSwgeyA0OSwgNDkgfSwgeyA0OCwgNDggfSwgeyA0NCwgNDQgfSwKLSAgICB7IDM4LCAzOCB9LCB7IDUwLCA1MCB9LCB7IDU2LCA1NiB9LCB7IDUxLCA1MSB9LAotICAgIHsgNDUsIDQ1IH0sIHsgNTcsIDU3IH0sIHsgNTIsIDUyIH0sIHsgNTgsIDU4IH0sCi0gICAgeyA0NiwgNDYgfSwgeyA1OSwgNTkgfSwgeyA1MywgNTMgfSwgeyA2MCwgNjAgfSwKLSAgICB7IDU0LCA1NCB9LCB7IDYxLCA2MSB9LCB7IDYyLCA2MiB9LCB7ICAwLCAgMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgdnA5X3Jvd19zY2FuXzh4OF9uYls2NF1bMl0gPSB7Ci0gICAgeyAgMCwgIDAgfSwgeyAgOCwgIDggfSwgeyAgMCwgIDAgfSwgeyAgMSwgIDEgfSwKLSAgICB7IDE2LCAxNiB9LCB7ICAxLCAgMSB9LCB7ICA5LCAgOSB9LCB7IDI0LCAyNCB9LAotICAgIHsgIDIsICAyIH0sIHsgMTcsIDE3IH0sIHsgIDIsICAyIH0sIHsgMzIsIDMyIH0sCi0gICAgeyAxMCwgMTAgfSwgeyAgMywgIDMgfSwgeyAyNSwgMjUgfSwgeyAxOCwgMTggfSwKLSAgICB7IDExLCAxMSB9LCB7ICAzLCAgMyB9LCB7IDQwLCA0MCB9LCB7IDMzLCAzMyB9LAotICAgIHsgMjYsIDI2IH0sIHsgIDQsICA0IH0sIHsgMTksIDE5IH0sIHsgNDgsIDQ4IH0sCi0gICAgeyAxMiwgMTIgfSwgeyAgNCwgIDQgfSwgeyAzNCwgMzQgfSwgeyAyNywgMjcgfSwKLSAgICB7ICA1LCAgNSB9LCB7IDQxLCA0MSB9LCB7IDIwLCAyMCB9LCB7ICA1LCAgNSB9LAotICAgIHsgMTMsIDEzIH0sIHsgMzUsIDM1IH0sIHsgMjgsIDI4IH0sIHsgIDYsICA2IH0sCi0gICAgeyA0MiwgNDIgfSwgeyAyMSwgMjEgfSwgeyA0OSwgNDkgfSwgeyAgNiwgIDYgfSwKLSAgICB7IDM2LCAzNiB9LCB7IDE0LCAxNCB9LCB7IDI5LCAyOSB9LCB7IDQzLCA0MyB9LAotICAgIHsgIDcsICA3IH0sIHsgNTAsIDUwIH0sIHsgMjIsIDIyIH0sIHsgMTUsIDE1IH0sCi0gICAgeyAzNywgMzcgfSwgeyA0NCwgNDQgfSwgeyAzMCwgMzAgfSwgeyA1MSwgNTEgfSwKLSAgICB7IDIzLCAyMyB9LCB7IDM4LCAzOCB9LCB7IDQ1LCA0NSB9LCB7IDMxLCAzMSB9LAotICAgIHsgNTIsIDUyIH0sIHsgMzksIDM5IH0sIHsgNTMsIDUzIH0sIHsgNDYsIDQ2IH0sCi0gICAgeyA1NCwgNTQgfSwgeyA0NywgNDcgfSwgeyA1NSwgNTUgfSwgeyAgMCwgIDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9kZWZhdWx0X3NjYW5fMTZ4MTZfbmJbMjU2XVsyXSA9IHsKLSAgICB7ICAgMCwgICAwIH0sIHsgICAwLCAgIDAgfSwgeyAgIDEsICAgMSB9LCB7ICAxNiwgICAxIH0sCi0gICAgeyAgMTYsICAxNiB9LCB7ICAgMiwgICAyIH0sIHsgIDE3LCAgIDIgfSwgeyAgMzIsICAxNyB9LAotICAgIHsgIDMyLCAgMzIgfSwgeyAgIDMsICAgMyB9LCB7ICAzMywgIDE4IH0sIHsgIDE4LCAgIDMgfSwKLSAgICB7ICA0OCwgIDMzIH0sIHsgIDE5LCAgIDQgfSwgeyAgIDQsICAgNCB9LCB7ICAzNCwgIDE5IH0sCi0gICAgeyAgNDgsICA0OCB9LCB7ICA0OSwgIDM0IH0sIHsgIDM1LCAgMjAgfSwgeyAgNjQsICA0OSB9LAotICAgIHsgIDIwLCAgIDUgfSwgeyAgIDUsICAgNSB9LCB7ICA1MCwgIDM1IH0sIHsgIDY0LCAgNjQgfSwKLSAgICB7ICA2NSwgIDUwIH0sIHsgIDM2LCAgMjEgfSwgeyAgMjEsICAgNiB9LCB7ICA1MSwgIDM2IH0sCi0gICAgeyAgIDYsICAgNiB9LCB7ICA4MCwgIDY1IH0sIHsgIDY2LCAgNTEgfSwgeyAgMzcsICAyMiB9LAotICAgIHsgIDgxLCAgNjYgfSwgeyAgNTIsICAzNyB9LCB7ICAyMiwgICA3IH0sIHsgIDgwLCAgODAgfSwKLSAgICB7ICA2NywgIDUyIH0sIHsgICA3LCAgIDcgfSwgeyAgODIsICA2NyB9LCB7ICA5NiwgIDgxIH0sCi0gICAgeyAgNTMsICAzOCB9LCB7ICAzOCwgIDIzIH0sIHsgIDY4LCAgNTMgfSwgeyAgOTYsICA5NiB9LAotICAgIHsgIDIzLCAgIDggfSwgeyAgOTcsICA4MiB9LCB7ICA4MywgIDY4IH0sIHsgIDY5LCAgNTQgfSwKLSAgICB7ICA1NCwgIDM5IH0sIHsgICA4LCAgIDggfSwgeyAgMzksICAyNCB9LCB7ICA4NCwgIDY5IH0sCi0gICAgeyAgOTgsICA4MyB9LCB7IDExMiwgIDk3IH0sIHsgMTEyLCAxMTIgfSwgeyAgMjQsICAgOSB9LAotICAgIHsgMTEzLCAgOTggfSwgeyAgOTksICA4NCB9LCB7ICA3MCwgIDU1IH0sIHsgIDg1LCAgNzAgfSwKLSAgICB7ICA1NSwgIDQwIH0sIHsgICA5LCAgIDkgfSwgeyAgNDAsICAyNSB9LCB7IDExNCwgIDk5IH0sCi0gICAgeyAxMDAsICA4NSB9LCB7IDEyOCwgMTEzIH0sIHsgMTE1LCAxMDAgfSwgeyAgNzEsICA1NiB9LAotICAgIHsgIDg2LCAgNzEgfSwgeyAgMjUsICAxMCB9LCB7IDEyOSwgMTE0IH0sIHsgMTI4LCAxMjggfSwKLSAgICB7IDEwMSwgIDg2IH0sIHsgIDU2LCAgNDEgfSwgeyAgMTAsICAxMCB9LCB7ICA0MSwgIDI2IH0sCi0gICAgeyAxMTYsIDEwMSB9LCB7IDEzMCwgMTE1IH0sIHsgMTQ0LCAxMjkgfSwgeyAgODcsICA3MiB9LAotICAgIHsgMTAyLCAgODcgfSwgeyAgMjYsICAxMSB9LCB7ICA3MiwgIDU3IH0sIHsgMTMxLCAxMTYgfSwKLSAgICB7IDExNywgMTAyIH0sIHsgMTQ1LCAxMzAgfSwgeyAgNTcsICA0MiB9LCB7IDE0NCwgMTQ0IH0sCi0gICAgeyAgMTEsICAxMSB9LCB7ICA0MiwgIDI3IH0sIHsgMTMyLCAxMTcgfSwgeyAxNDYsIDEzMSB9LAotICAgIHsgMTAzLCAgODggfSwgeyAgODgsICA3MyB9LCB7IDExOCwgMTAzIH0sIHsgMTYwLCAxNDUgfSwKLSAgICB7ICA3MywgIDU4IH0sIHsgMTQ3LCAxMzIgfSwgeyAxMzMsIDExOCB9LCB7ICAyNywgIDEyIH0sCi0gICAgeyAxNjEsIDE0NiB9LCB7ICA1OCwgIDQzIH0sIHsgIDEyLCAgMTIgfSwgeyAxNjAsIDE2MCB9LAotICAgIHsgMTE5LCAxMDQgfSwgeyAxNDgsIDEzMyB9LCB7ICA4OSwgIDc0IH0sIHsgMTM0LCAxMTkgfSwKLSAgICB7IDEwNCwgIDg5IH0sIHsgMTYyLCAxNDcgfSwgeyAgNDMsICAyOCB9LCB7ICA3NCwgIDU5IH0sCi0gICAgeyAxNzYsIDE2MSB9LCB7IDE2MywgMTQ4IH0sIHsgIDI4LCAgMTMgfSwgeyAxNDksIDEzNCB9LAotICAgIHsgMTIwLCAxMDUgfSwgeyAxMzUsIDEyMCB9LCB7IDE3NywgMTYyIH0sIHsgMTY0LCAxNDkgfSwKLSAgICB7ICAxMywgIDEzIH0sIHsgMTA1LCAgOTAgfSwgeyAgNTksICA0NCB9LCB7ICA5MCwgIDc1IH0sCi0gICAgeyAxNTAsIDEzNSB9LCB7ICA0NCwgIDI5IH0sIHsgMTc4LCAxNjMgfSwgeyAxNzYsIDE3NiB9LAotICAgIHsgMTM2LCAxMjEgfSwgeyAxNjUsIDE1MCB9LCB7IDEyMSwgMTA2IH0sIHsgIDc1LCAgNjAgfSwKLSAgICB7IDE3OSwgMTY0IH0sIHsgMTUxLCAxMzYgfSwgeyAgMjksICAxNCB9LCB7ICA2MCwgIDQ1IH0sCi0gICAgeyAgMTQsICAxNCB9LCB7IDEwNiwgIDkxIH0sIHsgMTY2LCAxNTEgfSwgeyAxODAsIDE2NSB9LAotICAgIHsgMTkyLCAxNzcgfSwgeyAgOTEsICA3NiB9LCB7IDE5MiwgMTkyIH0sIHsgIDQ1LCAgMzAgfSwKLSAgICB7IDEzNywgMTIyIH0sIHsgMTIyLCAxMDcgfSwgeyAxNTIsIDEzNyB9LCB7IDE5MywgMTc4IH0sCi0gICAgeyAgNzYsICA2MSB9LCB7IDE2NywgMTUyIH0sIHsgMTgxLCAxNjYgfSwgeyAgMzAsICAxNSB9LAotICAgIHsgMTk0LCAxNzkgfSwgeyAyMDgsIDE5MyB9LCB7IDE4MiwgMTY3IH0sIHsgMTA3LCAgOTIgfSwKLSAgICB7IDEzOCwgMTIzIH0sIHsgIDYxLCAgNDYgfSwgeyAxNTMsIDEzOCB9LCB7ICA0NiwgIDMxIH0sCi0gICAgeyAxOTUsIDE4MCB9LCB7ICA5MiwgIDc3IH0sIHsgMTY4LCAxNTMgfSwgeyAyMDksIDE5NCB9LAotICAgIHsgMTk2LCAxODEgfSwgeyAyMDgsIDIwOCB9LCB7IDEyMywgMTA4IH0sIHsgMTgzLCAxNjggfSwKLSAgICB7IDIxMCwgMTk1IH0sIHsgIDc3LCAgNjIgfSwgeyAxMDgsICA5MyB9LCB7IDE2OSwgMTU0IH0sCi0gICAgeyAxNTQsIDEzOSB9LCB7ICA2MiwgIDQ3IH0sIHsgMTk3LCAxODIgfSwgeyAyMTEsIDE5NiB9LAotICAgIHsgMTg0LCAxNjkgfSwgeyAyMjQsIDIwOSB9LCB7IDIyNCwgMjI0IH0sIHsgMTM5LCAxMjQgfSwKLSAgICB7ICA5MywgIDc4IH0sIHsgMTk4LCAxODMgfSwgeyAxMjQsIDEwOSB9LCB7ICA3OCwgIDYzIH0sCi0gICAgeyAyMTIsIDE5NyB9LCB7IDIyNSwgMjEwIH0sIHsgMTcwLCAxNTUgfSwgeyAxODUsIDE3MCB9LAotICAgIHsgMTU1LCAxNDAgfSwgeyAyMTMsIDE5OCB9LCB7IDE5OSwgMTg0IH0sIHsgMTA5LCAgOTQgfSwKLSAgICB7IDIyNiwgMjExIH0sIHsgMTQwLCAxMjUgfSwgeyAgOTQsICA3OSB9LCB7IDI0MCwgMjI1IH0sCi0gICAgeyAyMTQsIDE5OSB9LCB7IDIyNywgMjEyIH0sIHsgMjAwLCAxODUgfSwgeyAxMjUsIDExMCB9LAotICAgIHsgMjQxLCAyMjYgfSwgeyAxODYsIDE3MSB9LCB7IDE3MSwgMTU2IH0sIHsgMTU2LCAxNDEgfSwKLSAgICB7IDIyOCwgMjEzIH0sIHsgMTEwLCAgOTUgfSwgeyAyMTUsIDIwMCB9LCB7IDI0MiwgMjI3IH0sCi0gICAgeyAxNDEsIDEyNiB9LCB7IDIwMSwgMTg2IH0sIHsgMjI5LCAyMTQgfSwgeyAxMjYsIDExMSB9LAotICAgIHsgMjE2LCAyMDEgfSwgeyAyNDMsIDIyOCB9LCB7IDE3MiwgMTU3IH0sIHsgMTg3LCAxNzIgfSwKLSAgICB7IDIzMCwgMjE1IH0sIHsgMTU3LCAxNDIgfSwgeyAyMDIsIDE4NyB9LCB7IDE0MiwgMTI3IH0sCi0gICAgeyAyNDQsIDIyOSB9LCB7IDIxNywgMjAyIH0sIHsgMjMxLCAyMTYgfSwgeyAxODgsIDE3MyB9LAotICAgIHsgMjQ1LCAyMzAgfSwgeyAxNTgsIDE0MyB9LCB7IDE3MywgMTU4IH0sIHsgMjMyLCAyMTcgfSwKLSAgICB7IDI0NiwgMjMxIH0sIHsgMjE4LCAyMDMgfSwgeyAyMDMsIDE4OCB9LCB7IDE3NCwgMTU5IH0sCi0gICAgeyAxODksIDE3NCB9LCB7IDI0NywgMjMyIH0sIHsgMjMzLCAyMTggfSwgeyAyMDQsIDE4OSB9LAotICAgIHsgMjE5LCAyMDQgfSwgeyAyNDgsIDIzMyB9LCB7IDE5MCwgMTc1IH0sIHsgMjM0LCAyMTkgfSwKLSAgICB7IDIyMCwgMjA1IH0sIHsgMjQ5LCAyMzQgfSwgeyAyMDUsIDE5MCB9LCB7IDIyMSwgMjA2IH0sCi0gICAgeyAyNTAsIDIzNSB9LCB7IDIzNSwgMjIwIH0sIHsgMjA2LCAxOTEgfSwgeyAyMzYsIDIyMSB9LAotICAgIHsgMjIyLCAyMDcgfSwgeyAyNTEsIDIzNiB9LCB7IDIzNywgMjIyIH0sIHsgMjUyLCAyMzcgfSwKLSAgICB7IDIzOCwgMjIzIH0sIHsgMjUzLCAyMzggfSwgeyAyNTQsIDIzOSB9LCB7ICAgMCwgICAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfY29sX3NjYW5fMTZ4MTZfbmJbMjU2XVsyXSA9IHsKLSAgICB7ICAgMCwgICAwIH0sIHsgICAxLCAgIDEgfSwgeyAgIDIsICAgMiB9LCB7ICAgMCwgICAwIH0sCi0gICAgeyAgIDMsICAgMyB9LCB7ICAxNiwgIDE2IH0sIHsgICA0LCAgIDQgfSwgeyAgMTcsICAxNyB9LAotICAgIHsgICA1LCAgIDUgfSwgeyAgMTgsICAxOCB9LCB7ICAxNiwgIDE2IH0sIHsgIDE5LCAgMTkgfSwKLSAgICB7ICAgNiwgICA2IH0sIHsgIDMyLCAgMzIgfSwgeyAgMjAsICAyMCB9LCB7ICAzMywgIDMzIH0sCi0gICAgeyAgIDcsICAgNyB9LCB7ICAzNCwgIDM0IH0sIHsgIDIxLCAgMjEgfSwgeyAgMzIsICAzMiB9LAotICAgIHsgIDM1LCAgMzUgfSwgeyAgIDgsICAgOCB9LCB7ICA0OCwgIDQ4IH0sIHsgIDIyLCAgMjIgfSwKLSAgICB7ICA0OSwgIDQ5IH0sIHsgIDM2LCAgMzYgfSwgeyAgIDksICAgOSB9LCB7ICAzNywgIDM3IH0sCi0gICAgeyAgNTAsICA1MCB9LCB7ICAyMywgIDIzIH0sIHsgIDQ4LCAgNDggfSwgeyAgNTEsICA1MSB9LAotICAgIHsgIDEwLCAgMTAgfSwgeyAgNjQsICA2NCB9LCB7ICAzOCwgIDM4IH0sIHsgIDI0LCAgMjQgfSwKLSAgICB7ICA1MiwgIDUyIH0sIHsgIDY1LCAgNjUgfSwgeyAgNTMsICA1MyB9LCB7ICAzOSwgIDM5IH0sCi0gICAgeyAgNjYsICA2NiB9LCB7ICAxMSwgIDExIH0sIHsgIDY0LCAgNjQgfSwgeyAgMjUsICAyNSB9LAotICAgIHsgIDY3LCAgNjcgfSwgeyAgNTQsICA1NCB9LCB7ICA4MCwgIDgwIH0sIHsgIDQwLCAgNDAgfSwKLSAgICB7ICA2OCwgIDY4IH0sIHsgIDEyLCAgMTIgfSwgeyAgMjYsICAyNiB9LCB7ICA4MSwgIDgxIH0sCi0gICAgeyAgNTUsICA1NSB9LCB7ICA2OSwgIDY5IH0sIHsgIDgyLCAgODIgfSwgeyAgNDEsICA0MSB9LAotICAgIHsgIDEzLCAgMTMgfSwgeyAgODMsICA4MyB9LCB7ICA4MCwgIDgwIH0sIHsgIDcwLCAgNzAgfSwKLSAgICB7ICAyNywgIDI3IH0sIHsgIDU2LCAgNTYgfSwgeyAgODQsICA4NCB9LCB7ICA5NiwgIDk2IH0sCi0gICAgeyAgMTQsICAxNCB9LCB7ICA3MSwgIDcxIH0sIHsgIDk3LCAgOTcgfSwgeyAgNDIsICA0MiB9LAotICAgIHsgIDg1LCAgODUgfSwgeyAgNTcsICA1NyB9LCB7ICA5OCwgIDk4IH0sIHsgIDI4LCAgMjggfSwKLSAgICB7ICA4NiwgIDg2IH0sIHsgIDk5LCAgOTkgfSwgeyAgOTYsICA5NiB9LCB7ICA3MiwgIDcyIH0sCi0gICAgeyAgNDMsICA0MyB9LCB7IDEwMCwgMTAwIH0sIHsgIDU4LCAgNTggfSwgeyAgMjksICAyOSB9LAotICAgIHsgMTEyLCAxMTIgfSwgeyAgODcsICA4NyB9LCB7IDExMywgMTEzIH0sIHsgIDczLCAgNzMgfSwKLSAgICB7IDExMiwgMTEyIH0sIHsgMTAxLCAxMDEgfSwgeyAgNDQsICA0NCB9LCB7ICAzMCwgIDMwIH0sCi0gICAgeyAxMTQsIDExNCB9LCB7ICA1OSwgIDU5IH0sIHsgMTAyLCAxMDIgfSwgeyAgODgsICA4OCB9LAotICAgIHsgMTE1LCAxMTUgfSwgeyAgNzQsICA3NCB9LCB7IDEyOCwgMTI4IH0sIHsgMTE2LCAxMTYgfSwKLSAgICB7ICA0NSwgIDQ1IH0sIHsgMTAzLCAxMDMgfSwgeyAgODksICA4OSB9LCB7ICA2MCwgIDYwIH0sCi0gICAgeyAxMjksIDEyOSB9LCB7IDExNywgMTE3IH0sIHsgMTMwLCAxMzAgfSwgeyAxMzEsIDEzMSB9LAotICAgIHsgMTA0LCAxMDQgfSwgeyAgNzUsICA3NSB9LCB7ICA0NiwgIDQ2IH0sIHsgMTE4LCAxMTggfSwKLSAgICB7IDEyOCwgMTI4IH0sIHsgIDkwLCAgOTAgfSwgeyAgNjEsICA2MSB9LCB7IDEzMiwgMTMyIH0sCi0gICAgeyAxMDUsIDEwNSB9LCB7IDE0NCwgMTQ0IH0sIHsgMTE5LCAxMTkgfSwgeyAxNDUsIDE0NSB9LAotICAgIHsgMTMzLCAxMzMgfSwgeyAgNzYsICA3NiB9LCB7IDE0NiwgMTQ2IH0sIHsgMTIwLCAxMjAgfSwKLSAgICB7ICA5MSwgIDkxIH0sIHsgMTM0LCAxMzQgfSwgeyAxNDcsIDE0NyB9LCB7ICA2MiwgIDYyIH0sCi0gICAgeyAxMDYsIDEwNiB9LCB7IDEzNSwgMTM1IH0sIHsgMTIxLCAxMjEgfSwgeyAgOTIsICA5MiB9LAotICAgIHsgMTQ4LCAxNDggfSwgeyAxNDQsIDE0NCB9LCB7ICA3NywgIDc3IH0sIHsgMTQ5LCAxNDkgfSwKLSAgICB7IDEzNiwgMTM2IH0sIHsgMTA3LCAxMDcgfSwgeyAxNjAsIDE2MCB9LCB7IDE2MSwgMTYxIH0sCi0gICAgeyAxNTAsIDE1MCB9LCB7IDEyMiwgMTIyIH0sIHsgIDc4LCAgNzggfSwgeyAxMzcsIDEzNyB9LAotICAgIHsgMTYyLCAxNjIgfSwgeyAxNTEsIDE1MSB9LCB7ICA5MywgIDkzIH0sIHsgMTYzLCAxNjMgfSwKLSAgICB7IDEwOCwgMTA4IH0sIHsgMTY0LCAxNjQgfSwgeyAxNTIsIDE1MiB9LCB7IDEyMywgMTIzIH0sCi0gICAgeyAxMzgsIDEzOCB9LCB7IDE2MCwgMTYwIH0sIHsgMTY1LCAxNjUgfSwgeyAgOTQsICA5NCB9LAotICAgIHsgMTc2LCAxNzYgfSwgeyAxNjYsIDE2NiB9LCB7IDEwOSwgMTA5IH0sIHsgMTUzLCAxNTMgfSwKLSAgICB7IDE3NywgMTc3IH0sIHsgMTI0LCAxMjQgfSwgeyAxNzgsIDE3OCB9LCB7IDEzOSwgMTM5IH0sCi0gICAgeyAxNjcsIDE2NyB9LCB7IDE1NCwgMTU0IH0sIHsgMTEwLCAxMTAgfSwgeyAxNzksIDE3OSB9LAotICAgIHsgMTc2LCAxNzYgfSwgeyAxODAsIDE4MCB9LCB7IDE2OCwgMTY4IH0sIHsgMTQwLCAxNDAgfSwKLSAgICB7IDEyNSwgMTI1IH0sIHsgMTgxLCAxODEgfSwgeyAxOTIsIDE5MiB9LCB7IDE5MywgMTkzIH0sCi0gICAgeyAxNTUsIDE1NSB9LCB7IDE4MiwgMTgyIH0sIHsgMTY5LCAxNjkgfSwgeyAxOTQsIDE5NCB9LAotICAgIHsgMTI2LCAxMjYgfSwgeyAxNDEsIDE0MSB9LCB7IDE5NSwgMTk1IH0sIHsgMTgzLCAxODMgfSwKLSAgICB7IDE5MiwgMTkyIH0sIHsgMTk2LCAxOTYgfSwgeyAxNTYsIDE1NiB9LCB7IDE3MCwgMTcwIH0sCi0gICAgeyAxNDIsIDE0MiB9LCB7IDE4NCwgMTg0IH0sIHsgMTk3LCAxOTcgfSwgeyAyMDgsIDIwOCB9LAotICAgIHsgMTk4LCAxOTggfSwgeyAyMDksIDIwOSB9LCB7IDE3MSwgMTcxIH0sIHsgMTU3LCAxNTcgfSwKLSAgICB7IDE4NSwgMTg1IH0sIHsgMjEwLCAyMTAgfSwgeyAyMDgsIDIwOCB9LCB7IDIxMSwgMjExIH0sCi0gICAgeyAxOTksIDE5OSB9LCB7IDIyNCwgMjI0IH0sIHsgMTU4LCAxNTggfSwgeyAyMTIsIDIxMiB9LAotICAgIHsgMjI0LCAyMjQgfSwgeyAxODYsIDE4NiB9LCB7IDIwMCwgMjAwIH0sIHsgMTcyLCAxNzIgfSwKLSAgICB7IDIyNSwgMjI1IH0sIHsgMjEzLCAyMTMgfSwgeyAyMTQsIDIxNCB9LCB7IDIyNiwgMjI2IH0sCi0gICAgeyAyMDEsIDIwMSB9LCB7IDIyNywgMjI3IH0sIHsgMTg3LCAxODcgfSwgeyAyNDAsIDI0MCB9LAotICAgIHsgMjE1LCAyMTUgfSwgeyAxNzMsIDE3MyB9LCB7IDIyOCwgMjI4IH0sIHsgMjQxLCAyNDEgfSwKLSAgICB7IDIwMiwgMjAyIH0sIHsgMjQyLCAyNDIgfSwgeyAyMTYsIDIxNiB9LCB7IDIyOSwgMjI5IH0sCi0gICAgeyAxNzQsIDE3NCB9LCB7IDE4OCwgMTg4IH0sIHsgMjQzLCAyNDMgfSwgeyAyMzAsIDIzMCB9LAotICAgIHsgMjAzLCAyMDMgfSwgeyAyMTcsIDIxNyB9LCB7IDIzMSwgMjMxIH0sIHsgMjQ0LCAyNDQgfSwKLSAgICB7IDIxOCwgMjE4IH0sIHsgMjQ1LCAyNDUgfSwgeyAxODksIDE4OSB9LCB7IDIzMiwgMjMyIH0sCi0gICAgeyAyMDQsIDIwNCB9LCB7IDE5MCwgMTkwIH0sIHsgMjQ2LCAyNDYgfSwgeyAyMzMsIDIzMyB9LAotICAgIHsgMjQ3LCAyNDcgfSwgeyAyMTksIDIxOSB9LCB7IDIwNSwgMjA1IH0sIHsgMjQ4LCAyNDggfSwKLSAgICB7IDIzNCwgMjM0IH0sIHsgMjIwLCAyMjAgfSwgeyAyMDYsIDIwNiB9LCB7IDI0OSwgMjQ5IH0sCi0gICAgeyAyMzUsIDIzNSB9LCB7IDIyMSwgMjIxIH0sIHsgMjUwLCAyNTAgfSwgeyAyMjIsIDIyMiB9LAotICAgIHsgMjM2LCAyMzYgfSwgeyAyMzcsIDIzNyB9LCB7IDI1MSwgMjUxIH0sIHsgMjM4LCAyMzggfSwKLSAgICB7IDI1MiwgMjUyIH0sIHsgMjUzLCAyNTMgfSwgeyAyNTQsIDI1NCB9LCB7ICAgMCwgICAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfcm93X3NjYW5fMTZ4MTZfbmJbMjU2XVsyXSA9IHsKLSAgICB7ICAgMCwgICAwIH0sIHsgIDE2LCAgMTYgfSwgeyAgIDAsICAgMCB9LCB7ICAzMiwgIDMyIH0sCi0gICAgeyAgIDEsICAgMSB9LCB7ICA0OCwgIDQ4IH0sIHsgIDE3LCAgMTcgfSwgeyAgIDEsICAgMSB9LAotICAgIHsgIDY0LCAgNjQgfSwgeyAgIDIsICAgMiB9LCB7ICAzMywgIDMzIH0sIHsgIDgwLCAgODAgfSwKLSAgICB7ICAxOCwgIDE4IH0sIHsgICAyLCAgIDIgfSwgeyAgNDksICA0OSB9LCB7ICAgMywgICAzIH0sCi0gICAgeyAgOTYsICA5NiB9LCB7ICAzNCwgIDM0IH0sIHsgIDY1LCAgNjUgfSwgeyAgMTksICAxOSB9LAotICAgIHsgICAzLCAgIDMgfSwgeyAxMTIsIDExMiB9LCB7ICA1MCwgIDUwIH0sIHsgICA0LCAgIDQgfSwKLSAgICB7ICA4MSwgIDgxIH0sIHsgIDM1LCAgMzUgfSwgeyAgNjYsICA2NiB9LCB7ICAgNCwgICA0IH0sCi0gICAgeyAxMjgsIDEyOCB9LCB7ICAyMCwgIDIwIH0sIHsgIDUxLCAgNTEgfSwgeyAgOTcsICA5NyB9LAotICAgIHsgIDgyLCAgODIgfSwgeyAgIDUsICAgNSB9LCB7ICAzNiwgIDM2IH0sIHsgMTQ0LCAxNDQgfSwKLSAgICB7ICA2NywgIDY3IH0sIHsgMTEzLCAxMTMgfSwgeyAgMjEsICAyMSB9LCB7ICA1MiwgIDUyIH0sCi0gICAgeyAgIDUsICAgNSB9LCB7ICA5OCwgIDk4IH0sIHsgMTYwLCAxNjAgfSwgeyAgODMsICA4MyB9LAotICAgIHsgIDM3LCAgMzcgfSwgeyAgIDYsICAgNiB9LCB7ICA2OCwgIDY4IH0sIHsgMTI5LCAxMjkgfSwKLSAgICB7ICAyMiwgIDIyIH0sIHsgIDUzLCAgNTMgfSwgeyAxMTQsIDExNCB9LCB7ICAgNiwgICA2IH0sCi0gICAgeyAgOTksICA5OSB9LCB7IDE3NiwgMTc2IH0sIHsgIDg0LCAgODQgfSwgeyAgMzgsICAzOCB9LAotICAgIHsgICA3LCAgIDcgfSwgeyAgNjksICA2OSB9LCB7IDE0NSwgMTQ1IH0sIHsgMTMwLCAxMzAgfSwKLSAgICB7IDExNSwgMTE1IH0sIHsgIDIzLCAgMjMgfSwgeyAgNTQsICA1NCB9LCB7IDE5MiwgMTkyIH0sCi0gICAgeyAxMDAsIDEwMCB9LCB7ICAgNywgICA3IH0sIHsgIDg1LCAgODUgfSwgeyAxNjEsIDE2MSB9LAotICAgIHsgIDM5LCAgMzkgfSwgeyAgNzAsICA3MCB9LCB7ICAgOCwgICA4IH0sIHsgMTQ2LCAxNDYgfSwKLSAgICB7IDEzMSwgMTMxIH0sIHsgMTE2LCAxMTYgfSwgeyAgNTUsICA1NSB9LCB7IDIwOCwgMjA4IH0sCi0gICAgeyAxMDEsIDEwMSB9LCB7ICAyNCwgIDI0IH0sIHsgIDg2LCAgODYgfSwgeyAgIDgsICAgOCB9LAotICAgIHsgMTMyLCAxMzIgfSwgeyAgNDAsICA0MCB9LCB7ICA3MSwgIDcxIH0sIHsgMTc3LCAxNzcgfSwKLSAgICB7IDE0NywgMTQ3IH0sIHsgMjI0LCAyMjQgfSwgeyAxMTcsIDExNyB9LCB7IDE2MiwgMTYyIH0sCi0gICAgeyAgIDksICAgOSB9LCB7IDEwMiwgMTAyIH0sIHsgIDU2LCAgNTYgfSwgeyAgMjUsICAyNSB9LAotICAgIHsgIDg3LCAgODcgfSwgeyAxNDgsIDE0OCB9LCB7ICAgOSwgICA5IH0sIHsgMTMzLCAxMzMgfSwKLSAgICB7ICA3MiwgIDcyIH0sIHsgMTE4LCAxMTggfSwgeyAxOTMsIDE5MyB9LCB7IDE2MywgMTYzIH0sCi0gICAgeyAgNDEsICA0MSB9LCB7IDEwMywgMTAzIH0sIHsgMTc4LCAxNzggfSwgeyAgMTAsICAxMCB9LAotICAgIHsgIDU3LCAgNTcgfSwgeyAxNDksIDE0OSB9LCB7IDEzNCwgMTM0IH0sIHsgIDg4LCAgODggfSwKLSAgICB7ICAyNiwgIDI2IH0sIHsgMTE5LCAxMTkgfSwgeyAgMTAsICAxMCB9LCB7IDE2NCwgMTY0IH0sCi0gICAgeyAxMDQsIDEwNCB9LCB7ICA3MywgIDczIH0sIHsgMjA5LCAyMDkgfSwgeyAxNzksIDE3OSB9LAotICAgIHsgIDQyLCAgNDIgfSwgeyAgMTEsICAxMSB9LCB7IDE5NCwgMTk0IH0sIHsgMTM1LCAxMzUgfSwKLSAgICB7IDE2NSwgMTY1IH0sIHsgMTUwLCAxNTAgfSwgeyAgNTgsICA1OCB9LCB7ICAyNywgIDI3IH0sCi0gICAgeyAgODksICA4OSB9LCB7ICAxMSwgIDExIH0sIHsgMTIwLCAxMjAgfSwgeyAgNzQsICA3NCB9LAotICAgIHsgIDQzLCAgNDMgfSwgeyAyMjUsIDIyNSB9LCB7IDEwNSwgMTA1IH0sIHsgIDEyLCAgMTIgfSwKLSAgICB7IDE4MCwgMTgwIH0sIHsgMTUxLCAxNTEgfSwgeyAxOTUsIDE5NSB9LCB7IDEzNiwgMTM2IH0sCi0gICAgeyAgMjgsICAyOCB9LCB7IDE2NiwgMTY2IH0sIHsgMTIxLCAxMjEgfSwgeyAgNTksICA1OSB9LAotICAgIHsgIDEyLCAgMTIgfSwgeyAyMTAsIDIxMCB9LCB7ICA5MCwgIDkwIH0sIHsgMTA2LCAxMDYgfSwKLSAgICB7ICA0NCwgIDQ0IH0sIHsgMTgxLCAxODEgfSwgeyAgNzUsICA3NSB9LCB7IDE1MiwgMTUyIH0sCi0gICAgeyAgMTMsICAxMyB9LCB7IDE2NywgMTY3IH0sIHsgMTM3LCAxMzcgfSwgeyAgMTMsICAxMyB9LAotICAgIHsgIDYwLCAgNjAgfSwgeyAxOTYsIDE5NiB9LCB7IDEyMiwgMTIyIH0sIHsgIDI5LCAgMjkgfSwKLSAgICB7ICA5MSwgIDkxIH0sIHsgIDE0LCAgMTQgfSwgeyAxODIsIDE4MiB9LCB7ICA3NiwgIDc2IH0sCi0gICAgeyAyMTEsIDIxMSB9LCB7IDE1MywgMTUzIH0sIHsgIDE0LCAgMTQgfSwgeyAxMDcsIDEwNyB9LAotICAgIHsgMTM4LCAxMzggfSwgeyAgNDUsICA0NSB9LCB7IDIyNiwgMjI2IH0sIHsgMTY4LCAxNjggfSwKLSAgICB7IDE5NywgMTk3IH0sIHsgMTIzLCAxMjMgfSwgeyAgMzAsICAzMCB9LCB7ICA2MSwgIDYxIH0sCi0gICAgeyAgMTUsICAxNSB9LCB7ICA5MiwgIDkyIH0sIHsgMTU0LCAxNTQgfSwgeyAxODMsIDE4MyB9LAotICAgIHsgMTY5LCAxNjkgfSwgeyAxMDgsIDEwOCB9LCB7IDIxMiwgMjEyIH0sIHsgIDc3LCAgNzcgfSwKLSAgICB7IDEzOSwgMTM5IH0sIHsgMTk4LCAxOTggfSwgeyAgNDYsICA0NiB9LCB7IDEyNCwgMTI0IH0sCi0gICAgeyAyMjcsIDIyNyB9LCB7ICA2MiwgIDYyIH0sIHsgIDMxLCAgMzEgfSwgeyAxODQsIDE4NCB9LAotICAgIHsgIDkzLCAgOTMgfSwgeyAxNzAsIDE3MCB9LCB7IDE1NSwgMTU1IH0sIHsgMTg1LCAxODUgfSwKLSAgICB7ICA3OCwgIDc4IH0sIHsgIDQ3LCAgNDcgfSwgeyAxOTksIDE5OSB9LCB7IDIxMywgMjEzIH0sCi0gICAgeyAxNDAsIDE0MCB9LCB7ICA2MywgIDYzIH0sIHsgMTA5LCAxMDkgfSwgeyAxMjUsIDEyNSB9LAotICAgIHsgIDk0LCAgOTQgfSwgeyAyMDAsIDIwMCB9LCB7IDE3MSwgMTcxIH0sIHsgMTU2LCAxNTYgfSwKLSAgICB7IDIyOCwgMjI4IH0sIHsgMTg2LCAxODYgfSwgeyAyMTQsIDIxNCB9LCB7IDIwMSwgMjAxIH0sCi0gICAgeyAgNzksICA3OSB9LCB7IDE0MSwgMTQxIH0sIHsgMTEwLCAxMTAgfSwgeyAyMjksIDIyOSB9LAotICAgIHsgIDk1LCAgOTUgfSwgeyAxMjYsIDEyNiB9LCB7IDIxNSwgMjE1IH0sIHsgMTcyLCAxNzIgfSwKLSAgICB7IDExMSwgMTExIH0sIHsgMTQyLCAxNDIgfSwgeyAyMDIsIDIwMiB9LCB7IDE1NywgMTU3IH0sCi0gICAgeyAyMTYsIDIxNiB9LCB7IDIzMCwgMjMwIH0sIHsgMjE3LCAyMTcgfSwgeyAxODcsIDE4NyB9LAotICAgIHsgMTI3LCAxMjcgfSwgeyAyMzEsIDIzMSB9LCB7IDE1OCwgMTU4IH0sIHsgMTczLCAxNzMgfSwKLSAgICB7IDE0MywgMTQzIH0sIHsgMjAzLCAyMDMgfSwgeyAxODgsIDE4OCB9LCB7IDIzMiwgMjMyIH0sCi0gICAgeyAyMTgsIDIxOCB9LCB7IDIzMywgMjMzIH0sIHsgMTU5LCAxNTkgfSwgeyAxNzQsIDE3NCB9LAotICAgIHsgMjA0LCAyMDQgfSwgeyAxODksIDE4OSB9LCB7IDIzNCwgMjM0IH0sIHsgMjE5LCAyMTkgfSwKLSAgICB7IDE3NSwgMTc1IH0sIHsgMjA1LCAyMDUgfSwgeyAyMzUsIDIzNSB9LCB7IDIyMCwgMjIwIH0sCi0gICAgeyAxOTAsIDE5MCB9LCB7IDIzNiwgMjM2IH0sIHsgMjA2LCAyMDYgfSwgeyAxOTEsIDE5MSB9LAotICAgIHsgMjIxLCAyMjEgfSwgeyAyMDcsIDIwNyB9LCB7IDIzNywgMjM3IH0sIHsgMjIyLCAyMjIgfSwKLSAgICB7IDIzOCwgMjM4IH0sIHsgMjIzLCAyMjMgfSwgeyAyMzksIDIzOSB9LCB7ICAgMCwgICAwIH0sCi19OwotCi1zdGF0aWMgY29uc3QgaW50MTZfdCB2cDlfZGVmYXVsdF9zY2FuXzMyeDMyX25iWzEwMjRdWzJdID0gewotICAgIHsgICAgMCwgICAgMCB9LCB7ICAgIDAsICAgIDAgfSwgeyAgICAxLCAgICAxIH0sIHsgICAzMiwgICAgMSB9LAotICAgIHsgICAzMiwgICAzMiB9LCB7ICAgIDIsICAgIDIgfSwgeyAgIDMzLCAgICAyIH0sIHsgICA2NCwgICAzMyB9LAotICAgIHsgICAgMywgICAgMyB9LCB7ICAgNjQsICAgNjQgfSwgeyAgIDM0LCAgICAzIH0sIHsgICA2NSwgICAzNCB9LAotICAgIHsgICAgNCwgICAgNCB9LCB7ICAgMzUsICAgIDQgfSwgeyAgIDk2LCAgIDY1IH0sIHsgICA2NiwgICAzNSB9LAotICAgIHsgICA5NiwgICA5NiB9LCB7ICAgOTcsICAgNjYgfSwgeyAgIDY3LCAgIDM2IH0sIHsgICAzNiwgICAgNSB9LAotICAgIHsgICAgNSwgICAgNSB9LCB7ICAxMjgsICAgOTcgfSwgeyAgIDk4LCAgIDY3IH0sIHsgICAgNiwgICAgNiB9LAotICAgIHsgIDEyOCwgIDEyOCB9LCB7ICAgNjgsICAgMzcgfSwgeyAgIDM3LCAgICA2IH0sIHsgIDEyOSwgICA5OCB9LAotICAgIHsgICA5OSwgICA2OCB9LCB7ICAxNjAsICAxMjkgfSwgeyAgMTMwLCAgIDk5IH0sIHsgICAzOCwgICAgNyB9LAotICAgIHsgICA2OSwgICAzOCB9LCB7ICAgIDcsICAgIDcgfSwgeyAgMTAwLCAgIDY5IH0sIHsgIDE2MSwgIDEzMCB9LAotICAgIHsgIDEzMSwgIDEwMCB9LCB7ICAxNjAsICAxNjAgfSwgeyAgIDcwLCAgIDM5IH0sIHsgICAzOSwgICAgOCB9LAotICAgIHsgICAgOCwgICAgOCB9LCB7ICAxMDEsICAgNzAgfSwgeyAgMTYyLCAgMTMxIH0sIHsgIDEzMiwgIDEwMSB9LAotICAgIHsgIDE5MiwgIDE2MSB9LCB7ICAgNzEsICAgNDAgfSwgeyAgMTkyLCAgMTkyIH0sIHsgIDEwMiwgICA3MSB9LAotICAgIHsgICA0MCwgICAgOSB9LCB7ICAxNjMsICAxMzIgfSwgeyAgICA5LCAgICA5IH0sIHsgIDE5MywgIDE2MiB9LAotICAgIHsgIDEzMywgIDEwMiB9LCB7ICAxNjQsICAxMzMgfSwgeyAgIDcyLCAgIDQxIH0sIHsgIDEwMywgICA3MiB9LAotICAgIHsgIDEzNCwgIDEwMyB9LCB7ICAyMjQsICAxOTMgfSwgeyAgIDQxLCAgIDEwIH0sIHsgIDE5NCwgIDE2MyB9LAotICAgIHsgICAxMCwgICAxMCB9LCB7ICAyMjQsICAyMjQgfSwgeyAgMTY1LCAgMTM0IH0sIHsgIDIyNSwgIDE5NCB9LAotICAgIHsgIDE5NSwgIDE2NCB9LCB7ICAgNzMsICAgNDIgfSwgeyAgMTA0LCAgIDczIH0sIHsgIDEzNSwgIDEwNCB9LAotICAgIHsgICA0MiwgICAxMSB9LCB7ICAgMTEsICAgMTEgfSwgeyAgMTY2LCAgMTM1IH0sIHsgIDE5NiwgIDE2NSB9LAotICAgIHsgIDIyNiwgIDE5NSB9LCB7ICAyNTYsICAyMjUgfSwgeyAgIDc0LCAgIDQzIH0sIHsgIDEwNSwgICA3NCB9LAotICAgIHsgIDEzNiwgIDEwNSB9LCB7ICAyMjcsICAxOTYgfSwgeyAgIDQzLCAgIDEyIH0sIHsgIDE5NywgIDE2NiB9LAotICAgIHsgIDE2NywgIDEzNiB9LCB7ICAyNTcsICAyMjYgfSwgeyAgMjU2LCAgMjU2IH0sIHsgICAxMiwgICAxMiB9LAotICAgIHsgIDIyOCwgIDE5NyB9LCB7ICAgNzUsICAgNDQgfSwgeyAgMTA2LCAgIDc1IH0sIHsgIDE5OCwgIDE2NyB9LAotICAgIHsgIDEzNywgIDEwNiB9LCB7ICAyNTgsICAyMjcgfSwgeyAgMTY4LCAgMTM3IH0sIHsgIDI4OCwgIDI1NyB9LAotICAgIHsgICA0NCwgICAxMyB9LCB7ICAyMjksICAxOTggfSwgeyAgMjU5LCAgMjI4IH0sIHsgIDE5OSwgIDE2OCB9LAotICAgIHsgIDEwNywgICA3NiB9LCB7ICAgMTMsICAgMTMgfSwgeyAgMTY5LCAgMTM4IH0sIHsgIDEzOCwgIDEwNyB9LAotICAgIHsgIDI4OCwgIDI4OCB9LCB7ICAyODksICAyNTggfSwgeyAgIDc2LCAgIDQ1IH0sIHsgIDIzMCwgIDE5OSB9LAotICAgIHsgIDI2MCwgIDIyOSB9LCB7ICAgNDUsICAgMTQgfSwgeyAgMjAwLCAgMTY5IH0sIHsgIDEzOSwgIDEwOCB9LAotICAgIHsgIDI5MCwgIDI1OSB9LCB7ICAxMDgsICAgNzcgfSwgeyAgMjMxLCAgMjAwIH0sIHsgIDMyMCwgIDI4OSB9LAotICAgIHsgIDI2MSwgIDIzMCB9LCB7ICAxNzAsICAxMzkgfSwgeyAgIDc3LCAgIDQ2IH0sIHsgIDI5MSwgIDI2MCB9LAotICAgIHsgICAxNCwgICAxNCB9LCB7ICAzMjEsICAyOTAgfSwgeyAgMjAxLCAgMTcwIH0sIHsgIDI2MiwgIDIzMSB9LAotICAgIHsgIDMyMCwgIDMyMCB9LCB7ICAxNzEsICAxNDAgfSwgeyAgMjkyLCAgMjYxIH0sIHsgIDIzMiwgIDIwMSB9LAotICAgIHsgIDE0MCwgIDEwOSB9LCB7ICAzMjIsICAyOTEgfSwgeyAgMTA5LCAgIDc4IH0sIHsgICA0NiwgICAxNSB9LAotICAgIHsgIDIwMiwgIDE3MSB9LCB7ICAyNjMsICAyMzIgfSwgeyAgMjMzLCAgMjAyIH0sIHsgIDI5MywgIDI2MiB9LAotICAgIHsgIDM1MiwgIDMyMSB9LCB7ICAzMjMsICAyOTIgfSwgeyAgIDE1LCAgIDE1IH0sIHsgICA3OCwgICA0NyB9LAotICAgIHsgIDIwMywgIDE3MiB9LCB7ICAyNjQsICAyMzMgfSwgeyAgMjk0LCAgMjYzIH0sIHsgIDMyNCwgIDI5MyB9LAotICAgIHsgIDE3MiwgIDE0MSB9LCB7ICAzNTMsICAzMjIgfSwgeyAgMTQxLCAgMTEwIH0sIHsgIDIzNCwgIDIwMyB9LAotICAgIHsgIDM1MiwgIDM1MiB9LCB7ICAgNDcsICAgMTYgfSwgeyAgMjk1LCAgMjY0IH0sIHsgIDExMCwgICA3OSB9LAotICAgIHsgIDI2NSwgIDIzNCB9LCB7ICAzNTQsICAzMjMgfSwgeyAgMzI1LCAgMjk0IH0sIHsgICA3OSwgICA0OCB9LAotICAgIHsgICAxNiwgICAxNiB9LCB7ICAyMDQsICAxNzMgfSwgeyAgMjM1LCAgMjA0IH0sIHsgIDE3MywgIDE0MiB9LAotICAgIHsgIDM1NSwgIDMyNCB9LCB7ICAzODQsICAzNTMgfSwgeyAgMzI2LCAgMjk1IH0sIHsgIDE0MiwgIDExMSB9LAotICAgIHsgIDI5NiwgIDI2NSB9LCB7ICAyNjYsICAyMzUgfSwgeyAgMzU2LCAgMzI1IH0sIHsgIDM4NSwgIDM1NCB9LAotICAgIHsgIDExMSwgICA4MCB9LCB7ICAgNDgsICAgMTcgfSwgeyAgMzI3LCAgMjk2IH0sIHsgIDI5NywgIDI2NiB9LAotICAgIHsgIDIwNSwgIDE3NCB9LCB7ICAzODQsICAzODQgfSwgeyAgMjM2LCAgMjA1IH0sIHsgIDM1NywgIDMyNiB9LAotICAgIHsgIDM4NiwgIDM1NSB9LCB7ICAgODAsICAgNDkgfSwgeyAgMTc0LCAgMTQzIH0sIHsgICAxNywgICAxNyB9LAotICAgIHsgIDMyOCwgIDI5NyB9LCB7ICAzNTgsICAzMjcgfSwgeyAgMzg3LCAgMzU2IH0sIHsgIDI5OCwgIDI2NyB9LAotICAgIHsgIDMyOSwgIDI5OCB9LCB7ICAzODgsICAzNTcgfSwgeyAgMTEyLCAgIDgxIH0sIHsgIDQxNiwgIDM4NSB9LAotICAgIHsgIDIzNywgIDIwNiB9LCB7ICAzNTksICAzMjggfSwgeyAgIDQ5LCAgIDE4IH0sIHsgIDIwNiwgIDE3NSB9LAotICAgIHsgIDQxNywgIDM4NiB9LCB7ICAzODksICAzNTggfSwgeyAgMzMwLCAgMjk5IH0sIHsgICAxOCwgICAxOCB9LAotICAgIHsgIDQxNiwgIDQxNiB9LCB7ICAzNjAsICAzMjkgfSwgeyAgIDgxLCAgIDUwIH0sIHsgIDQxOCwgIDM4NyB9LAotICAgIHsgIDM5MCwgIDM1OSB9LCB7ICAyMzgsICAyMDcgfSwgeyAgIDUwLCAgIDE5IH0sIHsgIDM2MSwgIDMzMCB9LAotICAgIHsgIDQxOSwgIDM4OCB9LCB7ICAxMTMsICAgODIgfSwgeyAgNDQ4LCAgNDE3IH0sIHsgIDQ0OCwgIDQ0OCB9LAotICAgIHsgIDQyMCwgIDM4OSB9LCB7ICAgODIsICAgNTEgfSwgeyAgMzYyLCAgMzMxIH0sIHsgIDQ0OSwgIDQxOCB9LAotICAgIHsgIDQyMSwgIDM5MCB9LCB7ICA0ODAsICA0ODAgfSwgeyAgNDUwLCAgNDE5IH0sIHsgIDQyMiwgIDM5MSB9LAotICAgIHsgIDExNCwgICA4MyB9LCB7ICA0NTEsICA0MjAgfSwgeyAgNDgwLCAgNDQ5IH0sIHsgIDQ1MiwgIDQyMSB9LAotICAgIHsgIDQ4MSwgIDQ1MCB9LCB7ICA0NTMsICA0MjIgfSwgeyAgNTEyLCAgNTEyIH0sIHsgIDQ4MiwgIDQ1MSB9LAotICAgIHsgIDQ1NCwgIDQyMyB9LCB7ICA1MTIsICA0ODEgfSwgeyAgNDgzLCAgNDUyIH0sIHsgIDUxMywgIDQ4MiB9LAotICAgIHsgIDQ4NCwgIDQ1MyB9LCB7ICA1MTQsICA0ODMgfSwgeyAgNDg1LCAgNDU0IH0sIHsgIDU0NCwgIDUxMyB9LAotICAgIHsgIDU0NCwgIDU0NCB9LCB7ICA0ODYsICA0NTUgfSwgeyAgNTQ1LCAgNTE0IH0sIHsgIDU0NiwgIDUxNSB9LAotICAgIHsgIDU3NiwgIDU3NiB9LCB7ICA1NzYsICA1NDUgfSwgeyAgNTc3LCAgNTQ2IH0sIHsgIDU3OCwgIDU0NyB9LAotICAgIHsgIDYwOCwgIDU3NyB9LCB7ICA2MDksICA1NzggfSwgeyAgNjEwLCAgNTc5IH0sIHsgICAxOSwgICAxOSB9LAotICAgIHsgIDE0MywgIDExMiB9LCB7ICAyNjcsICAyMzYgfSwgeyAgMzkxLCAgMzYwIH0sIHsgIDUxNSwgIDQ4NCB9LAotICAgIHsgIDYwOCwgIDYwOCB9LCB7ICAgMjAsICAgMjAgfSwgeyAgIDUxLCAgIDIwIH0sIHsgIDE0NCwgIDExMyB9LAotICAgIHsgIDE3NSwgIDE0NCB9LCB7ICAyNjgsICAyMzcgfSwgeyAgMjk5LCAgMjY4IH0sIHsgIDM5MiwgIDM2MSB9LAotICAgIHsgIDQyMywgIDM5MiB9LCB7ICA1MTYsICA0ODUgfSwgeyAgNTQ3LCAgNTE2IH0sIHsgIDY0MCwgIDYwOSB9LAotICAgIHsgIDY0MCwgIDY0MCB9LCB7ICAgMjEsICAgMjEgfSwgeyAgIDUyLCAgIDIxIH0sIHsgICA4MywgICA1MiB9LAotICAgIHsgIDE0NSwgIDExNCB9LCB7ICAxNzYsICAxNDUgfSwgeyAgMjA3LCAgMTc2IH0sIHsgIDI2OSwgIDIzOCB9LAotICAgIHsgIDMwMCwgIDI2OSB9LCB7ICAzMzEsICAzMDAgfSwgeyAgMzkzLCAgMzYyIH0sIHsgIDQyNCwgIDM5MyB9LAotICAgIHsgIDQ1NSwgIDQyNCB9LCB7ICA1MTcsICA0ODYgfSwgeyAgNTQ4LCAgNTE3IH0sIHsgIDU3OSwgIDU0OCB9LAotICAgIHsgIDY0MSwgIDYxMCB9LCB7ICA2NzIsICA2NDEgfSwgeyAgNjcyLCAgNjcyIH0sIHsgICAyMiwgICAyMiB9LAotICAgIHsgICA1MywgICAyMiB9LCB7ICAgODQsICAgNTMgfSwgeyAgMTE1LCAgIDg0IH0sIHsgIDE0NiwgIDExNSB9LAotICAgIHsgIDE3NywgIDE0NiB9LCB7ICAyMDgsICAxNzcgfSwgeyAgMjM5LCAgMjA4IH0sIHsgIDI3MCwgIDIzOSB9LAotICAgIHsgIDMwMSwgIDI3MCB9LCB7ICAzMzIsICAzMDEgfSwgeyAgMzYzLCAgMzMyIH0sIHsgIDM5NCwgIDM2MyB9LAotICAgIHsgIDQyNSwgIDM5NCB9LCB7ICA0NTYsICA0MjUgfSwgeyAgNDg3LCAgNDU2IH0sIHsgIDUxOCwgIDQ4NyB9LAotICAgIHsgIDU0OSwgIDUxOCB9LCB7ICA1ODAsICA1NDkgfSwgeyAgNjExLCAgNTgwIH0sIHsgIDY0MiwgIDYxMSB9LAotICAgIHsgIDY3MywgIDY0MiB9LCB7ICA3MDQsICA2NzMgfSwgeyAgNzA0LCAgNzA0IH0sIHsgICA1NCwgICAyMyB9LAotICAgIHsgICA4NSwgICA1NCB9LCB7ICAxMTYsICAgODUgfSwgeyAgMTc4LCAgMTQ3IH0sIHsgIDIwOSwgIDE3OCB9LAotICAgIHsgIDI0MCwgIDIwOSB9LCB7ICAzMDIsICAyNzEgfSwgeyAgMzMzLCAgMzAyIH0sIHsgIDM2NCwgIDMzMyB9LAotICAgIHsgIDQyNiwgIDM5NSB9LCB7ICA0NTcsICA0MjYgfSwgeyAgNDg4LCAgNDU3IH0sIHsgIDU1MCwgIDUxOSB9LAotICAgIHsgIDU4MSwgIDU1MCB9LCB7ICA2MTIsICA1ODEgfSwgeyAgNjc0LCAgNjQzIH0sIHsgIDcwNSwgIDY3NCB9LAotICAgIHsgIDczNiwgIDcwNSB9LCB7ICAgODYsICAgNTUgfSwgeyAgMTE3LCAgIDg2IH0sIHsgIDIxMCwgIDE3OSB9LAotICAgIHsgIDI0MSwgIDIxMCB9LCB7ICAzMzQsICAzMDMgfSwgeyAgMzY1LCAgMzM0IH0sIHsgIDQ1OCwgIDQyNyB9LAotICAgIHsgIDQ4OSwgIDQ1OCB9LCB7ICA1ODIsICA1NTEgfSwgeyAgNjEzLCAgNTgyIH0sIHsgIDcwNiwgIDY3NSB9LAotICAgIHsgIDczNywgIDcwNiB9LCB7ICAxMTgsICAgODcgfSwgeyAgMjQyLCAgMjExIH0sIHsgIDM2NiwgIDMzNSB9LAotICAgIHsgIDQ5MCwgIDQ1OSB9LCB7ICA2MTQsICA1ODMgfSwgeyAgNzM4LCAgNzA3IH0sIHsgICAyMywgICAyMyB9LAotICAgIHsgIDE0NywgIDExNiB9LCB7ICAyNzEsICAyNDAgfSwgeyAgMzk1LCAgMzY0IH0sIHsgIDUxOSwgIDQ4OCB9LAotICAgIHsgIDY0MywgIDYxMiB9LCB7ICA3MzYsICA3MzYgfSwgeyAgIDI0LCAgIDI0IH0sIHsgICA1NSwgICAyNCB9LAotICAgIHsgIDE0OCwgIDExNyB9LCB7ICAxNzksICAxNDggfSwgeyAgMjcyLCAgMjQxIH0sIHsgIDMwMywgIDI3MiB9LAotICAgIHsgIDM5NiwgIDM2NSB9LCB7ICA0MjcsICAzOTYgfSwgeyAgNTIwLCAgNDg5IH0sIHsgIDU1MSwgIDUyMCB9LAotICAgIHsgIDY0NCwgIDYxMyB9LCB7ICA2NzUsICA2NDQgfSwgeyAgNzY4LCAgNzM3IH0sIHsgIDc2OCwgIDc2OCB9LAotICAgIHsgICAyNSwgICAyNSB9LCB7ICAgNTYsICAgMjUgfSwgeyAgIDg3LCAgIDU2IH0sIHsgIDE0OSwgIDExOCB9LAotICAgIHsgIDE4MCwgIDE0OSB9LCB7ICAyMTEsICAxODAgfSwgeyAgMjczLCAgMjQyIH0sIHsgIDMwNCwgIDI3MyB9LAotICAgIHsgIDMzNSwgIDMwNCB9LCB7ICAzOTcsICAzNjYgfSwgeyAgNDI4LCAgMzk3IH0sIHsgIDQ1OSwgIDQyOCB9LAotICAgIHsgIDUyMSwgIDQ5MCB9LCB7ICA1NTIsICA1MjEgfSwgeyAgNTgzLCAgNTUyIH0sIHsgIDY0NSwgIDYxNCB9LAotICAgIHsgIDY3NiwgIDY0NSB9LCB7ICA3MDcsICA2NzYgfSwgeyAgNzY5LCAgNzM4IH0sIHsgIDgwMCwgIDc2OSB9LAotICAgIHsgIDgwMCwgIDgwMCB9LCB7ICAgMjYsICAgMjYgfSwgeyAgIDU3LCAgIDI2IH0sIHsgICA4OCwgICA1NyB9LAotICAgIHsgIDExOSwgICA4OCB9LCB7ICAxNTAsICAxMTkgfSwgeyAgMTgxLCAgMTUwIH0sIHsgIDIxMiwgIDE4MSB9LAotICAgIHsgIDI0MywgIDIxMiB9LCB7ICAyNzQsICAyNDMgfSwgeyAgMzA1LCAgMjc0IH0sIHsgIDMzNiwgIDMwNSB9LAotICAgIHsgIDM2NywgIDMzNiB9LCB7ICAzOTgsICAzNjcgfSwgeyAgNDI5LCAgMzk4IH0sIHsgIDQ2MCwgIDQyOSB9LAotICAgIHsgIDQ5MSwgIDQ2MCB9LCB7ICA1MjIsICA0OTEgfSwgeyAgNTUzLCAgNTIyIH0sIHsgIDU4NCwgIDU1MyB9LAotICAgIHsgIDYxNSwgIDU4NCB9LCB7ICA2NDYsICA2MTUgfSwgeyAgNjc3LCAgNjQ2IH0sIHsgIDcwOCwgIDY3NyB9LAotICAgIHsgIDczOSwgIDcwOCB9LCB7ICA3NzAsICA3MzkgfSwgeyAgODAxLCAgNzcwIH0sIHsgIDgzMiwgIDgwMSB9LAotICAgIHsgIDgzMiwgIDgzMiB9LCB7ICAgNTgsICAgMjcgfSwgeyAgIDg5LCAgIDU4IH0sIHsgIDEyMCwgICA4OSB9LAotICAgIHsgIDE4MiwgIDE1MSB9LCB7ICAyMTMsICAxODIgfSwgeyAgMjQ0LCAgMjEzIH0sIHsgIDMwNiwgIDI3NSB9LAotICAgIHsgIDMzNywgIDMwNiB9LCB7ICAzNjgsICAzMzcgfSwgeyAgNDMwLCAgMzk5IH0sIHsgIDQ2MSwgIDQzMCB9LAotICAgIHsgIDQ5MiwgIDQ2MSB9LCB7ICA1NTQsICA1MjMgfSwgeyAgNTg1LCAgNTU0IH0sIHsgIDYxNiwgIDU4NSB9LAotICAgIHsgIDY3OCwgIDY0NyB9LCB7ICA3MDksICA2NzggfSwgeyAgNzQwLCAgNzA5IH0sIHsgIDgwMiwgIDc3MSB9LAotICAgIHsgIDgzMywgIDgwMiB9LCB7ICA4NjQsICA4MzMgfSwgeyAgIDkwLCAgIDU5IH0sIHsgIDEyMSwgICA5MCB9LAotICAgIHsgIDIxNCwgIDE4MyB9LCB7ICAyNDUsICAyMTQgfSwgeyAgMzM4LCAgMzA3IH0sIHsgIDM2OSwgIDMzOCB9LAotICAgIHsgIDQ2MiwgIDQzMSB9LCB7ICA0OTMsICA0NjIgfSwgeyAgNTg2LCAgNTU1IH0sIHsgIDYxNywgIDU4NiB9LAotICAgIHsgIDcxMCwgIDY3OSB9LCB7ICA3NDEsICA3MTAgfSwgeyAgODM0LCAgODAzIH0sIHsgIDg2NSwgIDgzNCB9LAotICAgIHsgIDEyMiwgICA5MSB9LCB7ICAyNDYsICAyMTUgfSwgeyAgMzcwLCAgMzM5IH0sIHsgIDQ5NCwgIDQ2MyB9LAotICAgIHsgIDYxOCwgIDU4NyB9LCB7ICA3NDIsICA3MTEgfSwgeyAgODY2LCAgODM1IH0sIHsgICAyNywgICAyNyB9LAotICAgIHsgIDE1MSwgIDEyMCB9LCB7ICAyNzUsICAyNDQgfSwgeyAgMzk5LCAgMzY4IH0sIHsgIDUyMywgIDQ5MiB9LAotICAgIHsgIDY0NywgIDYxNiB9LCB7ICA3NzEsICA3NDAgfSwgeyAgODY0LCAgODY0IH0sIHsgICAyOCwgICAyOCB9LAotICAgIHsgICA1OSwgICAyOCB9LCB7ICAxNTIsICAxMjEgfSwgeyAgMTgzLCAgMTUyIH0sIHsgIDI3NiwgIDI0NSB9LAotICAgIHsgIDMwNywgIDI3NiB9LCB7ICA0MDAsICAzNjkgfSwgeyAgNDMxLCAgNDAwIH0sIHsgIDUyNCwgIDQ5MyB9LAotICAgIHsgIDU1NSwgIDUyNCB9LCB7ICA2NDgsICA2MTcgfSwgeyAgNjc5LCAgNjQ4IH0sIHsgIDc3MiwgIDc0MSB9LAotICAgIHsgIDgwMywgIDc3MiB9LCB7ICA4OTYsICA4NjUgfSwgeyAgODk2LCAgODk2IH0sIHsgICAyOSwgICAyOSB9LAotICAgIHsgICA2MCwgICAyOSB9LCB7ICAgOTEsICAgNjAgfSwgeyAgMTUzLCAgMTIyIH0sIHsgIDE4NCwgIDE1MyB9LAotICAgIHsgIDIxNSwgIDE4NCB9LCB7ICAyNzcsICAyNDYgfSwgeyAgMzA4LCAgMjc3IH0sIHsgIDMzOSwgIDMwOCB9LAotICAgIHsgIDQwMSwgIDM3MCB9LCB7ICA0MzIsICA0MDEgfSwgeyAgNDYzLCAgNDMyIH0sIHsgIDUyNSwgIDQ5NCB9LAotICAgIHsgIDU1NiwgIDUyNSB9LCB7ICA1ODcsICA1NTYgfSwgeyAgNjQ5LCAgNjE4IH0sIHsgIDY4MCwgIDY0OSB9LAotICAgIHsgIDcxMSwgIDY4MCB9LCB7ICA3NzMsICA3NDIgfSwgeyAgODA0LCAgNzczIH0sIHsgIDgzNSwgIDgwNCB9LAotICAgIHsgIDg5NywgIDg2NiB9LCB7ICA5MjgsICA4OTcgfSwgeyAgOTI4LCAgOTI4IH0sIHsgICAzMCwgICAzMCB9LAotICAgIHsgICA2MSwgICAzMCB9LCB7ICAgOTIsICAgNjEgfSwgeyAgMTIzLCAgIDkyIH0sIHsgIDE1NCwgIDEyMyB9LAotICAgIHsgIDE4NSwgIDE1NCB9LCB7ICAyMTYsICAxODUgfSwgeyAgMjQ3LCAgMjE2IH0sIHsgIDI3OCwgIDI0NyB9LAotICAgIHsgIDMwOSwgIDI3OCB9LCB7ICAzNDAsICAzMDkgfSwgeyAgMzcxLCAgMzQwIH0sIHsgIDQwMiwgIDM3MSB9LAotICAgIHsgIDQzMywgIDQwMiB9LCB7ICA0NjQsICA0MzMgfSwgeyAgNDk1LCAgNDY0IH0sIHsgIDUyNiwgIDQ5NSB9LAotICAgIHsgIDU1NywgIDUyNiB9LCB7ICA1ODgsICA1NTcgfSwgeyAgNjE5LCAgNTg4IH0sIHsgIDY1MCwgIDYxOSB9LAotICAgIHsgIDY4MSwgIDY1MCB9LCB7ICA3MTIsICA2ODEgfSwgeyAgNzQzLCAgNzEyIH0sIHsgIDc3NCwgIDc0MyB9LAotICAgIHsgIDgwNSwgIDc3NCB9LCB7ICA4MzYsICA4MDUgfSwgeyAgODY3LCAgODM2IH0sIHsgIDg5OCwgIDg2NyB9LAotICAgIHsgIDkyOSwgIDg5OCB9LCB7ICA5NjAsICA5MjkgfSwgeyAgOTYwLCAgOTYwIH0sIHsgICA2MiwgICAzMSB9LAotICAgIHsgICA5MywgICA2MiB9LCB7ICAxMjQsICAgOTMgfSwgeyAgMTg2LCAgMTU1IH0sIHsgIDIxNywgIDE4NiB9LAotICAgIHsgIDI0OCwgIDIxNyB9LCB7ICAzMTAsICAyNzkgfSwgeyAgMzQxLCAgMzEwIH0sIHsgIDM3MiwgIDM0MSB9LAotICAgIHsgIDQzNCwgIDQwMyB9LCB7ICA0NjUsICA0MzQgfSwgeyAgNDk2LCAgNDY1IH0sIHsgIDU1OCwgIDUyNyB9LAotICAgIHsgIDU4OSwgIDU1OCB9LCB7ICA2MjAsICA1ODkgfSwgeyAgNjgyLCAgNjUxIH0sIHsgIDcxMywgIDY4MiB9LAotICAgIHsgIDc0NCwgIDcxMyB9LCB7ICA4MDYsICA3NzUgfSwgeyAgODM3LCAgODA2IH0sIHsgIDg2OCwgIDgzNyB9LAotICAgIHsgIDkzMCwgIDg5OSB9LCB7ICA5NjEsICA5MzAgfSwgeyAgOTkyLCAgOTYxIH0sIHsgICA5NCwgICA2MyB9LAotICAgIHsgIDEyNSwgICA5NCB9LCB7ICAyMTgsICAxODcgfSwgeyAgMjQ5LCAgMjE4IH0sIHsgIDM0MiwgIDMxMSB9LAotICAgIHsgIDM3MywgIDM0MiB9LCB7ICA0NjYsICA0MzUgfSwgeyAgNDk3LCAgNDY2IH0sIHsgIDU5MCwgIDU1OSB9LAotICAgIHsgIDYyMSwgIDU5MCB9LCB7ICA3MTQsICA2ODMgfSwgeyAgNzQ1LCAgNzE0IH0sIHsgIDgzOCwgIDgwNyB9LAotICAgIHsgIDg2OSwgIDgzOCB9LCB7ICA5NjIsICA5MzEgfSwgeyAgOTkzLCAgOTYyIH0sIHsgIDEyNiwgICA5NSB9LAotICAgIHsgIDI1MCwgIDIxOSB9LCB7ICAzNzQsICAzNDMgfSwgeyAgNDk4LCAgNDY3IH0sIHsgIDYyMiwgIDU5MSB9LAotICAgIHsgIDc0NiwgIDcxNSB9LCB7ICA4NzAsICA4MzkgfSwgeyAgOTk0LCAgOTYzIH0sIHsgIDE1NSwgIDEyNCB9LAotICAgIHsgIDI3OSwgIDI0OCB9LCB7ICA0MDMsICAzNzIgfSwgeyAgNTI3LCAgNDk2IH0sIHsgIDY1MSwgIDYyMCB9LAotICAgIHsgIDc3NSwgIDc0NCB9LCB7ICA4OTksICA4NjggfSwgeyAgMTU2LCAgMTI1IH0sIHsgIDE4NywgIDE1NiB9LAotICAgIHsgIDI4MCwgIDI0OSB9LCB7ICAzMTEsICAyODAgfSwgeyAgNDA0LCAgMzczIH0sIHsgIDQzNSwgIDQwNCB9LAotICAgIHsgIDUyOCwgIDQ5NyB9LCB7ICA1NTksICA1MjggfSwgeyAgNjUyLCAgNjIxIH0sIHsgIDY4MywgIDY1MiB9LAotICAgIHsgIDc3NiwgIDc0NSB9LCB7ICA4MDcsICA3NzYgfSwgeyAgOTAwLCAgODY5IH0sIHsgIDkzMSwgIDkwMCB9LAotICAgIHsgIDE1NywgIDEyNiB9LCB7ICAxODgsICAxNTcgfSwgeyAgMjE5LCAgMTg4IH0sIHsgIDI4MSwgIDI1MCB9LAotICAgIHsgIDMxMiwgIDI4MSB9LCB7ICAzNDMsICAzMTIgfSwgeyAgNDA1LCAgMzc0IH0sIHsgIDQzNiwgIDQwNSB9LAotICAgIHsgIDQ2NywgIDQzNiB9LCB7ICA1MjksICA0OTggfSwgeyAgNTYwLCAgNTI5IH0sIHsgIDU5MSwgIDU2MCB9LAotICAgIHsgIDY1MywgIDYyMiB9LCB7ICA2ODQsICA2NTMgfSwgeyAgNzE1LCAgNjg0IH0sIHsgIDc3NywgIDc0NiB9LAotICAgIHsgIDgwOCwgIDc3NyB9LCB7ICA4MzksICA4MDggfSwgeyAgOTAxLCAgODcwIH0sIHsgIDkzMiwgIDkwMSB9LAotICAgIHsgIDk2MywgIDkzMiB9LCB7ICAxNTgsICAxMjcgfSwgeyAgMTg5LCAgMTU4IH0sIHsgIDIyMCwgIDE4OSB9LAotICAgIHsgIDI1MSwgIDIyMCB9LCB7ICAyODIsICAyNTEgfSwgeyAgMzEzLCAgMjgyIH0sIHsgIDM0NCwgIDMxMyB9LAotICAgIHsgIDM3NSwgIDM0NCB9LCB7ICA0MDYsICAzNzUgfSwgeyAgNDM3LCAgNDA2IH0sIHsgIDQ2OCwgIDQzNyB9LAotICAgIHsgIDQ5OSwgIDQ2OCB9LCB7ICA1MzAsICA0OTkgfSwgeyAgNTYxLCAgNTMwIH0sIHsgIDU5MiwgIDU2MSB9LAotICAgIHsgIDYyMywgIDU5MiB9LCB7ICA2NTQsICA2MjMgfSwgeyAgNjg1LCAgNjU0IH0sIHsgIDcxNiwgIDY4NSB9LAotICAgIHsgIDc0NywgIDcxNiB9LCB7ICA3NzgsICA3NDcgfSwgeyAgODA5LCAgNzc4IH0sIHsgIDg0MCwgIDgwOSB9LAotICAgIHsgIDg3MSwgIDg0MCB9LCB7ICA5MDIsICA4NzEgfSwgeyAgOTMzLCAgOTAyIH0sIHsgIDk2NCwgIDkzMyB9LAotICAgIHsgIDk5NSwgIDk2NCB9LCB7ICAxOTAsICAxNTkgfSwgeyAgMjIxLCAgMTkwIH0sIHsgIDI1MiwgIDIyMSB9LAotICAgIHsgIDMxNCwgIDI4MyB9LCB7ICAzNDUsICAzMTQgfSwgeyAgMzc2LCAgMzQ1IH0sIHsgIDQzOCwgIDQwNyB9LAotICAgIHsgIDQ2OSwgIDQzOCB9LCB7ICA1MDAsICA0NjkgfSwgeyAgNTYyLCAgNTMxIH0sIHsgIDU5MywgIDU2MiB9LAotICAgIHsgIDYyNCwgIDU5MyB9LCB7ICA2ODYsICA2NTUgfSwgeyAgNzE3LCAgNjg2IH0sIHsgIDc0OCwgIDcxNyB9LAotICAgIHsgIDgxMCwgIDc3OSB9LCB7ICA4NDEsICA4MTAgfSwgeyAgODcyLCAgODQxIH0sIHsgIDkzNCwgIDkwMyB9LAotICAgIHsgIDk2NSwgIDkzNCB9LCB7ICA5OTYsICA5NjUgfSwgeyAgMjIyLCAgMTkxIH0sIHsgIDI1MywgIDIyMiB9LAotICAgIHsgIDM0NiwgIDMxNSB9LCB7ICAzNzcsICAzNDYgfSwgeyAgNDcwLCAgNDM5IH0sIHsgIDUwMSwgIDQ3MCB9LAotICAgIHsgIDU5NCwgIDU2MyB9LCB7ICA2MjUsICA1OTQgfSwgeyAgNzE4LCAgNjg3IH0sIHsgIDc0OSwgIDcxOCB9LAotICAgIHsgIDg0MiwgIDgxMSB9LCB7ICA4NzMsICA4NDIgfSwgeyAgOTY2LCAgOTM1IH0sIHsgIDk5NywgIDk2NiB9LAotICAgIHsgIDI1NCwgIDIyMyB9LCB7ICAzNzgsICAzNDcgfSwgeyAgNTAyLCAgNDcxIH0sIHsgIDYyNiwgIDU5NSB9LAotICAgIHsgIDc1MCwgIDcxOSB9LCB7ICA4NzQsICA4NDMgfSwgeyAgOTk4LCAgOTY3IH0sIHsgIDI4MywgIDI1MiB9LAotICAgIHsgIDQwNywgIDM3NiB9LCB7ICA1MzEsICA1MDAgfSwgeyAgNjU1LCAgNjI0IH0sIHsgIDc3OSwgIDc0OCB9LAotICAgIHsgIDkwMywgIDg3MiB9LCB7ICAyODQsICAyNTMgfSwgeyAgMzE1LCAgMjg0IH0sIHsgIDQwOCwgIDM3NyB9LAotICAgIHsgIDQzOSwgIDQwOCB9LCB7ICA1MzIsICA1MDEgfSwgeyAgNTYzLCAgNTMyIH0sIHsgIDY1NiwgIDYyNSB9LAotICAgIHsgIDY4NywgIDY1NiB9LCB7ICA3ODAsICA3NDkgfSwgeyAgODExLCAgNzgwIH0sIHsgIDkwNCwgIDg3MyB9LAotICAgIHsgIDkzNSwgIDkwNCB9LCB7ICAyODUsICAyNTQgfSwgeyAgMzE2LCAgMjg1IH0sIHsgIDM0NywgIDMxNiB9LAotICAgIHsgIDQwOSwgIDM3OCB9LCB7ICA0NDAsICA0MDkgfSwgeyAgNDcxLCAgNDQwIH0sIHsgIDUzMywgIDUwMiB9LAotICAgIHsgIDU2NCwgIDUzMyB9LCB7ICA1OTUsICA1NjQgfSwgeyAgNjU3LCAgNjI2IH0sIHsgIDY4OCwgIDY1NyB9LAotICAgIHsgIDcxOSwgIDY4OCB9LCB7ICA3ODEsICA3NTAgfSwgeyAgODEyLCAgNzgxIH0sIHsgIDg0MywgIDgxMiB9LAotICAgIHsgIDkwNSwgIDg3NCB9LCB7ICA5MzYsICA5MDUgfSwgeyAgOTY3LCAgOTM2IH0sIHsgIDI4NiwgIDI1NSB9LAotICAgIHsgIDMxNywgIDI4NiB9LCB7ICAzNDgsICAzMTcgfSwgeyAgMzc5LCAgMzQ4IH0sIHsgIDQxMCwgIDM3OSB9LAotICAgIHsgIDQ0MSwgIDQxMCB9LCB7ICA0NzIsICA0NDEgfSwgeyAgNTAzLCAgNDcyIH0sIHsgIDUzNCwgIDUwMyB9LAotICAgIHsgIDU2NSwgIDUzNCB9LCB7ICA1OTYsICA1NjUgfSwgeyAgNjI3LCAgNTk2IH0sIHsgIDY1OCwgIDYyNyB9LAotICAgIHsgIDY4OSwgIDY1OCB9LCB7ICA3MjAsICA2ODkgfSwgeyAgNzUxLCAgNzIwIH0sIHsgIDc4MiwgIDc1MSB9LAotICAgIHsgIDgxMywgIDc4MiB9LCB7ICA4NDQsICA4MTMgfSwgeyAgODc1LCAgODQ0IH0sIHsgIDkwNiwgIDg3NSB9LAotICAgIHsgIDkzNywgIDkwNiB9LCB7ICA5NjgsICA5MzcgfSwgeyAgOTk5LCAgOTY4IH0sIHsgIDMxOCwgIDI4NyB9LAotICAgIHsgIDM0OSwgIDMxOCB9LCB7ICAzODAsICAzNDkgfSwgeyAgNDQyLCAgNDExIH0sIHsgIDQ3MywgIDQ0MiB9LAotICAgIHsgIDUwNCwgIDQ3MyB9LCB7ICA1NjYsICA1MzUgfSwgeyAgNTk3LCAgNTY2IH0sIHsgIDYyOCwgIDU5NyB9LAotICAgIHsgIDY5MCwgIDY1OSB9LCB7ICA3MjEsICA2OTAgfSwgeyAgNzUyLCAgNzIxIH0sIHsgIDgxNCwgIDc4MyB9LAotICAgIHsgIDg0NSwgIDgxNCB9LCB7ICA4NzYsICA4NDUgfSwgeyAgOTM4LCAgOTA3IH0sIHsgIDk2OSwgIDkzOCB9LAotICAgIHsgMTAwMCwgIDk2OSB9LCB7ICAzNTAsICAzMTkgfSwgeyAgMzgxLCAgMzUwIH0sIHsgIDQ3NCwgIDQ0MyB9LAotICAgIHsgIDUwNSwgIDQ3NCB9LCB7ICA1OTgsICA1NjcgfSwgeyAgNjI5LCAgNTk4IH0sIHsgIDcyMiwgIDY5MSB9LAotICAgIHsgIDc1MywgIDcyMiB9LCB7ICA4NDYsICA4MTUgfSwgeyAgODc3LCAgODQ2IH0sIHsgIDk3MCwgIDkzOSB9LAotICAgIHsgMTAwMSwgIDk3MCB9LCB7ICAzODIsICAzNTEgfSwgeyAgNTA2LCAgNDc1IH0sIHsgIDYzMCwgIDU5OSB9LAotICAgIHsgIDc1NCwgIDcyMyB9LCB7ICA4NzgsICA4NDcgfSwgeyAxMDAyLCAgOTcxIH0sIHsgIDQxMSwgIDM4MCB9LAotICAgIHsgIDUzNSwgIDUwNCB9LCB7ICA2NTksICA2MjggfSwgeyAgNzgzLCAgNzUyIH0sIHsgIDkwNywgIDg3NiB9LAotICAgIHsgIDQxMiwgIDM4MSB9LCB7ICA0NDMsICA0MTIgfSwgeyAgNTM2LCAgNTA1IH0sIHsgIDU2NywgIDUzNiB9LAotICAgIHsgIDY2MCwgIDYyOSB9LCB7ICA2OTEsICA2NjAgfSwgeyAgNzg0LCAgNzUzIH0sIHsgIDgxNSwgIDc4NCB9LAotICAgIHsgIDkwOCwgIDg3NyB9LCB7ICA5MzksICA5MDggfSwgeyAgNDEzLCAgMzgyIH0sIHsgIDQ0NCwgIDQxMyB9LAotICAgIHsgIDQ3NSwgIDQ0NCB9LCB7ICA1MzcsICA1MDYgfSwgeyAgNTY4LCAgNTM3IH0sIHsgIDU5OSwgIDU2OCB9LAotICAgIHsgIDY2MSwgIDYzMCB9LCB7ICA2OTIsICA2NjEgfSwgeyAgNzIzLCAgNjkyIH0sIHsgIDc4NSwgIDc1NCB9LAotICAgIHsgIDgxNiwgIDc4NSB9LCB7ICA4NDcsICA4MTYgfSwgeyAgOTA5LCAgODc4IH0sIHsgIDk0MCwgIDkwOSB9LAotICAgIHsgIDk3MSwgIDk0MCB9LCB7ICA0MTQsICAzODMgfSwgeyAgNDQ1LCAgNDE0IH0sIHsgIDQ3NiwgIDQ0NSB9LAotICAgIHsgIDUwNywgIDQ3NiB9LCB7ICA1MzgsICA1MDcgfSwgeyAgNTY5LCAgNTM4IH0sIHsgIDYwMCwgIDU2OSB9LAotICAgIHsgIDYzMSwgIDYwMCB9LCB7ICA2NjIsICA2MzEgfSwgeyAgNjkzLCAgNjYyIH0sIHsgIDcyNCwgIDY5MyB9LAotICAgIHsgIDc1NSwgIDcyNCB9LCB7ICA3ODYsICA3NTUgfSwgeyAgODE3LCAgNzg2IH0sIHsgIDg0OCwgIDgxNyB9LAotICAgIHsgIDg3OSwgIDg0OCB9LCB7ICA5MTAsICA4NzkgfSwgeyAgOTQxLCAgOTEwIH0sIHsgIDk3MiwgIDk0MSB9LAotICAgIHsgMTAwMywgIDk3MiB9LCB7ICA0NDYsICA0MTUgfSwgeyAgNDc3LCAgNDQ2IH0sIHsgIDUwOCwgIDQ3NyB9LAotICAgIHsgIDU3MCwgIDUzOSB9LCB7ICA2MDEsICA1NzAgfSwgeyAgNjMyLCAgNjAxIH0sIHsgIDY5NCwgIDY2MyB9LAotICAgIHsgIDcyNSwgIDY5NCB9LCB7ICA3NTYsICA3MjUgfSwgeyAgODE4LCAgNzg3IH0sIHsgIDg0OSwgIDgxOCB9LAotICAgIHsgIDg4MCwgIDg0OSB9LCB7ICA5NDIsICA5MTEgfSwgeyAgOTczLCAgOTQyIH0sIHsgMTAwNCwgIDk3MyB9LAotICAgIHsgIDQ3OCwgIDQ0NyB9LCB7ICA1MDksICA0NzggfSwgeyAgNjAyLCAgNTcxIH0sIHsgIDYzMywgIDYwMiB9LAotICAgIHsgIDcyNiwgIDY5NSB9LCB7ICA3NTcsICA3MjYgfSwgeyAgODUwLCAgODE5IH0sIHsgIDg4MSwgIDg1MCB9LAotICAgIHsgIDk3NCwgIDk0MyB9LCB7IDEwMDUsICA5NzQgfSwgeyAgNTEwLCAgNDc5IH0sIHsgIDYzNCwgIDYwMyB9LAotICAgIHsgIDc1OCwgIDcyNyB9LCB7ICA4ODIsICA4NTEgfSwgeyAxMDA2LCAgOTc1IH0sIHsgIDUzOSwgIDUwOCB9LAotICAgIHsgIDY2MywgIDYzMiB9LCB7ICA3ODcsICA3NTYgfSwgeyAgOTExLCAgODgwIH0sIHsgIDU0MCwgIDUwOSB9LAotICAgIHsgIDU3MSwgIDU0MCB9LCB7ICA2NjQsICA2MzMgfSwgeyAgNjk1LCAgNjY0IH0sIHsgIDc4OCwgIDc1NyB9LAotICAgIHsgIDgxOSwgIDc4OCB9LCB7ICA5MTIsICA4ODEgfSwgeyAgOTQzLCAgOTEyIH0sIHsgIDU0MSwgIDUxMCB9LAotICAgIHsgIDU3MiwgIDU0MSB9LCB7ICA2MDMsICA1NzIgfSwgeyAgNjY1LCAgNjM0IH0sIHsgIDY5NiwgIDY2NSB9LAotICAgIHsgIDcyNywgIDY5NiB9LCB7ICA3ODksICA3NTggfSwgeyAgODIwLCAgNzg5IH0sIHsgIDg1MSwgIDgyMCB9LAotICAgIHsgIDkxMywgIDg4MiB9LCB7ICA5NDQsICA5MTMgfSwgeyAgOTc1LCAgOTQ0IH0sIHsgIDU0MiwgIDUxMSB9LAotICAgIHsgIDU3MywgIDU0MiB9LCB7ICA2MDQsICA1NzMgfSwgeyAgNjM1LCAgNjA0IH0sIHsgIDY2NiwgIDYzNSB9LAotICAgIHsgIDY5NywgIDY2NiB9LCB7ICA3MjgsICA2OTcgfSwgeyAgNzU5LCAgNzI4IH0sIHsgIDc5MCwgIDc1OSB9LAotICAgIHsgIDgyMSwgIDc5MCB9LCB7ICA4NTIsICA4MjEgfSwgeyAgODgzLCAgODUyIH0sIHsgIDkxNCwgIDg4MyB9LAotICAgIHsgIDk0NSwgIDkxNCB9LCB7ICA5NzYsICA5NDUgfSwgeyAxMDA3LCAgOTc2IH0sIHsgIDU3NCwgIDU0MyB9LAotICAgIHsgIDYwNSwgIDU3NCB9LCB7ICA2MzYsICA2MDUgfSwgeyAgNjk4LCAgNjY3IH0sIHsgIDcyOSwgIDY5OCB9LAotICAgIHsgIDc2MCwgIDcyOSB9LCB7ICA4MjIsICA3OTEgfSwgeyAgODUzLCAgODIyIH0sIHsgIDg4NCwgIDg1MyB9LAotICAgIHsgIDk0NiwgIDkxNSB9LCB7ICA5NzcsICA5NDYgfSwgeyAxMDA4LCAgOTc3IH0sIHsgIDYwNiwgIDU3NSB9LAotICAgIHsgIDYzNywgIDYwNiB9LCB7ICA3MzAsICA2OTkgfSwgeyAgNzYxLCAgNzMwIH0sIHsgIDg1NCwgIDgyMyB9LAotICAgIHsgIDg4NSwgIDg1NCB9LCB7ICA5NzgsICA5NDcgfSwgeyAxMDA5LCAgOTc4IH0sIHsgIDYzOCwgIDYwNyB9LAotICAgIHsgIDc2MiwgIDczMSB9LCB7ICA4ODYsICA4NTUgfSwgeyAxMDEwLCAgOTc5IH0sIHsgIDY2NywgIDYzNiB9LAotICAgIHsgIDc5MSwgIDc2MCB9LCB7ICA5MTUsICA4ODQgfSwgeyAgNjY4LCAgNjM3IH0sIHsgIDY5OSwgIDY2OCB9LAotICAgIHsgIDc5MiwgIDc2MSB9LCB7ICA4MjMsICA3OTIgfSwgeyAgOTE2LCAgODg1IH0sIHsgIDk0NywgIDkxNiB9LAotICAgIHsgIDY2OSwgIDYzOCB9LCB7ICA3MDAsICA2NjkgfSwgeyAgNzMxLCAgNzAwIH0sIHsgIDc5MywgIDc2MiB9LAotICAgIHsgIDgyNCwgIDc5MyB9LCB7ICA4NTUsICA4MjQgfSwgeyAgOTE3LCAgODg2IH0sIHsgIDk0OCwgIDkxNyB9LAotICAgIHsgIDk3OSwgIDk0OCB9LCB7ICA2NzAsICA2MzkgfSwgeyAgNzAxLCAgNjcwIH0sIHsgIDczMiwgIDcwMSB9LAotICAgIHsgIDc2MywgIDczMiB9LCB7ICA3OTQsICA3NjMgfSwgeyAgODI1LCAgNzk0IH0sIHsgIDg1NiwgIDgyNSB9LAotICAgIHsgIDg4NywgIDg1NiB9LCB7ICA5MTgsICA4ODcgfSwgeyAgOTQ5LCAgOTE4IH0sIHsgIDk4MCwgIDk0OSB9LAotICAgIHsgMTAxMSwgIDk4MCB9LCB7ICA3MDIsICA2NzEgfSwgeyAgNzMzLCAgNzAyIH0sIHsgIDc2NCwgIDczMyB9LAotICAgIHsgIDgyNiwgIDc5NSB9LCB7ICA4NTcsICA4MjYgfSwgeyAgODg4LCAgODU3IH0sIHsgIDk1MCwgIDkxOSB9LAotICAgIHsgIDk4MSwgIDk1MCB9LCB7IDEwMTIsICA5ODEgfSwgeyAgNzM0LCAgNzAzIH0sIHsgIDc2NSwgIDczNCB9LAotICAgIHsgIDg1OCwgIDgyNyB9LCB7ICA4ODksICA4NTggfSwgeyAgOTgyLCAgOTUxIH0sIHsgMTAxMywgIDk4MiB9LAotICAgIHsgIDc2NiwgIDczNSB9LCB7ICA4OTAsICA4NTkgfSwgeyAxMDE0LCAgOTgzIH0sIHsgIDc5NSwgIDc2NCB9LAotICAgIHsgIDkxOSwgIDg4OCB9LCB7ICA3OTYsICA3NjUgfSwgeyAgODI3LCAgNzk2IH0sIHsgIDkyMCwgIDg4OSB9LAotICAgIHsgIDk1MSwgIDkyMCB9LCB7ICA3OTcsICA3NjYgfSwgeyAgODI4LCAgNzk3IH0sIHsgIDg1OSwgIDgyOCB9LAotICAgIHsgIDkyMSwgIDg5MCB9LCB7ICA5NTIsICA5MjEgfSwgeyAgOTgzLCAgOTUyIH0sIHsgIDc5OCwgIDc2NyB9LAotICAgIHsgIDgyOSwgIDc5OCB9LCB7ICA4NjAsICA4MjkgfSwgeyAgODkxLCAgODYwIH0sIHsgIDkyMiwgIDg5MSB9LAotICAgIHsgIDk1MywgIDkyMiB9LCB7ICA5ODQsICA5NTMgfSwgeyAxMDE1LCAgOTg0IH0sIHsgIDgzMCwgIDc5OSB9LAotICAgIHsgIDg2MSwgIDgzMCB9LCB7ICA4OTIsICA4NjEgfSwgeyAgOTU0LCAgOTIzIH0sIHsgIDk4NSwgIDk1NCB9LAotICAgIHsgMTAxNiwgIDk4NSB9LCB7ICA4NjIsICA4MzEgfSwgeyAgODkzLCAgODYyIH0sIHsgIDk4NiwgIDk1NSB9LAotICAgIHsgMTAxNywgIDk4NiB9LCB7ICA4OTQsICA4NjMgfSwgeyAxMDE4LCAgOTg3IH0sIHsgIDkyMywgIDg5MiB9LAotICAgIHsgIDkyNCwgIDg5MyB9LCB7ICA5NTUsICA5MjQgfSwgeyAgOTI1LCAgODk0IH0sIHsgIDk1NiwgIDkyNSB9LAotICAgIHsgIDk4NywgIDk1NiB9LCB7ICA5MjYsICA4OTUgfSwgeyAgOTU3LCAgOTI2IH0sIHsgIDk4OCwgIDk1NyB9LAotICAgIHsgMTAxOSwgIDk4OCB9LCB7ICA5NTgsICA5MjcgfSwgeyAgOTg5LCAgOTU4IH0sIHsgMTAyMCwgIDk4OSB9LAotICAgIHsgIDk5MCwgIDk1OSB9LCB7IDEwMjEsICA5OTAgfSwgeyAxMDIyLCAgOTkxIH0sIHsgICAgMCwgICAgMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IGludDE2X3QgKCogY29uc3QgdnA5X3NjYW5zX25iWzVdWzRdKVsyXSA9IHsKLSAgICB7Ci0gICAgICAgIHZwOV9kZWZhdWx0X3NjYW5fNHg0X25iLCB2cDlfY29sX3NjYW5fNHg0X25iLAotICAgICAgICB2cDlfcm93X3NjYW5fNHg0X25iLCB2cDlfZGVmYXVsdF9zY2FuXzR4NF9uYgotICAgIH0sIHsKLSAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl84eDhfbmIsIHZwOV9jb2xfc2Nhbl84eDhfbmIsCi0gICAgICAgIHZwOV9yb3dfc2Nhbl84eDhfbmIsIHZwOV9kZWZhdWx0X3NjYW5fOHg4X25iCi0gICAgfSwgewotICAgICAgICB2cDlfZGVmYXVsdF9zY2FuXzE2eDE2X25iLCB2cDlfY29sX3NjYW5fMTZ4MTZfbmIsCi0gICAgICAgIHZwOV9yb3dfc2Nhbl8xNngxNl9uYiwgdnA5X2RlZmF1bHRfc2Nhbl8xNngxNl9uYgotICAgIH0sIHsKLSAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMl9uYiwgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMl9uYiwKLSAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMl9uYiwgdnA5X2RlZmF1bHRfc2Nhbl8zMngzMl9uYgotICAgIH0sIHsgLy8gbG9zc2xlc3MKLSAgICAgICAgdnA5X2RlZmF1bHRfc2Nhbl80eDRfbmIsIHZwOV9kZWZhdWx0X3NjYW5fNHg0X25iLAotICAgICAgICB2cDlfZGVmYXVsdF9zY2FuXzR4NF9uYiwgdnA5X2RlZmF1bHRfc2Nhbl80eDRfbmIKLSAgICB9Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCB2cDlfbW9kZWxfcGFyZXRvOFsyNTZdWzhdID0gewotICAgIHsgICA2LCAgODYsIDEyOCwgIDExLCAgODcsICA0MiwgIDkxLCAgNTIgfSwKLSAgICB7ICAgMywgIDg2LCAxMjgsICAgNiwgIDg2LCAgMjMsICA4OCwgIDI5IH0sCi0gICAgeyAgIDYsICA4NiwgMTI4LCAgMTEsICA4NywgIDQyLCAgOTEsICA1MiB9LAotICAgIHsgICA5LCAgODYsIDEyOSwgIDE3LCAgODgsICA2MSwgIDk0LCAgNzYgfSwKLSAgICB7ICAxMiwgIDg2LCAxMjksICAyMiwgIDg4LCAgNzcsICA5NywgIDkzIH0sCi0gICAgeyAgMTUsICA4NywgMTI5LCAgMjgsICA4OSwgIDkzLCAxMDAsIDExMCB9LAotICAgIHsgIDE3LCAgODcsIDEyOSwgIDMzLCAgOTAsIDEwNSwgMTAzLCAxMjMgfSwKLSAgICB7ICAyMCwgIDg4LCAxMzAsICAzOCwgIDkxLCAxMTgsIDEwNiwgMTM2IH0sCi0gICAgeyAgMjMsICA4OCwgMTMwLCAgNDMsICA5MSwgMTI4LCAxMDgsIDE0NiB9LAotICAgIHsgIDI2LCAgODksIDEzMSwgIDQ4LCAgOTIsIDEzOSwgMTExLCAxNTYgfSwKLSAgICB7ICAyOCwgIDg5LCAxMzEsICA1MywgIDkzLCAxNDcsIDExNCwgMTYzIH0sCi0gICAgeyAgMzEsICA5MCwgMTMxLCAgNTgsICA5NCwgMTU2LCAxMTcsIDE3MSB9LAotICAgIHsgIDM0LCAgOTAsIDEzMSwgIDYyLCAgOTQsIDE2MywgMTE5LCAxNzcgfSwKLSAgICB7ICAzNywgIDkwLCAxMzIsICA2NiwgIDk1LCAxNzEsIDEyMiwgMTg0IH0sCi0gICAgeyAgMzksICA5MCwgMTMyLCAgNzAsICA5NiwgMTc3LCAxMjQsIDE4OSB9LAotICAgIHsgIDQyLCAgOTEsIDEzMiwgIDc1LCAgOTcsIDE4MywgMTI3LCAxOTQgfSwKLSAgICB7ICA0NCwgIDkxLCAxMzIsICA3OSwgIDk3LCAxODgsIDEyOSwgMTk4IH0sCi0gICAgeyAgNDcsICA5MiwgMTMzLCAgODMsICA5OCwgMTkzLCAxMzIsIDIwMiB9LAotICAgIHsgIDQ5LCAgOTIsIDEzMywgIDg2LCAgOTksIDE5NywgMTM0LCAyMDUgfSwKLSAgICB7ICA1MiwgIDkzLCAxMzMsICA5MCwgMTAwLCAyMDEsIDEzNywgMjA4IH0sCi0gICAgeyAgNTQsICA5MywgMTMzLCAgOTQsIDEwMCwgMjA0LCAxMzksIDIxMSB9LAotICAgIHsgIDU3LCAgOTQsIDEzNCwgIDk4LCAxMDEsIDIwOCwgMTQyLCAyMTQgfSwKLSAgICB7ICA1OSwgIDk0LCAxMzQsIDEwMSwgMTAyLCAyMTEsIDE0NCwgMjE2IH0sCi0gICAgeyAgNjIsICA5NCwgMTM1LCAxMDUsIDEwMywgMjE0LCAxNDYsIDIxOCB9LAotICAgIHsgIDY0LCAgOTQsIDEzNSwgMTA4LCAxMDMsIDIxNiwgMTQ4LCAyMjAgfSwKLSAgICB7ICA2NiwgIDk1LCAxMzUsIDExMSwgMTA0LCAyMTksIDE1MSwgMjIyIH0sCi0gICAgeyAgNjgsICA5NSwgMTM1LCAxMTQsIDEwNSwgMjIxLCAxNTMsIDIyMyB9LAotICAgIHsgIDcxLCAgOTYsIDEzNiwgMTE3LCAxMDYsIDIyNCwgMTU1LCAyMjUgfSwKLSAgICB7ICA3MywgIDk2LCAxMzYsIDEyMCwgMTA2LCAyMjUsIDE1NywgMjI2IH0sCi0gICAgeyAgNzYsICA5NywgMTM2LCAxMjMsIDEwNywgMjI3LCAxNTksIDIyOCB9LAotICAgIHsgIDc4LCAgOTcsIDEzNiwgMTI2LCAxMDgsIDIyOSwgMTYwLCAyMjkgfSwKLSAgICB7ICA4MCwgIDk4LCAxMzcsIDEyOSwgMTA5LCAyMzEsIDE2MiwgMjMxIH0sCi0gICAgeyAgODIsICA5OCwgMTM3LCAxMzEsIDEwOSwgMjMyLCAxNjQsIDIzMiB9LAotICAgIHsgIDg0LCAgOTgsIDEzOCwgMTM0LCAxMTAsIDIzNCwgMTY2LCAyMzMgfSwKLSAgICB7ICA4NiwgIDk4LCAxMzgsIDEzNywgMTExLCAyMzUsIDE2OCwgMjM0IH0sCi0gICAgeyAgODksICA5OSwgMTM4LCAxNDAsIDExMiwgMjM2LCAxNzAsIDIzNSB9LAotICAgIHsgIDkxLCAgOTksIDEzOCwgMTQyLCAxMTIsIDIzNywgMTcxLCAyMzUgfSwKLSAgICB7ICA5MywgMTAwLCAxMzksIDE0NSwgMTEzLCAyMzgsIDE3MywgMjM2IH0sCi0gICAgeyAgOTUsIDEwMCwgMTM5LCAxNDcsIDExNCwgMjM5LCAxNzQsIDIzNyB9LAotICAgIHsgIDk3LCAxMDEsIDE0MCwgMTQ5LCAxMTUsIDI0MCwgMTc2LCAyMzggfSwKLSAgICB7ICA5OSwgMTAxLCAxNDAsIDE1MSwgMTE1LCAyNDEsIDE3NywgMjM4IH0sCi0gICAgeyAxMDEsIDEwMiwgMTQwLCAxNTQsIDExNiwgMjQyLCAxNzksIDIzOSB9LAotICAgIHsgMTAzLCAxMDIsIDE0MCwgMTU2LCAxMTcsIDI0MiwgMTgwLCAyMzkgfSwKLSAgICB7IDEwNSwgMTAzLCAxNDEsIDE1OCwgMTE4LCAyNDMsIDE4MiwgMjQwIH0sCi0gICAgeyAxMDcsIDEwMywgMTQxLCAxNjAsIDExOCwgMjQzLCAxODMsIDI0MCB9LAotICAgIHsgMTA5LCAxMDQsIDE0MSwgMTYyLCAxMTksIDI0NCwgMTg1LCAyNDEgfSwKLSAgICB7IDExMSwgMTA0LCAxNDEsIDE2NCwgMTE5LCAyNDQsIDE4NiwgMjQxIH0sCi0gICAgeyAxMTMsIDEwNCwgMTQyLCAxNjYsIDEyMCwgMjQ1LCAxODcsIDI0MiB9LAotICAgIHsgMTE0LCAxMDQsIDE0MiwgMTY4LCAxMjEsIDI0NSwgMTg4LCAyNDIgfSwKLSAgICB7IDExNiwgMTA1LCAxNDMsIDE3MCwgMTIyLCAyNDYsIDE5MCwgMjQzIH0sCi0gICAgeyAxMTgsIDEwNSwgMTQzLCAxNzEsIDEyMiwgMjQ2LCAxOTEsIDI0MyB9LAotICAgIHsgMTIwLCAxMDYsIDE0MywgMTczLCAxMjMsIDI0NywgMTkyLCAyNDQgfSwKLSAgICB7IDEyMSwgMTA2LCAxNDMsIDE3NSwgMTI0LCAyNDcsIDE5MywgMjQ0IH0sCi0gICAgeyAxMjMsIDEwNywgMTQ0LCAxNzcsIDEyNSwgMjQ4LCAxOTUsIDI0NCB9LAotICAgIHsgMTI1LCAxMDcsIDE0NCwgMTc4LCAxMjUsIDI0OCwgMTk2LCAyNDQgfSwKLSAgICB7IDEyNywgMTA4LCAxNDUsIDE4MCwgMTI2LCAyNDksIDE5NywgMjQ1IH0sCi0gICAgeyAxMjgsIDEwOCwgMTQ1LCAxODEsIDEyNywgMjQ5LCAxOTgsIDI0NSB9LAotICAgIHsgMTMwLCAxMDksIDE0NSwgMTgzLCAxMjgsIDI0OSwgMTk5LCAyNDUgfSwKLSAgICB7IDEzMiwgMTA5LCAxNDUsIDE4NCwgMTI4LCAyNDksIDIwMCwgMjQ1IH0sCi0gICAgeyAxMzQsIDExMCwgMTQ2LCAxODYsIDEyOSwgMjUwLCAyMDEsIDI0NiB9LAotICAgIHsgMTM1LCAxMTAsIDE0NiwgMTg3LCAxMzAsIDI1MCwgMjAyLCAyNDYgfSwKLSAgICB7IDEzNywgMTExLCAxNDcsIDE4OSwgMTMxLCAyNTEsIDIwMywgMjQ2IH0sCi0gICAgeyAxMzgsIDExMSwgMTQ3LCAxOTAsIDEzMSwgMjUxLCAyMDQsIDI0NiB9LAotICAgIHsgMTQwLCAxMTIsIDE0NywgMTkyLCAxMzIsIDI1MSwgMjA1LCAyNDcgfSwKLSAgICB7IDE0MSwgMTEyLCAxNDcsIDE5MywgMTMyLCAyNTEsIDIwNiwgMjQ3IH0sCi0gICAgeyAxNDMsIDExMywgMTQ4LCAxOTQsIDEzMywgMjUxLCAyMDcsIDI0NyB9LAotICAgIHsgMTQ0LCAxMTMsIDE0OCwgMTk1LCAxMzQsIDI1MSwgMjA3LCAyNDcgfSwKLSAgICB7IDE0NiwgMTE0LCAxNDksIDE5NywgMTM1LCAyNTIsIDIwOCwgMjQ4IH0sCi0gICAgeyAxNDcsIDExNCwgMTQ5LCAxOTgsIDEzNSwgMjUyLCAyMDksIDI0OCB9LAotICAgIHsgMTQ5LCAxMTUsIDE0OSwgMTk5LCAxMzYsIDI1MiwgMjEwLCAyNDggfSwKLSAgICB7IDE1MCwgMTE1LCAxNDksIDIwMCwgMTM3LCAyNTIsIDIxMCwgMjQ4IH0sCi0gICAgeyAxNTIsIDExNSwgMTUwLCAyMDEsIDEzOCwgMjUyLCAyMTEsIDI0OCB9LAotICAgIHsgMTUzLCAxMTUsIDE1MCwgMjAyLCAxMzgsIDI1MiwgMjEyLCAyNDggfSwKLSAgICB7IDE1NSwgMTE2LCAxNTEsIDIwNCwgMTM5LCAyNTMsIDIxMywgMjQ5IH0sCi0gICAgeyAxNTYsIDExNiwgMTUxLCAyMDUsIDEzOSwgMjUzLCAyMTMsIDI0OSB9LAotICAgIHsgMTU4LCAxMTcsIDE1MSwgMjA2LCAxNDAsIDI1MywgMjE0LCAyNDkgfSwKLSAgICB7IDE1OSwgMTE3LCAxNTEsIDIwNywgMTQxLCAyNTMsIDIxNSwgMjQ5IH0sCi0gICAgeyAxNjEsIDExOCwgMTUyLCAyMDgsIDE0MiwgMjUzLCAyMTYsIDI0OSB9LAotICAgIHsgMTYyLCAxMTgsIDE1MiwgMjA5LCAxNDIsIDI1MywgMjE2LCAyNDkgfSwKLSAgICB7IDE2MywgMTE5LCAxNTMsIDIxMCwgMTQzLCAyNTMsIDIxNywgMjQ5IH0sCi0gICAgeyAxNjQsIDExOSwgMTUzLCAyMTEsIDE0MywgMjUzLCAyMTcsIDI0OSB9LAotICAgIHsgMTY2LCAxMjAsIDE1MywgMjEyLCAxNDQsIDI1NCwgMjE4LCAyNTAgfSwKLSAgICB7IDE2NywgMTIwLCAxNTMsIDIxMiwgMTQ1LCAyNTQsIDIxOSwgMjUwIH0sCi0gICAgeyAxNjgsIDEyMSwgMTU0LCAyMTMsIDE0NiwgMjU0LCAyMjAsIDI1MCB9LAotICAgIHsgMTY5LCAxMjEsIDE1NCwgMjE0LCAxNDYsIDI1NCwgMjIwLCAyNTAgfSwKLSAgICB7IDE3MSwgMTIyLCAxNTUsIDIxNSwgMTQ3LCAyNTQsIDIyMSwgMjUwIH0sCi0gICAgeyAxNzIsIDEyMiwgMTU1LCAyMTYsIDE0NywgMjU0LCAyMjEsIDI1MCB9LAotICAgIHsgMTczLCAxMjMsIDE1NSwgMjE3LCAxNDgsIDI1NCwgMjIyLCAyNTAgfSwKLSAgICB7IDE3NCwgMTIzLCAxNTUsIDIxNywgMTQ5LCAyNTQsIDIyMiwgMjUwIH0sCi0gICAgeyAxNzYsIDEyNCwgMTU2LCAyMTgsIDE1MCwgMjU0LCAyMjMsIDI1MCB9LAotICAgIHsgMTc3LCAxMjQsIDE1NiwgMjE5LCAxNTAsIDI1NCwgMjIzLCAyNTAgfSwKLSAgICB7IDE3OCwgMTI1LCAxNTcsIDIyMCwgMTUxLCAyNTQsIDIyNCwgMjUxIH0sCi0gICAgeyAxNzksIDEyNSwgMTU3LCAyMjAsIDE1MSwgMjU0LCAyMjQsIDI1MSB9LAotICAgIHsgMTgwLCAxMjYsIDE1NywgMjIxLCAxNTIsIDI1NCwgMjI1LCAyNTEgfSwKLSAgICB7IDE4MSwgMTI2LCAxNTcsIDIyMSwgMTUyLCAyNTQsIDIyNSwgMjUxIH0sCi0gICAgeyAxODMsIDEyNywgMTU4LCAyMjIsIDE1MywgMjU0LCAyMjYsIDI1MSB9LAotICAgIHsgMTg0LCAxMjcsIDE1OCwgMjIzLCAxNTQsIDI1NCwgMjI2LCAyNTEgfSwKLSAgICB7IDE4NSwgMTI4LCAxNTksIDIyNCwgMTU1LCAyNTUsIDIyNywgMjUxIH0sCi0gICAgeyAxODYsIDEyOCwgMTU5LCAyMjQsIDE1NSwgMjU1LCAyMjcsIDI1MSB9LAotICAgIHsgMTg3LCAxMjksIDE2MCwgMjI1LCAxNTYsIDI1NSwgMjI4LCAyNTEgfSwKLSAgICB7IDE4OCwgMTMwLCAxNjAsIDIyNSwgMTU2LCAyNTUsIDIyOCwgMjUxIH0sCi0gICAgeyAxODksIDEzMSwgMTYwLCAyMjYsIDE1NywgMjU1LCAyMjgsIDI1MSB9LAotICAgIHsgMTkwLCAxMzEsIDE2MCwgMjI2LCAxNTgsIDI1NSwgMjI4LCAyNTEgfSwKLSAgICB7IDE5MSwgMTMyLCAxNjEsIDIyNywgMTU5LCAyNTUsIDIyOSwgMjUxIH0sCi0gICAgeyAxOTIsIDEzMiwgMTYxLCAyMjcsIDE1OSwgMjU1LCAyMjksIDI1MSB9LAotICAgIHsgMTkzLCAxMzMsIDE2MiwgMjI4LCAxNjAsIDI1NSwgMjMwLCAyNTIgfSwKLSAgICB7IDE5NCwgMTMzLCAxNjIsIDIyOSwgMTYwLCAyNTUsIDIzMCwgMjUyIH0sCi0gICAgeyAxOTUsIDEzNCwgMTYzLCAyMzAsIDE2MSwgMjU1LCAyMzEsIDI1MiB9LAotICAgIHsgMTk2LCAxMzQsIDE2MywgMjMwLCAxNjEsIDI1NSwgMjMxLCAyNTIgfSwKLSAgICB7IDE5NywgMTM1LCAxNjMsIDIzMSwgMTYyLCAyNTUsIDIzMSwgMjUyIH0sCi0gICAgeyAxOTgsIDEzNSwgMTYzLCAyMzEsIDE2MiwgMjU1LCAyMzEsIDI1MiB9LAotICAgIHsgMTk5LCAxMzYsIDE2NCwgMjMyLCAxNjMsIDI1NSwgMjMyLCAyNTIgfSwKLSAgICB7IDIwMCwgMTM2LCAxNjQsIDIzMiwgMTY0LCAyNTUsIDIzMiwgMjUyIH0sCi0gICAgeyAyMDEsIDEzNywgMTY1LCAyMzMsIDE2NSwgMjU1LCAyMzMsIDI1MiB9LAotICAgIHsgMjAxLCAxMzcsIDE2NSwgMjMzLCAxNjUsIDI1NSwgMjMzLCAyNTIgfSwKLSAgICB7IDIwMiwgMTM4LCAxNjYsIDIzMywgMTY2LCAyNTUsIDIzMywgMjUyIH0sCi0gICAgeyAyMDMsIDEzOCwgMTY2LCAyMzMsIDE2NiwgMjU1LCAyMzMsIDI1MiB9LAotICAgIHsgMjA0LCAxMzksIDE2NiwgMjM0LCAxNjcsIDI1NSwgMjM0LCAyNTIgfSwKLSAgICB7IDIwNSwgMTM5LCAxNjYsIDIzNCwgMTY3LCAyNTUsIDIzNCwgMjUyIH0sCi0gICAgeyAyMDYsIDE0MCwgMTY3LCAyMzUsIDE2OCwgMjU1LCAyMzUsIDI1MiB9LAotICAgIHsgMjA2LCAxNDAsIDE2NywgMjM1LCAxNjgsIDI1NSwgMjM1LCAyNTIgfSwKLSAgICB7IDIwNywgMTQxLCAxNjgsIDIzNiwgMTY5LCAyNTUsIDIzNSwgMjUyIH0sCi0gICAgeyAyMDgsIDE0MSwgMTY4LCAyMzYsIDE3MCwgMjU1LCAyMzUsIDI1MiB9LAotICAgIHsgMjA5LCAxNDIsIDE2OSwgMjM3LCAxNzEsIDI1NSwgMjM2LCAyNTIgfSwKLSAgICB7IDIwOSwgMTQzLCAxNjksIDIzNywgMTcxLCAyNTUsIDIzNiwgMjUyIH0sCi0gICAgeyAyMTAsIDE0NCwgMTY5LCAyMzcsIDE3MiwgMjU1LCAyMzYsIDI1MiB9LAotICAgIHsgMjExLCAxNDQsIDE2OSwgMjM3LCAxNzIsIDI1NSwgMjM2LCAyNTIgfSwKLSAgICB7IDIxMiwgMTQ1LCAxNzAsIDIzOCwgMTczLCAyNTUsIDIzNywgMjUyIH0sCi0gICAgeyAyMTMsIDE0NSwgMTcwLCAyMzgsIDE3MywgMjU1LCAyMzcsIDI1MiB9LAotICAgIHsgMjE0LCAxNDYsIDE3MSwgMjM5LCAxNzQsIDI1NSwgMjM3LCAyNTMgfSwKLSAgICB7IDIxNCwgMTQ2LCAxNzEsIDIzOSwgMTc0LCAyNTUsIDIzNywgMjUzIH0sCi0gICAgeyAyMTUsIDE0NywgMTcyLCAyNDAsIDE3NSwgMjU1LCAyMzgsIDI1MyB9LAotICAgIHsgMjE1LCAxNDcsIDE3MiwgMjQwLCAxNzUsIDI1NSwgMjM4LCAyNTMgfSwKLSAgICB7IDIxNiwgMTQ4LCAxNzMsIDI0MCwgMTc2LCAyNTUsIDIzOCwgMjUzIH0sCi0gICAgeyAyMTcsIDE0OCwgMTczLCAyNDAsIDE3NiwgMjU1LCAyMzgsIDI1MyB9LAotICAgIHsgMjE4LCAxNDksIDE3MywgMjQxLCAxNzcsIDI1NSwgMjM5LCAyNTMgfSwKLSAgICB7IDIxOCwgMTQ5LCAxNzMsIDI0MSwgMTc4LCAyNTUsIDIzOSwgMjUzIH0sCi0gICAgeyAyMTksIDE1MCwgMTc0LCAyNDEsIDE3OSwgMjU1LCAyMzksIDI1MyB9LAotICAgIHsgMjE5LCAxNTEsIDE3NCwgMjQxLCAxNzksIDI1NSwgMjM5LCAyNTMgfSwKLSAgICB7IDIyMCwgMTUyLCAxNzUsIDI0MiwgMTgwLCAyNTUsIDI0MCwgMjUzIH0sCi0gICAgeyAyMjEsIDE1MiwgMTc1LCAyNDIsIDE4MCwgMjU1LCAyNDAsIDI1MyB9LAotICAgIHsgMjIyLCAxNTMsIDE3NiwgMjQyLCAxODEsIDI1NSwgMjQwLCAyNTMgfSwKLSAgICB7IDIyMiwgMTUzLCAxNzYsIDI0MiwgMTgxLCAyNTUsIDI0MCwgMjUzIH0sCi0gICAgeyAyMjMsIDE1NCwgMTc3LCAyNDMsIDE4MiwgMjU1LCAyNDAsIDI1MyB9LAotICAgIHsgMjIzLCAxNTQsIDE3NywgMjQzLCAxODIsIDI1NSwgMjQwLCAyNTMgfSwKLSAgICB7IDIyNCwgMTU1LCAxNzgsIDI0NCwgMTgzLCAyNTUsIDI0MSwgMjUzIH0sCi0gICAgeyAyMjQsIDE1NSwgMTc4LCAyNDQsIDE4MywgMjU1LCAyNDEsIDI1MyB9LAotICAgIHsgMjI1LCAxNTYsIDE3OCwgMjQ0LCAxODQsIDI1NSwgMjQxLCAyNTMgfSwKLSAgICB7IDIyNSwgMTU3LCAxNzgsIDI0NCwgMTg0LCAyNTUsIDI0MSwgMjUzIH0sCi0gICAgeyAyMjYsIDE1OCwgMTc5LCAyNDQsIDE4NSwgMjU1LCAyNDIsIDI1MyB9LAotICAgIHsgMjI3LCAxNTgsIDE3OSwgMjQ0LCAxODUsIDI1NSwgMjQyLCAyNTMgfSwKLSAgICB7IDIyOCwgMTU5LCAxODAsIDI0NSwgMTg2LCAyNTUsIDI0MiwgMjUzIH0sCi0gICAgeyAyMjgsIDE1OSwgMTgwLCAyNDUsIDE4NiwgMjU1LCAyNDIsIDI1MyB9LAotICAgIHsgMjI5LCAxNjAsIDE4MSwgMjQ1LCAxODcsIDI1NSwgMjQyLCAyNTMgfSwKLSAgICB7IDIyOSwgMTYwLCAxODEsIDI0NSwgMTg3LCAyNTUsIDI0MiwgMjUzIH0sCi0gICAgeyAyMzAsIDE2MSwgMTgyLCAyNDYsIDE4OCwgMjU1LCAyNDMsIDI1MyB9LAotICAgIHsgMjMwLCAxNjIsIDE4MiwgMjQ2LCAxODgsIDI1NSwgMjQzLCAyNTMgfSwKLSAgICB7IDIzMSwgMTYzLCAxODMsIDI0NiwgMTg5LCAyNTUsIDI0MywgMjUzIH0sCi0gICAgeyAyMzEsIDE2MywgMTgzLCAyNDYsIDE4OSwgMjU1LCAyNDMsIDI1MyB9LAotICAgIHsgMjMyLCAxNjQsIDE4NCwgMjQ3LCAxOTAsIDI1NSwgMjQzLCAyNTMgfSwKLSAgICB7IDIzMiwgMTY0LCAxODQsIDI0NywgMTkwLCAyNTUsIDI0MywgMjUzIH0sCi0gICAgeyAyMzMsIDE2NSwgMTg1LCAyNDcsIDE5MSwgMjU1LCAyNDQsIDI1MyB9LAotICAgIHsgMjMzLCAxNjUsIDE4NSwgMjQ3LCAxOTEsIDI1NSwgMjQ0LCAyNTMgfSwKLSAgICB7IDIzNCwgMTY2LCAxODUsIDI0NywgMTkyLCAyNTUsIDI0NCwgMjUzIH0sCi0gICAgeyAyMzQsIDE2NywgMTg1LCAyNDcsIDE5MiwgMjU1LCAyNDQsIDI1MyB9LAotICAgIHsgMjM1LCAxNjgsIDE4NiwgMjQ4LCAxOTMsIDI1NSwgMjQ0LCAyNTMgfSwKLSAgICB7IDIzNSwgMTY4LCAxODYsIDI0OCwgMTkzLCAyNTUsIDI0NCwgMjUzIH0sCi0gICAgeyAyMzYsIDE2OSwgMTg3LCAyNDgsIDE5NCwgMjU1LCAyNDQsIDI1MyB9LAotICAgIHsgMjM2LCAxNjksIDE4NywgMjQ4LCAxOTQsIDI1NSwgMjQ0LCAyNTMgfSwKLSAgICB7IDIzNiwgMTcwLCAxODgsIDI0OCwgMTk1LCAyNTUsIDI0NSwgMjUzIH0sCi0gICAgeyAyMzYsIDE3MCwgMTg4LCAyNDgsIDE5NSwgMjU1LCAyNDUsIDI1MyB9LAotICAgIHsgMjM3LCAxNzEsIDE4OSwgMjQ5LCAxOTYsIDI1NSwgMjQ1LCAyNTQgfSwKLSAgICB7IDIzNywgMTcyLCAxODksIDI0OSwgMTk2LCAyNTUsIDI0NSwgMjU0IH0sCi0gICAgeyAyMzgsIDE3MywgMTkwLCAyNDksIDE5NywgMjU1LCAyNDUsIDI1NCB9LAotICAgIHsgMjM4LCAxNzMsIDE5MCwgMjQ5LCAxOTcsIDI1NSwgMjQ1LCAyNTQgfSwKLSAgICB7IDIzOSwgMTc0LCAxOTEsIDI0OSwgMTk4LCAyNTUsIDI0NSwgMjU0IH0sCi0gICAgeyAyMzksIDE3NCwgMTkxLCAyNDksIDE5OCwgMjU1LCAyNDUsIDI1NCB9LAotICAgIHsgMjQwLCAxNzUsIDE5MiwgMjQ5LCAxOTksIDI1NSwgMjQ2LCAyNTQgfSwKLSAgICB7IDI0MCwgMTc2LCAxOTIsIDI0OSwgMTk5LCAyNTUsIDI0NiwgMjU0IH0sCi0gICAgeyAyNDAsIDE3NywgMTkzLCAyNTAsIDIwMCwgMjU1LCAyNDYsIDI1NCB9LAotICAgIHsgMjQwLCAxNzcsIDE5MywgMjUwLCAyMDAsIDI1NSwgMjQ2LCAyNTQgfSwKLSAgICB7IDI0MSwgMTc4LCAxOTQsIDI1MCwgMjAxLCAyNTUsIDI0NiwgMjU0IH0sCi0gICAgeyAyNDEsIDE3OCwgMTk0LCAyNTAsIDIwMSwgMjU1LCAyNDYsIDI1NCB9LAotICAgIHsgMjQyLCAxNzksIDE5NSwgMjUwLCAyMDIsIDI1NSwgMjQ2LCAyNTQgfSwKLSAgICB7IDI0MiwgMTgwLCAxOTUsIDI1MCwgMjAyLCAyNTUsIDI0NiwgMjU0IH0sCi0gICAgeyAyNDIsIDE4MSwgMTk2LCAyNTAsIDIwMywgMjU1LCAyNDcsIDI1NCB9LAotICAgIHsgMjQyLCAxODEsIDE5NiwgMjUwLCAyMDMsIDI1NSwgMjQ3LCAyNTQgfSwKLSAgICB7IDI0MywgMTgyLCAxOTcsIDI1MSwgMjA0LCAyNTUsIDI0NywgMjU0IH0sCi0gICAgeyAyNDMsIDE4MywgMTk3LCAyNTEsIDIwNCwgMjU1LCAyNDcsIDI1NCB9LAotICAgIHsgMjQ0LCAxODQsIDE5OCwgMjUxLCAyMDUsIDI1NSwgMjQ3LCAyNTQgfSwKLSAgICB7IDI0NCwgMTg0LCAxOTgsIDI1MSwgMjA1LCAyNTUsIDI0NywgMjU0IH0sCi0gICAgeyAyNDQsIDE4NSwgMTk5LCAyNTEsIDIwNiwgMjU1LCAyNDcsIDI1NCB9LAotICAgIHsgMjQ0LCAxODUsIDE5OSwgMjUxLCAyMDYsIDI1NSwgMjQ3LCAyNTQgfSwKLSAgICB7IDI0NSwgMTg2LCAyMDAsIDI1MSwgMjA3LCAyNTUsIDI0NywgMjU0IH0sCi0gICAgeyAyNDUsIDE4NywgMjAwLCAyNTEsIDIwNywgMjU1LCAyNDcsIDI1NCB9LAotICAgIHsgMjQ2LCAxODgsIDIwMSwgMjUyLCAyMDcsIDI1NSwgMjQ4LCAyNTQgfSwKLSAgICB7IDI0NiwgMTg4LCAyMDEsIDI1MiwgMjA3LCAyNTUsIDI0OCwgMjU0IH0sCi0gICAgeyAyNDYsIDE4OSwgMjAyLCAyNTIsIDIwOCwgMjU1LCAyNDgsIDI1NCB9LAotICAgIHsgMjQ2LCAxOTAsIDIwMiwgMjUyLCAyMDgsIDI1NSwgMjQ4LCAyNTQgfSwKLSAgICB7IDI0NywgMTkxLCAyMDMsIDI1MiwgMjA5LCAyNTUsIDI0OCwgMjU0IH0sCi0gICAgeyAyNDcsIDE5MSwgMjAzLCAyNTIsIDIwOSwgMjU1LCAyNDgsIDI1NCB9LAotICAgIHsgMjQ3LCAxOTIsIDIwNCwgMjUyLCAyMTAsIDI1NSwgMjQ4LCAyNTQgfSwKLSAgICB7IDI0NywgMTkzLCAyMDQsIDI1MiwgMjEwLCAyNTUsIDI0OCwgMjU0IH0sCi0gICAgeyAyNDgsIDE5NCwgMjA1LCAyNTIsIDIxMSwgMjU1LCAyNDgsIDI1NCB9LAotICAgIHsgMjQ4LCAxOTQsIDIwNSwgMjUyLCAyMTEsIDI1NSwgMjQ4LCAyNTQgfSwKLSAgICB7IDI0OCwgMTk1LCAyMDYsIDI1MiwgMjEyLCAyNTUsIDI0OSwgMjU0IH0sCi0gICAgeyAyNDgsIDE5NiwgMjA2LCAyNTIsIDIxMiwgMjU1LCAyNDksIDI1NCB9LAotICAgIHsgMjQ5LCAxOTcsIDIwNywgMjUzLCAyMTMsIDI1NSwgMjQ5LCAyNTQgfSwKLSAgICB7IDI0OSwgMTk3LCAyMDcsIDI1MywgMjEzLCAyNTUsIDI0OSwgMjU0IH0sCi0gICAgeyAyNDksIDE5OCwgMjA4LCAyNTMsIDIxNCwgMjU1LCAyNDksIDI1NCB9LAotICAgIHsgMjQ5LCAxOTksIDIwOSwgMjUzLCAyMTQsIDI1NSwgMjQ5LCAyNTQgfSwKLSAgICB7IDI1MCwgMjAwLCAyMTAsIDI1MywgMjE1LCAyNTUsIDI0OSwgMjU0IH0sCi0gICAgeyAyNTAsIDIwMCwgMjEwLCAyNTMsIDIxNSwgMjU1LCAyNDksIDI1NCB9LAotICAgIHsgMjUwLCAyMDEsIDIxMSwgMjUzLCAyMTUsIDI1NSwgMjQ5LCAyNTQgfSwKLSAgICB7IDI1MCwgMjAyLCAyMTEsIDI1MywgMjE1LCAyNTUsIDI0OSwgMjU0IH0sCi0gICAgeyAyNTAsIDIwMywgMjEyLCAyNTMsIDIxNiwgMjU1LCAyNDksIDI1NCB9LAotICAgIHsgMjUwLCAyMDMsIDIxMiwgMjUzLCAyMTYsIDI1NSwgMjQ5LCAyNTQgfSwKLSAgICB7IDI1MSwgMjA0LCAyMTMsIDI1MywgMjE3LCAyNTUsIDI1MCwgMjU0IH0sCi0gICAgeyAyNTEsIDIwNSwgMjEzLCAyNTMsIDIxNywgMjU1LCAyNTAsIDI1NCB9LAotICAgIHsgMjUxLCAyMDYsIDIxNCwgMjU0LCAyMTgsIDI1NSwgMjUwLCAyNTQgfSwKLSAgICB7IDI1MSwgMjA2LCAyMTUsIDI1NCwgMjE4LCAyNTUsIDI1MCwgMjU0IH0sCi0gICAgeyAyNTIsIDIwNywgMjE2LCAyNTQsIDIxOSwgMjU1LCAyNTAsIDI1NCB9LAotICAgIHsgMjUyLCAyMDgsIDIxNiwgMjU0LCAyMTksIDI1NSwgMjUwLCAyNTQgfSwKLSAgICB7IDI1MiwgMjA5LCAyMTcsIDI1NCwgMjIwLCAyNTUsIDI1MCwgMjU0IH0sCi0gICAgeyAyNTIsIDIxMCwgMjE3LCAyNTQsIDIyMCwgMjU1LCAyNTAsIDI1NCB9LAotICAgIHsgMjUyLCAyMTEsIDIxOCwgMjU0LCAyMjEsIDI1NSwgMjUwLCAyNTQgfSwKLSAgICB7IDI1MiwgMjEyLCAyMTgsIDI1NCwgMjIxLCAyNTUsIDI1MCwgMjU0IH0sCi0gICAgeyAyNTMsIDIxMywgMjE5LCAyNTQsIDIyMiwgMjU1LCAyNTAsIDI1NCB9LAotICAgIHsgMjUzLCAyMTMsIDIyMCwgMjU0LCAyMjIsIDI1NSwgMjUwLCAyNTQgfSwKLSAgICB7IDI1MywgMjE0LCAyMjEsIDI1NCwgMjIzLCAyNTUsIDI1MCwgMjU0IH0sCi0gICAgeyAyNTMsIDIxNSwgMjIxLCAyNTQsIDIyMywgMjU1LCAyNTAsIDI1NCB9LAotICAgIHsgMjUzLCAyMTYsIDIyMiwgMjU0LCAyMjQsIDI1NSwgMjUxLCAyNTQgfSwKLSAgICB7IDI1MywgMjE3LCAyMjMsIDI1NCwgMjI0LCAyNTUsIDI1MSwgMjU0IH0sCi0gICAgeyAyNTMsIDIxOCwgMjI0LCAyNTQsIDIyNSwgMjU1LCAyNTEsIDI1NCB9LAotICAgIHsgMjUzLCAyMTksIDIyNCwgMjU0LCAyMjUsIDI1NSwgMjUxLCAyNTQgfSwKLSAgICB7IDI1NCwgMjIwLCAyMjUsIDI1NCwgMjI1LCAyNTUsIDI1MSwgMjU0IH0sCi0gICAgeyAyNTQsIDIyMSwgMjI2LCAyNTQsIDIyNSwgMjU1LCAyNTEsIDI1NCB9LAotICAgIHsgMjU0LCAyMjIsIDIyNywgMjU1LCAyMjYsIDI1NSwgMjUxLCAyNTQgfSwKLSAgICB7IDI1NCwgMjIzLCAyMjcsIDI1NSwgMjI2LCAyNTUsIDI1MSwgMjU0IH0sCi0gICAgeyAyNTQsIDIyNCwgMjI4LCAyNTUsIDIyNywgMjU1LCAyNTEsIDI1NCB9LAotICAgIHsgMjU0LCAyMjUsIDIyOSwgMjU1LCAyMjcsIDI1NSwgMjUxLCAyNTQgfSwKLSAgICB7IDI1NCwgMjI2LCAyMzAsIDI1NSwgMjI4LCAyNTUsIDI1MSwgMjU0IH0sCi0gICAgeyAyNTQsIDIyNywgMjMwLCAyNTUsIDIyOSwgMjU1LCAyNTEsIDI1NCB9LAotICAgIHsgMjU1LCAyMjgsIDIzMSwgMjU1LCAyMzAsIDI1NSwgMjUxLCAyNTQgfSwKLSAgICB7IDI1NSwgMjI5LCAyMzIsIDI1NSwgMjMwLCAyNTUsIDI1MSwgMjU0IH0sCi0gICAgeyAyNTUsIDIzMCwgMjMzLCAyNTUsIDIzMSwgMjU1LCAyNTIsIDI1NCB9LAotICAgIHsgMjU1LCAyMzEsIDIzNCwgMjU1LCAyMzEsIDI1NSwgMjUyLCAyNTQgfSwKLSAgICB7IDI1NSwgMjMyLCAyMzUsIDI1NSwgMjMyLCAyNTUsIDI1MiwgMjU0IH0sCi0gICAgeyAyNTUsIDIzMywgMjM2LCAyNTUsIDIzMiwgMjU1LCAyNTIsIDI1NCB9LAotICAgIHsgMjU1LCAyMzUsIDIzNywgMjU1LCAyMzMsIDI1NSwgMjUyLCAyNTQgfSwKLSAgICB7IDI1NSwgMjM2LCAyMzgsIDI1NSwgMjM0LCAyNTUsIDI1MiwgMjU0IH0sCi0gICAgeyAyNTUsIDIzOCwgMjQwLCAyNTUsIDIzNSwgMjU1LCAyNTIsIDI1NSB9LAotICAgIHsgMjU1LCAyMzksIDI0MSwgMjU1LCAyMzUsIDI1NSwgMjUyLCAyNTQgfSwKLSAgICB7IDI1NSwgMjQxLCAyNDMsIDI1NSwgMjM2LCAyNTUsIDI1MiwgMjU0IH0sCi0gICAgeyAyNTUsIDI0MywgMjQ1LCAyNTUsIDIzNywgMjU1LCAyNTIsIDI1NCB9LAotICAgIHsgMjU1LCAyNDYsIDI0NywgMjU1LCAyMzksIDI1NSwgMjUzLCAyNTUgfSwKLX07Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICB1aW50OF90IHlfbW9kZVs0XVs5XTsKLSAgICB1aW50OF90IHV2X21vZGVbMTBdWzldOwotICAgIHVpbnQ4X3QgZmlsdGVyWzRdWzJdOwotICAgIHVpbnQ4X3QgbXZfbW9kZVs3XVszXTsKLSAgICB1aW50OF90IGludHJhWzRdOwotICAgIHVpbnQ4X3QgY29tcFs1XTsKLSAgICB1aW50OF90IHNpbmdsZV9yZWZbNV1bMl07Ci0gICAgdWludDhfdCBjb21wX3JlZls1XTsKLSAgICB1aW50OF90IHR4MzJwWzJdWzNdOwotICAgIHVpbnQ4X3QgdHgxNnBbMl1bMl07Ci0gICAgdWludDhfdCB0eDhwWzJdOwotICAgIHVpbnQ4X3Qgc2tpcFszXTsKLSAgICB1aW50OF90IG12X2pvaW50WzNdOwotICAgIHN0cnVjdCB7Ci0gICAgICAgIHVpbnQ4X3Qgc2lnbjsKLSAgICAgICAgdWludDhfdCBjbGFzc2VzWzEwXTsKLSAgICAgICAgdWludDhfdCBjbGFzczA7Ci0gICAgICAgIHVpbnQ4X3QgYml0c1sxMF07Ci0gICAgICAgIHVpbnQ4X3QgY2xhc3MwX2ZwWzJdWzNdOwotICAgICAgICB1aW50OF90IGZwWzNdOwotICAgICAgICB1aW50OF90IGNsYXNzMF9ocDsKLSAgICAgICAgdWludDhfdCBocDsKLSAgICB9IG12X2NvbXBbMl07Ci0gICAgdWludDhfdCBwYXJ0aXRpb25bNF1bNF1bM107Ci19IHByb2JfY29udGV4dDsKLQotc3RhdGljIGNvbnN0IHByb2JfY29udGV4dCB2cDlfZGVmYXVsdF9wcm9icyA9IHsKLSAgICB7IC8qIHlfbW9kZSAqLwotICAgICAgICB7ICA2NSwgIDMyLCAgMTgsIDE0NCwgMTYyLCAxOTQsICA0MSwgIDUxLCAgOTggfSAvKiBic2l6ZSA8IDh4OCAqLywKLSAgICAgICAgeyAxMzIsICA2OCwgIDE4LCAxNjUsIDIxNywgMTk2LCAgNDUsICA0MCwgIDc4IH0gLyogYnNpemUgPCAxNngxNiAqLywKLSAgICAgICAgeyAxNzMsICA4MCwgIDE5LCAxNzYsIDI0MCwgMTkzLCAgNjQsICAzNSwgIDQ2IH0gLyogYnNpemUgPCAzMngzMiAqLywKLSAgICAgICAgeyAyMjEsIDEzNSwgIDM4LCAxOTQsIDI0OCwgMTIxLCAgOTYsICA4NSwgIDI5IH0gLyogYnNpemUgPj0gMzJ4MzIgKi8KLSAgICB9LCB7IC8qIHV2X21vZGUgKi8KLSAgICAgICAgeyAgNDgsICAxMiwgMTU0LCAxNTUsIDEzOSwgIDkwLCAgMzQsIDExNywgMTE5IH0gLyogeSA9IHYgKi8sCi0gICAgICAgIHsgIDY3LCAgIDYsICAyNSwgMjA0LCAyNDMsIDE1OCwgIDEzLCAgMjEsICA5NiB9IC8qIHkgPSBoICovLAotICAgICAgICB7IDEyMCwgICA3LCAgNzYsIDE3NiwgMjA4LCAxMjYsICAyOCwgIDU0LCAxMDMgfSAvKiB5ID0gZGMgKi8sCi0gICAgICAgIHsgIDk3LCAgIDUsICA0NCwgMTMxLCAxNzYsIDEzOSwgIDQ4LCAgNjgsICA5NyB9IC8qIHkgPSBkNDUgKi8sCi0gICAgICAgIHsgIDgzLCAgIDUsICA0MiwgMTU2LCAxMTEsIDE1MiwgIDI2LCAgNDksIDE1MiB9IC8qIHkgPSBkMTM1ICovLAotICAgICAgICB7ICA4MCwgICA1LCAgNTgsIDE3OCwgIDc0LCAgODMsICAzMywgIDYyLCAxNDUgfSAvKiB5ID0gZDExNyAqLywKLSAgICAgICAgeyAgODYsICAgNSwgIDMyLCAxNTQsIDE5MiwgMTY4LCAgMTQsICAyMiwgMTYzIH0gLyogeSA9IGQxNTMgKi8sCi0gICAgICAgIHsgIDc3LCAgIDcsICA2NCwgMTE2LCAxMzIsIDEyMiwgIDM3LCAxMjYsIDEyMCB9IC8qIHkgPSBkNjMgKi8sCi0gICAgICAgIHsgIDg1LCAgIDUsICAzMiwgMTU2LCAyMTYsIDE0OCwgIDE5LCAgMjksICA3MyB9IC8qIHkgPSBkMjcgKi8sCi0gICAgICAgIHsgMTAxLCAgMjEsIDEwNywgMTgxLCAxOTIsIDEwMywgIDE5LCAgNjcsIDEyNSB9IC8qIHkgPSB0bSAqLwotICAgIH0sIHsgLyogZmlsdGVyICovCi0gICAgICAgIHsgMjM1LCAxNjIsIH0sCi0gICAgICAgIHsgIDM2LCAyNTUsIH0sCi0gICAgICAgIHsgIDM0LCAgIDMsIH0sCi0gICAgICAgIHsgMTQ5LCAxNDQsIH0sCi0gICAgfSwgeyAvKiBtdl9tb2RlICovCi0gICAgICAgIHsgIDIsIDE3MywgIDM0fSwgIC8vIDAgPSBib3RoIHplcm8gbXYKLSAgICAgICAgeyAgNywgMTQ1LCAgODV9LCAgLy8gMSA9IG9uZSB6ZXJvIG12ICsgb25lIGEgcHJlZGljdGVkIG12Ci0gICAgICAgIHsgIDcsIDE2NiwgIDYzfSwgIC8vIDIgPSB0d28gcHJlZGljdGVkIG12cwotICAgICAgICB7ICA3LCAgOTQsICA2Nn0sICAvLyAzID0gb25lIHByZWRpY3RlZC96ZXJvIGFuZCBvbmUgbmV3IG12Ci0gICAgICAgIHsgIDgsICA2NCwgIDQ2fSwgIC8vIDQgPSB0d28gbmV3IG12cwotICAgICAgICB7IDE3LCAgODEsICAzMX0sICAvLyA1ID0gb25lIGludHJhIG5laWdoYm91ciArIHgKLSAgICAgICAgeyAyNSwgIDI5LCAgMzB9LCAgLy8gNiA9IHR3byBpbnRyYSBuZWlnaGJvdXJzCi0gICAgfSwgeyAvKiBpbnRyYSAqLwotICAgICAgICA5LCAxMDIsIDE4NywgMjI1Ci0gICAgfSwgeyAvKiBjb21wICovCi0gICAgICAgIDIzOSwgMTgzLCAxMTksICA5NiwgIDQxCi0gICAgfSwgeyAvKiBzaW5nbGVfcmVmICovCi0gICAgICAgIHsgIDMzLCAgMTYgfSwKLSAgICAgICAgeyAgNzcsICA3NCB9LAotICAgICAgICB7IDE0MiwgMTQyIH0sCi0gICAgICAgIHsgMTcyLCAxNzAgfSwKLSAgICAgICAgeyAyMzgsIDI0NyB9Ci0gICAgfSwgeyAvKiBjb21wX3JlZiAqLwotICAgICAgICA1MCwgMTI2LCAxMjMsIDIyMSwgMjI2Ci0gICAgfSwgeyAvKiB0eDMycCAqLwotICAgICAgICB7IDMsIDEzNiwgMzcsIH0sCi0gICAgICAgIHsgNSwgIDUyLCAxMywgfSwKLSAgICB9LCB7IC8qIHR4MTZwICovCi0gICAgICAgIHsgMjAsIDE1MiwgfSwKLSAgICAgICAgeyAxNSwgMTAxLCB9LAotICAgIH0sIHsgLyogdHg4cCAqLwotICAgICAgICAxMDAsIDY2Ci0gICAgfSwgeyAvKiBza2lwICovCi0gICAgICAgIDE5MiwgMTI4LCA2NAotICAgIH0sIHsgLyogbXZfam9pbnQgKi8KLSAgICAgICAgMzIsIDY0LCA5NgotICAgIH0sIHsKLSAgICAgICAgeyAvKiBtdiB2ZXJ0aWNhbCBjb21wb25lbnQgKi8KLSAgICAgICAgICAgIDEyOCwgLyogc2lnbiAqLwotICAgICAgICAgICAgeyAyMjQsIDE0NCwgMTkyLCAxNjgsIDE5MiwgMTc2LCAxOTIsIDE5OCwgMTk4LCAyNDUgfSwgLyogY2xhc3MgKi8KLSAgICAgICAgICAgIDIxNiwgLyogY2xhc3MwICovCi0gICAgICAgICAgICB7IDEzNiwgMTQwLCAxNDgsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjM0LCAyMzQsIDI0MH0sIC8qIGJpdHMgKi8KLSAgICAgICAgICAgIHsgLyogY2xhc3MwX2ZwICovCi0gICAgICAgICAgICAgICAgeyAxMjgsIDEyOCwgNjQgfSwKLSAgICAgICAgICAgICAgICB7ICA5NiwgMTEyLCA2NCB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgeyA2NCwgOTYsIDY0IH0sIC8qIGZwICovCi0gICAgICAgICAgICAxNjAsIC8qIGNsYXNzMF9ocCBiaXQgKi8KLSAgICAgICAgICAgIDEyOCwgLyogaHAgKi8KLSAgICAgICAgfSwgeyAvKiBtdiBob3Jpem9udGFsIGNvbXBvbmVudCAqLwotICAgICAgICAgICAgMTI4LCAvKiBzaWduICovCi0gICAgICAgICAgICB7IDIxNiwgMTI4LCAxNzYsIDE2MCwgMTc2LCAxNzYsIDE5MiwgMTk4LCAxOTgsIDIwOCB9LCAvKiBjbGFzcyAqLwotICAgICAgICAgICAgMjA4LCAvKiBjbGFzczAgKi8KLSAgICAgICAgICAgIHsgMTM2LCAxNDAsIDE0OCwgMTYwLCAxNzYsIDE5MiwgMjI0LCAyMzQsIDIzNCwgMjQwIH0sIC8qIGJpdHMgKi8KLSAgICAgICAgICAgIHsgLyogY2xhc3MwX2ZwICovCi0gICAgICAgICAgICAgICAgeyAxMjgsIDEyOCwgNjQgfSwKLSAgICAgICAgICAgICAgICB7ICA5NiwgMTEyLCA2NCB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgeyA2NCwgOTYsIDY0IH0sIC8qIGZwICovCi0gICAgICAgICAgICAxNjAsIC8qIGNsYXNzMF9ocCBiaXQgKi8KLSAgICAgICAgICAgIDEyOCwgLyogaHAgKi8KLSAgICAgICAgfQotICAgIH0sIHsgLyogcGFydGl0aW9uICovCi0gICAgICAgIHsgLyogNjR4NjQgLT4gMzJ4MzIgKi8KLSAgICAgICAgICAgIHsgMjIyLCAgMzQsICAzMCB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKLSAgICAgICAgICAgIHsgIDcyLCAgMTYsICA0NCB9IC8qIGEgc3BsaXQsIGwgbm90IHNwbGl0ICovLAotICAgICAgICAgICAgeyAgNTgsICAzMiwgIDEyIH0gLyogbCBzcGxpdCwgYSBub3Qgc3BsaXQgKi8sCi0gICAgICAgICAgICB7ICAxMCwgICA3LCAgIDYgfSAvKiBhL2wgYm90aCBzcGxpdCAqLywKLSAgICAgICAgfSwgeyAvKiAzMngzMiAtPiAxNngxNiAqLwotICAgICAgICAgICAgeyAxNzcsICA1OCwgIDU5IH0gLyogYS9sIGJvdGggbm90IHNwbGl0ICovLAotICAgICAgICAgICAgeyAgNjgsICAyNiwgIDYzIH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCi0gICAgICAgICAgICB7ICA1MiwgIDc5LCAgMjUgfSAvKiBsIHNwbGl0LCBhIG5vdCBzcGxpdCAqLywKLSAgICAgICAgICAgIHsgIDE3LCAgMTQsICAxMiB9IC8qIGEvbCBib3RoIHNwbGl0ICovLAotICAgICAgICB9LCB7IC8qIDE2eDE2IC0+IDh4OCAqLwotICAgICAgICAgICAgeyAxNzQsICA3MywgIDg3IH0gLyogYS9sIGJvdGggbm90IHNwbGl0ICovLAotICAgICAgICAgICAgeyAgOTIsICA0MSwgIDgzIH0gLyogYSBzcGxpdCwgbCBub3Qgc3BsaXQgKi8sCi0gICAgICAgICAgICB7ICA4MiwgIDk5LCAgNTAgfSAvKiBsIHNwbGl0LCBhIG5vdCBzcGxpdCAqLywKLSAgICAgICAgICAgIHsgIDUzLCAgMzksICAzOSB9IC8qIGEvbCBib3RoIHNwbGl0ICovLAotICAgICAgICB9LCB7IC8qIDh4OCAtPiA0eDQgKi8KLSAgICAgICAgICAgIHsgMTk5LCAxMjIsIDE0MSB9IC8qIGEvbCBib3RoIG5vdCBzcGxpdCAqLywKLSAgICAgICAgICAgIHsgMTQ3LCAgNjMsIDE1OSB9IC8qIGEgc3BsaXQsIGwgbm90IHNwbGl0ICovLAotICAgICAgICAgICAgeyAxNDgsIDEzMywgMTE4IH0gLyogbCBzcGxpdCwgYSBub3Qgc3BsaXQgKi8sCi0gICAgICAgICAgICB7IDEyMSwgMTA0LCAxMTQgfSAvKiBhL2wgYm90aCBzcGxpdCAqLywKLSAgICAgICAgfQotICAgIH0sCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCB2cDlfZGVmYXVsdF9jb2VmX3Byb2JzWzRdWzJdWzJdWzZdWzZdWzNdID0gewotICAgIHsgLyogdHggPSA0eDQgKi8KLSAgICAgICAgeyAvKiBibG9jayBUeXBlIDAgKi8KLSAgICAgICAgICAgIHsgLyogSW50cmEgKi8KLSAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLwotICAgICAgICAgICAgICAgICAgICB7IDE5NSwgIDI5LCAxODMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgODQsICA0OSwgMTM2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA4LCAgNDIsICA3MSB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgMzEsIDEwNywgMTY5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDM1LCAgOTksIDE1OSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAxNywgIDgyLCAxNDAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDgsICA2NiwgMTE0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNDQsICA3NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE5LCAgMzIgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDQwLCAxMzIsIDIwMSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyOSwgMTE0LCAxODcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTMsICA5MSwgMTU3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA3LCAgNzUsIDEyNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDU4LCAgOTUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyOCwgIDQ3IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLwotICAgICAgICAgICAgICAgICAgICB7ICA2OSwgMTQyLCAyMjEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNDIsIDEyMiwgMjAxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDE1LCAgOTEsIDE1OSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNiwgIDY3LCAxMjEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MiwgIDc3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICAzMSB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAxMDIsIDE0OCwgMjI4IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDY3LCAxMTcsIDIwNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAxNywgIDgyLCAxNTQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDYsICA1OSwgMTE0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAyLCAgMzksICA3NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE1LCAgMjkgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCi0gICAgICAgICAgICAgICAgICAgIHsgMTU2LCAgNTcsIDIzMyB9LAotICAgICAgICAgICAgICAgICAgICB7IDExOSwgIDU3LCAyMTIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNTgsICA0OCwgMTYzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDI5LCAgNDAsIDEyNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAxMiwgIDMwLCAgODEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDMsICAxMiwgIDMxIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCB7IC8qIEludGVyICovCi0gICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAxOTEsIDEwNywgMjI2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTI0LCAxMTcsIDIwNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyNSwgIDk5LCAxNTUgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDI5LCAxNDgsIDIxMCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAzNywgMTI2LCAxOTQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDgsICA5MywgMTU3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNjgsIDExOCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM5LCAgNjkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDMzIH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLwotICAgICAgICAgICAgICAgICAgICB7ICA0MSwgMTUxLCAyMTMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjcsIDEyMywgMTkzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAzLCAgODIsIDE0NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU4LCAxMDUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMiwgIDYwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTMsICAyNiB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNTksIDE1OSwgMjIwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDIzLCAxMjYsIDE5OCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDg4LCAxNTEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2NiwgMTE0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzgsICA3MSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMzQgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCi0gICAgICAgICAgICAgICAgICAgIHsgMTE0LCAxMzYsIDIzMiB9LAotICAgICAgICAgICAgICAgICAgICB7ICA1MSwgMTE0LCAyMDcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTEsICA4MywgMTU1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAzLCAgNTYsIDEwNSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMzLCAgNjUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNywgIDM0IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLwotICAgICAgICAgICAgICAgICAgICB7IDE0OSwgIDY1LCAyMzQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAxMjEsICA1NywgMjE1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDYxLCAgNDksIDE2NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyOCwgIDM2LCAxMTQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTIsICAyNSwgIDc2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAzLCAgMTYsICA0MiB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9LCB7IC8qIGJsb2NrIFR5cGUgMSAqLwotICAgICAgICAgICAgeyAvKiBJbnRyYSAqLwotICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCi0gICAgICAgICAgICAgICAgICAgIHsgMjE0LCAgNDksIDIyMCB9LAotICAgICAgICAgICAgICAgICAgICB7IDEzMiwgIDYzLCAxODggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNDIsICA2NSwgMTM3IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLwotICAgICAgICAgICAgICAgICAgICB7ICA4NSwgMTM3LCAyMjEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAxMDQsIDEzMSwgMjE2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDQ5LCAxMTEsIDE5MiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyMSwgIDg3LCAxNTUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA0OSwgIDg3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTYsICAyOCB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgODksIDE2MywgMjMwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDkwLCAxMzcsIDIyMCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyOSwgMTAwLCAxODMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTAsICA3MCwgMTM1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNDIsICA4MSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMzMgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCi0gICAgICAgICAgICAgICAgICAgIHsgMTA4LCAxNjcsIDIzNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA1NSwgMTMzLCAyMjIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTUsICA5NywgMTc5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA0LCAgNzIsIDEzNSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQ1LCAgODUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOSwgIDM4IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLwotICAgICAgICAgICAgICAgICAgICB7IDEyNCwgMTQ2LCAyNDAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNjYsIDEyNCwgMjI0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDE3LCAgODgsIDE3NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNCwgIDU4LCAxMjIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzNiwgIDc1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAzNyB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAxNDEsICA3OSwgMjQxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTI2LCAgNzAsIDIyNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA2NiwgIDU4LCAxODIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMzAsICA0NCwgMTM2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEyLCAgMzQsICA5NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDIwLCAgNDcgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0sIHsgLyogSW50ZXIgKi8KLSAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLwotICAgICAgICAgICAgICAgICAgICB7IDIyOSwgIDk5LCAyNDkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAxNDMsIDExMSwgMjM1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDQ2LCAxMDksIDE5MiB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgODIsIDE1OCwgMjM2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDk0LCAxNDYsIDIyNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyNSwgMTE3LCAxOTEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDksICA4NywgMTQ5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAzLCAgNTYsICA5OSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMzLCAgNTcgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDgzLCAxNjcsIDIzNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA2OCwgMTQ1LCAyMjIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTAsIDEwMywgMTc3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNzIsIDEzMSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQxLCAgNzkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyMCwgIDM5IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLwotICAgICAgICAgICAgICAgICAgICB7ICA5OSwgMTY3LCAyMzkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNDcsIDE0MSwgMjI0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEwLCAxMDQsIDE3OCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDczLCAxMzMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NCwgIDg1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjIsICA0NyB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAxMjcsIDE0NSwgMjQzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDcxLCAxMjksIDIyOCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAxNywgIDkzLCAxNzcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA2MSwgMTI0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDEsICA4NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDIxLCAgNTIgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCi0gICAgICAgICAgICAgICAgICAgIHsgMTU3LCAgNzgsIDI0NCB9LAotICAgICAgICAgICAgICAgICAgICB7IDE0MCwgIDcyLCAyMzEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNjksICA1OCwgMTg0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDMxLCAgNDQsIDEzNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAxNCwgIDM4LCAxMDUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDgsICAyMywgIDYxIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9LCB7IC8qIHR4ID0gOHg4ICovCi0gICAgICAgIHsgLyogYmxvY2sgVHlwZSAwICovCi0gICAgICAgICAgICB7IC8qIEludHJhICovCi0gICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAxMjUsICAzNCwgMTg3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDUyLCAgNDEsIDEzMyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNiwgIDMxLCAgNTYgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDM3LCAxMDksIDE1MyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA1MSwgMTAyLCAxNDcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjMsICA4NywgMTI4IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA4LCAgNjcsIDEwMSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQxLCAgNjMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOSwgIDI5IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLwotICAgICAgICAgICAgICAgICAgICB7ICAzMSwgMTU0LCAxODUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTcsIDEyNywgMTc1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA2LCAgOTYsIDE0NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDczLCAxMTQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1MSwgIDgyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjgsICA0NSB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgMjMsIDE2MywgMjAwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEwLCAxMzEsIDE4NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDkzLCAxNDggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2NywgMTExIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDEsICA2OSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE0LCAgMjQgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDI5LCAxNzYsIDIxNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAxMiwgMTQ1LCAyMDEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDMsIDEwMSwgMTU2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjksIDExMSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM5LCAgNjMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDIzIH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLwotICAgICAgICAgICAgICAgICAgICB7ICA1NywgMTkyLCAyMzMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjUsIDE1NCwgMjE1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA2LCAxMDksIDE2NyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDc4LCAxMTggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0OCwgIDY5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjEsICAyOSB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLwotICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCi0gICAgICAgICAgICAgICAgICAgIHsgMjAyLCAxMDUsIDI0NSB9LAotICAgICAgICAgICAgICAgICAgICB7IDEwOCwgMTA2LCAyMTYgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTgsICA5MCwgMTQ0IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLwotICAgICAgICAgICAgICAgICAgICB7ICAzMywgMTcyLCAyMTkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNjQsIDE0OSwgMjA2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDE0LCAxMTcsIDE3NyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNSwgIDkwLCAxNDEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA2MSwgIDk1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzcsICA1NyB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgMzMsIDE3OSwgMjIwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDExLCAxNDAsIDE5OCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg5LCAxNDggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2MCwgMTA0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzMsICA1NyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEyLCAgMjEgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDMwLCAxODEsIDIyMSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgOCwgMTQxLCAxOTggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4NywgMTQ1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTgsIDEwMCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMxLCAgNTUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMiwgIDIwIH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLwotICAgICAgICAgICAgICAgICAgICB7ICAzMiwgMTg2LCAyMjQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDcsIDE0MiwgMTk4IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgODYsIDE0MyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU4LCAxMDAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMSwgIDU1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTIsICAyMiB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNTcsIDE5MiwgMjI3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDIwLCAxNDMsIDIwNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDk2LCAxNTQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2OCwgMTEyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDIsICA2OSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE5LCAgMzIgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgeyAvKiBibG9jayBUeXBlIDEgKi8KLSAgICAgICAgICAgIHsgLyogSW50cmEgKi8KLSAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLwotICAgICAgICAgICAgICAgICAgICB7IDIxMiwgIDM1LCAyMTUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAxMTMsICA0NywgMTY5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDI5LCAgNDgsIDEwNSB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNzQsIDEyOSwgMjAzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTA2LCAxMjAsIDIwMyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0OSwgMTA3LCAxNzggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTksICA4NCwgMTQ0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA0LCAgNTAsICA4NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE1LCAgMjUgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDcxLCAxNzIsIDIxNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0NCwgMTQxLCAyMDkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTUsIDEwMiwgMTczIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA2LCAgNzYsIDEzMyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDUxLCAgODkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyNCwgIDQyIH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLwotICAgICAgICAgICAgICAgICAgICB7ICA2NCwgMTg1LCAyMzEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMzEsIDE0OCwgMjE2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA4LCAxMDMsIDE3NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDc0LCAxMzEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NiwgIDgxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAzMCB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNjUsIDE5NiwgMjM1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDI1LCAxNTcsIDIyMSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNSwgMTA1LCAxNzQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2NywgMTIwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzgsICA2OSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE1LCAgMzAgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDY1LCAyMDQsIDIzOCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAzMCwgMTU2LCAyMjQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDcsIDEwNywgMTc3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNzAsIDEyNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQyLCAgNzMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDM0IH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCB7IC8qIEludGVyICovCi0gICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAyMjUsICA4NiwgMjUxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTQ0LCAxMDQsIDIzNSB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0MiwgIDk5LCAxODEgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDg1LCAxNzUsIDIzOSB9LAotICAgICAgICAgICAgICAgICAgICB7IDExMiwgMTY1LCAyMjkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjksIDEzNiwgMjAwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEyLCAxMDMsIDE2MiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNiwgIDc3LCAxMjMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA1MywgIDg0IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLwotICAgICAgICAgICAgICAgICAgICB7ICA3NSwgMTgzLCAyMzkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMzAsIDE1NSwgMjIxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAzLCAxMDYsIDE3MSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDc0LCAxMjggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NCwgIDc2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICAyOCB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNzMsIDE4NSwgMjQwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDI3LCAxNTksIDIyMiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgMTA3LCAxNzIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3NSwgMTI3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDIsICA3MyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMjkgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDYyLCAxOTAsIDIzOCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyMSwgMTU5LCAyMjIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDIsIDEwNywgMTcyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzIsIDEyMiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQwLCAgNzEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDMyIH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLwotICAgICAgICAgICAgICAgICAgICB7ICA2MSwgMTk5LCAyNDAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjcsIDE2MSwgMjI2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA0LCAxMTMsIDE4MCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDc2LCAxMjkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NiwgIDgwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjMsICA0MSB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwgeyAvKiB0eCA9IDE2eDE2ICovCi0gICAgICAgIHsgLyogYmxvY2sgVHlwZSAwICovCi0gICAgICAgICAgICB7IC8qIEludHJhICovCi0gICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgIDcsICAyNywgMTUzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA1LCAgMzAsICA5NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE2LCAgMzAgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDUwLCAgNzUsIDEyNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA1NywgIDc1LCAxMjQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjcsICA2NywgMTA4IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgNTQsICA4NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMzLCAgNTIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMiwgIDE4IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLwotICAgICAgICAgICAgICAgICAgICB7ICA0MywgMTI1LCAxNTEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjYsIDEwOCwgMTQ4IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA3LCAgODMsIDEyMiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDU5LCAgODkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzOCwgIDYwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICAyNyB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgMjMsIDE0NCwgMTYzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEzLCAxMTIsIDE1NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDc1LCAxMTcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1MCwgIDgxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzEsICA1MSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE0LCAgMjMgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDE4LCAxNjIsIDE4NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNiwgMTIzLCAxNzEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3OCwgMTI1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTEsICA4NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMxLCAgNTQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDIzIH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLwotICAgICAgICAgICAgICAgICAgICB7ICAxNSwgMTk5LCAyMjcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDMsIDE1MCwgMjA0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgOTEsIDE0NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU1LCAgOTUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMCwgIDUzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTEsICAyMCB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLwotICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDE5LCAgNTUsIDI0MCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAxOSwgIDU5LCAxOTYgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDMsICA1MiwgMTA1IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLwotICAgICAgICAgICAgICAgICAgICB7ICA0MSwgMTY2LCAyMDcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAxMDQsIDE1MywgMTk5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDMxLCAxMjMsIDE4MSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAxNCwgMTAxLCAxNTIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDUsICA3MiwgMTA2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzYsICA1MiB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgMzUsIDE3NiwgMjExIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEyLCAxMzEsIDE5MCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDg4LCAxNDQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2MCwgMTAxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzYsICA2MCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE2LCAgMjggfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDI4LCAxODMsIDIxMyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgOCwgMTM0LCAxOTEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA4NiwgMTQyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTYsICA5NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMwLCAgNTMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMiwgIDIwIH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLwotICAgICAgICAgICAgICAgICAgICB7ICAyMCwgMTkwLCAyMTUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDQsIDEzNSwgMTkyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgODQsIDEzOSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDUzLCAgOTEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyOCwgIDQ5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTEsICAyMCB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgMTMsIDE5NiwgMjE2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAyLCAxMzcsIDE5MiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg2LCAxNDMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NywgIDk5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzIsICA1NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDEzLCAgMjQgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgeyAvKiBibG9jayBUeXBlIDEgKi8KLSAgICAgICAgICAgIHsgLyogSW50cmEgKi8KLSAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLwotICAgICAgICAgICAgICAgICAgICB7IDIxMSwgIDI5LCAyMTcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgOTYsICA0NywgMTU2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDIyLCAgNDMsICA4NyB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNzgsIDEyMCwgMTkzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTExLCAxMTYsIDE4NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0NiwgMTAyLCAxNjQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTUsICA4MCwgMTI4IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAyLCAgNDksICA3NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMjggfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDcxLCAxNjEsIDIwMyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0MiwgMTMyLCAxOTIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTAsICA5OCwgMTUwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAzLCAgNjksIDEwOSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQ0LCAgNzAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxOCwgIDI5IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLwotICAgICAgICAgICAgICAgICAgICB7ICA1NywgMTg2LCAyMTEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMzAsIDE0MCwgMTk2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA0LCAgOTMsIDE0NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDYyLCAxMDIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzOCwgIDY1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTYsICAyNyB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNDcsIDE5OSwgMjE3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDE0LCAxNDUsIDE5NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg4LCAxNDIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NywgIDk4IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzYsICA2MiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE1LCAgMjYgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDI2LCAyMTksIDIyOSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNSwgMTU1LCAyMDcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA5NCwgMTUxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjAsIDEwNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM2LCAgNjIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNiwgIDI4IH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCB7IC8qIEludGVyICovCi0gICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAyMzMsICAyOSwgMjQ4IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTQ2LCAgNDcsIDIyMCB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0MywgIDUyLCAxNDAgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCi0gICAgICAgICAgICAgICAgICAgIHsgMTAwLCAxNjMsIDIzMiB9LAotICAgICAgICAgICAgICAgICAgICB7IDE3OSwgMTYxLCAyMjIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNjMsIDE0MiwgMjA0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDM3LCAxMTMsIDE3NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyNiwgIDg5LCAxMzcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTgsICA2OCwgIDk3IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLwotICAgICAgICAgICAgICAgICAgICB7ICA4NSwgMTgxLCAyMzAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMzIsIDE0NiwgMjA5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA3LCAxMDAsIDE2NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMywgIDcxLCAxMjEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NSwgIDc3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTgsICAzMCB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNjUsIDE4NywgMjMwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDIwLCAxNDgsIDIwNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDk3LCAxNTkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2OCwgMTE2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDAsICA3MCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE0LCAgMjkgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDQwLCAxOTQsIDIyNyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgOCwgMTQ3LCAyMDQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA5NCwgMTU1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNjUsIDExMiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM5LCAgNjYgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDI2IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLwotICAgICAgICAgICAgICAgICAgICB7ICAxNiwgMjA4LCAyMjggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDMsIDE1MSwgMjA3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgOTgsIDE2MCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDY3LCAxMTcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0MSwgIDc0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICAzMSB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSwgeyAvKiB0eCA9IDMyeDMyICovCi0gICAgICAgIHsgLyogYmxvY2sgVHlwZSAwICovCi0gICAgICAgICAgICB7IC8qIEludHJhICovCi0gICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgMTcsICAzOCwgMTQwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA3LCAgMzQsICA4MCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMjkgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDM3LCAgNzUsIDEyOCB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0MSwgIDc2LCAxMjggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjYsICA2NiwgMTE2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEyLCAgNTIsICA5NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDMyLCAgNTUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMCwgIDE2IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLwotICAgICAgICAgICAgICAgICAgICB7ICA1MCwgMTI3LCAxNTQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMzcsIDEwOSwgMTUyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDE2LCAgODIsIDEyMSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNSwgIDU5LCAgODUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzNSwgIDU0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTMsICAyMCB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNDAsIDE0MiwgMTY3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDE3LCAxMTAsIDE1NyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDcxLCAxMTIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NCwgIDcyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjcsICA0NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDExLCAgMTcgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDMwLCAxNzUsIDE4OCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgOSwgMTI0LCAxNjkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3NCwgMTE2IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNDgsICA3OCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDMwLCAgNDkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMSwgIDE4IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLwotICAgICAgICAgICAgICAgICAgICB7ICAxMCwgMjIyLCAyMjMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDIsIDE1MCwgMTk0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgODMsIDEyOCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQ4LCAgNzkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAyNywgIDQ1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTEsICAxNyB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwgeyAvKiBJbnRlciAqLwotICAgICAgICAgICAgICAgIHsgLyogQ29lZmYgQmFuZCAwICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDM2LCAgNDEsIDIzNSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyOSwgIDM2LCAxOTMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTAsICAyNywgMTExIH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMSAqLwotICAgICAgICAgICAgICAgICAgICB7ICA4NSwgMTY1LCAyMjIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAxNzcsIDE2MiwgMjE1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTEwLCAxMzUsIDE5NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICA1NywgMTEzLCAxNjggfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjMsICA4MywgMTIwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgNDksICA2MSB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgODUsIDE5MCwgMjIzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDM2LCAxMzksIDIwMCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgNSwgIDkwLCAxNDYgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2MCwgMTAzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzgsICA2NSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE4LCAgMzAgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAzICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDcyLCAyMDIsIDIyMyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyMywgMTQxLCAxOTkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDIsICA4NiwgMTQwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTYsICA5NyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDM2LCAgNjEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNiwgIDI3IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNCAqLwotICAgICAgICAgICAgICAgICAgICB7ICA1NSwgMjE4LCAyMjUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTMsIDE0NSwgMjAwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgODYsIDE0MSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU3LCAgOTkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzNSwgIDYxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTMsICAyMiB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgMTUsIDIzNSwgMjEyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAxMzIsIDE4NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg0LCAxMzkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1NywgIDk3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMzQsICA1NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE0LCAgMjMgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSwgeyAvKiBibG9jayBUeXBlIDEgKi8KLSAgICAgICAgICAgIHsgLyogSW50cmEgKi8KLSAgICAgICAgICAgICAgICB7IC8qIENvZWZmIEJhbmQgMCAqLwotICAgICAgICAgICAgICAgICAgICB7IDE4MSwgIDIxLCAyMDEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNjEsICAzNywgMTIzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDEwLCAgMzgsICA3MSB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNDcsIDEwNiwgMTcyIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDk1LCAxMDQsIDE3MyB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0MiwgIDkzLCAxNTkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMTgsICA3NywgMTMxIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA0LCAgNTAsICA4MSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDE3LCAgMjMgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAyICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDYyLCAxNDcsIDE5OSB9LAotICAgICAgICAgICAgICAgICAgICB7ICA0NCwgMTMwLCAxODkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjgsIDEwMiwgMTU0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDE4LCAgNzUsIDExNSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDQ0LCAgNjUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxMiwgIDE5IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMyAqLwotICAgICAgICAgICAgICAgICAgICB7ICA1NSwgMTUzLCAyMTAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgMjQsIDEzMCwgMTk0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAzLCAgOTMsIDE0NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDYxLCAgOTcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAzMSwgIDUwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTAsICAxNiB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAgNDksIDE4NiwgMjIzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDE3LCAxNDgsIDIwNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDk2LCAxNDIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1MywgIDgzIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMjYsICA0NCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDExLCAgMTcgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA1ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDEzLCAyMTcsIDIxMiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgMTM2LCAxODAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3OCwgMTI0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTAsICA4MyB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDI5LCAgNDkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICAxNCwgIDIzIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LCB7IC8qIEludGVyICovCi0gICAgICAgICAgICAgICAgeyAvKiBDb2VmZiBCYW5kIDAgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAxOTcsICAxMywgMjQ3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDgyLCAgMTcsIDIyMiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAyNSwgIDE3LCAxNjIgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCAxICovCi0gICAgICAgICAgICAgICAgICAgIHsgMTI2LCAxODYsIDI0NyB9LAotICAgICAgICAgICAgICAgICAgICB7IDIzNCwgMTkxLCAyNDMgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAxNzYsIDE3NywgMjM0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTA0LCAxNTgsIDIyMCB9LAotICAgICAgICAgICAgICAgICAgICB7ICA2NiwgMTI4LCAxODYgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNTUsICA5MCwgMTM3IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgMiAqLwotICAgICAgICAgICAgICAgICAgICB7IDExMSwgMTk3LCAyNDIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgNDYsIDE1OCwgMjE5IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICA5LCAxMDQsIDE3MSB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMiwgIDY1LCAxMjUgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA0NCwgIDgwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTcsICA5MSB9Ci0gICAgICAgICAgICAgICAgfSwgeyAvKiBDb2VmZiBCYW5kIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgeyAxMDQsIDIwOCwgMjQ1IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgIDM5LCAxNjgsIDIyNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMywgMTA5LCAxNjIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA3OSwgMTI0IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNTAsIDEwMiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDQzLCAxMDIgfQotICAgICAgICAgICAgICAgIH0sIHsgLyogQ29lZmYgQmFuZCA0ICovCi0gICAgICAgICAgICAgICAgICAgIHsgIDg0LCAyMjAsIDI0NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAzMSwgMTc3LCAyMzEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDIsIDExNSwgMTgwIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgNzksIDEzNCB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDU1LCAgNzcgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA2MCwgIDc5IH0KLSAgICAgICAgICAgICAgICB9LCB7IC8qIENvZWZmIEJhbmQgNSAqLwotICAgICAgICAgICAgICAgICAgICB7ICA0MywgMjQzLCAyNDAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDgsIDE4MCwgMjE3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAxMTUsIDE2NiB9LAotICAgICAgICAgICAgICAgICAgICB7ICAgMSwgIDg0LCAxMjEgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAgIDEsICA1MSwgIDY3IH0sCi0gICAgICAgICAgICAgICAgICAgIHsgICAxLCAgMTYsICAgNiB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfTsKLQotZW51bSBNVkpvaW50IHsKLSAgICBNVl9KT0lOVF9aRVJPLAotICAgIE1WX0pPSU5UX0gsCi0gICAgTVZfSk9JTlRfViwKLSAgICBNVl9KT0lOVF9IViwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3QgdnA5X212X2pvaW50X3RyZWVbM11bMl0gPSB7Ci0gICAgeyAtTVZfSk9JTlRfWkVSTywgMSB9LCAgICAgICAgICAgLy8gJzAnCi0gICAgIHsgLU1WX0pPSU5UX0gsIDIgfSwgICAgICAgICAgICAgLy8gJzEwJwotICAgICAgeyAtTVZfSk9JTlRfViwgLU1WX0pPSU5UX0hWIH0sIC8vICcxMXgnCi19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IHZwOV9tdl9jbGFzc190cmVlWzEwXVsyXSA9IHsKLSAgICB7IC0wLCAxIH0sICAgICAgICAgLy8gJzAnCi0gICAgIHsgLTEsIDIgfSwgICAgICAgIC8vICcxMCcKLSAgICAgIHsgMywgNCB9LAotICAgICAgIHsgLTIsIC0zIH0sICAgICAvLyAnMTEweCcKLSAgICAgICB7IDUsIDYgfSwKLSAgICAgICAgeyAtNCwgLTUgfSwgICAgLy8gJzExMTB4JwotICAgICAgICB7IC02LCA3IH0sICAgICAvLyAnMTExMTAnCi0gICAgICAgICB7IDgsIDkgfSwKLSAgICAgICAgICB7IC03LCAtOCB9LCAgLy8gJzExMTExMHgnCi0gICAgICAgICAgeyAtOSwgLTEwIH0sIC8vICcxMTExMTF4JwotfTsKLQotc3RhdGljIGNvbnN0IGludDhfdCB2cDlfbXZfZnBfdHJlZVszXVsyXSA9IHsKLSAgICB7IC0wLCAxIH0sICAgIC8vICcwJwotICAgICB7IC0xLCAyIH0sICAgLy8gJzEwJwotICAgICAgeyAtMiwgLTMgfSwgLy8gJzExeCcKLX07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92cDlfYndoX3RhYlsyXVtOX0JTX1NJWkVTXVsyXTsKK2V4dGVybiBjb25zdCBpbnQ4X3QgZmZfdnA5X3BhcnRpdGlvbl90cmVlWzNdWzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdnA5X2RlZmF1bHRfa2ZfcGFydGl0aW9uX3Byb2JzWzRdWzRdWzNdOworZXh0ZXJuIGNvbnN0IGludDhfdCBmZl92cDlfc2VnbWVudGF0aW9uX3RyZWVbN11bMl07CitleHRlcm4gY29uc3QgaW50OF90IGZmX3ZwOV9pbnRyYW1vZGVfdHJlZVs5XVsyXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZwOV9kZWZhdWx0X2tmX3ltb2RlX3Byb2JzWzEwXVsxMF1bOV07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl92cDlfZGVmYXVsdF9rZl91dm1vZGVfcHJvYnNbMTBdWzldOworZXh0ZXJuIGNvbnN0IGludDhfdCBmZl92cDlfaW50ZXJfbW9kZV90cmVlWzNdWzJdOworZXh0ZXJuIGNvbnN0IGludDhfdCBmZl92cDlfZmlsdGVyX3RyZWVbMl1bMl07CitleHRlcm4gY29uc3QgZW51bSBGaWx0ZXJNb2RlIGZmX3ZwOV9maWx0ZXJfbHV0WzNdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfdnA5X2RjX3Fsb29rdXBbM11bMjU2XTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9hY19xbG9va3VwWzNdWzI1Nl07CitleHRlcm4gY29uc3QgZW51bSBUeGZtVHlwZSBmZl92cDlfaW50cmFfdHhmbV90eXBlWzE0XTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9kZWZhdWx0X3NjYW5fNHg0WzE2XTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9jb2xfc2Nhbl80eDRbMTZdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfdnA5X3Jvd19zY2FuXzR4NFsxNl07CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl92cDlfZGVmYXVsdF9zY2FuXzh4OFs2NF07CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl92cDlfY29sX3NjYW5fOHg4WzY0XTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9yb3dfc2Nhbl84eDhbNjRdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfdnA5X2RlZmF1bHRfc2Nhbl8xNngxNlsyNTZdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfdnA5X2NvbF9zY2FuXzE2eDE2WzI1Nl07CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl92cDlfcm93X3NjYW5fMTZ4MTZbMjU2XTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJbMTAyNF07CitleHRlcm4gY29uc3QgaW50MTZfdCAqIGNvbnN0IGZmX3ZwOV9zY2Fuc1s1XVs0XTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9kZWZhdWx0X3NjYW5fNHg0X25iWzE2XVsyXTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9jb2xfc2Nhbl80eDRfbmJbMTZdWzJdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfdnA5X3Jvd19zY2FuXzR4NF9uYlsxNl1bMl07CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl92cDlfZGVmYXVsdF9zY2FuXzh4OF9uYls2NF1bMl07CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl92cDlfY29sX3NjYW5fOHg4X25iWzY0XVsyXTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9yb3dfc2Nhbl84eDhfbmJbNjRdWzJdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfdnA5X2RlZmF1bHRfc2Nhbl8xNngxNl9uYlsyNTZdWzJdOworZXh0ZXJuIGNvbnN0IGludDE2X3QgZmZfdnA5X2NvbF9zY2FuXzE2eDE2X25iWzI1Nl1bMl07CitleHRlcm4gY29uc3QgaW50MTZfdCBmZl92cDlfcm93X3NjYW5fMTZ4MTZfbmJbMjU2XVsyXTsKK2V4dGVybiBjb25zdCBpbnQxNl90IGZmX3ZwOV9kZWZhdWx0X3NjYW5fMzJ4MzJfbmJbMTAyNF1bMl07CitleHRlcm4gY29uc3QgaW50MTZfdCAoKiBjb25zdCBmZl92cDlfc2NhbnNfbmJbNV1bNF0pWzJdOworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfdnA5X21vZGVsX3BhcmV0bzhbMjU2XVs4XTsKK2V4dGVybiBjb25zdCBQcm9iQ29udGV4dCBmZl92cDlfZGVmYXVsdF9wcm9iczsKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3ZwOV9kZWZhdWx0X2NvZWZfcHJvYnNbNF1bMl1bMl1bNl1bNl1bM107CitleHRlcm4gY29uc3QgaW50OF90IGZmX3ZwOV9tdl9qb2ludF90cmVlWzNdWzJdOworZXh0ZXJuIGNvbnN0IGludDhfdCBmZl92cDlfbXZfY2xhc3NfdHJlZVsxMF1bMl07CitleHRlcm4gY29uc3QgaW50OF90IGZmX3ZwOV9tdl9mcF90cmVlWzNdWzJdOwogCiAjZW5kaWYgLyogQVZDT0RFQ19WUDlEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA5ZGVjLmggYi9saWJhdmNvZGVjL3ZwOWRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NTczZWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3ZwOWRlYy5oCkBAIC0wLDAgKzEsMjQwIEBACisvKgorICogVlA5IGNvbXBhdGlibGUgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZSBnbWFpbCBjb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2zDqW1lbnQgQsWTc2NoIDx1IHBraCBtZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZQOURFQ19ICisjZGVmaW5lIEFWQ09ERUNfVlA5REVDX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgInZwOS5oIgorI2luY2x1ZGUgInZwOWRzcC5oIgorI2luY2x1ZGUgInZwOXNoYXJlZC5oIgorCitlbnVtIE1WSm9pbnQgeworICAgIE1WX0pPSU5UX1pFUk8sCisgICAgTVZfSk9JTlRfSCwKKyAgICBNVl9KT0lOVF9WLAorICAgIE1WX0pPSU5UX0hWLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUHJvYkNvbnRleHQgeworICAgIHVpbnQ4X3QgeV9tb2RlWzRdWzldOworICAgIHVpbnQ4X3QgdXZfbW9kZVsxMF1bOV07CisgICAgdWludDhfdCBmaWx0ZXJbNF1bMl07CisgICAgdWludDhfdCBtdl9tb2RlWzddWzNdOworICAgIHVpbnQ4X3QgaW50cmFbNF07CisgICAgdWludDhfdCBjb21wWzVdOworICAgIHVpbnQ4X3Qgc2luZ2xlX3JlZls1XVsyXTsKKyAgICB1aW50OF90IGNvbXBfcmVmWzVdOworICAgIHVpbnQ4X3QgdHgzMnBbMl1bM107CisgICAgdWludDhfdCB0eDE2cFsyXVsyXTsKKyAgICB1aW50OF90IHR4OHBbMl07CisgICAgdWludDhfdCBza2lwWzNdOworICAgIHVpbnQ4X3QgbXZfam9pbnRbM107CisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBzaWduOworICAgICAgICB1aW50OF90IGNsYXNzZXNbMTBdOworICAgICAgICB1aW50OF90IGNsYXNzMDsKKyAgICAgICAgdWludDhfdCBiaXRzWzEwXTsKKyAgICAgICAgdWludDhfdCBjbGFzczBfZnBbMl1bM107CisgICAgICAgIHVpbnQ4X3QgZnBbM107CisgICAgICAgIHVpbnQ4X3QgY2xhc3MwX2hwOworICAgICAgICB1aW50OF90IGhwOworICAgIH0gbXZfY29tcFsyXTsKKyAgICB1aW50OF90IHBhcnRpdGlvbls0XVs0XVszXTsKK30gUHJvYkNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFZQOUZpbHRlciB7CisgICAgdWludDhfdCBsZXZlbFs4ICogOF07CisgICAgdWludDhfdCAvKiBiaXQ9Y29sICovIG1hc2tbMiAvKiAwPXksIDE9dXYgKi9dWzIgLyogMD1jb2wsIDE9cm93ICovXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzggLyogcm93cyAqL11bNCAvKiAwPTE2LCAxPTgsIDI9NCwgMz1pbm5lcjQgKi9dOworfSBWUDlGaWx0ZXI7CisKK3R5cGVkZWYgc3RydWN0IFZQOUJsb2NrIHsKKyAgICB1aW50OF90IHNlZ19pZCwgaW50cmEsIGNvbXAsIHJlZlsyXSwgbW9kZVs0XSwgdXZtb2RlLCBza2lwOworICAgIGVudW0gRmlsdGVyTW9kZSBmaWx0ZXI7CisgICAgVlA1Nm12IG12WzQgLyogYl9pZHggKi9dWzIgLyogcmVmICovXTsKKyAgICBlbnVtIEJsb2NrU2l6ZSBiczsKKyAgICBlbnVtIFR4Zm1Nb2RlIHR4LCB1dnR4OworICAgIGVudW0gQmxvY2tMZXZlbCBibDsKKyAgICBlbnVtIEJsb2NrUGFydGl0aW9uIGJwOworfSBWUDlCbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgVlA5VGlsZURhdGEgVlA5VGlsZURhdGE7CisKK3R5cGVkZWYgc3RydWN0IFZQOUNvbnRleHQgeworICAgIFZQOVNoYXJlZENvbnRleHQgczsKKyAgICBWUDlUaWxlRGF0YSAqdGQ7CisKKyAgICBWUDlEU1BDb250ZXh0IGRzcDsKKyAgICBWaWRlb0RTUENvbnRleHQgdmRzcDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOworICAgIFZQNTZSYW5nZUNvZGVyIGM7CisgICAgaW50IHBhc3MsIGFjdGl2ZV90aWxlX2NvbHM7CisKKyNpZiBIQVZFX1RIUkVBRFMKKyAgICBwdGhyZWFkX211dGV4X3QgcHJvZ3Jlc3NfbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgcHJvZ3Jlc3NfY29uZDsKKyAgICBhdG9taWNfaW50ICplbnRyaWVzOworI2VuZGlmCisKKyAgICB1aW50OF90IHNzX2gsIHNzX3Y7CisgICAgdWludDhfdCBsYXN0X2JwcCwgYnBwX2luZGV4LCBieXRlc3BlcnBpeGVsOworICAgIHVpbnQ4X3QgbGFzdF9rZXlmcmFtZTsKKyAgICAvLyBzYl9jb2xzL3Jvd3MsIHJvd3MvY29scyBhbmQgbGFzdF9mbXQgYXJlIHVzZWQgZm9yIGFsbG9jYXRpbmcgYWxsIGludGVybmFsCisgICAgLy8gYXJyYXlzLCBhbmQgYXJlIHRodXMgcGVyLXRocmVhZC4gdy9oIGFuZCBnZl9mbXQgYXJlIHN5bmNlZCBiZXR3ZWVuIHRocmVhZHMKKyAgICAvLyBhbmQgYXJlIHRoZXJlZm9yZSBwZXItc3RyZWFtLiBwaXhfZm10IHJlcHJlc2VudHMgdGhlIHZhbHVlIGluIHRoZSBoZWFkZXIKKyAgICAvLyBvZiB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBmcmFtZS4KKyAgICBpbnQgdywgaDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgbGFzdF9mbXQsIGdmX2ZtdDsKKyAgICB1bnNpZ25lZCBzYl9jb2xzLCBzYl9yb3dzLCByb3dzLCBjb2xzOworICAgIFRocmVhZEZyYW1lIG5leHRfcmVmc1s4XTsKKworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgbGltX2x1dFs2NF07CisgICAgICAgIHVpbnQ4X3QgbWJsaW1fbHV0WzY0XTsKKyAgICB9IGZpbHRlcl9sdXQ7CisgICAgc3RydWN0IHsKKyAgICAgICAgUHJvYkNvbnRleHQgcDsKKyAgICAgICAgdWludDhfdCBjb2VmWzRdWzJdWzJdWzZdWzZdWzNdOworICAgIH0gcHJvYl9jdHhbNF07CisgICAgc3RydWN0IHsKKyAgICAgICAgUHJvYkNvbnRleHQgcDsKKyAgICAgICAgdWludDhfdCBjb2VmWzRdWzJdWzJdWzZdWzZdWzExXTsKKyAgICB9IHByb2I7CisKKyAgICAvLyBjb250ZXh0dWFsIChhYm92ZSkgY2FjaGUKKyAgICB1aW50OF90ICphYm92ZV9wYXJ0aXRpb25fY3R4OworICAgIHVpbnQ4X3QgKmFib3ZlX21vZGVfY3R4OworICAgIC8vIEZJWE1FIG1heWJlIG1lcmdlIHNvbWUgb2YgdGhlIGJlbG93IGluIGEgZmxhZ3MgZmllbGQ/CisgICAgdWludDhfdCAqYWJvdmVfeV9ubnpfY3R4OworICAgIHVpbnQ4X3QgKmFib3ZlX3V2X25uel9jdHhbMl07CisgICAgdWludDhfdCAqYWJvdmVfc2tpcF9jdHg7IC8vIDFiaXQKKyAgICB1aW50OF90ICphYm92ZV90eGZtX2N0eDsgLy8gMmJpdAorICAgIHVpbnQ4X3QgKmFib3ZlX3NlZ3ByZWRfY3R4OyAvLyAxYml0CisgICAgdWludDhfdCAqYWJvdmVfaW50cmFfY3R4OyAvLyAxYml0CisgICAgdWludDhfdCAqYWJvdmVfY29tcF9jdHg7IC8vIDFiaXQKKyAgICB1aW50OF90ICphYm92ZV9yZWZfY3R4OyAvLyAyYml0CisgICAgdWludDhfdCAqYWJvdmVfZmlsdGVyX2N0eDsKKyAgICBWUDU2bXYgKCphYm92ZV9tdl9jdHgpWzJdOworCisgICAgLy8gd2hvbGUtZnJhbWUgY2FjaGUKKyAgICB1aW50OF90ICppbnRyYV9wcmVkX2RhdGFbM107CisgICAgVlA5RmlsdGVyICpsZmx2bDsKKworICAgIC8vIGJsb2NrIHJlY29uc3RydWN0aW9uIGludGVybWVkaWF0ZXMKKyAgICBpbnQgYmxvY2tfYWxsb2NfdXNpbmdfMnBhc3M7CisgICAgdWludDE2X3QgbXZzY2FsZVszXVsyXTsKKyAgICB1aW50OF90IG12c3RlcFszXVsyXTsKK30gVlA5Q29udGV4dDsKKworc3RydWN0IFZQOVRpbGVEYXRhIHsKKyAgICAvL1ZQOUNvbnRleHQgc2hvdWxkIGJlIGNvbnN0LCBidXQgYmVjYXVzZSBvZiB0aGUgdGhyZWFkaW5nIEFQSShnZW5lcmF0ZXMKKyAgICAvL2EgbG90IG9mIHdhcm5pbmdzKSBpdCdzIG5vdC4KKyAgICBWUDlDb250ZXh0ICpzOworICAgIFZQNTZSYW5nZUNvZGVyICpjX2I7CisgICAgVlA1NlJhbmdlQ29kZXIgKmM7CisgICAgaW50IHJvdywgcm93NywgY29sLCBjb2w3OworICAgIHVpbnQ4X3QgKmRzdFszXTsKKyAgICBwdHJkaWZmX3QgeV9zdHJpZGUsIHV2X3N0cmlkZTsKKyAgICBWUDlCbG9jayAqYl9iYXNlLCAqYjsKKyAgICB1bnNpZ25lZCB0aWxlX2NvbF9zdGFydDsKKworICAgIHN0cnVjdCB7CisgICAgICAgIHVuc2lnbmVkIHlfbW9kZVs0XVsxMF07CisgICAgICAgIHVuc2lnbmVkIHV2X21vZGVbMTBdWzEwXTsKKyAgICAgICAgdW5zaWduZWQgZmlsdGVyWzRdWzNdOworICAgICAgICB1bnNpZ25lZCBtdl9tb2RlWzddWzRdOworICAgICAgICB1bnNpZ25lZCBpbnRyYVs0XVsyXTsKKyAgICAgICAgdW5zaWduZWQgY29tcFs1XVsyXTsKKyAgICAgICAgdW5zaWduZWQgc2luZ2xlX3JlZls1XVsyXVsyXTsKKyAgICAgICAgdW5zaWduZWQgY29tcF9yZWZbNV1bMl07CisgICAgICAgIHVuc2lnbmVkIHR4MzJwWzJdWzRdOworICAgICAgICB1bnNpZ25lZCB0eDE2cFsyXVszXTsKKyAgICAgICAgdW5zaWduZWQgdHg4cFsyXVsyXTsKKyAgICAgICAgdW5zaWduZWQgc2tpcFszXVsyXTsKKyAgICAgICAgdW5zaWduZWQgbXZfam9pbnRbNF07CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1bnNpZ25lZCBzaWduWzJdOworICAgICAgICAgICAgdW5zaWduZWQgY2xhc3Nlc1sxMV07CisgICAgICAgICAgICB1bnNpZ25lZCBjbGFzczBbMl07CisgICAgICAgICAgICB1bnNpZ25lZCBiaXRzWzEwXVsyXTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNsYXNzMF9mcFsyXVs0XTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGZwWzRdOworICAgICAgICAgICAgdW5zaWduZWQgY2xhc3MwX2hwWzJdOworICAgICAgICAgICAgdW5zaWduZWQgaHBbMl07CisgICAgICAgIH0gbXZfY29tcFsyXTsKKyAgICAgICAgdW5zaWduZWQgcGFydGl0aW9uWzRdWzRdWzRdOworICAgICAgICB1bnNpZ25lZCBjb2VmWzRdWzJdWzJdWzZdWzZdWzNdOworICAgICAgICB1bnNpZ25lZCBlb2JbNF1bMl1bMl1bNl1bNl1bMl07CisgICAgfSBjb3VudHM7CisKKyAgICAvLyB3aG9sZS1mcmFtZSBjYWNoZQorICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgdWludDhfdCwgZWRnZV9lbXVfYnVmZmVyKVsxMzUgKiAxNDQgKiAyXTsKKworICAgIC8vIGNvbnRleHR1YWwgKGxlZnQpIGNhY2hlCisgICAgREVDTEFSRV9BTElHTkVEKDE2LCB1aW50OF90LCBsZWZ0X3lfbm56X2N0eClbMTZdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgbGVmdF9tb2RlX2N0eClbMTZdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgVlA1Nm12LCBsZWZ0X212X2N0eClbMTZdWzJdOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgdWludDhfdCwgbGVmdF91dl9ubnpfY3R4KVsyXVsxNl07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxlZnRfcGFydGl0aW9uX2N0eClbOF07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxlZnRfc2tpcF9jdHgpWzhdOworICAgIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBsZWZ0X3R4Zm1fY3R4KVs4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9zZWdwcmVkX2N0eClbOF07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxlZnRfaW50cmFfY3R4KVs4XTsKKyAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgbGVmdF9jb21wX2N0eClbOF07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxlZnRfcmVmX2N0eClbOF07CisgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxlZnRfZmlsdGVyX2N0eClbOF07CisgICAgLy8gYmxvY2sgcmVjb25zdHJ1Y3Rpb24gaW50ZXJtZWRpYXRlcworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgdWludDhfdCwgdG1wX3kpWzY0ICogNjQgKiAyXTsKKyAgICBERUNMQVJFX0FMSUdORUQoMzIsIHVpbnQ4X3QsIHRtcF91dilbMl1bNjQgKiA2NCAqIDJdOworICAgIHN0cnVjdCB7IGludCB4LCB5OyB9IG1pbl9tdiwgbWF4X212OworICAgIGludDE2X3QgKmJsb2NrX2Jhc2UsICpibG9jaywgKnV2YmxvY2tfYmFzZVsyXSwgKnV2YmxvY2tbMl07CisgICAgdWludDhfdCAqZW9iX2Jhc2UsICp1dmVvYl9iYXNlWzJdLCAqZW9iLCAqdXZlb2JbMl07Cit9OworCit2b2lkIGZmX3ZwOV9maWxsX212KFZQOVRpbGVEYXRhICp0ZCwgVlA1Nm12ICptdiwgaW50IG1vZGUsIGludCBzYik7CisKK3ZvaWQgZmZfdnA5X2FkYXB0X3Byb2JzKFZQOUNvbnRleHQgKnMpOworCit2b2lkIGZmX3ZwOV9kZWNvZGVfYmxvY2soVlA5VGlsZURhdGEgKnRkLCBpbnQgcm93LCBpbnQgY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQOUZpbHRlciAqbGZsdmwsIHB0cmRpZmZfdCB5b2ZmLCBwdHJkaWZmX3QgdXZvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBCbG9ja0xldmVsIGJsLCBlbnVtIEJsb2NrUGFydGl0aW9uIGJwKTsKKwordm9pZCBmZl92cDlfbG9vcGZpbHRlcl9zYihBVkNvZGVjQ29udGV4dCAqYXZjdHgsIFZQOUZpbHRlciAqbGZsdmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBjb2wsIHB0cmRpZmZfdCB5b2ZmLCBwdHJkaWZmX3QgdXZvZmYpOworCit2b2lkIGZmX3ZwOV9pbnRyYV9yZWNvbl84YnBwKFZQOVRpbGVEYXRhICp0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHlfb2ZmLCBwdHJkaWZmX3QgdXZfb2ZmKTsKK3ZvaWQgZmZfdnA5X2ludHJhX3JlY29uXzE2YnBwKFZQOVRpbGVEYXRhICp0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB5X29mZiwgcHRyZGlmZl90IHV2X29mZik7Cit2b2lkIGZmX3ZwOV9pbnRlcl9yZWNvbl84YnBwKFZQOVRpbGVEYXRhICp0ZCk7Cit2b2lkIGZmX3ZwOV9pbnRlcl9yZWNvbl8xNmJwcChWUDlUaWxlRGF0YSAqdGQpOworCisjZW5kaWYgLyogQVZDT0RFQ19WUDlERUNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlkc3AuYyBiL2xpYmF2Y29kZWMvdnA5ZHNwLmMKaW5kZXggNTRlNzdlMi4uZjZkNzNmNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cDlkc3AuYworKysgYi9saWJhdmNvZGVjL3ZwOWRzcC5jCkBAIC0yNSw2ICsyNSw2MiBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJ2cDlkc3AuaCIKIAorY29uc3QgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBmZl92cDlfc3VicGVsX2ZpbHRlcnMpWzNdWzE2XVs4XSA9IHsKKyAgICBbRklMVEVSXzhUQVBfUkVHVUxBUl0gPSB7CisgICAgICAgIHsgIDAsICAwLCAgIDAsIDEyOCwgICAwLCAgIDAsICAwLCAgMCB9LAorICAgICAgICB7ICAwLCAgMSwgIC01LCAxMjYsICAgOCwgIC0zLCAgMSwgIDAgfSwKKyAgICAgICAgeyAtMSwgIDMsIC0xMCwgMTIyLCAgMTgsICAtNiwgIDIsICAwIH0sCisgICAgICAgIHsgLTEsICA0LCAtMTMsIDExOCwgIDI3LCAgLTksICAzLCAtMSB9LAorICAgICAgICB7IC0xLCAgNCwgLTE2LCAxMTIsICAzNywgLTExLCAgNCwgLTEgfSwKKyAgICAgICAgeyAtMSwgIDUsIC0xOCwgMTA1LCAgNDgsIC0xNCwgIDQsIC0xIH0sCisgICAgICAgIHsgLTEsICA1LCAtMTksICA5NywgIDU4LCAtMTYsICA1LCAtMSB9LAorICAgICAgICB7IC0xLCAgNiwgLTE5LCAgODgsICA2OCwgLTE4LCAgNSwgLTEgfSwKKyAgICAgICAgeyAtMSwgIDYsIC0xOSwgIDc4LCAgNzgsIC0xOSwgIDYsIC0xIH0sCisgICAgICAgIHsgLTEsICA1LCAtMTgsICA2OCwgIDg4LCAtMTksICA2LCAtMSB9LAorICAgICAgICB7IC0xLCAgNSwgLTE2LCAgNTgsICA5NywgLTE5LCAgNSwgLTEgfSwKKyAgICAgICAgeyAtMSwgIDQsIC0xNCwgIDQ4LCAxMDUsIC0xOCwgIDUsIC0xIH0sCisgICAgICAgIHsgLTEsICA0LCAtMTEsICAzNywgMTEyLCAtMTYsICA0LCAtMSB9LAorICAgICAgICB7IC0xLCAgMywgIC05LCAgMjcsIDExOCwgLTEzLCAgNCwgLTEgfSwKKyAgICAgICAgeyAgMCwgIDIsICAtNiwgIDE4LCAxMjIsIC0xMCwgIDMsIC0xIH0sCisgICAgICAgIHsgIDAsICAxLCAgLTMsICAgOCwgMTI2LCAgLTUsICAxLCAgMCB9LAorICAgIH0sIFtGSUxURVJfOFRBUF9TSEFSUF0gPSB7CisgICAgICAgIHsgIDAsICAwLCAgIDAsIDEyOCwgICAwLCAgIDAsICAwLCAgMCB9LAorICAgICAgICB7IC0xLCAgMywgIC03LCAxMjcsICAgOCwgIC0zLCAgMSwgIDAgfSwKKyAgICAgICAgeyAtMiwgIDUsIC0xMywgMTI1LCAgMTcsICAtNiwgIDMsIC0xIH0sCisgICAgICAgIHsgLTMsICA3LCAtMTcsIDEyMSwgIDI3LCAtMTAsICA1LCAtMiB9LAorICAgICAgICB7IC00LCAgOSwgLTIwLCAxMTUsICAzNywgLTEzLCAgNiwgLTIgfSwKKyAgICAgICAgeyAtNCwgMTAsIC0yMywgMTA4LCAgNDgsIC0xNiwgIDgsIC0zIH0sCisgICAgICAgIHsgLTQsIDEwLCAtMjQsIDEwMCwgIDU5LCAtMTksICA5LCAtMyB9LAorICAgICAgICB7IC00LCAxMSwgLTI0LCAgOTAsICA3MCwgLTIxLCAxMCwgLTQgfSwKKyAgICAgICAgeyAtNCwgMTEsIC0yMywgIDgwLCAgODAsIC0yMywgMTEsIC00IH0sCisgICAgICAgIHsgLTQsIDEwLCAtMjEsICA3MCwgIDkwLCAtMjQsIDExLCAtNCB9LAorICAgICAgICB7IC0zLCAgOSwgLTE5LCAgNTksIDEwMCwgLTI0LCAxMCwgLTQgfSwKKyAgICAgICAgeyAtMywgIDgsIC0xNiwgIDQ4LCAxMDgsIC0yMywgMTAsIC00IH0sCisgICAgICAgIHsgLTIsICA2LCAtMTMsICAzNywgMTE1LCAtMjAsICA5LCAtNCB9LAorICAgICAgICB7IC0yLCAgNSwgLTEwLCAgMjcsIDEyMSwgLTE3LCAgNywgLTMgfSwKKyAgICAgICAgeyAtMSwgIDMsICAtNiwgIDE3LCAxMjUsIC0xMywgIDUsIC0yIH0sCisgICAgICAgIHsgIDAsICAxLCAgLTMsICAgOCwgMTI3LCAgLTcsICAzLCAtMSB9LAorICAgIH0sIFtGSUxURVJfOFRBUF9TTU9PVEhdID0geworICAgICAgICB7ICAwLCAgMCwgICAwLCAxMjgsICAgMCwgICAwLCAgMCwgIDAgfSwKKyAgICAgICAgeyAtMywgLTEsICAzMiwgIDY0LCAgMzgsICAgMSwgLTMsICAwIH0sCisgICAgICAgIHsgLTIsIC0yLCAgMjksICA2MywgIDQxLCAgIDIsIC0zLCAgMCB9LAorICAgICAgICB7IC0yLCAtMiwgIDI2LCAgNjMsICA0MywgICA0LCAtNCwgIDAgfSwKKyAgICAgICAgeyAtMiwgLTMsICAyNCwgIDYyLCAgNDYsICAgNSwgLTQsICAwIH0sCisgICAgICAgIHsgLTIsIC0zLCAgMjEsICA2MCwgIDQ5LCAgIDcsIC00LCAgMCB9LAorICAgICAgICB7IC0xLCAtNCwgIDE4LCAgNTksICA1MSwgICA5LCAtNCwgIDAgfSwKKyAgICAgICAgeyAtMSwgLTQsICAxNiwgIDU3LCAgNTMsICAxMiwgLTQsIC0xIH0sCisgICAgICAgIHsgLTEsIC00LCAgMTQsICA1NSwgIDU1LCAgMTQsIC00LCAtMSB9LAorICAgICAgICB7IC0xLCAtNCwgIDEyLCAgNTMsICA1NywgIDE2LCAtNCwgLTEgfSwKKyAgICAgICAgeyAgMCwgLTQsICAgOSwgIDUxLCAgNTksICAxOCwgLTQsIC0xIH0sCisgICAgICAgIHsgIDAsIC00LCAgIDcsICA0OSwgIDYwLCAgMjEsIC0zLCAtMiB9LAorICAgICAgICB7ICAwLCAtNCwgICA1LCAgNDYsICA2MiwgIDI0LCAtMywgLTIgfSwKKyAgICAgICAgeyAgMCwgLTQsICAgNCwgIDQzLCAgNjMsICAyNiwgLTIsIC0yIH0sCisgICAgICAgIHsgIDAsIC0zLCAgIDIsICA0MSwgIDYzLCAgMjksIC0yLCAtMiB9LAorICAgICAgICB7ICAwLCAtMywgICAxLCAgMzgsICA2NCwgIDMyLCAtMSwgLTMgfSwKKyAgICB9Cit9OworCisKIGF2X2NvbGQgdm9pZCBmZl92cDlkc3BfaW5pdChWUDlEU1BDb250ZXh0ICpkc3AsIGludCBicHAsIGludCBiaXRleGFjdCkKIHsKICAgICBpZiAoYnBwID09IDgpIHsKQEAgLTM2LDYgKzkyLDggQEAKICAgICAgICAgZmZfdnA5ZHNwX2luaXRfMTIoZHNwKTsKICAgICB9CiAKKyAgICBpZiAoQVJDSF9BQVJDSDY0KSBmZl92cDlkc3BfaW5pdF9hYXJjaDY0KGRzcCwgYnBwKTsKKyAgICBpZiAoQVJDSF9BUk0pIGZmX3ZwOWRzcF9pbml0X2FybShkc3AsIGJwcCk7CiAgICAgaWYgKEFSQ0hfWDg2KSBmZl92cDlkc3BfaW5pdF94ODYoZHNwLCBicHAsIGJpdGV4YWN0KTsKICAgICBpZiAoQVJDSF9NSVBTKSBmZl92cDlkc3BfaW5pdF9taXBzKGRzcCwgYnBwKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA5ZHNwLmggYi9saWJhdmNvZGVjL3ZwOWRzcC5oCmluZGV4IDAxNmE5YmIuLmUyMjU2MzEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvdnA5ZHNwLmgKKysrIGIvbGliYXZjb2RlYy92cDlkc3AuaApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCi0jaW5jbHVkZSAidnA5LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDkuaCIKIAogdHlwZWRlZiB2b2lkICgqdnA5X21jX2Z1bmMpKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBwdHJkaWZmX3QgcmVmX3N0cmlkZSwKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICAgKi8KICAgICAvLyBGSVhNRShyYnVsdGplKSBtYXliZSByZXBsYWNlIGxlZnQvdG9wIHBvaW50ZXJzIHdpdGggSEFWRV9UT1AvCiAgICAgLy8gSEFWRV9MRUZUL0hBVkVfVE9QUklHSFQgZmxhZ3MgaW5zdGVhZCwgYW5kIHRoZW4gaGFuZGxlIGl0IGluLXBsYWNlPwotICAgIC8vIGFsc28gbmVlZHMgdG8gZml0IGluIHdpdGggd2hhdCBoMjY0L3ZwOC9ldGMgZG8KKyAgICAvLyBhbHNvIG5lZWRzIHRvIGZpdCBpbiB3aXRoIHdoYXQgSC4yNjQvVlA4L2V0YyBkbwogICAgIHZvaWQgKCppbnRyYV9wcmVkW05fVFhGTV9TSVpFU11bTl9JTlRSQV9QUkVEX01PREVTXSkodWludDhfdCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmxlZnQsCkBAIC0xMTEsMjEgKzExMSwyNSBAQAogICAgICAqCiAgICAgICogZHN0L3N0cmlkZSBhcmUgYWxpZ25lZCBieSBoc2l6ZQogICAgICAqLwotICAgIHZwOV9tY19mdW5jIG1jWzVdWzRdWzJdWzJdWzJdOworICAgIHZwOV9tY19mdW5jIG1jWzVdW05fRklMVEVSU11bMl1bMl1bMl07CiAKICAgICAvKgogICAgICAqIGZvciBzY2FsYWJsZSBNQywgZmlyc3QgMyBkaW1lbnNpb25zIGlkZW50aWNhbCB0byBhYm92ZSwgdGhlIG90aGVyIHR3bwogICAgICAqIGRvbid0IGV4aXN0IHNpbmNlIGl0IGNoYW5nZXMgcGVyIHN0ZXBzaXplLgogICAgICAqLwotICAgIHZwOV9zY2FsZWRfbWNfZnVuYyBzbWNbNV1bNF1bMl07CisgICAgdnA5X3NjYWxlZF9tY19mdW5jIHNtY1s1XVtOX0ZJTFRFUlNdWzJdOwogfSBWUDlEU1BDb250ZXh0OwogCitleHRlcm4gY29uc3QgaW50MTZfdCBmZl92cDlfc3VicGVsX2ZpbHRlcnNbM11bMTZdWzhdOworCiB2b2lkIGZmX3ZwOWRzcF9pbml0KFZQOURTUENvbnRleHQgKmRzcCwgaW50IGJwcCwgaW50IGJpdGV4YWN0KTsKIAogdm9pZCBmZl92cDlkc3BfaW5pdF84KFZQOURTUENvbnRleHQgKmRzcCk7CiB2b2lkIGZmX3ZwOWRzcF9pbml0XzEwKFZQOURTUENvbnRleHQgKmRzcCk7CiB2b2lkIGZmX3ZwOWRzcF9pbml0XzEyKFZQOURTUENvbnRleHQgKmRzcCk7CiAKK3ZvaWQgZmZfdnA5ZHNwX2luaXRfYWFyY2g2NChWUDlEU1BDb250ZXh0ICpkc3AsIGludCBicHApOwordm9pZCBmZl92cDlkc3BfaW5pdF9hcm0oVlA5RFNQQ29udGV4dCAqZHNwLCBpbnQgYnBwKTsKIHZvaWQgZmZfdnA5ZHNwX2luaXRfeDg2KFZQOURTUENvbnRleHQgKmRzcCwgaW50IGJwcCwgaW50IGJpdGV4YWN0KTsKIHZvaWQgZmZfdnA5ZHNwX2luaXRfbWlwcyhWUDlEU1BDb250ZXh0ICpkc3AsIGludCBicHApOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwOWRzcF90ZW1wbGF0ZS5jIGIvbGliYXZjb2RlYy92cDlkc3BfdGVtcGxhdGUuYwppbmRleCA0ZDgxMGZlLi5iYjU0NTYxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3ZwOWRzcF90ZW1wbGF0ZS5jCisrKyBiL2xpYmF2Y29kZWMvdnA5ZHNwX3RlbXBsYXRlLmMKQEAgLTE5OTEsNjEgKzE5OTEsNiBAQAogCiAjZW5kaWYgLyogQklUX0RFUFRIICE9IDEyICovCiAKLXN0YXRpYyBjb25zdCBpbnQxNl90IHZwOV9zdWJwZWxfZmlsdGVyc1szXVsxNl1bOF0gPSB7Ci0gICAgW0ZJTFRFUl84VEFQX1JFR1VMQVJdID0gewotICAgICAgICB7ICAwLCAgMCwgICAwLCAxMjgsICAgMCwgICAwLCAgMCwgIDAgfSwKLSAgICAgICAgeyAgMCwgIDEsICAtNSwgMTI2LCAgIDgsICAtMywgIDEsICAwIH0sCi0gICAgICAgIHsgLTEsICAzLCAtMTAsIDEyMiwgIDE4LCAgLTYsICAyLCAgMCB9LAotICAgICAgICB7IC0xLCAgNCwgLTEzLCAxMTgsICAyNywgIC05LCAgMywgLTEgfSwKLSAgICAgICAgeyAtMSwgIDQsIC0xNiwgMTEyLCAgMzcsIC0xMSwgIDQsIC0xIH0sCi0gICAgICAgIHsgLTEsICA1LCAtMTgsIDEwNSwgIDQ4LCAtMTQsICA0LCAtMSB9LAotICAgICAgICB7IC0xLCAgNSwgLTE5LCAgOTcsICA1OCwgLTE2LCAgNSwgLTEgfSwKLSAgICAgICAgeyAtMSwgIDYsIC0xOSwgIDg4LCAgNjgsIC0xOCwgIDUsIC0xIH0sCi0gICAgICAgIHsgLTEsICA2LCAtMTksICA3OCwgIDc4LCAtMTksICA2LCAtMSB9LAotICAgICAgICB7IC0xLCAgNSwgLTE4LCAgNjgsICA4OCwgLTE5LCAgNiwgLTEgfSwKLSAgICAgICAgeyAtMSwgIDUsIC0xNiwgIDU4LCAgOTcsIC0xOSwgIDUsIC0xIH0sCi0gICAgICAgIHsgLTEsICA0LCAtMTQsICA0OCwgMTA1LCAtMTgsICA1LCAtMSB9LAotICAgICAgICB7IC0xLCAgNCwgLTExLCAgMzcsIDExMiwgLTE2LCAgNCwgLTEgfSwKLSAgICAgICAgeyAtMSwgIDMsICAtOSwgIDI3LCAxMTgsIC0xMywgIDQsIC0xIH0sCi0gICAgICAgIHsgIDAsICAyLCAgLTYsICAxOCwgMTIyLCAtMTAsICAzLCAtMSB9LAotICAgICAgICB7ICAwLCAgMSwgIC0zLCAgIDgsIDEyNiwgIC01LCAgMSwgIDAgfSwKLSAgICB9LCBbRklMVEVSXzhUQVBfU0hBUlBdID0gewotICAgICAgICB7ICAwLCAgMCwgICAwLCAxMjgsICAgMCwgICAwLCAgMCwgIDAgfSwKLSAgICAgICAgeyAtMSwgIDMsICAtNywgMTI3LCAgIDgsICAtMywgIDEsICAwIH0sCi0gICAgICAgIHsgLTIsICA1LCAtMTMsIDEyNSwgIDE3LCAgLTYsICAzLCAtMSB9LAotICAgICAgICB7IC0zLCAgNywgLTE3LCAxMjEsICAyNywgLTEwLCAgNSwgLTIgfSwKLSAgICAgICAgeyAtNCwgIDksIC0yMCwgMTE1LCAgMzcsIC0xMywgIDYsIC0yIH0sCi0gICAgICAgIHsgLTQsIDEwLCAtMjMsIDEwOCwgIDQ4LCAtMTYsICA4LCAtMyB9LAotICAgICAgICB7IC00LCAxMCwgLTI0LCAxMDAsICA1OSwgLTE5LCAgOSwgLTMgfSwKLSAgICAgICAgeyAtNCwgMTEsIC0yNCwgIDkwLCAgNzAsIC0yMSwgMTAsIC00IH0sCi0gICAgICAgIHsgLTQsIDExLCAtMjMsICA4MCwgIDgwLCAtMjMsIDExLCAtNCB9LAotICAgICAgICB7IC00LCAxMCwgLTIxLCAgNzAsICA5MCwgLTI0LCAxMSwgLTQgfSwKLSAgICAgICAgeyAtMywgIDksIC0xOSwgIDU5LCAxMDAsIC0yNCwgMTAsIC00IH0sCi0gICAgICAgIHsgLTMsICA4LCAtMTYsICA0OCwgMTA4LCAtMjMsIDEwLCAtNCB9LAotICAgICAgICB7IC0yLCAgNiwgLTEzLCAgMzcsIDExNSwgLTIwLCAgOSwgLTQgfSwKLSAgICAgICAgeyAtMiwgIDUsIC0xMCwgIDI3LCAxMjEsIC0xNywgIDcsIC0zIH0sCi0gICAgICAgIHsgLTEsICAzLCAgLTYsICAxNywgMTI1LCAtMTMsICA1LCAtMiB9LAotICAgICAgICB7ICAwLCAgMSwgIC0zLCAgIDgsIDEyNywgIC03LCAgMywgLTEgfSwKLSAgICB9LCBbRklMVEVSXzhUQVBfU01PT1RIXSA9IHsKLSAgICAgICAgeyAgMCwgIDAsICAgMCwgMTI4LCAgIDAsICAgMCwgIDAsICAwIH0sCi0gICAgICAgIHsgLTMsIC0xLCAgMzIsICA2NCwgIDM4LCAgIDEsIC0zLCAgMCB9LAotICAgICAgICB7IC0yLCAtMiwgIDI5LCAgNjMsICA0MSwgICAyLCAtMywgIDAgfSwKLSAgICAgICAgeyAtMiwgLTIsICAyNiwgIDYzLCAgNDMsICAgNCwgLTQsICAwIH0sCi0gICAgICAgIHsgLTIsIC0zLCAgMjQsICA2MiwgIDQ2LCAgIDUsIC00LCAgMCB9LAotICAgICAgICB7IC0yLCAtMywgIDIxLCAgNjAsICA0OSwgICA3LCAtNCwgIDAgfSwKLSAgICAgICAgeyAtMSwgLTQsICAxOCwgIDU5LCAgNTEsICAgOSwgLTQsICAwIH0sCi0gICAgICAgIHsgLTEsIC00LCAgMTYsICA1NywgIDUzLCAgMTIsIC00LCAtMSB9LAotICAgICAgICB7IC0xLCAtNCwgIDE0LCAgNTUsICA1NSwgIDE0LCAtNCwgLTEgfSwKLSAgICAgICAgeyAtMSwgLTQsICAxMiwgIDUzLCAgNTcsICAxNiwgLTQsIC0xIH0sCi0gICAgICAgIHsgIDAsIC00LCAgIDksICA1MSwgIDU5LCAgMTgsIC00LCAtMSB9LAotICAgICAgICB7ICAwLCAtNCwgICA3LCAgNDksICA2MCwgIDIxLCAtMywgLTIgfSwKLSAgICAgICAgeyAgMCwgLTQsICAgNSwgIDQ2LCAgNjIsICAyNCwgLTMsIC0yIH0sCi0gICAgICAgIHsgIDAsIC00LCAgIDQsICA0MywgIDYzLCAgMjYsIC0yLCAtMiB9LAotICAgICAgICB7ICAwLCAtMywgICAyLCAgNDEsICA2MywgIDI5LCAtMiwgLTIgfSwKLSAgICAgICAgeyAgMCwgLTMsICAgMSwgIDM4LCAgNjQsICAzMiwgLTEsIC0zIH0sCi0gICAgfQotfTsKLQogI2RlZmluZSBGSUxURVJfOFRBUChzcmMsIHgsIEYsIHN0cmlkZSkgXAogICAgIGF2X2NsaXBfcGl4ZWwoKEZbMF0gKiBzcmNbeCArIC0zICogc3RyaWRlXSArIFwKICAgICAgICAgICAgICAgICAgICBGWzFdICogc3JjW3ggKyAtMiAqIHN0cmlkZV0gKyBcCkBAIC0yMTU1LDcgKzIxMDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSkgXAogeyBcCiAgICAgYXZnIyNfOHRhcF8xZF8jI2RpciMjX2MoZHN0LCBkc3Rfc3RyaWRlLCBzcmMsIHNyY19zdHJpZGUsIHN6LCBoLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdnA5X3N1YnBlbF9maWx0ZXJzW3R5cGVfaWR4XVtkaXJfbV0pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfdnA5X3N1YnBlbF9maWx0ZXJzW3R5cGVfaWR4XVtkaXJfbV0pOyBcCiB9CiAKICNkZWZpbmUgZmlsdGVyX2ZuXzJkKHN6LCB0eXBlLCB0eXBlX2lkeCwgYXZnKSBcCkBAIC0yMTY0LDggKzIxMDksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBpbnQgbXgsIGludCBteSkgXAogeyBcCiAgICAgYXZnIyNfOHRhcF8yZF9odl9jKGRzdCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCBzeiwgaCwgXAotICAgICAgICAgICAgICAgICAgICAgICB2cDlfc3VicGVsX2ZpbHRlcnNbdHlwZV9pZHhdW214XSwgXAotICAgICAgICAgICAgICAgICAgICAgICB2cDlfc3VicGVsX2ZpbHRlcnNbdHlwZV9pZHhdW215XSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgZmZfdnA5X3N1YnBlbF9maWx0ZXJzW3R5cGVfaWR4XVtteF0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgZmZfdnA5X3N1YnBlbF9maWx0ZXJzW3R5cGVfaWR4XVtteV0pOyBcCiB9CiAKICNpZiBCSVRfREVQVEggIT0gMTIKQEAgLTI0NTQsNyArMjM5OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15LCBpbnQgZHgsIGludCBkeSkgXAogeyBcCiAgICAgYXZnIyNfc2NhbGVkXzh0YXBfYyhkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgc3osIGgsIG14LCBteSwgZHgsIGR5LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICB2cDlfc3VicGVsX2ZpbHRlcnNbdHlwZV9pZHhdKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgZmZfdnA5X3N1YnBlbF9maWx0ZXJzW3R5cGVfaWR4XSk7IFwKIH0KIAogI2lmIEJJVF9ERVBUSCAhPSAxMgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlscGYuYyBiL2xpYmF2Y29kZWMvdnA5bHBmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0Y2VkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdnA5bHBmLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBWUDkgY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplIGdtYWlsIGNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAidnA5ZGVjLmgiCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsdGVyX3BsYW5lX2NvbHMoVlA5Q29udGV4dCAqcywgaW50IGNvbCwgaW50IHNzX2gsIGludCBzc192LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpsdmwsIHVpbnQ4X3QgKCptYXNrKVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgbHMpCit7CisgICAgaW50IHksIHgsIGJ5dGVzcGVycGl4ZWwgPSBzLT5ieXRlc3BlcnBpeGVsOworCisgICAgLy8gZmlsdGVyIGVkZ2VzIGJldHdlZW4gY29sdW1ucyAoZS5nLiBibG9jazEgfCBibG9jazIpCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkgKz0gMiA8PCBzc192LCBkc3QgKz0gMTYgKiBscywgbHZsICs9IDE2IDw8IHNzX3YpIHsKKyAgICAgICAgdWludDhfdCAqcHRyID0gZHN0LCAqbCA9IGx2bCwgKmhtYXNrMSA9IG1hc2tbeV0sICpobWFzazIgPSBtYXNrW3kgKyAxICsgc3Nfdl07CisgICAgICAgIHVuc2lnbmVkIGhtMSA9IGhtYXNrMVswXSB8IGhtYXNrMVsxXSB8IGhtYXNrMVsyXSwgaG0xMyA9IGhtYXNrMVszXTsKKyAgICAgICAgdW5zaWduZWQgaG0yID0gaG1hc2syWzFdIHwgaG1hc2syWzJdLCBobTIzID0gaG1hc2syWzNdOworICAgICAgICB1bnNpZ25lZCBobSA9IGhtMSB8IGhtMiB8IGhtMTMgfCBobTIzOworCisgICAgICAgIGZvciAoeCA9IDE7IGhtICYgfih4IC0gMSk7IHggPDw9IDEsIHB0ciArPSA4ICogYnl0ZXNwZXJwaXhlbCA+PiBzc19oKSB7CisgICAgICAgICAgICBpZiAoY29sIHx8IHggPiAxKSB7CisgICAgICAgICAgICAgICAgaWYgKGhtMSAmIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IEwgPSAqbCwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSwgSSA9IHMtPmZpbHRlcl9sdXQubGltX2x1dFtMXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaG1hc2sxWzBdICYgeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhtYXNrMlswXSAmIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGxbOCA8PCBzc192XSA9PSBMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfMTZbMF0ocHRyLCBscywgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WzJdWzBdKHB0ciwgbHMsIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhtMiAmIHgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEwgPSBsWzggPDwgc3Nfdl07CisgICAgICAgICAgICAgICAgICAgICAgICBIIHw9IChMID4+IDQpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBFIHw9IHMtPmZpbHRlcl9sdXQubWJsaW1fbHV0W0xdIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBJIHw9IHMtPmZpbHRlcl9sdXQubGltX2x1dFtMXSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyX21peDJbISEoaG1hc2sxWzFdICYgeCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFshIShobWFzazJbMV0gJiB4KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzBdKHB0ciwgbHMsIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbISEoaG1hc2sxWzFdICYgeCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswXShwdHIsIGxzLCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaG0yICYgeCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTCA9IGxbOCA8PCBzc192XSwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSwgSSA9IHMtPmZpbHRlcl9sdXQubGltX2x1dFtMXTsKKworICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFshIShobWFzazJbMV0gJiB4KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0ocHRyICsgOCAqIGxzLCBscywgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNzX2gpIHsKKyAgICAgICAgICAgICAgICBpZiAoeCAmIDB4QUEpCisgICAgICAgICAgICAgICAgICAgIGwgKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGhtMTMgJiB4KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMID0gKmwsIEggPSBMID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhtMjMgJiB4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMID0gbFs4IDw8IHNzX3ZdOworICAgICAgICAgICAgICAgICAgICAgICAgSCB8PSAoTCA+PiA0KSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgRSB8PSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgSSB8PSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF0gPDwgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWzBdWzBdWzBdKHB0ciArIDQgKiBieXRlc3BlcnBpeGVsLCBscywgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFswXVswXShwdHIgKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHMsIEUsIEksIEgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChobTIzICYgeCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTCA9IGxbOCA8PCBzc192XSwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSwgSSA9IHMtPmZpbHRlcl9sdXQubGltX2x1dFtMXTsKKworICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFswXVswXShwdHIgKyA4ICogbHMgKyA0ICogYnl0ZXNwZXJwaXhlbCwgbHMsIEUsIEksIEgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmlsdGVyX3BsYW5lX3Jvd3MoVlA5Q29udGV4dCAqcywgaW50IHJvdywgaW50IHNzX2gsIGludCBzc192LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpsdmwsIHVpbnQ4X3QgKCptYXNrKVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgbHMpCit7CisgICAgaW50IHksIHgsIGJ5dGVzcGVycGl4ZWwgPSBzLT5ieXRlc3BlcnBpeGVsOworCisgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jazEKKyAgICAvLyBmaWx0ZXIgZWRnZXMgYmV0d2VlbiByb3dzIChlLmcuIC0tLS0tLSkKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrMgorICAgIGZvciAoeSA9IDA7IHkgPCA4OyB5KyssIGRzdCArPSA4ICogbHMgPj4gc3NfdikgeworICAgICAgICB1aW50OF90ICpwdHIgPSBkc3QsICpsID0gbHZsLCAqdm1hc2sgPSBtYXNrW3ldOworICAgICAgICB1bnNpZ25lZCB2bSA9IHZtYXNrWzBdIHwgdm1hc2tbMV0gfCB2bWFza1syXSwgdm0zID0gdm1hc2tbM107CisKKyAgICAgICAgZm9yICh4ID0gMTsgdm0gJiB+KHggLSAxKTsgeCA8PD0gKDIgPDwgc3NfaCksIHB0ciArPSAxNiAqIGJ5dGVzcGVycGl4ZWwsIGwgKz0gMiA8PCBzc19oKSB7CisgICAgICAgICAgICBpZiAocm93IHx8IHkpIHsKKyAgICAgICAgICAgICAgICBpZiAodm0gJiB4KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMID0gKmwsIEggPSBMID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZtYXNrWzBdICYgeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZtYXNrWzBdICYgKHggPDwgKDEgKyBzc19oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGxbMSArIHNzX2hdID09IEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl8xNlsxXShwdHIsIGxzLCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyXzhbMl1bMV0ocHRyLCBscywgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodm0gJiAoeCA8PCAoMSArIHNzX2gpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTCA9IGxbMSArIHNzX2hdOworICAgICAgICAgICAgICAgICAgICAgICAgSCB8PSAoTCA+PiA0KSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgRSB8PSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgSSB8PSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF0gPDwgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl9taXgyWyEhKHZtYXNrWzFdICYgIHgpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbISEodm1hc2tbMV0gJiAoeCA8PCAoMSArIHNzX2gpKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXShwdHIsIGxzLCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WyEhKHZtYXNrWzFdICYgeCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXShwdHIsIGxzLCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodm0gJiAoeCA8PCAoMSArIHNzX2gpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTCA9IGxbMSArIHNzX2hdLCBIID0gTCA+PiA0OworICAgICAgICAgICAgICAgICAgICBpbnQgRSA9IHMtPmZpbHRlcl9sdXQubWJsaW1fbHV0W0xdLCBJID0gcy0+ZmlsdGVyX2x1dC5saW1fbHV0W0xdOworCisgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5sb29wX2ZpbHRlcl84WyEhKHZtYXNrWzFdICYgKHggPDwgKDEgKyBzc19oKSkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxXShwdHIgKyA4ICogYnl0ZXNwZXJwaXhlbCwgbHMsIEUsIEksIEgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3NfdikgeworICAgICAgICAgICAgICAgIGlmICh2bTMgJiB4KSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMID0gKmwsIEggPSBMID4+IDQ7CisgICAgICAgICAgICAgICAgICAgIGludCBFID0gcy0+ZmlsdGVyX2x1dC5tYmxpbV9sdXRbTF0sIEkgPSBzLT5maWx0ZXJfbHV0LmxpbV9sdXRbTF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZtMyAmICh4IDw8ICgxICsgc3NfaCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMID0gbFsxICsgc3NfaF07CisgICAgICAgICAgICAgICAgICAgICAgICBIIHw9IChMID4+IDQpIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBFIHw9IHMtPmZpbHRlcl9sdXQubWJsaW1fbHV0W0xdIDw8IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBJIHw9IHMtPmZpbHRlcl9sdXQubGltX2x1dFtMXSA8PCA4OworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLmxvb3BfZmlsdGVyX21peDJbMF1bMF1bMV0ocHRyICsgbHMgKiA0LCBscywgRSwgSSwgSCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFswXVsxXShwdHIgKyBscyAqIDQsIGxzLCBFLCBJLCBIKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodm0zICYgKHggPDwgKDEgKyBzc19oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IEwgPSBsWzEgKyBzc19oXSwgSCA9IEwgPj4gNDsKKyAgICAgICAgICAgICAgICAgICAgaW50IEUgPSBzLT5maWx0ZXJfbHV0Lm1ibGltX2x1dFtMXSwgSSA9IHMtPmZpbHRlcl9sdXQubGltX2x1dFtMXTsKKworICAgICAgICAgICAgICAgICAgICBzLT5kc3AubG9vcF9maWx0ZXJfOFswXVsxXShwdHIgKyBscyAqIDQgKyA4ICogYnl0ZXNwZXJwaXhlbCwgbHMsIEUsIEksIEgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3NfdikgeworICAgICAgICAgICAgaWYgKHkgJiAxKQorICAgICAgICAgICAgICAgIGx2bCArPSAxNjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGx2bCArPSA4OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX3ZwOV9sb29wZmlsdGVyX3NiKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVlA5RmlsdGVyICpsZmx2bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IGNvbCwgcHRyZGlmZl90IHlvZmYsIHB0cmRpZmZfdCB1dm9mZikKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkZyYW1lICpmID0gcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mOworICAgIHVpbnQ4X3QgKmRzdCA9IGYtPmRhdGFbMF0gKyB5b2ZmOworICAgIHB0cmRpZmZfdCBsc195ID0gZi0+bGluZXNpemVbMF0sIGxzX3V2ID0gZi0+bGluZXNpemVbMV07CisgICAgdWludDhfdCAoKnV2X21hc2tzKVs4XVs0XSA9IGxmbHZsLT5tYXNrW3MtPnNzX2ggfCBzLT5zc192XTsKKyAgICBpbnQgcDsKKworICAgIC8qIEZJWE1FOiBJbiBob3cgZmFyIGNhbiB3ZSBpbnRlcmxlYXZlIHRoZSB2L2ggbG9vcGZpbHRlciBjYWxscz8gRS5nLgorICAgICAqIGlmIHlvdSB0aGluayBvZiB0aGVtIGFzIGFjdGluZyBvbiBhIDh4OCBibG9jayBtYXgsIHdlIGNhbiBpbnRlcmxlYXZlCisgICAgICogZWFjaCB2L2ggd2l0aGluIHRoZSBzaW5nbGUgeCBsb29wLCBidXQgdGhhdCBvbmx5IHdvcmtzIGlmIHdlIHdvcmsgb24KKyAgICAgKiA4IHBpeGVsIGJsb2NrcywgYW5kIHdlIHdvbid0IGFsd2F5cyBkbyB0aGF0ICh3ZSB3YW50IGF0IGxlYXN0IDE2cHgKKyAgICAgKiB0byB1c2UgU1NFMiBvcHRpbWl6YXRpb25zLCBwZXJoYXBzIDMyIGZvciBBVlgyKSAqLworCisgICAgZmlsdGVyX3BsYW5lX2NvbHMocywgY29sLCAwLCAwLCBsZmx2bC0+bGV2ZWwsIGxmbHZsLT5tYXNrWzBdWzBdLCBkc3QsIGxzX3kpOworICAgIGZpbHRlcl9wbGFuZV9yb3dzKHMsIHJvdywgMCwgMCwgbGZsdmwtPmxldmVsLCBsZmx2bC0+bWFza1swXVsxXSwgZHN0LCBsc195KTsKKworICAgIGZvciAocCA9IDA7IHAgPCAyOyBwKyspIHsKKyAgICAgICAgZHN0ID0gZi0+ZGF0YVsxICsgcF0gKyB1dm9mZjsKKyAgICAgICAgZmlsdGVyX3BsYW5lX2NvbHMocywgY29sLCBzLT5zc19oLCBzLT5zc192LCBsZmx2bC0+bGV2ZWwsIHV2X21hc2tzWzBdLCBkc3QsIGxzX3V2KTsKKyAgICAgICAgZmlsdGVyX3BsYW5lX3Jvd3Mocywgcm93LCBzLT5zc19oLCBzLT5zc192LCBsZmx2bC0+bGV2ZWwsIHV2X21hc2tzWzFdLCBkc3QsIGxzX3V2KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwOW12cy5jIGIvbGliYXZjb2RlYy92cDltdnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGRiMWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92cDltdnMuYwpAQCAtMCwwICsxLDM2NCBAQAorLyoKKyAqIFZQOSBjb21wYXRpYmxlIHZpZGVvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZwNTYuaCIKKyNpbmNsdWRlICJ2cDkuaCIKKyNpbmNsdWRlICJ2cDlkYXRhLmgiCisjaW5jbHVkZSAidnA5ZGVjLmgiCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgY2xhbXBfbXYoVlA1Nm12ICpkc3QsIGNvbnN0IFZQNTZtdiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDlUaWxlRGF0YSAqdGQpCit7CisgICAgZHN0LT54ID0gYXZfY2xpcChzcmMtPngsIHRkLT5taW5fbXYueCwgdGQtPm1heF9tdi54KTsKKyAgICBkc3QtPnkgPSBhdl9jbGlwKHNyYy0+eSwgdGQtPm1pbl9tdi55LCB0ZC0+bWF4X212LnkpOworfQorCitzdGF0aWMgdm9pZCBmaW5kX3JlZl9tdnMoVlA5VGlsZURhdGEgKnRkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZQNTZtdiAqcG12LCBpbnQgcmVmLCBpbnQgeiwgaW50IGlkeCwgaW50IHNiKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQ4X3QgbXZfcmVmX2Jsa19vZmZbTl9CU19TSVpFU11bOF1bMl0gPSB7CisgICAgICAgIFtCU182NHg2NF0gPSB7IHsgIDMsIC0xIH0sIHsgLTEsICAzIH0sIHsgIDQsIC0xIH0sIHsgLTEsICA0IH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDYsIC0xIH0gfSwKKyAgICAgICAgW0JTXzY0eDMyXSA9IHsgeyAgMCwgLTEgfSwgeyAtMSwgIDAgfSwgeyAgNCwgLTEgfSwgeyAtMSwgIDIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyAtMSwgLTEgfSwgeyAgMCwgLTMgfSwgeyAtMywgIDAgfSwgeyAgMiwgLTEgfSB9LAorICAgICAgICBbQlNfMzJ4NjRdID0geyB7IC0xLCAgMCB9LCB7ICAwLCAtMSB9LCB7IC0xLCAgNCB9LCB7ICAyLCAtMSB9LAorICAgICAgICAgICAgICAgICAgICAgICB7IC0xLCAtMSB9LCB7IC0zLCAgMCB9LCB7ICAwLCAtMyB9LCB7IC0xLCAgMiB9IH0sCisgICAgICAgIFtCU18zMngzMl0gPSB7IHsgIDEsIC0xIH0sIHsgLTEsICAxIH0sIHsgIDIsIC0xIH0sIHsgLTEsICAyIH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0zIH0sIHsgLTMsICAwIH0sIHsgLTMsIC0zIH0gfSwKKyAgICAgICAgW0JTXzMyeDE2XSA9IHsgeyAgMCwgLTEgfSwgeyAtMSwgIDAgfSwgeyAgMiwgLTEgfSwgeyAtMSwgLTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyAtMSwgIDEgfSwgeyAgMCwgLTMgfSwgeyAtMywgIDAgfSwgeyAtMywgLTMgfSB9LAorICAgICAgICBbQlNfMTZ4MzJdID0geyB7IC0xLCAgMCB9LCB7ICAwLCAtMSB9LCB7IC0xLCAgMiB9LCB7IC0xLCAtMSB9LAorICAgICAgICAgICAgICAgICAgICAgICB7ICAxLCAtMSB9LCB7IC0zLCAgMCB9LCB7ICAwLCAtMyB9LCB7IC0zLCAtMyB9IH0sCisgICAgICAgIFtCU18xNngxNl0gPSB7IHsgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgIDEsIC0xIH0sIHsgLTEsICAxIH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsgLTEsIC0xIH0sIHsgIDAsIC0zIH0sIHsgLTMsICAwIH0sIHsgLTMsIC0zIH0gfSwKKyAgICAgICAgW0JTXzE2eDhdICA9IHsgeyAgMCwgLTEgfSwgeyAtMSwgIDAgfSwgeyAgMSwgLTEgfSwgeyAtMSwgLTEgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyAgMCwgLTIgfSwgeyAtMiwgIDAgfSwgeyAtMiwgLTEgfSwgeyAtMSwgLTIgfSB9LAorICAgICAgICBbQlNfOHgxNl0gID0geyB7IC0xLCAgMCB9LCB7ICAwLCAtMSB9LCB7IC0xLCAgMSB9LCB7IC0xLCAtMSB9LAorICAgICAgICAgICAgICAgICAgICAgICB7IC0yLCAgMCB9LCB7ICAwLCAtMiB9LCB7IC0xLCAtMiB9LCB7IC0yLCAtMSB9IH0sCisgICAgICAgIFtCU184eDhdICAgPSB7IHsgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgLTEsIC0xIH0sIHsgIDAsIC0yIH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsgLTIsICAwIH0sIHsgLTEsIC0yIH0sIHsgLTIsIC0xIH0sIHsgLTIsIC0yIH0gfSwKKyAgICAgICAgW0JTXzh4NF0gICA9IHsgeyAgMCwgLTEgfSwgeyAtMSwgIDAgfSwgeyAtMSwgLTEgfSwgeyAgMCwgLTIgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyAtMiwgIDAgfSwgeyAtMSwgLTIgfSwgeyAtMiwgLTEgfSwgeyAtMiwgLTIgfSB9LAorICAgICAgICBbQlNfNHg4XSAgID0geyB7ICAwLCAtMSB9LCB7IC0xLCAgMCB9LCB7IC0xLCAtMSB9LCB7ICAwLCAtMiB9LAorICAgICAgICAgICAgICAgICAgICAgICB7IC0yLCAgMCB9LCB7IC0xLCAtMiB9LCB7IC0yLCAtMSB9LCB7IC0yLCAtMiB9IH0sCisgICAgICAgIFtCU180eDRdICAgPSB7IHsgIDAsIC0xIH0sIHsgLTEsICAwIH0sIHsgLTEsIC0xIH0sIHsgIDAsIC0yIH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsgLTIsICAwIH0sIHsgLTEsIC0yIH0sIHsgLTIsIC0xIH0sIHsgLTIsIC0yIH0gfSwKKyAgICB9OworICAgIFZQOUNvbnRleHQgKnMgPSB0ZC0+czsKKyAgICBWUDlCbG9jayAqYiA9IHRkLT5iOworICAgIGludCByb3cgPSB0ZC0+cm93LCBjb2wgPSB0ZC0+Y29sLCByb3c3ID0gdGQtPnJvdzc7CisgICAgY29uc3QgaW50OF90ICgqcClbMl0gPSBtdl9yZWZfYmxrX29mZltiLT5ic107CisjZGVmaW5lIElOVkFMSURfTVYgMHg4MDAwODAwMFUKKyAgICB1aW50MzJfdCBtZW0gPSBJTlZBTElEX01WLCBtZW1fc3ViOHg4ID0gSU5WQUxJRF9NVjsKKyAgICBpbnQgaTsKKworI2RlZmluZSBSRVRVUk5fRElSRUNUX01WKG12KSAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBtID0gQVZfUk4zMkEoJm12KTsgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWlkeCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfV04zMkEocG12LCBtKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKG1lbSA9PSBJTlZBTElEX01WKSB7ICAgICAgICAgXAorICAgICAgICAgICAgbWVtID0gbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKG0gIT0gbWVtKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfV04zMkEocG12LCBtKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICBpZiAoc2IgPj0gMCkgeworICAgICAgICBpZiAoc2IgPT0gMiB8fCBzYiA9PSAxKSB7CisgICAgICAgICAgICBSRVRVUk5fRElSRUNUX01WKGItPm12WzBdW3pdKTsKKyAgICAgICAgfSBlbHNlIGlmIChzYiA9PSAzKSB7CisgICAgICAgICAgICBSRVRVUk5fRElSRUNUX01WKGItPm12WzJdW3pdKTsKKyAgICAgICAgICAgIFJFVFVSTl9ESVJFQ1RfTVYoYi0+bXZbMV1bel0pOworICAgICAgICAgICAgUkVUVVJOX0RJUkVDVF9NVihiLT5tdlswXVt6XSk7CisgICAgICAgIH0KKworI2RlZmluZSBSRVRVUk5fTVYobXYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNiID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVlA1Nm12IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X2Fzc2VydDIoaWR4ID09IDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXZfYXNzZXJ0MihtZW0gIT0gSU5WQUxJRF9NVik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobWVtX3N1Yjh4OCA9PSBJTlZBTElEX01WKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjbGFtcF9tdigmdG1wLCAmbXYsIHRkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG0gPSBBVl9STjMyQSgmdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKG0gIT0gbWVtKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEocG12LCBtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtZW1fc3ViOHg4ID0gQVZfUk4zMkEoJm12KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1fc3ViOHg4ICE9IEFWX1JOMzJBKCZtdikpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY2xhbXBfbXYoJnRtcCwgJm12LCB0ZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtID0gQVZfUk4zMkEoJnRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChtICE9IG1lbSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKHBtdiwgbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAvKiBCVUcgSSdtIHByZXR0eSBzdXJlIHRoaXMgaXNuJ3QgdGhlIGludGVudGlvbiAqLyBcCisgICAgICAgICAgICAgICAgICAgIEFWX1dOMzJBKHBtdiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDMyX3QgbSA9IEFWX1JOMzJBKCZtdik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIWlkeCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjbGFtcF9tdihwbXYsICZtdiwgdGQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lbSA9PSBJTlZBTElEX01WKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtZW0gPSBtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIGlmIChtICE9IG1lbSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY2xhbXBfbXYocG12LCAmbXYsIHRkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgICAgIGlmIChyb3cgPiAwKSB7CisgICAgICAgICAgICBWUDltdnJlZlBhaXIgKm12ID0gJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0ubXZbKHJvdyAtIDEpICogcy0+c2JfY29scyAqIDggKyBjb2xdOworICAgICAgICAgICAgaWYgKG12LT5yZWZbMF0gPT0gcmVmKQorICAgICAgICAgICAgICAgIFJFVFVSTl9NVihzLT5hYm92ZV9tdl9jdHhbMiAqIGNvbCArIChzYiAmIDEpXVswXSk7CisgICAgICAgICAgICBlbHNlIGlmIChtdi0+cmVmWzFdID09IHJlZikKKyAgICAgICAgICAgICAgICBSRVRVUk5fTVYocy0+YWJvdmVfbXZfY3R4WzIgKiBjb2wgKyAoc2IgJiAxKV1bMV0pOworICAgICAgICB9CisgICAgICAgIGlmIChjb2wgPiB0ZC0+dGlsZV9jb2xfc3RhcnQpIHsKKyAgICAgICAgICAgIFZQOW12cmVmUGFpciAqbXYgPSAmcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS5tdltyb3cgKiBzLT5zYl9jb2xzICogOCArIGNvbCAtIDFdOworICAgICAgICAgICAgaWYgKG12LT5yZWZbMF0gPT0gcmVmKQorICAgICAgICAgICAgICAgIFJFVFVSTl9NVih0ZC0+bGVmdF9tdl9jdHhbMiAqIHJvdzcgKyAoc2IgPj4gMSldWzBdKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG12LT5yZWZbMV0gPT0gcmVmKQorICAgICAgICAgICAgICAgIFJFVFVSTl9NVih0ZC0+bGVmdF9tdl9jdHhbMiAqIHJvdzcgKyAoc2IgPj4gMSldWzFdKTsKKyAgICAgICAgfQorICAgICAgICBpID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgICBpID0gMDsKKyAgICB9CisKKyAgICAvLyBwcmV2aW91c2x5IGNvZGVkIE1WcyBpbiB0aGlzIG5laWdoYm9yaG9vZCwgdXNpbmcgc2FtZSByZWZlcmVuY2UgZnJhbWUKKyAgICBmb3IgKDsgaSA8IDg7IGkrKykgeworICAgICAgICBpbnQgYyA9IHBbaV1bMF0gKyBjb2wsIHIgPSBwW2ldWzFdICsgcm93OworCisgICAgICAgIGlmIChjID49IHRkLT50aWxlX2NvbF9zdGFydCAmJiBjIDwgcy0+Y29scyAmJgorICAgICAgICAgICAgciA+PSAwICYmIHIgPCBzLT5yb3dzKSB7CisgICAgICAgICAgICBWUDltdnJlZlBhaXIgKm12ID0gJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0ubXZbciAqIHMtPnNiX2NvbHMgKiA4ICsgY107CisKKyAgICAgICAgICAgIGlmIChtdi0+cmVmWzBdID09IHJlZikKKyAgICAgICAgICAgICAgICBSRVRVUk5fTVYobXYtPm12WzBdKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKG12LT5yZWZbMV0gPT0gcmVmKQorICAgICAgICAgICAgICAgIFJFVFVSTl9NVihtdi0+bXZbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTVYgYXQgdGhpcyBwb3NpdGlvbiBpbiBwcmV2aW91cyBmcmFtZSwgdXNpbmcgc2FtZSByZWZlcmVuY2UgZnJhbWUKKyAgICBpZiAocy0+cy5oLnVzZV9sYXN0X2ZyYW1lX212cykgeworICAgICAgICBWUDltdnJlZlBhaXIgKm12ID0gJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9NVlBBSVJdLm12W3JvdyAqIHMtPnNiX2NvbHMgKiA4ICsgY29sXTsKKworICAgICAgICBpZiAoIXMtPnMuZnJhbWVzW1JFRl9GUkFNRV9NVlBBSVJdLnVzZXNfMnBhc3MpCisgICAgICAgICAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MoJnMtPnMuZnJhbWVzW1JFRl9GUkFNRV9NVlBBSVJdLnRmLCByb3cgPj4gMywgMCk7CisgICAgICAgIGlmIChtdi0+cmVmWzBdID09IHJlZikKKyAgICAgICAgICAgIFJFVFVSTl9NVihtdi0+bXZbMF0pOworICAgICAgICBlbHNlIGlmIChtdi0+cmVmWzFdID09IHJlZikKKyAgICAgICAgICAgIFJFVFVSTl9NVihtdi0+bXZbMV0pOworICAgIH0KKworI2RlZmluZSBSRVRVUk5fU0NBTEVfTVYobXYsIHNjYWxlKSAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc2NhbGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVlA1Nm12IG12X3RlbXAgPSB7IC1tdi54LCAtbXYueSB9OyAgXAorICAgICAgICAgICAgUkVUVVJOX01WKG12X3RlbXApOyAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUkVUVVJOX01WKG12KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyAgICAvLyBwcmV2aW91c2x5IGNvZGVkIE1WcyBpbiB0aGlzIG5laWdoYm9yaG9vZCwgdXNpbmcgZGlmZmVyZW50IHJlZmVyZW5jZSBmcmFtZQorICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaW50IGMgPSBwW2ldWzBdICsgY29sLCByID0gcFtpXVsxXSArIHJvdzsKKworICAgICAgICBpZiAoYyA+PSB0ZC0+dGlsZV9jb2xfc3RhcnQgJiYgYyA8IHMtPmNvbHMgJiYgciA+PSAwICYmIHIgPCBzLT5yb3dzKSB7CisgICAgICAgICAgICBWUDltdnJlZlBhaXIgKm12ID0gJnMtPnMuZnJhbWVzW0NVUl9GUkFNRV0ubXZbciAqIHMtPnNiX2NvbHMgKiA4ICsgY107CisKKyAgICAgICAgICAgIGlmIChtdi0+cmVmWzBdICE9IHJlZiAmJiBtdi0+cmVmWzBdID49IDApCisgICAgICAgICAgICAgICAgUkVUVVJOX1NDQUxFX01WKG12LT5tdlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cy5oLnNpZ25iaWFzW212LT5yZWZbMF1dICE9IHMtPnMuaC5zaWduYmlhc1tyZWZdKTsKKyAgICAgICAgICAgIGlmIChtdi0+cmVmWzFdICE9IHJlZiAmJiBtdi0+cmVmWzFdID49IDAgJiYKKyAgICAgICAgICAgICAgICAvLyBCVUcgLSBsaWJ2cHggaGFzIHRoaXMgY29uZGl0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICAgICAgICAgICAgICAgIC8vIHdlIHVzZWQgdGhlIGZpcnN0IHJlZiBNViBhbmQgcHJlLXNjYWxpbmcKKyAgICAgICAgICAgICAgICBBVl9STjMyQSgmbXYtPm12WzBdKSAhPSBBVl9STjMyQSgmbXYtPm12WzFdKSkgeworICAgICAgICAgICAgICAgIFJFVFVSTl9TQ0FMRV9NVihtdi0+bXZbMV0sIHMtPnMuaC5zaWduYmlhc1ttdi0+cmVmWzFdXSAhPSBzLT5zLmguc2lnbmJpYXNbcmVmXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNViBhdCB0aGlzIHBvc2l0aW9uIGluIHByZXZpb3VzIGZyYW1lLCB1c2luZyBkaWZmZXJlbnQgcmVmZXJlbmNlIGZyYW1lCisgICAgaWYgKHMtPnMuaC51c2VfbGFzdF9mcmFtZV9tdnMpIHsKKyAgICAgICAgVlA5bXZyZWZQYWlyICptdiA9ICZzLT5zLmZyYW1lc1tSRUZfRlJBTUVfTVZQQUlSXS5tdltyb3cgKiBzLT5zYl9jb2xzICogOCArIGNvbF07CisKKyAgICAgICAgLy8gbm8gbmVlZCB0byBhd2FpdF9wcm9ncmVzcywgYmVjYXVzZSB3ZSBhbHJlYWR5IGRpZCB0aGF0IGFib3ZlCisgICAgICAgIGlmIChtdi0+cmVmWzBdICE9IHJlZiAmJiBtdi0+cmVmWzBdID49IDApCisgICAgICAgICAgICBSRVRVUk5fU0NBTEVfTVYobXYtPm12WzBdLCBzLT5zLmguc2lnbmJpYXNbbXYtPnJlZlswXV0gIT0gcy0+cy5oLnNpZ25iaWFzW3JlZl0pOworICAgICAgICBpZiAobXYtPnJlZlsxXSAhPSByZWYgJiYgbXYtPnJlZlsxXSA+PSAwICYmCisgICAgICAgICAgICAvLyBCVUcgLSBsaWJ2cHggaGFzIHRoaXMgY29uZGl0aW9uIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICAgICAgICAgICAgLy8gd2UgdXNlZCB0aGUgZmlyc3QgcmVmIE1WIGFuZCBwcmUtc2NhbGluZworICAgICAgICAgICAgQVZfUk4zMkEoJm12LT5tdlswXSkgIT0gQVZfUk4zMkEoJm12LT5tdlsxXSkpIHsKKyAgICAgICAgICAgIFJFVFVSTl9TQ0FMRV9NVihtdi0+bXZbMV0sIHMtPnMuaC5zaWduYmlhc1ttdi0+cmVmWzFdXSAhPSBzLT5zLmguc2lnbmJpYXNbcmVmXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBVl9aRVJPMzIocG12KTsKKyAgICBjbGFtcF9tdihwbXYsIHBtdiwgdGQpOworI3VuZGVmIElOVkFMSURfTVYKKyN1bmRlZiBSRVRVUk5fTVYKKyN1bmRlZiBSRVRVUk5fU0NBTEVfTVYKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHJlYWRfbXZfY29tcG9uZW50KFZQOVRpbGVEYXRhICp0ZCwgaW50IGlkeCwgaW50IGhwKQoreworICAgIFZQOUNvbnRleHQgKnMgPSB0ZC0+czsKKyAgICBpbnQgYml0LCBzaWduID0gdnA1Nl9yYWNfZ2V0X3Byb2IodGQtPmMsIHMtPnByb2IucC5tdl9jb21wW2lkeF0uc2lnbik7CisgICAgaW50IG4sIGMgPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfbXZfY2xhc3NfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X2NvbXBbaWR4XS5jbGFzc2VzKTsKKworICAgIHRkLT5jb3VudHMubXZfY29tcFtpZHhdLnNpZ25bc2lnbl0rKzsKKyAgICB0ZC0+Y291bnRzLm12X2NvbXBbaWR4XS5jbGFzc2VzW2NdKys7CisgICAgaWYgKGMpIHsKKyAgICAgICAgaW50IG07CisKKyAgICAgICAgZm9yIChuID0gMCwgbSA9IDA7IG0gPCBjOyBtKyspIHsKKyAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKHRkLT5jLCBzLT5wcm9iLnAubXZfY29tcFtpZHhdLmJpdHNbbV0pOworICAgICAgICAgICAgbiB8PSBiaXQgPDwgbTsKKyAgICAgICAgICAgIHRkLT5jb3VudHMubXZfY29tcFtpZHhdLmJpdHNbbV1bYml0XSsrOworICAgICAgICB9CisgICAgICAgIG4gPDw9IDM7CisgICAgICAgIGJpdCA9IHZwOF9yYWNfZ2V0X3RyZWUodGQtPmMsIGZmX3ZwOV9tdl9mcF90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb2IucC5tdl9jb21wW2lkeF0uZnApOworICAgICAgICBuICB8PSBiaXQgPDwgMTsKKyAgICAgICAgdGQtPmNvdW50cy5tdl9jb21wW2lkeF0uZnBbYml0XSsrOworICAgICAgICBpZiAoaHApIHsKKyAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKHRkLT5jLCBzLT5wcm9iLnAubXZfY29tcFtpZHhdLmhwKTsKKyAgICAgICAgICAgIHRkLT5jb3VudHMubXZfY29tcFtpZHhdLmhwW2JpdF0rKzsKKyAgICAgICAgICAgIG4gfD0gYml0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbiB8PSAxOworICAgICAgICAgICAgLy8gYnVnIGluIGxpYnZweCAtIHdlIGNvdW50IGZvciBidyBlbnRyb3B5IHB1cnBvc2VzIGV2ZW4gaWYgdGhlCisgICAgICAgICAgICAvLyBiaXQgd2Fzbid0IGNvZGVkCisgICAgICAgICAgICB0ZC0+Y291bnRzLm12X2NvbXBbaWR4XS5ocFsxXSsrOworICAgICAgICB9CisgICAgICAgIG4gKz0gOCA8PCBjOworICAgIH0gZWxzZSB7CisgICAgICAgIG4gPSB2cDU2X3JhY19nZXRfcHJvYih0ZC0+Yywgcy0+cHJvYi5wLm12X2NvbXBbaWR4XS5jbGFzczApOworICAgICAgICB0ZC0+Y291bnRzLm12X2NvbXBbaWR4XS5jbGFzczBbbl0rKzsKKyAgICAgICAgYml0ID0gdnA4X3JhY19nZXRfdHJlZSh0ZC0+YywgZmZfdnA5X212X2ZwX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvYi5wLm12X2NvbXBbaWR4XS5jbGFzczBfZnBbbl0pOworICAgICAgICB0ZC0+Y291bnRzLm12X2NvbXBbaWR4XS5jbGFzczBfZnBbbl1bYml0XSsrOworICAgICAgICBuID0gKG4gPDwgMykgfCAoYml0IDw8IDEpOworICAgICAgICBpZiAoaHApIHsKKyAgICAgICAgICAgIGJpdCA9IHZwNTZfcmFjX2dldF9wcm9iKHRkLT5jLCBzLT5wcm9iLnAubXZfY29tcFtpZHhdLmNsYXNzMF9ocCk7CisgICAgICAgICAgICB0ZC0+Y291bnRzLm12X2NvbXBbaWR4XS5jbGFzczBfaHBbYml0XSsrOworICAgICAgICAgICAgbiB8PSBiaXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuIHw9IDE7CisgICAgICAgICAgICAvLyBidWcgaW4gbGlidnB4IC0gd2UgY291bnQgZm9yIGJ3IGVudHJvcHkgcHVycG9zZXMgZXZlbiBpZiB0aGUKKyAgICAgICAgICAgIC8vIGJpdCB3YXNuJ3QgY29kZWQKKyAgICAgICAgICAgIHRkLT5jb3VudHMubXZfY29tcFtpZHhdLmNsYXNzMF9ocFsxXSsrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpZ24gPyAtKG4gKyAxKSA6IChuICsgMSk7Cit9CisKK3ZvaWQgZmZfdnA5X2ZpbGxfbXYoVlA5VGlsZURhdGEgKnRkLCBWUDU2bXYgKm12LCBpbnQgbW9kZSwgaW50IHNiKQoreworICAgIFZQOUNvbnRleHQgKnMgPSB0ZC0+czsKKyAgICBWUDlCbG9jayAqYiA9IHRkLT5iOworCisgICAgaWYgKG1vZGUgPT0gWkVST01WKSB7CisgICAgICAgIEFWX1pFUk82NChtdik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGhwOworCisgICAgICAgIC8vIEZJWE1FIGNhY2hlIHRoaXMgdmFsdWUgYW5kIHJldXNlIGZvciBvdGhlciBzdWJibG9ja3MKKyAgICAgICAgZmluZF9yZWZfbXZzKHRkLCAmbXZbMF0sIGItPnJlZlswXSwgMCwgbW9kZSA9PSBORUFSTVYsCisgICAgICAgICAgICAgICAgICAgICBtb2RlID09IE5FV01WID8gLTEgOiBzYik7CisgICAgICAgIC8vIEZJWE1FIG1heWJlIG1vdmUgdGhpcyBjb2RlIGludG8gZmluZF9yZWZfbXZzKCkKKyAgICAgICAgaWYgKChtb2RlID09IE5FV01WIHx8IHNiID09IC0xKSAmJgorICAgICAgICAgICAgIShocCA9IHMtPnMuaC5oaWdocHJlY2lzaW9ubXZzICYmCisgICAgICAgICAgICAgIGFicyhtdlswXS54KSA8IDY0ICYmIGFicyhtdlswXS55KSA8IDY0KSkgeworICAgICAgICAgICAgaWYgKG12WzBdLnkgJiAxKSB7CisgICAgICAgICAgICAgICAgaWYgKG12WzBdLnkgPCAwKQorICAgICAgICAgICAgICAgICAgICBtdlswXS55Kys7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBtdlswXS55LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXZbMF0ueCAmIDEpIHsKKyAgICAgICAgICAgICAgICBpZiAobXZbMF0ueCA8IDApCisgICAgICAgICAgICAgICAgICAgIG12WzBdLngrKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG12WzBdLngtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobW9kZSA9PSBORVdNVikgeworICAgICAgICAgICAgZW51bSBNVkpvaW50IGogPSB2cDhfcmFjX2dldF90cmVlKHRkLT5jLCBmZl92cDlfbXZfam9pbnRfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfam9pbnQpOworCisgICAgICAgICAgICB0ZC0+Y291bnRzLm12X2pvaW50W2pdKys7CisgICAgICAgICAgICBpZiAoaiA+PSBNVl9KT0lOVF9WKQorICAgICAgICAgICAgICAgIG12WzBdLnkgKz0gcmVhZF9tdl9jb21wb25lbnQodGQsIDAsIGhwKTsKKyAgICAgICAgICAgIGlmIChqICYgMSkKKyAgICAgICAgICAgICAgICBtdlswXS54ICs9IHJlYWRfbXZfY29tcG9uZW50KHRkLCAxLCBocCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYi0+Y29tcCkgeworICAgICAgICAgICAgLy8gRklYTUUgY2FjaGUgdGhpcyB2YWx1ZSBhbmQgcmV1c2UgZm9yIG90aGVyIHN1YmJsb2NrcworICAgICAgICAgICAgZmluZF9yZWZfbXZzKHRkLCAmbXZbMV0sIGItPnJlZlsxXSwgMSwgbW9kZSA9PSBORUFSTVYsCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9PSBORVdNViA/IC0xIDogc2IpOworICAgICAgICAgICAgaWYgKChtb2RlID09IE5FV01WIHx8IHNiID09IC0xKSAmJgorICAgICAgICAgICAgICAgICEoaHAgPSBzLT5zLmguaGlnaHByZWNpc2lvbm12cyAmJgorICAgICAgICAgICAgICAgICAgYWJzKG12WzFdLngpIDwgNjQgJiYgYWJzKG12WzFdLnkpIDwgNjQpKSB7CisgICAgICAgICAgICAgICAgaWYgKG12WzFdLnkgJiAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtdlsxXS55IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG12WzFdLnkrKzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbXZbMV0ueS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobXZbMV0ueCAmIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG12WzFdLnggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgbXZbMV0ueCsrOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBtdlsxXS54LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGUgPT0gTkVXTVYpIHsKKyAgICAgICAgICAgICAgICBlbnVtIE1WSm9pbnQgaiA9IHZwOF9yYWNfZ2V0X3RyZWUodGQtPmMsIGZmX3ZwOV9tdl9qb2ludF90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm9iLnAubXZfam9pbnQpOworCisgICAgICAgICAgICAgICAgdGQtPmNvdW50cy5tdl9qb2ludFtqXSsrOworICAgICAgICAgICAgICAgIGlmIChqID49IE1WX0pPSU5UX1YpCisgICAgICAgICAgICAgICAgICAgIG12WzFdLnkgKz0gcmVhZF9tdl9jb21wb25lbnQodGQsIDAsIGhwKTsKKyAgICAgICAgICAgICAgICBpZiAoaiAmIDEpCisgICAgICAgICAgICAgICAgICAgIG12WzFdLnggKz0gcmVhZF9tdl9jb21wb25lbnQodGQsIDEsIGhwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnA5cHJvYi5jIGIvbGliYXZjb2RlYy92cDlwcm9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyOTViNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvdnA5cHJvYi5jCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogVlA5IGNvbXBhdGlibGUgdmlkZW8gZGVjb2RlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZSBnbWFpbCBjb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgQ2zDqW1lbnQgQsWTc2NoIDx1IHBraCBtZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgInZwNTYuaCIKKyNpbmNsdWRlICJ2cDkuaCIKKyNpbmNsdWRlICJ2cDlkYXRhLmgiCisjaW5jbHVkZSAidnA5ZGVjLmgiCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgYWRhcHRfcHJvYih1aW50OF90ICpwLCB1bnNpZ25lZCBjdDAsIHVuc2lnbmVkIGN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NvdW50LCBpbnQgdXBkYXRlX2ZhY3RvcikKK3sKKyAgICB1bnNpZ25lZCBjdCA9IGN0MCArIGN0MSwgcDIsIHAxOworCisgICAgaWYgKCFjdCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdXBkYXRlX2ZhY3RvciA9IEZBU1RESVYodXBkYXRlX2ZhY3RvciAqIEZGTUlOKGN0LCBtYXhfY291bnQpLCBtYXhfY291bnQpOworICAgIHAxID0gKnA7CisgICAgcDIgPSAoKCgoaW50NjRfdCkgY3QwKSA8PCA4KSArIChjdCA+PiAxKSkgLyBjdDsKKyAgICBwMiA9IGF2X2NsaXAocDIsIDEsIDI1NSk7CisKKyAgICAvLyAocDEgKiAoMjU2IC0gdXBkYXRlX2ZhY3RvcikgKyBwMiAqIHVwZGF0ZV9mYWN0b3IgKyAxMjgpID4+IDgKKyAgICAqcCA9IHAxICsgKCgocDIgLSBwMSkgKiB1cGRhdGVfZmFjdG9yICsgMTI4KSA+PiA4KTsKK30KKwordm9pZCBmZl92cDlfYWRhcHRfcHJvYnMoVlA5Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaSwgaiwgaywgbCwgbTsKKyAgICBQcm9iQ29udGV4dCAqcCA9ICZzLT5wcm9iX2N0eFtzLT5zLmguZnJhbWVjdHhpZF0ucDsKKyAgICBpbnQgdWYgPSAocy0+cy5oLmtleWZyYW1lIHx8IHMtPnMuaC5pbnRyYW9ubHkgfHwgIXMtPmxhc3Rfa2V5ZnJhbWUpID8gMTEyIDogMTI4OworCisgICAgLy8gY29lZmZpY2llbnRzCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAyOyBrKyspCisgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IDY7IGwrKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDY7IG0rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcHAgPSBzLT5wcm9iX2N0eFtzLT5zLmguZnJhbWVjdHhpZF0uY29lZltpXVtqXVtrXVtsXVttXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICplID0gcy0+dGRbMF0uY291bnRzLmVvYltpXVtqXVtrXVtsXVttXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpjID0gcy0+dGRbMF0uY291bnRzLmNvZWZbaV1bal1ba11bbF1bbV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsID09IDAgJiYgbSA+PSAzKSAvLyBkYyBvbmx5IGhhcyAzIHB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBlWzBdLCBlWzFdLCAyNCwgdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMV0sIGNbMF0sIGNbMV0gKyBjWzJdLCAyNCwgdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMl0sIGNbMV0sIGNbMl0sIDI0LCB1Zik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgIGlmIChzLT5zLmgua2V5ZnJhbWUgfHwgcy0+cy5oLmludHJhb25seSkgeworICAgICAgICBtZW1jcHkocC0+c2tpcCwgIHMtPnByb2IucC5za2lwLCAgc2l6ZW9mKHAtPnNraXApKTsKKyAgICAgICAgbWVtY3B5KHAtPnR4MzJwLCBzLT5wcm9iLnAudHgzMnAsIHNpemVvZihwLT50eDMycCkpOworICAgICAgICBtZW1jcHkocC0+dHgxNnAsIHMtPnByb2IucC50eDE2cCwgc2l6ZW9mKHAtPnR4MTZwKSk7CisgICAgICAgIG1lbWNweShwLT50eDhwLCAgcy0+cHJvYi5wLnR4OHAsICBzaXplb2YocC0+dHg4cCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gc2tpcCBmbGFnCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgYWRhcHRfcHJvYigmcC0+c2tpcFtpXSwgcy0+dGRbMF0uY291bnRzLnNraXBbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgcy0+dGRbMF0uY291bnRzLnNraXBbaV1bMV0sIDIwLCAxMjgpOworCisgICAgLy8gaW50cmEvaW50ZXIgZmxhZworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGFkYXB0X3Byb2IoJnAtPmludHJhW2ldLCBzLT50ZFswXS5jb3VudHMuaW50cmFbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgcy0+dGRbMF0uY291bnRzLmludHJhW2ldWzFdLCAyMCwgMTI4KTsKKworICAgIC8vIGNvbXBwcmVkIGZsYWcKKyAgICBpZiAocy0+cy5oLmNvbXBwcmVkbW9kZSA9PSBQUkVEX1NXSVRDSEFCTEUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPmNvbXBbaV0sIHMtPnRkWzBdLmNvdW50cy5jb21wW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBzLT50ZFswXS5jb3VudHMuY29tcFtpXVsxXSwgMjAsIDEyOCk7CisgICAgfQorCisgICAgLy8gcmVmZXJlbmNlIGZyYW1lcworICAgIGlmIChzLT5zLmguY29tcHByZWRtb2RlICE9IFBSRURfU0lOR0xFUkVGKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwLT5jb21wX3JlZltpXSwgcy0+dGRbMF0uY291bnRzLmNvbXBfcmVmW2ldWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBzLT50ZFswXS5jb3VudHMuY29tcF9yZWZbaV1bMV0sIDIwLCAxMjgpOworICAgIH0KKworICAgIGlmIChzLT5zLmguY29tcHByZWRtb2RlICE9IFBSRURfQ09NUFJFRikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICB1aW50OF90ICpwcCA9IHAtPnNpbmdsZV9yZWZbaV07CisgICAgICAgICAgICB1bnNpZ25lZCAoKmMpWzJdID0gcy0+dGRbMF0uY291bnRzLnNpbmdsZV9yZWZbaV07CisKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdWzBdLCBjWzBdWzFdLCAyMCwgMTI4KTsKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzFdWzBdLCBjWzFdWzFdLCAyMCwgMTI4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGJsb2NrIHBhcnRpdGlvbmluZworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnBwID0gcC0+cGFydGl0aW9uW2ldW2pdOworICAgICAgICAgICAgdW5zaWduZWQgKmMgPSBzLT50ZFswXS5jb3VudHMucGFydGl0aW9uW2ldW2pdOworCisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFswXSwgY1swXSwgY1sxXSArIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzFdLCBjWzJdICsgY1szXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1syXSwgY1szXSwgMjAsIDEyOCk7CisgICAgICAgIH0KKworICAgIC8vIHR4IHNpemUKKyAgICBpZiAocy0+cy5oLnR4Zm1tb2RlID09IFRYX1NXSVRDSEFCTEUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgdW5zaWduZWQgKmMxNiA9IHMtPnRkWzBdLmNvdW50cy50eDE2cFtpXSwgKmMzMiA9IHMtPnRkWzBdLmNvdW50cy50eDMycFtpXTsKKworICAgICAgICAgICAgYWRhcHRfcHJvYigmcC0+dHg4cFtpXSwgcy0+dGRbMF0uY291bnRzLnR4OHBbaV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnRkWzBdLmNvdW50cy50eDhwW2ldWzFdLCAyMCwgMTI4KTsKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPnR4MTZwW2ldWzBdLCBjMTZbMF0sIGMxNlsxXSArIGMxNlsyXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwLT50eDE2cFtpXVsxXSwgYzE2WzFdLCBjMTZbMl0sIDIwLCAxMjgpOworICAgICAgICAgICAgYWRhcHRfcHJvYigmcC0+dHgzMnBbaV1bMF0sIGMzMlswXSwgYzMyWzFdICsgYzMyWzJdICsgYzMyWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPnR4MzJwW2ldWzFdLCBjMzJbMV0sIGMzMlsyXSArIGMzMlszXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwLT50eDMycFtpXVsyXSwgYzMyWzJdLCBjMzJbM10sIDIwLCAxMjgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW50ZXJwb2xhdGlvbiBmaWx0ZXIKKyAgICBpZiAocy0+cy5oLmZpbHRlcm1vZGUgPT0gRklMVEVSX1NXSVRDSEFCTEUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCAqcHAgPSBwLT5maWx0ZXJbaV07CisgICAgICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPnRkWzBdLmNvdW50cy5maWx0ZXJbaV07CisKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzBdLCBjWzFdICsgY1syXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXSwgY1syXSwgMjAsIDEyOCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbnRlciBtb2RlcworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqcHAgPSBwLT5tdl9tb2RlW2ldOworICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPnRkWzBdLmNvdW50cy5tdl9tb2RlW2ldOworCisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjWzJdLCBjWzFdICsgY1swXSArIGNbM10sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1swXSwgY1sxXSArIGNbM10sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1sxXSwgY1szXSwgMjAsIDEyOCk7CisgICAgfQorCisgICAgLy8gbXYgam9pbnRzCisgICAgeworICAgICAgICB1aW50OF90ICpwcCA9IHAtPm12X2pvaW50OworICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPnRkWzBdLmNvdW50cy5tdl9qb2ludDsKKworICAgICAgICBhZGFwdF9wcm9iKCZwcFswXSwgY1swXSwgY1sxXSArIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMV0sIGNbMV0sIGNbMl0gKyBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMl0sIGNbMl0sIGNbM10sIDIwLCAxMjgpOworICAgIH0KKworICAgIC8vIG12IGNvbXBvbmVudHMKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKnBwOworICAgICAgICB1bnNpZ25lZCAqYywgKCpjMilbMl0sIHN1bTsKKworICAgICAgICBhZGFwdF9wcm9iKCZwLT5tdl9jb21wW2ldLnNpZ24sIHMtPnRkWzBdLmNvdW50cy5tdl9jb21wW2ldLnNpZ25bMF0sCisgICAgICAgICAgICAgICAgICAgcy0+dGRbMF0uY291bnRzLm12X2NvbXBbaV0uc2lnblsxXSwgMjAsIDEyOCk7CisKKyAgICAgICAgcHAgID0gcC0+bXZfY29tcFtpXS5jbGFzc2VzOworICAgICAgICBjICAgPSBzLT50ZFswXS5jb3VudHMubXZfY29tcFtpXS5jbGFzc2VzOworICAgICAgICBzdW0gPSBjWzFdICsgY1syXSArIGNbM10gKyBjWzRdICsgY1s1XSArCisgICAgICAgICAgICAgIGNbNl0gKyBjWzddICsgY1s4XSArIGNbOV0gKyBjWzEwXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMF0sIGNbMF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHN1bSAtPSBjWzFdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbMl0gKyBjWzNdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1syXSArIGNbM10sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzNdLCBjWzJdLCBjWzNdLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbNF0gKyBjWzVdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs0XSwgY1s0XSArIGNbNV0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzVdLCBjWzRdLCBjWzVdLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbNl07CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzZdLCBjWzZdLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs3XSwgY1s3XSArIGNbOF0sIGNbOV0gKyBjWzEwXSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzhdLCBjWzddLCBjWzhdLCAyMCwgMTI4KTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbOV0sIGNbOV0sIGNbMTBdLCAyMCwgMTI4KTsKKworICAgICAgICBhZGFwdF9wcm9iKCZwLT5tdl9jb21wW2ldLmNsYXNzMCwgcy0+dGRbMF0uY291bnRzLm12X2NvbXBbaV0uY2xhc3MwWzBdLAorICAgICAgICAgICAgICAgICAgIHMtPnRkWzBdLmNvdW50cy5tdl9jb21wW2ldLmNsYXNzMFsxXSwgMjAsIDEyOCk7CisgICAgICAgIHBwID0gcC0+bXZfY29tcFtpXS5iaXRzOworICAgICAgICBjMiA9IHMtPnRkWzBdLmNvdW50cy5tdl9jb21wW2ldLmJpdHM7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxMDsgaisrKQorICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbal0sIGMyW2pdWzBdLCBjMltqXVsxXSwgMjAsIDEyOCk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgeworICAgICAgICAgICAgcHAgPSBwLT5tdl9jb21wW2ldLmNsYXNzMF9mcFtqXTsKKyAgICAgICAgICAgIGMgID0gcy0+dGRbMF0uY291bnRzLm12X2NvbXBbaV0uY2xhc3MwX2ZwW2pdOworICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMF0sIGNbMF0sIGNbMV0gKyBjWzJdICsgY1szXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwcFsxXSwgY1sxXSwgY1syXSArIGNbM10sIDIwLCAxMjgpOworICAgICAgICAgICAgYWRhcHRfcHJvYigmcHBbMl0sIGNbMl0sIGNbM10sIDIwLCAxMjgpOworICAgICAgICB9CisgICAgICAgIHBwID0gcC0+bXZfY29tcFtpXS5mcDsKKyAgICAgICAgYyAgPSBzLT50ZFswXS5jb3VudHMubXZfY29tcFtpXS5mcDsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMF0sIGNbMF0sIGNbMV0gKyBjWzJdICsgY1szXSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjWzFdLCBjWzJdICsgY1szXSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzJdLCBjWzJdLCBjWzNdLCAyMCwgMTI4KTsKKworICAgICAgICBpZiAocy0+cy5oLmhpZ2hwcmVjaXNpb25tdnMpIHsKKyAgICAgICAgICAgIGFkYXB0X3Byb2IoJnAtPm12X2NvbXBbaV0uY2xhc3MwX2hwLAorICAgICAgICAgICAgICAgICAgICAgICBzLT50ZFswXS5jb3VudHMubXZfY29tcFtpXS5jbGFzczBfaHBbMF0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnRkWzBdLmNvdW50cy5tdl9jb21wW2ldLmNsYXNzMF9ocFsxXSwgMjAsIDEyOCk7CisgICAgICAgICAgICBhZGFwdF9wcm9iKCZwLT5tdl9jb21wW2ldLmhwLCBzLT50ZFswXS5jb3VudHMubXZfY29tcFtpXS5ocFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+dGRbMF0uY291bnRzLm12X2NvbXBbaV0uaHBbMV0sIDIwLCAxMjgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8geSBpbnRyYSBtb2RlcworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqcHAgPSBwLT55X21vZGVbaV07CisgICAgICAgIHVuc2lnbmVkICpjID0gcy0+dGRbMF0uY291bnRzLnlfbW9kZVtpXSwgc3VtLCBzMjsKKworICAgICAgICBzdW0gPSBjWzBdICsgY1sxXSArIGNbM10gKyBjWzRdICsgY1s1XSArIGNbNl0gKyBjWzddICsgY1s4XSArIGNbOV07CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzBdLCBjW0RDX1BSRURdLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBzdW0gLT0gY1tUTV9WUDhfUFJFRF07CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzFdLCBjW1RNX1ZQOF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbVkVSVF9QUkVEXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMl0sIGNbVkVSVF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgczIgICA9IGNbSE9SX1BSRURdICsgY1tESUFHX0RPV05fUklHSFRfUFJFRF0gKyBjW1ZFUlRfUklHSFRfUFJFRF07CisgICAgICAgIHN1bSAtPSBzMjsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbM10sIHMyLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBzMiAtPSBjW0hPUl9QUkVEXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbNF0sIGNbSE9SX1BSRURdLCBzMiwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzVdLCBjW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSwgY1tWRVJUX1JJR0hUX1BSRURdLAorICAgICAgICAgICAgICAgICAgIDIwLCAxMjgpOworICAgICAgICBzdW0gLT0gY1tESUFHX0RPV05fTEVGVF9QUkVEXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbNl0sIGNbRElBR19ET1dOX0xFRlRfUFJFRF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHN1bSAtPSBjW1ZFUlRfTEVGVF9QUkVEXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbN10sIGNbVkVSVF9MRUZUX1BSRURdLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs4XSwgY1tIT1JfRE9XTl9QUkVEXSwgY1tIT1JfVVBfUFJFRF0sIDIwLCAxMjgpOworICAgIH0KKworICAgIC8vIHV2IGludHJhIG1vZGVzCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgdWludDhfdCAqcHAgPSBwLT51dl9tb2RlW2ldOworICAgICAgICB1bnNpZ25lZCAqYyA9IHMtPnRkWzBdLmNvdW50cy51dl9tb2RlW2ldLCBzdW0sIHMyOworCisgICAgICAgIHN1bSA9IGNbMF0gKyBjWzFdICsgY1szXSArIGNbNF0gKyBjWzVdICsgY1s2XSArIGNbN10gKyBjWzhdICsgY1s5XTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMF0sIGNbRENfUFJFRF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHN1bSAtPSBjW1RNX1ZQOF9QUkVEXTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbMV0sIGNbVE1fVlA4X1BSRURdLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBzdW0gLT0gY1tWRVJUX1BSRURdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFsyXSwgY1tWRVJUX1BSRURdLCBzdW0sIDIwLCAxMjgpOworICAgICAgICBzMiAgID0gY1tIT1JfUFJFRF0gKyBjW0RJQUdfRE9XTl9SSUdIVF9QUkVEXSArIGNbVkVSVF9SSUdIVF9QUkVEXTsKKyAgICAgICAgc3VtIC09IHMyOworICAgICAgICBhZGFwdF9wcm9iKCZwcFszXSwgczIsIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIHMyIC09IGNbSE9SX1BSRURdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs0XSwgY1tIT1JfUFJFRF0sIHMyLCAyMCwgMTI4KTsKKyAgICAgICAgYWRhcHRfcHJvYigmcHBbNV0sIGNbRElBR19ET1dOX1JJR0hUX1BSRURdLCBjW1ZFUlRfUklHSFRfUFJFRF0sCisgICAgICAgICAgICAgICAgICAgMjAsIDEyOCk7CisgICAgICAgIHN1bSAtPSBjW0RJQUdfRE9XTl9MRUZUX1BSRURdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs2XSwgY1tESUFHX0RPV05fTEVGVF9QUkVEXSwgc3VtLCAyMCwgMTI4KTsKKyAgICAgICAgc3VtIC09IGNbVkVSVF9MRUZUX1BSRURdOworICAgICAgICBhZGFwdF9wcm9iKCZwcFs3XSwgY1tWRVJUX0xFRlRfUFJFRF0sIHN1bSwgMjAsIDEyOCk7CisgICAgICAgIGFkYXB0X3Byb2IoJnBwWzhdLCBjW0hPUl9ET1dOX1BSRURdLCBjW0hPUl9VUF9QUkVEXSwgMjAsIDEyOCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy92cDlyZWNvbi5jIGIvbGliYXZjb2RlYy92cDlyZWNvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmIwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3ZwOXJlY29uLmMKQEAgLTAsMCArMSw2NDQgQEAKKy8qCisgKiBWUDkgY29tcGF0aWJsZSB2aWRlbyBkZWNvZGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplIGdtYWlsIGNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlb2RzcC5oIgorI2luY2x1ZGUgInZwOWRhdGEuaCIKKyNpbmNsdWRlICJ2cDlkZWMuaCIKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGNoZWNrX2ludHJhX21vZGUoVlA5VGlsZURhdGEgKnRkLCBpbnQgbW9kZSwgdWludDhfdCAqKmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RfZWRnZSwgcHRyZGlmZl90IHN0cmlkZV9lZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0X2lubmVyLCBwdHJkaWZmX3Qgc3RyaWRlX2lubmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbCwgaW50IGNvbCwgaW50IHgsIGludCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IHksIGVudW0gVHhmbU1vZGUgdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcCwgaW50IHNzX2gsIGludCBzc192LCBpbnQgYnl0ZXNwZXJwaXhlbCkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gdGQtPnM7CisgICAgaW50IGhhdmVfdG9wID0gcm93ID4gMCB8fCB5ID4gMDsKKyAgICBpbnQgaGF2ZV9sZWZ0ID0gY29sID4gdGQtPnRpbGVfY29sX3N0YXJ0IHx8IHggPiAwOworICAgIGludCBoYXZlX3JpZ2h0ID0geCA8IHcgLSAxOworICAgIGludCBicHAgPSBzLT5zLmguYnBwOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IG1vZGVfY29udlsxMF1bMiAvKiBoYXZlX2xlZnQgKi9dWzIgLyogaGF2ZV90b3AgKi9dID0geworICAgICAgICBbVkVSVF9QUkVEXSAgICAgICAgICAgID0geyB7IERDXzEyN19QUkVELCAgICAgICAgICBWRVJUX1BSRUQgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IERDXzEyN19QUkVELCAgICAgICAgICBWRVJUX1BSRUQgICAgICAgICAgICB9IH0sCisgICAgICAgIFtIT1JfUFJFRF0gICAgICAgICAgICAgPSB7IHsgRENfMTI5X1BSRUQsICAgICAgICAgIERDXzEyOV9QUkVEICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgSE9SX1BSRUQsICAgICAgICAgICAgIEhPUl9QUkVEICAgICAgICAgICAgIH0gfSwKKyAgICAgICAgW0RDX1BSRURdICAgICAgICAgICAgICA9IHsgeyBEQ18xMjhfUFJFRCwgICAgICAgICAgVE9QX0RDX1BSRUQgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBMRUZUX0RDX1BSRUQsICAgICAgICAgRENfUFJFRCAgICAgICAgICAgICAgfSB9LAorICAgICAgICBbRElBR19ET1dOX0xFRlRfUFJFRF0gID0geyB7IERDXzEyN19QUkVELCAgICAgICAgICBESUFHX0RPV05fTEVGVF9QUkVEICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IERDXzEyN19QUkVELCAgICAgICAgICBESUFHX0RPV05fTEVGVF9QUkVEICB9IH0sCisgICAgICAgIFtESUFHX0RPV05fUklHSFRfUFJFRF0gPSB7IHsgRElBR19ET1dOX1JJR0hUX1BSRUQsIERJQUdfRE9XTl9SSUdIVF9QUkVEIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgRElBR19ET1dOX1JJR0hUX1BSRUQsIERJQUdfRE9XTl9SSUdIVF9QUkVEIH0gfSwKKyAgICAgICAgW1ZFUlRfUklHSFRfUFJFRF0gICAgICA9IHsgeyBWRVJUX1JJR0hUX1BSRUQsICAgICAgVkVSVF9SSUdIVF9QUkVEICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBWRVJUX1JJR0hUX1BSRUQsICAgICAgVkVSVF9SSUdIVF9QUkVEICAgICAgfSB9LAorICAgICAgICBbSE9SX0RPV05fUFJFRF0gICAgICAgID0geyB7IEhPUl9ET1dOX1BSRUQsICAgICAgICBIT1JfRE9XTl9QUkVEICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEhPUl9ET1dOX1BSRUQsICAgICAgICBIT1JfRE9XTl9QUkVEICAgICAgICB9IH0sCisgICAgICAgIFtWRVJUX0xFRlRfUFJFRF0gICAgICAgPSB7IHsgRENfMTI3X1BSRUQsICAgICAgICAgIFZFUlRfTEVGVF9QUkVEICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgRENfMTI3X1BSRUQsICAgICAgICAgIFZFUlRfTEVGVF9QUkVEICAgICAgIH0gfSwKKyAgICAgICAgW0hPUl9VUF9QUkVEXSAgICAgICAgICA9IHsgeyBEQ18xMjlfUFJFRCwgICAgICAgICAgRENfMTI5X1BSRUQgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBIT1JfVVBfUFJFRCwgICAgICAgICAgSE9SX1VQX1BSRUQgICAgICAgICAgfSB9LAorICAgICAgICBbVE1fVlA4X1BSRURdICAgICAgICAgID0geyB7IERDXzEyOV9QUkVELCAgICAgICAgICBWRVJUX1BSRUQgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEhPUl9QUkVELCAgICAgICAgICAgICBUTV9WUDhfUFJFRCAgICAgICAgICB9IH0sCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBuZWVkc19sZWZ0OjE7CisgICAgICAgIHVpbnQ4X3QgbmVlZHNfdG9wOjE7CisgICAgICAgIHVpbnQ4X3QgbmVlZHNfdG9wbGVmdDoxOworICAgICAgICB1aW50OF90IG5lZWRzX3RvcHJpZ2h0OjE7CisgICAgICAgIHVpbnQ4X3QgaW52ZXJ0X2xlZnQ6MTsKKyAgICB9IGVkZ2VzW05fSU5UUkFfUFJFRF9NT0RFU10gPSB7CisgICAgICAgIFtWRVJUX1BSRURdICAgICAgICAgICAgPSB7IC5uZWVkc190b3AgID0gMSB9LAorICAgICAgICBbSE9SX1BSRURdICAgICAgICAgICAgID0geyAubmVlZHNfbGVmdCA9IDEgfSwKKyAgICAgICAgW0RDX1BSRURdICAgICAgICAgICAgICA9IHsgLm5lZWRzX3RvcCAgPSAxLCAubmVlZHNfbGVmdCA9IDEgfSwKKyAgICAgICAgW0RJQUdfRE9XTl9MRUZUX1BSRURdICA9IHsgLm5lZWRzX3RvcCAgPSAxLCAubmVlZHNfdG9wcmlnaHQgPSAxIH0sCisgICAgICAgIFtESUFHX0RPV05fUklHSFRfUFJFRF0gPSB7IC5uZWVkc19sZWZ0ID0gMSwgLm5lZWRzX3RvcCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZWVkc190b3BsZWZ0ID0gMSB9LAorICAgICAgICBbVkVSVF9SSUdIVF9QUkVEXSAgICAgID0geyAubmVlZHNfbGVmdCA9IDEsIC5uZWVkc190b3AgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmVlZHNfdG9wbGVmdCA9IDEgfSwKKyAgICAgICAgW0hPUl9ET1dOX1BSRURdICAgICAgICA9IHsgLm5lZWRzX2xlZnQgPSAxLCAubmVlZHNfdG9wID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5lZWRzX3RvcGxlZnQgPSAxIH0sCisgICAgICAgIFtWRVJUX0xFRlRfUFJFRF0gICAgICAgPSB7IC5uZWVkc190b3AgID0gMSwgLm5lZWRzX3RvcHJpZ2h0ID0gMSB9LAorICAgICAgICBbSE9SX1VQX1BSRURdICAgICAgICAgID0geyAubmVlZHNfbGVmdCA9IDEsIC5pbnZlcnRfbGVmdCA9IDEgfSwKKyAgICAgICAgW1RNX1ZQOF9QUkVEXSAgICAgICAgICA9IHsgLm5lZWRzX2xlZnQgPSAxLCAubmVlZHNfdG9wID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5lZWRzX3RvcGxlZnQgPSAxIH0sCisgICAgICAgIFtMRUZUX0RDX1BSRURdICAgICAgICAgPSB7IC5uZWVkc19sZWZ0ID0gMSB9LAorICAgICAgICBbVE9QX0RDX1BSRURdICAgICAgICAgID0geyAubmVlZHNfdG9wICA9IDEgfSwKKyAgICAgICAgW0RDXzEyOF9QUkVEXSAgICAgICAgICA9IHsgMCB9LAorICAgICAgICBbRENfMTI3X1BSRURdICAgICAgICAgID0geyAwIH0sCisgICAgICAgIFtEQ18xMjlfUFJFRF0gICAgICAgICAgPSB7IDAgfQorICAgIH07CisKKyAgICBhdl9hc3NlcnQyKG1vZGUgPj0gMCAmJiBtb2RlIDwgMTApOworICAgIG1vZGUgPSBtb2RlX2NvbnZbbW9kZV1baGF2ZV9sZWZ0XVtoYXZlX3RvcF07CisgICAgaWYgKGVkZ2VzW21vZGVdLm5lZWRzX3RvcCkgeworICAgICAgICB1aW50OF90ICp0b3AsICp0b3BsZWZ0OworICAgICAgICBpbnQgbl9weF9uZWVkID0gNCA8PCB0eCwgbl9weF9oYXZlID0gKCgocy0+Y29scyAtIGNvbCkgPDwgIXNzX2gpIC0geCkgKiA0OworICAgICAgICBpbnQgbl9weF9uZWVkX3RyID0gMDsKKworICAgICAgICBpZiAodHggPT0gVFhfNFg0ICYmIGVkZ2VzW21vZGVdLm5lZWRzX3RvcHJpZ2h0ICYmIGhhdmVfcmlnaHQpCisgICAgICAgICAgICBuX3B4X25lZWRfdHIgPSA0OworCisgICAgICAgIC8vIGlmIHRvcCBvZiBzYjY0LXJvdywgdXNlIHMtPmludHJhX3ByZWRfZGF0YVtdIGluc3RlYWQgb2YKKyAgICAgICAgLy8gZHN0Wy1zdHJpZGVdIGZvciBpbnRyYSBwcmVkaWN0aW9uIChpdCBjb250YWlucyBwcmUtIGluc3RlYWQgb2YKKyAgICAgICAgLy8gcG9zdC1sb29wZmlsdGVyIGRhdGEpCisgICAgICAgIGlmIChoYXZlX3RvcCkgeworICAgICAgICAgICAgdG9wID0gIShyb3cgJiA3KSAmJiAheSA/CisgICAgICAgICAgICAgICAgcy0+aW50cmFfcHJlZF9kYXRhW3BdICsgKGNvbCAqICg4ID4+IHNzX2gpICsgeCAqIDQpICogYnl0ZXNwZXJwaXhlbCA6CisgICAgICAgICAgICAgICAgeSA9PSAwID8gJmRzdF9lZGdlWy1zdHJpZGVfZWRnZV0gOiAmZHN0X2lubmVyWy1zdHJpZGVfaW5uZXJdOworICAgICAgICAgICAgaWYgKGhhdmVfbGVmdCkKKyAgICAgICAgICAgICAgICB0b3BsZWZ0ID0gIShyb3cgJiA3KSAmJiAheSA/CisgICAgICAgICAgICAgICAgICAgIHMtPmludHJhX3ByZWRfZGF0YVtwXSArIChjb2wgKiAoOCA+PiBzc19oKSArIHggKiA0KSAqIGJ5dGVzcGVycGl4ZWwgOgorICAgICAgICAgICAgICAgICAgICB5ID09IDAgfHwgeCA9PSAwID8gJmRzdF9lZGdlWy1zdHJpZGVfZWRnZV0gOgorICAgICAgICAgICAgICAgICAgICAmZHN0X2lubmVyWy1zdHJpZGVfaW5uZXJdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhdmVfdG9wICYmCisgICAgICAgICAgICAoIWVkZ2VzW21vZGVdLm5lZWRzX3RvcGxlZnQgfHwgKGhhdmVfbGVmdCAmJiB0b3AgPT0gdG9wbGVmdCkpICYmCisgICAgICAgICAgICAodHggIT0gVFhfNFg0IHx8ICFlZGdlc1ttb2RlXS5uZWVkc190b3ByaWdodCB8fCBoYXZlX3JpZ2h0KSAmJgorICAgICAgICAgICAgbl9weF9uZWVkICsgbl9weF9uZWVkX3RyIDw9IG5fcHhfaGF2ZSkgeworICAgICAgICAgICAgKmEgPSB0b3A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGF2ZV90b3ApIHsKKyAgICAgICAgICAgICAgICBpZiAobl9weF9uZWVkIDw9IG5fcHhfaGF2ZSkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKmEsIHRvcCwgbl9weF9uZWVkICogYnl0ZXNwZXJwaXhlbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyNkZWZpbmUgbWVtc2V0X2JwcChjLCBpMSwgdiwgaTIsIG51bSkgZG8geyBcCisgICAgaWYgKGJ5dGVzcGVycGl4ZWwgPT0gMSkgeyBcCisgICAgICAgIG1lbXNldCgmKGMpWyhpMSldLCAodilbKGkyKV0sIChudW0pKTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgaW50IG4sIHZhbCA9IEFWX1JOMTZBKCYodilbKGkyKSAqIDJdKTsgXAorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKG51bSk7IG4rKykgeyBcCisgICAgICAgICAgICBBVl9XTjE2QSgmKGMpWygoaTEpICsgbikgKiAyXSwgdmFsKTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKK30gd2hpbGUgKDApCisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgqYSwgdG9wLCBuX3B4X2hhdmUgKiBieXRlc3BlcnBpeGVsKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0X2JwcCgqYSwgbl9weF9oYXZlLCAoKmEpLCBuX3B4X2hhdmUgLSAxLCBuX3B4X25lZWQgLSBuX3B4X2hhdmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjZGVmaW5lIG1lbXNldF92YWwoYywgdmFsLCBudW0pIGRvIHsgXAorICAgIGlmIChieXRlc3BlcnBpeGVsID09IDEpIHsgXAorICAgICAgICBtZW1zZXQoKGMpLCAodmFsKSwgKG51bSkpOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBpbnQgbjsgXAorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKG51bSk7IG4rKykgeyBcCisgICAgICAgICAgICBBVl9XTjE2QSgmKGMpW24gKiAyXSwgKHZhbCkpOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorfSB3aGlsZSAoMCkKKyAgICAgICAgICAgICAgICBtZW1zZXRfdmFsKCphLCAoMTI4IDw8IChicHAgLSA4KSkgLSAxLCBuX3B4X25lZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVkZ2VzW21vZGVdLm5lZWRzX3RvcGxlZnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZV9sZWZ0ICYmIGhhdmVfdG9wKSB7CisjZGVmaW5lIGFzc2lnbl9icHAoYywgaTEsIHYsIGkyKSBkbyB7IFwKKyAgICBpZiAoYnl0ZXNwZXJwaXhlbCA9PSAxKSB7IFwKKyAgICAgICAgKGMpWyhpMSldID0gKHYpWyhpMildOyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBBVl9DT1BZMTYoJihjKVsoaTEpICogMl0sICYodilbKGkyKSAqIDJdKTsgXAorICAgIH0gXAorfSB3aGlsZSAoMCkKKyAgICAgICAgICAgICAgICAgICAgYXNzaWduX2JwcCgqYSwgLTEsIHRvcGxlZnQsIC0xKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworI2RlZmluZSBhc3NpZ25fdmFsKGMsIGksIHYpIGRvIHsgXAorICAgIGlmIChieXRlc3BlcnBpeGVsID09IDEpIHsgXAorICAgICAgICAoYylbKGkpXSA9ICh2KTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgQVZfV04xNkEoJihjKVsoaSkgKiAyXSwgKHYpKTsgXAorICAgIH0gXAorfSB3aGlsZSAoMCkKKyAgICAgICAgICAgICAgICAgICAgYXNzaWduX3ZhbCgoKmEpLCAtMSwgKDEyOCA8PCAoYnBwIC0gOCkpICsgKGhhdmVfdG9wID8gKzEgOiAtMSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eCA9PSBUWF80WDQgJiYgZWRnZXNbbW9kZV0ubmVlZHNfdG9wcmlnaHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGF2ZV90b3AgJiYgaGF2ZV9yaWdodCAmJgorICAgICAgICAgICAgICAgICAgICBuX3B4X25lZWQgKyBuX3B4X25lZWRfdHIgPD0gbl9weF9oYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSgmKCphKVs0ICogYnl0ZXNwZXJwaXhlbF0sICZ0b3BbNCAqIGJ5dGVzcGVycGl4ZWxdLCA0ICogYnl0ZXNwZXJwaXhlbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0X2JwcCgqYSwgNCwgKmEsIDMsIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZWRnZXNbbW9kZV0ubmVlZHNfbGVmdCkgeworICAgICAgICBpZiAoaGF2ZV9sZWZ0KSB7CisgICAgICAgICAgICBpbnQgbl9weF9uZWVkID0gNCA8PCB0eCwgaSwgbl9weF9oYXZlID0gKCgocy0+cm93cyAtIHJvdykgPDwgIXNzX3YpIC0geSkgKiA0OworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0geCA9PSAwID8gZHN0X2VkZ2UgOiBkc3RfaW5uZXI7CisgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlID0geCA9PSAwID8gc3RyaWRlX2VkZ2UgOiBzdHJpZGVfaW5uZXI7CisKKyAgICAgICAgICAgIGlmIChlZGdlc1ttb2RlXS5pbnZlcnRfbGVmdCkgeworICAgICAgICAgICAgICAgIGlmIChuX3B4X25lZWQgPD0gbl9weF9oYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX3B4X25lZWQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbl9icHAobCwgaSwgJmRzdFtpICogc3RyaWRlXSwgLTEpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX3B4X2hhdmU7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbl9icHAobCwgaSwgJmRzdFtpICogc3RyaWRlXSwgLTEpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXRfYnBwKGwsIG5fcHhfaGF2ZSwgbCwgbl9weF9oYXZlIC0gMSwgbl9weF9uZWVkIC0gbl9weF9oYXZlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChuX3B4X25lZWQgPD0gbl9weF9oYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX3B4X25lZWQ7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbl9icHAobCwgbl9weF9uZWVkIC0gMSAtIGksICZkc3RbaSAqIHN0cmlkZV0sIC0xKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbl9weF9oYXZlOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25fYnBwKGwsIG5fcHhfbmVlZCAtIDEgLSBpLCAmZHN0W2kgKiBzdHJpZGVdLCAtMSk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldF9icHAobCwgMCwgbCwgbl9weF9uZWVkIC0gbl9weF9oYXZlLCBuX3B4X25lZWQgLSBuX3B4X2hhdmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbXNldF92YWwobCwgKDEyOCA8PCAoYnBwIC0gOCkpICsgMSwgNCA8PCB0eCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbW9kZTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBpbnRyYV9yZWNvbihWUDlUaWxlRGF0YSAqdGQsIHB0cmRpZmZfdCB5X29mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHV2X29mZiwgaW50IGJ5dGVzcGVycGl4ZWwpCit7CisgICAgVlA5Q29udGV4dCAqcyA9IHRkLT5zOworICAgIFZQOUJsb2NrICpiID0gdGQtPmI7CisgICAgaW50IHJvdyA9IHRkLT5yb3csIGNvbCA9IHRkLT5jb2w7CisgICAgaW50IHc0ID0gZmZfdnA5X2J3aF90YWJbMV1bYi0+YnNdWzBdIDw8IDEsIHN0ZXAxZCA9IDEgPDwgYi0+dHgsIG47CisgICAgaW50IGg0ID0gZmZfdnA5X2J3aF90YWJbMV1bYi0+YnNdWzFdIDw8IDEsIHgsIHksIHN0ZXAgPSAxIDw8IChiLT50eCAqIDIpOworICAgIGludCBlbmRfeCA9IEZGTUlOKDIgKiAocy0+Y29scyAtIGNvbCksIHc0KTsKKyAgICBpbnQgZW5kX3kgPSBGRk1JTigyICogKHMtPnJvd3MgLSByb3cpLCBoNCk7CisgICAgaW50IHR4ID0gNCAqIHMtPnMuaC5sb3NzbGVzcyArIGItPnR4LCB1dnR4ID0gYi0+dXZ0eCArIDQgKiBzLT5zLmgubG9zc2xlc3M7CisgICAgaW50IHV2c3RlcDFkID0gMSA8PCBiLT51dnR4LCBwOworICAgIHVpbnQ4X3QgKmRzdCA9IHRkLT5kc3RbMF0sICpkc3RfciA9IHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+ZGF0YVswXSArIHlfb2ZmOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgYV9idWYsIFs5Nl0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgbCwgWzY0XSk7CisKKyAgICBmb3IgKG4gPSAwLCB5ID0gMDsgeSA8IGVuZF95OyB5ICs9IHN0ZXAxZCkgeworICAgICAgICB1aW50OF90ICpwdHIgPSBkc3QsICpwdHJfciA9IGRzdF9yOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZW5kX3g7IHggKz0gc3RlcDFkLCBwdHIgKz0gNCAqIHN0ZXAxZCAqIGJ5dGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX3IgKz0gNCAqIHN0ZXAxZCAqIGJ5dGVzcGVycGl4ZWwsIG4gKz0gc3RlcCkgeworICAgICAgICAgICAgaW50IG1vZGUgPSBiLT5tb2RlW2ItPmJzID4gQlNfOHg4ICYmIGItPnR4ID09IFRYXzRYNCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAqIDIgKyB4IDogMF07CisgICAgICAgICAgICB1aW50OF90ICphID0gJmFfYnVmWzMyXTsKKyAgICAgICAgICAgIGVudW0gVHhmbVR5cGUgdHh0cCA9IGZmX3ZwOV9pbnRyYV90eGZtX3R5cGVbbW9kZV07CisgICAgICAgICAgICBpbnQgZW9iID0gYi0+c2tpcCA/IDAgOiBiLT50eCA+IFRYXzhYOCA/IEFWX1JOMTZBKCZ0ZC0+ZW9iW25dKSA6IHRkLT5lb2Jbbl07CisKKyAgICAgICAgICAgIG1vZGUgPSBjaGVja19pbnRyYV9tb2RlKHRkLCBtb2RlLCAmYSwgcHRyX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCB0ZC0+eV9zdHJpZGUsIGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2wsIHgsIHc0LCByb3csIHksIGItPnR4LCAwLCAwLCAwLCBieXRlc3BlcnBpeGVsKTsKKyAgICAgICAgICAgIHMtPmRzcC5pbnRyYV9wcmVkW2ItPnR4XVttb2RlXShwdHIsIHRkLT55X3N0cmlkZSwgbCwgYSk7CisgICAgICAgICAgICBpZiAoZW9iKQorICAgICAgICAgICAgICAgIHMtPmRzcC5pdHhmbV9hZGRbdHhdW3R4dHBdKHB0ciwgdGQtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5ibG9jayArIDE2ICogbiAqIGJ5dGVzcGVycGl4ZWwsIGVvYik7CisgICAgICAgIH0KKyAgICAgICAgZHN0X3IgKz0gNCAqIHN0ZXAxZCAqIHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+bGluZXNpemVbMF07CisgICAgICAgIGRzdCAgICs9IDQgKiBzdGVwMWQgKiB0ZC0+eV9zdHJpZGU7CisgICAgfQorCisgICAgLy8gVS9WCisgICAgdzQgICAgPj49IHMtPnNzX2g7CisgICAgZW5kX3ggPj49IHMtPnNzX2g7CisgICAgZW5kX3kgPj49IHMtPnNzX3Y7CisgICAgc3RlcCA9IDEgPDwgKGItPnV2dHggKiAyKTsKKyAgICBmb3IgKHAgPSAwOyBwIDwgMjsgcCsrKSB7CisgICAgICAgIGRzdCAgID0gdGQtPmRzdFsxICsgcF07CisgICAgICAgIGRzdF9yID0gcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5kYXRhWzEgKyBwXSArIHV2X29mZjsKKyAgICAgICAgZm9yIChuID0gMCwgeSA9IDA7IHkgPCBlbmRfeTsgeSArPSB1dnN0ZXAxZCkgeworICAgICAgICAgICAgdWludDhfdCAqcHRyID0gZHN0LCAqcHRyX3IgPSBkc3RfcjsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBlbmRfeDsgeCArPSB1dnN0ZXAxZCwgcHRyICs9IDQgKiB1dnN0ZXAxZCAqIGJ5dGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9yICs9IDQgKiB1dnN0ZXAxZCAqIGJ5dGVzcGVycGl4ZWwsIG4gKz0gc3RlcCkgeworICAgICAgICAgICAgICAgIGludCBtb2RlID0gYi0+dXZtb2RlOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmEgPSAmYV9idWZbMzJdOworICAgICAgICAgICAgICAgIGludCBlb2IgPSBiLT5za2lwID8gMCA6IGItPnV2dHggPiBUWF84WDggPyBBVl9STjE2QSgmdGQtPnV2ZW9iW3BdW25dKSA6IHRkLT51dmVvYltwXVtuXTsKKworICAgICAgICAgICAgICAgIG1vZGUgPSBjaGVja19pbnRyYV9tb2RlKHRkLCBtb2RlLCAmYSwgcHRyX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cy5mcmFtZXNbQ1VSX0ZSQU1FXS50Zi5mLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIsIHRkLT51dl9zdHJpZGUsIGwsIGNvbCwgeCwgdzQsIHJvdywgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLT51dnR4LCBwICsgMSwgcy0+c3NfaCwgcy0+c3NfdiwgYnl0ZXNwZXJwaXhlbCk7CisgICAgICAgICAgICAgICAgcy0+ZHNwLmludHJhX3ByZWRbYi0+dXZ0eF1bbW9kZV0ocHRyLCB0ZC0+dXZfc3RyaWRlLCBsLCBhKTsKKyAgICAgICAgICAgICAgICBpZiAoZW9iKQorICAgICAgICAgICAgICAgICAgICBzLT5kc3AuaXR4Zm1fYWRkW3V2dHhdW0RDVF9EQ1RdKHB0ciwgdGQtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+dXZibG9ja1twXSArIDE2ICogbiAqIGJ5dGVzcGVycGl4ZWwsIGVvYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RfciArPSA0ICogdXZzdGVwMWQgKiBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmxpbmVzaXplWzFdOworICAgICAgICAgICAgZHN0ICAgKz0gNCAqIHV2c3RlcDFkICogdGQtPnV2X3N0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBmZl92cDlfaW50cmFfcmVjb25fOGJwcChWUDlUaWxlRGF0YSAqdGQsIHB0cmRpZmZfdCB5X29mZiwgcHRyZGlmZl90IHV2X29mZikKK3sKKyAgICBpbnRyYV9yZWNvbih0ZCwgeV9vZmYsIHV2X29mZiwgMSk7Cit9CisKK3ZvaWQgZmZfdnA5X2ludHJhX3JlY29uXzE2YnBwKFZQOVRpbGVEYXRhICp0ZCwgcHRyZGlmZl90IHlfb2ZmLCBwdHJkaWZmX3QgdXZfb2ZmKQoreworICAgIGludHJhX3JlY29uKHRkLCB5X29mZiwgdXZfb2ZmLCAyKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtY19sdW1hX3Vuc2NhbGVkKFZQOVRpbGVEYXRhICp0ZCwgdnA5X21jX2Z1bmMgKCptYylbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIHB0cmRpZmZfdCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZEZyYW1lICpyZWZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHksIHB0cmRpZmZfdCB4LCBjb25zdCBWUDU2bXYgKm12LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidywgaW50IGJoLCBpbnQgdywgaW50IGgsIGludCBieXRlc3BlcnBpeGVsKQoreworICAgIFZQOUNvbnRleHQgKnMgPSB0ZC0+czsKKyAgICBpbnQgbXggPSBtdi0+eCwgbXkgPSBtdi0+eSwgdGg7CisKKyAgICB5ICs9IG15ID4+IDM7CisgICAgeCArPSBteCA+PiAzOworICAgIHJlZiArPSB5ICogcmVmX3N0cmlkZSArIHggKiBieXRlc3BlcnBpeGVsOworICAgIG14ICY9IDc7CisgICAgbXkgJj0gNzsKKyAgICAvLyBGSVhNRSBiaWxpbmVhciBmaWx0ZXIgb25seSBuZWVkcyAwLzEgcGl4ZWxzLCBub3QgMy80CisgICAgLy8gd2UgdXNlICs3IGJlY2F1c2UgdGhlIGxhc3QgNyBwaXhlbHMgb2YgZWFjaCBzYnJvdyBjYW4gYmUgY2hhbmdlZCBpbgorICAgIC8vIHRoZSBsb25nZXN0IGxvb3BmaWx0ZXIgb2YgdGhlIG5leHQgc2Jyb3cKKyAgICB0aCA9ICh5ICsgYmggKyA0ICogISFteSArIDcpID4+IDY7CisgICAgZmZfdGhyZWFkX2F3YWl0X3Byb2dyZXNzKHJlZl9mcmFtZSwgRkZNQVgodGgsIDApLCAwKTsKKyAgICAvLyBUaGUgYXJtL2FhcmNoNjQgX2h2IGZpbHRlcnMgcmVhZCBvbmUgbW9yZSByb3cgdGhhbiB3aGF0IGFjdHVhbGx5IGlzCisgICAgLy8gbmVlZGVkLCBzbyBzd2l0Y2ggdG8gZW11bGF0ZWQgZWRnZSBvbmUgcGl4ZWwgc29vbmVyIHZlcnRpY2FsbHkKKyAgICAvLyAoISFteSAqIDUpIHRoYW4gaG9yaXpvbnRhbGx5ICghIW14ICogNCkuCisgICAgaWYgKHggPCAhIW14ICogMyB8fCB5IDwgISFteSAqIDMgfHwKKyAgICAgICAgeCArICEhbXggKiA0ID4gdyAtIGJ3IHx8IHkgKyAhIW15ICogNSA+IGggLSBiaCkgeworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWModGQtPmVkZ2VfZW11X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZiAtICEhbXkgKiAzICogcmVmX3N0cmlkZSAtICEhbXggKiAzICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCwgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3ICsgISFteCAqIDcsIGJoICsgISFteSAqIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gISFteCAqIDMsIHkgLSAhIW15ICogMywgdywgaCk7CisgICAgICAgIHJlZiA9IHRkLT5lZGdlX2VtdV9idWZmZXIgKyAhIW15ICogMyAqIDE2MCArICEhbXggKiAzICogYnl0ZXNwZXJwaXhlbDsKKyAgICAgICAgcmVmX3N0cmlkZSA9IDE2MDsKKyAgICB9CisgICAgbWNbISFteF1bISFteV0oZHN0LCBkc3Rfc3RyaWRlLCByZWYsIHJlZl9zdHJpZGUsIGJoLCBteCA8PCAxLCBteSA8PCAxKTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtY19jaHJvbWFfdW5zY2FsZWQoVlA5VGlsZURhdGEgKnRkLCB2cDlfbWNfZnVuYyAoKm1jKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF91LCB1aW50OF90ICpkc3RfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmX3UsIHB0cmRpZmZfdCBzcmNfc3RyaWRlX3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWZfdiwgcHRyZGlmZl90IHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZEZyYW1lICpyZWZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgeSwgcHRyZGlmZl90IHgsIGNvbnN0IFZQNTZtdiAqbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYncsIGludCBiaCwgaW50IHcsIGludCBoLCBpbnQgYnl0ZXNwZXJwaXhlbCkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gdGQtPnM7CisgICAgaW50IG14ID0gbXYtPnggKiAoMSA8PCAhcy0+c3NfaCksIG15ID0gbXYtPnkgKiAoMSA8PCAhcy0+c3NfdiksIHRoOworCisgICAgeSArPSBteSA+PiA0OworICAgIHggKz0gbXggPj4gNDsKKyAgICByZWZfdSArPSB5ICogc3JjX3N0cmlkZV91ICsgeCAqIGJ5dGVzcGVycGl4ZWw7CisgICAgcmVmX3YgKz0geSAqIHNyY19zdHJpZGVfdiArIHggKiBieXRlc3BlcnBpeGVsOworICAgIG14ICY9IDE1OworICAgIG15ICY9IDE1OworICAgIC8vIEZJWE1FIGJpbGluZWFyIGZpbHRlciBvbmx5IG5lZWRzIDAvMSBwaXhlbHMsIG5vdCAzLzQKKyAgICAvLyB3ZSB1c2UgKzcgYmVjYXVzZSB0aGUgbGFzdCA3IHBpeGVscyBvZiBlYWNoIHNicm93IGNhbiBiZSBjaGFuZ2VkIGluCisgICAgLy8gdGhlIGxvbmdlc3QgbG9vcGZpbHRlciBvZiB0aGUgbmV4dCBzYnJvdworICAgIHRoID0gKHkgKyBiaCArIDQgKiAhIW15ICsgNykgPj4gKDYgLSBzLT5zc192KTsKKyAgICBmZl90aHJlYWRfYXdhaXRfcHJvZ3Jlc3MocmVmX2ZyYW1lLCBGRk1BWCh0aCwgMCksIDApOworICAgIC8vIFRoZSBhcm0vYWFyY2g2NCBfaHYgZmlsdGVycyByZWFkIG9uZSBtb3JlIHJvdyB0aGFuIHdoYXQgYWN0dWFsbHkgaXMKKyAgICAvLyBuZWVkZWQsIHNvIHN3aXRjaCB0byBlbXVsYXRlZCBlZGdlIG9uZSBwaXhlbCBzb29uZXIgdmVydGljYWxseQorICAgIC8vICghIW15ICogNSkgdGhhbiBob3Jpem9udGFsbHkgKCEhbXggKiA0KS4KKyAgICBpZiAoeCA8ICEhbXggKiAzIHx8IHkgPCAhIW15ICogMyB8fAorICAgICAgICB4ICsgISFteCAqIDQgPiB3IC0gYncgfHwgeSArICEhbXkgKiA1ID4gaCAtIGJoKSB7CisgICAgICAgIHMtPnZkc3AuZW11bGF0ZWRfZWRnZV9tYyh0ZC0+ZWRnZV9lbXVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmX3UgLSAhIW15ICogMyAqIHNyY19zdHJpZGVfdSAtICEhbXggKiAzICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MCwgc3JjX3N0cmlkZV91LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYncgKyAhIW14ICogNywgYmggKyAhIW15ICogNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggLSAhIW14ICogMywgeSAtICEhbXkgKiAzLCB3LCBoKTsKKyAgICAgICAgcmVmX3UgPSB0ZC0+ZWRnZV9lbXVfYnVmZmVyICsgISFteSAqIDMgKiAxNjAgKyAhIW14ICogMyAqIGJ5dGVzcGVycGl4ZWw7CisgICAgICAgIG1jWyEhbXhdWyEhbXldKGRzdF91LCBkc3Rfc3RyaWRlLCByZWZfdSwgMTYwLCBiaCwgbXgsIG15KTsKKworICAgICAgICBzLT52ZHNwLmVtdWxhdGVkX2VkZ2VfbWModGQtPmVkZ2VfZW11X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZl92IC0gISFteSAqIDMgKiBzcmNfc3RyaWRlX3YgLSAhIW14ICogMyAqIGJ5dGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAsIHNyY19zdHJpZGVfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3ICsgISFteCAqIDcsIGJoICsgISFteSAqIDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gISFteCAqIDMsIHkgLSAhIW15ICogMywgdywgaCk7CisgICAgICAgIHJlZl92ID0gdGQtPmVkZ2VfZW11X2J1ZmZlciArICEhbXkgKiAzICogMTYwICsgISFteCAqIDMgKiBieXRlc3BlcnBpeGVsOworICAgICAgICBtY1shIW14XVshIW15XShkc3RfdiwgZHN0X3N0cmlkZSwgcmVmX3YsIDE2MCwgYmgsIG14LCBteSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWNbISFteF1bISFteV0oZHN0X3UsIGRzdF9zdHJpZGUsIHJlZl91LCBzcmNfc3RyaWRlX3UsIGJoLCBteCwgbXkpOworICAgICAgICBtY1shIW14XVshIW15XShkc3RfdiwgZHN0X3N0cmlkZSwgcmVmX3YsIHNyY19zdHJpZGVfdiwgYmgsIG14LCBteSk7CisgICAgfQorfQorCisjZGVmaW5lIG1jX2x1bWFfZGlyKHRkLCBtYywgZHN0LCBkc3RfbHMsIHNyYywgc3JjX2xzLCB0cmVmLCByb3csIGNvbCwgbXYsIFwKKyAgICAgICAgICAgICAgICAgICAgcHgsIHB5LCBwdywgcGgsIGJ3LCBiaCwgdywgaCwgaSkgXAorICAgIG1jX2x1bWFfdW5zY2FsZWQodGQsIHMtPmRzcC5tYywgZHN0LCBkc3RfbHMsIHNyYywgc3JjX2xzLCB0cmVmLCByb3csIGNvbCwgXAorICAgICAgICAgICAgICAgICAgICAgbXYsIGJ3LCBiaCwgdywgaCwgYnl0ZXNwZXJwaXhlbCkKKyNkZWZpbmUgbWNfY2hyb21hX2Rpcih0ZCwgbWMsIGRzdHUsIGRzdHYsIGRzdF9scywgc3JjdSwgc3JjdV9scywgc3Jjdiwgc3Jjdl9scywgdHJlZiwgXAorICAgICAgICAgICAgICAgICAgICAgIHJvdywgY29sLCBtdiwgcHgsIHB5LCBwdywgcGgsIGJ3LCBiaCwgdywgaCwgaSkgXAorICAgIG1jX2Nocm9tYV91bnNjYWxlZCh0ZCwgcy0+ZHNwLm1jLCBkc3R1LCBkc3R2LCBkc3RfbHMsIHNyY3UsIHNyY3VfbHMsIHNyY3YsIHNyY3ZfbHMsIHRyZWYsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgcm93LCBjb2wsIG12LCBidywgYmgsIHcsIGgsIGJ5dGVzcGVycGl4ZWwpCisjZGVmaW5lIFNDQUxFRCAwCisjZGVmaW5lIEZOKHgpIHgjI184YnBwCisjZGVmaW5lIEJZVEVTX1BFUl9QSVhFTCAxCisjaW5jbHVkZSAidnA5X21jX3RlbXBsYXRlLmMiCisjdW5kZWYgRk4KKyN1bmRlZiBCWVRFU19QRVJfUElYRUwKKyNkZWZpbmUgRk4oeCkgeCMjXzE2YnBwCisjZGVmaW5lIEJZVEVTX1BFUl9QSVhFTCAyCisjaW5jbHVkZSAidnA5X21jX3RlbXBsYXRlLmMiCisjdW5kZWYgbWNfbHVtYV9kaXIKKyN1bmRlZiBtY19jaHJvbWFfZGlyCisjdW5kZWYgRk4KKyN1bmRlZiBCWVRFU19QRVJfUElYRUwKKyN1bmRlZiBTQ0FMRUQKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtY19sdW1hX3NjYWxlZChWUDlUaWxlRGF0YSAqdGQsIHZwOV9zY2FsZWRfbWNfZnVuYyBzbWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwOV9tY19mdW5jICgqbWMpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIHB0cmRpZmZfdCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRGcmFtZSAqcmVmX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgeSwgcHRyZGlmZl90IHgsIGNvbnN0IFZQNTZtdiAqaW5fbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBweCwgaW50IHB5LCBpbnQgcHcsIGludCBwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ3LCBpbnQgYmgsIGludCB3LCBpbnQgaCwgaW50IGJ5dGVzcGVycGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzY2FsZSwgY29uc3QgdWludDhfdCAqc3RlcCkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gdGQtPnM7CisgICAgaWYgKHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+d2lkdGggPT0gcmVmX2ZyYW1lLT5mLT53aWR0aCAmJgorICAgICAgICBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmhlaWdodCA9PSByZWZfZnJhbWUtPmYtPmhlaWdodCkgeworICAgICAgICBtY19sdW1hX3Vuc2NhbGVkKHRkLCBtYywgZHN0LCBkc3Rfc3RyaWRlLCByZWYsIHJlZl9zdHJpZGUsIHJlZl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB5LCB4LCBpbl9tdiwgYncsIGJoLCB3LCBoLCBieXRlc3BlcnBpeGVsKTsKKyAgICB9IGVsc2UgeworI2RlZmluZSBzY2FsZV9tdihuLCBkaW0pICgoKGludDY0X3QpKG4pICogc2NhbGVbZGltXSkgPj4gMTQpCisgICAgaW50IG14LCBteTsKKyAgICBpbnQgcmVmYndfbTEsIHJlZmJoX20xOworICAgIGludCB0aDsKKyAgICBWUDU2bXYgbXY7CisKKyAgICBtdi54ID0gYXZfY2xpcChpbl9tdi0+eCwgLSh4ICsgcHcgLSBweCArIDQpICogOCwgKHMtPmNvbHMgKiA4IC0geCArIHB4ICsgMykgKiA4KTsKKyAgICBtdi55ID0gYXZfY2xpcChpbl9tdi0+eSwgLSh5ICsgcGggLSBweSArIDQpICogOCwgKHMtPnJvd3MgKiA4IC0geSArIHB5ICsgMykgKiA4KTsKKyAgICAvLyBCVUcgbGlidnB4IHNlZW1zIHRvIHNjYWxlIHRoZSB0d28gY29tcG9uZW50cyBzZXBhcmF0ZWx5LiBUaGlzIGludHJvZHVjZXMKKyAgICAvLyByb3VuZGluZyBlcnJvcnMgYnV0IHdlIGhhdmUgdG8gcmVwcm9kdWNlIHRoZW0gdG8gYmUgZXhhY3RseSBjb21wYXRpYmxlCisgICAgLy8gd2l0aCB0aGUgb3V0cHV0IGZyb20gbGlidnB4Li4uCisgICAgbXggPSBzY2FsZV9tdihtdi54ICogMiwgMCkgKyBzY2FsZV9tdih4ICogMTYsIDApOworICAgIG15ID0gc2NhbGVfbXYobXYueSAqIDIsIDEpICsgc2NhbGVfbXYoeSAqIDE2LCAxKTsKKworICAgIHkgPSBteSA+PiA0OworICAgIHggPSBteCA+PiA0OworICAgIHJlZiArPSB5ICogcmVmX3N0cmlkZSArIHggKiBieXRlc3BlcnBpeGVsOworICAgIG14ICY9IDE1OworICAgIG15ICY9IDE1OworICAgIHJlZmJ3X20xID0gKChidyAtIDEpICogc3RlcFswXSArIG14KSA+PiA0OworICAgIHJlZmJoX20xID0gKChiaCAtIDEpICogc3RlcFsxXSArIG15KSA+PiA0OworICAgIC8vIEZJWE1FIGJpbGluZWFyIGZpbHRlciBvbmx5IG5lZWRzIDAvMSBwaXhlbHMsIG5vdCAzLzQKKyAgICAvLyB3ZSB1c2UgKzcgYmVjYXVzZSB0aGUgbGFzdCA3IHBpeGVscyBvZiBlYWNoIHNicm93IGNhbiBiZSBjaGFuZ2VkIGluCisgICAgLy8gdGhlIGxvbmdlc3QgbG9vcGZpbHRlciBvZiB0aGUgbmV4dCBzYnJvdworICAgIHRoID0gKHkgKyByZWZiaF9tMSArIDQgKyA3KSA+PiA2OworICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhyZWZfZnJhbWUsIEZGTUFYKHRoLCAwKSwgMCk7CisgICAgLy8gVGhlIGFybS9hYXJjaDY0IF9odiBmaWx0ZXJzIHJlYWQgb25lIG1vcmUgcm93IHRoYW4gd2hhdCBhY3R1YWxseSBpcworICAgIC8vIG5lZWRlZCwgc28gc3dpdGNoIHRvIGVtdWxhdGVkIGVkZ2Ugb25lIHBpeGVsIHNvb25lciB2ZXJ0aWNhbGx5CisgICAgLy8gKHkgKyA1ID49IGggLSByZWZiaF9tMSkgdGhhbiBob3Jpem9udGFsbHkgKHggKyA0ID49IHcgLSByZWZid19tMSkuCisgICAgaWYgKHggPCAzIHx8IHkgPCAzIHx8IHggKyA0ID49IHcgLSByZWZid19tMSB8fCB5ICsgNSA+PSBoIC0gcmVmYmhfbTEpIHsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHRkLT5lZGdlX2VtdV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYgLSAzICogcmVmX3N0cmlkZSAtIDMgKiBieXRlc3BlcnBpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjg4LCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmYndfbTEgKyA4LCByZWZiaF9tMSArIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gMywgeSAtIDMsIHcsIGgpOworICAgICAgICByZWYgPSB0ZC0+ZWRnZV9lbXVfYnVmZmVyICsgMyAqIDI4OCArIDMgKiBieXRlc3BlcnBpeGVsOworICAgICAgICByZWZfc3RyaWRlID0gMjg4OworICAgIH0KKyAgICBzbWMoZHN0LCBkc3Rfc3RyaWRlLCByZWYsIHJlZl9zdHJpZGUsIGJoLCBteCwgbXksIHN0ZXBbMF0sIHN0ZXBbMV0pOworICAgIH0KK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBtY19jaHJvbWFfc2NhbGVkKFZQOVRpbGVEYXRhICp0ZCwgdnA5X3NjYWxlZF9tY19mdW5jIHNtYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cDlfbWNfZnVuYyAoKm1jKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RfdSwgdWludDhfdCAqZHN0X3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmX3UsIHB0cmRpZmZfdCBzcmNfc3RyaWRlX3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmX3YsIHB0cmRpZmZfdCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkRnJhbWUgKnJlZl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgeSwgcHRyZGlmZl90IHgsIGNvbnN0IFZQNTZtdiAqaW5fbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHB4LCBpbnQgcHksIGludCBwdywgaW50IHBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidywgaW50IGJoLCBpbnQgdywgaW50IGgsIGludCBieXRlc3BlcnBpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzY2FsZSwgY29uc3QgdWludDhfdCAqc3RlcCkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gdGQtPnM7CisgICAgaWYgKHMtPnMuZnJhbWVzW0NVUl9GUkFNRV0udGYuZi0+d2lkdGggPT0gcmVmX2ZyYW1lLT5mLT53aWR0aCAmJgorICAgICAgICBzLT5zLmZyYW1lc1tDVVJfRlJBTUVdLnRmLmYtPmhlaWdodCA9PSByZWZfZnJhbWUtPmYtPmhlaWdodCkgeworICAgICAgICBtY19jaHJvbWFfdW5zY2FsZWQodGQsIG1jLCBkc3RfdSwgZHN0X3YsIGRzdF9zdHJpZGUsIHJlZl91LCBzcmNfc3RyaWRlX3UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfdiwgc3JjX3N0cmlkZV92LCByZWZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCB4LCBpbl9tdiwgYncsIGJoLCB3LCBoLCBieXRlc3BlcnBpeGVsKTsKKyAgICB9IGVsc2UgeworICAgIGludCBteCwgbXk7CisgICAgaW50IHJlZmJ3X20xLCByZWZiaF9tMTsKKyAgICBpbnQgdGg7CisgICAgVlA1Nm12IG12OworCisgICAgaWYgKHMtPnNzX2gpIHsKKyAgICAgICAgLy8gQlVHIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avd2VibS9pc3N1ZXMvZGV0YWlsP2lkPTgyMAorICAgICAgICBtdi54ID0gYXZfY2xpcChpbl9tdi0+eCwgLSh4ICsgcHcgLSBweCArIDQpICogMTYsIChzLT5jb2xzICogNCAtIHggKyBweCArIDMpICogMTYpOworICAgICAgICBteCA9IHNjYWxlX212KG12LngsIDApICsgKHNjYWxlX212KHggKiAxNiwgMCkgJiB+MTUpICsgKHNjYWxlX212KHggKiAzMiwgMCkgJiAxNSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXYueCA9IGF2X2NsaXAoaW5fbXYtPngsIC0oeCArIHB3IC0gcHggKyA0KSAqIDgsIChzLT5jb2xzICogOCAtIHggKyBweCArIDMpICogOCk7CisgICAgICAgIG14ID0gc2NhbGVfbXYobXYueCAqIDIsIDApICsgc2NhbGVfbXYoeCAqIDE2LCAwKTsKKyAgICB9CisgICAgaWYgKHMtPnNzX3YpIHsKKyAgICAgICAgLy8gQlVHIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avd2VibS9pc3N1ZXMvZGV0YWlsP2lkPTgyMAorICAgICAgICBtdi55ID0gYXZfY2xpcChpbl9tdi0+eSwgLSh5ICsgcGggLSBweSArIDQpICogMTYsIChzLT5yb3dzICogNCAtIHkgKyBweSArIDMpICogMTYpOworICAgICAgICBteSA9IHNjYWxlX212KG12LnksIDEpICsgKHNjYWxlX212KHkgKiAxNiwgMSkgJiB+MTUpICsgKHNjYWxlX212KHkgKiAzMiwgMSkgJiAxNSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXYueSA9IGF2X2NsaXAoaW5fbXYtPnksIC0oeSArIHBoIC0gcHkgKyA0KSAqIDgsIChzLT5yb3dzICogOCAtIHkgKyBweSArIDMpICogOCk7CisgICAgICAgIG15ID0gc2NhbGVfbXYobXYueSAqIDIsIDEpICsgc2NhbGVfbXYoeSAqIDE2LCAxKTsKKyAgICB9CisjdW5kZWYgc2NhbGVfbXYKKyAgICB5ID0gbXkgPj4gNDsKKyAgICB4ID0gbXggPj4gNDsKKyAgICByZWZfdSArPSB5ICogc3JjX3N0cmlkZV91ICsgeCAqIGJ5dGVzcGVycGl4ZWw7CisgICAgcmVmX3YgKz0geSAqIHNyY19zdHJpZGVfdiArIHggKiBieXRlc3BlcnBpeGVsOworICAgIG14ICY9IDE1OworICAgIG15ICY9IDE1OworICAgIHJlZmJ3X20xID0gKChidyAtIDEpICogc3RlcFswXSArIG14KSA+PiA0OworICAgIHJlZmJoX20xID0gKChiaCAtIDEpICogc3RlcFsxXSArIG15KSA+PiA0OworICAgIC8vIEZJWE1FIGJpbGluZWFyIGZpbHRlciBvbmx5IG5lZWRzIDAvMSBwaXhlbHMsIG5vdCAzLzQKKyAgICAvLyB3ZSB1c2UgKzcgYmVjYXVzZSB0aGUgbGFzdCA3IHBpeGVscyBvZiBlYWNoIHNicm93IGNhbiBiZSBjaGFuZ2VkIGluCisgICAgLy8gdGhlIGxvbmdlc3QgbG9vcGZpbHRlciBvZiB0aGUgbmV4dCBzYnJvdworICAgIHRoID0gKHkgKyByZWZiaF9tMSArIDQgKyA3KSA+PiAoNiAtIHMtPnNzX3YpOworICAgIGZmX3RocmVhZF9hd2FpdF9wcm9ncmVzcyhyZWZfZnJhbWUsIEZGTUFYKHRoLCAwKSwgMCk7CisgICAgLy8gVGhlIGFybS9hYXJjaDY0IF9odiBmaWx0ZXJzIHJlYWQgb25lIG1vcmUgcm93IHRoYW4gd2hhdCBhY3R1YWxseSBpcworICAgIC8vIG5lZWRlZCwgc28gc3dpdGNoIHRvIGVtdWxhdGVkIGVkZ2Ugb25lIHBpeGVsIHNvb25lciB2ZXJ0aWNhbGx5CisgICAgLy8gKHkgKyA1ID49IGggLSByZWZiaF9tMSkgdGhhbiBob3Jpem9udGFsbHkgKHggKyA0ID49IHcgLSByZWZid19tMSkuCisgICAgaWYgKHggPCAzIHx8IHkgPCAzIHx8IHggKyA0ID49IHcgLSByZWZid19tMSB8fCB5ICsgNSA+PSBoIC0gcmVmYmhfbTEpIHsKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHRkLT5lZGdlX2VtdV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfdSAtIDMgKiBzcmNfc3RyaWRlX3UgLSAzICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OCwgc3JjX3N0cmlkZV91LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmYndfbTEgKyA4LCByZWZiaF9tMSArIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gMywgeSAtIDMsIHcsIGgpOworICAgICAgICByZWZfdSA9IHRkLT5lZGdlX2VtdV9idWZmZXIgKyAzICogMjg4ICsgMyAqIGJ5dGVzcGVycGl4ZWw7CisgICAgICAgIHNtYyhkc3RfdSwgZHN0X3N0cmlkZSwgcmVmX3UsIDI4OCwgYmgsIG14LCBteSwgc3RlcFswXSwgc3RlcFsxXSk7CisKKyAgICAgICAgcy0+dmRzcC5lbXVsYXRlZF9lZGdlX21jKHRkLT5lZGdlX2VtdV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZfdiAtIDMgKiBzcmNfc3RyaWRlX3YgLSAzICogYnl0ZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OCwgc3JjX3N0cmlkZV92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmYndfbTEgKyA4LCByZWZiaF9tMSArIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4IC0gMywgeSAtIDMsIHcsIGgpOworICAgICAgICByZWZfdiA9IHRkLT5lZGdlX2VtdV9idWZmZXIgKyAzICogMjg4ICsgMyAqIGJ5dGVzcGVycGl4ZWw7CisgICAgICAgIHNtYyhkc3RfdiwgZHN0X3N0cmlkZSwgcmVmX3YsIDI4OCwgYmgsIG14LCBteSwgc3RlcFswXSwgc3RlcFsxXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc21jKGRzdF91LCBkc3Rfc3RyaWRlLCByZWZfdSwgc3JjX3N0cmlkZV91LCBiaCwgbXgsIG15LCBzdGVwWzBdLCBzdGVwWzFdKTsKKyAgICAgICAgc21jKGRzdF92LCBkc3Rfc3RyaWRlLCByZWZfdiwgc3JjX3N0cmlkZV92LCBiaCwgbXgsIG15LCBzdGVwWzBdLCBzdGVwWzFdKTsKKyAgICB9CisgICAgfQorfQorCisjZGVmaW5lIG1jX2x1bWFfZGlyKHRkLCBtYywgZHN0LCBkc3RfbHMsIHNyYywgc3JjX2xzLCB0cmVmLCByb3csIGNvbCwgbXYsIFwKKyAgICAgICAgICAgICAgICAgICAgcHgsIHB5LCBwdywgcGgsIGJ3LCBiaCwgdywgaCwgaSkgXAorICAgIG1jX2x1bWFfc2NhbGVkKHRkLCBzLT5kc3AucyMjbWMsIHMtPmRzcC5tYywgZHN0LCBkc3RfbHMsIHNyYywgc3JjX2xzLCB0cmVmLCByb3csIGNvbCwgXAorICAgICAgICAgICAgICAgICAgIG12LCBweCwgcHksIHB3LCBwaCwgYncsIGJoLCB3LCBoLCBieXRlc3BlcnBpeGVsLCBcCisgICAgICAgICAgICAgICAgICAgcy0+bXZzY2FsZVtiLT5yZWZbaV1dLCBzLT5tdnN0ZXBbYi0+cmVmW2ldXSkKKyNkZWZpbmUgbWNfY2hyb21hX2Rpcih0ZCwgbWMsIGRzdHUsIGRzdHYsIGRzdF9scywgc3JjdSwgc3JjdV9scywgc3Jjdiwgc3Jjdl9scywgdHJlZiwgXAorICAgICAgICAgICAgICAgICAgICAgIHJvdywgY29sLCBtdiwgcHgsIHB5LCBwdywgcGgsIGJ3LCBiaCwgdywgaCwgaSkgXAorICAgIG1jX2Nocm9tYV9zY2FsZWQodGQsIHMtPmRzcC5zIyNtYywgcy0+ZHNwLm1jLCBkc3R1LCBkc3R2LCBkc3RfbHMsIHNyY3UsIHNyY3VfbHMsIHNyY3YsIHNyY3ZfbHMsIHRyZWYsIFwKKyAgICAgICAgICAgICAgICAgICAgIHJvdywgY29sLCBtdiwgcHgsIHB5LCBwdywgcGgsIGJ3LCBiaCwgdywgaCwgYnl0ZXNwZXJwaXhlbCwgXAorICAgICAgICAgICAgICAgICAgICAgcy0+bXZzY2FsZVtiLT5yZWZbaV1dLCBzLT5tdnN0ZXBbYi0+cmVmW2ldXSkKKyNkZWZpbmUgU0NBTEVEIDEKKyNkZWZpbmUgRk4oeCkgeCMjX3NjYWxlZF84YnBwCisjZGVmaW5lIEJZVEVTX1BFUl9QSVhFTCAxCisjaW5jbHVkZSAidnA5X21jX3RlbXBsYXRlLmMiCisjdW5kZWYgRk4KKyN1bmRlZiBCWVRFU19QRVJfUElYRUwKKyNkZWZpbmUgRk4oeCkgeCMjX3NjYWxlZF8xNmJwcAorI2RlZmluZSBCWVRFU19QRVJfUElYRUwgMgorI2luY2x1ZGUgInZwOV9tY190ZW1wbGF0ZS5jIgorI3VuZGVmIG1jX2x1bWFfZGlyCisjdW5kZWYgbWNfY2hyb21hX2RpcgorI3VuZGVmIEZOCisjdW5kZWYgQllURVNfUEVSX1BJWEVMCisjdW5kZWYgU0NBTEVECisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaW50ZXJfcmVjb24oVlA5VGlsZURhdGEgKnRkLCBpbnQgYnl0ZXNwZXJwaXhlbCkKK3sKKyAgICBWUDlDb250ZXh0ICpzID0gdGQtPnM7CisgICAgVlA5QmxvY2sgKmIgPSB0ZC0+YjsKKyAgICBpbnQgcm93ID0gdGQtPnJvdywgY29sID0gdGQtPmNvbDsKKworICAgIGlmIChzLT5tdnNjYWxlW2ItPnJlZlswXV1bMF0gfHwgKGItPmNvbXAgJiYgcy0+bXZzY2FsZVtiLT5yZWZbMV1dWzBdKSkgeworICAgICAgICBpZiAoYnl0ZXNwZXJwaXhlbCA9PSAxKSB7CisgICAgICAgICAgICBpbnRlcl9wcmVkX3NjYWxlZF84YnBwKHRkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludGVyX3ByZWRfc2NhbGVkXzE2YnBwKHRkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChieXRlc3BlcnBpeGVsID09IDEpIHsKKyAgICAgICAgICAgIGludGVyX3ByZWRfOGJwcCh0ZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRlcl9wcmVkXzE2YnBwKHRkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYi0+c2tpcCkgeworICAgICAgICAvKiBtb3N0bHkgY29waWVkIGludHJhX3JlY29uKCkgKi8KKworICAgICAgICBpbnQgdzQgPSBmZl92cDlfYndoX3RhYlsxXVtiLT5ic11bMF0gPDwgMSwgc3RlcDFkID0gMSA8PCBiLT50eCwgbjsKKyAgICAgICAgaW50IGg0ID0gZmZfdnA5X2J3aF90YWJbMV1bYi0+YnNdWzFdIDw8IDEsIHgsIHksIHN0ZXAgPSAxIDw8IChiLT50eCAqIDIpOworICAgICAgICBpbnQgZW5kX3ggPSBGRk1JTigyICogKHMtPmNvbHMgLSBjb2wpLCB3NCk7CisgICAgICAgIGludCBlbmRfeSA9IEZGTUlOKDIgKiAocy0+cm93cyAtIHJvdyksIGg0KTsKKyAgICAgICAgaW50IHR4ID0gNCAqIHMtPnMuaC5sb3NzbGVzcyArIGItPnR4LCB1dnR4ID0gYi0+dXZ0eCArIDQgKiBzLT5zLmgubG9zc2xlc3M7CisgICAgICAgIGludCB1dnN0ZXAxZCA9IDEgPDwgYi0+dXZ0eCwgcDsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gdGQtPmRzdFswXTsKKworICAgICAgICAvLyB5IGl0eGZtIGFkZAorICAgICAgICBmb3IgKG4gPSAwLCB5ID0gMDsgeSA8IGVuZF95OyB5ICs9IHN0ZXAxZCkgeworICAgICAgICAgICAgdWludDhfdCAqcHRyID0gZHN0OworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGVuZF94OyB4ICs9IHN0ZXAxZCwKKyAgICAgICAgICAgICAgICAgcHRyICs9IDQgKiBzdGVwMWQgKiBieXRlc3BlcnBpeGVsLCBuICs9IHN0ZXApIHsKKyAgICAgICAgICAgICAgICBpbnQgZW9iID0gYi0+dHggPiBUWF84WDggPyBBVl9STjE2QSgmdGQtPmVvYltuXSkgOiB0ZC0+ZW9iW25dOworCisgICAgICAgICAgICAgICAgaWYgKGVvYikKKyAgICAgICAgICAgICAgICAgICAgcy0+ZHNwLml0eGZtX2FkZFt0eF1bRENUX0RDVF0ocHRyLCB0ZC0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5ibG9jayArIDE2ICogbiAqIGJ5dGVzcGVycGl4ZWwsIGVvYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QgKz0gNCAqIHRkLT55X3N0cmlkZSAqIHN0ZXAxZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHV2IGl0eGZtIGFkZAorICAgICAgICBlbmRfeCA+Pj0gcy0+c3NfaDsKKyAgICAgICAgZW5kX3kgPj49IHMtPnNzX3Y7CisgICAgICAgIHN0ZXAgPSAxIDw8IChiLT51dnR4ICogMik7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCAyOyBwKyspIHsKKyAgICAgICAgICAgIGRzdCA9IHRkLT5kc3RbcCArIDFdOworICAgICAgICAgICAgZm9yIChuID0gMCwgeSA9IDA7IHkgPCBlbmRfeTsgeSArPSB1dnN0ZXAxZCkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGRzdDsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZW5kX3g7IHggKz0gdXZzdGVwMWQsCisgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNCAqIHV2c3RlcDFkICogYnl0ZXNwZXJwaXhlbCwgbiArPSBzdGVwKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlb2IgPSBiLT51dnR4ID4gVFhfOFg4ID8gQVZfUk4xNkEoJnRkLT51dmVvYltwXVtuXSkgOiB0ZC0+dXZlb2JbcF1bbl07CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVvYikKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRzcC5pdHhmbV9hZGRbdXZ0eF1bRENUX0RDVF0ocHRyLCB0ZC0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+dXZibG9ja1twXSArIDE2ICogbiAqIGJ5dGVzcGVycGl4ZWwsIGVvYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdCArPSA0ICogdXZzdGVwMWQgKiB0ZC0+dXZfc3RyaWRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGZmX3ZwOV9pbnRlcl9yZWNvbl84YnBwKFZQOVRpbGVEYXRhICp0ZCkKK3sKKyAgICBpbnRlcl9yZWNvbih0ZCwgMSk7Cit9CisKK3ZvaWQgZmZfdnA5X2ludGVyX3JlY29uXzE2YnBwKFZQOVRpbGVEYXRhICp0ZCkKK3sKKyAgICBpbnRlcl9yZWNvbih0ZCwgMik7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZwOXNoYXJlZC5oIGIvbGliYXZjb2RlYy92cDlzaGFyZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDcyNmRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92cDlzaGFyZWQuaApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIFZQOSBjb21wYXRpYmxlIHZpZGVvIGRlY29kZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgorICogQ29weXJpZ2h0IChDKSAyMDEzIENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19WUDlTSEFSRURfSAorI2RlZmluZSBBVkNPREVDX1ZQOVNIQVJFRF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInZwOS5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInZwNTYuaCIKKworZW51bSBCbG9ja1BhcnRpdGlvbiB7CisgICAgUEFSVElUSU9OX05PTkUsICAgIC8vIFsgXSA8LS4KKyAgICBQQVJUSVRJT05fSCwgICAgICAgLy8gWy1dICAgfAorICAgIFBBUlRJVElPTl9WLCAgICAgICAvLyBbfF0gICB8CisgICAgUEFSVElUSU9OX1NQTElULCAgIC8vIFsrXSAtLScKK307CisKK2VudW0gSW50ZXJQcmVkTW9kZSB7CisgICAgTkVBUkVTVE1WID0gMTAsCisgICAgTkVBUk1WICAgID0gMTEsCisgICAgWkVST01WICAgID0gMTIsCisgICAgTkVXTVYgICAgID0gMTMsCit9OworCitlbnVtIENvbXBQcmVkTW9kZSB7CisgICAgUFJFRF9TSU5HTEVSRUYsCisgICAgUFJFRF9DT01QUkVGLAorICAgIFBSRURfU1dJVENIQUJMRSwKK307CisKK3R5cGVkZWYgc3RydWN0IFZQOW12cmVmUGFpciB7CisgICAgVlA1Nm12IG12WzJdOworICAgIGludDhfdCByZWZbMl07Cit9IFZQOW12cmVmUGFpcjsKKwordHlwZWRlZiBzdHJ1Y3QgVlA5RnJhbWUgeworICAgIFRocmVhZEZyYW1lIHRmOworICAgIEFWQnVmZmVyUmVmICpleHRyYWRhdGE7CisgICAgdWludDhfdCAqc2VnbWVudGF0aW9uX21hcDsKKyAgICBWUDltdnJlZlBhaXIgKm12OworICAgIGludCB1c2VzXzJwYXNzOworCisgICAgQVZCdWZmZXJSZWYgKmh3YWNjZWxfcHJpdl9idWY7CisgICAgdm9pZCAqaHdhY2NlbF9waWN0dXJlX3ByaXZhdGU7Cit9IFZQOUZyYW1lOworCitlbnVtIEJsb2NrTGV2ZWwgeworICAgIEJMXzY0WDY0LAorICAgIEJMXzMyWDMyLAorICAgIEJMXzE2WDE2LAorICAgIEJMXzhYOCwKK307CisKK2VudW0gQmxvY2tTaXplIHsKKyAgICBCU182NHg2NCwKKyAgICBCU182NHgzMiwKKyAgICBCU18zMng2NCwKKyAgICBCU18zMngzMiwKKyAgICBCU18zMngxNiwKKyAgICBCU18xNngzMiwKKyAgICBCU18xNngxNiwKKyAgICBCU18xNng4LAorICAgIEJTXzh4MTYsCisgICAgQlNfOHg4LAorICAgIEJTXzh4NCwKKyAgICBCU180eDgsCisgICAgQlNfNHg0LAorICAgIE5fQlNfU0laRVMsCit9OworCit0eXBlZGVmIHN0cnVjdCBWUDlCaXRzdHJlYW1IZWFkZXIgeworICAgIC8vIGJpdHN0cmVhbSBoZWFkZXIKKyAgICB1aW50OF90IHByb2ZpbGU7CisgICAgdWludDhfdCBicHA7CisgICAgdWludDhfdCBrZXlmcmFtZTsKKyAgICB1aW50OF90IGludmlzaWJsZTsKKyAgICB1aW50OF90IGVycm9ycmVzOworICAgIHVpbnQ4X3QgaW50cmFvbmx5OworICAgIHVpbnQ4X3QgcmVzZXRjdHg7CisgICAgdWludDhfdCByZWZyZXNocmVmbWFzazsKKyAgICB1aW50OF90IGhpZ2hwcmVjaXNpb25tdnM7CisgICAgZW51bSBGaWx0ZXJNb2RlIGZpbHRlcm1vZGU7CisgICAgdWludDhfdCBhbGxvd2NvbXBpbnRlcjsKKyAgICB1aW50OF90IHJlZnJlc2hjdHg7CisgICAgdWludDhfdCBwYXJhbGxlbG1vZGU7CisgICAgdWludDhfdCBmcmFtZWN0eGlkOworICAgIHVpbnQ4X3QgdXNlX2xhc3RfZnJhbWVfbXZzOworICAgIHVpbnQ4X3QgcmVmaWR4WzNdOworICAgIHVpbnQ4X3Qgc2lnbmJpYXNbM107CisgICAgdWludDhfdCBmaXhjb21wcmVmOworICAgIHVpbnQ4X3QgdmFyY29tcHJlZlsyXTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50OF90IGxldmVsOworICAgICAgICBpbnQ4X3Qgc2hhcnBuZXNzOworICAgIH0gZmlsdGVyOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgZW5hYmxlZDsKKyAgICAgICAgdWludDhfdCB1cGRhdGVkOworICAgICAgICBpbnQ4X3QgbW9kZVsyXTsKKyAgICAgICAgaW50OF90IHJlZls0XTsKKyAgICB9IGxmX2RlbHRhOworICAgIHVpbnQ4X3QgeWFjX3FpOworICAgIGludDhfdCB5ZGNfcWRlbHRhLCB1dmRjX3FkZWx0YSwgdXZhY19xZGVsdGE7CisgICAgdWludDhfdCBsb3NzbGVzczsKKyNkZWZpbmUgTUFYX1NFR01FTlQgOAorICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgZW5hYmxlZDsKKyAgICAgICAgdWludDhfdCB0ZW1wb3JhbDsKKyAgICAgICAgdWludDhfdCBhYnNvbHV0ZV92YWxzOworICAgICAgICB1aW50OF90IHVwZGF0ZV9tYXA7CisgICAgICAgIHVpbnQ4X3QgcHJvYls3XTsKKyAgICAgICAgdWludDhfdCBwcmVkX3Byb2JbM107CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IHFfZW5hYmxlZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgbGZfZW5hYmxlZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVmX2VuYWJsZWQ7CisgICAgICAgICAgICB1aW50OF90IHNraXBfZW5hYmxlZDsKKyAgICAgICAgICAgIHVpbnQ4X3QgcmVmX3ZhbDsKKyAgICAgICAgICAgIGludDE2X3QgcV92YWw7CisgICAgICAgICAgICBpbnQ4X3QgbGZfdmFsOworICAgICAgICAgICAgaW50MTZfdCBxbXVsWzJdWzJdOworICAgICAgICAgICAgdWludDhfdCBsZmx2bFs0XVsyXTsKKyAgICAgICAgfSBmZWF0W01BWF9TRUdNRU5UXTsKKyAgICB9IHNlZ21lbnRhdGlvbjsKKyAgICBlbnVtIFR4Zm1Nb2RlIHR4Zm1tb2RlOworICAgIGVudW0gQ29tcFByZWRNb2RlIGNvbXBwcmVkbW9kZTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1bnNpZ25lZCBsb2cyX3RpbGVfY29scywgbG9nMl90aWxlX3Jvd3M7CisgICAgICAgIHVuc2lnbmVkIHRpbGVfY29scywgdGlsZV9yb3dzOworICAgIH0gdGlsaW5nOworCisgICAgaW50IHVuY29tcHJlc3NlZF9oZWFkZXJfc2l6ZTsKKyAgICBpbnQgY29tcHJlc3NlZF9oZWFkZXJfc2l6ZTsKK30gVlA5Qml0c3RyZWFtSGVhZGVyOworCit0eXBlZGVmIHN0cnVjdCBWUDlTaGFyZWRDb250ZXh0IHsKKyAgICBWUDlCaXRzdHJlYW1IZWFkZXIgaDsKKworICAgIFRocmVhZEZyYW1lIHJlZnNbOF07CisjZGVmaW5lIENVUl9GUkFNRSAwCisjZGVmaW5lIFJFRl9GUkFNRV9NVlBBSVIgMQorI2RlZmluZSBSRUZfRlJBTUVfU0VHTUFQIDIKKyAgICBWUDlGcmFtZSBmcmFtZXNbM107Cit9IFZQOVNoYXJlZENvbnRleHQ7CisKKyNlbmRpZiAvKiBBVkNPREVDX1ZQOVNIQVJFRF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ZxYXZpZGVvLmMgYi9saWJhdmNvZGVjL3ZxYXZpZGVvLmMKaW5kZXggM2VkOTY1Mi4uMGU3MGJlMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy92cWF2aWRlby5jCisrKyBiL2xpYmF2Y29kZWMvdnFhdmlkZW8uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBXZXN0d29vZCBTdHVkaW9zIFZRQSBWaWRlbyBEZWNvZGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTM4NCwxMiArMzg0LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkZvdW5kIHVua25vd24gY2h1bmsgdHlwZTogJWMlYyVjJWMgKCUwOFgpXG4iLAotICAgICAgICAgICAgKGNodW5rX3R5cGUgPj4gMjQpICYgMHhGRiwKLSAgICAgICAgICAgIChjaHVua190eXBlID4+IDE2KSAmIDB4RkYsCi0gICAgICAgICAgICAoY2h1bmtfdHlwZSA+PiAgOCkgJiAweEZGLAotICAgICAgICAgICAgKGNodW5rX3R5cGUgPj4gIDApICYgMHhGRiwKLSAgICAgICAgICAgIGNodW5rX3R5cGUpOworICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsICJGb3VuZCB1bmtub3duIGNodW5rIHR5cGU6ICVzICglMDhYKVxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKGF2X2Jzd2FwMzIoY2h1bmtfdHlwZSkpLCBjaHVua190eXBlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvdnRfaW50ZXJuYWwuaCBiL2xpYmF2Y29kZWMvdnRfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY0NzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy92dF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkNPREVDX1ZUX0lOVEVSTkFMX0gKKyNkZWZpbmUgQVZDT0RFQ19WVF9JTlRFUk5BTF9ICisKK3R5cGVkZWYgc3RydWN0IFZUQ29udGV4dCB7CisgICAgLy8gVGhlIGN1cnJlbnQgYml0c3RyZWFtIGJ1ZmZlci4KKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICAgKmJpdHN0cmVhbTsKKworICAgIC8vIFRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGJpdHN0cmVhbS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtX3NpemU7CisKKyAgICAvLyBUaGUgcmVmZXJlbmNlIHNpemUgdXNlZCBmb3IgZmFzdCByZWFsbG9jYXRpb24uCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZF9zaXplOworCisgICAgLy8gVGhlIGNvcmUgdmlkZW8gYnVmZmVyCisgICAgQ1ZJbWFnZUJ1ZmZlclJlZiAgICAgICAgICAgIGZyYW1lOworCisgICAgLy8gQ3VycmVudCBkdW1teSBmcmFtZXMgY29udGV4dCAoZGVwZW5kcyBvbiBleGFjdCBDVkltYWdlQnVmZmVyUmVmIHBhcmFtcykuCisgICAgc3RydWN0IEFWQnVmZmVyUmVmICAgICAgICAgKmNhY2hlZF9od19mcmFtZXNfY3R4OworCisgICAgLy8gTm9uLU5VTEwgaWYgdGhlIG5ldyBod2FjY2VsIEFQSSBpcyB1c2VkLiBUaGlzIGlzIG9ubHkgYSBzZXBhcmF0ZSBzdHJ1Y3QKKyAgICAvLyB0byBlYXNlIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgb2xkIEFQSS4KKyAgICBzdHJ1Y3QgQVZWaWRlb3Rvb2xib3hDb250ZXh0ICp2dF9jdHg7CisKKyAgICAvLyBDdXJyZW50IEgyNjQgcGFyYW1ldGVycyAodXNlZCB0byB0cmlnZ2VyIGRlY29kZXIgcmVzdGFydCBvbiBTUFMgY2hhbmdlcykuCisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAgIHNwc1szXTsKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25maWdfbmVlZGVkOworfSBWVENvbnRleHQ7CisKK2ludCBmZl92aWRlb3Rvb2xib3hfYWxsb2NfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSk7CitpbnQgZmZfdmlkZW90b29sYm94X3VuaW5pdChBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworaW50IGZmX3ZpZGVvdG9vbGJveF9oMjY0X3N0YXJ0X2ZyYW1lKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSk7CitpbnQgZmZfdmlkZW90b29sYm94X2gyNjRfZGVjb2RlX3NsaWNlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKTsKK0NGRGF0YVJlZiBmZl92aWRlb3Rvb2xib3hfYXZjY19leHRyYWRhdGFfY3JlYXRlKEFWQ29kZWNDb250ZXh0ICphdmN0eCk7CitDRkRhdGFSZWYgZmZfdmlkZW90b29sYm94X2h2Y2NfZXh0cmFkYXRhX2NyZWF0ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpOworCisjZW5kaWYgLyogQVZDT0RFQ19WVF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dhdnBhY2suYyBiL2xpYmF2Y29kZWMvd2F2cGFjay5jCmluZGV4IGI2MDIyZjAuLjgzMDZlYzAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvd2F2cGFjay5jCisrKyBiL2xpYmF2Y29kZWMvd2F2cGFjay5jCkBAIC0xOSwxNSArMTksMTUgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKLQogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKICNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ1bmFyeS5oIgotI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJ3YXZwYWNrLmgiCiAKIC8qKgpAQCAtODUsNyArODUsNyBAQAogCiAjZGVmaW5lIExFVkVMX0RFQ0FZKGEpICAoKChhKSArIDB4ODApID4+IDgpCiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBnZXRfdGFpbChHZXRCaXRDb250ZXh0ICpnYiwgaW50IGspCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1bnNpZ25lZCBnZXRfdGFpbChHZXRCaXRDb250ZXh0ICpnYiwgaW50IGspCiB7CiAgICAgaW50IHAsIGUsIHJlczsKIApAQCAtOTksMTEgKzk5LDEzIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX2Vycm9yX2xpbWl0KFdhdnBhY2tGcmFtZUNvbnRleHQgKmN0eCkKK3N0YXRpYyBpbnQgdXBkYXRlX2Vycm9yX2xpbWl0KFdhdnBhY2tGcmFtZUNvbnRleHQgKmN0eCkKIHsKICAgICBpbnQgaSwgYnJbMl0sIHNsWzJdOwogCiAgICAgZm9yIChpID0gMDsgaSA8PSBjdHgtPnN0ZXJlb19pbjsgaSsrKSB7CisgICAgICAgIGlmIChjdHgtPmNoW2ldLmJpdHJhdGVfYWNjID4gVUlOVF9NQVggLSBjdHgtPmNoW2ldLmJpdHJhdGVfZGVsdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgY3R4LT5jaFtpXS5iaXRyYXRlX2FjYyArPSBjdHgtPmNoW2ldLmJpdHJhdGVfZGVsdGE7CiAgICAgICAgIGJyW2ldICAgICAgICAgICAgICAgICAgID0gY3R4LT5jaFtpXS5iaXRyYXRlX2FjYyA+PiAxNjsKICAgICAgICAgc2xbaV0gICAgICAgICAgICAgICAgICAgPSBMRVZFTF9ERUNBWShjdHgtPmNoW2ldLnNsb3dfbGV2ZWwpOwpAQCAtMTExLDEwICsxMTMsMTAgQEAKICAgICBpZiAoY3R4LT5zdGVyZW9faW4gJiYgY3R4LT5oeWJyaWRfYml0cmF0ZSkgewogICAgICAgICBpbnQgYmFsYW5jZSA9IChzbFsxXSAtIHNsWzBdICsgYnJbMV0gKyAxKSA+PiAxOwogICAgICAgICBpZiAoYmFsYW5jZSA+IGJyWzBdKSB7Ci0gICAgICAgICAgICBiclsxXSA9IGJyWzBdIDw8IDE7CisgICAgICAgICAgICBiclsxXSA9IGJyWzBdICogMjsKICAgICAgICAgICAgIGJyWzBdID0gMDsKICAgICAgICAgfSBlbHNlIGlmICgtYmFsYW5jZSA+IGJyWzBdKSB7Ci0gICAgICAgICAgICBiclswXSA8PD0gMTsKKyAgICAgICAgICAgIGJyWzBdICAqPSAyOwogICAgICAgICAgICAgYnJbMV0gICA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBiclsxXSA9IGJyWzBdICsgYmFsYW5jZTsKQEAgLTEzMSw2ICsxMzMsOCBAQAogICAgICAgICAgICAgY3R4LT5jaFtpXS5lcnJvcl9saW1pdCA9IHdwX2V4cDIoYnJbaV0pOwogICAgICAgICB9CiAgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd3ZfZ2V0X3ZhbHVlKFdhdnBhY2tGcmFtZUNvbnRleHQgKmN0eCwgR2V0Qml0Q29udGV4dCAqZ2IsCkBAIC0xNTMsNyArMTU3LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHQgPSBnZXRfdW5hcnlfMF8zMyhnYik7CiAgICAgICAgICAgICBpZiAodCA+PSAyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgdCAtIDEpCisgICAgICAgICAgICAgICAgaWYgKHQgPj0gMzIgfHwgZ2V0X2JpdHNfbGVmdChnYikgPCB0IC0gMSkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB0ID0gZ2V0X2JpdHNfbG9uZyhnYiwgdCAtIDEpIHwgKDEgPDwgKHQgLSAxKSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTg0LDcgKzE4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICAgICAgdCArPSB0MjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgdDIgLSAxKQorICAgICAgICAgICAgICAgIGlmICh0MiA+PSAzMiB8fCBnZXRfYml0c19sZWZ0KGdiKSA8IHQyIC0gMSkKICAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgICAgICAgICB0ICs9IGdldF9iaXRzX2xvbmcoZ2IsIHQyIC0gMSkgfCAoMSA8PCAodDIgLSAxKSk7CiAgICAgICAgICAgICB9CkBAIC0yMDAsOCArMjA0LDEwIEBACiAgICAgICAgIGN0eC0+emVybyA9ICFjdHgtPm9uZTsKICAgICB9CiAKLSAgICBpZiAoY3R4LT5oeWJyaWQgJiYgIWNoYW5uZWwpCi0gICAgICAgIHVwZGF0ZV9lcnJvcl9saW1pdChjdHgpOworICAgIGlmIChjdHgtPmh5YnJpZCAmJiAhY2hhbm5lbCkgeworICAgICAgICBpZiAodXBkYXRlX2Vycm9yX2xpbWl0KGN0eCkgPCAwKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CiAKICAgICBpZiAoIXQpIHsKICAgICAgICAgYmFzZSA9IDA7CkBAIC0yMTksNyArMjI1LDcgQEAKICAgICAgICAgSU5DX01FRCgxKTsKICAgICAgICAgREVDX01FRCgyKTsKICAgICB9IGVsc2UgewotICAgICAgICBiYXNlID0gR0VUX01FRCgwKSArIEdFVF9NRUQoMSkgKyBHRVRfTUVEKDIpICogKHQgLSAyKTsKKyAgICAgICAgYmFzZSA9IEdFVF9NRUQoMCkgKyBHRVRfTUVEKDEpICsgR0VUX01FRCgyKSAqICh0IC0gMlUpOwogICAgICAgICBhZGQgID0gR0VUX01FRCgyKSAtIDE7CiAgICAgICAgIElOQ19NRUQoMCk7CiAgICAgICAgIElOQ19NRUQoMSk7CkBAIC0yMzQsMTYgKzI0MCwxNiBAQAogICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPD0gMCkKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IG1pZCA9IChiYXNlICogMiArIGFkZCArIDEpID4+IDE7CisgICAgICAgIGludCBtaWQgPSAoYmFzZSAqIDJVICsgYWRkICsgMSkgPj4gMTsKICAgICAgICAgd2hpbGUgKGFkZCA+IGMtPmVycm9yX2xpbWl0KSB7CiAgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPD0gMCkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgaWYgKGdldF9iaXRzMShnYikpIHsKLSAgICAgICAgICAgICAgICBhZGQgLT0gKG1pZCAtIGJhc2UpOworICAgICAgICAgICAgICAgIGFkZCAtPSAobWlkIC0gKHVuc2lnbmVkKWJhc2UpOwogICAgICAgICAgICAgICAgIGJhc2UgPSBtaWQ7CiAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBhZGQgPSBtaWQgLSBiYXNlIC0gMTsKLSAgICAgICAgICAgIG1pZCA9IChiYXNlICogMiArIGFkZCArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgYWRkID0gbWlkIC0gKHVuc2lnbmVkKWJhc2UgLSAxOworICAgICAgICAgICAgbWlkID0gKGJhc2UgKiAyVSArIGFkZCArIDEpID4+IDE7CiAgICAgICAgIH0KICAgICAgICAgcmV0ID0gbWlkOwogICAgIH0KQEAgLTI2MiwxMiArMjY4LDEyIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHd2X2dldF92YWx1ZV9pbnRlZ2VyKFdhdnBhY2tGcmFtZUNvbnRleHQgKnMsIHVpbnQzMl90ICpjcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFMpCiB7Ci0gICAgaW50IGJpdDsKKyAgICB1bnNpZ25lZCBiaXQ7CiAKICAgICBpZiAocy0+ZXh0cmFfYml0cykgewotICAgICAgICBTIDw8PSBzLT5leHRyYV9iaXRzOworICAgICAgICBTICo9IDEgPDwgcy0+ZXh0cmFfYml0czsKIAogICAgICAgICBpZiAocy0+Z290X2V4dHJhX2JpdHMgJiYKICAgICAgICAgICAgIGdldF9iaXRzX2xlZnQoJnMtPmdiX2V4dHJhX2JpdHMpID49IHMtPmV4dHJhX2JpdHMpIHsKQEAgLTMwNCwxMSArMzEwLDExIEBACiAgICAgfQogCiAgICAgaWYgKFMpIHsKLSAgICAgICAgUyAgPDw9IHMtPmZsb2F0X3NoaWZ0OworICAgICAgICBTICAqPSAxVSA8PCBzLT5mbG9hdF9zaGlmdDsKICAgICAgICAgc2lnbiA9IFMgPCAwOwogICAgICAgICBpZiAoc2lnbikKLSAgICAgICAgICAgIFMgPSAtUzsKLSAgICAgICAgaWYgKFMgPj0gMHgxMDAwMDAwKSB7CisgICAgICAgICAgICBTID0gLSh1bnNpZ25lZClTOworICAgICAgICBpZiAoUyA+PSAweDEwMDAwMDBVKSB7CiAgICAgICAgICAgICBpZiAocy0+Z290X2V4dHJhX2JpdHMgJiYgZ2V0X2JpdHMxKCZzLT5nYl9leHRyYV9iaXRzKSkKICAgICAgICAgICAgICAgICBTID0gZ2V0X2JpdHMoJnMtPmdiX2V4dHJhX2JpdHMsIDIzKTsKICAgICAgICAgICAgIGVsc2UKQEAgLTQwOSwxMSArNDE1LDExIEBACiAgICAgICAgICAgICBpZiAodCA+IDApIHsKICAgICAgICAgICAgICAgICBpZiAodCA+IDgpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBID0gMiAqIHMtPmRlY29ycltpXS5zYW1wbGVzQVswXSAtIHMtPmRlY29ycltpXS5zYW1wbGVzQVsxXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEIgPSAyICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgQSA9IDJVICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgQiA9IDJVICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzFdOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQSA9ICgzICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgQiA9ICgzICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzFdKSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgQSA9IChpbnQpKDNVICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdKSA+PiAxOworICAgICAgICAgICAgICAgICAgICAgICAgQiA9IChpbnQpKDNVICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzFdKSA+PiAxOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29ycltpXS5zYW1wbGVzQVsxXSA9IHMtPmRlY29ycltpXS5zYW1wbGVzQVswXTsKICAgICAgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzFdID0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdOwpAQCAtNDI3LDggKzQzMyw4IEBACiAgICAgICAgICAgICAgICAgICAgIEwyID0gTCArICgocy0+ZGVjb3JyW2ldLndlaWdodEEgKiAoaW50NjRfdClBICsgNTEyKSA+PiAxMCk7CiAgICAgICAgICAgICAgICAgICAgIFIyID0gUiArICgocy0+ZGVjb3JyW2ldLndlaWdodEIgKiAoaW50NjRfdClCICsgNTEyKSA+PiAxMCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTDIgPSBMICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqIEEgKyA1MTIpID4+IDEwKTsKLSAgICAgICAgICAgICAgICAgICAgUjIgPSBSICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QiAqIEIgKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICAgICAgTDIgPSBMICsgKHVuc2lnbmVkKSgoaW50KShzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqICh1bnNpZ25lZClBICsgNTEyKSA+PiAxMCk7CisgICAgICAgICAgICAgICAgICAgIFIyID0gUiArICh1bnNpZ25lZCkoKGludCkocy0+ZGVjb3JyW2ldLndlaWdodEIgKiAodW5zaWduZWQpQiArIDUxMikgPj4gMTApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoQSAmJiBMKQogICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbaV0ud2VpZ2h0QSAtPSAoKCgoTCBeIEEpID4+IDMwKSAmIDIpIC0gMSkgKiBzLT5kZWNvcnJbaV0uZGVsdGE7CkBAIC00NDAsMTMgKzQ0NiwxMyBAQAogICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IEFWX1NBTVBMRV9GTVRfUzE2UCkKICAgICAgICAgICAgICAgICAgICAgTDIgPSBMICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqIChpbnQ2NF90KXMtPmRlY29ycltpXS5zYW1wbGVzQVswXSArIDUxMikgPj4gMTApOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgTDIgPSBMICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqIHMtPmRlY29ycltpXS5zYW1wbGVzQVswXSArIDUxMikgPj4gMTApOworICAgICAgICAgICAgICAgICAgICBMMiA9IEwgKyAodW5zaWduZWQpKChpbnQpKHMtPmRlY29ycltpXS53ZWlnaHRBICogKHVuc2lnbmVkKXMtPmRlY29ycltpXS5zYW1wbGVzQVswXSArIDUxMikgPj4gMTApOwogICAgICAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChzLT5kZWNvcnJbaV0ud2VpZ2h0QSwgcy0+ZGVjb3JyW2ldLmRlbHRhLCBzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMF0sIEwpOwogICAgICAgICAgICAgICAgIEwgPSBMMjsKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBBVl9TQU1QTEVfRk1UX1MxNlApCiAgICAgICAgICAgICAgICAgICAgIFIyID0gUiArICgocy0+ZGVjb3JyW2ldLndlaWdodEIgKiAoaW50NjRfdClMMiArIDUxMikgPj4gMTApOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgUjIgPSBSICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QiAqIEwyICsgNTEyKSA+PiAxMCk7CisgICAgICAgICAgICAgICAgICAgIFIyID0gUiArICh1bnNpZ25lZCkoKGludCkocy0+ZGVjb3JyW2ldLndlaWdodEIgKiAodW5zaWduZWQpTDIgKyA1MTIpID4+IDEwKTsKICAgICAgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAocy0+ZGVjb3JyW2ldLndlaWdodEIsIHMtPmRlY29ycltpXS5kZWx0YSwgTDIsIFIpOwogICAgICAgICAgICAgICAgIFIgICAgICAgICAgICAgICAgICAgICAgICA9IFIyOwogICAgICAgICAgICAgICAgIHMtPmRlY29ycltpXS5zYW1wbGVzQVswXSA9IFI7CkBAIC00NTQsNyArNDYwLDcgQEAKICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPSBBVl9TQU1QTEVfRk1UX1MxNlApCiAgICAgICAgICAgICAgICAgICAgIFIyID0gUiArICgocy0+ZGVjb3JyW2ldLndlaWdodEIgKiAoaW50NjRfdClzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMF0gKyA1MTIpID4+IDEwKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIFIyID0gUiArICgocy0+ZGVjb3JyW2ldLndlaWdodEIgKiBzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMF0gKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICAgICAgUjIgPSBSICsgKHVuc2lnbmVkKSgoaW50KShzLT5kZWNvcnJbaV0ud2VpZ2h0QiAqICh1bnNpZ25lZClzLT5kZWNvcnJbaV0uc2FtcGxlc0JbMF0gKyA1MTIpID4+IDEwKTsKICAgICAgICAgICAgICAgICBVUERBVEVfV0VJR0hUX0NMSVAocy0+ZGVjb3JyW2ldLndlaWdodEIsIHMtPmRlY29ycltpXS5kZWx0YSwgcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdLCBSKTsKICAgICAgICAgICAgICAgICBSID0gUjI7CiAKQEAgLTQ2Niw3ICs0NzIsNyBAQAogICAgICAgICAgICAgICAgIGlmICh0eXBlICE9IEFWX1NBTVBMRV9GTVRfUzE2UCkKICAgICAgICAgICAgICAgICAgICAgTDIgPSBMICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqIChpbnQ2NF90KVIyICsgNTEyKSA+PiAxMCk7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBMMiA9IEwgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRBICogUjIgKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICAgICAgTDIgPSBMICsgKHVuc2lnbmVkKSgoaW50KShzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqICh1bnNpZ25lZClSMiArIDUxMikgPj4gMTApOwogICAgICAgICAgICAgICAgIFVQREFURV9XRUlHSFRfQ0xJUChzLT5kZWNvcnJbaV0ud2VpZ2h0QSwgcy0+ZGVjb3JyW2ldLmRlbHRhLCBSMiwgTCk7CiAgICAgICAgICAgICAgICAgTCAgICAgICAgICAgICAgICAgICAgICAgID0gTDI7CiAgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNCWzBdID0gTDsKQEAgLTQ3NCw3ICs0ODAsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKHR5cGUgPT0gQVZfU0FNUExFX0ZNVF9TMTZQKSB7Ci0gICAgICAgICAgICBpZiAoRkZBQlMoTCkgKyBGRkFCUyhSKSA+ICgxPDwxOSkpIHsKKyAgICAgICAgICAgIGlmIChGRkFCUygoaW50NjRfdClMKSArIEZGQUJTKChpbnQ2NF90KVIpID4gKDE8PDE5KSkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAic2FtcGxlICVkICVkIHRvbyBsYXJnZVxuIiwgTCwgUik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CkBAIC00ODIsNyArNDg4LDcgQEAKIAogICAgICAgICBwb3MgPSAocG9zICsgMSkgJiA3OwogICAgICAgICBpZiAocy0+am9pbnQpCi0gICAgICAgICAgICBMICs9IChSIC09IChMID4+IDEpKTsKKyAgICAgICAgICAgIEwgKz0gKHVuc2lnbmVkKShSIC09ICh1bnNpZ25lZCkoTCA+PiAxKSk7CiAgICAgICAgIGNyYyA9IChjcmMgKiAzICsgTCkgKiAzICsgUjsKIAogICAgICAgICBpZiAodHlwZSA9PSBBVl9TQU1QTEVfRk1UX0ZMVFApIHsKQEAgLTUzNiw5ICs1NDIsOSBAQAogICAgICAgICAgICAgdCA9IHMtPmRlY29ycltpXS52YWx1ZTsKICAgICAgICAgICAgIGlmICh0ID4gOCkgewogICAgICAgICAgICAgICAgIGlmICh0ICYgMSkKLSAgICAgICAgICAgICAgICAgICAgQSA9ICAyICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdOworICAgICAgICAgICAgICAgICAgICBBID0gIDJVICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdOwogICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgQSA9ICgzICogcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdIC0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdKSA+PiAxOworICAgICAgICAgICAgICAgICAgICBBID0gKGludCkoM1UgKiBzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMF0gLSBzLT5kZWNvcnJbaV0uc2FtcGxlc0FbMV0pID4+IDE7CiAgICAgICAgICAgICAgICAgcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzFdID0gcy0+ZGVjb3JyW2ldLnNhbXBsZXNBWzBdOwogICAgICAgICAgICAgICAgIGogICAgICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTQ4LDcgKzU1NCw3IEBACiAgICAgICAgICAgICBpZiAodHlwZSAhPSBBVl9TQU1QTEVfRk1UX1MxNlApCiAgICAgICAgICAgICAgICAgUyA9IFQgKyAoKHMtPmRlY29ycltpXS53ZWlnaHRBICogKGludDY0X3QpQSArIDUxMikgPj4gMTApOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFMgPSBUICsgKChzLT5kZWNvcnJbaV0ud2VpZ2h0QSAqIEEgKyA1MTIpID4+IDEwKTsKKyAgICAgICAgICAgICAgICBTID0gVCArICh1bnNpZ25lZCkoKGludCkocy0+ZGVjb3JyW2ldLndlaWdodEEgKiAodW5zaWduZWQpQSArIDUxMikgPj4gMTApOwogICAgICAgICAgICAgaWYgKEEgJiYgVCkKICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbaV0ud2VpZ2h0QSAtPSAoKCgoVCBeIEEpID4+IDMwKSAmIDIpIC0gMSkgKiBzLT5kZWNvcnJbaV0uZGVsdGE7CiAgICAgICAgICAgICBzLT5kZWNvcnJbaV0uc2FtcGxlc0Fbal0gPSBUID0gUzsKQEAgLTY4MSw4ICs2ODcsMTEgQEAKICAgICBzLT5oeWJyaWQgICAgICAgICA9ICAgcy0+ZnJhbWVfZmxhZ3MgJiBXVl9IWUJSSURfTU9ERTsKICAgICBzLT5oeWJyaWRfYml0cmF0ZSA9ICAgcy0+ZnJhbWVfZmxhZ3MgJiBXVl9IWUJSSURfQklUUkFURTsKICAgICBzLT5wb3N0X3NoaWZ0ICAgICA9IGJwcCAqIDggLSBvcmlnX2JwcCArICgocy0+ZnJhbWVfZmxhZ3MgPj4gMTMpICYgMHgxZik7CisgICAgaWYgKHMtPnBvc3Rfc2hpZnQgPCAwIHx8IHMtPnBvc3Rfc2hpZnQgPiAzMSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CiAgICAgcy0+aHlicmlkX21heGNsaXAgPSAgKCgxTEwgPDwgKG9yaWdfYnBwIC0gMSkpIC0gMSk7Ci0gICAgcy0+aHlicmlkX21pbmNsaXAgPSAoKC0xTEwgPDwgKG9yaWdfYnBwIC0gMSkpKTsKKyAgICBzLT5oeWJyaWRfbWluY2xpcCA9ICgoLTFVTCA8PCAob3JpZ19icHAgLSAxKSkpOwogICAgIHMtPkNSQyAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiKTsKIAogICAgIC8vIHBhcnNlIG1ldGFkYXRhIGJsb2NrcwpAQCAtNzM2LDEzICs3NDUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3ZWlnaHRzOyBpKyspIHsKICAgICAgICAgICAgICAgICB0ID0gKGludDhfdClieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOwotICAgICAgICAgICAgICAgIHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRBID0gdCA8PCAzOworICAgICAgICAgICAgICAgIHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRBID0gdCAqICgxIDw8IDMpOwogICAgICAgICAgICAgICAgIGlmIChzLT5kZWNvcnJbcy0+dGVybXMgLSBpIC0gMV0ud2VpZ2h0QSA+IDApCiAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRBICs9CiAgICAgICAgICAgICAgICAgICAgICAgICAocy0+ZGVjb3JyW3MtPnRlcm1zIC0gaSAtIDFdLndlaWdodEEgKyA2NCkgPj4gNzsKICAgICAgICAgICAgICAgICBpZiAocy0+c3RlcmVvX2luKSB7CiAgICAgICAgICAgICAgICAgICAgIHQgPSAoaW50OF90KWJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRCID0gdCA8PCAzOworICAgICAgICAgICAgICAgICAgICBzLT5kZWNvcnJbcy0+dGVybXMgLSBpIC0gMV0ud2VpZ2h0QiA9IHQgKiAoMSA8PCAzKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRCID4gMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRCICs9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmRlY29ycltzLT50ZXJtcyAtIGkgLSAxXS53ZWlnaHRCICsgNjQpID4+IDc7CkBAIC04MzcsOSArODQ2LDkgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoJmdiLCB2YWwsIDQpOwotICAgICAgICAgICAgaWYgKHZhbFswXSA+IDMyKSB7CisgICAgICAgICAgICBpZiAodmFsWzBdID4gMzApIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSU5UMzJJTkZPLCBleHRyYV9iaXRzID0gJWQgKD4gMzIpXG4iLCB2YWxbMF0pOworICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBJTlQzMklORk8sIGV4dHJhX2JpdHMgPSAlZCAoPiAzMClcbiIsIHZhbFswXSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbFswXSkgewogICAgICAgICAgICAgICAgIHMtPmV4dHJhX2JpdHMgPSB2YWxbMF07CkBAIC04NTIsNiArODYxLDEyIEBACiAgICAgICAgICAgICAgICAgcy0+YW5kICAgPSAxOwogICAgICAgICAgICAgICAgIHMtPnNoaWZ0ID0gdmFsWzNdOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPnNoaWZ0ID4gMzEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSU5UMzJJTkZPLCBzaGlmdCA9ICVkICg+IDMxKVxuIiwgcy0+c2hpZnQpOworICAgICAgICAgICAgICAgIHMtPmFuZCA9IHMtPm9yID0gcy0+c2hpZnQgPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogb3JpZ2luYWwgV2F2UGFjayBkZWNvZGVyIGZvcmNlcyAzMi1iaXQgbG9zc3kgc291bmQgdG8gYmUgdHJlYXRlZAogICAgICAgICAgICAgICogYXMgMjQtYml0IG9uZSBpbiBvcmRlciB0byBoYXZlIHByb3BlciBjbGlwcGluZyAqLwogICAgICAgICAgICAgaWYgKHMtPmh5YnJpZCAmJiBicHAgPT0gNCAmJiBzLT5wb3N0X3NoaWZ0IDwgOCAmJiBzLT5zaGlmdCA+IDgpIHsKQEAgLTg3Miw2ICs4ODcsMTIgQEAKICAgICAgICAgICAgIHMtPmZsb2F0X2ZsYWcgICAgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOwogICAgICAgICAgICAgcy0+ZmxvYXRfc2hpZnQgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CiAgICAgICAgICAgICBzLT5mbG9hdF9tYXhfZXhwID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKKyAgICAgICAgICAgIGlmIChzLT5mbG9hdF9zaGlmdCA+IDMxKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEZMT0FUSU5GTywgc2hpZnQgPSAlZCAoPiAzMSlcbiIsIHMtPmZsb2F0X3NoaWZ0KTsKKyAgICAgICAgICAgICAgICBzLT5mbG9hdF9zaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBnb3RfZmxvYXQgICAgICAgID0gMTsKICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAxKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTAxNiw3ICsxMDM3LDcgQEAKIAogICAgIGlmICh3Yy0+Y2hfb2Zmc2V0ICsgcy0+c3RlcmVvID49IGF2Y3R4LT5jaGFubmVscykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVG9vIG1hbnkgY2hhbm5lbHMgY29kZWQgaW4gYSBwYWNrZXQuXG4iKTsKLSAgICAgICAgcmV0dXJuIChhdmN0eC0+ZXJyX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkgPyBBVkVSUk9SX0lOVkFMSUREQVRBIDogMDsKKyAgICAgICAgcmV0dXJuICgoYXZjdHgtPmVycl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHx8ICF3Yy0+Y2hfb2Zmc2V0KSA/IEFWRVJST1JfSU5WQUxJRERBVEEgOiAwOwogICAgIH0KIAogICAgIHNhbXBsZXNfbCA9IGZyYW1lLT5leHRlbmRlZF9kYXRhW3djLT5jaF9vZmZzZXRdOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy93YXZwYWNrLmggYi9saWJhdmNvZGVjL3dhdnBhY2suaAppbmRleCBhMWI0NmQ1Li42Y2FhZDAzIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3dhdnBhY2suaAorKysgYi9saWJhdmNvZGVjL3dhdnBhY2suaApAQCAtOTQsMTMgKzk0LDEzIEBACiB0eXBlZGVmIHN0cnVjdCBXdkNoYW5uZWwgewogICAgIGludCBtZWRpYW5bM107CiAgICAgaW50IHNsb3dfbGV2ZWwsIGVycm9yX2xpbWl0OwotICAgIGludCBiaXRyYXRlX2FjYywgYml0cmF0ZV9kZWx0YTsKKyAgICB1bnNpZ25lZCBiaXRyYXRlX2FjYywgYml0cmF0ZV9kZWx0YTsKIH0gV3ZDaGFubmVsOwogCiAvLyBtYWNyb3MgZm9yIG1hbmlwdWxhdGluZyBtZWRpYW4gdmFsdWVzCiAjZGVmaW5lIEdFVF9NRUQobikgKChjLT5tZWRpYW5bbl0gPj4gNCkgKyAxKQotI2RlZmluZSBERUNfTUVEKG4pIGMtPm1lZGlhbltuXSAtPSAoKGMtPm1lZGlhbltuXSArICgxMjggPj4gKG4pKSAtIDIpIC8gKDEyOCA+PiAobikpKSAqIDIKLSNkZWZpbmUgSU5DX01FRChuKSBjLT5tZWRpYW5bbl0gKz0gKChjLT5tZWRpYW5bbl0gKyAoMTI4ID4+IChuKSkgICAgKSAvICgxMjggPj4gKG4pKSkgKiA1CisjZGVmaW5lIERFQ19NRUQobikgYy0+bWVkaWFuW25dIC09ICgoaW50KShjLT5tZWRpYW5bbl0gKyAoMTI4VSA+PiAobikpIC0gMikgLyAoMTI4ID4+IChuKSkpICogMlUKKyNkZWZpbmUgSU5DX01FRChuKSBjLT5tZWRpYW5bbl0gKz0gKChpbnQpKGMtPm1lZGlhbltuXSArICgxMjhVID4+IChuKSkgICAgKSAvICgxMjggPj4gKG4pKSkgKiA1VQogCiAvLyBtYWNyb3MgZm9yIGFwcGx5aW5nIHdlaWdodAogI2RlZmluZSBVUERBVEVfV0VJR0hUX0NMSVAod2VpZ2h0LCBkZWx0YSwgc2FtcGxlcywgaW4pIFwKQEAgLTE3MSwxMSArMTcxLDEzIEBACiAKICAgICByZXMgICA9IHdwX2V4cDJfdGFibGVbdmFsICYgMHhGRl0gfCAweDEwMDsKICAgICB2YWwgPj49IDg7CisgICAgaWYgKHZhbCA+IDMxVSkKKyAgICAgICAgcmV0dXJuIElOVF9NSU47CiAgICAgcmVzICAgPSAodmFsID4gOSkgPyAocmVzIDw8ICh2YWwgLSA5KSkgOiAocmVzID4+ICg5IC0gdmFsKSk7CiAgICAgcmV0dXJuIG5lZyA/IC1yZXMgOiByZXM7CiB9CiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB3cF9sb2cyKGludDMyX3QgdmFsKQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IHdwX2xvZzIodWludDMyX3QgdmFsKQogewogICAgIGludCBiaXRzOwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dlYnAuYyBiL2xpYmF2Y29kZWMvd2VicC5jCmluZGV4IDVjMjk2MWYuLjA3N2JiMDYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvd2VicC5jCisrKyBiL2xpYmF2Y29kZWMvd2VicC5jCkBAIC0zMywyMCArMzMsMjEgQEAKICAqCiAgKiBAYXV0aG9yIEphbWVzIEFsbWVyIDxqYW1yaWFsQGdtYWlsLmNvbT4KICAqIEV4aWYgbWV0YWRhdGEKKyAqIElDQyBwcm9maWxlCiAgKgogICogVW5pbXBsZW1lbnRlZDoKICAqICAgLSBBbmltYXRpb24KLSAqICAgLSBJQ0MgcHJvZmlsZQogICogICAtIFhNUCBtZXRhZGF0YQogICovCiAKLSNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCisjZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgImV4aWYuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImdldF9iaXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ0aHJlYWQuaCIKICNpbmNsdWRlICJ2cDguaCIKIApAQCAtMTk2LDcgKzE5Nyw3IEBACiAgICAgdWludDhfdCAqYWxwaGFfZGF0YTsgICAgICAgICAgICAgICAgLyogYWxwaGEgY2h1bmsgZGF0YSAqLwogICAgIGludCBhbHBoYV9kYXRhX3NpemU7ICAgICAgICAgICAgICAgIC8qIGFscGhhIGNodW5rIGRhdGEgc2l6ZSAqLwogICAgIGludCBoYXNfZXhpZjsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBhZnRlciBhbiBFWElGIGNodW5rIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwotICAgIEFWRGljdGlvbmFyeSAqZXhpZl9tZXRhZGF0YTsgICAgICAgIC8qIEVYSUYgY2h1bmsgZGF0YSAqLworICAgIGludCBoYXNfaWNjcDsgICAgICAgICAgICAgICAgICAgICAgIC8qIHNldCBhZnRlciBhbiBJQ0NQIGNodW5rIGhhcyBiZWVuIHByb2Nlc3NlZCAqLwogICAgIGludCB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGltYWdlIHdpZHRoICovCiAgICAgaW50IGhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2UgaGVpZ2h0ICovCiAgICAgaW50IGxvc3NsZXNzOyAgICAgICAgICAgICAgICAgICAgICAgLyogaW5kaWNhdGVzIGxvc3NsZXNzIG9yIGxvc3N5ICovCkBAIC02OTQsNyArNjk1LDcgQEAKICAgICAgICAgICAgICAgICBsZW5ndGggPSBvZmZzZXQgKyBnZXRfYml0cygmcy0+Z2IsIGV4dHJhX2JpdHMpICsgMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHByZWZpeF9jb2RlID0gaHVmZl9yZWFkZXJfZ2V0X3N5bWJvbCgmaGdbSFVGRl9JRFhfRElTVF0sICZzLT5nYik7Ci0gICAgICAgICAgICBpZiAocHJlZml4X2NvZGUgPiAzOSkgeworICAgICAgICAgICAgaWYgKHByZWZpeF9jb2RlID4gMzlVKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJkaXN0YW5jZSBwcmVmaXggY29kZSB0b28gbGFyZ2U6ICVkXG4iLCBwcmVmaXhfY29kZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC0xMDQzLDcgKzEwNDQsNyBAQAogICAgICAgICB1aW50OF90ICpsaW5lOwogICAgICAgICBpbnQgcGl4ZWxfYml0cyA9IDggPj4gcGFsLT5zaXplX3JlZHVjdGlvbjsKIAotICAgICAgICBsaW5lID0gYXZfbWFsbG9jKGltZy0+ZnJhbWUtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgbGluZSA9IGF2X21hbGxvYyhpbWctPmZyYW1lLT5saW5lc2l6ZVswXSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgICAgICBpZiAoIWxpbmUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCkBAIC0xMDk5LDYgKzExMDAsMjEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgdXBkYXRlX2NhbnZhc19zaXplKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgaW50IHcsIGludCBoKQoreworICAgIFdlYlBDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpZiAocy0+d2lkdGggJiYgcy0+d2lkdGggIT0gdykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiV2lkdGggbWlzbWF0Y2guICVkICE9ICVkXG4iLAorICAgICAgICAgICAgICAgcy0+d2lkdGgsIHcpOworICAgIH0KKyAgICBzLT53aWR0aCA9IHc7CisgICAgaWYgKHMtPmhlaWdodCAmJiBzLT5oZWlnaHQgIT0gaCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSGVpZ2h0IG1pc21hdGNoLiAlZCAhPSAlZFxuIiwKKyAgICAgICAgICAgICAgIHMtPmhlaWdodCwgaCk7CisgICAgfQorICAgIHMtPmhlaWdodCA9IGg7Cit9CisKIHN0YXRpYyBpbnQgdnA4X2xvc3NsZXNzX2RlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWUsIHVpbnQ4X3QgKmRhdGFfc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGFfc2l6ZSwgaW50IGlzX2FscGhhX2NodW5rKQpAQCAtMTEyMywxNiArMTEzOSw4IEBACiAKICAgICAgICAgdyA9IGdldF9iaXRzKCZzLT5nYiwgMTQpICsgMTsKICAgICAgICAgaCA9IGdldF9iaXRzKCZzLT5nYiwgMTQpICsgMTsKLSAgICAgICAgaWYgKHMtPndpZHRoICYmIHMtPndpZHRoICE9IHcpIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJXaWR0aCBtaXNtYXRjaC4gJWQgIT0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgcy0+d2lkdGgsIHcpOwotICAgICAgICB9Ci0gICAgICAgIHMtPndpZHRoID0gdzsKLSAgICAgICAgaWYgKHMtPmhlaWdodCAmJiBzLT5oZWlnaHQgIT0gaCkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkhlaWdodCBtaXNtYXRjaC4gJWQgIT0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgcy0+d2lkdGgsIHcpOwotICAgICAgICB9Ci0gICAgICAgIHMtPmhlaWdodCA9IGg7CisKKyAgICAgICAgdXBkYXRlX2NhbnZhc19zaXplKGF2Y3R4LCB3LCBoKTsKIAogICAgICAgICByZXQgPSBmZl9zZXRfZGltZW5zaW9ucyhhdmN0eCwgcy0+d2lkdGgsIHMtPmhlaWdodCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtMTMyNyw5ICsxMzM1LDkgQEAKICAgICBpZiAoIXMtPmluaXRpYWxpemVkKSB7CiAgICAgICAgIGZmX3ZwOF9kZWNvZGVfaW5pdChhdmN0eCk7CiAgICAgICAgIHMtPmluaXRpYWxpemVkID0gMTsKLSAgICAgICAgaWYgKHMtPmhhc19hbHBoYSkKLSAgICAgICAgICAgIGF2Y3R4LT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVZBNDIwUDsKKyAgICAgICAgcy0+di5hY3R1YWxseV93ZWJwID0gMTsKICAgICB9CisgICAgYXZjdHgtPnBpeF9mbXQgPSBzLT5oYXNfYWxwaGEgPyBBVl9QSVhfRk1UX1lVVkE0MjBQIDogQVZfUElYX0ZNVF9ZVVY0MjBQOwogICAgIHMtPmxvc3NsZXNzID0gMDsKIAogICAgIGlmIChkYXRhX3NpemUgPiBJTlRfTUFYKSB7CkBAIC0xMzQyLDYgKzEzNTAsMTQgQEAKICAgICBwa3Quc2l6ZSA9IGRhdGFfc2l6ZTsKIAogICAgIHJldCA9IGZmX3ZwOF9kZWNvZGVfZnJhbWUoYXZjdHgsIHAsIGdvdF9mcmFtZSwgJnBrdCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoISpnb3RfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgdXBkYXRlX2NhbnZhc19zaXplKGF2Y3R4LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworCiAgICAgaWYgKHMtPmhhc19hbHBoYSkgewogICAgICAgICByZXQgPSB2cDhfbG9zc3lfZGVjb2RlX2FscGhhKGF2Y3R4LCBwLCBzLT5hbHBoYV9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmFscGhhX2RhdGFfc2l6ZSk7CkBAIC0xMzY3LDYgKzEzODMsNyBAQAogICAgICpnb3RfZnJhbWUgICA9IDA7CiAgICAgcy0+aGFzX2FscGhhID0gMDsKICAgICBzLT5oYXNfZXhpZiAgPSAwOworICAgIHMtPmhhc19pY2NwICA9IDA7CiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2IsIGF2cGt0LT5kYXRhLCBhdnBrdC0+c2l6ZSk7CiAKICAgICBpZiAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8IDEyKQpAQCAtMTM4Niw3ICsxNDAzLDYgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgYXZfZGljdF9mcmVlKCZzLT5leGlmX21ldGFkYXRhKTsKICAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDgpIHsKICAgICAgICAgY2hhciBjaHVua19zdHJbNV0gPSB7IDAgfTsKIApAQCAtMTQyMiw2ICsxNDM4LDEwIEBACiAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgY2h1bmtfc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNS1RBRygnVicsICdQJywgJzgnLCAnWCcpOgorICAgICAgICAgICAgaWYgKHMtPndpZHRoIHx8IHMtPmhlaWdodCB8fCAqZ290X2ZyYW1lKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDYW52YXMgZGltZW5zaW9ucyBhcmUgYWxyZWFkeSBzZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdnA4eF9mbGFncyA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CiAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgMyk7CiAgICAgICAgICAgICBzLT53aWR0aCAgPSBieXRlc3RyZWFtMl9nZXRfbGUyNCgmZ2IpICsgMTsKQEAgLTE0NjMsNiArMTQ4Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgY2FzZSBNS1RBRygnRScsICdYJywgJ0knLCAnRicpOiB7CiAgICAgICAgICAgICBpbnQgbGUsIGlmZF9vZmZzZXQsIGV4aWZfb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpleGlmX21ldGFkYXRhID0gTlVMTDsKICAgICAgICAgICAgIEdldEJ5dGVDb250ZXh0IGV4aWZfZ2I7CiAKICAgICAgICAgICAgIGlmIChzLT5oYXNfZXhpZikgewpAQCAtMTQ4NCwyNCArMTUwNSw0NCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBieXRlc3RyZWFtMl9zZWVrKCZleGlmX2diLCBpZmRfb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICBpZiAoYXZwcml2X2V4aWZfZGVjb2RlX2lmZChhdmN0eCwgJmV4aWZfZ2IsIGxlLCAwLCAmcy0+ZXhpZl9tZXRhZGF0YSkgPCAwKSB7CisgICAgICAgICAgICBpZiAoZmZfZXhpZl9kZWNvZGVfaWZkKGF2Y3R4LCAmZXhpZl9nYiwgbGUsIDAsICZleGlmX21ldGFkYXRhKSA8IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImVycm9yIGRlY29kaW5nIEV4aWYgZGF0YVxuIik7CiAgICAgICAgICAgICAgICAgZ290byBleGlmX2VuZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYXZfZGljdF9jb3B5KGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGRhdGEpLCBzLT5leGlmX21ldGFkYXRhLCAwKTsKKyAgICAgICAgICAgIGF2X2RpY3RfY29weSgmKChBVkZyYW1lICopIGRhdGEpLT5tZXRhZGF0YSwgZXhpZl9tZXRhZGF0YSwgMCk7CiAKIGV4aWZfZW5kOgotICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZzLT5leGlmX21ldGFkYXRhKTsKKyAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmZXhpZl9tZXRhZGF0YSk7CiAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgY2h1bmtfc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIE1LVEFHKCdJJywgJ0MnLCAnQycsICdQJyk6CisgICAgICAgIGNhc2UgTUtUQUcoJ0knLCAnQycsICdDJywgJ1AnKTogeworICAgICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZDsKKworICAgICAgICAgICAgaWYgKHMtPmhhc19pY2NwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIklnbm9yaW5nIGV4dHJhIElDQ1AgY2h1bmtcbiIpOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBjaHVua19zaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKHZwOHhfZmxhZ3MgJiBWUDhYX0ZMQUdfSUNDKSkKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiSUNDUCBjaHVuayBwcmVzZW50LCBidXQgSUNDIFByb2ZpbGUgYml0IG5vdCBzZXQgaW4gdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlZQOFggaGVhZGVyXG4iKTsKKworICAgICAgICAgICAgcy0+aGFzX2ljY3AgPSAxOworICAgICAgICAgICAgc2QgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKHAsIEFWX0ZSQU1FX0RBVEFfSUNDX1BST0ZJTEUsIGNodW5rX3NpemUpOworICAgICAgICAgICAgaWYgKCFzZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICBieXRlc3RyZWFtMl9nZXRfYnVmZmVyKCZnYiwgc2QtPmRhdGEsIGNodW5rX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBNS1RBRygnQScsICdOJywgJ0knLCAnTScpOgogICAgICAgICBjYXNlIE1LVEFHKCdBJywgJ04nLCAnTScsICdGJyk6CiAgICAgICAgIGNhc2UgTUtUQUcoJ1gnLCAnTScsICdQJywgJyAnKToKICAgICAgICAgICAgIEFWX1dMMzIoY2h1bmtfc3RyLCBjaHVua190eXBlKTsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJza2lwcGluZyB1bnN1cHBvcnRlZCBjaHVuazogJXNcbiIsCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAic2tpcHBpbmcgdW5zdXBwb3J0ZWQgY2h1bms6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIGNodW5rX3N0cik7CiAgICAgICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZnYiwgY2h1bmtfc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvd2VidnR0ZGVjLmMgYi9saWJhdmNvZGVjL3dlYnZ0dGRlYy5jCmluZGV4IDczNTQ1ODguLjdiMmQxNzUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvd2VidnR0ZGVjLmMKKysrIGIvbGliYXZjb2RlYy93ZWJ2dHRkZWMuYwpAQCAtODUsMTUgKzg1LDEyIEBACiAgICAgaW50IHJldCA9IDA7CiAgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKICAgICBjb25zdCBjaGFyICpwdHIgPSBhdnBrdC0+ZGF0YTsKKyAgICBGRkFTU0RlY29kZXJDb250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBBVkJQcmludCBidWY7CiAKICAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwotICAgIGlmIChwdHIgJiYgYXZwa3QtPnNpemUgPiAwICYmICF3ZWJ2dHRfZXZlbnRfdG9fYXNzKCZidWYsIHB0cikpIHsKLSAgICAgICAgaW50IHRzX3N0YXJ0ICAgICA9IGF2X3Jlc2NhbGVfcShhdnBrdC0+cHRzLCBhdmN0eC0+dGltZV9iYXNlLCAoQVZSYXRpb25hbCl7MSwxMDB9KTsKLSAgICAgICAgaW50IHRzX2R1cmF0aW9uICA9IGF2cGt0LT5kdXJhdGlvbiAhPSAtMSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EoYXZwa3QtPmR1cmF0aW9uLCBhdmN0eC0+dGltZV9iYXNlLCAoQVZSYXRpb25hbCl7MSwxMDB9KSA6IC0xOwotICAgICAgICByZXQgPSBmZl9hc3NfYWRkX3JlY3RfYnByaW50KHN1YiwgJmJ1ZiwgdHNfc3RhcnQsIHRzX2R1cmF0aW9uKTsKLSAgICB9CisgICAgaWYgKHB0ciAmJiBhdnBrdC0+c2l6ZSA+IDAgJiYgIXdlYnZ0dF9ldmVudF90b19hc3MoJmJ1ZiwgcHRyKSkKKyAgICAgICAgcmV0ID0gZmZfYXNzX2FkZF9yZWN0KHN1YiwgYnVmLnN0ciwgcy0+cmVhZG9yZGVyKyssIDAsIE5VTEwsIE5VTEwpOwogICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCBOVUxMKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTEwOCw0ICsxMDUsNiBAQAogICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1dFQlZUVCwKICAgICAuZGVjb2RlICAgICAgICAgPSB3ZWJ2dHRfZGVjb2RlX2ZyYW1lLAogICAgIC5pbml0ICAgICAgICAgICA9IGZmX2Fzc19zdWJ0aXRsZV9oZWFkZXJfZGVmYXVsdCwKKyAgICAuZmx1c2ggICAgICAgICAgPSBmZl9hc3NfZGVjb2Rlcl9mbHVzaCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRkZBU1NEZWNvZGVyQ29udGV4dCksCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy93ZWJ2dHRlbmMuYyBiL2xpYmF2Y29kZWMvd2VidnR0ZW5jLmMKaW5kZXggOWY2N2EyZS4uYzg0YmJmNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy93ZWJ2dHRlbmMuYworKysgYi9saWJhdmNvZGVjL3dlYnZ0dGVuYy5jCkBAIC0xNTksMjEgKzE1OSwzOCBAQAogewogICAgIFdlYlZUVENvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIEFTU0RpYWxvZyAqZGlhbG9nOwotICAgIGludCBpLCBudW07CisgICAgaW50IGk7CiAKICAgICBhdl9icHJpbnRfY2xlYXIoJnMtPmJ1ZmZlcik7CiAKICAgICBmb3IgKGk9MDsgaTxzdWItPm51bV9yZWN0czsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFzcyA9IHN1Yi0+cmVjdHNbaV0tPmFzczsKKwogICAgICAgICBpZiAoc3ViLT5yZWN0c1tpXS0+dHlwZSAhPSBTVUJUSVRMRV9BU1MpIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBTVUJUSVRMRV9BU1MgdHlwZSBzdXBwb3J0ZWQuXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgICAgIH0KIAotICAgICAgICBkaWFsb2cgPSBmZl9hc3Nfc3BsaXRfZGlhbG9nKHMtPmFzc19jdHgsIHN1Yi0+cmVjdHNbaV0tPmFzcywgMCwgJm51bSk7CisjaWYgRkZfQVBJX0FTU19USU1JTkcKKyAgICAgICAgaWYgKCFzdHJuY21wKGFzcywgIkRpYWxvZ3VlOiAiLCAxMCkpIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBkaWFsb2cgPSBmZl9hc3Nfc3BsaXRfZGlhbG9nKHMtPmFzc19jdHgsIGFzcywgMCwgJm51bSk7CisgICAgICAgICAgICAvLyBUT0RPIHJlaW5kZW50CiAgICAgICAgIGZvciAoOyBkaWFsb2cgJiYgbnVtLS07IGRpYWxvZysrKSB7CiAgICAgICAgICAgICB3ZWJ2dHRfc3R5bGVfYXBwbHkocywgZGlhbG9nLT5zdHlsZSk7CiAgICAgICAgICAgICBmZl9hc3Nfc3BsaXRfb3ZlcnJpZGVfY29kZXMoJndlYnZ0dF9jYWxsYmFja3MsIHMsIGRpYWxvZy0+dGV4dCk7CiAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyNlbmRpZgorICAgICAgICAgICAgZGlhbG9nID0gZmZfYXNzX3NwbGl0X2RpYWxvZzIocy0+YXNzX2N0eCwgYXNzKTsKKyAgICAgICAgICAgIGlmICghZGlhbG9nKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB3ZWJ2dHRfc3R5bGVfYXBwbHkocywgZGlhbG9nLT5zdHlsZSk7CisgICAgICAgICAgICBmZl9hc3Nfc3BsaXRfb3ZlcnJpZGVfY29kZXMoJndlYnZ0dF9jYWxsYmFja3MsIHMsIGRpYWxvZy0+dGV4dCk7CisgICAgICAgICAgICBmZl9hc3NfZnJlZV9kaWFsb2coJmRpYWxvZyk7CisjaWYgRkZfQVBJX0FTU19USU1JTkcKKyAgICAgICAgfQorI2VuZGlmCiAgICAgfQogCiAgICAgaWYgKCFhdl9icHJpbnRfaXNfY29tcGxldGUoJnMtPmJ1ZmZlcikpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dtYS5jIGIvbGliYXZjb2RlYy93bWEuYwppbmRleCA2ZDFjN2U1Li5iNDk5MjA5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3dtYS5jCisrKyBiL2xpYmF2Y29kZWMvd21hLmMKQEAgLTE4Niw3ICsxODYsNyBAQAogICAgIH0KICAgICBmZl9kbG9nKHMtPmF2Y3R4LCAiZmxhZ3MyPTB4JXhcbiIsIGZsYWdzMik7CiAgICAgZmZfZGxvZyhzLT5hdmN0eCwgInZlcnNpb249JWQgY2hhbm5lbHM9JWQgc2FtcGxlX3JhdGU9JWQgYml0cmF0ZT0lIlBSSWQ2NCIgYmxvY2tfYWxpZ249JWRcbiIsCi0gICAgICAgICAgICBzLT52ZXJzaW9uLCBhdmN0eC0+Y2hhbm5lbHMsIGF2Y3R4LT5zYW1wbGVfcmF0ZSwgKGludDY0X3QpYXZjdHgtPmJpdF9yYXRlLAorICAgICAgICAgICAgcy0+dmVyc2lvbiwgYXZjdHgtPmNoYW5uZWxzLCBhdmN0eC0+c2FtcGxlX3JhdGUsIGF2Y3R4LT5iaXRfcmF0ZSwKICAgICAgICAgICAgIGF2Y3R4LT5ibG9ja19hbGlnbik7CiAgICAgZmZfZGxvZyhzLT5hdmN0eCwgImJwcz0lZiBicHMxPSVmIGhpZ2hfZnJlcT0lZiBiaXRvZmZzZXQ9JWRcbiIsCiAgICAgICAgICAgICBicHMsIGJwczEsIGhpZ2hfZnJlcSwgcy0+Ynl0ZV9vZmZzZXRfYml0cyk7CkBAIC0yNzksMTYgKzI3OSw2IEBACiAgICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X2hpZ2hfYmFuZHNba11baisrXSA9IGVuZCAtIHN0YXJ0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcy0+ZXhwb25lbnRfaGlnaF9zaXplc1trXSA9IGo7Ci0jaWYgMAotICAgICAgICAgICAgZmZfdGxvZyhzLT5hdmN0eCwgIiU1ZDogY29lZnNfZW5kPSVkIGhpZ2hfYmFuZF9zdGFydD0lZCBuYl9oaWdoX2JhbmRzPSVkOiAiLAotICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZV9sZW4gPj4gaywKLSAgICAgICAgICAgICAgICAgICAgcy0+Y29lZnNfZW5kW2tdLAotICAgICAgICAgICAgICAgICAgICBzLT5oaWdoX2JhbmRfc3RhcnRba10sCi0gICAgICAgICAgICAgICAgICAgIHMtPmV4cG9uZW50X2hpZ2hfc2l6ZXNba10pOwotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmV4cG9uZW50X2hpZ2hfc2l6ZXNba107IGorKykKLSAgICAgICAgICAgICAgICBmZl90bG9nKHMtPmF2Y3R4LCAiICVkIiwgcy0+ZXhwb25lbnRfaGlnaF9iYW5kc1trXVtqXSk7Ci0gICAgICAgICAgICBmZl90bG9nKHMtPmF2Y3R4LCAiXG4iKTsKLSNlbmRpZiAvKiAwICovCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQyOSw3ICs0MTksNyBAQAogICogQHBhcmFtIHZlcnNpb24gMCBmb3Igd21hMSwyIDEgZm9yIHdtYXBybwogICogQHBhcmFtIHB0ciBvdXRwdXQgYnVmZmVyCiAgKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotICogQHBhcmFtIG51bV9jb2VmcyBudW1iZXIgb2YgaW5wdXQgY29lZmZpY2VudHMKKyAqIEBwYXJhbSBudW1fY29lZnMgbnVtYmVyIG9mIGlucHV0IGNvZWZmaWNpZW50cwogICogQHBhcmFtIGJsb2NrX2xlbiBpbnB1dCBidWZmZXIgbGVuZ3RoICgyXm4pCiAgKiBAcGFyYW0gZnJhbWVfbGVuX2JpdHMgbnVtYmVyIG9mIGJpdHMgZm9yIGVzY2FwZWQgcnVuIGNvZGVzCiAgKiBAcGFyYW0gY29lZl9uYl9iaXRzIG51bWJlciBvZiBiaXRzIGZvciBlc2NhcGVkIGxldmVsIGNvZGVzCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dtYWRlYy5jIGIvbGliYXZjb2RlYy93bWFkZWMuYwppbmRleCAxYTg0MzIzLi43OGI1MWU1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3dtYWRlYy5jCisrKyBiL2xpYmF2Y29kZWMvd21hZGVjLmMKQEAgLTM0LDggKzM0LDcgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZm1hdGguaCIKIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtODEsNyArODAsNyBAQAogCiAgICAgcy0+YXZjdHggPSBhdmN0eDsKIAotICAgIC8qIGV4dHJhY3QgZmxhZyBpbmZvcyAqLworICAgIC8qIGV4dHJhY3QgZmxhZyBpbmZvICovCiAgICAgZmxhZ3MyICAgID0gMDsKICAgICBleHRyYWRhdGEgPSBhdmN0eC0+ZXh0cmFkYXRhOwogICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1dNQVYxICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSA0KQpAQCAtMzUwLDcgKzM0OSw3IEBACiAgICAgICAgICAgICBhdl9sb2cocy0+YXZjdHgsIEFWX0xPR19FUlJPUiwgIkV4cG9uZW50IHZsYyBpbnZhbGlkXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgICAgICAvKiBOT1RFOiB0aGlzIG9mZnNldCBpcyB0aGUgc2FtZSBhcyBNUEVHNCBBQUMgISAqLworICAgICAgICAvKiBOT1RFOiB0aGlzIG9mZnNldCBpcyB0aGUgc2FtZSBhcyBNUEVHLTQgQUFDISAqLwogICAgICAgICBsYXN0X2V4cCArPSBjb2RlIC0gNjA7CiAgICAgICAgIGlmICgodW5zaWduZWQpIGxhc3RfZXhwICsgNjAgPj0gRkZfQVJSQVlfRUxFTVMocG93X3RhYikpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXhwb25lbnQgb3V0IG9mIHJhbmdlOiAlZFxuIiwKQEAgLTQyNyw3ICs0MjYsNyBAQAogCiAvKioKICAqIEByZXR1cm4gMCBpZiBPSy4gMSBpZiBsYXN0IGJsb2NrIG9mIGZyYW1lLiByZXR1cm4gLTEgaWYKLSAqIHVucmVjb3JyYWJsZSBlcnJvci4KKyAqIHVucmVjb3ZlcmFibGUgZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQgd21hX2RlY29kZV9ibG9jayhXTUFDb2RlY0NvbnRleHQgKnMpCiB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dtYWVuYy5jIGIvbGliYXZjb2RlYy93bWFlbmMuYwppbmRleCBkMDcyN2U2Li4wOTFiYzJhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3dtYWVuYy5jCisrKyBiL2xpYmF2Y29kZWMvd21hZW5jLmMKQEAgLTIwLDcgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmZtYXRoLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTUzLDExICs1MywxMSBAQAogICAgIGlmIChhdmN0eC0+Yml0X3JhdGUgPCAyNCAqIDEwMDApIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiYml0cmF0ZSB0b28gbG93OiBnb3QgJSJQUklkNjQiLCBuZWVkIDI0MDAwIG9yIGhpZ2hlclxuIiwKLSAgICAgICAgICAgICAgIChpbnQ2NF90KWF2Y3R4LT5iaXRfcmF0ZSk7CisgICAgICAgICAgICAgICBhdmN0eC0+Yml0X3JhdGUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIC8qIGV4dHJhY3QgZmxhZyBpbmZvcyAqLworICAgIC8qIGV4dHJhY3QgZmxhZyBpbmZvICovCiAgICAgZmxhZ3MxID0gMDsKICAgICBmbGFnczIgPSAxOwogICAgIGlmIChhdmN0eC0+Y29kZWMtPmlkID09IEFWX0NPREVDX0lEX1dNQVYxKSB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dtYWxvc3NsZXNzZGVjLmMgYi9saWJhdmNvZGVjL3dtYWxvc3NsZXNzZGVjLmMKaW5kZXggOGE1ZmZiOC4uZWIxZGI2MSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy93bWFsb3NzbGVzc2RlYy5jCisrKyBiL2xpYmF2Y29kZWMvd21hbG9zc2xlc3NkZWMuYwpAQCAtNzIsNyArNzIsOCBAQAogICAgIEFWQ29kZWNDb250ZXh0ICAqYXZjdHg7CiAgICAgQVZGcmFtZSAgICAgICAgICpmcmFtZTsKICAgICBMTEF1ZERTUENvbnRleHQgZHNwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYWNjZWxlcmF0ZWQgRFNQIGZ1bmN0aW9ucwotICAgIHVpbnQ4X3QgICAgICAgICBmcmFtZV9kYXRhW01BWF9GUkFNRVNJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXTsgIC8vLzwgY29tcHJlc3NlZCBmcmFtZSBkYXRhCisgICAgdWludDhfdCAgICAgICAgICpmcmFtZV9kYXRhOyAgICAgICAgICAgICAgICAgICAgLy8vPCBjb21wcmVzc2VkIGZyYW1lIGRhdGEKKyAgICBpbnQgICAgICAgICAgICAgbWF4X2ZyYW1lX3NpemU7ICAgICAgICAgICAgICAgICAvLy88IG1heCBiaXRzdHJlYW0gc2l6ZQogICAgIFB1dEJpdENvbnRleHQgICBwYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY29udGV4dCBmb3IgZmlsbGluZyB0aGUgZnJhbWVfZGF0YSBidWZmZXIKIAogICAgIC8qIGZyYW1lIHNpemUgZGVwZW5kZW50IGZyYW1lIGluZm9ybWF0aW9uIChzZXQgZHVyaW5nIGluaXRpYWxpemF0aW9uKSAqLwpAQCAtMTA0LDggKzEwNSw4IEBACiAgICAgdWludDMyX3QgICAgICAgIGZyYW1lX251bTsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGZyYW1lIG51bWJlciAobm90IHVzZWQgZm9yIGRlY29kaW5nKQogICAgIEdldEJpdENvbnRleHQgICBnYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgYml0c3RyZWFtIHJlYWRlciBjb250ZXh0CiAgICAgaW50ICAgICAgICAgICAgIGJ1Zl9iaXRfc2l6ZTsgICAgICAgICAgICAgICAgICAgLy8vPCBidWZmZXIgc2l6ZSBpbiBiaXRzCi0gICAgaW50MTZfdCAgICAgICAgICpzYW1wbGVzXzE2W1dNQUxMX01BWF9DSEFOTkVMU107IC8vLzwgY3VycmVudCBzYW1wbGVidWZmZXIgcG9pbnRlciAoMTYtYml0KQotICAgIGludDMyX3QgICAgICAgICAqc2FtcGxlc18zMltXTUFMTF9NQVhfQ0hBTk5FTFNdOyAvLy88IGN1cnJlbnQgc2FtcGxlYnVmZmVyIHBvaW50ZXIgKDI0LWJpdCkKKyAgICBpbnQxNl90ICAgICAgICAgKnNhbXBsZXNfMTZbV01BTExfTUFYX0NIQU5ORUxTXTsgLy8vPCBjdXJyZW50IHNhbXBsZSBidWZmZXIgcG9pbnRlciAoMTYtYml0KQorICAgIGludDMyX3QgICAgICAgICAqc2FtcGxlc18zMltXTUFMTF9NQVhfQ0hBTk5FTFNdOyAvLy88IGN1cnJlbnQgc2FtcGxlIGJ1ZmZlciBwb2ludGVyICgyNC1iaXQpCiAgICAgdWludDhfdCAgICAgICAgIGRyY19nYWluOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBnYWluIGZvciB0aGUgRFJDIHRvb2wKICAgICBpbnQ4X3QgICAgICAgICAgc2tpcF9mcmFtZTsgICAgICAgICAgICAgICAgICAgICAvLy88IHNraXAgb3V0cHV0IHN0ZXAKICAgICBpbnQ4X3QgICAgICAgICAgcGFyc2VkX2FsbF9zdWJmcmFtZXM7ICAgICAgICAgICAvLy88IGFsbCBzdWJmcmFtZXMgZGVjb2RlZD8KQEAgLTEzNCw4ICsxMzUsOCBAQAogICAgIGludDhfdCAgbWNsbXNfc2NhbGluZzsKICAgICBpbnQxNl90IG1jbG1zX2NvZWZmc1tXTUFMTF9NQVhfQ0hBTk5FTFMgKiBXTUFMTF9NQVhfQ0hBTk5FTFMgKiAzMl07CiAgICAgaW50MTZfdCBtY2xtc19jb2VmZnNfY3VyW1dNQUxMX01BWF9DSEFOTkVMUyAqIFdNQUxMX01BWF9DSEFOTkVMU107Ci0gICAgaW50MTZfdCBtY2xtc19wcmV2dmFsdWVzW1dNQUxMX01BWF9DSEFOTkVMUyAqIDIgKiAzMl07Ci0gICAgaW50MTZfdCBtY2xtc191cGRhdGVzW1dNQUxMX01BWF9DSEFOTkVMUyAqIDIgKiAzMl07CisgICAgaW50MzJfdCBtY2xtc19wcmV2dmFsdWVzW1dNQUxMX01BWF9DSEFOTkVMUyAqIDIgKiAzMl07CisgICAgaW50MzJfdCBtY2xtc191cGRhdGVzW1dNQUxMX01BWF9DSEFOTkVMUyAqIDIgKiAzMl07CiAgICAgaW50ICAgICBtY2xtc19yZWNlbnQ7CiAKICAgICBpbnQgICAgIG1vdmF2ZV9zY2FsaW5nOwpAQCAtMTQ3LDcgKzE0OCw3IEBACiAgICAgICAgIGludCBjb2Vmc2VuZDsKICAgICAgICAgaW50IGJpdHNlbmQ7CiAgICAgICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgY29lZnMpW01BWF9PUkRFUiArIFdNQUxMX0NPRUZGX1BBRF9TSVpFL3NpemVvZihpbnQxNl90KV07Ci0gICAgICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgbG1zX3ByZXZ2YWx1ZXMpW01BWF9PUkRFUiAqIDIgKyBXTUFMTF9DT0VGRl9QQURfU0laRS9zaXplb2YoaW50MTZfdCldOworICAgICAgICBERUNMQVJFX0FMSUdORUQoMTYsIGludDMyX3QsIGxtc19wcmV2dmFsdWVzKVtNQVhfT1JERVIgKiAyICsgV01BTExfQ09FRkZfUEFEX1NJWkUvc2l6ZW9mKGludDE2X3QpXTsKICAgICAgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCBsbXNfdXBkYXRlcylbTUFYX09SREVSICogMiArIFdNQUxMX0NPRUZGX1BBRF9TSVpFL3NpemVvZihpbnQxNl90KV07CiAgICAgICAgIGludCByZWNlbnQ7CiAgICAgfSBjZGxtc1tXTUFMTF9NQVhfQ0hBTk5FTFNdWzldOwpAQCAtMTcxLDggKzE3Miw2IEBACiAgICAgaW50IGxwY19vcmRlcjsKICAgICBpbnQgbHBjX3NjYWxpbmc7CiAgICAgaW50IGxwY19pbnRiaXRzOwotCi0gICAgaW50IGNoYW5uZWxfY29lZmZzW1dNQUxMX01BWF9DSEFOTkVMU11bV01BTExfQkxPQ0tfTUFYX1NJWkVdOwogfSBXbWFsbERlY29kZUN0eDsKIAogLyoqIEdldCBzaWduIG9mIGludGVnZXIgKDEgZm9yIHBvc2l0aXZlLCAtMSBmb3IgbmVnYXRpdmUgYW5kIDAgZm9yIHplcm8pICovCkBAIC0xOTAsOSArMTg5LDE0IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCisgICAgcy0+bWF4X2ZyYW1lX3NpemUgPSBNQVhfRlJBTUVTSVpFICogYXZjdHgtPmNoYW5uZWxzOworICAgIHMtPmZyYW1lX2RhdGEgPSBhdl9tYWxsb2N6KHMtPm1heF9mcmFtZV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgaWYgKCFzLT5mcmFtZV9kYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCiAgICAgcy0+YXZjdHggPSBhdmN0eDsKICAgICBmZl9sbGF1ZGRzcF9pbml0KCZzLT5kc3ApOwotICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBzLT5mcmFtZV9kYXRhLCBNQVhfRlJBTUVTSVpFKTsKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgcy0+ZnJhbWVfZGF0YSwgcy0+bWF4X2ZyYW1lX3NpemUpOwogCiAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSAxOCkgewogICAgICAgICBzLT5kZWNvZGVfZmxhZ3MgICAgPSBBVl9STDE2KGVkYXRhX3B0ciArIDE0KTsKQEAgLTIwMSw3ICsyMDUsNiBAQAogICAgICAgICBpZiAocy0+Yml0c19wZXJfc2FtcGxlID09IDE2KQogICAgICAgICAgICAgYXZjdHgtPnNhbXBsZV9mbXQgPSBBVl9TQU1QTEVfRk1UX1MxNlA7CiAgICAgICAgIGVsc2UgaWYgKHMtPmJpdHNfcGVyX3NhbXBsZSA9PSAyNCkgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkRlY29kaW5nIGF1ZGlvIGF0IDI0IGJpdC1kZXB0aFxuIik7CiAgICAgICAgICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfUzMyUDsKICAgICAgICAgICAgIGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID0gMjQ7CiAgICAgICAgIH0gZWxzZSB7CkBAIC00NjQsNyArNDY3LDcgQEAKICAgICAgICAgICAgICAgICBzLT5jZGxtc1swXVswXS5vcmRlciA9IDA7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZihzLT5jZGxtc1tjXVtpXS5vcmRlciAmIDgpIHsKKyAgICAgICAgICAgIGlmKHMtPmNkbG1zW2NdW2ldLm9yZGVyICYgOCAmJiBzLT5iaXRzX3Blcl9zYW1wbGUgPT0gMTYpIHsKICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IHdhcm5lZDsKICAgICAgICAgICAgICAgICBpZighd2FybmVkKQogICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocy0+YXZjdHgsICJDRExNUyBvZiBvcmRlciAlZCIsCkBAIC02NTEsMTAgKzY1NCwxMCBAQAogICAgIGlmIChzLT5tY2xtc19yZWNlbnQgPT0gMCkgewogICAgICAgICBtZW1jcHkoJnMtPm1jbG1zX3ByZXZ2YWx1ZXNbb3JkZXIgKiBudW1fY2hhbm5lbHNdLAogICAgICAgICAgICAgICAgcy0+bWNsbXNfcHJldnZhbHVlcywKLSAgICAgICAgICAgICAgIHNpemVvZihpbnQxNl90KSAqIG9yZGVyICogbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgIHNpemVvZihpbnQzMl90KSAqIG9yZGVyICogbnVtX2NoYW5uZWxzKTsKICAgICAgICAgbWVtY3B5KCZzLT5tY2xtc191cGRhdGVzW29yZGVyICogbnVtX2NoYW5uZWxzXSwKICAgICAgICAgICAgICAgIHMtPm1jbG1zX3VwZGF0ZXMsCi0gICAgICAgICAgICAgICBzaXplb2YoaW50MTZfdCkgKiBvcmRlciAqIG51bV9jaGFubmVscyk7CisgICAgICAgICAgICAgICBzaXplb2YoaW50MzJfdCkgKiBvcmRlciAqIG51bV9jaGFubmVscyk7CiAgICAgICAgIHMtPm1jbG1zX3JlY2VudCA9IG51bV9jaGFubmVscyAqIG9yZGVyOwogICAgIH0KIH0KQEAgLTY3MCwxMCArNjczLDEwIEBACiAgICAgICAgIGlmICghcy0+aXNfY2hhbm5lbF9jb2RlZFtpY2hdKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvcmRlciAqIG51bV9jaGFubmVsczsgaSsrKQotICAgICAgICAgICAgcHJlZFtpY2hdICs9IHMtPm1jbG1zX3ByZXZ2YWx1ZXNbaSArIHMtPm1jbG1zX3JlY2VudF0gKgorICAgICAgICAgICAgcHJlZFtpY2hdICs9ICh1aW50MzJfdClzLT5tY2xtc19wcmV2dmFsdWVzW2kgKyBzLT5tY2xtc19yZWNlbnRdICoKICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tY2xtc19jb2VmZnNbaSArIG9yZGVyICogbnVtX2NoYW5uZWxzICogaWNoXTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGljaDsgaSsrKQotICAgICAgICAgICAgcHJlZFtpY2hdICs9IHMtPmNoYW5uZWxfcmVzaWR1ZXNbaV1baWNvZWZdICoKKyAgICAgICAgICAgIHByZWRbaWNoXSArPSAodWludDMyX3Qpcy0+Y2hhbm5lbF9yZXNpZHVlc1tpXVtpY29lZl0gKgogICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1jbG1zX2NvZWZmc19jdXJbaSArIG51bV9jaGFubmVscyAqIGljaF07CiAgICAgICAgIHByZWRbaWNoXSArPSAxIDw8IHMtPm1jbG1zX3NjYWxpbmcgLSAxOwogICAgICAgICBwcmVkW2ljaF0gPj49IHMtPm1jbG1zX3NjYWxpbmc7CkBAIC02OTAsMzIgKzY5Myw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBsbXNfdXBkYXRlKFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgaWNoLCBpbnQgaWxtcywgaW50IGlucHV0KQotewotICAgIGludCByZWNlbnQgPSBzLT5jZGxtc1tpY2hdW2lsbXNdLnJlY2VudDsKLSAgICBpbnQgcmFuZ2UgID0gMSA8PCBzLT5iaXRzX3Blcl9zYW1wbGUgLSAxOwotICAgIGludCBvcmRlciAgPSBzLT5jZGxtc1tpY2hdW2lsbXNdLm9yZGVyOwotCi0gICAgaWYgKHJlY2VudCkKLSAgICAgICAgcmVjZW50LS07Ci0gICAgZWxzZSB7Ci0gICAgICAgIG1lbWNweShzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc19wcmV2dmFsdWVzICsgb3JkZXIsCi0gICAgICAgICAgICAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc19wcmV2dmFsdWVzLCBzaXplb2YoKnMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3ByZXZ2YWx1ZXMpICogb3JkZXIpOwotICAgICAgICBtZW1jcHkocy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlcyArIG9yZGVyLAotICAgICAgICAgICAgICAgcy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlcywgc2l6ZW9mKCpzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc191cGRhdGVzKSAqIG9yZGVyKTsKLSAgICAgICAgcmVjZW50ID0gb3JkZXIgLSAxOwotICAgIH0KLQotICAgIHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3ByZXZ2YWx1ZXNbcmVjZW50XSA9IGF2X2NsaXAoaW5wdXQsIC1yYW5nZSwgcmFuZ2UgLSAxKTsKLSAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc191cGRhdGVzW3JlY2VudF0gPSBXTUFTSUdOKGlucHV0KSAqIHMtPnVwZGF0ZV9zcGVlZFtpY2hdOwotCi0gICAgcy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlc1tyZWNlbnQgKyAob3JkZXIgPj4gNCldID4+PSAyOwotICAgIHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXNbcmVjZW50ICsgKG9yZGVyID4+IDMpXSA+Pj0gMTsKLSAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLnJlY2VudCA9IHJlY2VudDsKLSAgICBtZW1zZXQocy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlcyArIHJlY2VudCArIG9yZGVyLCAwLAotICAgICAgICAgICBzaXplb2Yocy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlcykgLSAyKihyZWNlbnQrb3JkZXIpKTsKLX0KLQogc3RhdGljIHZvaWQgdXNlX2hpZ2hfdXBkYXRlX3NwZWVkKFdtYWxsRGVjb2RlQ3R4ICpzLCBpbnQgaWNoKQogewogICAgIGludCBpbG1zLCByZWNlbnQsIGljb2VmOwpAQCAtNzUxLDMyICs3MjgsNjMgQEAKICAgICBzLT51cGRhdGVfc3BlZWRbaWNoXSA9IDg7CiB9CiAKLXN0YXRpYyB2b2lkIHJldmVydF9jZGxtcyhXbWFsbERlY29kZUN0eCAqcywgaW50IGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2VmX2JlZ2luLCBpbnQgY29lZl9lbmQpCi17Ci0gICAgaW50IGljb2VmLCBwcmVkLCBpbG1zLCBudW1fbG1zLCByZXNpZHVlLCBpbnB1dDsKLQotICAgIG51bV9sbXMgPSBzLT5jZGxtc190dGxbY2hdOwotICAgIGZvciAoaWxtcyA9IG51bV9sbXMgLSAxOyBpbG1zID49IDA7IGlsbXMtLSkgewotICAgICAgICBmb3IgKGljb2VmID0gY29lZl9iZWdpbjsgaWNvZWYgPCBjb2VmX2VuZDsgaWNvZWYrKykgewotICAgICAgICAgICAgcHJlZCA9IDEgPDwgKHMtPmNkbG1zW2NoXVtpbG1zXS5zY2FsaW5nIC0gMSk7Ci0gICAgICAgICAgICByZXNpZHVlID0gcy0+Y2hhbm5lbF9yZXNpZHVlc1tjaF1baWNvZWZdOwotICAgICAgICAgICAgcHJlZCArPSBzLT5kc3Auc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNihzLT5jZGxtc1tjaF1baWxtc10uY29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNkbG1zW2NoXVtpbG1zXS5sbXNfcHJldnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzLT5jZGxtc1tjaF1baWxtc10ucmVjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jZGxtc1tjaF1baWxtc10ubG1zX3VwZGF0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcy0+Y2RsbXNbY2hdW2lsbXNdLnJlY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTElHTihzLT5jZGxtc1tjaF1baWxtc10ub3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV01BTExfQ09FRkZfUEFEX1NJWkUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTUFTSUdOKHJlc2lkdWUpKTsKLSAgICAgICAgICAgIGlucHV0ID0gcmVzaWR1ZSArIChwcmVkID4+IHMtPmNkbG1zW2NoXVtpbG1zXS5zY2FsaW5nKTsKLSAgICAgICAgICAgIGxtc191cGRhdGUocywgY2gsIGlsbXMsIGlucHV0KTsKLSAgICAgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbY2hdW2ljb2VmXSA9IGlucHV0OwotICAgICAgICB9Ci0gICAgfQotICAgIGVtbXNfYygpOworI2RlZmluZSBDRF9MTVMoYml0cywgUk9VTkQpIFwKK3N0YXRpYyB2b2lkIGxtc191cGRhdGUgIyMgYml0cyAoV21hbGxEZWNvZGVDdHggKnMsIGludCBpY2gsIGludCBpbG1zLCBpbnQgaW5wdXQpIFwKK3sgXAorICAgIGludCByZWNlbnQgPSBzLT5jZGxtc1tpY2hdW2lsbXNdLnJlY2VudDsgXAorICAgIGludCByYW5nZSAgPSAxIDw8IHMtPmJpdHNfcGVyX3NhbXBsZSAtIDE7IFwKKyAgICBpbnQgb3JkZXIgID0gcy0+Y2RsbXNbaWNoXVtpbG1zXS5vcmRlcjsgXAorICAgIGludCAjI2JpdHMjI190ICpwcmV2ID0gKGludCMjYml0cyMjX3QgKilzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc19wcmV2dmFsdWVzOyBcCisgXAorICAgIGlmIChyZWNlbnQpIFwKKyAgICAgICAgcmVjZW50LS07IFwKKyAgICBlbHNlIHsgXAorICAgICAgICBtZW1jcHkocHJldiArIG9yZGVyLCBwcmV2LCAoYml0cy84KSAqIG9yZGVyKTsgXAorICAgICAgICBtZW1jcHkocy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlcyArIG9yZGVyLCBcCisgICAgICAgICAgICAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc191cGRhdGVzLCBcCisgICAgICAgICAgICAgICBzaXplb2YoKnMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXMpICogb3JkZXIpOyBcCisgICAgICAgIHJlY2VudCA9IG9yZGVyIC0gMTsgXAorICAgIH0gXAorIFwKKyAgICBwcmV2W3JlY2VudF0gPSBhdl9jbGlwKGlucHV0LCAtcmFuZ2UsIHJhbmdlIC0gMSk7IFwKKyAgICBzLT5jZGxtc1tpY2hdW2lsbXNdLmxtc191cGRhdGVzW3JlY2VudF0gPSBXTUFTSUdOKGlucHV0KSAqIHMtPnVwZGF0ZV9zcGVlZFtpY2hdOyBcCisgXAorICAgIHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXNbcmVjZW50ICsgKG9yZGVyID4+IDQpXSA+Pj0gMjsgXAorICAgIHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXNbcmVjZW50ICsgKG9yZGVyID4+IDMpXSA+Pj0gMTsgXAorICAgIHMtPmNkbG1zW2ljaF1baWxtc10ucmVjZW50ID0gcmVjZW50OyBcCisgICAgbWVtc2V0KHMtPmNkbG1zW2ljaF1baWxtc10ubG1zX3VwZGF0ZXMgKyByZWNlbnQgKyBvcmRlciwgMCwgXAorICAgICAgICAgICBzaXplb2Yocy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlcykgLSBcCisgICAgICAgICAgIHNpemVvZigqcy0+Y2RsbXNbaWNoXVtpbG1zXS5sbXNfdXBkYXRlcykqKHJlY2VudCtvcmRlcikpOyBcCit9IFwKKyBcCitzdGF0aWMgdm9pZCByZXZlcnRfY2RsbXMgIyMgYml0cyAoV21hbGxEZWNvZGVDdHggKnMsIGludCBjaCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2VmX2JlZ2luLCBpbnQgY29lZl9lbmQpIFwKK3sgXAorICAgIGludCBpY29lZiwgcHJlZCwgaWxtcywgbnVtX2xtcywgcmVzaWR1ZSwgaW5wdXQ7IFwKKyBcCisgICAgbnVtX2xtcyA9IHMtPmNkbG1zX3R0bFtjaF07IFwKKyAgICBmb3IgKGlsbXMgPSBudW1fbG1zIC0gMTsgaWxtcyA+PSAwOyBpbG1zLS0pIHsgXAorICAgICAgICBmb3IgKGljb2VmID0gY29lZl9iZWdpbjsgaWNvZWYgPCBjb2VmX2VuZDsgaWNvZWYrKykgeyBcCisgICAgICAgICAgICBpbnQjI2JpdHMjI190ICpwcmV2dmFsdWVzID0gKGludCMjYml0cyMjX3QgKilzLT5jZGxtc1tjaF1baWxtc10ubG1zX3ByZXZ2YWx1ZXM7IFwKKyAgICAgICAgICAgIHByZWQgPSAxIDw8IChzLT5jZGxtc1tjaF1baWxtc10uc2NhbGluZyAtIDEpOyBcCisgICAgICAgICAgICByZXNpZHVlID0gcy0+Y2hhbm5lbF9yZXNpZHVlc1tjaF1baWNvZWZdOyBcCisgICAgICAgICAgICBwcmVkICs9IHMtPmRzcC5zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludCMjIGJpdHMgKHMtPmNkbG1zW2NoXVtpbG1zXS5jb2VmcywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2dmFsdWVzICsgcy0+Y2RsbXNbY2hdW2lsbXNdLnJlY2VudCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jZGxtc1tjaF1baWxtc10ubG1zX3VwZGF0ZXMgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNkbG1zW2NoXVtpbG1zXS5yZWNlbnQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTElHTihzLT5jZGxtc1tjaF1baWxtc10ub3JkZXIsIFJPVU5EKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTUFTSUdOKHJlc2lkdWUpKTsgXAorICAgICAgICAgICAgaW5wdXQgPSByZXNpZHVlICsgKHByZWQgPj4gcy0+Y2RsbXNbY2hdW2lsbXNdLnNjYWxpbmcpOyBcCisgICAgICAgICAgICBsbXNfdXBkYXRlICMjIGJpdHMocywgY2gsIGlsbXMsIGlucHV0KTsgXAorICAgICAgICAgICAgcy0+Y2hhbm5lbF9yZXNpZHVlc1tjaF1baWNvZWZdID0gaW5wdXQ7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgaWYgKGJpdHMgPD0gMTYpIGVtbXNfYygpOyBcCiB9CiAKK0NEX0xNUygxNiwgV01BTExfQ09FRkZfUEFEX1NJWkUpCitDRF9MTVMoMzIsIDgpCisKIHN0YXRpYyB2b2lkIHJldmVydF9pbnRlcl9jaF9kZWNvcnIoV21hbGxEZWNvZGVDdHggKnMsIGludCB0aWxlX3NpemUpCiB7CiAgICAgaWYgKHMtPm51bV9jaGFubmVscyAhPSAyKQpAQCAtODEzLDcgKzgyMSw3IEBACiAgICAgICAgIGZvciAoaSA9IG9yZGVyOyBpIDwgdGlsZV9zaXplOyBpKyspIHsKICAgICAgICAgICAgIHByZWQgPSAwOwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9yZGVyOyBqKyspCi0gICAgICAgICAgICAgICAgcHJlZCArPSBzLT5jaGFubmVsX3Jlc2lkdWVzW2ljaF1baSAtIGogLSAxXSAqIGZpbHRlcl9jb2VmZnNbal07CisgICAgICAgICAgICAgICAgcHJlZCArPSAodWludDMyX3Qpcy0+Y2hhbm5lbF9yZXNpZHVlc1tpY2hdW2kgLSBqIC0gMV0gKiBmaWx0ZXJfY29lZmZzW2pdOwogICAgICAgICAgICAgcHJlZCA+Pj0gc2NhbGluZzsKICAgICAgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbaWNoXVtpXSArPSBwcmVkOwogICAgICAgICB9CkBAIC04OTEsMTQgKzg5OSwxNyBAQAogICAgICAgICBzLT5xdWFudF9zdGVwc2l6ZSA9IGdldF9iaXRzKCZzLT5nYiwgOCkgKyAxOwogCiAgICAgICAgIHJlc2V0X2NvZGVjKHMpOwotICAgIH0gZWxzZSBpZiAoIXMtPmNkbG1zWzBdWzBdLm9yZGVyKSB7CisgICAgfQorCisgICAgcmF3cGNtX3RpbGUgPSBnZXRfYml0czEoJnMtPmdiKTsKKworICAgIGlmICghcmF3cGNtX3RpbGUgJiYgIXMtPmNkbG1zWzBdWzBdLm9yZGVyKSB7CiAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0RFQlVHLAogICAgICAgICAgICAgICAgIldhaXRpbmcgZm9yIHNlZWthYmxlIHRpbGVcbiIpOwogICAgICAgICBhdl9mcmFtZV91bnJlZihzLT5mcmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICByYXdwY21fdGlsZSA9IGdldF9iaXRzMSgmcy0+Z2IpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGFubmVsczsgaSsrKQogICAgICAgICBzLT5pc19jaGFubmVsX2NvZGVkW2ldID0gMTsKQEAgLTkzNywzMiArOTQ4LDM3IEBACiAgICAgICAgICAgICAgICAgYml0cyAqIHMtPm51bV9jaGFubmVscyAqIHN1YmZyYW1lX2xlbiwgZ2V0X2JpdHNfY291bnQoJnMtPmdiKSk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fY2hhbm5lbHM7IGkrKykKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdWJmcmFtZV9sZW47IGorKykKLSAgICAgICAgICAgICAgICBzLT5jaGFubmVsX2NvZWZmc1tpXVtqXSA9IGdldF9zYml0c19sb25nKCZzLT5nYiwgYml0cyk7CisgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9yZXNpZHVlc1tpXVtqXSA9IGdldF9zYml0c19sb25nKCZzLT5nYiwgYml0cyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGFubmVsczsgaSsrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX2NoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgIGlmIChzLT5pc19jaGFubmVsX2NvZGVkW2ldKSB7CiAgICAgICAgICAgICAgICAgZGVjb2RlX2NoYW5uZWxfcmVzaWR1ZXMocywgaSwgc3ViZnJhbWVfbGVuKTsKICAgICAgICAgICAgICAgICBpZiAocy0+c2Vla2FibGVfdGlsZSkKICAgICAgICAgICAgICAgICAgICAgdXNlX2hpZ2hfdXBkYXRlX3NwZWVkKHMsIGkpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgdXNlX25vcm1hbF91cGRhdGVfc3BlZWQocywgaSk7Ci0gICAgICAgICAgICAgICAgcmV2ZXJ0X2NkbG1zKHMsIGksIDAsIHN1YmZyYW1lX2xlbik7CisgICAgICAgICAgICAgICAgaWYgKHMtPmJpdHNfcGVyX3NhbXBsZSA+IDE2KQorICAgICAgICAgICAgICAgICAgICByZXZlcnRfY2RsbXMzMihzLCBpLCAwLCBzdWJmcmFtZV9sZW4pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmV2ZXJ0X2NkbG1zMTYocywgaSwgMCwgc3ViZnJhbWVfbGVuKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbWVtc2V0KHMtPmNoYW5uZWxfcmVzaWR1ZXNbaV0sIDAsIHNpemVvZigqKnMtPmNoYW5uZWxfcmVzaWR1ZXMpICogc3ViZnJhbWVfbGVuKTsKICAgICAgICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHMtPmRvX21jbG1zKQotICAgICAgICByZXZlcnRfbWNsbXMocywgc3ViZnJhbWVfbGVuKTsKLSAgICBpZiAocy0+ZG9faW50ZXJfY2hfZGVjb3JyKQotICAgICAgICByZXZlcnRfaW50ZXJfY2hfZGVjb3JyKHMsIHN1YmZyYW1lX2xlbik7Ci0gICAgaWYgKHMtPmRvX2FjX2ZpbHRlcikKLSAgICAgICAgcmV2ZXJ0X2FjZmlsdGVyKHMsIHN1YmZyYW1lX2xlbik7CisgICAgICAgIH0KIAotICAgIC8qIERlcXVhbnRpemUgKi8KLSAgICBpZiAocy0+cXVhbnRfc3RlcHNpemUgIT0gMSkKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9jaGFubmVsczsgaSsrKQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHN1YmZyYW1lX2xlbjsgaisrKQotICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbaV1bal0gKj0gcy0+cXVhbnRfc3RlcHNpemU7CisgICAgICAgIGlmIChzLT5kb19tY2xtcykKKyAgICAgICAgICAgIHJldmVydF9tY2xtcyhzLCBzdWJmcmFtZV9sZW4pOworICAgICAgICBpZiAocy0+ZG9faW50ZXJfY2hfZGVjb3JyKQorICAgICAgICAgICAgcmV2ZXJ0X2ludGVyX2NoX2RlY29ycihzLCBzdWJmcmFtZV9sZW4pOworICAgICAgICBpZiAocy0+ZG9fYWNfZmlsdGVyKQorICAgICAgICAgICAgcmV2ZXJ0X2FjZmlsdGVyKHMsIHN1YmZyYW1lX2xlbik7CisKKyAgICAgICAgLyogRGVxdWFudGl6ZSAqLworICAgICAgICBpZiAocy0+cXVhbnRfc3RlcHNpemUgIT0gMSkKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc3ViZnJhbWVfbGVuOyBqKyspCisgICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfcmVzaWR1ZXNbaV1bal0gKj0gcy0+cXVhbnRfc3RlcHNpemU7CisgICAgfQogCiAgICAgLyogV3JpdGUgdG8gcHJvcGVyIG91dHB1dCBidWZmZXIgZGVwZW5kaW5nIG9uIGJpdC1kZXB0aCAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lOyBpKyspIHsKQEAgLTEwNDMsNiArMTA1OSw5IEBACiAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7CiAgICAgICAgICAgICBza2lwID0gZ2V0X2JpdHMoZ2IsIGF2X2xvZzIocy0+c2FtcGxlc19wZXJfZnJhbWUgKiAyKSk7CiAgICAgICAgICAgICBmZl9kbG9nKHMtPmF2Y3R4LCAiZW5kIHNraXA6ICVpXG4iLCBza2lwKTsKKyAgICAgICAgICAgIHMtPmZyYW1lLT5uYl9zYW1wbGVzIC09IHNraXA7CisgICAgICAgICAgICBpZiAocy0+ZnJhbWUtPm5iX3NhbXBsZXMgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogCiAgICAgfQpAQCAtMTEyMSwxNCArMTE0MCwxNSBAQAogICAgIGlmICghYXBwZW5kKSB7CiAgICAgICAgIHMtPmZyYW1lX29mZnNldCAgID0gZ2V0X2JpdHNfY291bnQoZ2IpICYgNzsKICAgICAgICAgcy0+bnVtX3NhdmVkX2JpdHMgPSBzLT5mcmFtZV9vZmZzZXQ7Ci0gICAgICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBzLT5mcmFtZV9kYXRhLCBNQVhfRlJBTUVTSVpFKTsKKyAgICAgICAgaW5pdF9wdXRfYml0cygmcy0+cGIsIHMtPmZyYW1lX2RhdGEsIHMtPm1heF9mcmFtZV9zaXplKTsKICAgICB9CiAKICAgICBidWZsZW4gPSAocy0+bnVtX3NhdmVkX2JpdHMgKyBsZW4gKyA4KSA+PiAzOwogCi0gICAgaWYgKGxlbiA8PSAwIHx8IGJ1ZmxlbiA+IE1BWF9GUkFNRVNJWkUpIHsKKyAgICBpZiAobGVuIDw9IDAgfHwgYnVmbGVuID4gcy0+bWF4X2ZyYW1lX3NpemUpIHsKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMtPmF2Y3R4LCAiVG9vIHNtYWxsIGlucHV0IGJ1ZmZlciIpOwogICAgICAgICBzLT5wYWNrZXRfbG9zcyA9IDE7CisgICAgICAgIHMtPm51bV9zYXZlZF9iaXRzID0gMDsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTE2MywyNSArMTE4MywyNCBAQAogCiAgICAgcy0+ZnJhbWUtPm5iX3NhbXBsZXMgPSAwOwogCi0gICAgaWYgKHMtPnBhY2tldF9kb25lIHx8IHMtPnBhY2tldF9sb3NzKSB7CisgICAgaWYgKCFidWZfc2l6ZSAmJiBzLT5udW1fc2F2ZWRfYml0cyA+IGdldF9iaXRzX2NvdW50KCZzLT5nYikpIHsKKyAgICAgICAgcy0+cGFja2V0X2RvbmUgPSAwOworICAgICAgICBpZiAoIWRlY29kZV9mcmFtZShzKSkKKyAgICAgICAgICAgIHMtPm51bV9zYXZlZF9iaXRzID0gMDsKKyAgICB9IGVsc2UgaWYgKHMtPnBhY2tldF9kb25lIHx8IHMtPnBhY2tldF9sb3NzKSB7CiAgICAgICAgIHMtPnBhY2tldF9kb25lID0gMDsKIAogICAgICAgICBpZiAoIWJ1Zl9zaXplKQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIC8qIHNhbml0eSBjaGVjayBmb3IgdGhlIGJ1ZmZlciBsZW5ndGggKi8KLSAgICAgICAgaWYgKGJ1Zl9zaXplIDwgYXZjdHgtPmJsb2NrX2FsaWduKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImJ1ZiBzaXplICVkIGludmFsaWRcbiIsIGJ1Zl9zaXplKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9CiAKLSAgICAgICAgcy0+bmV4dF9wYWNrZXRfc3RhcnQgPSBidWZfc2l6ZSAtIGF2Y3R4LT5ibG9ja19hbGlnbjsKLSAgICAgICAgYnVmX3NpemUgICAgICAgICAgICAgPSBhdmN0eC0+YmxvY2tfYWxpZ247CisgICAgICAgIHMtPm5leHRfcGFja2V0X3N0YXJ0ID0gYnVmX3NpemUgLSBGRk1JTihhdmN0eC0+YmxvY2tfYWxpZ24sIGJ1Zl9zaXplKTsKKyAgICAgICAgYnVmX3NpemUgICAgICAgICAgICAgPSBGRk1JTihhdmN0eC0+YmxvY2tfYWxpZ24sIGJ1Zl9zaXplKTsKICAgICAgICAgcy0+YnVmX2JpdF9zaXplICAgICAgPSBidWZfc2l6ZSA8PCAzOwogCiAgICAgICAgIC8qIHBhcnNlIHBhY2tldCBoZWFkZXIgKi8KICAgICAgICAgaW5pdF9nZXRfYml0cyhnYiwgYnVmLCBzLT5idWZfYml0X3NpemUpOwogICAgICAgICBwYWNrZXRfc2VxdWVuY2VfbnVtYmVyID0gZ2V0X2JpdHMoZ2IsIDQpOwotICAgICAgICBza2lwX2JpdHMoZ2IsIDEpOyAgIC8vIFNraXAgc2Vla2FibGVfZnJhbWVfaW5fcGFja2V0LCBjdXJyZW50bHkgdW51bnVzZWQKKyAgICAgICAgc2tpcF9iaXRzKGdiLCAxKTsgICAvLyBTa2lwIHNlZWthYmxlX2ZyYW1lX2luX3BhY2tldCwgY3VycmVudGx5IHVudXNlZAogICAgICAgICBzcGxpY2VkX3BhY2tldCA9IGdldF9iaXRzMShnYik7CiAgICAgICAgIGlmIChzcGxpY2VkX3BhY2tldCkKICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkJpdHN0cmVhbSBzcGxpY2luZyIpOwpAQCAtMTIyMyw3ICsxMjQyLDcgQEAKICAgICAgICAgICAgICAqIHRvIGRlY29kZSBpbmNvbXBsZXRlIGZyYW1lcyBpbiB0aGUgcy0+bGVuX3ByZWZpeCA9PSAwIGNhc2UuICovCiAgICAgICAgICAgICBzLT5udW1fc2F2ZWRfYml0cyA9IDA7CiAgICAgICAgICAgICBzLT5wYWNrZXRfbG9zcyAgICA9IDA7Ci0gICAgICAgICAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgcy0+ZnJhbWVfZGF0YSwgTUFYX0ZSQU1FU0laRSk7CisgICAgICAgICAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgcy0+ZnJhbWVfZGF0YSwgcy0+bWF4X2ZyYW1lX3NpemUpOwogICAgICAgICB9CiAKICAgICB9IGVsc2UgewpAQCAtMTIzNyw3ICsxMjU2LDkgQEAKICAgICAgICAgICAgIChmcmFtZV9zaXplID0gc2hvd19iaXRzKGdiLCBzLT5sb2cyX2ZyYW1lX3NpemUpKSAmJgogICAgICAgICAgICAgZnJhbWVfc2l6ZSA8PSByZW1haW5pbmdfYml0cyhzLCBnYikpIHsKICAgICAgICAgICAgIHNhdmVfYml0cyhzLCBnYiwgZnJhbWVfc2l6ZSwgMCk7Ci0gICAgICAgICAgICBzLT5wYWNrZXRfZG9uZSA9ICFkZWNvZGVfZnJhbWUocyk7CisKKyAgICAgICAgICAgIGlmICghcy0+cGFja2V0X2xvc3MpCisgICAgICAgICAgICAgICAgcy0+cGFja2V0X2RvbmUgPSAhZGVjb2RlX2ZyYW1lKHMpOwogICAgICAgICB9IGVsc2UgaWYgKCFzLT5sZW5fcHJlZml4CiAgICAgICAgICAgICAgICAgICAgJiYgcy0+bnVtX3NhdmVkX2JpdHMgPiBnZXRfYml0c19jb3VudCgmcy0+Z2IpKSB7CiAgICAgICAgICAgICAvKiB3aGVuIHRoZSBmcmFtZXMgZG8gbm90IGhhdmUgYSBsZW5ndGggcHJlZml4LCB3ZSBkb24ndCBrbm93IHRoZQpAQCAtMTI1Miw2ICsxMjczLDExIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocmVtYWluaW5nX2JpdHMocywgZ2IpIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk92ZXJyZWFkICVkXG4iLCAtcmVtYWluaW5nX2JpdHMocywgZ2IpKTsKKyAgICAgICAgcy0+cGFja2V0X2xvc3MgPSAxOworICAgIH0KKwogICAgIGlmIChzLT5wYWNrZXRfZG9uZSAmJiAhcy0+cGFja2V0X2xvc3MgJiYKICAgICAgICAgcmVtYWluaW5nX2JpdHMocywgZ2IpID4gMCkgewogICAgICAgICAvKiBzYXZlIHRoZSByZXN0IG9mIHRoZSBkYXRhIHNvIHRoYXQgaXQgY2FuIGJlIGRlY29kZWQKQEAgLTEyNjQsNyArMTI5MCw3IEBACiAKICAgICBzLT5wYWNrZXRfb2Zmc2V0ID0gZ2V0X2JpdHNfY291bnQoZ2IpICYgNzsKIAotICAgIHJldHVybiAocy0+cGFja2V0X2xvc3MpID8gQVZFUlJPUl9JTlZBTElEREFUQSA6IGdldF9iaXRzX2NvdW50KGdiKSA+PiAzOworICAgIHJldHVybiAocy0+cGFja2V0X2xvc3MpID8gQVZFUlJPUl9JTlZBTElEREFUQSA6IGJ1Zl9zaXplID8gZ2V0X2JpdHNfY291bnQoZ2IpID4+IDMgOiAwOwogfQogCiBzdGF0aWMgdm9pZCBmbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCkBAIC0xMjc3LDcgKzEzMDMsNyBAQAogICAgIHMtPm5leHRfcGFja2V0X3N0YXJ0ID0gMDsKICAgICBzLT5jZGxtc1swXVswXS5vcmRlciA9IDA7CiAgICAgcy0+ZnJhbWUtPm5iX3NhbXBsZXMgPSAwOwotICAgIGluaXRfcHV0X2JpdHMoJnMtPnBiLCBzLT5mcmFtZV9kYXRhLCBNQVhfRlJBTUVTSVpFKTsKKyAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgcy0+ZnJhbWVfZGF0YSwgcy0+bWF4X2ZyYW1lX3NpemUpOwogfQogCiBzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKQEAgLTEyODUsNiArMTMxMSw3IEBACiAgICAgV21hbGxEZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogCiAgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9kYXRhKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy93bWFwcm9kZWMuYyBiL2xpYmF2Y29kZWMvd21hcHJvZGVjLmMKaW5kZXggMmVhNTllOS4uOTQzOWJmYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy93bWFwcm9kZWMuYworKysgYi9saWJhdmNvZGVjL3dtYXByb2RlYy5jCkBAIC04OCw4ICs4OCw4IEBACiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmbWF0aC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgpAQCAtMTA2LDYgKzEwNiw5IEBACiAjZGVmaW5lIE1BWF9TVUJGUkFNRVMgIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXggbnVtYmVyIG9mIHN1YmZyYW1lcyBwZXIgY2hhbm5lbAogI2RlZmluZSBNQVhfQkFORFMgICAgICAyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbWF4IG51bWJlciBvZiBzY2FsZSBmYWN0b3IgYmFuZHMKICNkZWZpbmUgTUFYX0ZSQU1FU0laRSAgMzI3NjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG1heGltdW0gY29tcHJlc3NlZCBmcmFtZSBzaXplCisjZGVmaW5lIFhNQV9NQVhfU1RSRUFNUyAgICAgICAgIDgKKyNkZWZpbmUgWE1BX01BWF9DSEFOTkVMU19TVFJFQU0gMgorI2RlZmluZSBYTUFfTUFYX0NIQU5ORUxTICAgICAgICAoWE1BX01BWF9TVFJFQU1TICogWE1BX01BWF9DSEFOTkVMU19TVFJFQU0pCiAKICNkZWZpbmUgV01BUFJPX0JMT0NLX01JTl9CSVRTICA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbG9nMiBvZiBtaW4gYmxvY2sgc2l6ZQogI2RlZmluZSBXTUFQUk9fQkxPQ0tfTUFYX0JJVFMgMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsb2cyIG9mIG1heCBibG9jayBzaXplCkBAIC0yMDcsMTkgKzIxMCwxOSBAQAogICAgIGludCAgICAgICAgICAgICAgc3ViZnJhbWVfb2Zmc2V0OyAgICAgICAgICAgICAgIC8vLzwgc3ViZnJhbWUgb2Zmc2V0IGluIHRoZSBiaXQgcmVzZXJ2b2lyCiAgICAgdWludDhfdCAgICAgICAgICBwYWNrZXRfbG9zczsgICAgICAgICAgICAgICAgICAgLy8vPCBzZXQgaW4gY2FzZSBvZiBiaXRzdHJlYW0gZXJyb3IKICAgICB1aW50OF90ICAgICAgICAgIHBhY2tldF9kb25lOyAgICAgICAgICAgICAgICAgICAvLy88IHNldCB3aGVuIGEgcGFja2V0IGlzIGZ1bGx5IGRlY29kZWQKLSAgICB1aW50OF90ICAgICAgICAgIHNraXBfcGFja2V0czsKIAogICAgIC8qIGZyYW1lIGRlY29kZSBzdGF0ZSAqLwogICAgIHVpbnQzMl90ICAgICAgICAgZnJhbWVfbnVtOyAgICAgICAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBmcmFtZSBudW1iZXIgKG5vdCB1c2VkIGZvciBkZWNvZGluZykKLSAgICBpbnQgICAgICAgICAgICAgIG51bV9mcmFtZXM7CiAgICAgR2V0Qml0Q29udGV4dCAgICBnYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBiaXRzdHJlYW0gcmVhZGVyIGNvbnRleHQKICAgICBpbnQgICAgICAgICAgICAgIGJ1Zl9iaXRfc2l6ZTsgICAgICAgICAgICAgICAgICAvLy88IGJ1ZmZlciBzaXplIGluIGJpdHMKICAgICB1aW50OF90ICAgICAgICAgIGRyY19nYWluOyAgICAgICAgICAgICAgICAgICAgICAvLy88IGdhaW4gZm9yIHRoZSBEUkMgdG9vbAogICAgIGludDhfdCAgICAgICAgICAgc2tpcF9mcmFtZTsgICAgICAgICAgICAgICAgICAgIC8vLzwgc2tpcCBvdXRwdXQgc3RlcAogICAgIGludDhfdCAgICAgICAgICAgcGFyc2VkX2FsbF9zdWJmcmFtZXM7ICAgICAgICAgIC8vLzwgYWxsIHN1YmZyYW1lcyBkZWNvZGVkPworICAgIHVpbnQ4X3QgICAgICAgICAgc2tpcF9wYWNrZXRzOyAgICAgICAgICAgICAgICAgIC8vLzwgcGFja2V0cyB0byBza2lwIHRvIGZpbmQgbmV4dCBwYWNrZXQgaW4gYSBzdHJlYW0gKFhNQTEvMikKIAogICAgIC8qIHN1YmZyYW1lL2Jsb2NrIGRlY29kZSBzdGF0ZSAqLwogICAgIGludDE2X3QgICAgICAgICAgc3ViZnJhbWVfbGVuOyAgICAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBzdWJmcmFtZSBsZW5ndGgKKyAgICBpbnQ4X3QgICAgICAgICAgIG5iX2NoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBjaGFubmVscyBpbiBzdHJlYW0gKFhNQTEvMikKICAgICBpbnQ4X3QgICAgICAgICAgIGNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWU7ICAgICAvLy88IG51bWJlciBvZiBjaGFubmVscyB0aGF0IGNvbnRhaW4gdGhlIHN1YmZyYW1lCiAgICAgaW50OF90ICAgICAgICAgICBjaGFubmVsX2luZGV4ZXNfZm9yX2N1cl9zdWJmcmFtZVtXTUFQUk9fTUFYX0NIQU5ORUxTXTsKICAgICBpbnQ4X3QgICAgICAgICAgIG51bV9iYW5kczsgICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBzY2FsZSBmYWN0b3IgYmFuZHMKQEAgLTIzNCw2ICsyMzcsMTUgQEAKICAgICBXTUFQcm9DaGFubmVsQ3R4IGNoYW5uZWxbV01BUFJPX01BWF9DSEFOTkVMU107ICAvLy88IHBlciBjaGFubmVsIGRhdGEKIH0gV01BUHJvRGVjb2RlQ3R4OwogCit0eXBlZGVmIHN0cnVjdCBYTUFEZWNvZGVDdHggeworICAgIFdNQVByb0RlY29kZUN0eCB4bWFbWE1BX01BWF9TVFJFQU1TXTsKKyAgICBBVkZyYW1lICpmcmFtZXNbWE1BX01BWF9TVFJFQU1TXTsKKyAgICBpbnQgY3VycmVudF9zdHJlYW07CisgICAgaW50IG51bV9zdHJlYW1zOworICAgIGZsb2F0IHNhbXBsZXNbWE1BX01BWF9DSEFOTkVMU11bNTEyICogNjRdOworICAgIGludCBvZmZzZXRbWE1BX01BWF9TVFJFQU1TXTsKKyAgICBpbnQgc3RhcnRfY2hhbm5lbFtYTUFfTUFYX1NUUkVBTVNdOworfSBYTUFEZWNvZGVDdHg7CiAKIC8qKgogICpAYnJpZWYgaGVscGVyIGZ1bmN0aW9uIHRvIHByaW50IHRoZSBtb3N0IGltcG9ydGFudCBtZW1iZXJzIG9mIHRoZSBjb250ZXh0CkBAIC0yNTAsNyArMjYyLDcgQEAKICAgICBQUklOVCgibG9nMiBmcmFtZSBzaXplIiwgICAgIHMtPmxvZzJfZnJhbWVfc2l6ZSk7CiAgICAgUFJJTlQoIm1heCBudW0gc3ViZnJhbWVzIiwgICBzLT5tYXhfbnVtX3N1YmZyYW1lcyk7CiAgICAgUFJJTlQoImxlbiBwcmVmaXgiLCAgICAgICAgICBzLT5sZW5fcHJlZml4KTsKLSAgICBQUklOVCgibnVtIGNoYW5uZWxzIiwgICAgICAgIHMtPmF2Y3R4LT5jaGFubmVscyk7CisgICAgUFJJTlQoIm51bSBjaGFubmVscyIsICAgICAgICBzLT5uYl9jaGFubmVscyk7CiB9CiAKIC8qKgpAQCAtMjU4LDkgKzI3MCw4IEBACiAgKkBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CiAgKkByZXR1cm4gMCBvbiBzdWNjZXNzLCA8IDAgb3RoZXJ3aXNlCiAgKi8KLXN0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3N0YXRpYyBhdl9jb2xkIGludCBkZWNvZGVfZW5kKFdNQVByb0RlY29kZUN0eCAqcykKIHsKLSAgICBXTUFQcm9EZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGludCBpOwogCiAgICAgYXZfZnJlZXAoJnMtPmZkc3ApOwpAQCAtMjcxLDYgKzI4MiwxNSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgYXZfY29sZCBpbnQgd21hcHJvX2RlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdNQVByb0RlY29kZUN0eCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBkZWNvZGVfZW5kKHMpOworCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBhdl9jb2xkIGludCBnZXRfcmF0ZShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7CiAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XTUFQUk8pIHsgLy8gWFhYOiBpcyB0aGlzIHJlYWxseSBvbmx5IGZvciBYTUE/CkBAIC0yOTEsOSArMzExLDggQEAKICAqQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKICAqQHJldHVybiAwIG9uIHN1Y2Nlc3MsIC0xIG90aGVyd2lzZQogICovCi1zdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQorc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9pbml0KFdNQVByb0RlY29kZUN0eCAqcywgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgbnVtX3N0cmVhbSkKIHsKLSAgICBXTUFQcm9EZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIHVpbnQ4X3QgKmVkYXRhX3B0ciA9IGF2Y3R4LT5leHRyYWRhdGE7CiAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxfbWFzazsKICAgICBpbnQgaSwgYml0czsKQEAgLTMwOSw1NyArMzI4LDUwIEBACiAgICAgfQogCiAgICAgcy0+YXZjdHggPSBhdmN0eDsKLSAgICBzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0JJVEVYQUNUKTsKLSAgICBpZiAoIXMtPmZkc3ApCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBpbml0X3B1dF9iaXRzKCZzLT5wYiwgcy0+ZnJhbWVfZGF0YSwgTUFYX0ZSQU1FU0laRSk7CiAKICAgICBhdmN0eC0+c2FtcGxlX2ZtdCA9IEFWX1NBTVBMRV9GTVRfRkxUUDsKIAotICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWE1BMiAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPj0gMzQpIHsKLSAgICAgICAgcy0+ZGVjb2RlX2ZsYWdzICAgID0gMHgxMGQ2OwotICAgICAgICBjaGFubmVsX21hc2sgICAgICAgPSBBVl9STDMyKGVkYXRhX3B0cisyKTsKLSAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlID0gMTY7Ci0gICAgICAgIC8qKiBkdW1wIHRoZSBleHRyYWRhdGEgKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsgaSsrKQotICAgICAgICAgICAgZmZfZGxvZyhhdmN0eCwgIlsleF0gIiwgYXZjdHgtPmV4dHJhZGF0YVtpXSk7Ci0gICAgICAgIGZmX2Rsb2coYXZjdHgsICJcbiIpOworICAgIC8qKiBkdW1wIHRoZSBleHRyYWRhdGEgKi8KKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImV4dHJhZGF0YTpcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7IGkrKykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJbJXhdICIsIGF2Y3R4LT5leHRyYWRhdGFbaV0pOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKIAotICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YTUExICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSAyOCkgeworICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWE1BMiAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPT0gMzQpIHsgLyogWE1BMldBVkVGT1JNQVRFWCAqLwogICAgICAgICBzLT5kZWNvZGVfZmxhZ3MgICAgPSAweDEwZDY7CiAgICAgICAgIHMtPmJpdHNfcGVyX3NhbXBsZSA9IDE2OwotICAgICAgICBjaGFubmVsX21hc2sgICAgICAgPSAwOwotICAgICAgICAvKiogZHVtcCB0aGUgZXh0cmFkYXRhICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+ZXh0cmFkYXRhX3NpemU7IGkrKykKLSAgICAgICAgICAgIGZmX2Rsb2coYXZjdHgsICJbJXhdICIsIGF2Y3R4LT5leHRyYWRhdGFbaV0pOwotICAgICAgICBmZl9kbG9nKGF2Y3R4LCAiXG4iKTsKLQotICAgICB9IGVsc2UgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSAxOCkgeworICAgICAgICBjaGFubmVsX21hc2sgICAgICAgPSAwOyAvL0FWX1JMMzIoZWRhdGFfcHRyKzIpOyAvKiBub3QgYWx3YXlzIGluIGV4cGVjdGVkIG9yZGVyICovCisgICAgICAgIGlmICgobnVtX3N0cmVhbSsxKSAqIFhNQV9NQVhfQ0hBTk5FTFNfU1RSRUFNID4gYXZjdHgtPmNoYW5uZWxzKSAvKiBzdHJlYW0gY29uZmlnIGlzIDJjaCArIDJjaCArIC4uLiArIDEvMmNoICovCisgICAgICAgICAgICBzLT5uYl9jaGFubmVscyA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHMtPm5iX2NoYW5uZWxzID0gMjsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YTUEyKSB7IC8qIFhNQTJXQVZFRk9STUFUICovCisgICAgICAgIHMtPmRlY29kZV9mbGFncyAgICA9IDB4MTBkNjsKKyAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlID0gMTY7CisgICAgICAgIGNoYW5uZWxfbWFzayAgICAgICA9IDA7IC8qIHdvdWxkIG5lZWQgdG8gYWdncmVnYXRlIGZyb20gYWxsIHN0cmVhbXMgKi8KKyAgICAgICAgcy0+bmJfY2hhbm5lbHMgPSBlZGF0YV9wdHJbMzIgKyAoKGVkYXRhX3B0clswXT09Myk/MDo4KSArIDQqbnVtX3N0cmVhbSArIDBdOyAvKiBudGggc3RyZWFtIGNvbmZpZyAqLworICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1hNQTEpIHsgLyogWE1BV0FWRUZPUk1BVCAqLworICAgICAgICBzLT5kZWNvZGVfZmxhZ3MgICAgPSAweDEwZDY7CisgICAgICAgIHMtPmJpdHNfcGVyX3NhbXBsZSA9IDE2OworICAgICAgICBjaGFubmVsX21hc2sgICAgICAgPSAwOyAvKiB3b3VsZCBuZWVkIHRvIGFnZ3JlZ2F0ZSBmcm9tIGFsbCBzdHJlYW1zICovCisgICAgICAgIHMtPm5iX2NoYW5uZWxzICAgICA9IGVkYXRhX3B0cls4ICsgMjAqbnVtX3N0cmVhbSArIDE3XTsgLyogbnRoIHN0cmVhbSBjb25maWcgKi8KKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTUFQUk8gJiYgYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDE4KSB7CiAgICAgICAgIHMtPmRlY29kZV9mbGFncyAgICA9IEFWX1JMMTYoZWRhdGFfcHRyKzE0KTsKICAgICAgICAgY2hhbm5lbF9tYXNrICAgICAgID0gQVZfUkwzMihlZGF0YV9wdHIrMik7CiAgICAgICAgIHMtPmJpdHNfcGVyX3NhbXBsZSA9IEFWX1JMMTYoZWRhdGFfcHRyKTsKKyAgICAgICAgcy0+bmJfY2hhbm5lbHMgICAgID0gYXZjdHgtPmNoYW5uZWxzOwogCiAgICAgICAgIGlmIChzLT5iaXRzX3Blcl9zYW1wbGUgPiAzMiB8fCBzLT5iaXRzX3Blcl9zYW1wbGUgPCAxKSB7CiAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJiaXRzIHBlciBzYW1wbGUgaXMgJWQiLCBzLT5iaXRzX3Blcl9zYW1wbGUpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9Ci0KLSAgICAgICAgLyoqIGR1bXAgdGhlIGV4dHJhZGF0YSAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmV4dHJhZGF0YV9zaXplOyBpKyspCi0gICAgICAgICAgICBmZl9kbG9nKGF2Y3R4LCAiWyV4XSAiLCBhdmN0eC0+ZXh0cmFkYXRhW2ldKTsKLSAgICAgICAgZmZfZGxvZyhhdmN0eCwgIlxuIik7Ci0KICAgICB9IGVsc2UgewogICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJVbmtub3duIGV4dHJhZGF0YSBzaXplIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKLSAgICBpZiAoYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dNQVBSTyAmJiBhdmN0eC0+Y2hhbm5lbHMgPiAyKSB7Ci0gICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGF2Y3R4LCAiPjIgY2hhbm5lbHMgc3VwcG9ydCIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Ci0gICAgfQotCiAgICAgLyoqIGdlbmVyaWMgaW5pdCAqLwogICAgIHMtPmxvZzJfZnJhbWVfc2l6ZSA9IGF2X2xvZzIoYXZjdHgtPmJsb2NrX2FsaWduKSArIDQ7CiAgICAgaWYgKHMtPmxvZzJfZnJhbWVfc2l6ZSA+IDI1KSB7CkBAIC00MTYsMTggKzQyOCwyMiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDwgMCkgeworICAgIGlmIChzLT5uYl9jaGFubmVscyA8PSAwKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMgJWRcbiIsCi0gICAgICAgICAgICAgICBhdmN0eC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgcy0+bmJfY2hhbm5lbHMpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jaGFubmVscyA+IFdNQVBST19NQVhfQ0hBTk5FTFMpIHsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XTUFQUk8gJiYgcy0+bmJfY2hhbm5lbHMgPiBYTUFfTUFYX0NIQU5ORUxTX1NUUkVBTSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzIHBlciBYTUEgc3RyZWFtICVkXG4iLAorICAgICAgICAgICAgICAgcy0+bmJfY2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgaWYgKHMtPm5iX2NoYW5uZWxzID4gV01BUFJPX01BWF9DSEFOTkVMUykgewogICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9yZSB0aGFuICVkIGNoYW5uZWxzIiwgV01BUFJPX01BWF9DSEFOTkVMUyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKICAgICAvKiogaW5pdCBwcmV2aW91cyBibG9jayBsZW4gKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYW5uZWxzOyBpKyspCiAgICAgICAgIHMtPmNoYW5uZWxbaV0ucHJldl9ibG9ja19sZW4gPSBzLT5zYW1wbGVzX3Blcl9mcmFtZTsKIAogICAgIC8qKiBleHRyYWN0IGxmZSBjaGFubmVsIHBvc2l0aW9uICovCkBAIC01MTksNiArNTM1LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBzLT5mZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYyhhdmN0eC0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0JJVEVYQUNUKTsKKyAgICBpZiAoIXMtPmZkc3ApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKICAgICAvKiogaW5pdCBNRENULCBGSVhNRTogb25seSBpbml0IG5lZWRlZCBzaXplcyAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBXTUFQUk9fQkxPQ0tfU0laRVM7IGkrKykKICAgICAgICAgZmZfbWRjdF9pbml0KCZzLT5tZGN0X2N0eFtpXSwgV01BUFJPX0JMT0NLX01JTl9CSVRTKzEraSwgMSwKQEAgLTU1Myw2ICs1NzMsMTggQEAKIH0KIAogLyoqCisgKkBicmllZiBJbml0aWFsaXplIHRoZSBkZWNvZGVyLgorICpAcGFyYW0gYXZjdHggY29kZWMgY29udGV4dAorICpAcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBhdl9jb2xkIGludCB3bWFwcm9fZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFdNQVByb0RlY29kZUN0eCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICByZXR1cm4gZGVjb2RlX2luaXQocywgYXZjdHgsIDApOworfQorCisvKioKICAqQGJyaWVmIERlY29kZSB0aGUgc3ViZnJhbWUgbGVuZ3RoLgogICpAcGFyYW0gcyBjb250ZXh0CiAgKkBwYXJhbSBvZmZzZXQgc2FtcGxlIG9mZnNldCBpbiB0aGUgZnJhbWUKQEAgLTYxMyw3ICs2NDUsNyBAQAogewogICAgIHVpbnQxNl90IG51bV9zYW1wbGVzW1dNQVBST19NQVhfQ0hBTk5FTFNdID0geyAwIH07LyoqPCBzdW0gb2Ygc2FtcGxlcyBmb3IgYWxsIGN1cnJlbnRseSBrbm93biBzdWJmcmFtZXMgb2YgYSBjaGFubmVsICovCiAgICAgdWludDhfdCAgY29udGFpbnNfc3ViZnJhbWVbV01BUFJPX01BWF9DSEFOTkVMU107ICAvKio8IGZsYWcgaW5kaWNhdGluZyBpZiBhIGNoYW5uZWwgY29udGFpbnMgdGhlIGN1cnJlbnQgc3ViZnJhbWUgKi8KLSAgICBpbnQgY2hhbm5lbHNfZm9yX2N1cl9zdWJmcmFtZSA9IHMtPmF2Y3R4LT5jaGFubmVsczsgLyoqPCBudW1iZXIgb2YgY2hhbm5lbHMgdGhhdCBjb250YWluIHRoZSBjdXJyZW50IHN1YmZyYW1lICovCisgICAgaW50IGNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWUgPSBzLT5uYl9jaGFubmVsczsgICAvKio8IG51bWJlciBvZiBjaGFubmVscyB0aGF0IGNvbnRhaW4gdGhlIGN1cnJlbnQgc3ViZnJhbWUgKi8KICAgICBpbnQgZml4ZWRfY2hhbm5lbF9sYXlvdXQgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qKjwgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYWxsIGNoYW5uZWxzIHVzZSB0aGUgc2FtZSBzdWJmcmFtZSBvZmZzZXRzIGFuZCBzaXplcyAqLwogICAgIGludCBtaW5fY2hhbm5lbF9sZW4gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzbWFsbGVzdCBzdW0gb2Ygc2FtcGxlcyAoY2hhbm5lbHMgd2l0aCB0aGlzIGxlbmd0aCB3aWxsIGJlIHByb2Nlc3NlZCBmaXJzdCkgKi8KICAgICBpbnQgYzsKQEAgLTYyNSw3ICs2NTcsNyBAQAogICAgICAqLwogCiAgICAgLyoqIHJlc2V0IHRpbGluZyBpbmZvcm1hdGlvbiAqLwotICAgIGZvciAoYyA9IDA7IGMgPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGMrKykKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY2hhbm5lbHM7IGMrKykKICAgICAgICAgcy0+Y2hhbm5lbFtjXS5udW1fc3ViZnJhbWVzID0gMDsKIAogICAgIGlmIChzLT5tYXhfbnVtX3N1YmZyYW1lcyA9PSAxIHx8IGdldF9iaXRzMSgmcy0+Z2IpKQpAQCAtNjM2LDcgKzY2OCw3IEBACiAgICAgICAgIGludCBzdWJmcmFtZV9sZW47CiAKICAgICAgICAgLyoqIGNoZWNrIHdoaWNoIGNoYW5uZWxzIGNvbnRhaW4gdGhlIHN1YmZyYW1lICovCi0gICAgICAgIGZvciAoYyA9IDA7IGMgPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY2hhbm5lbHM7IGMrKykgewogICAgICAgICAgICAgaWYgKG51bV9zYW1wbGVzW2NdID09IG1pbl9jaGFubmVsX2xlbikgewogICAgICAgICAgICAgICAgIGlmIChmaXhlZF9jaGFubmVsX2xheW91dCB8fCBjaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lID09IDEgfHwKICAgICAgICAgICAgICAgICAgICAobWluX2NoYW5uZWxfbGVuID09IHMtPnNhbXBsZXNfcGVyX2ZyYW1lIC0gcy0+bWluX3NhbXBsZXNfcGVyX3N1YmZyYW1lKSkKQEAgLTY1Myw3ICs2ODUsNyBAQAogCiAgICAgICAgIC8qKiBhZGQgc3ViZnJhbWVzIHRvIHRoZSBpbmRpdmlkdWFsIGNoYW5uZWxzIGFuZCBmaW5kIG5ldyBtaW5fY2hhbm5lbF9sZW4gKi8KICAgICAgICAgbWluX2NoYW5uZWxfbGVuICs9IHN1YmZyYW1lX2xlbjsKLSAgICAgICAgZm9yIChjID0gMDsgYyA8IHMtPmF2Y3R4LT5jaGFubmVsczsgYysrKSB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBzLT5uYl9jaGFubmVsczsgYysrKSB7CiAgICAgICAgICAgICBXTUFQcm9DaGFubmVsQ3R4KiBjaGFuID0gJnMtPmNoYW5uZWxbY107CiAKICAgICAgICAgICAgIGlmIChjb250YWluc19zdWJmcmFtZVtjXSkgewpAQCAtNjgwLDExICs3MTIsMTEgQEAKICAgICAgICAgfQogICAgIH0gd2hpbGUgKG1pbl9jaGFubmVsX2xlbiA8IHMtPnNhbXBsZXNfcGVyX2ZyYW1lKTsKIAotICAgIGZvciAoYyA9IDA7IGMgPCBzLT5hdmN0eC0+Y2hhbm5lbHM7IGMrKykgeworICAgIGZvciAoYyA9IDA7IGMgPCBzLT5uYl9jaGFubmVsczsgYysrKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmNoYW5uZWxbY10ubnVtX3N1YmZyYW1lczsgaSsrKSB7Ci0gICAgICAgICAgICBmZl9kbG9nKHMtPmF2Y3R4LCAiZnJhbWVbJWldIGNoYW5uZWxbJWldIHN1YmZyYW1lWyVpXSIKKyAgICAgICAgICAgIGZmX2Rsb2cocy0+YXZjdHgsICJmcmFtZVslIlBSSXUzMiJdIGNoYW5uZWxbJWldIHN1YmZyYW1lWyVpXSIKICAgICAgICAgICAgICAgICAgICAgIiBsZW4gJWlcbiIsIHMtPmZyYW1lX251bSwgYywgaSwKICAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5zdWJmcmFtZV9sZW5baV0pOwogICAgICAgICAgICAgcy0+Y2hhbm5lbFtjXS5zdWJmcmFtZV9vZmZzZXRbaV0gPSBvZmZzZXQ7CkBAIC03MDYsOCArNzM4LDggQEAKICAgICBpbnQgaTsKICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICBpbnQ4X3Qgcm90YXRpb25fb2Zmc2V0W1dNQVBST19NQVhfQ0hBTk5FTFMgKiBXTUFQUk9fTUFYX0NIQU5ORUxTXTsKLSAgICBtZW1zZXQoY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXgsIDAsIHMtPmF2Y3R4LT5jaGFubmVscyAqCi0gICAgICAgICAgIHMtPmF2Y3R4LT5jaGFubmVscyAqIHNpemVvZigqY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXgpKTsKKyAgICBtZW1zZXQoY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXgsIDAsIHMtPm5iX2NoYW5uZWxzICoKKyAgICAgICAgICAgcy0+bmJfY2hhbm5lbHMgKiBzaXplb2YoKmNoZ3JvdXAtPmRlY29ycmVsYXRpb25fbWF0cml4KSk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgY2hncm91cC0+bnVtX2NoYW5uZWxzICogKGNoZ3JvdXAtPm51bV9jaGFubmVscyAtIDEpID4+IDE7IGkrKykKICAgICAgICAgcm90YXRpb25fb2Zmc2V0W2ldID0gZ2V0X2JpdHMoJnMtPmdiLCA2KTsKQEAgLTc2MCw3ICs3OTIsNyBAQAogCiAgICAgLyoqIGluIHRoZSBvbmUgY2hhbm5lbCBjYXNlIGNoYW5uZWwgdHJhbnNmb3JtcyBhcmUgcG9pbnRsZXNzICovCiAgICAgcy0+bnVtX2NoZ3JvdXBzID0gMDsKLSAgICBpZiAocy0+YXZjdHgtPmNoYW5uZWxzID4gMSkgeworICAgIGlmIChzLT5uYl9jaGFubmVscyA+IDEpIHsKICAgICAgICAgaW50IHJlbWFpbmluZ19jaGFubmVscyA9IHMtPmNoYW5uZWxzX2Zvcl9jdXJfc3ViZnJhbWU7CiAKICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CkBAIC04MDcsNyArODM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGNoZ3JvdXAtPnRyYW5zZm9ybSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLT5hdmN0eC0+Y2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bmJfY2hhbm5lbHMgPT0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbMF0gPSAgMS4wOwogICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbMV0gPSAtMS4wOwogICAgICAgICAgICAgICAgICAgICAgICAgY2hncm91cC0+ZGVjb3JyZWxhdGlvbl9tYXRyaXhbMl0gPSAgMS4wOwpAQCAtMTA5Nyw3ICsxMTI5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmNoKVt5XSA9IHN1bTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+YXZjdHgtPmNoYW5uZWxzID09IDIpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPm5iX2NoYW5uZWxzID09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IEZGTUlOKHNmYlsxXSwgcy0+c3ViZnJhbWVfbGVuKSAtIHNmYlswXTsKICAgICAgICAgICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKGNoX2RhdGFbMF0gKyBzZmJbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoX2RhdGFbMF0gKyBzZmJbMF0sCkBAIC0xMTUwLDcgKzExODIsNyBAQAogICAgIGludCBvZmZzZXQgPSBzLT5zYW1wbGVzX3Blcl9mcmFtZTsKICAgICBpbnQgc3ViZnJhbWVfbGVuID0gcy0+c2FtcGxlc19wZXJfZnJhbWU7CiAgICAgaW50IGk7Ci0gICAgaW50IHRvdGFsX3NhbXBsZXMgICA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lICogcy0+YXZjdHgtPmNoYW5uZWxzOworICAgIGludCB0b3RhbF9zYW1wbGVzICAgPSBzLT5zYW1wbGVzX3Blcl9mcmFtZSAqIHMtPm5iX2NoYW5uZWxzOwogICAgIGludCB0cmFuc21pdF9jb2VmZnMgPSAwOwogICAgIGludCBjdXJfc3Vid29vZmVyX2N1dG9mZjsKIApAQCAtMTE2MCw3ICsxMTkyLDcgQEAKICAgICAgICAgPT0gdGhlIG5leHQgYmxvY2sgb2YgdGhlIGNoYW5uZWwgd2l0aCB0aGUgc21hbGxlc3QgbnVtYmVyIG9mCiAgICAgICAgIGRlY29kZWQgc2FtcGxlcwogICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IHMtPmF2Y3R4LT5jaGFubmVsczsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NoYW5uZWxzOyBpKyspIHsKICAgICAgICAgcy0+Y2hhbm5lbFtpXS5ncm91cGVkID0gMDsKICAgICAgICAgaWYgKG9mZnNldCA+IHMtPmNoYW5uZWxbaV0uZGVjb2RlZF9zYW1wbGVzKSB7CiAgICAgICAgICAgICBvZmZzZXQgPSBzLT5jaGFubmVsW2ldLmRlY29kZWRfc2FtcGxlczsKQEAgLTExNzQsNyArMTIwNiw3IEBACiAKICAgICAvKiogZ2V0IGEgbGlzdCBvZiBhbGwgY2hhbm5lbHMgdGhhdCBjb250YWluIHRoZSBlc3RpbWF0ZWQgYmxvY2sgKi8KICAgICBzLT5jaGFubmVsc19mb3JfY3VyX3N1YmZyYW1lID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+YXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhbm5lbHM7IGkrKykgewogICAgICAgICBjb25zdCBpbnQgY3VyX3N1YmZyYW1lID0gcy0+Y2hhbm5lbFtpXS5jdXJfc3ViZnJhbWU7CiAgICAgICAgIC8qKiBzdWJ0cmFjdCBhbHJlYWR5IHByb2Nlc3NlZCBzYW1wbGVzICovCiAgICAgICAgIHRvdGFsX3NhbXBsZXMgLT0gcy0+Y2hhbm5lbFtpXS5kZWNvZGVkX3NhbXBsZXM7CkBAIC0xMzg3LDExICsxNDE5LDEwIEBACiAgKi8KIHN0YXRpYyBpbnQgZGVjb2RlX2ZyYW1lKFdNQVByb0RlY29kZUN0eCAqcywgQVZGcmFtZSAqZnJhbWUsIGludCAqZ290X2ZyYW1lX3B0cikKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5hdmN0eDsKICAgICBHZXRCaXRDb250ZXh0KiBnYiA9ICZzLT5nYjsKICAgICBpbnQgbW9yZV9mcmFtZXMgPSAwOwogICAgIGludCBsZW4gPSAwOwotICAgIGludCBpLCByZXQ7CisgICAgaW50IGk7CiAKICAgICAvKiogZ2V0IGZyYW1lIGxlbmd0aCAqLwogICAgIGlmIChzLT5sZW5fcHJlZml4KQpAQCAtMTQwNiw5ICsxNDM3LDkgQEAKICAgICB9CiAKICAgICAvKiogcmVhZCBwb3N0cHJvYyB0cmFuc2Zvcm0gKi8KLSAgICBpZiAocy0+YXZjdHgtPmNoYW5uZWxzID4gMSAmJiBnZXRfYml0czEoZ2IpKSB7CisgICAgaWYgKHMtPm5iX2NoYW5uZWxzID4gMSAmJiBnZXRfYml0czEoZ2IpKSB7CiAgICAgICAgIGlmIChnZXRfYml0czEoZ2IpKSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzICogYXZjdHgtPmNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhbm5lbHMgKiBzLT5uYl9jaGFubmVsczsgaSsrKQogICAgICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgNCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDQzLDcgKzE0NzQsNyBAQAogCiAgICAgLyoqIHJlc2V0IHN1YmZyYW1lIHN0YXRlcyAqLwogICAgIHMtPnBhcnNlZF9hbGxfc3ViZnJhbWVzID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhbm5lbHM7IGkrKykgewogICAgICAgICBzLT5jaGFubmVsW2ldLmRlY29kZWRfc2FtcGxlcyA9IDA7CiAgICAgICAgIHMtPmNoYW5uZWxbaV0uY3VyX3N1YmZyYW1lICAgID0gMDsKICAgICAgICAgcy0+Y2hhbm5lbFtpXS5yZXVzZV9zZiAgICAgICAgPSAwOwpAQCAtMTQ1NywxOSArMTQ4OCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KLSAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lOwotICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApIHsKLSAgICAgICAgcy0+cGFja2V0X2xvc3MgPSAxOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KICAgICAvKiogY29weSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgZm9yIChpID0gMDsgaSA8IGF2Y3R4LT5jaGFubmVsczsgaSsrKQorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFubmVsczsgaSsrKQogICAgICAgICBtZW1jcHkoZnJhbWUtPmV4dGVuZGVkX2RhdGFbaV0sIHMtPmNoYW5uZWxbaV0ub3V0LAogICAgICAgICAgICAgICAgcy0+c2FtcGxlc19wZXJfZnJhbWUgKiBzaXplb2YoKnMtPmNoYW5uZWxbaV0ub3V0KSk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgYXZjdHgtPmNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhbm5lbHM7IGkrKykgewogICAgICAgICAvKiogcmV1c2Ugc2Vjb25kIGhhbGYgb2YgdGhlIElNRENUIG91dHB1dCBmb3IgdGhlIG5leHQgZnJhbWUgKi8KICAgICAgICAgbWVtY3B5KCZzLT5jaGFubmVsW2ldLm91dFswXSwKICAgICAgICAgICAgICAgICZzLT5jaGFubmVsW2ldLm91dFtzLT5zYW1wbGVzX3Blcl9mcmFtZV0sCkBAIC0xNTc0LDE3ICsxNTk4LDkgQEAKICAgICBza2lwX2JpdHMoJnMtPmdiLCBzLT5mcmFtZV9vZmZzZXQpOwogfQogCi0vKioKLSAqQGJyaWVmIERlY29kZSBhIHNpbmdsZSBXTUEgcGFja2V0LgotICpAcGFyYW0gYXZjdHggY29kZWMgY29udGV4dAotICpAcGFyYW0gZGF0YSB0aGUgb3V0cHV0IGJ1ZmZlcgotICpAcGFyYW0gYXZwa3QgaW5wdXQgcGFja2V0Ci0gKkByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZSByZWFkIGZyb20gdGhlIGlucHV0IGJ1ZmZlcgotICovCi1zdGF0aWMgaW50IGRlY29kZV9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQqIGF2cGt0KQorc3RhdGljIGludCBkZWNvZGVfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgV01BUHJvRGVjb2RlQ3R4ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCAqZ290X2ZyYW1lX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQogewotICAgIFdNQVByb0RlY29kZUN0eCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgR2V0Qml0Q29udGV4dCogZ2IgID0gJnMtPnBnYjsKICAgICBjb25zdCB1aW50OF90KiBidWYgPSBhdnBrdC0+ZGF0YTsKICAgICBpbnQgYnVmX3NpemUgICAgICAgPSBhdnBrdC0+c2l6ZTsKQEAgLTE1OTMsMTEgKzE2MDksNiBAQAogCiAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOwogCi0gICAgaWYgKHMtPnNraXBfcGFja2V0cyA+IDApIHsKLSAgICAgICAgcy0+c2tpcF9wYWNrZXRzLS07Ci0gICAgICAgIHJldHVybiBGRk1JTihhdnBrdC0+c2l6ZSwgYXZjdHgtPmJsb2NrX2FsaWduKTsKLSAgICB9Ci0KICAgICBpZiAocy0+cGFja2V0X2RvbmUgfHwgcy0+cGFja2V0X2xvc3MpIHsKICAgICAgICAgcy0+cGFja2V0X2RvbmUgPSAwOwogCkBAIC0xNjIzLDcgKzE2MzQsOCBAQAogICAgICAgICAgICAgcGFja2V0X3NlcXVlbmNlX251bWJlciA9IGdldF9iaXRzKGdiLCA0KTsKICAgICAgICAgICAgIHNraXBfYml0cyhnYiwgMik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzLT5udW1fZnJhbWVzID0gZ2V0X2JpdHMoZ2IsIDYpOworICAgICAgICAgICAgaW50IG51bV9mcmFtZXMgPSBnZXRfYml0cyhnYiwgNik7CisgICAgICAgICAgICBmZl9kbG9nKGF2Y3R4LCAicGFja2V0WyVkXTogbnVtYmVyIG9mIGZyYW1lcyAlZFxuIiwgYXZjdHgtPmZyYW1lX251bWJlciwgbnVtX2ZyYW1lcyk7CiAgICAgICAgICAgICBwYWNrZXRfc2VxdWVuY2VfbnVtYmVyID0gMDsKICAgICAgICAgfQogCkBAIC0xNjMyLDEzICsxNjQ0LDE0IEBACiAgICAgICAgIGlmIChhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV01BUFJPKSB7CiAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDMpOwogICAgICAgICAgICAgcy0+c2tpcF9wYWNrZXRzID0gZ2V0X2JpdHMoZ2IsIDgpOworICAgICAgICAgICAgZmZfZGxvZyhhdmN0eCwgInBhY2tldFslZF06IHNraXAgcGFja2V0cyAlZFxuIiwgYXZjdHgtPmZyYW1lX251bWJlciwgcy0+c2tpcF9wYWNrZXRzKTsKICAgICAgICAgfQogCiAgICAgICAgIGZmX2Rsb2coYXZjdHgsICJwYWNrZXRbJWRdOiBuYnBmICV4XG4iLCBhdmN0eC0+ZnJhbWVfbnVtYmVyLAogICAgICAgICAgICAgICAgIG51bV9iaXRzX3ByZXZfZnJhbWUpOwogCiAgICAgICAgIC8qKiBjaGVjayBmb3IgcGFja2V0IGxvc3MgKi8KLSAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9YTUEyICYmICFzLT5wYWNrZXRfbG9zcyAmJgorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVBSTyAmJiAhcy0+cGFja2V0X2xvc3MgJiYKICAgICAgICAgICAgICgocy0+cGFja2V0X3NlcXVlbmNlX251bWJlciArIDEpICYgMHhGKSAhPSBwYWNrZXRfc2VxdWVuY2VfbnVtYmVyKSB7CiAgICAgICAgICAgICBzLT5wYWNrZXRfbG9zcyA9IDE7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKQEAgLTE2NzUsNyArMTY4OCw2IEBACiAgICAgICAgICAgICBzLT5udW1fc2F2ZWRfYml0cyA9IDA7CiAgICAgICAgICAgICBzLT5wYWNrZXRfbG9zcyA9IDA7CiAgICAgICAgIH0KLQogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBmcmFtZV9zaXplOwogICAgICAgICBzLT5idWZfYml0X3NpemUgPSAoYXZwa3QtPnNpemUgLSBzLT5uZXh0X3BhY2tldF9zdGFydCkgPDwgMzsKQEAgLTE2OTcsOCArMTcwOSw5IEBACiAgICAgICAgICAgICAgICAgdGhlICJwcmV2aW91cyBmcmFtZSIgZGF0YSBmcm9tIHRoZSBuZXh0IHBhY2tldCBzbyB0aGF0CiAgICAgICAgICAgICAgICAgd2UgZ2V0IGEgYnVmZmVyIHRoYXQgb25seSBjb250YWlucyBmdWxsIGZyYW1lcyAqLwogICAgICAgICAgICAgcy0+cGFja2V0X2RvbmUgPSAhZGVjb2RlX2ZyYW1lKHMsIGRhdGEsIGdvdF9mcmFtZV9wdHIpOwotICAgICAgICB9IGVsc2UKKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHMtPnBhY2tldF9kb25lID0gMTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZW1haW5pbmdfYml0cyhzLCBnYikgPCAwKSB7CkBAIC0xNzIxLDE5ICsxNzM0LDIxOCBAQAogfQogCiAvKioKLSAqQGJyaWVmIENsZWFyIGRlY29kZXIgYnVmZmVycyAoZm9yIHNlZWtpbmcpLgorICpAYnJpZWYgRGVjb2RlIGEgc2luZ2xlIFdNQSBwYWNrZXQuCiAgKkBwYXJhbSBhdmN0eCBjb2RlYyBjb250ZXh0CisgKkBwYXJhbSBkYXRhIHRoZSBvdXRwdXQgYnVmZmVyCisgKkBwYXJhbSBhdnBrdCBpbnB1dCBwYWNrZXQKKyAqQHJldHVybiBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIHJlYWQgZnJvbSB0aGUgaW5wdXQgYnVmZmVyCiAgKi8KLXN0YXRpYyB2b2lkIGZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3N0YXRpYyBpbnQgd21hcHJvX2RlY29kZV9wYWNrZXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZV9wdHIsIEFWUGFja2V0ICphdnBrdCkKIHsKICAgICBXTUFQcm9EZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgLyogZ2V0IG91dHB1dCBidWZmZXIgKi8KKyAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHMtPnNhbXBsZXNfcGVyX2ZyYW1lOworICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApIHsKKyAgICAgICAgcy0+cGFja2V0X2xvc3MgPSAxOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gZGVjb2RlX3BhY2tldChhdmN0eCwgcywgZGF0YSwgZ290X2ZyYW1lX3B0ciwgYXZwa3QpOworfQorCitzdGF0aWMgaW50IHhtYV9kZWNvZGVfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3RfZnJhbWVfcHRyLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgWE1BRGVjb2RlQ3R4ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgZ290X3N0cmVhbV9mcmFtZV9wdHIgPSAwOworICAgIEFWRnJhbWUgKmZyYW1lID0gZGF0YTsKKyAgICBpbnQgaSwgcmV0LCBvZmZzZXQgPSBJTlRfTUFYOworCisgICAgLyogZGVjb2RlIGN1cnJlbnQgc3RyZWFtIHBhY2tldCAqLworICAgIHJldCA9IGRlY29kZV9wYWNrZXQoYXZjdHgsICZzLT54bWFbcy0+Y3VycmVudF9zdHJlYW1dLCBzLT5mcmFtZXNbcy0+Y3VycmVudF9zdHJlYW1dLAorICAgICAgICAgICAgICAgICAgICAgICAgJmdvdF9zdHJlYW1fZnJhbWVfcHRyLCBhdnBrdCk7CisKKyAgICAvKiBjb3B5IHN0cmVhbSBzYW1wbGVzICgxLzJjaCkgdG8gc2FtcGxlIGJ1ZmZlciAoTmNoKSAqLworICAgIGlmIChnb3Rfc3RyZWFtX2ZyYW1lX3B0cikgeworICAgICAgICBpbnQgc3RhcnRfY2ggPSBzLT5zdGFydF9jaGFubmVsW3MtPmN1cnJlbnRfc3RyZWFtXTsKKyAgICAgICAgbWVtY3B5KCZzLT5zYW1wbGVzW3N0YXJ0X2NoICsgMF1bcy0+b2Zmc2V0W3MtPmN1cnJlbnRfc3RyZWFtXSAqIDUxMl0sCisgICAgICAgICAgICAgICBzLT5mcmFtZXNbcy0+Y3VycmVudF9zdHJlYW1dLT5leHRlbmRlZF9kYXRhWzBdLCA1MTIgKiA0KTsKKyAgICAgICAgaWYgKHMtPnhtYVtzLT5jdXJyZW50X3N0cmVhbV0ubmJfY2hhbm5lbHMgPiAxKQorICAgICAgICAgICAgbWVtY3B5KCZzLT5zYW1wbGVzW3N0YXJ0X2NoICsgMV1bcy0+b2Zmc2V0W3MtPmN1cnJlbnRfc3RyZWFtXSAqIDUxMl0sCisgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWVzW3MtPmN1cnJlbnRfc3RyZWFtXS0+ZXh0ZW5kZWRfZGF0YVsxXSwgNTEyICogNCk7CisgICAgICAgIHMtPm9mZnNldFtzLT5jdXJyZW50X3N0cmVhbV0rKzsKKyAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgbWVtc2V0KHMtPm9mZnNldCwgMCwgc2l6ZW9mKHMtPm9mZnNldCkpOworICAgICAgICBzLT5jdXJyZW50X3N0cmVhbSA9IDA7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyogZmluZCBuZXh0IFhNQSBwYWNrZXQncyBvd25lciBzdHJlYW0sIGFuZCB1cGRhdGUuCisgICAgICogWE1BIHN0cmVhbXMgZmluZCB0aGVpciBwYWNrZXRzIGZvbGxvd2luZyBwYWNrZXRfc2tpcHMKKyAgICAgKiAoYXQgc3RhcnQgdGhlcmUgaXMgb25lIHBhY2tldCBwZXIgc3RyZWFtLCB0aGVuIGludGVybGVhdmUgbm9uLWxpbmVhcmx5KS4gKi8KKyAgICBpZiAocy0+eG1hW3MtPmN1cnJlbnRfc3RyZWFtXS5wYWNrZXRfZG9uZSB8fAorICAgICAgICBzLT54bWFbcy0+Y3VycmVudF9zdHJlYW1dLnBhY2tldF9sb3NzKSB7CisKKyAgICAgICAgLyogc2VsZWN0IHN0cmVhbSB3aXRoIDAgc2tpcF9wYWNrZXRzICg9IHVzZXMgbmV4dCBwYWNrZXQpICovCisgICAgICAgIGlmIChzLT54bWFbcy0+Y3VycmVudF9zdHJlYW1dLnNraXBfcGFja2V0cyAhPSAwKSB7CisgICAgICAgICAgICBpbnQgbWluWzJdOworCisgICAgICAgICAgICBtaW5bMF0gPSBzLT54bWFbMF0uc2tpcF9wYWNrZXRzOworICAgICAgICAgICAgbWluWzFdID0gaSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPnhtYVtpXS5za2lwX3BhY2tldHMgPCBtaW5bMF0pIHsKKyAgICAgICAgICAgICAgICAgICAgbWluWzBdID0gcy0+eG1hW2ldLnNraXBfcGFja2V0czsKKyAgICAgICAgICAgICAgICAgICAgbWluWzFdID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfc3RyZWFtID0gbWluWzFdOworICAgICAgICB9CisKKyAgICAgICAgLyogYWxsIG90aGVyIHN0cmVhbXMgc2tpcCBuZXh0IHBhY2tldCAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bnVtX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgcy0+eG1hW2ldLnNraXBfcGFja2V0cyA9IEZGTUFYKDAsIHMtPnhtYVtpXS5za2lwX3BhY2tldHMgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGNvcHkgc2FtcGxlcyBmcm9tIGJ1ZmZlciB0byBvdXRwdXQgaWYgcG9zc2libGUgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIG9mZnNldCA9IEZGTUlOKG9mZnNldCwgcy0+b2Zmc2V0W2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgaW50IGJyZXQ7CisKKyAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gNTEyICogb2Zmc2V0OworICAgICAgICAgICAgaWYgKChicmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIGJyZXQ7CisKKyAgICAgICAgICAgIC8qIGNvcHkgc2FtcGxlcyBidWZmZXIgKE5jaCkgdG8gZnJhbWUgc2FtcGxlcyAoTmNoKSwgbW92ZSB1bmNvbnN1bWVkIHNhbXBsZXMgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2NoID0gcy0+c3RhcnRfY2hhbm5lbFtpXTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZnJhbWUtPmV4dGVuZGVkX2RhdGFbc3RhcnRfY2ggKyAwXSwgcy0+c2FtcGxlc1tzdGFydF9jaCArIDBdLCBmcmFtZS0+bmJfc2FtcGxlcyAqIDQpOworICAgICAgICAgICAgICAgIGlmIChzLT54bWFbaV0ubmJfY2hhbm5lbHMgPiAxKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZnJhbWUtPmV4dGVuZGVkX2RhdGFbc3RhcnRfY2ggKyAxXSwgcy0+c2FtcGxlc1tzdGFydF9jaCArIDFdLCBmcmFtZS0+bmJfc2FtcGxlcyAqIDQpOworCisgICAgICAgICAgICAgICAgcy0+b2Zmc2V0W2ldIC09IG9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAocy0+b2Zmc2V0W2ldKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUocy0+c2FtcGxlc1tzdGFydF9jaCArIDBdLCBzLT5zYW1wbGVzW3N0YXJ0X2NoICsgMF0gKyBmcmFtZS0+bmJfc2FtcGxlcywgcy0+b2Zmc2V0W2ldICogNCAqIDUxMik7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT54bWFbaV0ubmJfY2hhbm5lbHMgPiAxKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtbW92ZShzLT5zYW1wbGVzW3N0YXJ0X2NoICsgMV0sIHMtPnNhbXBsZXNbc3RhcnRfY2ggKyAxXSArIGZyYW1lLT5uYl9zYW1wbGVzLCBzLT5vZmZzZXRbaV0gKiA0ICogNTEyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB4bWFfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFhNQURlY29kZUN0eCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IGksIHJldCwgc3RhcnRfY2hhbm5lbHMgPSAwOworCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA8PSAwIHx8IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIGdldCBzdHJlYW0gY29uZmlnICovCisgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YTUEyICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9PSAzNCkgeyAvKiBYTUEyV0FWRUZPUk1BVEVYICovCisgICAgICAgIHMtPm51bV9zdHJlYW1zID0gKGF2Y3R4LT5jaGFubmVscyArIDEpIC8gMjsKKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YTUEyICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+PSAyKSB7IC8qIFhNQTJXQVZFRk9STUFUICovCisgICAgICAgIHMtPm51bV9zdHJlYW1zID0gYXZjdHgtPmV4dHJhZGF0YVsxXTsKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSAoMzIgKyAoKGF2Y3R4LT5leHRyYWRhdGFbMF09PTMpPzA6OCkgKyA0KnMtPm51bV9zdHJlYW1zKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgWE1BMiBleHRyYWRhdGEgc2l6ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWE1BMSAmJiBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPj0gNCkgeyAvKiBYTUFXQVZFRk9STUFUICovCisgICAgICAgIHMtPm51bV9zdHJlYW1zID0gYXZjdHgtPmV4dHJhZGF0YVs0XTsKKyAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAhPSAoOCArIDIwKnMtPm51bV9zdHJlYW1zKSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgWE1BMSBleHRyYWRhdGEgc2l6ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgWE1BIGNvbmZpZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLyogZW5jb2RlciBzdXBwb3J0cyB1cCB0byA2NCBzdHJlYW1zIC8gNjQqMiBjaGFubmVscyAod291bGQgaGF2ZSB0byBhbGxvYyBhcnJheXMpICovCisgICAgaWYgKGF2Y3R4LT5jaGFubmVscyA+IFhNQV9NQVhfQ0hBTk5FTFMgfHwgcy0+bnVtX3N0cmVhbXMgPiBYTUFfTUFYX1NUUkVBTVMpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiTW9yZSB0aGFuICVkIGNoYW5uZWxzIGluICVkIHN0cmVhbXMiLCBYTUFfTUFYX0NIQU5ORUxTLCBzLT5udW1fc3RyZWFtcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICAvKiBpbml0IGFsbCBzdHJlYW1zIChzZXZlcmFsIHN0cmVhbXMgb2YgMS8yY2ggbWFrZSBOY2ggZmlsZXMpICovCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm51bV9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgcmV0ID0gZGVjb2RlX2luaXQoJnMtPnhtYVtpXSwgYXZjdHgsIGkpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHMtPmZyYW1lc1tpXSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghcy0+ZnJhbWVzW2ldKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcy0+ZnJhbWVzW2ldLT5uYl9zYW1wbGVzID0gNTEyOworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHMtPmZyYW1lc1tpXSwgMCkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPnN0YXJ0X2NoYW5uZWxbaV0gPSBzdGFydF9jaGFubmVsczsKKyAgICAgICAgc3RhcnRfY2hhbm5lbHMgKz0gcy0+eG1hW2ldLm5iX2NoYW5uZWxzOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB4bWFfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWE1BRGVjb2RlQ3R4ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGRlY29kZV9lbmQoJnMtPnhtYVtpXSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lc1tpXSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZsdXNoKFdNQVByb0RlY29kZUN0eCAqcykKK3sKICAgICBpbnQgaTsKICAgICAvKiogcmVzZXQgb3V0cHV0IGJ1ZmZlciBhcyBhIHBhcnQgb2YgaXQgaXMgdXNlZCBkdXJpbmcgdGhlIHdpbmRvd2luZyBvZiBhCiAgICAgICAgIG5ldyBmcmFtZSAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+Y2hhbm5lbHM7IGkrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhbm5lbHM7IGkrKykKICAgICAgICAgbWVtc2V0KHMtPmNoYW5uZWxbaV0ub3V0LCAwLCBzLT5zYW1wbGVzX3Blcl9mcmFtZSAqCiAgICAgICAgICAgICAgICBzaXplb2YoKnMtPmNoYW5uZWxbaV0ub3V0KSk7CiAgICAgcy0+cGFja2V0X2xvc3MgPSAxOworICAgIHMtPnNraXBfcGFja2V0cyA9IDA7Cit9CisKKworLyoqCisgKkBicmllZiBDbGVhciBkZWNvZGVyIGJ1ZmZlcnMgKGZvciBzZWVraW5nKS4KKyAqQHBhcmFtIGF2Y3R4IGNvZGVjIGNvbnRleHQKKyAqLworc3RhdGljIHZvaWQgd21hcHJvX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBXTUFQcm9EZWNvZGVDdHggKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmx1c2gocyk7Cit9CisKK3N0YXRpYyB2b2lkIHhtYV9mbHVzaChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWE1BRGVjb2RlQ3R4ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5udW1fc3RyZWFtczsgaSsrKQorICAgICAgICBmbHVzaCgmcy0+eG1hW2ldKTsKKworICAgIG1lbXNldChzLT5vZmZzZXQsIDAsIHNpemVvZihzLT5vZmZzZXQpKTsKKyAgICBzLT5jdXJyZW50X3N0cmVhbSA9IDA7CiB9CiAKIApAQCAtMTc0NiwxMSArMTk1OCwxMSBAQAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XTUFQUk8sCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFdNQVByb0RlY29kZUN0eCksCi0gICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCi0gICAgLmNsb3NlICAgICAgICAgID0gZGVjb2RlX2VuZCwKLSAgICAuZGVjb2RlICAgICAgICAgPSBkZWNvZGVfcGFja2V0LAorICAgIC5pbml0ICAgICAgICAgICA9IHdtYXByb19kZWNvZGVfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgPSB3bWFwcm9fZGVjb2RlX2VuZCwKKyAgICAuZGVjb2RlICAgICAgICAgPSB3bWFwcm9fZGVjb2RlX3BhY2tldCwKICAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfU1VCRlJBTUVTIHwgQVZfQ09ERUNfQ0FQX0RSMSwKLSAgICAuZmx1c2ggICAgICAgICAgPSBmbHVzaCwKKyAgICAuZmx1c2ggICAgICAgICAgPSB3bWFwcm9fZmx1c2gsCiAgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKIH07CkBAIC0xNzYwLDEyICsxOTcyLDExIEBACiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhib3ggTWVkaWEgQXVkaW8gMSIpLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9YTUExLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXTUFQcm9EZWNvZGVDdHgpLAotICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAotICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCi0gICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX3BhY2tldCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWE1BRGVjb2RlQ3R4KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB4bWFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0geG1hX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0geG1hX2RlY29kZV9wYWNrZXQsCiAgICAgLmNhcGFiaWxpdGllcyAgID0gQVZfQ09ERUNfQ0FQX1NVQkZSQU1FUyB8IEFWX0NPREVDX0NBUF9EUjEsCi0gICAgLmZsdXNoICAgICAgICAgID0gZmx1c2gsCiAgICAgLnNhbXBsZV9mbXRzICAgID0gKGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXRbXSkgeyBBVl9TQU1QTEVfRk1UX0ZMVFAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUgfSwKIH07CkBAIC0xNzc1LDEyICsxOTg2LDEyIEBACiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlhib3ggTWVkaWEgQXVkaW8gMiIpLAogICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9YTUEyLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihXTUFQcm9EZWNvZGVDdHgpLAotICAgIC5pbml0ICAgICAgICAgICA9IGRlY29kZV9pbml0LAotICAgIC5jbG9zZSAgICAgICAgICA9IGRlY29kZV9lbmQsCi0gICAgLmRlY29kZSAgICAgICAgID0gZGVjb2RlX3BhY2tldCwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWE1BRGVjb2RlQ3R4KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSB4bWFfZGVjb2RlX2luaXQsCisgICAgLmNsb3NlICAgICAgICAgID0geG1hX2RlY29kZV9lbmQsCisgICAgLmRlY29kZSAgICAgICAgID0geG1hX2RlY29kZV9wYWNrZXQsCisgICAgLmZsdXNoICAgICAgICAgID0geG1hX2ZsdXNoLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9TVUJGUkFNRVMgfCBBVl9DT0RFQ19DQVBfRFIxLAotICAgIC5mbHVzaCAgICAgICAgICA9IGZsdXNoLAogICAgIC5zYW1wbGVfZm10cyAgICA9IChjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0W10pIHsgQVZfU0FNUExFX0ZNVF9GTFRQLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FIH0sCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy93bWF2b2ljZS5jIGIvbGliYXZjb2RlYy93bWF2b2ljZS5jCmluZGV4IDAyOWRmZGQuLjQ0NGUzMDMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvd21hdm9pY2UuYworKysgYi9saWJhdmNvZGVjL3dtYXZvaWNlLmMKQEAgLTMwLDYgKzMwLDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWQuaCIKICNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJnZXRfYml0cy5oIgpAQCAtMTA0LDI2ICsxMDUsMjQgQEAKICAgICB1aW50OF90IGRibF9wdWxzZXM7ICAgLy8vPCBob3cgbWFueSBwdWxzZSB2ZWN0b3JzIGhhdmUgcHVsc2UgcGFpcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCAocmF0aGVyIHRoYW4ganVzdCBvbmUgc2luZ2xlIHB1bHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG9ubHkgaWYgI2ZjYl90eXBlID09ICNGQ0JfVFlQRV9FWENfUFVMU0VTCi0gICAgdWludDE2X3QgZnJhbWVfc2l6ZTsgIC8vLzwgdGhlIGFtb3VudCBvZiBiaXRzIHRoYXQgbWFrZSB1cCB0aGUgYmxvY2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBkYXRhIChwZXIgZnJhbWUpCiB9IGZyYW1lX2Rlc2NzWzE3XSA9IHsKLSAgICB7IDEsIDAsIEFDQl9UWVBFX05PTkUsICAgICAgIEZDQl9UWVBFX1NJTEVOQ0UsICAgIDAsICAgMCB9LAotICAgIHsgMiwgMSwgQUNCX1RZUEVfTk9ORSwgICAgICAgRkNCX1RZUEVfSEFSRENPREVELCAgMCwgIDI4IH0sCi0gICAgeyAyLCAxLCBBQ0JfVFlQRV9BU1lNTUVUUklDLCBGQ0JfVFlQRV9BV19QVUxTRVMsICAwLCAgNDYgfSwKLSAgICB7IDIsIDEsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIsICA4MCB9LAotICAgIHsgMiwgMSwgQUNCX1RZUEVfQVNZTU1FVFJJQywgRkNCX1RZUEVfRVhDX1BVTFNFUywgNSwgMTA0IH0sCi0gICAgeyA0LCAyLCBBQ0JfVFlQRV9BU1lNTUVUUklDLCBGQ0JfVFlQRV9FWENfUFVMU0VTLCAwLCAxMDggfSwKLSAgICB7IDQsIDIsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIsIDEzMiB9LAotICAgIHsgNCwgMiwgQUNCX1RZUEVfQVNZTU1FVFJJQywgRkNCX1RZUEVfRVhDX1BVTFNFUywgNSwgMTY4IH0sCi0gICAgeyAyLCAxLCBBQ0JfVFlQRV9IQU1NSU5HLCAgICBGQ0JfVFlQRV9FWENfUFVMU0VTLCAwLCAgNjQgfSwKLSAgICB7IDIsIDEsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIsICA4MCB9LAotICAgIHsgMiwgMSwgQUNCX1RZUEVfSEFNTUlORywgICAgRkNCX1RZUEVfRVhDX1BVTFNFUywgNSwgMTA0IH0sCi0gICAgeyA0LCAyLCBBQ0JfVFlQRV9IQU1NSU5HLCAgICBGQ0JfVFlQRV9FWENfUFVMU0VTLCAwLCAxMDggfSwKLSAgICB7IDQsIDIsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIsIDEzMiB9LAotICAgIHsgNCwgMiwgQUNCX1RZUEVfSEFNTUlORywgICAgRkNCX1RZUEVfRVhDX1BVTFNFUywgNSwgMTY4IH0sCi0gICAgeyA4LCAzLCBBQ0JfVFlQRV9IQU1NSU5HLCAgICBGQ0JfVFlQRV9FWENfUFVMU0VTLCAwLCAxNzYgfSwKLSAgICB7IDgsIDMsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIsIDIwOCB9LAotICAgIHsgOCwgMywgQUNCX1RZUEVfSEFNTUlORywgICAgRkNCX1RZUEVfRVhDX1BVTFNFUywgNSwgMjU2IH0KKyAgICB7IDEsIDAsIEFDQl9UWVBFX05PTkUsICAgICAgIEZDQl9UWVBFX1NJTEVOQ0UsICAgIDAgfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX05PTkUsICAgICAgIEZDQl9UWVBFX0hBUkRDT0RFRCwgIDAgfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0FXX1BVTFNFUywgIDAgfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIgfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDUgfSwKKyAgICB7IDQsIDIsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDAgfSwKKyAgICB7IDQsIDIsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIgfSwKKyAgICB7IDQsIDIsIEFDQl9UWVBFX0FTWU1NRVRSSUMsIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDUgfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDAgfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIgfSwKKyAgICB7IDIsIDEsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDUgfSwKKyAgICB7IDQsIDIsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDAgfSwKKyAgICB7IDQsIDIsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIgfSwKKyAgICB7IDQsIDIsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDUgfSwKKyAgICB7IDgsIDMsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDAgfSwKKyAgICB7IDgsIDMsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDIgfSwKKyAgICB7IDgsIDMsIEFDQl9UWVBFX0hBTU1JTkcsICAgIEZDQl9UWVBFX0VYQ19QVUxTRVMsIDUgfQogfTsKIAogLyoqCkBAIC0xNjAsMTAgKzE1OSw2IEBACiAgICAgaW50IGxzcF9xX21vZGU7ICAgICAgICAgICAgICAgLy8vPCBkZWZpbmVzIHF1YW50aXplciBkZWZhdWx0cyBbMCwgMV0KICAgICBpbnQgbHNwX2RlZl9tb2RlOyAgICAgICAgICAgICAvLy88IGRlZmluZXMgZGlmZmVyZW50IHNldHMgb2YgTFNQIGRlZmF1bHRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBbMCwgMV0KLSAgICBpbnQgZnJhbWVfbHNwX2JpdHNpemU7ICAgICAgICAvLy88IHNpemUgKGluIGJpdHMpIG9mIExTUHMsIHdoZW4gZW5jb2RlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcGVyLWZyYW1lIChpbmRlcGVuZGVudCBjb2RpbmcpCi0gICAgaW50IHNmcmFtZV9sc3BfYml0c2l6ZTsgICAgICAgLy8vPCBzaXplIChpbiBiaXRzKSBvZiBMU1BzLCB3aGVuIGVuY29kZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHBlciBzdXBlcmZyYW1lIChyZXNpZHVhbCBjb2RpbmcpCiAKICAgICBpbnQgbWluX3BpdGNoX3ZhbDsgICAgICAgICAgICAvLy88IGJhc2UgdmFsdWUgZm9yIHBpdGNoIHBhcnNpbmcgY29kZQogICAgIGludCBtYXhfcGl0Y2hfdmFsOyAgICAgICAgICAgIC8vLzwgbWF4IHZhbHVlICsgMSBmb3IgcGl0Y2ggcGFyc2luZwpAQCAtMjUxLDYgKzI0Niw3IEBACiAKICAgICBpbnQgZnJhbWVfY250cjsgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgZnJhbWUgaW5kZXggWzAgLSAweEZGRkVdOyBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgb25seSB1c2VkIGZvciBjb21mb3J0IG5vaXNlIGluICNwUk5HKCkKKyAgICBpbnQgbmJfc3VwZXJmcmFtZXM7ICAgICAgICAgICAvLy88IG51bWJlciBvZiBzdXBlcmZyYW1lcyBpbiBjdXJyZW50IHBhY2tldAogICAgIGZsb2F0IGdhaW5fcHJlZF9lcnJbNl07ICAgICAgIC8vLzwgY2FjaGUgZm9yIGdhaW4gcHJlZGljdGlvbgogICAgIGZsb2F0IGV4Y2l0YXRpb25faGlzdG9yeVtNQVhfU0lHTkFMX0hJU1RPUlldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgY2FjaGUgb2YgdGhlIHNpZ25hbCBvZiBwcmV2aW91cwpAQCAtMzE1LDcgKzMxMSw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBhdl9jb2xkIHZvaWQgd21hdm9pY2VfaW5pdF9zdGF0aWNfZGF0YShBVkNvZGVjICpjb2RlYykKK3N0YXRpYyBhdl9jb2xkIHZvaWQgd21hdm9pY2VfaW5pdF9zdGF0aWNfZGF0YSh2b2lkKQogewogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGJpdHNbXSA9IHsKICAgICAgICAgIDIsICAyLCAgMiwgIDQsICA0LCAgNCwKQEAgLTMzNywxNCArMzMzLDQ1IEBACiAgICAgICAgICAgICAgICAgICAgIGJpdHMsIDEsIDEsIGNvZGVzLCAyLCAyLCAxMzIpOwogfQogCitzdGF0aWMgYXZfY29sZCB2b2lkIHdtYXZvaWNlX2ZsdXNoKEFWQ29kZWNDb250ZXh0ICpjdHgpCit7CisgICAgV01BVm9pY2VDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgaW50IG47CisKKyAgICBzLT5wb3N0ZmlsdGVyX2FnYyAgICA9IDA7CisgICAgcy0+c2ZyYW1lX2NhY2hlX3NpemUgPSAwOworICAgIHMtPnNraXBfYml0c19uZXh0ICAgID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bHNwczsgbisrKQorICAgICAgICBzLT5wcmV2X2xzcHNbbl0gPSBNX1BJICogKG4gKyAxLjApIC8gKHMtPmxzcHMgKyAxLjApOworICAgIG1lbXNldChzLT5leGNpdGF0aW9uX2hpc3RvcnksIDAsCisgICAgICAgICAgIHNpemVvZigqcy0+ZXhjaXRhdGlvbl9oaXN0b3J5KSAqIE1BWF9TSUdOQUxfSElTVE9SWSk7CisgICAgbWVtc2V0KHMtPnN5bnRoX2hpc3RvcnksICAgICAgMCwKKyAgICAgICAgICAgc2l6ZW9mKCpzLT5zeW50aF9oaXN0b3J5KSAgICAgICogTUFYX0xTUFMpOworICAgIG1lbXNldChzLT5nYWluX3ByZWRfZXJyLCAgICAgIDAsCisgICAgICAgICAgIHNpemVvZihzLT5nYWluX3ByZWRfZXJyKSk7CisKKyAgICBpZiAocy0+ZG9fYXBmKSB7CisgICAgICAgIG1lbXNldCgmcy0+c3ludGhfZmlsdGVyX291dF9idWZbTUFYX0xTUFNfQUxJR04xNiAtIHMtPmxzcHNdLCAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5zeW50aF9maWx0ZXJfb3V0X2J1ZikgKiBzLT5sc3BzKTsKKyAgICAgICAgbWVtc2V0KHMtPmRjZl9tZW0sICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5kY2ZfbWVtKSAgICAgICAgICAgICAgKiAyKTsKKyAgICAgICAgbWVtc2V0KHMtPnplcm9fZXhjX3BmLCAgICAgICAgICAwLAorICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT56ZXJvX2V4Y19wZikgICAgICAgICAgKiBzLT5oaXN0b3J5X25zYW1wbGVzKTsKKyAgICAgICAgbWVtc2V0KHMtPmRlbm9pc2VfZmlsdGVyX2NhY2hlLCAwLCBzaXplb2Yocy0+ZGVub2lzZV9maWx0ZXJfY2FjaGUpKTsKKyAgICB9Cit9CisKIC8qKgogICogU2V0IHVwIGRlY29kZXIgd2l0aCBwYXJhbWV0ZXJzIGZyb20gZGVtdXhlciAoZXh0cmFkYXRhIGV0Yy4pLgogICovCiBzdGF0aWMgYXZfY29sZCBpbnQgd21hdm9pY2VfZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmN0eCkKIHsKKyAgICBzdGF0aWMgQVZPbmNlIGluaXRfc3RhdGljX29uY2UgPSBBVl9PTkNFX0lOSVQ7CiAgICAgaW50IG4sIGZsYWdzLCBwaXRjaF9yYW5nZSwgbHNwMTZfZmxhZzsKICAgICBXTUFWb2ljZUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKIAorICAgIGZmX3RocmVhZF9vbmNlKCZpbml0X3N0YXRpY19vbmNlLCB3bWF2b2ljZV9pbml0X3N0YXRpY19kYXRhKTsKKwogICAgIC8qKgogICAgICAqIEV4dHJhZGF0YSBsYXlvdXQ6CiAgICAgICogLSBieXRlICAwLTE4OiBXTUFQcm8taW4tV01BVm9pY2UgZXh0cmFkYXRhIChzZWUgd21hcHJvZGVjLmMpLApAQCAtMzU5LDYgKzM4NiwxMSBAQAogICAgICAgICAgICAgICAgY3R4LT5leHRyYWRhdGFfc2l6ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KKyAgICBpZiAoY3R4LT5ibG9ja19hbGlnbiA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYmxvY2sgYWxpZ25tZW50ICVkLlxuIiwgY3R4LT5ibG9ja19hbGlnbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIGZsYWdzICAgICAgICAgICAgICAgID0gQVZfUkwzMihjdHgtPmV4dHJhZGF0YSArIDE4KTsKICAgICBzLT5zcGlsbG92ZXJfYml0c2l6ZSA9IDMgKyBhdl9jZWlsX2xvZzIoY3R4LT5ibG9ja19hbGlnbik7CiAgICAgcy0+ZG9fYXBmICAgICAgICAgICAgPSAgICBmbGFncyAmIDB4MTsKQEAgLTM4OSwxMiArNDIxLDggQEAKICAgICBsc3AxNl9mbGFnICAgICAgICAgICA9ICAgIGZsYWdzICYgMHgxMDAwOwogICAgIGlmIChsc3AxNl9mbGFnKSB7CiAgICAgICAgIHMtPmxzcHMgICAgICAgICAgICAgICA9IDE2OwotICAgICAgICBzLT5mcmFtZV9sc3BfYml0c2l6ZSAgPSAzNDsKLSAgICAgICAgcy0+c2ZyYW1lX2xzcF9iaXRzaXplID0gNjA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcy0+bHNwcyAgICAgICAgICAgICAgID0gMTA7Ci0gICAgICAgIHMtPmZyYW1lX2xzcF9iaXRzaXplICA9IDI0OwotICAgICAgICBzLT5zZnJhbWVfbHNwX2JpdHNpemUgPSA0ODsKICAgICB9CiAgICAgZm9yIChuID0gMDsgbiA8IHMtPmxzcHM7IG4rKykKICAgICAgICAgcy0+cHJldl9sc3BzW25dID0gTV9QSSAqIChuICsgMS4wKSAvIChzLT5sc3BzICsgMS4wKTsKQEAgLTQ4Myw3ICs1MTEsOCBAQAogICAgICAgICBzcGVlY2hfZW5lcmd5ICAgICArPSBmYWJzZihzcGVlY2hfc3ludGhbaV0pOwogICAgICAgICBwb3N0ZmlsdGVyX2VuZXJneSArPSBmYWJzZihpbltpXSk7CiAgICAgfQotICAgIGdhaW5fc2NhbGVfZmFjdG9yID0gKDEuMCAtIGFscGhhKSAqIHNwZWVjaF9lbmVyZ3kgLyBwb3N0ZmlsdGVyX2VuZXJneTsKKyAgICBnYWluX3NjYWxlX2ZhY3RvciA9IHBvc3RmaWx0ZXJfZW5lcmd5ID09IDAuMCA/IDAuMCA6CisgICAgICAgICAgICAgICAgICAgICAgICAoMS4wIC0gYWxwaGEpICogc3BlZWNoX2VuZXJneSAvIHBvc3RmaWx0ZXJfZW5lcmd5OwogCiAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBtZW0gPSBhbHBoYSAqIG1lbSArIGdhaW5fc2NhbGVfZmFjdG9yOwpAQCAtODQ3LDcgKzg3Niw2IEBACiAvKioKICAqIEBuYW1lIExTUCBkZXF1YW50aXphdGlvbiByb3V0aW5lcwogICogTFNQIGRlcXVhbnRpemF0aW9uIHJvdXRpbmVzLCBmb3IgMTAvMTZMU1BzIGFuZCBpbmRlcGVuZGVudC9yZXNpZHVhbCBjb2RpbmcuCi0gKiBAbm90ZSB3ZSBhc3N1bWUgZW5vdWdoIGJpdHMgYXJlIGF2YWlsYWJsZSwgY2FsbGVyIHNob3VsZCBjaGVjay4KICAqIGxzcDEwaSgpIGNvbnN1bWVzIDI0IGJpdHM7IGxzcDEwcigpIGNvbnN1bWVzIGFuIGFkZGl0aW9uYWwgMjQgYml0czsKICAqIGxzcDE2aSgpIGNvbnN1bWVzIDM0IGJpdHM7IGxzcDE2cigpIGNvbnN1bWVzIGFuIGFkZGl0aW9uYWwgMjYgYml0cy4KICAqIEB7CkBAIC0xMTkzLDcgKzEyMjEsNyBAQAogLyoqCiAgKiBAfQogICoKLSAqIEdlbmVyYXRlIGEgcmFuZG9tIG51bWJlciBmcm9tIGZyYW1lX2NudHIgYW5kIGJsb2NrX2lkeCwgd2hpY2ggd2lsbCBsaWVmCisgKiBHZW5lcmF0ZSBhIHJhbmRvbSBudW1iZXIgZnJvbSBmcmFtZV9jbnRyIGFuZCBibG9ja19pZHgsIHdoaWNoIHdpbGwgbGl2ZQogICogaW4gdGhlIHJhbmdlIFswLCAxMDAwIC0gYmxvY2tfc2l6ZV0gKHNvIGl0IGNhbiBiZSB1c2VkIGFzIGFuIGluZGV4IGluIGEKICAqIHRhYmxlIG9mIHNpemUgMTAwMCBvZiB3aGljaCB5b3Ugd2FudCB0byByZWFkIGJsb2NrX3NpemUgZW50cmllcykuCiAgKgpAQCAtMTM5MSw3ICsxNDE5LDYgQEAKIAogLyoqCiAgKiBQYXJzZSBkYXRhIGluIGEgc2luZ2xlIGJsb2NrLgotICogQG5vdGUgd2UgYXNzdW1lIGVub3VnaCBiaXRzIGFyZSBhdmFpbGFibGUsIGNhbGxlciBzaG91bGQgY2hlY2suCiAgKgogICogQHBhcmFtIHMgV01BIFZvaWNlIGRlY29kaW5nIGNvbnRleHQgcHJpdmF0ZSBkYXRhCiAgKiBAcGFyYW0gZ2IgYml0IEkvTyBjb250ZXh0CkBAIC0xNDM1LDcgKzE0NjIsNiBAQAogCiAvKioKICAqIFN5bnRoZXNpemUgb3V0cHV0IHNhbXBsZXMgZm9yIGEgc2luZ2xlIGZyYW1lLgotICogQG5vdGUgd2UgYXNzdW1lIGVub3VnaCBiaXRzIGFyZSBhdmFpbGFibGUsIGNhbGxlciBzaG91bGQgY2hlY2suCiAgKgogICogQHBhcmFtIGN0eCBXTUEgVm9pY2UgZGVjb2RlciBjb250ZXh0CiAgKiBAcGFyYW0gZ2IgYml0IEkvTyBjb250ZXh0IChzLT5nYiBvciBvbmUgZm9yIGNyb3NzLXBhY2tldCBzdXBlcmZyYW1lcykKQEAgLTE1MTYsNyArMTU0Miw3IEBACiAgICAgICAgICAgICAvKiBQaXRjaCBpcyBnaXZlbiBwZXIgYmxvY2suIFBlci1ibG9jayBwaXRjaGVzIGFyZSBlbmNvZGVkIGFzIGFuCiAgICAgICAgICAgICAgKiBhYnNvbHV0ZSB2YWx1ZSBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbmQgdGhlbiBkZWx0YSB2YWx1ZXMKICAgICAgICAgICAgICAqIHJlbGF0aXZlIHRvIHRoaXMgdmFsdWUpIGZvciBhbGwgc3Vic2VxdWVudCBibG9ja3MuIFRoZSBzY2FsZSBvZgotICAgICAgICAgICAgICogdGhpcyBwaXRjaCB2YWx1ZSBpcyBzZW1pLWxvZ2FyaXRtaWMgY29tcGFyZWQgdG8gaXRzIHVzZSBpbiB0aGUKKyAgICAgICAgICAgICAqIHRoaXMgcGl0Y2ggdmFsdWUgaXMgc2VtaS1sb2dhcml0aG1pYyBjb21wYXJlZCB0byBpdHMgdXNlIGluIHRoZQogICAgICAgICAgICAgICogZGVjb2Rlciwgc28gd2UgY29udmVydCBpdCB0byBub3JtYWwgc2NhbGUgYWxzby4gKi8KICAgICAgICAgICAgIGludCBibG9ja19waXRjaCwKICAgICAgICAgICAgICAgICB0MSA9IChzLT5ibG9ja19jb252X3RhYmxlWzFdIC0gcy0+YmxvY2tfY29udl90YWJsZVswXSkgPDwgMiwKQEAgLTE2NTQsODMgKzE2ODAsNiBAQAogfQogCiAvKioKLSAqIFRlc3QgaWYgdGhlcmUncyBlbm91Z2ggYml0cyB0byByZWFkIDEgc3VwZXJmcmFtZS4KLSAqCi0gKiBAcGFyYW0gb3JpZ19nYiBiaXQgSS9PIGNvbnRleHQgdXNlZCBmb3IgcmVhZGluZy4gVGhpcyBmdW5jdGlvbgotICogICAgICAgICAgICAgICAgZG9lcyBub3QgbW9kaWZ5IHRoZSBzdGF0ZSBvZiB0aGUgYml0cmVhZGVyOyBpdAotICogICAgICAgICAgICAgICAgb25seSB1c2VzIGl0IHRvIGNvcHkgdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uCi0gKiBAcGFyYW0gcyBXTUEgVm9pY2UgZGVjb2RpbmcgY29udGV4dCBwcml2YXRlIGRhdGEKLSAqIEByZXR1cm4gPCAwIG9uIGVycm9yLCAxIG9uIG5vdCBlbm91Z2ggYml0cyBvciAwIGlmIE9LLgotICovCi1zdGF0aWMgaW50IGNoZWNrX2JpdHNfZm9yX3N1cGVyZnJhbWUoR2V0Qml0Q29udGV4dCAqb3JpZ19nYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXTUFWb2ljZUNvbnRleHQgKnMpCi17Ci0gICAgR2V0Qml0Q29udGV4dCBzX2diLCAqZ2IgPSAmc19nYjsKLSAgICBpbnQgbiwgbmVlZF9iaXRzLCBiZF9pZHg7Ci0gICAgY29uc3Qgc3RydWN0IGZyYW1lX3R5cGVfZGVzYyAqZnJhbWVfZGVzYzsKLQotICAgIC8qIGluaXRpYWxpemUgYSBjb3B5ICovCi0gICAgaW5pdF9nZXRfYml0cyhnYiwgb3JpZ19nYi0+YnVmZmVyLCBvcmlnX2diLT5zaXplX2luX2JpdHMpOwotICAgIHNraXBfYml0c19sb25nKGdiLCBnZXRfYml0c19jb3VudChvcmlnX2diKSk7Ci0gICAgYXZfYXNzZXJ0MShnZXRfYml0c19sZWZ0KGdiKSA9PSBnZXRfYml0c19sZWZ0KG9yaWdfZ2IpKTsKLQotICAgIC8qIHN1cGVyZnJhbWUgaGVhZGVyICovCi0gICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMTQpCi0gICAgICAgIHJldHVybiAxOwotICAgIGlmICghZ2V0X2JpdHMxKGdiKSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsgICAgICAgICAgIC8vIFdNQVByby1pbi1XTUFWb2ljZSBzdXBlcmZyYW1lCi0gICAgaWYgKGdldF9iaXRzMShnYikpIHNraXBfYml0cyhnYiwgMTIpOyAvLyBudW1iZXIgb2YgIHNhbXBsZXMgaW4gc3VwZXJmcmFtZQotICAgIGlmIChzLT5oYXNfcmVzaWR1YWxfbHNwcykgeyAgICAgICAgICAgLy8gcmVzaWR1YWwgTFNQcyAoZm9yIGFsbCBmcmFtZXMpCi0gICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IHMtPnNmcmFtZV9sc3BfYml0c2l6ZSkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgcy0+c2ZyYW1lX2xzcF9iaXRzaXplKTsKLSAgICB9Ci0KLSAgICAvKiBmcmFtZXMgKi8KLSAgICBmb3IgKG4gPSAwOyBuIDwgTUFYX0ZSQU1FUzsgbisrKSB7Ci0gICAgICAgIGludCBhd19pZHhfaXNfZXh0ID0gMDsKLQotICAgICAgICBpZiAoIXMtPmhhc19yZXNpZHVhbF9sc3BzKSB7ICAgICAvLyBpbmRlcGVuZGVudCBMU1BzIChwZXItZnJhbWUpCi0gICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IHMtPmZyYW1lX2xzcF9iaXRzaXplKSByZXR1cm4gMTsKLSAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIHMtPmZyYW1lX2xzcF9iaXRzaXplKTsKLSAgICAgICAgfQotICAgICAgICBiZF9pZHggPSBzLT52Ym1fdHJlZVtnZXRfdmxjMihnYiwgZnJhbWVfdHlwZV92bGMudGFibGUsIDYsIDMpXTsKLSAgICAgICAgaWYgKGJkX2lkeCA8IDApCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgLy8gaW52YWxpZCBmcmFtZSB0eXBlIFZMQyBjb2RlCi0gICAgICAgIGZyYW1lX2Rlc2MgPSAmZnJhbWVfZGVzY3NbYmRfaWR4XTsKLSAgICAgICAgaWYgKGZyYW1lX2Rlc2MtPmFjYl90eXBlID09IEFDQl9UWVBFX0FTWU1NRVRSSUMpIHsKLSAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KGdiKSA8IHMtPnBpdGNoX25iaXRzKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcoZ2IsIHMtPnBpdGNoX25iaXRzKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZnJhbWVfZGVzYy0+ZmNiX3R5cGUgPT0gRkNCX1RZUEVfU0lMRU5DRSkgewotICAgICAgICAgICAgc2tpcF9iaXRzKGdiLCA4KTsKLSAgICAgICAgfSBlbHNlIGlmIChmcmFtZV9kZXNjLT5mY2JfdHlwZSA9PSBGQ0JfVFlQRV9BV19QVUxTRVMpIHsKLSAgICAgICAgICAgIGludCB0bXAgPSBnZXRfYml0cyhnYiwgNik7Ci0gICAgICAgICAgICBpZiAodG1wID49IDB4MzYpIHsKLSAgICAgICAgICAgICAgICBza2lwX2JpdHMoZ2IsIDIpOwotICAgICAgICAgICAgICAgIGF3X2lkeF9pc19leHQgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogYmxvY2tzICovCi0gICAgICAgIGlmIChmcmFtZV9kZXNjLT5hY2JfdHlwZSA9PSBBQ0JfVFlQRV9IQU1NSU5HKSB7Ci0gICAgICAgICAgICBuZWVkX2JpdHMgPSBzLT5ibG9ja19waXRjaF9uYml0cyArCi0gICAgICAgICAgICAgICAgKGZyYW1lX2Rlc2MtPm5fYmxvY2tzIC0gMSkgKiBzLT5ibG9ja19kZWx0YV9waXRjaF9uYml0czsKLSAgICAgICAgfSBlbHNlIGlmIChmcmFtZV9kZXNjLT5mY2JfdHlwZSA9PSBGQ0JfVFlQRV9BV19QVUxTRVMpIHsKLSAgICAgICAgICAgIG5lZWRfYml0cyA9IDIgKiAhYXdfaWR4X2lzX2V4dDsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBuZWVkX2JpdHMgPSAwOwotICAgICAgICBuZWVkX2JpdHMgKz0gZnJhbWVfZGVzYy0+ZnJhbWVfc2l6ZTsKLSAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgbmVlZF9iaXRzKQotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIHNraXBfYml0c19sb25nKGdiLCBuZWVkX2JpdHMpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioKICAqIFN5bnRoZXNpemUgb3V0cHV0IHNhbXBsZXMgZm9yIGEgc2luZ2xlIHN1cGVyZnJhbWUuIElmIHdlIGhhdmUgYW55IGRhdGEKICAqIGNhY2hlZCBpbiBzLT5zZnJhbWVfY2FjaGUsIHRoYXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2Ygd2hhdGV2ZXIgaXMgbG9hZGVkCiAgKiBpbiBzLT5nYi4KQEAgLTE3NTIsNyArMTcwMSw3IEBACiB7CiAgICAgV01BVm9pY2VDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CiAgICAgR2V0Qml0Q29udGV4dCAqZ2IgPSAmcy0+Z2IsIHNfZ2I7Ci0gICAgaW50IG4sIHJlcywgbl9zYW1wbGVzID0gNDgwOworICAgIGludCBuLCByZXMsIG5fc2FtcGxlcyA9IE1BWF9TRlJBTUVTSVpFOwogICAgIGRvdWJsZSBsc3BzW01BWF9GUkFNRVNdW01BWF9MU1BTXTsKICAgICBjb25zdCBkb3VibGUgKm1lYW5fbHNmID0gcy0+bHNwcyA9PSAxNiA/CiAgICAgICAgIHdtYXZvaWNlX21lYW5fbHNmMTZbcy0+bHNwX2RlZl9tb2RlXSA6IHdtYXZvaWNlX21lYW5fbHNmMTBbcy0+bHNwX2RlZl9tb2RlXTsKQEAgLTE3NzEsMTIgKzE3MjAsNiBAQAogICAgICAgICBzLT5zZnJhbWVfY2FjaGVfc2l6ZSA9IDA7CiAgICAgfQogCi0gICAgaWYgKChyZXMgPSBjaGVja19iaXRzX2Zvcl9zdXBlcmZyYW1lKGdiLCBzKSkgPT0gMSkgewotICAgICAgICAqZ290X2ZyYW1lX3B0ciA9IDA7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSBpZiAocmVzIDwgMCkKLSAgICAgICAgcmV0dXJuIHJlczsKLQogICAgIC8qIEZpcnN0IGJpdCBpcyBzcGVlY2gvbXVzaWMgYml0LCBpdCBkaWZmZXJlbnRpYXRlcyBiZXR3ZWVuIFdNQVZvaWNlCiAgICAgICogc3BlZWNoIHNhbXBsZXMgKHRoZSBhY3R1YWwgY29kZWMpIGFuZCBXTUFWb2ljZSBtdXNpYyBzYW1wbGVzLCB3aGljaAogICAgICAqIGFyZSByZWFsbHkgV01BUHJvLWluLVdNQVZvaWNlLXN1cGVyZnJhbWVzLiBJJ3ZlIG5ldmVyIHNlZW4gdGhvc2UgaW4KQEAgLTE3ODgsMTMgKzE3MzEsMTQgQEAKIAogICAgIC8qIChvcHRpb25hbCkgbnIuIG9mIHNhbXBsZXMgaW4gc3VwZXJmcmFtZTsgYWx3YXlzIDw9IDQ4MCBhbmQgPj0gMCAqLwogICAgIGlmIChnZXRfYml0czEoZ2IpKSB7Ci0gICAgICAgIGlmICgobl9zYW1wbGVzID0gZ2V0X2JpdHMoZ2IsIDEyKSkgPiA0ODApIHsKKyAgICAgICAgaWYgKChuX3NhbXBsZXMgPSBnZXRfYml0cyhnYiwgMTIpKSA+IE1BWF9TRlJBTUVTSVpFKSB7CiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIlN1cGVyZnJhbWUgZW5jb2RlcyA+NDgwIHNhbXBsZXMgKCVkKSwgbm90IGFsbG93ZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgbl9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAiU3VwZXJmcmFtZSBlbmNvZGVzID4gJWQgc2FtcGxlcyAoJWQpLCBub3QgYWxsb3dlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBNQVhfU0ZSQU1FU0laRSwgbl9zYW1wbGVzKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgfQorCiAgICAgLyogUGFyc2UgTFNQcywgaWYgZ2xvYmFsIGZvciB0aGUgc3VwZXJmcmFtZSAoY2FuIGFsc28gYmUgcGVyLWZyYW1lKS4gKi8KICAgICBpZiAocy0+aGFzX3Jlc2lkdWFsX2xzcHMpIHsKICAgICAgICAgZG91YmxlIHByZXZfbHNwc1tNQVhfTFNQU10sIGExW01BWF9MU1BTICogMl0sIGEyW01BWF9MU1BTICogMl07CkBAIC0xODE2LDggKzE3NjAsMTIgQEAKICAgICAgICAgICAgIHN0YWJpbGl6ZV9sc3BzKGxzcHNbbl0sIHMtPmxzcHMpOwogICAgIH0KIAorICAgIC8qIHN5bnRoX3N1cGVyZnJhbWUgY2FuIHJ1biBtdWx0aXBsZSB0aW1lcyBwZXIgcGFja2V0CisgICAgICogZnJlZSBwb3RlbnRpYWwgcHJldmlvdXMgZnJhbWUgKi8KKyAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisKICAgICAvKiBnZXQgb3V0cHV0IGJ1ZmZlciAqLwotICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gNDgwOworICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gTUFYX1NGUkFNRVNJWkU7CiAgICAgaWYgKChyZXMgPSBmZl9nZXRfYnVmZmVyKGN0eCwgZnJhbWUsIDApKSA8IDApCiAgICAgICAgIHJldHVybiByZXM7CiAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBuX3NhbXBsZXM7CkBAIC0xODU2LDYgKzE4MDQsMTEgQEAKICAgICAgICAgc2tpcF9iaXRzKGdiLCAxMCAqIChyZXMgKyAxKSk7CiAgICAgfQogCisgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgMCkgeworICAgICAgICB3bWF2b2ljZV9mbHVzaChjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKICAgICAqZ290X2ZyYW1lX3B0ciA9IDE7CiAKICAgICAvKiBVcGRhdGUgaGlzdG9yeSAqLwpAQCAtMTg3NywyNiArMTgzMCwyMyBAQAogICogZGVjb2RlcikuCiAgKgogICogQHBhcmFtIHMgV01BIFZvaWNlIGRlY29kaW5nIGNvbnRleHQgcHJpdmF0ZSBkYXRhCi0gKiBAcmV0dXJuIDEgaWYgbm90IGVub3VnaCBiaXRzIHdlcmUgYXZhaWxhYmxlLCBvciAwIG9uIHN1Y2Nlc3MuCisgKiBAcmV0dXJuIDwwIG9uIGVycm9yLCBuYl9zdXBlcmZyYW1lcyBvbiBzdWNjZXNzLgogICovCiBzdGF0aWMgaW50IHBhcnNlX3BhY2tldF9oZWFkZXIoV01BVm9pY2VDb250ZXh0ICpzKQogewogICAgIEdldEJpdENvbnRleHQgKmdiID0gJnMtPmdiOwotICAgIHVuc2lnbmVkIGludCByZXM7CisgICAgdW5zaWduZWQgaW50IHJlcywgbl9zdXBlcmZyYW1lcyA9IDA7CiAKLSAgICBpZiAoZ2V0X2JpdHNfbGVmdChnYikgPCAxMSkKLSAgICAgICAgcmV0dXJuIDE7CiAgICAgc2tpcF9iaXRzKGdiLCA0KTsgICAgICAgICAgLy8gcGFja2V0IHNlcXVlbmNlIG51bWJlcgogICAgIHMtPmhhc19yZXNpZHVhbF9sc3BzID0gZ2V0X2JpdHMxKGdiKTsKICAgICBkbyB7CiAgICAgICAgIHJlcyA9IGdldF9iaXRzKGdiLCA2KTsgLy8gbnVtYmVyIG9mIHN1cGVyZnJhbWVzIHBlciBwYWNrZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAobWludXMgZmlyc3Qgb25lIGlmIHRoZXJlIGlzIHNwaWxsb3ZlcikKLSAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoZ2IpIDwgNiAqIChyZXMgPT0gMHgzRikgKyBzLT5zcGlsbG92ZXJfYml0c2l6ZSkKLSAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBuX3N1cGVyZnJhbWVzICs9IHJlczsKICAgICB9IHdoaWxlIChyZXMgPT0gMHgzRik7CiAgICAgcy0+c3BpbGxvdmVyX25iaXRzICAgPSBnZXRfYml0cyhnYiwgcy0+c3BpbGxvdmVyX2JpdHNpemUpOwogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGdldF9iaXRzX2xlZnQoZ2IpID49IDAgPyBuX3N1cGVyZnJhbWVzIDogQVZFUlJPUl9JTlZBTElEREFUQTsKIH0KIAogLyoqCkBAIC0xOTU2LDQ1ICsxOTA2LDQzIEBACiAgICAgICogaW4gYSBzaW5nbGUgIm11eGVyIiBwYWNrZXQsIHNvIHdlIGFydGlmaWNpYWxseSBlbXVsYXRlIHRoYXQgYnkKICAgICAgKiBjYXBwaW5nIHRoZSBwYWNrZXQgc2l6ZSBhdCBjdHgtPmJsb2NrX2FsaWduLiAqLwogICAgIGZvciAoc2l6ZSA9IGF2cGt0LT5zaXplOyBzaXplID4gY3R4LT5ibG9ja19hbGlnbjsgc2l6ZSAtPSBjdHgtPmJsb2NrX2FsaWduKTsKLSAgICBpZiAoIXNpemUpIHsKLSAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAgICAgaW5pdF9nZXRfYml0cygmcy0+Z2IsIGF2cGt0LT5kYXRhLCBzaXplIDw8IDMpOwogCiAgICAgLyogc2l6ZSA9PSBjdHgtPmJsb2NrX2FsaWduIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBhcmUgZGVhbGluZyB3aXRoCiAgICAgICogYSBuZXcgcGFja2V0IG9yIGEgcGFja2V0IG9mIHdoaWNoIHdlIGFscmVhZHkgcmVhZCB0aGUgcGFja2V0IGhlYWRlcgogICAgICAqIHByZXZpb3VzbHkuICovCi0gICAgaWYgKHNpemUgPT0gY3R4LT5ibG9ja19hbGlnbikgeyAvLyBuZXcgcGFja2V0IGhlYWRlcgotICAgICAgICBpZiAoKHJlcyA9IHBhcnNlX3BhY2tldF9oZWFkZXIocykpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgaWYgKCEoc2l6ZSAlIGN0eC0+YmxvY2tfYWxpZ24pKSB7IC8vIG5ldyBwYWNrZXQgaGVhZGVyCisgICAgICAgIGlmICghc2l6ZSkgeworICAgICAgICAgICAgcy0+c3BpbGxvdmVyX25iaXRzID0gMDsKKyAgICAgICAgICAgIHMtPm5iX3N1cGVyZnJhbWVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocmVzID0gcGFyc2VfcGFja2V0X2hlYWRlcihzKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBzLT5uYl9zdXBlcmZyYW1lcyA9IHJlczsKKyAgICAgICAgfQogCiAgICAgICAgIC8qIElmIHRoZSBwYWNrZXQgaGVhZGVyIHNwZWNpZmllcyBhIHMtPnNwaWxsb3Zlcl9uYml0cywgdGhlbiB3ZSB3YW50CiAgICAgICAgICAqIHRvIHB1c2ggb3V0IGFsbCBkYXRhIG9mIHRoZSBwcmV2aW91cyBwYWNrZXQgKCsgc3BpbGxvdmVyKSBiZWZvcmUKICAgICAgICAgICogY29udGludWluZyB0byBwYXJzZSBuZXcgc3VwZXJmcmFtZXMgaW4gdGhlIGN1cnJlbnQgcGFja2V0LiAqLwotICAgICAgICBpZiAocy0+c3BpbGxvdmVyX25iaXRzID4gMCkgewotICAgICAgICAgICAgaWYgKHMtPnNmcmFtZV9jYWNoZV9zaXplID4gMCkgewotICAgICAgICAgICAgICAgIGludCBjbnQgPSBnZXRfYml0c19jb3VudChnYik7Ci0gICAgICAgICAgICAgICAgY29weV9iaXRzKCZzLT5wYiwgYXZwa3QtPmRhdGEsIHNpemUsIGdiLCBzLT5zcGlsbG92ZXJfbmJpdHMpOwotICAgICAgICAgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZzLT5wYik7Ci0gICAgICAgICAgICAgICAgcy0+c2ZyYW1lX2NhY2hlX3NpemUgKz0gcy0+c3BpbGxvdmVyX25iaXRzOwotICAgICAgICAgICAgICAgIGlmICgocmVzID0gc3ludGhfc3VwZXJmcmFtZShjdHgsIGRhdGEsIGdvdF9mcmFtZV9wdHIpKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNudCArPSBzLT5zcGlsbG92ZXJfbmJpdHM7Ci0gICAgICAgICAgICAgICAgICAgIHMtPnNraXBfYml0c19uZXh0ID0gY250ICYgNzsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gY250ID4+IDM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPiBhdnBrdC0+c2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcnlpbmcgdG8gc2tpcCAlZCBieXRlcyBpbiBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIGF2cGt0LT5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nIChnYiwgcy0+c3BpbGxvdmVyX25iaXRzIC0gY250ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9iaXRzX2NvdW50KGdiKSk7IC8vIHJlc3luYworICAgICAgICBpZiAocy0+c2ZyYW1lX2NhY2hlX3NpemUgPiAwKSB7CisgICAgICAgICAgICBpbnQgY250ID0gZ2V0X2JpdHNfY291bnQoZ2IpOworICAgICAgICAgICAgaWYgKGNudCArIHMtPnNwaWxsb3Zlcl9uYml0cyA+IGF2cGt0LT5zaXplICogOCkgeworICAgICAgICAgICAgICAgIHMtPnNwaWxsb3Zlcl9uYml0cyA9IGF2cGt0LT5zaXplICogOCAtIGNudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvcHlfYml0cygmcy0+cGIsIGF2cGt0LT5kYXRhLCBzaXplLCBnYiwgcy0+c3BpbGxvdmVyX25iaXRzKTsKKyAgICAgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZzLT5wYik7CisgICAgICAgICAgICBzLT5zZnJhbWVfY2FjaGVfc2l6ZSArPSBzLT5zcGlsbG92ZXJfbmJpdHM7CisgICAgICAgICAgICBpZiAoKHJlcyA9IHN5bnRoX3N1cGVyZnJhbWUoY3R4LCBkYXRhLCBnb3RfZnJhbWVfcHRyKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICpnb3RfZnJhbWVfcHRyKSB7CisgICAgICAgICAgICAgICAgY250ICs9IHMtPnNwaWxsb3Zlcl9uYml0czsKKyAgICAgICAgICAgICAgICBzLT5za2lwX2JpdHNfbmV4dCA9IGNudCAmIDc7CisgICAgICAgICAgICAgICAgcmVzID0gY250ID4+IDM7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCBzLT5zcGlsbG92ZXJfbmJpdHMpOyAgLy8gcmVzeW5jCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzX2xvbmcgKGdiLCBzLT5zcGlsbG92ZXJfbmJpdHMgLSBjbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0c19jb3VudChnYikpOyAvLyByZXN5bmMKKyAgICAgICAgfSBlbHNlIGlmIChzLT5zcGlsbG92ZXJfbmJpdHMpIHsKKyAgICAgICAgICAgIHNraXBfYml0c19sb25nKGdiLCBzLT5zcGlsbG92ZXJfbmJpdHMpOyAgLy8gcmVzeW5jCiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHMtPnNraXBfYml0c19uZXh0KQogICAgICAgICBza2lwX2JpdHMoZ2IsIHMtPnNraXBfYml0c19uZXh0KTsKQEAgLTIwMDMsMjYgKzE5NTEsMjAgQEAKICAgICBzLT5zZnJhbWVfY2FjaGVfc2l6ZSA9IDA7CiAgICAgcy0+c2tpcF9iaXRzX25leHQgPSAwOwogICAgIHBvcyA9IGdldF9iaXRzX2xlZnQoZ2IpOwotICAgIGlmICgocmVzID0gc3ludGhfc3VwZXJmcmFtZShjdHgsIGRhdGEsIGdvdF9mcmFtZV9wdHIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9IGVsc2UgaWYgKCpnb3RfZnJhbWVfcHRyKSB7Ci0gICAgICAgIGludCBjbnQgPSBnZXRfYml0c19jb3VudChnYik7Ci0gICAgICAgIHMtPnNraXBfYml0c19uZXh0ID0gY250ICYgNzsKLSAgICAgICAgcmVzID0gY250ID4+IDM7Ci0gICAgICAgIGlmIChyZXMgPiBhdnBrdC0+c2l6ZSkgewotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJUcnlpbmcgdG8gc2tpcCAlZCBieXRlcyBpbiBwYWNrZXQgb2Ygc2l6ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICByZXMsIGF2cGt0LT5zaXplKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGlmIChzLT5uYl9zdXBlcmZyYW1lcy0tID09IDApIHsKKyAgICAgICAgKmdvdF9mcmFtZV9wdHIgPSAwOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9IGVsc2UgaWYgKHMtPm5iX3N1cGVyZnJhbWVzID4gMCkgeworICAgICAgICBpZiAoKHJlcyA9IHN5bnRoX3N1cGVyZnJhbWUoY3R4LCBkYXRhLCBnb3RfZnJhbWVfcHRyKSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9IGVsc2UgaWYgKCpnb3RfZnJhbWVfcHRyKSB7CisgICAgICAgICAgICBpbnQgY250ID0gZ2V0X2JpdHNfY291bnQoZ2IpOworICAgICAgICAgICAgcy0+c2tpcF9iaXRzX25leHQgPSBjbnQgJiA3OworICAgICAgICAgICAgcmVzID0gY250ID4+IDM7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXM7CiAgICAgfSBlbHNlIGlmICgocy0+c2ZyYW1lX2NhY2hlX3NpemUgPSBwb3MpID4gMCkgewotICAgICAgICAvKiByZXdpbmQgYml0IHJlYWRlciB0byBzdGFydCBvZiBsYXN0IChpbmNvbXBsZXRlKSBzdXBlcmZyYW1lLi4uICovCi0gICAgICAgIGluaXRfZ2V0X2JpdHMoZ2IsIGF2cGt0LT5kYXRhLCBzaXplIDw8IDMpOwotICAgICAgICBza2lwX2JpdHNfbG9uZyhnYiwgKHNpemUgPDwgMykgLSBwb3MpOwotICAgICAgICBhdl9hc3NlcnQxKGdldF9iaXRzX2xlZnQoZ2IpID09IHBvcyk7Ci0KLSAgICAgICAgLyogLi4uYW5kIGNhY2hlIGl0IGZvciBzcGlsbG92ZXIgaW4gbmV4dCBwYWNrZXQgKi8KKyAgICAgICAgLyogLi4uIGNhY2hlIGl0IGZvciBzcGlsbG92ZXIgaW4gbmV4dCBwYWNrZXQgKi8KICAgICAgICAgaW5pdF9wdXRfYml0cygmcy0+cGIsIHMtPnNmcmFtZV9jYWNoZSwgU0ZSQU1FX0NBQ0hFX01BWFNJWkUpOwogICAgICAgICBjb3B5X2JpdHMoJnMtPnBiLCBhdnBrdC0+ZGF0YSwgc2l6ZSwgZ2IsIHMtPnNmcmFtZV9jYWNoZV9zaXplKTsKICAgICAgICAgLy8gRklYTUUgYmFkIC0ganVzdCBjb3B5IGJ5dGVzIGFzIHdob2xlIGFuZCBhZGQgdXNlIHRoZQpAQCAtMjA0NiwzNCArMTk4OCw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBhdl9jb2xkIHZvaWQgd21hdm9pY2VfZmx1c2goQVZDb2RlY0NvbnRleHQgKmN0eCkKLXsKLSAgICBXTUFWb2ljZUNvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKLSAgICBpbnQgbjsKLQotICAgIHMtPnBvc3RmaWx0ZXJfYWdjICAgID0gMDsKLSAgICBzLT5zZnJhbWVfY2FjaGVfc2l6ZSA9IDA7Ci0gICAgcy0+c2tpcF9iaXRzX25leHQgICAgPSAwOwotICAgIGZvciAobiA9IDA7IG4gPCBzLT5sc3BzOyBuKyspCi0gICAgICAgIHMtPnByZXZfbHNwc1tuXSA9IE1fUEkgKiAobiArIDEuMCkgLyAocy0+bHNwcyArIDEuMCk7Ci0gICAgbWVtc2V0KHMtPmV4Y2l0YXRpb25faGlzdG9yeSwgMCwKLSAgICAgICAgICAgc2l6ZW9mKCpzLT5leGNpdGF0aW9uX2hpc3RvcnkpICogTUFYX1NJR05BTF9ISVNUT1JZKTsKLSAgICBtZW1zZXQocy0+c3ludGhfaGlzdG9yeSwgICAgICAwLAotICAgICAgICAgICBzaXplb2YoKnMtPnN5bnRoX2hpc3RvcnkpICAgICAgKiBNQVhfTFNQUyk7Ci0gICAgbWVtc2V0KHMtPmdhaW5fcHJlZF9lcnIsICAgICAgMCwKLSAgICAgICAgICAgc2l6ZW9mKHMtPmdhaW5fcHJlZF9lcnIpKTsKLQotICAgIGlmIChzLT5kb19hcGYpIHsKLSAgICAgICAgbWVtc2V0KCZzLT5zeW50aF9maWx0ZXJfb3V0X2J1ZltNQVhfTFNQU19BTElHTjE2IC0gcy0+bHNwc10sIDAsCi0gICAgICAgICAgICAgICBzaXplb2YoKnMtPnN5bnRoX2ZpbHRlcl9vdXRfYnVmKSAqIHMtPmxzcHMpOwotICAgICAgICBtZW1zZXQocy0+ZGNmX21lbSwgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICBzaXplb2YoKnMtPmRjZl9tZW0pICAgICAgICAgICAgICAqIDIpOwotICAgICAgICBtZW1zZXQocy0+emVyb19leGNfcGYsICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICBzaXplb2YoKnMtPnplcm9fZXhjX3BmKSAgICAgICAgICAqIHMtPmhpc3RvcnlfbnNhbXBsZXMpOwotICAgICAgICBtZW1zZXQocy0+ZGVub2lzZV9maWx0ZXJfY2FjaGUsIDAsIHNpemVvZihzLT5kZW5vaXNlX2ZpbHRlcl9jYWNoZSkpOwotICAgIH0KLX0KLQogQVZDb2RlYyBmZl93bWF2b2ljZV9kZWNvZGVyID0gewogICAgIC5uYW1lICAgICAgICAgICAgID0gIndtYXZvaWNlIiwKICAgICAubG9uZ19uYW1lICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXaW5kb3dzIE1lZGlhIEF1ZGlvIFZvaWNlIiksCkBAIC0yMDgxLDkgKzE5OTUsOCBAQAogICAgIC5pZCAgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV01BVk9JQ0UsCiAgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoV01BVm9pY2VDb250ZXh0KSwKICAgICAuaW5pdCAgICAgICAgICAgICA9IHdtYXZvaWNlX2RlY29kZV9pbml0LAotICAgIC5pbml0X3N0YXRpY19kYXRhID0gd21hdm9pY2VfaW5pdF9zdGF0aWNfZGF0YSwKICAgICAuY2xvc2UgICAgICAgICAgICA9IHdtYXZvaWNlX2RlY29kZV9lbmQsCiAgICAgLmRlY29kZSAgICAgICAgICAgPSB3bWF2b2ljZV9kZWNvZGVfcGFja2V0LAotICAgIC5jYXBhYmlsaXRpZXMgICAgID0gQVZfQ09ERUNfQ0FQX1NVQkZSQU1FUyB8IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcGFiaWxpdGllcyAgICAgPSBBVl9DT0RFQ19DQVBfU1VCRlJBTUVTIHwgQVZfQ09ERUNfQ0FQX0RSMSB8IEFWX0NPREVDX0NBUF9ERUxBWSwKICAgICAuZmx1c2ggICAgICAgICAgICA9IHdtYXZvaWNlX2ZsdXNoLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvd212Mi5jIGIvbGliYXZjb2RlYy93bXYyLmMKaW5kZXggOWMzYWNiYy4uMzI3YzViZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy93bXYyLmMKKysrIGIvbGliYXZjb2RlYy93bXYyLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJtc21wZWc0ZGF0YS5oIgogI2luY2x1ZGUgInNpbXBsZV9pZGN0LmgiCiAjaW5jbHVkZSAid212Mi5oIgorI2luY2x1ZGUgIndtdjJkYXRhLmgiCiAKIAogYXZfY29sZCB2b2lkIGZmX3dtdjJfY29tbW9uX2luaXQoV212MkNvbnRleHQgKncpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dtdjIuaCBiL2xpYmF2Y29kZWMvd212Mi5oCmluZGV4IDMxNTkzYjguLjBmNDU5YWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvd212Mi5oCisrKyBiL2xpYmF2Y29kZWMvd212Mi5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgaW50IGhzaGlmdDsKIAogICAgIFNjYW5UYWJsZSBhYnRfc2NhbnRhYmxlWzJdOwotICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgYWJ0X2Jsb2NrMilbNl1bNjRdOworICAgIERFQ0xBUkVfQUxJR05FRCgzMiwgaW50MTZfdCwgYWJ0X2Jsb2NrMilbNl1bNjRdOwogfSBXbXYyQ29udGV4dDsKIAogdm9pZCBmZl93bXYyX2NvbW1vbl9pbml0KFdtdjJDb250ZXh0ICp3KTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvd212MmRhdGEuYyBiL2xpYmF2Y29kZWMvd212MmRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODU4NTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy93bXYyZGF0YS5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAid212MmRhdGEuaCIKKworY29uc3QgdWludDhfdCBmZl93bXYyX3NjYW50YWJsZUFbNjRdID0geworICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDgsIDB4MDMsIDB4MDksIDB4MEEsIDB4MTAsCisgICAgMHgwNCwgMHgwQiwgMHgxMSwgMHgxOCwgMHgxMiwgMHgwQywgMHgwNSwgMHgxMywKKyAgICAweDE5LCAweDBELCAweDE0LCAweDFBLCAweDFCLCAweDA2LCAweDE1LCAweDFDLAorICAgIDB4MEUsIDB4MTYsIDB4MUQsIDB4MDcsIDB4MUUsIDB4MEYsIDB4MTcsIDB4MUYsCit9OworCitjb25zdCB1aW50OF90IGZmX3dtdjJfc2NhbnRhYmxlQls2NF0gPSB7CisgICAgMHgwMCwgMHgwOCwgMHgwMSwgMHgxMCwgMHgwOSwgMHgxOCwgMHgxMSwgMHgwMiwKKyAgICAweDIwLCAweDBBLCAweDE5LCAweDI4LCAweDEyLCAweDMwLCAweDIxLCAweDFBLAorICAgIDB4MzgsIDB4MjksIDB4MjIsIDB4MDMsIDB4MzEsIDB4MzksIDB4MEIsIDB4MkEsCisgICAgMHgxMywgMHgzMiwgMHgxQiwgMHgzQSwgMHgyMywgMHgyQiwgMHgzMywgMHgzQiwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dtdjJkYXRhLmggYi9saWJhdmNvZGVjL3dtdjJkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4MzQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMvd212MmRhdGEuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZDT0RFQ19XTVYyREFUQV9ICisjZGVmaW5lIEFWQ09ERUNfV01WMkRBVEFfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2V4dGVybiBjb25zdCB1aW50OF90IGZmX3dtdjJfc2NhbnRhYmxlQVs2NF07CitleHRlcm4gY29uc3QgdWludDhfdCBmZl93bXYyX3NjYW50YWJsZUJbNjRdOworCisjZW5kaWYgLyogQVZDT0RFQ19XTVYyREFUQV9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dtdjJkZWMuYyBiL2xpYmF2Y29kZWMvd212MmRlYy5jCmluZGV4IDk5Yzk1ZDMuLmE5OWRhMjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvd212MmRlYy5jCisrKyBiL2xpYmF2Y29kZWMvd212MmRlYy5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSAid212Mi5oIgogCiAKLXN0YXRpYyB2b2lkIHBhcnNlX21iX3NraXAoV212MkNvbnRleHQgKncpCitzdGF0aWMgaW50IHBhcnNlX21iX3NraXAoV212MkNvbnRleHQgKncpCiB7CiAgICAgaW50IG1iX3gsIG1iX3k7CiAgICAgTXBlZ0VuY0NvbnRleHQgKmNvbnN0IHMgPSAmdy0+czsKQEAgLTQ1LDYgKzQ1LDggQEAKICAgICAgICAgICAgICAgICAgICAgTUJfVFlQRV8xNngxNiB8IE1CX1RZUEVfTDA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU0tJUF9UWVBFX01QRUc6CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCBzLT5tYl9oZWlnaHQgKiBzLT5tYl93aWR0aCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgcy0+bWJfaGVpZ2h0OyBtYl95KyspCiAgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+bWJfd2lkdGg7IG1iX3grKykKICAgICAgICAgICAgICAgICBtYl90eXBlW21iX3kgKiBzLT5tYl9zdHJpZGUgKyBtYl94XSA9CkBAIC01Miw2ICs1NCw4IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU0tJUF9UWVBFX1JPVzoKICAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmcy0+Z2IpIDwgMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGlmIChnZXRfYml0czEoJnMtPmdiKSkgewogICAgICAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5tYl93aWR0aDsgbWJfeCsrKQogICAgICAgICAgICAgICAgICAgICBtYl90eXBlW21iX3kgKiBzLT5tYl9zdHJpZGUgKyBtYl94XSA9CkBAIC02NSw2ICs2OSw4IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU0tJUF9UWVBFX0NPTDoKICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IHMtPm1iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPCAxKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgaWYgKGdldF9iaXRzMSgmcy0+Z2IpKSB7CiAgICAgICAgICAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IHMtPm1iX2hlaWdodDsgbWJfeSsrKQogICAgICAgICAgICAgICAgICAgICBtYl90eXBlW21iX3kgKiBzLT5tYl9zdHJpZGUgKyBtYl94XSA9CkBAIC03Nyw2ICs4Myw3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGRlY29kZV9leHRfaGVhZGVyKFdtdjJDb250ZXh0ICp3KQpAQCAtMTU5LDYgKzE2NiwxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzLT5kY190YWJsZV9pbmRleCA9IGdldF9iaXRzMSgmcy0+Z2IpOworCisgICAgICAgICAgICAvLyBhdCBtaW5pbXVtIG9uZSBiaXQgcGVyIG1hY3JvYmxvY2sgaXMgcmVxdWlyZWQgYXQgbGVhc3QgaW4gYSB2YWxpZCBmcmFtZSwKKyAgICAgICAgICAgIC8vIHdlIGRpc2NhcmQgZnJhbWVzIG11Y2ggc21hbGxlciB0aGFuIHRoaXMuIEZyYW1lcyBzbWFsbGVyIHRoYW4gMS84IG9mIHRoZQorICAgICAgICAgICAgLy8gc21hbGxlc3QgImJsYWNrL3NraXAiIGZyYW1lIGdlbmVyYWxseSBjb250YWluIG5vdCBtdWNoIHJlY292ZXJhYmxlIGNvbnRlbnQKKyAgICAgICAgICAgIC8vIHdoaWxlIGF0IHRoZSBzYW1lIHRpbWUgdGhleSBoYXZlIHRoZSBoaWdoZXN0IGNvbXB1dGF0aW9uYWwgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAvLyBwZXIgYnl0ZQorICAgICAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSAqIDhMTCA8IChzLT53aWR0aCsxNSkvMTYgKiAoKHMtPmhlaWdodCsxNSkvMTYpKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgICAgIHMtPmludGVyX2ludHJhX3ByZWQgPSAwOwogICAgICAgICBzLT5ub19yb3VuZGluZyAgICAgID0gMTsKQEAgLTE3MCw5ICsxODUsMTIgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBjYnBfaW5kZXg7CisgICAgICAgIGludCByZXQ7CiAgICAgICAgIHctPmpfdHlwZSA9IDA7CiAKLSAgICAgICAgcGFyc2VfbWJfc2tpcCh3KTsKKyAgICAgICAgcmV0ID0gcGFyc2VfbWJfc2tpcCh3KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBjYnBfaW5kZXggPSBkZWNvZGUwMTIoJnMtPmdiKTsKICAgICAgICAgdy0+Y2JwX3RhYmxlX2luZGV4ID0gd212Ml9nZXRfY2JwX3RhYmxlX2luZGV4KHMsIGNicF9pbmRleCk7CiAKQEAgLTIxOSw3ICsyMzcsMTQgQEAKICAgICBzLT5waWN0dXJlX251bWJlcisrOyAvLyBGSVhNRSA/CiAKICAgICBpZiAody0+al90eXBlKSB7Ci0gICAgICAgIGZmX2ludHJheDhfZGVjb2RlX3BpY3R1cmUoJnctPng4LCAyICogcy0+cXNjYWxlLCAocy0+cXNjYWxlIC0gMSkgfCAxKTsKKyAgICAgICAgZmZfaW50cmF4OF9kZWNvZGVfcGljdHVyZSgmdy0+eDgsICZzLT5jdXJyZW50X3BpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmdiLCAmcy0+bWJfeCwgJnMtPm1iX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIHMtPnFzY2FsZSwgKHMtPnFzY2FsZSAtIDEpIHwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sb29wX2ZpbHRlciwgcy0+bG93X2RlbGF5KTsKKworICAgICAgICBmZl9lcl9hZGRfc2xpY2UoJnctPnMuZXIsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAody0+cy5tYl94ID4+IDEpIC0gMSwgKHctPnMubWJfeSA+PiAxKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBFUl9NQl9FTkQpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKQEAgLTM1Miw2ICszNzcsOCBAQAogICAgICAgICAgICAgdy0+aHNoaWZ0ICAgICAgPSAwOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJnMtPmdiKSA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgY29kZSA9IGdldF92bGMyKCZzLT5nYiwgZmZfbWJfbm9uX2ludHJhX3ZsY1t3LT5jYnBfdGFibGVfaW5kZXhdLnRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgTUJfTk9OX0lOVFJBX1ZMQ19CSVRTLCAzKTsKQEAgLTM2Miw2ICszODksOCBAQAogICAgICAgICBjYnAgPSBjb2RlICYgMHgzZjsKICAgICB9IGVsc2UgewogICAgICAgICBzLT5tYl9pbnRyYSA9IDE7CisgICAgICAgIGlmIChnZXRfYml0c19sZWZ0KCZzLT5nYikgPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBjb2RlID0gZ2V0X3ZsYzIoJnMtPmdiLCBmZl9tc21wNF9tYl9pX3ZsYy50YWJsZSwgTUJfSU5UUkFfVkxDX0JJVFMsIDIpOwogICAgICAgICBpZiAoY29kZSA8IDApIHsKICAgICAgICAgICAgIGF2X2xvZyhzLT5hdmN0eCwgQVZfTE9HX0VSUk9SLApAQCAtNDUzLDE4ICs0ODIsMTQgQEAKICAgICBXbXYyQ29udGV4dCAqY29uc3QgdyA9IGF2Y3R4LT5wcml2X2RhdGE7CiAgICAgaW50IHJldDsKIAotI2lmIEZGX0FQSV9FTVVfRURHRQotICAgIGF2Y3R4LT5mbGFncyB8PSBDT0RFQ19GTEFHX0VNVV9FREdFOwotI2VuZGlmCi0KICAgICBpZiAoKHJldCA9IGZmX21zbXBlZzRfZGVjb2RlX2luaXQoYXZjdHgpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBmZl93bXYyX2NvbW1vbl9pbml0KHcpOwogCi0gICAgZmZfaW50cmF4OF9jb21tb25faW5pdCgmdy0+eDgsICZ3LT5zKTsKLQotICAgIHJldHVybiAwOworICAgIHJldHVybiBmZl9pbnRyYXg4X2NvbW1vbl9pbml0KGF2Y3R4LCAmdy0+eDgsICZ3LT5zLmlkc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+cy5ibG9jaywgdy0+cy5ibG9ja19sYXN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPnMubWJfd2lkdGgsIHctPnMubWJfaGVpZ2h0KTsKIH0KIAogc3RhdGljIGF2X2NvbGQgaW50IHdtdjJfZGVjb2RlX2VuZChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dtdjJkc3AuYyBiL2xpYmF2Y29kZWMvd212MmRzcC5jCmluZGV4IDQwZTBiZWYuLjU0M2YwMWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvd212MmRzcC5jCisrKyBiL2xpYmF2Y29kZWMvd212MmRzcC5jCkBAIC00OCw4ICs0OCw4IEBACiAgICAgYTQgPSBXMCAqIGJbMF0gLSBXMCAqIGJbNF07CiAKICAgICAvKiBzdGVwIDIgKi8KLSAgICBzMSA9ICgxODEgKiAoYTEgLSBhNSArIGE3IC0gYTMpICsgMTI4KSA+PiA4OyAvLyAxLCAzLCA1LCA3Ci0gICAgczIgPSAoMTgxICogKGExIC0gYTUgLSBhNyArIGEzKSArIDEyOCkgPj4gODsKKyAgICBzMSA9IChpbnQpKDE4MVUgKiAoYTEgLSBhNSArIGE3IC0gYTMpICsgMTI4KSA+PiA4OyAvLyAxLCAzLCA1LCA3CisgICAgczIgPSAoaW50KSgxODFVICogKGExIC0gYTUgLSBhNyArIGEzKSArIDEyOCkgPj4gODsKIAogICAgIC8qIHN0ZXAgMyAqLwogICAgIGJbMF0gPSAoYTAgKyBhMiArIGExICsgYTUgKyAoMSA8PCA3KSkgPj4gODsKQEAgLTc4LDggKzc4LDggQEAKICAgICBhNCA9IChXMCAqIGJbOCAqIDBdIC0gVzAgKiBiWzggKiA0XSAgICApID4+IDM7CiAKICAgICAvKiBzdGVwIDIgKi8KLSAgICBzMSA9ICgxODEgKiAoYTEgLSBhNSArIGE3IC0gYTMpICsgMTI4KSA+PiA4OwotICAgIHMyID0gKDE4MSAqIChhMSAtIGE1IC0gYTcgKyBhMykgKyAxMjgpID4+IDg7CisgICAgczEgPSAoaW50KSgxODFVICogKGExIC0gYTUgKyBhNyAtIGEzKSArIDEyOCkgPj4gODsKKyAgICBzMiA9IChpbnQpKDE4MVUgKiAoYTEgLSBhNSAtIGE3ICsgYTMpICsgMTI4KSA+PiA4OwogCiAgICAgLyogc3RlcCAzICovCiAgICAgYls4ICogMF0gPSAoYTAgKyBhMiArIGExICsgYTUgKyAoMSA8PCAxMykpID4+IDE0OwpAQCAtOTMsNyArOTMsNyBAQAogICAgIGJbOCAqIDddID0gKGEwICsgYTIgLSBhMSAtIGE1ICsgKDEgPDwgMTMpKSA+PiAxNDsKIH0KIAotc3RhdGljIHZvaWQgd212Ml9pZGN0X2FkZF9jKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQorc3RhdGljIHZvaWQgd212Ml9pZGN0X2FkZF9jKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGludCBpOwogCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHdtdjJfaWRjdF9wdXRfYyh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3N0YXRpYyB2b2lkIHdtdjJfaWRjdF9wdXRfYyh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKIHsKICAgICBpbnQgaTsKIApAQCAtMjYyLDQgKzI2Miw3IEBACiAgICAgYy0+cHV0X21zcGVsX3BpeGVsc190YWJbNV0gPSBwdXRfbXNwZWw4X21jMTJfYzsKICAgICBjLT5wdXRfbXNwZWxfcGl4ZWxzX3RhYls2XSA9IHB1dF9tc3BlbDhfbWMyMl9jOwogICAgIGMtPnB1dF9tc3BlbF9waXhlbHNfdGFiWzddID0gcHV0X21zcGVsOF9tYzMyX2M7CisKKyAgICBpZiAoQVJDSF9NSVBTKQorICAgICAgICBmZl93bXYyZHNwX2luaXRfbWlwcyhjKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvd212MmRzcC5oIGIvbGliYXZjb2RlYy93bXYyZHNwLmgKaW5kZXggMGJmOTQ4OS4uNWU0MGIzMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy93bXYyZHNwLmgKKysrIGIvbGliYXZjb2RlYy93bXYyZHNwLmgKQEAgLTI0LDggKzI0LDggQEAKICNpbmNsdWRlICJxcGVsZHNwLmgiCiAKIHR5cGVkZWYgc3RydWN0IFdNVjJEU1BDb250ZXh0IHsKLSAgICB2b2lkICgqaWRjdF9hZGQpKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKLSAgICB2b2lkICgqaWRjdF9wdXQpKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKKyAgICB2b2lkICgqaWRjdF9hZGQpKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKKyAgICB2b2lkICgqaWRjdF9wdXQpKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKIAogICAgIHFwZWxfbWNfZnVuYyBwdXRfbXNwZWxfcGl4ZWxzX3RhYls4XTsKIApAQCAtMzMsNSArMzMsNiBAQAogfSBXTVYyRFNQQ29udGV4dDsKIAogdm9pZCBmZl93bXYyZHNwX2luaXQoV01WMkRTUENvbnRleHQgKmMpOwordm9pZCBmZl93bXYyZHNwX2luaXRfbWlwcyhXTVYyRFNQQ29udGV4dCAqYyk7CiAKICNlbmRpZiAvKiBBVkNPREVDX1dNVjJEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy93bXYyZW5jLmMgYi9saWJhdmNvZGVjL3dtdjJlbmMuYwppbmRleCAzZWQ4YjVmLi43NGFlMTJiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3dtdjJlbmMuYworKysgYi9saWJhdmNvZGVjL3dtdjJlbmMuYwpAQCAtODEsNyArODEsNyBAQAogICAgIHB1dF9iaXRzKCZzLT5wYiwgNSwgcy0+cXNjYWxlKTsKIAogICAgIHMtPmRjX3RhYmxlX2luZGV4ICA9IDE7Ci0gICAgcy0+bXZfdGFibGVfaW5kZXggID0gMTsgLyogb25seSBpZiBQIGZyYW1lICovCisgICAgcy0+bXZfdGFibGVfaW5kZXggID0gMTsgLyogb25seSBpZiBQLWZyYW1lICovCiAgICAgcy0+cGVyX21iX3JsX3RhYmxlID0gMDsKICAgICBzLT5tc3BlbCAgICAgICAgICAgPSAwOwogICAgIHctPnBlcl9tYl9hYnQgICAgICA9IDA7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3dudjEuYyBiL2xpYmF2Y29kZWMvd252MS5jCmluZGV4IDlmZjk5YjIuLjkxNWU5YzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvd252MS5jCisrKyBiL2xpYmF2Y29kZWMvd252MS5jCkBAIC01Miw3ICs1Miw3IEBACiAgICAgaWYgKHYgPT0gMTUpCiAgICAgICAgIHJldHVybiBmZl9yZXZlcnNlW2dldF9iaXRzKCZ3LT5nYiwgOCAtIHctPnNoaWZ0KV07CiAgICAgZWxzZQotICAgICAgICByZXR1cm4gYmFzZV92YWx1ZSArICgodiAtIDcpIDw8IHctPnNoaWZ0KTsKKyAgICAgICAgcmV0dXJuIGJhc2VfdmFsdWUgKyAoKHYgLSA3VSkgPDwgdy0+c2hpZnQpOwogfQogCiBzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCkBAIC02OCw3ICs2OCw3IEBACiAgICAgaW50IHByZXZfeSA9IDAsIHByZXZfdSA9IDAsIHByZXZfdiA9IDA7CiAgICAgdWludDhfdCAqcmJ1ZjsKIAotICAgIGlmIChidWZfc2l6ZSA8PSA4KSB7CisgICAgaWYgKGJ1Zl9zaXplIDwgOCArIGF2Y3R4LT5oZWlnaHQgKiAoYXZjdHgtPndpZHRoLzIpLzgpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQYWNrZXQgc2l6ZSAlZCBpcyB0b28gc21hbGxcbiIsIGJ1Zl9zaXplKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy93cmFwcGVkX2F2ZnJhbWUuYyBiL2xpYmF2Y29kZWMvd3JhcHBlZF9hdmZyYW1lLmMKaW5kZXggMTNjOGQ4YS4uODVmZjMyZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy93cmFwcGVkX2F2ZnJhbWUuYworKysgYi9saWJhdmNvZGVjL3dyYXBwZWRfYXZmcmFtZS5jCkBAIC0yNSw2ICsyNSw3IEBACiAgKi8KIAogI2luY2x1ZGUgImF2Y29kZWMuaCIKKyNpbmNsdWRlICJkZWNvZGUuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCkBAIC00MywxOSArNDQsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lLCBpbnQgKmdvdF9wYWNrZXQpCiB7CiAgICAgQVZGcmFtZSAqd3JhcHBlZCA9IGF2X2ZyYW1lX2Nsb25lKGZyYW1lKTsKKyAgICB1aW50OF90ICpkYXRhOworICAgIGludCBzaXplID0gc2l6ZW9mKCp3cmFwcGVkKSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkU7CiAKICAgICBpZiAoIXdyYXBwZWQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBwa3QtPmJ1ZiA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QgKil3cmFwcGVkLCBzaXplb2YoKndyYXBwZWQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkX2F2ZnJhbWVfcmVsZWFzZV9idWZmZXIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0JVRkZFUl9GTEFHX1JFQURPTkxZKTsKLSAgICBpZiAoIXBrdC0+YnVmKSB7CisgICAgZGF0YSA9IGF2X21hbGxvY3ooc2l6ZSk7CisgICAgaWYgKCFkYXRhKSB7CiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJndyYXBwZWQpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KIAotICAgIHBrdC0+ZGF0YSA9ICh1aW50OF90ICopd3JhcHBlZDsKKyAgICBwa3QtPmJ1ZiA9IGF2X2J1ZmZlcl9jcmVhdGUoZGF0YSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZF9hdmZyYW1lX3JlbGVhc2VfYnVmZmVyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7CisgICAgaWYgKCFwa3QtPmJ1ZikgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZ3cmFwcGVkKTsKKyAgICAgICAgYXZfZnJlZXAoJmRhdGEpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGF2X2ZyYW1lX21vdmVfcmVmKChBVkZyYW1lKilkYXRhLCB3cmFwcGVkKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZ3cmFwcGVkKTsKKworICAgIHBrdC0+ZGF0YSA9IGRhdGE7CiAgICAgcGt0LT5zaXplID0gc2l6ZW9mKCp3cmFwcGVkKTsKIAogICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwpAQCAtNjMsNiArNzYsMzkgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCB3cmFwcGVkX2F2ZnJhbWVfZGVjb2RlKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmdvdF9mcmFtZSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkZyYW1lICppbiwgKm91dDsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKCEocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX1RSVVNURUQpKSB7CisgICAgICAgIC8vIFRoaXMgZGVjb2RlciBpcyBub3QgdXNhYmxlIHdpdGggdW50cnVzdGVkIGlucHV0LgorICAgICAgICByZXR1cm4gQVZFUlJPUihFUEVSTSk7CisgICAgfQorCisgICAgaWYgKHBrdC0+c2l6ZSA8IHNpemVvZihBVkZyYW1lKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGluICA9IChBVkZyYW1lKilwa3QtPmRhdGE7CisgICAgb3V0ID0gZGF0YTsKKworICAgIGVyciA9IGZmX2RlY29kZV9mcmFtZV9wcm9wcyhhdmN0eCwgb3V0KTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGF2X2ZyYW1lX21vdmVfcmVmKG91dCwgaW4pOworCisgICAgZXJyID0gZmZfYXR0YWNoX2RlY29kZV9kYXRhKG91dCk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfZnJhbWVfdW5yZWYob3V0KTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqZ290X2ZyYW1lID0gMTsKKyAgICByZXR1cm4gMDsKK30KKwogQVZDb2RlYyBmZl93cmFwcGVkX2F2ZnJhbWVfZW5jb2RlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAid3JhcHBlZF9hdmZyYW1lIiwKICAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVZGcmFtZSB0byBBVlBhY2tldCBwYXNzdGhyb3VnaCIpLApAQCAtNzEsMyArMTE3LDEyIEBACiAgICAgLmVuY29kZTIgICAgICAgID0gd3JhcHBlZF9hdmZyYW1lX2VuY29kZSwKICAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAogfTsKKworQVZDb2RlYyBmZl93cmFwcGVkX2F2ZnJhbWVfZGVjb2RlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAid3JhcHBlZF9hdmZyYW1lIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQVZQYWNrZXQgdG8gQVZGcmFtZSBwYXNzdGhyb3VnaCIpLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XUkFQUEVEX0FWRlJBTUUsCisgICAgLmRlY29kZSAgICAgICAgID0gd3JhcHBlZF9hdmZyYW1lX2RlY29kZSwKKyAgICAuY2Fwc19pbnRlcm5hbCAgPSBGRl9DT0RFQ19DQVBfSU5JVF9USFJFQURTQUZFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L01ha2VmaWxlIGIvbGliYXZjb2RlYy94ODYvTWFrZWZpbGUKaW5kZXggNjY4YTliZS4uMjM1MGM4YiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvTWFrZWZpbGUKKysrIGIvbGliYXZjb2RlYy94ODYvTWFrZWZpbGUKQEAgLTIwLDEwICsyMCwxMiBAQAogT0JKUy0kKENPTkZJR19IUEVMRFNQKSAgICAgICAgICAgICAgICAgKz0geDg2L2hwZWxkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0xMQVVERFNQKSAgICAgICAgICAgICAgICArPSB4ODYvbG9zc2xlc3NfYXVkaW9kc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0xMVklERFNQKSAgICAgICAgICAgICAgICArPSB4ODYvbG9zc2xlc3NfdmlkZW9kc3BfaW5pdC5vCitPQkpTLSQoQ09ORklHX0xMVklERU5DRFNQKSAgICAgICAgICAgICArPSB4ODYvbG9zc2xlc3NfdmlkZW9lbmNkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0hVRkZZVVZEU1ApICAgICAgICAgICAgICArPSB4ODYvaHVmZnl1dmRzcF9pbml0Lm8KLU9CSlMtJChDT05GSUdfSFVGRllVVkVOQ0RTUCkgICAgICAgICAgICs9IHg4Ni9odWZmeXV2ZW5jZHNwX21teC5vCitPQkpTLSQoQ09ORklHX0hVRkZZVVZFTkNEU1ApICAgICAgICAgICArPSB4ODYvaHVmZnl1dmVuY2RzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfSURDVERTUCkgICAgICAgICAgICAgICAgICs9IHg4Ni9pZGN0ZHNwX2luaXQubwogT0JKUy0kKENPTkZJR19MUEMpICAgICAgICAgICAgICAgICAgICAgKz0geDg2L2xwYy5vCitPQkpTLSQoQ09ORklHX01EQ1QxNSkgICAgICAgICAgICAgICAgICArPSB4ODYvbWRjdDE1X2luaXQubwogT0JKUy0kKENPTkZJR19NRV9DTVApICAgICAgICAgICAgICAgICAgKz0geDg2L21lX2NtcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfTVBFR0FVRElPRFNQKSAgICAgICAgICAgICs9IHg4Ni9tcGVnYXVkaW9kc3AubwogT0JKUy0kKENPTkZJR19NUEVHVklERU8pICAgICAgICAgICAgICAgKz0geDg2L21wZWd2aWRlby5vICAgICAgICAgICAgICBcCkBAIC0zMyw2ICszNSw3IEBACiBPQkpTLSQoQ09ORklHX1BJWEJMT0NLRFNQKSAgICAgICAgICAgICArPSB4ODYvcGl4YmxvY2tkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX1FQRUxEU1ApICAgICAgICAgICAgICAgICArPSB4ODYvcXBlbGRzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfUlYzNERTUCkgICAgICAgICAgICAgICAgICs9IHg4Ni9ydjM0ZHNwX2luaXQubworT0JKUy0kKENPTkZJR19WQzFEU1ApICAgICAgICAgICAgICAgICAgKz0geDg2L3ZjMWRzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfVklERU9EU1ApICAgICAgICAgICAgICAgICs9IHg4Ni92aWRlb2RzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfVlAzRFNQKSAgICAgICAgICAgICAgICAgICs9IHg4Ni92cDNkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX1ZQOERTUCkgICAgICAgICAgICAgICAgICArPSB4ODYvdnA4ZHNwX2luaXQubwpAQCAtNDEsNiArNDQsNyBAQAogIyBkZWNvZGVycy9lbmNvZGVycwogT0JKUy0kKENPTkZJR19BQUNfREVDT0RFUikgICAgICAgICAgICAgKz0geDg2L2FhY3BzZHNwX2luaXQubyAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvc2JyZHNwX2luaXQubworT0JKUy0kKENPTkZJR19BQUNfRU5DT0RFUikgICAgICAgICAgICAgKz0geDg2L2FhY2VuY2RzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfQURQQ01fRzcyMl9ERUNPREVSKSAgICAgICs9IHg4Ni9nNzIyZHNwX2luaXQubwogT0JKUy0kKENPTkZJR19BRFBDTV9HNzIyX0VOQ09ERVIpICAgICAgKz0geDg2L2c3MjJkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0FMQUNfREVDT0RFUikgICAgICAgICAgICArPSB4ODYvYWxhY2RzcF9pbml0Lm8KQEAgLTQ4LDYgKzUyLDkgQEAKIE9CSlMtJChDT05GSUdfQ0FWU19ERUNPREVSKSAgICAgICAgICAgICs9IHg4Ni9jYXZzZHNwLm8KIE9CSlMtJChDT05GSUdfRENBX0RFQ09ERVIpICAgICAgICAgICAgICs9IHg4Ni9kY2Fkc3BfaW5pdC5vIHg4Ni9zeW50aF9maWx0ZXJfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0ROWEhEX0VOQ09ERVIpICAgICAgICAgICArPSB4ODYvZG54aGRlbmNfaW5pdC5vCitPQkpTLSQoQ09ORklHX0VYUl9ERUNPREVSKSAgICAgICAgICAgICArPSB4ODYvZXhyZHNwX2luaXQubworT0JKUy0kKENPTkZJR19PUFVTX0RFQ09ERVIpICAgICAgICAgICAgKz0geDg2L29wdXNfZHNwX2luaXQubworT0JKUy0kKENPTkZJR19PUFVTX0VOQ09ERVIpICAgICAgICAgICAgKz0geDg2L29wdXNfZHNwX2luaXQubwogT0JKUy0kKENPTkZJR19IRVZDX0RFQ09ERVIpICAgICAgICAgICAgKz0geDg2L2hldmNkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0pQRUcyMDAwX0RFQ09ERVIpICAgICAgICArPSB4ODYvanBlZzIwMDBkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX01MUF9ERUNPREVSKSAgICAgICAgICAgICArPSB4ODYvbWxwZHNwX2luaXQubwpAQCAtNTYsMTQgKzYzLDE3IEBACiBPQkpTLSQoQ09ORklHX1BST1JFU19ERUNPREVSKSAgICAgICAgICArPSB4ODYvcHJvcmVzZHNwX2luaXQubwogT0JKUy0kKENPTkZJR19QUk9SRVNfTEdQTF9ERUNPREVSKSAgICAgKz0geDg2L3Byb3Jlc2RzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfUlY0MF9ERUNPREVSKSAgICAgICAgICAgICs9IHg4Ni9ydjQwZHNwX2luaXQubworT0JKUy0kKENPTkZJR19TQkNfRU5DT0RFUikgICAgICAgICAgICAgKz0geDg2L3NiY2RzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfU1ZRMV9FTkNPREVSKSAgICAgICAgICAgICs9IHg4Ni9zdnExZW5jX2luaXQubwogT0JKUy0kKENPTkZJR19UQUtfREVDT0RFUikgICAgICAgICAgICAgKz0geDg2L3Rha2RzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfVFJVRUhEX0RFQ09ERVIpICAgICAgICAgICs9IHg4Ni9tbHBkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX1RUQV9ERUNPREVSKSAgICAgICAgICAgICArPSB4ODYvdHRhZHNwX2luaXQubworT0JKUy0kKENPTkZJR19UVEFfRU5DT0RFUikgICAgICAgICAgICAgKz0geDg2L3R0YWVuY2RzcF9pbml0Lm8KK09CSlMtJChDT05GSUdfVVRWSURFT19ERUNPREVSKSAgICAgICAgICs9IHg4Ni91dHZpZGVvZHNwX2luaXQubwogT0JKUy0kKENPTkZJR19WMjEwX0RFQ09ERVIpICAgICAgICAgICAgKz0geDg2L3YyMTAtaW5pdC5vCiBPQkpTLSQoQ09ORklHX1YyMTBfRU5DT0RFUikgICAgICAgICAgICArPSB4ODYvdjIxMGVuY19pbml0Lm8KLU9CSlMtJChDT05GSUdfVkMxX0RFQ09ERVIpICAgICAgICAgICAgICs9IHg4Ni92YzFkc3BfaW5pdC5vCiBPQkpTLSQoQ09ORklHX1ZPUkJJU19ERUNPREVSKSAgICAgICAgICArPSB4ODYvdm9yYmlzZHNwX2luaXQubworT0JKUy0kKENPTkZJR19WUDNfREVDT0RFUikgICAgICAgICAgICAgKz0geDg2L2hwZWxkc3BfdnAzX2luaXQubwogT0JKUy0kKENPTkZJR19WUDZfREVDT0RFUikgICAgICAgICAgICAgKz0geDg2L3ZwNmRzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfVlA5X0RFQ09ERVIpICAgICAgICAgICAgICs9IHg4Ni92cDlkc3BfaW5pdC5vICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3ZwOWRzcF9pbml0XzEwYnBwLm8gICAgICBcCkBAIC03NSw5NSArODUsMTA3IEBACiAjIEdDQyBpbmxpbmUgYXNzZW1ibHkgb3B0aW1pemF0aW9ucwogIyBzdWJzeXN0ZW1zCiBNTVgtT0JKUy0kKENPTkZJR19GRENURFNQKSAgICAgICAgICAgICArPSB4ODYvZmRjdC5vCi1NTVgtT0JKUy0kKENPTkZJR19JRENURFNQKSAgICAgICAgICAgICArPSB4ODYvc2ltcGxlX2lkY3QubworTU1YLU9CSlMtJChDT05GSUdfVkMxRFNQKSAgICAgICAgICAgICAgKz0geDg2L3ZjMWRzcF9tbXgubwogCiAjIGRlY29kZXJzL2VuY29kZXJzCiBNTVgtT0JKUy0kKENPTkZJR19TTk9XX0RFQ09ERVIpICAgICAgICArPSB4ODYvc25vd2RzcC5vCiBNTVgtT0JKUy0kKENPTkZJR19TTk9XX0VOQ09ERVIpICAgICAgICArPSB4ODYvc25vd2RzcC5vCi1NTVgtT0JKUy0kKENPTkZJR19WQzFfREVDT0RFUikgICAgICAgICArPSB4ODYvdmMxZHNwX21teC5vCiAKICMgc3Vic3lzdGVtcwotWUFTTS1PQkpTLSQoQ09ORklHX0FDM0RTUCkgICAgICAgICAgICAgKz0geDg2L2FjM2RzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfQVVESU9EU1ApICAgICAgICAgICArPSB4ODYvYXVkaW9kc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0JMT0NLRFNQKSAgICAgICAgICAgKz0geDg2L2Jsb2NrZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19CU1dBUERTUCkgICAgICAgICAgICs9IHg4Ni9ic3dhcGRzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfRENUKSAgICAgICAgICAgICAgICArPSB4ODYvZGN0MzIubwotWUFTTS1PQkpTLSQoQ09ORklHX0ZGVCkgICAgICAgICAgICAgICAgKz0geDg2L2ZmdC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfRk1UQ09OVkVSVCkgICAgICAgICArPSB4ODYvZm10Y29udmVydC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfSDI2M0RTUCkgICAgICAgICAgICArPSB4ODYvaDI2M19sb29wZmlsdGVyLm8KLVlBU00tT0JKUy0kKENPTkZJR19IMjY0Q0hST01BKSAgICAgICAgICs9IHg4Ni9oMjY0X2Nocm9tYW1jLm8gICAgICAgICAgIFwKK1g4NkFTTS1PQkpTLSQoQ09ORklHX0FDM0RTUCkgICAgICAgICAgICs9IHg4Ni9hYzNkc3AubyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9hYzNkc3BfZG93bm1peC5vCitYODZBU00tT0JKUy0kKENPTkZJR19BVURJT0RTUCkgICAgICAgICArPSB4ODYvYXVkaW9kc3AubworWDg2QVNNLU9CSlMtJChDT05GSUdfQkxPQ0tEU1ApICAgICAgICAgKz0geDg2L2Jsb2NrZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0JTV0FQRFNQKSAgICAgICAgICs9IHg4Ni9ic3dhcGRzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19EQ1QpICAgICAgICAgICAgICArPSB4ODYvZGN0MzIubworWDg2QVNNLU9CSlMtJChDT05GSUdfRkZUKSAgICAgICAgICAgICAgKz0geDg2L2ZmdC5vCitYODZBU00tT0JKUy0kKENPTkZJR19GTVRDT05WRVJUKSAgICAgICArPSB4ODYvZm10Y29udmVydC5vCitYODZBU00tT0JKUy0kKENPTkZJR19IMjYzRFNQKSAgICAgICAgICArPSB4ODYvaDI2M19sb29wZmlsdGVyLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0gyNjRDSFJPTUEpICAgICAgICs9IHg4Ni9oMjY0X2Nocm9tYW1jLm8gICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X2Nocm9tYW1jXzEwYml0Lm8KLVlBU00tT0JKUy0kKENPTkZJR19IMjY0RFNQKSAgICAgICAgICAgICs9IHg4Ni9oMjY0X2RlYmxvY2subyAgICAgICAgICAgIFwKK1g4NkFTTS1PQkpTLSQoQ09ORklHX0gyNjREU1ApICAgICAgICAgICs9IHg4Ni9oMjY0X2RlYmxvY2subyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X2RlYmxvY2tfMTBiaXQubyAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X2lkY3QubyAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X2lkY3RfMTBiaXQubyAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X3dlaWdodC5vICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oMjY0X3dlaWdodF8xMGJpdC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfSDI2NFBSRUQpICAgICAgICAgICArPSB4ODYvaDI2NF9pbnRyYXByZWQubyAgICAgICAgICBcCitYODZBU00tT0JKUy0kKENPTkZJR19IMjY0UFJFRCkgICAgICAgICArPSB4ODYvaDI2NF9pbnRyYXByZWQubyAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvaDI2NF9pbnRyYXByZWRfMTBiaXQubwotWUFTTS1PQkpTLSQoQ09ORklHX0gyNjRRUEVMKSAgICAgICAgICAgKz0geDg2L2gyNjRfcXBlbF84Yml0Lm8gICAgICAgICAgXAorWDg2QVNNLU9CSlMtJChDT05GSUdfSDI2NFFQRUwpICAgICAgICAgKz0geDg2L2gyNjRfcXBlbF84Yml0Lm8gICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2gyNjRfcXBlbF8xMGJpdC5vICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2ZwZWwubyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3FwZWwubwotWUFTTS1PQkpTLSQoQ09ORklHX0hQRUxEU1ApICAgICAgICAgICAgKz0geDg2L2ZwZWwubyAgICAgICAgICAgICAgICAgICAgXAorWDg2QVNNLU9CSlMtJChDT05GSUdfSFBFTERTUCkgICAgICAgICAgKz0geDg2L2ZwZWwubyAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L2hwZWxkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0hVRkZZVVZEU1ApICAgICAgICAgKz0geDg2L2h1ZmZ5dXZkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0hVRkZZVVZFTkNEU1ApICAgICAgKz0geDg2L2h1ZmZ5dXZlbmNkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICAgKz0geDg2L2lkY3Rkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0xMQVVERFNQKSAgICAgICAgICAgKz0geDg2L2xvc3NsZXNzX2F1ZGlvZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19MTFZJRERTUCkgICAgICAgICAgICs9IHg4Ni9sb3NzbGVzc192aWRlb2RzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfTUVfQ01QKSAgICAgICAgICAgICArPSB4ODYvbWVfY21wLm8KLVlBU00tT0JKUy0kKENPTkZJR19NUEVHQVVESU9EU1ApICAgICAgICs9IHg4Ni9pbWRjdDM2Lm8KLVlBU00tT0JKUy0kKENPTkZJR19NUEVHVklERU9FTkMpICAgICAgICs9IHg4Ni9tcGVndmlkZW9lbmNkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX1BJWEJMT0NLRFNQKSAgICAgICAgKz0geDg2L3BpeGJsb2NrZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19RUEVMRFNQKSAgICAgICAgICAgICs9IHg4Ni9xcGVsZHNwLm8gICAgICAgICAgICAgICAgIFwKK1g4NkFTTS1PQkpTLSQoQ09ORklHX0hVRkZZVVZEU1ApICAgICAgICs9IHg4Ni9odWZmeXV2ZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0hVRkZZVVZFTkNEU1ApICAgICs9IHg4Ni9odWZmeXV2ZW5jZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0lEQ1REU1ApICAgICAgICAgICs9IHg4Ni9pZGN0ZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0xMQVVERFNQKSAgICAgICAgICs9IHg4Ni9sb3NzbGVzc19hdWRpb2RzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19MTFZJRERTUCkgICAgICAgICArPSB4ODYvbG9zc2xlc3NfdmlkZW9kc3AubworWDg2QVNNLU9CSlMtJChDT05GSUdfTExWSURFTkNEU1ApICAgICAgKz0geDg2L2xvc3NsZXNzX3ZpZGVvZW5jZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX01EQ1QxNSkgICAgICAgICAgICs9IHg4Ni9tZGN0MTUubworWDg2QVNNLU9CSlMtJChDT05GSUdfTUVfQ01QKSAgICAgICAgICAgKz0geDg2L21lX2NtcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19NUEVHQVVESU9EU1ApICAgICArPSB4ODYvaW1kY3QzNi5vCitYODZBU00tT0JKUy0kKENPTkZJR19NUEVHVklERU9FTkMpICAgICArPSB4ODYvbXBlZ3ZpZGVvZW5jZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX09QVVNfRU5DT0RFUikgICAgICs9IHg4Ni9vcHVzX3B2cV9zZWFyY2gubworWDg2QVNNLU9CSlMtJChDT05GSUdfUElYQkxPQ0tEU1ApICAgICAgKz0geDg2L3BpeGJsb2NrZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1FQRUxEU1ApICAgICAgICAgICs9IHg4Ni9xcGVsZHNwLm8gICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9mcGVsLm8gICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9xcGVsLm8KLVlBU00tT0JKUy0kKENPTkZJR19SVjM0RFNQKSAgICAgICAgICAgICs9IHg4Ni9ydjM0ZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19JRENURFNQKSAgICAgICAgICAgICs9IHg4Ni9zaW1wbGVfaWRjdDEwLm8KLVlBU00tT0JKUy0kKENPTkZJR19WSURFT0RTUCkgICAgICAgICAgICs9IHg4Ni92aWRlb2RzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfVlAzRFNQKSAgICAgICAgICAgICArPSB4ODYvdnAzZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19WUDhEU1ApICAgICAgICAgICAgICs9IHg4Ni92cDhkc3AubyAgICAgICAgICAgICAgICAgIFwKK1g4NkFTTS1PQkpTLSQoQ09ORklHX1JWMzREU1ApICAgICAgICAgICs9IHg4Ni9ydjM0ZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1ZDMURTUCkgICAgICAgICAgICs9IHg4Ni92YzFkc3BfbG9vcGZpbHRlci5vICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni92YzFkc3BfbWMubworWDg2QVNNLU9CSlMtJChDT05GSUdfSURDVERTUCkgICAgICAgICAgKz0geDg2L3NpbXBsZV9pZGN0MTAubyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3NpbXBsZV9pZGN0Lm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1ZJREVPRFNQKSAgICAgICAgICs9IHg4Ni92aWRlb2RzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19WUDNEU1ApICAgICAgICAgICArPSB4ODYvdnAzZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1ZQOERTUCkgICAgICAgICAgICs9IHg4Ni92cDhkc3AubyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni92cDhkc3BfbG9vcGZpbHRlci5vCiAKICMgZGVjb2RlcnMvZW5jb2RlcnMKLVlBU00tT0JKUy0kKENPTkZJR19BQUNfREVDT0RFUikgICAgICAgICs9IHg4Ni9hYWNwc2RzcC5vICAgICAgICAgICAgICAgIFwKK1g4NkFTTS1PQkpTLSQoQ09ORklHX0FBQ19ERUNPREVSKSAgICAgICs9IHg4Ni9hYWNwc2RzcC5vICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9zYnJkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0FEUENNX0c3MjJfREVDT0RFUikgKz0geDg2L2c3MjJkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0FEUENNX0c3MjJfRU5DT0RFUikgKz0geDg2L2c3MjJkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0FMQUNfREVDT0RFUikgICAgICAgKz0geDg2L2FsYWNkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX0FQTkdfREVDT0RFUikgICAgICAgKz0geDg2L3BuZ2RzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfRENBX0RFQ09ERVIpICAgICAgICArPSB4ODYvZGNhZHNwLm8geDg2L3N5bnRoX2ZpbHRlci5vCi1ZQVNNLU9CSlMtJChDT05GSUdfRElSQUNfREVDT0RFUikgICAgICArPSB4ODYvZGlyYWNkc3AubyAgICAgICAgICAgICAgICBcCitYODZBU00tT0JKUy0kKENPTkZJR19BQUNfRU5DT0RFUikgICAgICArPSB4ODYvYWFjZW5jZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0FEUENNX0c3MjJfREVDT0RFUikgKz0geDg2L2c3MjJkc3AubworWDg2QVNNLU9CSlMtJChDT05GSUdfQURQQ01fRzcyMl9FTkNPREVSKSArPSB4ODYvZzcyMmRzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19BTEFDX0RFQ09ERVIpICAgICArPSB4ODYvYWxhY2RzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19BUE5HX0RFQ09ERVIpICAgICArPSB4ODYvcG5nZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0NBVlNfREVDT0RFUikgICAgICs9IHg4Ni9jYXZzaWRjdC5vCitYODZBU00tT0JKUy0kKENPTkZJR19EQ0FfREVDT0RFUikgICAgICArPSB4ODYvZGNhZHNwLm8geDg2L3N5bnRoX2ZpbHRlci5vCitYODZBU00tT0JKUy0kKENPTkZJR19ESVJBQ19ERUNPREVSKSAgICArPSB4ODYvZGlyYWNkc3AubyAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvZGlyYWNfZHd0Lm8KLVlBU00tT0JKUy0kKENPTkZJR19ETlhIRF9FTkNPREVSKSAgICAgICs9IHg4Ni9kbnhoZGVuYy5vCi1ZQVNNLU9CSlMtJChDT05GSUdfRkxBQ19ERUNPREVSKSAgICAgICArPSB4ODYvZmxhY2RzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19ETlhIRF9FTkNPREVSKSAgICArPSB4ODYvZG54aGRlbmMubworWDg2QVNNLU9CSlMtJChDT05GSUdfRVhSX0RFQ09ERVIpICAgICAgKz0geDg2L2V4cmRzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19GTEFDX0RFQ09ERVIpICAgICArPSB4ODYvZmxhY2RzcC5vCiBpZmRlZiBDT05GSUdfR1BMCi1ZQVNNLU9CSlMtJChDT05GSUdfRkxBQ19FTkNPREVSKSAgICAgICArPSB4ODYvZmxhY19kc3BfZ3BsLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0ZMQUNfRU5DT0RFUikgICAgICs9IHg4Ni9mbGFjX2RzcF9ncGwubwogZW5kaWYKLVlBU00tT0JKUy0kKENPTkZJR19IRVZDX0RFQ09ERVIpICAgICAgICs9IHg4Ni9oZXZjX21jLm8gICAgICAgICAgICAgICAgIFwKK1g4NkFTTS1PQkpTLSQoQ09ORklHX0hFVkNfREVDT0RFUikgICAgICs9IHg4Ni9oZXZjX2FkZF9yZXMubyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oZXZjX2RlYmxvY2subyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oZXZjX2lkY3QubyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oZXZjX3Jlc19hZGQubyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oZXZjX21jLm8gICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oZXZjX3Nhby5vICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9oZXZjX3Nhb18xMGJpdC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfSlBFRzIwMDBfREVDT0RFUikgICArPSB4ODYvanBlZzIwMDBkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX01MUF9ERUNPREVSKSAgICAgICAgKz0geDg2L21scGRzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfTVBFRzRfREVDT0RFUikgICAgICArPSB4ODYveHZpZGlkY3QubwotWUFTTS1PQkpTLSQoQ09ORklHX1BOR19ERUNPREVSKSAgICAgICAgKz0geDg2L3BuZ2RzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfUFJPUkVTX0RFQ09ERVIpICAgICArPSB4ODYvcHJvcmVzZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19QUk9SRVNfTEdQTF9ERUNPREVSKSArPSB4ODYvcHJvcmVzZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19SVjQwX0RFQ09ERVIpICAgICAgICs9IHg4Ni9ydjQwZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19TVlExX0VOQ09ERVIpICAgICAgICs9IHg4Ni9zdnExZW5jLm8KLVlBU00tT0JKUy0kKENPTkZJR19UQUtfREVDT0RFUikgICAgICAgICs9IHg4Ni90YWtkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX1RSVUVIRF9ERUNPREVSKSAgICAgKz0geDg2L21scGRzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfVFRBX0RFQ09ERVIpICAgICAgICArPSB4ODYvdHRhZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19WMjEwX0VOQ09ERVIpICAgICAgICs9IHg4Ni92MjEwZW5jLm8KLVlBU00tT0JKUy0kKENPTkZJR19WMjEwX0RFQ09ERVIpICAgICAgICs9IHg4Ni92MjEwLm8KLVlBU00tT0JKUy0kKENPTkZJR19WQzFfREVDT0RFUikgICAgICAgICs9IHg4Ni92YzFkc3AubwotWUFTTS1PQkpTLSQoQ09ORklHX1ZPUkJJU19ERUNPREVSKSAgICAgKz0geDg2L3ZvcmJpc2RzcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfVlA2X0RFQ09ERVIpICAgICAgICArPSB4ODYvdnA2ZHNwLm8KLVlBU00tT0JKUy0kKENPTkZJR19WUDlfREVDT0RFUikgICAgICAgICs9IHg4Ni92cDlpbnRyYXByZWQubyAgICAgICAgICAgIFwKK1g4NkFTTS1PQkpTLSQoQ09ORklHX0pQRUcyMDAwX0RFQ09ERVIpICs9IHg4Ni9qcGVnMjAwMGRzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19NTFBfREVDT0RFUikgICAgICArPSB4ODYvbWxwZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX01QRUc0X0RFQ09ERVIpICAgICs9IHg4Ni94dmlkaWRjdC5vCitYODZBU00tT0JKUy0kKENPTkZJR19QTkdfREVDT0RFUikgICAgICArPSB4ODYvcG5nZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1BST1JFU19ERUNPREVSKSAgICs9IHg4Ni9wcm9yZXNkc3AubworWDg2QVNNLU9CSlMtJChDT05GSUdfUFJPUkVTX0xHUExfREVDT0RFUikgKz0geDg2L3Byb3Jlc2RzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19SVjQwX0RFQ09ERVIpICAgICArPSB4ODYvcnY0MGRzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19TQkNfRU5DT0RFUikgICAgICArPSB4ODYvc2JjZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1NWUTFfRU5DT0RFUikgICAgICs9IHg4Ni9zdnExZW5jLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1RBS19ERUNPREVSKSAgICAgICs9IHg4Ni90YWtkc3AubworWDg2QVNNLU9CSlMtJChDT05GSUdfVFJVRUhEX0RFQ09ERVIpICAgKz0geDg2L21scGRzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19UVEFfREVDT0RFUikgICAgICArPSB4ODYvdHRhZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1RUQV9FTkNPREVSKSAgICAgICs9IHg4Ni90dGFlbmNkc3AubworWDg2QVNNLU9CSlMtJChDT05GSUdfVVRWSURFT19ERUNPREVSKSAgKz0geDg2L3V0dmlkZW9kc3AubworWDg2QVNNLU9CSlMtJChDT05GSUdfVjIxMF9FTkNPREVSKSAgICAgKz0geDg2L3YyMTBlbmMubworWDg2QVNNLU9CSlMtJChDT05GSUdfVjIxMF9ERUNPREVSKSAgICAgKz0geDg2L3YyMTAubworWDg2QVNNLU9CSlMtJChDT05GSUdfVk9SQklTX0RFQ09ERVIpICAgKz0geDg2L3ZvcmJpc2RzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19WUDNfREVDT0RFUikgICAgICArPSB4ODYvaHBlbGRzcF92cDMubworWDg2QVNNLU9CSlMtJChDT05GSUdfVlA2X0RFQ09ERVIpICAgICAgKz0geDg2L3ZwNmRzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19WUDlfREVDT0RFUikgICAgICArPSB4ODYvdnA5aW50cmFwcmVkLm8gICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvdnA5aW50cmFwcmVkXzE2YnBwLm8gICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvdnA5aXR4Zm0ubyAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODYvdnA5aXR4Zm1fMTZicHAubyAgICAgICAgICBcCkBAIC0xNzEsNCArMTkzLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni92cDlscGZfMTZicHAubyAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni92cDltYy5vICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni92cDltY18xNmJwcC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfV0VCUF9ERUNPREVSKSAgICAgICArPSB4ODYvdnA4ZHNwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1dFQlBfREVDT0RFUikgICAgICs9IHg4Ni92cDhkc3AubwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvYWFjZW5jZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L2FhY2VuY2RzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhZjU3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L2FhY2VuY2RzcC5hc20KQEAgLTAsMCArMSw4NiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRCBvcHRpbWl6ZWQgQUFDIGVuY29kZXIgRFNQIGZ1bmN0aW9ucworOyoKKzsqIENvcHlyaWdodCAoQykgMjAxNiBSb3N0aXNsYXYgUGVobGl2YW5vdiA8YXRvbW51a2VyQGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitmbG9hdF9hYnNfbWFzazogdGltZXMgNCBkZCAweDdmZmZmZmZmCisKK1NFQ1RJT04gLnRleHQKKworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzt2b2lkIGZmX2Fic19wb3czNChmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIGNvbnN0IGludCBzaXplKTsKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJTklUX1hNTSBzc2UKK2NnbG9iYWwgYWJzX3BvdzM0LCAzLCAzLCAzLCBvdXQsIGluLCBzaXplCisgICAgbW92YSAgIG0yLCBbZmxvYXRfYWJzX21hc2tdCisgICAgc2hsICAgIHNpemVxLCAyCisgICAgYWRkICAgIGlucSwgc2l6ZXEKKyAgICBhZGQgICAgb3V0cSwgc2l6ZXEKKyAgICBuZWcgICAgc2l6ZXEKKy5sb29wOgorICAgIGFuZHBzICBtMCwgbTIsIFtpbnErc2l6ZXFdCisgICAgc3FydHBzIG0xLCBtMAorICAgIG11bHBzICBtMCwgbTEKKyAgICBzcXJ0cHMgbTAsIG0wCisgICAgbW92YSAgIFtvdXRxK3NpemVxXSwgbTAKKyAgICBhZGQgICAgc2l6ZXEsIG1tc2l6ZQorICAgIGpsICAgIC5sb29wCisgICAgUkVUCisKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7dm9pZCBmZl9hYWNfcXVhbnRpemVfYmFuZHMoaW50ICpvdXQsIGNvbnN0IGZsb2F0ICppbiwgY29uc3QgZmxvYXQgKnNjYWxlZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGlzX3NpZ25lZCwgaW50IG1heHZhbCwgY29uc3QgZmxvYXQgUTM0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJvdW5kaW5nKQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lOSVRfWE1NIHNzZTIKK2NnbG9iYWwgYWFjX3F1YW50aXplX2JhbmRzLCA1LCA1LCA2LCBvdXQsIGluLCBzY2FsZWQsIHNpemUsIGlzX3NpZ25lZCwgbWF4dmFsLCBRMzQsIHJvdW5kaW5nCislaWYgVU5JWDY0ID09IDAKKyAgICBtb3ZzcyAgICAgbTAsIFEzNG0KKyAgICBtb3ZzcyAgICAgbTEsIHJvdW5kaW5nbQorICAgIGN2dHNpMnNzICBtMywgZHdvcmQgbWF4dmFsbQorJWVsc2UKKyAgICBjdnRzaTJzcyAgbTMsIG1heHZhbGQKKyVlbmRpZgorICAgIHNodWZwcyAgICBtMCwgbTAsIDAKKyAgICBzaHVmcHMgICAgbTEsIG0xLCAwCisgICAgc2h1ZnBzICAgIG0zLCBtMywgMAorICAgIHNobCAgICAgICBpc19zaWduZWRkLCAzMQorICAgIG1vdmQgICAgICBtNCwgaXNfc2lnbmVkZAorICAgIHNodWZwcyAgICBtNCwgbTQsIDAKKyAgICBzaGwgICAgICAgc2l6ZWQsICAgMgorICAgIGFkZCAgICAgICBpbnEsIHNpemVxCisgICAgYWRkICAgICAgIG91dHEsIHNpemVxCisgICAgYWRkICAgICAgIHNjYWxlZHEsIHNpemVxCisgICAgbmVnICAgICAgIHNpemVxCisubG9vcDoKKyAgICBtdWxwcyAgICAgbTIsIG0wLCBbc2NhbGVkcStzaXplcV0KKyAgICBhZGRwcyAgICAgbTIsIG0xCisgICAgbWlucHMgICAgIG0yLCBtMworICAgIGFuZHBzICAgICBtNSwgbTQsIFtpbnErc2l6ZXFdCisgICAgb3JwcyAgICAgIG0yLCBtNQorICAgIGN2dHRwczJkcSBtMiwgbTIKKyAgICBtb3ZhICAgICAgW291dHErc2l6ZXFdLCBtMgorICAgIGFkZCAgICAgICBzaXplcSwgbW1zaXplCisgICAgamwgICAgICAgLmxvb3AKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2FhY2VuY2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9hYWNlbmNkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NjFjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni9hYWNlbmNkc3BfaW5pdC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBBQUMgZW5jb2RlciBhc3NlbWJseSBvcHRpbWl6YXRpb25zCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgUm9zdGlzbGF2IFBlaGxpdmFub3YgPGF0b21udWtlckBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYWFjZW5jLmgiCisKK3ZvaWQgZmZfYWJzX3BvdzM0X3NzZShmbG9hdCAqb3V0LCBjb25zdCBmbG9hdCAqaW4sIGNvbnN0IGludCBzaXplKTsKKwordm9pZCBmZl9hYWNfcXVhbnRpemVfYmFuZHNfc3NlMihpbnQgKm91dCwgY29uc3QgZmxvYXQgKmluLCBjb25zdCBmbG9hdCAqc2NhbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwgaW50IGlzX3NpZ25lZCwgaW50IG1heHZhbCwgY29uc3QgZmxvYXQgUTM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCByb3VuZGluZyk7CisKK2F2X2NvbGQgdm9pZCBmZl9hYWNfZHNwX2luaXRfeDg2KEFBQ0VuY0NvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9TU0UoY3B1X2ZsYWdzKSkKKyAgICAgICAgcy0+YWJzX3BvdzM0ICAgPSBmZl9hYnNfcG93MzRfc3NlOworCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgcy0+cXVhbnRfYmFuZHMgPSBmZl9hYWNfcXVhbnRpemVfYmFuZHNfc3NlMjsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2FhY3BzZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L2FhY3BzZHNwLmFzbQppbmRleCBkMTE4N2RmLi40YWNkMDg3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9hYWNwc2RzcC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvYWFjcHNkc3AuYXNtCkBAIC0zMyw1OSArMzMsNTYgQEAKIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAlbWFjcm8gUFNfQUREX1NRVUFSRVMgMQogY2dsb2JhbCBwc19hZGRfc3F1YXJlcywgMywgMywgJTEsIGRzdCwgc3JjLCBuCisgICAgc2hsICAgIG5kLCAzCisgICAgYWRkICBzcmNxLCBucQorICAgIG5lZyAgICBucQorCithbGlnbiAxNgogLmxvb3A6Ci0gICAgbW92YXBzIG0wLCBbc3JjcV0KLSAgICBtb3ZhcHMgbTEsIFtzcmNxK21tc2l6ZV0KKyAgICBtb3ZhcHMgbTAsIFtzcmNxK25xXQorICAgIG1vdmFwcyBtMSwgW3NyY3ErbnErbW1zaXplXQogICAgIG11bHBzICBtMCwgbTAKICAgICBtdWxwcyAgbTEsIG0xCi0laWYgY3B1ZmxhZyhzc2UzKQotICAgIGhhZGRwcyBtMCwgbTEKLSVlbHNlCi0gICAgbW92YXBzIG0zLCBtMAotICAgIG1vdmFwcyBtNCwgbTEKLSAgICBzaHVmcHMgbTMsIG0zLCBxMDMwMQotICAgIHNodWZwcyBtNCwgbTQsIHEwMzAxCi0gICAgYWRkcHMgIG0wLCBtMwotICAgIGFkZHBzICBtMSwgbTQKLSAgICBzaHVmcHMgbTAsIG0xLCBxMjAyMAotJWVuZGlmCisgICAgSEFERFBTIG0wLCBtMSwgbTIKICAgICBhZGRwcyAgbTAsIFtkc3RxXQogICAgIG1vdmFwcyBbZHN0cV0sIG0wCiAgICAgYWRkICBkc3RxLCBtbXNpemUKLSAgICBhZGQgIHNyY3EsIG1tc2l6ZSoyCi0gICAgc3ViICAgIG5kLCBtbXNpemUvNAotICAgIGpnIC5sb29wCisgICAgYWRkICAgIG5xLCBtbXNpemUqMgorICAgIGpsIC5sb29wCiAgICAgUkVQX1JFVAogJWVuZG1hY3JvCiAKIElOSVRfWE1NIHNzZQotUFNfQUREX1NRVUFSRVMgMworUFNfQUREX1NRVUFSRVMgMgogSU5JVF9YTU0gc3NlMwotUFNfQUREX1NRVUFSRVMgNQorUFNfQUREX1NRVUFSRVMgMwogCiA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogO3ZvaWQgZmZfcHNfbXVsX3BhaXJfc2luZ2xlX3NzZShmbG9hdCAoKmRzdClbMl0sIGZsb2F0ICgqc3JjMClbMl0sCiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqc3JjMSwgaW50IG4pOwogOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIElOSVRfWE1NIHNzZQotY2dsb2JhbCBwc19tdWxfcGFpcl9zaW5nbGUsIDQsIDUsIDQsIGRzdCwgc3JjMSwgc3JjMiwgbgotICAgIHhvciByNHEsIHI0cQorY2dsb2JhbCBwc19tdWxfcGFpcl9zaW5nbGUsIDQsIDQsIDQsIGRzdCwgc3JjMSwgc3JjMiwgbgorICAgIHNobCAgICAgIG5kLCAzCisgICAgYWRkICAgc3JjMXEsIG5xCisgICAgYWRkICAgIGRzdHEsIG5xCisgICAgbmVnICAgICAgbnEKIAorYWxpZ24gMTYKIC5sb29wOgotICAgIG1vdnUgICAgIG0wLCBbc3JjMXErcjRxXQotICAgIG1vdnUgICAgIG0xLCBbc3JjMXErcjRxK21tc2l6ZV0KKyAgICBtb3Z1ICAgICBtMCwgW3NyYzFxK25xXQorICAgIG1vdnUgICAgIG0xLCBbc3JjMXErbnErbW1zaXplXQogICAgIG1vdmEgICAgIG0yLCBbc3JjMnFdCiAgICAgbW92YSAgICAgbTMsIG0yCiAgICAgdW5wY2tscHMgbTIsIG0yCiAgICAgdW5wY2tocHMgbTMsIG0zCiAgICAgbXVscHMgICAgbTAsIG0yCiAgICAgbXVscHMgICAgbTEsIG0zCi0gICAgbW92YSBbZHN0cStyNHFdLCBtMAotICAgIG1vdmEgW2RzdHErcjRxK21tc2l6ZV0sIG0xCisgICAgbW92YSBbZHN0cStucV0sIG0wCisgICAgbW92YSBbZHN0cStucSttbXNpemVdLCBtMQogICAgIGFkZCAgIHNyYzJxLCBtbXNpemUKLSAgICBhZGQgICAgIHI0cSwgbW1zaXplKjIKLSAgICBzdWIgICAgICBuZCwgbW1zaXplLzQKLSAgICBqZyAubG9vcAorICAgIGFkZCAgICAgIG5xLCBtbXNpemUqMgorICAgIGpsIC5sb29wCiAgICAgUkVQX1JFVAogCiA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTk3LDggKzk0LDEwIEBACiBjZ2xvYmFsIHBzX3N0ZXJlb19pbnRlcnBvbGF0ZSwgNSwgNSwgNiwgbCwgciwgaCwgaF9zdGVwLCBuCiAgICAgbW92YXBzICAgbTAsIFtocV0KICAgICBtb3ZhcHMgICBtMSwgW2hfc3RlcHFdCi0gICAgY21wICAgICAgbmQsIDAKLSAgICBqbGUgLnJldAorICAgIHVucGNrbHBzIG00LCBtMCwgbTAKKyAgICB1bnBja2hwcyBtMCwgbTAKKyAgICB1bnBja2xwcyBtNSwgbTEsIG0xCisgICAgdW5wY2tocHMgbTEsIG0xCiAgICAgc2hsICAgICAgbmQsIDMKICAgICBhZGQgICAgICBscSwgbnEKICAgICBhZGQgICAgICBycSwgbnEKQEAgLTEwNiwyNyArMTA1LDMwMCBAQAogCiBhbGlnbiAxNgogLmxvb3A6CisgICAgYWRkcHMgICAgbTQsIG01CiAgICAgYWRkcHMgICAgbTAsIG0xCiAgICAgbW92ZGR1cCAgbTIsIFtscStucV0KICAgICBtb3ZkZHVwICBtMywgW3JxK25xXQotICAgIG1vdmFwcyAgIG00LCBtMAotICAgIG1vdmFwcyAgIG01LCBtMAotICAgIHVucGNrbHBzIG00LCBtNAotICAgIHVucGNraHBzIG01LCBtNQogICAgIG11bHBzICAgIG0yLCBtNAotICAgIG11bHBzICAgIG0zLCBtNQorICAgIG11bHBzICAgIG0zLCBtMAogICAgIGFkZHBzICAgIG0yLCBtMwogICAgIG1vdnNkICBbbHErbnFdLCBtMgogICAgIG1vdmhwcyBbcnErbnFdLCBtMgogICAgIGFkZCAgICAgIG5xLCA4CiAgICAgamwgLmxvb3AKLS5yZXQ6CiAgICAgUkVQX1JFVAogCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7dm9pZCBwc19zdGVyZW9faW50ZXJwb2xhdGVfaXBkb3BkX3NzZTMoZmxvYXQgKCpsKVsyXSwgZmxvYXQgKCpyKVsyXSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoWzJdWzRdLCBmbG9hdCBoX3N0ZXBbMl1bNF0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7Cis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJTklUX1hNTSBzc2UzCitjZ2xvYmFsIHBzX3N0ZXJlb19pbnRlcnBvbGF0ZV9pcGRvcGQsIDUsIDUsIDEwLCBsLCByLCBoLCBoX3N0ZXAsIG4KKyAgICBtb3ZhcHMgICBtMCwgW2hxXQorICAgIG1vdmFwcyAgIG0xLCBbaHErbW1zaXplXQorJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92YXBzICAgbTgsIFtoX3N0ZXBxXQorICAgIG1vdmFwcyAgIG05LCBbaF9zdGVwcSttbXNpemVdCisgICAgJWRlZmluZSAgSF9TVEVQMCBtOAorICAgICVkZWZpbmUgIEhfU1RFUDEgbTkKKyVlbHNlCisgICAgJWRlZmluZSAgSF9TVEVQMCBbaF9zdGVwcV0KKyAgICAlZGVmaW5lICBIX1NURVAxIFtoX3N0ZXBxK21tc2l6ZV0KKyVlbmRpZgorICAgIHNobCAgICAgIG5kLCAzCisgICAgYWRkICAgICAgbHEsIG5xCisgICAgYWRkICAgICAgcnEsIG5xCisgICAgbmVnICAgICAgbnEKKworYWxpZ24gMTYKKy5sb29wOgorICAgIGFkZHBzICAgIG0wLCBIX1NURVAwCisgICAgYWRkcHMgICAgbTEsIEhfU1RFUDEKKyAgICBtb3ZkZHVwICBtMiwgW2xxK25xXQorICAgIG1vdmRkdXAgIG0zLCBbcnErbnFdCisgICAgc2h1ZnBzICAgbTQsIG0yLCBtMiwgcTIzMDEKKyAgICBzaHVmcHMgICBtNSwgbTMsIG0zLCBxMjMwMQorICAgIHVucGNrbHBzIG02LCBtMCwgbTAKKyAgICB1bnBja2hwcyBtNywgbTAsIG0wCisgICAgbXVscHMgICAgbTIsIG02CisgICAgbXVscHMgICAgbTMsIG03CisgICAgdW5wY2tscHMgbTYsIG0xLCBtMQorICAgIHVucGNraHBzIG03LCBtMSwgbTEKKyAgICBtdWxwcyAgICBtNCwgbTYKKyAgICBtdWxwcyAgICBtNSwgbTcKKyAgICBhZGRwcyAgICBtMiwgbTMKKyAgICBhZGRzdWJwcyBtMiwgbTQKKyAgICBhZGRzdWJwcyBtMiwgbTUKKyAgICBtb3ZzZCAgW2xxK25xXSwgbTIKKyAgICBtb3ZocHMgW3JxK25xXSwgbTIKKyAgICBhZGQgICAgICBucSwgOAorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVAorCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorO3ZvaWQgcHNfaHlicmlkX2FuYWx5c2lzX2lsZWF2ZV9zc2UoZmxvYXQgb3V0WzJdWzM4XVs2NF0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAoKmluKVszMl1bMl0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxlbikKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJTklUX1hNTSBzc2UKK2NnbG9iYWwgcHNfaHlicmlkX2FuYWx5c2lzX2lsZWF2ZSwgMywgNywgNSwgb3V0LCBpbiwgaSwgbGVuLCBpbjAsIGluMSwgdG1wCisgICAgbW92c3hkaWZuaWRuICAgICAgICBpcSwgaWQKKyAgICBtb3YgICAgICAgICAgICAgICBsZW5kLCAzMiA8PCAzCisgICAgbGVhICAgICAgICAgICAgICAgIGlucSwgW2lucStpcSo0XQorICAgIG1vdiAgICAgICAgICAgICAgIHRtcGQsIGlkCisgICAgc2hsICAgICAgICAgICAgICAgdG1wZCwgOAorICAgIGFkZCAgICAgICAgICAgICAgIG91dHEsIHRtcHEKKyAgICBtb3YgICAgICAgICAgICAgICB0bXBkLCA2NAorICAgIHN1YiAgICAgICAgICAgICAgIHRtcGQsIGlkCisgICAgbW92ICAgICAgICAgICAgICAgICBpZCwgdG1wZAorCisgICAgdGVzdCAgICAgICAgICAgICAgICBpZCwgMQorICAgIGpuZSAubG9vcDQKKyAgICB0ZXN0ICAgICAgICAgICAgICAgIGlkLCAyCisgICAgam5lIC5sb29wOAorCithbGlnbiAxNgorLmxvb3AxNjoKKyAgICBtb3YgICAgICAgICAgICAgICBpbjBxLCBpbnEKKyAgICBtb3YgICAgICAgICAgICAgICBpbjFxLCAzOCo2NCo0CisgICAgYWRkICAgICAgICAgICAgICAgaW4xcSwgaW4wcQorICAgIG1vdiAgICAgICAgICAgICAgIHRtcGQsIGxlbmQKKworLmlubmVyX2xvb3AxNjoKKyAgICBtb3ZhcHMgICAgICAgICAgICAgIG0wLCBbaW4wcV0KKyAgICBtb3ZhcHMgICAgICAgICAgICAgIG0xLCBbaW4xcV0KKyAgICBtb3ZhcHMgICAgICAgICAgICAgIG0yLCBbaW4wcStsZW5xXQorICAgIG1vdmFwcyAgICAgICAgICAgICAgbTMsIFtpbjFxK2xlbnFdCisgICAgVFJBTlNQT1NFNHg0UFMgMCwgMSwgMiwgMywgNAorICAgIG1vdmFwcyAgICAgICAgICBbb3V0cV0sIG0wCisgICAgbW92YXBzICAgICBbb3V0cStsZW5xXSwgbTEKKyAgICBtb3ZhcHMgICBbb3V0cStsZW5xKjJdLCBtMgorICAgIG1vdmFwcyBbb3V0cSszKjMyKjIqNF0sIG0zCisgICAgbGVhICAgICAgICAgICAgICAgaW4wcSwgW2luMHErbGVucSoyXQorICAgIGxlYSAgICAgICAgICAgICAgIGluMXEsIFtpbjFxK2xlbnEqMl0KKyAgICBhZGQgICAgICAgICAgICAgICBvdXRxLCBtbXNpemUKKyAgICBzdWIgICAgICAgICAgICAgICB0bXBkLCBtbXNpemUKKyAgICBqZyAuaW5uZXJfbG9vcDE2CisgICAgYWRkICAgICAgICAgICAgICAgIGlucSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgICBvdXRxLCAzKjMyKjIqNAorICAgIHN1YiAgICAgICAgICAgICAgICAgaWQsIDQKKyAgICBqZyAubG9vcDE2CisgICAgUkVUCisKK2FsaWduIDE2CisubG9vcDg6CisgICAgbW92ICAgICAgICAgICAgICAgaW4wcSwgaW5xCisgICAgbW92ICAgICAgICAgICAgICAgaW4xcSwgMzgqNjQqNAorICAgIGFkZCAgICAgICAgICAgICAgIGluMXEsIGluMHEKKyAgICBtb3YgICAgICAgICAgICAgICB0bXBkLCBsZW5kCisKKy5pbm5lcl9sb29wODoKKyAgICBtb3ZscHMgICAgICAgICAgICAgIG0wLCBbaW4wcV0KKyAgICBtb3ZscHMgICAgICAgICAgICAgIG0xLCBbaW4xcV0KKyAgICBtb3ZocHMgICAgICAgICAgICAgIG0wLCBbaW4wcStsZW5xXQorICAgIG1vdmhwcyAgICAgICAgICAgICAgbTEsIFtpbjFxK2xlbnFdCisgICAgU0JVVFRFUkZMWVBTIDAsIDEsIDIKKyAgICBTQlVUVEVSRkxZUEQgMCwgMSwgMgorICAgIG1vdmFwcyAgICAgICAgICBbb3V0cV0sIG0wCisgICAgbW92YXBzICAgICBbb3V0cStsZW5xXSwgbTEKKyAgICBsZWEgICAgICAgICAgICAgICBpbjBxLCBbaW4wcStsZW5xKjJdCisgICAgbGVhICAgICAgICAgICAgICAgaW4xcSwgW2luMXErbGVucSoyXQorICAgIGFkZCAgICAgICAgICAgICAgIG91dHEsIG1tc2l6ZQorICAgIHN1YiAgICAgICAgICAgICAgIHRtcGQsIG1tc2l6ZQorICAgIGpnIC5pbm5lcl9sb29wOAorICAgIGFkZCAgICAgICAgICAgICAgICBpbnEsIDgKKyAgICBhZGQgICAgICAgICAgICAgICBvdXRxLCBsZW5xCisgICAgc3ViICAgICAgICAgICAgICAgICBpZCwgMgorICAgIGpnIC5sb29wMTYKKyAgICBSRVQKKworYWxpZ24gMTYKKy5sb29wNDoKKyAgICBtb3YgICAgICAgICAgICAgICBpbjBxLCBpbnEKKyAgICBtb3YgICAgICAgICAgICAgICBpbjFxLCAzOCo2NCo0CisgICAgYWRkICAgICAgICAgICAgICAgaW4xcSwgaW4wcQorICAgIG1vdiAgICAgICAgICAgICAgIHRtcGQsIGxlbmQKKworLmlubmVyX2xvb3A0OgorICAgIG1vdnNzICAgICAgICAgICAgICAgbTAsIFtpbjBxXQorICAgIG1vdnNzICAgICAgICAgICAgICAgbTEsIFtpbjFxXQorICAgIG1vdnNzICAgICAgICAgICAgICAgbTIsIFtpbjBxK2xlbnFdCisgICAgbW92c3MgICAgICAgICAgICAgICBtMywgW2luMXErbGVucV0KKyAgICBtb3ZsaHBzICAgICAgICAgICAgIG0wLCBtMQorICAgIG1vdmxocHMgICAgICAgICAgICAgbTIsIG0zCisgICAgc2h1ZnBzICAgICAgICAgICAgICBtMCwgbTIsIHEyMDIwCisgICAgbW92YXBzICAgICAgICAgIFtvdXRxXSwgbTAKKyAgICBsZWEgICAgICAgICAgICAgICBpbjBxLCBbaW4wcStsZW5xKjJdCisgICAgbGVhICAgICAgICAgICAgICAgaW4xcSwgW2luMXErbGVucSoyXQorICAgIGFkZCAgICAgICAgICAgICAgIG91dHEsIG1tc2l6ZQorICAgIHN1YiAgICAgICAgICAgICAgIHRtcGQsIG1tc2l6ZQorICAgIGpnIC5pbm5lcl9sb29wNAorICAgIGFkZCAgICAgICAgICAgICAgICBpbnEsIDQKKyAgICBzdWIgICAgICAgICAgICAgICAgIGlkLCAxCisgICAgdGVzdCAgICAgICAgICAgICAgICBpZCwgMgorICAgIGpuZSAubG9vcDgKKyAgICBjbXAgICAgICAgICAgICAgICAgIGlkLCA0CisgICAgamdlIC5sb29wMTYKKyAgICBSRVQKKworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7dm9pZCBwc19oeWJyaWRfc3ludGhlc2lzX2RlaW50X3NzZTQoZmxvYXQgb3V0WzJdWzM4XVs2NF0sCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKCppbilbMzJdWzJdLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbGVuKQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCislbWFjcm8gSFlCUklEX1NZTlRIRVNJU19ERUlOVCAwCitjZ2xvYmFsIHBzX2h5YnJpZF9zeW50aGVzaXNfZGVpbnQsIDMsIDcsIDUsIG91dCwgaW4sIGksIGxlbiwgb3V0MCwgb3V0MSwgdG1wCislaWYgY3B1ZmxhZyhzc2U0KQorJWRlZmluZSBNT1ZIIG1vdnNkCislZWxzZQorJWRlZmluZSBNT1ZIIG1vdmxwcworJWVuZGlmCisgICAgbW92c3hkaWZuaWRuICAgICAgICBpcSwgaWQKKyAgICBtb3YgICAgICAgICAgICAgICBsZW5kLCAzMiA8PCAzCisgICAgbGVhICAgICAgICAgICAgICAgb3V0cSwgW291dHEraXEqNF0KKyAgICBtb3YgICAgICAgICAgICAgICB0bXBkLCBpZAorICAgIHNobCAgICAgICAgICAgICAgIHRtcGQsIDgKKyAgICBhZGQgICAgICAgICAgICAgICAgaW5xLCB0bXBxCisgICAgbW92ICAgICAgICAgICAgICAgdG1wZCwgNjQKKyAgICBzdWIgICAgICAgICAgICAgICB0bXBkLCBpZAorICAgIG1vdiAgICAgICAgICAgICAgICAgaWQsIHRtcGQKKworICAgIHRlc3QgICAgICAgICAgICAgICAgaWQsIDEKKyAgICBqbmUgLmxvb3A0CisgICAgdGVzdCAgICAgICAgICAgICAgICBpZCwgMgorICAgIGpuZSAubG9vcDgKKworYWxpZ24gMTYKKy5sb29wMTY6CisgICAgbW92ICAgICAgICAgICAgICBvdXQwcSwgb3V0cQorICAgIG1vdiAgICAgICAgICAgICAgb3V0MXEsIDM4KjY0KjQKKyAgICBhZGQgICAgICAgICAgICAgIG91dDFxLCBvdXQwcQorICAgIG1vdiAgICAgICAgICAgICAgIHRtcGQsIGxlbmQKKworLmlubmVyX2xvb3AxNjoKKyAgICBtb3ZhcHMgICAgICAgICAgICAgIG0wLCBbaW5xXQorICAgIG1vdmFwcyAgICAgICAgICAgICAgbTEsIFtpbnErbGVucV0KKyAgICBtb3ZhcHMgICAgICAgICAgICAgIG0yLCBbaW5xK2xlbnEqMl0KKyAgICBtb3ZhcHMgICAgICAgICAgICAgIG0zLCBbaW5xKzMqMzIqMio0XQorICAgIFRSQU5TUE9TRTR4NFBTIDAsIDEsIDIsIDMsIDQKKyAgICBtb3ZhcHMgICAgICAgICBbb3V0MHFdLCBtMAorICAgIG1vdmFwcyAgICAgICAgIFtvdXQxcV0sIG0xCisgICAgbW92YXBzICAgIFtvdXQwcStsZW5xXSwgbTIKKyAgICBtb3ZhcHMgICAgW291dDFxK2xlbnFdLCBtMworICAgIGxlYSAgICAgICAgICAgICAgb3V0MHEsIFtvdXQwcStsZW5xKjJdCisgICAgbGVhICAgICAgICAgICAgICBvdXQxcSwgW291dDFxK2xlbnEqMl0KKyAgICBhZGQgICAgICAgICAgICAgICAgaW5xLCBtbXNpemUKKyAgICBzdWIgICAgICAgICAgICAgICB0bXBkLCBtbXNpemUKKyAgICBqZyAuaW5uZXJfbG9vcDE2CisgICAgYWRkICAgICAgICAgICAgICAgb3V0cSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgICAgaW5xLCAzKjMyKjIqNAorICAgIHN1YiAgICAgICAgICAgICAgICAgaWQsIDQKKyAgICBqZyAubG9vcDE2CisgICAgUkVUCisKK2FsaWduIDE2CisubG9vcDg6CisgICAgbW92ICAgICAgICAgICAgICBvdXQwcSwgb3V0cQorICAgIG1vdiAgICAgICAgICAgICAgb3V0MXEsIDM4KjY0KjQKKyAgICBhZGQgICAgICAgICAgICAgIG91dDFxLCBvdXQwcQorICAgIG1vdiAgICAgICAgICAgICAgIHRtcGQsIGxlbmQKKworLmlubmVyX2xvb3A4OgorICAgIG1vdmFwcyAgICAgICAgICAgICAgbTAsIFtpbnFdCisgICAgbW92YXBzICAgICAgICAgICAgICBtMSwgW2lucStsZW5xXQorICAgIFNCVVRURVJGTFlQUyAwLCAxLCAyCisgICAgU0JVVFRFUkZMWVBEIDAsIDEsIDIKKyAgICBNT1ZIICAgICAgICAgICBbb3V0MHFdLCBtMAorICAgIE1PVkggICAgICAgICAgIFtvdXQxcV0sIG0xCisgICAgbW92aHBzICAgIFtvdXQwcStsZW5xXSwgbTAKKyAgICBtb3ZocHMgICAgW291dDFxK2xlbnFdLCBtMQorICAgIGxlYSAgICAgICAgICAgICAgb3V0MHEsIFtvdXQwcStsZW5xKjJdCisgICAgbGVhICAgICAgICAgICAgICBvdXQxcSwgW291dDFxK2xlbnEqMl0KKyAgICBhZGQgICAgICAgICAgICAgICAgaW5xLCBtbXNpemUKKyAgICBzdWIgICAgICAgICAgICAgICB0bXBkLCBtbXNpemUKKyAgICBqZyAuaW5uZXJfbG9vcDgKKyAgICBhZGQgICAgICAgICAgICAgICBvdXRxLCA4CisgICAgYWRkICAgICAgICAgICAgICAgIGlucSwgbGVucQorICAgIHN1YiAgICAgICAgICAgICAgICAgaWQsIDIKKyAgICBqZyAubG9vcDE2CisgICAgUkVUCisKK2FsaWduIDE2CisubG9vcDQ6CisgICAgbW92ICAgICAgICAgICAgICBvdXQwcSwgb3V0cQorICAgIG1vdiAgICAgICAgICAgICAgb3V0MXEsIDM4KjY0KjQKKyAgICBhZGQgICAgICAgICAgICAgIG91dDFxLCBvdXQwcQorICAgIG1vdiAgICAgICAgICAgICAgIHRtcGQsIGxlbmQKKworLmlubmVyX2xvb3A0OgorICAgIG1vdmFwcyAgICAgICAgICAgICAgbTAsIFtpbnFdCisgICAgbW92c3MgICAgICAgICAgW291dDBxXSwgbTAKKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgZXh0cmFjdHBzICAgICAgW291dDFxXSwgbTAsIDEKKyAgICBleHRyYWN0cHMgW291dDBxK2xlbnFdLCBtMCwgMgorICAgIGV4dHJhY3RwcyBbb3V0MXErbGVucV0sIG0wLCAzCislZWxzZQorICAgIG1vdmhscHMgICAgICAgICAgICAgbTEsIG0wCisgICAgbW92c3MgICAgIFtvdXQwcStsZW5xXSwgbTEKKyAgICBzaHVmcHMgICAgICAgICAgICAgIG0wLCBtMCwgMHhiMQorICAgIG1vdnNzICAgICAgICAgIFtvdXQxcV0sIG0wCisgICAgbW92aGxwcyAgICAgICAgICAgICBtMSwgbTAKKyAgICBtb3ZzcyAgICAgW291dDFxK2xlbnFdLCBtMQorJWVuZGlmCisgICAgbGVhICAgICAgICAgICAgICBvdXQwcSwgW291dDBxK2xlbnEqMl0KKyAgICBsZWEgICAgICAgICAgICAgIG91dDFxLCBbb3V0MXErbGVucSoyXQorICAgIGFkZCAgICAgICAgICAgICAgICBpbnEsIG1tc2l6ZQorICAgIHN1YiAgICAgICAgICAgICAgIHRtcGQsIG1tc2l6ZQorICAgIGpnIC5pbm5lcl9sb29wNAorICAgIGFkZCAgICAgICAgICAgICAgIG91dHEsIDQKKyAgICBzdWIgICAgICAgICAgICAgICAgIGlkLCAxCisgICAgdGVzdCAgICAgICAgICAgICAgICBpZCwgMgorICAgIGpuZSAubG9vcDgKKyAgICBjbXAgICAgICAgICAgICAgICAgIGlkLCA0CisgICAgamdlIC5sb29wMTYKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UKK0hZQlJJRF9TWU5USEVTSVNfREVJTlQKK0lOSVRfWE1NIHNzZTQKK0hZQlJJRF9TWU5USEVTSVNfREVJTlQKKwogOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIDt2b2lkIGZmX3BzX2h5YnJpZF9hbmFseXNpc188b3B0PihmbG9hdCAoKm91dClbMl0sIGZsb2F0ICgqaW4pWzJdLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICgqZmlsdGVyKVs4XVsyXSwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgbik7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IG4pOwogOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICVtYWNybyBQU19IWUJSSURfQU5BTFlTSVNfTE9PUCAzCiAgICAgbW92dSAgICAgJTEsIFtpbnErbW1zaXplKiUzXQpAQCAtMTY2LDcgKzQzOCw3IEBACiAlZWxzZQogJWRlZmluZSBNT1ZIIG1vdmxwcwogJWVuZGlmCi0gICAgc2hsIHN0cmlkZWQsIDMKKyAgICBzaGwgc3RyaWRlcSwgMwogICAgIHNobCBuZCwgNgogICAgIGFkZCBmaWx0ZXJxLCBucQogICAgIG5lZyBucQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvYWFjcHNkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvYWFjcHNkc3BfaW5pdC5jCmluZGV4IGY2ZDZjMDMuLjIxZjAwZWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2FhY3BzZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9hYWNwc2RzcF9pbml0LmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKICNpbmNsdWRlICJjb25maWcuaCIKIAogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCkBAIC0zMCwxMyArMzIsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnNyYzEsIGludCBuKTsKIHZvaWQgZmZfcHNfaHlicmlkX2FuYWx5c2lzX3NzZSAoZmxvYXQgKCpvdXQpWzJdLCBmbG9hdCAoKmluKVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKCpmaWx0ZXIpWzhdWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBuKTsKIHZvaWQgZmZfcHNfaHlicmlkX2FuYWx5c2lzX3NzZTMoZmxvYXQgKCpvdXQpWzJdLCBmbG9hdCAoKmluKVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKCpmaWx0ZXIpWzhdWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBuKTsKIHZvaWQgZmZfcHNfc3RlcmVvX2ludGVycG9sYXRlX3NzZTMoZmxvYXQgKCpsKVsyXSwgZmxvYXQgKCpyKVsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaFsyXVs0XSwgZmxvYXQgaF9zdGVwWzJdWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKK3ZvaWQgZmZfcHNfc3RlcmVvX2ludGVycG9sYXRlX2lwZG9wZF9zc2UzKGZsb2F0ICgqbClbMl0sIGZsb2F0ICgqcilbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoWzJdWzRdLCBmbG9hdCBoX3N0ZXBbMl1bNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKK3ZvaWQgZmZfcHNfaHlicmlkX3N5bnRoZXNpc19kZWludF9zc2UoZmxvYXQgb3V0WzJdWzM4XVs2NF0sIGZsb2F0ICgqaW4pWzMyXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBsZW4pOwordm9pZCBmZl9wc19oeWJyaWRfc3ludGhlc2lzX2RlaW50X3NzZTQoZmxvYXQgb3V0WzJdWzM4XVs2NF0sIGZsb2F0ICgqaW4pWzMyXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBpbnQgbGVuKTsKK3ZvaWQgZmZfcHNfaHlicmlkX2FuYWx5c2lzX2lsZWF2ZV9zc2UoZmxvYXQgKCpvdXQpWzMyXVsyXSwgZmxvYXQgTFsyXVszOF1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxlbik7CiAKIGF2X2NvbGQgdm9pZCBmZl9wc2RzcF9pbml0X3g4NihQU0RTUENvbnRleHQgKnMpCiB7CkBAIC00NSwxMSArNTYsMTcgQEAKICAgICBpZiAoRVhURVJOQUxfU1NFKGNwdV9mbGFncykpIHsKICAgICAgICAgcy0+YWRkX3NxdWFyZXMgICAgICAgICAgICA9IGZmX3BzX2FkZF9zcXVhcmVzX3NzZTsKICAgICAgICAgcy0+bXVsX3BhaXJfc2luZ2xlICAgICAgICA9IGZmX3BzX211bF9wYWlyX3NpbmdsZV9zc2U7CisgICAgICAgIHMtPmh5YnJpZF9hbmFseXNpc19pbGVhdmUgPSBmZl9wc19oeWJyaWRfYW5hbHlzaXNfaWxlYXZlX3NzZTsKKyAgICAgICAgcy0+aHlicmlkX3N5bnRoZXNpc19kZWludCA9IGZmX3BzX2h5YnJpZF9zeW50aGVzaXNfZGVpbnRfc3NlOwogICAgICAgICBzLT5oeWJyaWRfYW5hbHlzaXMgICAgICAgID0gZmZfcHNfaHlicmlkX2FuYWx5c2lzX3NzZTsKICAgICB9CiAgICAgaWYgKEVYVEVSTkFMX1NTRTMoY3B1X2ZsYWdzKSkgewogICAgICAgICBzLT5hZGRfc3F1YXJlcyAgICAgICAgICAgID0gZmZfcHNfYWRkX3NxdWFyZXNfc3NlMzsKICAgICAgICAgcy0+c3RlcmVvX2ludGVycG9sYXRlWzBdICA9IGZmX3BzX3N0ZXJlb19pbnRlcnBvbGF0ZV9zc2UzOworICAgICAgICBzLT5zdGVyZW9faW50ZXJwb2xhdGVbMV0gID0gZmZfcHNfc3RlcmVvX2ludGVycG9sYXRlX2lwZG9wZF9zc2UzOwogICAgICAgICBzLT5oeWJyaWRfYW5hbHlzaXMgICAgICAgID0gZmZfcHNfaHlicmlkX2FuYWx5c2lzX3NzZTM7CiAgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+aHlicmlkX3N5bnRoZXNpc19kZWludCA9IGZmX3BzX2h5YnJpZF9zeW50aGVzaXNfZGVpbnRfc3NlNDsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9hYzNkc3BfZG93bm1peC5hc20gYi9saWJhdmNvZGVjL3g4Ni9hYzNkc3BfZG93bm1peC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3Y2M2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L2FjM2RzcF9kb3dubWl4LmFzbQpAQCAtMCwwICsxLDE4NyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODYtb3B0aW1pemVkIEFDLTMgZG93bm1peGluZworOyogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBjaGFubmVsIG1peGluZyBhc20gaW4gbGliYXZyZXNhbXBsZSwgYnV0IGl0IGlzCis7KiBzaW1wbGlmaWVkIGZvciBvbmx5IGZsb2F0IGNvZWZmaWNpZW50cyBhbmQgb25seSAzIHRvIDYgY2hhbm5lbHMuCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OIC50ZXh0CisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBmdW5jdGlvbnMgdG8gZG93bm1peCBmcm9tIDMgdG8gNiBjaGFubmVscyB0byBtb25vIG9yIHN0ZXJlbworOyB2b2lkIGZmX2FjM19kb3dubWl4XyooZmxvYXQgKipzYW1wbGVzLCBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbik7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIEFDM19ET1dOTUlYIDIgOyAlMSA9IGluIGNoYW5uZWxzLCAlMiA9IG91dCBjaGFubmVscworOyBkZWZpbmUgc29tZSBuYW1lcyB0byBtYWtlIHRoZSBjb2RlIGNsZWFyZXIKKyVhc3NpZ24gIGluX2NoYW5uZWxzICUxCislYXNzaWduIG91dF9jaGFubmVscyAlMgorJWFzc2lnbiBzdGVyZW8gb3V0X2NoYW5uZWxzIC0gMQorCis7IGRldGVybWluZSBob3cgbWFueSBtYXRyaXggZWxlbWVudHMgbXVzdCBnbyBvbiB0aGUgc3RhY2sgdnMuIG1tcmVncworJWFzc2lnbiBtYXRyaXhfZWxlbWVudHMgaW5fY2hhbm5lbHMgKiBvdXRfY2hhbm5lbHMKKyVpZiBzdGVyZW8KKyAgICAlYXNzaWduIG5lZWRlZF9tbXJlZ3MgNAorJWVsc2UKKyAgICAlYXNzaWduIG5lZWRlZF9tbXJlZ3MgMworJWVuZGlmCislYXNzaWduIG1hdHJpeF9lbGVtZW50c19tbSBudW1fbW1yZWdzIC0gbmVlZGVkX21tcmVncworJWlmIG1hdHJpeF9lbGVtZW50cyA8IG1hdHJpeF9lbGVtZW50c19tbQorICAgICVhc3NpZ24gbWF0cml4X2VsZW1lbnRzX21tIG1hdHJpeF9lbGVtZW50cworJWVuZGlmCislYXNzaWduIHRvdGFsX21tcmVncyBuZWVkZWRfbW1yZWdzK21hdHJpeF9lbGVtZW50c19tbQorJWlmIG1hdHJpeF9lbGVtZW50c19tbSA8IG1hdHJpeF9lbGVtZW50cworICAgICVhc3NpZ24gbWF0cml4X2VsZW1lbnRzX3N0YWNrIG1hdHJpeF9lbGVtZW50cyAtIG1hdHJpeF9lbGVtZW50c19tbQorJWVsc2UKKyAgICAlYXNzaWduIG1hdHJpeF9lbGVtZW50c19zdGFjayAwCislZW5kaWYKKworY2dsb2JhbCBhYzNfZG93bm1peF8lMV90b18lMiwgMyxpbl9jaGFubmVscysxLHRvdGFsX21tcmVncywwLW1hdHJpeF9lbGVtZW50c19zdGFjayptbXNpemUsIHNyYzAsIHNyYzEsIGxlbiwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNQorCis7IGxvYWQgbWF0cml4IHBvaW50ZXJzCislZGVmaW5lIG1hdHJpeDBxIHIxcQorJWRlZmluZSBtYXRyaXgxcSByM3EKKyVpZiBzdGVyZW8KKyAgICBtb3YgICAgICBtYXRyaXgxcSwgW21hdHJpeDBxK2dwcnNpemVdCislZW5kaWYKKyAgICBtb3YgICAgICBtYXRyaXgwcSwgW21hdHJpeDBxXQorCis7IGRlZmluZSBtYXRyaXggY29lZmYgbmFtZXMKKyVhc3NpZ24gJSVpIDAKKyVhc3NpZ24gJSVqIG5lZWRlZF9tbXJlZ3MKKyVyZXAgaW5fY2hhbm5lbHMKKyAgICAlaWYgJSVpID49IG1hdHJpeF9lbGVtZW50c19tbQorICAgICAgICBDQVRfWERFRklORSBteF9zdGFja18wXywgJSVpLCAxCisgICAgICAgIENBVF9YREVGSU5FIG14XzBfLCAlJWksIFtyc3ArKCUlaS1tYXRyaXhfZWxlbWVudHNfbW0pKm1tc2l6ZV0KKyAgICAlZWxzZQorICAgICAgICBDQVRfWERFRklORSBteF9zdGFja18wXywgJSVpLCAwCisgICAgICAgIENBVF9YREVGSU5FIG14XzBfLCAlJWksIG0gJSsgJSVqCisgICAgICAgICVhc3NpZ24gJSVqICUlaisxCisgICAgJWVuZGlmCisgICAgJWFzc2lnbiAlJWkgJSVpKzEKKyVlbmRyZXAKKyVpZiBzdGVyZW8KKyVhc3NpZ24gJSVpIDAKKyVyZXAgaW5fY2hhbm5lbHMKKyAgICAlaWYgaW5fY2hhbm5lbHMgKyAlJWkgPj0gbWF0cml4X2VsZW1lbnRzX21tCisgICAgICAgIENBVF9YREVGSU5FIG14X3N0YWNrXzFfLCAlJWksIDEKKyAgICAgICAgQ0FUX1hERUZJTkUgbXhfMV8sICUlaSwgW3JzcCsoaW5fY2hhbm5lbHMrJSVpLW1hdHJpeF9lbGVtZW50c19tbSkqbW1zaXplXQorICAgICVlbHNlCisgICAgICAgIENBVF9YREVGSU5FIG14X3N0YWNrXzFfLCAlJWksIDAKKyAgICAgICAgQ0FUX1hERUZJTkUgbXhfMV8sICUlaSwgbSAlKyAlJWoKKyAgICAgICAgJWFzc2lnbiAlJWogJSVqKzEKKyAgICAlZW5kaWYKKyAgICAlYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorJWVuZGlmCisKKzsgbG9hZC9zcGxhdCBtYXRyaXggY29lZmZzCislYXNzaWduICUlaSAwCislcmVwIGluX2NoYW5uZWxzCisgICAgJWlmIG14X3N0YWNrXzBfICUrICUlaQorICAgICAgICBWQlJPQURDQVNUU1MgbTAsIFttYXRyaXgwcSs0KiUlaV0KKyAgICAgICAgbW92YSAgbXhfMF8gJSsgJSVpLCBtMAorICAgICVlbHNlCisgICAgICAgIFZCUk9BRENBU1RTUyBteF8wXyAlKyAlJWksIFttYXRyaXgwcSs0KiUlaV0KKyAgICAlZW5kaWYKKyAgICAlaWYgc3RlcmVvCisgICAgJWlmIG14X3N0YWNrXzFfICUrICUlaQorICAgICAgICBWQlJPQURDQVNUU1MgbTAsIFttYXRyaXgxcSs0KiUlaV0KKyAgICAgICAgbW92YSAgbXhfMV8gJSsgJSVpLCBtMAorICAgICVlbHNlCisgICAgICAgIFZCUk9BRENBU1RTUyBteF8xXyAlKyAlJWksIFttYXRyaXgxcSs0KiUlaV0KKyAgICAlZW5kaWYKKyAgICAlZW5kaWYKKyAgICAlYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorCisgICAgbGVhICAgICAgICAgIGxlbnEsIFs0KnIyZF0KKyAgICA7IGxvYWQgY2hhbm5lbCBwb2ludGVycyB0byByZWdpc3RlcnMKKyVhc3NpZ24gJSVpIDEKKyVyZXAgKGluX2NoYW5uZWxzIC0gMSkKKyAgICBtb3YgICAgICAgICBzcmMgJSsgJSVpICUrIHEsIFtzcmMwcSslJWkqZ3Byc2l6ZV0KKyAgICBhZGQgICAgICAgICBzcmMgJSsgJSVpICUrIHEsIGxlbnEKKyAgICAlYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorICAgIG1vdiAgICAgICAgIHNyYzBxLCBbc3JjMHFdCisgICAgYWRkICAgICAgICAgc3JjMHEsIGxlbnEKKyAgICBuZWcgICAgICAgICAgbGVucQorLmxvb3A6CisgICAgJWlmIHN0ZXJlbyB8fCBteF9zdGFja18wXzAKKyAgICBtb3ZhICAgICAgICAgICBtMCwgW3NyYzBxK2xlbnFdCisgICAgJWVuZGlmCisgICAgJWlmIHN0ZXJlbworICAgIG11bHBzICAgICAgICAgIG0xLCBtMCwgbXhfMV8wCisgICAgJWVuZGlmCisgICAgJWlmIHN0ZXJlbyB8fCBteF9zdGFja18wXzAKKyAgICBtdWxwcyAgICAgICAgICBtMCwgbTAsIG14XzBfMAorICAgICVlbHNlCisgICAgbXVscHMgICAgICAgICAgbTAsIG14XzBfMCwgW3NyYzBxK2xlbnFdCisgICAgJWVuZGlmCislYXNzaWduICUlaSAxCislcmVwIChpbl9jaGFubmVscyAtIDEpCisgICAgJWRlZmluZSBzcmNfcHRyIHNyYyAlKyAlJWkgJSsgcQorICAgIDsgYXZvaWQgZXh0cmEgbG9hZCBmb3IgbW9ubyBpZiBtYXRyaXggaXMgaW4gYSBtbSByZWdpc3RlcgorICAgICVpZiBzdGVyZW8gfHwgbXhfc3RhY2tfMF8gJSsgJSVpCisgICAgbW92YSAgICAgICAgICAgbTIsIFtzcmNfcHRyK2xlbnFdCisgICAgJWVuZGlmCisgICAgJWlmIHN0ZXJlbworICAgIEZNVUxBRERfUFMgICAgIG0xLCBtMiwgbXhfMV8gJSsgJSVpLCBtMSwgbTMKKyAgICAlZW5kaWYKKyAgICAlaWYgc3RlcmVvIHx8IG14X3N0YWNrXzBfICUrICUlaQorICAgIEZNVUxBRERfUFMgICAgIG0wLCBtMiwgbXhfMF8gJSsgJSVpLCBtMCwgbTIKKyAgICAlZWxzZQorICAgIEZNVUxBRERfUFMgICAgIG0wLCBteF8wXyAlKyAlJWksIFtzcmNfcHRyK2xlbnFdLCBtMCwgbTEKKyAgICAlZW5kaWYKKyAgICAlYXNzaWduICUlaSAlJWkrMQorJWVuZHJlcAorICAgIG1vdmEgW3NyYzBxK2xlbnFdLCBtMAorICAgICVpZiBzdGVyZW8KKyAgICBtb3ZhIFtzcmMxcStsZW5xXSwgbTEKKyAgICAlZW5kaWYKKworICAgIGFkZCAgICAgICAgICBsZW5xLCBtbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKKyVtYWNybyBBQzNfRE9XTk1JWF9GVU5DUyAwCislYXNzaWduICUlaSAzCislcmVwIDQKKyAgICBJTklUX1hNTSBzc2UKKyAgICBBQzNfRE9XTk1JWCAlJWksIDEKKyAgICBBQzNfRE9XTk1JWCAlJWksIDIKKyAgICBJTklUX1lNTSBhdngKKyAgICBBQzNfRE9XTk1JWCAlJWksIDEKKyAgICBBQzNfRE9XTk1JWCAlJWksIDIKKyAgICAlaWYgSEFWRV9GTUEzX0VYVEVSTkFMCisgICAgSU5JVF9ZTU0gZm1hMworICAgIEFDM19ET1dOTUlYICUlaSwgMQorICAgIEFDM19ET1dOTUlYICUlaSwgMgorICAgICVlbmRpZgorICAgICVhc3NpZ24gJSVpICUlaSsxCislZW5kcmVwCislZW5kbWFjcm8KKworQUMzX0RPV05NSVhfRlVOQ1MKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2FjM2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9hYzNkc3BfaW5pdC5jCmluZGV4IDA3ZjBkMjUuLjJlN2UyZmIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2FjM2RzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvYWMzZHNwX2luaXQuYwpAQCAtNjMsMTM4ICs2Myw2IEBACiB2b2lkIGZmX2FwcGx5X3dpbmRvd19pbnQxNl9zc3NlM19hdG9tKGludDE2X3QgKm91dHB1dCwgY29uc3QgaW50MTZfdCAqaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKndpbmRvdywgdW5zaWduZWQgaW50IGxlbik7CiAKLSNpZiBBUkNIX1g4Nl8zMiAmJiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCi0jICAgICAgIHVuZGVmIEhBVkVfN1JFR1MKLSMgICAgICAgZGVmaW5lIEhBVkVfN1JFR1MgMAotI2VuZGlmCi0KLSNpZiBIQVZFX1NTRV9JTkxJTkUgJiYgSEFWRV83UkVHUwotCi0jZGVmaW5lIElGMSh4KSB4Ci0jZGVmaW5lIElGMCh4KQotCi0jZGVmaW5lIE1JWDUobW9ubywgc3RlcmVvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIm1vdnNzICAgICAgICAgICAwKCUxKSwgJSV4bW01ICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCi0gICAgICAgICJtb3ZzcyAgICAgICAgICAgOCglMSksICUleG1tNiAgICAgICAgICBcbiIgICAgICAgICAgICAgXAotICAgICAgICAibW92c3MgICAgICAgICAgMjQoJTEpLCAlJXhtbTcgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKLSAgICAgICAgInNodWZwcyAgICAgJDAsICUleG1tNSwgJSV4bW01ICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCi0gICAgICAgICJzaHVmcHMgICAgICQwLCAlJXhtbTYsICUleG1tNiAgICAgICAgICBcbiIgICAgICAgICAgICAgXAotICAgICAgICAic2h1ZnBzICAgICAkMCwgJSV4bW03LCAlJXhtbTcgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCi0gICAgICAgICJtb3ZhcHMgICAgICAgKCUwLCAlMiksICUleG1tMCAgICAgICAgICBcbiIgICAgICAgICAgICAgXAotICAgICAgICAibW92YXBzICAgICAgICglMCwgJTMpLCAlJXhtbTEgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKLSAgICAgICAgIm1vdmFwcyAgICAgICAoJTAsICU0KSwgJSV4bW0yICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCi0gICAgICAgICJtb3ZhcHMgICAgICAgKCUwLCAlNSksICUleG1tMyAgICAgICAgICBcbiIgICAgICAgICAgICAgXAotICAgICAgICAibW92YXBzICAgICAgICglMCwgJTYpLCAlJXhtbTQgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKLSAgICAgICAgIm11bHBzICAgICAgICAgICUleG1tNSwgJSV4bW0wICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCi0gICAgICAgICJtdWxwcyAgICAgICAgICAlJXhtbTYsICUleG1tMSAgICAgICAgICBcbiIgICAgICAgICAgICAgXAotICAgICAgICAibXVscHMgICAgICAgICAgJSV4bW01LCAlJXhtbTIgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKLSAgICAgICAgIm11bHBzICAgICAgICAgICUleG1tNywgJSV4bW0zICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCi0gICAgICAgICJtdWxwcyAgICAgICAgICAlJXhtbTcsICUleG1tNCAgICAgICAgICBcbiIgICAgICAgICAgICAgXAotIHN0ZXJlbygiYWRkcHMgICAgICAgICAgJSV4bW0xLCAlJXhtbTAgICAgICAgICAgXG4iKSAgICAgICAgICAgIFwKLSAgICAgICAgImFkZHBzICAgICAgICAgICUleG1tMSwgJSV4bW0yICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCi0gICAgICAgICJhZGRwcyAgICAgICAgICAlJXhtbTMsICUleG1tMCAgICAgICAgICBcbiIgICAgICAgICAgICAgXAotICAgICAgICAiYWRkcHMgICAgICAgICAgJSV4bW00LCAlJXhtbTIgICAgICAgICAgXG4iICAgICAgICAgICAgIFwKLSAgIG1vbm8oImFkZHBzICAgICAgICAgICUleG1tMiwgJSV4bW0wICAgICAgICAgIFxuIikgICAgICAgICAgICBcCi0gICAgICAgICJtb3ZhcHMgICAgICAgICAlJXhtbTAsICglMCwgJTIpICAgICAgICBcbiIgICAgICAgICAgICAgXAotIHN0ZXJlbygibW92YXBzICAgICAgICAgJSV4bW0yLCAoJTAsICUzKSAgICAgICAgXG4iKSAgICAgICAgICAgIFwKLSAgICAgICAgImFkZCAgICAgICAgICAgICAgICQxNiwgJTAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICBcCi0gICAgICAgICJqbCAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgXAotICAgICAgICA6ICIrJnIiKGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOiAiciIobWF0cml4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgInIiKHNhbXBsZXNbMF0gKyBsZW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICJyIihzYW1wbGVzWzFdICsgbGVuKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiciIoc2FtcGxlc1syXSArIGxlbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgInIiKHNhbXBsZXNbM10gKyBsZW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICJyIihzYW1wbGVzWzRdICsgbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOiBYTU1fQ0xPQkJFUlMoIiV4bW0wIiwgIiV4bW0xIiwgIiV4bW0yIiwgIiV4bW0zIiwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIiV4bW00IiwgIiV4bW01IiwgIiV4bW02IiwgIiV4bW03IiwpICAgICAgXAotICAgICAgICAgIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICApOwotCi0jZGVmaW5lIE1JWF9NSVNDKHN0ZXJlbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgJTUsICUyICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAotICAgICAgICAibW92IC0lYzcoJTYsICUyLCAlYzgpLCAlMyAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIm1vdmFwcyAgICAgKCUzLCAlMCksICUleG1tMCAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCi0gc3RlcmVvKCJtb3ZhcHMgICAgICAgJSV4bW0wLCAlJXhtbTEgICAgICAgIFxuIikgICAgICAgICAgICAgICAgXAotICAgICAgICAibXVscHMgICAgICAgICUleG1tNCwgJSV4bW0wICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKLSBzdGVyZW8oIm11bHBzICAgICAgICAlJXhtbTUsICUleG1tMSAgICAgICAgXG4iKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAotICAgICAgICAibW92ICAgKCU2LCAlMiwgJWM4KSwgJTEgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIm1vdmFwcyAgICAgKCUxLCAlMCksICUleG1tMiAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCi0gc3RlcmVvKCJtb3ZhcHMgICAgICAgJSV4bW0yLCAlJXhtbTMgICAgICAgIFxuIikgICAgICAgICAgICAgICAgXAotICAgICAgICAibXVscHMgICAoJTQsICUyLCA4KSwgJSV4bW0yICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKLSBzdGVyZW8oIm11bHBzIDE2KCU0LCAlMiwgOCksICUleG1tMyAgICAgICAgXG4iKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICJhZGRwcyAgICAgICAgJSV4bW0yLCAlJXhtbTAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAotIHN0ZXJlbygiYWRkcHMgICAgICAgICUleG1tMywgJSV4bW0xICAgICAgICBcbiIpICAgICAgICAgICAgICAgIFwKLSAgICAgICAgImFkZCAgICAgICAgICAgICAgJDQsICUyICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCi0gICAgICAgICJqbCAgICAgICAgICAgICAgIDJiICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAotICAgICAgICAibW92ICAgICAgICAgICAgICAlNSwgJTIgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgIFwKLSBzdGVyZW8oIm1vdiAgICglNiwgJTIsICVjOCksICUxICAgICAgICAgICAgXG4iKSAgICAgICAgICAgICAgICBcCi0gICAgICAgICJtb3ZhcHMgICAgICAgJSV4bW0wLCAoJTMsICUwKSAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAotIHN0ZXJlbygibW92YXBzICAgICAgICUleG1tMSwgKCUxLCAlMCkgICAgICBcbiIpICAgICAgICAgICAgICAgIFwKLSAgICAgICAgImFkZCAgICAgICAgICAgICAkMTYsICUwICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICBcCi0gICAgICAgICJqbCAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgXAotICAgICAgICA6ICIrJnIiKGkpLCAiPSZyIihqKSwgIj0mciIoayksICI9JnIiKG0pICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOiAiciIobWF0cml4X3NpbWQgKyBpbl9jaCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgImciKChpbnRwdHJfdCkgLSA0ICogKGluX2NoIC0gMSkpLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICJyIihzYW1wICsgaW5fY2gpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAiaSIoc2l6ZW9mKGZsb2F0ICopKSwgImkiKHNpemVvZihmbG9hdCAqKS80KSAgICAgICAgICBcCi0gICAgICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICk7Ci0KLXN0YXRpYyB2b2lkIGFjM19kb3dubWl4X3NzZShmbG9hdCAqKnNhbXBsZXMsIGZsb2F0ICgqbWF0cml4KVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X2NoLCBpbnQgaW5fY2gsIGludCBsZW4pCi17Ci0gICAgaW50ICgqbWF0cml4X2NtcClbMl0gPSAoaW50KCopWzJdKW1hdHJpeDsKLSAgICBpbnRwdHJfdCBpLCBqLCBrLCBtOwotCi0gICAgaSA9IC1sZW4gKiBzaXplb2YoZmxvYXQpOwotICAgIGlmIChpbl9jaCA9PSA1ICYmIG91dF9jaCA9PSAyICYmCi0gICAgICAgICEobWF0cml4X2NtcFswXVsxXSB8IG1hdHJpeF9jbXBbMl1bMF0gICB8Ci0gICAgICAgICAgbWF0cml4X2NtcFszXVsxXSB8IG1hdHJpeF9jbXBbNF1bMF0gICB8Ci0gICAgICAgICAgKG1hdHJpeF9jbXBbMV1bMF0gXiBtYXRyaXhfY21wWzFdWzFdKSB8Ci0gICAgICAgICAgKG1hdHJpeF9jbXBbMF1bMF0gXiBtYXRyaXhfY21wWzJdWzFdKSkpIHsKLSAgICAgICAgTUlYNShJRjAsIElGMSk7Ci0gICAgfSBlbHNlIGlmIChpbl9jaCA9PSA1ICYmIG91dF9jaCA9PSAxICYmCi0gICAgICAgICAgICAgICBtYXRyaXhfY21wWzBdWzBdID09IG1hdHJpeF9jbXBbMl1bMF0gJiYKLSAgICAgICAgICAgICAgIG1hdHJpeF9jbXBbM11bMF0gPT0gbWF0cml4X2NtcFs0XVswXSkgewotICAgICAgICBNSVg1KElGMSwgSUYwKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0NBTF9BTElHTkVEKDE2LCBmbG9hdCwgbWF0cml4X3NpbWQsIFtBQzNfTUFYX0NIQU5ORUxTXSwgWzJdWzRdKTsKLSAgICAgICAgZmxvYXQgKnNhbXBbQUMzX01BWF9DSEFOTkVMU107Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGluX2NoOyBqKyspCi0gICAgICAgICAgICBzYW1wW2pdID0gc2FtcGxlc1tqXSArIGxlbjsKLQotICAgICAgICBqID0gMiAqIGluX2NoICogc2l6ZW9mKGZsb2F0KTsKLSAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAgICAgICAgICJzdWIgICAgICAgICAgICAgJDgsICUwICAgICAgICAgICAgIFxuIgotICAgICAgICAgICAgIm1vdnNzICAgICAoJTIsICUwKSwgJSV4bW00ICAgICAgICAgXG4iCi0gICAgICAgICAgICAibW92c3MgICAgNCglMiwgJTApLCAlJXhtbTUgICAgICAgICBcbiIKLSAgICAgICAgICAgICJzaHVmcHMgICAgICAgICAgJDAsICUleG1tNCwgJSV4bW00IFxuIgotICAgICAgICAgICAgInNodWZwcyAgICAgICAgICAkMCwgJSV4bW01LCAlJXhtbTUgXG4iCi0gICAgICAgICAgICAibW92YXBzICAgICAgJSV4bW00LCAgICglMSwgJTAsIDQpICBcbiIKLSAgICAgICAgICAgICJtb3ZhcHMgICAgICAlJXhtbTUsIDE2KCUxLCAlMCwgNCkgIFxuIgotICAgICAgICAgICAgImpnICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgXG4iCi0gICAgICAgICAgICA6ICIrJnIiKGopCi0gICAgICAgICAgICA6ICJyIihtYXRyaXhfc2ltZCksICJyIihtYXRyaXgpCi0gICAgICAgICAgICA6ICJtZW1vcnkiCi0gICAgICAgICk7Ci0gICAgICAgIGlmIChvdXRfY2ggPT0gMikgewotICAgICAgICAgICAgTUlYX01JU0MoSUYxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1JWF9NSVNDKElGMCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLSNlbmRpZiAvKiBIQVZFX1NTRV9JTkxJTkUgJiYgSEFWRV83UkVHUyAqLwotCiBhdl9jb2xkIHZvaWQgZmZfYWMzZHNwX2luaXRfeDg2KEFDM0RTUENvbnRleHQgKmMsIGludCBiaXRfZXhhY3QpCiB7CiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKQEAgLTIyOCwxNiArOTYsMTkgQEAKICAgICAgICAgYy0+ZmxvYXRfdG9fZml4ZWQyNCA9IGZmX2Zsb2F0X3RvX2ZpeGVkMjRfc3NlMjsKICAgICAgICAgYy0+Y29tcHV0ZV9tYW50aXNzYV9zaXplID0gZmZfYWMzX2NvbXB1dGVfbWFudGlzc2Ffc2l6ZV9zc2UyOwogICAgICAgICBjLT5leHRyYWN0X2V4cG9uZW50cyA9IGZmX2FjM19leHRyYWN0X2V4cG9uZW50c19zc2UyOwotICAgICAgICBpZiAoIShjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19TU0UyU0xPVykpIHsKLSAgICAgICAgICAgIGMtPmFjM19sc2hpZnRfaW50MTYgPSBmZl9hYzNfbHNoaWZ0X2ludDE2X3NzZTI7Ci0gICAgICAgICAgICBjLT5hYzNfcnNoaWZ0X2ludDMyID0gZmZfYWMzX3JzaGlmdF9pbnQzMl9zc2UyOwotICAgICAgICB9CiAgICAgICAgIGlmIChiaXRfZXhhY3QpIHsKICAgICAgICAgICAgIGMtPmFwcGx5X3dpbmRvd19pbnQxNiA9IGZmX2FwcGx5X3dpbmRvd19pbnQxNl9zc2UyOwotICAgICAgICB9IGVsc2UgaWYgKCEoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cpKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMl9GQVNUKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWMzX2xzaGlmdF9pbnQxNiA9IGZmX2FjM19sc2hpZnRfaW50MTZfc3NlMjsKKyAgICAgICAgYy0+YWMzX3JzaGlmdF9pbnQzMiA9IGZmX2FjM19yc2hpZnRfaW50MzJfc3NlMjsKKyAgICAgICAgaWYgKCFiaXRfZXhhY3QpIHsKICAgICAgICAgICAgIGMtPmFwcGx5X3dpbmRvd19pbnQxNiA9IGZmX2FwcGx5X3dpbmRvd19pbnQxNl9yb3VuZF9zc2UyOwogICAgICAgICB9CiAgICAgfQorCiAgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpIHsKICAgICAgICAgYy0+YWMzX21heF9tc2JfYWJzX2ludDE2ID0gZmZfYWMzX21heF9tc2JfYWJzX2ludDE2X3Nzc2UzOwogICAgICAgICBpZiAoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfQVRPTSkgewpAQCAtMjQ3LDEwICsxMTgsNDcgQEAKICAgICAgICAgICAgIGMtPmFwcGx5X3dpbmRvd19pbnQxNiA9IGZmX2FwcGx5X3dpbmRvd19pbnQxNl9zc3NlMzsKICAgICAgICAgfQogICAgIH0KK30KIAotI2lmIEhBVkVfU1NFX0lOTElORSAmJiBIQVZFXzdSRUdTCi0gICAgaWYgKElOTElORV9TU0UoY3B1X2ZsYWdzKSkgewotICAgICAgICBjLT5kb3dubWl4ID0gYWMzX2Rvd25taXhfc3NlOworI2RlZmluZSBET1dOTUlYX0ZVTkNfT1BUKGNoLCBvcHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9hYzNfZG93bm1peF8gIyMgY2ggIyMgX3RvXzFfICMjIG9wdChmbG9hdCAqKnNhbXBsZXMsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbik7ICAgXAordm9pZCBmZl9hYzNfZG93bm1peF8gIyMgY2ggIyMgX3RvXzJfICMjIG9wdChmbG9hdCAqKnNhbXBsZXMsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKm1hdHJpeCwgaW50IGxlbik7CisKKyNkZWZpbmUgRE9XTk1JWF9GVU5DUyhvcHQpICAgXAorICAgIERPV05NSVhfRlVOQ19PUFQoMywgb3B0KSBcCisgICAgRE9XTk1JWF9GVU5DX09QVCg0LCBvcHQpIFwKKyAgICBET1dOTUlYX0ZVTkNfT1BUKDUsIG9wdCkgXAorICAgIERPV05NSVhfRlVOQ19PUFQoNiwgb3B0KQorCitET1dOTUlYX0ZVTkNTKHNzZSkKK0RPV05NSVhfRlVOQ1MoYXZ4KQorRE9XTk1JWF9GVU5DUyhmbWEzKQorCit2b2lkIGZmX2FjM2RzcF9zZXRfZG93bm1peF94ODYoQUMzRFNQQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisjZGVmaW5lIFNFVF9ET1dOTUlYKGNoLCBzdWYsIFNVRikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNoID09IGMtPmluX2NoYW5uZWxzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChFWFRFUk5BTF8gIyMgU1VGIChjcHVfZmxhZ3MpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoYy0+b3V0X2NoYW5uZWxzID09IDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYy0+ZG93bm1peCA9IGZmX2FjM19kb3dubWl4XyAjIyBjaCAjIyBfdG9fMV8gIyMgc3VmOyAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYy0+ZG93bm1peCA9IGZmX2FjM19kb3dubWl4XyAjIyBjaCAjIyBfdG9fMl8gIyMgc3VmOyAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQotI2VuZGlmCisKKyNkZWZpbmUgU0VUX0RPV05NSVhfQUxMKHN1ZiwgU1VGKSAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0RPV05NSVgoMywgc3VmLCBTVUYpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9ET1dOTUlYKDQsIHN1ZiwgU1VGKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfRE9XTk1JWCg1LCBzdWYsIFNVRikgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0RPV05NSVgoNiwgc3VmLCBTVUYpCisKKyAgICBTRVRfRE9XTk1JWF9BTEwoc3NlLCAgU1NFKQorICAgIGlmICghKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX0FWWFNMT1cpKSB7CisgICAgICAgIFNFVF9ET1dOTUlYX0FMTChhdngsICBBVlgpCisgICAgICAgIFNFVF9ET1dOTUlYX0FMTChmbWEzLCBGTUEzKQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2FsYWNkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvYWxhY2RzcF9pbml0LmMKaW5kZXggZGU1ZGFlNi4uMThmNzMwOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvYWxhY2RzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvYWxhY2RzcF9pbml0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogYXZfY29sZCB2b2lkIGZmX2FsYWNkc3BfaW5pdF94ODYoQUxBQ0RTUENvbnRleHQgKmMpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgewpAQCAtNDAsNSArNDAsNSBAQAogICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykpIHsKICAgICAgICAgYy0+ZGVjb3JyZWxhdGVfc3RlcmVvICAgPSBmZl9hbGFjX2RlY29ycmVsYXRlX3N0ZXJlb19zc2U0OwogICAgIH0KLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvYXVkaW9kc3AuYXNtIGIvbGliYXZjb2RlYy94ODYvYXVkaW9kc3AuYXNtCmluZGV4IDNmZmIyN2YuLmRlMzk1ZTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2F1ZGlvZHNwLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9hdWRpb2RzcC5hc20KQEAgLTI2LDcgKzI2LDcgQEAKICVtYWNybyBTQ0FMQVJQUk9EVUNUIDAKIDsgaW50IGZmX3NjYWxhcnByb2R1Y3RfaW50MTYoaW50MTZfdCAqdjEsIGludDE2X3QgKnYyLCBpbnQgb3JkZXIpCiBjZ2xvYmFsIHNjYWxhcnByb2R1Y3RfaW50MTYsIDMsMywzLCB2MSwgdjIsIG9yZGVyCi0gICAgc2hsIG9yZGVycSwgMQorICAgIGFkZCBvcmRlcmQsIG9yZGVyZAogICAgIGFkZCB2MXEsIG9yZGVycQogICAgIGFkZCB2MnEsIG9yZGVycQogICAgIG5lZyBvcmRlcnEKQEAgLTYyLDcgKzYyLDcgQEAKIDsgJTEgPSBudW1iZXIgb2YgeG1tIHJlZ2lzdGVycyB1c2VkCiA7ICUyID0gbnVtYmVyIG9mIGlubGluZSBsb2FkL3Byb2Nlc3Mvc3RvcmUgbG9vcHMgcGVyIGFzbSBsb29wCiA7ICUzID0gcHJvY2VzcyA0Km1tc2l6ZSAoJTM9MCkgb3IgOCptbXNpemUgKCUzPTEpIGJ5dGVzIHBlciBsb29wCi07ICU0ID0gQ0xJUEQgZnVuY3Rpb24gdGFrZXMgbWluL21heCBhcyBmbG9hdCBpbnN0ZWFkIG9mIGludCAoQ0xJUERfU1NFMikKKzsgJTQgPSBDTElQRCBmdW5jdGlvbiB0YWtlcyBtaW4vbWF4IGFzIGZsb2F0IGluc3RlYWQgb2YgaW50IChTU0UyIHZlcnNpb24pCiA7ICU1ID0gc3VmZml4CiAlbWFjcm8gVkVDVE9SX0NMSVBfSU5UMzIgNC01CiBjZ2xvYmFsIHZlY3Rvcl9jbGlwX2ludDMyJTUsIDUsNSwlMSwgZHN0LCBzcmMsIG1pbiwgbWF4LCBsZW4KQEAgLTc4LDE1ICs3OCwxNSBAQAogLmxvb3A6CiAlYXNzaWduICUlaSAwCiAlcmVwICUyCi0gICAgbW92YSAgICAgIG0wLCAgW3NyY3ErbW1zaXplKigwKyUlaSldCi0gICAgbW92YSAgICAgIG0xLCAgW3NyY3ErbW1zaXplKigxKyUlaSldCi0gICAgbW92YSAgICAgIG0yLCAgW3NyY3ErbW1zaXplKigyKyUlaSldCi0gICAgbW92YSAgICAgIG0zLCAgW3NyY3ErbW1zaXplKigzKyUlaSldCisgICAgbW92YSAgICAgIG0wLCAgW3NyY3EgKyBtbXNpemUgKiAoMCArICUlaSldCisgICAgbW92YSAgICAgIG0xLCAgW3NyY3EgKyBtbXNpemUgKiAoMSArICUlaSldCisgICAgbW92YSAgICAgIG0yLCAgW3NyY3EgKyBtbXNpemUgKiAoMiArICUlaSldCisgICAgbW92YSAgICAgIG0zLCAgW3NyY3EgKyBtbXNpemUgKiAoMyArICUlaSldCiAlaWYgJTMKLSAgICBtb3ZhICAgICAgbTcsICBbc3JjcSttbXNpemUqKDQrJSVpKV0KLSAgICBtb3ZhICAgICAgbTgsICBbc3JjcSttbXNpemUqKDUrJSVpKV0KLSAgICBtb3ZhICAgICAgbTksICBbc3JjcSttbXNpemUqKDYrJSVpKV0KLSAgICBtb3ZhICAgICAgbTEwLCBbc3JjcSttbXNpemUqKDcrJSVpKV0KKyAgICBtb3ZhICAgICAgbTcsICBbc3JjcSArIG1tc2l6ZSAqICg0ICsgJSVpKV0KKyAgICBtb3ZhICAgICAgbTgsICBbc3JjcSArIG1tc2l6ZSAqICg1ICsgJSVpKV0KKyAgICBtb3ZhICAgICAgbTksICBbc3JjcSArIG1tc2l6ZSAqICg2ICsgJSVpKV0KKyAgICBtb3ZhICAgICAgbTEwLCBbc3JjcSArIG1tc2l6ZSAqICg3ICsgJSVpKV0KICVlbmRpZgogICAgIENMSVBEICBtMCwgIG00LCBtNSwgbTYKICAgICBDTElQRCAgbTEsICBtNCwgbTUsIG02CkBAIC05OCwxNyArOTgsMTcgQEAKICAgICBDTElQRCAgbTksICBtNCwgbTUsIG02CiAgICAgQ0xJUEQgIG0xMCwgbTQsIG01LCBtNgogJWVuZGlmCi0gICAgbW92YSAgW2RzdHErbW1zaXplKigwKyUlaSldLCBtMAotICAgIG1vdmEgIFtkc3RxK21tc2l6ZSooMSslJWkpXSwgbTEKLSAgICBtb3ZhICBbZHN0cSttbXNpemUqKDIrJSVpKV0sIG0yCi0gICAgbW92YSAgW2RzdHErbW1zaXplKigzKyUlaSldLCBtMworICAgIG1vdmEgIFtkc3RxICsgbW1zaXplICogKDAgKyAlJWkpXSwgbTAKKyAgICBtb3ZhICBbZHN0cSArIG1tc2l6ZSAqICgxICsgJSVpKV0sIG0xCisgICAgbW92YSAgW2RzdHEgKyBtbXNpemUgKiAoMiArICUlaSldLCBtMgorICAgIG1vdmEgIFtkc3RxICsgbW1zaXplICogKDMgKyAlJWkpXSwgbTMKICVpZiAlMwotICAgIG1vdmEgIFtkc3RxK21tc2l6ZSooNCslJWkpXSwgbTcKLSAgICBtb3ZhICBbZHN0cSttbXNpemUqKDUrJSVpKV0sIG04Ci0gICAgbW92YSAgW2RzdHErbW1zaXplKig2KyUlaSldLCBtOQotICAgIG1vdmEgIFtkc3RxK21tc2l6ZSooNyslJWkpXSwgbTEwCisgICAgbW92YSAgW2RzdHEgKyBtbXNpemUgKiAoNCArICUlaSldLCBtNworICAgIG1vdmEgIFtkc3RxICsgbW1zaXplICogKDUgKyAlJWkpXSwgbTgKKyAgICBtb3ZhICBbZHN0cSArIG1tc2l6ZSAqICg2ICsgJSVpKV0sIG05CisgICAgbW92YSAgW2RzdHEgKyBtbXNpemUgKiAoNyArICUlaSldLCBtMTAKICVlbmRpZgotJWFzc2lnbiAlJWkgJSVpKzQqKCUzKzEpCislYXNzaWduICUlaSAoJSVpICsgNCAqICgxICsgJTMpKQogJWVuZHJlcAogICAgIGFkZCAgICAgc3JjcSwgbW1zaXplKjQqKCUyKyUzKQogICAgIGFkZCAgICAgZHN0cSwgbW1zaXplKjQqKCUyKyUzKQpAQCAtMTE4LDYwICsxMTgsNTcgQEAKICVlbmRtYWNybwogCiBJTklUX01NWCBtbXgKLSVkZWZpbmUgQ0xJUEQgQ0xJUERfTU1YCiBWRUNUT1JfQ0xJUF9JTlQzMiAwLCAxLCAwLCAwCiBJTklUX1hNTSBzc2UyCiBWRUNUT1JfQ0xJUF9JTlQzMiA2LCAxLCAwLCAwLCBfaW50Ci0lZGVmaW5lIENMSVBEIENMSVBEX1NTRTIKIFZFQ1RPUl9DTElQX0lOVDMyIDYsIDIsIDAsIDEKIElOSVRfWE1NIHNzZTQKLSVkZWZpbmUgQ0xJUEQgQ0xJUERfU1NFNDEKICVpZmRlZiBtOAogVkVDVE9SX0NMSVBfSU5UMzIgMTEsIDEsIDEsIDAKICVlbHNlCiBWRUNUT1JfQ0xJUF9JTlQzMiA2LCAxLCAwLCAwCiAlZW5kaWYKIAotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07dm9pZCBmZl92ZWN0b3JfY2xpcGYoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKLTsgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaW4sIGZsb2F0IG1heCwgaW50IGxlbikKLTstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX3ZlY3Rvcl9jbGlwZl9zc2UoZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGZsb2F0IG1pbiwgZmxvYXQgbWF4KQogSU5JVF9YTU0gc3NlCi0laWYgVU5JWDY0Ci1jZ2xvYmFsIHZlY3Rvcl9jbGlwZiwgMywzLDYsIGRzdCwgc3JjLCBsZW4KLSVlbHNlCi1jZ2xvYmFsIHZlY3Rvcl9jbGlwZiwgNSw1LDYsIGRzdCwgc3JjLCBtaW4sIG1heCwgbGVuCitjZ2xvYmFsIHZlY3Rvcl9jbGlwZiwgMywgMywgNiwgZHN0LCBzcmMsIGxlbiwgbWluLCBtYXgKKyVpZiBBUkNIX1g4Nl8zMgorICAgIFZCUk9BRENBU1RTUyBtMCwgbWlubQorICAgIFZCUk9BRENBU1RTUyBtMSwgbWF4bQorJWVsaWYgV0lONjQKKyAgICBTV0FQIDAsIDMKKyAgICBWQlJPQURDQVNUU1MgbTAsIG0wCisgICAgVkJST0FEQ0FTVFNTIG0xLCBtYXhtCislZWxzZSA7IDY0Yml0IHN5c3YKKyAgICBWQlJPQURDQVNUU1MgbTAsIG0wCisgICAgVkJST0FEQ0FTVFNTIG0xLCBtMQogJWVuZGlmCi0laWYgV0lONjQKLSAgICBTV0FQIDAsIDIKLSAgICBTV0FQIDEsIDMKLSVlbGlmIEFSQ0hfWDg2XzMyCi0gICAgbW92c3MgICBtMCwgbWlubQotICAgIG1vdnNzICAgbTEsIG1heG0KLSVlbmRpZgotICAgIFNQTEFURCAgbTAKLSAgICBTUExBVEQgIG0xCi0gICAgICAgIHNobCBsZW5kLCAyCi0gICAgICAgIGFkZCBzcmNxLCBsZW5xCi0gICAgICAgIGFkZCBkc3RxLCBsZW5xCi0gICAgICAgIG5lZyBsZW5xCisKKyAgICBtb3ZzeGRpZm5pZG4gbGVucSwgbGVuZAorCiAubG9vcDoKLSAgICBtb3ZhICAgIG0yLCAgW3NyY3ErbGVucSttbXNpemUqMF0KLSAgICBtb3ZhICAgIG0zLCAgW3NyY3ErbGVucSttbXNpemUqMV0KLSAgICBtb3ZhICAgIG00LCAgW3NyY3ErbGVucSttbXNpemUqMl0KLSAgICBtb3ZhICAgIG01LCAgW3NyY3ErbGVucSttbXNpemUqM10KLSAgICBtYXhwcyAgIG0yLCBtMAotICAgIG1heHBzICAgbTMsIG0wCi0gICAgbWF4cHMgICBtNCwgbTAKLSAgICBtYXhwcyAgIG01LCBtMAotICAgIG1pbnBzICAgbTIsIG0xCi0gICAgbWlucHMgICBtMywgbTEKLSAgICBtaW5wcyAgIG00LCBtMQotICAgIG1pbnBzICAgbTUsIG0xCi0gICAgbW92YSAgICBbZHN0cStsZW5xK21tc2l6ZSowXSwgbTIKLSAgICBtb3ZhICAgIFtkc3RxK2xlbnErbW1zaXplKjFdLCBtMwotICAgIG1vdmEgICAgW2RzdHErbGVucSttbXNpemUqMl0sIG00Ci0gICAgbW92YSAgICBbZHN0cStsZW5xK21tc2l6ZSozXSwgbTUKLSAgICBhZGQgICAgIGxlbnEsIG1tc2l6ZSo0Ci0gICAgamwgLmxvb3AKLSAgICBSRVBfUkVUCisgICAgbW92YSBtMiwgW3NyY3EgKyA0ICogbGVucSAtIDQgKiBtbXNpemVdCisgICAgbW92YSBtMywgW3NyY3EgKyA0ICogbGVucSAtIDMgKiBtbXNpemVdCisgICAgbW92YSBtNCwgW3NyY3EgKyA0ICogbGVucSAtIDIgKiBtbXNpemVdCisgICAgbW92YSBtNSwgW3NyY3EgKyA0ICogbGVucSAtIDEgKiBtbXNpemVdCisKKyAgICBtYXhwcyBtMiwgbTAKKyAgICBtYXhwcyBtMywgbTAKKyAgICBtYXhwcyBtNCwgbTAKKyAgICBtYXhwcyBtNSwgbTAKKworICAgIG1pbnBzIG0yLCBtMQorICAgIG1pbnBzIG0zLCBtMQorICAgIG1pbnBzIG00LCBtMQorICAgIG1pbnBzIG01LCBtMQorCisgICAgbW92YSBbZHN0cSArIDQgKiBsZW5xIC0gNCAqIG1tc2l6ZV0sIG0yCisgICAgbW92YSBbZHN0cSArIDQgKiBsZW5xIC0gMyAqIG1tc2l6ZV0sIG0zCisgICAgbW92YSBbZHN0cSArIDQgKiBsZW5xIC0gMiAqIG1tc2l6ZV0sIG00CisgICAgbW92YSBbZHN0cSArIDQgKiBsZW5xIC0gMSAqIG1tc2l6ZV0sIG01CisKKyAgICBzdWIgbGVucSwgbW1zaXplCisgICAgamcgLmxvb3AKKworICAgIFJFVApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvYXVkaW9kc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvYXVkaW9kc3BfaW5pdC5jCmluZGV4IGEyY2UyMzEuLjk4ZTI5NmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2F1ZGlvZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9hdWRpb2RzcF9pbml0LmMKQEAgLTIxLDcgKzIxLDYgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9hdWRpb2RzcC5oIgogCkBAIC0zOSw3ICszOCw3IEBACiB2b2lkIGZmX3ZlY3Rvcl9jbGlwX2ludDMyX3NzZTQoaW50MzJfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4LCB1bnNpZ25lZCBpbnQgbGVuKTsKIHZvaWQgZmZfdmVjdG9yX2NsaXBmX3NzZShmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1pbiwgZmxvYXQgbWF4LCBpbnQgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBmbG9hdCBtaW4sIGZsb2F0IG1heCk7CiAKIGF2X2NvbGQgdm9pZCBmZl9hdWRpb2RzcF9pbml0X3g4NihBdWRpb0RTUENvbnRleHQgKmMpCiB7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9ibG9ja2RzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni9ibG9ja2RzcC5hc20KaW5kZXggN2NiZmEzYS4uOWQyMDNkZiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvYmxvY2tkc3AuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2Jsb2NrZHNwLmFzbQpAQCAtNCw2ICs0LDggQEAKIDsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0CiA7KiBDb3B5cmlnaHQgKGMpIDIwMDkgRmlvbmEgR2xhc2VyCiA7KgorOyogQVZYIHZlcnNpb24gYnkgSm9reW8gSW1hZ2VzCis7KgogOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogOyoKIDsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTMyLDI3ICszNCwyNSBAQAogOyAlMiA9IG51bWJlciBvZiBpbmxpbmUgc3RvcmUgbG9vcHMKICVtYWNybyBDTEVBUl9CTE9DSyAyCiBjZ2xvYmFsIGNsZWFyX2Jsb2NrLCAxLCAxLCAlMSwgYmxvY2tzCi0gICAgWkVSTyAgbTAsIG0wCisgICAgWkVSTyAgbTAsIG0wLCBtMAogJWFzc2lnbiAlJWkgMAogJXJlcCAlMgogICAgIG1vdmEgIFtibG9ja3NxK21tc2l6ZSooMCslJWkpXSwgbTAKICAgICBtb3ZhICBbYmxvY2tzcSttbXNpemUqKDErJSVpKV0sIG0wCiAgICAgbW92YSAgW2Jsb2Nrc3ErbW1zaXplKigyKyUlaSldLCBtMAogICAgIG1vdmEgIFtibG9ja3NxK21tc2l6ZSooMyslJWkpXSwgbTAKLSAgICBtb3ZhICBbYmxvY2tzcSttbXNpemUqKDQrJSVpKV0sIG0wCi0gICAgbW92YSAgW2Jsb2Nrc3ErbW1zaXplKig1KyUlaSldLCBtMAotICAgIG1vdmEgIFtibG9ja3NxK21tc2l6ZSooNislJWkpXSwgbTAKLSAgICBtb3ZhICBbYmxvY2tzcSttbXNpemUqKDcrJSVpKV0sIG0wCi0lYXNzaWduICUlaSAlJWkrOAorJWFzc2lnbiAlJWkgJSVpKzQKICVlbmRyZXAKICAgICBSRVQKICVlbmRtYWNybwogCiBJTklUX01NWCBtbXgKICVkZWZpbmUgWkVSTyBweG9yCi1DTEVBUl9CTE9DSyAwLCAyCitDTEVBUl9CTE9DSyAwLCA0CiBJTklUX1hNTSBzc2UKICVkZWZpbmUgWkVSTyB4b3JwcworQ0xFQVJfQkxPQ0sgMSwgMgorSU5JVF9ZTU0gYXZ4CiBDTEVBUl9CTE9DSyAxLCAxCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjMsNyArNjMsNyBAQAogY2dsb2JhbCBjbGVhcl9ibG9ja3MsIDEsIDIsICUxLCBibG9ja3MsIGxlbgogICAgIGFkZCAgIGJsb2Nrc3EsIDc2OAogICAgIG1vdiAgICAgIGxlbnEsIC03NjgKLSAgICBaRVJPICAgICAgIG0wLCBtMAorICAgIFpFUk8gICAgICAgbTAsIG0wLCBtMAogLmxvb3A6CiAgICAgbW92YSAgW2Jsb2Nrc3ErbGVucSttbXNpemUqMF0sIG0wCiAgICAgbW92YSAgW2Jsb2Nrc3ErbGVucSttbXNpemUqMV0sIG0wCkBAIC04NCwzICs4NCw1IEBACiBJTklUX1hNTSBzc2UKICVkZWZpbmUgWkVSTyB4b3JwcwogQ0xFQVJfQkxPQ0tTIDEKK0lOSVRfWU1NIGF2eAorQ0xFQVJfQkxPQ0tTIDEKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2Jsb2NrZHNwX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L2Jsb2NrZHNwX2luaXQuYwppbmRleCAyMTU5OTkzLi44YjAxYTQ0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9ibG9ja2RzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvYmxvY2tkc3BfaW5pdC5jCkBAIC0yOCwxMyArMjgsMTUgQEAKIAogdm9pZCBmZl9jbGVhcl9ibG9ja19tbXgoaW50MTZfdCAqYmxvY2spOwogdm9pZCBmZl9jbGVhcl9ibG9ja19zc2UoaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9jbGVhcl9ibG9ja19hdngoaW50MTZfdCAqYmxvY2spOwogdm9pZCBmZl9jbGVhcl9ibG9ja3NfbW14KGludDE2X3QgKmJsb2Nrcyk7CiB2b2lkIGZmX2NsZWFyX2Jsb2Nrc19zc2UoaW50MTZfdCAqYmxvY2tzKTsKK3ZvaWQgZmZfY2xlYXJfYmxvY2tzX2F2eChpbnQxNl90ICpibG9ja3MpOwogCiBhdl9jb2xkIHZvaWQgZmZfYmxvY2tkc3BfaW5pdF94ODYoQmxvY2tEU1BDb250ZXh0ICpjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKIHsKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKICAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKQEAgLTUwLDUgKzUyLDkgQEAKICAgICAgICAgYy0+Y2xlYXJfYmxvY2sgID0gZmZfY2xlYXJfYmxvY2tfc3NlOwogICAgICAgICBjLT5jbGVhcl9ibG9ja3MgPSBmZl9jbGVhcl9ibG9ja3Nfc3NlOwogICAgIH0KLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyAgICBpZiAoRVhURVJOQUxfQVZYX0ZBU1QoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5jbGVhcl9ibG9jayAgPSBmZl9jbGVhcl9ibG9ja19hdng7CisgICAgICAgIGMtPmNsZWFyX2Jsb2NrcyA9IGZmX2NsZWFyX2Jsb2Nrc19hdng7CisgICAgfQorI2VuZGlmIC8qIEhBVkVfWDg2QVNNICovCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9ic3dhcGRzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni9ic3dhcGRzcC5hc20KaW5kZXggNTZkODA4My4uMzFjNmM0OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvYnN3YXBkc3AuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2Jzd2FwZHNwLmFzbQpAQCAtMzUsMTQgKzM1LDE4IEBACiAgICAgbW92ICAgICAgcjNkLCByMmQKICAgICBzYXIgICAgICByMmQsIDMKICAgICBqeiAgICAgICAubGVmdDRfJTEKKyVpZiBjcHVmbGFnKGF2eDIpCisgICAgc2FyICAgICAgcjJkLCAxCisgICAganogICAgICAgLmxlZnQ4XyUxCislZW5kaWYKIC5sb29wOF8lMToKICAgICBtb3YlMSAgICBtMCwgW3IxICsgIDBdCi0gICAgbW92JTEgICAgbTEsIFtyMSArIDE2XQotJWlmIGNwdWZsYWcoc3NzZTMpCisgICAgbW92JTEgICAgbTEsIFtyMSArIG1tc2l6ZV0KKyVpZiBjcHVmbGFnKHNzc2UzKXx8Y3B1ZmxhZyhhdngyKQogICAgIHBzaHVmYiAgIG0wLCBtMgogICAgIHBzaHVmYiAgIG0xLCBtMgogICAgIG1vdiUxICAgIFtyMCArICAwXSwgbTAKLSAgICBtb3YlMSAgICBbcjAgKyAxNl0sIG0xCisgICAgbW92JTEgICAgW3IwICsgbW1zaXplXSwgbTEKICVlbHNlCiAgICAgcHNodWZsdyAgbTAsIG0wLCAxMDExMDAwMWIKICAgICBwc2h1Zmx3ICBtMSwgbTEsIDEwMTEwMDAxYgpAQCAtNTksMTggKzYzLDI5IEBACiAgICAgbW92JTEgICAgW3IwICsgIDBdLCBtMgogICAgIG1vdiUxICAgIFtyMCArIDE2XSwgbTMKICVlbmRpZgotICAgIGFkZCAgICAgIHIwLCAzMgotICAgIGFkZCAgICAgIHIxLCAzMgorICAgIGFkZCAgICAgIHIwLCBtbXNpemUqMgorICAgIGFkZCAgICAgIHIxLCBtbXNpemUqMgogICAgIGRlYyAgICAgIHIyZAogICAgIGpueiAgICAgIC5sb29wOF8lMQorJWlmIGNwdWZsYWcoYXZ4MikKKy5sZWZ0OF8lMToKKyAgICBtb3YgICAgICByMmQsIHIzZAorICAgIHRlc3QgICAgIHIzZCwgOAorICAgIGp6ICAgICAgIC5sZWZ0NF8lMQorICAgIG1vdiUxICAgIG0wLCBbcjFdCisgICAgcHNodWZiICAgbTAsIG0yCisgICAgbW92JTEgICAgW3IwICsgIDBdLCBtMAorICAgIGFkZCByMSwgbW1zaXplCisgICAgYWRkIHIwLCBtbXNpemUKKyVlbmRpZgogLmxlZnQ0XyUxOgogICAgIG1vdiAgICAgIHIyZCwgcjNkCiAgICAgdGVzdCAgICAgcjNkLCA0CiAgICAganogICAgICAgLmxlZnQKLSAgICBtb3YlMSAgICBtMCwgW3IxXQorICAgIG1vdiUxICAgIHhtMCwgW3IxXQogJWlmIGNwdWZsYWcoc3NzZTMpCi0gICAgcHNodWZiICAgbTAsIG0yCi0gICAgbW92JTEgICAgW3IwXSwgbTAKKyAgICBwc2h1ZmIgICB4bTAsIHhtMgorICAgIG1vdiUxICAgIFtyMF0sIHhtMAogJWVsc2UKICAgICBwc2h1Zmx3ICBtMCwgbTAsIDEwMTEwMDAxYgogICAgIHBzaHVmaHcgIG0wLCBtMCwgMTAxMTAwMDFiCkBAIC04NiwxNiArMTAxLDE2IEBACiAKIDsgdm9pZCBmZl9ic3dhcF9idWYodWludDMyX3QgKmRzdCwgY29uc3QgdWludDMyX3QgKnNyYywgaW50IHcpOwogJW1hY3JvIEJTV0FQMzJfQlVGIDAKLSVpZiBjcHVmbGFnKHNzc2UzKQorJWlmIGNwdWZsYWcoc3NzZTMpfHxjcHVmbGFnKGF2eDIpCiBjZ2xvYmFsIGJzd2FwMzJfYnVmLCAzLDQsMwogICAgIG1vdiAgICAgIHIzLCByMQotICAgIG1vdmEgICAgIG0yLCBbcGJfYnN3YXAzMl0KKyAgICBWQlJPQURDQVNUSTEyOCAgbTIsIFtwYl9ic3dhcDMyXQogJWVsc2UKIGNnbG9iYWwgYnN3YXAzMl9idWYsIDMsNCw1CiAgICAgbW92ICAgICAgcjMsIHIxCiAlZW5kaWYKICAgICBvciAgICAgICByMywgcjAKLSAgICB0ZXN0ICAgICByMywgMTUKKyAgICB0ZXN0ICAgICByMywgbW1zaXplIC0gMQogICAgIGp6ICAgICAgIC5zdGFydF9hbGlnbgogICAgIEJTV0FQX0xPT1BTICB1CiAgICAgam1wICAgICAgLmxlZnQKQEAgLTEwNSw5ICsxMjAsOSBAQAogJWlmIGNwdWZsYWcoc3NzZTMpCiAgICAgdGVzdCAgICAgcjJkLCAyCiAgICAganogICAgICAgLmxlZnQxCi0gICAgbW92cSAgICAgbTAsIFtyMV0KLSAgICBwc2h1ZmIgICBtMCwgbTIKLSAgICBtb3ZxICAgICBbcjBdLCBtMAorICAgIG1vdnEgICAgIHhtMCwgW3IxXQorICAgIHBzaHVmYiAgIHhtMCwgeG0yCisgICAgbW92cSAgICAgW3IwXSwgeG0wCiAgICAgYWRkICAgICAgcjEsIDgKICAgICBhZGQgICAgICByMCwgOAogLmxlZnQxOgpAQCAtMTM3LDMgKzE1Miw4IEBACiAKIElOSVRfWE1NIHNzc2UzCiBCU1dBUDMyX0JVRgorCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitCU1dBUDMyX0JVRgorJWVuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9ic3dhcGRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9ic3dhcGRzcF9pbml0LmMKaW5kZXggYzA0MmU1Ni4uODc3YmFiMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvYnN3YXBkc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L2Jzd2FwZHNwX2luaXQuYwpAQCAtMjUsNiArMjUsNyBAQAogCiB2b2lkIGZmX2Jzd2FwMzJfYnVmX3NzZTIodWludDMyX3QgKmRzdCwgY29uc3QgdWludDMyX3QgKnNyYywgaW50IHcpOwogdm9pZCBmZl9ic3dhcDMyX2J1Zl9zc3NlMyh1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50MzJfdCAqc3JjLCBpbnQgdyk7Cit2b2lkIGZmX2Jzd2FwMzJfYnVmX2F2eDIodWludDMyX3QgKmRzdCwgY29uc3QgdWludDMyX3QgKnNyYywgaW50IHcpOwogCiBhdl9jb2xkIHZvaWQgZmZfYnN3YXBkc3BfaW5pdF94ODYoQnN3YXBEU1BDb250ZXh0ICpjKQogewpAQCAtMzQsNCArMzUsNiBAQAogICAgICAgICBjLT5ic3dhcF9idWYgPSBmZl9ic3dhcDMyX2J1Zl9zc2UyOwogICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKQogICAgICAgICBjLT5ic3dhcF9idWYgPSBmZl9ic3dhcDMyX2J1Zl9zc3NlMzsKKyAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpCisgICAgICAgIGMtPmJzd2FwX2J1ZiA9IGZmX2Jzd2FwMzJfYnVmX2F2eDI7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9jYWJhYy5oIGIvbGliYXZjb2RlYy94ODYvY2FiYWMuaAppbmRleCAzNTEwMzM2Li5jZmQzYjc1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9jYWJhYy5oCisrKyBiL2xpYmF2Y29kZWMveDg2L2NhYmFjLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICNkZWZpbmUgRU5EX0NIRUNLKGVuZCkgIiIKICNlbHNlCiAjZGVmaW5lIEVORF9DSEVDSyhlbmQpIFwKLSAgICAgICAgImNtcCAgICAiZW5kIiAgICAgICAsICUlIlJFR19jIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiY21wICAgICJlbmQiICAgICAgICwgJSUiRkZfUkVHX2MiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICJqZ2UgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogI2VuZGlmCiAKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgInN1YiAgICAidG1wIiAgICAgICAsICJsb3ciICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICNlbHNlIC8qIEhBVkVfRkFTVF9DTU9WICovCiAjZGVmaW5lIEJSQU5DSExFU1NfR0VUX0NBQkFDX1VQREFURShyZXQsIHJldHEsIGxvdywgcmFuZ2UsIHRtcCkgXAotLyogUDQgUHJlc2NvdHQgaGFzIGNyYXBweSBjbW92LHNiYiw2NGJpdCBzaGlmdCBzbyBhdm9pZCB0aGVtICovIFwKKy8qIFA0IFByZXNjb3R0IGhhcyBjcmFwcHkgY21vdixzYmIsNjQtYml0IHNoaWZ0IHNvIGF2b2lkIHRoZW0gKi8gXAogICAgICAgICAic3ViICAgICJsb3ciICAgICAgICwgInRtcCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgInNhciAgICAkMzEgICAgICAgICAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICJzdWIgICAgJSVlY3ggICAgICAgLCAicmFuZ2UiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXApAQCAtOTIsMTEgKzkyLDExIEBACiAgICAgICAgICJtb3YgICAgInRtcGJ5dGUiICAgLCAic3RhdGVwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgInRlc3QgICAibG93d29yZCIgICAsICJsb3d3b3JkIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAiam56ICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3YgICAgImJ5dGUiICAgICAgLCAlJSJSRUdfYyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAiYnl0ZSIgICAgICAsICUlIkZGX1JFR19jIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICBFTkRfQ0hFQ0soZW5kKVwKLSAgICAgICAgImFkZCJPUFNJWkUiICQyICAgICAsICJieXRlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAiYWRkIkZGX09QU0laRSIgJDIgICwgImJ5dGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnp3bCAoJSUiUkVHX2MiKSAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92endsICglJSJGRl9SRUdfYyIpICwgInRtcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICJsZWEgICAgLTEoImxvdyIpICAgLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgInhvciAgICAibG93IiAgICAgICAsICUlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAic2hyICAgICQxNSAgICAgICAgICwgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCkBAIC0xNTMsMTEgKzE1MywxMSBAQAogICAgICAgICAibW92ICAgICJ0bXBieXRlIiAgICwgInN0YXRlcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICJ0ZXN0ICAgImxvd3dvcmQiICAgLCAibG93d29yZCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgIiBqbnogICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibW92ICAgICJieXRlIiAgICAgICwgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJtb3YgICAgImJ5dGUiICAgICAgLCAlJSJGRl9SRUdfYyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgRU5EX0NIRUNLKGVuZClcCi0gICAgICAgICJhZGQiT1BTSVpFIiAkMiAgICAgLCAiYnl0ZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImFkZCJGRl9PUFNJWkUiICQyICAsICJieXRlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3Z6d2wgKCUlIlJFR19jIikgICAgICwgInRtcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdnp3bCAoJSUiRkZfUkVHX2MiKSAsICJ0bXAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAibGVhICAgIC0xKCJsb3ciKSAgICwgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICJ4b3IgICAgImxvdyIgICAgICAgLCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgInNociAgICAkMTUgICAgICAgICAsICUlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXApAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgYnl0ZXN0cmVhbV9lbmQpKQogICAgICAgICAgIFRBQkxFU19BUkcKICAgICAgICAgICAsIjEiKGMtPmxvdyksICIyIihjLT5yYW5nZSkKLSAgICAgICAgOiAiJSJSRUdfYywgIm1lbW9yeSIKKyAgICAgICAgOiAiJSJGRl9SRUdfYywgIm1lbW9yeSIKICAgICApOwogICAgIHJldHVybiBiaXQgJiAxOwogfQpAQCAtMjQwLDcgKzI0MCw3IEBACiAgICAgICAgICJhZGRsICAgICAgICAgICUlZWR4LCAlJWVheCAgICAgXG5cdCIKICAgICAgICAgImNtcCAgICAgICAgICVjNSglMiksICUxICAgICAgICBcblx0IgogICAgICAgICAiamdlICAgICAgICAgICAgICAxZiAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQiT1BTSVpFIiAgICAgICQyLCAlYzQoJTIpICAgXG5cdCIKKyAgICAgICAgImFkZCJGRl9PUFNJWkUiICAgJDIsICVjNCglMikgICBcblx0IgogI2VuZGlmCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdmwgICAgICAgICAgJSVlYXgsICVjMyglMikgICBcblx0IgpAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgICAgICJhZGRsICAgICAgICAgICUlZWN4LCAlJWVheCAgICAgXG5cdCIKICAgICAgICAgImNtcCAgICAgICAgICVjNSglMiksICUxICAgICAgICBcblx0IgogICAgICAgICAiamdlICAgICAgICAgICAgICAxZiAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQiT1BTSVpFIiAgICAgICQyLCAlYzQoJTIpICAgXG5cdCIKKyAgICAgICAgImFkZCJGRl9PUFNJWkUiICAgJDIsICVjNCglMikgICBcblx0IgogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZsICAgICAgICAgICUlZWF4LCAlYzMoJTIpICAgXG5cdCIKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvY2F2c2RzcC5jIGIvbGliYXZjb2RlYy94ODYvY2F2c2RzcC5jCmluZGV4IDRiMjBlNjUuLmJlY2IzYTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2NhdnNkc3AuYworKysgYi9saWJhdmNvZGVjL3g4Ni9jYXZzZHNwLmMKQEAgLTM0LDE3MiArMzQsMjggQEAKICNpbmNsdWRlICJpZGN0ZHNwLmgiCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKLSNpZiBIQVZFX01NWF9JTkxJTkUKIAotLyogaW4vb3V0OiBtbWE9bW1hK21tYiwgbW1iPW1tYi1tbWEgKi8KLSNkZWZpbmUgU1VNU1VCX0JBKCBhLCBiICkgXAotICAgICJwYWRkdyAiI2IiLCAiI2EiIFxuXHQiXAotICAgICJwYWRkdyAiI2IiLCAiI2IiIFxuXHQiXAotICAgICJwc3VidyAiI2EiLCAiI2IiIFxuXHQiCisjaWYgSEFWRV9NTVhfRVhURVJOQUwKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogaW52ZXJzZSB0cmFuc2Zvcm0KLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgZmZfY2F2c19pZGN0OF9tbXgoaW50MTZfdCAqb3V0LCBjb25zdCBpbnQxNl90ICppbik7CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjYXZzX2lkY3Q4XzFkKGludDE2X3QgKmJsb2NrLCB1aW50NjRfdCBiaWFzKQorc3RhdGljIHZvaWQgY2F2c19pZGN0OF9hZGRfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIHB0cmRpZmZfdCBzdHJpZGUpCiB7Ci0gICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgIm1vdnEgMTEyKCUwKSwgJSVtbTQgIFxuXHQiIC8qIG1tNCA9IHNyYzcgKi8KLSAgICAgICAgIm1vdnEgIDE2KCUwKSwgJSVtbTUgIFxuXHQiIC8qIG1tNSA9IHNyYzEgKi8KLSAgICAgICAgIm1vdnEgIDgwKCUwKSwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IHNyYzUgKi8KLSAgICAgICAgIm1vdnEgIDQ4KCUwKSwgJSVtbTcgIFxuXHQiIC8qIG1tNyA9IHNyYzMgKi8KLSAgICAgICAgIm1vdnEgICAlJW1tNCwgJSVtbTAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAgJSVtbTUsICUlbW0zICBcblx0IgotICAgICAgICAibW92cSAgICUlbW0yLCAlJW1tNiAgXG5cdCIKLSAgICAgICAgIm1vdnEgICAlJW1tNywgJSVtbTEgIFxuXHQiCi0KLSAgICAgICAgInBhZGR3ICAlJW1tNCwgJSVtbTQgIFxuXHQiIC8qIG1tNCA9IDIqc3JjNyAqLwotICAgICAgICAicGFkZHcgICUlbW0zLCAlJW1tMyAgXG5cdCIgLyogbW0zID0gMipzcmMxICovCi0gICAgICAgICJwYWRkdyAgJSVtbTYsICUlbW02ICBcblx0IiAvKiBtbTYgPSAyKnNyYzUgKi8KLSAgICAgICAgInBhZGR3ICAlJW1tMSwgJSVtbTEgIFxuXHQiIC8qIG1tMSA9IDIqc3JjMyAqLwotICAgICAgICAicGFkZHcgICUlbW00LCAlJW1tMCAgXG5cdCIgLyogbW0wID0gMypzcmM3ICovCi0gICAgICAgICJwYWRkdyAgJSVtbTMsICUlbW01ICBcblx0IiAvKiBtbTUgPSAzKnNyYzEgKi8KLSAgICAgICAgInBhZGR3ICAlJW1tNiwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IDMqc3JjNSAqLwotICAgICAgICAicGFkZHcgICUlbW0xLCAlJW1tNyAgXG5cdCIgLyogbW03ID0gMypzcmMzICovCi0gICAgICAgICJwc3VidyAgJSVtbTQsICUlbW01ICBcblx0IiAvKiBtbTUgPSAzKnNyYzEgLSAyKnNyYzcgPSBhMCAqLwotICAgICAgICAicGFkZHcgICUlbW02LCAlJW1tNyAgXG5cdCIgLyogbW03ID0gMypzcmMzICsgMipzcmM1ID0gYTEgKi8KLSAgICAgICAgInBzdWJ3ICAlJW1tMiwgJSVtbTEgIFxuXHQiIC8qIG1tMSA9IDIqc3JjMyAtIDMqc3JjNSA9IGEyICovCi0gICAgICAgICJwYWRkdyAgJSVtbTAsICUlbW0zICBcblx0IiAvKiBtbTMgPSAyKnNyYzEgKyAzKnNyYzcgPSBhMyAqLwotCi0gICAgICAgICJtb3ZxICAgJSVtbTUsICUlbW00ICBcblx0IgotICAgICAgICAibW92cSAgICUlbW03LCAlJW1tNiAgXG5cdCIKLSAgICAgICAgIm1vdnEgICAlJW1tMywgJSVtbTAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAgJSVtbTEsICUlbW0yICBcblx0IgotICAgICAgICBTVU1TVUJfQkEoICUlbW03LCAlJW1tNSApICAgLyogbW03ID0gYTAgKyBhMSAgbW01ID0gYTAgLSBhMSAqLwotICAgICAgICAicGFkZHcgICUlbW0zLCAlJW1tNyAgXG5cdCIgLyogbW03ID0gYTAgKyBhMSArIGEzICovCi0gICAgICAgICJwYWRkdyAgJSVtbTEsICUlbW01ICBcblx0IiAvKiBtbTUgPSBhMCAtIGExICsgYTIgKi8KLSAgICAgICAgInBhZGR3ICAlJW1tNywgJSVtbTcgIFxuXHQiCi0gICAgICAgICJwYWRkdyAgJSVtbTUsICUlbW01ICBcblx0IgotICAgICAgICAicGFkZHcgICUlbW02LCAlJW1tNyAgXG5cdCIgLyogbW03ID0gYjQgKi8KLSAgICAgICAgInBhZGR3ICAlJW1tNCwgJSVtbTUgIFxuXHQiIC8qIG1tNSA9IGI1ICovCi0KLSAgICAgICAgU1VNU1VCX0JBKCAlJW1tMSwgJSVtbTMgKSAgIC8qIG1tMSA9IGEzICsgYTIgIG1tMyA9IGEzIC0gYTIgKi8KLSAgICAgICAgInBzdWJ3ICAlJW1tMSwgJSVtbTQgIFxuXHQiIC8qIG1tNCA9IGEwIC0gYTIgLSBhMyAqLwotICAgICAgICAibW92cSAgICUlbW00LCAlJW1tMSAgXG5cdCIgLyogbW0xID0gYTAgLSBhMiAtIGEzICovCi0gICAgICAgICJwc3VidyAgJSVtbTYsICUlbW0zICBcblx0IiAvKiBtbTMgPSBhMyAtIGEyIC0gYTEgKi8KLSAgICAgICAgInBhZGR3ICAlJW1tMSwgJSVtbTEgIFxuXHQiCi0gICAgICAgICJwYWRkdyAgJSVtbTMsICUlbW0zICBcblx0IgotICAgICAgICAicHN1YncgICUlbW0yLCAlJW1tMSAgXG5cdCIgLyogbW0xID0gYjcgKi8KLSAgICAgICAgInBhZGR3ICAlJW1tMCwgJSVtbTMgIFxuXHQiIC8qIG1tMyA9IGI2ICovCi0KLSAgICAgICAgIm1vdnEgIDMyKCUwKSwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IHNyYzIgKi8KLSAgICAgICAgIm1vdnEgIDk2KCUwKSwgJSVtbTYgIFxuXHQiIC8qIG1tNiA9IHNyYzYgKi8KLSAgICAgICAgIm1vdnEgICAlJW1tMiwgJSVtbTQgIFxuXHQiCi0gICAgICAgICJtb3ZxICAgJSVtbTYsICUlbW0wICBcblx0IgotICAgICAgICAicHNsbHcgICQyLCAgICAlJW1tNCAgXG5cdCIgLyogbW00ID0gNCpzcmMyICovCi0gICAgICAgICJwc2xsdyAgJDIsICAgICUlbW02ICBcblx0IiAvKiBtbTYgPSA0KnNyYzYgKi8KLSAgICAgICAgInBhZGR3ICAlJW1tNCwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IDUqc3JjMiAqLwotICAgICAgICAicGFkZHcgICUlbW02LCAlJW1tMCAgXG5cdCIgLyogbW0wID0gNSpzcmM2ICovCi0gICAgICAgICJwYWRkdyAgJSVtbTIsICUlbW0yICBcblx0IgotICAgICAgICAicGFkZHcgICUlbW0wLCAlJW1tMCAgXG5cdCIKLSAgICAgICAgInBzdWJ3ICAlJW1tMCwgJSVtbTQgIFxuXHQiIC8qIG1tNCA9IDQqc3JjMiAtIDEwKnNyYzYgPSBhNyAqLwotICAgICAgICAicGFkZHcgICUlbW0yLCAlJW1tNiAgXG5cdCIgLyogbW02ID0gNCpzcmM2ICsgMTAqc3JjMiA9IGE2ICovCi0KLSAgICAgICAgIm1vdnEgICAgKCUwKSwgJSVtbTIgIFxuXHQiIC8qIG1tMiA9IHNyYzAgKi8KLSAgICAgICAgIm1vdnEgIDY0KCUwKSwgJSVtbTAgIFxuXHQiIC8qIG1tMCA9IHNyYzQgKi8KLSAgICAgICAgU1VNU1VCX0JBKCAlJW1tMCwgJSVtbTIgKSAgIC8qIG1tMCA9IHNyYzArc3JjNCAgbW0yID0gc3JjMC1zcmM0ICovCi0gICAgICAgICJwc2xsdyAgJDMsICAgICUlbW0wICBcblx0IgotICAgICAgICAicHNsbHcgICQzLCAgICAlJW1tMiAgXG5cdCIKLSAgICAgICAgInBhZGR3ICAlMSwgICAgJSVtbTAgIFxuXHQiIC8qIGFkZCByb3VuZGluZyBiaWFzICovCi0gICAgICAgICJwYWRkdyAgJTEsICAgICUlbW0yICBcblx0IiAvKiBhZGQgcm91bmRpbmcgYmlhcyAqLwotCi0gICAgICAgIFNVTVNVQl9CQSggJSVtbTYsICUlbW0wICkgICAvKiBtbTYgPSBhNCArIGE2ICBtbTAgPSBhNCAtIGE2ICovCi0gICAgICAgIFNVTVNVQl9CQSggJSVtbTQsICUlbW0yICkgICAvKiBtbTQgPSBhNSArIGE3ICBtbTIgPSBhNSAtIGE3ICovCi0gICAgICAgIFNVTVNVQl9CQSggJSVtbTcsICUlbW02ICkgICAvKiBtbTcgPSBkc3QwICBtbTYgPSBkc3Q3ICovCi0gICAgICAgIFNVTVNVQl9CQSggJSVtbTUsICUlbW00ICkgICAvKiBtbTUgPSBkc3QxICBtbTQgPSBkc3Q2ICovCi0gICAgICAgIFNVTVNVQl9CQSggJSVtbTMsICUlbW0yICkgICAvKiBtbTMgPSBkc3QyICBtbTIgPSBkc3Q1ICovCi0gICAgICAgIFNVTVNVQl9CQSggJSVtbTEsICUlbW0wICkgICAvKiBtbTEgPSBkc3QzICBtbTAgPSBkc3Q0ICovCi0gICAgICAgIDo6ICJyIihibG9jayksICJtIihiaWFzKQotICAgICk7Ci19Ci0KLSNkZWZpbmUgU0JVVFRFUkZMWShhLGIsdCxuLG0pXAotICAgICJtb3YiICNtICIgIiAjYSAiLCAiICN0ICIgICAgICAgICBcblx0IiAvKiBhYmNkICovXAotICAgICJwdW5wY2tsIiAjbiAiICIgI2IgIiwgIiAjYSAiICAgICBcblx0IiAvKiBhZWJmICovXAotICAgICJwdW5wY2toIiAjbiAiICIgI2IgIiwgIiAjdCAiICAgICBcblx0IiAvKiBjZ2RoICovXAotCi0jZGVmaW5lIFRSQU5TUE9TRTQoYSxiLGMsZCx0KVwKLSAgICBTQlVUVEVSRkxZKGEsYix0LHdkLHEpIC8qIGE9YWViZiB0PWNnZGggKi9cCi0gICAgU0JVVFRFUkZMWShjLGQsYix3ZCxxKSAvKiBjPWltam4gYj1rb2xwICovXAotICAgIFNCVVRURVJGTFkoYSxjLGQsZHEscSkgLyogYT1hZWltIGQ9YmZqbiAqL1wKLSAgICBTQlVUVEVSRkxZKHQsYixjLGRxLHEpIC8qIHQ9Y2drbyBjPWRobHAgKi8KLQotc3RhdGljIHZvaWQgY2F2c19pZGN0OF9hZGRfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCi17Ci0gICAgaW50IGk7CiAgICAgTE9DQUxfQUxJR05FRCgxNiwgaW50MTZfdCwgYjIsIFs2NF0pOwotCi0gICAgZm9yKGk9MDsgaTwyOyBpKyspewotICAgICAgICBjYXZzX2lkY3Q4XzFkKGJsb2NrICsgNCAqIGksIGZmX3B3XzQuYSk7Ci0KLSAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJwc3JhdyAgICAgJDMsICUlbW03ICBcblx0IgotICAgICAgICAgICAgInBzcmF3ICAgICAkMywgJSVtbTYgIFxuXHQiCi0gICAgICAgICAgICAicHNyYXcgICAgICQzLCAlJW1tNSAgXG5cdCIKLSAgICAgICAgICAgICJwc3JhdyAgICAgJDMsICUlbW00ICBcblx0IgotICAgICAgICAgICAgInBzcmF3ICAgICAkMywgJSVtbTMgIFxuXHQiCi0gICAgICAgICAgICAicHNyYXcgICAgICQzLCAlJW1tMiAgXG5cdCIKLSAgICAgICAgICAgICJwc3JhdyAgICAgJDMsICUlbW0xICBcblx0IgotICAgICAgICAgICAgInBzcmF3ICAgICAkMywgJSVtbTAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICUlbW03LCAgKCUwKSAgXG5cdCIKLSAgICAgICAgICAgIFRSQU5TUE9TRTQoICUlbW0wLCAlJW1tMiwgJSVtbTQsICUlbW02LCAlJW1tNyApCi0gICAgICAgICAgICAibW92cSAgICUlbW0wLCAgOCglMCkgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICUlbW02LCAyNCglMCkgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICUlbW03LCA0MCglMCkgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICUlbW00LCA1NiglMCkgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAoJTApLCAgJSVtbTcgIFxuXHQiCi0gICAgICAgICAgICBUUkFOU1BPU0U0KCAlJW1tNywgJSVtbTUsICUlbW0zLCAlJW1tMSwgJSVtbTAgKQotICAgICAgICAgICAgIm1vdnEgICAlJW1tNywgICAoJTApICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAlJW1tMSwgMTYoJTApICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAlJW1tMCwgMzIoJTApICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAlJW1tMywgNDgoJTApICBcblx0IgotICAgICAgICAgICAgOgotICAgICAgICAgICAgOiAiciIoYjIgKyAzMiAqIGkpCi0gICAgICAgICAgICA6ICJtZW1vcnkiCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZm9yKGk9MDsgaTwyOyBpKyspewotICAgICAgICBjYXZzX2lkY3Q4XzFkKGIyKzQqaSwgZmZfcHdfNjQuYSk7Ci0KLSAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJwc3JhdyAgICAgJDcsICUlbW03ICBcblx0IgotICAgICAgICAgICAgInBzcmF3ICAgICAkNywgJSVtbTYgIFxuXHQiCi0gICAgICAgICAgICAicHNyYXcgICAgICQ3LCAlJW1tNSAgXG5cdCIKLSAgICAgICAgICAgICJwc3JhdyAgICAgJDcsICUlbW00ICBcblx0IgotICAgICAgICAgICAgInBzcmF3ICAgICAkNywgJSVtbTMgIFxuXHQiCi0gICAgICAgICAgICAicHNyYXcgICAgICQ3LCAlJW1tMiAgXG5cdCIKLSAgICAgICAgICAgICJwc3JhdyAgICAgJDcsICUlbW0xICBcblx0IgotICAgICAgICAgICAgInBzcmF3ICAgICAkNywgJSVtbTAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICUlbW03LCAgICAoJTApICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAlJW1tNSwgIDE2KCUwKSAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgJSVtbTMsICAzMiglMCkgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICUlbW0xLCAgNDgoJTApICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAlJW1tMCwgIDY0KCUwKSAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgJSVtbTIsICA4MCglMCkgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICUlbW00LCAgOTYoJTApICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAlJW1tNiwgMTEyKCUwKSAgXG5cdCIKLSAgICAgICAgICAgIDo6ICJyIihiMis0KmkpCi0gICAgICAgICAgICA6ICJtZW1vcnkiCi0gICAgICAgICk7Ci0gICAgfQotCi0gICAgZmZfYWRkX3BpeGVsc19jbGFtcGVkKGIyLCBkc3QsIHN0cmlkZSk7CisgICAgZmZfY2F2c19pZGN0OF9tbXgoYjIsIGJsb2NrKTsKKyAgICBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfbW14KGIyLCBkc3QsIHN0cmlkZSk7CiB9CiAKLSNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgKi8KK3ZvaWQgZmZfY2F2c19pZGN0OF9zc2UyKGludDE2X3QgKm91dCwgY29uc3QgaW50MTZfdCAqaW4pOworCitzdGF0aWMgdm9pZCBjYXZzX2lkY3Q4X2FkZF9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIHB0cmRpZmZfdCBzdHJpZGUpCit7CisgICAgTE9DQUxfQUxJR05FRCgxNiwgaW50MTZfdCwgYjIsIFs2NF0pOworICAgIGZmX2NhdnNfaWRjdDhfc3NlMihiMiwgYmxvY2spOworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9zc2UyKGIyLCBkc3QsIHN0cmlkZSk7Cit9CisKKyNlbmRpZiAvKiBIQVZFX01NWF9FWFRFUk5BTCAqLwogCiAjaWYgKEhBVkVfTU1YRVhUX0lOTElORSB8fCBIQVZFX0FNRDNETk9XX0lOTElORSkKIApAQCAtMzM0LDcgKzE5MCw4IEBACiAgICB9CiAKICNkZWZpbmUgUVBFTF9DQVZTKE9QTkFNRSwgT1AsIE1NWClcCi1zdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsOF9oXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWw4X2hfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHNyY1N0cmlkZSlcCit7XAogICAgIGludCBoPTg7XAogICAgIF9fYXNtX18gdm9sYXRpbGUoXAogICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgXG5cdCJcCkBAIC0zODIsNDMgKzIzOSw1MyBAQAogICAgICk7XAogfVwKIFwKLXN0YXRpYyBpbmxpbmUgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjFfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IGgpe1wKK3N0YXRpYyBpbmxpbmUgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjFfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHNyY1N0cmlkZSwgaW50IGgpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBRUEVMX0NBVlNWTlVNKFFQRUxfQ0FWU1YxLE9QLGZmX3B3XzY0LGZmX3B3Xzk2LGZmX3B3XzQyKSAgICAgIFwKIH1cCiBcCi1zdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YyXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUsIGludCBoKXtcCitzdGF0aWMgaW5saW5lIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YyXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUsIGludCBoKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgUVBFTF9DQVZTVk5VTShRUEVMX0NBVlNWMixPUCxmZl9wd180LGZmX3B3XzUsZmZfcHdfNDIpICAgICAgICBcCiB9XAogXAotc3RhdGljIGlubGluZSB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92M18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgaCl7XAorc3RhdGljIGlubGluZSB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92M18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlLCBpbnQgaClcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIFFQRUxfQ0FWU1ZOVU0oUVBFTF9DQVZTVjMsT1AsZmZfcHdfNjQsZmZfcHdfOTYsZmZfcHdfNDIpICAgICAgXAogfVwKIFwKLXN0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWw4X3YxXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWw4X3YxXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92MV8gIyMgTU1YKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIDgpO1wKIH1cCi1zdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsMTZfdjFfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDE2X3YxXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92MV8gIyMgTU1YKGRzdCAgLCBzcmMgICwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIDE2KTtcCiAgICAgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YxXyAjIyBNTVgoZHN0KzgsIHNyYys4LCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgMTYpO1wKIH1cCiBcCi1zdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsOF92Ml8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsOF92Ml8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjJfICMjIE1NWChkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCA4KTtcCiB9XAotc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDE2X3YyXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwxNl92Ml8gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0U3RyaWRlLCBwdHJkaWZmX3Qgc3JjU3RyaWRlKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjJfICMjIE1NWChkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCAxNik7XAogICAgIE9QTkFNRSAjIyBjYXZzX3FwZWw4b3IxNl92Ml8gIyMgTU1YKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUsIDE2KTtcCiB9XAogXAotc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDhfdjNfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGRzdFN0cmlkZSwgaW50IHNyY1N0cmlkZSl7XAorc3RhdGljIHZvaWQgT1BOQU1FICMjIGNhdnNfcXBlbDhfdjNfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHNyY1N0cmlkZSlcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YzXyAjIyBNTVgoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgOCk7XAogfVwKLXN0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwxNl92M18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCitzdGF0aWMgdm9pZCBPUE5BTUUgIyMgY2F2c19xcGVsMTZfdjNfICMjIE1NWCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IGRzdFN0cmlkZSwgcHRyZGlmZl90IHNyY1N0cmlkZSlcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgT1BOQU1FICMjIGNhdnNfcXBlbDhvcjE2X3YzXyAjIyBNTVgoZHN0ICAsIHNyYyAgLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgMTYpO1wKICAgICBPUE5BTUUgIyMgY2F2c19xcGVsOG9yMTZfdjNfICMjIE1NWChkc3QrOCwgc3JjKzgsIGRzdFN0cmlkZSwgc3JjU3RyaWRlLCAxNik7XAogfVwKIFwKLXN0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwxNl9oXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBkc3RTdHJpZGUsIGludCBzcmNTdHJpZGUpe1wKK3N0YXRpYyB2b2lkIE9QTkFNRSAjIyBjYXZzX3FwZWwxNl9oXyAjIyBNTVgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBkc3RTdHJpZGUsIHB0cmRpZmZfdCBzcmNTdHJpZGUpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE9QTkFNRSAjIyBjYXZzX3FwZWw4X2hfICMjIE1NWChkc3QgICwgc3JjICAsIGRzdFN0cmlkZSwgc3JjU3RyaWRlKTtcCiAgICAgT1BOQU1FICMjIGNhdnNfcXBlbDhfaF8gIyMgTU1YKGRzdCs4LCBzcmMrOCwgZHN0U3RyaWRlLCBzcmNTdHJpZGUpO1wKICAgICBzcmMgKz0gOCpzcmNTdHJpZGU7XApAQCAtNTE4LDEyICszODUsMTAgQEAKICAgICBjLT5wdXRfY2F2c19xcGVsX3BpeGVsc190YWJbMV1bMF0gPSBwdXRfY2F2c19xcGVsOF9tYzAwX21teDsKICAgICBjLT5hdmdfY2F2c19xcGVsX3BpeGVsc190YWJbMF1bMF0gPSBhdmdfY2F2c19xcGVsMTZfbWMwMF9tbXg7CiAgICAgYy0+YXZnX2NhdnNfcXBlbF9waXhlbHNfdGFiWzFdWzBdID0gYXZnX2NhdnNfcXBlbDhfbWMwMF9tbXg7Ci0jZW5kaWYKIAotI2lmIEhBVkVfTU1YX0lOTElORQogICAgIGMtPmNhdnNfaWRjdDhfYWRkID0gY2F2c19pZGN0OF9hZGRfbW14OwogICAgIGMtPmlkY3RfcGVybSAgICAgID0gRkZfSURDVF9QRVJNX1RSQU5TUE9TRTsKLSNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgKi8KKyNlbmRpZiAvKiBIQVZFX01NWF9FWFRFUk5BTCAqLwogfQogCiAjZGVmaW5lIERTUEZVTkMoUEZYLCBJRFgsIE5VTSwgRVhUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC01NjUsNyArNDMwLDkgQEAKIHsKICAgICBhdl91bnVzZWQgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKIAotICAgIGNhdnNkc3BfaW5pdF9tbXgoYywgYXZjdHgpOworICAgIGlmIChYODZfTU1YKGNwdV9mbGFncykpCisgICAgICAgIGNhdnNkc3BfaW5pdF9tbXgoYywgYXZjdHgpOworCiAjaWYgSEFWRV9BTUQzRE5PV19JTkxJTkUKICAgICBpZiAoSU5MSU5FX0FNRDNETk9XKGNwdV9mbGFncykpCiAgICAgICAgIGNhdnNkc3BfaW5pdF8zZG5vdyhjLCBhdmN0eCk7CkBAIC01ODgsNiArNDU1LDkgQEAKICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CiAgICAgICAgIGMtPnB1dF9jYXZzX3FwZWxfcGl4ZWxzX3RhYlswXVswXSA9IHB1dF9jYXZzX3FwZWwxNl9tYzAwX3NzZTI7CiAgICAgICAgIGMtPmF2Z19jYXZzX3FwZWxfcGl4ZWxzX3RhYlswXVswXSA9IGF2Z19jYXZzX3FwZWwxNl9tYzAwX3NzZTI7CisKKyAgICAgICAgYy0+Y2F2c19pZGN0OF9hZGQgPSBjYXZzX2lkY3Q4X2FkZF9zc2UyOworICAgICAgICBjLT5pZGN0X3Blcm0gICAgICA9IEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0U7CiAgICAgfQogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9jYXZzaWRjdC5hc20gYi9saWJhdmNvZGVjL3g4Ni9jYXZzaWRjdC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM3NjhjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L2NhdnNpZGN0LmFzbQpAQCAtMCwwICsxLDIxMSBAQAorOyBDaGluZXNlIEFWUyB2aWRlbyAoQVZTMS1QMiwgSmlaaHVuIHByb2ZpbGUpIGRlY29kZXIKKzsgQ29weXJpZ2h0IChjKSAyMDA2ICBTdGVmYW4gR2VocmVyIDxzdGVmYW4uZ2VocmVyQGdteC5kZT4KKzsKKzsgTU1YLW9wdGltaXplZCBEU1AgZnVuY3Rpb25zLCBiYXNlZCBvbiBILjI2NCBvcHRpbWl6YXRpb25zIGJ5Cis7IE1pY2hhZWwgTmllZGVybWF5ZXIgYW5kIExvcmVuIE1lcnJpdHQKKzsgQ29udmVyc2lvbiBmcm9tIGdjYyBzeW50YXggdG8geDI2NGFzbSBzeW50YXggd2l0aCBtb2RpZmljYXRpb25zCis7IGJ5IFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKzsKKzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOworOyBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7IHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOworOyBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsKKzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCis7IGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCis7IEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK2NleHRlcm4gcHdfNAorY2V4dGVybiBwd182NAorCitTRUNUSU9OIC50ZXh0CisKKyVtYWNybyBDQVZTX0lEQ1Q4XzFEIDItMyAxIDsgc291cmNlLCByb3VuZCwgaW5pdF9sb2FkCislaWYgJTMgPT0gMQorICAgIG1vdmEgICAgICAgICAgICBtNCwgWyUxKzcqMTZdICAgICAgIDsgbTQgPSBzcmM3CisgICAgbW92YSAgICAgICAgICAgIG01LCBbJTErMSoxNl0gICAgICAgOyBtNSA9IHNyYzEKKyAgICBtb3ZhICAgICAgICAgICAgbTIsIFslMSs1KjE2XSAgICAgICA7IG0yID0gc3JjNQorICAgIG1vdmEgICAgICAgICAgICBtNywgWyUxKzMqMTZdICAgICAgIDsgbTcgPSBzcmMzCislZWxzZQorICAgIFNXQVAgICAgICAgICAgICAgMSwgNworICAgIFNXQVAgICAgICAgICAgICAgNCwgNgorJWVuZGlmCisgICAgbW92YSAgICAgICAgICAgIG0wLCBtNAorICAgIG1vdmEgICAgICAgICAgICBtMywgbTUKKyAgICBtb3ZhICAgICAgICAgICAgbTYsIG0yCisgICAgbW92YSAgICAgICAgICAgIG0xLCBtNworCisgICAgcGFkZHcgICAgICAgICAgIG00LCBtNCAgICAgICAgICAgICAgOyBtNCA9IDIqc3JjNworICAgIHBhZGR3ICAgICAgICAgICBtMywgbTMgICAgICAgICAgICAgIDsgbTMgPSAyKnNyYzEKKyAgICBwYWRkdyAgICAgICAgICAgbTYsIG02ICAgICAgICAgICAgICA7IG02ID0gMipzcmM1CisgICAgcGFkZHcgICAgICAgICAgIG0xLCBtMSAgICAgICAgICAgICAgOyBtMSA9IDIqc3JjMworICAgIHBhZGR3ICAgICAgICAgICBtMCwgbTQgICAgICAgICAgICAgIDsgbTAgPSAzKnNyYzcKKyAgICBwYWRkdyAgICAgICAgICAgbTUsIG0zICAgICAgICAgICAgICA7IG01ID0gMypzcmMxCisgICAgcGFkZHcgICAgICAgICAgIG0yLCBtNiAgICAgICAgICAgICAgOyBtMiA9IDMqc3JjNQorICAgIHBhZGR3ICAgICAgICAgICBtNywgbTEgICAgICAgICAgICAgIDsgbTcgPSAzKnNyYzMKKyAgICBwc3VidyAgICAgICAgICAgbTUsIG00ICAgICAgICAgICAgICA7IG01ID0gMypzcmMxIC0gMipzcmM3ID0gYTAKKyAgICBwYWRkdyAgICAgICAgICAgbTcsIG02ICAgICAgICAgICAgICA7IG03ID0gMypzcmMzIC0gMipzcmM1ID0gYTEKKyAgICBwc3VidyAgICAgICAgICAgbTEsIG0yICAgICAgICAgICAgICA7IG0xID0gMipzcmMzIC0gMypzcmM1ID0gYTIKKyAgICBwYWRkdyAgICAgICAgICAgbTMsIG0wICAgICAgICAgICAgICA7IG0zID0gMipzcmMxIC0gMypzcmM3ID0gYTMKKworICAgIG1vdmEgICAgICAgICAgICBtNCwgbTUKKyAgICBtb3ZhICAgICAgICAgICAgbTYsIG03CisgICAgbW92YSAgICAgICAgICAgIG0wLCBtMworICAgIG1vdmEgICAgICAgICAgICBtMiwgbTEKKyAgICBTVU1TVUJfQkEgICAgIHcsIDcsIDUgICAgICAgICAgICAgICA7IG03ID0gYTAgKyBhMSwgbTUgPSBhMCAtIGExCisgICAgcGFkZHcgICAgICAgICAgIG03LCBtMyAgICAgICAgICAgICAgOyBtNyA9IGEwICsgYTEgKyBhMworICAgIHBhZGR3ICAgICAgICAgICBtNSwgbTEgICAgICAgICAgICAgIDsgbTUgPSBhMCAtIGExICsgYTIKKyAgICBwYWRkdyAgICAgICAgICAgbTcsIG03CisgICAgcGFkZHcgICAgICAgICAgIG01LCBtNQorICAgIHBhZGR3ICAgICAgICAgICBtNywgbTYgICAgICAgICAgICAgIDsgbTcgPSBiNAorICAgIHBhZGR3ICAgICAgICAgICBtNSwgbTQgICAgICAgICAgICAgIDsgbTUgPSBiNQorCisgICAgU1VNU1VCX0JBICAgICB3LCAxLCAzICAgICAgICAgICAgICAgOyBtMSA9IGEzICsgYTIsIG0zID0gYTMgLSBhMgorICAgIHBzdWJ3ICAgICAgICAgICBtNCwgbTEgICAgICAgICAgICAgIDsgbTQgPSBhMCAtIGEyIC0gYTMKKyAgICBtb3ZhICAgICAgICAgICAgbTEsIG00ICAgICAgICAgICAgICA7IG0xID0gYTAgLSBhMiAtIGEzCisgICAgcHN1YncgICAgICAgICAgIG0zLCBtNiAgICAgICAgICAgICAgOyBtMyA9IGEzIC0gYTIgLSBhMQorICAgIHBhZGR3ICAgICAgICAgICBtMSwgbTEKKyAgICBwYWRkdyAgICAgICAgICAgbTMsIG0zCisgICAgcHN1YncgICAgICAgICAgIG0xLCBtMiAgICAgICAgICAgICAgOyBtMSA9IGI3CisgICAgcGFkZHcgICAgICAgICAgIG0zLCBtMCAgICAgICAgICAgICAgOyBtMyA9IGI2CisKKyAgICBtb3ZhICAgICAgICAgICAgbTIsIFslMSsyKjE2XSAgICAgICA7IG0yID0gc3JjMgorICAgIG1vdmEgICAgICAgICAgICBtNiwgWyUxKzYqMTZdICAgICAgIDsgbTYgPSBzcmM2CisgICAgbW92YSAgICAgICAgICAgIG00LCBtMgorICAgIG1vdmEgICAgICAgICAgICBtMCwgbTYKKyAgICBwc2xsdyAgICAgICAgICAgbTQsIDIgICAgICAgICAgICAgICA7IG00ID0gNCpzcmMyCisgICAgcHNsbHcgICAgICAgICAgIG02LCAyICAgICAgICAgICAgICAgOyBtNiA9IDQqc3JjNgorICAgIHBhZGR3ICAgICAgICAgICBtMiwgbTQgICAgICAgICAgICAgIDsgbTIgPSA1KnNyYzIKKyAgICBwYWRkdyAgICAgICAgICAgbTAsIG02ICAgICAgICAgICAgICA7IG0wID0gNSpzcmM2CisgICAgcGFkZHcgICAgICAgICAgIG0yLCBtMgorICAgIHBhZGR3ICAgICAgICAgICBtMCwgbTAKKyAgICBwc3VidyAgICAgICAgICAgbTQsIG0wICAgICAgICAgICAgICA7IG00ID0gNCpzcmMyIC0gMTAqc3JjNiA9IGE3CisgICAgcGFkZHcgICAgICAgICAgIG02LCBtMiAgICAgICAgICAgICAgOyBtNiA9IDQqc3JjNiArIDEwKnNyYzIgPSBhNgorCisgICAgbW92YSAgICAgICAgICAgIG0yLCBbJTErMCoxNl0gICAgICAgOyBtMiA9IHNyYzAKKyAgICBtb3ZhICAgICAgICAgICAgbTAsIFslMSs0KjE2XSAgICAgICA7IG0wID0gc3JjNAorICAgIFNVTVNVQl9CQSAgICAgdywgMCwgMiAgICAgICAgICAgICAgIDsgbTAgPSBzcmMwICsgc3JjNCwgbTIgPSBzcmMwIC0gc3JjNAorICAgIHBzbGx3ICAgICAgICAgICBtMCwgMworICAgIHBzbGx3ICAgICAgICAgICBtMiwgMworICAgIHBhZGR3ICAgICAgICAgICBtMCwgJTIgICAgICAgICAgICAgIDsgYWRkIHJvdW5kaW5nIGJpYXMKKyAgICBwYWRkdyAgICAgICAgICAgbTIsICUyICAgICAgICAgICAgICA7IGFkZCByb3VuZGluZyBiaWFzCisKKyAgICBTVU1TVUJfQkEgICAgIHcsIDYsIDAgICAgICAgICAgICAgICA7IG02ID0gYTQgKyBhNiwgbTAgPSBhNCAtIGE2CisgICAgU1VNU1VCX0JBICAgICB3LCA0LCAyICAgICAgICAgICAgICAgOyBtNCA9IGE1ICsgYTcsIG0yID0gYTUgLSBhNworICAgIFNVTVNVQl9CQSAgICAgdywgNywgNiAgICAgICAgICAgICAgIDsgbTcgPSBkc3QwLCBtNiA9IGRzdDcKKyAgICBTVU1TVUJfQkEgICAgIHcsIDUsIDQgICAgICAgICAgICAgICA7IG01ID0gZHN0MSwgbTQgPSBkc3Q2CisgICAgU1VNU1VCX0JBICAgICB3LCAzLCAyICAgICAgICAgICAgICAgOyBtMyA9IGRzdDIsIG0yID0gZHN0NQorICAgIFNVTVNVQl9CQSAgICAgdywgMSwgMCAgICAgICAgICAgICAgIDsgbTEgPSBkc3QzLCBtMCA9IGRzdDQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK2NnbG9iYWwgY2F2c19pZGN0OCwgMiwgNCwgOCwgOCAqIDE2LCBvdXQsIGluLCBjbnQsIHRtcAorICAgIG1vdiAgICAgICAgICAgY250ZCwgMgorICAgIG1vdiAgICAgICAgICAgdG1wcSwgcnNwCisKKy5sb29wXzE6CisgICAgQ0FWU19JRENUOF8xRCAgaW5xLCBbcHdfNF0KKyAgICBwc3JhdyAgICAgICAgICAgbTcsIDMKKyAgICBwc3JhdyAgICAgICAgICAgbTYsIDMKKyAgICBwc3JhdyAgICAgICAgICAgbTUsIDMKKyAgICBwc3JhdyAgICAgICAgICAgbTQsIDMKKyAgICBwc3JhdyAgICAgICAgICAgbTMsIDMKKyAgICBwc3JhdyAgICAgICAgICAgbTIsIDMKKyAgICBwc3JhdyAgICAgICAgICAgbTEsIDMKKyAgICBwc3JhdyAgICAgICAgICAgbTAsIDMKKyAgICBtb3ZhICAgICAgICBbdG1wcV0sIG03CisgICAgVFJBTlNQT1NFNHg0VyAgICAwLCAyLCA0LCA2LCA3CisgICAgbW92YSAgICBbdG1wcSsxKjhdLCBtMAorICAgIG1vdmEgICAgW3RtcHErMyo4XSwgbTIKKyAgICBtb3ZhICAgIFt0bXBxKzUqOF0sIG00CisgICAgbW92YSAgICBbdG1wcSs3KjhdLCBtNgorICAgIG1vdmEgICAgICAgICAgICBtNywgW3RtcHFdCisgICAgVFJBTlNQT1NFNHg0VyAgICA3LCA1LCAzLCAxLCAwCisgICAgbW92YSAgICBbdG1wcSswKjhdLCBtNworICAgIG1vdmEgICAgW3RtcHErMio4XSwgbTUKKyAgICBtb3ZhICAgIFt0bXBxKzQqOF0sIG0zCisgICAgbW92YSAgICBbdG1wcSs2KjhdLCBtMQorCisgICAgYWRkICAgICAgICAgICAgaW5xLCBtbXNpemUKKyAgICBhZGQgICAgICAgICAgIHRtcHEsIDY0CisgICAgZGVjICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3BfMQorCisgICAgbW92ICAgICAgICAgICBjbnRkLCAyCisgICAgbW92ICAgICAgICAgICB0bXBxLCByc3AKKy5sb29wXzI6CisgICAgQ0FWU19JRENUOF8xRCB0bXBxLCBbcHdfNjRdCisgICAgcHNyYXcgICAgICAgICAgIG03LCA3CisgICAgcHNyYXcgICAgICAgICAgIG02LCA3CisgICAgcHNyYXcgICAgICAgICAgIG01LCA3CisgICAgcHNyYXcgICAgICAgICAgIG00LCA3CisgICAgcHNyYXcgICAgICAgICAgIG0zLCA3CisgICAgcHNyYXcgICAgICAgICAgIG0yLCA3CisgICAgcHNyYXcgICAgICAgICAgIG0xLCA3CisgICAgcHNyYXcgICAgICAgICAgIG0wLCA3CisKKyAgICBtb3ZhICAgW291dHErMCoxNl0sIG03CisgICAgbW92YSAgIFtvdXRxKzEqMTZdLCBtNQorICAgIG1vdmEgICBbb3V0cSsyKjE2XSwgbTMKKyAgICBtb3ZhICAgW291dHErMyoxNl0sIG0xCisgICAgbW92YSAgIFtvdXRxKzQqMTZdLCBtMAorICAgIG1vdmEgICBbb3V0cSs1KjE2XSwgbTIKKyAgICBtb3ZhICAgW291dHErNioxNl0sIG00CisgICAgbW92YSAgIFtvdXRxKzcqMTZdLCBtNgorCisgICAgYWRkICAgICAgICAgICBvdXRxLCBtbXNpemUKKyAgICBhZGQgICAgICAgICAgIHRtcHEsIG1tc2l6ZQorICAgIGRlYyAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wXzIKKworICAgIFJFVAorCitJTklUX1hNTSBzc2UyCitjZ2xvYmFsIGNhdnNfaWRjdDgsIDIsIDIsIDggKyBBUkNIX1g4Nl82NCwgMCAtIDggKiAxNiwgb3V0LCBpbgorICAgIENBVlNfSURDVDhfMUQgIGlucSwgW3B3XzRdCisgICAgcHNyYXcgICAgICAgICAgIG03LCAzCisgICAgcHNyYXcgICAgICAgICAgIG02LCAzCisgICAgcHNyYXcgICAgICAgICAgIG01LCAzCisgICAgcHNyYXcgICAgICAgICAgIG00LCAzCisgICAgcHNyYXcgICAgICAgICAgIG0zLCAzCisgICAgcHNyYXcgICAgICAgICAgIG0yLCAzCisgICAgcHNyYXcgICAgICAgICAgIG0xLCAzCisgICAgcHNyYXcgICAgICAgICAgIG0wLCAzCislaWYgQVJDSF9YODZfNjQKKyAgICBUUkFOU1BPU0U4eDhXICAgIDcsIDUsIDMsIDEsIDAsIDIsIDQsIDYsIDgKKyAgICBtb3ZhICAgIFtyc3ArNCoxNl0sIG0wCislZWxzZQorICAgIG1vdmEgICAgW3JzcCswKjE2XSwgbTQKKyAgICBUUkFOU1BPU0U4eDhXICAgIDcsIDUsIDMsIDEsIDAsIDIsIDQsIDYsIFtyc3ArMCoxNl0sIFtyc3ArNCoxNl0sIDEKKyVlbmRpZgorICAgIG1vdmEgICAgW3JzcCswKjE2XSwgbTcKKyAgICBtb3ZhICAgIFtyc3ArMioxNl0sIG0zCisgICAgbW92YSAgICBbcnNwKzYqMTZdLCBtNAorICAgIENBVlNfSURDVDhfMUQgIHJzcCwgW3B3XzY0XSwgMAorICAgIHBzcmF3ICAgICAgICAgICBtNywgNworICAgIHBzcmF3ICAgICAgICAgICBtNiwgNworICAgIHBzcmF3ICAgICAgICAgICBtNSwgNworICAgIHBzcmF3ICAgICAgICAgICBtNCwgNworICAgIHBzcmF3ICAgICAgICAgICBtMywgNworICAgIHBzcmF3ICAgICAgICAgICBtMiwgNworICAgIHBzcmF3ICAgICAgICAgICBtMSwgNworICAgIHBzcmF3ICAgICAgICAgICBtMCwgNworCisgICAgbW92YSAgIFtvdXRxKzAqMTZdLCBtNworICAgIG1vdmEgICBbb3V0cSsxKjE2XSwgbTUKKyAgICBtb3ZhICAgW291dHErMioxNl0sIG0zCisgICAgbW92YSAgIFtvdXRxKzMqMTZdLCBtMQorICAgIG1vdmEgICBbb3V0cSs0KjE2XSwgbTAKKyAgICBtb3ZhICAgW291dHErNSoxNl0sIG0yCisgICAgbW92YSAgIFtvdXRxKzYqMTZdLCBtNAorICAgIG1vdmEgICBbb3V0cSs3KjE2XSwgbTYKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2NvbnN0YW50cy5jIGIvbGliYXZjb2RlYy94ODYvY29uc3RhbnRzLmMKaW5kZXggMTEwMDJlZS4uNGJmYjc4YyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvY29uc3RhbnRzLmMKKysrIGIvbGliYXZjb2RlYy94ODYvY29uc3RhbnRzLmMKQEAgLTI2LDIzICsyNiwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDEwMDAxMDAwMVVMTCwgMHgwMDAxMDAwMTAwMDEwMDAxVUxMIH07CiBERUNMQVJFX0FMSUdORUQoMzIsIGNvbnN0IHltbV9yZWcsICBmZl9wd18yKSAgICA9IHsgMHgwMDAyMDAwMjAwMDIwMDAyVUxMLCAweDAwMDIwMDAyMDAwMjAwMDJVTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMjAwMDIwMDAyVUxMLCAweDAwMDIwMDAyMDAwMjAwMDJVTEwgfTsKLURFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzMpICAgID0geyAweDAwMDMwMDAzMDAwMzAwMDNVTEwsIDB4MDAwMzAwMDMwMDAzMDAwM1VMTCB9OwotREVDTEFSRV9BTElHTkVEKDMyLCBjb25zdCB5bW1fcmVnLCAgZmZfcHdfNCkgICAgPSB7IDB4MDAwNDAwMDQwMDA0MDAwNFVMTCwgMHgwMDA0MDAwNDAwMDQwMDA0VUxMLAorREVDTEFSRV9BU01fQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzMpICAgID0geyAweDAwMDMwMDAzMDAwMzAwMDNVTEwsIDB4MDAwMzAwMDMwMDAzMDAwM1VMTCB9OworREVDTEFSRV9BU01fQUxJR05FRCgzMiwgY29uc3QgeW1tX3JlZywgIGZmX3B3XzQpICAgID0geyAweDAwMDQwMDA0MDAwNDAwMDRVTEwsIDB4MDAwNDAwMDQwMDA0MDAwNFVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDA0MDAwNDAwMDRVTEwsIDB4MDAwNDAwMDQwMDA0MDAwNFVMTCB9OwotREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfNSkgICAgPSB7IDB4MDAwNTAwMDUwMDA1MDAwNVVMTCwgMHgwMDA1MDAwNTAwMDUwMDA1VUxMIH07CitERUNMQVJFX0FTTV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfNSkgICAgPSB7IDB4MDAwNTAwMDUwMDA1MDAwNVVMTCwgMHgwMDA1MDAwNTAwMDUwMDA1VUxMIH07CiBERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd184KSAgICA9IHsgMHgwMDA4MDAwODAwMDgwMDA4VUxMLCAweDAwMDgwMDA4MDAwODAwMDhVTEwgfTsKLURFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzkpICAgID0geyAweDAwMDkwMDA5MDAwOTAwMDlVTEwsIDB4MDAwOTAwMDkwMDA5MDAwOVVMTCB9OworREVDTEFSRV9BU01fQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzkpICAgID0geyAweDAwMDkwMDA5MDAwOTAwMDlVTEwsIDB4MDAwOTAwMDkwMDA5MDAwOVVMTCB9OwogREVDTEFSRV9BTElHTkVEKDgsICBjb25zdCB1aW50NjRfdCwgZmZfcHdfMTUpICAgPSAgIDB4MDAwRjAwMEYwMDBGMDAwRlVMTDsKIERFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzE2KSAgID0geyAweDAwMTAwMDEwMDAxMDAwMTBVTEwsIDB4MDAxMDAwMTAwMDEwMDAxMFVMTCB9OwogREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfMTcpICAgPSB7IDB4MDAxMTAwMTEwMDExMDAxMVVMTCwgMHgwMDExMDAxMTAwMTEwMDExVUxMIH07Ci1ERUNMQVJFX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd18xOCkgICA9IHsgMHgwMDEyMDAxMjAwMTIwMDEyVUxMLCAweDAwMTIwMDEyMDAxMjAwMTJVTEwgfTsKK0RFQ0xBUkVfQVNNX0FMSUdORUQoMTYsIGNvbnN0IHhtbV9yZWcsICBmZl9wd18xOCkgICA9IHsgMHgwMDEyMDAxMjAwMTIwMDEyVUxMLCAweDAwMTIwMDEyMDAxMjAwMTJVTEwgfTsKIERFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzIwKSAgID0geyAweDAwMTQwMDE0MDAxNDAwMTRVTEwsIDB4MDAxNDAwMTQwMDE0MDAxNFVMTCB9OwogREVDTEFSRV9BTElHTkVEKDE2LCBjb25zdCB4bW1fcmVnLCAgZmZfcHdfMzIpICAgPSB7IDB4MDAyMDAwMjAwMDIwMDAyMFVMTCwgMHgwMDIwMDAyMDAwMjAwMDIwVUxMIH07Ci1ERUNMQVJFX0FMSUdORUQoOCwgIGNvbnN0IHVpbnQ2NF90LCBmZl9wd180MikgICA9ICAgMHgwMDJBMDAyQTAwMkEwMDJBVUxMOwotREVDTEFSRV9BTElHTkVEKDgsICBjb25zdCB1aW50NjRfdCwgZmZfcHdfNTMpICAgPSAgIDB4MDAzNTAwMzUwMDM1MDAzNVVMTDsKLURFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzY0KSAgID0geyAweDAwNDAwMDQwMDA0MDAwNDBVTEwsIDB4MDA0MDAwNDAwMDQwMDA0MFVMTCB9OwotREVDTEFSRV9BTElHTkVEKDgsICBjb25zdCB1aW50NjRfdCwgZmZfcHdfOTYpICAgPSAgIDB4MDA2MDAwNjAwMDYwMDA2MFVMTDsKLURFQ0xBUkVfQUxJR05FRCg4LCAgY29uc3QgdWludDY0X3QsIGZmX3B3XzEyOCkgID0gICAweDAwODAwMDgwMDA4MDAwODBVTEw7CitERUNMQVJFX0FTTV9BTElHTkVEKDgsICBjb25zdCB1aW50NjRfdCwgZmZfcHdfNDIpICAgPSAgIDB4MDAyQTAwMkEwMDJBMDAyQVVMTDsKK0RFQ0xBUkVfQVNNX0FMSUdORUQoOCwgIGNvbnN0IHVpbnQ2NF90LCBmZl9wd181MykgICA9ICAgMHgwMDM1MDAzNTAwMzUwMDM1VUxMOworREVDTEFSRV9BU01fQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3B3XzY0KSAgID0geyAweDAwNDAwMDQwMDA0MDAwNDBVTEwsIDB4MDA0MDAwNDAwMDQwMDA0MFVMTCB9OworREVDTEFSRV9BU01fQUxJR05FRCg4LCAgY29uc3QgdWludDY0X3QsIGZmX3B3Xzk2KSAgID0gICAweDAwNjAwMDYwMDA2MDAwNjBVTEw7CitERUNMQVJFX0FTTV9BTElHTkVEKDgsICBjb25zdCB1aW50NjRfdCwgZmZfcHdfMTI4KSAgPSAgIDB4MDA4MDAwODAwMDgwMDA4MFVMTDsKIERFQ0xBUkVfQUxJR05FRCgzMiwgY29uc3QgeW1tX3JlZywgIGZmX3B3XzI1NSkgID0geyAweDAwZmYwMGZmMDBmZjAwZmZVTEwsIDB4MDBmZjAwZmYwMGZmMDBmZlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwZmYwMGZmMDBmZjAwZmZVTEwsIDB4MDBmZjAwZmYwMGZmMDBmZlVMTCB9OwogREVDTEFSRV9BTElHTkVEKDMyLCBjb25zdCB5bW1fcmVnLCAgZmZfcHdfMjU2KSAgPSB7IDB4MDEwMDAxMDAwMTAwMDEwMFVMTCwgMHgwMTAwMDEwMDAxMDAwMTAwVUxMLApAQCAtNzQsNyArNzQsOCBAQAogREVDTEFSRV9BTElHTkVEKDMyLCBjb25zdCB5bW1fcmVnLCAgZmZfcGJfMykgICAgPSB7IDB4MDMwMzAzMDMwMzAzMDMwM1VMTCwgMHgwMzAzMDMwMzAzMDMwMzAzVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMwMzAzMDMwMzAzMDMwM1VMTCwgMHgwMzAzMDMwMzAzMDMwMzAzVUxMIH07CiBERUNMQVJFX0FMSUdORUQoMzIsIGNvbnN0IHhtbV9yZWcsICBmZl9wYl8xNSkgICA9IHsgMHgwRjBGMEYwRjBGMEYwRjBGVUxMLCAweDBGMEYwRjBGMEYwRjBGMEZVTEwgfTsKLURFQ0xBUkVfQUxJR05FRCgxNiwgY29uc3QgeG1tX3JlZywgIGZmX3BiXzgwKSAgID0geyAweDgwODA4MDgwODA4MDgwODBVTEwsIDB4ODA4MDgwODA4MDgwODA4MFVMTCB9OworREVDTEFSRV9BTElHTkVEKDMyLCBjb25zdCB5bW1fcmVnLCAgZmZfcGJfODApICAgPSB7IDB4ODA4MDgwODA4MDgwODA4MFVMTCwgMHg4MDgwODA4MDgwODA4MDgwVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODA4MDgwODA4MDgwODA4MFVMTCwgMHg4MDgwODA4MDgwODA4MDgwVUxMIH07CiBERUNMQVJFX0FMSUdORUQoMzIsIGNvbnN0IHltbV9yZWcsICBmZl9wYl9GRSkgICA9IHsgMHhGRUZFRkVGRUZFRkVGRUZFVUxMLCAweEZFRkVGRUZFRkVGRUZFRkVVTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRUZFRkVGRUZFRkVGRUZFVUxMLCAweEZFRkVGRUZFRkVGRUZFRkVVTEwgfTsKIERFQ0xBUkVfQUxJR05FRCg4LCAgY29uc3QgdWludDY0X3QsIGZmX3BiX0ZDKSAgID0gICAweEZDRkNGQ0ZDRkNGQ0ZDRkNVTEw7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9jb25zdGFudHMuaCBiL2xpYmF2Y29kZWMveDg2L2NvbnN0YW50cy5oCmluZGV4IGI4MmFlZjkuLjg1ZGEzOGIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2NvbnN0YW50cy5oCisrKyBiL2xpYmF2Y29kZWMveDg2L2NvbnN0YW50cy5oCkBAIC00Myw2ICs0Myw3IEBACiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfOTY7CiBleHRlcm4gY29uc3QgdWludDY0X3QgZmZfcHdfMTI4OwogZXh0ZXJuIGNvbnN0IHltbV9yZWcgIGZmX3B3XzI1NTsKK2V4dGVybiBjb25zdCB5bW1fcmVnICBmZl9wd18yNTY7CiBleHRlcm4gY29uc3QgeW1tX3JlZyAgZmZfcHdfNTEyOwogZXh0ZXJuIGNvbnN0IHltbV9yZWcgIGZmX3B3XzEwMjM7CiBleHRlcm4gY29uc3QgeW1tX3JlZyAgZmZfcHdfMTAyNDsKQEAgLTU2LDcgKzU3LDcgQEAKIGV4dGVybiBjb25zdCB5bW1fcmVnICBmZl9wYl8xOwogZXh0ZXJuIGNvbnN0IHltbV9yZWcgIGZmX3BiXzI7CiBleHRlcm4gY29uc3QgeW1tX3JlZyAgZmZfcGJfMzsKLWV4dGVybiBjb25zdCB4bW1fcmVnICBmZl9wYl84MDsKK2V4dGVybiBjb25zdCB5bW1fcmVnICBmZl9wYl84MDsKIGV4dGVybiBjb25zdCB5bW1fcmVnICBmZl9wYl9GRTsKIGV4dGVybiBjb25zdCB1aW50NjRfdCBmZl9wYl9GQzsKIApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvZGNhZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L2RjYWRzcC5hc20KaW5kZXggZmIxMzk1Ny4uMDU1MzYxYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvZGNhZHNwLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9kY2Fkc3AuYXNtCkBAIC0yNCw3ICsyNCw3IEBACiBTRUNUSU9OIC50ZXh0CiAKICVkZWZpbmUgc2l6ZW9mX2Zsb2F0IDQKLSVkZWZpbmUgRk1BM19PRkZTRVQgKDggKiBjcHVmbGFnKGZtYTMpICogQVJDSF9YODZfNjQpCislZGVmaW5lIEZNQTNfT0ZGU0VUICg4ICogY3B1ZmxhZyhmbWEzKSkKIAogJW1hY3JvIExGRV9GSVIwX0ZMT0FUIDAKIGNnbG9iYWwgbGZlX2ZpcjBfZmxvYXQsIDQsIDYsIDEyICsgY3B1ZmxhZyhmbWEzKSo0LCBzYW1wbGVzLCBsZmUsIGNvZWZmLCBuYmxvY2tzLCBjbnQxLCBjbnQyCkBAIC0xMDEsMTEgKzEwMSwxOSBAQAogJWVuZGlmCiAlZWxzZSA7IEFSQ0hfWDg2XzMyCiAlaWYgY3B1ZmxhZyhmbWEzKQotICAgIG11bHBzICAgICBtMCwgbTcsIFtjb2VmZnErY250MXEqOCAgIF0KLSAgICBtb3ZhcHMgICAgICAgIG0xLCBbY29lZmZxK2NudDFxKjgrMTZdCi0gICAgbXVscHMgICAgIG0yLCBtNywgW2NvZWZmcStjbnQxcSo4KzMyXQotICAgIGZtYWRkcHMgICBtMCwgbTYsIG0xLCBtMAotICAgIGZtYWRkcHMgICBtMiwgbTYsIFtjb2VmZnErY250MXEqOCs0OF0sIG0yCisgICAgbXVscHMgICAgIG0wLCBtNywgW2NvZWZmcStjbnQxcSo4ICAgIF0KKyAgICBtdWxwcyAgICAgbTEsIG03LCBbY29lZmZxK2NudDFxKjgrMzIgXQorICAgIG11bHBzICAgICBtMiwgbTcsIFtjb2VmZnErY250MXEqOCs2NCBdCisgICAgbXVscHMgICAgIG0zLCBtNywgW2NvZWZmcStjbnQxcSo4Kzk2IF0KKyAgICBmbWFkZHBzICAgbTAsIG02LCBbY29lZmZxK2NudDFxKjgrMTYgXSwgbTAKKyAgICBmbWFkZHBzICAgbTEsIG02LCBbY29lZmZxK2NudDFxKjgrNDggXSwgbTEKKyAgICBmbWFkZHBzICAgbTIsIG02LCBbY29lZmZxK2NudDFxKjgrODAgXSwgbTIKKyAgICBmbWFkZHBzICAgbTMsIG02LCBbY29lZmZxK2NudDFxKjgrMTEyXSwgbTMKKworICAgIGhhZGRwcyAgICBtMCwgbTEKKyAgICBoYWRkcHMgICAgbTIsIG0zCisgICAgaGFkZHBzICAgIG0wLCBtMgorICAgIG1vdmFwcyBbc2FtcGxlc3ErY250MXFdLCBtMAogJWVsc2UKICAgICBtdWxwcyAgICAgbTAsIG03LCBbY29lZmZxK2NudDFxKjggICBdCiAgICAgbXVscHMgICAgIG0xLCBtNiwgW2NvZWZmcStjbnQxcSo4KzE2XQpAQCAtMTEzLDEzICsxMjEsMTQgQEAKICAgICBtdWxwcyAgICAgbTMsIG02LCBbY29lZmZxK2NudDFxKjgrNDhdCiAgICAgYWRkcHMgICAgIG0wLCBtMQogICAgIGFkZHBzICAgICBtMiwgbTMKLSVlbmRpZgorCiAgICAgdW5wY2tocHMgIG0zLCBtMCwgbTIKICAgICB1bnBja2xwcyAgbTAsIG0yCiAgICAgYWRkcHMgICAgIG0zLCBtMAogICAgIG1vdmhscHMgICBtMiwgbTMKICAgICBhZGRwcyAgICAgbTIsIG0zCiAgICAgbW92bHBzIFtzYW1wbGVzcStjbnQxcV0sIG0yCislZW5kaWYKICVlbmRpZjsgQVJDSAogCiAlaWYgQVJDSF9YODZfNjQKQEAgLTE1NCwxMCArMTYzLDE5IEBACiAlZW5kaWYKICVlbHNlIDsgQVJDSF9YODZfMzIKICVpZiBjcHVmbGFnKGZtYTMpCi0gICAgbXVscHMgICAgIG0wLCBtNSwgW2NvZWZmcStjbnQxcSo4ICAgXQotICAgIG11bHBzICAgICBtMiwgbTUsIFtjb2VmZnErY250MXEqOCszMl0KLSAgICBmbWFkZHBzICAgbTAsIG00LCBtMSwgbTAKLSAgICBmbWFkZHBzICAgbTIsIG00LCBbY29lZmZxK2NudDFxKjgrNDhdLCBtMgorICAgIG11bHBzICAgICBtMCwgbTUsIFtjb2VmZnErY250MXEqOCAgICBdCisgICAgbXVscHMgICAgIG0xLCBtNSwgW2NvZWZmcStjbnQxcSo4KzMyIF0KKyAgICBtdWxwcyAgICAgbTIsIG01LCBbY29lZmZxK2NudDFxKjgrNjQgXQorICAgIG11bHBzICAgICBtMywgbTUsIFtjb2VmZnErY250MXEqOCs5NiBdCisgICAgZm1hZGRwcyAgIG0wLCBtNCwgW2NvZWZmcStjbnQxcSo4KzE2IF0sIG0wCisgICAgZm1hZGRwcyAgIG0xLCBtNCwgW2NvZWZmcStjbnQxcSo4KzQ4IF0sIG0xCisgICAgZm1hZGRwcyAgIG0yLCBtNCwgW2NvZWZmcStjbnQxcSo4KzgwIF0sIG0yCisgICAgZm1hZGRwcyAgIG0zLCBtNCwgW2NvZWZmcStjbnQxcSo4KzExMl0sIG0zCisKKyAgICBoYWRkcHMgICAgbTEsIG0wCisgICAgaGFkZHBzICAgIG0zLCBtMgorICAgIGhhZGRwcyAgICBtMywgbTEKKyAgICBtb3ZhcHMgW3NhbXBsZXNxK2NudDJxXSwgbTMKICVlbHNlCiAgICAgbXVscHMgICAgIG0wLCBtNSwgW2NvZWZmcStjbnQxcSo4ICAgXQogICAgIG11bHBzICAgICBtMSwgbTQsIFtjb2VmZnErY250MXEqOCsxNl0KQEAgLTE2NSwxMyArMTgzLDE0IEBACiAgICAgbXVscHMgICAgIG0zLCBtNCwgW2NvZWZmcStjbnQxcSo4KzQ4XQogICAgIGFkZHBzICAgICBtMCwgbTEKICAgICBhZGRwcyAgICAgbTIsIG0zCi0lZW5kaWYKKwogICAgIHVucGNraHBzICBtMywgbTIsIG0wCiAgICAgdW5wY2tscHMgIG0yLCBtMAogICAgIGFkZHBzICAgICBtMywgbTIKICAgICBtb3ZobHBzICAgbTAsIG0zCiAgICAgYWRkcHMgICAgIG0wLCBtMwogICAgIG1vdmxwcyBbc2FtcGxlc3ErY250MnFdLCBtMAorJWVuZGlmCiAlZW5kaWY7IEFSQ0gKIAogICAgIHN1YiAgICBjbnQyZCwgOCArIEZNQTNfT0ZGU0VUCkBAIC0yMDEsMyArMjIwLDgyIEBACiBJTklUX1hNTSBmbWEzCiBMRkVfRklSMF9GTE9BVAogJWVuZGlmCisKKyVtYWNybyBMRkVfRklSMV9GTE9BVCAwCitjZ2xvYmFsIGxmZV9maXIxX2Zsb2F0LCA0LCA2LCAxMCwgc2FtcGxlcywgbGZlLCBjb2VmZiwgbmJsb2NrcywgY250MSwgY250MgorICAgIHNociBuYmxvY2tzZCwgMgorICAgIHN1YiAgICAgbGZlcSwgMypzaXplb2ZfZmxvYXQKKyAgICBtb3YgICAgY250MWQsIDY0KnNpemVvZl9mbG9hdAorICAgIG1vdiAgICBjbnQyZCwgNjQqc2l6ZW9mX2Zsb2F0LTE2CisgICAgbGVhICAgY29lZmZxLCBbY29lZmZxK2NudDFxKjRdCisgICAgYWRkIHNhbXBsZXNxLCBjbnQxcQorICAgIG5lZyAgICBjbnQxcQorCisubG9vcDoKKyVpZiBjcHVmbGFnKGF2eCkKKyAgICBjdnRkcTJwcyAgbTQsIFtsZmVxXQorICAgIHNodWZwcyAgICBtNSwgbTQsIG00LCBxMDEyMworJWVsaWYgY3B1ZmxhZyhzc2UyKQorICAgIG1vdnUgICAgICBtNCwgW2xmZXFdCisgICAgY3Z0ZHEycHMgIG00LCBtNAorICAgIHBzaHVmZCAgICBtNSwgbTQsIHEwMTIzCislZW5kaWYKKworLmlubmVyX2xvb3A6CisgICAgbW92YXBzICAgIG02LCBbY29lZmZxK2NudDFxKjQgICBdCisgICAgbW92YXBzICAgIG03LCBbY29lZmZxK2NudDFxKjQrMTZdCisgICAgbXVscHMgICAgIG0wLCBtNSwgbTYKKyAgICBtdWxwcyAgICAgbTEsIG01LCBtNworJWlmIEFSQ0hfWDg2XzY0CisgICAgbW92YXBzICAgIG04LCBbY29lZmZxK2NudDFxKjQrMzJdCisgICAgbW92YXBzICAgIG05LCBbY29lZmZxK2NudDFxKjQrNDhdCisgICAgbXVscHMgICAgIG0yLCBtNSwgbTgKKyAgICBtdWxwcyAgICAgbTMsIG01LCBtOQorJWVsc2UKKyAgICBtdWxwcyAgICAgbTIsIG01LCBbY29lZmZxK2NudDFxKjQrMzJdCisgICAgbXVscHMgICAgIG0zLCBtNSwgW2NvZWZmcStjbnQxcSo0KzQ4XQorJWVuZGlmCisKKyAgICBoYWRkcHMgICAgbTAsIG0xCisgICAgaGFkZHBzICAgIG0yLCBtMworICAgIGhhZGRwcyAgICBtMCwgbTIKKyAgICBtb3ZhcHMgW3NhbXBsZXNxK2NudDFxXSwgbTAKKworICAgIG11bHBzICAgICBtNiwgbTQKKyAgICBtdWxwcyAgICAgbTcsIG00CislaWYgQVJDSF9YODZfNjQKKyAgICBtdWxwcyAgICAgbTgsIG00CisgICAgbXVscHMgICAgIG05LCBtNAorCisgICAgaGFkZHBzICAgIG02LCBtNworICAgIGhhZGRwcyAgICBtOCwgbTkKKyAgICBoYWRkcHMgICAgbTYsIG04CislZWxzZQorICAgIG11bHBzICAgICBtMiwgbTQsIFtjb2VmZnErY250MXEqNCszMl0KKyAgICBtdWxwcyAgICAgbTMsIG00LCBbY29lZmZxK2NudDFxKjQrNDhdCisKKyAgICBoYWRkcHMgICAgbTYsIG03CisgICAgaGFkZHBzICAgIG0yLCBtMworICAgIGhhZGRwcyAgICBtNiwgbTIKKyVlbmRpZgorICAgIG1vdmFwcyBbc2FtcGxlc3ErY250MnFdLCBtNgorCisgICAgc3ViICAgIGNudDJkLCAxNgorICAgIGFkZCAgICBjbnQxcSwgMTYKKyAgICBqbCAuaW5uZXJfbG9vcAorCisgICAgYWRkICAgICBsZmVxLCBzaXplb2ZfZmxvYXQKKyAgICBhZGQgc2FtcGxlc3EsIDEyOCpzaXplb2ZfZmxvYXQKKyAgICBtb3YgICAgY250MXEsIC02NCpzaXplb2ZfZmxvYXQKKyAgICBtb3YgICAgY250MmQsICA2NCpzaXplb2ZfZmxvYXQtMTYKKyAgICBzdWIgbmJsb2Nrc2QsIDEKKyAgICBqZyAubG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTMKK0xGRV9GSVIxX0ZMT0FUCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorTEZFX0ZJUjFfRkxPQVQKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvZGNhZHNwX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L2RjYWRzcF9pbml0LmMKaW5kZXggYmZlMTNlNS4uZmMxMGZiOCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvZGNhZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9kY2Fkc3BfaW5pdC5jCkBAIC0yMywxMCArMjMsMTMgQEAKIAogI2RlZmluZSBMRkVfRklSX0ZMT0FUX0ZVTkMob3B0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogdm9pZCBmZl9sZmVfZmlyMF9mbG9hdF8jI29wdChmbG9hdCAqcGNtX3NhbXBsZXMsIGludDMyX3QgKmxmZV9zYW1wbGVzLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmZpbHRlcl9jb2VmZiwgcHRyZGlmZl90IG5wY21ibG9ja3MpOyBcCit2b2lkIGZmX2xmZV9maXIxX2Zsb2F0XyMjb3B0KGZsb2F0ICpwY21fc2FtcGxlcywgaW50MzJfdCAqbGZlX3NhbXBsZXMsICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqZmlsdGVyX2NvZWZmLCBwdHJkaWZmX3QgbnBjbWJsb2Nrcyk7CiAKIExGRV9GSVJfRkxPQVRfRlVOQyhzc2UpCiBMRkVfRklSX0ZMT0FUX0ZVTkMoc3NlMikKK0xGRV9GSVJfRkxPQVRfRlVOQyhzc2UzKQogTEZFX0ZJUl9GTE9BVF9GVU5DKGF2eCkKIExGRV9GSVJfRkxPQVRfRlVOQyhmbWEzKQogCkBAIC0zOCw4ICs0MSwxMiBAQAogICAgICAgICBzLT5sZmVfZmlyX2Zsb2F0WzBdID0gZmZfbGZlX2ZpcjBfZmxvYXRfc3NlOwogICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpCiAgICAgICAgIHMtPmxmZV9maXJfZmxvYXRbMF0gPSBmZl9sZmVfZmlyMF9mbG9hdF9zc2UyOwotICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkKKyAgICBpZiAoRVhURVJOQUxfU1NFMyhjcHVfZmxhZ3MpKQorICAgICAgICBzLT5sZmVfZmlyX2Zsb2F0WzFdID0gZmZfbGZlX2ZpcjFfZmxvYXRfc3NlMzsKKyAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKICAgICAgICAgcy0+bGZlX2Zpcl9mbG9hdFswXSA9IGZmX2xmZV9maXIwX2Zsb2F0X2F2eDsKKyAgICAgICAgcy0+bGZlX2Zpcl9mbG9hdFsxXSA9IGZmX2xmZV9maXIxX2Zsb2F0X2F2eDsKKyAgICB9CiAgICAgaWYgKEVYVEVSTkFMX0ZNQTMoY3B1X2ZsYWdzKSkKICAgICAgICAgcy0+bGZlX2Zpcl9mbG9hdFswXSA9IGZmX2xmZV9maXIwX2Zsb2F0X2ZtYTM7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9kY3QtdGVzdC5jIGIvbGliYXZjb2RlYy94ODYvZGN0LXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlZGUxNi4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL3g4Ni9kY3QtdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSAiZmRjdC5oIgotI2luY2x1ZGUgInh2aWRpZGN0LmgiCi0jaW5jbHVkZSAic2ltcGxlX2lkY3QuaCIKLQotI2lmIChDT05GSUdfUFJPUkVTX0RFQ09ERVIgfHwgQ09ORklHX1BST1JFU19MR1BMX0RFQ09ERVIpICYmIEFSQ0hfWDg2XzY0ICYmIEhBVkVfWUFTTQotdm9pZCBmZl9wcm9yZXNfaWRjdF9wdXRfMTBfc3NlMih1aW50MTZfdCAqZHN0LCBpbnQgbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQxNl90ICpxbWF0KTsKLQotI2RlZmluZSBQUl9XUkFQKElOU04pIFwKLXN0YXRpYyB2b2lkIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF8jI0lOU04jI193cmFwKGludDE2X3QgKmRzdCl7IFwKLSAgICBMT0NBTF9BTElHTkVEKDE2LCBpbnQxNl90LCBxbWF0LCBbNjRdKTsgXAotICAgIExPQ0FMX0FMSUdORUQoMTYsIGludDE2X3QsIHRtcCwgWzY0XSk7IFwKLSAgICBpbnQgaTsgXAotIFwKLSAgICBmb3IoaT0wOyBpPDY0OyBpKyspeyBcCi0gICAgICAgIHFtYXRbaV09NDsgXAotICAgICAgICB0bXBbaV09IGRzdFtpXTsgXAotICAgIH0gXAotICAgIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF8jI0lOU04gKGRzdCwgMTYsIHRtcCwgcW1hdCk7IFwKLSBcCi0gICAgZm9yKGk9MDsgaTw2NDsgaSsrKSB7IFwKLSAgICAgICAgIGRzdFtpXSAtPSA1MTI7IFwKLSAgICB9IFwKLX0KLQotUFJfV1JBUChzc2UyKQotCi0jIGlmIEhBVkVfQVZYX0VYVEVSTkFMCi12b2lkIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF9hdngodWludDE2X3QgKmRzdCwgaW50IGxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQxNl90ICpxbWF0KTsKLVBSX1dSQVAoYXZ4KQotIyBlbmRpZgotCi0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbGdvIGZkY3RfdGFiX2FyY2hbXSA9IHsKLSNpZiBIQVZFX01NWF9JTkxJTkUKLSAgICB7ICJNTVgiLCAgICBmZl9mZGN0X21teCwgICAgRkZfSURDVF9QRVJNX05PTkUsIEFWX0NQVV9GTEFHX01NWCB9LAotI2VuZGlmCi0jaWYgSEFWRV9NTVhFWFRfSU5MSU5FCi0gICAgeyAiTU1YRVhUIiwgZmZfZmRjdF9tbXhleHQsIEZGX0lEQ1RfUEVSTV9OT05FLCBBVl9DUFVfRkxBR19NTVhFWFQgfSwKLSNlbmRpZgotI2lmIEhBVkVfU1NFMl9JTkxJTkUKLSAgICB7ICJTU0UyIiwgICBmZl9mZGN0X3NzZTIsICAgRkZfSURDVF9QRVJNX05PTkUsIEFWX0NQVV9GTEFHX1NTRTIgfSwKLSNlbmRpZgotICAgIHsgMCB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGFsZ28gaWRjdF90YWJfYXJjaFtdID0gewotI2lmIEhBVkVfTU1YX0lOTElORQotICAgIHsgIlNJTVBMRS1NTVgiLCAgZmZfc2ltcGxlX2lkY3RfbW14LCAgRkZfSURDVF9QRVJNX1NJTVBMRSwgQVZfQ1BVX0ZMQUdfTU1YIH0sCi0jZW5kaWYKLSNpZiBDT05GSUdfTVBFRzRfREVDT0RFUiAmJiBIQVZFX1lBU00KLSNpZiBBUkNIX1g4Nl8zMgotICAgIHsgIlhWSUQtTU1YIiwgICAgZmZfeHZpZF9pZGN0X21teCwgICAgRkZfSURDVF9QRVJNX05PTkUsICAgQVZfQ1BVX0ZMQUdfTU1YLCAgICAxIH0sCi0gICAgeyAiWFZJRC1NTVhFWFQiLCBmZl94dmlkX2lkY3RfbW14ZXh0LCBGRl9JRENUX1BFUk1fTk9ORSwgICBBVl9DUFVfRkxBR19NTVhFWFQsIDEgfSwKLSNlbmRpZgotI2lmIEhBVkVfU1NFMl9FWFRFUk5BTAotICAgIHsgIlhWSUQtU1NFMiIsICAgZmZfeHZpZF9pZGN0X3NzZTIsICAgRkZfSURDVF9QRVJNX1NTRTIsICAgQVZfQ1BVX0ZMQUdfU1NFMiwgICAxIH0sCi0jZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfTVBFRzRfREVDT0RFUiAmJiBIQVZFX1lBU00gKi8KLSNpZiAoQ09ORklHX1BST1JFU19ERUNPREVSIHx8IENPTkZJR19QUk9SRVNfTEdQTF9ERUNPREVSKSAmJiBBUkNIX1g4Nl82NCAmJiBIQVZFX1lBU00KLSAgICB7ICJQUi1TU0UyIiwgICAgIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF9zc2UyX3dyYXAsIEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0UsIEFWX0NQVV9GTEFHX1NTRTIsIDEgfSwKLSMgaWYgSEFWRV9BVlhfRVhURVJOQUwKLSAgICB7ICJQUi1BVlgiLCAgICAgIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF9hdnhfd3JhcCwgRkZfSURDVF9QRVJNX1RSQU5TUE9TRSwgQVZfQ1BVX0ZMQUdfQVZYLCAxIH0sCi0jIGVuZGlmCi0jZW5kaWYKLSNpZiBIQVZFX1lBU00KLSNpZiBBUkNIX1g4Nl82NAotI2lmIEhBVkVfU1NFMl9FWFRFUk5BTAotICAgIHsgIlNJTVBMRTEwLVNTRTIiLCAgZmZfc2ltcGxlX2lkY3QxMF9zc2UyLCBGRl9JRENUX1BFUk1fVFJBTlNQT1NFLCBBVl9DUFVfRkxBR19TU0UyfSwKLSAgICB7ICJTSU1QTEUxMi1TU0UyIiwgIGZmX3NpbXBsZV9pZGN0MTJfc3NlMiwgRkZfSURDVF9QRVJNX1RSQU5TUE9TRSwgQVZfQ1BVX0ZMQUdfU1NFMiwgMSB9LAotI2VuZGlmCi0jaWYgSEFWRV9BVlhfRVhURVJOQUwKLSAgICB7ICJTSU1QTEUxMC1BVlgiLCAgIGZmX3NpbXBsZV9pZGN0MTBfYXZ4LCAgRkZfSURDVF9QRVJNX1RSQU5TUE9TRSwgQVZfQ1BVX0ZMQUdfQVZYfSwKLSAgICB7ICJTSU1QTEUxMi1BVlgiLCAgIGZmX3NpbXBsZV9pZGN0MTJfYXZ4LCAgRkZfSURDVF9QRVJNX1RSQU5TUE9TRSwgQVZfQ1BVX0ZMQUdfQVZYLCAgMSB9LAotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotICAgIHsgMCB9Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBpZGN0X3NpbXBsZV9tbXhfcGVybVs2NF0gPSB7Ci0gICAgMHgwMCwgMHgwOCwgMHgwNCwgMHgwOSwgMHgwMSwgMHgwQywgMHgwNSwgMHgwRCwKLSAgICAweDEwLCAweDE4LCAweDE0LCAweDE5LCAweDExLCAweDFDLCAweDE1LCAweDFELAotICAgIDB4MjAsIDB4MjgsIDB4MjQsIDB4MjksIDB4MjEsIDB4MkMsIDB4MjUsIDB4MkQsCi0gICAgMHgxMiwgMHgxQSwgMHgxNiwgMHgxQiwgMHgxMywgMHgxRSwgMHgxNywgMHgxRiwKLSAgICAweDAyLCAweDBBLCAweDA2LCAweDBCLCAweDAzLCAweDBFLCAweDA3LCAweDBGLAotICAgIDB4MzAsIDB4MzgsIDB4MzQsIDB4MzksIDB4MzEsIDB4M0MsIDB4MzUsIDB4M0QsCi0gICAgMHgyMiwgMHgyQSwgMHgyNiwgMHgyQiwgMHgyMywgMHgyRSwgMHgyNywgMHgyRiwKLSAgICAweDMyLCAweDNBLCAweDM2LCAweDNCLCAweDMzLCAweDNFLCAweDM3LCAweDNGLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgaWRjdF9zc2UyX3Jvd19wZXJtWzhdID0geyAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IH07Ci0KLXN0YXRpYyBpbnQgcGVybXV0ZV94ODYoaW50MTZfdCBkc3RbNjRdLCBjb25zdCBpbnQxNl90IHNyY1s2NF0sCi0gICAgICAgICAgICAgICAgICAgICAgIGVudW0gaWRjdF9wZXJtdXRhdGlvbl90eXBlIHBlcm1fdHlwZSkKLXsKLSAgICBpbnQgaTsKLQotICAgIHN3aXRjaCAocGVybV90eXBlKSB7Ci0gICAgY2FzZSBGRl9JRENUX1BFUk1fU0lNUExFOgotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykKLSAgICAgICAgICAgIGRzdFtpZGN0X3NpbXBsZV9tbXhfcGVybVtpXV0gPSBzcmNbaV07Ci0gICAgICAgIHJldHVybiAxOwotICAgIGNhc2UgRkZfSURDVF9QRVJNX1NTRTI6Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKQotICAgICAgICAgICAgZHN0WyhpICYgMHgzOCkgfCBpZGN0X3NzZTJfcm93X3Blcm1baSAmIDddXSA9IHNyY1tpXTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9kY3QzMi5hc20gYi9saWJhdmNvZGVjL3g4Ni9kY3QzMi5hc20KaW5kZXggNGU2NTdiNS4uMjFlMmYyMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvZGN0MzIuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2RjdDMyLmFzbQpAQCAtMjMsNyArMjMsOCBAQAogCiBTRUNUSU9OX1JPREFUQSAzMgogCi1hbGlnbiAzMgorcHNfcDFwMW0xbTE6IGRkIDAsIDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDAsIDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAKKwogcHNfY29zX3ZlYzogZGQgICAwLjUwMDYwMywgIDAuNTA1NDcxLCAgMC41MTU0NDcsICAwLjUzMTA0MwogICAgICAgICAgICAgZGQgICAwLjU1MzEwNCwgIDAuNTgyOTM1LCAgMC42MjI1MDQsICAwLjY3NDgwOAogICAgICAgICAgICAgZGQgLTEwLjE5MDAwOCwgLTMuNDA3NjA5LCAtMi4wNTc3ODEsIC0xLjQ4NDE2NQpAQCAtMzgsOSArMzksNiBAQAogICAgICAgICAgICAgZGQgICAxLjAwMDAwMCwgIDAuNzA3MTA3LCAgMS4wMDAwMDAsIC0wLjcwNzEwNwogICAgICAgICAgICAgZGQgICAwLjcwNzEwNywgIDAuNzA3MTA3LCAgMC43MDcxMDcsICAwLjcwNzEwNwogCi1hbGlnbiAzMgotcHNfcDFwMW0xbTE6IGRkIDAsIDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAsIDAsIDAsIDB4ODAwMDAwMDAsIDB4ODAwMDAwMDAKLQogJW1hY3JvIEJVVFRFUkZMWSA0CiAgICAgc3VicHMgICU0LCAlMSwgJTIKICAgICBhZGRwcyAgJTIsICUyLCAlMQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvZGlyYWNfZHd0LmFzbSBiL2xpYmF2Y29kZWMveDg2L2RpcmFjX2R3dC5hc20KaW5kZXggODk4MDY4OS4uMjJhNWMyYiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvZGlyYWNfZHd0LmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9kaXJhY19kd3QuYXNtCkBAIC0yOSw3ICsyOSw3IEBACiBjZXh0ZXJuIHB3XzgKIGNleHRlcm4gcHdfMTYKIAotc2VjdGlvbiAudGV4dAorU0VDVElPTiAudGV4dAogCiA7ICUxIC09ICglMiArICUzICsgMik+PjIgICAgICU0IGlzIHB3XzIKICVtYWNybyBDT01QT1NFXzUzaUwwIDQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2RpcmFjX2R3dF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9kaXJhY19kd3RfaW5pdC5jCmluZGV4IGFmZGYwYTEuLjQ5YTYzODAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2RpcmFjX2R3dF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvZGlyYWNfZHd0X2luaXQuYwpAQCAtMTMzLDcgKzEzMyw3IEBACiB9XAogXAogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICNpZiAhQVJDSF9YODZfNjQKIENPTVBPU0VfVkVSVElDQUwoX21teCwgNCkKICNlbmRpZgpAQCAtMTYwLDcgKzE2MCw3IEBACiAKIHZvaWQgZmZfc3BhdGlhbF9pZHd0X2luaXRfeDg2KERXVENvbnRleHQgKmQsIGVudW0gZHd0X3R5cGUgdHlwZSkKIHsKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogICBpbnQgbW1fZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKICNpZiAhQVJDSF9YODZfNjQKQEAgLTIyNSw1ICsyMjUsNSBAQAogICAgICAgICBkLT5ob3Jpem9udGFsX2NvbXBvc2UgPSBob3Jpem9udGFsX2NvbXBvc2VfZGQ5N2lfc3NzZTM7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSNlbmRpZiAvLyBIQVZFX1lBU00KKyNlbmRpZiAvLyBIQVZFX1g4NkFTTQogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvZGlyYWNkc3AuYXNtIGIvbGliYXZjb2RlYy94ODYvZGlyYWNkc3AuYXNtCmluZGV4IGEwNDI0MTMuLmNjOGEyNmYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2RpcmFjZHNwLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9kaXJhY2RzcC5hc20KQEAgLTIyLDEzICsyMiwxNSBAQAogCiBTRUNUSU9OX1JPREFUQQogcHdfNzogdGltZXMgOCBkdyA3Citjb252ZXJ0X3RvX3Vuc2lnbmVkXzEwYml0OiB0aW1lcyA0IGRkIDB4MjAwCitjbGlwXzEwYml0OiAgICAgICAgICAgICAgICB0aW1lcyA4IGR3IDB4M2ZmCiAKIGNleHRlcm4gcHdfMwogY2V4dGVybiBwd18xNgogY2V4dGVybiBwd18zMgogY2V4dGVybiBwYl84MAogCi1zZWN0aW9uIC50ZXh0CitTRUNUSU9OIC50ZXh0CiAKICVtYWNybyBVTlBBQ0tfQUREIDYKICAgICBtb3YlNSAgICUxLCAlMwpAQCAtMjYzLDMgKzI2NSw4MyBAQAogSFBFTF9GSUxURVIgc3NlMgogQUREX09CTUMgMzIsIHNzZTIKIEFERF9PQk1DIDE2LCBzc2UyCisKK0lOSVRfWE1NIHNzZTQKKworOyB2b2lkIGRlcXVhbnRfc3ViYmFuZF8zMih1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgaW50IHFmLCBjb25zdCBpbnQgcXMsIGludCB0b3RfdiwgaW50IHRvdF9oKQorY2dsb2JhbCBkZXF1YW50X3N1YmJhbmRfMzIsIDcsIDcsIDQsIHNyYywgZHN0LCBzdHJpZGUsIHFmLCBxcywgdG90X3YsIHRvdF9oCisgICAgbW92ZCAgIG0yLCBxZmQKKyAgICBtb3ZkICAgbTMsIHFzZAorICAgIFNQTEFURCBtMgorICAgIFNQTEFURCBtMworICAgIG1vdiAgICByNCwgdG90X2hxCisgICAgbW92ICAgIHIzLCBkc3RxCisKKyAgICAubG9vcF92OgorICAgIG1vdiAgICB0b3RfaHEsIHI0CisgICAgbW92ICAgIGRzdHEsICAgcjMKKworICAgIC5sb29wX2g6CisgICAgbW92dSAgIG0wLCBbc3JjcV0KKworICAgIHBhYnNkICBtMSwgbTAKKyAgICBwbXVsbGQgbTEsIG0yCisgICAgcGFkZGQgIG0xLCBtMworICAgIHBzcmxkICBtMSwgIDIKKyAgICBwc2lnbmQgbTEsIG0wCisKKyAgICBtb3Z1ICAgW2RzdHFdLCBtMQorCisgICAgYWRkICAgIHNyY3EsIG1tc2l6ZQorICAgIGFkZCAgICBkc3RxLCBtbXNpemUKKyAgICBzdWIgICAgdG90X2hkLCA0CisgICAgamcgICAgIC5sb29wX2gKKworICAgIGFkZCAgICByMywgc3RyaWRlcQorICAgIGRlYyAgICB0b3RfdmQKKyAgICBqZyAgICAgLmxvb3BfdgorCisgICAgUkVUCisKK0lOSVRfWE1NIHNzZTQKKzsgdm9pZCBwdXRfc2lnbmVkX3JlY3RfY2xhbXBlZF8xMCh1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCislaWYgQVJDSF9YODZfNjQKK2NnbG9iYWwgcHV0X3NpZ25lZF9yZWN0X2NsYW1wZWRfMTAsIDYsIDgsIDUsIGRzdCwgZHN0X3N0cmlkZSwgc3JjLCBzcmNfc3RyaWRlLCB3LCBoLCB0MSwgdDIKKyVlbHNlCitjZ2xvYmFsIHB1dF9zaWduZWRfcmVjdF9jbGFtcGVkXzEwLCA1LCA3LCA1LCBkc3QsIGRzdF9zdHJpZGUsIHNyYywgc3JjX3N0cmlkZSwgdywgdDEsIHQyCisgICAgJWRlZmluZSAgaGQgIHI1bXAKKyVlbmRpZgorICAgIHNobCAgICAgIHdkLCAyCisgICAgYWRkICAgIHNyY3EsIHdxCisgICAgbmVnICAgICAgd3EKKyAgICBtb3YgICAgIHQycSwgZHN0cQorICAgIG1vdiAgICAgdDFxLCB3cQorICAgIHB4b3IgICAgIG0yLCBtMgorICAgIG1vdmEgICAgIG0zLCBbY2xpcF8xMGJpdF0KKyAgICBtb3ZhICAgICBtNCwgW2NvbnZlcnRfdG9fdW5zaWduZWRfMTBiaXRdCisKKyAgICAubG9vcF9oOgorICAgIG1vdiAgICBkc3RxLCB0MnEKKyAgICBtb3YgICAgICB3cSwgdDFxCisKKyAgICAubG9vcF93OgorICAgIG1vdnUgICAgIG0wLCBbc3JjcSt3cSswKm1tc2l6ZV0KKyAgICBtb3Z1ICAgICBtMSwgW3NyY3Erd3ErMSptbXNpemVdCisKKyAgICBwYWRkZCAgICBtMCwgbTQKKyAgICBwYWRkZCAgICBtMSwgbTQKKyAgICBwYWNrdXNkdyBtMCwgbTAsIG0xCisgICAgQ0xJUFcgICAgbTAsIG0yLCBtMyA7IHBhY2t1c2R3IHNhdHVyYXRlcyBzbyBpdCdzIGZpbmUKKworICAgIG1vdnUgICAgIFtkc3RxXSwgbTAKKworICAgIGFkZCAgICAgIGRzdHEsIDEqbW1zaXplCisgICAgYWRkICAgICAgd3EsICAgMiptbXNpemUKKyAgICBqbCAgICAgICAubG9vcF93CisKKyAgICBhZGQgICAgc3JjcSwgc3JjX3N0cmlkZXEKKyAgICBhZGQgICAgIHQycSwgZHN0X3N0cmlkZXEKKyAgICBzdWIgICAgICBoZCwgMQorICAgIGpnICAgICAgIC5sb29wX2gKKworICAgIFJFVApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvZGlyYWNkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvZGlyYWNkc3BfaW5pdC5jCmluZGV4IDVmYWU3OTguLjhjYjg0ZWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2RpcmFjZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9kaXJhY2RzcF9pbml0LmMKQEAgLTQ1LDggKzQ1LDExIEBACiB2b2lkIGZmX3B1dF9yZWN0X2NsYW1wZWRfc3NlMih1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLCBjb25zdCBpbnQxNl90ICpzcmMsIGludCBzcmNfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwogdm9pZCBmZl9wdXRfc2lnbmVkX3JlY3RfY2xhbXBlZF9tbXgodWludDhfdCAqZHN0LCBpbnQgZHN0X3N0cmlkZSwgY29uc3QgaW50MTZfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIHZvaWQgZmZfcHV0X3NpZ25lZF9yZWN0X2NsYW1wZWRfc3NlMih1aW50OF90ICpkc3QsIGludCBkc3Rfc3RyaWRlLCBjb25zdCBpbnQxNl90ICpzcmMsIGludCBzcmNfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwordm9pZCBmZl9wdXRfc2lnbmVkX3JlY3RfY2xhbXBlZF8xMF9zc2U0KHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKLSNpZiBIQVZFX1lBU00KK3ZvaWQgZmZfZGVxdWFudF9zdWJiYW5kXzMyX3NzZTQodWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IGludCBxZiwgY29uc3QgaW50IHFzLCBpbnQgdG90X3YsIGludCB0b3RfaCk7CisKKyNpZiBIQVZFX1g4NkFTTQogCiAjZGVmaW5lIEhQRUxfRklMVEVSKE1NU0laRSwgRVhUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgdm9pZCBmZl9kaXJhY19ocGVsX2ZpbHRlcl92XyAjIyBFWFQodWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIGludCwgaW50KTsgICAgICAgICAgICAgICBcCkBAIC0xMzUsNyArMTM4LDcgQEAKICAgICB9CiB9CiAKLSNlbHNlIC8vIEhBVkVfWUFTTQorI2Vsc2UgLy8gSEFWRV9YODZBU00KIAogI2RlZmluZSBIUEVMX0ZJTFRFUihNTVNJWkUsIEVYVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB2b2lkIGRpcmFjX2hwZWxfZmlsdGVyXyAjIyBFWFQodWludDhfdCAqZHN0aCwgdWludDhfdCAqZHN0diwgdWludDhfdCAqZHN0YywgICAgICAgICAgICAgIFwKQEAgLTE0Myw3ICsxNDYsNyBAQAogCiAjZGVmaW5lIFBJWEZVTkMoUEZYLCBJRFgsIEVYVCkgZG8ge30gd2hpbGUgKDApCiAKLSNlbmRpZiAvLyBIQVZFX1lBU00KKyNlbmRpZiAvLyBIQVZFX1g4NkFTTQogCiAjaWYgIUFSQ0hfWDg2XzY0CiBIUEVMX0ZJTFRFUig4LCBtbXgpCkBAIC0xODQsNCArMTg3LDkgQEAKICAgICAgICAgYy0+cHV0X2RpcmFjX3BpeGVsc190YWJbMl1bMF0gPSBmZl9wdXRfZGlyYWNfcGl4ZWxzMzJfc3NlMjsKICAgICAgICAgYy0+YXZnX2RpcmFjX3BpeGVsc190YWJbMl1bMF0gPSBmZl9hdmdfZGlyYWNfcGl4ZWxzMzJfc3NlMjsKICAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFNChtbV9mbGFncykpIHsKKyAgICAgICAgYy0+ZGVxdWFudF9zdWJiYW5kWzFdICAgICAgICAgPSBmZl9kZXF1YW50X3N1YmJhbmRfMzJfc3NlNDsKKyAgICAgICAgYy0+cHV0X3NpZ25lZF9yZWN0X2NsYW1wZWRbMV0gPSBmZl9wdXRfc2lnbmVkX3JlY3RfY2xhbXBlZF8xMF9zc2U0OworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2RueGhkZW5jLmFzbSBiL2xpYmF2Y29kZWMveDg2L2RueGhkZW5jLmFzbQppbmRleCA5ZGQ2ZDUxLi5iNGY3NTk1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9kbnhoZGVuYy5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvZG54aGRlbmMuYXNtCkBAIC0yMiw3ICsyMiw3IEBACiAKICVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgogCi1zZWN0aW9uIC50ZXh0CitTRUNUSU9OIC50ZXh0CiAKIDsgdm9pZCBnZXRfcGl4ZWxzXzh4NF9zeW1fc3NlMihpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9leHJkc3AuYXNtIGIvbGliYXZjb2RlYy94ODYvZXhyZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmYyNDBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy94ODYvZXhyZHNwLmFzbQpAQCAtMCwwICsxLDExOCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogWDg2IE9wdGltaXplZCBmdW5jdGlvbnMgZm9yIE9wZW4gRXhyIERlY29kZXIKKzsqIENvcHlyaWdodCAoYykgMjAwNiBJbmR1c3RyaWFsIExpZ2h0ICYgTWFnaWMsIGEgZGl2aXNpb24gb2YgTHVjYXMgRGlnaXRhbCBMdGQuIExMQworOyoKKzsqIHJlb3JkZXJfcGl4ZWxzLCBwcmVkaWN0b3IgYmFzZWQgb24gcGF0Y2ggYnkgSm9obiBMb3kKKzsqIHBvcnQgdG8gQVNNIGJ5IEpva3lvIEltYWdlcyBzdXBwb3J0IGJ5IENOQyAtIEZyZW5jaCBOYXRpb25hbCBDZW50ZXIgZm9yIENpbmVtYQorOyoKKzsqIHByZWRpY3RvciBBVlgvQVZYMiBieSBIZW5yaWsgR3JhbW5lcgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK2NleHRlcm4gcGJfMTUKK2NleHRlcm4gcGJfODAKKworU0VDVElPTiAudGV4dAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfcmVvcmRlcl9waXhlbHModWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzaXplKTsKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIFJFT1JERVJfUElYRUxTIDAKK2NnbG9iYWwgcmVvcmRlcl9waXhlbHMsIDMsNCwzLCBkc3QsIHNyYzEsIHNpemUsIHNyYzIKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMycSwgW3NyYzFxK3NpemVxXSA7IHNyYzIgPSBzcmMgKyAyICogaGFsZl9zaXplCisgICAgYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHEsIHNpemVxICAgICAgICAgOyBkc3Qgb2Zmc2V0IGJ5IHNpemUKKyAgICBzaHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplcSwgMSAgICAgICAgICAgICA7IGhhbGZfc2l6ZQorICAgIGFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFxLCBzaXplcSAgICAgICAgIDsgb2Zmc2V0IHNyYyBieSBoYWxmX3NpemUKKyAgICBuZWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplcSAgICAgICAgICAgICAgICA7IHNpemUgPSBvZmZzZXQgZm9yIGRzdCwgc3JjMSwgc3JjMgorLmxvb3A6CisKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtMCwgW3NyYzFxK3NpemVxXSAgICAgICAgOyBsb2FkIGZpcnN0IHBhcnQKKyAgICBtb3Z1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtMSwgW3NyYzJxK3NpemVxXSAgICAgICAgOyBsb2FkIHNlY29uZCBwYXJ0CisgICAgU0JVVFRFUkZMWSBidywgMCwgMSwgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgaW50ZXJsZWF2ZWQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBbZHN0cSsyKnNpemVxICAgXSwgeG0wICAgICAgICAgICAgICAgICAgOyBjb3B5IHRvIGRzdAorICAgIG1vdmEgICAgICAgICAgICAgICAgIFtkc3RxKzIqc2l6ZXErMTZdLCB4bTEKKyVpZiBjcHVmbGFnKGF2eDIpCisgICAgdnBlcm0yaTEyOCAgICAgICAgICAgICAgICAgICAgICAgICAgbTAsIG0wLCBtMSwgcTAzMDEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBbZHN0cSsyKnNpemVxKzMyXSwgbTAKKyVlbmRpZgorICAgIGFkZCAgICAgc2l6ZXEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUkVPUkRFUl9QSVhFTFMKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorUkVPUkRFUl9QSVhFTFMKKyVlbmRpZgorCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgdm9pZCBmZl9wcmVkaWN0b3IodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc2l6ZSk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBQUkVESUNUT1IgMAorY2dsb2JhbCBwcmVkaWN0b3IsIDIsMiw1LCBzcmMsIHNpemUKKyAgICBtb3ZhICAgICAgICAgICAgIG0wLCBbcGJfODBdCisgICAgbW92YSAgICAgICAgICAgIHhtMSwgW3BiXzE1XQorICAgIG1vdmEgICAgICAgICAgICB4bTIsIHhtMAorICAgIGFkZCAgICAgICAgICAgIHNyY3EsIHNpemVxCisgICAgbmVnICAgICAgICAgICBzaXplcQorLmxvb3A6CisgICAgcHhvciAgICAgICAgICAgICBtMywgbTAsIFtzcmNxICsgc2l6ZXFdCisgICAgcHNsbGRxICAgICAgICAgICBtNCwgbTMsIDEKKyAgICBwYWRkYiAgICAgICAgICAgIG0zLCBtNAorICAgIHBzbGxkcSAgICAgICAgICAgbTQsIG0zLCAyCisgICAgcGFkZGIgICAgICAgICAgICBtMywgbTQKKyAgICBwc2xsZHEgICAgICAgICAgIG00LCBtMywgNAorICAgIHBhZGRiICAgICAgICAgICAgbTMsIG00CisgICAgcHNsbGRxICAgICAgICAgICBtNCwgbTMsIDgKKyVpZiBtbXNpemUgPT0gMzIKKyAgICBwYWRkYiAgICAgICAgICAgIG0zLCBtNAorICAgIHBhZGRiICAgICAgICAgICB4bTIsIHhtMworICAgIHZleHRyYWN0aTEyOCAgICB4bTQsIG0zLCAxCisgICAgbW92YSBbc3JjcSArIHNpemVxXSwgeG0yCisgICAgcHNodWZiICAgICAgICAgIHhtMiwgeG0xCisgICAgcGFkZGIgICAgICAgICAgIHhtMiwgeG00CisgICAgbW92YSBbc3JjcSArIHNpemVxICsgMTZdLCB4bTIKKyVlbHNlCisgICAgcGFkZGIgICAgICAgICAgICBtMiwgbTMKKyAgICBwYWRkYiAgICAgICAgICAgIG0yLCBtNAorICAgIG1vdmEgW3NyY3EgKyBzaXplcV0sIG0yCislZW5kaWYKKyAgICBwc2h1ZmIgICAgICAgICAgeG0yLCB4bTEKKyAgICBhZGQgICAgICAgICAgIHNpemVxLCBtbXNpemUKKyAgICBqbCAubG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzc2UzCitQUkVESUNUT1IKKworSU5JVF9YTU0gYXZ4CitQUkVESUNUT1IKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorUFJFRElDVE9SCislZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2V4cmRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9leHJkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjM0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni9leHJkc3BfaW5pdC5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBPcGVuRVhSICguZXhyKSBpbWFnZSBkZWNvZGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9leHJkc3AuaCIKKwordm9pZCBmZl9yZW9yZGVyX3BpeGVsc19zc2UyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc2l6ZSk7CisKK3ZvaWQgZmZfcmVvcmRlcl9waXhlbHNfYXZ4Mih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNpemUpOworCit2b2lkIGZmX3ByZWRpY3Rvcl9zc3NlMyh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzaXplKTsKKwordm9pZCBmZl9wcmVkaWN0b3JfYXZ4KHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNpemUpOworCit2b2lkIGZmX3ByZWRpY3Rvcl9hdngyKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNpemUpOworCithdl9jb2xkIHZvaWQgZmZfZXhyZHNwX2luaXRfeDg2KEV4ckRTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBkc3AtPnJlb3JkZXJfcGl4ZWxzID0gZmZfcmVvcmRlcl9waXhlbHNfc3NlMjsKKyAgICB9CisgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpIHsKKyAgICAgICAgZHNwLT5wcmVkaWN0b3IgPSBmZl9wcmVkaWN0b3Jfc3NzZTM7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkgeworICAgICAgICBkc3AtPnByZWRpY3RvciA9IGZmX3ByZWRpY3Rvcl9hdng7CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkgeworICAgICAgICBkc3AtPnJlb3JkZXJfcGl4ZWxzID0gZmZfcmVvcmRlcl9waXhlbHNfYXZ4MjsKKyAgICAgICAgZHNwLT5wcmVkaWN0b3IgICAgICA9IGZmX3ByZWRpY3Rvcl9hdngyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2ZmdC5hc20gYi9saWJhdmNvZGVjL3g4Ni9mZnQuYXNtCmluZGV4IDIyZDk4NjYuLmE2NzFlOGYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2ZmdC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvZmZ0LmFzbQpAQCAtNzMsNyArNzMsNyBAQAogY2V4dGVybiBwc19uZWcKIAogJWFzc2lnbiBpIDE2Ci0lcmVwIDEzCislcmVwIDE0CiBjZXh0ZXJuIGNvc18gJSsgaQogJWFzc2lnbiBpIGk8PDEKICVlbmRyZXAKQEAgLTE5MSw2ICsxOTEsMjMgQEAKICAgICBhZGRwcyAgICAlMiwgJTIsICU1ICAgICAgIDsge2kwLGkxLGkyLGkzfQogJWVuZG1hY3JvCiAKKyVtYWNybyBJTlRFUkwgNQorJWlmIGNwdWZsYWcoYXZ4KQorICAgIHZ1bnBja2hwcyAgICAgICUzLCAlMiwgJTEKKyAgICB2dW5wY2tscHMgICAgICAlMiwgJTIsICUxCisgICAgdmV4dHJhY3RmMTI4ICAgJTQoJTUpLCAlMiwgMAorICAgIHZleHRyYWN0ZjEyOCAgJTQgJSsgSCglNSksICUzLCAwCisgICAgdmV4dHJhY3RmMTI4ICAgJTQoJTUgKyAxKSwgJTIsIDEKKyAgICB2ZXh0cmFjdGYxMjggICU0ICUrIEgoJTUgKyAxKSwgJTMsIDEKKyVlbGlmIGNwdWZsYWcoc3NlKSB8fCBjcHVmbGFnKDNkbm93KQorICAgIG1vdmEgICAgICUzLCAlMgorICAgIHVucGNrbHBzICUyLCAlMQorICAgIHVucGNraHBzICUzLCAlMQorICAgIG1vdmEgICU0KCU1KSwgJTIKKyAgICBtb3ZhICAlNCglNSsxKSwgJTMKKyVlbmRpZgorJWVuZG1hY3JvCisKIDsgc2NoZWR1bGVkIGZvciBjcHUtYm91bmQgc2l6ZXMKICVtYWNybyBQQVNTX1NNQUxMIDMgOyAodG8gbG9hZCBtNC1tNyksIHdyZSwgd2ltCiBJRiUxIG1vdmEgICAgbTQsIFooNCkKQEAgLTU0MSwxNyArNTU4LDYgQEAKIElOSVRfWU1NIGF2eAogCiAlaWYgSEFWRV9BVlhfRVhURVJOQUwKLSVtYWNybyBJTlRFUkxfQVZYIDUKLSAgICB2dW5wY2tocHMgICAgICAlMywgJTIsICUxCi0gICAgdnVucGNrbHBzICAgICAgJTIsICUyLCAlMQotICAgIHZleHRyYWN0ZjEyOCAgICU0KCU1KSwgJTIsIDAKLSAgICB2ZXh0cmFjdGYxMjggICU0ICUrIEgoJTUpLCAlMywgMAotICAgIHZleHRyYWN0ZjEyOCAgICU0KCU1ICsgMSksICUyLCAxCi0gICAgdmV4dHJhY3RmMTI4ICAlNCAlKyBIKCU1ICsgMSksICUzLCAxCi0lZW5kbWFjcm8KLQotJWRlZmluZSBJTlRFUkwgSU5URVJMX0FWWAotCiBERUNMX1BBU1MgcGFzc19hdngsIFBBU1NfQklHIDEKIERFQ0xfUEFTUyBwYXNzX2ludGVybGVhdmVfYXZ4LCBQQVNTX0JJRyAwCiAKQEAgLTU2NiwxNiArNTcyLDYgQEAKIAogSU5JVF9YTU0gc3NlCiAKLSVtYWNybyBJTlRFUkxfU1NFIDUKLSAgICBtb3ZhICAgICAlMywgJTIKLSAgICB1bnBja2xwcyAlMiwgJTEKLSAgICB1bnBja2hwcyAlMywgJTEKLSAgICBtb3ZhICAlNCglNSksICUyCi0gICAgbW92YSAgJTQoJTUrMSksICUzCi0lZW5kbWFjcm8KLQotJWRlZmluZSBJTlRFUkwgSU5URVJMX1NTRQotCiBERUNMX1BBU1MgcGFzc19zc2UsIFBBU1NfQklHIDEKIERFQ0xfUEFTUyBwYXNzX2ludGVybGVhdmVfc3NlLCBQQVNTX0JJRyAwCiAKQEAgLTc1Niw3ICs3NTIsNyBAQAogJWVuZGlmCiAKICVhc3NpZ24gbiAxPDwlMQotJXJlcCAxNy0lMQorJXJlcCAxOC0lMQogJWFzc2lnbiBuMiBuLzIKICVhc3NpZ24gbjQgbi80CiAleGRlZmluZSBsaXN0X29mX2ZmdCBsaXN0X29mX2ZmdCwgZmZ0ICUrIG4gJSsgZnVsbHN1ZmZpeCBTRUNUSU9OX1JFTApAQCAtODYxLDE2ICs4NTcsMzAgQEAKICVlbmRtYWNybwogCiAlbWFjcm8gQ01VTCA2IDtqLCB4bW0wLCB4bW0xLCAzLCA0LCA1CislaWYgY3B1ZmxhZyhzc2UpCiAgICAgbXVscHMgICAgICBtNiwgJTMsIFslNSslMV0KICAgICBtdWxwcyAgICAgIG03LCAlMiwgWyU1KyUxXQogICAgIG11bHBzICAgICAgJTIsICUyLCBbJTYrJTFdCiAgICAgbXVscHMgICAgICAlMywgJTMsIFslNislMV0KICAgICBzdWJwcyAgICAgICUyLCAlMiwgbTYKICAgICBhZGRwcyAgICAgICUzLCAlMywgbTcKKyVlbGlmIGNwdWZsYWcoM2Rub3cpCisgICAgbW92YSAgICAgICBtNiwgWyUxKyUyKjJdCisgICAgbW92YSAgICAgICAlMywgWyUxKyUyKjIrOF0KKyAgICBtb3ZhICAgICAgICU0LCBtNgorICAgIG1vdmEgICAgICAgbTcsICUzCisgICAgcGZtdWwgICAgICBtNiwgWyU1KyUyXQorICAgIHBmbXVsICAgICAgJTMsIFslNislMl0KKyAgICBwZm11bCAgICAgICU0LCBbJTYrJTJdCisgICAgcGZtdWwgICAgICBtNywgWyU1KyUyXQorICAgIHBmc3ViICAgICAgJTMsIG02CisgICAgcGZhZGQgICAgICAlNCwgbTcKKyVlbmRpZgogJWVuZG1hY3JvCiAKLSVtYWNybyBQT1NST1RBVEVTSFVGX0FWWCA1IDtqLCBrLCB6K244LCB0Y29zK244LCB0c2luK244CislbWFjcm8gUE9TUk9UQVRFU0hVRiA1IDtqLCBrLCB6K244LCB0Y29zK244LCB0c2luK244CiAucG9zdDoKKyVpZiBjcHVmbGFnKGF2eCkKICAgICB2bW92YXBzICAgICAgeW1tMSwgICBbJTMrJTEqMl0KICAgICB2bW92YXBzICAgICAgeW1tMCwgICBbJTMrJTEqMisweDIwXQogICAgIHZtb3ZhcHMgICAgICB5bW0zLCAgIFslMyslMioyXQpAQCAtODk5LDEwICs5MDksNyBAQAogICAgIHN1YiAgICAgICUyLCAgIDB4MjAKICAgICBhZGQgICAgICAlMSwgICAweDIwCiAgICAgamwgICAgICAgLnBvc3QKLSVlbmRtYWNybwotCi0lbWFjcm8gUE9TUk9UQVRFU0hVRiA1IDtqLCBrLCB6K244LCB0Y29zK244LCB0c2luK244Ci0ucG9zdDoKKyVlbGlmIGNwdWZsYWcoc3NlKQogICAgIG1vdmFwcyAgIHhtbTEsIFslMyslMSoyXQogICAgIG1vdmFwcyAgIHhtbTAsIFslMyslMSoyKzB4MTBdCiAgICAgQ01VTCAgICAgJTEsICAgeG1tMCwgeG1tMSwgJTMsICU0LCAlNQpAQCAtOTI0LDI1ICs5MzEsOSBAQAogICAgIHN1YiAgICAgICUyLCAgIDB4MTAKICAgICBhZGQgICAgICAlMSwgICAweDEwCiAgICAgamwgICAgICAgLnBvc3QKLSVlbmRtYWNybwotCi0lbWFjcm8gQ01VTF8zRE5PVyA2Ci0gICAgbW92YSAgICAgICBtNiwgWyUxKyUyKjJdCi0gICAgbW92YSAgICAgICAlMywgWyUxKyUyKjIrOF0KLSAgICBtb3ZhICAgICAgICU0LCBtNgotICAgIG1vdmEgICAgICAgbTcsICUzCi0gICAgcGZtdWwgICAgICBtNiwgWyU1KyUyXQotICAgIHBmbXVsICAgICAgJTMsIFslNislMl0KLSAgICBwZm11bCAgICAgICU0LCBbJTYrJTJdCi0gICAgcGZtdWwgICAgICBtNywgWyU1KyUyXQotICAgIHBmc3ViICAgICAgJTMsIG02Ci0gICAgcGZhZGQgICAgICAlNCwgbTcKLSVlbmRtYWNybwotCi0lbWFjcm8gUE9TUk9UQVRFU0hVRl8zRE5PVyA1IDtqLCBrLCB6K244LCB0Y29zK244LCB0c2luK244Ci0ucG9zdDoKLSAgICBDTVVMXzNETk9XICUzLCAlMSwgbTAsIG0xLCAlNCwgJTUKLSAgICBDTVVMXzNETk9XICUzLCAlMiwgbTIsIG0zLCAlNCwgJTUKKyVlbGlmIGNwdWZsYWcoM2Rub3cpCisgICAgQ01VTCAgJTMsICUxLCBtMCwgbTEsICU0LCAlNQorICAgIENNVUwgICUzLCAlMiwgbTIsIG0zLCAlNCwgJTUKICAgICBtb3ZkICBbJTMrJTEqMisgMF0sIG0wCiAgICAgbW92ZCAgWyUzKyUyKjIrMTJdLCBtMQogICAgIG1vdmQgIFslMyslMioyKyAwXSwgbTIKQEAgLTk1OCw5ICs5NDksMTAgQEAKICAgICBzdWIgICAgICAgICUyLCA4CiAgICAgYWRkICAgICAgICAlMSwgOAogICAgIGpsICAgICAgICAgLnBvc3QKKyVlbmRpZgogJWVuZG1hY3JvCiAKLSVtYWNybyBERUNMX0lNRENUIDEKKyVtYWNybyBERUNMX0lNRENUIDAKIGNnbG9iYWwgaW1kY3RfaGFsZiwgMywxMiw4OyBGRlRDb250ZXh0ICpzLCBGRlRTYW1wbGUgKm91dHB1dCwgY29uc3QgRkZUU2FtcGxlICppbnB1dAogJWlmIEFSQ0hfWDg2XzY0CiAlZGVmaW5lIHJyZXZ0YWIgcjcKQEAgLTEwNjYsNyArMTA1OCw3IEBACiAgICAgbmVnICByMAogICAgIG1vdiAgcjEsIC1tbXNpemUKICAgICBzdWIgIHIxLCByMAotICAgICUxIHIwLCByMSwgcjYsIHJ0Y29zLCBydHNpbgorICAgIFBPU1JPVEFURVNIVUYgcjAsIHIxLCByNiwgcnRjb3MsIHJ0c2luCiAlaWYgQVJDSF9YODZfNjQgPT0gMAogICAgIGFkZCBlc3AsIDEyCiAlZW5kaWYKQEAgLTEwNzYsMTggKzEwNjgsMTggQEAKICAgICBSRVQKICVlbmRtYWNybwogCi1ERUNMX0lNRENUIFBPU1JPVEFURVNIVUYKK0RFQ0xfSU1EQ1QKIAogJWlmIEFSQ0hfWDg2XzMyCiBJTklUX01NWCAzZG5vdwotREVDTF9JTURDVCBQT1NST1RBVEVTSFVGXzNETk9XCitERUNMX0lNRENUCiAKIElOSVRfTU1YIDNkbm93ZXh0Ci1ERUNMX0lNRENUIFBPU1JPVEFURVNIVUZfM0ROT1cKK0RFQ0xfSU1EQ1QKICVlbmRpZgogCiBJTklUX1lNTSBhdngKIAogJWlmIEhBVkVfQVZYX0VYVEVSTkFMCi1ERUNMX0lNRENUIFBPU1JPVEFURVNIVUZfQVZYCitERUNMX0lNRENUCiAlZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2ZmdF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9mZnRfaW5pdC5jCmluZGV4IDUwODVmMTEuLjkyOGYxZGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2ZmdF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvZmZ0X2luaXQuYwpAQCAtMTcsMzkgKzE3LDQzIEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKwogI2luY2x1ZGUgImZmdC5oIgogCiBhdl9jb2xkIHZvaWQgZmZfZmZ0X2luaXRfeDg2KEZGVENvbnRleHQgKnMpCiB7CiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKIAorICAgIGlmIChzLT5uYml0cyA+IDE2KQorICAgICAgICByZXR1cm47CisKICNpZiBBUkNIX1g4Nl8zMgogICAgIGlmIChFWFRFUk5BTF9BTUQzRE5PVyhjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIC8qIDNETm93ISBmb3IgSzYtMi8zICovCiAgICAgICAgIHMtPmltZGN0X2NhbGMgPSBmZl9pbWRjdF9jYWxjXzNkbm93OwogICAgICAgICBzLT5pbWRjdF9oYWxmID0gZmZfaW1kY3RfaGFsZl8zZG5vdzsKICAgICAgICAgcy0+ZmZ0X2NhbGMgICA9IGZmX2ZmdF9jYWxjXzNkbm93OwogICAgIH0KKwogICAgIGlmIChFWFRFUk5BTF9BTUQzRE5PV0VYVChjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIC8qIDNETm93RXggZm9yIEs3ICovCiAgICAgICAgIHMtPmltZGN0X2NhbGMgPSBmZl9pbWRjdF9jYWxjXzNkbm93ZXh0OwogICAgICAgICBzLT5pbWRjdF9oYWxmID0gZmZfaW1kY3RfaGFsZl8zZG5vd2V4dDsKICAgICAgICAgcy0+ZmZ0X2NhbGMgICA9IGZmX2ZmdF9jYWxjXzNkbm93ZXh0OwogICAgIH0KLSNlbmRpZgorI2VuZGlmIC8qIEFSQ0hfWDg2XzMyICovCisKICAgICBpZiAoRVhURVJOQUxfU1NFKGNwdV9mbGFncykpIHsKLSAgICAgICAgLyogU1NFIGZvciBQMy9QNC9LOCAqLwogICAgICAgICBzLT5pbWRjdF9jYWxjICA9IGZmX2ltZGN0X2NhbGNfc3NlOwogICAgICAgICBzLT5pbWRjdF9oYWxmICA9IGZmX2ltZGN0X2hhbGZfc3NlOwogICAgICAgICBzLT5mZnRfcGVybXV0ZSA9IGZmX2ZmdF9wZXJtdXRlX3NzZTsKICAgICAgICAgcy0+ZmZ0X2NhbGMgICAgPSBmZl9mZnRfY2FsY19zc2U7CiAgICAgICAgIHMtPmZmdF9wZXJtdXRhdGlvbiA9IEZGX0ZGVF9QRVJNX1NXQVBfTFNCUzsKICAgICB9CisKICAgICBpZiAoRVhURVJOQUxfQVZYX0ZBU1QoY3B1X2ZsYWdzKSAmJiBzLT5uYml0cyA+PSA1KSB7Ci0gICAgICAgIC8qIEFWWCBmb3IgU0IgKi8KICAgICAgICAgcy0+aW1kY3RfaGFsZiAgICAgID0gZmZfaW1kY3RfaGFsZl9hdng7CiAgICAgICAgIHMtPmZmdF9jYWxjICAgICAgICA9IGZmX2ZmdF9jYWxjX2F2eDsKICAgICAgICAgcy0+ZmZ0X3Blcm11dGF0aW9uID0gRkZfRkZUX1BFUk1fQVZYOwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvZmxhY2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9mbGFjZHNwX2luaXQuYwppbmRleCBlMjhjNWM5Li4xOTcxZjgxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9mbGFjZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9mbGFjZHNwX2luaXQuYwpAQCAtNTMsNyArNTMsNyBAQAogYXZfY29sZCB2b2lkIGZmX2ZsYWNkc3BfaW5pdF94ODYoRkxBQ0RTUENvbnRleHQgKmMsIGVudW0gQVZTYW1wbGVGb3JtYXQgZm10LCBpbnQgY2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBzKQogewotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKIAogI2lmIENPTkZJR19GTEFDX0RFQ09ERVIKQEAgLTExMSw1ICsxMTEsNSBAQAogICAgICAgICAgICAgYy0+bHBjMTZfZW5jb2RlID0gZmZfZmxhY19lbmNfbHBjXzE2X3NzZTQ7CiAgICAgfQogI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2ZtdGNvbnZlcnRfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvZm10Y29udmVydF9pbml0LmMKaW5kZXggZTRjYmFkYy4uZGYwOTcwNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvZm10Y29udmVydF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvZm10Y29udmVydF9pbml0LmMKQEAgLTI0LDExICsyNCwxMCBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvZm10Y29udmVydC5oIgogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KIAogdm9pZCBmZl9pbnQzMl90b19mbG9hdF9mbXVsX3NjYWxhcl9zc2UgKGZsb2F0ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywgZmxvYXQgbXVsLCBpbnQgbGVuKTsKIHZvaWQgZmZfaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfc3NlMihmbG9hdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMsIGZsb2F0IG11bCwgaW50IGxlbik7CkBAIC0zNywxMSArMzYsMTEgQEAKIHZvaWQgZmZfaW50MzJfdG9fZmxvYXRfZm11bF9hcnJheThfc3NlMihGbXRDb252ZXJ0Q29udGV4dCAqYywgZmxvYXQgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICptdWwsIGludCBsZW4pOwogCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIAogYXZfY29sZCB2b2lkIGZmX2ZtdF9jb252ZXJ0X2luaXRfeDg2KEZtdENvbnZlcnRDb250ZXh0ICpjLCBBVkNvZGVjQ29udGV4dCAqYXZjdHgpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX1NTRShjcHVfZmxhZ3MpKSB7CkBAIC01Miw1ICs1MSw1IEBACiAgICAgICAgIGMtPmludDMyX3RvX2Zsb2F0X2ZtdWxfc2NhbGFyID0gZmZfaW50MzJfdG9fZmxvYXRfZm11bF9zY2FsYXJfc3NlMjsKICAgICAgICAgYy0+aW50MzJfdG9fZmxvYXRfZm11bF9hcnJheTggPSBmZl9pbnQzMl90b19mbG9hdF9mbXVsX2FycmF5OF9zc2UyOwogICAgIH0KLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvZnBlbC5hc20gYi9saWJhdmNvZGVjL3g4Ni9mcGVsLmFzbQppbmRleCAwZTNiNDQ0Li45NjFhMTU4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9mcGVsLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9mcGVsLmFzbQpAQCAtNDgsNyArNDgsNiBAQAogJWRlZmluZSBMRU4gICUyCiAlZW5kaWYKIGNnbG9iYWwgJTFfcGl4ZWxzJTIsIDQsNSw0Ci0gICAgbW92c3hkaWZuaWRuIHIyLCByMmQKICAgICBsZWEgICAgICAgICAgcjQsIFtyMiozXQogJWlmaWRuICUxLCBhdmcKICVpZiBub3RjcHVmbGFnKG1teGV4dCkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2gyNjRfY2FiYWMuYyBiL2xpYmF2Y29kZWMveDg2L2gyNjRfY2FiYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWRjNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy94ODYvaDI2NF9jYWJhYy5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZW5jb2Rlci9kZWNvZGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogSC4yNjQgLyBBVkMgLyBNUEVHLTQgcGFydDEwIGNvZGVjLgorICogbm9uLVNJTUQgeDg2LXNwZWNpZmljIG9wdGltaXphdGlvbnMgZm9yIEguMjY0CisgKiBAYXV0aG9yIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9jYWJhYy5oIgorI2luY2x1ZGUgImNhYmFjLmgiCisKKyNpZiBIQVZFX0lOTElORV9BU00KKworI2lmIEFSQ0hfWDg2XzY0CisjZGVmaW5lIFJFRzY0ICJyIgorI2Vsc2UKKyNkZWZpbmUgUkVHNjQgIm0iCisjZW5kaWYKKworLy9GSVhNRSB1c2Ugc29tZSBtYWNyb3MgdG8gYXZvaWQgZHVwbGljYXRpbmcgZ2V0X2NhYmFjIChjYW5ub3QgYmUgZG9uZSB5ZXQKKy8vYXMgdGhhdCB3b3VsZCBtYWtlIG9wdGltaXphdGlvbiB3b3JrIGhhcmQpCisjaWYgSEFWRV83UkVHUyAmJiAhQlJPS0VOX0NPTVBJTEVSCisjZGVmaW5lIGRlY29kZV9zaWduaWZpY2FuY2UgZGVjb2RlX3NpZ25pZmljYW5jZV94ODYKK3N0YXRpYyBpbnQgZGVjb2RlX3NpZ25pZmljYW5jZV94ODYoQ0FCQUNDb250ZXh0ICpjLCBpbnQgbWF4X2NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzaWduaWZpY2FudF9jb2VmZl9jdHhfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwgeDg2X3JlZyBsYXN0X29mZil7CisgICAgdm9pZCAqZW5kPSBzaWduaWZpY2FudF9jb2VmZl9jdHhfYmFzZSArIG1heF9jb2VmZiAtIDE7CisgICAgaW50IG1pbnVzc3RhcnQ9IC0oaW50cHRyX3Qpc2lnbmlmaWNhbnRfY29lZmZfY3R4X2Jhc2U7CisgICAgaW50IG1pbnVzaW5kZXg9IDQtKGludHB0cl90KWluZGV4OworICAgIGludCBiaXQ7CisgICAgeDg2X3JlZyBjb2VmZl9jb3VudDsKKworI2lmZGVmIEJST0tFTl9SRUxPQ0FUSU9OUworICAgIHZvaWQgKnRhYmxlczsKKworICAgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICAgICJsZWEgICAiTUFOR0xFKGZmX2gyNjRfY2FiYWNfdGFibGVzKSIsICUwICAgICAgXG5cdCIKKyAgICAgICAgOiAiPSZyIih0YWJsZXMpCisgICAgICAgIDogTkFNRURfQ09OU1RSQUlOVFNfQVJSQVkoZmZfaDI2NF9jYWJhY190YWJsZXMpCisgICAgKTsKKyNlbmRpZgorCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgQlJBTkNITEVTU19HRVRfQ0FCQUMoIiU0IiwgIiVxNCIsICIoJTEpIiwgIiUzIiwgIiV3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlNSIsICIlcTUiLCAiJWswIiwgIiViMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlYzExKCU2KSIsICIlYzEyKCU2KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X05PUk1fU0hJRlRfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTFBTX1JBTkdFX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X01MUFNfU1RBVEVfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUxMyIpCisKKyAgICAgICAgInRlc3QgJDEsICU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIganogNGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAlMTAsICUxICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBCUkFOQ0hMRVNTX0dFVF9DQUJBQygiJTQiLCAiJXE0IiwgIiglMSkiLCAiJTMiLCAiJXczIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU1IiwgIiVxNSIsICIlazAiLCAiJWIwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVjMTEoJTYpIiwgIiVjMTIoJTYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTk9STV9TSElGVF9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9MUFNfUkFOR0VfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTUxQU19TVEFURV9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTEzIikKKworICAgICAgICAic3ViICAlMTAsICUxICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgJTIsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZsICU3LCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAlMSwgJSUiRkZfUkVHX2MiICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmwgJSVlY3gsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgInRlc3QgJDEsICU0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgam56IDVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJhZGQiRkZfT1BTSVpFIiAgJDQsICUyICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAkMSwgJTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImNtcCAgJTgsICUxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIgamIgM2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICAlMiwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmwgJTcsICUlZWN4ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICUxLCAlJSJGRl9SRUdfYyIgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAlJWVjeCwgKCUwKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICU5LCAlazAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyICQyLCAlazAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiAiPSZxIihjb2VmZl9jb3VudCksICIrciIoc2lnbmlmaWNhbnRfY29lZmZfY3R4X2Jhc2UpLCAiK20iKGluZGV4KSwKKyAgICAgICAgICAiKyZyIihjLT5sb3cpLCAiPSZyIihiaXQpLCAiKyZyIihjLT5yYW5nZSkKKyAgICAgICAgOiAiciIoYyksICJtIihtaW51c3N0YXJ0KSwgIm0iKGVuZCksICJtIihtaW51c2luZGV4KSwgIm0iKGxhc3Rfb2ZmKSwKKyAgICAgICAgICAiaSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCBieXRlc3RyZWFtKSksCisgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgYnl0ZXN0cmVhbV9lbmQpKQorICAgICAgICAgIFRBQkxFU19BUkcKKyAgICAgICAgOiAiJSJGRl9SRUdfYywgIm1lbW9yeSIKKyAgICApOworICAgIHJldHVybiBjb2VmZl9jb3VudDsKK30KKworI2RlZmluZSBkZWNvZGVfc2lnbmlmaWNhbmNlXzh4OCBkZWNvZGVfc2lnbmlmaWNhbmNlXzh4OF94ODYKK3N0YXRpYyBpbnQgZGVjb2RlX3NpZ25pZmljYW5jZV84eDhfeDg2KENBQkFDQ29udGV4dCAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwgdWludDhfdCAqbGFzdF9jb2VmZl9jdHhfYmFzZSwgY29uc3QgdWludDhfdCAqc2lnX29mZil7CisgICAgaW50IG1pbnVzaW5kZXg9IDQtKGludHB0cl90KWluZGV4OworICAgIGludCBiaXQ7CisgICAgeDg2X3JlZyBjb2VmZl9jb3VudDsKKyAgICB4ODZfcmVnIGxhc3Q9MDsKKyAgICB4ODZfcmVnIHN0YXRlOworCisjaWZkZWYgQlJPS0VOX1JFTE9DQVRJT05TCisgICAgdm9pZCAqdGFibGVzOworCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgImxlYSAgICAiTUFOR0xFKGZmX2gyNjRfY2FiYWNfdGFibGVzKSIsICUwICAgICAgXG5cdCIKKyAgICAgICAgOiAiPSZyIih0YWJsZXMpCisgICAgICAgIDogTkFNRURfQ09OU1RSQUlOVFNfQVJSQVkoZmZfaDI2NF9jYWJhY190YWJsZXMpCisgICAgKTsKKyNlbmRpZgorCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICAgIm1vdiAlMSwgJTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJtb3YgJTEwLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92emIgKCUwLCAlNiksICU2ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAlOSwgJTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgICAgQlJBTkNITEVTU19HRVRfQ0FCQUMoIiU0IiwgIiVxNCIsICIoJTYpIiwgIiUzIiwgIiV3MyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlNSIsICIlcTUiLCAiJWswIiwgIiViMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlYzEyKCU3KSIsICIlYzEzKCU3KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X05PUk1fU0hJRlRfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTFBTX1JBTkdFX09GRlNFVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X01MUFNfU1RBVEVfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUxNSIpCisKKyAgICAgICAgIm1vdiAlMSwgJTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJ0ZXN0ICQxLCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiIGp6IDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2lmZGVmIEJST0tFTl9SRUxPQ0FUSU9OUworICAgICAgICAibW92emIgJWMxNCglMTUsICVxNiksICU2XG5cdCIKKyNlbHNlCisgICAgICAgICJtb3Z6YiAiTUFOR0xFKGZmX2gyNjRfY2FiYWNfdGFibGVzKSIrJWMxNCglNiksICU2XG5cdCIKKyNlbmRpZgorICAgICAgICAiYWRkICUxMSwgJTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICBCUkFOQ0hMRVNTX0dFVF9DQUJBQygiJTQiLCAiJXE0IiwgIiglNikiLCAiJTMiLCAiJXczIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiU1IiwgIiVxNSIsICIlazAiLCAiJWIwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVjMTIoJTcpIiwgIiVjMTMoJTcpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTk9STV9TSElGVF9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9MUFNfUkFOR0VfT0ZGU0VUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTUxQU19TVEFURV9PRkZTRVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTE1IikKKworICAgICAgICAibW92ICUyLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAlMSwgJTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJWs2LCAoJTApICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgICAgICJ0ZXN0ICQxLCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiIGpueiA1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiYWRkIkZGX09QU0laRSIgICQ0LCAlMiAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAkMSwgJTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTYsICUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY21wICQ2MywgJTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBqYiAzYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTIsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICVrNiwgKCUwKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIjU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRsICU4LCAlazAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2hyICQyLCAlazAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiAiPSZxIihjb2VmZl9jb3VudCksICIrIlJFRzY0KGxhc3QpLCAiKyJSRUc2NChpbmRleCksICIrJnIiKGMtPmxvdyksCisgICAgICAgICAgIj0mciIoYml0KSwgIismciIoYy0+cmFuZ2UpLCAiPSZyIihzdGF0ZSkKKyAgICAgICAgOiAiciIoYyksICJtIihtaW51c2luZGV4KSwgIm0iKHNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlKSwKKyAgICAgICAgICBSRUc2NChzaWdfb2ZmKSwgUkVHNjQobGFzdF9jb2VmZl9jdHhfYmFzZSksCisgICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgYnl0ZXN0cmVhbSkpLAorICAgICAgICAgICJpIihvZmZzZXRvZihDQUJBQ0NvbnRleHQsIGJ5dGVzdHJlYW1fZW5kKSksCisgICAgICAgICAgImkiKEgyNjRfTEFTVF9DT0VGRl9GTEFHX09GRlNFVF84eDhfT0ZGU0VUKSBUQUJMRVNfQVJHCisgICAgICAgIDogIiUiRkZfUkVHX2MsICJtZW1vcnkiCisgICAgKTsKKyAgICByZXR1cm4gY29lZmZfY291bnQ7Cit9CisjZW5kaWYgLyogSEFWRV83UkVHUyAmJiBCUk9LRU5fQ09NUElMRVIgKi8KKworI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaDI2NF9jaHJvbWFtYy5hc20gYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2Nocm9tYW1jLmFzbQppbmRleCAxMDdhZTUxLi5iNWE3OGI1IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9oMjY0X2Nocm9tYW1jLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2Nocm9tYW1jLmFzbQpAQCAtMSw1ICsxLDUgQEAKIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLTsqIE1NWC9TU1NFMy1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciBIMjY0IGNocm9tYSBNQworOyogTU1YL1NTU0UzLW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIEguMjY0IGNocm9tYSBNQwogOyogQ29weXJpZ2h0IChjKSAyMDA1IFpvbHRhbiBIaWR2ZWdpIDxoem9saSAtYS0gaHpvbGkgLWQtIGNvbT4sCiA7KiAgICAgICAgICAgICAgIDIwMDUtMjAwOCBMb3JlbiBNZXJyaXR0CiA7KgpAQCAtMTA1LDExICsxMDUsOCBAQAogJWVuZGlmIDsgcnY0MAogOyB2b2lkIGZmX3B1dC9hdmdfaDI2NF9jaHJvbWFfbWM4XyoodWludDhfdCAqZHN0IC8qIGFsaWduIDggKi8sCiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMgLyogYWxpZ24gMSAqLywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgbXgsIGludCBteSkKIGNnbG9iYWwgJTFfJTJfY2hyb21hX21jOCUzLCA2LCA3ICsgZXh0cmFfcmVncywgMAotJWlmIEFSQ0hfWDg2XzY0Ci0gICAgbW92c3hkICAgICAgICByMiwgcjJkCi0lZW5kaWYKICAgICBtb3YgICAgICAgICAgcjZkLCByNWQKICAgICBvciAgICAgICAgICAgcjZkLCByNGQKICAgICBqbmUgLmF0X2xlYXN0X29uZV9ub25femVybwpAQCAtMjkxLDkgKzI4OCw2IEBACiAlZW5kaWYgOyBQSUMKICVlbmRpZiA7IHJ2NDAKIGNnbG9iYWwgJTFfJTJfY2hyb21hX21jNCwgNiwgNiArIGV4dHJhX3JlZ3MsIDAKLSVpZiBBUkNIX1g4Nl82NAotICAgIG1vdnN4ZCAgICAgICAgcjIsIHIyZAotJWVuZGlmCiAgICAgcHhvciAgICAgICAgICBtNywgbTcKICAgICBtb3ZkICAgICAgICAgIG0yLCByNGQgICAgICAgICA7IHgKICAgICBtb3ZkICAgICAgICAgIG0zLCByNWQgICAgICAgICA7IHkKQEAgLTM3NiwxMCArMzcwLDYgQEAKIAogJW1hY3JvIGNocm9tYV9tYzJfbW14X2Z1bmMgMgogY2dsb2JhbCAlMV8lMl9jaHJvbWFfbWMyLCA2LCA3LCAwCi0laWYgQVJDSF9YODZfNjQKLSAgICBtb3ZzeGQgICAgICAgIHIyLCByMmQKLSVlbmRpZgotCiAgICAgbW92ICAgICAgICAgIHI2ZCwgcjRkCiAgICAgc2hsICAgICAgICAgIHI0ZCwgMTYKICAgICBzdWIgICAgICAgICAgcjRkLCByNmQKQEAgLTQ2NSw5ICs0NTUsNiBAQAogCiAlbWFjcm8gY2hyb21hX21jOF9zc3NlM19mdW5jIDItMwogY2dsb2JhbCAlMV8lMl9jaHJvbWFfbWM4JTMsIDYsIDcsIDgKLSVpZiBBUkNIX1g4Nl82NAotICAgIG1vdnN4ZCAgICAgICAgcjIsIHIyZAotJWVuZGlmCiAgICAgbW92ICAgICAgICAgIHI2ZCwgcjVkCiAgICAgb3IgICAgICAgICAgIHI2ZCwgcjRkCiAgICAgam5lIC5hdF9sZWFzdF9vbmVfbm9uX3plcm8KQEAgLTYxMyw5ICs2MDAsNiBAQAogCiAlbWFjcm8gY2hyb21hX21jNF9zc3NlM19mdW5jIDIKIGNnbG9iYWwgJTFfJTJfY2hyb21hX21jNCwgNiwgNywgMAotJWlmIEFSQ0hfWDg2XzY0Ci0gICAgbW92c3hkICAgICAgICByMiwgcjJkCi0lZW5kaWYKICAgICBtb3YgICAgICAgICAgIHI2LCByNAogICAgIHNobCAgICAgICAgICByNGQsIDgKICAgICBzdWIgICAgICAgICAgcjRkLCByNmQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2gyNjRfY2hyb21hbWNfMTBiaXQuYXNtIGIvbGliYXZjb2RlYy94ODYvaDI2NF9jaHJvbWFtY18xMGJpdC5hc20KaW5kZXggYzM1ODQ4Mi4uMzRiYzQxOSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaDI2NF9jaHJvbWFtY18xMGJpdC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvaDI2NF9jaHJvbWFtY18xMGJpdC5hc20KQEAgLTU3LDEyICs1NywxMSBAQAogJWVuZG1hY3JvCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3B1dC9hdmdfaDI2NF9jaHJvbWFfbWM4KHBpeGVsICpkc3QsIHBpeGVsICpzcmMsIGludCBzdHJpZGUsIGludCBoLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBteCwgaW50IG15KQorOyB2b2lkIGZmX3B1dC9hdmdfaDI2NF9jaHJvbWFfbWM4KHBpeGVsICpkc3QsIHBpeGVsICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGgsIGludCBteCwgaW50IG15KQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gQ0hST01BX01DOCAxCiBjZ2xvYmFsICUxX2gyNjRfY2hyb21hX21jOF8xMCwgNiw3LDgKLSAgICBtb3ZzeGRpZm5pZG4gIHIyLCByMmQKICAgICBtb3YgICAgICAgICAgcjZkLCByNWQKICAgICBvciAgICAgICAgICAgcjZkLCByNGQKICAgICBqbmUgLmF0X2xlYXN0X29uZV9ub25femVybwpAQCAtMTQ5LDggKzE0OCw4IEBACiAlZW5kbWFjcm8KIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHV0L2F2Z19oMjY0X2Nocm9tYV9tYzQocGl4ZWwgKmRzdCwgcGl4ZWwgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14LCBpbnQgbXkpCis7IHZvaWQgZmZfcHV0L2F2Z19oMjY0X2Nocm9tYV9tYzQocGl4ZWwgKmRzdCwgcGl4ZWwgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDtUT0RPOiB4bW0gbWM0CiAlbWFjcm8gTUM0X09QIDIKQEAgLTE3NCw3ICsxNzMsNiBAQAogCiAlbWFjcm8gQ0hST01BX01DNCAxCiBjZ2xvYmFsICUxX2gyNjRfY2hyb21hX21jNF8xMCwgNiw2LDcKLSAgICBtb3ZzeGRpZm5pZG4gIHIyLCByMmQKICAgICBtb3ZkICAgICAgICAgIG0yLCByNG0gICAgICAgICA7IHgKICAgICBtb3ZkICAgICAgICAgIG0zLCByNW0gICAgICAgICA7IHkKICAgICBtb3ZhICAgICAgICAgIG00LCBbcHdfOF0KQEAgLTIwMCwxMiArMTk4LDExIEBACiAlZW5kbWFjcm8KIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHV0L2F2Z19oMjY0X2Nocm9tYV9tYzIocGl4ZWwgKmRzdCwgcGl4ZWwgKnNyYywgaW50IHN0cmlkZSwgaW50IGgsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG14LCBpbnQgbXkpCis7IHZvaWQgZmZfcHV0L2F2Z19oMjY0X2Nocm9tYV9tYzIocGl4ZWwgKmRzdCwgcGl4ZWwgKnNyYywgcHRyZGlmZl90IHN0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaCwgaW50IG14LCBpbnQgbXkpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBDSFJPTUFfTUMyIDEKIGNnbG9iYWwgJTFfaDI2NF9jaHJvbWFfbWMyXzEwLCA2LDcKLSAgICBtb3ZzeGRpZm5pZG4gIHIyLCByMmQKICAgICBtb3YgICAgICAgICAgcjZkLCByNGQKICAgICBzaGwgICAgICAgICAgcjRkLCAxNgogICAgIHN1YiAgICAgICAgICByNGQsIHI2ZApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaDI2NF9kZWJsb2NrLmFzbSBiL2xpYmF2Y29kZWMveDg2L2gyNjRfZGVibG9jay5hc20KaW5kZXggNGFhYmJjMC4uNjcwMmFlOSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaDI2NF9kZWJsb2NrLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2RlYmxvY2suYXNtCkBAIC0zNywxMSArMzcsNiBAQAogY2V4dGVybiBwYl8xCiBjZXh0ZXJuIHBiXzMKIAotOyBleHBhbmRzIHRvIFtiYXNlXSwuLi4sW2Jhc2UrNypzdHJpZGVdCi0lZGVmaW5lIFBBU1M4Uk9XUyhiYXNlLCBiYXNlMywgc3RyaWRlLCBzdHJpZGUzKSBcCi0gICAgW2Jhc2VdLCBbYmFzZStzdHJpZGVdLCBbYmFzZStzdHJpZGUqMl0sIFtiYXNlM10sIFwKLSAgICBbYmFzZTMrc3RyaWRlXSwgW2Jhc2UzK3N0cmlkZSoyXSwgW2Jhc2UzK3N0cmlkZTNdLCBbYmFzZTMrc3RyaWRlKjRdCi0KICVkZWZpbmUgUEFTUzhST1dTKGJhc2UsIGJhc2UzLCBzdHJpZGUsIHN0cmlkZTMsIG9mZnNldCkgXAogICAgIFBBU1M4Uk9XUyhiYXNlK29mZnNldCwgYmFzZTMrb2Zmc2V0LCBzdHJpZGUsIHN0cmlkZTMpCiAKQEAgLTI4NywxOCArMjgyLDE4IEBACiA7ICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICp0YzApCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBERUJMT0NLX0xVTUEgMAotY2dsb2JhbCBkZWJsb2NrX3ZfbHVtYV84LCA1LDUsMTAKK2NnbG9iYWwgZGVibG9ja192X2x1bWFfOCwgNSw1LDEwLCBwaXhfLCBzdHJpZGVfLCBhbHBoYV8sIGJldGFfLCBiYXNlM18KICAgICBtb3ZkICAgIG04LCBbcjRdIDsgdGMwCi0gICAgbGVhICAgICByNCwgW3IxKjNdCi0gICAgZGVjICAgICByMmQgICAgICAgIDsgYWxwaGEtMQorICAgIGxlYSAgICAgcjQsIFtzdHJpZGVfcSozXQorICAgIGRlYyAgICAgYWxwaGFfZCAgICAgICAgOyBhbHBoYS0xCiAgICAgbmVnICAgICByNAotICAgIGRlYyAgICAgcjNkICAgICAgICA7IGJldGEtMQotICAgIGFkZCAgICAgcjQsIHIwICAgICA7IHBpeC0zKnN0cmlkZQorICAgIGRlYyAgICAgYmV0YV9kICAgICAgICA7IGJldGEtMQorICAgIGFkZCAgICAgYmFzZTNfcSwgcGl4X3EgICAgIDsgcGl4LTMqc3RyaWRlCiAKLSAgICBtb3ZhICAgIG0wLCBbcjQrcjFdICAgOyBwMQotICAgIG1vdmEgICAgbTEsIFtyNCsyKnIxXSA7IHAwCi0gICAgbW92YSAgICBtMiwgW3IwXSAgICAgIDsgcTAKLSAgICBtb3ZhICAgIG0zLCBbcjArcjFdICAgOyBxMQorICAgIG1vdmEgICAgbTAsIFtiYXNlM19xICsgc3RyaWRlX3FdICAgOyBwMQorICAgIG1vdmEgICAgbTEsIFtiYXNlM19xICsgMipzdHJpZGVfcV0gOyBwMAorICAgIG1vdmEgICAgbTIsIFtwaXhfcV0gICAgICA7IHEwCisgICAgbW92YSAgICBtMywgW3BpeF9xICsgc3RyaWRlX3FdICAgOyBxMQogICAgIExPQURfTUFTSyByMmQsIHIzZAogCiAgICAgcHVucGNrbGJ3IG04LCBtOApAQCAtMzA4LDI0ICszMDMsMjQgQEAKICAgICBwYW5kbiAgIG05LCBtNwogICAgIHBhbmQgICAgbTgsIG05CiAKLSAgICBtb3ZkcWEgIG0zLCBbcjRdIDsgcDIKKyAgICBtb3ZkcWEgIG0zLCBbYmFzZTNfcV0gOyBwMgogICAgIERJRkZfR1QyIG0xLCBtMywgbTUsIG02LCBtNyA7IHxwMi1wMHwgPiBiZXRhLTEKICAgICBwYW5kICAgIG02LCBtOQogICAgIHBzdWJiICAgbTcsIG04LCBtNgogICAgIHBhbmQgICAgbTYsIG04Ci0gICAgTFVNQV9RMSBtMCwgbTMsIFtyNF0sIFtyNCtyMV0sIG02LCBtNAorICAgIExVTUFfUTEgbTAsIG0zLCBbYmFzZTNfcV0sIFtiYXNlM19xICsgc3RyaWRlX3FdLCBtNiwgbTQKIAotICAgIG1vdmRxYSAgbTQsIFtyMCsyKnIxXSA7IHEyCisgICAgbW92ZHFhICBtNCwgW3BpeF9xICsgMipzdHJpZGVfcV0gOyBxMgogICAgIERJRkZfR1QyIG0yLCBtNCwgbTUsIG02LCBtMyA7IHxxMi1xMHwgPiBiZXRhLTEKICAgICBwYW5kICAgIG02LCBtOQogICAgIHBhbmQgICAgbTgsIG02CiAgICAgcHN1YmIgICBtNywgbTYKLSAgICBtb3ZhICAgIG0zLCBbcjArcjFdCi0gICAgTFVNQV9RMSBtMywgbTQsIFtyMCsyKnIxXSwgW3IwK3IxXSwgbTgsIG02CisgICAgbW92YSAgICBtMywgW3BpeF9xICsgc3RyaWRlX3FdCisgICAgTFVNQV9RMSBtMywgbTQsIFtwaXhfcSArIDIqc3RyaWRlX3FdLCBbcGl4X3EgKyBzdHJpZGVfcV0sIG04LCBtNgogCiAgICAgREVCTE9DS19QMF9RMAotICAgIG1vdmEgICAgW3I0KzIqcjFdLCBtMQotICAgIG1vdmEgICAgW3IwXSwgbTIKKyAgICBtb3ZhICAgIFtiYXNlM19xICsgMipzdHJpZGVfcV0sIG0xCisgICAgbW92YSAgICBbcGl4X3FdLCBtMgogICAgIFJFVAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4MiwxMCArMzc3LDk5IEBACiAgICAgUkVUCiAlZW5kbWFjcm8KIAorJW1hY3JvIERFQkxPQ0tfSF9MVU1BX01CQUZGIDAKKworY2dsb2JhbCBkZWJsb2NrX2hfbHVtYV9tYmFmZl84LCA1LCA5LCAxMCwgOCoxNiwgcGl4Xywgc3RyaWRlXywgYWxwaGFfLCBiZXRhXywgdGMwXywgYmFzZTNfLCBzdHJpZGUzXworICAgIG1vdnN4ZCBzdHJpZGVfcSwgICBzdHJpZGVfZAorICAgIGRlYyAgICBhbHBoYV9kCisgICAgZGVjICAgIGJldGFfZAorICAgIG1vdiAgICBiYXNlM19xLCAgICBwaXhfcQorICAgIGxlYSAgICBzdHJpZGUzX3EsIFszKnN0cmlkZV9xXQorICAgIGFkZCAgICBiYXNlM19xLCAgICBzdHJpZGUzX3EKKworICAgIG1vdnEgbTAsIFtwaXhfcSAtIDRdCisgICAgbW92cSBtMSwgW3BpeF9xICsgc3RyaWRlX3EgLSA0XQorICAgIG1vdnEgbTIsIFtwaXhfcSArIDIqc3RyaWRlX3EgLSA0XQorICAgIG1vdnEgbTMsIFtiYXNlM19xIC0gNF0KKyAgICBtb3ZxIG00LCBbYmFzZTNfcSArIHN0cmlkZV9xIC0gNF0KKyAgICBtb3ZxIG01LCBbYmFzZTNfcSArIDIqc3RyaWRlX3EgLSA0XQorICAgIG1vdnEgbTYsIFtiYXNlM19xICsgc3RyaWRlM19xIC0gNF0KKyAgICBtb3ZxIG03LCBbYmFzZTNfcSArIDQqc3RyaWRlX3EgLSA0XQorCisgICAgVFJBTlNQT1NFXzhYOEIgMCwxLDIsMyw0LDUsNiw3CisKKyAgICAlYXNzaWduIGkgMAorICAgICVyZXAgOAorICAgICAgICBtb3ZxIFtyc3AgKyAxNippXSwgbSAlKyBpCisgICAgICAgICVhc3NpZ24gaSBpKzEKKyAgICAlZW5kcmVwCisKKyAgICA7IHAyID0gbTEgW3JzcCArIDE2XQorICAgIDsgcDEgPSBtMiBbcnNwICsgMzJdCisgICAgOyBwMCA9IG0zIFtyc3AgKyA0OF0KKyAgICA7IHEwID0gbTQgW3JzcCArIDY0XQorICAgIDsgcTEgPSBtNSBbcnNwICsgODBdCisgICAgOyBxMiA9IG02IFtyc3AgKyA5Nl0KKworICAgIFNXQVAgMCwgMgorICAgIFNXQVAgMSwgMworICAgIFNXQVAgMiwgNAorICAgIFNXQVAgMywgNQorCisgICAgTE9BRF9NQVNLIGFscGhhX2QsIGJldGFfZAorICAgIG1vdmQgbTgsIFt0YzBfcV0KKyAgICBwdW5wY2tsYncgbTgsIG04CisgICAgcGNtcGVxYiBtOSwgbTkKKyAgICBwY21wZXFiIG05LCBtOAorICAgIHBhbmRuICAgbTksIG03CisgICAgcGFuZCAgICBtOCwgbTkKKworICAgIG1vdmRxYSAgbTMsIFtyc3AgKyAxNl0gOyBwMgorICAgIERJRkZfR1QyIG0xLCBtMywgbTUsIG02LCBtNyA7IHxwMi1wMHwgPiBiZXRhLTEKKyAgICBwYW5kICAgIG02LCBtOQorICAgIHBzdWJiICAgbTcsIG04LCBtNgorICAgIHBhbmQgICAgbTYsIG04CisgICAgTFVNQV9RMSBtMCwgbTMsIFtyc3AgKyAxNl0sIFtyc3AgKyAzMl0sIG02LCBtNAorCisgICAgbW92ZHFhICBtNCwgW3JzcCArIDk2XSA7IHEyCisgICAgRElGRl9HVDIgbTIsIG00LCBtNSwgbTYsIG0zIDsgfHEyLXEwfCA+IGJldGEtMQorICAgIHBhbmQgICAgbTYsIG05CisgICAgcGFuZCAgICBtOCwgbTYKKyAgICBwc3ViYiAgIG03LCBtNgorICAgIG1vdmEgICAgbTMsIFtyc3AgKyA4MF0KKyAgICBMVU1BX1ExIG0zLCBtNCwgW3JzcCArIDk2XSwgW3JzcCArIDgwXSwgbTgsIG02CisKKyAgICBERUJMT0NLX1AwX1EwCisgICAgU1dBUCAxLCAzCisgICAgU1dBUCAyLCA0CisgICAgbW92cSBtMCwgW3JzcF0KKyAgICBtb3ZxIG0xLCBbcnNwICsgMTZdCisgICAgbW92cSBtMiwgW3JzcCArIDMyXQorICAgIG1vdnEgbTUsIFtyc3AgKyA4MF0KKyAgICBtb3ZxIG02LCBbcnNwICsgOTZdCisgICAgbW92cSBtNywgW3JzcCArIDExMl0KKworICAgIFRSQU5TUE9TRV84WDhCIDAsMSwyLDMsNCw1LDYsNworICAgIG1vdnEgW3BpeF9xIC0gNF0sIG0wCisgICAgbW92cSBbcGl4X3EgKyBzdHJpZGVfcSAtIDRdLCBtMQorICAgIG1vdnEgW3BpeF9xICsgMipzdHJpZGVfcSAtIDRdLCBtMgorICAgIG1vdnEgW2Jhc2UzX3EgLSA0XSwgbTMKKyAgICBtb3ZxIFtiYXNlM19xICsgc3RyaWRlX3EgLSA0XSwgbTQKKyAgICBtb3ZxIFtiYXNlM19xICsgMipzdHJpZGVfcSAtIDRdLCBtNQorICAgIG1vdnEgW2Jhc2UzX3EgKyBzdHJpZGUzX3EgLSA0XSwgbTYKKyAgICBtb3ZxIFtiYXNlM19xICsgNCpzdHJpZGVfcSAtIDRdLCBtNworCitSRVQKKworJWVuZG1hY3JvCisKIElOSVRfWE1NIHNzZTIKK0RFQkxPQ0tfSF9MVU1BX01CQUZGCiBERUJMT0NLX0xVTUEKKwogJWlmIEhBVkVfQVZYX0VYVEVSTkFMCiBJTklUX1hNTSBhdngKK0RFQkxPQ0tfSF9MVU1BX01CQUZGCiBERUJMT0NLX0xVTUEKICVlbmRpZgogCkBAIC05NDYsNiArMTAzMCwyMCBAQAogICAgIFRSQU5TUE9TRTh4NEJfU1RPUkUgUEFTUzhST1dTKHQ1LCByMCwgcjEsIHQ2KQogICAgIFJFVAogCitjZ2xvYmFsIGRlYmxvY2tfaF9jaHJvbWE0MjJfaW50cmFfOCwgNCwgNgorICAgIENIUk9NQV9IX1NUQVJUCisgICAgVFJBTlNQT1NFNHg4X0xPQUQgIGJ3LCB3ZCwgZHEsIFBBU1M4Uk9XUyh0NSwgcjAsIHIxLCB0NikKKyAgICBjYWxsIGZmX2Nocm9tYV9pbnRyYV9ib2R5X21teGV4dAorICAgIFRSQU5TUE9TRTh4NEJfU1RPUkUgUEFTUzhST1dTKHQ1LCByMCwgcjEsIHQ2KQorCisgICAgbGVhIHIwLCBbcjArcjEqOF0KKyAgICBsZWEgdDUsIFt0NStyMSo4XQorCisgICAgVFJBTlNQT1NFNHg4X0xPQUQgIGJ3LCB3ZCwgZHEsIFBBU1M4Uk9XUyh0NSwgcjAsIHIxLCB0NikKKyAgICBjYWxsIGZmX2Nocm9tYV9pbnRyYV9ib2R5X21teGV4dAorICAgIFRSQU5TUE9TRTh4NEJfU1RPUkUgUEFTUzhST1dTKHQ1LCByMCwgcjEsIHQ2KQorUkVUCisKIEFMSUdOIDE2CiBmZl9jaHJvbWFfaW50cmFfYm9keV9tbXhleHQ6CiAgICAgTE9BRF9NQVNLIHIyZCwgcjNkCkBAIC05NjEsNiArMTA1OSwyMDIgQEAKICAgICBwYWRkYiAgbTIsIG02CiAgICAgcmV0CiAKKyVtYWNybyBMT0FEXzhfUk9XUyA4CisgICAgbW92ZCBtMCwgJTEKKyAgICBtb3ZkIG0xLCAlMgorICAgIG1vdmQgbTIsICUzCisgICAgbW92ZCBtMywgJTQKKyAgICBtb3ZkIG00LCAlNQorICAgIG1vdmQgbTUsICU2CisgICAgbW92ZCBtNiwgJTcKKyAgICBtb3ZkIG03LCAlOAorJWVuZG1hY3JvCisKKyVtYWNybyBTVE9SRV84X1JPV1MgOAorICAgIG1vdmQgJTEsIG0wCisgICAgbW92ZCAlMiwgbTEKKyAgICBtb3ZkICUzLCBtMgorICAgIG1vdmQgJTQsIG0zCisgICAgbW92ZCAlNSwgbTQKKyAgICBtb3ZkICU2LCBtNQorICAgIG1vdmQgJTcsIG02CisgICAgbW92ZCAlOCwgbTcKKyVlbmRtYWNybworCislbWFjcm8gVFJBTlNQT1NFXzh4NEJfWE1NIDAKKyAgICBwdW5wY2tsYncgbTAsIG0xCisgICAgcHVucGNrbGJ3IG0yLCBtMworICAgIHB1bnBja2xidyBtNCwgbTUKKyAgICBwdW5wY2tsYncgbTYsIG03CisgICAgcHVucGNrbHdkIG0wLCBtMgorICAgIHB1bnBja2x3ZCBtNCwgbTYKKyAgICBwdW5wY2toZHEgbTIsIG0wLCBtNAorICAgIHB1bnBja2xkcSBtMCwgbTQKKyAgICBNT1ZITCBtMSwgbTAKKyAgICBNT1ZITCBtMywgbTIKKyVlbmRtYWNybworCislbWFjcm8gVFJBTlNQT1NFXzR4OEJfWE1NIDAKKyAgICBwdW5wY2tsYncgbTAsIG0xCisgICAgcHVucGNrbGJ3IG0yLCBtMworICAgIHB1bnBja2h3ZCBtNCwgbTAsIG0yCisgICAgcHVucGNrbHdkIG0wLCBtMgorICAgIE1PVkhMIG02LCBtNAorICAgIE1PVkhMIG0yLCBtMAorICAgIHBzaHVmZCBtMSwgbTAsIDEKKyAgICBwc2h1ZmQgbTMsIG0yLCAxCisgICAgcHNodWZkIG01LCBtNCwgMQorICAgIHBzaHVmZCBtNywgbTYsIDEKKyVlbmRtYWNybworCislbWFjcm8gQ0hST01BX0lOVEVSX0JPRFlfWE1NIDEKKyAgICBMT0FEX01BU0sgYWxwaGFfZCwgYmV0YV9kCisgICAgbW92ZCBtNiwgW3RjMF9xXQorICAgICVyZXAgJTEKKyAgICAgICAgcHVucGNrbGJ3IG02LCBtNgorICAgICVlbmRyZXAKKyAgICBwYW5kIG03LCBtNgorICAgIERFQkxPQ0tfUDBfUTAKKyVlbmRtYWNybworCislbWFjcm8gQ0hST01BX0lOVFJBX0JPRFlfWE1NIDAKKyAgICBMT0FEX01BU0sgYWxwaGFfZCwgYmV0YV9kCisgICAgbW92YSAgICBtNSwgIG0xCisgICAgbW92YSAgICBtNiwgIG0yCisgICAgcHhvciAgICBtNCwgIG0xLCBtMworICAgIHBhbmQgICAgbTQsIFtwYl8xXQorICAgIHBhdmdiICAgbTEsICBtMworICAgIHBzdWJ1c2IgbTEsICBtNAorICAgIHBhdmdiICAgbTEsICBtMAorICAgIHB4b3IgICAgbTQsICBtMiwgbTAKKyAgICBwYW5kICAgIG00LCBbcGJfMV0KKyAgICBwYXZnYiAgIG0yLCAgbTAKKyAgICBwc3VidXNiIG0yLCAgbTQKKyAgICBwYXZnYiAgIG0yLCAgbTMKKyAgICBwc3ViYiAgIG0xLCAgbTUKKyAgICBwc3ViYiAgIG0yLCAgbTYKKyAgICBwYW5kICAgIG0xLCAgbTcKKyAgICBwYW5kICAgIG0yLCAgbTcKKyAgICBwYWRkYiAgIG0xLCAgbTUKKyAgICBwYWRkYiAgIG0yLCAgbTYKKyVlbmRtYWNybworCislbWFjcm8gQ0hST01BX1ZfU1RBUlRfWE1NIDEKKyAgICBtb3ZzeGRpZm5pZG4gc3RyaWRlX3EsIHN0cmlkZV9kCisgICAgZGVjIGFscGhhX2QKKyAgICBkZWMgYmV0YV9kCisgICAgbW92ICUxLCBwaXhfcQorICAgIHN1YiAlMSwgc3RyaWRlX3EKKyAgICBzdWIgJTEsIHN0cmlkZV9xCislZW5kbWFjcm8KKworJW1hY3JvIENIUk9NQV9IX1NUQVJUX1hNTSAyCisgICAgbW92c3hkaWZuaWRuIHN0cmlkZV9xLCBzdHJpZGVfZAorICAgIGRlYyBhbHBoYV9kCisgICAgZGVjIGJldGFfZAorICAgIGxlYSAlMiwgWzMqc3RyaWRlX3FdCisgICAgbW92ICUxLCAgcGl4X3EKKyAgICBhZGQgJTEsICAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBERUJMT0NLX0NIUk9NQV9YTU0gMQorCitJTklUX1hNTSAlMQorCitjZ2xvYmFsIGRlYmxvY2tfdl9jaHJvbWFfOCwgNSwgNiwgOCwgcGl4Xywgc3RyaWRlXywgYWxwaGFfLCBiZXRhXywgdGMwXworICAgIENIUk9NQV9WX1NUQVJUX1hNTSByNQorICAgIG1vdnEgbTAsIFtyNV0KKyAgICBtb3ZxIG0xLCBbcjUgKyBzdHJpZGVfcV0KKyAgICBtb3ZxIG0yLCBbcGl4X3FdCisgICAgbW92cSBtMywgW3BpeF9xICsgc3RyaWRlX3FdCisgICAgQ0hST01BX0lOVEVSX0JPRFlfWE1NIDEKKyAgICBtb3ZxIFtyNSArIHN0cmlkZV9xXSwgbTEKKyAgICBtb3ZxIFtwaXhfcV0sIG0yCitSRVQKKworY2dsb2JhbCBkZWJsb2NrX2hfY2hyb21hXzgsIDUsIDcsIDgsIDAtMTYsIHBpeF8sIHN0cmlkZV8sIGFscGhhXywgYmV0YV8sIHRjMF8KKyAgICBDSFJPTUFfSF9TVEFSVF9YTU0gcjUsIHI2CisgICAgTE9BRF84X1JPV1MgUEFTUzhST1dTKHBpeF9xIC0gMiwgcjUgLSAyLCBzdHJpZGVfcSwgcjYpCisgICAgVFJBTlNQT1NFXzh4NEJfWE1NCisgICAgbW92cSBbcnNwXSwgbTAKKyAgICBtb3ZxIFtyc3AgKyA4XSwgbTMKKyAgICBDSFJPTUFfSU5URVJfQk9EWV9YTU0gMQorICAgIG1vdnEgbTAsIFtyc3BdCisgICAgbW92cSBtMywgW3JzcCArIDhdCisgICAgVFJBTlNQT1NFXzR4OEJfWE1NCisgICAgU1RPUkVfOF9ST1dTIFBBU1M4Uk9XUyhwaXhfcSAtIDIsIHI1IC0gMiwgc3RyaWRlX3EsIHI2KQorUkVUCisKK2NnbG9iYWwgZGVibG9ja19oX2Nocm9tYTQyMl84LCA1LCA3LCA4LCAwLTE2LCBwaXhfLCBzdHJpZGVfLCBhbHBoYV8sIGJldGFfLCB0YzBfLAorICAgIENIUk9NQV9IX1NUQVJUX1hNTSByNSwgcjYKKyAgICBMT0FEXzhfUk9XUyBQQVNTOFJPV1MocGl4X3EgLSAyLCByNSAtIDIsIHN0cmlkZV9xLCByNikKKyAgICBUUkFOU1BPU0VfOHg0Ql9YTU0KKyAgICBtb3ZxIFtyc3BdLCBtMAorICAgIG1vdnEgW3JzcCArIDhdLCBtMworICAgIENIUk9NQV9JTlRFUl9CT0RZX1hNTSAyCisgICAgbW92cSBtMCwgW3JzcF0KKyAgICBtb3ZxIG0zLCBbcnNwICsgOF0KKyAgICBUUkFOU1BPU0VfNHg4Ql9YTU0KKyAgICBTVE9SRV84X1JPV1MgUEFTUzhST1dTKHBpeF9xIC0gMiwgcjUgLSAyLCBzdHJpZGVfcSwgcjYpCisKKyAgICBsZWEgcGl4X3EsIFtwaXhfcSArIDgqc3RyaWRlX3FdCisgICAgbGVhIHI1LCAgICBbcjUgICAgKyA4KnN0cmlkZV9xXQorICAgIGFkZCB0YzBfcSwgIDIKKworICAgIExPQURfOF9ST1dTIFBBU1M4Uk9XUyhwaXhfcSAtIDIsIHI1IC0gMiwgc3RyaWRlX3EsIHI2KQorICAgIFRSQU5TUE9TRV84eDRCX1hNTQorICAgIG1vdnEgW3JzcF0sIG0wCisgICAgbW92cSBbcnNwICsgOF0sIG0zCisgICAgQ0hST01BX0lOVEVSX0JPRFlfWE1NIDIKKyAgICBtb3ZxIG0wLCBbcnNwXQorICAgIG1vdnEgbTMsIFtyc3AgKyA4XQorICAgIFRSQU5TUE9TRV80eDhCX1hNTQorICAgIFNUT1JFXzhfUk9XUyBQQVNTOFJPV1MocGl4X3EgLSAyLCByNSAtIDIsIHN0cmlkZV9xLCByNikKK1JFVAorCitjZ2xvYmFsIGRlYmxvY2tfdl9jaHJvbWFfaW50cmFfOCwgNCwgNSwgOCwgcGl4Xywgc3RyaWRlXywgYWxwaGFfLCBiZXRhXworICAgIENIUk9NQV9WX1NUQVJUX1hNTSByNAorICAgIG1vdnEgbTAsIFtyNF0KKyAgICBtb3ZxIG0xLCBbcjQgKyBzdHJpZGVfcV0KKyAgICBtb3ZxIG0yLCBbcGl4X3FdCisgICAgbW92cSBtMywgW3BpeF9xICsgc3RyaWRlX3FdCisgICAgQ0hST01BX0lOVFJBX0JPRFlfWE1NCisgICAgbW92cSBbcjQgKyBzdHJpZGVfcV0sIG0xCisgICAgbW92cSBbcGl4X3FdLCBtMgorUkVUCisKK2NnbG9iYWwgZGVibG9ja19oX2Nocm9tYV9pbnRyYV84LCA0LCA2LCA4LCBwaXhfLCBzdHJpZGVfLCBhbHBoYV8sIGJldGFfCisgICAgQ0hST01BX0hfU1RBUlRfWE1NIHI0LCByNQorICAgIExPQURfOF9ST1dTIFBBU1M4Uk9XUyhwaXhfcSAtIDIsIHI0IC0gMiwgc3RyaWRlX3EsIHI1KQorICAgIFRSQU5TUE9TRV84eDRCX1hNTQorICAgIENIUk9NQV9JTlRSQV9CT0RZX1hNTQorICAgIFRSQU5TUE9TRV80eDhCX1hNTQorICAgIFNUT1JFXzhfUk9XUyBQQVNTOFJPV1MocGl4X3EgLSAyLCByNCAtIDIsIHN0cmlkZV9xLCByNSkKK1JFVAorCitjZ2xvYmFsIGRlYmxvY2tfaF9jaHJvbWE0MjJfaW50cmFfOCwgNCwgNiwgOCwgcGl4Xywgc3RyaWRlXywgYWxwaGFfLCBiZXRhXworICAgIENIUk9NQV9IX1NUQVJUX1hNTSByNCwgcjUKKyAgICBMT0FEXzhfUk9XUyBQQVNTOFJPV1MocGl4X3EgLSAyLCByNCAtIDIsIHN0cmlkZV9xLCByNSkKKyAgICBUUkFOU1BPU0VfOHg0Ql9YTU0KKyAgICBDSFJPTUFfSU5UUkFfQk9EWV9YTU0KKyAgICBUUkFOU1BPU0VfNHg4Ql9YTU0KKyAgICBTVE9SRV84X1JPV1MgUEFTUzhST1dTKHBpeF9xIC0gMiwgcjQgLSAyLCBzdHJpZGVfcSwgcjUpCisKKyAgICBsZWEgcGl4X3EsIFtwaXhfcSArIDgqc3RyaWRlX3FdCisgICAgbGVhIHI0LCAgICBbcjQgICAgKyA4KnN0cmlkZV9xXQorCisgICAgTE9BRF84X1JPV1MgUEFTUzhST1dTKHBpeF9xIC0gMiwgcjQgLSAyLCBzdHJpZGVfcSwgcjUpCisgICAgVFJBTlNQT1NFXzh4NEJfWE1NCisgICAgQ0hST01BX0lOVFJBX0JPRFlfWE1NCisgICAgVFJBTlNQT1NFXzR4OEJfWE1NCisgICAgU1RPUkVfOF9ST1dTIFBBU1M4Uk9XUyhwaXhfcSAtIDIsIHI0IC0gMiwgc3RyaWRlX3EsIHI1KQorUkVUCisKKyVlbmRtYWNybyA7IERFQkxPQ0tfQ0hST01BX1hNTQorCitERUJMT0NLX0NIUk9NQV9YTU0gc3NlMgorREVCTE9DS19DSFJPTUFfWE1NIGF2eAorCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9oMjY0X2xvb3BfZmlsdGVyX3N0cmVuZ3RoKGludDE2X3QgYnNbMl1bNF1bNF0sIHVpbnQ4X3Qgbm56WzQwXSwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCByZWZbMl1bNDBdLCBpbnQxNl90IG12WzJdWzQwXVsyXSwKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2gyNjRfZGVibG9ja18xMGJpdC5hc20gYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2RlYmxvY2tfMTBiaXQuYXNtCmluZGV4IGViZjhhM2YuLjFhZjMyNTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2gyNjRfZGVibG9ja18xMGJpdC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvaDI2NF9kZWJsb2NrXzEwYml0LmFzbQpAQCAtODQzLDYgKzg0Myw4MyBAQAogICAgIG1vdmEgW3IwKzIqcjFdLCBtMgogJWVuZG1hY3JvCiAKKzsgaW46IDggcm93cyBvZiA0IHdvcmRzIGluICU0Li4lMTEKKzsgb3V0OiA0IHJvd3Mgb2YgOCB3b3JkcyBpbiBtMC4ubTMKKyVtYWNybyBUUkFOU1BPU0U0eDhXX0xPQUQgOAorICAgIG1vdnEgICAgICAgICAgICAgbTAsICUxCisgICAgbW92cSAgICAgICAgICAgICBtMiwgJTIKKyAgICBtb3ZxICAgICAgICAgICAgIG0xLCAlMworICAgIG1vdnEgICAgICAgICAgICAgbTMsICU0CisKKyAgICBwdW5wY2tsd2QgICAgICAgIG0wLCBtMgorICAgIHB1bnBja2x3ZCAgICAgICAgbTEsIG0zCisgICAgcHVucGNraGRxICAgICAgICBtMiwgbTAsIG0xCisgICAgcHVucGNrbGRxICAgICAgICBtMCwgbTEKKworICAgIG1vdnEgICAgICAgICAgICAgbTQsICU1CisgICAgbW92cSAgICAgICAgICAgICBtNiwgJTYKKyAgICBtb3ZxICAgICAgICAgICAgIG01LCAlNworICAgIG1vdnEgICAgICAgICAgICAgbTMsICU4CisKKyAgICBwdW5wY2tsd2QgICAgICAgIG00LCBtNgorICAgIHB1bnBja2x3ZCAgICAgICAgbTUsIG0zCisgICAgcHVucGNraGRxICAgICAgICBtNiwgbTQsIG01CisgICAgcHVucGNrbGRxICAgICAgICBtNCwgbTUKKworICAgIHB1bnBja2hxZHEgICAgICAgbTEsIG0wLCBtNAorICAgIHB1bnBja2xxZHEgICAgICAgbTAsIG00CisgICAgcHVucGNraHFkcSAgICAgICBtMywgbTIsIG02CisgICAgcHVucGNrbHFkcSAgICAgICBtMiwgbTYKKyVlbmRtYWNybworCis7IGluOiA0IHJvd3Mgb2YgOCB3b3JkcyBpbiBtMC4ubTMKKzsgb3V0OiA4IHJvd3Mgb2YgNCB3b3JkcyBpbiAlMS4uJTgKKyVtYWNybyBUUkFOU1BPU0U4eDRXX1NUT1JFIDgKKyAgICBUUkFOU1BPU0U0eDRXICAgICAwLCAxLCAyLCAzLCA0CisgICAgbW92cSAgICAgICAgICAgICAlMSwgbTAKKyAgICBtb3ZocHMgICAgICAgICAgICUyLCBtMAorICAgIG1vdnEgICAgICAgICAgICAgJTMsIG0xCisgICAgbW92aHBzICAgICAgICAgICAlNCwgbTEKKyAgICBtb3ZxICAgICAgICAgICAgICU1LCBtMgorICAgIG1vdmhwcyAgICAgICAgICAgJTYsIG0yCisgICAgbW92cSAgICAgICAgICAgICAlNywgbTMKKyAgICBtb3ZocHMgICAgICAgICAgICU4LCBtMworJWVuZG1hY3JvCisKKzsgJTEgPSBiYXNlICsgMypzdHJpZGUKKzsgJTIgPSAzKnN0cmlkZSAodW51c2VkIG9uIG1teCkKKzsgJTMsICU0ID0gcGxhY2UgdG8gc3RvcmUgcDEgYW5kIHExIHZhbHVlcworJW1hY3JvIENIUk9NQV9IX0xPQUQgNAorICAgICVpZiBtbXNpemUgPT0gOAorICAgICAgICBtb3ZxIG0wLCBbcGl4X3EgLSA0XQorICAgICAgICBtb3ZxIG0xLCBbcGl4X3EgKyAgIHN0cmlkZV9xIC0gNF0KKyAgICAgICAgbW92cSBtMiwgW3BpeF9xICsgMipzdHJpZGVfcSAtIDRdCisgICAgICAgIG1vdnEgbTMsIFslMSAtIDRdCisgICAgICAgIFRSQU5TUE9TRTR4NFcgMCwgMSwgMiwgMywgNAorICAgICVlbHNlCisgICAgICAgIFRSQU5TUE9TRTR4OFdfTE9BRCBQQVNTOFJPV1MocGl4X3EtNCwgJTEtNCwgc3RyaWRlX3EsICUyKQorICAgICVlbmRpZgorICAgIG1vdmEgJTMsIG0wCisgICAgbW92YSAlNCwgbTMKKyVlbmRtYWNybworCis7ICUxID0gYmFzZSArIDMqc3RyaWRlCis7ICUyID0gMypzdHJpZGUgKHVudXNlZCBvbiBtbXgpCis7ICUzLCAlNCA9IHBsYWNlIHRvIGxvYWQgcDEgYW5kIHExIHZhbHVlcworJW1hY3JvIENIUk9NQV9IX1NUT1JFIDQKKyAgICBtb3ZhIG0wLCAlMworICAgIG1vdmEgbTMsICU0CisgICAgJWlmIG1tc2l6ZSA9PSA4CisgICAgICAgIFRSQU5TUE9TRTR4NFcgMCwgMSwgMiwgMywgNAorICAgICAgICBtb3ZxIFtwaXhfcSAtIDRdLCAgICAgICAgICAgICAgbTAKKyAgICAgICAgbW92cSBbcGl4X3EgKyAgIHN0cmlkZV9xIC0gNF0sIG0xCisgICAgICAgIG1vdnEgW3BpeF9xICsgMipzdHJpZGVfcSAtIDRdLCBtMgorICAgICAgICBtb3ZxIFslMSAtIDRdLCAgICAgICAgICAgICAgICAgbTMKKyAgICAlZWxzZQorICAgICAgICBUUkFOU1BPU0U4eDRXX1NUT1JFIFBBU1M4Uk9XUyhwaXhfcS00LCAlMS00LCBzdHJpZGVfcSwgJTIpCisgICAgJWVuZGlmCislZW5kbWFjcm8KKwogJW1hY3JvIENIUk9NQV9WX0xPQURfVEMgMgogICAgIG1vdmQgICAgICAgICUxLCBbJTJdCiAgICAgcHVucGNrbGJ3ICAgJTEsICUxCkBAIC05MTQsNiArOTkxLDgxIEBACiAlZWxzZQogICAgIFJFVAogJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2RlYmxvY2tfaF9jaHJvbWFfMTAodWludDE2X3QgKnBpeCwgaW50IHN0cmlkZSwgaW50IGFscGhhLCBpbnQgYmV0YSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCAqdGMwKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjZ2xvYmFsIGRlYmxvY2tfaF9jaHJvbWFfMTAsIDUsIDcsIDgsIDAtMiptbXNpemUsIHBpeF8sIHN0cmlkZV8sIGFscGhhXywgYmV0YV8sIHRjMF8KKyAgICBzaGwgYWxwaGFfZCwgIDIKKyAgICBzaGwgYmV0YV9kLCAgIDIKKyAgICBtb3YgcjUsICAgICAgIHBpeF9xCisgICAgbGVhIHI2LCAgICAgIFszKnN0cmlkZV9xXQorICAgIGFkZCByNSwgICAgICAgcjYKKyVpZiBtbXNpemUgPT0gOAorICAgIG1vdiByNmQsICAgICAgMgorICAgIC5sb29wOgorJWVuZGlmCisKKyAgICAgICAgQ0hST01BX0hfTE9BRCByNSwgcjYsIFtyc3BdLCBbcnNwICsgbW1zaXplXQorICAgICAgICBMT0FEX0FCICAgICAgICAgIG00LCAgbTUsIGFscGhhX2QsIGJldGFfZAorICAgICAgICBMT0FEX01BU0sgICAgICAgIG0wLCAgbTEsIG0yLCBtMywgbTQsIG01LCBtNywgbTYsIG00CisgICAgICAgIHB4b3IgICAgICAgICAgICAgbTQsICBtNAorICAgICAgICBDSFJPTUFfVl9MT0FEX1RDIG02LCAgdGMwX3EKKyAgICAgICAgcHN1YncgICAgICAgICAgICBtNiwgW3B3XzNdCisgICAgICAgIHBtYXhzdyAgICAgICAgICAgbTYsICBtNAorICAgICAgICBwYW5kICAgICAgICAgICAgIG03LCAgbTYKKyAgICAgICAgREVCTE9DS19QMF9RMCAgICBtMSwgIG0yLCBtMCwgbTMsIG03LCBtNSwgbTYKKyAgICAgICAgQ0hST01BX0hfU1RPUkUgcjUsIHI2LCBbcnNwXSwgW3JzcCArIG1tc2l6ZV0KKworJWlmIG1tc2l6ZSA9PSA4CisgICAgICAgIGxlYSBwaXhfcSwgW3BpeF9xICsgNCpzdHJpZGVfcV0KKyAgICAgICAgbGVhIHI1LCAgICBbcjUgKyA0KnN0cmlkZV9xXQorICAgICAgICBhZGQgdGMwX3EsICAyCisgICAgICAgIGRlYyByNmQKKyAgICBqZyAubG9vcAorJWVuZGlmCitSRVQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGVibG9ja19oX2Nocm9tYTQyMl8xMCh1aW50MTZfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OF90ICp0YzApCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2NnbG9iYWwgZGVibG9ja19oX2Nocm9tYTQyMl8xMCwgNSwgNywgOCwgMC0zKm1tc2l6ZSwgcGl4Xywgc3RyaWRlXywgYWxwaGFfLCBiZXRhXywgdGMwXworICAgIHNobCBhbHBoYV9kLCAgMgorICAgIHNobCBiZXRhX2QsICAgMgorCisgICAgbW92ZCBtMCwgW3RjMF9xXQorICAgIHB1bnBja2xidyBtMCwgbTAKKyAgICBwc3JhdyBtMCwgNgorICAgIG1vdnEgW3JzcF0sIG0wCisKKyAgICBtb3YgcjUsICAgICAgIHBpeF9xCisgICAgbGVhIHI2LCAgICAgIFszKnN0cmlkZV9xXQorICAgIGFkZCByNSwgICAgICAgcjYKKworICAgIG1vdiByNCwgLTgKKyAgICAubG9vcDoKKworICAgICAgICBDSFJPTUFfSF9MT0FEIHI1LCByNiwgW3JzcCArIDEqbW1zaXplXSwgW3JzcCArIDIqbW1zaXplXQorICAgICAgICBMT0FEX0FCICAgICAgICAgIG00LCAgbTUsIGFscGhhX2QsIGJldGFfZAorICAgICAgICBMT0FEX01BU0sgICAgICAgIG0wLCAgbTEsIG0yLCBtMywgbTQsIG01LCBtNywgbTYsIG00CisgICAgICAgIHB4b3IgICAgICAgICAgICAgbTQsICBtNAorICAgICAgICBtb3ZkICAgICAgICAgICAgIG02LCBbcnNwICsgcjQgKyA4XQorICAgICAgICBwdW5wY2tsd2QgICAgICAgIG02LCAgbTYKKyAgICAgICAgcHVucGNrbHdkICAgICAgICBtNiwgIG02CisgICAgICAgIHBzdWJ3ICAgICAgICAgICAgbTYsIFtwd18zXQorICAgICAgICBwbWF4c3cgICAgICAgICAgIG02LCAgbTQKKyAgICAgICAgcGFuZCAgICAgICAgICAgICBtNywgIG02CisgICAgICAgIERFQkxPQ0tfUDBfUTAgICAgbTEsICBtMiwgbTAsIG0zLCBtNywgbTUsIG02CisgICAgICAgIENIUk9NQV9IX1NUT1JFIHI1LCByNiwgW3JzcCArIDEqbW1zaXplXSwgW3JzcCArIDIqbW1zaXplXQorCisgICAgICAgIGxlYSBwaXhfcSwgW3BpeF9xICsgKG1tc2l6ZS8yKSpzdHJpZGVfcV0KKyAgICAgICAgbGVhIHI1LCAgICBbcjUgKyAgICAobW1zaXplLzIpKnN0cmlkZV9xXQorICAgICAgICBhZGQgcjQsIChtbXNpemUvNCkKKyAgICBqbCAubG9vcAorUkVUCisKICVlbmRtYWNybwogCiAlaWYgQVJDSF9YODZfNjQgPT0gMApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaDI2NF9pMzg2LmggYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2kzODYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhZDBlMC4uMDAwMDAwMAotLS0gYS9saWJhdmNvZGVjL3g4Ni9oMjY0X2kzODYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKgotICogSC4yNkwvSC4yNjQvQVZDL0pWVC8xNDQ5Ni0xMC8uLi4gZW5jb2Rlci9kZWNvZGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogSC4yNjQgLyBBVkMgLyBNUEVHNCBwYXJ0MTAgY29kZWMuCi0gKiBub24tTU1YIGkzODYtc3BlY2lmaWMgb3B0aW1pemF0aW9ucyBmb3IgSC4yNjQKLSAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KLSAqLwotCi0jaWZuZGVmIEFWQ09ERUNfWDg2X0gyNjRfSTM4Nl9ICi0jZGVmaW5lIEFWQ09ERUNfWDg2X0gyNjRfSTM4Nl9ICi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2luY2x1ZGUgImxpYmF2Y29kZWMvY2FiYWMuaCIKLSNpbmNsdWRlICJjYWJhYy5oIgotCi0jaWYgSEFWRV9JTkxJTkVfQVNNCi0KLSNpZiBBUkNIX1g4Nl82NAotI2RlZmluZSBSRUc2NCAiciIKLSNlbHNlCi0jZGVmaW5lIFJFRzY0ICJtIgotI2VuZGlmCi0KLS8vRklYTUUgdXNlIHNvbWUgbWFjcm9zIHRvIGF2b2lkIGR1cGxpY2F0aW5nIGdldF9jYWJhYyAoY2Fubm90IGJlIGRvbmUgeWV0Ci0vL2FzIHRoYXQgd291bGQgbWFrZSBvcHRpbWl6YXRpb24gd29yayBoYXJkKQotI2lmIEhBVkVfN1JFR1MgJiYgIUJST0tFTl9DT01QSUxFUgotI2RlZmluZSBkZWNvZGVfc2lnbmlmaWNhbmNlIGRlY29kZV9zaWduaWZpY2FuY2VfeDg2Ci1zdGF0aWMgaW50IGRlY29kZV9zaWduaWZpY2FuY2VfeDg2KENBQkFDQ29udGV4dCAqYywgaW50IG1heF9jb2VmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc2lnbmlmaWNhbnRfY29lZmZfY3R4X2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsIHg4Nl9yZWcgbGFzdF9vZmYpewotICAgIHZvaWQgKmVuZD0gc2lnbmlmaWNhbnRfY29lZmZfY3R4X2Jhc2UgKyBtYXhfY29lZmYgLSAxOwotICAgIGludCBtaW51c3N0YXJ0PSAtKGludHB0cl90KXNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlOwotICAgIGludCBtaW51c2luZGV4PSA0LShpbnRwdHJfdClpbmRleDsKLSAgICBpbnQgYml0OwotICAgIHg4Nl9yZWcgY29lZmZfY291bnQ7Ci0KLSNpZmRlZiBCUk9LRU5fUkVMT0NBVElPTlMKLSAgICB2b2lkICp0YWJsZXM7Ci0KLSAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAibGVhICAgIk1BTkdMRShmZl9oMjY0X2NhYmFjX3RhYmxlcykiLCAlMCAgICAgIFxuXHQiCi0gICAgICAgIDogIj0mciIodGFibGVzKQotICAgICAgICA6IE5BTUVEX0NPTlNUUkFJTlRTX0FSUkFZKGZmX2gyNjRfY2FiYWNfdGFibGVzKQotICAgICk7Ci0jZW5kaWYKLQotICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgIEJSQU5DSExFU1NfR0VUX0NBQkFDKCIlNCIsICIlcTQiLCAiKCUxKSIsICIlMyIsICIldzMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTUiLCAiJXE1IiwgIiVrMCIsICIlYjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWMxMSglNikiLCAiJWMxMiglNikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9OT1JNX1NISUZUX09GRlNFVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X0xQU19SQU5HRV9PRkZTRVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9NTFBTX1NUQVRFX09GRlNFVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMTMiKQotCi0gICAgICAgICJ0ZXN0ICQxLCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiIGp6IDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAgJTEwLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgQlJBTkNITEVTU19HRVRfQ0FCQUMoIiU0IiwgIiVxNCIsICIoJTEpIiwgIiUzIiwgIiV3MyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlNSIsICIlcTUiLCAiJWswIiwgIiViMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlYzExKCU2KSIsICIlYzEyKCU2KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X05PUk1fU0hJRlRfT0ZGU0VUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTFBTX1JBTkdFX09GRlNFVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X01MUFNfU1RBVEVfT0ZGU0VUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUxMyIpCi0KLSAgICAgICAgInN1YiAgJTEwLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3YgICUyLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92bCAlNywgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAgJTEsICUlIlJFR19jIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZsICUlZWN4LCAoJTApICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICJ0ZXN0ICQxLCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiIGpueiA1ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAiYWRkIk9QU0laRSIgICQ0LCAlMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAgJDEsICUxICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJjbXAgICU4LCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiIGpiIDNiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdiAgJTIsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZsICU3LCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICAlMSwgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdmwgJSVlY3gsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICAlOSwgJWswICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNociAkMiwgJWswICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIDogIj0mcSIoY29lZmZfY291bnQpLCAiK3IiKHNpZ25pZmljYW50X2NvZWZmX2N0eF9iYXNlKSwgIittIihpbmRleCksCi0gICAgICAgICAgIismciIoYy0+bG93KSwgIj0mciIoYml0KSwgIismciIoYy0+cmFuZ2UpCi0gICAgICAgIDogInIiKGMpLCAibSIobWludXNzdGFydCksICJtIihlbmQpLCAibSIobWludXNpbmRleCksICJtIihsYXN0X29mZiksCi0gICAgICAgICAgImkiKG9mZnNldG9mKENBQkFDQ29udGV4dCwgYnl0ZXN0cmVhbSkpLAotICAgICAgICAgICJpIihvZmZzZXRvZihDQUJBQ0NvbnRleHQsIGJ5dGVzdHJlYW1fZW5kKSkKLSAgICAgICAgICBUQUJMRVNfQVJHCi0gICAgICAgIDogIiUiUkVHX2MsICJtZW1vcnkiCi0gICAgKTsKLSAgICByZXR1cm4gY29lZmZfY291bnQ7Ci19Ci0KLSNkZWZpbmUgZGVjb2RlX3NpZ25pZmljYW5jZV84eDggZGVjb2RlX3NpZ25pZmljYW5jZV84eDhfeDg2Ci1zdGF0aWMgaW50IGRlY29kZV9zaWduaWZpY2FuY2VfOHg4X3g4NihDQUJBQ0NvbnRleHQgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzaWduaWZpY2FudF9jb2VmZl9jdHhfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsIHVpbnQ4X3QgKmxhc3RfY29lZmZfY3R4X2Jhc2UsIGNvbnN0IHVpbnQ4X3QgKnNpZ19vZmYpewotICAgIGludCBtaW51c2luZGV4PSA0LShpbnRwdHJfdClpbmRleDsKLSAgICBpbnQgYml0OwotICAgIHg4Nl9yZWcgY29lZmZfY291bnQ7Ci0gICAgeDg2X3JlZyBsYXN0PTA7Ci0gICAgeDg2X3JlZyBzdGF0ZTsKLQotI2lmZGVmIEJST0tFTl9SRUxPQ0FUSU9OUwotICAgIHZvaWQgKnRhYmxlczsKLQotICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICJsZWEgICAgIk1BTkdMRShmZl9oMjY0X2NhYmFjX3RhYmxlcykiLCAlMCAgICAgIFxuXHQiCi0gICAgICAgIDogIj0mciIodGFibGVzKQotICAgICAgICA6IE5BTUVEX0NPTlNUUkFJTlRTX0FSUkFZKGZmX2gyNjRfY2FiYWNfdGFibGVzKQotICAgICk7Ci0jZW5kaWYKLQotICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICJtb3YgJTEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAibW92ICUxMCwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnpiICglMCwgJTYpLCAlNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgJTksICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgIEJSQU5DSExFU1NfR0VUX0NBQkFDKCIlNCIsICIlcTQiLCAiKCU2KSIsICIlMyIsICIldzMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTUiLCAiJXE1IiwgIiVrMCIsICIlYjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWMxMiglNykiLCAiJWMxMyglNykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9OT1JNX1NISUZUX09GRlNFVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X0xQU19SQU5HRV9PRkZTRVQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9TVFJJTkdJRlkoSDI2NF9NTFBTX1NUQVRFX09GRlNFVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMTUiKQotCi0gICAgICAgICJtb3YgJTEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAidGVzdCAkMSwgJTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIiBqeiA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSNpZmRlZiBCUk9LRU5fUkVMT0NBVElPTlMKLSAgICAgICAgIm1vdnpiICVjMTQoJTE1LCAlcTYpLCAlNlxuXHQiCi0jZWxzZQotICAgICAgICAibW92emIgIk1BTkdMRShmZl9oMjY0X2NhYmFjX3RhYmxlcykiKyVjMTQoJTYpLCAlNlxuXHQiCi0jZW5kaWYKLSAgICAgICAgImFkZCAlMTEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgQlJBTkNITEVTU19HRVRfQ0FCQUMoIiU0IiwgIiVxNCIsICIoJTYpIiwgIiUzIiwgIiV3MyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlNSIsICIlcTUiLCAiJWswIiwgIiViMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlYzEyKCU3KSIsICIlYzEzKCU3KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X05PUk1fU0hJRlRfT0ZGU0VUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU1RSSU5HSUZZKEgyNjRfTFBTX1JBTkdFX09GRlNFVCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NUUklOR0lGWShIMjY0X01MUFNfU1RBVEVfT0ZGU0VUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUxNSIpCi0KLSAgICAgICAgIm1vdiAlMiwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3YgJTEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92ICVrNiwgKCUwKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAidGVzdCAkMSwgJTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIiBqbnogNWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgImFkZCJPUFNJWkUiICAkNCwgJTIgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgJDEsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92ICU2LCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImNtcCAkNjMsICU2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICIgamIgM2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92ICUyLCAlMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdiAlazYsICglMCkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkbCAlOCwgJWswICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInNociAkMiwgJWswICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIDogIj0mcSIoY29lZmZfY291bnQpLCAiKyJSRUc2NChsYXN0KSwgIisiUkVHNjQoaW5kZXgpLCAiKyZyIihjLT5sb3cpLAotICAgICAgICAgICI9JnIiKGJpdCksICIrJnIiKGMtPnJhbmdlKSwgIj0mciIoc3RhdGUpCi0gICAgICAgIDogInIiKGMpLCAibSIobWludXNpbmRleCksICJtIihzaWduaWZpY2FudF9jb2VmZl9jdHhfYmFzZSksCi0gICAgICAgICAgUkVHNjQoc2lnX29mZiksIFJFRzY0KGxhc3RfY29lZmZfY3R4X2Jhc2UpLAotICAgICAgICAgICJpIihvZmZzZXRvZihDQUJBQ0NvbnRleHQsIGJ5dGVzdHJlYW0pKSwKLSAgICAgICAgICAiaSIob2Zmc2V0b2YoQ0FCQUNDb250ZXh0LCBieXRlc3RyZWFtX2VuZCkpLAotICAgICAgICAgICJpIihIMjY0X0xBU1RfQ09FRkZfRkxBR19PRkZTRVRfOHg4X09GRlNFVCkgVEFCTEVTX0FSRwotICAgICAgICA6ICIlIlJFR19jLCAibWVtb3J5IgotICAgICk7Ci0gICAgcmV0dXJuIGNvZWZmX2NvdW50OwotfQotI2VuZGlmIC8qIEhBVkVfN1JFR1MgJiYgQlJPS0VOX0NPTVBJTEVSICovCi0KLSNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KLSNlbmRpZiAvKiBBVkNPREVDX1g4Nl9IMjY0X0kzODZfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaDI2NF9pZGN0LmFzbSBiL2xpYmF2Y29kZWMveDg2L2gyNjRfaWRjdC5hc20KaW5kZXggN2ZhZmUxOS4uYzU0ZjlmMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaDI2NF9pZGN0LmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2lkY3QuYXNtCkBAIC02NSw3ICs2NSwxNSBAQAogCiAgICAgSURDVDRfMUQgICAgICB3LCAwLCAxLCAyLCAzLCA0LCA1CiAgICAgbW92YSAgICAgICAgIG02LCBbcHdfMzJdCi0gICAgVFJBTlNQT1NFNHg0VyAwLCAxLCAyLCAzLCA0CisgICAgJWlmIG1tc2l6ZSA9PSA4CisgICAgICAgIFRSQU5TUE9TRTR4NFcgMCwgMSwgMiwgMywgNAorICAgICVlbHNlCisgICAgICAgIHB1bnBja2x3ZCBtMCwgbTEKKyAgICAgICAgcHVucGNrbHdkIG0yLCBtMworICAgICAgICBTQlVUVEVSRkxZIGRxLCAwLCAyLCA0CisgICAgICAgIE1PVkhMIG0xLCBtMAorICAgICAgICBNT1ZITCBtMywgbTIKKyAgICAlZW5kaWYKICAgICBwYWRkdyAgICAgICAgbTAsIG02CiAgICAgSURDVDRfMUQgICAgICB3LCAwLCAxLCAyLCAzLCA0LCA1CiAgICAgcHhvciAgICAgICAgIG03LCBtNwpAQCAtODIsMTQgKzkwLDE0IEBACiBJTklUX01NWCBtbXgKIDsgdm9pZCBmZl9oMjY0X2lkY3RfYWRkXzhfbW14KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCiBjZ2xvYmFsIGgyNjRfaWRjdF9hZGRfOCwgMywgMywgMAorICAgIG1vdnN4ZGlmbmlkbiByMiwgcjJkCiAgICAgSURDVDRfQUREICAgIHIwLCByMSwgcjIKICAgICBSRVQKIAogJW1hY3JvIElEQ1Q4XzFEIDIKLSAgICBtb3ZhICAgICAgICAgbTAsIG0xCi0gICAgcHNyYXcgICAgICAgIG0xLCAxCi0gICAgbW92YSAgICAgICAgIG00LCBtNQotICAgIHBzcmF3ICAgICAgICBtNCwgMQorICAgIHBzcmF3ICAgICAgICBtMCwgbTEsIDEKKyAgICBTV0FQIDAsIDEKKyAgICBwc3JhdyAgICAgICAgbTQsIG01LCAxCiAgICAgcGFkZHcgICAgICAgIG00LCBtNQogICAgIHBhZGR3ICAgICAgICBtMSwgbTAKICAgICBwYWRkdyAgICAgICAgbTQsIG03CkBAIC0xMDYsMTAgKzExNCw5IEBACiAgICAgcHN1YncgICAgICAgIG0wLCBtMwogICAgIHBzdWJ3ICAgICAgICBtNSwgbTcKIAotICAgIG1vdmEgICAgICAgICBtNywgbTEKLSAgICBwc3JhdyAgICAgICAgbTEsIDIKLSAgICBtb3ZhICAgICAgICAgbTMsIG00Ci0gICAgcHNyYXcgICAgICAgIG0zLCAyCisgICAgcHNyYXcgICAgICAgIG03LCBtMSwgMgorICAgIFNXQVAgNywxCisgICAgcHNyYXcgICAgICAgIG0zLCBtNCwgMgogICAgIHBhZGR3ICAgICAgICBtMywgbTAKICAgICBwc3JhdyAgICAgICAgbTAsIDIKICAgICBwYWRkdyAgICAgICAgbTEsIG01CkBAIC0xMTcsMTAgKzEyNCw5IEBACiAgICAgcHN1YncgICAgICAgIG0wLCBtNAogICAgIHBzdWJ3ICAgICAgICBtNywgbTUKIAotICAgIG1vdmEgICAgICAgICBtNSwgbTYKLSAgICBwc3JhdyAgICAgICAgbTYsIDEKLSAgICBtb3ZhICAgICAgICAgbTQsIG0yCi0gICAgcHNyYXcgICAgICAgIG00LCAxCisgICAgcHNyYXcgICAgICAgIG01LCBtNiwgMQorICAgIFNXQVAgNSw2CisgICAgcHNyYXcgICAgICAgIG00LCBtMiwgMQogICAgIHBhZGR3ICAgICAgICBtNiwgbTIKICAgICBwc3VidyAgICAgICAgbTQsIG01CiAKQEAgLTIwNCw2ICsyMTAsNyBAQAogSU5JVF9NTVggbW14CiA7IHZvaWQgZmZfaDI2NF9pZGN0OF9hZGRfOF9tbXgodWludDhfdCAqZHN0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSkKIGNnbG9iYWwgaDI2NF9pZGN0OF9hZGRfOCwgMywgNCwgMAorICAgIG1vdnN4ZGlmbmlkbiByMiwgcjJkCiAgICAgJWFzc2lnbiBwYWQgMTI4KzQtKHN0YWNrX29mZnNldCY3KQogICAgIFNVQiAgICAgICAgIHJzcCwgcGFkCiAKQEAgLTI3Miw2ICsyNzksNyBAQAogSU5JVF9YTU0gc3NlMgogOyB2b2lkIGZmX2gyNjRfaWRjdDhfYWRkXzhfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQogY2dsb2JhbCBoMjY0X2lkY3Q4X2FkZF84LCAzLCA0LCAxMAorICAgIG1vdnN4ZGlmbmlkbiAgcjIsIHIyZAogICAgIElEQ1Q4X0FERF9TU0UgcjAsIHIxLCByMiwgcjMKICAgICBSRVQKIApAQCAtMzEwLDYgKzMxOCw3IEBACiA7IHZvaWQgZmZfaDI2NF9pZGN0X2RjX2FkZF84X21teGV4dCh1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQogJWlmIEFSQ0hfWDg2XzY0CiBjZ2xvYmFsIGgyNjRfaWRjdF9kY19hZGRfOCwgMywgNCwgMAorICAgIG1vdnN4ZCAgICAgICByMiwgcjJkCiAgICAgbW92c3ggICAgICAgIHIzLCB3b3JkIFtyMV0KICAgICBtb3YgIGR3b3JkIFtyMV0sIDAKICAgICBEQ19BRERfTU1YRVhUX0lOSVQgcjMsIHIyCkBAIC0zMTgsNiArMzI3LDcgQEAKIAogOyB2b2lkIGZmX2gyNjRfaWRjdDhfZGNfYWRkXzhfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUpCiBjZ2xvYmFsIGgyNjRfaWRjdDhfZGNfYWRkXzgsIDMsIDQsIDAKKyAgICBtb3ZzeGQgICAgICAgcjIsIHIyZAogICAgIG1vdnN4ICAgICAgICByMywgd29yZCBbcjFdCiAgICAgbW92ICBkd29yZCBbcjFdLCAwCiAgICAgRENfQUREX01NWEVYVF9JTklUIHIzLCByMgpAQCAtMzUyLDYgKzM2Miw3IEBACiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNiAqIDhdKQogY2dsb2JhbCBoMjY0X2lkY3RfYWRkMTZfOCwgNSwgNyArIG5waWNyZWdzLCAwLCBkc3QsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIHBpY3JlZworICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCiAgICAgeG9yICAgICAgICAgIHI1LCByNQogJWlmZGVmIFBJQwogICAgIGxlYSAgICAgcGljcmVncSwgW3NjYW44X21lbV0KQEAgLTM3NSw2ICszODYsNyBAQAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKIGNnbG9iYWwgaDI2NF9pZGN0OF9hZGQ0XzgsIDUsIDcgKyBucGljcmVncywgMCwgZHN0LCBibG9ja19vZmZzZXQsIGJsb2NrLCBzdHJpZGUsIG5uemMsIGNudHIsIGNvZWZmLCBwaWNyZWcKKyAgICBtb3ZzeGRpZm5pZG4gcjMsIHIzZAogICAgICVhc3NpZ24gcGFkIDEyOCs0LShzdGFja19vZmZzZXQmNykKICAgICBTVUIgICAgICAgICByc3AsIHBhZAogCkBAIC00MDksNiArNDIxLDcgQEAKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pCiBjZ2xvYmFsIGgyNjRfaWRjdF9hZGQxNl84LCA1LCA4ICsgbnBpY3JlZ3MsIDAsIGRzdDEsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIGRzdDIsIHBpY3JlZworICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCiAgICAgeG9yICAgICAgICAgIHI1LCByNQogJWlmZGVmIFBJQwogICAgIGxlYSAgICAgcGljcmVncSwgW3NjYW44X21lbV0KQEAgLTQ1Niw2ICs0NjksNyBAQAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pCiBjZ2xvYmFsIGgyNjRfaWRjdF9hZGQxNmludHJhXzgsIDUsIDcgKyBucGljcmVncywgMCwgZHN0LCBibG9ja19vZmZzZXQsIGJsb2NrLCBzdHJpZGUsIG5uemMsIGNudHIsIGNvZWZmLCBwaWNyZWcKKyAgICBtb3ZzeGRpZm5pZG4gcjMsIHIzZAogICAgIHhvciAgICAgICAgICByNSwgcjUKICVpZmRlZiBQSUMKICAgICBsZWEgICAgIHBpY3JlZ3EsIFtzY2FuOF9tZW1dCkBAIC00ODEsNiArNDk1LDcgQEAKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNiAqIDhdKQogY2dsb2JhbCBoMjY0X2lkY3RfYWRkMTZpbnRyYV84LCA1LCA4ICsgbnBpY3JlZ3MsIDAsIGRzdDEsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIGRzdDIsIHBpY3JlZworICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCiAgICAgeG9yICAgICAgICAgIHI1LCByNQogJWlmZGVmIFBJQwogICAgIGxlYSAgICAgcGljcmVncSwgW3NjYW44X21lbV0KQEAgLTUyNSw2ICs1NDAsNyBAQAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKIGNnbG9iYWwgaDI2NF9pZGN0OF9hZGQ0XzgsIDUsIDggKyBucGljcmVncywgMCwgZHN0MSwgYmxvY2tfb2Zmc2V0LCBibG9jaywgc3RyaWRlLCBubnpjLCBjbnRyLCBjb2VmZiwgZHN0MiwgcGljcmVnCisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKICAgICAlYXNzaWduIHBhZCAxMjgrNC0oc3RhY2tfb2Zmc2V0JjcpCiAgICAgU1VCICAgICAgICAgcnNwLCBwYWQKIApAQCAtNTg3LDYgKzYwMyw3IEBACiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pCiBjZ2xvYmFsIGgyNjRfaWRjdDhfYWRkNF84LCA1LCA4ICsgbnBpY3JlZ3MsIDEwLCBkc3QxLCBibG9ja19vZmZzZXQsIGJsb2NrLCBzdHJpZGUsIG5uemMsIGNudHIsIGNvZWZmLCBkc3QyLCBwaWNyZWcKKyAgICBtb3ZzeGRpZm5pZG4gcjMsIHIzZAogICAgIHhvciAgICAgICAgICByNSwgcjUKICVpZmRlZiBQSUMKICAgICBsZWEgICAgIHBpY3JlZ3EsIFtzY2FuOF9tZW1dCkBAIC02MzgsNiArNjU1LDcgQEAKIAogSU5JVF9NTVggbW14CiBoMjY0X2lkY3RfYWRkOF9tbXhfcGxhbmU6CisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKIC5uZXh0YmxvY2s6CiAgICAgbW92enggICAgICAgIHI2LCBieXRlIFtzY2FuOCtyNV0KICAgICBtb3Z6eCAgICAgICAgcjYsIGJ5dGUgW3I0K3I2XQpAQCAtNjY0LDYgKzY4Miw3IEBACiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKIGNnbG9iYWwgaDI2NF9pZGN0X2FkZDhfOCwgNSwgOCArIG5waWNyZWdzLCAwLCBkc3QxLCBibG9ja19vZmZzZXQsIGJsb2NrLCBzdHJpZGUsIG5uemMsIGNudHIsIGNvZWZmLCBkc3QyLCBwaWNyZWcKKyAgICBtb3ZzeGRpZm5pZG4gcjMsIHIzZAogICAgIG1vdiAgICAgICAgICByNSwgMTYKICAgICBhZGQgICAgICAgICAgcjIsIDUxMgogJWlmZGVmIFBJQwpAQCAtNjgxLDkgKzcwMCw0MiBAQAogICAgIGFkZCAgICAgICAgcjBtcCwgZ3Byc2l6ZQogJWVuZGlmCiAgICAgY2FsbCAgICAgICAgIGgyNjRfaWRjdF9hZGQ4X21teF9wbGFuZQotICAgIFJFVAorICAgIFJFVCA7IFRPRE86IGNoZWNrIHJlcCByZXQgYWZ0ZXIgYSBmdW5jdGlvbiBjYWxsCisKK2NnbG9iYWwgaDI2NF9pZGN0X2FkZDhfNDIyXzgsIDUsIDggKyBucGljcmVncywgMCwgZHN0MSwgYmxvY2tfb2Zmc2V0LCBibG9jaywgc3RyaWRlLCBubnpjLCBjbnRyLCBjb2VmZiwgZHN0MiwgcGljcmVnCis7IGRzdDEsIGJsb2NrX29mZnNldCwgYmxvY2ssIHN0cmlkZSwgbm56YywgY250ciwgY29lZmYsIGRzdDIsIHBpY3JlZworICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCislaWZkZWYgUElDCisgICAgbGVhICAgICBwaWNyZWdxLCBbc2NhbjhfbWVtXQorJWVuZGlmCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICAgZHN0MnEsIHIwCislZW5kaWYKKworICAgIG1vdiAgICAgICAgICByNSwgMTYgIDsgaQorICAgIGFkZCAgICAgICAgICByMiwgNTEyIDsgaSAqIDE2ICogc2l6ZW9mKGRjdGNvZWYpIDsgI2RlZmluZSBkY3Rjb2VmIGludDE2X3QKKworICAgIGNhbGwgICAgICAgICBoMjY0X2lkY3RfYWRkOF9tbXhfcGxhbmUKKyAgICBhZGQgcjUsIDQKKyAgICBjYWxsICAgICAgICAgaDI2NF9pZGN0X2FkZDhfbW14X3BsYW5lCisKKyVpZiBBUkNIX1g4Nl82NAorICAgIGFkZCAgICAgICBkc3QycSwgZ3Byc2l6ZSA7IGRlc3RbMV0KKyVlbHNlCisgICAgYWRkICAgICAgICByMG1wLCBncHJzaXplCislZW5kaWYKKworICAgIGFkZCByNSwgNCAgIDsgc2V0IHRvIDMyCisgICAgYWRkIHIyLCAyNTYgOyBzZXQgdG8gaSAqIDE2ICogc2l6ZW9mKGRjdGNvZWYpCisKKyAgICBjYWxsICAgICAgICAgaDI2NF9pZGN0X2FkZDhfbW14X3BsYW5lCisgICAgYWRkIHI1LCA0CisgICAgY2FsbCAgICAgICAgIGgyNjRfaWRjdF9hZGQ4X21teF9wbGFuZQorCisgICAgUkVUIDsgVE9ETzogY2hlY2sgcmVwIHJldCBhZnRlciBhIGZ1bmN0aW9uIGNhbGwKIAogaDI2NF9pZGN0X2FkZDhfbW14ZXh0X3BsYW5lOgorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCiAubmV4dGJsb2NrOgogICAgIG1vdnp4ICAgICAgICByNiwgYnl0ZSBbc2NhbjgrcjVdCiAgICAgbW92enggICAgICAgIHI2LCBieXRlIFtyNCtyNl0KQEAgLTczMCw2ICs3ODIsNyBAQAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2ICogOF0pCiBjZ2xvYmFsIGgyNjRfaWRjdF9hZGQ4XzgsIDUsIDggKyBucGljcmVncywgMCwgZHN0MSwgYmxvY2tfb2Zmc2V0LCBibG9jaywgc3RyaWRlLCBubnpjLCBjbnRyLCBjb2VmZiwgZHN0MiwgcGljcmVnCisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKICAgICBtb3YgICAgICAgICAgcjUsIDE2CiAgICAgYWRkICAgICAgICAgIHIyLCA1MTIKICVpZiBBUkNIX1g4Nl82NApAQCAtNzQ3LDEwICs4MDAsMTEgQEAKICAgICBhZGQgICAgICAgIHIwbXAsIGdwcnNpemUKICVlbmRpZgogICAgIGNhbGwgaDI2NF9pZGN0X2FkZDhfbW14ZXh0X3BsYW5lCi0gICAgUkVUCisgICAgUkVUIDsgVE9ETzogY2hlY2sgcmVwIHJldCBhZnRlciBhIGZ1bmN0aW9uIGNhbGwKIAogOyByMCA9IHVpbnQ4X3QgKmRzdCwgcjIgPSBpbnQxNl90ICpibG9jaywgcjMgPSBpbnQgc3RyaWRlLCByNj1jbG9iYmVyZWQKIGgyNjRfaWRjdF9kY19hZGQ4X21teGV4dDoKKyAgICBtb3ZzeGRpZm5pZG4gcjMsIHIzZAogICAgIG1vdmQgICAgICAgICBtMCwgW3IyICAgXSAgICAgICAgICA7ICAwIDAgWCBECiAgICAgbW92IHdvcmQgW3IyKyAwXSwgMAogICAgIHB1bnBja2x3ZCAgICBtMCwgW3IyKzMyXSAgICAgICAgICA7ICB4IFggZCBECkBAIC03NzEsNiArODI1LDcgQEAKIElOSVRfWE1NIHNzZTIKIDsgcjAgPSB1aW50OF90ICpkc3QgKGNsb2JiZXJlZCksIHIyID0gaW50MTZfdCAqYmxvY2ssIHIzID0gaW50IHN0cmlkZQogaDI2NF9hZGQ4eDRfaWRjdF9zc2UyOgorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCiAgICAgbW92cSAgIG0wLCBbcjIrIDBdCiAgICAgbW92cSAgIG0xLCBbcjIrIDhdCiAgICAgbW92cSAgIG0yLCBbcjIrMTZdCkBAIC04MTQsNiArODY5LDcgQEAKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKIGNnbG9iYWwgaDI2NF9pZGN0X2FkZDE2XzgsIDUsIDUgKyBBUkNIX1g4Nl82NCwgOAorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCiAlaWYgQVJDSF9YODZfNjQKICAgICBtb3YgICAgICAgICByNSwgcjAKICVlbmRpZgpAQCAtODI3LDcgKzg4Myw3IEBACiAgICAgYWRkMTZfc3NlMl9jeWNsZSA1LCAweDI0CiAgICAgYWRkMTZfc3NlMl9jeWNsZSA2LCAweDFlCiAgICAgYWRkMTZfc3NlMl9jeWNsZSA3LCAweDI2Ci0gICAgUkVUCitSRVBfUkVUCiAKICVtYWNybyBhZGQxNmludHJhX3NzZTJfY3ljbGUgMgogICAgIG1vdnp4ICAgICAgIHIwLCB3b3JkIFtyNCslMl0KQEAgLTg2Miw2ICs5MTgsNyBAQAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBubnpjWzYgKiA4XSkKIGNnbG9iYWwgaDI2NF9pZGN0X2FkZDE2aW50cmFfOCwgNSwgNyArIEFSQ0hfWDg2XzY0LCA4CisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKICVpZiBBUkNIX1g4Nl82NAogICAgIG1vdiAgICAgICAgIHI3LCByMAogJWVuZGlmCkBAIC04NzMsNyArOTMwLDcgQEAKICAgICBhZGQxNmludHJhX3NzZTJfY3ljbGUgNSwgMHgyNAogICAgIGFkZDE2aW50cmFfc3NlMl9jeWNsZSA2LCAweDFlCiAgICAgYWRkMTZpbnRyYV9zc2UyX2N5Y2xlIDcsIDB4MjYKLSAgICBSRVQKK1JFUF9SRVQKIAogJW1hY3JvIGFkZDhfc3NlMl9jeWNsZSAyCiAgICAgbW92enggICAgICAgcjAsIHdvcmQgW3I0KyUyXQpAQCAtOTE0LDYgKzk3MSw3IEBACiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IG5uemNbNiAqIDhdKQogY2dsb2JhbCBoMjY0X2lkY3RfYWRkOF84LCA1LCA3ICsgQVJDSF9YODZfNjQsIDgKKyAgICBtb3ZzeGRpZm5pZG4gcjMsIHIzZAogICAgIGFkZCAgICAgICAgICByMiwgNTEyCiAlaWYgQVJDSF9YODZfNjQKICAgICBtb3YgICAgICAgICAgcjcsIHIwCkBAIC05MjcsNyArOTg1LDcgQEAKICVlbmRpZgogICAgIGFkZDhfc3NlMl9jeWNsZSAyLCAweDVjCiAgICAgYWRkOF9zc2UyX2N5Y2xlIDMsIDB4NjQKLSAgICBSRVQKK1JFUF9SRVQKIAogO3ZvaWQgZmZfaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdF9tbXgoaW50MTZfdCAqb3V0cHV0LCBpbnQxNl90ICppbnB1dCwgaW50IHFtdWwpCiAKQEAgLTkzNyw3ICs5OTUsMzAgQEAKICAgICBTV0FQICUxLCAlNCwgJTMKICVlbmRtYWNybwogCi0lbWFjcm8gREVRVUFOVF9NTVggMworJW1hY3JvIERFUVVBTlQgMS0zCislaWYgY3B1ZmxhZyhzc2UyKQorICAgIG1vdmQgICAgICB4bW00LCB0M2QKKyAgICBtb3ZxICAgICAgeG1tNSwgW3B3XzFdCisgICAgcHNodWZkICAgIHhtbTQsIHhtbTQsIDAKKyAgICBtb3ZxMmRxICAgeG1tMCwgbTAKKyAgICBtb3ZxMmRxICAgeG1tMSwgbTEKKyAgICBtb3ZxMmRxICAgeG1tMiwgbTIKKyAgICBtb3ZxMmRxICAgeG1tMywgbTMKKyAgICBwdW5wY2tsd2QgeG1tMCwgeG1tNQorICAgIHB1bnBja2x3ZCB4bW0xLCB4bW01CisgICAgcHVucGNrbHdkIHhtbTIsIHhtbTUKKyAgICBwdW5wY2tsd2QgeG1tMywgeG1tNQorICAgIHBtYWRkd2QgICB4bW0wLCB4bW00CisgICAgcG1hZGR3ZCAgIHhtbTEsIHhtbTQKKyAgICBwbWFkZHdkICAgeG1tMiwgeG1tNAorICAgIHBtYWRkd2QgICB4bW0zLCB4bW00CisgICAgcHNyYWQgICAgIHhtbTAsICUxCisgICAgcHNyYWQgICAgIHhtbTEsICUxCisgICAgcHNyYWQgICAgIHhtbTIsICUxCisgICAgcHNyYWQgICAgIHhtbTMsICUxCisgICAgcGFja3NzZHcgIHhtbTAsIHhtbTEKKyAgICBwYWNrc3NkdyAgeG1tMiwgeG1tMworJWVsc2UKICAgICBtb3ZhICAgICAgICBtNywgW3B3XzFdCiAgICAgbW92YSAgICAgICAgbTQsICUxCiAgICAgcHVucGNrbHdkICAgJTEsIG03CkBAIC05NTcsNiArMTAzOCw3IEBACiAgICAgcHNyYWQgICAgICAgbTUsICUzCiAgICAgcGFja3NzZHcgICAgJTEsIG00CiAgICAgcGFja3NzZHcgICAgJTIsIG01CislZW5kaWYKICVlbmRtYWNybwogCiAlbWFjcm8gU1RPUkVfV09SRFMgNS05CkBAIC05OTUsMzUgKzEwNzcsMTUgQEAKIAogJW1hY3JvIERFUVVBTlRfU1RPUkUgMQogJWlmIGNwdWZsYWcoc3NlMikKLSAgICBtb3ZkICAgICAgeG1tNCwgdDNkCi0gICAgbW92cSAgICAgIHhtbTUsIFtwd18xXQotICAgIHBzaHVmZCAgICB4bW00LCB4bW00LCAwCi0gICAgbW92cTJkcSAgIHhtbTAsIG0wCi0gICAgbW92cTJkcSAgIHhtbTEsIG0xCi0gICAgbW92cTJkcSAgIHhtbTIsIG0yCi0gICAgbW92cTJkcSAgIHhtbTMsIG0zCi0gICAgcHVucGNrbHdkIHhtbTAsIHhtbTUKLSAgICBwdW5wY2tsd2QgeG1tMSwgeG1tNQotICAgIHB1bnBja2x3ZCB4bW0yLCB4bW01Ci0gICAgcHVucGNrbHdkIHhtbTMsIHhtbTUKLSAgICBwbWFkZHdkICAgeG1tMCwgeG1tNAotICAgIHBtYWRkd2QgICB4bW0xLCB4bW00Ci0gICAgcG1hZGR3ZCAgIHhtbTIsIHhtbTQKLSAgICBwbWFkZHdkICAgeG1tMywgeG1tNAotICAgIHBzcmFkICAgICB4bW0wLCAlMQotICAgIHBzcmFkICAgICB4bW0xLCAlMQotICAgIHBzcmFkICAgICB4bW0yLCAlMQotICAgIHBzcmFkICAgICB4bW0zLCAlMQotICAgIHBhY2tzc2R3ICB4bW0wLCB4bW0xCi0gICAgcGFja3NzZHcgIHhtbTIsIHhtbTMKKyAgICBERVFVQU5UICAgICAlMQogICAgIFNUT1JFX1dPUkRTIHhtbTAsICAwLCAgMSwgIDQsICA1LCAgMiwgIDMsICA2LCAgNwogICAgIFNUT1JFX1dPUkRTIHhtbTIsICA4LCAgOSwgMTIsIDEzLCAxMCwgMTEsIDE0LCAxNQogJWVsc2UKLSAgICBERVFVQU5UX01NWCBtMCwgbTEsICUxCisgICAgREVRVUFOVCAgICAgbTAsIG0xLCAlMQogICAgIFNUT1JFX1dPUkRTIG0wLCAgMCwgIDEsICA0LCAgNQogICAgIFNUT1JFX1dPUkRTIG0xLCAgMiwgIDMsICA2LCAgNwogCi0gICAgREVRVUFOVF9NTVggbTIsIG0zLCAlMQorICAgIERFUVVBTlQgICAgIG0yLCBtMywgJTEKICAgICBTVE9SRV9XT1JEUyBtMiwgIDgsICA5LCAxMiwgMTMKICAgICBTVE9SRV9XT1JEUyBtMywgMTAsIDExLCAxNCwgMTUKICVlbmRpZgpAQCAtMTA4MSwzICsxMTQzLDU3IEBACiBJRENUX0RDX0RFUVVBTlQgMAogSU5JVF9NTVggc3NlMgogSURDVF9EQ19ERVFVQU5UIDcKKworJWlmZGVmIF9fTkFTTV9WRVJfXworJWlmIF9fTkFTTV9NQUpPUl9fID49IDIgJiYgX19OQVNNX01JTk9SX18gPj0gNAorJXVubWFjcm8gU1RPUkVfRElGRngyIDggOyByZW1vdmUgbWFjcm8gZnJvbSB4ODZ1dGlsLmFzbSBidXQgeWFzbSBkb2Vzbid0IGhhdmUgdGhpcyB5ZXQKKyVlbmRpZgorJWVuZGlmCislbWFjcm8gU1RPUkVfRElGRngyIDggOyBhZGQxLCBhZGQyLCByZWcxLCByZWcyLCB6ZXJvLCBzaGlmdCwgc291cmNlLCBzdHJpZGUKKyAgICBtb3ZkICAgICAgICUzLCBbJTddCisgICAgbW92ZCAgICAgICAlNCwgWyU3KyU4XQorICAgIHBzcmF3ICAgICAgJTEsICU2CisgICAgcHNyYXcgICAgICAlMiwgJTYKKyAgICBwdW5wY2tsYncgICUzLCAlNQorICAgIHB1bnBja2xidyAgJTQsICU1CisgICAgcGFkZHcgICAgICAlMywgJTEKKyAgICBwYWRkdyAgICAgICU0LCAlMgorICAgIHBhY2t1c3diICAgJTMsICU1CisgICAgcGFja3Vzd2IgICAlNCwgJTUKKyAgICBtb3ZkICAgICBbJTddLCAlMworICAgIG1vdmQgIFslNyslOF0sICU0CislZW5kbWFjcm8KKworJW1hY3JvIERDX0FERF9JTklUIDEKKyAgICBhZGQgICAgICAlMWQsIDMyCisgICAgc2FyICAgICAgJTFkLCA2CisgICAgbW92ZCAgICAgbTAsICUxZAorICAgIHBzaHVmbHcgIG0wLCBtMCwgMAorICAgIGxlYSAgICAgICUxLCBbMypzdHJpZGVfcV0KKyAgICBweG9yICAgICBtMSwgbTEKKyAgICBwc3VidyAgICBtMSwgbTAKKyAgICBwYWNrdXN3YiBtMCwgbTAKKyAgICBwYWNrdXN3YiBtMSwgbTEKKyVlbmRtYWNybworCislbWFjcm8gSURDVF9YTU0gMQorCitJTklUX1hNTSAlMQorCitjZ2xvYmFsIGgyNjRfaWRjdF9hZGRfOCwgMywgMywgOCwgZHN0XywgYmxvY2tfLCBzdHJpZGVfCisgICAgbW92c3hkaWZuaWRuIHN0cmlkZV9xLCBzdHJpZGVfZAorICAgIElEQ1Q0X0FERCAgICBkc3RfcSwgYmxvY2tfcSwgc3RyaWRlX3EKK1JFVAorCitjZ2xvYmFsIGgyNjRfaWRjdF9kY19hZGRfOCwgMywgNCwgNiwgZHN0XywgYmxvY2tfLCBzdHJpZGVfCisgICAgbW92c3hkaWZuaWRuIHN0cmlkZV9xLCBzdHJpZGVfZAorICAgIG1vdnN4ICAgICAgICAgICAgIHIzZCwgd29yZCBbYmxvY2tfcV0KKyAgICBtb3YgICBkd29yZCBbYmxvY2tfcV0sIDAKKyAgICBEQ19BRERfSU5JVCByMworICAgIERDX0FERF9NTVhFWFRfT1AgbW92ZCwgZHN0X3EsIHN0cmlkZV9xLCByMworUkVUCisKKyVlbmRtYWNybworCitJRENUX1hNTSBzc2UyCitJRENUX1hNTSBhdngKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2gyNjRfaWRjdF8xMGJpdC5hc20gYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2lkY3RfMTBiaXQuYXNtCmluZGV4IGYxYzJjODEuLjlmZDA1YWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2gyNjRfaWRjdF8xMGJpdC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvaDI2NF9pZGN0XzEwYml0LmFzbQpAQCAtNzYsNiArNzYsNyBAQAogCiAlbWFjcm8gSURDVF9BRERfMTAgMAogY2dsb2JhbCBoMjY0X2lkY3RfYWRkXzEwLCAzLDMKKyAgICBtb3ZzeGRpZm5pZG4gcjIsIHIyZAogICAgIElEQ1Q0X0FERF8xMCByMCwgcjEsIHIyCiAgICAgUkVUCiAlZW5kbWFjcm8KQEAgLTEzNyw2ICsxMzgsNyBAQAogCiAlbWFjcm8gSURDVF9BREQxNl8xMCAwCiBjZ2xvYmFsIGgyNjRfaWRjdF9hZGQxNl8xMCwgNSw2CisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKICAgICBBREQxNl9PUCAwLCA0KzEqOAogICAgIEFERDE2X09QIDEsIDUrMSo4CiAgICAgQUREMTZfT1AgMiwgNCsyKjgKQEAgLTE5NSw2ICsxOTcsNyBAQAogCiBJTklUX01NWCBtbXhleHQKIGNnbG9iYWwgaDI2NF9pZGN0X2RjX2FkZF8xMCwzLDMKKyAgICBtb3ZzeGRpZm5pZG4gcjIsIHIyZAogICAgIG1vdmQgICAgICBtMCwgW3IxXQogICAgIG1vdiBkd29yZCBbcjFdLCAwCiAgICAgcGFkZGQgICAgIG0wLCBbcGRfMzJdCkBAIC0yMTAsNiArMjEzLDcgQEAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJW1hY3JvIElEQ1Q4X0RDX0FERCAwCiBjZ2xvYmFsIGgyNjRfaWRjdDhfZGNfYWRkXzEwLDMsNCw3CisgICAgbW92c3hkaWZuaWRuIHIyLCByMmQKICAgICBtb3ZkICAgICAgbTAsIFtyMV0KICAgICBtb3YgZHdvcmRbcjFdLCAwCiAgICAgcGFkZGQgICAgIG0wLCBbcGRfMzJdCkBAIC0yNzksNiArMjgzLDcgQEAKICAgICByZXQKIAogY2dsb2JhbCBoMjY0X2lkY3RfYWRkMTZpbnRyYV8xMCw1LDcsOAorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCiAgICAgQUREMTZfT1BfSU5UUkEgMCwgNCsxKjgKICAgICBBREQxNl9PUF9JTlRSQSAyLCA0KzIqOAogICAgIEFERDE2X09QX0lOVFJBIDQsIDYrMSo4CkBAIC0zMTMsNiArMzE4LDcgQEAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJW1hY3JvIElEQ1RfQUREOCAwCiBjZ2xvYmFsIGgyNjRfaWRjdF9hZGQ4XzEwLDUsOCw3CisgICAgbW92c3hkaWZuaWRuIHIzLCByM2QKICVpZiBBUkNIX1g4Nl82NAogICAgIG1vdiAgICAgIHI3LCByMAogJWVuZGlmCkBAIC0zNDUsNiArMzUxLDU5IEBACiAlZW5kaWYKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfaDI2NF9pZGN0X2FkZDhfNDIyXzEwKHBpeGVsICoqZHN0LCBjb25zdCBpbnQgKmJsb2NrX29mZnNldCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGludCBzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3Qgbm56Y1s2KjhdKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislYXNzaWduIGxhc3RfYmxvY2sgNDQKKworJW1hY3JvIElEQ1RfQUREOF80MjIgMAorCitjZ2xvYmFsIGgyNjRfaWRjdF9hZGQ4XzQyMl8xMCwgNSwgOCwgNworICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICByNywgcjAKKyVlbmRpZgorCisgICAgYWRkICAgICAgcjIsIDEwMjQKKyAgICBtb3YgICAgICByMCwgW3IwXQorICAgIEFERDE2X09QX0lOVFJBIDE2LCA0KyA2KjgKKyAgICBBREQxNl9PUF9JTlRSQSAxOCwgNCsgNyo4CisgICAgQUREMTZfT1BfSU5UUkEgMjQsIDQrIDgqOCA7IGkrNAorICAgIEFERDE2X09QX0lOVFJBIDI2LCA0KyA5KjggOyBpKzQKKyAgICBhZGQgICAgICByMiwgMTAyNC0xMjgqNAorCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3YgICAgICByMCwgW3I3K2dwcnNpemVdCislZWxzZQorICAgIG1vdiAgICAgIHIwLCByMG0KKyAgICBtb3YgICAgICByMCwgW3IwK2dwcnNpemVdCislZW5kaWYKKworICAgIEFERDE2X09QX0lOVFJBIDMyLCA0KzExKjgKKyAgICBBREQxNl9PUF9JTlRSQSAzNCwgNCsxMio4CisgICAgQUREMTZfT1BfSU5UUkEgNDAsIDQrMTMqOCA7IGkrNAorICAgIEFERDE2X09QX0lOVFJBIDQyLCA0KzE0KjggOyBpKzQKK1JFUF9SRVQKKyAgICBBQyAxNgorICAgIEFDIDE4CisgICAgQUMgMjQgOyBpKzQKKyAgICBBQyAyNiA7IGkrNAorICAgIEFDIDMyCisgICAgQUMgMzQKKyAgICBBQyA0MCA7IGkrNAorICAgIEFDIDQyIDsgaSs0CisKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitJRENUX0FERDhfNDIyCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWE1NIGF2eAorSURDVF9BREQ4XzQyMgorJWVuZGlmCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIGZmX2gyNjRfaWRjdDhfYWRkXzEwKHBpeGVsICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gSURDVDhfMUQgMgpAQCAtNDQ5LDYgKzUwOCw3IEBACiAKICVtYWNybyBJRENUOF9BREQgMAogY2dsb2JhbCBoMjY0X2lkY3Q4X2FkZF8xMCwgMyw0LDE2CisgICAgbW92c3hkaWZuaWRuIHIyLCByMmQKICVpZiBVTklYNjQgPT0gMAogICAgICVhc3NpZ24gcGFkIDE2LWdwcnNpemUtKHN0YWNrX29mZnNldCYxNSkKICAgICBzdWIgIHJzcCwgcGFkCkBAIC01NzMsNiArNjMzLDcgQEAKIAogJW1hY3JvIElEQ1Q4X0FERDQgMAogY2dsb2JhbCBoMjY0X2lkY3Q4X2FkZDRfMTAsIDAsNywxNgorICAgIG1vdnN4ZGlmbmlkbiByMywgcjNkCiAgICAgJWFzc2lnbiBwYWQgMTYtZ3Byc2l6ZS0oc3RhY2tfb2Zmc2V0JjE1KQogICAgIFNVQiAgICAgIHJzcCwgcGFkCiAgICAgbW92ICAgICAgIHI1LCByMG1wCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZC5hc20gYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZC5hc20KaW5kZXggYzg4ZDkxYi4uZjNhYTMxNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaDI2NF9pbnRyYXByZWQuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2gyNjRfaW50cmFwcmVkLmFzbQpAQCAtNDksNyArNDksNyBAQAogY2V4dGVybiBwd18zMgogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkMTZ4MTZfdmVydGljYWxfOCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDE2eDE2X3ZlcnRpY2FsXzgodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElOSVRfTU1YIG1teApAQCAtODUsNyArODUsNyBAQAogICAgIFJFUF9SRVQKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDE2eDE2X2hvcml6b250YWxfOCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDE2eDE2X2hvcml6b250YWxfOCh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogJW1hY3JvIFBSRUQxNngxNl9IIDAKQEAgLTEyNiw3ICsxMjYsNyBAQAogUFJFRDE2eDE2X0gKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDE2eDE2X2RjXzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQxNngxNl9kY184KHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAlbWFjcm8gUFJFRDE2eDE2X0RDIDAKQEAgLTE4OCw3ICsxODgsNyBAQAogUFJFRDE2eDE2X0RDCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQxNngxNl90bV92cDhfOCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDE2eDE2X3RtX3ZwOF84KHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAlbWFjcm8gUFJFRDE2eDE2X1RNIDAKQEAgLTI2OCw4ICsyNjgsNDUgQEAKICAgICBqZyAubG9vcAogICAgIFJFUF9SRVQKIAorJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorY2dsb2JhbCBwcmVkMTZ4MTZfdG1fdnA4XzgsIDIsIDQsIDUsIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBpdGVyYXRpb24KKyAgICBzdWIgICAgICAgICAgICAgICAgICAgICAgIGRzdHEsIHN0cmlkZXEKKyAgICBwbW92enhidyAgICAgICAgICAgICAgICAgICAgbTAsIFtkc3RxXQorICAgIHZwYnJvYWRjYXN0YiAgICAgICAgICAgICAgIHhtMSwgW3IwLTFdCisgICAgcG1vdnp4YncgICAgICAgICAgICAgICAgICAgIG0xLCB4bTEKKyAgICBwc3VidyAgICAgICAgICAgICAgICAgICAgICAgbTAsIG0xCisgICAgbW92ICAgICAgICAgICAgICAgICBpdGVyYXRpb25kLCA0CisgICAgbGVhICAgICAgICAgICAgICAgICAgIHN0cmlkZTNxLCBbc3RyaWRlcSozXQorLmxvb3A6CisgICAgdnBicm9hZGNhc3RiICAgICAgICAgICAgICAgeG0xLCBbZHN0cStzdHJpZGVxKjEtMV0KKyAgICB2cGJyb2FkY2FzdGIgICAgICAgICAgICAgICB4bTIsIFtkc3RxK3N0cmlkZXEqMi0xXQorICAgIHZwYnJvYWRjYXN0YiAgICAgICAgICAgICAgIHhtMywgW2RzdHErc3RyaWRlM3EtMV0KKyAgICB2cGJyb2FkY2FzdGIgICAgICAgICAgICAgICB4bTQsIFtkc3RxK3N0cmlkZXEqNC0xXQorICAgIHBtb3Z6eGJ3ICAgICAgICAgICAgICAgICAgICBtMSwgeG0xCisgICAgcG1vdnp4YncgICAgICAgICAgICAgICAgICAgIG0yLCB4bTIKKyAgICBwbW92enhidyAgICAgICAgICAgICAgICAgICAgbTMsIHhtMworICAgIHBtb3Z6eGJ3ICAgICAgICAgICAgICAgICAgICBtNCwgeG00CisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgICAgIG0xLCBtMAorICAgIHBhZGR3ICAgICAgICAgICAgICAgICAgICAgICBtMiwgbTAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICAgICAgICAgbTMsIG0wCisgICAgcGFkZHcgICAgICAgICAgICAgICAgICAgICAgIG00LCBtMAorICAgIHZwYWNrdXN3YiAgICAgICAgICAgICAgICAgICBtMSwgbTEsIG0yCisgICAgdnBhY2t1c3diICAgICAgICAgICAgICAgICAgIG0zLCBtMywgbTQKKyAgICB2cGVybXEgICAgICAgICAgICAgICAgICAgICAgbTEsIG0xLCBxMzEyMAorICAgIHZwZXJtcSAgICAgICAgICAgICAgICAgICAgICBtMywgbTMsIHEzMTIwCisgICAgbW92ZHFhICAgICAgICBbZHN0cStzdHJpZGVxKjFdLCB4bTEKKyAgICB2ZXh0cmFjdGkxMjggIFtkc3RxK3N0cmlkZXEqMl0sIG0xLCAxCisgICAgbW92ZHFhICAgICAgIFtkc3RxK3N0cmlkZTNxKjFdLCB4bTMKKyAgICB2ZXh0cmFjdGkxMjggIFtkc3RxK3N0cmlkZXEqNF0sIG0zLCAxCisgICAgbGVhICAgICAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgZGVjICAgICAgICAgICAgICAgICBpdGVyYXRpb25kCisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kaWYKKwogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDE2eDE2X3BsYW5lXypfOCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDE2eDE2X3BsYW5lXypfOCh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogJW1hY3JvIEgyNjRfUFJFRDE2eDE2X1BMQU5FIDEKQEAgLTU1MCw3ICs1ODcsNyBAQAogSDI2NF9QUkVEMTZ4MTZfUExBTkUgc3ZxMwogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkOHg4X3BsYW5lXzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQ4eDhfcGxhbmVfOCh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogJW1hY3JvIEgyNjRfUFJFRDh4OF9QTEFORSAwCkBAIC03MjQsNyArNzYxLDcgQEAKIEgyNjRfUFJFRDh4OF9QTEFORQogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkOHg4X3ZlcnRpY2FsXzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQ4eDhfdmVydGljYWxfOCh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSU5JVF9NTVggbW14CkBAIC03NDEsNyArNzc4LDcgQEAKICAgICBSRVQKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDh4OF9ob3Jpem9udGFsXzgodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQ4eDhfaG9yaXpvbnRhbF84KHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAlbWFjcm8gUFJFRDh4OF9IIDAKQEAgLTc2OSw3ICs4MDYsNyBAQAogUFJFRDh4OF9ICiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ4eDhfdG9wX2RjXzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkOHg4X3RvcF9kY184X21teGV4dCh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIElOSVRfTU1YIG1teGV4dAogY2dsb2JhbCBwcmVkOHg4X3RvcF9kY184LCAyLDUKQEAgLTgwMyw3ICs4NDAsNyBAQAogICAgIFJFVAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkOHg4X2RjXzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkOHg4X2RjXzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJTklUX01NWCBtbXhleHQKQEAgLTg2NCw3ICs5MDEsNyBAQAogICAgIFJFVAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkOHg4X2RjX3J2NDBfOCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDh4OF9kY19ydjQwXzgodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElOSVRfTU1YIG1teGV4dApAQCAtOTAxLDcgKzkzOCw3IEBACiAgICAgUkVQX1JFVAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkOHg4X3RtX3ZwOF84KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkOHg4X3RtX3ZwOF84KHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAlbWFjcm8gUFJFRDh4OF9UTSAwCkBAIC0xMDE0LDcgKzEwNTEsNyBAQAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9wcmVkOHg4bF90b3BfZGNfOCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBQUkVEOHg4TF9UT1BfREMgMAogY2dsb2JhbCBwcmVkOHg4bF90b3BfZGNfOCwgNCw0CkBAIC0xMDcwLDcgKzExMDcsNyBAQAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9wcmVkOHg4bF9kY184KHVpbnQ4X3QgKnNyYywgaW50IGhhc190b3BsZWZ0LCBpbnQgaGFzX3RvcHJpZ2h0LAotOyAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkKKzsgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogJW1hY3JvIFBSRUQ4eDhMX0RDIDAKQEAgLTExNzQsNyArMTIxMSw3IEBACiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIGZmX3ByZWQ4eDhsX2hvcml6b250YWxfOCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgaW50IHN0cmlkZSkKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAlbWFjcm8gUFJFRDh4OExfSE9SSVpPTlRBTCAwCkBAIC0xMjQ2LDcgKzEyODMsNyBAQAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9wcmVkOHg4bF92ZXJ0aWNhbF84KHVpbnQ4X3QgKnNyYywgaW50IGhhc190b3BsZWZ0LCBpbnQgaGFzX3RvcHJpZ2h0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogJW1hY3JvIFBSRUQ4eDhMX1ZFUlRJQ0FMIDAKQEAgLTEyOTcsNyArMTMzNCw3IEBACiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIGZmX3ByZWQ4eDhsX2Rvd25fbGVmdF84KHVpbnQ4X3QgKnNyYywgaW50IGhhc190b3BsZWZ0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIGludCBzdHJpZGUpCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJTklUX01NWCBtbXhleHQKQEAgLTE0OTgsNyArMTUzNSw3IEBACiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIGZmX3ByZWQ4eDhsX2Rvd25fcmlnaHRfOF9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJTklUX01NWCBtbXhleHQKQEAgLTE3NTAsNyArMTc4Nyw3IEBACiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIGZmX3ByZWQ4eDhsX3ZlcnRpY2FsX3JpZ2h0XzgodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJTklUX01NWCBtbXhleHQKQEAgLTE5NzgsNyArMjAxNSw3IEBACiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIGZmX3ByZWQ4eDhsX3ZlcnRpY2FsX2xlZnRfOCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgaW50IHN0cmlkZSkKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAlbWFjcm8gUFJFRDh4OExfVkVSVElDQUxfTEVGVCAwCkBAIC0yMDY4LDcgKzIxMDUsNyBAQAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9wcmVkOHg4bF9ob3Jpem9udGFsX3VwXzgodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIGludCBzdHJpZGUpCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogJW1hY3JvIFBSRUQ4eDhMX0hPUklaT05UQUxfVVAgMApAQCAtMjE1Niw3ICsyMTkzLDcgQEAKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IHZvaWQgZmZfcHJlZDh4OGxfaG9yaXpvbnRhbF9kb3duXzgodWludDhfdCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgaW50IHN0cmlkZSkKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElOSVRfTU1YIG1teGV4dApAQCAtMjQwNCw3ICsyNDQxLDggQEAKIFBSRUQ4eDhMX0hPUklaT05UQUxfRE9XTgogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ0eDRfZGNfOF9tbXhleHQodWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp0b3ByaWdodCwgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkNHg0X2RjXzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSU5JVF9NTVggbW14ZXh0CkBAIC0yNDM1LDcgKzI0NzMsNyBAQAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9wcmVkNHg0X3RtX3ZwOF84X21teGV4dCh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAlbWFjcm8gUFJFRDR4NF9UTSAwCkBAIC0yNTE0LDcgKzI1NTIsNyBAQAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9wcmVkNHg0X3ZlcnRpY2FsX3ZwOF84X21teGV4dCh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJTklUX01NWCBtbXhleHQKQEAgLTI1MzUsNyArMjU3Myw3IEBACiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIGZmX3ByZWQ0eDRfZG93bl9sZWZ0XzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJTklUX01NWCBtbXhleHQKIGNnbG9iYWwgcHJlZDR4NF9kb3duX2xlZnRfOCwgMywzCkBAIC0yNTYyLDcgKzI2MDAsNyBAQAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IHZvaWQgZmZfcHJlZDR4NF92ZXJ0aWNhbF9sZWZ0XzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElOSVRfTU1YIG1teGV4dApAQCAtMjU4OCw3ICsyNjI2LDcgQEAKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIGZmX3ByZWQ0eDRfaG9yaXpvbnRhbF91cF84X21teGV4dCh1aW50OF90ICpzcmMsIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJTklUX01NWCBtbXhleHQKQEAgLTI2MjIsNyArMjY2MCw4IEBACiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9wcmVkNHg0X2hvcml6b250YWxfZG93bl84X21teGV4dCh1aW50OF90ICpzcmMsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsIGludCBzdHJpZGUpCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSU5JVF9NTVggbW14ZXh0CkBAIC0yNjU4LDcgKzI2OTcsOCBAQAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCBmZl9wcmVkNHg0X3ZlcnRpY2FsX3JpZ2h0XzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIElOSVRfTU1YIG1teGV4dApAQCAtMjY4OSw3ICsyNzI5LDcgQEAKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IHZvaWQgZmZfcHJlZDR4NF9kb3duX3JpZ2h0XzhfbW14ZXh0KHVpbnQ4X3QgKnNyYywgY29uc3QgdWludDhfdCAqdG9wcmlnaHQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogSU5JVF9NTVggbW14ZXh0CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZF8xMGJpdC5hc20gYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZF8xMGJpdC5hc20KaW5kZXggOWU0MGNmZS4uNjI5ZTBhNyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaDI2NF9pbnRyYXByZWRfMTBiaXQuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2gyNjRfaW50cmFwcmVkXzEwYml0LmFzbQpAQCAtNTEsNyArNTEsOCBAQAogJWVuZG1hY3JvCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ0eDRfZG93bl9yaWdodChwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDR4NF9kb3duX3JpZ2h0XzEwKHBpeGVsICpzcmMsIGNvbnN0IHBpeGVsICp0b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJW1hY3JvIFBSRUQ0eDRfRFIgMAogY2dsb2JhbCBwcmVkNHg0X2Rvd25fcmlnaHRfMTAsIDMsIDMKQEAgLTg5LDcgKzkwLDggQEAKICVlbmRpZgogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDR4NF92ZXJ0aWNhbF9yaWdodChwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDR4NF92ZXJ0aWNhbF9yaWdodF8xMChwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJW1hY3JvIFBSRUQ0eDRfVlIgMAogY2dsb2JhbCBwcmVkNHg0X3ZlcnRpY2FsX3JpZ2h0XzEwLCAzLCAzLCA2CkBAIC0xMjgsNyArMTMwLDggQEAKICVlbmRpZgogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ0eDRfaG9yaXpvbnRhbF9kb3duKHBpeGVsICpzcmMsIGNvbnN0IHBpeGVsICp0b3ByaWdodCwgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkNHg0X2hvcml6b250YWxfZG93bl8xMChwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gUFJFRDR4NF9IRCAwCiBjZ2xvYmFsIHByZWQ0eDRfaG9yaXpvbnRhbF9kb3duXzEwLCAzLCAzCkBAIC0xNzAsNyArMTczLDcgQEAKICVlbmRpZgogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkNHg0X2RjKHBpeGVsICpzcmMsIGNvbnN0IHBpeGVsICp0b3ByaWdodCwgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkNHg0X2RjXzEwKHBpeGVsICpzcmMsIGNvbnN0IHBpeGVsICp0b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJTklUX01NWCBtbXhleHQKQEAgLTE5NSw3ICsxOTgsOCBAQAogICAgIFJFVAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkNHg0X2Rvd25fbGVmdChwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDR4NF9kb3duX2xlZnRfMTAocGl4ZWwgKnNyYywgY29uc3QgcGl4ZWwgKnRvcHJpZ2h0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBQUkVENHg0X0RMIDAKIGNnbG9iYWwgcHJlZDR4NF9kb3duX2xlZnRfMTAsIDMsIDMKQEAgLTIyNSw3ICsyMjksOCBAQAogJWVuZGlmCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ0eDRfdmVydGljYWxfbGVmdChwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDR4NF92ZXJ0aWNhbF9sZWZ0XzEwKHBpeGVsICpzcmMsIGNvbnN0IHBpeGVsICp0b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJW1hY3JvIFBSRUQ0eDRfVkwgMAogY2dsb2JhbCBwcmVkNHg0X3ZlcnRpY2FsX2xlZnRfMTAsIDMsIDMKQEAgLTI1NCw3ICsyNTksOCBAQAogJWVuZGlmCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ0eDRfaG9yaXpvbnRhbF91cChwaXhlbCAqc3JjLCBjb25zdCBwaXhlbCAqdG9wcmlnaHQsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDR4NF9ob3Jpem9udGFsX3VwXzEwKHBpeGVsICpzcmMsIGNvbnN0IHBpeGVsICp0b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSU5JVF9NTVggbW14ZXh0CiBjZ2xvYmFsIHByZWQ0eDRfaG9yaXpvbnRhbF91cF8xMCwgMywgMwpAQCAtMjg4LDcgKzI5NCw3IEBACiAKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDh4OF92ZXJ0aWNhbChwaXhlbCAqc3JjLCBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQ4eDhfdmVydGljYWxfMTAocGl4ZWwgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSU5JVF9YTU0gc3NlMgogY2dsb2JhbCBwcmVkOHg4X3ZlcnRpY2FsXzEwLCAyLCAyCkBAIC0zMDQsNyArMzEwLDcgQEAKICAgICBSRVQKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDh4OF9ob3Jpem9udGFsKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDh4OF9ob3Jpem9udGFsXzEwKHBpeGVsICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIElOSVRfWE1NIHNzZTIKIGNnbG9iYWwgcHJlZDh4OF9ob3Jpem9udGFsXzEwLCAyLCAzCkBAIC0zMjQsNyArMzMwLDcgQEAKICAgICBSRVBfUkVUCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWRpY3RfOHg4X2RjKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZGljdF84eDhfZGNfMTAocGl4ZWwgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJW1hY3JvIE1PVjggMi0zCiA7IHNvcnQgb2YgYSBoYWNrLCBidXQgaXQgd29ya3MKQEAgLTQxMSw3ICs0MTcsNyBAQAogUFJFRDh4OF9EQyBwc2h1Zmx3CiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ4eDhfdG9wX2RjKHBpeGVsICpzcmMsIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDh4OF90b3BfZGNfMTAocGl4ZWwgKnNyYywgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogSU5JVF9YTU0gc3NlMgogY2dsb2JhbCBwcmVkOHg4X3RvcF9kY18xMCwgMiwgNApAQCAtNDM4LDcgKzQ0NCw3IEBACiAgICAgUkVUCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ4eDhfcGxhbmUocGl4ZWwgKnNyYywgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkOHg4X3BsYW5lXzEwKHBpeGVsICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIElOSVRfWE1NIHNzZTIKIGNnbG9iYWwgcHJlZDh4OF9wbGFuZV8xMCwgMiwgNywgNwpAQCAtNTAxLDggKzUwNyw4IEBACiAKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDh4OGxfMTI4X2RjKHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkOHg4bF8xMjhfZGNfMTAocGl4ZWwgKnNyYywgaW50IGhhc190b3BsZWZ0LCBpbnQgaGFzX3RvcHJpZ2h0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gUFJFRDh4OExfMTI4X0RDIDAKIGNnbG9iYWwgcHJlZDh4OGxfMTI4X2RjXzEwLCA0LCA0CkBAIC01MjYsOCArNTMyLDggQEAKIFBSRUQ4eDhMXzEyOF9EQwogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkOHg4bF90b3BfZGMocGl4ZWwgKnNyYywgaW50IGhhc190b3BsZWZ0LCBpbnQgaGFzX3RvcHJpZ2h0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQ4eDhsX3RvcF9kY18xMChwaXhlbCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsIGludCBoYXNfdG9wcmlnaHQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBQUkVEOHg4TF9UT1BfREMgMAogY2dsb2JhbCBwcmVkOHg4bF90b3BfZGNfMTAsIDQsIDQsIDYKQEAgLTU2Niw3ICs1NzIsOCBAQAogJWVuZGlmCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDh4OGxfZGMocGl4ZWwgKnNyYywgaW50IGhhc190b3BsZWZ0LCBpbnQgaGFzX3RvcHJpZ2h0LCBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQ4eDhsX2RjXzEwKHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDtUT0RPOiBzZWUgaWYgc2NhbGFyIGlzIGZhc3RlcgogJW1hY3JvIFBSRUQ4eDhMX0RDIDAKQEAgLTYyNSw4ICs2MzIsOCBAQAogJWVuZGlmCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ4eDhsX3ZlcnRpY2FsKHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQ4eDhsX3ZlcnRpY2FsXzEwKHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gUFJFRDh4OExfVkVSVElDQUwgMAogY2dsb2JhbCBwcmVkOHg4bF92ZXJ0aWNhbF8xMCwgNCwgNCwgNgpAQCAtNjYxLDggKzY2OCw4IEBACiAlZW5kaWYKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDh4OGxfaG9yaXpvbnRhbCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDh4OGxfaG9yaXpvbnRhbF8xMCh1aW50OF90ICpzcmMsIGludCBoYXNfdG9wbGVmdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBQUkVEOHg4TF9IT1JJWk9OVEFMIDAKIGNnbG9iYWwgcHJlZDh4OGxfaG9yaXpvbnRhbF8xMCwgNCwgNCwgNQpAQCAtNzE4LDggKzcyNSw4IEBACiAlZW5kaWYKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDh4OGxfZG93bl9sZWZ0KHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkOHg4bF9kb3duX2xlZnRfMTAocGl4ZWwgKnNyYywgaW50IGhhc190b3BsZWZ0LCBpbnQgaGFzX3RvcHJpZ2h0LAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gUFJFRDh4OExfRE9XTl9MRUZUIDAKIGNnbG9iYWwgcHJlZDh4OGxfZG93bl9sZWZ0XzEwLCA0LCA0LCA3CkBAIC03ODcsOCArNzk0LDggQEAKICVlbmRpZgogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkOHg4bF9kb3duX3JpZ2h0KHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwgaW50IGhhc190b3ByaWdodCwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpCis7IHZvaWQgZmZfcHJlZDh4OGxfZG93bl9yaWdodF8xMChwaXhlbCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX3RvcHJpZ2h0LCBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gUFJFRDh4OExfRE9XTl9SSUdIVCAwCiA7IHN0YW5kYXJkIGZvcmJpZHMgdGhpcyB3aGVuIGhhc190b3BsZWZ0IGlzIGZhbHNlCkBAIC04NjIsOCArODY5LDggQEAKICVlbmRpZgogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBmZl9wcmVkOHg4bF92ZXJ0aWNhbF9yaWdodChwaXhlbCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCi07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkOHg4bF92ZXJ0aWNhbF9yaWdodF8xMChwaXhlbCAqc3JjLCBpbnQgaGFzX3RvcGxlZnQsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgcHRyZGlmZl90IHN0cmlkZSkKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJW1hY3JvIFBSRUQ4eDhMX1ZFUlRJQ0FMX1JJR0hUIDAKIDsgbGlrZXdpc2Ugd2l0aCA4eDhsX2Rvd25fcmlnaHQKQEAgLTkzMyw4ICs5NDAsOCBAQAogJWVuZGlmCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQ4eDhsX2hvcml6b250YWxfdXAocGl4ZWwgKnNyYywgaW50IGhhc190b3BsZWZ0LAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhc190b3ByaWdodCwgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkOHg4bF9ob3Jpem9udGFsX3VwXzEwKHBpeGVsICpzcmMsIGludCBoYXNfdG9wbGVmdCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfdG9wcmlnaHQsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBQUkVEOHg4TF9IT1JJWk9OVEFMX1VQIDAKIGNnbG9iYWwgcHJlZDh4OGxfaG9yaXpvbnRhbF91cF8xMCwgNCwgNCwgNgpAQCAtOTk2LDcgKzEwMDMsNyBAQAogCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQxNngxNl92ZXJ0aWNhbChwaXhlbCAqc3JjLCBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQxNngxNl92ZXJ0aWNhbF8xMChwaXhlbCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gTU9WMTYgMy01CiAgICAgbW92YSBbJTErICAgICAwXSwgJTIKQEAgLTEwMzIsNyArMTAzOSw3IEBACiBQUkVEMTZ4MTZfVkVSVElDQUwKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDE2eDE2X2hvcml6b250YWwocGl4ZWwgKnNyYywgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkMTZ4MTZfaG9yaXpvbnRhbF8xMChwaXhlbCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gUFJFRDE2eDE2X0hPUklaT05UQUwgMAogY2dsb2JhbCBwcmVkMTZ4MTZfaG9yaXpvbnRhbF8xMCwgMiwgMwpAQCAtMTA1Niw3ICsxMDYzLDcgQEAKIFBSRUQxNngxNl9IT1JJWk9OVEFMCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQxNngxNl9kYyhwaXhlbCAqc3JjLCBpbnQgc3RyaWRlKQorOyB2b2lkIGZmX3ByZWQxNngxNl9kY18xMChwaXhlbCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gUFJFRDE2eDE2X0RDIDAKIGNnbG9iYWwgcHJlZDE2eDE2X2RjXzEwLCAyLCA2CkBAIC0xMTAyLDcgKzExMDksNyBAQAogUFJFRDE2eDE2X0RDCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQxNngxNl90b3BfZGMocGl4ZWwgKnNyYywgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkMTZ4MTZfdG9wX2RjXzEwKHBpeGVsICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBQUkVEMTZ4MTZfVE9QX0RDIDAKIGNnbG9iYWwgcHJlZDE2eDE2X3RvcF9kY18xMCwgMiwgMwpAQCAtMTEzNCw3ICsxMTQxLDcgQEAKIFBSRUQxNngxNl9UT1BfREMKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfcHJlZDE2eDE2X2xlZnRfZGMocGl4ZWwgKnNyYywgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkMTZ4MTZfbGVmdF9kY18xMChwaXhlbCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlKQogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAlbWFjcm8gUFJFRDE2eDE2X0xFRlRfREMgMAogY2dsb2JhbCBwcmVkMTZ4MTZfbGVmdF9kY18xMCwgMiwgNgpAQCAtMTE3MSw3ICsxMTc4LDcgQEAKIFBSRUQxNngxNl9MRUZUX0RDCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ByZWQxNngxNl8xMjhfZGMocGl4ZWwgKnNyYywgaW50IHN0cmlkZSkKKzsgdm9pZCBmZl9wcmVkMTZ4MTZfMTI4X2RjXzEwKHBpeGVsICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICVtYWNybyBQUkVEMTZ4MTZfMTI4X0RDIDAKIGNnbG9iYWwgcHJlZDE2eDE2XzEyOF9kY18xMCwgMiwzCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9oMjY0X2ludHJhcHJlZF9pbml0LmMKaW5kZXggNTI4YjkyZS4uYmRkNTEyNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaDI2NF9pbnRyYXByZWRfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L2gyNjRfaW50cmFwcmVkX2luaXQuYwpAQCAtMTI3LDYgKzEyNyw3IEBACiBQUkVEMTZ4MTYodG1fdnA4LCA4LCBtbXgpCiBQUkVEMTZ4MTYodG1fdnA4LCA4LCBtbXhleHQpCiBQUkVEMTZ4MTYodG1fdnA4LCA4LCBzc2UyKQorUFJFRDE2eDE2KHRtX3ZwOCwgOCwgYXZ4MikKIAogUFJFRDh4OCh0b3BfZGMsIDgsIG1teGV4dCkKIFBSRUQ4eDgoZGNfcnY0MCwgOCwgbW14ZXh0KQpAQCAtMzIzLDYgKzMyNCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIGlmKEVYVEVSTkFMX0FWWDIoY3B1X2ZsYWdzKSl7CisgICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4KSB7CisgICAgICAgICAgICAgICAgaC0+cHJlZDE2eDE2W1BMQU5FX1BSRUQ4eDggICAgXSA9IGZmX3ByZWQxNngxNl90bV92cDhfOF9hdngyOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChiaXRfZGVwdGggPT0gMTApIHsKICAgICAgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CiAgICAgICAgICAgICBoLT5wcmVkNHg0W0RDX1BSRUQgICAgICAgICAgICAgXSA9IGZmX3ByZWQ0eDRfZGNfMTBfbW14ZXh0OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaDI2NF9xcGVsLmMgYi9saWJhdmNvZGVjL3g4Ni9oMjY0X3FwZWwuYwppbmRleCBkNzU5ZTg4Li4wZDNkYmJhIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9oMjY0X3FwZWwuYworKysgYi9saWJhdmNvZGVjL3g4Ni9oMjY0X3FwZWwuYwpAQCAtMjMsMTIgKzIzLDEyIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRkZWMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRxcGVsLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9waXhlbHMuaCIKICNpbmNsdWRlICJmcGVsLmgiCiAKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogdm9pZCBmZl9wdXRfcGl4ZWxzNF9sMl9tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZSwgaW50IHNyYzFTdHJpZGUsIGludCBoKTsKIHZvaWQgZmZfYXZnX3BpeGVsczRfbDJfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKQEAgLTcxLDYgKzcxLDE3IEBACiBERUZfUVBFTChhdmcpCiBERUZfUVBFTChwdXQpCiAKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfcHV0X2gyNjRfcXBlbDhvcjE2X2h2MV9sb3dwYXNzX21teGV4dChpbnQxNl90ICp0bXAsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHRtcFN0cmlkZSwgaW50IHNyY1N0cmlkZSwgaW50IHNpemUpCit7CisgICAgaW50IHcgPSAoc2l6ZSArIDgpID4+IDI7CisgICAgc3JjIC09IDIgKiBzcmNTdHJpZGUgKyAyOworICAgIHdoaWxlICh3LS0pIHsKKyAgICAgICAgZmZfcHV0X2gyNjRfcXBlbDhvcjE2X2h2MV9sb3dwYXNzX29wX21teGV4dChzcmMsIHRtcCwgc3JjU3RyaWRlLCBzaXplKTsKKyAgICAgICAgdG1wICs9IDQ7CisgICAgICAgIHNyYyArPSA0OworICAgIH0KK30KKwogI2RlZmluZSBRUEVMX0gyNjQoT1BOQU1FLCBPUCwgTU1YKVwKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw0X2h2X2xvd3Bhc3NfICMjIE1NWCh1aW50OF90ICpkc3QsIGludDE2X3QgKnRtcCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgZHN0U3RyaWRlLCBpbnQgdG1wU3RyaWRlLCBpbnQgc3JjU3RyaWRlKXtcCiAgICAgaW50IHc9MztcCkBAIC05MSwxNSArMTAyLDYgQEAKICAgICBkc3QgKz0gNDtcCiAgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl92X2xvd3Bhc3Nfb3BfbW14ZXh0KGRzdCwgc3JjLCBkc3RTdHJpZGUsIHNyY1N0cmlkZSwgaCk7XAogfVwKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odjFfbG93cGFzc18gIyMgTU1YKGludDE2X3QgKnRtcCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgdG1wU3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQgc2l6ZSl7XAotICAgIGludCB3ID0gKHNpemUrOCk+PjI7XAotICAgIHNyYyAtPSAyKnNyY1N0cmlkZSsyO1wKLSAgICB3aGlsZSh3LS0pe1wKLSAgICAgICAgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odjFfbG93cGFzc19vcF9tbXhleHQoc3JjLCB0bXAsIHNyY1N0cmlkZSwgc2l6ZSk7XAotICAgICAgICB0bXAgKz0gNDtcCi0gICAgICAgIHNyYyArPSA0O1wKLSAgICB9XAotfVwKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmZfICMjIE9QTkFNRSAjIyBoMjY0X3FwZWw4b3IxNl9odjJfbG93cGFzc18gIyMgTU1YKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqdG1wLCBpbnQgZHN0U3RyaWRlLCBpbnQgdG1wU3RyaWRlLCBpbnQgc2l6ZSl7XAogICAgIGludCB3ID0gc2l6ZT4+NDtcCiAgICAgZG97XApAQCAtNDk3LDcgKzQ5OSw3IEBACiBRUEVMMTYobW14ZXh0KQogI2VuZGlmCiAKLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogCiAjZGVmaW5lIFNFVF9RUEVMX0ZVTkNTKFBGWCwgSURYLCBTSVpFLCBDUFUsIFBSRUZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTM3LDcgKzUzOSw3IEBACiAKIGF2X2NvbGQgdm9pZCBmZl9oMjY0cXBlbF9pbml0X3g4NihIMjY0UXBlbENvbnRleHQgKmMsIGludCBiaXRfZGVwdGgpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgaGlnaF9iaXRfZGVwdGggPSBiaXRfZGVwdGggPiA4OwogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKQEAgLTU2MiwxMSArNTY0LDYgQEAKICAgICB9CiAKICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIGlmICghKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTRTJTTE9XKSAmJiAhaGlnaF9iaXRfZGVwdGgpIHsKLSAgICAgICAgICAgIC8vIHRoZXNlIGZ1bmN0aW9ucyBhcmUgc2xvd2VyIHRoYW4gbW14IG9uIEFNRCwgYnV0IGZhc3RlciBvbiBJbnRlbAotICAgICAgICAgICAgSDI2NF9RUEVMX0ZVTkNTKDAsIDAsIHNzZTIpOwotICAgICAgICB9Ci0KICAgICAgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCkgewogICAgICAgICAgICAgSDI2NF9RUEVMX0ZVTkNTKDAsIDEsIHNzZTIpOwogICAgICAgICAgICAgSDI2NF9RUEVMX0ZVTkNTKDAsIDIsIHNzZTIpOwpAQCAtNTkzLDYgKzU5MCwxMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKEVYVEVSTkFMX1NTRTJfRkFTVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmICghaGlnaF9iaXRfZGVwdGgpIHsKKyAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DUygwLCAwLCBzc2UyKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CiAgICAgICAgIGlmICghaGlnaF9iaXRfZGVwdGgpIHsKICAgICAgICAgICAgIEgyNjRfUVBFTF9GVU5DUygxLCAwLCBzc3NlMyk7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oMjY0X3dlaWdodC5hc20gYi9saWJhdmNvZGVjL3g4Ni9oMjY0X3dlaWdodC5hc20KaW5kZXggNmM1N2Q1Ny4uMDk3NWQ3NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaDI2NF93ZWlnaHQuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2gyNjRfd2VpZ2h0LmFzbQpAQCAtMTM0LDE2ICsxMzQsMTYgQEAKICAgICBtb3YgIG9mZl9yZWdkLCByN20KICAgICBhZGQgIG9mZl9yZWdkLCAxCiAgICAgb3IgICBvZmZfcmVnZCwgMQotICAgIGFkZCAgICAgICAgcjQsIDEKLSAgICBjbXAgICAgICAgIHI2ZCwgMTI4CisgICAgYWRkICAgICAgIHI0ZCwgMQorICAgIGNtcCAgICAgICByNmQsIDEyOAogICAgIGplIC5ub25ub3JtYWwKLSAgICBjbXAgICAgICAgIHI1LCAxMjgKKyAgICBjbXAgICAgICAgcjVkLCAxMjgKICAgICBqbmUgLm5vcm1hbAogLm5vbm5vcm1hbDoKLSAgICBzYXIgICAgICAgIHI1LCAxCi0gICAgc2FyICAgICAgICByNiwgMQorICAgIHNhciAgICAgICByNWQsIDEKKyAgICBzYXIgICAgICAgcjZkLCAxCiAgICAgc2FyICBvZmZfcmVnZCwgMQotICAgIHN1YiAgICAgICAgcjQsIDEKKyAgICBzdWIgICAgICAgcjRkLCAxCiAubm9ybWFsOgogJWlmIGNwdWZsYWcoc3NzZTMpCiAgICAgbW92ZCAgICAgICBtNCwgcjVkCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oMjY0Y2hyb21hX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L2gyNjRjaHJvbWFfaW5pdC5jCmluZGV4IGUwOGFmMjcuLjM2YmYyOWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2gyNjRjaHJvbWFfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L2gyNjRjaHJvbWFfaW5pdC5jCkBAIC0yNSwzOCArMjUsMzggQEAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjRjaHJvbWEuaCIKIAogdm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM4X3JuZF9tbXggICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X3JuZF9tbXhleHQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9hdmdfaDI2NF9jaHJvbWFfbWM4X3JuZF8zZG5vdyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogCiB2b2lkIGZmX3B1dF9oMjY0X2Nocm9tYV9tYzRfbW14ICAgICAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiB2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfbW14ZXh0ICAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiB2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfM2Rub3cgICAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKIHZvaWQgZmZfcHV0X2gyNjRfY2hyb21hX21jMl9tbXhleHQgICAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKIHZvaWQgZmZfYXZnX2gyNjRfY2hyb21hX21jMl9tbXhleHQgICAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKIAogdm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM4X3JuZF9zc3NlMyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9wdXRfaDI2NF9jaHJvbWFfbWM0X3Nzc2UzICAgICh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogCiB2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzhfcm5kX3Nzc2UzKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiB2b2lkIGZmX2F2Z19oMjY0X2Nocm9tYV9tYzRfc3NzZTMgICAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKICNkZWZpbmUgQ0hST01BX01DKE9QLCBOVU0sIERFUFRILCBPUFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIHZvaWQgZmZfICMjIE9QICMjIF9oMjY0X2Nocm9tYV9tYyAjIyBOVU0gIyMgXyAjIyBERVBUSCAjIyBfICMjIE9QVCAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKIENIUk9NQV9NQyhwdXQsIDIsIDEwLCBtbXhleHQpCiBDSFJPTUFfTUMoYXZnLCAyLCAxMCwgbW14ZXh0KQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaDI2NGRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9oMjY0ZHNwX2luaXQuYwppbmRleCBjOGNkMDY1Li4zOWY2NWMxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9oMjY0ZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9oMjY0ZHNwX2luaXQuYwpAQCAtMzIsOCArMzIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKIAogSURDVF9BRERfRlVOQygsIDgsIG1teCkKK0lEQ1RfQUREX0ZVTkMoLCA4LCBzc2UyKQorSURDVF9BRERfRlVOQygsIDgsIGF2eCkKIElEQ1RfQUREX0ZVTkMoLCAxMCwgc3NlMikKIElEQ1RfQUREX0ZVTkMoX2RjLCA4LCBtbXhleHQpCitJRENUX0FERF9GVU5DKF9kYywgOCwgc3NlMikKK0lEQ1RfQUREX0ZVTkMoX2RjLCA4LCBhdngpCiBJRENUX0FERF9GVU5DKF9kYywgMTAsIG1teGV4dCkKIElEQ1RfQUREX0ZVTkMoOF9kYywgOCwgbW14ZXh0KQogSURDVF9BRERfRlVOQyg4X2RjLCAxMCwgc3NlMikKQEAgLTc4LDYgKzgyLDExIEBACiBJRENUX0FERF9SRVBfRlVOQzIoLCA4LCAxMCwgc3NlMikKIElEQ1RfQUREX1JFUF9GVU5DMigsIDgsIDEwLCBhdngpCiAKK0lEQ1RfQUREX1JFUF9GVU5DMigsIDhfNDIyLCA4LCBtbXgpCisKK0lEQ1RfQUREX1JFUF9GVU5DMigsIDhfNDIyLCAxMCwgc3NlMikKK0lEQ1RfQUREX1JFUF9GVU5DMigsIDhfNDIyLCAxMCwgYXZ4KQorCiB2b2lkIGZmX2gyNjRfbHVtYV9kY19kZXF1YW50X2lkY3RfbW14KGludDE2X3QgKm91dHB1dCwgaW50MTZfdCAqaW5wdXQsIGludCBxbXVsKTsKIHZvaWQgZmZfaDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdF9zc2UyKGludDE2X3QgKm91dHB1dCwgaW50MTZfdCAqaW5wdXQsIGludCBxbXVsKTsKIApAQCAtMTAzLDM0ICsxMTIsNDEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXRhKTsKIAogI2RlZmluZSBMRl9GVU5DUyh0eXBlLCBkZXB0aCkgICAgICAgICAgICAgICAgICAgXAotTEZfRlVOQyhoLCAgY2hyb21hLCAgICAgICBkZXB0aCwgbW14ZXh0KSAgICAgICAgXAotTEZfSUZVTkMoaCwgY2hyb21hX2ludHJhLCBkZXB0aCwgbW14ZXh0KSAgICAgICAgXAotTEZfRlVOQyh2LCAgY2hyb21hLCAgICAgICBkZXB0aCwgbW14ZXh0KSAgICAgICAgXAotTEZfSUZVTkModiwgY2hyb21hX2ludHJhLCBkZXB0aCwgbW14ZXh0KSAgICAgICAgXAotTEZfRlVOQyhoLCAgbHVtYSwgICAgICAgICBkZXB0aCwgbW14ZXh0KSAgICAgICAgXAotTEZfSUZVTkMoaCwgbHVtYV9pbnRyYSwgICBkZXB0aCwgbW14ZXh0KSAgICAgICAgXAotTEZfRlVOQyhoLCAgbHVtYSwgICAgICAgICBkZXB0aCwgc3NlMikgICAgICAgICAgXAotTEZfSUZVTkMoaCwgbHVtYV9pbnRyYSwgICBkZXB0aCwgc3NlMikgICAgICAgICAgXAotTEZfRlVOQyh2LCAgbHVtYSwgICAgICAgICBkZXB0aCwgc3NlMikgICAgICAgICAgXAotTEZfSUZVTkModiwgbHVtYV9pbnRyYSwgICBkZXB0aCwgc3NlMikgICAgICAgICAgXAotTEZfRlVOQyhoLCAgY2hyb21hLCAgICAgICBkZXB0aCwgc3NlMikgICAgICAgICAgXAotTEZfSUZVTkMoaCwgY2hyb21hX2ludHJhLCBkZXB0aCwgc3NlMikgICAgICAgICAgXAotTEZfRlVOQyh2LCAgY2hyb21hLCAgICAgICBkZXB0aCwgc3NlMikgICAgICAgICAgXAotTEZfSUZVTkModiwgY2hyb21hX2ludHJhLCBkZXB0aCwgc3NlMikgICAgICAgICAgXAotTEZfRlVOQyhoLCAgbHVtYSwgICAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgICAgXAotTEZfSUZVTkMoaCwgbHVtYV9pbnRyYSwgICBkZXB0aCwgYXZ4KSAgICAgICAgICAgXAotTEZfRlVOQyh2LCAgbHVtYSwgICAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgICAgXAotTEZfSUZVTkModiwgbHVtYV9pbnRyYSwgICBkZXB0aCwgYXZ4KSAgICAgICAgICAgXAotTEZfRlVOQyhoLCAgY2hyb21hLCAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgICAgXAotTEZfSUZVTkMoaCwgY2hyb21hX2ludHJhLCBkZXB0aCwgYXZ4KSAgICAgICAgICAgXAotTEZfRlVOQyh2LCAgY2hyb21hLCAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgICAgXAotTEZfSUZVTkModiwgY2hyb21hX2ludHJhLCBkZXB0aCwgYXZ4KQorTEZfRlVOQyhoLCAgY2hyb21hLCAgICAgICAgICBkZXB0aCwgbW14ZXh0KSAgICAgXAorTEZfSUZVTkMoaCwgY2hyb21hX2ludHJhLCAgICBkZXB0aCwgbW14ZXh0KSAgICAgXAorTEZfRlVOQyhoLCAgY2hyb21hNDIyLCAgICAgICBkZXB0aCwgbW14ZXh0KSAgICAgXAorTEZfSUZVTkMoaCwgY2hyb21hNDIyX2ludHJhLCBkZXB0aCwgbW14ZXh0KSAgICAgXAorTEZfRlVOQyh2LCAgY2hyb21hLCAgICAgICAgICBkZXB0aCwgbW14ZXh0KSAgICAgXAorTEZfSUZVTkModiwgY2hyb21hX2ludHJhLCAgICBkZXB0aCwgbW14ZXh0KSAgICAgXAorTEZfRlVOQyhoLCAgbHVtYSwgICAgICAgICAgICBkZXB0aCwgbW14ZXh0KSAgICAgXAorTEZfSUZVTkMoaCwgbHVtYV9pbnRyYSwgICAgICBkZXB0aCwgbW14ZXh0KSAgICAgXAorTEZfRlVOQyhoLCAgbHVtYSwgICAgICAgICAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfSUZVTkMoaCwgbHVtYV9pbnRyYSwgICAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfRlVOQyh2LCAgbHVtYSwgICAgICAgICAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfSUZVTkModiwgbHVtYV9pbnRyYSwgICAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfRlVOQyhoLCAgY2hyb21hLCAgICAgICAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfSUZVTkMoaCwgY2hyb21hX2ludHJhLCAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfRlVOQyhoLCAgY2hyb21hNDIyLCAgICAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfSUZVTkMoaCwgY2hyb21hNDIyX2ludHJhLCBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfRlVOQyh2LCAgY2hyb21hLCAgICAgICAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfSUZVTkModiwgY2hyb21hX2ludHJhLCAgICBkZXB0aCwgc3NlMikgICAgICAgXAorTEZfRlVOQyhoLCAgbHVtYSwgICAgICAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfSUZVTkMoaCwgbHVtYV9pbnRyYSwgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfRlVOQyh2LCAgbHVtYSwgICAgICAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfSUZVTkModiwgbHVtYV9pbnRyYSwgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfRlVOQyhoLCAgY2hyb21hLCAgICAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfSUZVTkMoaCwgY2hyb21hX2ludHJhLCAgICBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfRlVOQyhoLCAgY2hyb21hNDIyLCAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfSUZVTkMoaCwgY2hyb21hNDIyX2ludHJhLCBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfRlVOQyh2LCAgY2hyb21hLCAgICAgICAgICBkZXB0aCwgYXZ4KSAgICAgICAgXAorTEZfSUZVTkModiwgY2hyb21hX2ludHJhLCAgICBkZXB0aCwgYXZ4KQorCitMRl9GVU5DKGgsIGx1bWFfbWJhZmYsIDgsIHNzZTIpCitMRl9GVU5DKGgsIGx1bWFfbWJhZmYsIDgsIGF2eCkKIAogTEZfRlVOQ1ModWludDhfdCwgICA4KQogTEZfRlVOQ1ModWludDE2X3QsIDEwKQogCi12b2lkIGZmX2RlYmxvY2tfaF9jaHJvbWE0MjJfOF9tbXhleHQodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsIGludCBiZXRhLCBpbnQ4X3QgKnRjMCk7Ci0KICNpZiBBUkNIX1g4Nl8zMiAmJiBIQVZFX01NWEVYVF9FWFRFUk5BTAogTEZfRlVOQyh2OCwgbHVtYSwgOCwgbW14ZXh0KQogc3RhdGljIHZvaWQgZGVibG9ja192X2x1bWFfOF9tbXhleHQodWludDhfdCAqcGl4LCBpbnQgc3RyaWRlLCBpbnQgYWxwaGEsCkBAIC0xNTcsMTMgKzE3MywxMyBAQAogLyogd2VpZ2h0ZWQgcHJlZGljdGlvbiAqLwogCiAjZGVmaW5lIEgyNjRfV0VJR0hUKFcsIE9QVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi12b2lkIGZmX2gyNjRfd2VpZ2h0XyAjIyBXICMjIF8gIyMgT1BUKHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgICAgICAgICBcCit2b2lkIGZmX2gyNjRfd2VpZ2h0XyAjIyBXICMjIF8gIyMgT1BUKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCBsb2cyX2Rlbm9tLCAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsIGludCBvZmZzZXQpOwogCiAjZGVmaW5lIEgyNjRfQklXRUlHSFQoVywgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB2b2lkIGZmX2gyNjRfYml3ZWlnaHRfICMjIFcgIyMgXyAjIyBPUFQodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGhlaWdodCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGhlaWdodCwgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvZzJfZGVub20sIGludCB3ZWlnaHRkLCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodHMsIGludCBvZmZzZXQpOwogCkBAIC0xODMsNyArMTk5LDcgQEAKIAogI2RlZmluZSBIMjY0X1dFSUdIVF8xMChXLCBERVBUSCwgT1BUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogdm9pZCBmZl9oMjY0X3dlaWdodF8gIyMgVyAjIyBfICMjIERFUFRIICMjIF8gIyMgT1BUKHVpbnQ4X3QgKmRzdCwgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2cyX2Rlbm9tLCAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsICAgICAgICAgXApAQCAtMTkyLDcgKzIwOCw3IEBACiAjZGVmaW5lIEgyNjRfQklXRUlHSFRfMTAoVywgREVQVEgsIE9QVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB2b2lkIGZmX2gyNjRfYml3ZWlnaHRfICMjIFcgIyMgXyAjIyBERVBUSCAjIyBfICMjIE9QVCh1aW50OF90ICpkc3QsICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9nMl9kZW5vbSwgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0ZCwgICAgICBcCkBAIC0yMTIsNyArMjI4LDcgQEAKIGF2X2NvbGQgdm9pZCBmZl9oMjY0ZHNwX2luaXRfeDg2KEgyNjREU1BDb250ZXh0ICpjLCBjb25zdCBpbnQgYml0X2RlcHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYV9mb3JtYXRfaWRjKQogewotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKIAogICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSAmJiBjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKQpAQCAtMjI3LDggKzI0MywxMSBAQAogCiAgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkMTYgPSBmZl9oMjY0X2lkY3RfYWRkMTZfOF9tbXg7CiAgICAgICAgICAgICBjLT5oMjY0X2lkY3Q4X2FkZDQgPSBmZl9oMjY0X2lkY3Q4X2FkZDRfOF9tbXg7Ci0gICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKSB7CiAgICAgICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDggPSBmZl9oMjY0X2lkY3RfYWRkOF84X21teDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDggPSBmZl9oMjY0X2lkY3RfYWRkOF80MjJfOF9tbXg7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjLT5oMjY0X2lkY3RfYWRkMTZpbnRyYSA9IGZmX2gyNjRfaWRjdF9hZGQxNmludHJhXzhfbW14OwogICAgICAgICAgICAgaWYgKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX0NNT1YpCiAgICAgICAgICAgICAgICAgYy0+aDI2NF9sdW1hX2RjX2RlcXVhbnRfaWRjdCA9IGZmX2gyNjRfbHVtYV9kY19kZXF1YW50X2lkY3RfbW14OwpAQCAtMjQ5LDYgKzI2OCw3IEBACiAgICAgICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSA9IGZmX2RlYmxvY2tfaF9jaHJvbWFfaW50cmFfOF9tbXhleHQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9kZWJsb2NrX2hfY2hyb21hNDIyXzhfbW14ZXh0OworICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEgPSBmZl9kZWJsb2NrX2hfY2hyb21hNDIyX2ludHJhXzhfbW14ZXh0OwogICAgICAgICAgICAgfQogI2lmIEFSQ0hfWDg2XzMyICYmIEhBVkVfTU1YRVhUX0VYVEVSTkFMCiAgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYSAgICAgICA9IGRlYmxvY2tfdl9sdW1hXzhfbW14ZXh0OwpAQCAtMjg0LDYgKzMwNCwyMyBAQAogICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2x1bWEgICAgICAgPSBmZl9kZWJsb2NrX2hfbHVtYV84X3NzZTI7CiAgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSA9IGZmX2RlYmxvY2tfdl9sdW1hX2ludHJhXzhfc3NlMjsKICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX2ludHJhID0gZmZfZGVibG9ja19oX2x1bWFfaW50cmFfOF9zc2UyOworCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hX21iYWZmID0gZmZfZGVibG9ja19oX2x1bWFfbWJhZmZfOF9zc2UyOworI2VuZGlmCisKKyAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWEgICAgICAgPSBmZl9kZWJsb2NrX3ZfY2hyb21hXzhfc3NlMjsKKyAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEgPSBmZl9kZWJsb2NrX3ZfY2hyb21hX2ludHJhXzhfc3NlMjsKKyAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKSB7CisgICAgICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYSAgICAgICA9IGZmX2RlYmxvY2tfaF9jaHJvbWFfOF9zc2UyOworICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEgPSBmZl9kZWJsb2NrX2hfY2hyb21hX2ludHJhXzhfc3NlMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYSAgICAgICA9IGZmX2RlYmxvY2tfaF9jaHJvbWE0MjJfOF9zc2UyOworICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEgPSBmZl9kZWJsb2NrX2hfY2hyb21hNDIyX2ludHJhXzhfc3NlMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZCAgICAgICAgPSBmZl9oMjY0X2lkY3RfYWRkXzhfc3NlMjsKKyAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9kY19hZGQgICAgID0gZmZfaDI2NF9pZGN0X2RjX2FkZF84X3NzZTI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpIHsKICAgICAgICAgICAgIGMtPmJpd2VpZ2h0X2gyNjRfcGl4ZWxzX3RhYlswXSA9IGZmX2gyNjRfYml3ZWlnaHRfMTZfc3NzZTM7CkBAIC0yOTQsMTIgKzMzMSwzMyBAQAogICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2x1bWEgICAgICAgPSBmZl9kZWJsb2NrX2hfbHVtYV84X2F2eDsKICAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2ludHJhID0gZmZfZGVibG9ja192X2x1bWFfaW50cmFfOF9hdng7CiAgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9pbnRyYSA9IGZmX2RlYmxvY2tfaF9sdW1hX2ludHJhXzhfYXZ4OworI2lmIEFSQ0hfWDg2XzY0CisgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfbHVtYV9tYmFmZiA9IGZmX2RlYmxvY2tfaF9sdW1hX21iYWZmXzhfYXZ4OworI2VuZGlmCisKKyAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWEgICAgICAgPSBmZl9kZWJsb2NrX3ZfY2hyb21hXzhfYXZ4OworICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2Nocm9tYV9pbnRyYSA9IGZmX2RlYmxvY2tfdl9jaHJvbWFfaW50cmFfOF9hdng7CisgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkgeworICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWEgICAgICAgPSBmZl9kZWJsb2NrX2hfY2hyb21hXzhfYXZ4OworICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEgPSBmZl9kZWJsb2NrX2hfY2hyb21hX2ludHJhXzhfYXZ4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hICAgICAgID0gZmZfZGVibG9ja19oX2Nocm9tYTQyMl84X2F2eDsKKyAgICAgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hX2ludHJhID0gZmZfZGVibG9ja19oX2Nocm9tYTQyMl9pbnRyYV84X2F2eDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZCAgICAgICAgPSBmZl9oMjY0X2lkY3RfYWRkXzhfYXZ4OworICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2RjX2FkZCAgICAgPSBmZl9oMjY0X2lkY3RfZGNfYWRkXzhfYXZ4OwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChiaXRfZGVwdGggPT0gMTApIHsKICAgICAgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CiAjaWYgQVJDSF9YODZfMzIKICAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWEgICAgICAgPSBmZl9kZWJsb2NrX3ZfY2hyb21hXzEwX21teGV4dDsKICAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWFfaW50cmEgPSBmZl9kZWJsb2NrX3ZfY2hyb21hX2ludHJhXzEwX21teGV4dDsKKyAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKSB7CisgICAgICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYSA9IGZmX2RlYmxvY2tfaF9jaHJvbWFfMTBfbW14ZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfZGVibG9ja19oX2Nocm9tYTQyMl8xMF9tbXhleHQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfbHVtYSAgICAgICAgID0gZmZfZGVibG9ja192X2x1bWFfMTBfbW14ZXh0OwogICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2x1bWEgICAgICAgICA9IGZmX2RlYmxvY2tfaF9sdW1hXzEwX21teGV4dDsKICAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9sdW1hX2ludHJhICAgPSBmZl9kZWJsb2NrX3ZfbHVtYV9pbnRyYV8xMF9tbXhleHQ7CkBAIC0zMTIsOCArMzcwLDExIEBACiAgICAgICAgICAgICBjLT5oMjY0X2lkY3Q4X2RjX2FkZCA9IGZmX2gyNjRfaWRjdDhfZGNfYWRkXzEwX3NzZTI7CiAKICAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNiA9IGZmX2gyNjRfaWRjdF9hZGQxNl8xMF9zc2UyOwotICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpCisgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkgewogICAgICAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQ4ID0gZmZfaDI2NF9pZGN0X2FkZDhfMTBfc3NlMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDggPSBmZl9oMjY0X2lkY3RfYWRkOF80MjJfMTBfc3NlMjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNmludHJhID0gZmZfaDI2NF9pZGN0X2FkZDE2aW50cmFfMTBfc3NlMjsKICNpZiBIQVZFX0FMSUdORURfU1RBQ0sKICAgICAgICAgICAgIGMtPmgyNjRfaWRjdDhfYWRkICA9IGZmX2gyNjRfaWRjdDhfYWRkXzEwX3NzZTI7CkBAIC0zMzAsNiArMzkxLDExIEBACiAKICAgICAgICAgICAgIGMtPmgyNjRfdl9sb29wX2ZpbHRlcl9jaHJvbWEgICAgICAgPSBmZl9kZWJsb2NrX3ZfY2hyb21hXzEwX3NzZTI7CiAgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hX2ludHJhID0gZmZfZGVibG9ja192X2Nocm9tYV9pbnRyYV8xMF9zc2UyOworICAgICAgICAgICAgaWYgKGNocm9tYV9mb3JtYXRfaWRjIDw9IDEpIHsKKyAgICAgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfZGVibG9ja19oX2Nocm9tYV8xMF9zc2UyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjLT5oMjY0X2hfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfZGVibG9ja19oX2Nocm9tYTQyMl8xMF9zc2UyOworICAgICAgICAgICAgfQogI2lmIEhBVkVfQUxJR05FRF9TVEFDSwogICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2x1bWEgICAgICAgPSBmZl9kZWJsb2NrX3ZfbHVtYV8xMF9zc2UyOwogICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2x1bWEgICAgICAgPSBmZl9kZWJsb2NrX2hfbHVtYV8xMF9zc2UyOwpAQCAtMzUyLDggKzQxOCwxMSBAQAogICAgICAgICAgICAgYy0+aDI2NF9pZGN0OF9kY19hZGQgPSBmZl9oMjY0X2lkY3Q4X2RjX2FkZF8xMF9hdng7CiAKICAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNiA9IGZmX2gyNjRfaWRjdF9hZGQxNl8xMF9hdng7Ci0gICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkKKyAgICAgICAgICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA8PSAxKSB7CiAgICAgICAgICAgICAgICAgYy0+aDI2NF9pZGN0X2FkZDggPSBmZl9oMjY0X2lkY3RfYWRkOF8xMF9hdng7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQ4ID0gZmZfaDI2NF9pZGN0X2FkZDhfNDIyXzEwX2F2eDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGMtPmgyNjRfaWRjdF9hZGQxNmludHJhID0gZmZfaDI2NF9pZGN0X2FkZDE2aW50cmFfMTBfYXZ4OwogI2lmIEhBVkVfQUxJR05FRF9TVEFDSwogICAgICAgICAgICAgYy0+aDI2NF9pZGN0OF9hZGQgID0gZmZfaDI2NF9pZGN0OF9hZGRfMTBfYXZ4OwpAQCAtMzYyLDYgKzQzMSwxMSBAQAogCiAgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hICAgICAgID0gZmZfZGVibG9ja192X2Nocm9tYV8xMF9hdng7CiAgICAgICAgICAgICBjLT5oMjY0X3ZfbG9vcF9maWx0ZXJfY2hyb21hX2ludHJhID0gZmZfZGVibG9ja192X2Nocm9tYV9pbnRyYV8xMF9hdng7CisgICAgICAgICAgICBpZiAoY2hyb21hX2Zvcm1hdF9pZGMgPD0gMSkgeworICAgICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9jaHJvbWEgPSBmZl9kZWJsb2NrX2hfY2hyb21hXzEwX2F2eDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYy0+aDI2NF9oX2xvb3BfZmlsdGVyX2Nocm9tYSA9IGZmX2RlYmxvY2tfaF9jaHJvbWE0MjJfMTBfYXZ4OworICAgICAgICAgICAgfQogI2lmIEhBVkVfQUxJR05FRF9TVEFDSwogICAgICAgICAgICAgYy0+aDI2NF92X2xvb3BfZmlsdGVyX2x1bWEgICAgICAgICA9IGZmX2RlYmxvY2tfdl9sdW1hXzEwX2F2eDsKICAgICAgICAgICAgIGMtPmgyNjRfaF9sb29wX2ZpbHRlcl9sdW1hICAgICAgICAgPSBmZl9kZWJsb2NrX2hfbHVtYV8xMF9hdng7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oZXZjX2FkZF9yZXMuYXNtIGIvbGliYXZjb2RlYy94ODYvaGV2Y19hZGRfcmVzLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmQ0ZDhlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy94ODYvaGV2Y19hZGRfcmVzLmFzbQpAQCAtMCwwICsxLDM2OSBAQAorOyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyAqIFByb3ZpZGUgU0lNRCBvcHRpbWl6YXRpb25zIGZvciBhZGRfcmVzaWR1YWwgZnVuY3Rpb25zIGZvciBIRVZDIGRlY29kaW5nCis7ICogQ29weXJpZ2h0IChjKSAyMDE0IFBpZXJyZS1FZG91YXJkIExFUEVSRQorOyAqCis7ICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyAqCis7ICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsgKgorOyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyAqCis7ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCitjZXh0ZXJuIHB3XzEwMjMKKyVkZWZpbmUgbWF4X3BpeGVsc18xMCBwd18xMDIzCisKKzsgdGhlIGFkZF9yZXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgd2VyZSBsYXJnZWx5IGluc3BpcmVkIGJ5IGgyNjRfaWRjdC5hc20gZnJvbSB0aGUgeDI2NCBwcm9qZWN0CislbWFjcm8gQUREX1JFU19NTVhfNF84IDAKKyAgICBtb3ZhICAgICAgICAgICAgICBtMCwgW3IxXQorICAgIG1vdmEgICAgICAgICAgICAgIG0yLCBbcjErOF0KKyAgICBweG9yICAgICAgICAgICAgICBtMSwgbTEKKyAgICBweG9yICAgICAgICAgICAgICBtMywgbTMKKyAgICBwc3VidyAgICAgICAgICAgICBtMSwgbTAKKyAgICBwc3VidyAgICAgICAgICAgICBtMywgbTIKKyAgICBwYWNrdXN3YiAgICAgICAgICBtMCwgbTIKKyAgICBwYWNrdXN3YiAgICAgICAgICBtMSwgbTMKKworICAgIG1vdmQgICAgICAgICAgICAgIG0yLCBbcjBdCisgICAgbW92ZCAgICAgICAgICAgICAgbTMsIFtyMCtyMl0KKyAgICBwdW5wY2tsZHEgICAgICAgICBtMiwgbTMKKyAgICBwYWRkdXNiICAgICAgICAgICBtMCwgbTIKKyAgICBwc3VidXNiICAgICAgICAgICBtMCwgbTEKKyAgICBtb3ZkICAgICAgICAgICAgW3IwXSwgbTAKKyAgICBwc3JscSAgICAgICAgICAgICBtMCwgMzIKKyAgICBtb3ZkICAgICAgICAgW3IwK3IyXSwgbTAKKyVlbmRtYWNybworCisKK0lOSVRfTU1YIG1teGV4dAorOyB2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzRfOF9tbXhleHQodWludDhfdCAqZHN0LCBpbnQxNl90ICpyZXMsIHB0cmRpZmZfdCBzdHJpZGUpCitjZ2xvYmFsIGhldmNfYWRkX3Jlc2lkdWFsXzRfOCwgMywgMywgNgorICAgIEFERF9SRVNfTU1YXzRfOAorICAgIGFkZCAgICAgICAgICAgICAgIHIxLCAxNgorICAgIGxlYSAgICAgICAgICAgICAgIHIwLCBbcjArcjIqMl0KKyAgICBBRERfUkVTX01NWF80XzgKKyAgICBSRVQKKworJW1hY3JvIEFERF9SRVNfU1NFXzhfOCAwCisgICAgcHhvciAgICAgICAgICAgICAgbTMsIG0zCisgICAgbW92YSAgICAgICAgICAgICAgbTQsIFtyMV0KKyAgICBtb3ZhICAgICAgICAgICAgICBtNiwgW3IxKzE2XQorICAgIG1vdmEgICAgICAgICAgICAgIG0wLCBbcjErMzJdCisgICAgbW92YSAgICAgICAgICAgICAgbTIsIFtyMSs0OF0KKyAgICBwc3VidyAgICAgICAgICAgICBtNSwgbTMsIG00CisgICAgcHN1YncgICAgICAgICAgICAgbTcsIG0zLCBtNgorICAgIHBzdWJ3ICAgICAgICAgICAgIG0xLCBtMywgbTAKKyAgICBwYWNrdXN3YiAgICAgICAgICBtNCwgbTAKKyAgICBwYWNrdXN3YiAgICAgICAgICBtNSwgbTEKKyAgICBwc3VidyAgICAgICAgICAgICBtMywgbTIKKyAgICBwYWNrdXN3YiAgICAgICAgICBtNiwgbTIKKyAgICBwYWNrdXN3YiAgICAgICAgICBtNywgbTMKKworICAgIG1vdnEgICAgICAgICAgICAgIG0wLCBbcjBdCisgICAgbW92cSAgICAgICAgICAgICAgbTEsIFtyMCtyMl0KKyAgICBtb3ZocHMgICAgICAgICAgICBtMCwgW3IwK3IyKjJdCisgICAgbW92aHBzICAgICAgICAgICAgbTEsIFtyMCtyM10KKyAgICBwYWRkdXNiICAgICAgICAgICBtMCwgbTQKKyAgICBwYWRkdXNiICAgICAgICAgICBtMSwgbTYKKyAgICBwc3VidXNiICAgICAgICAgICBtMCwgbTUKKyAgICBwc3VidXNiICAgICAgICAgICBtMSwgbTcKKyAgICBtb3ZxICAgICAgICAgICAgW3IwXSwgbTAKKyAgICBtb3ZxICAgICAgICAgW3IwK3IyXSwgbTEKKyAgICBtb3ZocHMgICAgIFtyMCsyKnIyXSwgbTAKKyAgICBtb3ZocHMgICAgICAgW3IwK3IzXSwgbTEKKyVlbmRtYWNybworCislbWFjcm8gQUREX1JFU19TU0VfMTZfMzJfOCAzCisgICAgbW92YSAgICAgICAgICAgICB4bTIsIFtyMSslMV0KKyAgICBtb3ZhICAgICAgICAgICAgIHhtNiwgW3IxKyUxKzE2XQorJWlmIGNwdWZsYWcoYXZ4MikKKyAgICB2aW5zZXJ0aTEyOCAgICAgICBtMiwgbTIsIFtyMSslMSszMl0sIDEKKyAgICB2aW5zZXJ0aTEyOCAgICAgICBtNiwgbTYsIFtyMSslMSs0OF0sIDEKKyVlbmRpZgorICAgIHBzdWJ3ICAgICAgICAgICAgIG0xLCBtMCwgbTIKKyAgICBwc3VidyAgICAgICAgICAgICBtNSwgbTAsIG02CisgICAgcGFja3Vzd2IgICAgICAgICAgbTIsIG02CisgICAgcGFja3Vzd2IgICAgICAgICAgbTEsIG01CisKKyAgICBtb3ZhICAgICAgICAgICAgIHhtNCwgW3IxKyUxK21tc2l6ZSoyXQorICAgIG1vdmEgICAgICAgICAgICAgeG02LCBbcjErJTErbW1zaXplKjIrMTZdCislaWYgY3B1ZmxhZyhhdngyKQorICAgIHZpbnNlcnRpMTI4ICAgICAgIG00LCBtNCwgW3IxKyUxKzk2IF0sIDEKKyAgICB2aW5zZXJ0aTEyOCAgICAgICBtNiwgbTYsIFtyMSslMSsxMTJdLCAxCislZW5kaWYKKyAgICBwc3VidyAgICAgICAgICAgICBtMywgbTAsIG00CisgICAgcHN1YncgICAgICAgICAgICAgbTUsIG0wLCBtNgorICAgIHBhY2t1c3diICAgICAgICAgIG00LCBtNgorICAgIHBhY2t1c3diICAgICAgICAgIG0zLCBtNQorCisgICAgcGFkZHVzYiAgICAgICAgICAgbTIsIFslMl0KKyAgICBwYWRkdXNiICAgICAgICAgICBtNCwgWyUzXQorICAgIHBzdWJ1c2IgICAgICAgICAgIG0yLCBtMQorICAgIHBzdWJ1c2IgICAgICAgICAgIG00LCBtMworICAgIG1vdmEgICAgICAgICAgICBbJTJdLCBtMgorICAgIG1vdmEgICAgICAgICAgICBbJTNdLCBtNAorJWVuZG1hY3JvCisKKworJW1hY3JvIFRSQU5TRk9STV9BRERfOCAwCis7IHZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfOF84XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqcmVzLCBwdHJkaWZmX3Qgc3RyaWRlKQorY2dsb2JhbCBoZXZjX2FkZF9yZXNpZHVhbF84XzgsIDMsIDQsIDgKKyAgICBsZWEgICAgICAgICAgICAgICByMywgW3IyKjNdCisgICAgQUREX1JFU19TU0VfOF84CisgICAgYWRkICAgICAgICAgICAgICAgcjEsIDY0CisgICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCtyMio0XQorICAgIEFERF9SRVNfU1NFXzhfOAorICAgIFJFVAorCis7IHZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfMTZfOF88b3B0Pih1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSkKK2NnbG9iYWwgaGV2Y19hZGRfcmVzaWR1YWxfMTZfOCwgMywgNSwgNworICAgIHB4b3IgICAgICAgICAgICAgICAgbTAsIG0wCisgICAgbGVhICAgICAgICAgICAgICAgICByMywgW3IyKjNdCisgICAgbW92ICAgICAgICAgICAgICAgIHI0ZCwgNAorLmxvb3A6CisgICAgQUREX1JFU19TU0VfMTZfMzJfOCAgMCwgcjAsICAgICAgcjArcjIKKyAgICBBRERfUkVTX1NTRV8xNl8zMl84IDY0LCByMCtyMioyLCByMCtyMworICAgIGFkZCAgICAgICAgICAgICAgICAgcjEsIDEyOAorICAgIGxlYSAgICAgICAgICAgICAgICAgcjAsIFtyMCtyMio0XQorICAgIGRlYyAgICAgICAgICAgICAgICByNGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorCis7IHZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfMzJfOF88b3B0Pih1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSkKK2NnbG9iYWwgaGV2Y19hZGRfcmVzaWR1YWxfMzJfOCwgMywgNSwgNworICAgIHB4b3IgICAgICAgICAgICAgICAgbTAsIG0wCisgICAgbW92ICAgICAgICAgICAgICAgIHI0ZCwgMTYKKy5sb29wOgorICAgIEFERF9SRVNfU1NFXzE2XzMyXzggIDAsIHIwLCAgICByMCsxNgorICAgIEFERF9SRVNfU1NFXzE2XzMyXzggNjQsIHIwK3IyLCByMCtyMisxNgorICAgIGFkZCAgICAgICAgICAgICAgICAgcjEsIDEyOAorICAgIGxlYSAgICAgICAgICAgICAgICAgcjAsIFtyMCtyMioyXQorICAgIGRlYyAgICAgICAgICAgICAgICByNGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK1RSQU5TRk9STV9BRERfOAorSU5JVF9YTU0gYXZ4CitUUkFOU0ZPUk1fQUREXzgKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorOyB2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzMyXzhfYXZ4Mih1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSkKK2NnbG9iYWwgaGV2Y19hZGRfcmVzaWR1YWxfMzJfOCwgMywgNSwgNworICAgIHB4b3IgICAgICAgICAgICAgICAgIG0wLCBtMAorICAgIGxlYSAgICAgICAgICAgICAgICAgIHIzLCBbcjIqM10KKyAgICBtb3YgICAgICAgICAgICAgICAgIHI0ZCwgOAorLmxvb3A6CisgICAgQUREX1JFU19TU0VfMTZfMzJfOCAgIDAsIHIwLCAgICAgIHIwK3IyCisgICAgQUREX1JFU19TU0VfMTZfMzJfOCAxMjgsIHIwK3IyKjIsIHIwK3IzCisgICAgYWRkICAgICAgICAgICAgICAgICAgcjEsIDI1NgorICAgIGxlYSAgICAgICAgICAgICAgICAgIHIwLCBbcjArcjIqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgIHI0ZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kaWYgO0hBVkVfQVZYMl9FWFRFUk5BTAorCislbWFjcm8gQUREX1JFU19TU0VfOF8xMCA0CisgICAgbW92YSAgICAgICAgICAgICAgbTAsIFslNF0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMSwgWyU0KzE2XQorICAgIG1vdmEgICAgICAgICAgICAgIG0yLCBbJTQrMzJdCisgICAgbW92YSAgICAgICAgICAgICAgbTMsIFslNCs0OF0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMCwgWyUxKzBdCisgICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMSslMl0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMiwgWyUxKyUyKjJdCisgICAgcGFkZHcgICAgICAgICAgICAgbTMsIFslMSslM10KKyAgICBDTElQVyAgICAgICAgICAgICBtMCwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTEsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0yLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMywgbTQsIG01CisgICAgbW92YSAgICAgICAgICBbJTErMF0sIG0wCisgICAgbW92YSAgICAgICAgIFslMSslMl0sIG0xCisgICAgbW92YSAgICAgICBbJTErJTIqMl0sIG0yCisgICAgbW92YSAgICAgICAgIFslMSslM10sIG0zCislZW5kbWFjcm8KKworJW1hY3JvIEFERF9SRVNfTU1YXzRfMTAgMworICAgIG1vdmEgICAgICAgICAgICAgIG0wLCBbJTErMF0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMSwgWyUxKyUyXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBbJTNdCisgICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMys4XQorICAgIENMSVBXICAgICAgICAgICAgIG0wLCBtMiwgbTMKKyAgICBDTElQVyAgICAgICAgICAgICBtMSwgbTIsIG0zCisgICAgbW92YSAgICAgICAgICBbJTErMF0sIG0wCisgICAgbW92YSAgICAgICAgIFslMSslMl0sIG0xCislZW5kbWFjcm8KKworJW1hY3JvIEFERF9SRVNfU1NFXzE2XzEwIDMKKyAgICBtb3ZhICAgICAgICAgICAgICBtMCwgWyUzXQorICAgIG1vdmEgICAgICAgICAgICAgIG0xLCBbJTMrMTZdCisgICAgbW92YSAgICAgICAgICAgICAgbTIsIFslMyszMl0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMywgWyUzKzQ4XQorICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBbJTFdCisgICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMSsxNl0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMiwgWyUxKyUyXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0zLCBbJTErJTIrMTZdCisgICAgQ0xJUFcgICAgICAgICAgICAgbTAsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0xLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMiwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTMsIG00LCBtNQorICAgIG1vdmEgICAgICAgICAgICBbJTFdLCBtMAorICAgIG1vdmEgICAgICAgICBbJTErMTZdLCBtMQorICAgIG1vdmEgICAgICAgICBbJTErJTJdLCBtMgorICAgIG1vdmEgICAgICBbJTErJTIrMTZdLCBtMworJWVuZG1hY3JvCisKKyVtYWNybyBBRERfUkVTX1NTRV8zMl8xMCAyCisgICAgbW92YSAgICAgICAgICAgICAgbTAsIFslMl0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMSwgWyUyKzE2XQorICAgIG1vdmEgICAgICAgICAgICAgIG0yLCBbJTIrMzJdCisgICAgbW92YSAgICAgICAgICAgICAgbTMsIFslMis0OF0KKworICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBbJTFdCisgICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMSsxNl0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMiwgWyUxKzMyXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0zLCBbJTErNDhdCisgICAgQ0xJUFcgICAgICAgICAgICAgbTAsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0xLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMiwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTMsIG00LCBtNQorICAgIG1vdmEgICAgICAgICAgICBbJTFdLCBtMAorICAgIG1vdmEgICAgICAgICBbJTErMTZdLCBtMQorICAgIG1vdmEgICAgICAgICBbJTErMzJdLCBtMgorICAgIG1vdmEgICAgICAgICBbJTErNDhdLCBtMworJWVuZG1hY3JvCisKKyVtYWNybyBBRERfUkVTX0FWWDJfMTZfMTAgNAorICAgIG1vdmEgICAgICAgICAgICAgIG0wLCBbJTRdCisgICAgbW92YSAgICAgICAgICAgICAgbTEsIFslNCszMl0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMiwgWyU0KzY0XQorICAgIG1vdmEgICAgICAgICAgICAgIG0zLCBbJTQrOTZdCisKKyAgICBwYWRkdyAgICAgICAgICAgICBtMCwgWyUxKzBdCisgICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMSslMl0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMiwgWyUxKyUyKjJdCisgICAgcGFkZHcgICAgICAgICAgICAgbTMsIFslMSslM10KKworICAgIENMSVBXICAgICAgICAgICAgIG0wLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMSwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTIsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0zLCBtNCwgbTUKKyAgICBtb3ZhICAgICAgICAgIFslMSswXSwgbTAKKyAgICBtb3ZhICAgICAgICAgWyUxKyUyXSwgbTEKKyAgICBtb3ZhICAgICAgIFslMSslMioyXSwgbTIKKyAgICBtb3ZhICAgICAgICAgWyUxKyUzXSwgbTMKKyVlbmRtYWNybworCislbWFjcm8gQUREX1JFU19BVlgyXzMyXzEwIDMKKyAgICBtb3ZhICAgICAgICAgICAgICBtMCwgWyUzXQorICAgIG1vdmEgICAgICAgICAgICAgIG0xLCBbJTMrMzJdCisgICAgbW92YSAgICAgICAgICAgICAgbTIsIFslMys2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICBtMywgWyUzKzk2XQorCisgICAgcGFkZHcgICAgICAgICAgICAgbTAsIFslMV0KKyAgICBwYWRkdyAgICAgICAgICAgICBtMSwgWyUxKzMyXQorICAgIHBhZGR3ICAgICAgICAgICAgIG0yLCBbJTErJTJdCisgICAgcGFkZHcgICAgICAgICAgICAgbTMsIFslMSslMiszMl0KKworICAgIENMSVBXICAgICAgICAgICAgIG0wLCBtNCwgbTUKKyAgICBDTElQVyAgICAgICAgICAgICBtMSwgbTQsIG01CisgICAgQ0xJUFcgICAgICAgICAgICAgbTIsIG00LCBtNQorICAgIENMSVBXICAgICAgICAgICAgIG0zLCBtNCwgbTUKKyAgICBtb3ZhICAgICAgICAgICAgWyUxXSwgbTAKKyAgICBtb3ZhICAgICAgICAgWyUxKzMyXSwgbTEKKyAgICBtb3ZhICAgICAgICAgWyUxKyUyXSwgbTIKKyAgICBtb3ZhICAgICAgWyUxKyUyKzMyXSwgbTMKKyVlbmRtYWNybworCis7IHZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfPDR8OHwxNnwzMj5fMTAocGl4ZWwgKmRzdCwgaW50MTZfdCAqYmxvY2ssIHB0cmRpZmZfdCBzdHJpZGUpCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgaGV2Y19hZGRfcmVzaWR1YWxfNF8xMCwgMywgMywgNgorICAgIHB4b3IgICAgICAgICAgICAgIG0yLCBtMgorICAgIG1vdmEgICAgICAgICAgICAgIG0zLCBbbWF4X3BpeGVsc18xMF0KKyAgICBBRERfUkVTX01NWF80XzEwICByMCwgcjIsIHIxCisgICAgYWRkICAgICAgICAgICAgICAgcjEsIDE2CisgICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCsyKnIyXQorICAgIEFERF9SRVNfTU1YXzRfMTAgIHIwLCByMiwgcjEKKyAgICBSRVQKKworSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBoZXZjX2FkZF9yZXNpZHVhbF84XzEwLCAzLCA0LCA2CisgICAgcHhvciAgICAgICAgICAgICAgbTQsIG00CisgICAgbW92YSAgICAgICAgICAgICAgbTUsIFttYXhfcGl4ZWxzXzEwXQorICAgIGxlYSAgICAgICAgICAgICAgIHIzLCBbcjIqM10KKworICAgIEFERF9SRVNfU1NFXzhfMTAgIHIwLCByMiwgcjMsIHIxCisgICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCtyMio0XQorICAgIGFkZCAgICAgICAgICAgICAgIHIxLCA2NAorICAgIEFERF9SRVNfU1NFXzhfMTAgIHIwLCByMiwgcjMsIHIxCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19hZGRfcmVzaWR1YWxfMTZfMTAsIDMsIDUsIDYKKyAgICBweG9yICAgICAgICAgICAgICBtNCwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgICBtNSwgW21heF9waXhlbHNfMTBdCisKKyAgICBtb3YgICAgICAgICAgICAgIHI0ZCwgOAorLmxvb3A6CisgICAgQUREX1JFU19TU0VfMTZfMTAgcjAsIHIyLCByMQorICAgIGxlYSAgICAgICAgICAgICAgIHIwLCBbcjArcjIqMl0KKyAgICBhZGQgICAgICAgICAgICAgICByMSwgNjQKKyAgICBkZWMgICAgICAgICAgICAgIHI0ZAorICAgIGpnIC5sb29wCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19hZGRfcmVzaWR1YWxfMzJfMTAsIDMsIDUsIDYKKyAgICBweG9yICAgICAgICAgICAgICBtNCwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgICBtNSwgW21heF9waXhlbHNfMTBdCisKKyAgICBtb3YgICAgICAgICAgICAgIHI0ZCwgMzIKKy5sb29wOgorICAgIEFERF9SRVNfU1NFXzMyXzEwIHIwLCByMQorICAgIGxlYSAgICAgICAgICAgICAgIHIwLCBbcjArcjJdCisgICAgYWRkICAgICAgICAgICAgICAgcjEsIDY0CisgICAgZGVjICAgICAgICAgICAgICByNGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitjZ2xvYmFsIGhldmNfYWRkX3Jlc2lkdWFsXzE2XzEwLCAzLCA1LCA2CisgICAgcHhvciAgICAgICAgICAgICAgIG00LCBtNAorICAgIG1vdmEgICAgICAgICAgICAgICBtNSwgW21heF9waXhlbHNfMTBdCisgICAgbGVhICAgICAgICAgICAgICAgIHIzLCBbcjIqM10KKworICAgIG1vdiAgICAgICAgICAgICAgIHI0ZCwgNAorLmxvb3A6CisgICAgQUREX1JFU19BVlgyXzE2XzEwIHIwLCByMiwgcjMsIHIxCisgICAgbGVhICAgICAgICAgICAgICAgIHIwLCBbcjArcjIqNF0KKyAgICBhZGQgICAgICAgICAgICAgICAgcjEsIDEyOAorICAgIGRlYyAgICAgICAgICAgICAgIHI0ZAorICAgIGpnIC5sb29wCisgICAgUkVUCisKK2NnbG9iYWwgaGV2Y19hZGRfcmVzaWR1YWxfMzJfMTAsIDMsIDUsIDYKKyAgICBweG9yICAgICAgICAgICAgICAgbTQsIG00CisgICAgbW92YSAgICAgICAgICAgICAgIG01LCBbbWF4X3BpeGVsc18xMF0KKworICAgIG1vdiAgICAgICAgICAgICAgIHI0ZCwgMTYKKy5sb29wOgorICAgIEFERF9SRVNfQVZYMl8zMl8xMCByMCwgcjIsIHIxCisgICAgbGVhICAgICAgICAgICAgICAgIHIwLCBbcjArcjIqMl0KKyAgICBhZGQgICAgICAgICAgICAgICAgcjEsIDEyOAorICAgIGRlYyAgICAgICAgICAgICAgIHI0ZAorICAgIGpnIC5sb29wCisgICAgUkVUCislZW5kaWYgO0hBVkVfQVZYMl9FWFRFUk5BTApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaGV2Y19kZWJsb2NrLmFzbSBiL2xpYmF2Y29kZWMveDg2L2hldmNfZGVibG9jay5hc20KaW5kZXggNDhhNTk3NS4uODVlZTQ4MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaGV2Y19kZWJsb2NrLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9oZXZjX2RlYmxvY2suYXNtCkBAIC0zOSwxMSArMzksNiBAQAogU0VDVElPTiAudGV4dAogSU5JVF9YTU0gc3NlMgogCi07IGV4cGFuZHMgdG8gW2Jhc2VdLC4uLixbYmFzZSs3KnN0cmlkZV0KLSVkZWZpbmUgUEFTUzhST1dTKGJhc2UsIGJhc2UzLCBzdHJpZGUsIHN0cmlkZTMpIFwKLSAgICBbYmFzZV0sIFtiYXNlK3N0cmlkZV0sIFtiYXNlK3N0cmlkZSoyXSwgW2Jhc2UzXSwgXAotICAgIFtiYXNlMytzdHJpZGVdLCBbYmFzZTMrc3RyaWRlKjJdLCBbYmFzZTMrc3RyaWRlM10sIFtiYXNlMytzdHJpZGUqNF0KLQogOyBpbjogOCByb3dzIG9mIDQgYnl0ZXMgaW4gJTQuLiUxMQogOyBvdXQ6IDQgcm93cyBvZiA4IHdvcmRzIGluIG0wLi5tMwogJW1hY3JvIFRSQU5TUE9TRTR4OEJfTE9BRCA4CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oZXZjX2lkY3QuYXNtIGIvbGliYXZjb2RlYy94ODYvaGV2Y19pZGN0LmFzbQppbmRleCAyZWRhZjlhLi4xZWIxOTczIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9oZXZjX2lkY3QuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2hldmNfaWRjdC5hc20KQEAgLTEsMzcgKzEsMjUwIEBACi07IC8qCi07ICogU0lNRCBvcHRpbWl6ZWQgaWRjdCBmdW5jdGlvbnMgZm9yIEhFVkMgZGVjb2RpbmcKLTsgKiBDb3B5cmlnaHQgKGMpIDIwMTQgUGllcnJlLUVkb3VhcmQgTEVQRVJFCi07ICogQ29weXJpZ2h0IChjKSAyMDE0IEphbWVzIEFsbWVyCi07ICoKLTsgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi07ICoKLTsgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi07ICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotOyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotOyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotOyAqCi07ICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi07ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLTsgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotOyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi07ICoKLTsgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi07ICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotOyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLTsgKi8KKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTSU1ELW9wdGltaXplZCBJRENUIGZ1bmN0aW9ucyBmb3IgSEVWQyBkZWNvZGluZworOyogQ29weXJpZ2h0IChjKSAyMDE0IFBpZXJyZS1FZG91YXJkIExFUEVSRQorOyogQ29weXJpZ2h0IChjKSAyMDE0IEphbWVzIEFsbWVyCis7KiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZHJhIEjDoWprb3bDoQorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwogJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCiAKK1NFQ1RJT05fUk9EQVRBCisKK3BkXzY0OiB0aW1lcyA0IGRkIDY0CitwZF8yMDQ4OiB0aW1lcyA0IGRkIDIwNDgKK3BkXzUxMjogdGltZXMgNCBkZCA1MTIKKworOyA0eDQgdHJhbnNmb3JtIGNvZWZmcworY2V4dGVybiBwd182NAorcHdfNjRfbTY0OiB0aW1lcyA0IGR3IDY0LCAtNjQKK3B3XzgzXzM2OiB0aW1lcyA0IGR3IDgzLCAzNgorcHdfMzZfbTgzOiB0aW1lcyA0IGR3IDM2LCAtODMKKworOyA4eDggdHJhbnNmb3JtIGNvZWZmcworcHdfODlfNzU6IHRpbWVzIDQgZHcgODksIDc1Citwd181MF8xODogdGltZXMgNCBkdyA1MCwgMTgKKworcHdfNzVfbTE4OiB0aW1lcyA0IGR3IDc1LCAtMTgKK3B3X204OV9tNTA6IHRpbWVzIDQgZHcgLTg5LCAtNTAKKworcHdfNTBfbTg5OiB0aW1lcyA0IGR3IDUwLCAtODkKK3B3XzE4Xzc1OiB0aW1lcyA0IGR3IDE4LCA3NQorCitwd18xOF9tNTA6IHRpbWVzIDQgZHcgMTgsIC01MAorcHdfNzVfbTg5OiB0aW1lcyA0IGR3IDc1LCAtODkKKworOyAxNngxNiB0cmFuc2Zvcm1hdGlvbiBjb2VmZnMKK3RyYW5zX2NvZWZmczE2OiB0aW1lcyA0IGR3IDkwLCA4NwordGltZXMgNCBkdyA4MCwgNzAKK3RpbWVzIDQgZHcgNTcsIDQzCit0aW1lcyA0IGR3IDI1LCA5CisKK3RpbWVzIDQgZHcgODcsIDU3Cit0aW1lcyA0IGR3IDksIC00MwordGltZXMgNCBkdyAtODAsIC05MAordGltZXMgNCBkdyAtNzAsIC0yNQorCit0aW1lcyA0IGR3IDgwLCA5Cit0aW1lcyA0IGR3IC03MCwgLTg3Cit0aW1lcyA0IGR3IC0yNSwgNTcKK3RpbWVzIDQgZHcgOTAsIDQzCisKK3RpbWVzIDQgZHcgNzAsIC00MwordGltZXMgNCBkdyAtODcsIDkKK3RpbWVzIDQgZHcgOTAsIDI1Cit0aW1lcyA0IGR3IC04MCwgLTU3CisKK3RpbWVzIDQgZHcgNTcsIC04MAordGltZXMgNCBkdyAtMjUsIDkwCit0aW1lcyA0IGR3IC05LCAtODcKK3RpbWVzIDQgZHcgNDMsIDcwCisKK3RpbWVzIDQgZHcgNDMsIC05MAordGltZXMgNCBkdyA1NywgMjUKK3RpbWVzIDQgZHcgLTg3LCA3MAordGltZXMgNCBkdyA5LCAtODAKKwordGltZXMgNCBkdyAyNSwgLTcwCit0aW1lcyA0IGR3IDkwLCAtODAKK3RpbWVzIDQgZHcgNDMsIDkKK3RpbWVzIDQgZHcgLTU3LCA4NworCit0aW1lcyA0IGR3IDksIC0yNQordGltZXMgNCBkdyA0MywgLTU3Cit0aW1lcyA0IGR3IDcwLCAtODAKK3RpbWVzIDQgZHcgODcsIC05MAorCis7IDMyeDMyIHRyYW5zZm9ybSBjb2VmZnMKK3RyYW5zX2NvZWZmMzI6IHRpbWVzIDggZHcgOTAKK3RpbWVzIDQgZHcgODgsIDg1Cit0aW1lcyA0IGR3IDgyLCA3OAordGltZXMgNCBkdyA3MywgNjcKK3RpbWVzIDQgZHcgNjEsIDU0Cit0aW1lcyA0IGR3IDQ2LCAzOAordGltZXMgNCBkdyAzMSwgMjIKK3RpbWVzIDQgZHcgMTMsIDQKKwordGltZXMgNCBkdyA5MCwgODIKK3RpbWVzIDQgZHcgNjcsIDQ2Cit0aW1lcyA0IGR3IDIyLCAtNAordGltZXMgNCBkdyAtMzEsIC01NAordGltZXMgNCBkdyAtNzMsIC04NQordGltZXMgNCBkdyAtOTAsIC04OAordGltZXMgNCBkdyAtNzgsIC02MQordGltZXMgNCBkdyAtMzgsIC0xMworCit0aW1lcyA0IGR3IDg4LCA2NwordGltZXMgNCBkdyAzMSwgLTEzCit0aW1lcyA0IGR3IC01NCwgLTgyCit0aW1lcyA0IGR3IC05MCwgLTc4Cit0aW1lcyA0IGR3IC00NiwgLTQKK3RpbWVzIDQgZHcgMzgsIDczCit0aW1lcyA0IGR3IDkwLCA4NQordGltZXMgNCBkdyA2MSwgMjIKKwordGltZXMgNCBkdyA4NSwgNDYKK3RpbWVzIDQgZHcgLTEzLCAtNjcKK3RpbWVzIDQgZHcgLTkwLCAtNzMKK3RpbWVzIDQgZHcgLTIyLCAzOAordGltZXMgNCBkdyA4MiwgODgKK3RpbWVzIDQgZHcgNTQsIC00Cit0aW1lcyA0IGR3IC02MSwgLTkwCit0aW1lcyA0IGR3IC03OCwgLTMxCisKK3RpbWVzIDQgZHcgODIsIDIyCit0aW1lcyA0IGR3IC01NCwgLTkwCit0aW1lcyA0IGR3IC02MSwgMTMKK3RpbWVzIDQgZHcgNzgsIDg1Cit0aW1lcyA0IGR3IDMxLCAtNDYKK3RpbWVzIDQgZHcgLTkwLCAtNjcKK3RpbWVzIDQgZHcgNCwgNzMKK3RpbWVzIDQgZHcgODgsIDM4CisKK3RpbWVzIDQgZHcgNzgsIC00Cit0aW1lcyA0IGR3IC04MiwgLTczCit0aW1lcyA0IGR3IDEzLCA4NQordGltZXMgNCBkdyA2NywgLTIyCit0aW1lcyA0IGR3IC04OCwgLTYxCit0aW1lcyA0IGR3IDMxLCA5MAordGltZXMgNCBkdyA1NCwgLTM4Cit0aW1lcyA0IGR3IC05MCwgLTQ2CisKK3RpbWVzIDQgZHcgNzMsIC0zMQordGltZXMgNCBkdyAtOTAsIC0yMgordGltZXMgNCBkdyA3OCwgNjcKK3RpbWVzIDQgZHcgLTM4LCAtOTAKK3RpbWVzIDQgZHcgLTEzLCA4MgordGltZXMgNCBkdyA2MSwgLTQ2Cit0aW1lcyA0IGR3IC04OCwgLTQKK3RpbWVzIDQgZHcgODUsIDU0CisKK3RpbWVzIDQgZHcgNjcsIC01NAordGltZXMgNCBkdyAtNzgsIDM4Cit0aW1lcyA0IGR3IDg1LCAtMjIKK3RpbWVzIDQgZHcgLTkwLCA0Cit0aW1lcyA0IGR3IDkwLCAxMwordGltZXMgNCBkdyAtODgsIC0zMQordGltZXMgNCBkdyA4MiwgNDYKK3RpbWVzIDQgZHcgLTczLCAtNjEKKwordGltZXMgNCBkdyA2MSwgLTczCit0aW1lcyA0IGR3IC00NiwgODIKK3RpbWVzIDQgZHcgMzEsIC04OAordGltZXMgNCBkdyAtMTMsIDkwCit0aW1lcyA0IGR3IC00LCAtOTAKK3RpbWVzIDQgZHcgMjIsIDg1Cit0aW1lcyA0IGR3IC0zOCwgLTc4Cit0aW1lcyA0IGR3IDU0LCA2NworCit0aW1lcyA0IGR3IDU0LCAtODUKK3RpbWVzIDQgZHcgLTQsIDg4Cit0aW1lcyA0IGR3IC00NiwgLTYxCit0aW1lcyA0IGR3IDgyLCAxMwordGltZXMgNCBkdyAtOTAsIDM4Cit0aW1lcyA0IGR3IDY3LCAtNzgKK3RpbWVzIDQgZHcgLTIyLCA5MAordGltZXMgNCBkdyAtMzEsIC03MworCit0aW1lcyA0IGR3IDQ2LCAtOTAKK3RpbWVzIDQgZHcgMzgsIDU0Cit0aW1lcyA0IGR3IC05MCwgMzEKK3RpbWVzIDQgZHcgNjEsIC04OAordGltZXMgNCBkdyAyMiwgNjcKK3RpbWVzIDQgZHcgLTg1LCAxMwordGltZXMgNCBkdyA3MywgLTgyCit0aW1lcyA0IGR3IDQsIDc4CisKK3RpbWVzIDQgZHcgMzgsIC04OAordGltZXMgNCBkdyA3MywgLTQKK3RpbWVzIDQgZHcgLTY3LCA5MAordGltZXMgNCBkdyAtNDYsIC0zMQordGltZXMgNCBkdyA4NSwgLTc4Cit0aW1lcyA0IGR3IDEzLCA2MQordGltZXMgNCBkdyAtOTAsIDU0Cit0aW1lcyA0IGR3IDIyLCAtODIKKwordGltZXMgNCBkdyAzMSwgLTc4Cit0aW1lcyA0IGR3IDkwLCAtNjEKK3RpbWVzIDQgZHcgNCwgNTQKK3RpbWVzIDQgZHcgLTg4LCA4MgordGltZXMgNCBkdyAtMzgsIC0yMgordGltZXMgNCBkdyA3MywgLTkwCit0aW1lcyA0IGR3IDY3LCAtMTMKK3RpbWVzIDQgZHcgLTQ2LCA4NQorCit0aW1lcyA0IGR3IDIyLCAtNjEKK3RpbWVzIDQgZHcgODUsIC05MAordGltZXMgNCBkdyA3MywgLTM4Cit0aW1lcyA0IGR3IC00LCA0NgordGltZXMgNCBkdyAtNzgsIDkwCit0aW1lcyA0IGR3IC04MiwgNTQKK3RpbWVzIDQgZHcgLTEzLCAtMzEKK3RpbWVzIDQgZHcgNjcsIC04OAorCit0aW1lcyA0IGR3IDEzLCAtMzgKK3RpbWVzIDQgZHcgNjEsIC03OAordGltZXMgNCBkdyA4OCwgLTkwCit0aW1lcyA0IGR3IDg1LCAtNzMKK3RpbWVzIDQgZHcgNTQsIC0zMQordGltZXMgNCBkdyA0LCAyMgordGltZXMgNCBkdyAtNDYsIDY3Cit0aW1lcyA0IGR3IC04MiwgOTAKKwordGltZXMgNCBkdyA0LCAtMTMKK3RpbWVzIDQgZHcgMjIsIC0zMQordGltZXMgNCBkdyAzOCwgLTQ2Cit0aW1lcyA0IGR3IDU0LCAtNjEKK3RpbWVzIDQgZHcgNjcsIC03MwordGltZXMgNCBkdyA3OCwgLTgyCit0aW1lcyA0IGR3IDg1LCAtODgKK3RpbWVzIDQgZHcgOTAsIC05MAorCiBTRUNUSU9OIC50ZXh0CiAKLTsgdm9pZCBmZl9oZXZjX2lkY3RIeFdfZGNfezgsMTB9XzxvcHQ+KGludDE2X3QgKmNvZWZmcykKKzsgdm9pZCBmZl9oZXZjX2lkY3RfSHhXX2RjX3s4LDEwfV88b3B0PihpbnQxNl90ICpjb2VmZnMpCiA7ICUxID0gSHhXCiA7ICUyID0gbnVtYmVyIG9mIGxvb3BzCiA7ICUzID0gYml0ZGVwdGgKICVtYWNybyBJRENUX0RDIDMKLWNnbG9iYWwgaGV2Y19pZGN0JTF4JTFfZGNfJTMsIDEsIDIsIDEsIGNvZWZmLCB0bXAKLSAgICBtb3ZzeCAgICAgICAgICAgICB0bXBxLCB3b3JkIFtjb2VmZnFdCi0gICAgYWRkICAgICAgICAgICAgICAgdG1wdywgKCgxIDw8IDE0LSUzKSArIDEpCi0gICAgc2FyICAgICAgICAgICAgICAgdG1wdywgKDE1LSUzKQorY2dsb2JhbCBoZXZjX2lkY3RfJTF4JTFfZGNfJTMsIDEsIDIsIDEsIGNvZWZmLCB0bXAKKyAgICBtb3ZzeCAgICAgICAgICAgICB0bXBkLCB3b3JkIFtjb2VmZnFdCisgICAgYWRkICAgICAgICAgICAgICAgdG1wZCwgKDEgPDwgKDE0IC0gJTMpKSArIDEKKyAgICBzYXIgICAgICAgICAgICAgICB0bXBkLCAoMTUgLSAlMykKICAgICBtb3ZkICAgICAgICAgICAgICAgeG0wLCB0bXBkCiAgICAgU1BMQVRXICAgICAgICAgICAgICBtMCwgeG0wCiAgICAgREVGSU5FX0FSR1MgY29lZmYsIGNudApAQCAtNDEsMTEgKzI1NCwxMSBAQAogICAgIG1vdmEgW2NvZWZmcSttbXNpemUqMV0sIG0wCiAgICAgbW92YSBbY29lZmZxK21tc2l6ZSoyXSwgbTAKICAgICBtb3ZhIFtjb2VmZnErbW1zaXplKjNdLCBtMAotICAgIG1vdmEgW2NvZWZmcSttbXNpemUqNF0sIG0wCi0gICAgbW92YSBbY29lZmZxK21tc2l6ZSo1XSwgbTAKLSAgICBtb3ZhIFtjb2VmZnErbW1zaXplKjZdLCBtMAotICAgIG1vdmEgW2NvZWZmcSttbXNpemUqN10sIG0wCiAgICAgYWRkICBjb2VmZnEsIG1tc2l6ZSo4CisgICAgbW92YSBbY29lZmZxK21tc2l6ZSotNF0sIG0wCisgICAgbW92YSBbY29lZmZxK21tc2l6ZSotM10sIG0wCisgICAgbW92YSBbY29lZmZxK21tc2l6ZSotMl0sIG0wCisgICAgbW92YSBbY29lZmZxK21tc2l6ZSotMV0sIG0wCiAgICAgZGVjICBjbnRkCiAgICAgamcgIC5sb29wCiAgICAgUkVUCkBAIC01NCwxMCArMjY3LDEwIEBACiA7ICUxID0gSHhXCiA7ICUyID0gYml0ZGVwdGgKICVtYWNybyBJRENUX0RDX05MIDIgOyBObyBsb29wCi1jZ2xvYmFsIGhldmNfaWRjdCUxeCUxX2RjXyUyLCAxLCAyLCAxLCBjb2VmZiwgdG1wCi0gICAgbW92c3ggICAgICAgICAgICAgdG1wcSwgd29yZCBbY29lZmZxXQotICAgIGFkZCAgICAgICAgICAgICAgIHRtcHcsICgoMSA8PCAxNC0lMikgKyAxKQotICAgIHNhciAgICAgICAgICAgICAgIHRtcHcsICgxNS0lMikKK2NnbG9iYWwgaGV2Y19pZGN0XyUxeCUxX2RjXyUyLCAxLCAyLCAxLCBjb2VmZiwgdG1wCisgICAgbW92c3ggICAgICAgICAgICAgdG1wZCwgd29yZCBbY29lZmZxXQorICAgIGFkZCAgICAgICAgICAgICAgIHRtcGQsICgxIDw8ICgxNCAtICUyKSkgKyAxCisgICAgc2FyICAgICAgICAgICAgICAgdG1wZCwgKDE1IC0gJTIpCiAgICAgbW92ZCAgICAgICAgICAgICAgICBtMCwgdG1wZAogICAgIFNQTEFUVyAgICAgICAgICAgICAgbTAsIHhtMAogICAgIG1vdmEgW2NvZWZmcSttbXNpemUqMF0sIG0wCkBAIC03Myw1MCArMjg2LDU2OCBAQAogICAgIFJFVAogJWVuZG1hY3JvCiAKLTsgOC1iaXQKKzsgSURDVCA0eDQsIGV4cGVjdHMgaW5wdXQgaW4gbTAsIG0xCis7ICUxIC0gc2hpZnQKKzsgJTIgLSAxLzAgLSBTQ0FMRSBhbmQgVHJhbnNwb3NlIG9yIG5vdAorOyAlMyAtIDEvMCBhZGQgY29uc3RhbnQgb3Igbm90CislbWFjcm8gVFJfNHg0IDMKKyAgICA7IGludGVybGVhdmVzIHNyYzAgd2l0aCBzcmMyIHRvIG0wCisgICAgOyAgICAgICAgIGFuZCBzcmMxIHdpdGggc2NyMyB0byBtMgorICAgIDsgc3JjMDogMDAgMDEgMDIgMDMgICAgIG0wOiAwMCAyMCAwMSAyMSAwMiAyMiAwMyAyMworICAgIDsgc3JjMTogMTAgMTEgMTIgMTMgLS0+CisgICAgOyBzcmMyOiAyMCAyMSAyMiAyMyAgICAgbTE6IDEwIDMwIDExIDMxIDEyIDMyIDEzIDMzCisgICAgOyBzcmMzOiAzMCAzMSAzMiAzMworCisgICAgU0JVVFRFUkZMWSB3ZCwgMCwgMSwgMgorCisgICAgcG1hZGR3ZCBtMiwgbTAsIFtwd182NF0gICAgOyBlMAorICAgIHBtYWRkd2QgbTMsIG0xLCBbcHdfODNfMzZdIDsgbzAKKyAgICBwbWFkZHdkIG0wLCBbcHdfNjRfbTY0XSAgICA7IGUxCisgICAgcG1hZGR3ZCBtMSwgW3B3XzM2X204M10gICAgOyBvMQorCislaWYgJTMgPT0gMQorICAgICVhc3NpZ24gJSVhZGQgMSA8PCAoJTEgLSAxKQorICAgIG1vdmEgIG00LCBbcGRfICUrICUlYWRkXQorICAgIHBhZGRkIG0yLCBtNAorICAgIHBhZGRkIG0wLCBtNAorJWVuZGlmCisKKyAgICBTVU1TVUJfQkFEQyBkLCAzLCAyLCAxLCAwLCA0CisKKyVpZiAlMiA9PSAxCisgICAgcHNyYWQgbTMsICUxIDsgZTAgKyBvMAorICAgIHBzcmFkIG0xLCAlMSA7IGUxICsgbzEKKyAgICBwc3JhZCBtMiwgJTEgOyBlMCAtIG8wCisgICAgcHNyYWQgbTAsICUxIDsgZTEgLSBvMQorICAgIDtjbGlwMTYKKyAgICBwYWNrc3NkdyBtMywgbTEKKyAgICBwYWNrc3NkdyBtMCwgbTIKKyAgICA7IFRyYW5zcG9zZQorICAgIFNCVVRURVJGTFkgd2QsIDMsIDAsIDEKKyAgICBTQlVUVEVSRkxZIHdkLCAzLCAwLCAxCisgICAgU1dBUCAzLCAxLCAwCislZWxzZQorICAgIFNXQVAgMywgMiwgMAorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIERFRklORV9CSUFTIDEKKyAgICAlYXNzaWduIHNoaWZ0ICgyMCAtICUxKQorICAgICVhc3NpZ24gY19hZGQgKDEgPDwgKHNoaWZ0IC0gMSkpCisgICAgJWRlZmluZSBhcnJfYWRkIHBkXyAlKyBjX2FkZAorJWVuZG1hY3JvCisKKzsgJTEgLSBiaXRfZGVwdGgKKzsgJTIgLSByZWdpc3RlciBhZGQgY29uc3RhbnQKKzsgaXMgbG9hZGVkIHRvCis7IHNoaWZ0ID0gMjAgLSBiaXRfZGVwdGgKKyVtYWNybyBMT0FEX0JJQVMgMgorICAgIERFRklORV9CSUFTICUxCisgICAgbW92YSAlMiwgW2Fycl9hZGRdCislZW5kbWFjcm8KKworOyAlMSwgJTIgLSByZWdpc3RlcnMgdG8gbG9hZCBwYWNrZWQgMTYgYml0IHZhbHVlcyB0bworOyAlMywgJTQsICU1LCAlNiAtIHZlcnRpY2FsIG9mZnNldHMKKzsgJTcgLSBob3Jpem9udGFsIG9mZnNldAorJW1hY3JvIExPQURfQkxPQ0sgNworICAgIG1vdnEgICAlMSwgW3IwICsgJTMgKyAlN10KKyAgICBtb3ZocHMgJTEsIFtyMCArICU1ICsgJTddCisgICAgbW92cSAgICUyLCBbcjAgKyAlNCArICU3XQorICAgIG1vdmhwcyAlMiwgW3IwICsgJTYgKyAlN10KKyVlbmRtYWNybworCis7IHZvaWQgZmZfaGV2Y19pZGN0XzR4NF9fezgsMTB9XzxvcHQ+KGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCkKKzsgJTEgPSBiaXRkZXB0aAorJW1hY3JvIElEQ1RfNHg0IDEKK2NnbG9iYWwgaGV2Y19pZGN0XzR4NF8lMSwgMSwgMSwgNSwgY29lZmZzCisgICAgbW92YSBtMCwgW2NvZWZmc3FdCisgICAgbW92YSBtMSwgW2NvZWZmc3EgKyAxNl0KKworICAgIFRSXzR4NCA3LCAxLCAxCisgICAgVFJfNHg0IDIwIC0gJTEsIDEsIDEKKworICAgIG1vdmEgW2NvZWZmc3FdLCAgICAgIG0wCisgICAgbW92YSBbY29lZmZzcSArIDE2XSwgbTEKKyAgICBSRVQKKyVlbmRtYWNybworCis7IHNjYWxlLCBwYWNrIChjbGlwMTYpIGFuZCBzdG9yZSB0aGUgcmVzaWR1YWxzICAgICAwIGU4WzBdICsgbzhbMF0gLS0+ICsgJTEKKzsgNCBhdCBvbmUgdGltZSAoNCBjb2x1bW5zKSAgICAgICAgICAgICAgICAgICAgICAgIDEgZThbMV0gKyBvOFsxXQorOyBmcm9tICU1OiBlOC8xNiArIG84LzE2LCB3aXRoICUxIG9mZnNldCAgICAgICAgICAgICAgICAgIC4uLgorOyBhbmQgICUzOiBlOC8xNiAtIG84LzE2LCB3aXRoICUyIG9mZnNldCAgICAgICAgICAgNiBlOFsxXSAtIG84WzFdCis7ICU0IC0gc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3IGU4WzBdIC0gbzhbMF0gLS0+ICsgJTIKKyVtYWNybyBTVE9SRV84IDcKKyAgICBwc3JhZCAgICAlNSwgJTQKKyAgICBwc3JhZCAgICAlMywgJTQKKyAgICBwYWNrc3NkdyAlNSwgJTMKKyAgICBtb3ZxICAgICBbY29lZmZzcSArICUxXSwgJTUKKyAgICBtb3ZocHMgICBbY29lZmZzcSArICUyXSwgJTUKKyVlbmRtYWNybworCis7ICUxIC0gaG9yaXpvbnRhbCBvZmZzZXQKKzsgJTIgLSBzaGlmdAorOyAlMywgJTQgLSB0cmFuc2Zvcm0gY29lZmZzCis7ICU1IC0gdmVydGljYWwgb2Zmc2V0IGZvciBlOCArIG84Cis7ICU2IC0gdmVydGljYWwgb2Zmc2V0IGZvciBlOCAtIG84Cis7ICU3IC0gcmVnaXN0ZXIgd2l0aCBlOCBpbnNpZGUKKzsgJTggLSBibG9ja19zaXplCis7ICU5IC0gcmVnaXN0ZXIgdG8gc3RvcmUgZTggK284Cis7ICUxMCAtIHJlZ2lzdGVyIHRvIHN0b3JlIGU4IC0gbzgKKyVtYWNybyBFOF9POCAxMAorICAgIHBtYWRkd2QgbTYsIG00LCAlMworICAgIHBtYWRkd2QgbTcsIG01LCAlNAorCisgICAgcGFkZGQgbTYsIG03CisgICAgcGFkZGQgbTcsIG02LCAlNyA7IG84ICsgZTgKKyAgICBwc3ViZCAlNywgbTYgICAgIDsgZTggLSBvOAorJWlmICU4ID09IDgKKyAgICBTVE9SRV84ICU1ICsgJTEsICU2ICsgJTEsICU3LCAlMiwgbTcsIDAsIDAKKyVlbHNlCisgICAgU1dBUCBtNywgJTkKKyAgICBTV0FQICU3LCAlMTAKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgOHg0IHJlc2lkdWFscyBhcmUgcHJvY2Vzc2VkIGFuZCBzdG9yZWQKKzsgJTEgLSBob3Jpem9udGFsIG9mZnNldAorOyAlMiAtIHNoaWZ0Cis7ICUzIC0gb2Zmc2V0IG9mIHRoZSBldmVuIHJvdworOyAlNCAtIHN0ZXA6IDEgZm9yIDh4OCwgMiBmb3IgMTZ4MTYsIDQgZm9yIDMyeDMyCis7ICU1IC0gb2Zmc2V0IG9mIHRoZSBvZGQgcm93Cis7ICU2IC0gYmxvY2sgc2l6ZQorOyAlNyAtIDEvMCBhZGQgYSBjb25zdGFudCBpbiBUUl80eDQgb3Igbm90Cis7IEkgd2FudCB0byBhZGQgYSBjb25zdGFudCBmb3IgOHg4IHRyYW5zZm9ybSBidXQgbm90IGZvciAxNngxNiBhbmQgMzJ4MzIKKyVtYWNybyBUUl84eDQgNworICAgIDsgbG9hZCA0IGNvbHVtbnMgb2YgZXZlbiByb3dzCisgICAgTE9BRF9CTE9DSyAgbTAsIG0xLCAwLCAyICogJTQgKiAlMywgJTQgKiAlMywgMyAqICU0ICogJTMsICUxCisKKyAgICBUUl80eDQgJTIsIDAsICU3IDsgZTg6IG0wLCBtMSwgbTIsIG0zLCBmb3IgNCBjb2x1bW5zIG9ubHkKKworICAgIDsgbG9hZCA0IGNvbHVtbnMgb2Ygb2RkIHJvd3MKKyAgICBMT0FEX0JMT0NLIG00LCBtNSwgJTQgKiAlNSwgMyAqICU0ICogJTUsIDUgKiAlNCAqICU1LCA3ICogJTQgKiAlNSwgJTEKKworICAgIDsgMDAgMDEgMDIgMDMKKyAgICA7IDEwIDExIDEyIDEzICAgICAgbTQ6IDEwIDMwIDExIDMxIDEyIDMyIDEzIDMzCisKKyAgICA7IC4uLiAgICAgICAgLS0gPgorICAgIDsgICAgICAgICAgICAgICAgICBtNTogNTAgNzAgNTEgNzEgNTIgNzIgNTMgNzMKKyAgICA7IDcwIDcxIDcyIDczCisgICAgU0JVVFRFUkZMWSB3ZCwgNCwgNSwgNgorCisgICAgRThfTzggJTEsICUyLCBbcHdfODlfNzVdLCAgW3B3XzUwXzE4XSwgICAwLCAgICAgICU1ICogNywgbTAsICU2LCBtOCwgbTE1CisgICAgRThfTzggJTEsICUyLCBbcHdfNzVfbTE4XSwgW3B3X204OV9tNTBdLCAlNSwgICAgICU1ICogNiwgbTEsICU2LCBtOSwgbTE0CisgICAgRThfTzggJTEsICUyLCBbcHdfNTBfbTg5XSwgW3B3XzE4Xzc1XSwgICAlNSAqIDIsICU1ICogNSwgbTIsICU2LCBtMTAsIG0xMworICAgIEU4X084ICUxLCAlMiwgW3B3XzE4X201MF0sIFtwd183NV9tODldLCAgJTUgKiAzLCAlNSAqIDQsIG0zLCAlNiwgbTExLCBtMTIKKyVlbmRtYWNybworCislbWFjcm8gU1RPUkVfUEFDS0VEIDcKKyAgICBtb3ZxICAgW3IwICsgJTMgKyAlN10sICUxCisgICAgbW92aHBzIFtyMCArICU0ICsgJTddLCAlMQorICAgIG1vdnEgICBbcjAgKyAlNSArICU3XSwgJTIKKyAgICBtb3ZocHMgW3IwICsgJTYgKyAlN10sICUyCislZW5kbWFjcm8KKworOyB0cmFuc3Bvc2UgNHg0IGJsb2NrIHBhY2tlZAorOyBpbiAlMSBhbmQgJTIgcmVnaXN0ZXJzCis7ICUzIC0gdGVtcG9yYXJ5IHJlZ2lzdGVyCislbWFjcm8gVFJBTlNQT1NFXzR4NCAzCisgICAgU0JVVFRFUkZMWSB3ZCwgJTEsICUyLCAlMworICAgIFNCVVRURVJGTFkgZHEsICUxLCAlMiwgJTMKKyVlbmRtYWNybworCis7ICUxIC0gaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIGJsb2NrIGkKKzsgJTIgLSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIGJsb2NrIGkKKzsgJTMgLSB3aWR0aCBpbiBieXRlcworOyAlNCAtIHZlcnRpY2FsIG9mZnNldCBmb3IgdGhlIGJsb2NrIGoKKzsgJTUgLSBob3Jpem9udGFsIG9mZnNldCBmb3IgdGhlIGJsb2NrIGoKKyVtYWNybyBTV0FQX0JMT0NLUyA1CisgICAgOyBNX2oKKyAgICBMT0FEX0JMT0NLIG00LCBtNSwgJTQsICU0ICsgJTMsICU0ICsgMiAqICUzLCAlNCArIDMgKiAlMywgJTUKKyAgICBUUkFOU1BPU0VfNHg0IDQsIDUsIDYKKworICAgIDsgTV9pCisgICAgTE9BRF9CTE9DSyBtNiwgbTcsICUyLCAlMiArICUzLCAlMiArIDIgKiAlMywgJTIgKyAzICogJTMsICUxCisKKyAgICBTVE9SRV9QQUNLRUQgbTQsIG01LCAlMiwgJTIgKyAlMywgJTIgKyAyICogJTMsICUyICsgMyAqICUzLCAlMQorCisgICAgOyB0cmFuc3Bvc2UgYW5kIHN0b3JlIE1faQorICAgIFNXQVAgbTYsIG00CisgICAgU1dBUCBtNywgbTUKKyAgICBUUkFOU1BPU0VfNHg0IDQsIDUsIDYKKyAgICBTVE9SRV9QQUNLRUQgbTQsIG01LCAlNCwgJTQgKyAlMywgJTQgKyAyICogJTMsICU0ICsgMyAqICUzLCAlNQorJWVuZG1hY3JvCisKKzsgJTEgLSBob3Jpem9udGFsIG9mZnNldAorOyAlMiAtIHZlcnRpY2FsIG9mZnNldCBvZiB0aGUgYmxvY2sKKzsgJTMgLSB3aWR0aCBpbiBieXRlcworJW1hY3JvIFRSQU5TUE9TRV9CTE9DSyAzCisgICAgTE9BRF9CTE9DSyBtNCwgbTUsICUyLCAlMiArICUzLCAlMiArIDIgKiAlMywgJTIgKyAzICogJTMsICUxCisgICAgVFJBTlNQT1NFXzR4NCA0LCA1LCA2CisgICAgU1RPUkVfUEFDS0VEIG00LCBtNSwgJTIsICUyICsgJTMsICUyICsgMiAqICUzLCAlMiArIDMgKiAlMywgJTEKKyVlbmRtYWNybworCislbWFjcm8gVFJBTlNQT1NFXzh4OCAwCitjZ2xvYmFsIGhldmNfaWRjdF90cmFuc3Bvc2VfOHg4LCAwLCAwLCAwCisgICAgOyBNMSBNMiBeVCA9IE0xXnQgTTNedAorICAgIDsgTTMgTTQgICAgICBNMl50IE00XnQKKworICAgIDsgTTEgNHg0IGJsb2NrCisgICAgVFJBTlNQT1NFX0JMT0NLIDAsIDAsIDE2CisKKyAgICA7IE0yIGFuZCBNMworICAgIFNXQVBfQkxPQ0tTIDAsIDY0LCAxNiwgMCwgOAorCisgICAgOyBNNAorICAgIFRSQU5TUE9TRV9CTE9DSyA4LCA2NCwgMTYKKworICAgIHJldAorJWVuZG1hY3JvCisKKzsgdm9pZCBmZl9oZXZjX2lkY3RfOHg4X3s4LDEwfV88b3B0PihpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpCis7ICUxID0gYml0ZGVwdGgKKyVtYWNybyBJRENUXzh4OCAxCitjZ2xvYmFsIGhldmNfaWRjdF84eDhfJTEsIDEsIDEsIDgsIGNvZWZmcworICAgIFRSXzh4NCAwLCA3LCAzMiwgMSwgMTYsIDgsIDEKKyAgICBUUl84eDQgOCwgNywgMzIsIDEsIDE2LCA4LCAxCisKKyAgICBjYWxsIGhldmNfaWRjdF90cmFuc3Bvc2VfOHg4XyAlKyBjcHVuYW1lCisKKyAgICBERUZJTkVfQklBUyAlMQorICAgIFRSXzh4NCAwLCBzaGlmdCwgMzIsIDEsIDE2LCA4LCAxCisgICAgVFJfOHg0IDgsIHNoaWZ0LCAzMiwgMSwgMTYsIDgsIDEKKworICAgIFRBSUxfQ0FMTCBoZXZjX2lkY3RfdHJhbnNwb3NlXzh4OF8gJSsgY3B1bmFtZSwgMQorJWVuZG1hY3JvCisKKzsgc3RvcmUgaW50ZXJtZWRpdGUgZTMyIGNvZWZmcyBvbiBzdGFjaworOyBhcyAxNng0IG1hdHJpeAorOyBmcm9tIG0xMDogZTggKyBvOCwgd2l0aCAlNiBvZmZzZXQKKzsgYW5kICAlMzogIGU4IC0gbzgsIHdpdGggJTcgb2Zmc2V0Cis7ICU0IC0gc2hpZnQsIHVudXNlZCBoZXJlCislbWFjcm8gU1RPUkVfMTYgNworICAgIG1vdmEgW3JzcCArICU2XSwgJTUKKyAgICBtb3ZhIFtyc3AgKyAlN10sICUzCislZW5kbWFjcm8KKworOyAlMSwgJTIgLSB0cmFuc2Zvcm0gY29uc3RhbnRzCis7ICUzLCAlNCAtIHJlZ3Mgd2l0aCBpbnRlcmxlYXZlZCBjb2VmZnMKKzsgJTUgLSAxLzAgU1dBUCBvciBhZGQKKzsgJTYsICU3IC0gcmVnaXN0ZXJzIGZvciBpbnRlcm1pZGlhdGUgc3VtcworOyAlOCAtIGFjY3VtdWxhdG9yIHJlZ2lzdGVyCislbWFjcm8gQUREX1JPV1MgOAorICAgIHBtYWRkd2QgJTYsICUzLCAlMQorICAgIHBtYWRkd2QgJTcsICU0LCAlMgorICAgIHBhZGRkICAgJTYsICU3CislaWYgJTUgPT0gMQorICAgIFNXQVAgJTYsICU4CislZWxzZQorICAgIHBhZGRkICU4LCAlNgorJWVuZGlmCislZW5kbWFjcm8KKworOyAlMSAtIHRyYW5zZm9ybSBjb2VmZnMKKzsgJTIsICUzIG9mZnNldHMgZm9yIHN0b3JpbmcgZStvL2UtbyBiYWNrIHRvIGNvZWZmc3EKKzsgJTQgLSBzaGlmdAorOyAlNSAtIGFkZAorOyAlNiAtIGJsb2NrX3NpemUKKzsgJTcgLSByZWdpc3RlciB3aXRoIGUxNgorOyAlOCwgJTkgLSBzdGFjayBvZmZzZXRzIGZvciBzdG9yaW5nIGUrby9lLW8KKyVtYWNybyBFMTZfTzE2IDkKKyAgICBBRERfUk9XUyBbJTFdLCAgICAgICAgICBbJTEgKyAgICAgMTZdLCBtMCwgbTEsIDEsIG01LCBtNiwgbTcKKyAgICBBRERfUk9XUyBbJTEgKyAyICogMTZdLCBbJTEgKyAzICogMTZdLCBtMiwgbTMsIDAsIG01LCBtNiwgbTcKKworJWlmICU2ID09IDgKKyAgICBwYWRkZCAlNywgJTUKKyVlbmRpZgorCisgICAgcGFkZGQgbTQsIG03LCAlNyA7IG8xNiArIGUxNgorICAgIHBzdWJkICU3LCBtNyAgICAgOyBlMTYgLSBvMTYKKyAgICBTVE9SRV8lNiAlMiwgJTMsICU3LCAlNCwgbTQsICU4LCAlOQorJWVuZG1hY3JvCisKKyVtYWNybyBUUl8xNng0IDEwCisgICAgOyBwcm9kdWNlIDh4NCBtYXRyaXggb2YgZTE2IGNvZWZmcworICAgIDsgZm9yIDQgZmlyc3Qgcm93cyBhbmQgc3RvcmUgaXQgb24gc3RhY2sgKDEyOCBieXRlcykKKyAgICBUUl84eDQgJTEsIDcsICU0LCAlNSwgJTYsICU4LCAwCisKKyAgICA7IGxvYWQgOCBldmVuIHJvd3MKKyAgICBMT0FEX0JMT0NLIG0wLCBtMSwgJTkgKiAlNiwgJTkgKiAzICogJTYsICU5ICogNSAqICU2LCAlOSAqIDcgKiAlNiwgJTEKKyAgICBMT0FEX0JMT0NLIG0yLCBtMywgJTkgKiA5ICogJTYsICU5ICogMTEgKiAlNiwgJTkgKiAxMyAqICU2LCAlOSAqIDE1ICogJTYsICUxCisKKyAgICBTQlVUVEVSRkxZIHdkLCAwLCAxLCA0CisgICAgU0JVVFRFUkZMWSB3ZCwgMiwgMywgNAorCisgICAgRTE2X08xNiB0cmFuc19jb2VmZnMxNiwgICAgICAgICAgICAgICAwICsgJTEsIDE1ICogJTYgKyAlMSwgJTIsICUzLCAlNywgbTgsICAgICAgIDAsIDE1ICogMTYKKyAgICBtb3ZhIG04LCAlMworICAgIEUxNl9PMTYgdHJhbnNfY29lZmZzMTYgKyAgICAgNjQsICAgICAlNiArICUxLCAxNCAqICU2ICsgJTEsICUyLCBtOCwgJTcsIG05LCAgICAgIDE2LCAxNCAqIDE2CisgICAgRTE2X08xNiB0cmFuc19jb2VmZnMxNiArIDIgKiA2NCwgMiAqICU2ICsgJTEsIDEzICogJTYgKyAlMSwgJTIsIG04LCAlNywgbTEwLCAyICogMTYsIDEzICogMTYKKyAgICBFMTZfTzE2IHRyYW5zX2NvZWZmczE2ICsgMyAqIDY0LCAzICogJTYgKyAlMSwgMTIgKiAlNiArICUxLCAlMiwgbTgsICU3LCBtMTEsIDMgKiAxNiwgMTIgKiAxNgorICAgIEUxNl9PMTYgdHJhbnNfY29lZmZzMTYgKyA0ICogNjQsIDQgKiAlNiArICUxLCAxMSAqICU2ICsgJTEsICUyLCBtOCwgJTcsIG0xMiwgNCAqIDE2LCAxMSAqIDE2CisgICAgRTE2X08xNiB0cmFuc19jb2VmZnMxNiArIDUgKiA2NCwgNSAqICU2ICsgJTEsIDEwICogJTYgKyAlMSwgJTIsIG04LCAlNywgbTEzLCA1ICogMTYsIDEwICogMTYKKyAgICBFMTZfTzE2IHRyYW5zX2NvZWZmczE2ICsgNiAqIDY0LCA2ICogJTYgKyAlMSwgIDkgKiAlNiArICUxLCAlMiwgbTgsICU3LCBtMTQsIDYgKiAxNiwgIDkgKiAxNgorICAgIEUxNl9PMTYgdHJhbnNfY29lZmZzMTYgKyA3ICogNjQsIDcgKiAlNiArICUxLCAgOCAqICU2ICsgJTEsICUyLCBtOCwgJTcsIG0xNSwgNyAqIDE2LCAgOCAqIDE2CislZW5kbWFjcm8KKworJW1hY3JvIFRSQU5TUE9TRV8xNngxNiAwCitjZ2xvYmFsIGhldmNfaWRjdF90cmFuc3Bvc2VfMTZ4MTYsIDAsIDAsIDAKKzsgTTEgIE0yICBNMyAgTTQgXlQgICAgICBtMSBtNSBtOSAgbTEzICAgTV9pXlQgPSBtX2kKKzsgTTUgIE02ICBNNyAgTTggICAgLS0+ICBtMiBtNiBtMTAgbTE0Cis7IE05ICBNMTAgTTExIE0xMiAgICAgICAgbTMgbTcgbTExIG0xNQorOyBNMTMgTTE0IE0xNSBNMTYgICAgICAgIG00IG04IG0xMiBtMTYKKworICAgIDsgTTEgNHg0IGJsb2NrCisgICAgVFJBTlNQT1NFX0JMT0NLIDAsIDAsIDMyCisKKyAgICA7IE01LCBNMgorICAgIFNXQVBfQkxPQ0tTIDAsIDEyOCwgMzIsIDAsIDgKKyAgICA7IE05LCBNMworICAgIFNXQVBfQkxPQ0tTIDAsIDI1NiwgMzIsIDAsIDE2CisgICAgOyBNMTMsIE00CisgICAgU1dBUF9CTE9DS1MgMCwgMzg0LCAzMiwgMCwgMjQKKworICAgIDtNNgorICAgIFRSQU5TUE9TRV9CTE9DSyA4LCAxMjgsIDMyCisKKyAgICA7IE0xMCwgTTcKKyAgICBTV0FQX0JMT0NLUyA4LCAyNTYsIDMyLCAxMjgsIDE2CisgICAgOyBNMTQsIE04CisgICAgU1dBUF9CTE9DS1MgOCwgMzg0LCAzMiwgMTI4LCAyNAorCisgICAgO00xMQorICAgIFRSQU5TUE9TRV9CTE9DSyAxNiwgMjU2LCAzMgorCisgICAgOyBNMTUsIE0xMgorICAgIFNXQVBfQkxPQ0tTIDE2LCAzODQsIDMyLCAyNTYsIDI0CisKKyAgICA7TTE2CisgICAgVFJBTlNQT1NFX0JMT0NLIDI0LCAzODQsIDMyCisKKyAgICByZXQKKyVlbmRtYWNybworCis7IHZvaWQgZmZfaGV2Y19pZGN0XzE2eDE2X3s4LDEwfV88b3B0PihpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpCis7ICUxID0gYml0ZGVwdGgKKyVtYWNybyBJRENUXzE2eDE2IDEKK2NnbG9iYWwgaGV2Y19pZGN0XzE2eDE2XyUxLCAxLCAyLCAxNiwgY29lZmZzCisgICAgbW92IHIxZCwgMworLmxvb3AxNjoKKyAgICBUUl8xNng0IDggKiByMSwgNywgW3BkXzY0XSwgNjQsIDIsIDMyLCA4LCAxNiwgMSwgMAorICAgIGRlYyByMWQKKyAgICBqZ2UgLmxvb3AxNgorCisgICAgY2FsbCBoZXZjX2lkY3RfdHJhbnNwb3NlXzE2eDE2XyAlKyBjcHVuYW1lCisKKyAgICBERUZJTkVfQklBUyAlMQorICAgIG1vdiByMWQsIDMKKy5sb29wMTZfMjoKKyAgICBUUl8xNng0IDggKiByMSwgc2hpZnQsIFthcnJfYWRkXSwgNjQsIDIsIDMyLCA4LCAxNiwgMSwgMQorICAgIGRlYyByMWQKKyAgICBqZ2UgLmxvb3AxNl8yCisKKyAgICBUQUlMX0NBTEwgaGV2Y19pZGN0X3RyYW5zcG9zZV8xNngxNl8gJSsgY3B1bmFtZSwgMQorJWVuZG1hY3JvCisKKzsgc2NhbGUsIHBhY2sgKGNsaXAxNikgYW5kIHN0b3JlIHRoZSByZXNpZHVhbHMgICAgIDAgZTMyWzBdICsgbzMyWzBdIC0tPiAlMQorOyA0IGF0IG9uZSB0aW1lICg0IGNvbHVtbnMpICAgICAgICAgICAgICAgICAgICAgICAgMSBlMzJbMV0gKyBvMzJbMV0KKzsgJTEgLSBhZGRyZXNzIHRvIHN0b3JlIGUzMiArIG8zMgorOyAlMiAtIGFkZHJlc3MgdG8gc3RvcmUgZTMyIC0gZTMyCis7ICU1IC0gcmVnIHdpdGggZTMyICsgbzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgorOyAlMyAtIHJlZyB3aXRoIGUzMiAtIG8zMiAgICAgICAgICAgICAgICAgICAgICAgICAgMzAgZTMyWzFdIC0gbzMyWzFdCis7ICU0IC0gc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSBlMzJbMF0gLSBvMzJbMF0gLS0+ICUyCislbWFjcm8gU1RPUkVfMzIgNQorICAgIHBzcmFkICAgICU1LCAlNAorICAgIHBzcmFkICAgICUzLCAlNAorICAgIHBhY2tzc2R3ICU1LCAlMworICAgIG1vdnEgICAgIFslMV0sICU1CisgICAgbW92aHBzICAgWyUyXSwgJTUKKyVlbmRtYWNybworCis7ICUxIC0gdHJhbnNmb3JtIGNvZWZmcworOyAlMiAtIHN0YWNrIG9mZnNldCBmb3IgZTMyCis7ICUyLCAlMyBvZmZzZXRzIGZvciBzdG9yaW5nIGUrby9lLW8gYmFjayB0byBjb2VmZnNxCis7ICU0IC0gc2hpZnQKKzsgJTUgLSBzdGFjayBvZmZzZXQgb2YgZTMyCislbWFjcm8gRTMyX08zMiA1CisgICAgQUREX1JPV1MgWyUxXSwgICAgICAgICAgWyUxICsgICAgIDE2XSwgbTAsIG0xLCAxLCBtOCwgbTksIG0xMAorICAgIEFERF9ST1dTIFslMSArIDIgKiAxNl0sIFslMSArIDMgKiAxNl0sIG0yLCBtMywgMCwgbTgsIG05LCBtMTAKKyAgICBBRERfUk9XUyBbJTEgKyA0ICogMTZdLCBbJTEgKyA1ICogMTZdLCBtNCwgbTUsIDAsIG04LCBtOSwgbTEwCisgICAgQUREX1JPV1MgWyUxICsgNiAqIDE2XSwgWyUxICsgNyAqIDE2XSwgbTYsIG03LCAwLCBtOCwgbTksIG0xMAorCisgICAgcGFkZGQgbTExLCBtMTQsIFtyc3AgKyAlNV0KKyAgICBwYWRkZCBtMTIsIG0xMCwgbTExIDsgbzMyICsgZTMyCisgICAgcHN1YmQgbTExLCBtMTAgICAgICA7IGUzMiAtIG8zMgorICAgIFNUT1JFXzMyICUyLCAlMywgbTExLCAlNCwgbTEyCislZW5kbWFjcm8KKworOyAlMSAtIGhvcml6b250YWwgb2Zmc2V0Cis7ICUyIC0gYml0ZGVwdGgKKyVtYWNybyBUUl8zMng0IDMKKyAgICBUUl8xNng0ICUxLCA3LCBbcGRfNjRdLCAxMjgsIDQsIDY0LCAxNiwgMTYsIDIsIDAKKworICAgIExPQURfQkxPQ0sgbTAsIG0xLCAgICAgIDY0LCAgMyAqIDY0LCAgNSAqIDY0LCAgNyAqIDY0LCAlMQorICAgIExPQURfQkxPQ0sgbTIsIG0zLCAgOSAqIDY0LCAxMSAqIDY0LCAxMyAqIDY0LCAxNSAqIDY0LCAlMQorICAgIExPQURfQkxPQ0sgbTQsIG01LCAxNyAqIDY0LCAxOSAqIDY0LCAyMSAqIDY0LCAyMyAqIDY0LCAlMQorICAgIExPQURfQkxPQ0sgbTYsIG03LCAyNSAqIDY0LCAyNyAqIDY0LCAyOSAqIDY0LCAzMSAqIDY0LCAlMQorCisgICAgU0JVVFRFUkZMWSB3ZCwgMCwgMSwgOAorICAgIFNCVVRURVJGTFkgd2QsIDIsIDMsIDgKKyAgICBTQlVUVEVSRkxZIHdkLCA0LCA1LCA4CisgICAgU0JVVFRFUkZMWSB3ZCwgNiwgNywgOAorCislaWYgJTMgPT0gMQorICAgICVhc3NpZ24gc2hpZnQgNworICAgIG1vdmEgbTE0LCBbcGRfNjRdCislZWxzZQorICAgIExPQURfQklBUyAlMiwgbTE0CislZW5kaWYKKworICAgIGxlYSByMiwgW3RyYW5zX2NvZWZmMzIgKyAxNSAqIDEyOF0KKyAgICBsZWEgcjMsIFtjb2VmZnNxICsgJTFdCisgICAgbGVhIHI0LCBbcjMgKyAxNiAqIDY0XQorICAgIG1vdiByNWQsIDE1ICogMTYKKyUlbG9vcDoKKyAgICBFMzJfTzMyIHIyLCByMyArIHI1ICogNCwgcjQsIHNoaWZ0LCByNQorICAgIHN1YiByMiwgMTI4CisgICAgYWRkIHI0LCA2NAorICAgIHN1YiByNWQsIDE2CisgICAgamdlICUlbG9vcAorJWVuZG1hY3JvCisKKyVtYWNybyBUUkFOU1BPU0VfMzJ4MzIgMAorY2dsb2JhbCBoZXZjX2lkY3RfdHJhbnNwb3NlXzMyeDMyLCAwLCAwLCAwCisgICAgOyBNMCAgTTEgLi4uIE03CisgICAgOyBNOCAgICAgICAgIE0xNQorICAgIDsKKyAgICA7IC4uLgorICAgIDsKKyAgICA7IE01NiAgICAgICAgTTYzCisKKyAgICBUUkFOU1BPU0VfQkxPQ0sgMCwgMCwgNjQgOyBNMQorICAgIG1vdiByMWQsIDcKKyAgICBtb3YgcjJkLCA3ICogMjU2CisubG9vcF90cmFuc3Bvc2U6CisgICAgU1dBUF9CTE9DS1MgMCwgcjIsIDY0LCAwLCByMSAqIDgKKyAgICBzdWIgcjJkLCAyNTYKKyAgICBkZWMgcjFkCisgICAgamcgLmxvb3BfdHJhbnNwb3NlCisKKyAgICBUUkFOU1BPU0VfQkxPQ0sgOCwgMjU2LCA2NCA7IE05CisgICAgbW92IHIxZCwgNgorICAgIG1vdiByMmQsIDUxMgorICAgIG1vdiByM2QsIDE2CisubG9vcF90cmFuc3Bvc2UyOgorICAgIFNXQVBfQkxPQ0tTIDgsIHIyLCA2NCwgMjU2LCByMworICAgIGFkZCByM2QsIDgKKyAgICBhZGQgcjJkLCAyNTYKKyAgICBkZWMgcjFkCisgICAgamcgLmxvb3BfdHJhbnNwb3NlMgorCisgICAgVFJBTlNQT1NFX0JMT0NLIDIgKiA4LCAyICogMjU2LCA2NCA7IE05CisgICAgbW92IHIxZCwgNQorICAgIG1vdiByMmQsIDc2OAorICAgIG1vdiByM2QsIDI0CisubG9vcF90cmFuc3Bvc2UzOgorICAgIFNXQVBfQkxPQ0tTIDIgKiA4LCByMiwgNjQsIDIgKiAyNTYsIHIzCisgICAgYWRkIHIzZCwgOAorICAgIGFkZCByMmQsIDI1NgorICAgIGRlYyByMWQKKyAgICBqZyAubG9vcF90cmFuc3Bvc2UzCisKKyAgICBUUkFOU1BPU0VfQkxPQ0sgMyAqIDgsIDMgKiAyNTYsIDY0IDsgTTI3CisgICAgbW92IHIxZCwgNAorICAgIG1vdiByMmQsIDEwMjQKKyAgICBtb3YgcjNkLCAzMgorLmxvb3BfdHJhbnNwb3NlNDoKKyAgICBTV0FQX0JMT0NLUyAzICogOCwgcjIsIDY0LCAzICogMjU2LCByMworICAgIGFkZCByM2QsIDgKKyAgICBhZGQgcjJkLCAyNTYKKyAgICBkZWMgcjFkCisgICAgamcgLmxvb3BfdHJhbnNwb3NlNAorCisgICAgVFJBTlNQT1NFX0JMT0NLIDQgKiA4LCA0ICogMjU2LCA2NCA7IE0zNgorICAgIG1vdiByMWQsIDMKKyAgICBtb3YgcjJkLCAxMjgwCisgICAgbW92IHIzZCwgNDAKKy5sb29wX3RyYW5zcG9zZTU6CisgICAgU1dBUF9CTE9DS1MgNCAqIDgsIHIyLCA2NCwgNCAqIDI1NiwgcjMKKyAgICBhZGQgcjNkLCA4CisgICAgYWRkIHIyZCwgMjU2CisgICAgZGVjIHIxZAorICAgIGpnIC5sb29wX3RyYW5zcG9zZTUKKworICAgIFRSQU5TUE9TRV9CTE9DSyA1ICogOCwgNSAqIDI1NiwgNjQgOyBNNDUKKyAgICBTV0FQX0JMT0NLUyA1ICogOCwgNiAqIDI1NiwgNjQsIDUgKiAyNTYsIDYgKiA4CisgICAgU1dBUF9CTE9DS1MgNSAqIDgsIDcgKiAyNTYsIDY0LCA1ICogMjU2LCA3ICogOAorCisgICAgVFJBTlNQT1NFX0JMT0NLIDYgKiA4LCA2ICogMjU2LCA2NCA7IE01NAorICAgIFNXQVBfQkxPQ0tTIDYgKiA4LCA3ICogMjU2LCA2NCwgNiAqIDI1NiwgNyAqIDgKKworICAgIFRSQU5TUE9TRV9CTE9DSyA3ICogOCwgNyAqIDI1NiwgNjQgOyBNNjMKKworICAgIHJldAorJWVuZG1hY3JvCisKKzsgdm9pZCBmZl9oZXZjX2lkY3RfMzJ4MzJfezgsMTB9XzxvcHQ+KGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCkKKzsgJTEgPSBiaXRkZXB0aAorJW1hY3JvIElEQ1RfMzJ4MzIgMQorY2dsb2JhbCBoZXZjX2lkY3RfMzJ4MzJfJTEsIDEsIDYsIDE2LCAyNTYsIGNvZWZmcworICAgIG1vdiByMWQsIDcKKy5sb29wMzI6CisgICAgVFJfMzJ4NCA4ICogcjEsICUxLCAxCisgICAgZGVjIHIxZAorICAgIGpnZSAubG9vcDMyCisKKyAgICBjYWxsIGhldmNfaWRjdF90cmFuc3Bvc2VfMzJ4MzJfICUrIGNwdW5hbWUKKworICAgIG1vdiByMWQsIDcKKy5sb29wMzJfMjoKKyAgICBUUl8zMng0IDggKiByMSwgJTEsIDAKKyAgICBkZWMgcjFkCisgICAgamdlIC5sb29wMzJfMgorCisgICAgVEFJTF9DQUxMIGhldmNfaWRjdF90cmFuc3Bvc2VfMzJ4MzJfICUrIGNwdW5hbWUsIDEKKyVlbmRtYWNybworCislbWFjcm8gSU5JVF9JRENUX0RDIDEKIElOSVRfTU1YIG1teGV4dAotSURDVF9EQ19OTCAgNCwgICAgICA4Ci1JRENUX0RDICAgICA4LCAgMiwgIDgKK0lEQ1RfRENfTkwgIDQsICAgICAgJTEKK0lEQ1RfREMgICAgIDgsICAyLCAgJTEKIAogSU5JVF9YTU0gc3NlMgotSURDVF9EQ19OTCAgOCwgICAgICA4Ci1JRENUX0RDICAgIDE2LCAgNCwgIDgKLUlEQ1RfREMgICAgMzIsIDE2LCAgOAorSURDVF9EQ19OTCAgOCwgICAgICAlMQorSURDVF9EQyAgICAxNiwgIDQsICAlMQorSURDVF9EQyAgICAzMiwgMTYsICAlMQogCiAlaWYgSEFWRV9BVlgyX0VYVEVSTkFMCi1JTklUX1lNTSBhdngyCi1JRENUX0RDICAgIDE2LCAgMiwgIDgKLUlEQ1RfREMgICAgMzIsICA4LCAgOAorICAgIElOSVRfWU1NIGF2eDIKKyAgICBJRENUX0RDICAgIDE2LCAgMiwgICUxCisgICAgSURDVF9EQyAgICAzMiwgIDgsICAlMQogJWVuZGlmIDtIQVZFX0FWWDJfRVhURVJOQUwKKyVlbmRtYWNybwogCi07IDEwLWJpdAotSU5JVF9NTVggbW14ZXh0Ci1JRENUX0RDX05MICA0LCAgICAgMTAKLUlEQ1RfREMgICAgIDgsICAyLCAxMAorJW1hY3JvIElOSVRfSURDVCAyCitJTklUX1hNTSAlMgorJWlmICUxID09IDgKKyAgICBUUkFOU1BPU0VfOHg4CisgICAgJWlmIEFSQ0hfWDg2XzY0CisgICAgICAgIFRSQU5TUE9TRV8xNngxNgorICAgICAgICBUUkFOU1BPU0VfMzJ4MzIKKyAgICAlZW5kaWYKKyVlbmRpZgorJWlmIEFSQ0hfWDg2XzY0CisgICAgSURDVF8zMngzMiAlMQorICAgIElEQ1RfMTZ4MTYgJTEKKyVlbmRpZgorSURDVF84eDggJTEKK0lEQ1RfNHg0ICUxCislZW5kbWFjcm8KIAotSU5JVF9YTU0gc3NlMgotSURDVF9EQ19OTCAgOCwgICAgIDEwCi1JRENUX0RDICAgIDE2LCAgNCwgMTAKLUlEQ1RfREMgICAgMzIsIDE2LCAxMAotCi0laWYgSEFWRV9BVlgyX0VYVEVSTkFMCi1JTklUX1lNTSBhdngyCi1JRENUX0RDICAgIDE2LCAgMiwgMTAKLUlEQ1RfREMgICAgMzIsICA4LCAxMAotJWVuZGlmIDtIQVZFX0FWWDJfRVhURVJOQUwKLQotOyAxMi1iaXQKLUlOSVRfTU1YIG1teGV4dAotSURDVF9EQ19OTCAgNCwgICAgIDEyCi1JRENUX0RDICAgICA4LCAgMiwgMTIKLQotSU5JVF9YTU0gc3NlMgotSURDVF9EQ19OTCAgOCwgICAgIDEyCi1JRENUX0RDICAgIDE2LCAgNCwgMTIKLUlEQ1RfREMgICAgMzIsIDE2LCAxMgotCi0laWYgSEFWRV9BVlgyX0VYVEVSTkFMCi1JTklUX1lNTSBhdngyCi1JRENUX0RDICAgIDE2LCAgMiwgMTIKLUlEQ1RfREMgICAgMzIsICA4LCAxMgotJWVuZGlmIDtIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfSURDVF9EQyA4CitJTklUX0lEQ1RfREMgMTAKK0lOSVRfSURDVF9EQyAxMgorSU5JVF9JRENUIDgsIHNzZTIKK0lOSVRfSURDVCA4LCBhdngKK0lOSVRfSURDVCAxMCwgc3NlMgorSU5JVF9JRENUIDEwLCBhdngKKztJTklUX0lEQ1QgMTIsIHNzZTIKKztJTklUX0lEQ1QgMTIsIGF2eApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaGV2Y19yZXNfYWRkLmFzbSBiL2xpYmF2Y29kZWMveDg2L2hldmNfcmVzX2FkZC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjM2U4OGEuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy94ODYvaGV2Y19yZXNfYWRkLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDM4OCArMCwwIEBACi07IC8qCi07ICogUHJvdmlkZSBTSU1EIG9wdGltaXphdGlvbnMgZm9yIHRyYW5zZm9ybV9hZGQgZnVuY3Rpb25zIGZvciBIRVZDIGRlY29kaW5nCi07ICogQ29weXJpZ2h0IChjKSAyMDE0IFBpZXJyZS1FZG91YXJkIExFUEVSRQotOyAqCi07ICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotOyAqCi07ICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotOyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLTsgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLTsgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLTsgKgotOyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotOyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi07ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLTsgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotOyAqCi07ICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotOyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLTsgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi07ICovCi0laW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKLQotU0VDVElPTiAudGV4dAotCi1jZXh0ZXJuIHB3XzEwMjMKLSVkZWZpbmUgbWF4X3BpeGVsc18xMCBwd18xMDIzCi0KLQotO3RoZSB0cl9hZGQgbWFjcm9zIGFuZCBmdW5jdGlvbnMgd2VyZSBsYXJnZWx5IGluc3BpcmVkIGJ5IHgyNjQgcHJvamVjdCdzIGNvZGUgaW4gdGhlIGgyNjRfaWRjdC5hc20gZmlsZQotJW1hY3JvIFRSX0FERF9NTVhfNF84IDAKLSAgICBtb3ZhICAgICAgICAgICAgICBtMiwgW3IxXQotICAgIG1vdmEgICAgICAgICAgICAgIG00LCBbcjErOF0KLSAgICBweG9yICAgICAgICAgICAgICBtMywgbTMKLSAgICBwc3VidyAgICAgICAgICAgICBtMywgbTIKLSAgICBwYWNrdXN3YiAgICAgICAgICBtMiwgbTIKLSAgICBwYWNrdXN3YiAgICAgICAgICBtMywgbTMKLSAgICBweG9yICAgICAgICAgICAgICBtNSwgbTUKLSAgICBwc3VidyAgICAgICAgICAgICBtNSwgbTQKLSAgICBwYWNrdXN3YiAgICAgICAgICBtNCwgbTQKLSAgICBwYWNrdXN3YiAgICAgICAgICBtNSwgbTUKLQotICAgIG1vdmggICAgICAgICAgICAgIG0wLCBbcjAgICAgIF0KLSAgICBtb3ZoICAgICAgICAgICAgICBtMSwgW3IwK3IyICBdCi0gICAgcGFkZHVzYiAgICAgICAgICAgbTAsIG0yCi0gICAgcGFkZHVzYiAgICAgICAgICAgbTEsIG00Ci0gICAgcHN1YnVzYiAgICAgICAgICAgbTAsIG0zCi0gICAgcHN1YnVzYiAgICAgICAgICAgbTEsIG01Ci0gICAgbW92aCAgICAgICBbcjAgICAgIF0sIG0wCi0gICAgbW92aCAgICAgICBbcjArcjIgIF0sIG0xCi0lZW5kbWFjcm8KLQotCi1JTklUX01NWCBtbXhleHQKLTsgdm9pZCBmZl9oZXZjX3RyYW5mb3JtX2FkZF84X21teGV4dCh1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSkKLWNnbG9iYWwgaGV2Y190cmFuc2Zvcm1fYWRkNF84LCAzLCA0LCA2Ci0gICAgVFJfQUREX01NWF80XzgKLSAgICBhZGQgICAgICAgICAgICAgICByMSwgMTYKLSAgICBsZWEgICAgICAgICAgICAgICByMCwgW3IwK3IyKjJdCi0gICAgVFJfQUREX01NWF80XzgKLSAgICBSRVQKLQotJW1hY3JvIFRSX0FERF9TU0VfOF84IDAKLSAgICBweG9yICAgICAgICAgICAgICBtMywgbTMKLSAgICBtb3ZhICAgICAgICAgICAgICBtNCwgW3IxXQotICAgIG1vdmEgICAgICAgICAgICAgIG02LCBbcjErMTZdCi0gICAgbW92YSAgICAgICAgICAgICAgbTAsIFtyMSszMl0KLSAgICBtb3ZhICAgICAgICAgICAgICBtMiwgW3IxKzQ4XQotICAgIHBzdWJ3ICAgICAgICAgICAgIG01LCBtMywgbTQKLSAgICBwc3VidyAgICAgICAgICAgICBtNywgbTMsIG02Ci0gICAgcHN1YncgICAgICAgICAgICAgbTEsIG0zLCBtMAotICAgIHBhY2t1c3diICAgICAgICAgIG00LCBtMAotICAgIHBhY2t1c3diICAgICAgICAgIG01LCBtMQotICAgIHBzdWJ3ICAgICAgICAgICAgIG0zLCBtMgotICAgIHBhY2t1c3diICAgICAgICAgIG02LCBtMgotICAgIHBhY2t1c3diICAgICAgICAgIG03LCBtMwotCi0gICAgbW92cSAgICAgICAgICAgICAgICBtMCwgW3IwICAgICBdCi0gICAgbW92cSAgICAgICAgICAgICAgICBtMSwgW3IwK3IyICBdCi0gICAgbW92aHBzICAgICAgICAgICAgICBtMCwgW3IwK3IyKjJdCi0gICAgbW92aHBzICAgICAgICAgICAgICBtMSwgW3IwK3IzICBdCi0gICAgcGFkZHVzYiAgICAgICAgICAgICBtMCwgbTQKLSAgICBwYWRkdXNiICAgICAgICAgICAgIG0xLCBtNgotICAgIHBzdWJ1c2IgICAgICAgICAgICAgbTAsIG01Ci0gICAgcHN1YnVzYiAgICAgICAgICAgICBtMSwgbTcKLSAgICBtb3ZxICAgICAgICAgW3IwICAgICBdLCBtMAotICAgIG1vdnEgICAgICAgICBbcjArcjIgIF0sIG0xCi0gICAgbW92aHBzICAgICAgIFtyMCsyKnIyXSwgbTAKLSAgICBtb3ZocHMgICAgICAgW3IwK3IzICBdLCBtMQotJWVuZG1hY3JvCi0KLSVtYWNybyBUUl9BRERfU1NFXzE2XzMyXzggMwotICAgIG1vdmEgICAgICAgICAgICAgeG0yLCBbcjErJTEgICBdCi0gICAgbW92YSAgICAgICAgICAgICB4bTYsIFtyMSslMSsxNl0KLSVpZiBjcHVmbGFnKGF2eDIpCi0gICAgdmluc2VydGkxMjggICAgICAgbTIsIG0yLCBbcjErJTErMzJdLCAxCi0gICAgdmluc2VydGkxMjggICAgICAgbTYsIG02LCBbcjErJTErNDhdLCAxCi0lZW5kaWYKLSVpZiBjcHVmbGFnKGF2eCkKLSAgICBwc3VidyAgICAgICAgICAgICBtMSwgbTAsIG0yCi0gICAgcHN1YncgICAgICAgICAgICAgbTUsIG0wLCBtNgotJWVsc2UKLSAgICBtb3ZhICAgICAgICAgICAgICBtMSwgbTAKLSAgICBtb3ZhICAgICAgICAgICAgICBtNSwgbTAKLSAgICBwc3VidyAgICAgICAgICAgICBtMSwgbTIKLSAgICBwc3VidyAgICAgICAgICAgICBtNSwgbTYKLSVlbmRpZgotICAgIHBhY2t1c3diICAgICAgICAgIG0yLCBtNgotICAgIHBhY2t1c3diICAgICAgICAgIG0xLCBtNQotCi0gICAgbW92YSAgICAgICAgICAgICB4bTQsIFtyMSslMSttbXNpemUqMiAgIF0KLSAgICBtb3ZhICAgICAgICAgICAgIHhtNiwgW3IxKyUxK21tc2l6ZSoyKzE2XQotJWlmIGNwdWZsYWcoYXZ4MikKLSAgICB2aW5zZXJ0aTEyOCAgICAgICBtNCwgbTQsIFtyMSslMSs5NiBdLCAxCi0gICAgdmluc2VydGkxMjggICAgICAgbTYsIG02LCBbcjErJTErMTEyXSwgMQotJWVuZGlmCi0laWYgY3B1ZmxhZyhhdngpCi0gICAgcHN1YncgICAgICAgICAgICAgbTMsIG0wLCBtNAotICAgIHBzdWJ3ICAgICAgICAgICAgIG01LCBtMCwgbTYKLSVlbHNlCi0gICAgbW92YSAgICAgICAgICAgICAgbTMsIG0wCi0gICAgbW92YSAgICAgICAgICAgICAgbTUsIG0wCi0gICAgcHN1YncgICAgICAgICAgICAgbTMsIG00Ci0gICAgcHN1YncgICAgICAgICAgICAgbTUsIG02Ci0lZW5kaWYKLSAgICBwYWNrdXN3YiAgICAgICAgICBtNCwgbTYKLSAgICBwYWNrdXN3YiAgICAgICAgICBtMywgbTUKLQotICAgIHBhZGR1c2IgICAgICAgICAgIG0yLCBbJTJdCi0gICAgcGFkZHVzYiAgICAgICAgICAgbTQsIFslM10KLSAgICBwc3VidXNiICAgICAgICAgICBtMiwgbTEKLSAgICBwc3VidXNiICAgICAgICAgICBtNCwgbTMKLSAgICBtb3ZhICAgICAgICAgICAgWyUyXSwgbTIKLSAgICBtb3ZhICAgICAgICAgICAgWyUzXSwgbTQKLSVlbmRtYWNybwotCi0KLSVtYWNybyBUUkFOU0ZPUk1fQUREXzggMAotOyB2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDhfOF88b3B0Pih1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSkKLWNnbG9iYWwgaGV2Y190cmFuc2Zvcm1fYWRkOF84LCAzLCA0LCA4Ci0gICAgbGVhICAgICAgICAgICAgICAgcjMsIFtyMiozXQotICAgIFRSX0FERF9TU0VfOF84Ci0gICAgYWRkICAgICAgICAgICAgICAgcjEsIDY0Ci0gICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCtyMio0XQotICAgIFRSX0FERF9TU0VfOF84Ci0gICAgUkVUCi0KLTsgdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQxNl84XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKQotY2dsb2JhbCBoZXZjX3RyYW5zZm9ybV9hZGQxNl84LCAzLCA0LCA3Ci0gICAgcHhvciAgICAgICAgICAgICAgbTAsIG0wCi0gICAgbGVhICAgICAgICAgICAgICAgcjMsIFtyMiozXQotICAgIFRSX0FERF9TU0VfMTZfMzJfOCAgMCwgcjAsICAgICAgcjArcjIKLSAgICBUUl9BRERfU1NFXzE2XzMyXzggNjQsIHIwK3IyKjIsIHIwK3IzCi0lcmVwIDMKLSAgICBhZGQgICAgICAgICAgICAgICAgcjEsIDEyOAotICAgIGxlYSAgICAgICAgICAgICAgICByMCwgW3IwK3IyKjRdCi0gICAgVFJfQUREX1NTRV8xNl8zMl84ICAwLCByMCwgICAgICByMCtyMgotICAgIFRSX0FERF9TU0VfMTZfMzJfOCA2NCwgcjArcjIqMiwgcjArcjMKLSVlbmRyZXAKLSAgICBSRVQKLQotOyB2b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDMyXzhfPG9wdD4odWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpCi1jZ2xvYmFsIGhldmNfdHJhbnNmb3JtX2FkZDMyXzgsIDMsIDQsIDcKLSAgICBweG9yICAgICAgICAgICAgICAgbTAsIG0wCi0gICAgVFJfQUREX1NTRV8xNl8zMl84ICAwLCByMCwgICAgcjArMTYKLSAgICBUUl9BRERfU1NFXzE2XzMyXzggNjQsIHIwK3IyLCByMCtyMisxNgotJXJlcCAxNQotICAgIGFkZCAgICAgICAgICAgICAgICByMSwgMTI4Ci0gICAgbGVhICAgICAgICAgICAgICAgIHIwLCBbcjArcjIqMl0KLSAgICBUUl9BRERfU1NFXzE2XzMyXzggIDAsIHIwLCAgICByMCsxNgotICAgIFRSX0FERF9TU0VfMTZfMzJfOCA2NCwgcjArcjIsIHIwK3IyKzE2Ci0lZW5kcmVwCi0gICAgUkVUCi0lZW5kbWFjcm8KLQotSU5JVF9YTU0gc3NlMgotVFJBTlNGT1JNX0FERF84Ci1JTklUX1hNTSBhdngKLVRSQU5TRk9STV9BRERfOAotCi0laWYgSEFWRV9BVlgyX0VYVEVSTkFMCi1JTklUX1lNTSBhdngyCi07IHZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkMzJfOF9hdngyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKQotY2dsb2JhbCBoZXZjX3RyYW5zZm9ybV9hZGQzMl84LCAzLCA0LCA3Ci0gICAgcHhvciAgICAgICAgICAgICAgbTAsIG0wCi0gICAgbGVhICAgICAgICAgICAgICAgcjMsIFtyMiozXQotICAgIFRSX0FERF9TU0VfMTZfMzJfOCAgIDAsIHIwLCAgICAgIHIwK3IyCi0gICAgVFJfQUREX1NTRV8xNl8zMl84IDEyOCwgcjArcjIqMiwgcjArcjMKLSVyZXAgNwotICAgIGFkZCAgICAgICAgICAgICAgICByMSwgMjU2Ci0gICAgbGVhICAgICAgICAgICAgICAgIHIwLCBbcjArcjIqNF0KLSAgICBUUl9BRERfU1NFXzE2XzMyXzggICAwLCByMCwgICAgICByMCtyMgotICAgIFRSX0FERF9TU0VfMTZfMzJfOCAxMjgsIHIwK3IyKjIsIHIwK3IzCi0lZW5kcmVwCi0gICAgUkVUCi0lZW5kaWYKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkXzEwKHBpeGVsICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0lbWFjcm8gVFJfQUREX1NTRV84XzEwIDQKLSAgICBtb3ZhICAgICAgICAgICAgICBtMCwgWyU0XQotICAgIG1vdmEgICAgICAgICAgICAgIG0xLCBbJTQrMTZdCi0gICAgbW92YSAgICAgICAgICAgICAgbTIsIFslNCszMl0KLSAgICBtb3ZhICAgICAgICAgICAgICBtMywgWyU0KzQ4XQotICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBbJTErMCAgIF0KLSAgICBwYWRkdyAgICAgICAgICAgICBtMSwgWyUxKyUyICBdCi0gICAgcGFkZHcgICAgICAgICAgICAgbTIsIFslMSslMioyXQotICAgIHBhZGR3ICAgICAgICAgICAgIG0zLCBbJTErJTMgIF0KLSAgICBDTElQVyAgICAgICAgICAgICBtMCwgbTQsIG01Ci0gICAgQ0xJUFcgICAgICAgICAgICAgbTEsIG00LCBtNQotICAgIENMSVBXICAgICAgICAgICAgIG0yLCBtNCwgbTUKLSAgICBDTElQVyAgICAgICAgICAgICBtMywgbTQsIG01Ci0gICAgbW92YSAgICAgICBbJTErMCAgIF0sIG0wCi0gICAgbW92YSAgICAgICBbJTErJTIgIF0sIG0xCi0gICAgbW92YSAgICAgICBbJTErJTIqMl0sIG0yCi0gICAgbW92YSAgICAgICBbJTErJTMgIF0sIG0zCi0lZW5kbWFjcm8KLQotJW1hY3JvIFRSX0FERF9NTVg0XzEwIDMKLSAgICBtb3ZhICAgICAgICAgICAgICBtMCwgWyUxKzAgICBdCi0gICAgbW92YSAgICAgICAgICAgICAgbTEsIFslMSslMiAgXQotICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBbJTNdCi0gICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMys4XQotICAgIENMSVBXICAgICAgICAgICAgIG0wLCBtMiwgbTMKLSAgICBDTElQVyAgICAgICAgICAgICBtMSwgbTIsIG0zCi0gICAgbW92YSAgICAgICBbJTErMCAgIF0sIG0wCi0gICAgbW92YSAgICAgICBbJTErJTIgIF0sIG0xCi0lZW5kbWFjcm8KLQotJW1hY3JvIFRSQU5TX0FERF9TU0VfMTZfMTAgMwotICAgIG1vdmEgICAgICAgICAgICAgIG0wLCBbJTNdCi0gICAgbW92YSAgICAgICAgICAgICAgbTEsIFslMysxNl0KLSAgICBtb3ZhICAgICAgICAgICAgICBtMiwgWyUzKzMyXQotICAgIG1vdmEgICAgICAgICAgICAgIG0zLCBbJTMrNDhdCi0gICAgcGFkZHcgICAgICAgICAgICAgbTAsIFslMSAgICAgIF0KLSAgICBwYWRkdyAgICAgICAgICAgICBtMSwgWyUxKzE2ICAgXQotICAgIHBhZGR3ICAgICAgICAgICAgIG0yLCBbJTErJTIgICBdCi0gICAgcGFkZHcgICAgICAgICAgICAgbTMsIFslMSslMisxNl0KLSAgICBDTElQVyAgICAgICAgICAgICBtMCwgbTQsIG01Ci0gICAgQ0xJUFcgICAgICAgICAgICAgbTEsIG00LCBtNQotICAgIENMSVBXICAgICAgICAgICAgIG0yLCBtNCwgbTUKLSAgICBDTElQVyAgICAgICAgICAgICBtMywgbTQsIG01Ci0gICAgbW92YSAgICAgIFslMSAgICAgIF0sIG0wCi0gICAgbW92YSAgICAgIFslMSsxNiAgIF0sIG0xCi0gICAgbW92YSAgICAgIFslMSslMiAgIF0sIG0yCi0gICAgbW92YSAgICAgIFslMSslMisxNl0sIG0zCi0lZW5kbWFjcm8KLQotJW1hY3JvIFRSQU5TX0FERF9TU0VfMzJfMTAgMgotICAgIG1vdmEgICAgICAgICAgICAgIG0wLCBbJTJdCi0gICAgbW92YSAgICAgICAgICAgICAgbTEsIFslMisxNl0KLSAgICBtb3ZhICAgICAgICAgICAgICBtMiwgWyUyKzMyXQotICAgIG1vdmEgICAgICAgICAgICAgIG0zLCBbJTIrNDhdCi0KLSAgICBwYWRkdyAgICAgICAgICAgICBtMCwgWyUxICAgXQotICAgIHBhZGR3ICAgICAgICAgICAgIG0xLCBbJTErMTZdCi0gICAgcGFkZHcgICAgICAgICAgICAgbTIsIFslMSszMl0KLSAgICBwYWRkdyAgICAgICAgICAgICBtMywgWyUxKzQ4XQotICAgIENMSVBXICAgICAgICAgICAgIG0wLCBtNCwgbTUKLSAgICBDTElQVyAgICAgICAgICAgICBtMSwgbTQsIG01Ci0gICAgQ0xJUFcgICAgICAgICAgICAgbTIsIG00LCBtNQotICAgIENMSVBXICAgICAgICAgICAgIG0zLCBtNCwgbTUKLSAgICBtb3ZhICAgICAgICAgWyUxICAgXSwgbTAKLSAgICBtb3ZhICAgICAgICAgWyUxKzE2XSwgbTEKLSAgICBtb3ZhICAgICAgICAgWyUxKzMyXSwgbTIKLSAgICBtb3ZhICAgICAgICAgWyUxKzQ4XSwgbTMKLSVlbmRtYWNybwotCi0lbWFjcm8gVFJBTlNfQUREMTZfQVZYMiA0Ci0gICAgbW92YSAgICAgICAgICAgICAgbTAsIFslNF0KLSAgICBtb3ZhICAgICAgICAgICAgICBtMSwgWyU0KzMyXQotICAgIG1vdmEgICAgICAgICAgICAgIG0yLCBbJTQrNjRdCi0gICAgbW92YSAgICAgICAgICAgICAgbTMsIFslNCs5Nl0KLQotICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBbJTErMCAgIF0KLSAgICBwYWRkdyAgICAgICAgICAgICBtMSwgWyUxKyUyICBdCi0gICAgcGFkZHcgICAgICAgICAgICAgbTIsIFslMSslMioyXQotICAgIHBhZGR3ICAgICAgICAgICAgIG0zLCBbJTErJTMgIF0KLQotICAgIENMSVBXICAgICAgICAgICAgIG0wLCBtNCwgbTUKLSAgICBDTElQVyAgICAgICAgICAgICBtMSwgbTQsIG01Ci0gICAgQ0xJUFcgICAgICAgICAgICAgbTIsIG00LCBtNQotICAgIENMSVBXICAgICAgICAgICAgIG0zLCBtNCwgbTUKLSAgICBtb3ZhICAgICAgIFslMSswICAgXSwgbTAKLSAgICBtb3ZhICAgICAgIFslMSslMiAgXSwgbTEKLSAgICBtb3ZhICAgICAgIFslMSslMioyXSwgbTIKLSAgICBtb3ZhICAgICAgIFslMSslMyAgXSwgbTMKLSVlbmRtYWNybwotCi0lbWFjcm8gVFJBTlNfQUREMzJfQVZYMiAzCi0gICAgbW92YSAgICAgICAgICAgICAgbTAsIFslM10KLSAgICBtb3ZhICAgICAgICAgICAgICBtMSwgWyUzKzMyXQotICAgIG1vdmEgICAgICAgICAgICAgIG0yLCBbJTMrNjRdCi0gICAgbW92YSAgICAgICAgICAgICAgbTMsIFslMys5Nl0KLQotICAgIHBhZGR3ICAgICAgICAgICAgIG0wLCBbJTEgICAgICBdCi0gICAgcGFkZHcgICAgICAgICAgICAgbTEsIFslMSszMiAgIF0KLSAgICBwYWRkdyAgICAgICAgICAgICBtMiwgWyUxKyUyICAgXQotICAgIHBhZGR3ICAgICAgICAgICAgIG0zLCBbJTErJTIrMzJdCi0KLSAgICBDTElQVyAgICAgICAgICAgICBtMCwgbTQsIG01Ci0gICAgQ0xJUFcgICAgICAgICAgICAgbTEsIG00LCBtNQotICAgIENMSVBXICAgICAgICAgICAgIG0yLCBtNCwgbTUKLSAgICBDTElQVyAgICAgICAgICAgICBtMywgbTQsIG01Ci0gICAgbW92YSAgICAgIFslMSAgICAgIF0sIG0wCi0gICAgbW92YSAgICAgIFslMSszMiAgIF0sIG0xCi0gICAgbW92YSAgICAgIFslMSslMiAgIF0sIG0yCi0gICAgbW92YSAgICAgIFslMSslMiszMl0sIG0zCi0lZW5kbWFjcm8KLQotCi1JTklUX01NWCBtbXhleHQKLWNnbG9iYWwgaGV2Y190cmFuc2Zvcm1fYWRkNF8xMCwzLDQsIDYKLSAgICBweG9yICAgICAgICAgICAgICBtMiwgbTIKLSAgICBtb3ZhICAgICAgICAgICAgICBtMywgW21heF9waXhlbHNfMTBdCi0gICAgVFJfQUREX01NWDRfMTAgICAgIHIwLCByMiwgcjEKLSAgICBhZGQgICAgICAgICAgICAgICByMSwgMTYKLSAgICBsZWEgICAgICAgICAgICAgICByMCwgW3IwKzIqcjJdCi0gICAgVFJfQUREX01NWDRfMTAgICAgIHIwLCByMiwgcjEKLSAgICBSRVQKLQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkXzEwKHBpeGVsICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKQotOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1JTklUX1hNTSBzc2UyCi1jZ2xvYmFsIGhldmNfdHJhbnNmb3JtX2FkZDhfMTAsMyw0LDYKLSAgICBweG9yICAgICAgICAgICAgICBtNCwgbTQKLSAgICBtb3ZhICAgICAgICAgICAgICBtNSwgW21heF9waXhlbHNfMTBdCi0gICAgbGVhICAgICAgICAgICAgICAgcjMsIFtyMiozXQotCi0gICAgVFJfQUREX1NTRV84XzEwICAgICAgcjAsIHIyLCByMywgcjEKLSAgICBsZWEgICAgICAgICAgICAgICByMCwgW3IwK3IyKjRdCi0gICAgYWRkICAgICAgICAgICAgICAgcjEsIDY0Ci0gICAgVFJfQUREX1NTRV84XzEwICAgICAgcjAsIHIyLCByMywgcjEKLSAgICBSRVQKLQotY2dsb2JhbCBoZXZjX3RyYW5zZm9ybV9hZGQxNl8xMCwzLDQsNgotICAgIHB4b3IgICAgICAgICAgICAgIG00LCBtNAotICAgIG1vdmEgICAgICAgICAgICAgIG01LCBbbWF4X3BpeGVsc18xMF0KLQotICAgIFRSQU5TX0FERF9TU0VfMTZfMTAgcjAsIHIyLCByMQotJXJlcCA3Ci0gICAgbGVhICAgICAgICAgICAgICAgICByMCwgW3IwK3IyKjJdCi0gICAgYWRkICAgICAgICAgICAgICAgICByMSwgNjQKLSAgICBUUkFOU19BRERfU1NFXzE2XzEwIHIwLCByMiwgcjEKLSVlbmRyZXAKLSAgICBSRVQKLQotY2dsb2JhbCBoZXZjX3RyYW5zZm9ybV9hZGQzMl8xMCwzLDQsNgotICAgIHB4b3IgICAgICAgICAgICAgIG00LCBtNAotICAgIG1vdmEgICAgICAgICAgICAgIG01LCBbbWF4X3BpeGVsc18xMF0KLQotICAgIFRSQU5TX0FERF9TU0VfMzJfMTAgcjAsIHIxCi0lcmVwIDMxCi0gICAgbGVhICAgICAgICAgICAgICAgICByMCwgW3IwK3IyXQotICAgIGFkZCAgICAgICAgICAgICAgICAgcjEsIDY0Ci0gICAgVFJBTlNfQUREX1NTRV8zMl8xMCByMCwgcjEKLSVlbmRyZXAKLSAgICBSRVQKLQotJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAotSU5JVF9ZTU0gYXZ4MgotCi1jZ2xvYmFsIGhldmNfdHJhbnNmb3JtX2FkZDE2XzEwLDMsNCw2Ci0gICAgcHhvciAgICAgICAgICAgICAgbTQsIG00Ci0gICAgbW92YSAgICAgICAgICAgICAgbTUsIFttYXhfcGl4ZWxzXzEwXQotICAgIGxlYSAgICAgICAgICAgICAgIHIzLCBbcjIqM10KLQotICAgIFRSQU5TX0FERDE2X0FWWDIgIHIwLCByMiwgcjMsIHIxCi0lcmVwIDMKLSAgICBsZWEgICAgICAgICAgICAgICByMCwgW3IwK3IyKjRdCi0gICAgYWRkICAgICAgICAgICAgICAgcjEsIDEyOAotICAgIFRSQU5TX0FERDE2X0FWWDIgIHIwLCByMiwgcjMsIHIxCi0lZW5kcmVwCi0gICAgUkVUCi0KLWNnbG9iYWwgaGV2Y190cmFuc2Zvcm1fYWRkMzJfMTAsMyw0LDYKLSAgICBweG9yICAgICAgICAgICAgICBtNCwgbTQKLSAgICBtb3ZhICAgICAgICAgICAgICBtNSwgW21heF9waXhlbHNfMTBdCi0KLSAgICBUUkFOU19BREQzMl9BVlgyICByMCwgcjIsIHIxCi0lcmVwIDE1Ci0gICAgbGVhICAgICAgICAgICAgICAgcjAsIFtyMCtyMioyXQotICAgIGFkZCAgICAgICAgICAgICAgIHIxLCAxMjgKLSAgICBUUkFOU19BREQzMl9BVlgyICByMCwgcjIsIHIxCi0lZW5kcmVwCi0gICAgUkVUCi0lZW5kaWYgO0hBVkVfQVZYX0VYVEVSTkFMCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oZXZjX3Nhby5hc20gYi9saWJhdmNvZGVjL3g4Ni9oZXZjX3Nhby5hc20KaW5kZXggODg4YTI4YS4uNzU2YWRmZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaGV2Y19zYW8uYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2hldmNfc2FvLmFzbQpAQCAtMTk4LDcgKzE5OCw3IEBACiA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAKICVkZWZpbmUgTUFYX1BCX1NJWkUgIDY0Ci0lZGVmaW5lIFBBRERJTkdfU0laRSAzMiA7IEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUKKyVkZWZpbmUgUEFERElOR19TSVpFIDY0IDsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRQogJWRlZmluZSBFREdFX1NSQ1NUUklERSAyICogTUFYX1BCX1NJWkUgKyBQQURESU5HX1NJWkUKIAogJW1hY3JvIEhFVkNfU0FPX0VER0VfRklMVEVSX0lOSVQgMApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaGV2Y19zYW9fMTBiaXQuYXNtIGIvbGliYXZjb2RlYy94ODYvaGV2Y19zYW9fMTBiaXQuYXNtCmluZGV4IGY4MWUyZDUuLmIzMDU4M2QgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2hldmNfc2FvXzEwYml0LmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9oZXZjX3Nhb18xMGJpdC5hc20KQEAgLTE5MCw3ICsxOTAsNyBAQAogOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogCiAlZGVmaW5lIE1BWF9QQl9TSVpFICA2NAotJWRlZmluZSBQQURESU5HX1NJWkUgMzIgOyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFCislZGVmaW5lIFBBRERJTkdfU0laRSA2NCA7IEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUKICVkZWZpbmUgRURHRV9TUkNTVFJJREUgMiAqIE1BWF9QQl9TSVpFICsgUEFERElOR19TSVpFCiAKICVtYWNybyBQTUlOVVcgNApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaGV2Y2RzcC5oIGIvbGliYXZjb2RlYy94ODYvaGV2Y2RzcC5oCmluZGV4IGFkODE2OGYuLjY3YmUwYTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2hldmNkc3AuaAorKysgYi9saWJhdmNvZGVjL3g4Ni9oZXZjZHNwLmgKQEAgLTI5LDkgKzI5LDYgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogCi0jZGVmaW5lIGlkY3RfZGNfcHJvdG8oc2l6ZSwgYml0ZCwgb3B0KSBcCi0gICAgICAgICAgICAgICAgdm9pZCBmZl9oZXZjX2lkY3QjI3NpemUjI19kY19hZGRfIyNiaXRkIyNfIyNvcHQodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpCi0KICNkZWZpbmUgUEVMX0xJTksoZHN0LCBpZHgxLCBpZHgyLCBpZHgzLCBuYW1lLCBELCBvcHQpIFwKIGRzdFtpZHgxXVtpZHgyXVtpZHgzXSA9IGZmX2hldmNfcHV0X2hldmNfICMjIG5hbWUgIyMgXyAjIyBEICMjIF8jI29wdDsgXAogZHN0ICMjIF9iaVtpZHgxXVtpZHgyXVtpZHgzXSA9IGZmX2hldmNfcHV0X2hldmNfYmlfICMjIG5hbWUgIyMgXyAjIyBEICMjIF8jI29wdDsgXApAQCAtMjM5LDIzICsyMzYsMjQgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vIFRSQU5TRk9STV9BREQKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkNF84X21teGV4dCh1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSk7Ci12b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDhfOF9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKLXZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkMTZfOF9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKLXZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkMzJfOF9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKIAotdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQ4XzhfYXZ4KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKLXZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkMTZfOF9hdngodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOwotdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl84X2F2eCh1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzRfOF9tbXhleHQodWludDhfdCAqZHN0LCBpbnQxNl90ICpyZXMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9oZXZjX2FkZF9yZXNpZHVhbF84Xzhfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzE2Xzhfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzMyXzhfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSk7CiAKLXZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkMzJfOF9hdngyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfOF84X2F2eCh1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzE2XzhfYXZ4KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqcmVzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfMzJfOF9hdngodWludDhfdCAqZHN0LCBpbnQxNl90ICpyZXMsIHB0cmRpZmZfdCBzdHJpZGUpOwogCi12b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDRfMTBfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKLXZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkOF8xMF9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKLXZvaWQgZmZfaGV2Y190cmFuc2Zvcm1fYWRkMTZfMTBfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgKmNvZWZmcywgcHRyZGlmZl90IHN0cmlkZSk7Ci12b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDMyXzEwX3NzZTIodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9oZXZjX2FkZF9yZXNpZHVhbF8zMl84X2F2eDIodWludDhfdCAqZHN0LCBpbnQxNl90ICpyZXMsIHB0cmRpZmZfdCBzdHJpZGUpOwogCi12b2lkIGZmX2hldmNfdHJhbnNmb3JtX2FkZDE2XzEwX2F2eDIodWludDhfdCAqZHN0LCBpbnQxNl90ICpjb2VmZnMsIHB0cmRpZmZfdCBzdHJpZGUpOwotdm9pZCBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl8xMF9hdngyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqY29lZmZzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfNF8xMF9tbXhleHQodWludDhfdCAqZHN0LCBpbnQxNl90ICpyZXMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9oZXZjX2FkZF9yZXNpZHVhbF84XzEwX3NzZTIodWludDhfdCAqZHN0LCBpbnQxNl90ICpyZXMsIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl9oZXZjX2FkZF9yZXNpZHVhbF8xNl8xMF9zc2UyKHVpbnQ4X3QgKmRzdCwgaW50MTZfdCAqcmVzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfMzJfMTBfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSk7CisKK3ZvaWQgZmZfaGV2Y19hZGRfcmVzaWR1YWxfMTZfMTBfYXZ4Mih1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2hldmNfYWRkX3Jlc2lkdWFsXzMyXzEwX2F2eDIodWludDhfdCAqZHN0LCBpbnQxNl90ICpyZXMsIHB0cmRpZmZfdCBzdHJpZGUpOwogCiAjZW5kaWYgLy8gQVZDT0RFQ19YODZfSEVWQ0RTUF9ICmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9oZXZjZHNwX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L2hldmNkc3BfaW5pdC5jCmluZGV4IDA5ZWIwNmQuLjE3Y2QyMzMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2hldmNkc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L2hldmNkc3BfaW5pdC5jCkBAIC0yLDcgKzIsNiBAQAogICogQ29weXJpZ2h0IChjKSAyMDEzIFNlcHBvIFRvbXBlcmkKICAqIENvcHlyaWdodCAoYykgMjAxMyAtIDIwMTQgUGllcnJlLUVkb3VhcmQgTGVwZXJlCiAgKgotICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCiAgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yMSw2ICsyMCw3IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKQEAgLTU4LDE4ICs1OCwzMSBAQAogTEZMX0ZVTkNTKHVpbnQ4X3QsICAxMCwgYXZ4KQogTEZMX0ZVTkNTKHVpbnQ4X3QsICAxMiwgYXZ4KQogCi0jZGVmaW5lIElEQ1RfRlVOQ1MoVywgb3B0KSBcCi12b2lkIGZmX2hldmNfaWRjdCMjVyMjX2RjXzhfIyNvcHQoaW50MTZfdCAqY29lZmZzKTsgXAotdm9pZCBmZl9oZXZjX2lkY3QjI1cjI19kY18xMF8jI29wdChpbnQxNl90ICpjb2VmZnMpOyBcCi12b2lkIGZmX2hldmNfaWRjdCMjVyMjX2RjXzEyXyMjb3B0KGludDE2X3QgKmNvZWZmcykKKyNkZWZpbmUgSURDVF9EQ19GVU5DUyhXLCBvcHQpIFwKK3ZvaWQgZmZfaGV2Y19pZGN0XyAjIyBXICMjIF9kY184XyAjIyBvcHQoaW50MTZfdCAqY29lZmZzKTsgXAordm9pZCBmZl9oZXZjX2lkY3RfICMjIFcgIyMgX2RjXzEwXyAjIyBvcHQoaW50MTZfdCAqY29lZmZzKTsgXAordm9pZCBmZl9oZXZjX2lkY3RfICMjIFcgIyMgX2RjXzEyXyAjIyBvcHQoaW50MTZfdCAqY29lZmZzKQogCi1JRENUX0ZVTkNTKDR4NCwgICBtbXhleHQpOwotSURDVF9GVU5DUyg4eDgsICAgbW14ZXh0KTsKLUlEQ1RfRlVOQ1MoOHg4LCAgIHNzZTIpOwotSURDVF9GVU5DUygxNngxNiwgc3NlMik7Ci1JRENUX0ZVTkNTKDMyeDMyLCBzc2UyKTsKLUlEQ1RfRlVOQ1MoMTZ4MTYsIGF2eDIpOwotSURDVF9GVU5DUygzMngzMiwgYXZ4Mik7CitJRENUX0RDX0ZVTkNTKDR4NCwgICBtbXhleHQpOworSURDVF9EQ19GVU5DUyg4eDgsICAgbW14ZXh0KTsKK0lEQ1RfRENfRlVOQ1MoOHg4LCAgIHNzZTIpOworSURDVF9EQ19GVU5DUygxNngxNiwgc3NlMik7CitJRENUX0RDX0ZVTkNTKDMyeDMyLCBzc2UyKTsKK0lEQ1RfRENfRlVOQ1MoMTZ4MTYsIGF2eDIpOworSURDVF9EQ19GVU5DUygzMngzMiwgYXZ4Mik7CisKKyNkZWZpbmUgSURDVF9GVU5DUyhvcHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordm9pZCBmZl9oZXZjX2lkY3RfNHg0XzhfICAgICMjIG9wdChpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpOyBcCit2b2lkIGZmX2hldmNfaWRjdF80eDRfMTBfICAgIyMgb3B0KGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7IFwKK3ZvaWQgZmZfaGV2Y19pZGN0Xzh4OF84XyAgICAjIyBvcHQoaW50MTZfdCAqY29lZmZzLCBpbnQgY29sX2xpbWl0KTsgXAordm9pZCBmZl9oZXZjX2lkY3RfOHg4XzEwXyAgICMjIG9wdChpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpOyBcCit2b2lkIGZmX2hldmNfaWRjdF8xNngxNl84XyAgIyMgb3B0KGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7IFwKK3ZvaWQgZmZfaGV2Y19pZGN0XzE2eDE2XzEwXyAjIyBvcHQoaW50MTZfdCAqY29lZmZzLCBpbnQgY29sX2xpbWl0KTsgXAordm9pZCBmZl9oZXZjX2lkY3RfMzJ4MzJfOF8gICMjIG9wdChpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpOyBcCit2b2lkIGZmX2hldmNfaWRjdF8zMngzMl8xMF8gIyMgb3B0KGludDE2X3QgKmNvZWZmcywgaW50IGNvbF9saW1pdCk7CisKK0lEQ1RfRlVOQ1Moc3NlMikKK0lEQ1RfRlVOQ1MoYXZ4KQogCiAjZGVmaW5lIG1jX3JlcF9mdW5jKG5hbWUsIGJpdGQsIHN0ZXAsIFcsIG9wdCkgXAogdm9pZCBmZl9oZXZjX3B1dF9oZXZjXyMjbmFtZSMjVyMjXyMjYml0ZCMjXyMjb3B0KGludDE2X3QgKl9kc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTY5OCw5ICs3MTEsMTAgQEAKIAogICAgIGlmIChiaXRfZGVwdGggPT0gOCkgewogICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKLSAgICAgICAgICAgIGMtPmlkY3RfZGNbMF0gPSBmZl9oZXZjX2lkY3Q0eDRfZGNfOF9tbXhleHQ7Ci0gICAgICAgICAgICBjLT5pZGN0X2RjWzFdID0gZmZfaGV2Y19pZGN0OHg4X2RjXzhfbW14ZXh0OwotICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFswXSAgICA9ICBmZl9oZXZjX3RyYW5zZm9ybV9hZGQ0XzhfbW14ZXh0OworICAgICAgICAgICAgYy0+aWRjdF9kY1swXSA9IGZmX2hldmNfaWRjdF80eDRfZGNfOF9tbXhleHQ7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzFdID0gZmZfaGV2Y19pZGN0Xzh4OF9kY184X21teGV4dDsKKworICAgICAgICAgICAgYy0+YWRkX3Jlc2lkdWFsWzBdID0gZmZfaGV2Y19hZGRfcmVzaWR1YWxfNF84X21teGV4dDsKICAgICAgICAgfQogICAgICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CiAgICAgICAgICAgICBjLT5oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYV84X3NzZTI7CkBAIC03MDksMTYgKzcyMywyMSBAQAogICAgICAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfOF9zc2UyOwogICAgICAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfOF9zc2UyOwogCisgICAgICAgICAgICAgICAgYy0+aWRjdFsyXSA9IGZmX2hldmNfaWRjdF8xNngxNl84X3NzZTI7CisgICAgICAgICAgICAgICAgYy0+aWRjdFszXSA9IGZmX2hldmNfaWRjdF8zMngzMl84X3NzZTI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBTQU9fQkFORF9JTklUKDgsIHNzZTIpOwogCi0gICAgICAgICAgICBjLT5pZGN0X2RjWzFdID0gZmZfaGV2Y19pZGN0OHg4X2RjXzhfc3NlMjsKLSAgICAgICAgICAgIGMtPmlkY3RfZGNbMl0gPSBmZl9oZXZjX2lkY3QxNngxNl9kY184X3NzZTI7Ci0gICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0MzJ4MzJfZGNfOF9zc2UyOworICAgICAgICAgICAgYy0+aWRjdF9kY1sxXSA9IGZmX2hldmNfaWRjdF84eDhfZGNfOF9zc2UyOworICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdF8xNngxNl9kY184X3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0XzMyeDMyX2RjXzhfc3NlMjsKIAotICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsxXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDhfOF9zc2UyOwotICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsyXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDE2Xzhfc3NlMjsKLSAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbM10gICAgPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl84X3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0WzBdICAgID0gZmZfaGV2Y19pZGN0XzR4NF84X3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0WzFdICAgID0gZmZfaGV2Y19pZGN0Xzh4OF84X3NzZTI7CisKKyAgICAgICAgICAgIGMtPmFkZF9yZXNpZHVhbFsxXSA9IGZmX2hldmNfYWRkX3Jlc2lkdWFsXzhfOF9zc2UyOworICAgICAgICAgICAgYy0+YWRkX3Jlc2lkdWFsWzJdID0gZmZfaGV2Y19hZGRfcmVzaWR1YWxfMTZfOF9zc2UyOworICAgICAgICAgICAgYy0+YWRkX3Jlc2lkdWFsWzNdID0gZmZfaGV2Y19hZGRfcmVzaWR1YWxfMzJfOF9zc2UyOwogICAgICAgICB9CiAgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CiAgICAgICAgICAgICBpZihBUkNIX1g4Nl82NCkgewpAQCAtNzQ1LDIwICs3NjQsMjYgQEAKICAgICAgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgewogICAgICAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfOF9hdng7CiAgICAgICAgICAgICAgICAgYy0+aGV2Y19oX2xvb3BfZmlsdGVyX2x1bWEgPSBmZl9oZXZjX2hfbG9vcF9maWx0ZXJfbHVtYV84X2F2eDsKKworICAgICAgICAgICAgICAgIGMtPmlkY3RbMl0gPSBmZl9oZXZjX2lkY3RfMTZ4MTZfOF9hdng7CisgICAgICAgICAgICAgICAgYy0+aWRjdFszXSA9IGZmX2hldmNfaWRjdF8zMngzMl84X2F2eDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFNBT19CQU5EX0lOSVQoOCwgYXZ4KTsKIAotICAgICAgICAgICAgYy0+dHJhbnNmb3JtX2FkZFsxXSAgICA9IGZmX2hldmNfdHJhbnNmb3JtX2FkZDhfOF9hdng7Ci0gICAgICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzJdICAgID0gZmZfaGV2Y190cmFuc2Zvcm1fYWRkMTZfOF9hdng7Ci0gICAgICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzNdICAgID0gZmZfaGV2Y190cmFuc2Zvcm1fYWRkMzJfOF9hdng7CisgICAgICAgICAgICBjLT5pZGN0WzBdID0gZmZfaGV2Y19pZGN0XzR4NF84X2F2eDsKKyAgICAgICAgICAgIGMtPmlkY3RbMV0gPSBmZl9oZXZjX2lkY3RfOHg4XzhfYXZ4OworCisgICAgICAgICAgICBjLT5hZGRfcmVzaWR1YWxbMV0gPSBmZl9oZXZjX2FkZF9yZXNpZHVhbF84XzhfYXZ4OworICAgICAgICAgICAgYy0+YWRkX3Jlc2lkdWFsWzJdID0gZmZfaGV2Y19hZGRfcmVzaWR1YWxfMTZfOF9hdng7CisgICAgICAgICAgICBjLT5hZGRfcmVzaWR1YWxbM10gPSBmZl9oZXZjX2FkZF9yZXNpZHVhbF8zMl84X2F2eDsKICAgICAgICAgfQogICAgICAgICBpZiAoRVhURVJOQUxfQVZYMihjcHVfZmxhZ3MpKSB7CiAgICAgICAgICAgICBjLT5zYW9fYmFuZF9maWx0ZXJbMF0gPSBmZl9oZXZjX3Nhb19iYW5kX2ZpbHRlcl84XzhfYXZ4MjsKICAgICAgICAgICAgIGMtPnNhb19iYW5kX2ZpbHRlclsxXSA9IGZmX2hldmNfc2FvX2JhbmRfZmlsdGVyXzE2XzhfYXZ4MjsKICAgICAgICAgfQogICAgICAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKLSAgICAgICAgICAgIGMtPmlkY3RfZGNbMl0gPSBmZl9oZXZjX2lkY3QxNngxNl9kY184X2F2eDI7Ci0gICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0MzJ4MzJfZGNfOF9hdngyOworICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdF8xNngxNl9kY184X2F2eDI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0XzMyeDMyX2RjXzhfYXZ4MjsKICAgICAgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgewogICAgICAgICAgICAgICAgIGMtPnB1dF9oZXZjX2VwZWxbN11bMF1bMF0gPSBmZl9oZXZjX3B1dF9oZXZjX3BlbF9waXhlbHMzMl84X2F2eDI7CiAgICAgICAgICAgICAgICAgYy0+cHV0X2hldmNfZXBlbFs4XVswXVswXSA9IGZmX2hldmNfcHV0X2hldmNfcGVsX3BpeGVsczQ4XzhfYXZ4MjsKQEAgLTg1MCwxMyArODc1LDEzIEBACiAgICAgICAgICAgICBjLT5zYW9fZWRnZV9maWx0ZXJbM10gPSBmZl9oZXZjX3Nhb19lZGdlX2ZpbHRlcl80OF84X2F2eDI7CiAgICAgICAgICAgICBjLT5zYW9fZWRnZV9maWx0ZXJbNF0gPSBmZl9oZXZjX3Nhb19lZGdlX2ZpbHRlcl82NF84X2F2eDI7CiAKLSAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbM10gICAgPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl84X2F2eDI7CisgICAgICAgICAgICBjLT5hZGRfcmVzaWR1YWxbM10gPSBmZl9oZXZjX2FkZF9yZXNpZHVhbF8zMl84X2F2eDI7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGJpdF9kZXB0aCA9PSAxMCkgewogICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKLSAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbMF0gPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQ0XzEwX21teGV4dDsKLSAgICAgICAgICAgIGMtPmlkY3RfZGNbMF0gPSBmZl9oZXZjX2lkY3Q0eDRfZGNfMTBfbW14ZXh0OwotICAgICAgICAgICAgYy0+aWRjdF9kY1sxXSA9IGZmX2hldmNfaWRjdDh4OF9kY18xMF9tbXhleHQ7CisgICAgICAgICAgICBjLT5hZGRfcmVzaWR1YWxbMF0gPSBmZl9oZXZjX2FkZF9yZXNpZHVhbF80XzEwX21teGV4dDsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMF0gPSBmZl9oZXZjX2lkY3RfNHg0X2RjXzEwX21teGV4dDsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMV0gPSBmZl9oZXZjX2lkY3RfOHg4X2RjXzEwX21teGV4dDsKICAgICAgICAgfQogICAgICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CiAgICAgICAgICAgICBjLT5oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYV8xMF9zc2UyOwpAQCAtODY0LDE3ICs4ODksMjMgQEAKICAgICAgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgewogICAgICAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfMTBfc3NlMjsKICAgICAgICAgICAgICAgICBjLT5oZXZjX2hfbG9vcF9maWx0ZXJfbHVtYSA9IGZmX2hldmNfaF9sb29wX2ZpbHRlcl9sdW1hXzEwX3NzZTI7CisKKyAgICAgICAgICAgICAgICBjLT5pZGN0WzJdID0gZmZfaGV2Y19pZGN0XzE2eDE2XzEwX3NzZTI7CisgICAgICAgICAgICAgICAgYy0+aWRjdFszXSA9IGZmX2hldmNfaWRjdF8zMngzMl8xMF9zc2UyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgU0FPX0JBTkRfSU5JVCgxMCwgc3NlMik7CiAgICAgICAgICAgICBTQU9fRURHRV9JTklUKDEwLCBzc2UyKTsKIAotICAgICAgICAgICAgYy0+aWRjdF9kY1sxXSA9IGZmX2hldmNfaWRjdDh4OF9kY18xMF9zc2UyOwotICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdDE2eDE2X2RjXzEwX3NzZTI7Ci0gICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0MzJ4MzJfZGNfMTBfc3NlMjsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMV0gPSBmZl9oZXZjX2lkY3RfOHg4X2RjXzEwX3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzJdID0gZmZfaGV2Y19pZGN0XzE2eDE2X2RjXzEwX3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0XzMyeDMyX2RjXzEwX3NzZTI7CiAKLSAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbMV0gICAgPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQ4XzEwX3NzZTI7Ci0gICAgICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzJdICAgID0gZmZfaGV2Y190cmFuc2Zvcm1fYWRkMTZfMTBfc3NlMjsKLSAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbM10gICAgPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl8xMF9zc2UyOworICAgICAgICAgICAgYy0+aWRjdFswXSAgICA9IGZmX2hldmNfaWRjdF80eDRfMTBfc3NlMjsKKyAgICAgICAgICAgIGMtPmlkY3RbMV0gICAgPSBmZl9oZXZjX2lkY3RfOHg4XzEwX3NzZTI7CisKKyAgICAgICAgICAgIGMtPmFkZF9yZXNpZHVhbFsxXSA9IGZmX2hldmNfYWRkX3Jlc2lkdWFsXzhfMTBfc3NlMjsKKyAgICAgICAgICAgIGMtPmFkZF9yZXNpZHVhbFsyXSA9IGZmX2hldmNfYWRkX3Jlc2lkdWFsXzE2XzEwX3NzZTI7CisgICAgICAgICAgICBjLT5hZGRfcmVzaWR1YWxbM10gPSBmZl9oZXZjX2FkZF9yZXNpZHVhbF8zMl8xMF9zc2UyOwogICAgICAgICB9CiAgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpICYmIEFSQ0hfWDg2XzY0KSB7CiAgICAgICAgICAgICBjLT5oZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYSA9IGZmX2hldmNfdl9sb29wX2ZpbHRlcl9sdW1hXzEwX3Nzc2UzOwpAQCAtODk3LDE1ICs5MjgsMjIgQEAKICAgICAgICAgICAgIGlmIChBUkNIX1g4Nl82NCkgewogICAgICAgICAgICAgICAgIGMtPmhldmNfdl9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2x1bWFfMTBfYXZ4OwogICAgICAgICAgICAgICAgIGMtPmhldmNfaF9sb29wX2ZpbHRlcl9sdW1hID0gZmZfaGV2Y19oX2xvb3BfZmlsdGVyX2x1bWFfMTBfYXZ4OworCisgICAgICAgICAgICAgICAgYy0+aWRjdFsyXSA9IGZmX2hldmNfaWRjdF8xNngxNl8xMF9hdng7CisgICAgICAgICAgICAgICAgYy0+aWRjdFszXSA9IGZmX2hldmNfaWRjdF8zMngzMl8xMF9hdng7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGMtPmlkY3RbMF0gPSBmZl9oZXZjX2lkY3RfNHg0XzEwX2F2eDsKKyAgICAgICAgICAgIGMtPmlkY3RbMV0gPSBmZl9oZXZjX2lkY3RfOHg4XzEwX2F2eDsKKwogICAgICAgICAgICAgU0FPX0JBTkRfSU5JVCgxMCwgYXZ4KTsKICAgICAgICAgfQogICAgICAgICBpZiAoRVhURVJOQUxfQVZYMihjcHVfZmxhZ3MpKSB7CiAgICAgICAgICAgICBjLT5zYW9fYmFuZF9maWx0ZXJbMF0gPSBmZl9oZXZjX3Nhb19iYW5kX2ZpbHRlcl84XzEwX2F2eDI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEVYVEVSTkFMX0FWWDJfRkFTVChjcHVfZmxhZ3MpKSB7Ci0gICAgICAgICAgICBjLT5pZGN0X2RjWzJdID0gZmZfaGV2Y19pZGN0MTZ4MTZfZGNfMTBfYXZ4MjsKLSAgICAgICAgICAgIGMtPmlkY3RfZGNbM10gPSBmZl9oZXZjX2lkY3QzMngzMl9kY18xMF9hdngyOworICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdF8xNngxNl9kY18xMF9hdngyOworICAgICAgICAgICAgYy0+aWRjdF9kY1szXSA9IGZmX2hldmNfaWRjdF8zMngzMl9kY18xMF9hdngyOwogICAgICAgICAgICAgaWYgKEFSQ0hfWDg2XzY0KSB7CiAgICAgICAgICAgICAgICAgYy0+cHV0X2hldmNfZXBlbFs1XVswXVswXSA9IGZmX2hldmNfcHV0X2hldmNfcGVsX3BpeGVsczE2XzEwX2F2eDI7CiAgICAgICAgICAgICAgICAgYy0+cHV0X2hldmNfZXBlbFs2XVswXVswXSA9IGZmX2hldmNfcHV0X2hldmNfcGVsX3BpeGVsczI0XzEwX2F2eDI7CkBAIC0xMDUzLDE0ICsxMDkxLDEzIEBACiAgICAgICAgICAgICBTQU9fQkFORF9JTklUKDEwLCBhdngyKTsKICAgICAgICAgICAgIFNBT19FREdFX0lOSVQoMTAsIGF2eDIpOwogCi0gICAgICAgICAgICBjLT50cmFuc2Zvcm1fYWRkWzJdID0gZmZfaGV2Y190cmFuc2Zvcm1fYWRkMTZfMTBfYXZ4MjsKLSAgICAgICAgICAgIGMtPnRyYW5zZm9ybV9hZGRbM10gPSBmZl9oZXZjX3RyYW5zZm9ybV9hZGQzMl8xMF9hdngyOwotCisgICAgICAgICAgICBjLT5hZGRfcmVzaWR1YWxbMl0gPSBmZl9oZXZjX2FkZF9yZXNpZHVhbF8xNl8xMF9hdngyOworICAgICAgICAgICAgYy0+YWRkX3Jlc2lkdWFsWzNdID0gZmZfaGV2Y19hZGRfcmVzaWR1YWxfMzJfMTBfYXZ4MjsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoYml0X2RlcHRoID09IDEyKSB7CiAgICAgICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkgewotICAgICAgICAgICAgYy0+aWRjdF9kY1swXSA9IGZmX2hldmNfaWRjdDR4NF9kY18xMl9tbXhleHQ7Ci0gICAgICAgICAgICBjLT5pZGN0X2RjWzFdID0gZmZfaGV2Y19pZGN0OHg4X2RjXzEyX21teGV4dDsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMF0gPSBmZl9oZXZjX2lkY3RfNHg0X2RjXzEyX21teGV4dDsKKyAgICAgICAgICAgIGMtPmlkY3RfZGNbMV0gPSBmZl9oZXZjX2lkY3RfOHg4X2RjXzEyX21teGV4dDsKICAgICAgICAgfQogICAgICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CiAgICAgICAgICAgICBjLT5oZXZjX3ZfbG9vcF9maWx0ZXJfY2hyb21hID0gZmZfaGV2Y192X2xvb3BfZmlsdGVyX2Nocm9tYV8xMl9zc2UyOwpAQCAtMTA3Miw5ICsxMTA5LDkgQEAKICAgICAgICAgICAgIFNBT19CQU5EX0lOSVQoMTIsIHNzZTIpOwogICAgICAgICAgICAgU0FPX0VER0VfSU5JVCgxMiwgc3NlMik7CiAKLSAgICAgICAgICAgIGMtPmlkY3RfZGNbMV0gPSBmZl9oZXZjX2lkY3Q4eDhfZGNfMTJfc3NlMjsKLSAgICAgICAgICAgIGMtPmlkY3RfZGNbMl0gPSBmZl9oZXZjX2lkY3QxNngxNl9kY18xMl9zc2UyOwotICAgICAgICAgICAgYy0+aWRjdF9kY1szXSA9IGZmX2hldmNfaWRjdDMyeDMyX2RjXzEyX3NzZTI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzFdID0gZmZfaGV2Y19pZGN0Xzh4OF9kY18xMl9zc2UyOworICAgICAgICAgICAgYy0+aWRjdF9kY1syXSA9IGZmX2hldmNfaWRjdF8xNngxNl9kY18xMl9zc2UyOworICAgICAgICAgICAgYy0+aWRjdF9kY1szXSA9IGZmX2hldmNfaWRjdF8zMngzMl9kY18xMl9zc2UyOwogICAgICAgICB9CiAgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpICYmIEFSQ0hfWDg2XzY0KSB7CiAgICAgICAgICAgICBjLT5oZXZjX3ZfbG9vcF9maWx0ZXJfbHVtYSA9IGZmX2hldmNfdl9sb29wX2ZpbHRlcl9sdW1hXzEyX3Nzc2UzOwpAQCAtMTEwNCw4ICsxMTQxLDggQEAKICAgICAgICAgICAgIGMtPnNhb19iYW5kX2ZpbHRlclswXSA9IGZmX2hldmNfc2FvX2JhbmRfZmlsdGVyXzhfMTJfYXZ4MjsKICAgICAgICAgfQogICAgICAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKLSAgICAgICAgICAgIGMtPmlkY3RfZGNbMl0gPSBmZl9oZXZjX2lkY3QxNngxNl9kY18xMl9hdngyOwotICAgICAgICAgICAgYy0+aWRjdF9kY1szXSA9IGZmX2hldmNfaWRjdDMyeDMyX2RjXzEyX2F2eDI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzJdID0gZmZfaGV2Y19pZGN0XzE2eDE2X2RjXzEyX2F2eDI7CisgICAgICAgICAgICBjLT5pZGN0X2RjWzNdID0gZmZfaGV2Y19pZGN0XzMyeDMyX2RjXzEyX2F2eDI7CiAKICAgICAgICAgICAgIFNBT19CQU5EX0lOSVQoMTIsIGF2eDIpOwogICAgICAgICAgICAgU0FPX0VER0VfSU5JVCgxMiwgYXZ4Mik7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L2hwZWxkc3AuYXNtCmluZGV4IDgyZmI4OTMuLmNlNWQ3YTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2hwZWxkc3AuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2hwZWxkc3AuYXNtCkBAIC0xNzUsNTMgKzE3NSw2IEBACiBQVVRfTk9fUk5EX1BJWEVMUzhfWDIKIAogCi07IHZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2V4YWN0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQotJW1hY3JvIFBVVF9OT19STkRfUElYRUxTOF9YMl9FWEFDVCAwCi1jZ2xvYmFsIHB1dF9ub19ybmRfcGl4ZWxzOF94Ml9leGFjdCwgNCw1Ci0gICAgbGVhICAgICAgICAgIHI0LCBbcjIqM10KLSAgICBwY21wZXFiICAgICAgbTYsIG02Ci0ubG9vcDoKLSAgICBtb3ZhICAgICAgICAgbTAsIFtyMV0KLSAgICBtb3ZhICAgICAgICAgbTIsIFtyMStyMl0KLSAgICBtb3ZhICAgICAgICAgbTEsIFtyMSsxXQotICAgIG1vdmEgICAgICAgICBtMywgW3IxK3IyKzFdCi0gICAgcHhvciAgICAgICAgIG0wLCBtNgotICAgIHB4b3IgICAgICAgICBtMiwgbTYKLSAgICBweG9yICAgICAgICAgbTEsIG02Ci0gICAgcHhvciAgICAgICAgIG0zLCBtNgotICAgIFBBVkdCICAgICAgICBtMCwgbTEKLSAgICBQQVZHQiAgICAgICAgbTIsIG0zCi0gICAgcHhvciAgICAgICAgIG0wLCBtNgotICAgIHB4b3IgICAgICAgICBtMiwgbTYKLSAgICBtb3ZhICAgICAgIFtyMF0sIG0wCi0gICAgbW92YSAgICBbcjArcjJdLCBtMgotICAgIG1vdmEgICAgICAgICBtMCwgW3IxK3IyKjJdCi0gICAgbW92YSAgICAgICAgIG0xLCBbcjErcjIqMisxXQotICAgIG1vdmEgICAgICAgICBtMiwgW3IxK3I0XQotICAgIG1vdmEgICAgICAgICBtMywgW3IxK3I0KzFdCi0gICAgcHhvciAgICAgICAgIG0wLCBtNgotICAgIHB4b3IgICAgICAgICBtMSwgbTYKLSAgICBweG9yICAgICAgICAgbTIsIG02Ci0gICAgcHhvciAgICAgICAgIG0zLCBtNgotICAgIFBBVkdCICAgICAgICBtMCwgbTEKLSAgICBQQVZHQiAgICAgICAgbTIsIG0zCi0gICAgcHhvciAgICAgICAgIG0wLCBtNgotICAgIHB4b3IgICAgICAgICBtMiwgbTYKLSAgICBtb3ZhICBbcjArcjIqMl0sIG0wCi0gICAgbW92YSAgICBbcjArcjRdLCBtMgotICAgIGxlYSAgICAgICAgICByMSwgW3IxK3IyKjRdCi0gICAgbGVhICAgICAgICAgIHIwLCBbcjArcjIqNF0KLSAgICBzdWIgICAgICAgICByM2QsIDQKLSAgICBqZyAubG9vcAotICAgIFJFUF9SRVQKLSVlbmRtYWNybwotCi1JTklUX01NWCBtbXhleHQKLVBVVF9OT19STkRfUElYRUxTOF9YMl9FWEFDVAotSU5JVF9NTVggM2Rub3cKLVBVVF9OT19STkRfUElYRUxTOF9YMl9FWEFDVAotCi0KIDsgdm9pZCBmZl9wdXRfcGl4ZWxzOF95Mih1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKICVtYWNybyBQVVRfUElYRUxTOF9ZMiAwCiAlaWYgY3B1ZmxhZyhzc2UyKQpAQCAtMzAwLDQ4ICsyNTMsNiBAQAogUFVUX05PX1JORF9QSVhFTFM4X1kyCiAKIAotOyB2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml9leGFjdCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKLSVtYWNybyBQVVRfTk9fUk5EX1BJWEVMUzhfWTJfRVhBQ1QgMAotY2dsb2JhbCBwdXRfbm9fcm5kX3BpeGVsczhfeTJfZXhhY3QsIDQsNQotICAgIGxlYSAgICAgICAgICByNCwgW3IyKjNdCi0gICAgbW92YSAgICAgICAgIG0wLCBbcjFdCi0gICAgcGNtcGVxYiAgICAgIG02LCBtNgotICAgIGFkZCAgICAgICAgICByMSwgcjIKLSAgICBweG9yICAgICAgICAgbTAsIG02Ci0ubG9vcDoKLSAgICBtb3ZhICAgICAgICAgbTEsIFtyMV0KLSAgICBtb3ZhICAgICAgICAgbTIsIFtyMStyMl0KLSAgICBweG9yICAgICAgICAgbTEsIG02Ci0gICAgcHhvciAgICAgICAgIG0yLCBtNgotICAgIFBBVkdCICAgICAgICBtMCwgbTEKLSAgICBQQVZHQiAgICAgICAgbTEsIG0yCi0gICAgcHhvciAgICAgICAgIG0wLCBtNgotICAgIHB4b3IgICAgICAgICBtMSwgbTYKLSAgICBtb3ZhICAgICAgIFtyMF0sIG0wCi0gICAgbW92YSAgICBbcjArcjJdLCBtMQotICAgIG1vdmEgICAgICAgICBtMSwgW3IxK3IyKjJdCi0gICAgbW92YSAgICAgICAgIG0wLCBbcjErcjRdCi0gICAgcHhvciAgICAgICAgIG0xLCBtNgotICAgIHB4b3IgICAgICAgICBtMCwgbTYKLSAgICBQQVZHQiAgICAgICAgbTIsIG0xCi0gICAgUEFWR0IgICAgICAgIG0xLCBtMAotICAgIHB4b3IgICAgICAgICBtMiwgbTYKLSAgICBweG9yICAgICAgICAgbTEsIG02Ci0gICAgbW92YSAgW3IwK3IyKjJdLCBtMgotICAgIG1vdmEgICAgW3IwK3I0XSwgbTEKLSAgICBsZWEgICAgICAgICAgcjEsIFtyMStyMio0XQotICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IyKjRdCi0gICAgc3ViICAgICAgICAgcjNkLCA0Ci0gICAgamcgLmxvb3AKLSAgICBSRVBfUkVUCi0lZW5kbWFjcm8KLQotSU5JVF9NTVggbW14ZXh0Ci1QVVRfTk9fUk5EX1BJWEVMUzhfWTJfRVhBQ1QKLUlOSVRfTU1YIDNkbm93Ci1QVVRfTk9fUk5EX1BJWEVMUzhfWTJfRVhBQ1QKLQotCiA7IHZvaWQgZmZfYXZnX3BpeGVsczgodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCiAlbWFjcm8gQVZHX1BJWEVMUzggMAogY2dsb2JhbCBhdmdfcGl4ZWxzOCwgNCw1CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwLmggYi9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwLmgKaW5kZXggNWZhZTk5MC4uYmY5NzAyOSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaHBlbGRzcC5oCisrKyBiL2xpYmF2Y29kZWMveDg2L2hwZWxkc3AuaApAQCAtMjIsNiArMjIsOCBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSAibGliYXZjb2RlYy9ocGVsZHNwLmgiCisKIHZvaWQgZmZfYXZnX3BpeGVsczhfeDJfbW14KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CiAKQEAgLTUwLDQgKzUyLDYgQEAKIHZvaWQgZmZfcHV0X3BpeGVsczE2X3h5Ml9zc3NlMyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKIAordm9pZCBmZl9ocGVsZHNwX3ZwM19pbml0X3g4NihIcGVsRFNQQ29udGV4dCAqYywgaW50IGNwdV9mbGFncywgaW50IGZsYWdzKTsKKwogI2VuZGlmIC8qIEFWQ09ERUNfWDg2X0hQRUxEU1BfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaHBlbGRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwX2luaXQuYwppbmRleCA1YzVkYTI4Li5kODk5MjhjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwX2luaXQuYwpAQCAtMjQsNyArMjQsNiBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvaHBlbGRzcC5oIgpAQCAtNTIsMTIgKzUxLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CiB2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml8zZG5vdyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwotdm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeDJfZXhhY3RfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Ci12b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml9leGFjdF8zZG5vdyh1aW50OF90ICpibG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKIHZvaWQgZmZfcHV0X3BpeGVsczhfeTJfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CiB2b2lkIGZmX3B1dF9waXhlbHM4X3kyXzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCkBAIC02NiwxMiArNTksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKIHZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyXzNkbm93KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Ci12b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml9leGFjdF9tbXhleHQodWludDhfdCAqYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKLXZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2V4YWN0XzNkbm93KHVpbnQ4X3QgKmJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwogdm9pZCBmZl9hdmdfcGl4ZWxzOF8zZG5vdyh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7CiB2b2lkIGZmX2F2Z19waXhlbHM4X3gyX21teGV4dCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLApAQCAtMTYxLDcgKzE0OCw3IEBACiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCiAKIAotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAKICNkZWZpbmUgSFBFTERTUF9BVkdfUElYRUxTMTYoQ1BVRVhUKSAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgQ0FMTF8yWF9QSVhFTFMocHV0X25vX3JuZF9waXhlbHMxNl94MiAjIyBDUFVFWFQsIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94MiAjIyBDUFVFWFQsIDgpIFwKQEAgLTE3Niw3ICsxNjMsNyBAQAogSFBFTERTUF9BVkdfUElYRUxTMTYoXzNkbm93KQogSFBFTERTUF9BVkdfUElYRUxTMTYoX21teGV4dCkKIAotI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworI2VuZGlmIC8qIEhBVkVfWDg2QVNNICovCiAKICNkZWZpbmUgU0VUX0hQRUxfRlVOQ1NfRVhUKFBGWCwgSURYLCBTSVpFLCBDUFUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaWYgKEhBVkVfTU1YX0VYVEVSTkFMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTk3LDcgKzE4NCw3IEBACiAgICAgfSB3aGlsZSAoMCkKICNlbmRpZgogCi1zdGF0aWMgdm9pZCBocGVsZHNwX2luaXRfbW14KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MsIGludCBjcHVfZmxhZ3MpCitzdGF0aWMgdm9pZCBocGVsZHNwX2luaXRfbW14KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MpCiB7CiAgICAgU0VUX0hQRUxfRlVOQ1MocHV0LCAgICAgICAgWzBdLCAxNiwgbW14KTsKICAgICBTRVRfSFBFTF9GVU5DUyhwdXRfbm9fcm5kLCBbMF0sIDE2LCBtbXgpOwpAQCAtMjE1LDcgKzIwMiw3IEBACiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgaHBlbGRzcF9pbml0X21teGV4dChIcGVsRFNQQ29udGV4dCAqYywgaW50IGZsYWdzLCBpbnQgY3B1X2ZsYWdzKQorc3RhdGljIHZvaWQgaHBlbGRzcF9pbml0X21teGV4dChIcGVsRFNQQ29udGV4dCAqYywgaW50IGZsYWdzKQogewogI2lmIEhBVkVfTU1YRVhUX0VYVEVSTkFMCiAgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMV0gPSBmZl9wdXRfcGl4ZWxzMTZfeDJfbW14ZXh0OwpAQCAtMjQzLDE1ICsyMzAsMTAgQEAKICAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bM10gPSBhdmdfYXBwcm94X3BpeGVsczE2X3h5Ml9tbXhleHQ7CiAgICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzFdWzNdID0gZmZfYXZnX2FwcHJveF9waXhlbHM4X3h5Ml9tbXhleHQ7CiAgICAgfQotCi0gICAgaWYgKENPTkZJR19WUDNfREVDT0RFUiAmJiBmbGFncyAmIEFWX0NPREVDX0ZMQUdfQklURVhBQ1QpIHsKLSAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2V4YWN0X21teGV4dDsKLSAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2V4YWN0X21teGV4dDsKLSAgICB9CiAjZW5kaWYgLyogSEFWRV9NTVhFWFRfRVhURVJOQUwgKi8KIH0KIAotc3RhdGljIHZvaWQgaHBlbGRzcF9pbml0XzNkbm93KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MsIGludCBjcHVfZmxhZ3MpCitzdGF0aWMgdm9pZCBocGVsZHNwX2luaXRfM2Rub3coSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncykKIHsKICNpZiBIQVZFX0FNRDNETk9XX0VYVEVSTkFMCiAgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMV0gPSBmZl9wdXRfcGl4ZWxzMTZfeDJfM2Rub3c7CkBAIC0yNzksMzMgKzI2MSwyNSBAQAogICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVszXSA9IGF2Z19hcHByb3hfcGl4ZWxzMTZfeHkyXzNkbm93OwogICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlsxXVszXSA9IGZmX2F2Z19hcHByb3hfcGl4ZWxzOF94eTJfM2Rub3c7CiAgICAgfQotCi0gICAgaWYgKENPTkZJR19WUDNfREVDT0RFUiAmJiBmbGFncyAmIEFWX0NPREVDX0ZMQUdfQklURVhBQ1QpIHsKLSAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2V4YWN0XzNkbm93OwotICAgICAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMl0gPSBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfZXhhY3RfM2Rub3c7Ci0gICAgfQogI2VuZGlmIC8qIEhBVkVfQU1EM0ROT1dfRVhURVJOQUwgKi8KIH0KIAotc3RhdGljIHZvaWQgaHBlbGRzcF9pbml0X3NzZTIoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncywgaW50IGNwdV9mbGFncykKK3N0YXRpYyB2b2lkIGhwZWxkc3BfaW5pdF9zc2UyX2Zhc3QoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncykKIHsKICNpZiBIQVZFX1NTRTJfRVhURVJOQUwKLSAgICBpZiAoIShjcHVfZmxhZ3MgJiBBVl9DUFVfRkxBR19TU0UyU0xPVykpIHsKLSAgICAgICAgLy8gdGhlc2UgZnVuY3Rpb25zIGFyZSBzbG93ZXIgdGhhbiBtbXggb24gQU1ELCBidXQgZmFzdGVyIG9uIEludGVsCi0gICAgICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzBdICAgICAgICA9IGZmX3B1dF9waXhlbHMxNl9zc2UyOwotICAgICAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMF1bMF0gPSBmZl9wdXRfcGl4ZWxzMTZfc3NlMjsKLSAgICAgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMV0gICAgICAgID0gZmZfcHV0X3BpeGVsczE2X3gyX3NzZTI7Ci0gICAgICAgIGMtPnB1dF9waXhlbHNfdGFiWzBdWzJdICAgICAgICA9IGZmX3B1dF9waXhlbHMxNl95Ml9zc2UyOwotICAgICAgICBjLT5wdXRfcGl4ZWxzX3RhYlswXVszXSAgICAgICAgPSBmZl9wdXRfcGl4ZWxzMTZfeHkyX3NzZTI7Ci0gICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzBdICAgICAgICA9IGZmX2F2Z19waXhlbHMxNl9zc2UyOwotICAgICAgICBjLT5hdmdfcGl4ZWxzX3RhYlswXVsxXSAgICAgICAgPSBmZl9hdmdfcGl4ZWxzMTZfeDJfc3NlMjsKLSAgICAgICAgYy0+YXZnX3BpeGVsc190YWJbMF1bMl0gICAgICAgID0gZmZfYXZnX3BpeGVsczE2X3kyX3NzZTI7Ci0gICAgICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzNdICAgICAgICA9IGZmX2F2Z19waXhlbHMxNl94eTJfc3NlMjsKLSAgICB9CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMF0gICAgICAgID0gZmZfcHV0X3BpeGVsczE2X3NzZTI7CisgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzBdWzBdID0gZmZfcHV0X3BpeGVsczE2X3NzZTI7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMV0gICAgICAgID0gZmZfcHV0X3BpeGVsczE2X3gyX3NzZTI7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bMl0gICAgICAgID0gZmZfcHV0X3BpeGVsczE2X3kyX3NzZTI7CisgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bM10gICAgICAgID0gZmZfcHV0X3BpeGVsczE2X3h5Ml9zc2UyOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzBdICAgICAgICA9IGZmX2F2Z19waXhlbHMxNl9zc2UyOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzFdICAgICAgICA9IGZmX2F2Z19waXhlbHMxNl94Ml9zc2UyOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzJdICAgICAgICA9IGZmX2F2Z19waXhlbHMxNl95Ml9zc2UyOworICAgIGMtPmF2Z19waXhlbHNfdGFiWzBdWzNdICAgICAgICA9IGZmX2F2Z19waXhlbHMxNl94eTJfc3NlMjsKICNlbmRpZiAvKiBIQVZFX1NTRTJfRVhURVJOQUwgKi8KIH0KIAotc3RhdGljIHZvaWQgaHBlbGRzcF9pbml0X3Nzc2UzKEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgZmxhZ3MsIGludCBjcHVfZmxhZ3MpCitzdGF0aWMgdm9pZCBocGVsZHNwX2luaXRfc3NzZTMoSHBlbERTUENvbnRleHQgKmMsIGludCBmbGFncykKIHsKICNpZiBIQVZFX1NTU0UzX0VYVEVSTkFMCiAgICAgYy0+cHV0X3BpeGVsc190YWJbMF1bM10gICAgICAgICAgICA9IGZmX3B1dF9waXhlbHMxNl94eTJfc3NzZTM7CkBAIC0zMjAsMTcgKzI5NCwyMCBAQAogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKICAgICBpZiAoSU5MSU5FX01NWChjcHVfZmxhZ3MpKQotICAgICAgICBocGVsZHNwX2luaXRfbW14KGMsIGZsYWdzLCBjcHVfZmxhZ3MpOworICAgICAgICBocGVsZHNwX2luaXRfbW14KGMsIGZsYWdzKTsKIAogICAgIGlmIChFWFRFUk5BTF9BTUQzRE5PVyhjcHVfZmxhZ3MpKQotICAgICAgICBocGVsZHNwX2luaXRfM2Rub3coYywgZmxhZ3MsIGNwdV9mbGFncyk7CisgICAgICAgIGhwZWxkc3BfaW5pdF8zZG5vdyhjLCBmbGFncyk7CiAKICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCi0gICAgICAgIGhwZWxkc3BfaW5pdF9tbXhleHQoYywgZmxhZ3MsIGNwdV9mbGFncyk7CisgICAgICAgIGhwZWxkc3BfaW5pdF9tbXhleHQoYywgZmxhZ3MpOwogCi0gICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKLSAgICAgICAgaHBlbGRzcF9pbml0X3NzZTIoYywgZmxhZ3MsIGNwdV9mbGFncyk7CisgICAgaWYgKEVYVEVSTkFMX1NTRTJfRkFTVChjcHVfZmxhZ3MpKQorICAgICAgICBocGVsZHNwX2luaXRfc3NlMl9mYXN0KGMsIGZsYWdzKTsKIAogICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKQotICAgICAgICBocGVsZHNwX2luaXRfc3NzZTMoYywgZmxhZ3MsIGNwdV9mbGFncyk7CisgICAgICAgIGhwZWxkc3BfaW5pdF9zc3NlMyhjLCBmbGFncyk7CisKKyAgICBpZiAoQ09ORklHX1ZQM19ERUNPREVSKQorICAgICAgICBmZl9ocGVsZHNwX3ZwM19pbml0X3g4NihjLCBjcHVfZmxhZ3MsIGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2hwZWxkc3Bfcm5kX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwX3JuZF90ZW1wbGF0ZS5jCmluZGV4IGUyMGQwNjUuLjJiZmYyZDIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2hwZWxkc3Bfcm5kX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy94ODYvaHBlbGRzcF9ybmRfdGVtcGxhdGUuYwpAQCAtMzIsNyArMzIsNyBAQAogewogICAgIE1PVlFfQkZFKG1tNik7CiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgImxlYSAgICAoJTMsICUzKSwgJSUiUkVHX2EiICAgICBcblx0IgorICAgICAgICAibGVhICAgICglMywgJTMpLCAlJSJGRl9SRUdfYSIgIFxuXHQiCiAgICAgICAgICIucDJhbGlnbiAzICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgICglMSksICUlbW0wICAgICAgICAgICAgIFxuXHQiCkBAIC00Miw4ICs0Miw4IEBACiAgICAgICAgIFBBVkdCUCglJW1tMCwgJSVtbTEsICUlbW00LCAgICUlbW0yLCAlJW1tMywgJSVtbTUpCiAgICAgICAgICJtb3ZxICAgJSVtbTQsICglMikgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgICAlJW1tNSwgKCUyLCAlMykgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTEgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJGRl9SRUdfYSIsICUxICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIkZGX1JFR19hIiwgJTIgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgKCUxKSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgICAxKCUxKSwgJSVtbTEgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgICglMSwgJTMpLCAlJW1tMiAgICAgICAgIFxuXHQiCkBAIC01MSwyMCArNTEsMjAgQEAKICAgICAgICAgUEFWR0JQKCUlbW0wLCAlJW1tMSwgJSVtbTQsICAgJSVtbTIsICUlbW0zLCAlJW1tNSkKICAgICAgICAgIm1vdnEgICAlJW1tNCwgKCUyKSAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgICUlbW01LCAoJTIsICUzKSAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMSAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUyICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIkZGX1JFR19hIiwgJTEgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiRkZfUkVHX2EiLCAlMiAgICAgICAgXG5cdCIKICAgICAgICAgInN1YmwgICAkNCwgJTAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiam56ICAgIDFiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIDoiK2ciKGgpLCAiK1MiKHBpeGVscyksICIrRCIoYmxvY2spCiAgICAgICAgIDoiciIoKHg4Nl9yZWcpbGluZV9zaXplKQotICAgICAgICA6UkVHX2EsICJtZW1vcnkiKTsKKyAgICAgICAgOkZGX1JFR19hLCAibWVtb3J5Iik7CiB9CiAKIGF2X3VudXNlZCBzdGF0aWMgdm9pZCBERUYocHV0LCBwaXhlbHMxNl94MikodWludDhfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpCiB7CiAgICAgTU9WUV9CRkUobW02KTsKICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAibGVhICAgICAgICAoJTMsICUzKSwgJSUiUkVHX2EiIFxuXHQiCisgICAgICAgICJsZWEgICAgKCUzLCAlMyksICUlIkZGX1JFR19hIiAgXG5cdCIKICAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgKCUxKSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKQEAgLTgxLDggKzgxLDggQEAKICAgICAgICAgUEFWR0JQKCUlbW0wLCAlJW1tMSwgJSVtbTQsICAgJSVtbTIsICUlbW0zLCAlJW1tNSkKICAgICAgICAgIm1vdnEgICAlJW1tNCwgOCglMikgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgICUlbW01LCA4KCUyLCAlMykgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMSAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUyICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIkZGX1JFR19hIiwgJTEgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiRkZfUkVHX2EiLCAlMiAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgICAoJTEpLCAlJW1tMCAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgIDEoJTEpLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgKCUxLCAlMyksICUlbW0yICAgICAgICAgXG5cdCIKQEAgLTk3LDQyICs5Nyw0MiBAQAogICAgICAgICBQQVZHQlAoJSVtbTAsICUlbW0xLCAlJW1tNCwgICAlJW1tMiwgJSVtbTMsICUlbW01KQogICAgICAgICAibW92cSAgICUlbW00LCA4KCUyKSAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgJSVtbTUsIDgoJTIsICUzKSAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUxICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiRkZfUkVHX2EiLCAlMSAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJGRl9SRUdfYSIsICUyICAgICAgICBcblx0IgogICAgICAgICAic3VibCAgICQ0LCAlMCAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJqbnogICAgMWIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgOiIrZyIoaCksICIrUyIocGl4ZWxzKSwgIitEIihibG9jaykKICAgICAgICAgOiJyIigoeDg2X3JlZylsaW5lX3NpemUpCi0gICAgICAgIDpSRUdfYSwgIm1lbW9yeSIpOworICAgICAgICA6RkZfUkVHX2EsICJtZW1vcnkiKTsKIH0KIAogYXZfdW51c2VkIHN0YXRpYyB2b2lkIERFRihwdXQsIHBpeGVsczhfeTIpKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQogewogICAgIE1PVlFfQkZFKG1tNik7CiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgImxlYSAoJTMsICUzKSwgJSUiUkVHX2EiICAgICAgICBcblx0IgorICAgICAgICAibGVhICglMywgJTMpLCAlJSJGRl9SRUdfYSIgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICglMSksICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgKCUxLCAlMyksICUlbW0xICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgICAoJTEsICUlIlJFR19hIiksJSVtbTIgICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJSUiRkZfUkVHX2EiKSwlJW1tMlxuXHQiCiAgICAgICAgIFBBVkdCUCglJW1tMSwgJSVtbTAsICUlbW00LCAgICUlbW0yLCAlJW1tMSwgJSVtbTUpCiAgICAgICAgICJtb3ZxICAgJSVtbTQsICglMikgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgICAlJW1tNSwgKCUyLCAlMykgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTEgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJGRl9SRUdfYSIsICUxICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIkZGX1JFR19hIiwgJTIgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgKCUxLCAlMyksICUlbW0xICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgICAoJTEsICUlIlJFR19hIiksJSVtbTAgICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJSUiRkZfUkVHX2EiKSwlJW1tMFxuXHQiCiAgICAgICAgIFBBVkdCUCglJW1tMSwgJSVtbTIsICUlbW00LCAgICUlbW0wLCAlJW1tMSwgJSVtbTUpCiAgICAgICAgICJtb3ZxICAgJSVtbTQsICglMikgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgICAlJW1tNSwgKCUyLCAlMykgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTEgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJGRl9SRUdfYSIsICUxICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIkZGX1JFR19hIiwgJTIgICAgICAgIFxuXHQiCiAgICAgICAgICJzdWJsICAgJDQsICUwICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgImpueiAgICAxYiAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICA6IitnIihoKSwgIitTIihwaXhlbHMpLCAiK0QiKGJsb2NrKQogICAgICAgICA6InIiKCh4ODZfcmVnKWxpbmVfc2l6ZSkKLSAgICAgICAgOlJFR19hLCAibWVtb3J5Iik7CisgICAgICAgIDpGRl9SRUdfYSwgIm1lbW9yeSIpOwogfQogCiBhdl91bnVzZWQgc3RhdGljIHZvaWQgREVGKGF2ZywgcGl4ZWxzMTZfeDIpKHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQpAQCAtMTY2LDEyICsxNjYsMTIgQEAKIHsKICAgICBNT1ZRX0JGRShtbTYpOwogICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICJsZWEgICAgKCUzLCAlMyksICUlIlJFR19hIiAgICAgXG5cdCIKKyAgICAgICAgImxlYSAgICAoJTMsICUzKSwgJSUiRkZfUkVHX2EiICBcblx0IgogICAgICAgICAibW92cSAgICglMSksICUlbW0wICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICIucDJhbGlnbiAzICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgICglMSwgJTMpLCAlJW1tMSAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMiAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTEsICUlIkZGX1JFR19hIiksICUlbW0yIFxuXHQiCiAgICAgICAgIFBBVkdCUCglJW1tMSwgJSVtbTAsICUlbW00LCAgICUlbW0yLCAlJW1tMSwgJSVtbTUpCiAgICAgICAgICJtb3ZxICAgKCUyKSwgJSVtbTMgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgUEFWR0JfTU1YKCUlbW0zLCAlJW1tNCwgJSVtbTAsICUlbW02KQpAQCAtMTc5LDExICsxNzksMTEgQEAKICAgICAgICAgUEFWR0JfTU1YKCUlbW0zLCAlJW1tNSwgJSVtbTEsICUlbW02KQogICAgICAgICAibW92cSAgICUlbW0wLCAoJTIpICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgJSVtbTEsICglMiwgJTMpICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAgICAlJSJSRUdfYSIsICUxICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgJSUiRkZfUkVHX2EiLCAlMSAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJGRl9SRUdfYSIsICUyICAgICAgICBcblx0IgogCiAgICAgICAgICJtb3ZxICAgKCUxLCAlMyksICUlbW0xICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgICAoJTEsICUlIlJFR19hIiksICUlbW0wICBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTAgXG5cdCIKICAgICAgICAgUEFWR0JQKCUlbW0xLCAlJW1tMiwgJSVtbTQsICAgJSVtbTAsICUlbW0xLCAlJW1tNSkKICAgICAgICAgIm1vdnEgICAoJTIpLCAlJW1tMyAgICAgICAgICAgICBcblx0IgogICAgICAgICBQQVZHQl9NTVgoJSVtbTMsICUlbW00LCAlJW1tMiwgJSVtbTYpCkBAIC0xOTEsMTIgKzE5MSwxMiBAQAogICAgICAgICBQQVZHQl9NTVgoJSVtbTMsICUlbW01LCAlJW1tMSwgJSVtbTYpCiAgICAgICAgICJtb3ZxICAgJSVtbTIsICglMikgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgICAlJW1tMSwgKCUyLCAlMykgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICAgICUlIlJFR19hIiwgJTEgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgICAgJSUiUkVHX2EiLCAlMiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlJSJGRl9SRUdfYSIsICUxICAgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICUlIkZGX1JFR19hIiwgJTIgICAgICAgIFxuXHQiCiAKICAgICAgICAgInN1YmwgICAkNCwgJTAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiam56ICAgIDFiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIDoiK2ciKGgpLCAiK1MiKHBpeGVscyksICIrRCIoYmxvY2spCiAgICAgICAgIDoiciIoKHg4Nl9yZWcpbGluZV9zaXplKQotICAgICAgICA6UkVHX2EsICJtZW1vcnkiKTsKKyAgICAgICAgOkZGX1JFR19hLCAibWVtb3J5Iik7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwX3ZwMy5hc20gYi9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwX3ZwMy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhOTZkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L2hwZWxkc3BfdnAzLmFzbQpAQCAtMCwwICsxLDExMSBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRC1vcHRpbWl6ZWQgaGFsZnBlbCBmdW5jdGlvbnMgZm9yIFZQMworOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT04gLnRleHQKKworOyB2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml9leGFjdCh1aW50OF90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCkKKyVtYWNybyBQVVRfTk9fUk5EX1BJWEVMUzhfWDJfRVhBQ1QgMAorY2dsb2JhbCBwdXRfbm9fcm5kX3BpeGVsczhfeDJfZXhhY3QsIDQsNQorICAgIGxlYSAgICAgICAgICByNCwgW3IyKjNdCisgICAgcGNtcGVxYiAgICAgIG02LCBtNgorLmxvb3A6CisgICAgbW92YSAgICAgICAgIG0wLCBbcjFdCisgICAgbW92YSAgICAgICAgIG0yLCBbcjErcjJdCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErMV0KKyAgICBtb3ZhICAgICAgICAgbTMsIFtyMStyMisxXQorICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTIsIG02CisgICAgcHhvciAgICAgICAgIG0xLCBtNgorICAgIHB4b3IgICAgICAgICBtMywgbTYKKyAgICBQQVZHQiAgICAgICAgbTAsIG0xCisgICAgUEFWR0IgICAgICAgIG0yLCBtMworICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTIsIG02CisgICAgbW92YSAgICAgICBbcjBdLCBtMAorICAgIG1vdmEgICAgW3IwK3IyXSwgbTIKKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMStyMioyXQorICAgIG1vdmEgICAgICAgICBtMSwgW3IxK3IyKjIrMV0KKyAgICBtb3ZhICAgICAgICAgbTIsIFtyMStyNF0KKyAgICBtb3ZhICAgICAgICAgbTMsIFtyMStyNCsxXQorICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgcHhvciAgICAgICAgIG0yLCBtNgorICAgIHB4b3IgICAgICAgICBtMywgbTYKKyAgICBQQVZHQiAgICAgICAgbTAsIG0xCisgICAgUEFWR0IgICAgICAgIG0yLCBtMworICAgIHB4b3IgICAgICAgICBtMCwgbTYKKyAgICBweG9yICAgICAgICAgbTIsIG02CisgICAgbW92YSAgW3IwK3IyKjJdLCBtMAorICAgIG1vdmEgICAgW3IwK3I0XSwgbTIKKyAgICBsZWEgICAgICAgICAgcjEsIFtyMStyMio0XQorICAgIGxlYSAgICAgICAgICByMCwgW3IwK3IyKjRdCisgICAgc3ViICAgICAgICAgcjNkLCA0CisgICAgamcgLmxvb3AKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9NTVggbW14ZXh0CitQVVRfTk9fUk5EX1BJWEVMUzhfWDJfRVhBQ1QKK0lOSVRfTU1YIDNkbm93CitQVVRfTk9fUk5EX1BJWEVMUzhfWDJfRVhBQ1QKKworCis7IHZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2V4YWN0KHVpbnQ4X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKQorJW1hY3JvIFBVVF9OT19STkRfUElYRUxTOF9ZMl9FWEFDVCAwCitjZ2xvYmFsIHB1dF9ub19ybmRfcGl4ZWxzOF95Ml9leGFjdCwgNCw1CisgICAgbGVhICAgICAgICAgIHI0LCBbcjIqM10KKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMV0KKyAgICBwY21wZXFiICAgICAgbTYsIG02CisgICAgYWRkICAgICAgICAgIHIxLCByMgorICAgIHB4b3IgICAgICAgICBtMCwgbTYKKy5sb29wOgorICAgIG1vdmEgICAgICAgICBtMSwgW3IxXQorICAgIG1vdmEgICAgICAgICBtMiwgW3IxK3IyXQorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBweG9yICAgICAgICAgbTIsIG02CisgICAgUEFWR0IgICAgICAgIG0wLCBtMQorICAgIFBBVkdCICAgICAgICBtMSwgbTIKKyAgICBweG9yICAgICAgICAgbTAsIG02CisgICAgcHhvciAgICAgICAgIG0xLCBtNgorICAgIG1vdmEgICAgICAgW3IwXSwgbTAKKyAgICBtb3ZhICAgIFtyMCtyMl0sIG0xCisgICAgbW92YSAgICAgICAgIG0xLCBbcjErcjIqMl0KKyAgICBtb3ZhICAgICAgICAgbTAsIFtyMStyNF0KKyAgICBweG9yICAgICAgICAgbTEsIG02CisgICAgcHhvciAgICAgICAgIG0wLCBtNgorICAgIFBBVkdCICAgICAgICBtMiwgbTEKKyAgICBQQVZHQiAgICAgICAgbTEsIG0wCisgICAgcHhvciAgICAgICAgIG0yLCBtNgorICAgIHB4b3IgICAgICAgICBtMSwgbTYKKyAgICBtb3ZhICBbcjArcjIqMl0sIG0yCisgICAgbW92YSAgICBbcjArcjRdLCBtMQorICAgIGxlYSAgICAgICAgICByMSwgW3IxK3IyKjRdCisgICAgbGVhICAgICAgICAgIHIwLCBbcjArcjIqNF0KKyAgICBzdWIgICAgICAgICByM2QsIDQKKyAgICBqZyAubG9vcAorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1BVVF9OT19STkRfUElYRUxTOF9ZMl9FWEFDVAorSU5JVF9NTVggM2Rub3cKK1BVVF9OT19STkRfUElYRUxTOF9ZMl9FWEFDVApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaHBlbGRzcF92cDNfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvaHBlbGRzcF92cDNfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NzlmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni9ocGVsZHNwX3ZwM19pbml0LmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaHBlbGRzcC5oIgorCisjaW5jbHVkZSAiaHBlbGRzcC5oIgorCit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml9leGFjdF9tbXhleHQodWludDhfdCAqYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKK3ZvaWQgZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2V4YWN0XzNkbm93KHVpbnQ4X3QgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50IGgpOwordm9pZCBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfZXhhY3RfbW14ZXh0KHVpbnQ4X3QgKmJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQgaCk7Cit2b2lkIGZmX3B1dF9ub19ybmRfcGl4ZWxzOF95Ml9leGFjdF8zZG5vdyh1aW50OF90ICpibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludCBoKTsKKworYXZfY29sZCB2b2lkIGZmX2hwZWxkc3BfdnAzX2luaXRfeDg2KEhwZWxEU1BDb250ZXh0ICpjLCBpbnQgY3B1X2ZsYWdzLCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKEVYVEVSTkFMX0FNRDNETk9XKGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYgKGZsYWdzICYgQVZfQ09ERUNfRkxBR19CSVRFWEFDVCkgeworICAgICAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzFdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3gyX2V4YWN0XzNkbm93OworICAgICAgICAgICAgYy0+cHV0X25vX3JuZF9waXhlbHNfdGFiWzFdWzJdID0gZmZfcHV0X25vX3JuZF9waXhlbHM4X3kyX2V4YWN0XzNkbm93OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGlmIChmbGFncyAmIEFWX0NPREVDX0ZMQUdfQklURVhBQ1QpIHsKKyAgICAgICAgICAgIGMtPnB1dF9ub19ybmRfcGl4ZWxzX3RhYlsxXVsxXSA9IGZmX3B1dF9ub19ybmRfcGl4ZWxzOF94Ml9leGFjdF9tbXhleHQ7CisgICAgICAgICAgICBjLT5wdXRfbm9fcm5kX3BpeGVsc190YWJbMV1bMl0gPSBmZl9wdXRfbm9fcm5kX3BpeGVsczhfeTJfZXhhY3RfbW14ZXh0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZHNwLmFzbQppbmRleCAwZGJlNTk4Li5hMTIzMWYxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZHNwLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZHNwLmFzbQpAQCAtMjIsMTk1ICsyMiw0MSBAQAogCiAlaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKIAotU0VDVElPTl9ST0RBVEEKLWNleHRlcm4gcGJfMTUKLXBiX3p6enp6enp6Nzc3Nzc3Nzc6IHRpbWVzIDggZGIgLTEKLXBiXzc6IHRpbWVzIDggZGIgNwotcGJfenp6ejMzMzN6enp6YmJiYjogZGIgLTEsLTEsLTEsLTEsMywzLDMsMywtMSwtMSwtMSwtMSwxMSwxMSwxMSwxMQotcGJfenoxMXp6NTV6ejk5enpkZDogZGIgLTEsLTEsMSwxLC0xLC0xLDUsNSwtMSwtMSw5LDksLTEsLTEsMTMsMTMKLQogU0VDVElPTiAudGV4dAogCi07IHZvaWQgZmZfYWRkX2hmeXVfbWVkaWFuX3ByZWRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaWZmLCBpbnQgdywKLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKQotJW1hY3JvIEhGWVVfTUVESUFOIDAKLWNnbG9iYWwgYWRkX2hmeXVfbWVkaWFuX3ByZWQsIDYsNiw4LCBkc3QsIHRvcCwgZGlmZiwgdywgbGVmdCwgbGVmdF90b3AKLSAgICBtb3Z1ICAgIG0wLCBbdG9wcV0KLSAgICBtb3ZhICAgIG0yLCBtMAotICAgIG1vdmQgICAgbTQsIFtsZWZ0X3RvcHFdCi0gICAgTFNISUZUICBtMiwgMQotICAgIG1vdmEgICAgbTEsIG0wCi0gICAgcG9yICAgICBtNCwgbTIKLSAgICBtb3ZkICAgIG0zLCBbbGVmdHFdCi0gICAgcHN1YmIgICBtMCwgbTQgOyB0LXRsCi0gICAgYWRkICAgIGRzdHEsIHdxCi0gICAgYWRkICAgIHRvcHEsIHdxCi0gICAgYWRkICAgZGlmZnEsIHdxCi0gICAgbmVnICAgICAgd3EKLSAgICBqbXAgLnNraXAKLS5sb29wOgotICAgIG1vdnUgICAgbTQsIFt0b3BxK3dxXQotICAgIG1vdmEgICAgbTAsIG00Ci0gICAgTFNISUZUICBtNCwgMQotICAgIHBvciAgICAgbTQsIG0xCi0gICAgbW92YSAgICBtMSwgbTAgOyB0Ci0gICAgcHN1YmIgICBtMCwgbTQgOyB0LXRsCi0uc2tpcDoKLSAgICBtb3Z1ICAgIG0yLCBbZGlmZnErd3FdCi0lYXNzaWduIGkgMAotJXJlcCBtbXNpemUKLSAgICBtb3ZhICAgIG00LCBtMAotICAgIHBhZGRiICAgbTQsIG0zIDsgdC10bCtsCi0gICAgbW92YSAgICBtNSwgbTMKLSAgICBwbWF4dWIgIG0zLCBtMQotICAgIHBtaW51YiAgbTUsIG0xCi0gICAgcG1pbnViICBtMywgbTQKLSAgICBwbWF4dWIgIG0zLCBtNSA7IG1lZGlhbgotICAgIHBhZGRiICAgbTMsIG0yIDsgK3Jlc2lkdWFsCi0laWYgaT09MAotICAgIG1vdmEgICAgbTcsIG0zCi0gICAgTFNISUZUICBtNywgbW1zaXplLTEKLSVlbHNlCi0gICAgbW92YSAgICBtNiwgbTMKLSAgICBSU0hJRlQgIG03LCAxCi0gICAgTFNISUZUICBtNiwgbW1zaXplLTEKLSAgICBwb3IgICAgIG03LCBtNgotJWVuZGlmCi0laWYgaTxtbXNpemUtMQotICAgIFJTSElGVCAgbTAsIDEKLSAgICBSU0hJRlQgIG0xLCAxCi0gICAgUlNISUZUICBtMiwgMQotJWVuZGlmCi0lYXNzaWduIGkgaSsxCi0lZW5kcmVwCi0gICAgbW92dSBbZHN0cSt3cV0sIG03Ci0gICAgYWRkICAgICAgd3EsIG1tc2l6ZQotICAgIGpsIC5sb29wCi0gICAgbW92enggICByMmQsIGJ5dGUgW2RzdHEtMV0KLSAgICBtb3YgW2xlZnRxXSwgcjJkCi0gICAgbW92enggICByMmQsIGJ5dGUgW3RvcHEtMV0KLSAgICBtb3YgW2xlZnRfdG9wcV0sIHIyZAotICAgIFJFVAotJWVuZG1hY3JvCislaW5jbHVkZSAibGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcF90ZW1wbGF0ZS5hc20iCiAKLSVpZiBBUkNIX1g4Nl8zMgotSU5JVF9NTVggbW14ZXh0Ci1IRllVX01FRElBTgorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkICgqYWRkX2ludDE2KSh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyVtYWNybyBBRERfSU5UMTYgMAorY2dsb2JhbCBhZGRfaW50MTYsIDQsNCw1LCBkc3QsIHNyYywgbWFzaywgdywgdG1wCislaWYgbW1zaXplID4gOAorICAgIHRlc3Qgc3JjcSwgbW1zaXplLTEKKyAgICBqbnogLnVuYWxpZ25lZAorICAgIHRlc3QgZHN0cSwgbW1zaXplLTEKKyAgICBqbnogLnVuYWxpZ25lZAogJWVuZGlmCi1JTklUX1hNTSBzc2UyCi1IRllVX01FRElBTgotCi0KLSVtYWNybyBBRERfSEZZVV9MRUZUX0xPT1AgMiA7ICUxID0gZHN0X2lzX2FsaWduZWQsICUyID0gc3JjX2lzX2FsaWduZWQKLSAgICBhZGQgICAgIHNyY3EsIHdxCi0gICAgYWRkICAgICBkc3RxLCB3cQotICAgIG5lZyAgICAgd3EKLSUlLmxvb3A6Ci0laWYgJTIKLSAgICBtb3ZhICAgIG0xLCBbc3JjcSt3cV0KLSVlbHNlCi0gICAgbW92dSAgICBtMSwgW3NyY3Erd3FdCisgICAgSU5UMTZfTE9PUCBhLCBhZGQKKyVpZiBtbXNpemUgPiA4CisudW5hbGlnbmVkOgorICAgIElOVDE2X0xPT1AgdSwgYWRkCiAlZW5kaWYKLSAgICBtb3ZhICAgIG0yLCBtMQotICAgIHBzbGx3ICAgbTEsIDgKLSAgICBwYWRkYiAgIG0xLCBtMgotICAgIG1vdmEgICAgbTIsIG0xCi0gICAgcHNodWZiICBtMSwgbTMKLSAgICBwYWRkYiAgIG0xLCBtMgotICAgIHBzaHVmYiAgbTAsIG01Ci0gICAgbW92YSAgICBtMiwgbTEKLSAgICBwc2h1ZmIgIG0xLCBtNAotICAgIHBhZGRiICAgbTEsIG0yCi0laWYgbW1zaXplID09IDE2Ci0gICAgbW92YSAgICBtMiwgbTEKLSAgICBwc2h1ZmIgIG0xLCBtNgotICAgIHBhZGRiICAgbTEsIG0yCi0lZW5kaWYKLSAgICBwYWRkYiAgIG0wLCBtMQotJWlmICUxCi0gICAgbW92YSAgICBbZHN0cSt3cV0sIG0wCi0lZWxzZQotICAgIG1vdnEgICAgW2RzdHErd3FdLCBtMAotICAgIG1vdmhwcyAgW2RzdHErd3ErOF0sIG0wCi0lZW5kaWYKLSAgICBhZGQgICAgIHdxLCBtbXNpemUKLSAgICBqbCAlJS5sb29wCi0gICAgbW92ICAgICBlYXgsIG1tc2l6ZS0xCi0gICAgc3ViICAgICBlYXgsIHdkCi0gICAgbW92ZCAgICBtMSwgZWF4Ci0gICAgcHNodWZiICBtMCwgbTEKLSAgICBtb3ZkICAgIGVheCwgbTAKLSAgICBSRVQKLSVlbmRtYWNybwotCi07IGludCBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCB3LCBpbnQgbGVmdCkKLUlOSVRfTU1YIHNzc2UzCi1jZ2xvYmFsIGFkZF9oZnl1X2xlZnRfcHJlZCwgMywzLDcsIGRzdCwgc3JjLCB3LCBsZWZ0Ci0uc2tpcF9wcm9sb2d1ZToKLSAgICBtb3ZhICAgIG01LCBbcGJfN10KLSAgICBtb3ZhICAgIG00LCBbcGJfenp6ejMzMzN6enp6YmJiYl0KLSAgICBtb3ZhICAgIG0zLCBbcGJfenoxMXp6NTV6ejk5enpkZF0KLSAgICBtb3ZkICAgIG0wLCBsZWZ0bQotICAgIHBzbGxxICAgbTAsIDU2Ci0gICAgQUREX0hGWVVfTEVGVF9MT09QIDEsIDEKLQotSU5JVF9YTU0gc3NlNAotY2dsb2JhbCBhZGRfaGZ5dV9sZWZ0X3ByZWQsIDMsMyw3LCBkc3QsIHNyYywgdywgbGVmdAotICAgIG1vdmEgICAgbTUsIFtwYl8xNV0KLSAgICBtb3ZhICAgIG02LCBbcGJfenp6enp6eno3Nzc3Nzc3N10KLSAgICBtb3ZhICAgIG00LCBbcGJfenp6ejMzMzN6enp6YmJiYl0KLSAgICBtb3ZhICAgIG0zLCBbcGJfenoxMXp6NTV6ejk5enpkZF0KLSAgICBtb3ZkICAgIG0wLCBsZWZ0bQotICAgIHBzbGxkcSAgbTAsIDE1Ci0gICAgdGVzdCAgICBzcmNxLCAxNQotICAgIGpueiAuc3JjX3VuYWxpZ25lZAotICAgIHRlc3QgICAgZHN0cSwgMTUKLSAgICBqbnogLmRzdF91bmFsaWduZWQKLSAgICBBRERfSEZZVV9MRUZUX0xPT1AgMSwgMQotLmRzdF91bmFsaWduZWQ6Ci0gICAgQUREX0hGWVVfTEVGVF9MT09QIDAsIDEKLS5zcmNfdW5hbGlnbmVkOgotICAgIEFERF9IRllVX0xFRlRfTE9PUCAwLCAwCi0KLSVtYWNybyBBRERfQllURVMgMAotY2dsb2JhbCBhZGRfYnl0ZXMsIDMsNCwyLCBkc3QsIHNyYywgdywgc2l6ZQotICAgIG1vdiAgc2l6ZXEsIHdxCi0gICAgYW5kICBzaXplcSwgLTIqbW1zaXplCi0gICAganogIC4yCi0gICAgYWRkICAgZHN0cSwgc2l6ZXEKLSAgICBhZGQgICBzcmNxLCBzaXplcQotICAgIG5lZyAgc2l6ZXEKLS4xOgotICAgIG1vdmEgICAgbTAsIFtzcmNxICsgc2l6ZXFdCi0gICAgbW92YSAgICBtMSwgW3NyY3EgKyBzaXplcSArIG1tc2l6ZV0KLSAgICBwYWRkYiAgIG0wLCBbZHN0cSArIHNpemVxXQotICAgIHBhZGRiICAgbTEsIFtkc3RxICsgc2l6ZXEgKyBtbXNpemVdCi0gICAgbW92YSAgIFtkc3RxICsgc2l6ZXFdLCBtMAotICAgIG1vdmEgICBbZHN0cSArIHNpemVxICsgbW1zaXplXSwgbTEKLSAgICBhZGQgIHNpemVxLCAyKm1tc2l6ZQotICAgIGpsIC4xCi0uMjoKLSAgICBhbmQgICAgIHdxLCAyKm1tc2l6ZS0xCi0gICAganogICAgLmVuZAotICAgIGFkZCAgIGRzdHEsIHdxCi0gICAgYWRkICAgc3JjcSwgd3EKLSAgICBuZWcgICAgIHdxCi0uMzoKLSAgICBtb3YgIHNpemViLCBbc3JjcSArIHdxXQotICAgIGFkZCBbZHN0cSArIHdxXSwgc2l6ZWIKLSAgICBpbmMgICAgIHdxCi0gICAgamwgLjMKLS5lbmQ6Ci0gICAgUkVQX1JFVAogJWVuZG1hY3JvCiAKICVpZiBBUkNIX1g4Nl8zMgogSU5JVF9NTVggbW14Ci1BRERfQllURVMKK0FERF9JTlQxNgogJWVuZGlmCisKIElOSVRfWE1NIHNzZTIKLUFERF9CWVRFUworQUREX0lOVDE2CisKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK0FERF9JTlQxNgorJWVuZGlmCiAKIDsgdm9pZCBhZGRfaGZ5dV9sZWZ0X3ByZWRfYmdyMzIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcsIHVpbnQ4X3QgKmxlZnQpCkBAIC0yNTEsMyArOTcsNjggQEAKICVlbmRpZgogSU5JVF9YTU0gc3NlMgogTEVGVF9CR1IzMgorCis7IHZvaWQgYWRkX2hmeXVfbWVkaWFuX3ByZWRpY3Rpb25fbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLCBjb25zdCB1aW50OF90ICpkaWZmLCBpbnQgbWFzaywgaW50IHcsIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCkKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCBhZGRfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNiwgNyw3LDAsIGRzdCwgdG9wLCBkaWZmLCBtYXNrLCB3LCBsZWZ0LCBsZWZ0X3RvcAorICAgIGFkZCAgICAgIHdkLCB3ZAorICAgIG1vdmQgICAgbW02LCBtYXNrZAorICAgIFNQTEFUVyAgbW02LCBtbTYKKyAgICBtb3ZxICAgIG1tMCwgW3RvcHFdCisgICAgbW92cSAgICBtbTIsIG1tMAorICAgIG1vdmQgICAgbW00LCBbbGVmdF90b3BxXQorICAgIHBzbGxxICAgbW0yLCAxNgorICAgIG1vdnEgICAgbW0xLCBtbTAKKyAgICBwb3IgICAgIG1tNCwgbW0yCisgICAgbW92ZCAgICBtbTMsIFtsZWZ0cV0KKyAgICBwc3VidyAgIG1tMCwgbW00IDsgdC10bAorICAgIGFkZCAgICBkc3RxLCB3cQorICAgIGFkZCAgICB0b3BxLCB3cQorICAgIGFkZCAgIGRpZmZxLCB3cQorICAgIG5lZyAgICAgIHdxCisgICAgam1wIC5za2lwCisubG9vcDoKKyAgICBtb3ZxICAgIG1tNCwgW3RvcHErd3FdCisgICAgbW92cSAgICBtbTAsIG1tNAorICAgIHBzbGxxICAgbW00LCAxNgorICAgIHBvciAgICAgbW00LCBtbTEKKyAgICBtb3ZxICAgIG1tMSwgbW0wIDsgdAorICAgIHBzdWJ3ICAgbW0wLCBtbTQgOyB0LXRsCisuc2tpcDoKKyAgICBtb3ZxICAgIG1tMiwgW2RpZmZxK3dxXQorJWFzc2lnbiBpIDAKKyVyZXAgNAorICAgIG1vdnEgICAgbW00LCBtbTAKKyAgICBwYWRkdyAgIG1tNCwgbW0zIDsgdC10bCtsCisgICAgcGFuZCAgICBtbTQsIG1tNgorICAgIG1vdnEgICAgbW01LCBtbTMKKyAgICBwbWF4c3cgIG1tMywgbW0xCisgICAgcG1pbnN3ICBtbTUsIG1tMQorICAgIHBtaW5zdyAgbW0zLCBtbTQKKyAgICBwbWF4c3cgIG1tMywgbW01IDsgbWVkaWFuCisgICAgcGFkZHcgICBtbTMsIG1tMiA7ICtyZXNpZHVhbAorICAgIHBhbmQgICAgbW0zLCBtbTYKKyVpZiBpPT0wCisgICAgbW92cSAgICBtbTcsIG1tMworICAgIHBzbGxxICAgbW03LCA0OAorJWVsc2UKKyAgICBtb3ZxICAgIG1tNCwgbW0zCisgICAgcHNybHEgICBtbTcsIDE2CisgICAgcHNsbHEgICBtbTQsIDQ4CisgICAgcG9yICAgICBtbTcsIG1tNAorJWVuZGlmCislaWYgaTwzCisgICAgcHNybHEgICBtbTAsIDE2CisgICAgcHNybHEgICBtbTEsIDE2CisgICAgcHNybHEgICBtbTIsIDE2CislZW5kaWYKKyVhc3NpZ24gaSBpKzEKKyVlbmRyZXAKKyAgICBtb3ZxIFtkc3RxK3dxXSwgbW03CisgICAgYWRkICAgICAgd3EsIDgKKyAgICBqbCAubG9vcAorICAgIG1vdnp4ICAgcjJkLCB3b3JkIFtkc3RxLTJdCisgICAgbW92IFtsZWZ0cV0sIHIyZAorICAgIG1vdnp4ICAgcjJkLCB3b3JkIFt0b3BxLTJdCisgICAgbW92IFtsZWZ0X3RvcHFdLCByMmQKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2h1ZmZ5dXZkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcF9pbml0LmMKaW5kZXggM2NlZDNjMC4uZWIxMGRlMyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcF9pbml0LmMKQEAgLTIxLDk3ICsyMSw0MSBAQAogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvaHVmZnl1dmRzcC5oIgogCi12b2lkIGZmX2FkZF9ieXRlc19tbXgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludHB0cl90IHcpOwotdm9pZCBmZl9hZGRfYnl0ZXNfc3NlMih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50cHRyX3Qgdyk7Ci0KLXZvaWQgZmZfYWRkX2hmeXVfbWVkaWFuX3ByZWRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgaW50cHRyX3QgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7Ci12b2lkIGZmX2FkZF9oZnl1X21lZGlhbl9wcmVkX3NzZTIodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICp0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgaW50cHRyX3QgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApOwotCi1pbnQgIGZmX2FkZF9oZnl1X2xlZnRfcHJlZF9zc3NlMyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcsIGludCBsZWZ0KTsKLWludCAgZmZfYWRkX2hmeXVfbGVmdF9wcmVkX3NzZTQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcsIGludCBsZWZ0KTsKK3ZvaWQgZmZfYWRkX2ludDE2X21teCh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdyk7Cit2b2lkIGZmX2FkZF9pbnQxNl9zc2UyKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMsIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKK3ZvaWQgZmZfYWRkX2ludDE2X2F2eDIodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcpOwogCiB2b2lkIGZmX2FkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMl9tbXgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgdywgdWludDhfdCAqbGVmdCk7CiB2b2lkIGZmX2FkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMl9zc2UyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3LCB1aW50OF90ICpsZWZ0KTsKK3ZvaWQgZmZfYWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfbW14ZXh0KHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICp0b3AsIGNvbnN0IHVpbnQxNl90ICpkaWZmLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKIAotI2lmIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFXzdSRUdTICYmIEFSQ0hfWDg2XzMyCi1zdGF0aWMgdm9pZCBhZGRfaGZ5dV9tZWRpYW5fcHJlZF9jbW92KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaWZmLCBpbnRwdHJfdCB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCi17Ci0gICAgeDg2X3JlZyB3MiA9IC13OwotICAgIHg4Nl9yZWcgeDsKLSAgICBpbnQgbCAgPSAqbGVmdCAgICAgJiAweGZmOwotICAgIGludCB0bCA9ICpsZWZ0X3RvcCAmIDB4ZmY7Ci0gICAgaW50IHQ7Ci0gICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJtb3YgICAgICAgICAgJTcsICUzICAgICAgICAgICAgXG4iCi0gICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgICAgICJtb3Z6YmwgKCUzLCAlNCksICUyICAgICAgICAgICAgXG4iCi0gICAgICAgICJtb3YgICAgICAgICAgJTIsICVrMyAgICAgICAgICAgXG4iCi0gICAgICAgICJzdWIgICAgICAgICAlYjEsICViMyAgICAgICAgICAgXG4iCi0gICAgICAgICJhZGQgICAgICAgICAlYjAsICViMyAgICAgICAgICAgXG4iCi0gICAgICAgICJtb3YgICAgICAgICAgJTIsICUxICAgICAgICAgICAgXG4iCi0gICAgICAgICJjbXAgICAgICAgICAgJTAsICUyICAgICAgICAgICAgXG4iCi0gICAgICAgICJjbW92ZyAgICAgICAgJTAsICUyICAgICAgICAgICAgXG4iCi0gICAgICAgICJjbW92ZyAgICAgICAgJTEsICUwICAgICAgICAgICAgXG4iCi0gICAgICAgICJjbXAgICAgICAgICAlazMsICUwICAgICAgICAgICAgXG4iCi0gICAgICAgICJjbW92ZyAgICAgICAlazMsICUwICAgICAgICAgICAgXG4iCi0gICAgICAgICJtb3YgICAgICAgICAgJTcsICUzICAgICAgICAgICAgXG4iCi0gICAgICAgICJjbXAgICAgICAgICAgJTIsICUwICAgICAgICAgICAgXG4iCi0gICAgICAgICJjbW92bCAgICAgICAgJTIsICUwICAgICAgICAgICAgXG4iCi0gICAgICAgICJhZGQgICAgKCU2LCAlNCksICViMCAgICAgICAgICAgXG4iCi0gICAgICAgICJtb3YgICAgICAgICAlYjAsICglNSwgJTQpICAgICAgXG4iCi0gICAgICAgICJpbmMgICAgICAgICAgJTQgICAgICAgICAgICAgICAgXG4iCi0gICAgICAgICJqbCAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgXG4iCi0gICAgICAgIDogIismcSIobCksICIrJnEiKHRsKSwgIj0mciIodCksICI9JnEiKHgpLCAiKyZyIih3MikKLSAgICAgICAgOiAiciIoZHN0ICsgdyksICJyIihkaWZmICsgdyksICJybSIodG9wICsgdykKLSAgICApOwotICAgICpsZWZ0ICAgICA9IGw7Ci0gICAgKmxlZnRfdG9wID0gdGw7Ci19Ci0jZW5kaWYKLQotYXZfY29sZCB2b2lkIGZmX2h1ZmZ5dXZkc3BfaW5pdF94ODYoSHVmZllVVkRTUENvbnRleHQgKmMpCithdl9jb2xkIHZvaWQgZmZfaHVmZnl1dmRzcF9pbml0X3g4NihIdWZmWVVWRFNQQ29udGV4dCAqYywgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCiB7CiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKLQotI2lmIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFXzdSRUdTICYmIEFSQ0hfWDg2XzMyCi0gICAgaWYgKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX0NNT1YpCi0gICAgICAgIGMtPmFkZF9oZnl1X21lZGlhbl9wcmVkID0gYWRkX2hmeXVfbWVkaWFuX3ByZWRfY21vdjsKLSNlbmRpZgorICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOwogCiAgICAgaWYgKEFSQ0hfWDg2XzMyICYmIEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIGMtPmFkZF9ieXRlcyA9IGZmX2FkZF9ieXRlc19tbXg7CiAgICAgICAgIGMtPmFkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMiA9IGZmX2FkZF9oZnl1X2xlZnRfcHJlZF9iZ3IzMl9tbXg7CisgICAgICAgIGMtPmFkZF9pbnQxNiA9IGZmX2FkZF9pbnQxNl9tbXg7CiAgICAgfQogCi0gICAgaWYgKEFSQ0hfWDg2XzMyICYmIEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIC8qIHNsb3dlciB0aGFuIGNtb3YgdmVyc2lvbiBvbiBBTUQgKi8KLSAgICAgICAgaWYgKCEoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfM0ROT1cpKQotICAgICAgICAgICAgYy0+YWRkX2hmeXVfbWVkaWFuX3ByZWQgPSBmZl9hZGRfaGZ5dV9tZWRpYW5fcHJlZF9tbXhleHQ7CisgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpICYmIHBpeF9kZXNjICYmIHBpeF9kZXNjLT5jb21wWzBdLmRlcHRoPDE2KSB7CisgICAgICAgIGMtPmFkZF9oZnl1X21lZGlhbl9wcmVkX2ludDE2ID0gZmZfYWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfbW14ZXh0OwogICAgIH0KIAogICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKLSAgICAgICAgYy0+YWRkX2J5dGVzICAgICAgICAgICAgPSBmZl9hZGRfYnl0ZXNfc3NlMjsKLSAgICAgICAgYy0+YWRkX2hmeXVfbWVkaWFuX3ByZWQgPSBmZl9hZGRfaGZ5dV9tZWRpYW5fcHJlZF9zc2UyOworICAgICAgICBjLT5hZGRfaW50MTYgPSBmZl9hZGRfaW50MTZfc3NlMjsKICAgICAgICAgYy0+YWRkX2hmeXVfbGVmdF9wcmVkX2JncjMyID0gZmZfYWRkX2hmeXVfbGVmdF9wcmVkX2JncjMyX3NzZTI7CiAgICAgfQogCi0gICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpIHsKLSAgICAgICAgYy0+YWRkX2hmeXVfbGVmdF9wcmVkID0gZmZfYWRkX2hmeXVfbGVmdF9wcmVkX3Nzc2UzOwotICAgICAgICBpZiAoY3B1X2ZsYWdzICYgQVZfQ1BVX0ZMQUdfU1NFNCkgLy8gbm90IHJlYWxseSBTU0U0LCBqdXN0IHNsb3cgb24gQ29ucm9lCi0gICAgICAgICAgICBjLT5hZGRfaGZ5dV9sZWZ0X3ByZWQgPSBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfc3NlNDsKKyAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWRkX2ludDE2ID0gZmZfYWRkX2ludDE2X2F2eDI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcF90ZW1wbGF0ZS5hc20gYi9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZHNwX3RlbXBsYXRlLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTcyMWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcF90ZW1wbGF0ZS5hc20KQEAgLTAsMCArMSw3NiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogU0lNRC1vcHRpbWl6ZWQgSHVmZllVViBmdW5jdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0Cis7KiBDb3B5cmlnaHQgKGMpIDIwMTQgQ2hyaXN0b3BoZSBHaXNxdWV0Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislbWFjcm8gSU5UMTZfTE9PUCAyIDsgJTEgPSBhL3UgKGFsaWduZWQvdW5hbGlnbmVkKSwgJTIgPSBhZGQvc3ViCisgICAgbW92ZCAgICB4bTQsIG1hc2tkCisgICAgU1BMQVRXICBtNCwgeG00CisgICAgYWRkICAgICB3ZCwgd2QKKyAgICB0ZXN0ICAgIHdxLCAyKm1tc2l6ZSAtIDEKKyAgICBqeiAlJS50b21haW5sb29wCisgICAgcHVzaCAgdG1wcQorJSUud29yZGxvb3A6CisgICAgc3ViICAgICB3cSwgMgorJWlmaWRuICUyLCBhZGQKKyAgICBtb3YgICB0bXB3LCBbc3JjcSt3cV0KKyAgICBhZGQgICB0bXB3LCBbZHN0cSt3cV0KKyVlbHNlCisgICAgbW92ICAgdG1wdywgW3NyYzFxK3dxXQorICAgIHN1YiAgIHRtcHcsIFtzcmMycSt3cV0KKyVlbmRpZgorICAgIGFuZCAgIHRtcHcsIG1hc2t3CisgICAgbW92ICAgICBbZHN0cSt3cV0sIHRtcHcKKyAgICB0ZXN0ICAgIHdxLCAyKm1tc2l6ZSAtIDEKKyAgICBqbnogJSUud29yZGxvb3AKKyAgICBwb3AgICB0bXBxCislJS50b21haW5sb29wOgorJWlmaWRuICUyLCBhZGQKKyAgICBhZGQgICAgIHNyY3EsIHdxCislZWxzZQorICAgIGFkZCAgICAgc3JjMXEsIHdxCisgICAgYWRkICAgICBzcmMycSwgd3EKKyVlbmRpZgorICAgIGFkZCAgICAgZHN0cSwgd3EKKyAgICBuZWcgICAgIHdxCisgICAganogICAgICAlJS5lbmQKKyUlLmxvb3A6CislaWZpZG4gJTIsIGFkZAorICAgIG1vdiUxICAgbTAsIFtzcmNxK3dxXQorICAgIG1vdiUxICAgbTEsIFtkc3RxK3dxXQorICAgIG1vdiUxICAgbTIsIFtzcmNxK3dxK21tc2l6ZV0KKyAgICBtb3YlMSAgIG0zLCBbZHN0cSt3cSttbXNpemVdCislZWxzZQorICAgIG1vdiUxICAgbTAsIFtzcmMxcSt3cV0KKyAgICBtb3YlMSAgIG0xLCBbc3JjMnErd3FdCisgICAgbW92JTEgICBtMiwgW3NyYzFxK3dxK21tc2l6ZV0KKyAgICBtb3YlMSAgIG0zLCBbc3JjMnErd3ErbW1zaXplXQorJWVuZGlmCisgICAgcCUydyAgICBtMCwgbTEKKyAgICBwJTJ3ICAgIG0yLCBtMworICAgIHBhbmQgICAgbTAsIG00CisgICAgcGFuZCAgICBtMiwgbTQKKyAgICBtb3YlMSAgIFtkc3RxK3dxXSAgICAgICAsIG0wCisgICAgbW92JTEgICBbZHN0cSt3cSttbXNpemVdLCBtMgorICAgIGFkZCAgICAgd3EsIDIqbW1zaXplCisgICAgamwgJSUubG9vcAorJSUuZW5kOgorICAgIFJFVAorJWVuZG1hY3JvCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZW5jZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L2h1ZmZ5dXZlbmNkc3AuYXNtCmluZGV4IGE1NWExZGUuLmQ5OTRmZDAgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2h1ZmZ5dXZlbmNkc3AuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2h1ZmZ5dXZlbmNkc3AuYXNtCkBAIC0yNSwxMjYgKzI1LDgxIEBACiAKICVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgogCi1zZWN0aW9uIC50ZXh0CitTRUNUSU9OIC50ZXh0CiAKLTsgdm9pZCBmZl9kaWZmX2J5dGVzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKLTsgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcpOwotJW1hY3JvIERJRkZfQllURVNfUFJPTE9HVUUgMAotJWlmIEFSQ0hfWDg2XzMyCi1jZ2xvYmFsIGRpZmZfYnl0ZXMsIDMsNSwyLCBkc3QsIHNyYzEsIHNyYzIKLSVkZWZpbmUgd3EgcjRxCi0gICAgREVDTEFSRV9SRUdfVE1QIDMKLSAgICBtb3YgICAgICAgICAgICAgICB3cSwgcjNtcAotJWVsc2UKLWNnbG9iYWwgZGlmZl9ieXRlcywgNCw1LDIsIGRzdCwgc3JjMSwgc3JjMiwgdwotICAgIERFQ0xBUkVfUkVHX1RNUCA0Ci0lZW5kaWYgOyBBUkNIX1g4Nl8zMgotJWRlZmluZSBpIHQwcQotJWVuZG1hY3JvCislaW5jbHVkZSAibGliYXZjb2RlYy94ODYvaHVmZnl1dmRzcF90ZW1wbGF0ZS5hc20iCiAKLTsgbGFiZWwgdG8ganVtcCB0byBpZiB3IDwgcmVnc2l6ZQotJW1hY3JvIERJRkZfQllURVNfTE9PUF9QUkVQIDEKLSAgICBtb3YgICAgICAgICAgICAgICAgaSwgd3EKLSAgICBhbmQgICAgICAgICAgICAgICAgaSwgLTIgKiByZWdzaXplCi0gICAgICAgIGp6ICAgICAgICAgICAgJTEKLSAgICBhZGQgICAgICAgICAgICAgZHN0cSwgaQotICAgIGFkZCAgICAgICAgICAgIHNyYzFxLCBpCi0gICAgYWRkICAgICAgICAgICAgc3JjMnEsIGkKLSAgICBuZWcgICAgICAgICAgICAgICAgaQotJWVuZG1hY3JvCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfZGlmZl9pbnQxNih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCis7ICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXNrLCBpbnQgdyk7Cis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLTsgbW92IHR5cGUgdXNlZCBmb3Igc3JjMXEsIGRzdHEsIGZpcnN0IHJlZywgc2Vjb25kIHJlZwotJW1hY3JvIERJRkZfQllURVNfTE9PUF9DT1JFIDQKLSVpZiBtbXNpemUgIT0gMTYKLSAgICBtb3YlMSAgICAgICAgICAgICAlMywgW3NyYzFxICsgaV0KLSAgICBtb3YlMSAgICAgICAgICAgICAlNCwgW3NyYzFxICsgaSArIHJlZ3NpemVdCi0gICAgcHN1YmIgICAgICAgICAgICAgJTMsIFtzcmMycSArIGldCi0gICAgcHN1YmIgICAgICAgICAgICAgJTQsIFtzcmMycSArIGkgKyByZWdzaXplXQotICAgIG1vdiUyICAgICAgICAgICBbZHN0cSArIGldLCAlMwotICAgIG1vdiUyIFtyZWdzaXplICsgZHN0cSArIGldLCAlNAotJWVsc2UKLSAgICA7IFNTRSBlbmZvcmNlcyBhbGlnbm1lbnQgb2YgcHN1YmIgb3BlcmFuZAotICAgIG1vdiUxICAgICAgICAgICAgICUzLCBbc3JjMXEgKyBpXQotICAgIG1vdnUgICAgICAgICAgICAgICU0LCBbc3JjMnEgKyBpXQotICAgIHBzdWJiICAgICAgICAgICAgICUzLCAlNAotICAgIG1vdiUyICAgICBbZHN0cSArIGldLCAlMwotICAgIG1vdiUxICAgICAgICAgICAgICUzLCBbc3JjMXEgKyBpICsgcmVnc2l6ZV0KLSAgICBtb3Z1ICAgICAgICAgICAgICAlNCwgW3NyYzJxICsgaSArIHJlZ3NpemVdCi0gICAgcHN1YmIgICAgICAgICAgICAgJTMsICU0Ci0gICAgbW92JTIgW3JlZ3NpemUgKyBkc3RxICsgaV0sICUzCislbWFjcm8gRElGRl9JTlQxNiAwCitjZ2xvYmFsIGRpZmZfaW50MTYsIDUsNSw1LCBkc3QsIHNyYzEsIHNyYzIsIG1hc2ssIHcsIHRtcAorJWlmIG1tc2l6ZSA+IDgKKyAgICB0ZXN0IHNyYzFxLCBtbXNpemUtMQorICAgIGpueiAudW5hbGlnbmVkCisgICAgdGVzdCBzcmMycSwgbW1zaXplLTEKKyAgICBqbnogLnVuYWxpZ25lZAorICAgIHRlc3QgZHN0cSwgbW1zaXplLTEKKyAgICBqbnogLnVuYWxpZ25lZAogJWVuZGlmCi0lZW5kbWFjcm8KLQotJW1hY3JvIERJRkZfQllURVNfQk9EWSAyIDsgbW92IHR5cGUgdXNlZCBmb3Igc3JjMXEsIGZvciBkc3RxCi0gICAgJWRlZmluZSByZWdzaXplIG1tc2l6ZQotLmxvb3BfJTElMjoKLSAgICBESUZGX0JZVEVTX0xPT1BfQ09SRSAlMSwgJTIsIG0wLCBtMQotICAgIGFkZCAgICAgICAgICAgICAgICBpLCAyICogcmVnc2l6ZQotICAgICAgICBqbCAgICAubG9vcF8lMSUyCi0uc2tpcF9tYWluXyUxJTI6Ci0gICAgYW5kICAgICAgICAgICAgICAgd3EsIDIgKiByZWdzaXplIC0gMQotICAgICAgICBqeiAgICAgLmVuZF8lMSUyCi0laWYgbW1zaXplID4gMTYKLSAgICA7IGZhbGwgYmFjayB0byBuYXJyb3dlciB4bW0KLSAgICAlZGVmaW5lIHJlZ3NpemUgbW1zaXplIC8gMgotICAgIERJRkZfQllURVNfTE9PUF9QUkVQIC5zZXR1cF9sb29wX2dwcl9hYQotLmxvb3AyXyUxJTI6Ci0gICAgRElGRl9CWVRFU19MT09QX0NPUkUgJTEsICUyLCB4bTAsIHhtMQotICAgIGFkZCAgICAgICAgICAgICAgICBpLCAyICogcmVnc2l6ZQotICAgICAgICBqbCAgIC5sb29wMl8lMSUyCi0uc2V0dXBfbG9vcF9ncHJfJTElMjoKLSAgICBhbmQgICAgICAgICAgICAgICB3cSwgMiAqIHJlZ3NpemUgLSAxCi0gICAgICAgIGp6ICAgICAuZW5kXyUxJTIKKyAgICBJTlQxNl9MT09QIGEsIHN1YgorJWlmIG1tc2l6ZSA+IDgKKy51bmFsaWduZWQ6CisgICAgSU5UMTZfTE9PUCB1LCBzdWIKICVlbmRpZgotICAgIGFkZCAgICAgICAgICAgICBkc3RxLCB3cQotICAgIGFkZCAgICAgICAgICAgIHNyYzFxLCB3cQotICAgIGFkZCAgICAgICAgICAgIHNyYzJxLCB3cQotICAgIG5lZyAgICAgICAgICAgICAgIHdxCi0ubG9vcF9ncHJfJTElMjoKLSAgICBtb3YgICAgICAgICAgICAgIHQwYiwgW3NyYzFxICsgd3FdCi0gICAgc3ViICAgICAgICAgICAgICB0MGIsIFtzcmMycSArIHdxXQotICAgIG1vdiAgICAgIFtkc3RxICsgd3FdLCB0MGIKLSAgICBpbmMgICAgICAgICAgICAgICB3cQotICAgICAgICBqbCAubG9vcF9ncHJfJTElMgotLmVuZF8lMSUyOgotICAgIFJFUF9SRVQKICVlbmRtYWNybwogCiAlaWYgQVJDSF9YODZfMzIKIElOSVRfTU1YIG1teAotRElGRl9CWVRFU19QUk9MT0dVRQotICAgICVkZWZpbmUgcmVnc2l6ZSBtbXNpemUKLSAgICBESUZGX0JZVEVTX0xPT1BfUFJFUCAuc2tpcF9tYWluX2FhCi0gICAgRElGRl9CWVRFU19CT0RZICAgIGEsIGEKLSV1bmRlZiBpCitESUZGX0lOVDE2CiAlZW5kaWYKIAogSU5JVF9YTU0gc3NlMgotRElGRl9CWVRFU19QUk9MT0dVRQotICAgICVkZWZpbmUgcmVnc2l6ZSBtbXNpemUKLSAgICBESUZGX0JZVEVTX0xPT1BfUFJFUCAuc2tpcF9tYWluX2FhCi0gICAgdGVzdCAgICAgICAgICAgIGRzdHEsIHJlZ3NpemUgLSAxCi0gICAgICAgIGpueiAgICAgLmxvb3BfdXUKLSAgICB0ZXN0ICAgICAgICAgICBzcmMxcSwgcmVnc2l6ZSAtIDEKLSAgICAgICAgam56ICAgICAubG9vcF91YQotICAgIERJRkZfQllURVNfQk9EWSAgICBhLCBhCi0gICAgRElGRl9CWVRFU19CT0RZICAgIHUsIGEKLSAgICBESUZGX0JZVEVTX0JPRFkgICAgdSwgdQotJXVuZGVmIGkKK0RJRkZfSU5UMTYKIAogJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAogSU5JVF9ZTU0gYXZ4MgotRElGRl9CWVRFU19QUk9MT0dVRQotICAgICVkZWZpbmUgcmVnc2l6ZSBtbXNpemUKLSAgICA7IERpcmVjdGx5IHVzaW5nIHVuYWxpZ25lZCBTU0UyIHZlcnNpb24gaXMgbWFyZ2luYWxseSBmYXN0ZXIgdGhhbgotICAgIDsgYnJhbmNoaW5nIGJhc2VkIG9uIGFyZ3VtZW50cy4KLSAgICBESUZGX0JZVEVTX0xPT1BfUFJFUCAuc2tpcF9tYWluX3V1Ci0gICAgdGVzdCAgICAgICAgICAgIGRzdHEsIHJlZ3NpemUgLSAxCi0gICAgICAgIGpueiAgICAgLmxvb3BfdXUKLSAgICB0ZXN0ICAgICAgICAgICBzcmMxcSwgcmVnc2l6ZSAtIDEKLSAgICAgICAgam56ICAgICAubG9vcF91YQotICAgIERJRkZfQllURVNfQk9EWSAgICBhLCBhCi0gICAgRElGRl9CWVRFU19CT0RZICAgIHUsIGEKLSAgICBESUZGX0JZVEVTX0JPRFkgICAgdSwgdQotJXVuZGVmIGkKK0RJRkZfSU5UMTYKICVlbmRpZgorCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYsIDcsNywwLCBkc3QsIHNyYzEsIHNyYzIsIG1hc2ssIHcsIGxlZnQsIGxlZnRfdG9wCisgICAgYWRkICAgICAgd2QsIHdkCisgICAgbW92ZCAgICBtbTcsIG1hc2tkCisgICAgU1BMQVRXICBtbTcsIG1tNworICAgIG1vdnEgICAgbW0wLCBbc3JjMXFdCisgICAgbW92cSAgICBtbTIsIFtzcmMycV0KKyAgICBwc2xscSAgIG1tMCwgMTYKKyAgICBwc2xscSAgIG1tMiwgMTYKKyAgICBtb3ZkICAgIG1tNiwgW2xlZnRfdG9wcV0KKyAgICBwb3IgICAgIG1tMCwgbW02CisgICAgbW92ZCAgICBtbTYsIFtsZWZ0cV0KKyAgICBwb3IgICAgIG1tMiwgbW02CisgICAgeG9yICAgICBtYXNrcSwgbWFza3EKKy5sb29wOgorICAgIG1vdnEgICAgbW0xLCBbc3JjMXEgKyBtYXNrcV0KKyAgICBtb3ZxICAgIG1tMywgW3NyYzJxICsgbWFza3FdCisgICAgbW92cSAgICBtbTQsIG1tMgorICAgIHBzdWJ3ICAgbW0yLCBtbTAKKyAgICBwYWRkdyAgIG1tMiwgbW0xCisgICAgcGFuZCAgICBtbTIsIG1tNworICAgIG1vdnEgICAgbW01LCBtbTQKKyAgICBwbWF4c3cgIG1tNCwgbW0xCisgICAgcG1pbnN3ICBtbTEsIG1tNQorICAgIHBtaW5zdyAgbW00LCBtbTIKKyAgICBwbWF4c3cgIG1tNCwgbW0xCisgICAgcHN1YncgICBtbTMsIG1tNAorICAgIHBhbmQgICAgbW0zLCBtbTcKKyAgICBtb3ZxICAgIFtkc3RxICsgbWFza3FdLCBtbTMKKyAgICBhZGQgICAgIG1hc2txLCA4CisgICAgbW92cSAgICBtbTAsIFtzcmMxcSArIG1hc2txIC0gMl0KKyAgICBtb3ZxICAgIG1tMiwgW3NyYzJxICsgbWFza3EgLSAyXQorICAgIGNtcCAgICAgbWFza3EsIHdxCisgICAgICAgIGpiIC5sb29wCisgICAgbW92enggbWFza2QsIHdvcmQgW3NyYzFxICsgd3EgLSAyXQorICAgIG1vdiBbbGVmdF90b3BxXSwgbWFza2QKKyAgICBtb3Z6eCBtYXNrZCwgd29yZCBbc3JjMnEgKyB3cSAtIDJdCisgICAgbW92IFtsZWZ0cV0sIG1hc2tkCisgICAgUkVUCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZW5jZHNwX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L2h1ZmZ5dXZlbmNkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNmUwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni9odWZmeXV2ZW5jZHNwX2luaXQuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogU0lNRC1vcHRpbWl6ZWQgSHVmZllVViBlbmNvZGluZyBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogTU1YIG9wdGltaXphdGlvbiBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaHVmZnl1dmVuY2RzcC5oIgorCit2b2lkIGZmX2RpZmZfaW50MTZfbW14ICh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXNrLCBpbnQgdyk7Cit2b2lkIGZmX2RpZmZfaW50MTZfc3NlMih1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXNrLCBpbnQgdyk7Cit2b2lkIGZmX2RpZmZfaW50MTZfYXZ4Mih1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXNrLCBpbnQgdyk7Cit2b2lkIGZmX3N1Yl9oZnl1X21lZGlhbl9wcmVkX2ludDE2X21teGV4dCh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXNrLCBpbnQgdywgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKKworYXZfY29sZCB2b2lkIGZmX2h1ZmZ5dXZlbmNkc3BfaW5pdF94ODYoSHVmZllVVkVuY0RTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBhdl91bnVzZWQgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CisKKyAgICBpZiAoQVJDSF9YODZfMzIgJiYgRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+ZGlmZl9pbnQxNiA9IGZmX2RpZmZfaW50MTZfbW14OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSAmJiBwaXhfZGVzYyAmJiBwaXhfZGVzYy0+Y29tcFswXS5kZXB0aDwxNikgeworICAgICAgICBjLT5zdWJfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNiA9IGZmX3N1Yl9oZnl1X21lZGlhbl9wcmVkX2ludDE2X21teGV4dDsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmRpZmZfaW50MTYgPSBmZl9kaWZmX2ludDE2X3NzZTI7CisgICAgfQorCisgICAgaWYgKEVYVEVSTkFMX0FWWDJfRkFTVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmRpZmZfaW50MTYgPSBmZl9kaWZmX2ludDE2X2F2eDI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaHVmZnl1dmVuY2RzcF9tbXguYyBiL2xpYmF2Y29kZWMveDg2L2h1ZmZ5dXZlbmNkc3BfbW14LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NjdiMjEuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy94ODYvaHVmZnl1dmVuY2RzcF9tbXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKgotICogU0lNRC1vcHRpbWl6ZWQgSHVmZllVViBlbmNvZGluZyBmdW5jdGlvbnMKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Ci0gKgotICogTU1YIG9wdGltaXphdGlvbiBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgotI2luY2x1ZGUgImxpYmF2Y29kZWMvaHVmZnl1dmVuY2RzcC5oIgotI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgotCi12b2lkIGZmX2RpZmZfYnl0ZXNfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgdyk7Ci12b2lkIGZmX2RpZmZfYnl0ZXNfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3KTsKLXZvaWQgZmZfZGlmZl9ieXRlc19hdngyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcpOwotCi0jaWYgSEFWRV9JTkxJTkVfQVNNCi0KLXN0YXRpYyB2b2lkIHN1Yl9oZnl1X21lZGlhbl9wcmVkX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50cHRyX3QgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCi17Ci0gICAgeDg2X3JlZyBpID0gMDsKLSAgICB1aW50OF90IGwsIGx0OwotCi0gICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJtb3ZxICAoJTEsICUwKSwgJSVtbTAgICAgICAgICAgXG5cdCIgLy8gTFQKLSAgICAgICAgInBzbGxxICQ4LCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAoJTEsICUwKSwgJSVtbTEgICAgICAgICAgXG5cdCIgLy8gVAotICAgICAgICAibW92cSAgLTEoJTIsICUwKSwgJSVtbTIgICAgICAgIFxuXHQiIC8vIEwKLSAgICAgICAgIm1vdnEgICglMiwgJTApLCAlJW1tMyAgICAgICAgICBcblx0IiAvLyBYCi0gICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLy8gTAotICAgICAgICAicHN1YmIgJSVtbTAsICUlbW0yICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwYWRkYiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLy8gTCArIFQgLSBMVAotICAgICAgICAibW92cSAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8vIEwKLSAgICAgICAgInBtYXh1YiAlJW1tMSwgJSVtbTQgICAgICAgICAgICBcblx0IiAvLyBtYXgoVCwgTCkKLSAgICAgICAgInBtaW51YiAlJW1tNSwgJSVtbTEgICAgICAgICAgICBcblx0IiAvLyBtaW4oVCwgTCkKLSAgICAgICAgInBtaW51YiAlJW1tMiwgJSVtbTQgICAgICAgICAgICBcblx0IgotICAgICAgICAicG1heHViICUlbW0xLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJwc3ViYiAlJW1tNCwgJSVtbTMgICAgICAgICAgICAgXG5cdCIgLy8gZHN0IC0gcHJlZAotICAgICAgICAibW92cSAlJW1tMywgKCUzLCAlMCkgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGQgJDgsICUwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgLTEoJTEsICUwKSwgJSVtbTAgICAgICAgICBcblx0IiAvLyBMVAotICAgICAgICAiY21wICU0LCAlMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICIgamIgMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgOiAiK3IiIChpKQotICAgICAgICA6ICJyIiAoc3JjMSksICJyIiAoc3JjMiksICJyIiAoZHN0KSwgInIiICgoeDg2X3JlZykgdykpOwotCi0gICAgbCAgPSAqbGVmdDsKLSAgICBsdCA9ICpsZWZ0X3RvcDsKLQotICAgIGRzdFswXSA9IHNyYzJbMF0gLSBtaWRfcHJlZChsLCBzcmMxWzBdLCAobCArIHNyYzFbMF0gLSBsdCkgJiAweEZGKTsKLQotICAgICpsZWZ0X3RvcCA9IHNyYzFbdyAtIDFdOwotICAgICpsZWZ0ICAgICA9IHNyYzJbdyAtIDFdOwotfQotCi0jZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCi0KLWF2X2NvbGQgdm9pZCBmZl9odWZmeXV2ZW5jZHNwX2luaXRfeDg2KEh1ZmZZVVZFbmNEU1BDb250ZXh0ICpjKQotewotICAgIGF2X3VudXNlZCBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwotCi0gICAgaWYgKEFSQ0hfWDg2XzMyICYmIEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIGMtPmRpZmZfYnl0ZXMgPSBmZl9kaWZmX2J5dGVzX21teDsKLSAgICB9Ci0KLSNpZiBIQVZFX0lOTElORV9BU00KLSAgICBpZiAoSU5MSU5FX01NWEVYVChjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIGMtPnN1Yl9oZnl1X21lZGlhbl9wcmVkID0gc3ViX2hmeXVfbWVkaWFuX3ByZWRfbW14ZXh0OwotICAgIH0KLSNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KLQotICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKLSAgICAgICAgYy0+ZGlmZl9ieXRlcyA9IGZmX2RpZmZfYnl0ZXNfc3NlMjsKLSAgICB9Ci0KLSAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKLSAgICAgICAgYy0+ZGlmZl9ieXRlcyA9IGZmX2RpZmZfYnl0ZXNfYXZ4MjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwLmggYi9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwLmgKaW5kZXggZGFhNGU3OS4uMGQwYmRiNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvaWRjdGRzcC5oCisrKyBiL2xpYmF2Y29kZWMveDg2L2lkY3Rkc3AuaApAQCAtMTksOCArMTksOCBAQAogI2lmbmRlZiBBVkNPREVDX1g4Nl9JRENURFNQX0gKICNkZWZpbmUgQVZDT0RFQ19YODZfSURDVERTUF9ICiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogdm9pZCBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfbW14KGNvbnN0IGludDE2X3QgKmJsb2NrLCB1aW50OF90ICpwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CkBAIC0zNSw0ICszNSw1IEBACiB2b2lkIGZmX3B1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWRfc3NlMihjb25zdCBpbnQxNl90ICpibG9jaywgdWludDhfdCAqcGl4ZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVfc2l6ZSk7CiAKKwogI2VuZGlmIC8qIEFWQ09ERUNfWDg2X0lEQ1REU1BfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaWRjdGRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwX2luaXQuYwppbmRleCBiY2Y3ZTViLi45MTAzYjkyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9pZGN0ZHNwX2luaXQuYwpAQCAtNjMsNDcgKzYzLDgzIEBACiB7CiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKIAotICAgIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpIHsKKyAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCA9IGZmX3B1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWRfbW14OworICAgICAgICBjLT5wdXRfcGl4ZWxzX2NsYW1wZWQgICAgICAgID0gZmZfcHV0X3BpeGVsc19jbGFtcGVkX21teDsKKyAgICAgICAgYy0+YWRkX3BpeGVsc19jbGFtcGVkICAgICAgICA9IGZmX2FkZF9waXhlbHNfY2xhbXBlZF9tbXg7CisKICAgICAgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCAmJgogICAgICAgICAgICAgYXZjdHgtPmxvd3JlcyA9PSAwICYmCiAgICAgICAgICAgICAoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8gfHwKLSAgICAgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFQVVUTyB8fAotICAgICAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9TSU1QTEVNTVgpKSB7CisgICAgICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRUFVVE8gfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFTU1YKSkgewogICAgICAgICAgICAgICAgIGMtPmlkY3RfcHV0ICA9IGZmX3NpbXBsZV9pZGN0X3B1dF9tbXg7CiAgICAgICAgICAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfc2ltcGxlX2lkY3RfYWRkX21teDsKICAgICAgICAgICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl9zaW1wbGVfaWRjdF9tbXg7CiAgICAgICAgICAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX1NJTVBMRTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKLSAgICAgICAgYy0+cHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZCA9IGZmX3B1dF9zaWduZWRfcGl4ZWxzX2NsYW1wZWRfbW14OwotICAgICAgICBjLT5wdXRfcGl4ZWxzX2NsYW1wZWQgICAgICAgID0gZmZfcHV0X3BpeGVsc19jbGFtcGVkX21teDsKLSAgICAgICAgYy0+YWRkX3BpeGVsc19jbGFtcGVkICAgICAgICA9IGZmX2FkZF9waXhlbHNfY2xhbXBlZF9tbXg7Ci0gICAgfQorCiAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgewogICAgICAgICBjLT5wdXRfc2lnbmVkX3BpeGVsc19jbGFtcGVkID0gZmZfcHV0X3NpZ25lZF9waXhlbHNfY2xhbXBlZF9zc2UyOwogICAgICAgICBjLT5wdXRfcGl4ZWxzX2NsYW1wZWQgICAgICAgID0gZmZfcHV0X3BpeGVsc19jbGFtcGVkX3NzZTI7CiAgICAgICAgIGMtPmFkZF9waXhlbHNfY2xhbXBlZCAgICAgICAgPSBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfc3NlMjsKKworICAgICAgICBpZiAoIWhpZ2hfYml0X2RlcHRoICYmCisgICAgICAgICAgICBhdmN0eC0+bG93cmVzID09IDAgJiYKKyAgICAgICAgICAgIChhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfQVVUTyB8fAorICAgICAgICAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9TSU1QTEVBVVRPIHx8CisgICAgICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRU1NWCkpIHsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9zaW1wbGVfaWRjdF9wdXRfc3NlMjsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X2FkZCAgPSBmZl9zaW1wbGVfaWRjdF9hZGRfc3NlMjsKKyAgICAgICAgICAgICAgICBjLT5wZXJtX3R5cGUgPSBGRl9JRENUX1BFUk1fU0lNUExFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFSQ0hfWDg2XzY0ICYmCisgICAgICAgICAgICAhaGlnaF9iaXRfZGVwdGggJiYKKyAgICAgICAgICAgIGF2Y3R4LT5sb3dyZXMgPT0gMCAmJgorICAgICAgICAgICAgKGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9BVVRPIHx8CisgICAgICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRUFVVE8gfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFTU1YIHx8CisgICAgICAgICAgICAgICAgYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX1NJTVBMRSkpIHsKKyAgICAgICAgICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl9zaW1wbGVfaWRjdDhfc3NlMjsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9zaW1wbGVfaWRjdDhfcHV0X3NzZTI7CisgICAgICAgICAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfc2ltcGxlX2lkY3Q4X2FkZF9zc2UyOworICAgICAgICAgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0U7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoQVJDSF9YODZfNjQgJiYgYXZjdHgtPmxvd3JlcyA9PSAwKSB7Ci0gICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMCAmJgotICAgICAgICAoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8gfHwKLSAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9TSU1QTEVBVVRPIHx8Ci0gICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFKSkgewotICAgICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7Ci0gICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9zaW1wbGVfaWRjdDEwX3B1dF9zc2UyOwotICAgICAgICAgICAgYy0+aWRjdF9hZGQgID0gTlVMTDsKLSAgICAgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX3NpbXBsZV9pZGN0MTBfc3NlMjsKLSAgICAgICAgICAgIGMtPnBlcm1fdHlwZSA9IEZGX0lEQ1RfUEVSTV9UUkFOU1BPU0U7CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSAmJgorICAgICAgICAgICAgIWhpZ2hfYml0X2RlcHRoICYmCisgICAgICAgICAgICAoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8gfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFQVVUTyB8fAorICAgICAgICAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9TSU1QTEVNTVggfHwKKyAgICAgICAgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFKSkgeworICAgICAgICAgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX3NpbXBsZV9pZGN0OF9hdng7CisgICAgICAgICAgICAgICAgYy0+aWRjdF9wdXQgID0gZmZfc2ltcGxlX2lkY3Q4X3B1dF9hdng7CisgICAgICAgICAgICAgICAgYy0+aWRjdF9hZGQgID0gZmZfc2ltcGxlX2lkY3Q4X2FkZF9hdng7CisgICAgICAgICAgICAgICAgYy0+cGVybV90eXBlID0gRkZfSURDVF9QRVJNX1RSQU5TUE9TRTsKKyAgICAgICAgfQogCi0gICAgICAgIH0KLSAgICAgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKSB7Ci0gICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9zaW1wbGVfaWRjdDEwX3B1dF9hdng7Ci0gICAgICAgICAgICBjLT5pZGN0X2FkZCAgPSBOVUxMOwotICAgICAgICAgICAgYy0+aWRjdCAgICAgID0gZmZfc2ltcGxlX2lkY3QxMF9hdng7Ci0gICAgICAgICAgICBjLT5wZXJtX3R5cGUgPSBGRl9JRENUX1BFUk1fVFJBTlNQT1NFOwotICAgICAgICB9CisgICAgICAgIGlmIChhdmN0eC0+Yml0c19wZXJfcmF3X3NhbXBsZSA9PSAxMCAmJgorICAgICAgICAgICAgYXZjdHgtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QRUc0ICYmCisgICAgICAgICAgICAoYXZjdHgtPmlkY3RfYWxnbyA9PSBGRl9JRENUX0FVVE8gfHwKKyAgICAgICAgICAgICBhdmN0eC0+aWRjdF9hbGdvID09IEZGX0lEQ1RfU0lNUExFQVVUTyB8fAorICAgICAgICAgICAgIGF2Y3R4LT5pZGN0X2FsZ28gPT0gRkZfSURDVF9TSU1QTEUpKSB7CisgICAgICAgICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgYy0+aWRjdF9wdXQgID0gZmZfc2ltcGxlX2lkY3QxMF9wdXRfc3NlMjsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X2FkZCAgPSBOVUxMOworICAgICAgICAgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX3NpbXBsZV9pZGN0MTBfc3NlMjsKKyAgICAgICAgICAgICAgICBjLT5wZXJtX3R5cGUgPSBGRl9JRENUX1BFUk1fVFJBTlNQT1NFOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgICAgICBjLT5pZGN0X3B1dCAgPSBmZl9zaW1wbGVfaWRjdDEwX3B1dF9hdng7CisgICAgICAgICAgICAgICAgYy0+aWRjdF9hZGQgID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjLT5pZGN0ICAgICAgPSBmZl9zaW1wbGVfaWRjdDEwX2F2eDsKKyAgICAgICAgICAgICAgICBjLT5wZXJtX3R5cGUgPSBGRl9JRENUX1BFUk1fVFJBTlNQT1NFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGF2Y3R4LT5iaXRzX3Blcl9yYXdfc2FtcGxlID09IDEyICYmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9pbWRjdDM2LmFzbSBiL2xpYmF2Y29kZWMveDg2L2ltZGN0MzYuYXNtCmluZGV4IDQwOWIyYzUuLmIzODZhYjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2ltZGN0MzYuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2ltZGN0MzYuYXNtCkBAIC0yMyw3ICsyMyw2IEBACiAKIFNFQ1RJT05fUk9EQVRBCiAKLWFsaWduIDE2CiBwc19tYXNrOiAgZGQgMCwgfjAsIH4wLCB+MAogcHNfbWFzazI6IGRkIDAsIH4wLCAgMCwgfjAKIHBzX21hc2szOiBkZCAwLCAgMCwgIDAsIH4wCkBAIC0xNDUsOSArMTQ0LDkgQEAKICVtYWNybyBTVE9SRSA0CiAlaWYgY3B1ZmxhZyhzc2U0KQogICAgIG1vdnNzICAgICBbJTMgICAgICAgXSwgJTEKLSAgICBleHRyYWN0cHMgWyUzICsgICAlNF0sICUxLCAxCi0gICAgZXh0cmFjdHBzIFslMyArIDIqJTRdLCAlMSwgMgotICAgIGV4dHJhY3RwcyBbJTMgKyAzKiU0XSwgJTEsIDMKKyAgICBleHRyYWN0cHMgZHdvcmQgWyUzICsgICAlNF0sICUxLCAxCisgICAgZXh0cmFjdHBzIGR3b3JkIFslMyArIDIqJTRdLCAlMSwgMgorICAgIGV4dHJhY3RwcyBkd29yZCBbJTMgKyAzKiU0XSwgJTEsIDMKICVlbHNlCiAgICAgbW92aGxwcyAlMiwgJTEKICAgICBtb3ZzcyAgIFslMyAgICAgICBdLCAlMQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvaW5saW5lX2FzbS5oIGIvbGliYXZjb2RlYy94ODYvaW5saW5lX2FzbS5oCmluZGV4IDNlNjVhNzYuLjAxOTg3NDYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2lubGluZV9hc20uaAorKysgYi9saWJhdmNvZGVjL3g4Ni9pbmxpbmVfYXNtLmgKQEAgLTUwLDcgKzUwLDcgQEAKICNlbmRpZgogCiAvLyB1c2luZyByZWdyIGFzIHRlbXBvcmFyeSBhbmQgZm9yIHRoZSBvdXRwdXQgcmVzdWx0Ci0vLyBmaXJzdCBhcmd1bWVudCBpcyB1bm1vZGlmZWQgYW5kIHNlY29uZCBpcyB0cmFzaGVkCisvLyBmaXJzdCBhcmd1bWVudCBpcyB1bm1vZGlmaWVkIGFuZCBzZWNvbmQgaXMgdHJhc2hlZAogLy8gcmVnZmUgaXMgc3VwcG9zZWQgdG8gY29udGFpbiAweGZlZmVmZWZlZmVmZWZlZmUKICNkZWZpbmUgUEFWR0JfTU1YX05PX1JORChyZWdhLCByZWdiLCByZWdyLCByZWdmZSkgICAgICAgICAgICAgICAgXAogICAgICJtb3ZxICAgIiNyZWdhIiwgIiNyZWdyIiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9qcGVnMjAwMGRzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni9qcGVnMjAwMGRzcC5hc20KaW5kZXggNTZiNWZiZC4uNjFkZmRkNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvanBlZzIwMDBkc3AuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L2pwZWcyMDAwZHNwLmFzbQpAQCAtNzQsNiArNzQsMTkgQEAKICAgICBtb3ZhcHMgICBtMSwgW3NyYzFxK2NzaXplcV0KICAgICBtb3ZhcHMgICBtMiwgW3NyYzJxK2NzaXplcV0KIAorJWlmIGNwdWZsYWcoZm1hNCkgfHwgY3B1ZmxhZyhmbWEzKQorJWlmIGNwdWZsYWcoZm1hNCkKKyAgICBmbm1hZGRwcyAgbTUsIG0xLCBJQ1QxLCBtMAorICAgIGZtYWRkcHMgICBtNCwgbTIsIElDVDAsIG0wCislZWxzZSA7IGZtYTMKKyAgICBtb3ZhcHMgICAgbTUsIG0xCisgICAgbW92YXBzICAgIG00LCBtMgorICAgIGZubWFkZHBzICBtNSwgbTUsIElDVDEsIG0wCisgICAgZm1hZGRwcyAgIG00LCBtNCwgSUNUMCwgbTAKKyVlbmRpZgorICAgIGZtYWRkcHMgICBtMCwgbTEsIElDVDMsIG0wCisgICAgZm5tYWRkcHMgIG01LCBtMiwgSUNUMiwgbTUKKyVlbHNlIDsgbm9uIEZNQQogJWlmIGNwdWZsYWcoYXZ4KQogICAgIG11bHBzICAgIG01LCBtMSwgSUNUMQogICAgIG11bHBzICAgIG00LCBtMiwgSUNUMApAQCAtOTMsNiArMTA2LDcgQEAKICAgICBhZGRwcyAgICBtNCwgbTQsIG0wCiAgICAgYWRkcHMgICAgbTAsIG0wLCBtMQogICAgIHN1YnBzICAgIG01LCBtNSwgbTIKKyVlbmRpZgogCiAgICAgbW92YXBzICAgW3NyYzBxK2NzaXplcV0sIG00CiAgICAgbW92YXBzICAgW3NyYzJxK2NzaXplcV0sIG0wCkBAIC0xMDYsNiArMTIwLDEyIEBACiBJQ1RfRkxPQVQgMTAKIElOSVRfWU1NIGF2eAogSUNUX0ZMT0FUIDkKKyVpZiBIQVZFX0ZNQTRfRVhURVJOQUwKK0lOSVRfWE1NIGZtYTQKK0lDVF9GTE9BVCA5CislZW5kaWYKK0lOSVRfWU1NIGZtYTMKK0lDVF9GTE9BVCA5CiAKIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIDsgZmZfcmN0X2ludF88b3B0PihpbnQzMl90ICpzcmMwLCBpbnQzMl90ICpzcmMxLCBpbnQzMl90ICpzcmMyLCBpbnQgY3NpemUpCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9qcGVnMjAwMGRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9qcGVnMjAwMGRzcF9pbml0LmMKaW5kZXggYmFhODEzOC4uNzMxMGExZCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvanBlZzIwMDBkc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L2pwZWcyMDAwZHNwX2luaXQuYwpAQCAtMjYsNiArMjYsOCBAQAogCiB2b2lkIGZmX2ljdF9mbG9hdF9zc2Uodm9pZCAqc3JjMCwgdm9pZCAqc3JjMSwgdm9pZCAqc3JjMiwgaW50IGNzaXplKTsKIHZvaWQgZmZfaWN0X2Zsb2F0X2F2eCh2b2lkICpzcmMwLCB2b2lkICpzcmMxLCB2b2lkICpzcmMyLCBpbnQgY3NpemUpOwordm9pZCBmZl9pY3RfZmxvYXRfZm1hMyh2b2lkICpzcmMwLCB2b2lkICpzcmMxLCB2b2lkICpzcmMyLCBpbnQgY3NpemUpOwordm9pZCBmZl9pY3RfZmxvYXRfZm1hNCh2b2lkICpzcmMwLCB2b2lkICpzcmMxLCB2b2lkICpzcmMyLCBpbnQgY3NpemUpOwogdm9pZCBmZl9yY3RfaW50X3NzZTIgKHZvaWQgKnNyYzAsIHZvaWQgKnNyYzEsIHZvaWQgKnNyYzIsIGludCBjc2l6ZSk7CiB2b2lkIGZmX3JjdF9pbnRfYXZ4MiAodm9pZCAqc3JjMCwgdm9pZCAqc3JjMSwgdm9pZCAqc3JjMiwgaW50IGNzaXplKTsKIApAQCAtNDQsNiArNDYsMTQgQEAKICAgICAgICAgYy0+bWN0X2RlY29kZVtGRl9EV1Q5N10gPSBmZl9pY3RfZmxvYXRfYXZ4OwogICAgIH0KIAorICAgIGlmIChFWFRFUk5BTF9GTUE0KGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+bWN0X2RlY29kZVtGRl9EV1Q5N10gPSBmZl9pY3RfZmxvYXRfZm1hNDsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfRk1BM19GQVNUKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+bWN0X2RlY29kZVtGRl9EV1Q5N10gPSBmZl9pY3RfZmxvYXRfZm1hMzsKKyAgICB9CisKICAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKICAgICAgICAgYy0+bWN0X2RlY29kZVtGRl9EV1Q1M10gPSBmZl9yY3RfaW50X2F2eDI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfYXVkaW9kc3AuYXNtIGIvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfYXVkaW9kc3AuYXNtCmluZGV4IDU1OTdkYWQuLjA2M2Q3YjQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX2F1ZGlvZHNwLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc19hdWRpb2RzcC5hc20KQEAgLTY4LDYgKzY4LDM5IEBACiBJTklUX1hNTSBzc2UyCiBTQ0FMQVJQUk9EVUNUCiAKK0lOSVRfWE1NIHNzZTQKKzsgaW50IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MzIoaW50MTZfdCAqdjEsIGludDMyX3QgKnYyLCBpbnQxNl90ICp2MywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yZGVyLCBpbnQgbXVsKQorY2dsb2JhbCBzY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDMyLCA0LDQsOCwgdjEsIHYyLCB2Mywgb3JkZXIsIG11bAorICAgIHNobCBvcmRlcnEsIDEKKyAgICBtb3ZkICAgIG03LCBtdWxtCisgICAgU1BMQVRXICBtNywgbTcKKyAgICBweG9yICAgIG02LCBtNgorICAgIGFkZCB2MXEsIG9yZGVycQorICAgIGxlYSB2MnEsIFt2MnEgKyAyKm9yZGVycV0KKyAgICBhZGQgdjNxLCBvcmRlcnEKKyAgICBuZWcgb3JkZXJxCisubG9vcDoKKyAgICBtb3ZhICAgIG0zLCBbdjFxICsgb3JkZXJxXQorICAgIG1vdnUgICAgbTAsIFt2MnEgKyAyKm9yZGVycV0KKyAgICBwbW92c3h3ZCBtNCwgbTMKKyAgICBtb3Z1ICAgIG0xLCBbdjJxICsgMipvcmRlcnEgKyBtbXNpemVdCisgICAgbW92aGxwcyBtNSwgbTMKKyAgICBtb3Z1ICAgIG0yLCBbdjNxICsgb3JkZXJxXQorICAgIHBtb3ZzeHdkIG01LCBtNQorICAgIHBtdWxsdyAgbTIsIG03CisgICAgcG11bGxkICBtMCwgbTQKKyAgICBwbXVsbGQgIG0xLCBtNQorICAgIHBhZGR3ICAgbTIsIG0zCisgICAgcGFkZGQgICBtNiwgbTAKKyAgICBwYWRkZCAgIG02LCBtMQorICAgIG1vdmEgICAgW3YxcSArIG9yZGVycV0sIG0yCisgICAgYWRkICAgICBvcmRlcnEsIDE2CisgICAgamwgLmxvb3AKKyAgICBIQURERCAgIG02LCBtMAorICAgIG1vdmQgICBlYXgsIG02CisgICAgUkVUCisKICVtYWNybyBTQ0FMQVJQUk9EVUNUX0xPT1AgMQogYWxpZ24gMTYKIC5sb29wJTE6CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc19hdWRpb2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc19hdWRpb2RzcF9pbml0LmMKaW5kZXggMTk3MTczYy4uZjc0YzdlNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfYXVkaW9kc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX2F1ZGlvZHNwX2luaXQuYwpAQCAtMzEsOSArMzEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXIsIGludCBtdWwpOwogCitpbnQzMl90IGZmX3NjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MzJfc3NlNChpbnQxNl90ICp2MSwgY29uc3QgaW50MzJfdCAqdjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp2MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmRlciwgaW50IG11bCk7CisKIGF2X2NvbGQgdm9pZCBmZl9sbGF1ZGRzcF9pbml0X3g4NihMTEF1ZERTUENvbnRleHQgKmMpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKQpAQCAtNDUsNSArNDksOCBAQAogICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpICYmCiAgICAgICAgICEoY3B1X2ZsYWdzICYgKEFWX0NQVV9GTEFHX1NTRTQyIHwgQVZfQ1BVX0ZMQUdfM0ROT1cpKSkgLy8gY2FjaGVzcGxpdAogICAgICAgICBjLT5zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDE2ID0gZmZfc2NhbGFycHJvZHVjdF9hbmRfbWFkZF9pbnQxNl9zc3NlMzsKKworICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykpCisgICAgICAgIGMtPnNjYWxhcnByb2R1Y3RfYW5kX21hZGRfaW50MzIgPSBmZl9zY2FsYXJwcm9kdWN0X2FuZF9tYWRkX2ludDMyX3NzZTQ7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX3ZpZGVvZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX3ZpZGVvZHNwLmFzbQppbmRleCBmMDZmY2RmLi4wYTFiNzA5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc192aWRlb2RzcC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfdmlkZW9kc3AuYXNtCkBAIC0yLDYgKzIsNyBAQAogOyogU0lNRCBsb3NzbGVzcyB2aWRlbyBEU1AgdXRpbHMKIDsqIENvcHlyaWdodCAoYykgMjAwOCBMb3JlbiBNZXJyaXR0CiA7KiBDb3B5cmlnaHQgKGMpIDIwMTQgTWljaGFlbCBOaWVkZXJtYXllcgorOyogQ29weXJpZ2h0IChjKSAyMDE3IEpva3lvIEltYWdlcwogOyoKIDsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KIDsqCkBAIC0yNCw5OCArMjUsMjMyIEBACiAKIFNFQ1RJT05fUk9EQVRBCiAKK2NleHRlcm4gcGJfMTUKK3BiX3p6enp6enp6Nzc3Nzc3Nzc6IHRpbWVzIDggZGIgLTEKK3BiXzc6IHRpbWVzIDggZGIgNwogcGJfZWY6IHRpbWVzIDggZGIgMTQsMTUKIHBiXzY3OiB0aW1lcyA4IGRiICA2LCA3CitwYl96enp6MzMzM3p6enpiYmJiOiBkYiAtMSwtMSwtMSwtMSwzLDMsMywzLC0xLC0xLC0xLC0xLDExLDExLDExLDExCitwYl96ejExeno1NXp6OTl6emRkOiBkYiAtMSwtMSwxLDEsLTEsLTEsNSw1LC0xLC0xLDksOSwtMSwtMSwxMywxMwogcGJfenp6ejIzMjN6enp6YWJhYjogZGIgLTEsLTEsLTEsLTEsIDIsIDMsIDIsIDMsLTEsLTEsLTEsLTEsMTAsMTEsMTAsMTEKIHBiX3p6enp6enp6Njc2NzY3Njc6IGRiIC0xLC0xLC0xLC0xLC0xLC0xLC0xLC0xLCA2LCA3LCA2LCA3LCA2LCA3LCA2LCA3CiAKIFNFQ1RJT04gLnRleHQKIAotJW1hY3JvIElOVDE2X0xPT1AgMiA7ICUxID0gYS91IChhbGlnbmVkL3VuYWxpZ25lZCksICUyID0gYWRkL3N1YgotICAgIG1vdmQgICAgbTQsIG1hc2tkCi0gICAgU1BMQVRXICBtNCwgbTQKLSAgICBhZGQgICAgIHdkLCB3ZAotICAgIHRlc3QgICAgd3EsIDIqbW1zaXplIC0gMQotICAgIGp6ICUlLnRvbWFpbmxvb3AKLSAgICBwdXNoICB0bXBxCi0lJS53b3JkbG9vcDoKLSAgICBzdWIgICAgIHdxLCAyCi0laWZpZG4gJTIsIGFkZAotICAgIG1vdiAgIHRtcHcsIFtzcmNxK3dxXQotICAgIGFkZCAgIHRtcHcsIFtkc3RxK3dxXQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2FkZF9tZWRpYW5fcHJlZF9tbXhleHQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICp0b3AsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaWZmLCBpbnQgdywKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVtYWNybyBNRURJQU5fUFJFRCAwCitjZ2xvYmFsIGFkZF9tZWRpYW5fcHJlZCwgNiw2LDgsIGRzdCwgdG9wLCBkaWZmLCB3LCBsZWZ0LCBsZWZ0X3RvcAorICAgIG1vdnUgICAgbTAsIFt0b3BxXQorICAgIG1vdmEgICAgbTIsIG0wCisgICAgbW92ZCAgICBtNCwgW2xlZnRfdG9wcV0KKyAgICBMU0hJRlQgIG0yLCAxCisgICAgbW92YSAgICBtMSwgbTAKKyAgICBwb3IgICAgIG00LCBtMgorICAgIG1vdmQgICAgbTMsIFtsZWZ0cV0KKyAgICBwc3ViYiAgIG0wLCBtNCA7IHQtdGwKKyAgICBhZGQgICAgZHN0cSwgd3EKKyAgICBhZGQgICAgdG9wcSwgd3EKKyAgICBhZGQgICBkaWZmcSwgd3EKKyAgICBuZWcgICAgICB3cQorICAgIGptcCAuc2tpcAorLmxvb3A6CisgICAgbW92dSAgICBtNCwgW3RvcHErd3FdCisgICAgbW92YSAgICBtMCwgbTQKKyAgICBMU0hJRlQgIG00LCAxCisgICAgcG9yICAgICBtNCwgbTEKKyAgICBtb3ZhICAgIG0xLCBtMCA7IHQKKyAgICBwc3ViYiAgIG0wLCBtNCA7IHQtdGwKKy5za2lwOgorICAgIG1vdnUgICAgbTIsIFtkaWZmcSt3cV0KKyVhc3NpZ24gaSAwCislcmVwIG1tc2l6ZQorICAgIG1vdmEgICAgbTQsIG0wCisgICAgcGFkZGIgICBtNCwgbTMgOyB0LXRsK2wKKyAgICBtb3ZhICAgIG01LCBtMworICAgIHBtYXh1YiAgbTMsIG0xCisgICAgcG1pbnViICBtNSwgbTEKKyAgICBwbWludWIgIG0zLCBtNAorICAgIHBtYXh1YiAgbTMsIG01IDsgbWVkaWFuCisgICAgcGFkZGIgICBtMywgbTIgOyArcmVzaWR1YWwKKyVpZiBpPT0wCisgICAgbW92YSAgICBtNywgbTMKKyAgICBMU0hJRlQgIG03LCBtbXNpemUtMQogJWVsc2UKLSAgICBtb3YgICB0bXB3LCBbc3JjMXErd3FdCi0gICAgc3ViICAgdG1wdywgW3NyYzJxK3dxXQorICAgIG1vdmEgICAgbTYsIG0zCisgICAgUlNISUZUICBtNywgMQorICAgIExTSElGVCAgbTYsIG1tc2l6ZS0xCisgICAgcG9yICAgICBtNywgbTYKICVlbmRpZgotICAgIGFuZCAgIHRtcHcsIG1hc2t3Ci0gICAgbW92ICAgICBbZHN0cSt3cV0sIHRtcHcKLSAgICB0ZXN0ICAgIHdxLCAyKm1tc2l6ZSAtIDEKLSAgICBqbnogJSUud29yZGxvb3AKLSAgICBwb3AgICB0bXBxCi0lJS50b21haW5sb29wOgotJWlmaWRuICUyLCBhZGQKLSAgICBhZGQgICAgIHNyY3EsIHdxCi0lZWxzZQotICAgIGFkZCAgICAgc3JjMXEsIHdxCi0gICAgYWRkICAgICBzcmMycSwgd3EKKyVpZiBpPG1tc2l6ZS0xCisgICAgUlNISUZUICBtMCwgMQorICAgIFJTSElGVCAgbTEsIDEKKyAgICBSU0hJRlQgIG0yLCAxCiAlZW5kaWYKLSAgICBhZGQgICAgIGRzdHEsIHdxCi0gICAgbmVnICAgICB3cQotICAgIGp6ICAgICAgJSUuZW5kCi0lJS5sb29wOgotJWlmaWRuICUyLCBhZGQKLSAgICBtb3YlMSAgIG0wLCBbc3JjcSt3cV0KLSAgICBtb3YlMSAgIG0xLCBbZHN0cSt3cV0KLSAgICBtb3YlMSAgIG0yLCBbc3JjcSt3cSttbXNpemVdCi0gICAgbW92JTEgICBtMywgW2RzdHErd3ErbW1zaXplXQotJWVsc2UKLSAgICBtb3YlMSAgIG0wLCBbc3JjMXErd3FdCi0gICAgbW92JTEgICBtMSwgW3NyYzJxK3dxXQotICAgIG1vdiUxICAgbTIsIFtzcmMxcSt3cSttbXNpemVdCi0gICAgbW92JTEgICBtMywgW3NyYzJxK3dxK21tc2l6ZV0KLSVlbmRpZgotICAgIHAlMncgICAgbTAsIG0xCi0gICAgcCUydyAgICBtMiwgbTMKLSAgICBwYW5kICAgIG0wLCBtNAotICAgIHBhbmQgICAgbTIsIG00Ci0gICAgbW92JTEgICBbZHN0cSt3cV0gICAgICAgLCBtMAotICAgIG1vdiUxICAgW2RzdHErd3ErbW1zaXplXSwgbTIKLSAgICBhZGQgICAgIHdxLCAyKm1tc2l6ZQotICAgIGpsICUlLmxvb3AKLSUlLmVuZDoKKyVhc3NpZ24gaSBpKzEKKyVlbmRyZXAKKyAgICBtb3Z1IFtkc3RxK3dxXSwgbTcKKyAgICBhZGQgICAgICB3cSwgbW1zaXplCisgICAgamwgLmxvb3AKKyAgICBtb3Z6eCAgIHIyZCwgYnl0ZSBbZHN0cS0xXQorICAgIG1vdiBbbGVmdHFdLCByMmQKKyAgICBtb3Z6eCAgIHIyZCwgYnl0ZSBbdG9wcS0xXQorICAgIG1vdiBbbGVmdF90b3BxXSwgcjJkCiAgICAgUkVUCiAlZW5kbWFjcm8KIAotSU5JVF9NTVggbW14Ci1jZ2xvYmFsIGFkZF9pbnQxNiwgNCw0LDUsIGRzdCwgc3JjLCBtYXNrLCB3LCB0bXAKLSAgICBJTlQxNl9MT09QIGEsIGFkZAotCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teGV4dAorTUVESUFOX1BSRUQKKyVlbmRpZgogSU5JVF9YTU0gc3NlMgotY2dsb2JhbCBhZGRfaW50MTYsIDQsNCw1LCBkc3QsIHNyYywgbWFzaywgdywgdG1wCi0gICAgdGVzdCBzcmNxLCBtbXNpemUtMQotICAgIGpueiAudW5hbGlnbmVkCi0gICAgdGVzdCBkc3RxLCBtbXNpemUtMQotICAgIGpueiAudW5hbGlnbmVkCi0gICAgSU5UMTZfTE9PUCBhLCBhZGQKLS51bmFsaWduZWQ6Ci0gICAgSU5UMTZfTE9PUCB1LCBhZGQKK01FRElBTl9QUkVECiAKKworJW1hY3JvIEFERF9MRUZUX0xPT1AgMiA7ICUxID0gZHN0X2lzX2FsaWduZWQsICUyID0gc3JjX2lzX2FsaWduZWQKKyAgICBhZGQgICAgIHNyY3EsIHdxCisgICAgYWRkICAgICBkc3RxLCB3cQorICAgIG5lZyAgICAgd3EKKyUlLmxvb3A6CisgICAgcHNodWZiICB4bTAsIHhtNQorJWlmICUyCisgICAgbW92YSAgICBtMSwgW3NyY3Erd3FdCislZWxzZQorICAgIG1vdnUgICAgbTEsIFtzcmNxK3dxXQorJWVuZGlmCisgICAgcHNsbHcgICBtMiwgbTEsIDgKKyAgICBwYWRkYiAgIG0xLCBtMgorICAgIHBzaHVmYiAgbTIsIG0xLCBtMworICAgIHBhZGRiICAgbTEsIG0yCisgICAgcHNodWZiICBtMiwgbTEsIG00CisgICAgcGFkZGIgICBtMSwgbTIKKyVpZiBtbXNpemUgPj0gMTYKKyAgICBwc2h1ZmIgIG0yLCBtMSwgbTYKKyAgICBwYWRkYiAgIG0xLCBtMgorJWVuZGlmCisgICAgcGFkZGIgICB4bTAsIHhtMQorJWlmICUxCisgICAgbW92YSAgICBbZHN0cSt3cV0sIHhtMAorJWVsc2UKKyAgICBtb3ZxICAgIFtkc3RxK3dxXSwgeG0wCisgICAgbW92aHBzICBbZHN0cSt3cSs4XSwgeG0wCislZW5kaWYKKworJWlmIG1tc2l6ZSA9PSAzMgorICAgIHZleHRyYWN0aTEyOCAgICB4bTIsIG0xLCAxIDsgZ2V0IHNlY29uZCBsYW5lIG9mIHRoZSB5bW0KKyAgICBwc2h1ZmIgICAgICAgICAgeG0wLCB4bTUgICA7IHNldCBhbGxzIHZhbCB0byBsYXN0IHZhbCBvZiB0aGUgZmlyc3QgbGFuZQorICAgIHBhZGRiICAgICAgICAgICB4bTAsIHhtMgorO3N0b3JlIHZhbAorJWlmICUxCisgICAgbW92YSAgICBbZHN0cSt3cSsxNl0sIHhtMAorJWVsc2U7CisgICAgbW92cSAgICBbZHN0cSt3cSsxNl0sIHhtMAorICAgIG1vdmhwcyAgW2RzdHErd3ErMTYrOF0sIHhtMAorJWVuZGlmCislZW5kaWYKKyAgICBhZGQgICAgIHdxLCBtbXNpemUKKyAgICBqbCAlJS5sb29wCislaWYgbW1zaXplID09IDMyCisgICAgbW92enggICBlYXgsIGJ5dGUgW2RzdHEgLSAxXQorJWVsc2U7CisgICAgbW92ICAgICBlYXgsIG1tc2l6ZS0xCisgICAgc3ViICAgICBlYXgsIHdkCisgICAgbW92ZCAgICBtMSwgZWF4CisgICAgcHNodWZiICBtMCwgbTEKKyAgICBtb3ZkICAgIGVheCwgbTAKKyVlbmRpZgorICAgIFJFVAorJWVuZG1hY3JvCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsgaW50IGZmX2FkZF9sZWZ0X3ByZWQodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCB3LCBpbnQgbGVmdCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0lOSVRfTU1YIHNzc2UzCitjZ2xvYmFsIGFkZF9sZWZ0X3ByZWQsIDMsMyw3LCBkc3QsIHNyYywgdywgbGVmdAorLnNraXBfcHJvbG9ndWU6CisgICAgbW92YSAgICBtNSwgW3BiXzddCisgICAgbW92YSAgICBtNCwgW3BiX3p6enozMzMzenp6emJiYmJdCisgICAgbW92YSAgICBtMywgW3BiX3p6MTF6ejU1eno5OXp6ZGRdCisgICAgbW92ZCAgICBtMCwgbGVmdG0KKyAgICBwc2xscSAgIG0wLCA1NgorICAgIEFERF9MRUZUX0xPT1AgMSwgMQorCislbWFjcm8gQUREX0xFRlRfUFJFRF9VTkFMSUdORUQgMAorY2dsb2JhbCBhZGRfbGVmdF9wcmVkX3VuYWxpZ25lZCwgMywzLDcsIGRzdCwgc3JjLCB3LCBsZWZ0CisgICAgbW92YSAgICB4bTUsIFtwYl8xNV0KKyAgICBWQlJPQURDQVNUSTEyOCAgICBtNiwgW3BiX3p6enp6enp6Nzc3Nzc3NzddCisgICAgVkJST0FEQ0FTVEkxMjggICAgbTQsIFtwYl96enp6MzMzM3p6enpiYmJiXQorICAgIFZCUk9BRENBU1RJMTI4ICAgIG0zLCBbcGJfenoxMXp6NTV6ejk5enpkZF0KKyAgICBtb3ZkICAgIHhtMCwgbGVmdG0KKyAgICBwc2xsZHEgIHhtMCwgMTUKKyAgICB0ZXN0ICAgIHNyY3EsIG1tc2l6ZSAtIDEKKyAgICBqbnogLnNyY191bmFsaWduZWQKKyAgICB0ZXN0ICAgIGRzdHEsIG1tc2l6ZSAtIDEKKyAgICBqbnogLmRzdF91bmFsaWduZWQKKyAgICBBRERfTEVGVF9MT09QIDEsIDEKKy5kc3RfdW5hbGlnbmVkOgorICAgIEFERF9MRUZUX0xPT1AgMCwgMQorLnNyY191bmFsaWduZWQ6CisgICAgQUREX0xFRlRfTE9PUCAwLCAwCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NzZTMKK0FERF9MRUZUX1BSRURfVU5BTElHTkVECisKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK0FERF9MRUZUX1BSRURfVU5BTElHTkVECislZW5kaWYKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2FkZF9ieXRlcyh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHcpOworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIEFERF9CWVRFUyAwCitjZ2xvYmFsIGFkZF9ieXRlcywgMyw0LDIsIGRzdCwgc3JjLCB3LCBzaXplCisgICAgbW92ICBzaXplcSwgd3EKKyAgICBhbmQgIHNpemVxLCAtMiptbXNpemUKKyAgICBqeiAgLjIKKyAgICBhZGQgICBkc3RxLCBzaXplcQorICAgIGFkZCAgIHNyY3EsIHNpemVxCisgICAgbmVnICBzaXplcQorLjE6CisgICAgbW92YSAgICBtMCwgW3NyY3EgKyBzaXplcV0KKyAgICBtb3ZhICAgIG0xLCBbc3JjcSArIHNpemVxICsgbW1zaXplXQorICAgIHBhZGRiICAgbTAsIFtkc3RxICsgc2l6ZXFdCisgICAgcGFkZGIgICBtMSwgW2RzdHEgKyBzaXplcSArIG1tc2l6ZV0KKyAgICBtb3ZhICAgW2RzdHEgKyBzaXplcV0sIG0wCisgICAgbW92YSAgIFtkc3RxICsgc2l6ZXEgKyBtbXNpemVdLCBtMQorICAgIGFkZCAgc2l6ZXEsIDIqbW1zaXplCisgICAgamwgLjEKKy4yOgorICAgIGFuZCAgICAgd3EsIDIqbW1zaXplLTEKKyAgICBqeiAgICAuZW5kCisgICAgYWRkICAgZHN0cSwgd3EKKyAgICBhZGQgICBzcmNxLCB3cQorICAgIG5lZyAgICAgd3EKKy4zOgorICAgIG1vdiAgc2l6ZWIsIFtzcmNxICsgd3FdCisgICAgYWRkIFtkc3RxICsgd3FdLCBzaXplYgorICAgIGluYyAgICAgd3EKKyAgICBqbCAuMworLmVuZDoKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworJWlmIEFSQ0hfWDg2XzMyCiBJTklUX01NWCBtbXgKLWNnbG9iYWwgZGlmZl9pbnQxNiwgNSw1LDUsIGRzdCwgc3JjMSwgc3JjMiwgbWFzaywgdywgdG1wCi0gICAgSU5UMTZfTE9PUCBhLCBzdWIKLQorQUREX0JZVEVTCislZW5kaWYKIElOSVRfWE1NIHNzZTIKLWNnbG9iYWwgZGlmZl9pbnQxNiwgNSw1LDUsIGRzdCwgc3JjMSwgc3JjMiwgbWFzaywgdywgdG1wCi0gICAgdGVzdCBzcmMxcSwgbW1zaXplLTEKLSAgICBqbnogLnVuYWxpZ25lZAotICAgIHRlc3Qgc3JjMnEsIG1tc2l6ZS0xCi0gICAgam56IC51bmFsaWduZWQKLSAgICB0ZXN0IGRzdHEsIG1tc2l6ZS0xCi0gICAgam56IC51bmFsaWduZWQKLSAgICBJTlQxNl9MT09QIGEsIHN1YgotLnVuYWxpZ25lZDoKLSAgICBJTlQxNl9MT09QIHUsIHN1YgorQUREX0JZVEVTCiAKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK0FERF9CWVRFUworJWVuZGlmCiAKICVtYWNybyBBRERfSEZZVV9MRUZUX0xPT1BfSU5UMTYgMiA7ICUxID0gZHN0IGFsaWdubWVudCAoYS91KSwgJTIgPSBzcmMgYWxpZ25tZW50IChhL3UpCiAgICAgYWRkICAgICB3ZCwgd2QKQEAgLTE1OCw5ICsyOTMsMTEgQEAKICAgICBSRVQKICVlbmRtYWNybwogCi07IGludCBhZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTYodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcsIGludCBsZWZ0KQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBpbnQgYWRkX2xlZnRfcHJlZF9pbnQxNih1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgaW50IGxlZnQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBJTklUX01NWCBzc3NlMwotY2dsb2JhbCBhZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTYsIDQsNCw4LCBkc3QsIHNyYywgbWFzaywgdywgbGVmdAorY2dsb2JhbCBhZGRfbGVmdF9wcmVkX2ludDE2LCA0LDQsOCwgZHN0LCBzcmMsIG1hc2ssIHcsIGxlZnQKIC5za2lwX3Byb2xvZ3VlOgogICAgIG1vdmEgICAgbTUsIFtwYl82N10KICAgICBtb3ZhICAgIG0zLCBbcGJfenp6ejIzMjN6enp6YWJhYl0KQEAgLTE3MCw4ICszMDcsOCBAQAogICAgIFNQTEFUVyAgbTcgLG03CiAgICAgQUREX0hGWVVfTEVGVF9MT09QX0lOVDE2IGEsIGEKIAotSU5JVF9YTU0gc3NlNAotY2dsb2JhbCBhZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTYsIDQsNCw4LCBkc3QsIHNyYywgbWFzaywgdywgbGVmdAorSU5JVF9YTU0gc3NzZTMKK2NnbG9iYWwgYWRkX2xlZnRfcHJlZF9pbnQxNl91bmFsaWduZWQsIDQsNCw4LCBkc3QsIHNyYywgbWFzaywgdywgbGVmdAogICAgIG1vdmEgICAgbTUsIFtwYl9lZl0KICAgICBtb3ZhICAgIG00LCBbcGJfenp6enp6eno2NzY3Njc2N10KICAgICBtb3ZhICAgIG0zLCBbcGJfenp6ejIzMjN6enp6YWJhYl0KQEAgLTE4OSwxMDYgKzMyNiw4MSBAQAogLnNyY191bmFsaWduZWQ6CiAgICAgQUREX0hGWVVfTEVGVF9MT09QX0lOVDE2IHUsIHUKIAotOyB2b2lkIGFkZF9oZnl1X21lZGlhbl9wcmVkaWN0aW9uX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnRvcCwgY29uc3QgdWludDhfdCAqZGlmZiwgaW50IG1hc2ssIGludCB3LCBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCi1JTklUX01NWCBtbXhleHQKLWNnbG9iYWwgYWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYsIDcsNywwLCBkc3QsIHRvcCwgZGlmZiwgbWFzaywgdywgbGVmdCwgbGVmdF90b3AKLSAgICBhZGQgICAgICB3ZCwgd2QKLSAgICBtb3ZkICAgIG1tNiwgbWFza2QKLSAgICBTUExBVFcgIG1tNiwgbW02Ci0gICAgbW92cSAgICBtbTAsIFt0b3BxXQotICAgIG1vdnEgICAgbW0yLCBtbTAKLSAgICBtb3ZkICAgIG1tNCwgW2xlZnRfdG9wcV0KLSAgICBwc2xscSAgIG1tMiwgMTYKLSAgICBtb3ZxICAgIG1tMSwgbW0wCi0gICAgcG9yICAgICBtbTQsIG1tMgotICAgIG1vdmQgICAgbW0zLCBbbGVmdHFdCi0gICAgcHN1YncgICBtbTAsIG1tNCA7IHQtdGwKLSAgICBhZGQgICAgZHN0cSwgd3EKLSAgICBhZGQgICAgdG9wcSwgd3EKLSAgICBhZGQgICBkaWZmcSwgd3EKLSAgICBuZWcgICAgICB3cQotICAgIGptcCAuc2tpcAotLmxvb3A6Ci0gICAgbW92cSAgICBtbTQsIFt0b3BxK3dxXQotICAgIG1vdnEgICAgbW0wLCBtbTQKLSAgICBwc2xscSAgIG1tNCwgMTYKLSAgICBwb3IgICAgIG1tNCwgbW0xCi0gICAgbW92cSAgICBtbTEsIG1tMCA7IHQKLSAgICBwc3VidyAgIG1tMCwgbW00IDsgdC10bAotLnNraXA6Ci0gICAgbW92cSAgICBtbTIsIFtkaWZmcSt3cV0KLSVhc3NpZ24gaSAwCi0lcmVwIDQKLSAgICBtb3ZxICAgIG1tNCwgbW0wCi0gICAgcGFkZHcgICBtbTQsIG1tMyA7IHQtdGwrbAotICAgIHBhbmQgICAgbW00LCBtbTYKLSAgICBtb3ZxICAgIG1tNSwgbW0zCi0gICAgcG1heHN3ICBtbTMsIG1tMQotICAgIHBtaW5zdyAgbW01LCBtbTEKLSAgICBwbWluc3cgIG1tMywgbW00Ci0gICAgcG1heHN3ICBtbTMsIG1tNSA7IG1lZGlhbgotICAgIHBhZGR3ICAgbW0zLCBtbTIgOyArcmVzaWR1YWwKLSAgICBwYW5kICAgIG1tMywgbW02Ci0laWYgaT09MAotICAgIG1vdnEgICAgbW03LCBtbTMKLSAgICBwc2xscSAgIG1tNywgNDgKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGFkZF9ncmFkaWVudF9wcmVkKHVpbnQ4X3QgKnNyYywgY29uc3QgcHRyZGlmZl90IHN0cmlkZSwgY29uc3QgcHRyZGlmZl90IHdpZHRoKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIEFERF9HUkFESUVOVF9QUkVEIDAKK2NnbG9iYWwgYWRkX2dyYWRpZW50X3ByZWQsIDMsNCw1LCBzcmMsIHN0cmlkZSwgd2lkdGgsIHRtcAorICAgIG1vdmEgICAgICAgICB4bTAsIFtwYl8xNV0KKworO2xvYWQgc3JjIC0gMSBpbiB4bTEKKyAgICBtb3ZkICAgICAgICAgeG0xLCBbc3JjcS0xXQorJWlmIGNwdWZsYWcoYXZ4MikKKyAgICB2cGJyb2FkY2FzdGIgeG0xLCB4bTEKICVlbHNlCi0gICAgbW92cSAgICBtbTQsIG1tMwotICAgIHBzcmxxICAgbW03LCAxNgotICAgIHBzbGxxICAgbW00LCA0OAotICAgIHBvciAgICAgbW03LCBtbTQKKyAgICBweG9yICAgICAgICAgeG0yLCB4bTIKKyAgICBwc2h1ZmIgICAgICAgeG0xLCB4bTIKICVlbmRpZgotJWlmIGk8MwotICAgIHBzcmxxICAgbW0wLCAxNgotICAgIHBzcmxxICAgbW0xLCAxNgotICAgIHBzcmxxICAgbW0yLCAxNgorCisgICAgYWRkICAgIHNyY3EsIHdpZHRocQorICAgIG5lZyAgd2lkdGhxCisgICAgbmVnIHN0cmlkZXEKKworLmxvb3A6CisgICAgbGVhICAgIHRtcHEsIFtzcmNxICsgc3RyaWRlcV0KKyAgICBtb3ZhICAgICBtMiwgW3RtcHEgKyB3aWR0aHFdIDsgQSA9IHNyY1t4LXN0cmlkZV0KKyAgICBtb3Z1ICAgICBtMywgW3RtcHEgKyB3aWR0aHEgLSAxXSA7IEIgPSBzcmNbeCAtIChzdHJpZGUgKyAxKV0KKyAgICBtb3ZhICAgICBtNCwgW3NyY3EgKyB3aWR0aHFdIDsgY3VycmVudCB2YWwgKHNyY1t4XSkKKworICAgIHBzdWJiICAgIG0yLCBtMzsgQSAtIEIKKworOyBwcmVmaXggc3VtIEEtQgorICAgIHBzbGxkcSAgIG0zLCBtMiwgMQorICAgIHBhZGRiICAgIG0yLCBtMworICAgIHBzbGxkcSAgIG0zLCBtMiwgMgorICAgIHBhZGRiICAgIG0yLCBtMworICAgIHBzbGxkcSAgIG0zLCBtMiwgNAorICAgIHBhZGRiICAgIG0yLCBtMworICAgIHBzbGxkcSAgIG0zLCBtMiwgOAorICAgIHBhZGRiICAgIG0yLCBtMworCis7IHByZWZpeCBzdW0gY3VycmVudCB2YWwKKyAgICBwc2xsZHEgICBtMywgbTQsIDEKKyAgICBwYWRkYiAgICBtNCwgbTMKKyAgICBwc2xsZHEgICBtMywgbTQsIDIKKyAgICBwYWRkYiAgICBtNCwgbTMKKyAgICBwc2xsZHEgICBtMywgbTQsIDQKKyAgICBwYWRkYiAgICBtNCwgbTMKKyAgICBwc2xsZHEgICBtMywgbTQsIDgKKyAgICBwYWRkYiAgICBtNCwgbTMKKworOyBsYXN0IHN1bQorICAgIHBhZGRiICAgICAgICAgICAgICAgICAgICBtMiwgbTQgOyBjdXJyZW50ICsgKEEgLSBCKQorCisgICAgcGFkZGIgICAgICAgICAgICAgICAgICAgeG0xLCB4bTIgOyArPSBDCisgICAgbW92YSAgICAgICAgW3NyY3EgKyB3aWR0aHFdLCB4bTEgOyBzdG9yZQorCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgeG0xLCB4bTAgOyBwdXQgbGFzdCB2YWwgaW4gYWxsIHZhbCBvZiB4bTEKKworJWlmIG1tc2l6ZSA9PSAzMgorICAgIHZleHRyYWN0aTEyOCAgICAgICAgICAgIHhtMiwgbTIsIDEgOyBnZXQgc2Vjb25kIGxhbmUgb2YgdGhlIHltbQorICAgIHBhZGRiICAgICAgICAgICAgICAgICAgIHhtMSwgeG0yOyArPSBDCisKKyAgICBtb3ZhICAgW3NyY3EgKyB3aWR0aHEgKyAxNl0sIHhtMSA7IHN0b3JlCisgICAgcHNodWZiICAgICAgICAgICAgICAgICAgeG0xLCB4bTAgOyBwdXQgbGFzdCB2YWwgaW4gYWxsIHZhbCBvZiBtMQogJWVuZGlmCi0lYXNzaWduIGkgaSsxCi0lZW5kcmVwCi0gICAgbW92cSBbZHN0cSt3cV0sIG1tNwotICAgIGFkZCAgICAgIHdxLCA4CisKKyAgICBhZGQgICAgICAgICB3aWR0aHEsIG1tc2l6ZQogICAgIGpsIC5sb29wCi0gICAgbW92enggICByMmQsIHdvcmQgW2RzdHEtMl0KLSAgICBtb3YgW2xlZnRxXSwgcjJkCi0gICAgbW92enggICByMmQsIHdvcmQgW3RvcHEtMl0KLSAgICBtb3YgW2xlZnRfdG9wcV0sIHIyZAogICAgIFJFVAogCi1jZ2xvYmFsIHN1Yl9oZnl1X21lZGlhbl9wcmVkX2ludDE2LCA3LDcsMCwgZHN0LCBzcmMxLCBzcmMyLCBtYXNrLCB3LCBsZWZ0LCBsZWZ0X3RvcAotICAgIGFkZCAgICAgIHdkLCB3ZAotICAgIG1vdmQgICAgbW03LCBtYXNrZAotICAgIFNQTEFUVyAgbW03LCBtbTcKLSAgICBtb3ZxICAgIG1tMCwgW3NyYzFxXQotICAgIG1vdnEgICAgbW0yLCBbc3JjMnFdCi0gICAgcHNsbHEgICBtbTAsIDE2Ci0gICAgcHNsbHEgICBtbTIsIDE2Ci0gICAgbW92ZCAgICBtbTYsIFtsZWZ0X3RvcHFdCi0gICAgcG9yICAgICBtbTAsIG1tNgotICAgIG1vdmQgICAgbW02LCBbbGVmdHFdCi0gICAgcG9yICAgICBtbTIsIG1tNgotICAgIHhvciAgICAgbWFza3EsIG1hc2txCi0ubG9vcDoKLSAgICBtb3ZxICAgIG1tMSwgW3NyYzFxICsgbWFza3FdCi0gICAgbW92cSAgICBtbTMsIFtzcmMycSArIG1hc2txXQotICAgIG1vdnEgICAgbW00LCBtbTIKLSAgICBwc3VidyAgIG1tMiwgbW0wCi0gICAgcGFkZHcgICBtbTIsIG1tMQotICAgIHBhbmQgICAgbW0yLCBtbTcKLSAgICBtb3ZxICAgIG1tNSwgbW00Ci0gICAgcG1heHN3ICBtbTQsIG1tMQotICAgIHBtaW5zdyAgbW0xLCBtbTUKLSAgICBwbWluc3cgIG1tNCwgbW0yCi0gICAgcG1heHN3ICBtbTQsIG1tMQotICAgIHBzdWJ3ICAgbW0zLCBtbTQKLSAgICBwYW5kICAgIG1tMywgbW03Ci0gICAgbW92cSAgICBbZHN0cSArIG1hc2txXSwgbW0zCi0gICAgYWRkICAgICBtYXNrcSwgOAotICAgIG1vdnEgICAgbW0wLCBbc3JjMXEgKyBtYXNrcSAtIDJdCi0gICAgbW92cSAgICBtbTIsIFtzcmMycSArIG1hc2txIC0gMl0KLSAgICBjbXAgICAgIG1hc2txLCB3cQotICAgICAgICBqYiAubG9vcAotICAgIG1vdnp4IG1hc2tkLCB3b3JkIFtzcmMxcSArIHdxIC0gMl0KLSAgICBtb3YgW2xlZnRfdG9wcV0sIG1hc2tkCi0gICAgbW92enggbWFza2QsIHdvcmQgW3NyYzJxICsgd3EgLSAyXQotICAgIG1vdiBbbGVmdHFdLCBtYXNrZAotICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzc2UzCitBRERfR1JBRElFTlRfUFJFRAorCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitBRERfR1JBRElFTlRfUFJFRAorJWVuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc192aWRlb2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc192aWRlb2RzcF9pbml0LmMKaW5kZXggYjBmYmNmZS4uNmQ3MWYxNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfdmlkZW9kc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX3ZpZGVvZHNwX2luaXQuYwpAQCAtMTgsNDUgKzE4LDExMSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgogI2luY2x1ZGUgIi4uL2xvc3NsZXNzX3ZpZGVvZHNwLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgogCi12b2lkIGZmX2FkZF9pbnQxNl9tbXgodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgdW5zaWduZWQgbWFzaywgaW50IHcpOwotdm9pZCBmZl9hZGRfaW50MTZfc3NlMih1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdyk7Ci12b2lkIGZmX2RpZmZfaW50MTZfbW14ICh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjMSwgY29uc3QgdWludDE2X3QgKnNyYzIsIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKLXZvaWQgZmZfZGlmZl9pbnQxNl9zc2UyKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMxLCBjb25zdCB1aW50MTZfdCAqc3JjMiwgdW5zaWduZWQgbWFzaywgaW50IHcpOwotaW50IGZmX2FkZF9oZnl1X2xlZnRfcHJlZF9pbnQxNl9zc3NlMyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgdW5zaWduZWQgYWNjKTsKLWludCBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTZfc3NlNCh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgdW5zaWduZWQgYWNjKTsKLXZvaWQgZmZfYWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfbW14ZXh0KHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICp0b3AsIGNvbnN0IHVpbnQxNl90ICpkaWZmLCB1bnNpZ25lZCBtYXNrLCBpbnQgdywgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKLXZvaWQgZmZfc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfbW14ZXh0KHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmMxLCBjb25zdCB1aW50MTZfdCAqc3JjMiwgdW5zaWduZWQgbWFzaywgaW50IHcsIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7Cit2b2lkIGZmX2FkZF9ieXRlc19tbXgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCB3KTsKK3ZvaWQgZmZfYWRkX2J5dGVzX3NzZTIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCB3KTsKK3ZvaWQgZmZfYWRkX2J5dGVzX2F2eDIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCB3KTsKIAordm9pZCBmZl9hZGRfbWVkaWFuX3ByZWRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpZmYsIHB0cmRpZmZfdCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCk7Cit2b2lkIGZmX2FkZF9tZWRpYW5fcHJlZF9zc2UyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaWZmLCBwdHJkaWZmX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKIAotdm9pZCBmZl9sbHZpZGRzcF9pbml0X3g4NihMTFZpZERTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK2ludCAgZmZfYWRkX2xlZnRfcHJlZF9zc3NlMyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgdywgaW50IGxlZnQpOworaW50ICBmZl9hZGRfbGVmdF9wcmVkX3VuYWxpZ25lZF9zc3NlMyh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHcsIGludCBsZWZ0KTsKK2ludCAgZmZfYWRkX2xlZnRfcHJlZF91bmFsaWduZWRfYXZ4Mih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgdywgaW50IGxlZnQpOworCitpbnQgZmZfYWRkX2xlZnRfcHJlZF9pbnQxNl9zc3NlMyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBwdHJkaWZmX3QgdywgdW5zaWduZWQgYWNjKTsKK2ludCBmZl9hZGRfbGVmdF9wcmVkX2ludDE2X3VuYWxpZ25lZF9zc3NlMyh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBwdHJkaWZmX3QgdywgdW5zaWduZWQgYWNjKTsKKwordm9pZCBmZl9hZGRfZ3JhZGllbnRfcHJlZF9zc3NlMyh1aW50OF90ICpzcmMsIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUsIGNvbnN0IHB0cmRpZmZfdCB3aWR0aCk7Cit2b2lkIGZmX2FkZF9ncmFkaWVudF9wcmVkX2F2eDIodWludDhfdCAqc3JjLCBjb25zdCBwdHJkaWZmX3Qgc3RyaWRlLCBjb25zdCBwdHJkaWZmX3Qgd2lkdGgpOworCisjaWYgSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfN1JFR1MgJiYgQVJDSF9YODZfMzIKK3N0YXRpYyB2b2lkIGFkZF9tZWRpYW5fcHJlZF9jbW92KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgcHRyZGlmZl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxlZnQsIGludCAqbGVmdF90b3ApCit7CisgICAgeDg2X3JlZyB3MiA9IC13OworICAgIHg4Nl9yZWcgeDsKKyAgICBpbnQgbCAgPSAqbGVmdCAgICAgJiAweGZmOworICAgIGludCB0bCA9ICpsZWZ0X3RvcCAmIDB4ZmY7CisgICAgaW50IHQ7CisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJtb3YgICAgICAgICAgJTcsICUzICAgICAgICAgICAgXG4iCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJtb3Z6YmwgKCUzLCAlNCksICUyICAgICAgICAgICAgXG4iCisgICAgICAgICJtb3YgICAgICAgICAgJTIsICVrMyAgICAgICAgICAgXG4iCisgICAgICAgICJzdWIgICAgICAgICAlYjEsICViMyAgICAgICAgICAgXG4iCisgICAgICAgICJhZGQgICAgICAgICAlYjAsICViMyAgICAgICAgICAgXG4iCisgICAgICAgICJtb3YgICAgICAgICAgJTIsICUxICAgICAgICAgICAgXG4iCisgICAgICAgICJjbXAgICAgICAgICAgJTAsICUyICAgICAgICAgICAgXG4iCisgICAgICAgICJjbW92ZyAgICAgICAgJTAsICUyICAgICAgICAgICAgXG4iCisgICAgICAgICJjbW92ZyAgICAgICAgJTEsICUwICAgICAgICAgICAgXG4iCisgICAgICAgICJjbXAgICAgICAgICAlazMsICUwICAgICAgICAgICAgXG4iCisgICAgICAgICJjbW92ZyAgICAgICAlazMsICUwICAgICAgICAgICAgXG4iCisgICAgICAgICJtb3YgICAgICAgICAgJTcsICUzICAgICAgICAgICAgXG4iCisgICAgICAgICJjbXAgICAgICAgICAgJTIsICUwICAgICAgICAgICAgXG4iCisgICAgICAgICJjbW92bCAgICAgICAgJTIsICUwICAgICAgICAgICAgXG4iCisgICAgICAgICJhZGQgICAgKCU2LCAlNCksICViMCAgICAgICAgICAgXG4iCisgICAgICAgICJtb3YgICAgICAgICAlYjAsICglNSwgJTQpICAgICAgXG4iCisgICAgICAgICJpbmMgICAgICAgICAgJTQgICAgICAgICAgICAgICAgXG4iCisgICAgICAgICJqbCAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgXG4iCisgICAgICAgIDogIismcSIobCksICIrJnEiKHRsKSwgIj0mciIodCksICI9JnEiKHgpLCAiKyZyIih3MikKKyAgICAgICAgOiAiciIoZHN0ICsgdyksICJyIihkaWZmICsgdyksICJybSIodG9wICsgdykKKyAgICApOworICAgICpsZWZ0ICAgICA9IGw7CisgICAgKmxlZnRfdG9wID0gdGw7Cit9CisjZW5kaWYKKwordm9pZCBmZl9sbHZpZGRzcF9pbml0X3g4NihMTFZpZERTUENvbnRleHQgKmMpCiB7CiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChhdmN0eC0+cGl4X2ZtdCk7CiAKLSAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKLSAgICAgICAgYy0+YWRkX2ludDE2ID0gZmZfYWRkX2ludDE2X21teDsKLSAgICAgICAgYy0+ZGlmZl9pbnQxNiA9IGZmX2RpZmZfaW50MTZfbW14OworI2lmIEhBVkVfSU5MSU5FX0FTTSAmJiBIQVZFXzdSRUdTICYmIEFSQ0hfWDg2XzMyCisgICAgaWYgKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX0NNT1YpCisgICAgICAgIGMtPmFkZF9tZWRpYW5fcHJlZCA9IGFkZF9tZWRpYW5fcHJlZF9jbW92OworI2VuZGlmCisKKyAgICBpZiAoQVJDSF9YODZfMzIgJiYgRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+YWRkX2J5dGVzID0gZmZfYWRkX2J5dGVzX21teDsKICAgICB9CiAKLSAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykgJiYgcGl4X2Rlc2MtPmNvbXBbMF0uZGVwdGg8MTYpIHsKLSAgICAgICAgYy0+YWRkX2hmeXVfbWVkaWFuX3ByZWRfaW50MTYgPSBmZl9hZGRfaGZ5dV9tZWRpYW5fcHJlZF9pbnQxNl9tbXhleHQ7Ci0gICAgICAgIGMtPnN1Yl9oZnl1X21lZGlhbl9wcmVkX2ludDE2ID0gZmZfc3ViX2hmeXVfbWVkaWFuX3ByZWRfaW50MTZfbW14ZXh0OworICAgIGlmIChBUkNIX1g4Nl8zMiAmJiBFWFRFUk5BTF9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICAvKiBzbG93ZXIgdGhhbiBjbW92IHZlcnNpb24gb24gQU1EICovCisgICAgICAgIGlmICghKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHXzNETk9XKSkKKyAgICAgICAgICAgIGMtPmFkZF9tZWRpYW5fcHJlZCA9IGZmX2FkZF9tZWRpYW5fcHJlZF9tbXhleHQ7CiAgICAgfQogCiAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgewotICAgICAgICBjLT5hZGRfaW50MTYgPSBmZl9hZGRfaW50MTZfc3NlMjsKLSAgICAgICAgYy0+ZGlmZl9pbnQxNiA9IGZmX2RpZmZfaW50MTZfc3NlMjsKKyAgICAgICAgYy0+YWRkX2J5dGVzICAgICAgID0gZmZfYWRkX2J5dGVzX3NzZTI7CisgICAgICAgIGMtPmFkZF9tZWRpYW5fcHJlZCA9IGZmX2FkZF9tZWRpYW5fcHJlZF9zc2UyOwogICAgIH0KIAogICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIGMtPmFkZF9oZnl1X2xlZnRfcHJlZF9pbnQxNiA9IGZmX2FkZF9oZnl1X2xlZnRfcHJlZF9pbnQxNl9zc3NlMzsKKyAgICAgICAgYy0+YWRkX2xlZnRfcHJlZCA9IGZmX2FkZF9sZWZ0X3ByZWRfc3NzZTM7CisgICAgICAgIGMtPmFkZF9sZWZ0X3ByZWRfaW50MTYgPSBmZl9hZGRfbGVmdF9wcmVkX2ludDE2X3Nzc2UzOworICAgICAgICBjLT5hZGRfZ3JhZGllbnRfcHJlZCAgID0gZmZfYWRkX2dyYWRpZW50X3ByZWRfc3NzZTM7CiAgICAgfQogCi0gICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkgewotICAgICAgICBjLT5hZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTYgPSBmZl9hZGRfaGZ5dV9sZWZ0X3ByZWRfaW50MTZfc3NlNDsKKyAgICBpZiAoRVhURVJOQUxfU1NTRTNfRkFTVChjcHVfZmxhZ3MpKSB7CisgICAgICAgIGMtPmFkZF9sZWZ0X3ByZWQgPSBmZl9hZGRfbGVmdF9wcmVkX3VuYWxpZ25lZF9zc3NlMzsKKyAgICAgICAgYy0+YWRkX2xlZnRfcHJlZF9pbnQxNiA9IGZmX2FkZF9sZWZ0X3ByZWRfaW50MTZfdW5hbGlnbmVkX3Nzc2UzOworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5hZGRfYnl0ZXMgICAgICAgPSBmZl9hZGRfYnl0ZXNfYXZ4MjsKKyAgICAgICAgYy0+YWRkX2xlZnRfcHJlZCAgID0gZmZfYWRkX2xlZnRfcHJlZF91bmFsaWduZWRfYXZ4MjsKKyAgICAgICAgYy0+YWRkX2dyYWRpZW50X3ByZWQgPSBmZl9hZGRfZ3JhZGllbnRfcHJlZF9hdngyOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX3ZpZGVvZW5jZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX3ZpZGVvZW5jZHNwLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjEyMDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy94ODYvbG9zc2xlc3NfdmlkZW9lbmNkc3AuYXNtCkBAIC0wLDAgKzEsMTk0IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTSU1ELW9wdGltaXplZCBsb3NzbGVzcyB2aWRlbyBlbmNvZGluZyBmdW5jdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSBGYWJyaWNlIEJlbGxhcmQKKzsqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Cis7KgorOyogTU1YIG9wdGltaXphdGlvbiBieSBOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PgorOyogQ29udmVyc2lvbiB0byBOQVNNIGZvcm1hdCBieSBUaWFuY2hlbmcgIlRpbW90aHkiIEd1IDx0aW1vdGh5Z3U5OUBnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogNTEsIEluYy4sIEZvdW5kYXRpb24gRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworY2V4dGVybiBwYl84MAorCitTRUNUSU9OIC50ZXh0CisKKzsgdm9pZCBmZl9kaWZmX2J5dGVzKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKzsgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcpOworJW1hY3JvIERJRkZfQllURVNfUFJPTE9HVUUgMAorJWlmIEFSQ0hfWDg2XzMyCitjZ2xvYmFsIGRpZmZfYnl0ZXMsIDMsNSwyLCBkc3QsIHNyYzEsIHNyYzIKKyVkZWZpbmUgd3EgcjRxCisgICAgREVDTEFSRV9SRUdfVE1QIDMKKyAgICBtb3YgICAgICAgICAgICAgICB3cSwgcjNtcAorJWVsc2UKK2NnbG9iYWwgZGlmZl9ieXRlcywgNCw1LDIsIGRzdCwgc3JjMSwgc3JjMiwgdworICAgIERFQ0xBUkVfUkVHX1RNUCA0CislZW5kaWYgOyBBUkNIX1g4Nl8zMgorJWRlZmluZSBpIHQwcQorJWVuZG1hY3JvCisKKzsgbGFiZWxzIHRvIGp1bXAgdG8gaWYgdyA8IHJlZ3NpemUgYW5kIHcgPCAwCislbWFjcm8gRElGRl9CWVRFU19MT09QX1BSRVAgMgorICAgIG1vdiAgICAgICAgICAgICAgICBpLCB3cQorICAgIGFuZCAgICAgICAgICAgICAgICBpLCAtMiAqIHJlZ3NpemUKKyAgICAgICAganMgICAgICAgICAgICAlMgorICAgICAgICBqeiAgICAgICAgICAgICUxCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIGkKKyAgICBhZGQgICAgICAgICAgICBzcmMxcSwgaQorICAgIGFkZCAgICAgICAgICAgIHNyYzJxLCBpCisgICAgbmVnICAgICAgICAgICAgICAgIGkKKyVlbmRtYWNybworCis7IG1vdiB0eXBlIHVzZWQgZm9yIHNyYzFxLCBkc3RxLCBmaXJzdCByZWcsIHNlY29uZCByZWcKKyVtYWNybyBESUZGX0JZVEVTX0xPT1BfQ09SRSA0CislaWYgbW1zaXplICE9IDE2CisgICAgbW92JTEgICAgICAgICAgICAgJTMsIFtzcmMxcSArIGldCisgICAgbW92JTEgICAgICAgICAgICAgJTQsIFtzcmMxcSArIGkgKyByZWdzaXplXQorICAgIHBzdWJiICAgICAgICAgICAgICUzLCBbc3JjMnEgKyBpXQorICAgIHBzdWJiICAgICAgICAgICAgICU0LCBbc3JjMnEgKyBpICsgcmVnc2l6ZV0KKyAgICBtb3YlMiAgICAgICAgICAgW2RzdHEgKyBpXSwgJTMKKyAgICBtb3YlMiBbcmVnc2l6ZSArIGRzdHEgKyBpXSwgJTQKKyVlbHNlCisgICAgOyBTU0UgZW5mb3JjZXMgYWxpZ25tZW50IG9mIHBzdWJiIG9wZXJhbmQKKyAgICBtb3YlMSAgICAgICAgICAgICAlMywgW3NyYzFxICsgaV0KKyAgICBtb3Z1ICAgICAgICAgICAgICAlNCwgW3NyYzJxICsgaV0KKyAgICBwc3ViYiAgICAgICAgICAgICAlMywgJTQKKyAgICBtb3YlMiAgICAgW2RzdHEgKyBpXSwgJTMKKyAgICBtb3YlMSAgICAgICAgICAgICAlMywgW3NyYzFxICsgaSArIHJlZ3NpemVdCisgICAgbW92dSAgICAgICAgICAgICAgJTQsIFtzcmMycSArIGkgKyByZWdzaXplXQorICAgIHBzdWJiICAgICAgICAgICAgICUzLCAlNAorICAgIG1vdiUyIFtyZWdzaXplICsgZHN0cSArIGldLCAlMworJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIERJRkZfQllURVNfQk9EWSAyIDsgbW92IHR5cGUgdXNlZCBmb3Igc3JjMXEsIGZvciBkc3RxCisgICAgJWRlZmluZSByZWdzaXplIG1tc2l6ZQorLmxvb3BfJTElMjoKKyAgICBESUZGX0JZVEVTX0xPT1BfQ09SRSAlMSwgJTIsIG0wLCBtMQorICAgIGFkZCAgICAgICAgICAgICAgICBpLCAyICogcmVnc2l6ZQorICAgICAgICBqbCAgICAubG9vcF8lMSUyCisuc2tpcF9tYWluXyUxJTI6CisgICAgYW5kICAgICAgICAgICAgICAgd3EsIDIgKiByZWdzaXplIC0gMQorICAgICAgICBqeiAgICAgLmVuZF8lMSUyCislaWYgbW1zaXplID4gMTYKKyAgICA7IGZhbGwgYmFjayB0byBuYXJyb3dlciB4bW0KKyAgICAlZGVmaW5lIHJlZ3NpemUgKG1tc2l6ZSAvIDIpCisgICAgRElGRl9CWVRFU19MT09QX1BSRVAgLnNldHVwX2xvb3BfZ3ByX2FhLCAuZW5kX2FhCisubG9vcDJfJTElMjoKKyAgICBESUZGX0JZVEVTX0xPT1BfQ09SRSAlMSwgJTIsIHhtMCwgeG0xCisgICAgYWRkICAgICAgICAgICAgICAgIGksIDIgKiByZWdzaXplCisgICAgICAgIGpsICAgLmxvb3AyXyUxJTIKKy5zZXR1cF9sb29wX2dwcl8lMSUyOgorICAgIGFuZCAgICAgICAgICAgICAgIHdxLCAyICogcmVnc2l6ZSAtIDEKKyAgICAgICAganogICAgIC5lbmRfJTElMgorJWVuZGlmCisgICAgYWRkICAgICAgICAgICAgIGRzdHEsIHdxCisgICAgYWRkICAgICAgICAgICAgc3JjMXEsIHdxCisgICAgYWRkICAgICAgICAgICAgc3JjMnEsIHdxCisgICAgbmVnICAgICAgICAgICAgICAgd3EKKy5sb29wX2dwcl8lMSUyOgorICAgIG1vdiAgICAgICAgICAgICAgdDBiLCBbc3JjMXEgKyB3cV0KKyAgICBzdWIgICAgICAgICAgICAgIHQwYiwgW3NyYzJxICsgd3FdCisgICAgbW92ICAgICAgW2RzdHEgKyB3cV0sIHQwYgorICAgIGluYyAgICAgICAgICAgICAgIHdxCisgICAgICAgIGpsIC5sb29wX2dwcl8lMSUyCisuZW5kXyUxJTI6CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl8zMgorSU5JVF9NTVggbW14CitESUZGX0JZVEVTX1BST0xPR1VFCisgICAgJWRlZmluZSByZWdzaXplIG1tc2l6ZQorICAgIERJRkZfQllURVNfTE9PUF9QUkVQIC5za2lwX21haW5fYWEsIC5lbmRfYWEKKyAgICBESUZGX0JZVEVTX0JPRFkgICAgYSwgYQorJXVuZGVmIGkKKyVlbmRpZgorCitJTklUX1hNTSBzc2UyCitESUZGX0JZVEVTX1BST0xPR1VFCisgICAgJWRlZmluZSByZWdzaXplIG1tc2l6ZQorICAgIERJRkZfQllURVNfTE9PUF9QUkVQIC5za2lwX21haW5fYWEsIC5lbmRfYWEKKyAgICB0ZXN0ICAgICAgICAgICAgZHN0cSwgcmVnc2l6ZSAtIDEKKyAgICAgICAgam56ICAgICAubG9vcF91dQorICAgIHRlc3QgICAgICAgICAgIHNyYzFxLCByZWdzaXplIC0gMQorICAgICAgICBqbnogICAgIC5sb29wX3VhCisgICAgRElGRl9CWVRFU19CT0RZICAgIGEsIGEKKyAgICBESUZGX0JZVEVTX0JPRFkgICAgdSwgYQorICAgIERJRkZfQllURVNfQk9EWSAgICB1LCB1CisldW5kZWYgaQorCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitESUZGX0JZVEVTX1BST0xPR1VFCisgICAgJWRlZmluZSByZWdzaXplIG1tc2l6ZQorICAgIDsgRGlyZWN0bHkgdXNpbmcgdW5hbGlnbmVkIFNTRTIgdmVyc2lvbiBpcyBtYXJnaW5hbGx5IGZhc3RlciB0aGFuCisgICAgOyBicmFuY2hpbmcgYmFzZWQgb24gYXJndW1lbnRzLgorICAgIERJRkZfQllURVNfTE9PUF9QUkVQIC5za2lwX21haW5fdXUsIC5lbmRfdXUKKyAgICB0ZXN0ICAgICAgICAgICAgZHN0cSwgcmVnc2l6ZSAtIDEKKyAgICAgICAgam56ICAgICAubG9vcF91dQorICAgIHRlc3QgICAgICAgICAgIHNyYzFxLCByZWdzaXplIC0gMQorICAgICAgICBqbnogICAgIC5sb29wX3VhCisgICAgRElGRl9CWVRFU19CT0RZICAgIGEsIGEKKyAgICBESUZGX0JZVEVTX0JPRFkgICAgdSwgYQorICAgIERJRkZfQllURVNfQk9EWSAgICB1LCB1CisldW5kZWYgaQorJWVuZGlmCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7dm9pZCBzdWJfbGVmdF9wcmVkaWN0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLCBwdHJkaWZmX3Qgd2lkdGgsIGludCBoZWlnaHQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSU5JVF9YTU0gYXZ4CitjZ2xvYmFsIHN1Yl9sZWZ0X3ByZWRpY3QsIDUsNiw1LCBkc3QsIHNyYywgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0LCB4CisgICAgbW92YSAgICAgICAgICAgICBtMSwgW3BiXzgwXSA7IHByZXYgaW5pdGlhbAorICAgIGFkZCAgICAgICAgICAgIGRzdHEsIHdpZHRocQorICAgIGFkZCAgICAgICAgICAgIHNyY3EsIHdpZHRocQorICAgIGxlYSAgICAgICAgICAgICAgeGQsIFt3aWR0aHEtMV0KKyAgICBuZWcgICAgICAgICAgd2lkdGhxCisgICAgYW5kICAgICAgICAgICAgICB4ZCwgMTUKKyAgICBwaW5zcmIgICAgICAgICAgIG00LCBtMSwgeGQsIDE1CisgICAgbW92ICAgICAgICAgICAgICB4cSwgd2lkdGhxCisKKyAgICAubG9vcDoKKyAgICAgICAgbW92dSAgICAgICAgICAgICAgICAgICAgIG0wLCBbc3JjcSArIHdpZHRocV0KKyAgICAgICAgcGFsaWduciAgICAgICAgICAgICAgICAgIG0yLCBtMCwgbTEsIDE1CisgICAgICAgIG1vdnUgICAgICAgICAgICAgICAgICAgICBtMSwgW3NyY3EgKyB3aWR0aHEgKyAxNl0KKyAgICAgICAgcGFsaWduciAgICAgICAgICAgICAgICAgIG0zLCBtMSwgbTAsIDE1CisgICAgICAgIHBzdWJiICAgICAgICAgICAgICAgICAgICBtMiwgbTAsIG0yCisgICAgICAgIHBzdWJiICAgICAgICAgICAgICAgICAgICBtMywgbTEsIG0zCisgICAgICAgIG1vdnUgICAgICAgIFtkc3RxICsgd2lkdGhxXSwgbTIKKyAgICAgICAgbW92dSAgIFtkc3RxICsgd2lkdGhxICsgMTZdLCBtMworICAgICAgICBhZGQgICAgICAgICAgICAgICAgICB3aWR0aHEsIDIgKiAxNgorICAgICAgICBqbCAubG9vcAorCisgICAgYWRkICAgc3JjcSwgc3RyaWRlcQorICAgIHN1YiAgIGRzdHEsIHhxIDsgZHN0ICsgd2lkdGgKKyAgICB0ZXN0ICAgIHhkLCAxNgorICAgIGp6IC5tb2QzMgorICAgIG1vdmEgICAgbTEsIG0wCisKKy5tb2QzMjoKKyAgICBwc2h1ZmIgICAgbTEsIG00CisgICAgbW92ICAgd2lkdGhxLCB4cQorICAgIGRlYyAgaGVpZ2h0ZAorICAgIGpnIC5sb29wCisgICAgUkVUCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc192aWRlb2VuY2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9sb3NzbGVzc192aWRlb2VuY2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0MDdhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L2xvc3NsZXNzX3ZpZGVvZW5jZHNwX2luaXQuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIFNJTUQtb3B0aW1pemVkIGxvc3NsZXNzIHZpZGVvIGVuY29kaW5nIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqCisgKiBNTVggb3B0aW1pemF0aW9uIGJ5IE5pY2sgS3Vyc2hldiA8bmlja29sc19rQG1haWwucnU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9sb3NzbGVzc192aWRlb2VuY2RzcC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgorCit2b2lkIGZmX2RpZmZfYnl0ZXNfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgdyk7Cit2b2lkIGZmX2RpZmZfYnl0ZXNfc3NlMih1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3KTsKK3ZvaWQgZmZfZGlmZl9ieXRlc19hdngyKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHcpOworCit2b2lkIGZmX3N1Yl9sZWZ0X3ByZWRpY3RfYXZ4KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIHB0cmRpZmZfdCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyNpZiBIQVZFX0lOTElORV9BU00KKworc3RhdGljIHZvaWQgc3ViX21lZGlhbl9wcmVkX21teGV4dCh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludHB0cl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbGVmdCwgaW50ICpsZWZ0X3RvcCkKK3sKKyAgICB4ODZfcmVnIGkgPSAwOworICAgIHVpbnQ4X3QgbCwgbHQ7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgIm1vdnEgICglMSwgJTApLCAlJW1tMCAgICAgICAgICBcblx0IiAvLyBMVAorICAgICAgICAicHNsbHEgJDgsICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICglMSwgJTApLCAlJW1tMSAgICAgICAgICBcblx0IiAvLyBUCisgICAgICAgICJtb3ZxICAtMSglMiwgJTApLCAlJW1tMiAgICAgICAgXG5cdCIgLy8gTAorICAgICAgICAibW92cSAgKCUyLCAlMCksICUlbW0zICAgICAgICAgIFxuXHQiIC8vIFgKKyAgICAgICAgIm1vdnEgJSVtbTIsICUlbW00ICAgICAgICAgICAgICBcblx0IiAvLyBMCisgICAgICAgICJwc3ViYiAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBhZGRiICUlbW0xLCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvLyBMICsgVCAtIExUCisgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLy8gTAorICAgICAgICAicG1heHViICUlbW0xLCAlJW1tNCAgICAgICAgICAgIFxuXHQiIC8vIG1heChULCBMKQorICAgICAgICAicG1pbnViICUlbW01LCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vIG1pbihULCBMKQorICAgICAgICAicG1pbnViICUlbW0yLCAlJW1tNCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJwbWF4dWIgJSVtbTEsICUlbW00ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInBzdWJiICUlbW00LCAlJW1tMyAgICAgICAgICAgICBcblx0IiAvLyBkc3QgLSBwcmVkCisgICAgICAgICJtb3ZxICUlbW0zLCAoJTMsICUwKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZCAkOCwgJTAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAtMSglMSwgJTApLCAlJW1tMCAgICAgICAgIFxuXHQiIC8vIExUCisgICAgICAgICJjbXAgJTQsICUwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIiBqYiAxYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICA6ICIrciIgKGkpCisgICAgICAgIDogInIiIChzcmMxKSwgInIiIChzcmMyKSwgInIiIChkc3QpLCAiciIgKCh4ODZfcmVnKSB3KSk7CisKKyAgICBsICA9ICpsZWZ0OworICAgIGx0ID0gKmxlZnRfdG9wOworCisgICAgZHN0WzBdID0gc3JjMlswXSAtIG1pZF9wcmVkKGwsIHNyYzFbMF0sIChsICsgc3JjMVswXSAtIGx0KSAmIDB4RkYpOworCisgICAgKmxlZnRfdG9wID0gc3JjMVt3IC0gMV07CisgICAgKmxlZnQgICAgID0gc3JjMlt3IC0gMV07Cit9CisKKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworYXZfY29sZCB2b2lkIGZmX2xsdmlkZW5jZHNwX2luaXRfeDg2KExMVmlkRW5jRFNQQ29udGV4dCAqYykKK3sKKyAgICBhdl91bnVzZWQgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChBUkNIX1g4Nl8zMiAmJiBFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5kaWZmX2J5dGVzID0gZmZfZGlmZl9ieXRlc19tbXg7CisgICAgfQorCisjaWYgSEFWRV9JTkxJTkVfQVNNCisgICAgaWYgKElOTElORV9NTVhFWFQoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5zdWJfbWVkaWFuX3ByZWQgPSBzdWJfbWVkaWFuX3ByZWRfbW14ZXh0OworICAgIH0KKyNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+ZGlmZl9ieXRlcyA9IGZmX2RpZmZfYnl0ZXNfc3NlMjsKKyAgICB9CisKKyAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+c3ViX2xlZnRfcHJlZGljdCA9IGZmX3N1Yl9sZWZ0X3ByZWRpY3RfYXZ4OworICAgIH0KKworICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT5kaWZmX2J5dGVzID0gZmZfZGlmZl9ieXRlc19hdngyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L2xwYy5jIGIvbGliYXZjb2RlYy94ODYvbHBjLmMKaW5kZXggM2E5NDkzZi4uNmM3MmUyMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvbHBjLmMKKysrIGIvbGliYXZjb2RlYy94ODYvbHBjLmMKQEAgLTE1NCw3ICsxNTQsNyBAQAogI2lmIEhBVkVfU1NFMl9JTkxJTkUKICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCi0gICAgaWYgKEhBVkVfU1NFMl9JTkxJTkUgJiYgY3B1X2ZsYWdzICYgKEFWX0NQVV9GTEFHX1NTRTIgfCBBVl9DUFVfRkxBR19TU0UyU0xPVykpIHsKKyAgICBpZiAoSU5MSU5FX1NTRTIoY3B1X2ZsYWdzKSB8fCBJTkxJTkVfU1NFMl9TTE9XKGNwdV9mbGFncykpIHsKICAgICAgICAgYy0+bHBjX2FwcGx5X3dlbGNoX3dpbmRvdyA9IGxwY19hcHBseV93ZWxjaF93aW5kb3dfc3NlMjsKICAgICAgICAgYy0+bHBjX2NvbXB1dGVfYXV0b2NvcnIgICA9IGxwY19jb21wdXRlX2F1dG9jb3JyX3NzZTI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvbWRjdDE1LmFzbSBiL2xpYmF2Y29kZWMveDg2L21kY3QxNS5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMwOTExMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L21kY3QxNS5hc20KQEAgLTAsMCArMSwyMjQgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFNJTUQgb3B0aW1pemVkIG5vbi1wb3dlci1vZi10d28gTURDVCBmdW5jdGlvbnMKKzsqCis7KiBDb3B5cmlnaHQgKEMpIDIwMTcgUm9zdGlzbGF2IFBlaGxpdmFub3YgPGF0b21udWtlckBnbWFpbC5jb20+Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEgMzIKKworcGVybV9uZWc6IGRkIDIsIDUsIDMsIDQsIDYsIDEsIDcsIDAKK3Blcm1fcG9zOiBkZCAwLCA3LCAxLCA2LCA0LCAzLCA1LCAyCitzaWduX2FkanVzdF9yOiB0aW1lcyA0IGRkIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDAKKworc2lnbl9hZGp1c3RfNTogZGQgMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMAorCitTRUNUSU9OIC50ZXh0CisKKyVpZiBBUkNIX1g4Nl82NAorCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzt2b2lkIGZmX2ZmdDE1X2F2eChGRlRDb21wbGV4ICpvdXQsIEZGVENvbXBsZXggKmluLCBGRlRDb21wbGV4ICpleHB0YWIsIHB0cmRpZmZfdCBzdHJpZGUpOworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCislbWFjcm8gRkZUNSAzIDsgJTEgLSBpbl9vZmZzZXQsICUyIC0gZHN0MSAoNjRiaXQgdXNlZCksICUzIC0gZHN0MgorICAgIFZCUk9BRENBU1RTRCBtMCwgW2lucSArICUxXSAgICAgICAgIDsgaW5bIDBdLnJlLCBpblsgMF0uaW0sIGluWyAwXS5yZSwgaW5bIDBdLmltCisgICAgbW92c2QgICB4bTEsIFtpbnEgKyAxKjE2ICsgIDggKyAlMV0gOyBpblsgM10ucmUsIGluWyAzXS5pbSwgICAgICAgICAwLCAgICAgICAgIDAKKyAgICBtb3ZzZCAgIHhtNCwgW2lucSArIDYqMTYgKyAgMCArICUxXSA7IGluWzEyXS5yZSwgaW5bMTJdLmltLCAgICAgICAgIDAsICAgICAgICAgMAorICAgIG1vdmhwcyAgeG0xLCBbaW5xICsgMyoxNiArICAwICsgJTFdIDsgaW5bIDNdLnJlLCBpblsgM10uaW0sIGluWyA2XS5yZSwgaW5bIDZdLmltCisgICAgbW92aHBzICB4bTQsIFtpbnEgKyA0KjE2ICsgIDggKyAlMV0gOyBpblsxMl0ucmUsIGluWzEyXS5pbSwgaW5bIDldLnJlLCBpblsgOV0uaW0KKworICAgIHN1YnBzICAgICAgIHhtMiwgIHhtMSwgeG00ICAgICAgICAgIDsgdFsyXS5pbSwgdFsyXS5yZSwgdFszXS5pbSwgdFszXS5yZQorICAgIGFkZHBzICAgICAgIHhtMSwgIHhtNCAgICAgICAgICAgICAgIDsgdFswXS5yZSwgdFswXS5pbSwgdFsxXS5yZSwgdFsxXS5pbQorCisgICAgbW92aGxwcyAgICAgJTIsICAgeG0xICAgICAgICAgICAgICAgOyB0WzBdLnJlLCB0WzFdLnJlLCB0WzBdLmltLCB0WzFdLmltCisgICAgYWRkcHMgICAgICAgJTIsICAgeG0xCisgICAgYWRkcHMgICAgICAgJTIsICAgeG0wICAgICAgICAgICAgICAgOyBEQ1swXS5yZSwgRENbMF0uaW0sIGp1bmsuLi4KKyAgICBtb3ZsaHBzICAgICAlMiwgICAlMiAgICAgICAgICAgICAgICA7IERDWzBdLnJlLCBEQ1swXS5pbSwgRENbMF0ucmUsIERDWzBdLmltCisKKyAgICBzaHVmcHMgICAgICB4bTMsICB4bTEsIHhtMiwgcTAxMTAgICA7IHRbMF0ucmUsIHRbMF0uaW0sIHRbMl0ucmUsIHRbMl0uaW0KKyAgICBzaHVmcHMgICAgICB4bTEsICB4bTIsIHEyMzMyICAgICAgICA7IHRbMV0ucmUsIHRbMV0uaW0sIHRbM10ucmUsIHRbM10uaW0KKworICAgIG11bHBzICAgICAgIHhtJTMsIHhtMSwgeG01CisgICAgbXVscHMgICAgICAgeG00LCAgeG0zLCB4bTYKKyAgICBtdWxwcyAgICAgICB4bTEsICB4bTYKKworICAgIHhvcnBzICAgICAgIHhtMSwgIHhtNworICAgIG11bHBzICAgICAgIHhtMywgIHhtNQorICAgIGFkZHN1YnBzICAgIHhtMywgIHhtMSAgICAgICAgICAgICAgIDsgdFswXS5yZSwgdFswXS5pbSwgdFsyXS5yZSwgdFsyXS5pbQorICAgIHN1YnBzICAgICAgIHhtJTMsIHhtNCAgICAgICAgICAgICAgIDsgdFs0XS5yZSwgdFs0XS5pbSwgdFs1XS5yZSwgdFs1XS5pbQorCisgICAgbW92aGxwcyAgICAgeG0yLCB4bSUzLCB4bTMgICAgICAgICAgOyB0WzJdLnJlLCB0WzJdLmltLCB0WzVdLnJlLCB0WzVdLmltCisgICAgbW92bGhwcyAgICAgeG0zLCB4bSUzICAgICAgICAgICAgICAgOyB0WzBdLnJlLCB0WzBdLmltLCB0WzRdLnJlLCB0WzRdLmltCisKKyAgICB4b3JwcyAgICAgICB4bTIsICB4bTcKKyAgICBhZGRwcyAgICAgICB4bSUzLCB4bTIsIHhtMworICAgIHN1YnBzICAgICAgIHhtMywgIHhtMgorCisgICAgc2h1ZnBzICAgICAgeG0zLCAgeG0zLCBxMTAzMgorICAgIHZpbnNlcnRmMTI4IG0lMywgIG0lMywgeG0zLCAxICAgICAgIDsgQWxsIEFDcyAodG1wWzFdIHRocm91Z2ggdG8gdG1wWzRdKQorICAgIGFkZHBzICAgICAgIG0lMywgIG0lMywgIG0wICAgICAgICAgIDsgRmluYWxseSBvZmZzZXQgd2l0aCBEQ3MKKyVlbmRtYWNybworCislbWFjcm8gQlVUVEVSRkxJRVNfREMgMiA7ICUxIC0gZXhwdGFiX29mZnNldCwgJTIgLSBvdXQKKyAgICBtdWxwcyB4bTAsICB4bTksIFtleHB0YWJxICsgJTEgKyAxNiowXQorICAgIG11bHBzIHhtMSwgeG0xMCwgW2V4cHRhYnEgKyAlMSArIDE2KjFdCisKKyAgICBoYWRkcHMgIHhtMCwgIHhtMQorICAgIG1vdmhscHMgeG0xLCAgeG0wICAgICAgICAgICAgICAgICAgIDsgdFswXS5yZSwgdFsxXS5yZSwgdFswXS5pbSwgdFsxXS5pbQorCisgICAgYWRkcHMgICB4bTAsICB4bTEKKyAgICBhZGRwcyAgIHhtMCwgIHhtOAorCisgICAgbW92c2QgWyUycV0sIHhtMAorJWVuZG1hY3JvCisKKyVtYWNybyBCVVRURVJGTElFU19BQyAyIDsgZXhwdGFiLCBleHB0YWJfb2Zmc2V0LCBzcmMxLCBzcmMyLCBzcmMzLCBvdXQgKHVzZXMgbTAtbTMpCisgICAgbXVscHMgIG0wLCBtMTIsIFtleHB0YWJxICsgNjQqMCArIDAqbW1zaXplICsgJTFdCisgICAgbXVscHMgIG0xLCBtMTIsIFtleHB0YWJxICsgNjQqMCArIDEqbW1zaXplICsgJTFdCisgICAgbXVscHMgIG0yLCBtMTMsIFtleHB0YWJxICsgNjQqMSArIDAqbW1zaXplICsgJTFdCisgICAgbXVscHMgIG0zLCBtMTMsIFtleHB0YWJxICsgNjQqMSArIDEqbW1zaXplICsgJTFdCisKKyAgICBhZGRwcyAgbTAsIG0wLCBtMgorICAgIGFkZHBzICBtMSwgbTEsIG0zCisgICAgYWRkcHMgIG0wLCBtMCwgbTExCisKKyAgICBzaHVmcHMgbTEsIG0xLCBtMSwgcTIzMDEKKyAgICBhZGRwcyAgbTAsIG0wLCBtMQorCisgICAgdmV4dHJhY3RmMTI4IHhtMSwgbTAsIDEKKworICAgIG1vdmxwcyBbJTJxICsgc3RyaWRlcSoxXSwgeG0wCisgICAgbW92aHBzIFslMnEgKyBzdHJpZGVxKjJdLCB4bTAKKyAgICBtb3ZscHMgWyUycSArICBzdHJpZGUzcV0sIHhtMQorICAgIG1vdmhwcyBbJTJxICsgc3RyaWRlcSo0XSwgeG0xCislZW5kbWFjcm8KKworSU5JVF9ZTU0gYXZ4CitjZ2xvYmFsIGZmdDE1LCA0LCA2LCAxNCwgb3V0LCBpbiwgZXhwdGFiLCBzdHJpZGUsIHN0cmlkZTMsIHN0cmlkZTUKKyVkZWZpbmUgb3V0MHEgaW5xCisgICAgc2hsIHN0cmlkZXEsIDMKKworICAgIG1vdmFwcyB4bTUsIFtleHB0YWJxICsgNDgwICsgMTYqMF0KKyAgICBtb3ZhcHMgeG02LCBbZXhwdGFicSArIDQ4MCArIDE2KjFdCisgICAgbW92YXBzIHhtNywgW3NpZ25fYWRqdXN0XzVdCisKKyAgICBGRlQ1ICAwLCAgeG04LCAxMQorICAgIEZGVDUgIDgsICB4bTksIDEyCisgICAgRkZUNSAxNiwgeG0xMCwgMTMKKworICAgIGxlYSBzdHJpZGUzcSwgW3N0cmlkZXEgKyBzdHJpZGVxKjJdCisgICAgbGVhIHN0cmlkZTVxLCBbc3RyaWRlcSArIHN0cmlkZXEqNF0KKworICAgIG1vdiBvdXQwcSwgb3V0cQorCisgICAgQlVUVEVSRkxJRVNfREMgKDgqNiArIDQqMCkqMio0LCBvdXQwCisgICAgbGVhIG91dHEsIFtvdXQwcSArIHN0cmlkZTVxKjFdCisgICAgQlVUVEVSRkxJRVNfREMgKDgqNiArIDQqMSkqMio0LCBvdXQKKyAgICBsZWEgb3V0cSwgW291dDBxICsgc3RyaWRlNXEqMl0KKyAgICBCVVRURVJGTElFU19EQyAoOCo2ICsgNCoyKSoyKjQsIG91dAorCisgICAgQlVUVEVSRkxJRVNfQUMgKDgqMCkqMio0LCBvdXQwCisgICAgbGVhIG91dHEsIFtvdXQwcSArIHN0cmlkZTVxKjFdCisgICAgQlVUVEVSRkxJRVNfQUMgKDgqMikqMio0LCBvdXQKKyAgICBsZWEgb3V0cSwgW291dDBxICsgc3RyaWRlNXEqMl0KKyAgICBCVVRURVJGTElFU19BQyAoOCo0KSoyKjQsIG91dAorCisgICAgUkVUCisKKyVlbmRpZiA7IEFSQ0hfWDg2XzY0CisKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7dm9pZCBmZl9tZGN0MTVfcG9zdHJlaW5kZXgoRkZUQ29tcGxleCAqb3V0LCBGRlRDb21wbGV4ICppbiwgRkZUQ29tcGxleCAqZXhwLCBpbnQgKmx1dCwgcHRyZGlmZl90IGxlbjgpOworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyVtYWNybyBMVVRfTE9BRF80RCAzCisgICAgbW92ICAgICAgcjRkLCBbbHV0cSArICUzcSo0ICsgIDBdCisgICAgbW92c2QgIHhtbSUxLCBbaW5xICsgIHI0cSo4XQorICAgIG1vdiAgICAgIHI0ZCwgW2x1dHEgKyAlM3EqNCArICA0XQorICAgIG1vdmhwcyB4bW0lMSwgW2lucSArICByNHEqOF0KKyVpZiBjcHVmbGFnKGF2eDIpCisgICAgbW92ICAgICAgcjRkLCBbbHV0cSArICUzcSo0ICsgIDhdCisgICAgbW92c2QgICAgICUyLCBbaW5xICsgIHI0cSo4XQorICAgIG1vdiAgICAgIHI0ZCwgW2x1dHEgKyAlM3EqNCArIDEyXQorICAgIG1vdmhwcyAgICAlMiwgW2lucSArICByNHEqOF0KKyAgICB2aW5zZXJ0ZjEyOCAlMSwgJTEsICUyLCAxCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUE9TVFJPVEFURV9GTiAxCitjZ2xvYmFsIG1kY3QxNV9wb3N0cmVpbmRleCwgNSwgNywgOCArIGNwdWZsYWcoYXZ4MikqMiwgb3V0LCBpbiwgZXhwLCBsdXQsIGxlbjgsIG9mZnNldF9wLCBvZmZzZXRfbgorCisgICAgeG9yIG9mZnNldF9ucSwgb2Zmc2V0X25xCisgICAgbGVhIG9mZnNldF9wcSwgW2xlbjhxKjIgLSAlMV0KKworICAgIG1vdmFwcyBtNywgIFtzaWduX2FkanVzdF9yXQorCislaWYgY3B1ZmxhZyhhdngyKQorICAgIG1vdmFwcyAgIG04LCBbcGVybV9wb3NdCisgICAgbW92YXBzICAgbTksIFtwZXJtX25lZ10KKyVlbmRpZgorCisubG9vcDoKKyAgICBtb3Z1cHMgbTAsIFtleHBxICsgb2Zmc2V0X3BxKjhdICAgICA7IGV4cFtwMF0ucmUsIGV4cFtwMF0uaW0sIGV4cFtwMV0ucmUsIGV4cFtwMV0uaW0sIGV4cFtwMl0ucmUsIGV4cFtwMl0uaW0sIGV4cFtwM10ucmUsIGV4cFtwM10uaW0KKyAgICBtb3Z1cHMgbTEsIFtleHBxICsgb2Zmc2V0X25xKjhdICAgICA7IGV4cFtuM10ucmUsIGV4cFtuM10uaW0sIGV4cFtuMl0ucmUsIGV4cFtuMl0uaW0sIGV4cFtuMV0ucmUsIGV4cFtuMV0uaW0sIGV4cFtuMF0ucmUsIGV4cFtuMF0uaW0KKworICAgIExVVF9MT0FEXzREIG0zLCB4bTQsIG9mZnNldF9wICAgICAgIDsgaW5bcDBdLnJlLCBpbltwMF0uaW0sIGluW3AxXS5yZSwgaW5bcDFdLmltLCBpbltwMl0ucmUsIGluW3AyXS5pbSwgaW5bcDNdLnJlLCBpbltwM10uaW0KKyAgICBMVVRfTE9BRF80RCBtNCwgeG01LCBvZmZzZXRfbiAgICAgICA7IGluW24zXS5yZSwgaW5bbjNdLmltLCBpbltuMl0ucmUsIGluW24yXS5pbSwgaW5bbjFdLnJlLCBpbltuMV0uaW0sIGluW24wXS5yZSwgaW5bbjBdLmltCisKKyAgICBtdWxwcyAgbTUsIG0zLCBtMCAgICAgICAgICAgICAgICAgICA7IGluW3BdLnJlaW0gKiBleHBbcF0ucmVpbQorICAgIG11bHBzICBtNiwgbTQsIG0xICAgICAgICAgICAgICAgICAgIDsgaW5bbl0ucmVpbSAqIGV4cFtuXS5yZWltCisKKyAgICB4b3JwcyAgbTUsIG03ICAgICAgICAgICAgICAgICAgICAgICA7IGluW3BdLnJlICo9IC0xLCBpbltwXS5pbSAqPSAxCisgICAgeG9ycHMgIG02LCBtNyAgICAgICAgICAgICAgICAgICAgICAgOyBpbltuXS5yZSAqPSAtMSwgaW5bbl0uaW0gKj0gMQorCisgICAgc2h1ZnBzIG0zLCBtMywgbTMsIHEyMzAxICAgICAgICAgICAgOyBpbltwXS5pbXJlCisgICAgc2h1ZnBzIG00LCBtNCwgbTQsIHEyMzAxICAgICAgICAgICAgOyBpbltuXS5pbXJlCisKKyAgICBtdWxwcyAgbTMsIG0wICAgICAgICAgICAgICAgICAgICAgICA7IGluW3BdLmltcmUgKiBleHBbcF0ucmVpbQorICAgIG11bHBzICBtNCwgbTEgICAgICAgICAgICAgICAgICAgICAgIDsgaW5bbl0uaW1yZSAqIGV4cFtuXS5yZWltCisKKyAgICBoYWRkcHMgbTMsIG02ICAgICAgICAgICAgICAgICAgICAgICA7IG91dFtuMF0uaW0sIG91dFtuMV0uaW0sIG91dFtuM10ucmUsIG91dFtuMl0ucmUsIG91dFtuMl0uaW0sIG91dFtuM10uaW0sIG91dFtuMV0ucmUsIG91dFtuMF0ucmUKKyAgICBoYWRkcHMgbTUsIG00ICAgICAgICAgICAgICAgICAgICAgICA7IG91dFtwMF0ucmUsIG91dFtwMV0ucmUsIG91dFtwM10uaW0sIG91dFtwMl0uaW0sIG91dFtwMl0ucmUsIG91dFtwM10ucmUsIG91dFtwMV0uaW0sIG91dFtwMF0uaW0KKworJWlmIGNwdWZsYWcoYXZ4MikKKyAgICB2cGVybXBzIG0zLCBtOSwgbTMgICAgICAgICAgICAgICAgICA7IG91dFtuM10uaW0sIG91dFtuM10ucmUsIG91dFtuMl0uaW0sIG91dFtuMl0ucmUsIG91dFtuMV0uaW0sIG91dFtuMV0ucmUsIG91dFtuMF0uaW0sIG91dFtuMF0ucmUKKyAgICB2cGVybXBzIG01LCBtOCwgbTUgICAgICAgICAgICAgICAgICA7IG91dFtwMF0ucmUsIG91dFtwMF0uaW0sIG91dFtwMV0ucmUsIG91dFtwMV0uaW0sIG91dFtwMl0ucmUsIG91dFtwMl0uaW0sIG91dFtwM10ucmUsIG91dFtwM10uaW0KKyVlbHNlCisgICAgc2h1ZnBzIG0zLCBtMywgbTMsIHEwMzEyCisgICAgc2h1ZnBzIG01LCBtNSwgbTUsIHEyMTMwCislZW5kaWYKKworICAgIG1vdnVwcyBbb3V0cSArIG9mZnNldF9ucSo4XSwgbTMKKyAgICBtb3Z1cHMgW291dHEgKyBvZmZzZXRfcHEqOF0sIG01CisKKyAgICBzdWIgb2Zmc2V0X3BxLCAlMQorICAgIGFkZCBvZmZzZXRfbnEsICUxCisgICAgY21wIG9mZnNldF9ucSwgb2Zmc2V0X3BxCisgICAgamxlIC5sb29wCisKKyAgICBSRVBfUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMworUE9TVFJPVEFURV9GTiAyCisKKyVpZiBBUkNIX1g4Nl82NCAmJiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK1BPU1RST1RBVEVfRk4gNAorJWVuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9tZGN0MTVfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvbWRjdDE1X2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWI5MWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy94ODYvbWRjdDE1X2luaXQuYwpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIFNJTUQgb3B0aW1pemVkIG5vbi1wb3dlci1vZi10d28gTURDVCBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgUm9zdGlzbGF2IFBlaGxpdmFub3YgPGF0b21udWtlckBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9tZGN0MTUuaCIKKwordm9pZCBmZl9tZGN0MTVfcG9zdHJlaW5kZXhfc3NlMyhGRlRDb21wbGV4ICpvdXQsIEZGVENvbXBsZXggKmluLCBGRlRDb21wbGV4ICpleHAsIGludCAqbHV0LCBwdHJkaWZmX3QgbGVuOCk7Cit2b2lkIGZmX21kY3QxNV9wb3N0cmVpbmRleF9hdngyKEZGVENvbXBsZXggKm91dCwgRkZUQ29tcGxleCAqaW4sIEZGVENvbXBsZXggKmV4cCwgaW50ICpsdXQsIHB0cmRpZmZfdCBsZW44KTsKKwordm9pZCBmZl9mZnQxNV9hdngoRkZUQ29tcGxleCAqb3V0LCBGRlRDb21wbGV4ICppbiwgRkZUQ29tcGxleCAqZXhwdGFiLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKworc3RhdGljIHZvaWQgcGVybV90d2lkZGxlcyhNRENUMTVDb250ZXh0ICpzKQoreworICAgIGludCBrOworICAgIEZGVENvbXBsZXggZXhwXzVwb2ludFs0XTsKKworICAgIEZGVENvbXBsZXggdG1wWzIxXSwgdG1wMlszMF07CisgICAgbWVtY3B5KHRtcCwgcy0+ZXhwdGFiLCBzaXplb2YoRkZUQ29tcGxleCkqMjEpOworCisgICAgLyogMTUtcG9pbnQgRkZUIHR3aWRkbGVzICovCisgICAgZm9yIChrID0gMDsgayA8IDU7IGsrKykgeworICAgICAgICB0bXAyWzYqayArIDBdID0gdG1wW2sgKyAgMF07CisgICAgICAgIHRtcDJbNiprICsgMl0gPSB0bXBbayArICA1XTsKKyAgICAgICAgdG1wMls2KmsgKyA0XSA9IHRtcFtrICsgMTBdOworCisgICAgICAgIHRtcDJbNiprICsgMV0gPSB0bXBbMiAqIChrICsgMCldOworICAgICAgICB0bXAyWzYqayArIDNdID0gdG1wWzIgKiAoayArIDUpXTsKKyAgICAgICAgdG1wMls2KmsgKyA1XSA9IHRtcFsyICogIGsgKyA1IF07CisgICAgfQorCisgICAgZm9yIChrID0gMDsgayA8IDY7IGsrKykgeworICAgICAgICBGRlRDb21wbGV4IGFjX2V4cFtdID0geworICAgICAgICAgICAgeyB0bXAyWzYqMSArIGtdLnJlLCAgdG1wMls2KjEgKyBrXS5yZSB9LAorICAgICAgICAgICAgeyB0bXAyWzYqMiArIGtdLnJlLCAgdG1wMls2KjIgKyBrXS5yZSB9LAorICAgICAgICAgICAgeyB0bXAyWzYqMyArIGtdLnJlLCAgdG1wMls2KjMgKyBrXS5yZSB9LAorICAgICAgICAgICAgeyB0bXAyWzYqNCArIGtdLnJlLCAgdG1wMls2KjQgKyBrXS5yZSB9LAorICAgICAgICAgICAgeyB0bXAyWzYqMSArIGtdLmltLCAtdG1wMls2KjEgKyBrXS5pbSB9LAorICAgICAgICAgICAgeyB0bXAyWzYqMiArIGtdLmltLCAtdG1wMls2KjIgKyBrXS5pbSB9LAorICAgICAgICAgICAgeyB0bXAyWzYqMyArIGtdLmltLCAtdG1wMls2KjMgKyBrXS5pbSB9LAorICAgICAgICAgICAgeyB0bXAyWzYqNCArIGtdLmltLCAtdG1wMls2KjQgKyBrXS5pbSB9LAorICAgICAgICB9OworICAgICAgICBtZW1jcHkocy0+ZXhwdGFiICsgOCprLCBhY19leHAsIDgqc2l6ZW9mKEZGVENvbXBsZXgpKTsKKyAgICB9CisKKyAgICAvKiBTcGVjaWFsY2FzZSB3aGVuIGsgPSAwICovCisgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykgeworICAgICAgICBGRlRDb21wbGV4IGRjX2V4cFtdID0geworICAgICAgICAgICAgeyB0bXAyWzIqayArIDBdLnJlLCAtdG1wMlsyKmsgKyAwXS5pbSB9LAorICAgICAgICAgICAgeyB0bXAyWzIqayArIDBdLmltLCAgdG1wMlsyKmsgKyAwXS5yZSB9LAorICAgICAgICAgICAgeyB0bXAyWzIqayArIDFdLnJlLCAtdG1wMlsyKmsgKyAxXS5pbSB9LAorICAgICAgICAgICAgeyB0bXAyWzIqayArIDFdLmltLCAgdG1wMlsyKmsgKyAxXS5yZSB9LAorICAgICAgICB9OworICAgICAgICBtZW1jcHkocy0+ZXhwdGFiICsgOCo2ICsgNCprLCBkY19leHAsIDQqc2l6ZW9mKEZGVENvbXBsZXgpKTsKKyAgICB9CisKKyAgICAvKiA1LXBvaW50IEZGVCB0d2lkZGxlcyAqLworICAgIGV4cF81cG9pbnRbMF0ucmUgPSBleHBfNXBvaW50WzBdLmltID0gdG1wWzE5XS5yZTsKKyAgICBleHBfNXBvaW50WzFdLnJlID0gZXhwXzVwb2ludFsxXS5pbSA9IHRtcFsxOV0uaW07CisgICAgZXhwXzVwb2ludFsyXS5yZSA9IGV4cF81cG9pbnRbMl0uaW0gPSB0bXBbMjBdLnJlOworICAgIGV4cF81cG9pbnRbM10ucmUgPSBleHBfNXBvaW50WzNdLmltID0gdG1wWzIwXS5pbTsKKworICAgIG1lbWNweShzLT5leHB0YWIgKyA4KjYgKyA0KjMsIGV4cF81cG9pbnQsIDQqc2l6ZW9mKEZGVENvbXBsZXgpKTsKK30KKworYXZfY29sZCB2b2lkIGZmX21kY3QxNV9pbml0X3g4NihNRENUMTVDb250ZXh0ICpzKQoreworICAgIGludCBhZGp1c3RfdHdpZGRsZXMgPSAwOworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMyhjcHVfZmxhZ3MpKQorICAgICAgICBzLT5wb3N0cmVpbmRleCA9IGZmX21kY3QxNV9wb3N0cmVpbmRleF9zc2UzOworCisgICAgaWYgKEFSQ0hfWDg2XzY0ICYmIEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPmZmdDE1ID0gZmZfZmZ0MTVfYXZ4OworICAgICAgICBhZGp1c3RfdHdpZGRsZXMgPSAxOworICAgIH0KKworICAgIGlmIChBUkNIX1g4Nl82NCAmJiBFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkKKyAgICAgICAgcy0+cG9zdHJlaW5kZXggPSBmZl9tZGN0MTVfcG9zdHJlaW5kZXhfYXZ4MjsKKworICAgIGlmIChhZGp1c3RfdHdpZGRsZXMpCisgICAgICAgIHBlcm1fdHdpZGRsZXMocyk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9tZV9jbXBfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvbWVfY21wX2luaXQuYwppbmRleCA0OWY1MGQwLi42YWVjOTNlIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9tZV9jbXBfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L21lX2NtcF9pbml0LmMKQEAgLTg5LDcgKzg5LDcgQEAKIGhhZGFtYXJkX2Z1bmMoc3NlMikKIGhhZGFtYXJkX2Z1bmMoc3NzZTMpCiAKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogc3RhdGljIGludCBuc3NlMTZfbW14KE1wZWdFbmNDb250ZXh0ICpjLCB1aW50OF90ICpwaXgxLCB1aW50OF90ICpwaXgyLAogICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoKQogewpAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgICAgIHJldHVybiBzY29yZTEgKyBGRkFCUyhzY29yZTIpICogODsKIH0KIAotI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworI2VuZGlmIC8qIEhBVkVfWDg2QVNNICovCiAKICNpZiBIQVZFX0lOTElORV9BU00KIApAQCAtMjgzLDE1ICsyODMsMTUgQEAKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKICAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUyLCAlJSJSRUdfYSIpLCAlJW1tMiAgICBcblx0IgotICAgICAgICAibW92cSAoJTIsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCi0gICAgICAgICJhZGQgJTMsICUlIlJFR19hIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCBcblx0IgorICAgICAgICAibW92cSAoJTIsICUlIkZGX1JFR19hIiksICUlbW0yIFxuXHQiCisgICAgICAgICJtb3ZxICglMiwgJSUiRkZfUkVHX2EiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgImFkZCAlMywgJSUiRkZfUkVHX2EiICAgICAgICAgICBcblx0IgogICAgICAgICAicHN1YnVzYiAlJW1tMCwgJSVtbTIgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tMCAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICBcblx0IgotICAgICAgICAibW92cSAoJTIsICUlIlJFR19hIiksICUlbW0zICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglMiwgJSUiUkVHX2EiKSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMSBcblx0IgorICAgICAgICAibW92cSAoJTIsICUlIkZGX1JFR19hIiksICUlbW0zIFxuXHQiCisgICAgICAgICJtb3ZxICglMiwgJSUiRkZfUkVHX2EiKSwgJSVtbTUgXG5cdCIKICAgICAgICAgInBzdWJ1c2IgJSVtbTEsICUlbW0zICAgICAgICAgICBcblx0IgogICAgICAgICAicHN1YnVzYiAlJW1tNSwgJSVtbTEgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwb3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKQEAgLTMwNiw3ICszMDYsNyBAQAogICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0yICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGR3ICUlbW0wLCAlJW1tNiAgICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkICUzLCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGQgJTMsICUlIkZGX1JFR19hIiAgICAgICAgICAgXG5cdCIKICAgICAgICAgIiBqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICA6ICIrYSIgKGxlbikKICAgICAgICAgOiAiciIgKGJsazEgLSBsZW4pLCAiciIgKGJsazIgLSBsZW4pLCAiciIgKHN0cmlkZSkpOwpAQCAtMzE5LDE4ICszMTksMTggQEAKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKICAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUyLCAlJSJSRUdfYSIpLCAlJW1tMSAgICBcblx0IgotICAgICAgICAibW92cSAoJTEsICUlIlJFR19hIiksICUlbW0yICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglMiwgJSUiUkVHX2EiKSwgJSVtbTMgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCBcblx0IgorICAgICAgICAibW92cSAoJTIsICUlIkZGX1JFR19hIiksICUlbW0xIFxuXHQiCisgICAgICAgICJtb3ZxICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTIgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUyLCAlJSJGRl9SRUdfYSIpLCAlJW1tMyBcblx0IgogICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCAgICAgICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0xICAgICAgICAgXG5cdCIKICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTIgICAgICAgICBcblx0IgogICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMyAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGR3ICUlbW0yLCAlJW1tMyAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAoJTMsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglMywgJSUiUkVHX2EiKSwgJSVtbTIgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUzLCAlJSJGRl9SRUdfYSIpLCAlJW1tNCBcblx0IgorICAgICAgICAibW92cSAoJTMsICUlIkZGX1JFR19hIiksICUlbW0yIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tMyAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHNybHcgJDEsICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCkBAIC0zNDQsNyArMzQ0LDcgQEAKICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTEgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJW1tMCwgJSVtbTYgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAlNCwgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICU0LCAlJSJGRl9SRUdfYSIgICAgICAgICAgIFxuXHQiCiAgICAgICAgICIganMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgOiAiK2EiIChsZW4pCiAgICAgICAgIDogInIiIChibGsxYSAtIGxlbiksICJyIiAoYmxrMWIgLSBsZW4pLCAiciIgKGJsazIgLSBsZW4pLApAQCAtMzU2LDggKzM1Niw4IEBACiB7CiAgICAgeDg2X3JlZyBsZW4gPSAtc3RyaWRlICogaDsKICAgICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAgICAgIm1vdnEgICglMSwgJSUiUkVHX2EiKSwgJSVtbTAgICBcblx0IgotICAgICAgICAibW92cSAxKCUxLCAlJSJSRUdfYSIpLCAlJW1tMiAgIFxuXHQiCisgICAgICAgICJtb3ZxICAoJTEsICUlIkZGX1JFR19hIiksICUlbW0wXG5cdCIKKyAgICAgICAgIm1vdnEgMSglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTJcblx0IgogICAgICAgICAibW92cSAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tMyAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTAgICAgICAgICBcblx0IgpAQCAtMzY4LDggKzM2OCw4IEBACiAgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAoJTIsICUlIlJFR19hIiksICUlbW0yICAgXG5cdCIKLSAgICAgICAgIm1vdnEgMSglMiwgJSUiUkVHX2EiKSwgJSVtbTQgICBcblx0IgorICAgICAgICAibW92cSAgKCUyLCAlJSJGRl9SRUdfYSIpLCAlJW1tMlxuXHQiCisgICAgICAgICJtb3ZxIDEoJTIsICUlIkZGX1JFR19hIiksICUlbW00XG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgXG5cdCIKQEAgLTM4Myw4ICszODMsOCBAQAogICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAoJTMsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglMywgJSUiUkVHX2EiKSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUzLCAlJSJGRl9SRUdfYSIpLCAlJW1tNCBcblx0IgorICAgICAgICAibW92cSAoJTMsICUlIkZGX1JFR19hIiksICUlbW01IFxuXHQiCiAgICAgICAgICJwc3JsdyAkMiwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzcmx3ICQyLCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFja3Vzd2IgJSVtbTEsICUlbW0wICAgICAgICAgIFxuXHQiCkBAIC0zOTgsNyArMzk4LDcgQEAKICAgICAgICAgInBhZGR3ICUlbW00LCAlJW1tNiAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgJSVtbTIsICUlbW0wICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAlNCwgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkICU0LCAlJSJGRl9SRUdfYSIgICAgICAgICAgIFxuXHQiCiAgICAgICAgICIganMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgOiAiK2EiIChsZW4pCiAgICAgICAgIDogInIiIChibGsxIC0gbGVuKSwgInIiIChibGsxIC0gbGVuICsgc3RyaWRlKSwgInIiIChibGsyIC0gbGVuKSwKQEAgLTU4Niw3ICs1ODYsNyBAQAogICAgICAgICBjLT5zdW1fYWJzX2RjdGVsZW0gICA9IGZmX3N1bV9hYnNfZGN0ZWxlbV9tbXg7CiAgICAgICAgIGMtPnNzZVswXSAgICAgICAgICAgID0gZmZfc3NlMTZfbW14OwogICAgICAgICBjLT5zc2VbMV0gICAgICAgICAgICA9IGZmX3NzZThfbW14OwotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAgICAgICAgIGMtPm5zc2VbMF0gICAgICAgICAgID0gbnNzZTE2X21teDsKICAgICAgICAgYy0+bnNzZVsxXSAgICAgICAgICAgPSBuc3NlOF9tbXg7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L21scGRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9tbHBkc3BfaW5pdC5jCmluZGV4IDdmNWU2YjEuLmNiOTBjYTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L21scGRzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvbWxwZHNwX2luaXQuYwpAQCAtNjEsMTMgKzYxLDEzIEBACiBleHRlcm4gY2hhciBmZl9tbHBfaWlyb3JkZXJfMDsKIAogc3RhdGljIGNvbnN0IHZvaWQgKiBjb25zdCBmaXJ0YWJsZVs5XSA9IHsgJmZmX21scF9maXJvcmRlcl8wLCAmZmZfbWxwX2Zpcm9yZGVyXzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tbHBfZmlyb3JkZXJfMiwgJmZmX21scF9maXJvcmRlcl8zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZfbWxwX2Zpcm9yZGVyXzQsICZmZl9tbHBfZmlyb3JkZXJfNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21scF9maXJvcmRlcl82LCAmZmZfbWxwX2Zpcm9yZGVyXzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tbHBfZmlyb3JkZXJfOCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21scF9maXJvcmRlcl8yLCAmZmZfbWxwX2Zpcm9yZGVyXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZfbWxwX2Zpcm9yZGVyXzQsICZmZl9tbHBfZmlyb3JkZXJfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tbHBfZmlyb3JkZXJfNiwgJmZmX21scF9maXJvcmRlcl83LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21scF9maXJvcmRlcl84IH07CiBzdGF0aWMgY29uc3Qgdm9pZCAqIGNvbnN0IGlpcnRhYmxlWzVdID0geyAmZmZfbWxwX2lpcm9yZGVyXzAsICZmZl9tbHBfaWlyb3JkZXJfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21scF9paXJvcmRlcl8yLCAmZmZfbWxwX2lpcm9yZGVyXzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZl9tbHBfaWlyb3JkZXJfNCB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmX21scF9paXJvcmRlcl8yLCAmZmZfbWxwX2lpcm9yZGVyXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmZfbWxwX2lpcm9yZGVyXzQgfTsKIAogI2lmIEFSQ0hfWDg2XzY0CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L21wZWdhdWRpb2RzcC5jIGIvbGliYXZjb2RlYy94ODYvbXBlZ2F1ZGlvZHNwLmMKaW5kZXggZDk2OWYxZC4uZjQ2YTVjNCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvbXBlZ2F1ZGlvZHNwLmMKKysrIGIvbGliYXZjb2RlYy94ODYvbXBlZ2F1ZGlvZHNwLmMKQEAgLTMwLDcgKzMwLDcgQEAKIHN0YXRpYyB2b2lkIGltZGN0MzZfYmxvY2tzXyAjIyBDUFUoZmxvYXQgKm91dCwgZmxvYXQgKmJ1ZiwgZmxvYXQgKmluLCBpbnQgY291bnQsIGludCBzd2l0Y2hfcG9pbnQsIGludCBibG9ja190eXBlKTtcCiB2b2lkIGZmX2ltZGN0MzZfZmxvYXRfICMjIENQVShmbG9hdCAqb3V0LCBmbG9hdCAqYnVmLCBmbG9hdCAqaW4sIGZsb2F0ICp3aW4pOwogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICNpZiBBUkNIX1g4Nl8zMgogREVDTChzc2UpCiAjZW5kaWYKQEAgLTM4LDcgKzM4LDcgQEAKIERFQ0woc3NlMykKIERFQ0woc3NzZTMpCiBERUNMKGF2eCkKLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogCiB2b2lkIGZmX2ZvdXJfaW1kY3QzNl9mbG9hdF9zc2UoZmxvYXQgKm91dCwgZmxvYXQgKmJ1ZiwgZmxvYXQgKmluLCBmbG9hdCAqd2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICp0bXBidWYpOwpAQCAtMTA5LDcgKzEwOSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGFwcGx5X3dpbmRvd19tcDMoZmxvYXQgKmluLCBmbG9hdCAqd2luLCBpbnQgKnVudXNlZCwgZmxvYXQgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluY3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbmNyKQogewogICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIHN1bWEsIFsxN10pOwogICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIHN1bWIsIFsxN10pOwpAQCAtMTkzLDcgKzE5Myw3IEBACiAKICNlbmRpZiAvKiBIQVZFXzZSRUdTICYmIEhBVkVfU1NFX0lOTElORSAqLwogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICNkZWZpbmUgREVDTF9JTURDVF9CTE9DS1MoQ1BVMSwgQ1BVMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiBzdGF0aWMgdm9pZCBpbWRjdDM2X2Jsb2Nrc18gIyMgQ1BVMShmbG9hdCAqb3V0LCBmbG9hdCAqYnVmLCBmbG9hdCAqaW4sICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IHN3aXRjaF9wb2ludCwgaW50IGJsb2NrX3R5cGUpIFwKQEAgLTIzNyw3ICsyMzcsNyBAQAogI2lmIEhBVkVfQVZYX0VYVEVSTkFMCiBERUNMX0lNRENUX0JMT0NLUyhhdngsYXZ4KQogI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIAogYXZfY29sZCB2b2lkIGZmX21wYWRzcF9pbml0X3g4NihNUEFEU1BDb250ZXh0ICpzKQogewpAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgfQogI2VuZGlmIC8qIEhBVkVfU1NFX0lOTElORSAqLwogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICNpZiBIQVZFX1NTRQogI2lmIEFSQ0hfWDg2XzMyCiAgICAgaWYgKEVYVEVSTkFMX1NTRShjcHVfZmxhZ3MpKSB7CkBAIC0yODUsNSArMjg1LDUgQEAKICAgICAgICAgcy0+aW1kY3QzNl9ibG9ja3NfZmxvYXQgPSBpbWRjdDM2X2Jsb2Nrc19hdng7CiAgICAgfQogI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlby5jIGIvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvLmMKaW5kZXggYWY0NzQyMi4uNzM5NjdjYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvLmMKKysrIGIvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogT3B0aW1pemVkIGZvciBpYTMyIENQVXMgYnkgTmljayBLdXJzaGV2IDxuaWNrb2xzX2tAbWFpbC5ydT4KLSAqIGgyNjMsIG1wZWcxLCBtcGVnMiBkZXF1YW50aXplciAmIGRyYXdfZWRnZXMgYnkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIEguMjYzLCBNUEVHLTEsIE1QRUctMiBkZXF1YW50aXplciAmIGRyYXdfZWRnZXMgYnkgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtNTEsNyArNTEsNyBAQAogICAgIGlmKHMtPmFjX3ByZWQpCiAgICAgICAgIG5Db2VmZnM9NjM7CiAgICAgZWxzZQotICAgICAgICBuQ29lZmZzPSBzLT5pbnRlcl9zY2FudGFibGUucmFzdGVyX2VuZFsgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSBdOworICAgICAgICBuQ29lZmZzPSBzLT5pbnRyYV9zY2FudGFibGUucmFzdGVyX2VuZFsgcy0+YmxvY2tfbGFzdF9pbmRleFtuXSBdOwogCiBfX2FzbV9fIHZvbGF0aWxlKAogICAgICAgICAgICAgICAgICJtb3ZkICUxLCAlJW1tNiAgICAgICAgICAgICAgICAgXG5cdCIgLy9xbXVsCkBAIC0xODAsNyArMTgwLDcgQEAKICAgICAgICAgYmxvY2swID0gYmxvY2tbMF0gKiBzLT55X2RjX3NjYWxlOwogICAgIGVsc2UKICAgICAgICAgYmxvY2swID0gYmxvY2tbMF0gKiBzLT5jX2RjX3NjYWxlOwotICAgIC8qIFhYWDogb25seSBtcGVnMSAqLworICAgIC8qIFhYWDogb25seSBNUEVHLTEgKi8KICAgICBxdWFudF9tYXRyaXggPSBzLT5pbnRyYV9tYXRyaXg7CiBfX2FzbV9fIHZvbGF0aWxlKAogICAgICAgICAgICAgICAgICJwY21wZXF3ICUlbW03LCAlJW1tNyAgICAgICAgICAgXG5cdCIKQEAgLTE4OCwxMyArMTg4LDEzIEBACiAgICAgICAgICAgICAgICAgIm1vdmQgJTIsICUlbW02ICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNiwgJSVtbTYgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdiAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgJTMsICUlIkZGX1JFR19hIiAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92cSA4KCUwLCAlJSJSRUdfYSIpLCAlJW1tMSAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tNCAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxIDgoJTEsICUlIlJFR19hIiksICUlbW01ICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19hIiksICUlbW0wIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgOCglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTFcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSA4KCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tNVxuXHQiCiAgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNiwgJSVtbTQgICAgICAgICAgICBcblx0IiAvLyBxPXFzY2FsZSpxdWFudF9tYXRyaXhbaV0KICAgICAgICAgICAgICAgICAicG11bGx3ICUlbW02LCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vIHE9cXNjYWxlKnF1YW50X21hdHJpeFtpXQogICAgICAgICAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKQEAgLTIwOSw4ICsyMDksOCBAQAogICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTUsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8gYWJzKGJsb2NrW2ldKSpxCiAgICAgICAgICAgICAgICAgInB4b3IgJSVtbTQsICUlbW00ICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJweG9yICUlbW01LCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLy8gRklYTUUgc2xvdwotICAgICAgICAgICAgICAgICJwY21wZXF3ICglMCwgJSUiUkVHX2EiKSwgJSVtbTQgXG5cdCIgLy8gYmxvY2tbaV0gPT0gMCA/IC0xIDogMAotICAgICAgICAgICAgICAgICJwY21wZXF3IDgoJTAsICUlIlJFR19hIiksICUlbW01XG5cdCIgLy8gYmxvY2tbaV0gPT0gMCA/IC0xIDogMAorICAgICAgICAgICAgICAgICJwY21wZXF3ICglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTQgXG5cdCIgLy8gYmxvY2tbaV0gPT0gMCA/IC0xIDogMAorICAgICAgICAgICAgICAgICJwY21wZXF3IDgoJTAsICUlIkZGX1JFR19hIiksICUlbW01XG5cdCIgLy8gYmxvY2tbaV0gPT0gMCA/IC0xIDogMAogICAgICAgICAgICAgICAgICJwc3JhdyAkMywgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHNyYXcgJDMsICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBzdWJ3ICUlbW03LCAlJW1tMCAgICAgICAgICAgICBcblx0IgpAQCAtMjIzLDEzICsyMjMsMTMgQEAKICAgICAgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBhbmRuICUlbW0wLCAlJW1tNCAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwYW5kbiAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92cSAlJW1tNCwgKCUwLCAlJSJSRUdfYSIpICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdnEgJSVtbTUsIDgoJTAsICUlIlJFR19hIikgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW00LCAoJTAsICUlIkZGX1JFR19hIikgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAlJW1tNSwgOCglMCwgJSUiRkZfUkVHX2EiKVxuXHQiCiAKLSAgICAgICAgICAgICAgICAiYWRkICQxNiwgJSUiUkVHX2EiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgImFkZCAkMTYsICUlIkZGX1JFR19hIiAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICA6OiJyIiAoYmxvY2srbkNvZWZmcyksICJyIihxdWFudF9tYXRyaXgrbkNvZWZmcyksICJybSIgKHFzY2FsZSksICJnIiAoLTIqbkNvZWZmcykKLSAgICAgICAgICAgICAgICA6ICIlIlJFR19hLCAibWVtb3J5IgorICAgICAgICAgICAgICAgIDogIiUiRkZfUkVHX2EsICJtZW1vcnkiCiAgICAgICAgICk7CiAgICAgYmxvY2tbMF09IGJsb2NrMDsKIH0KQEAgLTI1MSwxMyArMjUxLDEzIEBACiAgICAgICAgICAgICAgICAgIm1vdmQgJTIsICUlbW02ICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNiwgJSVtbTYgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdiAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgJTMsICUlIkZGX1JFR19hIiAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92cSA4KCUwLCAlJSJSRUdfYSIpLCAlJW1tMSAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tNCAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxIDgoJTEsICUlIlJFR19hIiksICUlbW01ICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19hIiksICUlbW0wIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgOCglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTFcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSA4KCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tNVxuXHQiCiAgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNiwgJSVtbTQgICAgICAgICAgICBcblx0IiAvLyBxPXFzY2FsZSpxdWFudF9tYXRyaXhbaV0KICAgICAgICAgICAgICAgICAicG11bGx3ICUlbW02LCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vIHE9cXNjYWxlKnF1YW50X21hdHJpeFtpXQogICAgICAgICAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKQEAgLTI3Niw4ICsyNzYsOCBAQAogICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTUsICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8gKGFicyhibG9ja1tpXSkqMiArIDEpKnEKICAgICAgICAgICAgICAgICAicHhvciAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInB4b3IgJSVtbTUsICUlbW01ICAgICAgICAgICAgICBcblx0IiAvLyBGSVhNRSBzbG93Ci0gICAgICAgICAgICAgICAgInBjbXBlcXcgKCUwLCAlJSJSRUdfYSIpLCAlJW1tNCBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCi0gICAgICAgICAgICAgICAgInBjbXBlcXcgOCglMCwgJSUiUkVHX2EiKSwgJSVtbTVcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBlcXcgKCUwLCAlJSJGRl9SRUdfYSIpLCAlJW1tNCBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBlcXcgOCglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTVcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCiAgICAgICAgICAgICAgICAgInBzcmF3ICQ0LCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwc3JhdyAkNCwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHN1YncgJSVtbTcsICUlbW0wICAgICAgICAgICAgIFxuXHQiCkBAIC0yOTAsMTMgKzI5MCwxMyBAQAogICAgICAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicGFuZG4gJSVtbTAsICUlbW00ICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBhbmRuICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxICUlbW00LCAoJTAsICUlIlJFR19hIikgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92cSAlJW1tNSwgOCglMCwgJSUiUkVHX2EiKSAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTQsICglMCwgJSUiRkZfUkVHX2EiKSBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW01LCA4KCUwLCAlJSJGRl9SRUdfYSIpXG5cdCIKIAotICAgICAgICAgICAgICAgICJhZGQgJDE2LCAlJSJSRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICQxNiwgJSUiRkZfUkVHX2EiICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgImpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgIDo6InIiIChibG9jaytuQ29lZmZzKSwgInIiKHF1YW50X21hdHJpeCtuQ29lZmZzKSwgInJtIiAocXNjYWxlKSwgImciICgtMipuQ29lZmZzKQotICAgICAgICAgICAgICAgIDogIiUiUkVHX2EsICJtZW1vcnkiCisgICAgICAgICAgICAgICAgOiAiJSJGRl9SRUdfYSwgIm1lbW9yeSIKICAgICAgICAgKTsKIH0KIApAQCAtMzI2LDEzICszMjYsMTMgQEAKICAgICAgICAgICAgICAgICAibW92ZCAlMiwgJSVtbTYgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNiwgJSVtbTYgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92ICUzLCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAlMywgJSUiRkZfUkVHX2EiICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICIucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMCAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxIDgoJTAsICUlIlJFR19hIiksICUlbW0xICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92cSAoJTEsICUlIlJFR19hIiksICUlbW00ICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdnEgOCglMSwgJSUiUkVHX2EiKSwgJSVtbTUgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSA4KCUwLCAlJSJGRl9SRUdfYSIpLCAlJW1tMVxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tNCBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxIDgoJTEsICUlIkZGX1JFR19hIiksICUlbW01XG5cdCIKICAgICAgICAgICAgICAgICAicG11bGx3ICUlbW02LCAlJW1tNCAgICAgICAgICAgIFxuXHQiIC8vIHE9cXNjYWxlKnF1YW50X21hdHJpeFtpXQogICAgICAgICAgICAgICAgICJwbXVsbHcgJSVtbTYsICUlbW01ICAgICAgICAgICAgXG5cdCIgLy8gcT1xc2NhbGUqcXVhbnRfbWF0cml4W2ldCiAgICAgICAgICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0yICAgICAgICAgICAgICBcblx0IgpAQCAtMzQ3LDggKzM0Nyw4IEBACiAgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNSwgJSVtbTEgICAgICAgICAgICBcblx0IiAvLyBhYnMoYmxvY2tbaV0pKnEKICAgICAgICAgICAgICAgICAicHhvciAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInB4b3IgJSVtbTUsICUlbW01ICAgICAgICAgICAgICBcblx0IiAvLyBGSVhNRSBzbG93Ci0gICAgICAgICAgICAgICAgInBjbXBlcXcgKCUwLCAlJSJSRUdfYSIpLCAlJW1tNCBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCi0gICAgICAgICAgICAgICAgInBjbXBlcXcgOCglMCwgJSUiUkVHX2EiKSwgJSVtbTVcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBlcXcgKCUwLCAlJSJGRl9SRUdfYSIpLCAlJW1tNCBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBlcXcgOCglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTVcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCiAgICAgICAgICAgICAgICAgInBzcmF3ICQ0LCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwc3JhdyAkNCwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCkBAIC0zNTcsMTMgKzM1NywxMyBAQAogICAgICAgICAgICAgICAgICJwc3VidyAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicGFuZG4gJSVtbTAsICUlbW00ICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBhbmRuICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxICUlbW00LCAoJTAsICUlIlJFR19hIikgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92cSAlJW1tNSwgOCglMCwgJSUiUkVHX2EiKSAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTQsICglMCwgJSUiRkZfUkVHX2EiKSBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW01LCA4KCUwLCAlJSJGRl9SRUdfYSIpXG5cdCIKIAotICAgICAgICAgICAgICAgICJhZGQgJDE2LCAlJSJSRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICQxNiwgJSUiRkZfUkVHX2EiICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgImpuZyAxYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgIDo6InIiIChibG9jaytuQ29lZmZzKSwgInIiKHF1YW50X21hdHJpeCtuQ29lZmZzKSwgInJtIiAocXNjYWxlKSwgImciICgtMipuQ29lZmZzKQotICAgICAgICAgICAgICAgIDogIiUiUkVHX2EsICJtZW1vcnkiCisgICAgICAgICAgICAgICAgOiAiJSJGRl9SRUdfYSwgIm1lbW9yeSIKICAgICAgICAgKTsKICAgICBibG9ja1swXT0gYmxvY2swOwogICAgICAgICAvL05vdGUsIHdlIGRvIG5vdCBkbyBtaXNtYXRjaCBjb250cm9sIGZvciBpbnRyYSBhcyBlcnJvcnMgY2Fubm90IGFjY3VtdWxhdGUKQEAgLTM5MCwxMyArMzkwLDEzIEBACiAgICAgICAgICAgICAgICAgIm1vdmQgJTIsICUlbW02ICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwYWNrc3NkdyAlJW1tNiwgJSVtbTYgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdiAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgJTMsICUlIkZGX1JFR19hIiAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92cSA4KCUwLCAlJSJSRUdfYSIpLCAlJW1tMSAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tNCAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxIDgoJTEsICUlIlJFR19hIiksICUlbW01ICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19hIiksICUlbW0wIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgOCglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTFcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSA4KCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tNVxuXHQiCiAgICAgICAgICAgICAgICAgInBtdWxsdyAlJW1tNiwgJSVtbTQgICAgICAgICAgICBcblx0IiAvLyBxPXFzY2FsZSpxdWFudF9tYXRyaXhbaV0KICAgICAgICAgICAgICAgICAicG11bGx3ICUlbW02LCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vIHE9cXNjYWxlKnF1YW50X21hdHJpeFtpXQogICAgICAgICAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIKQEAgLTQxNSw4ICs0MTUsOCBAQAogICAgICAgICAgICAgICAgICJwYWRkdyAlJW1tNSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLy8gKGFicyhibG9ja1tpXSkqMiArIDEpKnEKICAgICAgICAgICAgICAgICAicHhvciAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInB4b3IgJSVtbTUsICUlbW01ICAgICAgICAgICAgICBcblx0IiAvLyBGSVhNRSBzbG93Ci0gICAgICAgICAgICAgICAgInBjbXBlcXcgKCUwLCAlJSJSRUdfYSIpLCAlJW1tNCBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCi0gICAgICAgICAgICAgICAgInBjbXBlcXcgOCglMCwgJSUiUkVHX2EiKSwgJSVtbTVcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBlcXcgKCUwLCAlJSJGRl9SRUdfYSIpLCAlJW1tNCBcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCisgICAgICAgICAgICAgICAgInBjbXBlcXcgOCglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTVcblx0IiAvLyBibG9ja1tpXSA9PSAwID8gLTEgOiAwCiAgICAgICAgICAgICAgICAgInBzcmx3ICQ1LCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwc3JsdyAkNSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCkBAIC00MjcsMTAgKzQyNywxMCBAQAogICAgICAgICAgICAgICAgICJwYW5kbiAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHhvciAlJW1tNCwgJSVtbTcgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInB4b3IgJSVtbTUsICUlbW03ICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxICUlbW00LCAoJTAsICUlIlJFR19hIikgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92cSAlJW1tNSwgOCglMCwgJSUiUkVHX2EiKSAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdnEgJSVtbTQsICglMCwgJSUiRkZfUkVHX2EiKSBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICUlbW01LCA4KCUwLCAlJSJGRl9SRUdfYSIpXG5cdCIKIAotICAgICAgICAgICAgICAgICJhZGQgJDE2LCAlJSJSRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICQxNiwgJSUiRkZfUkVHX2EiICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgImpuZyAxYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJtb3ZkIDEyNCglMCwgJTMpLCAlJW1tMCAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAibW92cSAlJW1tNywgJSVtbTYgICAgICAgICAgICAgIFxuXHQiCkBAIC00NDUsNyArNDQ1LDcgQEAKICAgICAgICAgICAgICAgICAibW92ZCAlJW1tMCwgMTI0KCUwLCAlMykgICAgICAgIFxuXHQiCiAKICAgICAgICAgICAgICAgICA6OiJyIiAoYmxvY2srbkNvZWZmcyksICJyIihxdWFudF9tYXRyaXgrbkNvZWZmcyksICJybSIgKHFzY2FsZSksICJyIiAoLTIqbkNvZWZmcykKLSAgICAgICAgICAgICAgICA6ICIlIlJFR19hLCAibWVtb3J5IgorICAgICAgICAgICAgICAgIDogIiUiRkZfUkVHX2EsICJtZW1vcnkiCiAgICAgICAgICk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2RzcC5jIGIvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvZHNwLmMKaW5kZXggOTQxYThlMi4uNjAwOWI2NCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvZHNwLmMKKysrIGIvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvZHNwLmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9tcGVndmlkZW9kc3AuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL3ZpZGVvZHNwLmgiCkBAIC01Myw4ICs1Miw5IEBACiAgICAgY29uc3QgaW50IGR5aCA9IChkeXkgLSAoMSA8PCAoMTYgKyBzaGlmdCkpKSAqIChoIC0gMSk7CiAgICAgY29uc3QgaW50IGR4aCA9IGR4eSAqIChoIC0gMSk7CiAgICAgY29uc3QgaW50IGR5dyA9IGR5eCAqICh3IC0gMSk7Ci0gICAgaW50IG5lZWRfZW11ICA9ICAodW5zaWduZWQpIGl4ID49IHdpZHRoICAtIHcgfHwKLSAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgaXkgPj0gaGVpZ2h0IC0gaDsKKyAgICBpbnQgbmVlZF9lbXUgID0gICh1bnNpZ25lZCkgaXggPj0gd2lkdGggIC0gdyB8fCB3aWR0aCA8IHcgfHwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkgaXkgPj0gaGVpZ2h0IC0gaCB8fCBoZWlnaHQ8IGgKKyAgICAgICAgICAgICAgICAgICAgIDsKIAogICAgIGlmICggLy8gbm9uLWNvbnN0YW50IGZ1bGxwZWwgb2Zmc2V0ICgzJSBvZiBibG9ja3MpCiAgICAgICAgICgob3ggXiAob3ggKyBkeHcpKSB8IChveCBeIChveCArIGR4aCkpIHwgKG94IF4gKG94ICsgZHh3ICsgZHhoKSkgfApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvbXBlZ3ZpZGVvZW5jLmMgYi9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmMuYwppbmRleCA2N2IyNjE3Li5jODg0Y2YxIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmMuYworKysgYi9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmMuYwpAQCAtMjgsNyArMjgsMTYgQEAKICNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWd2aWRlby5oIgogCiAvKiBub3QgcGVybXV0YXRlZCBpbnZlcnNlIHppZ3phZ19kaXJlY3QgKyAxIGZvciBNTVggcXVhbnRpemVyICovCi1ERUNMQVJFX0FMSUdORUQoMTYsIHN0YXRpYyB1aW50MTZfdCwgaW52X3ppZ3phZ19kaXJlY3QxNilbNjRdOworREVDTEFSRV9BTElHTkVEKDE2LCBzdGF0aWMgY29uc3QgdWludDE2X3QsIGludl96aWd6YWdfZGlyZWN0MTYpWzY0XSA9IHsKKyAgICAxLCAgMiwgIDYsICA3LCAgMTUsIDE2LCAyOCwgMjksCisgICAgMywgIDUsICA4LCAgMTQsIDE3LCAyNywgMzAsIDQzLAorICAgIDQsICA5LCAgMTMsIDE4LCAyNiwgMzEsIDQyLCA0NCwKKyAgICAxMCwgMTIsIDE5LCAyNSwgMzIsIDQxLCA0NSwgNTQsCisgICAgMTEsIDIwLCAyNCwgMzMsIDQwLCA0NiwgNTMsIDU1LAorICAgIDIxLCAyMywgMzQsIDM5LCA0NywgNTIsIDU2LCA2MSwKKyAgICAyMiwgMzUsIDM4LCA0OCwgNTEsIDU3LCA2MCwgNjIsCisgICAgMzYsIDM3LCA0OSwgNTAsIDU4LCA1OSwgNjMsIDY0LAorfTsKIAogI2lmIEhBVkVfNlJFR1MKIApAQCAtMjA0LDEwICsyMTMsNiBAQAogYXZfY29sZCB2b2lkIGZmX2RjdF9lbmNvZGVfaW5pdF94ODYoTXBlZ0VuY0NvbnRleHQgKnMpCiB7CiAgICAgY29uc3QgaW50IGRjdF9hbGdvID0gcy0+YXZjdHgtPmRjdF9hbGdvOwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspCi0gICAgICAgIGludl96aWd6YWdfZGlyZWN0MTZbZmZfemlnemFnX2RpcmVjdFtpXV0gPSBpICsgMTsKIAogICAgIGlmIChkY3RfYWxnbyA9PSBGRl9EQ1RfQVVUTyB8fCBkY3RfYWxnbyA9PSBGRl9EQ1RfTU1YKSB7CiAjaWYgSEFWRV9NTVhfSU5MSU5FCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9tcGVndmlkZW9lbmNfdGVtcGxhdGUuYyBiL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuY190ZW1wbGF0ZS5jCmluZGV4IGRhNzY0NTkuLjEyMDFiZTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuY190ZW1wbGF0ZS5jCisrKyBiL2xpYmF2Y29kZWMveDg2L21wZWd2aWRlb2VuY190ZW1wbGF0ZS5jCkBAIC0xNTAsMzIgKzE1MCwzMiBAQAogICAgIGlmKChzLT5vdXRfZm9ybWF0ID09IEZNVF9IMjYzIHx8IHMtPm91dF9mb3JtYXQgPT0gRk1UX0gyNjEpICYmIHMtPm1wZWdfcXVhbnQ9PTApewogCiAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICAgICAibW92ZCAlJSJSRUdfYSIsICJNTSIzICAgICAgICAgICAgICBcblx0IiAvLyBsYXN0X25vbl96ZXJvX3AxCisgICAgICAgICAgICAibW92ZCAlJSJGRl9SRUdfYSIsICJNTSIzICAgICAgICAgICBcblx0IiAvLyBsYXN0X25vbl96ZXJvX3AxCiAgICAgICAgICAgICBTUFJFQURXKE1NIjMiKQogICAgICAgICAgICAgInB4b3IgIk1NIjcsICJNTSI3ICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAogICAgICAgICAgICAgInB4b3IgIk1NIjQsICJNTSI0ICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAogICAgICAgICAgICAgTU9WUSIgKCUyKSwgIk1NIjUgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gcW1hdFswXQogICAgICAgICAgICAgInB4b3IgIk1NIjYsICJNTSI2ICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwc3VidyAoJTMpLCAiTU0iNiAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIC1iaWFzWzBdCi0gICAgICAgICAgICAibW92ICQtMTI4LCAlJSJSRUdfYSIgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAkLTEyOCwgJSUiRkZfUkVHX2EiICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICIucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgTU9WUSIgKCUxLCAlJSJSRUdfYSIpLCAiTU0iMCAgICAgICAgXG5cdCIgLy8gYmxvY2tbaV0KKyAgICAgICAgICAgIE1PVlEiICglMSwgJSUiRkZfUkVHX2EiKSwgIk1NIjAgICAgIFxuXHQiIC8vIGJsb2NrW2ldCiAgICAgICAgICAgICBTQVZFX1NJR04oTU0iMSIsIE1NIjAiKSAgICAgICAgICAgICAgICAgICAvLyBBQlMoYmxvY2tbaV0pCiAgICAgICAgICAgICAicHN1YnVzdyAiTU0iNiwgIk1NIjAgICAgICAgICAgICAgICBcblx0IiAvLyBBQlMoYmxvY2tbaV0pICsgYmlhc1swXQogICAgICAgICAgICAgInBtdWxodyAiTU0iNSwgIk1NIjAgICAgICAgICAgICAgICAgXG5cdCIgLy8gKEFCUyhibG9ja1tpXSkqcW1hdFswXSAtIGJpYXNbMF0qcW1hdFswXSk+PjE2CiAgICAgICAgICAgICAicG9yICJNTSIwLCAiTU0iNCAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgUkVTVE9SRV9TSUdOKE1NIjEiLCBNTSIwIikgICAgICAgICAgICAgICAgLy8gb3V0PSgoQUJTKGJsb2NrW2ldKSpxbWF0WzBdIC0gYmlhc1swXSpxbWF0WzBdKT4+MTYpKnNpZ24oYmxvY2tbaV0pCi0gICAgICAgICAgICBNT1ZRIiAiTU0iMCwgKCU1LCAlJSJSRUdfYSIpICAgICAgICBcblx0IgorICAgICAgICAgICAgTU9WUSIgIk1NIjAsICglNSwgJSUiRkZfUkVHX2EiKSAgICAgXG5cdCIKICAgICAgICAgICAgICJwY21wZXF3ICJNTSI3LCAiTU0iMCAgICAgICAgICAgICAgIFxuXHQiIC8vIG91dD09MCA/IDB4RkYgOiAweDAwCi0gICAgICAgICAgICBNT1ZRIiAoJTQsICUlIlJFR19hIiksICJNTSIxICAgICAgICBcblx0IgotICAgICAgICAgICAgTU9WUSIgIk1NIjcsICglMSwgJSUiUkVHX2EiKSAgICAgICAgXG5cdCIgLy8gMAorICAgICAgICAgICAgTU9WUSIgKCU0LCAlJSJGRl9SRUdfYSIpLCAiTU0iMSAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVlEiICJNTSI3LCAoJTEsICUlIkZGX1JFR19hIikgICAgIFxuXHQiIC8vIDAKICAgICAgICAgICAgICJwYW5kbiAiTU0iMSwgIk1NIjAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICBQTUFYVyhNTSIwIiwgTU0iMyIpCi0gICAgICAgICAgICAiYWRkICQiTU1SRUdfV0lEVEgiLCAlJSJSRUdfYSIgICAgICBcblx0IgorICAgICAgICAgICAgImFkZCAkIk1NUkVHX1dJRFRIIiwgJSUiRkZfUkVHX2EiICAgXG5cdCIKICAgICAgICAgICAgICIganMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICBQTUFYKE1NIjMiLCBNTSIwIikKLSAgICAgICAgICAgICJtb3ZkICJNTSIzLCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAiTU0iMywgJSUiRkZfUkVHX2EiICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIm1vdnpibCAlJWFsLCAlJWVheCAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGFzdF9ub25femVyb19wMQogICAgICAgICAgICAgOiAiK2EiIChsYXN0X25vbl96ZXJvX3AxKQogICAgICAgICAgICAgOiAiciIgKGJsb2NrKzY0KSwgInIiIChxbWF0KSwgInIiIChiaWFzKSwKQEAgLTE4NSwzMSArMTg1LDMxIEBACiAgICAgICAgICk7CiAgICAgfWVsc2V7IC8vIEZNVF9IMjYzCiAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICAgICAibW92ZCAlJSJSRUdfYSIsICJNTSIzICAgICAgICAgICAgICBcblx0IiAvLyBsYXN0X25vbl96ZXJvX3AxCisgICAgICAgICAgICAibW92ZCAlJSJGRl9SRUdfYSIsICJNTSIzICAgICAgICAgICBcblx0IiAvLyBsYXN0X25vbl96ZXJvX3AxCiAgICAgICAgICAgICBTUFJFQURXKE1NIjMiKQogICAgICAgICAgICAgInB4b3IgIk1NIjcsICJNTSI3ICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAogICAgICAgICAgICAgInB4b3IgIk1NIjQsICJNTSI0ICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMAotICAgICAgICAgICAgIm1vdiAkLTEyOCwgJSUiUkVHX2EiICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgJC0xMjgsICUlIkZGX1JFR19hIiAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAiLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIE1PVlEiICglMSwgJSUiUkVHX2EiKSwgIk1NIjAgICAgICAgIFxuXHQiIC8vIGJsb2NrW2ldCisgICAgICAgICAgICBNT1ZRIiAoJTEsICUlIkZGX1JFR19hIiksICJNTSIwICAgICBcblx0IiAvLyBibG9ja1tpXQogICAgICAgICAgICAgU0FWRV9TSUdOKE1NIjEiLCBNTSIwIikgICAgICAgICAgICAgICAgICAgLy8gQUJTKGJsb2NrW2ldKQotICAgICAgICAgICAgTU9WUSIgKCUzLCAlJSJSRUdfYSIpLCAiTU0iNiAgICAgICAgXG5cdCIgLy8gYmlhc1swXQorICAgICAgICAgICAgTU9WUSIgKCUzLCAlJSJGRl9SRUdfYSIpLCAiTU0iNiAgICAgXG5cdCIgLy8gYmlhc1swXQogICAgICAgICAgICAgInBhZGR1c3cgIk1NIjYsICJNTSIwICAgICAgICAgICAgICAgXG5cdCIgLy8gQUJTKGJsb2NrW2ldKSArIGJpYXNbMF0KLSAgICAgICAgICAgIE1PVlEiICglMiwgJSUiUkVHX2EiKSwgIk1NIjUgICAgICAgIFxuXHQiIC8vIHFtYXRbaV0KKyAgICAgICAgICAgIE1PVlEiICglMiwgJSUiRkZfUkVHX2EiKSwgIk1NIjUgICAgIFxuXHQiIC8vIHFtYXRbaV0KICAgICAgICAgICAgICJwbXVsaHcgIk1NIjUsICJNTSIwICAgICAgICAgICAgICAgIFxuXHQiIC8vIChBQlMoYmxvY2tbaV0pKnFtYXRbMF0gKyBiaWFzWzBdKnFtYXRbMF0pPj4xNgogICAgICAgICAgICAgInBvciAiTU0iMCwgIk1NIjQgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgIFJFU1RPUkVfU0lHTihNTSIxIiwgTU0iMCIpICAgICAgICAgICAgICAgIC8vIG91dD0oKEFCUyhibG9ja1tpXSkqcW1hdFswXSAtIGJpYXNbMF0qcW1hdFswXSk+PjE2KSpzaWduKGJsb2NrW2ldKQotICAgICAgICAgICAgTU9WUSIgIk1NIjAsICglNSwgJSUiUkVHX2EiKSAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVlEiICJNTSIwLCAoJTUsICUlIkZGX1JFR19hIikgICAgIFxuXHQiCiAgICAgICAgICAgICAicGNtcGVxdyAiTU0iNywgIk1NIjAgICAgICAgICAgICAgICBcblx0IiAvLyBvdXQ9PTAgPyAweEZGIDogMHgwMAotICAgICAgICAgICAgTU9WUSIgKCU0LCAlJSJSRUdfYSIpLCAiTU0iMSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIE1PVlEiICJNTSI3LCAoJTEsICUlIlJFR19hIikgICAgICAgIFxuXHQiIC8vIDAKKyAgICAgICAgICAgIE1PVlEiICglNCwgJSUiRkZfUkVHX2EiKSwgIk1NIjEgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZRIiAiTU0iNywgKCUxLCAlJSJGRl9SRUdfYSIpICAgICBcblx0IiAvLyAwCiAgICAgICAgICAgICAicGFuZG4gIk1NIjEsICJNTSIwICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgUE1BWFcoTU0iMCIsIE1NIjMiKQotICAgICAgICAgICAgImFkZCAkIk1NUkVHX1dJRFRIIiwgJSUiUkVHX2EiICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgJCJNTVJFR19XSURUSCIsICUlIkZGX1JFR19hIiAgIFxuXHQiCiAgICAgICAgICAgICAiIGpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgUE1BWChNTSIzIiwgTU0iMCIpCi0gICAgICAgICAgICAibW92ZCAiTU0iMywgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgIk1NIjMsICUlIkZGX1JFR19hIiAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJtb3Z6YmwgJSVhbCwgJSVlYXggICAgICAgICAgICAgICAgIFxuXHQiIC8vIGxhc3Rfbm9uX3plcm9fcDEKICAgICAgICAgICAgIDogIithIiAobGFzdF9ub25femVyb19wMSkKICAgICAgICAgICAgIDogInIiIChibG9jays2NCksICJyIiAocW1hdCs2NCksICJyIiAoYmlhcys2NCksCkBAIC0zMjIsNyArMzIyLDcgQEAKICAgICAgICAgYmxvY2tbMHgzRV0gPSB0ZW1wX2Jsb2NrWzB4M0RdOyBibG9ja1sweDMzXSA9IHRlbXBfYmxvY2tbMHgzNl07CiAgICAgICAgIGJsb2NrWzB4MkZdID0gdGVtcF9ibG9ja1sweDJGXTsgYmxvY2tbMHgzN10gPSB0ZW1wX2Jsb2NrWzB4MzddOwogICAgICAgICBibG9ja1sweDNCXSA9IHRlbXBfYmxvY2tbMHgzRV07IGJsb2NrWzB4M0ZdID0gdGVtcF9ibG9ja1sweDNGXTsKLSAgICB9ZWxzZXsKKyAgICB9IGVsc2UgaWYgKHMtPmlkc3AucGVybV90eXBlID09IEZGX0lEQ1RfUEVSTV9OT05FKSB7CiAgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMSkgZ290byBlbmQ7CiAgICAgICAgIGJsb2NrWzB4MDFdID0gdGVtcF9ibG9ja1sweDAxXTsKICAgICAgICAgYmxvY2tbMHgwOF0gPSB0ZW1wX2Jsb2NrWzB4MDhdOyBibG9ja1sweDEwXSA9IHRlbXBfYmxvY2tbMHgxMF07CkBAIC0zNjYsNiArMzY2LDU3IEBACiAgICAgICAgIGJsb2NrWzB4M0RdID0gdGVtcF9ibG9ja1sweDNEXTsgYmxvY2tbMHgzNl0gPSB0ZW1wX2Jsb2NrWzB4MzZdOwogICAgICAgICBibG9ja1sweDJGXSA9IHRlbXBfYmxvY2tbMHgyRl07IGJsb2NrWzB4MzddID0gdGVtcF9ibG9ja1sweDM3XTsKICAgICAgICAgYmxvY2tbMHgzRV0gPSB0ZW1wX2Jsb2NrWzB4M0VdOyBibG9ja1sweDNGXSA9IHRlbXBfYmxvY2tbMHgzRl07CisgICAgfSBlbHNlIGlmIChzLT5pZHNwLnBlcm1fdHlwZSA9PSBGRl9JRENUX1BFUk1fVFJBTlNQT1NFKSB7CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMSkgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MDhdID0gdGVtcF9ibG9ja1sweDAxXTsKKyAgICAgICAgYmxvY2tbMHgwMV0gPSB0ZW1wX2Jsb2NrWzB4MDhdOyBibG9ja1sweDAyXSA9IHRlbXBfYmxvY2tbMHgxMF07CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gNCkgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MDldID0gdGVtcF9ibG9ja1sweDA5XTsgYmxvY2tbMHgxMF0gPSB0ZW1wX2Jsb2NrWzB4MDJdOworICAgICAgICBibG9ja1sweDE4XSA9IHRlbXBfYmxvY2tbMHgwM107CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gNykgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MTFdID0gdGVtcF9ibG9ja1sweDBBXTsgYmxvY2tbMHgwQV0gPSB0ZW1wX2Jsb2NrWzB4MTFdOworICAgICAgICBibG9ja1sweDAzXSA9IHRlbXBfYmxvY2tbMHgxOF07IGJsb2NrWzB4MDRdID0gdGVtcF9ibG9ja1sweDIwXTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSAxMSkgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MEJdID0gdGVtcF9ibG9ja1sweDE5XTsKKyAgICAgICAgYmxvY2tbMHgxMl0gPSB0ZW1wX2Jsb2NrWzB4MTJdOyBibG9ja1sweDE5XSA9IHRlbXBfYmxvY2tbMHgwQl07CisgICAgICAgIGJsb2NrWzB4MjBdID0gdGVtcF9ibG9ja1sweDA0XTsgYmxvY2tbMHgyOF0gPSB0ZW1wX2Jsb2NrWzB4MDVdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDE2KSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgyMV0gPSB0ZW1wX2Jsb2NrWzB4MENdOyBibG9ja1sweDFBXSA9IHRlbXBfYmxvY2tbMHgxM107CisgICAgICAgIGJsb2NrWzB4MTNdID0gdGVtcF9ibG9ja1sweDFBXTsgYmxvY2tbMHgwQ10gPSB0ZW1wX2Jsb2NrWzB4MjFdOworICAgICAgICBibG9ja1sweDA1XSA9IHRlbXBfYmxvY2tbMHgyOF07IGJsb2NrWzB4MDZdID0gdGVtcF9ibG9ja1sweDMwXTsKKyAgICAgICAgYmxvY2tbMHgwRF0gPSB0ZW1wX2Jsb2NrWzB4MjldOyBibG9ja1sweDE0XSA9IHRlbXBfYmxvY2tbMHgyMl07CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gMjQpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDFCXSA9IHRlbXBfYmxvY2tbMHgxQl07IGJsb2NrWzB4MjJdID0gdGVtcF9ibG9ja1sweDE0XTsKKyAgICAgICAgYmxvY2tbMHgyOV0gPSB0ZW1wX2Jsb2NrWzB4MERdOyBibG9ja1sweDMwXSA9IHRlbXBfYmxvY2tbMHgwNl07CisgICAgICAgIGJsb2NrWzB4MzhdID0gdGVtcF9ibG9ja1sweDA3XTsgYmxvY2tbMHgzMV0gPSB0ZW1wX2Jsb2NrWzB4MEVdOworICAgICAgICBibG9ja1sweDJBXSA9IHRlbXBfYmxvY2tbMHgxNV07IGJsb2NrWzB4MjNdID0gdGVtcF9ibG9ja1sweDFDXTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSAzMikgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MUNdID0gdGVtcF9ibG9ja1sweDIzXTsgYmxvY2tbMHgxNV0gPSB0ZW1wX2Jsb2NrWzB4MkFdOworICAgICAgICBibG9ja1sweDBFXSA9IHRlbXBfYmxvY2tbMHgzMV07IGJsb2NrWzB4MDddID0gdGVtcF9ibG9ja1sweDM4XTsKKyAgICAgICAgYmxvY2tbMHgwRl0gPSB0ZW1wX2Jsb2NrWzB4MzldOyBibG9ja1sweDE2XSA9IHRlbXBfYmxvY2tbMHgzMl07CisgICAgICAgIGJsb2NrWzB4MURdID0gdGVtcF9ibG9ja1sweDJCXTsgYmxvY2tbMHgyNF0gPSB0ZW1wX2Jsb2NrWzB4MjRdOworICAgICAgICBpZihsYXN0X25vbl96ZXJvX3AxIDw9IDQwKSBnb3RvIGVuZDsKKyAgICAgICAgYmxvY2tbMHgyQl0gPSB0ZW1wX2Jsb2NrWzB4MURdOyBibG9ja1sweDMyXSA9IHRlbXBfYmxvY2tbMHgxNl07CisgICAgICAgIGJsb2NrWzB4MzldID0gdGVtcF9ibG9ja1sweDBGXTsgYmxvY2tbMHgzQV0gPSB0ZW1wX2Jsb2NrWzB4MTddOworICAgICAgICBibG9ja1sweDMzXSA9IHRlbXBfYmxvY2tbMHgxRV07IGJsb2NrWzB4MkNdID0gdGVtcF9ibG9ja1sweDI1XTsKKyAgICAgICAgYmxvY2tbMHgyNV0gPSB0ZW1wX2Jsb2NrWzB4MkNdOyBibG9ja1sweDFFXSA9IHRlbXBfYmxvY2tbMHgzM107CisgICAgICAgIGlmKGxhc3Rfbm9uX3plcm9fcDEgPD0gNDgpIGdvdG8gZW5kOworICAgICAgICBibG9ja1sweDE3XSA9IHRlbXBfYmxvY2tbMHgzQV07IGJsb2NrWzB4MUZdID0gdGVtcF9ibG9ja1sweDNCXTsKKyAgICAgICAgYmxvY2tbMHgyNl0gPSB0ZW1wX2Jsb2NrWzB4MzRdOyBibG9ja1sweDJEXSA9IHRlbXBfYmxvY2tbMHgyRF07CisgICAgICAgIGJsb2NrWzB4MzRdID0gdGVtcF9ibG9ja1sweDI2XTsgYmxvY2tbMHgzQl0gPSB0ZW1wX2Jsb2NrWzB4MUZdOworICAgICAgICBibG9ja1sweDNDXSA9IHRlbXBfYmxvY2tbMHgyN107IGJsb2NrWzB4MzVdID0gdGVtcF9ibG9ja1sweDJFXTsKKyAgICAgICAgaWYobGFzdF9ub25femVyb19wMSA8PSA1NikgZ290byBlbmQ7CisgICAgICAgIGJsb2NrWzB4MkVdID0gdGVtcF9ibG9ja1sweDM1XTsgYmxvY2tbMHgyN10gPSB0ZW1wX2Jsb2NrWzB4M0NdOworICAgICAgICBibG9ja1sweDJGXSA9IHRlbXBfYmxvY2tbMHgzRF07IGJsb2NrWzB4MzZdID0gdGVtcF9ibG9ja1sweDM2XTsKKyAgICAgICAgYmxvY2tbMHgzRF0gPSB0ZW1wX2Jsb2NrWzB4MkZdOyBibG9ja1sweDNFXSA9IHRlbXBfYmxvY2tbMHgzN107CisgICAgICAgIGJsb2NrWzB4MzddID0gdGVtcF9ibG9ja1sweDNFXTsgYmxvY2tbMHgzRl0gPSB0ZW1wX2Jsb2NrWzB4M0ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJzLT5pZHNwLnBlcm1fdHlwZTogJWRcbiIsCisgICAgICAgICAgICAgICAgKGludClzLT5pZHNwLnBlcm1fdHlwZSk7CisgICAgICAgIGF2X2Fzc2VydDAocy0+aWRzcC5wZXJtX3R5cGUgPT0gRkZfSURDVF9QRVJNX05PTkUgfHwKKyAgICAgICAgICAgICAgICBzLT5pZHNwLnBlcm1fdHlwZSA9PSBGRl9JRENUX1BFUk1fTElCTVBFRzIgfHwKKyAgICAgICAgICAgICAgICBzLT5pZHNwLnBlcm1fdHlwZSA9PSBGRl9JRENUX1BFUk1fU0lNUExFIHx8CisgICAgICAgICAgICAgICAgcy0+aWRzcC5wZXJtX3R5cGUgPT0gRkZfSURDVF9QRVJNX1RSQU5TUE9TRSk7CiAgICAgfQogICAgIGVuZDoKICAgICByZXR1cm4gbGFzdF9ub25femVyb19wMSAtIDE7CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9vcHVzX2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9vcHVzX2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmOGE5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L29wdXNfZHNwX2luaXQuYwpAQCAtMCwwICsxLDQ1IEBACisvKgorICogT3B1cyBlbmNvZGVyIGFzc2VtYmx5IG9wdGltaXphdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMjAxNyBJdmFuIEthbHZhY2hldiA8aWthbHZhY2hldkBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9vcHVzX3B2cS5oIgorCitleHRlcm4gZmxvYXQgZmZfcHZxX3NlYXJjaF9hcHByb3hfc3NlMihmbG9hdCAqWCwgaW50ICp5LCBpbnQgSywgaW50IE4pOworZXh0ZXJuIGZsb2F0IGZmX3B2cV9zZWFyY2hfYXBwcm94X3NzZTQoZmxvYXQgKlgsIGludCAqeSwgaW50IEssIGludCBOKTsKK2V4dGVybiBmbG9hdCBmZl9wdnFfc2VhcmNoX2V4YWN0X2F2eCAgKGZsb2F0ICpYLCBpbnQgKnksIGludCBLLCBpbnQgTik7CisKK2F2X2NvbGQgdm9pZCBmZl9vcHVzX2RzcF9pbml0X3g4NihDZWx0UFZRICpzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNpZiBDT05GSUdfT1BVU19FTkNPREVSCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgcy0+cHZxX3NlYXJjaCA9IGZmX3B2cV9zZWFyY2hfYXBwcm94X3NzZTI7CisKKyAgICBpZiAoRVhURVJOQUxfU1NFNChjcHVfZmxhZ3MpKQorICAgICAgICBzLT5wdnFfc2VhcmNoID0gZmZfcHZxX3NlYXJjaF9hcHByb3hfc3NlNDsKKworICAgIGlmIChFWFRFUk5BTF9BVlhfRkFTVChjcHVfZmxhZ3MpKQorICAgICAgICBzLT5wdnFfc2VhcmNoID0gZmZfcHZxX3NlYXJjaF9leGFjdF9hdng7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L29wdXNfcHZxX3NlYXJjaC5hc20gYi9saWJhdmNvZGVjL3g4Ni9vcHVzX3B2cV9zZWFyY2guYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMWU2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni9vcHVzX3B2cV9zZWFyY2guYXNtCkBAIC0wLDAgKzEsMzg1IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTSU1EIG9wdGltaXplZCBPcHVzIGVuY29kZXIgRFNQIGZ1bmN0aW9uCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDE3IEl2YW4gS2FsdmFjaGV2IDxpa2FsdmFjaGV2QGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJjb25maWcuYXNtIgorJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKKyVpZmRlZiBfX05BU01fVkVSX18KKyV1c2UgInNtYXJ0YWxpZ24iCitBTElHTk1PREUgcDYKKyVlbmRpZgorCitTRUNUSU9OX1JPREFUQSA2NAorCitjb25zdF9mbG9hdF9hYnNfbWFzazogICB0aW1lcyA4IGRkIDB4N2ZmZmZmZmYKK2NvbnN0X2FsaWduX2Fic19lZGdlOiAgIHRpbWVzIDggZGQgMAorCitjb25zdF9mbG9hdF8wXzU6ICAgICAgICB0aW1lcyA4IGRkIDAuNQorY29uc3RfZmxvYXRfMTogICAgICAgICAgdGltZXMgOCBkZCAxLjAKK2NvbnN0X2Zsb2F0X3NpZ25fbWFzazogIHRpbWVzIDggZGQgMHg4MDAwMDAwMAorCitjb25zdF9pbnQzMl9vZmZzZXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgJXJlcCA4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkICQtY29uc3RfaW50MzJfb2Zmc2V0cworICAgICAgICAgICAgICAgICAgICAgICAgJWVuZHJlcAorU0VDVElPTiAudGV4dAorCis7Cis7ICAgU2V0dXAgSGlnaCBSZWdpc3RlciB0byBiZSB1c2VkCis7ICAgZm9yIGhvbGRpbmcgbWVtb3J5IGNvbnN0YW50cworOworOyAlMSAtIHRoZSByZWdpc3RlciB0byBiZSB1c2VkLCBhc3NtdWVzIGl0IGlzID49IG1tOAorOyAlMiAtIG5hbWUgb2YgdGhlIGNvbnN0YW50LgorOworOyBTdWJzZXF1ZW50IG9wY29kZXMgYXJlIGdvaW5nIHRvIHVzZSB0aGUgY29uc3RhbnQgaW4gdGhlIGZvcm0KKzsgImFkZHBzIG0wLCBtbV9jb25zdF9uYW1lIiBhbmQgaXQgd291bGQgYmUgdHVybmVkIGludG86Cis7ICJhZGRwcyBtMCwgW2NvbnN0X25hbWVdIiBvbiAzMiBiaXQgYXJjaCBvcgorOyAiYWRkcHMgbTAsIG04IiBvbiA2NCBiaXQgYXJjaAorJW1hY3JvIFNFVF9ISV9SRUdfTU1fQ09OU1RBTlQgMyA7IG1vdm9wLCByZWcsIGNvbnN0X25hbWUKKyVpZiBudW1fbW1yZWdzID4gOAorICAgICVkZWZpbmUgIG1tXyUzICAgJTIKKyAgICAlezF9ICAgICAgICAlMiwgWyUzXSAgICA7IG1vdmFwcyBtOCwgW2NvbnN0X25hbWVdCislZWxzZQorICAgICVkZWZpbmUgIG1tXyUzICBbJTNdCislZW5kaWYKKyVlbmRtYWNybworCis7Cis7ICAgU2V0IFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUKKzsgICAgICAgQmFzZSBhZGRyZXNzIG9mIGEgY29uc3RhbnQKKzsgJTEgLSB0aGUgcmVnaXN0ZXIgdG8gYmUgdXNlZCwgaWYgUElDIGlzIHNldAorOyAlMiAtIG5hbWUgb2YgdGhlIGNvbnN0YW50LgorOworOyBTdWJzZXF1ZW50IG9wY29kZSBhcmUgZ29pbmcgdG8gdXNlIHRoZSBiYXNlIGFkZHJlc3MgaW4gdGhlIGZvcm0KKzsgIm1vdmFwcyBtMCwgW3BpY19iYXNlX2NvbnN0YW50X25hbWUrcjRdIiBhbmQgaXQgd291bGQgYmUgdHVybmVkIGludG8KKzsgIm1vdmFwcyBtMCwgW3I1ICsgcjRdIiBpZiBQSUMgaXMgZW5hYmxlZAorOyAibW92YXBzIG0wLCBbY29uc3RhbnRfbmFtZSArIHI0XSIgaWYgdGV4cmVsIGFyZSB1c2VkCislbWFjcm8gU0VUX1BJQ19CQVNFIDM7IHJlZywgY29uc3RfbGFiZWwKKyVpZmRlZiBQSUMKKyAgICAlezF9ICAgICAlMiwgWyUzXSAgICAgIDsgbGVhIHI1LCBbcmlwK2NvbnN0XQorICAgICVkZWZpbmUgIHBpY19iYXNlXyUzICUyCislZWxzZQorICAgICVkZWZpbmUgIHBpY19iYXNlXyUzICUzCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gUFVMU0VTX1NFQVJDSCAxCis7IG02IFN5eV9ub3JtCis7IG03IFN4eV9ub3JtCisgICAgYWRkcHMgICAgICAgICAgbTYsIG1tX2NvbnN0X2Zsb2F0XzBfNSAgIDsgU3l5X25vcm0gKz0gMS4wLzIKKyAgICBweG9yICAgICAgICAgICBtMSwgbTEgICAgICAgICAgICAgICAgICAgOyBtYXhfaWR4CisgICAgeG9ycHMgICAgICAgICAgbTMsIG0zICAgICAgICAgICAgICAgICAgIDsgcF9tYXgKKyAgICB4b3IgICAgICAgICAgIHI0ZCwgcjRkCithbGlnbiAxNgorJSVkaXN0b3J0aW9uX3NlYXJjaDoKKyAgICBtb3ZkICAgICAgICAgIHhtMiwgZHdvcmQgcjRkICAgIDsgbW92ZCB6ZXJvIGV4dGVuZHMKKyVpZmlkbiAlMSxhZGQKKyAgICBtb3ZhcHMgICAgICAgICBtNCwgW3RtcFkgKyByNF0gIDsgeVtpXQorICAgIG1vdmFwcyAgICAgICAgIG01LCBbdG1wWCArIHI0XSAgOyBYW2ldCisKKyAgJWlmIFVTRV9BUFBST1hJTUFUSU9OID09IDEKKyAgICB4b3JwcyAgICAgICAgICBtMCwgbTAKKyAgICBjbXBwcyAgICAgICAgICBtMCwgbTAsIG01LCA0ICAgIDsgbTAgPSAoWFtpXSAhPSAwLjApCisgICVlbmRpZgorCisgICAgYWRkcHMgICAgICAgICAgbTQsIG02ICAgICAgICAgICA7IG00ID0gU3l5X25ldyA9IHlbaV0gKyBTeXlfbm9ybQorICAgIGFkZHBzICAgICAgICAgIG01LCBtNyAgICAgICAgICAgOyBtNSA9IFN4eV9uZXcgPSBYW2ldICsgU3h5X25vcm0KKworICAlaWYgVVNFX0FQUFJPWElNQVRJT04gPT0gMQorICAgIGFuZHBzICAgICAgICAgIG01LCBtMCAgICAgICAgICAgOyBpZihYW2ldID09IDApIFN4eV9uZXcgPSAwOyBQcmV2ZW50IGFwcm94aW1hdGlvbiBlcnJvciBmcm9tIHNldHRpbmcgcHVsc2VzIGluIGFycmF5IHBhZGRpbmcuCisgICVlbmRpZgorCislZWxzZQorICAgIG1vdmFwcyAgICAgICAgIG01LCBbdG1wWSArIHI0XSAgICAgIDsgbTUgPSB5W2ldCisKKyAgICB4b3JwcyAgICAgICAgICBtMCwgbTAgICAgICAgICAgICAgICA7IG0wID0gMDsKKyAgICBjbXBwcyAgICAgICAgICBtMCwgbTAsIG01LCAxICAgICAgICA7IG0wID0gKDA8eSkKKworICAgIHN1YnBzICAgICAgICAgIG00LCBtNiwgbTUgICAgICAgICAgIDsgbTQgPSBTeXlfbmV3ID0gU3l5X25vcm0gLSB5W2ldCisgICAgc3VicHMgICAgICAgICAgbTUsIG03LCBbdG1wWCArIHI0XSAgOyBtNSA9IFN4eV9uZXcgPSBTeHlfbm9ybSAtIFhbaV0KKyAgICBhbmRwcyAgICAgICAgICBtNSwgbTAgICAgICAgICAgICAgICA7ICgwPHkpP201OjAKKyVlbmRpZgorCislaWYgVVNFX0FQUFJPWElNQVRJT04gPT0gMQorICAgIHJzcXJ0cHMgICAgICAgIG00LCBtNAorICAgIG11bHBzICAgICAgICAgIG01LCBtNCAgICAgICAgICAgOyBtNSA9IHAgPSBTeHlfbmV3KmFwcHJveCgxL3NxcnQoU3l5KSApCislZWxzZQorICAgIG11bHBzICAgICAgICAgIG01LCBtNQorICAgIGRpdnBzICAgICAgICAgIG01LCBtNCAgICAgICAgICAgOyBtNSA9IHAgPSBTeHlfbmV3KlN4eV9uZXcvU3l5CislZW5kaWYKKyAgICBWUEJST0FEQ0FTVEQgICBtMiwgeG0yICAgICAgICAgIDsgbTI9aSAoYWxsIGxhbmVzIGdldCBzYW1lIHZhbHVlcywgd2UgYWRkIHRoZSBvZmZzZXQtcGVyLWxhbmUsIGxhdGVyKQorCisgICAgY21wcHMgICAgICAgICAgbTAsIG0zLCBtNSwgMSAgICA7IG0wID0gKG0zIDwgbTUpIDsgKHBfbWF4IDwgcCkgOyAocCA+IHBfbWF4KQorICAgIG1heHBzICAgICAgICAgIG0zLCBtNSAgICAgICAgICAgOyBtMz1tYXgocF9tYXgscCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbWF4cHMgaGVyZSBpcyBmYXN0ZXIgdGhhbiBibGVuZHZwcywgZGVzcGl0ZSBibGVuZCBoYXZpbmcgbG93ZXIgbGF0ZW5jeS4KKworICAgIHBhbmQgICAgICAgICAgIG0yLCBtMCAgICAgICAgICAgOyBUaGlzIHZlcnNpb24gc2VlbXMgZmFzdGVyIHRoYW4gc3NlNDEgcGJsZW5kdmIKKyAgICBwbWF4c3cgICAgICAgICBtMSwgbTIgICAgICAgICAgIDsgU1NFMiBzaWduZWQgd29yZCwgc28gaXQgd291bGQgd29yayBmb3IgTiA8IDMyNzY4LzQKKworICAgIGFkZCAgICAgICAgICAgcjRkLCBtbXNpemUKKyAgICBjbXAgICAgICAgICAgIHI0ZCwgTmQKKyAgICBqYiAgICUlZGlzdG9ydGlvbl9zZWFyY2gKKworICAgIHBvciAgICAgICAgICAgIG0xLCBtbV9jb25zdF9pbnQzMl9vZmZzZXRzICA7IG1heF9pZHggb2Zmc2V0cyBwZXIgaW5kaXZpZHVhbCBsYW5lIChza2lwcGVkIGluIHRoZSBpbm5lciBsb29wKQorICAgIG1vdmRxYSAgICAgICAgIG00LCBtMSAgICAgICAgICAgICAgICAgICAgICA7IG5lZWRlZCBmb3IgdGhlIGFsaWduZWQgeVttYXhfaWR4XSs9MTsgcHJvY2Vzc2luZworCislaWYgbW1zaXplID49IDMyCis7IE1lcmdlIHBhcmFsbGVsIG1heGltdW1zIHJvdW5kIDggKDQgdnMgNCkKKworICAgIHZleHRyYWN0ZjEyOCAgeG01LCB5bTMsIDEgICAgICAgOyB4bW01ID0geW1tM1sxeDEyOF0gPSB5bW0zWzI1NS4uMTI4Yl0KKyAgICBjbXBwcyAgICAgICAgIHhtMCwgeG0zLCB4bTUsIDEgIDsgbTAgPSAobTMgPCBtNSkgPSAoIHBbMHgxMjhdIDwgcFsxeDEyOF0gKQorCisgICAgdmV4dHJhY3RpMTI4ICB4bTIsIHltMSwgMSAgICAgICA7IHhtbTIgPSB5bW0xWzF4MTI4XSA9IHltbTFbMjU1Li4xMjhiXQorICAgIEJMRU5EVlBTICAgICAgeG0zLCB4bTUsIHhtMCAgICAgOyBtYXhfaWR4ID0gbTAgPyBtYXhfaWR4WzF4MTI4XSA6IG1heF9pZHhbMHgxMjhdCisgICAgUEJMRU5EVkIgICAgICB4bTEsIHhtMiwgeG0wICAgICA7IHAgICAgICAgPSBtMCA/IHBbMXgxMjhdICAgICAgIDogcFsweDEyOF0KKyVlbmRpZgorCis7IE1lcmdlIHBhcmFsbGVsIG1heGltdW1zIHJvdW5kIDQgKDIgdnMgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTM9cFszMjEwXQorICAgIG1vdmhscHMgICAgICAgeG01LCB4bTMgICAgICAgICAgOyBtNT1wW3h4MzJdCisgICAgY21wcHMgICAgICAgICB4bTAsIHhtMywgeG01LCAxICA7IG0wID0gKG0zIDwgbTUpID0gKCBwWzEsMF0gPCBwWzMsMl0gKQorCisgICAgcHNodWZkICAgICAgICB4bTIsIHhtMSwgcTMyMzIKKyAgICBCTEVORFZQUyAgICAgIHhtMywgeG01LCB4bTAgICAgIDsgbWF4X2lkeCA9IG0wID8gbWF4X2lkeFszLDJdIDogbWF4X2lkeFsxLDBdCisgICAgUEJMRU5EVkIgICAgICB4bTEsIHhtMiwgeG0wICAgICA7IHAgICAgICAgPSBtMCA/IHBbMywyXSAgICAgICA6IHBbMSwwXQorCis7IE1lcmdlIHBhcmFsbGVsIG1heGltdW1zIGZpbmFsIHJvdW5kICgxIHZzIDEpCisgICAgc2h1ZnBzICAgICAgICB4bTAsIHhtMywgeG0zLCBxMTExMSAgOyBtMCA9IG0zWzFdID0gcFsxXQorICAgIGNtcHNzICAgICAgICAgeG0wLCB4bTMsIDUgICAgICAgICAgIDsgbTAgPSAhKG0wID49IG0zKSA9ICEoIHBbMV0gPj0gcFswXSApCisKKyAgICBwc2h1ZmQgICAgICAgIHhtMiwgeG0xLCBxMTExMQorICAgIFBCTEVORFZCICAgICAgeG0xLCB4bTIsIHhtMAorCisgICAgbW92ZCAgICBkd29yZCByNGQsIHhtMSAgICAgICAgICA7IHplcm8gZXh0ZW5kcyB0byB0aGUgcmVzdCBvZiByNHEKKworICAgIFZCUk9BRENBU1RTUyAgIG0zLCBbdG1wWCArIHI0XQorICAgICV7MX1wcyAgICAgICAgIG03LCBtMyAgICAgICAgICAgOyBTeHkgKz0gWFttYXhfaWR4XQorCisgICAgVkJST0FEQ0FTVFNTICAgbTUsIFt0bXBZICsgcjRdCisgICAgJXsxfXBzICAgICAgICAgbTYsIG01ICAgICAgICAgICA7IFN5eSArPSBZW21heF9pZHhdCisKKyAgICA7IFdlIGhhdmUgdG8gdXBkYXRlIGEgc2luZ2xlIGVsZW1lbnQgaW4gWVtpXQorICAgIDsgSG93ZXZlciB3cml0aW5nIDQgYnl0ZXMgYW5kIHRoZW4gZG9pbmcgMTYgYnl0ZSBsb2FkIGluIHRoZSBpbm5lciBsb29wCisgICAgOyBjb3VsZCBjYXVzZSBhIHN0YWxsIGR1ZSB0byBicmVha2luZyB3cml0ZSBmb3J3YXJkaW5nLgorICAgIFZQQlJPQURDQVNURCAgIG0xLCB4bTEKKyAgICBwY21wZXFkICAgICAgICBtMSwgbTEsIG00ICAgICAgICAgICA7IGV4YWN0bHkgMSBlbGVtZW50IG1hdGNoZXMgbWF4X2lkeCBhbmQgdGhpcyBmaW5kcyBpdAorCisgICAgYW5kICAgICAgICAgICByNGQsIH4obW1zaXplLTEpICAgICAgOyBhbGlnbiBhZGRyZXNzIGRvd24sIHNvIHRoZSB2YWx1ZSBwb2ludGVkIGJ5IG1heF9pZHggaXMgaW5zaWRlIGEgbW1zaXplIGxvYWQKKyAgICBtb3ZhcHMgICAgICAgICBtNSwgW3RtcFkgKyByNF0gICAgICA7IG01ID0gWVt5My4uLnltLi4ueTBdCisgICAgYW5kcHMgICAgICAgICAgbTEsIG1tX2NvbnN0X2Zsb2F0XzEgOyBtMSA9ICBbIDAuLi4xLjAuLi4wXQorICAgICV7MX1wcyAgICAgICAgIG01LCBtMSAgICAgICAgICAgICAgIDsgbTUgPSBZW3kzLi4ueW0uLi55MF0gKy8tIFswLi4uMS4wLi4uMF0KKyAgICBtb3ZhcHMgW3RtcFkgKyByNF0sIG01ICAgICAgICAgICAgICA7IFlbbWF4X2lkeF0gKy09IDEuMDsKKyVlbmRtYWNybworCis7Cis7IFdlIG5lZWQgb25lIG1vcmUgcmVnaXN0ZXIgZm9yCis7IFBJQyByZWxhdGl2ZSBhZGRyZXNzaW5nLiBVc2UgdGhpcworOyB0byBjb3VudCBpdCBpbiBjZ2xvYmFsCis7CislaWZkZWYgUElDCisgICVkZWZpbmUgbnVtX3BpY19yZWdzIDEKKyVlbHNlCisgICVkZWZpbmUgbnVtX3BpY19yZWdzIDAKKyVlbmRpZgorCis7Cis7IFB5cmFtaWQgVmVjdG9yIFF1YW50aXphdGlvbiBTZWFyY2ggaW1wbGVtZW50YXRpb24KKzsKKzsgZmxvYXQgKiBpblggICAtIFVuYWxpZ25lZCAoU0lNRCkgYWNjZXNzLCBpdCB3aWxsIGJlIG92ZXJyZWFkLAorOyAgICAgICAgICAgICAgICAgYnV0IGV4dHJhIGRhdGEgaXMgbWFza2VkIGF3YXkuCis7IGludDMyICogb3V0WSAgLSBTaG91bGQgYmUgYWxpZ25lZCBhbmQgcGFkZGVkIGJ1ZmZlci4KKzsgICAgICAgICAgICAgICAgIEl0IGlzIHVzZWQgYXMgdGVtcCBidWZmZXIuCis7IHVpbnQzMiBLICAgICAgLSBOdW1iZXIgb2YgcHVsc2VzIHRvIGhhdmUgYWZ0ZXIgcXVhbnRpemF0aW9ucy4KKzsgdWludDMyIE4gICAgICAtIE51bWJlciBvZiB2ZWN0b3IgZWxlbWVudHMuIE11c3QgYmUgMCA8IE4gPCAyNTYKKzsKKyVtYWNybyBQVlFfRkFTVF9TRUFSQ0ggMQorY2dsb2JhbCBwdnFfc2VhcmNoJTEsIDQsIDUrbnVtX3BpY19yZWdzLCAxMSwgMjU2KjQsIGluWCwgb3V0WSwgSywgTgorJWRlZmluZSB0bXBYIHJzcAorJWRlZmluZSB0bXBZIG91dFlxCisKKyAgICBtb3ZhcHMgICAgIG0wLCBbY29uc3RfZmxvYXRfYWJzX21hc2tdCisgICAgc2hsICAgICAgICBOZCwgMiAgICA7IE4gKj0gc2l6ZW9mKGZsb2F0KTsgYWxzbyAzMiBiaXQgb3BlcmF0aW9uIHplcm9lcyB0aGUgaGlnaCAzMiBiaXRzIGluIDY0IGJpdCBtb2RlLgorICAgIG1vdiAgICAgICByNGQsIE5kCisKKyAgICBuZWcgICAgICAgcjRkCisgICAgYW5kICAgICAgIHI0ZCwgbW1zaXplLTEKKworICAgIFNFVF9QSUNfQkFTRSBsZWEsIHI1LCBjb25zdF9hbGlnbl9hYnNfZWRnZSAgOyByaXArY29uc3QKKyAgICBtb3Z1cHMgICAgIG0yLCBbcGljX2Jhc2VfY29uc3RfYWxpZ25fYWJzX2VkZ2UgKyByNCAtIG1tc2l6ZV0KKworICAgIGFkZCAgICAgICAgTmQsIHI0ZCAgICAgICAgICAgICAgOyBOID0gYWxpZ24oTiwgbW1zaXplKQorCisgICAgbGVhICAgICAgIHI0ZCwgW05kIC0gbW1zaXplXSAgICA7IE4gaXMgcm91bmRlZCB1cCAoYWxpZ25lZCB1cCkgdG8gbW1zaXplLCBzbyByNCBjYW4ndCBiZWNvbWUgbmVnYXRpdmUgaGVyZSwgdW5sZXNzIE49MC4KKyAgICBtb3Z1cHMgICAgIG0xLCBbaW5YcSArIHI0XQorICAgIGFuZHBzICAgICAgbTEsIG0yCisgICAgbW92YXBzICBbdG1wWCArIHI0XSwgbTEgICAgICAgICA7IFN4ID0gYWJzKCBYW04tMV0gKQorCithbGlnbiAxNgorJSVsb29wX2Fic19zdW06CisgICAgc3ViICAgICAgIHI0ZCwgbW1zaXplCisgICAgamMgICAlJWVuZF9sb29wX2Fic19zdW0KKworICAgIG1vdnVwcyAgICAgbTIsIFtpblhxICsgcjRdCisgICAgYW5kcHMgICAgICBtMiwgbTAKKworICAgIG1vdmFwcyAgW3RtcFggKyByNF0sIG0yIDsgdG1wWFtpXT1hYnMoWFtpXSkKKyAgICBhZGRwcyAgICAgIG0xLCBtMiAgICAgICA7IFN4ICs9IGFicyhYW2ldKQorICAgIGptcCAgJSVsb29wX2Fic19zdW0KKworYWxpZ24gMTYKKyUlZW5kX2xvb3BfYWJzX3N1bToKKworICAgIEhTVU1QUyAgICAgbTEsIG0yICAgICAgIDsgbTEgID0gU3gKKworICAgIHhvcnBzICAgICAgbTAsIG0wCisgICAgY29taXNzICAgIHhtMCwgeG0xICAgICAgOworICAgIGp6ICAgJSV6ZXJvX2lucHV0ICAgICAgIDsgaWYgKFN4PT0wKSBnb3RvIHplcm9faW5wdXQKKworICAgIGN2dHNpMnNzICB4bTAsIGR3b3JkIEtkIDsgbTAgPSBLCislaWYgVVNFX0FQUFJPWElNQVRJT04gPT0gMQorICAgIHJjcHNzICAgICB4bTEsIHhtMSAgICAgIDsgbTEgPSBhcHByb3goMS9TeCkKKyAgICBtdWxzcyAgICAgeG0wLCB4bTEgICAgICA7IG0wID0gSyooMS9TeCkKKyVlbHNlCisgICAgZGl2c3MgICAgIHhtMCwgeG0xICAgICAgOyBiID0gSy9TeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgYiA9IEsvbWF4X3gKKyVlbmRpZgorCisgICAgVkJST0FEQ0FTVFNTICBtMCwgeG0wCisKKyAgICBsZWEgICAgICAgcjRkLCBbTmQgLSBtbXNpemVdCisgICAgcHhvciAgICAgICBtNSwgbTUgICAgICAgICAgICAgOyBTeSAgICAoIFN1bSBvZiBhYnMoIHlbaV0pICkKKyAgICB4b3JwcyAgICAgIG02LCBtNiAgICAgICAgICAgICA7IFN5eSAgICggU3VtIG9mIHlbaV0qeVtpXSAgKQorICAgIHhvcnBzICAgICAgbTcsIG03ICAgICAgICAgICAgIDsgU3h5ICAgKCBTdW0gb2YgWFtpXSp5W2ldICApCithbGlnbiAxNgorJSVsb29wX2d1ZXNzOgorICAgIG1vdmFwcyAgICAgbTEsIFt0bXBYICsgcjRdICAgIDsgbTEgICA9IFhbaV0KKyAgICBtdWxwcyAgICAgIG0yLCBtMCwgbTEgICAgICAgICA7IG0yICAgPSByZXMqWFtpXQorICAgIGN2dHBzMmRxICAgbTIsIG0yICAgICAgICAgICAgIDsgeXQgICA9IChpbnQpbHJpbnRmKCByZXMqWFtpXSApCisgICAgcGFkZGQgICAgICBtNSwgbTIgICAgICAgICAgICAgOyBTeSAgKz0geXQKKyAgICBjdnRkcTJwcyAgIG0yLCBtMiAgICAgICAgICAgICA7IHl0ICAgPSAoZmxvYXQpeXQKKyAgICBtdWxwcyAgICAgIG0xLCBtMiAgICAgICAgICAgICA7IG0xICAgPSBYW2ldKnl0CisgICAgbW92YXBzICBbdG1wWSArIHI0XSwgbTIgICAgICAgOyB5W2ldID0gbTIKKyAgICBhZGRwcyAgICAgIG03LCBtMSAgICAgICAgICAgICA7IFN4eSArPSBtMTsKKyAgICBtdWxwcyAgICAgIG0yLCBtMiAgICAgICAgICAgICA7IG0yICAgPSB5dCp5dAorICAgIGFkZHBzICAgICAgbTYsIG0yICAgICAgICAgICAgIDsgU3l5ICs9IG0yCisKKyAgICBzdWIgICAgICAgcjRkLCBtbXNpemUKKyAgICBqbmMgICUlbG9vcF9ndWVzcworCisgICAgSFNVTVBTICAgICBtNiwgbTEgICAgICAgOyBTeXlfbm9ybQorICAgIEhBREREICAgICAgbTUsIG00ICAgICAgIDsgcHVsc2VzCisKKyAgICBtb3ZkICBkd29yZCByNGQsIHhtNSAgICA7IHplcm8gZXh0ZW5kcyB0byB0aGUgcmVzdCBvZiByNHEKKworICAgIHN1YiAgICAgICAgS2QsIHI0ZCAgICAgIDsgSyAtPSBwdWxzZXMgLCBhbHNvIDMyIGJpdCBvcGVyYXRpb24gemVyb2VzIGhpZ2ggMzIgYml0IGluIDY0IGJpdCBtb2RlLgorICAgIGp6ICAgJSVmaW5pc2ggICAgICAgICAgIDsgSyAtIHB1bHNlcyA9PSAwCisKKyAgICBTRVRfSElfUkVHX01NX0NPTlNUQU5UIG1vdmFwcywgIG04LCBjb25zdF9mbG9hdF8wXzUKKyAgICBTRVRfSElfUkVHX01NX0NPTlNUQU5UIG1vdmFwcywgIG05LCBjb25zdF9mbG9hdF8xCisgICAgU0VUX0hJX1JFR19NTV9DT05TVEFOVCBtb3ZkcWEsIG0xMCwgY29uc3RfaW50MzJfb2Zmc2V0cworICAgIDsgVXNlIFN5eS8yIGluIGRpc3RvcnRpb24gcGFyYW1ldGVyIGNhbGN1bGF0aW9ucy4KKyAgICA7IFNhdmVzIHByZSBhbmQgcG9zdC1jYWNsdWxhdGlvbiB0byBjb3JyZWN0IFlbXSB2YWx1ZXMuCisgICAgOyBTYW1lIHByZWNpc2lvbiwgc2luY2UgZmxvYXQgbWFudGlzYSBpcyBub3JtYWxpemVkLgorICAgIDsgVGhlIFNRUlQgYXBwcm94aW1hdGlvbiBkb2VzIGRpZmZlci4KKyAgICBIU1VNUFMgICAgIG03LCBtMCAgICAgICAgIDsgU3h5X25vcm0KKyAgICBtdWxwcyAgICAgIG02LCBtbV9jb25zdF9mbG9hdF8wXzUKKworICAgIGpjICAgJSVyZW1vdmVfcHVsc2VzX2xvb3AgICA7IEsgLSBwdWxzZXMgPCAwCisKK2FsaWduIDE2ICAgICAgICAgICAgICAgICAgICAgICAgOyBLIC0gcHVsc2VzID4gMAorJSVhZGRfcHVsc2VzX2xvb3A6CisKKyAgICBQVUxTRVNfU0VBUkNIIGFkZCAgIDsgbTYgU3l5X25vcm0gOyBtNyBTeHlfbm9ybQorCisgICAgc3ViICAgICAgICBLZCwgMQorICAgIGpueiAgJSVhZGRfcHVsc2VzX2xvb3AKKworICAgIGFkZHBzICAgICAgbTYsIG02IDsgU3l5Kj0yCisKKyAgICBqbXAgICUlZmluaXNoCisKK2FsaWduIDE2CislJXJlbW92ZV9wdWxzZXNfbG9vcDoKKworICAgIFBVTFNFU19TRUFSQ0ggc3ViICAgOyBtNiBTeXlfbm9ybSA7IG03IFN4eV9ub3JtCisKKyAgICBhZGQgICAgICAgIEtkLCAxCisgICAgam56ICAlJXJlbW92ZV9wdWxzZXNfbG9vcAorCisgICAgYWRkcHMgICAgICBtNiwgbTYgOyBTeXkqPTIKKworYWxpZ24gMTYKKyUlZmluaXNoOgorICAgIGxlYSAgICAgICByNGQsIFtOZCAtIG1tc2l6ZV0KKyAgICBtb3ZhcHMgICAgIG0yLCBbY29uc3RfZmxvYXRfc2lnbl9tYXNrXQorCithbGlnbiAxNgorJSVyZXN0b3JlX3NpZ25fbG9vcDoKKyAgICBtb3ZhcHMgICAgIG0wLCBbdG1wWSArIHI0XSAgICA7IG0wID0gWVtpXQorICAgIG1vdnVwcyAgICAgbTEsIFtpblhxICsgcjRdICAgIDsgbTEgPSBYW2ldCisgICAgYW5kcHMgICAgICBtMSwgbTIgICAgICAgICAgICAgOyBtMSA9IHNpZ24oWFtpXSkKKyAgICBvcnBzICAgICAgIG0wLCBtMSAgICAgICAgICAgICA7IG0wID0gWVtpXSpzaWduCisgICAgY3Z0cHMyZHEgICBtMywgbTAgICAgICAgICAgICAgOyBtMyA9IChpbnQpbTAKKyAgICBtb3ZhcHMgIFtvdXRZcSArIHI0XSwgbTMKKworICAgIHN1YiAgICAgICByNGQsIG1tc2l6ZQorICAgIGpuYyAgJSVyZXN0b3JlX3NpZ25fbG9vcAorJSVyZXR1cm46CisKKyVpZiBBUkNIX1g4Nl82NCA9PSAwICAgIDsgc2JyZHNwCisgICAgbW92c3MgICAgIHIwbSwgeG02ICA7IHJldHVybiAoZmxvYXQpU3l5X25vcm0KKyAgICBmbGQgZHdvcmQgcjBtCislZWxzZQorICAgIG1vdmFwcyAgICAgbTAsIG02ICAgOyByZXR1cm4gKGZsb2F0KVN5eV9ub3JtCislZW5kaWYKKworICAgIFJFVAorCithbGlnbiAxNgorJSV6ZXJvX2lucHV0OgorICAgIGxlYSAgICAgICByNGQsIFtOZCAtIG1tc2l6ZV0KKyAgICB4b3JwcyAgICAgIG0wLCBtMAorJSV6ZXJvX2xvb3A6CisgICAgbW92YXBzICBbb3V0WXEgKyByNF0sIG0wCisgICAgc3ViICAgICAgIHI0ZCwgbW1zaXplCisgICAgam5jICAlJXplcm9fbG9vcAorCisgICAgbW92YXBzICAgICBtNiwgW2NvbnN0X2Zsb2F0XzFdCisgICAgam1wICAlJXJldHVybgorJWVuZG1hY3JvCisKKzsgaWYgMSwgdXNlIGEgZmxvYXQgb3AgdGhhdCBnaXZlIGhhbGYgcHJlY2lzaW9uIGJ1dCBleGVjdXRlIGZvciBhcm91bmQgMyBjeWNsZXMuCis7IE9uIFNreWxha2UgJiBSeXplbiB0aGUgZGl2aXNpb24gaXMgbXVjaCBmYXN0ZXIgKGFyb3VuZCAxMWMvMyksCis7IHRoYXQgbWFrZXMgdGhlIGZ1bGwgcHJlY2lzaW9uIGNvZGUgYWJvdXQgMiUgc2xvd2VyLgorOyBPcHVzIGFsc28gZG9lcyB1c2UgcnNxcnQgYXBwcm94aW1hdGlvbiBpbiB0aGVpciBpbnRyaW5zaWNzIGNvZGUuCislZGVmaW5lIFVTRV9BUFBST1hJTUFUSU9OICAgMQorCitJTklUX1hNTSBzc2UyCitQVlFfRkFTVF9TRUFSQ0ggX2FwcHJveAorCitJTklUX1hNTSBzc2U0CitQVlFfRkFTVF9TRUFSQ0ggX2FwcHJveAorCislZGVmaW5lIFVTRV9BUFBST1hJTUFUSU9OICAgMAorCitJTklUX1hNTSBhdngKK1BWUV9GQVNUX1NFQVJDSCBfZXhhY3QKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3BpeGJsb2NrZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L3BpeGJsb2NrZHNwLmFzbQppbmRleCAyODY0ZDBjLi40NDBmZTI5IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9waXhibG9ja2RzcC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvcGl4YmxvY2tkc3AuYXNtCkBAIC0yNiw3ICsyNiw3IEBACiBTRUNUSU9OIC50ZXh0CiAKIElOSVRfTU1YIG1teAotOyB2b2lkIGZmX2dldF9waXhlbHNfbW14KGludDE2X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUpCis7IHZvaWQgZmZfZ2V0X3BpeGVsc19tbXgoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IHN0cmlkZSkKIGNnbG9iYWwgZ2V0X3BpeGVscywgMyw0CiAgICAgYWRkICAgICAgICAgIHIwLCAxMjgKICAgICBtb3YgICAgICAgICAgcjMsIC0xMjgKQEAgLTgxLDEwICs4MSw5IEBACiAgICAgUkVUCiAKIDsgdm9pZCBmZl9kaWZmX3BpeGVsc19tbXgoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLCBjb25zdCB1aW50OF90ICpzMiwKLTsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSk7Cis7ICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOwogJW1hY3JvIERJRkZfUElYRUxTIDAKIGNnbG9iYWwgZGlmZl9waXhlbHMsIDQsNSw1Ci0gICAgbW92c3hkaWZuaWRuIHIzLCByM2QKICAgICBweG9yICAgICAgICAgbTQsIG00CiAgICAgYWRkICAgICAgICAgIHIwLCAgMTI4CiAgICAgbW92ICAgICAgICAgIHI0LCAtMTI4CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9waXhibG9ja2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9waXhibG9ja2RzcF9pbml0LmMKaW5kZXggNGQwNmE0NC4uYWRlNTVlMCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvcGl4YmxvY2tkc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L3BpeGJsb2NrZHNwX2luaXQuYwpAQCAtMjMsMTIgKzIzLDEyIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL3BpeGJsb2NrZHNwLmgiCiAKLXZvaWQgZmZfZ2V0X3BpeGVsc19tbXgoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IGxpbmVfc2l6ZSk7Ci12b2lkIGZmX2dldF9waXhlbHNfc3NlMihpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3QgbGluZV9zaXplKTsKK3ZvaWQgZmZfZ2V0X3BpeGVsc19tbXgoaW50MTZfdCAqYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IHN0cmlkZSk7Cit2b2lkIGZmX2dldF9waXhlbHNfc3NlMihpbnQxNl90ICpibG9jaywgY29uc3QgdWludDhfdCAqcGl4ZWxzLCBwdHJkaWZmX3Qgc3RyaWRlKTsKIHZvaWQgZmZfZGlmZl9waXhlbHNfbW14KGludDE2X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpzMSwgY29uc3QgdWludDhfdCAqczIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOwogdm9pZCBmZl9kaWZmX3BpeGVsc19zc2UyKGludDE2X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpzMSwgY29uc3QgdWludDhfdCAqczIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CiAKIGF2X2NvbGQgdm9pZCBmZl9waXhibG9ja2RzcF9pbml0X3g4NihQaXhibG9ja0RTUENvbnRleHQgKmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LApAQCAtMzksMTIgKzM5LDE0IEBACiAgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CiAgICAgICAgIGlmICghaGlnaF9iaXRfZGVwdGgpCiAgICAgICAgICAgICBjLT5nZXRfcGl4ZWxzID0gZmZfZ2V0X3BpeGVsc19tbXg7CisgICAgICAgIGMtPmRpZmZfcGl4ZWxzX3VuYWxpZ25lZCA9CiAgICAgICAgIGMtPmRpZmZfcGl4ZWxzID0gZmZfZGlmZl9waXhlbHNfbW14OwogICAgIH0KIAogICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKICAgICAgICAgaWYgKCFoaWdoX2JpdF9kZXB0aCkKICAgICAgICAgICAgIGMtPmdldF9waXhlbHMgPSBmZl9nZXRfcGl4ZWxzX3NzZTI7CisgICAgICAgIGMtPmRpZmZfcGl4ZWxzX3VuYWxpZ25lZCA9CiAgICAgICAgIGMtPmRpZmZfcGl4ZWxzID0gZmZfZGlmZl9waXhlbHNfc3NlMjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9wcm9yZXNkc3AuYXNtIGIvbGliYXZjb2RlYy94ODYvcHJvcmVzZHNwLmFzbQppbmRleCAxNmZjMjYyLi42NWM5ZmFkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9wcm9yZXNkc3AuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L3Byb3Jlc2RzcC5hc20KQEAgLTMzLDE0ICszMywxNCBAQAogY2V4dGVybiBwd180CiBjZXh0ZXJuIHB3XzEwMTkKIDsgQmVsb3cgYXJlIGRlZmluZWQgaW4gc2ltcGxlX2lkY3QxMC5hc20gYnVpbHQgZnJvbSBzZWxlY3RpbmcgaWRjdGRzcAotY2V4dGVybiB3NF9wbHVzX3cyCi1jZXh0ZXJuIHc0X21pbl93MgotY2V4dGVybiB3NF9wbHVzX3c2Ci1jZXh0ZXJuIHc0X21pbl93NgotY2V4dGVybiB3MV9wbHVzX3czCi1jZXh0ZXJuIHczX21pbl93MQotY2V4dGVybiB3N19wbHVzX3czCi1jZXh0ZXJuIHczX21pbl93NworY2V4dGVybiB3NF9wbHVzX3cyX2hpCitjZXh0ZXJuIHc0X21pbl93Ml9oaQorY2V4dGVybiB3NF9wbHVzX3c2X2hpCitjZXh0ZXJuIHc0X21pbl93Nl9oaQorY2V4dGVybiB3MV9wbHVzX3czX2hpCitjZXh0ZXJuIHczX21pbl93MV9oaQorY2V4dGVybiB3N19wbHVzX3czX2hpCitjZXh0ZXJuIHczX21pbl93N19oaQogY2V4dGVybiB3MV9wbHVzX3c1CiBjZXh0ZXJuIHc1X21pbl93MQogY2V4dGVybiB3NV9wbHVzX3c3CkBAIC01MCw5ICs1MCwxMSBAQAogCiBTRUNUSU9OIC50ZXh0CiAKK2RlZmluZV9jb25zdGFudHMgX2hpCisKICVtYWNybyBpZGN0X2ZuIDAKLWNnbG9iYWwgcHJvcmVzX2lkY3RfcHV0XzEwLCA0LCA0LCAxNQotICAgIElEQ1RfRk4gICAgcHdfMSwgMTUsIHB3Xzg4LCAxOCwgcHdfNCwgcHdfMTAxOSwgcjMKK2NnbG9iYWwgcHJvcmVzX2lkY3RfcHV0XzEwLCA0LCA0LCAxNSwgcGl4ZWxzLCBsc2l6ZSwgYmxvY2ssIHFtYXQKKyAgICBJRENUX0ZOICAgIHB3XzEsIDE1LCBwd184OCwgMTgsICJwdXQiLCBwd180LCBwd18xMDE5LCByMwogICAgIFJFVAogJWVuZG1hY3JvCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3Byb3Jlc2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9wcm9yZXNkc3BfaW5pdC5jCmluZGV4IGVhZDExYWUuLjhjYTRkNGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3Byb3Jlc2RzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvcHJvcmVzZHNwX2luaXQuYwpAQCAtMjUsOSArMjUsOSBAQAogI2luY2x1ZGUgImxpYmF2Y29kZWMvaWRjdGRzcC5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvcHJvcmVzZHNwLmgiCiAKLXZvaWQgZmZfcHJvcmVzX2lkY3RfcHV0XzEwX3NzZTIodWludDE2X3QgKmRzdCwgaW50IGxpbmVzaXplLAordm9pZCBmZl9wcm9yZXNfaWRjdF9wdXRfMTBfc3NlMih1aW50MTZfdCAqZHN0LCBwdHJkaWZmX3QgbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBjb25zdCBpbnQxNl90ICpxbWF0KTsKLXZvaWQgZmZfcHJvcmVzX2lkY3RfcHV0XzEwX2F2eCAodWludDE2X3QgKmRzdCwgaW50IGxpbmVzaXplLAordm9pZCBmZl9wcm9yZXNfaWRjdF9wdXRfMTBfYXZ4ICh1aW50MTZfdCAqZHN0LCBwdHJkaWZmX3QgbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmJsb2NrLCBjb25zdCBpbnQxNl90ICpxbWF0KTsKIAogYXZfY29sZCB2b2lkIGZmX3Byb3Jlc2RzcF9pbml0X3g4NihQcm9yZXNEU1BDb250ZXh0ICpkc3AsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3FwZWxkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvcXBlbGRzcF9pbml0LmMKaW5kZXggMzI2OGQ5MC4uM2IwNWUxNSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvcXBlbGRzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvcXBlbGRzcF9pbml0LmMKQEAgLTgyLDcgKzgyLDcgQEAKICNkZWZpbmUgZmZfcHV0X25vX3JuZF9waXhlbHMxNl9tbXhleHQgZmZfcHV0X3BpeGVsczE2X21teAogI2RlZmluZSBmZl9wdXRfbm9fcm5kX3BpeGVsczhfbW14ZXh0IGZmX3B1dF9waXhlbHM4X21teAogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KIAogI2RlZmluZSBmZl9wdXRfcGl4ZWxzMTZfbW14ZXh0IGZmX3B1dF9waXhlbHMxNl9tbXgKICNkZWZpbmUgZmZfcHV0X3BpeGVsczhfbW14ZXh0ICBmZl9wdXRfcGl4ZWxzOF9tbXgKQEAgLTUwNCw3ICs1MDQsNyBAQAogUVBFTF9PUChhdmdfLCAgICAgICAgXywgICAgICAgIG1teGV4dCkKIFFQRUxfT1AocHV0X25vX3JuZF8sIF9ub19ybmRfLCBtbXhleHQpCiAKLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogCiAjZGVmaW5lIFNFVF9RUEVMX0ZVTkNTKFBGWCwgSURYLCBTSVpFLCBDUFUsIFBSRUZJWCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvcm5kX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL3g4Ni9ybmRfdGVtcGxhdGUuYwppbmRleCBkZGNhNGViLi4wOTk0NmJkIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9ybmRfdGVtcGxhdGUuYworKysgYi9saWJhdmNvZGVjL3g4Ni9ybmRfdGVtcGxhdGUuYwpAQCAtNDYsMTIgKzQ2LDEyIEBACiAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW01ICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGR1c3cgJSVtbTAsICUlbW00ICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHVzdyAlJW1tMSwgJSVtbTUgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJ4b3IgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICAgXG5cdCIKKyAgICAgICAgInhvciAgICAlJSJGRl9SRUdfYSIsICUlIkZGX1JFR19hIiBcblx0IgogICAgICAgICAiYWRkICAgICUzLCAlMSAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICIucDJhbGlnbiAzICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAgMSglMSwgJSUiUkVHX2EiKSwgJSVtbTIgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTEsICUlIkZGX1JFR19hIiksICUlbW0wICBcblx0IgorICAgICAgICAibW92cSAgIDEoJTEsICUlIkZGX1JFR19hIiksICUlbW0yIFxuXHQiCiAgICAgICAgICJtb3ZxICAgJSVtbTAsICUlbW0xICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgICAlJW1tMiwgJSVtbTMgICAgICAgICAgICBcblx0IgogICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCAgICAgICAgIFxuXHQiCkBAIC02NywxMSArNjcsMTEgQEAKICAgICAgICAgInBzcmx3ICAkMiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHNybHcgICQyLCAlJW1tNSAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWNrdXN3YiAgJSVtbTUsICUlbW00ICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgICAlJW1tNCwgKCUyLCAlJSJSRUdfYSIpICBcblx0IgotICAgICAgICAiYWRkICAgICUzLCAlJSJSRUdfYSIgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgJSVtbTQsICglMiwgJSUiRkZfUkVHX2EiKSAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlMywgJSUiRkZfUkVHX2EiICAgICAgICAgICBcblx0IgogCi0gICAgICAgICJtb3ZxICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMiAgXG5cdCIgLy8gMCA8LT4gMiAgIDEgPC0+IDMKLSAgICAgICAgIm1vdnEgICAxKCUxLCAlJSJSRUdfYSIpLCAlJW1tNCBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTIgIFxuXHQiIC8vIDAgPC0+IDIgICAxIDwtPiAzCisgICAgICAgICJtb3ZxICAgMSglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTQgXG5cdCIKICAgICAgICAgIm1vdnEgICAlJW1tMiwgJSVtbTMgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgICUlbW00LCAlJW1tNSAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgXG5cdCIKQEAgLTg3LDE0ICs4NywxNCBAQAogICAgICAgICAicHNybHcgICQyLCAlJW1tMCAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3JsdyAgJDIsICUlbW0xICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhY2t1c3diICAlJW1tMSwgJSVtbTAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAgICUlbW0wLCAoJTIsICUlIlJFR19hIikgIFxuXHQiCi0gICAgICAgICJhZGQgICAgJTMsICUlIlJFR19hIiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgICAlJW1tMCwgKCUyLCAlJSJGRl9SRUdfYSIpICBcblx0IgorICAgICAgICAiYWRkICAgICUzLCAlJSJGRl9SRUdfYSIgICAgICAgIFxuXHQiCiAKICAgICAgICAgInN1YmwgICAkMiwgJTAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiam56ICAgIDFiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIDoiK2ciKGgpLCAiK1MiKHBpeGVscykKICAgICAgICAgOiJEIihibG9jayksICJyIigoeDg2X3JlZylsaW5lX3NpemUpCi0gICAgICAgIDpSRUdfYSwgIm1lbW9yeSIpOworICAgICAgICA6RkZfUkVHX2EsICJtZW1vcnkiKTsKIH0KIAogLy8gYXZnX3BpeGVscwpAQCAtMTE1LDEyICsxMTUsMTIgQEAKICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTUgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHVzdyAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdXN3ICUlbW0xLCAlJW1tNSAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInhvciAgICAlJSJSRUdfYSIsICUlIlJFR19hIiAgICBcblx0IgorICAgICAgICAieG9yICAgICUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiIFxuXHQiCiAgICAgICAgICJhZGQgICAgJTMsICUxICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIi5wMmFsaWduIDMgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMCAgXG5cdCIKLSAgICAgICAgIm1vdnEgICAxKCUxLCAlJSJSRUdfYSIpLCAlJW1tMiBcblx0IgorICAgICAgICAibW92cSAgICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgMSglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTIgXG5cdCIKICAgICAgICAgIm1vdnEgICAlJW1tMCwgJSVtbTEgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAgICUlbW0yLCAlJW1tMyAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICAgICAgXG5cdCIKQEAgLTEzNSwxNiArMTM1LDE2IEBACiAgICAgICAgICJwYWRkdXN3ICUlbW0xLCAlJW1tNSAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzcmx3ICAkMiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHNybHcgICQyLCAlJW1tNSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdnEgICAoJTIsICUlIlJFR19hIiksICUlbW0zICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgKCUyLCAlJSJGRl9SRUdfYSIpLCAlJW1tMyAgXG5cdCIKICAgICAgICAgInBhY2t1c3diICAlJW1tNSwgJSVtbTQgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwY21wZXFkICUlbW0yLCAlJW1tMiAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMiAgICAgXG5cdCIKICAgICAgICAgICAgICAgICBQQVZHQl9NTVgoJSVtbTMsICUlbW00LCAlJW1tNSwgJSVtbTIpCi0gICAgICAgICAgICAgICAgIm1vdnEgICAlJW1tNSwgKCUyLCAlJSJSRUdfYSIpICBcblx0IgotICAgICAgICAiYWRkICAgICUzLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICUlbW01LCAoJTIsICUlIkZGX1JFR19hIikgIFxuXHQiCisgICAgICAgICJhZGQgICAgJTMsICUlIkZGX1JFR19hIiAgICAgICAgXG5cdCIKIAotICAgICAgICAibW92cSAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTIgIFxuXHQiIC8vIDAgPC0+IDIgICAxIDwtPiAzCi0gICAgICAgICJtb3ZxICAgMSglMSwgJSUiUkVHX2EiKSwgJSVtbTQgXG5cdCIKKyAgICAgICAgIm1vdnEgICAoJTEsICUlIkZGX1JFR19hIiksICUlbW0yICBcblx0IiAvLyAwIDwtPiAyICAgMSA8LT4gMworICAgICAgICAibW92cSAgIDEoJTEsICUlIkZGX1JFR19hIiksICUlbW00IFxuXHQiCiAgICAgICAgICJtb3ZxICAgJSVtbTIsICUlbW0zICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgICAlJW1tNCwgJSVtbTUgICAgICAgICAgICBcblx0IgogICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMiAgICAgICAgIFxuXHQiCkBAIC0xNTksMTcgKzE1OSwxNyBAQAogICAgICAgICAicGFkZHVzdyAlJW1tNSwgJSVtbTEgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3JsdyAgJDIsICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzcmx3ICAkMiwgJSVtbTEgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZxICAgKCUyLCAlJSJSRUdfYSIpLCAlJW1tMyAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92cSAgICglMiwgJSUiRkZfUkVHX2EiKSwgJSVtbTMgIFxuXHQiCiAgICAgICAgICJwYWNrdXN3YiAgJSVtbTEsICUlbW0wICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicGNtcGVxZCAlJW1tMiwgJSVtbTIgICBcblx0IgogICAgICAgICAgICAgICAgICJwYWRkYiAlJW1tMiwgJSVtbTIgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgUEFWR0JfTU1YKCUlbW0zLCAlJW1tMCwgJSVtbTEsICUlbW0yKQotICAgICAgICAgICAgICAgICJtb3ZxICAgJSVtbTEsICglMiwgJSUiUkVHX2EiKSAgXG5cdCIKLSAgICAgICAgImFkZCAgICAlMywgJSUiUkVHX2EiICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZxICAgJSVtbTEsICglMiwgJSUiRkZfUkVHX2EiKSAgXG5cdCIKKyAgICAgICAgImFkZCAgICAlMywgJSUiRkZfUkVHX2EiICAgICAgICAgICBcblx0IgogCiAgICAgICAgICJzdWJsICAgJDIsICUwICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgImpueiAgICAxYiAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICA6IitnIihoKSwgIitTIihwaXhlbHMpCiAgICAgICAgIDoiRCIoYmxvY2spLCAiciIoKHg4Nl9yZWcpbGluZV9zaXplKQotICAgICAgICA6UkVHX2EsICJtZW1vcnkiKTsKKyAgICAgICAgOkZGX1JFR19hLCAibWVtb3J5Iik7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9ydjM0ZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L3J2MzRkc3AuYXNtCmluZGV4IDc3MzJkNjUuLjY5MmI0YWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3J2MzRkc3AuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L3J2MzRkc3AuYXNtCkBAIC02NCw2ICs2NCw3IEBACiBydjM0X2lkY3QgZGNfbm9yb3VuZAogCiA7IGZmX3J2MzRfaWRjdF9kY19hZGRfbW14KHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGRjKTsKKyVpZiBBUkNIX1g4Nl8zMgogSU5JVF9NTVggbW14CiBjZ2xvYmFsIHJ2MzRfaWRjdF9kY19hZGQsIDMsIDMKICAgICA7IGNhbGN1bGF0ZSBEQwpAQCAtOTcsNiArOTgsNyBAQAogICAgIG1vdmggICAgICAgW3IyXSwgbTQKICAgICBtb3ZoICAgICAgIFtyMityMV0sIG01CiAgICAgUkVUCislZW5kaWYKIAogOyBMb2FkIGNvZWZmcyBhbmQgcGVyZm9ybSByb3cgdHJhbnNmb3JtCiA7IE91dHB1dDogY29lZmZzIGluIG1tWzA0NjddLCByb3VuZGVyIGluIG1tNQpAQCAtMTY3LDcgKzE2OSw3IEBACiAgICAgcmV0CiAKIDsgZmZfcnYzNF9pZGN0X2RjX2FkZF9zc2U0KHVpbnQ4X3QgKmRzdCwgaW50IHN0cmlkZSwgaW50IGRjKTsKLUlOSVRfWE1NIHNzZTQKKyVtYWNybyBSVjM0X0lEQ1RfRENfQUREIDAKIGNnbG9iYWwgcnYzNF9pZGN0X2RjX2FkZCwgMywgMywgNgogICAgIDsgbG9hZCBkYXRhCiAgICAgSURDVF9EQ19ST1VORCByMgpAQCAtMTkwLDcgKzE5MiwyMiBAQAogICAgIHBhZGR3ICAgICAgbTQsIG0wCiAgICAgcGFja3Vzd2IgICBtMiwgbTQKICAgICBtb3ZkICAgICAgW3IwXSwgbTIKKyVpZiBjcHVmbGFnKHNzZTQpCiAgICAgcGV4dHJkIFtyMCtyMV0sIG0yLCAxCiAgICAgcGV4dHJkICAgIFtyMl0sIG0yLCAyCiAgICAgcGV4dHJkIFtyMityMV0sIG0yLCAzCislZWxzZQorICAgIHBzcmxkcSAgICAgbTIsIDQKKyAgICBtb3ZkICAgW3IwK3IxXSwgbTIKKyAgICBwc3JsZHEgICAgIG0yLCA0CisgICAgbW92ZCAgICAgIFtyMl0sIG0yCisgICAgcHNybGRxICAgICBtMiwgNAorICAgIG1vdmQgICBbcjIrcjFdLCBtMgorJWVuZGlmCiAgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUlYzNF9JRENUX0RDX0FERAorSU5JVF9YTU0gc3NlNAorUlYzNF9JRENUX0RDX0FERApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvcnYzNGRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni9ydjM0ZHNwX2luaXQuYwppbmRleCA5OWM1NmY5Li43MzEwMTIyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni9ydjM0ZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9ydjM0ZHNwX2luaXQuYwpAQCAtMjEsMTMgKzIxLDEzIEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9ydjM0ZHNwLmgiCiAKIHZvaWQgZmZfcnYzNF9pZGN0X2RjX21teGV4dChpbnQxNl90ICpibG9jayk7CiB2b2lkIGZmX3J2MzRfaWRjdF9kY19ub3JvdW5kX21teGV4dChpbnQxNl90ICpibG9jayk7CiB2b2lkIGZmX3J2MzRfaWRjdF9kY19hZGRfbW14KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGRjKTsKK3ZvaWQgZmZfcnYzNF9pZGN0X2RjX2FkZF9zc2UyKHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGRjKTsKIHZvaWQgZmZfcnYzNF9pZGN0X2RjX2FkZF9zc2U0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGRjKTsKIHZvaWQgZmZfcnYzNF9pZGN0X2FkZF9tbXhleHQodWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7CiAKQEAgLTM1LDEyICszNSwxNCBAQAogewogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKLSAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpCisgICAgaWYgKEFSQ0hfWDg2XzMyICYmIEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKQogICAgICAgICBjLT5ydjM0X2lkY3RfZGNfYWRkID0gZmZfcnYzNF9pZGN0X2RjX2FkZF9tbXg7CiAgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKSB7CiAgICAgICAgIGMtPnJ2MzRfaW52X3RyYW5zZm9ybV9kYyA9IGZmX3J2MzRfaWRjdF9kY19ub3JvdW5kX21teGV4dDsKICAgICAgICAgYy0+cnYzNF9pZGN0X2FkZCAgICAgICAgID0gZmZfcnYzNF9pZGN0X2FkZF9tbXhleHQ7CiAgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpCisgICAgICAgIGMtPnJ2MzRfaWRjdF9kY19hZGQgPSBmZl9ydjM0X2lkY3RfZGNfYWRkX3NzZTI7CiAgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkKICAgICAgICAgYy0+cnYzNF9pZGN0X2RjX2FkZCA9IGZmX3J2MzRfaWRjdF9kY19hZGRfc3NlNDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3J2NDBkc3AuYXNtIGIvbGliYXZjb2RlYy94ODYvcnY0MGRzcC5hc20KaW5kZXggZmRkODFhMC4uYmNhZDFhZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvcnY0MGRzcC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvcnY0MGRzcC5hc20KQEAgLTI1LDcgKzI1LDYgQEAKIAogU0VDVElPTl9ST0RBVEEKIAotYWxpZ24gMTYKIHB3XzEwMjQ6ICAgdGltZXMgOCBkdyAxIDw8ICgxNiAtIDYpIDsgcHdfMTAyNAogCiBzaXh0YXBfZmlsdGVyX2hiX206ICB0aW1lcyA4IGRiICAgMSwgLTUKQEAgLTMzNSwxNCArMzM0LDE0IEBACiBGSUxURVJfU1NTRTMgIHB1dAogRklMVEVSX1NTU0UzICBhdmcKIAotOyAlMT01Yml0cyB3ZWlnaHRzPywgJTI9ZHN0ICUzPXNyYzEgJTQ9c3JjMyAlNT1zdHJpZGUgaWYgc3NlMgorOyAlMT01LWJpdCB3ZWlnaHRzPywgJTI9ZHN0ICUzPXNyYzEgJTQ9c3JjMyAlNT1zdHJpZGUgaWYgU1NFMgogJW1hY3JvIFJWNDBfV0NPUkUgIDQtNQogICAgIG1vdmggICAgICAgbTQsIFslMyArIHI2ICsgMF0KICAgICBtb3ZoICAgICAgIG01LCBbJTQgKyByNiArIDBdCiAlaWYgJTAgPT0gNAogJWRlZmluZSBPRkZTRVQgcjYgKyBtbXNpemUgLyAyCiAlZWxzZQotICAgIDsgOHg4IGJsb2NrIGFuZCBzc2UyLCBzdHJpZGUgd2FzIHByb3ZpZGVkCisgICAgOyA4eDggYmxvY2sgYW5kIFNTRTIsIHN0cmlkZSB3YXMgcHJvdmlkZWQKICVkZWZpbmUgT0ZGU0VUIHI2CiAgICAgYWRkICAgICAgICByNiwgcjUKICVlbmRpZgpAQCAtMzUwLDcgKzM0OSw3IEBACiAgICAgbW92aCAgICAgICBtNywgWyU0ICsgT0ZGU0VUXQogCiAlaWYgJTEgPT0gMAotICAgIDsgMTRiaXRzIHdlaWdodHMKKyAgICA7IDE0LWJpdCB3ZWlnaHRzCiAgICAgcHVucGNrbGJ3ICBtNCwgbTAKICAgICBwdW5wY2tsYncgIG01LCBtMAogICAgIHB1bnBja2xidyAgbTYsIG0wCkBAIC0zNjgsNyArMzY3LDcgQEAKICAgICBwYWRkdyAgICAgIG00LCBtNQogICAgIHBhZGR3ICAgICAgbTYsIG03CiAlZWxzZQotICAgIDsgNWJpdHMgd2VpZ2h0cworICAgIDsgNS1iaXQgd2VpZ2h0cwogJWlmIGNwdWZsYWcoc3NzZTMpCiAgICAgcHVucGNrbGJ3ICBtNCwgbTUKICAgICBwdW5wY2tsYncgIG02LCBtNwpAQCAtNDA0LDcgKzQwMyw3IEBACiAKICAgICBwYWNrdXN3YiAgIG00LCBtNgogJWlmICUwID09IDUKLSAgICA7IE9ubHkgY2FsbGVkIGZvciA4eDggYmxvY2tzIGFuZCBzc2UyCisgICAgOyBPbmx5IGNhbGxlZCBmb3IgOHg4IGJsb2NrcyBhbmQgU1NFMgogICAgIHN1YiAgICAgICAgcjYsIHI1CiAgICAgbW92aCAgICAgICBbJTIgKyByNl0sIG00CiAgICAgYWRkICAgICAgICByNiwgcjUKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3J2NDBkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvcnY0MGRzcF9pbml0LmMKaW5kZXggMjE4ZGViOC4uYjU3YTNmYyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvcnY0MGRzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvcnY0MGRzcF9pbml0LmMKQEAgLTM5LDIwICszOSwyMCBAQAogICAgIGZmXyMjb3AjI19waXhlbHMjI3NpemUjI194eTJfIyNpbnNuKGRzdCwgc3JjLCBzdHJpZGUsIHNpemUpOyBcCiB9CiAKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogdm9pZCBmZl9wdXRfcnY0MF9jaHJvbWFfbWM4X21teCAgKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9hdmdfcnY0MF9jaHJvbWFfbWM4X21teGV4dCh1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9hdmdfcnY0MF9jaHJvbWFfbWM4XzNkbm93KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogCiB2b2lkIGZmX3B1dF9ydjQwX2Nocm9tYV9tYzRfbW14ICAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiB2b2lkIGZmX2F2Z19ydjQwX2Nocm9tYV9tYzRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiB2b2lkIGZmX2F2Z19ydjQwX2Nocm9tYV9tYzRfM2Rub3codWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgsIGludCB4LCBpbnQgeSk7CiAKICNkZWZpbmUgREVDTEFSRV9XRUlHSFQob3B0KSBcCiB2b2lkIGZmX3J2NDBfd2VpZ2h0X2Z1bmNfcm5kXzE2XyMjb3B0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjMSwgdWludDhfdCAqc3JjMiwgXApAQCAtMjAzLDcgKzIwMyw3IEBACiAKIERFRklORV9GTihhdmcsIDE2LCBzc2UyKQogREVGSU5FX0ZOKGF2ZywgMTYsIHNzc2UzKQotI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworI2VuZGlmIC8qIEhBVkVfWDg2QVNNICovCiAKICNpZiBIQVZFX01NWF9JTkxJTkUKIERFRklORV9GTihwdXQsIDgsIG1teCkKQEAgLTIyNSw3ICsyMjUsNyBAQAogICAgIH0KICNlbmRpZiAvKiBIQVZFX01NWF9JTkxJTkUgKi8KIAotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CiAgICAgICAgIGMtPnB1dF9jaHJvbWFfcGl4ZWxzX3RhYlswXSA9IGZmX3B1dF9ydjQwX2Nocm9tYV9tYzhfbW14OwogICAgICAgICBjLT5wdXRfY2hyb21hX3BpeGVsc190YWJbMV0gPSBmZl9wdXRfcnY0MF9jaHJvbWFfbWM0X21teDsKQEAgLTI3NCw1ICsyNzQsNSBAQAogICAgICAgICBRUEVMX01DX1NFVChwdXRfLCBfc3NzZTMpCiAgICAgICAgIFFQRUxfTUNfU0VUKGF2Z18sIF9zc3NlMykKICAgICB9Ci0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3NiY2RzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni9zYmNkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OGQzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni9zYmNkc3AuYXNtCkBAIC0wLDAgKzEsMTY4IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTSU1EIG9wdGltaXplZCBTQkMgZW5jb2RlciBEU1AgZnVuY3Rpb25zCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDE3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+Cis7KiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMCAgTm9raWEgQ29ycG9yYXRpb24KKzsqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwICBNYXJjZWwgSG9sdG1hbm4gPG1hcmNlbEBob2x0bWFubi5vcmc+Cis7KiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSAgSGVucnlrIFBsb2V0eiA8aGVucnlrQHBsb2V0emxpLmNoPgorOyogQ29weXJpZ2h0IChDKSAyMDA1LTIwMDYgIEJyYWQgTWlkZ2xleSA8Ym1pZGdsZXlAeG1pc3Npb24uY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK3NjYWxlX21hc2s6IHRpbWVzIDIgZGQgMHg4MDAwICAgIDsgMSA8PCAoU0JDX1BST1RPX0ZJWEVEX1NDQUxFIC0gMSkKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gTklETiAzCislaWZuaWRuICUyLCAlMworICAgICUxICAgICAgICAgICAgJTIsICUzCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gQU5BTFlaRV9NQUMgOSA7IG91dDEsIG91dDIsIGluMSwgaW4yLCB0bXAxLCB0bXAyLCBhZGQxLCBhZGQyLCBvZmZzZXQKKyAgICBOSUROIG1vdnEsICAgICU1LCAlMworICAgIE5JRE4gbW92cSwgICAgJTYsICU0CisgICAgcG1hZGR3ZCAgICAgICAlNSwgW2NvbnN0c3ErJTldCisgICAgcG1hZGR3ZCAgICAgICAlNiwgW2NvbnN0c3ErJTkrOF0KKyAgICBOSUROIHBhZGRkLCAgICUxLCAlNworICAgIE5JRE4gcGFkZGQsICAgJTIsICU4CislZW5kbWFjcm8KKworJW1hY3JvIEFOQUxZWkVfTUFDX0lOIDcgOyBvdXQxLCBvdXQyLCB0bXAxLCB0bXAyLCBhZGQxLCBhZGQyLCBvZmZzZXQKKyAgICBBTkFMWVpFX01BQyAgICUxLCAlMiwgW2lucSslN10sIFtpbnErJTcrOF0sICUzLCAlNCwgJTUsICU2LCAlNworJWVuZG1hY3JvCisKKyVtYWNybyBBTkFMWVpFX01BQ19SRUcgNyA7IG91dDEsIG91dDIsIGluLCB0bXAxLCB0bXAyLCBvZmZzZXQsIHBhY2sKKyVpZmlkbiAlNywgcGFjaworICAgIHBzcmFkICAgICAgICAgJTMsIDE2ICAgIDsgU0JDX1BST1RPX0ZJWEVEX1NDQUxFCisgICAgcGFja3NzZHcgICAgICAlMywgJTMKKyVlbmRpZgorICAgIEFOQUxZWkVfTUFDICAgJTEsICUyLCAlMywgJTMsICU0LCAlNSwgJTQsICU1LCAlNgorJWVuZG1hY3JvCisKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7dm9pZCBmZl9zYmNfYW5hbHl6ZV80KGNvbnN0IGludDE2X3QgKmluLCBpbnQzMl90ICpvdXQsIGNvbnN0IGludDE2X3QgKmNvbnN0cyk7Cis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorSU5JVF9NTVggbW14CitjZ2xvYmFsIHNiY19hbmFseXplXzQsIDMsIDMsIDQsIGluLCBvdXQsIGNvbnN0cworICAgIEFOQUxZWkVfTUFDX0lOICAgbTAsIG0xLCBtMCwgbTEsIFtzY2FsZV9tYXNrXSwgW3NjYWxlX21hc2tdLCAwCisgICAgQU5BTFlaRV9NQUNfSU4gICBtMCwgbTEsIG0yLCBtMywgbTIsIG0zLCAxNgorICAgIEFOQUxZWkVfTUFDX0lOICAgbTAsIG0xLCBtMiwgbTMsIG0yLCBtMywgMzIKKyAgICBBTkFMWVpFX01BQ19JTiAgIG0wLCBtMSwgbTIsIG0zLCBtMiwgbTMsIDQ4CisgICAgQU5BTFlaRV9NQUNfSU4gICBtMCwgbTEsIG0yLCBtMywgbTIsIG0zLCA2NAorCisgICAgQU5BTFlaRV9NQUNfUkVHICBtMCwgbTIsIG0wLCBtMCwgbTIsIDgwLCBwYWNrCisgICAgQU5BTFlaRV9NQUNfUkVHICBtMCwgbTIsIG0xLCBtMSwgbTMsIDk2LCBwYWNrCisKKyAgICBtb3ZxICAgICAgICAgIFtvdXRxICBdLCBtMAorICAgIG1vdnEgICAgICAgICAgW291dHErOF0sIG0yCisKKyAgICBSRVQKKworCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorO3ZvaWQgZmZfc2JjX2FuYWx5emVfOChjb25zdCBpbnQxNl90ICppbiwgaW50MzJfdCAqb3V0LCBjb25zdCBpbnQxNl90ICpjb25zdHMpOworOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0lOSVRfTU1YIG1teAorY2dsb2JhbCBzYmNfYW5hbHl6ZV84LCAzLCAzLCA0LCBpbiwgb3V0LCBjb25zdHMKKyAgICBBTkFMWVpFX01BQ19JTiAgIG0wLCBtMSwgbTAsIG0xLCBbc2NhbGVfbWFza10sIFtzY2FsZV9tYXNrXSwgIDAKKyAgICBBTkFMWVpFX01BQ19JTiAgIG0yLCBtMywgbTIsIG0zLCBbc2NhbGVfbWFza10sIFtzY2FsZV9tYXNrXSwgMTYKKyAgICBBTkFMWVpFX01BQ19JTiAgIG0wLCBtMSwgbTQsIG01LCBtNCwgbTUsICAzMgorICAgIEFOQUxZWkVfTUFDX0lOICAgbTIsIG0zLCBtNiwgbTcsIG02LCBtNywgIDQ4CisgICAgQU5BTFlaRV9NQUNfSU4gICBtMCwgbTEsIG00LCBtNSwgbTQsIG01LCAgNjQKKyAgICBBTkFMWVpFX01BQ19JTiAgIG0yLCBtMywgbTYsIG03LCBtNiwgbTcsICA4MAorICAgIEFOQUxZWkVfTUFDX0lOICAgbTAsIG0xLCBtNCwgbTUsIG00LCBtNSwgIDk2CisgICAgQU5BTFlaRV9NQUNfSU4gICBtMiwgbTMsIG02LCBtNywgbTYsIG03LCAxMTIKKyAgICBBTkFMWVpFX01BQ19JTiAgIG0wLCBtMSwgbTQsIG01LCBtNCwgbTUsIDEyOAorICAgIEFOQUxZWkVfTUFDX0lOICAgbTIsIG0zLCBtNiwgbTcsIG02LCBtNywgMTQ0CisKKyAgICBBTkFMWVpFX01BQ19SRUcgIG00LCBtNSwgbTAsIG00LCBtNSwgMTYwLCBwYWNrCisgICAgQU5BTFlaRV9NQUNfUkVHICBtNCwgbTUsIG0xLCBtNiwgbTcsIDE5MiwgcGFjaworICAgIEFOQUxZWkVfTUFDX1JFRyAgbTQsIG01LCBtMiwgbTYsIG03LCAyMjQsIHBhY2sKKyAgICBBTkFMWVpFX01BQ19SRUcgIG00LCBtNSwgbTMsIG02LCBtNywgMjU2LCBwYWNrCisKKyAgICBtb3ZxICAgICAgICAgIFtvdXRxICBdLCBtNAorICAgIG1vdnEgICAgICAgICAgW291dHErOF0sIG01CisKKyAgICBBTkFMWVpFX01BQ19SRUcgIG0wLCBtNSwgbTAsIG0wLCBtNSwgMTc2LCBubworICAgIEFOQUxZWkVfTUFDX1JFRyAgbTAsIG01LCBtMSwgbTEsIG03LCAyMDgsIG5vCisgICAgQU5BTFlaRV9NQUNfUkVHICBtMCwgbTUsIG0yLCBtMiwgbTcsIDI0MCwgbm8KKyAgICBBTkFMWVpFX01BQ19SRUcgIG0wLCBtNSwgbTMsIG0zLCBtNywgMjcyLCBubworCisgICAgbW92cSAgICAgICAgICBbb3V0cSsxNl0sIG0wCisgICAgbW92cSAgICAgICAgICBbb3V0cSsyNF0sIG01CisKKyAgICBSRVQKKworCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorO3ZvaWQgZmZfc2JjX2NhbGNfc2NhbGVmYWN0b3JzKGludDMyX3Qgc2Jfc2FtcGxlX2ZbMTZdWzJdWzhdLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYWxlX2ZhY3RvclsyXVs4XSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzLCBpbnQgY2hhbm5lbHMsIGludCBzdWJiYW5kcykKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitJTklUX01NWCBtbXgKK2NnbG9iYWwgc2JjX2NhbGNfc2NhbGVmYWN0b3JzLCA1LCA3LCA0LCBzYl9zYW1wbGVfZiwgc2NhbGVfZmFjdG9yLCBibG9ja3MsIGNoYW5uZWxzLCBzdWJiYW5kcywgcHRyLCBibGsKKyAgICA7IHN1YmJhbmRzID0gNCAqIHN1YmJhbmRzICogY2hhbm5lbHMKKyAgICBtb3ZxICAgICAgICAgIG0zLCBbc2NhbGVfbWFza10KKyAgICBzaGwgICAgICAgICAgIHN1YmJhbmRzZCwgMgorICAgIGNtcCAgICAgICAgICAgY2hhbm5lbHNkLCAyCisgICAgamwgICAgICAgICAgICAubG9vcF8xCisgICAgc2hsICAgICAgICAgICBzdWJiYW5kc2QsIDEKKworLmxvb3BfMToKKyAgICBzdWIgICAgICAgICAgIHN1YmJhbmRzcSwgOAorICAgIGxlYSAgICAgICAgICAgcHRycSwgW3NiX3NhbXBsZV9mcSArIHN1YmJhbmRzcV0KKworICAgIDsgYmxrID0gKGJsb2NrcyAtIDEpICogNjQ7CisgICAgbGVhICAgICAgICAgICBibGtxLCBbYmxvY2tzcSAtIDFdCisgICAgc2hsICAgICAgICAgICBibGtkLCA2CisKKyAgICBtb3ZxICAgICAgICAgIG0wLCBtMworLmxvb3BfMjoKKyAgICBtb3ZxICAgICAgICAgIG0xLCBbcHRycStibGtxXQorICAgIHB4b3IgICAgICAgICAgbTIsIG0yCisgICAgcGNtcGd0ZCAgICAgICBtMSwgbTIKKyAgICBwYWRkZCAgICAgICAgIG0xLCBbcHRycStibGtxXQorICAgIHBjbXBndGQgICAgICAgbTIsIG0xCisgICAgcHhvciAgICAgICAgICBtMSwgbTIKKworICAgIHBvciAgICAgICAgICAgbTAsIG0xCisKKyAgICBzdWIgICAgICAgICAgIGJsa3EsIDY0CisgICAgam5zICAgICAgICAgICAubG9vcF8yCisKKyAgICBtb3ZkICAgICAgICAgIGJsa2QsIG0wCisgICAgcHNybHEgICAgICAgICBtMCwgICAzMgorICAgIGJzciAgICAgICAgICAgYmxrZCwgYmxrZAorICAgIHN1YiAgICAgICAgICAgYmxrZCwgMTUgICAgOyBTQ0FMRV9PVVRfQklUUworICAgIG1vdiAgICAgICAgICAgW3NjYWxlX2ZhY3RvcnEgKyBzdWJiYW5kc3FdLCBibGtkCisKKyAgICBtb3ZkICAgICAgICAgIGJsa2QsIG0wCisgICAgYnNyICAgICAgICAgICBibGtkLCBibGtkCisgICAgc3ViICAgICAgICAgICBibGtkLCAxNSAgICA7IFNDQUxFX09VVF9CSVRTCisgICAgbW92ICAgICAgICAgICBbc2NhbGVfZmFjdG9ycSArIHN1YmJhbmRzcSArIDRdLCBibGtkCisKKyAgICBjbXAgICAgICAgICAgIHN1YmJhbmRzcSwgMAorICAgIGpnICAgICAgICAgICAgLmxvb3BfMQorCisgICAgZW1tcworICAgIFJFVApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvc2JjZHNwX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L3NiY2RzcF9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZlZmZlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L3NiY2RzcF9pbml0LmMKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIEJsdWV0b290aCBsb3ctY29tcGxleGl0eSwgc3ViYmFuZCBjb2RlYyAoU0JDKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyAgQXVyZWxpZW4gSmFjb2JzIDxhdXJlbEBnbnVhZ2Uub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCAgTWFyY2VsIEhvbHRtYW5uIDxtYXJjZWxAaG9sdG1hbm4ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgIEhlbnJ5ayBQbG9ldHogPGhlbnJ5a0BwbG9ldHpsaS5jaD4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDA2ICBCcmFkIE1pZGdsZXkgPGJtaWRnbGV5QHhtaXNzaW9uLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU0JDIE1NWCBvcHRpbWl6YXRpb24gZm9yIHNvbWUgYmFzaWMgImJ1aWxkaW5nIGJyaWNrcyIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9zYmNkc3AuaCIKKwordm9pZCBmZl9zYmNfYW5hbHl6ZV80X21teChjb25zdCBpbnQxNl90ICppbiwgaW50MzJfdCAqb3V0LCBjb25zdCBpbnQxNl90ICpjb25zdHMpOwordm9pZCBmZl9zYmNfYW5hbHl6ZV84X21teChjb25zdCBpbnQxNl90ICppbiwgaW50MzJfdCAqb3V0LCBjb25zdCBpbnQxNl90ICpjb25zdHMpOwordm9pZCBmZl9zYmNfY2FsY19zY2FsZWZhY3RvcnNfbW14KGludDMyX3Qgc2Jfc2FtcGxlX2ZbMTZdWzJdWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYWxlX2ZhY3RvclsyXVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tzLCBpbnQgY2hhbm5lbHMsIGludCBzdWJiYW5kcyk7CisKK2F2X2NvbGQgdm9pZCBmZl9zYmNkc3BfaW5pdF94ODYoU0JDRFNQQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPnNiY19hbmFseXplXzQgPSBmZl9zYmNfYW5hbHl6ZV80X21teDsKKyAgICAgICAgcy0+c2JjX2FuYWx5emVfOCA9IGZmX3NiY19hbmFseXplXzhfbW14OworICAgICAgICBzLT5zYmNfY2FsY19zY2FsZWZhY3RvcnMgPSBmZl9zYmNfY2FsY19zY2FsZWZhY3RvcnNfbW14OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3NicmRzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni9zYnJkc3AuYXNtCmluZGV4IGI2ZmE1MzUuLjYyYmJlNTEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3NicmRzcC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvc2JyZHNwLmFzbQpAQCAtMzgsNyArMzgsNyBAQAogCiBJTklUX1hNTSBzc2UKIGNnbG9iYWwgc2JyX3N1bV9zcXVhcmUsIDIsIDMsIDYKLSAgICBtb3YgICAgICAgICByMiwgcjEKKyAgICBtb3YgICAgICAgIHIyZCwgcjFkCiAgICAgeG9ycHMgICAgICAgbTAsIG0wCiAgICAgeG9ycHMgICAgICAgbTEsIG0xCiAgICAgc2FyICAgICAgICAgcjIsIDMKQEAgLTE0OSwxOSArMTQ5LDE5IEBACiAgICAgOyBzdGFydCBhbmQgZW5kIDZ0aCBhbmQgN3RoIGFyZ3Mgb24gc3RhY2sKICAgICBtb3YgICAgICAgIHIyZCwgU20KICAgICBtb3YgICAgICAgIHIzZCwgRW0KLSVkZWZpbmUgIHN0YXJ0IHIycQotJWRlZmluZSAgZW5kICAgcjNxCisgICAgREVGSU5FX0FSR1MgWF9oaWdoLCBYX2xvdywgc3RhcnQsIGVuZAogJWVsc2UKIDsgQlcgZG9lcyBub3QgYWN0dWFsbHkgb2NjdXB5IGEgcmVnaXN0ZXIsIHNvIHNoaWZ0IGJ5IDEKLSVkZWZpbmUgIHN0YXJ0IEJXcQotJWRlZmluZSAgZW5kICAgU3EKKyAgICBERUZJTkVfQVJHUyBYX2hpZ2gsIFhfbG93LCBhbHBoYTAsIGFscGhhMSwgc3RhcnQsIGVuZAorICAgIG1vdnN4ZCAgc3RhcnRxLCBzdGFydGQKKyAgICBtb3ZzeGQgICAgZW5kcSwgZW5kZAogJWVuZGlmCi0gICAgc3ViICAgICAgc3RhcnQsIGVuZCAgICAgICAgICA7IG5lZyBudW0gb2YgbG9vcHMKLSAgICBsZWEgICAgWF9oaWdocSwgW1hfaGlnaHEgKyBlbmQqMio0XQotICAgIGxlYSAgICAgWF9sb3dxLCBbWF9sb3dxICArIGVuZCoyKjQgLSAyKjIqNF0KLSAgICBzaGwgICAgICBzdGFydCwgMyAgICAgICAgICAgIDsgb2Zmc2V0IGZyb20gbnVtIGxvb3BzCisgICAgc3ViICAgICBzdGFydHEsIGVuZHEgICAgICAgICA7IG5lZyBudW0gb2YgbG9vcHMKKyAgICBsZWEgICAgWF9oaWdocSwgW1hfaGlnaHEgKyBlbmRxKjIqNF0KKyAgICBsZWEgICAgIFhfbG93cSwgW1hfbG93cSAgKyBlbmRxKjIqNCAtIDIqMio0XQorICAgIHNobCAgICAgc3RhcnRxLCAzICAgICAgICAgICAgOyBvZmZzZXQgZnJvbSBudW0gbG9vcHMKIAotICAgIG1vdmEgICAgICAgIG0wLCBbWF9sb3dxICsgc3RhcnRdCisgICAgbW92YSAgICAgICAgbTAsIFtYX2xvd3EgKyBzdGFydHFdCiAgICAgc2h1ZnBzICAgICAgbTMsIG0zLCBxMTExMQogICAgIHNodWZwcyAgICAgIG00LCBtNCwgcTExMTEKICAgICB4b3JwcyAgICAgICBtMywgW3BzX21hc2tdCkBAIC0xNjksNyArMTY5LDcgQEAKICAgICBzaHVmcHMgICAgICBtMiwgbTIsIHEwMDAwCiAgICAgeG9ycHMgICAgICAgbTQsIFtwc19tYXNrXQogLmxvb3AyOgotICAgIG1vdnUgICAgICAgIG03LCBbWF9sb3dxICsgc3RhcnQgKyA4XSAgICAgICAgOyBCYkNjCisgICAgbW92dSAgICAgICAgbTcsIFtYX2xvd3EgKyBzdGFydHEgKyA4XSAgICAgICA7IEJiQ2MKICAgICBtb3ZhICAgICAgICBtNiwgbTAKICAgICBtb3ZhICAgICAgICBtNSwgbTcKICAgICBzaHVmcHMgICAgICBtMCwgbTAsIHEyMzAxICAgICAgICAgICAgICAgICAgIDsgYUFiQgpAQCAtMTc5LDEyICsxNzksMTIgQEAKICAgICBtdWxwcyAgICAgICBtNiwgbTIKICAgICBtdWxwcyAgICAgICBtNSwgbTEKICAgICBhZGRwcyAgICAgICBtNywgbTAKLSAgICBtb3ZhICAgICAgICBtMCwgW1hfbG93cSArIHN0YXJ0ICsxNl0gICAgICAgIDsgQ2NEZAorICAgIG1vdmEgICAgICAgIG0wLCBbWF9sb3dxICsgc3RhcnRxICsgMTZdICAgICAgOyBDY0RkCiAgICAgYWRkcHMgICAgICAgbTcsIG0wCiAgICAgYWRkcHMgICAgICAgbTYsIG01CiAgICAgYWRkcHMgICAgICAgbTcsIG02Ci0gICAgbW92YSAgW1hfaGlnaHEgKyBzdGFydF0sIG03Ci0gICAgYWRkICAgICBzdGFydCwgMTYKKyAgICBtb3ZhICBbWF9oaWdocSArIHN0YXJ0cV0sIG03CisgICAgYWRkICAgICBzdGFydHEsIDE2CiAgICAgam56ICAgICAgICAgLmxvb3AyCiAgICAgUkVUCiAKQEAgLTM3OCwyNCArMzc4LDI0IEBACiBhcHBseV9ub2lzZV9tYWluOgogJWlmIEFSQ0hfWDg2XzY0ID09IDAgfHwgV0lONjQKICAgICBtb3YgICAgICAga3hkLCBtX21heG0KLSVkZWZpbmUgY291bnQga3hxCisgICAgREVGSU5FX0FSR1MgWSwgc19tLCBxX2ZpbHQsIG5vaXNlLCBjb3VudAogJWVsc2UKLSVkZWZpbmUgY291bnQgbV9tYXhxCisgICAgREVGSU5FX0FSR1MgWSwgc19tLCBxX2ZpbHQsIG5vaXNlLCBreCwgY291bnQKICVlbmRpZgogICAgIG1vdnN4ZGlmbmlkbiAgICBub2lzZXEsIG5vaXNlZAogICAgIGRlYyAgICBub2lzZXEKLSAgICBzaGwgICAgY291bnQsIDIKKyAgICBzaGwgICAgY291bnRkLCAyCiAlaWZkZWYgUElDCiAgICAgbGVhIE5PSVNFX1RBQkxFLCBbc2JyX25vaXNlX3RhYmxlXQogJWVuZGlmCi0gICAgbGVhICAgICAgICBZcSwgW1lxICsgMipjb3VudF0KLSAgICBhZGQgICAgICBzX21xLCBjb3VudAotICAgIGFkZCAgIHFfZmlsdHEsIGNvdW50CisgICAgbGVhICAgICAgICBZcSwgW1lxICsgMipjb3VudHFdCisgICAgYWRkICAgICAgc19tcSwgY291bnRxCisgICAgYWRkICAgcV9maWx0cSwgY291bnRxCiAgICAgc2hsICAgIG5vaXNlcSwgMwogICAgIHB4b3IgICAgICAgbTUsIG01Ci0gICAgbmVnICAgIGNvdW50CisgICAgbmVnICAgIGNvdW50cQogLmxvb3A6Ci0gICAgbW92YSAgICAgICBtMSwgW3FfZmlsdHEgKyBjb3VudF0KKyAgICBtb3ZhICAgICAgIG0xLCBbcV9maWx0cSArIGNvdW50cV0KICAgICBtb3Z1ICAgICAgIG0zLCBbbm9pc2VxICsgTk9JU0VfVEFCTEUgKyAxKm1tc2l6ZV0KICAgICBtb3Z1ICAgICAgIG00LCBbbm9pc2VxICsgTk9JU0VfVEFCTEUgKyAyKm1tc2l6ZV0KICAgICBhZGQgICAgbm9pc2VxLCAyKm1tc2l6ZQpAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgcHVucGNrbGRxICBtMSwgbTEKICAgICBtdWxwcyAgICAgIG0xLCBtMyA7IG0yID0gcV9maWx0W21dICogZmZfc2JyX25vaXNlX3RhYmxlW25vaXNlXQogICAgIG11bHBzICAgICAgbTIsIG00IDsgbTIgPSBxX2ZpbHRbbV0gKiBmZl9zYnJfbm9pc2VfdGFibGVbbm9pc2VdCi0gICAgbW92YSAgICAgICBtMywgW3NfbXEgKyBjb3VudF0KKyAgICBtb3ZhICAgICAgIG0zLCBbc19tcSArIGNvdW50cV0KICAgICA7IFRPRE86IHJlcGxhY2UgYnkgYSB2cGVybWQgaW4gQVZYMgogICAgIHB1bnBja2hkcSAgbTQsIG0zLCBtMwogICAgIHB1bnBja2xkcSAgbTMsIG0zCkBAIC00MTQsMTUgKzQxNCwxNSBAQAogICAgIG11bHBzICAgICAgbTQsIG0wIDsgc19tW21dICogcGhpX3NpZ24KICAgICBwYW5kICAgICAgIG0xLCBtNgogICAgIHBhbmQgICAgICAgbTIsIG03Ci0gICAgbW92dSAgICAgICBtNiwgW1lxICsgMipjb3VudF0KLSAgICBtb3Z1ICAgICAgIG03LCBbWXEgKyAyKmNvdW50ICsgbW1zaXplXQorICAgIG1vdnUgICAgICAgbTYsIFtZcSArIDIqY291bnRxXQorICAgIG1vdnUgICAgICAgbTcsIFtZcSArIDIqY291bnRxICsgbW1zaXplXQogICAgIGFkZHBzICAgICAgbTMsIG0xCiAgICAgYWRkcHMgICAgICBtNCwgbTIKICAgICBhZGRwcyAgICAgIG02LCBtMwogICAgIGFkZHBzICAgICAgbTcsIG00Ci0gICAgbW92dSAgICBbWXEgKyAyKmNvdW50XSwgbTYKLSAgICBtb3Z1ICAgIFtZcSArIDIqY291bnQgKyBtbXNpemVdLCBtNwotICAgIGFkZCAgICBjb3VudCwgbW1zaXplCisgICAgbW92dSAgICBbWXEgKyAyKmNvdW50cV0sIG02CisgICAgbW92dSAgICBbWXEgKyAyKmNvdW50cSArIG1tc2l6ZV0sIG03CisgICAgYWRkICAgIGNvdW50cSwgbW1zaXplCiAgICAgamwgICAgICAubG9vcAogICAgIFJFVAogCkBAIC01MjYsMzEgKzUyNiwxNSBAQAogICAgIHhvcnBzICAgbTIsIFtwc19tYXNrM10KICAgICB4b3JwcyAgIG01LCBbcHNfbWFzazNdCiAgICAgeG9ycHMgICBtNiwgW3BzX21hc2szXQorICAgIEhBRERQUyAgbTIsIG01LCBtMworICAgIEhBRERQUyAgbTcsIG02LCBtNAogJWlmIGNwdWZsYWcoc3NlMykKICAgICBtb3ZzaGR1cCBtMCwgbTEKLSAgICBoYWRkcHMgIG0yLCBtNQotICAgIGhhZGRwcyAgbTcsIG02Ci0gICAgYWRkc3MgICBtMSwgbTAKICVlbHNlCi0gICAgbW92YXBzICBtMywgbTIKLSAgICBtb3ZhcHMgIG0wLCBtNQotICAgIG1vdmFwcyAgbTQsIG02Ci0gICAgc2h1ZnBzICBtMywgbTMsIHEwMzAxCi0gICAgc2h1ZnBzICBtMCwgbTAsIHEwMzAxCi0gICAgc2h1ZnBzICBtNCwgbTQsIHEwMzAxCi0gICAgYWRkcHMgICBtMiwgbTMKLSAgICBhZGRwcyAgIG01LCBtMAotICAgIGFkZHBzICAgbTYsIG00Ci0KLSAgICBtb3ZzcyAgIG0wLCBtNwotICAgIG1vdnNzICAgbTMsIG0xCi0gICAgc2h1ZnBzICBtNywgbTcsIHEwMDAxCisgICAgbW92c3MgICBtMCwgbTEKICAgICBzaHVmcHMgIG0xLCBtMSwgcTAwMDEKLSAgICBhZGRzcyAgIG03LCBtMAotICAgIGFkZHNzICAgbTEsIG0zCi0gICAgc2h1ZnBzICBtMiwgbTUsIHEyMDIwCi0gICAgc2h1ZnBzICBtNywgbTYsIHEyMDIwCiAlZW5kaWYKKyAgICBhZGRzcyAgIG0xLCBtMAogICAgIG1vdmFwcyAgW3BoaXEgICAgIF0sIG0yCiAgICAgbW92aHBzICBbcGhpcSsweDE4XSwgbTcKICAgICBtb3ZzcyAgIFtwaGlxKzB4MjhdLCBtNwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QuYXNtIGIvbGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWRiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni9zaW1wbGVfaWRjdC5hc20KQEAgLTAsMCArMSw4ODkgQEAKKzsKKzsgU2ltcGxlIElEQ1QgTU1YCis7Cis7IENvcHlyaWdodCAoYykgMjAwMSwgMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorOworOyBDb252ZXJzaW9uIGZyb20gZ2NjIHN5bnRheCB0byB4MjY0YXNtIHN5bnRheCB3aXRoIG1pbmltYWwgbW9kaWZpY2F0aW9ucworOyBieSBKYW1lcyBEYXJubGV5IDxqZGFybmxleUBvYmUudHY+LgorOworOyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7Cis7IEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7Cis7IEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOworOyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7IExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOy8KKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK2NleHRlcm4gcGJfODAKKword20xMDEwOiBkdyAwLCAweGZmZmYsIDAsIDB4ZmZmZgorZDQwMDAwOiBkZCA0IDw8IDE2LCAwCisKKzsgMjMxNzAuNDc1MDA2Cis7IDIyNzI1LjI2MDgyNgorOyAyMTQwNi43Mjc2MTcKKzsgMTkyNjUuNTQ1ODcwCis7IDE2Mzg0LjAwMDAwMAorOyAxMjg3Mi44MjYxOTgKKzsgODg2Ni45NTY5MDUKKzsgNDUyMC4zMzU0MzAKKworJWRlZmluZSBDMCAyMzE3MCA7IGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorJWRlZmluZSBDMSAyMjcyNSA7IGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorJWRlZmluZSBDMiAyMTQwNyA7IGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorJWRlZmluZSBDMyAxOTI2NiA7IGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorJWRlZmluZSBDNCAxNjM4MyA7IGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSAtIDAuNQorJWRlZmluZSBDNSAxMjg3MyA7IGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorJWRlZmluZSBDNiA4ODY3ICA7IGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorJWRlZmluZSBDNyA0NTIwICA7IGNvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQorCislZGVmaW5lIFJPV19TSElGVCAxMQorJWRlZmluZSBDT0xfU0hJRlQgMjAgOyA2CisKK2NvZWZmczoKKyAgICBkdyAxIDw8IChST1dfU0hJRlQgLSAxKSwgMAorICAgIGR3IDEgPDwgKFJPV19TSElGVCAtIDEpLCAwCisgICAgZHcgMSA8PCAoUk9XX1NISUZUIC0gMSksIDEKKyAgICBkdyAxIDw8IChST1dfU0hJRlQgLSAxKSwgMAorCisgICAgZHcgQzQsICBDNCwgIEM0LCAgQzQKKyAgICBkdyBDNCwgLUM0LCAgQzQsIC1DNAorCisgICAgZHcgQzIsICBDNiwgIEMyLCAgQzYKKyAgICBkdyBDNiwgLUMyLCAgQzYsIC1DMgorCisgICAgZHcgQzEsICBDMywgIEMxLCAgQzMKKyAgICBkdyBDNSwgIEM3LCAgQzUsICBDNworCisgICAgZHcgQzMsIC1DNywgIEMzLCAtQzcKKyAgICBkdyAtQzEsIC1DNSwgLUMxLCAtQzUKKworICAgIGR3IEM1LCAtQzEsICBDNSwgLUMxCisgICAgZHcgQzcsICBDMywgIEM3LCAgQzMKKworICAgIGR3IEM3LCAtQzUsICBDNywgLUM1CisgICAgZHcgQzMsIC1DMSwgIEMzLCAtQzEKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gRENfQ09ORF9JRENUIDcKKyAgICBtb3ZxICAgICAgICAgICAgbW0wLCBbYmxvY2txICsgJTFdICA7IFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAKKyAgICBtb3ZxICAgICAgICAgICAgbW0xLCBbYmxvY2txICsgJTJdICA7IFI2ICAgICBSMiAgICAgIHI2ICAgICAgcjIKKyAgICBtb3ZxICAgICAgICAgICAgbW0yLCBbYmxvY2txICsgJTNdICA7IFIzICAgICBSMSAgICAgIHIzICAgICAgcjEKKyAgICBtb3ZxICAgICAgICAgICAgbW0zLCBbYmxvY2txICsgJTRdICA7IFI3ICAgICBSNSAgICAgIHI3ICAgICAgcjUKKyAgICBtb3ZxICAgICAgICAgICAgbW00LCBbd20xMDEwXQorICAgIHBhbmQgICAgICAgICAgICBtbTQsIG1tMAorICAgIHBvciAgICAgICAgICAgICBtbTQsIG1tMQorICAgIHBvciAgICAgICAgICAgICBtbTQsIG1tMgorICAgIHBvciAgICAgICAgICAgICBtbTQsIG1tMworICAgIHBhY2tzc2R3ICAgICAgICBtbTQsIG1tNAorICAgIG1vdmQgICAgICAgICAgICB0MGQsIG1tNAorICAgIG9yICAgICAgICAgICAgICB0MGQsIHQwZAorICAgIGp6ICAgICAgICAgICAgICAlJTEKKyAgICBtb3ZxICAgICAgICAgICAgbW00LCBbY29lZmZzICsgMTZdICA7IEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW00LCBtbTAgICAgICAgICAgICA7IEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTUsIFtjb2VmZnMgKyAyNF0gIDsgLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNAorICAgIHBtYWRkd2QgICAgICAgICBtbTAsIG1tNSAgICAgICAgICAgIDsgLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTUsIFtjb2VmZnMgKyAzMl0gIDsgQzYgICAgIEMyICAgICAgQzYgICAgICBDMgorICAgIHBtYWRkd2QgICAgICAgICBtbTUsIG1tMSAgICAgICAgICAgIDsgQzZSNitDMlIyICAgICAgQzZyNitDMnIyCisgICAgbW92cSAgICAgICAgICAgIG1tNiwgW2NvZWZmcyArIDQwXSAgOyAtQzIgICAgQzYgICAgICAtQzIgICAgIEM2CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMSwgbW02ICAgICAgICAgICAgOyAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyCisgICAgbW92cSAgICAgICAgICAgIG1tNywgW2NvZWZmcyArIDQ4XSAgOyBDMyAgICAgQzEgICAgICBDMyAgICAgIEMxCisgICAgcG1hZGR3ZCAgICAgICAgIG1tNywgbW0yICAgICAgICAgICAgOyBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBbY29lZmZzICsgOF0KKyAgICBtb3ZxICAgICAgICAgICAgbW02LCBtbTQgICAgICAgICAgICA7IEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMAorICAgIHBhZGRkICAgICAgICAgICBtbTQsIG1tNSAgICAgICAgICAgIDsgQTAgICAgICAgICAgICAgYTAKKyAgICBwc3ViZCAgICAgICAgICAgbW02LCBtbTUgICAgICAgICAgICA7IEEzICAgICAgICAgICAgIGEzCisgICAgbW92cSAgICAgICAgICAgIG1tNSwgW2NvZWZmcyArIDU2XSAgOyBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1CisgICAgcG1hZGR3ZCAgICAgICAgIG1tNSwgbW0zICAgICAgICAgICAgOyBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUKKyAgICBwYWRkZCAgICAgICAgICAgbW0wLCBbY29lZmZzICsgOF0KKyAgICBwYWRkZCAgICAgICAgICAgbW0xLCBtbTAgICAgICAgICAgICA7IEExICAgICAgICAgICAgIGExCisgICAgcGFkZGQgICAgICAgICAgIG1tMCwgbW0wCisgICAgcHN1YmQgICAgICAgICAgIG1tMCwgbW0xICAgICAgICAgICAgOyBBMiAgICAgICAgICAgICBhMgorICAgIHBtYWRkd2QgICAgICAgICBtbTIsIFtjb2VmZnMgKyA2NF0gIDsgLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMQorICAgIHBhZGRkICAgICAgICAgICBtbTcsIG1tNSAgICAgICAgICAgIDsgQjAgICAgICAgICAgICAgYjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgNzJdICA7IC1DNSAgICAtQzEgICAgIC1DNSAgICAgLUMxCisgICAgcG1hZGR3ZCAgICAgICAgIG1tNSwgbW0zICAgICAgICAgICAgOyAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1CisgICAgcGFkZGQgICAgICAgICAgIG1tNywgbW00ICAgICAgICAgICAgOyBBMCtCMCAgICAgICAgICBhMCtiMAorICAgIHBhZGRkICAgICAgICAgICBtbTQsIG1tNCAgICAgICAgICAgIDsgMkEwICAgICAgICAgICAgMmEwCisgICAgcHN1YmQgICAgICAgICAgIG1tNCwgbW03ICAgICAgICAgICAgOyBBMC1CMCAgICAgICAgICBhMC1iMAorICAgIHBhZGRkICAgICAgICAgICBtbTUsIG1tMiAgICAgICAgICAgIDsgQjEgICAgICAgICAgICAgYjEKKyAgICBwc3JhZCAgICAgICAgICAgbW03LCAlNworICAgIHBzcmFkICAgICAgICAgICBtbTQsICU3CisgICAgbW92cSAgICAgICAgICAgIG1tMiwgbW0xICAgICAgICAgICAgOyBBMSAgICAgICAgICAgICBhMQorICAgIHBhZGRkICAgICAgICAgICBtbTEsIG1tNSAgICAgICAgICAgIDsgQTErQjEgICAgICAgICAgYTErYjEKKyAgICBwc3ViZCAgICAgICAgICAgbW0yLCBtbTUgICAgICAgICAgICA7IEExLUIxICAgICAgICAgIGExLWIxCisgICAgcHNyYWQgICAgICAgICAgIG1tMSwgJTcKKyAgICBwc3JhZCAgICAgICAgICAgbW0yLCAlNworICAgIHBhY2tzc2R3ICAgICAgICBtbTcsIG1tMSAgICAgICAgICAgIDsgQTErQjEgIGExK2IxICAgQTArQjAgICBhMCtiMAorICAgIHBhY2tzc2R3ICAgICAgICBtbTIsIG1tNCAgICAgICAgICAgIDsgQTAtQjAgIGEwLWIwICAgQTEtQjEgICBhMS1iMQorICAgIG1vdnEgICAgICAgICAgIFslNV0sIG1tNworICAgIG1vdnEgICAgICAgICAgICBtbTEsIFtibG9ja3EgKyAlM10gIDsgUjMgICAgIFIxICAgICAgcjMgICAgICByMQorICAgIG1vdnEgICAgICAgICAgICBtbTQsIFtjb2VmZnMgKyA4MF0gIDsgLUMxICAgIEM1ICAgICAgLUMxICAgICBDNQorICAgIG1vdnEgICAgICBbMjQgKyAlNV0sIG1tMgorICAgIHBtYWRkd2QgICAgICAgICBtbTQsIG1tMSAgICAgICAgICAgIDsgLUMxUjMrQzVSMSAgICAgLUMxcjMrQzVyMQorICAgIG1vdnEgICAgICAgICAgICBtbTcsIFtjb2VmZnMgKyA4OF0gIDsgQzMgICAgIEM3ICAgICAgQzMgICAgICBDNworICAgIHBtYWRkd2QgICAgICAgICBtbTEsIFtjb2VmZnMgKyA5Nl0gIDsgLUM1UjMrQzdSMSAgICAgLUM1cjMrQzdyMQorICAgIHBtYWRkd2QgICAgICAgICBtbTcsIG1tMyAgICAgICAgICAgIDsgQzNSNytDN1I1ICAgICAgQzNyNytDN3I1CisgICAgbW92cSAgICAgICAgICAgIG1tMiwgbW0wICAgICAgICAgICAgOyBBMiAgICAgICAgICAgICBhMgorICAgIHBtYWRkd2QgICAgICAgICBtbTMsIFtjb2VmZnMgKyAxMDRdIDsgLUMxUjcrQzNSNSAgICAgLUMxcjcrQzNyNQorICAgIHBhZGRkICAgICAgICAgICBtbTQsIG1tNyAgICAgICAgICAgIDsgQjIgICAgICAgICAgICAgYjIKKyAgICBwYWRkZCAgICAgICAgICAgbW0yLCBtbTQgICAgICAgICAgICA7IEEyK0IyICAgICAgICAgIGEyK2IyCisgICAgcHN1YmQgICAgICAgICAgIG1tMCwgbW00ICAgICAgICAgICAgOyBhMi1CMiAgICAgICAgICBhMi1iMgorICAgIHBzcmFkICAgICAgICAgICBtbTIsICU3CisgICAgcHNyYWQgICAgICAgICAgIG1tMCwgJTcKKyAgICBtb3ZxICAgICAgICAgICAgbW00LCBtbTYgICAgICAgICAgICA7IEEzICAgICAgICAgICAgIGEzCisgICAgcGFkZGQgICAgICAgICAgIG1tMywgbW0xICAgICAgICAgICAgOyBCMyAgICAgICAgICAgICBiMworICAgIHBhZGRkICAgICAgICAgICBtbTYsIG1tMyAgICAgICAgICAgIDsgQTMrQjMgICAgICAgICAgYTMrYjMKKyAgICBwc3ViZCAgICAgICAgICAgbW00LCBtbTMgICAgICAgICAgICA7IGEzLUIzICAgICAgICAgIGEzLWIzCisgICAgcHNyYWQgICAgICAgICAgIG1tNiwgJTcKKyAgICBwYWNrc3NkdyAgICAgICAgbW0yLCBtbTYgICAgICAgICAgICA7IEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIKKyAgICBtb3ZxICAgICAgIFs4ICsgJTVdLCBtbTIKKyAgICBwc3JhZCAgICAgICAgICAgbW00LCAlNworICAgIHBhY2tzc2R3ICAgICAgICBtbTQsIG1tMCAgICAgICAgICAgIDsgQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMworICAgIG1vdnEgICAgICBbMTYgKyAlNV0sIG1tNAorICAgIGptcCAgICAgICAgICAgICAlJTIKKyUlMToKKyAgICBwc2xsZCAgICAgICAgICAgbW0wLCAxNgorICAgIHBhZGRkICAgICAgICAgICBtbTAsIFtkNDAwMDBdCisgICAgcHNyYWQgICAgICAgICAgIG1tMCwgMTMKKyAgICBwYWNrc3NkdyAgICAgICAgbW0wLCBtbTAKKyAgICBtb3ZxICAgICAgICAgICBbJTVdLCBtbTAKKyAgICBtb3ZxICAgICAgIFs4ICsgJTVdLCBtbTAKKyAgICBtb3ZxICAgICAgWzE2ICsgJTVdLCBtbTAKKyAgICBtb3ZxICAgICAgWzI0ICsgJTVdLCBtbTAKKyUlMjoKKyVlbmRtYWNybworCislbWFjcm8gWl9DT05EX0lEQ1QgOAorICAgIG1vdnEgICAgICAgICAgICBtbTAsIFtibG9ja3EgKyAlMV0gIDsgUjQgICAgIFIwICAgICAgcjQgICAgICByMAorICAgIG1vdnEgICAgICAgICAgICBtbTEsIFtibG9ja3EgKyAlMl0gIDsgUjYgICAgIFIyICAgICAgcjYgICAgICByMgorICAgIG1vdnEgICAgICAgICAgICBtbTIsIFtibG9ja3EgKyAlM10gIDsgUjMgICAgIFIxICAgICAgcjMgICAgICByMQorICAgIG1vdnEgICAgICAgICAgICBtbTMsIFtibG9ja3EgKyAlNF0gIDsgUjcgICAgIFI1ICAgICAgcjcgICAgICByNQorICAgIG1vdnEgICAgICAgICAgICBtbTQsIG1tMAorICAgIHBvciAgICAgICAgICAgICBtbTQsIG1tMQorICAgIHBvciAgICAgICAgICAgICBtbTQsIG1tMgorICAgIHBvciAgICAgICAgICAgICBtbTQsIG1tMworICAgIHBhY2tzc2R3ICAgICAgICBtbTQsIG1tNAorICAgIG1vdmQgICAgICAgICAgICB0MGQsIG1tNAorICAgIG9yICAgICAgICAgICAgICB0MGQsIHQwZAorICAgIGp6ICAgICAgICAgICAgICAgJTgKKyAgICBtb3ZxICAgICAgICAgICAgbW00LCBbY29lZmZzICsgMTZdICA7IEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW00LCBtbTAgICAgICAgICAgICA7IEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTUsIFtjb2VmZnMgKyAyNF0gIDsgLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNAorICAgIHBtYWRkd2QgICAgICAgICBtbTAsIG1tNSAgICAgICAgICAgIDsgLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTUsIFtjb2VmZnMgKyAzMl0gIDsgQzYgICAgIEMyICAgICAgQzYgICAgICBDMgorICAgIHBtYWRkd2QgICAgICAgICBtbTUsIG1tMSAgICAgICAgICAgIDsgQzZSNitDMlIyICAgICAgQzZyNitDMnIyCisgICAgbW92cSAgICAgICAgICAgIG1tNiwgW2NvZWZmcyArIDQwXSAgOyAtQzIgICAgQzYgICAgICAtQzIgICAgIEM2CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMSwgbW02ICAgICAgICAgICAgOyAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyCisgICAgbW92cSAgICAgICAgICAgIG1tNywgW2NvZWZmcyArIDQ4XSAgOyBDMyAgICAgQzEgICAgICBDMyAgICAgIEMxCisgICAgcG1hZGR3ZCAgICAgICAgIG1tNywgbW0yICAgICAgICAgICAgOyBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBbY29lZmZzXQorICAgIG1vdnEgICAgICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgIDsgQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwCisgICAgcGFkZGQgICAgICAgICAgIG1tNCwgbW01ICAgICAgICAgICAgOyBBMCAgICAgICAgICAgICBhMAorICAgIHBzdWJkICAgICAgICAgICBtbTYsIG1tNSAgICAgICAgICAgIDsgQTMgICAgICAgICAgICAgYTMKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgNTZdICA7IEM3ICAgICBDNSAgICAgIEM3ICAgICAgQzUKKyAgICBwbWFkZHdkICAgICAgICAgbW01LCBtbTMgICAgICAgICAgICA7IEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNQorICAgIHBhZGRkICAgICAgICAgICBtbTAsIFtjb2VmZnNdCisgICAgcGFkZGQgICAgICAgICAgIG1tMSwgbW0wICAgICAgICAgICAgOyBBMSAgICAgICAgICAgICBhMQorICAgIHBhZGRkICAgICAgICAgICBtbTAsIG1tMAorICAgIHBzdWJkICAgICAgICAgICBtbTAsIG1tMSAgICAgICAgICAgIDsgQTIgICAgICAgICAgICAgYTIKKyAgICBwbWFkZHdkICAgICAgICAgbW0yLCBbY29lZmZzICsgNjRdICA7IC1DN1IzK0MzUjEgICAgIC1DN3IzK0MzcjEKKyAgICBwYWRkZCAgICAgICAgICAgbW03LCBtbTUgICAgICAgICAgICA7IEIwICAgICAgICAgICAgIGIwCisgICAgbW92cSAgICAgICAgICAgIG1tNSwgW2NvZWZmcyArIDcyXSAgOyAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMQorICAgIHBtYWRkd2QgICAgICAgICBtbTUsIG1tMyAgICAgICAgICAgIDsgLUM1UjctQzFSNSAgICAgLUM1cjctQzFyNQorICAgIHBhZGRkICAgICAgICAgICBtbTcsIG1tNCAgICAgICAgICAgIDsgQTArQjAgICAgICAgICAgYTArYjAKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBtbTQgICAgICAgICAgICA7IDJBMCAgICAgICAgICAgIDJhMAorICAgIHBzdWJkICAgICAgICAgICBtbTQsIG1tNyAgICAgICAgICAgIDsgQTAtQjAgICAgICAgICAgYTAtYjAKKyAgICBwYWRkZCAgICAgICAgICAgbW01LCBtbTIgICAgICAgICAgICA7IEIxICAgICAgICAgICAgIGIxCisgICAgcHNyYWQgICAgICAgICAgIG1tNywgJTcKKyAgICBwc3JhZCAgICAgICAgICAgbW00LCAlNworICAgIG1vdnEgICAgICAgICAgICBtbTIsIG1tMSAgICAgICAgICAgIDsgQTEgICAgICAgICAgICAgYTEKKyAgICBwYWRkZCAgICAgICAgICAgbW0xLCBtbTUgICAgICAgICAgICA7IEExK0IxICAgICAgICAgIGExK2IxCisgICAgcHN1YmQgICAgICAgICAgIG1tMiwgbW01ICAgICAgICAgICAgOyBBMS1CMSAgICAgICAgICBhMS1iMQorICAgIHBzcmFkICAgICAgICAgICBtbTEsICU3CisgICAgcHNyYWQgICAgICAgICAgIG1tMiwgJTcKKyAgICBwYWNrc3NkdyAgICAgICAgbW03LCBtbTEgICAgICAgICAgICA7IEExK0IxICBhMStiMSAgIEEwK0IwICAgYTArYjAKKyAgICBwYWNrc3NkdyAgICAgICAgbW0yLCBtbTQgICAgICAgICAgICA7IEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEKKyAgICBtb3ZxICAgICAgICAgICBbJTVdLCBtbTcKKyAgICBtb3ZxICAgICAgICAgICAgbW0xLCBbYmxvY2txICsgJTNdICA7IFIzICAgICBSMSAgICAgIHIzICAgICAgcjEKKyAgICBtb3ZxICAgICAgICAgICAgbW00LCBbY29lZmZzICsgODBdICA7IC1DMSAgICBDNSAgICAgIC1DMSAgICAgQzUKKyAgICBtb3ZxICAgICAgWzI0ICsgJTVdLCBtbTIKKyAgICBwbWFkZHdkICAgICAgICAgbW00LCBtbTEgICAgICAgICAgICA7IC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEKKyAgICBtb3ZxICAgICAgICAgICAgbW03LCBbY29lZmZzICsgODhdICA7IEMzICAgICBDNyAgICAgIEMzICAgICAgQzcKKyAgICBwbWFkZHdkICAgICAgICAgbW0xLCBbY29lZmZzICsgOTZdICA7IC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEKKyAgICBwbWFkZHdkICAgICAgICAgbW03LCBtbTMgICAgICAgICAgICA7IEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNQorICAgIG1vdnEgICAgICAgICAgICBtbTIsIG1tMCAgICAgICAgICAgIDsgQTIgICAgICAgICAgICAgYTIKKyAgICBwbWFkZHdkICAgICAgICAgbW0zLCBbY29lZmZzICsgMTA0XSA7IC1DMVI3K0MzUjUgICAgIC1DMXI3K0MzcjUKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBtbTcgICAgICAgICAgICA7IEIyICAgICAgICAgICAgIGIyCisgICAgcGFkZGQgICAgICAgICAgIG1tMiwgbW00ICAgICAgICAgICAgOyBBMitCMiAgICAgICAgICBhMitiMgorICAgIHBzdWJkICAgICAgICAgICBtbTAsIG1tNCAgICAgICAgICAgIDsgYTItQjIgICAgICAgICAgYTItYjIKKyAgICBwc3JhZCAgICAgICAgICAgbW0yLCAlNworICAgIHBzcmFkICAgICAgICAgICBtbTAsICU3CisgICAgbW92cSAgICAgICAgICAgIG1tNCwgbW02ICAgICAgICAgICAgOyBBMyAgICAgICAgICAgICBhMworICAgIHBhZGRkICAgICAgICAgICBtbTMsIG1tMSAgICAgICAgICAgIDsgQjMgICAgICAgICAgICAgYjMKKyAgICBwYWRkZCAgICAgICAgICAgbW02LCBtbTMgICAgICAgICAgICA7IEEzK0IzICAgICAgICAgIGEzK2IzCisgICAgcHN1YmQgICAgICAgICAgIG1tNCwgbW0zICAgICAgICAgICAgOyBhMy1CMyAgICAgICAgICBhMy1iMworICAgIHBzcmFkICAgICAgICAgICBtbTYsICU3CisgICAgcGFja3NzZHcgICAgICAgIG1tMiwgbW02ICAgICAgICAgICAgOyBBMytCMyAgYTMrYjMgICBBMitCMiAgIGEyK2IyCisgICAgbW92cSAgICAgICBbOCArICU1XSwgbW0yCisgICAgcHNyYWQgICAgICAgICAgIG1tNCwgJTcKKyAgICBwYWNrc3NkdyAgICAgICAgbW00LCBtbTAgICAgICAgICAgICA7IEEyLUIyICBhMi1iMiAgIEEzLUIzICAgYTMtYjMKKyAgICBtb3ZxICAgICAgWzE2ICsgJTVdLCBtbTQKKyVlbmRtYWNybworCislbWFjcm8gSURDVDEgNgorICAgIG1vdnEgICAgICAgICAgICBtbTAsICUxICAgICAgICAgICAgIDsgUjQgICAgIFIwICAgICAgcjQgICAgICByMAorICAgIG1vdnEgICAgICAgICAgICBtbTEsICUyICAgICAgICAgICAgIDsgUjYgICAgIFIyICAgICAgcjYgICAgICByMgorICAgIG1vdnEgICAgICAgICAgICBtbTIsICUzICAgICAgICAgICAgIDsgUjMgICAgIFIxICAgICAgcjMgICAgICByMQorICAgIG1vdnEgICAgICAgICAgICBtbTMsICU0ICAgICAgICAgICAgIDsgUjcgICAgIFI1ICAgICAgcjcgICAgICByNQorICAgIG1vdnEgICAgICAgICAgICBtbTQsIFtjb2VmZnMgKyAxNl0gIDsgQzQgICAgIEM0ICAgICAgQzQgICAgICBDNAorICAgIHBtYWRkd2QgICAgICAgICBtbTQsIG1tMCAgICAgICAgICAgIDsgQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNSwgW2NvZWZmcyArIDI0XSAgOyAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMCwgbW01ICAgICAgICAgICAgOyAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNSwgW2NvZWZmcyArIDMyXSAgOyBDNiAgICAgQzIgICAgICBDNiAgICAgIEMyCisgICAgcG1hZGR3ZCAgICAgICAgIG1tNSwgbW0xICAgICAgICAgICAgOyBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIKKyAgICBtb3ZxICAgICAgICAgICAgbW02LCBbY29lZmZzICsgNDBdICA7IC1DMiAgICBDNiAgICAgIC1DMiAgICAgQzYKKyAgICBwbWFkZHdkICAgICAgICAgbW0xLCBtbTYgICAgICAgICAgICA7IC1DMlI2K0M2UjIgICAgIC1DMnI2K0M2cjIKKyAgICBtb3ZxICAgICAgICAgICAgbW02LCBtbTQgICAgICAgICAgICA7IEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTcsIFtjb2VmZnMgKyA0OF0gIDsgQzMgICAgIEMxICAgICAgQzMgICAgICBDMQorICAgIHBtYWRkd2QgICAgICAgICBtbTcsIG1tMiAgICAgICAgICAgIDsgQzNSMytDMVIxICAgICAgQzNyMytDMXIxCisgICAgcGFkZGQgICAgICAgICAgIG1tNCwgbW01ICAgICAgICAgICAgOyBBMCAgICAgICAgICAgICBhMAorICAgIHBzdWJkICAgICAgICAgICBtbTYsIG1tNSAgICAgICAgICAgIDsgQTMgICAgICAgICAgICAgYTMKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBtbTAgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBwYWRkZCAgICAgICAgICAgbW0wLCBtbTEgICAgICAgICAgICA7IEExICAgICAgICAgICAgIGExCisgICAgcHN1YmQgICAgICAgICAgIG1tNSwgbW0xICAgICAgICAgICAgOyBBMiAgICAgICAgICAgICBhMgorICAgIG1vdnEgICAgICAgICAgICBtbTEsIFtjb2VmZnMgKyA1Nl0gIDsgQzcgICAgIEM1ICAgICAgQzcgICAgICBDNQorICAgIHBtYWRkd2QgICAgICAgICBtbTEsIG1tMyAgICAgICAgICAgIDsgQzdSNytDNVI1ICAgICAgQzdyNytDNXI1CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMiwgW2NvZWZmcyArIDY0XSAgOyAtQzdSMytDM1IxICAgICAtQzdyMytDM3IxCisgICAgcGFkZGQgICAgICAgICAgIG1tNywgbW0xICAgICAgICAgICAgOyBCMCAgICAgICAgICAgICBiMAorICAgIG1vdnEgICAgICAgICAgICBtbTEsIFtjb2VmZnMgKyA3Ml0gIDsgLUM1ICAgIC1DMSAgICAgLUM1ICAgICAtQzEKKyAgICBwbWFkZHdkICAgICAgICAgbW0xLCBtbTMgICAgICAgICAgICA7IC1DNVI3LUMxUjUgICAgIC1DNXI3LUMxcjUKKyAgICBwYWRkZCAgICAgICAgICAgbW03LCBtbTQgICAgICAgICAgICA7IEEwK0IwICAgICAgICAgIGEwK2IwCisgICAgcGFkZGQgICAgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyAyQTAgICAgICAgICAgICAyYTAKKyAgICBwc3ViZCAgICAgICAgICAgbW00LCBtbTcgICAgICAgICAgICA7IEEwLUIwICAgICAgICAgIGEwLWIwCisgICAgcGFkZGQgICAgICAgICAgIG1tMSwgbW0yICAgICAgICAgICAgOyBCMSAgICAgICAgICAgICBiMQorICAgIHBzcmFkICAgICAgICAgICBtbTcsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNCwgJTYKKyAgICBtb3ZxICAgICAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICA7IEExICAgICAgICAgICAgIGExCisgICAgcGFkZGQgICAgICAgICAgIG1tMCwgbW0xICAgICAgICAgICAgOyBBMStCMSAgICAgICAgICBhMStiMQorICAgIHBzdWJkICAgICAgICAgICBtbTIsIG1tMSAgICAgICAgICAgIDsgQTEtQjEgICAgICAgICAgYTEtYjEKKyAgICBwc3JhZCAgICAgICAgICAgbW0wLCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTIsICU2CisgICAgcGFja3NzZHcgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgOyBBMCtCMCAgYTArYjAKKyAgICBtb3ZkICAgICAgICAgICBbJTVdLCBtbTcKKyAgICBwYWNrc3NkdyAgICAgICAgbW0wLCBtbTAgICAgICAgICAgICA7IEExK0IxICBhMStiMQorICAgIG1vdmQgICAgICBbMTYgKyAlNV0sIG1tMAorICAgIHBhY2tzc2R3ICAgICAgICBtbTIsIG1tMiAgICAgICAgICAgIDsgQTEtQjEgIGExLWIxCisgICAgbW92ZCAgICAgIFs5NiArICU1XSwgbW0yCisgICAgcGFja3NzZHcgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyBBMC1CMCAgYTAtYjAKKyAgICBtb3ZkICAgICBbMTEyICsgJTVdLCBtbTQKKyAgICBtb3ZxICAgICAgICAgICAgbW0wLCAlMyAgICAgICAgICAgICA7IFIzICAgICBSMSAgICAgIHIzICAgICAgcjEKKyAgICBtb3ZxICAgICAgICAgICAgbW00LCBbY29lZmZzICsgODBdICA7IC1DMSAgICBDNSAgICAgIC1DMSAgICAgQzUKKyAgICBwbWFkZHdkICAgICAgICAgbW00LCBtbTAgICAgICAgICAgICA7IC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEKKyAgICBtb3ZxICAgICAgICAgICAgbW03LCBbY29lZmZzICsgODhdICA7IEMzICAgICBDNyAgICAgIEMzICAgICAgQzcKKyAgICBwbWFkZHdkICAgICAgICAgbW0wLCBbY29lZmZzICsgOTZdICA7IC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEKKyAgICBwbWFkZHdkICAgICAgICAgbW03LCBtbTMgICAgICAgICAgICA7IEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNQorICAgIG1vdnEgICAgICAgICAgICBtbTIsIG1tNSAgICAgICAgICAgIDsgQTIgICAgICAgICAgICAgYTIKKyAgICBwbWFkZHdkICAgICAgICAgbW0zLCBbY29lZmZzICsgMTA0XSA7IC1DMVI3K0MzUjUgICAgIC1DMXI3K0MzcjUKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBtbTcgICAgICAgICAgICA7IEIyICAgICAgICAgICAgIGIyCisgICAgcGFkZGQgICAgICAgICAgIG1tMiwgbW00ICAgICAgICAgICAgOyBBMitCMiAgICAgICAgICBhMitiMgorICAgIHBzdWJkICAgICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgIDsgYTItQjIgICAgICAgICAgYTItYjIKKyAgICBwc3JhZCAgICAgICAgICAgbW0yLCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTUsICU2CisgICAgbW92cSAgICAgICAgICAgIG1tNCwgbW02ICAgICAgICAgICAgOyBBMyAgICAgICAgICAgICBhMworICAgIHBhZGRkICAgICAgICAgICBtbTMsIG1tMCAgICAgICAgICAgIDsgQjMgICAgICAgICAgICAgYjMKKyAgICBwYWRkZCAgICAgICAgICAgbW02LCBtbTMgICAgICAgICAgICA7IEEzK0IzICAgICAgICAgIGEzK2IzCisgICAgcHN1YmQgICAgICAgICAgIG1tNCwgbW0zICAgICAgICAgICAgOyBhMy1CMyAgICAgICAgICBhMy1iMworICAgIHBzcmFkICAgICAgICAgICBtbTYsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNCwgJTYKKyAgICBwYWNrc3NkdyAgICAgICAgbW0yLCBtbTIgICAgICAgICAgICA7IEEyK0IyICBhMitiMgorICAgIHBhY2tzc2R3ICAgICAgICBtbTYsIG1tNiAgICAgICAgICAgIDsgQTMrQjMgIGEzK2IzCisgICAgbW92ZCAgICAgIFszMiArICU1XSwgbW0yCisgICAgcGFja3NzZHcgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyBBMy1CMyAgYTMtYjMKKyAgICBwYWNrc3NkdyAgICAgICAgbW01LCBtbTUgICAgICAgICAgICA7IEEyLUIyICBhMi1iMgorICAgIG1vdmQgICAgICBbNDggKyAlNV0sIG1tNgorICAgIG1vdmQgICAgICBbNjQgKyAlNV0sIG1tNAorICAgIG1vdmQgICAgICBbODAgKyAlNV0sIG1tNQorJWVuZG1hY3JvCisKKyVtYWNybyBJRENUMiA2CisgICAgbW92cSAgICAgICAgICAgIG1tMCwgJTEgICAgICAgICAgICAgOyBSNCAgICAgUjAgICAgICByNCAgICAgIHIwCisgICAgbW92cSAgICAgICAgICAgIG1tMSwgJTIgICAgICAgICAgICAgOyBSNiAgICAgUjIgICAgICByNiAgICAgIHIyCisgICAgbW92cSAgICAgICAgICAgIG1tMywgJTQgICAgICAgICAgICAgOyBSNyAgICAgUjUgICAgICByNyAgICAgIHI1CisgICAgbW92cSAgICAgICAgICAgIG1tNCwgW2NvZWZmcyArIDE2XSAgOyBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tNCwgbW0wICAgICAgICAgICAgOyBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgMjRdICA7IC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgMzJdICA7IEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIKKyAgICBwbWFkZHdkICAgICAgICAgbW01LCBtbTEgICAgICAgICAgICA7IEM2UjYrQzJSMiAgICAgIEM2cjYrQzJyMgorICAgIG1vdnEgICAgICAgICAgICBtbTYsIFtjb2VmZnMgKyA0MF0gIDsgLUMyICAgIEM2ICAgICAgLUMyICAgICBDNgorICAgIHBtYWRkd2QgICAgICAgICBtbTEsIG1tNiAgICAgICAgICAgIDsgLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMgorICAgIG1vdnEgICAgICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgIDsgQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwCisgICAgcGFkZGQgICAgICAgICAgIG1tNCwgbW01ICAgICAgICAgICAgOyBBMCAgICAgICAgICAgICBhMAorICAgIHBzdWJkICAgICAgICAgICBtbTYsIG1tNSAgICAgICAgICAgIDsgQTMgICAgICAgICAgICAgYTMKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBtbTAgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBwYWRkZCAgICAgICAgICAgbW0wLCBtbTEgICAgICAgICAgICA7IEExICAgICAgICAgICAgIGExCisgICAgcHN1YmQgICAgICAgICAgIG1tNSwgbW0xICAgICAgICAgICAgOyBBMiAgICAgICAgICAgICBhMgorICAgIG1vdnEgICAgICAgICAgICBtbTEsIFtjb2VmZnMgKyA1Nl0gIDsgQzcgICAgIEM1ICAgICAgQzcgICAgICBDNQorICAgIHBtYWRkd2QgICAgICAgICBtbTEsIG1tMyAgICAgICAgICAgIDsgQzdSNytDNVI1ICAgICAgQzdyNytDNXI1CisgICAgbW92cSAgICAgICAgICAgIG1tNywgW2NvZWZmcyArIDcyXSAgOyAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMQorICAgIHBtYWRkd2QgICAgICAgICBtbTcsIG1tMyAgICAgICAgICAgIDsgLUM1UjctQzFSNSAgICAgLUM1cjctQzFyNQorICAgIHBhZGRkICAgICAgICAgICBtbTEsIG1tNCAgICAgICAgICAgIDsgQTArQjAgICAgICAgICAgYTArYjAKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBtbTQgICAgICAgICAgICA7IDJBMCAgICAgICAgICAgIDJhMAorICAgIHBzdWJkICAgICAgICAgICBtbTQsIG1tMSAgICAgICAgICAgIDsgQTAtQjAgICAgICAgICAgYTAtYjAKKyAgICBwc3JhZCAgICAgICAgICAgbW0xLCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTQsICU2CisgICAgbW92cSAgICAgICAgICAgIG1tMiwgbW0wICAgICAgICAgICAgOyBBMSAgICAgICAgICAgICBhMQorICAgIHBhZGRkICAgICAgICAgICBtbTAsIG1tNyAgICAgICAgICAgIDsgQTErQjEgICAgICAgICAgYTErYjEKKyAgICBwc3ViZCAgICAgICAgICAgbW0yLCBtbTcgICAgICAgICAgICA7IEExLUIxICAgICAgICAgIGExLWIxCisgICAgcHNyYWQgICAgICAgICAgIG1tMCwgJTYKKyAgICBwc3JhZCAgICAgICAgICAgbW0yLCAlNgorICAgIHBhY2tzc2R3ICAgICAgICBtbTEsIG1tMSAgICAgICAgICAgIDsgQTArQjAgIGEwK2IwCisgICAgbW92ZCAgICAgICAgICAgWyU1XSwgbW0xCisgICAgcGFja3NzZHcgICAgICAgIG1tMCwgbW0wICAgICAgICAgICAgOyBBMStCMSAgYTErYjEKKyAgICBtb3ZkICAgICAgWzE2ICsgJTVdLCBtbTAKKyAgICBwYWNrc3NkdyAgICAgICAgbW0yLCBtbTIgICAgICAgICAgICA7IEExLUIxICBhMS1iMQorICAgIG1vdmQgICAgICBbOTYgKyAlNV0sIG1tMgorICAgIHBhY2tzc2R3ICAgICAgICBtbTQsIG1tNCAgICAgICAgICAgIDsgQTAtQjAgIGEwLWIwCisgICAgbW92ZCAgICAgWzExMiArICU1XSwgbW00CisgICAgbW92cSAgICAgICAgICAgIG1tMSwgW2NvZWZmcyArIDg4XSAgOyBDMyAgICAgQzcgICAgICBDMyAgICAgIEM3CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMSwgbW0zICAgICAgICAgICAgOyBDM1I3K0M3UjUgICAgICBDM3I3K0M3cjUKKyAgICBtb3ZxICAgICAgICAgICAgbW0yLCBtbTUgICAgICAgICAgICA7IEEyICAgICAgICAgICAgIGEyCisgICAgcG1hZGR3ZCAgICAgICAgIG1tMywgW2NvZWZmcyArIDEwNF0gOyAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1CisgICAgcGFkZGQgICAgICAgICAgIG1tMiwgbW0xICAgICAgICAgICAgOyBBMitCMiAgICAgICAgICBhMitiMgorICAgIHBzdWJkICAgICAgICAgICBtbTUsIG1tMSAgICAgICAgICAgIDsgYTItQjIgICAgICAgICAgYTItYjIKKyAgICBwc3JhZCAgICAgICAgICAgbW0yLCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTUsICU2CisgICAgbW92cSAgICAgICAgICAgIG1tMSwgbW02ICAgICAgICAgICAgOyBBMyAgICAgICAgICAgICBhMworICAgIHBhZGRkICAgICAgICAgICBtbTYsIG1tMyAgICAgICAgICAgIDsgQTMrQjMgICAgICAgICAgYTMrYjMKKyAgICBwc3ViZCAgICAgICAgICAgbW0xLCBtbTMgICAgICAgICAgICA7IGEzLUIzICAgICAgICAgIGEzLWIzCisgICAgcHNyYWQgICAgICAgICAgIG1tNiwgJTYKKyAgICBwc3JhZCAgICAgICAgICAgbW0xLCAlNgorICAgIHBhY2tzc2R3ICAgICAgICBtbTIsIG1tMiAgICAgICAgICAgIDsgQTIrQjIgIGEyK2IyCisgICAgcGFja3NzZHcgICAgICAgIG1tNiwgbW02ICAgICAgICAgICAgOyBBMytCMyAgYTMrYjMKKyAgICBtb3ZkICAgICAgWzMyICsgJTVdLCBtbTIKKyAgICBwYWNrc3NkdyAgICAgICAgbW0xLCBtbTEgICAgICAgICAgICA7IEEzLUIzICBhMy1iMworICAgIHBhY2tzc2R3ICAgICAgICBtbTUsIG1tNSAgICAgICAgICAgIDsgQTItQjIgIGEyLWIyCisgICAgbW92ZCAgICAgIFs0OCArICU1XSwgbW02CisgICAgbW92ZCAgICAgIFs2NCArICU1XSwgbW0xCisgICAgbW92ZCAgICAgIFs4MCArICU1XSwgbW01CislZW5kbWFjcm8KKworJW1hY3JvIElEQ1QzIDYKKyAgICBtb3ZxICAgICAgICAgICAgbW0wLCAlMSAgICAgICAgICAgICA7IFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAKKyAgICBtb3ZxICAgICAgICAgICAgbW0zLCAlNCAgICAgICAgICAgICA7IFI3ICAgICBSNSAgICAgIHI3ICAgICAgcjUKKyAgICBtb3ZxICAgICAgICAgICAgbW00LCBbY29lZmZzICsgMTZdICA7IEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW00LCBtbTAgICAgICAgICAgICA7IEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTUsIFtjb2VmZnMgKyAyNF0gIDsgLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNAorICAgIHBtYWRkd2QgICAgICAgICBtbTAsIG1tNSAgICAgICAgICAgIDsgLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgIDsgQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgOyAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tMSwgW2NvZWZmcyArIDU2XSAgOyBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMSwgbW0zICAgICAgICAgICAgOyBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUKKyAgICBtb3ZxICAgICAgICAgICAgbW03LCBbY29lZmZzICsgNzJdICA7IC1DNSAgICAtQzEgICAgIC1DNSAgICAgLUMxCisgICAgcG1hZGR3ZCAgICAgICAgIG1tNywgbW0zICAgICAgICAgICAgOyAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1CisgICAgcGFkZGQgICAgICAgICAgIG1tMSwgbW00ICAgICAgICAgICAgOyBBMCtCMCAgICAgICAgICBhMCtiMAorICAgIHBhZGRkICAgICAgICAgICBtbTQsIG1tNCAgICAgICAgICAgIDsgMkEwICAgICAgICAgICAgMmEwCisgICAgcHN1YmQgICAgICAgICAgIG1tNCwgbW0xICAgICAgICAgICAgOyBBMC1CMCAgICAgICAgICBhMC1iMAorICAgIHBzcmFkICAgICAgICAgICBtbTEsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNCwgJTYKKyAgICBtb3ZxICAgICAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICA7IEExICAgICAgICAgICAgIGExCisgICAgcGFkZGQgICAgICAgICAgIG1tMCwgbW03ICAgICAgICAgICAgOyBBMStCMSAgICAgICAgICBhMStiMQorICAgIHBzdWJkICAgICAgICAgICBtbTIsIG1tNyAgICAgICAgICAgIDsgQTEtQjEgICAgICAgICAgYTEtYjEKKyAgICBwc3JhZCAgICAgICAgICAgbW0wLCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTIsICU2CisgICAgcGFja3NzZHcgICAgICAgIG1tMSwgbW0xICAgICAgICAgICAgOyBBMCtCMCAgYTArYjAKKyAgICBtb3ZkICAgICAgICAgICBbJTVdLCBtbTEKKyAgICBwYWNrc3NkdyAgICAgICAgbW0wLCBtbTAgICAgICAgICAgICA7IEExK0IxICBhMStiMQorICAgIG1vdmQgICAgICBbMTYgKyAlNV0sIG1tMAorICAgIHBhY2tzc2R3ICAgICAgICBtbTIsIG1tMiAgICAgICAgICAgIDsgQTEtQjEgIGExLWIxCisgICAgbW92ZCAgICAgIFs5NiArICU1XSwgbW0yCisgICAgcGFja3NzZHcgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyBBMC1CMCAgYTAtYjAKKyAgICBtb3ZkICAgICBbMTEyICsgJTVdLCBtbTQKKyAgICBtb3ZxICAgICAgICAgICAgbW0xLCBbY29lZmZzICsgODhdICA7IEMzICAgICBDNyAgICAgIEMzICAgICAgQzcKKyAgICBwbWFkZHdkICAgICAgICAgbW0xLCBtbTMgICAgICAgICAgICA7IEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNQorICAgIG1vdnEgICAgICAgICAgICBtbTIsIG1tNSAgICAgICAgICAgIDsgQTIgICAgICAgICAgICAgYTIKKyAgICBwbWFkZHdkICAgICAgICAgbW0zLCBbY29lZmZzICsgMTA0XSA7IC1DMVI3K0MzUjUgICAgIC1DMXI3K0MzcjUKKyAgICBwYWRkZCAgICAgICAgICAgbW0yLCBtbTEgICAgICAgICAgICA7IEEyK0IyICAgICAgICAgIGEyK2IyCisgICAgcHN1YmQgICAgICAgICAgIG1tNSwgbW0xICAgICAgICAgICAgOyBhMi1CMiAgICAgICAgICBhMi1iMgorICAgIHBzcmFkICAgICAgICAgICBtbTIsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNSwgJTYKKyAgICBtb3ZxICAgICAgICAgICAgbW0xLCBtbTYgICAgICAgICAgICA7IEEzICAgICAgICAgICAgIGEzCisgICAgcGFkZGQgICAgICAgICAgIG1tNiwgbW0zICAgICAgICAgICAgOyBBMytCMyAgICAgICAgICBhMytiMworICAgIHBzdWJkICAgICAgICAgICBtbTEsIG1tMyAgICAgICAgICAgIDsgYTMtQjMgICAgICAgICAgYTMtYjMKKyAgICBwc3JhZCAgICAgICAgICAgbW02LCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTEsICU2CisgICAgcGFja3NzZHcgICAgICAgIG1tMiwgbW0yICAgICAgICAgICAgOyBBMitCMiAgYTIrYjIKKyAgICBwYWNrc3NkdyAgICAgICAgbW02LCBtbTYgICAgICAgICAgICA7IEEzK0IzICBhMytiMworICAgIG1vdmQgICAgICBbMzIgKyAlNV0sIG1tMgorICAgIHBhY2tzc2R3ICAgICAgICBtbTEsIG1tMSAgICAgICAgICAgIDsgQTMtQjMgIGEzLWIzCisgICAgcGFja3NzZHcgICAgICAgIG1tNSwgbW01ICAgICAgICAgICAgOyBBMi1CMiAgYTItYjIKKyAgICBtb3ZkICAgICAgWzQ4ICsgJTVdLCBtbTYKKyAgICBtb3ZkICAgICAgWzY0ICsgJTVdLCBtbTEKKyAgICBtb3ZkICAgICAgWzgwICsgJTVdLCBtbTUKKyVlbmRtYWNybworCislbWFjcm8gSURDVDQgNgorICAgIG1vdnEgICAgICAgICAgICBtbTAsICUxICAgICAgICAgICAgIDsgUjQgICAgIFIwICAgICAgcjQgICAgICByMAorICAgIG1vdnEgICAgICAgICAgICBtbTIsICUzICAgICAgICAgICAgIDsgUjMgICAgIFIxICAgICAgcjMgICAgICByMQorICAgIG1vdnEgICAgICAgICAgICBtbTMsICU0ICAgICAgICAgICAgIDsgUjcgICAgIFI1ICAgICAgcjcgICAgICByNQorICAgIG1vdnEgICAgICAgICAgICBtbTQsIFtjb2VmZnMgKyAxNl0gIDsgQzQgICAgIEM0ICAgICAgQzQgICAgICBDNAorICAgIHBtYWRkd2QgICAgICAgICBtbTQsIG1tMCAgICAgICAgICAgIDsgQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNSwgW2NvZWZmcyArIDI0XSAgOyAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMCwgbW01ICAgICAgICAgICAgOyAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNiwgbW00ICAgICAgICAgICAgOyBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW03LCBbY29lZmZzICsgNDhdICA7IEMzICAgICBDMSAgICAgIEMzICAgICAgQzEKKyAgICBwbWFkZHdkICAgICAgICAgbW03LCBtbTIgICAgICAgICAgICA7IEMzUjMrQzFSMSAgICAgIEMzcjMrQzFyMQorICAgIG1vdnEgICAgICAgICAgICBtbTUsIG1tMCAgICAgICAgICAgIDsgLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTEsIFtjb2VmZnMgKyA1Nl0gIDsgQzcgICAgIEM1ICAgICAgQzcgICAgICBDNQorICAgIHBtYWRkd2QgICAgICAgICBtbTEsIG1tMyAgICAgICAgICAgIDsgQzdSNytDNVI1ICAgICAgQzdyNytDNXI1CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMiwgW2NvZWZmcyArIDY0XSAgOyAtQzdSMytDM1IxICAgICAtQzdyMytDM3IxCisgICAgcGFkZGQgICAgICAgICAgIG1tNywgbW0xICAgICAgICAgICAgOyBCMCAgICAgICAgICAgICBiMAorICAgIG1vdnEgICAgICAgICAgICBtbTEsIFtjb2VmZnMgKyA3Ml0gIDsgLUM1ICAgIC1DMSAgICAgLUM1ICAgICAtQzEKKyAgICBwbWFkZHdkICAgICAgICAgbW0xLCBtbTMgICAgICAgICAgICA7IC1DNVI3LUMxUjUgICAgIC1DNXI3LUMxcjUKKyAgICBwYWRkZCAgICAgICAgICAgbW03LCBtbTQgICAgICAgICAgICA7IEEwK0IwICAgICAgICAgIGEwK2IwCisgICAgcGFkZGQgICAgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyAyQTAgICAgICAgICAgICAyYTAKKyAgICBwc3ViZCAgICAgICAgICAgbW00LCBtbTcgICAgICAgICAgICA7IEEwLUIwICAgICAgICAgIGEwLWIwCisgICAgcGFkZGQgICAgICAgICAgIG1tMSwgbW0yICAgICAgICAgICAgOyBCMSAgICAgICAgICAgICBiMQorICAgIHBzcmFkICAgICAgICAgICBtbTcsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNCwgJTYKKyAgICBtb3ZxICAgICAgICAgICAgbW0yLCBtbTAgICAgICAgICAgICA7IEExICAgICAgICAgICAgIGExCisgICAgcGFkZGQgICAgICAgICAgIG1tMCwgbW0xICAgICAgICAgICAgOyBBMStCMSAgICAgICAgICBhMStiMQorICAgIHBzdWJkICAgICAgICAgICBtbTIsIG1tMSAgICAgICAgICAgIDsgQTEtQjEgICAgICAgICAgYTEtYjEKKyAgICBwc3JhZCAgICAgICAgICAgbW0wLCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTIsICU2CisgICAgcGFja3NzZHcgICAgICAgIG1tNywgbW03ICAgICAgICAgICAgOyBBMCtCMCAgYTArYjAKKyAgICBtb3ZkICAgICAgICAgICBbJTVdLCBtbTcKKyAgICBwYWNrc3NkdyAgICAgICAgbW0wLCBtbTAgICAgICAgICAgICA7IEExK0IxICBhMStiMQorICAgIG1vdmQgICAgICBbMTYgKyAlNV0sIG1tMAorICAgIHBhY2tzc2R3ICAgICAgICBtbTIsIG1tMiAgICAgICAgICAgIDsgQTEtQjEgIGExLWIxCisgICAgbW92ZCAgICAgIFs5NiArICU1XSwgbW0yCisgICAgcGFja3NzZHcgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyBBMC1CMCAgYTAtYjAKKyAgICBtb3ZkICAgICBbMTEyICsgJTVdLCBtbTQKKyAgICBtb3ZxICAgICAgICAgICAgbW0wLCAlMyAgICAgICAgICAgICA7IFIzICAgICBSMSAgICAgIHIzICAgICAgcjEKKyAgICBtb3ZxICAgICAgICAgICAgbW00LCBbY29lZmZzICsgODBdICA7IC1DMSAgICBDNSAgICAgIC1DMSAgICAgQzUKKyAgICBwbWFkZHdkICAgICAgICAgbW00LCBtbTAgICAgICAgICAgICA7IC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEKKyAgICBtb3ZxICAgICAgICAgICAgbW03LCBbY29lZmZzICsgODhdICA7IEMzICAgICBDNyAgICAgIEMzICAgICAgQzcKKyAgICBwbWFkZHdkICAgICAgICAgbW0wLCBbY29lZmZzICsgOTZdICA7IC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEKKyAgICBwbWFkZHdkICAgICAgICAgbW03LCBtbTMgICAgICAgICAgICA7IEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNQorICAgIG1vdnEgICAgICAgICAgICBtbTIsIG1tNSAgICAgICAgICAgIDsgQTIgICAgICAgICAgICAgYTIKKyAgICBwbWFkZHdkICAgICAgICAgbW0zLCBbY29lZmZzICsgMTA0XSA7IC1DMVI3K0MzUjUgICAgIC1DMXI3K0MzcjUKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBtbTcgICAgICAgICAgICA7IEIyICAgICAgICAgICAgIGIyCisgICAgcGFkZGQgICAgICAgICAgIG1tMiwgbW00ICAgICAgICAgICAgOyBBMitCMiAgICAgICAgICBhMitiMgorICAgIHBzdWJkICAgICAgICAgICBtbTUsIG1tNCAgICAgICAgICAgIDsgYTItQjIgICAgICAgICAgYTItYjIKKyAgICBwc3JhZCAgICAgICAgICAgbW0yLCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTUsICU2CisgICAgbW92cSAgICAgICAgICAgIG1tNCwgbW02ICAgICAgICAgICAgOyBBMyAgICAgICAgICAgICBhMworICAgIHBhZGRkICAgICAgICAgICBtbTMsIG1tMCAgICAgICAgICAgIDsgQjMgICAgICAgICAgICAgYjMKKyAgICBwYWRkZCAgICAgICAgICAgbW02LCBtbTMgICAgICAgICAgICA7IEEzK0IzICAgICAgICAgIGEzK2IzCisgICAgcHN1YmQgICAgICAgICAgIG1tNCwgbW0zICAgICAgICAgICAgOyBhMy1CMyAgICAgICAgICBhMy1iMworICAgIHBzcmFkICAgICAgICAgICBtbTYsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNCwgJTYKKyAgICBwYWNrc3NkdyAgICAgICAgbW0yLCBtbTIgICAgICAgICAgICA7IEEyK0IyICBhMitiMgorICAgIHBhY2tzc2R3ICAgICAgICBtbTYsIG1tNiAgICAgICAgICAgIDsgQTMrQjMgIGEzK2IzCisgICAgbW92ZCAgICAgIFszMiArICU1XSwgbW0yCisgICAgcGFja3NzZHcgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyBBMy1CMyAgYTMtYjMKKyAgICBwYWNrc3NkdyAgICAgICAgbW01LCBtbTUgICAgICAgICAgICA7IEEyLUIyICBhMi1iMgorICAgIG1vdmQgICAgICBbNDggKyAlNV0sIG1tNgorICAgIG1vdmQgICAgICBbNjQgKyAlNV0sIG1tNAorICAgIG1vdmQgICAgICBbODAgKyAlNV0sIG1tNQorJWVuZG1hY3JvCisKKyVtYWNybyBJRENUNSA2CisgICAgbW92cSAgICAgICAgICAgIG1tMCwgJTEgICAgICAgICAgICAgOyBSNCAgICAgUjAgICAgICByNCAgICAgIHIwCisgICAgbW92cSAgICAgICAgICAgIG1tMiwgJTMgICAgICAgICAgICAgOyBSMyAgICAgUjEgICAgICByMyAgICAgIHIxCisgICAgbW92cSAgICAgICAgICAgIG1tNCwgW2NvZWZmcyArIDE2XSAgOyBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tNCwgbW0wICAgICAgICAgICAgOyBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgMjRdICA7IC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW02LCBtbTQgICAgICAgICAgICA7IEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMAorICAgIG1vdnEgICAgICAgICAgICBtbTcsIFtjb2VmZnMgKyA0OF0gIDsgQzMgICAgIEMxICAgICAgQzMgICAgICBDMQorICAgIHBtYWRkd2QgICAgICAgICBtbTcsIG1tMiAgICAgICAgICAgIDsgQzNSMytDMVIxICAgICAgQzNyMytDMXIxCisgICAgbW92cSAgICAgICAgICAgIG1tNSwgbW0wICAgICAgICAgICAgOyAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tMywgW2NvZWZmcyArIDY0XQorICAgIHBtYWRkd2QgICAgICAgICBtbTMsIG1tMiAgICAgICAgICAgIDsgLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMQorICAgIHBhZGRkICAgICAgICAgICBtbTcsIG1tNCAgICAgICAgICAgIDsgQTArQjAgICAgICAgICAgYTArYjAKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBtbTQgICAgICAgICAgICA7IDJBMCAgICAgICAgICAgIDJhMAorICAgIHBzdWJkICAgICAgICAgICBtbTQsIG1tNyAgICAgICAgICAgIDsgQTAtQjAgICAgICAgICAgYTAtYjAKKyAgICBwc3JhZCAgICAgICAgICAgbW03LCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTQsICU2CisgICAgbW92cSAgICAgICAgICAgIG1tMSwgbW0wICAgICAgICAgICAgOyBBMSAgICAgICAgICAgICBhMQorICAgIHBhZGRkICAgICAgICAgICBtbTAsIG1tMyAgICAgICAgICAgIDsgQTErQjEgICAgICAgICAgYTErYjEKKyAgICBwc3ViZCAgICAgICAgICAgbW0xLCBtbTMgICAgICAgICAgICA7IEExLUIxICAgICAgICAgIGExLWIxCisgICAgcHNyYWQgICAgICAgICAgIG1tMCwgJTYKKyAgICBwc3JhZCAgICAgICAgICAgbW0xLCAlNgorICAgIHBhY2tzc2R3ICAgICAgICBtbTcsIG1tNyAgICAgICAgICAgIDsgQTArQjAgIGEwK2IwCisgICAgbW92ZCAgICAgICAgICAgWyU1XSwgbW03CisgICAgcGFja3NzZHcgICAgICAgIG1tMCwgbW0wICAgICAgICAgICAgOyBBMStCMSAgYTErYjEKKyAgICBtb3ZkICAgICAgWzE2ICsgJTVdLCBtbTAKKyAgICBwYWNrc3NkdyAgICAgICAgbW0xLCBtbTEgICAgICAgICAgICA7IEExLUIxICBhMS1iMQorICAgIG1vdmQgICAgICBbOTYgKyAlNV0sIG1tMQorICAgIHBhY2tzc2R3ICAgICAgICBtbTQsIG1tNCAgICAgICAgICAgIDsgQTAtQjAgIGEwLWIwCisgICAgbW92ZCAgICAgWzExMiArICU1XSwgbW00CisgICAgbW92cSAgICAgICAgICAgIG1tNCwgW2NvZWZmcyArIDgwXSAgOyAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1CisgICAgcG1hZGR3ZCAgICAgICAgIG1tNCwgbW0yICAgICAgICAgICAgOyAtQzFSMytDNVIxICAgICAtQzFyMytDNXIxCisgICAgcG1hZGR3ZCAgICAgICAgIG1tMiwgW2NvZWZmcyArIDk2XSAgOyAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxCisgICAgbW92cSAgICAgICAgICAgIG1tMSwgbW01ICAgICAgICAgICAgOyBBMiAgICAgICAgICAgICBhMgorICAgIHBhZGRkICAgICAgICAgICBtbTEsIG1tNCAgICAgICAgICAgIDsgQTIrQjIgICAgICAgICAgYTIrYjIKKyAgICBwc3ViZCAgICAgICAgICAgbW01LCBtbTQgICAgICAgICAgICA7IGEyLUIyICAgICAgICAgIGEyLWIyCisgICAgcHNyYWQgICAgICAgICAgIG1tMSwgJTYKKyAgICBwc3JhZCAgICAgICAgICAgbW01LCAlNgorICAgIG1vdnEgICAgICAgICAgICBtbTQsIG1tNiAgICAgICAgICAgIDsgQTMgICAgICAgICAgICAgYTMKKyAgICBwYWRkZCAgICAgICAgICAgbW02LCBtbTIgICAgICAgICAgICA7IEEzK0IzICAgICAgICAgIGEzK2IzCisgICAgcHN1YmQgICAgICAgICAgIG1tNCwgbW0yICAgICAgICAgICAgOyBhMy1CMyAgICAgICAgICBhMy1iMworICAgIHBzcmFkICAgICAgICAgICBtbTYsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNCwgJTYKKyAgICBwYWNrc3NkdyAgICAgICAgbW0xLCBtbTEgICAgICAgICAgICA7IEEyK0IyICBhMitiMgorICAgIHBhY2tzc2R3ICAgICAgICBtbTYsIG1tNiAgICAgICAgICAgIDsgQTMrQjMgIGEzK2IzCisgICAgbW92ZCAgICAgIFszMiArICU1XSwgbW0xCisgICAgcGFja3NzZHcgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyBBMy1CMyAgYTMtYjMKKyAgICBwYWNrc3NkdyAgICAgICAgbW01LCBtbTUgICAgICAgICAgICA7IEEyLUIyICBhMi1iMgorICAgIG1vdmQgICAgICBbNDggKyAlNV0sIG1tNgorICAgIG1vdmQgICAgICBbNjQgKyAlNV0sIG1tNAorICAgIG1vdmQgICAgICBbODAgKyAlNV0sIG1tNQorJWVuZG1hY3JvCisKKyVtYWNybyBJRENUNiA2CisgICAgbW92cSAgICAgICAgICAgIG1tMCwgWyUxXSAgICAgICAgICAgOyBSNCAgICAgUjAgICAgICByNCAgICAgIHIwCisgICAgbW92cSAgICAgICAgICAgIG1tMSwgWyUyXSAgICAgICAgICAgOyBSNiAgICAgUjIgICAgICByNiAgICAgIHIyCisgICAgbW92cSAgICAgICAgICAgIG1tNCwgW2NvZWZmcyArIDE2XSAgOyBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tNCwgbW0wICAgICAgICAgICAgOyBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgMjRdICA7IC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgMzJdICA7IEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIKKyAgICBwbWFkZHdkICAgICAgICAgbW01LCBtbTEgICAgICAgICAgICA7IEM2UjYrQzJSMiAgICAgIEM2cjYrQzJyMgorICAgIG1vdnEgICAgICAgICAgICBtbTYsIFtjb2VmZnMgKyA0MF0gIDsgLUMyICAgIEM2ICAgICAgLUMyICAgICBDNgorICAgIHBtYWRkd2QgICAgICAgICBtbTEsIG1tNiAgICAgICAgICAgIDsgLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMgorICAgIG1vdnEgICAgICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgIDsgQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwCisgICAgcGFkZGQgICAgICAgICAgIG1tNCwgbW01ICAgICAgICAgICAgOyBBMCAgICAgICAgICAgICBhMAorICAgIHBzdWJkICAgICAgICAgICBtbTYsIG1tNSAgICAgICAgICAgIDsgQTMgICAgICAgICAgICAgYTMKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBtbTAgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBwYWRkZCAgICAgICAgICAgbW0wLCBtbTEgICAgICAgICAgICA7IEExICAgICAgICAgICAgIGExCisgICAgcHN1YmQgICAgICAgICAgIG1tNSwgbW0xICAgICAgICAgICAgOyBBMiAgICAgICAgICAgICBhMgorICAgIG1vdnEgICAgICAgICAgICBtbTIsIFs4ICsgJTFdICAgICAgIDsgUjQgICAgIFIwICAgICAgcjQgICAgICByMAorICAgIG1vdnEgICAgICAgICAgICBtbTMsIFs4ICsgJTJdICAgICAgIDsgUjYgICAgIFIyICAgICAgcjYgICAgICByMgorICAgIG1vdnEgICAgICAgICAgICBtbTEsIFtjb2VmZnMgKyAxNl0gIDsgQzQgICAgIEM0ICAgICAgQzQgICAgICBDNAorICAgIHBtYWRkd2QgICAgICAgICBtbTEsIG1tMiAgICAgICAgICAgIDsgQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNywgW2NvZWZmcyArIDI0XSAgOyAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMiwgbW03ICAgICAgICAgICAgOyAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNywgW2NvZWZmcyArIDMyXSAgOyBDNiAgICAgQzIgICAgICBDNiAgICAgIEMyCisgICAgcG1hZGR3ZCAgICAgICAgIG1tNywgbW0zICAgICAgICAgICAgOyBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIKKyAgICBwbWFkZHdkICAgICAgICAgbW0zLCBbY29lZmZzICsgNDBdICA7IC1DMlI2K0M2UjIgICAgIC1DMnI2K0M2cjIKKyAgICBwYWRkZCAgICAgICAgICAgbW03LCBtbTEgICAgICAgICAgICA7IEEwICAgICAgICAgICAgIGEwCisgICAgcGFkZGQgICAgICAgICAgIG1tMSwgbW0xICAgICAgICAgICAgOyAyQzAgICAgICAgICAgICAyYzAKKyAgICBwc3ViZCAgICAgICAgICAgbW0xLCBtbTcgICAgICAgICAgICA7IEEzICAgICAgICAgICAgIGEzCisgICAgcGFkZGQgICAgICAgICAgIG1tMywgbW0yICAgICAgICAgICAgOyBBMSAgICAgICAgICAgICBhMQorICAgIHBhZGRkICAgICAgICAgICBtbTIsIG1tMiAgICAgICAgICAgIDsgMkMxICAgICAgICAgICAgMmMxCisgICAgcHN1YmQgICAgICAgICAgIG1tMiwgbW0zICAgICAgICAgICAgOyBBMiAgICAgICAgICAgICBhMgorICAgIHBzcmFkICAgICAgICAgICBtbTQsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNywgJTYKKyAgICBwc3JhZCAgICAgICAgICAgbW0zLCAlNgorICAgIHBhY2tzc2R3ICAgICAgICBtbTQsIG1tNyAgICAgICAgICAgIDsgQTAgICAgIGEwCisgICAgbW92cSAgICAgICAgICAgWyU1XSwgbW00CisgICAgcHNyYWQgICAgICAgICAgIG1tMCwgJTYKKyAgICBwYWNrc3NkdyAgICAgICAgbW0wLCBtbTMgICAgICAgICAgICA7IEExICAgICBhMQorICAgIG1vdnEgICAgICBbMTYgKyAlNV0sIG1tMAorICAgIG1vdnEgICAgICBbOTYgKyAlNV0sIG1tMAorICAgIG1vdnEgICAgIFsxMTIgKyAlNV0sIG1tNAorICAgIHBzcmFkICAgICAgICAgICBtbTUsICU2CisgICAgcHNyYWQgICAgICAgICAgIG1tNiwgJTYKKyAgICBwc3JhZCAgICAgICAgICAgbW0yLCAlNgorICAgIHBhY2tzc2R3ICAgICAgICBtbTUsIG1tMiAgICAgICAgICAgIDsgQTItQjIgIGEyLWIyCisgICAgbW92cSAgICAgIFszMiArICU1XSwgbW01CisgICAgcHNyYWQgICAgICAgICAgIG1tMSwgJTYKKyAgICBwYWNrc3NkdyAgICAgICAgbW02LCBtbTEgICAgICAgICAgICA7IEEzK0IzICBhMytiMworICAgIG1vdnEgICAgICBbNDggKyAlNV0sIG1tNgorICAgIG1vdnEgICAgICBbNjQgKyAlNV0sIG1tNgorICAgIG1vdnEgICAgICBbODAgKyAlNV0sIG1tNQorJWVuZG1hY3JvCisKKyVtYWNybyBJRENUNyA2CisgICAgbW92cSAgICAgICAgICAgIG1tMCwgJTEgICAgICAgICAgICAgOyBSNCAgICAgUjAgICAgICByNCAgICAgIHIwCisgICAgbW92cSAgICAgICAgICAgIG1tMSwgJTIgICAgICAgICAgICAgOyBSNiAgICAgUjIgICAgICByNiAgICAgIHIyCisgICAgbW92cSAgICAgICAgICAgIG1tMiwgJTMgICAgICAgICAgICAgOyBSMyAgICAgUjEgICAgICByMyAgICAgIHIxCisgICAgbW92cSAgICAgICAgICAgIG1tNCwgW2NvZWZmcyArIDE2XSAgOyBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tNCwgbW0wICAgICAgICAgICAgOyBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgMjRdICA7IC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgMzJdICA7IEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIKKyAgICBwbWFkZHdkICAgICAgICAgbW01LCBtbTEgICAgICAgICAgICA7IEM2UjYrQzJSMiAgICAgIEM2cjYrQzJyMgorICAgIG1vdnEgICAgICAgICAgICBtbTYsIFtjb2VmZnMgKyA0MF0gIDsgLUMyICAgIEM2ICAgICAgLUMyICAgICBDNgorICAgIHBtYWRkd2QgICAgICAgICBtbTEsIG1tNiAgICAgICAgICAgIDsgLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMgorICAgIG1vdnEgICAgICAgICAgICBtbTYsIG1tNCAgICAgICAgICAgIDsgQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNywgW2NvZWZmcyArIDQ4XSAgOyBDMyAgICAgQzEgICAgICBDMyAgICAgIEMxCisgICAgcG1hZGR3ZCAgICAgICAgIG1tNywgbW0yICAgICAgICAgICAgOyBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBtbTUgICAgICAgICAgICA7IEEwICAgICAgICAgICAgIGEwCisgICAgcHN1YmQgICAgICAgICAgIG1tNiwgbW01ICAgICAgICAgICAgOyBBMyAgICAgICAgICAgICBhMworICAgIG1vdnEgICAgICAgICAgICBtbTUsIG1tMCAgICAgICAgICAgIDsgLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMAorICAgIHBhZGRkICAgICAgICAgICBtbTAsIG1tMSAgICAgICAgICAgIDsgQTEgICAgICAgICAgICAgYTEKKyAgICBwc3ViZCAgICAgICAgICAgbW01LCBtbTEgICAgICAgICAgICA7IEEyICAgICAgICAgICAgIGEyCisgICAgbW92cSAgICAgICAgICAgIG1tMSwgW2NvZWZmcyArIDY0XQorICAgIHBtYWRkd2QgICAgICAgICBtbTEsIG1tMiAgICAgICAgICAgIDsgLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMQorICAgIHBhZGRkICAgICAgICAgICBtbTcsIG1tNCAgICAgICAgICAgIDsgQTArQjAgICAgICAgICAgYTArYjAKKyAgICBwYWRkZCAgICAgICAgICAgbW00LCBtbTQgICAgICAgICAgICA7IDJBMCAgICAgICAgICAgIDJhMAorICAgIHBzdWJkICAgICAgICAgICBtbTQsIG1tNyAgICAgICAgICAgIDsgQTAtQjAgICAgICAgICAgYTAtYjAKKyAgICBwc3JhZCAgICAgICAgICAgbW03LCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTQsICU2CisgICAgbW92cSAgICAgICAgICAgIG1tMywgbW0wICAgICAgICAgICAgOyBBMSAgICAgICAgICAgICBhMQorICAgIHBhZGRkICAgICAgICAgICBtbTAsIG1tMSAgICAgICAgICAgIDsgQTErQjEgICAgICAgICAgYTErYjEKKyAgICBwc3ViZCAgICAgICAgICAgbW0zLCBtbTEgICAgICAgICAgICA7IEExLUIxICAgICAgICAgIGExLWIxCisgICAgcHNyYWQgICAgICAgICAgIG1tMCwgJTYKKyAgICBwc3JhZCAgICAgICAgICAgbW0zLCAlNgorICAgIHBhY2tzc2R3ICAgICAgICBtbTcsIG1tNyAgICAgICAgICAgIDsgQTArQjAgIGEwK2IwCisgICAgbW92ZCAgICAgICAgICAgWyU1XSwgbW03CisgICAgcGFja3NzZHcgICAgICAgIG1tMCwgbW0wICAgICAgICAgICAgOyBBMStCMSAgYTErYjEKKyAgICBtb3ZkICAgICAgWzE2ICsgJTVdLCBtbTAKKyAgICBwYWNrc3NkdyAgICAgICAgbW0zLCBtbTMgICAgICAgICAgICA7IEExLUIxICBhMS1iMQorICAgIG1vdmQgICAgICBbOTYgKyAlNV0sIG1tMworICAgIHBhY2tzc2R3ICAgICAgICBtbTQsIG1tNCAgICAgICAgICAgIDsgQTAtQjAgIGEwLWIwCisgICAgbW92ZCAgICAgWzExMiArICU1XSwgbW00CisgICAgbW92cSAgICAgICAgICAgIG1tNCwgW2NvZWZmcyArIDgwXSAgOyAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1CisgICAgcG1hZGR3ZCAgICAgICAgIG1tNCwgbW0yICAgICAgICAgICAgOyAtQzFSMytDNVIxICAgICAtQzFyMytDNXIxCisgICAgcG1hZGR3ZCAgICAgICAgIG1tMiwgW2NvZWZmcyArIDk2XSAgOyAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxCisgICAgbW92cSAgICAgICAgICAgIG1tMywgbW01ICAgICAgICAgICAgOyBBMiAgICAgICAgICAgICBhMgorICAgIHBhZGRkICAgICAgICAgICBtbTMsIG1tNCAgICAgICAgICAgIDsgQTIrQjIgICAgICAgICAgYTIrYjIKKyAgICBwc3ViZCAgICAgICAgICAgbW01LCBtbTQgICAgICAgICAgICA7IGEyLUIyICAgICAgICAgIGEyLWIyCisgICAgcHNyYWQgICAgICAgICAgIG1tMywgJTYKKyAgICBwc3JhZCAgICAgICAgICAgbW01LCAlNgorICAgIG1vdnEgICAgICAgICAgICBtbTQsIG1tNiAgICAgICAgICAgIDsgQTMgICAgICAgICAgICAgYTMKKyAgICBwYWRkZCAgICAgICAgICAgbW02LCBtbTIgICAgICAgICAgICA7IEEzK0IzICAgICAgICAgIGEzK2IzCisgICAgcHN1YmQgICAgICAgICAgIG1tNCwgbW0yICAgICAgICAgICAgOyBhMy1CMyAgICAgICAgICBhMy1iMworICAgIHBzcmFkICAgICAgICAgICBtbTYsICU2CisgICAgcGFja3NzZHcgICAgICAgIG1tMywgbW0zICAgICAgICAgICAgOyBBMitCMiAgYTIrYjIKKyAgICBtb3ZkICAgICAgWzMyICsgJTVdLCBtbTMKKyAgICBwc3JhZCAgICAgICAgICAgbW00LCAlNgorICAgIHBhY2tzc2R3ICAgICAgICBtbTYsIG1tNiAgICAgICAgICAgIDsgQTMrQjMgIGEzK2IzCisgICAgbW92ZCAgICAgIFs0OCArICU1XSwgbW02CisgICAgcGFja3NzZHcgICAgICAgIG1tNCwgbW00ICAgICAgICAgICAgOyBBMy1CMyAgYTMtYjMKKyAgICBwYWNrc3NkdyAgICAgICAgbW01LCBtbTUgICAgICAgICAgICA7IEEyLUIyICBhMi1iMgorICAgIG1vdmQgICAgICBbNjQgKyAlNV0sIG1tNAorICAgIG1vdmQgICAgICBbODAgKyAlNV0sIG1tNQorJWVuZG1hY3JvCisKKyVtYWNybyBJRENUOCA2CisgICAgbW92cSAgICAgICAgICAgIG1tMCwgWyUxXSAgICAgICAgICAgOyBSNCAgICAgUjAgICAgICByNCAgICAgIHIwCisgICAgbW92cSAgICAgICAgICAgIG1tNCwgW2NvZWZmcyArIDE2XSAgOyBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tNCwgbW0wICAgICAgICAgICAgOyBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW01LCBbY29lZmZzICsgMjRdICA7IC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW0wLCBtbTUgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBwc3JhZCAgICAgICAgICAgbW00LCAlNgorICAgIHBzcmFkICAgICAgICAgICBtbTAsICU2CisgICAgbW92cSAgICAgICAgICAgIG1tMiwgWzggKyAlMV0gICAgICAgOyBSNCAgICAgUjAgICAgICByNCAgICAgIHIwCisgICAgbW92cSAgICAgICAgICAgIG1tMSwgW2NvZWZmcyArIDE2XSAgOyBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0CisgICAgcG1hZGR3ZCAgICAgICAgIG1tMSwgbW0yICAgICAgICAgICAgOyBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW03LCBbY29lZmZzICsgMjRdICA7IC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQKKyAgICBwbWFkZHdkICAgICAgICAgbW0yLCBtbTcgICAgICAgICAgICA7IC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAKKyAgICBtb3ZxICAgICAgICAgICAgbW03LCBbY29lZmZzICsgMzJdICA7IEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIKKyAgICBwc3JhZCAgICAgICAgICAgbW0xLCAlNgorICAgIHBhY2tzc2R3ICAgICAgICBtbTQsIG1tMSAgICAgICAgICAgIDsgQTAgICAgIGEwCisgICAgbW92cSAgICAgICAgICAgWyU1XSwgbW00CisgICAgcHNyYWQgICAgICAgICAgIG1tMiwgJTYKKyAgICBwYWNrc3NkdyAgICAgICAgbW0wLCBtbTIgICAgICAgICAgICA7IEExICAgICBhMQorICAgIG1vdnEgICAgICBbMTYgKyAlNV0sIG1tMAorICAgIG1vdnEgICAgICBbOTYgKyAlNV0sIG1tMAorICAgIG1vdnEgICAgIFsxMTIgKyAlNV0sIG1tNAorICAgIG1vdnEgICAgICBbMzIgKyAlNV0sIG1tMAorICAgIG1vdnEgICAgICBbNDggKyAlNV0sIG1tNAorICAgIG1vdnEgICAgICBbNjQgKyAlNV0sIG1tNAorICAgIG1vdnEgICAgICBbODAgKyAlNV0sIG1tMAorJWVuZG1hY3JvCisKKyVtYWNybyBJRENUIDAKKyAgICBEQ19DT05EX0lEQ1QgIDAsICAgOCwgIDE2LCAgMjQsIHJzcCArICAwLCBudWxsLCAxMQorICAgIFpfQ09ORF9JRENUICAzMiwgIDQwLCAgNDgsICA1NiwgcnNwICsgMzIsIG51bGwsIDExLCAlJTQKKyAgICBaX0NPTkRfSURDVCAgNjQsICA3MiwgIDgwLCAgODgsIHJzcCArIDY0LCBudWxsLCAxMSwgJSUyCisgICAgWl9DT05EX0lEQ1QgIDk2LCAxMDQsIDExMiwgMTIwLCByc3AgKyA5NiwgbnVsbCwgMTEsICUlMQorCisgICAgSURDVDEgW3JzcCArICAwXSwgW3JzcCArIDY0XSwgW3JzcCArIDMyXSwgW3JzcCArICA5Nl0sIGJsb2NrcSArICAwLCAyMAorICAgIElEQ1QxIFtyc3AgKyAgOF0sIFtyc3AgKyA3Ml0sIFtyc3AgKyA0MF0sIFtyc3AgKyAxMDRdLCBibG9ja3EgKyAgNCwgMjAKKyAgICBJRENUMSBbcnNwICsgMTZdLCBbcnNwICsgODBdLCBbcnNwICsgNDhdLCBbcnNwICsgMTEyXSwgYmxvY2txICsgIDgsIDIwCisgICAgSURDVDEgW3JzcCArIDI0XSwgW3JzcCArIDg4XSwgW3JzcCArIDU2XSwgW3JzcCArIDEyMF0sIGJsb2NrcSArIDEyLCAyMAorICAgIGptcCAlJTkKKworICAgIEFMSUdOIDE2CisgICAgJSU0OgorICAgIFpfQ09ORF9JRENUIDY0LCAgNzIsICA4MCwgIDg4LCByc3AgKyA2NCwgbnVsbCwgMTEsICUlNgorICAgIFpfQ09ORF9JRENUIDk2LCAxMDQsIDExMiwgMTIwLCByc3AgKyA5NiwgbnVsbCwgMTEsICUlNQorCisgICAgSURDVDIgW3JzcCArICAwXSwgW3JzcCArIDY0XSwgW3JzcCArIDMyXSwgW3JzcCArICA5Nl0sIGJsb2NrcSArICAwLCAyMAorICAgIElEQ1QyIFtyc3AgKyAgOF0sIFtyc3AgKyA3Ml0sIFtyc3AgKyA0MF0sIFtyc3AgKyAxMDRdLCBibG9ja3EgKyAgNCwgMjAKKyAgICBJRENUMiBbcnNwICsgMTZdLCBbcnNwICsgODBdLCBbcnNwICsgNDhdLCBbcnNwICsgMTEyXSwgYmxvY2txICsgIDgsIDIwCisgICAgSURDVDIgW3JzcCArIDI0XSwgW3JzcCArIDg4XSwgW3JzcCArIDU2XSwgW3JzcCArIDEyMF0sIGJsb2NrcSArIDEyLCAyMAorICAgIGptcCAlJTkKKworICAgIEFMSUdOIDE2CisgICAgJSU2OgorICAgIFpfQ09ORF9JRENUIDk2LCAxMDQsIDExMiwgMTIwLCByc3AgKyA5NiwgbnVsbCwgMTEsICUlNworCisgICAgSURDVDMgW3JzcCArICAwXSwgW3JzcCArIDY0XSwgW3JzcCArIDMyXSwgW3JzcCArICA5Nl0sIGJsb2NrcSArICAwLCAyMAorICAgIElEQ1QzIFtyc3AgKyAgOF0sIFtyc3AgKyA3Ml0sIFtyc3AgKyA0MF0sIFtyc3AgKyAxMDRdLCBibG9ja3EgKyAgNCwgMjAKKyAgICBJRENUMyBbcnNwICsgMTZdLCBbcnNwICsgODBdLCBbcnNwICsgNDhdLCBbcnNwICsgMTEyXSwgYmxvY2txICsgIDgsIDIwCisgICAgSURDVDMgW3JzcCArIDI0XSwgW3JzcCArIDg4XSwgW3JzcCArIDU2XSwgW3JzcCArIDEyMF0sIGJsb2NrcSArIDEyLCAyMAorICAgIGptcCAlJTkKKworICAgIEFMSUdOIDE2CisgICAgJSUyOgorICAgIFpfQ09ORF9JRENUIDk2LCAxMDQsIDExMiwgMTIwLCByc3AgKyA5NiwgbnVsbCwgMTEsICUlMworCisgICAgSURDVDQgW3JzcCArICAwXSwgW3JzcCArIDY0XSwgW3JzcCArIDMyXSwgW3JzcCArICA5Nl0sIGJsb2NrcSArICAwLCAyMAorICAgIElEQ1Q0IFtyc3AgKyAgOF0sIFtyc3AgKyA3Ml0sIFtyc3AgKyA0MF0sIFtyc3AgKyAxMDRdLCBibG9ja3EgKyAgNCwgMjAKKyAgICBJRENUNCBbcnNwICsgMTZdLCBbcnNwICsgODBdLCBbcnNwICsgNDhdLCBbcnNwICsgMTEyXSwgYmxvY2txICsgIDgsIDIwCisgICAgSURDVDQgW3JzcCArIDI0XSwgW3JzcCArIDg4XSwgW3JzcCArIDU2XSwgW3JzcCArIDEyMF0sIGJsb2NrcSArIDEyLCAyMAorICAgIGptcCAlJTkKKworICAgIEFMSUdOIDE2CisgICAgJSUzOgorCisgICAgSURDVDUgW3JzcCArICAwXSwgW3JzcCArIDY0XSwgW3JzcCArIDMyXSwgW3JzcCArICA5Nl0sIGJsb2NrcSArICAwLCAyMAorICAgIElEQ1Q1IFtyc3AgKyAgOF0sIFtyc3AgKyA3Ml0sIFtyc3AgKyA0MF0sIFtyc3AgKyAxMDRdLCBibG9ja3EgKyAgNCwgMjAKKyAgICBJRENUNSBbcnNwICsgMTZdLCBbcnNwICsgODBdLCBbcnNwICsgNDhdLCBbcnNwICsgMTEyXSwgYmxvY2txICsgIDgsIDIwCisgICAgSURDVDUgW3JzcCArIDI0XSwgW3JzcCArIDg4XSwgW3JzcCArIDU2XSwgW3JzcCArIDEyMF0sIGJsb2NrcSArIDEyLCAyMAorICAgIGptcCAlJTkKKworICAgIEFMSUdOIDE2CisgICAgJSU1OgorCisgICAgSURDVDYgcnNwICsgIDAsIHJzcCArIDY0LCByc3AgKyAzMiwgcnNwICsgIDk2LCBibG9ja3EgKyAgMCwgMjAKKyAgICBJRENUNiByc3AgKyAxNiwgcnNwICsgODAsIHJzcCArIDQ4LCByc3AgKyAxMTIsIGJsb2NrcSArICA4LCAyMAorICAgIGptcCAlJTkKKworICAgIEFMSUdOIDE2CisgICAgJSUxOgorCisgICAgSURDVDcgW3JzcCArICAwXSwgW3JzcCArIDY0XSwgW3JzcCArIDMyXSwgW3JzcCArICA5Nl0sIGJsb2NrcSArICAwLCAyMAorICAgIElEQ1Q3IFtyc3AgKyAgOF0sIFtyc3AgKyA3Ml0sIFtyc3AgKyA0MF0sIFtyc3AgKyAxMDRdLCBibG9ja3EgKyAgNCwgMjAKKyAgICBJRENUNyBbcnNwICsgMTZdLCBbcnNwICsgODBdLCBbcnNwICsgNDhdLCBbcnNwICsgMTEyXSwgYmxvY2txICsgIDgsIDIwCisgICAgSURDVDcgW3JzcCArIDI0XSwgW3JzcCArIDg4XSwgW3JzcCArIDU2XSwgW3JzcCArIDEyMF0sIGJsb2NrcSArIDEyLCAyMAorICAgIGptcCAlJTkKKworICAgIEFMSUdOIDE2CisgICAgJSU3OgorCisgICAgSURDVDggcnNwICsgIDAsIHJzcCArIDY0LCByc3AgKyAzMiwgcnNwICsgIDk2LCBibG9ja3EgKyAgMCwgMjAKKyAgICBJRENUOCByc3AgKyAxNiwgcnNwICsgODAsIHJzcCArIDQ4LCByc3AgKyAxMTIsIGJsb2NrcSArICA4LCAyMAorCisgICAgJSU5OgorJWVuZG1hY3JvCisKKyVtYWNybyBQVVRfUElYRUxTX0NMQU1QRURfSEFMRiAxCisgICAgbW92YSAgICAgbTAsIFtibG9ja3ErbW1zaXplKjArJTFdCisgICAgbW92YSAgICAgbTEsIFtibG9ja3ErbW1zaXplKjIrJTFdCislaWYgbW1zaXplID09IDgKKyAgICBtb3ZhICAgICBtMiwgW2Jsb2NrcSttbXNpemUqNCslMV0KKyAgICBtb3ZhICAgICBtMywgW2Jsb2NrcSttbXNpemUqNislMV0KKyVlbmRpZgorICAgIHBhY2t1c3diIG0wLCBbYmxvY2txK21tc2l6ZSoxKyUxXQorICAgIHBhY2t1c3diIG0xLCBbYmxvY2txK21tc2l6ZSozKyUxXQorJWlmIG1tc2l6ZSA9PSA4CisgICAgcGFja3Vzd2IgbTIsIFtibG9ja3ErbW1zaXplKjUrJTFdCisgICAgcGFja3Vzd2IgbTMsIFtibG9ja3ErbW1zaXplKjcrJTFdCisgICAgbW92cSAgICAgICAgICAgW3BpeGVsc3FdLCBtMAorICAgIG1vdnEgICAgW2xzaXplcStwaXhlbHNxXSwgbTEKKyAgICBtb3ZxICBbMipsc2l6ZXErcGl4ZWxzcV0sIG0yCisgICAgbW92cSAgIFtsc2l6ZTNxK3BpeGVsc3FdLCBtMworJWVsc2UKKyAgICBtb3ZxICAgICAgICAgICBbcGl4ZWxzcV0sIG0wCisgICAgbW92aHBzICBbbHNpemVxK3BpeGVsc3FdLCBtMAorICAgIG1vdnEgIFsyKmxzaXplcStwaXhlbHNxXSwgbTEKKyAgICBtb3ZocHMgW2xzaXplM3ErcGl4ZWxzcV0sIG0xCislZW5kaWYKKyVlbmRtYWNybworCislbWFjcm8gQUREX1BJWEVMU19DTEFNUEVEIDEKKyAgICBtb3ZhICAgICAgIG0wLCBbYmxvY2txK21tc2l6ZSowKyUxXQorICAgIG1vdmEgICAgICAgbTEsIFtibG9ja3ErbW1zaXplKjErJTFdCislaWYgbW1zaXplID09IDgKKyAgICBtb3ZhICAgICAgIG01LCBbYmxvY2txK21tc2l6ZSoyKyUxXQorICAgIG1vdmEgICAgICAgbTYsIFtibG9ja3ErbW1zaXplKjMrJTFdCislZW5kaWYKKyAgICBtb3ZxICAgICAgIG0yLCBbcGl4ZWxzcV0KKyAgICBtb3ZxICAgICAgIG0zLCBbcGl4ZWxzcStsc2l6ZXFdCislaWYgbW1zaXplID09IDgKKyAgICBtb3ZhICAgICAgIG03LCBtMgorICAgIHB1bnBja2xidyAgbTIsIG00CisgICAgcHVucGNraGJ3ICBtNywgbTQKKyAgICBwYWRkc3cgICAgIG0wLCBtMgorICAgIHBhZGRzdyAgICAgbTEsIG03CisgICAgbW92YSAgICAgICBtNywgbTMKKyAgICBwdW5wY2tsYncgIG0zLCBtNAorICAgIHB1bnBja2hidyAgbTcsIG00CisgICAgcGFkZHN3ICAgICBtNSwgbTMKKyAgICBwYWRkc3cgICAgIG02LCBtNworJWVsc2UKKyAgICBwdW5wY2tsYncgIG0yLCBtNAorICAgIHB1bnBja2xidyAgbTMsIG00CisgICAgcGFkZHN3ICAgICBtMCwgbTIKKyAgICBwYWRkc3cgICAgIG0xLCBtMworJWVuZGlmCisgICAgcGFja3Vzd2IgICBtMCwgbTEKKyVpZiBtbXNpemUgPT0gOAorICAgIHBhY2t1c3diICAgbTUsIG02CisgICAgbW92cSAgICAgICBbcGl4ZWxzcV0sIG0wCisgICAgbW92cSAgICAgICBbcGl4ZWxzcStsc2l6ZXFdLCBtNQorJWVsc2UKKyAgICBtb3ZxICAgICAgIFtwaXhlbHNxXSwgbTAKKyAgICBtb3ZocHMgICAgIFtwaXhlbHNxK2xzaXplcV0sIG0wCislZW5kaWYKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKKworY2dsb2JhbCBzaW1wbGVfaWRjdCwgMSwgMiwgOCwgMTI4LCBibG9jaywgdDAKKyAgICBJRENUCitSRVQKKworY2dsb2JhbCBzaW1wbGVfaWRjdF9wdXQsIDMsIDUsIDgsIDEyOCwgcGl4ZWxzLCBsc2l6ZSwgYmxvY2ssIGxzaXplMywgdDAKKyAgICBJRENUCisgICAgbGVhIGxzaXplM3EsIFtsc2l6ZXEqM10KKyAgICBQVVRfUElYRUxTX0NMQU1QRURfSEFMRiAwCisgICAgbGVhIHBpeGVsc3EsIFtwaXhlbHNxK2xzaXplcSo0XQorICAgIFBVVF9QSVhFTFNfQ0xBTVBFRF9IQUxGIDY0CitSRVQKKworY2dsb2JhbCBzaW1wbGVfaWRjdF9hZGQsIDMsIDQsIDgsIDEyOCwgcGl4ZWxzLCBsc2l6ZSwgYmxvY2ssIHQwCisgICAgSURDVAorICAgIHB4b3IgICAgICAgbTQsIG00CisgICAgQUREX1BJWEVMU19DTEFNUEVEIDAKKyAgICBsZWEgICAgICAgIHBpeGVsc3EsIFtwaXhlbHNxK2xzaXplcSoyXQorICAgIEFERF9QSVhFTFNfQ0xBTVBFRCAzMgorICAgIGxlYSAgICAgICAgcGl4ZWxzcSwgW3BpeGVsc3ErbHNpemVxKjJdCisgICAgQUREX1BJWEVMU19DTEFNUEVEIDY0CisgICAgbGVhICAgICAgICBwaXhlbHNxLCBbcGl4ZWxzcStsc2l6ZXEqMl0KKyAgICBBRERfUElYRUxTX0NMQU1QRUQgOTYKK1JFVAorCitJTklUX1hNTSBzc2UyCisKK2NnbG9iYWwgc2ltcGxlX2lkY3RfcHV0LCAzLCA1LCA4LCAxMjgsIHBpeGVscywgbHNpemUsIGJsb2NrLCBsc2l6ZTMsIHQwCisgICAgSURDVAorICAgIGxlYSBsc2l6ZTNxLCBbbHNpemVxKjNdCisgICAgUFVUX1BJWEVMU19DTEFNUEVEX0hBTEYgMAorICAgIGxlYSBwaXhlbHNxLCBbcGl4ZWxzcStsc2l6ZXEqNF0KKyAgICBQVVRfUElYRUxTX0NMQU1QRURfSEFMRiA2NAorUkVUCisKK2NnbG9iYWwgc2ltcGxlX2lkY3RfYWRkLCAzLCA0LCA4LCAxMjgsIHBpeGVscywgbHNpemUsIGJsb2NrLCB0MAorICAgIElEQ1QKKyAgICBweG9yICAgICAgIG00LCBtNAorICAgIEFERF9QSVhFTFNfQ0xBTVBFRCAwCisgICAgbGVhICAgICAgICBwaXhlbHNxLCBbcGl4ZWxzcStsc2l6ZXEqMl0KKyAgICBBRERfUElYRUxTX0NMQU1QRUQgMzIKKyAgICBsZWEgICAgICAgIHBpeGVsc3EsIFtwaXhlbHNxK2xzaXplcSoyXQorICAgIEFERF9QSVhFTFNfQ0xBTVBFRCA2NAorICAgIGxlYSAgICAgICAgcGl4ZWxzcSwgW3BpeGVsc3ErbHNpemVxKjJdCisgICAgQUREX1BJWEVMU19DTEFNUEVEIDk2CitSRVQKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0LmMgYi9saWJhdmNvZGVjL3g4Ni9zaW1wbGVfaWRjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDQ2MjEyLi4wMDAwMDAwCi0tLSBhL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTczICswLDAgQEAKLS8qCi0gKiBTaW1wbGUgSURDVCBNTVgKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgotCi0jaW5jbHVkZSAibGliYXZjb2RlYy9pZGN0ZHNwLmgiCi0KLSNpbmNsdWRlICJpZGN0ZHNwLmgiCi0jaW5jbHVkZSAic2ltcGxlX2lkY3QuaCIKLQotI2lmIEhBVkVfSU5MSU5FX0FTTQotCi0vKgotMjMxNzAuNDc1MDA2Ci0yMjcyNS4yNjA4MjYKLTIxNDA2LjcyNzYxNwotMTkyNjUuNTQ1ODcwCi0xNjM4NC4wMDAwMDAKLTEyODcyLjgyNjE5OAotODg2Ni45NTY5MDUKLTQ1MjAuMzM1NDMwCi0qLwotI2RlZmluZSBDMCAyMzE3MCAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQotI2RlZmluZSBDMSAyMjcyNSAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQotI2RlZmluZSBDMiAyMTQwNyAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQotI2RlZmluZSBDMyAxOTI2NiAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQotI2RlZmluZSBDNCAxNjM4MyAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSAtIDAuNQotI2RlZmluZSBDNSAxMjg3MyAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQotI2RlZmluZSBDNiA4ODY3ICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQotI2RlZmluZSBDNyA0NTIwICAvL2NvcyhpKk1fUEkvMTYpKnNxcnQoMikqKDE8PDE0KSArIDAuNQotCi0jZGVmaW5lIFJPV19TSElGVCAxMQotI2RlZmluZSBDT0xfU0hJRlQgMjAgLy8gNgotCi1ERUNMQVJFX0FTTV9DT05TVCg4LCB1aW50NjRfdCwgd20xMDEwKT0gMHhGRkZGMDAwMEZGRkYwMDAwVUxMOwotREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGQ0MDAwMCk9IDB4MDAwMDAwMDAwMDA0MDAwMFVMTDsKLQotREVDTEFSRV9BTElHTkVEKDgsIHN0YXRpYyBjb25zdCBpbnQxNl90LCBjb2VmZnMpW109IHsKLSAgICAgICAgMTw8KFJPV19TSElGVC0xKSwgMCwgMTw8KFJPV19TSElGVC0xKSwgMCwKLS8vICAgICAgICAxPDwoQ09MX1NISUZULTEpLCAwLCAxPDwoQ09MX1NISUZULTEpLCAwLAotLy8gICAgICAgIDAsIDE8PChDT0xfU0hJRlQtMS0xNiksIDAsIDE8PChDT0xfU0hJRlQtMS0xNiksCi0gICAgICAgIDE8PChST1dfU0hJRlQtMSksIDEsIDE8PChST1dfU0hJRlQtMSksIDAsCi0gICAgICAgIC8vIHRoZSAxID0gKCgxPDwoQ09MX1NISUZULTEpKS9DNCk8PFJPV19TSElGVCA6KQotLy8gICAgICAgIDAsIDAsIDAsIDAsCi0vLyAgICAgICAgMCwgMCwgMCwgMCwKLQotIEM0LCAgQzQsICBDNCwgIEM0LAotIEM0LCAtQzQsICBDNCwgLUM0LAotCi0gQzIsICBDNiwgIEMyLCAgQzYsCi0gQzYsIC1DMiwgIEM2LCAtQzIsCi0KLSBDMSwgIEMzLCAgQzEsICBDMywKLSBDNSwgIEM3LCAgQzUsICBDNywKLQotIEMzLCAtQzcsICBDMywgLUM3LAotLUMxLCAtQzUsIC1DMSwgLUM1LAotCi0gQzUsIC1DMSwgIEM1LCAtQzEsCi0gQzcsICBDMywgIEM3LCAgQzMsCi0KLSBDNywgLUM1LCAgQzcsIC1DNSwKLSBDMywgLUMxLCAgQzMsIC1DMQotfTsKLQotc3RhdGljIGlubGluZSB2b2lkIGlkY3QoaW50MTZfdCAqYmxvY2spCi17Ci0gICAgICAgIExPQ0FMX0FMSUdORURfOChpbnQ2NF90LCBhbGlnbl90bXAsIFsxNl0pOwotICAgICAgICBpbnQxNl90ICogY29uc3QgdGVtcD0gKGludDE2X3QqKWFsaWduX3RtcDsKLQotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotI2lmIDAgLy9BbHRlcm5hdGl2ZSwgc2ltcGxlciB2YXJpYW50Ci0KLSNkZWZpbmUgUk9XX0lEQ1Qoc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgZHN0LCByb3VuZGVyLCBzaGlmdCkgXAotICAgICAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzQgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjYgICAgIFIyICAgICAgcjYgICAgICByMiAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBSMyAgICAgUjEgICAgICByMyAgICAgIHIxICovXAotICAgICAgICAibW92cSAiICNzcmM1ICIsICUlbW0zICAgICAgICAgIFxuXHQiIC8qIFI3ICAgICBSNSAgICAgIHI3ICAgICAgcjUgKi9cCi0gICAgICAgICJtb3ZxIDE2KCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQzQgICAgIEM0ICAgICAgQzQgICAgICBDNCAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTAsICUlbW00ICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDI0KCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNCAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTUsICUlbW0wICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSAzMiglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0xLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLyogQzZSNitDMlIyICAgICAgQzZyNitDMnIyICovXAotICAgICAgICAibW92cSA0MCglMiksICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIC1DMiAgICBDNiAgICAgIC1DMiAgICAgQzYgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW02LCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMiAqL1wKLSAgICAgICAgIm1vdnEgNDgoJTIpLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBDMyAgICAgQzEgICAgICBDMyAgICAgIEMxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMiwgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjMrQzFSMSAgICAgIEMzcjMrQzFyMSAqL1wKLSAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAgICAgICAgICAgICAgYTAgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCi0gICAgICAgICJtb3ZxIDU2KCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzcgICAgIEM1ICAgICAgQzcgICAgICBDNSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUgKi9cCi0gICAgICAgICNyb3VuZGVyICIsICUlbW0wICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWRkZCAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMCwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgXAotICAgICAgICAicHN1YmQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAotICAgICAgICAicG1hZGR3ZCA2NCglMiksICUlbW0yICAgICAgICAgIFxuXHQiIC8qIC1DN1IzK0MzUjEgICAgIC1DN3IzK0MzcjEgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQjAgICAgICAgICAgICAgYjAgKi9cCi0gICAgICAgICJtb3ZxIDcyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogLUM1ICAgIC1DMSAgICAgLUM1ICAgICAtQzEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLyogLUM1UjctQzFSNSAgICAgLUM1cjctQzFyNSAqL1wKLSAgICAgICAgInBhZGRkICUlbW00LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgICAgICAgICBhMCtiMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW00LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAyQTAgICAgICAgICAgICAyYTAgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNywgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAtQjAgICAgICAgICAgYTAtYjAgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQjEgICAgICAgICAgICAgYjEgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTcgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTErQjEgICAgICAgICAgYTErYjEgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogQTEtQjEgICAgICAgICAgYTEtYjEgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTEgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMSwgJSVtbTcgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICAgQTArQjAgICBhMCtiMCAqL1wKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgICBBMS1CMSAgIGExLWIxICovXAotICAgICAgICAibW92cSAlJW1tNywgIiAjZHN0ICIgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCi0gICAgICAgICJtb3ZxIDgwKCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogLUMxICAgIEM1ICAgICAgLUMxICAgICBDNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTIsIDI0KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW00ICAgICAgICAgICBcblx0IiAvKiAtQzFSMytDNVIxICAgICAtQzFyMytDNXIxICovXAotICAgICAgICAibW92cSA4OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDNyAgICAgIEMzICAgICAgQzcgKi9cCi0gICAgICAgICJwbWFkZHdkIDk2KCUyKSwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogLUM1UjMrQzdSMSAgICAgLUM1cjMrQzdyMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDM1I3K0M3UjUgICAgICBDM3I3K0M3cjUgKi9cCi0gICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCi0gICAgICAgICJwbWFkZHdkIDEwNCglMiksICUlbW0zICAgICAgICAgXG5cdCIgLyogLUMxUjcrQzNSNSAgICAgLUMxcjcrQzNyNSAqL1wKLSAgICAgICAgInBhZGRkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBCMiAgICAgICAgICAgICBiMiAqL1wKLSAgICAgICAgInBhZGRkICUlbW00LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMitCMiAgICAgICAgICBhMitiMiAqL1wKLSAgICAgICAgInBzdWJkICUlbW00LCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBhMi1CMiAgICAgICAgICBhMi1iMiAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTYsICUlbW00ICAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMyAgICAgICAgICAgICBcblx0IiAvKiBCMyAgICAgICAgICAgICBiMyAqL1wKLSAgICAgICAgInBhZGRkICUlbW0zLCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMytCMyAgICAgICAgICBhMytiMyAqL1wKLSAgICAgICAgInBzdWJkICUlbW0zLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBhMy1CMyAgICAgICAgICBhMy1iMyAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNiAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBBMytCMyAgYTMrYjMgICBBMitCMiAgIGEyK2IyICovXAotICAgICAgICAibW92cSAlJW1tMiwgOCsiICNkc3QgIiAgICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTAsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEyLUIyICBhMi1iMiAgIEEzLUIzICAgYTMtYjMgKi9cCi0gICAgICAgICJtb3ZxICUlbW00LCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0KLSNkZWZpbmUgQ09MX0lEQ1Qoc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgZHN0LCBzaGlmdCkgXAotICAgICAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzQgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjYgICAgIFIyICAgICAgcjYgICAgICByMiAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBSMyAgICAgUjEgICAgICByMyAgICAgIHIxICovXAotICAgICAgICAibW92cSAiICNzcmM1ICIsICUlbW0zICAgICAgICAgIFxuXHQiIC8qIFI3ICAgICBSNSAgICAgIHI3ICAgICAgcjUgKi9cCi0gICAgICAgICJtb3ZxIDE2KCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQzQgICAgIEM0ICAgICAgQzQgICAgICBDNCAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTAsICUlbW00ICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDI0KCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNCAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTUsICUlbW0wICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSAzMiglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0xLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLyogQzZSNitDMlIyICAgICAgQzZyNitDMnIyICovXAotICAgICAgICAibW92cSA0MCglMiksICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIC1DMiAgICBDNiAgICAgIC1DMiAgICAgQzYgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW02LCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMiAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDQ4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEMxICAgICAgQzMgICAgICBDMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAgICAgICAgICAgICAgYTAgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCi0gICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKLSAgICAgICAgInBtYWRkd2QgNjQoJTIpLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiAtQzdSMytDM1IxICAgICAtQzdyMytDM3IxICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEIwICAgICAgICAgICAgIGIwICovXAotICAgICAgICAibW92cSA3MiglMiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIC1DNSAgICAtQzEgICAgIC1DNSAgICAgLUMxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIC1DNVI3LUMxUjUgICAgIC1DNXI3LUMxcjUgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQTArQjAgICAgICAgICAgYTArYjAgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogMkEwICAgICAgICAgICAgMmEwICovXAotICAgICAgICAicHN1YmQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICAgICAgICAgIGEwLWIwICovXAotICAgICAgICAicGFkZGQgJSVtbTIsICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIEIxICAgICAgICAgICAgIGIxICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW03ICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8qIEExICAgICAgICAgICAgIGExICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEExK0IxICAgICAgICAgIGExK2IxICovXAotICAgICAgICAicHN1YmQgJSVtbTEsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEExLUIxICAgICAgICAgIGExLWIxICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTcsICUlbW03ICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICBhMCtiMCAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTcsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0wLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgKi9cCi0gICAgICAgICJtb3ZkICUlbW0wLCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogQTEtQjEgIGExLWIxICovXAotICAgICAgICAibW92ZCAlJW1tMiwgOTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTQsIDExMisiICNkc3QgIiAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSMyAgICAgUjEgICAgICByMyAgICAgIHIxICovXAotICAgICAgICAibW92cSA4MCglMiksICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIC1DMSAgICBDNSAgICAgIC1DMSAgICAgQzUgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogLUMxUjMrQzVSMSAgICAgLUMxcjMrQzVyMSAqL1wKLSAgICAgICAgIm1vdnEgODgoJTIpLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBDMyAgICAgQzcgICAgICBDMyAgICAgIEM3ICovXAotICAgICAgICAicG1hZGR3ZCA5NiglMiksICUlbW0wICAgICAgICAgIFxuXHQiIC8qIC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSNytDN1I1ICAgICAgQzNyNytDN3I1ICovXAotICAgICAgICAibW92cSAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAotICAgICAgICAicG1hZGR3ZCAxMDQoJTIpLCAlJW1tMyAgICAgICAgIFxuXHQiIC8qIC1DMVI3K0MzUjUgICAgIC1DMXI3K0MzcjUgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNywgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQjIgICAgICAgICAgICAgYjIgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogQTIrQjIgICAgICAgICAgYTIrYjIgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogYTItQjIgICAgICAgICAgYTItYjIgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgXG5cdCIgLyogQjMgICAgICAgICAgICAgYjMgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMywgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMrQjMgICAgICAgICAgYTMrYjMgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tMywgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogYTMtQjMgICAgICAgICAgYTMtYjMgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogQTIrQjIgIGEyK2IyICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTIsIDMyKyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMy1CMyAgYTMtYjMgKi9cCi0gICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAotICAgICAgICAibW92ZCAlJW1tNiwgNDgrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAibW92ZCAlJW1tNCwgNjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAibW92ZCAlJW1tNSwgODArIiAjZHN0ICIgICAgICAgIFxuXHQiXAotCi0KLSNkZWZpbmUgRENfQ09ORF9ST1dfSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHJvdW5kZXIsIHNoaWZ0KSBcCi0gICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAotICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKLSAgICAgICAgIm1vdnEgIk1BTkdMRSh3bTEwMTApIiwgJSVtbTQgICBcblx0IlwKLSAgICAgICAgInBhbmQgJSVtbTAsICUlbW00ICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCUlbW00ICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTQsICUlZWF4ICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm9ybCAlJWVheCwgJSVlYXggICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgImp6IDFmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCi0gICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAotICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAotICAgICAgICAjcm91bmRlciAiLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKLSAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKLSAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMCAgICAgICAgICAgICBcblx0IiBcCi0gICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCi0gICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKLSAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgICBBMCtCMCAgIGEwK2IwICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEgKi9cCi0gICAgICAgICJtb3ZxICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKLSAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAotICAgICAgICAibW92cSAlJW1tMiwgMjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCi0gICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKLSAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAotICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAotICAgICAgICAicHN1YmQgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAotICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAotICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIgKi9cCi0gICAgICAgICJtb3ZxICUlbW0yLCA4KyIgI2RzdCAiICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMyAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgImptcCAyZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBzbGxkICQxNiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIiNwYWRkZCAiTUFOR0xFKGQ0MDAwMCkiLCAlJW1tMCBcblx0IlwKLSAgICAgICAgInBzcmFkICQxMywgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0wLCAlJW1tMCAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsIDgrIiAjZHN0ICIgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsIDI0KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0KLS8vSURDVCggICAgICBzcmMwLCAgIHNyYzQsICAgc3JjMSwgICBzcmM1LCAgICBkc3QsICAgIHJvdW5kZXIsIHNoaWZ0KQotUk9XX0lEQ1QoICAgICglMCksICA4KCUwKSwgMTYoJTApLCAyNCglMCksICAwKCUxKSxwYWRkZCA4KCUyKSwgMTEpCi0vKlJPV19JRENUKCAgMzIoJTApLCA0MCglMCksIDQ4KCUwKSwgNTYoJTApLCAzMiglMSksIHBhZGRkICglMiksIDExKQotUk9XX0lEQ1QoICA2NCglMCksIDcyKCUwKSwgODAoJTApLCA4OCglMCksIDY0KCUxKSwgcGFkZGQgKCUyKSwgMTEpCi1ST1dfSURDVCggIDk2KCUwKSwxMDQoJTApLDExMiglMCksMTIwKCUwKSwgOTYoJTEpLCBwYWRkZCAoJTIpLCAxMSkqLwotCi1EQ19DT05EX1JPV19JRENUKCAgMzIoJTApLCA0MCglMCksIDQ4KCUwKSwgNTYoJTApLCAzMiglMSkscGFkZGQgKCUyKSwgMTEpCi1EQ19DT05EX1JPV19JRENUKCAgNjQoJTApLCA3MiglMCksIDgwKCUwKSwgODgoJTApLCA2NCglMSkscGFkZGQgKCUyKSwgMTEpCi1EQ19DT05EX1JPV19JRENUKCAgOTYoJTApLDEwNCglMCksMTEyKCUwKSwxMjAoJTApLCA5NiglMSkscGFkZGQgKCUyKSwgMTEpCi0KLQotLy9JRENUKCAgICAgIHNyYzAsICAgc3JjNCwgICBzcmMxLCAgICBzcmM1LCAgICBkc3QsIHNoaWZ0KQotQ09MX0lEQ1QoICAgICglMSksIDY0KCUxKSwgMzIoJTEpLCAgOTYoJTEpLCAgMCglMCksIDIwKQotQ09MX0lEQ1QoICAgOCglMSksIDcyKCUxKSwgNDAoJTEpLCAxMDQoJTEpLCAgNCglMCksIDIwKQotQ09MX0lEQ1QoICAxNiglMSksIDgwKCUxKSwgNDgoJTEpLCAxMTIoJTEpLCAgOCglMCksIDIwKQotQ09MX0lEQ1QoICAyNCglMSksIDg4KCUxKSwgNTYoJTEpLCAxMjAoJTEpLCAxMiglMCksIDIwKQotCi0jZWxzZQotCi0jZGVmaW5lIERDX0NPTkRfSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHJvdW5kZXIsIHNoaWZ0KSBcCi0gICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAotICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKLSAgICAgICAgIm1vdnEgIk1BTkdMRSh3bTEwMTApIiwgJSVtbTQgICBcblx0IlwKLSAgICAgICAgInBhbmQgJSVtbTAsICUlbW00ICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCUlbW00ICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTQsICUlZWF4ICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm9ybCAlJWVheCwgJSVlYXggICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgImp6IDFmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCi0gICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAotICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAotICAgICAgICAjcm91bmRlciAiLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKLSAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKLSAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMCAgICAgICAgICAgICBcblx0IiBcCi0gICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCi0gICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKLSAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgICBBMCtCMCAgIGEwK2IwICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEgKi9cCi0gICAgICAgICJtb3ZxICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKLSAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAotICAgICAgICAibW92cSAlJW1tMiwgMjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCi0gICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKLSAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAotICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAotICAgICAgICAicHN1YmQgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAotICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAotICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIgKi9cCi0gICAgICAgICJtb3ZxICUlbW0yLCA4KyIgI2RzdCAiICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMyAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgImptcCAyZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBzbGxkICQxNiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhZGRkICJNQU5HTEUoZDQwMDAwKSIsICUlbW0wICBcblx0IlwKLSAgICAgICAgInBzcmFkICQxMywgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0wLCAlJW1tMCAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsIDgrIiAjZHN0ICIgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsIDI0KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0jZGVmaW5lIFpfQ09ORF9JRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgcm91bmRlciwgc2hpZnQsIGJ0KSBcCi0gICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAotICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW00ICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBvciAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCUlbW00ICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTQsICUlZWF4ICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm9ybCAlJWVheCwgJSVlYXggICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgImp6ICIgI2J0ICIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCi0gICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAotICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAotICAgICAgICAjcm91bmRlciAiLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKLSAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKLSAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMCAgICAgICAgICAgICBcblx0IiBcCi0gICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCi0gICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKLSAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgICBBMCtCMCAgIGEwK2IwICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEgKi9cCi0gICAgICAgICJtb3ZxICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKLSAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAotICAgICAgICAibW92cSAlJW1tMiwgMjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCi0gICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKLSAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAotICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAotICAgICAgICAicHN1YmQgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAotICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAotICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIgKi9cCi0gICAgICAgICJtb3ZxICUlbW0yLCA4KyIgI2RzdCAiICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMyAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLQotI2RlZmluZSBST1dfSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHJvdW5kZXIsIHNoaWZ0KSBcCi0gICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAotICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCi0gICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAotICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAotICAgICAgICAjcm91bmRlciAiLCAlJW1tNCAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKLSAgICAgICAgIm1vdnEgNTYoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNyAgICAgQzUgICAgICBDNyAgICAgIEM1ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM3UjcrQzVSNSAgICAgIEM3cjcrQzVyNSAqL1wKLSAgICAgICAgI3JvdW5kZXIgIiwgJSVtbTAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tMCAgICAgICAgICAgICBcblx0IiBcCi0gICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCi0gICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKLSAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW01ICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgICBBMCtCMCAgIGEwK2IwICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAgIEExLUIxICAgYTEtYjEgKi9cCi0gICAgICAgICJtb3ZxICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKLSAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAotICAgICAgICAibW92cSAlJW1tMiwgMjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCi0gICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKLSAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAotICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAotICAgICAgICAicHN1YmQgJSVtbTQsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAotICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAotICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAgIEEyK0IyICAgYTIrYjIgKi9cCi0gICAgICAgICJtb3ZxICUlbW0yLCA4KyIgI2RzdCAiICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICAgQTMtQjMgICBhMy1iMyAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLQotLy9JRENUKCAgICAgICAgIHNyYzAsICAgc3JjNCwgICBzcmMxLCAgIHNyYzUsICAgIGRzdCwgICByb3VuZGVyLCBzaGlmdCkKLURDX0NPTkRfSURDVCggIDAoJTApLCAgOCglMCksIDE2KCUwKSwgMjQoJTApLCAgMCglMSkscGFkZGQgOCglMiksIDExKQotWl9DT05EX0lEQ1QoICAzMiglMCksIDQwKCUwKSwgNDgoJTApLCA1NiglMCksIDMyKCUxKSxwYWRkZCAoJTIpLCAxMSwgNGYpCi1aX0NPTkRfSURDVCggIDY0KCUwKSwgNzIoJTApLCA4MCglMCksIDg4KCUwKSwgNjQoJTEpLHBhZGRkICglMiksIDExLCAyZikKLVpfQ09ORF9JRENUKCAgOTYoJTApLDEwNCglMCksMTEyKCUwKSwxMjAoJTApLCA5NiglMSkscGFkZGQgKCUyKSwgMTEsIDFmKQotCi0jdW5kZWYgSURDVAotI2RlZmluZSBJRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgc2hpZnQpIFwKLSAgICAgICAgIm1vdnEgIiAjc3JjMCAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAotICAgICAgICAibW92cSAiICNzcmM0ICIsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIFI2ICAgICBSMiAgICAgIHI2ICAgICAgcjIgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjNSAiLCAlJW1tMyAgICAgICAgICBcblx0IiAvKiBSNyAgICAgUjUgICAgICByNyAgICAgIHI1ICovXAotICAgICAgICAibW92cSAxNiglMiksICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSAyNCglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW01LCAlJW1tMCAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMzIoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBDNiAgICAgQzIgICAgICBDNiAgICAgIEMyICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMSwgJSVtbTUgICAgICAgICAgIFxuXHQiIC8qIEM2UjYrQzJSMiAgICAgIEM2cjYrQzJyMiAqL1wKLSAgICAgICAgIm1vdnEgNDAoJTIpLCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiAtQzIgICAgQzYgICAgICAtQzIgICAgIEM2ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNiwgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIC1DMlI2K0M2UjIgICAgIC1DMnI2K0M2cjIgKi9cCi0gICAgICAgICJtb3ZxICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAotICAgICAgICAicGFkZGQgJSVtbTUsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEEwICAgICAgICAgICAgIGEwICovXAotICAgICAgICAicHN1YmQgJSVtbTUsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAotICAgICAgICAibW92cSAlJW1tMCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCi0gICAgICAgICJtb3ZxIDU2KCUyKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQzcgICAgIEM1ICAgICAgQzcgICAgICBDNSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUgKi9cCi0gICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKLSAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW03LCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgYTArYjAgKi9cCi0gICAgICAgICJtb3ZkICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICovXAotICAgICAgICAibW92ZCAlJW1tMCwgMTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEExLUIxICBhMS1iMSAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTIsIDk2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgKi9cCi0gICAgICAgICJtb3ZkICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKLSAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCi0gICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKLSAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAotICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAotICAgICAgICAicHN1YmQgJSVtbTQsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW01ICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAotICAgICAgICAicGFkZGQgJSVtbTAsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAotICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAotICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICBhMitiMiAqL1wKLSAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IiAvKiBBMytCMyAgYTMrYjMgKi9cCi0gICAgICAgICJtb3ZkICUlbW0yLCAzMisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTMtQjMgIGEzLWIzICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTUsICUlbW01ICAgICAgICAgIFxuXHQiIC8qIEEyLUIyICBhMi1iMiAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTQsIDY0KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTUsIDgwKyIgI2RzdCAiICAgICAgICBcblx0IgotCi0KLS8vSURDVCggIHNyYzAsICAgc3JjNCwgICBzcmMxLCAgICBzcmM1LCAgICBkc3QsIHNoaWZ0KQotSURDVCggICAgKCUxKSwgNjQoJTEpLCAzMiglMSksICA5NiglMSksICAwKCUwKSwgMjApCi1JRENUKCAgIDgoJTEpLCA3MiglMSksIDQwKCUxKSwgMTA0KCUxKSwgIDQoJTApLCAyMCkKLUlEQ1QoICAxNiglMSksIDgwKCUxKSwgNDgoJTEpLCAxMTIoJTEpLCAgOCglMCksIDIwKQotSURDVCggIDI0KCUxKSwgODgoJTEpLCA1NiglMSksIDEyMCglMSksIDEyKCUwKSwgMjApCi0gICAgICAgICJqbXAgOWYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLQotICAgICAgICAiIyAucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi1aX0NPTkRfSURDVCggIDY0KCUwKSwgNzIoJTApLCA4MCglMCksIDg4KCUwKSwgNjQoJTEpLHBhZGRkICglMiksIDExLCA2ZikKLVpfQ09ORF9JRENUKCAgOTYoJTApLDEwNCglMCksMTEyKCUwKSwxMjAoJTApLCA5NiglMSkscGFkZGQgKCUyKSwgMTEsIDVmKQotCi0jdW5kZWYgSURDVAotI2RlZmluZSBJRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgc2hpZnQpIFwKLSAgICAgICAgIm1vdnEgIiAjc3JjMCAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAotICAgICAgICAibW92cSAiICNzcmM0ICIsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIFI2ICAgICBSMiAgICAgIHI2ICAgICAgcjIgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCi0gICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAotICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW01ICAgICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEExICAgICAgICAgICAgIGExICovXAotICAgICAgICAicHN1YmQgJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAotICAgICAgICAibW92cSA1NiglMiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIEM3ICAgICBDNSAgICAgIEM3ICAgICAgQzUgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogQzdSNytDNVI1ICAgICAgQzdyNytDNXI1ICovXAotICAgICAgICAibW92cSA3MiglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNSAgICAtQzEgICAgIC1DNSAgICAgLUMxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIC1DNVI3LUMxUjUgICAgIC1DNXI3LUMxcjUgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTArQjAgICAgICAgICAgYTArYjAgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogMkEwICAgICAgICAgICAgMmEwICovXAotICAgICAgICAicHN1YmQgJSVtbTEsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICAgICAgICAgIGEwLWIwICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0xICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tMCwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8qIEExICAgICAgICAgICAgIGExICovXAotICAgICAgICAicGFkZGQgJSVtbTcsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEExK0IxICAgICAgICAgIGExK2IxICovXAotICAgICAgICAicHN1YmQgJSVtbTcsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEExLUIxICAgICAgICAgIGExLWIxICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0wICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTEsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICBhMCtiMCAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTEsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0wLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBBMStCMSAgYTErYjEgKi9cCi0gICAgICAgICJtb3ZkICUlbW0wLCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogQTEtQjEgIGExLWIxICovXAotICAgICAgICAibW92ZCAlJW1tMiwgOTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTQsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEwLUIwICBhMC1iMCAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTQsIDExMisiICNkc3QgIiAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgODgoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBDMyAgICAgQzcgICAgICBDMyAgICAgIEM3ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAotICAgICAgICAicHN1YmQgJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW01ICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAotICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAotICAgICAgICAicHN1YmQgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0xICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICBhMitiMiAqL1wKLSAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IiAvKiBBMytCMyAgYTMrYjMgKi9cCi0gICAgICAgICJtb3ZkICUlbW0yLCAzMisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMSwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogQTMtQjMgIGEzLWIzICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTUsICUlbW01ICAgICAgICAgIFxuXHQiIC8qIEEyLUIyICBhMi1iMiAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTEsIDY0KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTUsIDgwKyIgI2RzdCAiICAgICAgICBcblx0IgotCi0vL0lEQ1QoICBzcmMwLCAgIHNyYzQsICAgc3JjMSwgICAgc3JjNSwgICAgZHN0LCBzaGlmdCkKLUlEQ1QoICAgICglMSksIDY0KCUxKSwgMzIoJTEpLCAgOTYoJTEpLCAgMCglMCksIDIwKQotSURDVCggICA4KCUxKSwgNzIoJTEpLCA0MCglMSksIDEwNCglMSksICA0KCUwKSwgMjApCi1JRENUKCAgMTYoJTEpLCA4MCglMSksIDQ4KCUxKSwgMTEyKCUxKSwgIDgoJTApLCAyMCkKLUlEQ1QoICAyNCglMSksIDg4KCUxKSwgNTYoJTEpLCAxMjAoJTEpLCAxMiglMCksIDIwKQotICAgICAgICAiam1wIDlmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgIiMgLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIjY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotWl9DT05EX0lEQ1QoICA5NiglMCksMTA0KCUwKSwxMTIoJTApLDEyMCglMCksIDk2KCUxKSxwYWRkZCAoJTIpLCAxMSwgN2YpCi0KLSN1bmRlZiBJRENUCi0jZGVmaW5lIElEQ1Qoc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgZHN0LCBzaGlmdCkgXAotICAgICAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSAlJW1tMCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDU2KCUyKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQzcgICAgIEM1ICAgICAgQzcgICAgICBDNSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUgKi9cCi0gICAgICAgICJtb3ZxIDcyKCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogLUM1ICAgIC1DMSAgICAgLUM1ICAgICAtQzEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogLUM1UjctQzFSNSAgICAgLUM1cjctQzFyNSAqL1wKLSAgICAgICAgInBhZGRkICUlbW00LCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgICAgICAgICBhMCtiMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW00LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAyQTAgICAgICAgICAgICAyYTAgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAtQjAgICAgICAgICAgYTAtYjAgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTEgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNywgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLyogQTErQjEgICAgICAgICAgYTErYjEgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNywgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogQTEtQjEgICAgICAgICAgYTEtYjEgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTAgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMSwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogQTArQjAgIGEwK2IwICovXAotICAgICAgICAibW92ZCAlJW1tMSwgIiAjZHN0ICIgICAgICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTAsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIEExK0IxICBhMStiMSAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTAsIDE2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0yLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgYTEtYjEgKi9cCi0gICAgICAgICJtb3ZkICUlbW0yLCA5NisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTAtQjAgIGEwLWIwICovXAotICAgICAgICAibW92ZCAlJW1tNCwgMTEyKyIgI2RzdCAiICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSA4OCglMiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDNyAgICAgIEMzICAgICAgQzcgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0zLCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogQzNSNytDN1I1ICAgICAgQzNyNytDN3I1ICovXAotICAgICAgICAibW92cSAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAotICAgICAgICAicG1hZGR3ZCAxMDQoJTIpLCAlJW1tMyAgICAgICAgIFxuXHQiIC8qIC1DMVI3K0MzUjUgICAgIC1DMXI3K0MzcjUgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogQTIrQjIgICAgICAgICAgYTIrYjIgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tMSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogYTItQjIgICAgICAgICAgYTItYjIgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMywgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMrQjMgICAgICAgICAgYTMrYjMgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tMywgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogYTMtQjMgICAgICAgICAgYTMtYjMgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTEgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogQTIrQjIgIGEyK2IyICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTIsIDMyKyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0xLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBBMy1CMyAgYTMtYjMgKi9cCi0gICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAotICAgICAgICAibW92ZCAlJW1tNiwgNDgrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAibW92ZCAlJW1tMSwgNjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAibW92ZCAlJW1tNSwgODArIiAjZHN0ICIgICAgICAgIFxuXHQiCi0KLQotLy9JRENUKCAgc3JjMCwgICBzcmM0LCAgIHNyYzEsICAgIHNyYzUsICAgIGRzdCwgc2hpZnQpCi1JRENUKCAgICAoJTEpLCA2NCglMSksIDMyKCUxKSwgIDk2KCUxKSwgIDAoJTApLCAyMCkKLUlEQ1QoICAgOCglMSksIDcyKCUxKSwgNDAoJTEpLCAxMDQoJTEpLCAgNCglMCksIDIwKQotSURDVCggIDE2KCUxKSwgODAoJTEpLCA0OCglMSksIDExMiglMSksICA4KCUwKSwgMjApCi1JRENUKCAgMjQoJTEpLCA4OCglMSksIDU2KCUxKSwgMTIwKCUxKSwgMTIoJTApLCAyMCkKLSAgICAgICAgImptcCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICIjIC5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLVpfQ09ORF9JRENUKCAgOTYoJTApLDEwNCglMCksMTEyKCUwKSwxMjAoJTApLCA5NiglMSkscGFkZGQgKCUyKSwgMTEsIDNmKQotCi0jdW5kZWYgSURDVAotI2RlZmluZSBJRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgc2hpZnQpIFwKLSAgICAgICAgIm1vdnEgIiAjc3JjMCAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAotICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzUgIiwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogUjcgICAgIFI1ICAgICAgcjcgICAgICByNSAqL1wKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxICUlbW00LCAlJW1tNiAgICAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSA0OCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEMzICAgICBDMSAgICAgIEMzICAgICAgQzEgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tNyAgICAgICAgICAgXG5cdCIgLyogQzNSMytDMVIxICAgICAgQzNyMytDMXIxICovXAotICAgICAgICAibW92cSAlJW1tMCwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDU2KCUyKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQzcgICAgIEM1ICAgICAgQzcgICAgICBDNSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiBDN1I3K0M1UjUgICAgICBDN3I3K0M1cjUgKi9cCi0gICAgICAgICJwbWFkZHdkIDY0KCUyKSwgJSVtbTIgICAgICAgICAgXG5cdCIgLyogLUM3UjMrQzNSMSAgICAgLUM3cjMrQzNyMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBCMCAgICAgICAgICAgICBiMCAqL1wKLSAgICAgICAgIm1vdnEgNzIoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiAtQzUgICAgLUMxICAgICAtQzUgICAgIC1DMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzVSNy1DMVI1ICAgICAtQzVyNy1DMXI1ICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0yLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBCMSAgICAgICAgICAgICBiMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW03LCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgYTArYjAgKi9cCi0gICAgICAgICJtb3ZkICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICovXAotICAgICAgICAibW92ZCAlJW1tMCwgMTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEExLUIxICBhMS1iMSAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTIsIDk2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgKi9cCi0gICAgICAgICJtb3ZkICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjMgICAgIFIxICAgICAgcjMgICAgICByMSAqL1wKLSAgICAgICAgIm1vdnEgODAoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiAtQzEgICAgQzUgICAgICAtQzEgICAgIEM1ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIC1DMVIzK0M1UjEgICAgIC1DMXIzK0M1cjEgKi9cCi0gICAgICAgICJtb3ZxIDg4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEM3ICAgICAgQzMgICAgICBDNyAqL1wKLSAgICAgICAgInBtYWRkd2QgOTYoJTIpLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiAtQzVSMytDN1IxICAgICAtQzVyMytDN3IxICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMywgJSVtbTcgICAgICAgICAgIFxuXHQiIC8qIEMzUjcrQzdSNSAgICAgIEMzcjcrQzdyNSAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTUsICUlbW0yICAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgInBtYWRkd2QgMTA0KCUyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiAtQzFSNytDM1I1ICAgICAtQzFyNytDM3I1ICovXAotICAgICAgICAicGFkZGQgJSVtbTcsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEIyICAgICAgICAgICAgIGIyICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICAgICAgICAgIGEyK2IyICovXAotICAgICAgICAicHN1YmQgJSVtbTQsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIGEyLUIyICAgICAgICAgIGEyLWIyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0yICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW01ICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAlJW1tNiwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8qIEEzICAgICAgICAgICAgIGEzICovXAotICAgICAgICAicGFkZGQgJSVtbTAsICUlbW0zICAgICAgICAgICAgIFxuXHQiIC8qIEIzICAgICAgICAgICAgIGIzICovXAotICAgICAgICAicGFkZGQgJSVtbTMsICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICAgICAgICAgIGEzK2IzICovXAotICAgICAgICAicHN1YmQgJSVtbTMsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIGEzLUIzICAgICAgICAgIGEzLWIzICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW02ICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIEEyK0IyICBhMitiMiAqL1wKLSAgICAgICAgInBhY2tzc2R3ICUlbW02LCAlJW1tNiAgICAgICAgICBcblx0IiAvKiBBMytCMyAgYTMrYjMgKi9cCi0gICAgICAgICJtb3ZkICUlbW0yLCAzMisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tNCwgJSVtbTQgICAgICAgICAgXG5cdCIgLyogQTMtQjMgIGEzLWIzICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTUsICUlbW01ICAgICAgICAgIFxuXHQiIC8qIEEyLUIyICBhMi1iMiAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTQsIDY0KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmQgJSVtbTUsIDgwKyIgI2RzdCAiICAgICAgICBcblx0IgotCi0vL0lEQ1QoICBzcmMwLCAgIHNyYzQsICAgc3JjMSwgICAgc3JjNSwgICAgZHN0LCBzaGlmdCkKLUlEQ1QoICAgICglMSksIDY0KCUxKSwgMzIoJTEpLCAgOTYoJTEpLCAgMCglMCksIDIwKQotSURDVCggICA4KCUxKSwgNzIoJTEpLCA0MCglMSksIDEwNCglMSksICA0KCUwKSwgMjApCi1JRENUKCAgMTYoJTEpLCA4MCglMSksIDQ4KCUxKSwgMTEyKCUxKSwgIDgoJTApLCAyMCkKLUlEQ1QoICAyNCglMSksIDg4KCUxKSwgNTYoJTEpLCAxMjAoJTEpLCAxMiglMCksIDIwKQotICAgICAgICAiam1wIDlmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0KLSAgICAgICAgIiMgLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotI3VuZGVmIElEQ1QKLSNkZWZpbmUgSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHNoaWZ0KSBcCi0gICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjMSAiLCAlJW1tMiAgICAgICAgICBcblx0IiAvKiBSMyAgICAgUjEgICAgICByMyAgICAgIHIxICovXAotICAgICAgICAibW92cSAxNiglMiksICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSAyNCglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW01LCAlJW1tMCAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDQ4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEMxICAgICAgQzMgICAgICBDMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEgKi9cCi0gICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgNjQoJTIpLCAlJW1tMyAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW0zICAgICAgICAgICBcblx0IiAvKiAtQzdSMytDM1IxICAgICAtQzdyMytDM3IxICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0zLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW0zLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMSAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW03LCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgYTArYjAgKi9cCi0gICAgICAgICJtb3ZkICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICovXAotICAgICAgICAibW92ZCAlJW1tMCwgMTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTEsICUlbW0xICAgICAgICAgIFxuXHQiIC8qIEExLUIxICBhMS1iMSAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTEsIDk2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgKi9cCi0gICAgICAgICJtb3ZkICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxIDgwKCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogLUMxICAgIEM1ICAgICAgLUMxICAgICBDNSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW00ICAgICAgICAgICBcblx0IiAvKiAtQzFSMytDNVIxICAgICAtQzFyMytDNXIxICovXAotICAgICAgICAicG1hZGR3ZCA5NiglMiksICUlbW0yICAgICAgICAgIFxuXHQiIC8qIC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEgKi9cCi0gICAgICAgICJtb3ZxICUlbW01LCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTIrQjIgICAgICAgICAgYTIrYjIgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogYTItQjIgICAgICAgICAgYTItYjIgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTEgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMrQjMgICAgICAgICAgYTMrYjMgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogYTMtQjMgICAgICAgICAgYTMtYjMgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTQgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMSwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogQTIrQjIgIGEyK2IyICovXAotICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTEsIDMyKyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMy1CMyAgYTMtYjMgKi9cCi0gICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAotICAgICAgICAibW92ZCAlJW1tNiwgNDgrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAibW92ZCAlJW1tNCwgNjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAibW92ZCAlJW1tNSwgODArIiAjZHN0ICIgICAgICAgIFxuXHQiCi0KLQotLy9JRENUKCAgc3JjMCwgICBzcmM0LCAgIHNyYzEsICAgIHNyYzUsICAgIGRzdCwgc2hpZnQpCi1JRENUKCAgICAoJTEpLCA2NCglMSksIDMyKCUxKSwgIDk2KCUxKSwgIDAoJTApLCAyMCkKLUlEQ1QoICAgOCglMSksIDcyKCUxKSwgNDAoJTEpLCAxMDQoJTEpLCAgNCglMCksIDIwKQotSURDVCggIDE2KCUxKSwgODAoJTEpLCA0OCglMSksIDExMiglMSksICA4KCUwKSwgMjApCi1JRENUKCAgMjQoJTEpLCA4OCglMSksIDU2KCUxKSwgMTIwKCUxKSwgMTIoJTApLCAyMCkKLSAgICAgICAgImptcCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0gICAgICAgICIjIC5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICI1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSN1bmRlZiBJRENUCi0jZGVmaW5lIElEQ1Qoc3JjMCwgc3JjNCwgc3JjMSwgc3JjNSwgZHN0LCBzaGlmdCkgXAotICAgICAgICAibW92cSAiICNzcmMwICIsICUlbW0wICAgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCi0gICAgICAgICJtb3ZxICIgI3NyYzQgIiwgJSVtbTEgICAgICAgICAgXG5cdCIgLyogUjYgICAgIFIyICAgICAgcjYgICAgICByMiAqL1wKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMCwgJSVtbTQgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNSwgJSVtbTAgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTEsICUlbW01ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCi0gICAgICAgICJtb3ZxIDQwKCUyKSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogLUMyICAgIEM2ICAgICAgLUMyICAgICBDNiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTYsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzJSNitDNlIyICAgICAtQzJyNitDNnIyICovXAotICAgICAgICAibW92cSAlJW1tNCwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW01LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW01LCAlJW1tNiAgICAgICAgICAgICBcblx0IiAvKiBBMyAgICAgICAgICAgICBhMyAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW01ICAgICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAotICAgICAgICAicGFkZGQgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiIC8qIEExICAgICAgICAgICAgIGExICovXAotICAgICAgICAicHN1YmQgJSVtbTEsICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAotICAgICAgICAibW92cSA4KyIgI3NyYzAgIiwgJSVtbTIgICAgICAgIFxuXHQiIC8qIFI0ICAgICBSMCAgICAgIHI0ICAgICAgcjAgKi9cCi0gICAgICAgICJtb3ZxIDgrIiAjc3JjNCAiLCAlJW1tMyAgICAgICAgXG5cdCIgLyogUjYgICAgIFIyICAgICAgcjYgICAgICByMiAqL1wKLSAgICAgICAgIm1vdnEgMTYoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiBDNCAgICAgQzQgICAgICBDNCAgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tMiwgJSVtbTEgICAgICAgICAgIFxuXHQiIC8qIEM0UjQrQzRSMCAgICAgIEM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMjQoJTIpLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiAtQzQgICAgQzQgICAgICAtQzQgICAgIEM0ICovXAotICAgICAgICAicG1hZGR3ZCAlJW1tNywgJSVtbTIgICAgICAgICAgIFxuXHQiIC8qIC1DNFI0K0M0UjAgICAgIC1DNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDMyKCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzYgICAgIEMyICAgICAgQzYgICAgICBDMiAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTMsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDNlI2K0MyUjIgICAgICBDNnI2K0MycjIgKi9cCi0gICAgICAgICJwbWFkZHdkIDQwKCUyKSwgJSVtbTMgICAgICAgICAgXG5cdCIgLyogLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMiAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBBMCAgICAgICAgICAgICBhMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvKiAyQzAgICAgICAgICAgICAyYzAgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNywgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgXG5cdCIgLyogQTEgICAgICAgICAgICAgYTEgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTIgICAgICAgICAgICAgXG5cdCIgLyogMkMxICAgICAgICAgICAgMmMxICovXAotICAgICAgICAicHN1YmQgJSVtbTMsICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8qIEEyICAgICAgICAgICAgIGEyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW03ICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0zICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTcsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEwICAgICBhMCAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0zLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBBMSAgICAgYTEgKi9cCi0gICAgICAgICJtb3ZxICUlbW0wLCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW0wLCA5NisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTIgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMiwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAotICAgICAgICAibW92cSAlJW1tNSwgMzIrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0xICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTEsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTYsIDY0KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTUsIDgwKyIgI2RzdCAiICAgICAgICBcblx0IgotCi0KLS8vSURDVCggIHNyYzAsICAgc3JjNCwgICBzcmMxLCAgICBzcmM1LCAgICBkc3QsIHNoaWZ0KQotSURDVCggICAgMCglMSksIDY0KCUxKSwgMzIoJTEpLCAgOTYoJTEpLCAgMCglMCksIDIwKQotLy9JRENUKCAgIDgoJTEpLCA3MiglMSksIDQwKCUxKSwgMTA0KCUxKSwgIDQoJTApLCAyMCkKLUlEQ1QoICAxNiglMSksIDgwKCUxKSwgNDgoJTEpLCAxMTIoJTEpLCAgOCglMCksIDIwKQotLy9JRENUKCAgMjQoJTEpLCA4OCglMSksIDU2KCUxKSwgMTIwKCUxKSwgMTIoJTApLCAyMCkKLSAgICAgICAgImptcCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0KLSAgICAgICAgIiMgLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotI3VuZGVmIElEQ1QKLSNkZWZpbmUgSURDVChzcmMwLCBzcmM0LCBzcmMxLCBzcmM1LCBkc3QsIHNoaWZ0KSBcCi0gICAgICAgICJtb3ZxICIgI3NyYzAgIiwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogUjQgICAgIFIwICAgICAgcjQgICAgICByMCAqL1wKLSAgICAgICAgIm1vdnEgIiAjc3JjNCAiLCAlJW1tMSAgICAgICAgICBcblx0IiAvKiBSNiAgICAgUjIgICAgICByNiAgICAgIHIyICovXAotICAgICAgICAibW92cSAiICNzcmMxICIsICUlbW0yICAgICAgICAgIFxuXHQiIC8qIFIzICAgICBSMSAgICAgIHIzICAgICAgcjEgKi9cCi0gICAgICAgICJtb3ZxIDE2KCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQzQgICAgIEM0ICAgICAgQzQgICAgICBDNCAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTAsICUlbW00ICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDI0KCUyKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogLUM0ICAgIEM0ICAgICAgLUM0ICAgICBDNCAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTUsICUlbW0wICAgICAgICAgICBcblx0IiAvKiAtQzRSNCtDNFIwICAgICAtQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSAzMiglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIEM2ICAgICBDMiAgICAgIEM2ICAgICAgQzIgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0xLCAlJW1tNSAgICAgICAgICAgXG5cdCIgLyogQzZSNitDMlIyICAgICAgQzZyNitDMnIyICovXAotICAgICAgICAibW92cSA0MCglMiksICUlbW02ICAgICAgICAgICAgIFxuXHQiIC8qIC1DMiAgICBDNiAgICAgIC1DMiAgICAgQzYgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW02LCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogLUMyUjYrQzZSMiAgICAgLUMycjYrQzZyMiAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsICUlbW02ICAgICAgICAgICAgICBcblx0IiAvKiBDNFI0K0M0UjAgICAgICBDNHI0K0M0cjAgKi9cCi0gICAgICAgICJtb3ZxIDQ4KCUyKSwgJSVtbTcgICAgICAgICAgICAgXG5cdCIgLyogQzMgICAgIEMxICAgICAgQzMgICAgICBDMSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW03ICAgICAgICAgICBcblx0IiAvKiBDM1IzK0MxUjEgICAgICBDM3IzK0MxcjEgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogQTAgICAgICAgICAgICAgYTAgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNSwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCi0gICAgICAgICJtb3ZxICUlbW0wLCAlJW1tNSAgICAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tNSAgICAgICAgICAgICBcblx0IiAvKiBBMiAgICAgICAgICAgICBhMiAqL1wKLSAgICAgICAgIm1vdnEgNjQoJTIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW0xICAgICAgICAgICBcblx0IiAvKiAtQzdSMytDM1IxICAgICAtQzdyMytDM3IxICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIEEwK0IwICAgICAgICAgIGEwK2IwICovXAotICAgICAgICAicGFkZGQgJSVtbTQsICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIDJBMCAgICAgICAgICAgIDJhMCAqL1wKLSAgICAgICAgInBzdWJkICUlbW03LCAlJW1tNCAgICAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgICAgICAgICBhMC1iMCAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNyAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0zICAgICAgICAgICAgICBcblx0IiAvKiBBMSAgICAgICAgICAgICBhMSAqL1wKLSAgICAgICAgInBhZGRkICUlbW0xLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvKiBBMStCMSAgICAgICAgICBhMStiMSAqL1wKLSAgICAgICAgInBzdWJkICUlbW0xLCAlJW1tMyAgICAgICAgICAgICBcblx0IiAvKiBBMS1CMSAgICAgICAgICBhMS1iMSAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMyAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW03LCAlJW1tNyAgICAgICAgICBcblx0IiAvKiBBMCtCMCAgYTArYjAgKi9cCi0gICAgICAgICJtb3ZkICUlbW03LCAiICNkc3QgIiAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMCwgJSVtbTAgICAgICAgICAgXG5cdCIgLyogQTErQjEgIGExK2IxICovXAotICAgICAgICAibW92ZCAlJW1tMCwgMTYrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTMsICUlbW0zICAgICAgICAgIFxuXHQiIC8qIEExLUIxICBhMS1iMSAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTMsIDk2KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMC1CMCAgYTAtYjAgKi9cCi0gICAgICAgICJtb3ZkICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxIDgwKCUyKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogLUMxICAgIEM1ICAgICAgLUMxICAgICBDNSAqL1wKLSAgICAgICAgInBtYWRkd2QgJSVtbTIsICUlbW00ICAgICAgICAgICBcblx0IiAvKiAtQzFSMytDNVIxICAgICAtQzFyMytDNXIxICovXAotICAgICAgICAicG1hZGR3ZCA5NiglMiksICUlbW0yICAgICAgICAgIFxuXHQiIC8qIC1DNVIzK0M3UjEgICAgIC1DNXIzK0M3cjEgKi9cCi0gICAgICAgICJtb3ZxICUlbW01LCAlJW1tMyAgICAgICAgICAgICAgXG5cdCIgLyogQTIgICAgICAgICAgICAgYTIgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tNCwgJSVtbTMgICAgICAgICAgICAgXG5cdCIgLyogQTIrQjIgICAgICAgICAgYTIrYjIgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tNCwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLyogYTItQjIgICAgICAgICAgYTItYjIgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTMgICAgICAgXG5cdCJcCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTUgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW02LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIgLyogQTMgICAgICAgICAgICAgYTMgKi9cCi0gICAgICAgICJwYWRkZCAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgXG5cdCIgLyogQTMrQjMgICAgICAgICAgYTMrYjMgKi9cCi0gICAgICAgICJwc3ViZCAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgXG5cdCIgLyogYTMtQjMgICAgICAgICAgYTMtYjMgKi9cCi0gICAgICAgICJwc3JhZCAkIiAjc2hpZnQgIiwgJSVtbTYgICAgICAgXG5cdCJcCi0gICAgICAgICJwYWNrc3NkdyAlJW1tMywgJSVtbTMgICAgICAgICAgXG5cdCIgLyogQTIrQjIgIGEyK2IyICovXAotICAgICAgICAibW92ZCAlJW1tMywgMzIrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW00ICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTYsICUlbW02ICAgICAgICAgIFxuXHQiIC8qIEEzK0IzICBhMytiMyAqL1wKLSAgICAgICAgIm1vdmQgJSVtbTYsIDQ4KyIgI2RzdCAiICAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW00LCAlJW1tNCAgICAgICAgICBcblx0IiAvKiBBMy1CMyAgYTMtYjMgKi9cCi0gICAgICAgICJwYWNrc3NkdyAlJW1tNSwgJSVtbTUgICAgICAgICAgXG5cdCIgLyogQTItQjIgIGEyLWIyICovXAotICAgICAgICAibW92ZCAlJW1tNCwgNjQrIiAjZHN0ICIgICAgICAgIFxuXHQiXAotICAgICAgICAibW92ZCAlJW1tNSwgODArIiAjZHN0ICIgICAgICAgIFxuXHQiCi0KLQotLy9JRENUKCAgc3JjMCwgICBzcmM0LCAgIHNyYzEsICAgIHNyYzUsICAgIGRzdCwgc2hpZnQpCi1JRENUKCAgICAoJTEpLCA2NCglMSksIDMyKCUxKSwgIDk2KCUxKSwgIDAoJTApLCAyMCkKLUlEQ1QoICAgOCglMSksIDcyKCUxKSwgNDAoJTEpLCAxMDQoJTEpLCAgNCglMCksIDIwKQotSURDVCggIDE2KCUxKSwgODAoJTEpLCA0OCglMSksIDExMiglMSksICA4KCUwKSwgMjApCi1JRENUKCAgMjQoJTEpLCA4OCglMSksIDU2KCUxKSwgMTIwKCUxKSwgMTIoJTApLCAyMCkKLSAgICAgICAgImptcCA5ZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotCi0KLSAgICAgICAgIiMgLnAyYWxpZ24gNCAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiNzogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0jdW5kZWYgSURDVAotI2RlZmluZSBJRENUKHNyYzAsIHNyYzQsIHNyYzEsIHNyYzUsIGRzdCwgc2hpZnQpIFwKLSAgICAgICAgIm1vdnEgIiAjc3JjMCAiLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAotICAgICAgICAibW92cSAxNiglMiksICUlbW00ICAgICAgICAgICAgIFxuXHQiIC8qIEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0wLCAlJW1tNCAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSAyNCglMiksICUlbW01ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW01LCAlJW1tMCAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tNCAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMCAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgOCsiICNzcmMwICIsICUlbW0yICAgICAgICBcblx0IiAvKiBSNCAgICAgUjAgICAgICByNCAgICAgIHIwICovXAotICAgICAgICAibW92cSAxNiglMiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8qIEM0ICAgICBDNCAgICAgIEM0ICAgICAgQzQgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW0yLCAlJW1tMSAgICAgICAgICAgXG5cdCIgLyogQzRSNCtDNFIwICAgICAgQzRyNCtDNHIwICovXAotICAgICAgICAibW92cSAyNCglMiksICUlbW03ICAgICAgICAgICAgIFxuXHQiIC8qIC1DNCAgICBDNCAgICAgIC1DNCAgICAgQzQgKi9cCi0gICAgICAgICJwbWFkZHdkICUlbW03LCAlJW1tMiAgICAgICAgICAgXG5cdCIgLyogLUM0UjQrQzRSMCAgICAgLUM0cjQrQzRyMCAqL1wKLSAgICAgICAgIm1vdnEgMzIoJTIpLCAlJW1tNyAgICAgICAgICAgICBcblx0IiAvKiBDNiAgICAgQzIgICAgICBDNiAgICAgIEMyICovXAotICAgICAgICAicHNyYWQgJCIgI3NoaWZ0ICIsICUlbW0xICAgICAgIFxuXHQiXAotICAgICAgICAicGFja3NzZHcgJSVtbTEsICUlbW00ICAgICAgICAgIFxuXHQiIC8qIEEwICAgICBhMCAqL1wKLSAgICAgICAgIm1vdnEgJSVtbTQsICIgI2RzdCAiICAgICAgICAgICBcblx0IlwKLSAgICAgICAgInBzcmFkICQiICNzaGlmdCAiLCAlJW1tMiAgICAgICBcblx0IlwKLSAgICAgICAgInBhY2tzc2R3ICUlbW0yLCAlJW1tMCAgICAgICAgICBcblx0IiAvKiBBMSAgICAgYTEgKi9cCi0gICAgICAgICJtb3ZxICUlbW0wLCAxNisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW0wLCA5NisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW00LCAxMTIrIiAjZHN0ICIgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW0wLCAzMisiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW00LCA0OCsiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW00LCA2NCsiICNkc3QgIiAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICUlbW0wLCA4MCsiICNkc3QgIiAgICAgICAgXG5cdCIKLQotLy9JRENUKCAgc3JjMCwgICBzcmM0LCAgIHNyYzEsICAgIHNyYzUsICAgIGRzdCwgc2hpZnQpCi1JRENUKCAgIDAoJTEpLCA2NCglMSksIDMyKCUxKSwgIDk2KCUxKSwgIDAoJTApLCAyMCkKLS8vSURDVCggICA4KCUxKSwgNzIoJTEpLCA0MCglMSksIDEwNCglMSksICA0KCUwKSwgMjApCi1JRENUKCAgMTYoJTEpLCA4MCglMSksIDQ4KCUxKSwgMTEyKCUxKSwgIDgoJTApLCAyMCkKLS8vSURDVCggIDI0KCUxKSwgODgoJTEpLCA1NiglMSksIDEyMCglMSksIDEyKCUwKSwgMjApCi0KLQotI2VuZGlmCi0KLS8qCi1JbnB1dAotIDAwIDQwIDA0IDQ0IDIwIDYwIDI0IDY0Ci0gMTAgMzAgMTQgMzQgNTAgNzAgNTQgNzQKLSAwMSA0MSAwMyA0MyAyMSA2MSAyMyA2MwotIDExIDMxIDEzIDMzIDUxIDcxIDUzIDczCi0gMDIgNDIgMDYgNDYgMjIgNjIgMjYgNjYKLSAxMiAzMiAxNiAzNiA1MiA3MiA1NiA3NgotIDA1IDQ1IDA3IDQ3IDI1IDY1IDI3IDY3Ci0gMTUgMzUgMTcgMzcgNTUgNzUgNTcgNzcKLQotVGVtcAotIDAwIDA0IDEwIDE0IDIwIDI0IDMwIDM0Ci0gNDAgNDQgNTAgNTQgNjAgNjQgNzAgNzQKLSAwMSAwMyAxMSAxMyAyMSAyMyAzMSAzMwotIDQxIDQzIDUxIDUzIDYxIDYzIDcxIDczCi0gMDIgMDYgMTIgMTYgMjIgMjYgMzIgMzYKLSA0MiA0NiA1MiA1NiA2MiA2NiA3MiA3NgotIDA1IDA3IDE1IDE3IDI1IDI3IDM1IDM3Ci0gNDUgNDcgNTUgNTcgNjUgNjcgNzUgNzcKLSovCi0KLSI5OiBcblx0IgotICAgICAgICAgICAgICAgIDo6ICJyIiAoYmxvY2spLCAiciIgKHRlbXApLCAiciIgKGNvZWZmcykKLSAgICAgICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQod20xMDEwLGQ0MDAwMCkKLSAgICAgICAgICAgICAgICA6ICIlZWF4IgotICAgICAgICApOwotfQotCi12b2lkIGZmX3NpbXBsZV9pZGN0X21teChpbnQxNl90ICpibG9jaykKLXsKLSAgICBpZGN0KGJsb2NrKTsKLX0KLQotLy9GSVhNRSBtZXJnZSBhZGQvcHV0IGludG8gdGhlIGlkY3QKLQotdm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfbW14KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQotewotICAgIGlkY3QoYmxvY2spOwotICAgIGZmX3B1dF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKLX0KLXZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX21teCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKLXsKLSAgICBpZGN0KGJsb2NrKTsKLSAgICBmZl9hZGRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7Ci19Ci0KLSNlbmRpZiAvKiBIQVZFX0lOTElORV9BU00gKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0LmggYi9saWJhdmNvZGVjL3g4Ni9zaW1wbGVfaWRjdC5oCmluZGV4IDhlZWIzMWUuLjliNjRjZmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0LmgKKysrIGIvbGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QuaApAQCAtMTksMjIgKzE5LDM1IEBACiAjaWZuZGVmIEFWQ09ERUNfWDg2X1NJTVBMRV9JRENUX0gKICNkZWZpbmUgQVZDT0RFQ19YODZfU0lNUExFX0lEQ1RfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIHZvaWQgZmZfc2ltcGxlX2lkY3RfbW14KGludDE2X3QgKmJsb2NrKTsKLXZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX21teCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3NpbXBsZV9pZGN0X3B1dF9tbXgodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9hZGRfbW14KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfcHV0X21teCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfc2ltcGxlX2lkY3RfYWRkX3NzZTIodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdF9wdXRfc3NlMih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfc2ltcGxlX2lkY3Q4X3NzZTIoaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdDhfYXZ4KGludDE2X3QgKmJsb2NrKTsKKwordm9pZCBmZl9zaW1wbGVfaWRjdDhfcHV0X3NzZTIodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdDhfcHV0X2F2eCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CisKK3ZvaWQgZmZfc2ltcGxlX2lkY3Q4X2FkZF9zc2UyKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3Q4X2FkZF9hdngodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwogCiB2b2lkIGZmX3NpbXBsZV9pZGN0MTBfc3NlMihpbnQxNl90ICpibG9jayk7CiB2b2lkIGZmX3NpbXBsZV9pZGN0MTBfYXZ4KGludDE2X3QgKmJsb2NrKTsKIAotdm9pZCBmZl9zaW1wbGVfaWRjdDEwX3B1dF9zc2UyKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKLXZvaWQgZmZfc2ltcGxlX2lkY3QxMF9wdXRfYXZ4KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3QxMF9wdXRfc3NlMih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3NpbXBsZV9pZGN0MTBfcHV0X2F2eCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CiAKIHZvaWQgZmZfc2ltcGxlX2lkY3QxMl9zc2UyKGludDE2X3QgKmJsb2NrKTsKIHZvaWQgZmZfc2ltcGxlX2lkY3QxMl9hdngoaW50MTZfdCAqYmxvY2spOwogCi12b2lkIGZmX3NpbXBsZV9pZGN0MTJfcHV0X3NzZTIodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl9zaW1wbGVfaWRjdDEyX3B1dF9hdngodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl9zaW1wbGVfaWRjdDEyX3B1dF9zc2UyKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfc2ltcGxlX2lkY3QxMl9wdXRfYXZ4KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKIAogI2VuZGlmIC8qIEFWQ09ERUNfWDg2X1NJTVBMRV9JRENUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0MTAuYXNtIGIvbGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QxMC5hc20KaW5kZXggNWRlZTUzMy4uMDY5YmI2MSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QxMC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvc2ltcGxlX2lkY3QxMC5hc20KQEAgLTMxLDExICszMSwxNCBAQAogCiBjZXh0ZXJuIHB3XzIKIGNleHRlcm4gcHdfMTYKK2NleHRlcm4gcHdfMzIKIGNleHRlcm4gcHdfMTAyMwogY2V4dGVybiBwd180MDk1CitwZF9yb3VuZF8xMTogdGltZXMgNCBkZCAxPDwoMTEtMSkKIHBkX3JvdW5kXzEyOiB0aW1lcyA0IGRkIDE8PCgxMi0xKQogcGRfcm91bmRfMTU6IHRpbWVzIDQgZGQgMTw8KDE1LTEpCiBwZF9yb3VuZF8xOTogdGltZXMgNCBkZCAxPDwoMTktMSkKK3BkX3JvdW5kXzIwOiB0aW1lcyA0IGRkIDE8PCgyMC0xKQogCiAlbWFjcm8gQ09OU1RfREVDICAzCiBjb25zdCAlMQpAQCAtNDYsNDcgKzQ5LDE0OSBAQAogJWRlZmluZSBXMnNoMiAyMTQwNyA7IFcyID0gODU2MjcgPSAyMTQwNzw8MiAtIDEKICVkZWZpbmUgVzNzaDIgMTkyNjUgOyBXMyA9IDc3MDYyID0gMTkyNjU8PDIgKyAyCiAlZGVmaW5lIFc0c2gyIDE2Mzg0IDsgVzQgPSA2NTUzNSA9IDE2Mzg0PDwyIC0gMQorJWRlZmluZSBXM3NoMl9sbyAxOTI2NgorJWRlZmluZSBXNHNoMl9sbyAxNjM4MwogJWRlZmluZSBXNXNoMiAxMjg3MyA7IFc1ID0gNTE0OTEgPSAxMjg3Mzw8MiAtIDEKICVkZWZpbmUgVzZzaDIgIDg4NjcgOyBXNiA9IDM1NDY4ID0gIDg4Njc8PDIKICVkZWZpbmUgVzdzaDIgIDQ1MjAgOyBXNyA9IDE4MDgxID0gIDQ1MjA8PDIgKyAxCiAKLUNPTlNUX0RFQyAgdzRfcGx1c193MiwgICBXNHNoMiwgK1cyc2gyCi1DT05TVF9ERUMgIHc0X21pbl93MiwgICAgVzRzaDIsIC1XMnNoMgotQ09OU1RfREVDICB3NF9wbHVzX3c2LCAgIFc0c2gyLCArVzZzaDIKLUNPTlNUX0RFQyAgdzRfbWluX3c2LCAgICBXNHNoMiwgLVc2c2gyCi1DT05TVF9ERUMgIHcxX3BsdXNfdzMsICAgVzFzaDIsICtXM3NoMgotQ09OU1RfREVDICB3M19taW5fdzEsICAgIFczc2gyLCAtVzFzaDIKLUNPTlNUX0RFQyAgdzdfcGx1c193MywgICBXN3NoMiwgK1czc2gyCi1DT05TVF9ERUMgIHczX21pbl93NywgICAgVzNzaDIsIC1XN3NoMgorQ09OU1RfREVDICB3NF9wbHVzX3cyX2hpLCAgIFc0c2gyLCArVzJzaDIKK0NPTlNUX0RFQyAgdzRfbWluX3cyX2hpLCAgICBXNHNoMiwgLVcyc2gyCitDT05TVF9ERUMgIHc0X3BsdXNfdzZfaGksICAgVzRzaDIsICtXNnNoMgorQ09OU1RfREVDICB3NF9taW5fdzZfaGksICAgIFc0c2gyLCAtVzZzaDIKK0NPTlNUX0RFQyAgdzFfcGx1c193M19oaSwgICBXMXNoMiwgK1czc2gyCitDT05TVF9ERUMgIHczX21pbl93MV9oaSwgICAgVzNzaDIsIC1XMXNoMgorQ09OU1RfREVDICB3N19wbHVzX3czX2hpLCAgIFc3c2gyLCArVzNzaDIKK0NPTlNUX0RFQyAgdzNfbWluX3c3X2hpLCAgICBXM3NoMiwgLVc3c2gyCiBDT05TVF9ERUMgIHcxX3BsdXNfdzUsICAgVzFzaDIsICtXNXNoMgogQ09OU1RfREVDICB3NV9taW5fdzEsICAgIFc1c2gyLCAtVzFzaDIKIENPTlNUX0RFQyAgdzVfcGx1c193NywgICBXNXNoMiwgK1c3c2gyCiBDT05TVF9ERUMgIHc3X21pbl93NSwgICAgVzdzaDIsIC1XNXNoMgorQ09OU1RfREVDICB3NF9wbHVzX3cyX2xvLCAgIFc0c2gyX2xvLCArVzJzaDIKK0NPTlNUX0RFQyAgdzRfbWluX3cyX2xvLCAgICBXNHNoMl9sbywgLVcyc2gyCitDT05TVF9ERUMgIHc0X3BsdXNfdzZfbG8sICAgVzRzaDJfbG8sICtXNnNoMgorQ09OU1RfREVDICB3NF9taW5fdzZfbG8sICAgIFc0c2gyX2xvLCAtVzZzaDIKK0NPTlNUX0RFQyAgdzFfcGx1c193M19sbywgICBXMXNoMiwgICAgK1czc2gyX2xvCitDT05TVF9ERUMgIHczX21pbl93MV9sbywgICAgVzNzaDJfbG8sIC1XMXNoMgorQ09OU1RfREVDICB3N19wbHVzX3czX2xvLCAgIFc3c2gyLCAgICArVzNzaDJfbG8KK0NPTlNUX0RFQyAgdzNfbWluX3c3X2xvLCAgICBXM3NoMl9sbywgLVc3c2gyCiAKICVpbmNsdWRlICJsaWJhdmNvZGVjL3g4Ni9zaW1wbGVfaWRjdDEwX3RlbXBsYXRlLmFzbSIKIAogU0VDVElPTiAudGV4dAogCislbWFjcm8gU1RPUkVfSElfTE8gMTIKKyAgICBtb3ZxICAgJTEsICU5CisgICAgbW92cSAgICUzLCAlMTAKKyAgICBtb3ZxICAgJTUsICUxMQorICAgIG1vdnEgICAlNywgJTEyCisgICAgbW92aHBzICUyLCAlOQorICAgIG1vdmhwcyAlNCwgJTEwCisgICAgbW92aHBzICU2LCAlMTEKKyAgICBtb3ZocHMgJTgsICUxMgorJWVuZG1hY3JvCisKKyVtYWNybyBMT0FEX1pYQldfOCAxNgorICAgIHBtb3Z6eGJ3ICUxLCAlOQorICAgIHBtb3Z6eGJ3ICUyLCAlMTAKKyAgICBwbW92enhidyAlMywgJTExCisgICAgcG1vdnp4YncgJTQsICUxMgorICAgIHBtb3Z6eGJ3ICU1LCAlMTMKKyAgICBwbW92enhidyAlNiwgJTE0CisgICAgcG1vdnp4YncgJTcsICUxNQorICAgIHBtb3Z6eGJ3ICU4LCAlMTYKKyVlbmRtYWNybworCislbWFjcm8gTE9BRF9aWEJXXzQgOQorICAgIG1vdmggJTEsICU1CisgICAgbW92aCAlMiwgJTYKKyAgICBtb3ZoICUzLCAlNworICAgIG1vdmggJTQsICU4CisgICAgcHVucGNrbGJ3ICUxLCAlOQorICAgIHB1bnBja2xidyAlMiwgJTkKKyAgICBwdW5wY2tsYncgJTMsICU5CisgICAgcHVucGNrbGJ3ICU0LCAlOQorJWVuZG1hY3JvCisKKyVkZWZpbmUgUEFTUzRST1dTKGJhc2UsIHN0cmlkZSwgc3RyaWRlMykgXAorICAgIFtiYXNlXSwgW2Jhc2UgKyBzdHJpZGVdLCBbYmFzZSArIDIqc3RyaWRlXSwgW2Jhc2UgKyBzdHJpZGUzXQorCiAlbWFjcm8gaWRjdF9mbiAwCi1jZ2xvYmFsIHNpbXBsZV9pZGN0MTAsIDEsIDEsIDE2Ci0gICAgSURDVF9GTiAgICAiIiwgMTIsICIiLCAxOQorCitkZWZpbmVfY29uc3RhbnRzIF9sbworCitjZ2xvYmFsIHNpbXBsZV9pZGN0OCwgMSwgMSwgMTYsIDMyLCBibG9jaworICAgIElEQ1RfRk4gICAgIiIsIDExLCBwd18zMiwgMjAsICJzdG9yZSIKK1JFVAorCitjZ2xvYmFsIHNpbXBsZV9pZGN0OF9wdXQsIDMsIDQsIDE2LCAzMiwgcGl4ZWxzLCBsc2l6ZSwgYmxvY2sKKyAgICBJRENUX0ZOICAgICIiLCAxMSwgcHdfMzIsIDIwCisgICAgbGVhICAgICAgIHIzLCBbMypsc2l6ZXFdCisgICAgbGVhICAgICAgIHIyLCBbcGl4ZWxzcSArIHIzXQorICAgIHBhY2t1c3diICBtOCwgbTAKKyAgICBwYWNrdXN3YiAgbTEsIG0yCisgICAgcGFja3Vzd2IgIG00LCBtMTEKKyAgICBwYWNrdXN3YiAgbTksIG0xMAorICAgIFNUT1JFX0hJX0xPIFBBU1M4Uk9XUyhwaXhlbHNxLCByMiwgbHNpemVxLCByMyksIG04LCBtMSwgbTQsIG05CitSRVQKKworY2dsb2JhbCBzaW1wbGVfaWRjdDhfYWRkLCAzLCA0LCAxNiwgMzIsIHBpeGVscywgbHNpemUsIGJsb2NrCisgICAgSURDVF9GTiAgICAiIiwgMTEsIHB3XzMyLCAyMAorICAgIGxlYSByMiwgWzMqbHNpemVxXQorICAgICVpZiBjcHVmbGFnKHNzZTQpCisgICAgICAgIGxlYSByMywgW3BpeGVsc3EgKyByMl0KKyAgICAgICAgTE9BRF9aWEJXXzggbTMsIG01LCBtNiwgbTcsIG0xMiwgbTEzLCBtMTQsIG0xNSwgUEFTUzhST1dTKHBpeGVsc3EsIHIzLCBsc2l6ZXEsIHIyKQorICAgICAgICBwYWRkc3cgbTgsIG0zCisgICAgICAgIHBhZGRzdyBtMCwgbTUKKyAgICAgICAgcGFkZHN3IG0xLCBtNgorICAgICAgICBwYWRkc3cgbTIsIG03CisgICAgICAgIHBhZGRzdyBtNCwgbTEyCisgICAgICAgIHBhZGRzdyBtMTEsIG0xMworICAgICAgICBwYWRkc3cgbTksIG0xNAorICAgICAgICBwYWRkc3cgbTEwLCBtMTUKKyAgICAlZWxzZQorICAgICAgICBweG9yIG0xMiwgbTEyCisgICAgICAgIExPQURfWlhCV180IG0zLCBtNSwgbTYsIG03LCBQQVNTNFJPV1MocGl4ZWxzcSwgbHNpemVxLCByMiksIG0xMgorICAgICAgICBwYWRkc3cgbTgsIG0zCisgICAgICAgIHBhZGRzdyBtMCwgbTUKKyAgICAgICAgcGFkZHN3IG0xLCBtNgorICAgICAgICBwYWRkc3cgbTIsIG03CisgICAgICAgIGxlYSByMywgW3BpeGVsc3EgKyA0KmxzaXplcV0KKyAgICAgICAgTE9BRF9aWEJXXzQgbTMsIG01LCBtNiwgbTcsIFBBU1M0Uk9XUyhyMywgbHNpemVxLCByMiksIG0xMgorICAgICAgICBwYWRkc3cgbTQsIG0zCisgICAgICAgIHBhZGRzdyBtMTEsIG01CisgICAgICAgIHBhZGRzdyBtOSwgbTYKKyAgICAgICAgcGFkZHN3IG0xMCwgbTcKKyAgICAgICAgbGVhIHIzLCBbcGl4ZWxzcSArIHIyXQorICAgICVlbmRpZgorICAgIHBhY2t1c3diICBtOCwgbTAKKyAgICBwYWNrdXN3YiAgbTEsIG0yCisgICAgcGFja3Vzd2IgIG00LCBtMTEKKyAgICBwYWNrdXN3YiAgbTksIG0xMAorICAgIFNUT1JFX0hJX0xPIFBBU1M4Uk9XUyhwaXhlbHNxLCByMywgbHNpemVxLCByMiksIG04LCBtMSwgbTQsIG05CitSRVQKKworZGVmaW5lX2NvbnN0YW50cyBfaGkKKworY2dsb2JhbCBzaW1wbGVfaWRjdDEwLCAxLCAxLCAxNiwgYmxvY2sKKyAgICBJRENUX0ZOICAgICIiLCAxMiwgIiIsIDE5LCAic3RvcmUiCiAgICAgUkVUCiAKLWNnbG9iYWwgc2ltcGxlX2lkY3QxMF9wdXQsIDMsIDMsIDE2Ci0gICAgSURDVF9GTiAgICAiIiwgMTIsICIiLCAxOSwgMCwgcHdfMTAyMworY2dsb2JhbCBzaW1wbGVfaWRjdDEwX3B1dCwgMywgMywgMTYsIHBpeGVscywgbHNpemUsIGJsb2NrCisgICAgSURDVF9GTiAgICAiIiwgMTIsICIiLCAxOSwgInB1dCIsIDAsIHB3XzEwMjMKICAgICBSRVQKIAotY2dsb2JhbCBzaW1wbGVfaWRjdDEyLCAxLCAxLCAxNgorY2dsb2JhbCBzaW1wbGVfaWRjdDEyLCAxLCAxLCAxNiwgYmxvY2sKICAgICA7IGNvZWZmcyBhcmUgYWxyZWFkeSAxNWJpdHMsIGFkZGluZyB0aGUgb2Zmc2V0IHdvdWxkIGNhdXNlCiAgICAgOyBvdmVyZmxvdyBpbiB0aGUgaW5wdXQKLSAgICBJRENUX0ZOICAgICIiLCAxNSwgcHdfMiwgMTYKKyAgICBJRENUX0ZOICAgICIiLCAxNSwgcHdfMiwgMTYsICJzdG9yZSIKICAgICBSRVQKIAotY2dsb2JhbCBzaW1wbGVfaWRjdDEyX3B1dCwgMywgMywgMTYKK2NnbG9iYWwgc2ltcGxlX2lkY3QxMl9wdXQsIDMsIDMsIDE2LCBwaXhlbHMsIGxzaXplLCBibG9jawogICAgIDsgcmFuZ2UgaXNuJ3Qga25vd24sIHNvIHRoZSBDIHNpbXBsZV9pZGN0IHJhbmdlIGlzIHVzZWQKICAgICA7IEFsc28sIHVzaW5nIGEgYmlhcyBvbiBpbnB1dCBvdmVyZmxvd3MsIHNvIHVzZSB0aGUgYmlhcwogICAgIDsgb24gb3V0cHV0IG9mIHRoZSBmaXJzdCBidXR0ZXJmbHkgaW5zdGVhZAotICAgIElEQ1RfRk4gICAgIiIsIDE1LCBwd18yLCAxNiwgMCwgcHdfNDA5NQorICAgIElEQ1RfRk4gICAgIiIsIDE1LCBwd18yLCAxNiwgInB1dCIsIDAsIHB3XzQwOTUKICAgICBSRVQKICVlbmRtYWNybwogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni9zaW1wbGVfaWRjdDEwX3RlbXBsYXRlLmFzbSBiL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0MTBfdGVtcGxhdGUuYXNtCmluZGV4IGU1ZGViMGYuLjBkMDRhOTggMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0MTBfdGVtcGxhdGUuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L3NpbXBsZV9pZGN0MTBfdGVtcGxhdGUuYXNtCkBAIC0yNiw2ICsyNiwyNSBAQAogCiAlaWYgQVJDSF9YODZfNjQKIAorJW1hY3JvIGRlZmluZV9jb25zdGFudHMgMQorICAgICV1bmRlZiB3NF9wbHVzX3cyCisgICAgJXVuZGVmIHc0X21pbl93MgorICAgICV1bmRlZiB3NF9wbHVzX3c2CisgICAgJXVuZGVmIHc0X21pbl93NgorICAgICV1bmRlZiB3MV9wbHVzX3czCisgICAgJXVuZGVmIHczX21pbl93MQorICAgICV1bmRlZiB3N19wbHVzX3czCisgICAgJXVuZGVmIHczX21pbl93NworICAgICVkZWZpbmUgdzRfcGx1c193MiB3NF9wbHVzX3cyJTEKKyAgICAlZGVmaW5lIHc0X21pbl93MiAgdzRfbWluX3cyJTEKKyAgICAlZGVmaW5lIHc0X3BsdXNfdzYgdzRfcGx1c193NiUxCisgICAgJWRlZmluZSB3NF9taW5fdzYgIHc0X21pbl93NiUxCisgICAgJWRlZmluZSB3MV9wbHVzX3czIHcxX3BsdXNfdzMlMQorICAgICVkZWZpbmUgdzNfbWluX3cxICB3M19taW5fdzElMQorICAgICVkZWZpbmUgdzdfcGx1c193MyB3N19wbHVzX3czJTEKKyAgICAlZGVmaW5lIHczX21pbl93NyAgdzNfbWluX3c3JTEKKyVlbmRtYWNybworCiA7IGludGVybGVhdmUgZGF0YSB3aGlsZSBtYWludGFpbmluZyBzb3VyY2UKIDsgJTE9dHlwZSwgJTI9ZHN0bG8sICUzPWRzdGhpLCAlND1zcmMsICU1PWludGVybGVhdmUKICVtYWNybyBTQlVUVEVSRkxZMyA1CkBAIC0xMTUsMTggKzEzNCwxOCBAQAogICAgIHBzdWJkICAgICAgIG0zLCAgbTkgICAgICAgICAgICA7IGExWzQtN10gaW50ZXJtZWRpYXRlCiAKICAgICA7IGxvYWQvc3RvcmUKLSAgICBtb3ZhICAgW0NPRUZGUysgIDBdLCBtMAotICAgIG1vdmEgICBbQ09FRkZTKyAzMl0sIG0yCi0gICAgbW92YSAgIFtDT0VGRlMrIDY0XSwgbTQKLSAgICBtb3ZhICAgW0NPRUZGUysgOTZdLCBtNgotICAgIG1vdmEgICAgICAgIG0xMCxbQ09FRkZTKyAxNl0gICAgICAgOyB7IHJvd1sxXSB9WzAtN10KLSAgICBtb3ZhICAgICAgICBtOCwgW0NPRUZGUysgNDhdICAgICAgIDsgeyByb3dbM10gfVswLTddCi0gICAgbW92YSAgICAgICAgbTEzLFtDT0VGRlMrIDgwXSAgICAgICA7IHsgcm93WzVdIH1bMC03XQotICAgIG1vdmEgICAgICAgIG0xNCxbQ09FRkZTKzExMl0gICAgICAgOyB7IHJvd1s3XSB9WzAtN10KLSAgICBtb3ZhICAgW0NPRUZGUysgMTZdLCBtMQotICAgIG1vdmEgICBbQ09FRkZTKyA0OF0sIG0zCi0gICAgbW92YSAgIFtDT0VGRlMrIDgwXSwgbTUKLSAgICBtb3ZhICAgW0NPRUZGUysxMTJdLCBtNworICAgIG1vdmEgICBbYmxvY2txKyAgMF0sIG0wCisgICAgbW92YSAgIFtibG9ja3ErIDMyXSwgbTIKKyAgICBtb3ZhICAgW2Jsb2NrcSsgNjRdLCBtNAorICAgIG1vdmEgICBbYmxvY2txKyA5Nl0sIG02CisgICAgbW92YSAgICAgICAgbTEwLFtibG9ja3ErIDE2XSAgICAgICA7IHsgcm93WzFdIH1bMC03XQorICAgIG1vdmEgICAgICAgIG04LCBbYmxvY2txKyA0OF0gICAgICAgOyB7IHJvd1szXSB9WzAtN10KKyAgICBtb3ZhICAgICAgICBtMTMsW2Jsb2NrcSsgODBdICAgICAgIDsgeyByb3dbNV0gfVswLTddCisgICAgbW92YSAgICAgICAgbTE0LFtibG9ja3ErMTEyXSAgICAgICA7IHsgcm93WzddIH1bMC03XQorICAgIG1vdmEgICBbYmxvY2txKyAxNl0sIG0xCisgICAgbW92YSAgIFtibG9ja3ErIDQ4XSwgbTMKKyAgICBtb3ZhICAgW2Jsb2NrcSsgODBdLCBtNQorICAgIG1vdmEgICBbYmxvY2txKzExMl0sIG03CiAlaWYgJTAgPT0gMwogICAgIHBtdWxsdyAgICAgIG0xMCxbJTMrIDE2XQogICAgIHBtdWxsdyAgICAgIG04LCBbJTMrIDQ4XQpAQCAtMTk3LDY0ICsyMTYsOTcgQEAKICAgICA7IHJvd1s1XSA9IChhMiAtIGIyKSA+PiAxNTsKICAgICA7IHJvd1szXSA9IChhMyArIGIzKSA+PiAxNTsKICAgICA7IHJvd1s0XSA9IChhMyAtIGIzKSA+PiAxNTsKLSAgICBtb3ZhICAgICAgICBtOCwgW0NPRUZGUysgMF0gICAgICAgIDsgYTBbMC0zXQotICAgIG1vdmEgICAgICAgIG05LCBbQ09FRkZTKzE2XSAgICAgICAgOyBhMFs0LTddCisgICAgbW92YSAgICAgICAgbTgsIFtibG9ja3ErIDBdICAgICAgICA7IGEwWzAtM10KKyAgICBtb3ZhICAgICAgICBtOSwgW2Jsb2NrcSsxNl0gICAgICAgIDsgYTBbNC03XQogICAgIFNVTVNVQl9TSFBLIG04LCAgbTksICBtMTAsIG0xMSwgbTAsICBtMSwgICUyCi0gICAgbW92YSAgICAgICAgbTAsIFtDT0VGRlMrMzJdICAgICAgICA7IGExWzAtM10KLSAgICBtb3ZhICAgICAgICBtMSwgW0NPRUZGUys0OF0gICAgICAgIDsgYTFbNC03XQorICAgIG1vdmEgICAgICAgIG0wLCBbYmxvY2txKzMyXSAgICAgICAgOyBhMVswLTNdCisgICAgbW92YSAgICAgICAgbTEsIFtibG9ja3ErNDhdICAgICAgICA7IGExWzQtN10KICAgICBTVU1TVUJfU0hQSyBtMCwgIG0xLCAgbTksICBtMTEsIG0yLCAgbTMsICAlMgotICAgIG1vdmEgICAgICAgIG0xLCBbQ09FRkZTKzY0XSAgICAgICAgOyBhMlswLTNdCi0gICAgbW92YSAgICAgICAgbTIsIFtDT0VGRlMrODBdICAgICAgICA7IGEyWzQtN10KKyAgICBtb3ZhICAgICAgICBtMSwgW2Jsb2NrcSs2NF0gICAgICAgIDsgYTJbMC0zXQorICAgIG1vdmEgICAgICAgIG0yLCBbYmxvY2txKzgwXSAgICAgICAgOyBhMls0LTddCiAgICAgU1VNU1VCX1NIUEsgbTEsICBtMiwgIG0xMSwgbTMsICBtNCwgIG01LCAgJTIKLSAgICBtb3ZhICAgICAgICBtMiwgW0NPRUZGUys5Nl0gICAgICAgIDsgYTNbMC0zXQotICAgIG1vdmEgICAgICAgIG0zLCBbQ09FRkZTKzExMl0gICAgICAgOyBhM1s0LTddCisgICAgbW92YSAgICAgICAgbTIsIFtibG9ja3ErOTZdICAgICAgICA7IGEzWzAtM10KKyAgICBtb3ZhICAgICAgICBtMywgW2Jsb2NrcSsxMTJdICAgICAgIDsgYTNbNC03XQogICAgIFNVTVNVQl9TSFBLIG0yLCAgbTMsICBtNCwgIG01LCAgbTYsICBtNywgICUyCiAlZW5kbWFjcm8KIAotOyB2b2lkIGZmX3Byb3Jlc19pZGN0X3B1dF8xMF88b3B0Pih1aW50OF90ICpwaXhlbHMsIGludCBzdHJpZGUsCis7IHZvaWQgZmZfcHJvcmVzX2lkY3RfcHV0XzEwXzxvcHQ+KHVpbnQ4X3QgKnBpeGVscywgcHRyZGlmZl90IHN0cmlkZSwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2ssIGNvbnN0IGludDE2X3QgKnFtYXQpOwogCiA7ICUxID0gcm93IHNoaWZ0CiA7ICUyID0gcm93IGJpYXMgbWFjcm8KIDsgJTMgPSBjb2x1bW4gc2hpZnQKIDsgJTQgPSBjb2x1bW4gYmlhcyBtYWNybwotOyAlNSA9IG1pbiBwaXhlbCB2YWx1ZQotOyAlNiA9IG1heCBwaXhlbCB2YWx1ZQotOyAlNyA9IHFtYXQgKGZvciBwcm9yZXMpCis7ICU1ID0gZmluYWwgYWN0aW9uIChub3RoaW5nLCAic3RvcmUiLCAicHV0IiwgImFkZCIpCis7ICU2ID0gbWluIHBpeGVsIHZhbHVlCis7ICU3ID0gbWF4IHBpeGVsIHZhbHVlCis7ICU4ID0gcW1hdCAoZm9yIHByb3JlcykKIAotJW1hY3JvIElEQ1RfRk4gNC03Ci0laWYgJTAgPT0gNAotICAgIDsgTm8gY2xhbXBpbmcsIG1lYW5zIHB1cmUgaWRjdAotJXhkZWZpbmUgQ09FRkZTIHIwCi0lZWxzZQotICAgIG1vdnN4ZCAgICAgIHIxLCAgcjFkCi0leGRlZmluZSBDT0VGRlMgcjIKLSVlbmRpZgotCislbWFjcm8gSURDVF9GTiA0LTgKICAgICA7IGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCiAgICAgOyAgICAgaWRjdFJvd0NvbmREQyhibG9jayArIGkqOCk7Ci0gICAgbW92YSAgICAgICAgbTEwLFtDT0VGRlMrIDBdICAgICAgICA7IHsgcm93WzBdIH1bMC03XQotICAgIG1vdmEgICAgICAgIG04LCBbQ09FRkZTKzMyXSAgICAgICAgOyB7IHJvd1syXSB9WzAtN10KLSAgICBtb3ZhICAgICAgICBtMTMsW0NPRUZGUys2NF0gICAgICAgIDsgeyByb3dbNF0gfVswLTddCi0gICAgbW92YSAgICAgICAgbTEyLFtDT0VGRlMrOTZdICAgICAgICA7IHsgcm93WzZdIH1bMC03XQorICAgIG1vdmEgICAgICAgIG0xMCxbYmxvY2txKyAwXSAgICAgICAgOyB7IHJvd1swXSB9WzAtN10KKyAgICBtb3ZhICAgICAgICBtOCwgW2Jsb2NrcSszMl0gICAgICAgIDsgeyByb3dbMl0gfVswLTddCisgICAgbW92YSAgICAgICAgbTEzLFtibG9ja3ErNjRdICAgICAgICA7IHsgcm93WzRdIH1bMC03XQorICAgIG1vdmEgICAgICAgIG0xMixbYmxvY2txKzk2XSAgICAgICAgOyB7IHJvd1s2XSB9WzAtN10KIAotJWlmICUwID09IDcKLSAgICBwbXVsbHcgICAgICBtMTAsWyU3KyAwXQotICAgIHBtdWxsdyAgICAgIG04LCBbJTcrMzJdCi0gICAgcG11bGx3ICAgICAgbTEzLFslNys2NF0KLSAgICBwbXVsbHcgICAgICBtMTIsWyU3Kzk2XQorJWlmICUwID09IDgKKyAgICBwbXVsbHcgICAgICBtMTAsWyU4KyAwXQorICAgIHBtdWxsdyAgICAgIG04LCBbJTgrMzJdCisgICAgcG11bGx3ICAgICAgbTEzLFslOCs2NF0KKyAgICBwbXVsbHcgICAgICBtMTIsWyU4Kzk2XQogCi0gICAgSURDVF8xRCAgICAgJTEsICUyLCAlNworICAgIElEQ1RfMUQgICAgICUxLCAlMiwgJTgKKyVlbGlmICUyID09IDExCisgICAgOyBUaGlzIGNvcGllcyB0aGUgREMtb25seSBzaG9ydGN1dC4gIFdoZW4gdGhlcmUgaXMgb25seSBhIERDIGNvZWZmaWNpZW50IHRoZQorICAgIDsgQyBzaGlmdHMgdGhlIHZhbHVlIGFuZCBzcGxhdHMgaXQgdG8gYWxsIGNvZWZmcyByYXRoZXIgdGhhbiBtdWx0aXBseWluZyBhbmQKKyAgICA7IGRvaW5nIHRoZSBmdWxsIElEQ1QuICBUaGlzIGNhdXNlcyBhIGRpZmZlcmVuY2Ugb24gOC1iaXQgYmVjYXVzZSB0aGUKKyAgICA7IGNvZWZmaWNpZW50IGlzIDE2MzgzIHJhdGhlciB0aGFuIDE2Mzg0ICh3aGljaCB5b3UgY2FuIGdldCB3aXRoIHNoaWZ0aW5nKS4KKyAgICBwb3IgICAgICBtMSwgIG04LCBtMTMKKyAgICBwb3IgICAgICBtMSwgIG0xMgorICAgIHBvciAgICAgIG0xLCBbYmxvY2txKyAxNl0gICAgICAgOyB7IHJvd1sxXSB9WzAtN10KKyAgICBwb3IgICAgICBtMSwgW2Jsb2NrcSsgNDhdICAgICAgIDsgeyByb3dbM10gfVswLTddCisgICAgcG9yICAgICAgbTEsIFtibG9ja3ErIDgwXSAgICAgICA7IHsgcm93WzVdIH1bMC03XQorICAgIHBvciAgICAgIG0xLCBbYmxvY2txKzExMl0gICAgICAgOyB7IHJvd1s3XSB9WzAtN10KKyAgICBweG9yICAgICBtMiwgIG0yCisgICAgcGNtcGVxdyAgbTEsICBtMgorICAgIHBzbGx3ICAgIG0yLCAgbTEwLCAzCisgICAgcGFuZCAgICAgbTIsICBtMQorICAgIHBjbXBlcWIgIG0zLCAgbTMKKyAgICBweG9yICAgICBtMSwgIG0zCisgICAgbW92YSAgICBbcnNwXSwgICAgbTEKKyAgICBtb3ZhICAgIFtyc3ArMTZdLCBtMgorCisgICAgSURDVF8xRCAgJTEsICAlMgorCisgICAgbW92YSAgICAgbTUsIFtyc3BdCisgICAgbW92YSAgICAgbTYsIFtyc3ArMTZdCisgICAgcGFuZCAgICAgbTgsICBtNQorICAgIHBvciAgICAgIG04LCAgbTYKKyAgICBwYW5kICAgICBtMCwgIG01CisgICAgcG9yICAgICAgbTAsICBtNgorICAgIHBhbmQgICAgIG0xLCAgbTUKKyAgICBwb3IgICAgICBtMSwgIG02CisgICAgcGFuZCAgICAgbTIsICBtNQorICAgIHBvciAgICAgIG0yLCAgbTYKKyAgICBwYW5kICAgICBtNCwgIG01CisgICAgcG9yICAgICAgbTQsICBtNgorICAgIHBhbmQgICAgIG0xMSwgbTUKKyAgICBwb3IgICAgICBtMTEsIG02CisgICAgcGFuZCAgICAgbTksICBtNQorICAgIHBvciAgICAgIG05LCAgbTYKKyAgICBwYW5kICAgICBtMTAsIG01CisgICAgcG9yICAgICAgbTEwLCBtNgogJWVsc2UKICAgICBJRENUXzFEICAgICAlMSwgJTIKICVlbmRpZgogCiAgICAgOyB0cmFuc3Bvc2UgZm9yIHNlY29uZCBwYXJ0IG9mIElEQ1QKICAgICBUUkFOU1BPU0U4eDhXIDgsIDAsIDEsIDIsIDQsIDExLCA5LCAxMCwgMwotICAgIG1vdmEgICBbQ09FRkZTKyAxNl0sIG0wCi0gICAgbW92YSAgIFtDT0VGRlMrIDQ4XSwgbTIKLSAgICBtb3ZhICAgW0NPRUZGUysgODBdLCBtMTEKLSAgICBtb3ZhICAgW0NPRUZGUysxMTJdLCBtMTAKKyAgICBtb3ZhICAgW2Jsb2NrcSsgMTZdLCBtMAorICAgIG1vdmEgICBbYmxvY2txKyA0OF0sIG0yCisgICAgbW92YSAgIFtibG9ja3ErIDgwXSwgbTExCisgICAgbW92YSAgIFtibG9ja3ErMTEyXSwgbTEwCiAgICAgU1dBUCAgICAgICAgIDgsICAxMAogICAgIFNXQVAgICAgICAgICAxLCAgIDgKICAgICBTV0FQICAgICAgICAgNCwgIDEzCkBAIC0yNjUsMjMgKzMxNywyNCBAQAogICAgIElEQ1RfMUQgICAgICUzLCAlNAogCiAgICAgOyBjbGlwL3N0b3JlCi0laWYgJTAgPT0gNAorJWlmICUwID49IDUKKyVpZmlkbiAlNSwic3RvcmUiCiAgICAgOyBObyBjbGFtcGluZywgbWVhbnMgcHVyZSBpZGN0Ci0gICAgbW92YSAgW3IwKyAgMF0sIG04Ci0gICAgbW92YSAgW3IwKyAxNl0sIG0wCi0gICAgbW92YSAgW3IwKyAzMl0sIG0xCi0gICAgbW92YSAgW3IwKyA0OF0sIG0yCi0gICAgbW92YSAgW3IwKyA2NF0sIG00Ci0gICAgbW92YSAgW3IwKyA4MF0sIG0xMQotICAgIG1vdmEgIFtyMCsgOTZdLCBtOQotICAgIG1vdmEgIFtyMCsxMTJdLCBtMTAKLSVlbHNlCi0laWZpZG4gJTUsIDAKKyAgICBtb3ZhICBbYmxvY2txKyAgMF0sIG04CisgICAgbW92YSAgW2Jsb2NrcSsgMTZdLCBtMAorICAgIG1vdmEgIFtibG9ja3ErIDMyXSwgbTEKKyAgICBtb3ZhICBbYmxvY2txKyA0OF0sIG0yCisgICAgbW92YSAgW2Jsb2NrcSsgNjRdLCBtNAorICAgIG1vdmEgIFtibG9ja3ErIDgwXSwgbTExCisgICAgbW92YSAgW2Jsb2NrcSsgOTZdLCBtOQorICAgIG1vdmEgIFtibG9ja3ErMTEyXSwgbTEwCislZWxpZmlkbiAlNSwicHV0IgorJWlmaWRuICU2LCAwCiAgICAgcHhvciAgICAgICAgbTMsIG0zCiAlZWxzZQotICAgIG1vdmEgICAgICAgIG0zLCBbJTVdCi0lZW5kaWYKLSAgICBtb3ZhICAgICAgICBtNSwgWyU2XQorICAgIG1vdmEgICAgICAgIG0zLCBbJTZdCislZW5kaWYgOyBpZmlkbiAlNiwgMAorICAgIG1vdmEgICAgICAgIG01LCBbJTddCiAgICAgcG1heHN3ICAgICAgbTgsICBtMwogICAgIHBtYXhzdyAgICAgIG0wLCAgbTMKICAgICBwbWF4c3cgICAgICBtMSwgIG0zCkBAIC0zMDksNyArMzYyLDggQEAKICAgICBtb3ZhICBbcjArcjEgIF0sIG0xMQogICAgIG1vdmEgIFtyMCtyMSoyXSwgbTkKICAgICBtb3ZhICBbcjArcjIgIF0sIG0xMAotJWVuZGlmCislZW5kaWYgOyAlNSBhY3Rpb24KKyVlbmRpZjsgaWYgJTAgPj0gNQogJWVuZG1hY3JvCiAKICVlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvc25vd2RzcC5jIGIvbGliYXZjb2RlYy94ODYvc25vd2RzcC5jCmluZGV4IGUyYWQ1MTEuLjIxOGU2ODYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3Nub3dkc3AuYworKysgYi9saWJhdmNvZGVjL3g4Ni9zbm93ZHNwLmMKQEAgLTM5MCwxMCArMzkwLDEwIEBACiAKICNpZiBIQVZFXzdSRUdTCiAjZGVmaW5lIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX2xvYWRfYWRkKG9wLHIsdDAsdDEsdDIsdDMpXAotICAgICAgICAiIm9wIiAoInIiLCUlIlJFR19kIiksICUlInQwIiAgICAgIFxuXHQiXAotICAgICAgICAiIm9wIiAxNigiciIsJSUiUkVHX2QiKSwgJSUidDEiICAgIFxuXHQiXAotICAgICAgICAiIm9wIiAzMigiciIsJSUiUkVHX2QiKSwgJSUidDIiICAgIFxuXHQiXAotICAgICAgICAiIm9wIiA0OCgiciIsJSUiUkVHX2QiKSwgJSUidDMiICAgIFxuXHQiCisgICAgICAgICIib3AiICgiciIsJSUiRkZfUkVHX2QiKSwgJSUidDAiICAgICAgXG5cdCJcCisgICAgICAgICIib3AiIDE2KCJyIiwlJSJGRl9SRUdfZCIpLCAlJSJ0MSIgICAgXG5cdCJcCisgICAgICAgICIib3AiIDMyKCJyIiwlJSJGRl9SRUdfZCIpLCAlJSJ0MiIgICAgXG5cdCJcCisgICAgICAgICIib3AiIDQ4KCJyIiwlJSJGRl9SRUdfZCIpLCAlJSJ0MyIgICAgXG5cdCIKIAogI2RlZmluZSBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9sb2FkKHIsdDAsdDEsdDIsdDMpXAogICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2Vfc3NlMl9sb2FkX2FkZCgibW92ZHFhIixyLHQwLHQxLHQyLHQzKQpAQCAtNDA4LDEwICs0MDgsMTAgQEAKICAgICAgICAgInBzdWJ3ICUlInMzIiwgJSUidDMiIFxuXHQiCiAKICNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NzZTJfc3RvcmUodyxzMCxzMSxzMixzMylcCi0gICAgICAgICJtb3ZkcWEgJSUiczAiLCAoInciLCUlIlJFR19kIikgICAgICBcblx0IlwKLSAgICAgICAgIm1vdmRxYSAlJSJzMSIsIDE2KCJ3IiwlJSJSRUdfZCIpICAgIFxuXHQiXAotICAgICAgICAibW92ZHFhICUlInMyIiwgMzIoInciLCUlIlJFR19kIikgICAgXG5cdCJcCi0gICAgICAgICJtb3ZkcWEgJSUiczMiLCA0OCgidyIsJSUiUkVHX2QiKSAgICBcblx0IgorICAgICAgICAibW92ZHFhICUlInMwIiwgKCJ3IiwlJSJGRl9SRUdfZCIpICAgIFxuXHQiXAorICAgICAgICAibW92ZHFhICUlInMxIiwgMTYoInciLCUlIkZGX1JFR19kIikgIFxuXHQiXAorICAgICAgICAibW92ZHFhICUlInMyIiwgMzIoInciLCUlIkZGX1JFR19kIikgIFxuXHQiXAorICAgICAgICAibW92ZHFhICUlInMzIiwgNDgoInciLCUlIkZGX1JFR19kIikgIFxuXHQiCiAKICNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX3NyYShuLHQwLHQxLHQyLHQzKVwKICAgICAgICAgInBzcmF3ICQibiIsICUlInQwIiBcblx0IlwKQEAgLTQ3NywxNCArNDc3LDE0IEBACiAgICAgICAgICJwc3JsdyAkMTMsICUleG1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJXhtbTcsICUleG1tNSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9yMnJfYWRkKCJ4bW01IiwieG1tNSIsInhtbTUiLCJ4bW01IiwieG1tMCIsInhtbTIiLCJ4bW00IiwieG1tNiIpCi0gICAgICAgICJtb3ZxICAgKCUyLCUlIlJFR19kIiksICUleG1tMSAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgIDgoJTIsJSUiUkVHX2QiKSwgJSV4bW0zICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICglMiwlJSJGRl9SRUdfZCIpLCAlJXhtbTEgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgOCglMiwlJSJGRl9SRUdfZCIpLCAlJXhtbTMgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHcgJSV4bW03LCAlJXhtbTEgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHcgJSV4bW03LCAlJXhtbTMgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGF2Z3cgJSV4bW0xLCAlJXhtbTAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGF2Z3cgJSV4bW0zLCAlJXhtbTIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAxNiglMiwlJSJSRUdfZCIpLCAlJXhtbTEgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxIDI0KCUyLCUlIlJFR19kIiksICUleG1tMyAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgMTYoJTIsJSUiRkZfUkVHX2QiKSwgJSV4bW0xICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgMjQoJTIsJSUiRkZfUkVHX2QiKSwgJSV4bW0zICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGR3ICUleG1tNywgJSV4bW0xICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGR3ICUleG1tNywgJSV4bW0zICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhdmd3ICUleG1tMSwgJSV4bW00ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTUwNCwxNyArNTA0LDE3IEBACiAgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9zc2UyX3N0b3JlKCIlMiIsInhtbTAiLCJ4bW0yIiwieG1tNCIsInhtbTYiKQogCiAgICAgICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJzdWIgJDY0LCAlJSJSRUdfZCIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdWIgJDY0LCAlJSJGRl9SRUdfZCIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJqZ2UgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIDoiK2QiKGkpCiAgICAgICAgIDoiciIoYjApLCJyIihiMSksInIiKGIyKSwiciIoYjMpLCJyIihiNCksInIiKGI1KSk7CiB9CiAKICNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9sb2FkX2FkZChvcCxyLHQwLHQxLHQyLHQzKVwKLSAgICAgICAgIiJvcCIgKCJyIiwlJSJSRUdfZCIpLCAlJSJ0MCIgICBcblx0IlwKLSAgICAgICAgIiJvcCIgOCgiciIsJSUiUkVHX2QiKSwgJSUidDEiICBcblx0IlwKLSAgICAgICAgIiJvcCIgMTYoInIiLCUlIlJFR19kIiksICUlInQyIiBcblx0IlwKLSAgICAgICAgIiJvcCIgMjQoInIiLCUlIlJFR19kIiksICUlInQzIiBcblx0IgorICAgICAgICAiIm9wIiAoInIiLCUlIkZGX1JFR19kIiksICUlInQwIiAgIFxuXHQiXAorICAgICAgICAiIm9wIiA4KCJyIiwlJSJGRl9SRUdfZCIpLCAlJSJ0MSIgIFxuXHQiXAorICAgICAgICAiIm9wIiAxNigiciIsJSUiRkZfUkVHX2QiKSwgJSUidDIiIFxuXHQiXAorICAgICAgICAiIm9wIiAyNCgiciIsJSUiRkZfUkVHX2QiKSwgJSUidDMiIFxuXHQiCiAKICNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9sb2FkKHIsdDAsdDEsdDIsdDMpXAogICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfbW14X2xvYWRfYWRkKCJtb3ZxIixyLHQwLHQxLHQyLHQzKQpAQCAtNTIzLDEwICs1MjMsMTAgQEAKICAgICAgICAgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9sb2FkX2FkZCgicGFkZHciLHIsdDAsdDEsdDIsdDMpCiAKICNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9zdG9yZSh3LHMwLHMxLHMyLHMzKVwKLSAgICAgICAgIm1vdnEgJSUiczAiLCAoInciLCUlIlJFR19kIikgICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSUiczEiLCA4KCJ3IiwlJSJSRUdfZCIpICBcblx0IlwKLSAgICAgICAgIm1vdnEgJSUiczIiLCAxNigidyIsJSUiUkVHX2QiKSBcblx0IlwKLSAgICAgICAgIm1vdnEgJSUiczMiLCAyNCgidyIsJSUiUkVHX2QiKSBcblx0IgorICAgICAgICAibW92cSAlJSJzMCIsICgidyIsJSUiRkZfUkVHX2QiKSAgIFxuXHQiXAorICAgICAgICAibW92cSAlJSJzMSIsIDgoInciLCUlIkZGX1JFR19kIikgIFxuXHQiXAorICAgICAgICAibW92cSAlJSJzMiIsIDE2KCJ3IiwlJSJGRl9SRUdfZCIpIFxuXHQiXAorICAgICAgICAibW92cSAlJSJzMyIsIDI0KCJ3IiwlJSJGRl9SRUdfZCIpIFxuXHQiCiAKICNkZWZpbmUgc25vd192ZXJ0aWNhbF9jb21wb3NlX21teF9tb3ZlKHMwLHMxLHMyLHMzLHQwLHQxLHQyLHQzKVwKICAgICAgICAgIm1vdnEgJSUiczAiLCAlJSJ0MCIgXG5cdCJcCkBAIC01NzEsMTQgKzU3MSwxNCBAQAogICAgICAgICAicHNybHcgJDEzLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHcgJSVtbTcsICUlbW01ICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICBzbm93X3ZlcnRpY2FsX2NvbXBvc2VfcjJyX2FkZCgibW01IiwibW01IiwibW01IiwibW01IiwibW0wIiwibW0yIiwibW00IiwibW02IikKLSAgICAgICAgIm1vdnEgICAoJTIsJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAgOCglMiwlJSJSRUdfZCIpLCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgKCUyLCUlIkZGX1JFR19kIiksICUlbW0xICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICA4KCUyLCUlIkZGX1JFR19kIiksICUlbW0zICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYXZndyAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYXZndyAlJW1tMywgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxIDE2KCUyLCUlIlJFR19kIiksICUlbW0xICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgMjQoJTIsJSUiUkVHX2QiKSwgJSVtbTMgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAxNiglMiwlJSJGRl9SRUdfZCIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAyNCglMiwlJSJGRl9SRUdfZCIpLCAlJW1tMyAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHcgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGF2Z3cgJSVtbTEsICUlbW00ICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtNTk4LDcgKzU5OCw3IEBACiAgICAgICAgIHNub3dfdmVydGljYWxfY29tcG9zZV9tbXhfc3RvcmUoIiUyIiwibW0wIiwibW0yIiwibW00IiwibW02IikKIAogICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAic3ViICQzMiwgJSUiUkVHX2QiICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICQzMiwgJSUiRkZfUkVHX2QiICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAiamdlIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICA6IitkIihpKQogICAgICAgICA6InIiKGIwKSwiciIoYjEpLCJyIihiMiksInIiKGIzKSwiciIoYjQpLCJyIihiNSkpOwpAQCAtNjEwLDM5ICs2MTAsMzkgQEAKICAgICBJRFdURUxFTSAqICogZHN0X2FycmF5ID0gc2ItPmxpbmUgKyBzcmNfeTtcCiAgICAgeDg2X3JlZyB0bXA7XAogICAgIF9fYXNtX18gdm9sYXRpbGUoXAotICAgICAgICAgICAgICJtb3YgICU3LCAlJSJSRUdfYyIgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdiAgJTcsICUlIkZGX1JFR19jIiAgICAgICAgICBcblx0IlwKICAgICAgICAgICAgICAibW92ICAlNiwgJTIgICAgICAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAgICAgICJtb3YgICU0LCAlJSJSRUdfUyIgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdiAgJTQsICUlIkZGX1JFR19TIiAgICAgICAgICBcblx0IlwKICAgICAgICAgICAgICAicHhvciAlJXhtbTcsICUleG1tNyAgICAgICAgICAgIFxuXHQiIC8qIDAgKi9cCiAgICAgICAgICAgICAgInBjbXBlcWQgJSV4bW0zLCAlJXhtbTMgICAgICAgICBcblx0IlwKICAgICAgICAgICAgICAicHNsbHcgJDE1LCAlJXhtbTMgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJwc3JsdyAkMTIsICUleG1tMyAgICAgICAgICAgICAgXG5cdCIgLyogRlJBQ19CSVRTID4+IDEgKi9cCiAgICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgICAgICAibW92ICUxLCAlJSJSRUdfRCIgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAgICAgICJtb3YgKCUlIlJFR19EIiksICUlIlJFR19EIiAgICAgXG5cdCJcCi0gICAgICAgICAgICAgImFkZCAlMywgJSUiUkVHX0QiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICJtb3YgJTEsICUlIkZGX1JFR19EIiAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdiAoJSUiRkZfUkVHX0QiKSwgJSUiRkZfUkVHX0QiIFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJTMsICUlIkZGX1JFR19EIiAgICAgICAgICAgXG5cdCIKIAogI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9zdGFydF84KG91dF9yZWcxLCBvdXRfcmVnMiwgcHRyX29mZnNldCwgc19vZmZzZXQpXAotICAgICAgICAgICAgICJtb3YgIlBUUl9TSVpFIioicHRyX29mZnNldCIoJSUiUkVHX2EiKSwgJSUiUkVHX2QiOyBcblx0IlwKLSAgICAgICAgICAgICAibW92cSAoJSUiUkVHX2QiKSwgJSUib3V0X3JlZzEiIFxuXHQiXAotICAgICAgICAgICAgICJtb3ZxICglJSJSRUdfZCIsICUlIlJFR19jIiksICUlIm91dF9yZWcyIiBcblx0IlwKKyAgICAgICAgICAgICAibW92ICJGRl9QVFJfU0laRSIqInB0cl9vZmZzZXQiKCUlIkZGX1JFR19hIiksICUlIkZGX1JFR19kIjsgXG5cdCJcCisgICAgICAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19kIiksICUlIm91dF9yZWcxIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJtb3ZxICglJSJGRl9SRUdfZCIsICUlIkZGX1JFR19jIiksICUlIm91dF9yZWcyIiAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgICAgICAicHVucGNrbGJ3ICUleG1tNywgJSUib3V0X3JlZzEiIFxuXHQiXAogICAgICAgICAgICAgICJwdW5wY2tsYncgJSV4bW03LCAlJSJvdXRfcmVnMiIgXG5cdCJcCi0gICAgICAgICAgICAgIm1vdnEgInNfb2Zmc2V0IiglJSJSRUdfUyIpLCAlJXhtbTAgXG5cdCJcCi0gICAgICAgICAgICAgIm1vdnEgInNfb2Zmc2V0IisxNiglJSJSRUdfUyIpLCAlJXhtbTQgXG5cdCJcCisgICAgICAgICAgICAgIm1vdnEgInNfb2Zmc2V0IiglJSJGRl9SRUdfUyIpLCAlJXhtbTAgICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdnEgInNfb2Zmc2V0IisxNiglJSJGRl9SRUdfUyIpLCAlJXhtbTQgXG5cdCJcCiAgICAgICAgICAgICAgInB1bnBja2xidyAlJXhtbTcsICUleG1tMCAgICAgICBcblx0IlwKICAgICAgICAgICAgICAicHVucGNrbGJ3ICUleG1tNywgJSV4bW00ICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJwbXVsbHcgJSV4bW0wLCAlJSJvdXRfcmVnMSIgICAgXG5cdCJcCiAgICAgICAgICAgICAgInBtdWxsdyAlJXhtbTQsICUlIm91dF9yZWcyIiAgICBcblx0IgogCiAjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX3N0YXJ0XzE2KG91dF9yZWcxLCBvdXRfcmVnMiwgcHRyX29mZnNldCwgc19vZmZzZXQpXAotICAgICAgICAgICAgICJtb3YgIlBUUl9TSVpFIioicHRyX29mZnNldCIoJSUiUkVHX2EiKSwgJSUiUkVHX2QiOyBcblx0IlwKLSAgICAgICAgICAgICAibW92cSAoJSUiUkVHX2QiKSwgJSUib3V0X3JlZzEiIFxuXHQiXAotICAgICAgICAgICAgICJtb3ZxIDgoJSUiUkVHX2QiKSwgJSUib3V0X3JlZzIiIFxuXHQiXAorICAgICAgICAgICAgICJtb3YgIkZGX1BUUl9TSVpFIioicHRyX29mZnNldCIoJSUiRkZfUkVHX2EiKSwgJSUiRkZfUkVHX2QiOyBcblx0IlwKKyAgICAgICAgICAgICAibW92cSAoJSUiRkZfUkVHX2QiKSwgJSUib3V0X3JlZzEiICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdnEgOCglJSJGRl9SRUdfZCIpLCAlJSJvdXRfcmVnMiIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJwdW5wY2tsYncgJSV4bW03LCAlJSJvdXRfcmVnMSIgXG5cdCJcCiAgICAgICAgICAgICAgInB1bnBja2xidyAlJXhtbTcsICUlIm91dF9yZWcyIiBcblx0IlwKLSAgICAgICAgICAgICAibW92cSAic19vZmZzZXQiKCUlIlJFR19TIiksICUleG1tMCBcblx0IlwKLSAgICAgICAgICAgICAibW92cSAic19vZmZzZXQiKzgoJSUiUkVHX1MiKSwgJSV4bW00IFxuXHQiXAorICAgICAgICAgICAgICJtb3ZxICJzX29mZnNldCIoJSUiRkZfUkVHX1MiKSwgJSV4bW0wICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdnEgInNfb2Zmc2V0Iis4KCUlIkZGX1JFR19TIiksICUleG1tNCBcblx0IlwKICAgICAgICAgICAgICAicHVucGNrbGJ3ICUleG1tNywgJSV4bW0wICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJwdW5wY2tsYncgJSV4bW03LCAlJXhtbTQgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgInBtdWxsdyAlJXhtbTAsICUlIm91dF9yZWcxIiAgICBcblx0IlwKQEAgLTY1OSwxMiArNjU5LDEyIEBACiAgICAgICAgICAgICAgInBhZGR1c3cgJSV4bW02LCAlJXhtbTUgICAgICAgICBcblx0IgogCiAjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2VuZF9jb21tb24xXAotICAgICAgICAgICAgICJhZGQgJDMyLCAlJSJSRUdfUyIgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICAgICAgImFkZCAlJSJSRUdfYyIsICUwICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgICAgICAiYWRkICUlIlJFR19jIiwgIlBUUl9TSVpFIiozKCUlIlJFR19hIik7XG5cdCJcCi0gICAgICAgICAgICAgImFkZCAlJSJSRUdfYyIsICJQVFJfU0laRSIqMiglJSJSRUdfYSIpO1xuXHQiXAotICAgICAgICAgICAgICJhZGQgJSUiUkVHX2MiLCAiUFRSX1NJWkUiKjEoJSUiUkVHX2EiKTtcblx0IlwKLSAgICAgICAgICAgICAiYWRkICUlIlJFR19jIiwgKCUlIlJFR19hIikgICAgIFxuXHQiCisgICAgICAgICAgICAgImFkZCAkMzIsICUlIkZGX1JFR19TIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAiYWRkICUlIkZGX1JFR19jIiwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJSUiRkZfUkVHX2MiLCAiRkZfUFRSX1NJWkUiKjMoJSUiRkZfUkVHX2EiKTsgXG5cdCJcCisgICAgICAgICAgICAgImFkZCAlJSJGRl9SRUdfYyIsICJGRl9QVFJfU0laRSIqMiglJSJGRl9SRUdfYSIpOyBcblx0IlwKKyAgICAgICAgICAgICAiYWRkICUlIkZGX1JFR19jIiwgIkZGX1BUUl9TSVpFIioxKCUlIkZGX1JFR19hIik7IFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJSUiRkZfUkVHX2MiLCAoJSUiRkZfUkVHX2EiKSAgICAgICAgICAgICAgICAgXG5cdCIKIAogI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfY29tbW9uMlwKICAgICAgICAgICAgICAiam56IDFiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXApAQCAtNjcyLDE4ICs2NzIsMTggQEAKICAgICAgICAgICAgICA6XAogICAgICAgICAgICAgICJybSIoKHg4Nl9yZWcpKHNyY194PDwxKSksIm0iKG9ibWMpLCJhIihibG9jayksIm0iKGJfaCksIm0iKHNyY19zdHJpZGUpOlwKICAgICAgICAgICAgICBYTU1fQ0xPQkJFUlMoIiV4bW0wIiwgIiV4bW0xIiwgIiV4bW0yIiwgIiV4bW0zIiwgIiV4bW00IiwgIiV4bW01IiwgIiV4bW02IiwgIiV4bW03IiwgKVwKLSAgICAgICAgICAgICAiJSJSRUdfYyIiLCIlIlJFR19TIiIsIiUiUkVHX0QiIiwiJSJSRUdfZCIiKTsKKyAgICAgICAgICAgICAiJSJGRl9SRUdfYyIiLCIlIkZGX1JFR19TIiIsIiUiRkZfUkVHX0QiIiwiJSJGRl9SRUdfZCIiKTsKIAogI2RlZmluZSBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfOFwKLSAgICAgICAgICAgICAic2FsICQxLCAlJSJSRUdfYyIgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAgICAgICJhZGQiT1BTSVpFIiAkIlBUUl9TSVpFIioyLCAlMSAgXG5cdCJcCisgICAgICAgICAgICAgInNhbCAkMSwgJSUiRkZfUkVHX2MiICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJhZGQiRkZfT1BTSVpFIiAkIkZGX1BUUl9TSVpFIioyLCAlMSBcblx0IlwKICAgICAgICAgICAgICBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfY29tbW9uMVwKLSAgICAgICAgICAgICAic2FyICQxLCAlJSJSRUdfYyIgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJzYXIgJDEsICUlIkZGX1JFR19jIiAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgInN1YiAkMiwgJTIgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgICAgICBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfY29tbW9uMgogCiAjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2VuZF8xNlwKLSAgICAgICAgICAgICAiYWRkIk9QU0laRSIgJCJQVFJfU0laRSIqMSwgJTEgIFxuXHQiXAorICAgICAgICAgICAgICJhZGQiRkZfT1BTSVpFIiAkIkZGX1BUUl9TSVpFIioxLCAlMSBcblx0IlwKICAgICAgICAgICAgICBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfY29tbW9uMVwKICAgICAgICAgICAgICAiZGVjICUyICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAgICAgIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2VuZF9jb21tb24yCkBAIC02OTYsMjggKzY5NiwyOCBAQAogc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfYWNjdW1fOCgiMSIsICIxMjgiKQogc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfYWNjdW1fOCgiMCIsICIxMzYiKQogCi0gICAgICAgICAgICAgIm1vdiAlMCwgJSUiUkVHX2QiICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICJtb3ZkcWEgKCUlIlJFR19EIiksICUleG1tMCAgICAgXG5cdCIKKyAgICAgICAgICAgICAibW92ICUwLCAlJSJGRl9SRUdfZCIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdmRxYSAoJSUiRkZfUkVHX0QiKSwgJSV4bW0wICBcblx0IgogICAgICAgICAgICAgICJtb3ZkcWEgJSV4bW0xLCAlJXhtbTIgICAgICAgICAgXG5cdCIKIAogICAgICAgICAgICAgICJwdW5wY2tod2QgJSV4bW03LCAlJXhtbTEgICAgICAgXG5cdCIKICAgICAgICAgICAgICAicHVucGNrbHdkICUleG1tNywgJSV4bW0yICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgInBhZGRkICUleG1tMiwgJSV4bW0wICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICJtb3ZkcWEgMTYoJSUiUkVHX0QiKSwgJSV4bW0yICAgXG5cdCIKKyAgICAgICAgICAgICAibW92ZHFhIDE2KCUlIkZGX1JFR19EIiksICUleG1tMlxuXHQiCiAgICAgICAgICAgICAgInBhZGRkICUleG1tMSwgJSV4bW0yICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICJwYWRkZCAlJXhtbTMsICUleG1tMCAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAicGFkZGQgJSV4bW0zLCAlJXhtbTIgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgICAgICAibW92ICUxLCAlJSJSRUdfRCIgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgIm1vdiAiUFRSX1NJWkUiKCUlIlJFR19EIiksICUlIlJFR19EIjtcblx0IgotICAgICAgICAgICAgICJhZGQgJTMsICUlIlJFR19EIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibW92ICUxLCAlJSJGRl9SRUdfRCIgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdiAiRkZfUFRSX1NJWkUiKCUlIkZGX1JFR19EIiksICUlIkZGX1JFR19EIjsgXG5cdCIKKyAgICAgICAgICAgICAiYWRkICUzLCAlJSJGRl9SRUdfRCIgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgICAgICAibW92ZHFhICglJSJSRUdfRCIpLCAlJXhtbTQgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdmRxYSAoJSUiRkZfUkVHX0QiKSwgJSV4bW00ICBcblx0IgogICAgICAgICAgICAgICJtb3ZkcWEgJSV4bW01LCAlJXhtbTYgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAicHVucGNraHdkICUleG1tNywgJSV4bW01ICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgInB1bnBja2x3ZCAlJXhtbTcsICUleG1tNiAgICAgICBcblx0IgogICAgICAgICAgICAgICJwYWRkZCAlJXhtbTYsICUleG1tNCAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAibW92ZHFhIDE2KCUlIlJFR19EIiksICUleG1tNiAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdmRxYSAxNiglJSJGRl9SRUdfRCIpLCAlJXhtbTZcblx0IgogICAgICAgICAgICAgICJwYWRkZCAlJXhtbTUsICUleG1tNiAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAicGFkZGQgJSV4bW0zLCAlJXhtbTQgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgInBhZGRkICUleG1tMywgJSV4bW02ICAgICAgICAgICBcblx0IgpAQCAtNzI2LDEzICs3MjYsMTMgQEAKICAgICAgICAgICAgICAicHNyYWQgJDgsICUleG1tMiAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUy4gKi8KICAgICAgICAgICAgICAicGFja3NzZHcgJSV4bW0yLCAlJXhtbTAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgInBhY2t1c3diICUleG1tNywgJSV4bW0wICAgICAgICBcblx0IgotICAgICAgICAgICAgICJtb3ZxICUleG1tMCwgKCUlIlJFR19kIikgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibW92cSAlJXhtbTAsICglJSJGRl9SRUdfZCIpICAgIFxuXHQiCiAKICAgICAgICAgICAgICAicHNyYWQgJDgsICUleG1tNCAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUy4gKi8KICAgICAgICAgICAgICAicHNyYWQgJDgsICUleG1tNiAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUy4gKi8KICAgICAgICAgICAgICAicGFja3NzZHcgJSV4bW02LCAlJXhtbTQgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgInBhY2t1c3diICUleG1tNywgJSV4bW00ICAgICAgICBcblx0IgotICAgICAgICAgICAgICJtb3ZxICUleG1tNCwgKCUlIlJFR19kIiwlJSJSRUdfYyIpO1xuXHQiCisgICAgICAgICAgICAgIm1vdnEgJSV4bW00LCAoJSUiRkZfUkVHX2QiLCUlIkZGX1JFR19jIik7IFxuXHQiCiBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfOAogfQogCkBAIC03NDQsMTggKzc0NCwxOCBAQAogc25vd19pbm5lcl9hZGRfeWJsb2NrX3NzZTJfYWNjdW1fMTYoIjEiLCAiNTEyIikKIHNub3dfaW5uZXJfYWRkX3libG9ja19zc2UyX2FjY3VtXzE2KCIwIiwgIjUyOCIpCiAKLSAgICAgICAgICAgICAibW92ICUwLCAlJSJSRUdfZCIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdiAlMCwgJSUiRkZfUkVHX2QiICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICJwc3JsdyAkNCwgJSV4bW0xICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAicHNybHcgJDQsICUleG1tNSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgInBhZGR3ICAgKCUlIlJFR19EIiksICUleG1tMSAgICBcblx0IgotICAgICAgICAgICAgICJwYWRkdyAxNiglJSJSRUdfRCIpLCAlJXhtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICAicGFkZHcgICAoJSUiRkZfUkVHX0QiKSwgJSV4bW0xIFxuXHQiCisgICAgICAgICAgICAgInBhZGR3IDE2KCUlIkZGX1JFR19EIiksICUleG1tNSBcblx0IgogICAgICAgICAgICAgICJwYWRkdyAlJXhtbTMsICUleG1tMSAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAicGFkZHcgJSV4bW0zLCAlJXhtbTUgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgInBzcmF3ICQ0LCAlJXhtbTEgICAgICAgICAgICAgICBcblx0IiAvKiBGUkFDX0JJVFMuICovCiAgICAgICAgICAgICAgInBzcmF3ICQ0LCAlJXhtbTUgICAgICAgICAgICAgICBcblx0IiAvKiBGUkFDX0JJVFMuICovCiAgICAgICAgICAgICAgInBhY2t1c3diICUleG1tNSwgJSV4bW0xICAgICAgICBcblx0IgogCi0gICAgICAgICAgICAgIm1vdmRxdSAlJXhtbTEsICglJSJSRUdfZCIpICAgICAgIFxuXHQiCisgICAgICAgICAgICAgIm1vdmRxdSAlJXhtbTEsICglJSJGRl9SRUdfZCIpICBcblx0IgogCiBzbm93X2lubmVyX2FkZF95YmxvY2tfc3NlMl9lbmRfMTYKIH0KQEAgLTc2NCwzMCArNzY0LDMwIEBACiAgICAgSURXVEVMRU0gKiAqIGRzdF9hcnJheSA9IHNiLT5saW5lICsgc3JjX3k7XAogICAgIHg4Nl9yZWcgdG1wO1wKICAgICBfX2FzbV9fIHZvbGF0aWxlKFwKLSAgICAgICAgICAgICAibW92ICAlNywgJSUiUkVHX2MiICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJtb3YgICU3LCAlJSJGRl9SRUdfYyIgICAgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgIm1vdiAgJTYsICUyICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgICAgICAibW92ICAlNCwgJSUiUkVHX1MiICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJtb3YgICU0LCAlJSJGRl9SRUdfUyIgICAgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICBcblx0IiAvKiAwICovXAogICAgICAgICAgICAgICJwY21wZXFkICUlbW0zLCAlJW1tMyAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgInBzbGx3ICQxNSwgJSVtbTMgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgICAgICAicHNybHcgJDEyLCAlJW1tMyAgICAgICAgICAgICAgIFxuXHQiIC8qIEZSQUNfQklUUyA+PiAxICovXAogICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICAgICAgIm1vdiAlMSwgJSUiUkVHX0QiICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgICAgICAibW92ICglJSJSRUdfRCIpLCAlJSJSRUdfRCIgICAgIFxuXHQiXAotICAgICAgICAgICAgICJhZGQgJTMsICUlIlJFR19EIiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAibW92ICUxLCAlJSJGRl9SRUdfRCIgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJtb3YgKCUlIkZGX1JFR19EIiksICUlIkZGX1JFR19EIiBcblx0IlwKKyAgICAgICAgICAgICAiYWRkICUzLCAlJSJGRl9SRUdfRCIgICAgICAgICAgIFxuXHQiCiAKICNkZWZpbmUgc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9zdGFydChvdXRfcmVnMSwgb3V0X3JlZzIsIHB0cl9vZmZzZXQsIHNfb2Zmc2V0LCBkX29mZnNldClcCi0gICAgICAgICAgICAgIm1vdiAiUFRSX1NJWkUiKiJwdHJfb2Zmc2V0IiglJSJSRUdfYSIpLCAlJSJSRUdfZCI7IFxuXHQiXAotICAgICAgICAgICAgICJtb3ZkICJkX29mZnNldCIoJSUiUkVHX2QiKSwgJSUib3V0X3JlZzEiIFxuXHQiXAotICAgICAgICAgICAgICJtb3ZkICJkX29mZnNldCIrNCglJSJSRUdfZCIpLCAlJSJvdXRfcmVnMiIgXG5cdCJcCisgICAgICAgICAgICAgIm1vdiAiRkZfUFRSX1NJWkUiKiJwdHJfb2Zmc2V0IiglJSJGRl9SRUdfYSIpLCAlJSJGRl9SRUdfZCI7IFxuXHQiXAorICAgICAgICAgICAgICJtb3ZkICJkX29mZnNldCIoJSUiRkZfUkVHX2QiKSwgJSUib3V0X3JlZzEiICAgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAibW92ZCAiZF9vZmZzZXQiKzQoJSUiRkZfUkVHX2QiKSwgJSUib3V0X3JlZzIiICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSUib3V0X3JlZzEiIFxuXHQiXAogICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlIm91dF9yZWcyIiBcblx0IlwKLSAgICAgICAgICAgICAibW92ZCAic19vZmZzZXQiKCUlIlJFR19TIiksICUlbW0wIFxuXHQiXAotICAgICAgICAgICAgICJtb3ZkICJzX29mZnNldCIrNCglJSJSRUdfUyIpLCAlJW1tNCBcblx0IlwKKyAgICAgICAgICAgICAibW92ZCAic19vZmZzZXQiKCUlIkZGX1JFR19TIiksICUlbW0wICAgXG5cdCJcCisgICAgICAgICAgICAgIm1vdmQgInNfb2Zmc2V0Iis0KCUlIkZGX1JFR19TIiksICUlbW00IFxuXHQiXAogICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW00ICAgICAgIFxuXHQiXAotICAgICAgICAgICAgICJwbXVsbHcgJSVtbTAsICUlIm91dF9yZWcxIiAgICBcblx0IlwKLSAgICAgICAgICAgICAicG11bGx3ICUlbW00LCAlJSJvdXRfcmVnMiIgICAgXG5cdCIKKyAgICAgICAgICAgICAicG11bGx3ICUlbW0wLCAlJSJvdXRfcmVnMSIgICBcblx0IlwKKyAgICAgICAgICAgICAicG11bGx3ICUlbW00LCAlJSJvdXRfcmVnMiIgICBcblx0IgogCiAjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19tbXhfYWNjdW0ocHRyX29mZnNldCwgc19vZmZzZXQsIGRfb2Zmc2V0KSBcCiAgICAgICAgICAgICAgc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9zdGFydCgibW0yIiwgIm1tNiIsIHB0cl9vZmZzZXQsIHNfb2Zmc2V0LCBkX29mZnNldClcCkBAIC03OTUsMzIgKzc5NSwzMiBAQAogICAgICAgICAgICAgICJwYWRkdXN3ICUlbW02LCAlJW1tNSAgICAgICAgIFxuXHQiCiAKICNkZWZpbmUgc25vd19pbm5lcl9hZGRfeWJsb2NrX21teF9taXgocmVhZF9vZmZzZXQsIHdyaXRlX29mZnNldClcCi0gICAgICAgICAgICAgIm1vdiAlMCwgJSUiUkVHX2QiICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAibW92ICUwLCAlJSJGRl9SRUdfZCIgICAgICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJwc3JsdyAkNCwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgInBzcmx3ICQ0LCAlJW1tNSAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgICAgICAicGFkZHcgInJlYWRfb2Zmc2V0IiglJSJSRUdfRCIpLCAlJW1tMSBcblx0IlwKLSAgICAgICAgICAgICAicGFkZHcgInJlYWRfb2Zmc2V0Iis4KCUlIlJFR19EIiksICUlbW01IFxuXHQiXAorICAgICAgICAgICAgICJwYWRkdyAicmVhZF9vZmZzZXQiKCUlIkZGX1JFR19EIiksICUlbW0xICAgXG5cdCJcCisgICAgICAgICAgICAgInBhZGR3ICJyZWFkX29mZnNldCIrOCglJSJGRl9SRUdfRCIpLCAlJW1tNSBcblx0IlwKICAgICAgICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0xICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJwYWRkdyAlJW1tMywgJSVtbTUgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgInBzcmF3ICQ0LCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgICAgICAicHNyYXcgJDQsICUlbW01ICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJwYWNrdXN3YiAlJW1tNSwgJSVtbTEgICAgICAgICAgXG5cdCJcCi0gICAgICAgICAgICAgIm1vdnEgJSVtbTEsICJ3cml0ZV9vZmZzZXQiKCUlIlJFR19kIikgXG5cdCIKKyAgICAgICAgICAgICAibW92cSAlJW1tMSwgIndyaXRlX29mZnNldCIoJSUiRkZfUkVHX2QiKSBcblx0IgogCiAjZGVmaW5lIHNub3dfaW5uZXJfYWRkX3libG9ja19tbXhfZW5kKHNfc3RlcClcCi0gICAgICAgICAgICAgImFkZCAkInNfc3RlcCIsICUlIlJFR19TIiAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgICAgICAiYWRkICUlIlJFR19jIiwgIlBUUl9TSVpFIiozKCUlIlJFR19hIik7XG5cdCJcCi0gICAgICAgICAgICAgImFkZCAlJSJSRUdfYyIsICJQVFJfU0laRSIqMiglJSJSRUdfYSIpO1xuXHQiXAotICAgICAgICAgICAgICJhZGQgJSUiUkVHX2MiLCAiUFRSX1NJWkUiKjEoJSUiUkVHX2EiKTtcblx0IlwKLSAgICAgICAgICAgICAiYWRkICUlIlJFR19jIiwgKCUlIlJFR19hIikgICAgIFxuXHQiXAotICAgICAgICAgICAgICJhZGQiT1BTSVpFICIgJCJQVFJfU0laRSIqMSwgJTEgXG5cdCJcCi0gICAgICAgICAgICAgImFkZCAlJSJSRUdfYyIsICUwICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAiYWRkICQic19zdGVwIiwgJSUiRkZfUkVHX1MiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJSUiRkZfUkVHX2MiLCAiRkZfUFRSX1NJWkUiKjMoJSUiRkZfUkVHX2EiKTsgXG5cdCJcCisgICAgICAgICAgICAgImFkZCAlJSJGRl9SRUdfYyIsICJGRl9QVFJfU0laRSIqMiglJSJGRl9SRUdfYSIpOyBcblx0IlwKKyAgICAgICAgICAgICAiYWRkICUlIkZGX1JFR19jIiwgIkZGX1BUUl9TSVpFIioxKCUlIkZGX1JFR19hIik7IFxuXHQiXAorICAgICAgICAgICAgICJhZGQgJSUiRkZfUkVHX2MiLCAoJSUiRkZfUkVHX2EiKSAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICAgICAgImFkZCJGRl9PUFNJWkUgIiAkIkZGX1BUUl9TSVpFIioxLCAlMSAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgICAgICAiYWRkICUlIkZGX1JFR19jIiwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAgICAgICJkZWMgJTIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICAgICAgImpueiAxYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgICAgICA6IittIihkc3Q4KSwiK20iKGRzdF9hcnJheSksIj0mciIodG1wKVwKICAgICAgICAgICAgICA6XAogICAgICAgICAgICAgICJybSIoKHg4Nl9yZWcpKHNyY194PDwxKSksIm0iKG9ibWMpLCJhIihibG9jayksIm0iKGJfaCksIm0iKHNyY19zdHJpZGUpOlwKLSAgICAgICAgICAgICAiJSJSRUdfYyIiLCIlIlJFR19TIiIsIiUiUkVHX0QiIiwiJSJSRUdfZCIiKTsKKyAgICAgICAgICAgICAiJSJGRl9SRUdfYyIiLCIlIkZGX1JFR19TIiIsIiUiRkZfUkVHX0QiIiwiJSJGRl9SRUdfZCIiKTsKIAogc3RhdGljIHZvaWQgaW5uZXJfYWRkX3libG9ja19id184X29ibWNfMTZfbW14KGNvbnN0IHVpbnQ4X3QgKm9ibWMsIGNvbnN0IHg4Nl9yZWcgb2JtY19zdHJpZGUsIHVpbnQ4X3QgKiAqIGJsb2NrLCBpbnQgYl93LCB4ODZfcmVnIGJfaCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3gsIGludCBzcmNfeSwgeDg2X3JlZyBzcmNfc3RyaWRlLCBzbGljZV9idWZmZXIgKiBzYiwgaW50IGFkZCwgdWludDhfdCAqIGRzdDgpewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvc3ludGhfZmlsdGVyX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L3N5bnRoX2ZpbHRlcl9pbml0LmMKaW5kZXggOWVmMDBjZC4uMzVlMmI0NyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvc3ludGhfZmlsdGVyX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni9zeW50aF9maWx0ZXJfaW5pdC5jCkBAIC00MiwxOCArNDIsMTggQEAKICAgICAqc3ludGhfYnVmX29mZnNldCA9ICgqc3ludGhfYnVmX29mZnNldCAtIDMyKSAmIDUxMTsgICAgICAgICAgICAgICAgICAgICAgICBcCiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICNpZiBBUkNIX1g4Nl8zMgogU1lOVEhfRklMVEVSX0ZVTkMoc3NlKQogI2VuZGlmCiBTWU5USF9GSUxURVJfRlVOQyhzc2UyKQogU1lOVEhfRklMVEVSX0ZVTkMoYXZ4KQogU1lOVEhfRklMVEVSX0ZVTkMoZm1hMykKLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogCiBhdl9jb2xkIHZvaWQgZmZfc3ludGhfZmlsdGVyX2luaXRfeDg2KFN5bnRoRmlsdGVyQ29udGV4dCAqcykKIHsKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKICNpZiBBUkNIX1g4Nl8zMgpAQCAtNzAsNSArNzAsNSBAQAogICAgIGlmIChFWFRFUk5BTF9GTUEzX0ZBU1QoY3B1X2ZsYWdzKSkgewogICAgICAgICBzLT5zeW50aF9maWx0ZXJfZmxvYXQgPSBzeW50aF9maWx0ZXJfZm1hMzsKICAgICB9Ci0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3Rha2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni90YWtkc3BfaW5pdC5jCmluZGV4IDU1NWQwNjQuLmZlMGM4NDYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3Rha2RzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvdGFrZHNwX2luaXQuYwpAQCAtMjksNyArMjksNyBAQAogCiBhdl9jb2xkIHZvaWQgZmZfdGFrZHNwX2luaXRfeDg2KFRBS0RTUENvbnRleHQgKmMpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdHRhZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L3R0YWRzcC5hc20KaW5kZXggOGY0ODk0OS4uZGIxMmEzMiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdHRhZHNwLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni90dGFkc3AuYXNtCkBAIC0zMSw3ICszMSw3IEBACiAKICVtYWNybyBUVEFfRklMVEVSIDIKIElOSVRfWE1NICUxCi1jZ2xvYmFsIHR0YWZpbHRlcl9wcm9jZXNzX2RlYywgNSw1LCUyLCBxbSwgZHgsIGRsLCBlcnJvciwgaW4sIHNoaWZ0LCByb3VuZAorY2dsb2JhbCB0dGFfZmlsdGVyX3Byb2Nlc3MsIDUsNSwlMiwgcW0sIGR4LCBkbCwgZXJyb3IsIGluLCBzaGlmdCwgcm91bmQKICAgICBtb3ZhICAgICAgIG0yLCBbcW1xICAgICAgIF0KICAgICBtb3ZhICAgICAgIG0zLCBbcW1xICsgMHgxMF0KICAgICBtb3ZhICAgICAgIG00LCBbZHhxICAgICAgIF0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3R0YWRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni90dGFkc3BfaW5pdC5jCmluZGV4IDQ3ZGM4N2YuLjc0NDFjOTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3R0YWRzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvdHRhZHNwX2luaXQuYwpAQCAtMjIsMjEgKzIyLDIxIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKICNpbmNsdWRlICJjb25maWcuaCIKIAotdm9pZCBmZl90dGFmaWx0ZXJfcHJvY2Vzc19kZWNfc3NzZTMoaW50MzJfdCAqcW0sIGludDMyX3QgKmR4LCBpbnQzMl90ICpkbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmVycm9yLCBpbnQzMl90ICppbiwgaW50MzJfdCBzaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpOwotdm9pZCBmZl90dGFmaWx0ZXJfcHJvY2Vzc19kZWNfc3NlNChpbnQzMl90ICpxbSwgaW50MzJfdCAqZHgsIGludDMyX3QgKmRsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICplcnJvciwgaW50MzJfdCAqaW4sIGludDMyX3Qgc2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpOwordm9pZCBmZl90dGFfZmlsdGVyX3Byb2Nlc3Nfc3NzZTMoaW50MzJfdCAqcW0sIGludDMyX3QgKmR4LCBpbnQzMl90ICpkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmVycm9yLCBpbnQzMl90ICppbiwgaW50MzJfdCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpOwordm9pZCBmZl90dGFfZmlsdGVyX3Byb2Nlc3Nfc3NlNChpbnQzMl90ICpxbSwgaW50MzJfdCAqZHgsIGludDMyX3QgKmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICplcnJvciwgaW50MzJfdCAqaW4sIGludDMyX3Qgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpOwogCiBhdl9jb2xkIHZvaWQgZmZfdHRhZHNwX2luaXRfeDg2KFRUQURTUENvbnRleHQgKmMpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpCi0gICAgICAgIGMtPnR0YWZpbHRlcl9wcm9jZXNzX2RlYyA9IGZmX3R0YWZpbHRlcl9wcm9jZXNzX2RlY19zc3NlMzsKKyAgICAgICAgYy0+ZmlsdGVyX3Byb2Nlc3MgPSBmZl90dGFfZmlsdGVyX3Byb2Nlc3Nfc3NzZTM7CiAgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkKLSAgICAgICAgYy0+dHRhZmlsdGVyX3Byb2Nlc3NfZGVjID0gZmZfdHRhZmlsdGVyX3Byb2Nlc3NfZGVjX3NzZTQ7CisgICAgICAgIGMtPmZpbHRlcl9wcm9jZXNzID0gZmZfdHRhX2ZpbHRlcl9wcm9jZXNzX3NzZTQ7CiAjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3R0YWVuY2RzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni90dGFlbmNkc3AuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Y2JkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni90dGFlbmNkc3AuYXNtCkBAIC0wLDAgKzEsMTE5IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBUVEEgRW5jb2RlciBEU1AgU0lNRCBvcHRpbWl6YXRpb25zCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDE0LTIwMTYgSmFtZXMgQWxtZXIKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitwZF9uMDExMzogZGQgfjAsIH4xLCB+MSwgfjMKK3BkXzEyMjQ6ICBkZCAxLCAyLCAyLCA0CisKK1NFQ1RJT04gLnRleHQKKworJW1hY3JvIFRUQUVOQ19GSUxURVIgMgorSU5JVF9YTU0gJTEKK2NnbG9iYWwgdHRhZW5jX2ZpbHRlcl9wcm9jZXNzLCA1LDUsJTIsIHFtLCBkeCwgZGwsIGVycm9yLCBpbiwgc2hpZnQsIHJvdW5kCisgICAgbW92YSAgICAgICBtMiwgW3FtcSAgICAgICBdCisgICAgbW92YSAgICAgICBtMywgW3FtcSArIDB4MTBdCisgICAgbW92YSAgICAgICBtNCwgW2R4cSAgICAgICBdCisgICAgbW92YSAgICAgICBtNSwgW2R4cSArIDB4MTBdCisKKyAgICBtb3ZkICAgICAgIG02LCBbZXJyb3JxXSAgICAgICAgIDsgaWYgKGZpbHRlci0+ZXJyb3IgPCAwKSB7CisgICAgU1BMQVREICAgICBtNiAgICAgICAgICAgICAgICAgICA7ICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKKyAgICBwc2lnbmQgICAgIG0wLCBtNCwgbTYgICAgICAgICAgIDsgICAgICAgICBmaWx0ZXItPnFtW2ldIC09IGZpbHRlci0+ZHhbaV07CisgICAgcHNpZ25kICAgICBtMSwgbTUsIG02ICAgICAgICAgICA7IH0gZWxzZSBpZiAoZmlsdGVyLT5lcnJvciA+IDApIHsKKyAgICBwYWRkZCAgICAgIG0yLCBtMCAgICAgICAgICAgICAgIDsgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQorICAgIHBhZGRkICAgICAgbTMsIG0xICAgICAgICAgICAgICAgOyAgICAgICAgIGZpbHRlci0+cW1baV0gKz0gZmlsdGVyLT5keFtpXTsKKyAgICBtb3ZhICAgICAgIFtxbXEgICAgICAgXSwgbTIgICAgIDsgfQorICAgIG1vdmEgICAgICAgW3FtcSArIDB4MTBdLCBtMyAgICAgOworCisgICAgbW92YSAgICAgICBtMCwgW2RscSAgICAgICBdCisgICAgbW92YSAgICAgICBtMSwgW2RscSArIDB4MTBdCisKKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgcG11bGxkICAgICBtMiwgbTAKKyAgICBwbXVsbGQgICAgIG0zLCBtMQorJWVsc2UKKyAgICBwc2h1ZmQgICAgIG02LCBtMCwgMHhiMQorICAgIHBzaHVmZCAgICAgbTcsIG0yLCAweGIxCisgICAgcG11bHVkcSAgICBtNiwgbTcKKyAgICBwc2h1ZmQgICAgIG02LCBtNiwgMHhkOAorICAgIHBtdWx1ZHEgICAgbTIsIG0wCisgICAgcHNodWZkICAgICBtMiwgbTIsIDB4ZDgKKyAgICBwdW5wY2tsZHEgIG0yLCBtNgorCisgICAgcHNodWZkICAgICBtNiwgbTEsIDB4YjEKKyAgICBwc2h1ZmQgICAgIG03LCBtMywgMHhiMQorICAgIHBtdWx1ZHEgICAgbTYsIG03CisgICAgcHNodWZkICAgICBtNiwgbTYsIDB4ZDgKKyAgICBwbXVsdWRxICAgIG0zLCBtMQorICAgIHBzaHVmZCAgICAgbTMsIG0zLCAweGQ4CisgICAgcHVucGNrbGRxICBtMywgbTYKKyVlbmRpZgorICAgIDsgVXNpbmcgaG9yaXpvbnRhbCBhZGQgKHBoYWRkZCkgc2VlbXMgdG8gYmUgc2xvd2VyIHRoYW4gc2h1ZmZsaW5nIHN0dWZmIGFyb3VuZAorICAgIHBhZGRkICAgICAgbTIsIG0zICAgICAgICAgICAgICAgOyBpbnQgc3VtID0gZmlsdGVyLT5yb3VuZCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICBmaWx0ZXItPmRsWzBdICogZmlsdGVyLT5xbVswXSArCisgICAgcHNodWZkICAgICBtMywgbTIsIDB4ZSAgICAgICAgICA7ICAgICAgICAgICBmaWx0ZXItPmRsWzFdICogZmlsdGVyLT5xbVsxXSArCisgICAgcGFkZGQgICAgICBtMiwgbTMgICAgICAgICAgICAgICA7ICAgICAgICAgICBmaWx0ZXItPmRsWzJdICogZmlsdGVyLT5xbVsyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICBmaWx0ZXItPmRsWzNdICogZmlsdGVyLT5xbVszXSArCisgICAgbW92ZCAgICAgICBtNiwgcm91bmRtICAgICAgICAgICA7ICAgICAgICAgICBmaWx0ZXItPmRsWzRdICogZmlsdGVyLT5xbVs0XSArCisgICAgcGFkZGQgICAgICBtNiwgbTIgICAgICAgICAgICAgICA7ICAgICAgICAgICBmaWx0ZXItPmRsWzVdICogZmlsdGVyLT5xbVs1XSArCisgICAgcHNodWZkICAgICBtMiwgbTIsIDB4MSAgICAgICAgICA7ICAgICAgICAgICBmaWx0ZXItPmRsWzZdICogZmlsdGVyLT5xbVs2XSArCisgICAgcGFkZGQgICAgICBtNiwgbTIgICAgICAgICAgICAgICA7ICAgICAgICAgICBmaWx0ZXItPmRsWzddICogZmlsdGVyLT5xbVs3XTsKKworICAgIHBhbGlnbnIgICAgbTUsIG00LCA0ICAgICAgICAgICAgOyBmaWx0ZXItPmR4WzBdID0gZmlsdGVyLT5keFsxXTsgZmlsdGVyLT5keFsxXSA9IGZpbHRlci0+ZHhbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGZpbHRlci0+ZHhbMl0gPSBmaWx0ZXItPmR4WzNdOyBmaWx0ZXItPmR4WzNdID0gZmlsdGVyLT5keFs0XTsKKworICAgIHBhbGlnbnIgICAgbTIsIG0xLCBtMCwgNCAgICAgICAgOyBmaWx0ZXItPmRsWzBdID0gZmlsdGVyLT5kbFsxXTsgZmlsdGVyLT5kbFsxXSA9IGZpbHRlci0+ZGxbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IGZpbHRlci0+ZGxbMl0gPSBmaWx0ZXItPmRsWzNdOyBmaWx0ZXItPmRsWzNdID0gZmlsdGVyLT5kbFs0XTsKKworICAgIHBzcmFkICAgICAgbTQsIG0xLCAzMCAgICAgICAgICAgOyBmaWx0ZXItPmR4WzRdID0gKChmaWx0ZXItPmRsWzRdID4+IDMwKSB8IDEpOworICAgIHBvciAgICAgICAgbTQsIFtwZF8xMjI0IF0gICAgICAgOyBmaWx0ZXItPmR4WzVdID0gKChmaWx0ZXItPmRsWzVdID4+IDMwKSB8IDIpICYgfjE7CisgICAgcGFuZCAgICAgICBtNCwgW3BkX24wMTEzXSAgICAgICA7IGZpbHRlci0+ZHhbNl0gPSAoKGZpbHRlci0+ZGxbNl0gPj4gMzApIHwgMikgJiB+MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZmlsdGVyLT5keFs3XSA9ICgoZmlsdGVyLT5kbFs3XSA+PiAzMCkgfCA0KSAmIH4zOworCisgICAgbW92YSAgICAgICBbZGxxICAgICAgIF0sIG0yCisgICAgbW92YSAgICAgICBbZHhxICAgICAgIF0sIG01CisgICAgbW92YSAgICAgICBbZHhxICsgMHgxMF0sIG00CisKKyAgICBtb3ZkICAgICAgIG0yLCBzaGlmdG0gICAgICAgICAgIDsKKyAgICBtb3ZkICAgICAgIG0wLCBbaW5xXSAgICAgICAgICAgIDsKKyAgICBwc3JhZCAgICAgIG02LCBtMiAgICAgICAgICAgICAgIDsKKyAgICBwc3ViZCAgICAgIG0zLCBtMCwgbTYgICAgICAgICAgIDsKKyAgICBtb3ZkICAgICAgIFtpbnFdLCBtMyAgICAgICAgICAgIDsgKmluIC09IChzdW0gPj4gZmlsdGVyLT5zaGlmdCk7CisgICAgbW92ZCAgICAgICBbZXJyb3JxXSwgbTMgICAgICAgICA7IGZpbHRlci0+ZXJyb3IgPSAqaW47CisKKyAgICBwc3JsZHEgICAgIG0xLCA0ICAgICAgICAgICAgICAgIDsKKyAgICBwc2xsZHEgICAgIG0wLCAxMiAgICAgICAgICAgICAgIDsgZmlsdGVyLT5kbFs0XSA9IC1maWx0ZXItPmRsWzVdOworICAgIHBzaHVmZCAgICAgbTAsIG0wLCAweGYwICAgICAgICAgOyBmaWx0ZXItPmRsWzVdID0gLWZpbHRlci0+ZGxbNl07CisgICAgcHN1YmQgICAgICBtMCwgbTEgICAgICAgICAgICAgICA7IGZpbHRlci0+ZGxbNl0gPSAqaW4gLSBmaWx0ZXItPmRsWzddOworICAgIHBzcmxkcSAgICAgbTEsIG0wLCA0ICAgICAgICAgICAgOyBmaWx0ZXItPmRsWzddID0gKmluOworICAgIHBzaHVmZCAgICAgbTEsIG0xLCAweGY0ICAgICAgICAgOyBmaWx0ZXItPmRsWzVdICs9IGZpbHRlci0+ZGxbNl07CisgICAgcGFkZGQgICAgICBtMCwgbTEgICAgICAgICAgICAgICA7IGZpbHRlci0+ZGxbNF0gKz0gZmlsdGVyLT5kbFs1XTsKKyAgICBwc3JsZHEgICAgIG0xLCA0ICAgICAgICAgICAgICAgIDsKKyAgICBwYWRkZCAgICAgIG0wLCBtMSAgICAgICAgICAgICAgIDsKKyAgICBtb3ZhICAgICAgIFtkbHEgKyAweDEwXSwgbTAgICAgIDsKKyAgICBSRVQKKyVlbmRtYWNybworCitUVEFFTkNfRklMVEVSIHNzc2UzLCA4CitUVEFFTkNfRklMVEVSIHNzZTQsICA3CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni90dGFlbmNkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvdHRhZW5jZHNwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk3MWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZjb2RlYy94ODYvdHRhZW5jZHNwX2luaXQuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTYgSmFtZXMgQWxtZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvdHRhZW5jZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKwordm9pZCBmZl90dGFlbmNfZmlsdGVyX3Byb2Nlc3Nfc3NzZTMoaW50MzJfdCAqcW0sIGludDMyX3QgKmR4LCBpbnQzMl90ICpkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmVycm9yLCBpbnQzMl90ICppbiwgaW50MzJfdCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpOwordm9pZCBmZl90dGFlbmNfZmlsdGVyX3Byb2Nlc3Nfc3NlNChpbnQzMl90ICpxbSwgaW50MzJfdCAqZHgsIGludDMyX3QgKmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICplcnJvciwgaW50MzJfdCAqaW4sIGludDMyX3Qgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm91bmQpOworCithdl9jb2xkIHZvaWQgZmZfdHRhZW5jZHNwX2luaXRfeDg2KFRUQUVuY0RTUENvbnRleHQgKmMpCit7CisjaWYgSEFWRV9YODZBU00KKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpCisgICAgICAgIGMtPmZpbHRlcl9wcm9jZXNzID0gZmZfdHRhZW5jX2ZpbHRlcl9wcm9jZXNzX3Nzc2UzOworICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykpCisgICAgICAgIGMtPmZpbHRlcl9wcm9jZXNzID0gZmZfdHRhZW5jX2ZpbHRlcl9wcm9jZXNzX3NzZTQ7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3V0dmlkZW9kc3AuYXNtIGIvbGliYXZjb2RlYy94ODYvdXR2aWRlb2RzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc5OWM0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L3V0dmlkZW9kc3AuYXNtCkBAIC0wLDAgKzEsMTM3IEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBTSU1ELW9wdGltaXplZCBVVFZpZGVvIGZ1bmN0aW9ucworOyogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorOyogQ29weXJpZ2h0IChjKSAyMDE3IEpva3lvIEltYWdlcworOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK2NleHRlcm4gcGJfODAKK2NleHRlcm4gcHdfNTEyCitjZXh0ZXJuIHB3XzEwMjMKKworU0VDVElPTiAudGV4dAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIHJlc3RvcmVfcmdiX3BsYW5lcyh1aW50OF90ICpzcmNfciwgdWludDhfdCAqc3JjX2csIHVpbnQ4X3QgKnNyY19iLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemVfciwgcHRyZGlmZl90IGxpbmVzaXplX2csIHB0cmRpZmZfdCBsaW5lc2l6ZV9iLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIFJFU1RPUkVfUkdCX1BMQU5FUyAwCitjZ2xvYmFsIHJlc3RvcmVfcmdiX3BsYW5lcywgNyArIEFSQ0hfWDg2XzY0LCA3ICsgQVJDSF9YODZfNjQgKiAyLCA0LCBzcmNfciwgc3JjX2csIHNyY19iLCBsaW5lc2l6ZV9yLCBsaW5lc2l6ZV9nLCBsaW5lc2l6ZV9iLCB3LCBoLCB4CisgICAgbW92c3hkaWZuaWRuIHdxLCB3ZAorICAgIGFkZCAgICAgIHNyY19ycSwgd3EKKyAgICBhZGQgICAgICBzcmNfZ3EsIHdxCisgICAgYWRkICAgICAgc3JjX2JxLCB3cQorICAgIG5lZyAgICAgICAgICB3cQorJWlmIEFSQ0hfWDg2XzY0ID09IDAKKyAgICBtb3YgICAgICAgICAgd20sIHdxCitERUZJTkVfQVJHUyBzcmNfciwgc3JjX2csIHNyY19iLCBsaW5lc2l6ZV9yLCBsaW5lc2l6ZV9nLCBsaW5lc2l6ZV9iLCB4CislZGVmaW5lIHdxIHI2bQorJWRlZmluZSBoZCByN21wCislZW5kaWYKKyAgICBtb3ZhICAgICAgICAgbTMsIFtwYl84MF0KKy5uZXh0cm93OgorICAgIG1vdiAgICAgICAgICB4cSwgd3EKKworICAgIC5sb29wOgorICAgICAgICBtb3ZhICAgICAgICAgICBtMCwgW3NyY19ycSArIHhxXQorICAgICAgICBtb3ZhICAgICAgICAgICBtMSwgW3NyY19ncSArIHhxXQorICAgICAgICBtb3ZhICAgICAgICAgICBtMiwgW3NyY19icSArIHhxXQorICAgICAgICBwc3ViYiAgICAgICAgICBtMSwgbTMKKyAgICAgICAgcGFkZGIgICAgICAgICAgbTAsIG0xCisgICAgICAgIHBhZGRiICAgICAgICAgIG0yLCBtMQorICAgICAgICBtb3ZhICBbc3JjX3JxK3hxXSwgbTAKKyAgICAgICAgbW92YSAgW3NyY19icSt4cV0sIG0yCisgICAgICAgIGFkZCAgICAgICAgICAgIHhxLCBtbXNpemUKKyAgICBqbCAubG9vcAorCisgICAgYWRkICAgICAgICBzcmNfcnEsIGxpbmVzaXplX3JxCisgICAgYWRkICAgICAgICBzcmNfZ3EsIGxpbmVzaXplX2dxCisgICAgYWRkICAgICAgICBzcmNfYnEsIGxpbmVzaXplX2JxCisgICAgc3ViICAgICAgICBoZCwgMQorICAgIGpnIC5uZXh0cm93CisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK1JFU1RPUkVfUkdCX1BMQU5FUworCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitSRVNUT1JFX1JHQl9QTEFORVMKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIHJlc3RvcmVfcmdiX3BsYW5lczEwKHVpbnQxNl90ICpzcmNfciwgdWludDE2X3QgKnNyY19nLCB1aW50MTZfdCAqc3JjX2IsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9yLCBwdHJkaWZmX3QgbGluZXNpemVfZywgcHRyZGlmZl90IGxpbmVzaXplX2IsCis7ICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCislbWFjcm8gUkVTVE9SRV9SR0JfUExBTkVTMTAgMAorY2dsb2JhbCByZXN0b3JlX3JnYl9wbGFuZXMxMCwgNyArIEFSQ0hfWDg2XzY0LCA3ICsgQVJDSF9YODZfNjQgKiAyLCA1LCBzcmNfciwgc3JjX2csIHNyY19iLCBsaW5lc2l6ZV9yLCBsaW5lc2l6ZV9nLCBsaW5lc2l6ZV9iLCB3LCBoLCB4CisgICAgc2hsICAgICAgICAgIHdkLCAxCisgICAgc2hsIGxpbmVzaXplX3JxLCAxCisgICAgc2hsIGxpbmVzaXplX2dxLCAxCisgICAgc2hsIGxpbmVzaXplX2JxLCAxCisgICAgYWRkICAgICAgc3JjX3JxLCB3cQorICAgIGFkZCAgICAgIHNyY19ncSwgd3EKKyAgICBhZGQgICAgICBzcmNfYnEsIHdxCisgICAgbW92YSAgICAgICAgIG0zLCBbcHdfNTEyXQorICAgIG1vdmEgICAgICAgICBtNCwgW3B3XzEwMjNdCisgICAgbmVnICAgICAgICAgIHdxCislaWYgQVJDSF9YODZfNjQgPT0gMAorICAgIG1vdiAgICAgICAgICB3bSwgd3EKK0RFRklORV9BUkdTIHNyY19yLCBzcmNfZywgc3JjX2IsIGxpbmVzaXplX3IsIGxpbmVzaXplX2csIGxpbmVzaXplX2IsIHgKKyVkZWZpbmUgd3EgcjZtCislZGVmaW5lIGhkIHI3bXAKKyVlbmRpZgorLm5leHRyb3c6CisgICAgbW92ICAgICAgICAgIHhxLCB3cQorCisgICAgLmxvb3A6CisgICAgICAgIG1vdmEgICAgICAgICAgIG0wLCBbc3JjX3JxICsgeHFdCisgICAgICAgIG1vdmEgICAgICAgICAgIG0xLCBbc3JjX2dxICsgeHFdCisgICAgICAgIG1vdmEgICAgICAgICAgIG0yLCBbc3JjX2JxICsgeHFdCisgICAgICAgIHBzdWJ3ICAgICAgICAgIG0xLCBtMworICAgICAgICBwYWRkdyAgICAgICAgICBtMCwgbTEKKyAgICAgICAgcGFkZHcgICAgICAgICAgbTIsIG0xCisgICAgICAgIHBhbmQgICAgICAgICAgIG0wLCBtNAorICAgICAgICBwYW5kICAgICAgICAgICBtMiwgbTQKKyAgICAgICAgbW92YSAgW3NyY19ycSt4cV0sIG0wCisgICAgICAgIG1vdmEgIFtzcmNfYnEreHFdLCBtMgorICAgICAgICBhZGQgICAgICAgICAgICB4cSwgbW1zaXplCisgICAgamwgLmxvb3AKKworICAgIGFkZCAgICAgICAgc3JjX3JxLCBsaW5lc2l6ZV9ycQorICAgIGFkZCAgICAgICAgc3JjX2dxLCBsaW5lc2l6ZV9ncQorICAgIGFkZCAgICAgICAgc3JjX2JxLCBsaW5lc2l6ZV9icQorICAgIHN1YiAgICAgICAgaGQsIDEKKyAgICBqZyAubmV4dHJvdworICAgIFJFUF9SRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitSRVNUT1JFX1JHQl9QTEFORVMxMAorCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitSRVNUT1JFX1JHQl9QTEFORVMxMAorJWVuZGlmCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni91dHZpZGVvZHNwX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L3V0dmlkZW9kc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNDM2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3g4Ni91dHZpZGVvZHNwX2luaXQuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdXR2aWRlb2RzcC5oIgorCit2b2lkIGZmX3Jlc3RvcmVfcmdiX3BsYW5lc19zc2UyKHVpbnQ4X3QgKnNyY19yLCB1aW50OF90ICpzcmNfZywgdWludDhfdCAqc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9yLCBwdHJkaWZmX3QgbGluZXNpemVfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplX2IsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Cit2b2lkIGZmX3Jlc3RvcmVfcmdiX3BsYW5lc19hdngyKHVpbnQ4X3QgKnNyY19yLCB1aW50OF90ICpzcmNfZywgdWludDhfdCAqc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9yLCBwdHJkaWZmX3QgbGluZXNpemVfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplX2IsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKK3ZvaWQgZmZfcmVzdG9yZV9yZ2JfcGxhbmVzMTBfc3NlMih1aW50MTZfdCAqc3JjX3IsIHVpbnQxNl90ICpzcmNfZywgdWludDE2X3QgKnNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9yLCBwdHJkaWZmX3QgbGluZXNpemVfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemVfYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK3ZvaWQgZmZfcmVzdG9yZV9yZ2JfcGxhbmVzMTBfYXZ4Mih1aW50MTZfdCAqc3JjX3IsIHVpbnQxNl90ICpzcmNfZywgdWludDE2X3QgKnNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZV9yLCBwdHJkaWZmX3QgbGluZXNpemVfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemVfYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworYXZfY29sZCB2b2lkIGZmX3V0dmlkZW9kc3BfaW5pdF94ODYoVVRWaWRlb0RTUENvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cmVzdG9yZV9yZ2JfcGxhbmVzICAgPSBmZl9yZXN0b3JlX3JnYl9wbGFuZXNfc3NlMjsKKyAgICAgICAgYy0+cmVzdG9yZV9yZ2JfcGxhbmVzMTAgPSBmZl9yZXN0b3JlX3JnYl9wbGFuZXMxMF9zc2UyOworICAgIH0KKyAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKKyAgICAgICAgYy0+cmVzdG9yZV9yZ2JfcGxhbmVzICAgPSBmZl9yZXN0b3JlX3JnYl9wbGFuZXNfYXZ4MjsKKyAgICAgICAgYy0+cmVzdG9yZV9yZ2JfcGxhbmVzMTAgPSBmZl9yZXN0b3JlX3JnYl9wbGFuZXMxMF9hdngyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3YyMTAtaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvdjIxMC1pbml0LmMKaW5kZXggZjU3OTMwNy4uZDY0ZGJjYSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdjIxMC1pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvdjIxMC1pbml0LmMKQEAgLTI3LDcgKzI3LDcgQEAKIAogYXZfY29sZCB2b2lkIGZmX3YyMTBfeDg2X2luaXQoVjIxMERlY0NvbnRleHQgKnMpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKHMtPmFsaWduZWRfaW5wdXQpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3YyMTBlbmMuYXNtIGIvbGliYXZjb2RlYy94ODYvdjIxMGVuYy5hc20KaW5kZXggMDU0NTQ1NC4uOTY1ZjJiZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdjIxMGVuYy5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvdjIxMGVuYy5hc20KQEAgLTkzLDggKzkzLDEwIEBACiAgICAgUkVUCiAlZW5kbWFjcm8KIAorJWlmIEhBVkVfU1NTRTNfRVhURVJOQUwKIElOSVRfWE1NIHNzc2UzCiB2MjEwX3BsYW5hcl9wYWNrXzEwCislZW5kaWYKIAogJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAogSU5JVF9ZTU0gYXZ4MgpAQCAtMTY3LDEwICsxNjksMTQgQEAKICAgICBSRVQKICVlbmRtYWNybwogCislaWYgSEFWRV9TU1NFM19FWFRFUk5BTAogSU5JVF9YTU0gc3NzZTMKIHYyMTBfcGxhbmFyX3BhY2tfOAorJWVuZGlmCislaWYgSEFWRV9BVlhfRVhURVJOQUwKIElOSVRfWE1NIGF2eAogdjIxMF9wbGFuYXJfcGFja184CislZW5kaWYKIAogJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAogSU5JVF9ZTU0gYXZ4MgpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdjIxMGVuY19pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni92MjEwZW5jX2luaXQuYwppbmRleCA4YWJiMTUyLi5lOTk3YjRiIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni92MjEwZW5jX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni92MjEwZW5jX2luaXQuYwpAQCAtNDUsOSArNDUsMTAgQEAKICAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpCiAgICAgICAgIHMtPnBhY2tfbGluZV84ID0gZmZfdjIxMF9wbGFuYXJfcGFja184X2F2eDsKIAotICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkgewotICAgICAgICBzLT5wYWNrX2xpbmVfOCA9IGZmX3YyMTBfcGxhbmFyX3BhY2tfOF9hdngyOwotICAgICAgICBzLT5wYWNrX2xpbmVfMTAgPSBmZl92MjEwX3BsYW5hcl9wYWNrXzEwX2F2eDI7Ci0gICAgICAgIHMtPnNhbXBsZV9mYWN0b3IgPSAyOworICAgIGlmIChFWFRFUk5BTF9BVlgyKGNwdV9mbGFncykpIHsKKyAgICAgICAgcy0+c2FtcGxlX2ZhY3Rvcl84ICA9IDI7CisgICAgICAgIHMtPnBhY2tfbGluZV84ICAgICAgPSBmZl92MjEwX3BsYW5hcl9wYWNrXzhfYXZ4MjsKKyAgICAgICAgcy0+c2FtcGxlX2ZhY3Rvcl8xMCA9IDI7CisgICAgICAgIHMtPnBhY2tfbGluZV8xMCAgICAgPSBmZl92MjEwX3BsYW5hcl9wYWNrXzEwX2F2eDI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdmMxZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L3ZjMWRzcC5hc20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTQyYzIuLjAwMDAwMDAKLS0tIGEvbGliYXZjb2RlYy94ODYvdmMxZHNwLmFzbQorKysgL2Rldi9udWxsCkBAIC0xLDU4NSArMCwwIEBACi07KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KiBWQzEgRFNQIG9wdGltaXphdGlvbnMKLTsqIENvcHlyaWdodCAoYykgMjAwNyBDaHJpc3RvcGhlIEdJU1FVRVQgPGNocmlzdG9waGUuZ2lzcXVldEBmcmVlLmZyPgotOyogQ29weXJpZ2h0IChjKSAyMDA5IERhdmlkIENvbnJhZAotOyoKLTsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLTsqCi07KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi07KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi07KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLTsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotOyoKLTsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLTsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi07KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotOyoKLTsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLTsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLTsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLTsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCi0KLWNleHRlcm4gcHdfNAotY2V4dGVybiBwd181Ci1jZXh0ZXJuIHB3XzkKLWNleHRlcm4gcHdfMTI4Ci0KLXNlY3Rpb24gLnRleHQKLQotOyBkc3RfbG93LCBkc3RfaGlnaCAoc3JjKSwgemVybwotOyB6ZXJvLWV4dGVuZHMgb25lIHZlY3RvciBmcm9tIDggdG8gMTYgYml0cwotJW1hY3JvIFVOUEFDS184VE8xNiA0Ci0gICAgbW92YSAgICAgIG0lMiwgbSUzCi0gICAgcHVucGNraCUxIG0lMywgbSU0Ci0gICAgcHVucGNrbCUxIG0lMiwgbSU0Ci0lZW5kbWFjcm8KLQotJW1hY3JvIFNUT1JFXzRfV09SRFMgNgotJWlmIGNwdWZsYWcoc3NlNCkKLSAgICBwZXh0cncgJTEsICU1LCAlNiswCi0gICAgcGV4dHJ3ICUyLCAlNSwgJTYrMQotICAgIHBleHRydyAlMywgJTUsICU2KzIKLSAgICBwZXh0cncgJTQsICU1LCAlNiszCi0lZWxzZQotICAgIG1vdmQgICU2ZCwgJTUKLSVpZiBtbXNpemU9PTE2Ci0gICAgcHNybGRxICU1LCA0Ci0lZWxzZQotICAgIHBzcmxxICAlNSwgMzIKLSVlbmRpZgotICAgIG1vdiAgICAlMSwgJTZ3Ci0gICAgc2hyICAgICU2LCAxNgotICAgIG1vdiAgICAlMiwgJTZ3Ci0gICAgbW92ZCAgJTZkLCAlNQotICAgIG1vdiAgICAlMywgJTZ3Ci0gICAgc2hyICAgICU2LCAxNgotICAgIG1vdiAgICAlNCwgJTZ3Ci0lZW5kaWYKLSVlbmRtYWNybwotCi07IGluOiAgcDEgcDAgcTAgcTEsIGNsb2JiZXJzIHAwCi07IG91dDogcDEgPSAoMioocDEgLSBxMSkgLSA1KihwMCAtIHEwKSArIDQpID4+IDMKLSVtYWNybyBWQzFfTE9PUF9GSUxURVJfQTAgNAotICAgIHBzdWJ3ICAlMSwgJTQKLSAgICBwc3VidyAgJTIsICUzCi0gICAgcGFkZHcgICUxLCAlMQotICAgIHBtdWxsdyAlMiwgW3B3XzVdCi0gICAgcHN1YncgICUxLCAlMgotICAgIHBhZGR3ICAlMSwgW3B3XzRdCi0gICAgcHNyYXcgICUxLCAzCi0lZW5kbWFjcm8KLQotOyBpbjogcDAgcTAgYTAgYTEgYTIKLTsgICAgIG0wIG0xIG03IG02IG01Ci07ICUxOiBzaXplCi07IG91dDogbTA9cDAnIG0xPXEwJwotJW1hY3JvIFZDMV9GSUxURVIgMQotICAgIFBBQlNXICAgbTQsIG03Ci0gICAgUEFCU1cgICBtMywgbTYKLSAgICBQQUJTVyAgIG0yLCBtNQotICAgIG1vdmEgICAgbTYsIG00Ci0gICAgcG1pbnN3ICBtMywgbTIKLSAgICBwY21wZ3R3IG02LCBtMyAgOyBpZiAoYTIgPCBhMCB8fCBhMSA8IGEwKQotICAgIHBzdWJ3ICAgbTMsIG00Ci0gICAgcG11bGx3ICBtMywgW3B3XzVdICAgOyA1KihhMyAtIGEwKQotICAgIFBBQlNXICAgbTIsIG0zCi0gICAgcHNyYXcgICBtMiwgMyAgIDsgYWJzKGQvOCkKLSAgICBweG9yICAgIG03LCBtMyAgOyBkX3NpZ24gXj0gYTBfc2lnbgotCi0gICAgcHhvciAgICBtNSwgbTUKLSAgICBtb3ZkICAgIG0zLCByMmQKLSVpZiAlMSA+IDQKLSAgICBwdW5wY2tsYncgbTMsIG0zCi0lZW5kaWYKLSAgICBwdW5wY2tsYncgbTMsIG01Ci0gICAgcGNtcGd0dyBtMywgbTQgIDsgaWYgKGEwIDwgcHEpCi0gICAgcGFuZCAgICBtNiwgbTMKLQotICAgIG1vdmEgICAgbTMsIG0wCi0gICAgcHN1YncgICBtMywgbTEKLSAgICBQQUJTVyAgIG00LCBtMwotICAgIHBzcmF3ICAgbTQsIDEKLSAgICBweG9yICAgIG0zLCBtNyAgOyBkX3NpZ24gXiBjbGlwX3NpZ24KLSAgICBwc3JhdyAgIG0zLCAxNQotICAgIHBtaW5zdyAgbTIsIG00ICA7IG1pbihkLCBjbGlwKQotICAgIHBjbXBndHcgbTQsIG01Ci0gICAgcGFuZCAgICBtNiwgbTQgIDsgZmlsdDMgKEMgcmV0dXJuIHZhbHVlKQotCi07IGVhY2ggc2V0IG9mIDQgcGl4ZWxzIGlzIG5vdCBmaWx0ZXJlZCBpZiB0aGUgM3JkIGlzIG5vdAotJWlmIG1tc2l6ZT09MTYKLSAgICBwc2h1Zmx3IG00LCBtNiwgMHhhYQotJWlmICUxID4gNAotICAgIHBzaHVmaHcgbTQsIG00LCAweGFhCi0lZW5kaWYKLSVlbHNlCi0gICAgcHNodWZ3ICBtNCwgbTYsIDB4YWEKLSVlbmRpZgotICAgIHBhbmRuICAgbTMsIG00Ci0gICAgcGFuZCAgICBtMiwgbTYKLSAgICBwYW5kICAgIG0zLCBtMiAgOyBkIGZpbmFsCi0KLSAgICBwc3JhdyAgIG03LCAxNQotICAgIHB4b3IgICAgbTMsIG03Ci0gICAgcHN1YncgICBtMywgbTcKLSAgICBwc3VidyAgIG0wLCBtMwotICAgIHBhZGR3ICAgbTEsIG0zCi0gICAgcGFja3Vzd2IgbTAsIG0wCi0gICAgcGFja3Vzd2IgbTEsIG0xCi0lZW5kbWFjcm8KLQotOyAxc3QgcGFyYW06IHNpemUgb2YgZmlsdGVyCi07IDJuZCBwYXJhbTogbW92IHN1ZmZpeCBlcXVpdmFsZW50IHRvIHRoZSBmaWx0ZXIgc2l6ZQotJW1hY3JvIFZDMV9WX0xPT1BfRklMVEVSIDIKLSAgICBweG9yICAgICAgbTUsIG01Ci0gICAgbW92JTIgICAgIG02LCBbcjRdCi0gICAgbW92JTIgICAgIG00LCBbcjQrcjFdCi0gICAgbW92JTIgICAgIG03LCBbcjQrMipyMV0KLSAgICBtb3YlMiAgICAgbTAsIFtyNCtyM10KLSAgICBwdW5wY2tsYncgbTYsIG01Ci0gICAgcHVucGNrbGJ3IG00LCBtNQotICAgIHB1bnBja2xidyBtNywgbTUKLSAgICBwdW5wY2tsYncgbTAsIG01Ci0KLSAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTYsIG00LCBtNywgbTAKLSAgICBtb3YlMiAgICAgbTEsIFtyMF0KLSAgICBtb3YlMiAgICAgbTIsIFtyMCtyMV0KLSAgICBwdW5wY2tsYncgbTEsIG01Ci0gICAgcHVucGNrbGJ3IG0yLCBtNQotICAgIG1vdmEgICAgICBtNCwgbTAKLSAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTcsIG00LCBtMSwgbTIKLSAgICBtb3YlMiAgICAgbTMsIFtyMCsyKnIxXQotICAgIG1vdiUyICAgICBtNCwgW3IwK3IzXQotICAgIHB1bnBja2xidyBtMywgbTUKLSAgICBwdW5wY2tsYncgbTQsIG01Ci0gICAgbW92YSAgICAgIG01LCBtMQotICAgIFZDMV9MT09QX0ZJTFRFUl9BMCBtNSwgbTIsIG0zLCBtNAotCi0gICAgVkMxX0ZJTFRFUiAlMQotICAgIG1vdiUyIFtyNCtyM10sIG0wCi0gICAgbW92JTIgW3IwXSwgICAgbTEKLSVlbmRtYWNybwotCi07IDFzdCBwYXJhbTogc2l6ZSBvZiBmaWx0ZXIKLTsgICAgIE5PVEU6IFVOUEFDS184VE8xNiB0aGlzIG51bWJlciBvZiA4IGJpdCBudW1iZXJzIGFyZSBpbiBoYWxmIGEgcmVnaXN0ZXIKLTsgMm5kIChvcHRpb25hbCkgcGFyYW06IHRlbXAgcmVnaXN0ZXIgdG8gdXNlIGZvciBzdG9yaW5nIHdvcmRzCi0lbWFjcm8gVkMxX0hfTE9PUF9GSUxURVIgMS0yCi0laWYgJTEgPT0gNAotICAgIG1vdnEgICAgICBtMCwgW3IwICAgICAtNF0KLSAgICBtb3ZxICAgICAgbTEsIFtyMCsgIHIxLTRdCi0gICAgbW92cSAgICAgIG0yLCBbcjArMipyMS00XQotICAgIG1vdnEgICAgICBtMywgW3IwKyAgcjMtNF0KLSAgICBUUkFOU1BPU0U0eDRCIDAsIDEsIDIsIDMsIDQKLSVlbHNlCi0gICAgbW92cSAgICAgIG0wLCBbcjAgICAgIC00XQotICAgIG1vdnEgICAgICBtNCwgW3IwKyAgcjEtNF0KLSAgICBtb3ZxICAgICAgbTEsIFtyMCsyKnIxLTRdCi0gICAgbW92cSAgICAgIG01LCBbcjArICByMy00XQotICAgIG1vdnEgICAgICBtMiwgW3I0ICAgICAtNF0KLSAgICBtb3ZxICAgICAgbTYsIFtyNCsgIHIxLTRdCi0gICAgbW92cSAgICAgIG0zLCBbcjQrMipyMS00XQotICAgIG1vdnEgICAgICBtNywgW3I0KyAgcjMtNF0KLSAgICBwdW5wY2tsYncgbTAsIG00Ci0gICAgcHVucGNrbGJ3IG0xLCBtNQotICAgIHB1bnBja2xidyBtMiwgbTYKLSAgICBwdW5wY2tsYncgbTMsIG03Ci0gICAgVFJBTlNQT1NFNHg0VyAwLCAxLCAyLCAzLCA0Ci0lZW5kaWYKLSAgICBweG9yICAgICAgbTUsIG01Ci0KLSAgICBVTlBBQ0tfOFRPMTYgYncsIDYsIDAsIDUKLSAgICBVTlBBQ0tfOFRPMTYgYncsIDcsIDEsIDUKLSAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTYsIG0wLCBtNywgbTEKLSAgICBVTlBBQ0tfOFRPMTYgYncsIDQsIDIsIDUKLSAgICBtb3ZhICAgIG0wLCBtMSAgICAgICAgICAgICAgICAgICAgICA7IG0wID0gcDAKLSAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTcsIG0xLCBtNCwgbTIKLSAgICBVTlBBQ0tfOFRPMTYgYncsIDEsIDMsIDUKLSAgICBtb3ZhICAgIG01LCBtNAotICAgIFZDMV9MT09QX0ZJTFRFUl9BMCBtNSwgbTIsIG0xLCBtMwotICAgIFNXQVAgMSwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTEgPSBxMAotCi0gICAgVkMxX0ZJTFRFUiAlMQotICAgIHB1bnBja2xidyBtMCwgbTEKLSVpZiAlMCA+IDEKLSAgICBTVE9SRV80X1dPUkRTIFtyMC0xXSwgW3IwK3IxLTFdLCBbcjArMipyMS0xXSwgW3IwK3IzLTFdLCBtMCwgJTIKLSVpZiAlMSA+IDQKLSAgICBwc3JsZHEgbTAsIDQKLSAgICBTVE9SRV80X1dPUkRTIFtyNC0xXSwgW3I0K3IxLTFdLCBbcjQrMipyMS0xXSwgW3I0K3IzLTFdLCBtMCwgJTIKLSVlbmRpZgotJWVsc2UKLSAgICBTVE9SRV80X1dPUkRTIFtyMC0xXSwgW3IwK3IxLTFdLCBbcjArMipyMS0xXSwgW3IwK3IzLTFdLCBtMCwgMAotICAgIFNUT1JFXzRfV09SRFMgW3I0LTFdLCBbcjQrcjEtMV0sIFtyNCsyKnIxLTFdLCBbcjQrcjMtMV0sIG0wLCA0Ci0lZW5kaWYKLSVlbmRtYWNybwotCi0KLSVtYWNybyBTVEFSVF9WX0ZJTFRFUiAwCi0gICAgbW92ICByNCwgcjAKLSAgICBsZWEgIHIzLCBbNCpyMV0KLSAgICBzdWIgIHI0LCByMwotICAgIGxlYSAgcjMsIFtyMSsyKnIxXQotICAgIGltdWwgcjIsIDB4MDEwMTAxMDEKLSVlbmRtYWNybwotCi0lbWFjcm8gU1RBUlRfSF9GSUxURVIgMQotICAgIGxlYSAgcjMsIFtyMSsyKnIxXQotJWlmICUxID4gNAotICAgIGxlYSAgcjQsIFtyMCs0KnIxXQotJWVuZGlmCi0gICAgaW11bCByMiwgMHgwMTAxMDEwMQotJWVuZG1hY3JvCi0KLSVtYWNybyBWQzFfTEYgMAotY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcl9pbnRlcm5hbAotICAgIFZDMV9WX0xPT1BfRklMVEVSIDQsIGQKLSAgICByZXQKLQotY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcl9pbnRlcm5hbAotICAgIFZDMV9IX0xPT1BfRklMVEVSIDQsIHI0Ci0gICAgcmV0Ci0KLTsgdm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjRfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQotY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcjQsIDMsNSwwCi0gICAgU1RBUlRfVl9GSUxURVIKLSAgICBjYWxsIHZjMV92X2xvb3BfZmlsdGVyX2ludGVybmFsCi0gICAgUkVUCi0KLTsgdm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjRfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQotY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcjQsIDMsNSwwCi0gICAgU1RBUlRfSF9GSUxURVIgNAotICAgIGNhbGwgdmMxX2hfbG9vcF9maWx0ZXJfaW50ZXJuYWwKLSAgICBSRVQKLQotOyB2b2lkIGZmX3ZjMV92X2xvb3BfZmlsdGVyOF9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCi1jZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDAKLSAgICBTVEFSVF9WX0ZJTFRFUgotICAgIGNhbGwgdmMxX3ZfbG9vcF9maWx0ZXJfaW50ZXJuYWwKLSAgICBhZGQgIHI0LCA0Ci0gICAgYWRkICByMCwgNAotICAgIGNhbGwgdmMxX3ZfbG9vcF9maWx0ZXJfaW50ZXJuYWwKLSAgICBSRVQKLQotOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCi1jZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyOCwgMyw1LDAKLSAgICBTVEFSVF9IX0ZJTFRFUiA0Ci0gICAgY2FsbCB2YzFfaF9sb29wX2ZpbHRlcl9pbnRlcm5hbAotICAgIGxlYSAgcjAsIFtyMCs0KnIxXQotICAgIGNhbGwgdmMxX2hfbG9vcF9maWx0ZXJfaW50ZXJuYWwKLSAgICBSRVQKLSVlbmRtYWNybwotCi1JTklUX01NWCBtbXhleHQKLVZDMV9MRgotCi1JTklUX1hNTSBzc2UyCi07IHZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXI4X3NzZTIodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCi1jZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDgKLSAgICBTVEFSVF9WX0ZJTFRFUgotICAgIFZDMV9WX0xPT1BfRklMVEVSIDgsIHEKLSAgICBSRVQKLQotOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc2UyKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQotY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcjgsIDMsNiw4Ci0gICAgU1RBUlRfSF9GSUxURVIgOAotICAgIFZDMV9IX0xPT1BfRklMVEVSIDgsIHI1Ci0gICAgUkVUCi0KLUlOSVRfTU1YIHNzc2UzCi07IHZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXI0X3Nzc2UzKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQotY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcjQsIDMsNSwwCi0gICAgU1RBUlRfVl9GSUxURVIKLSAgICBWQzFfVl9MT09QX0ZJTFRFUiA0LCBkCi0gICAgUkVUCi0KLTsgdm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjRfc3NzZTModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCi1jZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyNCwgMyw1LDAKLSAgICBTVEFSVF9IX0ZJTFRFUiA0Ci0gICAgVkMxX0hfTE9PUF9GSUxURVIgNCwgcjQKLSAgICBSRVQKLQotSU5JVF9YTU0gc3NzZTMKLTsgdm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjhfc3NzZTModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCi1jZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDgKLSAgICBTVEFSVF9WX0ZJTFRFUgotICAgIFZDMV9WX0xPT1BfRklMVEVSIDgsIHEKLSAgICBSRVQKLQotOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc3NlMyh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKLWNnbG9iYWwgdmMxX2hfbG9vcF9maWx0ZXI4LCAzLDYsOAotICAgIFNUQVJUX0hfRklMVEVSIDgKLSAgICBWQzFfSF9MT09QX0ZJTFRFUiA4LCByNQotICAgIFJFVAotCi1JTklUX1hNTSBzc2U0Ci07IHZvaWQgZmZfdmMxX2hfbG9vcF9maWx0ZXI4X3NzZTQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCi1jZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyOCwgMyw1LDgKLSAgICBTVEFSVF9IX0ZJTFRFUiA4Ci0gICAgVkMxX0hfTE9PUF9GSUxURVIgOAotICAgIFJFVAotCi0laWYgSEFWRV9NTVhfSU5MSU5FCi0KLTsgWFhYIHNvbWUgb2YgdGhlc2UgbWFjcm9zIGFyZSBub3QgdXNlZCByaWdodCBub3csIGJ1dCB0aGV5IHdpbGwgaW4gdGhlIGZ1dHVyZQotOyAgICAgd2hlbiBtb3JlIGZ1bmN0aW9ucyBhcmUgcG9ydGVkLgotCi0lbWFjcm8gT1BfUFVUIDIgOyBkc3QsIHNyYwotJWVuZG1hY3JvCi0KLSVtYWNybyBPUF9BVkcgMiA7IGRzdCwgc3JjCi0gICAgcGF2Z2IgICAgICAgICAgICUxLCAlMgotJWVuZG1hY3JvCi0KLSVtYWNybyBOT1JNQUxJWkVfTU1YIDEgOyBzaGlmdAotICAgIHBhZGR3ICAgICAgICAgICBtMywgbTcgOyArYmlhcy1yCi0gICAgcGFkZHcgICAgICAgICAgIG00LCBtNyA7ICtiaWFzLXIKLSAgICBwc3JhdyAgICAgICAgICAgbTMsICUxCi0gICAgcHNyYXcgICAgICAgICAgIG00LCAlMQotJWVuZG1hY3JvCi0KLSVtYWNybyBUUkFOU0ZFUl9ET19QQUNLIDIgOyBvcCwgZHN0Ci0gICAgcGFja3Vzd2IgICAgICAgIG0zLCBtNAotICAgICUxICAgICAgICAgICAgICBtMywgWyUyXQotICAgIG1vdmEgICAgICAgICAgWyUyXSwgbTMKLSVlbmRtYWNybwotCi0lbWFjcm8gVFJBTlNGRVJfRE9OVF9QQUNLIDIgOyBvcCwgZHN0Ci0gICAgJTEgICAgICAgICAgICAgIG0zLCBbJTJdCi0gICAgJTEgICAgICAgICAgICAgIG0zLCBbJTIgKyBtbXNpemVdCi0gICAgbW92YSAgICAgICAgICBbJTJdLCBtMwotICAgIG1vdmEgW21tc2l6ZSArICUyXSwgbTQKLSVlbmRtYWNybwotCi07IHNlZSBNU1BFTF9GSUxURVIxM19DT1JFIGZvciB1c2UgYXMgVU5QQUNLIG1hY3JvCi0lbWFjcm8gRE9fVU5QQUNLIDEgOyByZWcKLSAgICBwdW5wY2tsYncgICAgICAgJTEsIG0wCi0lZW5kbWFjcm8KLSVtYWNybyBET05UX1VOUEFDSyAxIDsgcmVnCi0lZW5kbWFjcm8KLQotOyBDb21wdXRlIHRoZSByb3VuZGVyIDMyLXIgb3IgOC1yIGFuZCB1bnBhY2tzIGl0IHRvIG03Ci0lbWFjcm8gTE9BRF9ST1VOREVSX01NWCAxIDsgcm91bmQKLSAgICBtb3ZkICAgICAgbTcsICUxCi0gICAgcHVucGNrbHdkIG03LCBtNwotICAgIHB1bnBja2xkcSBtNywgbTcKLSVlbmRtYWNybwotCi0lbWFjcm8gU0hJRlQyX0xJTkUgNSA7IG9mZiwgcjAsIHIxLCByMiwgcjMKLSAgICBwYWRkdyAgICAgICAgICBtJTMsIG0lNAotICAgIG1vdmggICAgICAgICAgIG0lMiwgW3NyY3EgKyBzdHJpZGVfbmVnMl0KLSAgICBwbXVsbHcgICAgICAgICBtJTMsIG02Ci0gICAgcHVucGNrbGJ3ICAgICAgbSUyLCBtMAotICAgIG1vdmggICAgICAgICAgIG0lNSwgW3NyY3EgKyBzdHJpZGVxXQotICAgIHBzdWJ3ICAgICAgICAgIG0lMywgbSUyCi0gICAgcHVucGNrbGJ3ICAgICAgbSU1LCBtMAotICAgIHBhZGR3ICAgICAgICAgIG0lMywgbTcKLSAgICBwc3VidyAgICAgICAgICBtJTMsIG0lNQotICAgIHBzcmF3ICAgICAgICAgIG0lMywgc2hpZnQKLSAgICBtb3Z1ICAgW2RzdHEgKyAlMV0sIG0lMwotICAgIGFkZCAgICAgICAgICAgc3JjcSwgc3RyaWRlcQotJWVuZG1hY3JvCi0KLUlOSVRfTU1YIG1teAotOyB2b2lkIGZmX3ZjMV9wdXRfdmVyXzE2Yl9zaGlmdDJfbW14KGludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9yZWcgc3RyaWRlLCBpbnQgcm5kLCBpbnQ2NF90IHNoaWZ0KQotOyBTYWNyaWZpY2luZyBtNiBtYWtlcyBpdCBwb3NzaWJsZSB0byBwaXBlbGluZSBsb2FkcyBmcm9tIHNyYwotJWlmIEFSQ0hfWDg2XzMyCi1jZ2xvYmFsIHZjMV9wdXRfdmVyXzE2Yl9zaGlmdDIsIDMsNiwwLCBkc3QsIHNyYywgc3RyaWRlCi0gICAgREVDTEFSRV9SRUdfVE1QICAgICAzLCA0LCA1Ci0gICAgJWRlZmluZSBybmQgcjNtcAotICAgICVkZWZpbmUgc2hpZnQgcXdvcmQgcjRtCi0lZWxzZSA7IFg4Nl82NAotY2dsb2JhbCB2YzFfcHV0X3Zlcl8xNmJfc2hpZnQyLCA0LDcsMCwgZHN0LCBzcmMsIHN0cmlkZQotICAgIERFQ0xBUkVfUkVHX1RNUCAgICAgNCwgNSwgNgotICAgICVkZWZpbmUgICBybmQgcjNkCi0gICAgOyBXZSBuZWVkIHNoaWZ0IGVpdGhlciBpbiBtZW1vcnkgb3IgaW4gYSBtbSByZWcgYXMgaXQncyB1c2VkIGluIHBzcmF3Ci0gICAgOyBPbiBXSU42NCwgdGhlIGFyZyBpcyBhbHJlYWR5IG9uIHRoZSBzdGFjawotICAgIDsgT24gVU5JWDY0LCBtNSBkb2Vzbid0IHNlZW0gdG8gYmUgdXNlZAotJWlmIFdJTjY0Ci0gICAgJWRlZmluZSBzaGlmdCByNG1wCi0lZWxzZSA7IFVOSVg2NAotICAgICVkZWZpbmUgc2hpZnQgbTUKLSAgICBtb3ZhIHNoaWZ0LCByNHEKLSVlbmRpZiA7IFdJTjY0Ci0lZW5kaWYgOyBYODZfMzIKLSVkZWZpbmUgc3RyaWRlX25lZzIgdDBxCi0lZGVmaW5lIHN0cmlkZV85bWludXM0IHQxcQotJWRlZmluZSBpIHQycQotICAgIG1vdiAgICAgICBzdHJpZGVfbmVnMiwgc3RyaWRlcQotICAgIG5lZyAgICAgICBzdHJpZGVfbmVnMgotICAgIGFkZCAgICAgICBzdHJpZGVfbmVnMiwgc3RyaWRlX25lZzIKLSAgICBsZWEgICAgc3RyaWRlXzltaW51czQsIFtzdHJpZGVxICogOSAtIDRdCi0gICAgbW92ICAgICAgICAgICAgICAgICBpLCAzCi0gICAgTE9BRF9ST1VOREVSX01NWCAgcm5kCi0gICAgbW92YSAgICAgICAgICAgICAgIG02LCBbcHdfOV0KLSAgICBweG9yICAgICAgICAgICAgICAgbTAsIG0wCi0ubG9vcDoKLSAgICBtb3ZoICAgICAgICAgICAgICAgbTIsIFtzcmNxXQotICAgIGFkZCAgICAgICAgICAgICAgc3JjcSwgc3RyaWRlcQotICAgIG1vdmggICAgICAgICAgICAgICBtMywgW3NyY3FdCi0gICAgcHVucGNrbGJ3ICAgICAgICAgIG0yLCBtMAotICAgIHB1bnBja2xidyAgICAgICAgICBtMywgbTAKLSAgICBTSElGVDJfTElORSAgICAgICAgIDAsIDEsIDIsIDMsIDQKLSAgICBTSElGVDJfTElORSAgICAgICAgMjQsIDIsIDMsIDQsIDEKLSAgICBTSElGVDJfTElORSAgICAgICAgNDgsIDMsIDQsIDEsIDIKLSAgICBTSElGVDJfTElORSAgICAgICAgNzIsIDQsIDEsIDIsIDMKLSAgICBTSElGVDJfTElORSAgICAgICAgOTYsIDEsIDIsIDMsIDQKLSAgICBTSElGVDJfTElORSAgICAgICAxMjAsIDIsIDMsIDQsIDEKLSAgICBTSElGVDJfTElORSAgICAgICAxNDQsIDMsIDQsIDEsIDIKLSAgICBTSElGVDJfTElORSAgICAgICAxNjgsIDQsIDEsIDIsIDMKLSAgICBzdWIgICAgICAgICAgICAgIHNyY3EsIHN0cmlkZV85bWludXM0Ci0gICAgYWRkICAgICAgICAgICAgICBkc3RxLCA4Ci0gICAgZGVjICAgICAgICAgICAgICAgICBpCi0gICAgICAgIGpueiAgICAgICAgIC5sb29wCi0gICAgUkVQX1JFVAotJXVuZGVmIHJuZAotJXVuZGVmIHNoaWZ0Ci0ldW5kZWYgc3RyaWRlX25lZzIKLSV1bmRlZiBzdHJpZGVfOW1pbnVzNAotJXVuZGVmIGkKLQotOyB2b2lkIGZmX3ZjMV8qX2hvcl8xNmJfc2hpZnQyX21teCh1aW50OF90ICpkc3QsIHg4Nl9yZWcgc3RyaWRlLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpzcmMsIGludCBybmQpOwotOyBEYXRhIGlzIGFscmVhZHkgdW5wYWNrZWQsIHNvIHNvbWUgb3BlcmF0aW9ucyBjYW4gZGlyZWN0bHkgYmUgbWFkZSBmcm9tCi07IG1lbW9yeS4KLSVtYWNybyBIT1JfMTZCX1NISUZUMiAyIDsgb3AsIG9wbmFtZQotY2dsb2JhbCB2YzFfJTJfaG9yXzE2Yl9zaGlmdDIsIDQsIDUsIDAsIGRzdCwgc3RyaWRlLCBzcmMsIHJuZCwgaAotICAgIG1vdiAgICAgICAgICAgICAgICBocSwgOAotICAgIHN1YiAgICAgICAgICAgICAgc3JjcSwgMgotICAgIHN1YiAgICAgICAgICAgICAgcm5kZCwgKC0xKzkrOS0xKSAqIDEwMjQgOyBhZGQgLTEwMjQgYmlhcwotICAgIExPQURfUk9VTkRFUl9NTVggcm5kcQotICAgIG1vdmEgICAgICAgICAgICAgICBtNSwgW3B3XzldCi0gICAgbW92YSAgICAgICAgICAgICAgIG02LCBbcHdfMTI4XQotICAgIHB4b3IgICAgICAgICAgICAgICBtMCwgbTAKLQotLmxvb3A6Ci0gICAgbW92YSAgICAgICAgICAgICAgIG0xLCBbc3JjcSArIDIgKiAwXQotICAgIG1vdmEgICAgICAgICAgICAgICBtMiwgW3NyY3EgKyAyICogMCArIG1tc2l6ZV0KLSAgICBtb3ZhICAgICAgICAgICAgICAgbTMsIFtzcmNxICsgMiAqIDFdCi0gICAgbW92YSAgICAgICAgICAgICAgIG00LCBbc3JjcSArIDIgKiAxICsgbW1zaXplXQotICAgIHBhZGR3ICAgICAgICAgICAgICBtMywgW3NyY3EgKyAyICogMl0KLSAgICBwYWRkdyAgICAgICAgICAgICAgbTQsIFtzcmNxICsgMiAqIDIgKyBtbXNpemVdCi0gICAgcGFkZHcgICAgICAgICAgICAgIG0xLCBbc3JjcSArIDIgKiAzXQotICAgIHBhZGR3ICAgICAgICAgICAgICBtMiwgW3NyY3EgKyAyICogMyArIG1tc2l6ZV0KLSAgICBwbXVsbHcgICAgICAgICAgICAgbTMsIG01Ci0gICAgcG11bGx3ICAgICAgICAgICAgIG00LCBtNQotICAgIHBzdWJ3ICAgICAgICAgICAgICBtMywgbTEKLSAgICBwc3VidyAgICAgICAgICAgICAgbTQsIG0yCi0gICAgTk9STUFMSVpFX01NWCAgICAgIDcKLSAgICA7IHJlbW92ZSBiaWFzCi0gICAgcGFkZHcgICAgICAgICAgICAgIG0zLCBtNgotICAgIHBhZGR3ICAgICAgICAgICAgICBtNCwgbTYKLSAgICBUUkFOU0ZFUl9ET19QQUNLICAgJTEsIGRzdHEKLSAgICBhZGQgICAgICAgICAgICAgIHNyY3EsIDI0Ci0gICAgYWRkICAgICAgICAgICAgICBkc3RxLCBzdHJpZGVxCi0gICAgZGVjICAgICAgICAgICAgICAgIGhxCi0gICAgICAgIGpueiAgICAgICAgIC5sb29wCi0KLSAgICBSRVQKLSVlbmRtYWNybwotCi1JTklUX01NWCBtbXgKLUhPUl8xNkJfU0hJRlQyIE9QX1BVVCwgcHV0Ci0KLUlOSVRfTU1YIG1teGV4dAotSE9SXzE2Ql9TSElGVDIgT1BfQVZHLCBhdmcKLSVlbmRpZiA7IEhBVkVfTU1YX0lOTElORQotCi0lbWFjcm8gSU5WX1RSQU5TX0lOSVQgMAotICAgIG1vdnN4ZGlmbmlkbiBsaW5lc2l6ZXEsIGxpbmVzaXplZAotICAgIG1vdmQgICAgICAgbTAsIGJsb2NrZAotICAgIFNQTEFUVyAgICAgbTAsIG0wCi0gICAgcHhvciAgICAgICBtMSwgbTEKLSAgICBwc3VidyAgICAgIG0xLCBtMAotICAgIHBhY2t1c3diICAgbTAsIG0wCi0gICAgcGFja3Vzd2IgICBtMSwgbTEKLQotICAgIERFRklORV9BUkdTIGRlc3QsIGxpbmVzaXplLCBsaW5lc2l6ZTMKLSAgICBsZWEgICAgbGluZXNpemUzcSwgW2xpbmVzaXplcSozXQotJWVuZG1hY3JvCi0KLSVtYWNybyBJTlZfVFJBTlNfUFJPQ0VTUyAxCi0gICAgbW92JTEgICAgICAgICAgICAgICAgICBtMiwgW2Rlc3RxK2xpbmVzaXplcSowXQotICAgIG1vdiUxICAgICAgICAgICAgICAgICAgbTMsIFtkZXN0cStsaW5lc2l6ZXEqMV0KLSAgICBtb3YlMSAgICAgICAgICAgICAgICAgIG00LCBbZGVzdHErbGluZXNpemVxKjJdCi0gICAgbW92JTEgICAgICAgICAgICAgICAgICBtNSwgW2Rlc3RxK2xpbmVzaXplM3FdCi0gICAgcGFkZHVzYiAgICAgICAgICAgICAgICBtMiwgbTAKLSAgICBwYWRkdXNiICAgICAgICAgICAgICAgIG0zLCBtMAotICAgIHBhZGR1c2IgICAgICAgICAgICAgICAgbTQsIG0wCi0gICAgcGFkZHVzYiAgICAgICAgICAgICAgICBtNSwgbTAKLSAgICBwc3VidXNiICAgICAgICAgICAgICAgIG0yLCBtMQotICAgIHBzdWJ1c2IgICAgICAgICAgICAgICAgbTMsIG0xCi0gICAgcHN1YnVzYiAgICAgICAgICAgICAgICBtNCwgbTEKLSAgICBwc3VidXNiICAgICAgICAgICAgICAgIG01LCBtMQotICAgIG1vdiUxIFtsaW5lc2l6ZXEqMCtkZXN0cV0sIG0yCi0gICAgbW92JTEgW2xpbmVzaXplcSoxK2Rlc3RxXSwgbTMKLSAgICBtb3YlMSBbbGluZXNpemVxKjIrZGVzdHFdLCBtNAotICAgIG1vdiUxIFtsaW5lc2l6ZTNxICtkZXN0cV0sIG01Ci0lZW5kbWFjcm8KLQotOyBmZl92YzFfaW52X3RyYW5zXz94P19kY19tbXhleHQodWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKLUlOSVRfTU1YIG1teGV4dAotY2dsb2JhbCB2YzFfaW52X3RyYW5zXzR4NF9kYywgMyw0LDAsIGRlc3QsIGxpbmVzaXplLCBibG9jawotICAgIG1vdnN4ICAgICAgICAgcjNkLCBXT1JEIFtibG9ja3FdCi0gICAgbW92ICAgICAgICBibG9ja2QsIHIzZCAgICAgICAgICAgICA7IGRjCi0gICAgc2hsICAgICAgICBibG9ja2QsIDQgICAgICAgICAgICAgICA7IDE2ICogZGMKLSAgICBsZWEgICAgICAgIGJsb2NrZCwgW2Jsb2NrcStyMys0XSAgIDsgMTcgKiBkYyArIDQKLSAgICBzYXIgICAgICAgIGJsb2NrZCwgMyAgICAgICAgICAgICAgIDsgPj4gMwotICAgIG1vdiAgICAgICAgICAgcjNkLCBibG9ja2QgICAgICAgICAgOyBkYwotICAgIHNobCAgICAgICAgYmxvY2tkLCA0ICAgICAgICAgICAgICAgOyAxNiAqIGRjCi0gICAgbGVhICAgICAgICBibG9ja2QsIFtibG9ja3ErcjMrNjRdICA7IDE3ICogZGMgKyA2NAotICAgIHNhciAgICAgICAgYmxvY2tkLCA3ICAgICAgICAgICAgICAgOyA+PiA3Ci0KLSAgICBJTlZfVFJBTlNfSU5JVAotCi0gICAgSU5WX1RSQU5TX1BST0NFU1MgaAotICAgIFJFVAotCi1JTklUX01NWCBtbXhleHQKLWNnbG9iYWwgdmMxX2ludl90cmFuc180eDhfZGMsIDMsNCwwLCBkZXN0LCBsaW5lc2l6ZSwgYmxvY2sKLSAgICBtb3ZzeCAgICAgICAgIHIzZCwgV09SRCBbYmxvY2txXQotICAgIG1vdiAgICAgICAgYmxvY2tkLCByM2QgICAgICAgICAgICAgOyBkYwotICAgIHNobCAgICAgICAgYmxvY2tkLCA0ICAgICAgICAgICAgICAgOyAxNiAqIGRjCi0gICAgbGVhICAgICAgICBibG9ja2QsIFtibG9ja3ErcjMrNF0gICA7IDE3ICogZGMgKyA0Ci0gICAgc2FyICAgICAgICBibG9ja2QsIDMgICAgICAgICAgICAgICA7ID4+IDMKLSAgICBzaGwgICAgICAgIGJsb2NrZCwgMiAgICAgICAgICAgICAgIDsgIDQgKiBkYwotICAgIGxlYSAgICAgICAgYmxvY2tkLCBbYmxvY2txKjMrNjRdICAgOyAxMiAqIGRjICsgNjQKLSAgICBzYXIgICAgICAgIGJsb2NrZCwgNyAgICAgICAgICAgICAgIDsgPj4gNwotCi0gICAgSU5WX1RSQU5TX0lOSVQKLQotICAgIElOVl9UUkFOU19QUk9DRVNTIGgKLSAgICBsZWEgICAgICAgICBkZXN0cSwgW2Rlc3RxK2xpbmVzaXplcSo0XQotICAgIElOVl9UUkFOU19QUk9DRVNTIGgKLSAgICBSRVQKLQotSU5JVF9NTVggbW14ZXh0Ci1jZ2xvYmFsIHZjMV9pbnZfdHJhbnNfOHg0X2RjLCAzLDQsMCwgZGVzdCwgbGluZXNpemUsIGJsb2NrCi0gICAgbW92c3ggICAgICBibG9ja2QsIFdPUkQgW2Jsb2NrcV0gICA7IGRjCi0gICAgbGVhICAgICAgICBibG9ja2QsIFtibG9ja3EqMysxXSAgICA7ICAzICogZGMgKyAxCi0gICAgc2FyICAgICAgICBibG9ja2QsIDEgICAgICAgICAgICAgICA7ID4+IDEKLSAgICBtb3YgICAgICAgICAgIHIzZCwgYmxvY2tkICAgICAgICAgIDsgZGMKLSAgICBzaGwgICAgICAgIGJsb2NrZCwgNCAgICAgICAgICAgICAgIDsgMTYgKiBkYwotICAgIGxlYSAgICAgICAgYmxvY2tkLCBbYmxvY2txK3IzKzY0XSAgOyAxNyAqIGRjICsgNjQKLSAgICBzYXIgICAgICAgIGJsb2NrZCwgNyAgICAgICAgICAgICAgIDsgPj4gNwotCi0gICAgSU5WX1RSQU5TX0lOSVQKLQotICAgIElOVl9UUkFOU19QUk9DRVNTIGEKLSAgICBSRVQKLQotSU5JVF9NTVggbW14ZXh0Ci1jZ2xvYmFsIHZjMV9pbnZfdHJhbnNfOHg4X2RjLCAzLDMsMCwgZGVzdCwgbGluZXNpemUsIGJsb2NrCi0gICAgbW92c3ggICAgICBibG9ja2QsIFdPUkQgW2Jsb2NrcV0gICA7IGRjCi0gICAgbGVhICAgICAgICBibG9ja2QsIFtibG9ja3EqMysxXSAgICA7ICAzICogZGMgKyAxCi0gICAgc2FyICAgICAgICBibG9ja2QsIDEgICAgICAgICAgICAgICA7ID4+IDEKLSAgICBsZWEgICAgICAgIGJsb2NrZCwgW2Jsb2NrcSozKzE2XSAgIDsgIDMgKiBkYyArIDE2Ci0gICAgc2FyICAgICAgICBibG9ja2QsIDUgICAgICAgICAgICAgICA7ID4+IDUKLQotICAgIElOVl9UUkFOU19JTklUCi0KLSAgICBJTlZfVFJBTlNfUFJPQ0VTUyBhCi0gICAgbGVhICAgICAgICAgZGVzdHEsIFtkZXN0cStsaW5lc2l6ZXEqNF0KLSAgICBJTlZfVFJBTlNfUFJPQ0VTUyBhCi0gICAgUkVUCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni92YzFkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvdmMxZHNwX2luaXQuYwppbmRleCBjODk0M2ZhLi44ZTBjMjg0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni92YzFkc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L3ZjMWRzcF9pbml0LmMKQEAgLTUxLDcgKzUxLDcgQEAKICAgICBmZl92YzFfaF9sb29wX2ZpbHRlcjhfICMjIEVYVChzcmMrOCpzdHJpZGUsIHN0cmlkZSwgcHEpOyBcCiB9CiAKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogTE9PUF9GSUxURVIobW14ZXh0KQogTE9PUF9GSUxURVIoc3NlMikKIExPT1BfRklMVEVSKHNzc2UzKQpAQCAtODAsMjUgKzgwLDI1IEBACiBERUNMQVJFX0ZVTkNUSU9OKHB1dF8sIDE2LCBfc3NlMikKIERFQ0xBUkVfRlVOQ1RJT04oYXZnXywgMTYsIF9zc2UyKQogCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIAogdm9pZCBmZl9wdXRfdmMxX2Nocm9tYV9tYzhfbm9ybmRfbW14ICAodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbm9ybmRfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbm9ybmRfM2Rub3codWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9wdXRfdmMxX2Nocm9tYV9tYzhfbm9ybmRfc3NzZTModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwogdm9pZCBmZl9hdmdfdmMxX2Nocm9tYV9tYzhfbm9ybmRfc3NzZTModWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgaCwgaW50IHgsIGludCB5KTsKLXZvaWQgZmZfdmMxX2ludl90cmFuc180eDRfZGNfbW14ZXh0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIGludCBoLCBpbnQgeCwgaW50IHkpOwordm9pZCBmZl92YzFfaW52X3RyYW5zXzR4NF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl92YzFfaW52X3RyYW5zXzR4OF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLAordm9pZCBmZl92YzFfaW52X3RyYW5zXzR4OF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl92YzFfaW52X3RyYW5zXzh4NF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLAordm9pZCBmZl92YzFfaW52X3RyYW5zXzh4NF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl92YzFfaW52X3RyYW5zXzh4OF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgaW50IGxpbmVzaXplLAordm9pZCBmZl92YzFfaW52X3RyYW5zXzh4OF9kY19tbXhleHQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2spOwogCiAKQEAgLTEwNiwxMCArMTA2LDEyIEBACiB7CiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKIAotICAgIGlmIChIQVZFXzZSRUdTICYmIElOTElORV9NTVgoY3B1X2ZsYWdzKSAmJiBFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkKKyAgICBpZiAoSEFWRV82UkVHUyAmJiBJTkxJTkVfTU1YKGNwdV9mbGFncykpCisgICAgICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkKICAgICAgICAgZmZfdmMxZHNwX2luaXRfbW14KGRzcCk7CiAKLSAgICBpZiAoSEFWRV82UkVHUyAmJiBJTkxJTkVfTU1YRVhUKGNwdV9mbGFncykgJiYgRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCisgICAgaWYgKEhBVkVfNlJFR1MgJiYgSU5MSU5FX01NWEVYVChjcHVfZmxhZ3MpKQorICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCiAgICAgICAgIGZmX3ZjMWRzcF9pbml0X21teGV4dChkc3ApOwogCiAjZGVmaW5lIEFTU0lHTl9MRihFWFQpIFwKQEAgLTEyMCw3ICsxMjIsNyBAQAogICAgICAgICBkc3AtPnZjMV92X2xvb3BfZmlsdGVyMTYgPSB2YzFfdl9sb29wX2ZpbHRlcjE2XyAjIyBFWFQ7IFwKICAgICAgICAgZHNwLT52YzFfaF9sb29wX2ZpbHRlcjE2ID0gdmMxX2hfbG9vcF9maWx0ZXIxNl8gIyMgRVhUCiAKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogICAgIGlmIChFWFRFUk5BTF9NTVgoY3B1X2ZsYWdzKSkgewogICAgICAgICBkc3AtPnB1dF9ub19ybmRfdmMxX2Nocm9tYV9waXhlbHNfdGFiWzBdID0gZmZfcHV0X3ZjMV9jaHJvbWFfbWM4X25vcm5kX21teDsKIApAQCAtMTYyLDUgKzE2NCw1IEBACiAgICAgICAgIGRzcC0+dmMxX2hfbG9vcF9maWx0ZXI4ICA9IGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc2U0OwogICAgICAgICBkc3AtPnZjMV9oX2xvb3BfZmlsdGVyMTYgPSB2YzFfaF9sb29wX2ZpbHRlcjE2X3NzZTQ7CiAgICAgfQotI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworI2VuZGlmIC8qIEhBVkVfWDg2QVNNICovCiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni92YzFkc3BfbG9vcGZpbHRlci5hc20gYi9saWJhdmNvZGVjL3g4Ni92YzFkc3BfbG9vcGZpbHRlci5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzM2JkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L3ZjMWRzcF9sb29wZmlsdGVyLmFzbQpAQCAtMCwwICsxLDMxNyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogVkMxIGxvb3BmaWx0ZXIgb3B0aW1pemF0aW9ucworOyogQ29weXJpZ2h0IChjKSAyMDA5IERhdmlkIENvbnJhZAorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK2NleHRlcm4gcHdfNAorY2V4dGVybiBwd181CisKK1NFQ1RJT04gLnRleHQKKworOyBkc3RfbG93LCBkc3RfaGlnaCAoc3JjKSwgemVybworOyB6ZXJvLWV4dGVuZHMgb25lIHZlY3RvciBmcm9tIDggdG8gMTYgYml0cworJW1hY3JvIFVOUEFDS184VE8xNiA0CisgICAgbW92YSAgICAgIG0lMiwgbSUzCisgICAgcHVucGNraCUxIG0lMywgbSU0CisgICAgcHVucGNrbCUxIG0lMiwgbSU0CislZW5kbWFjcm8KKworJW1hY3JvIFNUT1JFXzRfV09SRFMgNgorJWlmIGNwdWZsYWcoc3NlNCkKKyAgICBwZXh0cncgJTEsICU1LCAlNiswCisgICAgcGV4dHJ3ICUyLCAlNSwgJTYrMQorICAgIHBleHRydyAlMywgJTUsICU2KzIKKyAgICBwZXh0cncgJTQsICU1LCAlNiszCislZWxzZQorICAgIG1vdmQgICU2ZCwgJTUKKyVpZiBtbXNpemU9PTE2CisgICAgcHNybGRxICU1LCA0CislZWxzZQorICAgIHBzcmxxICAlNSwgMzIKKyVlbmRpZgorICAgIG1vdiAgICAlMSwgJTZ3CisgICAgc2hyICAgICU2LCAxNgorICAgIG1vdiAgICAlMiwgJTZ3CisgICAgbW92ZCAgJTZkLCAlNQorICAgIG1vdiAgICAlMywgJTZ3CisgICAgc2hyICAgICU2LCAxNgorICAgIG1vdiAgICAlNCwgJTZ3CislZW5kaWYKKyVlbmRtYWNybworCis7IGluOiAgcDEgcDAgcTAgcTEsIGNsb2JiZXJzIHAwCis7IG91dDogcDEgPSAoMioocDEgLSBxMSkgLSA1KihwMCAtIHEwKSArIDQpID4+IDMKKyVtYWNybyBWQzFfTE9PUF9GSUxURVJfQTAgNAorICAgIHBzdWJ3ICAlMSwgJTQKKyAgICBwc3VidyAgJTIsICUzCisgICAgcGFkZHcgICUxLCAlMQorICAgIHBtdWxsdyAlMiwgW3B3XzVdCisgICAgcHN1YncgICUxLCAlMgorICAgIHBhZGR3ICAlMSwgW3B3XzRdCisgICAgcHNyYXcgICUxLCAzCislZW5kbWFjcm8KKworOyBpbjogcDAgcTAgYTAgYTEgYTIKKzsgICAgIG0wIG0xIG03IG02IG01Cis7ICUxOiBzaXplCis7IG91dDogbTA9cDAnIG0xPXEwJworJW1hY3JvIFZDMV9GSUxURVIgMQorICAgIFBBQlNXICAgbTQsIG03CisgICAgUEFCU1cgICBtMywgbTYKKyAgICBQQUJTVyAgIG0yLCBtNQorICAgIG1vdmEgICAgbTYsIG00CisgICAgcG1pbnN3ICBtMywgbTIKKyAgICBwY21wZ3R3IG02LCBtMyAgOyBpZiAoYTIgPCBhMCB8fCBhMSA8IGEwKQorICAgIHBzdWJ3ICAgbTMsIG00CisgICAgcG11bGx3ICBtMywgW3B3XzVdICAgOyA1KihhMyAtIGEwKQorICAgIFBBQlNXICAgbTIsIG0zCisgICAgcHNyYXcgICBtMiwgMyAgIDsgYWJzKGQvOCkKKyAgICBweG9yICAgIG03LCBtMyAgOyBkX3NpZ24gXj0gYTBfc2lnbgorCisgICAgcHhvciAgICBtNSwgbTUKKyAgICBtb3ZkICAgIG0zLCByMmQKKyVpZiAlMSA+IDQKKyAgICBwdW5wY2tsYncgbTMsIG0zCislZW5kaWYKKyAgICBwdW5wY2tsYncgbTMsIG01CisgICAgcGNtcGd0dyBtMywgbTQgIDsgaWYgKGEwIDwgcHEpCisgICAgcGFuZCAgICBtNiwgbTMKKworICAgIG1vdmEgICAgbTMsIG0wCisgICAgcHN1YncgICBtMywgbTEKKyAgICBQQUJTVyAgIG00LCBtMworICAgIHBzcmF3ICAgbTQsIDEKKyAgICBweG9yICAgIG0zLCBtNyAgOyBkX3NpZ24gXiBjbGlwX3NpZ24KKyAgICBwc3JhdyAgIG0zLCAxNQorICAgIHBtaW5zdyAgbTIsIG00ICA7IG1pbihkLCBjbGlwKQorICAgIHBjbXBndHcgbTQsIG01CisgICAgcGFuZCAgICBtNiwgbTQgIDsgZmlsdDMgKEMgcmV0dXJuIHZhbHVlKQorCis7IGVhY2ggc2V0IG9mIDQgcGl4ZWxzIGlzIG5vdCBmaWx0ZXJlZCBpZiB0aGUgM3JkIGlzIG5vdAorJWlmIG1tc2l6ZT09MTYKKyAgICBwc2h1Zmx3IG00LCBtNiwgMHhhYQorJWlmICUxID4gNAorICAgIHBzaHVmaHcgbTQsIG00LCAweGFhCislZW5kaWYKKyVlbHNlCisgICAgcHNodWZ3ICBtNCwgbTYsIDB4YWEKKyVlbmRpZgorICAgIHBhbmRuICAgbTMsIG00CisgICAgcGFuZCAgICBtMiwgbTYKKyAgICBwYW5kICAgIG0zLCBtMiAgOyBkIGZpbmFsCisKKyAgICBwc3JhdyAgIG03LCAxNQorICAgIHB4b3IgICAgbTMsIG03CisgICAgcHN1YncgICBtMywgbTcKKyAgICBwc3VidyAgIG0wLCBtMworICAgIHBhZGR3ICAgbTEsIG0zCisgICAgcGFja3Vzd2IgbTAsIG0wCisgICAgcGFja3Vzd2IgbTEsIG0xCislZW5kbWFjcm8KKworOyAxc3QgcGFyYW06IHNpemUgb2YgZmlsdGVyCis7IDJuZCBwYXJhbTogbW92IHN1ZmZpeCBlcXVpdmFsZW50IHRvIHRoZSBmaWx0ZXIgc2l6ZQorJW1hY3JvIFZDMV9WX0xPT1BfRklMVEVSIDIKKyAgICBweG9yICAgICAgbTUsIG01CisgICAgbW92JTIgICAgIG02LCBbcjRdCisgICAgbW92JTIgICAgIG00LCBbcjQrcjFdCisgICAgbW92JTIgICAgIG03LCBbcjQrMipyMV0KKyAgICBtb3YlMiAgICAgbTAsIFtyNCtyM10KKyAgICBwdW5wY2tsYncgbTYsIG01CisgICAgcHVucGNrbGJ3IG00LCBtNQorICAgIHB1bnBja2xidyBtNywgbTUKKyAgICBwdW5wY2tsYncgbTAsIG01CisKKyAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTYsIG00LCBtNywgbTAKKyAgICBtb3YlMiAgICAgbTEsIFtyMF0KKyAgICBtb3YlMiAgICAgbTIsIFtyMCtyMV0KKyAgICBwdW5wY2tsYncgbTEsIG01CisgICAgcHVucGNrbGJ3IG0yLCBtNQorICAgIG1vdmEgICAgICBtNCwgbTAKKyAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTcsIG00LCBtMSwgbTIKKyAgICBtb3YlMiAgICAgbTMsIFtyMCsyKnIxXQorICAgIG1vdiUyICAgICBtNCwgW3IwK3IzXQorICAgIHB1bnBja2xidyBtMywgbTUKKyAgICBwdW5wY2tsYncgbTQsIG01CisgICAgbW92YSAgICAgIG01LCBtMQorICAgIFZDMV9MT09QX0ZJTFRFUl9BMCBtNSwgbTIsIG0zLCBtNAorCisgICAgVkMxX0ZJTFRFUiAlMQorICAgIG1vdiUyIFtyNCtyM10sIG0wCisgICAgbW92JTIgW3IwXSwgICAgbTEKKyVlbmRtYWNybworCis7IDFzdCBwYXJhbTogc2l6ZSBvZiBmaWx0ZXIKKzsgICAgIE5PVEU6IFVOUEFDS184VE8xNiB0aGlzIG51bWJlciBvZiA4IGJpdCBudW1iZXJzIGFyZSBpbiBoYWxmIGEgcmVnaXN0ZXIKKzsgMm5kIChvcHRpb25hbCkgcGFyYW06IHRlbXAgcmVnaXN0ZXIgdG8gdXNlIGZvciBzdG9yaW5nIHdvcmRzCislbWFjcm8gVkMxX0hfTE9PUF9GSUxURVIgMS0yCislaWYgJTEgPT0gNAorICAgIG1vdnEgICAgICBtMCwgW3IwICAgICAtNF0KKyAgICBtb3ZxICAgICAgbTEsIFtyMCsgIHIxLTRdCisgICAgbW92cSAgICAgIG0yLCBbcjArMipyMS00XQorICAgIG1vdnEgICAgICBtMywgW3IwKyAgcjMtNF0KKyAgICBUUkFOU1BPU0U0eDRCIDAsIDEsIDIsIDMsIDQKKyVlbHNlCisgICAgbW92cSAgICAgIG0wLCBbcjAgICAgIC00XQorICAgIG1vdnEgICAgICBtNCwgW3IwKyAgcjEtNF0KKyAgICBtb3ZxICAgICAgbTEsIFtyMCsyKnIxLTRdCisgICAgbW92cSAgICAgIG01LCBbcjArICByMy00XQorICAgIG1vdnEgICAgICBtMiwgW3I0ICAgICAtNF0KKyAgICBtb3ZxICAgICAgbTYsIFtyNCsgIHIxLTRdCisgICAgbW92cSAgICAgIG0zLCBbcjQrMipyMS00XQorICAgIG1vdnEgICAgICBtNywgW3I0KyAgcjMtNF0KKyAgICBwdW5wY2tsYncgbTAsIG00CisgICAgcHVucGNrbGJ3IG0xLCBtNQorICAgIHB1bnBja2xidyBtMiwgbTYKKyAgICBwdW5wY2tsYncgbTMsIG03CisgICAgVFJBTlNQT1NFNHg0VyAwLCAxLCAyLCAzLCA0CislZW5kaWYKKyAgICBweG9yICAgICAgbTUsIG01CisKKyAgICBVTlBBQ0tfOFRPMTYgYncsIDYsIDAsIDUKKyAgICBVTlBBQ0tfOFRPMTYgYncsIDcsIDEsIDUKKyAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTYsIG0wLCBtNywgbTEKKyAgICBVTlBBQ0tfOFRPMTYgYncsIDQsIDIsIDUKKyAgICBtb3ZhICAgIG0wLCBtMSAgICAgICAgICAgICAgICAgICAgICA7IG0wID0gcDAKKyAgICBWQzFfTE9PUF9GSUxURVJfQTAgbTcsIG0xLCBtNCwgbTIKKyAgICBVTlBBQ0tfOFRPMTYgYncsIDEsIDMsIDUKKyAgICBtb3ZhICAgIG01LCBtNAorICAgIFZDMV9MT09QX0ZJTFRFUl9BMCBtNSwgbTIsIG0xLCBtMworICAgIFNXQVAgMSwgNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbTEgPSBxMAorCisgICAgVkMxX0ZJTFRFUiAlMQorICAgIHB1bnBja2xidyBtMCwgbTEKKyVpZiAlMCA+IDEKKyAgICBTVE9SRV80X1dPUkRTIFtyMC0xXSwgW3IwK3IxLTFdLCBbcjArMipyMS0xXSwgW3IwK3IzLTFdLCBtMCwgJTIKKyVpZiAlMSA+IDQKKyAgICBwc3JsZHEgbTAsIDQKKyAgICBTVE9SRV80X1dPUkRTIFtyNC0xXSwgW3I0K3IxLTFdLCBbcjQrMipyMS0xXSwgW3I0K3IzLTFdLCBtMCwgJTIKKyVlbmRpZgorJWVsc2UKKyAgICBTVE9SRV80X1dPUkRTIFtyMC0xXSwgW3IwK3IxLTFdLCBbcjArMipyMS0xXSwgW3IwK3IzLTFdLCBtMCwgMAorICAgIFNUT1JFXzRfV09SRFMgW3I0LTFdLCBbcjQrcjEtMV0sIFtyNCsyKnIxLTFdLCBbcjQrcjMtMV0sIG0wLCA0CislZW5kaWYKKyVlbmRtYWNybworCisKKyVtYWNybyBTVEFSVF9WX0ZJTFRFUiAwCisgICAgbW92ICByNCwgcjAKKyAgICBsZWEgIHIzLCBbNCpyMV0KKyAgICBzdWIgIHI0LCByMworICAgIGxlYSAgcjMsIFtyMSsyKnIxXQorICAgIGltdWwgcjIsIDB4MDEwMTAxMDEKKyVlbmRtYWNybworCislbWFjcm8gU1RBUlRfSF9GSUxURVIgMQorICAgIGxlYSAgcjMsIFtyMSsyKnIxXQorJWlmICUxID4gNAorICAgIGxlYSAgcjQsIFtyMCs0KnIxXQorJWVuZGlmCisgICAgaW11bCByMiwgMHgwMTAxMDEwMQorJWVuZG1hY3JvCisKKyVtYWNybyBWQzFfTEYgMAorY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcl9pbnRlcm5hbAorICAgIFZDMV9WX0xPT1BfRklMVEVSIDQsIGQKKyAgICByZXQKKworY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcl9pbnRlcm5hbAorICAgIFZDMV9IX0xPT1BfRklMVEVSIDQsIHI0CisgICAgcmV0CisKKzsgdm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjRfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQorY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcjQsIDMsNSwwCisgICAgU1RBUlRfVl9GSUxURVIKKyAgICBjYWxsIHZjMV92X2xvb3BfZmlsdGVyX2ludGVybmFsCisgICAgUkVUCisKKzsgdm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjRfbW14ZXh0KHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQorY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcjQsIDMsNSwwCisgICAgU1RBUlRfSF9GSUxURVIgNAorICAgIGNhbGwgdmMxX2hfbG9vcF9maWx0ZXJfaW50ZXJuYWwKKyAgICBSRVQKKworOyB2b2lkIGZmX3ZjMV92X2xvb3BfZmlsdGVyOF9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDAKKyAgICBTVEFSVF9WX0ZJTFRFUgorICAgIGNhbGwgdmMxX3ZfbG9vcF9maWx0ZXJfaW50ZXJuYWwKKyAgICBhZGQgIHI0LCA0CisgICAgYWRkICByMCwgNAorICAgIGNhbGwgdmMxX3ZfbG9vcF9maWx0ZXJfaW50ZXJuYWwKKyAgICBSRVQKKworOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyOCwgMyw1LDAKKyAgICBTVEFSVF9IX0ZJTFRFUiA0CisgICAgY2FsbCB2YzFfaF9sb29wX2ZpbHRlcl9pbnRlcm5hbAorICAgIGxlYSAgcjAsIFtyMCs0KnIxXQorICAgIGNhbGwgdmMxX2hfbG9vcF9maWx0ZXJfaW50ZXJuYWwKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXhleHQKK1ZDMV9MRgorCitJTklUX1hNTSBzc2UyCis7IHZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXI4X3NzZTIodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDgKKyAgICBTVEFSVF9WX0ZJTFRFUgorICAgIFZDMV9WX0xPT1BfRklMVEVSIDgsIHEKKyAgICBSRVQKKworOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc2UyKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQorY2dsb2JhbCB2YzFfaF9sb29wX2ZpbHRlcjgsIDMsNiw4CisgICAgU1RBUlRfSF9GSUxURVIgOAorICAgIFZDMV9IX0xPT1BfRklMVEVSIDgsIHI1CisgICAgUkVUCisKK0lOSVRfTU1YIHNzc2UzCis7IHZvaWQgZmZfdmMxX3ZfbG9vcF9maWx0ZXI0X3Nzc2UzKHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwgaW50IHBxKQorY2dsb2JhbCB2YzFfdl9sb29wX2ZpbHRlcjQsIDMsNSwwCisgICAgU1RBUlRfVl9GSUxURVIKKyAgICBWQzFfVl9MT09QX0ZJTFRFUiA0LCBkCisgICAgUkVUCisKKzsgdm9pZCBmZl92YzFfaF9sb29wX2ZpbHRlcjRfc3NzZTModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyNCwgMyw1LDAKKyAgICBTVEFSVF9IX0ZJTFRFUiA0CisgICAgVkMxX0hfTE9PUF9GSUxURVIgNCwgcjQKKyAgICBSRVQKKworSU5JVF9YTU0gc3NzZTMKKzsgdm9pZCBmZl92YzFfdl9sb29wX2ZpbHRlcjhfc3NzZTModWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV92X2xvb3BfZmlsdGVyOCwgMyw1LDgKKyAgICBTVEFSVF9WX0ZJTFRFUgorICAgIFZDMV9WX0xPT1BfRklMVEVSIDgsIHEKKyAgICBSRVQKKworOyB2b2lkIGZmX3ZjMV9oX2xvb3BfZmlsdGVyOF9zc3NlMyh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIGludCBwcSkKK2NnbG9iYWwgdmMxX2hfbG9vcF9maWx0ZXI4LCAzLDYsOAorICAgIFNUQVJUX0hfRklMVEVSIDgKKyAgICBWQzFfSF9MT09QX0ZJTFRFUiA4LCByNQorICAgIFJFVAorCitJTklUX1hNTSBzc2U0Cis7IHZvaWQgZmZfdmMxX2hfbG9vcF9maWx0ZXI4X3NzZTQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLCBpbnQgcHEpCitjZ2xvYmFsIHZjMV9oX2xvb3BfZmlsdGVyOCwgMyw1LDgKKyAgICBTVEFSVF9IX0ZJTFRFUiA4CisgICAgVkMxX0hfTE9PUF9GSUxURVIgOAorICAgIFJFVApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdmMxZHNwX21jLmFzbSBiL2xpYmF2Y29kZWMveDg2L3ZjMWRzcF9tYy5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2ZDg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveDg2L3ZjMWRzcF9tYy5hc20KQEAgLTAsMCArMSwyOTIgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIFZDMSBtb3Rpb24gY29tcGVuc2F0aW9uIG9wdGltaXphdGlvbnMKKzsqIENvcHlyaWdodCAoYykgMjAwNyBDaHJpc3RvcGhlIEdJU1FVRVQgPGNocmlzdG9waGUuZ2lzcXVldEBmcmVlLmZyPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK2NleHRlcm4gcHdfOQorY2V4dGVybiBwd18xMjgKKworU0VDVElPTiAudGV4dAorCislaWYgSEFWRV9NTVhfSU5MSU5FCisKKzsgWFhYIHNvbWUgb2YgdGhlc2UgbWFjcm9zIGFyZSBub3QgdXNlZCByaWdodCBub3csIGJ1dCB0aGV5IHdpbGwgaW4gdGhlIGZ1dHVyZQorOyAgICAgd2hlbiBtb3JlIGZ1bmN0aW9ucyBhcmUgcG9ydGVkLgorCislbWFjcm8gT1BfUFVUIDIgOyBkc3QsIHNyYworJWVuZG1hY3JvCisKKyVtYWNybyBPUF9BVkcgMiA7IGRzdCwgc3JjCisgICAgcGF2Z2IgICAgICAgICAgICUxLCAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBOT1JNQUxJWkVfTU1YIDEgOyBzaGlmdAorICAgIHBhZGR3ICAgICAgICAgICBtMywgbTcgOyArYmlhcy1yCisgICAgcGFkZHcgICAgICAgICAgIG00LCBtNyA7ICtiaWFzLXIKKyAgICBwc3JhdyAgICAgICAgICAgbTMsICUxCisgICAgcHNyYXcgICAgICAgICAgIG00LCAlMQorJWVuZG1hY3JvCisKKyVtYWNybyBUUkFOU0ZFUl9ET19QQUNLIDIgOyBvcCwgZHN0CisgICAgcGFja3Vzd2IgICAgICAgIG0zLCBtNAorICAgICUxICAgICAgICAgICAgICBtMywgWyUyXQorICAgIG1vdmEgICAgICAgICAgWyUyXSwgbTMKKyVlbmRtYWNybworCislbWFjcm8gVFJBTlNGRVJfRE9OVF9QQUNLIDIgOyBvcCwgZHN0CisgICAgJTEgICAgICAgICAgICAgIG0zLCBbJTJdCisgICAgJTEgICAgICAgICAgICAgIG0zLCBbJTIgKyBtbXNpemVdCisgICAgbW92YSAgICAgICAgICBbJTJdLCBtMworICAgIG1vdmEgW21tc2l6ZSArICUyXSwgbTQKKyVlbmRtYWNybworCis7IHNlZSBNU1BFTF9GSUxURVIxM19DT1JFIGZvciB1c2UgYXMgVU5QQUNLIG1hY3JvCislbWFjcm8gRE9fVU5QQUNLIDEgOyByZWcKKyAgICBwdW5wY2tsYncgICAgICAgJTEsIG0wCislZW5kbWFjcm8KKyVtYWNybyBET05UX1VOUEFDSyAxIDsgcmVnCislZW5kbWFjcm8KKworOyBDb21wdXRlIHRoZSByb3VuZGVyIDMyLXIgb3IgOC1yIGFuZCB1bnBhY2tzIGl0IHRvIG03CislbWFjcm8gTE9BRF9ST1VOREVSX01NWCAxIDsgcm91bmQKKyAgICBtb3ZkICAgICAgbTcsICUxCisgICAgcHVucGNrbHdkIG03LCBtNworICAgIHB1bnBja2xkcSBtNywgbTcKKyVlbmRtYWNybworCislbWFjcm8gU0hJRlQyX0xJTkUgNSA7IG9mZiwgcjAsIHIxLCByMiwgcjMKKyAgICBwYWRkdyAgICAgICAgICBtJTMsIG0lNAorICAgIG1vdmggICAgICAgICAgIG0lMiwgW3NyY3EgKyBzdHJpZGVfbmVnMl0KKyAgICBwbXVsbHcgICAgICAgICBtJTMsIG02CisgICAgcHVucGNrbGJ3ICAgICAgbSUyLCBtMAorICAgIG1vdmggICAgICAgICAgIG0lNSwgW3NyY3EgKyBzdHJpZGVxXQorICAgIHBzdWJ3ICAgICAgICAgIG0lMywgbSUyCisgICAgcHVucGNrbGJ3ICAgICAgbSU1LCBtMAorICAgIHBhZGR3ICAgICAgICAgIG0lMywgbTcKKyAgICBwc3VidyAgICAgICAgICBtJTMsIG0lNQorICAgIHBzcmF3ICAgICAgICAgIG0lMywgc2hpZnQKKyAgICBtb3Z1ICAgW2RzdHEgKyAlMV0sIG0lMworICAgIGFkZCAgICAgICAgICAgc3JjcSwgc3RyaWRlcQorJWVuZG1hY3JvCisKK0lOSVRfTU1YIG1teAorOyB2b2lkIGZmX3ZjMV9wdXRfdmVyXzE2Yl9zaGlmdDJfbW14KGludDE2X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Nl9yZWcgc3RyaWRlLCBpbnQgcm5kLCBpbnQ2NF90IHNoaWZ0KQorOyBTYWNyaWZpY2luZyBtNiBtYWtlcyBpdCBwb3NzaWJsZSB0byBwaXBlbGluZSBsb2FkcyBmcm9tIHNyYworJWlmIEFSQ0hfWDg2XzMyCitjZ2xvYmFsIHZjMV9wdXRfdmVyXzE2Yl9zaGlmdDIsIDMsNiwwLCBkc3QsIHNyYywgc3RyaWRlCisgICAgREVDTEFSRV9SRUdfVE1QICAgICAzLCA0LCA1CisgICAgJWRlZmluZSBybmQgcjNtcAorICAgICVkZWZpbmUgc2hpZnQgcXdvcmQgcjRtCislZWxzZSA7IFg4Nl82NAorY2dsb2JhbCB2YzFfcHV0X3Zlcl8xNmJfc2hpZnQyLCA0LDcsMCwgZHN0LCBzcmMsIHN0cmlkZQorICAgIERFQ0xBUkVfUkVHX1RNUCAgICAgNCwgNSwgNgorICAgICVkZWZpbmUgICBybmQgcjNkCisgICAgOyBXZSBuZWVkIHNoaWZ0IGVpdGhlciBpbiBtZW1vcnkgb3IgaW4gYSBtbSByZWcgYXMgaXQncyB1c2VkIGluIHBzcmF3CisgICAgOyBPbiBXSU42NCwgdGhlIGFyZyBpcyBhbHJlYWR5IG9uIHRoZSBzdGFjaworICAgIDsgT24gVU5JWDY0LCBtNSBkb2Vzbid0IHNlZW0gdG8gYmUgdXNlZAorJWlmIFdJTjY0CisgICAgJWRlZmluZSBzaGlmdCByNG1wCislZWxzZSA7IFVOSVg2NAorICAgICVkZWZpbmUgc2hpZnQgbTUKKyAgICBtb3ZhIHNoaWZ0LCByNHEKKyVlbmRpZiA7IFdJTjY0CislZW5kaWYgOyBYODZfMzIKKyVkZWZpbmUgc3RyaWRlX25lZzIgdDBxCislZGVmaW5lIHN0cmlkZV85bWludXM0IHQxcQorJWRlZmluZSBpIHQycQorICAgIG1vdiAgICAgICBzdHJpZGVfbmVnMiwgc3RyaWRlcQorICAgIG5lZyAgICAgICBzdHJpZGVfbmVnMgorICAgIGFkZCAgICAgICBzdHJpZGVfbmVnMiwgc3RyaWRlX25lZzIKKyAgICBsZWEgICAgc3RyaWRlXzltaW51czQsIFtzdHJpZGVxICogOSAtIDRdCisgICAgbW92ICAgICAgICAgICAgICAgICBpLCAzCisgICAgTE9BRF9ST1VOREVSX01NWCAgcm5kCisgICAgbW92YSAgICAgICAgICAgICAgIG02LCBbcHdfOV0KKyAgICBweG9yICAgICAgICAgICAgICAgbTAsIG0wCisubG9vcDoKKyAgICBtb3ZoICAgICAgICAgICAgICAgbTIsIFtzcmNxXQorICAgIGFkZCAgICAgICAgICAgICAgc3JjcSwgc3RyaWRlcQorICAgIG1vdmggICAgICAgICAgICAgICBtMywgW3NyY3FdCisgICAgcHVucGNrbGJ3ICAgICAgICAgIG0yLCBtMAorICAgIHB1bnBja2xidyAgICAgICAgICBtMywgbTAKKyAgICBTSElGVDJfTElORSAgICAgICAgIDAsIDEsIDIsIDMsIDQKKyAgICBTSElGVDJfTElORSAgICAgICAgMjQsIDIsIDMsIDQsIDEKKyAgICBTSElGVDJfTElORSAgICAgICAgNDgsIDMsIDQsIDEsIDIKKyAgICBTSElGVDJfTElORSAgICAgICAgNzIsIDQsIDEsIDIsIDMKKyAgICBTSElGVDJfTElORSAgICAgICAgOTYsIDEsIDIsIDMsIDQKKyAgICBTSElGVDJfTElORSAgICAgICAxMjAsIDIsIDMsIDQsIDEKKyAgICBTSElGVDJfTElORSAgICAgICAxNDQsIDMsIDQsIDEsIDIKKyAgICBTSElGVDJfTElORSAgICAgICAxNjgsIDQsIDEsIDIsIDMKKyAgICBzdWIgICAgICAgICAgICAgIHNyY3EsIHN0cmlkZV85bWludXM0CisgICAgYWRkICAgICAgICAgICAgICBkc3RxLCA4CisgICAgZGVjICAgICAgICAgICAgICAgICBpCisgICAgICAgIGpueiAgICAgICAgIC5sb29wCisgICAgUkVQX1JFVAorJXVuZGVmIHJuZAorJXVuZGVmIHNoaWZ0CisldW5kZWYgc3RyaWRlX25lZzIKKyV1bmRlZiBzdHJpZGVfOW1pbnVzNAorJXVuZGVmIGkKKworOyB2b2lkIGZmX3ZjMV8qX2hvcl8xNmJfc2hpZnQyX21teCh1aW50OF90ICpkc3QsIHg4Nl9yZWcgc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpzcmMsIGludCBybmQpOworOyBEYXRhIGlzIGFscmVhZHkgdW5wYWNrZWQsIHNvIHNvbWUgb3BlcmF0aW9ucyBjYW4gZGlyZWN0bHkgYmUgbWFkZSBmcm9tCis7IG1lbW9yeS4KKyVtYWNybyBIT1JfMTZCX1NISUZUMiAyIDsgb3AsIG9wbmFtZQorY2dsb2JhbCB2YzFfJTJfaG9yXzE2Yl9zaGlmdDIsIDQsIDUsIDAsIGRzdCwgc3RyaWRlLCBzcmMsIHJuZCwgaAorICAgIG1vdiAgICAgICAgICAgICAgICBocSwgOAorICAgIHN1YiAgICAgICAgICAgICAgc3JjcSwgMgorICAgIHN1YiAgICAgICAgICAgICAgcm5kZCwgKC0xKzkrOS0xKSAqIDEwMjQgOyBhZGQgLTEwMjQgYmlhcworICAgIExPQURfUk9VTkRFUl9NTVggcm5kZAorICAgIG1vdmEgICAgICAgICAgICAgICBtNSwgW3B3XzldCisgICAgbW92YSAgICAgICAgICAgICAgIG02LCBbcHdfMTI4XQorICAgIHB4b3IgICAgICAgICAgICAgICBtMCwgbTAKKworLmxvb3A6CisgICAgbW92YSAgICAgICAgICAgICAgIG0xLCBbc3JjcSArIDIgKiAwXQorICAgIG1vdmEgICAgICAgICAgICAgICBtMiwgW3NyY3EgKyAyICogMCArIG1tc2l6ZV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgbTMsIFtzcmNxICsgMiAqIDFdCisgICAgbW92YSAgICAgICAgICAgICAgIG00LCBbc3JjcSArIDIgKiAxICsgbW1zaXplXQorICAgIHBhZGR3ICAgICAgICAgICAgICBtMywgW3NyY3EgKyAyICogMl0KKyAgICBwYWRkdyAgICAgICAgICAgICAgbTQsIFtzcmNxICsgMiAqIDIgKyBtbXNpemVdCisgICAgcGFkZHcgICAgICAgICAgICAgIG0xLCBbc3JjcSArIDIgKiAzXQorICAgIHBhZGR3ICAgICAgICAgICAgICBtMiwgW3NyY3EgKyAyICogMyArIG1tc2l6ZV0KKyAgICBwbXVsbHcgICAgICAgICAgICAgbTMsIG01CisgICAgcG11bGx3ICAgICAgICAgICAgIG00LCBtNQorICAgIHBzdWJ3ICAgICAgICAgICAgICBtMywgbTEKKyAgICBwc3VidyAgICAgICAgICAgICAgbTQsIG0yCisgICAgTk9STUFMSVpFX01NWCAgICAgIDcKKyAgICA7IHJlbW92ZSBiaWFzCisgICAgcGFkZHcgICAgICAgICAgICAgIG0zLCBtNgorICAgIHBhZGR3ICAgICAgICAgICAgICBtNCwgbTYKKyAgICBUUkFOU0ZFUl9ET19QQUNLICAgJTEsIGRzdHEKKyAgICBhZGQgICAgICAgICAgICAgIHNyY3EsIDI0CisgICAgYWRkICAgICAgICAgICAgICBkc3RxLCBzdHJpZGVxCisgICAgZGVjICAgICAgICAgICAgICAgIGhxCisgICAgICAgIGpueiAgICAgICAgIC5sb29wCisKKyAgICBSRVQKKyVlbmRtYWNybworCitJTklUX01NWCBtbXgKK0hPUl8xNkJfU0hJRlQyIE9QX1BVVCwgcHV0CisKK0lOSVRfTU1YIG1teGV4dAorSE9SXzE2Ql9TSElGVDIgT1BfQVZHLCBhdmcKKyVlbmRpZiA7IEhBVkVfTU1YX0lOTElORQorCislbWFjcm8gSU5WX1RSQU5TX0lOSVQgMAorICAgIG1vdnN4ZGlmbmlkbiBsaW5lc2l6ZXEsIGxpbmVzaXplZAorICAgIG1vdmQgICAgICAgbTAsIGJsb2NrZAorICAgIFNQTEFUVyAgICAgbTAsIG0wCisgICAgcHhvciAgICAgICBtMSwgbTEKKyAgICBwc3VidyAgICAgIG0xLCBtMAorICAgIHBhY2t1c3diICAgbTAsIG0wCisgICAgcGFja3Vzd2IgICBtMSwgbTEKKworICAgIERFRklORV9BUkdTIGRlc3QsIGxpbmVzaXplLCBsaW5lc2l6ZTMKKyAgICBsZWEgICAgbGluZXNpemUzcSwgW2xpbmVzaXplcSozXQorJWVuZG1hY3JvCisKKyVtYWNybyBJTlZfVFJBTlNfUFJPQ0VTUyAxCisgICAgbW92JTEgICAgICAgICAgICAgICAgICBtMiwgW2Rlc3RxK2xpbmVzaXplcSowXQorICAgIG1vdiUxICAgICAgICAgICAgICAgICAgbTMsIFtkZXN0cStsaW5lc2l6ZXEqMV0KKyAgICBtb3YlMSAgICAgICAgICAgICAgICAgIG00LCBbZGVzdHErbGluZXNpemVxKjJdCisgICAgbW92JTEgICAgICAgICAgICAgICAgICBtNSwgW2Rlc3RxK2xpbmVzaXplM3FdCisgICAgcGFkZHVzYiAgICAgICAgICAgICAgICBtMiwgbTAKKyAgICBwYWRkdXNiICAgICAgICAgICAgICAgIG0zLCBtMAorICAgIHBhZGR1c2IgICAgICAgICAgICAgICAgbTQsIG0wCisgICAgcGFkZHVzYiAgICAgICAgICAgICAgICBtNSwgbTAKKyAgICBwc3VidXNiICAgICAgICAgICAgICAgIG0yLCBtMQorICAgIHBzdWJ1c2IgICAgICAgICAgICAgICAgbTMsIG0xCisgICAgcHN1YnVzYiAgICAgICAgICAgICAgICBtNCwgbTEKKyAgICBwc3VidXNiICAgICAgICAgICAgICAgIG01LCBtMQorICAgIG1vdiUxIFtsaW5lc2l6ZXEqMCtkZXN0cV0sIG0yCisgICAgbW92JTEgW2xpbmVzaXplcSoxK2Rlc3RxXSwgbTMKKyAgICBtb3YlMSBbbGluZXNpemVxKjIrZGVzdHFdLCBtNAorICAgIG1vdiUxIFtsaW5lc2l6ZTNxICtkZXN0cV0sIG01CislZW5kbWFjcm8KKworOyBmZl92YzFfaW52X3RyYW5zXz94P19kY19tbXhleHQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVzaXplLCBpbnQxNl90ICpibG9jaykKK0lOSVRfTU1YIG1teGV4dAorY2dsb2JhbCB2YzFfaW52X3RyYW5zXzR4NF9kYywgMyw0LDAsIGRlc3QsIGxpbmVzaXplLCBibG9jaworICAgIG1vdnN4ICAgICAgICAgcjNkLCBXT1JEIFtibG9ja3FdCisgICAgbW92ICAgICAgICBibG9ja2QsIHIzZCAgICAgICAgICAgICA7IGRjCisgICAgc2hsICAgICAgICBibG9ja2QsIDQgICAgICAgICAgICAgICA7IDE2ICogZGMKKyAgICBsZWEgICAgICAgIGJsb2NrZCwgW2Jsb2NrcStyMys0XSAgIDsgMTcgKiBkYyArIDQKKyAgICBzYXIgICAgICAgIGJsb2NrZCwgMyAgICAgICAgICAgICAgIDsgPj4gMworICAgIG1vdiAgICAgICAgICAgcjNkLCBibG9ja2QgICAgICAgICAgOyBkYworICAgIHNobCAgICAgICAgYmxvY2tkLCA0ICAgICAgICAgICAgICAgOyAxNiAqIGRjCisgICAgbGVhICAgICAgICBibG9ja2QsIFtibG9ja3ErcjMrNjRdICA7IDE3ICogZGMgKyA2NAorICAgIHNhciAgICAgICAgYmxvY2tkLCA3ICAgICAgICAgICAgICAgOyA+PiA3CisKKyAgICBJTlZfVFJBTlNfSU5JVAorCisgICAgSU5WX1RSQU5TX1BST0NFU1MgaAorICAgIFJFVAorCitJTklUX01NWCBtbXhleHQKK2NnbG9iYWwgdmMxX2ludl90cmFuc180eDhfZGMsIDMsNCwwLCBkZXN0LCBsaW5lc2l6ZSwgYmxvY2sKKyAgICBtb3ZzeCAgICAgICAgIHIzZCwgV09SRCBbYmxvY2txXQorICAgIG1vdiAgICAgICAgYmxvY2tkLCByM2QgICAgICAgICAgICAgOyBkYworICAgIHNobCAgICAgICAgYmxvY2tkLCA0ICAgICAgICAgICAgICAgOyAxNiAqIGRjCisgICAgbGVhICAgICAgICBibG9ja2QsIFtibG9ja3ErcjMrNF0gICA7IDE3ICogZGMgKyA0CisgICAgc2FyICAgICAgICBibG9ja2QsIDMgICAgICAgICAgICAgICA7ID4+IDMKKyAgICBzaGwgICAgICAgIGJsb2NrZCwgMiAgICAgICAgICAgICAgIDsgIDQgKiBkYworICAgIGxlYSAgICAgICAgYmxvY2tkLCBbYmxvY2txKjMrNjRdICAgOyAxMiAqIGRjICsgNjQKKyAgICBzYXIgICAgICAgIGJsb2NrZCwgNyAgICAgICAgICAgICAgIDsgPj4gNworCisgICAgSU5WX1RSQU5TX0lOSVQKKworICAgIElOVl9UUkFOU19QUk9DRVNTIGgKKyAgICBsZWEgICAgICAgICBkZXN0cSwgW2Rlc3RxK2xpbmVzaXplcSo0XQorICAgIElOVl9UUkFOU19QUk9DRVNTIGgKKyAgICBSRVQKKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHZjMV9pbnZfdHJhbnNfOHg0X2RjLCAzLDQsMCwgZGVzdCwgbGluZXNpemUsIGJsb2NrCisgICAgbW92c3ggICAgICBibG9ja2QsIFdPUkQgW2Jsb2NrcV0gICA7IGRjCisgICAgbGVhICAgICAgICBibG9ja2QsIFtibG9ja3EqMysxXSAgICA7ICAzICogZGMgKyAxCisgICAgc2FyICAgICAgICBibG9ja2QsIDEgICAgICAgICAgICAgICA7ID4+IDEKKyAgICBtb3YgICAgICAgICAgIHIzZCwgYmxvY2tkICAgICAgICAgIDsgZGMKKyAgICBzaGwgICAgICAgIGJsb2NrZCwgNCAgICAgICAgICAgICAgIDsgMTYgKiBkYworICAgIGxlYSAgICAgICAgYmxvY2tkLCBbYmxvY2txK3IzKzY0XSAgOyAxNyAqIGRjICsgNjQKKyAgICBzYXIgICAgICAgIGJsb2NrZCwgNyAgICAgICAgICAgICAgIDsgPj4gNworCisgICAgSU5WX1RSQU5TX0lOSVQKKworICAgIElOVl9UUkFOU19QUk9DRVNTIGEKKyAgICBSRVQKKworSU5JVF9NTVggbW14ZXh0CitjZ2xvYmFsIHZjMV9pbnZfdHJhbnNfOHg4X2RjLCAzLDMsMCwgZGVzdCwgbGluZXNpemUsIGJsb2NrCisgICAgbW92c3ggICAgICBibG9ja2QsIFdPUkQgW2Jsb2NrcV0gICA7IGRjCisgICAgbGVhICAgICAgICBibG9ja2QsIFtibG9ja3EqMysxXSAgICA7ICAzICogZGMgKyAxCisgICAgc2FyICAgICAgICBibG9ja2QsIDEgICAgICAgICAgICAgICA7ID4+IDEKKyAgICBsZWEgICAgICAgIGJsb2NrZCwgW2Jsb2NrcSozKzE2XSAgIDsgIDMgKiBkYyArIDE2CisgICAgc2FyICAgICAgICBibG9ja2QsIDUgICAgICAgICAgICAgICA7ID4+IDUKKworICAgIElOVl9UUkFOU19JTklUCisKKyAgICBJTlZfVFJBTlNfUFJPQ0VTUyBhCisgICAgbGVhICAgICAgICAgZGVzdHEsIFtkZXN0cStsaW5lc2l6ZXEqNF0KKyAgICBJTlZfVFJBTlNfUFJPQ0VTUyBhCisgICAgUkVUCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni92YzFkc3BfbW14LmMgYi9saWJhdmNvZGVjL3g4Ni92YzFkc3BfbW14LmMKaW5kZXggODMyNTY0OC4uNDVjOGE2OCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdmMxZHNwX21teC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L3ZjMWRzcF9tbXguYwpAQCAtNzYsNyArNzYsNyBAQAogCiAvKioKICAqIFB1cmVseSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIDEvMiBzaGlmdCBpbnRlcnBvbGF0aW9uLgotICogU2FjcmlmeSBtbTYgZm9yICo5IGZhY3Rvci4KKyAqIFNhY3JpZmljZSBtbTYgZm9yICo5IGZhY3Rvci4KICAqLwogI2RlZmluZSBWQzFfU0hJRlQyKE9QLCBPUE5BTUUpXAogc3RhdGljIHZvaWQgT1BOQU1FICMjIHZjMV9zaGlmdDJfbW14KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLFwKQEAgLTg0LDcgKzg0LDcgQEAKIHtcCiAgICAgcm5kID0gOC1ybmQ7XAogICAgIF9fYXNtX18gdm9sYXRpbGUoXAotICAgICAgICAibW92ICAgICAgICQ4LCAlJSJSRUdfYyIgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ICAgICAgICQ4LCAlJSJGRl9SRUdfYyIgICAgICAgIFxuXHQiXAogICAgICAgICBMT0FEX1JPVU5ERVJfTU1YKCIlNSIpXAogICAgICAgICAibW92cSAgICAgICJNQU5HTEUoZmZfcHdfOSkiLCAlJW1tNlxuXHQiXAogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXApAQCAtMTE5LDEzICsxMTksMTMgQEAKICAgICAgICAgIm1vdnEgICAgICAlJW1tMywgKCUxKSAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgImFkZCAgICAgICAlNiwgJTAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgImFkZCAgICAgICAlNCwgJTEgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgImRlYyAgICAgICAlJSJSRUdfYyIgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImRlYyAgICAgICAlJSJGRl9SRUdfYyIgICAgICAgICAgICBcblx0IlwKICAgICAgICAgImpueiAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgOiAiK3IiKHNyYyksICAiK3IiKGRzdClcCiAgICAgICAgIDogInIiKG9mZnNldCksICJyIigtMipvZmZzZXQpLCAiZyIoc3RyaWRlKSwgIm0iKHJuZCksXAogICAgICAgICAgICJnIihzdHJpZGUtb2Zmc2V0KVwKICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfcHdfOSlcCi0gICAgICAgIDogIiUiUkVHX2MsICJtZW1vcnkiXAorICAgICAgICA6ICIlIkZGX1JFR19jLCAibWVtb3J5IlwKICAgICApO1wKIH0KIApAQCAtMTM1LDcgKzEzNSw3IEBACiAvKioKICAqIENvcmUgb2YgdGhlIDEvNCBhbmQgMy80IHNoaWZ0IGJpY3ViaWMgaW50ZXJwb2xhdGlvbi4KICAqCi0gKiBAcGFyYW0gVU5QQUNLICBNYWNybyB1bnBhY2tpbmcgYXJndW1lbnRzIGZyb20gOCB0byAxNmJpdHMgKGNhbiBiZSBlbXB0eSkuCisgKiBAcGFyYW0gVU5QQUNLICBNYWNybyB1bnBhY2tpbmcgYXJndW1lbnRzIGZyb20gOCB0byAxNiBiaXRzIChjYW4gYmUgZW1wdHkpLgogICogQHBhcmFtIE1PVlEgICAgIm1vdmQgMSIgb3IgIm1vdnEgMiIsIGlmIGRhdGEgcmVhZCBpcyBhbHJlYWR5IHVucGFja2VkLgogICogQHBhcmFtIEExICAgICAgQWRkcmVzcyBvZiAxc3QgdGFwIChiZXdhcmUgb2YgdW5wYWNrZWQvcGFja2VkKS4KICAqIEBwYXJhbSBBMiAgICAgIEFkZHJlc3Mgb2YgMm5kIHRhcApAQCAtMTc1LDcgKzE3NSw3IEBACiAgICAgICJwYWRkdyAgICAgJSVtbTIsICUlbW00ICAgIFxuXHQiIC8qIDQsNTMsMTgsLTMgKi8KIAogLyoqCi0gKiBNYWNybyB0byBidWlsZCB0aGUgdmVydGljYWwgMTZiaXRzIHZlcnNpb24gb2YgdmMxX3B1dF9zaGlmdFsxM10uCisgKiBNYWNybyB0byBidWlsZCB0aGUgdmVydGljYWwgMTYgYml0cyB2ZXJzaW9uIG9mIHZjMV9wdXRfc2hpZnRbMTNdLgogICogSGVyZSwgb2Zmc2V0PXNyY19zdHJpZGUuIFBhcmFtZXRlcnMgcGFzc2VkIEExIHRvIEE0IG11c3QgdXNlCiAgKiAlMyAoc3JjX3N0cmlkZSkgYW5kICU0ICgzKnNyY19zdHJpZGUpLgogICoKQEAgLTIzMyw4ICsyMzMsOCBAQAogfQogCiAvKioKLSAqIE1hY3JvIHRvIGJ1aWxkIHRoZSBob3Jpem9udGFsIDE2Yml0cyB2ZXJzaW9uIG9mIHZjMV9wdXRfc2hpZnRbMTNdLgotICogSGVyZSwgb2Zmc2V0PTE2Yml0cywgc28gcGFyYW1ldGVycyBwYXNzZWQgQTEgdG8gQTQgc2hvdWxkIGJlIHNpbXBsZS4KKyAqIE1hY3JvIHRvIGJ1aWxkIHRoZSBob3Jpem9udGFsIDE2IGJpdHMgdmVyc2lvbiBvZiB2YzFfcHV0X3NoaWZ0WzEzXS4KKyAqIEhlcmUsIG9mZnNldD0xNiBiaXRzLCBzbyBwYXJhbWV0ZXJzIHBhc3NlZCBBMSB0byBBNCBzaG91bGQgYmUgc2ltcGxlLgogICoKICAqIEBwYXJhbSAgTkFNRSAgIEVpdGhlciAxIG9yIDMKICAqIEBzZWUgTVNQRUxfRklMVEVSMTNfQ09SRSBmb3IgaW5mb3JtYXRpb24gb24gQTEtPkE0CkBAIC0yNzEsNyArMjcxLDcgQEAKIH0KIAogLyoqCi0gKiBNYWNybyB0byBidWlsZCB0aGUgOGJpdHMsIGFueSBkaXJlY3Rpb24sIHZlcnNpb24gb2YgdmMxX3B1dF9zaGlmdFsxM10uCisgKiBNYWNybyB0byBidWlsZCB0aGUgOCBiaXRzLCBhbnkgZGlyZWN0aW9uLCB2ZXJzaW9uIG9mIHZjMV9wdXRfc2hpZnRbMTNdLgogICogSGVyZSwgb2Zmc2V0PXNyY19zdHJpZGUuIFBhcmFtZXRlcnMgcGFzc2VkIEExIHRvIEE0IG11c3QgdXNlCiAgKiAlMyAob2Zmc2V0KSBhbmQgJTQgKDMqb2Zmc2V0KS4KICAqCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni92aWRlb2RzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni92aWRlb2RzcC5hc20KaW5kZXggYTgwN2QzYi4uZTIzNzg2MCAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdmlkZW9kc3AuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L3ZpZGVvZHNwLmFzbQpAQCAtMTE0LDcgKzExNCw3IEBACiAueF9sb29wOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgZG8gewogICAgIG1vdnUgICAgW2RzdHErd3EqMl0sIG0wICAgICAgICAgICAgICAgICAgICAgOyAgICAgd3JpdGUoJHJlZywgJG1tc2l6ZSkKICAgICBhZGQgICAgICAgICAgICAgIHdxLCBtbXNpemUvMiAgICAgICAgICAgICAgIDsgICAgIHcgLT0gJG1tc2l6ZS8yCi0gICAgY21wICAgICAgICAgICAgICB3cSwgLW1tc2l6ZS8yICAgICAgICAgICAgICA7ICAgfSB3aGlsZSAodyA+ICRtbXNpemUvMikKKyAgICBjbXAgICAgICAgICAgICAgIHdxLCAtKG1tc2l6ZS8yKSAgICAgICAgICAgIDsgICB9IHdoaWxlICh3ID4gJG1tc2l6ZS8yKQogICAgIGpsIC54X2xvb3AKICAgICBtb3Z1ICBbZHN0cS1tbXNpemVdLCBtMCAgICAgICAgICAgICAgICAgICAgIDsgICB3cml0ZSgkcmVnLCAkbW1zaXplKQogICAgIGFkZCAgICAgICAgICAgIGRzdHEsIGRzdF9zdHJpZGVxICAgICAgICAgICAgOyAgIGRzdCArPSBkc3Rfc3RyaWRlCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni92aWRlb2RzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni92aWRlb2RzcF9pbml0LmMKaW5kZXggMjZlMDcyYi4uZWVlYmI0MSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdmlkZW9kc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L3ZpZGVvZHNwX2luaXQuYwpAQCAtMjksNyArMjksNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy92aWRlb2RzcC5oIgogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KIHR5cGVkZWYgdm9pZCBlbXVfZWRnZV92Zml4X2Z1bmModWludDhfdCAqZHN0LCB4ODZfcmVnIGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgeDg2X3JlZyBzcmNfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4ODZfcmVnIHN0YXJ0X3ksIHg4Nl9yZWcgZW5kX3ksIHg4Nl9yZWcgYmgpOwpAQCAtMjcxLDE0ICsyNzEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgIGhmaXh0YmxfYXZ4MiwgJmZmX2VtdV9lZGdlX2h2YXJfYXZ4Mik7CiB9CiAjZW5kaWYgLyogSEFWRV9BVlgyX0VYVEVSTkFMICovCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIAogdm9pZCBmZl9wcmVmZXRjaF9tbXhleHQodWludDhfdCAqYnVmLCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgaCk7CiB2b2lkIGZmX3ByZWZldGNoXzNkbm93KHVpbnQ4X3QgKmJ1ZiwgcHRyZGlmZl90IHN0cmlkZSwgaW50IGgpOwogCiBhdl9jb2xkIHZvaWQgZmZfdmlkZW9kc3BfaW5pdF94ODYoVmlkZW9EU1BDb250ZXh0ICpjdHgsIGludCBicGMpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAjaWYgQVJDSF9YODZfMzIKQEAgLTMwNSw1ICszMDUsNSBAQAogICAgICAgICBjdHgtPmVtdWxhdGVkX2VkZ2VfbWMgPSBlbXVsYXRlZF9lZGdlX21jX2F2eDI7CiAgICAgfQogI2VuZGlmCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3ZvcmJpc2RzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni92b3JiaXNkc3AuYXNtCmluZGV4IGIyNWQ4MzguLmQ5NTIyOTYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZvcmJpc2RzcC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvdm9yYmlzZHNwLmFzbQpAQCAtNTcsMTMgKzU3LDE3IEBACiAlZW5kaWYKIAogSU5JVF9YTU0gc3NlCi1jZ2xvYmFsIHZvcmJpc19pbnZlcnNlX2NvdXBsaW5nLCAzLCA0LCA2LCBtYWcsIGFuZywgYmxvY2tfc2l6ZSwgY250cgorY2dsb2JhbCB2b3JiaXNfaW52ZXJzZV9jb3VwbGluZywgMywgMywgNiwgbWFnLCBhbmcsIGJsb2NrX3NpemUKICAgICBtb3ZhICAgICAgICAgICAgICAgICAgICAgbTUsIFtwZHdfODAwMDAwMDBdCi0gICAgeG9yICAgICAgICAgICAgICAgICAgIGNudHJxLCBjbnRycQorICAgIHNobCAgICAgICAgICAgICBibG9ja19zaXplZCwgMgorICAgIGFkZCAgICAgICAgICAgICAgICAgICAgbWFncSwgYmxvY2tfc2l6ZXEKKyAgICBhZGQgICAgICAgICAgICAgICAgICAgIGFuZ3EsIGJsb2NrX3NpemVxCisgICAgbmVnICAgICAgICAgICAgIGJsb2NrX3NpemVxCisKIGFsaWduIDE2CiAubG9vcDoKLSAgICBtb3ZhICAgICAgICAgICAgICAgICAgICAgbTAsIFttYWdxK2NudHJxKjRdCi0gICAgbW92YSAgICAgICAgICAgICAgICAgICAgIG0xLCBbYW5ncStjbnRycSo0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgICBtMCwgW21hZ3ErYmxvY2tfc2l6ZXFdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgIG0xLCBbYW5ncStibG9ja19zaXplcV0KICAgICB4b3JwcyAgICAgICAgICAgICAgICAgICAgbTIsIG0yCiAgICAgeG9ycHMgICAgICAgICAgICAgICAgICAgIG0zLCBtMwogICAgIGNtcGxlcHMgICAgICAgICAgICAgICAgICBtMiwgbTAgICAgIDsgbSA8PSAwLjAKQEAgLTc1LDkgKzc5LDggQEAKICAgICBhbmRucHMgICAgICAgICAgICAgICAgICAgbTQsIG0xCiAgICAgYWRkcHMgICAgICAgICAgICAgICAgICAgIG0zLCBtMCAgICAgOyBhID0gbSArICgoYSA8IDApICYgKGEgXiBzaWduKG0pKSkKICAgICBzdWJwcyAgICAgICAgICAgICAgICAgICAgbTAsIG00ICAgICA7IG0gPSBtICsgKChhID4gMCkgJiAoYSBeIHNpZ24obSkpKQotICAgIG1vdmEgICAgICAgICBbYW5ncStjbnRycSo0XSwgbTMKLSAgICBtb3ZhICAgICAgICAgW21hZ3ErY250cnEqNF0sIG0wCi0gICAgYWRkICAgICAgICAgICAgICAgICAgIGNudHJxLCA0Ci0gICAgY21wICAgICAgICAgICAgICAgICAgIGNudHJxLCBibG9ja19zaXplcQorICAgIG1vdmEgICAgIFthbmdxK2Jsb2NrX3NpemVxXSwgbTMKKyAgICBtb3ZhICAgICBbbWFncStibG9ja19zaXplcV0sIG0wCisgICAgYWRkICAgICAgICAgICAgIGJsb2NrX3NpemVxLCBtbXNpemUKICAgICBqbCAubG9vcAogICAgIFJFVApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdnAzZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L3ZwM2RzcC5hc20KaW5kZXggZDQ1N2NkNy4uZDg4ZDVhMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdnAzZHNwLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni92cDNkc3AuYXNtCkBAIC0xMDUsOSArMTA1LDYgQEAKIAogSU5JVF9NTVggbW14ZXh0CiBjZ2xvYmFsIHZwM192X2xvb3BfZmlsdGVyLCAzLCA0Ci0laWYgQVJDSF9YODZfNjQKLSAgICBtb3ZzeGQgICAgICAgIHIxLCByMWQKLSVlbmRpZgogICAgIG1vdiAgICAgICAgICAgcjMsIHIxCiAgICAgbmVnICAgICAgICAgICByMQogICAgIG1vdnEgICAgICAgICAgbTYsIFtyMCtyMSoyXQpAQCAtMTIyLDkgKzExOSw2IEBACiAgICAgUkVUCiAKIGNnbG9iYWwgdnAzX2hfbG9vcF9maWx0ZXIsIDMsIDQKLSVpZiBBUkNIX1g4Nl82NAotICAgIG1vdnN4ZCAgICAgICAgcjEsIHIxZAotJWVuZGlmCiAgICAgbGVhICAgICAgICAgICByMywgW3IxKjNdCiAKICAgICBtb3ZkICAgICAgICAgIG02LCBbcjAgICAgIC0yXQpAQCAtNTY5LDcgKzU2Myw2IEBACiBjZ2xvYmFsIHZwM19pZGN0X3B1dCwgMywgNCwgOQogICAgIFZQM19JRENUICAgICAgcjIKIAotICAgIG1vdnN4ZGlmbmlkbiAgcjEsIHIxZAogICAgIG1vdmEgICAgICAgICAgbTQsIFtwYl84MF0KICAgICBsZWEgICAgICAgICAgIHIzLCBbcjEqM10KICVhc3NpZ24gJSVpIDAKQEAgLTYyNiw3ICs2MTksNiBAQAogY2dsb2JhbCB2cDNfaWRjdF9hZGQsIDMsIDQsIDkKICAgICBWUDNfSURDVCAgICAgIHIyCiAKLSAgICBtb3ZzeGRpZm5pZG4gIHIxLCByMWQKICAgICBsZWEgICAgICAgICAgIHIzLCBbcjEqM10KICAgICBweG9yICAgICAgICAgIG00LCBtNAogJWlmIG1tc2l6ZSA9PSAxNgpAQCAtNzMzLDkgKzcyNSw2IEBACiAKIElOSVRfTU1YIG1teGV4dAogY2dsb2JhbCB2cDNfaWRjdF9kY19hZGQsIDMsIDQKLSVpZiBBUkNIX1g4Nl82NAotICAgIG1vdnN4ZCAgICAgICAgcjEsIHIxZAotJWVuZGlmCiAgICAgbW92c3ggICAgICAgICByMywgd29yZCBbcjJdCiAgICAgbW92ICAgIHdvcmQgW3IyXSwgMAogICAgIGxlYSAgICAgICAgICAgcjIsIFtyMSozXQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdnAzZHNwX2luaXQuYyBiL2xpYmF2Y29kZWMveDg2L3ZwM2RzcF9pbml0LmMKaW5kZXggMmVjZTlhYi4uMWJhOTU3NiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdnAzZHNwX2luaXQuYworKysgYi9saWJhdmNvZGVjL3g4Ni92cDNkc3BfaW5pdC5jCkBAIC0yNiwxOCArMjYsMTcgQEAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwM2RzcC5oIgogCi12b2lkIGZmX3ZwM19pZGN0X3B1dF9tbXgodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwotdm9pZCBmZl92cDNfaWRjdF9hZGRfbW14KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfdnAzX2lkY3RfcHV0X21teCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3ZwM19pZGN0X2FkZF9tbXgodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50MTZfdCAqYmxvY2spOwogCi12b2lkIGZmX3ZwM19pZGN0X3B1dF9zc2UyKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKLXZvaWQgZmZfdnAzX2lkY3RfYWRkX3NzZTIodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92cDNfaWRjdF9wdXRfc3NlMih1aW50OF90ICpkZXN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jayk7Cit2b2lkIGZmX3ZwM19pZGN0X2FkZF9zc2UyKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKIAotdm9pZCBmZl92cDNfaWRjdF9kY19hZGRfbW14ZXh0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl92cDNfaWRjdF9kY19hZGRfbW14ZXh0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrKTsKIAotdm9pZCBmZl92cDNfdl9sb29wX2ZpbHRlcl9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl92cDNfdl9sb29wX2ZpbHRlcl9tbXhleHQodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpib3VuZGluZ192YWx1ZXMpOwotdm9pZCBmZl92cDNfaF9sb29wX2ZpbHRlcl9tbXhleHQodWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl92cDNfaF9sb29wX2ZpbHRlcl9tbXhleHQodWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpib3VuZGluZ192YWx1ZXMpOwogCiB2b2lkIGZmX3B1dF92cF9ub19ybmRfcGl4ZWxzOF9sMl9tbXgodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICphLApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdnA2ZHNwLmFzbSBiL2xpYmF2Y29kZWMveDg2L3ZwNmRzcC5hc20KaW5kZXggM2Q4NzRlYS4uMGJlNTMxZSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdnA2ZHNwLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni92cDZkc3AuYXNtCkBAIC0xMTUsNyArMTE1LDcgQEAKICVlbmRtYWNybwogCiAlbWFjcm8gdnA2X2ZpbHRlcl9kaWFnNCAwCi07IHZvaWQgZmZfdnA2X2ZpbHRlcl9kaWFnNF88b3B0Pih1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgaW50IHN0cmlkZSwKKzsgdm9pZCBmZl92cDZfZmlsdGVyX2RpYWc0XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBoX3dlaWdodFs0XSwgY29uc3QgaW50MTZfdCB2X3dlaWdodHNbNF0pCiBjZ2xvYmFsIHZwNl9maWx0ZXJfZGlhZzQsIDUsIDcsIDgKICAgICBtb3YgICAgICAgICAgcjUsIHJzcCAgICAgICAgIDsgYmFja3VwIHN0YWNrIHBvaW50ZXIKQEAgLTEyNiw5ICsxMjYsNiBAQAogICAgIHN1YiAgICAgICAgIHJzcCwgOCoxNQogICAgIG1vdnEgICAgICAgICBtNiwgW3B3XzY0XQogJWVuZGlmCi0laWYgQVJDSF9YODZfNjQKLSAgICBtb3ZzeGQgICAgICAgcjIsIHIyZAotJWVuZGlmCiAKICAgICBzdWIgICAgICAgICAgcjEsIHIyCiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3ZwNmRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni92cDZkc3BfaW5pdC5jCmluZGV4IDgyYmFlZTcuLmNlNDk4OTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwNmRzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvdnA2ZHNwX2luaXQuYwpAQCAtMjIsMTYgKzIyLDE1IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy92cDU2ZHNwLmgiCiAKLXZvaWQgZmZfdnA2X2ZpbHRlcl9kaWFnNF9tbXgodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCit2b2lkIGZmX3ZwNl9maWx0ZXJfZGlhZzRfbW14KHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoX3dlaWdodHMsY29uc3QgaW50MTZfdCAqdl93ZWlnaHRzKTsKLXZvaWQgZmZfdnA2X2ZpbHRlcl9kaWFnNF9zc2UyKHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBpbnQgc3RyaWRlLAordm9pZCBmZl92cDZfZmlsdGVyX2RpYWc0X3NzZTIodWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoX3dlaWdodHMsY29uc3QgaW50MTZfdCAqdl93ZWlnaHRzKTsKIAotYXZfY29sZCB2b2lkIGZmX3ZwNmRzcF9pbml0X3g4NihWUDU2RFNQQ29udGV4dCogYywgZW51bSBBVkNvZGVjSUQgY29kZWMpCithdl9jb2xkIHZvaWQgZmZfdnA2ZHNwX2luaXRfeDg2KFZQNTZEU1BDb250ZXh0ICpjKQogewogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3ZwOGRzcC5hc20gYi9saWJhdmNvZGVjL3g4Ni92cDhkc3AuYXNtCmluZGV4IDUzOGIzZjQuLjc1ZGU1NjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwOGRzcC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvdnA4ZHNwLmFzbQpAQCAtMTU2LDggKzE1Niw4IEBACiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBzdWJwZWwgTUMgZnVuY3Rpb25zOgogOwotOyB2b2lkIGZmX3B1dF92cDhfZXBlbDxzaXplPl9oPGh0YXA+djx2dGFwPl88b3B0Pih1aW50OF90ICpkc3QsIGludCBkZXN0c3RyaWRlLAotOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMsIGludCBzcmNzdHJpZGUsCis7IHZvaWQgZmZfcHV0X3ZwOF9lcGVsPHNpemU+X2g8aHRhcD52PHZ0YXA+XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRlc3RzdHJpZGUsCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY3N0cmlkZSwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgICBpbnQgbXgsIGludCBteSk7CiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC02NjQsNiArNjY0LDM3IEBACiBGSUxURVJfViA4CiAKICVtYWNybyBGSUxURVJfQklMSU5FQVIgMQorJWlmIGNwdWZsYWcoc3NzZTMpCitjZ2xvYmFsIHB1dF92cDhfYmlsaW5lYXIlMV92LCA3LCA3LCA1LCBkc3QsIGRzdHN0cmlkZSwgc3JjLCBzcmNzdHJpZGUsIGhlaWdodCwgcGljcmVnLCBteQorICAgIHNobCAgICAgIG15ZCwgNAorJWlmZGVmIFBJQworICAgIGxlYSAgcGljcmVncSwgW2JpbGluZWFyX2ZpbHRlcl92Yl9tXQorJWVuZGlmCisgICAgcHhvciAgICAgIG00LCBtNAorICAgIG1vdmEgICAgICBtMywgW2JpbGluZWFyX2ZpbHRlcl92YitteXEtMTZdCisubmV4dHJvdzoKKyAgICBtb3ZoICAgICAgbTAsIFtzcmNxK3NyY3N0cmlkZXEqMF0KKyAgICBtb3ZoICAgICAgbTEsIFtzcmNxK3NyY3N0cmlkZXEqMV0KKyAgICBtb3ZoICAgICAgbTIsIFtzcmNxK3NyY3N0cmlkZXEqMl0KKyAgICBwdW5wY2tsYncgbTAsIG0xCisgICAgcHVucGNrbGJ3IG0xLCBtMgorICAgIHBtYWRkdWJzdyBtMCwgbTMKKyAgICBwbWFkZHVic3cgbTEsIG0zCisgICAgcHNyYXcgICAgIG0wLCAyCisgICAgcHNyYXcgICAgIG0xLCAyCisgICAgcGF2Z3cgICAgIG0wLCBtNAorICAgIHBhdmd3ICAgICBtMSwgbTQKKyVpZiBtbXNpemU9PTgKKyAgICBwYWNrdXN3YiAgbTAsIG0wCisgICAgcGFja3Vzd2IgIG0xLCBtMQorICAgIG1vdmggICBbZHN0cStkc3RzdHJpZGVxKjBdLCBtMAorICAgIG1vdmggICBbZHN0cStkc3RzdHJpZGVxKjFdLCBtMQorJWVsc2UKKyAgICBwYWNrdXN3YiAgbTAsIG0xCisgICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMF0sIG0wCisgICAgbW92aHBzIFtkc3RxK2RzdHN0cmlkZXEqMV0sIG0wCislZW5kaWYKKyVlbHNlIDsgY3B1ZmxhZyhzc3NlMykKIGNnbG9iYWwgcHV0X3ZwOF9iaWxpbmVhciUxX3YsIDcsIDcsIDcsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBwaWNyZWcsIG15CiAgICAgc2hsICAgICAgbXlkLCA0CiAlaWZkZWYgUElDCkBAIC03MDEsNiArNzMyLDcgQEAKICAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSowXSwgbTAKICAgICBtb3ZocHMgW2RzdHErZHN0c3RyaWRlcSoxXSwgbTAKICVlbmRpZgorJWVuZGlmIDsgY3B1ZmxhZyhzc3NlMykKIAogICAgIGxlYSAgICAgZHN0cSwgW2RzdHErZHN0c3RyaWRlcSoyXQogICAgIGxlYSAgICAgc3JjcSwgW3NyY3Erc3Jjc3RyaWRlcSoyXQpAQCAtNzA4LDYgKzc0MCwzNyBAQAogICAgIGpnIC5uZXh0cm93CiAgICAgUkVQX1JFVAogCislaWYgY3B1ZmxhZyhzc3NlMykKK2NnbG9iYWwgcHV0X3ZwOF9iaWxpbmVhciUxX2gsIDYsIDYgKyBucGljcmVncywgNSwgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBwaWNyZWcKKyAgICBzaGwgICAgICBteGQsIDQKKyVpZmRlZiBQSUMKKyAgICBsZWEgIHBpY3JlZ3EsIFtiaWxpbmVhcl9maWx0ZXJfdmJfbV0KKyVlbmRpZgorICAgIHB4b3IgICAgICBtNCwgbTQKKyAgICBtb3ZhICAgICAgbTIsIFtmaWx0ZXJfaDJfc2h1Zl0KKyAgICBtb3ZhICAgICAgbTMsIFtiaWxpbmVhcl9maWx0ZXJfdmIrbXhxLTE2XQorLm5leHRyb3c6CisgICAgbW92dSAgICAgIG0wLCBbc3JjcStzcmNzdHJpZGVxKjBdCisgICAgbW92dSAgICAgIG0xLCBbc3JjcStzcmNzdHJpZGVxKjFdCisgICAgcHNodWZiICAgIG0wLCBtMgorICAgIHBzaHVmYiAgICBtMSwgbTIKKyAgICBwbWFkZHVic3cgbTAsIG0zCisgICAgcG1hZGR1YnN3IG0xLCBtMworICAgIHBzcmF3ICAgICBtMCwgMgorICAgIHBzcmF3ICAgICBtMSwgMgorICAgIHBhdmd3ICAgICBtMCwgbTQKKyAgICBwYXZndyAgICAgbTEsIG00CislaWYgbW1zaXplPT04CisgICAgcGFja3Vzd2IgIG0wLCBtMAorICAgIHBhY2t1c3diICBtMSwgbTEKKyAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSowXSwgbTAKKyAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSoxXSwgbTEKKyVlbHNlCisgICAgcGFja3Vzd2IgIG0wLCBtMQorICAgIG1vdmggICBbZHN0cStkc3RzdHJpZGVxKjBdLCBtMAorICAgIG1vdmhwcyBbZHN0cStkc3RzdHJpZGVxKjFdLCBtMAorJWVuZGlmCislZWxzZSA7IGNwdWZsYWcoc3NzZTMpCiBjZ2xvYmFsIHB1dF92cDhfYmlsaW5lYXIlMV9oLCA2LCA2ICsgbnBpY3JlZ3MsIDcsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBteCwgcGljcmVnCiAgICAgc2hsICAgICAgbXhkLCA0CiAlaWZkZWYgUElDCkBAIC03NDYsNiArODA5LDcgQEAKICAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSowXSwgbTAKICAgICBtb3ZocHMgW2RzdHErZHN0c3RyaWRlcSoxXSwgbTAKICVlbmRpZgorJWVuZGlmIDsgY3B1ZmxhZyhzc3NlMykKIAogICAgIGxlYSAgICAgZHN0cSwgW2RzdHErZHN0c3RyaWRlcSoyXQogICAgIGxlYSAgICAgc3JjcSwgW3NyY3Erc3Jjc3RyaWRlcSoyXQpAQCAtNzU4LDg1ICs4MjIsMTAgQEAKIEZJTFRFUl9CSUxJTkVBUiA0CiBJTklUX1hNTSBzc2UyCiBGSUxURVJfQklMSU5FQVIgOAotCi0lbWFjcm8gRklMVEVSX0JJTElORUFSX1NTU0UzIDEKLWNnbG9iYWwgcHV0X3ZwOF9iaWxpbmVhciUxX3YsIDcsIDcsIDUsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0LCBwaWNyZWcsIG15Ci0gICAgc2hsICAgICAgbXlkLCA0Ci0laWZkZWYgUElDCi0gICAgbGVhICBwaWNyZWdxLCBbYmlsaW5lYXJfZmlsdGVyX3ZiX21dCi0lZW5kaWYKLSAgICBweG9yICAgICAgbTQsIG00Ci0gICAgbW92YSAgICAgIG0zLCBbYmlsaW5lYXJfZmlsdGVyX3ZiK215cS0xNl0KLS5uZXh0cm93OgotICAgIG1vdmggICAgICBtMCwgW3NyY3Erc3Jjc3RyaWRlcSowXQotICAgIG1vdmggICAgICBtMSwgW3NyY3Erc3Jjc3RyaWRlcSoxXQotICAgIG1vdmggICAgICBtMiwgW3NyY3Erc3Jjc3RyaWRlcSoyXQotICAgIHB1bnBja2xidyBtMCwgbTEKLSAgICBwdW5wY2tsYncgbTEsIG0yCi0gICAgcG1hZGR1YnN3IG0wLCBtMwotICAgIHBtYWRkdWJzdyBtMSwgbTMKLSAgICBwc3JhdyAgICAgbTAsIDIKLSAgICBwc3JhdyAgICAgbTEsIDIKLSAgICBwYXZndyAgICAgbTAsIG00Ci0gICAgcGF2Z3cgICAgIG0xLCBtNAotJWlmIG1tc2l6ZT09OAotICAgIHBhY2t1c3diICBtMCwgbTAKLSAgICBwYWNrdXN3YiAgbTEsIG0xCi0gICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMF0sIG0wCi0gICAgbW92aCAgIFtkc3RxK2RzdHN0cmlkZXEqMV0sIG0xCi0lZWxzZQotICAgIHBhY2t1c3diICBtMCwgbTEKLSAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSowXSwgbTAKLSAgICBtb3ZocHMgW2RzdHErZHN0c3RyaWRlcSoxXSwgbTAKLSVlbmRpZgotCi0gICAgbGVhICAgICBkc3RxLCBbZHN0cStkc3RzdHJpZGVxKjJdCi0gICAgbGVhICAgICBzcmNxLCBbc3JjcStzcmNzdHJpZGVxKjJdCi0gICAgc3ViICBoZWlnaHRkLCAyCi0gICAgamcgLm5leHRyb3cKLSAgICBSRVBfUkVUCi0KLWNnbG9iYWwgcHV0X3ZwOF9iaWxpbmVhciUxX2gsIDYsIDYgKyBucGljcmVncywgNSwgZHN0LCBkc3RzdHJpZGUsIHNyYywgc3Jjc3RyaWRlLCBoZWlnaHQsIG14LCBwaWNyZWcKLSAgICBzaGwgICAgICBteGQsIDQKLSVpZmRlZiBQSUMKLSAgICBsZWEgIHBpY3JlZ3EsIFtiaWxpbmVhcl9maWx0ZXJfdmJfbV0KLSVlbmRpZgotICAgIHB4b3IgICAgICBtNCwgbTQKLSAgICBtb3ZhICAgICAgbTIsIFtmaWx0ZXJfaDJfc2h1Zl0KLSAgICBtb3ZhICAgICAgbTMsIFtiaWxpbmVhcl9maWx0ZXJfdmIrbXhxLTE2XQotLm5leHRyb3c6Ci0gICAgbW92dSAgICAgIG0wLCBbc3JjcStzcmNzdHJpZGVxKjBdCi0gICAgbW92dSAgICAgIG0xLCBbc3JjcStzcmNzdHJpZGVxKjFdCi0gICAgcHNodWZiICAgIG0wLCBtMgotICAgIHBzaHVmYiAgICBtMSwgbTIKLSAgICBwbWFkZHVic3cgbTAsIG0zCi0gICAgcG1hZGR1YnN3IG0xLCBtMwotICAgIHBzcmF3ICAgICBtMCwgMgotICAgIHBzcmF3ICAgICBtMSwgMgotICAgIHBhdmd3ICAgICBtMCwgbTQKLSAgICBwYXZndyAgICAgbTEsIG00Ci0laWYgbW1zaXplPT04Ci0gICAgcGFja3Vzd2IgIG0wLCBtMAotICAgIHBhY2t1c3diICBtMSwgbTEKLSAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSowXSwgbTAKLSAgICBtb3ZoICAgW2RzdHErZHN0c3RyaWRlcSoxXSwgbTEKLSVlbHNlCi0gICAgcGFja3Vzd2IgIG0wLCBtMQotICAgIG1vdmggICBbZHN0cStkc3RzdHJpZGVxKjBdLCBtMAotICAgIG1vdmhwcyBbZHN0cStkc3RzdHJpZGVxKjFdLCBtMAotJWVuZGlmCi0KLSAgICBsZWEgICAgIGRzdHEsIFtkc3RxK2RzdHN0cmlkZXEqMl0KLSAgICBsZWEgICAgIHNyY3EsIFtzcmNxK3NyY3N0cmlkZXEqMl0KLSAgICBzdWIgIGhlaWdodGQsIDIKLSAgICBqZyAubmV4dHJvdwotICAgIFJFUF9SRVQKLSVlbmRtYWNybwotCiBJTklUX01NWCBzc3NlMwotRklMVEVSX0JJTElORUFSX1NTU0UzIDQKK0ZJTFRFUl9CSUxJTkVBUiA0CiBJTklUX1hNTSBzc3NlMwotRklMVEVSX0JJTElORUFSX1NTU0UzIDgKK0ZJTFRFUl9CSUxJTkVBUiA4CiAKIElOSVRfTU1YIG1teAogY2dsb2JhbCBwdXRfdnA4X3BpeGVsczgsIDUsIDUsIDAsIGRzdCwgZHN0c3RyaWRlLCBzcmMsIHNyY3N0cmlkZSwgaGVpZ2h0CkBAIC04ODQsNyArODczLDcgQEAKICAgICBSRVBfUkVUCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZF88b3B0Pih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBpbnQgc3RyaWRlKTsKKzsgdm9pZCBmZl92cDhfaWRjdF9kY19hZGRfPG9wdD4odWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwgcHRyZGlmZl90IHN0cmlkZSk7CiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogJW1hY3JvIEFERF9EQyA0CkBAIC05MDYsNiArODk1LDcgQEAKICAgICAlNCBbZHN0MnErc3RyaWRlcSslM10sIG01CiAlZW5kbWFjcm8KIAorJWlmIEFSQ0hfWDg2XzMyCiBJTklUX01NWCBtbXgKIGNnbG9iYWwgdnA4X2lkY3RfZGNfYWRkLCAzLCAzLCAwLCBkc3QsIGJsb2NrLCBzdHJpZGUKICAgICA7IGxvYWQgZGF0YQpAQCAtOTI5LDggKzkxOSw5IEBACiAgICAgbGVhICAgICBkc3QycSwgW2RzdDFxK3N0cmlkZXEqMl0KICAgICBBRERfREMgICAgIG0wLCBtMSwgMCwgbW92aAogICAgIFJFVAorJWVuZGlmCiAKLUlOSVRfWE1NIHNzZTQKKyVtYWNybyBWUDhfSURDVF9EQ19BREQgMAogY2dsb2JhbCB2cDhfaWRjdF9kY19hZGQsIDMsIDMsIDYsIGRzdCwgYmxvY2ssIHN0cmlkZQogICAgIDsgbG9hZCBkYXRhCiAgICAgbW92ZCAgICAgICBtMCwgW2Jsb2NrcV0KQEAgLTk1NiwxMyArOTQ3LDI4IEBACiAgICAgcGFkZHcgICAgICBtNCwgbTAKICAgICBwYWNrdXN3YiAgIG0yLCBtNAogICAgIG1vdmQgICBbZHN0MXFdLCBtMgorJWlmIGNwdWZsYWcoc3NlNCkKICAgICBwZXh0cmQgW2RzdDFxK3N0cmlkZXFdLCBtMiwgMQogICAgIHBleHRyZCBbZHN0MnFdLCBtMiwgMgogICAgIHBleHRyZCBbZHN0MnErc3RyaWRlcV0sIG0yLCAzCislZWxzZQorICAgIHBzcmxkcSAgICAgbTIsIDQKKyAgICBtb3ZkIFtkc3QxcStzdHJpZGVxXSwgbTIKKyAgICBwc3JsZHEgICAgIG0yLCA0CisgICAgbW92ZCBbZHN0MnFdLCBtMgorICAgIHBzcmxkcSAgICAgbTIsIDQKKyAgICBtb3ZkIFtkc3QycStzdHJpZGVxXSwgbTIKKyVlbmRpZgogICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK1ZQOF9JRENUX0RDX0FERAorSU5JVF9YTU0gc3NlNAorVlA4X0lEQ1RfRENfQURECiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZDR5XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIGludCBzdHJpZGUpOworOyB2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZDR5XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOwogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICVpZiBBUkNIX1g4Nl8zMgpAQCAtMTAzNSw3ICsxMDQxLDcgQEAKICAgICBSRVQKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkNHV2XzxvcHQ+KHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIGludCBzdHJpZGUpOworOyB2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZDR1dl88b3B0Pih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbNF1bMTZdLCBwdHJkaWZmX3Qgc3RyaWRlKTsKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBJTklUX01NWCBtbXgKQEAgLTEwNzcsNyArMTA4Myw3IEBACiAgICAgUkVUCiAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyB2b2lkIGZmX3ZwOF9pZGN0X2FkZF88b3B0Pih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLCBpbnQgc3RyaWRlKTsKKzsgdm9pZCBmZl92cDhfaWRjdF9hZGRfPG9wdD4odWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwgcHRyZGlmZl90IHN0cmlkZSk7CiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogOyBjYWxjdWxhdGUgJTE9bXVsXzM1NDY4KCUxKS1tdWxfMjAwOTEoJTIpOyAlMj1tdWxfMjAwOTEoJTEpK211bF8zNTQ2OCglMikKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3ZwOGRzcF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni92cDhkc3BfaW5pdC5jCmluZGV4IDhkNWQwMzMuLjM5N2IyNTEgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwOGRzcF9pbml0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvdnA4ZHNwX2luaXQuYwpAQCAtMjMsMTEgKzIzLDEwIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwOGRzcC5oIgogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KIAogLyoKICAqIE1DIGZ1bmN0aW9ucwpAQCAtMjM0LDYgKzIzMyw4IEBACiAKIHZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkX21teCh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUpOwordm9pZCBmZl92cDhfaWRjdF9kY19hZGRfc3NlMih1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc3RyaWRlKTsKIHZvaWQgZmZfdnA4X2lkY3RfZGNfYWRkX3NzZTQodWludDhfdCAqZHN0LCBpbnQxNl90IGJsb2NrWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSk7CiB2b2lkIGZmX3ZwOF9pZGN0X2RjX2FkZDR5X21teCh1aW50OF90ICpkc3QsIGludDE2X3QgYmxvY2tbNF1bMTZdLApAQCAtMjg5LDcgKzI5MCw3IEBACiBERUNMQVJFX0xPT1BfRklMVEVSKHNzc2UzKQogREVDTEFSRV9MT09QX0ZJTFRFUihzc2U0KQogCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIAogI2RlZmluZSBWUDhfTFVNQV9NQ19GVU5DKElEWCwgU0laRSwgT1BUKSBcCiAgICAgYy0+cHV0X3ZwOF9lcGVsX3BpeGVsc190YWJbSURYXVswXVsyXSA9IGZmX3B1dF92cDhfZXBlbCAjIyBTSVpFICMjIF9oNl8gIyMgT1BUOyBcCkBAIC0zMTcsNyArMzE4LDcgQEAKIAogYXZfY29sZCB2b2lkIGZmX3ZwNzhkc3BfaW5pdF94ODYoVlA4RFNQQ29udGV4dCAqYykKIHsKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKICAgICBpZiAoRVhURVJOQUxfTU1YKGNwdV9mbGFncykpIHsKQEAgLTM0Nyw3ICszNDgsNyBAQAogICAgICAgICBjLT5wdXRfdnA4X2JpbGluZWFyX3BpeGVsc190YWJbMF1bMF1bMF0gPSBmZl9wdXRfdnA4X3BpeGVsczE2X3NzZTsKICAgICB9CiAKLSAgICBpZiAoSEFWRV9TU0UyX0VYVEVSTkFMICYmIGNwdV9mbGFncyAmIChBVl9DUFVfRkxBR19TU0UyIHwgQVZfQ1BVX0ZMQUdfU1NFMlNMT1cpKSB7CisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSB8fCBFWFRFUk5BTF9TU0UyX1NMT1coY3B1X2ZsYWdzKSkgewogICAgICAgICBWUDhfTFVNQV9NQ19GVU5DKDAsIDE2LCBzc2UyKTsKICAgICAgICAgVlA4X01DX0ZVTkMoMSwgOCwgc3NlMik7CiAgICAgICAgIFZQOF9CSUxJTkVBUl9NQ19GVU5DKDAsIDE2LCBzc2UyKTsKQEAgLTM2MiwxOCArMzYzLDE4IEBACiAgICAgICAgIFZQOF9CSUxJTkVBUl9NQ19GVU5DKDEsIDgsIHNzc2UzKTsKICAgICAgICAgVlA4X0JJTElORUFSX01DX0ZVTkMoMiwgNCwgc3NzZTMpOwogICAgIH0KLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogfQogCiBhdl9jb2xkIHZvaWQgZmZfdnA4ZHNwX2luaXRfeDg2KFZQOERTUENvbnRleHQgKmMpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7Ci0gICAgICAgIGMtPnZwOF9pZGN0X2RjX2FkZCAgICA9IGZmX3ZwOF9pZGN0X2RjX2FkZF9tbXg7CiAgICAgICAgIGMtPnZwOF9pZGN0X2RjX2FkZDR1diA9IGZmX3ZwOF9pZGN0X2RjX2FkZDR1dl9tbXg7CiAjaWYgQVJDSF9YODZfMzIKKyAgICAgICAgYy0+dnA4X2lkY3RfZGNfYWRkICAgID0gZmZfdnA4X2lkY3RfZGNfYWRkX21teDsKICAgICAgICAgYy0+dnA4X2lkY3RfZGNfYWRkNHkgID0gZmZfdnA4X2lkY3RfZGNfYWRkNHlfbW14OwogICAgICAgICBjLT52cDhfaWRjdF9hZGQgICAgICAgPSBmZl92cDhfaWRjdF9hZGRfbW14OwogICAgICAgICBjLT52cDhfbHVtYV9kY193aHQgICAgPSBmZl92cDhfbHVtYV9kY193aHRfbW14OwpAQCAtNDE3LDcgKzQxOCw3IEBACiAgICAgICAgIGMtPnZwOF9sdW1hX2RjX3dodCAgICAgICAgICAgICAgICAgICAgICA9IGZmX3ZwOF9sdW1hX2RjX3dodF9zc2U7CiAgICAgfQogCi0gICAgaWYgKEhBVkVfU1NFMl9FWFRFUk5BTCAmJiBjcHVfZmxhZ3MgJiAoQVZfQ1BVX0ZMQUdfU1NFMiB8IEFWX0NQVV9GTEFHX1NTRTJTTE9XKSkgeworICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykgfHwgRVhURVJOQUxfU1NFMl9TTE9XKGNwdV9mbGFncykpIHsKICAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlID0gZmZfdnA4X3ZfbG9vcF9maWx0ZXJfc2ltcGxlX3NzZTI7CiAKICAgICAgICAgYy0+dnA4X3ZfbG9vcF9maWx0ZXIxNnlfaW5uZXIgPSBmZl92cDhfdl9sb29wX2ZpbHRlcjE2eV9pbm5lcl9zc2UyOwpAQCAtNDI4LDYgKzQyOSw3IEBACiAgICAgfQogCiAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBjLT52cDhfaWRjdF9kY19hZGQgICAgICAgICAgICA9IGZmX3ZwOF9pZGN0X2RjX2FkZF9zc2UyOwogICAgICAgICBjLT52cDhfaWRjdF9kY19hZGQ0eSAgICAgICAgICA9IGZmX3ZwOF9pZGN0X2RjX2FkZDR5X3NzZTI7CiAKICAgICAgICAgYy0+dnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlICAgPSBmZl92cDhfaF9sb29wX2ZpbHRlcl9zaW1wbGVfc3NlMjsKQEAgLTQ2MSw1ICs0NjMsNSBAQAogICAgICAgICBjLT52cDhfaF9sb29wX2ZpbHRlcjE2eSAgICAgICA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyMTZ5X21iZWRnZV9zc2U0OwogICAgICAgICBjLT52cDhfaF9sb29wX2ZpbHRlcjh1diAgICAgICA9IGZmX3ZwOF9oX2xvb3BfZmlsdGVyOHV2X21iZWRnZV9zc2U0OwogICAgIH0KLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdnA4ZHNwX2xvb3BmaWx0ZXIuYXNtIGIvbGliYXZjb2RlYy94ODYvdnA4ZHNwX2xvb3BmaWx0ZXIuYXNtCmluZGV4IDk4YmI2NjkuLmNhZWI0MDUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwOGRzcF9sb29wZmlsdGVyLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni92cDhkc3BfbG9vcGZpbHRlci5hc20KQEAgLTQzLDcgKzQzLDcgQEAKIFNFQ1RJT04gLnRleHQKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfdnA4X2gvdl9sb29wX2ZpbHRlcl9zaW1wbGVfPG9wdD4odWludDhfdCAqZHN0LCBpbnQgc3RyaWRlLCBpbnQgZmxpbSk7Cis7IHZvaWQgZmZfdnA4X2gvdl9sb29wX2ZpbHRlcl9zaW1wbGVfPG9wdD4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgZmxpbSk7CiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogOyBtYWNybyBjYWxsZWQgd2l0aCA3IG1tIHJlZ2lzdGVyIGluZGV4ZXMgYXMgYXJndW1lbnQsIGFuZCA0IHJlZ3VsYXIgcmVnaXN0ZXJzCkBAIC00MjksNyArNDI5LDcgQEAKIFNJTVBMRV9MT09QRklMVEVSIGgsIDUKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfdnA4X2gvdl9sb29wX2ZpbHRlcjxzaXplPl9pbm5lcl88b3B0Pih1aW50OF90ICpkc3QsIFt1aW50OF90ICp2LF0gaW50IHN0cmlkZSwKKzsgdm9pZCBmZl92cDhfaC92X2xvb3BfZmlsdGVyPHNpemU+X2lubmVyXzxvcHQ+KHVpbnQ4X3QgKmRzdCwgW3VpbnQ4X3QgKnYsXSBwdHJkaWZmX3Qgc3RyaWRlLAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsaW1FLCBpbnQgZmxpbUksIGludCBoZXZfdGhyKTsKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC05MjEsNyArOTIxLDcgQEAKIElOTkVSX0xPT1BGSUxURVIgaCwgIDgKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IHZvaWQgZmZfdnA4X2gvdl9sb29wX2ZpbHRlcjxzaXplPl9tYmVkZ2VfPG9wdD4odWludDhfdCAqZHN0LCBbdWludDhfdCAqdixdIGludCBzdHJpZGUsCis7IHZvaWQgZmZfdnA4X2gvdl9sb29wX2ZpbHRlcjxzaXplPl9tYmVkZ2VfPG9wdD4odWludDhfdCAqZHN0LCBbdWludDhfdCAqdixdIHB0cmRpZmZfdCBzdHJpZGUsCiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsaW1FLCBpbnQgZmxpbUksIGludCBoZXZfdGhyKTsKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni92cDlkc3BfaW5pdC5jIGIvbGliYXZjb2RlYy94ODYvdnA5ZHNwX2luaXQuYwppbmRleCA0NjlhNjYxLi44MzdjY2U4IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni92cDlkc3BfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L3ZwOWRzcF9pbml0LmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlICJsaWJhdmNvZGVjL3ZwOWRzcC5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMveDg2L3ZwOWRzcF9pbml0LmgiCiAKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogCiBkZWNsX2ZwZWxfZnVuYyhwdXQsICA0LCAgICwgbW14KTsKIGRlY2xfZnBlbF9mdW5jKHB1dCwgIDgsICAgLCBtbXgpOwpAQCAtMTE0LDYgKzExNCw4IEBACiBpdHhmbV9mdW5jKGlkY3QsIGlkY3QsIDMyLCBzc3NlMyk7CiBpdHhmbV9mdW5jKGlkY3QsIGlkY3QsIDMyLCBhdngpOwogaXR4Zm1fZnVuYyhpd2h0LCBpd2h0LCA0LCBtbXgpOworaXR4Zm1fZnVuY3MoMTYsIGF2eDIpOworaXR4Zm1fZnVuYyhpZGN0LCBpZGN0LCAzMiwgYXZ4Mik7CiAKICN1bmRlZiBpdHhmbV9mdW5jCiAjdW5kZWYgaXR4Zm1fZnVuY3MKQEAgLTEyNCw2ICsxMjYsOCBAQAogdm9pZCBmZl92cDlfbG9vcF9maWx0ZXJfaF8jI3NpemUxIyNfIyNzaXplMiMjXyMjb3B0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBFLCBpbnQgSSwgaW50IEgpCiAKK2xwZl9mdW5jcyg0LCA4LCBtbXhleHQpOworbHBmX2Z1bmNzKDgsIDgsIG1teGV4dCk7CiBscGZfZnVuY3MoMTYsIDE2LCBzc2UyKTsKIGxwZl9mdW5jcygxNiwgMTYsIHNzc2UzKTsKIGxwZl9mdW5jcygxNiwgMTYsIGF2eCk7CkBAIC0yMDgsMTEgKzIxMiwxMSBAQAogI3VuZGVmIGlwcmVkX2Rpcl90bV9mdW5jcwogI3VuZGVmIGlwcmVkX2RjX2Z1bmNzCiAKLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogCiBhdl9jb2xkIHZvaWQgZmZfdnA5ZHNwX2luaXRfeDg2KFZQOURTUENvbnRleHQgKmRzcCwgaW50IGJwcCwgaW50IGJpdGV4YWN0KQogewotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAgICAgaW50IGNwdV9mbGFnczsKIAogICAgIGlmIChicHAgPT0gMTApIHsKQEAgLTI3OSw2ICsyODMsMTAgQEAKICAgICB9CiAKICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpIHsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzBdWzBdID0gZmZfdnA5X2xvb3BfZmlsdGVyX2hfNF84X21teGV4dDsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzBdWzFdID0gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfNF84X21teGV4dDsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzFdWzBdID0gZmZfdnA5X2xvb3BfZmlsdGVyX2hfOF84X21teGV4dDsKKyAgICAgICAgZHNwLT5sb29wX2ZpbHRlcl84WzFdWzFdID0gZmZfdnA5X2xvb3BfZmlsdGVyX3ZfOF84X21teGV4dDsKICAgICAgICAgaW5pdF9zdWJwZWwyKDQsIDAsIDQsIHB1dCwgOCwgbW14ZXh0KTsKICAgICAgICAgaW5pdF9zdWJwZWwyKDQsIDEsIDQsIGF2ZywgOCwgbW14ZXh0KTsKICAgICAgICAgaW5pdF9mcGVsX2Z1bmMoNCwgMSwgIDQsIGF2ZywgXzgsIG1teGV4dCk7CkBAIC0zODIsNiArMzkwLDE0IEBACiAgICAgICAgIGluaXRfZnBlbF9mdW5jKDAsIDEsIDY0LCBhdmcsIF84LCBhdngyKTsKICAgICAgICAgaWYgKEFSQ0hfWDg2XzY0KSB7CiAjaWYgQVJDSF9YODZfNjQgJiYgSEFWRV9BVlgyX0VYVEVSTkFMCisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF8xNlgxNl1bRENUX0RDVF0gPSBmZl92cDlfaWRjdF9pZGN0XzE2eDE2X2FkZF9hdngyOworICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMTZYMTZdW0FEU1RfRENUXSAgPSBmZl92cDlfaWRjdF9pYWRzdF8xNngxNl9hZGRfYXZ4MjsKKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzE2WDE2XVtEQ1RfQURTVF0gID0gZmZfdnA5X2lhZHN0X2lkY3RfMTZ4MTZfYWRkX2F2eDI7CisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF8xNlgxNl1bQURTVF9BRFNUXSA9IGZmX3ZwOV9pYWRzdF9pYWRzdF8xNngxNl9hZGRfYXZ4MjsKKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzMyWDMyXVtBRFNUX0FEU1RdID0KKyAgICAgICAgICAgIGRzcC0+aXR4Zm1fYWRkW1RYXzMyWDMyXVtBRFNUX0RDVF0gPQorICAgICAgICAgICAgZHNwLT5pdHhmbV9hZGRbVFhfMzJYMzJdW0RDVF9BRFNUXSA9CisgICAgICAgICAgICBkc3AtPml0eGZtX2FkZFtUWF8zMlgzMl1bRENUX0RDVF0gPSBmZl92cDlfaWRjdF9pZGN0XzMyeDMyX2FkZF9hdngyOwogICAgICAgICAgICAgaW5pdF9zdWJwZWwzXzMyXzY0KDAsIHB1dCwgOCwgYXZ4Mik7CiAgICAgICAgICAgICBpbml0X3N1YnBlbDNfMzJfNjQoMSwgYXZnLCA4LCBhdngyKTsKICNlbmRpZgpAQCAtMzk2LDUgKzQxMiw1IEBACiAjdW5kZWYgaW5pdF9zdWJwZWwyCiAjdW5kZWYgaW5pdF9zdWJwZWwzCiAKLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdnA5ZHNwX2luaXRfMTZicHAuYyBiL2xpYmF2Y29kZWMveDg2L3ZwOWRzcF9pbml0XzE2YnBwLmMKaW5kZXggZWI2NzQ5OS4uNjBkMTBhMSAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYvdnA5ZHNwX2luaXRfMTZicHAuYworKysgYi9saWJhdmNvZGVjL3g4Ni92cDlkc3BfaW5pdF8xNmJwcC5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy92cDlkc3AuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL3g4Ni92cDlkc3BfaW5pdC5oIgogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KIAogZGVjbF9mcGVsX2Z1bmMocHV0LCAgIDgsICAgICwgbW14KTsKIGRlY2xfZnBlbF9mdW5jKGF2ZywgICA4LCBfMTYsIG1teGV4dCk7CkBAIC01MSw2ICs1MSwxMCBAQAogZGVjbF9pcHJlZF9mbnMoZGMsICAgICAgMTYsIG1teGV4dCwgc3NlMik7CiBkZWNsX2lwcmVkX2ZucyhkY190b3AsICAxNiwgbW14ZXh0LCBzc2UyKTsKIGRlY2xfaXByZWRfZm5zKGRjX2xlZnQsIDE2LCBtbXhleHQsIHNzZTIpOworZGVjbF9pcHJlZF9mbihkbCwgICAgICAgMTYsICAgICAxNiwgYXZ4Mik7CitkZWNsX2lwcmVkX2ZuKGRsLCAgICAgICAzMiwgICAgIDE2LCBhdngyKTsKK2RlY2xfaXByZWRfZm4oZHIsICAgICAgIDE2LCAgICAgMTYsIGF2eDIpOworZGVjbF9pcHJlZF9mbihkciwgICAgICAgMzIsICAgICAxNiwgYXZ4Mik7CiAKICNkZWZpbmUgZGVjbF9pcHJlZF9kaXJfZnVuY3ModHlwZSkgXAogZGVjbF9pcHJlZF9mbnModHlwZSwgMTYsIHNzZTIsICBzc2UyKTsgXApAQCAtNjMsMTEgKzY3LDExIEBACiBkZWNsX2lwcmVkX2Rpcl9mdW5jcyh2cik7CiBkZWNsX2lwcmVkX2Rpcl9mdW5jcyhodSk7CiBkZWNsX2lwcmVkX2Rpcl9mdW5jcyhoZCk7Ci0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIAogYXZfY29sZCB2b2lkIGZmX3ZwOWRzcF9pbml0XzE2YnBwX3g4NihWUDlEU1BDb250ZXh0ICpkc3ApCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CkBAIC0xMzMsNyArMTM3LDEzIEBACiAgICAgICAgIGluaXRfZnBlbF9mdW5jKDIsIDEsICAzMiwgYXZnLCBfMTYsIGF2eDIpOwogICAgICAgICBpbml0X2ZwZWxfZnVuYygxLCAxLCAgNjQsIGF2ZywgXzE2LCBhdngyKTsKICAgICAgICAgaW5pdF9mcGVsX2Z1bmMoMCwgMSwgMTI4LCBhdmcsIF8xNiwgYXZ4Mik7CisgICAgICAgIGluaXRfaXByZWRfZnVuYyhkbCwgRElBR19ET1dOX0xFRlQsIDE2LCAxNiwgYXZ4Mik7CisgICAgICAgIGluaXRfaXByZWRfZnVuYyhkbCwgRElBR19ET1dOX0xFRlQsIDMyLCAxNiwgYXZ4Mik7CisgICAgICAgIGluaXRfaXByZWRfZnVuYyhkciwgRElBR19ET1dOX1JJR0hULCAxNiwgMTYsIGF2eDIpOworI2lmIEFSQ0hfWDg2XzY0CisgICAgICAgIGluaXRfaXByZWRfZnVuYyhkciwgRElBR19ET1dOX1JJR0hULCAzMiwgMTYsIGF2eDIpOworI2VuZGlmCiAgICAgfQogCi0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3ZwOWRzcF9pbml0XzE2YnBwX3RlbXBsYXRlLmMgYi9saWJhdmNvZGVjL3g4Ni92cDlkc3BfaW5pdF8xNmJwcF90ZW1wbGF0ZS5jCmluZGV4IDQ4NDBiMjguLmI1NmFmYzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwOWRzcF9pbml0XzE2YnBwX3RlbXBsYXRlLmMKKysrIGIvbGliYXZjb2RlYy94ODYvdnA5ZHNwX2luaXRfMTZicHBfdGVtcGxhdGUuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgImxpYmF2Y29kZWMvdnA5ZHNwLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy94ODYvdnA5ZHNwX2luaXQuaCIKIAotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAKIGV4dGVybiBjb25zdCBpbnQxNl90IGZmX2ZpbHRlcnNfMTZicHBbM11bMTVdWzRdWzE2XTsKIApAQCAtMTM3LDExICsxMzcsMTEgQEAKIGRlY2xfaXR4Zm1fZnVuY3MoOCwgQlBDLCBzc2UyKTsKIGRlY2xfaXR4Zm1fZnVuY3MoMTYsIEJQQywgc3NlMik7CiBkZWNsX2l0eGZtX2Z1bmMoaWRjdCwgIGlkY3QsIDMyLCBCUEMsIHNzZTIpOwotI2VuZGlmIC8qIEhBVkVfWUFTTSAqLworI2VuZGlmIC8qIEhBVkVfWDg2QVNNICovCiAKIGF2X2NvbGQgdm9pZCBJTklUX0ZVTkMoVlA5RFNQQ29udGV4dCAqZHNwLCBpbnQgYml0ZXhhY3QpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAjZGVmaW5lIGluaXRfbHBmXzhfZnVuYyhpZHgxLCBpZHgyLCBkaXIsIHdkLCBicHAsIG9wdCkgXApAQCAtMjM0LDcgKzIzNCw3IEBACiAjZW5kaWYKICAgICB9CiAKLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogCiAgICAgZmZfdnA5ZHNwX2luaXRfMTZicHBfeDg2KGRzcCk7CiB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni92cDlpbnRyYXByZWRfMTZicHAuYXNtIGIvbGliYXZjb2RlYy94ODYvdnA5aW50cmFwcmVkXzE2YnBwLmFzbQppbmRleCBjMGFjMTZkLi4zMmI2OTgyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni92cDlpbnRyYXByZWRfMTZicHAuYXNtCisrKyBiL2xpYmF2Y29kZWMveDg2L3ZwOWludHJhcHJlZF8xNmJwcC5hc20KQEAgLTg0Nyw2ICs4NDcsMTA4IEBACiBJTklUX1hNTSBhdngKIERMX0ZVTkNTCiAKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK2NnbG9iYWwgdnA5X2lwcmVkX2RsXzE2eDE2XzE2LCAyLCA0LCA1LCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmlmbmlkbiAgICAgICAgICAgICAgIGFxLCBhbXAKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2FxXSAgICAgICAgICAgICAgICAgICA7IGFiY2RlZmdoaWprbG1ub3AKKyAgICB2cGJyb2FkY2FzdHcgICAgICAgICAgIHhtMSwgW2FxKzMwXSAgICAgICAgICAgICAgICA7IHBwcHBwcHBwCisgICAgdnBlcm0yaTEyOCAgICAgICAgICAgICAgbTIsIG0wLCBtMSwgcTAyMDEgICAgICAgICAgOyBpamtsbW5vcHBwcHBwcHBwCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTMsIG0yLCBtMCwgMiAgICAgICAgICAgICAgOyBiY2RlZmdoaWprbG1ub3BwCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTQsIG0yLCBtMCwgNCAgICAgICAgICAgICAgOyBjZGVmZ2hpamtsbW5vcHBwCisgICAgTE9XUEFTUyAgICAgICAgICAgICAgICAgIDAsICAzLCAgNCAgICAgICAgICAgICAgICAgOyBCQ0RFRkdISUpLTE1OT1BwCisgICAgdnBlcm0yaTEyOCAgICAgICAgICAgICAgbTIsIG0wLCBtMSwgcTAyMDEgICAgICAgICAgOyBKS0xNTk9QcHBwcHBwcHBwCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIHN0cmlkZTMsIGNudAorICAgIG1vdiAgICAgICAgICAgICAgICAgICBjbnRkLCAyCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisKKy5sb29wOgorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtMAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG0zLCBtMiwgbTAsIDIKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNCwgbTIsIG0wLCA0CisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMV0sIG0zCisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMl0sIG00CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTMsIG0yLCBtMCwgNgorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG00LCBtMiwgbTAsIDgKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlM3EgXSwgbTMKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGVxKjBdLCBtNAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG0zLCBtMiwgbTAsIDEwCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTQsIG0yLCBtMCwgMTIKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoxXSwgbTMKKyAgICBtb3ZhICAgICAgW2RzdHErc3RyaWRlcSoyXSwgbTQKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtMywgbTIsIG0wLCAxNAorICAgIG1vdmEgICAgICBbZHN0cStzdHJpZGUzcSBdLCBtMworICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIG0yCisgICAgdnBlcm0yaTEyOCAgICAgICAgICAgICAgbTIsIG0yLCBtMiwgcTAxMDEgICAgICAgICAgOyBwcHBwcHBwcHBwcHBwcHBwCisgICAgZGVjICAgICAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorCitjZ2xvYmFsIHZwOV9pcHJlZF9kbF8zMngzMl8xNiwgMiwgNiwgNywgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZpZm5pZG4gICAgICAgICAgICAgICBhcSwgYW1wCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTAsIFthcSttbXNpemUqMCsgMF0gICAgICAgOyBhYmNkZWZnaGlqa2xtbm9wCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTEsIFthcSttbXNpemUqMSsgMF0gICAgICAgOyBxcnN0dXZ3eHl6MDEyMzQ1CisgICAgdnBicm9hZGNhc3R3ICAgICAgICAgICB4bTQsIFthcSttbXNpemUqMSszMF0gICAgICAgOyA1NTU1NTU1NQorICAgIHZwZXJtMmkxMjggICAgICAgICAgICAgIG01LCBtMCwgbTEsIHEwMjAxICAgICAgICAgIDsgaWprbG1ub3BxcnN0dXZ3eAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG0yLCBtNSwgbTAsIDIgICAgICAgICAgICAgIDsgYmNkZWZnaGlqa2xtbm9wcQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG0zLCBtNSwgbTAsIDQgICAgICAgICAgICAgIDsgY2RlZmdoaWprbG1ub3BxcgorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAwLCAgMiwgIDMgICAgICAgICAgICAgICAgIDsgQkNERUZHSElKS0xNTk9QUQorICAgIHZwZXJtMmkxMjggICAgICAgICAgICAgIG01LCBtMSwgbTQsIHEwMjAxICAgICAgICAgIDsgeXowMTIzNDU1NTU1NTU1NQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG0yLCBtNSwgbTEsIDIgICAgICAgICAgICAgIDsgcnN0dXZ3eHl6MDEyMzQ1NQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG0zLCBtNSwgbTEsIDQgICAgICAgICAgICAgIDsgc3R1dnd4eXowMTIzNDU1NQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAxLCAgMiwgIDMgICAgICAgICAgICAgICAgIDsgUlNUVVZXWFlaLi4uLi4uNQorICAgIHZwZXJtMmkxMjggICAgICAgICAgICAgIG0yLCBtMSwgbTQsIHEwMjAxICAgICAgICAgIDsgWi4uLi4uLjU1NTU1NTU1NQorICAgIHZwZXJtMmkxMjggICAgICAgICAgICAgIG01LCBtMCwgbTEsIHEwMjAxICAgICAgICAgIDsgSktMTU5PUFFSU1RVVldYWQorICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgY250ZCwgNAorCisubG9vcDoKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSowICsgMF0sIG0wCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMCArMzJdLCBtMQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCAyCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtMiwgbTEsIDIKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoxICsgMF0sIG0zCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMSArMzJdLCBtNAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCA0CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtMiwgbTEsIDQKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoyICsgMF0sIG0zCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMiArMzJdLCBtNAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCA2CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtMiwgbTEsIDYKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlM3EqMSsgMF0sIG0zCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZTNxKjErMzJdLCBtNAorICAgIGxlYSAgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErc3RyaWRlcSo0XQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCA4CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtMiwgbTEsIDgKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSowICsgMF0sIG0zCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMCArMzJdLCBtNAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCAxMAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgICBtNCwgbTIsIG0xLCAxMAorICAgIG1vdmEgICBbZHN0cStzdHJpZGVxKjEgKyAwXSwgbTMKKyAgICBtb3ZhICAgW2RzdHErc3RyaWRlcSoxICszMl0sIG00CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtNSwgbTAsIDEyCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtMiwgbTEsIDEyCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMisgMF0sIG0zCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZXEqMiszMl0sIG00CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtNSwgbTAsIDE0CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtMiwgbTEsIDE0CisgICAgbW92YSAgIFtkc3RxK3N0cmlkZTNxKyAgMF0sIG0zCisgICAgbW92YSAgIFtkc3RxK3N0cmlkZTNxKyAzMl0sIG00CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG0zLCBtNSwgbTAsIDE2CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgIG00LCBtMiwgbTEsIDE2CisgICAgdnBlcm0yaTEyOCAgICAgICAgICAgICAgIG01LCBtMywgbTQsIHEwMjAxCisgICAgdnBlcm0yaTEyOCAgICAgICAgICAgICAgIG0yLCBtNCwgbTQsIHEwMTAxCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgIG0wLCBtMworICAgIG1vdmEgICAgICAgICAgICAgICAgICAgICBtMSwgbTQKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxK3N0cmlkZXEqNF0KKyAgICBkZWMgICAgICAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorJWVuZGlmCisKICVtYWNybyBEUl9GVU5DUyAxIDsgc3RhY2tfbWVtX2Zvcl8zMngzMl8zMmJpdF9mdW5jdGlvbgogY2dsb2JhbCB2cDlfaXByZWRfZHJfNHg0XzE2LCA0LCA0LCAzLCBkc3QsIHN0cmlkZSwgbCwgYQogICAgIG1vdmggICAgICAgICAgICAgICAgICAgIG0wLCBbbHFdICAgICAgICAgICAgICAgIDsgd3h5ei4uLi4KQEAgLTEwNjgsNiArMTE3MCwxNjEgQEAKIElOSVRfWE1NIGF2eAogRFJfRlVOQ1MgMgogCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitjZ2xvYmFsIHZwOV9pcHJlZF9kcl8xNngxNl8xNiwgNCwgNSwgNiwgZHN0LCBzdHJpZGUsIGwsIGEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2xxXSAgICAgICAgICAgICAgICAgICA7IGtsbW5vcHFyc3R1dnd4eXoKKyAgICBtb3Z1ICAgICAgICAgICAgICAgICAgICBtMSwgW2FxLTJdICAgICAgICAgICAgICAgICA7ICphYmNkZWZnaGlqa2xtbm8KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgW2FxXSAgICAgICAgICAgICAgICAgICA7IGFiY2RlZmdoaWprbG1ub3AKKyAgICB2cGVybTJpMTI4ICAgICAgICAgICAgICBtNCwgbTIsIG0yLCBxMjAwMSAgICAgICAgICA7IGlqa2xtbm9wLi4uLi4uLi4KKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNSwgbTQsIG0yLCAyICAgICAgICAgICAgICA7IGJjZGVmZ2hpamtsbW5vcC4KKyAgICB2cGVybTJpMTI4ICAgICAgICAgICAgICBtMywgbTAsIG0xLCBxMDIwMSAgICAgICAgICA7IHN0dXZ3eHl6KmFiY2RlZmcKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMSwgIDIsICA1ICAgICAgICAgICAgICAgICA7IEFCQ0RFRkdISUpLTE1OTy4KKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNCwgbTMsIG0wLCAyICAgICAgICAgICAgICA7IGxtbm9wcXJzdHV2d3h5eioKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNSwgbTMsIG0wLCA0ICAgICAgICAgICAgICA7IG1ub3BxcnN0dXZ3eHl6KmEKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMCwgIDQsICA1ICAgICAgICAgICAgICAgICA7IExNTk9QUVJTVFVWV1hZWiMKKyAgICB2cGVybTJpMTI4ICAgICAgICAgICAgICBtNSwgbTAsIG0xLCBxMDIwMSAgICAgICAgICA7IFRVVldYWVojQUJDREVGR0gKKyAgICBERUZJTkVfQVJHUyBkc3QsIHN0cmlkZSwgc3RyaWRlMywgc3RyaWRlNSwgZHN0MworICAgIGxlYSAgICAgICAgICAgICAgICAgIGRzdDNxLCBbZHN0cStzdHJpZGVxKjRdCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlM3EsIFtzdHJpZGVxKjNdCisgICAgbGVhICAgICAgICAgICAgICAgc3RyaWRlNXEsIFtzdHJpZGUzcStzdHJpZGVxKjJdCisKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCAyCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTQsIG0xLCBtNSwgMgorICAgIG1vdmEgICAgW2RzdDNxK3N0cmlkZTVxKjJdLCBtMyAgICAgICAgICAgICAgICAgICAgIDsgMTQKKyAgICBtb3ZhICAgIFsgZHN0cStzdHJpZGUzcSoyXSwgbTQgICAgICAgICAgICAgICAgICAgICA7IDYKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCA0CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTQsIG0xLCBtNSwgNAorICAgIHN1YiAgICAgICAgICAgICAgICAgIGRzdDNxLCBzdHJpZGVxCisgICAgbW92YSAgICBbZHN0M3Erc3RyaWRlNXEqMl0sIG0zICAgICAgICAgICAgICAgICAgICAgOyAxMworICAgIG1vdmEgICAgW2RzdDNxK3N0cmlkZXEqMiBdLCBtNCAgICAgICAgICAgICAgICAgICAgIDsgNQorICAgIG1vdmEgICAgW2RzdDNxK3N0cmlkZTNxKjRdLCBtMCAgICAgICAgICAgICAgICAgICAgIDsgMTUKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCA2CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTQsIG0xLCBtNSwgNgorICAgIG1vdmEgICAgIFtkc3RxK3N0cmlkZTNxKjRdLCBtMyAgICAgICAgICAgICAgICAgICAgIDsgMTIKKyAgICBtb3ZhICAgICBbZHN0M3Erc3RyaWRlcSoxXSwgbTQgICAgICAgICAgICAgICAgICAgICA7IDQKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCA4CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTQsIG0xLCBtNSwgOAorICAgIG1vdmEgICAgIFtkc3QzcStzdHJpZGVxKjhdLCBtMyAgICAgICAgICAgICAgICAgICAgIDsgMTEKKyAgICBtb3ZhICAgICBbZHN0M3Erc3RyaWRlcSowXSwgbTQgICAgICAgICAgICAgICAgICAgICA7IDMKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCAxMAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG00LCBtMSwgbTUsIDEwCisgICAgbW92YSAgICAgW2RzdHErc3RyaWRlNXEqMl0sIG0zICAgICAgICAgICAgICAgICAgICAgOyAxMAorICAgIG1vdmEgICAgIFtkc3RxK3N0cmlkZXEqMiBdLCBtNCAgICAgICAgICAgICAgICAgICAgIDsgMgorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG0zLCBtNSwgbTAsIDEyCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTQsIG0xLCBtNSwgMTIKKyAgICBtb3ZhICAgIFtkc3QzcStzdHJpZGUzcSoyXSwgbTMgICAgICAgICAgICAgICAgICAgICA7IDkKKyAgICBtb3ZhICAgICBbZHN0cStzdHJpZGVxKjEgXSwgbTQgICAgICAgICAgICAgICAgICAgICA7IDEKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtMywgbTUsIG0wLCAxNAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG00LCBtMSwgbTUsIDE0CisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqOF0sIG0zICAgICAgICAgICAgICAgICAgICAgOyA4CisgICAgbW92YSAgICAgIFtkc3RxK3N0cmlkZXEqMF0sIG00ICAgICAgICAgICAgICAgICAgICAgOyAwCisgICAgbW92YSAgICAgW2RzdDNxK3N0cmlkZXEqNF0sIG01ICAgICAgICAgICAgICAgICAgICAgOyA3CisgICAgUkVUCisKKyVpZiBBUkNIX1g4Nl82NAorY2dsb2JhbCB2cDlfaXByZWRfZHJfMzJ4MzJfMTYsIDQsIDcsIDEwLCBkc3QsIHN0cmlkZSwgbCwgYQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbbHErbW1zaXplKjArMF0gICAgICAgIDsgbFswLTE1XQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0xLCBbbHErbW1zaXplKjErMF0gICAgICAgIDsgbFsxNi0zMV0KKyAgICBtb3Z1ICAgICAgICAgICAgICAgICAgICBtMiwgW2FxK21tc2l6ZSowLTJdICAgICAgICA7ICphYmNkZWZnaGlqa2xtbm8KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMywgW2FxK21tc2l6ZSowKzBdICAgICAgICA7IGFiY2RlZmdoaWprbG1ub3AKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNCwgW2FxK21tc2l6ZSoxKzBdICAgICAgICA7IHFyc3R1dnd4eXowMTIzNDUKKyAgICB2cGVybTJpMTI4ICAgICAgICAgICAgICBtNSwgbTAsIG0xLCBxMDIwMSAgICAgICAgICA7IGxtbm9wcXJzdHV2d3h5ejAKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNiwgbTUsIG0wLCAyICAgICAgICAgICAgICA7IG1ub3BxcnN0dXZ3eHl6MDEKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNywgbTUsIG0wLCA0ICAgICAgICAgICAgICA7IG5vcHFyc3R1dnd4eXowMTIKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMCwgIDYsICA3ICAgICAgICAgICAgICAgICA7IExbMC0xNV0KKyAgICB2cGVybTJpMTI4ICAgICAgICAgICAgICBtNywgbTEsIG0yLCBxMDIwMSAgICAgICAgICA7IHN0dXZ3eHl6KmFiY2RlZmcKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNSwgbTcsIG0xLCAyICAgICAgICAgICAgICA7IGxtbm9wcXJzdHV2d3h5eioKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNiwgbTcsIG0xLCA0ICAgICAgICAgICAgICA7IG1ub3BxcnN0dXZ3eHl6KmEKKyAgICBMT1dQQVNTICAgICAgICAgICAgICAgICAgMSwgIDUsICA2ICAgICAgICAgICAgICAgICA7IExbMTYtMzFdIworICAgIHZwZXJtMmkxMjggICAgICAgICAgICAgIG01LCBtMywgbTQsIHEwMjAxICAgICAgICAgIDsgaWprbG1ub3BxcnN0dXZ3eAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG02LCBtNSwgbTMsIDIgICAgICAgICAgICAgIDsgYmNkZWZnaGlqa2xtbm9wcQorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAyLCAgMywgIDYgICAgICAgICAgICAgICAgIDsgQVswLTE1XQorICAgIG1vdnUgICAgICAgICAgICAgICAgICAgIG0zLCBbYXErbW1zaXplKjEtMl0gICAgICAgIDsgcHFyc3R1dnd4eXowMTIzNAorICAgIHZwZXJtMmkxMjggICAgICAgICAgICAgIG02LCBtNCwgbTQsIHEyMDAxICAgICAgICAgIDsgeXowMTIzNDUuLi4uLi4uLgorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG03LCBtNiwgbTQsIDIgICAgICAgICAgICAgIDsgcnN0dXZ3eHl6MDEyMzQ1LgorICAgIExPV1BBU1MgICAgICAgICAgICAgICAgICAzLCAgNCwgIDcgICAgICAgICAgICAgICAgIDsgQVsxNi0zMV0uCisgICAgdnBlcm0yaTEyOCAgICAgICAgICAgICAgbTQsIG0xLCBtMiwgcTAyMDEgICAgICAgICAgOyBUVVZXWFlaI0FCQ0RFRkdICisgICAgdnBlcm0yaTEyOCAgICAgICAgICAgICAgbTUsIG0wLCBtMSwgcTAyMDEgICAgICAgICAgOyBMWzctMTVdTFsxNi0yM10KKyAgICB2cGVybTJpMTI4ICAgICAgICAgICAgICBtOCwgbTIsIG0zLCBxMDIwMSAgICAgICAgICA7IElKS0xNTk9QUVJTVFVWV1gKKyAgICBERUZJTkVfQVJHUyBkc3Q4LCBzdHJpZGUsIHN0cmlkZTMsIHN0cmlkZTcsIHN0cmlkZTUsIGRzdDI0LCBjbnQKKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGU1cSwgW3N0cmlkZTNxK3N0cmlkZXEqMl0KKyAgICBsZWEgICAgICAgICAgICAgICBzdHJpZGU3cSwgW3N0cmlkZXEqNCtzdHJpZGUzcV0KKyAgICBsZWEgICAgICAgICAgICAgICAgIGRzdDI0cSwgW2RzdDhxK3N0cmlkZTNxKjhdCisgICAgbGVhICAgICAgICAgICAgICAgICAgZHN0OHEsIFtkc3Q4cStzdHJpZGVxKjhdCisgICAgbW92ICAgICAgICAgICAgICAgICAgIGNudGQsIDIKKworLmxvb3A6CisgICAgbW92YSAgW2RzdDI0cStzdHJpZGU3cSswIF0sIG0wICAgICAgICAgICAgICAgICAgICAgOyAzMSAyMyAxNSA3CisgICAgbW92YSAgW2RzdDI0cStzdHJpZGU3cSszMl0sIG0xCisgICAgbW92YSAgICBbZHN0OHErc3RyaWRlN3ErMF0sIG0xCisgICAgbW92YSAgIFtkc3Q4cStzdHJpZGU3cSszMl0sIG0yCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTYsIG00LCBtMSwgMgorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG03LCBtNSwgbTAsIDIKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtOSwgbTgsIG0yLCAyCisgICAgbW92YSBbZHN0MjRxK3N0cmlkZTNxKjIrMF0sIG03ICAgICAgICAgICAgICAgICAgICAgOyAzMCAyMiAxNCA2CisgICAgbW92YSBbZHN0MjRxK3N0cmlkZTNxKjIrMzJdLCBtNgorICAgIG1vdmEgIFtkc3Q4cStzdHJpZGUzcSoyKzBdLCBtNgorICAgIG1vdmEgW2RzdDhxK3N0cmlkZTNxKjIrMzJdLCBtOQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG02LCBtNCwgbTEsIDQKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNywgbTUsIG0wLCA0CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTksIG04LCBtMiwgNAorICAgIG1vdmEgICBbZHN0MjRxK3N0cmlkZTVxKzBdLCBtNyAgICAgICAgICAgICAgICAgICAgIDsgMjkgMjEgMTMgNQorICAgIG1vdmEgIFtkc3QyNHErc3RyaWRlNXErMzJdLCBtNgorICAgIG1vdmEgICAgW2RzdDhxK3N0cmlkZTVxKzBdLCBtNgorICAgIG1vdmEgICBbZHN0OHErc3RyaWRlNXErMzJdLCBtOQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG02LCBtNCwgbTEsIDYKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNywgbTUsIG0wLCA2CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTksIG04LCBtMiwgNgorICAgIG1vdmEgW2RzdDI0cStzdHJpZGVxKjQrMCBdLCBtNyAgICAgICAgICAgICAgICAgICAgIDsgMjggMjAgMTIgNAorICAgIG1vdmEgW2RzdDI0cStzdHJpZGVxKjQrMzJdLCBtNgorICAgIG1vdmEgICBbZHN0OHErc3RyaWRlcSo0KzBdLCBtNgorICAgIG1vdmEgIFtkc3Q4cStzdHJpZGVxKjQrMzJdLCBtOQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG02LCBtNCwgbTEsIDgKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNywgbTUsIG0wLCA4CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTksIG04LCBtMiwgOAorICAgIG1vdmEgIFtkc3QyNHErc3RyaWRlM3ErMCBdLCBtNyAgICAgICAgICAgICAgICAgICAgIDsgMjcgMTkgMTEgMworICAgIG1vdmEgIFtkc3QyNHErc3RyaWRlM3ErMzJdLCBtNgorICAgIG1vdmEgICAgW2RzdDhxK3N0cmlkZTNxKzBdLCBtNgorICAgIG1vdmEgICBbZHN0OHErc3RyaWRlM3ErMzJdLCBtOQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG02LCBtNCwgbTEsIDEwCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTcsIG01LCBtMCwgMTAKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtOSwgbTgsIG0yLCAxMAorICAgIG1vdmEgW2RzdDI0cStzdHJpZGVxKjIrMCBdLCBtNyAgICAgICAgICAgICAgICAgICAgIDsgMjYgMTggMTAgMgorICAgIG1vdmEgW2RzdDI0cStzdHJpZGVxKjIrMzJdLCBtNgorICAgIG1vdmEgICBbZHN0OHErc3RyaWRlcSoyKzBdLCBtNgorICAgIG1vdmEgIFtkc3Q4cStzdHJpZGVxKjIrMzJdLCBtOQorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG02LCBtNCwgbTEsIDEyCisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTcsIG01LCBtMCwgMTIKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtOSwgbTgsIG0yLCAxMgorICAgIG1vdmEgICBbZHN0MjRxK3N0cmlkZXErMCBdLCBtNyAgICAgICAgICAgICAgICAgICAgIDsgMjUgMTcgOSAxCisgICAgbW92YSAgIFtkc3QyNHErc3RyaWRlcSszMl0sIG02CisgICAgbW92YSAgICAgW2RzdDhxK3N0cmlkZXErMF0sIG02CisgICAgbW92YSAgICBbZHN0OHErc3RyaWRlcSszMl0sIG05CisgICAgdnBhbGlnbnIgICAgICAgICAgICAgICAgbTYsIG00LCBtMSwgMTQKKyAgICB2cGFsaWduciAgICAgICAgICAgICAgICBtNywgbTUsIG0wLCAxNAorICAgIHZwYWxpZ25yICAgICAgICAgICAgICAgIG05LCBtOCwgbTIsIDE0CisgICAgbW92YSBbZHN0MjRxK3N0cmlkZXEqMCswIF0sIG03ICAgICAgICAgICAgICAgICAgICAgOyAyNCAxNiA4IDAKKyAgICBtb3ZhIFtkc3QyNHErc3RyaWRlcSowKzMyXSwgbTYKKyAgICBtb3ZhICAgW2RzdDhxK3N0cmlkZXEqMCswXSwgbTYKKyAgICBtb3ZhICBbZHN0OHErc3RyaWRlcSowKzMyXSwgbTkKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgbTUKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNSwgbTEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMSwgbTQKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNCwgbTIKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMiwgbTgKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtOCwgbTMKKyAgICBzdWIgICAgICAgICAgICAgICAgIGRzdDI0cSwgc3RyaWRlN3EKKyAgICBzdWIgICAgICAgICAgICAgICAgIGRzdDI0cSwgc3RyaWRlcQorICAgIHN1YiAgICAgICAgICAgICAgICAgIGRzdDhxLCBzdHJpZGU3cQorICAgIHN1YiAgICAgICAgICAgICAgICAgIGRzdDhxLCBzdHJpZGVxCisgICAgZGVjICAgICAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcAorICAgIFJFVAorJWVuZGlmCislZW5kaWYKKwogJW1hY3JvIFZMX0ZVTkNTIDEgOyBzdGFja19tZW1fZm9yXzMyeDMyXzMyYml0X2Z1bmN0aW9uCiBjZ2xvYmFsIHZwOV9pcHJlZF92bF80eDRfMTYsIDIsIDQsIDMsIGRzdCwgc3RyaWRlLCBsLCBhCiAgICAgbW92aWZuaWRuICAgICAgICAgICAgICAgYXEsIGFtcApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdnA5aXR4Zm0uYXNtIGIvbGliYXZjb2RlYy94ODYvdnA5aXR4Zm0uYXNtCmluZGV4IDZkNTAwOGUuLjJjNjNmZTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwOWl0eGZtLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni92cDlpdHhmbS5hc20KQEAgLTI0LDM2ICsyNCwzNiBAQAogJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCiAlaW5jbHVkZSAidnA5aXR4Zm1fdGVtcGxhdGUuYXNtIgogCi1TRUNUSU9OX1JPREFUQQorU0VDVElPTl9ST0RBVEEgMzIKIAogJW1hY3JvIFZQOV9JRENUX0NPRUZGUyAyLTMgMAogY29uc3QgcHdfbSUxXyUyCi10aW1lcyA0IGR3IC0lMSwgICUyCit0aW1lcyA4IGR3IC0lMSwgICUyCiBjb25zdCBwd18lMl8lMQotdGltZXMgNCBkdyAgJTIsICAlMQordGltZXMgOCBkdyAgJTIsICAlMQogCiAlaWYgJTMgPT0gMQogY29uc3QgcHdfbSUyX20lMQotdGltZXMgNCBkdyAtJTIsIC0lMQordGltZXMgOCBkdyAtJTIsIC0lMQogJWlmICUxICE9ICUyCiBjb25zdCBwd19tJTJfJTEKLXRpbWVzIDQgZHcgLSUyLCAgJTEKK3RpbWVzIDggZHcgLSUyLCAgJTEKIGNvbnN0IHB3XyUxXyUyCi10aW1lcyA0IGR3ICAlMSwgICUyCit0aW1lcyA4IGR3ICAlMSwgICUyCiAlZW5kaWYKICVlbmRpZgogCiAlaWYgJTEgPCAxMTU4NQotcHdfbSUxeDI6ICAgdGltZXMgOCBkdyAtJTEqMgorcHdfbSUxeDI6ICAgdGltZXMgMTYgZHcgLSUxKjIKICVlbGlmICUxID4gMTE1ODUKLXB3XyUxeDI6ICAgIHRpbWVzIDggZHcgICUxKjIKK3B3XyUxeDI6ICAgIHRpbWVzIDE2IGR3ICAlMSoyCiAlZWxzZQogY29uc3QgcHdfJTF4MgotdGltZXMgOCBkdyAlMSoyCit0aW1lcyAxNiBkdyAlMSoyCiAlZW5kaWYKIAogJWlmICUyICE9ICUxCi1wd18lMngyOiAgICB0aW1lcyA4IGR3ICAlMioyCitwd18lMngyOiAgICB0aW1lcyAxNiBkdyAgJTIqMgogJWVuZGlmCiAlZW5kbWFjcm8KIApAQCAtMTI3LDE2ICsxMjcsMzMgQEAKICVlbmRtYWNybwogCiAlbWFjcm8gVlA5X1NUT1JFXzJYIDUtNiBkc3RxIDsgcmVnMSwgcmVnMiwgdG1wMSwgdG1wMiwgemVybywgZHN0CislaWYgbW1zaXplID09IDMyCisgICAgcG1vdnp4YncgICAgICAgICAgIG0lMywgWyU2XQorICAgIHBtb3Z6eGJ3ICAgICAgICAgICBtJTQsIFslNitzdHJpZGVxXQorJWVsc2UKICAgICBtb3ZoICAgICAgICAgICAgICAgbSUzLCBbJTZdCiAgICAgbW92aCAgICAgICAgICAgICAgIG0lNCwgWyU2K3N0cmlkZXFdCiAgICAgcHVucGNrbGJ3ICAgICAgICAgIG0lMywgbSU1CiAgICAgcHVucGNrbGJ3ICAgICAgICAgIG0lNCwgbSU1CislZW5kaWYKICAgICBwYWRkdyAgICAgICAgICAgICAgbSUzLCBtJTEKICAgICBwYWRkdyAgICAgICAgICAgICAgbSU0LCBtJTIKKyVpZiBtbXNpemUgPT0gMzIKKyAgICBwYWNrdXN3YiAgICAgICAgICAgbSUzLCBtJTQKKyAgICA7IEludGVsLi4uCisgICAgdnBlcm1xICAgICAgICAgICAgIG0lMywgbSUzLCBxMzEyMAorICAgIG1vdmEgICAgICAgICAgICAgIFslNl0sIHhtJTMKKyAgICB2ZXh0cmFjdGkxMjggWyU2K3N0cmlkZXFdLCBtJTMsIDEKKyVlbGlmIG1tc2l6ZSA9PSAxNgorICAgIHBhY2t1c3diICAgICAgICAgICBtJTMsIG0lNAorICAgIG1vdmggICAgICAgICAgICAgIFslNl0sIG0lMworICAgIG1vdmhwcyAgICBbJTYrc3RyaWRlcV0sIG0lMworJWVsc2UKICAgICBwYWNrdXN3YiAgICAgICAgICAgbSUzLCBtJTUKICAgICBwYWNrdXN3YiAgICAgICAgICAgbSU0LCBtJTUKICAgICBtb3ZoICAgICAgICAgICAgICBbJTZdLCBtJTMKICAgICBtb3ZoICAgICAgWyU2K3N0cmlkZXFdLCBtJTQKKyVlbmRpZgogJWVuZG1hY3JvCiAKICVtYWNybyBaRVJPX0JMT0NLIDQgOyBtZW0sIHN0cmlkZSwgbm56Y3BsLCB6ZXJvX3JlZwpAQCAtMTQyMSw2ICsxNDM4LDE3NyBAQAogVlA5X0lEQ1RfSURDVF8xNngxNl9BRERfWE1NIHNzc2UzCiBWUDlfSURDVF9JRENUXzE2eDE2X0FERF9YTU0gYXZ4CiAKKyVtYWNybyBWUDlfSURDVDE2X1lNTV8xRCAwCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggIDEsICAxNSwgMTYzMDUsICAxNjA2LCBbcGRfODE5Ml0sIDAsIDQgOyB0OCwgIHQxNQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICA5LCAgIDcsIDEwMzk0LCAxMjY2NSwgW3BkXzgxOTJdLCAwLCA0IDsgdDksICB0MTQKKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA5LCAgIDEsIDAgICAgICA7IHQ4LCAgdDkKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNywgIDE1LCAwICAgICAgOyB0MTUsIHQxNAorCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggMTUsICAgMSwgMTUxMzcsICA2MjcwLCBbcGRfODE5Ml0sIDAsIDQgOyB0OSwgIHQxNAorCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggIDUsICAxMSwgMTQ0NDksICA3NzIzLCBbcGRfODE5Ml0sIDAsIDQgOyB0MTAsIHQxMworICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYIDEzLCAgIDMsICA0NzU2LCAxNTY3OSwgW3BkXzgxOTJdLCAwLCA0IDsgdDExLCB0MTIKKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA1LCAgMTMsIDAgICAgICA7IHQxMSwgdDEwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgMTEsICAgMywgMCAgICAgIDsgdDEyLCB0MTMKKworICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAzLCAgMTMsIDYyNzAsIG0xNTEzNywgW3BkXzgxOTJdLCAwLCA0IDsgdDEwLCB0MTMKKworICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICA1LCAgIDksIDAgICAgICA7IHQ4LCAgdDExCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDMsICAxNSwgMCAgICAgIDsgdDksICB0MTAKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAxMSwgICA3LCAwICAgICAgOyB0MTUsIHQxMgorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsIDEzLCAgIDEsIDAgICAgICA7IHQxNCwgdDEzCisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAxNSwgICAxLCAwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDksICAgNywgMAorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTEsIFtwd18xMTU4NXgyXSAgICA7IHQxMAorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTcsIFtwd18xMTU4NXgyXSAgICA7IHQxMQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTksIFtwd18xMTU4NXgyXSAgICA7IHQxMgorICAgIHBtdWxocnN3ICAgICAgICAgICBtMTUsIFtwd18xMTU4NXgyXSAgICA7IHQxMworCisgICAgOyBldmVuICh0eDh4OCkKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG00LCBbYmxvY2txKzEyOF0KKyAgICBtb3ZhICAgICAgW2Jsb2NrcSsxMjhdLCBtNQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAgNCwgIDEyLCAxNTEzNywgIDYyNzAsIFtwZF84MTkyXSwgMCwgNSA7IHQyLCAgdDMKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgIDIsICAxNCwgMTYwNjksICAzMTk2LCBbcGRfODE5Ml0sIDAsIDUgOyB0NCwgIHQ3CisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggIDEwLCAgIDYsICA5MTAyLCAxMzYyMywgW3BkXzgxOTJdLCAwLCA1IDsgdDUsICB0NgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFtibG9ja3ErICAwXQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAgOCwgICAwLCA1CisgICAgcG11bGhyc3cgICAgICAgICAgICBtOCwgW3B3XzExNTg1eDJdICAgIDsgdDAKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBbcHdfMTE1ODV4Ml0gICAgOyB0MQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDEwLCAgIDIsIDUgICAgIDsgdDQsICB0NQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAgNiwgIDE0LCA1ICAgICA7IHQ3LCAgdDYKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgMTIsICAgOCwgNSAgICAgOyB0MCwgIHQzCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgICA0LCAgIDAsIDUgICAgIDsgdDEsICB0MgorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgICAyLCAgMTQsIDUKKyAgICBwbXVsaHJzdyAgICAgICAgICAgbTE0LCBbcHdfMTE1ODV4Ml0gICAgOyB0NQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTIsIFtwd18xMTU4NXgyXSAgICA7IHQ2CisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgIDYsICAxMiwgNSAgICAgOyB0MCwgIHQ3CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgICAyLCAgIDQsIDUgICAgIDsgdDEsICB0NgorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAxNCwgICAwLCA1ICAgICA7IHQyLCAgdDUKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgMTAsICAgOCwgNSAgICAgOyB0MywgIHQ0CisKKyAgICA7IGZpbmFsIHN0YWdlCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgMTEsICA2LCAgNSAgICAgIDsgb3V0MCwgb3V0MTUKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAxMywgIDIsICA1ICAgICAgOyBvdXQxLCBvdXQxNAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsIDE1LCAxNCwgIDUgICAgICA7IG91dDIsIG91dDEzCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDksIDEwLCAgNSAgICAgIDsgb3V0Mywgb3V0MTIKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNywgIDgsICA1ICAgICAgOyBvdXQ0LCBvdXQxMQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAxLCAgMCwgIDUgICAgICA7IG91dDUsIG91dDEwCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDMsICA0LCAgNSAgICAgIDsgb3V0Niwgb3V0OQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTUsIFtibG9ja3ErMTI4XQorICAgIG1vdmEgICAgICBbYmxvY2txKzE5Ml0sIG0zCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDUsIDEyLCAgMyAgICAgIDsgb3V0Nywgb3V0OAorCisgICAgU1dBUCAgMCwgMTEsICA4LCAxMiwgMTAKKyAgICBTV0FQICAxLCAxMywgMTQsICAyLCAxNSwgIDYsICAzLCAgOSwgIDQsICA3LCAgNQorJWVuZG1hY3JvCisKKzsgdGhpcyBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIFZQOV9TVE9SRV8yWCwgYnV0IGl0IGRvZXMgdHdvIHJvd3MKKzsgZm9yIHNsaWdodGx5IGltcHJvdmVkIGludGVybGVhdmluZywgYW5kIGl0IG9taXRzIHZwZXJtcSBzaW5jZSB0aGUKKzsgaW5wdXQgaXMgREMgc28gYWxsIHZhbHVlcyBhcmUgaWRlbnRpY2FsCislbWFjcm8gVlA5X1NUT1JFX1lNTV9EQ180WCA2IDsgcmVnLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB6ZXJvCisgICAgbW92YSAgICAgICAgICAgICAgeG0lMiwgW2RzdHFdCisgICAgbW92YSAgICAgICAgICAgICAgeG0lNCwgW2RzdHErc3RyaWRlcSoyXQorICAgIHZpbnNlcnRpMTI4ICAgICAgICBtJTIsIG0lMiwgW2RzdHErc3RyaWRlcV0sIDEKKyAgICB2aW5zZXJ0aTEyOCAgICAgICAgbSU0LCBtJTQsIFtkc3RxK3N0cmlkZTNxXSwgMQorICAgIHB1bnBja2hidyAgICAgICAgICBtJTMsIG0lMiwgbSU2CisgICAgcHVucGNrbGJ3ICAgICAgICAgIG0lMiwgbSU2CisgICAgcHVucGNraGJ3ICAgICAgICAgIG0lNSwgbSU0LCBtJTYKKyAgICBwdW5wY2tsYncgICAgICAgICAgbSU0LCBtJTYKKyAgICBwYWRkdyAgICAgICAgICAgICAgbSUzLCBtJTEKKyAgICBwYWRkdyAgICAgICAgICAgICAgbSUyLCBtJTEKKyAgICBwYWRkdyAgICAgICAgICAgICAgbSU1LCBtJTEKKyAgICBwYWRkdyAgICAgICAgICAgICAgbSU0LCBtJTEKKyAgICBwYWNrdXN3YiAgICAgICAgICAgbSUyLCBtJTMKKyAgICBwYWNrdXN3YiAgICAgICAgICAgbSU0LCBtJTUKKyAgICBtb3ZhICAgICAgICAgICAgW2RzdHFdLCB4bSUyCisgICAgbW92YSAgICAgICAgW2RzdHErc3RyaWRlcSoyXSwgeG0lNAorICAgIHZleHRyYWN0aTEyOCAgW2RzdHErc3RyaWRlcV0sIG0lMiwgMQorICAgIHZleHRyYWN0aTEyOCBbZHN0cStzdHJpZGUzcV0sIG0lNCwgMQorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl82NCAmJiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK2NnbG9iYWwgdnA5X2lkY3RfaWRjdF8xNngxNl9hZGQsIDQsIDQsIDE2LCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorICAgIGNtcCBlb2JkLCAxIDsgZmFzdGVyIHBhdGggZm9yIHdoZW4gb25seSBEQyBpcyBzZXQKKyAgICBqZyAuaWRjdGZ1bGwKKworICAgIDsgZGMtb25seQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFtwd18xMTU4NXgyXQorICAgIHZwYnJvYWRjYXN0dyAgICAgICAgbTAsIFtibG9ja3FdCisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgbTEKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtMQorICAgIHB4b3IgICAgICAgICAgICAgICAgbTUsIG01CisgICAgcG11bGhyc3cgICAgICAgICAgICBtMCwgW3B3XzUxMl0KKyAgICBtb3ZkICAgICAgICAgIFtibG9ja3FdLCB4bTUKKworICAgIERFRklORV9BUkdTIGRzdCwgc3RyaWRlLCBzdHJpZGUzLCBjbnQKKyAgICBtb3YgICAgICAgICAgICAgICBjbnRkLCA0CisgICAgbGVhICAgICAgICAgICBzdHJpZGUzcSwgW3N0cmlkZXEqM10KKy5sb29wX2RjOgorICAgIFZQOV9TVE9SRV9ZTU1fRENfNFggIDAsIDEsIDIsIDMsIDQsIDUKKyAgICBsZWEgICAgICAgICAgICAgICBkc3RxLCBbZHN0cSs0KnN0cmlkZXFdCisgICAgZGVjICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wX2RjCisgICAgUkVUCisKKyAgICBERUZJTkVfQVJHUyBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorLmlkY3RmdWxsOgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFtibG9ja3ErIDMyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTIsIFtibG9ja3ErIDY0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTMsIFtibG9ja3ErIDk2XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTUsIFtibG9ja3ErMTYwXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTYsIFtibG9ja3ErMTkyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTcsIFtibG9ja3ErMjI0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTgsIFtibG9ja3ErMjU2XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTksIFtibG9ja3ErMjg4XQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTAsIFtibG9ja3ErMzIwXQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTEsIFtibG9ja3ErMzUyXQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTIsIFtibG9ja3ErMzg0XQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTMsIFtibG9ja3ErNDE2XQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTQsIFtibG9ja3ErNDQ4XQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTUsIFtibG9ja3ErNDgwXQorCisgICAgVlA5X0lEQ1QxNl9ZTU1fMUQKKyAgICBUUkFOU1BPU0UxNngxNlcgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgW2Jsb2NrcSsxOTJdLCBbYmxvY2txKzEyOF0sIDEKKyAgICBtb3ZhICAgICAgW2Jsb2NrcSsgIDBdLCBtMAorICAgIFZQOV9JRENUMTZfWU1NXzFECisKKyAgICBtb3ZhICAgICAgW2Jsb2NrcSsyMjRdLCBtNworCisgICAgOyBzdG9yZQorICAgIFZQOV9JRENUOF9XUklURXgyICAgIDAsICAxLCA2LCA3LCB1bnVzZWQsIFtwd181MTJdLCA2CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIFZQOV9JRENUOF9XUklURXgyICAgIDIsICAzLCA2LCA3LCB1bnVzZWQsIFtwd181MTJdLCA2CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIFZQOV9JRENUOF9XUklURXgyICAgIDQsICA1LCA2LCA3LCB1bnVzZWQsIFtwd181MTJdLCA2CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTYsIFtibG9ja3ErMTkyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTcsIFtibG9ja3ErMjI0XQorICAgIFZQOV9JRENUOF9XUklURXgyICAgIDYsICA3LCAxLCAyLCB1bnVzZWQsIFtwd181MTJdLCA2CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIFZQOV9JRENUOF9XUklURXgyICAgIDgsICA5LCAxLCAyLCB1bnVzZWQsIFtwd181MTJdLCA2CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIFZQOV9JRENUOF9XUklURXgyICAgMTAsIDExLCAxLCAyLCB1bnVzZWQsIFtwd181MTJdLCA2CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIFZQOV9JRENUOF9XUklURXgyICAgMTIsIDEzLCAxLCAyLCB1bnVzZWQsIFtwd181MTJdLCA2CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIFZQOV9JRENUOF9XUklURXgyICAgMTQsIDE1LCAxLCAyLCB1bnVzZWQsIFtwd181MTJdLCA2CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorCisgICAgOyBhdCB0aGUgZW5kIG9mIHRoZSBsb29wLCBtMCBzaG91bGQgc3RpbGwgYmUgemVybworICAgIDsgdXNlIHRoYXQgdG8gemVybyBvdXQgYmxvY2sgY29lZmZpY2llbnRzCisgICAgcHhvciAgICAgICAgICAgICAgICBtMCwgbTAKKyAgICBaRVJPX0JMT0NLICAgICAgYmxvY2txLCAzMiwgMTYsIG0wCisgICAgUkVUCislZW5kaWYKKwogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyB2b2lkIHZwOV9pYWRzdF9pYWRzdF8xNngxNl9hZGRfPG9wdD4odWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQxNl90ICpibG9jaywgaW50IGVvYik7CiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNzk2LDEyICsxOTg0LDE4NCBAQAogSUFEU1QxNl9GTiBpYWRzdCwgSUFEU1QxNiwgaWRjdCwgIElEQ1QxNiwgIGF2eAogSUFEU1QxNl9GTiBpYWRzdCwgSUFEU1QxNiwgaWFkc3QsIElBRFNUMTYsIGF2eAogCis7IGluOiBkYXRhIGluIG1bMC0xNV0gZXhjZXB0IG0wL200LCB3aGljaCBhcmUgaW4gW2Jsb2NrcSswXSBhbmQgW2Jsb2NrcSsxMjhdCis7IG91dDogbVswLTE1XSBleGNlcHQgbTYsIHdoaWNoIGlzIGluIFtibG9ja3ErMTkyXQorOyB1c2VzIGJsb2NrcSBhcyBzY3JhdGNoIHNwYWNlCislbWFjcm8gVlA5X0lBRFNUMTZfWU1NXzFEIDAKKyAgICBtb3ZhICAgICAgICAgIFtibG9ja3ErIDMyXSwgbTMKKyAgICBtb3ZhICAgICAgICAgIFtibG9ja3ErIDY0XSwgbTcKKyAgICBtb3ZhICAgICAgICAgIFtibG9ja3ErIDk2XSwgbTgKKworICAgIDsgZmlyc3QgaGFsZiBvZiByb3VuZCAxCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggIDksICA2LCAgMCwgIDMsIDEzMTYwLCAgOTc2MCAgICA7IG05L3g9dDdbZF0sIG02L3g9dDZbZF0KKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgMSwgMTQsICA0LCAgNywgIDI0MDQsIDE2MjA3ICAgIDsgbTEveD10MTVbZF0sIG0xNC94PXQxNFtkXQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgIDE0LCAgNiwgIDcsICAzLCAgOCwgW3BkXzgxOTJdICAgOyBtMTQ9dDZbd10sIG02PXQxNFt3XQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgICAxLCAgOSwgIDQsICAwLCAgOCwgW3BkXzgxOTJdICAgOyBtMT10N1t3XSwgbTk9dDE1W3ddCisKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAxMywgIDIsICA0LCAgNywgMTU4OTMsICAzOTgxICAgIDsgbTEzL3g9dDNbZF0sIG0yL3g9dDJbZF0KKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgNSwgMTAsICAwLCAgMywgIDg0MjMsIDE0MDUzICAgIDsgbTUveD10MTFbZF0sIG0xMC94PXQxMFtkXQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgIDEwLCAgMiwgIDMsICA3LCAgOCwgW3BkXzgxOTJdICAgOyBtMTA9dDJbd10sIG0yPXQxMFt3XQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgICA1LCAxMywgIDAsICA0LCAgOCwgW3BkXzgxOTJdICAgOyBtNT10M1t3XSwgbTEzPXQxMVt3XQorCisgICAgOyBoYWxmIG9mIHJvdW5kIDIgdDgtMTUKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgMiwgMTMsICA0LCAgNywgIDkxMDIsIDEzNjIzICAgIDsgbTIveD10MTFbZF0sIG0xMy94PXQxMFtkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICA5LCAgNiwgIDMsICAwLCAxMzYyMywgIDkxMDIgICAgOyBtOS94PXQxNFtkXSwgbTYveD10MTVbZF0KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgOSwgMTMsICAzLCAgNywgIDgsIFtwZF84MTkyXSAgIDsgbTk9dDEwW3ddLCBtMTM9dDE0W3ddCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgIDYsICAyLCAgMCwgIDQsICA4LCBbcGRfODE5Ml0gICA7IG02PXQxMVt3XSwgbTI9dDE1W3ddCisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAxNCwgMTAsICA4ICAgICAgICAgICAgICAgICAgICAgIDsgbTE0PXQyLCBtMTA9dDYKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgMSwgIDUsICA4ICAgICAgICAgICAgICAgICAgICAgIDsgbTE9dDMsIG01PXQ3CisKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtMCwgW2Jsb2NrcSsgIDBdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTQsIFtibG9ja3ErMTI4XQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0zLCBbYmxvY2txKyAzMl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNywgW2Jsb2NrcSsgNjRdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTgsIFtibG9ja3ErIDk2XQorICAgIG1vdmEgICAgICAgICAgW2Jsb2NrcSsgIDBdLCBtMQorICAgIG1vdmEgICAgICAgICAgW2Jsb2NrcSsxMjhdLCBtMTQKKyAgICBtb3ZhICAgICAgICAgIFtibG9ja3ErIDMyXSwgbTYKKyAgICBtb3ZhICAgICAgICAgIFtibG9ja3ErIDY0XSwgbTkKKyAgICBtb3ZhICAgICAgICAgIFtibG9ja3ErIDk2XSwgbTEwCisKKyAgICA7IHNlY29uZCBoYWxmIG9mIHJvdW5kIDEKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAxNSwgIDAsICAxLCAgOSwgMTYzNjQsICAgODA0ICAgIDsgbTE1L3g9dDFbZF0sIG0wL3g9dDBbZF0KKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgNywgIDgsIDEwLCAgNiwgMTEwMDMsIDEyMTQwICAgIDsgbTcveD10OVtkXSwgbTgveD10OFtkXQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgICA4LCAgMCwgIDYsICA5LCAxNCwgW3BkXzgxOTJdICAgOyBtOD10MFt3XSwgbTA9dDhbd10KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgNywgMTUsIDEwLCAgMSwgMTQsIFtwZF84MTkyXSAgIDsgbTc9dDFbd10sIG0xNT10OVt3XQorCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggMTEsICA0LCAxMCwgIDYsIDE0ODExLCAgNzAwNSAgICA7IG0xMS94PXQ1W2RdLCBtNC94PXQ0W2RdCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMkRfNFggIDMsIDEyLCAgMSwgIDksICA1NTIwLCAxNTQyNiAgICA7IG0zL3g9dDEzW2RdLCBtMTIveD10MTJbZF0KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAxMiwgIDQsICA5LCAgNiwgMTQsIFtwZF84MTkyXSAgIDsgbTEyPXQ0W3ddLCBtND10MTJbd10KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAgMywgMTEsICAxLCAxMCwgMTQsIFtwZF84MTkyXSAgIDsgbTM9dDVbd10sIG0xMT10MTNbd10KKworICAgIDsgc2Vjb25kIGhhbGYgb2Ygcm91bmQgMiB0OC0xNQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICAwLCAxNSwgIDYsIDEwLCAxNjA2OSwgIDMxOTYgICAgOyBtMTUveD10OFtkXSwgbTAveD10OVtkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYIDExLCAgNCwgIDksICAxLCAgMzE5NiwgMTYwNjkgICAgOyBtMTEveD10MTJbZF0sIG00L3g9dDEzW2RdCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgMTEsIDE1LCAgOSwgMTAsIDE0LCBbcGRfODE5Ml0gICA7IG0xMT10OFt3XSwgbTE1PXQxMlt3XQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgICA0LCAgMCwgIDEsICA2LCAxNCwgW3BkXzgxOTJdICAgOyBtND10OVt3XSwgbTA9dDEzW3ddCisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAxMiwgIDgsIDE0ICAgICAgICAgICAgICAgICAgICAgIDsgbTEyPXQwLCBtOD10NAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgIHcsICAzLCAgNywgMTQgICAgICAgICAgICAgICAgICAgICAgOyBtMz10MSwgbTc9dDUKKworICAgIG1vdmEgICAgICAgICAgICAgICAgICAgbTEwLCBbYmxvY2txKyA5Nl0KKyAgICBtb3ZhICAgICAgICAgIFtibG9ja3ErIDk2XSwgbTEyCisKKyAgICA7IHJvdW5kIDMKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAxNSwgIDAsICA5LCAxMiwgMTUxMzcsICA2MjcwICAgIDsgbTE1L3g9dDEzW2RdLCBtMC94PXQxMltkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICAyLCAxMywgIDEsICA2LCAgNjI3MCwgMTUxMzcgICAgOyBtMi94PXQxNFtkXSwgbTEzL3g9dDE1W2RdCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgIDIsICAwLCAgMSwgMTIsIDE0LCBbcGRfODE5Ml0gICA7IG0yPW91dDJbd10sIG0wPXQxNGFbd10KKyAgICBWUDlfUk5EX1NIX1NVTVNVQl9CQSAgICAxMywgMTUsICA2LCAgOSwgMTQsIFtwZF84MTkyXQorICAgIFBTSUdOVyAgICAgICAgICAgICAgICAgbTEzLCBbcHdfbTFdICAgICAgICAgICAgICAgICAgICAgOyBtMTM9b3V0MTNbd10sIG0xNT10MTVhW3ddCisKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yRF80WCAgOCwgIDcsIDEyLCAgOSwgMTUxMzcsICA2MjcwICAgIDsgbTgveD10NVtkXSwgbTcveD10NFtkXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJEXzRYICA1LCAxMCwgIDEsICA2LCAgNjI3MCwgMTUxMzcgICAgOyBtNS94PXQ2W2RdLCBtMTAveD10N1tkXQorICAgIFZQOV9STkRfU0hfU1VNU1VCX0JBICAgICA1LCAgNywgIDEsICA5LCAxNCwgW3BkXzgxOTJdCisgICAgUFNJR05XICAgICAgICAgICAgICAgICAgbTUsIFtwd19tMV0gICAgICAgICAgICAgICAgICAgICA7IG01PW91dDNbd10sIG03PXQ2W3ddCisgICAgVlA5X1JORF9TSF9TVU1TVUJfQkEgICAgMTAsICA4LCAgNiwgMTIsIDE0LCBbcGRfODE5Ml0gICA7IG0xMD1vdXQxMlt3XSwgbTg9dDdbd10KKworICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0xLCBbYmxvY2txKyAgMF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgIG0xNCwgW2Jsb2NrcSsxMjhdCisgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTYsIFtibG9ja3ErIDMyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG05LCBbYmxvY2txKyA2NF0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgIG0xMiwgW2Jsb2NrcSsgOTZdCisgICAgbW92YSAgICAgICAgICBbYmxvY2txKyAgMF0sIG0xMAorICAgIG1vdmEgICAgICAgICAgW2Jsb2NrcSsxMjhdLCBtNQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgMTQsIDEyLCAgNSAgICAgICAgICAgICAgICAgICAgICA7IG0xND1vdXQwLCBtMTI9dDJhCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgdywgIDEsICAzLCAgNQorICAgIFBTSUdOVyAgICAgICAgICAgICAgICAgIG0xLCBbcHdfbTFdICAgICAgICAgICAgICAgICAgICAgOyBtMT1vdXQxNSwgbTM9dDNhCisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgOSwgMTEsICA1CisgICAgUFNJR05XICAgICAgICAgICAgICAgICAgbTksIFtwd19tMV0gICAgICAgICAgICAgICAgICAgICA7IG05PW91dDEsIG0xMT10MTAKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICB3LCAgNiwgIDQsICA1ICAgICAgICAgICAgICAgICAgICAgIDsgbTY9b3V0MTQsIG00PXQxMQorCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggIDQsIDExLCAxMTU4NSwgMTE1ODUsIFtwZF84MTkyXSwgIDUsIDEwIDsgbTQ9b3V0OSwgbTExPW91dDYKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNSwgW2Jsb2NrcSsxMjhdCisgICAgbW92YSAgICAgICAgICBbYmxvY2txKzE5Ml0sIG0xMQorICAgIFBTSUdOVyAgICAgICAgICAgICAgICAgbTE1LCBbcHdfbTFdCisgICAgVlA5X1VOUEFDS19NVUxTVUJfMldfNFggMTUsICAwLCAxMTU4NSwgMTE1ODUsIFtwZF84MTkyXSwgMTAsIDExIDsgbTE1PW91dDUsIG0wPW91dDEwCisKKyAgICBQU0lHTlcgICAgICAgICAgICAgICAgICBtMywgW3B3X20xXQorICAgIFZQOV9VTlBBQ0tfTVVMU1VCXzJXXzRYICAzLCAxMiwgMTE1ODUsIDExNTg1LCBbcGRfODE5Ml0sIDEwLCAxMSA7IG0zPW91dDcsbTEyPW91dDgKKyAgICBWUDlfVU5QQUNLX01VTFNVQl8yV180WCAgOCwgIDcsIDExNTg1LCAxMTU4NSwgW3BkXzgxOTJdLCAxMCwgMTEgOyBtOD1vdXQxMSxtNz1vdXQ0CisKKyAgICBtb3ZhICAgICAgICAgICAgICAgICAgIG0xMCwgW2Jsb2NrcSsgIDBdCisKKyAgICBTV0FQICAgICAgICAgICAgICAgICAgICAgMCwgMTQsICA2LCAxMSwgIDgsIDEyLCAxMAorICAgIFNXQVAgICAgICAgICAgICAgICAgICAgICAxLCAgOSwgMTUsICA0LCAgNywgIDMsICA1CisgICAgU1dBUCAgICAgICAgICAgICAgICAgICAgIDUsICA5LCAxNQorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl82NCAmJiBIQVZFX0FWWDJfRVhURVJOQUwKKyVtYWNybyBJQURTVDE2X1lNTV9GTiA0CitJTklUX1lNTSBhdngyCitjZ2xvYmFsIHZwOV8lMV8lM18xNngxNl9hZGQsIDQsIDQsIDE2LCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEsIFtibG9ja3ErIDMyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTIsIFtibG9ja3ErIDY0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTMsIFtibG9ja3ErIDk2XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTUsIFtibG9ja3ErMTYwXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTYsIFtibG9ja3ErMTkyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTcsIFtibG9ja3ErMjI0XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTgsIFtibG9ja3ErMjU2XQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTksIFtibG9ja3ErMjg4XQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTAsIFtibG9ja3ErMzIwXQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTEsIFtibG9ja3ErMzUyXQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTIsIFtibG9ja3ErMzg0XQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTMsIFtibG9ja3ErNDE2XQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTQsIFtibG9ja3ErNDQ4XQorICAgIG1vdmEgICAgICAgICAgICAgICBtMTUsIFtibG9ja3ErNDgwXQorCisgICAgVlA5XyUyX1lNTV8xRAorICAgIFRSQU5TUE9TRTE2eDE2VyAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbYmxvY2txKzE5Ml0sIFtibG9ja3ErMTI4XSwgMQorICAgIG1vdmEgICAgICBbYmxvY2txKyAgMF0sIG0wCisgICAgVlA5XyU0X1lNTV8xRAorCisgICAgbW92YSAgICAgIFtibG9ja3ErMjI0XSwgbTcKKworICAgIDsgc3RvcmUKKyAgICBWUDlfSURDVDhfV1JJVEV4MiAgICAwLCAgMSwgNiwgNywgdW51c2VkLCBbcHdfNTEyXSwgNgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBWUDlfSURDVDhfV1JJVEV4MiAgICAyLCAgMywgNiwgNywgdW51c2VkLCBbcHdfNTEyXSwgNgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBWUDlfSURDVDhfV1JJVEV4MiAgICA0LCAgNSwgNiwgNywgdW51c2VkLCBbcHdfNTEyXSwgNgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG02LCBbYmxvY2txKzE5Ml0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG03LCBbYmxvY2txKzIyNF0KKyAgICBWUDlfSURDVDhfV1JJVEV4MiAgICA2LCAgNywgMSwgMiwgdW51c2VkLCBbcHdfNTEyXSwgNgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBWUDlfSURDVDhfV1JJVEV4MiAgICA4LCAgOSwgMSwgMiwgdW51c2VkLCBbcHdfNTEyXSwgNgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBWUDlfSURDVDhfV1JJVEV4MiAgIDEwLCAxMSwgMSwgMiwgdW51c2VkLCBbcHdfNTEyXSwgNgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBWUDlfSURDVDhfV1JJVEV4MiAgIDEyLCAxMywgMSwgMiwgdW51c2VkLCBbcHdfNTEyXSwgNgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKyAgICBWUDlfSURDVDhfV1JJVEV4MiAgIDE0LCAxNSwgMSwgMiwgdW51c2VkLCBbcHdfNTEyXSwgNgorICAgIGxlYSAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxKzIqc3RyaWRlcV0KKworICAgIDsgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgbTAgc2hvdWxkIHN0aWxsIGJlIHplcm8KKyAgICA7IHVzZSB0aGF0IHRvIHplcm8gb3V0IGJsb2NrIGNvZWZmaWNpZW50cworICAgIHB4b3IgICAgICAgICAgICAgICAgbTAsIG0wCisgICAgWkVST19CTE9DSyAgICAgIGJsb2NrcSwgMzIsIDE2LCBtMAorICAgIFJFVAorJWVuZG1hY3JvCisKK0lBRFNUMTZfWU1NX0ZOIGlkY3QsICBJRENUMTYsICBpYWRzdCwgSUFEU1QxNgorSUFEU1QxNl9ZTU1fRk4gaWFkc3QsIElBRFNUMTYsIGlkY3QsICBJRENUMTYKK0lBRFNUMTZfWU1NX0ZOIGlhZHN0LCBJQURTVDE2LCBpYWRzdCwgSUFEU1QxNgorJWVuZGlmCisKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgdm9pZCB2cDlfaWRjdF9pZGN0XzMyeDMyX2FkZF88b3B0Pih1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBzdHJpZGUsIGludDE2X3QgKmJsb2NrLCBpbnQgZW9iKTsKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogJW1hY3JvIFZQOV9JRENUMzJfMUQgMi0zIDMyIDsgc3JjLCBwYXNzLCBubnpjCi0lYXNzaWduICUlc3RyIDE2KiUyKiUyCislaWYgJTIgPT0gMQorJWFzc2lnbiAlJXN0ciBtbXNpemUKKyVlbHNlCislYXNzaWduICUlc3RyIDY0CislZW5kaWYKKwogICAgIDsgZmlyc3QgZG8gdDAtMTUsIHRoaXMgY2FuIGJlIGRvbmUgaWRlbnRpY2FsIHRvIGlkY3QxNngxNgogICAgIFZQOV9JRENUMTZfMURfU1RBUlQgJTEsICUzLzIsIDY0KjIsIHRtcHEsIDIqJSVzdHIsIDEKIApAQCAtMjA5NiwxNyArMjQ1NiwxMjUgQEAKICAgICBtb3ZhICAgICAgICAgICAgICAgICBtMywgW3RtcHErMjAqJSVzdHJdIDsgdDUKICAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMywgW3RtcHErMjQqJSVzdHJdIDsgdDYKIAotICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgNiwgIDgsICAxMAorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgNiwgIDgsIDEwCiAgICAgbW92YSAgICBbdG1wcSsgMyolJXN0cl0sIG04ICAgICAgICAgICAgICA7IHQxNQotICAgIG1vdmEgICAgICAgICAgICAgICAgbTEwLCBbdG1wcSsyOColJXN0cl0gOyB0NwogICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgMCwgIDksICA4CiAgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDE1LCAxMiwgIDgKICAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgMTQsIDExLCAgOAogICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgMSwgIDIsICA4CiAgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA3LCAgMywgIDgKICAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDUsIDEzLCAgOAorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEwLCBbdG1wcSsyOColJXN0cl0gOyB0NwogICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgNCwgMTAsICA4CislaWYgY3B1ZmxhZyhhdngyKQorICAgIDsgdGhlICJzaGl0dHkiIGFib3V0IHRoaXMgaWRjdCBpcyB0aGF0IHRoZSBmaW5hbCBwYXNzIGRvZXMgdGhlIG91dGVybW9zdAorICAgIDsgaW50ZXJsZWF2ZSBzdW1zdWJzICh0MC8zMSwgdDEvMzAsIGV0YykgYnV0IHRoZSB0TiBmb3IgdGhlIDE2eDE2IG5lZWQKKyAgICA7IHRvIGJlIHNlcXVlbnRpYWwsIHdoaWNoIG1lYW5zIEkgbmVlZCB0byBsb2FkL3N0b3JlIGhhbGYgb2YgdGhlIHN1bXN1YgorICAgIDsgaW50ZXJtZWRpYXRlcyBiYWNrIHRvL2Zyb20gbWVtb3J5IHRvIGdldCBhIDE2eDE2IHRyYW5zcG9zZSBnb2luZy4uLgorICAgIDsgVGhpcyB3b3VsZCBiZSBlYXNpZXIgaWYgd2UgaGFkIG1vcmUgKGUuZy4gMzIpIFlNTSByZWdzIGhlcmUuCisgICAgbW92YSAgICBbdG1wcSsgNyolJXN0cl0sIG05CisgICAgbW92YSAgICBbdG1wcSsxMSolJXN0cl0sIG0xMgorICAgIG1vdmEgICAgW3RtcHErMTUqJSVzdHJdLCBtMTEKKyAgICBtb3ZhICAgIFt0bXBxKzE5KiUlc3RyXSwgbTIKKyAgICBtb3ZhICAgIFt0bXBxKzIzKiUlc3RyXSwgbTMKKyAgICBtb3ZhICAgIFt0bXBxKzI3KiUlc3RyXSwgbTEzCisgICAgbW92YSAgICBbdG1wcSszMSolJXN0cl0sIG0xMAorICAgIG1vdmEgICAgW3RtcHErMTIqJSVzdHJdLCBtNQogCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTMsIFt0bXBxKzMwKiUlc3RyXSA7IHQ4CisgICAgbW92YSAgICAgICAgICAgICAgICBtMTIsIFt0bXBxKzI2KiUlc3RyXSA7IHQ5CisgICAgbW92YSAgICAgICAgICAgICAgICBtMTEsIFt0bXBxKzIyKiUlc3RyXSA7IHQxMAorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEwLCBbdG1wcSsxOColJXN0cl0gOyB0MTEKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtOSwgW3RtcHErMTcqJSVzdHJdIDsgdDIwCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTgsIFt0bXBxKyAxKiUlc3RyXSA7IHQyMQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0zLCBbdG1wcSsyNSolJXN0cl0gOyB0MjIKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtMiwgW3RtcHErIDUqJSVzdHJdIDsgdDIzCisKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDksIDEwLCA1CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsICA4LCAxMSwgNQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAgMywgMTIsIDUKKyAgICBTVU1TVUJfQkEgICAgICAgICAgICAgdywgIDIsIDEzLCA1CisgICAgbW92YSAgICBbdG1wcSsgMSolJXN0cl0sIG0xMAorICAgIG1vdmEgICAgW3RtcHErIDUqJSVzdHJdLCBtMTEKKyAgICBtb3ZhICAgIFt0bXBxKzE3KiUlc3RyXSwgbTEyCisgICAgbW92YSAgICBbdG1wcSsyNSolJXN0cl0sIG0xMworCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTMsIFt0bXBxKzE0KiUlc3RyXSA7IHQxMgorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEyLCBbdG1wcSsxMColJXN0cl0gOyB0MTMKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMSwgW3RtcHErIDkqJSVzdHJdIDsgdDE4CisgICAgbW92YSAgICAgICAgICAgICAgICBtMTAsIFt0bXBxKzEzKiUlc3RyXSA7IHQxOQorCisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDExLCAxMiwgNQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAxMCwgMTMsIDUKKyAgICBtb3ZhICAgIFt0bXBxKyA5KiUlc3RyXSwgbTEzCisgICAgbW92YSAgICBbdG1wcSsxMyolJXN0cl0sIG0xMgorICAgIG1vdmEgICAgW3RtcHErMTAqJSVzdHJdLCBtMTAKKyAgICBtb3ZhICAgIFt0bXBxKzE0KiUlc3RyXSwgbTExCisKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMywgW3RtcHErIDYqJSVzdHJdIDsgdDE0CisgICAgbW92YSAgICAgICAgICAgICAgICBtMTIsIFt0bXBxKyAyKiUlc3RyXSA7IHQxNQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTExLCBbdG1wcSsyMSolJXN0cl0gOyB0MTYKKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMCwgW3RtcHErMjkqJSVzdHJdIDsgdDE3CisgICAgU1VNU1VCX0JBICAgICAgICAgICAgIHcsIDExLCAxMiwgNQorICAgIFNVTVNVQl9CQSAgICAgICAgICAgICB3LCAxMCwgMTMsIDUKKyAgICBtb3ZhICAgIFt0bXBxKzIxKiUlc3RyXSwgbTEyCisgICAgbW92YSAgICBbdG1wcSsyOSolJXN0cl0sIG0xMworICAgIG1vdmEgICAgICAgICAgICAgICAgbTEyLCBbdG1wcSsxMColJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMywgW3RtcHErMTQqJSVzdHJdCisKKyAgICBUUkFOU1BPU0UxNngxNlcgICAgICAgNiwgIDAsIDE1LCAxNCwgIDEsICA3LCAgNSwgIDQsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgIDMsICA4LCAgOSwgMTIsIDEzLCAxMCwgMTEsIFwKKyAgICAgICAgICAgIFt0bXBxKzEyKiUlc3RyXSwgW3RtcHErIDgqJSVzdHJdLCAxCisgICAgbW92YSAgICBbdG1wcSsgMColJXN0cl0sIG02CisgICAgbW92YSAgICBbdG1wcSsgMiolJXN0cl0sIG0wCisgICAgbW92YSAgICBbdG1wcSsgNColJXN0cl0sIG0xNQorICAgIG1vdmEgICAgW3RtcHErIDYqJSVzdHJdLCBtMTQKKyAgICBtb3ZhICAgIFt0bXBxKzEwKiUlc3RyXSwgbTcKKyAgICBtb3ZhICAgIFt0bXBxKzEyKiUlc3RyXSwgbTUKKyAgICBtb3ZhICAgIFt0bXBxKzE0KiUlc3RyXSwgbTQKKyAgICBtb3ZhICAgIFt0bXBxKzE2KiUlc3RyXSwgbTIKKyAgICBtb3ZhICAgIFt0bXBxKzE4KiUlc3RyXSwgbTMKKyAgICBtb3ZhICAgIFt0bXBxKzIwKiUlc3RyXSwgbTgKKyAgICBtb3ZhICAgIFt0bXBxKzIyKiUlc3RyXSwgbTkKKyAgICBtb3ZhICAgIFt0bXBxKzI0KiUlc3RyXSwgbTEyCisgICAgbW92YSAgICBbdG1wcSsyNiolJXN0cl0sIG0xMworICAgIG1vdmEgICAgW3RtcHErMjgqJSVzdHJdLCBtMTAKKyAgICBtb3ZhICAgIFt0bXBxKzMwKiUlc3RyXSwgbTExCisKKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtMCwgW3RtcHErMjEqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTEsIFt0bXBxKzI5KiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG0yLCBbdG1wcSsxMyolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtMywgW3RtcHErIDkqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTQsIFt0bXBxKyAxKiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG01LCBbdG1wcSsgNSolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgICBtNywgW3RtcHErMjUqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICAgbTgsIFt0bXBxKzMxKiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgIG05LCBbdG1wcSsyNyolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMCwgW3RtcHErMjMqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTEsIFt0bXBxKzE5KiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTEyLCBbdG1wcSsxNSolJXN0cl0KKyAgICBtb3ZhICAgICAgICAgICAgICAgIG0xMywgW3RtcHErMTEqJSVzdHJdCisgICAgbW92YSAgICAgICAgICAgICAgICBtMTQsIFt0bXBxKyA3KiUlc3RyXQorICAgIG1vdmEgICAgICAgICAgICAgICAgbTE1LCBbdG1wcSsgMyolJXN0cl0KKyAgICBUUkFOU1BPU0UxNngxNlcgICAgICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIFwKKyAgICAgICAgICAgIFt0bXBxKzE3KiUlc3RyXSwgW3RtcHErIDkqJSVzdHJdLCAxCisgICAgbW92YSAgICBbdG1wcSsgMSolJXN0cl0sIG0wCisgICAgbW92YSAgICBbdG1wcSsgMyolJXN0cl0sIG0xCisgICAgbW92YSAgICBbdG1wcSsgNSolJXN0cl0sIG0yCisgICAgbW92YSAgICBbdG1wcSsgNyolJXN0cl0sIG0zCisgICAgbW92YSAgICBbdG1wcSsxMSolJXN0cl0sIG01CisgICAgbW92YSAgICBbdG1wcSsxMyolJXN0cl0sIG02CisgICAgbW92YSAgICBbdG1wcSsxNSolJXN0cl0sIG03CisgICAgbW92YSAgICBbdG1wcSsxNyolJXN0cl0sIG04CisgICAgbW92YSAgICBbdG1wcSsxOSolJXN0cl0sIG05CisgICAgbW92YSAgICBbdG1wcSsyMSolJXN0cl0sIG0xMAorICAgIG1vdmEgICAgW3RtcHErMjMqJSVzdHJdLCBtMTEKKyAgICBtb3ZhICAgIFt0bXBxKzI1KiUlc3RyXSwgbTEyCisgICAgbW92YSAgICBbdG1wcSsyNyolJXN0cl0sIG0xMworICAgIG1vdmEgICAgW3RtcHErMjkqJSVzdHJdLCBtMTQKKyAgICBtb3ZhICAgIFt0bXBxKzMxKiUlc3RyXSwgbTE1CislZWxzZSA7ICFhdngyCiAgICAgVFJBTlNQT1NFOHg4VyAgICAgICAgIDYsIDAsIDE1LCAxNCwgMSwgNywgNSwgNCwgOAogICAgIG1vdmEgICAgW3RtcHErIDAqJSVzdHJdLCBtNgogICAgIG1vdmEgICAgW3RtcHErIDQqJSVzdHJdLCBtMApAQCAtMjE3NSw2ICsyNjQzLDcgQEAKICAgICBtb3ZhICAgIFt0bXBxKzIyKiUlc3RyXSwgbTEzCiAgICAgbW92YSAgICBbdG1wcSsyNiolJXN0cl0sIG0xNAogICAgIG1vdmEgICAgW3RtcHErMzAqJSVzdHJdLCBtMTUKKyVlbmRpZiA7IGF2eDIKICVlbHNlCiAgICAgbW92YSAgICAgICAgICAgICAgICAgbTIsIFt0bXBxKzI0KiUlc3RyXSA7IHQ2CiAgICAgbW92YSAgICAgICAgICAgICAgICAgbTMsIFt0bXBxKzI4KiUlc3RyXSA7IHQ3CkBAIC0yNjIzLDMgKzMwOTIsMTA2IEBACiBWUDlfSURDVF9JRENUXzMyeDMyX0FERF9YTU0gc3NlMgogVlA5X0lEQ1RfSURDVF8zMngzMl9BRERfWE1NIHNzc2UzCiBWUDlfSURDVF9JRENUXzMyeDMyX0FERF9YTU0gYXZ4CisKKzsgdGhpcyBpcyBhbG1vc3QgaWRlbnRpY2FsIHRvIFZQOV9TVE9SRV8yWCwgYnV0IGl0IGRvZXMgdHdvIHJvd3MKKzsgZm9yIHNsaWdodGx5IGltcHJvdmVkIGludGVybGVhdmluZywgYW5kIGl0IG9taXRzIHZwZXJtcSBzaW5jZSB0aGUKKzsgaW5wdXQgaXMgREMgc28gYWxsIHZhbHVlcyBhcmUgaWRlbnRpY2FsCislbWFjcm8gVlA5X1NUT1JFX1lNTV9EQ18yWDIgNiA7IHJlZywgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgemVybworICAgIG1vdmEgICAgICAgICAgICAgICBtJTIsIFtkc3RxXQorICAgIG1vdmEgICAgICAgICAgICAgICBtJTQsIFtkc3RxK3N0cmlkZXFdCisgICAgcHVucGNraGJ3ICAgICAgICAgIG0lMywgbSUyLCBtJTYKKyAgICBwdW5wY2tsYncgICAgICAgICAgbSUyLCBtJTYKKyAgICBwdW5wY2toYncgICAgICAgICAgbSU1LCBtJTQsIG0lNgorICAgIHB1bnBja2xidyAgICAgICAgICBtJTQsIG0lNgorICAgIHBhZGR3ICAgICAgICAgICAgICBtJTMsIG0lMQorICAgIHBhZGR3ICAgICAgICAgICAgICBtJTIsIG0lMQorICAgIHBhZGR3ICAgICAgICAgICAgICBtJTUsIG0lMQorICAgIHBhZGR3ICAgICAgICAgICAgICBtJTQsIG0lMQorICAgIHBhY2t1c3diICAgICAgICAgICBtJTIsIG0lMworICAgIHBhY2t1c3diICAgICAgICAgICBtJTQsIG0lNQorICAgIG1vdmEgIFtkc3RxK3N0cmlkZXEqMF0sIG0lMgorICAgIG1vdmEgIFtkc3RxK3N0cmlkZXEqMV0sIG0lNAorJWVuZG1hY3JvCisKKyVpZiBBUkNIX1g4Nl82NCAmJiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK2NnbG9iYWwgdnA5X2lkY3RfaWRjdF8zMngzMl9hZGQsIDQsIDksIDE2LCAyMDQ4LCBkc3QsIHN0cmlkZSwgYmxvY2ssIGVvYgorICAgIGNtcCBlb2JkLCAxMzUKKyAgICBqZyAuaWRjdGZ1bGwKKyAgICBjbXAgZW9iZCwgMQorICAgIGpnIC5pZGN0MTZ4MTYKKworICAgIDsgZGMtb25seSBjYXNlCisgICAgbW92YSAgICAgICAgICAgICAgICBtMSwgW3B3XzExNTg1eDJdCisgICAgdnBicm9hZGNhc3R3ICAgICAgICBtMCwgW2Jsb2NrcV0KKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBtMQorICAgIHBtdWxocnN3ICAgICAgICAgICAgbTAsIG0xCisgICAgcHhvciAgICAgICAgICAgICAgICBtNSwgbTUKKyAgICBwbXVsaHJzdyAgICAgICAgICAgIG0wLCBbcHdfNTEyXQorICAgIG1vdmQgICAgICAgICAgW2Jsb2NrcV0sIHhtNQorCisgICAgREVGSU5FX0FSR1MgZHN0LCBzdHJpZGUsIGNudAorICAgIG1vdiAgICAgICAgICAgICAgIGNudGQsIDE2CisubG9vcF9kYzoKKyAgICBWUDlfU1RPUkVfWU1NX0RDXzJYMiAwLCAxLCAyLCAzLCA0LCA1CisgICAgbGVhICAgICAgICAgICAgICAgZHN0cSwgW2RzdHErMipzdHJpZGVxXQorICAgIGRlYyAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcF9kYworICAgIFJFVAorCisgICAgREVGSU5FX0FSR1MgZHN0X2Jhaywgc3RyaWRlLCBibG9jaywgY250LCBkc3QsIHN0cmlkZTMwLCBkc3RfZW5kLCBzdHJpZGUyLCB0bXAKKy5pZGN0MTZ4MTY6CisgICAgbW92ICAgICAgICAgICAgICAgdG1wcSwgcnNwCisgICAgVlA5X0lEQ1QzMl8xRCAgIGJsb2NrcSwgMSwgMTYKKworICAgIG1vdiAgICAgICAgICBzdHJpZGUzMHEsIHN0cmlkZXEgICAgICAgICA7IHN0cmlkZQorICAgIGxlYSAgICAgICAgICAgc3RyaWRlMnEsIFtzdHJpZGVxKjJdICAgICA7IHN0cmlkZSoyCisgICAgc2hsICAgICAgICAgIHN0cmlkZTMwcSwgNSAgICAgICAgICAgICAgIDsgc3RyaWRlKjMyCisgICAgbW92ICAgICAgICAgICAgICAgY250ZCwgMgorICAgIHN1YiAgICAgICAgICBzdHJpZGUzMHEsIHN0cmlkZTJxICAgICAgICA7IHN0cmlkZSozMAorLmxvb3AyXzE2eDE2OgorICAgIG1vdiAgICAgICAgICAgICAgIGRzdHEsIGRzdF9iYWtxCisgICAgbGVhICAgICAgICAgICBkc3RfZW5kcSwgW2RzdHErc3RyaWRlMzBxXQorICAgIFZQOV9JRENUMzJfMUQgICAgIHRtcHEsIDIsIDE2CisgICAgYWRkICAgICAgICAgICBkc3RfYmFrcSwgMTYKKyAgICBhZGQgICAgICAgICAgICAgICB0bXBxLCAzMgorICAgIGRlYyAgICAgICAgICAgICAgIGNudGQKKyAgICBqZyAubG9vcDJfMTZ4MTYKKworICAgIDsgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCwgbTEgc2hvdWxkIHN0aWxsIGJlIHplcm8KKyAgICA7IHVzZSB0aGF0IHRvIHplcm8gb3V0IGJsb2NrIGNvZWZmaWNpZW50cworICAgIFpFUk9fQkxPQ0sgICAgICBibG9ja3EsIDY0LCAxNiwgbTEKKyAgICBSRVQKKworLmlkY3RmdWxsOgorICAgIG1vdiAgICAgICAgICAgICAgIGNudGQsIDIKKyAgICBtb3YgICAgICAgICAgICAgICB0bXBxLCByc3AKKy5sb29wMV9mdWxsOgorICAgIFZQOV9JRENUMzJfMUQgICBibG9ja3EsIDEKKyAgICBhZGQgICAgICAgICAgICAgYmxvY2txLCAzMgorICAgIGFkZCAgICAgICAgICAgICAgIHRtcHEsIDEwMjQKKyAgICBkZWMgICAgICAgICAgICAgICBjbnRkCisgICAgamcgLmxvb3AxX2Z1bGwKKworICAgIHN1YiAgICAgICAgICAgICBibG9ja3EsIDY0CisKKyAgICBtb3YgICAgICAgICAgc3RyaWRlMzBxLCBzdHJpZGVxICAgICAgICAgOyBzdHJpZGUKKyAgICBsZWEgICAgICAgICAgIHN0cmlkZTJxLCBbc3RyaWRlcSoyXSAgICAgOyBzdHJpZGUqMgorICAgIHNobCAgICAgICAgICBzdHJpZGUzMHEsIDUgICAgICAgICAgICAgICA7IHN0cmlkZSozMgorICAgIG1vdiAgICAgICAgICAgICAgIGNudGQsIDIKKyAgICBtb3YgICAgICAgICAgICAgICB0bXBxLCByc3AKKyAgICBzdWIgICAgICAgICAgc3RyaWRlMzBxLCBzdHJpZGUycSAgICAgICAgOyBzdHJpZGUqMzAKKy5sb29wMl9mdWxsOgorICAgIG1vdiAgICAgICAgICAgICAgIGRzdHEsIGRzdF9iYWtxCisgICAgbGVhICAgICAgICAgICBkc3RfZW5kcSwgW2RzdHErc3RyaWRlMzBxXQorICAgIFZQOV9JRENUMzJfMUQgICAgIHRtcHEsIDIKKyAgICBhZGQgICAgICAgICAgIGRzdF9iYWtxLCAxNgorICAgIGFkZCAgICAgICAgICAgICAgIHRtcHEsIDMyCisgICAgZGVjICAgICAgICAgICAgICAgY250ZAorICAgIGpnIC5sb29wMl9mdWxsCisKKyAgICA7IGF0IHRoZSBlbmQgb2YgdGhlIGxvb3AsIG0xIHNob3VsZCBzdGlsbCBiZSB6ZXJvCisgICAgOyB1c2UgdGhhdCB0byB6ZXJvIG91dCBibG9jayBjb2VmZmljaWVudHMKKyAgICBaRVJPX0JMT0NLICAgICAgYmxvY2txLCA2NCwgMzIsIG0xCisgICAgUkVUCislZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3ZwOWxwZi5hc20gYi9saWJhdmNvZGVjL3g4Ni92cDlscGYuYXNtCmluZGV4IDJjNGZlMjEuLjRlN2VkZTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwOWxwZi5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvdnA5bHBmLmFzbQpAQCAtNTIsNyArNTIsNyBAQAogU0VDVElPTiAudGV4dAogCiAlbWFjcm8gU0NSQVRDSCAzCi0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIFNXQVAgICAgICAgICAgICAgICAgJTEsICUyCiAlZWxzZQogICAgIG1vdmEgICAgICAgICAgICAgIFslM10sIG0lMQpAQCAtNjAsNyArNjAsNyBAQAogJWVuZG1hY3JvCiAKICVtYWNybyBVTlNDUkFUQ0ggMwotJWlmIEFSQ0hfWDg2XzY0CislaWZkZWYgbTgKICAgICBTV0FQICAgICAgICAgICAgICAgICUxLCAlMgogJWVsc2UKICAgICBtb3ZhICAgICAgICAgICAgICAgbSUxLCBbJTNdCkBAIC02OSw3ICs2OSw3IEBACiAKIDsgJTEgPSBhYnMoJTItJTMpCiAlbWFjcm8gQUJTU1VCIDQgOyBkc3QsIHNyYzEgKFJPKSwgc3JjMiAoUk8pLCB0bXAKLSVpZiBBUkNIX1g4Nl82NAorJWlmZGVmIG04CiAgICAgcHN1YnVzYiAgICAgICAgICAgICAlMSwgJTMsICUyCiAgICAgcHN1YnVzYiAgICAgICAgICAgICAlNCwgJTIsICUzCiAlZWxzZQpAQCAtMTAyLDcgKzEwMiw3IEBACiAlZW5kbWFjcm8KIAogJW1hY3JvIFVOUEFDSyA0Ci0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIHB1bnBjayUxYncgICAgICAgICAgJTIsICUzLCAlNAogJWVsc2UKICAgICBtb3ZhICAgICAgICAgICAgICAgICUyLCAlMwpAQCAtMTEyLDI3ICsxMTIsMjcgQEAKIAogJW1hY3JvIEZJTFRFUl9TVUJ4Ml9BRER4MiAxMSA7ICUxPWRzdCAlMj1oL2wgJTM9Y2FjaGUgJTQ9c3RhY2tfb2ZmICU1PXN1YjEgJTY9c3ViMiAlNz1hZGQxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgJTg9YWRkMiAlOT1yc2hpZnQsIFt1bnBhY2tdLCBbdW5wYWNrX2lzX21lbV9vbl94ODZfMzJdCi0gICAgcHN1YncgICAgICAgICAgICAgICAlMywgW3JzcCslNCslNSozMl0KLSAgICBwc3VidyAgICAgICAgICAgICAgICUzLCBbcnNwKyU0KyU2KjMyXQotICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsIFtyc3ArJTQrJTcqMzJdCisgICAgcHN1YncgICAgICAgICAgICAgICAlMywgW3JzcCslNCslNSptbXNpemUqMl0KKyAgICBwc3VidyAgICAgICAgICAgICAgICUzLCBbcnNwKyU0KyU2Km1tc2l6ZSoyXQorICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsIFtyc3ArJTQrJTcqbW1zaXplKjJdCiAlaWZuaWRuICUxMCwgIiIKICVpZiAlMTEgPT0gMAogICAgIHB1bnBjayUyYncgICAgICAgICAgJTEsICUxMCwgbTAKICVlbHNlCiAgICAgVU5QQUNLICAgICAgICAgICUyLCAlMSwgJTEwLCBtMAogJWVuZGlmCi0gICAgbW92YSAgICBbcnNwKyU0KyU4KjMyXSwgJTEKKyAgICBtb3ZhIFtyc3ArJTQrJTgqbW1zaXplKjJdLCAlMQogICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxCiAlZWxzZQotICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsIFtyc3ArJTQrJTgqMzJdCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgW3JzcCslNCslOCptbXNpemUqMl0KICVlbmRpZgogICAgIHBzcmF3ICAgICAgICAgICAgICAgJTEsICUzLCAlOQogJWVuZG1hY3JvCiAKIDsgRklYTUUgaW50ZXJsZWF2ZSBsL2ggYmV0dGVyIChmb3IgaW5zdHJ1Y3Rpb24gcGFpcmluZykKICVtYWNybyBGSUxURVJfSU5JVCA5IDsgdG1wMSwgdG1wMiwgY2FjaGVMLCBjYWNoZUgsIGRzdHAsIHN0YWNrX29mZiwgZmlsdGVyaWQsIG1hc2ssIHNvdXJjZQotICAgIEZJTFRFUiU3X0lOSVQgICAgICAgJTEsIGwsICUzLCAlNiArICAwCi0gICAgRklMVEVSJTdfSU5JVCAgICAgICAlMiwgaCwgJTQsICU2ICsgMTYKKyAgICBGSUxURVIlN19JTklUICAgICAgICUxLCBsLCAlMywgJTYgKyAgICAgIDAKKyAgICBGSUxURVIlN19JTklUICAgICAgICUyLCBoLCAlNCwgJTYgKyBtbXNpemUKICAgICBwYWNrdXN3YiAgICAgICAgICAgICUxLCAlMgogICAgIE1BU0tfQVBQTFkgICAgICAgICAgJTEsICU5LCAlOCwgJTIKICAgICBtb3ZhICAgICAgICAgICAgICAgICU1LCAlMQpAQCAtMTQ3LDggKzE0Nyw4IEBACiAgICAgbW92YSAgICAgICAgICAgICAgICUxNCwgJTE1CiAlZW5kaWYKICVlbmRpZgotICAgIEZJTFRFUl9TVUJ4Ml9BRER4MiAgJTEsIGwsICUzLCAlNiArICAwLCAlNywgJTgsICU5LCAlMTAsICUxMSwgJTE0LCAlMTYKLSAgICBGSUxURVJfU1VCeDJfQUREeDIgICUyLCBoLCAlNCwgJTYgKyAxNiwgJTcsICU4LCAlOSwgJTEwLCAlMTEsICUxNCwgJTE2CisgICAgRklMVEVSX1NVQngyX0FERHgyICAlMSwgbCwgJTMsICU2ICsgICAgICAwLCAlNywgJTgsICU5LCAlMTAsICUxMSwgJTE0LCAlMTYKKyAgICBGSUxURVJfU1VCeDJfQUREeDIgICUyLCBoLCAlNCwgJTYgKyBtbXNpemUsICU3LCAlOCwgJTksICUxMCwgJTExLCAlMTQsICUxNgogICAgIHBhY2t1c3diICAgICAgICAgICAgJTEsICUyCiAlaWZuaWRuICUxMywgIiIKICAgICBNQVNLX0FQUExZICAgICAgICAgICUxLCAlMTMsICUxMiwgJTIKQEAgLTE5NSwyMSArMTk1LDIxIEBACiAKICVtYWNybyBGSUxURVI2X0lOSVQgNCA7ICUxPWRzdCAlMj1oL2wgJTM9Y2FjaGUsICU0PXN0YWNrX29mZgogICAgIFVOUEFDSyAgICAgICAgICAlMiwgJTEsIHJwMywgbTAgICAgICAgICAgICAgICAgICAgICA7IHAzOiBCLT5XCi0gICAgbW92YSAgICAgW3JzcCslNCswKjMyXSwgJTEKKyAgICBtb3ZhIFtyc3ArJTQrMCptbXNpemUqMl0sICUxCiAgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEsICUxICAgICAgICAgICAgICAgICAgICAgIDsgcDMqMgogICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzKjMKICAgICBwdW5wY2slMmJ3ICAgICAgICAgICUxLCBtMSwgIG0wICAgICAgICAgICAgICAgICAgICAgOyBwMjogQi0+VwotICAgIG1vdmEgICAgIFtyc3ArJTQrMSozMl0sICUxCisgICAgbW92YSBbcnNwKyU0KzEqbW1zaXplKjJdLCAlMQogICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzKjMgKyBwMgogICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzKjMgKyBwMioyCiAgICAgVU5QQUNLICAgICAgICAgICUyLCAlMSwgcnAxLCBtMCAgICAgICAgICAgICAgICAgICAgIDsgcDE6IEItPlcKLSAgICBtb3ZhICAgICBbcnNwKyU0KzIqMzJdLCAlMQorICAgIG1vdmEgW3JzcCslNCsyKm1tc2l6ZSoyXSwgJTEKICAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMyozICsgcDIqMiArIHAxCiAgICAgVU5QQUNLICAgICAgICAgICUyLCAlMSwgcnAwLCBtMCAgICAgICAgICAgICAgICAgICAgIDsgcDA6IEItPlcKLSAgICBtb3ZhICAgICBbcnNwKyU0KzMqMzJdLCAlMQorICAgIG1vdmEgW3JzcCslNCszKm1tc2l6ZSoyXSwgJTEKICAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwMyozICsgcDIqMiArIHAxICsgcDAKICAgICBVTlBBQ0sgICAgICAgICAgJTIsICUxLCBycTAsIG0wICAgICAgICAgICAgICAgICAgICAgOyBxMDogQi0+VwotICAgIG1vdmEgICAgIFtyc3ArJTQrNCozMl0sICUxCisgICAgbW92YSBbcnNwKyU0KzQqbW1zaXplKjJdLCAlMQogICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsICUxICAgICAgICAgICAgICAgICAgICAgICAgICA7IHAzKjMgKyBwMioyICsgcDEgKyBwMCArIHEwCiAgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgW3B3XzRdICAgICAgICAgICAgICAgICAgICAgIDsgcDMqMyArIHAyKjIgKyBwMSArIHAwICsgcTAgKyA0CiAgICAgcHNyYXcgICAgICAgICAgICAgICAlMSwgJTMsIDMgICAgICAgICAgICAgICAgICAgICAgIDsgKHAzKjMgKyBwMioyICsgcDEgKyBwMCArIHEwICsgNCkgPj4gMwpAQCAtMjE3LDI0ICsyMTcsMjQgQEAKIAogJW1hY3JvIEZJTFRFUjE0X0lOSVQgNCA7ICUxPWRzdCAlMj1oL2wgJTM9Y2FjaGUsICU0PXN0YWNrX29mZgogICAgIHB1bnBjayUyYncgICAgICAgICAgJTEsIG0yLCBtMCAgICAgICAgICAgICAgICAgICAgICA7IHA3OiBCLT5XCi0gICAgbW92YSAgICBbcnNwKyU0KyA4KjMyXSwgJTEKKyAgICBtb3ZhIFtyc3ArJTQrIDgqbW1zaXplKjJdLCAlMQogICAgIHBzbGx3ICAgICAgICAgICAgICAgJTMsICUxLCAzICAgICAgICAgICAgICAgICAgICAgICA7IHA3KjgKICAgICBwc3VidyAgICAgICAgICAgICAgICUzLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwNyo3CiAgICAgcHVucGNrJTJidyAgICAgICAgICAlMSwgbTMsIG0wICAgICAgICAgICAgICAgICAgICAgIDsgcDY6IEItPlcKLSAgICBtb3ZhICAgIFtyc3ArJTQrIDkqMzJdLCAlMQorICAgIG1vdmEgW3JzcCslNCsgOSptbXNpemUqMl0sICUxCiAgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNyArIHA2CiAgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNyArIHA2KjIKICAgICBVTlBBQ0sgICAgICAgICAgJTIsICUxLCBycDUsIG0wICAgICAgICAgICAgICAgICAgICAgOyBwNTogQi0+VwotICAgIG1vdmEgICAgW3JzcCslNCsxMCozMl0sICUxCisgICAgbW92YSBbcnNwKyU0KzEwKm1tc2l6ZSoyXSwgJTEKICAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCAlMSAgICAgICAgICAgICAgICAgICAgICAgICAgOyBwNyo3ICsgcDYqMiArIHA1CiAgICAgVU5QQUNLICAgICAgICAgICUyLCAlMSwgcnA0LCBtMCAgICAgICAgICAgICAgICAgICAgIDsgcDQ6IEItPlcKLSAgICBtb3ZhICAgIFtyc3ArJTQrMTEqMzJdLCAlMQorICAgIG1vdmEgW3JzcCslNCsxMSptbXNpemUqMl0sICUxCiAgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgJTEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNyArIHA2KjIgKyBwNSArIHA0Ci0gICAgcGFkZHcgICAgICAgICAgICAgICAlMywgW3JzcCslNCsgMCozMl0gICAgICAgICAgICAgIDsgcDcqNyArIHA2KjIgKyBwNSArIHA0ICsgcDMKLSAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCBbcnNwKyU0KyAxKjMyXSAgICAgICAgICAgICAgOyBwNyo3ICsgcDYqMiArIHA1ICsgLi4gKyBwMgotICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsIFtyc3ArJTQrIDIqMzJdICAgICAgICAgICAgICA7IHA3KjcgKyBwNioyICsgcDUgKyAuLiArIHAxCi0gICAgcGFkZHcgICAgICAgICAgICAgICAlMywgW3JzcCslNCsgMyozMl0gICAgICAgICAgICAgIDsgcDcqNyArIHA2KjIgKyBwNSArIC4uICsgcDAKLSAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCBbcnNwKyU0KyA0KjMyXSAgICAgICAgICAgICAgOyBwNyo3ICsgcDYqMiArIHA1ICsgLi4gKyBwMCArIHEwCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgW3JzcCslNCsgMCptbXNpemUqMl0gICAgICAgIDsgcDcqNyArIHA2KjIgKyBwNSArIHA0ICsgcDMKKyAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCBbcnNwKyU0KyAxKm1tc2l6ZSoyXSAgICAgICAgOyBwNyo3ICsgcDYqMiArIHA1ICsgLi4gKyBwMgorICAgIHBhZGR3ICAgICAgICAgICAgICAgJTMsIFtyc3ArJTQrIDIqbW1zaXplKjJdICAgICAgICA7IHA3KjcgKyBwNioyICsgcDUgKyAuLiArIHAxCisgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgW3JzcCslNCsgMyptbXNpemUqMl0gICAgICAgIDsgcDcqNyArIHA2KjIgKyBwNSArIC4uICsgcDAKKyAgICBwYWRkdyAgICAgICAgICAgICAgICUzLCBbcnNwKyU0KyA0Km1tc2l6ZSoyXSAgICAgICAgOyBwNyo3ICsgcDYqMiArIHA1ICsgLi4gKyBwMCArIHEwCiAgICAgcGFkZHcgICAgICAgICAgICAgICAlMywgW3B3XzhdICAgICAgICAgICAgICAgICAgICAgIDsgcDcqNyArIHA2KjIgKyBwNSArIC4uICsgcDAgKyBxMCArIDgKICAgICBwc3JhdyAgICAgICAgICAgICAgICUxLCAlMywgNCAgICAgICAgICAgICAgICAgICAgICAgOyAocDcqNyArIHA2KjIgKyBwNSArIC4uICsgcDAgKyBxMCArIDgpID4+IDQKICVlbmRtYWNybwpAQCAtMzM0LDIyICszMzQsMjQgQEAKICVlbmRtYWNybwogCiAlbWFjcm8gREVGSU5FX1RSQU5TUE9TRURfUDdfVE9fUTcgMC0xIDAKLSVkZWZpbmUgUDMgcnNwICsgICAwICsgJTEKLSVkZWZpbmUgUDIgcnNwICsgIDE2ICsgJTEKLSVkZWZpbmUgUDEgcnNwICsgIDMyICsgJTEKLSVkZWZpbmUgUDAgcnNwICsgIDQ4ICsgJTEKLSVkZWZpbmUgUTAgcnNwICsgIDY0ICsgJTEKLSVkZWZpbmUgUTEgcnNwICsgIDgwICsgJTEKLSVkZWZpbmUgUTIgcnNwICsgIDk2ICsgJTEKLSVkZWZpbmUgUTMgcnNwICsgMTEyICsgJTEKLSVkZWZpbmUgUDcgcnNwICsgMTI4ICsgJTEKLSVkZWZpbmUgUDYgcnNwICsgMTQ0ICsgJTEKLSVkZWZpbmUgUDUgcnNwICsgMTYwICsgJTEKLSVkZWZpbmUgUDQgcnNwICsgMTc2ICsgJTEKLSVkZWZpbmUgUTQgcnNwICsgMTkyICsgJTEKLSVkZWZpbmUgUTUgcnNwICsgMjA4ICsgJTEKLSVkZWZpbmUgUTYgcnNwICsgMjI0ICsgJTEKLSVkZWZpbmUgUTcgcnNwICsgMjQwICsgJTEKKyVkZWZpbmUgUDMgcnNwICsgIDAqbW1zaXplICsgJTEKKyVkZWZpbmUgUDIgcnNwICsgIDEqbW1zaXplICsgJTEKKyVkZWZpbmUgUDEgcnNwICsgIDIqbW1zaXplICsgJTEKKyVkZWZpbmUgUDAgcnNwICsgIDMqbW1zaXplICsgJTEKKyVkZWZpbmUgUTAgcnNwICsgIDQqbW1zaXplICsgJTEKKyVkZWZpbmUgUTEgcnNwICsgIDUqbW1zaXplICsgJTEKKyVkZWZpbmUgUTIgcnNwICsgIDYqbW1zaXplICsgJTEKKyVkZWZpbmUgUTMgcnNwICsgIDcqbW1zaXplICsgJTEKKyVpZiBtbXNpemUgPT0gMTYKKyVkZWZpbmUgUDcgcnNwICsgIDgqbW1zaXplICsgJTEKKyVkZWZpbmUgUDYgcnNwICsgIDkqbW1zaXplICsgJTEKKyVkZWZpbmUgUDUgcnNwICsgMTAqbW1zaXplICsgJTEKKyVkZWZpbmUgUDQgcnNwICsgMTEqbW1zaXplICsgJTEKKyVkZWZpbmUgUTQgcnNwICsgMTIqbW1zaXplICsgJTEKKyVkZWZpbmUgUTUgcnNwICsgMTMqbW1zaXplICsgJTEKKyVkZWZpbmUgUTYgcnNwICsgMTQqbW1zaXplICsgJTEKKyVkZWZpbmUgUTcgcnNwICsgMTUqbW1zaXplICsgJTEKKyVlbmRpZgogJWVuZG1hY3JvCiAKIDsgLi4uLi4uLi4uLi4uLi5BQiAtPiBBQUFBQUFBQUJCQkJCQkJCCkBAIC0zNjMsMTQgKzM2NSwxOSBAQAogJWVuZGlmCiAlZW5kbWFjcm8KIAotJW1hY3JvIExPT1BGSUxURVIgNSA7ICUxPXYvaCAlMj1zaXplMSAlMyslND1zdGFjaywgJTU9MzJiaXQgc3RhY2sgb25seQorJW1hY3JvIExPT1BGSUxURVIgNSA7ICUxPXYvaCAlMj1zaXplMSAlMyslND1zdGFjaywgJTU9bW14LzMyYml0IHN0YWNrIG9ubHkKKyVhc3NpZ24gJSVleHQgMAorJWlmIEFSQ0hfWDg2XzMyIHx8IG1tc2l6ZSA9PSA4CislYXNzaWduICUlZXh0ICU1CislZW5kaWYKKwogJWlmIFVOSVg2NAotY2dsb2JhbCB2cDlfbG9vcF9maWx0ZXJfJTFfJTJfMTYsIDUsIDksIDE2LCAlMyArICU0LCBkc3QsIHN0cmlkZSwgRSwgSSwgSCwgbXN0cmlkZSwgZHN0Miwgc3RyaWRlMywgbXN0cmlkZTMKK2NnbG9iYWwgdnA5X2xvb3BfZmlsdGVyXyUxXyUyXyAlKyBtbXNpemUsIDUsIDksIDE2LCAlMyArICU0ICsgJSVleHQsIGRzdCwgc3RyaWRlLCBFLCBJLCBILCBtc3RyaWRlLCBkc3QyLCBzdHJpZGUzLCBtc3RyaWRlMwogJWVsc2UKICVpZiBXSU42NAotY2dsb2JhbCB2cDlfbG9vcF9maWx0ZXJfJTFfJTJfMTYsIDQsIDgsIDE2LCAlMyArICU0LCBkc3QsIHN0cmlkZSwgRSwgSSwgbXN0cmlkZSwgZHN0Miwgc3RyaWRlMywgbXN0cmlkZTMKK2NnbG9iYWwgdnA5X2xvb3BfZmlsdGVyXyUxXyUyXyAlKyBtbXNpemUsIDQsIDgsIDE2LCAlMyArICU0ICsgJSVleHQsIGRzdCwgc3RyaWRlLCBFLCBJLCBtc3RyaWRlLCBkc3QyLCBzdHJpZGUzLCBtc3RyaWRlMwogJWVsc2UKLWNnbG9iYWwgdnA5X2xvb3BfZmlsdGVyXyUxXyUyXzE2LCAyLCA2LCAxNiwgJTMgKyAlNCArICU1LCBkc3QsIHN0cmlkZSwgbXN0cmlkZSwgZHN0Miwgc3RyaWRlMywgbXN0cmlkZTMKK2NnbG9iYWwgdnA5X2xvb3BfZmlsdGVyXyUxXyUyXyAlKyBtbXNpemUsIDIsIDYsIDE2LCAlMyArICU0ICsgJSVleHQsIGRzdCwgc3RyaWRlLCBtc3RyaWRlLCBkc3QyLCBzdHJpZGUzLCBtc3RyaWRlMwogJWRlZmluZSBFZCBkd29yZCByMm0KICVkZWZpbmUgSWQgZHdvcmQgcjNtCiAlZW5kaWYKQEAgLTM4NCwxOCArMzkxLDIyIEBACiAgICAgbGVhICAgICAgICAgICAgICBtc3RyaWRlM3EsIFttc3RyaWRlcSozXQogCiAlaWZpZG4gJTEsIGgKLSVpZiAlMiA+IDE2CislaWYgJTIgIT0gMTYKKyVpZiBtbXNpemUgPT0gMTYKICVkZWZpbmUgbW92eCBtb3ZoCislZWxzZQorJWRlZmluZSBtb3Z4IG1vdmEKKyVlbmRpZgogICAgIGxlYSAgICAgICAgICAgICAgICAgICBkc3RxLCBbZHN0cSArIDQqc3RyaWRlcSAtIDRdCiAlZWxzZQogJWRlZmluZSBtb3Z4IG1vdnUKICAgICBsZWEgICAgICAgICAgICAgICAgICAgZHN0cSwgW2RzdHEgKyA0KnN0cmlkZXEgLSA4XSA7IGdvIGZyb20gdG9wIGNlbnRlciAoaCBwb3MpIHRvIGNlbnRlciBsZWZ0ICh2IHBvcykKICVlbmRpZgotICAgIGxlYSAgICAgICAgICAgICAgICAgIGRzdDJxLCBbZHN0cSArIDgqc3RyaWRlcV0KICVlbHNlCiAgICAgbGVhICAgICAgICAgICAgICAgICAgIGRzdHEsIFtkc3RxICsgNCptc3RyaWRlcV0KLSAgICBsZWEgICAgICAgICAgICAgICAgICBkc3QycSwgW2RzdHEgKyA4KnN0cmlkZXFdCiAlZW5kaWYKKyAgICA7IEZJWE1FIHdlIHNob3VsZG4ndCBuZWVkIHR3byBkdHMgcmVnaXN0ZXJzIGlmIG1tc2l6ZSA9PSA4CisgICAgbGVhICAgICAgICAgICAgICAgICAgZHN0MnEsIFtkc3RxICsgOCpzdHJpZGVxXQogCiAgICAgREVGSU5FX1JFQUxfUDdfVE9fUTcKIApAQCAtNDA2LDExICs0MTcsMTEgQEAKICAgICBtb3Z4ICAgICAgICAgICAgICAgICAgICBtMywgW1A0XQogICAgIG1vdnggICAgICAgICAgICAgICAgICAgIG00LCBbUDNdCiAgICAgbW92eCAgICAgICAgICAgICAgICAgICAgbTUsIFtQMl0KLSVpZiBBUkNIX1g4Nl82NCB8fCAlMiAhPSAxNgorJWlmIChBUkNIX1g4Nl82NCAmJiBtbXNpemUgPT0gMTYpIHx8ICUyID4gMTYKICAgICBtb3Z4ICAgICAgICAgICAgICAgICAgICBtNiwgW1AxXQogJWVuZGlmCiAgICAgbW92eCAgICAgICAgICAgICAgICAgICAgbTcsIFtQMF0KLSVpZiBBUkNIX1g4Nl82NAorJWlmZGVmIG04CiAgICAgbW92eCAgICAgICAgICAgICAgICAgICAgbTgsIFtRMF0KICAgICBtb3Z4ICAgICAgICAgICAgICAgICAgICBtOSwgW1ExXQogICAgIG1vdnggICAgICAgICAgICAgICAgICAgbTEwLCBbUTJdCkBAIC01MDIsNyArNTEzLDcgQEAKICAgICBtb3ZocHMgICAgICAgIFtRNV0sIG02CiAgICAgbW92aHBzICAgICAgICBbUTddLCBtNwogICAgIERFRklORV9UUkFOU1BPU0VEX1A3X1RPX1E3Ci0lZWxzZSA7ICUyID09IDQ0LzQ4Lzg0Lzg4CislZWxpZiAlMiA+IDE2IDsgJTIgPT0gNDQvNDgvODQvODgKICAgICBwdW5wY2tsYncgICAgICAgIG0wLCBtMQogICAgIHB1bnBja2xidyAgICAgICAgbTIsIG0zCiAgICAgcHVucGNrbGJ3ICAgICAgICBtNCwgbTUKQEAgLTUyOSwxMiArNTQwLDMxIEBACiAgICAgbW92YSAgICAgICAgICAgW1ExXSwgIG01CiAgICAgbW92YSAgICAgICAgICAgW1EyXSwgIG03CiAgICAgbW92YSAgICAgICAgICAgW1EzXSwgIG0zCislZWxzZSA7ICUyID09IDQgfHwgJTIgPT0gOAorICAgIFNCVVRURVJGTFkgICAgICAgYncsIDAsIDEsIDYKKyAgICBTQlVUVEVSRkxZICAgICAgIGJ3LCAyLCAzLCA2CisgICAgU0JVVFRFUkZMWSAgICAgICBidywgNCwgNSwgNgorICAgIG1vdmEgW3JzcCs0Km1tc2l6ZV0sIG01CisgICAgbW92YSAgICAgICAgICAgICBtNiwgW1AxXQorICAgIFNCVVRURVJGTFkgICAgICAgYncsIDYsIDcsIDUKKyAgICBERUZJTkVfVFJBTlNQT1NFRF9QN19UT19RNworICAgIFRSQU5TUE9TRTR4NFcgICAgIDAsIDIsIDQsIDYsIDUKKyAgICBtb3ZhICAgICAgICAgICBbUDNdLCBtMAorICAgIG1vdmEgICAgICAgICAgIFtQMl0sIG0yCisgICAgbW92YSAgICAgICAgICAgW1AxXSwgbTQKKyAgICBtb3ZhICAgICAgICAgICBbUDBdLCBtNgorICAgIG1vdmEgICAgICAgICAgICAgbTUsIFtyc3ArNCptbXNpemVdCisgICAgVFJBTlNQT1NFNHg0VyAgICAgMSwgMywgNSwgNywgMAorICAgIG1vdmEgICAgICAgICAgIFtRMF0sIG0xCisgICAgbW92YSAgICAgICAgICAgW1ExXSwgbTMKKyAgICBtb3ZhICAgICAgICAgICBbUTJdLCBtNQorICAgIG1vdmEgICAgICAgICAgIFtRM10sIG03CiAlZW5kaWYgOyAlMgogJWVuZGlmIDsgeDg2LTMyLzY0CiAlZW5kaWYgOyAlMSA9PSBoCiAKICAgICA7IGNhbGMgZm0gbWFzawotJWlmICUyID09IDE2CislaWYgJTIgPT0gMTYgfHwgbW1zaXplID09IDgKICVpZiBjcHVmbGFnKHNzc2UzKQogICAgIHB4b3IgICAgICAgICAgICAgICAgbTAsIG0wCiAlZW5kaWYKQEAgLTU1Miw3ICs1ODIsNyBAQAogICAgIG1vdmEgICAgICAgICAgICAgICAgbTAsIFtwYl84MF0KICAgICBweG9yICAgICAgICAgICAgICAgIG0yLCBtMAogICAgIHB4b3IgICAgICAgICAgICAgICAgbTMsIG0wCi0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogJWlmaWRuICUxLCB2CiAgICAgbW92YSAgICAgICAgICAgICAgICBtOCwgW1AzXQogICAgIG1vdmEgICAgICAgICAgICAgICAgbTksIFtQMl0KQEAgLTYxMywxMCArNjQzLDEwIEBACiAKICAgICA7IChtMzogZm0sIG04Li4xNTogcDMgcDIgcDEgcDAgcTAgcTEgcTIgcTMpCiAgICAgOyBjYWxjIGZsYXQ4aW4gKGlmIG5vdCA0NF8xNikgYW5kIGhldiBtYXNrcwotJWlmICUyICE9IDQ0CislaWYgJTIgIT0gNDQgJiYgJTIgIT0gNAogICAgIG1vdmEgICAgICAgICAgICAgICAgbTYsIFtwYl84MV0gICAgICAgICAgICAgICAgICAgICA7IFsxIDEgMSAxIC4uLl0gXiAweDgwCiAgICAgQUJTU1VCX0dUICAgICAgICAgICBtMiwgcnAzLCBycDAsIG02LCBtNSAgICAgICAgICAgIDsgYWJzKHAzIC0gcDApIDw9IDEKLSVpZiBBUkNIX1g4Nl82NAorJWlmZGVmIG04CiAgICAgbW92YSAgICAgICAgICAgICAgICBtOCwgW3BiXzgwXQogJWRlZmluZSByYjgwIG04CiAlZWxzZQpAQCAtNjI1LDcgKzY1NSw3IEBACiAgICAgQUJTU1VCX0dUICAgICAgICAgICBtMSwgcnAyLCBycDAsIG02LCBtNSwgcmI4MCAgICAgIDsgYWJzKHAyIC0gcDApIDw9IDEKICAgICBwb3IgICAgICAgICAgICAgICAgIG0yLCBtMQogICAgIEFCU1NVQiAgICAgICAgICAgICAgbTQsIHJwMSwgcnAwLCBtNSAgICAgICAgICAgICAgICA7IGFicyhwMSAtIHAwKQotJWlmICUyID09IDE2CislaWYgJTIgPD0gMTYKICVpZiBjcHVmbGFnKHNzc2UzKQogICAgIHB4b3IgICAgICAgICAgICAgICAgbTAsIG0wCiAlZW5kaWYKQEAgLTY1NSw4ICs2ODUsMTUgQEAKICVlbmRpZgogJWVsc2UKICAgICBtb3ZhICAgICAgICAgICAgICAgIG02LCBbcGJfODBdCislaWYgJTIgPT0gNDQKICAgICBtb3ZkICAgICAgICAgICAgICAgIG03LCBIZAogICAgIFNQTEFUQl9NSVggICAgICAgICAgbTcKKyVlbHNlCislaWYgY3B1ZmxhZyhzc3NlMykKKyAgICBweG9yICAgICAgICAgICAgICAgIG0wLCBtMAorJWVuZGlmCisgICAgU1BMQVRCX1JFRyAgICAgICAgICBtNywgSCwgbTAgICAgICAgICAgICAgICAgICAgICAgIDsgSCBIIEggSCAuLi4KKyVlbmRpZgogICAgIHB4b3IgICAgICAgICAgICAgICAgbTcsIG02CiAgICAgQUJTU1VCICAgICAgICAgICAgICBtNCwgcnAxLCBycDAsIG0xICAgICAgICAgICAgICAgIDsgYWJzKHAxIC0gcDApCiAgICAgcHhvciAgICAgICAgICAgICAgICBtNCwgbTYKQEAgLTY3MCw3ICs3MDcsNyBAQAogJWlmICUyID09IDE2CiAgICAgOyAobTA6IGhldiwgbTI6IGZsYXQ4aW4sIG0zOiBmbSwgbTY6IHBiXzgxLCBtOS4uMTU6IHAyIHAxIHAwIHEwIHExIHEyIHEzKQogICAgIDsgY2FsYyBmbGF0OG91dCBtYXNrCi0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIG1vdmEgICAgICAgICAgICAgICAgbTgsIFtQN10KICAgICBtb3ZhICAgICAgICAgICAgICAgIG05LCBbUDZdCiAlZGVmaW5lIHJwNyBtOApAQCAtNjgyLDcgKzcxOSw3IEBACiAgICAgQUJTU1VCX0dUICAgICAgICAgICBtMSwgcnA3LCBycDAsIG02LCBtNSAgICAgICAgICAgIDsgYWJzKHA3IC0gcDApIDw9IDEKICAgICBBQlNTVUJfR1QgICAgICAgICAgIG03LCBycDYsIHJwMCwgbTYsIG01ICAgICAgICAgICAgOyBhYnMocDYgLSBwMCkgPD0gMQogICAgIHBvciAgICAgICAgICAgICAgICAgbTEsIG03Ci0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIG1vdmEgICAgICAgICAgICAgICAgbTgsIFtQNV0KICAgICBtb3ZhICAgICAgICAgICAgICAgIG05LCBbUDRdCiAlZGVmaW5lIHJwNSBtOApAQCAtNjk1LDcgKzczMiw3IEBACiAgICAgcG9yICAgICAgICAgICAgICAgICBtMSwgbTcKICAgICBBQlNTVUJfR1QgICAgICAgICAgIG03LCBycDQsIHJwMCwgbTYsIG01ICAgICAgICAgICAgOyBhYnMocDQgLSBwMCkgPD0gMQogICAgIHBvciAgICAgICAgICAgICAgICAgbTEsIG03Ci0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIG1vdmEgICAgICAgICAgICAgICAgbTE0LCBbUTRdCiAgICAgbW92YSAgICAgICAgICAgICAgICBtMTUsIFtRNV0KICVkZWZpbmUgcnE0IG0xNApAQCAtNzA4LDcgKzc0NSw3IEBACiAgICAgcG9yICAgICAgICAgICAgICAgICBtMSwgbTcKICAgICBBQlNTVUJfR1QgICAgICAgICAgIG03LCBycTUsIHJxMCwgbTYsIG01ICAgICAgICAgICAgOyBhYnMocTUgLSBxMCkgPD0gMQogICAgIHBvciAgICAgICAgICAgICAgICAgbTEsIG03Ci0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIG1vdmEgICAgICAgICAgICAgICAgbTE0LCBbUTZdCiAgICAgbW92YSAgICAgICAgICAgICAgICBtMTUsIFtRN10KICVkZWZpbmUgcnE2IG0xNApAQCAtNzM4LDcgKzc3NSw3IEBACiAKICAgICA7IChtMDogaGV2LCBbbTE6IGZsYXQ4b3V0XSwgW20yOiBmbGF0OGluXSwgbTM6IGZtLCBtOC4uMTU6IHA1IHA0IHAxIHAwIHEwIHExIHE2IHE3KQogICAgIDsgZmlsdGVyMigpCi0laWYgJTIgIT0gNDQKKyVpZiAlMiAhPSA0NCAmJiAlMiAhPSA0CiAgICAgbW92YSAgICAgICAgICAgICAgICBtNiwgW3BiXzgwXSAgICAgICAgICAgICAgICAgICAgIDsgYWxyZWFkeSBpbiBtNiBpZiA0NF8xNgogICAgIFNDUkFUQ0ggICAgICAgICAgICAgIDIsIDE1LCByc3ArJTMrJTQKICVpZiAlMiA9PSAxNgpAQCAtNzU2LDcgKzc5Myw3IEBACiAgICAgcGFkZHNiICAgICAgICAgICAgICBtNCwgbTIgICAgICAgICAgICAgICAgICAgICAgICAgIDsgMyoocTAgLSBwMCkgKyAocDEgLSBxMSkKICAgICBwYWRkc2IgICAgICAgICAgICAgIG02LCBtNCwgW3BiXzRdICAgICAgICAgICAgICAgICAgOyBtNjogZjEgPSBjbGlwKGYgKyA0LCAxMjcpCiAgICAgcGFkZHNiICAgICAgICAgICAgICBtNCwgW3BiXzNdICAgICAgICAgICAgICAgICAgICAgIDsgbTQ6IGYyID0gY2xpcChmICsgMywgMTI3KQotJWlmIEFSQ0hfWDg2XzY0CislaWZkZWYgbTgKICAgICBtb3ZhICAgICAgICAgICAgICAgIG0xNCwgW3BiXzEwXSAgICAgICAgICAgICAgICAgICAgOyB3aWxsIGJlIHJldXNlZCBpbiBmaWx0ZXI0KCkKICVkZWZpbmUgcmIxMCBtMTQKICVlbHNlCkBAIC03NjUsOCArODAyLDggQEAKICAgICBTUlNISUZUM0JfMlggICAgICAgIG02LCBtNCwgcmIxMCwgbTcgICAgICAgICAgICAgICAgOyBmMSBhbmQgZjIgc2lnbiBieXRlIHNoaWZ0IGJ5IDMKICAgICBTSUdOX1NVQiAgICAgICAgICAgIG03LCBycTAsIG02LCBtNSAgICAgICAgICAgICAgICAgOyBtNyA9IHEwIC0gZjEKICAgICBTSUdOX0FERCAgICAgICAgICAgIG0xLCBycDAsIG00LCBtNSAgICAgICAgICAgICAgICAgOyBtMSA9IHAwICsgZjIKLSVpZiAlMiAhPSA0NAotJWlmIEFSQ0hfWDg2XzY0CislaWYgJTIgIT0gNDQgJiYgJTIgIT0gNAorJWlmZGVmIG04CiAgICAgcGFuZG4gICAgICAgICAgICAgICBtNiwgbTE1LCBtMyAgICAgICAgICAgICAgICAgICAgIDsgIH5tYXNrKGluKSAmIG1hc2soZm0pCiAlZWxzZQogICAgIG1vdmEgICAgICAgICAgICAgICAgbTYsIFtyc3ArJTMrJTRdCkBAIC03ODcsOCArODI0LDggQEAKICAgICBwYWRkc2IgICAgICAgICAgICAgIG02LCBtMiwgW3BiXzRdICAgICAgICAgICAgICAgICAgOyBtNjogIGYxID0gY2xpcChmICsgNCwgMTI3KQogICAgIHBhZGRzYiAgICAgICAgICAgICAgbTIsIFtwYl8zXSAgICAgICAgICAgICAgICAgICAgICA7IG0yOiBmMiA9IGNsaXAoZiArIDMsIDEyNykKICAgICBTUlNISUZUM0JfMlggICAgICAgIG02LCBtMiwgcmIxMCwgbTQgICAgICAgICAgICAgICAgOyBmMSBhbmQgZjIgc2lnbiBieXRlIHNoaWZ0IGJ5IDMKLSVpZiAlMiAhPSA0NAotJWlmIEFSQ0hfWDg2XzY0CislaWYgJTIgIT0gNDQgJiYgJTIgIT0gNAorJWlmZGVmIG04CiAgICAgcGFuZG4gICAgICAgICAgICAgICBtNSwgbTE1LCBtMyAgICAgICAgICAgICAgICAgICAgIDsgICAgICAgICAgICAgICB+bWFzayhpbikgJiBtYXNrKGZtKQogJWVsc2UKICAgICBtb3ZhICAgICAgICAgICAgICAgIG01LCBbcnNwKyUzKyU0XQpAQCAtODE1LDI2ICs4NTIsMjYgQEAKICAgICBtb3ZhICAgICAgICAgICAgICAgIFtQMV0sIG0xCiAgICAgbW92YSAgICAgICAgICAgICAgICBbUTFdLCBtNAogCi0laWYgJTIgIT0gNDQKKyVpZiAlMiAhPSA0NCAmJiAlMiAhPSA0CiAgICAgVU5TQ1JBVENIICAgICAgICAgICAgMiwgMTUsIHJzcCslMyslNAogJWVuZGlmCiAKICAgICA7IChbbTE6IGZsYXQ4b3V0XSwgbTI6IGZsYXQ4aW4sIG0zOiBmbSwgbTEwLi4xMzogcDEgcDAgcTAgcTEpCiAgICAgOyBmaWx0ZXI2KCkKLSVpZiAlMiAhPSA0NAorJWlmICUyICE9IDQ0ICYmICUyICE9IDQKICAgICBweG9yICAgICAgICAgICAgICAgIG0wLCBtMAotJWlmICUyID4gMTYKKyVpZiAlMiAhPSAxNgogICAgIHBhbmQgICAgICAgICAgICAgICAgbTMsIG0yCiAlZWxzZQogICAgIHBhbmQgICAgICAgICAgICAgICAgbTIsIG0zICAgICAgICAgICAgICAgICAgICAgICAgICA7ICAgICAgICAgICAgICAgbWFzayhmbSkgJiBtYXNrKGluKQotJWlmIEFSQ0hfWDg2XzY0CislaWZkZWYgbTgKICAgICBwYW5kbiAgICAgICAgICAgICAgIG0zLCBtOCwgbTIgICAgICAgICAgICAgICAgICAgICAgOyB+bWFzayhvdXQpICYgKG1hc2soZm0pICYgbWFzayhpbikpCiAlZWxzZQogICAgIG1vdmEgICAgICAgICAgICAgICAgbTMsIFtyc3ArJTMrJTQrMTZdCiAgICAgcGFuZG4gICAgICAgICAgICAgICBtMywgbTIKICVlbmRpZgogJWVuZGlmCi0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIG1vdmEgICAgICAgICAgICAgICBtMTQsIFtQM10KICAgICBtb3ZhICAgICAgICAgICAgICAgIG05LCBbUTNdCiAlZGVmaW5lIHJwMyBtMTQKQEAgLTg4Miw3ICs5MTksNyBAQAogICAgIHBhbmQgICAgICAgICAgICBtMSwgbTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgbWFzayhvdXQpICYgKG1hc2soZm0pICYgbWFzayhpbikpCiAgICAgbW92YSAgICAgICAgICAgIG0yLCBbUDddCiAgICAgbW92YSAgICAgICAgICAgIG0zLCBbUDZdCi0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIG1vdmEgICAgICAgICAgICBtOCwgW1A1XQogICAgIG1vdmEgICAgICAgICAgICBtOSwgW1A0XQogJWRlZmluZSBycDUgbTgKQEAgLTEwMDgsNyArMTA0NSw3IEBACiAgICAgbW92aHBzIFtRNV0sICBtNgogICAgIG1vdmhwcyBbUTddLCAgbTcKICVlbmRpZgotJWVsaWYgJTIgPT0gNDQKKyVlbGlmICUyID09IDQ0IHx8ICUyID09IDQKICAgICBTV0FQIDAsIDEgICA7IG0wID0gcDEKICAgICBTV0FQIDEsIDcgICA7IG0xID0gcDAKICAgICBTV0FQIDIsIDUgICA7IG0yID0gcTAKQEAgLTEwMTgsNiArMTA1NSw3IEBACiAgICAgU0JVVFRFUkZMWSAgYncsIDIsIDMsIDQKICAgICBTQlVUVEVSRkxZICB3ZCwgMCwgMiwgNAogICAgIFNCVVRURVJGTFkgIHdkLCAxLCAzLCA0CislaWYgbW1zaXplID09IDE2CiAgICAgbW92ZCAgW1A3XSwgbTAKICAgICBtb3ZkICBbUDNdLCBtMgogICAgIG1vdmQgIFtRMF0sIG0xCkBAIC0xMDQ3LDYgKzEwODUsMjAgQEAKICAgICBtb3ZkICBbUTNdLCBtMQogICAgIG1vdmQgIFtRN10sIG0zCiAlZWxzZQorICAgIG1vdmQgIFtQN10sIG0wCisgICAgbW92ZCAgW1A1XSwgbTIKKyAgICBtb3ZkICBbUDNdLCBtMQorICAgIG1vdmQgIFtQMV0sIG0zCisgICAgcHNybHEgICBtMCwgMzIKKyAgICBwc3JscSAgIG0yLCAzMgorICAgIHBzcmxxICAgbTEsIDMyCisgICAgcHNybHEgICBtMywgMzIKKyAgICBtb3ZkICBbUDZdLCBtMAorICAgIG1vdmQgIFtQNF0sIG0yCisgICAgbW92ZCAgW1AyXSwgbTEKKyAgICBtb3ZkICBbUDBdLCBtMworJWVuZGlmCislZWxzZQogICAgIDsgdGhlIGZvbGxvd2luZyBjb2RlIGRvIGEgdHJhbnNwb3NlIG9mIDggZnVsbCBsaW5lcyB0byAxNiBoYWxmCiAgICAgOyBsaW5lcyAoaGlnaCBwYXJ0KS4gSXQgaXMgaW5saW5lZCB0byBhdm9pZCB0aGUgbmVlZCBvZiBhIHN0YWdpbmcgYXJlYQogICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG0wLCBbUDNdCkBAIC0xMDU1LDEyICsxMTA3LDEyIEBACiAgICAgbW92YSAgICAgICAgICAgICAgICAgICAgbTMsIFtQMF0KICAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNCwgW1EwXQogICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG01LCBbUTFdCi0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIG1vdmEgICAgICAgICAgICAgICAgICAgIG02LCBbUTJdCiAlZW5kaWYKICAgICBtb3ZhICAgICAgICAgICAgICAgICAgICBtNywgW1EzXQogICAgIERFRklORV9SRUFMX1A3X1RPX1E3Ci0laWYgQVJDSF9YODZfNjQKKyVpZmRlZiBtOAogICAgIFNCVVRURVJGTFkgIGJ3LCAgMCwgIDEsIDgKICAgICBTQlVUVEVSRkxZICBidywgIDIsICAzLCA4CiAgICAgU0JVVFRFUkZMWSAgYncsICA0LCAgNSwgOApAQCAtMTA3NSwyNyArMTEyNywzMiBAQAogICAgIFNCVVRURVJGTFkgIGRxLCAgMywgIDcsIDgKICVlbHNlCiAgICAgU0JVVFRFUkZMWSAgYncsICAwLCAgMSwgNgotICAgIG1vdmEgIFtyc3ArNjRdLCBtMQotICAgIG1vdmEgICAgICAgIG02LCBbcnNwKzk2XQorICAgIG1vdmEgW3JzcCttbXNpemUqNF0sIG0xCisgICAgbW92YSAgICAgICAgbTYsIFtyc3ArbW1zaXplKjZdCiAgICAgU0JVVFRFUkZMWSAgYncsICAyLCAgMywgMQogICAgIFNCVVRURVJGTFkgIGJ3LCAgNCwgIDUsIDEKICAgICBTQlVUVEVSRkxZICBidywgIDYsICA3LCAxCiAgICAgU0JVVFRFUkZMWSAgd2QsICAwLCAgMiwgMQotICAgIG1vdmEgIFtyc3ArOTZdLCBtMgotICAgIG1vdmEgICAgICAgIG0xLCBbcnNwKzY0XQorICAgIG1vdmEgW3JzcCttbXNpemUqNl0sIG0yCisgICAgbW92YSAgICAgICAgbTEsIFtyc3ArbW1zaXplKjRdCiAgICAgU0JVVFRFUkZMWSAgd2QsICAxLCAgMywgMgogICAgIFNCVVRURVJGTFkgIHdkLCAgNCwgIDYsIDIKICAgICBTQlVUVEVSRkxZICB3ZCwgIDUsICA3LCAyCiAgICAgU0JVVFRFUkZMWSAgZHEsICAwLCAgNCwgMgogICAgIFNCVVRURVJGTFkgIGRxLCAgMSwgIDUsIDIKKyVpZiBtbXNpemUgPT0gMTYKICAgICBtb3ZoICAgICAgW1EwXSwgbTEKICAgICBtb3ZocHMgICAgW1ExXSwgbTEKLSAgICBtb3ZhICAgICAgICBtMiwgW3JzcCs5Nl0KKyVlbHNlCisgICAgbW92YSAgICAgIFtQM10sIG0xCislZW5kaWYKKyAgICBtb3ZhICAgICAgICBtMiwgW3JzcCttbXNpemUqNl0KICAgICBTQlVUVEVSRkxZICBkcSwgIDIsICA2LCAxCiAgICAgU0JVVFRFUkZMWSAgZHEsICAzLCAgNywgMQogJWVuZGlmCiAgICAgU1dBUCAgICAgICAgIDMsIDYKICAgICBTV0FQICAgICAgICAgMSwgNAorJWlmIG1tc2l6ZSA9PSAxNgogICAgIG1vdmggICAgICBbUDddLCBtMAogICAgIG1vdmhwcyAgICBbUDZdLCBtMAogICAgIG1vdmggICAgICBbUDVdLCBtMQpAQCAtMTEwNCw3ICsxMTYxLDcgQEAKICAgICBtb3ZocHMgICAgW1AyXSwgbTIKICAgICBtb3ZoICAgICAgW1AxXSwgbTMKICAgICBtb3ZocHMgICAgW1AwXSwgbTMKLSVpZiBBUkNIX1g4Nl82NAorJWlmZGVmIG04CiAgICAgbW92aCAgICAgIFtRMF0sIG00CiAgICAgbW92aHBzICAgIFtRMV0sIG00CiAlZW5kaWYKQEAgLTExMTQsNiArMTE3MSwxNSBAQAogICAgIG1vdmhwcyAgICBbUTVdLCBtNgogICAgIG1vdmggICAgICBbUTZdLCBtNwogICAgIG1vdmhwcyAgICBbUTddLCBtNworJWVsc2UKKyAgICBtb3ZhICAgICAgW1A3XSwgbTAKKyAgICBtb3ZhICAgICAgW1A2XSwgbTEKKyAgICBtb3ZhICAgICAgW1A1XSwgbTIKKyAgICBtb3ZhICAgICAgW1A0XSwgbTMKKyAgICBtb3ZhICAgICAgW1AyXSwgbTUKKyAgICBtb3ZhICAgICAgW1AxXSwgbTYKKyAgICBtb3ZhICAgICAgW1AwXSwgbTcKKyVlbmRpZgogJWVuZGlmCiAlZW5kaWYKIApAQCAtMTEzNywzICsxMjAzLDkgQEAKIExQRl8xNl9WSF9BTExfT1BUUyA0OCwgMjU2LCAxMjgsIDE2CiBMUEZfMTZfVkhfQUxMX09QVFMgODQsIDI1NiwgMTI4LCAxNgogTFBGXzE2X1ZIX0FMTF9PUFRTIDg4LCAyNTYsIDEyOCwgMTYKKworSU5JVF9NTVggbW14ZXh0CitMT09QRklMVEVSIHYsIDQsICAgMCwgIDAsIDAKK0xPT1BGSUxURVIgaCwgNCwgICAwLCA2NCwgMAorTE9PUEZJTFRFUiB2LCA4LCAxMjgsICAwLCA4CitMT09QRklMVEVSIGgsIDgsIDEyOCwgNjQsIDgKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3ZwOWxwZl8xNmJwcC5hc20gYi9saWJhdmNvZGVjL3g4Ni92cDlscGZfMTZicHAuYXNtCmluZGV4IGMxNTQzN2IuLmMwODg4MTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwOWxwZl8xNmJwcC5hc20KKysrIGIvbGliYXZjb2RlYy94ODYvdnA5bHBmXzE2YnBwLmFzbQpAQCAtNzgsNyArNzgsNyBAQAogJWVuZGlmCiAlZW5kbWFjcm8KIAotOyBjYWx1bGF0ZSBwIG9yIHEgcG9ydGlvbiBvZiBmbGF0OG91dAorOyBjYWxjdWxhdGUgcCBvciBxIHBvcnRpb24gb2YgZmxhdDhvdXQKICVtYWNybyBGTEFUOE9VVF9IQUxGIDAKICAgICBwc3VidyAgICAgICAgICAgICAgIG00LCBtMCAgICAgICAgICAgICAgICAgICAgICA7IHE0LXEwCiAgICAgcHN1YncgICAgICAgICAgICAgICBtNSwgbTAgICAgICAgICAgICAgICAgICAgICAgOyBxNS1xMApkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ODYvdnA5bWMuYXNtIGIvbGliYXZjb2RlYy94ODYvdnA5bWMuYXNtCmluZGV4IDkxNTJiYTUuLmY2NDE2MWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3ZwOW1jLmFzbQorKysgYi9saWJhdmNvZGVjL3g4Ni92cDltYy5hc20KQEAgLTEsNSArMSw1IEBACiA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi07KiBWUDkgTUMgU0lNRCBvcHRpbWl6YXRpb25zCis7KiBWUDkgbW90aW9uIGNvbXBlbnNhdGlvbiBTSU1EIG9wdGltaXphdGlvbnMKIDsqCiA7KiBDb3B5cmlnaHQgKGMpIDIwMTMgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amUgZ21haWwgY29tPgogOyoKQEAgLTQ0MCw5ICs0NDAsOCBAQAogICAgIG1vdmEgICAgICAgbTEwLCBbZmlsdGVyeXErOTZdCiAlZW5kaWYKIC5sb29wOgotICAgIDsgRklYTUUgbWF5YmUgcmV1c2UgbG9hZHMgZnJvbSBwcmV2aW91cyByb3dzLCBvciBqdXN0Ci0gICAgOyBtb3JlIGdlbmVyYWxseSB1bnJvbGwgdGhpcyB0byBwcmV2ZW50IG11bHRpcGxlIGxvYWRzIG9mCi0gICAgOyB0aGUgc2FtZSBkYXRhPworICAgIDsgRklYTUUgbWF5YmUgcmV1c2UgbG9hZHMgZnJvbSBwcmV2aW91cyByb3dzLCBvciBqdXN0IG1vcmUgZ2VuZXJhbGx5CisgICAgOyB1bnJvbGwgdGhpcyB0byBwcmV2ZW50IG11bHRpcGxlIGxvYWRzIG9mIHRoZSBzYW1lIGRhdGE/CiAgICAgbW92aCAgICAgICAgbTAsIFtzcmNxXQogICAgIG1vdmggICAgICAgIG0xLCBbc3JjcStzc3RyaWRlcV0KICAgICBtb3ZoICAgICAgICBtMiwgW3NyY3Erc3N0cmlkZXEqMl0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3c2NHhtbXRlc3QuYyBiL2xpYmF2Y29kZWMveDg2L3c2NHhtbXRlc3QuYwppbmRleCA5NGIzMDQ5Li44ZjJiOGE2IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3g4Ni93NjR4bW10ZXN0LmMKKysrIGIvbGliYXZjb2RlYy94ODYvdzY0eG1tdGVzdC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni93NjR4bW10ZXN0LmgiCiAKIHdyYXAoYXZjb2RlY19vcGVuMihBVkNvZGVjQ29udGV4dCAqYXZjdHgsCi0gICAgICAgICAgICAgICAgICAgQVZDb2RlYyAqY29kZWMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQVZDb2RlYyAqY29kZWMsCiAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykpCiB7CiAgICAgdGVzdHhtbWNsb2JiZXJzKGF2Y29kZWNfb3BlbjIsIGF2Y3R4LCBjb2RlYywgb3B0aW9ucyk7CkBAIC03NywzICs3NywyMyBAQAogewogICAgIHRlc3R4bW1jbG9iYmVycyhhdmNvZGVjX2VuY29kZV92aWRlbzIsIGF2Y3R4LCBhdnBrdCwgZnJhbWUsIGdvdF9wYWNrZXRfcHRyKTsKIH0KKword3JhcChhdmNvZGVjX3NlbmRfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgY29uc3QgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0eG1tY2xvYmJlcnMoYXZjb2RlY19zZW5kX3BhY2tldCwgYXZjdHgsIGF2cGt0KTsKK30KKword3JhcChhdmNvZGVjX3JlY2VpdmVfcGFja2V0KEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKmF2cGt0KSkKK3sKKyAgICB0ZXN0eG1tY2xvYmJlcnMoYXZjb2RlY19yZWNlaXZlX3BhY2tldCwgYXZjdHgsIGF2cGt0KTsKK30KKword3JhcChhdmNvZGVjX3NlbmRfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBjb25zdCBBVkZyYW1lICpmcmFtZSkpCit7CisgICAgdGVzdHhtbWNsb2JiZXJzKGF2Y29kZWNfc2VuZF9mcmFtZSwgYXZjdHgsIGZyYW1lKTsKK30KKword3JhcChhdmNvZGVjX3JlY2VpdmVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBBVkZyYW1lICpmcmFtZSkpCit7CisgICAgdGVzdHhtbWNsb2JiZXJzKGF2Y29kZWNfcmVjZWl2ZV9mcmFtZSwgYXZjdHgsIGZyYW1lKTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveDg2L3h2aWRpZGN0LmggYi9saWJhdmNvZGVjL3g4Ni94dmlkaWRjdC5oCmluZGV4IDU3M2IyNWMuLmVkYjVlYmYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveDg2L3h2aWRpZGN0LmgKKysrIGIvbGliYXZjb2RlYy94ODYveHZpZGlkY3QuaApAQCAtMjYsMTggKzI2LDE5IEBACiAjaWZuZGVmIEFWQ09ERUNfWDg2X1hWSURJRENUX0gKICNkZWZpbmUgQVZDT0RFQ19YODZfWFZJRElEQ1RfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIHZvaWQgZmZfeHZpZF9pZGN0X21teChzaG9ydCAqYmxvY2spOwotdm9pZCBmZl94dmlkX2lkY3RfbW14X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3h2aWRfaWRjdF9tbXhfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfeHZpZF9pZGN0X21teF9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl94dmlkX2lkY3RfbW14X2FkZCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CiAKIHZvaWQgZmZfeHZpZF9pZGN0X21teGV4dChzaG9ydCAqYmxvY2spOwotdm9pZCBmZl94dmlkX2lkY3RfbW14ZXh0X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7Ci12b2lkIGZmX3h2aWRfaWRjdF9tbXhleHRfYWRkKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKTsKK3ZvaWQgZmZfeHZpZF9pZGN0X21teGV4dF9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spOwordm9pZCBmZl94dmlkX2lkY3RfbW14ZXh0X2FkZCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBpbnQxNl90ICpibG9jayk7CiAKIHZvaWQgZmZfeHZpZF9pZGN0X3NzZTIoc2hvcnQgKmJsb2NrKTsKLXZvaWQgZmZfeHZpZF9pZGN0X3B1dF9zc2UyKHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIHNob3J0ICpibG9jayk7Ci12b2lkIGZmX3h2aWRfaWRjdF9hZGRfc3NlMih1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBzaG9ydCAqYmxvY2spOwordm9pZCBmZl94dmlkX2lkY3RfcHV0X3NzZTIodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgc2hvcnQgKmJsb2NrKTsKK3ZvaWQgZmZfeHZpZF9pZGN0X2FkZF9zc2UyKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIHNob3J0ICpibG9jayk7CiAKICNlbmRpZiAvKiBBVkNPREVDX1g4Nl9YVklESURDVF9IICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3g4Ni94dmlkaWRjdF9pbml0LmMgYi9saWJhdmNvZGVjL3g4Ni94dmlkaWRjdF9pbml0LmMKaW5kZXggOGI5ZDhkZS4uYTkxYjQxNiAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94ODYveHZpZGlkY3RfaW5pdC5jCisrKyBiL2xpYmF2Y29kZWMveDg2L3h2aWRpZGN0X2luaXQuYwpAQCAtMjYsMzYgKzI2LDM2IEBACiAjaW5jbHVkZSAiaWRjdGRzcC5oIgogI2luY2x1ZGUgInh2aWRpZGN0LmgiCiAKLSNpZiBBUkNIX1g4Nl8zMiAmJiBIQVZFX1lBU00KLXN0YXRpYyB2b2lkIHh2aWRfaWRjdF9tbXhfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIHNob3J0ICpibG9jaykKKyNpZiBBUkNIX1g4Nl8zMiAmJiBIQVZFX1g4NkFTTQorc3RhdGljIHZvaWQgeHZpZF9pZGN0X21teF9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgc2hvcnQgKmJsb2NrKQogewogICAgIGZmX3h2aWRfaWRjdF9tbXgoYmxvY2spOwotICAgIGZmX3B1dF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKKyAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWRfbW14KGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOwogfQogCi1zdGF0aWMgdm9pZCB4dmlkX2lkY3RfbW14X2FkZCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBzaG9ydCAqYmxvY2spCitzdGF0aWMgdm9pZCB4dmlkX2lkY3RfbW14X2FkZCh1aW50OF90ICpkZXN0LCBwdHJkaWZmX3QgbGluZV9zaXplLCBzaG9ydCAqYmxvY2spCiB7CiAgICAgZmZfeHZpZF9pZGN0X21teChibG9jayk7Ci0gICAgZmZfYWRkX3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9tbXgoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHh2aWRfaWRjdF9tbXhleHRfcHV0KHVpbnQ4X3QgKmRlc3QsIGludCBsaW5lX3NpemUsIHNob3J0ICpibG9jaykKK3N0YXRpYyB2b2lkIHh2aWRfaWRjdF9tbXhleHRfcHV0KHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIHNob3J0ICpibG9jaykKIHsKICAgICBmZl94dmlkX2lkY3RfbW14ZXh0KGJsb2NrKTsKLSAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7CisgICAgZmZfcHV0X3BpeGVsc19jbGFtcGVkX21teChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKIH0KIAotc3RhdGljIHZvaWQgeHZpZF9pZGN0X21teGV4dF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgc2hvcnQgKmJsb2NrKQorc3RhdGljIHZvaWQgeHZpZF9pZGN0X21teGV4dF9hZGQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgc2hvcnQgKmJsb2NrKQogewogICAgIGZmX3h2aWRfaWRjdF9tbXhleHQoYmxvY2spOwotICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZChibG9jaywgZGVzdCwgbGluZV9zaXplKTsKKyAgICBmZl9hZGRfcGl4ZWxzX2NsYW1wZWRfbW14KGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOwogfQogI2VuZGlmCiAKIGF2X2NvbGQgdm9pZCBmZl94dmlkX2lkY3RfaW5pdF94ODYoSURDVERTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaGlnaF9iaXRfZGVwdGgpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKGhpZ2hfYml0X2RlcHRoIHx8CkBAIC04NSw1ICs4NSw1IEBACiAgICAgICAgIGMtPmlkY3QgICAgICA9IGZmX3h2aWRfaWRjdF9zc2UyOwogICAgICAgICBjLT5wZXJtX3R5cGUgPSBGRl9JRENUX1BFUk1fU1NFMjsKICAgICB9Ci0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveGFuLmMgYi9saWJhdmNvZGVjL3hhbi5jCmluZGV4IDY2MjM4NmEuLjFjY2YxNjQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveGFuLmMKKysrIGIvbGliYXZjb2RlYy94YW4uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBXaW5nIENvbW1hbmRlci9YYW4gVmlkZW8gRGVjb2RlcgotICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChDKSAyMDAzIFRoZSBGRm1wZWcgcHJvamVjdAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0zNCw5ICszNCwxMCBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2RlZmluZSBCSVRTVFJFQU1fUkVBREVSX0xFCiAjaW5jbHVkZSAiYXZjb2RlYy5oIgogI2luY2x1ZGUgImJ5dGVzdHJlYW0uaCIKLSNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImdldF9iaXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtMTMwLDcgKzEzMSwxMCBAQAogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgd2hpbGUgKHZhbCAhPSAweDE2KSB7Ci0gICAgICAgIHVuc2lnbmVkIGlkeCA9IHZhbCAtIDB4MTcgKyBnZXRfYml0czEoJmdiKSAqIGJ5dGU7CisgICAgICAgIHVuc2lnbmVkIGlkeDsKKyAgICAgICAgaWYgKGdldF9iaXRzX2xlZnQoJmdiKSA8IDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWR4ID0gdmFsIC0gMHgxNyArIGdldF9iaXRzMSgmZ2IpICogYnl0ZTsKICAgICAgICAgaWYgKGlkeCA+PSAyICogYnl0ZSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB2YWwgPSBzcmNbaWR4XTsKQEAgLTI2Miw3ICsyNjYsNyBAQAogICAgIHByZXZmcmFtZV9pbmRleCA9ICh5ICsgbW90aW9uX3kpICogc3RyaWRlICsgeCArIG1vdGlvbl94OwogICAgIHByZXZmcmFtZV94ID0geCArIG1vdGlvbl94OwogCi0gICAgaWYgKHByZXZfcGFsZXR0ZV9wbGFuZSA9PSBwYWxldHRlX3BsYW5lICYmIEZGQUJTKGN1cmZyYW1lX2luZGV4IC0gcHJldmZyYW1lX2luZGV4KSA8IHBpeGVsX2NvdW50KSB7CisgICAgaWYgKHByZXZfcGFsZXR0ZV9wbGFuZSA9PSBwYWxldHRlX3BsYW5lICYmIEZGQUJTKG1vdGlvbl94ICsgd2lkdGgqbW90aW9uX3kpIDwgcGl4ZWxfY291bnQpIHsKICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLT5hdmN0eCwgIk92ZXJsYXBwaW5nIGNvcHkiKTsKICAgICAgICAgIHJldHVybiA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94ZmFjZS5jIGIvbGliYXZjb2RlYy94ZmFjZS5jCmluZGV4IDhjMGNiZmQuLjE4NGMxNzQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveGZhY2UuYworKysgYi9saWJhdmNvZGVjL3hmYWNlLmMKQEAgLTMxNSw5ICszMTUsOSBAQAogCiAgICAgICAgICAgICBmb3IgKGwgPSBpIC0gMjsgbCA8PSBpICsgMjsgbCsrKSB7CiAgICAgICAgICAgICAgICAgZm9yIChtID0gaiAtIDI7IG0gPD0gajsgbSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsID49IGkgJiYgbSA9PSBqKQorICAgICAgICAgICAgICAgICAgICBpZiAobCA8PSAwIHx8IGwgPj0gaSAmJiBtID09IGopCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGwgPiAwICYmIGwgPD0gWEZBQ0VfV0lEVEggJiYgbSA+IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChsIDw9IFhGQUNFX1dJRFRIICYmIG0gPiAwKQogICAgICAgICAgICAgICAgICAgICAgICAgayA9IDIqayArIHNyY1tsICsgbSAqIFhGQUNFX1dJRFRIXTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3htYV9wYXJzZXIuYyBiL2xpYmF2Y29kZWMveG1hX3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTM2NzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmNvZGVjL3htYV9wYXJzZXIuYwpAQCAtMCwwICsxLDYyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFhNQTIgYXVkaW8gcGFyc2VyCisgKi8KKworI2luY2x1ZGUgInBhcnNlci5oIgorCit0eXBlZGVmIHN0cnVjdCBYTUFQYXJzZXJDb250ZXh0eworICAgIGludCBza2lwX3BhY2tldHM7Cit9IFhNQVBhcnNlckNvbnRleHQ7CisKK3N0YXRpYyBpbnQgeG1hX3BhcnNlKEFWQ29kZWNQYXJzZXJDb250ZXh0ICpzMSwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnBvdXRidWYsIGludCAqcG91dGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCit7CisgICAgWE1BUGFyc2VyQ29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CisKKyAgICBpZiAoYnVmX3NpemUgJSAyMDQ4ID09IDApIHsKKyAgICAgICAgaW50IGR1cmF0aW9uID0gMCwgcGFja2V0LCBuYl9wYWNrZXRzID0gYnVmX3NpemUgLyAyMDQ4OworCisgICAgICAgIGZvciAocGFja2V0ID0gMDsgcGFja2V0IDwgbmJfcGFja2V0czsgcGFja2V0KyspIHsKKyAgICAgICAgICAgIGlmIChzLT5za2lwX3BhY2tldHMgPT0gMCkgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uICs9IGJ1ZltwYWNrZXQgKiAyMDQ4XSAqIDEyODsKKyAgICAgICAgICAgICAgICBzLT5za2lwX3BhY2tldHMgPSBidWZbcGFja2V0ICogMjA0OCArIDNdICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnNraXBfcGFja2V0cy0tOworICAgICAgICB9CisKKyAgICAgICAgczEtPmR1cmF0aW9uID0gZHVyYXRpb247CisgICAgICAgIHMxLT5rZXlfZnJhbWUgPSAhIWR1cmF0aW9uOworICAgIH0KKworICAgIC8qIGFsd2F5cyByZXR1cm4gdGhlIGZ1bGwgcGFja2V0LiB0aGlzIHBhcnNlciBpc24ndCBkb2luZyBhbnkgc3BsaXR0aW5nIG9yCisgICAgICAgY29tYmluaW5nLCBvbmx5IHBhY2tldCBhbmFseXNpcyAqLworICAgICpwb3V0YnVmICAgICAgPSBidWY7CisgICAgKnBvdXRidWZfc2l6ZSA9IGJ1Zl9zaXplOworICAgIHJldHVybiBidWZfc2l6ZTsKK30KKworQVZDb2RlY1BhcnNlciBmZl94bWFfcGFyc2VyID0geworICAgIC5jb2RlY19pZHMgICAgICA9IHsgQVZfQ09ERUNfSURfWE1BMiB9LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihYTUFQYXJzZXJDb250ZXh0KSwKKyAgICAucGFyc2VyX3BhcnNlICAgPSB4bWFfcGFyc2UsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94cG1kZWMuYyBiL2xpYmF2Y29kZWMveHBtZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNzJlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveHBtZGVjLmMKQEAgLTAsMCArMSw0NDMgQEAKKy8qCisgKiBYUE0gaW1hZ2UgZm9ybWF0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFBhdWwgQiBNYWhvbAorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhcmFzIENoYWRoYQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgWFBNQ29udGV4dCB7CisgICAgdWludDMyX3QgICpwaXhlbHM7CisgICAgaW50ICAgICAgICBwaXhlbHNfc2l6ZTsKKyAgICB1aW50OF90ICAgKmJ1ZjsKKyAgICBpbnQgICAgICAgIGJ1Zl9zaXplOworfSBYUE1EZWNDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBDb2xvckVudHJ5IHsKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgIC8vLzwgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSBjb2xvcgorICAgIHVpbnQzMl90ICAgIHJnYl9jb2xvcjsgICAgLy8vPCBSR0IgdmFsdWVzIGZvciB0aGUgY29sb3IKK30gQ29sb3JFbnRyeTsKKworc3RhdGljIGludCBjb2xvcl90YWJsZV9jb21wYXJlKGNvbnN0IHZvaWQgKmxocywgY29uc3Qgdm9pZCAqcmhzKQoreworICAgIHJldHVybiBhdl9zdHJjYXNlY21wKGxocywgKChjb25zdCBDb2xvckVudHJ5ICopcmhzKS0+bmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBDb2xvckVudHJ5IGNvbG9yX3RhYmxlW10gPSB7CisgICAgeyAiQWxpY2VCbHVlIiwgICAgICAgICAgICAweEZGRjBGOEZGIH0sCisgICAgeyAiQW50aXF1ZVdoaXRlIiwgICAgICAgICAweEZGRkFFQkQ3IH0sCisgICAgeyAiQXF1YSIsICAgICAgICAgICAgICAgICAweEZGMDBGRkZGIH0sCisgICAgeyAiQXF1YW1hcmluZSIsICAgICAgICAgICAweEZGN0ZGRkQ0IH0sCisgICAgeyAiQXp1cmUiLCAgICAgICAgICAgICAgICAweEZGRjBGRkZGIH0sCisgICAgeyAiQmVpZ2UiLCAgICAgICAgICAgICAgICAweEZGRjVGNURDIH0sCisgICAgeyAiQmlzcXVlIiwgICAgICAgICAgICAgICAweEZGRkZFNEM0IH0sCisgICAgeyAiQmxhY2siLCAgICAgICAgICAgICAgICAweEZGMDAwMDAwIH0sCisgICAgeyAiQmxhbmNoZWRBbG1vbmQiLCAgICAgICAweEZGRkZFQkNEIH0sCisgICAgeyAiQmx1ZSIsICAgICAgICAgICAgICAgICAweEZGMDAwMEZGIH0sCisgICAgeyAiQmx1ZVZpb2xldCIsICAgICAgICAgICAweEZGOEEyQkUyIH0sCisgICAgeyAiQnJvd24iLCAgICAgICAgICAgICAgICAweEZGQTUyQTJBIH0sCisgICAgeyAiQnVybHlXb29kIiwgICAgICAgICAgICAweEZGREVCODg3IH0sCisgICAgeyAiQ2FkZXRCbHVlIiwgICAgICAgICAgICAweEZGNUY5RUEwIH0sCisgICAgeyAiQ2hhcnRyZXVzZSIsICAgICAgICAgICAweEZGN0ZGRjAwIH0sCisgICAgeyAiQ2hvY29sYXRlIiwgICAgICAgICAgICAweEZGRDI2OTFFIH0sCisgICAgeyAiQ29yYWwiLCAgICAgICAgICAgICAgICAweEZGRkY3RjUwIH0sCisgICAgeyAiQ29ybmZsb3dlckJsdWUiLCAgICAgICAweEZGNjQ5NUVEIH0sCisgICAgeyAiQ29ybnNpbGsiLCAgICAgICAgICAgICAweEZGRkZGOERDIH0sCisgICAgeyAiQ3JpbXNvbiIsICAgICAgICAgICAgICAweEZGREMxNDNDIH0sCisgICAgeyAiQ3lhbiIsICAgICAgICAgICAgICAgICAweEZGMDBGRkZGIH0sCisgICAgeyAiRGFya0JsdWUiLCAgICAgICAgICAgICAweEZGMDAwMDhCIH0sCisgICAgeyAiRGFya0N5YW4iLCAgICAgICAgICAgICAweEZGMDA4QjhCIH0sCisgICAgeyAiRGFya0dvbGRlblJvZCIsICAgICAgICAweEZGQjg4NjBCIH0sCisgICAgeyAiRGFya0dyYXkiLCAgICAgICAgICAgICAweEZGQTlBOUE5IH0sCisgICAgeyAiRGFya0dyZWVuIiwgICAgICAgICAgICAweEZGMDA2NDAwIH0sCisgICAgeyAiRGFya0toYWtpIiwgICAgICAgICAgICAweEZGQkRCNzZCIH0sCisgICAgeyAiRGFya01hZ2VudGEiLCAgICAgICAgICAweEZGOEIwMDhCIH0sCisgICAgeyAiRGFya09saXZlR3JlZW4iLCAgICAgICAweEZGNTU2QjJGIH0sCisgICAgeyAiRGFya29yYW5nZSIsICAgICAgICAgICAweEZGRkY4QzAwIH0sCisgICAgeyAiRGFya09yY2hpZCIsICAgICAgICAgICAweEZGOTkzMkNDIH0sCisgICAgeyAiRGFya1JlZCIsICAgICAgICAgICAgICAweEZGOEIwMDAwIH0sCisgICAgeyAiRGFya1NhbG1vbiIsICAgICAgICAgICAweEZGRTk5NjdBIH0sCisgICAgeyAiRGFya1NlYUdyZWVuIiwgICAgICAgICAweEZGOEZCQzhGIH0sCisgICAgeyAiRGFya1NsYXRlQmx1ZSIsICAgICAgICAweEZGNDgzRDhCIH0sCisgICAgeyAiRGFya1NsYXRlR3JheSIsICAgICAgICAweEZGMkY0RjRGIH0sCisgICAgeyAiRGFya1R1cnF1b2lzZSIsICAgICAgICAweEZGMDBDRUQxIH0sCisgICAgeyAiRGFya1Zpb2xldCIsICAgICAgICAgICAweEZGOTQwMEQzIH0sCisgICAgeyAiRGVlcFBpbmsiLCAgICAgICAgICAgICAweEZGRkYxNDkzIH0sCisgICAgeyAiRGVlcFNreUJsdWUiLCAgICAgICAgICAweEZGMDBCRkZGIH0sCisgICAgeyAiRGltR3JheSIsICAgICAgICAgICAgICAweEZGNjk2OTY5IH0sCisgICAgeyAiRG9kZ2VyQmx1ZSIsICAgICAgICAgICAweEZGMUU5MEZGIH0sCisgICAgeyAiRmlyZUJyaWNrIiwgICAgICAgICAgICAweEZGQjIyMjIyIH0sCisgICAgeyAiRmxvcmFsV2hpdGUiLCAgICAgICAgICAweEZGRkZGQUYwIH0sCisgICAgeyAiRm9yZXN0R3JlZW4iLCAgICAgICAgICAweEZGMjI4QjIyIH0sCisgICAgeyAiRnVjaHNpYSIsICAgICAgICAgICAgICAweEZGRkYwMEZGIH0sCisgICAgeyAiR2FpbnNib3JvIiwgICAgICAgICAgICAweEZGRENEQ0RDIH0sCisgICAgeyAiR2hvc3RXaGl0ZSIsICAgICAgICAgICAweEZGRjhGOEZGIH0sCisgICAgeyAiR29sZCIsICAgICAgICAgICAgICAgICAweEZGRkZENzAwIH0sCisgICAgeyAiR29sZGVuUm9kIiwgICAgICAgICAgICAweEZGREFBNTIwIH0sCisgICAgeyAiR3JheSIsICAgICAgICAgICAgICAgICAweEZGQkVCRUJFIH0sCisgICAgeyAiR3JlZW4iLCAgICAgICAgICAgICAgICAweEZGMDBGRjAwIH0sCisgICAgeyAiR3JlZW5ZZWxsb3ciLCAgICAgICAgICAweEZGQURGRjJGIH0sCisgICAgeyAiSG9uZXlEZXciLCAgICAgICAgICAgICAweEZGRjBGRkYwIH0sCisgICAgeyAiSG90UGluayIsICAgICAgICAgICAgICAweEZGRkY2OUI0IH0sCisgICAgeyAiSW5kaWFuUmVkIiwgICAgICAgICAgICAweEZGQ0Q1QzVDIH0sCisgICAgeyAiSW5kaWdvIiwgICAgICAgICAgICAgICAweEZGNEIwMDgyIH0sCisgICAgeyAiSXZvcnkiLCAgICAgICAgICAgICAgICAweEZGRkZGRkYwIH0sCisgICAgeyAiS2hha2kiLCAgICAgICAgICAgICAgICAweEZGRjBFNjhDIH0sCisgICAgeyAiTGF2ZW5kZXIiLCAgICAgICAgICAgICAweEZGRTZFNkZBIH0sCisgICAgeyAiTGF2ZW5kZXJCbHVzaCIsICAgICAgICAweEZGRkZGMEY1IH0sCisgICAgeyAiTGF3bkdyZWVuIiwgICAgICAgICAgICAweEZGN0NGQzAwIH0sCisgICAgeyAiTGVtb25DaGlmZm9uIiwgICAgICAgICAweEZGRkZGQUNEIH0sCisgICAgeyAiTGlnaHRCbHVlIiwgICAgICAgICAgICAweEZGQUREOEU2IH0sCisgICAgeyAiTGlnaHRDb3JhbCIsICAgICAgICAgICAweEZGRjA4MDgwIH0sCisgICAgeyAiTGlnaHRDeWFuIiwgICAgICAgICAgICAweEZGRTBGRkZGIH0sCisgICAgeyAiTGlnaHRHb2xkZW5Sb2RZZWxsb3ciLCAweEZGRkFGQUQyIH0sCisgICAgeyAiTGlnaHRHcmVlbiIsICAgICAgICAgICAweEZGOTBFRTkwIH0sCisgICAgeyAiTGlnaHRHcmV5IiwgICAgICAgICAgICAweEZGRDNEM0QzIH0sCisgICAgeyAiTGlnaHRQaW5rIiwgICAgICAgICAgICAweEZGRkZCNkMxIH0sCisgICAgeyAiTGlnaHRTYWxtb24iLCAgICAgICAgICAweEZGRkZBMDdBIH0sCisgICAgeyAiTGlnaHRTZWFHcmVlbiIsICAgICAgICAweEZGMjBCMkFBIH0sCisgICAgeyAiTGlnaHRTa3lCbHVlIiwgICAgICAgICAweEZGODdDRUZBIH0sCisgICAgeyAiTGlnaHRTbGF0ZUdyYXkiLCAgICAgICAweEZGNzc4ODk5IH0sCisgICAgeyAiTGlnaHRTdGVlbEJsdWUiLCAgICAgICAweEZGQjBDNERFIH0sCisgICAgeyAiTGlnaHRZZWxsb3ciLCAgICAgICAgICAweEZGRkZGRkUwIH0sCisgICAgeyAiTGltZSIsICAgICAgICAgICAgICAgICAweEZGMDBGRjAwIH0sCisgICAgeyAiTGltZUdyZWVuIiwgICAgICAgICAgICAweEZGMzJDRDMyIH0sCisgICAgeyAiTGluZW4iLCAgICAgICAgICAgICAgICAweEZGRkFGMEU2IH0sCisgICAgeyAiTWFnZW50YSIsICAgICAgICAgICAgICAweEZGRkYwMEZGIH0sCisgICAgeyAiTWFyb29uIiwgICAgICAgICAgICAgICAweEZGQjAzMDYwIH0sCisgICAgeyAiTWVkaXVtQXF1YU1hcmluZSIsICAgICAweEZGNjZDREFBIH0sCisgICAgeyAiTWVkaXVtQmx1ZSIsICAgICAgICAgICAweEZGMDAwMENEIH0sCisgICAgeyAiTWVkaXVtT3JjaGlkIiwgICAgICAgICAweEZGQkE1NUQzIH0sCisgICAgeyAiTWVkaXVtUHVycGxlIiwgICAgICAgICAweEZGOTM3MEQ4IH0sCisgICAgeyAiTWVkaXVtU2VhR3JlZW4iLCAgICAgICAweEZGM0NCMzcxIH0sCisgICAgeyAiTWVkaXVtU2xhdGVCbHVlIiwgICAgICAweEZGN0I2OEVFIH0sCisgICAgeyAiTWVkaXVtU3ByaW5nR3JlZW4iLCAgICAweEZGMDBGQTlBIH0sCisgICAgeyAiTWVkaXVtVHVycXVvaXNlIiwgICAgICAweEZGNDhEMUNDIH0sCisgICAgeyAiTWVkaXVtVmlvbGV0UmVkIiwgICAgICAweEZGQzcxNTg1IH0sCisgICAgeyAiTWlkbmlnaHRCbHVlIiwgICAgICAgICAweEZGMTkxOTcwIH0sCisgICAgeyAiTWludENyZWFtIiwgICAgICAgICAgICAweEZGRjVGRkZBIH0sCisgICAgeyAiTWlzdHlSb3NlIiwgICAgICAgICAgICAweEZGRkZFNEUxIH0sCisgICAgeyAiTW9jY2FzaW4iLCAgICAgICAgICAgICAweEZGRkZFNEI1IH0sCisgICAgeyAiTmF2YWpvV2hpdGUiLCAgICAgICAgICAweEZGRkZERUFEIH0sCisgICAgeyAiTmF2eSIsICAgICAgICAgICAgICAgICAweEZGMDAwMDgwIH0sCisgICAgeyAiTm9uZSIsICAgICAgICAgICAgICAgICAweDAwMDAwMDAwIH0sCisgICAgeyAiT2xkTGFjZSIsICAgICAgICAgICAgICAweEZGRkRGNUU2IH0sCisgICAgeyAiT2xpdmUiLCAgICAgICAgICAgICAgICAweEZGODA4MDAwIH0sCisgICAgeyAiT2xpdmVEcmFiIiwgICAgICAgICAgICAweEZGNkI4RTIzIH0sCisgICAgeyAiT3JhbmdlIiwgICAgICAgICAgICAgICAweEZGRkZBNTAwIH0sCisgICAgeyAiT3JhbmdlUmVkIiwgICAgICAgICAgICAweEZGRkY0NTAwIH0sCisgICAgeyAiT3JjaGlkIiwgICAgICAgICAgICAgICAweEZGREE3MEQ2IH0sCisgICAgeyAiUGFsZUdvbGRlblJvZCIsICAgICAgICAweEZGRUVFOEFBIH0sCisgICAgeyAiUGFsZUdyZWVuIiwgICAgICAgICAgICAweEZGOThGQjk4IH0sCisgICAgeyAiUGFsZVR1cnF1b2lzZSIsICAgICAgICAweEZGQUZFRUVFIH0sCisgICAgeyAiUGFsZVZpb2xldFJlZCIsICAgICAgICAweEZGRDg3MDkzIH0sCisgICAgeyAiUGFwYXlhV2hpcCIsICAgICAgICAgICAweEZGRkZFRkQ1IH0sCisgICAgeyAiUGVhY2hQdWZmIiwgICAgICAgICAgICAweEZGRkZEQUI5IH0sCisgICAgeyAiUGVydSIsICAgICAgICAgICAgICAgICAweEZGQ0Q4NTNGIH0sCisgICAgeyAiUGluayIsICAgICAgICAgICAgICAgICAweEZGRkZDMENCIH0sCisgICAgeyAiUGx1bSIsICAgICAgICAgICAgICAgICAweEZGRERBMEREIH0sCisgICAgeyAiUG93ZGVyQmx1ZSIsICAgICAgICAgICAweEZGQjBFMEU2IH0sCisgICAgeyAiUHVycGxlIiwgICAgICAgICAgICAgICAweEZGQTAyMEYwIH0sCisgICAgeyAiUmVkIiwgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwIH0sCisgICAgeyAiUm9zeUJyb3duIiwgICAgICAgICAgICAweEZGQkM4RjhGIH0sCisgICAgeyAiUm95YWxCbHVlIiwgICAgICAgICAgICAweEZGNDE2OUUxIH0sCisgICAgeyAiU2FkZGxlQnJvd24iLCAgICAgICAgICAweEZGOEI0NTEzIH0sCisgICAgeyAiU2FsbW9uIiwgICAgICAgICAgICAgICAweEZGRkE4MDcyIH0sCisgICAgeyAiU2FuZHlCcm93biIsICAgICAgICAgICAweEZGRjRBNDYwIH0sCisgICAgeyAiU2VhR3JlZW4iLCAgICAgICAgICAgICAweEZGMkU4QjU3IH0sCisgICAgeyAiU2VhU2hlbGwiLCAgICAgICAgICAgICAweEZGRkZGNUVFIH0sCisgICAgeyAiU2llbm5hIiwgICAgICAgICAgICAgICAweEZGQTA1MjJEIH0sCisgICAgeyAiU2lsdmVyIiwgICAgICAgICAgICAgICAweEZGQzBDMEMwIH0sCisgICAgeyAiU2t5Qmx1ZSIsICAgICAgICAgICAgICAweEZGODdDRUVCIH0sCisgICAgeyAiU2xhdGVCbHVlIiwgICAgICAgICAgICAweEZGNkE1QUNEIH0sCisgICAgeyAiU2xhdGVHcmF5IiwgICAgICAgICAgICAweEZGNzA4MDkwIH0sCisgICAgeyAiU25vdyIsICAgICAgICAgICAgICAgICAweEZGRkZGQUZBIH0sCisgICAgeyAiU3ByaW5nR3JlZW4iLCAgICAgICAgICAweEZGMDBGRjdGIH0sCisgICAgeyAiU3RlZWxCbHVlIiwgICAgICAgICAgICAweEZGNDY4MkI0IH0sCisgICAgeyAiVGFuIiwgICAgICAgICAgICAgICAgICAweEZGRDJCNDhDIH0sCisgICAgeyAiVGVhbCIsICAgICAgICAgICAgICAgICAweEZGMDA4MDgwIH0sCisgICAgeyAiVGhpc3RsZSIsICAgICAgICAgICAgICAweEZGRDhCRkQ4IH0sCisgICAgeyAiVG9tYXRvIiwgICAgICAgICAgICAgICAweEZGRkY2MzQ3IH0sCisgICAgeyAiVHVycXVvaXNlIiwgICAgICAgICAgICAweEZGNDBFMEQwIH0sCisgICAgeyAiVmlvbGV0IiwgICAgICAgICAgICAgICAweEZGRUU4MkVFIH0sCisgICAgeyAiV2hlYXQiLCAgICAgICAgICAgICAgICAweEZGRjVERUIzIH0sCisgICAgeyAiV2hpdGUiLCAgICAgICAgICAgICAgICAweEZGRkZGRkZGIH0sCisgICAgeyAiV2hpdGVTbW9rZSIsICAgICAgICAgICAweEZGRjVGNUY1IH0sCisgICAgeyAiWWVsbG93IiwgICAgICAgICAgICAgICAweEZGRkZGRjAwIH0sCisgICAgeyAiWWVsbG93R3JlZW4iLCAgICAgICAgICAweEZGOUFDRDMyIH0KK307CisKK3N0YXRpYyB1bnNpZ25lZCBoZXhfY2hhcl90b19udW1iZXIodWludDhfdCB4KQoreworICAgIGlmICh4ID49ICdhJyAmJiB4IDw9ICdmJykKKyAgICAgICAgeCAtPSAnYScgLSAxMDsKKyAgICBlbHNlIGlmICh4ID49ICdBJyAmJiB4IDw9ICdGJykKKyAgICAgICAgeCAtPSAnQScgLSAxMDsKKyAgICBlbHNlIGlmICh4ID49ICcwJyAmJiB4IDw9ICc5JykKKyAgICAgICAgeCAtPSAnMCc7CisgICAgZWxzZQorICAgICAgICB4ID0gMDsKKyAgICByZXR1cm4geDsKK30KKworLyoKKyAqIEZ1bmN0aW9uIHNhbWUgYXMgc3RyY3NwbiBidXQgaWdub3JlcyBjaGFyYWN0ZXJzIGlmIHRoZXkgYXJlIGluc2lkZSBhIEMgc3R5bGUgY29tbWVudHMKKyAqLworc3RhdGljIHNpemVfdCBtb2Rfc3RyY3Nwbihjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnJlamVjdCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IHN0cmluZyAmJiBzdHJpbmdbaV07IGkrKykgeworICAgICAgICBpZiAoc3RyaW5nW2ldID09ICcvJyAmJiBzdHJpbmdbaSsxXSA9PSAnKicpIHsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIHdoaWxlICggc3RyaW5nICYmIHN0cmluZ1tpXSAmJiAoc3RyaW5nW2ldICE9ICcqJyB8fCBzdHJpbmdbaSsxXSAhPSAnLycpICkKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nW2ldID09ICcvJyAmJiBzdHJpbmdbaSsxXSA9PSAnLycpIHsKKyAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgIHdoaWxlICggc3RyaW5nICYmIHN0cmluZ1tpXSAmJiBzdHJpbmdbaV0gIT0gJ1xuJyApCisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChqID0gMDsgcmVqZWN0ICYmIHJlamVjdFtqXTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmluZ1tpXSA9PSByZWplY3Rbal0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlamVjdCAmJiByZWplY3Rbal0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBjb2xvcl9zdHJpbmdfdG9fcmdiYShjb25zdCBjaGFyICpwLCBpbnQgbGVuKQoreworICAgIHVpbnQzMl90IHJldCA9IDB4RkYwMDAwMDA7CisgICAgY29uc3QgQ29sb3JFbnRyeSAqZW50cnk7CisgICAgY2hhciBjb2xvcl9uYW1lWzEwMF07CisKKyAgICBsZW4gPSBGRk1JTihGRk1BWChsZW4sIDApLCBzaXplb2YoY29sb3JfbmFtZSkgLSAxKTsKKworICAgIGlmICgqcCA9PSAnIycpIHsKKyAgICAgICAgcCsrOworICAgICAgICBsZW4tLTsKKyAgICAgICAgaWYgKGxlbiA9PSAzKSB7CisgICAgICAgICAgICByZXQgfD0gKGhleF9jaGFyX3RvX251bWJlcihwWzJdKSA8PCAgNCkgfAorICAgICAgICAgICAgICAgICAgIChoZXhfY2hhcl90b19udW1iZXIocFsxXSkgPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgICAoaGV4X2NoYXJfdG9fbnVtYmVyKHBbMF0pIDw8IDIwKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gNCkgeworICAgICAgICAgICAgcmV0ICA9IChoZXhfY2hhcl90b19udW1iZXIocFszXSkgPDwgIDQpIHwKKyAgICAgICAgICAgICAgICAgICAoaGV4X2NoYXJfdG9fbnVtYmVyKHBbMl0pIDw8IDEyKSB8CisgICAgICAgICAgICAgICAgICAgKGhleF9jaGFyX3RvX251bWJlcihwWzFdKSA8PCAyMCkgfAorICAgICAgICAgICAgICAgICAgIChoZXhfY2hhcl90b19udW1iZXIocFswXSkgPDwgMjgpOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSA2KSB7CisgICAgICAgICAgICByZXQgfD0gIGhleF9jaGFyX3RvX251bWJlcihwWzVdKSAgICAgICAgfAorICAgICAgICAgICAgICAgICAgIChoZXhfY2hhcl90b19udW1iZXIocFs0XSkgPDwgIDQpIHwKKyAgICAgICAgICAgICAgICAgICAoaGV4X2NoYXJfdG9fbnVtYmVyKHBbM10pIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgICAgKGhleF9jaGFyX3RvX251bWJlcihwWzJdKSA8PCAxMikgfAorICAgICAgICAgICAgICAgICAgIChoZXhfY2hhcl90b19udW1iZXIocFsxXSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAoaGV4X2NoYXJfdG9fbnVtYmVyKHBbMF0pIDw8IDIwKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gOCkgeworICAgICAgICAgICAgcmV0ICA9ICBoZXhfY2hhcl90b19udW1iZXIocFs3XSkgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAoaGV4X2NoYXJfdG9fbnVtYmVyKHBbNl0pIDw8ICA0KSB8CisgICAgICAgICAgICAgICAgICAgKGhleF9jaGFyX3RvX251bWJlcihwWzVdKSA8PCAgOCkgfAorICAgICAgICAgICAgICAgICAgIChoZXhfY2hhcl90b19udW1iZXIocFs0XSkgPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgICAoaGV4X2NoYXJfdG9fbnVtYmVyKHBbM10pIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgKGhleF9jaGFyX3RvX251bWJlcihwWzJdKSA8PCAyMCkgfAorICAgICAgICAgICAgICAgICAgIChoZXhfY2hhcl90b19udW1iZXIocFsxXSkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAoaGV4X2NoYXJfdG9fbnVtYmVyKHBbMF0pIDw8IDI4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN0cm5jcHkoY29sb3JfbmFtZSwgcCwgbGVuKTsKKyAgICAgICAgY29sb3JfbmFtZVtsZW5dID0gJ1wwJzsKKworICAgICAgICBlbnRyeSA9IGJzZWFyY2goY29sb3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgRkZfQVJSQVlfRUxFTVMoY29sb3JfdGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENvbG9yRW50cnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfdGFibGVfY29tcGFyZSk7CisKKyAgICAgICAgaWYgKCFlbnRyeSkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0ID0gZW50cnktPnJnYl9jb2xvcjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhc2NpaTJpbmRleChjb25zdCB1aW50OF90ICpjcGl4ZWwsIGludCBjcHApCit7CisgICAgY29uc3QgdWludDhfdCAqcCA9IGNwaXhlbDsKKyAgICBpbnQgbiA9IDAsIG0gPSAxLCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGNwcDsgaSsrKSB7CisgICAgICAgIGlmICgqcCA8ICcgJyB8fCAqcCA+ICd+JykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBuICs9ICgqcCsrIC0gJyAnKSAqIG07CisgICAgICAgIG0gKj0gOTU7CisgICAgfQorICAgIHJldHVybiBuOworfQorCitzdGF0aWMgaW50IHhwbV9kZWNvZGVfZnJhbWUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB2b2lkICpkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X2ZyYW1lLCBBVlBhY2tldCAqYXZwa3QpCit7CisgICAgWFBNRGVjQ29udGV4dCAqeCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqcD1kYXRhOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCwgKnB0cjsKKyAgICBpbnQgbmNvbG9ycywgY3BwLCByZXQsIGksIGo7CisgICAgaW50NjRfdCBzaXplOworICAgIHVpbnQzMl90ICpkc3Q7CisKKyAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSQTsKKworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmeC0+YnVmLCAmeC0+YnVmX3NpemUsIGF2cGt0LT5zaXplKTsKKyAgICBpZiAoIXgtPmJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZW1jcHkoeC0+YnVmLCBhdnBrdC0+ZGF0YSwgYXZwa3QtPnNpemUpOworICAgIHgtPmJ1ZlthdnBrdC0+c2l6ZV0gPSAwOworCisgICAgcHRyID0geC0+YnVmOworICAgIGVuZCA9IHgtPmJ1ZiArIGF2cGt0LT5zaXplOworICAgIHdoaWxlIChlbmQgLSBwdHIgPiA5ICYmIG1lbWNtcChwdHIsICIvKiBYUE0gKi8iLCA5KSkKKyAgICAgICAgcHRyKys7CisKKyAgICBpZiAoZW5kIC0gcHRyIDw9IDkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIHNpZ25hdHVyZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHB0ciArPSBtb2Rfc3RyY3NwbihwdHIsICJcIiIpOworICAgIGlmIChzc2NhbmYocHRyLCAiXCIldSAldSAldSAldVwiLCIsCisgICAgICAgICAgICAgICAmYXZjdHgtPndpZHRoLCAmYXZjdHgtPmhlaWdodCwgJm5jb2xvcnMsICZjcHApICE9IDQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJtaXNzaW5nIGltYWdlIHBhcmFtZXRlcnNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX3NldF9kaW1lbnNpb25zKGF2Y3R4LCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIHAsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoY3BwIDw9IDAgfHwgY3BwID49IDUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZC9pbnZhbGlkIG51bWJlciBvZiBjaGFycyBwZXIgcGl4ZWw6ICVkXG4iLCBjcHApOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzaXplID0gMTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3BwOyBpKyspCisgICAgICAgIHNpemUgKj0gOTU7CisKKyAgICBpZiAobmNvbG9ycyA8PSAwIHx8IG5jb2xvcnMgPiBzaXplKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBudW1iZXIgb2YgY29sb3JzOiAlZFxuIiwgbmNvbG9ycyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHNpemUgKj0gNDsKKworICAgIGF2X2Zhc3RfcGFkZGVkX21hbGxvYygmeC0+cGl4ZWxzLCAmeC0+cGl4ZWxzX3NpemUsIHNpemUpOworICAgIGlmICgheC0+cGl4ZWxzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcHRyICs9IG1vZF9zdHJjc3BuKHB0ciwgIiwiKSArIDE7CisgICAgaWYgKGVuZCAtIHB0ciA8IDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgZm9yIChpID0gMDsgaSA8IG5jb2xvcnM7IGkrKykgeworICAgICAgICBjb25zdCB1aW50OF90ICppbmRleDsKKyAgICAgICAgaW50IGxlbjsKKworICAgICAgICBwdHIgKz0gbW9kX3N0cmNzcG4ocHRyLCAiXCIiKSArIDE7CisgICAgICAgIGlmIChlbmQgLSBwdHIgPCBjcHApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaW5kZXggPSBwdHI7CisgICAgICAgIHB0ciArPSBjcHA7CisKKyAgICAgICAgcHRyID0gc3Ryc3RyKHB0ciwgImMgIik7CisgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgIHB0ciArPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSBzdHJjc3BuKHB0ciwgIlwiICIpOworCisgICAgICAgIGlmICgocmV0ID0gYXNjaWkyaW5kZXgoaW5kZXgsIGNwcCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgeC0+cGl4ZWxzW3JldF0gPSBjb2xvcl9zdHJpbmdfdG9fcmdiYShwdHIsIGxlbik7CisgICAgICAgIHB0ciArPSBtb2Rfc3RyY3NwbihwdHIsICIsIikgKyAxOworICAgICAgICBpZiAoZW5kIC0gcHRyIDwgMSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZHN0ID0gKHVpbnQzMl90ICopKHAtPmRhdGFbMF0gKyBpICogcC0+bGluZXNpemVbMF0pOworICAgICAgICBpZiAoZW5kIC0gcHRyIDwgMSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBwdHIgKz0gbW9kX3N0cmNzcG4ocHRyLCAiXCIiKSArIDE7CisgICAgICAgIGlmIChlbmQgLSBwdHIgPCAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2Y3R4LT53aWR0aDsgaisrKSB7CisgICAgICAgICAgICBpZiAoZW5kIC0gcHRyIDwgY3BwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgICAgICBpZiAoKHJldCA9IGFzY2lpMmluZGV4KHB0ciwgY3BwKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgICpkc3QrKyA9IHgtPnBpeGVsc1tyZXRdOworICAgICAgICAgICAgcHRyICs9IGNwcDsKKyAgICAgICAgfQorICAgICAgICBwdHIgKz0gbW9kX3N0cmNzcG4ocHRyLCAiLCIpICsgMTsKKyAgICB9CisKKyAgICBwLT5rZXlfZnJhbWUgPSAxOworICAgIHAtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9JOworCisgICAgKmdvdF9mcmFtZSA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCB4cG1fZGVjb2RlX2Nsb3NlKEFWQ29kZWNDb250ZXh0ICphdmN0eCkKK3sKKyAgICBYUE1EZWNDb250ZXh0ICp4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBhdl9mcmVlcCgmeC0+cGl4ZWxzKTsKKworICAgIGF2X2ZyZWVwKCZ4LT5idWYpOworICAgIHgtPmJ1Zl9zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3hwbV9kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ4cG0iLAorICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAuaWQgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9YUE0sCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFhQTURlY0NvbnRleHQpLAorICAgIC5jbG9zZSAgICAgICAgICA9IHhwbV9kZWNvZGVfY2xvc2UsCisgICAgLmRlY29kZSAgICAgICAgID0geHBtX2RlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJYUE0gKFggUGl4TWFwKSBpbWFnZSIpCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy94c3ViZGVjLmMgYi9saWJhdmNvZGVjL3hzdWJkZWMuYwppbmRleCA1NDA2MDdhLi45M2ZkMGY0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3hzdWJkZWMuYworKysgYi9saWJhdmNvZGVjL3hzdWJkZWMuYwpAQCAtNTMsMTIgKzUzLDEwIEBACiAgICAgQVZTdWJ0aXRsZSAqc3ViID0gZGF0YTsKICAgICBjb25zdCB1aW50OF90ICpidWZfZW5kID0gYnVmICsgYnVmX3NpemU7CiAgICAgdWludDhfdCAqYml0bWFwOwotICAgIGludCB3LCBoLCB4LCB5LCBpOworICAgIGludCB3LCBoLCB4LCB5LCBpLCByZXQ7CiAgICAgaW50NjRfdCBwYWNrZXRfdGltZSA9IDA7CiAgICAgR2V0Qml0Q29udGV4dCBnYjsKICAgICBpbnQgaGFzX2FscGhhID0gYXZjdHgtPmNvZGVjX3RhZyA9PSBNS1RBRygnRCcsJ1gnLCdTJywnQScpOwotICAgIEFWU3VidGl0bGVSZWN0ICpyZWN0OwotICAgIGludCBqOwogCiAgICAgLy8gY2hlY2sgdGhhdCBhdCBsZWFzdCBoZWFkZXIgZml0cwogICAgIGlmIChidWZfc2l6ZSA8IDI3ICsgNyAqIDIgKyA0ICogKDMgKyBoYXNfYWxwaGEpKSB7CkBAIC05Myw2ICs5MSw5IEBACiAgICAgLy8gd2UganVzdCBpZ25vcmUgaXQKICAgICBieXRlc3RyZWFtX2dldF9sZTE2KCZidWYpOwogCisgICAgaWYgKGJ1Zl9lbmQgLSBidWYgPCBoICsgMyo0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIC8vIGFsbG9jYXRlIHN1YiBhbmQgc2V0IHZhbHVlcwogICAgIHN1Yi0+cmVjdHMgPSAgYXZfbWFsbG9jeihzaXplb2YoKnN1Yi0+cmVjdHMpKTsKICAgICBpZiAoIXN1Yi0+cmVjdHMpCkBAIC0xMzQsMTYgKzEzNSwyMSBAQAogCiAjaWYgRkZfQVBJX0FWUElDVFVSRQogRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworeworICAgIEFWU3VidGl0bGVSZWN0ICpyZWN0OworICAgIGludCBqOwogICAgIHJlY3QgPSBzdWItPnJlY3RzWzBdOwogICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKICAgICAgICAgcmVjdC0+cGljdC5kYXRhW2pdID0gcmVjdC0+ZGF0YVtqXTsKICAgICAgICAgcmVjdC0+cGljdC5saW5lc2l6ZVtqXSA9IHJlY3QtPmxpbmVzaXplW2pdOwogICAgIH0KK30KIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogI2VuZGlmCiAKICAgICAvLyBwcm9jZXNzIFJMRS1jb21wcmVzc2VkIGRhdGEKLSAgICBpbml0X2dldF9iaXRzKCZnYiwgYnVmLCAoYnVmX2VuZCAtIGJ1ZikgKiA4KTsKKyAgICBpZiAoKHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgYnVmLCBidWZfZW5kIC0gYnVmKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogICAgIGJpdG1hcCA9IHN1Yi0+cmVjdHNbMF0tPmRhdGFbMF07CiAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgewogICAgICAgICAvLyBpbnRlcmxhY2VkOiBkbyBvZGQgbGluZXMKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveHZpZGlkY3QuYyBiL2xpYmF2Y29kZWMveHZpZGlkY3QuYwppbmRleCAxZjk2Y2NjLi5kOGYzZGQ3IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3h2aWRpZGN0LmMKKysrIGIvbGliYXZjb2RlYy94dmlkaWRjdC5jCkBAIC0zMTgsMTYgKzMxOCwxNiBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgeHZpZF9pZGN0X3B1dCh1aW50OF90ICpkZXN0LCBpbnQgbGluZV9zaXplLCBpbnQxNl90ICpibG9jaykKK3N0YXRpYyB2b2lkIHh2aWRfaWRjdF9wdXQodWludDhfdCAqZGVzdCwgcHRyZGlmZl90IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCiB7CiAgICAgZmZfeHZpZF9pZGN0KGJsb2NrKTsKLSAgICBmZl9wdXRfcGl4ZWxzX2NsYW1wZWQoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7CisgICAgZmZfcHV0X3BpeGVsc19jbGFtcGVkX2MoYmxvY2ssIGRlc3QsIGxpbmVfc2l6ZSk7CiB9CiAKLXN0YXRpYyB2b2lkIHh2aWRfaWRjdF9hZGQodWludDhfdCAqZGVzdCwgaW50IGxpbmVfc2l6ZSwgaW50MTZfdCAqYmxvY2spCitzdGF0aWMgdm9pZCB4dmlkX2lkY3RfYWRkKHVpbnQ4X3QgKmRlc3QsIHB0cmRpZmZfdCBsaW5lX3NpemUsIGludDE2X3QgKmJsb2NrKQogewogICAgIGZmX3h2aWRfaWRjdChibG9jayk7Ci0gICAgZmZfYWRkX3BpeGVsc19jbGFtcGVkKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOworICAgIGZmX2FkZF9waXhlbHNfY2xhbXBlZF9jKGJsb2NrLCBkZXN0LCBsaW5lX3NpemUpOwogfQogCiBhdl9jb2xkIHZvaWQgZmZfeHZpZF9pZGN0X2luaXQoSURDVERTUENvbnRleHQgKmMsIEFWQ29kZWNDb250ZXh0ICphdmN0eCkKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveHdkZGVjLmMgYi9saWJhdmNvZGVjL3h3ZGRlYy5jCmluZGV4IDY0Y2Q4NDEuLjhjNDM1OGYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMveHdkZGVjLmMKKysrIGIvbGliYXZjb2RlYy94d2RkZWMuYwpAQCAtMzksNiArMzksNyBAQAogICAgIHVpbnQzMl90IHBpeGZvcm1hdCwgcGl4ZGVwdGgsIGJ1bml0LCBiaXRvcmRlciwgYnBhZDsKICAgICB1aW50MzJfdCByZ2JbM107CiAgICAgdWludDhfdCAqcHRyOworICAgIGludCB3aWR0aCwgaGVpZ2h0OwogICAgIEdldEJ5dGVDb250ZXh0IGdiOwogCiAgICAgaWYgKGJ1Zl9zaXplIDwgWFdEX0hFQURFUl9TSVpFKQpAQCAtNjAsOCArNjEsOCBAQAogCiAgICAgcGl4Zm9ybWF0ICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOwogICAgIHBpeGRlcHRoICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKLSAgICBhdmN0eC0+d2lkdGggID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7Ci0gICAgYXZjdHgtPmhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOworICAgIHdpZHRoICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKKyAgICBoZWlnaHQgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7CiAgICAgeG9mZnNldCAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOwogICAgIGJlICAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiKTsKICAgICBidW5pdCAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYik7CkBAIC03Nyw2ICs3OCw5IEBACiAgICAgbmNvbG9ycyAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9iZTMydSgmZ2IpOwogICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYiwgaGVhZGVyX3NpemUgLSAoWFdEX0hFQURFUl9TSVpFIC0gMjApKTsKIAorICAgIGlmICgocmV0ID0gZmZfc2V0X2RpbWVuc2lvbnMoYXZjdHgsIHdpZHRoLCBoZWlnaHQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywKICAgICAgICAgICAgInBpeGZvcm1hdCAlIlBSSXUzMiIsIHBpeGRlcHRoICUiUFJJdTMyIiwgYnVuaXQgJSJQUkl1MzIiLCBiaXRvcmRlciAlIlBSSXUzMiIsIGJwYWQgJSJQUkl1MzIiXG4iLAogICAgICAgICAgICBwaXhmb3JtYXQsIHBpeGRlcHRoLCBidW5pdCwgYml0b3JkZXIsIGJwYWQpOwpAQCAtMTU3LDkgKzE2MSw5IEBACiAgICAgY2FzZSBYV0RfR1JBWV9TQ0FMRToKICAgICAgICAgaWYgKGJwcCAhPSAxICYmIGJwcCAhPSA4KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIGlmIChwaXhkZXB0aCA9PSAxKSB7CisgICAgICAgIGlmIChicHAgPT0gMSAmJiBwaXhkZXB0aCA9PSAxKSB7CiAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfTU9OT1dISVRFOwotICAgICAgICB9IGVsc2UgaWYgKHBpeGRlcHRoID09IDgpIHsKKyAgICAgICAgfSBlbHNlIGlmIChicHAgPT0gOCAmJiBwaXhkZXB0aCA9PSA4KSB7CiAgICAgICAgICAgICBhdmN0eC0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC0yMjcsNyArMjMxLDcgQEAKICAgICAgICAgICAgIGJsdWUgICA9IGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2IpOwogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcHUoJmdiLCAzKTsgLy8gc2tpcCBiaXRtYXNrIGZsYWcgYW5kIHBhZGRpbmcKIAotICAgICAgICAgICAgZHN0W2ldID0gcmVkIDw8IDE2IHwgZ3JlZW4gPDwgOCB8IGJsdWU7CisgICAgICAgICAgICBkc3RbaV0gPSAweEZGVSA8PCAyNCB8IHJlZCA8PCAxNiB8IGdyZWVuIDw8IDggfCBibHVlOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3h3ZGVuYy5jIGIvbGliYXZjb2RlYy94d2RlbmMuYwppbmRleCA0M2JjYTg5Li44MWNjYTZjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3h3ZGVuYy5jCisrKyBiL2xpYmF2Y29kZWMveHdkZW5jLmMKQEAgLTQxLDYgKzQxLDcgQEAKICAgICBpbnQgaSwgb3V0X3NpemUsIHJldDsKICAgICB1aW50OF90ICpwdHIsICpidWY7CiAgICAgQVZGcmFtZSAqIGNvbnN0IHAgPSAoQVZGcmFtZSAqKXBpY3Q7CisgICAgdWludDMyX3QgcGFsWzI1Nl07CiAKICAgICBwaXhkZXB0aCA9IGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKTsKICAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkUpCkBAIC0xODAsMTEgKzE4MSwxNyBAQAogICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgMCk7ICAgICAgICAgICAgIC8vIHdpbmRvdyBib3JkZXIgd2lkdGgKICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJmJ1ZiwgV0lORE9XX05BTUUsIFdJTkRPV19OQU1FX1NJWkUpOwogCisgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgIG1lbWNweShwYWwsIHAtPmRhdGFbMV0sIHNpemVvZihwYWwpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdnByaXZfc2V0X3N5c3RlbWF0aWNfcGFsMihwYWwsIHBpeF9mbXQpOworICAgIH0KKwogICAgIGZvciAoaSA9IDA7IGkgPCBuY29sb3JzOyBpKyspIHsKICAgICAgICAgdWludDMyX3QgdmFsOwogICAgICAgICB1aW50OF90IHJlZCwgZ3JlZW4sIGJsdWU7CiAKLSAgICAgICAgdmFsICAgPSBBVl9STjMyQShwLT5kYXRhWzFdICsgaSAqIDQpOworICAgICAgICB2YWwgICA9IHBhbFtpXTsKICAgICAgICAgcmVkICAgPSAodmFsID4+IDE2KSAmIDB4RkY7CiAgICAgICAgIGdyZWVuID0gKHZhbCA+PiAgOCkgJiAweEZGOwogICAgICAgICBibHVlICA9ICB2YWwgICAgICAgICYgMHhGRjsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMveHhhbi5jIGIvbGliYXZjb2RlYy94eGFuLmMKaW5kZXggNTQ4NTI5Ni4uOGJiNzA4NyAxMDA2NDQKLS0tIGEvbGliYXZjb2RlYy94eGFuLmMKKysrIGIvbGliYXZjb2RlYy94eGFuLmMKQEAgLTIwLDEyICsyMCwxMSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlICJhdmNvZGVjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImF2Y29kZWMuaCIKICNpbmNsdWRlICJieXRlc3RyZWFtLmgiCi0jZGVmaW5lIEJJVFNUUkVBTV9SRUFERVJfTEUKLSNpbmNsdWRlICJnZXRfYml0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHR5cGVkZWYgc3RydWN0IFhhbkNvbnRleHQgewpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy95NDFwZGVjLmMgYi9saWJhdmNvZGVjL3k0MXBkZWMuYwppbmRleCAxYjE3N2Q0Li44NWEzOWU0IDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3k0MXBkZWMuYworKysgYi9saWJhdmNvZGVjL3k0MXBkZWMuYwpAQCAtNDMsNyArNDMsNyBAQAogICAgIHVpbnQ4X3QgKnksICp1LCAqdjsKICAgICBpbnQgaSwgaiwgcmV0OwogCi0gICAgaWYgKGF2cGt0LT5zaXplIDwgM0xMICogYXZjdHgtPmhlaWdodCAqIGF2Y3R4LT53aWR0aCAvIDIpIHsKKyAgICBpZiAoYXZwa3QtPnNpemUgPCAzTEwgKiBhdmN0eC0+aGVpZ2h0ICogRkZBTElHTihhdmN0eC0+d2lkdGgsIDgpIC8gMikgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkluc3VmZmljaWVudCBpbnB1dCBkYXRhLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy95NDFwZW5jLmMgYi9saWJhdmNvZGVjL3k0MXBlbmMuYwppbmRleCA5NGFjYzM0Li5jYTk0YTNjIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3k0MXBlbmMuYworKysgYi9saWJhdmNvZGVjL3k0MXBlbmMuYwpAQCAtMzEsNiArMzEsNyBAQAogICAgIH0KIAogICAgIGF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxMjsKKyAgICBhdmN0eC0+Yml0X3JhdGUgPSBmZl9ndWVzc19jb2RlZF9iaXRyYXRlKGF2Y3R4KTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZjb2RlYy95bGMuYyBiL2xpYmF2Y29kZWMveWxjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzMzMyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Y29kZWMveWxjLmMKQEAgLTAsMCArMSw1MDIgQEAKKy8qCisgKiBZVVkyIExvc3NsZXNzIENvZGVjCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJhdmNvZGVjLmgiCisjaW5jbHVkZSAiYnN3YXBkc3AuaCIKKyNpbmNsdWRlICJnZXRfYml0cy5oIgorI2luY2x1ZGUgImh1ZmZ5dXZkc3AuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgInVuYXJ5LmgiCisKK3R5cGVkZWYgc3RydWN0IFlMQ0NvbnRleHQgeworICAgIFZMQyB2bGNbNF07CisgICAgdWludDMyX3QgdGFibGVbMTAyNF07CisgICAgdWludDhfdCAqdGFibGVfYml0czsKKyAgICB1aW50OF90ICpiaXRzdHJlYW1fYml0czsKKyAgICBpbnQgdGFibGVfYml0c19zaXplOworICAgIGludCBiaXRzdHJlYW1fYml0c19zaXplOworICAgIEJzd2FwRFNQQ29udGV4dCBiZHNwOworfSBZTENDb250ZXh0OworCitzdGF0aWMgYXZfY29sZCBpbnQgZGVjb2RlX2luaXQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFlMQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgYXZjdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVWVY0MjI7CisgICAgZmZfYnN3YXBkc3BfaW5pdCgmcy0+YmRzcCk7CisKKyAgICByZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgTm9kZSB7CisgICAgaW50MTZfdCAgc3ltOworICAgIGludDE2X3QgIG4wOworICAgIHVpbnQzMl90IGNvdW50OworICAgIGludDE2X3QgIGwsIHI7Cit9IE5vZGU7CisKK3N0YXRpYyB2b2lkIGdldF90cmVlX2NvZGVzKHVpbnQzMl90ICpiaXRzLCBpbnQxNl90ICpsZW5zLCB1aW50OF90ICp4bGF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAqbm9kZXMsIGludCBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGZ4LCBpbnQgcGwsIGludCAqcG9zKQoreworICAgIGludCBzOworCisgICAgcyA9IG5vZGVzW25vZGVdLnN5bTsKKyAgICBpZiAocyAhPSAtMSkgeworICAgICAgICBiaXRzWypwb3NdID0gKH5wZngpICYgKCgxVUxMIDw8IEZGTUFYKHBsLCAxKSkgLSAxKTsKKyAgICAgICAgbGVuc1sqcG9zXSA9IEZGTUFYKHBsLCAxKTsKKyAgICAgICAgeGxhdFsqcG9zXSA9IHMgKyAocGwgPT0gMCk7CisgICAgICAgICgqcG9zKSsrOworICAgIH0gZWxzZSB7CisgICAgICAgIHBmeCA8PD0gMTsKKyAgICAgICAgcGwrKzsKKyAgICAgICAgZ2V0X3RyZWVfY29kZXMoYml0cywgbGVucywgeGxhdCwgbm9kZXMsIG5vZGVzW25vZGVdLmwsIHBmeCwgcGwsCisgICAgICAgICAgICAgICAgICAgICAgIHBvcyk7CisgICAgICAgIHBmeCB8PSAxOworICAgICAgICBnZXRfdHJlZV9jb2RlcyhiaXRzLCBsZW5zLCB4bGF0LCBub2Rlcywgbm9kZXNbbm9kZV0uciwgcGZ4LCBwbCwKKyAgICAgICAgICAgICAgICAgICAgICAgcG9zKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfdmxjKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgVkxDICp2bGMsIGNvbnN0IHVpbnQzMl90ICp0YWJsZSkKK3sKKyAgICBOb2RlIG5vZGVzWzUxMl07CisgICAgdWludDMyX3QgYml0c1syNTZdOworICAgIGludDE2X3QgbGVuc1syNTZdOworICAgIHVpbnQ4X3QgeGxhdFsyNTZdOworICAgIGludCBjdXJfbm9kZSwgaSwgaiwgcG9zID0gMDsKKworICAgIGZmX2ZyZWVfdmxjKHZsYyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgbm9kZXNbaV0uY291bnQgPSB0YWJsZVtpXTsKKyAgICAgICAgbm9kZXNbaV0uc3ltICAgPSBpOworICAgICAgICBub2Rlc1tpXS5uMCAgICA9IC0yOworICAgICAgICBub2Rlc1tpXS5sICAgICA9IGk7CisgICAgICAgIG5vZGVzW2ldLnIgICAgID0gaTsKKyAgICB9CisKKyAgICBjdXJfbm9kZSA9IDI1NjsKKyAgICBqID0gMDsKKyAgICBkbyB7CisgICAgICAgIGZvciAoaSA9IDA7IDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgbmV3X25vZGUgPSBqOworICAgICAgICAgICAgaW50IGZpcnN0X25vZGUgPSBjdXJfbm9kZTsKKyAgICAgICAgICAgIGludCBzZWNvbmRfbm9kZSA9IGN1cl9ub2RlOworICAgICAgICAgICAgdW5zaWduZWQgbmQsIHN0OworCisgICAgICAgICAgICBub2Rlc1tjdXJfbm9kZV0uY291bnQgPSAtMTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCB2YWwgPSBub2Rlc1tuZXdfbm9kZV0uY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKHZhbCAmJiAodmFsIDwgbm9kZXNbZmlyc3Rfbm9kZV0uY291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPj0gbm9kZXNbc2Vjb25kX25vZGVdLmNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ub2RlID0gbmV3X25vZGU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ub2RlID0gc2Vjb25kX25vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfbm9kZSA9IG5ld19ub2RlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5ld19ub2RlICs9IDE7CisgICAgICAgICAgICB9IHdoaWxlIChuZXdfbm9kZSAhPSBjdXJfbm9kZSk7CisKKyAgICAgICAgICAgIGlmIChmaXJzdF9ub2RlID09IGN1cl9ub2RlKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBuZCA9IG5vZGVzW3NlY29uZF9ub2RlXS5jb3VudDsKKyAgICAgICAgICAgIHN0ID0gbm9kZXNbZmlyc3Rfbm9kZV0uY291bnQ7CisgICAgICAgICAgICBub2Rlc1tzZWNvbmRfbm9kZV0uY291bnQgPSAwOworICAgICAgICAgICAgbm9kZXNbZmlyc3Rfbm9kZV0uY291bnQgID0gMDsKKyAgICAgICAgICAgIGlmIChuZCA+PSBVSU5UMzJfTUFYIC0gc3QpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImNvdW50IG92ZXJmbG93XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGVzW2N1cl9ub2RlXS5jb3VudCA9IG5kICsgc3Q7CisgICAgICAgICAgICBub2Rlc1tjdXJfbm9kZV0uc3ltID0gLTE7CisgICAgICAgICAgICBub2Rlc1tjdXJfbm9kZV0ubjAgPSBjdXJfbm9kZTsKKyAgICAgICAgICAgIG5vZGVzW2N1cl9ub2RlXS5sID0gZmlyc3Rfbm9kZTsKKyAgICAgICAgICAgIG5vZGVzW2N1cl9ub2RlXS5yID0gc2Vjb25kX25vZGU7CisgICAgICAgICAgICBjdXJfbm9kZSsrOworICAgICAgICB9CisgICAgICAgIGorKzsKKyAgICB9IHdoaWxlIChjdXJfbm9kZSAtIDI1NiA9PSBqKTsKKworICAgIGdldF90cmVlX2NvZGVzKGJpdHMsIGxlbnMsIHhsYXQsIG5vZGVzLCBjdXJfbm9kZSAtIDEsIDAsIDAsICZwb3MpOworCisgICAgcmV0dXJuIGZmX2luaXRfdmxjX3NwYXJzZSh2bGMsIDEwLCBwb3MsIGxlbnMsIDIsIDIsIGJpdHMsIDQsIDQsIHhsYXQsIDEsIDEsIDApOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCB0YWJsZV95MVtdID0geworICAgIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsCisgICAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKKyAgICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLAorICAgIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkUsCisgICAgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRSwKKyAgICAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwKKyAgICAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsCisgICAgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwKKyAgICAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsCisgICAgMHgwMiwgMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlX3VbXSA9IHsKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAgMHgwMSwgMHgwMSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0YWJsZV95MltdID0geworICAgIDB4RkMsIDB4RkMsIDB4RkMsIDB4RkQsIDB4RkQsIDB4RkQsIDB4RkUsIDB4RkUsCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywKKyAgICAweEZDLCAweEZDLCAweEZELCAweEZELCAweEZELCAweEZFLCAweEZFLCAweEZFLAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkMsIDB4RkMsCisgICAgMHhGQywgMHhGRCwgMHhGRCwgMHhGRCwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZELCAweEZELAorICAgIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHhGRCwgMHhGRCwgMHhGRCwgMHhGRSwKKyAgICAweEZFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4RkQsIDB4RkQsIDB4RkQsIDB4RkUsIDB4RkUsCisgICAgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweEZFLCAweEZFLCAweEZFLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsCisgICAgMHgwMiwgMHhGRSwgMHhGRSwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLCAweDAyLCAweDAyLCAweDAyLAorICAgIDB4RkUsIDB4RkUsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHhGRiwKKyAgICAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDMsIDB4RkYsIDB4RkYsCisgICAgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMiwKKyAgICAweDAyLCAweDAyLCAweDAzLCAweDAzLCAweDAzLCAweEZGLCAweEZGLCAweEZGLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsCisgICAgMHgwMiwgMHgwMywgMHgwMywgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAyLCAweDAyLCAweDAyLCAweDAzLCAweDAzLCAweDAzLAorICAgIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsCisgICAgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMywgMHgwMywgMHgwMywgMHgwNCwKKyAgICAweDA0LCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDQsIDB4MDQsCisgICAgMHgwNCwgMHgwMCwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRhYmxlX3ZbXSA9IHsKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsIDB4MDAsIDB4MDEsIDB4RkYsCisgICAgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwgMHhGRiwgMHgwMCwgMHgwMSwKKyAgICAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLCAweDAxLCAweEZGLCAweDAwLAorICAgIDB4MDEsIDB4MDAsCit9OworCitzdGF0aWMgaW50IGRlY29kZV9mcmFtZShBVkNvZGVjQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpkYXRhLCBpbnQgKmdvdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBpbnQgVExbNF0gPSB7IDEyOCwgMTI4LCAxMjgsIDEyOCB9OworICAgIGludCBMWzRdICA9IHsgMTI4LCAxMjgsIDEyOCwgMTI4IH07CisgICAgWUxDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgVGhyZWFkRnJhbWUgZnJhbWUgPSB7IC5mID0gZGF0YSB9OworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiA9IGF2cGt0LT5kYXRhOworICAgIGludCByZXQsIHgsIHksIHRvZmZzZXQsIGJvZmZzZXQ7CisgICAgQVZGcmFtZSAqIGNvbnN0IHAgPSBkYXRhOworICAgIEdldEJpdENvbnRleHQgZ2I7CisgICAgdWludDhfdCAqZHN0OworCisgICAgaWYgKGF2cGt0LT5zaXplIDw9IDE2KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmIChBVl9STDMyKGJ1ZikgIT0gTUtUQUcoJ1knLCAnTCcsICdDJywgJzAnKSB8fAorICAgICAgICBBVl9STDMyKGJ1ZiArIDQpICE9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgdG9mZnNldCA9IEFWX1JMMzIoYnVmICsgOCk7CisgICAgaWYgKHRvZmZzZXQgPCAxNiB8fCB0b2Zmc2V0ID49IGF2cGt0LT5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGJvZmZzZXQgPSBBVl9STDMyKGJ1ZiArIDEyKTsKKyAgICBpZiAodG9mZnNldCA+PSBib2Zmc2V0IHx8IGJvZmZzZXQgPj0gYXZwa3QtPnNpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfZ2V0X2J1ZmZlcihhdmN0eCwgJmZyYW1lLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfZmFzdF9tYWxsb2MoJnMtPnRhYmxlX2JpdHMsICZzLT50YWJsZV9iaXRzX3NpemUsCisgICAgICAgICAgICAgICAgICAgYm9mZnNldCAtIHRvZmZzZXQgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXMtPnRhYmxlX2JpdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBtZW1jcHkocy0+dGFibGVfYml0cywgYXZwa3QtPmRhdGEgKyB0b2Zmc2V0LCBib2Zmc2V0IC0gdG9mZnNldCk7CisgICAgbWVtc2V0KHMtPnRhYmxlX2JpdHMgKyBib2Zmc2V0IC0gdG9mZnNldCwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgcy0+YmRzcC5ic3dhcF9idWYoKHVpbnQzMl90ICopIHMtPnRhYmxlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopIHMtPnRhYmxlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgKGJvZmZzZXQgLSB0b2Zmc2V0ICsgMykgPj4gMik7CisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIHMtPnRhYmxlX2JpdHMsIGJvZmZzZXQgLSB0b2Zmc2V0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yICh4ID0gMDsgeCA8IDEwMjQ7IHgrKykgeworICAgICAgICB1bnNpZ25lZCBsZW4gPSBnZXRfdW5hcnkoJmdiLCAxLCAzMSk7CisgICAgICAgIHVpbnQzMl90IHZhbCA9ICgoMVUgPDwgbGVuKSAtIDEpICsgZ2V0X2JpdHNfbG9uZygmZ2IsIGxlbik7CisKKyAgICAgICAgcy0+dGFibGVbeF0gPSB2YWw7CisgICAgfQorCisgICAgcmV0ID0gYnVpbGRfdmxjKGF2Y3R4LCAmcy0+dmxjWzBdLCAmcy0+dGFibGVbMCAgXSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gYnVpbGRfdmxjKGF2Y3R4LCAmcy0+dmxjWzFdLCAmcy0+dGFibGVbMjU2XSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gYnVpbGRfdmxjKGF2Y3R4LCAmcy0+dmxjWzJdLCAmcy0+dGFibGVbNTEyXSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gYnVpbGRfdmxjKGF2Y3R4LCAmcy0+dmxjWzNdLCAmcy0+dGFibGVbNzY4XSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBhdl9mYXN0X21hbGxvYygmcy0+Yml0c3RyZWFtX2JpdHMsICZzLT5iaXRzdHJlYW1fYml0c19zaXplLAorICAgICAgICAgICAgICAgICAgIGF2cGt0LT5zaXplIC0gYm9mZnNldCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghcy0+Yml0c3RyZWFtX2JpdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBtZW1jcHkocy0+Yml0c3RyZWFtX2JpdHMsIGF2cGt0LT5kYXRhICsgYm9mZnNldCwgYXZwa3QtPnNpemUgLSBib2Zmc2V0KTsKKyAgICBtZW1zZXQocy0+Yml0c3RyZWFtX2JpdHMgKyBhdnBrdC0+c2l6ZSAtIGJvZmZzZXQsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIHMtPmJkc3AuYnN3YXBfYnVmKCh1aW50MzJfdCAqKSBzLT5iaXRzdHJlYW1fYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKikgcy0+Yml0c3RyZWFtX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgKGF2cGt0LT5zaXplIC0gYm9mZnNldCkgPj4gMik7CisgICAgaWYgKChyZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIHMtPmJpdHN0cmVhbV9iaXRzLCBhdnBrdC0+c2l6ZSAtIGJvZmZzZXQpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBkc3QgPSBwLT5kYXRhWzBdOworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgbWVtc2V0KGRzdCwgMCwgYXZjdHgtPndpZHRoICogMik7CisgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBkc3QgPSBwLT5kYXRhWzBdOworICAgIGZvciAoeSA9IDA7IHkgPCBhdmN0eC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aCAqIDIgJiYgeSA8IGF2Y3R4LT5oZWlnaHQ7KSB7CisgICAgICAgICAgICBpZiAoZ2V0X2JpdHNfbGVmdCgmZ2IpIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgICAgIGlmIChnZXRfYml0czEoJmdiKSkgeworICAgICAgICAgICAgICAgIGludCB2YWwgPSBnZXRfdmxjMigmZ2IsIHMtPnZsY1swXS50YWJsZSwgcy0+dmxjWzBdLmJpdHMsIDMpOworICAgICAgICAgICAgICAgIGlmICh2YWwgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsIDwgMHhFMSkgeworICAgICAgICAgICAgICAgICAgICBkc3RbeCAgICBdID0gdGFibGVfeTFbdmFsXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyAxXSA9IHRhYmxlX3VbdmFsXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyAyXSA9IHRhYmxlX3kyW3ZhbF07CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgM10gPSB0YWJsZV92W3ZhbF07CisgICAgICAgICAgICAgICAgICAgIHggKz0gNDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpbnQgaW5jciA9ICh2YWwgLSAweERGKSAqIDQ7CisgICAgICAgICAgICAgICAgICAgIGlmICh4ICsgaW5jciA+PSBhdmN0eC0+d2lkdGggKiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXkgPSAoKHggKyBpbmNyKSAvIChhdmN0eC0+d2lkdGggKiAyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB4ICA9ICh4ICsgaW5jcikgJSAoYXZjdHgtPndpZHRoICogMik7CisgICAgICAgICAgICAgICAgICAgICAgICB5ICs9IGl5OworICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGl5ICogcC0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4ICs9IGluY3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCB5MSwgeTIsIHUsIHY7CisKKyAgICAgICAgICAgICAgICB5MSA9IGdldF92bGMyKCZnYiwgcy0+dmxjWzFdLnRhYmxlLCBzLT52bGNbMV0uYml0cywgMyk7CisgICAgICAgICAgICAgICAgdSAgPSBnZXRfdmxjMigmZ2IsIHMtPnZsY1syXS50YWJsZSwgcy0+dmxjWzJdLmJpdHMsIDMpOworICAgICAgICAgICAgICAgIHkyID0gZ2V0X3ZsYzIoJmdiLCBzLT52bGNbMV0udGFibGUsIHMtPnZsY1sxXS5iaXRzLCAzKTsKKyAgICAgICAgICAgICAgICB2ICA9IGdldF92bGMyKCZnYiwgcy0+dmxjWzNdLnRhYmxlLCBzLT52bGNbM10uYml0cywgMyk7CisgICAgICAgICAgICAgICAgaWYgKHkxIDwgMCB8fCB5MiA8IDAgfHwgdSA8IDAgfHwgdiA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGRzdFt4ICAgIF0gPSB5MTsKKyAgICAgICAgICAgICAgICBkc3RbeCArIDFdID0gdTsKKyAgICAgICAgICAgICAgICBkc3RbeCArIDJdID0geTEgKyB5MjsKKyAgICAgICAgICAgICAgICBkc3RbeCArIDNdID0gdjsKKyAgICAgICAgICAgICAgICB4ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZHN0ICs9IHAtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIGRzdCA9IHAtPmRhdGFbMF07CisgICAgZm9yICh4ID0gMDsgeCA8IGF2Y3R4LT53aWR0aCAqIDI7IHggKz0gNCkgeworICAgICAgICBkc3RbeCAgICBdID0gICAgICAgIGRzdFt4ICAgIF0gKyBMWzBdOworICAgICAgICBkc3RbeCArIDJdID0gTFswXSA9IGRzdFt4ICsgMl0gKyBMWzBdOworICAgICAgICBMWzFdID0gZHN0W3ggKyAxXSArIExbMV07CisgICAgICAgIGRzdFt4ICsgMV0gPSBMWzFdOworICAgICAgICBMWzJdID0gZHN0W3ggKyAzXSArIExbMl07CisgICAgICAgIGRzdFt4ICsgM10gPSBMWzJdOworICAgIH0KKyAgICBkc3QgKz0gcC0+bGluZXNpemVbMF07CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgYXZjdHgtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIHggPSAwOworICAgICAgICBkc3RbeCAgICBdID0gICAgICAgIGRzdFt4ICAgIF0gKyBMWzBdICsgZHN0W3ggKyAwIC0gcC0+bGluZXNpemVbMF1dIC0gVExbMF07CisgICAgICAgIGRzdFt4ICsgMl0gPSBMWzBdID0gZHN0W3ggKyAyXSArIExbMF0gKyBkc3RbeCArIDIgLSBwLT5saW5lc2l6ZVswXV0gLSBUTFswXTsKKyAgICAgICAgVExbMF0gPSBkc3RbeCArIDIgLSBwLT5saW5lc2l6ZVswXV07CisgICAgICAgIExbMV0gPSBkc3RbeCArIDFdICsgTFsxXSArIGRzdFt4ICsgMSAtIHAtPmxpbmVzaXplWzBdXSAtIFRMWzFdOworICAgICAgICBkc3RbeCArIDFdID0gTFsxXTsKKyAgICAgICAgVExbMV0gPSBkc3RbeCArIDEgLSBwLT5saW5lc2l6ZVswXV07CisgICAgICAgIExbMl0gPSBkc3RbeCArIDNdICsgTFsyXSArIGRzdFt4ICsgMyAtIHAtPmxpbmVzaXplWzBdXSAtIFRMWzJdOworICAgICAgICBkc3RbeCArIDNdID0gTFsyXTsKKyAgICAgICAgVExbMl0gPSBkc3RbeCArIDMgLSBwLT5saW5lc2l6ZVswXV07CisgICAgICAgIGZvciAoeCA9IDQ7IHggPCBhdmN0eC0+d2lkdGggKiAyOyB4ICs9IDQpIHsKKyAgICAgICAgICAgIGRzdFt4ICAgIF0gPSAgICAgICAgZHN0W3ggICAgXSArIExbMF0gKyBkc3RbeCArIDAgLSBwLT5saW5lc2l6ZVswXV0gLSBUTFswXTsKKyAgICAgICAgICAgIGRzdFt4ICsgMl0gPSBMWzBdID0gZHN0W3ggKyAyXSArIExbMF0gKyBkc3RbeCArIDIgLSBwLT5saW5lc2l6ZVswXV0gLSBUTFswXTsKKyAgICAgICAgICAgIFRMWzBdID0gZHN0W3ggKyAyIC0gcC0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgTFsxXSA9IGRzdFt4ICsgMV0gKyBMWzFdICsgZHN0W3ggKyAxIC0gcC0+bGluZXNpemVbMF1dIC0gVExbMV07CisgICAgICAgICAgICBkc3RbeCArIDFdID0gTFsxXTsKKyAgICAgICAgICAgIFRMWzFdID0gZHN0W3ggKyAxIC0gcC0+bGluZXNpemVbMF1dOworICAgICAgICAgICAgTFsyXSA9IGRzdFt4ICsgM10gKyBMWzJdICsgZHN0W3ggKyAzIC0gcC0+bGluZXNpemVbMF1dIC0gVExbMl07CisgICAgICAgICAgICBkc3RbeCArIDNdID0gTFsyXTsKKyAgICAgICAgICAgIFRMWzJdID0gZHN0W3ggKyAzIC0gcC0+bGluZXNpemVbMF1dOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBwLT5saW5lc2l6ZVswXTsKKyAgICB9CisKKyAgICBwLT5waWN0X3R5cGUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKKyAgICBwLT5rZXlfZnJhbWUgPSAxOworICAgICpnb3RfZnJhbWUgICA9IDE7CisKKyAgICByZXR1cm4gYXZwa3QtPnNpemU7Cit9CisKKyNpZiBIQVZFX1RIUkVBRFMKK3N0YXRpYyBpbnQgaW5pdF90aHJlYWRfY29weShBVkNvZGVjQ29udGV4dCAqYXZjdHgpCit7CisgICAgWUxDQ29udGV4dCAqcyA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBtZW1zZXQoJnMtPnZsY1swXSwgMCwgc2l6ZW9mKFZMQykpOworICAgIG1lbXNldCgmcy0+dmxjWzFdLCAwLCBzaXplb2YoVkxDKSk7CisgICAgbWVtc2V0KCZzLT52bGNbMl0sIDAsIHNpemVvZihWTEMpKTsKKyAgICBtZW1zZXQoJnMtPnZsY1szXSwgMCwgc2l6ZW9mKFZMQykpOworICAgIHMtPnRhYmxlX2JpdHMgPSBOVUxMOworICAgIHMtPnRhYmxlX2JpdHNfc2l6ZSA9IDA7CisgICAgcy0+Yml0c3RyZWFtX2JpdHMgPSBOVUxMOworICAgIHMtPmJpdHN0cmVhbV9iaXRzX3NpemUgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGF2X2NvbGQgaW50IGRlY29kZV9lbmQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQoreworICAgIFlMQ0NvbnRleHQgKnMgPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgZmZfZnJlZV92bGMoJnMtPnZsY1swXSk7CisgICAgZmZfZnJlZV92bGMoJnMtPnZsY1sxXSk7CisgICAgZmZfZnJlZV92bGMoJnMtPnZsY1syXSk7CisgICAgZmZfZnJlZV92bGMoJnMtPnZsY1szXSk7CisgICAgYXZfZnJlZXAoJnMtPnRhYmxlX2JpdHMpOworICAgIHMtPnRhYmxlX2JpdHNfc2l6ZSA9IDA7CisgICAgYXZfZnJlZXAoJnMtPmJpdHN0cmVhbV9iaXRzKTsKKyAgICBzLT5iaXRzdHJlYW1fYml0c19zaXplID0gMDsKKworICAgIHJldHVybiAwOworfQorCitBVkNvZGVjIGZmX3lsY19kZWNvZGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ5bGMiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJZVVkyIExvc3NsZXNzIENvZGVjIiksCisgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5pZCAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1lMQywKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoWUxDQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgID0gZGVjb2RlX2luaXQsCisgICAgLmluaXRfdGhyZWFkX2NvcHkgPSBPTkxZX0lGX1RIUkVBRFNfRU5BQkxFRChpbml0X3RocmVhZF9jb3B5KSwKKyAgICAuY2xvc2UgICAgICAgICAgPSBkZWNvZGVfZW5kLAorICAgIC5kZWNvZGUgICAgICAgICA9IGRlY29kZV9mcmFtZSwKKyAgICAuY2FwYWJpbGl0aWVzICAgPSBBVl9DT0RFQ19DQVBfRFIxIHwgQVZfQ09ERUNfQ0FQX0ZSQU1FX1RIUkVBRFMsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3lvcC5jIGIvbGliYXZjb2RlYy95b3AuYwppbmRleCBjNmIxOWVjLi4zMmNmZWEyIDEwMDY0NAotLS0gYS9saWJhdmNvZGVjL3lvcC5jCisrKyBiL2xpYmF2Y29kZWMveW9wLmMKQEAgLTIyLDExICsyMiwxMyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAKICNpbmNsdWRlICJhdmNvZGVjLmgiCi0jaW5jbHVkZSAiZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiB0eXBlZGVmIHN0cnVjdCBZb3BEZWNDb250ZXh0IHsKZGlmZiAtLWdpdCBhL2xpYmF2Y29kZWMvemVyb2NvZGVjLmMgYi9saWJhdmNvZGVjL3plcm9jb2RlYy5jCmluZGV4IDU1YTlhOTEuLmU2N2VlZTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvemVyb2NvZGVjLmMKKysrIGIvbGliYXZjb2RlYy96ZXJvY29kZWMuYwpAQCAtMTQ5LDQgKzE0OSw1IEBACiAgICAgLmRlY29kZSAgICAgICAgID0gemVyb2NvZGVjX2RlY29kZV9mcmFtZSwKICAgICAuY2xvc2UgICAgICAgICAgPSB6ZXJvY29kZWNfZGVjb2RlX2Nsb3NlLAogICAgIC5jYXBhYmlsaXRpZXMgICA9IEFWX0NPREVDX0NBUF9EUjEsCisgICAgLmNhcHNfaW50ZXJuYWwgID0gRkZfQ09ERUNfQ0FQX0lOSVRfVEhSRUFEU0FGRSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ptYnYuYyBiL2xpYmF2Y29kZWMvem1idi5jCmluZGV4IDI1YTFjZDIuLjZlZjU0OWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvem1idi5jCisrKyBiL2xpYmF2Y29kZWMvem1idi5jCkBAIC00MDgsNiArNDA4LDcgQEAKICAgICBpbnQgenJldCA9IFpfT0s7IC8vIFpsaWIgcmV0dXJuIGNvZGUKICAgICBpbnQgbGVuID0gYnVmX3NpemU7CiAgICAgaW50IGhpX3ZlciwgbG9fdmVyLCByZXQ7CisgICAgaW50IGV4cGVjdGVkX3NpemU7CiAKICAgICAvKiBwYXJzZSBoZWFkZXIgKi8KICAgICBpZiAobGVuIDwgMSkKQEAgLTUwNCwyMSArNTA1LDI3IEBACiAgICAgICAgIG1lbXNldChjLT5wcmV2LCAwLCBhdmN0eC0+d2lkdGggKiBhdmN0eC0+aGVpZ2h0ICogKGMtPmJwcCAvIDgpKTsKICAgICAgICAgYy0+ZGVjb2RlX2ludHJhPSBkZWNvZGVfaW50cmE7CiAgICAgfQorICAgIGlmIChjLT5mbGFncyAmIFpNQlZfS0VZRlJBTUUpIHsKKyAgICAgICAgZXhwZWN0ZWRfc2l6ZSA9IGF2Y3R4LT53aWR0aCAqIGF2Y3R4LT5oZWlnaHQgKiAoYy0+YnBwIC8gOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXhwZWN0ZWRfc2l6ZSA9IChjLT5ieCAqIGMtPmJ5ICogMiArIDMpICYgfjM7CisgICAgfQorICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggJiYKKyAgICAgICAgKGMtPmZsYWdzICYgKFpNQlZfREVMVEFQQUwgfCBaTUJWX0tFWUZSQU1FKSkpCisgICAgICAgIGV4cGVjdGVkX3NpemUgKz0gNzY4OwogCiAgICAgaWYgKCFjLT5kZWNvZGVfaW50cmEpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciEgR290IG5vIGZvcm1hdCBvciBubyBrZXlmcmFtZSFcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBpZiAoKHJldCA9IGZmX2dldF9idWZmZXIoYXZjdHgsIGZyYW1lLCAwKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgaWYgKGMtPmNvbXAgPT0gMCkgeyAvL1VuY29tcHJlc3NlZCBkYXRhCisgICAgaWYgKGMtPmNvbXAgPT0gMCkgeyAvLyB1bmNvbXByZXNzZWQgZGF0YQogICAgICAgICBpZiAoYy0+ZGVjb21wX3NpemUgPCBsZW4pIHsKICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQnVmZmVyIHRvbyBzbWFsbFxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogICAgICAgICBtZW1jcHkoYy0+ZGVjb21wX2J1ZiwgYnVmLCBsZW4pOworICAgICAgICBjLT5kZWNvbXBfbGVuID0gbGVuOwogICAgIH0gZWxzZSB7IC8vIFpMSUItY29tcHJlc3NlZCBkYXRhCiAgICAgICAgIGMtPnpzdHJlYW0udG90YWxfaW4gPSBjLT56c3RyZWFtLnRvdGFsX291dCA9IDA7CiAgICAgICAgIGMtPnpzdHJlYW0ubmV4dF9pbiA9ICh1aW50OF90KilidWY7CkBAIC01MzIsNiArNTM5LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgYy0+ZGVjb21wX2xlbiA9IGMtPnpzdHJlYW0udG90YWxfb3V0OwogICAgIH0KKyAgICBpZiAoZXhwZWN0ZWRfc2l6ZSA+IGMtPmRlY29tcF9sZW4gfHwKKyAgICAgICAgKGMtPmZsYWdzICYgWk1CVl9LRVlGUkFNRSkgJiYgZXhwZWN0ZWRfc2l6ZSA8IGMtPmRlY29tcF9sZW4pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJkZWNvbXByZXNzZWQgc2l6ZSAlZCBpcyBpbmNvcnJlY3QsIGV4cGVjdGVkICVkXG4iLCBjLT5kZWNvbXBfbGVuLCBleHBlY3RlZF9zaXplKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGlmICgocmV0ID0gZmZfZ2V0X2J1ZmZlcihhdmN0eCwgZnJhbWUsIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKICAgICBpZiAoYy0+ZmxhZ3MgJiBaTUJWX0tFWUZSQU1FKSB7CiAgICAgICAgIGZyYW1lLT5rZXlfZnJhbWUgPSAxOwogICAgICAgICBmcmFtZS0+cGljdF90eXBlID0gQVZfUElDVFVSRV9UWVBFX0k7CkBAIC01MzksNiArNTU0LDggQEAKICAgICB9IGVsc2UgewogICAgICAgICBmcmFtZS0+a2V5X2ZyYW1lID0gMDsKICAgICAgICAgZnJhbWUtPnBpY3RfdHlwZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICBpZiAoYy0+ZGVjb21wX2xlbiA8IDJMTCAqICgoYy0+d2lkdGggKyBjLT5idyAtIDEpIC8gYy0+YncpICogKChjLT5oZWlnaHQgKyBjLT5iaCAtIDEpIC8gYy0+YmgpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGlmIChjLT5kZWNvbXBfbGVuKQogICAgICAgICAgICAgYy0+ZGVjb2RlX3hvcihjKTsKICAgICB9CkBAIC01ODksNiArNjA2LDExIEBACiAgICAgLy8gTmVlZGVkIGlmIHpsaWIgdW51c2VkIG9yIGluaXQgYWJvcnRlZCBiZWZvcmUgaW5mbGF0ZUluaXQKICAgICBtZW1zZXQoJmMtPnpzdHJlYW0sIDAsIHNpemVvZih6X3N0cmVhbSkpOwogCisgICAgaWYgKChhdmN0eC0+d2lkdGggKyAyNTVVTEwpICogKGF2Y3R4LT5oZWlnaHQgKyA2NFVMTCkgPiBGRk1JTihhdmN0eC0+bWF4X3BpeGVscywgSU5UX01BWCAvIDQpICkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludGVybmFsIGJ1ZmZlciAoZGVjb21wX3NpemUpIGxhcmdlciB0aGFuIG1heF9waXhlbHMgb3IgdG9vIGxhcmdlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCiAgICAgYy0+ZGVjb21wX3NpemUgPSAoYXZjdHgtPndpZHRoICsgMjU1KSAqIDQgKiAoYXZjdHgtPmhlaWdodCArIDY0KTsKIAogICAgIC8qIEFsbG9jYXRlIGRlY29tcHJlc3Npb24gYnVmZmVyICovCmRpZmYgLS1naXQgYS9saWJhdmNvZGVjL3ptYnZlbmMuYyBiL2xpYmF2Y29kZWMvem1idmVuYy5jCmluZGV4IGU4MzJiZWQuLjRkOTE0NzYgMTAwNjQ0Ci0tLSBhL2xpYmF2Y29kZWMvem1idmVuYy5jCisrKyBiL2xpYmF2Y29kZWMvem1idmVuYy5jCkBAIC01NCwxNiArNTQsMTggQEAKICAgICBpbnQgY29tcF9zaXplOwogICAgIGludCBrZXlpbnQsIGN1cmZybTsKICAgICB6X3N0cmVhbSB6c3RyZWFtOworCisgICAgaW50IHNjb3JlX3RhYlsyNTZdOwogfSBabWJ2RW5jQ29udGV4dDsKIAotc3RhdGljIGludCBzY29yZV90YWJbMjU2XTsKIAogLyoqIEJsb2NrIGNvbXBhcmluZyBmdW5jdGlvbgogICogWFhYIHNob3VsZCBiZSBvcHRpbWl6ZWQgYW5kIG1vdmVkIHRvIERTUENvbnRleHQKICAqIFRPRE8gaGFuZGxlIG91dCBvZiBlZGdlIE1FCiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGJsb2NrX2NtcCh1aW50OF90ICpzcmMsIGludCBzdHJpZGUsIHVpbnQ4X3QgKnNyYzIsIGludCBzdHJpZGUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidywgaW50IGJoLCBpbnQgKnhvcmVkKQorc3RhdGljIGlubGluZSBpbnQgYmxvY2tfY21wKFptYnZFbmNDb250ZXh0ICpjLCB1aW50OF90ICpzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqc3JjMiwgaW50IHN0cmlkZTIsIGludCBidywgaW50IGJoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqeG9yZWQpCiB7CiAgICAgaW50IHN1bSA9IDA7CiAgICAgaW50IGksIGo7CkBAIC04MSw3ICs4Myw3IEBACiAgICAgfQogCiAgICAgZm9yKGkgPSAxOyBpIDwgMjU2OyBpKyspCi0gICAgICAgIHN1bSArPSBzY29yZV90YWJbaGlzdG9ncmFtW2ldXTsKKyAgICAgICAgc3VtICs9IGMtPnNjb3JlX3RhYltoaXN0b2dyYW1baV1dOwogCiAgICAgcmV0dXJuIHN1bTsKIH0KQEAgLTk3LDE0ICs5OSwxNCBAQAogICAgICpteCA9ICpteSA9IDA7CiAgICAgYncgPSBGRk1JTihaTUJWX0JMT0NLLCBjLT5hdmN0eC0+d2lkdGggLSB4KTsKICAgICBiaCA9IEZGTUlOKFpNQlZfQkxPQ0ssIGMtPmF2Y3R4LT5oZWlnaHQgLSB5KTsKLSAgICBidiA9IGJsb2NrX2NtcChzcmMsIHNzdHJpZGUsIHByZXYsIHBzdHJpZGUsIGJ3LCBiaCwgeG9yZWQpOworICAgIGJ2ID0gYmxvY2tfY21wKGMsIHNyYywgc3N0cmlkZSwgcHJldiwgcHN0cmlkZSwgYncsIGJoLCB4b3JlZCk7CiAgICAgaWYoIWJ2KSByZXR1cm4gMDsKICAgICBmb3IodHkgPSBGRk1BWCh5IC0gYy0+cmFuZ2UsIDApOyB0eSA8IEZGTUlOKHkgKyBjLT5yYW5nZSwgYy0+YXZjdHgtPmhlaWdodCAtIGJoKTsgdHkrKyl7CiAgICAgICAgIGZvcih0eCA9IEZGTUFYKHggLSBjLT5yYW5nZSwgMCk7IHR4IDwgRkZNSU4oeCArIGMtPnJhbmdlLCBjLT5hdmN0eC0+d2lkdGggLSBidyk7IHR4KyspewogICAgICAgICAgICAgaWYodHggPT0geCAmJiB0eSA9PSB5KSBjb250aW51ZTsgLy8gd2UgYWxyZWFkeSB0ZXN0ZWQgdGhpcyBibG9jawogICAgICAgICAgICAgZHggPSB0eCAtIHg7CiAgICAgICAgICAgICBkeSA9IHR5IC0geTsKLSAgICAgICAgICAgIHR2ID0gYmxvY2tfY21wKHNyYywgc3N0cmlkZSwgcHJldiArIGR4ICsgZHkqcHN0cmlkZSwgcHN0cmlkZSwgYncsIGJoLCB4b3JlZCk7CisgICAgICAgICAgICB0diA9IGJsb2NrX2NtcChjLCBzcmMsIHNzdHJpZGUsIHByZXYgKyBkeCArIGR5ICogcHN0cmlkZSwgcHN0cmlkZSwgYncsIGJoLCB4b3JlZCk7CiAgICAgICAgICAgICBpZih0diA8IGJ2KXsKICAgICAgICAgICAgICAgICAgYnYgPSB0djsKICAgICAgICAgICAgICAgICAgKm14ID0gZHg7CkBAIC0yNzcsNyArMjc5LDcgQEAKICAgICBpbnQgbHZsID0gOTsKIAogICAgIGZvcihpPTE7IGk8MjU2OyBpKyspCi0gICAgICAgIHNjb3JlX3RhYltpXT0gLWkgKiBsb2cyKGkvKGRvdWJsZSkoWk1CVl9CTE9DSypaTUJWX0JMT0NLKSkgKiAyNTY7CisgICAgICAgIGMtPnNjb3JlX3RhYltpXSA9IC1pICogbG9nMihpIC8gKGRvdWJsZSkoWk1CVl9CTE9DSyAqIFpNQlZfQkxPQ0spKSAqIDI1NjsKIAogICAgIGMtPmF2Y3R4ID0gYXZjdHg7CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL01ha2VmaWxlIGIvbGliYXZkZXZpY2UvTWFrZWZpbGUKaW5kZXggODM5NGU4Ny4uZjExYTZmMiAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvTWFrZWZpbGUKKysrIGIvbGliYXZkZXZpY2UvTWFrZWZpbGUKQEAgLTEsNiArMSw1IEBACi1pbmNsdWRlICQoU1VCRElSKS4uL2NvbmZpZy5tYWsKLQogTkFNRSAgICA9IGF2ZGV2aWNlCitERVNDICAgID0gRkZtcGVnIGRldmljZSBoYW5kbGluZyBsaWJyYXJ5CiAKIEhFQURFUlMgPSBhdmRldmljZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB2ZXJzaW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTksMTggKzgsMjMgQEAKICAgICAgICAgICBhdmRldmljZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB1dGlscy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAorT0JKUy0kKEhBVkVfTElCQ19NU1ZDUlQpICAgICAgICAgICAgICAgICArPSBmaWxlX29wZW4ubworT0JKUy0kKENPTkZJR19TSEFSRUQpICAgICAgICAgICAgICAgICAgICArPSByZXZlcnNlLm8KKwogIyBpbnB1dC9vdXRwdXQgZGV2aWNlcwogT0JKUy0kKENPTkZJR19BTFNBX0lOREVWKSAgICAgICAgICAgICAgICArPSBhbHNhX2RlYy5vIGFsc2EubyB0aW1lZmlsdGVyLm8KIE9CSlMtJChDT05GSUdfQUxTQV9PVVRERVYpICAgICAgICAgICAgICAgKz0gYWxzYV9lbmMubyBhbHNhLm8KK09CSlMtJChDT05GSUdfQU5EUk9JRF9DQU1FUkFfSU5ERVYpICAgICAgKz0gYW5kcm9pZF9jYW1lcmEubwogT0JKUy0kKENPTkZJR19BVkZPVU5EQVRJT05fSU5ERVYpICAgICAgICArPSBhdmZvdW5kYXRpb24ubwogT0JKUy0kKENPTkZJR19CS1RSX0lOREVWKSAgICAgICAgICAgICAgICArPSBia3RyLm8KIE9CSlMtJChDT05GSUdfQ0FDQV9PVVRERVYpICAgICAgICAgICAgICAgKz0gY2FjYS5vCiBPQkpTLSQoQ09ORklHX0RFQ0tMSU5LX09VVERFVikgICAgICAgICAgICs9IGRlY2tsaW5rX2VuYy5vIGRlY2tsaW5rX2VuY19jLm8gZGVja2xpbmtfY29tbW9uLm8KIE9CSlMtJChDT05GSUdfREVDS0xJTktfSU5ERVYpICAgICAgICAgICAgKz0gZGVja2xpbmtfZGVjLm8gZGVja2xpbmtfZGVjX2MubyBkZWNrbGlua19jb21tb24ubworT0JKUy0kKENPTkZJR19MSUJORElfTkVXVEVLX09VVERFVikgICAgICArPSBsaWJuZGlfbmV3dGVrX2VuYy5vCitPQkpTLSQoQ09ORklHX0xJQk5ESV9ORVdURUtfSU5ERVYpICAgICAgICs9IGxpYm5kaV9uZXd0ZWtfZGVjLm8KIE9CSlMtJChDT05GSUdfRFNIT1dfSU5ERVYpICAgICAgICAgICAgICAgKz0gZHNob3dfY3Jvc3NiYXIubyBkc2hvdy5vIGRzaG93X2VudW1tZWRpYXR5cGVzLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2hvd19lbnVtcGlucy5vIGRzaG93X2ZpbHRlci5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNob3dfcGluLm8gZHNob3dfY29tbW9uLm8KLU9CSlMtJChDT05GSUdfRFYxMzk0X0lOREVWKSAgICAgICAgICAgICAgKz0gZHYxMzk0Lm8KIE9CSlMtJChDT05GSUdfRkJERVZfSU5ERVYpICAgICAgICAgICAgICAgKz0gZmJkZXZfZGVjLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmRldl9jb21tb24ubwogT0JKUy0kKENPTkZJR19GQkRFVl9PVVRERVYpICAgICAgICAgICAgICArPSBmYmRldl9lbmMubyBcCkBAIC0yOCw2ICszMiw3IEBACiBPQkpTLSQoQ09ORklHX0dESUdSQUJfSU5ERVYpICAgICAgICAgICAgICs9IGdkaWdyYWIubwogT0JKUy0kKENPTkZJR19JRUM2MTg4M19JTkRFVikgICAgICAgICAgICArPSBpZWM2MTg4My5vCiBPQkpTLSQoQ09ORklHX0pBQ0tfSU5ERVYpICAgICAgICAgICAgICAgICs9IGphY2subyB0aW1lZmlsdGVyLm8KK09CSlMtJChDT05GSUdfS01TR1JBQl9JTkRFVikgICAgICAgICAgICAgKz0ga21zZ3JhYi5vCiBPQkpTLSQoQ09ORklHX0xBVkZJX0lOREVWKSAgICAgICAgICAgICAgICs9IGxhdmZpLm8KIE9CSlMtJChDT05GSUdfT1BFTkFMX0lOREVWKSAgICAgICAgICAgICAgKz0gb3BlbmFsLWRlYy5vCiBPQkpTLSQoQ09ORklHX09QRU5HTF9PVVRERVYpICAgICAgICAgICAgICs9IG9wZW5nbF9lbmMubwpAQCAtMzcsMzcgKzQyLDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1bHNlX2F1ZGlvX2NvbW1vbi5vIHRpbWVmaWx0ZXIubwogT0JKUy0kKENPTkZJR19QVUxTRV9PVVRERVYpICAgICAgICAgICAgICArPSBwdWxzZV9hdWRpb19lbmMubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1bHNlX2F1ZGlvX2NvbW1vbi5vCi1PQkpTLSQoQ09ORklHX1FUS0lUX0lOREVWKSAgICAgICAgICAgICAgICs9IHF0a2l0Lm8KLU9CSlMtJChDT05GSUdfU0RMX09VVERFVikgICAgICAgICAgICAgICAgKz0gc2RsLm8KK09CSlMtJChDT05GSUdfU0RMMl9PVVRERVYpICAgICAgICAgICAgICAgKz0gc2RsMi5vCiBPQkpTLSQoQ09ORklHX1NORElPX0lOREVWKSAgICAgICAgICAgICAgICs9IHNuZGlvX2RlYy5vIHNuZGlvLm8KIE9CSlMtJChDT05GSUdfU05ESU9fT1VUREVWKSAgICAgICAgICAgICAgKz0gc25kaW9fZW5jLm8gc25kaW8ubwogT0JKUy0kKENPTkZJR19WNEwyX0lOREVWKSAgICAgICAgICAgICAgICArPSB2NGwyLm8gdjRsMi1jb21tb24ubyB0aW1lZmlsdGVyLm8KIE9CSlMtJChDT05GSUdfVjRMMl9PVVRERVYpICAgICAgICAgICAgICAgKz0gdjRsMmVuYy5vIHY0bDItY29tbW9uLm8KLU9CSlMtJChDT05GSUdfVjRMX0lOREVWKSAgICAgICAgICAgICAgICAgKz0gdjRsLm8KIE9CSlMtJChDT05GSUdfVkZXQ0FQX0lOREVWKSAgICAgICAgICAgICAgKz0gdmZ3Y2FwLm8KLU9CSlMtJChDT05GSUdfWDExR1JBQl9JTkRFVikgICAgICAgICAgICAgKz0geDExZ3JhYi5vCi1PQkpTLSQoQ09ORklHX1gxMUdSQUJfWENCX0lOREVWKSAgICAgICAgICs9IHhjYmdyYWIubworT0JKUy0kKENPTkZJR19YQ0JHUkFCX0lOREVWKSAgICAgICAgICAgICArPSB4Y2JncmFiLm8KIE9CSlMtJChDT05GSUdfWFZfT1VUREVWKSAgICAgICAgICAgICAgICAgKz0geHYubwogCiAjIGV4dGVybmFsIGxpYnJhcmllcwogT0JKUy0kKENPTkZJR19MSUJDRElPX0lOREVWKSAgICAgICAgICAgICArPSBsaWJjZGlvLm8KIE9CSlMtJChDT05GSUdfTElCREMxMzk0X0lOREVWKSAgICAgICAgICAgKz0gbGliZGMxMzk0Lm8KIAotT0JKUy0kKEhBVkVfTElCQ19NU1ZDUlQpICAgICAgICAgICAgICAgICArPSBmaWxlX29wZW4ubwotCiAjIFdpbmRvd3MgcmVzb3VyY2UgZmlsZQogU0xJQk9CSlMtJChIQVZFX0dOVV9XSU5EUkVTKSAgICAgICAgICAgICArPSBhdmRldmljZXJlcy5vCiAKIFNLSVBIRUFERVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gZGVja2xpbmtfY29tbW9uLmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX0RFQ0tMSU5LKSAgICAgICAgICAgKz0gZGVja2xpbmtfZW5jLmggZGVja2xpbmtfZGVjLmggXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNrbGlua19jb21tb25fYy5oCitTS0lQSEVBREVSUy0kKENPTkZJR19MSUJORElfTkVXVEVLX0lOREVWKSArPSBsaWJuZGlfbmV3dGVrX2NvbW1vbi5oCitTS0lQSEVBREVSUy0kKENPTkZJR19MSUJORElfTkVXVEVLX09VVERFVikgKz0gbGlibmRpX25ld3Rla19jb21tb24uaAogU0tJUEhFQURFUlMtJChDT05GSUdfRFNIT1dfSU5ERVYpICAgICAgICArPSBkc2hvd19jYXB0dXJlLmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX0ZCREVWX0lOREVWKSAgICAgICAgKz0gZmJkZXZfY29tbW9uLmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX0ZCREVWX09VVERFVikgICAgICAgKz0gZmJkZXZfY29tbW9uLmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX0xJQlBVTFNFKSAgICAgICAgICAgKz0gcHVsc2VfYXVkaW9fY29tbW9uLmgKIFNLSVBIRUFERVJTLSQoQ09ORklHX1Y0TDJfSU5ERVYpICAgICAgICAgKz0gdjRsMi1jb21tb24uaAogU0tJUEhFQURFUlMtJChDT05GSUdfVjRMMl9PVVRERVYpICAgICAgICArPSB2NGwyLWNvbW1vbi5oCi1TS0lQSEVBREVSUy0kKEhBVkVfQUxTQV9BU09VTkRMSUJfSCkgICAgICs9IGFsc2EuaAotU0tJUEhFQURFUlMtJChIQVZFX1NORElPX0gpICAgICAgICAgICAgICArPSBzbmRpby5oCitTS0lQSEVBREVSUy0kKENPTkZJR19BTFNBKSAgICAgICAgICAgICAgICs9IGFsc2EuaAorU0tJUEhFQURFUlMtJChDT05GSUdfU05ESU8pICAgICAgICAgICAgICArPSBzbmRpby5oCiAKLVRFU1RQUk9HUyA9IHRpbWVmaWx0ZXIKK1RFU1RQUk9HUy0kKENPTkZJR19KQUNLX0lOREVWKSAgICAgICAgICAgKz0gdGltZWZpbHRlcgpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvYWxsZGV2aWNlcy5jIGIvbGliYXZkZXZpY2UvYWxsZGV2aWNlcy5jCmluZGV4IDI2YWVjZjIuLmFkZGU3NDkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2FsbGRldmljZXMuYworKysgYi9saWJhdmRldmljZS9hbGxkZXZpY2VzLmMKQEAgLTE5LDYwICsxOSw1MiBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJhdmRldmljZS5oIgogCi0jZGVmaW5lIFJFR0lTVEVSX09VVERFVihYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGV4dGVybiBBVk91dHB1dEZvcm1hdCBmZl8jI3gjI19tdXhlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChDT05GSUdfIyNYIyNfT1VUREVWKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhdl9yZWdpc3Rlcl9vdXRwdXRfZm9ybWF0KCZmZl8jI3gjI19tdXhlcik7ICAgICAgICAgICAgICAgICBcCi0gICAgfQorLyogZGV2aWNlcyAqLworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2Fsc2FfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hbHNhX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FuZHJvaWRfY2FtZXJhX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYXZmb3VuZGF0aW9uX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYmt0cl9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2NhY2FfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZGVja2xpbmtfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9kZWNrbGlua19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9saWJuZGlfbmV3dGVrX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfbGlibmRpX25ld3Rla19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kc2hvd19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ZiZGV2X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZmJkZXZfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZ2RpZ3JhYl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2llYzYxODgzX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfamFja19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ttc2dyYWJfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9sYXZmaV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX29wZW5hbF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX29wZW5nbF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9vc3NfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9vc3NfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcHVsc2VfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wdWxzZV9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9zZGwyX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3NuZGlvX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfc25kaW9fbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdjRsMl9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3Y0bDJfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdmZ3Y2FwX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfeGNiZ3JhYl9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3h2X211eGVyOwogCi0jZGVmaW5lIFJFR0lTVEVSX0lOREVWKFgsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGV4dGVybiBBVklucHV0Rm9ybWF0IGZmXyMjeCMjX2RlbXV4ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChDT05GSUdfIyNYIyNfSU5ERVYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhdl9yZWdpc3Rlcl9pbnB1dF9mb3JtYXQoJmZmXyMjeCMjX2RlbXV4ZXIpOyAgICAgICAgICAgICAgICBcCi0gICAgfQorLyogZXh0ZXJuYWwgbGlicmFyaWVzICovCitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbGliY2Rpb19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2xpYmRjMTM5NF9kZW11eGVyOwogCi0jZGVmaW5lIFJFR0lTVEVSX0lOT1VUREVWKFgsIHgpIFJFR0lTVEVSX09VVERFVihYLCB4KTsgUkVHSVNURVJfSU5ERVYoWCwgeCkKKyNpbmNsdWRlICJsaWJhdmRldmljZS9vdXRkZXZfbGlzdC5jIgorI2luY2x1ZGUgImxpYmF2ZGV2aWNlL2luZGV2X2xpc3QuYyIKIAogdm9pZCBhdmRldmljZV9yZWdpc3Rlcl9hbGwodm9pZCkKIHsKLSAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkOwotCi0gICAgaWYgKGluaXRpYWxpemVkKQotICAgICAgICByZXR1cm47Ci0gICAgaW5pdGlhbGl6ZWQgPSAxOwotCi0gICAgLyogZGV2aWNlcyAqLwotICAgIFJFR0lTVEVSX0lOT1VUREVWKEFMU0EsICAgICAgICAgICAgIGFsc2EpOwotICAgIFJFR0lTVEVSX0lOREVWICAgKEFWRk9VTkRBVElPTiwgICAgIGF2Zm91bmRhdGlvbik7Ci0gICAgUkVHSVNURVJfSU5ERVYgICAoQktUUiwgICAgICAgICAgICAgYmt0cik7Ci0gICAgUkVHSVNURVJfT1VUREVWICAoQ0FDQSwgICAgICAgICAgICAgY2FjYSk7Ci0gICAgUkVHSVNURVJfSU5PVVRERVYoREVDS0xJTkssICAgICAgICAgZGVja2xpbmspOwotICAgIFJFR0lTVEVSX0lOREVWICAgKERTSE9XLCAgICAgICAgICAgIGRzaG93KTsKLSAgICBSRUdJU1RFUl9JTkRFViAgIChEVjEzOTQsICAgICAgICAgICBkdjEzOTQpOwotICAgIFJFR0lTVEVSX0lOT1VUREVWKEZCREVWLCAgICAgICAgICAgIGZiZGV2KTsKLSAgICBSRUdJU1RFUl9JTkRFViAgIChHRElHUkFCLCAgICAgICAgICBnZGlncmFiKTsKLSAgICBSRUdJU1RFUl9JTkRFViAgIChJRUM2MTg4MywgICAgICAgICBpZWM2MTg4Myk7Ci0gICAgUkVHSVNURVJfSU5ERVYgICAoSkFDSywgICAgICAgICAgICAgamFjayk7Ci0gICAgUkVHSVNURVJfSU5ERVYgICAoTEFWRkksICAgICAgICAgICAgbGF2ZmkpOwotICAgIFJFR0lTVEVSX0lOREVWICAgKE9QRU5BTCwgICAgICAgICAgIG9wZW5hbCk7Ci0gICAgUkVHSVNURVJfT1VUREVWICAoT1BFTkdMLCAgICAgICAgICAgb3BlbmdsKTsKLSAgICBSRUdJU1RFUl9JTk9VVERFVihPU1MsICAgICAgICAgICAgICBvc3MpOwotICAgIFJFR0lTVEVSX0lOT1VUREVWKFBVTFNFLCAgICAgICAgICAgIHB1bHNlKTsKLSAgICBSRUdJU1RFUl9JTkRFViAgIChRVEtJVCwgICAgICAgICAgICBxdGtpdCk7Ci0gICAgUkVHSVNURVJfT1VUREVWICAoU0RMLCAgICAgICAgICAgICAgc2RsKTsKLSAgICBSRUdJU1RFUl9JTk9VVERFVihTTkRJTywgICAgICAgICAgICBzbmRpbyk7Ci0gICAgUkVHSVNURVJfSU5PVVRERVYoVjRMMiwgICAgICAgICAgICAgdjRsMik7Ci0vLyAgICBSRUdJU1RFUl9JTkRFViAgIChWNEwsICAgICAgICAgICAgICB2NGwKLSAgICBSRUdJU1RFUl9JTkRFViAgIChWRldDQVAsICAgICAgICAgICB2ZndjYXApOwotICAgIFJFR0lTVEVSX0lOREVWICAgKFgxMUdSQUIsICAgICAgICAgIHgxMWdyYWIpOwotICAgIFJFR0lTVEVSX0lOREVWICAgKFgxMUdSQUJfWENCLCAgICAgIHgxMWdyYWJfeGNiKTsKLSAgICBSRUdJU1RFUl9PVVRERVYgIChYViwgICAgICAgICAgICAgICB4dik7Ci0KLSAgICAvKiBleHRlcm5hbCBsaWJyYXJpZXMgKi8KLSAgICBSRUdJU1RFUl9JTkRFViAgIChMSUJDRElPLCAgICAgICAgICBsaWJjZGlvKTsKLSAgICBSRUdJU1RFUl9JTkRFViAgIChMSUJEQzEzOTQsICAgICAgICBsaWJkYzEzOTQpOworICAgIGF2cHJpdl9yZWdpc3Rlcl9kZXZpY2VzKG91dGRldl9saXN0LCBpbmRldl9saXN0KTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2Fsc2EuYyBiL2xpYmF2ZGV2aWNlL2Fsc2EuYwppbmRleCA3NWFjNDQ0Li4xYjIxYmViIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9hbHNhLmMKKysrIGIvbGliYXZkZXZpY2UvYWxzYS5jCkBAIC0xNzUsMTAgKzE3NSwxMCBAQAogICAgIHNuZF9wY21fdCAqaDsKICAgICBzbmRfcGNtX2h3X3BhcmFtc190ICpod19wYXJhbXM7CiAgICAgc25kX3BjbV91ZnJhbWVzX3QgYnVmZmVyX3NpemUsIHBlcmlvZF9zaXplOwotICAgIHVpbnQ2NF90IGxheW91dCA9IGN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0OworICAgIHVpbnQ2NF90IGxheW91dCA9IGN0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0OwogCi0gICAgaWYgKGN0eC0+ZmlsZW5hbWVbMF0gPT0gMCkgYXVkaW9fZGV2aWNlID0gImRlZmF1bHQiOwotICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZSA9IGN0eC0+ZmlsZW5hbWU7CisgICAgaWYgKGN0eC0+dXJsWzBdID09IDApIGF1ZGlvX2RldmljZSA9ICJkZWZhdWx0IjsKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlID0gY3R4LT51cmw7CiAKICAgICBpZiAoKmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCiAgICAgICAgICpjb2RlY19pZCA9IERFRkFVTFRfQ09ERUNfSUQ7CkBAIC0zMDAsNiArMzAwLDggQEAKIHsKICAgICBBbHNhRGF0YSAqcyA9IHMxLT5wcml2X2RhdGE7CiAKKyAgICBzbmRfcGNtX25vbmJsb2NrKHMtPmgsIDApOworICAgIHNuZF9wY21fZHJhaW4ocy0+aCk7CiAgICAgYXZfZnJlZXAoJnMtPnJlb3JkZXJfYnVmKTsKICAgICBpZiAoQ09ORklHX0FMU0FfSU5ERVYpCiAgICAgICAgIGZmX3RpbWVmaWx0ZXJfZGVzdHJveShzLT50aW1lZmlsdGVyKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2Fsc2EuaCBiL2xpYmF2ZGV2aWNlL2Fsc2EuaAppbmRleCBjZDQxZDk2Li4xZWQ4YzgyIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9hbHNhLmgKKysrIGIvbGliYXZkZXZpY2UvYWxzYS5oCkBAIC00Myw3ICs0Myw3IEBACiAKIHR5cGVkZWYgdm9pZCAoKmZmX3Jlb3JkZXJfZnVuYykoY29uc3Qgdm9pZCAqLCB2b2lkICosIGludCk7CiAKLSNkZWZpbmUgQUxTQV9CVUZGRVJfU0laRV9NQVggNjU1MzYKKyNkZWZpbmUgQUxTQV9CVUZGRVJfU0laRV9NQVggMTMxMDcyCiAKIHR5cGVkZWYgc3RydWN0IEFsc2FEYXRhIHsKICAgICBBVkNsYXNzICpjbGFzczsKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2Fsc2FfZGVjLmMgYi9saWJhdmRldmljZS9hbHNhX2RlYy5jCmluZGV4IDcxYTZlZjQuLmM1MGNlNzEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2Fsc2FfZGVjLmMKKysrIGIvbGliYXZkZXZpY2UvYWxzYV9kZWMuYwpAQCAtNzksMTEgKzc5LDExIEBACiAgICAgfQogCiAgICAgLyogdGFrZSByZWFsIHBhcmFtZXRlcnMgKi8KLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBjb2RlY19pZDsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gcy0+c2FtcGxlX3JhdGU7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IHMtPmNoYW5uZWxzOwotICAgIHN0LT5jb2RlYy0+ZnJhbWVfc2l6ZSA9IHMtPmZyYW1lX3NpemU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gY29kZWNfaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBzLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmZyYW1lX3NpemUgPSBzLT5mcmFtZV9zaXplOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgIC8qIDY0IGJpdHMgcHRzIGluIHVzICovCiAgICAgLyogbWljcm9zZWNvbmRzIGluc3RlYWQgb2Ygc2Vjb25kcywgTUh6IGluc3RlYWQgb2YgSHogKi8KICAgICBzLT50aW1lZmlsdGVyID0gZmZfdGltZWZpbHRlcl9uZXcoMTAwMDAwMC4wIC8gcy0+c2FtcGxlX3JhdGUsCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9hbHNhX2VuYy5jIGIvbGliYXZkZXZpY2UvYWxzYV9lbmMuYwppbmRleCAxMDI4OWE5Li4wYmVmNjI1IDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9hbHNhX2VuYy5jCisrKyBiL2xpYmF2ZGV2aWNlL2Fsc2FfZW5jLmMKQEAgLTU1LDIwICs1NSwyMCBAQAogICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkOwogICAgIGludCByZXM7CiAKLSAgICBpZiAoczEtPm5iX3N0cmVhbXMgIT0gMSB8fCBzMS0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgaWYgKHMxLT5uYl9zdHJlYW1zICE9IDEgfHwgczEtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIk9ubHkgYSBzaW5nbGUgYXVkaW8gc3RyZWFtIGlzIHN1cHBvcnRlZC5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KICAgICBzdCA9IHMxLT5zdHJlYW1zWzBdOwogCi0gICAgc2FtcGxlX3JhdGUgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlOwotICAgIGNvZGVjX2lkICAgID0gc3QtPmNvZGVjLT5jb2RlY19pZDsKKyAgICBzYW1wbGVfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGU7CisgICAgY29kZWNfaWQgICAgPSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkOwogICAgIHJlcyA9IGZmX2Fsc2Ffb3BlbihzMSwgU05EX1BDTV9TVFJFQU1fUExBWUJBQ0ssICZzYW1wbGVfcmF0ZSwKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscywgJmNvZGVjX2lkKTsKLSAgICBpZiAoc2FtcGxlX3JhdGUgIT0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzLCAmY29kZWNfaWQpOworICAgIGlmIChzYW1wbGVfcmF0ZSAhPSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKSB7CiAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgInNhbXBsZSByYXRlICVkIG5vdCBhdmFpbGFibGUsIG5lYXJlc3QgaXMgJWRcbiIsCi0gICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlLCBzYW1wbGVfcmF0ZSk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNhbXBsZV9yYXRlKTsKQEAgLTEyNCwxMyArMTI0LDEzIEBACiAKICAgICAvKiBmZl9hbHNhX29wZW4oKSBzaG91bGQgaGF2ZSBhY2NlcHRlZCBvbmx5IHN1cHBvcnRlZCBmb3JtYXRzICovCiAgICAgaWYgKChmbGFncyAmIEFWX1dSSVRFX1VOQ09ERURfRlJBTUVfUVVFUlkpKQotICAgICAgICByZXR1cm4gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoczEtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPnNhbXBsZV9mbXQpID8KKyAgICAgICAgcmV0dXJuIGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKHMxLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjcGFyLT5mb3JtYXQpID8KICAgICAgICAgICAgICAgIEFWRVJST1IoRUlOVkFMKSA6IDA7CiAgICAgLyogc2V0IG9ubHkgdXNlZCBmaWVsZHMgKi8KICAgICBwa3QuZGF0YSAgICAgPSAoKmZyYW1lKS0+ZGF0YVswXTsKICAgICBwa3Quc2l6ZSAgICAgPSAoKmZyYW1lKS0+bmJfc2FtcGxlcyAqIHMtPmZyYW1lX3NpemU7CiAgICAgcGt0LmR0cyAgICAgID0gKCpmcmFtZSktPnBrdF9kdHM7Ci0gICAgcGt0LmR1cmF0aW9uID0gYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbigqZnJhbWUpOworICAgIHBrdC5kdXJhdGlvbiA9ICgqZnJhbWUpLT5wa3RfZHVyYXRpb247CiAgICAgcmV0dXJuIGF1ZGlvX3dyaXRlX3BhY2tldChzMSwgJnBrdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2FuZHJvaWRfY2FtZXJhLmMgYi9saWJhdmRldmljZS9hbmRyb2lkX2NhbWVyYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTU2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmRldmljZS9hbmRyb2lkX2NhbWVyYS5jCkBAIC0wLDAgKzEsODcxIEBACisvKgorICogQW5kcm9pZCBjYW1lcmEgaW5wdXQgZGV2aWNlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEZlbGl4IE1hdG91c2NoZWsKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2VSZWFkZXIuaD4KKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZG1lc3NhZ2UuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorCisjaW5jbHVkZSAidmVyc2lvbi5oIgorCisvKiBUaGlzIGltYWdlIGZvcm1hdCBpcyBhdmFpbGFibGUgb24gYWxsIEFuZHJvaWQgZGV2aWNlcworICogc3VwcG9ydGluZyB0aGUgQ2FtZXJhMiBBUEkgKi8KKyNkZWZpbmUgSU1BR0VfRk9STUFUX0FORFJPSUQgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OAorCisjZGVmaW5lIE1BWF9CVUZfQ09VTlQgMgorI2RlZmluZSBWSURFT19TVFJFQU1fSU5ERVggMAorI2RlZmluZSBWSURFT19USU1FQkFTRV9BTkRST0lEIDEwMDAwMDAwMDAKKworI2RlZmluZSBSRVRVUk5fQ0FTRSh4KSBjYXNlIHg6IHJldHVybiBBVl9TVFJJTkdJRlkoeCk7CisjZGVmaW5lIFJFVFVSTl9ERUZBVUxUKHgpIGRlZmF1bHQ6IHJldHVybiBBVl9TVFJJTkdJRlkoeCk7CisKK3R5cGVkZWYgc3RydWN0IEFuZHJvaWRDYW1lcmFDdHggeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgaW50IHJlcXVlc3RlZF93aWR0aDsKKyAgICBpbnQgcmVxdWVzdGVkX2hlaWdodDsKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKKyAgICBpbnQgY2FtZXJhX2luZGV4OworICAgIGludCBpbnB1dF9xdWV1ZV9zaXplOworCisgICAgdWludDhfdCBsZW5zX2ZhY2luZzsKKyAgICBpbnQzMl90IHNlbnNvcl9vcmllbnRhdGlvbjsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQzMl90IGZyYW1lcmF0ZV9yYW5nZVsyXTsKKyAgICBpbnQgaW1hZ2VfZm9ybWF0OworCisgICAgQUNhbWVyYU1hbmFnZXIgKmNhbWVyYV9tZ3I7CisgICAgY2hhciAqY2FtZXJhX2lkOworICAgIEFDYW1lcmFNZXRhZGF0YSAqY2FtZXJhX21ldGFkYXRhOworICAgIEFDYW1lcmFEZXZpY2UgKmNhbWVyYV9kZXY7CisgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBjYW1lcmFfc3RhdGVfY2FsbGJhY2tzOworICAgIEFJbWFnZVJlYWRlciAqaW1hZ2VfcmVhZGVyOworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIGltYWdlX2xpc3RlbmVyOworICAgIEFOYXRpdmVXaW5kb3cgKmltYWdlX3JlYWRlcl93aW5kb3c7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyICpjYXB0dXJlX3Nlc3Npb25fb3V0cHV0X2NvbnRhaW5lcjsKKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKmNhcHR1cmVfc2Vzc2lvbl9vdXRwdXQ7CisgICAgQUNhbWVyYU91dHB1dFRhcmdldCAqY2FtZXJhX291dHB1dF90YXJnZXQ7CisgICAgQUNhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlX3JlcXVlc3Q7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIGNhcHR1cmVfc2Vzc2lvbl9zdGF0ZV9jYWxsYmFja3M7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICpjYXB0dXJlX3Nlc3Npb247CisKKyAgICBBVlRocmVhZE1lc3NhZ2VRdWV1ZSAqaW5wdXRfcXVldWU7CisgICAgYXRvbWljX2ludCBleGl0OworICAgIGF0b21pY19pbnQgZ290X2ltYWdlX2Zvcm1hdDsKK30gQW5kcm9pZENhbWVyYUN0eDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNhbWVyYV9zdGF0dXNfc3RyaW5nKGNhbWVyYV9zdGF0dXNfdCB2YWwpCit7CisgICAgc3dpdGNoKHZhbCkgeworICAgICAgICBSRVRVUk5fQ0FTRShBQ0FNRVJBX09LKQorICAgICAgICBSRVRVUk5fQ0FTRShBQ0FNRVJBX0VSUk9SX1VOS05PV04pCisgICAgICAgIFJFVFVSTl9DQVNFKEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpCisgICAgICAgIFJFVFVSTl9DQVNFKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCkKKyAgICAgICAgUkVUVVJOX0NBU0UoQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWSkKKyAgICAgICAgUkVUVVJOX0NBU0UoQUNBTUVSQV9FUlJPUl9NRVRBREFUQV9OT1RfRk9VTkQpCisgICAgICAgIFJFVFVSTl9DQVNFKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSkKKyAgICAgICAgUkVUVVJOX0NBU0UoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSkKKyAgICAgICAgUkVUVVJOX0NBU0UoQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRCkKKyAgICAgICAgUkVUVVJOX0NBU0UoQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTikKKyAgICAgICAgUkVUVVJOX0NBU0UoQUNBTUVSQV9FUlJPUl9TVFJFQU1fQ09ORklHVVJFX0ZBSUwpCisgICAgICAgIFJFVFVSTl9DQVNFKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0lOX1VTRSkKKyAgICAgICAgUkVUVVJOX0NBU0UoQUNBTUVSQV9FUlJPUl9NQVhfQ0FNRVJBX0lOX1VTRSkKKyAgICAgICAgUkVUVVJOX0NBU0UoQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQUJMRUQpCisgICAgICAgIFJFVFVSTl9DQVNFKEFDQU1FUkFfRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQpCisgICAgICAgIFJFVFVSTl9ERUZBVUxUKEFDQU1FUkFfRVJST1JfVU5LTk9XTikKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptZWRpYV9zdGF0dXNfc3RyaW5nKG1lZGlhX3N0YXR1c190IHZhbCkKK3sKKyAgICBzd2l0Y2godmFsKSB7CisgICAgICAgIFJFVFVSTl9DQVNFKEFNRURJQV9PSykKKyAgICAgICAgUkVUVVJOX0NBU0UoQU1FRElBX0VSUk9SX1VOS05PV04pCisgICAgICAgIFJFVFVSTl9DQVNFKEFNRURJQV9FUlJPUl9NQUxGT1JNRUQpCisgICAgICAgIFJFVFVSTl9DQVNFKEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRCkKKyAgICAgICAgUkVUVVJOX0NBU0UoQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUKQorICAgICAgICBSRVRVUk5fQ0FTRShBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpCisgICAgICAgIFJFVFVSTl9DQVNFKEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTikKKyAgICAgICAgUkVUVVJOX0NBU0UoQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQpCisgICAgICAgIFJFVFVSTl9DQVNFKEFNRURJQV9EUk1fUkVTT1VSQ0VfQlVTWSkKKyAgICAgICAgUkVUVVJOX0NBU0UoQU1FRElBX0RSTV9ERVZJQ0VfUkVWT0tFRCkKKyAgICAgICAgUkVUVVJOX0NBU0UoQU1FRElBX0RSTV9TSE9SVF9CVUZGRVIpCisgICAgICAgIFJFVFVSTl9DQVNFKEFNRURJQV9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEKQorICAgICAgICBSRVRVUk5fQ0FTRShBTUVESUFfRFJNX1RBTVBFUl9ERVRFQ1RFRCkKKyAgICAgICAgUkVUVVJOX0NBU0UoQU1FRElBX0RSTV9WRVJJRllfRkFJTEVEKQorICAgICAgICBSRVRVUk5fQ0FTRShBTUVESUFfRFJNX05FRURfS0VZKQorICAgICAgICBSRVRVUk5fQ0FTRShBTUVESUFfRFJNX0xJQ0VOU0VfRVhQSVJFRCkKKyAgICAgICAgUkVUVVJOX0NBU0UoQU1FRElBX0lNR1JFQURFUl9OT19CVUZGRVJfQVZBSUxBQkxFKQorICAgICAgICBSRVRVUk5fQ0FTRShBTUVESUFfSU1HUkVBREVSX01BWF9JTUFHRVNfQUNRVUlSRUQpCisgICAgICAgIFJFVFVSTl9DQVNFKEFNRURJQV9JTUdSRUFERVJfQ0FOTk9UX0xPQ0tfSU1BR0UpCisgICAgICAgIFJFVFVSTl9DQVNFKEFNRURJQV9JTUdSRUFERVJfQ0FOTk9UX1VOTE9DS19JTUFHRSkKKyAgICAgICAgUkVUVVJOX0NBU0UoQU1FRElBX0lNR1JFQURFUl9JTUFHRV9OT1RfTE9DS0VEKQorICAgICAgICBSRVRVUk5fREVGQVVMVChBTUVESUFfRVJST1JfVU5LTk9XTikKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICplcnJvcl9zdGF0ZV9jYWxsYmFja19zdHJpbmcoaW50IHZhbCkKK3sKKyAgICBzd2l0Y2godmFsKSB7CisgICAgICAgIFJFVFVSTl9DQVNFKEVSUk9SX0NBTUVSQV9JTl9VU0UpCisgICAgICAgIFJFVFVSTl9DQVNFKEVSUk9SX01BWF9DQU1FUkFTX0lOX1VTRSkKKyAgICAgICAgUkVUVVJOX0NBU0UoRVJST1JfQ0FNRVJBX0RJU0FCTEVEKQorICAgICAgICBSRVRVUk5fQ0FTRShFUlJPUl9DQU1FUkFfREVWSUNFKQorICAgICAgICBSRVRVUk5fQ0FTRShFUlJPUl9DQU1FUkFfU0VSVklDRSkKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAiRVJST1JfQ0FNRVJBX1VOS05PV04iOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2FtZXJhX2Rldl9kaXNjb25uZWN0ZWQodm9pZCAqY29udGV4dCwgQUNhbWVyYURldmljZSAqZGV2aWNlKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZjdHggPSBjb250ZXh0OworICAgIEFuZHJvaWRDYW1lcmFDdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgYXRvbWljX3N0b3JlKCZjdHgtPmV4aXQsIDEpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2FtZXJhIHdpdGggaWQgJXMgZGlzY29ubmVjdGVkLlxuIiwKKyAgICAgICAgICAgQUNhbWVyYURldmljZV9nZXRJZChkZXZpY2UpKTsKK30KKworc3RhdGljIHZvaWQgY2FtZXJhX2Rldl9lcnJvcih2b2lkICpjb250ZXh0LCBBQ2FtZXJhRGV2aWNlICpkZXZpY2UsIGludCBlcnJvcikKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2Y3R4ID0gY29udGV4dDsKKyAgICBBbmRyb2lkQ2FtZXJhQ3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGF0b21pY19zdG9yZSgmY3R4LT5leGl0LCAxKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yICVzIG9uIGNhbWVyYSB3aXRoIGlkICVzLlxuIiwKKyAgICAgICAgICAgZXJyb3Jfc3RhdGVfY2FsbGJhY2tfc3RyaW5nKGVycm9yKSwgQUNhbWVyYURldmljZV9nZXRJZChkZXZpY2UpKTsKK30KKworc3RhdGljIGludCBvcGVuX2NhbWVyYShBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIEFuZHJvaWRDYW1lcmFDdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICBBQ2FtZXJhSWRMaXN0ICpjYW1lcmFfaWRzOworCisgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhSWRMaXN0KGN0eC0+Y2FtZXJhX21nciwgJmNhbWVyYV9pZHMpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgY2FtZXJhIGlkIGxpc3QsIGVycm9yOiAlcy5cbiIsCisgICAgICAgICAgICAgICBjYW1lcmFfc3RhdHVzX3N0cmluZyhyZXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgaWYgKGN0eC0+Y2FtZXJhX2luZGV4IDwgY2FtZXJhX2lkcy0+bnVtQ2FtZXJhcykgeworICAgICAgICBjdHgtPmNhbWVyYV9pZCA9IGF2X3N0cmR1cChjYW1lcmFfaWRzLT5jYW1lcmFJZHNbY3R4LT5jYW1lcmFfaW5kZXhdKTsKKyAgICAgICAgaWYgKCFjdHgtPmNhbWVyYV9pZCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBjYW1lcmFfaWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGNhbWVyYSB3aXRoIGluZGV4ICVkIGF2YWlsYWJsZS5cbiIsCisgICAgICAgICAgICAgICBjdHgtPmNhbWVyYV9pbmRleCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOWElPKTsKKyAgICB9CisKKyAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGVDYW1lcmFJZExpc3QoY2FtZXJhX2lkcyk7CisKKyAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY3R4LT5jYW1lcmFfbWdyLAorICAgICAgICAgICAgY3R4LT5jYW1lcmFfaWQsICZjdHgtPmNhbWVyYV9tZXRhZGF0YSk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgY2FtZXJhIHdpdGggaWQgJXMsIGVycm9yOiAlcy5cbiIsCisgICAgICAgICAgICAgICBjdHgtPmNhbWVyYV9pZCwgY2FtZXJhX3N0YXR1c19zdHJpbmcocmV0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGN0eC0+Y2FtZXJhX3N0YXRlX2NhbGxiYWNrcy5jb250ZXh0ID0gYXZjdHg7CisgICAgY3R4LT5jYW1lcmFfc3RhdGVfY2FsbGJhY2tzLm9uRGlzY29ubmVjdGVkID0gY2FtZXJhX2Rldl9kaXNjb25uZWN0ZWQ7CisgICAgY3R4LT5jYW1lcmFfc3RhdGVfY2FsbGJhY2tzLm9uRXJyb3IgPSBjYW1lcmFfZGV2X2Vycm9yOworCisgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYShjdHgtPmNhbWVyYV9tZ3IsIGN0eC0+Y2FtZXJhX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+Y2FtZXJhX3N0YXRlX2NhbGxiYWNrcywgJmN0eC0+Y2FtZXJhX2Rldik7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gY2FtZXJhIHdpdGggaWQgJXMsIGVycm9yOiAlcy5cbiIsCisgICAgICAgICAgICAgICBjdHgtPmNhbWVyYV9pZCwgY2FtZXJhX3N0YXR1c19zdHJpbmcocmV0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnZXRfc2Vuc29yX29yaWVudGF0aW9uKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgQW5kcm9pZENhbWVyYUN0eCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgbGVuc19mYWNpbmc7CisgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IHNlbnNvcl9vcmllbnRhdGlvbjsKKworICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KGN0eC0+Y2FtZXJhX21ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDQU1FUkFfTEVOU19GQUNJTkcsICZsZW5zX2ZhY2luZyk7CisgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoY3R4LT5jYW1lcmFfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfT1JJRU5UQVRJT04sICZzZW5zb3Jfb3JpZW50YXRpb24pOworCisgICAgY3R4LT5sZW5zX2ZhY2luZyA9IGxlbnNfZmFjaW5nLmRhdGEudThbMF07CisgICAgY3R4LT5zZW5zb3Jfb3JpZW50YXRpb24gPSBzZW5zb3Jfb3JpZW50YXRpb24uZGF0YS5pMzJbMF07Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoX3ZpZGVvX3NpemUoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBbmRyb2lkQ2FtZXJhQ3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBhdmFpbGFibGVfY29uZmlnczsKKyAgICBpbnQgZm91bmQgPSAwOworCisgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoY3R4LT5jYW1lcmFfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZhaWxhYmxlX2NvbmZpZ3MpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVfY29uZmlncy5jb3VudDsgaSsrKSB7CisgICAgICAgIGludDMyX3QgaW5wdXQgPSBhdmFpbGFibGVfY29uZmlncy5kYXRhLmkzMltpICogNCArIDNdOworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGF2YWlsYWJsZV9jb25maWdzLmRhdGEuaTMyW2kgKiA0ICsgMF07CisKKyAgICAgICAgaWYgKGlucHV0KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JtYXQgPT0gSU1BR0VfRk9STUFUX0FORFJPSUQpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVfY29uZmlncy5kYXRhLmkzMltpICogNCArIDFdOworICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBhdmFpbGFibGVfY29uZmlncy5kYXRhLmkzMltpICogNCArIDJdOworCisgICAgICAgICAgICAvL1NhbWUgcmF0aW8KKyAgICAgICAgICAgIGlmICgoY3R4LT5yZXF1ZXN0ZWRfd2lkdGggPT0gd2lkdGggJiYgY3R4LT5yZXF1ZXN0ZWRfaGVpZ2h0ID09IGhlaWdodCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGN0eC0+cmVxdWVzdGVkX3dpZHRoID09IGhlaWdodCAmJiBjdHgtPnJlcXVlc3RlZF9oZWlnaHQgPT0gd2lkdGgpKSB7CisgICAgICAgICAgICAgICAgY3R4LT53aWR0aCA9IHdpZHRoOworICAgICAgICAgICAgICAgIGN0eC0+aGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZm91bmQgfHwgY3R4LT53aWR0aCA9PSAwIHx8IGN0eC0+aGVpZ2h0ID09IDApIHsKKyAgICAgICAgY3R4LT53aWR0aCA9IGF2YWlsYWJsZV9jb25maWdzLmRhdGEuaTMyWzFdOworICAgICAgICBjdHgtPmhlaWdodCA9IGF2YWlsYWJsZV9jb25maWdzLmRhdGEuaTMyWzJdOworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiUmVxdWVzdGVkIHZpZGVvX3NpemUgJWR4JWQgbm90IGF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvICVkeCVkXG4iLAorICAgICAgICAgICAgICAgY3R4LT5yZXF1ZXN0ZWRfd2lkdGgsIGN0eC0+cmVxdWVzdGVkX2hlaWdodCwgY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQpOworICAgIH0KKworICAgIHJldHVybjsKK30KKworc3RhdGljIHZvaWQgbWF0Y2hfZnJhbWVyYXRlKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgQW5kcm9pZENhbWVyYUN0eCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgYXZhaWxhYmxlX2ZyYW1lcmF0ZXM7CisgICAgaW50IGZvdW5kID0gMDsKKyAgICBpbnQgY3VycmVudF9iZXN0X21hdGNoID0gLTE7CisgICAgaW50IHJlcXVlc3RlZF9mcmFtZXJhdGUgPSBhdl9xMmQoY3R4LT5mcmFtZXJhdGUpOworCisgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoY3R4LT5jYW1lcmFfbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZhaWxhYmxlX2ZyYW1lcmF0ZXMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdmFpbGFibGVfZnJhbWVyYXRlcy5jb3VudDsgaSsrKSB7CisgICAgICAgIGludDMyX3QgbWluID0gYXZhaWxhYmxlX2ZyYW1lcmF0ZXMuZGF0YS5pMzJbaSAqIDIgKyAwXTsKKyAgICAgICAgaW50MzJfdCBtYXggPSBhdmFpbGFibGVfZnJhbWVyYXRlcy5kYXRhLmkzMltpICogMiArIDFdOworCisgICAgICAgIGlmIChyZXF1ZXN0ZWRfZnJhbWVyYXRlID09IG1heCkgeworICAgICAgICAgICAgaWYgKG1pbiA9PSBtYXgpIHsKKyAgICAgICAgICAgICAgICBjdHgtPmZyYW1lcmF0ZV9yYW5nZVswXSA9IG1pbjsKKyAgICAgICAgICAgICAgICBjdHgtPmZyYW1lcmF0ZV9yYW5nZVsxXSA9IG1heDsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRfYmVzdF9tYXRjaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBjdXJyZW50X2Jlc3RfbWF0Y2hfbWluID0gYXZhaWxhYmxlX2ZyYW1lcmF0ZXMuZGF0YS5pMzJbY3VycmVudF9iZXN0X21hdGNoICogMiArIDBdOworICAgICAgICAgICAgICAgIGlmIChtaW4gPiBjdXJyZW50X2Jlc3RfbWF0Y2hfbWluKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYmVzdF9tYXRjaCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50X2Jlc3RfbWF0Y2ggPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZCkgeworICAgICAgICBpZiAoY3VycmVudF9iZXN0X21hdGNoID49IDApIHsKKyAgICAgICAgICAgIGN0eC0+ZnJhbWVyYXRlX3JhbmdlWzBdID0gYXZhaWxhYmxlX2ZyYW1lcmF0ZXMuZGF0YS5pMzJbY3VycmVudF9iZXN0X21hdGNoICogMiArIDBdOworICAgICAgICAgICAgY3R4LT5mcmFtZXJhdGVfcmFuZ2VbMV0gPSBhdmFpbGFibGVfZnJhbWVyYXRlcy5kYXRhLmkzMltjdXJyZW50X2Jlc3RfbWF0Y2ggKiAyICsgMV07CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN0eC0+ZnJhbWVyYXRlX3JhbmdlWzBdID0gYXZhaWxhYmxlX2ZyYW1lcmF0ZXMuZGF0YS5pMzJbMF07CisgICAgICAgICAgICBjdHgtPmZyYW1lcmF0ZV9yYW5nZVsxXSA9IGF2YWlsYWJsZV9mcmFtZXJhdGVzLmRhdGEuaTMyWzFdOworICAgICAgICB9CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICJSZXF1ZXN0ZWQgZnJhbWVyYXRlICVkIG5vdCBhdmFpbGFibGUsIGZhbGxpbmcgYmFjayB0byBtaW46ICVkIGFuZCBtYXg6ICVkIGZwc1xuIiwKKyAgICAgICAgICAgICAgIHJlcXVlc3RlZF9mcmFtZXJhdGUsIGN0eC0+ZnJhbWVyYXRlX3JhbmdlWzBdLCBjdHgtPmZyYW1lcmF0ZV9yYW5nZVsxXSk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGdldF9pbWFnZV9mb3JtYXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQUltYWdlICppbWFnZSkKK3sKKyAgICBBbmRyb2lkQ2FtZXJhQ3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludDMyX3QgaW1hZ2VfcGl4ZWxzdHJpZGVzWzJdOworICAgIHVpbnQ4X3QgKmltYWdlX3BsYW5lX2RhdGFbMl07CisgICAgaW50IHBsYW5lX2RhdGFfbGVuZ3RoWzJdOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgQUltYWdlX2dldFBsYW5lUGl4ZWxTdHJpZGUoaW1hZ2UsIGkgKyAxLCAmaW1hZ2VfcGl4ZWxzdHJpZGVzW2ldKTsKKyAgICAgICAgQUltYWdlX2dldFBsYW5lRGF0YShpbWFnZSwgaSArIDEsICZpbWFnZV9wbGFuZV9kYXRhW2ldLCAmcGxhbmVfZGF0YV9sZW5ndGhbaV0pOworICAgIH0KKworICAgIGlmIChpbWFnZV9waXhlbHN0cmlkZXNbMF0gIT0gaW1hZ2VfcGl4ZWxzdHJpZGVzWzFdKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlBpeGVsIHN0cmlkZXMgb2YgVSBhbmQgViBwbGFuZSBzaG91bGQgaGF2ZSBiZWVuIHRoZSBzYW1lLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHN3aXRjaCAoaW1hZ2VfcGl4ZWxzdHJpZGVzWzBdKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGN0eC0+aW1hZ2VfZm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChpbWFnZV9wbGFuZV9kYXRhWzBdIDwgaW1hZ2VfcGxhbmVfZGF0YVsxXSkgeworICAgICAgICAgICAgICAgIGN0eC0+aW1hZ2VfZm9ybWF0ID0gQVZfUElYX0ZNVF9OVjEyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjdHgtPmltYWdlX2Zvcm1hdCA9IEFWX1BJWF9GTVRfTlYyMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlVua25vd24gcGl4ZWwgc3RyaWRlICVkIG9mIFUgYW5kIFYgcGxhbmUsIGNhbm5vdCBkZXRlcm1pbmUgY2FtZXJhIGltYWdlIGZvcm1hdC5cbiIsCisgICAgICAgICAgICAgICAgICAgaW1hZ2VfcGl4ZWxzdHJpZGVzWzBdKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGltYWdlX2F2YWlsYWJsZSh2b2lkICpjb250ZXh0LCBBSW1hZ2VSZWFkZXIgKnJlYWRlcikKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2Y3R4ID0gY29udGV4dDsKKyAgICBBbmRyb2lkQ2FtZXJhQ3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIG1lZGlhX3N0YXR1c190IG1lZGlhX3N0YXR1czsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIEFJbWFnZSAqaW1hZ2U7CisgICAgaW50NjRfdCBpbWFnZV90aW1lc3RhbXA7CisgICAgaW50MzJfdCBpbWFnZV9saW5lc3RyaWRlc1s0XTsKKyAgICB1aW50OF90ICppbWFnZV9wbGFuZV9kYXRhWzRdOworICAgIGludCBwbGFuZV9kYXRhX2xlbmd0aFs0XTsKKworICAgIEFWUGFja2V0IHBrdDsKKyAgICBpbnQgcGt0X2J1ZmZlcl9zaXplID0gMDsKKworICAgIG1lZGlhX3N0YXR1cyA9IEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2UocmVhZGVyLCAmaW1hZ2UpOworICAgIGlmIChtZWRpYV9zdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIGlmIChtZWRpYV9zdGF0dXMgPT0gQU1FRElBX0lNR1JFQURFUl9OT19CVUZGRVJfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJBbiBpbWFnZSByZWFkZXIgZnJhbWUgd2FzIGRpc2NhcmRlZCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhY3F1aXJlIGxhdGVzdCBpbWFnZSBmcm9tIGltYWdlIHJlYWRlciwgZXJyb3I6ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICBtZWRpYV9zdGF0dXNfc3RyaW5nKG1lZGlhX3N0YXR1cykpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIC8vIFNpbGVudGx5IGRyb3AgZnJhbWVzIHdoZW4gZXhpdCBpcyBzZXQKKyAgICBpZiAoYXRvbWljX2xvYWQoJmN0eC0+ZXhpdCkpIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICAvLyBEZXRlcm1pbmUgYWN0dWFsIGltYWdlIGZvcm1hdAorICAgIGlmICghYXRvbWljX2xvYWQoJmN0eC0+Z290X2ltYWdlX2Zvcm1hdCkpIHsKKyAgICAgICAgcmV0ID0gZ2V0X2ltYWdlX2Zvcm1hdChhdmN0eCwgaW1hZ2UpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgaW1hZ2UgZm9ybWF0IG9mIGNhbWVyYS5cbiIpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF0b21pY19zdG9yZSgmY3R4LT5nb3RfaW1hZ2VfZm9ybWF0LCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdF9idWZmZXJfc2l6ZSA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShjdHgtPmltYWdlX2Zvcm1hdCwgY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQsIDMyKTsKKyAgICBBSW1hZ2VfZ2V0VGltZXN0YW1wKGltYWdlLCAmaW1hZ2VfdGltZXN0YW1wKTsKKworICAgIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZShpbWFnZSwgMCwgJmltYWdlX2xpbmVzdHJpZGVzWzBdKTsKKyAgICBBSW1hZ2VfZ2V0UGxhbmVEYXRhKGltYWdlLCAwLCAmaW1hZ2VfcGxhbmVfZGF0YVswXSwgJnBsYW5lX2RhdGFfbGVuZ3RoWzBdKTsKKworICAgIHN3aXRjaCAoY3R4LT5pbWFnZV9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgICAgICAgICBBSW1hZ2VfZ2V0UGxhbmVSb3dTdHJpZGUoaW1hZ2UsIDEsICZpbWFnZV9saW5lc3RyaWRlc1sxXSk7CisgICAgICAgICAgICBBSW1hZ2VfZ2V0UGxhbmVEYXRhKGltYWdlLCAxLCAmaW1hZ2VfcGxhbmVfZGF0YVsxXSwgJnBsYW5lX2RhdGFfbGVuZ3RoWzFdKTsKKyAgICAgICAgICAgIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZShpbWFnZSwgMiwgJmltYWdlX2xpbmVzdHJpZGVzWzJdKTsKKyAgICAgICAgICAgIEFJbWFnZV9nZXRQbGFuZURhdGEoaW1hZ2UsIDIsICZpbWFnZV9wbGFuZV9kYXRhWzJdLCAmcGxhbmVfZGF0YV9sZW5ndGhbMl0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICAgICAgQUltYWdlX2dldFBsYW5lUm93U3RyaWRlKGltYWdlLCAxLCAmaW1hZ2VfbGluZXN0cmlkZXNbMV0pOworICAgICAgICAgICAgQUltYWdlX2dldFBsYW5lRGF0YShpbWFnZSwgMSwgJmltYWdlX3BsYW5lX2RhdGFbMV0sICZwbGFuZV9kYXRhX2xlbmd0aFsxXSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX05WMjE6CisgICAgICAgICAgICBBSW1hZ2VfZ2V0UGxhbmVSb3dTdHJpZGUoaW1hZ2UsIDIsICZpbWFnZV9saW5lc3RyaWRlc1sxXSk7CisgICAgICAgICAgICBBSW1hZ2VfZ2V0UGxhbmVEYXRhKGltYWdlLCAyLCAmaW1hZ2VfcGxhbmVfZGF0YVsxXSwgJnBsYW5lX2RhdGFfbGVuZ3RoWzFdKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjYW1lcmEgaW1hZ2UgZm9ybWF0LlxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldCA9IGF2X25ld19wYWNrZXQoJnBrdCwgcGt0X2J1ZmZlcl9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIG5ldyBhdiBwYWNrZXQsIGVycm9yOiAlcy5cbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcGt0LnN0cmVhbV9pbmRleCA9IFZJREVPX1NUUkVBTV9JTkRFWDsKKyAgICBwa3QucHRzID0gaW1hZ2VfdGltZXN0YW1wOworICAgIGF2X2ltYWdlX2NvcHlfdG9fYnVmZmVyKHBrdC5kYXRhLCBwa3RfYnVmZmVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCAqKSBpbWFnZV9wbGFuZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2xpbmVzdHJpZGVzLCBjdHgtPmltYWdlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPndpZHRoLCBjdHgtPmhlaWdodCwgMzIpOworCisgICAgcmV0ID0gYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2VuZChjdHgtPmlucHV0X3F1ZXVlLCAmcGt0LCBBVl9USFJFQURfTUVTU0FHRV9OT05CTE9DSyk7CisKK2Vycm9yOgorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyBuZXcgaW1hZ2UsIGVycm9yOiAlcy5cbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9zZXRfZXJyX3JlY3YoY3R4LT5pbnB1dF9xdWV1ZSwgcmV0KTsKKyAgICAgICAgICAgIGF0b21pY19zdG9yZSgmY3R4LT5leGl0LCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIklucHV0IHF1ZXVlIHdhcyBmdWxsLCBkcm9wcGluZyBmcmFtZSwgY29uc2lkZXIgcmFpc2luZyB0aGUgaW5wdXRfcXVldWVfc2l6ZSBvcHRpb24gKGN1cnJlbnQgdmFsdWU6ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0X3F1ZXVlX3NpemUpOworICAgICAgICB9CisgICAgICAgIGlmIChwa3RfYnVmZmVyX3NpemUpIHsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFJbWFnZV9kZWxldGUoaW1hZ2UpOworCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGNyZWF0ZV9pbWFnZV9yZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBbmRyb2lkQ2FtZXJhQ3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIG1lZGlhX3N0YXR1c190IHJldDsKKworICAgIHJldCA9IEFJbWFnZVJlYWRlcl9uZXcoY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQsIElNQUdFX0ZPUk1BVF9BTkRST0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0JVRl9DT1VOVCwgJmN0eC0+aW1hZ2VfcmVhZGVyKTsKKyAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGltYWdlIHJlYWRlciwgZXJyb3I6ICVzLlxuIiwgbWVkaWFfc3RhdHVzX3N0cmluZyhyZXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgY3R4LT5pbWFnZV9saXN0ZW5lci5jb250ZXh0ID0gYXZjdHg7CisgICAgY3R4LT5pbWFnZV9saXN0ZW5lci5vbkltYWdlQXZhaWxhYmxlID0gaW1hZ2VfYXZhaWxhYmxlOworCisgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEltYWdlTGlzdGVuZXIoY3R4LT5pbWFnZV9yZWFkZXIsICZjdHgtPmltYWdlX2xpc3RlbmVyKTsKKyAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2V0IGltYWdlIGxpc3RlbmVyIG9uIGltYWdlIHJlYWRlciwgZXJyb3I6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c19zdHJpbmcocmV0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHJldCA9IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3coY3R4LT5pbWFnZV9yZWFkZXIsICZjdHgtPmltYWdlX3JlYWRlcl93aW5kb3cpOworICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgaW1hZ2UgcmVhZGVyIHdpbmRvdywgZXJyb3I6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c19zdHJpbmcocmV0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYXB0dXJlX3Nlc3Npb25fY2xvc2VkKHZvaWQgKmNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0lORk8sICJBbmRyb2lkIGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gd2FzIGNsb3NlZC5cbiIpOworfQorCitzdGF0aWMgdm9pZCBjYXB0dXJlX3Nlc3Npb25fcmVhZHkodm9pZCAqY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICpzZXNzaW9uKQoreworICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfSU5GTywgIkFuZHJvaWQgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBpcyByZWFkeS5cbiIpOworfQorCitzdGF0aWMgdm9pZCBjYXB0dXJlX3Nlc3Npb25fYWN0aXZlKHZvaWQgKmNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiAqc2Vzc2lvbikKK3sKKyAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0lORk8sICJBbmRyb2lkIGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gaXMgYWN0aXZlLlxuIik7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2NhcHR1cmVfc2Vzc2lvbihBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIEFuZHJvaWRDYW1lcmFDdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKworICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGUoJmN0eC0+Y2FwdHVyZV9zZXNzaW9uX291dHB1dF9jb250YWluZXIpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGNhcHR1cmUgc2Vzc2lvbiBvdXRwdXQgY29udGFpbmVyLCBlcnJvcjogJXMuXG4iLAorICAgICAgICAgICAgICAgY2FtZXJhX3N0YXR1c19zdHJpbmcocmV0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIEFOYXRpdmVXaW5kb3dfYWNxdWlyZShjdHgtPmltYWdlX3JlYWRlcl93aW5kb3cpOworCisgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZShjdHgtPmltYWdlX3JlYWRlcl93aW5kb3csICZjdHgtPmNhcHR1cmVfc2Vzc2lvbl9vdXRwdXQpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGNhcHR1cmUgc2Vzc2lvbiBjb250YWluZXIsIGVycm9yOiAlcy5cbiIsCisgICAgICAgICAgICAgICBjYW1lcmFfc3RhdHVzX3N0cmluZyhyZXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZChjdHgtPmNhcHR1cmVfc2Vzc2lvbl9vdXRwdXRfY29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5jYXB0dXJlX3Nlc3Npb25fb3V0cHV0KTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFkZCBvdXRwdXQgdG8gb3V0cHV0IGNvbnRhaW5lciwgZXJyb3I6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIGNhbWVyYV9zdGF0dXNfc3RyaW5nKHJldCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICByZXQgPSBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShjdHgtPmltYWdlX3JlYWRlcl93aW5kb3csICZjdHgtPmNhbWVyYV9vdXRwdXRfdGFyZ2V0KTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBjYW1lcmEgb3V0cHV0IHRhcmdldCwgZXJyb3I6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIGNhbWVyYV9zdGF0dXNfc3RyaW5nKHJldCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0KGN0eC0+Y2FtZXJhX2RldiwgVEVNUExBVEVfUkVDT1JELCAmY3R4LT5jYXB0dXJlX3JlcXVlc3QpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGNhcHR1cmUgcmVxdWVzdCwgZXJyb3I6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIGNhbWVyYV9zdGF0dXNfc3RyaW5nKHJldCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICByZXQgPSBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTMyKGN0eC0+Y2FwdHVyZV9yZXF1ZXN0LCBBQ0FNRVJBX0NPTlRST0xfQUVfVEFSR0VUX0ZQU19SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIGN0eC0+ZnJhbWVyYXRlX3JhbmdlKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCB0YXJnZXQgZnBzIHJhbmdlIGluIGNhcHR1cmUgcmVxdWVzdCwgZXJyb3I6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIGNhbWVyYV9zdGF0dXNfc3RyaW5nKHJldCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICByZXQgPSBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0KGN0eC0+Y2FwdHVyZV9yZXF1ZXN0LCBjdHgtPmNhbWVyYV9vdXRwdXRfdGFyZ2V0KTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGFkZCBjYXB0dXJlIHJlcXVlc3QgY2FwdHVyZSByZXF1ZXN0LCBlcnJvcjogJXMuXG4iLAorICAgICAgICAgICAgICAgY2FtZXJhX3N0YXR1c19zdHJpbmcocmV0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGN0eC0+Y2FwdHVyZV9zZXNzaW9uX3N0YXRlX2NhbGxiYWNrcy5jb250ZXh0ID0gYXZjdHg7CisgICAgY3R4LT5jYXB0dXJlX3Nlc3Npb25fc3RhdGVfY2FsbGJhY2tzLm9uQ2xvc2VkID0gY2FwdHVyZV9zZXNzaW9uX2Nsb3NlZDsKKyAgICBjdHgtPmNhcHR1cmVfc2Vzc2lvbl9zdGF0ZV9jYWxsYmFja3Mub25SZWFkeSA9IGNhcHR1cmVfc2Vzc2lvbl9yZWFkeTsKKyAgICBjdHgtPmNhcHR1cmVfc2Vzc2lvbl9zdGF0ZV9jYWxsYmFja3Mub25BY3RpdmUgPSBjYXB0dXJlX3Nlc3Npb25fYWN0aXZlOworCisgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbihjdHgtPmNhbWVyYV9kZXYsIGN0eC0+Y2FwdHVyZV9zZXNzaW9uX291dHB1dF9jb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5jYXB0dXJlX3Nlc3Npb25fc3RhdGVfY2FsbGJhY2tzLCAmY3R4LT5jYXB0dXJlX3Nlc3Npb24pOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIGNhcHR1cmUgc2Vzc2lvbiwgZXJyb3I6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIGNhbWVyYV9zdGF0dXNfc3RyaW5nKHJldCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICByZXQgPSBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc2V0UmVwZWF0aW5nUmVxdWVzdChjdHgtPmNhcHR1cmVfc2Vzc2lvbiwgTlVMTCwgMSwgJmN0eC0+Y2FwdHVyZV9yZXF1ZXN0LCBOVUxMKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNldCByZXBlYXRpbmcgcmVxdWVzdCBvbiBjYXB0dXJlIHNlc3Npb24sIGVycm9yOiAlcy5cbiIsCisgICAgICAgICAgICAgICBjYW1lcmFfc3RhdHVzX3N0cmluZyhyZXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9mb3JfaW1hZ2VfZm9ybWF0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgQW5kcm9pZENhbWVyYUN0eCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHdoaWxlICghYXRvbWljX2xvYWQoJmN0eC0+Z290X2ltYWdlX2Zvcm1hdCkgJiYgIWF0b21pY19sb2FkKCZjdHgtPmV4aXQpKSB7CisgICAgICAgIC8vV2FpdCB1bnRpbCBmaXJzdCBmcmFtZSBhcnJpdmVkIGFuZCBhY3R1YWwgaW1hZ2UgZm9ybWF0IHdhcyBkZXRlcm1pbmVkCisgICAgICAgIHVzbGVlcCgxMDAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gYXRvbWljX2xvYWQoJmN0eC0+Z290X2ltYWdlX2Zvcm1hdCk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2Rpc3BsYXlfbWF0cml4KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWU3RyZWFtICpzdCkKK3sKKyAgICBBbmRyb2lkQ2FtZXJhQ3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgKnNpZGVfZGF0YTsKKyAgICBpbnQzMl90IGRpc3BsYXlfbWF0cml4WzldOworCisgICAgYXZfZGlzcGxheV9yb3RhdGlvbl9zZXQoZGlzcGxheV9tYXRyaXgsIGN0eC0+c2Vuc29yX29yaWVudGF0aW9uKTsKKworICAgIGlmIChjdHgtPmxlbnNfZmFjaW5nID09IEFDQU1FUkFfTEVOU19GQUNJTkdfRlJPTlQpIHsKKyAgICAgICAgYXZfZGlzcGxheV9tYXRyaXhfZmxpcChkaXNwbGF5X21hdHJpeCwgMSwgMCk7CisgICAgfQorCisgICAgc2lkZV9kYXRhID0gYXZfc3RyZWFtX25ld19zaWRlX2RhdGEoc3QsCisgICAgICAgICAgICBBVl9QS1RfREFUQV9ESVNQTEFZTUFUUklYLCBzaXplb2YoZGlzcGxheV9tYXRyaXgpKTsKKworICAgIGlmICghc2lkZV9kYXRhKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgbWVtY3B5KHNpZGVfZGF0YSwgZGlzcGxheV9tYXRyaXgsIHNpemVvZihkaXNwbGF5X21hdHJpeCkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3ZpZGVvX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIEFuZHJvaWRDYW1lcmFDdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0OworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpjb2RlY3BhcjsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmN0eCwgTlVMTCk7CisgICAgaWYgKCFzdCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHN0LT5pZCA9IFZJREVPX1NUUkVBTV9JTkRFWDsKKyAgICBzdC0+YXZnX2ZyYW1lX3JhdGUgPSAoQVZSYXRpb25hbCkgeyBjdHgtPmZyYW1lcmF0ZV9yYW5nZVsxXSwgMSB9OworICAgIHN0LT5yX2ZyYW1lX3JhdGUgPSAoQVZSYXRpb25hbCkgeyBjdHgtPmZyYW1lcmF0ZV9yYW5nZVsxXSwgMSB9OworCisgICAgaWYgKCF3YWl0X2Zvcl9pbWFnZV9mb3JtYXQoYXZjdHgpKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGNvZGVjcGFyID0gc3QtPmNvZGVjcGFyOworICAgIGNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIGNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIGNvZGVjcGFyLT5mb3JtYXQgPSBjdHgtPmltYWdlX2Zvcm1hdDsKKyAgICBjb2RlY3Bhci0+d2lkdGggPSBjdHgtPndpZHRoOworICAgIGNvZGVjcGFyLT5oZWlnaHQgPSBjdHgtPmhlaWdodDsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBWSURFT19USU1FQkFTRV9BTkRST0lEKTsKKworICAgIHJldHVybiBhZGRfZGlzcGxheV9tYXRyaXgoYXZjdHgsIHN0KTsKK30KKworc3RhdGljIGludCBhbmRyb2lkX2NhbWVyYV9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgQW5kcm9pZENhbWVyYUN0eCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF0b21pY19zdG9yZSgmY3R4LT5leGl0LCAxKTsKKworICAgIGlmIChjdHgtPmNhcHR1cmVfc2Vzc2lvbikgeworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RvcFJlcGVhdGluZyhjdHgtPmNhcHR1cmVfc2Vzc2lvbik7CisgICAgICAgIC8vIEZvbGxvd2luZyB3YXJuaW5nIGlzIGVtaXR0ZWQsIGFmdGVyIGNhcHR1cmUgc2Vzc2lvbiBjbG9zZWQgY2FsbGJhY2sgaXMgcmVjZWl2ZWQ6CisgICAgICAgIC8vIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjogRGV2aWNlIGlzIGNsb3NlZCBidXQgc2Vzc2lvbiAwIGlzIG5vdCBub3RpZmllZAorICAgICAgICAvLyBTZWVtcyB0byBiZSBhIGJ1ZyBpbiBBbmRyb2lkLCB3ZSBjYW4gaWdub3JlIHRoaXMKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Nsb3NlKGN0eC0+Y2FwdHVyZV9zZXNzaW9uKTsKKyAgICAgICAgY3R4LT5jYXB0dXJlX3Nlc3Npb24gPSBOVUxMOworICAgIH0KKworICAgIGlmIChjdHgtPmNhcHR1cmVfcmVxdWVzdCkgeworICAgICAgICBBQ2FwdHVyZVJlcXVlc3RfcmVtb3ZlVGFyZ2V0KGN0eC0+Y2FwdHVyZV9yZXF1ZXN0LCBjdHgtPmNhbWVyYV9vdXRwdXRfdGFyZ2V0KTsKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0X2ZyZWUoY3R4LT5jYXB0dXJlX3JlcXVlc3QpOworICAgICAgICBjdHgtPmNhcHR1cmVfcmVxdWVzdCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGN0eC0+Y2FtZXJhX291dHB1dF90YXJnZXQpIHsKKyAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldF9mcmVlKGN0eC0+Y2FtZXJhX291dHB1dF90YXJnZXQpOworICAgICAgICBjdHgtPmNhbWVyYV9vdXRwdXRfdGFyZ2V0ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5jYXB0dXJlX3Nlc3Npb25fb3V0cHV0KSB7CisgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9yZW1vdmUoY3R4LT5jYXB0dXJlX3Nlc3Npb25fb3V0cHV0X2NvbnRhaW5lciwKKyAgICAgICAgICAgICAgICBjdHgtPmNhcHR1cmVfc2Vzc2lvbl9vdXRwdXQpOworICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShjdHgtPmNhcHR1cmVfc2Vzc2lvbl9vdXRwdXQpOworICAgICAgICBjdHgtPmNhcHR1cmVfc2Vzc2lvbl9vdXRwdXQgPSBOVUxMOworICAgIH0KKworICAgIGlmIChjdHgtPmltYWdlX3JlYWRlcl93aW5kb3cpIHsKKyAgICAgICAgQU5hdGl2ZVdpbmRvd19yZWxlYXNlKGN0eC0+aW1hZ2VfcmVhZGVyX3dpbmRvdyk7CisgICAgICAgIGN0eC0+aW1hZ2VfcmVhZGVyX3dpbmRvdyA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGN0eC0+Y2FwdHVyZV9zZXNzaW9uX291dHB1dF9jb250YWluZXIpIHsKKyAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWUoY3R4LT5jYXB0dXJlX3Nlc3Npb25fb3V0cHV0X2NvbnRhaW5lcik7CisgICAgICAgIGN0eC0+Y2FwdHVyZV9zZXNzaW9uX291dHB1dF9jb250YWluZXIgPSBOVUxMOworICAgIH0KKworICAgIGlmIChjdHgtPmNhbWVyYV9kZXYpIHsKKyAgICAgICAgQUNhbWVyYURldmljZV9jbG9zZShjdHgtPmNhbWVyYV9kZXYpOworICAgICAgICBjdHgtPmNhbWVyYV9kZXYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChjdHgtPmltYWdlX3JlYWRlcikgeworICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKGN0eC0+aW1hZ2VfcmVhZGVyKTsKKyAgICAgICAgY3R4LT5pbWFnZV9yZWFkZXIgPSBOVUxMOworICAgIH0KKworICAgIGlmIChjdHgtPmNhbWVyYV9tZXRhZGF0YSkgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShjdHgtPmNhbWVyYV9tZXRhZGF0YSk7CisgICAgICAgIGN0eC0+Y2FtZXJhX21ldGFkYXRhID0gTlVMTDsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmY3R4LT5jYW1lcmFfaWQpOworCisgICAgaWYgKGN0eC0+Y2FtZXJhX21ncikgeworICAgICAgICBBQ2FtZXJhTWFuYWdlcl9kZWxldGUoY3R4LT5jYW1lcmFfbWdyKTsKKyAgICAgICAgY3R4LT5jYW1lcmFfbWdyID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5pbnB1dF9xdWV1ZSkgeworICAgICAgICBBVlBhY2tldCBwa3Q7CisgICAgICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfc2VuZChjdHgtPmlucHV0X3F1ZXVlLCBBVkVSUk9SX0VPRik7CisgICAgICAgIHdoaWxlIChhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9yZWN2KGN0eC0+aW5wdXRfcXVldWUsICZwa3QsIEFWX1RIUkVBRF9NRVNTQUdFX05PTkJMT0NLKSA+PSAwKSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgICAgIH0KKyAgICAgICAgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfZnJlZSgmY3R4LT5pbnB1dF9xdWV1ZSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW5kcm9pZF9jYW1lcmFfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBbmRyb2lkQ2FtZXJhQ3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBhdG9taWNfaW5pdCgmY3R4LT5nb3RfaW1hZ2VfZm9ybWF0LCAwKTsKKyAgICBhdG9taWNfaW5pdCgmY3R4LT5leGl0LCAwKTsKKworICAgIHJldCA9IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2FsbG9jKCZjdHgtPmlucHV0X3F1ZXVlLCBjdHgtPmlucHV0X3F1ZXVlX3NpemUsIHNpemVvZihBVlBhY2tldCkpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbnB1dCBxdWV1ZSwgZXJyb3I6ICVzLlxuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBjdHgtPmNhbWVyYV9tZ3IgPSBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKTsKKyAgICBpZiAoIWN0eC0+Y2FtZXJhX21ncikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgQW5kcm9pZCBjYW1lcmEgbWFuYWdlci5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldCA9IG9wZW5fY2FtZXJhKGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIGNhbWVyYS5cbiIpOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIGdldF9zZW5zb3Jfb3JpZW50YXRpb24oYXZjdHgpOworICAgIG1hdGNoX3ZpZGVvX3NpemUoYXZjdHgpOworICAgIG1hdGNoX2ZyYW1lcmF0ZShhdmN0eCk7CisKKyAgICByZXQgPSBjcmVhdGVfaW1hZ2VfcmVhZGVyKGF2Y3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKworICAgIHJldCA9IGNyZWF0ZV9jYXB0dXJlX3Nlc3Npb24oYXZjdHgpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0ID0gYWRkX3ZpZGVvX3N0cmVhbShhdmN0eCk7CisKK2Vycm9yOgorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGFuZHJvaWRfY2FtZXJhX3JlYWRfY2xvc2UoYXZjdHgpOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIGFuZHJvaWRfY2FtZXJhLlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbmRyb2lkX2NhbWVyYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIEFuZHJvaWRDYW1lcmFDdHggKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICghYXRvbWljX2xvYWQoJmN0eC0+ZXhpdCkpIHsKKyAgICAgICAgcmV0ID0gYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfcmVjdihjdHgtPmlucHV0X3F1ZXVlLCBwa3QsCisgICAgICAgICAgICAgICAgYXZjdHgtPmZsYWdzICYgQVZGTVRfRkxBR19OT05CTE9DSyA/IEFWX1RIUkVBRF9NRVNTQUdFX05PTkJMT0NLIDogMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGt0LT5zaXplOworICAgIH0KK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQW5kcm9pZENhbWVyYUN0eCwgeCkKKyNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInZpZGVvX3NpemUiLCAic2V0IHZpZGVvIHNpemUgZ2l2ZW4gYXMgYSBzdHJpbmcgc3VjaCBhcyA2NDB4NDgwIG9yIGhkNzIwIiwgT0ZGU0VUKHJlcXVlc3RlZF93aWR0aCksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gTlVMTH0sIDAsIDAsIERFQyB9LAorICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgdmlkZW8gZnJhbWUgcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIzMCJ9LCAwLCBJTlRfTUFYLCBERUMgfSwKKyAgICB7ICJjYW1lcmFfaW5kZXgiLCAic2V0IGluZGV4IG9mIGNhbWVyYSB0byB1c2UiLCBPRkZTRVQoY2FtZXJhX2luZGV4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBERUMgfSwKKyAgICB7ICJpbnB1dF9xdWV1ZV9zaXplIiwgInNldCBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgdG8gYnVmZmVyIiwgT0ZGU0VUKGlucHV0X3F1ZXVlX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNX0sIDAsIElOVF9NQVgsIERFQyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgYW5kcm9pZF9jYW1lcmFfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiYW5kcm9pZF9jYW1lcmEgaW5kZXYiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9hbmRyb2lkX2NhbWVyYV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhbmRyb2lkX2NhbWVyYSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFuZHJvaWQgY2FtZXJhIGlucHV0IGRldmljZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBbmRyb2lkQ2FtZXJhQ3R4KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhbmRyb2lkX2NhbWVyYV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhbmRyb2lkX2NhbWVyYV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSBhbmRyb2lkX2NhbWVyYV9yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmYW5kcm9pZF9jYW1lcmFfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvYXZkZXZpY2UuYyBiL2xpYmF2ZGV2aWNlL2F2ZGV2aWNlLmMKaW5kZXggMDFjNDY5Mi4uNzJlMWI2NyAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvYXZkZXZpY2UuYworKysgYi9saWJhdmRldmljZS9hdmRldmljZS5jCkBAIC0xMzUsOSArMTM1LDkgQEAKIGludCBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBlbnVtIEFWRGV2VG9BcHBNZXNzYWdlVHlwZSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpCiB7Ci0gICAgaWYgKCFhdl9mb3JtYXRfZ2V0X2NvbnRyb2xfbWVzc2FnZV9jYihzKSkKKyAgICBpZiAoIXMtPmNvbnRyb2xfbWVzc2FnZV9jYikKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKLSAgICByZXR1cm4gYXZfZm9ybWF0X2dldF9jb250cm9sX21lc3NhZ2VfY2IocykocywgdHlwZSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICByZXR1cm4gcy0+Y29udHJvbF9tZXNzYWdlX2NiKHMsIHR5cGUsIGRhdGEsIGRhdGFfc2l6ZSk7CiB9CiAKIGludCBhdmRldmljZV9jYXBhYmlsaXRpZXNfY3JlYXRlKEFWRGV2aWNlQ2FwYWJpbGl0aWVzUXVlcnkgKipjYXBzLCBBVkZvcm1hdENvbnRleHQgKnMsCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9hdmRldmljZS5oIGIvbGliYXZkZXZpY2UvYXZkZXZpY2UuaAppbmRleCA2YjA0NDZjLi5lZTk0NjI0IDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9hdmRldmljZS5oCisrKyBiL2xpYmF2ZGV2aWNlL2F2ZGV2aWNlLmgKQEAgLTI4LDE5ICsyOCwyMSBAQAogICovCiAKIC8qKgotICogQGRlZmdyb3VwIGxhdmQgU3BlY2lhbCBkZXZpY2VzIG11eGluZy9kZW11eGluZyBsaWJyYXJ5Ci0gKiBAeworICogQGRlZmdyb3VwIGxhdmQgbGliYXZkZXZpY2UKKyAqIFNwZWNpYWwgZGV2aWNlcyBtdXhpbmcvZGVtdXhpbmcgbGlicmFyeS4KKyAqCiAgKiBMaWJhdmRldmljZSBpcyBhIGNvbXBsZW1lbnRhcnkgbGlicmFyeSB0byBAcmVmIGxpYmF2ZiAibGliYXZmb3JtYXQiLiBJdAogICogcHJvdmlkZXMgdmFyaW91cyAic3BlY2lhbCIgcGxhdGZvcm0tc3BlY2lmaWMgbXV4ZXJzIGFuZCBkZW11eGVycywgZS5nLiBmb3IKICAqIGdyYWJiaW5nIGRldmljZXMsIGF1ZGlvIGNhcHR1cmUgYW5kIHBsYXliYWNrIGV0Yy4gQXMgYSBjb25zZXF1ZW5jZSwgdGhlCiAgKiAoZGUpbXV4ZXJzIGluIGxpYmF2ZGV2aWNlIGFyZSBvZiB0aGUgQVZGTVRfTk9GSUxFIHR5cGUgKHRoZXkgdXNlIHRoZWlyIG93bgogICogSS9PIGZ1bmN0aW9ucykuIFRoZSBmaWxlbmFtZSBwYXNzZWQgdG8gYXZmb3JtYXRfb3Blbl9pbnB1dCgpIG9mdGVuIGRvZXMgbm90CiAgKiByZWZlciB0byBhbiBhY3R1YWxseSBleGlzdGluZyBmaWxlLCBidXQgaGFzIHNvbWUgc3BlY2lhbCBkZXZpY2Utc3BlY2lmaWMKLSAqIG1lYW5pbmcgLSBlLmcuIGZvciB4MTFncmFiIGl0IGlzIHRoZSBkaXNwbGF5IG5hbWUuCisgKiBtZWFuaW5nIC0gZS5nLiBmb3IgeGNiZ3JhYiBpdCBpcyB0aGUgZGlzcGxheSBuYW1lLgogICoKICAqIFRvIHVzZSBsaWJhdmRldmljZSwgc2ltcGx5IGNhbGwgYXZkZXZpY2VfcmVnaXN0ZXJfYWxsKCkgdG8gcmVnaXN0ZXIgYWxsCiAgKiBjb21waWxlZCBtdXhlcnMgYW5kIGRlbXV4ZXJzLiBUaGV5IGFsbCB1c2Ugc3RhbmRhcmQgbGliYXZmb3JtYXQgQVBJLgotICogQH0KKyAqCisgKiBAewogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCkBAIC02NSw3ICs2Nyw2IEBACiAKIC8qKgogICogSW5pdGlhbGl6ZSBsaWJhdmRldmljZSBhbmQgcmVnaXN0ZXIgYWxsIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMuCi0gKiBAd2FybmluZyBUaGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4KICAqLwogdm9pZCBhdmRldmljZV9yZWdpc3Rlcl9hbGwodm9pZCk7CiAKQEAgLTUwNiw0ICs1MDcsOCBAQAogaW50IGF2ZGV2aWNlX2xpc3Rfb3V0cHV0X3NpbmtzKHN0cnVjdCBBVk91dHB1dEZvcm1hdCAqZGV2aWNlLCBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKmRldmljZV9vcHRpb25zLCBBVkRldmljZUluZm9MaXN0ICoqZGV2aWNlX2xpc3QpOwogCisvKioKKyAqIEB9CisgKi8KKwogI2VuZGlmIC8qIEFWREVWSUNFX0FWREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2F2Zm91bmRhdGlvbi5tIGIvbGliYXZkZXZpY2UvYXZmb3VuZGF0aW9uLm0KaW5kZXggNzYzZTY3NS4uYTU0MGY2YSAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvYXZmb3VuZGF0aW9uLm0KKysrIGIvbGliYXZkZXZpY2UvYXZmb3VuZGF0aW9uLm0KQEAgLTI1OSw3ICsyNTksNyBAQAogc3RhdGljIHZvaWQgcGFyc2VfZGV2aWNlX25hbWUoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIEFWRkNvbnRleHQgKmN0eCA9IChBVkZDb250ZXh0KilzLT5wcml2X2RhdGE7Ci0gICAgY2hhciAqdG1wID0gYXZfc3RyZHVwKHMtPmZpbGVuYW1lKTsKKyAgICBjaGFyICp0bXAgPSBhdl9zdHJkdXAocy0+dXJsKTsKICAgICBjaGFyICpzYXZlOwogCiAgICAgaWYgKHRtcFswXSAhPSAnOicpIHsKQEAgLTU2MCwxMSArNTYwLDExIEBACiAgICAgaW1hZ2VfYnVmZmVyICAgICAgPSBDTVNhbXBsZUJ1ZmZlckdldEltYWdlQnVmZmVyKGN0eC0+Y3VycmVudF9mcmFtZSk7CiAgICAgaW1hZ2VfYnVmZmVyX3NpemUgPSBDVkltYWdlQnVmZmVyR2V0RW5jb2RlZFNpemUoaW1hZ2VfYnVmZmVyKTsKIAotICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKLSAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0cmVhbS0+Y29kZWMtPndpZHRoICAgICAgPSAoaW50KWltYWdlX2J1ZmZlcl9zaXplLndpZHRoOwotICAgIHN0cmVhbS0+Y29kZWMtPmhlaWdodCAgICAgPSAoaW50KWltYWdlX2J1ZmZlcl9zaXplLmhlaWdodDsKLSAgICBzdHJlYW0tPmNvZGVjLT5waXhfZm10ICAgID0gY3R4LT5waXhlbF9mb3JtYXQ7CisgICAgc3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3RyZWFtLT5jb2RlY3Bhci0+d2lkdGggICAgICA9IChpbnQpaW1hZ2VfYnVmZmVyX3NpemUud2lkdGg7CisgICAgc3RyZWFtLT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IChpbnQpaW1hZ2VfYnVmZmVyX3NpemUuaGVpZ2h0OworICAgIHN0cmVhbS0+Y29kZWNwYXItPmZvcm1hdCAgICAgPSBjdHgtPnBpeGVsX2Zvcm1hdDsKIAogICAgIENGUmVsZWFzZShjdHgtPmN1cnJlbnRfZnJhbWUpOwogICAgIGN0eC0+Y3VycmVudF9mcmFtZSA9IG5pbDsKQEAgLTYwMywxMCArNjAzLDEwIEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0cmVhbS0+Y29kZWMtPnNhbXBsZV9yYXRlICAgID0gYmFzaWNfZGVzYy0+bVNhbXBsZVJhdGU7Ci0gICAgc3RyZWFtLT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSBiYXNpY19kZXNjLT5tQ2hhbm5lbHNQZXJGcmFtZTsKLSAgICBzdHJlYW0tPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IGF2X2dldF9kZWZhdWx0X2NoYW5uZWxfbGF5b3V0KHN0cmVhbS0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICBzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdHJlYW0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICA9IGJhc2ljX2Rlc2MtPm1TYW1wbGVSYXRlOworICAgIHN0cmVhbS0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gYmFzaWNfZGVzYy0+bUNoYW5uZWxzUGVyRnJhbWU7CisgICAgc3RyZWFtLT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChzdHJlYW0tPmNvZGVjcGFyLT5jaGFubmVscyk7CiAKICAgICBjdHgtPmF1ZGlvX2NoYW5uZWxzICAgICAgICA9IGJhc2ljX2Rlc2MtPm1DaGFubmVsc1BlckZyYW1lOwogICAgIGN0eC0+YXVkaW9fYml0c19wZXJfc2FtcGxlID0gYmFzaWNfZGVzYy0+bUJpdHNQZXJDaGFubmVsOwpAQCAtNjIwLDIyICs2MjAsMjIgQEAKICAgICAgICAgY3R4LT5hdWRpb19mbG9hdCAmJgogICAgICAgICBjdHgtPmF1ZGlvX2JpdHNfcGVyX3NhbXBsZSA9PSAzMiAmJgogICAgICAgICBjdHgtPmF1ZGlvX3BhY2tlZCkgewotICAgICAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCA9IGN0eC0+YXVkaW9fYmUgPyBBVl9DT0RFQ19JRF9QQ01fRjMyQkUgOiBBVl9DT0RFQ19JRF9QQ01fRjMyTEU7CisgICAgICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX2lkID0gY3R4LT5hdWRpb19iZSA/IEFWX0NPREVDX0lEX1BDTV9GMzJCRSA6IEFWX0NPREVDX0lEX1BDTV9GMzJMRTsKICAgICB9IGVsc2UgaWYgKGJhc2ljX2Rlc2MtPm1Gb3JtYXRJRCA9PSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ00gJiYKICAgICAgICAgY3R4LT5hdWRpb19zaWduZWRfaW50ZWdlciAmJgogICAgICAgICBjdHgtPmF1ZGlvX2JpdHNfcGVyX3NhbXBsZSA9PSAxNiAmJgogICAgICAgICBjdHgtPmF1ZGlvX3BhY2tlZCkgewotICAgICAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCA9IGN0eC0+YXVkaW9fYmUgPyBBVl9DT0RFQ19JRF9QQ01fUzE2QkUgOiBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX2lkID0gY3R4LT5hdWRpb19iZSA/IEFWX0NPREVDX0lEX1BDTV9TMTZCRSA6IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKICAgICB9IGVsc2UgaWYgKGJhc2ljX2Rlc2MtPm1Gb3JtYXRJRCA9PSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ00gJiYKICAgICAgICAgY3R4LT5hdWRpb19zaWduZWRfaW50ZWdlciAmJgogICAgICAgICBjdHgtPmF1ZGlvX2JpdHNfcGVyX3NhbXBsZSA9PSAyNCAmJgogICAgICAgICBjdHgtPmF1ZGlvX3BhY2tlZCkgewotICAgICAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCA9IGN0eC0+YXVkaW9fYmUgPyBBVl9DT0RFQ19JRF9QQ01fUzI0QkUgOiBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7CisgICAgICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX2lkID0gY3R4LT5hdWRpb19iZSA/IEFWX0NPREVDX0lEX1BDTV9TMjRCRSA6IEFWX0NPREVDX0lEX1BDTV9TMjRMRTsKICAgICB9IGVsc2UgaWYgKGJhc2ljX2Rlc2MtPm1Gb3JtYXRJRCA9PSBrQXVkaW9Gb3JtYXRMaW5lYXJQQ00gJiYKICAgICAgICAgY3R4LT5hdWRpb19zaWduZWRfaW50ZWdlciAmJgogICAgICAgICBjdHgtPmF1ZGlvX2JpdHNfcGVyX3NhbXBsZSA9PSAzMiAmJgogICAgICAgICBjdHgtPmF1ZGlvX3BhY2tlZCkgewotICAgICAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCA9IGN0eC0+YXVkaW9fYmUgPyBBVl9DT0RFQ19JRF9QQ01fUzMyQkUgOiBBVl9DT0RFQ19JRF9QQ01fUzMyTEU7CisgICAgICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX2lkID0gY3R4LT5hdWRpb19iZSA/IEFWX0NPREVDX0lEX1BDTV9TMzJCRSA6IEFWX0NPREVDX0lEX1BDTV9TMzJMRTsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiYXVkaW8gZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICByZXR1cm4gMTsKQEAgLTEwMjEsNyArMTAyMSw3IEBACiAgICAgeyAidmlkZW9fZGV2aWNlX2luZGV4IiwgInNlbGVjdCB2aWRlbyBkZXZpY2UgYnkgaW5kZXggZm9yIGRldmljZXMgd2l0aCBzYW1lIG5hbWUgKHN0YXJ0cyBhdCAwKSIsIG9mZnNldG9mKEFWRkNvbnRleHQsIHZpZGVvX2RldmljZV9pbmRleCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAogICAgIHsgImF1ZGlvX2RldmljZV9pbmRleCIsICJzZWxlY3QgYXVkaW8gZGV2aWNlIGJ5IGluZGV4IGZvciBkZXZpY2VzIHdpdGggc2FtZSBuYW1lIChzdGFydHMgYXQgMCkiLCBvZmZzZXRvZihBVkZDb250ZXh0LCBhdWRpb19kZXZpY2VfaW5kZXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKICAgICB7ICJwaXhlbF9mb3JtYXQiLCAic2V0IHBpeGVsIGZvcm1hdCIsIG9mZnNldG9mKEFWRkNvbnRleHQsIHBpeGVsX2Zvcm1hdCksIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCwgey5pNjQgPSBBVl9QSVhfRk1UX1lVVjQyMFB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTX0sCi0gICAgeyAiZnJhbWVyYXRlIiwgInNldCBmcmFtZSByYXRlIiwgb2Zmc2V0b2YoQVZGQ29udGV4dCwgZnJhbWVyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAibnRzYyJ9LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgZnJhbWUgcmF0ZSIsIG9mZnNldG9mKEFWRkNvbnRleHQsIGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIm50c2MifSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKICAgICB7ICJ2aWRlb19zaXplIiwgInNldCB2aWRlbyBzaXplIiwgb2Zmc2V0b2YoQVZGQ29udGV4dCwgd2lkdGgpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAogICAgIHsgImNhcHR1cmVfY3Vyc29yIiwgImNhcHR1cmUgdGhlIHNjcmVlbiBjdXJzb3IiLCBvZmZzZXRvZihBVkZDb250ZXh0LCBjYXB0dXJlX2N1cnNvciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDEsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCiAgICAgeyAiY2FwdHVyZV9tb3VzZV9jbGlja3MiLCAiY2FwdHVyZSB0aGUgc2NyZWVuIG1vdXNlIGNsaWNrcyIsIG9mZnNldG9mKEFWRkNvbnRleHQsIGNhcHR1cmVfbW91c2VfY2xpY2tzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2JrdHIuYyBiL2xpYmF2ZGV2aWNlL2JrdHIuYwppbmRleCBjOGE4OTUzLi45OTNjYzE5IDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9ia3RyLmMKKysrIGIvbGliYXZkZXZpY2UvYmt0ci5jCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICBsb25nIGlvY3RsX2ZyZXF1ZW5jeTsKICAgICBjaGFyICphcmc7CiAgICAgaW50IGM7Ci0gICAgc3RydWN0IHNpZ2FjdGlvbiBhY3QgPSB7IHswfSB9LCBvbGQ7CisgICAgc3RydWN0IHNpZ2FjdGlvbiBhY3QsIG9sZDsKICAgICBpbnQgcmV0OwogICAgIGNoYXIgZXJyYnVmWzEyOF07CiAKQEAgLTEzNCw2ICsxMzQsNyBAQAogICAgICAgICAgICAgZnJlcXVlbmN5ID0gMC4wOwogICAgIH0KIAorICAgIG1lbXNldCgmYWN0LCAwLCBzaXplb2YoYWN0KSk7CiAgICAgc2lnZW1wdHlzZXQoJmFjdC5zYV9tYXNrKTsKICAgICBhY3Quc2FfaGFuZGxlciA9IGNhdGNoc2lnbmFsOwogICAgIHNpZ2FjdGlvbihTSUdVU1IxLCAmYWN0LCAmb2xkKTsKQEAgLTI4NiwxNiArMjg3LDE0IEBACiAKICAgICBzLT5wZXJfZnJhbWUgPSAoKHVpbnQ2NF90KTEwMDAwMDAgKiBmcmFtZXJhdGUuZGVuKSAvIGZyYW1lcmF0ZS5udW07CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKLSAgICBzdC0+Y29kZWMtPndpZHRoID0gcy0+d2lkdGg7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBzLT5oZWlnaHQ7Ci0gICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuID0gZnJhbWVyYXRlLm51bTsKLSAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0gPSBmcmFtZXJhdGUuZGVuOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IHMtPndpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gcy0+aGVpZ2h0OworICAgIHN0LT5hdmdfZnJhbWVfcmF0ZSA9IGZyYW1lcmF0ZTsKIAotCi0gICAgaWYgKGJrdHJfaW5pdChzMS0+ZmlsZW5hbWUsIHMtPndpZHRoLCBzLT5oZWlnaHQsIHMtPnN0YW5kYXJkLAorICAgIGlmIChia3RyX2luaXQoczEtPnVybCwgcy0+d2lkdGgsIHMtPmhlaWdodCwgcy0+c3RhbmRhcmQsCiAgICAgICAgICAgICAgICAgICAmcy0+dmlkZW9fZmQsICZzLT50dW5lcl9mZCwgLTEsIDAuMCkgPCAwKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKICAgICAgICAgZ290byBvdXQ7CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9jYWNhLmMgYi9saWJhdmRldmljZS9jYWNhLmMKaW5kZXggNzVhZGMzNS4uNDdkZTgyNCAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvY2FjYS5jCisrKyBiL2xpYmF2ZGV2aWNlL2NhY2EuYwpAQCAtOTIsNyArOTIsNyBAQAogewogICAgIENBQ0FDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwogICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07Ci0gICAgQVZDb2RlY0NvbnRleHQgKmVuY2N0eCA9IHN0LT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqZW5jY3R4ID0gc3QtPmNvZGVjcGFyOwogICAgIGludCByZXQsIGJwcDsKIAogICAgIGMtPmN0eCA9IHM7CkBAIC0xMjYsMTAgKzEyNiwxMCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIGlmIChlbmNjdHgtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9SR0IyNCkgeworICAgIGlmIChlbmNjdHgtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX1JHQjI0KSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ICclcycsIGNob29zZSByZ2IyNFxuIiwKLSAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoZW5jY3R4LT5waXhfZm10KSk7CisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGVuY2N0eC0+Zm9ybWF0KSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCkBAIC0xNDAsNyArMTQwLDcgQEAKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAotICAgIGJwcCA9IGF2X2dldF9iaXRzX3Blcl9waXhlbChhdl9waXhfZm10X2Rlc2NfZ2V0KGVuY2N0eC0+cGl4X2ZtdCkpOworICAgIGJwcCA9IGF2X2dldF9iaXRzX3Blcl9waXhlbChhdl9waXhfZm10X2Rlc2NfZ2V0KGVuY2N0eC0+Zm9ybWF0KSk7CiAgICAgYy0+ZGl0aGVyID0gY2FjYV9jcmVhdGVfZGl0aGVyKGJwcCwgZW5jY3R4LT53aWR0aCwgZW5jY3R4LT5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwcCAvIDggKiBlbmNjdHgtPndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBmZiwgMHgwMGZmMDAsIDB4ZmYwMDAwLCAwKTsKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgIH0KIAogICAgIGlmICghYy0+d2luZG93X3RpdGxlKQotICAgICAgICBjLT53aW5kb3dfdGl0bGUgPSBhdl9zdHJkdXAocy0+ZmlsZW5hbWUpOworICAgICAgICBjLT53aW5kb3dfdGl0bGUgPSBhdl9zdHJkdXAocy0+dXJsKTsKICAgICBjYWNhX3NldF9kaXNwbGF5X3RpdGxlKGMtPmRpc3BsYXksIGMtPndpbmRvd190aXRsZSk7CiAgICAgY2FjYV9zZXRfZGlzcGxheV90aW1lKGMtPmRpc3BsYXksIGF2X3Jlc2NhbGVfcSgxLCBzdC0+Y29kZWMtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvZGVja2xpbmtfY29tbW9uLmNwcCBiL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbi5jcHAKaW5kZXggYWM3OTY0Yy4uYjg4OTAzMyAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvZGVja2xpbmtfY29tbW9uLmNwcAorKysgYi9saWJhdmRldmljZS9kZWNrbGlua19jb21tb24uY3BwCkBAIC0xOSwyMCArMTksMzYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisvKiBJbmNsdWRlIGludGVybmFsLmggZmlyc3QgdG8gYXZvaWQgY29uZmxpY3QgYmV0d2VlbiB3aW5zb2NrLmggKHVzZWQgYnkKKyAqIERlY2tMaW5rIGhlYWRlcnMpIGFuZCB3aW5zb2NrMi5oICh1c2VkIGJ5IGxpYmF2Zm9ybWF0KSBpbiBNU1ZDKysgYnVpbGRzICovCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorfQorCiAjaW5jbHVkZSA8RGVja0xpbmtBUEkuaD4KICNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxEZWNrTGlua0FQSV9pLmM+CiAjZWxzZQotI2luY2x1ZGUgPERlY2tMaW5rQVBJRGlzcGF0Y2guY3BwPgorLyogVGhlIGZpbGUgcHJvdmlkZWQgYnkgdGhlIFNESyBpcyBrbm93biB0byBiZSBtaXNzaW5nIHByb3RvdHlwZXMsIHdoaWNoIGRvZXNuJ3QKKyAgIGNhdXNlIGlzc3VlcyB3aXRoIEdDQyBzaW5jZSB0aGUgd2FybmluZyBkb2Vzbid0IGFwcGx5IHRvIEMrKyBmaWxlcy4gIEhvd2V2ZXIKKyAgIENsYW5nIGRvZXMgY29tcGxhaW4gKGFuZCB3YXJuaW5ncyBhcmUgdHJlYXRlZCBhcyBlcnJvcnMpLCBzbyBzdXBwcmVzcyB0aGUKKyAgIHdhcm5pbmcganVzdCBmb3IgdGhpcyBvbmUgZmlsZSAqLworI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV21pc3NpbmctcHJvdG90eXBlcyIKICNlbmRpZgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorI2luY2x1ZGUgPERlY2tMaW5rQVBJRGlzcGF0Y2guY3BwPgorI2lmZGVmIF9fY2xhbmdfXworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorI2VuZGlmCisjZW5kaWYKIAogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKLSNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKyNpbmNsdWRlICJhdmRldmljZS5oIgogfQogCiAjaW5jbHVkZSAiZGVja2xpbmtfY29tbW9uLmgiCkBAIC03OSw3ICs5NSw3IEBACiB9CiAjZGVmaW5lIERFQ0tMSU5LX1NUUiAgICBjb25zdCBfX0NGU3RyaW5nICoKICNkZWZpbmUgREVDS0xJTktfU1RSRFVQIGR1cF9jZnN0cmluZ190b191dGY4Ci0jZGVmaW5lIERFQ0tMSU5LX0ZSRUUocykgZnJlZSgodm9pZCAqKSBzKQorI2RlZmluZSBERUNLTElOS19GUkVFKHMpIENGUmVsZWFzZShzKQogI2Vsc2UKICNkZWZpbmUgREVDS0xJTktfU1RSICAgIGNvbnN0IGNoYXIgKgogI2RlZmluZSBERUNLTElOS19TVFJEVVAgYXZfc3RyZHVwCkBAIC05OCwxMiArMTE0LDg5IEBACiAgICAgcmV0dXJuIGhyOwogfQogCitzdGF0aWMgaW50IGRlY2tsaW5rX3NlbGVjdF9pbnB1dChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBCTUREZWNrTGlua0NvbmZpZ3VyYXRpb25JRCBjZmdfaWQpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKilhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopY2N0eC0+Y3R4OworICAgIEJNRERlY2tMaW5rQXR0cmlidXRlSUQgYXR0cl9pZCA9IChjZmdfaWQgPT0gYm1kRGVja0xpbmtDb25maWdBdWRpb0lucHV0Q29ubmVjdGlvbikgPyBCTUREZWNrTGlua0F1ZGlvSW5wdXRDb25uZWN0aW9ucyA6IEJNRERlY2tMaW5rVmlkZW9JbnB1dENvbm5lY3Rpb25zOworICAgIGludDY0X3QgYm1kX2lucHV0ICAgICAgICAgICAgICA9IChjZmdfaWQgPT0gYm1kRGVja0xpbmtDb25maWdBdWRpb0lucHV0Q29ubmVjdGlvbikgPyAoaW50NjRfdCljdHgtPmF1ZGlvX2lucHV0IDogKGludDY0X3QpY3R4LT52aWRlb19pbnB1dDsKKyAgICBjb25zdCBjaGFyICp0eXBlX25hbWUgICAgICAgICAgPSAoY2ZnX2lkID09IGJtZERlY2tMaW5rQ29uZmlnQXVkaW9JbnB1dENvbm5lY3Rpb24pID8gImF1ZGlvIiA6ICJ2aWRlbyI7CisgICAgaW50NjRfdCBzdXBwb3J0ZWRfY29ubmVjdGlvbnMgPSAwOworICAgIEhSRVNVTFQgcmVzOworCisgICAgaWYgKGJtZF9pbnB1dCkgeworICAgICAgICByZXMgPSBjdHgtPmF0dHItPkdldEludChhdHRyX2lkLCAmc3VwcG9ydGVkX2Nvbm5lY3Rpb25zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBTX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBzdXBwb3J0ZWQgJXMgaW5wdXRzLlxuIiwgdHlwZV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICB9CisgICAgICAgIGlmICgoc3VwcG9ydGVkX2Nvbm5lY3Rpb25zICYgYm1kX2lucHV0KSAhPSBibWRfaW5wdXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgc2VsZWN0ZWQgJXMgaW5wdXQuXG4iLCB0eXBlX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBjdHgtPmNmZy0+U2V0SW50KGNmZ19pZCwgYm1kX2lucHV0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBTX09LKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZWxlY3QgJXMgaW5wdXQuXG4iLCB0eXBlX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERUNLTElOS19CT09MIGZpZWxkX29yZGVyX2VxKGVudW0gQVZGaWVsZE9yZGVyIGZpZWxkX29yZGVyLCBCTURGaWVsZERvbWluYW5jZSBibWRfZmllbGRfb3JkZXIpCit7CisgICAgaWYgKGZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1VOS05PV04pCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICgoZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVFQgfHwgZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVEIpICYmIGJtZF9maWVsZF9vcmRlciA9PSBibWRVcHBlckZpZWxkRmlyc3QpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmICgoZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQkIgfHwgZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQlQpICYmIGJtZF9maWVsZF9vcmRlciA9PSBibWRMb3dlckZpZWxkRmlyc3QpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChmaWVsZF9vcmRlciA9PSBBVl9GSUVMRF9QUk9HUkVTU0lWRSAmJiAoYm1kX2ZpZWxkX29yZGVyID09IGJtZFByb2dyZXNzaXZlRnJhbWUgfHwgYm1kX2ZpZWxkX29yZGVyID09IGJtZFByb2dyZXNzaXZlU2VnbWVudGVkRnJhbWUpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBmZl9kZWNrbGlua19zZXRfY29uZmlncyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tsaW5rX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKWNjdHgtPmN0eDsKKyAgICBIUkVTVUxUIHJlczsKKworICAgIGlmIChjdHgtPmR1cGxleF9tb2RlKSB7CisgICAgICAgIERFQ0tMSU5LX0JPT0wgZHVwbGV4X3N1cHBvcnRlZCA9IGZhbHNlOworCisgICAgICAgIGlmIChjdHgtPmF0dHItPkdldEZsYWcoQk1ERGVja0xpbmtTdXBwb3J0c0R1cGxleE1vZGVDb25maWd1cmF0aW9uLCAmZHVwbGV4X3N1cHBvcnRlZCkgIT0gU19PSykKKyAgICAgICAgICAgIGR1cGxleF9zdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAoZHVwbGV4X3N1cHBvcnRlZCkgeworICAgICAgICAgICAgcmVzID0gY3R4LT5jZmctPlNldEludChibWREZWNrTGlua0NvbmZpZ0R1cGxleE1vZGUsIGN0eC0+ZHVwbGV4X21vZGUgPT0gMiA/IGJtZER1cGxleE1vZGVGdWxsIDogYm1kRHVwbGV4TW9kZUhhbGYpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBTX09LKQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJTZXR0aW5nIGR1cGxleCBtb2RlIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJTdWNjZXNzZnVsbHkgc2V0IGR1cGxleCBtb2RlIHRvICVzIGR1cGxleC5cbiIsIGN0eC0+ZHVwbGV4X21vZGUgPT0gMiA/ICJmdWxsIiA6ICJoYWxmIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVW5hYmxlIHRvIHNldCBkdXBsZXggbW9kZSwgYmVjYXVzZSBpdCBpcyBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRpcmVjdGlvbiA9PSBESVJFQ1RJT05fSU4pIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgcmV0ID0gZGVja2xpbmtfc2VsZWN0X2lucHV0KGF2Y3R4LCBibWREZWNrTGlua0NvbmZpZ0F1ZGlvSW5wdXRDb25uZWN0aW9uKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSBkZWNrbGlua19zZWxlY3RfaW5wdXQoYXZjdHgsIGJtZERlY2tMaW5rQ29uZmlnVmlkZW9JbnB1dENvbm5lY3Rpb24pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBpbnQgZmZfZGVja2xpbmtfc2V0X2Zvcm1hdChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGJfbnVtLCBpbnQgdGJfZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZGaWVsZE9yZGVyIGZpZWxkX29yZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2tsaW5rX2RpcmVjdGlvbl90IGRpcmVjdGlvbiwgaW50IG51bSkKIHsKLSAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopYXZjdHgtPnByaXZfZGF0YTsKICAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKWNjdHgtPmN0eDsKICAgICBCTUREaXNwbGF5TW9kZVN1cHBvcnQgc3VwcG9ydDsKICAgICBJRGVja0xpbmtEaXNwbGF5TW9kZUl0ZXJhdG9yICppdGVybW9kZTsKQEAgLTExMSw2ICsyMDQsOSBAQAogICAgIGludCBpID0gMTsKICAgICBIUkVTVUxUIHJlczsKIAorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVHJ5aW5nIHRvIGZpbmQgbW9kZSBmb3IgZnJhbWUgc2l6ZSAlZHglZCwgZnJhbWUgdGltaW5nICVkLyVkLCBmaWVsZCBvcmRlciAlZCwgZGlyZWN0aW9uICVkLCBtb2RlIG51bWJlciAlZCwgZm9ybWF0IGNvZGUgJXNcbiIsCisgICAgICAgIHdpZHRoLCBoZWlnaHQsIHRiX251bSwgdGJfZGVuLCBmaWVsZF9vcmRlciwgZGlyZWN0aW9uLCBudW0sIChjY3R4LT5mb3JtYXRfY29kZSkgPyBjY3R4LT5mb3JtYXRfY29kZSA6ICIodW5zZXQpIik7CisKICAgICBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9JTikgewogICAgICAgICByZXMgPSBjdHgtPmRsaS0+R2V0RGlzcGxheU1vZGVJdGVyYXRvciAoJml0ZXJtb2RlKTsKICAgICB9IGVsc2UgewpAQCAtMTIyLDI5ICsyMTgsMzYgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAgICAgfQogCi0KLSAgICBpZiAodGJfbnVtID09IDEpIHsKLSAgICAgICAgdGJfbnVtICo9IDEwMDA7Ci0gICAgICAgIHRiX2RlbiAqPSAxMDAwOwotICAgIH0KKyAgICBjaGFyIGZvcm1hdF9idWZbXSA9ICIgICAgIjsKKyAgICBpZiAoY2N0eC0+Zm9ybWF0X2NvZGUpCisgICAgICAgIG1lbWNweShmb3JtYXRfYnVmLCBjY3R4LT5mb3JtYXRfY29kZSwgRkZNSU4oc3RybGVuKGNjdHgtPmZvcm1hdF9jb2RlKSwgc2l6ZW9mKGZvcm1hdF9idWYpKSk7CisgICAgQk1ERGlzcGxheU1vZGUgdGFyZ2V0X21vZGUgPSAoQk1ERGlzcGxheU1vZGUpQVZfUkIzMihmb3JtYXRfYnVmKTsKKyAgICBBVlJhdGlvbmFsIHRhcmdldF90YiA9IGF2X21ha2VfcSh0Yl9udW0sIHRiX2Rlbik7CiAgICAgY3R4LT5ibWRfbW9kZSA9IGJtZE1vZGVVbmtub3duOwogICAgIHdoaWxlICgoY3R4LT5ibWRfbW9kZSA9PSBibWRNb2RlVW5rbm93bikgJiYgaXRlcm1vZGUtPk5leHQoJm1vZGUpID09IFNfT0spIHsKICAgICAgICAgQk1EVGltZVZhbHVlIGJtZF90Yl9udW0sIGJtZF90Yl9kZW47CiAgICAgICAgIGludCBibWRfd2lkdGggID0gbW9kZS0+R2V0V2lkdGgoKTsKICAgICAgICAgaW50IGJtZF9oZWlnaHQgPSBtb2RlLT5HZXRIZWlnaHQoKTsKKyAgICAgICAgQk1ERGlzcGxheU1vZGUgYm1kX21vZGUgPSBtb2RlLT5HZXREaXNwbGF5TW9kZSgpOworICAgICAgICBCTURGaWVsZERvbWluYW5jZSBibWRfZmllbGRfZG9taW5hbmNlID0gbW9kZS0+R2V0RmllbGREb21pbmFuY2UoKTsKIAogICAgICAgICBtb2RlLT5HZXRGcmFtZVJhdGUoJmJtZF90Yl9udW0sICZibWRfdGJfZGVuKTsKKyAgICAgICAgQVZSYXRpb25hbCBtb2RlX3RiID0gYXZfbWFrZV9xKGJtZF90Yl9udW0sIGJtZF90Yl9kZW4pOwogCi0gICAgICAgIGlmICgoYm1kX3dpZHRoID09IHdpZHRoICYmIGJtZF9oZWlnaHQgPT0gaGVpZ2h0ICYmCi0gICAgICAgICAgICBibWRfdGJfbnVtID09IHRiX251bSAmJiBibWRfdGJfZGVuID09IHRiX2RlbikgfHwgaSA9PSBudW0pIHsKLSAgICAgICAgICAgIGN0eC0+Ym1kX21vZGUgICA9IG1vZGUtPkdldERpc3BsYXlNb2RlKCk7CisgICAgICAgIGlmICgoYm1kX3dpZHRoID09IHdpZHRoICYmCisgICAgICAgICAgICAgYm1kX2hlaWdodCA9PSBoZWlnaHQgJiYKKyAgICAgICAgICAgICAhYXZfY21wX3EobW9kZV90YiwgdGFyZ2V0X3RiKSAmJgorICAgICAgICAgICAgIGZpZWxkX29yZGVyX2VxKGZpZWxkX29yZGVyLCBibWRfZmllbGRfZG9taW5hbmNlKSkKKyAgICAgICAgICAgICB8fCBpID09IG51bQorICAgICAgICAgICAgIHx8IHRhcmdldF9tb2RlID09IGJtZF9tb2RlKSB7CisgICAgICAgICAgICBjdHgtPmJtZF9tb2RlICAgPSBibWRfbW9kZTsKICAgICAgICAgICAgIGN0eC0+Ym1kX3dpZHRoICA9IGJtZF93aWR0aDsKICAgICAgICAgICAgIGN0eC0+Ym1kX2hlaWdodCA9IGJtZF9oZWlnaHQ7CiAgICAgICAgICAgICBjdHgtPmJtZF90Yl9kZW4gPSBibWRfdGJfZGVuOwogICAgICAgICAgICAgY3R4LT5ibWRfdGJfbnVtID0gYm1kX3RiX251bTsKLSAgICAgICAgICAgIGN0eC0+Ym1kX2ZpZWxkX2RvbWluYW5jZSA9IG1vZGUtPkdldEZpZWxkRG9taW5hbmNlKCk7CisgICAgICAgICAgICBjdHgtPmJtZF9maWVsZF9kb21pbmFuY2UgPSBibWRfZmllbGRfZG9taW5hbmNlOwogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkZvdW5kIERlY2tsaW5rIG1vZGUgJWQgeCAlZCB3aXRoIHJhdGUgJS4yZiVzXG4iLAotICAgICAgICAgICAgICAgIGJtZF93aWR0aCwgYm1kX2hlaWdodCwgKGZsb2F0KWJtZF90Yl9kZW4vKGZsb2F0KWJtZF90Yl9udW0sCisgICAgICAgICAgICAgICAgYm1kX3dpZHRoLCBibWRfaGVpZ2h0LCAxL2F2X3EyZChtb2RlX3RiKSwKICAgICAgICAgICAgICAgICAoY3R4LT5ibWRfZmllbGRfZG9taW5hbmNlPT1ibWRMb3dlckZpZWxkRmlyc3QgfHwgY3R4LT5ibWRfZmllbGRfZG9taW5hbmNlPT1ibWRVcHBlckZpZWxkRmlyc3QpPyIoaSkiOiIiKTsKICAgICAgICAgfQogCkBAIC0xNTcsNyArMjYwLDcgQEAKICAgICBpZiAoY3R4LT5ibWRfbW9kZSA9PSBibWRNb2RlVW5rbm93bikKICAgICAgICAgcmV0dXJuIC0xOwogICAgIGlmIChkaXJlY3Rpb24gPT0gRElSRUNUSU9OX0lOKSB7Ci0gICAgICAgIGlmIChjdHgtPmRsaS0+RG9lc1N1cHBvcnRWaWRlb01vZGUoY3R4LT5ibWRfbW9kZSwgYm1kRm9ybWF0OEJpdFlVViwKKyAgICAgICAgaWYgKGN0eC0+ZGxpLT5Eb2VzU3VwcG9ydFZpZGVvTW9kZShjdHgtPmJtZF9tb2RlLCAoQk1EUGl4ZWxGb3JtYXQpIGNjdHgtPnJhd19mb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1kVmlkZW9PdXRwdXRGbGFnRGVmYXVsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3VwcG9ydCwgTlVMTCkgIT0gU19PSykKICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTE3NCwzOSArMjc3LDExNSBAQAogfQogCiBpbnQgZmZfZGVja2xpbmtfc2V0X2Zvcm1hdChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBkZWNrbGlua19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGludCBudW0pIHsKLSAgICByZXR1cm4gZmZfZGVja2xpbmtfc2V0X2Zvcm1hdChhdmN0eCwgMCwgMCwgMCwgMCwgZGlyZWN0aW9uLCBudW0pOworICAgIHJldHVybiBmZl9kZWNrbGlua19zZXRfZm9ybWF0KGF2Y3R4LCAwLCAwLCAwLCAwLCBBVl9GSUVMRF9VTktOT1dOLCBkaXJlY3Rpb24sIG51bSk7CiB9CiAKLWludCBmZl9kZWNrbGlua19saXN0X2RldmljZXMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK2ludCBmZl9kZWNrbGlua19saXN0X2RldmljZXMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hvd19pbnB1dHMsIGludCBzaG93X291dHB1dHMpCiB7CiAgICAgSURlY2tMaW5rICpkbCA9IE5VTEw7CiAgICAgSURlY2tMaW5rSXRlcmF0b3IgKml0ZXIgPSBDcmVhdGVEZWNrTGlua0l0ZXJhdG9ySW5zdGFuY2UoKTsKKyAgICBpbnQgcmV0ID0gMDsKKwogICAgIGlmICghaXRlcikgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgRGVja0xpbmsgaXRlcmF0b3JcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogICAgIH0KLSAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQmxhY2ttYWdpYyBEZWNrTGluayBkZXZpY2VzOlxuIik7Ci0gICAgd2hpbGUgKGl0ZXItPk5leHQoJmRsKSA9PSBTX09LKSB7CisKKyAgICB3aGlsZSAocmV0ID09IDAgJiYgaXRlci0+TmV4dCgmZGwpID09IFNfT0spIHsKKyAgICAgICAgSURlY2tMaW5rT3V0cHV0ICpvdXRwdXRfY29uZmlnOworICAgICAgICBJRGVja0xpbmtJbnB1dCAqaW5wdXRfY29uZmlnOwogICAgICAgICBjb25zdCBjaGFyICpkaXNwbGF5TmFtZTsKKyAgICAgICAgQVZEZXZpY2VJbmZvICpuZXdfZGV2aWNlID0gTlVMTDsKKyAgICAgICAgaW50IGFkZCA9IDA7CisKICAgICAgICAgZmZfZGVja2xpbmtfZ2V0X2Rpc3BsYXlfbmFtZShkbCwgJmRpc3BsYXlOYW1lKTsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIlx0JyVzJ1xuIiwgZGlzcGxheU5hbWUpOwotICAgICAgICBhdl9mcmVlKCh2b2lkICopIGRpc3BsYXlOYW1lKTsKKworICAgICAgICBpZiAoc2hvd19vdXRwdXRzKSB7CisgICAgICAgICAgICBpZiAoZGwtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGVja0xpbmtPdXRwdXQsICh2b2lkICoqKSZvdXRwdXRfY29uZmlnKSA9PSBTX09LKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0X2NvbmZpZy0+UmVsZWFzZSgpOworICAgICAgICAgICAgICAgIGFkZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2hvd19pbnB1dHMpIHsKKyAgICAgICAgICAgIGlmIChkbC0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEZWNrTGlua0lucHV0LCAodm9pZCAqKikmaW5wdXRfY29uZmlnKSA9PSBTX09LKSB7CisgICAgICAgICAgICAgICAgaW5wdXRfY29uZmlnLT5SZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgYWRkID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChhZGQgPT0gMSkgeworICAgICAgICAgICAgbmV3X2RldmljZSA9IChBVkRldmljZUluZm8gKikgYXZfbWFsbG9jeihzaXplb2YoQVZEZXZpY2VJbmZvKSk7CisgICAgICAgICAgICBpZiAoIW5ld19kZXZpY2UpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBuZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBuZXdfZGV2aWNlLT5kZXZpY2VfbmFtZSA9IGF2X3N0cmR1cChkaXNwbGF5TmFtZSk7CisgICAgICAgICAgICBuZXdfZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb24gPSBhdl9zdHJkdXAoZGlzcGxheU5hbWUpOworCisgICAgICAgICAgICBpZiAoIW5ld19kZXZpY2UtPmRldmljZV9uYW1lIHx8CisgICAgICAgICAgICAgICAgIW5ld19kZXZpY2UtPmRldmljZV9kZXNjcmlwdGlvbiB8fAorICAgICAgICAgICAgICAgIGF2X2R5bmFycmF5X2FkZF9ub2ZyZWUoJmRldmljZV9saXN0LT5kZXZpY2VzLCAmZGV2aWNlX2xpc3QtPm5iX2RldmljZXMsIG5ld19kZXZpY2UpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmbmV3X2RldmljZS0+ZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZuZXdfZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZuZXdfZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBnb3RvIG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIG5leHQ6CisgICAgICAgIGF2X2ZyZWVwKCZkaXNwbGF5TmFtZSk7CiAgICAgICAgIGRsLT5SZWxlYXNlKCk7CiAgICAgfQogICAgIGl0ZXItPlJlbGVhc2UoKTsKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgdGhlIGZmX2RlY2tsaW5rX2xpc3RfZGV2aWNlcygpIHdoaWNoIGR1bXBzIHRoZQorICAgb3V0cHV0IHRvIGF2X2xvZygpIGFuZCBleGl0cyAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUKKyAgICItbGlzdF9kZXZpY2VzIiBhcmd1bWVudCkuICovCit2b2lkIGZmX2RlY2tsaW5rX2xpc3RfZGV2aWNlc19sZWdhY3koQVZGb3JtYXRDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hvd19pbnB1dHMsIGludCBzaG93X291dHB1dHMpCit7CisgICAgc3RydWN0IEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZV9saXN0ID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgZGV2aWNlX2xpc3QgPSAoc3RydWN0IEFWRGV2aWNlSW5mb0xpc3QgKikgYXZfbWFsbG9jeihzaXplb2YoQVZEZXZpY2VJbmZvTGlzdCkpOworICAgIGlmICghZGV2aWNlX2xpc3QpCisgICAgICAgIHJldHVybjsKKworICAgIHJldCA9IGZmX2RlY2tsaW5rX2xpc3RfZGV2aWNlcyhhdmN0eCwgZGV2aWNlX2xpc3QsIHNob3dfaW5wdXRzLCBzaG93X291dHB1dHMpOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQmxhY2ttYWdpYyBEZWNrTGluayAlcyBkZXZpY2VzOlxuIiwKKyAgICAgICAgICAgICAgIHNob3dfaW5wdXRzID8gImlucHV0IiA6ICJvdXRwdXQiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXZpY2VfbGlzdC0+bmJfZGV2aWNlczsgaSsrKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiXHQnJXMnXG4iLCBkZXZpY2VfbGlzdC0+ZGV2aWNlc1tpXS0+ZGV2aWNlX25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIGF2ZGV2aWNlX2ZyZWVfbGlzdF9kZXZpY2VzKCZkZXZpY2VfbGlzdCk7CiB9CiAKIGludCBmZl9kZWNrbGlua19saXN0X2Zvcm1hdHMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgZGVja2xpbmtfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKQogewotICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKilhdmN0eC0+cHJpdl9kYXRhOwogICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopY2N0eC0+Y3R4OwogICAgIElEZWNrTGlua0Rpc3BsYXlNb2RlSXRlcmF0b3IgKml0ZXJtb2RlOwogICAgIElEZWNrTGlua0Rpc3BsYXlNb2RlICptb2RlOwotICAgIGludCBpPTA7CisgICAgdWludDMyX3QgZm9ybWF0X2NvZGU7CiAgICAgSFJFU1VMVCByZXM7CiAKICAgICBpZiAoZGlyZWN0aW9uID09IERJUkVDVElPTl9JTikgeworICAgICAgICBpbnQgcmV0OworICAgICAgICByZXQgPSBkZWNrbGlua19zZWxlY3RfaW5wdXQoYXZjdHgsIGJtZERlY2tMaW5rQ29uZmlnQXVkaW9JbnB1dENvbm5lY3Rpb24pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IGRlY2tsaW5rX3NlbGVjdF9pbnB1dChhdmN0eCwgYm1kRGVja0xpbmtDb25maWdWaWRlb0lucHV0Q29ubmVjdGlvbik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgcmVzID0gY3R4LT5kbGktPkdldERpc3BsYXlNb2RlSXRlcmF0b3IgKCZpdGVybW9kZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmVzID0gY3R4LT5kbG8tPkdldERpc3BsYXlNb2RlSXRlcmF0b3IgKCZpdGVybW9kZSk7CkBAIC0yMTcsMTMgKzM5NiwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKICAgICB9CiAKLSAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiU3VwcG9ydGVkIGZvcm1hdHMgZm9yICclcyc6XG4iLAotICAgICAgICAgICAgICAgYXZjdHgtPmZpbGVuYW1lKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiU3VwcG9ydGVkIGZvcm1hdHMgZm9yICclcyc6XG5cdGZvcm1hdF9jb2RlXHRkZXNjcmlwdGlvbiIsCisgICAgICAgICAgICAgICBhdmN0eC0+dXJsKTsKICAgICB3aGlsZSAoaXRlcm1vZGUtPk5leHQoJm1vZGUpID09IFNfT0spIHsKICAgICAgICAgQk1EVGltZVZhbHVlIHRiX251bSwgdGJfZGVuOwogICAgICAgICBtb2RlLT5HZXRGcmFtZVJhdGUoJnRiX251bSwgJnRiX2Rlbik7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJcdCVkXHQlbGR4JWxkIGF0ICVkLyVkIGZwcyIsCi0gICAgICAgICAgICAgICAgKytpLG1vZGUtPkdldFdpZHRoKCksIG1vZGUtPkdldEhlaWdodCgpLAorICAgICAgICBmb3JtYXRfY29kZSA9IGF2X2Jzd2FwMzIobW9kZS0+R2V0RGlzcGxheU1vZGUoKSk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJcblx0JS40c1x0XHQlbGR4JWxkIGF0ICVkLyVkIGZwcyIsCisgICAgICAgICAgICAgICAgKGNoYXIqKSAmZm9ybWF0X2NvZGUsIG1vZGUtPkdldFdpZHRoKCksIG1vZGUtPkdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgIChpbnQpIHRiX2RlbiwgKGludCkgdGJfbnVtKTsKICAgICAgICAgc3dpdGNoIChtb2RlLT5HZXRGaWVsZERvbWluYW5jZSgpKSB7CiAgICAgICAgIGNhc2UgYm1kTG93ZXJGaWVsZEZpcnN0OgpAQCAtMjMxLDExICs0MTEsNjkgQEAKICAgICAgICAgY2FzZSBibWRVcHBlckZpZWxkRmlyc3Q6CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICIgKGludGVybGFjZWQsIHVwcGVyIGZpZWxkIGZpcnN0KSIpOyBicmVhazsKICAgICAgICAgfQotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKICAgICAgICAgbW9kZS0+UmVsZWFzZSgpOwogICAgIH0KKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKIAogICAgIGl0ZXJtb2RlLT5SZWxlYXNlKCk7CiAKICAgICByZXR1cm4gMDsKIH0KKwordm9pZCBmZl9kZWNrbGlua19jbGVhbnVwKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKilhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopY2N0eC0+Y3R4OworCisgICAgaWYgKGN0eC0+ZGxpKQorICAgICAgICBjdHgtPmRsaS0+UmVsZWFzZSgpOworICAgIGlmIChjdHgtPmRsbykKKyAgICAgICAgY3R4LT5kbG8tPlJlbGVhc2UoKTsKKyAgICBpZiAoY3R4LT5hdHRyKQorICAgICAgICBjdHgtPmF0dHItPlJlbGVhc2UoKTsKKyAgICBpZiAoY3R4LT5jZmcpCisgICAgICAgIGN0eC0+Y2ZnLT5SZWxlYXNlKCk7CisgICAgaWYgKGN0eC0+ZGwpCisgICAgICAgIGN0eC0+ZGwtPlJlbGVhc2UoKTsKK30KKworaW50IGZmX2RlY2tsaW5rX2luaXRfZGV2aWNlKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIqIG5hbWUpCit7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKilhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopY2N0eC0+Y3R4OworICAgIElEZWNrTGluayAqZGwgPSBOVUxMOworICAgIElEZWNrTGlua0l0ZXJhdG9yICppdGVyID0gQ3JlYXRlRGVja0xpbmtJdGVyYXRvckluc3RhbmNlKCk7CisgICAgaWYgKCFpdGVyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSBEZWNrTGluayBpdGVyYXRvclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIHdoaWxlIChpdGVyLT5OZXh0KCZkbCkgPT0gU19PSykgeworICAgICAgICBjb25zdCBjaGFyICpkaXNwbGF5TmFtZTsKKyAgICAgICAgZmZfZGVja2xpbmtfZ2V0X2Rpc3BsYXlfbmFtZShkbCwgJmRpc3BsYXlOYW1lKTsKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgZGlzcGxheU5hbWUpKSB7CisgICAgICAgICAgICBhdl9mcmVlKCh2b2lkICopZGlzcGxheU5hbWUpOworICAgICAgICAgICAgY3R4LT5kbCA9IGRsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZSgodm9pZCAqKWRpc3BsYXlOYW1lKTsKKyAgICAgICAgZGwtPlJlbGVhc2UoKTsKKyAgICB9CisgICAgaXRlci0+UmVsZWFzZSgpOworICAgIGlmICghY3R4LT5kbCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5YSU8pOworCisgICAgaWYgKGN0eC0+ZGwtPlF1ZXJ5SW50ZXJmYWNlKElJRF9JRGVja0xpbmtDb25maWd1cmF0aW9uLCAodm9pZCAqKikmY3R4LT5jZmcpICE9IFNfT0spIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZ2V0IGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlIGZvciAnJXMnXG4iLCBuYW1lKTsKKyAgICAgICAgZmZfZGVja2xpbmtfY2xlYW51cChhdmN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIGlmIChjdHgtPmRsLT5RdWVyeUludGVyZmFjZShJSURfSURlY2tMaW5rQXR0cmlidXRlcywgKHZvaWQgKiopJmN0eC0+YXR0cikgIT0gU19PSykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgYXR0cmlidXRlcyBpbnRlcmZhY2UgZm9yICclcydcbiIsIG5hbWUpOworICAgICAgICBmZl9kZWNrbGlua19jbGVhbnVwKGF2Y3R4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9kZWNrbGlua19jb21tb24uaCBiL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbi5oCmluZGV4IGRmZjRmYzEuLjU3ZWU3ZDEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbi5oCisrKyBiL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbi5oCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIEJsYWNrbWFnaWMgRGVja0xpbmsgY29tbW9uIGNvZGUKICAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJhbWlybyBQb2xsYSwgTHVjYSBCYXJiYXRvLCBEZXRpIEZsaWVnbAorICogQ29weXJpZ2h0IChjKSAyMDE3IEFrYW1haSBUZWNobm9sb2dpZXMsIEluYy4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMjQsOCArMjUsMTUgQEAKIAogI2luY2x1ZGUgPERlY2tMaW5rQVBJVmVyc2lvbi5oPgogCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgogI2luY2x1ZGUgImRlY2tsaW5rX2NvbW1vbl9jLmgiCiAKKyNpZmRlZiBfV0lOMzIKKyNkZWZpbmUgREVDS0xJTktfQk9PTCBCT09MCisjZWxzZQorI2RlZmluZSBERUNLTElOS19CT09MIGJvb2wKKyNlbmRpZgorCiBjbGFzcyBkZWNrbGlua19vdXRwdXRfY2FsbGJhY2s7CiBjbGFzcyBkZWNrbGlua19pbnB1dF9jYWxsYmFjazsKIApAQCAtMzcsNiArNDUsNyBAQAogICAgIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKICAgICBwdGhyZWFkX2NvbmRfdCBjb25kOwogICAgIEFWRm9ybWF0Q29udGV4dCAqYXZjdHg7CisgICAgaW50NjRfdCBtYXhfcV9zaXplOwogfSBBVlBhY2tldFF1ZXVlOwogCiBzdHJ1Y3QgZGVja2xpbmtfY3R4IHsKQEAgLTQ0LDYgKzUzLDggQEAKICAgICBJRGVja0xpbmsgKmRsOwogICAgIElEZWNrTGlua091dHB1dCAqZGxvOwogICAgIElEZWNrTGlua0lucHV0ICpkbGk7CisgICAgSURlY2tMaW5rQ29uZmlndXJhdGlvbiAqY2ZnOworICAgIElEZWNrTGlua0F0dHJpYnV0ZXMgKmF0dHI7CiAgICAgZGVja2xpbmtfb3V0cHV0X2NhbGxiYWNrICpvdXRwdXRfY2FsbGJhY2s7CiAgICAgZGVja2xpbmtfaW5wdXRfY2FsbGJhY2sgKmlucHV0X2NhbGxiYWNrOwogCkBAIC01MSw2ICs2Miw4IEBACiAgICAgQk1EVGltZVZhbHVlIGJtZF90Yl9kZW47CiAgICAgQk1EVGltZVZhbHVlIGJtZF90Yl9udW07CiAgICAgQk1ERGlzcGxheU1vZGUgYm1kX21vZGU7CisgICAgQk1EVmlkZW9Db25uZWN0aW9uIHZpZGVvX2lucHV0OworICAgIEJNREF1ZGlvQ29ubmVjdGlvbiBhdWRpb19pbnB1dDsKICAgICBpbnQgYm1kX3dpZHRoOwogICAgIGludCBibWRfaGVpZ2h0OwogICAgIGludCBibWRfZmllbGRfZG9taW5hbmNlOwpAQCAtNzcsMTMgKzkwLDIxIEBACiAgICAgaW50IGxpc3RfZm9ybWF0czsKICAgICBpbnQ2NF90IHRlbGV0ZXh0X2xpbmVzOwogICAgIGRvdWJsZSBwcmVyb2xsOworICAgIGludCBkdXBsZXhfbW9kZTsKKyAgICBEZWNrbGlua1B0c1NvdXJjZSBhdWRpb19wdHNfc291cmNlOworICAgIERlY2tsaW5rUHRzU291cmNlIHZpZGVvX3B0c19zb3VyY2U7CisgICAgaW50IGRyYXdfYmFyczsKIAogICAgIGludCBmcmFtZXNfcHJlcm9sbDsKICAgICBpbnQgZnJhbWVzX2J1ZmZlcjsKIAotICAgIHNlbV90IHNlbWFwaG9yZTsKKyAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgY29uZDsKKyAgICBpbnQgZnJhbWVzX2J1ZmZlcl9hdmFpbGFibGVfc3BvdHM7CisgICAgaW50IGF1dG9kZXRlY3Q7CiAKICAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IGF1ZGlvX2RlcHRoOwogfTsKIAogdHlwZWRlZiBlbnVtIHsgRElSRUNUSU9OX0lOLCBESVJFQ1RJT05fT1VUfSBkZWNrbGlua19kaXJlY3Rpb25fdDsKQEAgLTk5LDExICsxMjAsMzQgQEAKIHR5cGVkZWYgdWludDMyX3QgYnVmZmVyY291bnRfdHlwZTsKICNlbmRpZgogCitzdGF0aWMgY29uc3QgQk1EQXVkaW9Db25uZWN0aW9uIGRlY2tsaW5rX2F1ZGlvX2Nvbm5lY3Rpb25fbWFwW10gPSB7CisgICAgKEJNREF1ZGlvQ29ubmVjdGlvbikwLAorICAgIGJtZEF1ZGlvQ29ubmVjdGlvbkVtYmVkZGVkLAorICAgIGJtZEF1ZGlvQ29ubmVjdGlvbkFFU0VCVSwKKyAgICBibWRBdWRpb0Nvbm5lY3Rpb25BbmFsb2csCisgICAgYm1kQXVkaW9Db25uZWN0aW9uQW5hbG9nWExSLAorICAgIGJtZEF1ZGlvQ29ubmVjdGlvbkFuYWxvZ1JDQSwKKyAgICBibWRBdWRpb0Nvbm5lY3Rpb25NaWNyb3Bob25lLAorfTsKKworc3RhdGljIGNvbnN0IEJNRFZpZGVvQ29ubmVjdGlvbiBkZWNrbGlua192aWRlb19jb25uZWN0aW9uX21hcFtdID0geworICAgIChCTURWaWRlb0Nvbm5lY3Rpb24pMCwKKyAgICBibWRWaWRlb0Nvbm5lY3Rpb25TREksCisgICAgYm1kVmlkZW9Db25uZWN0aW9uSERNSSwKKyAgICBibWRWaWRlb0Nvbm5lY3Rpb25PcHRpY2FsU0RJLAorICAgIGJtZFZpZGVvQ29ubmVjdGlvbkNvbXBvbmVudCwKKyAgICBibWRWaWRlb0Nvbm5lY3Rpb25Db21wb3NpdGUsCisgICAgYm1kVmlkZW9Db25uZWN0aW9uU1ZpZGVvLAorfTsKIAogSFJFU1VMVCBmZl9kZWNrbGlua19nZXRfZGlzcGxheV9uYW1lKElEZWNrTGluayAqVGhpcywgY29uc3QgY2hhciAqKmRpc3BsYXlOYW1lKTsKLWludCBmZl9kZWNrbGlua19zZXRfZm9ybWF0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHRiX251bSwgaW50IHRiX2RlbiwgZGVja2xpbmtfZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gRElSRUNUSU9OX09VVCwgaW50IG51bSA9IDApOworaW50IGZmX2RlY2tsaW5rX3NldF9jb25maWdzKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGRlY2tsaW5rX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CitpbnQgZmZfZGVja2xpbmtfc2V0X2Zvcm1hdChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB0Yl9udW0sIGludCB0Yl9kZW4sIGVudW0gQVZGaWVsZE9yZGVyIGZpZWxkX29yZGVyLCBkZWNrbGlua19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBESVJFQ1RJT05fT1VULCBpbnQgbnVtID0gMCk7CiBpbnQgZmZfZGVja2xpbmtfc2V0X2Zvcm1hdChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBkZWNrbGlua19kaXJlY3Rpb25fdCBkaXJlY3Rpb24sIGludCBudW0pOwotaW50IGZmX2RlY2tsaW5rX2xpc3RfZGV2aWNlcyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4KTsKK2ludCBmZl9kZWNrbGlua19saXN0X2RldmljZXMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgc3RydWN0IEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZV9saXN0LCBpbnQgc2hvd19pbnB1dHMsIGludCBzaG93X291dHB1dHMpOwordm9pZCBmZl9kZWNrbGlua19saXN0X2RldmljZXNfbGVnYWN5KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGludCBzaG93X2lucHV0cywgaW50IHNob3dfb3V0cHV0cyk7CiBpbnQgZmZfZGVja2xpbmtfbGlzdF9mb3JtYXRzKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGRlY2tsaW5rX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IERJUkVDVElPTl9PVVQpOwordm9pZCBmZl9kZWNrbGlua19jbGVhbnVwKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpOworaW50IGZmX2RlY2tsaW5rX2luaXRfZGV2aWNlKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIqIG5hbWUpOwogCiAjZW5kaWYgLyogQVZERVZJQ0VfREVDS0xJTktfQ09NTU9OX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbl9jLmggYi9saWJhdmRldmljZS9kZWNrbGlua19jb21tb25fYy5oCmluZGV4IDJiNWQ5MmYuLjA4ZTlmOWIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2NvbW1vbl9jLmgKKysrIGIvbGliYXZkZXZpY2UvZGVja2xpbmtfY29tbW9uX2MuaApAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBCbGFja21hZ2ljIERlY2tMaW5rIGNvbW1vbiBjb2RlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNCBSYW1pcm8gUG9sbGEKKyAqIENvcHlyaWdodCAoYykgMjAxNyBBa2FtYWkgVGVjaG5vbG9naWVzLCBJbmMuCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTIyLDYgKzIzLDE1IEBACiAjaWZuZGVmIEFWREVWSUNFX0RFQ0tMSU5LX0NPTU1PTl9DX0gKICNkZWZpbmUgQVZERVZJQ0VfREVDS0xJTktfQ09NTU9OX0NfSAogCit0eXBlZGVmIGVudW0gRGVja2xpbmtQdHNTb3VyY2UgeworICAgIFBUU19TUkNfQVVESU8gICAgID0gMSwKKyAgICBQVFNfU1JDX1ZJREVPICAgICA9IDIsCisgICAgUFRTX1NSQ19SRUZFUkVOQ0UgPSAzLAorICAgIFBUU19TUkNfV0FMTENMT0NLID0gNCwKKyAgICBQVFNfU1JDX0FCU19XQUxMQ0xPQ0sgPSA1LAorICAgIFBUU19TUkNfTkIKK30gRGVja2xpbmtQdHNTb3VyY2U7CisKIHN0cnVjdCBkZWNrbGlua19jY3R4IHsKICAgICBjb25zdCBBVkNsYXNzICpjY2xhc3M7CiAKQEAgLTM0LDYgKzQ0LDE3IEBACiAgICAgZG91YmxlIHByZXJvbGw7CiAgICAgaW50IHYyMTA7CiAgICAgaW50IGF1ZGlvX2NoYW5uZWxzOworICAgIGludCBhdWRpb19kZXB0aDsKKyAgICBpbnQgZHVwbGV4X21vZGU7CisgICAgRGVja2xpbmtQdHNTb3VyY2UgYXVkaW9fcHRzX3NvdXJjZTsKKyAgICBEZWNrbGlua1B0c1NvdXJjZSB2aWRlb19wdHNfc291cmNlOworICAgIGludCBhdWRpb19pbnB1dDsKKyAgICBpbnQgdmlkZW9faW5wdXQ7CisgICAgaW50IGRyYXdfYmFyczsKKyAgICBjaGFyICpmb3JtYXRfY29kZTsKKyAgICBpbnQgcmF3X2Zvcm1hdDsKKyAgICBpbnQ2NF90IHF1ZXVlX3NpemU7CisgICAgaW50IGNvcHl0czsKIH07CiAKICNlbmRpZiAvKiBBVkRFVklDRV9ERUNLTElOS19DT01NT05fQ19IICovCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9kZWNrbGlua19kZWMuY3BwIGIvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjLmNwcAppbmRleCA5ZDdkYzk3Li41NzAwNGQ3IDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9kZWNrbGlua19kZWMuY3BwCisrKyBiL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2RlYy5jcHAKQEAgLTEsNiArMSw4IEBACiAvKgotICogQmxhY2ttYWdpYyBEZWNrTGluayBvdXRwdXQKKyAqIEJsYWNrbWFnaWMgRGVja0xpbmsgaW5wdXQKICAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IEx1Y2EgQmFyYmF0bywgRGV0aSBGbGllZ2wKKyAqIENvcHlyaWdodCAoYykgMjAxNCBSYWZhw6tsIENhcnLDqQorICogQ29weXJpZ2h0IChjKSAyMDE3IEFrYW1haSBUZWNobm9sb2dpZXMsIEluYy4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMTksMTYgKzIxLDI2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgPERlY2tMaW5rQVBJLmg+CisvKiBJbmNsdWRlIGludGVybmFsLmggZmlyc3QgdG8gYXZvaWQgY29uZmxpY3QgYmV0d2VlbiB3aW5zb2NrLmggKHVzZWQgYnkKKyAqIERlY2tMaW5rIGhlYWRlcnMpIGFuZCB3aW5zb2NrMi5oICh1c2VkIGJ5IGxpYmF2Zm9ybWF0KSBpbiBNU1ZDKysgYnVpbGRzICovCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgorfQogCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotI2luY2x1ZGUgPHNlbWFwaG9yZS5oPgorI2luY2x1ZGUgPERlY2tMaW5rQVBJLmg+CiAKIGV4dGVybiAiQyIgewogI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yZXZlcnNlLmgiCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKICNpZiBDT05GSUdfTElCWlZCSQogI2luY2x1ZGUgPGxpYnp2YmkuaD4KICNlbmRpZgpAQCAtMzcsNyArNDksMTE3IEBACiAjaW5jbHVkZSAiZGVja2xpbmtfY29tbW9uLmgiCiAjaW5jbHVkZSAiZGVja2xpbmtfZGVjLmgiCiAKLSNpZiBDT05GSUdfTElCWlZCSQorI2RlZmluZSBNQVhfV0lEVEhfVkFOQyAxOTIwCitjb25zdCBCTUREaXNwbGF5TW9kZSBBVVRPREVURUNUX0RFRkFVTFRfTU9ERSA9IGJtZE1vZGVOVFNDOworCit0eXBlZGVmIHN0cnVjdCBWQU5DTGluZU51bWJlciB7CisgICAgQk1ERGlzcGxheU1vZGUgbW9kZTsKKyAgICBpbnQgdmFuY19zdGFydDsKKyAgICBpbnQgZmllbGQwX3ZhbmNfZW5kOworICAgIGludCBmaWVsZDFfdmFuY19zdGFydDsKKyAgICBpbnQgdmFuY19lbmQ7Cit9IFZBTkNMaW5lTnVtYmVyOworCisvKiBUaGVzZSBWQU5DIGxpbmUgbnVtYmVycyBuZWVkIG5vdCBiZSB2ZXJ5IGFjY3VyYXRlLiBJbiBhbnkgY2FzZQorICogR2V0QnVmZmVyRm9yVmVydGljYWxCbGFua2luZ0xpbmUoKSB3aWxsIHJldHVybiBhbiBlcnJvciB3aGVuIGludmFsaWQKKyAqIGFuY2lsbGFyeSBsaW5lIG51bWJlciB3YXMgcmVxdWVzdGVkLiBXZSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCisgKiBlbnRpcmUgVkFOQyByZWdpb24gaXMgY292ZXJlZCwgd2hpbGUgbWFraW5nIHN1cmUgd2UgZG9uJ3QgZGVjb2RlIFZBTkMgb2YKKyAqIGFub3RoZXIgc291cmNlIGR1cmluZyBzd2l0Y2hpbmcqLworc3RhdGljIFZBTkNMaW5lTnVtYmVyIHZhbmNfbGluZV9udW1iZXJzW10gPSB7CisgICAgLyogU0QgTW9kZXMgKi8KKworICAgIHtibWRNb2RlTlRTQywgMTEsIDE5LCAyNzQsIDI4Mn0sCisgICAge2JtZE1vZGVOVFNDMjM5OCwgMTEsIDE5LCAyNzQsIDI4Mn0sCisgICAge2JtZE1vZGVQQUwsIDcsIDIyLCAzMjAsIDMzNX0sCisgICAge2JtZE1vZGVOVFNDcCwgMTEsIC0xLCAtMSwgMzl9LAorICAgIHtibWRNb2RlUEFMcCwgNywgLTEsIC0xLCA0NX0sCisKKyAgICAvKiBIRCAxMDgwIE1vZGVzICovCisKKyAgICB7Ym1kTW9kZUhEMTA4MHAyMzk4LCA4LCAtMSwgLTEsIDQyfSwKKyAgICB7Ym1kTW9kZUhEMTA4MHAyNCwgOCwgLTEsIC0xLCA0Mn0sCisgICAge2JtZE1vZGVIRDEwODBwMjUsIDgsIC0xLCAtMSwgNDJ9LAorICAgIHtibWRNb2RlSEQxMDgwcDI5OTcsIDgsIC0xLCAtMSwgNDJ9LAorICAgIHtibWRNb2RlSEQxMDgwcDMwLCA4LCAtMSwgLTEsIDQyfSwKKyAgICB7Ym1kTW9kZUhEMTA4MGk1MCwgOCwgMjAsIDU3MCwgNTg1fSwKKyAgICB7Ym1kTW9kZUhEMTA4MGk1OTk0LCA4LCAyMCwgNTcwLCA1ODV9LAorICAgIHtibWRNb2RlSEQxMDgwaTYwMDAsIDgsIDIwLCA1NzAsIDU4NX0sCisgICAge2JtZE1vZGVIRDEwODBwNTAsIDgsIC0xLCAtMSwgNDJ9LAorICAgIHtibWRNb2RlSEQxMDgwcDU5OTQsIDgsIC0xLCAtMSwgNDJ9LAorICAgIHtibWRNb2RlSEQxMDgwcDYwMDAsIDgsIC0xLCAtMSwgNDJ9LAorCisgICAgIC8qIEhEIDcyMCBNb2RlcyAqLworCisgICAge2JtZE1vZGVIRDcyMHA1MCwgOCwgLTEsIC0xLCAyNn0sCisgICAge2JtZE1vZGVIRDcyMHA1OTk0LCA4LCAtMSwgLTEsIDI2fSwKKyAgICB7Ym1kTW9kZUhENzIwcDYwLCA4LCAtMSwgLTEsIDI2fSwKKworICAgIC8qIEZvciBhbGwgb3RoZXIgbW9kZXMsIGZvciB3aGljaCB3ZSBkb24ndCBzdXBwb3J0IFZBTkMgKi8KKyAgICB7Ym1kTW9kZVVua25vd24sIDAsIC0xLCAtMSwgLTF9Cit9OworCitzdGF0aWMgaW50IGdldF92YW5jX2xpbmVfaWR4KEJNRERpc3BsYXlNb2RlIG1vZGUpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHZhbmNfbGluZV9udW1iZXJzKTsgaSsrKSB7CisgICAgICAgIGlmIChtb2RlID09IHZhbmNfbGluZV9udW1iZXJzW2ldLm1vZGUpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisgICAgLyogUmV0dXJuIHRoZSBWQU5DIGlkeCBmb3IgVW5rbm93biBtb2RlICovCisgICAgcmV0dXJuIGkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfcGFyaXR5X2JpdHModWludDE2X3QgKmJ1ZiwgaW50IGxlbikgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKyAgICAgICAgYnVmW2ldICY9IDB4ZmY7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfdmFuY19wYXJpdHlfY2hlY2tzdW0odWludDE2X3QgKmJ1ZiwgaW50IGxlbiwgdWludDE2X3QgY2hlY2tzdW0pIHsKKyAgICBpbnQgaTsKKyAgICB1aW50MTZfdCB2YW5jX3N1bSA9IDA7CisgICAgZm9yIChpID0gMzsgaSA8IGxlbiAtIDE7IGkrKykgeworICAgICAgICB1aW50MTZfdCB2ID0gYnVmW2ldOworICAgICAgICBpbnQgbnAgPSB2ID4+IDg7CisgICAgICAgIGludCBwID0gYXZfcGFyaXR5KHYgJiAweGZmKTsKKyAgICAgICAgaWYgKCghIXAgXiAhISh2ICYgMHgxMDApKSB8fCAobnAgIT0gMSAmJiBucCAhPSAyKSkgeworICAgICAgICAgICAgLy8gUGFyaXR5IGNoZWNrIGZhaWxlZAorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHZhbmNfc3VtICs9IHY7CisgICAgfQorICAgIHZhbmNfc3VtICY9IDB4MWZmOworICAgIHZhbmNfc3VtIHw9ICgofnZhbmNfc3VtICYgMHgxMDApIDw8IDEpOworICAgIGlmIChjaGVja3N1bSAhPSB2YW5jX3N1bSkgeworICAgICAgICAvLyBDaGVja3N1bSB2ZXJpZmljYXRpb24gZmFpbGVkCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFRoZSAxMC1iaXQgVkFOQyBkYXRhIGlzIHBhY2tlZCBpbiBWMjEwLCB3ZSBvbmx5IG5lZWQgdGhlIGx1bWEgY29tcG9uZW50LiAqLworc3RhdGljIHZvaWQgZXh0cmFjdF9sdW1hX2Zyb21fdjIxMCh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggLyAzOyBpKyspIHsKKyAgICAgICAgKmRzdCsrID0gKHNyY1sxXSA+PiAyKSArICgoc3JjWzJdICYgMTUpIDw8IDYpOworICAgICAgICAqZHN0KysgPSAgc3JjWzRdICAgICAgICsgKChzcmNbNV0gJiAgMykgPDwgOCk7CisgICAgICAgICpkc3QrKyA9IChzcmNbNl0gPj4gNCkgKyAoKHNyY1s3XSAmIDYzKSA8PCA0KTsKKyAgICAgICAgc3JjICs9IDg7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1bnBhY2tfdjIxMCh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggKiAyIC8gMzsgaSsrKSB7CisgICAgICAgICpkc3QrKyA9ICBzcmNbMF0gICAgICAgKyAoKHNyY1sxXSAmIDMpICA8PCA4KTsKKyAgICAgICAgKmRzdCsrID0gKHNyY1sxXSA+PiAyKSArICgoc3JjWzJdICYgMTUpIDw8IDYpOworICAgICAgICAqZHN0KysgPSAoc3JjWzJdID4+IDQpICsgKChzcmNbM10gJiA2MykgPDwgNCk7CisgICAgICAgIHNyYyArPSA0OworICAgIH0KK30KKwogc3RhdGljIHVpbnQ4X3QgY2FsY19wYXJpdHlfYW5kX2xpbmVfb2Zmc2V0KGludCBsaW5lKQogewogICAgIHVpbnQ4X3QgcmV0ID0gKGxpbmUgPCAzMTMpIDw8IDU7CkBAIC00OCwzMCArMTcwLDI2MiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWludCB0ZWxldGV4dF9kYXRhX3VuaXRfZnJvbV92YmlfZGF0YShpbnQgbGluZSwgdWludDhfdCAqc3JjLCB1aW50OF90ICp0Z3QpCitzdGF0aWMgdm9pZCBmaWxsX2RhdGFfdW5pdF9oZWFkKGludCBsaW5lLCB1aW50OF90ICp0Z3QpCiB7Ci0gICAgdmJpX2JpdF9zbGljZXIgc2xpY2VyOwotCi0gICAgdmJpX2JpdF9zbGljZXJfaW5pdCgmc2xpY2VyLCA3MjAsIDEzNTAwMDAwLCA2OTM3NTAwLCA2OTM3NTAwLCAweDAwYWFhYWU0LCAweGZmZmYsIDE4LCA2LCA0MiAqIDgsIFZCSV9NT0RVTEFUSU9OX05SWl9NU0IsIFZCSV9QSVhGTVRfVVlWWSk7Ci0KLSAgICBpZiAodmJpX2JpdF9zbGljZSgmc2xpY2VyLCBzcmMsIHRndCArIDQpID09IEZBTFNFKQotICAgICAgICByZXR1cm4gLTE7Ci0KICAgICB0Z3RbMF0gPSAweDAyOyAvLyBkYXRhX3VuaXRfaWQKICAgICB0Z3RbMV0gPSAweDJjOyAvLyBkYXRhX3VuaXRfbGVuZ3RoCiAgICAgdGd0WzJdID0gY2FsY19wYXJpdHlfYW5kX2xpbmVfb2Zmc2V0KGxpbmUpOyAvLyBmaWVsZF9wYXJpdHksIGxpbmVfb2Zmc2V0CiAgICAgdGd0WzNdID0gMHhlNDsgLy8gZnJhbWluZyBjb2RlCit9CiAKLSAgICByZXR1cm4gMDsKKyNpZiBDT05GSUdfTElCWlZCSQorc3RhdGljIHVpbnQ4X3QqIHRlbGV0ZXh0X2RhdGFfdW5pdF9mcm9tX3ZiaV9kYXRhKGludCBsaW5lLCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKnRndCwgdmJpX3BpeGZtdCBmbXQpCit7CisgICAgdmJpX2JpdF9zbGljZXIgc2xpY2VyOworCisgICAgdmJpX2JpdF9zbGljZXJfaW5pdCgmc2xpY2VyLCA3MjAsIDEzNTAwMDAwLCA2OTM3NTAwLCA2OTM3NTAwLCAweDAwYWFhYWU0LCAweGZmZmYsIDE4LCA2LCA0MiAqIDgsIFZCSV9NT0RVTEFUSU9OX05SWl9NU0IsIGZtdCk7CisKKyAgICBpZiAodmJpX2JpdF9zbGljZSgmc2xpY2VyLCBzcmMsIHRndCArIDQpID09IEZBTFNFKQorICAgICAgICByZXR1cm4gdGd0OworCisgICAgZmlsbF9kYXRhX3VuaXRfaGVhZChsaW5lLCB0Z3QpOworCisgICAgcmV0dXJuIHRndCArIDQ2OworfQorCitzdGF0aWMgdWludDhfdCogdGVsZXRleHRfZGF0YV91bml0X2Zyb21fdmJpX2RhdGFfMTBiaXQoaW50IGxpbmUsIHVpbnQ4X3QgKnNyYywgdWludDhfdCAqdGd0KQoreworICAgIHVpbnQ4X3QgeVs3MjBdOworICAgIHVpbnQ4X3QgKnB5ID0geTsKKyAgICB1aW50OF90ICpwZW5kID0geSArIDcyMDsKKyAgICAvKiBUaGUgMTAtYml0IFZCSSBkYXRhIGlzIHBhY2tlZCBpbiBWMjEwLCBidXQgbGlienZiaSBvbmx5IHN1cHBvcnRzIDgtYml0LAorICAgICAqIHNvIHdlIGV4dHJhY3QgdGhlIDggTVNCcyBvZiB0aGUgbHVtYSBjb21wb25lbnQsIHRoYXQgaXMgZW5vdWdoIGZvcgorICAgICAqIHRlbGV0ZXh0IGJpdCBzbGljaW5nLiAqLworICAgIHdoaWxlIChweSA8IHBlbmQpIHsKKyAgICAgICAgKnB5KysgPSAoc3JjWzFdID4+IDQpICsgKChzcmNbMl0gJiAxNSkgPDwgNCk7CisgICAgICAgICpweSsrID0gKHNyY1s0XSA+PiAyKSArICgoc3JjWzVdICYgMyApIDw8IDYpOworICAgICAgICAqcHkrKyA9IChzcmNbNl0gPj4gNikgKyAoKHNyY1s3XSAmIDYzKSA8PCAyKTsKKyAgICAgICAgc3JjICs9IDg7CisgICAgfQorICAgIHJldHVybiB0ZWxldGV4dF9kYXRhX3VuaXRfZnJvbV92YmlfZGF0YShsaW5lLCB5LCB0Z3QsIFZCSV9QSVhGTVRfWVVWNDIwKTsKIH0KICNlbmRpZgogCitzdGF0aWMgdWludDhfdCogdGVsZXRleHRfZGF0YV91bml0X2Zyb21fb3A0N192YmlfcGFja2V0KGludCBsaW5lLCB1aW50MTZfdCAqcHksIHVpbnQ4X3QgKnRndCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChweVswXSAhPSAweDI1NSB8fCBweVsxXSAhPSAweDI1NSB8fCBweVsyXSAhPSAweDIyNykKKyAgICAgICAgcmV0dXJuIHRndDsKKworICAgIGZpbGxfZGF0YV91bml0X2hlYWQobGluZSwgdGd0KTsKKworICAgIHB5ICs9IDM7CisgICAgdGd0ICs9IDQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDI7IGkrKykKKyAgICAgICAqdGd0KysgPSBmZl9yZXZlcnNlW3B5W2ldICYgMjU1XTsKKworICAgIHJldHVybiB0Z3Q7Cit9CisKK3N0YXRpYyBpbnQgbGluZW1hc2tfbWF0Y2hlcyhpbnQgbGluZSwgaW50NjRfdCBtYXNrKQoreworICAgIGludCBzaGlmdCA9IC0xOworICAgIGlmIChsaW5lID49IDYgJiYgbGluZSA8PSAyMikKKyAgICAgICAgc2hpZnQgPSBsaW5lIC0gNjsKKyAgICBpZiAobGluZSA+PSAzMTggJiYgbGluZSA8PSAzMzUpCisgICAgICAgIHNoaWZ0ID0gbGluZSAtIDMxOCArIDE3OworICAgIHJldHVybiBzaGlmdCA+PSAwICYmICgoMVVMTCA8PCBzaGlmdCkgJiBtYXNrKTsKK30KKworc3RhdGljIHVpbnQ4X3QqIHRlbGV0ZXh0X2RhdGFfdW5pdF9mcm9tX29wNDdfZGF0YSh1aW50MTZfdCAqcHksIHVpbnQxNl90ICpwZW5kLCB1aW50OF90ICp0Z3QsIGludDY0X3Qgd2FudGVkX2xpbmVzKQoreworICAgIGlmIChweSA8IHBlbmQgLSA5KSB7CisgICAgICAgIGlmIChweVswXSA9PSAweDE1MSAmJiBweVsxXSA9PSAweDExNSAmJiBweVszXSA9PSAweDEwMikgeyAgICAgICAvLyBpZGVudGlmaWVyLCBpZGVudGlmaWVyLCBmb3JtYXQgY29kZSBmb3IgV1NUIHRlbGV0ZXh0CisgICAgICAgICAgICB1aW50MTZfdCAqZGVzY3JpcHRvcnMgPSBweSArIDQ7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHB5ICs9IDk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNSAmJiBweSA8IHBlbmQgLSA0NTsgaSsrLCBweSArPSA0NSkgeworICAgICAgICAgICAgICAgIGludCBsaW5lID0gKGRlc2NyaXB0b3JzW2ldICYgMzEpICsgKCEoZGVzY3JpcHRvcnNbaV0gJiAxMjgpKSAqIDMxMzsKKyAgICAgICAgICAgICAgICBpZiAobGluZSAmJiBsaW5lbWFza19tYXRjaGVzKGxpbmUsIHdhbnRlZF9saW5lcykpCisgICAgICAgICAgICAgICAgICAgIHRndCA9IHRlbGV0ZXh0X2RhdGFfdW5pdF9mcm9tX29wNDdfdmJpX3BhY2tldChsaW5lLCBweSwgdGd0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdGd0OworfQorCitzdGF0aWMgdWludDhfdCogdGVsZXRleHRfZGF0YV91bml0X2Zyb21fYW5jaWxsYXJ5X3BhY2tldCh1aW50MTZfdCAqcHksIHVpbnQxNl90ICpwZW5kLCB1aW50OF90ICp0Z3QsIGludDY0X3Qgd2FudGVkX2xpbmVzLCBpbnQgYWxsb3dfbXVsdGlwYWNrZXQpCit7CisgICAgdWludDE2X3QgZGlkID0gcHlbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGlkCisgICAgdWludDE2X3Qgc2RpZCA9IHB5WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWNvbmRhcnkgZGF0YSBpZAorICAgIHVpbnQxNl90IGRjID0gcHlbMl0gJiAyNTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBjb3VudAorICAgIHB5ICs9IDM7CisgICAgcGVuZCA9IEZGTUlOKHBlbmQsIHB5ICsgZGMpOworICAgIGlmIChkaWQgPT0gMHgxNDMgJiYgc2RpZCA9PSAweDEwMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VidGl0bGUgZGlzdHJpYnV0aW9uIHBhY2tldAorICAgICAgICB0Z3QgPSB0ZWxldGV4dF9kYXRhX3VuaXRfZnJvbV9vcDQ3X2RhdGEocHksIHBlbmQsIHRndCwgd2FudGVkX2xpbmVzKTsKKyAgICB9IGVsc2UgaWYgKGFsbG93X211bHRpcGFja2V0ICYmIGRpZCA9PSAweDE0MyAmJiBzZGlkID09IDB4MjAzKSB7ICAgIC8vIFZBTkMgbXVsdGlwYWNrZXQKKyAgICAgICAgcHkgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW9yaXR5LCBsaW5lL2ZpZWxkCisgICAgICAgIHdoaWxlIChweSA8IHBlbmQgLSAzKSB7CisgICAgICAgICAgICB0Z3QgPSB0ZWxldGV4dF9kYXRhX3VuaXRfZnJvbV9hbmNpbGxhcnlfcGFja2V0KHB5LCBwZW5kLCB0Z3QsIHdhbnRlZF9saW5lcywgMCk7CisgICAgICAgICAgICBweSArPSA0ICsgKHB5WzJdICYgMjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZGlkLCBuc2RpZCwgbmRjLCBsaW5lL2ZpZWxkCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRndDsKK30KKworc3RhdGljIHVpbnQ4X3QgKnZhbmNfdG9fY2MoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgdWludDE2X3QgKmJ1Ziwgc2l6ZV90IHdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJmNjX2NvdW50KQoreworICAgIHNpemVfdCBpLCBsZW4gPSAoYnVmWzVdICYgMHhmZikgKyA2ICsgMTsKKyAgICB1aW50OF90IGNkcF9zdW0sIHJhdGU7CisgICAgdWludDE2X3QgaGRyLCBmdHI7CisgICAgdWludDhfdCAqY2M7CisgICAgdWludDE2X3QgKmNkcCA9ICZidWZbNl07IC8vIENEUCBmb2xsb3dzCisgICAgaWYgKGNkcFswXSAhPSAweDk2IHx8IGNkcFsxXSAhPSAweDY5KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIENEUCBoZWFkZXIgMHglLjJ4IDB4JS4yeFxuIiwgY2RwWzBdLCBjZHBbMV0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBsZW4gLT0gNzsgLy8gcmVtb3ZlIFZBTkMgaGVhZGVyIGFuZCBjaGVja3N1bQorCisgICAgaWYgKGNkcFsyXSAhPSBsZW4pIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNEUCBsZW4gJWQgIT0gJXp1XG4iLCBjZHBbMl0sIGxlbik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNkcF9zdW0gPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspCisgICAgICAgIGNkcF9zdW0gKz0gY2RwW2ldOworICAgIGNkcF9zdW0gPSBjZHBfc3VtID8gMjU2IC0gY2RwX3N1bSA6IDA7CisgICAgaWYgKGNkcFtsZW4gLSAxXSAhPSBjZHBfc3VtKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDRFAgY2hlY2tzdW0gaW52YWxpZCAweCUuNHggIT0gMHglLjR4XG4iLCBjZHBfc3VtLCBjZHBbbGVuLTFdKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmF0ZSA9IGNkcFszXTsKKyAgICBpZiAoIShyYXRlICYgMHgwZikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNEUCBmcmFtZSByYXRlIGludmFsaWQgKDB4JS4yeClcbiIsIHJhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmF0ZSA+Pj0gNDsKKyAgICBpZiAocmF0ZSA+IDgpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIkNEUCBmcmFtZSByYXRlIGludmFsaWQgKDB4JS4yeClcbiIsIHJhdGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoIShjZHBbNF0gJiAweDQzKSkgLyogY2NkYXRhX3ByZXNlbnQgfCBjYXB0aW9uX3NlcnZpY2VfYWN0aXZlIHwgcmVzZXJ2ZWQgKi8geworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQ0RQIGZsYWdzIGludmFsaWQgKDB4JS4yeClcbiIsIGNkcFs0XSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGhkciA9IChjZHBbNV0gPDwgOCkgfCBjZHBbNl07CisgICAgaWYgKGNkcFs3XSAhPSAweDcyKSAvKiBjY2RhdGFfaWQgKi8geworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBjY2RhdGFfaWQgMHglLjJ4XG4iLCBjZHBbN10pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjY19jb3VudCA9IGNkcFs4XTsKKyAgICBpZiAoIShjY19jb3VudCAmIDB4ZTApKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGNjX2NvdW50IDB4JS4yeFxuIiwgY2NfY291bnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjY19jb3VudCAmPSAweDFmOworICAgIGlmICgobGVuIC0gMTMpIDwgY2NfY291bnQgKiAzKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGNjX2NvdW50ICVkICg+ICV6dSlcbiIsIGNjX2NvdW50ICogMywgbGVuIC0gMTMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoY2RwW2xlbiAtIDRdICE9IDB4NzQpIC8qIGZvb3RlciBpZCAqLyB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGZvb3RlciBpZCAweCUuMnhcbiIsIGNkcFtsZW4tNF0pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmdHIgPSAoY2RwW2xlbiAtIDNdIDw8IDgpIHwgY2RwW2xlbiAtIDJdOworICAgIGlmIChmdHIgIT0gaGRyKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJIZWFkZXIgMHglLjR4ICE9IEZvb3RlciAweCUuNHhcbiIsIGhkciwgZnRyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY2MgPSAodWludDhfdCAqKWF2X21hbGxvYyhjY19jb3VudCAqIDMpOworICAgIGlmIChjYyA9PSBOVUxMKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJDQyAtIGF2X21hbGxvYyBmYWlsZWQgZm9yIGNjX2NvdW50ID0gJWRcbiIsIGNjX2NvdW50KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY19jb3VudDsgaSsrKSB7CisgICAgICAgIGNjWzMqaSArIDBdID0gY2RwWzkgKyAzKmkrMF0gLyogJiAzICovOworICAgICAgICBjY1szKmkgKyAxXSA9IGNkcFs5ICsgMyppKzFdOworICAgICAgICBjY1szKmkgKyAyXSA9IGNkcFs5ICsgMyppKzJdOworICAgIH0KKworICAgIGNjX2NvdW50ICo9IDM7CisgICAgcmV0dXJuIGNjOworfQorCitzdGF0aWMgdWludDhfdCAqZ2V0X21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIHVpbnQxNl90ICpidWYsIHNpemVfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdGd0LCBzaXplX3QgdGd0X3NpemUsIEFWUGFja2V0ICpwa3QpCit7CisgICAgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOworICAgIHVpbnQxNl90ICptYXhfYnVmID0gYnVmICsgd2lkdGg7CisKKyAgICB3aGlsZSAoYnVmIDwgbWF4X2J1ZiAtIDYpIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgdWludDE2X3QgZGlkID0gYnVmWzNdICYgMHhGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGF0YSBpZAorICAgICAgICB1aW50MTZfdCBzZGlkID0gYnVmWzRdICYgMHhGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWNvbmRhcnkgZGF0YSBpZAorICAgICAgICAvKiBDaGVjayBmb3IgVkFOQyBoZWFkZXIgKi8KKyAgICAgICAgaWYgKGJ1ZlswXSAhPSAwIHx8IGJ1ZlsxXSAhPSAweDNmZiB8fCBidWZbMl0gIT0gMHgzZmYpIHsKKyAgICAgICAgICAgIHJldHVybiB0Z3Q7CisgICAgICAgIH0KKworICAgICAgICBsZW4gPSAoYnVmWzVdICYgMHhmZikgKyA2ICsgMTsKKyAgICAgICAgaWYgKGxlbiA+IG1heF9idWYgLSBidWYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJEYXRhIENvdW50ICglZCkgPiBkYXRhIGxlZnQgKCV6dSlcbiIsCisgICAgICAgICAgICAgICAgICAgIGxlbiwgbWF4X2J1ZiAtIGJ1Zik7CisgICAgICAgICAgICByZXR1cm4gdGd0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRpZCA9PSAweDQzICYmIChzZGlkID09IDB4MDIgfHwgc2RpZCA9PSAweDAzKSAmJiBjY3R4LT50ZWxldGV4dF9saW5lcyAmJgorICAgICAgICAgICAgd2lkdGggPT0gMTkyMCAmJiB0Z3Rfc2l6ZSA+PSAxOTIwKSB7CisgICAgICAgICAgICBpZiAoY2hlY2tfdmFuY19wYXJpdHlfY2hlY2tzdW0oYnVmLCBsZW4sIGJ1ZltsZW4gLSAxXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlZBTkMgcGFyaXR5IG9yIGNoZWNrc3VtIGluY29ycmVjdFxuIik7CisgICAgICAgICAgICAgICAgZ290byBza2lwX3BhY2tldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRndCA9IHRlbGV0ZXh0X2RhdGFfdW5pdF9mcm9tX2FuY2lsbGFyeV9wYWNrZXQoYnVmICsgMywgYnVmICsgbGVuLCB0Z3QsIGNjdHgtPnRlbGV0ZXh0X2xpbmVzLCAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChkaWQgPT0gMHg2MSAmJiBzZGlkID09IDB4MDEpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhX2xlbjsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRhdGE7CisgICAgICAgICAgICBpZiAoY2hlY2tfdmFuY19wYXJpdHlfY2hlY2tzdW0oYnVmLCBsZW4sIGJ1ZltsZW4gLSAxXSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfV0FSTklORywgIlZBTkMgcGFyaXR5IG9yIGNoZWNrc3VtIGluY29ycmVjdFxuIik7CisgICAgICAgICAgICAgICAgZ290byBza2lwX3BhY2tldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZWFyX3Bhcml0eV9iaXRzKGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIGRhdGEgPSB2YW5jX3RvX2NjKGF2Y3R4LCBidWYsIHdpZHRoLCBkYXRhX2xlbik7CisgICAgICAgICAgICBpZiAoZGF0YSkgeworICAgICAgICAgICAgICAgIGlmIChhdl9wYWNrZXRfYWRkX3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX0E1M19DQywgZGF0YSwgZGF0YV9sZW4pIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVW5rbm93biBtZXRhIGRhdGEgRElEID0gMHglLjJ4IFNESUQgPSAweCUuMnhcbiIsCisgICAgICAgICAgICAgICAgICAgIGRpZCwgc2RpZCk7CisgICAgICAgIH0KK3NraXBfcGFja2V0OgorICAgICAgICBidWYgKz0gbGVuOworICAgIH0KKworICAgIHJldHVybiB0Z3Q7Cit9CisKIHN0YXRpYyB2b2lkIGF2cGFja2V0X3F1ZXVlX2luaXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXRRdWV1ZSAqcSkKIHsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopYXZjdHgtPnByaXZfZGF0YTsKICAgICBtZW1zZXQocSwgMCwgc2l6ZW9mKEFWUGFja2V0UXVldWUpKTsKICAgICBwdGhyZWFkX211dGV4X2luaXQoJnEtPm11dGV4LCBOVUxMKTsKICAgICBwdGhyZWFkX2NvbmRfaW5pdCgmcS0+Y29uZCwgTlVMTCk7CiAgICAgcS0+YXZjdHggPSBhdmN0eDsKKyAgICBxLT5tYXhfcV9zaXplID0gY3R4LT5xdWV1ZV9zaXplOwogfQogCiBzdGF0aWMgdm9pZCBhdnBhY2tldF9xdWV1ZV9mbHVzaChBVlBhY2tldFF1ZXVlICpxKQpAQCAtMTExLDIxICs0NjUsMjQgQEAKIHsKICAgICBBVlBhY2tldExpc3QgKnBrdDE7CiAKLSAgICAvLyBEcm9wIFBhY2tldCBpZiBxdWV1ZSBzaXplIGlzID4gMUdCCi0gICAgaWYgKGF2cGFja2V0X3F1ZXVlX3NpemUocSkgPiAgMTAyNCAqIDEwMjQgKiAxMDI0ICkgeworICAgIC8vIERyb3AgUGFja2V0IGlmIHF1ZXVlIHNpemUgaXMgPiBtYXhpbXVtIHF1ZXVlIHNpemUKKyAgICBpZiAoYXZwYWNrZXRfcXVldWVfc2l6ZShxKSA+ICh1aW50NjRfdClxLT5tYXhfcV9zaXplKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOwogICAgICAgICBhdl9sb2cocS0+YXZjdHgsIEFWX0xPR19XQVJOSU5HLCAgIkRlY2tsaW5rIGlucHV0IGJ1ZmZlciBvdmVycnVuIVxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgLyogZHVwbGljYXRlIHRoZSBwYWNrZXQgKi8KLSAgICBpZiAoYXZfZHVwX3BhY2tldChwa3QpIDwgMCkgeworICAgIC8qIGVuc3VyZSB0aGUgcGFja2V0IGlzIHJlZmVyZW5jZSBjb3VudGVkICovCisgICAgaWYgKGF2X3BhY2tldF9tYWtlX3JlZmNvdW50ZWQocGt0KSA8IDApIHsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKICAgICBwa3QxID0gKEFWUGFja2V0TGlzdCAqKWF2X21hbGxvYyhzaXplb2YoQVZQYWNrZXRMaXN0KSk7CiAgICAgaWYgKCFwa3QxKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHBrdDEtPnBrdCAgPSAqcGt0OworICAgIGF2X3BhY2tldF9tb3ZlX3JlZigmcGt0MS0+cGt0LCBwa3QpOwogICAgIHBrdDEtPm5leHQgPSBOVUxMOwogCiAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZxLT5tdXRleCk7CkBAIC0yMDIsOCArNTU5LDkgQEAKIGRlY2tsaW5rX2lucHV0X2NhbGxiYWNrOjpkZWNrbGlua19pbnB1dF9jYWxsYmFjayhBVkZvcm1hdENvbnRleHQgKl9hdmN0eCkgOiBtX3JlZkNvdW50KDApCiB7CiAgICAgYXZjdHggPSBfYXZjdHg7Ci0gICAgZGVja2xpbmtfY2N0eCAgICAgICAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIGN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopIGNjdHgtPmN0eDsKKyAgICBkZWNrbGlua19jY3R4ICAgICAgICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopYXZjdHgtPnByaXZfZGF0YTsKKyAgICBjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKWNjdHgtPmN0eDsKKyAgICBub192aWRlbyA9IDA7CiAgICAgaW5pdGlhbF9hdWRpb19wdHMgPSBpbml0aWFsX3ZpZGVvX3B0cyA9IEFWX05PUFRTX1ZBTFVFOwogICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmbV9tdXRleCwgTlVMTCk7CiB9CkBAIC0yMzYsNiArNTk0LDYwIEBACiAgICAgcmV0dXJuIChVTE9ORyltX3JlZkNvdW50OwogfQogCitzdGF0aWMgaW50NjRfdCBnZXRfcGt0X3B0cyhJRGVja0xpbmtWaWRlb0lucHV0RnJhbWUgKnZpZGVvRnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRGVja0xpbmtBdWRpb0lucHV0UGFja2V0ICphdWRpb0ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB3YWxsY2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGFic193YWxsY2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNrbGlua1B0c1NvdXJjZSBwdHNfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2UsIGludDY0X3QgKmluaXRpYWxfcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcHl0cykKK3sKKyAgICBpbnQ2NF90IHB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIEJNRFRpbWVWYWx1ZSBibWRfcHRzOworICAgIEJNRFRpbWVWYWx1ZSBibWRfZHVyYXRpb247CisgICAgSFJFU1VMVCByZXMgPSBFX0lOVkFMSURBUkc7CisgICAgc3dpdGNoIChwdHNfc3JjKSB7CisgICAgICAgIGNhc2UgUFRTX1NSQ19BVURJTzoKKyAgICAgICAgICAgIGlmIChhdWRpb0ZyYW1lKQorICAgICAgICAgICAgICAgIHJlcyA9IGF1ZGlvRnJhbWUtPkdldFBhY2tldFRpbWUoJmJtZF9wdHMsIHRpbWVfYmFzZS5kZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFRTX1NSQ19WSURFTzoKKyAgICAgICAgICAgIGlmICh2aWRlb0ZyYW1lKQorICAgICAgICAgICAgICAgIHJlcyA9IHZpZGVvRnJhbWUtPkdldFN0cmVhbVRpbWUoJmJtZF9wdHMsICZibWRfZHVyYXRpb24sIHRpbWVfYmFzZS5kZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUFRTX1NSQ19SRUZFUkVOQ0U6CisgICAgICAgICAgICBpZiAodmlkZW9GcmFtZSkKKyAgICAgICAgICAgICAgICByZXMgPSB2aWRlb0ZyYW1lLT5HZXRIYXJkd2FyZVJlZmVyZW5jZVRpbWVzdGFtcCh0aW1lX2Jhc2UuZGVuLCAmYm1kX3B0cywgJmJtZF9kdXJhdGlvbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQVFNfU1JDX1dBTExDTE9DSzoKKyAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFBUU19TUkNfQUJTX1dBTExDTE9DSzoKKyAgICAgICAgeworICAgICAgICAgICAgLyogTVNWQyBkb2VzIG5vdCBzdXBwb3J0IGNvbXBvdW5kIGxpdGVyYWxzIGxpa2UgQVZfVElNRV9CQVNFX1EKKyAgICAgICAgICAgICAqIGluIEMrKyBjb2RlIChjb21waWxlciBlcnJvciBDNDU3NikgKi8KKyAgICAgICAgICAgIEFWUmF0aW9uYWwgdGltZWJhc2U7CisgICAgICAgICAgICB0aW1lYmFzZS5udW0gPSAxOworICAgICAgICAgICAgdGltZWJhc2UuZGVuID0gQVZfVElNRV9CQVNFOworICAgICAgICAgICAgaWYgKHB0c19zcmMgPT0gUFRTX1NSQ19XQUxMQ0xPQ0spCisgICAgICAgICAgICAgICAgcHRzID0gYXZfcmVzY2FsZV9xKHdhbGxjbG9jaywgdGltZWJhc2UsIHRpbWVfYmFzZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHRzID0gYXZfcmVzY2FsZV9xKGFic193YWxsY2xvY2ssIHRpbWViYXNlLCB0aW1lX2Jhc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlcyA9PSBTX09LKQorICAgICAgICBwdHMgPSBibWRfcHRzIC8gdGltZV9iYXNlLm51bTsKKworICAgIGlmICghY29weXRzKSB7CisgICAgICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgKmluaXRpYWxfcHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgKmluaXRpYWxfcHRzID0gcHRzOworICAgICAgICBpZiAoKmluaXRpYWxfcHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgcHRzIC09ICppbml0aWFsX3B0czsKKyAgICB9CisKKyAgICByZXR1cm4gcHRzOworfQorCiBIUkVTVUxUIGRlY2tsaW5rX2lucHV0X2NhbGxiYWNrOjpWaWRlb0lucHV0RnJhbWVBcnJpdmVkKAogICAgIElEZWNrTGlua1ZpZGVvSW5wdXRGcmFtZSAqdmlkZW9GcmFtZSwgSURlY2tMaW5rQXVkaW9JbnB1dFBhY2tldCAqYXVkaW9GcmFtZSkKIHsKQEAgLTI0MywxNSArNjU1LDI4IEBACiAgICAgdm9pZCAqYXVkaW9GcmFtZUJ5dGVzOwogICAgIEJNRFRpbWVWYWx1ZSBmcmFtZVRpbWU7CiAgICAgQk1EVGltZVZhbHVlIGZyYW1lRHVyYXRpb247CisgICAgaW50NjRfdCB3YWxsY2xvY2sgPSAwLCBhYnNfd2FsbGNsb2NrID0gMDsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGN0eC0+YXV0b2RldGVjdCkgeworICAgICAgICBpZiAodmlkZW9GcmFtZSAmJiAhKHZpZGVvRnJhbWUtPkdldEZsYWdzKCkgJiBibWRGcmFtZUhhc05vSW5wdXRTb3VyY2UpICYmCisgICAgICAgICAgICBjdHgtPmJtZF9tb2RlID09IGJtZE1vZGVVbmtub3duKQorICAgICAgICB7CisgICAgICAgICAgICBjdHgtPmJtZF9tb2RlID0gQVVUT0RFVEVDVF9ERUZBVUxUX01PREU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFNfT0s7CisgICAgfQogCiAgICAgY3R4LT5mcmFtZUNvdW50Kys7CisgICAgaWYgKGN0eC0+YXVkaW9fcHRzX3NvdXJjZSA9PSBQVFNfU1JDX1dBTExDTE9DSyB8fCBjdHgtPnZpZGVvX3B0c19zb3VyY2UgPT0gUFRTX1NSQ19XQUxMQ0xPQ0spCisgICAgICAgIHdhbGxjbG9jayA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICBpZiAoY3R4LT5hdWRpb19wdHNfc291cmNlID09IFBUU19TUkNfQUJTX1dBTExDTE9DSyB8fCBjdHgtPnZpZGVvX3B0c19zb3VyY2UgPT0gUFRTX1NSQ19BQlNfV0FMTENMT0NLKQorICAgICAgICBhYnNfd2FsbGNsb2NrID0gYXZfZ2V0dGltZSgpOwogCiAgICAgLy8gSGFuZGxlIFZpZGVvIEZyYW1lCiAgICAgaWYgKHZpZGVvRnJhbWUpIHsKICAgICAgICAgQVZQYWNrZXQgcGt0OwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqYzsKICAgICAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7Ci0gICAgICAgIGMgPSBjdHgtPnZpZGVvX3N0LT5jb2RlYzsKICAgICAgICAgaWYgKGN0eC0+ZnJhbWVDb3VudCAlIDI1ID09IDApIHsKICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBxc2l6ZSA9IGF2cGFja2V0X3F1ZXVlX3NpemUoJmN0eC0+cXVldWUpOwogICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsCkBAIC0yNjYsMTggKzY5MSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+dmlkZW9fc3QtPnRpbWVfYmFzZS5kZW4pOwogCiAgICAgICAgIGlmICh2aWRlb0ZyYW1lLT5HZXRGbGFncygpICYgYm1kRnJhbWVIYXNOb0lucHV0U291cmNlKSB7Ci0gICAgICAgICAgICBpZiAodmlkZW9GcmFtZS0+R2V0UGl4ZWxGb3JtYXQoKSA9PSBibWRGb3JtYXQ4Qml0WVVWKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBiYXJzWzhdID0gewotICAgICAgICAgICAgICAgIDB4RUE4MEVBODAsIDB4RDI5MkQyMTAsIDB4QTkxMEE5QTUsIDB4OTAyMjkwMzUsCi0gICAgICAgICAgICAgICAgMHg2QURENkFDQSwgMHg1MUVGNTE1QSwgMHgyODZEMjhFRiwgMHgxMDgwMTA4MCB9OwotICAgICAgICAgICAgaW50IHdpZHRoICA9IHZpZGVvRnJhbWUtPkdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gdmlkZW9GcmFtZS0+R2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCAqcCA9ICh1bnNpZ25lZCAqKWZyYW1lQnl0ZXM7CisgICAgICAgICAgICBpZiAoY3R4LT5kcmF3X2JhcnMgJiYgdmlkZW9GcmFtZS0+R2V0UGl4ZWxGb3JtYXQoKSA9PSBibWRGb3JtYXQ4Qml0WVVWKSB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYmFyc1s4XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgMHhFQTgwRUE4MCwgMHhEMjkyRDIxMCwgMHhBOTEwQTlBNSwgMHg5MDIyOTAzNSwKKyAgICAgICAgICAgICAgICAgICAgMHg2QURENkFDQSwgMHg1MUVGNTE1QSwgMHgyODZEMjhFRiwgMHgxMDgwMTA4MCB9OworICAgICAgICAgICAgICAgIGludCB3aWR0aCAgPSB2aWRlb0ZyYW1lLT5HZXRXaWR0aCgpOworICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSB2aWRlb0ZyYW1lLT5HZXRIZWlnaHQoKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCAqcCA9ICh1bnNpZ25lZCAqKWZyYW1lQnl0ZXM7CiAKLSAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCi0gICAgICAgICAgICAgICAgICAgICpwKysgPSBiYXJzWyh4ICogOCkgLyB3aWR0aF07Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAqcCsrID0gYmFyc1soeCAqIDgpIC8gd2lkdGhdOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCFub192aWRlbykgewpAQCAtMjkzLDEzICs3MTgsNyBAQAogICAgICAgICAgICAgbm9fdmlkZW8gPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgcGt0LnB0cyA9IGZyYW1lVGltZSAvIGN0eC0+dmlkZW9fc3QtPnRpbWVfYmFzZS5udW07Ci0KLSAgICAgICAgaWYgKGluaXRpYWxfdmlkZW9fcHRzID09IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgICAgICBpbml0aWFsX3ZpZGVvX3B0cyA9IHBrdC5wdHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwa3QucHRzIC09IGluaXRpYWxfdmlkZW9fcHRzOworICAgICAgICBwa3QucHRzID0gZ2V0X3BrdF9wdHModmlkZW9GcmFtZSwgYXVkaW9GcmFtZSwgd2FsbGNsb2NrLCBhYnNfd2FsbGNsb2NrLCBjdHgtPnZpZGVvX3B0c19zb3VyY2UsIGN0eC0+dmlkZW9fc3QtPnRpbWVfYmFzZSwgJmluaXRpYWxfdmlkZW9fcHRzLCBjY3R4LT5jb3B5dHMpOwogICAgICAgICBwa3QuZHRzID0gcGt0LnB0czsKIAogICAgICAgICBwa3QuZHVyYXRpb24gPSBmcmFtZUR1cmF0aW9uOwpAQCAtMzExLDI2ICs3MzAsNTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWUtPkdldEhlaWdodCgpOwogICAgICAgICAvL2ZwcmludGYoc3RkZXJyLCJWaWRlbyBGcmFtZSBzaXplICVkIHRzICVkXG4iLCBwa3Quc2l6ZSwgcGt0LnB0cyk7CiAKLSNpZiBDT05GSUdfTElCWlZCSQotICAgICAgICBpZiAoIW5vX3ZpZGVvICYmIGN0eC0+dGVsZXRleHRfbGluZXMgJiYgdmlkZW9GcmFtZS0+R2V0UGl4ZWxGb3JtYXQoKSA9PSBibWRGb3JtYXQ4Qml0WVVWICYmIHZpZGVvRnJhbWUtPkdldFdpZHRoKCkgPT0gNzIwKSB7CisgICAgICAgIGlmICghbm9fdmlkZW8pIHsKICAgICAgICAgICAgIElEZWNrTGlua1ZpZGVvRnJhbWVBbmNpbGxhcnkgKnZhbmM7CiAgICAgICAgICAgICBBVlBhY2tldCB0eHRfcGt0OwotICAgICAgICAgICAgdWludDhfdCB0eHRfYnVmMFsxNjExXTsgLy8gbWF4IDM1ICogNDYgYnl0ZXMgZGVjb2RlZCB0ZWxldGV4dCBsaW5lcyArIDEgYnl0ZSBkYXRhX2lkZW50aWZpZXIKKyAgICAgICAgICAgIHVpbnQ4X3QgdHh0X2J1ZjBbMzUzMV07IC8vIDM1ICogNDYgYnl0ZXMgZGVjb2RlZCB0ZWxldGV4dCBsaW5lcyArIDEgYnl0ZSBkYXRhX2lkZW50aWZpZXIgKyAxOTIwIGJ5dGVzIE9QNDcgZGVjb2RlIGJ1ZmZlcgogICAgICAgICAgICAgdWludDhfdCAqdHh0X2J1ZiA9IHR4dF9idWYwOwogCiAgICAgICAgICAgICBpZiAodmlkZW9GcmFtZS0+R2V0QW5jaWxsYXJ5RGF0YSgmdmFuYykgPT0gU19PSykgewogICAgICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgIGludDY0X3QgbGluZV9tYXNrID0gMTsKKyAgICAgICAgICAgICAgICBCTURQaXhlbEZvcm1hdCB2YW5jX2Zvcm1hdCA9IHZhbmMtPkdldFBpeGVsRm9ybWF0KCk7CiAgICAgICAgICAgICAgICAgdHh0X2J1ZlswXSA9IDB4MTA7ICAgIC8vIGRhdGFfaWRlbnRpZmllciAtIEVCVV9kYXRhCiAgICAgICAgICAgICAgICAgdHh0X2J1ZisrOwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDY7IGkgPCAzMzY7IGkrKywgbGluZV9tYXNrIDw8PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZjsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChjdHgtPnRlbGV0ZXh0X2xpbmVzICYgbGluZV9tYXNrKSAmJiB2YW5jLT5HZXRCdWZmZXJGb3JWZXJ0aWNhbEJsYW5raW5nTGluZShpLCAodm9pZCoqKSZidWYpID09IFNfT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZWxldGV4dF9kYXRhX3VuaXRfZnJvbV92YmlfZGF0YShpLCBidWYsIHR4dF9idWYpID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0X2J1ZiArPSA0NjsKKyNpZiBDT05GSUdfTElCWlZCSQorICAgICAgICAgICAgICAgIGlmIChjdHgtPmJtZF9tb2RlID09IGJtZE1vZGVQQUwgJiYgY3R4LT50ZWxldGV4dF9saW5lcyAmJgorICAgICAgICAgICAgICAgICAgICAodmFuY19mb3JtYXQgPT0gYm1kRm9ybWF0OEJpdFlVViB8fCB2YW5jX2Zvcm1hdCA9PSBibWRGb3JtYXQxMEJpdFlVVikpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCh2aWRlb0ZyYW1lLT5HZXRXaWR0aCgpID09IDcyMCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDY7IGkgPCAzMzY7IGkrKywgbGluZV9tYXNrIDw8PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpidWY7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGN0eC0+dGVsZXRleHRfbGluZXMgJiBsaW5lX21hc2spICYmIHZhbmMtPkdldEJ1ZmZlckZvclZlcnRpY2FsQmxhbmtpbmdMaW5lKGksICh2b2lkKiopJmJ1ZikgPT0gU19PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YW5jX2Zvcm1hdCA9PSBibWRGb3JtYXQ4Qml0WVVWKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eHRfYnVmID0gdGVsZXRleHRfZGF0YV91bml0X2Zyb21fdmJpX2RhdGEoaSwgYnVmLCB0eHRfYnVmLCBWQklfUElYRk1UX1VZVlkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0X2J1ZiA9IHRlbGV0ZXh0X2RhdGFfdW5pdF9mcm9tX3ZiaV9kYXRhXzEwYml0KGksIGJ1ZiwgdHh0X2J1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAyMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gMzE3OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpID09IDIyKQotICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDMxNzsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAodmFuY19mb3JtYXQgPT0gYm1kRm9ybWF0MTBCaXRZVVYgJiYgdmlkZW9GcmFtZS0+R2V0V2lkdGgoKSA8PSBNQVhfV0lEVEhfVkFOQykgeworICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gZ2V0X3ZhbmNfbGluZV9pZHgoY3R4LT5ibWRfbW9kZSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IHZhbmNfbGluZV9udW1iZXJzW2lkeF0udmFuY19zdGFydDsgaSA8PSB2YW5jX2xpbmVfbnVtYmVyc1tpZHhdLnZhbmNfZW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YW5jLT5HZXRCdWZmZXJGb3JWZXJ0aWNhbEJsYW5raW5nTGluZShpLCAodm9pZCoqKSZidWYpID09IFNfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB2YW5jW01BWF9XSURUSF9WQU5DXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFuY19zaXplID0gdmlkZW9GcmFtZS0+R2V0V2lkdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5ibWRfbW9kZSA9PSBibWRNb2RlTlRTQyAmJiB2aWRlb0ZyYW1lLT5HZXRXaWR0aCgpICogMiA8PSBNQVhfV0lEVEhfVkFOQykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YW5jX3NpemUgPSB2YW5jX3NpemUgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2tfdjIxMCh2YW5jLCBidWYsIHZpZGVvRnJhbWUtPkdldFdpZHRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RfbHVtYV9mcm9tX3YyMTAodmFuYywgYnVmLCB2aWRlb0ZyYW1lLT5HZXRXaWR0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0X2J1ZiA9IGdldF9tZXRhZGF0YShhdmN0eCwgdmFuYywgdmFuY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHh0X2J1Ziwgc2l6ZW9mKHR4dF9idWYwKSAtICh0eHRfYnVmIC0gdHh0X2J1ZjApLCAmcGt0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IHZhbmNfbGluZV9udW1iZXJzW2lkeF0uZmllbGQwX3ZhbmNfZW5kKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSB2YW5jX2xpbmVfbnVtYmVyc1tpZHhdLmZpZWxkMV92YW5jX3N0YXJ0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB2YW5jLT5SZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHR4dF9idWYgLSB0eHRfYnVmMCA+IDEpIHsKQEAgLTM1Miw5ICs3OTksNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQotI2VuZGlmCiAKLSAgICAgICAgYy0+ZnJhbWVfbnVtYmVyKys7CiAgICAgICAgIGlmIChhdnBhY2tldF9xdWV1ZV9wdXQoJmN0eC0+cXVldWUsICZwa3QpIDwgMCkgewogICAgICAgICAgICAgKytjdHgtPmRyb3BwZWQ7CiAgICAgICAgIH0KQEAgLTM2MiwyMyArODA3LDE1IEBACiAKICAgICAvLyBIYW5kbGUgQXVkaW8gRnJhbWUKICAgICBpZiAoYXVkaW9GcmFtZSkgewotICAgICAgICBBVkNvZGVjQ29udGV4dCAqYzsKICAgICAgICAgQVZQYWNrZXQgcGt0OwogICAgICAgICBCTURUaW1lVmFsdWUgYXVkaW9fcHRzOwogICAgICAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKIAotICAgICAgICBjID0gY3R4LT5hdWRpb19zdC0+Y29kZWM7CiAgICAgICAgIC8vaGFjayBhbW9uZyBoYWNrcwotICAgICAgICBwa3Quc2l6ZSA9IGF1ZGlvRnJhbWUtPkdldFNhbXBsZUZyYW1lQ291bnQoKSAqIGN0eC0+YXVkaW9fc3QtPmNvZGVjLT5jaGFubmVscyAqICgxNiAvIDgpOworICAgICAgICBwa3Quc2l6ZSA9IGF1ZGlvRnJhbWUtPkdldFNhbXBsZUZyYW1lQ291bnQoKSAqIGN0eC0+YXVkaW9fc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIChjdHgtPmF1ZGlvX2RlcHRoIC8gOCk7CiAgICAgICAgIGF1ZGlvRnJhbWUtPkdldEJ5dGVzKCZhdWRpb0ZyYW1lQnl0ZXMpOwogICAgICAgICBhdWRpb0ZyYW1lLT5HZXRQYWNrZXRUaW1lKCZhdWRpb19wdHMsIGN0eC0+YXVkaW9fc3QtPnRpbWVfYmFzZS5kZW4pOwotICAgICAgICBwa3QucHRzID0gYXVkaW9fcHRzIC8gY3R4LT5hdWRpb19zdC0+dGltZV9iYXNlLm51bTsKLQotICAgICAgICBpZiAoaW5pdGlhbF9hdWRpb19wdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgICAgIGluaXRpYWxfYXVkaW9fcHRzID0gcGt0LnB0czsKLSAgICAgICAgfQotCi0gICAgICAgIHBrdC5wdHMgLT0gaW5pdGlhbF9hdWRpb19wdHM7CisgICAgICAgIHBrdC5wdHMgPSBnZXRfcGt0X3B0cyh2aWRlb0ZyYW1lLCBhdWRpb0ZyYW1lLCB3YWxsY2xvY2ssIGFic193YWxsY2xvY2ssIGN0eC0+YXVkaW9fcHRzX3NvdXJjZSwgY3R4LT5hdWRpb19zdC0+dGltZV9iYXNlLCAmaW5pdGlhbF9hdWRpb19wdHMsIGNjdHgtPmNvcHl0cyk7CiAgICAgICAgIHBrdC5kdHMgPSBwa3QucHRzOwogCiAgICAgICAgIC8vZnByaW50ZihzdGRlcnIsIkF1ZGlvIEZyYW1lIHNpemUgJWQgdHMgJWRcbiIsIHBrdC5zaXplLCBwa3QucHRzKTsKQEAgLTM4Niw3ICs4MjMsNiBAQAogICAgICAgICBwa3Quc3RyZWFtX2luZGV4ID0gY3R4LT5hdWRpb19zdC0+aW5kZXg7CiAgICAgICAgIHBrdC5kYXRhICAgICAgICAgPSAodWludDhfdCAqKWF1ZGlvRnJhbWVCeXRlczsKIAotICAgICAgICBjLT5mcmFtZV9udW1iZXIrKzsKICAgICAgICAgaWYgKGF2cGFja2V0X3F1ZXVlX3B1dCgmY3R4LT5xdWV1ZSwgJnBrdCkgPCAwKSB7CiAgICAgICAgICAgICArK2N0eC0+ZHJvcHBlZDsKICAgICAgICAgfQpAQCAtMzk5LDI1ICs4MzUsNjQgQEAKICAgICBCTURWaWRlb0lucHV0Rm9ybWF0Q2hhbmdlZEV2ZW50cyBldmVudHMsIElEZWNrTGlua0Rpc3BsYXlNb2RlICptb2RlLAogICAgIEJNRERldGVjdGVkVmlkZW9JbnB1dEZvcm1hdEZsYWdzKQogeworICAgIGN0eC0+Ym1kX21vZGUgPSBtb2RlLT5HZXREaXNwbGF5TW9kZSgpOwogICAgIHJldHVybiBTX09LOwogfQogCi1zdGF0aWMgSFJFU1VMVCBkZWNrbGlua19zdGFydF9pbnB1dChBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQotewotICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgY2N0eC0+Y3R4Oworc3RhdGljIGludCBkZWNrbGlua19hdXRvZGV0ZWN0KHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4KSB7CisgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKiljY3R4LT5jdHg7CisgICAgREVDS0xJTktfQk9PTCBhdXRvZGV0ZWN0X3N1cHBvcnRlZCA9IGZhbHNlOworICAgIGludCBpOwogCi0gICAgY3R4LT5pbnB1dF9jYWxsYmFjayA9IG5ldyBkZWNrbGlua19pbnB1dF9jYWxsYmFjayhhdmN0eCk7Ci0gICAgY3R4LT5kbGktPlNldENhbGxiYWNrKGN0eC0+aW5wdXRfY2FsbGJhY2spOwotICAgIHJldHVybiBjdHgtPmRsaS0+U3RhcnRTdHJlYW1zKCk7CisgICAgaWYgKGN0eC0+YXR0ci0+R2V0RmxhZyhCTUREZWNrTGlua1N1cHBvcnRzSW5wdXRGb3JtYXREZXRlY3Rpb24sICZhdXRvZGV0ZWN0X3N1cHBvcnRlZCkgIT0gU19PSykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmIChhdXRvZGV0ZWN0X3N1cHBvcnRlZCA9PSBmYWxzZSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgY3R4LT5hdXRvZGV0ZWN0ID0gMTsKKyAgICBjdHgtPmJtZF9tb2RlICA9IGJtZE1vZGVVbmtub3duOworICAgIGlmIChjdHgtPmRsaS0+RW5hYmxlVmlkZW9JbnB1dChBVVRPREVURUNUX0RFRkFVTFRfTU9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1kRm9ybWF0OEJpdFlVViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1kVmlkZW9JbnB1dEVuYWJsZUZvcm1hdERldGVjdGlvbikgIT0gU19PSykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGN0eC0+ZGxpLT5TdGFydFN0cmVhbXMoKSAhPSBTX09LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyAxIHNlY29uZCB0aW1lb3V0CisgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgYXZfdXNsZWVwKDEwMDAwMCk7CisgICAgICAgIC8qIFNvbWV0aW1lcyBWaWRlb0lucHV0RnJhbWVBcnJpdmVkIGlzIGNhbGxlZCB3aXRob3V0IHRoZQorICAgICAgICAgKiBibWRGcmFtZUhhc05vSW5wdXRTb3VyY2UgZmxhZyBiZWZvcmUgVmlkZW9JbnB1dEZvcm1hdENoYW5nZWQuCisgICAgICAgICAqIFNvIGRvbid0IGJyZWFrIGZvciBibWRfbW9kZSA9PSBBVVRPREVURUNUX0RFRkFVTFRfTU9ERS4gKi8KKyAgICAgICAgaWYgKGN0eC0+Ym1kX21vZGUgIT0gYm1kTW9kZVVua25vd24gJiYKKyAgICAgICAgICAgIGN0eC0+Ym1kX21vZGUgIT0gQVVUT0RFVEVDVF9ERUZBVUxUX01PREUpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjdHgtPmRsaS0+UGF1c2VTdHJlYW1zKCk7CisgICAgY3R4LT5kbGktPkZsdXNoU3RyZWFtcygpOworICAgIGN0eC0+YXV0b2RldGVjdCA9IDA7CisgICAgaWYgKGN0eC0+Ym1kX21vZGUgIT0gYm1kTW9kZVVua25vd24pIHsKKyAgICAgICAgY2N0eC0+Zm9ybWF0X2NvZGUgPSAoY2hhciAqKWF2X21hbGxvY3ooNSk7CisgICAgICAgIGlmICghY2N0eC0+Zm9ybWF0X2NvZGUpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIEFWX1dCMzIoY2N0eC0+Zm9ybWF0X2NvZGUsIGN0eC0+Ym1kX21vZGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCiB9CiAKIGV4dGVybiAiQyIgewogCiBhdl9jb2xkIGludCBmZl9kZWNrbGlua19yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCiB7Ci0gICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKLSAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBjY3R4LT5jdHg7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKilhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopY2N0eC0+Y3R4OwogCiAgICAgaWYgKGN0eC0+Y2FwdHVyZV9zdGFydGVkKSB7CiAgICAgICAgIGN0eC0+ZGxpLT5TdG9wU3RyZWFtcygpOwpAQCAtNDI1LDExICs5MDAsNyBAQAogICAgICAgICBjdHgtPmRsaS0+RGlzYWJsZUF1ZGlvSW5wdXQoKTsKICAgICB9CiAKLSAgICBpZiAoY3R4LT5kbGkpCi0gICAgICAgIGN0eC0+ZGxpLT5SZWxlYXNlKCk7Ci0gICAgaWYgKGN0eC0+ZGwpCi0gICAgICAgIGN0eC0+ZGwtPlJlbGVhc2UoKTsKLQorICAgIGZmX2RlY2tsaW5rX2NsZWFudXAoYXZjdHgpOwogICAgIGF2cGFja2V0X3F1ZXVlX2VuZCgmY3R4LT5xdWV1ZSk7CiAKICAgICBhdl9mcmVlcCgmY2N0eC0+Y3R4KTsKQEAgLTQzOSwxNiArOTEwLDE0IEBACiAKIGF2X2NvbGQgaW50IGZmX2RlY2tsaW5rX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCiB7Ci0gICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKWF2Y3R4LT5wcml2X2RhdGE7CiAgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4OwotICAgIElEZWNrTGlua0Rpc3BsYXlNb2RlSXRlcmF0b3IgKml0ZXJtb2RlOwotICAgIElEZWNrTGlua0l0ZXJhdG9yICppdGVyOwotICAgIElEZWNrTGluayAqZGwgPSBOVUxMOwogICAgIEFWU3RyZWFtICpzdDsKICAgICBIUkVTVUxUIHJlc3VsdDsKICAgICBjaGFyIGZuYW1lWzEwMjRdOwogICAgIGNoYXIgKnRtcDsKICAgICBpbnQgbW9kZV9udW0gPSAwOworICAgIGludCByZXQ7CiAKICAgICBjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgZGVja2xpbmtfY3R4KSk7CiAgICAgaWYgKCFjdHgpCkBAIC00NTcsMTUgKzkyNiwxNyBAQAogICAgIGN0eC0+bGlzdF9mb3JtYXRzID0gY2N0eC0+bGlzdF9mb3JtYXRzOwogICAgIGN0eC0+dGVsZXRleHRfbGluZXMgPSBjY3R4LT50ZWxldGV4dF9saW5lczsKICAgICBjdHgtPnByZXJvbGwgICAgICA9IGNjdHgtPnByZXJvbGw7CisgICAgY3R4LT5kdXBsZXhfbW9kZSAgPSBjY3R4LT5kdXBsZXhfbW9kZTsKKyAgICBpZiAoY2N0eC0+dmlkZW9faW5wdXQgPiAwICYmICh1bnNpZ25lZCBpbnQpY2N0eC0+dmlkZW9faW5wdXQgPCBGRl9BUlJBWV9FTEVNUyhkZWNrbGlua192aWRlb19jb25uZWN0aW9uX21hcCkpCisgICAgICAgIGN0eC0+dmlkZW9faW5wdXQgPSBkZWNrbGlua192aWRlb19jb25uZWN0aW9uX21hcFtjY3R4LT52aWRlb19pbnB1dF07CisgICAgaWYgKGNjdHgtPmF1ZGlvX2lucHV0ID4gMCAmJiAodW5zaWduZWQgaW50KWNjdHgtPmF1ZGlvX2lucHV0IDwgRkZfQVJSQVlfRUxFTVMoZGVja2xpbmtfYXVkaW9fY29ubmVjdGlvbl9tYXApKQorICAgICAgICBjdHgtPmF1ZGlvX2lucHV0ID0gZGVja2xpbmtfYXVkaW9fY29ubmVjdGlvbl9tYXBbY2N0eC0+YXVkaW9faW5wdXRdOworICAgIGN0eC0+YXVkaW9fcHRzX3NvdXJjZSA9IGNjdHgtPmF1ZGlvX3B0c19zb3VyY2U7CisgICAgY3R4LT52aWRlb19wdHNfc291cmNlID0gY2N0eC0+dmlkZW9fcHRzX3NvdXJjZTsKKyAgICBjdHgtPmRyYXdfYmFycyA9IGNjdHgtPmRyYXdfYmFyczsKKyAgICBjdHgtPmF1ZGlvX2RlcHRoID0gY2N0eC0+YXVkaW9fZGVwdGg7CiAgICAgY2N0eC0+Y3R4ID0gY3R4OwogCi0jaWYgIUNPTkZJR19MSUJaVkJJCi0gICAgaWYgKGN0eC0+dGVsZXRleHRfbGluZXMpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJMaWJ6dmJpIHN1cHBvcnQgaXMgbmVlZGVkIGZvciBjYXB0dXJpbmcgdGVsZXRleHQsIHBsZWFzZSByZWNvbXBpbGUgRkZtcGVnLlxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Ci0gICAgfQotI2VuZGlmCi0KICAgICAvKiBDaGVjayBhdWRpbyBjaGFubmVsIG9wdGlvbiBmb3IgdmFsaWQgdmFsdWVzOiAyLCA4IG9yIDE2ICovCiAgICAgc3dpdGNoIChjY3R4LT5hdWRpb19jaGFubmVscykgewogICAgICAgICBjYXNlIDI6CkBAIC00NzcsMTA3ICs5NDgsMTYzIEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIGl0ZXIgPSBDcmVhdGVEZWNrTGlua0l0ZXJhdG9ySW5zdGFuY2UoKTsKLSAgICBpZiAoIWl0ZXIpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIERlY2tMaW5rIGl0ZXJhdG9yXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAvKiBDaGVjayBhdWRpbyBiaXQgZGVwdGggb3B0aW9uIGZvciB2YWxpZCB2YWx1ZXM6IDE2IG9yIDMyICovCisgICAgc3dpdGNoIChjY3R4LT5hdWRpb19kZXB0aCkgeworICAgICAgICBjYXNlIDE2OgorICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlZhbHVlIGZvciBhdWRpbyBiaXQgZGVwdGggb3B0aW9uIG11c3QgYmUgZWl0aGVyIDE2IG9yIDMyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCiAgICAgLyogTGlzdCBhdmFpbGFibGUgZGV2aWNlcy4gKi8KICAgICBpZiAoY3R4LT5saXN0X2RldmljZXMpIHsKLSAgICAgICAgZmZfZGVja2xpbmtfbGlzdF9kZXZpY2VzKGF2Y3R4KTsKKyAgICAgICAgZmZfZGVja2xpbmtfbGlzdF9kZXZpY2VzX2xlZ2FjeShhdmN0eCwgMSwgMCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CiAgICAgfQogCi0gICAgc3RyY3B5IChmbmFtZSwgYXZjdHgtPmZpbGVuYW1lKTsKKyAgICBpZiAoY2N0eC0+djIxMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiVGhlIGJtX3YyMTAgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgLXJhd19mb3JtYXQgeXV2NDIycDEwLlxuIik7CisgICAgICAgIGNjdHgtPnJhd19mb3JtYXQgPSBNS0JFVEFHKCd2JywnMicsJzEnLCcwJyk7CisgICAgfQorCisgICAgYXZfc3RybGNweShmbmFtZSwgYXZjdHgtPnVybCwgc2l6ZW9mKGZuYW1lKSk7CiAgICAgdG1wPXN0cmNociAoZm5hbWUsICdAJyk7CiAgICAgaWYgKHRtcCAhPSBOVUxMKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGUgQG1vZGUgc3ludGF4IGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZC4gUGxlYXNlIHVzZSB0aGUgLWZvcm1hdF9jb2RlIG9wdGlvbi5cbiIpOwogICAgICAgICBtb2RlX251bSA9IGF0b2kgKHRtcCsxKTsKICAgICAgICAgKnRtcCA9IDA7CiAgICAgfQogCi0gICAgLyogT3BlbiBkZXZpY2UuICovCi0gICAgd2hpbGUgKGl0ZXItPk5leHQoJmRsKSA9PSBTX09LKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmRpc3BsYXlOYW1lOwotICAgICAgICBmZl9kZWNrbGlua19nZXRfZGlzcGxheV9uYW1lKGRsLCAmZGlzcGxheU5hbWUpOwotICAgICAgICBpZiAoIXN0cmNtcChmbmFtZSwgZGlzcGxheU5hbWUpKSB7Ci0gICAgICAgICAgICBhdl9mcmVlKCh2b2lkICopIGRpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIGN0eC0+ZGwgPSBkbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyZWUoKHZvaWQgKikgZGlzcGxheU5hbWUpOwotICAgICAgICBkbC0+UmVsZWFzZSgpOwotICAgIH0KLSAgICBpdGVyLT5SZWxlYXNlKCk7Ci0gICAgaWYgKCFjdHgtPmRsKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gJyVzJ1xuIiwgZm5hbWUpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgIH0KKyAgICByZXQgPSBmZl9kZWNrbGlua19pbml0X2RldmljZShhdmN0eCwgZm5hbWUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgLyogR2V0IGlucHV0IGRldmljZS4gKi8KICAgICBpZiAoY3R4LT5kbC0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEZWNrTGlua0lucHV0LCAodm9pZCAqKikgJmN0eC0+ZGxpKSAhPSBTX09LKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gb3V0cHV0IGRldmljZSBmcm9tICclcydcbiIsCi0gICAgICAgICAgICAgICBhdmN0eC0+ZmlsZW5hbWUpOwotICAgICAgICBjdHgtPmRsLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gaW5wdXQgZGV2aWNlIGZyb20gJyVzJ1xuIiwKKyAgICAgICAgICAgICAgIGF2Y3R4LT51cmwpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgLyogTGlzdCBzdXBwb3J0ZWQgZm9ybWF0cy4gKi8KICAgICBpZiAoY3R4LT5saXN0X2Zvcm1hdHMpIHsKICAgICAgICAgZmZfZGVja2xpbmtfbGlzdF9mb3JtYXRzKGF2Y3R4LCBESVJFQ1RJT05fSU4pOwotICAgICAgICBjdHgtPmRsaS0+UmVsZWFzZSgpOwotICAgICAgICBjdHgtPmRsLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhJVDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBpZiAoY3R4LT5kbGktPkdldERpc3BsYXlNb2RlSXRlcmF0b3IoJml0ZXJtb2RlKSAhPSBTX09LKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBEaXNwbGF5IE1vZGUgSXRlcmF0b3JcbiIpOwotICAgICAgICBjdHgtPmRsLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgaWYgKGZmX2RlY2tsaW5rX3NldF9jb25maWdzKGF2Y3R4LCBESVJFQ1RJT05fSU4pIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzZXQgaW5wdXQgY29uZmlndXJhdGlvblxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBpZiAobW9kZV9udW0gPiAwKSB7Ci0gICAgICAgIGlmIChmZl9kZWNrbGlua19zZXRfZm9ybWF0KGF2Y3R4LCBESVJFQ1RJT05fSU4sIG1vZGVfbnVtKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHNldCBtb2RlICVkIGZvciAlc1xuIiwgbW9kZV9udW0sIGZuYW1lKTsKKyAgICBjdHgtPmlucHV0X2NhbGxiYWNrID0gbmV3IGRlY2tsaW5rX2lucHV0X2NhbGxiYWNrKGF2Y3R4KTsKKyAgICBjdHgtPmRsaS0+U2V0Q2FsbGJhY2soY3R4LT5pbnB1dF9jYWxsYmFjayk7CisKKyAgICBpZiAobW9kZV9udW0gPT0gMCAmJiAhY2N0eC0+Zm9ybWF0X2NvZGUpIHsKKyAgICAgICAgaWYgKGRlY2tsaW5rX2F1dG9kZXRlY3QoY2N0eCkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBBdXRvZGV0ZWN0IGlucHV0IHN0cmVhbSBvciBObyBzaWduYWxcbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQXV0b2RldGVjdGVkIHRoZSBpbnB1dCBtb2RlXG4iKTsKKyAgICB9CisgICAgaWYgKGZmX2RlY2tsaW5rX3NldF9mb3JtYXQoYXZjdHgsIERJUkVDVElPTl9JTiwgbW9kZV9udW0pIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzZXQgbW9kZSBudW1iZXIgJWQgb3IgZm9ybWF0IGNvZGUgJXMgZm9yICVzXG4iLAorICAgICAgICAgICAgbW9kZV9udW0sIChjY3R4LT5mb3JtYXRfY29kZSkgPyBjY3R4LT5mb3JtYXRfY29kZSA6ICIodW5zZXQpIiwgZm5hbWUpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgaXRlcm1vZGUtPlJlbGVhc2UoKTsKKyNpZiAhQ09ORklHX0xJQlpWQkkKKyAgICBpZiAoY3R4LT50ZWxldGV4dF9saW5lcyAmJiBjdHgtPmJtZF9tb2RlID09IGJtZE1vZGVQQUwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJMaWJ6dmJpIHN1cHBvcnQgaXMgbmVlZGVkIGZvciBjYXB0dXJpbmcgU0QgUEFMIHRlbGV0ZXh0LCBwbGVhc2UgcmVjb21waWxlIEZGbXBlZy5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorI2VuZGlmCiAKICAgICAvKiBTZXR1cCBzdHJlYW1zLiAqLwogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmN0eCwgTlVMTCk7CiAgICAgaWYgKCFzdCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhZGQgc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGJtZEF1ZGlvU2FtcGxlUmF0ZTQ4a0h6OwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBjY3R4LT5hdWRpb19jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBjY3R4LT5hdWRpb19kZXB0aCA9PSAzMiA/IEFWX0NPREVDX0lEX1BDTV9TMzJMRSA6IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYm1kQXVkaW9TYW1wbGVSYXRlNDhrSHo7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGNjdHgtPmF1ZGlvX2NoYW5uZWxzOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgIC8qIDY0IGJpdHMgcHRzIGluIHVzICovCiAgICAgY3R4LT5hdWRpb19zdD1zdDsKIAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmN0eCwgTlVMTCk7CiAgICAgaWYgKCFzdCkgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhZGQgc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICAgPSBjdHgtPmJtZF93aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgID0gY3R4LT5ibWRfaGVpZ2h0OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgICA9IGN0eC0+Ym1kX3dpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICAgPSBjdHgtPmJtZF9oZWlnaHQ7CiAKLSAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5kZW4gICAgICA9IGN0eC0+Ym1kX3RiX2RlbjsKLSAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0gICAgICA9IGN0eC0+Ym1kX3RiX251bTsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKHN0LT5jb2RlYy0+cGl4X2ZtdCwgY3R4LT5ibWRfd2lkdGgsIGN0eC0+Ym1kX2hlaWdodCwgMSkgKiAxL2F2X3EyZChzdC0+Y29kZWMtPnRpbWVfYmFzZSkgKiA4OworICAgIHN0LT50aW1lX2Jhc2UuZGVuICAgICAgPSBjdHgtPmJtZF90Yl9kZW47CisgICAgc3QtPnRpbWVfYmFzZS5udW0gICAgICA9IGN0eC0+Ym1kX3RiX251bTsKKyAgICBzdC0+cl9mcmFtZV9yYXRlICAgICAgID0gYXZfbWFrZV9xKHN0LT50aW1lX2Jhc2UuZGVuLCBzdC0+dGltZV9iYXNlLm51bSk7CiAKLSAgICBpZiAoY2N0eC0+djIxMCkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfVjIxMDsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IE1LVEFHKCdWJywgJzInLCAnMScsICcwJyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOwotICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgICAgID0gQVZfUElYX0ZNVF9VWVZZNDIyOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgID0gTUtUQUcoJ1UnLCAnWScsICdWJywgJ1knKTsKKyAgICBzd2l0Y2goKEJNRFBpeGVsRm9ybWF0KWNjdHgtPnJhd19mb3JtYXQpIHsKKyAgICBjYXNlIGJtZEZvcm1hdDhCaXRZVVY6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICA9IE1LVEFHKCdVJywgJ1knLCAnVicsICdZJyk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICAgPSBBVl9QSVhfRk1UX1VZVlk0MjI7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgICAgPSBhdl9yZXNjYWxlKGN0eC0+Ym1kX3dpZHRoICogY3R4LT5ibWRfaGVpZ2h0ICogMTYsIHN0LT50aW1lX2Jhc2UuZGVuLCBzdC0+dGltZV9iYXNlLm51bSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgYm1kRm9ybWF0MTBCaXRZVVY6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9WMjEwOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgID0gTUtUQUcoJ1YnLCcyJywnMScsJzAnKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICA9IGF2X3Jlc2NhbGUoY3R4LT5ibWRfd2lkdGggKiBjdHgtPmJtZF9oZWlnaHQgKiA2NCwgc3QtPnRpbWVfYmFzZS5kZW4sIHN0LT50aW1lX2Jhc2UubnVtICogMyk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgYm1kRm9ybWF0OEJpdEFSR0I6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICA9IGF2Y29kZWNfcGl4X2ZtdF90b19jb2RlY190YWcoKGVudW0gQVZQaXhlbEZvcm1hdClzdC0+Y29kZWNwYXItPmZvcm1hdCk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICAgPSBBVl9QSVhfRk1UXzBSR0I7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgICAgPSBhdl9yZXNjYWxlKGN0eC0+Ym1kX3dpZHRoICogY3R4LT5ibWRfaGVpZ2h0ICogMzIsIHN0LT50aW1lX2Jhc2UuZGVuLCBzdC0+dGltZV9iYXNlLm51bSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgYm1kRm9ybWF0OEJpdEJHUkE6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICA9IGF2Y29kZWNfcGl4X2ZtdF90b19jb2RlY190YWcoKGVudW0gQVZQaXhlbEZvcm1hdClzdC0+Y29kZWNwYXItPmZvcm1hdCk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICAgPSBBVl9QSVhfRk1UX0JHUjA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgICAgPSBhdl9yZXNjYWxlKGN0eC0+Ym1kX3dpZHRoICogY3R4LT5ibWRfaGVpZ2h0ICogMzIsIHN0LT50aW1lX2Jhc2UuZGVuLCBzdC0+dGltZV9iYXNlLm51bSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgYm1kRm9ybWF0MTBCaXRSR0I6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9SMjEwOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgID0gTUtUQUcoJ1InLCcyJywnMScsJzAnKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgICAgICA9IEFWX1BJWF9GTVRfUkdCNDhMRTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICA9IGF2X3Jlc2NhbGUoY3R4LT5ibWRfd2lkdGggKiBjdHgtPmJtZF9oZWlnaHQgKiAzMCwgc3QtPnRpbWVfYmFzZS5kZW4sIHN0LT50aW1lX2Jhc2UubnVtKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJSYXcgRm9ybWF0ICUuNHMgbm90IHN1cHBvcnRlZFxuIiwgKGNoYXIqKSAmY2N0eC0+cmF3X2Zvcm1hdCk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGN0eC0+Ym1kX2ZpZWxkX2RvbWluYW5jZSkgeworICAgIGNhc2UgYm1kVXBwZXJGaWVsZEZpcnN0OgorICAgICAgICBzdC0+Y29kZWNwYXItPmZpZWxkX29yZGVyID0gQVZfRklFTERfVFQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgYm1kTG93ZXJGaWVsZEZpcnN0OgorICAgICAgICBzdC0+Y29kZWNwYXItPmZpZWxkX29yZGVyID0gQVZfRklFTERfQkI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgYm1kUHJvZ3Jlc3NpdmVGcmFtZToKKyAgICBjYXNlIGJtZFByb2dyZXNzaXZlU2VnbWVudGVkRnJhbWU6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9QUk9HUkVTU0lWRTsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAgLyogNjQgYml0cyBwdHMgaW4gdXMgKi8KQEAgLTU4OCw2NSArMTExNSw2NCBAQAogICAgICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOwogICAgICAgICBpZiAoIXN0KSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhZGQgc3RyZWFtXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKLSAgICAgICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuICAgICAgPSBjdHgtPmJtZF90Yl9kZW47Ci0gICAgICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlLm51bSAgICAgID0gY3R4LT5ibWRfdGJfbnVtOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICBzdC0+dGltZV9iYXNlLmRlbiAgICAgICAgID0gY3R4LT5ibWRfdGJfZGVuOworICAgICAgICBzdC0+dGltZV9iYXNlLm51bSAgICAgICAgID0gY3R4LT5ibWRfdGJfbnVtOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUOwogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMCk7ICAvKiA2NCBiaXRzIHB0cyBpbiB1cyAqLwogICAgICAgICBjdHgtPnRlbGV0ZXh0X3N0ID0gc3Q7CiAgICAgfQogCi0gICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlVzaW5nICVkIGlucHV0IGF1ZGlvIGNoYW5uZWxzXG4iLCBjdHgtPmF1ZGlvX3N0LT5jb2RlYy0+Y2hhbm5lbHMpOwotICAgIHJlc3VsdCA9IGN0eC0+ZGxpLT5FbmFibGVBdWRpb0lucHV0KGJtZEF1ZGlvU2FtcGxlUmF0ZTQ4a0h6LCBibWRBdWRpb1NhbXBsZVR5cGUxNmJpdEludGVnZXIsIGN0eC0+YXVkaW9fc3QtPmNvZGVjLT5jaGFubmVscyk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfVkVSQk9TRSwgIlVzaW5nICVkIGlucHV0IGF1ZGlvIGNoYW5uZWxzXG4iLCBjdHgtPmF1ZGlvX3N0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpOworICAgIHJlc3VsdCA9IGN0eC0+ZGxpLT5FbmFibGVBdWRpb0lucHV0KGJtZEF1ZGlvU2FtcGxlUmF0ZTQ4a0h6LCBjY3R4LT5hdWRpb19kZXB0aCA9PSAzMiA/IGJtZEF1ZGlvU2FtcGxlVHlwZTMyYml0SW50ZWdlciA6IGJtZEF1ZGlvU2FtcGxlVHlwZTE2Yml0SW50ZWdlciwgY3R4LT5hdWRpb19zdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKIAogICAgIGlmIChyZXN1bHQgIT0gU19PSykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBlbmFibGUgYXVkaW8gaW5wdXRcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgcmVzdWx0ID0gY3R4LT5kbGktPkVuYWJsZVZpZGVvSW5wdXQoY3R4LT5ibWRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY3R4LT52MjEwID8gYm1kRm9ybWF0MTBCaXRZVVYgOiBibWRGb3JtYXQ4Qml0WVVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCTURQaXhlbEZvcm1hdCkgY2N0eC0+cmF3X2Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibWRWaWRlb0lucHV0RmxhZ0RlZmF1bHQpOwogCiAgICAgaWYgKHJlc3VsdCAhPSBTX09LKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGVuYWJsZSB2aWRlbyBpbnB1dFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICBhdnBhY2tldF9xdWV1ZV9pbml0IChhdmN0eCwgJmN0eC0+cXVldWUpOwogCi0gICAgaWYgKGRlY2tsaW5rX3N0YXJ0X2lucHV0IChhdmN0eCkgIT0gU19PSykgeworICAgIGlmIChjdHgtPmRsaS0+U3RhcnRTdHJlYW1zKCkgIT0gU19PSykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBzdGFydCBpbnB1dCBzdHJlYW1cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiAKIGVycm9yOgotCi0gICAgY3R4LT5kbGktPlJlbGVhc2UoKTsKLSAgICBjdHgtPmRsLT5SZWxlYXNlKCk7Ci0KLSAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIGZmX2RlY2tsaW5rX2NsZWFudXAoYXZjdHgpOworICAgIHJldHVybiByZXQ7CiB9CiAKIGludCBmZl9kZWNrbGlua19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KQogewotICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgY2N0eC0+Y3R4OwotICAgIEFWRnJhbWUgKmZyYW1lID0gY3R4LT52aWRlb19zdC0+Y29kZWMtPmNvZGVkX2ZyYW1lOworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKWNjdHgtPmN0eDsKIAogICAgIGF2cGFja2V0X3F1ZXVlX2dldCgmY3R4LT5xdWV1ZSwgcGt0LCAxKTsKLSAgICBpZiAoZnJhbWUgJiYgKGN0eC0+Ym1kX2ZpZWxkX2RvbWluYW5jZSA9PSBibWRVcHBlckZpZWxkRmlyc3QgfHwgY3R4LT5ibWRfZmllbGRfZG9taW5hbmNlID09IGJtZExvd2VyRmllbGRGaXJzdCkpIHsKLSAgICAgICAgZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSAxOwotICAgICAgICBpZiAoY3R4LT5ibWRfZmllbGRfZG9taW5hbmNlID09IGJtZFVwcGVyRmllbGRGaXJzdCkgewotICAgICAgICAgICAgZnJhbWUtPnRvcF9maWVsZF9maXJzdCA9IDE7Ci0gICAgICAgIH0KLSAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IGZmX2RlY2tsaW5rX2xpc3RfaW5wdXRfZGV2aWNlcyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBzdHJ1Y3QgQVZEZXZpY2VJbmZvTGlzdCAqZGV2aWNlX2xpc3QpCit7CisgICAgcmV0dXJuIGZmX2RlY2tsaW5rX2xpc3RfZGV2aWNlcyhhdmN0eCwgZGV2aWNlX2xpc3QsIDEsIDApOworfQorCiB9IC8qIGV4dGVybiAiQyIgKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2RlYy5oIGIvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjLmgKaW5kZXggYzAyMzQ0ZS4uZmJmYmU2MiAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjLmgKKysrIGIvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogQmxhY2ttYWdpYyBEZWNrTGluayBvdXRwdXQKKyAqIEJsYWNrbWFnaWMgRGVja0xpbmsgaW5wdXQKICAqIENvcHlyaWdodCAoYykgMjAxMy0yMDE0IFJhbWlybyBQb2xsYQogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KQEAgLTI5LDYgKzI5LDcgQEAKIGludCBmZl9kZWNrbGlua19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4KTsKIGludCBmZl9kZWNrbGlua19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KTsKIGludCBmZl9kZWNrbGlua19yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpOworaW50IGZmX2RlY2tsaW5rX2xpc3RfaW5wdXRfZGV2aWNlcyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBzdHJ1Y3QgQVZEZXZpY2VJbmZvTGlzdCAqZGV2aWNlX2xpc3QpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gLyogZXh0ZXJuICJDIiAqLwpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjX2MuYyBiL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2RlY19jLmMKaW5kZXggNDBjMjFhNy4uNDcwMThkYyAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvZGVja2xpbmtfZGVjX2MuYworKysgYi9saWJhdmRldmljZS9kZWNrbGlua19kZWNfYy5jCkBAIC0xLDYgKzEsNyBAQAogLyoKLSAqIEJsYWNrbWFnaWMgRGVja0xpbmsgb3V0cHV0CisgKiBCbGFja21hZ2ljIERlY2tMaW5rIGlucHV0CiAgKiBDb3B5cmlnaHQgKGMpIDIwMTQgRGV0aSBGbGllZ2wKKyAqIENvcHlyaWdodCAoYykgMjAxNyBBa2FtYWkgVGVjaG5vbG9naWVzLCBJbmMuCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTMxLDExICszMiw0OSBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICB7ICJsaXN0X2RldmljZXMiLCAibGlzdCBhdmFpbGFibGUgZGV2aWNlcyIgICwgT0ZGU0VUKGxpc3RfZGV2aWNlcyksIEFWX09QVF9UWVBFX0lOVCAgICwgeyAuaTY0ID0gMCAgIH0sIDAsIDEsIERFQyB9LAogICAgIHsgImxpc3RfZm9ybWF0cyIsICJsaXN0IHN1cHBvcnRlZCBmb3JtYXRzIiAgLCBPRkZTRVQobGlzdF9mb3JtYXRzKSwgQVZfT1BUX1RZUEVfSU5UICAgLCB7IC5pNjQgPSAwICAgfSwgMCwgMSwgREVDIH0sCisgICAgeyAiZm9ybWF0X2NvZGUiLCAgInNldCBmb3JtYXQgYnkgZm91cmNjIiAgICAsIE9GRlNFVChmb3JtYXRfY29kZSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEx9LCAwLCAwLCBERUMgfSwKICAgICB7ICJibV92MjEwIiwgICAgICAidjIxMCAxMCBiaXQgcGVyIGNoYW5uZWwiICwgT0ZGU0VUKHYyMTApLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCAgICwgeyAuaTY0ID0gMCAgIH0sIDAsIDEsIERFQyB9LAorICAgIHsgInJhd19mb3JtYXQiLCAgICJwaXhlbCBmb3JtYXQgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIGNhcmQgd2hlbiBjYXB0dXJpbmciICwgT0ZGU0VUKHJhd19mb3JtYXQpLCAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBNS0JFVEFHKCcyJywndicsJ3UnLCd5Jyl9LCAwLCBVSU5UX01BWCwgREVDLCAicmF3X2Zvcm1hdCIgfSwKKyAgICB7ICJ1eXZ5NDIyIiwgICAgICAgTlVMTCwgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE1LQkVUQUcoJzInLCd2JywndScsJ3knKSB9LCAwLCAwLCBERUMsICJyYXdfZm9ybWF0In0sCisgICAgeyAieXV2NDIycDEwIiwgICAgIE5VTEwsICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBNS0JFVEFHKCd2JywnMicsJzEnLCcwJykgfSwgMCwgMCwgREVDLCAicmF3X2Zvcm1hdCJ9LAorICAgIHsgImFyZ2IiLCAgICAgICAgICBOVUxMLCAgIDAsICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMzIgICAgICAgICAgICAgICAgICAgICAgIH0sIDAsIDAsIERFQywgInJhd19mb3JtYXQifSwKKyAgICB7ICJiZ3JhIiwgICAgICAgICAgTlVMTCwgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE1LQkVUQUcoJ0InLCdHJywnUicsJ0EnKSB9LCAwLCAwLCBERUMsICJyYXdfZm9ybWF0In0sCisgICAgeyAicmdiMTAiLCAgICAgICAgIE5VTEwsICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBNS0JFVEFHKCdyJywnMicsJzEnLCcwJykgfSwgMCwgMCwgREVDLCAicmF3X2Zvcm1hdCJ9LAogICAgIHsgInRlbGV0ZXh0X2xpbmVzIiwgInRlbGV0ZXh0IGxpbmVzIGJpdG1hc2siLCBPRkZTRVQodGVsZXRleHRfbGluZXMpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gMCAgIH0sIDAsIDB4N2ZmZmZmZmZmTEwsIERFQywgInRlbGV0ZXh0X2xpbmVzIn0sCiAgICAgeyAic3RhbmRhcmQiLCAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAweDdmZmY5ZmZmZUxMfSwgMCwgMCwgICAgREVDLCAidGVsZXRleHRfbGluZXMifSwKICAgICB7ICJhbGwiLCAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDB4N2ZmZmZmZmZmTEx9LCAwLCAwLCAgICBERUMsICJ0ZWxldGV4dF9saW5lcyJ9LAogICAgIHsgImNoYW5uZWxzIiwgICAgICJudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMiLCBPRkZTRVQoYXVkaW9fY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9JTlQgLCB7IC5pNjQgPSAyICAgfSwgMiwgMTYsIERFQyB9LAorICAgIHsgImR1cGxleF9tb2RlIiwgICJkdXBsZXggbW9kZSIsICAgICAgICAgICAgICBPRkZTRVQoZHVwbGV4X21vZGUpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMH0sIDAsIDIsICAgIERFQywgImR1cGxleF9tb2RlIn0sCisgICAgeyAidW5zZXQiLCAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAwfSwgMCwgMCwgICAgREVDLCAiZHVwbGV4X21vZGUifSwKKyAgICB7ICJoYWxmIiwgICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDF9LCAwLCAwLCAgICBERUMsICJkdXBsZXhfbW9kZSJ9LAorICAgIHsgImZ1bGwiLCAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMn0sIDAsIDAsICAgIERFQywgImR1cGxleF9tb2RlIn0sCisgICAgeyAidmlkZW9faW5wdXQiLCAgInZpZGVvIGlucHV0IiwgICAgICAgICAgICAgIE9GRlNFVCh2aWRlb19pbnB1dCksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwfSwgMCwgNiwgICAgREVDLCAidmlkZW9faW5wdXQifSwKKyAgICB7ICJ1bnNldCIsICAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDB9LCAwLCAwLCAgICBERUMsICJ2aWRlb19pbnB1dCJ9LAorICAgIHsgInNkaSIsICAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMX0sIDAsIDAsICAgIERFQywgInZpZGVvX2lucHV0In0sCisgICAgeyAiaGRtaSIsICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAyfSwgMCwgMCwgICAgREVDLCAidmlkZW9faW5wdXQifSwKKyAgICB7ICJvcHRpY2FsX3NkaSIsICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDN9LCAwLCAwLCAgICBERUMsICJ2aWRlb19pbnB1dCJ9LAorICAgIHsgImNvbXBvbmVudCIsICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gNH0sIDAsIDAsICAgIERFQywgInZpZGVvX2lucHV0In0sCisgICAgeyAiY29tcG9zaXRlIiwgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSA1fSwgMCwgMCwgICAgREVDLCAidmlkZW9faW5wdXQifSwKKyAgICB7ICJzX3ZpZGVvIiwgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDZ9LCAwLCAwLCAgICBERUMsICJ2aWRlb19pbnB1dCJ9LAorICAgIHsgImF1ZGlvX2lucHV0IiwgICJhdWRpbyBpbnB1dCIsICAgICAgICAgICAgICBPRkZTRVQoYXVkaW9faW5wdXQpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gMH0sIDAsIDYsICAgIERFQywgImF1ZGlvX2lucHV0In0sCisgICAgeyAidW5zZXQiLCAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAwfSwgMCwgMCwgICAgREVDLCAiYXVkaW9faW5wdXQifSwKKyAgICB7ICJlbWJlZGRlZCIsICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDF9LCAwLCAwLCAgICBERUMsICJhdWRpb19pbnB1dCJ9LAorICAgIHsgImFlc19lYnUiLCAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMn0sIDAsIDAsICAgIERFQywgImF1ZGlvX2lucHV0In0sCisgICAgeyAiYW5hbG9nIiwgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAzfSwgMCwgMCwgICAgREVDLCAiYXVkaW9faW5wdXQifSwKKyAgICB7ICJhbmFsb2dfeGxyIiwgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IDR9LCAwLCAwLCAgICBERUMsICJhdWRpb19pbnB1dCJ9LAorICAgIHsgImFuYWxvZ19yY2EiLCAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gNX0sIDAsIDAsICAgIERFQywgImF1ZGlvX2lucHV0In0sCisgICAgeyAibWljcm9waG9uZSIsICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSA2fSwgMCwgMCwgICAgREVDLCAiYXVkaW9faW5wdXQifSwKKyAgICB7ICJhdWRpb19wdHMiLCAgICAgImF1ZGlvIHB0cyBzb3VyY2UiLCAgIE9GRlNFVChhdWRpb19wdHNfc291cmNlKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IFBUU19TUkNfQVVESU8gICAgfSwgMSwgUFRTX1NSQ19OQi0xLCBERUMsICJwdHNfc291cmNlIn0sCisgICAgeyAidmlkZW9fcHRzIiwgICAgICJ2aWRlbyBwdHMgc291cmNlIiwgICBPRkZTRVQodmlkZW9fcHRzX3NvdXJjZSksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSBQVFNfU1JDX1ZJREVPICAgIH0sIDEsIFBUU19TUkNfTkItMSwgREVDLCAicHRzX3NvdXJjZSJ9LAorICAgIHsgImF1ZGlvIiwgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFRTX1NSQ19BVURJTyAgICB9LCAwLCAwLCBERUMsICJwdHNfc291cmNlIn0sCisgICAgeyAidmlkZW8iLCAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQVFNfU1JDX1ZJREVPICAgIH0sIDAsIDAsIERFQywgInB0c19zb3VyY2UifSwKKyAgICB7ICJyZWZlcmVuY2UiLCAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFBUU19TUkNfUkVGRVJFTkNFfSwgMCwgMCwgREVDLCAicHRzX3NvdXJjZSJ9LAorICAgIHsgIndhbGxjbG9jayIsICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gUFRTX1NSQ19XQUxMQ0xPQ0t9LCAwLCAwLCBERUMsICJwdHNfc291cmNlIn0sCisgICAgeyAiYWJzX3dhbGxjbG9jayIsIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBQVFNfU1JDX0FCU19XQUxMQ0xPQ0t9LCAwLCAwLCBERUMsICJwdHNfc291cmNlIn0sCisgICAgeyAiZHJhd19iYXJzIiwgICAgICJkcmF3IGJhcnMgb24gc2lnbmFsIGxvc3MiICwgT0ZGU0VUKGRyYXdfYmFycyksICAgIEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAxfSwgMCwgMSwgREVDIH0sCisgICAgeyAicXVldWVfc2l6ZSIsICAgICJpbnB1dCBxdWV1ZSBidWZmZXIgc2l6ZSIsICAgT0ZGU0VUKHF1ZXVlX3NpemUpLCAgIEFWX09QVF9UWVBFX0lOVDY0LCB7IC5pNjQgPSAoMTAyNCAqIDEwMjQgKiAxMDI0KX0sIDAsIElOVDY0X01BWCwgREVDIH0sCisgICAgeyAiYXVkaW9fZGVwdGgiLCAgICJhdWRpbyBiaXRkZXB0aCAoMTYgb3IgMzIpIiwgT0ZGU0VUKGF1ZGlvX2RlcHRoKSwgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAxNn0sIDE2LCAzMiwgREVDIH0sCisgICAgeyAiZGVja2xpbmtfY29weXRzIiwgImNvcHkgdGltZXN0YW1wcywgZG8gbm90IHJlbW92ZSB0aGUgaW5pdGlhbCBvZmZzZXQiLCBPRkZTRVQoY29weXRzKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBERUMgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKQEAgLTUwLDkgKzg5LDEwIEBACiBBVklucHV0Rm9ybWF0IGZmX2RlY2tsaW5rX2RlbXV4ZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImRlY2tsaW5rIiwKICAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQmxhY2ttYWdpYyBEZWNrTGluayBpbnB1dCIpLAotICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSB8IEFWRk1UX1JBV1BJQ1RVUkUsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAogICAgIC5wcml2X2NsYXNzICAgICA9ICZkZWNrbGlua19kZW11eGVyX2NsYXNzLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZGVja2xpbmtfY2N0eCksCisgICAgLmdldF9kZXZpY2VfbGlzdCA9IGZmX2RlY2tsaW5rX2xpc3RfaW5wdXRfZGV2aWNlcywKICAgICAucmVhZF9oZWFkZXIgICA9IGZmX2RlY2tsaW5rX3JlYWRfaGVhZGVyLAogICAgIC5yZWFkX3BhY2tldCAgID0gZmZfZGVja2xpbmtfcmVhZF9wYWNrZXQsCiAgICAgLnJlYWRfY2xvc2UgICAgPSBmZl9kZWNrbGlua19yZWFkX2Nsb3NlLApkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvZGVja2xpbmtfZW5jLmNwcCBiL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuYy5jcHAKaW5kZXggNmM1NDUwZi4uMjhhYjkyOCAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvZGVja2xpbmtfZW5jLmNwcAorKysgYi9saWJhdmRldmljZS9kZWNrbGlua19lbmMuY3BwCkBAIC0xOSwxNSArMTksMjEgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSA8RGVja0xpbmtBUEkuaD4KKyNpbmNsdWRlIDxhdG9taWM+Cit1c2luZyBzdGQ6OmF0b21pYzsKIAotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKy8qIEluY2x1ZGUgaW50ZXJuYWwuaCBmaXJzdCB0byBhdm9pZCBjb25mbGljdCBiZXR3ZWVuIHdpbnNvY2suaCAodXNlZCBieQorICogRGVja0xpbmsgaGVhZGVycykgYW5kIHdpbnNvY2syLmggKHVzZWQgYnkgbGliYXZmb3JtYXQpIGluIE1TVkMrKyBidWlsZHMgKi8KK2V4dGVybiAiQyIgeworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCit9CisKKyNpbmNsdWRlIDxEZWNrTGlua0FQSS5oPgogCiBleHRlcm4gIkMiIHsKICNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgotI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZkZXZpY2UuaCIKIH0KIAogI2luY2x1ZGUgImRlY2tsaW5rX2NvbW1vbi5oIgpAQCAtMzgsMzMgKzQ0LDczIEBACiBjbGFzcyBkZWNrbGlua19mcmFtZSA6IHB1YmxpYyBJRGVja0xpbmtWaWRlb0ZyYW1lCiB7CiBwdWJsaWM6Ci0gICAgZGVja2xpbmtfZnJhbWUoc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4LCBBVkZyYW1lICphdmZyYW1lLCBsb25nIHdpZHRoLAotICAgICAgICAgICAgICAgICAgIGxvbmcgaGVpZ2h0LCB2b2lkICpidWZmZXIpIDoKLSAgICAgICAgICAgICAgICAgICBfY3R4KGN0eCksIF9hdmZyYW1lKGF2ZnJhbWUpLCBfd2lkdGgod2lkdGgpLAotICAgICAgICAgICAgICAgICAgIF9oZWlnaHQoaGVpZ2h0KSwgX2J1ZmZlcihidWZmZXIpLCBfcmVmcygwKSB7IH0KKyAgICBkZWNrbGlua19mcmFtZShzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHgsIEFWRnJhbWUgKmF2ZnJhbWUsIEFWQ29kZWNJRCBjb2RlY19pZCwgaW50IGhlaWdodCwgaW50IHdpZHRoKSA6CisgICAgICAgIF9jdHgoY3R4KSwgX2F2ZnJhbWUoYXZmcmFtZSksIF9hdnBhY2tldChOVUxMKSwgX2NvZGVjX2lkKGNvZGVjX2lkKSwgX2hlaWdodChoZWlnaHQpLCBfd2lkdGgod2lkdGgpLCAgX3JlZnMoMSkgeyB9CisgICAgZGVja2xpbmtfZnJhbWUoc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4LCBBVlBhY2tldCAqYXZwYWNrZXQsIEFWQ29kZWNJRCBjb2RlY19pZCwgaW50IGhlaWdodCwgaW50IHdpZHRoKSA6CisgICAgICAgIF9jdHgoY3R4KSwgX2F2ZnJhbWUoTlVMTCksIF9hdnBhY2tldChhdnBhY2tldCksIF9jb2RlY19pZChjb2RlY19pZCksIF9oZWlnaHQoaGVpZ2h0KSwgX3dpZHRoKHdpZHRoKSwgX3JlZnMoMSkgeyB9CiAKICAgICB2aXJ0dWFsIGxvbmcgICAgICAgICAgIFNURE1FVEhPRENBTExUWVBFIEdldFdpZHRoICAgICAgKHZvaWQpICAgICAgICAgIHsgcmV0dXJuIF93aWR0aDsgfQogICAgIHZpcnR1YWwgbG9uZyAgICAgICAgICAgU1RETUVUSE9EQ0FMTFRZUEUgR2V0SGVpZ2h0ICAgICAodm9pZCkgICAgICAgICAgeyByZXR1cm4gX2hlaWdodDsgfQotICAgIHZpcnR1YWwgbG9uZyAgICAgICAgICAgU1RETUVUSE9EQ0FMTFRZUEUgR2V0Um93Qnl0ZXMgICAodm9pZCkgICAgICAgICAgeyByZXR1cm4gX3dpZHRoPDwxOyB9Ci0gICAgdmlydHVhbCBCTURQaXhlbEZvcm1hdCBTVERNRVRIT0RDQUxMVFlQRSBHZXRQaXhlbEZvcm1hdCh2b2lkKSAgICAgICAgICB7IHJldHVybiBibWRGb3JtYXQ4Qml0WVVWOyB9Ci0gICAgdmlydHVhbCBCTURGcmFtZUZsYWdzICBTVERNRVRIT0RDQUxMVFlQRSBHZXRGbGFncyAgICAgICh2b2lkKSAgICAgICAgICB7IHJldHVybiBibWRWaWRlb091dHB1dEZsYWdEZWZhdWx0OyB9Ci0gICAgdmlydHVhbCBIUkVTVUxUICAgICAgICBTVERNRVRIT0RDQUxMVFlQRSBHZXRCeXRlcyAgICAgICh2b2lkICoqYnVmZmVyKSB7ICpidWZmZXIgPSBfYnVmZmVyOyByZXR1cm4gU19PSzsgfQorICAgIHZpcnR1YWwgbG9uZyAgICAgICAgICAgU1RETUVUSE9EQ0FMTFRZUEUgR2V0Um93Qnl0ZXMgICAodm9pZCkKKyAgICB7CisgICAgICBpZiAoX2NvZGVjX2lkID09IEFWX0NPREVDX0lEX1dSQVBQRURfQVZGUkFNRSkKKyAgICAgICAgICByZXR1cm4gX2F2ZnJhbWUtPmxpbmVzaXplWzBdIDwgMCA/IC1fYXZmcmFtZS0+bGluZXNpemVbMF0gOiBfYXZmcmFtZS0+bGluZXNpemVbMF07CisgICAgICBlbHNlCisgICAgICAgICAgcmV0dXJuICgoR2V0V2lkdGgoKSArIDQ3KSAvIDQ4KSAqIDEyODsKKyAgICB9CisgICAgdmlydHVhbCBCTURQaXhlbEZvcm1hdCBTVERNRVRIT0RDQUxMVFlQRSBHZXRQaXhlbEZvcm1hdCh2b2lkKQorICAgIHsKKyAgICAgICAgaWYgKF9jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XUkFQUEVEX0FWRlJBTUUpCisgICAgICAgICAgICByZXR1cm4gYm1kRm9ybWF0OEJpdFlVVjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIGJtZEZvcm1hdDEwQml0WVVWOworICAgIH0KKyAgICB2aXJ0dWFsIEJNREZyYW1lRmxhZ3MgIFNURE1FVEhPRENBTExUWVBFIEdldEZsYWdzICAgICAgKHZvaWQpCisgICAgeworICAgICAgIGlmIChfY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV1JBUFBFRF9BVkZSQU1FKQorICAgICAgICAgICByZXR1cm4gX2F2ZnJhbWUtPmxpbmVzaXplWzBdIDwgMCA/IGJtZEZyYW1lRmxhZ0ZsaXBWZXJ0aWNhbCA6IGJtZEZyYW1lRmxhZ0RlZmF1bHQ7CisgICAgICAgZWxzZQorICAgICAgICAgICByZXR1cm4gYm1kRnJhbWVGbGFnRGVmYXVsdDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIEhSRVNVTFQgICAgICAgIFNURE1FVEhPRENBTExUWVBFIEdldEJ5dGVzICAgICAgKHZvaWQgKipidWZmZXIpCisgICAgeworICAgICAgICBpZiAoX2NvZGVjX2lkID09IEFWX0NPREVDX0lEX1dSQVBQRURfQVZGUkFNRSkgeworICAgICAgICAgICAgaWYgKF9hdmZyYW1lLT5saW5lc2l6ZVswXSA8IDApCisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICh2b2lkICopKF9hdmZyYW1lLT5kYXRhWzBdICsgX2F2ZnJhbWUtPmxpbmVzaXplWzBdICogKF9hdmZyYW1lLT5oZWlnaHQgLSAxKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9ICh2b2lkICopKF9hdmZyYW1lLT5kYXRhWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpidWZmZXIgPSAodm9pZCAqKShfYXZwYWNrZXQtPmRhdGEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTX09LOworICAgIH0KIAogICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBHZXRUaW1lY29kZSAgICAgKEJNRFRpbWVjb2RlRm9ybWF0IGZvcm1hdCwgSURlY2tMaW5rVGltZWNvZGUgKip0aW1lY29kZSkgeyByZXR1cm4gU19GQUxTRTsgfQogICAgIHZpcnR1YWwgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBHZXRBbmNpbGxhcnlEYXRhKElEZWNrTGlua1ZpZGVvRnJhbWVBbmNpbGxhcnkgKiphbmNpbGxhcnkpICAgICAgICAgICAgICAgeyByZXR1cm4gU19GQUxTRTsgfQogCiAgICAgdmlydHVhbCBIUkVTVUxUIFNURE1FVEhPRENBTExUWVBFIFF1ZXJ5SW50ZXJmYWNlKFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KSB7IHJldHVybiBFX05PSU5URVJGQUNFOyB9CiAgICAgdmlydHVhbCBVTE9ORyAgIFNURE1FVEhPRENBTExUWVBFIEFkZFJlZih2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiArK19yZWZzOyB9Ci0gICAgdmlydHVhbCBVTE9ORyAgIFNURE1FVEhPRENBTExUWVBFIFJlbGVhc2Uodm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlmICghLS1fcmVmcykgZGVsZXRlIHRoaXM7IHJldHVybiBfcmVmczsgfQorICAgIHZpcnR1YWwgVUxPTkcgICBTVERNRVRIT0RDQUxMVFlQRSBSZWxlYXNlKHZvaWQpCisgICAgeworICAgICAgICBpbnQgcmV0ID0gLS1fcmVmczsKKyAgICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJl9hdmZyYW1lKTsKKyAgICAgICAgICAgIGF2X3BhY2tldF9mcmVlKCZfYXZwYWNrZXQpOworICAgICAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKICAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpfY3R4OwogICAgIEFWRnJhbWUgKl9hdmZyYW1lOworICAgIEFWUGFja2V0ICpfYXZwYWNrZXQ7CisgICAgQVZDb2RlY0lEIF9jb2RlY19pZDsKKyAgICBpbnQgX2hlaWdodDsKKyAgICBpbnQgX3dpZHRoOwogCiBwcml2YXRlOgotICAgIGxvbmcgIF93aWR0aDsKLSAgICBsb25nICBfaGVpZ2h0OwotICAgIHZvaWQgKl9idWZmZXI7Ci0gICAgaW50ICAgX3JlZnM7CisgICAgc3RkOjphdG9taWM8aW50PiAgX3JlZnM7CiB9OwogCiBjbGFzcyBkZWNrbGlua19vdXRwdXRfY2FsbGJhY2sgOiBwdWJsaWMgSURlY2tMaW5rVmlkZW9PdXRwdXRDYWxsYmFjawpAQCAtNzQsMTEgKzEyMCwxNiBAQAogICAgIHsKICAgICAgICAgZGVja2xpbmtfZnJhbWUgKmZyYW1lID0gc3RhdGljX2Nhc3Q8ZGVja2xpbmtfZnJhbWUgKj4oX2ZyYW1lKTsKICAgICAgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gZnJhbWUtPl9jdHg7Ci0gICAgICAgIEFWRnJhbWUgKmF2ZnJhbWUgPSBmcmFtZS0+X2F2ZnJhbWU7CiAKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmYXZmcmFtZSk7CisgICAgICAgIGlmIChmcmFtZS0+X2F2ZnJhbWUpCisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZS0+X2F2ZnJhbWUpOworICAgICAgICBpZiAoZnJhbWUtPl9hdnBhY2tldCkKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihmcmFtZS0+X2F2cGFja2V0KTsKIAotICAgICAgICBzZW1fcG9zdCgmY3R4LT5zZW1hcGhvcmUpOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmN0eC0+bXV0ZXgpOworICAgICAgICBjdHgtPmZyYW1lc19idWZmZXJfYXZhaWxhYmxlX3Nwb3RzKys7CisgICAgICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmN0eC0+Y29uZCk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjdHgtPm11dGV4KTsKIAogICAgICAgICByZXR1cm4gU19PSzsKICAgICB9CkBAIC05MCwyMyArMTQxLDM0IEBACiAKIHN0YXRpYyBpbnQgZGVja2xpbmtfc2V0dXBfdmlkZW8oQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZTdHJlYW0gKnN0KQogewotICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgY2N0eC0+Y3R4OwotICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPmNvZGVjOworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKWNjdHgtPmN0eDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqYyA9IHN0LT5jb2RlY3BhcjsKIAogICAgIGlmIChjdHgtPnZpZGVvKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBvbmUgdmlkZW8gc3RyZWFtIGlzIHN1cHBvcnRlZCFcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9VWVZZNDIyKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ISIKLSAgICAgICAgICAgICAgICIgT25seSBBVl9QSVhfRk1UX1VZVlk0MjIgaXMgc3VwcG9ydGVkLlxuIik7CisgICAgaWYgKGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dSQVBQRURfQVZGUkFNRSkgeworICAgICAgICBpZiAoYy0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfVVlWWTQyMikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQhIgorICAgICAgICAgICAgICAgICAgICIgT25seSBBVl9QSVhfRk1UX1VZVlk0MjIgaXMgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1YyMTApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2RlYyB0eXBlISIKKyAgICAgICAgICAgICAgICIgT25seSBWMjEwIGFuZCB3cmFwcGVkIGZyYW1lIHdpdGggQVZfUElYX0ZNVF9VWVZZNDIyIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChmZl9kZWNrbGlua19zZXRfY29uZmlncyhhdmN0eCwgRElSRUNUSU9OX09VVCkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHNldCBvdXRwdXQgY29uZmlndXJhdGlvblxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgaWYgKGZmX2RlY2tsaW5rX3NldF9mb3JtYXQoYXZjdHgsIGMtPndpZHRoLCBjLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+dGltZV9iYXNlLm51bSwgYy0+dGltZV9iYXNlLmRlbikpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCB2aWRlbyBzaXplIG9yIGZyYW1lcmF0ZSEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZS5udW0sIHN0LT50aW1lX2Jhc2UuZGVuLCBjLT5maWVsZF9vcmRlcikpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCB2aWRlbyBzaXplLCBmcmFtZXJhdGUgb3IgZmllbGQgb3JkZXIhIgogICAgICAgICAgICAgICAgIiBDaGVjayBhdmFpbGFibGUgZm9ybWF0cyB3aXRoIC1saXN0X2Zvcm1hdHMgMS5cbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTIwLDE4ICsxODIsMTkgQEAKICAgICBjdHgtPm91dHB1dF9jYWxsYmFjayA9IG5ldyBkZWNrbGlua19vdXRwdXRfY2FsbGJhY2soKTsKICAgICBjdHgtPmRsby0+U2V0U2NoZWR1bGVkRnJhbWVDb21wbGV0aW9uQ2FsbGJhY2soY3R4LT5vdXRwdXRfY2FsbGJhY2spOwogCi0gICAgLyogU3RhcnQgdmlkZW8gc2VtYXBob3JlLiAqLwotICAgIGN0eC0+ZnJhbWVzX3ByZXJvbGwgPSBjLT50aW1lX2Jhc2UuZGVuICogY3R4LT5wcmVyb2xsOwotICAgIGlmIChjLT50aW1lX2Jhc2UuZGVuID4gMTAwMCkKKyAgICBjdHgtPmZyYW1lc19wcmVyb2xsID0gc3QtPnRpbWVfYmFzZS5kZW4gKiBjdHgtPnByZXJvbGw7CisgICAgaWYgKHN0LT50aW1lX2Jhc2UuZGVuID4gMTAwMCkKICAgICAgICAgY3R4LT5mcmFtZXNfcHJlcm9sbCAvPSAxMDAwOwogCiAgICAgLyogQnVmZmVyIHR3aWNlIGFzIG1hbnkgZnJhbWVzIGFzIHRoZSBwcmVyb2xsLiAqLwogICAgIGN0eC0+ZnJhbWVzX2J1ZmZlciA9IGN0eC0+ZnJhbWVzX3ByZXJvbGwgKiAyOwogICAgIGN0eC0+ZnJhbWVzX2J1ZmZlciA9IEZGTUlOKGN0eC0+ZnJhbWVzX2J1ZmZlciwgNjApOwotICAgIHNlbV9pbml0KCZjdHgtPnNlbWFwaG9yZSwgMCwgY3R4LT5mcmFtZXNfYnVmZmVyKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmN0eC0+bXV0ZXgsIE5VTEwpOworICAgIHB0aHJlYWRfY29uZF9pbml0KCZjdHgtPmNvbmQsIE5VTEwpOworICAgIGN0eC0+ZnJhbWVzX2J1ZmZlcl9hdmFpbGFibGVfc3BvdHMgPSBjdHgtPmZyYW1lc19idWZmZXI7CiAKICAgICAvKiBUaGUgZGV2aWNlIGV4cGVjdHMgdGhlIGZyYW1lcmF0ZSB0byBiZSBmaXhlZC4gKi8KLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgYy0+dGltZV9iYXNlLm51bSwgYy0+dGltZV9iYXNlLmRlbik7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHN0LT50aW1lX2Jhc2UubnVtLCBzdC0+dGltZV9iYXNlLmRlbik7CiAKICAgICBjdHgtPnZpZGVvID0gMTsKIApAQCAtMTQwLDkgKzIwMyw5IEBACiAKIHN0YXRpYyBpbnQgZGVja2xpbmtfc2V0dXBfYXVkaW8oQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZTdHJlYW0gKnN0KQogewotICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgY2N0eC0+Y3R4OwotICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPmNvZGVjOworICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopYXZjdHgtPnByaXZfZGF0YTsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKWNjdHgtPmN0eDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqYyA9IHN0LT5jb2RlY3BhcjsKIAogICAgIGlmIChjdHgtPmF1ZGlvKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBvbmUgYXVkaW8gc3RyZWFtIGlzIHN1cHBvcnRlZCFcbiIpOwpAQCAtMTUzLDkgKzIxNiw5IEBACiAgICAgICAgICAgICAgICAiIE9ubHkgNDhrSHogaXMgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKGMtPmNoYW5uZWxzICE9IDIgJiYgYy0+Y2hhbm5lbHMgIT0gOCkgeworICAgIGlmIChjLT5jaGFubmVscyAhPSAyICYmIGMtPmNoYW5uZWxzICE9IDggJiYgYy0+Y2hhbm5lbHMgIT0gMTYpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMhIgotICAgICAgICAgICAgICAgIiBPbmx5IHN0ZXJlbyBhbmQgNy4xIGFyZSBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgICAgICIgT25seSAyLCA4IG9yIDE2IGNoYW5uZWxzIGFyZSBzdXBwb3J0ZWQuXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBpZiAoY3R4LT5kbG8tPkVuYWJsZUF1ZGlvT3V0cHV0KGJtZEF1ZGlvU2FtcGxlUmF0ZTQ4a0h6LApAQCAtMTgxLDggKzI0NCw4IEBACiAKIGF2X2NvbGQgaW50IGZmX2RlY2tsaW5rX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKIHsKLSAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopIGNjdHgtPmN0eDsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKWF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKiljY3R4LT5jdHg7CiAKICAgICBpZiAoY3R4LT5wbGF5YmFja19zdGFydGVkKSB7CiAgICAgICAgIEJNRFRpbWVWYWx1ZSBhY3R1YWw7CkBAIC0xOTMsMTUgKzI1NiwxMyBAQAogICAgICAgICAgICAgY3R4LT5kbG8tPkRpc2FibGVBdWRpb091dHB1dCgpOwogICAgIH0KIAotICAgIGlmIChjdHgtPmRsbykKLSAgICAgICAgY3R4LT5kbG8tPlJlbGVhc2UoKTsKLSAgICBpZiAoY3R4LT5kbCkKLSAgICAgICAgY3R4LT5kbC0+UmVsZWFzZSgpOworICAgIGZmX2RlY2tsaW5rX2NsZWFudXAoYXZjdHgpOwogCiAgICAgaWYgKGN0eC0+b3V0cHV0X2NhbGxiYWNrKQogICAgICAgICBkZWxldGUgY3R4LT5vdXRwdXRfY2FsbGJhY2s7CiAKLSAgICBzZW1fZGVzdHJveSgmY3R4LT5zZW1hcGhvcmUpOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmY3R4LT5tdXRleCk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmN0eC0+Y29uZCk7CiAKICAgICBhdl9mcmVlcCgmY2N0eC0+Y3R4KTsKIApAQCAtMjEwLDU3ICsyNzEsNjQgQEAKIAogc3RhdGljIGludCBkZWNrbGlua193cml0ZV92aWRlb19wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopIGNjdHgtPmN0eDsKLSAgICBBVlBpY3R1cmUgKmF2cGljdHVyZSA9IChBVlBpY3R1cmUgKikgcGt0LT5kYXRhOwotICAgIEFWRnJhbWUgKmF2ZnJhbWUsICp0bXA7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKilhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopY2N0eC0+Y3R4OworICAgIEFWU3RyZWFtICpzdCA9IGF2Y3R4LT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICBBVkZyYW1lICphdmZyYW1lID0gTlVMTCwgKnRtcCA9IChBVkZyYW1lICopcGt0LT5kYXRhOworICAgIEFWUGFja2V0ICphdnBhY2tldCA9IE5VTEw7CiAgICAgZGVja2xpbmtfZnJhbWUgKmZyYW1lOwogICAgIGJ1ZmZlcmNvdW50X3R5cGUgYnVmZmVyZWQ7CiAgICAgSFJFU1VMVCBocjsKIAotICAgIC8qIEhBQ0sgd2hpbGUgYXZfdW5jb2RlZF9mcmFtZSgpIGlzbid0IGltcGxlbWVudGVkICovCi0gICAgaW50IHJldDsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XUkFQUEVEX0FWRlJBTUUpIHsKKyAgICAgICAgaWYgKHRtcC0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfVVlWWTQyMiB8fAorICAgICAgICAgICAgdG1wLT53aWR0aCAgIT0gY3R4LT5ibWRfd2lkdGggfHwKKyAgICAgICAgICAgIHRtcC0+aGVpZ2h0ICE9IGN0eC0+Ym1kX2hlaWdodCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJHb3QgYSBmcmFtZSB3aXRoIGludmFsaWQgcGl4ZWwgZm9ybWF0IG9yIGRpbWVuc2lvbi5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQogCi0gICAgdG1wID0gYXZfZnJhbWVfYWxsb2MoKTsKLSAgICBpZiAoIXRtcCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB0bXAtPmZvcm1hdCA9IEFWX1BJWF9GTVRfVVlWWTQyMjsKLSAgICB0bXAtPndpZHRoICA9IGN0eC0+Ym1kX3dpZHRoOwotICAgIHRtcC0+aGVpZ2h0ID0gY3R4LT5ibWRfaGVpZ2h0OwotICAgIHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIodG1wLCAzMik7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmdG1wKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgYXZfaW1hZ2VfY29weSh0bXAtPmRhdGEsIHRtcC0+bGluZXNpemUsIChjb25zdCB1aW50OF90ICoqKSBhdnBpY3R1cmUtPmRhdGEsCi0gICAgICAgICAgICAgICAgICBhdnBpY3R1cmUtPmxpbmVzaXplLCAoQVZQaXhlbEZvcm1hdCkgdG1wLT5mb3JtYXQsIHRtcC0+d2lkdGgsCi0gICAgICAgICAgICAgICAgICB0bXAtPmhlaWdodCk7Ci0gICAgYXZmcmFtZSA9IGF2X2ZyYW1lX2Nsb25lKHRtcCk7Ci0gICAgYXZfZnJhbWVfZnJlZSgmdG1wKTsKLSAgICBpZiAoIWF2ZnJhbWUpIHsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY2xvbmUgdmlkZW8gZnJhbWUuXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKLSAgICB9Ci0gICAgLyogZW5kIEhBQ0sgKi8KKyAgICAgICAgYXZmcmFtZSA9IGF2X2ZyYW1lX2Nsb25lKHRtcCk7CisgICAgICAgIGlmICghYXZmcmFtZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY2xvbmUgdmlkZW8gZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KIAotICAgIGZyYW1lID0gbmV3IGRlY2tsaW5rX2ZyYW1lKGN0eCwgYXZmcmFtZSwgY3R4LT5ibWRfd2lkdGgsIGN0eC0+Ym1kX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSBhdmZyYW1lLT5kYXRhWzBdKTsKKyAgICAgICAgZnJhbWUgPSBuZXcgZGVja2xpbmtfZnJhbWUoY3R4LCBhdmZyYW1lLCBzdC0+Y29kZWNwYXItPmNvZGVjX2lkLCBhdmZyYW1lLT5oZWlnaHQsIGF2ZnJhbWUtPndpZHRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdnBhY2tldCA9IGF2X3BhY2tldF9jbG9uZShwa3QpOworICAgICAgICBpZiAoIWF2cGFja2V0KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjbG9uZSB2aWRlbyBmcmFtZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lID0gbmV3IGRlY2tsaW5rX2ZyYW1lKGN0eCwgYXZwYWNrZXQsIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQsIGN0eC0+Ym1kX2hlaWdodCwgY3R4LT5ibWRfd2lkdGgpOworICAgIH0KKwogICAgIGlmICghZnJhbWUpIHsKICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIG5ldyBmcmFtZS5cbiIpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZhdmZyYW1lKTsKKyAgICAgICAgYXZfcGFja2V0X2ZyZWUoJmF2cGFja2V0KTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKICAgICB9CiAKICAgICAvKiBBbHdheXMga2VlcCBhdCBtb3N0IG9uZSBzZWNvbmQgb2YgZnJhbWVzIGJ1ZmZlcmVkLiAqLwotICAgIHNlbV93YWl0KCZjdHgtPnNlbWFwaG9yZSk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjdHgtPm11dGV4KTsKKyAgICB3aGlsZSAoY3R4LT5mcmFtZXNfYnVmZmVyX2F2YWlsYWJsZV9zcG90cyA9PSAwKSB7CisgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZjdHgtPmNvbmQsICZjdHgtPm11dGV4KTsKKyAgICB9CisgICAgY3R4LT5mcmFtZXNfYnVmZmVyX2F2YWlsYWJsZV9zcG90cy0tOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjdHgtPm11dGV4KTsKIAogICAgIC8qIFNjaGVkdWxlIGZyYW1lIGZvciBwbGF5YmFjay4gKi8KLSAgICBociA9IGN0eC0+ZGxvLT5TY2hlZHVsZVZpZGVvRnJhbWUoKHN0cnVjdCBJRGVja0xpbmtWaWRlb0ZyYW1lICopIGZyYW1lLAorICAgIGhyID0gY3R4LT5kbG8tPlNjaGVkdWxlVmlkZW9GcmFtZSgoY2xhc3MgSURlY2tMaW5rVmlkZW9GcmFtZSAqKSBmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5wdHMgKiBjdHgtPmJtZF90Yl9udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Ym1kX3RiX251bSwgY3R4LT5ibWRfdGJfZGVuKTsKKyAgICAvKiBQYXNzIG93bmVyc2hpcCB0byBEZWNrTGluaywgb3IgcmVsZWFzZSBvbiBmYWlsdXJlICovCisgICAgZnJhbWUtPlJlbGVhc2UoKTsKICAgICBpZiAoaHIgIT0gU19PSykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzY2hlZHVsZSB2aWRlbyBmcmFtZS4iCiAgICAgICAgICAgICAgICAgIiBlcnJvciAlMDh4LlxuIiwgKHVpbnQzMl90KSBocik7Ci0gICAgICAgIGZyYW1lLT5SZWxlYXNlKCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAgICAgfQogCkBAIC0yOTAsOCArMzU4LDggQEAKIAogc3RhdGljIGludCBkZWNrbGlua193cml0ZV9hdWRpb19wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKSBhdmN0eC0+cHJpdl9kYXRhOwotICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopIGNjdHgtPmN0eDsKKyAgICBzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqY2N0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY2N0eCAqKWF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGRlY2tsaW5rX2N0eCAqY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKiljY3R4LT5jdHg7CiAgICAgaW50IHNhbXBsZV9jb3VudCA9IHBrdC0+c2l6ZSAvIChjdHgtPmNoYW5uZWxzIDw8IDEpOwogICAgIGJ1ZmZlcmNvdW50X3R5cGUgYnVmZmVyZWQ7CiAKQEAgLTMxMywxMiArMzgxLDEwIEBACiAKIGF2X2NvbGQgaW50IGZmX2RlY2tsaW5rX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQogewotICAgIHN0cnVjdCBkZWNrbGlua19jY3R4ICpjY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jY3R4ICopIGF2Y3R4LT5wcml2X2RhdGE7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKilhdmN0eC0+cHJpdl9kYXRhOwogICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eDsKLSAgICBJRGVja0xpbmtEaXNwbGF5TW9kZUl0ZXJhdG9yICppdGVybW9kZTsKLSAgICBJRGVja0xpbmtJdGVyYXRvciAqaXRlcjsKLSAgICBJRGVja0xpbmsgKmRsID0gTlVMTDsKICAgICB1bnNpZ25lZCBpbnQgbjsKKyAgICBpbnQgcmV0OwogCiAgICAgY3R4ID0gKHN0cnVjdCBkZWNrbGlua19jdHggKikgYXZfbWFsbG9jeihzaXplb2Yoc3RydWN0IGRlY2tsaW5rX2N0eCkpOwogICAgIGlmICghY3R4KQpAQCAtMzI4LDYyICszOTQsMzYgQEAKICAgICBjdHgtPnByZXJvbGwgICAgICA9IGNjdHgtPnByZXJvbGw7CiAgICAgY2N0eC0+Y3R4ID0gY3R4OwogCi0gICAgaXRlciA9IENyZWF0ZURlY2tMaW5rSXRlcmF0b3JJbnN0YW5jZSgpOwotICAgIGlmICghaXRlcikgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgRGVja0xpbmsgaXRlcmF0b3JcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgIH0KLQotICAgIC8qIExpc3QgYXZhaWxhYmxlIGRldmljZXMuICovCisgICAgLyogTGlzdCBhdmFpbGFibGUgZGV2aWNlcyBhbmQgZXhpdC4gKi8KICAgICBpZiAoY3R4LT5saXN0X2RldmljZXMpIHsKLSAgICAgICAgZmZfZGVja2xpbmtfbGlzdF9kZXZpY2VzKGF2Y3R4KTsKKyAgICAgICAgZmZfZGVja2xpbmtfbGlzdF9kZXZpY2VzX2xlZ2FjeShhdmN0eCwgMCwgMSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CiAgICAgfQogCi0gICAgLyogT3BlbiBkZXZpY2UuICovCi0gICAgd2hpbGUgKGl0ZXItPk5leHQoJmRsKSA9PSBTX09LKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmRpc3BsYXlOYW1lOwotICAgICAgICBmZl9kZWNrbGlua19nZXRfZGlzcGxheV9uYW1lKGRsLCAmZGlzcGxheU5hbWUpOwotICAgICAgICBpZiAoIXN0cmNtcChhdmN0eC0+ZmlsZW5hbWUsIGRpc3BsYXlOYW1lKSkgewotICAgICAgICAgICAgYXZfZnJlZSgodm9pZCAqKSBkaXNwbGF5TmFtZSk7Ci0gICAgICAgICAgICBjdHgtPmRsID0gZGw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBhdl9mcmVlKCh2b2lkICopIGRpc3BsYXlOYW1lKTsKLSAgICAgICAgZGwtPlJlbGVhc2UoKTsKLSAgICB9Ci0gICAgaXRlci0+UmVsZWFzZSgpOwotICAgIGlmICghY3R4LT5kbCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBvcGVuICclcydcbiIsIGF2Y3R4LT5maWxlbmFtZSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Ci0gICAgfQorICAgIHJldCA9IGZmX2RlY2tsaW5rX2luaXRfZGV2aWNlKGF2Y3R4LCBhdmN0eC0+dXJsKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIC8qIEdldCBvdXRwdXQgZGV2aWNlLiAqLwogICAgIGlmIChjdHgtPmRsLT5RdWVyeUludGVyZmFjZShJSURfSURlY2tMaW5rT3V0cHV0LCAodm9pZCAqKikgJmN0eC0+ZGxvKSAhPSBTX09LKSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gb3V0cHV0IGRldmljZSBmcm9tICclcydcbiIsCi0gICAgICAgICAgICAgICBhdmN0eC0+ZmlsZW5hbWUpOwotICAgICAgICBjdHgtPmRsLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICAgICBhdmN0eC0+dXJsKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KIAogICAgIC8qIExpc3Qgc3VwcG9ydGVkIGZvcm1hdHMuICovCiAgICAgaWYgKGN0eC0+bGlzdF9mb3JtYXRzKSB7CiAgICAgICAgIGZmX2RlY2tsaW5rX2xpc3RfZm9ybWF0cyhhdmN0eCk7Ci0gICAgICAgIGN0eC0+ZGxvLT5SZWxlYXNlKCk7Ci0gICAgICAgIGN0eC0+ZGwtPlJlbGVhc2UoKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKLSAgICB9Ci0KLSAgICBpZiAoY3R4LT5kbG8tPkdldERpc3BsYXlNb2RlSXRlcmF0b3IoJml0ZXJtb2RlKSAhPSBTX09LKSB7Ci0gICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBEaXNwbGF5IE1vZGUgSXRlcmF0b3JcbiIpOwotICAgICAgICBjdHgtPmRsLT5SZWxlYXNlKCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhJVDsKKyAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKICAgICAvKiBTZXR1cCBzdHJlYW1zLiAqLworICAgIHJldCA9IEFWRVJST1IoRUlPKTsKICAgICBmb3IgKG4gPSAwOyBuIDwgYXZjdHgtPm5iX3N0cmVhbXM7IG4rKykgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmN0eC0+c3RyZWFtc1tuXTsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmMgPSBzdC0+Y29kZWM7CisgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpjID0gc3QtPmNvZGVjcGFyOwogICAgICAgICBpZiAgICAgICAgKGMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgICAgICBpZiAoZGVja2xpbmtfc2V0dXBfYXVkaW8oYXZjdHgsIHN0KSkKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwpAQCAtMzk1LDMyICs0MzUsMzMgQEAKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaXRlcm1vZGUtPlJlbGVhc2UoKTsKIAogICAgIHJldHVybiAwOwogCiBlcnJvcjoKLQotICAgIGN0eC0+ZGxvLT5SZWxlYXNlKCk7Ci0gICAgY3R4LT5kbC0+UmVsZWFzZSgpOwotCi0gICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICBmZl9kZWNrbGlua19jbGVhbnVwKGF2Y3R4KTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBpbnQgZmZfZGVja2xpbmtfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKikgYXZjdHgtPnByaXZfZGF0YTsKLSAgICBzdHJ1Y3QgZGVja2xpbmtfY3R4ICpjdHggPSAoc3RydWN0IGRlY2tsaW5rX2N0eCAqKSBjY3R4LT5jdHg7CisgICAgc3RydWN0IGRlY2tsaW5rX2NjdHggKmNjdHggPSAoc3RydWN0IGRlY2tsaW5rX2NjdHggKilhdmN0eC0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBkZWNrbGlua19jdHggKmN0eCA9IChzdHJ1Y3QgZGVja2xpbmtfY3R4ICopY2N0eC0+Y3R4OwogICAgIEFWU3RyZWFtICpzdCA9IGF2Y3R4LT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKIAogICAgIGN0eC0+bGFzdF9wdHMgPSBGRk1BWChjdHgtPmxhc3RfcHRzLCBwa3QtPnB0cyk7CiAKLSAgICBpZiAgICAgIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgIGlmICAgICAgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgIHJldHVybiBkZWNrbGlua193cml0ZV92aWRlb19wYWNrZXQoYXZjdHgsIHBrdCk7Ci0gICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQogICAgICAgICByZXR1cm4gZGVja2xpbmtfd3JpdGVfYXVkaW9fcGFja2V0KGF2Y3R4LCBwa3QpOwogCiAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIH0KIAoraW50IGZmX2RlY2tsaW5rX2xpc3Rfb3V0cHV0X2RldmljZXMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgc3RydWN0IEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZV9saXN0KQoreworICAgIHJldHVybiBmZl9kZWNrbGlua19saXN0X2RldmljZXMoYXZjdHgsIGRldmljZV9saXN0LCAwLCAxKTsKK30KKwogfSAvKiBleHRlcm4gIkMiICovCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9kZWNrbGlua19lbmMuaCBiL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuYy5oCmluZGV4IDVmZmMwNWMuLjM5MjM3NjcgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuYy5oCisrKyBiL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuYy5oCkBAIC0yOSw2ICsyOSw3IEBACiBpbnQgZmZfZGVja2xpbmtfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpOwogaW50IGZmX2RlY2tsaW5rX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlBhY2tldCAqcGt0KTsKIGludCBmZl9kZWNrbGlua193cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpOworaW50IGZmX2RlY2tsaW5rX2xpc3Rfb3V0cHV0X2RldmljZXMoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgc3RydWN0IEFWRGV2aWNlSW5mb0xpc3QgKmRldmljZV9saXN0KTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9IC8qIGV4dGVybiAiQyIgKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuY19jLmMgYi9saWJhdmRldmljZS9kZWNrbGlua19lbmNfYy5jCmluZGV4IGMzYzkwMTguLjM2MDUzNWMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2RlY2tsaW5rX2VuY19jLmMKKysrIGIvbGliYXZkZXZpY2UvZGVja2xpbmtfZW5jX2MuYwpAQCAtNDYsOSArNDYsMTAgQEAKICAgICAubmFtZSAgICAgICAgICAgPSAiZGVja2xpbmsiLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCbGFja21hZ2ljIERlY2tMaW5rIG91dHB1dCIpLAogICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwKLSAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTywKKyAgICAudmlkZW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9XUkFQUEVEX0FWRlJBTUUsCiAgICAgLnN1YnRpdGxlX2NvZGVjID0gQVZfQ09ERUNfSURfTk9ORSwKLSAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUgfCBBVkZNVF9SQVdQSUNUVVJFLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAuZ2V0X2RldmljZV9saXN0ID0gZmZfZGVja2xpbmtfbGlzdF9vdXRwdXRfZGV2aWNlcywKICAgICAucHJpdl9jbGFzcyAgICAgPSAmZGVja2xpbmtfbXV4ZXJfY2xhc3MsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBkZWNrbGlua19jY3R4KSwKICAgICAud3JpdGVfaGVhZGVyICAgPSBmZl9kZWNrbGlua193cml0ZV9oZWFkZXIsCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9kc2hvdy5jIGIvbGliYXZkZXZpY2UvZHNob3cuYwppbmRleCBmNTZjMTY1Li5kZTkxMGMwIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9kc2hvdy5jCisrKyBiL2xpYmF2ZGV2aWNlL2RzaG93LmMKQEAgLTEwNCwxMCArMTA0LDEwIEBACiAgICAgaWYgKGN0eC0+ZGV2aWNlX2ZpbHRlcltBdWRpb0RldmljZV0pCiAgICAgICAgIElCYXNlRmlsdGVyX1JlbGVhc2UoY3R4LT5kZXZpY2VfZmlsdGVyW0F1ZGlvRGV2aWNlXSk7CiAKLSAgICBpZiAoY3R4LT5kZXZpY2VfbmFtZVswXSkKLSAgICAgICAgYXZfZnJlZXAoJmN0eC0+ZGV2aWNlX25hbWVbMF0pOwotICAgIGlmIChjdHgtPmRldmljZV9uYW1lWzFdKQotICAgICAgICBhdl9mcmVlcCgmY3R4LT5kZXZpY2VfbmFtZVsxXSk7CisgICAgYXZfZnJlZXAoJmN0eC0+ZGV2aWNlX25hbWVbMF0pOworICAgIGF2X2ZyZWVwKCZjdHgtPmRldmljZV9uYW1lWzFdKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5kZXZpY2VfdW5pcXVlX25hbWVbMF0pOworICAgIGF2X2ZyZWVwKCZjdHgtPmRldmljZV91bmlxdWVfbmFtZVsxXSk7CiAKICAgICBpZihjdHgtPm11dGV4KQogICAgICAgICBDbG9zZUhhbmRsZShjdHgtPm11dGV4KTsKQEAgLTIwNSw3ICsyMDUsOCBAQAogICovCiBzdGF0aWMgaW50CiBkc2hvd19jeWNsZV9kZXZpY2VzKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIElDcmVhdGVEZXZFbnVtICpkZXZlbnVtLAotICAgICAgICAgICAgICAgICAgICBlbnVtIGRzaG93RGV2aWNlVHlwZSBkZXZ0eXBlLCBlbnVtIGRzaG93U291cmNlRmlsdGVyVHlwZSBzb3VyY2V0eXBlLCBJQmFzZUZpbHRlciAqKnBmaWx0ZXIpCisgICAgICAgICAgICAgICAgICAgIGVudW0gZHNob3dEZXZpY2VUeXBlIGRldnR5cGUsIGVudW0gZHNob3dTb3VyY2VGaWx0ZXJUeXBlIHNvdXJjZXR5cGUsCisgICAgICAgICAgICAgICAgICAgIElCYXNlRmlsdGVyICoqcGZpbHRlciwgY2hhciAqKmRldmljZV91bmlxdWVfbmFtZSkKIHsKICAgICBzdHJ1Y3QgZHNob3dfY3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIElCYXNlRmlsdGVyICpkZXZpY2VfZmlsdGVyID0gTlVMTDsKQEAgLTI3NiwxMCArMjc3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIEJpbmRUb09iamVjdCBmb3IgJXNcbiIsIGRldmljZV9uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsMTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmRldmljZV91bmlxdWVfbmFtZSA9IHVuaXF1ZV9uYW1lOworICAgICAgICAgICAgICAgIC8vIHN1Y2Nlc3MsIGxvb3Agd2lsbCBlbmQgbm93CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiIFwiJXNcIlxuIiwgZnJpZW5kbHlfbmFtZSk7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiICAgIEFsdGVybmF0aXZlIG5hbWUgXCIlc1wiXG4iLCB1bmlxdWVfbmFtZSk7CisgICAgICAgICAgICBhdl9mcmVlKHVuaXF1ZV9uYW1lKTsKICAgICAgICAgfQogCiBmYWlsMToKQEAgLTI4OCw3ICsyOTIsNiBAQAogICAgICAgICBpZiAoYmluZF9jdHgpCiAgICAgICAgICAgICBJQmluZEN0eF9SZWxlYXNlKGJpbmRfY3R4KTsKICAgICAgICAgYXZfZnJlZShmcmllbmRseV9uYW1lKTsKLSAgICAgICAgYXZfZnJlZSh1bmlxdWVfbmFtZSk7CiAgICAgICAgIGlmIChiYWcpCiAgICAgICAgICAgICBJUHJvcGVydHlCYWdfUmVsZWFzZShiYWcpOwogICAgICAgICBJTW9uaWtlcl9SZWxlYXNlKG0pOwpAQCAtNzA2LDE0ICs3MDksMTUgQEAKIHsKICAgICBzdHJ1Y3QgZHNob3dfY3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIElCYXNlRmlsdGVyICpkZXZpY2VfZmlsdGVyID0gTlVMTDsKKyAgICBjaGFyICpkZXZpY2VfdW5pcXVlX25hbWUgPSBOVUxMOwogICAgIGludCByOwogCi0gICAgaWYgKChyID0gZHNob3dfY3ljbGVfZGV2aWNlcyhhdmN0eCwgZGV2ZW51bSwgZGV2dHlwZSwgc291cmNldHlwZSwgJmRldmljZV9maWx0ZXIpKSA8IDApCisgICAgaWYgKChyID0gZHNob3dfY3ljbGVfZGV2aWNlcyhhdmN0eCwgZGV2ZW51bSwgZGV2dHlwZSwgc291cmNldHlwZSwgJmRldmljZV9maWx0ZXIsICZkZXZpY2VfdW5pcXVlX25hbWUpKSA8IDApCiAgICAgICAgIHJldHVybiByOwogICAgIGN0eC0+ZGV2aWNlX2ZpbHRlcltkZXZ0eXBlXSA9IGRldmljZV9maWx0ZXI7CiAgICAgaWYgKChyID0gZHNob3dfY3ljbGVfcGlucyhhdmN0eCwgZGV2dHlwZSwgc291cmNldHlwZSwgZGV2aWNlX2ZpbHRlciwgTlVMTCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHI7Ci0KKyAgICBhdl9mcmVlcCgmZGV2aWNlX3VuaXF1ZV9uYW1lKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNzIzLDYgKzcyNyw3IEBACiB7CiAgICAgc3RydWN0IGRzaG93X2N0eCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBJQmFzZUZpbHRlciAqZGV2aWNlX2ZpbHRlciA9IE5VTEw7CisgICAgY2hhciAqZGV2aWNlX2ZpbHRlcl91bmlxdWVfbmFtZSA9IE5VTEw7CiAgICAgSUdyYXBoQnVpbGRlciAqZ3JhcGggPSBjdHgtPmdyYXBoOwogICAgIElQaW4gKmRldmljZV9waW4gPSBOVUxMOwogICAgIGxpYkFWUGluICpjYXB0dXJlX3BpbiA9IE5VTEw7CkBAIC03MzMsNiArNzM4LDcgQEAKICAgICBJU3RyZWFtICppZmlsZV9zdHJlYW0gPSBOVUxMOwogICAgIElTdHJlYW0gKm9maWxlX3N0cmVhbSA9IE5VTEw7CiAgICAgSVBlcnNpc3RTdHJlYW0gKnBlcnNfc3RyZWFtID0gTlVMTDsKKyAgICBlbnVtIGRzaG93RGV2aWNlVHlwZSBvdGhlckRldlR5cGUgPSAoZGV2dHlwZSA9PSBWaWRlb0RldmljZSkgPyBBdWRpb0RldmljZSA6IFZpZGVvRGV2aWNlOwogCiAgICAgY29uc3Qgd2NoYXJfdCAqZmlsdGVyX25hbWVbMl0gPSB7IEwiQXVkaW8gY2FwdHVyZSBmaWx0ZXIiLCBMIlZpZGVvIGNhcHR1cmUgZmlsdGVyIiB9OwogCkBAIC03NjYsMTMgKzc3MiwyNiBAQAogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiQ2FwdHVyZSBmaWx0ZXIgbG9hZGVkIHN1Y2Nlc3NmdWxseSBmcm9tIGZpbGUgXCIlc1wiLlxuIiwgZmlsZW5hbWUpOwogICAgIH0gZWxzZSB7CiAKLSAgICAgICAgaWYgKChyID0gZHNob3dfY3ljbGVfZGV2aWNlcyhhdmN0eCwgZGV2ZW51bSwgZGV2dHlwZSwgc291cmNldHlwZSwgJmRldmljZV9maWx0ZXIpKSA8IDApIHsKKyAgICAgICAgaWYgKChyID0gZHNob3dfY3ljbGVfZGV2aWNlcyhhdmN0eCwgZGV2ZW51bSwgZGV2dHlwZSwgc291cmNldHlwZSwgJmRldmljZV9maWx0ZXIsICZkZXZpY2VfZmlsdGVyX3VuaXF1ZV9uYW1lKSkgPCAwKSB7CiAgICAgICAgICAgICByZXQgPSByOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogICAgIH0KKyAgICAgICAgaWYgKGN0eC0+ZGV2aWNlX2ZpbHRlcltvdGhlckRldlR5cGVdKSB7CisgICAgICAgIC8vIGF2b2lkIGFkZGluZyBhZGQgdHdvIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBkZXZpY2UgdG8gdGhlIGdyYXBoLCBvbmUgZm9yIHZpZGVvLCBvbmUgZm9yIGF1ZGlvCisgICAgICAgIC8vIGEgZmV3IGRldmljZXMgZG9uJ3Qgc3VwcG9ydCB0aGlzIChjb3VsZCBhbHNvIGRvIHRoaXMgY2hlY2sgZWFybGllciB0byBhdm9pZCBkb3VibGUgY3Jvc3NiYXJzLCBldGMuIGJ1dCB0aGV5IHNlZW0gT0spCisgICAgICAgIGlmIChzdHJjbXAoZGV2aWNlX2ZpbHRlcl91bmlxdWVfbmFtZSwgY3R4LT5kZXZpY2VfdW5pcXVlX25hbWVbb3RoZXJEZXZUeXBlXSkgPT0gMCkgeworICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAicmV1c2luZyBwcmV2aW91cyBncmFwaCBjYXB0dXJlIGZpbHRlci4uLiAlc1xuIiwgZGV2aWNlX2ZpbHRlcl91bmlxdWVfbmFtZSk7CisgICAgICAgICAgSUJhc2VGaWx0ZXJfUmVsZWFzZShkZXZpY2VfZmlsdGVyKTsKKyAgICAgICAgICBkZXZpY2VfZmlsdGVyID0gY3R4LT5kZXZpY2VfZmlsdGVyW290aGVyRGV2VHlwZV07CisgICAgICAgICAgSUJhc2VGaWx0ZXJfQWRkUmVmKGN0eC0+ZGV2aWNlX2ZpbHRlcltvdGhlckRldlR5cGVdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAibm90IHJldXNpbmcgcHJldmlvdXMgZ3JhcGggY2FwdHVyZSBmaWx0ZXIgJXMgIT0gJXNcbiIsIGRldmljZV9maWx0ZXJfdW5pcXVlX25hbWUsIGN0eC0+ZGV2aWNlX3VuaXF1ZV9uYW1lW290aGVyRGV2VHlwZV0pOworICAgICAgICB9CisgICAgfQogCiAgICAgY3R4LT5kZXZpY2VfZmlsdGVyIFtkZXZ0eXBlXSA9IGRldmljZV9maWx0ZXI7CisgICAgY3R4LT5kZXZpY2VfdW5pcXVlX25hbWUgW2RldnR5cGVdID0gZGV2aWNlX2ZpbHRlcl91bmlxdWVfbmFtZTsKIAogICAgIHIgPSBJR3JhcGhCdWlsZGVyX0FkZEZpbHRlcihncmFwaCwgZGV2aWNlX2ZpbHRlciwgTlVMTCk7CiAgICAgaWYgKHIgIT0gU19PSykgewpAQCAtOTE4LDcgKzkzNyw3IEBACiB7CiAgICAgc3RydWN0IGRzaG93X2N0eCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBBTV9NRURJQV9UWVBFIHR5cGU7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXI7CiAgICAgQVZTdHJlYW0gKnN0OwogICAgIGludCByZXQgPSBBVkVSUk9SKEVJTyk7CiAKQEAgLTkzMyw3ICs5NTIsNyBAQAogCiAgICAgbGliQVZQaW5fQ29ubmVjdGlvbk1lZGlhVHlwZShjdHgtPmNhcHR1cmVfcGluW2RldnR5cGVdLCAmdHlwZSk7CiAKLSAgICBjb2RlYyA9IHN0LT5jb2RlYzsKKyAgICBwYXIgPSBzdC0+Y29kZWNwYXI7CiAgICAgaWYgKGRldnR5cGUgPT0gVmlkZW9EZXZpY2UpIHsKICAgICAgICAgQklUTUFQSU5GT0hFQURFUiAqYmloID0gTlVMTDsKICAgICAgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CkBAIC05NTIsMzMgKzk3MSwzNSBAQAogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCi0gICAgICAgIGNvZGVjLT50aW1lX2Jhc2UgID0gdGltZV9iYXNlOwotICAgICAgICBjb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgY29kZWMtPndpZHRoICAgICAgPSBiaWgtPmJpV2lkdGg7Ci0gICAgICAgIGNvZGVjLT5oZWlnaHQgICAgID0gYmloLT5iaUhlaWdodDsKLSAgICAgICAgY29kZWMtPmNvZGVjX3RhZyAgPSBiaWgtPmJpQ29tcHJlc3Npb247Ci0gICAgICAgIGNvZGVjLT5waXhfZm10ICAgID0gZHNob3dfcGl4Zm10KGJpaC0+YmlDb21wcmVzc2lvbiwgYmloLT5iaUJpdENvdW50KTsKKyAgICAgICAgc3QtPmF2Z19mcmFtZV9yYXRlID0gYXZfaW52X3EodGltZV9iYXNlKTsKKyAgICAgICAgc3QtPnJfZnJhbWVfcmF0ZSA9IGF2X2ludl9xKHRpbWVfYmFzZSk7CisKKyAgICAgICAgcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBwYXItPndpZHRoICAgICAgPSBiaWgtPmJpV2lkdGg7CisgICAgICAgIHBhci0+aGVpZ2h0ICAgICA9IGJpaC0+YmlIZWlnaHQ7CisgICAgICAgIHBhci0+Y29kZWNfdGFnICA9IGJpaC0+YmlDb21wcmVzc2lvbjsKKyAgICAgICAgcGFyLT5mb3JtYXQgICAgID0gZHNob3dfcGl4Zm10KGJpaC0+YmlDb21wcmVzc2lvbiwgYmloLT5iaUJpdENvdW50KTsKICAgICAgICAgaWYgKGJpaC0+YmlDb21wcmVzc2lvbiA9PSBNS1RBRygnSCcsICdEJywgJ1knLCAnQycpKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgImF0dGVtcHQgdG8gdXNlIGZ1bGwgcmFuZ2UgZm9yIEhEWUMuLi5cbiIpOwotICAgICAgICAgICAgY29kZWMtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfTVBFRzsgLy8ganVzdCBpbiBjYXNlIGl0IG5lZWRzIHRoaXMuLi4KKyAgICAgICAgICAgIHBhci0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9NUEVHOyAvLyBqdXN0IGluIGNhc2UgaXQgbmVlZHMgdGhpcy4uLgogICAgICAgICB9Ci0gICAgICAgIGlmIChjb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgaWYgKHBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgewogICAgICAgICAgICAgY29uc3QgQVZDb2RlY1RhZyAqY29uc3QgdGFnc1tdID0geyBhdmZvcm1hdF9nZXRfcmlmZl92aWRlb190YWdzKCksIE5VTEwgfTsKLSAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IGF2X2NvZGVjX2dldF9pZCh0YWdzLCBiaWgtPmJpQ29tcHJlc3Npb24pOwotICAgICAgICAgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgICAgICBwYXItPmNvZGVjX2lkID0gYXZfY29kZWNfZ2V0X2lkKHRhZ3MsIGJpaC0+YmlDb21wcmVzc2lvbik7CisgICAgICAgICAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbmtub3duIGNvbXByZXNzaW9uIHR5cGUuICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVwb3J0IHR5cGUgMHglWC5cbiIsIChpbnQpIGJpaC0+YmlDb21wcmVzc2lvbik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJpaC0+YmlCaXRDb3VudDsKKyAgICAgICAgICAgIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYmloLT5iaUJpdENvdW50OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgICAgICAgICBwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CiAgICAgICAgICAgICBpZiAoYmloLT5iaUNvbXByZXNzaW9uID09IEJJX1JHQiB8fCBiaWgtPmJpQ29tcHJlc3Npb24gPT0gQklfQklURklFTERTKSB7Ci0gICAgICAgICAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJpaC0+YmlCaXRDb3VudDsKLSAgICAgICAgICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKDkgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgICAgICAgICBpZiAoY29kZWMtPmV4dHJhZGF0YSkgewotICAgICAgICAgICAgICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSA5OwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWMtPmV4dHJhZGF0YSwgIkJvdHRvbVVwIiwgOSk7CisgICAgICAgICAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaWgtPmJpQml0Q291bnQ7CisgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoOSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgIGlmIChwYXItPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBwYXItPmV4dHJhZGF0YV9zaXplID0gOTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBhci0+ZXh0cmFkYXRhLCAiQm90dG9tVXAiLCA5KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTk5MywxMSArMTAxNCwxMSBAQAogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCi0gICAgICAgIGNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgY29kZWMtPnNhbXBsZV9mbXQgID0gc2FtcGxlX2ZtdF9iaXRzX3Blcl9zYW1wbGUoZngtPndCaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgY29kZWMtPmNvZGVjX2lkICAgID0gd2F2ZWZvcm1fY29kZWNfaWQoY29kZWMtPnNhbXBsZV9mbXQpOwotICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBmeC0+blNhbXBsZXNQZXJTZWM7Ci0gICAgICAgIGNvZGVjLT5jaGFubmVscyAgICA9IGZ4LT5uQ2hhbm5lbHM7CisgICAgICAgIHBhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHBhci0+Zm9ybWF0ICAgICAgPSBzYW1wbGVfZm10X2JpdHNfcGVyX3NhbXBsZShmeC0+d0JpdHNQZXJTYW1wbGUpOworICAgICAgICBwYXItPmNvZGVjX2lkICAgID0gd2F2ZWZvcm1fY29kZWNfaWQocGFyLT5mb3JtYXQpOworICAgICAgICBwYXItPnNhbXBsZV9yYXRlID0gZngtPm5TYW1wbGVzUGVyU2VjOworICAgICAgICBwYXItPmNoYW5uZWxzICAgID0gZngtPm5DaGFubmVsczsKICAgICB9CiAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMDApOwpAQCAtMTAxMiw3ICsxMDMzLDcgQEAKIHsKICAgICBzdHJ1Y3QgZHNob3dfY3R4ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOwogICAgIGNoYXIgKipkZXZpY2VfbmFtZSA9IGN0eC0+ZGV2aWNlX25hbWU7Ci0gICAgY2hhciAqbmFtZSA9IGF2X3N0cmR1cChhdmN0eC0+ZmlsZW5hbWUpOworICAgIGNoYXIgKm5hbWUgPSBhdl9zdHJkdXAoYXZjdHgtPnVybCk7CiAgICAgY2hhciAqdG1wID0gbmFtZTsKICAgICBpbnQgcmV0ID0gMTsKICAgICBjaGFyICp0eXBlOwpAQCAtMTA5OSw5ICsxMTIwLDkgQEAKIAogICAgIGlmIChjdHgtPmxpc3RfZGV2aWNlcykgewogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiRGlyZWN0U2hvdyB2aWRlbyBkZXZpY2VzIChzb21lIG1heSBiZSBib3RoIHZpZGVvIGFuZCBhdWRpbyBkZXZpY2VzKVxuIik7Ci0gICAgICAgIGRzaG93X2N5Y2xlX2RldmljZXMoYXZjdHgsIGRldmVudW0sIFZpZGVvRGV2aWNlLCBWaWRlb1NvdXJjZURldmljZSwgTlVMTCk7CisgICAgICAgIGRzaG93X2N5Y2xlX2RldmljZXMoYXZjdHgsIGRldmVudW0sIFZpZGVvRGV2aWNlLCBWaWRlb1NvdXJjZURldmljZSwgTlVMTCwgTlVMTCk7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJEaXJlY3RTaG93IGF1ZGlvIGRldmljZXNcbiIpOwotICAgICAgICBkc2hvd19jeWNsZV9kZXZpY2VzKGF2Y3R4LCBkZXZlbnVtLCBBdWRpb0RldmljZSwgQXVkaW9Tb3VyY2VEZXZpY2UsIE5VTEwpOworICAgICAgICBkc2hvd19jeWNsZV9kZXZpY2VzKGF2Y3R4LCBkZXZlbnVtLCBBdWRpb0RldmljZSwgQXVkaW9Tb3VyY2VEZXZpY2UsIE5VTEwsIE5VTEwpOwogICAgICAgICByZXQgPSBBVkVSUk9SX0VYSVQ7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvZHNob3dfY2FwdHVyZS5oIGIvbGliYXZkZXZpY2UvZHNob3dfY2FwdHVyZS5oCmluZGV4IGYyNmVhZjkuLjQ3NWQ2MmIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2RzaG93X2NhcHR1cmUuaAorKysgYi9saWJhdmRldmljZS9kc2hvd19jYXB0dXJlLmgKQEAgLTI4OSw2ICsyODksOCBAQAogICAgIElHcmFwaEJ1aWxkZXIgKmdyYXBoOwogCiAgICAgY2hhciAqZGV2aWNlX25hbWVbMl07CisgICAgY2hhciAqZGV2aWNlX3VuaXF1ZV9uYW1lWzJdOworCiAgICAgaW50IHZpZGVvX2RldmljZV9udW1iZXI7CiAgICAgaW50IGF1ZGlvX2RldmljZV9udW1iZXI7CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2RzaG93X2Nyb3NzYmFyLmMgYi9saWJhdmRldmljZS9kc2hvd19jcm9zc2Jhci5jCmluZGV4IGMwNzM5ZGEuLjk1ZmI0NjYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2RzaG93X2Nyb3NzYmFyLmMKKysrIGIvbGliYXZkZXZpY2UvZHNob3dfY3Jvc3NiYXIuYwpAQCAtMTY3LDcgKzE2Nyw3IEBACiAgICAgfQogCiAgICAgaWYgKGRldnR5cGUgPT0gVmlkZW9EZXZpY2UgJiYgY3R4LT5zaG93X2FuYWxvZ190dl90dW5lcl9kaWFsb2cpIHsKLSAgICAgICAgaHIgPSBJQ2FwdHVyZUdyYXBoQnVpbGRlcjJfRmluZEludGVyZmFjZShncmFwaF9idWlsZGVyMiwgJkxPT0tfVVBTVFJFQU1fT05MWSwgTlVMTCwgCisgICAgICAgIGhyID0gSUNhcHR1cmVHcmFwaEJ1aWxkZXIyX0ZpbmRJbnRlcmZhY2UoZ3JhcGhfYnVpbGRlcjIsICZMT09LX1VQU1RSRUFNX09OTFksIE5VTEwsCiAgICAgICAgICAgICAgZGV2aWNlX2ZpbHRlciwgJklJRF9JQU1UVlR1bmVyLCAodm9pZCoqKSAmdHZfdHVuZXJfZmlsdGVyKTsKICAgICAgICAgaWYgKGhyID09IFNfT0spIHsKICAgICAgICAgICAgIGhyID0gSUFNQ3Jvc3NiYXJfUXVlcnlJbnRlcmZhY2UodHZfdHVuZXJfZmlsdGVyLCAmSUlEX0lCYXNlRmlsdGVyLCAodm9pZCAqKikgJnR2X3R1bmVyX2Jhc2VfZmlsdGVyKTsKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChkZXZ0eXBlID09IEF1ZGlvRGV2aWNlICYmIGN0eC0+c2hvd19hbmFsb2dfdHZfdHVuZXJfYXVkaW9fZGlhbG9nKSB7Ci0gICAgICAgIGhyID0gSUNhcHR1cmVHcmFwaEJ1aWxkZXIyX0ZpbmRJbnRlcmZhY2UoZ3JhcGhfYnVpbGRlcjIsICZMT09LX1VQU1RSRUFNX09OTFksIE5VTEwsIAorICAgICAgICBociA9IElDYXB0dXJlR3JhcGhCdWlsZGVyMl9GaW5kSW50ZXJmYWNlKGdyYXBoX2J1aWxkZXIyLCAmTE9PS19VUFNUUkVBTV9PTkxZLCBOVUxMLAogICAgICAgICAgICAgIGRldmljZV9maWx0ZXIsICZJSURfSUFNVFZBdWRpbywgKHZvaWQqKikgJnR2X2F1ZGlvX2ZpbHRlcik7CiAgICAgICAgIGlmIChociA9PSBTX09LKSB7CiAgICAgICAgICAgICBociA9IElBTUNyb3NzYmFyX1F1ZXJ5SW50ZXJmYWNlKHR2X2F1ZGlvX2ZpbHRlciwgJklJRF9JQmFzZUZpbHRlciwgKHZvaWQgKiopICZ0dl9hdWRpb19iYXNlX2ZpbHRlcik7CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9kc2hvd19maWx0ZXIuYyBiL2xpYmF2ZGV2aWNlL2RzaG93X2ZpbHRlci5jCmluZGV4IDczNjBhZGMuLmRiNGJmZjYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2RzaG93X2ZpbHRlci5jCisrKyBiL2xpYmF2ZGV2aWNlL2RzaG93X2ZpbHRlci5jCkBAIC0xNTcsOSArMTU3LDcgQEAKIAogICAgIGlmICghaW5mbykKICAgICAgICAgcmV0dXJuIEVfUE9JTlRFUjsKLSAgICAqaW5mbyA9IHdjc2R1cChMImxpYkFWIik7Ci0KLSAgICByZXR1cm4gU19PSzsKKyAgICByZXR1cm4gRV9OT1RJTVBMOyAvKiBkb24ndCBoYXZlIHRvIGRvIGFueXRoaW5nIGhlcmUgKi8KIH0KIAogc3RhdGljIGludApkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvZHYxMzk0LmMgYi9saWJhdmRldmljZS9kdjEzOTQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwMjc4MC4uMDAwMDAwMAotLS0gYS9saWJhdmRldmljZS9kdjEzOTQuYworKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogTGludXggRFYxMzk0IGludGVyZmFjZQotICogQ29weXJpZ2h0IChjKSAyMDAzIE1heCBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8cG9sbC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImF2ZGV2aWNlLmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvZHYuaCIKLSNpbmNsdWRlICJkdjEzOTQuaCIKLQotc3RydWN0IGR2MTM5NF9kYXRhIHsKLSAgICBBVkNsYXNzICpjbGFzczsKLSAgICBpbnQgZmQ7Ci0gICAgaW50IGNoYW5uZWw7Ci0gICAgaW50IGZvcm1hdDsKLQotICAgIHVpbnQ4X3QgKnJpbmc7IC8qIFJpbmcgYnVmZmVyICovCi0gICAgaW50IGluZGV4OyAgLyogQ3VycmVudCBmcmFtZSBpbmRleCAqLwotICAgIGludCBhdmFpbDsgIC8qIE51bWJlciBvZiBmcmFtZXMgYXZhaWxhYmxlIGZvciByZWFkaW5nICovCi0gICAgaW50IGRvbmU7ICAgLyogTnVtYmVyIG9mIGNvbXBsZXRlZCBmcmFtZXMgKi8KLQotICAgIERWRGVtdXhDb250ZXh0KiBkdl9kZW11eDsgLyogR2VuZXJpYyBEViBtdXhpbmcvZGVtdXhpbmcgY29udGV4dCAqLwotfTsKLQotLyoKLSAqIFRoZSB0cmljayBoZXJlIGlzIHRvIGtsdWRnZSBhcm91bmQgd2VsbCBrbm93biBwcm9ibGVtIHdpdGgga2VybmVsIE9vb3BzaW5nCi0gKiB3aGVuIHlvdSB0cnkgdG8gY2FwdHVyZSBQQUwgb24gYSBkZXZpY2Ugbm9kZSBjb25maWd1cmUgZm9yIE5UU0MuIFRoYXQncwotICogd2h5IHdlIGhhdmUgdG8gY29uZmlndXJlIHRoZSBkZXZpY2Ugbm9kZSBmb3IgUEFMLCBhbmQgdGhlbiByZWFkIG9ubHkgTlRTQwotICogYW1vdW50IG9mIGRhdGEuCi0gKi8KLXN0YXRpYyBpbnQgZHYxMzk0X3Jlc2V0KHN0cnVjdCBkdjEzOTRfZGF0YSAqZHYpCi17Ci0gICAgc3RydWN0IGR2MTM5NF9pbml0IGluaXQ7Ci0KLSAgICBpbml0LmNoYW5uZWwgICAgID0gZHYtPmNoYW5uZWw7Ci0gICAgaW5pdC5hcGlfdmVyc2lvbiA9IERWMTM5NF9BUElfVkVSU0lPTjsKLSAgICBpbml0Lm5fZnJhbWVzICAgID0gRFYxMzk0X1JJTkdfRlJBTUVTOwotICAgIGluaXQuZm9ybWF0ICAgICAgPSBEVjEzOTRfUEFMOwotCi0gICAgaWYgKGlvY3RsKGR2LT5mZCwgRFYxMzk0X0lOSVQsICZpbml0KSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGR2LT5hdmFpbCAgPSBkdi0+ZG9uZSA9IDA7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHYxMzk0X3N0YXJ0KHN0cnVjdCBkdjEzOTRfZGF0YSAqZHYpCi17Ci0gICAgLyogVGVsbCBEVjEzOTQgZHJpdmVyIHRvIGVuYWJsZSByZWNlaXZlciAqLwotICAgIGlmIChpb2N0bChkdi0+ZmQsIERWMTM5NF9TVEFSVF9SRUNFSVZFLCAwKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzdGFydCByZWNlaXZlcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZHYxMzk0X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqIGNvbnRleHQpCi17Ci0gICAgc3RydWN0IGR2MTM5NF9kYXRhICpkdiA9IGNvbnRleHQtPnByaXZfZGF0YTsKLQotICAgIGR2LT5kdl9kZW11eCA9IGF2cHJpdl9kdl9pbml0X2RlbXV4KGNvbnRleHQpOwotICAgIGlmICghZHYtPmR2X2RlbXV4KQotICAgICAgICBnb3RvIGZhaWxlZDsKLQotICAgIC8qIE9wZW4gYW5kIGluaXRpYWxpemUgRFYxMzk0IGRldmljZSAqLwotICAgIGR2LT5mZCA9IGF2cHJpdl9vcGVuKGNvbnRleHQtPmZpbGVuYW1lLCBPX1JET05MWSk7Ci0gICAgaWYgKGR2LT5mZCA8IDApIHsKLSAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIERWIGludGVyZmFjZTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLQotICAgIGlmIChkdjEzOTRfcmVzZXQoZHYpIDwgMCkgewotICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgRFYgaW50ZXJmYWNlOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQotCi0gICAgZHYtPnJpbmcgPSBtbWFwKE5VTEwsIERWMTM5NF9QQUxfRlJBTUVfU0laRSAqIERWMTM5NF9SSU5HX0ZSQU1FUywKLSAgICAgICAgICAgICAgICAgICAgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZHYtPmZkLCAwKTsKLSAgICBpZiAoZHYtPnJpbmcgPT0gTUFQX0ZBSUxFRCkgewotICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG1tYXAgRFYgcmluZyBidWZmZXI6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICB9Ci0KLSAgICBpZiAoZHYxMzk0X3N0YXJ0KGR2KSA8IDApCi0gICAgICAgIGdvdG8gZmFpbGVkOwotCi0gICAgcmV0dXJuIDA7Ci0KLWZhaWxlZDoKLSAgICBjbG9zZShkdi0+ZmQpOwotICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Ci19Ci0KLXN0YXRpYyBpbnQgZHYxMzk0X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY29udGV4dCwgQVZQYWNrZXQgKnBrdCkKLXsKLSAgICBzdHJ1Y3QgZHYxMzk0X2RhdGEgKmR2ID0gY29udGV4dC0+cHJpdl9kYXRhOwotICAgIGludCBzaXplOwotCi0gICAgc2l6ZSA9IGF2cHJpdl9kdl9nZXRfcGFja2V0KGR2LT5kdl9kZW11eCwgcGt0KTsKLSAgICBpZiAoc2l6ZSA+IDApCi0gICAgICAgIHJldHVybiBzaXplOwotCi0gICAgaWYgKCFkdi0+YXZhaWwpIHsKLSAgICAgICAgc3RydWN0IGR2MTM5NF9zdGF0dXMgczsKLSAgICAgICAgc3RydWN0IHBvbGxmZCBwOwotCi0gICAgICAgIGlmIChkdi0+ZG9uZSkgewotICAgICAgICAgICAgLyogUmVxdWVzdCBtb3JlIGZyYW1lcyAqLwotICAgICAgICAgICAgaWYgKGlvY3RsKGR2LT5mZCwgRFYxMzk0X1JFQ0VJVkVfRlJBTUVTLCBkdi0+ZG9uZSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyB1c3VhbGx5IG1lYW5zIHRoYXQgcmluZyBidWZmZXIgb3ZlcmZsb3dlZC4KLSAgICAgICAgICAgICAgICAgKiBXZSBoYXZlIHRvIHJlc2V0IDooLgotICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkRWMTM5NDogUmluZyBidWZmZXIgb3ZlcmZsb3cuIFJlc2V0aW5nIC4uXG4iKTsKLQotICAgICAgICAgICAgICAgIGR2MTM5NF9yZXNldChkdik7Ci0gICAgICAgICAgICAgICAgZHYxMzk0X3N0YXJ0KGR2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGR2LT5kb25lID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFdhaXQgdW50aWwgbW9yZSBmcmFtZXMgYXJlIGF2YWlsYWJsZSAqLwotcmVzdGFydF9wb2xsOgotICAgICAgICBwLmZkID0gZHYtPmZkOwotICAgICAgICBwLmV2ZW50cyA9IFBPTExJTiB8IFBPTExFUlIgfCBQT0xMSFVQOwotICAgICAgICBpZiAocG9sbCgmcCwgMSwgLTEpIDwgMCkgewotICAgICAgICAgICAgaWYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikKLSAgICAgICAgICAgICAgICBnb3RvIHJlc3RhcnRfcG9sbDsKLSAgICAgICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfRVJST1IsICJQb2xsIGZhaWxlZDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGlvY3RsKGR2LT5mZCwgRFYxMzk0X0dFVF9TVEFUVVMsICZzKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IHN0YXR1czogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgICAgICB9Ci0gICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfVFJBQ0UsICJEVjEzOTQ6IHN0YXR1c1xuIgotICAgICAgICAgICAgICAgICJcdGFjdGl2ZV9mcmFtZVx0JWRcbiIKLSAgICAgICAgICAgICAgICAiXHRmaXJzdF9jbGVhcl9mcmFtZVx0JWRcbiIKLSAgICAgICAgICAgICAgICAiXHRuX2NsZWFyX2ZyYW1lc1x0JWRcbiIKLSAgICAgICAgICAgICAgICAiXHRkcm9wcGVkX2ZyYW1lc1x0JWRcbiIsCi0gICAgICAgICAgICAgICAgcy5hY3RpdmVfZnJhbWUsIHMuZmlyc3RfY2xlYXJfZnJhbWUsCi0gICAgICAgICAgICAgICAgcy5uX2NsZWFyX2ZyYW1lcywgcy5kcm9wcGVkX2ZyYW1lcyk7Ci0KLSAgICAgICAgZHYtPmF2YWlsID0gcy5uX2NsZWFyX2ZyYW1lczsKLSAgICAgICAgZHYtPmluZGV4ID0gcy5maXJzdF9jbGVhcl9mcmFtZTsKLSAgICAgICAgZHYtPmRvbmUgID0gMDsKLQotICAgICAgICBpZiAocy5kcm9wcGVkX2ZyYW1lcykgewotICAgICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkRWMTM5NDogRnJhbWUgZHJvcCBkZXRlY3RlZCAoJWQpLiBSZXNldGluZyAuLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgcy5kcm9wcGVkX2ZyYW1lcyk7Ci0KLSAgICAgICAgICAgIGR2MTM5NF9yZXNldChkdik7Ci0gICAgICAgICAgICBkdjEzOTRfc3RhcnQoZHYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19UUkFDRSwgImluZGV4ICVkLCBhdmFpbCAlZCwgZG9uZSAlZFxuIiwgZHYtPmluZGV4LCBkdi0+YXZhaWwsCi0gICAgICAgICAgICBkdi0+ZG9uZSk7Ci0KLSAgICBzaXplID0gYXZwcml2X2R2X3Byb2R1Y2VfcGFja2V0KGR2LT5kdl9kZW11eCwgcGt0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdi0+cmluZyArIChkdi0+aW5kZXggKiBEVjEzOTRfUEFMX0ZSQU1FX1NJWkUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVjEzOTRfUEFMX0ZSQU1FX1NJWkUsIC0xKTsKLSAgICBkdi0+aW5kZXggPSAoZHYtPmluZGV4ICsgMSkgJSBEVjEzOTRfUklOR19GUkFNRVM7Ci0gICAgZHYtPmRvbmUrKzsgZHYtPmF2YWlsLS07Ci0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIGludCBkdjEzOTRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICogY29udGV4dCkKLXsKLSAgICBzdHJ1Y3QgZHYxMzk0X2RhdGEgKmR2ID0gY29udGV4dC0+cHJpdl9kYXRhOwotCi0gICAgLyogU2h1dGRvd24gRFYxMzk0IHJlY2VpdmVyICovCi0gICAgaWYgKGlvY3RsKGR2LT5mZCwgRFYxMzk0X1NIVVRET1dOLCAwKSA8IDApCi0gICAgICAgIGF2X2xvZyhjb250ZXh0LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2h1dGRvd24gRFYxMzk0OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLQotICAgIC8qIFVubWFwIHJpbmcgYnVmZmVyICovCi0gICAgaWYgKG11bm1hcChkdi0+cmluZywgRFYxMzk0X05UU0NfRlJBTUVfU0laRSAqIERWMTM5NF9SSU5HX0ZSQU1FUykgPCAwKQotICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG11bm1hcCBEVjEzOTQgcmluZyBidWZmZXI6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotCi0gICAgY2xvc2UoZHYtPmZkKTsKLSAgICBhdl9mcmVlcCgmZHYtPmR2X2RlbXV4KTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewotICAgIHsgInN0YW5kYXJkIiwgIiIsIG9mZnNldG9mKHN0cnVjdCBkdjEzOTRfZGF0YSwgZm9ybWF0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERWMTM5NF9OVFNDfSwgRFYxMzk0X05UU0MsIERWMTM5NF9QQUwsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCi0gICAgeyAiUEFMIiwgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRFYxMzk0X1BBTH0sICAgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJzdGFuZGFyZCIgfSwKLSAgICB7ICJOVFNDIiwgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBEVjEzOTRfTlRTQ30sICAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgInN0YW5kYXJkIiB9LAotICAgIHsgImNoYW5uZWwiLCAgIiIsIG9mZnNldG9mKHN0cnVjdCBkdjEzOTRfZGF0YSwgY2hhbm5lbCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBEVjEzOTRfREVGQVVMVF9DSEFOTkVMfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKLSAgICB7IE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBBVkNsYXNzIGR2MTM5NF9jbGFzcyA9IHsKLSAgICAuY2xhc3NfbmFtZSA9ICJEVjEzOTQgaW5kZXYiLAotICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAotICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAotICAgIC5jYXRlZ29yeSAgID0gQVZfQ0xBU1NfQ0FURUdPUllfREVWSUNFX1ZJREVPX0lOUFVULAotfTsKLQotQVZJbnB1dEZvcm1hdCBmZl9kdjEzOTRfZGVtdXhlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAiZHYxMzk0IiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRFYxMzk0IEEvViBncmFiIiksCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBkdjEzOTRfZGF0YSksCi0gICAgLnJlYWRfaGVhZGVyICAgID0gZHYxMzk0X3JlYWRfaGVhZGVyLAotICAgIC5yZWFkX3BhY2tldCAgICA9IGR2MTM5NF9yZWFkX3BhY2tldCwKLSAgICAucmVhZF9jbG9zZSAgICAgPSBkdjEzOTRfY2xvc2UsCi0gICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAotICAgIC5wcml2X2NsYXNzICAgICA9ICZkdjEzOTRfY2xhc3MsCi19OwpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvZHYxMzk0LmggYi9saWJhdmRldmljZS9kdjEzOTQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2ZDYzMy4uMDAwMDAwMAotLS0gYS9saWJhdmRldmljZS9kdjEzOTQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vKgotICogRFYgaW5wdXQvb3V0cHV0IG92ZXIgSUVFRSAxMzk0IG9uIE9IQ0kgY2hpcHMKLSAqICAgQ29weXJpZ2h0IChDKTIwMDEgRGFuaWVsIE1hYXMgPGRtYWFzQGRjaW5lLmNvbT4KLSAqICAgICByZWNlaXZlLCBwcm9jX2ZzIGJ5IERhbiBEZW5uZWR5IDxkYW5AZGVubmVkeS5vcmc+Ci0gKgotICogYmFzZWQgb246Ci0gKiAgIHZpZGVvMTM5NC5oIC0gZHJpdmVyIGZvciBPSENJIDEzOTQgYm9hcmRzCi0gKiAgIENvcHlyaWdodCAoQykxOTk5LDIwMDAgU2ViYXN0aWVuIFJvdWdlYXV4IDxzZWJhc3RpZW4ucm91Z2VhdXhAYW51LmVkdS5hdT4KLSAqICAgICAgICAgICAgICAgICAgICAgICAgICBQZXRlciBTY2hsYWlsZSA8dWRiekByei51bmkta2FybHNydWhlLmRlPgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZuZGVmIEFWREVWSUNFX0RWMTM5NF9ICi0jZGVmaW5lIEFWREVWSUNFX0RWMTM5NF9ICi0KLSNkZWZpbmUgRFYxMzk0X0RFRkFVTFRfQ0hBTk5FTCA2MwotI2RlZmluZSBEVjEzOTRfREVGQVVMVF9DQVJEICAgIDAKLSNkZWZpbmUgRFYxMzk0X1JJTkdfRlJBTUVTICAgICAyMAotCi0jZGVmaW5lIERWMTM5NF9XSURUSCAgNzIwCi0jZGVmaW5lIERWMTM5NF9OVFNDX0hFSUdIVCA0ODAKLSNkZWZpbmUgRFYxMzk0X1BBTF9IRUlHSFQgNTc2Ci0KLS8qIFRoaXMgaXMgdGhlIHB1YmxpYyB1c2VyLXNwYWNlIGludGVyZmFjZS4gVHJ5IG5vdCB0byBicmVhayBpdC4gKi8KLQotI2RlZmluZSBEVjEzOTRfQVBJX1ZFUlNJT04gMHgyMDAxMTEyNwotCi0vKiAqKioqKioqKioqKioqKioqKioqKgotICAgKiogICAgICAgICAgICAgICAgKioKLSAgICoqICAgRFYxMzk0IEFQSSAgICoqCi0gICAqKiAgICAgICAgICAgICAgICAqKgotICAgKioqKioqKioqKioqKioqKioqKioKLQotICAgVGhlcmUgYXJlIHR3byBtZXRob2RzIG9mIG9wZXJhdGluZyB0aGUgRFYxMzk0IERWIG91dHB1dCBkZXZpY2UuCi0KLSAgIDEpCi0KLSAgIFRoZSBzaW1wbGVzdCBpcyBhbiBpbnRlcmZhY2UgYmFzZWQgb24gd3JpdGUoKTogc2ltcGx5IHdyaXRlCi0gICBmdWxsIERWIGZyYW1lcyBvZiBkYXRhIHRvIHRoZSBkZXZpY2UsIGFuZCB0aGV5IHdpbGwgYmUgdHJhbnNtaXR0ZWQKLSAgIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIFRoZSBGRCBtYXkgYmUgc2V0IGZvciBub24tYmxvY2tpbmcgSS9PLAotICAgaW4gd2hpY2ggY2FzZSB5b3UgY2FuIHVzZSBzZWxlY3QoKSBvciBwb2xsKCkgdG8gd2FpdCBmb3Igb3V0cHV0Ci0gICBidWZmZXIgc3BhY2UuCi0KLSAgIFRvIHNldCB0aGUgRFYgb3V0cHV0IHBhcmFtZXRlcnMgKGUuZy4gd2hldGhlciB5b3Ugd2FudCBOVFNDIG9yIFBBTAotICAgdmlkZW8pLCB1c2UgdGhlIERWMTM5NF9JTklUIGlvY3RsLCBwYXNzaW5nIGluIHRoZSBwYXJhbWV0ZXJzIHlvdQotICAgd2FudCBpbiBhIHN0cnVjdCBkdjEzOTRfaW5pdC4KLQotICAgRXhhbXBsZSAxOgotICAgICAgICAgVG8gcGxheSBhIHJhdyAuRFYgZmlsZTogICBjYXQgZm9vLkRWID4gL2Rldi9kdjEzOTQKLSAgICAgICAgIChjYXQgd2lsbCB1c2Ugd3JpdGUoKSBpbnRlcm5hbGx5KQotCi0gICBFeGFtcGxlIDI6Ci0gICAgICAgICAgIHN0YXRpYyBzdHJ1Y3QgZHYxMzk0X2luaXQgaW5pdCA9IHsKLSAgICAgICAgICAgICAgMHg2MywgICAgICAgIChicm9hZGNhc3QgY2hhbm5lbCkKLSAgICAgICAgICAgICAgNCwgICAgICAgICAgIChmb3VyLWZyYW1lIHJpbmdidWZmZXIpCi0gICAgICAgICAgICAgIERWMTM5NF9OVFNDLCAoc2VuZCBOVFNDIHZpZGVvKQotICAgICAgICAgICAgICAwLCAwICAgICAgICAgKGRlZmF1bHQgZW1wdHkgcGFja2V0IHJhdGUpCi0gICAgICAgICAgIH0KLQotICAgICAgICAgICBpb2N0bChmZCwgRFYxMzk0X0lOSVQsICZpbml0KTsKLQotICAgICAgICAgICB3aGlsZSgxKSB7Ci0gICAgICAgICAgICAgICAgICByZWFkKCA8YSByYXcgRFYgZmlsZT4sIGJ1ZiwgRFYxMzk0X05UU0NfRlJBTUVfU0laRSApOwotICAgICAgICAgICAgICAgICAgd3JpdGUoIDx0aGUgZHYxMzk0IEZEPiwgYnVmLCBEVjEzOTRfTlRTQ19GUkFNRV9TSVpFICk7Ci0gICAgICAgICAgIH0KLQotICAgMikKLQotICAgRm9yIG1vcmUgY29udHJvbCBvdmVyIGJ1ZmZlcmluZywgYW5kIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGNvcGllcwotICAgb2YgdGhlIERWIGRhdGEsIHlvdSBjYW4gdXNlIHRoZSBtb3JlIHNvcGhpc3RpY2F0ZWQgdGhlIG1tYXAoKSBpbnRlcmZhY2UuCi0gICBGaXJzdCwgY2FsbCB0aGUgRFYxMzk0X0lOSVQgaW9jdGwgdG8gc3BlY2lmeSB5b3VyIHBhcmFtZXRlcnMsCi0gICBpbmNsdWRpbmcgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHJpbmdidWZmZXIuIFRoZW4sIGNhbGxpbmcgbW1hcCgpCi0gICBvbiB0aGUgZHYxMzk0IGRldmljZSB3aWxsIGdpdmUgeW91IGRpcmVjdCBhY2Nlc3MgdG8gdGhlIHJpbmdidWZmZXIKLSAgIGZyb20gd2hpY2ggdGhlIERWIGNhcmQgcmVhZHMgeW91ciBmcmFtZSBkYXRhLgotCi0gICBUaGUgcmluZ2J1ZmZlciBpcyBzaW1wbHkgb25lIGxhcmdlLCBjb250aWd1b3VzIHJlZ2lvbiBvZiBtZW1vcnkKLSAgIGNvbnRhaW5pbmcgdHdvIG9yIG1vcmUgZnJhbWVzIG9mIHBhY2tlZCBEViBkYXRhLiBFYWNoIGZyYW1lIG9mIERWIGRhdGEKLSAgIGlzIDEyMDAwMCBieXRlcyAoTlRTQykgb3IgMTQ0MDAwIGJ5dGVzIChQQUwpLgotCi0gICBGaWxsIG9uZSBvciBtb3JlIGZyYW1lcyBpbiB0aGUgcmluZ2J1ZmZlciwgdGhlbiB1c2UgdGhlIERWMTM5NF9TVUJNSVRfRlJBTUVTCi0gICBpb2N0bCB0byBiZWdpbiBJL08uIFlvdSBjYW4gdXNlIGVpdGhlciB0aGUgRFYxMzk0X1dBSVRfRlJBTUVTIGlvY3RsCi0gICBvciBzZWxlY3QoKS9wb2xsKCkgdG8gd2FpdCB1bnRpbCB0aGUgZnJhbWVzIGFyZSB0cmFuc21pdHRlZC4gTmV4dCwgeW91J2xsCi0gICBuZWVkIHRvIGNhbGwgdGhlIERWMTM5NF9HRVRfU1RBVFVTIGlvY3RsIHRvIGRldGVybWluZSB3aGljaCByaW5nYnVmZmVyCi0gICBmcmFtZXMgYXJlIGNsZWFyIChyZWFkeSB0byBiZSBmaWxsZWQgd2l0aCBuZXcgRFYgZGF0YSkuIEZpbmFsbHksIHVzZQotICAgRFYxMzk0X1NVQk1JVF9GUkFNRVMgYWdhaW4gdG8gc2VuZCB0aGUgbmV3IGRhdGEgdG8gdGhlIERWIG91dHB1dC4KLQotCi0gICBFeGFtcGxlOiBoZXJlIGlzIHdoYXQgYSBmb3VyLWZyYW1lIHJpbmdidWZmZXIgbWlnaHQgbG9vayBsaWtlCi0gICAgICAgICAgICBkdXJpbmcgRFYgdHJhbnNtaXNzaW9uOgotCi0KLSAgICAgICAgIGZyYW1lIDAgICBmcmFtZSAxICAgZnJhbWUgMiAgIGZyYW1lIDMKLQotICAgICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCi0gICAgICAgIHwgQ0xFQVIgICB8IERWIGRhdGEgfCBEViBkYXRhIHwgQ0xFQVIgIHwKLSAgICAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKgotICAgICAgICAgICAgICAgICAgIDxBQ1RJVkU+Ci0KLSAgICAgICAgdHJhbnNtaXNzaW9uIGdvZXMgaW4gdGhpcyBkaXJlY3Rpb24gLS0tPj4+Ci0KLQotICAgVGhlIERWIGhhcmR3YXJlIGlzIGN1cnJlbnRseSB0cmFuc21pdHRpbmcgdGhlIGRhdGEgaW4gZnJhbWUgMS4KLSAgIE9uY2UgZnJhbWUgMSBpcyBmaW5pc2hlZCwgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IHRyYW5zbWl0IGZyYW1lIDIuCi0gICAoaWYgZnJhbWUgMiBmaW5pc2hlcyBiZWZvcmUgZnJhbWUgMyBpcyBzdWJtaXR0ZWQsIHRoZSBkZXZpY2UKLSAgIHdpbGwgY29udGludWUgdG8gdHJhbnNtaXQgZnJhbWUgMiwgYW5kIHdpbGwgaW5jcmVhc2UgdGhlIGRyb3BwZWRfZnJhbWVzCi0gICBjb3VudGVyIGVhY2ggdGltZSBpdCByZXBlYXRzIHRoZSB0cmFuc21pc3Npb24pLgotCi0KLSAgIElmIHlvdSBjYWxsZWQgRFYxMzk0X0dFVF9TVEFUVVMgYXQgdGhpcyBpbnN0YW50LCB5b3Ugd291bGQKLSAgIHJlY2VpdmUgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0KLSAgICAgICAgICAgICAgICAgIG5fZnJhbWVzICAgICAgICAgID0gNAotICAgICAgICAgICAgICAgICAgYWN0aXZlX2ZyYW1lICAgICAgPSAxCi0gICAgICAgICAgICAgICAgICBmaXJzdF9jbGVhcl9mcmFtZSA9IDMKLSAgICAgICAgICAgICAgICAgIG5fY2xlYXJfZnJhbWVzICAgID0gMgotCi0gICBBdCB0aGlzIHBvaW50LCB5b3Ugc2hvdWxkIHdyaXRlIG5ldyBEViBkYXRhIGludG8gZnJhbWUgMyBhbmQgb3B0aW9uYWxseQotICAgZnJhbWUgMC4gVGhlbiBjYWxsIERWMTM5NF9TVUJNSVRfRlJBTUVTIHRvIGluZm9ybSB0aGUgZGV2aWNlIHRoYXQKLSAgIGl0IG1heSB0cmFuc21pdCB0aGUgbmV3IGZyYW1lcy4KLQotICAgRVJST1IgSEFORExJTkcKLQotICAgQW4gZXJyb3IgKGJ1ZmZlciB1bmRlcmZsb3cvb3ZlcmZsb3cgb3IgYSBicmVhayBpbiB0aGUgRFYgc3RyZWFtIGR1ZQotICAgdG8gYSAxMzk0IGJ1cyByZXNldCkgY2FuIGJlIGRldGVjdGVkIGJ5IGNoZWNraW5nIHRoZSBkcm9wcGVkX2ZyYW1lcwotICAgZmllbGQgb2Ygc3RydWN0IGR2MTM5NF9zdGF0dXMgKG9idGFpbmVkIHRocm91Z2ggdGhlCi0gICBEVjEzOTRfR0VUX1NUQVRVUyBpb2N0bCkuCi0KLSAgIFRoZSBiZXN0IHdheSB0byByZWNvdmVyIGZyb20gc3VjaCBhbiBlcnJvciBpcyB0byByZS1pbml0aWFsaXplCi0gICBkdjEzOTQsIGVpdGhlciBieSB1c2luZyB0aGUgRFYxMzk0X0lOSVQgaW9jdGwgY2FsbCwgb3IgY2xvc2luZyB0aGUKLSAgIGZpbGUgZGVzY3JpcHRvciBhbmQgb3BlbmluZyBpdCBhZ2Fpbi4gKG5vdGUgdGhhdCB5b3UgbXVzdCB1bm1hcCBhbGwKLSAgIHJpbmdidWZmZXIgbWFwcGluZ3Mgd2hlbiBjbG9zaW5nIHRoZSBmaWxlIGRlc2NyaXB0b3IsIG9yIGVsc2UKLSAgIGR2MTM5NCB3aWxsIHN0aWxsIGJlIGNvbnNpZGVyZWQgJ2luIHVzZScpLgotCi0gICBNQUlOIExPT1AKLQotICAgRm9yIG1heGltdW0gZWZmaWNpZW5jeSBhbmQgcm9idXN0bmVzcyBhZ2FpbnN0IGJ1cyBlcnJvcnMsIHlvdSBhcmUKLSAgIGFkdmlzZWQgdG8gbW9kZWwgdGhlIG1haW4gbG9vcCBvZiB5b3VyIGFwcGxpY2F0aW9uIGFmdGVyIHRoZQotICAgZm9sbG93aW5nIHBzZXVkby1jb2RlIGV4YW1wbGU6Ci0KLSAgIChjaGVja3Mgb2Ygc3lzdGVtIGNhbGwgcmV0dXJuIHZhbHVlcyBvbWl0dGVkIGZvciBicmV2aXR5OyBhbHdheXMKLSAgIGNoZWNrIHJldHVybiB2YWx1ZXMgaW4geW91ciBjb2RlISkKLQotICAgd2hpbGUoIGZyYW1lcyBsZWZ0ICkgewotCi0gICAgc3RydWN0IHBvbGxmZCAqcGZkID0gLi4uOwotCi0gICAgcGZkLT5mZCA9IGR2MTM5NF9mZDsKLSAgICBwZmQtPnJldmVudHMgPSAwOwotICAgIHBmZC0+ZXZlbnRzID0gUE9MTE9VVCB8IFBPTExJTjsgKE9VVCBmb3IgdHJhbnNtaXQsIElOIGZvciByZWNlaXZlKQotCi0gICAgKGFkZCBvdGhlciBzb3VyY2VzIG9mIEkvTyBoZXJlKQotCi0gICAgcG9sbChwZmQsIDEsIC0xKTsgKG9yIHNlbGVjdCgpOyBhZGQgYSB0aW1lb3V0IGlmIHlvdSB3YW50KQotCi0gICAgaWYocGZkLT5yZXZlbnRzKSB7Ci0gICAgICAgICBzdHJ1Y3QgZHYxMzk0X3N0YXR1cyBzdGF0dXM7Ci0KLSAgICAgICAgIGlvY3RsKGR2MTM5NF9mZCwgRFYxMzk0X0dFVF9TVEFUVVMsICZzdGF0dXMpOwotCi0gICAgICAgICBpZihzdGF0dXMuZHJvcHBlZF9mcmFtZXMgPiAwKSB7Ci0gICAgICAgICAgICAgIHJlc2V0X2R2MTM5NCgpOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdGF0dXMubl9jbGVhcl9mcmFtZXM7IGkrKykgewotICAgICAgICAgICAgICAgICAgY29weV9EVl9mcmFtZSgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgfQotICAgfQotCi0gICB3aGVyZSBjb3B5X0RWX2ZyYW1lKCkgcmVhZHMgb3Igd3JpdGVzIG9uIHRoZSBkdjEzOTQgZmlsZSBkZXNjcmlwdG9yCi0gICAocmVhZC93cml0ZSBtb2RlKSBvciBjb3BpZXMgZGF0YSB0by9mcm9tIHRoZSBtbWFwIHJpbmdidWZmZXIgYW5kCi0gICB0aGVuIGNhbGxzIGlvY3RsKERWMTM5NF9TVUJNSVRfRlJBTUVTKSB0byBub3RpZnkgZHYxMzk0IHRoYXQgbmV3Ci0gICBmcmFtZXMgYXJlIGF2YWlsYWJsZSAobW1hcCBtb2RlKS4KLQotICAgcmVzZXRfZHYxMzk0KCkgaXMgY2FsbGVkIGluIHRoZSBldmVudCBvZiBhIGJ1ZmZlcgotICAgdW5kZXJmbG93L292ZXJmbG93IG9yIGEgaGFsdCBpbiB0aGUgRFYgc3RyZWFtIChlLmcuIGR1ZSB0byBhIDEzOTQKLSAgIGJ1cyByZXNldCkuIFRvIGd1YXJhbnRlZSByZWNvdmVyeSBmcm9tIHRoZSBlcnJvciwgdGhpcyBmdW5jdGlvbgotICAgc2hvdWxkIGNsb3NlIHRoZSBkdjEzOTQgZmlsZSBkZXNjcmlwdG9yIChhbmQgbXVubWFwKCkgYWxsCi0gICByaW5nYnVmZmVyIG1hcHBpbmdzLCBpZiB5b3UgYXJlIHVzaW5nIHRoZW0pLCB0aGVuIHJlLW9wZW4gdGhlCi0gICBkdjEzOTQgZGV2aWNlIChhbmQgcmUtbWFwIHRoZSByaW5nYnVmZmVyKS4KLQotKi8KLQotCi0vKiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHJpbmdidWZmZXIgKi8KLSNkZWZpbmUgRFYxMzk0X01BWF9GUkFNRVMgMzIKLQotLyogbnVtYmVyIG9mICpmdWxsKiBpc29jaHJvbm91cyBwYWNrZXRzIHBlciBEViBmcmFtZSAqLwotI2RlZmluZSBEVjEzOTRfTlRTQ19QQUNLRVRTX1BFUl9GUkFNRSAyNTAKLSNkZWZpbmUgRFYxMzk0X1BBTF9QQUNLRVRTX1BFUl9GUkFNRSAgMzAwCi0KLS8qIHNpemUgb2Ygb25lIGZyYW1lJ3Mgd29ydGggb2YgRFYgZGF0YSwgaW4gYnl0ZXMgKi8KLSNkZWZpbmUgRFYxMzk0X05UU0NfRlJBTUVfU0laRSAoNDgwICogRFYxMzk0X05UU0NfUEFDS0VUU19QRVJfRlJBTUUpCi0jZGVmaW5lIERWMTM5NF9QQUxfRlJBTUVfU0laRSAgKDQ4MCAqIERWMTM5NF9QQUxfUEFDS0VUU19QRVJfRlJBTUUpCi0KLQotLyogaW9jdGwoKSBjb21tYW5kcyAqLwotCi1lbnVtIHsKLSAgICAgICAgLyogSSBkb24ndCBsaWtlIHVzaW5nIDAgYXMgYSB2YWxpZCBpb2N0bCgpICovCi0gICAgICAgIERWMTM5NF9JTlZBTElEID0gMCwKLQotCi0gICAgICAgIC8qIGdldCB0aGUgZHJpdmVyIHJlYWR5IHRvIHRyYW5zbWl0IHZpZGVvLgotICAgICAgICAgICBwYXNzIGEgc3RydWN0IGR2MTM5NF9pbml0KiBhcyB0aGUgcGFyYW1ldGVyIChzZWUgYmVsb3cpLAotICAgICAgICAgICBvciBOVUxMIHRvIGdldCBkZWZhdWx0IHBhcmFtZXRlcnMgKi8KLSAgICAgICAgRFYxMzk0X0lOSVQsCi0KLQotICAgICAgICAvKiBzdG9wIHRyYW5zbWl0dGluZyB2aWRlbyBhbmQgZnJlZSB0aGUgcmluZ2J1ZmZlciAqLwotICAgICAgICBEVjEzOTRfU0hVVERPV04sCi0KLQotICAgICAgICAvKiBzdWJtaXQgTiBuZXcgZnJhbWVzIHRvIGJlIHRyYW5zbWl0dGVkLCB3aGVyZQotICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5ldyBmcmFtZSBpcyBmaXJzdF9jbGVhcl9idWZmZXIsCi0gICAgICAgICAgIGFuZCB0aGUgaW5kZXggb2YgdGhlIGxhc3QgbmV3IGZyYW1lIGlzCi0gICAgICAgICAgIChmaXJzdF9jbGVhcl9idWZmZXIgKyBOKSAlIG5fZnJhbWVzICovCi0gICAgICAgIERWMTM5NF9TVUJNSVRfRlJBTUVTLAotCi0KLSAgICAgICAgLyogYmxvY2sgdW50aWwgTiBidWZmZXJzIGFyZSBjbGVhciAocGFzcyBOIGFzIHRoZSBwYXJhbWV0ZXIpCi0gICAgICAgICAgIEJlY2F1c2Ugd2UgcmUtdHJhbnNtaXQgdGhlIGxhc3QgZnJhbWUgb24gdW5kZXJydW4sIHRoZXJlCi0gICAgICAgICAgIHdpbGwgYXQgbW9zdCBiZSBuX2ZyYW1lcyAtIDEgY2xlYXIgZnJhbWVzIGF0IGFueSB0aW1lICovCi0gICAgICAgIERWMTM5NF9XQUlUX0ZSQU1FUywKLQotICAgICAgICAvKiBjYXB0dXJlIG5ldyBmcmFtZXMgdGhhdCBoYXZlIGJlZW4gcmVjZWl2ZWQsIHdoZXJlCi0gICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgbmV3IGZyYW1lIGlzIGZpcnN0X2NsZWFyX2J1ZmZlciwKLSAgICAgICAgICAgYW5kIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBuZXcgZnJhbWUgaXMKLSAgICAgICAgICAgKGZpcnN0X2NsZWFyX2J1ZmZlciArIE4pICUgbl9mcmFtZXMgKi8KLSAgICAgICAgRFYxMzk0X1JFQ0VJVkVfRlJBTUVTLAotCi0KLSAgICAgICAgRFYxMzk0X1NUQVJUX1JFQ0VJVkUsCi0KLQotICAgICAgICAvKiBwYXNzIGEgc3RydWN0IGR2MTM5NF9zdGF0dXMqIGFzIHRoZSBwYXJhbWV0ZXIgKHNlZSBiZWxvdykgKi8KLSAgICAgICAgRFYxMzk0X0dFVF9TVEFUVVMsCi19OwotCi0KLQotZW51bSBwYWxfb3JfbnRzYyB7Ci0gICAgICAgIERWMTM5NF9OVFNDID0gMCwKLSAgICAgICAgRFYxMzk0X1BBTAotfTsKLQotCi0KLQotLyogdGhpcyBpcyB0aGUgYXJndW1lbnQgdG8gRFYxMzk0X0lOSVQgKi8KLXN0cnVjdCBkdjEzOTRfaW5pdCB7Ci0gICAgICAgIC8qIERWMTM5NF9BUElfVkVSU0lPTiAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgYXBpX3ZlcnNpb247Ci0KLSAgICAgICAgLyogaXNvY2hyb25vdXMgdHJhbnNtaXNzaW9uIGNoYW5uZWwgdG8gdXNlICovCi0gICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsOwotCi0gICAgICAgIC8qIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHJpbmdidWZmZXIuIE11c3QgYmUgYXQgbGVhc3QgMgotICAgICAgICAgICBhbmQgYXQgbW9zdCBEVjEzOTRfTUFYX0ZSQU1FUy4gKi8KLSAgICAgICAgdW5zaWduZWQgaW50IG5fZnJhbWVzOwotCi0gICAgICAgIC8qIHNlbmQvcmVjZWl2ZSBQQUwgb3IgTlRTQyB2aWRlbyBmb3JtYXQgKi8KLSAgICAgICAgZW51bSBwYWxfb3JfbnRzYyBmb3JtYXQ7Ci0KLSAgICAgICAgLyogdGhlIGZvbGxvd2luZyBhcmUgdXNlZCBvbmx5IGZvciB0cmFuc21pc3Npb24gKi8KLQotICAgICAgICAvKiBzZXQgdGhlc2UgdG8gemVybyB1bmxlc3MgeW91IHdhbnQgYQotICAgICAgICAgICBub24tZGVmYXVsdCBlbXB0eSBwYWNrZXQgcmF0ZSAoc2VlIGJlbG93KSAqLwotICAgICAgICB1bnNpZ25lZCBsb25nIGNpcF9uOwotICAgICAgICB1bnNpZ25lZCBsb25nIGNpcF9kOwotCi0gICAgICAgIC8qIHNldCB0aGlzIHRvIHplcm8gdW5sZXNzIHlvdSB3YW50IGEKLSAgICAgICAgICAgbm9uLWRlZmF1bHQgU1lUIGN5Y2xlIG9mZnNldCAoZGVmYXVsdCA9IDMgY3ljbGVzKSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgc3l0X29mZnNldDsKLX07Ci0KLS8qIE5PVEU6IHlvdSBtYXkgb25seSBhbGxvY2F0ZSB0aGUgRFYgZnJhbWUgcmluZ2J1ZmZlciBvbmNlIGVhY2ggdGltZQotICAgeW91IG9wZW4gdGhlIGR2MTM5NCBkZXZpY2UuIERWMTM5NF9JTklUIHdpbGwgZmFpbCBpZiB5b3UgY2FsbCBpdCBhCi0gICBzZWNvbmQgdGltZSB3aXRoIGRpZmZlcmVudCAnbl9mcmFtZXMnIG9yICdmb3JtYXQnIGFyZ3VtZW50cyAod2hpY2gKLSAgIHdvdWxkIGltcGx5IGEgZGlmZmVyZW50IHNpemUgZm9yIHRoZSByaW5nYnVmZmVyKS4gSWYgeW91IG5lZWQgYQotICAgZGlmZmVyZW50IGJ1ZmZlciBzaXplLCBzaW1wbHkgY2xvc2UgYW5kIHJlLW9wZW4gdGhlIGRldmljZSwgdGhlbgotICAgaW5pdGlhbGl6ZSBpdCB3aXRoIHlvdXIgbmV3IHNldHRpbmdzLiAqLwotCi0vKiBROiBXaGF0IGFyZSBjaXBfbiBhbmQgY2lwX2Q/ICovCi0KLS8qCi0gIEE6IERWIHZpZGVvIHN0cmVhbXMgZG8gbm90IHV0aWxpemUgMTAwJSBvZiB0aGUgcG90ZW50aWFsIGJhbmR3aWR0aCBvZmZlcmVkCi0gIGJ5IElFRUUgMTM5NCAoRmlyZVdpcmUpLiBUbyBhY2hpZXZlIHRoZSBjb3JyZWN0IHJhdGUgb2YgZGF0YSB0cmFuc21pc3Npb24sCi0gIERWIGRldmljZXMgbXVzdCBwZXJpb2RpY2FsbHkgaW5zZXJ0IGVtcHR5IHBhY2tldHMgaW50byB0aGUgMTM5NCBkYXRhIHN0cmVhbS4KLSAgVHlwaWNhbGx5IHRoZXJlIGlzIG9uZSBlbXB0eSBwYWNrZXQgcGVyIDE0LTE2IGRhdGEtY2FycnlpbmcgcGFja2V0cy4KLQotICBTb21lIERWIGRldmljZXMgd2lsbCBhY2NlcHQgYSB3aWRlIHJhbmdlIG9mIGVtcHR5IHBhY2tldCByYXRlcywgd2hpbGUgb3RoZXJzCi0gIHJlcXVpcmUgYSBwcmVjaXNlIHJhdGUuIElmIHRoZSBkdjEzOTQgZHJpdmVyIHByb2R1Y2VzIGVtcHR5IHBhY2tldHMgYXQKLSAgYSByYXRlIHRoYXQgeW91ciBkZXZpY2UgZG9lcyBub3QgYWNjZXB0LCB5b3UgbWF5IHNlZSB1Z2x5IHBhdHRlcm5zIG9uIHRoZQotICBEViBvdXRwdXQsIG9yIGV2ZW4gbm8gb3V0cHV0IGF0IGFsbC4KLQotICBUaGUgZGVmYXVsdCBlbXB0eSBwYWNrZXQgaW5zZXJ0aW9uIHJhdGUgc2VlbXMgdG8gd29yayBmb3IgbWFueSBwZW9wbGU7IGlmCi0gIHlvdXIgRFYgb3V0cHV0IGlzIHN0YWJsZSwgeW91IGNhbiBzaW1wbHkgaWdub3JlIHRoaXMgZGlzY3Vzc2lvbi4gSG93ZXZlciwKLSAgd2UgaGF2ZSBleHBvc2VkIHRoZSBlbXB0eSBwYWNrZXQgcmF0ZSBhcyBhIHBhcmFtZXRlciB0byBzdXBwb3J0IGRldmljZXMgdGhhdAotICBkbyBub3Qgd29yayB3aXRoIHRoZSBkZWZhdWx0IHJhdGUuCi0KLSAgVGhlIGRlY2lzaW9uIHRvIGluc2VydCBhbiBlbXB0eSBwYWNrZXQgaXMgbWFkZSB3aXRoIGEgbnVtZXJhdG9yL2Rlbm9taW5hdG9yCi0gIGFsZ29yaXRobS4gRW1wdHkgcGFja2V0cyBhcmUgcHJvZHVjZWQgYXQgYW4gYXZlcmFnZSByYXRlIG9mIENJUF9OIC8gQ0lQX0QuCi0gIFlvdSBjYW4gYWx0ZXIgdGhlIGVtcHR5IHBhY2tldCByYXRlIGJ5IHBhc3Npbmcgbm9uLXplcm8gdmFsdWVzIGZvciBjaXBfbgotICBhbmQgY2lwX2QgdG8gdGhlIElOSVQgaW9jdGwuCi0KLSAqLwotCi0KLQotc3RydWN0IGR2MTM5NF9zdGF0dXMgewotICAgICAgICAvKiB0aGlzIGVtYmVkZGVkIGluaXQgc3RydWN0IHJldHVybnMgdGhlIGN1cnJlbnQgZHYxMzk0Ci0gICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdXNlICovCi0gICAgICAgIHN0cnVjdCBkdjEzOTRfaW5pdCBpbml0OwotCi0gICAgICAgIC8qIHRoZSByaW5nYnVmZmVyIGZyYW1lIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nCi0gICAgICAgICAgIGRpc3BsYXllZC4gKC0xIGlmIHRoZSBkZXZpY2UgaXMgbm90IHRyYW5zbWl0dGluZyBhbnl0aGluZykgKi8KLSAgICAgICAgaW50IGFjdGl2ZV9mcmFtZTsKLQotICAgICAgICAvKiBpbmRleCBvZiB0aGUgZmlyc3QgYnVmZmVyIChhaGVhZCBvZiBhY3RpdmVfZnJhbWUpIHRoYXQKLSAgICAgICAgICAgaXMgcmVhZHkgdG8gYmUgZmlsbGVkIHdpdGggZGF0YSAqLwotICAgICAgICB1bnNpZ25lZCBpbnQgZmlyc3RfY2xlYXJfZnJhbWU7Ci0KLSAgICAgICAgLyogaG93IG1hbnkgYnVmZmVycywgaW5jbHVkaW5nIGZpcnN0X2NsZWFyX2J1ZmZlciwgYXJlCi0gICAgICAgICAgIHJlYWR5IHRvIGJlIGZpbGxlZCB3aXRoIGRhdGEgKi8KLSAgICAgICAgdW5zaWduZWQgaW50IG5fY2xlYXJfZnJhbWVzOwotCi0gICAgICAgIC8qIGhvdyBtYW55IHRpbWVzIHRoZSBEViBzdHJlYW0gaGFzIHVuZGVyZmxvd2VkLCBvdmVyZmxvd2VkLAotICAgICAgICAgICBvciBvdGhlcndpc2UgZW5jb3VudGVyZWQgYW4gZXJyb3IsIHNpbmNlIHRoZSBwcmV2aW91cyBjYWxsCi0gICAgICAgICAgIHRvIERWMTM5NF9HRVRfU1RBVFVTICovCi0gICAgICAgIHVuc2lnbmVkIGludCBkcm9wcGVkX2ZyYW1lczsKLQotICAgICAgICAvKiBOLkIuIFRoZSBkcm9wcGVkX2ZyYW1lcyBjb3VudGVyIGlzIG9ubHkgYSBsb3dlciBib3VuZCBvbiB0aGUgYWN0dWFsCi0gICAgICAgICAgIG51bWJlciBvZiBkcm9wcGVkIGZyYW1lcywgd2l0aCB0aGUgc3BlY2lhbCBjYXNlIHRoYXQgaWYgZHJvcHBlZF9mcmFtZXMKLSAgICAgICAgICAgaXMgemVybywgdGhlbiBpdCBpcyBndWFyYW50ZWVkIHRoYXQgTk8gZnJhbWVzIGhhdmUgYmVlbiBkcm9wcGVkCi0gICAgICAgICAgIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gRFYxMzk0X0dFVF9TVEFUVVMuCi0gICAgICAgICovCi19OwotCi0KLSNlbmRpZiAvKiBBVkRFVklDRV9EVjEzOTRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvZmJkZXZfZGVjLmMgYi9saWJhdmRldmljZS9mYmRldl9kZWMuYwppbmRleCBlOWEzNjM5Li42YTUxODE2IDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9mYmRldl9kZWMuYworKysgYi9saWJhdmRldmljZS9mYmRldl9kZWMuYwpAQCAtNzgsOCArNzgsOCBAQAogICAgIGlmIChhdmN0eC0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PTkJMT0NLKQogICAgICAgICBmbGFncyB8PSBPX05PTkJMT0NLOwogCi0gICAgaWYgKGF2Y3R4LT5maWxlbmFtZVswXSkKLSAgICAgICAgZGV2aWNlID0gYXZjdHgtPmZpbGVuYW1lOworICAgIGlmIChhdmN0eC0+dXJsWzBdKQorICAgICAgICBkZXZpY2UgPSBhdmN0eC0+dXJsOwogICAgIGVsc2UKICAgICAgICAgZGV2aWNlID0gZmZfZmJkZXZfZGVmYXVsdF9kZXZpY2UoKTsKIApAQCAtMTI2LDEzICsxMjYsMTMgQEAKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKLSAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBmYmRldi0+d2lkdGg7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gZmJkZXYtPmhlaWdodDsKLSAgICBzdC0+Y29kZWMtPnBpeF9mbXQgICAgPSBwaXhfZm10OwotICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlICA9IGF2X2ludl9xKGZiZGV2LT5mcmFtZXJhdGVfcSk7Ci0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgID0KKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgID0gZmJkZXYtPndpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IGZiZGV2LT5oZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgICAgID0gcGl4X2ZtdDsKKyAgICBzdC0+YXZnX2ZyYW1lX3JhdGUgICAgICAgPSBmYmRldi0+ZnJhbWVyYXRlX3E7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgID0KICAgICAgICAgZmJkZXYtPndpZHRoICogZmJkZXYtPmhlaWdodCAqIGZiZGV2LT5ieXRlc19wZXJfcGl4ZWwgKiBhdl9xMmQoZmJkZXYtPmZyYW1lcmF0ZV9xKSAqIDg7CiAKICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLApAQCAtMTQwLDcgKzE0MCw3IEBACiAgICAgICAgICAgIGZiZGV2LT53aWR0aCwgZmJkZXYtPmhlaWdodCwgZmJkZXYtPnZhcmluZm8uYml0c19wZXJfcGl4ZWwsCiAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocGl4X2ZtdCksCiAgICAgICAgICAgIGZiZGV2LT5mcmFtZXJhdGVfcS5udW0sIGZiZGV2LT5mcmFtZXJhdGVfcS5kZW4sCi0gICAgICAgICAgIChpbnQ2NF90KXN0LT5jb2RlYy0+Yml0X3JhdGUpOworICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlKTsKICAgICByZXR1cm4gMDsKIAogZmFpbDoKQEAgLTIyMCw3ICsyMjAsNyBAQAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRkJEZXZDb250ZXh0LCB4KQogI2RlZmluZSBERUMgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7Ci0gICAgeyAiZnJhbWVyYXRlIiwiIiwgT0ZGU0VUKGZyYW1lcmF0ZV9xKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgREVDIH0sCisgICAgeyAiZnJhbWVyYXRlIiwiIiwgT0ZGU0VUKGZyYW1lcmF0ZV9xKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgSU5UX01BWCwgREVDIH0sCiAgICAgeyBOVUxMIH0sCiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9mYmRldl9lbmMuYyBiL2xpYmF2ZGV2aWNlL2ZiZGV2X2VuYy5jCmluZGV4IDI4ZWZjNzEuLjQxOTE1OTYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2ZiZGV2X2VuYy5jCisrKyBiL2xpYmF2ZGV2aWNlL2ZiZGV2X2VuYy5jCkBAIC00OCwxMyArNDgsMTMgQEAKICAgICBpbnQgcmV0LCBmbGFncyA9IE9fUkRXUjsKICAgICBjb25zdCBjaGFyKiBkZXZpY2U7CiAKLSAgICBpZiAoaC0+bmJfc3RyZWFtcyAhPSAxIHx8IGgtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgIGlmIChoLT5uYl9zdHJlYW1zICE9IDEgfHwgaC0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgIGF2X2xvZyhmYmRldiwgQVZfTE9HX0VSUk9SLCAiT25seSBhIHNpbmdsZSB2aWRlbyBzdHJlYW0gaXMgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgaWYgKGgtPmZpbGVuYW1lWzBdKQotICAgICAgICBkZXZpY2UgPSBoLT5maWxlbmFtZTsKKyAgICBpZiAoaC0+dXJsWzBdKQorICAgICAgICBkZXZpY2UgPSBoLT51cmw7CiAgICAgZWxzZQogICAgICAgICBkZXZpY2UgPSBmZl9mYmRldl9kZWZhdWx0X2RldmljZSgpOwogCkBAIC0xMDUsMTEgKzEwNSwxMSBAQAogICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmYl9waXhfZm10OwogICAgIGludCBkaXNwX2hlaWdodDsKICAgICBpbnQgYnl0ZXNfdG9fY29weTsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWNfY3R4ID0gaC0+c3RyZWFtc1swXS0+Y29kZWM7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHZpZGVvX3BpeF9mbXQgPSBjb2RlY19jdHgtPnBpeF9mbXQ7Ci0gICAgaW50IHZpZGVvX3dpZHRoID0gY29kZWNfY3R4LT53aWR0aDsKLSAgICBpbnQgdmlkZW9faGVpZ2h0ID0gY29kZWNfY3R4LT5oZWlnaHQ7Ci0gICAgaW50IGJ5dGVzX3Blcl9waXhlbCA9ICgoY29kZWNfY3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKyA3KSA+PiAzKTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gaC0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHZpZGVvX3BpeF9mbXQgPSBwYXItPmZvcm1hdDsKKyAgICBpbnQgdmlkZW9fd2lkdGggPSBwYXItPndpZHRoOworICAgIGludCB2aWRlb19oZWlnaHQgPSBwYXItPmhlaWdodDsKKyAgICBpbnQgYnl0ZXNfcGVyX3BpeGVsID0gKChwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSArIDcpID4+IDMpOwogICAgIGludCBzcmNfbGluZV9zaXplID0gdmlkZW9fd2lkdGggKiBieXRlc19wZXJfcGl4ZWw7CiAgICAgaW50IGk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2dkaWdyYWIuYyBiL2xpYmF2ZGV2aWNlL2dkaWdyYWIuYwppbmRleCA0NDI4YTM0Li5hYjA4YzExIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9nZGlncmFiLmMKKysrIGIvbGliYXZkZXZpY2UvZ2RpZ3JhYi5jCkBAIC0yMzAsMTIgKzIzMCwxNCBAQAogICAgIEhCSVRNQVAgaGJtcCAgID0gTlVMTDsKICAgICB2b2lkICpidWZmZXIgICA9IE5VTEw7CiAKLSAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IHMxLT5maWxlbmFtZTsKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IHMxLT51cmw7CiAgICAgY29uc3QgY2hhciAqbmFtZSAgICAgPSBOVUxMOwogICAgIEFWU3RyZWFtICAgKnN0ICAgICAgID0gTlVMTDsKIAogICAgIGludCBicHA7CisgICAgaW50IGhvcnpyZXM7CiAgICAgaW50IHZlcnRyZXM7CisgICAgaW50IGRlc2t0b3Bob3J6cmVzOwogICAgIGludCBkZXNrdG9wdmVydHJlczsKICAgICBSRUNUIHZpcnR1YWxfcmVjdDsKICAgICBSRUNUIGNsaXBfcmVjdDsKQEAgLTI3OSwxMSArMjgxLDEzIEBACiAgICAgICAgIEdldENsaWVudFJlY3QoaHduZCwgJnZpcnR1YWxfcmVjdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogZGVza3RvcCAtLSBnZXQgdGhlIHJpZ2h0IGhlaWdodCBhbmQgd2lkdGggZm9yIHNjYWxpbmcgRFBJICovCisgICAgICAgIGhvcnpyZXMgPSBHZXREZXZpY2VDYXBzKHNvdXJjZV9oZGMsIEhPUlpSRVMpOwogICAgICAgICB2ZXJ0cmVzID0gR2V0RGV2aWNlQ2Fwcyhzb3VyY2VfaGRjLCBWRVJUUkVTKTsKKyAgICAgICAgZGVza3RvcGhvcnpyZXMgPSBHZXREZXZpY2VDYXBzKHNvdXJjZV9oZGMsIERFU0tUT1BIT1JaUkVTKTsKICAgICAgICAgZGVza3RvcHZlcnRyZXMgPSBHZXREZXZpY2VDYXBzKHNvdXJjZV9oZGMsIERFU0tUT1BWRVJUUkVTKTsKICAgICAgICAgdmlydHVhbF9yZWN0LmxlZnQgPSBHZXRTeXN0ZW1NZXRyaWNzKFNNX1hWSVJUVUFMU0NSRUVOKTsKICAgICAgICAgdmlydHVhbF9yZWN0LnRvcCA9IEdldFN5c3RlbU1ldHJpY3MoU01fWVZJUlRVQUxTQ1JFRU4pOwotICAgICAgICB2aXJ0dWFsX3JlY3QucmlnaHQgPSAodmlydHVhbF9yZWN0LmxlZnQgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVklSVFVBTFNDUkVFTikpICogZGVza3RvcHZlcnRyZXMgLyB2ZXJ0cmVzOworICAgICAgICB2aXJ0dWFsX3JlY3QucmlnaHQgPSAodmlydHVhbF9yZWN0LmxlZnQgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVklSVFVBTFNDUkVFTikpICogZGVza3RvcGhvcnpyZXMgLyBob3J6cmVzOwogICAgICAgICB2aXJ0dWFsX3JlY3QuYm90dG9tID0gKHZpcnR1YWxfcmVjdC50b3AgKyBHZXRTeXN0ZW1NZXRyaWNzKFNNX0NZVklSVFVBTFNDUkVFTikpICogZGVza3RvcHZlcnRyZXMgLyB2ZXJ0cmVzOwogICAgIH0KIApAQCAtNDAzLDEwICs0MDcsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9CTVA7Ci0gICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UgID0gZ2RpZ3JhYi0+dGltZV9iYXNlOwotICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICA9IChnZGlncmFiLT5oZWFkZXJfc2l6ZSArIGdkaWdyYWItPmZyYW1lX3NpemUpICogMS9hdl9xMmQoZ2RpZ3JhYi0+dGltZV9iYXNlKSAqIDg7CisgICAgc3QtPmF2Z19mcmFtZV9yYXRlID0gYXZfaW52X3EoZ2RpZ3JhYi0+dGltZV9iYXNlKTsKKworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9CTVA7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgID0gKGdkaWdyYWItPmhlYWRlcl9zaXplICsgZ2RpZ3JhYi0+ZnJhbWVfc2l6ZSkgKiAxL2F2X3EyZChnZGlncmFiLT50aW1lX2Jhc2UpICogODsKIAogICAgIHJldHVybiAwOwogCkBAIC00NDYsNiArNDUxLDEwIEBACiAgICAgICAgIFBPSU5UIHBvczsKICAgICAgICAgUkVDVCBjbGlwX3JlY3QgPSBnZGlncmFiLT5jbGlwX3JlY3Q7CiAgICAgICAgIEhXTkQgaHduZCA9IGdkaWdyYWItPmh3bmQ7CisgICAgICAgIGludCBob3J6cmVzID0gR2V0RGV2aWNlQ2FwcyhnZGlncmFiLT5zb3VyY2VfaGRjLCBIT1JaUkVTKTsKKyAgICAgICAgaW50IHZlcnRyZXMgPSBHZXREZXZpY2VDYXBzKGdkaWdyYWItPnNvdXJjZV9oZGMsIFZFUlRSRVMpOworICAgICAgICBpbnQgZGVza3RvcGhvcnpyZXMgPSBHZXREZXZpY2VDYXBzKGdkaWdyYWItPnNvdXJjZV9oZGMsIERFU0tUT1BIT1JaUkVTKTsKKyAgICAgICAgaW50IGRlc2t0b3B2ZXJ0cmVzID0gR2V0RGV2aWNlQ2FwcyhnZGlncmFiLT5zb3VyY2VfaGRjLCBERVNLVE9QVkVSVFJFUyk7CiAgICAgICAgIGluZm8uaGJtTWFzayA9IE5VTEw7CiAgICAgICAgIGluZm8uaGJtQ29sb3IgPSBOVUxMOwogCkBAIC00NzksNiArNDg4LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvL3RoYXQgd291bGQga2VlcCB0aGUgY29ycmVjdCBsb2NhdGlvbiBvZiBtb3VzZSB3aXRoIGhpZHBpIHNjcmVlbnMKKyAgICAgICAgcG9zLnggPSBwb3MueCAqIGRlc2t0b3Bob3J6cmVzIC8gaG9yenJlczsKKyAgICAgICAgcG9zLnkgPSBwb3MueSAqIGRlc2t0b3B2ZXJ0cmVzIC8gdmVydHJlczsKKwogICAgICAgICBhdl9sb2coczEsIEFWX0xPR19ERUJVRywgIkN1cnNvciBwb3MgKCVsaSwlbGkpIC0+ICglbGksJWxpKVxuIiwKICAgICAgICAgICAgICAgICBjaS5wdFNjcmVlblBvcy54LCBjaS5wdFNjcmVlblBvcy55LCBwb3MueCwgcG9zLnkpOwogCkBAIC02MTUsNyArNjI4LDcgQEAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CiAgICAgeyAiZHJhd19tb3VzZSIsICJkcmF3IHRoZSBtb3VzZSBwb2ludGVyIiwgT0ZGU0VUKGRyYXdfbW91c2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDAsIDEsIERFQyB9LAogICAgIHsgInNob3dfcmVnaW9uIiwgImRyYXcgYm9yZGVyIGFyb3VuZCBjYXB0dXJlIGFyZWEiLCBPRkZTRVQoc2hvd19yZWdpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIDEsIERFQyB9LAotICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgdmlkZW8gZnJhbWUgcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICJudHNjIn0sIDAsIDAsIERFQyB9LAorICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgdmlkZW8gZnJhbWUgcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICJudHNjIn0sIDAsIElOVF9NQVgsIERFQyB9LAogICAgIHsgInZpZGVvX3NpemUiLCAic2V0IHZpZGVvIGZyYW1lIHNpemUiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBERUMgfSwKICAgICB7ICJvZmZzZXRfeCIsICJjYXB0dXJlIGFyZWEgeCBvZmZzZXQiLCBPRkZTRVQob2Zmc2V0X3gpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIElOVF9NSU4sIElOVF9NQVgsIERFQyB9LAogICAgIHsgIm9mZnNldF95IiwgImNhcHR1cmUgYXJlYSB5IG9mZnNldCIsIE9GRlNFVChvZmZzZXRfeSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgSU5UX01JTiwgSU5UX01BWCwgREVDIH0sCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9pZWM2MTg4My5jIGIvbGliYXZkZXZpY2UvaWVjNjE4ODMuYwppbmRleCBjNDVhZTlhLi5kY2Y3NTUzIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9pZWM2MTg4My5jCisrKyBiL2xpYmF2ZGV2aWNlL2llYzYxODgzLmMKQEAgLTExOCwxNCArMTE4LDE2IEBACiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKLSAgICBwYWNrZXQtPmJ1ZiA9IGF2X21hbGxvYyhsZW5ndGgpOworICAgIHBhY2tldC0+YnVmID0gYXZfbWFsbG9jKGxlbmd0aCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgIGlmICghcGFja2V0LT5idWYpIHsKKyAgICAgICAgYXZfZnJlZShwYWNrZXQpOwogICAgICAgICByZXQgPSAtMTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBwYWNrZXQtPmxlbiA9IGxlbmd0aDsKIAogICAgIG1lbWNweShwYWNrZXQtPmJ1ZiwgZGF0YSwgbGVuZ3RoKTsKKyAgICBtZW1zZXQocGFja2V0LT5idWYgKyBsZW5ndGgsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogCiAgICAgaWYgKGR2LT5xdWV1ZV9maXJzdCkgewogICAgICAgICBkdi0+cXVldWVfbGFzdC0+bmV4dCA9IHBhY2tldDsKQEAgLTE5OSwxMyArMjAxLDIxIEBACiAgICAgc2l6ZSA9IGF2cHJpdl9kdl9wcm9kdWNlX3BhY2tldChkdi0+ZHZfZGVtdXgsIHBrdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldC0+YnVmLCBwYWNrZXQtPmxlbiwgLTEpOwogICAgIGR2LT5xdWV1ZV9maXJzdCA9IHBhY2tldC0+bmV4dDsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIGF2X2ZyZWUocGFja2V0LT5idWYpOwogICAgIGF2X2ZyZWUocGFja2V0KTsKICAgICBkdi0+cGFja2V0cy0tOwogCi0gICAgaWYgKHNpemUgPiAwKQotICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgIHJldHVybiAtMTsKIAotICAgIHJldHVybiAtMTsKKyAgICBpZiAoYXZfcGFja2V0X2Zyb21fZGF0YShwa3QsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKSA8IDApIHsKKyAgICAgICAgYXZfZnJlZXAoJnBrdC0+ZGF0YSk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHNpemU7CiB9CiAKIHN0YXRpYyBpbnQgaWVjNjE4ODNfcGFyc2VfcXVldWVfaGR2KHN0cnVjdCBpZWM2MTg4M19kYXRhICpkdiwgQVZQYWNrZXQgKnBrdCkKQEAgLTI1OCwxNCArMjY4LDE0IEBACiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBpbnBvcnQgPSBzdHJ0b2woY29udGV4dC0+ZmlsZW5hbWUsICZlbmRwdHIsIDEwKTsKLSAgICBpZiAoZW5kcHRyICE9IGNvbnRleHQtPmZpbGVuYW1lICYmICplbmRwdHIgPT0gJ1wwJykgeworICAgIGlucG9ydCA9IHN0cnRvbChjb250ZXh0LT51cmwsICZlbmRwdHIsIDEwKTsKKyAgICBpZiAoZW5kcHRyICE9IGNvbnRleHQtPnVybCAmJiAqZW5kcHRyID09ICdcMCcpIHsKICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19JTkZPLCAiU2VsZWN0aW5nIElFRUUxMzk0IHBvcnQ6ICVkXG4iLCBpbnBvcnQpOwogICAgICAgICBqID0gaW5wb3J0OwogICAgICAgICBuYl9wb3J0cyA9IGlucG9ydCArIDE7Ci0gICAgfSBlbHNlIGlmIChzdHJjbXAoY29udGV4dC0+ZmlsZW5hbWUsICJhdXRvIikpIHsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChjb250ZXh0LT51cmwsICJhdXRvIikpIHsKICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaW5wdXQgXCIlc1wiLCB5b3Ugc2hvdWxkIHNwZWNpZnkgIgotICAgICAgICAgICAgICAgIlwiYXV0b1wiIGZvciBhdXRvLWRldGVjdGlvbiwgb3IgdGhlIHBvcnQgbnVtYmVyLlxuIiwgY29udGV4dC0+ZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIlwiYXV0b1wiIGZvciBhdXRvLWRldGVjdGlvbiwgb3IgdGhlIHBvcnQgbnVtYmVyLlxuIiwgY29udGV4dC0+dXJsKTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KIApAQCAtNDUzLDYgKzQ2Myw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgaWVjNjE4ODNfZHZfZmJfc3RvcChkdi0+aWVjNjE4ODNfZHYpOwogICAgICAgICBpZWM2MTg4M19kdl9mYl9jbG9zZShkdi0+aWVjNjE4ODNfZHYpOworICAgICAgICBhdl9mcmVlcCgmZHYtPmR2X2RlbXV4KTsKICAgICB9CiAgICAgd2hpbGUgKGR2LT5xdWV1ZV9maXJzdCkgewogICAgICAgICBEVlBhY2tldCAqcGFja2V0ID0gZHYtPnF1ZXVlX2ZpcnN0OwpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvamFjay5jIGIvbGliYXZkZXZpY2UvamFjay5jCmluZGV4IDllY2JmOWUuLjM0ZjFjNmQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2phY2suYworKysgYi9saWJhdmRldmljZS9qYWNrLmMKQEAgLTk0LDEzICs5NCw5IEBACiAKICAgICAvKiBDb3B5IGFuZCBpbnRlcmxlYXZlIGF1ZGlvIGRhdGEgZnJvbSB0aGUgSkFDSyBidWZmZXIgaW50byB0aGUgcGFja2V0ICovCiAgICAgZm9yIChpID0gMDsgaSA8IHNlbGYtPm5wb3J0czsgaSsrKSB7Ci0gICAgI2lmIEhBVkVfSkFDS19QT1JUX0dFVF9MQVRFTkNZX1JBTkdFCiAgICAgICAgIGphY2tfbGF0ZW5jeV9yYW5nZV90IHJhbmdlOwogICAgICAgICBqYWNrX3BvcnRfZ2V0X2xhdGVuY3lfcmFuZ2Uoc2VsZi0+cG9ydHNbaV0sIEphY2tDYXB0dXJlTGF0ZW5jeSwgJnJhbmdlKTsKICAgICAgICAgbGF0ZW5jeSArPSByYW5nZS5tYXg7Ci0gICAgI2Vsc2UKLSAgICAgICAgbGF0ZW5jeSArPSBqYWNrX3BvcnRfZ2V0X3RvdGFsX2xhdGVuY3koc2VsZi0+Y2xpZW50LCBzZWxmLT5wb3J0c1tpXSk7Ci0gICAgI2VuZGlmCiAgICAgICAgIGJ1ZmZlciA9IGphY2tfcG9ydF9nZXRfYnVmZmVyKHNlbGYtPnBvcnRzW2ldLCBzZWxmLT5idWZmZXJfc2l6ZSk7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzZWxmLT5idWZmZXJfc2l6ZTsgaisrKQogICAgICAgICAgICAgcGt0X2RhdGFbaiAqIHNlbGYtPm5wb3J0cyArIGldID0gYnVmZmVyW2pdOwpAQCAtMTU0LDggKzE1MCw4IEBACiAgICAgamFja19zdGF0dXNfdCBzdGF0dXM7CiAgICAgaW50IGksIHRlc3Q7CiAKLSAgICAvKiBSZWdpc3RlciBhcyBhIEpBQ0sgY2xpZW50LCB1c2luZyB0aGUgY29udGV4dCBmaWxlbmFtZSBhcyBjbGllbnQgbmFtZS4gKi8KLSAgICBzZWxmLT5jbGllbnQgPSBqYWNrX2NsaWVudF9vcGVuKGNvbnRleHQtPmZpbGVuYW1lLCBKYWNrTnVsbE9wdGlvbiwgJnN0YXR1cyk7CisgICAgLyogUmVnaXN0ZXIgYXMgYSBKQUNLIGNsaWVudCwgdXNpbmcgdGhlIGNvbnRleHQgdXJsIGFzIGNsaWVudCBuYW1lLiAqLworICAgIHNlbGYtPmNsaWVudCA9IGphY2tfY2xpZW50X29wZW4oY29udGV4dC0+dXJsLCBKYWNrTnVsbE9wdGlvbiwgJnN0YXR1cyk7CiAgICAgaWYgKCFzZWxmLT5jbGllbnQpIHsKICAgICAgICAgYXZfbG9nKGNvbnRleHQsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byByZWdpc3RlciBhcyBhIEpBQ0sgY2xpZW50XG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKQEAgLTE3OCw3ICsxNzQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYWNrUG9ydElzSW5wdXQsIDApOwogICAgICAgICBpZiAoIXNlbGYtPnBvcnRzW2ldKSB7CiAgICAgICAgICAgICBhdl9sb2coY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJlZ2lzdGVyIHBvcnQgJXM6JXNcbiIsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC0+ZmlsZW5hbWUsIHN0cik7CisgICAgICAgICAgICAgICAgICAgY29udGV4dC0+dXJsLCBzdHIpOwogICAgICAgICAgICAgamFja19jbGllbnRfY2xvc2Uoc2VsZi0+Y2xpZW50KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAgICAgICAgIH0KQEAgLTI1MiwxNCArMjQ4LDE0IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCi0gICAgc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKICNpZiBIQVZFX0JJR0VORElBTgotICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkICAgICA9IEFWX0NPREVDX0lEX1BDTV9GMzJCRTsKKyAgICBzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRjMyQkU7CiAjZWxzZQotICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkICAgICA9IEFWX0NPREVDX0lEX1BDTV9GMzJMRTsKKyAgICBzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9QQ01fRjMyTEU7CiAjZW5kaWYKLSAgICBzdHJlYW0tPmNvZGVjLT5zYW1wbGVfcmF0ZSAgPSBzZWxmLT5zYW1wbGVfcmF0ZTsKLSAgICBzdHJlYW0tPmNvZGVjLT5jaGFubmVscyAgICAgPSBzZWxmLT5ucG9ydHM7CisgICAgc3RyZWFtLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgID0gc2VsZi0+c2FtcGxlX3JhdGU7CisgICAgc3RyZWFtLT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgID0gc2VsZi0+bnBvcnRzOwogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdHJlYW0sIDY0LCAxLCAxMDAwMDAwKTsgIC8qIDY0IGJpdHMgcHRzIGluIHVzICovCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9rbXNncmFiLmMgYi9saWJhdmRldmljZS9rbXNncmFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkZTc3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZGV2aWNlL2ttc2dyYWIuYwpAQCAtMCwwICsxLDQ2NiBAQAorLyoKKyAqIEtNUy9EUk0gaW5wdXQgZGV2aWNlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8ZHJtLmg+CisjaW5jbHVkZSA8ZHJtX2ZvdXJjYy5oPgorI2luY2x1ZGUgPGRybV9tb2RlLmg+CisjaW5jbHVkZSA8eGY4NmRybS5oPgorI2luY2x1ZGUgPHhmODZkcm1Nb2RlLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dF9kcm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgS01TR3JhYkNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQVZCdWZmZXJSZWYgKmRldmljZV9yZWY7CisgICAgQVZIV0RldmljZUNvbnRleHQgKmRldmljZTsKKyAgICBBVkRSTURldmljZUNvbnRleHQgKmh3Y3R4OworCisgICAgQVZCdWZmZXJSZWYgKmZyYW1lc19yZWY7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmZyYW1lczsKKworICAgIHVpbnQzMl90IHBsYW5lX2lkOworICAgIHVpbnQzMl90IGRybV9mb3JtYXQ7CisgICAgdW5zaWduZWQgaW50IHdpZHRoOworICAgIHVuc2lnbmVkIGludCBoZWlnaHQ7CisKKyAgICBpbnQ2NF90IGZyYW1lX2RlbGF5OworICAgIGludDY0X3QgZnJhbWVfbGFzdDsKKworICAgIGNvbnN0IGNoYXIgKmRldmljZV9wYXRoOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQ7CisgICAgaW50NjRfdCBkcm1fZm9ybWF0X21vZGlmaWVyOworICAgIGludDY0X3Qgc291cmNlX3BsYW5lOworICAgIGludDY0X3Qgc291cmNlX2NydGM7CisgICAgQVZSYXRpb25hbCBmcmFtZXJhdGU7Cit9IEtNU0dyYWJDb250ZXh0OworCitzdGF0aWMgdm9pZCBrbXNncmFiX2ZyZWVfZGVzYyh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgQVZEUk1GcmFtZURlc2NyaXB0b3IgKmRlc2MgPSAoQVZEUk1GcmFtZURlc2NyaXB0b3IqKWRhdGE7CisKKyAgICBjbG9zZShkZXNjLT5vYmplY3RzWzBdLmZkKTsKKworICAgIGF2X2ZyZWUoZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGttc2dyYWJfZnJlZV9mcmFtZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSAoQVZGcmFtZSopZGF0YTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKK30KKworc3RhdGljIGludCBrbXNncmFiX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgS01TR3JhYkNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgZHJtTW9kZVBsYW5lICpwbGFuZTsKKyAgICBkcm1Nb2RlRkIgKmZiOworICAgIEFWRFJNRnJhbWVEZXNjcmlwdG9yICpkZXNjOworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludDY0X3Qgbm93OworICAgIGludCBlcnIsIGZkOworCisgICAgbm93ID0gYXZfZ2V0dGltZSgpOworICAgIGlmIChjdHgtPmZyYW1lX2xhc3QpIHsKKyAgICAgICAgaW50NjRfdCBkZWxheTsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGRlbGF5ID0gY3R4LT5mcmFtZV9sYXN0ICsgY3R4LT5mcmFtZV9kZWxheSAtIG5vdzsKKyAgICAgICAgICAgIGlmIChkZWxheSA8PSAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYXZfdXNsZWVwKGRlbGF5KTsKKyAgICAgICAgICAgIG5vdyA9IGF2X2dldHRpbWUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjdHgtPmZyYW1lX2xhc3QgPSBub3c7CisKKyAgICBwbGFuZSA9IGRybU1vZGVHZXRQbGFuZShjdHgtPmh3Y3R4LT5mZCwgY3R4LT5wbGFuZV9pZCk7CisgICAgaWYgKCFwbGFuZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgcGxhbmUgIgorICAgICAgICAgICAgICAgIiUiUFJJdTMyIi5cbiIsIGN0eC0+cGxhbmVfaWQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBpZiAoIXBsYW5lLT5mYl9pZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBsYW5lICUiUFJJdTMyIiBubyBsb25nZXIgaGFzICIKKyAgICAgICAgICAgICAgICJhbiBhc3NvY2lhdGVkIGZyYW1lYnVmZmVyLlxuIiwgY3R4LT5wbGFuZV9pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgZmIgPSBkcm1Nb2RlR2V0RkIoY3R4LT5od2N0eC0+ZmQsIHBsYW5lLT5mYl9pZCk7CisgICAgaWYgKCFmYikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgZnJhbWVidWZmZXIgIgorICAgICAgICAgICAgICAgIiUiUFJJdTMyIi5cbiIsIHBsYW5lLT5mYl9pZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIGlmIChmYi0+d2lkdGggIT0gY3R4LT53aWR0aCB8fCBmYi0+aGVpZ2h0ICE9IGN0eC0+aGVpZ2h0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGxhbmUgJSJQUkl1MzIiIGZyYW1lYnVmZmVyICIKKyAgICAgICAgICAgICAgICJkaW1lbnNpb25zIGNoYW5nZWQ6IG5vdyAlIlBSSXUzMiJ4JSJQUkl1MzIiLlxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+cGxhbmVfaWQsIGZiLT53aWR0aCwgZmItPmhlaWdodCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIGlmICghZmItPmhhbmRsZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGhhbmRsZSBzZXQgb24gZnJhbWVidWZmZXIuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBlcnIgPSBkcm1QcmltZUhhbmRsZVRvRkQoY3R4LT5od2N0eC0+ZmQsIGZiLT5oYW5kbGUsIE9fUkRPTkxZLCAmZmQpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGVyciA9IGVycm5vOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgUFJJTUUgZmQgZnJvbSAiCisgICAgICAgICAgICAgICAiZnJhbWVidWZmZXIgaGFuZGxlOiAlcy5cbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKGVycik7CisgICAgfQorCisgICAgZGVzYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpkZXNjKSk7CisgICAgaWYgKCFkZXNjKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgKmRlc2MgPSAoQVZEUk1GcmFtZURlc2NyaXB0b3IpIHsKKyAgICAgICAgLm5iX29iamVjdHMgPSAxLAorICAgICAgICAub2JqZWN0c1swXSA9IHsKKyAgICAgICAgICAgIC5mZCAgICAgICAgICAgICAgID0gZmQsCisgICAgICAgICAgICAuc2l6ZSAgICAgICAgICAgICA9IGZiLT5oZWlnaHQgKiBmYi0+cGl0Y2gsCisgICAgICAgICAgICAuZm9ybWF0X21vZGlmaWVyICA9IGN0eC0+ZHJtX2Zvcm1hdF9tb2RpZmllciwKKyAgICAgICAgfSwKKyAgICAgICAgLm5iX2xheWVycyA9IDEsCisgICAgICAgIC5sYXllcnNbMF0gPSB7CisgICAgICAgICAgICAuZm9ybWF0ICAgICAgICAgICA9IGN0eC0+ZHJtX2Zvcm1hdCwKKyAgICAgICAgICAgIC5uYl9wbGFuZXMgICAgICAgID0gMSwKKyAgICAgICAgICAgIC5wbGFuZXNbMF0gPSB7CisgICAgICAgICAgICAgICAgLm9iamVjdF9pbmRleCA9IDAsCisgICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgLnBpdGNoICAgICAgICA9IGZiLT5waXRjaCwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgfTsKKworICAgIGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWUtPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKGN0eC0+ZnJhbWVzX3JlZik7CisgICAgaWYgKCFmcmFtZS0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90KilkZXNjLCBzaXplb2YoKmRlc2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrbXNncmFiX2ZyZWVfZGVzYywgYXZjdHgsIDApOworICAgIGlmICghZnJhbWUtPmJ1ZlswXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZyYW1lLT5kYXRhWzBdID0gKHVpbnQ4X3QqKWRlc2M7CisgICAgZnJhbWUtPmZvcm1hdCAgPSBBVl9QSVhfRk1UX0RSTV9QUklNRTsKKyAgICBmcmFtZS0+d2lkdGggICA9IGZiLT53aWR0aDsKKyAgICBmcmFtZS0+aGVpZ2h0ICA9IGZiLT5oZWlnaHQ7CisKKyAgICBkcm1Nb2RlRnJlZUZCKGZiKTsKKyAgICBkcm1Nb2RlRnJlZVBsYW5lKHBsYW5lKTsKKworICAgIHBrdC0+YnVmID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCopZnJhbWUsIHNpemVvZigqZnJhbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma21zZ3JhYl9mcmVlX2ZyYW1lLCBhdmN0eCwgMCk7CisgICAgaWYgKCFwa3QtPmJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHBrdC0+ZGF0YSAgID0gKHVpbnQ4X3QqKWZyYW1lOworICAgIHBrdC0+c2l6ZSAgID0gc2l6ZW9mKCpmcmFtZSk7CisgICAgcGt0LT5wdHMgICAgPSBub3c7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19UUlVTVEVEOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXQ7CisgICAgdWludDMyX3QgZHJtX2Zvcm1hdDsKK30ga21zZ3JhYl9mb3JtYXRzW10gPSB7CisjaWZkZWYgRFJNX0ZPUk1BVF9SOAorICAgIHsgQVZfUElYX0ZNVF9HUkFZOCwgICAgRFJNX0ZPUk1BVF9SOCAgICAgICB9LAorI2VuZGlmCisjaWZkZWYgRFJNX0ZPUk1BVF9SMTYKKyAgICB7IEFWX1BJWF9GTVRfR1JBWTE2TEUsIERSTV9GT1JNQVRfUjE2ICAgICAgfSwKKyAgICB7IEFWX1BJWF9GTVRfR1JBWTE2QkUsIERSTV9GT1JNQVRfUjE2ICAgICAgfCBEUk1fRk9STUFUX0JJR19FTkRJQU4gfSwKKyNlbmRpZgorICAgIHsgQVZfUElYX0ZNVF9CR1I4LCAgICAgRFJNX0ZPUk1BVF9CR1IyMzMgICB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTVMRSwgRFJNX0ZPUk1BVF9YUkdCMTU1NSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NTVCRSwgRFJNX0ZPUk1BVF9YUkdCMTU1NSB8IERSTV9GT1JNQVRfQklHX0VORElBTiB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1I1NTVMRSwgRFJNX0ZPUk1BVF9YQkdSMTU1NSB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1I1NTVCRSwgRFJNX0ZPUk1BVF9YQkdSMTU1NSB8IERSTV9GT1JNQVRfQklHX0VORElBTiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjVMRSwgRFJNX0ZPUk1BVF9SR0I1NjUgICB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjVCRSwgRFJNX0ZPUk1BVF9SR0I1NjUgICB8IERSTV9GT1JNQVRfQklHX0VORElBTiB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1I1NjVMRSwgRFJNX0ZPUk1BVF9CR1I1NjUgICB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1I1NjVCRSwgRFJNX0ZPUk1BVF9CR1I1NjUgICB8IERSTV9GT1JNQVRfQklHX0VORElBTiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0IyNCwgICAgRFJNX0ZPUk1BVF9SR0I4ODggICB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1IyNCwgICAgRFJNX0ZPUk1BVF9CR1I4ODggICB9LAorICAgIHsgQVZfUElYX0ZNVF8wUkdCLCAgICAgRFJNX0ZPUk1BVF9CR1JYODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF8wQkdSLCAgICAgRFJNX0ZPUk1BVF9SR0JYODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0IwLCAgICAgRFJNX0ZPUk1BVF9YQkdSODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1IwLCAgICAgRFJNX0ZPUk1BVF9YUkdCODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9BUkdCLCAgICAgRFJNX0ZPUk1BVF9CR1JBODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9BQkdSLCAgICAgRFJNX0ZPUk1BVF9SR0JBODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0JBLCAgICAgRFJNX0ZPUk1BVF9BQkdSODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1JBLCAgICAgRFJNX0ZPUk1BVF9BUkdCODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCAgRFJNX0ZPUk1BVF9ZVVlWICAgICB9LAorICAgIHsgQVZfUElYX0ZNVF9ZVllVNDIyLCAgRFJNX0ZPUk1BVF9ZVllVICAgICB9LAorICAgIHsgQVZfUElYX0ZNVF9VWVZZNDIyLCAgRFJNX0ZPUk1BVF9VWVZZICAgICB9LAorfTsKKworc3RhdGljIGF2X2NvbGQgaW50IGttc2dyYWJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBLTVNHcmFiQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBkcm1Nb2RlUGxhbmVSZXMgKnBsYW5lX3JlcyA9IE5VTEw7CisgICAgZHJtTW9kZVBsYW5lICpwbGFuZSA9IE5VTEw7CisgICAgZHJtTW9kZUZCICpmYiA9IE5VTEw7CisgICAgQVZTdHJlYW0gKnN0cmVhbTsKKyAgICBpbnQgZXJyLCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGttc2dyYWJfZm9ybWF0cyk7IGkrKykgeworICAgICAgICBpZiAoa21zZ3JhYl9mb3JtYXRzW2ldLnBpeGZtdCA9PSBjdHgtPmZvcm1hdCkgeworICAgICAgICAgICAgY3R4LT5kcm1fZm9ybWF0ID0ga21zZ3JhYl9mb3JtYXRzW2ldLmRybV9mb3JtYXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA+PSBGRl9BUlJBWV9FTEVNUyhrbXNncmFiX2Zvcm1hdHMpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgZm9ybWF0ICVzLlxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5mb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9od2RldmljZV9jdHhfY3JlYXRlKCZjdHgtPmRldmljZV9yZWYsIEFWX0hXREVWSUNFX1RZUEVfRFJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5kZXZpY2VfcGF0aCwgTlVMTCwgMCk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBEUk0gZGV2aWNlLlxuIik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGN0eC0+ZGV2aWNlID0gKEFWSFdEZXZpY2VDb250ZXh0KikgY3R4LT5kZXZpY2VfcmVmLT5kYXRhOworICAgIGN0eC0+aHdjdHggID0gKEFWRFJNRGV2aWNlQ29udGV4dCopY3R4LT5kZXZpY2UtPmh3Y3R4OworCisgICAgZXJyID0gZHJtU2V0Q2xpZW50Q2FwKGN0eC0+aHdjdHgtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEUk1fQ0xJRU5UX0NBUF9VTklWRVJTQUxfUExBTkVTLCAxKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIHNldCB1bml2ZXJzYWwgcGxhbmVzICIKKyAgICAgICAgICAgICAgICJjYXBhYmlsaXR5OiBwcmltYXJ5IHBsYW5lcyB3aWxsIG5vdCBiZSB1c2FibGUuXG4iKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5zb3VyY2VfcGxhbmUgPiAwKSB7CisgICAgICAgIHBsYW5lID0gZHJtTW9kZUdldFBsYW5lKGN0eC0+aHdjdHgtPmZkLCBjdHgtPnNvdXJjZV9wbGFuZSk7CisgICAgICAgIGlmICghcGxhbmUpIHsKKyAgICAgICAgICAgIGVyciA9IGVycm5vOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IHBsYW5lICUiUFJJZDY0IjogIgorICAgICAgICAgICAgICAgICAgICIlcy5cbiIsIGN0eC0+c291cmNlX3BsYW5lLCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoZXJyKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwbGFuZS0+ZmJfaWQgPT0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQbGFuZSAlIlBSSWQ2NCIgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAgImFuIGF0dGFjaGVkIGZyYW1lYnVmZmVyLlxuIiwgY3R4LT5zb3VyY2VfcGxhbmUpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGxhbmVfcmVzID0gZHJtTW9kZUdldFBsYW5lUmVzb3VyY2VzKGN0eC0+aHdjdHgtPmZkKTsKKyAgICAgICAgaWYgKCFwbGFuZV9yZXMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBwbGFuZSAiCisgICAgICAgICAgICAgICAgICAgInJlc291cmNlczogJXMuXG4iLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lX3Jlcy0+Y291bnRfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIHBsYW5lID0gZHJtTW9kZUdldFBsYW5lKGN0eC0+aHdjdHgtPmZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVfcmVzLT5wbGFuZXNbaV0pOworICAgICAgICAgICAgaWYgKCFwbGFuZSkgeworICAgICAgICAgICAgICAgIGVyciA9IGVycm5vOworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1ZFUkJPU0UsICJGYWlsZWQgdG8gZ2V0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgInBsYW5lICUiUFJJdTMyIjogJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwbGFuZV9yZXMtPnBsYW5lc1tpXSwgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUGxhbmUgJSJQUkl1MzIiOiAiCisgICAgICAgICAgICAgICAgICAgIkNSVEMgJSJQUkl1MzIiIEZCICUiUFJJdTMyIi5cbiIsCisgICAgICAgICAgICAgICAgICAgcGxhbmUtPnBsYW5lX2lkLCBwbGFuZS0+Y3J0Y19pZCwgcGxhbmUtPmZiX2lkKTsKKworICAgICAgICAgICAgaWYgKChjdHgtPnNvdXJjZV9jcnRjID4gMCAmJgorICAgICAgICAgICAgICAgICBwbGFuZS0+Y3J0Y19pZCAhPSBjdHgtPnNvdXJjZV9jcnRjKSB8fAorICAgICAgICAgICAgICAgIHBsYW5lLT5mYl9pZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gRWl0aGVyIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHRhcmdldCBzb3VyY2UgQ1JUQworICAgICAgICAgICAgICAgIC8vIG9yIG5vdCBhY3RpdmUuCisgICAgICAgICAgICAgICAgZHJtTW9kZUZyZWVQbGFuZShwbGFuZSk7CisgICAgICAgICAgICAgICAgcGxhbmUgPSBOVUxMOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpID09IHBsYW5lX3Jlcy0+Y291bnRfcGxhbmVzKSB7CisgICAgICAgICAgICBpZiAoY3R4LT5zb3VyY2VfY3J0YyA+IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIHVzYWJsZSBwbGFuZXMgZm91bmQgb24gIgorICAgICAgICAgICAgICAgICAgICAgICAiQ1JUQyAlIlBSSWQ2NCIuXG4iLCBjdHgtPnNvdXJjZV9jcnRjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyB1c2FibGUgcGxhbmVzIGZvdW5kLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19JTkZPLCAiVXNpbmcgcGxhbmUgJSJQUkl1MzIiIHRvICIKKyAgICAgICAgICAgICAgICJsb2NhdGUgZnJhbWVidWZmZXJzLlxuIiwgcGxhbmUtPnBsYW5lX2lkKTsKKyAgICB9CisKKyAgICBjdHgtPnBsYW5lX2lkID0gcGxhbmUtPnBsYW5lX2lkOworCisgICAgZmIgPSBkcm1Nb2RlR2V0RkIoY3R4LT5od2N0eC0+ZmQsIHBsYW5lLT5mYl9pZCk7CisgICAgaWYgKCFmYikgeworICAgICAgICBlcnIgPSBlcnJubzsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0ICIKKyAgICAgICAgICAgICAgICJmcmFtZWJ1ZmZlciAlIlBSSXUzMiI6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIHBsYW5lLT5mYl9pZCwgc3RyZXJyb3IoZXJyKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoZXJyKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJUZW1wbGF0ZSBmcmFtZWJ1ZmZlciBpcyAlIlBSSXUzMiI6ICIKKyAgICAgICAgICAgIiUiUFJJdTMyInglIlBSSXUzMiIgJSJQUkl1MzIiYnBwICUiUFJJdTMyImIgZGVwdGguXG4iLAorICAgICAgICAgICBmYi0+ZmJfaWQsIGZiLT53aWR0aCwgZmItPmhlaWdodCwgZmItPmJwcCwgZmItPmRlcHRoKTsKKworICAgIGN0eC0+d2lkdGggID0gZmItPndpZHRoOworICAgIGN0eC0+aGVpZ2h0ID0gZmItPmhlaWdodDsKKworICAgIGlmICghZmItPmhhbmRsZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGhhbmRsZSBzZXQgb24gZnJhbWVidWZmZXI6ICIKKyAgICAgICAgICAgICAgICJtYXliZSB5b3UgbmVlZCBzb21lIGFkZGl0aW9uYWwgY2FwYWJpbGl0aWVzP1xuIik7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHN0cmVhbSA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOworICAgIGlmICghc3RyZWFtKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1dSQVBQRURfQVZGUkFNRTsKKyAgICBzdHJlYW0tPmNvZGVjcGFyLT53aWR0aCAgICAgID0gZmItPndpZHRoOworICAgIHN0cmVhbS0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBmYi0+aGVpZ2h0OworICAgIHN0cmVhbS0+Y29kZWNwYXItPmZvcm1hdCAgICAgPSBBVl9QSVhfRk1UX0RSTV9QUklNRTsKKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3RyZWFtLCA2NCwgMSwgMTAwMDAwMCk7CisKKyAgICBjdHgtPmZyYW1lc19yZWYgPSBhdl9od2ZyYW1lX2N0eF9hbGxvYyhjdHgtPmRldmljZV9yZWYpOworICAgIGlmICghY3R4LT5mcmFtZXNfcmVmKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBjdHgtPmZyYW1lcyA9IChBVkhXRnJhbWVzQ29udGV4dCopY3R4LT5mcmFtZXNfcmVmLT5kYXRhOworCisgICAgY3R4LT5mcmFtZXMtPmZvcm1hdCAgICA9IEFWX1BJWF9GTVRfRFJNX1BSSU1FOworICAgIGN0eC0+ZnJhbWVzLT5zd19mb3JtYXQgPSBjdHgtPmZvcm1hdCwKKyAgICBjdHgtPmZyYW1lcy0+d2lkdGggICAgID0gZmItPndpZHRoOworICAgIGN0eC0+ZnJhbWVzLT5oZWlnaHQgICAgPSBmYi0+aGVpZ2h0OworCisgICAgZXJyID0gYXZfaHdmcmFtZV9jdHhfaW5pdChjdHgtPmZyYW1lc19yZWYpOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGluaXRpYWxpc2UgIgorICAgICAgICAgICAgICAgImhhcmR3YXJlIGZyYW1lcyBjb250ZXh0OiAlZC5cbiIsIGVycik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdHgtPmZyYW1lX2RlbGF5ID0gYXZfcmVzY2FsZV9xKDEsIChBVlJhdGlvbmFsKSB7IGN0eC0+ZnJhbWVyYXRlLmRlbiwKKyAgICAgICAgICAgICAgICBjdHgtPmZyYW1lcmF0ZS5udW0gfSwgQVZfVElNRV9CQVNFX1EpOworCisgICAgZXJyID0gMDsKK2ZhaWw6CisgICAgaWYgKHBsYW5lX3JlcykKKyAgICAgICAgZHJtTW9kZUZyZWVQbGFuZVJlc291cmNlcyhwbGFuZV9yZXMpOworICAgIGlmIChwbGFuZSkKKyAgICAgICAgZHJtTW9kZUZyZWVQbGFuZShwbGFuZSk7CisgICAgaWYgKGZiKQorICAgICAgICBkcm1Nb2RlRnJlZUZCKGZiKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBrbXNncmFiX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBLTVNHcmFiQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5mcmFtZXNfcmVmKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+ZGV2aWNlX3JlZik7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoS01TR3JhYkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImRldmljZSIsICJEUk0gZGV2aWNlIHBhdGgiLAorICAgICAgT0ZGU0VUKGRldmljZV9wYXRoKSwgQVZfT1BUX1RZUEVfU1RSSU5HLAorICAgICAgeyAuc3RyID0gIi9kZXYvZHJpL2NhcmQwIiB9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgImZvcm1hdCIsICJQaXhlbCBmb3JtYXQgZm9yIGZyYW1lYnVmZmVyIiwKKyAgICAgIE9GRlNFVChmb3JtYXQpLCBBVl9PUFRfVFlQRV9QSVhFTF9GTVQsCisgICAgICB7IC5pNjQgPSBBVl9QSVhfRk1UX0JHUjAgfSwgMCwgVUlOVDMyX01BWCwgRkxBR1MgfSwKKyAgICB7ICJmb3JtYXRfbW9kaWZpZXIiLCAiRFJNIGZvcm1hdCBtb2RpZmllciBmb3IgZnJhbWVidWZmZXIiLAorICAgICAgT0ZGU0VUKGRybV9mb3JtYXRfbW9kaWZpZXIpLCBBVl9PUFRfVFlQRV9JTlQ2NCwKKyAgICAgIHsgLmk2NCA9IERSTV9GT1JNQVRfTU9EX05PTkUgfSwgMCwgSU5UNjRfTUFYLCBGTEFHUyB9LAorICAgIHsgImNydGNfaWQiLCAiQ1JUQyBJRCB0byBkZWZpbmUgY2FwdHVyZSBzb3VyY2UiLAorICAgICAgT0ZGU0VUKHNvdXJjZV9jcnRjKSwgQVZfT1BUX1RZUEVfSU5UNjQsCisgICAgICB7IC5pNjQgPSAwIH0sIDAsIFVJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAicGxhbmVfaWQiLCAiUGxhbmUgSUQgdG8gZGVmaW5lIGNhcHR1cmUgc291cmNlIiwKKyAgICAgIE9GRlNFVChzb3VyY2VfcGxhbmUpLCBBVl9PUFRfVFlQRV9JTlQ2NCwKKyAgICAgIHsgLmk2NCA9IDAgfSwgMCwgVUlOVDMyX01BWCwgRkxBR1MgfSwKKyAgICB7ICJmcmFtZXJhdGUiLCAiRnJhbWVyYXRlIHRvIGNhcHR1cmUgYXQiLAorICAgICAgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1JBVElPTkFMLAorICAgICAgeyAuZGJsID0gMzAuMCB9LCAwLCAxMDAwLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3Mga21zZ3JhYl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJrbXNncmFiIGluZGV2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfa21zZ3JhYl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJrbXNncmFiIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiS01TIHNjcmVlbiBjYXB0dXJlIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEtNU0dyYWJDb250ZXh0KSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSAma21zZ3JhYl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSAma21zZ3JhYl9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9jbG9zZSAgICAgPSAma21zZ3JhYl9yZWFkX2Nsb3NlLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAma21zZ3JhYl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9sYXZmaS5jIGIvbGliYXZkZXZpY2UvbGF2ZmkuYwppbmRleCA4ZTllNjdkLi5jYThmMDVmIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9sYXZmaS5jCisrKyBiL2xpYmF2ZGV2aWNlL2xhdmZpLmMKQEAgLTM4LDcgKzM4LDYgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCIKLSNpbmNsdWRlICJsaWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmgiCiAjaW5jbHVkZSAibGliYXZmaWx0ZXIvYnVmZmVyc2luay5oIgogI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2aW9faW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdmZvcm1hdC9pbnRlcm5hbC5oIgpAQCAtMTA4LDggKzEwNyw4IEBACiAgICAgICAgICAgICBsYXZmaS0+c2lua19zdHJlYW1fc3ViY2NfbWFwW3NpbmtfaWR4XSA9IGF2Y3R4LT5uYl9zdHJlYW1zOwogICAgICAgICAgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2Y3R4LCBOVUxMKSkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9FSUFfNjA4OwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0VJQV82MDg7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBsYXZmaS0+c2lua19zdHJlYW1fc3ViY2NfbWFwW3NpbmtfaWR4XSA9IC0xOwogICAgICAgICB9CkBAIC0xMjEsNyArMTIwLDcgQEAKIHsKICAgICBMYXZmaUNvbnRleHQgKmxhdmZpID0gYXZjdHgtPnByaXZfZGF0YTsKICAgICBBVkZpbHRlckluT3V0ICppbnB1dF9saW5rcyA9IE5VTEwsICpvdXRwdXRfbGlua3MgPSBOVUxMLCAqaW5vdXQ7Ci0gICAgQVZGaWx0ZXIgKmJ1ZmZlcnNpbmssICphYnVmZmVyc2luazsKKyAgICBjb25zdCBBVkZpbHRlciAqYnVmZmVyc2luaywgKmFidWZmZXJzaW5rOwogICAgIGludCAqcGl4X2ZtdHMgPSBjcmVhdGVfYWxsX2Zvcm1hdHMoQVZfUElYX0ZNVF9OQik7CiAgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlOwogICAgIGludCByZXQgPSAwLCBpLCBuOwpAQCAtMTMxLDggKzEzMCw2IEBACiAgICAgaWYgKCFwaXhfZm10cykKICAgICAgICAgRkFJTChBVkVSUk9SKEVOT01FTSkpOwogCi0gICAgYXZmaWx0ZXJfcmVnaXN0ZXJfYWxsKCk7Ci0KICAgICBidWZmZXJzaW5rID0gYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImJ1ZmZlcnNpbmsiKTsKICAgICBhYnVmZmVyc2luayA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKCJhYnVmZmVyc2luayIpOwogCkBAIC0xNjcsNyArMTY0LDcgQEAKICAgICB9CiAKICAgICBpZiAoIWxhdmZpLT5ncmFwaF9zdHIpCi0gICAgICAgIGxhdmZpLT5ncmFwaF9zdHIgPSBhdl9zdHJkdXAoYXZjdHgtPmZpbGVuYW1lKTsKKyAgICAgICAgbGF2ZmktPmdyYXBoX3N0ciA9IGF2X3N0cmR1cChhdmN0eC0+dXJsKTsKIAogICAgIC8qIHBhcnNlIHRoZSBncmFwaCwgY3JlYXRlIGEgc3RyZWFtIGZvciBlYWNoIG9wZW4gb3V0cHV0ICovCiAgICAgaWYgKCEobGF2ZmktPmdyYXBoID0gYXZmaWx0ZXJfZ3JhcGhfYWxsb2MoKSkpCkBAIC0zMTIsMzMgKzMwOSwzMiBAQAogCiAgICAgLyogZmlsbCBlYWNoIHN0cmVhbSB3aXRoIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgY29ycmVzcG9uZGluZyBzaW5rICovCiAgICAgZm9yIChpID0gMDsgaSA8IGxhdmZpLT5uYl9zaW5rczsgaSsrKSB7Ci0gICAgICAgIEFWRmlsdGVyTGluayAqbGluayA9IGxhdmZpLT5zaW5rc1tsYXZmaS0+c3RyZWFtX3NpbmtfbWFwW2ldXS0+aW5wdXRzWzBdOworICAgICAgICBBVkZpbHRlckNvbnRleHQgKnNpbmsgPSBsYXZmaS0+c2lua3NbbGF2ZmktPnN0cmVhbV9zaW5rX21hcFtpXV07CisgICAgICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlID0gYXZfYnVmZmVyc2lua19nZXRfdGltZV9iYXNlKHNpbmspOwogICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmN0eC0+c3RyZWFtc1tpXTsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gbGluay0+dHlwZTsKLSAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIGxpbmstPnRpbWVfYmFzZS5udW0sIGxpbmstPnRpbWVfYmFzZS5kZW4pOwotICAgICAgICBpZiAobGluay0+dHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ICAgID0gbGluay0+Zm9ybWF0OwotICAgICAgICAgICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UgID0gbGluay0+dGltZV9iYXNlOwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gbGluay0+dzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGxpbmstPmg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IGF2X2J1ZmZlcnNpbmtfZ2V0X3R5cGUoc2luayk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCB0aW1lX2Jhc2UubnVtLCB0aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgaWYgKGF2X2J1ZmZlcnNpbmtfZ2V0X3R5cGUoc2luaykgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2Zvcm1hdChzaW5rKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IGF2X2J1ZmZlcnNpbmtfZ2V0X3coc2luayk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBhdl9idWZmZXJzaW5rX2dldF9oKHNpbmspOwogICAgICAgICAgICAgc3QgICAgICAgLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0KLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9idWZmZXJzaW5rX2dldF9zYW1wbGVfYXNwZWN0X3JhdGlvKHNpbmspOwogICAgICAgICAgICAgYXZjdHgtPnByb2Jlc2l6ZSA9IEZGTUFYKGF2Y3R4LT5wcm9iZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+dyAqIGxpbmstPmggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoYXZfcGl4X2ZtdF9kZXNjX2dldChsaW5rLT5mb3JtYXQpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnVmZmVyc2lua19nZXRfdyhzaW5rKSAqIGF2X2J1ZmZlcnNpbmtfZ2V0X2goc2luaykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoYXZfcGl4X2ZtdF9kZXNjX2dldChhdl9idWZmZXJzaW5rX2dldF9mb3JtYXQoc2luaykpKSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzApOwotICAgICAgICB9IGVsc2UgaWYgKGxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gYXZfZ2V0X3BjbV9jb2RlYyhsaW5rLT5mb3JtYXQsIC0xKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmZpbHRlcl9saW5rX2dldF9jaGFubmVscyhsaW5rKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX2ZtdCAgPSBsaW5rLT5mb3JtYXQ7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gbGluay0+c2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZSAgID0gbGluay0+dGltZV9iYXNlOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IGxpbmstPmNoYW5uZWxfbGF5b3V0OwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgfSBlbHNlIGlmIChhdl9idWZmZXJzaW5rX2dldF90eXBlKHNpbmspID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IGF2X2dldF9wY21fY29kZWMoYXZfYnVmZmVyc2lua19nZXRfZm9ybWF0KHNpbmspLCAtMSk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gYXZfYnVmZmVyc2lua19nZXRfY2hhbm5lbHMoc2luayk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCAgICAgID0gYXZfYnVmZmVyc2lua19nZXRfZm9ybWF0KHNpbmspOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2X2J1ZmZlcnNpbmtfZ2V0X3NhbXBsZV9yYXRlKHNpbmspOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2NoYW5uZWxfbGF5b3V0KHNpbmspOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIFBDTSBjb2RlYyBmb3Igc2FtcGxlIGZvcm1hdCAlcy5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUobGluay0+Zm9ybWF0KSk7CisgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoYXZfYnVmZmVyc2lua19nZXRfZm9ybWF0KHNpbmspKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM3Nyw3ICszNzMsNyBAQAogICAgIG1lbWNweShsYXZmaS0+c3ViY2NfcGFja2V0LmRhdGEsIHNkLT5kYXRhLCBzZC0+c2l6ZSk7CiAgICAgbGF2ZmktPnN1YmNjX3BhY2tldC5zdHJlYW1faW5kZXggPSBzdHJlYW1faWR4OwogICAgIGxhdmZpLT5zdWJjY19wYWNrZXQucHRzID0gZnJhbWUtPnB0czsKLSAgICBsYXZmaS0+c3ViY2NfcGFja2V0LnBvcyA9IGF2X2ZyYW1lX2dldF9wa3RfcG9zKGZyYW1lKTsKKyAgICBsYXZmaS0+c3ViY2NfcGFja2V0LnBvcyA9IGZyYW1lLT5wa3RfcG9zOwogICAgIHJldHVybiAwOwogfQogCkBAIC00MDIsNyArMzk4LDcgQEAKICAgICAvKiBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBncmFwaCBzaW5rcy4gU2VsZWN0IHRoZSBzaW5rIHdpdGggdGhlCiAgICAgICogbWluaW11bSBQVFMgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgbGF2ZmktPm5iX3NpbmtzOyBpKyspIHsKLSAgICAgICAgQVZSYXRpb25hbCB0YiA9IGxhdmZpLT5zaW5rc1tpXS0+aW5wdXRzWzBdLT50aW1lX2Jhc2U7CisgICAgICAgIEFWUmF0aW9uYWwgdGIgPSBhdl9idWZmZXJzaW5rX2dldF90aW1lX2Jhc2UobGF2ZmktPnNpbmtzW2ldKTsKICAgICAgICAgZG91YmxlIGQ7CiAgICAgICAgIGludCByZXQ7CiAKQEAgLTQ0MSwxNSArNDM3LDE1IEBACiAKICAgICAgICAgYXZfaW1hZ2VfY29weV90b19idWZmZXIocGt0LT5kYXRhLCBzaXplLCAoY29uc3QgdWludDhfdCAqKilmcmFtZS0+ZGF0YSwgZnJhbWUtPmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Zm9ybWF0LCBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsIDEpOwotICAgIH0gZWxzZSBpZiAoYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKSAvKiBGSVhNRSB0ZXN0IGF1ZGlvICovKSB7CisgICAgfSBlbHNlIGlmIChmcmFtZS0+Y2hhbm5lbHMgLyogRklYTUUgdGVzdCBhdWRpbyAqLykgewogICAgICAgICBzaXplID0gZnJhbWUtPm5iX3NhbXBsZXMgKiBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShmcmFtZS0+Zm9ybWF0KSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5jaGFubmVsczsKICAgICAgICAgaWYgKChyZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGZyYW1lLT5kYXRhWzBdLCBzaXplKTsKICAgICB9CiAKLSAgICBmcmFtZV9tZXRhZGF0YSA9IGF2X2ZyYW1lX2dldF9tZXRhZGF0YShmcmFtZSk7CisgICAgZnJhbWVfbWV0YWRhdGEgPSBmcmFtZS0+bWV0YWRhdGE7CiAgICAgaWYgKGZyYW1lX21ldGFkYXRhKSB7CiAgICAgICAgIHVpbnQ4X3QgKm1ldGFkYXRhOwogICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IE5VTEw7CkBAIC00ODAsNyArNDc2LDcgQEAKIAogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3RyZWFtX2lkeDsKICAgICBwa3QtPnB0cyA9IGZyYW1lLT5wdHM7Ci0gICAgcGt0LT5wb3MgPSBhdl9mcmFtZV9nZXRfcGt0X3BvcyhmcmFtZSk7CisgICAgcGt0LT5wb3MgPSBmcmFtZS0+cGt0X3BvczsKICAgICBwa3QtPnNpemUgPSBzaXplOwogICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKICAgICByZXR1cm4gc2l6ZTsKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2xpYmF2ZGV2aWNlLnYgYi9saWJhdmRldmljZS9saWJhdmRldmljZS52CmluZGV4IGRlNzI3OGMuLjk3NjE2MTcgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL2xpYmF2ZGV2aWNlLnYKKysrIGIvbGliYXZkZXZpY2UvbGliYXZkZXZpY2UudgpAQCAtMSw0ICsxLDcgQEAKLUxJQkFWREVWSUNFXyRNQUpPUiB7Ci0gICAgICAgIGdsb2JhbDogYXZkZXZpY2VfKjsgYXZfKjsKLSAgICAgICAgbG9jYWw6ICo7CitMSUJBVkRFVklDRV9NQUpPUiB7CisgICAgZ2xvYmFsOgorICAgICAgICBhdmRldmljZV8qOworICAgICAgICBhdl8qOworICAgIGxvY2FsOgorICAgICAgICAqOwogfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2xpYmNkaW8uYyBiL2xpYmF2ZGV2aWNlL2xpYmNkaW8uYwppbmRleCA5ZTliMGQ4Li5hNGM5ZjUyIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9saWJjZGlvLmMKKysrIGIvbGliYXZkZXZpY2UvbGliY2Rpby5jCkBAIC02MCw5ICs2MCw5IEBACiAKICAgICBpZiAoIShzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oY3R4LCBOVUxMKSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgcy0+ZHJpdmUgPSBjZGlvX2NkZGFwX2lkZW50aWZ5KGN0eC0+ZmlsZW5hbWUsIENEREFfTUVTU0FHRV9MT0dJVCwgJmVycik7CisgICAgcy0+ZHJpdmUgPSBjZGlvX2NkZGFwX2lkZW50aWZ5KGN0eC0+dXJsLCBDRERBX01FU1NBR0VfTE9HSVQsICZlcnIpOwogICAgIGlmICghcy0+ZHJpdmUpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gZHJpdmUgJXMuXG4iLCBjdHgtPmZpbGVuYW1lKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gZHJpdmUgJXMuXG4iLCBjdHgtPnVybCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogICAgIGlmIChlcnIpIHsKQEAgLTcwLDcgKzcwLDcgQEAKICAgICAgICAgZnJlZShlcnIpOwogICAgIH0KICAgICBpZiAoKHJldCA9IGNkaW9fY2RkYXBfb3BlbihzLT5kcml2ZSkpIDwgMCB8fCAhcy0+ZHJpdmUtPm9wZW5lZCkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBkaXNrIGluIGRyaXZlICVzLlxuIiwgY3R4LT5maWxlbmFtZSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBvcGVuIGRpc2sgaW4gZHJpdmUgJXMuXG4iLCBjdHgtPnVybCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCkBAIC04NSwxOSArODUsMTkgQEAKICAgICB9CiAgICAgY2Rpb19wYXJhbm9pYV9tb2Rlc2V0KHMtPnBhcmFub2lhLCBzLT5wYXJhbm9pYV9tb2RlKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgIGlmIChzLT5kcml2ZS0+YmlnZW5kaWFucCkKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRTsKICAgICBlbHNlCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgPSA0NDEwMDsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICA9IDI7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICAgPSA0NDEwMDsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgICA9IDI7CiAgICAgaWYgKHMtPmRyaXZlLT5hdWRpb19sYXN0X3NlY3RvciAhPSBDRElPX0lOVkFMSURfTFNOICYmCiAgICAgICAgIHMtPmRyaXZlLT5hdWRpb19maXJzdF9zZWN0b3IgIT0gQ0RJT19JTlZBTElEX0xTTikKICAgICAgICAgc3QtPmR1cmF0aW9uICAgICAgICAgICA9IHMtPmRyaXZlLT5hdWRpb19sYXN0X3NlY3RvciAtIHMtPmRyaXZlLT5hdWRpb19maXJzdF9zZWN0b3I7CiAgICAgZWxzZSBpZiAocy0+ZHJpdmUtPnRyYWNrcykKICAgICAgICAgc3QtPmR1cmF0aW9uID0gcy0+ZHJpdmUtPmRpc2NfdG9jW3MtPmRyaXZlLT50cmFja3NdLmR3U3RhcnRTZWN0b3I7Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIENESU9fQ0RfRlJBTUVTSVpFX1JBVywgMipzdC0+Y29kZWMtPmNoYW5uZWxzKnN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBDRElPX0NEX0ZSQU1FU0laRV9SQVcsIDIgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+ZHJpdmUtPnRyYWNrczsgaSsrKSB7CiAgICAgICAgIGNoYXIgdGl0bGVbMTZdOwpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvbGliZGMxMzk0LmMgYi9saWJhdmRldmljZS9saWJkYzEzOTQuYwppbmRleCBkY2RjYTYwLi4wMDMzMzVmIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9saWJkYzEzOTQuYworKysgYi9saWJhdmRldmljZS9saWJkYzEzOTQuYwpAQCAtMjAsMjYgKzIwLDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZiBIQVZFX0xJQkRDMTM5NF8yCiAjaW5jbHVkZSA8ZGMxMzk0L2RjMTM5NC5oPgotI2VsaWYgSEFWRV9MSUJEQzEzOTRfMQotI2luY2x1ZGUgPGxpYnJhdzEzOTQvcmF3MTM5NC5oPgotI2luY2x1ZGUgPGxpYmRjMTM5NC9kYzEzOTRfY29udHJvbC5oPgotCi0jZGVmaW5lIERDMTM5NF9WSURFT19NT0RFXzMyMHgyNDBfWVVWNDIyIE1PREVfMzIweDI0MF9ZVVY0MjIKLSNkZWZpbmUgREMxMzk0X1ZJREVPX01PREVfNjQweDQ4MF9ZVVY0MTEgTU9ERV82NDB4NDgwX1lVVjQxMQotI2RlZmluZSBEQzEzOTRfVklERU9fTU9ERV82NDB4NDgwX1lVVjQyMiBNT0RFXzY0MHg0ODBfWVVWNDIyCi0jZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfMV84NzUgRlJBTUVSQVRFXzFfODc1Ci0jZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfM183NSAgRlJBTUVSQVRFXzNfNzUKLSNkZWZpbmUgREMxMzk0X0ZSQU1FUkFURV83XzUgICBGUkFNRVJBVEVfN181Ci0jZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfMTUgICAgRlJBTUVSQVRFXzE1Ci0jZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfMzAgICAgRlJBTUVSQVRFXzMwCi0jZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfNjAgICAgRlJBTUVSQVRFXzYwCi0jZGVmaW5lIERDMTM5NF9GUkFNRVJBVEVfMTIwICAgRlJBTUVSQVRFXzEyMAotI2RlZmluZSBEQzEzOTRfRlJBTUVSQVRFXzI0MCAgIEZSQU1FUkFURV8yNDAKLSNlbmRpZgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCkBAIC01NCwyMiArMzUsMTcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgZGMxMzk0X2RhdGEgewogICAgIEFWQ2xhc3MgKmNsYXNzOwotI2lmIEhBVkVfTElCREMxMzk0XzEKLSAgICByYXcxMzk0aGFuZGxlX3QgaGFuZGxlOwotICAgIGRjMTM5NF9jYW1lcmFjYXB0dXJlIGNhbWVyYTsKLSAgICBpbnQgY2hhbm5lbDsKLSNlbGlmIEhBVkVfTElCREMxMzk0XzIKICAgICBkYzEzOTRfdCAqZDsKICAgICBkYzEzOTRjYW1lcmFfdCAqY2FtZXJhOwogICAgIGRjMTM5NHZpZGVvX2ZyYW1lX3QgKmZyYW1lOwotI2VuZGlmCiAgICAgaW50IGN1cnJlbnRfZnJhbWU7CiAgICAgaW50ICBmcmFtZV9yYXRlOyAgICAgICAgLyoqPCBmcmFtZXMgcGVyIDEwMDAgc2Vjb25kcyAoZnBzICogMTAwMCkgKi8KICAgICBjaGFyICp2aWRlb19zaXplOyAgICAgICAvKio8IFN0cmluZyBkZXNjcmliaW5nIHZpZGVvIHNpemUsIHNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLwogICAgIGNoYXIgKnBpeGVsX2Zvcm1hdDsgICAgIC8qKjwgU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uICovCiAgICAgY2hhciAqZnJhbWVyYXRlOyAgICAgICAgLyoqPCBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4gKi8KIAotICAgIEFWUGFja2V0IHBhY2tldDsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgc3RyZWFtX2luZGV4OwogfSBkYzEzOTRfZGF0YTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkYzEzOTRfZnJhbWVfZm9ybWF0IHsKQEAgLTEwMyw5ICs3OSw2IEBACiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihkYzEzOTRfZGF0YSwgeCkKICNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewotI2lmIEhBVkVfTElCREMxMzk0XzEKLSAgICB7ICJjaGFubmVsIiwgIiIsIG9mZnNldG9mKGRjMTM5NF9kYXRhLCBjaGFubmVsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAotI2VuZGlmCiAgICAgeyAidmlkZW9fc2l6ZSIsICJBIHN0cmluZyBkZXNjcmliaW5nIGZyYW1lIHNpemUsIHN1Y2ggYXMgNjQweDQ4MCBvciBoZDcyMC4iLCBPRkZTRVQodmlkZW9fc2l6ZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAicXZnYSJ9LCAwLCAwLCBERUMgfSwKICAgICB7ICJwaXhlbF9mb3JtYXQiLCAiIiwgT0ZGU0VUKHBpeGVsX2Zvcm1hdCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAidXl2eTQyMiJ9LCAwLCAwLCBERUMgfSwKICAgICB7ICJmcmFtZXJhdGUiLCAiIiwgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAibnRzYyJ9LCAwLCAwLCBERUMgfSwKQEAgLTE3MSwxMjYgKzE0NCwyNyBAQAogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDY0LCAxLCAxMDAwKTsKLSAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87Ci0gICAgdnN0LT5jb2RlYy0+dGltZV9iYXNlLmRlbiA9IGZyYW1lcmF0ZS5udW07Ci0gICAgdnN0LT5jb2RlYy0+dGltZV9iYXNlLm51bSA9IGZyYW1lcmF0ZS5kZW47Ci0gICAgdnN0LT5jb2RlYy0+d2lkdGggPSBmbXQtPndpZHRoOwotICAgIHZzdC0+Y29kZWMtPmhlaWdodCA9IGZtdC0+aGVpZ2h0OwotICAgIHZzdC0+Y29kZWMtPnBpeF9mbXQgPSBmbXQtPnBpeF9mbXQ7Ci0KLSAgICAvKiBwYWNrZXQgaW5pdCAqLwotICAgIGF2X2luaXRfcGFja2V0KCZkYzEzOTQtPnBhY2tldCk7Ci0gICAgZGMxMzk0LT5wYWNrZXQuc2l6ZSA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShmbXQtPnBpeF9mbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQtPndpZHRoLCBmbXQtPmhlaWdodCwgMSk7Ci0gICAgZGMxMzk0LT5wYWNrZXQuc3RyZWFtX2luZGV4ID0gdnN0LT5pbmRleDsKLSAgICBkYzEzOTQtPnBhY2tldC5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHZzdC0+Y29kZWNwYXItPndpZHRoID0gZm10LT53aWR0aDsKKyAgICB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBmbXQtPmhlaWdodDsKKyAgICB2c3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBmbXQtPnBpeF9mbXQ7CisgICAgdnN0LT5hdmdfZnJhbWVfcmF0ZSA9IGZyYW1lcmF0ZTsKIAogICAgIGRjMTM5NC0+Y3VycmVudF9mcmFtZSA9IDA7CisgICAgZGMxMzk0LT5zdHJlYW1faW5kZXggPSB2c3QtPmluZGV4OworICAgIGRjMTM5NC0+c2l6ZSA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShmbXQtPnBpeF9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdC0+d2lkdGgsIGZtdC0+aGVpZ2h0LCAxKTsKIAotICAgIHZzdC0+Y29kZWMtPmJpdF9yYXRlID0gYXZfcmVzY2FsZShkYzEzOTQtPnBhY2tldC5zaXplICogOCwgZnBzLT5mcmFtZV9yYXRlLCAxMDAwKTsKKyAgICB2c3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IGF2X3Jlc2NhbGUoZGMxMzk0LT5zaXplICogOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBzLT5mcmFtZV9yYXRlLCAxMDAwKTsKICAgICAqc2VsZWN0X2ZwcyA9IGZwczsKICAgICAqc2VsZWN0X2ZtdCA9IGZtdDsKIG91dDoKICAgICByZXR1cm4gcmV0OwogfQogCi0jaWYgSEFWRV9MSUJEQzEzOTRfMQotc3RhdGljIGludCBkYzEzOTRfdjFfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpjKQotewotICAgIGRjMTM5NF9kYXRhKiBkYzEzOTQgPSBjLT5wcml2X2RhdGE7Ci0gICAgQVZTdHJlYW0qIHZzdDsKLSAgICBub2RlaWRfdCogY2FtZXJhX25vZGVzOwotICAgIGludCByZXM7Ci0gICAgc3RydWN0IGRjMTM5NF9mcmFtZV9mb3JtYXQgKmZtdCA9IE5VTEw7Ci0gICAgc3RydWN0IGRjMTM5NF9mcmFtZV9yYXRlICpmcHMgPSBOVUxMOwotCi0gICAgaWYgKGRjMTM5NF9yZWFkX2NvbW1vbihjLCAmZm10LCAmZnBzKSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBOb3cgbGV0IHVzIHByZXAgdGhlIGhhcmR3YXJlLiAqLwotICAgIGRjMTM5NC0+aGFuZGxlID0gZGMxMzk0X2NyZWF0ZV9oYW5kbGUoMCk7IC8qIEZJWE1FOiBnb3R0YSBoYXZlIGFwLT5wb3J0ICovCi0gICAgaWYgKCFkYzEzOTQtPmhhbmRsZSkgewotICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWNxdWlyZSBkYzEzOTQgaGFuZGxlIG9uIHBvcnQgJWRcbiIsIDAgLyogYXAtPnBvcnQgKi8pOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgY2FtZXJhX25vZGVzID0gZGMxMzk0X2dldF9jYW1lcmFfbm9kZXMoZGMxMzk0LT5oYW5kbGUsICZyZXMsIDEpOwotICAgIGlmICghY2FtZXJhX25vZGVzIHx8IGNhbWVyYV9ub2Rlc1tkYzEzOTQtPmNoYW5uZWxdID09IERDMTM5NF9OT19DQU1FUkEpIHsKLSAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIlRoZXJlJ3Mgbm8gSUlEQyBjYW1lcmEgb24gdGhlIGNoYW5uZWwgJWRcbiIsIGRjMTM5NC0+Y2hhbm5lbCk7Ci0gICAgICAgIGdvdG8gb3V0X2hhbmRsZTsKLSAgICB9Ci0gICAgcmVzID0gZGMxMzk0X2RtYV9zZXR1cF9jYXB0dXJlKGRjMTM5NC0+aGFuZGxlLCBjYW1lcmFfbm9kZXNbZGMxMzk0LT5jaGFubmVsXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUX1ZHQV9OT05DT01QUkVTU0VELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXQtPmZyYW1lX3NpemVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQRUVEXzQwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBzLT5mcmFtZV9yYXRlX2lkLCA4LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRjMTM5NC0+Y2FtZXJhKTsKLSAgICBkYzEzOTRfZnJlZV9jYW1lcmFfbm9kZXMoY2FtZXJhX25vZGVzKTsKLSAgICBpZiAocmVzICE9IERDMTM5NF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDYW4ndCBwcmVwYXJlIGNhbWVyYSBmb3IgdGhlIERNQSBjYXB0dXJlXG4iKTsKLSAgICAgICAgZ290byBvdXRfaGFuZGxlOwotICAgIH0KLQotICAgIHJlcyA9IGRjMTM5NF9zdGFydF9pc29fdHJhbnNtaXNzaW9uKGRjMTM5NC0+aGFuZGxlLCBkYzEzOTQtPmNhbWVyYS5ub2RlKTsKLSAgICBpZiAocmVzICE9IERDMTM5NF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDYW4ndCBzdGFydCBpc29jaHJvbm91cyB0cmFuc21pc3Npb25cbiIpOwotICAgICAgICBnb3RvIG91dF9oYW5kbGVfZG1hOwotICAgIH0KLQotICAgIHJldHVybiAwOwotCi1vdXRfaGFuZGxlX2RtYToKLSAgICBkYzEzOTRfZG1hX3VubGlzdGVuKGRjMTM5NC0+aGFuZGxlLCAmZGMxMzk0LT5jYW1lcmEpOwotICAgIGRjMTM5NF9kbWFfcmVsZWFzZV9jYW1lcmEoZGMxMzk0LT5oYW5kbGUsICZkYzEzOTQtPmNhbWVyYSk7Ci1vdXRfaGFuZGxlOgotICAgIGRjMTM5NF9kZXN0cm95X2hhbmRsZShkYzEzOTQtPmhhbmRsZSk7Ci1vdXQ6Ci0gICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgaW50IGRjMTM5NF92MV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmMsIEFWUGFja2V0ICpwa3QpCi17Ci0gICAgc3RydWN0IGRjMTM5NF9kYXRhICpkYzEzOTQgPSBjLT5wcml2X2RhdGE7Ci0gICAgaW50IHJlczsKLQotICAgIC8qIGRpc2NhcmQgc3RhbGUgZnJhbWUgKi8KLSAgICBpZiAoZGMxMzk0LT5jdXJyZW50X2ZyYW1lKyspIHsKLSAgICAgICAgaWYgKGRjMTM5NF9kbWFfZG9uZV93aXRoX2J1ZmZlcigmZGMxMzk0LT5jYW1lcmEpICE9IERDMTM5NF9TVUNDRVNTKQotICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgImZhaWxlZCB0byByZWxlYXNlICVkIGZyYW1lXG4iLCBkYzEzOTQtPmN1cnJlbnRfZnJhbWUpOwotICAgIH0KLQotICAgIHJlcyA9IGRjMTM5NF9kbWFfc2luZ2xlX2NhcHR1cmUoJmRjMTM5NC0+Y2FtZXJhKTsKLQotICAgIGlmIChyZXMgPT0gREMxMzk0X1NVQ0NFU1MpIHsKLSAgICAgICAgZGMxMzk0LT5wYWNrZXQuZGF0YSA9ICh1aW50OF90ICopKGRjMTM5NC0+Y2FtZXJhLmNhcHR1cmVfYnVmZmVyKTsKLSAgICAgICAgZGMxMzk0LT5wYWNrZXQucHRzID0gKGRjMTM5NC0+Y3VycmVudF9mcmFtZSAqIDEwMDAwMDApIC8gZGMxMzk0LT5mcmFtZV9yYXRlOwotICAgICAgICByZXMgPSBkYzEzOTQtPnBhY2tldC5zaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJETUEgY2FwdHVyZSBmYWlsZWRcbiIpOwotICAgICAgICBkYzEzOTQtPnBhY2tldC5kYXRhID0gTlVMTDsKLSAgICAgICAgcmVzID0gLTE7Ci0gICAgfQotCi0gICAgKnBrdCA9IGRjMTM5NC0+cGFja2V0OwotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBpbnQgZGMxMzk0X3YxX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqIGNvbnRleHQpCi17Ci0gICAgc3RydWN0IGRjMTM5NF9kYXRhICpkYzEzOTQgPSBjb250ZXh0LT5wcml2X2RhdGE7Ci0KLSAgICBkYzEzOTRfc3RvcF9pc29fdHJhbnNtaXNzaW9uKGRjMTM5NC0+aGFuZGxlLCBkYzEzOTQtPmNhbWVyYS5ub2RlKTsKLSAgICBkYzEzOTRfZG1hX3VubGlzdGVuKGRjMTM5NC0+aGFuZGxlLCAmZGMxMzk0LT5jYW1lcmEpOwotICAgIGRjMTM5NF9kbWFfcmVsZWFzZV9jYW1lcmEoZGMxMzk0LT5oYW5kbGUsICZkYzEzOTQtPmNhbWVyYSk7Ci0gICAgZGMxMzk0X2Rlc3Ryb3lfaGFuZGxlKGRjMTM5NC0+aGFuZGxlKTsKLQotICAgIHJldHVybiAwOwotfQotCi0jZWxpZiBIQVZFX0xJQkRDMTM5NF8yCi1zdGF0aWMgaW50IGRjMTM5NF92Ml9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmMpCitzdGF0aWMgaW50IGRjMTM5NF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmMpCiB7CiAgICAgZGMxMzk0X2RhdGEqIGRjMTM5NCA9IGMtPnByaXZfZGF0YTsKICAgICBkYzEzOTRjYW1lcmFfbGlzdF90ICpsaXN0OwpAQCAtMzAzLDE0ICsxNzcsMjcgQEAKIAogICAgIC8qIE5vdyBsZXQgdXMgcHJlcCB0aGUgaGFyZHdhcmUuICovCiAgICAgZGMxMzk0LT5kID0gZGMxMzk0X25ldygpOwotICAgIGRjMTM5NF9jYW1lcmFfZW51bWVyYXRlIChkYzEzOTQtPmQsICZsaXN0KTsKLSAgICBpZiAoICFsaXN0IHx8IGxpc3QtPm51bSA9PSAwKSB7Ci0gICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gbG9vayBmb3IgYW4gSUlEQyBjYW1lcmFcblxuIik7CisgICAgaWYgKGRjMTM5NF9jYW1lcmFfZW51bWVyYXRlKGRjMTM5NC0+ZCwgJmxpc3QpICE9IERDMTM5NF9TVUNDRVNTIHx8ICFsaXN0KSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gbG9vayBmb3IgYW4gSUlEQyBjYW1lcmEuXG4iKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorCisgICAgaWYgKGxpc3QtPm51bSA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJObyBjYW1lcmFzIGZvdW5kLlxuIik7CisgICAgICAgIGRjMTM5NF9jYW1lcmFfZnJlZV9saXN0KGxpc3QpOwogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKICAgICAvKiBGSVhNRTogVG8gc2VsZWN0IGEgc3BlY2lmaWMgY2FtZXJhIEkgbmVlZCB0byBzZWFyY2ggaW4gbGlzdCBpdHMgZ3VpZCAqLwogICAgIGRjMTM5NC0+Y2FtZXJhID0gZGMxMzk0X2NhbWVyYV9uZXcgKGRjMTM5NC0+ZCwgbGlzdC0+aWRzWzBdLmd1aWQpOworCisgICAgaWYgKCFkYzEzOTQtPmNhbWVyYSkgeworICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBvcGVuIGNhbWVyYSB3aXRoIGd1aWQgMHglIlBSSXg2NCJcbiIsCisgICAgICAgICAgICAgICAgbGlzdC0+aWRzWzBdLmd1aWQpOworICAgICAgICAgZGMxMzk0X2NhbWVyYV9mcmVlX2xpc3QobGlzdCk7CisgICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKICAgICBpZiAobGlzdC0+bnVtID4gMSkgewogICAgICAgICBhdl9sb2coYywgQVZfTE9HX0lORk8sICJXb3JraW5nIHdpdGggdGhlIGZpcnN0IGNhbWVyYSBmb3VuZFxuIik7CiAgICAgfQpAQCAtMzYzLDcgKzI1MCw3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgaW50IGRjMTM5NF92Ml9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmMsIEFWUGFja2V0ICpwa3QpCitzdGF0aWMgaW50IGRjMTM5NF9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgc3RydWN0IGRjMTM5NF9kYXRhICpkYzEzOTQgPSBjLT5wcml2X2RhdGE7CiAgICAgaW50IHJlczsKQEAgLTM3NiwyMCArMjYzLDIwIEBACiAKICAgICByZXMgPSBkYzEzOTRfY2FwdHVyZV9kZXF1ZXVlKGRjMTM5NC0+Y2FtZXJhLCBEQzEzOTRfQ0FQVFVSRV9QT0xJQ1lfV0FJVCwgJmRjMTM5NC0+ZnJhbWUpOwogICAgIGlmIChyZXMgPT0gREMxMzk0X1NVQ0NFU1MpIHsKLSAgICAgICAgZGMxMzk0LT5wYWNrZXQuZGF0YSA9ICh1aW50OF90ICopIGRjMTM5NC0+ZnJhbWUtPmltYWdlOwotICAgICAgICBkYzEzOTQtPnBhY2tldC5wdHMgID0gZGMxMzk0LT5jdXJyZW50X2ZyYW1lICogMTAwMDAwMCAvIGRjMTM5NC0+ZnJhbWVfcmF0ZTsKLSAgICAgICAgcmVzID0gZGMxMzk0LT5mcmFtZS0+aW1hZ2VfYnl0ZXM7CisgICAgICAgIHBrdC0+ZGF0YSA9ICh1aW50OF90ICopZGMxMzk0LT5mcmFtZS0+aW1hZ2U7CisgICAgICAgIHBrdC0+c2l6ZSA9IGRjMTM5NC0+ZnJhbWUtPmltYWdlX2J5dGVzOworICAgICAgICBwa3QtPnB0cyA9IGRjMTM5NC0+Y3VycmVudF9mcmFtZSAqIDEwMDAwMDAgLyBkYzEzOTQtPmZyYW1lX3JhdGU7CisgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGRjMTM5NC0+c3RyZWFtX2luZGV4OwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJETUEgY2FwdHVyZSBmYWlsZWRcbiIpOwotICAgICAgICBkYzEzOTQtPnBhY2tldC5kYXRhID0gTlVMTDsKLSAgICAgICAgcmVzID0gLTE7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgICpwa3QgPSBkYzEzOTQtPnBhY2tldDsKLSAgICByZXR1cm4gcmVzOworICAgIHJldHVybiBwa3QtPnNpemU7CiB9CiAKLXN0YXRpYyBpbnQgZGMxMzk0X3YyX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqIGNvbnRleHQpCitzdGF0aWMgaW50IGRjMTM5NF9jbG9zZShBVkZvcm1hdENvbnRleHQgKiBjb250ZXh0KQogewogICAgIHN0cnVjdCBkYzEzOTRfZGF0YSAqZGMxMzk0ID0gY29udGV4dC0+cHJpdl9kYXRhOwogCkBAIC00MDUsMjMgKzI5Miw5IEBACiAgICAgLm5hbWUgICAgICAgICAgID0gImxpYmRjMTM5NCIsCiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImRjMTM5NCB2LjIgQS9WIGdyYWIiKSwKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGRjMTM5NF9kYXRhKSwKLSAgICAucmVhZF9oZWFkZXIgICAgPSBkYzEzOTRfdjJfcmVhZF9oZWFkZXIsCi0gICAgLnJlYWRfcGFja2V0ICAgID0gZGMxMzk0X3YyX3JlYWRfcGFja2V0LAotICAgIC5yZWFkX2Nsb3NlICAgICA9IGRjMTM5NF92Ml9jbG9zZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBkYzEzOTRfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZGMxMzk0X3JlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGRjMTM5NF9jbG9zZSwKICAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmxpYmRjMTM5NF9jbGFzcywKIH07Ci0KLSNlbmRpZgotI2lmIEhBVkVfTElCREMxMzk0XzEKLUFWSW5wdXRGb3JtYXQgZmZfbGliZGMxMzk0X2RlbXV4ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gImxpYmRjMTM5NCIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImRjMTM5NCB2LjEgQS9WIGdyYWIiKSwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGRjMTM5NF9kYXRhKSwKLSAgICAucmVhZF9oZWFkZXIgICAgPSBkYzEzOTRfdjFfcmVhZF9oZWFkZXIsCi0gICAgLnJlYWRfcGFja2V0ICAgID0gZGMxMzk0X3YxX3JlYWRfcGFja2V0LAotICAgIC5yZWFkX2Nsb3NlICAgICA9IGRjMTM5NF92MV9jbG9zZSwKLSAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCi0gICAgLnByaXZfY2xhc3MgICAgID0gJmxpYmRjMTM5NF9jbGFzcywKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL2xpYm5kaV9uZXd0ZWtfY29tbW9uLmggYi9saWJhdmRldmljZS9saWJuZGlfbmV3dGVrX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTAzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmRldmljZS9saWJuZGlfbmV3dGVrX2NvbW1vbi5oCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBOZXdUZWsgTkRJIGNvbW1vbiBjb2RlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgTWFrc3ltIFZlcmVtZXllbmtvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZERVZJQ0VfTElCTkRJX05FV1RFS19DT01NT05fSAorI2RlZmluZSBBVkRFVklDRV9MSUJORElfTkVXVEVLX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxQcm9jZXNzaW5nLk5ESS5MaWIuaD4KKworI2RlZmluZSBORElfVElNRV9CQVNFIDEwMDAwMDAwCisjZGVmaW5lIE5ESV9USU1FX0JBU0VfUSAoQVZSYXRpb25hbCl7MSwgTkRJX1RJTUVfQkFTRX0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9saWJuZGlfbmV3dGVrX2RlYy5jIGIvbGliYXZkZXZpY2UvbGlibmRpX25ld3Rla19kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmI3MTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZkZXZpY2UvbGlibmRpX25ld3Rla19kZWMuYwpAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIE5ld3RlayBOREkgaW5wdXQKKyAqIENvcHlyaWdodCAoYykgMjAxNyBNYWtzeW0gVmVyZW1leWVua28KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisKKyNpbmNsdWRlICJsaWJuZGlfbmV3dGVrX2NvbW1vbi5oIgorCitzdHJ1Y3QgTkRJQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2NsYXNzOworCisgICAgLyogT3B0aW9ucyAqLworICAgIGludCBmaW5kX3NvdXJjZXM7CisgICAgaW50NjRfdCB3YWl0X3NvdXJjZXM7CisgICAgaW50IGFsbG93X3ZpZGVvX2ZpZWxkczsKKworICAgIC8qIFJ1bnRpbWUgKi8KKyAgICBORElsaWJfcmVjdl9jcmVhdGVfdCAqcmVjdjsKKyAgICBORElsaWJfZmluZF9pbnN0YW5jZV90IG5kaV9maW5kOworCisgICAgLyogU3RyZWFtcyAqLworICAgIEFWU3RyZWFtICp2aWRlb19zdCwgKmF1ZGlvX3N0OworfTsKKworc3RhdGljIGludCBuZGlfc2V0X3ZpZGVvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBORElsaWJfdmlkZW9fZnJhbWVfdCAqdiwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBORElDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHYtPnlyZXMgKiB2LT5saW5lX3N0cmlkZV9pbl9ieXRlcyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwa3QtPmR0cyA9IHBrdC0+cHRzID0gYXZfcmVzY2FsZV9xKHYtPnRpbWVjb2RlLCBORElfVElNRV9CQVNFX1EsIGN0eC0+dmlkZW9fc3QtPnRpbWVfYmFzZSk7CisgICAgcGt0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcSgxLCAoQVZSYXRpb25hbCl7di0+ZnJhbWVfcmF0ZV9ELCB2LT5mcmFtZV9yYXRlX059LCBjdHgtPnZpZGVvX3N0LT50aW1lX2Jhc2UpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIlczogcGt0LT5kdHMgPSBwa3QtPnB0cyA9ICUiUFJJZDY0IiwgZHVyYXRpb249JSJQUklkNjQiLCB0aW1lY29kZT0lIlBSSWQ2NCJcbiIsCisgICAgICAgIF9fZnVuY19fLCBwa3QtPmR0cywgcGt0LT5kdXJhdGlvbiwgdi0+dGltZWNvZGUpOworCisgICAgcGt0LT5mbGFncyAgICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCAgID0gY3R4LT52aWRlb19zdC0+aW5kZXg7CisKKyAgICBtZW1jcHkocGt0LT5kYXRhLCB2LT5wX2RhdGEsIHBrdC0+c2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZGlfc2V0X2F1ZGlvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBORElsaWJfYXVkaW9fZnJhbWVfdCAqYSwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBORElDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgTkRJbGliX2F1ZGlvX2ZyYW1lX2ludGVybGVhdmVkXzE2c190IGRzdDsKKworICAgIHJldCA9IGF2X25ld19wYWNrZXQocGt0LCAyICogYS0+bm9fc2FtcGxlcyAqIGEtPm5vX2NoYW5uZWxzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC0+ZHRzID0gcGt0LT5wdHMgPSBhdl9yZXNjYWxlX3EoYS0+dGltZWNvZGUsIE5ESV9USU1FX0JBU0VfUSwgY3R4LT5hdWRpb19zdC0+dGltZV9iYXNlKTsKKyAgICBwa3QtPmR1cmF0aW9uID0gYXZfcmVzY2FsZV9xKDEsIChBVlJhdGlvbmFsKXthLT5ub19zYW1wbGVzLCBhLT5zYW1wbGVfcmF0ZX0sIGN0eC0+YXVkaW9fc3QtPnRpbWVfYmFzZSk7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIiVzOiBwa3QtPmR0cyA9IHBrdC0+cHRzID0gJSJQUklkNjQiLCBkdXJhdGlvbj0lIlBSSWQ2NCIsIHRpbWVjb2RlPSUiUFJJZDY0IlxuIiwKKyAgICAgICAgX19mdW5jX18sIHBrdC0+ZHRzLCBwa3QtPmR1cmF0aW9uLCBhLT50aW1lY29kZSk7CisKKyAgICBwa3QtPmZsYWdzICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGN0eC0+YXVkaW9fc3QtPmluZGV4OworCisgICAgZHN0LnJlZmVyZW5jZV9sZXZlbCA9IDA7CisgICAgZHN0LnBfZGF0YSA9IChzaG9ydCAqKXBrdC0+ZGF0YTsKKyAgICBORElsaWJfdXRpbF9hdWRpb190b19pbnRlcmxlYXZlZF8xNnMoYSwgJmRzdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZGlfZmluZF9zb3VyY2VzKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIGNvbnN0IGNoYXIgKm5hbWUsIE5ESWxpYl9zb3VyY2VfdCAqc291cmNlX3RvX2Nvbm5lY3RfdG8pCit7CisgICAgaW50IGogPSBBVkVSUk9SKEVOT0RFVik7CisgICAgdW5zaWduZWQgaW50IG4sIGk7CisgICAgc3RydWN0IE5ESUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgTkRJbGliX3NvdXJjZV90ICpuZGlfc3JjcyA9IE5VTEw7CisgICAgY29uc3QgTkRJbGliX2ZpbmRfY3JlYXRlX3QgZmluZF9jcmVhdGVfZGVzYyA9IHsgLnNob3dfbG9jYWxfc291cmNlcyA9IHRydWUsCisgICAgICAgIC5wX2dyb3VwcyA9IE5VTEwsIC5wX2V4dHJhX2lwcyA9IE5VTEwgfTsKKworICAgIGlmICghY3R4LT5uZGlfZmluZCkKKyAgICAgICAgY3R4LT5uZGlfZmluZCA9IE5ESWxpYl9maW5kX2NyZWF0ZTIoJmZpbmRfY3JlYXRlX2Rlc2MpOworICAgIGlmICghY3R4LT5uZGlfZmluZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk5ESWxpYl9maW5kX2NyZWF0ZSBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkKKyAgICB7CisgICAgICAgIGludCBmLCB0ID0gY3R4LT53YWl0X3NvdXJjZXMgLyAxMDAwOworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIldhaXRpbmcgZm9yIHNvdXJjZXMgJWQgbWlsaXNlY29uZHNcbiIsIHQpOworICAgICAgICBmID0gTkRJbGliX2ZpbmRfd2FpdF9mb3Jfc291cmNlcyhjdHgtPm5kaV9maW5kLCB0KTsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJORElsaWJfZmluZF93YWl0X2Zvcl9zb3VyY2VzIHJldHVybnMgJWRcbiIsIGYpOworICAgICAgICBpZiAoIWYpCisgICAgICAgICAgICBicmVhazsKKyAgICB9OworCisgICAgbmRpX3NyY3MgPSBORElsaWJfZmluZF9nZXRfY3VycmVudF9zb3VyY2VzKGN0eC0+bmRpX2ZpbmQsICZuKTsKKworICAgIGlmIChjdHgtPmZpbmRfc291cmNlcykKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgIkZvdW5kICVkIE5ESSBzb3VyY2VzOlxuIiwgbik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlmIChjdHgtPmZpbmRfc291cmNlcykKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0lORk8sICJcdCclcydcdCclcydcbiIsIG5kaV9zcmNzW2ldLnBfbmRpX25hbWUsIG5kaV9zcmNzW2ldLnBfaXBfYWRkcmVzcyk7CisKKyAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgbmRpX3NyY3NbaV0ucF9uZGlfbmFtZSkpIHsKKyAgICAgICAgICAgICpzb3VyY2VfdG9fY29ubmVjdF90byA9IG5kaV9zcmNzW2ldOworICAgICAgICAgICAgaiA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gajsKK30KKworc3RhdGljIGludCBuZGlfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBpbnQgcmV0OworICAgIE5ESWxpYl9yZWN2X2NyZWF0ZV90IHJlY3ZfY3JlYXRlX2Rlc2M7CisgICAgY29uc3QgTkRJbGliX3RhbGx5X3QgdGFsbHlfc3RhdGUgPSB7IC5vbl9wcm9ncmFtID0gdHJ1ZSwgLm9uX3ByZXZpZXcgPSBmYWxzZSB9OworICAgIHN0cnVjdCBORElDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKCFORElsaWJfaW5pdGlhbGl6ZSgpKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTkRJbGliX2luaXRpYWxpemUgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKworICAgIC8qIEZpbmQgYXZhaWxhYmxlIHNvdXJjZXMuICovCisgICAgcmV0ID0gbmRpX2ZpbmRfc291cmNlcyhhdmN0eCwgYXZjdHgtPnVybCwgJnJlY3ZfY3JlYXRlX2Rlc2Muc291cmNlX3RvX2Nvbm5lY3RfdG8pOworICAgIGlmIChjdHgtPmZpbmRfc291cmNlcykgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0KKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8qIENyZWF0ZSByZWNlaXZlciBkZXNjcmlwdGlvbiAqLworICAgIHJlY3ZfY3JlYXRlX2Rlc2MuY29sb3JfZm9ybWF0ID0gTkRJbGliX3JlY3ZfY29sb3JfZm9ybWF0X2VfVVlWWV9SR0JBOworICAgIHJlY3ZfY3JlYXRlX2Rlc2MuYmFuZHdpZHRoID0gTkRJbGliX3JlY3ZfYmFuZHdpZHRoX2hpZ2hlc3Q7CisgICAgcmVjdl9jcmVhdGVfZGVzYy5hbGxvd192aWRlb19maWVsZHMgPSBjdHgtPmFsbG93X3ZpZGVvX2ZpZWxkczsKKworICAgIC8qIENyZWF0ZSB0aGUgcmVjZWl2ZXIgKi8KKyAgICBjdHgtPnJlY3YgPSBORElsaWJfcmVjdl9jcmVhdGUoJnJlY3ZfY3JlYXRlX2Rlc2MpOworICAgIGlmICghY3R4LT5yZWN2KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTkRJbGliX3JlY3ZfY3JlYXRlMiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICAvKiBTZXQgdGFsbHkgKi8KKyAgICBORElsaWJfcmVjdl9zZXRfdGFsbHkoY3R4LT5yZWN2LCAmdGFsbHlfc3RhdGUpOworCisgICAgYXZjdHgtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5kaV9jcmVhdGVfdmlkZW9fc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIE5ESWxpYl92aWRlb19mcmFtZV90ICp2KQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBBVlJhdGlvbmFsIHRtcDsKKyAgICBzdHJ1Y3QgTkRJQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmN0eCwgTlVMTCk7CisgICAgaWYgKCFzdCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhZGQgdmlkZW8gc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzdC0+dGltZV9iYXNlICAgICAgICAgICAgICAgICAgID0gTkRJX1RJTUVfQkFTRV9ROworICAgIHN0LT5yX2ZyYW1lX3JhdGUgICAgICAgICAgICAgICAgPSBhdl9tYWtlX3Eodi0+ZnJhbWVfcmF0ZV9OLCB2LT5mcmFtZV9yYXRlX0QpOworCisgICAgdG1wID0gYXZfbXVsX3EoYXZfZDJxKHYtPnBpY3R1cmVfYXNwZWN0X3JhdGlvLCBJTlRfTUFYKSwgKEFWUmF0aW9uYWwpe3YtPnlyZXMsIHYtPnhyZXN9KTsKKyAgICBhdl9yZWR1Y2UoJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwgdG1wLm51bSwgdG1wLmRlbiwgMTAwMCk7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICAgICAgICAgPSB2LT54cmVzOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICAgICAgICAgPSB2LT55cmVzOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlICAgICAgICAgID0gYXZfcmVzY2FsZSh2LT54cmVzICogdi0+eXJlcyAqIDE2LCB2LT5mcmFtZV9yYXRlX04sIHYtPmZyYW1lX3JhdGVfRCk7CisgICAgc3QtPmNvZGVjcGFyLT5maWVsZF9vcmRlciAgICAgICA9IHYtPmZyYW1lX2Zvcm1hdF90eXBlID09IE5ESWxpYl9mcmFtZV9mb3JtYXRfdHlwZV9wcm9ncmVzc2l2ZQorICAgICAgICA/IEFWX0ZJRUxEX1BST0dSRVNTSVZFIDogQVZfRklFTERfVFQ7CisKKyAgICBpZiAoTkRJbGliX0ZvdXJDQ190eXBlX1VZVlkgPT0gdi0+Rm91ckNDIHx8IE5ESWxpYl9Gb3VyQ0NfdHlwZV9VWVZBID09IHYtPkZvdXJDQykgeworICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCAgICAgICAgPSBBVl9QSVhfRk1UX1VZVlk0MjI7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgICA9IE1LVEFHKCdVJywgJ1knLCAnVicsICdZJyk7CisgICAgICAgIGlmIChORElsaWJfRm91ckNDX3R5cGVfVVlWQSA9PSB2LT5Gb3VyQ0MpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiQWxwaGEgY2hhbm5lbCBpZ25vcmVkXG4iKTsKKyAgICB9IGVsc2UgaWYgKE5ESWxpYl9Gb3VyQ0NfdHlwZV9CR1JBID09IHYtPkZvdXJDQykgeworICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCAgICAgICAgPSBBVl9QSVhfRk1UX0JHUkE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgICA9IE1LVEFHKCdCJywgJ0cnLCAnUicsICdBJyk7CisgICAgfSBlbHNlIGlmIChORElsaWJfRm91ckNDX3R5cGVfQkdSWCA9PSB2LT5Gb3VyQ0MpIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgICAgICAgID0gQVZfUElYX0ZNVF9CR1IwOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgICAgPSBNS1RBRygnQicsICdHJywgJ1InLCAnMCcpOworICAgIH0gZWxzZSBpZiAoTkRJbGliX0ZvdXJDQ190eXBlX1JHQkEgPT0gdi0+Rm91ckNDKSB7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICAgICA9IEFWX1BJWF9GTVRfUkdCQTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICAgID0gTUtUQUcoJ1InLCAnRycsICdCJywgJ0EnKTsKKyAgICB9IGVsc2UgaWYgKE5ESWxpYl9Gb3VyQ0NfdHlwZV9SR0JYID09IHYtPkZvdXJDQykgeworICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCAgICAgICAgPSBBVl9QSVhfRk1UX1JHQjA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgICA9IE1LVEFHKCdSJywgJ0cnLCAnQicsICcwJyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCB2aWRlbyBzdHJlYW0gZm9ybWF0LCB2LT5Gb3VyQ0M9JWRcbiIsIHYtPkZvdXJDQyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIE5ESV9USU1FX0JBU0UpOworCisgICAgY3R4LT52aWRlb19zdCA9IHN0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmRpX2NyZWF0ZV9hdWRpb19zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgTkRJbGliX2F1ZGlvX2ZyYW1lX3QgKmEpCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIHN0cnVjdCBORElDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdl9kYXRhOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2Y3R4LCBOVUxMKTsKKyAgICBpZiAoIXN0KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFkZCBhdWRpbyBzdHJlYW1cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgICAgID0gYS0+c2FtcGxlX3JhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICAgICA9IGEtPm5vX2NoYW5uZWxzOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIE5ESV9USU1FX0JBU0UpOworCisgICAgY3R4LT5hdWRpb19zdCA9IHN0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmRpX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgc3RydWN0IE5ESUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICB3aGlsZSAoIXJldCkgeworICAgICAgICBORElsaWJfdmlkZW9fZnJhbWVfdCB2OworICAgICAgICBORElsaWJfYXVkaW9fZnJhbWVfdCBhOworICAgICAgICBORElsaWJfbWV0YWRhdGFfZnJhbWVfdCBtOworICAgICAgICBORElsaWJfZnJhbWVfdHlwZV9lIHQ7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJORElsaWJfcmVjdl9jYXB0dXJlLi4uXG4iKTsKKyAgICAgICAgdCA9IE5ESWxpYl9yZWN2X2NhcHR1cmUoY3R4LT5yZWN2LCAmdiwgJmEsICZtLCA0MCk7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiTkRJbGliX3JlY3ZfY2FwdHVyZT0lZFxuIiwgdCk7CisKKyAgICAgICAgaWYgKHQgPT0gTkRJbGliX2ZyYW1lX3R5cGVfdmlkZW8pIHsKKyAgICAgICAgICAgIGlmICghY3R4LT52aWRlb19zdCkKKyAgICAgICAgICAgICAgICByZXQgPSBuZGlfY3JlYXRlX3ZpZGVvX3N0cmVhbShhdmN0eCwgJnYpOworICAgICAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICAgICAgcmV0ID0gbmRpX3NldF92aWRlb19wYWNrZXQoYXZjdHgsICZ2LCBwa3QpOworICAgICAgICAgICAgTkRJbGliX3JlY3ZfZnJlZV92aWRlbyhjdHgtPnJlY3YsICZ2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHQgPT0gTkRJbGliX2ZyYW1lX3R5cGVfYXVkaW8pIHsKKyAgICAgICAgICAgIGlmICghY3R4LT5hdWRpb19zdCkKKyAgICAgICAgICAgICAgICByZXQgPSBuZGlfY3JlYXRlX2F1ZGlvX3N0cmVhbShhdmN0eCwgJmEpOworICAgICAgICAgICAgaWYgKCFyZXQpCisgICAgICAgICAgICAgICAgcmV0ID0gbmRpX3NldF9hdWRpb19wYWNrZXQoYXZjdHgsICZhLCBwa3QpOworICAgICAgICAgICAgTkRJbGliX3JlY3ZfZnJlZV9hdWRpbyhjdHgtPnJlY3YsICZhKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHQgPT0gTkRJbGliX2ZyYW1lX3R5cGVfbWV0YWRhdGEpCisgICAgICAgICAgICBORElsaWJfcmVjdl9mcmVlX21ldGFkYXRhKGN0eC0+cmVjdiwgJm0pOworICAgICAgICBlbHNlIGlmICh0ID09IE5ESWxpYl9mcmFtZV90eXBlX2Vycm9yKXsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTkRJbGliX3JlY3ZfY2FwdHVyZSBmYWlsZWQgd2l0aCBlcnJvclxuIik7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBuZGlfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKmF2Y3R4KQoreworICAgIHN0cnVjdCBORElDb250ZXh0ICpjdHggPSAoc3RydWN0IE5ESUNvbnRleHQgKilhdmN0eC0+cHJpdl9kYXRhOworCisgICAgaWYgKGN0eC0+cmVjdikKKyAgICAgICAgTkRJbGliX3JlY3ZfZGVzdHJveShjdHgtPnJlY3YpOworCisgICAgaWYgKGN0eC0+bmRpX2ZpbmQpCisgICAgICAgIE5ESWxpYl9maW5kX2Rlc3Ryb3koY3R4LT5uZGlfZmluZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2Yoc3RydWN0IE5ESUNvbnRleHQsIHgpCisjZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImZpbmRfc291cmNlcyIsICJGaW5kIGF2YWlsYWJsZSBzb3VyY2VzIiAgLCBPRkZTRVQoZmluZF9zb3VyY2VzKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBERUMgfSwKKyAgICB7ICJ3YWl0X3NvdXJjZXMiLCAiVGltZSB0byB3YWl0IHVudGlsIHRoZSBudW1iZXIgb2Ygb25saW5lIHNvdXJjZXMgaGF2ZSBjaGFuZ2VkIiAgLCBPRkZTRVQod2FpdF9zb3VyY2VzKSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsgLmk2NCA9IDEwMDAwMDAgfSwgMTAwMDAwLCAyMDAwMDAwMCwgREVDIH0sCisgICAgeyAiYWxsb3dfdmlkZW9fZmllbGRzIiwgIldoZW4gdGhpcyBmbGFnIGlzIEZBTFNFLCBhbGwgdmlkZW8gdGhhdCB5b3UgcmVjZWl2ZSB3aWxsIGJlIHByb2dyZXNzaXZlIiAgLCBPRkZTRVQoYWxsb3dfdmlkZW9fZmllbGRzKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBERUMgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGxpYm5kaV9uZXd0ZWtfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJOREkgZGVtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fSU5QVVQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2xpYm5kaV9uZXd0ZWtfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlibmRpX25ld3RlayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5ldHdvcmsgRGV2aWNlIEludGVyZmFjZSAoTkRJKSBpbnB1dCB1c2luZyBOZXdUZWsgbGlicmFyeSIpLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmbGlibmRpX25ld3Rla19kZW11eGVyX2NsYXNzLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgTkRJQ29udGV4dCksCisgICAgLnJlYWRfaGVhZGVyICAgPSBuZGlfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgPSBuZGlfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgPSBuZGlfcmVhZF9jbG9zZSwKK307CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9saWJuZGlfbmV3dGVrX2VuYy5jIGIvbGliYXZkZXZpY2UvbGlibmRpX25ld3Rla19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzYwM2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZkZXZpY2UvbGlibmRpX25ld3Rla19lbmMuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIE5ld1RlayBOREkgb3V0cHV0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgTWFrc3ltIFZlcmVtZXllbmtvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorCisjaW5jbHVkZSAibGlibmRpX25ld3Rla19jb21tb24uaCIKKworc3RydWN0IE5ESUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNjbGFzczsKKworICAgIC8qIE9wdGlvbnMgKi8KKyAgICBpbnQgcmVmZXJlbmNlX2xldmVsOworICAgIGludCBjbG9ja192aWRlbywgY2xvY2tfYXVkaW87CisKKyAgICBORElsaWJfdmlkZW9fZnJhbWVfdCAqdmlkZW87CisgICAgTkRJbGliX2F1ZGlvX2ZyYW1lX2ludGVybGVhdmVkXzE2c190ICphdWRpbzsKKyAgICBORElsaWJfc2VuZF9pbnN0YW5jZV90IG5kaV9zZW5kOworICAgIEFWRnJhbWUgKmxhc3RfYXZmcmFtZTsKK307CisKK3N0YXRpYyBpbnQgbmRpX3dyaXRlX3RyYWlsZXIoQVZGb3JtYXRDb250ZXh0ICphdmN0eCkKK3sKKyAgICBzdHJ1Y3QgTkRJQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKworICAgIGlmIChjdHgtPm5kaV9zZW5kKSB7CisgICAgICAgIE5ESWxpYl9zZW5kX2Rlc3Ryb3koY3R4LT5uZGlfc2VuZCk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmN0eC0+bGFzdF9hdmZyYW1lKTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmY3R4LT52aWRlbyk7CisgICAgYXZfZnJlZXAoJmN0eC0+YXVkaW8pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmRpX3dyaXRlX3ZpZGVvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IE5ESUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZGcmFtZSAqYXZmcmFtZSwgKnRtcCA9IChBVkZyYW1lICopcGt0LT5kYXRhOworCisgICAgaWYgKHRtcC0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfVVlWWTQyMiAmJiB0bXAtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX0JHUkEgJiYKKyAgICAgICAgdG1wLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9CR1IwICYmIHRtcC0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfUkdCQSAmJgorICAgICAgICB0bXAtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX1JHQjApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJHb3QgYSBmcmFtZSB3aXRoIGludmFsaWQgcGl4ZWwgZm9ybWF0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHRtcC0+bGluZXNpemVbMF0gPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiR290IGEgZnJhbWUgd2l0aCBuZWdhdGl2ZSBsaW5lc2l6ZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICh0bXAtPndpZHRoICAhPSBjdHgtPnZpZGVvLT54cmVzIHx8CisgICAgICAgIHRtcC0+aGVpZ2h0ICE9IGN0eC0+dmlkZW8tPnlyZXMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJHb3QgYSBmcmFtZSB3aXRoIGludmFsaWQgZGltZW5zaW9uLlxuIik7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAidG1wLT53aWR0aD0lZCwgdG1wLT5oZWlnaHQ9JWQsIGN0eC0+dmlkZW8tPnhyZXM9JWQsIGN0eC0+dmlkZW8tPnlyZXM9JWRcbiIsCisgICAgICAgICAgICB0bXAtPndpZHRoLCB0bXAtPmhlaWdodCwgY3R4LT52aWRlby0+eHJlcywgY3R4LT52aWRlby0+eXJlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZmcmFtZSA9IGF2X2ZyYW1lX2Nsb25lKHRtcCk7CisgICAgaWYgKCFhdmZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY3R4LT52aWRlby0+dGltZWNvZGUgPSBhdl9yZXNjYWxlX3EocGt0LT5wdHMsIHN0LT50aW1lX2Jhc2UsIE5ESV9USU1FX0JBU0VfUSk7CisKKyAgICBjdHgtPnZpZGVvLT5saW5lX3N0cmlkZV9pbl9ieXRlcyA9IGF2ZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGN0eC0+dmlkZW8tPnBfZGF0YSA9ICh2b2lkICopKGF2ZnJhbWUtPmRhdGFbMF0pOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICIlczogcGt0LT5wdHM9JSJQUklkNjQiLCB0aW1lY29kZT0lIlBSSWQ2NCIsIHN0LT50aW1lX2Jhc2U9JWQvJWRcbiIsCisgICAgICAgIF9fZnVuY19fLCBwa3QtPnB0cywgY3R4LT52aWRlby0+dGltZWNvZGUsIHN0LT50aW1lX2Jhc2UubnVtLCBzdC0+dGltZV9iYXNlLmRlbik7CisKKyAgICAvKiBhc3luY2hyb25vdXMgZm9yIG9uZSBmcmFtZSwgYnV0IHdpbGwgYmxvY2sgaWYgYSBzZWNvbmQgZnJhbWUKKyAgICAgICAgaXMgZ2l2ZW4gYmVmb3JlIHRoZSBmaXJzdCBvbmUgaGFzIGJlZW4gc2VudCAqLworICAgIE5ESWxpYl9zZW5kX3NlbmRfdmlkZW9fYXN5bmMoY3R4LT5uZGlfc2VuZCwgY3R4LT52aWRlbyk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZjdHgtPmxhc3RfYXZmcmFtZSk7CisgICAgY3R4LT5sYXN0X2F2ZnJhbWUgPSBhdmZyYW1lOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmRpX3dyaXRlX2F1ZGlvX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IE5ESUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisKKyAgICBjdHgtPmF1ZGlvLT5wX2RhdGEgPSAoc2hvcnQgKilwa3QtPmRhdGE7CisgICAgY3R4LT5hdWRpby0+dGltZWNvZGUgPSBhdl9yZXNjYWxlX3EocGt0LT5wdHMsIHN0LT50aW1lX2Jhc2UsIE5ESV9USU1FX0JBU0VfUSk7CisgICAgY3R4LT5hdWRpby0+bm9fc2FtcGxlcyA9IHBrdC0+c2l6ZSAvIChjdHgtPmF1ZGlvLT5ub19jaGFubmVscyA8PCAxKTsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiJXM6IHBrdC0+cHRzPSUiUFJJZDY0IiwgdGltZWNvZGU9JSJQUklkNjQiLCBzdC0+dGltZV9iYXNlPSVkLyVkXG4iLAorICAgICAgICBfX2Z1bmNfXywgcGt0LT5wdHMsIGN0eC0+YXVkaW8tPnRpbWVjb2RlLCBzdC0+dGltZV9iYXNlLm51bSwgc3QtPnRpbWVfYmFzZS5kZW4pOworCisgICAgTkRJbGliX3V0aWxfc2VuZF9zZW5kX2F1ZGlvX2ludGVybGVhdmVkXzE2cyhjdHgtPm5kaV9zZW5kLCBjdHgtPmF1ZGlvKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5kaV93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmN0eC0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisKKyAgICBpZiAgICAgIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICByZXR1cm4gbmRpX3dyaXRlX3ZpZGVvX3BhY2tldChhdmN0eCwgc3QsIHBrdCk7CisgICAgZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgcmV0dXJuIG5kaV93cml0ZV9hdWRpb19wYWNrZXQoYXZjdHgsIHN0LCBwa3QpOworCisgICAgcmV0dXJuIEFWRVJST1JfQlVHOworfQorCitzdGF0aWMgaW50IG5kaV9zZXR1cF9hdWRpbyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVlN0cmVhbSAqc3QpCit7CisgICAgc3RydWN0IE5ESUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmMgPSBzdC0+Y29kZWNwYXI7CisKKyAgICBpZiAoY3R4LT5hdWRpbykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9ubHkgb25lIGF1ZGlvIHN0cmVhbSBpcyBzdXBwb3J0ZWQhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjdHgtPmF1ZGlvID0gYXZfbWFsbG9jeihzaXplb2YoTkRJbGliX2F1ZGlvX2ZyYW1lX2ludGVybGVhdmVkXzE2c190KSk7CisgICAgaWYgKCFjdHgtPmF1ZGlvKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY3R4LT5hdWRpby0+c2FtcGxlX3JhdGUgPSBjLT5zYW1wbGVfcmF0ZTsKKyAgICBjdHgtPmF1ZGlvLT5ub19jaGFubmVscyA9IGMtPmNoYW5uZWxzOworICAgIGN0eC0+YXVkaW8tPnJlZmVyZW5jZV9sZXZlbCA9IGN0eC0+cmVmZXJlbmNlX2xldmVsOworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIE5ESV9USU1FX0JBU0UpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmRpX3NldHVwX3ZpZGVvKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgsIEFWU3RyZWFtICpzdCkKK3sKKyAgICBzdHJ1Y3QgTkRJQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqYyA9IHN0LT5jb2RlY3BhcjsKKworICAgIGlmIChjdHgtPnZpZGVvKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBvbmUgdmlkZW8gc3RyZWFtIGlzIHN1cHBvcnRlZCFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XUkFQUEVEX0FWRlJBTUUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2RlYyBmb3JtYXQhIgorICAgICAgICAgICAgICAgIiBPbmx5IEFWX0NPREVDX0lEX1dSQVBQRURfQVZGUkFNRSBpcyBzdXBwb3J0ZWQgKC12Y29kZWMgd3JhcHBlZF9hdmZyYW1lKS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChjLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9VWVZZNDIyICYmIGMtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX0JHUkEgJiYKKyAgICAgICAgYy0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfQkdSMCAmJiBjLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9SR0JBICYmCisgICAgICAgIGMtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX1JHQjApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQhIgorICAgICAgICAgICAgICAgIiBPbmx5IEFWX1BJWF9GTVRfVVlWWTQyMiwgQVZfUElYX0ZNVF9CR1JBLCBBVl9QSVhfRk1UX0JHUjAsIgorICAgICAgICAgICAgICAgIiBBVl9QSVhfRk1UX1JHQkEsIEFWX1BJWF9GTVRfUkdCMCBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoYy0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQkIgfHwgYy0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQlQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJMb3dlciBmaWVsZC1maXJzdCBkaXNhbGxvd2VkIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY3R4LT52aWRlbyA9IGF2X21hbGxvY3ooc2l6ZW9mKE5ESWxpYl92aWRlb19mcmFtZV90KSk7CisgICAgaWYgKCFjdHgtPnZpZGVvKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3dpdGNoKGMtPmZvcm1hdCkgeworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfVVlWWTQyMjoKKyAgICAgICAgICAgIGN0eC0+dmlkZW8tPkZvdXJDQyA9IE5ESWxpYl9Gb3VyQ0NfdHlwZV9VWVZZOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBOgorICAgICAgICAgICAgY3R4LT52aWRlby0+Rm91ckNDID0gTkRJbGliX0ZvdXJDQ190eXBlX0JHUkE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjA6CisgICAgICAgICAgICBjdHgtPnZpZGVvLT5Gb3VyQ0MgPSBORElsaWJfRm91ckNDX3R5cGVfQkdSWDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICAgICAgICAgIGN0eC0+dmlkZW8tPkZvdXJDQyA9IE5ESWxpYl9Gb3VyQ0NfdHlwZV9SR0JBOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IwOgorICAgICAgICAgICAgY3R4LT52aWRlby0+Rm91ckNDID0gTkRJbGliX0ZvdXJDQ190eXBlX1JHQlg7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjdHgtPnZpZGVvLT54cmVzID0gYy0+d2lkdGg7CisgICAgY3R4LT52aWRlby0+eXJlcyA9IGMtPmhlaWdodDsKKyAgICBjdHgtPnZpZGVvLT5mcmFtZV9yYXRlX04gPSBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtOworICAgIGN0eC0+dmlkZW8tPmZyYW1lX3JhdGVfRCA9IHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW47CisgICAgY3R4LT52aWRlby0+ZnJhbWVfZm9ybWF0X3R5cGUgPSBjLT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9QUk9HUkVTU0lWRQorICAgICAgICA/IE5ESWxpYl9mcmFtZV9mb3JtYXRfdHlwZV9wcm9ncmVzc2l2ZQorICAgICAgICA6IE5ESWxpYl9mcmFtZV9mb3JtYXRfdHlwZV9pbnRlcmxlYXZlZDsKKworICAgIGlmIChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pIHsKKyAgICAgICAgQVZSYXRpb25hbCBkaXNwbGF5X2FzcGVjdF9yYXRpbzsKKyAgICAgICAgYXZfcmVkdWNlKCZkaXNwbGF5X2FzcGVjdF9yYXRpby5udW0sICZkaXNwbGF5X2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICAqIChpbnQ2NF90KXN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICogKGludDY0X3Qpc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgICAgMTAyNCAqIDEwMjQpOworICAgICAgICBjdHgtPnZpZGVvLT5waWN0dXJlX2FzcGVjdF9yYXRpbyA9IGF2X3EyZChkaXNwbGF5X2FzcGVjdF9yYXRpbyk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3R4LT52aWRlby0+cGljdHVyZV9hc3BlY3RfcmF0aW8gPSAoZG91YmxlKXN0LT5jb2RlY3Bhci0+d2lkdGgvc3QtPmNvZGVjcGFyLT5oZWlnaHQ7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgTkRJX1RJTUVfQkFTRSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBuZGlfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqYXZjdHgpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgdW5zaWduZWQgaW50IG47CisgICAgc3RydWN0IE5ESUNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2X2RhdGE7CisgICAgY29uc3QgTkRJbGliX3NlbmRfY3JlYXRlX3QgbmRpX3NlbmRfZGVzYyA9IHsgLnBfbmRpX25hbWUgPSBhdmN0eC0+dXJsLAorICAgICAgICAucF9ncm91cHMgPSBOVUxMLCAuY2xvY2tfdmlkZW8gPSBjdHgtPmNsb2NrX3ZpZGVvLCAuY2xvY2tfYXVkaW8gPSBjdHgtPmNsb2NrX2F1ZGlvIH07CisKKyAgICBpZiAoIU5ESWxpYl9pbml0aWFsaXplKCkpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJORElsaWJfaW5pdGlhbGl6ZSBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgLyogY2hlY2sgaWYgc3RyZWFtcyBjb21wYXRpYmxlICovCisgICAgZm9yIChuID0gMDsgbiA8IGF2Y3R4LT5uYl9zdHJlYW1zOyBuKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZjdHgtPnN0cmVhbXNbbl07CisgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpjID0gc3QtPmNvZGVjcGFyOworICAgICAgICBpZiAgICAgICAgKGMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IG5kaV9zZXR1cF9hdWRpbyhhdmN0eCwgc3QpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9IGVsc2UgaWYgKGMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IG5kaV9zZXR1cF92aWRlbyhhdmN0eCwgc3QpKSkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZS5cbiIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN0eC0+bmRpX3NlbmQgPSBORElsaWJfc2VuZF9jcmVhdGUoJm5kaV9zZW5kX2Rlc2MpOworICAgIGlmICghY3R4LT5uZGlfc2VuZCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgTkRJIG91dHB1dCAlc1xuIiwgYXZjdHgtPnVybCk7CisgICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCitlcnJvcjoKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihzdHJ1Y3QgTkRJQ29udGV4dCwgeCkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicmVmZXJlbmNlX2xldmVsIiwgIlRoZSBhdWRpbyByZWZlcmVuY2UgbGV2ZWwgaW4gZEIiICAsIE9GRlNFVChyZWZlcmVuY2VfbGV2ZWwpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgLTIwLCAyMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19BVURJT19QQVJBTX0sCisgICAgeyAiY2xvY2tfdmlkZW8iLCAiVGhlc2Ugc3BlY2lmeSB3aGV0aGVyIHZpZGVvICdjbG9jaycgdGhlbXNlbHZlcyIgICwgT0ZGU0VUKGNsb2NrX3ZpZGVvKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIH0sCisgICAgeyAiY2xvY2tfYXVkaW8iLCAiVGhlc2Ugc3BlY2lmeSB3aGV0aGVyIGF1ZGlvICdjbG9jaycgdGhlbXNlbHZlcyIgICwgT0ZGU0VUKGNsb2NrX2F1ZGlvKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBsaWJuZGlfbmV3dGVrX211eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIk5ESSBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fT1VUUFVULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfbGlibmRpX25ld3Rla19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlibmRpX25ld3RlayIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5ldHdvcmsgRGV2aWNlIEludGVyZmFjZSAoTkRJKSBvdXRwdXQgdXNpbmcgTmV3VGVrIGxpYnJhcnkiKSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfV1JBUFBFRF9BVkZSQU1FLAorICAgIC5zdWJ0aXRsZV9jb2RlYyA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZsaWJuZGlfbmV3dGVrX211eGVyX2NsYXNzLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgTkRJQ29udGV4dCksCisgICAgLndyaXRlX2hlYWRlciAgID0gbmRpX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBuZGlfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IG5kaV93cml0ZV90cmFpbGVyLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL29wZW5hbC1kZWMuYyBiL2xpYmF2ZGV2aWNlL29wZW5hbC1kZWMuYwppbmRleCBlNGRhZjUzLi5jMTkwNDhlIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9vcGVuYWwtZGVjLmMKKysrIGIvbGliYXZkZXZpY2Uvb3BlbmFsLWRlYy5jCkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICBpbnQgZXJyb3IgPSAwOwogICAgIGNvbnN0IGNoYXIgKmVycm9yX21zZzsKICAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IE5VTEw7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IE5VTEw7CiAKICAgICBpZiAoYWQtPmxpc3RfZGV2aWNlcykgewogICAgICAgICBwcmludF9hbF9jYXB0dXJlX2RldmljZXMoY3R4KTsKQEAgLTEzOSw3ICsxMzksNyBAQAogCiAgICAgLyogT3BlbiBkZXZpY2UgZm9yIGNhcHR1cmUgKi8KICAgICBhZC0+ZGV2aWNlID0KLSAgICAgICAgYWxjQ2FwdHVyZU9wZW5EZXZpY2UoY3R4LT5maWxlbmFtZVswXSA/IGN0eC0+ZmlsZW5hbWUgOiBOVUxMLAorICAgICAgICBhbGNDYXB0dXJlT3BlbkRldmljZShjdHgtPnVybFswXSA/IGN0eC0+dXJsIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWQtPnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZC0+c2FtcGxlX2Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWQtPnNhbXBsZV9yYXRlKTsgLyogTWF4aW11bSAxIHNlY29uZCBvZiBzYW1wbGUgZGF0YSB0byBiZSByZWFkIGF0IG9uY2UgKi8KQEAgLTE1NiwxMSArMTU2LDExIEBACiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOwogCiAgICAgLyogU2V0IGNvZGVjIHBhcmFtZXRlcnMgKi8KLSAgICBjb2RlYyA9IHN0LT5jb2RlYzsKLSAgICBjb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBhZC0+c2FtcGxlX3JhdGU7Ci0gICAgY29kZWMtPmNoYW5uZWxzID0gZ2V0X2FsX2Zvcm1hdF9pbmZvKGFkLT5zYW1wbGVfZm9ybWF0KS0+Y2hhbm5lbHM7Ci0gICAgY29kZWMtPmNvZGVjX2lkID0gZ2V0X2FsX2Zvcm1hdF9pbmZvKGFkLT5zYW1wbGVfZm9ybWF0KS0+Y29kZWNfaWQ7CisgICAgcGFyID0gc3QtPmNvZGVjcGFyOworICAgIHBhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBwYXItPnNhbXBsZV9yYXRlID0gYWQtPnNhbXBsZV9yYXRlOworICAgIHBhci0+Y2hhbm5lbHMgPSBnZXRfYWxfZm9ybWF0X2luZm8oYWQtPnNhbXBsZV9mb3JtYXQpLT5jaGFubmVsczsKKyAgICBwYXItPmNvZGVjX2lkID0gZ2V0X2FsX2Zvcm1hdF9pbmZvKGFkLT5zYW1wbGVfZm9ybWF0KS0+Y29kZWNfaWQ7CiAKICAgICAvKiBUaGlzIGlzIG5lZWRlZCB0byByZWFkIHRoZSBhdWRpbyBkYXRhICovCiAgICAgYWQtPnNhbXBsZV9zdGVwID0gKGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoZ2V0X2FsX2Zvcm1hdF9pbmZvKGFkLT5zYW1wbGVfZm9ybWF0KS0+Y29kZWNfaWQpICoKQEAgLTE4Nyw5ICsxODcsMTYgQEAKICAgICBjb25zdCBjaGFyICplcnJvcl9tc2c7CiAgICAgQUxDaW50IG5iX3NhbXBsZXM7CiAKLSAgICAvKiBHZXQgbnVtYmVyIG9mIHNhbXBsZXMgYXZhaWxhYmxlICovCi0gICAgYWxjR2V0SW50ZWdlcnYoYWQtPmRldmljZSwgQUxDX0NBUFRVUkVfU0FNUExFUywgKEFMQ3NpemVpKSBzaXplb2YoQUxDaW50KSwgJm5iX3NhbXBsZXMpOwotICAgIGlmIChlcnJvciA9IGFsX2dldF9lcnJvcihhZC0+ZGV2aWNlLCAmZXJyb3JfbXNnKSkgZ290byBmYWlsOworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogR2V0IG51bWJlciBvZiBzYW1wbGVzIGF2YWlsYWJsZSAqLworICAgICAgICBhbGNHZXRJbnRlZ2VydihhZC0+ZGV2aWNlLCBBTENfQ0FQVFVSRV9TQU1QTEVTLCAoQUxDc2l6ZWkpIHNpemVvZihBTENpbnQpLCAmbmJfc2FtcGxlcyk7CisgICAgICAgIGlmIChlcnJvciA9IGFsX2dldF9lcnJvcihhZC0+ZGV2aWNlLCAmZXJyb3JfbXNnKSkgZ290byBmYWlsOworICAgICAgICBpZiAobmJfc2FtcGxlcyA+IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGN0eC0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PTkJMT0NLKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgYXZfdXNsZWVwKDEwMDApOworICAgIH0KIAogICAgIC8qIENyZWF0ZSBhIHBhY2tldCBvZiBhcHByb3ByaWF0ZSBzaXplICovCiAgICAgaWYgKChlcnJvciA9IGF2X25ld19wYWNrZXQocGt0LCBuYl9zYW1wbGVzKmFkLT5zYW1wbGVfc3RlcCkpIDwgMCkKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL29wZW5nbF9lbmMuYyBiL2xpYmF2ZGV2aWNlL29wZW5nbF9lbmMuYwppbmRleCBiYThkMzZhLi41NGM3ZTYxIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9vcGVuZ2xfZW5jLmMKKysrIGIvbGliYXZkZXZpY2Uvb3BlbmdsX2VuYy5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8R0wvZ2x4Lmg+CiAjZW5kaWYKIAotI2lmIEhBVkVfU0RMCisjaWYgQ09ORklHX1NETDIKICNpbmNsdWRlIDxTREwuaD4KICNlbmRpZgogCkBAIC02NSw3ICs2NSw3IEBACiAjZGVmaW5lIEFQSUVOVFJZCiAjZW5kaWYKIAotLyogRkZfR0xfUkVEX0NPTVBPTkVOVCBpcyB1c2VkIGZvciBwbGFubmFyIHBpeGVsIHR5cGVzLgorLyogRkZfR0xfUkVEX0NPTVBPTkVOVCBpcyB1c2VkIGZvciBwbGFuYXIgcGl4ZWwgdHlwZXMuCiAgKiBPbmx5IHJlZCBjb21wb25lbnQgaXMgc2FtcGxlZCBpbiBzaGFkZXJzLgogICogT24gc29tZSBwbGF0Zm9ybXMgR0xfUkVEIGlzIG5vdCBhdmFpbGFibGUgYW5kIEdMX0xVTUlOQU5DRSBoYXZlIHRvIGJlIHVzZWQsCiAgKiBidXQgc2luY2UgT3BlbkdMIDMuMCBHTF9MVU1JTkFOQ0UgaXMgZGVwcmVjYXRlZC4KQEAgLTE3NCw4ICsxNzQsOSBAQAogdHlwZWRlZiBzdHJ1Y3QgT3BlbkdMQ29udGV4dCB7CiAgICAgQVZDbGFzcyAqY2xhc3M7ICAgICAgICAgICAgICAgICAgICAvLy88IGNsYXNzIGZvciBwcml2YXRlIG9wdGlvbnMKIAotI2lmIEhBVkVfU0RMCi0gICAgU0RMX1N1cmZhY2UgKnN1cmZhY2U7CisjaWYgQ09ORklHX1NETDIKKyAgICBTRExfV2luZG93ICp3aW5kb3c7CisgICAgU0RMX0dMQ29udGV4dCBnbGNvbnRleHQ7CiAjZW5kaWYKICAgICBGRk9wZW5HTEZ1bmN0aW9ucyBnbHByb2NzOwogCkBAIC0yNjAsNiArMjYxLDcgQEAKICAgICB7IEFWX1BJWF9GTVRfUkdCOCwgICAgICAgJkZGX09QRU5HTF9GUkFHTUVOVF9TSEFERVJfUkdCX1BBQ0tFVCwgIEdMX1JHQiwgRkZfR0xfVU5TSUdORURfQllURV8zXzNfMiB9LAogICAgIHsgQVZfUElYX0ZNVF9CR1I4LCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCLCBGRl9HTF9VTlNJR05FRF9CWVRFXzJfM18zX1JFViB9LAogICAgIHsgQVZfUElYX0ZNVF9SR0I0OCwgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVCB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1I0OCwgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JfUEFDS0VULCAgR0xfUkdCLCBHTF9VTlNJR05FRF9TSE9SVCB9LAogICAgIHsgQVZfUElYX0ZNVF9BUkdCLCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JBX1BBQ0tFVCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSB9LAogICAgIHsgQVZfUElYX0ZNVF9SR0JBLCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JBX1BBQ0tFVCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSB9LAogICAgIHsgQVZfUElYX0ZNVF9BQkdSLCAgICAgICAmRkZfT1BFTkdMX0ZSQUdNRU5UX1NIQURFUl9SR0JBX1BBQ0tFVCwgR0xfUkdCQSwgR0xfVU5TSUdORURfQllURSB9LApAQCAtMzQxLDMwICszNDMsMTQgQEAKICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogfQogCi0jaWYgSEFWRV9TREwKLXN0YXRpYyBpbnQgb3BlbmdsX3NkbF9yZWNyZWF0ZV93aW5kb3coT3BlbkdMQ29udGV4dCAqb3BlbmdsLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCi17Ci0gICAgb3BlbmdsLT5zdXJmYWNlID0gU0RMX1NldFZpZGVvTW9kZSh3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIsIFNETF9PUEVOR0wgfCBTRExfUkVTSVpBQkxFKTsKLSAgICBpZiAoIW9wZW5nbC0+c3VyZmFjZSkgewotICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gc2V0IHZpZGVvIG1vZGU6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwotICAgIH0KLSAgICBTRExfR0xfU2V0QXR0cmlidXRlKFNETF9HTF9SRURfU0laRSwgOCk7Ci0gICAgU0RMX0dMX1NldEF0dHJpYnV0ZShTRExfR0xfR1JFRU5fU0laRSwgOCk7Ci0gICAgU0RMX0dMX1NldEF0dHJpYnV0ZShTRExfR0xfQkxVRV9TSVpFLCA4KTsKLSAgICBTRExfR0xfU2V0QXR0cmlidXRlKFNETF9HTF9BTFBIQV9TSVpFLCA4KTsKLSAgICBTRExfR0xfU2V0QXR0cmlidXRlKFNETF9HTF9ET1VCTEVCVUZGRVIsIDEpOwotICAgIHJldHVybiAwOwotfQotCisjaWYgQ09ORklHX1NETDIKIHN0YXRpYyBpbnQgb3BlbmdsX3NkbF9wcm9jZXNzX2V2ZW50cyhBVkZvcm1hdENvbnRleHQgKmgpCiB7Ci0gICAgaW50IHJldDsKICAgICBPcGVuR0xDb250ZXh0ICpvcGVuZ2wgPSBoLT5wcml2X2RhdGE7CisgICAgQVZEZXZpY2VSZWN0IG1lc3NhZ2U7CiAgICAgU0RMX0V2ZW50IGV2ZW50OwogICAgIFNETF9QdW1wRXZlbnRzKCk7Ci0gICAgd2hpbGUgKFNETF9QZWVwRXZlbnRzKCZldmVudCwgMSwgU0RMX0dFVEVWRU5ULCBTRExfQUxMRVZFTlRTKSA+IDApIHsKKyAgICB3aGlsZSAoU0RMX1BlZXBFdmVudHMoJmV2ZW50LCAxLCBTRExfR0VURVZFTlQsIFNETF9GSVJTVEVWRU5ULCBTRExfTEFTVEVWRU5UKSA+IDApIHsKICAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7CiAgICAgICAgIGNhc2UgU0RMX1FVSVQ6CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwpAQCAtMzc1LDIzICszNjEsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGNhc2UgU0RMX1ZJREVPUkVTSVpFOiB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZmZlclsxMDBdOwotICAgICAgICAgICAgaW50IHJlaW5pdDsKLSAgICAgICAgICAgIEFWRGV2aWNlUmVjdCBtZXNzYWdlOwotICAgICAgICAgICAgLyogY2xlYW4gdXAgb2xkIGNvbnRleHQgYmVjYXVzZSBTRExfU2V0VmlkZW9Nb2RlIG1heSBsb3NlIGl0cyBzdGF0ZS4gKi8KLSAgICAgICAgICAgIFNETF9WaWRlb0RyaXZlck5hbWUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgICAgICAgICByZWluaXQgPSAhYXZfc3RybmNhc2VjbXAoYnVmZmVyLCAicXVhcnR6Iiwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICAgICAgaWYgKHJlaW5pdCkgewotICAgICAgICAgICAgICAgIG9wZW5nbF9kZWluaXRfY29udGV4dChvcGVuZ2wpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChyZXQgPSBvcGVuZ2xfc2RsX3JlY3JlYXRlX3dpbmRvdyhvcGVuZ2wsIGV2ZW50LnJlc2l6ZS53LCBldmVudC5yZXNpemUuaCkpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgaWYgKHJlaW5pdCAmJiAocmV0ID0gb3BlbmdsX2luaXRfY29udGV4dChvcGVuZ2wpKSA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIG1lc3NhZ2Uud2lkdGggPSBvcGVuZ2wtPnN1cmZhY2UtPnc7Ci0gICAgICAgICAgICBtZXNzYWdlLmhlaWdodCA9IG9wZW5nbC0+c3VyZmFjZS0+aDsKLSAgICAgICAgICAgIHJldHVybiBvcGVuZ2xfY29udHJvbF9tZXNzYWdlKGgsIEFWX0FQUF9UT19ERVZfV0lORE9XX1NJWkUsICZtZXNzYWdlLCBzaXplb2YoQVZEZXZpY2VSZWN0KSk7CisgICAgICAgIGNhc2UgU0RMX1dJTkRPV0VWRU5UOgorICAgICAgICAgICAgc3dpdGNoKGV2ZW50LndpbmRvdy5ldmVudCkgeworICAgICAgICAgICAgY2FzZSBTRExfV0lORE9XRVZFTlRfUkVTSVpFRDoKKyAgICAgICAgICAgIGNhc2UgU0RMX1dJTkRPV0VWRU5UX1NJWkVfQ0hBTkdFRDoKKyAgICAgICAgICAgICAgICBTRExfR0xfR2V0RHJhd2FibGVTaXplKG9wZW5nbC0+d2luZG93LCAmbWVzc2FnZS53aWR0aCwgJm1lc3NhZ2UuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3BlbmdsX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9BUFBfVE9fREVWX1dJTkRPV19TSVpFLCAmbWVzc2FnZSwgc2l6ZW9mKEFWRGV2aWNlUmVjdCkpOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTQwMCwyMyArMzc3LDM0IEBACiAKIHN0YXRpYyBpbnQgYXZfY29sZCBvcGVuZ2xfc2RsX2NyZWF0ZV93aW5kb3coQVZGb3JtYXRDb250ZXh0ICpoKQogewotICAgIGludCByZXQ7Ci0gICAgY2hhciBidWZmZXJbMTAwXTsKICAgICBPcGVuR0xDb250ZXh0ICpvcGVuZ2wgPSBoLT5wcml2X2RhdGE7CiAgICAgQVZEZXZpY2VSZWN0IG1lc3NhZ2U7CiAgICAgaWYgKFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSkgewogICAgICAgICBhdl9sb2cob3BlbmdsLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTREw6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwogICAgIH0KLSAgICBpZiAoKHJldCA9IG9wZW5nbF9zZGxfcmVjcmVhdGVfd2luZG93KG9wZW5nbCwgb3BlbmdsLT53aW5kb3dfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZ2wtPndpbmRvd19oZWlnaHQpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0lORk8sICJTREwgZHJpdmVyOiAnJXMnLlxuIiwgU0RMX1ZpZGVvRHJpdmVyTmFtZShidWZmZXIsIHNpemVvZihidWZmZXIpKSk7Ci0gICAgbWVzc2FnZS53aWR0aCA9IG9wZW5nbC0+c3VyZmFjZS0+dzsKLSAgICBtZXNzYWdlLmhlaWdodCA9IG9wZW5nbC0+c3VyZmFjZS0+aDsKLSAgICBTRExfV01fU2V0Q2FwdGlvbihvcGVuZ2wtPndpbmRvd190aXRsZSwgTlVMTCk7Ci0gICAgb3BlbmdsX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9BUFBfVE9fREVWX1dJTkRPV19TSVpFLCAmbWVzc2FnZSwgc2l6ZW9mKEFWRGV2aWNlUmVjdCkpOwotICAgIHJldHVybiAwOworICAgIG9wZW5nbC0+d2luZG93ID0gU0RMX0NyZWF0ZVdpbmRvdyhvcGVuZ2wtPndpbmRvd190aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RMX1dJTkRPV1BPU19VTkRFRklORUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETF9XSU5ET1dQT1NfVU5ERUZJTkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuZ2wtPndpbmRvd193aWR0aCwgb3BlbmdsLT53aW5kb3dfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRExfV0lORE9XX1JFU0laQUJMRSB8IFNETF9XSU5ET1dfT1BFTkdMKTsKKyAgICBpZiAoIW9wZW5nbC0+d2luZG93KSB7CisgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgZGVmYXVsdCB3aW5kb3c6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICBvcGVuZ2wtPmdsY29udGV4dCA9IFNETF9HTF9DcmVhdGVDb250ZXh0KG9wZW5nbC0+d2luZG93KTsKKyAgICBpZiAoIW9wZW5nbC0+Z2xjb250ZXh0KSB7CisgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgT3BlbkdMIGNvbnRleHQgb24gZGVmYXVsdCB3aW5kb3c6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOworICAgIH0KKyAgICBTRExfR0xfU2V0QXR0cmlidXRlKFNETF9HTF9SRURfU0laRSwgOCk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZShTRExfR0xfR1JFRU5fU0laRSwgOCk7CisgICAgU0RMX0dMX1NldEF0dHJpYnV0ZShTRExfR0xfQkxVRV9TSVpFLCA4KTsKKyAgICBTRExfR0xfU2V0QXR0cmlidXRlKFNETF9HTF9BTFBIQV9TSVpFLCA4KTsKKyAgICBTRExfR0xfU2V0QXR0cmlidXRlKFNETF9HTF9ET1VCTEVCVUZGRVIsIDEpOworICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19JTkZPLCAiU0RMIGRyaXZlcjogJyVzJy5cbiIsIFNETF9HZXRDdXJyZW50VmlkZW9Ecml2ZXIoKSk7CisgICAgU0RMX0dMX0dldERyYXdhYmxlU2l6ZShvcGVuZ2wtPndpbmRvdywgJm1lc3NhZ2Uud2lkdGgsICZtZXNzYWdlLmhlaWdodCk7CisgICAgcmV0dXJuIG9wZW5nbF9jb250cm9sX21lc3NhZ2UoaCwgQVZfQVBQX1RPX0RFVl9XSU5ET1dfU0laRSwgJm1lc3NhZ2UsIHNpemVvZihBVkRldmljZVJlY3QpKTsKIH0KIAogc3RhdGljIGludCBhdl9jb2xkIG9wZW5nbF9zZGxfbG9hZF9wcm9jZWR1cmVzKE9wZW5HTENvbnRleHQgKm9wZW5nbCkKQEAgLTQ2MCwxNCArNDQ4LDE0IEBACiAKICN1bmRlZiBMT0FEX09QRU5HTF9GVU4KIH0KLSNlbmRpZiAvKiBIQVZFX1NETCAqLworI2VuZGlmIC8qIENPTkZJR19TREwyICovCiAKICNpZiBkZWZpbmVkKF9fQVBQTEVfXykKIHN0YXRpYyBpbnQgYXZfY29sZCBvcGVuZ2xfbG9hZF9wcm9jZWR1cmVzKE9wZW5HTENvbnRleHQgKm9wZW5nbCkKIHsKICAgICBGRk9wZW5HTEZ1bmN0aW9ucyAqcHJvY3MgPSAmb3BlbmdsLT5nbHByb2NzOwogCi0jaWYgSEFWRV9TREwKKyNpZiBDT05GSUdfU0RMMgogICAgIGlmICghb3BlbmdsLT5ub193aW5kb3cpCiAgICAgICAgIHJldHVybiBvcGVuZ2xfc2RsX2xvYWRfcHJvY2VkdXJlcyhvcGVuZ2wpOwogI2VuZGlmCkBAIC01MTcsNyArNTA1LDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsgXAogICAgIH0KIAotI2lmIEhBVkVfU0RMCisjaWYgQ09ORklHX1NETDIKICAgICBpZiAoIW9wZW5nbC0+bm9fd2luZG93KQogICAgICAgICByZXR1cm4gb3BlbmdsX3NkbF9sb2FkX3Byb2NlZHVyZXMob3BlbmdsKTsKICNlbmRpZgpAQCAtNjc4LDExICs2NjYsMTEgQEAKICAgICBBVlJhdGlvbmFsIHNhciwgZGFyOyAvKiBzYW1wbGUgYW5kIGRpc3BsYXkgYXNwZWN0IHJhdGlvcyAqLwogICAgIE9wZW5HTENvbnRleHQgKm9wZW5nbCA9IHMtPnByaXZfZGF0YTsKICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmNjdHggPSBzdC0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKIAogICAgIC8qIGNvbXB1dGUgb3ZlcmxheSB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gdGhlIGNvZGVjIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KICAgICBzYXIgPSBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPyBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA6IChBVlJhdGlvbmFsKXsgMSwgMSB9OwotICAgIGRhciA9IGF2X211bF9xKHNhciwgKEFWUmF0aW9uYWwpeyBlbmNjdHgtPndpZHRoLCBlbmNjdHgtPmhlaWdodCB9KTsKKyAgICBkYXIgPSBhdl9tdWxfcShzYXIsIChBVlJhdGlvbmFsKXsgcGFyLT53aWR0aCwgcGFyLT5oZWlnaHQgfSk7CiAKICAgICAvKiB3ZSBzdXBwb3NlIHRoZSBzY3JlZW4gaGFzIGEgMS8xIHNhbXBsZSBhc3BlY3QgcmF0aW8gKi8KICAgICAvKiBmaXQgaW4gdGhlIHdpbmRvdyAqLwpAQCAtOTQzLDcgKzkzMSw3IEBACiAgICAgaW50IHJldDsKIAogICAgIGlmICghb3BlbmdsLT5ub193aW5kb3cpIHsKLSNpZiBIQVZFX1NETAorI2lmIENPTkZJR19TREwyCiAgICAgICAgIGlmICgocmV0ID0gb3BlbmdsX3NkbF9jcmVhdGVfd2luZG93KGgpKSA8IDApIHsKICAgICAgICAgICAgIGF2X2xvZyhvcGVuZ2wsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBjcmVhdGUgZGVmYXVsdCBTREwgd2luZG93LlxuIik7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtOTc1LDcgKzk2Myw5IEBACiAgICAgaW50IHJldDsKICAgICBPcGVuR0xDb250ZXh0ICpvcGVuZ2wgPSBoLT5wcml2X2RhdGE7CiAgICAgaWYgKCFvcGVuZ2wtPm5vX3dpbmRvdykgewotI2lmIEhBVkVfU0RMCisjaWYgQ09ORklHX1NETDIKKyAgICAgICAgU0RMX0dMX0RlbGV0ZUNvbnRleHQob3BlbmdsLT5nbGNvbnRleHQpOworICAgICAgICBTRExfRGVzdHJveVdpbmRvdyhvcGVuZ2wtPndpbmRvdyk7CiAgICAgICAgIFNETF9RdWl0KCk7CiAjZW5kaWYKICAgICB9IGVsc2UgaWYgKChyZXQgPSBhdmRldmljZV9kZXZfdG9fYXBwX2NvbnRyb2xfbWVzc2FnZShoLCBBVl9ERVZfVE9fQVBQX0RFU1RST1lfV0lORE9XX0JVRkZFUiwgTlVMTCAsIDApKSA8IDApIHsKQEAgLTEwNjUsMjIgKzEwNTUsMjIgQEAKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKGgtPm5iX3N0cmVhbXMgIT0gMSB8fAotICAgICAgICBoLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gfHwKLSAgICAgICAgaC0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgICAgIGgtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyB8fAorICAgICAgICBoLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKICAgICAgICAgYXZfbG9nKG9wZW5nbCwgQVZfTE9HX0VSUk9SLCAiT25seSBhIHNpbmdsZSB2aWRlbyBzdHJlYW0gaXMgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogICAgIHN0ID0gaC0+c3RyZWFtc1swXTsKLSAgICBvcGVuZ2wtPndpZHRoID0gc3QtPmNvZGVjLT53aWR0aDsKLSAgICBvcGVuZ2wtPmhlaWdodCA9IHN0LT5jb2RlYy0+aGVpZ2h0OwotICAgIG9wZW5nbC0+cGl4X2ZtdCA9IHN0LT5jb2RlYy0+cGl4X2ZtdDsKKyAgICBvcGVuZ2wtPndpZHRoID0gc3QtPmNvZGVjcGFyLT53aWR0aDsKKyAgICBvcGVuZ2wtPmhlaWdodCA9IHN0LT5jb2RlY3Bhci0+aGVpZ2h0OworICAgIG9wZW5nbC0+cGl4X2ZtdCA9IHN0LT5jb2RlY3Bhci0+Zm9ybWF0OwogICAgIGlmICghb3BlbmdsLT53aW5kb3dfd2lkdGgpCiAgICAgICAgIG9wZW5nbC0+d2luZG93X3dpZHRoID0gb3BlbmdsLT53aWR0aDsKICAgICBpZiAoIW9wZW5nbC0+d2luZG93X2hlaWdodCkKICAgICAgICAgb3BlbmdsLT53aW5kb3dfaGVpZ2h0ID0gb3BlbmdsLT5oZWlnaHQ7CiAKICAgICBpZiAoIW9wZW5nbC0+d2luZG93X3RpdGxlICYmICFvcGVuZ2wtPm5vX3dpbmRvdykKLSAgICAgICAgb3BlbmdsLT53aW5kb3dfdGl0bGUgPSBhdl9zdHJkdXAoaC0+ZmlsZW5hbWUpOworICAgICAgICBvcGVuZ2wtPndpbmRvd190aXRsZSA9IGF2X3N0cmR1cChoLT51cmwpOwogCiAgICAgaWYgKChyZXQgPSBvcGVuZ2xfY3JlYXRlX3dpbmRvdyhoKSkpCiAgICAgICAgIGdvdG8gZmFpbDsKQEAgLTExMDksOSArMTA5OSw5IEBACiAKICAgICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwogCi0jaWYgSEFWRV9TREwKKyNpZiBDT05GSUdfU0RMMgogICAgIGlmICghb3BlbmdsLT5ub193aW5kb3cpCi0gICAgICAgIFNETF9HTF9Td2FwQnVmZmVycygpOworICAgICAgICBTRExfR0xfU3dhcFdpbmRvdyhvcGVuZ2wtPndpbmRvdyk7CiAjZW5kaWYKICAgICBpZiAob3BlbmdsLT5ub193aW5kb3cgJiYKICAgICAgICAgKHJldCA9IGF2ZGV2aWNlX2Rldl90b19hcHBfY29udHJvbF9tZXNzYWdlKGgsIEFWX0RFVl9UT19BUFBfRElTUExBWV9XSU5ET1dfQlVGRkVSLCBOVUxMICwgMCkpIDwgMCkgewpAQCAtMTIwMCwxMSArMTE5MCwxMSBAQAogc3RhdGljIGludCBvcGVuZ2xfZHJhdyhBVkZvcm1hdENvbnRleHQgKmgsIHZvaWQgKmlucHV0LCBpbnQgcmVwYWludCwgaW50IGlzX3BrdCkKIHsKICAgICBPcGVuR0xDb250ZXh0ICpvcGVuZ2wgPSBoLT5wcml2X2RhdGE7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQgPSBoLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCA9IGgtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5mb3JtYXQ7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKICAgICBpbnQgcmV0OwogCi0jaWYgSEFWRV9TREwKKyNpZiBDT05GSUdfU0RMMgogICAgIGlmICghb3BlbmdsLT5ub193aW5kb3cgJiYgKHJldCA9IG9wZW5nbF9zZGxfcHJvY2Vzc19ldmVudHMoaCkpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogI2VuZGlmCkBAIC0xMjQ1LDkgKzEyMzUsOSBAQAogICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7CiAgICAgT1BFTkdMX0VSUk9SX0NIRUNLKG9wZW5nbCk7CiAKLSNpZiBIQVZFX1NETAorI2lmIENPTkZJR19TREwyCiAgICAgaWYgKCFvcGVuZ2wtPm5vX3dpbmRvdykKLSAgICAgICAgU0RMX0dMX1N3YXBCdWZmZXJzKCk7CisgICAgICAgIFNETF9HTF9Td2FwV2luZG93KG9wZW5nbC0+d2luZG93KTsKICNlbmRpZgogICAgIGlmIChvcGVuZ2wtPm5vX3dpbmRvdyAmJgogICAgICAgICAocmV0ID0gYXZkZXZpY2VfZGV2X3RvX2FwcF9jb250cm9sX21lc3NhZ2UoaCwgQVZfREVWX1RPX0FQUF9ESVNQTEFZX1dJTkRPV19CVUZGRVIsIE5VTEwgLCAwKSkgPCAwKSB7CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9vc3MuYyBiL2xpYmF2ZGV2aWNlL29zcy5jCmluZGV4IGQ3NDExMjguLmQ5MmNkZTMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL29zcy5jCisrKyBiL2xpYmF2ZGV2aWNlL29zcy5jCkBAIC0yMywxNyArMjMsMTIgQEAKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jaWYgSEFWRV9TT1VORENBUkRfSAotI2luY2x1ZGUgPHNvdW5kY2FyZC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzeXMvc291bmRjYXJkLmg+Ci0jZW5kaWYKLQogI2lmIEhBVkVfVU5JU1REX0gKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNlbmRpZgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgogCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9vc3NfZGVjLmMgYi9saWJhdmRldmljZS9vc3NfZGVjLmMKaW5kZXggM2E5YTIwYS4uZDBkYzMyNyAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2Uvb3NzX2RlYy5jCisrKyBiL2xpYmF2ZGV2aWNlL29zc19kZWMuYwpAQCAtMjMsMTcgKzIzLDEyIEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotI2lmIEhBVkVfU09VTkRDQVJEX0gKLSNpbmNsdWRlIDxzb3VuZGNhcmQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgotI2VuZGlmCi0KICNpZiBIQVZFX1VOSVNURF9ICiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKQEAgLTU3LDE2ICs1MiwxNiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KIAotICAgIHJldCA9IGZmX29zc19hdWRpb19vcGVuKHMxLCAwLCBzMS0+ZmlsZW5hbWUpOworICAgIHJldCA9IGZmX29zc19hdWRpb19vcGVuKHMxLCAwLCBzMS0+dXJsKTsKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogICAgIH0KIAogICAgIC8qIHRha2UgcmVhbCBwYXJhbWV0ZXJzICovCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBzLT5jb2RlY19pZDsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gcy0+c2FtcGxlX3JhdGU7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IHMtPmNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gcy0+Y29kZWNfaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBzLT5jaGFubmVsczsKIAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgIC8qIDY0IGJpdHMgcHRzIGluIHVzICovCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9vc3NfZW5jLmMgYi9saWJhdmRldmljZS9vc3NfZW5jLmMKaW5kZXggMzc4MWViNS4uZTMxNzJhZiAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2Uvb3NzX2VuYy5jCisrKyBiL2xpYmF2ZGV2aWNlL29zc19lbmMuYwpAQCAtMjEsMTcgKzIxLDEyIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKIAotI2lmIEhBVkVfU09VTkRDQVJEX0gKLSNpbmNsdWRlIDxzb3VuZGNhcmQuaD4KLSNlbHNlCi0jaW5jbHVkZSA8c3lzL3NvdW5kY2FyZC5oPgotI2VuZGlmCi0KICNpZiBIQVZFX1VOSVNURF9ICiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9zb3VuZGNhcmQuaD4KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogCkBAIC00OSw5ICs0NCw5IEBACiAgICAgaW50IHJldDsKIAogICAgIHN0ID0gczEtPnN0cmVhbXNbMF07Ci0gICAgcy0+c2FtcGxlX3JhdGUgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlOwotICAgIHMtPmNoYW5uZWxzID0gc3QtPmNvZGVjLT5jaGFubmVsczsKLSAgICByZXQgPSBmZl9vc3NfYXVkaW9fb3BlbihzMSwgMSwgczEtPmZpbGVuYW1lKTsKKyAgICBzLT5zYW1wbGVfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGU7CisgICAgcy0+Y2hhbm5lbHMgPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgIHJldCA9IGZmX29zc19hdWRpb19vcGVuKHMxLCAxLCBzMS0+dXJsKTsKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9wdWxzZV9hdWRpb19kZWMuYyBiL2xpYmF2ZGV2aWNlL3B1bHNlX2F1ZGlvX2RlYy5jCmluZGV4IGFhMDgwMGIuLjU5NzdmYjcgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL3B1bHNlX2F1ZGlvX2RlYy5jCisrKyBiL2xpYmF2ZGV2aWNlL3B1bHNlX2F1ZGlvX2RlYy5jCkBAIC0xNTgsOCArMTU4LDggQEAKIAogICAgIGF0dHIuZnJhZ3NpemUgPSBwZC0+ZnJhZ21lbnRfc2l6ZTsKIAotICAgIGlmIChzLT5maWxlbmFtZVswXSAhPSAnXDAnICYmIHN0cmNtcChzLT5maWxlbmFtZSwgImRlZmF1bHQiKSkKLSAgICAgICAgZGV2aWNlID0gcy0+ZmlsZW5hbWU7CisgICAgaWYgKHMtPnVybFswXSAhPSAnXDAnICYmIHN0cmNtcChzLT51cmwsICJkZWZhdWx0IikpCisgICAgICAgIGRldmljZSA9IHMtPnVybDsKIAogICAgIGlmICghKHBkLT5tYWlubG9vcCA9IHBhX3RocmVhZGVkX21haW5sb29wX25ldygpKSkgewogICAgICAgICBwdWxzZV9jbG9zZShzKTsKQEAgLTI0MiwxMCArMjQyLDEwIEBACiAgICAgcGFfdGhyZWFkZWRfbWFpbmxvb3BfdW5sb2NrKHBkLT5tYWlubG9vcCk7CiAKICAgICAvKiB0YWtlIHJlYWwgcGFyYW1ldGVycyAqLwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IGNvZGVjX2lkOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBwZC0+c2FtcGxlX3JhdGU7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IHBkLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBjb2RlY19pZDsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gcGQtPnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBwZC0+Y2hhbm5lbHM7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAgLyogNjQgYml0cyBwdHMgaW4gdXMgKi8KIAogICAgIHBkLT50aW1lZmlsdGVyID0gZmZfdGltZWZpbHRlcl9uZXcoMTAwMDAwMC4wIC8gcGQtPnNhbXBsZV9yYXRlLApkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvcHVsc2VfYXVkaW9fZW5jLmMgYi9saWJhdmRldmljZS9wdWxzZV9hdWRpb19lbmMuYwppbmRleCBiNDE5YTM4Li5kNDMwYjc3IDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9wdWxzZV9hdWRpb19lbmMuYworKysgYi9saWJhdmRldmljZS9wdWxzZV9hdWRpb19lbmMuYwpAQCAtNDUyLDE1ICs0NTIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFfU1RSRUFNX0FVVE9fVElNSU5HX1VQREFURSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBBX1NUUkVBTV9OT1RfTU9OT1RPTklDOwogCi0gICAgaWYgKGgtPm5iX3N0cmVhbXMgIT0gMSB8fCBoLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICBpZiAoaC0+bmJfc3RyZWFtcyAhPSAxIHx8IGgtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBhIHNpbmdsZSBhdWRpbyBzdHJlYW0gaXMgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogICAgIHN0ID0gaC0+c3RyZWFtc1swXTsKIAogICAgIGlmICghc3RyZWFtX25hbWUpIHsKLSAgICAgICAgaWYgKGgtPmZpbGVuYW1lWzBdKQotICAgICAgICAgICAgc3RyZWFtX25hbWUgPSBoLT5maWxlbmFtZTsKKyAgICAgICAgaWYgKGgtPnVybFswXSkKKyAgICAgICAgICAgIHN0cmVhbV9uYW1lID0gaC0+dXJsOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzdHJlYW1fbmFtZSA9ICJQbGF5YmFjayI7CiAgICAgfQpAQCAtNDY4LDggKzQ2OCw4IEBACiAKICAgICBpZiAocy0+YnVmZmVyX2R1cmF0aW9uKSB7CiAgICAgICAgIGludDY0X3QgYnl0ZXMgPSBzLT5idWZmZXJfZHVyYXRpb247Ci0gICAgICAgIGJ5dGVzICo9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICoKLSAgICAgICAgICAgICAgICAgYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5zYW1wbGVfZm10KTsKKyAgICAgICAgYnl0ZXMgKj0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmZvcm1hdCk7CiAgICAgICAgIGJ5dGVzIC89IDEwMDA7CiAgICAgICAgIGJ1ZmZlcl9hdHRyaWJ1dGVzLnRsZW5ndGggPSBGRk1BWChzLT5idWZmZXJfc2l6ZSwgYXZfY2xpcDY0KGJ5dGVzLCAwLCBVSU5UMzJfTUFYIC0gMSkpOwogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLApAQCAtNDgzLDkgKzQ4Myw5IEBACiAgICAgaWYgKHMtPm1pbnJlcSkKICAgICAgICAgYnVmZmVyX2F0dHJpYnV0ZXMubWlucmVxID0gcy0+bWlucmVxOwogCi0gICAgc2FtcGxlX3NwZWMuZm9ybWF0ID0gZmZfY29kZWNfaWRfdG9fcHVsc2VfZm9ybWF0KHN0LT5jb2RlYy0+Y29kZWNfaWQpOwotICAgIHNhbXBsZV9zcGVjLnJhdGUgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlOwotICAgIHNhbXBsZV9zcGVjLmNoYW5uZWxzID0gc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICBzYW1wbGVfc3BlYy5mb3JtYXQgPSBmZl9jb2RlY19pZF90b19wdWxzZV9mb3JtYXQoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCk7CisgICAgc2FtcGxlX3NwZWMucmF0ZSA9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGU7CisgICAgc2FtcGxlX3NwZWMuY2hhbm5lbHMgPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogICAgIGlmICghcGFfc2FtcGxlX3NwZWNfdmFsaWQoJnNhbXBsZV9zcGVjKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgc3BlYy5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwpAQCAtNDk0LDEwICs0OTQsMTAgQEAKICAgICBpZiAoc2FtcGxlX3NwZWMuY2hhbm5lbHMgPT0gMSkgewogICAgICAgICBjaGFubmVsX21hcC5jaGFubmVscyA9IDE7CiAgICAgICAgIGNoYW5uZWxfbWFwLm1hcFswXSA9IFBBX0NIQU5ORUxfUE9TSVRJT05fTU9OTzsKLSAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQpIHsKLSAgICAgICAgaWYgKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0KSAhPSBzdC0+Y29kZWMtPmNoYW5uZWxzKQorICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCkgeworICAgICAgICBpZiAoYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQpICE9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBwdWxzZV9tYXBfY2hhbm5lbHNfdG9fcHVsc2Uoc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCwgJmNoYW5uZWxfbWFwKTsKKyAgICAgICAgcHVsc2VfbWFwX2NoYW5uZWxzX3RvX3B1bHNlKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQsICZjaGFubmVsX21hcCk7CiAgICAgICAgIC8qIFVua25vd24gY2hhbm5lbCBpcyBwcmVzZW50IGluIGNoYW5uZWxfbGF5b3V0LCBsZXQgUHVsc2VBdWRpbyB1c2UgaXRzIGRlZmF1bHQuICovCiAgICAgICAgIGlmIChjaGFubmVsX21hcC5jaGFubmVscyAhPSBzYW1wbGVfc3BlYy5jaGFubmVscykgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBjaGFubmVsLiBVc2luZyBkZWZhdWwgY2hhbm5lbCBtYXAuXG4iKTsKQEAgLTYzNyw5ICs2MzcsOCBAQAogICAgICAgICBzLT50aW1lc3RhbXAgKz0gcGt0LT5kdXJhdGlvbjsKICAgICB9IGVsc2UgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBoLT5zdHJlYW1zWzBdOwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWNfY3R4ID0gc3QtPmNvZGVjOwotICAgICAgICBBVlJhdGlvbmFsIHIgPSB7IDEsIGNvZGVjX2N0eC0+c2FtcGxlX3JhdGUgfTsKLSAgICAgICAgaW50NjRfdCBzYW1wbGVzID0gcGt0LT5zaXplIC8gKGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGNvZGVjX2N0eC0+c2FtcGxlX2ZtdCkgKiBjb2RlY19jdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgQVZSYXRpb25hbCByID0geyAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIH07CisgICAgICAgIGludDY0X3Qgc2FtcGxlcyA9IHBrdC0+c2l6ZSAvIChhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmZvcm1hdCkgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKICAgICAgICAgcy0+dGltZXN0YW1wICs9IGF2X3Jlc2NhbGVfcShzYW1wbGVzLCByLCBzdC0+dGltZV9iYXNlKTsKICAgICB9CiAKQEAgLTY3OCwxMyArNjc3LDEzIEBACiAKICAgICAvKiBQbGFuYXIgZm9ybWF0cyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuICovCiAgICAgaWYgKGZsYWdzICYgQVZfV1JJVEVfVU5DT0RFRF9GUkFNRV9RVUVSWSkKLSAgICAgICAgcmV0dXJuIGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGgtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPnNhbXBsZV9mbXQpID8KKyAgICAgICAgcmV0dXJuIGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGgtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmZvcm1hdCkgPwogICAgICAgICAgICAgICAgQVZFUlJPUihFSU5WQUwpIDogMDsKIAogICAgIHBrdC5kYXRhICAgICA9ICgqZnJhbWUpLT5kYXRhWzBdOwotICAgIHBrdC5zaXplICAgICA9ICgqZnJhbWUpLT5uYl9zYW1wbGVzICogYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoKCpmcmFtZSktPmZvcm1hdCkgKiBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoKmZyYW1lKTsKKyAgICBwa3Quc2l6ZSAgICAgPSAoKmZyYW1lKS0+bmJfc2FtcGxlcyAqIGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKCgqZnJhbWUpLT5mb3JtYXQpICogKCpmcmFtZSktPmNoYW5uZWxzOwogICAgIHBrdC5kdHMgICAgICA9ICgqZnJhbWUpLT5wa3RfZHRzOwotICAgIHBrdC5kdXJhdGlvbiA9IGF2X2ZyYW1lX2dldF9wa3RfZHVyYXRpb24oKmZyYW1lKTsKKyAgICBwa3QuZHVyYXRpb24gPSAoKmZyYW1lKS0+cGt0X2R1cmF0aW9uOwogICAgIHJldHVybiBwdWxzZV93cml0ZV9wYWNrZXQoaCwgJnBrdCk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL3F0a2l0Lm0gYi9saWJhdmRldmljZS9xdGtpdC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmE5NGNhLi4wMDAwMDAwCi0tLSBhL2xpYmF2ZGV2aWNlL3F0a2l0Lm0KKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoKLSAqIFFUS2l0IGlucHV0IGRldmljZQotICogQ29weXJpZ2h0IChjKSAyMDEzIFZhZGltIEthbGluc2t5IDx2YWRpbUBrYWxpbnNreS5ydT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogUVRLaXQgaW5wdXQgZGV2aWNlCi0gKiBAYXV0aG9yIFZhZGltIEthbGluc2t5IDx2YWRpbUBrYWxpbnNreS5ydT4KLSAqLwotCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLSNlbmRpZgotCi0jaW1wb3J0IDxRVEtpdC9RVEtpdC5oPgotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKLSNpbmNsdWRlICJhdmRldmljZS5oIgotCi0jZGVmaW5lIFFUS0lUX1RJTUVCQVNFIDEwMAotCi1zdGF0aWMgY29uc3QgQVZSYXRpb25hbCBrUVRLaXRUaW1lQmFzZV9xID0gewotICAgIC5udW0gPSAxLAotICAgIC5kZW4gPSBRVEtJVF9USU1FQkFTRQotfTsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBBVkNsYXNzKiAgICAgICAgY2xhc3M7Ci0KLSAgICBmbG9hdCAgICAgICAgICAgZnJhbWVfcmF0ZTsKLSAgICBpbnQgICAgICAgICAgICAgZnJhbWVzX2NhcHR1cmVkOwotICAgIGludDY0X3QgICAgICAgICBmaXJzdF9wdHM7Ci0gICAgcHRocmVhZF9tdXRleF90IGZyYW1lX2xvY2s7Ci0gICAgcHRocmVhZF9jb25kX3QgIGZyYW1lX3dhaXRfY29uZDsKLSAgICBpZCAgICAgICAgICAgICAgcXRfZGVsZWdhdGU7Ci0KLSAgICBpbnQgICAgICAgICAgICAgbGlzdF9kZXZpY2VzOwotICAgIGludCAgICAgICAgICAgICB2aWRlb19kZXZpY2VfaW5kZXg7Ci0KLSAgICBRVENhcHR1cmVTZXNzaW9uKiAgICAgICAgICAgICAgICAgY2FwdHVyZV9zZXNzaW9uOwotICAgIFFUQ2FwdHVyZURlY29tcHJlc3NlZFZpZGVvT3V0cHV0KiB2aWRlb19vdXRwdXQ7Ci0gICAgQ1ZJbWFnZUJ1ZmZlclJlZiAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZnJhbWU7Ci19IENhcHR1cmVDb250ZXh0OwotCi1zdGF0aWMgdm9pZCBsb2NrX2ZyYW1lcyhDYXB0dXJlQ29udGV4dCogY3R4KQotewotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY3R4LT5mcmFtZV9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgdW5sb2NrX2ZyYW1lcyhDYXB0dXJlQ29udGV4dCogY3R4KQotewotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjdHgtPmZyYW1lX2xvY2spOwotfQotCi0vKiogRnJhbWVSZWNpZXZlciBjbGFzcyAtIGRlbGVnYXRlIGZvciBRVENhcHR1cmVTZXNzaW9uCi0gKi8KLUBpbnRlcmZhY2UgRkZNUEVHX0ZyYW1lUmVjZWl2ZXIgOiBOU09iamVjdAotewotICAgIENhcHR1cmVDb250ZXh0KiBfY29udGV4dDsKLX0KLQotLSAoaWQpaW5pdFdpdGhDb250ZXh0OihDYXB0dXJlQ29udGV4dCopY29udGV4dDsKLQotLSAodm9pZCljYXB0dXJlT3V0cHV0OihRVENhcHR1cmVPdXRwdXQgKiljYXB0dXJlT3V0cHV0Ci0gIGRpZE91dHB1dFZpZGVvRnJhbWU6KENWSW1hZ2VCdWZmZXJSZWYpdmlkZW9GcmFtZQotICAgICB3aXRoU2FtcGxlQnVmZmVyOihRVFNhbXBsZUJ1ZmZlciAqKXNhbXBsZUJ1ZmZlcgotICAgICAgIGZyb21Db25uZWN0aW9uOihRVENhcHR1cmVDb25uZWN0aW9uICopY29ubmVjdGlvbjsKLQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gRkZNUEVHX0ZyYW1lUmVjZWl2ZXIKLQotLSAoaWQpaW5pdFdpdGhDb250ZXh0OihDYXB0dXJlQ29udGV4dCopY29udGV4dAotewotICAgIGlmIChzZWxmID0gW3N1cGVyIGluaXRdKSB7Ci0gICAgICAgIF9jb250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0gICAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKHZvaWQpY2FwdHVyZU91dHB1dDooUVRDYXB0dXJlT3V0cHV0ICopY2FwdHVyZU91dHB1dAotICBkaWRPdXRwdXRWaWRlb0ZyYW1lOihDVkltYWdlQnVmZmVyUmVmKXZpZGVvRnJhbWUKLSAgICAgd2l0aFNhbXBsZUJ1ZmZlcjooUVRTYW1wbGVCdWZmZXIgKilzYW1wbGVCdWZmZXIKLSAgICAgICBmcm9tQ29ubmVjdGlvbjooUVRDYXB0dXJlQ29ubmVjdGlvbiAqKWNvbm5lY3Rpb24KLXsKLSAgICBsb2NrX2ZyYW1lcyhfY29udGV4dCk7Ci0gICAgaWYgKF9jb250ZXh0LT5jdXJyZW50X2ZyYW1lICE9IG5pbCkgewotICAgICAgICBDVkJ1ZmZlclJlbGVhc2UoX2NvbnRleHQtPmN1cnJlbnRfZnJhbWUpOwotICAgIH0KLQotICAgIF9jb250ZXh0LT5jdXJyZW50X2ZyYW1lID0gQ1ZCdWZmZXJSZXRhaW4odmlkZW9GcmFtZSk7Ci0KLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZfY29udGV4dC0+ZnJhbWVfd2FpdF9jb25kKTsKLQotICAgIHVubG9ja19mcmFtZXMoX2NvbnRleHQpOwotCi0gICAgKytfY29udGV4dC0+ZnJhbWVzX2NhcHR1cmVkOwotfQotCi1AZW5kCi0KLXN0YXRpYyB2b2lkIGRlc3Ryb3lfY29udGV4dChDYXB0dXJlQ29udGV4dCogY3R4KQotewotICAgIFtjdHgtPmNhcHR1cmVfc2Vzc2lvbiBzdG9wUnVubmluZ107Ci0KLSAgICBbY3R4LT5jYXB0dXJlX3Nlc3Npb24gcmVsZWFzZV07Ci0gICAgW2N0eC0+dmlkZW9fb3V0cHV0ICAgIHJlbGVhc2VdOwotICAgIFtjdHgtPnF0X2RlbGVnYXRlICAgICByZWxlYXNlXTsKLQotICAgIGN0eC0+Y2FwdHVyZV9zZXNzaW9uID0gTlVMTDsKLSAgICBjdHgtPnZpZGVvX291dHB1dCAgICA9IE5VTEw7Ci0gICAgY3R4LT5xdF9kZWxlZ2F0ZSAgICAgPSBOVUxMOwotCi0gICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZjdHgtPmZyYW1lX2xvY2spOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjdHgtPmZyYW1lX3dhaXRfY29uZCk7Ci0KLSAgICBpZiAoY3R4LT5jdXJyZW50X2ZyYW1lKQotICAgICAgICBDVkJ1ZmZlclJlbGVhc2UoY3R4LT5jdXJyZW50X2ZyYW1lKTsKLX0KLQotc3RhdGljIGludCBxdGtpdF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgTlNBdXRvcmVsZWFzZVBvb2wqIHBvb2wgPSBbW05TQXV0b3JlbGVhc2VQb29sIGFsbG9jXSBpbml0XTsKLQotICAgIENhcHR1cmVDb250ZXh0KiBjdHggPSAoQ2FwdHVyZUNvbnRleHQqKXMtPnByaXZfZGF0YTsKLQotICAgIGN0eC0+Zmlyc3RfcHRzID0gYXZfZ2V0dGltZSgpOwotCi0gICAgcHRocmVhZF9tdXRleF9pbml0KCZjdHgtPmZyYW1lX2xvY2ssIE5VTEwpOwotICAgIHB0aHJlYWRfY29uZF9pbml0KCZjdHgtPmZyYW1lX3dhaXRfY29uZCwgTlVMTCk7Ci0KLSAgICAvLyBMaXN0IGRldmljZXMgaWYgcmVxdWVzdGVkCi0gICAgaWYgKGN0eC0+bGlzdF9kZXZpY2VzKSB7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiUVRLaXQgdmlkZW8gZGV2aWNlczpcbiIpOwotICAgICAgICBOU0FycmF5ICpkZXZpY2VzID0gW1FUQ2FwdHVyZURldmljZSBpbnB1dERldmljZXNXaXRoTWVkaWFUeXBlOlFUTWVkaWFUeXBlVmlkZW9dOwotICAgICAgICBmb3IgKFFUQ2FwdHVyZURldmljZSAqZGV2aWNlIGluIGRldmljZXMpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBbW2RldmljZSBsb2NhbGl6ZWREaXNwbGF5TmFtZV0gVVRGOFN0cmluZ107Ci0gICAgICAgICAgICBpbnQgaW5kZXggID0gW2RldmljZXMgaW5kZXhPZk9iamVjdDpkZXZpY2VdOwotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJbJWRdICVzXG4iLCBpbmRleCwgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIC8vIEZpbmQgY2FwdHVyZSBkZXZpY2UKLSAgICBRVENhcHR1cmVEZXZpY2UgKnZpZGVvX2RldmljZSA9IG5pbDsKLQotICAgIC8vIGNoZWNrIGZvciBkZXZpY2UgaW5kZXggZ2l2ZW4gaW4gZmlsZW5hbWUKLSAgICBpZiAoY3R4LT52aWRlb19kZXZpY2VfaW5kZXggPT0gLTEpIHsKLSAgICAgICAgc3NjYW5mKHMtPmZpbGVuYW1lLCAiJWQiLCAmY3R4LT52aWRlb19kZXZpY2VfaW5kZXgpOwotICAgIH0KLQotICAgIGlmIChjdHgtPnZpZGVvX2RldmljZV9pbmRleCA+PSAwKSB7Ci0gICAgICAgIE5TQXJyYXkgKmRldmljZXMgPSBbUVRDYXB0dXJlRGV2aWNlIGlucHV0RGV2aWNlc1dpdGhNZWRpYVR5cGU6UVRNZWRpYVR5cGVWaWRlb107Ci0KLSAgICAgICAgaWYgKGN0eC0+dmlkZW9fZGV2aWNlX2luZGV4ID49IFtkZXZpY2VzIGNvdW50XSkgewotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBkZXZpY2UgaW5kZXhcbiIpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlkZW9fZGV2aWNlID0gW2RldmljZXMgb2JqZWN0QXRJbmRleDpjdHgtPnZpZGVvX2RldmljZV9pbmRleF07Ci0gICAgfSBlbHNlIGlmIChzdHJuY21wKHMtPmZpbGVuYW1lLCAiIiwgICAgICAgIDEpICYmCi0gICAgICAgICAgICAgICBzdHJuY21wKHMtPmZpbGVuYW1lLCAiZGVmYXVsdCIsIDcpKSB7Ci0gICAgICAgIE5TQXJyYXkgKmRldmljZXMgPSBbUVRDYXB0dXJlRGV2aWNlIGlucHV0RGV2aWNlc1dpdGhNZWRpYVR5cGU6UVRNZWRpYVR5cGVWaWRlb107Ci0KLSAgICAgICAgZm9yIChRVENhcHR1cmVEZXZpY2UgKmRldmljZSBpbiBkZXZpY2VzKSB7Ci0gICAgICAgICAgICBpZiAoIXN0cm5jbXAocy0+ZmlsZW5hbWUsIFtbZGV2aWNlIGxvY2FsaXplZERpc3BsYXlOYW1lXSBVVEY4U3RyaW5nXSwgc3RybGVuKHMtPmZpbGVuYW1lKSkpIHsKLSAgICAgICAgICAgICAgICB2aWRlb19kZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF2aWRlb19kZXZpY2UpIHsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlZpZGVvIGRldmljZSBub3QgZm91bmRcbiIpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmlkZW9fZGV2aWNlID0gW1FUQ2FwdHVyZURldmljZSBkZWZhdWx0SW5wdXREZXZpY2VXaXRoTWVkaWFUeXBlOlFUTWVkaWFUeXBlTXV4ZWRdOwotICAgIH0KLQotICAgIEJPT0wgc3VjY2VzcyA9IFt2aWRlb19kZXZpY2Ugb3BlbjpuaWxdOwotCi0gICAgLy8gVmlkZW8gY2FwdHVyZSBkZXZpY2Ugbm90IGZvdW5kLCBsb29raW5nIGZvciBRVE1lZGlhVHlwZVZpZGVvCi0gICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIHZpZGVvX2RldmljZSA9IFtRVENhcHR1cmVEZXZpY2UgZGVmYXVsdElucHV0RGV2aWNlV2l0aE1lZGlhVHlwZTpRVE1lZGlhVHlwZVZpZGVvXTsKLSAgICAgICAgc3VjY2VzcyAgICAgID0gW3ZpZGVvX2RldmljZSBvcGVuOm5pbF07Ci0KLSAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gUVQgY2FwdHVyZSBkZXZpY2UgZm91bmRcbiIpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTlNTdHJpbmcqIGRldl9kaXNwbGF5X25hbWUgPSBbdmlkZW9fZGV2aWNlIGxvY2FsaXplZERpc3BsYXlOYW1lXTsKLSAgICBhdl9sb2cgKHMsIEFWX0xPR19ERUJVRywgIiclcycgb3BlbmVkXG4iLCBbZGV2X2Rpc3BsYXlfbmFtZSBVVEY4U3RyaW5nXSk7Ci0KLSAgICAvLyBJbml0aWFsaXplIGNhcHR1cmUgc2Vzc2lvbgotICAgIGN0eC0+Y2FwdHVyZV9zZXNzaW9uID0gW1tRVENhcHR1cmVTZXNzaW9uIGFsbG9jXSBpbml0XTsKLQotICAgIFFUQ2FwdHVyZURldmljZUlucHV0KiBjYXB0dXJlX2Rldl9pbnB1dCA9IFtbW1FUQ2FwdHVyZURldmljZUlucHV0IGFsbG9jXSBpbml0V2l0aERldmljZTp2aWRlb19kZXZpY2VdIGF1dG9yZWxlYXNlXTsKLSAgICBzdWNjZXNzID0gW2N0eC0+Y2FwdHVyZV9zZXNzaW9uIGFkZElucHV0OmNhcHR1cmVfZGV2X2lucHV0IGVycm9yOm5pbF07Ci0KLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgYXZfbG9nIChzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWRkIFFUIGNhcHR1cmUgZGV2aWNlIHRvIHNlc3Npb25cbiIpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgLy8gQXR0YWNoaW5nIG91dHB1dAotICAgIC8vIEZJWE1FOiBBbGxvdyBmb3IgYSB1c2VyIGRlZmluZWQgcGl4ZWwgZm9ybWF0Ci0gICAgY3R4LT52aWRlb19vdXRwdXQgPSBbW1FUQ2FwdHVyZURlY29tcHJlc3NlZFZpZGVvT3V0cHV0IGFsbG9jXSBpbml0XTsKLQotICAgIE5TRGljdGlvbmFyeSAqY2FwdHVyZURpY3Rpb25hcnkgPSBbTlNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05TTnVtYmVyIG51bWJlcldpdGhVbnNpZ25lZEludDprQ1ZQaXhlbEZvcm1hdFR5cGVfMjRSR0JdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGlkKWtDVlBpeGVsQnVmZmVyUGl4ZWxGb3JtYXRUeXBlS2V5XTsKLQotICAgIFtjdHgtPnZpZGVvX291dHB1dCBzZXRQaXhlbEJ1ZmZlckF0dHJpYnV0ZXM6Y2FwdHVyZURpY3Rpb25hcnldOwotCi0gICAgY3R4LT5xdF9kZWxlZ2F0ZSA9IFtbRkZNUEVHX0ZyYW1lUmVjZWl2ZXIgYWxsb2NdIGluaXRXaXRoQ29udGV4dDpjdHhdOwotCi0gICAgW2N0eC0+dmlkZW9fb3V0cHV0IHNldERlbGVnYXRlOmN0eC0+cXRfZGVsZWdhdGVdOwotICAgIFtjdHgtPnZpZGVvX291dHB1dCBzZXRBdXRvbWF0aWNhbGx5RHJvcHNMYXRlVmlkZW9GcmFtZXM6WUVTXTsKLSAgICBbY3R4LT52aWRlb19vdXRwdXQgc2V0TWluaW11bVZpZGVvRnJhbWVJbnRlcnZhbDoxLjAvY3R4LT5mcmFtZV9yYXRlXTsKLQotICAgIHN1Y2Nlc3MgPSBbY3R4LT5jYXB0dXJlX3Nlc3Npb24gYWRkT3V0cHV0OmN0eC0+dmlkZW9fb3V0cHV0IGVycm9yOm5pbF07Ci0KLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgYXZfbG9nIChzLCBBVl9MT0dfRVJST1IsICJjYW4ndCBhZGQgdmlkZW8gb3V0cHV0IHRvIGNhcHR1cmUgc2Vzc2lvblxuIik7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBbY3R4LT5jYXB0dXJlX3Nlc3Npb24gc3RhcnRSdW5uaW5nXTsKLQotICAgIC8vIFRha2Ugc3RyZWFtIGluZm8gZnJvbSB0aGUgZmlyc3QgZnJhbWUuCi0gICAgd2hpbGUgKGN0eC0+ZnJhbWVzX2NhcHR1cmVkIDwgMSkgewotICAgICAgICBDRlJ1bkxvb3BSdW5Jbk1vZGUoa0NGUnVuTG9vcERlZmF1bHRNb2RlLCAwLjEsIFlFUyk7Ci0gICAgfQotCi0gICAgbG9ja19mcmFtZXMoY3R4KTsKLQotICAgIEFWU3RyZWFtKiBzdHJlYW0gPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwotCi0gICAgaWYgKCFzdHJlYW0pIHsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3RyZWFtLCA2NCwgMSwgUVRLSVRfVElNRUJBU0UpOwotCi0gICAgc3RyZWFtLT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOwotICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3RyZWFtLT5jb2RlYy0+d2lkdGggICAgICA9IChpbnQpQ1ZQaXhlbEJ1ZmZlckdldFdpZHRoIChjdHgtPmN1cnJlbnRfZnJhbWUpOwotICAgIHN0cmVhbS0+Y29kZWMtPmhlaWdodCAgICAgPSAoaW50KUNWUGl4ZWxCdWZmZXJHZXRIZWlnaHQoY3R4LT5jdXJyZW50X2ZyYW1lKTsKLSAgICBzdHJlYW0tPmNvZGVjLT5waXhfZm10ICAgID0gQVZfUElYX0ZNVF9SR0IyNDsKLQotICAgIENWQnVmZmVyUmVsZWFzZShjdHgtPmN1cnJlbnRfZnJhbWUpOwotICAgIGN0eC0+Y3VycmVudF9mcmFtZSA9IG5pbDsKLQotICAgIHVubG9ja19mcmFtZXMoY3R4KTsKLQotICAgIFtwb29sIHJlbGVhc2VdOwotCi0gICAgcmV0dXJuIDA7Ci0KLWZhaWw6Ci0gICAgW3Bvb2wgcmVsZWFzZV07Ci0KLSAgICBkZXN0cm95X2NvbnRleHQoY3R4KTsKLQotICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Ci19Ci0KLXN0YXRpYyBpbnQgcXRraXRfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQotewotICAgIENhcHR1cmVDb250ZXh0KiBjdHggPSAoQ2FwdHVyZUNvbnRleHQqKXMtPnByaXZfZGF0YTsKLQotICAgIGRvIHsKLSAgICAgICAgbG9ja19mcmFtZXMoY3R4KTsKLQotICAgICAgICBpZiAoY3R4LT5jdXJyZW50X2ZyYW1lICE9IG5pbCkgewotICAgICAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCAoaW50KUNWUGl4ZWxCdWZmZXJHZXREYXRhU2l6ZShjdHgtPmN1cnJlbnRfZnJhbWUpKSA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gYXZfcmVzY2FsZV9xKGF2X2dldHRpbWUoKSAtIGN0eC0+Zmlyc3RfcHRzLCBBVl9USU1FX0JBU0VfUSwga1FUS2l0VGltZUJhc2VfcSk7Ci0gICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7Ci0gICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKLQotICAgICAgICAgICAgQ1ZQaXhlbEJ1ZmZlckxvY2tCYXNlQWRkcmVzcyhjdHgtPmN1cnJlbnRfZnJhbWUsIDApOwotCi0gICAgICAgICAgICB2b2lkKiBkYXRhID0gQ1ZQaXhlbEJ1ZmZlckdldEJhc2VBZGRyZXNzKGN0eC0+Y3VycmVudF9mcmFtZSk7Ci0gICAgICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBkYXRhLCBwa3QtPnNpemUpOwotCi0gICAgICAgICAgICBDVlBpeGVsQnVmZmVyVW5sb2NrQmFzZUFkZHJlc3MoY3R4LT5jdXJyZW50X2ZyYW1lLCAwKTsKLSAgICAgICAgICAgIENWQnVmZmVyUmVsZWFzZShjdHgtPmN1cnJlbnRfZnJhbWUpOwotICAgICAgICAgICAgY3R4LT5jdXJyZW50X2ZyYW1lID0gbmlsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcGt0LT5kYXRhID0gTlVMTDsKLSAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZjdHgtPmZyYW1lX3dhaXRfY29uZCwgJmN0eC0+ZnJhbWVfbG9jayk7Ci0gICAgICAgIH0KLQotICAgICAgICB1bmxvY2tfZnJhbWVzKGN0eCk7Ci0gICAgfSB3aGlsZSAoIXBrdC0+ZGF0YSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBxdGtpdF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgQ2FwdHVyZUNvbnRleHQqIGN0eCA9IChDYXB0dXJlQ29udGV4dCopcy0+cHJpdl9kYXRhOwotCi0gICAgZGVzdHJveV9jb250ZXh0KGN0eCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKLSAgICB7ICJmcmFtZV9yYXRlIiwgInNldCBmcmFtZSByYXRlIiwgb2Zmc2V0b2YoQ2FwdHVyZUNvbnRleHQsIGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMzAuMCB9LCAwLjEsIDMwLjAsIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIE5VTEwgfSwKLSAgICB7ICJsaXN0X2RldmljZXMiLCAibGlzdCBhdmFpbGFibGUgZGV2aWNlcyIsIG9mZnNldG9mKENhcHR1cmVDb250ZXh0LCBsaXN0X2RldmljZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgImxpc3RfZGV2aWNlcyIgfSwKLSAgICB7ICJ0cnVlIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0sICJsaXN0X2RldmljZXMiIH0sCi0gICAgeyAiZmFsc2UiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSwgImxpc3RfZGV2aWNlcyIgfSwKLSAgICB7ICJ2aWRlb19kZXZpY2VfaW5kZXgiLCAic2VsZWN0IHZpZGVvIGRldmljZSBieSBpbmRleCBmb3IgZGV2aWNlcyB3aXRoIHNhbWUgbmFtZSAoc3RhcnRzIGF0IDApIiwgb2Zmc2V0b2YoQ2FwdHVyZUNvbnRleHQsIHZpZGVvX2RldmljZV9pbmRleCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAotICAgIHsgTlVMTCB9LAotfTsKLQotc3RhdGljIGNvbnN0IEFWQ2xhc3MgcXRraXRfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiUVRLaXQgaW5wdXQgZGV2aWNlIiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKLSAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLSAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCwKLX07Ci0KLUFWSW5wdXRGb3JtYXQgZmZfcXRraXRfZGVtdXhlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgPSAicXRraXQiLAotICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJRVEtpdCBpbnB1dCBkZXZpY2UiKSwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQ2FwdHVyZUNvbnRleHQpLAotICAgIC5yZWFkX2hlYWRlciAgICA9IHF0a2l0X3JlYWRfaGVhZGVyLAotICAgIC5yZWFkX3BhY2tldCAgICA9IHF0a2l0X3JlYWRfcGFja2V0LAotICAgIC5yZWFkX2Nsb3NlICAgICA9IHF0a2l0X2Nsb3NlLAotICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSwKLSAgICAucHJpdl9jbGFzcyAgICAgPSAmcXRraXRfY2xhc3MsCi19OwpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvcmV2ZXJzZS5jIGIvbGliYXZkZXZpY2UvcmV2ZXJzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MGJhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmRldmljZS9yZXZlcnNlLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgImxpYmF2dXRpbC9yZXZlcnNlLmMiCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS9zZGwuYyBiL2xpYmF2ZGV2aWNlL3NkbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2NjZmU1Li4wMDAwMDAwCi0tLSBhL2xpYmF2ZGV2aWNlL3NkbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU3RlZmFubyBTYWJhdGluaQotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0vKioKLSAqIEBmaWxlCi0gKiBsaWJTREwgb3V0cHV0IGRldmljZQotICovCi0KLSNpbmNsdWRlIDxTREwuaD4KLSNpbmNsdWRlIDxTRExfdGhyZWFkLmg+Ci0KLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCi0jaW5jbHVkZSAiYXZkZXZpY2UuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIEFWQ2xhc3MgKmNsYXNzOwotICAgIFNETF9TdXJmYWNlICpzdXJmYWNlOwotICAgIFNETF9PdmVybGF5ICpvdmVybGF5OwotICAgIGNoYXIgKndpbmRvd190aXRsZTsKLSAgICBjaGFyICppY29uX3RpdGxlOwotICAgIGludCB3aW5kb3dfd2lkdGgsICB3aW5kb3dfaGVpZ2h0OyAgLyoqPCBzaXplIG9mIHRoZSB3aW5kb3cgKi8KLSAgICBpbnQgd2luZG93X2Z1bGxzY3JlZW47Ci0KLSAgICBTRExfUmVjdCBvdmVybGF5X3JlY3Q7Ci0gICAgaW50IG92ZXJsYXlfZm10OwotCi0gICAgaW50IHNkbF93YXNfYWxyZWFkeV9pbml0ZWQ7Ci0gICAgU0RMX1RocmVhZCAqZXZlbnRfdGhyZWFkOwotICAgIFNETF9tdXRleCAqbXV0ZXg7Ci0gICAgU0RMX2NvbmQgKmluaXRfY29uZDsKLSAgICBpbnQgaW5pdF9yZXQ7IC8qIHJldHVybiBjb2RlIHVzZWQgdG8gc2lnbmFsIGluaXRpYWxpemF0aW9uIGVycm9ycyAqLwotICAgIGludCBpbml0ZWQ7Ci0gICAgaW50IHF1aXQ7Ci19IFNETENvbnRleHQ7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RsX292ZXJsYXlfcGl4X2ZtdF9lbnRyeSB7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7IGludCBvdmVybGF5X2ZtdDsKLX0gc2RsX292ZXJsYXlfcGl4X2ZtdF9tYXBbXSA9IHsKLSAgICB7IEFWX1BJWF9GTVRfWVVWNDIwUCwgU0RMX0lZVVZfT1ZFUkxBWSB9LAotICAgIHsgQVZfUElYX0ZNVF9ZVVlWNDIyLCBTRExfWVVZMl9PVkVSTEFZIH0sCi0gICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIFNETF9VWVZZX09WRVJMQVkgfSwKLSAgICB7IEFWX1BJWF9GTVRfTk9ORSwgICAgMCAgICAgICAgICAgICAgICB9LAotfTsKLQotc3RhdGljIGludCBzZGxfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgU0RMQ29udGV4dCAqc2RsID0gcy0+cHJpdl9kYXRhOwotCi0gICAgc2RsLT5xdWl0ID0gMTsKLQotICAgIGlmIChzZGwtPm92ZXJsYXkpCi0gICAgICAgIFNETF9GcmVlWVVWT3ZlcmxheShzZGwtPm92ZXJsYXkpOwotICAgIHNkbC0+b3ZlcmxheSA9IE5VTEw7Ci0gICAgaWYgKHNkbC0+ZXZlbnRfdGhyZWFkKQotICAgICAgICBTRExfV2FpdFRocmVhZChzZGwtPmV2ZW50X3RocmVhZCwgTlVMTCk7Ci0gICAgc2RsLT5ldmVudF90aHJlYWQgPSBOVUxMOwotICAgIGlmIChzZGwtPm11dGV4KQotICAgICAgICBTRExfRGVzdHJveU11dGV4KHNkbC0+bXV0ZXgpOwotICAgIHNkbC0+bXV0ZXggPSBOVUxMOwotICAgIGlmIChzZGwtPmluaXRfY29uZCkKLSAgICAgICAgU0RMX0Rlc3Ryb3lDb25kKHNkbC0+aW5pdF9jb25kKTsKLSAgICBzZGwtPmluaXRfY29uZCA9IE5VTEw7Ci0KLSAgICBpZiAoIXNkbC0+c2RsX3dhc19hbHJlYWR5X2luaXRlZCkKLSAgICAgICAgU0RMX1F1aXQoKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjb21wdXRlX292ZXJsYXlfcmVjdChBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgQVZSYXRpb25hbCBzYXIsIGRhcjsgLyogc2FtcGxlIGFuZCBkaXNwbGF5IGFzcGVjdCByYXRpb3MgKi8KLSAgICBTRExDb250ZXh0ICpzZGwgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jY3R4ID0gc3QtPmNvZGVjOwotICAgIFNETF9SZWN0ICpvdmVybGF5X3JlY3QgPSAmc2RsLT5vdmVybGF5X3JlY3Q7Ci0KLSAgICAvKiBjb21wdXRlIG92ZXJsYXkgd2lkdGggYW5kIGhlaWdodCBmcm9tIHRoZSBjb2RlYyBjb250ZXh0IGluZm9ybWF0aW9uICovCi0gICAgc2FyID0gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gOiAoQVZSYXRpb25hbCl7IDEsIDEgfTsKLSAgICBkYXIgPSBhdl9tdWxfcShzYXIsIChBVlJhdGlvbmFsKXsgZW5jY3R4LT53aWR0aCwgZW5jY3R4LT5oZWlnaHQgfSk7Ci0KLSAgICAvKiB3ZSBzdXBwb3NlIHRoZSBzY3JlZW4gaGFzIGEgMS8xIHNhbXBsZSBhc3BlY3QgcmF0aW8gKi8KLSAgICBpZiAoc2RsLT53aW5kb3dfd2lkdGggJiYgc2RsLT53aW5kb3dfaGVpZ2h0KSB7Ci0gICAgICAgIC8qIGZpdCBpbiB0aGUgd2luZG93ICovCi0gICAgICAgIGlmIChhdl9jbXBfcShkYXIsIChBVlJhdGlvbmFsKXsgc2RsLT53aW5kb3dfd2lkdGgsIHNkbC0+d2luZG93X2hlaWdodCB9KSA+IDApIHsKLSAgICAgICAgICAgIC8qIGZpdCBpbiB3aWR0aCAqLwotICAgICAgICAgICAgb3ZlcmxheV9yZWN0LT53ID0gc2RsLT53aW5kb3dfd2lkdGg7Ci0gICAgICAgICAgICBvdmVybGF5X3JlY3QtPmggPSBhdl9yZXNjYWxlKG92ZXJsYXlfcmVjdC0+dywgZGFyLmRlbiwgZGFyLm51bSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBmaXQgaW4gaGVpZ2h0ICovCi0gICAgICAgICAgICBvdmVybGF5X3JlY3QtPmggPSBzZGwtPndpbmRvd19oZWlnaHQ7Ci0gICAgICAgICAgICBvdmVybGF5X3JlY3QtPncgPSBhdl9yZXNjYWxlKG92ZXJsYXlfcmVjdC0+aCwgZGFyLm51bSwgZGFyLmRlbik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoc2FyLm51bSA+IHNhci5kZW4pIHsKLSAgICAgICAgICAgIG92ZXJsYXlfcmVjdC0+dyA9IGVuY2N0eC0+d2lkdGg7Ci0gICAgICAgICAgICBvdmVybGF5X3JlY3QtPmggPSBhdl9yZXNjYWxlKG92ZXJsYXlfcmVjdC0+dywgZGFyLmRlbiwgZGFyLm51bSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvdmVybGF5X3JlY3QtPmggPSBlbmNjdHgtPmhlaWdodDsKLSAgICAgICAgICAgIG92ZXJsYXlfcmVjdC0+dyA9IGF2X3Jlc2NhbGUob3ZlcmxheV9yZWN0LT5oLCBkYXIubnVtLCBkYXIuZGVuKTsKLSAgICAgICAgfQotICAgICAgICBzZGwtPndpbmRvd193aWR0aCAgPSBvdmVybGF5X3JlY3QtPnc7Ci0gICAgICAgIHNkbC0+d2luZG93X2hlaWdodCA9IG92ZXJsYXlfcmVjdC0+aDsKLSAgICB9Ci0KLSAgICBvdmVybGF5X3JlY3QtPnggPSAoc2RsLT53aW5kb3dfd2lkdGggIC0gb3ZlcmxheV9yZWN0LT53KSAvIDI7Ci0gICAgb3ZlcmxheV9yZWN0LT55ID0gKHNkbC0+d2luZG93X2hlaWdodCAtIG92ZXJsYXlfcmVjdC0+aCkgLyAyOwotfQotCi0jZGVmaW5lIFNETF9CQVNFX0ZMQUdTIChTRExfU1dTVVJGQUNFfFNETF9SRVNJWkFCTEUpCi0KLXN0YXRpYyBpbnQgZXZlbnRfdGhyZWFkKHZvaWQgKmFyZykKLXsKLSAgICBBVkZvcm1hdENvbnRleHQgKnMgPSBhcmc7Ci0gICAgU0RMQ29udGV4dCAqc2RsID0gcy0+cHJpdl9kYXRhOwotICAgIGludCBmbGFncyA9IFNETF9CQVNFX0ZMQUdTIHwgKHNkbC0+d2luZG93X2Z1bGxzY3JlZW4gPyBTRExfRlVMTFNDUkVFTiA6IDApOwotICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07Ci0gICAgQVZDb2RlY0NvbnRleHQgKmVuY2N0eCA9IHN0LT5jb2RlYzsKLQotICAgIC8qIGluaXRpYWxpemF0aW9uICovCi0gICAgaWYgKFNETF9Jbml0KFNETF9JTklUX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTREw6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgIHNkbC0+aW5pdF9yZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIGdvdG8gaW5pdF9lbmQ7Ci0gICAgfQotCi0gICAgU0RMX1dNX1NldENhcHRpb24oc2RsLT53aW5kb3dfdGl0bGUsIHNkbC0+aWNvbl90aXRsZSk7Ci0gICAgc2RsLT5zdXJmYWNlID0gU0RMX1NldFZpZGVvTW9kZShzZGwtPndpbmRvd193aWR0aCwgc2RsLT53aW5kb3dfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIGZsYWdzKTsKLSAgICBpZiAoIXNkbC0+c3VyZmFjZSkgewotICAgICAgICBhdl9sb2coc2RsLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gc2V0IHZpZGVvIG1vZGU6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgIHNkbC0+aW5pdF9yZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIGdvdG8gaW5pdF9lbmQ7Ci0gICAgfQotCi0gICAgc2RsLT5vdmVybGF5ID0gU0RMX0NyZWF0ZVlVVk92ZXJsYXkoZW5jY3R4LT53aWR0aCwgZW5jY3R4LT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RsLT5vdmVybGF5X2ZtdCwgc2RsLT5zdXJmYWNlKTsKLSAgICBpZiAoIXNkbC0+b3ZlcmxheSB8fCBzZGwtPm92ZXJsYXktPnBpdGNoZXNbMF0gPCBlbmNjdHgtPndpZHRoKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiU0RMIGRvZXMgbm90IHN1cHBvcnQgYW4gb3ZlcmxheSB3aXRoIHNpemUgb2YgJWR4JWQgcGl4ZWxzXG4iLAotICAgICAgICAgICAgICAgZW5jY3R4LT53aWR0aCwgZW5jY3R4LT5oZWlnaHQpOwotICAgICAgICBzZGwtPmluaXRfcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBnb3RvIGluaXRfZW5kOwotICAgIH0KLQotICAgIHNkbC0+aW5pdF9yZXQgPSAwOwotICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgInc6JWQgaDolZCBmbXQ6JXMgLT4gdzolZCBoOiVkXG4iLAotICAgICAgICAgICBlbmNjdHgtPndpZHRoLCBlbmNjdHgtPmhlaWdodCwgYXZfZ2V0X3BpeF9mbXRfbmFtZShlbmNjdHgtPnBpeF9mbXQpLAotICAgICAgICAgICBzZGwtPm92ZXJsYXlfcmVjdC53LCBzZGwtPm92ZXJsYXlfcmVjdC5oKTsKLQotaW5pdF9lbmQ6Ci0gICAgU0RMX0xvY2tNdXRleChzZGwtPm11dGV4KTsKLSAgICBzZGwtPmluaXRlZCA9IDE7Ci0gICAgU0RMX1VubG9ja011dGV4KHNkbC0+bXV0ZXgpOwotICAgIFNETF9Db25kU2lnbmFsKHNkbC0+aW5pdF9jb25kKTsKLQotICAgIGlmIChzZGwtPmluaXRfcmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHNkbC0+aW5pdF9yZXQ7Ci0KLSAgICAvKiBldmVudCBsb29wICovCi0gICAgd2hpbGUgKCFzZGwtPnF1aXQpIHsKLSAgICAgICAgaW50IHJldDsKLSAgICAgICAgU0RMX0V2ZW50IGV2ZW50OwotICAgICAgICBTRExfUHVtcEV2ZW50cygpOwotICAgICAgICByZXQgPSBTRExfUGVlcEV2ZW50cygmZXZlbnQsIDEsIFNETF9HRVRFVkVOVCwgU0RMX0FMTEVWRU5UUyk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hlbiBnZXR0aW5nIFNETCBldmVudDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICAgICAgU0RMX0RlbGF5KDEwKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7Ci0gICAgICAgIGNhc2UgU0RMX0tFWURPV046Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleS5rZXlzeW0uc3ltKSB7Ci0gICAgICAgICAgICBjYXNlIFNETEtfRVNDQVBFOgotICAgICAgICAgICAgY2FzZSBTRExLX3E6Ci0gICAgICAgICAgICAgICAgc2RsLT5xdWl0ID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNETF9RVUlUOgotICAgICAgICAgICAgc2RsLT5xdWl0ID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0RMX1ZJREVPUkVTSVpFOgotICAgICAgICAgICAgc2RsLT53aW5kb3dfd2lkdGggID0gZXZlbnQucmVzaXplLnc7Ci0gICAgICAgICAgICBzZGwtPndpbmRvd19oZWlnaHQgPSBldmVudC5yZXNpemUuaDsKLQotICAgICAgICAgICAgU0RMX0xvY2tNdXRleChzZGwtPm11dGV4KTsKLSAgICAgICAgICAgIHNkbC0+c3VyZmFjZSA9IFNETF9TZXRWaWRlb01vZGUoc2RsLT53aW5kb3dfd2lkdGgsIHNkbC0+d2luZG93X2hlaWdodCwgMjQsIFNETF9CQVNFX0ZMQUdTKTsKLSAgICAgICAgICAgIGlmICghc2RsLT5zdXJmYWNlKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQgU0RMIHZpZGVvIG1vZGU6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgICAgICAgICAgc2RsLT5xdWl0ID0gMTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29tcHV0ZV9vdmVybGF5X3JlY3Qocyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTRExfVW5sb2NrTXV0ZXgoc2RsLT5tdXRleCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZGxfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKLXsKLSAgICBTRExDb250ZXh0ICpzZGwgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jY3R4ID0gc3QtPmNvZGVjOwotICAgIGludCBpLCByZXQ7Ci0KLSAgICBpZiAoIXNkbC0+d2luZG93X3RpdGxlKQotICAgICAgICBzZGwtPndpbmRvd190aXRsZSA9IGF2X3N0cmR1cChzLT5maWxlbmFtZSk7Ci0gICAgaWYgKCFzZGwtPmljb25fdGl0bGUpCi0gICAgICAgIHNkbC0+aWNvbl90aXRsZSA9IGF2X3N0cmR1cChzZGwtPndpbmRvd190aXRsZSk7Ci0KLSAgICBpZiAoU0RMX1dhc0luaXQoU0RMX0lOSVRfVklERU8pKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiU0RMIHZpZGVvIHN1YnN5c3RlbSB3YXMgYWxyZWFkeSBpbml0ZWQsIGFib3J0aW5nXG4iKTsKLSAgICAgICAgc2RsLT5zZGxfd2FzX2FscmVhZHlfaW5pdGVkID0gMTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgaWYgKCAgIHMtPm5iX3N0cmVhbXMgPiAxCi0gICAgICAgIHx8IGVuY2N0eC0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8KLSAgICAgICAgfHwgZW5jY3R4LT5jb2RlY19pZCAgICE9IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPbmx5IHN1cHBvcnRzIG9uZSByYXd2aWRlbyBzdHJlYW1cbiIpOwotICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBzZGxfb3ZlcmxheV9waXhfZm10X21hcFtpXS5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORTsgaSsrKSB7Ci0gICAgICAgIGlmIChzZGxfb3ZlcmxheV9waXhfZm10X21hcFtpXS5waXhfZm10ID09IGVuY2N0eC0+cGl4X2ZtdCkgewotICAgICAgICAgICAgc2RsLT5vdmVybGF5X2ZtdCA9IHNkbF9vdmVybGF5X3BpeF9mbXRfbWFwW2ldLm92ZXJsYXlfZm10OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIXNkbC0+b3ZlcmxheV9mbXQpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgJyVzJywgY2hvb3NlIG9uZSBvZiB5dXY0MjBwLCB5dXl2NDIyLCBvciB1eXZ5NDIyXG4iLAotICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShlbmNjdHgtPnBpeF9mbXQpKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgLyogY29tcHV0ZSBvdmVybGF5IHdpZHRoIGFuZCBoZWlnaHQgZnJvbSB0aGUgY29kZWMgY29udGV4dCBpbmZvcm1hdGlvbiAqLwotICAgIGNvbXB1dGVfb3ZlcmxheV9yZWN0KHMpOwotCi0gICAgc2RsLT5pbml0X2NvbmQgPSBTRExfQ3JlYXRlQ29uZCgpOwotICAgIGlmICghc2RsLT5pbml0X2NvbmQpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgU0RMIGNvbmRpdGlvbiB2YXJpYWJsZTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBzZGwtPm11dGV4ID0gU0RMX0NyZWF0ZU11dGV4KCk7Ci0gICAgaWYgKCFzZGwtPm11dGV4KSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIFNETCBtdXRleDogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBzZGwtPmV2ZW50X3RocmVhZCA9IFNETF9DcmVhdGVUaHJlYWQoZXZlbnRfdGhyZWFkLCBzKTsKLSAgICBpZiAoIXNkbC0+ZXZlbnRfdGhyZWFkKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIFNETCBldmVudCB0aHJlYWQ6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICAvKiB3YWl0IHVudGlsIHRoZSB2aWRlbyBzeXN0ZW0gaGFzIGJlZW4gaW5pdGVkICovCi0gICAgU0RMX0xvY2tNdXRleChzZGwtPm11dGV4KTsKLSAgICB3aGlsZSAoIXNkbC0+aW5pdGVkKSB7Ci0gICAgICAgIFNETF9Db25kV2FpdChzZGwtPmluaXRfY29uZCwgc2RsLT5tdXRleCk7Ci0gICAgfQotICAgIFNETF9VbmxvY2tNdXRleChzZGwtPm11dGV4KTsKLSAgICBpZiAoc2RsLT5pbml0X3JldCA8IDApIHsKLSAgICAgICAgcmV0ID0gc2RsLT5pbml0X3JldDsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICByZXR1cm4gMDsKLQotZmFpbDoKLSAgICBzZGxfd3JpdGVfdHJhaWxlcihzKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNkbF93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQotewotICAgIFNETENvbnRleHQgKnNkbCA9IHMtPnByaXZfZGF0YTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jY3R4ID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7Ci0gICAgdWludDhfdCAqZGF0YVs0XTsKLSAgICBpbnQgbGluZXNpemVbNF07Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoc2RsLT5xdWl0KSB7Ci0gICAgICAgIHNkbF93cml0ZV90cmFpbGVyKHMpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgIH0KLSAgICBhdl9pbWFnZV9maWxsX2FycmF5cyhkYXRhLCBsaW5lc2l6ZSwgcGt0LT5kYXRhLCBlbmNjdHgtPnBpeF9mbXQsIGVuY2N0eC0+d2lkdGgsIGVuY2N0eC0+aGVpZ2h0LCAxKTsKLQotICAgIFNETF9Mb2NrTXV0ZXgoc2RsLT5tdXRleCk7Ci0gICAgU0RMX0ZpbGxSZWN0KHNkbC0+c3VyZmFjZSwgJnNkbC0+c3VyZmFjZS0+Y2xpcF9yZWN0LAotICAgICAgICAgICAgICAgICBTRExfTWFwUkdCKHNkbC0+c3VyZmFjZS0+Zm9ybWF0LCAwLCAwLCAwKSk7Ci0gICAgU0RMX0xvY2tZVVZPdmVybGF5KHNkbC0+b3ZlcmxheSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICBzZGwtPm92ZXJsYXktPnBpeGVscyBbaV0gPSBkYXRhICAgIFtpXTsKLSAgICAgICAgc2RsLT5vdmVybGF5LT5waXRjaGVzW2ldID0gbGluZXNpemVbaV07Ci0gICAgfQotICAgIFNETF9EaXNwbGF5WVVWT3ZlcmxheShzZGwtPm92ZXJsYXksICZzZGwtPm92ZXJsYXlfcmVjdCk7Ci0gICAgU0RMX1VubG9ja1lVVk92ZXJsYXkoc2RsLT5vdmVybGF5KTsKLQotICAgIFNETF9VcGRhdGVSZWN0KHNkbC0+c3VyZmFjZSwKLSAgICAgICAgICAgICAgICAgICBzZGwtPm92ZXJsYXlfcmVjdC54LCBzZGwtPm92ZXJsYXlfcmVjdC55LAotICAgICAgICAgICAgICAgICAgIHNkbC0+b3ZlcmxheV9yZWN0LncsIHNkbC0+b3ZlcmxheV9yZWN0LmgpOwotICAgIFNETF9VbmxvY2tNdXRleChzZGwtPm11dGV4KTsKLQotICAgIHJldHVybiAwOwotfQotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTRExDb250ZXh0LHgpCi0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7Ci0gICAgeyAid2luZG93X3RpdGxlIiwgInNldCBTREwgd2luZG93IHRpdGxlIiwgICAgICAgICAgIE9GRlNFVCh3aW5kb3dfdGl0bGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKLSAgICB7ICJpY29uX3RpdGxlIiwgICAic2V0IFNETCBpY29uaWZpZWQgd2luZG93IHRpdGxlIiwgT0ZGU0VUKGljb25fdGl0bGUpICAsIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAotICAgIHsgIndpbmRvd19zaXplIiwgICJzZXQgU0RMIHdpbmRvdyBmb3JjZWQgc2l6ZSIsICAgICBPRkZTRVQod2luZG93X3dpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAotICAgIHsgIndpbmRvd19mdWxsc2NyZWVuIiwgInNldCBTREwgd2luZG93IGZ1bGxzY3JlZW4iLCBPRkZTRVQod2luZG93X2Z1bGxzY3JlZW4pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKLSAgICB7IE5VTEwgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBBVkNsYXNzIHNkbF9jbGFzcyA9IHsKLSAgICAuY2xhc3NfbmFtZSA9ICJzZGwgb3V0ZGV2IiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKLSAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLSAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19PVVRQVVQsCi19OwotCi1BVk91dHB1dEZvcm1hdCBmZl9zZGxfbXV4ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gInNkbCIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNETCBvdXRwdXQgZGV2aWNlIiksCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNETENvbnRleHQpLAotICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX05PTkUsCi0gICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCi0gICAgLndyaXRlX2hlYWRlciAgID0gc2RsX3dyaXRlX2hlYWRlciwKLSAgICAud3JpdGVfcGFja2V0ICAgPSBzZGxfd3JpdGVfcGFja2V0LAotICAgIC53cml0ZV90cmFpbGVyICA9IHNkbF93cml0ZV90cmFpbGVyLAotICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSB8IEFWRk1UX1ZBUklBQkxFX0ZQUyB8IEFWRk1UX05PVElNRVNUQU1QUywKLSAgICAucHJpdl9jbGFzcyAgICAgPSAmc2RsX2NsYXNzLAotfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL3NkbDIuYyBiL2xpYmF2ZGV2aWNlL3NkbDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGVkOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZkZXZpY2Uvc2RsMi5jCkBAIC0wLDAgKzEsMzY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEpvc2ggZGUgS29jaworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBsaWJTREwyIG91dHB1dCBkZXZpY2UKKyAqLworCisjaW5jbHVkZSA8U0RMLmg+CisjaW5jbHVkZSA8U0RMX3RocmVhZC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImF2ZGV2aWNlLmgiCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBTRExfV2luZG93ICp3aW5kb3c7CisgICAgU0RMX1JlbmRlcmVyICpyZW5kZXJlcjsKKyAgICBjaGFyICp3aW5kb3dfdGl0bGU7CisgICAgaW50IHdpbmRvd193aWR0aCwgd2luZG93X2hlaWdodDsgIC8qKjwgc2l6ZSBvZiB0aGUgd2luZG93ICovCisgICAgaW50IHdpbmRvd19mdWxsc2NyZWVuOworICAgIGludCB3aW5kb3dfYm9yZGVybGVzczsKKworICAgIFNETF9UZXh0dXJlICp0ZXh0dXJlOworICAgIGludCB0ZXh0dXJlX2ZtdDsKKyAgICBTRExfUmVjdCB0ZXh0dXJlX3JlY3Q7CisKKyAgICBpbnQgaW5pdGVkOworfSBTRExDb250ZXh0OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkbF90ZXh0dXJlX2Zvcm1hdF9lbnRyeSB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdDsgaW50IHRleHR1cmVfZm10OworfSBzZGxfdGV4dHVyZV9mb3JtYXRfbWFwW10gPSB7CisgICAgLyoKKyAgICAgKiBOb3QgaW1wbGVtZW50ZWQgaW4gRkZtcGVnLCBidXQgbGVhdmluZyBoZXJlIGZvciBjb21wbGV0ZW5lc3MuCisgICAgICogeyBBVl9QSVhfRk1UX05PTkUsIFNETF9QSVhFTEZPUk1BVF9BUkdCNDQ0NCB9LAorICAgICAqIHsgQVZfUElYX0ZNVF9OT05FLCBTRExfUElYRUxGT1JNQVRfUkdCQTQ0NDQgfSwKKyAgICAgKiB7IEFWX1BJWF9GTVRfTk9ORSwgU0RMX1BJWEVMRk9STUFUX0FCR1I0NDQ0IH0sCisgICAgICogeyBBVl9QSVhfRk1UX05PTkUsIFNETF9QSVhFTEZPUk1BVF9CR1JBNDQ0NCB9LAorICAgICAqIHsgQVZfUElYX0ZNVF9OT05FLCBTRExfUElYRUxGT1JNQVRfQVJHQjE1NTUgfSwKKyAgICAgKiB7IEFWX1BJWF9GTVRfTk9ORSwgU0RMX1BJWEVMRk9STUFUX1JHQkE1NTUxIH0sCisgICAgICogeyBBVl9QSVhfRk1UX05PTkUsIFNETF9QSVhFTEZPUk1BVF9BQkdSMTU1NSB9LAorICAgICAqIHsgQVZfUElYX0ZNVF9OT05FLCBTRExfUElYRUxGT1JNQVRfQkdSQTU1NTEgfSwKKyAgICAgKiB7IEFWX1BJWF9GTVRfTk9ORSwgU0RMX1BJWEVMRk9STUFUX0FSR0IyMTAxMDEwIH0sCisgICAgKi8KKyAgICB7IEFWX1BJWF9GTVRfUkdCOCwgICAgU0RMX1BJWEVMRk9STUFUX1JHQjMzMiB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I0NDQsICBTRExfUElYRUxGT1JNQVRfUkdCNDQ0IH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjU1NSwgIFNETF9QSVhFTEZPUk1BVF9SR0I1NTUgfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSNTU1LCAgU0RMX1BJWEVMRk9STUFUX0JHUjU1NSB9LAorICAgIHsgQVZfUElYX0ZNVF9SR0I1NjUsICBTRExfUElYRUxGT1JNQVRfUkdCNTY1IH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjU2NSwgIFNETF9QSVhFTEZPUk1BVF9CR1I1NjUgfSwKKyAgICB7IEFWX1BJWF9GTVRfUkdCMjQsICAgU0RMX1BJWEVMRk9STUFUX1JHQjI0IH0sCisgICAgeyBBVl9QSVhfRk1UX0JHUjI0LCAgIFNETF9QSVhFTEZPUk1BVF9CR1IyNCB9LAorICAgIHsgQVZfUElYX0ZNVF8wUkdCMzIsICBTRExfUElYRUxGT1JNQVRfUkdCODg4IH0sCisgICAgeyBBVl9QSVhfRk1UXzBCR1IzMiwgIFNETF9QSVhFTEZPUk1BVF9CR1I4ODggfSwKKyNpZiBIQVZFX0JJR0VORElBTgorICAgIHsgQVZfUElYX0ZNVF9SR0IwLCAgICBTRExfUElYRUxGT1JNQVRfUkdCWDg4ODggfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSMCwgICAgU0RMX1BJWEVMRk9STUFUX0JHUlg4ODg4IH0sCisjZWxzZQorICAgIHsgQVZfUElYX0ZNVF8wQkdSLCAgICBTRExfUElYRUxGT1JNQVRfUkdCWDg4ODggfSwKKyAgICB7IEFWX1BJWF9GTVRfMFJHQiwgICAgU0RMX1BJWEVMRk9STUFUX0JHUlg4ODg4IH0sCisjZW5kaWYKKyAgICB7IEFWX1BJWF9GTVRfUkdCMzIsICAgU0RMX1BJWEVMRk9STUFUX0FSR0I4ODg4IH0sCisgICAgeyBBVl9QSVhfRk1UX1JHQjMyXzEsIFNETF9QSVhFTEZPUk1BVF9SR0JBODg4OCB9LAorICAgIHsgQVZfUElYX0ZNVF9CR1IzMiwgICBTRExfUElYRUxGT1JNQVRfQUJHUjg4ODggfSwKKyAgICB7IEFWX1BJWF9GTVRfQkdSMzJfMSwgU0RMX1BJWEVMRk9STUFUX0JHUkE4ODg4IH0sCisgICAgeyBBVl9QSVhfRk1UX1lVVjQyMFAsIFNETF9QSVhFTEZPUk1BVF9JWVVWIH0sCisgICAgeyBBVl9QSVhfRk1UX1lVWVY0MjIsIFNETF9QSVhFTEZPUk1BVF9ZVVkyIH0sCisgICAgeyBBVl9QSVhfRk1UX1VZVlk0MjIsIFNETF9QSVhFTEZPUk1BVF9VWVZZIH0sCisgICAgeyBBVl9QSVhfRk1UX05PTkUsICAgIDAgICAgICAgICAgICAgICAgfSwKK307CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfdGV4dHVyZV9yZWN0KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlJhdGlvbmFsIHNhciwgZGFyOyAvKiBzYW1wbGUgYW5kIGRpc3BsYXkgYXNwZWN0IHJhdGlvcyAqLworICAgIFNETENvbnRleHQgKnNkbCA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpjb2RlY3BhciA9IHN0LT5jb2RlY3BhcjsKKyAgICBTRExfUmVjdCAqdGV4dHVyZV9yZWN0ID0gJnNkbC0+dGV4dHVyZV9yZWN0OworCisgICAgLyogY29tcHV0ZSB0ZXh0dXJlIHdpZHRoIGFuZCBoZWlnaHQgZnJvbSB0aGUgY29kZWMgY29udGV4dCBpbmZvcm1hdGlvbiAqLworICAgIHNhciA9IHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA/IHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvIDogKEFWUmF0aW9uYWwpeyAxLCAxIH07CisgICAgZGFyID0gYXZfbXVsX3Eoc2FyLCAoQVZSYXRpb25hbCl7IGNvZGVjcGFyLT53aWR0aCwgY29kZWNwYXItPmhlaWdodCB9KTsKKworICAgIC8qIHdlIHN1cHBvc2UgdGhlIHNjcmVlbiBoYXMgYSAxLzEgc2FtcGxlIGFzcGVjdCByYXRpbyAqLworICAgIGlmIChzZGwtPndpbmRvd193aWR0aCAmJiBzZGwtPndpbmRvd19oZWlnaHQpIHsKKyAgICAgICAgLyogZml0IGluIHRoZSB3aW5kb3cgKi8KKyAgICAgICAgaWYgKGF2X2NtcF9xKGRhciwgKEFWUmF0aW9uYWwpeyBzZGwtPndpbmRvd193aWR0aCwgc2RsLT53aW5kb3dfaGVpZ2h0IH0pID4gMCkgeworICAgICAgICAgICAgLyogZml0IGluIHdpZHRoICovCisgICAgICAgICAgICB0ZXh0dXJlX3JlY3QtPncgPSBzZGwtPndpbmRvd193aWR0aDsKKyAgICAgICAgICAgIHRleHR1cmVfcmVjdC0+aCA9IGF2X3Jlc2NhbGUodGV4dHVyZV9yZWN0LT53LCBkYXIuZGVuLCBkYXIubnVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGZpdCBpbiBoZWlnaHQgKi8KKyAgICAgICAgICAgIHRleHR1cmVfcmVjdC0+aCA9IHNkbC0+d2luZG93X2hlaWdodDsKKyAgICAgICAgICAgIHRleHR1cmVfcmVjdC0+dyA9IGF2X3Jlc2NhbGUodGV4dHVyZV9yZWN0LT5oLCBkYXIubnVtLCBkYXIuZGVuKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzYXIubnVtID4gc2FyLmRlbikgeworICAgICAgICAgICAgdGV4dHVyZV9yZWN0LT53ID0gY29kZWNwYXItPndpZHRoOworICAgICAgICAgICAgdGV4dHVyZV9yZWN0LT5oID0gYXZfcmVzY2FsZSh0ZXh0dXJlX3JlY3QtPncsIGRhci5kZW4sIGRhci5udW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGV4dHVyZV9yZWN0LT5oID0gY29kZWNwYXItPmhlaWdodDsKKyAgICAgICAgICAgIHRleHR1cmVfcmVjdC0+dyA9IGF2X3Jlc2NhbGUodGV4dHVyZV9yZWN0LT5oLCBkYXIubnVtLCBkYXIuZGVuKTsKKyAgICAgICAgfQorICAgICAgICBzZGwtPndpbmRvd193aWR0aCAgPSB0ZXh0dXJlX3JlY3QtPnc7CisgICAgICAgIHNkbC0+d2luZG93X2hlaWdodCA9IHRleHR1cmVfcmVjdC0+aDsKKyAgICB9CisKKyAgICB0ZXh0dXJlX3JlY3QtPnggPSAoc2RsLT53aW5kb3dfd2lkdGggIC0gdGV4dHVyZV9yZWN0LT53KSAvIDI7CisgICAgdGV4dHVyZV9yZWN0LT55ID0gKHNkbC0+d2luZG93X2hlaWdodCAtIHRleHR1cmVfcmVjdC0+aCkgLyAyOworfQorCitzdGF0aWMgaW50IHNkbDJfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU0RMQ29udGV4dCAqc2RsID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHNkbC0+dGV4dHVyZSkKKyAgICAgICAgU0RMX0Rlc3Ryb3lUZXh0dXJlKHNkbC0+dGV4dHVyZSk7CisgICAgc2RsLT50ZXh0dXJlID0gTlVMTDsKKworICAgIGlmIChzZGwtPnJlbmRlcmVyKQorICAgICAgICBTRExfRGVzdHJveVJlbmRlcmVyKHNkbC0+cmVuZGVyZXIpOworICAgIHNkbC0+cmVuZGVyZXIgPSBOVUxMOworCisgICAgaWYgKHNkbC0+d2luZG93KQorICAgICAgICBTRExfRGVzdHJveVdpbmRvdyhzZGwtPndpbmRvdyk7CisgICAgc2RsLT53aW5kb3cgPSBOVUxMOworCisgICAgaWYgKCFzZGwtPmluaXRlZCkKKyAgICAgICAgU0RMX1F1aXQoKTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIFNETF9CQVNFX0ZMQUdTIChTRExfU1dTVVJGQUNFfFNETF9XSU5ET1dfUkVTSVpBQkxFKQorCitzdGF0aWMgaW50IHNkbDJfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTRExDb250ZXh0ICpzZGwgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqY29kZWNwYXIgPSBzdC0+Y29kZWNwYXI7CisgICAgaW50IGksIHJldCA9IDA7CisgICAgaW50IGZsYWdzICA9IDA7CisKKyAgICBpZiAoIXNkbC0+d2luZG93X3RpdGxlKQorICAgICAgICBzZGwtPndpbmRvd190aXRsZSA9IGF2X3N0cmR1cChzLT51cmwpOworCisgICAgaWYgKFNETF9XYXNJbml0KFNETF9JTklUX1ZJREVPKSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiU0RMIHZpZGVvIHN1YnN5c3RlbSB3YXMgYWxyZWFkeSBpbml0ZWQsIHlvdSBjb3VsZCBoYXZlIG11bHRpcGxlIFNETCBvdXRwdXRzLiBUaGlzIG1heSBjYXVzZSB1bmtub3duIGJlaGF2aW91ci5cbiIpOworICAgICAgICBzZGwtPmluaXRlZCA9IDE7CisgICAgfQorCisgICAgaWYgKCAgIHMtPm5iX3N0cmVhbXMgPiAxCisgICAgICAgIHx8IGNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTworICAgICAgICB8fCBjb2RlY3Bhci0+Y29kZWNfaWQgICAhPSBBVl9DT0RFQ19JRF9SQVdWSURFTykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBzdXBwb3J0cyBvbmUgcmF3dmlkZW8gc3RyZWFtXG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IHNkbF90ZXh0dXJlX2Zvcm1hdF9tYXBbaV0uZm9ybWF0ICE9IEFWX1BJWF9GTVRfTk9ORTsgaSsrKSB7CisgICAgICAgIGlmIChzZGxfdGV4dHVyZV9mb3JtYXRfbWFwW2ldLmZvcm1hdCA9PSBjb2RlY3Bhci0+Zm9ybWF0KSB7CisgICAgICAgICAgICBzZGwtPnRleHR1cmVfZm10ID0gc2RsX3RleHR1cmVfZm9ybWF0X21hcFtpXS50ZXh0dXJlX2ZtdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzZGwtPnRleHR1cmVfZm10KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ICclcycuXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjb2RlY3Bhci0+Zm9ybWF0KSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiByZXNpemUgdGV4dHVyZSB0byB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gdGhlIGNvZGVjIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KKyAgICBmbGFncyA9IFNETF9CQVNFX0ZMQUdTIHwgKHNkbC0+d2luZG93X2Z1bGxzY3JlZW4gPyBTRExfV0lORE9XX0ZVTExTQ1JFRU4gOiAwKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZGwtPndpbmRvd19ib3JkZXJsZXNzID8gU0RMX1dJTkRPV19CT1JERVJMRVNTIDogMCk7CisKKyAgICAvKiBpbml0aWFsaXphdGlvbiAqLworICAgIGlmICghc2RsLT5pbml0ZWQpeworICAgICAgICBpZiAoU0RMX0luaXQoU0RMX0lOSVRfVklERU8pICE9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBTREw6ICVzXG4iLCBTRExfR2V0RXJyb3IoKSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzZGwtPndpbmRvd193aWR0aCA9IHNkbC0+dGV4dHVyZV9yZWN0LncgPSBjb2RlY3Bhci0+d2lkdGg7CisgICAgc2RsLT53aW5kb3dfaGVpZ2h0ID0gc2RsLT50ZXh0dXJlX3JlY3QuaCA9IGNvZGVjcGFyLT5oZWlnaHQ7CisgICAgc2RsLT50ZXh0dXJlX3JlY3QueCA9IHNkbC0+dGV4dHVyZV9yZWN0LnkgPSAwOworCisgICAgaWYgKFNETF9DcmVhdGVXaW5kb3dBbmRSZW5kZXJlcihzZGwtPndpbmRvd193aWR0aCwgc2RsLT53aW5kb3dfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZGwtPndpbmRvdywgJnNkbC0+cmVuZGVyZXIpICE9IDApeworICAgICAgICBhdl9sb2coc2RsLCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCBjcmVhdGUgd2luZG93IGFuZCByZW5kZXJlcjogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIFNETF9TZXRXaW5kb3dUaXRsZShzZGwtPndpbmRvdywgc2RsLT53aW5kb3dfdGl0bGUpOworCisgICAgc2RsLT50ZXh0dXJlID0gU0RMX0NyZWF0ZVRleHR1cmUoc2RsLT5yZW5kZXJlciwgc2RsLT50ZXh0dXJlX2ZtdCwgU0RMX1RFWFRVUkVBQ0NFU1NfU1RSRUFNSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkbC0+d2luZG93X3dpZHRoLCBzZGwtPndpbmRvd19oZWlnaHQpOworCisgICAgaWYgKCFzZGwtPnRleHR1cmUpIHsKKyAgICAgICAgYXZfbG9nKHNkbCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNldCBjcmVhdGUgbW9kZTogJXNcbiIsIFNETF9HZXRFcnJvcigpKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgInc6JWQgaDolZCBmbXQ6JXMgLT4gdzolZCBoOiVkXG4iLAorICAgICAgICAgICBjb2RlY3Bhci0+d2lkdGgsIGNvZGVjcGFyLT5oZWlnaHQsIGF2X2dldF9waXhfZm10X25hbWUoY29kZWNwYXItPmZvcm1hdCksCisgICAgICAgICAgIHNkbC0+d2luZG93X3dpZHRoLCBzZGwtPndpbmRvd19oZWlnaHQpOworCisgICAgc2RsLT5pbml0ZWQgPSAxOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIHNkbDJfd3JpdGVfdHJhaWxlcihzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNkbDJfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0LCBxdWl0ID0gMDsKKyAgICBTRExDb250ZXh0ICpzZGwgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmNvZGVjcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisgICAgdWludDhfdCAqZGF0YVs0XTsKKyAgICBpbnQgbGluZXNpemVbNF07CisKKyAgICBTRExfRXZlbnQgZXZlbnQ7CisgICAgaWYgKFNETF9Qb2xsRXZlbnQoJmV2ZW50KSl7CisgICAgICAgIHN3aXRjaCAoZXZlbnQudHlwZSkgeworICAgICAgICBjYXNlIFNETF9LRVlET1dOOgorICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXkua2V5c3ltLnN5bSkgeworICAgICAgICAgICAgY2FzZSBTRExLX0VTQ0FQRToKKyAgICAgICAgICAgIGNhc2UgU0RMS19xOgorICAgICAgICAgICAgICAgIHF1aXQgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNETF9RVUlUOgorICAgICAgICAgICAgcXVpdCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTRExfV0lORE9XRVZFTlQ6CisgICAgICAgICAgICBzd2l0Y2goZXZlbnQud2luZG93LmV2ZW50KXsKKyAgICAgICAgICAgIGNhc2UgU0RMX1dJTkRPV0VWRU5UX1JFU0laRUQ6CisgICAgICAgICAgICBjYXNlIFNETF9XSU5ET1dFVkVOVF9TSVpFX0NIQU5HRUQ6CisgICAgICAgICAgICAgICAgc2RsLT53aW5kb3dfd2lkdGggID0gZXZlbnQud2luZG93LmRhdGExOworICAgICAgICAgICAgICAgIHNkbC0+d2luZG93X2hlaWdodCA9IGV2ZW50LndpbmRvdy5kYXRhMjsKKyAgICAgICAgICAgICAgICBjb21wdXRlX3RleHR1cmVfcmVjdChzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHF1aXQpIHsKKyAgICAgICAgc2RsMl93cml0ZV90cmFpbGVyKHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGF2X2ltYWdlX2ZpbGxfYXJyYXlzKGRhdGEsIGxpbmVzaXplLCBwa3QtPmRhdGEsIGNvZGVjcGFyLT5mb3JtYXQsIGNvZGVjcGFyLT53aWR0aCwgY29kZWNwYXItPmhlaWdodCwgMSk7CisgICAgc3dpdGNoIChzZGwtPnRleHR1cmVfZm10KSB7CisgICAgLyogY2FzZSBTRExfUElYRUxGT1JNQVRfQVJHQjQ0NDQ6CisgICAgICogY2FzZSBTRExfUElYRUxGT1JNQVRfUkdCQTQ0NDQ6CisgICAgICogY2FzZSBTRExfUElYRUxGT1JNQVRfQUJHUjQ0NDQ6CisgICAgICogY2FzZSBTRExfUElYRUxGT1JNQVRfQkdSQTQ0NDQ6CisgICAgICogY2FzZSBTRExfUElYRUxGT1JNQVRfQVJHQjE1NTU6CisgICAgICogY2FzZSBTRExfUElYRUxGT1JNQVRfUkdCQTU1NTE6CisgICAgICogY2FzZSBTRExfUElYRUxGT1JNQVRfQUJHUjE1NTU6CisgICAgICogY2FzZSBTRExfUElYRUxGT1JNQVRfQkdSQTU1NTE6CisgICAgICogY2FzZSBTRExfUElYRUxGT1JNQVRfQVJHQjIxMDEwMTA6CisgICAgICovCisgICAgY2FzZSBTRExfUElYRUxGT1JNQVRfSVlVVjoKKyAgICBjYXNlIFNETF9QSVhFTEZPUk1BVF9ZVVkyOgorICAgIGNhc2UgU0RMX1BJWEVMRk9STUFUX1VZVlk6CisgICAgICAgIHJldCA9IFNETF9VcGRhdGVZVVZUZXh0dXJlKHNkbC0+dGV4dHVyZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXSwgbGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0sIGxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzJdLCBsaW5lc2l6ZVsyXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0RMX1BJWEVMRk9STUFUX1JHQjMzMjoKKyAgICBjYXNlIFNETF9QSVhFTEZPUk1BVF9SR0I0NDQ6CisgICAgY2FzZSBTRExfUElYRUxGT1JNQVRfUkdCNTU1OgorICAgIGNhc2UgU0RMX1BJWEVMRk9STUFUX0JHUjU1NToKKyAgICBjYXNlIFNETF9QSVhFTEZPUk1BVF9SR0I1NjU6CisgICAgY2FzZSBTRExfUElYRUxGT1JNQVRfQkdSNTY1OgorICAgIGNhc2UgU0RMX1BJWEVMRk9STUFUX1JHQjI0OgorICAgIGNhc2UgU0RMX1BJWEVMRk9STUFUX0JHUjI0OgorICAgIGNhc2UgU0RMX1BJWEVMRk9STUFUX1JHQjg4ODoKKyAgICBjYXNlIFNETF9QSVhFTEZPUk1BVF9SR0JYODg4ODoKKyAgICBjYXNlIFNETF9QSVhFTEZPUk1BVF9CR1I4ODg6CisgICAgY2FzZSBTRExfUElYRUxGT1JNQVRfQkdSWDg4ODg6CisgICAgY2FzZSBTRExfUElYRUxGT1JNQVRfQVJHQjg4ODg6CisgICAgY2FzZSBTRExfUElYRUxGT1JNQVRfUkdCQTg4ODg6CisgICAgY2FzZSBTRExfUElYRUxGT1JNQVRfQUJHUjg4ODg6CisgICAgY2FzZSBTRExfUElYRUxGT1JNQVRfQkdSQTg4ODg6CisgICAgICAgIHJldCA9IFNETF9VcGRhdGVUZXh0dXJlKHNkbC0+dGV4dHVyZSwgTlVMTCwgZGF0YVswXSwgbGluZXNpemVbMF0pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBTRExfUmVuZGVyQ2xlYXIoc2RsLT5yZW5kZXJlcik7CisgICAgU0RMX1JlbmRlckNvcHkoc2RsLT5yZW5kZXJlciwgc2RsLT50ZXh0dXJlLCBOVUxMLCAmc2RsLT50ZXh0dXJlX3JlY3QpOworICAgIFNETF9SZW5kZXJQcmVzZW50KHNkbC0+cmVuZGVyZXIpOworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNETENvbnRleHQseCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ3aW5kb3dfdGl0bGUiLCAgICAgICJzZXQgU0RMIHdpbmRvdyB0aXRsZSIsICAgICAgIE9GRlNFVCh3aW5kb3dfdGl0bGUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAid2luZG93X3NpemUiLCAgICAgICAic2V0IFNETCB3aW5kb3cgZm9yY2VkIHNpemUiLCBPRkZTRVQod2luZG93X3dpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgIndpbmRvd19mdWxsc2NyZWVuIiwgInNldCBTREwgd2luZG93IGZ1bGxzY3JlZW4iLCAgT0ZGU0VUKHdpbmRvd19mdWxsc2NyZWVuKSwgQVZfT1BUX1RZUEVfQk9PTCwgIHsgLmk2NCA9IDAgfSwgICAgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICB7ICJ3aW5kb3dfYm9yZGVybGVzcyIsICJzZXQgU0RMIHdpbmRvdyBib3JkZXIgb2ZmIiwgIE9GRlNFVCh3aW5kb3dfYm9yZGVybGVzcyksIEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAwIH0sICAgIDAsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBzZGwyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gInNkbDIgb3V0ZGV2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19PVVRQVVQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9zZGwyX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzZGwsc2RsMiIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNETDIgb3V0cHV0IGRldmljZSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTRExDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICA9IHNkbDJfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IHNkbDJfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICA9IHNkbDJfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUgfCBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9OT1RJTUVTVEFNUFMsCisgICAgLnByaXZfY2xhc3MgICAgID0gJnNkbDJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2Uvc25kaW9fZGVjLmMgYi9saWJhdmRldmljZS9zbmRpb19kZWMuYwppbmRleCA2ZjExNjBlLi5lYmI0ODVhIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS9zbmRpb19kZWMuYworKysgYi9saWJhdmRldmljZS9zbmRpb19kZWMuYwpAQCAtNDEsMTUgKzQxLDE1IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHJldCA9IGZmX3NuZGlvX29wZW4oczEsIDAsIHMxLT5maWxlbmFtZSk7CisgICAgcmV0ID0gZmZfc25kaW9fb3BlbihzMSwgMCwgczEtPnVybCk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAvKiB0YWtlIHJlYWwgcGFyYW1ldGVycyAqLwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IHMtPmNvZGVjX2lkOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gcy0+Y2hhbm5lbHM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gcy0+Y29kZWNfaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHMtPnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBzLT5jaGFubmVsczsKIAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsgIC8qIDY0IGJpdHMgcHRzIGluIHVzICovCiAKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL3NuZGlvX2VuYy5jIGIvbGliYXZkZXZpY2Uvc25kaW9fZW5jLmMKaW5kZXggNTJiOTA2MC4uZjZkZDI5MCAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2Uvc25kaW9fZW5jLmMKKysrIGIvbGliYXZkZXZpY2Uvc25kaW9fZW5jLmMKQEAgLTM1LDEwICszNSwxMCBAQAogICAgIGludCByZXQ7CiAKICAgICBzdCAgICAgICAgICAgICA9IHMxLT5zdHJlYW1zWzBdOwotICAgIHMtPnNhbXBsZV9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKLSAgICBzLT5jaGFubmVscyAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgcy0+c2FtcGxlX3JhdGUgPSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOworICAgIHMtPmNoYW5uZWxzICAgID0gc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKIAotICAgIHJldCA9IGZmX3NuZGlvX29wZW4oczEsIDEsIHMxLT5maWxlbmFtZSk7CisgICAgcmV0ID0gZmZfc25kaW9fb3BlbihzMSwgMSwgczEtPnVybCk7CiAKICAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvdGVzdHMvdGltZWZpbHRlci5jIGIvbGliYXZkZXZpY2UvdGVzdHMvdGltZWZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWU5MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmRldmljZS90ZXN0cy90aW1lZmlsdGVyLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisKKyNpbmNsdWRlICJsaWJhdmRldmljZS90aW1lZmlsdGVyLmgiCisKKyNkZWZpbmUgTEZHX01BWCAoKDFMTCA8PCAzMikgLSAxKQorCitpbnQgbWFpbih2b2lkKQoreworICAgIEFWTEZHIHBybmc7CisgICAgZG91YmxlIG4wLCBuMTsKKyNkZWZpbmUgU0FNUExFUyAxMDAwCisgICAgZG91YmxlIGlkZWFsW1NBTVBMRVNdOworICAgIGRvdWJsZSBzYW1wbGVzW1NBTVBMRVNdOworICAgIGRvdWJsZSBzYW1wbGV0W1NBTVBMRVNdOworICAgIGZvciAobjAgPSAwOyBuMCA8IDQwOyBuMCA9IDIgKiBuMCArIDEpIHsKKyAgICAgICAgZm9yIChuMSA9IDA7IG4xIDwgMTA7IG4xID0gMiAqIG4xICsgMSkgeworICAgICAgICAgICAgZG91YmxlIGJlc3RfZXJyb3IgPSAxMDAwMDAwMDAwOworICAgICAgICAgICAgZG91YmxlIGJlc3RwYXIwICAgPSBuMCA/IDEgOiAxMDAwMDA7CisgICAgICAgICAgICBkb3VibGUgYmVzdHBhcjEgICA9IDE7CisgICAgICAgICAgICBpbnQgYmV0dGVyLCBpOworCisgICAgICAgICAgICBhdl9sZmdfaW5pdCgmcHJuZywgMTIzKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTQU1QTEVTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzYW1wbGV0W2ldID0gMTAgKyBpICsgKGF2X2xmZ19nZXQoJnBybmcpIDwgTEZHX01BWC8yID8gMCA6IDAuOTk5KTsKKyAgICAgICAgICAgICAgICBpZGVhbFtpXSAgID0gc2FtcGxldFtpXSArIG4xICogaSAvICgxMDAwKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gaWRlYWxbaV0gKyBuMCAqIChhdl9sZmdfZ2V0KCZwcm5nKSAtIExGR19NQVggLyAyKSAvIChMRkdfTUFYICogMTBMTCk7CisgICAgICAgICAgICAgICAgaWYoaSAmJiBzYW1wbGVzW2ldPHNhbXBsZXNbaS0xXSkKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1tpXT1zYW1wbGVzW2ktMV0rMC4wMDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcGFyMCwgcGFyMTsKKyAgICAgICAgICAgICAgICBiZXR0ZXIgPSAwOworICAgICAgICAgICAgICAgIGZvciAocGFyMCA9IGJlc3RwYXIwICogMC44OyBwYXIwIDw9IGJlc3RwYXIwICogMS4yMTsgcGFyMCArPSBiZXN0cGFyMCAqIDAuMDUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwYXIxID0gYmVzdHBhcjEgKiAwLjg7IHBhcjEgPD0gYmVzdHBhcjEgKiAxLjIxOyBwYXIxICs9IGJlc3RwYXIxICogMC4wNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGVycm9yICAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgVGltZUZpbHRlciAqdGYgPSBmZl90aW1lZmlsdGVyX25ldygxLCBwYXIwLCBwYXIxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRpbWVmaWx0ZXIuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNBTVBMRVM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmaWx0ZXJlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZCA9IGZmX3RpbWVmaWx0ZXJfdXBkYXRlKHRmLCBzYW1wbGVzW2ldLCBpID8gKHNhbXBsZXRbaV0gLSBzYW1wbGV0W2ktMV0pIDogMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZmlsdGVyZWQgPCAwIHx8IGZpbHRlcmVkID4gMTAwMDAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJmaWx0ZXIgaXMgdW5zdGFibGVcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICAgKz0gKGZpbHRlcmVkIC0gaWRlYWxbaV0pICogKGZpbHRlcmVkIC0gaWRlYWxbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmZfdGltZWZpbHRlcl9kZXN0cm95KHRmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RfZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2Vycm9yID0gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHBhcjAgICA9IHBhcjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdHBhcjEgICA9IHBhcjE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0dGVyICAgICA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChiZXR0ZXIpOworICAgICAgICAgICAgcHJpbnRmKCIgWyUxMmYgJTExZiAlOWZdIiwgYmVzdHBhcjAsIGJlc3RwYXIxLCBiZXN0X2Vycm9yKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvdGltZWZpbHRlci5jIGIvbGliYXZkZXZpY2UvdGltZWZpbHRlci5jCmluZGV4IDlkMzhmOTMuLmFkNjQ4NWQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL3RpbWVmaWx0ZXIuYworKysgYi9saWJhdmRldmljZS90aW1lZmlsdGVyLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCisKICNpbmNsdWRlICJ0aW1lZmlsdGVyLmgiCiAKIHN0cnVjdCBUaW1lRmlsdGVyIHsKQEAgLTg5LDgwICs4OSwzIEBACiB7CiAgICAgcmV0dXJuIHNlbGYtPmN5Y2xlX3RpbWUgKyBzZWxmLT5jbG9ja19wZXJpb2QgKiBkZWx0YTsKIH0KLQotI2lmZGVmIFRFU1QKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCi0jZGVmaW5lIExGR19NQVggKCgxTEwgPDwgMzIpIC0gMSkKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBBVkxGRyBwcm5nOwotICAgIGRvdWJsZSBuMCwgbjE7Ci0jZGVmaW5lIFNBTVBMRVMgMTAwMAotICAgIGRvdWJsZSBpZGVhbFtTQU1QTEVTXTsKLSAgICBkb3VibGUgc2FtcGxlc1tTQU1QTEVTXTsKLSAgICBkb3VibGUgc2FtcGxldFtTQU1QTEVTXTsKLSAgICBmb3IgKG4wID0gMDsgbjAgPCA0MDsgbjAgPSAyICogbjAgKyAxKSB7Ci0gICAgICAgIGZvciAobjEgPSAwOyBuMSA8IDEwOyBuMSA9IDIgKiBuMSArIDEpIHsKLSAgICAgICAgICAgIGRvdWJsZSBiZXN0X2Vycm9yID0gMTAwMDAwMDAwMDsKLSAgICAgICAgICAgIGRvdWJsZSBiZXN0cGFyMCAgID0gbjAgPyAxIDogMTAwMDAwOwotICAgICAgICAgICAgZG91YmxlIGJlc3RwYXIxICAgPSAxOwotICAgICAgICAgICAgaW50IGJldHRlciwgaTsKLQotICAgICAgICAgICAgYXZfbGZnX2luaXQoJnBybmcsIDEyMyk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU0FNUExFUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgc2FtcGxldFtpXSA9IDEwICsgaSArIChhdl9sZmdfZ2V0KCZwcm5nKSA8IExGR19NQVgvMiA/IDAgOiAwLjk5OSk7Ci0gICAgICAgICAgICAgICAgaWRlYWxbaV0gICA9IHNhbXBsZXRbaV0gKyBuMSAqIGkgLyAoMTAwMCk7Ci0gICAgICAgICAgICAgICAgc2FtcGxlc1tpXSA9IGlkZWFsW2ldICsgbjAgKiAoYXZfbGZnX2dldCgmcHJuZykgLSBMRkdfTUFYIC8gMikgLyAoTEZHX01BWCAqIDEwTEwpOwotICAgICAgICAgICAgICAgIGlmKGkgJiYgc2FtcGxlc1tpXTxzYW1wbGVzW2ktMV0pCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZXNbaV09c2FtcGxlc1tpLTFdKzAuMDAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHBhcjAsIHBhcjE7Ci0gICAgICAgICAgICAgICAgYmV0dGVyID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKHBhcjAgPSBiZXN0cGFyMCAqIDAuODsgcGFyMCA8PSBiZXN0cGFyMCAqIDEuMjE7IHBhcjAgKz0gYmVzdHBhcjAgKiAwLjA1KSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAocGFyMSA9IGJlc3RwYXIxICogMC44OyBwYXIxIDw9IGJlc3RwYXIxICogMS4yMTsgcGFyMSArPSBiZXN0cGFyMSAqIDAuMDUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlcnJvciAgID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVGaWx0ZXIgKnRmID0gZmZfdGltZWZpbHRlcl9uZXcoMSwgcGFyMCwgcGFyMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aW1lZmlsdGVyLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTQU1QTEVTOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZmlsdGVyZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWQgPSBmZl90aW1lZmlsdGVyX3VwZGF0ZSh0Ziwgc2FtcGxlc1tpXSwgaSA/IChzYW1wbGV0W2ldIC0gc2FtcGxldFtpLTFdKSA6IDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZpbHRlcmVkIDwgMCB8fCBmaWx0ZXJlZCA+IDEwMDAwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiZmlsdGVyIGlzIHVuc3RhYmxlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciAgICs9IChmaWx0ZXJlZCAtIGlkZWFsW2ldKSAqIChmaWx0ZXJlZCAtIGlkZWFsW2ldKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZmX3RpbWVmaWx0ZXJfZGVzdHJveSh0Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPCBiZXN0X2Vycm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9lcnJvciA9IGVycm9yOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RwYXIwICAgPSBwYXIwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RwYXIxICAgPSBwYXIxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHRlciAgICAgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoYmV0dGVyKTsKLSNpZiAwCi0gICAgICAgICAgICBkb3VibGUgbGFzdGZpbCA9IDk7Ci0gICAgICAgICAgICBUaW1lRmlsdGVyICp0ZiA9IGZmX3RpbWVmaWx0ZXJfbmV3KDEsIGJlc3RwYXIwLCBiZXN0cGFyMSk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgU0FNUExFUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGZpbHRlcmVkOwotICAgICAgICAgICAgICAgIGZpbHRlcmVkID0gZmZfdGltZWZpbHRlcl91cGRhdGUodGYsIHNhbXBsZXNbaV0sIDEpOwotICAgICAgICAgICAgICAgIHByaW50ZigiJWYgJWYgJWYgJWZcbiIsIGkgLSBzYW1wbGVzW2ldICsgMTAsIGZpbHRlcmVkIC0gc2FtcGxlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1tGRk1BWChpLCAxKV0gLSBzYW1wbGVzW0ZGTUFYKGkgLSAxLCAwKV0sIGZpbHRlcmVkIC0gbGFzdGZpbCk7Ci0gICAgICAgICAgICAgICAgbGFzdGZpbCA9IGZpbHRlcmVkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmZfdGltZWZpbHRlcl9kZXN0cm95KHRmKTsKLSNlbHNlCi0gICAgICAgICAgICBwcmludGYoIiBbJTEyZiAlMTFmICU5Zl0iLCBiZXN0cGFyMCwgYmVzdHBhcjEsIGJlc3RfZXJyb3IpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZkZXZpY2UvdjRsLmMgYi9saWJhdmRldmljZS92NGwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2NTNlMC4uMDAwMDAwMAotLS0gYS9saWJhdmRldmljZS92NGwuYworKysgL2Rldi9udWxsCkBAIC0xLDM2NCArMCwwIEBACi0vKgotICogTGludXggdmlkZW8gZ3JhYiBpbnRlcmZhY2UKLSAqIENvcHlyaWdodCAoYykgMjAwMCwyMDAxIEZhYnJpY2UgQmVsbGFyZAotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSAiYXZkZXZpY2UuaCIKLQotI3VuZGVmIF9fU1RSSUNUX0FOU0lfXyAvL3dvcmthcm91bmQgZHVlIHRvIGJyb2tlbiBrZXJuZWwgaGVhZGVycwotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2RzcHV0aWwuaCIKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0jaW5jbHVkZSA8c3lzL3RpbWUuaD4KLSNkZWZpbmUgX0xJTlVYX1RJTUVfSCAxCi0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBBVkNsYXNzICpjbGFzczsKLSAgICBpbnQgZmQ7Ci0gICAgaW50IGZyYW1lX2Zvcm1hdDsgLyogc2VlIFZJREVPX1BBTEVUVEVfeHh4ICovCi0gICAgaW50IHVzZV9tbWFwOwotICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlOwotICAgIGludDY0X3QgdGltZV9mcmFtZTsKLSAgICBpbnQgZnJhbWVfc2l6ZTsKLSAgICBzdHJ1Y3QgdmlkZW9fY2FwYWJpbGl0eSB2aWRlb19jYXA7Ci0gICAgc3RydWN0IHZpZGVvX2F1ZGlvIGF1ZGlvX3NhdmVkOwotICAgIHN0cnVjdCB2aWRlb193aW5kb3cgdmlkZW9fd2luOwotICAgIHVpbnQ4X3QgKnZpZGVvX2J1ZjsKLSAgICBzdHJ1Y3QgdmlkZW9fbWJ1ZiBnYl9idWZmZXJzOwotICAgIHN0cnVjdCB2aWRlb19tbWFwIGdiX2J1ZjsKLSAgICBpbnQgZ2JfZnJhbWU7Ci0gICAgaW50IHN0YW5kYXJkOwotfSBWaWRlb0RhdGE7Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgIGludCBwYWxldHRlOwotICAgIGludCBkZXB0aDsKLSAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKLX0gdmlkZW9fZm9ybWF0cyBbXSA9IHsKLSAgICB7LnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVVjQyMFAsIC5kZXB0aCA9IDEyLCAucGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIwUCB9LAotICAgIHsucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfWVVWNDIyLCAgLmRlcHRoID0gMTYsIC5waXhfZm10ID0gQVZfUElYX0ZNVF9ZVVlWNDIyIH0sCi0gICAgey5wYWxldHRlID0gVklERU9fUEFMRVRURV9VWVZZLCAgICAuZGVwdGggPSAxNiwgLnBpeF9mbXQgPSBBVl9QSVhfRk1UX1VZVlk0MjIgfSwKLSAgICB7LnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1lVWVYsICAgIC5kZXB0aCA9IDE2LCAucGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVZVjQyMiB9LAotICAgIC8qIE5PVEU6IHY0bCB1c2VzIEJHUjI0LCBub3QgUkdCMjQgKi8KLSAgICB7LnBhbGV0dGUgPSBWSURFT19QQUxFVFRFX1JHQjI0LCAgIC5kZXB0aCA9IDI0LCAucGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQgICB9LAotICAgIHsucGFsZXR0ZSA9IFZJREVPX1BBTEVUVEVfUkdCNTY1LCAgLmRlcHRoID0gMTYsIC5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1I1NjUgIH0sCi0gICAgey5wYWxldHRlID0gVklERU9fUEFMRVRURV9HUkVZLCAgICAuZGVwdGggPSA4LCAgLnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk4ICAgfSwKLX07Ci0KLQotc3RhdGljIGludCBncmFiX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqczEsIEFWRm9ybWF0UGFyYW1ldGVycyAqYXApCi17Ci0gICAgVmlkZW9EYXRhICpzID0gczEtPnByaXZfZGF0YTsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgaW50IHZpZGVvX2ZkOwotICAgIGludCBkZXNpcmVkX3BhbGV0dGUsIGRlc2lyZWRfZGVwdGg7Ci0gICAgc3RydWN0IHZpZGVvX3R1bmVyIHR1bmVyOwotICAgIHN0cnVjdCB2aWRlb19hdWRpbyBhdWRpbzsKLSAgICBzdHJ1Y3QgdmlkZW9fcGljdHVyZSBwaWN0OwotICAgIGludCBqOwotICAgIGludCB2Zm9ybWF0X251bSA9IEZGX0FSUkFZX0VMRU1TKHZpZGVvX2Zvcm1hdHMpOwotCi0gICAgYXZfbG9nKHMxLCBBVl9MT0dfV0FSTklORywgIlY0TCBpbnB1dCBkZXZpY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IHJlbGVhc2UuIik7Ci0KLSAgICBpZiAoYXAtPnRpbWVfYmFzZS5kZW4gPD0gMCkgewotICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIldyb25nIHRpbWUgYmFzZSAoJWQpXG4iLCBhcC0+dGltZV9iYXNlLmRlbik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcy0+dGltZV9iYXNlID0gYXAtPnRpbWVfYmFzZTsKLQotICAgIHMtPnZpZGVvX3dpbi53aWR0aCA9IGFwLT53aWR0aDsKLSAgICBzLT52aWRlb193aW4uaGVpZ2h0ID0gYXAtPmhlaWdodDsKLQotICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzMSwgTlVMTCk7Ci0gICAgaWYgKCFzdCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwMCk7IC8qIDY0IGJpdHMgcHRzIGluIHVzICovCi0KLSAgICB2aWRlb19mZCA9IG9wZW4oczEtPmZpbGVuYW1lLCBPX1JEV1IpOwotICAgIGlmICh2aWRlb19mZCA8IDApIHsKLSAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICIlczogJXNcbiIsIHMxLT5maWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGlmIChpb2N0bCh2aWRlb19mZCwgVklESU9DR0NBUCwgJnMtPnZpZGVvX2NhcCkgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiVklESU9DR0NBUDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoIShzLT52aWRlb19jYXAudHlwZSAmIFZJRF9UWVBFX0NBUFRVUkUpKSB7Ci0gICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiRmF0YWw6IGdyYWIgZGV2aWNlIGRvZXMgbm90IGhhbmRsZSBjYXB0dXJlXG4iKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIC8qIG5vIHZhbHVlcyBzZXQsIGF1dG9kZXRlY3QgdGhlbSAqLwotICAgIGlmIChzLT52aWRlb193aW4ud2lkdGggPD0gMCB8fCBzLT52aWRlb193aW4uaGVpZ2h0IDw9IDApIHsKLSAgICAgICAgaWYgKGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NHV0lOLCAmcy0+dmlkZW9fd2luLCBzaXplb2Yocy0+dmlkZW9fd2luKSkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlZJRElPQ0dXSU46ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYoYXZfaW1hZ2VfY2hlY2tfc2l6ZShzLT52aWRlb193aW4ud2lkdGgsIHMtPnZpZGVvX3dpbi5oZWlnaHQsIDAsIHMxKSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGRlc2lyZWRfcGFsZXR0ZSA9IC0xOwotICAgIGRlc2lyZWRfZGVwdGggPSAtMTsKLSAgICBmb3IgKGogPSAwOyBqIDwgdmZvcm1hdF9udW07IGorKykgewotICAgICAgICBpZiAoYXAtPnBpeF9mbXQgPT0gdmlkZW9fZm9ybWF0c1tqXS5waXhfZm10KSB7Ci0gICAgICAgICAgICBkZXNpcmVkX3BhbGV0dGUgPSB2aWRlb19mb3JtYXRzW2pdLnBhbGV0dGU7Ci0gICAgICAgICAgICBkZXNpcmVkX2RlcHRoID0gdmlkZW9fZm9ybWF0c1tqXS5kZXB0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogc2V0IHR2IHN0YW5kYXJkICovCi0gICAgaWYgKCFpb2N0bCh2aWRlb19mZCwgVklESU9DR1RVTkVSLCAmdHVuZXIpKSB7Ci0gICAgICAgIHR1bmVyLm1vZGUgPSBzLT5zdGFuZGFyZDsKLSAgICAgICAgaW9jdGwodmlkZW9fZmQsIFZJRElPQ1NUVU5FUiwgJnR1bmVyKTsKLSAgICB9Ci0KLSAgICAvKiB1bm11dGUgYXVkaW8gKi8KLSAgICBhdWRpby5hdWRpbyA9IDA7Ci0gICAgaW9jdGwodmlkZW9fZmQsIFZJRElPQ0dBVURJTywgJmF1ZGlvKTsKLSAgICBtZW1jcHkoJnMtPmF1ZGlvX3NhdmVkLCAmYXVkaW8sIHNpemVvZihhdWRpbykpOwotICAgIGF1ZGlvLmZsYWdzICY9IH5WSURFT19BVURJT19NVVRFOwotICAgIGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NTQVVESU8sICZhdWRpbyk7Ci0KLSAgICBpb2N0bCh2aWRlb19mZCwgVklESU9DR1BJQ1QsICZwaWN0KTsKLSAgICBmZl9kbG9nKHMxLCAidjRsOiBjb2xvdXI9JWQgaHVlPSVkIGJyaWdodG5lc3M9JWQgY29uc3RyYXN0PSVkIHdoaXRlbmVzcz0lZFxuIiwKLSAgICAgICAgICAgIHBpY3QuY29sb3VyLCBwaWN0Lmh1ZSwgcGljdC5icmlnaHRuZXNzLCBwaWN0LmNvbnRyYXN0LCBwaWN0LndoaXRlbmVzcyk7Ci0gICAgLyogdHJ5IHRvIGNob29zZSBhIHN1aXRhYmxlIHZpZGVvIGZvcm1hdCAqLwotICAgIHBpY3QucGFsZXR0ZSA9IGRlc2lyZWRfcGFsZXR0ZTsKLSAgICBwaWN0LmRlcHRoPSBkZXNpcmVkX2RlcHRoOwotICAgIGlmIChkZXNpcmVkX3BhbGV0dGUgPT0gLTEgfHwgaW9jdGwodmlkZW9fZmQsIFZJRElPQ1NQSUNULCAmcGljdCkgPCAwKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCB2Zm9ybWF0X251bTsgaisrKSB7Ci0gICAgICAgICAgICBwaWN0LnBhbGV0dGUgPSB2aWRlb19mb3JtYXRzW2pdLnBhbGV0dGU7Ci0gICAgICAgICAgICBwaWN0LmRlcHRoID0gdmlkZW9fZm9ybWF0c1tqXS5kZXB0aDsKLSAgICAgICAgICAgIGlmICgtMSAhPSBpb2N0bCh2aWRlb19mZCwgVklESU9DU1BJQ1QsICZwaWN0KSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoaiA+PSB2Zm9ybWF0X251bSkKLSAgICAgICAgICAgIGdvdG8gZmFpbDE7Ci0gICAgfQotCi0gICAgaWYgKGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NHTUJVRiwgJnMtPmdiX2J1ZmZlcnMpIDwgMCkgewotICAgICAgICAvKiB0cnkgdG8gdXNlIHJlYWQgYmFzZWQgYWNjZXNzICovCi0gICAgICAgIGludCB2YWw7Ci0KLSAgICAgICAgcy0+dmlkZW9fd2luLnggPSAwOwotICAgICAgICBzLT52aWRlb193aW4ueSA9IDA7Ci0gICAgICAgIHMtPnZpZGVvX3dpbi5jaHJvbWFrZXkgPSAtMTsKLSAgICAgICAgcy0+dmlkZW9fd2luLmZsYWdzID0gMDsKLQotICAgICAgICBpZiAoaW9jdGwodmlkZW9fZmQsIFZJRElPQ1NXSU4sIHMtPnZpZGVvX3dpbikgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlZJRElPQ1NXSU46ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgcy0+ZnJhbWVfZm9ybWF0ID0gcGljdC5wYWxldHRlOwotCi0gICAgICAgIHZhbCA9IDE7Ci0gICAgICAgIGlmIChpb2N0bCh2aWRlb19mZCwgVklESU9DQ0FQVFVSRSwgJnZhbCkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlZJRElPQ0NBUFRVUkU6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgcy0+dGltZV9mcmFtZSA9IGF2X2dldHRpbWUoKSAqIHMtPnRpbWVfYmFzZS5kZW4gLyBzLT50aW1lX2Jhc2UubnVtOwotICAgICAgICBzLT51c2VfbW1hcCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy0+dmlkZW9fYnVmID0gbW1hcCgwLCBzLT5nYl9idWZmZXJzLnNpemUsIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCB2aWRlb19mZCwgMCk7Ci0gICAgICAgIGlmICgodW5zaWduZWQgY2hhciopLTEgPT0gcy0+dmlkZW9fYnVmKSB7Ci0gICAgICAgICAgICBzLT52aWRlb19idWYgPSBtbWFwKDAsIHMtPmdiX2J1ZmZlcnMuc2l6ZSwgUFJPVF9SRUFEfFBST1RfV1JJVEUsIE1BUF9QUklWQVRFLCB2aWRlb19mZCwgMCk7Ci0gICAgICAgICAgICBpZiAoKHVuc2lnbmVkIGNoYXIqKS0xID09IHMtPnZpZGVvX2J1ZikgewotICAgICAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAibW1hcDogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHMtPmdiX2ZyYW1lID0gMDsKLSAgICAgICAgcy0+dGltZV9mcmFtZSA9IGF2X2dldHRpbWUoKSAqIHMtPnRpbWVfYmFzZS5kZW4gLyBzLT50aW1lX2Jhc2UubnVtOwotCi0gICAgICAgIC8qIHN0YXJ0IHRvIGdyYWIgdGhlIGZpcnN0IGZyYW1lICovCi0gICAgICAgIHMtPmdiX2J1Zi5mcmFtZSA9IHMtPmdiX2ZyYW1lICUgcy0+Z2JfYnVmZmVycy5mcmFtZXM7Ci0gICAgICAgIHMtPmdiX2J1Zi5oZWlnaHQgPSBzLT52aWRlb193aW4uaGVpZ2h0OwotICAgICAgICBzLT5nYl9idWYud2lkdGggPSBzLT52aWRlb193aW4ud2lkdGg7Ci0gICAgICAgIHMtPmdiX2J1Zi5mb3JtYXQgPSBwaWN0LnBhbGV0dGU7Ci0KLSAgICAgICAgaWYgKGlvY3RsKHZpZGVvX2ZkLCBWSURJT0NNQ0FQVFVSRSwgJnMtPmdiX2J1ZikgPCAwKSB7Ci0gICAgICAgICAgICBpZiAoZXJybm8gIT0gRUFHQUlOKSB7Ci0gICAgICAgICAgICBmYWlsMToKLSAgICAgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlZJRElPQ01DQVBUVVJFOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJGYXRhbDogZ3JhYiBkZXZpY2UgZG9lcyBub3QgcmVjZWl2ZSBhbnkgdmlkZW8gc2lnbmFsXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGogPSAxOyBqIDwgcy0+Z2JfYnVmZmVycy5mcmFtZXM7IGorKykgewotICAgICAgICAgIHMtPmdiX2J1Zi5mcmFtZSA9IGo7Ci0gICAgICAgICAgaW9jdGwodmlkZW9fZmQsIFZJRElPQ01DQVBUVVJFLCAmcy0+Z2JfYnVmKTsKLSAgICAgICAgfQotICAgICAgICBzLT5mcmFtZV9mb3JtYXQgPSBzLT5nYl9idWYuZm9ybWF0OwotICAgICAgICBzLT51c2VfbW1hcCA9IDE7Ci0gICAgfQotCi0gICAgZm9yIChqID0gMDsgaiA8IHZmb3JtYXRfbnVtOyBqKyspIHsKLSAgICAgICAgaWYgKHMtPmZyYW1lX2Zvcm1hdCA9PSB2aWRlb19mb3JtYXRzW2pdLnBhbGV0dGUpIHsKLSAgICAgICAgICAgIHMtPmZyYW1lX3NpemUgPSBzLT52aWRlb193aW4ud2lkdGggKiBzLT52aWRlb193aW4uaGVpZ2h0ICogdmlkZW9fZm9ybWF0c1tqXS5kZXB0aCAvIDg7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSB2aWRlb19mb3JtYXRzW2pdLnBpeF9mbXQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChqID49IHZmb3JtYXRfbnVtKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBzLT5mZCA9IHZpZGVvX2ZkOwotCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKLSAgICBzdC0+Y29kZWMtPndpZHRoID0gcy0+dmlkZW9fd2luLndpZHRoOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gcy0+dmlkZW9fd2luLmhlaWdodDsKLSAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZSA9IHMtPnRpbWVfYmFzZTsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gcy0+ZnJhbWVfc2l6ZSAqIDEvYXZfcTJkKHN0LT5jb2RlYy0+dGltZV9iYXNlKSAqIDg7Ci0KLSAgICByZXR1cm4gMDsKLSBmYWlsOgotICAgIGlmICh2aWRlb19mZCA+PSAwKQotICAgICAgICBjbG9zZSh2aWRlb19mZCk7Ci0gICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKLX0KLQotc3RhdGljIGludCB2NGxfbW1fcmVhZF9waWN0dXJlKFZpZGVvRGF0YSAqcywgdWludDhfdCAqYnVmKQotewotICAgIHVpbnQ4X3QgKnB0cjsKLQotICAgIHdoaWxlIChpb2N0bChzLT5mZCwgVklESU9DU1lOQywgJnMtPmdiX2ZyYW1lKSA8IDAgJiYKLSAgICAgICAgICAgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikpOwotCi0gICAgcHRyID0gcy0+dmlkZW9fYnVmICsgcy0+Z2JfYnVmZmVycy5vZmZzZXRzW3MtPmdiX2ZyYW1lXTsKLSAgICBtZW1jcHkoYnVmLCBwdHIsIHMtPmZyYW1lX3NpemUpOwotCi0gICAgLyogU2V0dXAgdG8gY2FwdHVyZSB0aGUgbmV4dCBmcmFtZSAqLwotICAgIHMtPmdiX2J1Zi5mcmFtZSA9IHMtPmdiX2ZyYW1lOwotICAgIGlmIChpb2N0bChzLT5mZCwgVklESU9DTUNBUFRVUkUsICZzLT5nYl9idWYpIDwgMCkgewotICAgICAgICBpZiAoZXJybm8gPT0gRUFHQUlOKQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBTeW5jXG4iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlZJRElPQ01DQVBUVVJFOiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKLSAgICB9Ci0KLSAgICAvKiBUaGlzIGlzIG5vdyB0aGUgZ3JhYmJpbmcgZnJhbWUgKi8KLSAgICBzLT5nYl9mcmFtZSA9IChzLT5nYl9mcmFtZSArIDEpICUgcy0+Z2JfYnVmZmVycy5mcmFtZXM7Ci0KLSAgICByZXR1cm4gcy0+ZnJhbWVfc2l6ZTsKLX0KLQotc3RhdGljIGludCBncmFiX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqczEsIEFWUGFja2V0ICpwa3QpCi17Ci0gICAgVmlkZW9EYXRhICpzID0gczEtPnByaXZfZGF0YTsKLSAgICBpbnQ2NF90IGN1cnRpbWUsIGRlbGF5OwotICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKLQotICAgIC8qIENhbGN1bGF0ZSB0aGUgdGltZSBvZiB0aGUgbmV4dCBmcmFtZSAqLwotICAgIHMtPnRpbWVfZnJhbWUgKz0gSU5UNjRfQygxMDAwMDAwKTsKLQotICAgIC8qIHdhaXQgYmFzZWQgb24gdGhlIGZyYW1lIHJhdGUgKi8KLSAgICBmb3IoOzspIHsKLSAgICAgICAgY3VydGltZSA9IGF2X2dldHRpbWUoKTsKLSAgICAgICAgZGVsYXkgPSBzLT50aW1lX2ZyYW1lICogcy0+dGltZV9iYXNlLm51bSAvIHMtPnRpbWVfYmFzZS5kZW4gLSBjdXJ0aW1lOwotICAgICAgICBpZiAoZGVsYXkgPD0gMCkgewotICAgICAgICAgICAgaWYgKGRlbGF5IDwgSU5UNjRfQygtMTAwMDAwMCkgKiBzLT50aW1lX2Jhc2UubnVtIC8gcy0+dGltZV9iYXNlLmRlbikgewotICAgICAgICAgICAgICAgIC8qIHByaW50ZigiZ3JhYmJpbmcgaXMgJWQgZnJhbWVzIGxhdGUgKGRyb3BwaW5nKVxuIiwgKGludCkgLShkZWxheSAvIDE2NjY2KSk7ICovCi0gICAgICAgICAgICAgICAgcy0+dGltZV9mcmFtZSArPSBJTlQ2NF9DKDEwMDAwMDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdHMudHZfc2VjID0gZGVsYXkgLyAxMDAwMDAwOwotICAgICAgICB0cy50dl9uc2VjID0gKGRlbGF5ICUgMTAwMDAwMCkgKiAxMDAwOwotICAgICAgICBuYW5vc2xlZXAoJnRzLCBOVUxMKTsKLSAgICB9Ci0KLSAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIHMtPmZyYW1lX3NpemUpIDwgMCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKLQotICAgIHBrdC0+cHRzID0gY3VydGltZTsKLQotICAgIC8qIHJlYWQgb25lIGZyYW1lICovCi0gICAgaWYgKHMtPnVzZV9tbWFwKSB7Ci0gICAgICAgIHJldHVybiB2NGxfbW1fcmVhZF9waWN0dXJlKHMsIHBrdC0+ZGF0YSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHJlYWQocy0+ZmQsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKSAhPSBwa3QtPnNpemUpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgICAgICByZXR1cm4gcy0+ZnJhbWVfc2l6ZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgZ3JhYl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqczEpCi17Ci0gICAgVmlkZW9EYXRhICpzID0gczEtPnByaXZfZGF0YTsKLQotICAgIGlmIChzLT51c2VfbW1hcCkKLSAgICAgICAgbXVubWFwKHMtPnZpZGVvX2J1Ziwgcy0+Z2JfYnVmZmVycy5zaXplKTsKLQotICAgIC8qIG11dGUgYXVkaW8uIHdlIG11c3QgZm9yY2UgaXQgYmVjYXVzZSB0aGUgQlRUViBkcml2ZXIgZG9lcyBub3QKLSAgICAgICByZXR1cm4gaXRzIHN0YXRlIGNvcnJlY3RseSAqLwotICAgIHMtPmF1ZGlvX3NhdmVkLmZsYWdzIHw9IFZJREVPX0FVRElPX01VVEU7Ci0gICAgaW9jdGwocy0+ZmQsIFZJRElPQ1NBVURJTywgJnMtPmF1ZGlvX3NhdmVkKTsKLQotICAgIGNsb3NlKHMtPmZkKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKLSAgICB7ICJzdGFuZGFyZCIsICIiLCBvZmZzZXRvZihWaWRlb0RhdGEsIHN0YW5kYXJkKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFZJREVPX01PREVfTlRTQ30sIFZJREVPX01PREVfUEFMLCBWSURFT19NT0RFX05UU0MsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCi0gICAgeyAiUEFMIiwgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVklERU9fTU9ERV9QQUx9LCAgIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCi0gICAgeyAiU0VDQU0iLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVklERU9fTU9ERV9TRUNBTX0sIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCi0gICAgeyAiTlRTQyIsICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVklERU9fTU9ERV9OVFNDfSwgIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNLCAic3RhbmRhcmQiIH0sCi0gICAgeyBOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyB2NGxfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiVjRMIGluZGV2IiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKLSAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLSAgICAuY2F0ZWdvcnkgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9WSURFT19JTlBVVCwKLX07Ci0KLUFWSW5wdXRGb3JtYXQgZmZfdjRsX2RlbXV4ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gInZpZGVvNGxpbnV4LHY0bCIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZpZGVvNExpbnV4IGRldmljZSBncmFiIiksCi0gICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFZpZGVvRGF0YSksCi0gICAgLnJlYWRfaGVhZGVyICAgID0gZ3JhYl9yZWFkX2hlYWRlciwKLSAgICAucmVhZF9wYWNrZXQgICAgPSBncmFiX3JlYWRfcGFja2V0LAotICAgIC5yZWFkX2Nsb3NlICAgICA9IGdyYWJfcmVhZF9jbG9zZSwKLSAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCi0gICAgLnByaXZfY2xhc3MgICAgID0gJnY0bF9jbGFzcywKLX07CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS92NGwyLWNvbW1vbi5oIGIvbGliYXZkZXZpY2UvdjRsMi1jb21tb24uaAppbmRleCA0MGM3MTY0Li4wY2JhZWM4IDEwMDY0NAotLS0gYS9saWJhdmRldmljZS92NGwyLWNvbW1vbi5oCisrKyBiL2xpYmF2ZGV2aWNlL3Y0bDItY29tbW9uLmgKQEAgLTM1LDcgKzM1LDYgQEAKICNlbmRpZgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2VuZGlmCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F0b21pYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL3Y0bDIuYyBiL2xpYmF2ZGV2aWNlL3Y0bDIuYwppbmRleCAzODMwMzNlLi4xMGEwZmYwIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS92NGwyLmMKKysrIGIvbGliYXZkZXZpY2UvdjRsMi5jCkBAIC0zMCw2ICszMCw4IEBACiAgKiBWNEwyX1BJWF9GTVRfKiBhbmQgQVZfUElYX0ZNVF8qCiAgKi8KIAorI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgorCiAjaW5jbHVkZSAidjRsMi1jb21tb24uaCIKICNpbmNsdWRlIDxkaXJlbnQuaD4KIApAQCAtNzgsNyArODAsNyBAQAogICAgIGludDY0X3QgbGFzdF90aW1lX207CiAKICAgICBpbnQgYnVmZmVyczsKLSAgICB2b2xhdGlsZSBpbnQgYnVmZmVyc19xdWV1ZWQ7CisgICAgYXRvbWljX2ludCBidWZmZXJzX3F1ZXVlZDsKICAgICB2b2lkICoqYnVmX3N0YXJ0OwogICAgIHVuc2lnbmVkIGludCAqYnVmX2xlbjsKICAgICBjaGFyICpzdGFuZGFyZDsKQEAgLTEwNCw3ICsxMDYsNyBAQAogICAgIGludCBpbmRleDsKIH07CiAKLXN0YXRpYyBpbnQgZGV2aWNlX29wZW4oQVZGb3JtYXRDb250ZXh0ICpjdHgpCitzdGF0aWMgaW50IGRldmljZV9vcGVuKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBjb25zdCBjaGFyKiBkZXZpY2VfcGF0aCkKIHsKICAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOwogICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwOwpAQCAtMTQ1LDExICsxNDcsMTEgQEAKICAgICAgICAgZmxhZ3MgfD0gT19OT05CTE9DSzsKICAgICB9CiAKLSAgICBmZCA9IHY0bDJfb3BlbihjdHgtPmZpbGVuYW1lLCBmbGFncywgMCk7CisgICAgZmQgPSB2NGwyX29wZW4oZGV2aWNlX3BhdGgsIGZsYWdzLCAwKTsKICAgICBpZiAoZmQgPCAwKSB7CiAgICAgICAgIGVyciA9IEFWRVJST1IoZXJybm8pOwogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3Qgb3BlbiB2aWRlbyBkZXZpY2UgJXM6ICVzXG4iLAotICAgICAgICAgICAgICAgY3R4LT5maWxlbmFtZSwgYXZfZXJyMnN0cihlcnIpKTsKKyAgICAgICAgICAgICAgIGRldmljZV9wYXRoLCBhdl9lcnIyc3RyKGVycikpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIApAQCAtNDAyLDcgKzQwNCw3IEBACiAgICAgICAgIHJlcyA9IEFWRVJST1IoZXJybm8pOwogICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiaW9jdGwoVklESU9DX1FCVUYpOiAlc1xuIiwgYXZfZXJyMnN0cihyZXMpKTsKICAgICB9IGVsc2UgewotICAgICAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZzLT5idWZmZXJzX3F1ZXVlZCwgMSk7CisgICAgICAgIGF0b21pY19mZXRjaF9hZGQoJnMtPmJ1ZmZlcnNfcXVldWVkLCAxKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtNDkwLDYgKzQ5Miw3IEBACiAgICAgICAgIC50eXBlICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCiAgICAgICAgIC5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQCiAgICAgfTsKKyAgICBzdHJ1Y3QgdGltZXZhbCBidWZfdHM7CiAgICAgaW50IHJlczsKIAogICAgIHBrdC0+c2l6ZSA9IDA7CkBAIC01MDYsMTMgKzUwOSwxNSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIGJ1Zl90cyA9IGJ1Zi50aW1lc3RhbXA7CisKICAgICBpZiAoYnVmLmluZGV4ID49IHMtPmJ1ZmZlcnMpIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBidWZmZXIgaW5kZXggcmVjZWl2ZWQuXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9Ci0gICAgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCgmcy0+YnVmZmVyc19xdWV1ZWQsIC0xKTsKKyAgICBhdG9taWNfZmV0Y2hfYWRkKCZzLT5idWZmZXJzX3F1ZXVlZCwgLTEpOwogICAgIC8vIGFsd2F5cyBrZWVwIGF0IGxlYXN0IG9uZSBidWZmZXIgcXVldWVkCi0gICAgYXZfYXNzZXJ0MChhdnByaXZfYXRvbWljX2ludF9nZXQoJnMtPmJ1ZmZlcnNfcXVldWVkKSA+PSAxKTsKKyAgICBhdl9hc3NlcnQwKGF0b21pY19sb2FkKCZzLT5idWZmZXJzX3F1ZXVlZCkgPj0gMSk7CiAKICNpZmRlZiBWNEwyX0JVRl9GTEFHX0VSUk9SCiAgICAgaWYgKGJ1Zi5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfRVJST1IpIHsKQEAgLTUzOCw3ICs1NDMsNyBAQAogICAgIH0KIAogICAgIC8qIEltYWdlIGlzIGF0IHMtPmJ1ZmZfc3RhcnRbYnVmLmluZGV4XSAqLwotICAgIGlmIChhdnByaXZfYXRvbWljX2ludF9nZXQoJnMtPmJ1ZmZlcnNfcXVldWVkKSA9PSBGRk1BWChzLT5idWZmZXJzIC8gOCwgMSkpIHsKKyAgICBpZiAoYXRvbWljX2xvYWQoJnMtPmJ1ZmZlcnNfcXVldWVkKSA9PSBGRk1BWChzLT5idWZmZXJzIC8gOCwgMSkpIHsKICAgICAgICAgLyogd2hlbiB3ZSBzdGFydCBnZXR0aW5nIGxvdyBvbiBxdWV1ZWQgYnVmZmVycywgZmFsbCBiYWNrIG9uIGNvcHlpbmcgZGF0YSAqLwogICAgICAgICByZXMgPSBhdl9uZXdfcGFja2V0KHBrdCwgYnVmLmJ5dGVzdXNlZCk7CiAgICAgICAgIGlmIChyZXMgPCAwKSB7CkBAIC01ODEsNyArNTg2LDcgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcGt0LT5wdHMgPSBidWYudGltZXN0YW1wLnR2X3NlYyAqIElOVDY0X0MoMTAwMDAwMCkgKyBidWYudGltZXN0YW1wLnR2X3VzZWM7CisgICAgcGt0LT5wdHMgPSBidWZfdHMudHZfc2VjICogSU5UNjRfQygxMDAwMDAwKSArIGJ1Zl90cy50dl91c2VjOwogICAgIGNvbnZlcnRfdGltZXN0YW1wKGN0eCwgJnBrdC0+cHRzKTsKIAogICAgIHJldHVybiBwa3QtPnNpemU7CkBAIC02MDcsNyArNjEyLDcgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcy0+YnVmZmVyc19xdWV1ZWQgPSBzLT5idWZmZXJzOworICAgIGF0b21pY19zdG9yZSgmcy0+YnVmZmVyc19xdWV1ZWQsIHMtPmJ1ZmZlcnMpOwogCiAgICAgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKICAgICBpZiAodjRsMl9pb2N0bChzLT5mZCwgVklESU9DX1NUUkVBTU9OLCAmdHlwZSkgPCAwKSB7CkBAIC03MTUsMTEgKzcyMCw4IEBACiAgICAgc3RyZWFtcGFybS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOwogICAgIGlmICh2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfR19QQVJNLCAmc3RyZWFtcGFybSkgPCAwKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOwotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpb2N0bChWSURJT0NfR19QQVJNKTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgaWYgKGZyYW1lcmF0ZV9xLm51bSAmJiBmcmFtZXJhdGVfcS5kZW4pIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJpb2N0bChWSURJT0NfR19QQVJNKTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgfSBlbHNlIGlmIChmcmFtZXJhdGVfcS5udW0gJiYgZnJhbWVyYXRlX3EuZGVuKSB7CiAgICAgICAgIGlmIChzdHJlYW1wYXJtLnBhcm0uY2FwdHVyZS5jYXBhYmlsaXR5ICYgVjRMMl9DQVBfVElNRVBFUkZSQU1FKSB7CiAgICAgICAgICAgICB0cGYgPSAmc3RyZWFtcGFybS5wYXJtLmNhcHR1cmUudGltZXBlcmZyYW1lOwogCkBAIC04MzgsNyArODQwLDcgQEAKICAgICAgICAgdjRsMl9sb2dfZmlsZSA9IGZvcGVuKCIvZGV2L251bGwiLCAidyIpOwogI2VuZGlmCiAKLSAgICBzLT5mZCA9IGRldmljZV9vcGVuKGN0eCk7CisgICAgcy0+ZmQgPSBkZXZpY2Vfb3BlbihjdHgsIGN0eC0+dXJsKTsKICAgICBpZiAocy0+ZmQgPCAwKQogICAgICAgICByZXR1cm4gcy0+ZmQ7CiAKQEAgLTg4NSwxNCArODg3LDE0IEBACiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAvKiA2NCBiaXRzIHB0cyBpbiB1cyAqLwogCiAgICAgaWYgKHMtPnBpeGVsX2Zvcm1hdCkgewotICAgICAgICBBVkNvZGVjICpjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyX2J5X25hbWUocy0+cGl4ZWxfZm9ybWF0KTsKKyAgICAgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0X2J5X25hbWUocy0+cGl4ZWxfZm9ybWF0KTsKIAotICAgICAgICBpZiAoY29kZWMpCi0gICAgICAgICAgICBjdHgtPnZpZGVvX2NvZGVjX2lkID0gY29kZWMtPmlkOworICAgICAgICBpZiAoZGVzYykKKyAgICAgICAgICAgIGN0eC0+dmlkZW9fY29kZWNfaWQgPSBkZXNjLT5pZDsKIAogICAgICAgICBwaXhfZm10ID0gYXZfZ2V0X3BpeF9mbXQocy0+cGl4ZWxfZm9ybWF0KTsKIAotICAgICAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUgJiYgIWNvZGVjKSB7CisgICAgICAgIGlmIChwaXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSAmJiAhZGVzYykgewogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gc3VjaCBpbnB1dCBmb3JtYXQ6ICVzLlxuIiwKICAgICAgICAgICAgICAgICAgICBzLT5waXhlbF9mb3JtYXQpOwogCkBAIC05MzgsOSArOTQwLDEwIEBACiAgICAgaWYgKChyZXMgPSB2NGwyX3NldF9wYXJhbWV0ZXJzKGN0eCkpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCi0gICAgc3QtPmNvZGVjLT5waXhfZm10ID0gZmZfZm10X3Y0bDJmZihkZXNpcmVkX2Zvcm1hdCwgY29kZWNfaWQpOwotICAgIHMtPmZyYW1lX3NpemUgPSBhdl9pbWFnZV9nZXRfYnVmZmVyX3NpemUoc3QtPmNvZGVjLT5waXhfZm10LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+d2lkdGgsIHMtPmhlaWdodCwgMSk7CisgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBmZl9mbXRfdjRsMmZmKGRlc2lyZWRfZm9ybWF0LCBjb2RlY19pZCk7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgcy0+ZnJhbWVfc2l6ZSA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShzdC0+Y29kZWNwYXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aWR0aCwgcy0+aGVpZ2h0LCAxKTsKIAogICAgIGlmICgocmVzID0gbW1hcF9pbml0KGN0eCkpIHx8CiAgICAgICAgIChyZXMgPSBtbWFwX3N0YXJ0KGN0eCkpIDwgMCkKQEAgLTk0OCwyMiArOTUxLDIyIEBACiAKICAgICBzLT50b3BfZmllbGRfZmlyc3QgPSBmaXJzdF9maWVsZChzKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gY29kZWNfaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBjb2RlY19pZDsKICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8pCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0KLSAgICAgICAgICAgIGF2Y29kZWNfcGl4X2ZtdF90b19jb2RlY190YWcoc3QtPmNvZGVjLT5waXhfZm10KTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPQorICAgICAgICAgICAgYXZjb2RlY19waXhfZm10X3RvX2NvZGVjX3RhZyhzdC0+Y29kZWNwYXItPmZvcm1hdCk7CiAgICAgZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgewogICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9PTkNFOwogICAgIH0KICAgICBpZiAoZGVzaXJlZF9mb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lWVTQyMCkKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnWScsICdWJywgJzEnLCAnMicpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IE1LVEFHKCdZJywgJ1YnLCAnMScsICcyJyk7CiAgICAgZWxzZSBpZiAoZGVzaXJlZF9mb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1lWVTQxMCkKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnWScsICdWJywgJ1UnLCAnOScpOwotICAgIHN0LT5jb2RlYy0+d2lkdGggPSBzLT53aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBNS1RBRygnWScsICdWJywgJ1UnLCAnOScpOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggPSBzLT53aWR0aDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IHMtPmhlaWdodDsKICAgICBpZiAoc3QtPmF2Z19mcmFtZV9yYXRlLmRlbikKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHMtPmZyYW1lX3NpemUgKiBhdl9xMmQoc3QtPmF2Z19mcmFtZV9yYXRlKSAqIDg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBzLT5mcmFtZV9zaXplICogYXZfcTJkKHN0LT5hdmdfZnJhbWVfcmF0ZSkgKiA4OwogCiAgICAgcmV0dXJuIDA7CiAKQEAgLTk3NCwyMCArOTc3LDE5IEBACiAKIHN0YXRpYyBpbnQgdjRsMl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBzdHJ1Y3QgdmlkZW9fZGF0YSAqcyA9IGN0eC0+cHJpdl9kYXRhOwotI2lmIEZGX0FQSV9DT0RFRF9GUkFNRQorI2lmIEZGX0FQSV9DT0RFRF9GUkFNRSAmJiBGRl9BUElfTEFWRl9BVkNUWAogRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIHN0cnVjdCB2aWRlb19kYXRhICpzID0gY3R4LT5wcml2X2RhdGE7CiAgICAgQVZGcmFtZSAqZnJhbWUgPSBjdHgtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlZF9mcmFtZTsKIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogI2VuZGlmCiAgICAgaW50IHJlczsKIAotICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CiAgICAgaWYgKChyZXMgPSBtbWFwX3JlYWRfZnJhbWUoY3R4LCBwa3QpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSNpZiBGRl9BUElfQ09ERURfRlJBTUUKKyNpZiBGRl9BUElfQ09ERURfRlJBTUUgJiYgRkZfQVBJX0xBVkZfQVZDVFgKIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICAgICBpZiAoZnJhbWUgJiYgcy0+aW50ZXJsYWNlZCkgewogICAgICAgICBmcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA9IDE7CkBAIC0xMDAzLDcgKzEwMDUsNyBAQAogewogICAgIHN0cnVjdCB2aWRlb19kYXRhICpzID0gY3R4LT5wcml2X2RhdGE7CiAKLSAgICBpZiAoYXZwcml2X2F0b21pY19pbnRfZ2V0KCZzLT5idWZmZXJzX3F1ZXVlZCkgIT0gcy0+YnVmZmVycykKKyAgICBpZiAoYXRvbWljX2xvYWQoJnMtPmJ1ZmZlcnNfcXVldWVkKSAhPSBzLT5idWZmZXJzKQogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlNvbWUgYnVmZmVycyBhcmUgc3RpbGwgb3duZWQgYnkgdGhlIGNhbGxlciBvbiAiCiAgICAgICAgICAgICAgICAiY2xvc2UuXG4iKTsKIApAQCAtMTA0MCwxMSArMTA0MiwxMyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICB3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkaXIpKSkgeworICAgICAgICBjaGFyIGRldmljZV9uYW1lWzI1Nl07CisKICAgICAgICAgaWYgKCF2NGwyX2lzX3Y0bF9kZXYoZW50cnktPmRfbmFtZSkpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBzbnByaW50ZihjdHgtPmZpbGVuYW1lLCBzaXplb2YoY3R4LT5maWxlbmFtZSksICIvZGV2LyVzIiwgZW50cnktPmRfbmFtZSk7Ci0gICAgICAgIGlmICgocy0+ZmQgPSBkZXZpY2Vfb3BlbihjdHgpKSA8IDApCisgICAgICAgIHNucHJpbnRmKGRldmljZV9uYW1lLCBzaXplb2YoZGV2aWNlX25hbWUpLCAiL2Rldi8lcyIsIGVudHJ5LT5kX25hbWUpOworICAgICAgICBpZiAoKHMtPmZkID0gZGV2aWNlX29wZW4oY3R4LCBkZXZpY2VfbmFtZSkpIDwgMCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIGlmICh2NGwyX2lvY3RsKHMtPmZkLCBWSURJT0NfUVVFUllDQVAsICZjYXApIDwgMCkgewpAQCAtMTA1OCw3ICsxMDYyLDcgQEAKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQotICAgICAgICBkZXZpY2UtPmRldmljZV9uYW1lID0gYXZfc3RyZHVwKGN0eC0+ZmlsZW5hbWUpOworICAgICAgICBkZXZpY2UtPmRldmljZV9uYW1lID0gYXZfc3RyZHVwKGRldmljZV9uYW1lKTsKICAgICAgICAgZGV2aWNlLT5kZXZpY2VfZGVzY3JpcHRpb24gPSBhdl9zdHJkdXAoY2FwLmNhcmQpOwogICAgICAgICBpZiAoIWRldmljZS0+ZGV2aWNlX25hbWUgfHwgIWRldmljZS0+ZGV2aWNlX2Rlc2NyaXB0aW9uKSB7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS92NGwyZW5jLmMgYi9saWJhdmRldmljZS92NGwyZW5jLmMKaW5kZXggYWM0MDY4Yy4uODUyMDBkMCAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UvdjRsMmVuYy5jCisrKyBiL2xpYmF2ZGV2aWNlL3Y0bDJlbmMuYwpAQCAtMzMsMzMgKzMzLDMzIEBACiAgICAgICAgIC50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQKICAgICB9OwogICAgIFY0TDJDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jX2N0eDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyOwogICAgIHVpbnQzMl90IHY0bDJfcGl4Zm10OwogCiAgICAgaWYgKHMxLT5mbGFncyAmIEFWRk1UX0ZMQUdfTk9OQkxPQ0spCiAgICAgICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CiAKLSAgICBzLT5mZCA9IG9wZW4oczEtPmZpbGVuYW1lLCBmbGFncyk7CisgICAgcy0+ZmQgPSBvcGVuKHMxLT51cmwsIGZsYWdzKTsKICAgICBpZiAocy0+ZmQgPCAwKSB7CiAgICAgICAgIHJlcyA9IEFWRVJST1IoZXJybm8pOwotICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBvcGVuIFY0TDIgZGV2aWNlICclcydcbiIsIHMxLT5maWxlbmFtZSk7CisgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG9wZW4gVjRMMiBkZXZpY2UgJyVzJ1xuIiwgczEtPnVybCk7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgaWYgKHMxLT5uYl9zdHJlYW1zICE9IDEgfHwKLSAgICAgICAgczEtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyB8fAotICAgICAgICBzMS0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkICAgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKKyAgICAgICAgczEtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyB8fAorICAgICAgICBzMS0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkICAgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiVjRMMiBvdXRwdXQgZGV2aWNlIHN1cHBvcnRzIG9ubHkgYSBzaW5nbGUgcmF3IHZpZGVvIHN0cmVhbVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgZW5jX2N0eCA9IHMxLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBwYXIgPSBzMS0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAKLSAgICB2NGwyX3BpeGZtdCA9IGZmX2ZtdF9mZjJ2NGwoZW5jX2N0eC0+cGl4X2ZtdCwgQVZfQ09ERUNfSURfUkFXVklERU8pOworICAgIHY0bDJfcGl4Zm10ID0gZmZfZm10X2ZmMnY0bChwYXItPmZvcm1hdCwgQVZfQ09ERUNfSURfUkFXVklERU8pOwogICAgIGlmICghdjRsMl9waXhmbXQpIHsgLy8gWFhYOiB0cnkgdG8gZm9yY2UgdGhlbSBvbmUgYnkgb25lPwogICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlVua25vd24gVjRMMiBwaXhlbCBmb3JtYXQgZXF1aXZhbGVudCBmb3IgJXNcbiIsCi0gICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGVuY19jdHgtPnBpeF9mbXQpKTsKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocGFyLT5mb3JtYXQpKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKQEAgLTY5LDEwICs2OSwxMCBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIGZtdC5mbXQucGl4LndpZHRoICAgICAgID0gZW5jX2N0eC0+d2lkdGg7Ci0gICAgZm10LmZtdC5waXguaGVpZ2h0ICAgICAgPSBlbmNfY3R4LT5oZWlnaHQ7CisgICAgZm10LmZtdC5waXgud2lkdGggICAgICAgPSBwYXItPndpZHRoOworICAgIGZtdC5mbXQucGl4LmhlaWdodCAgICAgID0gcGFyLT5oZWlnaHQ7CiAgICAgZm10LmZtdC5waXgucGl4ZWxmb3JtYXQgPSB2NGwyX3BpeGZtdDsKLSAgICBmbXQuZm10LnBpeC5zaXplaW1hZ2UgICA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShlbmNfY3R4LT5waXhfZm10LCBlbmNfY3R4LT53aWR0aCwgZW5jX2N0eC0+aGVpZ2h0LCAxKTsKKyAgICBmbXQuZm10LnBpeC5zaXplaW1hZ2UgICA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShwYXItPmZvcm1hdCwgcGFyLT53aWR0aCwgcGFyLT5oZWlnaHQsIDEpOwogCiAgICAgaWYgKGlvY3RsKHMtPmZkLCBWSURJT0NfU19GTVQsICZmbXQpIDwgMCkgewogICAgICAgICByZXMgPSBBVkVSUk9SKGVycm5vKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL3ZlcnNpb24uaCBiL2xpYmF2ZGV2aWNlL3ZlcnNpb24uaAppbmRleCBiMjI2YTc2Li5kYmZiZmQwIDEwMDY0NAotLS0gYS9saWJhdmRldmljZS92ZXJzaW9uLmgKKysrIGIvbGliYXZkZXZpY2UvdmVyc2lvbi5oCkBAIC0yNyw5ICsyNyw5IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvdmVyc2lvbi5oIgogCi0jZGVmaW5lIExJQkFWREVWSUNFX1ZFUlNJT05fTUFKT1IgIDU3Ci0jZGVmaW5lIExJQkFWREVWSUNFX1ZFUlNJT05fTUlOT1IgICAwCi0jZGVmaW5lIExJQkFWREVWSUNFX1ZFUlNJT05fTUlDUk8gMTAxCisjZGVmaW5lIExJQkFWREVWSUNFX1ZFUlNJT05fTUFKT1IgIDU4CisjZGVmaW5lIExJQkFWREVWSUNFX1ZFUlNJT05fTUlOT1IgICAzCisjZGVmaW5lIExJQkFWREVWSUNFX1ZFUlNJT05fTUlDUk8gMTAwCiAKICNkZWZpbmUgTElCQVZERVZJQ0VfVkVSU0lPTl9JTlQgQVZfVkVSU0lPTl9JTlQoTElCQVZERVZJQ0VfVkVSU0lPTl9NQUpPUiwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJBVkRFVklDRV9WRVJTSU9OX01JTk9SLCBcCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS92ZndjYXAuYyBiL2xpYmF2ZGV2aWNlL3Zmd2NhcC5jCmluZGV4IGUxZjhiODYuLjZhOTIzZDkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZGV2aWNlL3Zmd2NhcC5jCisrKyBiL2xpYmF2ZGV2aWNlL3Zmd2NhcC5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIHN0YXRpYyBpbnQgc2hhbGxfd2VfZHJvcChBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgc3RydWN0IHZmd19jdHggKmN0eCA9IHMtPnByaXZfZGF0YTsKLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkcm9wc2NvcmVbXSA9IHs2MiwgNzUsIDg3LCAxMDB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRyb3BzY29yZVs0XSA9IHsgNjIsIDc1LCA4NywgMTAwIH07CiAgICAgY29uc3QgaW50IG5kcm9wc2NvcmVzID0gRkZfQVJSQVlfRUxFTVMoZHJvcHNjb3JlKTsKICAgICB1bnNpZ25lZCBpbnQgYnVmZmVyX2Z1bGxuZXNzID0gKGN0eC0+Y3VyYnVmc2l6ZSoxMDApL3MtPm1heF9waWN0dXJlX2J1ZmZlcjsKIApAQCAtMjQ1LDcgKzI0NSw3IEBACiBzdGF0aWMgaW50IHZmd19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgc3RydWN0IHZmd19jdHggKmN0eCA9IHMtPnByaXZfZGF0YTsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBBVlN0cmVhbSAqc3Q7CiAgICAgaW50IGRldm51bTsKICAgICBpbnQgYmlzaXplOwpAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgaW50IHJldDsKICAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZV9xOwogCi0gICAgaWYgKCFzdHJjbXAocy0+ZmlsZW5hbWUsICJsaXN0IikpIHsKKyAgICBpZiAoIXN0cmNtcChzLT51cmwsICJsaXN0IikpIHsKICAgICAgICAgZm9yIChkZXZudW0gPSAwOyBkZXZudW0gPD0gOTsgZGV2bnVtKyspIHsKICAgICAgICAgICAgIGNoYXIgZHJpdmVyX25hbWVbMjU2XTsKICAgICAgICAgICAgIGNoYXIgZHJpdmVyX3ZlclsyNTZdOwpAQCAtMjc5LDcgKzI3OSw3IEBACiAgICAgfQogCiAgICAgLyogSWYgYXRvaSBmYWlscywgZGV2bnVtPT0wIGFuZCB0aGUgZGVmYXVsdCBkZXZpY2UgaXMgdXNlZCAqLwotICAgIGRldm51bSA9IGF0b2kocy0+ZmlsZW5hbWUpOworICAgIGRldm51bSA9IGF0b2kocy0+dXJsKTsKIAogICAgIHJldCA9IFNlbmRNZXNzYWdlKGN0eC0+aHduZCwgV01fQ0FQX0RSSVZFUl9DT05ORUNULCBkZXZudW0sIDApOwogICAgIGlmKCFyZXQpIHsKQEAgLTM3NywyOSArMzc3LDI5IEBACiAgICAgaWYoIXJldCkKICAgICAgICAgZ290byBmYWlsOwogCi0gICAgY29kZWMgPSBzdC0+Y29kZWM7Ci0gICAgY29kZWMtPnRpbWVfYmFzZSA9IGF2X2ludl9xKGZyYW1lcmF0ZV9xKTsKLSAgICBjb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBjb2RlYy0+d2lkdGggID0gYmktPmJtaUhlYWRlci5iaVdpZHRoOwotICAgIGNvZGVjLT5oZWlnaHQgPSBiaS0+Ym1pSGVhZGVyLmJpSGVpZ2h0OwotICAgIGNvZGVjLT5waXhfZm10ID0gdmZ3X3BpeGZtdChiaUNvbXByZXNzaW9uLCBiaUJpdENvdW50KTsKLSAgICBpZihjb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKLSAgICAgICAgY29kZWMtPmNvZGVjX2lkID0gdmZ3X2NvZGVjaWQoYmlDb21wcmVzc2lvbik7Ci0gICAgICAgIGlmKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb21wcmVzc2lvbiB0eXBlLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgcmVwb3J0IHZlcmJvc2UgKC12IDkpIGRlYnVnIGluZm9ybWF0aW9uLlxuIik7CisgICAgc3QtPmF2Z19mcmFtZV9yYXRlID0gZnJhbWVyYXRlX3E7CisKKyAgICBwYXIgPSBzdC0+Y29kZWNwYXI7CisgICAgcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHBhci0+d2lkdGggID0gYmktPmJtaUhlYWRlci5iaVdpZHRoOworICAgIHBhci0+aGVpZ2h0ID0gYmktPmJtaUhlYWRlci5iaUhlaWdodDsKKyAgICBwYXItPmZvcm1hdCA9IHZmd19waXhmbXQoYmlDb21wcmVzc2lvbiwgYmlCaXRDb3VudCk7CisgICAgaWYgKHBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICBwYXItPmNvZGVjX2lkID0gdmZ3X2NvZGVjaWQoYmlDb21wcmVzc2lvbik7CisgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMsICJUaGlzIGNvbXByZXNzaW9uIHR5cGUiKTsKICAgICAgICAgICAgIHZmd19yZWFkX2Nsb3NlKHMpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9Ci0gICAgICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaUJpdENvdW50OworICAgICAgICBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJpQml0Q291bnQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgICAgIHBhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKICAgICAgICAgaWYoYmlDb21wcmVzc2lvbiA9PSBCSV9SR0IpIHsKLSAgICAgICAgICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaUJpdENvdW50OwotICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyg5ICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgICAgICBpZiAoY29kZWMtPmV4dHJhZGF0YSkgewotICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjLT5leHRyYWRhdGEsICJCb3R0b21VcCIsIDkpOworICAgICAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaUJpdENvdW50OworICAgICAgICAgICAgcGFyLT5leHRyYWRhdGEgPSBhdl9tYWxsb2MoOSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKHBhci0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBhci0+ZXh0cmFkYXRhLCAiQm90dG9tVXAiLCA5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZGV2aWNlL3gxMWdyYWIuYyBiL2xpYmF2ZGV2aWNlL3gxMWdyYWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjMzQ3Mi4uMDAwMDAwMAotLS0gYS9saWJhdmRldmljZS94MTFncmFiLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTUgKzAsMCBAQAotLyoKLSAqIFgxMSB2aWRlbyBncmFiIGludGVyZmFjZQotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaW50ZWdyYXRpb246Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDYgQ2xlbWVucyBGcnVod2lydGggPGNsZW1lbnNAZW5kb3JwaGluLm9yZz4KLSAqICAgICAgICAgICAgICAgICAgICBFZG91YXJkIEdvbWV6IDxlZC5nb21lekBmcmVlLmZyPgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBjb2RlIGZyb20gZ3JhYi5jOgotICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMDEgRmFicmljZSBCZWxsYXJkCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvZGUgZnJvbSB0aGUgeHZpZGNhcCBwcm9qZWN0OgotICogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTggUmFzY2EsIEJlcmxpbgotICogICAgICAgICAgICAgICAyMDAzLTIwMDQgS2FybCBILiBCZWNrZXJzLCBGcmFua2Z1cnQKLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogWDExIGZyYW1lIGRldmljZSBkZW11eGVyCi0gKiBAYXV0aG9yIENsZW1lbnMgRnJ1aHdpcnRoIDxjbGVtZW5zQGVuZG9ycGhpbi5vcmc+Ci0gKiBAYXV0aG9yIEVkb3VhcmQgR29tZXogPGVkLmdvbWV6QGZyZWUuZnI+Ci0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHN5cy9zaG0uaD4KLQotI2luY2x1ZGUgPFgxMS9jdXJzb3Jmb250Lmg+Ci0jaW5jbHVkZSA8WDExL1guaD4KLSNpbmNsdWRlIDxYMTEvWGxpYi5oPgotI2luY2x1ZGUgPFgxMS9YbGliaW50Lmg+Ci0jaW5jbHVkZSA8WDExL1hwcm90by5oPgotI2luY2x1ZGUgPFgxMS9YdXRpbC5oPgotCi0jaW5jbHVkZSA8WDExL2V4dGVuc2lvbnMvc2hhcGUuaD4KLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YZml4ZXMuaD4KLSNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YU2htLmg+Ci0KLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKLQotI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2ludGVybmFsLmgiCi0KLSNpbmNsdWRlICJhdmRldmljZS5oIgotCi0vKiogWDExIGRldmljZSBkZW11eGVyIGNvbnRleHQgKi8KLXR5cGVkZWYgc3RydWN0IFgxMUdyYWJDb250ZXh0IHsKLSAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgICAgLyoqPCBDbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zLiAqLwotICAgIGludCBmcmFtZV9zaXplOyAgICAgICAgICAvKio8IFNpemUgaW4gYnl0ZXMgb2YgYSBncmFiYmVkIGZyYW1lICovCi0gICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7ICAgIC8qKjwgVGltZSBiYXNlICovCi0gICAgaW50NjRfdCB0aW1lX2ZyYW1lOyAgICAgIC8qKjwgQ3VycmVudCB0aW1lICovCi0KLSAgICBpbnQgd2lkdGg7ICAgICAgICAgICAgICAgLyoqPCBXaWR0aCBvZiB0aGUgZ3JhYiBmcmFtZSAqLwotICAgIGludCBoZWlnaHQ7ICAgICAgICAgICAgICAvKio8IEhlaWdodCBvZiB0aGUgZ3JhYiBmcmFtZSAqLwotICAgIGludCB4X29mZjsgICAgICAgICAgICAgICAvKio8IEhvcml6b250YWwgdG9wLWxlZnQgY29ybmVyIGNvb3JkaW5hdGUgKi8KLSAgICBpbnQgeV9vZmY7ICAgICAgICAgICAgICAgLyoqPCBWZXJ0aWNhbCB0b3AtbGVmdCBjb3JuZXIgY29vcmRpbmF0ZSAqLwotCi0gICAgRGlzcGxheSAqZHB5OyAgICAgICAgICAgIC8qKjwgWDExIGRpc3BsYXkgZnJvbSB3aGljaCB4MTFncmFiIGdyYWJzIGZyYW1lcyAqLwotICAgIFhJbWFnZSAqaW1hZ2U7ICAgICAgICAgICAvKio8IFgxMSBpbWFnZSBob2xkaW5nIHRoZSBncmFiICovCi0gICAgaW50IHVzZV9zaG07ICAgICAgICAgICAgIC8qKjwgITAgd2hlbiB1c2luZyBYU2htIGV4dGVuc2lvbiAqLwotICAgIFhTaG1TZWdtZW50SW5mbyBzaG1pbmZvOyAvKio8IFdoZW4gdXNpbmcgWFNobSwga2VlcHMgdHJhY2sgb2YgWFNobSBpbmZvcyAqLwotICAgIGludCBkcmF3X21vdXNlOyAgICAgICAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLwotICAgIGludCBmb2xsb3dfbW91c2U7ICAgICAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLwotICAgIGludCBzaG93X3JlZ2lvbjsgICAgICAgICAvKio8IHNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLwotICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgICAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLwotICAgIGludCBwYWxldHRlX2NoYW5nZWQ7Ci0gICAgdWludDMyX3QgcGFsZXR0ZVsyNTZdOwotCi0gICAgQ3Vyc29yIGM7Ci0gICAgV2luZG93IHJlZ2lvbl93aW47ICAgICAgIC8qKjwgVGhpcyBpcyB1c2VkIGJ5IHNob3dfcmVnaW9uIG9wdGlvbi4gKi8KLX0gWDExR3JhYkNvbnRleHQ7Ci0KLSNkZWZpbmUgUkVHSU9OX1dJTl9CT1JERVIgMwotCi0vKioKLSAqIERyYXcgZ3JhYmJpbmcgcmVnaW9uIHdpbmRvdwotICoKLSAqIEBwYXJhbSBzIHgxMWdyYWIgY29udGV4dAotICovCi1zdGF0aWMgdm9pZCB4MTFncmFiX2RyYXdfcmVnaW9uX3dpbihYMTFHcmFiQ29udGV4dCAqcykKLXsKLSAgICBEaXNwbGF5ICpkcHkgPSBzLT5kcHk7Ci0gICAgV2luZG93IHdpbiAgID0gcy0+cmVnaW9uX3dpbjsKLSAgICBpbnQgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkcHkpOwotICAgIEdDIGdjID0gWENyZWF0ZUdDKGRweSwgd2luLCAwLCAwKTsKLQotICAgIFhTZXRGb3JlZ3JvdW5kKGRweSwgZ2MsIFdoaXRlUGl4ZWwoZHB5LCBzY3JlZW4pKTsKLSAgICBYU2V0QmFja2dyb3VuZChkcHksIGdjLCBCbGFja1BpeGVsKGRweSwgc2NyZWVuKSk7Ci0gICAgWFNldExpbmVBdHRyaWJ1dGVzKGRweSwgZ2MsIFJFR0lPTl9XSU5fQk9SREVSLCBMaW5lRG91YmxlRGFzaCwgMCwgMCk7Ci0gICAgWERyYXdSZWN0YW5nbGUoZHB5LCB3aW4sIGdjLCAxLCAxLAotICAgICAgICAgICAgICAgICAgIChzLT53aWR0aCAgKyBSRUdJT05fV0lOX0JPUkRFUiAqIDIpIC0gMSAqIDIgLSAxLAotICAgICAgICAgICAgICAgICAgIChzLT5oZWlnaHQgKyBSRUdJT05fV0lOX0JPUkRFUiAqIDIpIC0gMSAqIDIgLSAxKTsKLSAgICBYRnJlZUdDKGRweSwgZ2MpOwotfQotCi0vKioKLSAqIEluaXRpYWxpemUgZ3JhYmJpbmcgcmVnaW9uIHdpbmRvdwotICoKLSAqIEBwYXJhbSBzIHgxMWdyYWIgY29udGV4dAotICovCi1zdGF0aWMgdm9pZCB4MTFncmFiX3JlZ2lvbl93aW5faW5pdChYMTFHcmFiQ29udGV4dCAqcykKLXsKLSAgICBEaXNwbGF5ICpkcHkgPSBzLT5kcHk7Ci0gICAgWFJlY3RhbmdsZSByZWN0OwotICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHJpYnMgPSB7IC5vdmVycmlkZV9yZWRpcmVjdCA9IFRydWUgfTsKLSAgICBpbnQgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkcHkpOwotCi0gICAgcy0+cmVnaW9uX3dpbiA9IFhDcmVhdGVXaW5kb3coZHB5LCBSb290V2luZG93KGRweSwgc2NyZWVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT54X29mZiAgLSBSRUdJT05fV0lOX0JPUkRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT55X29mZiAgLSBSRUdJT05fV0lOX0JPUkRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aWR0aCAgKyBSRUdJT05fV0lOX0JPUkRFUiAqIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGVpZ2h0ICsgUkVHSU9OX1dJTl9CT1JERVIgKiAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIENvcHlGcm9tUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0T3V0cHV0LCBDb3B5RnJvbVBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDV092ZXJyaWRlUmVkaXJlY3QsICZhdHRyaWJzKTsKLSAgICByZWN0LnggICAgICA9IDA7Ci0gICAgcmVjdC55ICAgICAgPSAwOwotICAgIHJlY3Qud2lkdGggID0gcy0+d2lkdGg7Ci0gICAgcmVjdC5oZWlnaHQgPSBzLT5oZWlnaHQ7Ci0gICAgWFNoYXBlQ29tYmluZVJlY3RhbmdsZXMoZHB5LCBzLT5yZWdpb25fd2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYXBlQm91bmRpbmcsIFJFR0lPTl9XSU5fQk9SREVSLCBSRUdJT05fV0lOX0JPUkRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdCwgMSwgU2hhcGVTdWJ0cmFjdCwgMCk7Ci0gICAgWE1hcFdpbmRvdyhkcHksIHMtPnJlZ2lvbl93aW4pOwotICAgIFhTZWxlY3RJbnB1dChkcHksIHMtPnJlZ2lvbl93aW4sIEV4cG9zdXJlTWFzayB8IFN0cnVjdHVyZU5vdGlmeU1hc2spOwotICAgIHgxMWdyYWJfZHJhd19yZWdpb25fd2luKHMpOwotfQotCi1zdGF0aWMgaW50IHNldHVwX3NobShBVkZvcm1hdENvbnRleHQgKnMsIERpc3BsYXkgKmRweSwgWEltYWdlICoqaW1hZ2UpCi17Ci0gICAgWDExR3JhYkNvbnRleHQgKmcgPSBzLT5wcml2X2RhdGE7Ci0gICAgaW50IHNjciAgICAgICAgICAgPSBYRGVmYXVsdFNjcmVlbihkcHkpOwotICAgIFhJbWFnZSAqaW1nICAgICAgID0gWFNobUNyZWF0ZUltYWdlKGRweSwgRGVmYXVsdFZpc3VhbChkcHksIHNjciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdERlcHRoKGRweSwgc2NyKSwgWlBpeG1hcCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZy0+c2htaW5mbywgZy0+d2lkdGgsIGctPmhlaWdodCk7Ci0KLSAgICBnLT5zaG1pbmZvLnNobWlkID0gc2htZ2V0KElQQ19QUklWQVRFLCBpbWctPmJ5dGVzX3Blcl9saW5lICogaW1nLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENfQ1JFQVQgfCAwNzc3KTsKLQotICAgIGlmIChnLT5zaG1pbmZvLnNobWlkID09IC0xKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgZ2V0IHNoYXJlZCBtZW1vcnkhXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICBnLT5zaG1pbmZvLnNobWFkZHIgID0gaW1nLT5kYXRhID0gc2htYXQoZy0+c2htaW5mby5zaG1pZCwgMCwgMCk7Ci0gICAgZy0+c2htaW5mby5yZWFkT25seSA9IEZhbHNlOwotCi0gICAgaWYgKCFYU2htQXR0YWNoKGRweSwgJmctPnNobWluZm8pKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYXR0YWNoIHNoYXJlZCBtZW1vcnkhXG4iKTsKLSAgICAgICAgLyogbmVlZHMgc29tZSBiZXR0ZXIgZXJyb3Igc3Vicm91dGluZSA6KSAqLwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgIH0KLQotICAgICppbWFnZSA9IGltZzsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZXR1cF9tb3VzZShEaXNwbGF5ICpkcHksIGludCBzY3JlZW4pCi17Ci0gICAgaW50IGV2X3JldCwgZXZfZXJyOwotCi0gICAgaWYgKFhGaXhlc1F1ZXJ5RXh0ZW5zaW9uKGRweSwgJmV2X3JldCwgJmV2X2VycikpIHsKLSAgICAgICAgV2luZG93IHJvb3QgPSBSb290V2luZG93KGRweSwgc2NyZWVuKTsKLSAgICAgICAgWEZpeGVzU2VsZWN0Q3Vyc29ySW5wdXQoZHB5LCByb290LCBYRml4ZXNEaXNwbGF5Q3Vyc29yTm90aWZ5TWFzayk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7Ci19Ci0KLXN0YXRpYyBpbnQgcGl4Zm10X2Zyb21faW1hZ2UoQVZGb3JtYXRDb250ZXh0ICpzLCBYSW1hZ2UgKmltYWdlLCBpbnQgKnBpeF9mbXQpCi17Ci0gICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKLSAgICAgICAgICAgIkltYWdlIHIgMHglLjZseCBnIDB4JS42bHggYiAweCUuNmx4IGFuZCBkZXB0aCAlaVxuIiwKLSAgICAgICAgICAgaW1hZ2UtPnJlZF9tYXNrLAotICAgICAgICAgICBpbWFnZS0+Z3JlZW5fbWFzaywKLSAgICAgICAgICAgaW1hZ2UtPmJsdWVfbWFzaywKLSAgICAgICAgICAgaW1hZ2UtPmJpdHNfcGVyX3BpeGVsKTsKLQotICAgICpwaXhfZm10ID0gQVZfUElYX0ZNVF9OT05FOwotCi0gICAgc3dpdGNoIChpbWFnZS0+Yml0c19wZXJfcGl4ZWwpIHsKLSAgICBjYXNlIDg6Ci0gICAgICAgICpwaXhfZm10ID0gIEFWX1BJWF9GTVRfUEFMODsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjoKLSAgICAgICAgaWYgKGltYWdlLT5yZWRfbWFzayAgID09IDB4ZjgwMCAmJgotICAgICAgICAgICAgaW1hZ2UtPmdyZWVuX21hc2sgPT0gMHgwN2UwICYmCi0gICAgICAgICAgICBpbWFnZS0+Ymx1ZV9tYXNrICA9PSAweDAwMWYpIHsKLSAgICAgICAgICAgICpwaXhfZm10ID0gQVZfUElYX0ZNVF9SR0I1NjU7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UtPnJlZF9tYXNrICAgPT0gMHg3YzAwICYmCi0gICAgICAgICAgICAgICAgICAgaW1hZ2UtPmdyZWVuX21hc2sgPT0gMHgwM2UwICYmCi0gICAgICAgICAgICAgICAgICAgaW1hZ2UtPmJsdWVfbWFzayAgPT0gMHgwMDFmKSB7Ci0gICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCNTU1OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMjQ6Ci0gICAgICAgIGlmIChpbWFnZS0+cmVkX21hc2sgICA9PSAweGZmMDAwMCAmJgotICAgICAgICAgICAgaW1hZ2UtPmdyZWVuX21hc2sgPT0gMHgwMGZmMDAgJiYKLSAgICAgICAgICAgIGltYWdlLT5ibHVlX21hc2sgID09IDB4MDAwMGZmKSB7Ci0gICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UtPnJlZF9tYXNrICAgPT0gMHgwMDAwZmYgJiYKLSAgICAgICAgICAgICAgICAgICBpbWFnZS0+Z3JlZW5fbWFzayA9PSAweDAwZmYwMCAmJgotICAgICAgICAgICAgICAgICAgIGltYWdlLT5ibHVlX21hc2sgID09IDB4ZmYwMDAwKSB7Ci0gICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMjoKLSAgICAgICAgaWYgKGltYWdlLT5yZWRfbWFzayAgID09IDB4ZmYwMDAwICYmCi0gICAgICAgICAgICBpbWFnZS0+Z3JlZW5fbWFzayA9PSAweDAwZmYwMCAmJgotICAgICAgICAgICAgaW1hZ2UtPmJsdWVfbWFzayAgPT0gMHgwMDAwZmYgKSB7Ci0gICAgICAgICAgICAqcGl4X2ZtdCA9IEFWX1BJWF9GTVRfMFJHQjMyOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoKnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiWEltYWdlcyB3aXRoIFJHQiBtYXNrIDB4JS42bHggMHglLjZseCAweCUuNmx4IGFuZCBkZXB0aCAlaSAiCi0gICAgICAgICAgICAgICAiYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuIiwKLSAgICAgICAgICAgICAgIGltYWdlLT5yZWRfbWFzaywKLSAgICAgICAgICAgICAgIGltYWdlLT5ncmVlbl9tYXNrLAotICAgICAgICAgICAgICAgaW1hZ2UtPmJsdWVfbWFzaywKLSAgICAgICAgICAgICAgIGltYWdlLT5iaXRzX3Blcl9waXhlbCk7Ci0KLSAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioKLSAqIEluaXRpYWxpemUgdGhlIHgxMSBncmFiIGRldmljZSBkZW11eGVyIChwdWJsaWMgZGV2aWNlIGRlbXV4ZXIgQVBJKS4KLSAqCi0gKiBAcGFyYW0gczEgQ29udGV4dCBmcm9tIGF2Zm9ybWF0IGNvcmUKLSAqIEByZXR1cm4gPHVsPgotICogICAgICAgICAgPGxpPkFWRVJST1IoRU5PTUVNKSBubyBtZW1vcnkgbGVmdDwvbGk+Ci0gKiAgICAgICAgICA8bGk+QVZFUlJPUihFSU8pIG90aGVyIGZhaWx1cmUgY2FzZTwvbGk+Ci0gKiAgICAgICAgICA8bGk+MCBzdWNjZXNzPC9saT4KLSAqICAgICAgICAgPC91bD4KLSAqLwotc3RhdGljIGludCB4MTFncmFiX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqczEpCi17Ci0gICAgWDExR3JhYkNvbnRleHQgKngxMWdyYWIgPSBzMS0+cHJpdl9kYXRhOwotICAgIERpc3BsYXkgKmRweTsKLSAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOwotICAgIFhJbWFnZSAqaW1hZ2U7Ci0gICAgaW50IHhfb2ZmID0gMCwgeV9vZmYgPSAwLCByZXQgPSAwLCBzY3JlZW4sIHVzZV9zaG0gPSAwOwotICAgIGNoYXIgKmRweW5hbWUsICpvZmZzZXQ7Ci0gICAgQ29sb3JtYXAgY29sb3JfbWFwOwotICAgIFhDb2xvciBjb2xvclsyNTZdOwotICAgIGludCBpOwotCi0gICAgZHB5bmFtZSA9IGF2X3N0cmR1cChzMS0+ZmlsZW5hbWUpOwotICAgIGlmICghZHB5bmFtZSkKLSAgICAgICAgZ290byBvdXQ7Ci0KLSAgICBvZmZzZXQgPSBzdHJjaHIoZHB5bmFtZSwgJysnKTsKLSAgICBpZiAob2Zmc2V0KSB7Ci0gICAgICAgIHNzY2FuZihvZmZzZXQsICIlZCwlZCIsICZ4X29mZiwgJnlfb2ZmKTsKLSAgICAgICAgaWYgKHN0cnN0cihvZmZzZXQsICJub21vdXNlIikpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgIidub21vdXNlJyBzcGVjaWZpY2F0aW9uIGluIGFyZ3VtZW50IGlzIGRlcHJlY2F0ZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAidXNlICdkcmF3X21vdXNlJyBvcHRpb24gd2l0aCB2YWx1ZSAwIGluc3RlYWRcbiIpOwotICAgICAgICAgICAgeDExZ3JhYi0+ZHJhd19tb3VzZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgKm9mZnNldCA9IDA7Ci0gICAgfQotCi0gICAgYXZfbG9nKHMxLCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgImRldmljZTogJXMgLT4gZGlzcGxheTogJXMgeDogJWQgeTogJWQgd2lkdGg6ICVkIGhlaWdodDogJWRcbiIsCi0gICAgICAgICAgIHMxLT5maWxlbmFtZSwgZHB5bmFtZSwgeF9vZmYsIHlfb2ZmLCB4MTFncmFiLT53aWR0aCwgeDExZ3JhYi0+aGVpZ2h0KTsKLQotICAgIGRweSA9IFhPcGVuRGlzcGxheShkcHluYW1lKTsKLSAgICBhdl9mcmVlcCgmZHB5bmFtZSk7Ci0gICAgaWYgKCFkcHkpIHsKLSAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBYIGRpc3BsYXkuXG4iKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0KLSAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oczEsIE5VTEwpOwotICAgIGlmICghc3QpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOyAvKiA2NCBiaXRzIHB0cyBpbiB1cyAqLwotCi0gICAgc2NyZWVuID0gRGVmYXVsdFNjcmVlbihkcHkpOwotCi0gICAgaWYgKHgxMWdyYWItPmZvbGxvd19tb3VzZSkgewotICAgICAgICBpbnQgc2NyZWVuX3csIHNjcmVlbl9oOwotICAgICAgICBXaW5kb3cgdzsKLQotICAgICAgICBzY3JlZW5fdyA9IERpc3BsYXlXaWR0aChkcHksIHNjcmVlbik7Ci0gICAgICAgIHNjcmVlbl9oID0gRGlzcGxheUhlaWdodChkcHksIHNjcmVlbik7Ci0gICAgICAgIFhRdWVyeVBvaW50ZXIoZHB5LCBSb290V2luZG93KGRweSwgc2NyZWVuKSwgJncsICZ3LCAmeF9vZmYsICZ5X29mZiwKLSAgICAgICAgICAgICAgICAgICAgICAmcmV0LCAmcmV0LCAmcmV0KTsKLSAgICAgICAgeF9vZmYgLT0geDExZ3JhYi0+d2lkdGggLyAyOwotICAgICAgICB5X29mZiAtPSB4MTFncmFiLT5oZWlnaHQgLyAyOwotICAgICAgICB4X29mZiA9IGF2X2NsaXAoeF9vZmYsIDAsIHNjcmVlbl93IC0geDExZ3JhYi0+d2lkdGgpOwotICAgICAgICB5X29mZiA9IGF2X2NsaXAoeV9vZmYsIDAsIHNjcmVlbl9oIC0geDExZ3JhYi0+aGVpZ2h0KTsKLSAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICJmb2xsb3dtb3VzZSBpcyBlbmFibGVkLCByZXNldHRpbmcgZ3JhYmJpbmcgcmVnaW9uIHRvIHg6ICVkIHk6ICVkXG4iLAotICAgICAgICAgICAgICAgeF9vZmYsIHlfb2ZmKTsKLSAgICB9Ci0KLSAgICBpZiAoeDExZ3JhYi0+dXNlX3NobSkgewotICAgICAgICB1c2Vfc2htID0gWFNobVF1ZXJ5RXh0ZW5zaW9uKGRweSk7Ci0gICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAic2hhcmVkIG1lbW9yeSBleHRlbnNpb24gJXNmb3VuZFxuIiwgdXNlX3NobSA/ICIiIDogIm5vdCAiKTsKLSAgICB9Ci0KLSAgICBpZiAodXNlX3NobSAmJiBzZXR1cF9zaG0oczEsIGRweSwgJmltYWdlKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfV0FSTklORywgIkZhbGxpbmcgYmFjayB0byBYR2V0SW1hZ2VcbiIpOwotICAgICAgICB1c2Vfc2htID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoIXVzZV9zaG0pIHsKLSAgICAgICAgaW1hZ2UgPSBYR2V0SW1hZ2UoZHB5LCBSb290V2luZG93KGRweSwgc2NyZWVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgeF9vZmYsIHlfb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICB4MTFncmFiLT53aWR0aCwgeDExZ3JhYi0+aGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxQbGFuZXMsIFpQaXhtYXApOwotICAgIH0KLQotICAgIGlmICh4MTFncmFiLT5kcmF3X21vdXNlICYmIHNldHVwX21vdXNlKGRweSwgc2NyZWVuKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICJYRml4ZXMgbm90IGF2YWlsYWJsZSwgY2Fubm90IGRyYXcgdGhlIG1vdXNlIGN1cnNvclxuIik7Ci0gICAgICAgIHgxMWdyYWItPmRyYXdfbW91c2UgPSAwOwotICAgIH0KLQotICAgIHgxMWdyYWItPmZyYW1lX3NpemUgPSB4MTFncmFiLT53aWR0aCAqIHgxMWdyYWItPmhlaWdodCAqIGltYWdlLT5iaXRzX3Blcl9waXhlbCAvIDg7Ci0gICAgeDExZ3JhYi0+ZHB5ICAgICAgICA9IGRweTsKLSAgICB4MTFncmFiLT50aW1lX2Jhc2UgID0gYXZfaW52X3EoeDExZ3JhYi0+ZnJhbWVyYXRlKTsKLSAgICB4MTFncmFiLT50aW1lX2ZyYW1lID0gYXZfZ2V0dGltZSgpIC8gYXZfcTJkKHgxMWdyYWItPnRpbWVfYmFzZSk7Ci0gICAgeDExZ3JhYi0+eF9vZmYgICAgICA9IHhfb2ZmOwotICAgIHgxMWdyYWItPnlfb2ZmICAgICAgPSB5X29mZjsKLSAgICB4MTFncmFiLT5pbWFnZSAgICAgID0gaW1hZ2U7Ci0gICAgeDExZ3JhYi0+dXNlX3NobSAgICA9IHVzZV9zaG07Ci0KLSAgICByZXQgPSBwaXhmbXRfZnJvbV9pbWFnZShzMSwgaW1hZ2UsICZzdC0+Y29kZWMtPnBpeF9mbXQpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIG91dDsKLQotICAgIGlmIChzdC0+Y29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7Ci0gICAgICAgIGNvbG9yX21hcCA9IERlZmF1bHRDb2xvcm1hcChkcHksIHNjcmVlbik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKLSAgICAgICAgICAgIGNvbG9yW2ldLnBpeGVsID0gaTsKLSAgICAgICAgWFF1ZXJ5Q29sb3JzKGRweSwgY29sb3JfbWFwLCBjb2xvciwgMjU2KTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKQotICAgICAgICAgICAgeDExZ3JhYi0+cGFsZXR0ZVtpXSA9IChjb2xvcltpXS5yZWQgICAmIDB4RkYwMCkgPDwgOCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yW2ldLmdyZWVuICYgMHhGRjAwKSAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29sb3JbaV0uYmx1ZSAgJiAweEZGMDApID4+IDg7Ci0gICAgICAgIHgxMWdyYWItPnBhbGV0dGVfY2hhbmdlZCA9IDE7Ci0gICAgfQotCi0KLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU87Ci0gICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0geDExZ3JhYi0+d2lkdGg7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0geDExZ3JhYi0+aGVpZ2h0OwotICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlICA9IHgxMWdyYWItPnRpbWVfYmFzZTsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgPSB4MTFncmFiLT5mcmFtZV9zaXplICogMSAvIGF2X3EyZCh4MTFncmFiLT50aW1lX2Jhc2UpICogODsKLQotb3V0OgotICAgIGF2X2ZyZWUoZHB5bmFtZSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBQYWludCBhIG1vdXNlIHBvaW50ZXIgaW4gYW4gWDExIGltYWdlLgotICoKLSAqIEBwYXJhbSBpbWFnZSBpbWFnZSB0byBwYWludCB0aGUgbW91c2UgcG9pbnRlciB0bwotICogQHBhcmFtIHMgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIG9yaWdpbmFsIGdyYWJiaW5nIHJlY3RhbmdsZQotICogICAgICAgICAgY29vcmRpbmF0ZXMKLSAqLwotc3RhdGljIHZvaWQgcGFpbnRfbW91c2VfcG9pbnRlcihYSW1hZ2UgKmltYWdlLCBBVkZvcm1hdENvbnRleHQgKnMxKQotewotICAgIFgxMUdyYWJDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKLSAgICBpbnQgeF9vZmYgICAgPSBzLT54X29mZjsKLSAgICBpbnQgeV9vZmYgICAgPSBzLT55X29mZjsKLSAgICBpbnQgd2lkdGggICAgPSBzLT53aWR0aDsKLSAgICBpbnQgaGVpZ2h0ICAgPSBzLT5oZWlnaHQ7Ci0gICAgRGlzcGxheSAqZHB5ID0gcy0+ZHB5OwotICAgIFhGaXhlc0N1cnNvckltYWdlICp4Y2ltOwotICAgIGludCB4LCB5OwotICAgIGludCBsaW5lLCBjb2x1bW47Ci0gICAgaW50IHRvX2xpbmUsIHRvX2NvbHVtbjsKLSAgICBpbnQgcGl4c3RyaWRlID0gaW1hZ2UtPmJpdHNfcGVyX3BpeGVsID4+IDM7Ci0gICAgLyogV2FybmluZzogaW4gaXRzIGluc2FuaXR5LCB4bGliIHByb3ZpZGVzIHVuc2lnbmVkIGltYWdlIGRhdGEgdGhyb3VnaCBhCi0gICAgICogY2hhciogcG9pbnRlciwgc28gd2UgaGF2ZSB0byBtYWtlIGl0IHVpbnQ4X3QgdG8gbWFrZSB0aGluZ3Mgbm90IGJyZWFrLgotICAgICAqIEFueW9uZSB3aG8gcGVyZm9ybXMgZnVydGhlciBpbnZlc3RpZ2F0aW9uIG9mIHRoZSB4bGliIEFQSSBsaWtlbHkgcmlza3MKLSAgICAgKiBwZXJtYW5lbnQgYnJhaW4gZGFtYWdlLiAqLwotICAgIHVpbnQ4X3QgKnBpeCA9IGltYWdlLT5kYXRhOwotICAgIFdpbmRvdyByb290OwotICAgIFhTZXRXaW5kb3dBdHRyaWJ1dGVzIGF0dHI7Ci0KLSAgICAvKiBDb2RlIGRvZXNuJ3QgY3VycmVudGx5IHN1cHBvcnQgMTYtYml0IG9yIFBBTDggKi8KLSAgICBpZiAoaW1hZ2UtPmJpdHNfcGVyX3BpeGVsICE9IDI0ICYmIGltYWdlLT5iaXRzX3Blcl9waXhlbCAhPSAzMikKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCFzLT5jKQotICAgICAgICBzLT5jID0gWENyZWF0ZUZvbnRDdXJzb3IoZHB5LCBYQ19sZWZ0X3B0cik7Ci0gICAgcm9vdCA9IERlZmF1bHRSb290V2luZG93KGRweSk7Ci0gICAgYXR0ci5jdXJzb3IgPSBzLT5jOwotICAgIFhDaGFuZ2VXaW5kb3dBdHRyaWJ1dGVzKGRweSwgcm9vdCwgQ1dDdXJzb3IsICZhdHRyKTsKLQotICAgIHhjaW0gPSBYRml4ZXNHZXRDdXJzb3JJbWFnZShkcHkpOwotICAgIGlmICgheGNpbSkgewotICAgICAgICBhdl9sb2coczEsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIlhGaXhlc0dldEN1cnNvckltYWdlIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB4ID0geGNpbS0+eCAtIHhjaW0tPnhob3Q7Ci0gICAgeSA9IHhjaW0tPnkgLSB4Y2ltLT55aG90OwotCi0gICAgdG9fbGluZSAgID0gRkZNSU4oKHkgKyB4Y2ltLT5oZWlnaHQpLCAoaGVpZ2h0ICsgeV9vZmYpKTsKLSAgICB0b19jb2x1bW4gPSBGRk1JTigoeCArIHhjaW0tPndpZHRoKSwgICh3aWR0aCAgKyB4X29mZikpOwotCi0gICAgZm9yIChsaW5lID0gRkZNQVgoeSwgeV9vZmYpOyBsaW5lIDwgdG9fbGluZTsgbGluZSsrKSB7Ci0gICAgICAgIGZvciAoY29sdW1uID0gRkZNQVgoeCwgeF9vZmYpOyBjb2x1bW4gPCB0b19jb2x1bW47IGNvbHVtbisrKSB7Ci0gICAgICAgICAgICBpbnQgeGNpbV9hZGRyICA9IChsaW5lICAtIHkpICAgICAqIHhjaW0tPndpZHRoICsgY29sdW1uIC0geDsKLSAgICAgICAgICAgIGludCBpbWFnZV9hZGRyID0gKChsaW5lIC0geV9vZmYpICogd2lkdGggICAgICAgKyBjb2x1bW4gLSB4X29mZikgKiBwaXhzdHJpZGU7Ci0gICAgICAgICAgICBpbnQgciAgICAgICAgICA9ICh1aW50OF90KSh4Y2ltLT5waXhlbHNbeGNpbV9hZGRyXSA+PiAgMCk7Ci0gICAgICAgICAgICBpbnQgZyAgICAgICAgICA9ICh1aW50OF90KSh4Y2ltLT5waXhlbHNbeGNpbV9hZGRyXSA+PiAgOCk7Ci0gICAgICAgICAgICBpbnQgYiAgICAgICAgICA9ICh1aW50OF90KSh4Y2ltLT5waXhlbHNbeGNpbV9hZGRyXSA+PiAxNik7Ci0gICAgICAgICAgICBpbnQgYSAgICAgICAgICA9ICh1aW50OF90KSh4Y2ltLT5waXhlbHNbeGNpbV9hZGRyXSA+PiAyNCk7Ci0KLSAgICAgICAgICAgIGlmIChhID09IDI1NSkgewotICAgICAgICAgICAgICAgIHBpeFtpbWFnZV9hZGRyICsgMF0gPSByOwotICAgICAgICAgICAgICAgIHBpeFtpbWFnZV9hZGRyICsgMV0gPSBnOwotICAgICAgICAgICAgICAgIHBpeFtpbWFnZV9hZGRyICsgMl0gPSBiOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhKSB7Ci0gICAgICAgICAgICAgICAgLyogcGl4ZWwgdmFsdWVzIGZyb20gWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgY29tZSBwcmVtdWx0aXBsaWVkIGJ5IGFscGhhICovCi0gICAgICAgICAgICAgICAgcGl4W2ltYWdlX2FkZHIgKyAwXSA9IHIgKyAocGl4W2ltYWdlX2FkZHIgKyAwXSAqICgyNTUgLSBhKSArIDI1NSAvIDIpIC8gMjU1OwotICAgICAgICAgICAgICAgIHBpeFtpbWFnZV9hZGRyICsgMV0gPSBnICsgKHBpeFtpbWFnZV9hZGRyICsgMV0gKiAoMjU1IC0gYSkgKyAyNTUgLyAyKSAvIDI1NTsKLSAgICAgICAgICAgICAgICBwaXhbaW1hZ2VfYWRkciArIDJdID0gYiArIChwaXhbaW1hZ2VfYWRkciArIDJdICogKDI1NSAtIGEpICsgMjU1IC8gMikgLyAyNTU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBYRnJlZSh4Y2ltKTsKLSAgICB4Y2ltID0gTlVMTDsKLX0KLQotLyoqCi0gKiBSZWFkIG5ldyBkYXRhIGluIHRoZSBpbWFnZSBzdHJ1Y3R1cmUuCi0gKgotICogQHBhcmFtIGRweSBYMTEgZGlzcGxheSB0byBncmFiIGZyb20KLSAqIEBwYXJhbSBkCi0gKiBAcGFyYW0gaW1hZ2UgSW1hZ2Ugd2hlcmUgdGhlIGdyYWIgd2lsbCBiZSBwdXQKLSAqIEBwYXJhbSB4IFRvcC1MZWZ0IGdyYWJiaW5nIHJlY3RhbmdsZSBob3Jpem9udGFsIGNvb3JkaW5hdGUKLSAqIEBwYXJhbSB5IFRvcC1MZWZ0IGdyYWJiaW5nIHJlY3RhbmdsZSB2ZXJ0aWNhbCBjb29yZGluYXRlCi0gKiBAcmV0dXJuIDAgaWYgZXJyb3IsICEwIGlmIHN1Y2Nlc3NmdWwKLSAqLwotc3RhdGljIGludCB4Z2V0X3pwaXhtYXAoRGlzcGxheSAqZHB5LCBEcmF3YWJsZSBkLCBYSW1hZ2UgKmltYWdlLCBpbnQgeCwgaW50IHkpCi17Ci0gICAgeEdldEltYWdlUmVwbHkgcmVwOwotICAgIHhHZXRJbWFnZVJlcSAqcmVxOwotICAgIGxvbmcgbmJ5dGVzOwotCi0gICAgaWYgKCFpbWFnZSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBMb2NrRGlzcGxheShkcHkpOwotICAgIEdldFJlcShHZXRJbWFnZSwgcmVxKTsKLQotICAgIC8qIEZpcnN0IHNldCB1cCB0aGUgc3RhbmRhcmQgc3R1ZmYgaW4gdGhlIHJlcXVlc3QgKi8KLSAgICByZXEtPmRyYXdhYmxlICA9IGQ7Ci0gICAgcmVxLT54ICAgICAgICAgPSB4OwotICAgIHJlcS0+eSAgICAgICAgID0geTsKLSAgICByZXEtPndpZHRoICAgICA9IGltYWdlLT53aWR0aDsKLSAgICByZXEtPmhlaWdodCAgICA9IGltYWdlLT5oZWlnaHQ7Ci0gICAgcmVxLT5wbGFuZU1hc2sgPSAodW5zaWduZWQgaW50KUFsbFBsYW5lczsKLSAgICByZXEtPmZvcm1hdCAgICA9IFpQaXhtYXA7Ci0KLSAgICBpZiAoIV9YUmVwbHkoZHB5LCAoeFJlcGx5ICopJnJlcCwgMCwgeEZhbHNlKSB8fCAhcmVwLmxlbmd0aCkgewotICAgICAgICBVbmxvY2tEaXNwbGF5KGRweSk7Ci0gICAgICAgIFN5bmNIYW5kbGUoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbmJ5dGVzID0gKGxvbmcpcmVwLmxlbmd0aCA8PCAyOwotICAgIF9YUmVhZFBhZChkcHksIGltYWdlLT5kYXRhLCBuYnl0ZXMpOwotCi0gICAgVW5sb2NrRGlzcGxheShkcHkpOwotICAgIFN5bmNIYW5kbGUoKTsKLSAgICByZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBHcmFiIGEgZnJhbWUgZnJvbSB4MTEgKHB1YmxpYyBkZXZpY2UgZGVtdXhlciBBUEkpLgotICoKLSAqIEBwYXJhbSBzMSBDb250ZXh0IGZyb20gYXZmb3JtYXQgY29yZQotICogQHBhcmFtIHBrdCBQYWNrZXQgaG9sZGluZyB0aGUgYnJhYmJlZCBmcmFtZQotICogQHJldHVybiBmcmFtZSBzaXplIGluIGJ5dGVzCi0gKi8KLXN0YXRpYyBpbnQgeDExZ3JhYl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMxLCBBVlBhY2tldCAqcGt0KQotewotICAgIFgxMUdyYWJDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKLSAgICBEaXNwbGF5ICpkcHkgICAgICA9IHMtPmRweTsKLSAgICBYSW1hZ2UgKmltYWdlICAgICA9IHMtPmltYWdlOwotICAgIGludCB4X29mZiAgICAgICAgID0gcy0+eF9vZmY7Ci0gICAgaW50IHlfb2ZmICAgICAgICAgPSBzLT55X29mZjsKLSAgICBpbnQgZm9sbG93X21vdXNlICA9IHMtPmZvbGxvd19tb3VzZTsKLSAgICBpbnQgc2NyZWVuLCBwb2ludGVyX3gsIHBvaW50ZXJfeSwgXywgc2FtZV9zY3JlZW4gPSAxOwotICAgIFdpbmRvdyB3LCByb290OwotICAgIGludDY0X3QgY3VydGltZSwgZGVsYXk7Ci0gICAgc3RydWN0IHRpbWVzcGVjIHRzOwotCi0gICAgLyogd2FpdCBiYXNlZCBvbiB0aGUgZnJhbWUgcmF0ZSAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgY3VydGltZSA9IGF2X2dldHRpbWUoKTsKLSAgICAgICAgZGVsYXkgICA9IHMtPnRpbWVfZnJhbWUgKiBhdl9xMmQocy0+dGltZV9iYXNlKSAtIGN1cnRpbWU7Ci0gICAgICAgIGlmIChkZWxheSA8PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB0cy50dl9zZWMgID0gZGVsYXkgLyAxMDAwMDAwOwotICAgICAgICB0cy50dl9uc2VjID0gKGRlbGF5ICUgMTAwMDAwMCkgKiAxMDAwOwotICAgICAgICBuYW5vc2xlZXAoJnRzLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiBDYWxjdWxhdGUgdGhlIHRpbWUgb2YgdGhlIG5leHQgZnJhbWUgKi8KLSAgICBkbyB7Ci0gICAgICBzLT50aW1lX2ZyYW1lICs9IElOVDY0X0MoMTAwMDAwMCk7Ci0gICAgfSB3aGlsZSAoKHMtPnRpbWVfZnJhbWUgKiBhdl9xMmQocy0+dGltZV9iYXNlKSAtIGN1cnRpbWUpIDw9IDApOwotCi0gICAgYXZfaW5pdF9wYWNrZXQocGt0KTsKLSAgICBwa3QtPmRhdGEgPSBpbWFnZS0+ZGF0YTsKLSAgICBwa3QtPnNpemUgPSBzLT5mcmFtZV9zaXplOwotICAgIHBrdC0+cHRzICA9IGN1cnRpbWU7Ci0gICAgaWYgKHMtPnBhbGV0dGVfY2hhbmdlZCkgewotICAgICAgICB1aW50OF90ICpwYWwgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUEFMRVRURV9TSVpFKTsKLSAgICAgICAgaWYgKCFwYWwpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYXBwZW5kIHBhbGV0dGUgdG8gcGFja2V0XG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbWNweShwYWwsIHMtPnBhbGV0dGUsIEFWUEFMRVRURV9TSVpFKTsKLSAgICAgICAgICAgIHMtPnBhbGV0dGVfY2hhbmdlZCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzY3JlZW4gPSBEZWZhdWx0U2NyZWVuKGRweSk7Ci0gICAgcm9vdCAgID0gUm9vdFdpbmRvdyhkcHksIHNjcmVlbik7Ci0KLSAgICBpZiAoZm9sbG93X21vdXNlIHx8IHMtPmRyYXdfbW91c2UpCi0gICAgICAgIHNhbWVfc2NyZWVuID0gWFF1ZXJ5UG9pbnRlcihkcHksIHJvb3QsICZ3LCAmdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyX3gsICZwb2ludGVyX3ksICZfLCAmXywgJl8pOwotCi0gICAgaWYgKGZvbGxvd19tb3VzZSAmJiBzYW1lX3NjcmVlbikgewotICAgICAgICBpbnQgc2NyZWVuX3csIHNjcmVlbl9oOwotCi0gICAgICAgIHNjcmVlbl93ID0gRGlzcGxheVdpZHRoKGRweSwgc2NyZWVuKTsKLSAgICAgICAgc2NyZWVuX2ggPSBEaXNwbGF5SGVpZ2h0KGRweSwgc2NyZWVuKTsKLSAgICAgICAgaWYgKGZvbGxvd19tb3VzZSA9PSAtMSkgewotICAgICAgICAgICAgLy8gZm9sbG93IHRoZSBtb3VzZSwgcHV0IGl0IGF0IGNlbnRlciBvZiBncmFiYmluZyByZWdpb24KLSAgICAgICAgICAgIHhfb2ZmICs9IHBvaW50ZXJfeCAtIHMtPndpZHRoIC8gMiAtIHhfb2ZmOwotICAgICAgICAgICAgeV9vZmYgKz0gcG9pbnRlcl95IC0gcy0+aGVpZ2h0IC8gMiAtIHlfb2ZmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZm9sbG93IHRoZSBtb3VzZSwgYnV0IG9ubHkgbW92ZSB0aGUgZ3JhYmJpbmcgcmVnaW9uIHdoZW4gbW91c2UKLSAgICAgICAgICAgIC8vIHJlYWNoZXMgd2l0aGluIGNlcnRhaW4gcGl4ZWxzIHRvIHRoZSBlZGdlLgotICAgICAgICAgICAgaWYgKHBvaW50ZXJfeCA+IHhfb2ZmICsgcy0+d2lkdGggLSBmb2xsb3dfbW91c2UpCi0gICAgICAgICAgICAgICAgeF9vZmYgKz0gcG9pbnRlcl94IC0gKHhfb2ZmICsgcy0+d2lkdGggLSBmb2xsb3dfbW91c2UpOwotICAgICAgICAgICAgZWxzZSBpZiAocG9pbnRlcl94IDwgeF9vZmYgKyBmb2xsb3dfbW91c2UpCi0gICAgICAgICAgICAgICAgeF9vZmYgLT0gKHhfb2ZmICsgZm9sbG93X21vdXNlKSAtIHBvaW50ZXJfeDsKLSAgICAgICAgICAgIGlmIChwb2ludGVyX3kgPiB5X29mZiArIHMtPmhlaWdodCAtIGZvbGxvd19tb3VzZSkKLSAgICAgICAgICAgICAgICB5X29mZiArPSBwb2ludGVyX3kgLSAoeV9vZmYgKyBzLT5oZWlnaHQgLSBmb2xsb3dfbW91c2UpOwotICAgICAgICAgICAgZWxzZSBpZiAocG9pbnRlcl95IDwgeV9vZmYgKyBmb2xsb3dfbW91c2UpCi0gICAgICAgICAgICAgICAgeV9vZmYgLT0gKHlfb2ZmICsgZm9sbG93X21vdXNlKSAtIHBvaW50ZXJfeTsKLSAgICAgICAgfQotICAgICAgICAvLyBhZGp1c3QgZ3JhYmJpbmcgcmVnaW9uIHBvc2l0aW9uIGlmIGl0IGdvZXMgb3V0IG9mIHNjcmVlbi4KLSAgICAgICAgcy0+eF9vZmYgPSB4X29mZiA9IGF2X2NsaXAoeF9vZmYsIDAsIHNjcmVlbl93IC0gcy0+d2lkdGgpOwotICAgICAgICBzLT55X29mZiA9IHlfb2ZmID0gYXZfY2xpcCh5X29mZiwgMCwgc2NyZWVuX2ggLSBzLT5oZWlnaHQpOwotCi0gICAgICAgIGlmIChzLT5zaG93X3JlZ2lvbiAmJiBzLT5yZWdpb25fd2luKQotICAgICAgICAgICAgWE1vdmVXaW5kb3coZHB5LCBzLT5yZWdpb25fd2luLAotICAgICAgICAgICAgICAgICAgICAgICAgcy0+eF9vZmYgLSBSRUdJT05fV0lOX0JPUkRFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPnlfb2ZmIC0gUkVHSU9OX1dJTl9CT1JERVIpOwotICAgIH0KLQotICAgIGlmIChzLT5zaG93X3JlZ2lvbiAmJiBzYW1lX3NjcmVlbikgewotICAgICAgICBpZiAocy0+cmVnaW9uX3dpbikgewotICAgICAgICAgICAgWEV2ZW50IGV2dCA9IHsgLnR5cGUgPSBOb0V2ZW50TWFzayB9OwotICAgICAgICAgICAgLy8gQ2xlYW4gdXAgdGhlIGV2ZW50cywgYW5kIGRvIHRoZSBpbml0aWFsIGRyYXcgb3IgcmVkcmF3LgotICAgICAgICAgICAgd2hpbGUgKFhDaGVja01hc2tFdmVudChkcHksIEV4cG9zdXJlTWFzayB8IFN0cnVjdHVyZU5vdGlmeU1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldnQpKQotICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIGlmIChldnQudHlwZSkKLSAgICAgICAgICAgICAgICB4MTFncmFiX2RyYXdfcmVnaW9uX3dpbihzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHgxMWdyYWJfcmVnaW9uX3dpbl9pbml0KHMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHMtPnVzZV9zaG0pIHsKLSAgICAgICAgaWYgKCFYU2htR2V0SW1hZ2UoZHB5LCByb290LCBpbWFnZSwgeF9vZmYsIHlfb2ZmLCBBbGxQbGFuZXMpKQotICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfSU5GTywgIlhTaG1HZXRJbWFnZSgpIGZhaWxlZFxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCF4Z2V0X3pwaXhtYXAoZHB5LCByb290LCBpbWFnZSwgeF9vZmYsIHlfb2ZmKSkKLSAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0lORk8sICJYR2V0WlBpeG1hcCgpIGZhaWxlZFxuIik7Ci0gICAgfQotCi0gICAgaWYgKHMtPmRyYXdfbW91c2UgJiYgc2FtZV9zY3JlZW4pCi0gICAgICAgIHBhaW50X21vdXNlX3BvaW50ZXIoaW1hZ2UsIHMxKTsKLQotICAgIHJldHVybiBzLT5mcmFtZV9zaXplOwotfQotCi0vKioKLSAqIENsb3NlIHgxMSBmcmFtZSBncmFiYmVyIChwdWJsaWMgZGV2aWNlIGRlbXV4ZXIgQVBJKS4KLSAqCi0gKiBAcGFyYW0gczEgQ29udGV4dCBmcm9tIGF2Zm9ybWF0IGNvcmUKLSAqIEByZXR1cm4gMCBzdWNjZXNzLCAhMCBmYWlsdXJlCi0gKi8KLXN0YXRpYyBpbnQgeDExZ3JhYl9yZWFkX2Nsb3NlKEFWRm9ybWF0Q29udGV4dCAqczEpCi17Ci0gICAgWDExR3JhYkNvbnRleHQgKngxMWdyYWIgPSBzMS0+cHJpdl9kYXRhOwotCi0gICAgLyogRGV0YWNoIGNsZWFubHkgZnJvbSBzaGFyZWQgbWVtICovCi0gICAgaWYgKHgxMWdyYWItPnVzZV9zaG0pIHsKLSAgICAgICAgWFNobURldGFjaCh4MTFncmFiLT5kcHksICZ4MTFncmFiLT5zaG1pbmZvKTsKLSAgICAgICAgc2htZHQoeDExZ3JhYi0+c2htaW5mby5zaG1hZGRyKTsKLSAgICAgICAgc2htY3RsKHgxMWdyYWItPnNobWluZm8uc2htaWQsIElQQ19STUlELCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvKiBEZXN0cm95IFgxMSBpbWFnZSAqLwotICAgIGlmICh4MTFncmFiLT5pbWFnZSkgewotICAgICAgICBYRGVzdHJveUltYWdlKHgxMWdyYWItPmltYWdlKTsKLSAgICAgICAgeDExZ3JhYi0+aW1hZ2UgPSBOVUxMOwotICAgIH0KLQotICAgIGlmICh4MTFncmFiLT5yZWdpb25fd2luKQotICAgICAgICBYRGVzdHJveVdpbmRvdyh4MTFncmFiLT5kcHksIHgxMWdyYWItPnJlZ2lvbl93aW4pOwotCi0gICAgLyogRnJlZSBYMTEgZGlzcGxheSAqLwotICAgIFhDbG9zZURpc3BsYXkoeDExZ3JhYi0+ZHB5KTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoWDExR3JhYkNvbnRleHQsIHgpCi0jZGVmaW5lIERFQyBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQotc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKLSAgICB7ICJncmFiX3giLCAiSW5pdGlhbCB4IGNvb3JkaW5hdGUuIiwgT0ZGU0VUKHhfb2ZmKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIERFQyB9LAotICAgIHsgImdyYWJfeSIsICJJbml0aWFsIHkgY29vcmRpbmF0ZS4iLCBPRkZTRVQoeV9vZmYpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgREVDIH0sCi0gICAgeyAiZHJhd19tb3VzZSIsICJkcmF3IHRoZSBtb3VzZSBwb2ludGVyIiwgT0ZGU0VUKGRyYXdfbW91c2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDAsIDEsIERFQyB9LAotCi0gICAgeyAiZm9sbG93X21vdXNlIiwgIm1vdmUgdGhlIGdyYWJiaW5nIHJlZ2lvbiB3aGVuIHRoZSBtb3VzZSBwb2ludGVyIHJlYWNoZXMgd2l0aGluIHNwZWNpZmllZCBhbW91bnQgb2YgcGl4ZWxzIHRvIHRoZSBlZGdlIG9mIHJlZ2lvbiIsCi0gICAgICBPRkZTRVQoZm9sbG93X21vdXNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAtMSwgSU5UX01BWCwgREVDLCAiZm9sbG93X21vdXNlIiB9LAotICAgIHsgImNlbnRlcmVkIiwgICAgICJrZWVwIHRoZSBtb3VzZSBwb2ludGVyIGF0IHRoZSBjZW50ZXIgb2YgZ3JhYmJpbmcgcmVnaW9uIHdoZW4gZm9sbG93aW5nIiwKLSAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IC0xfSwgSU5UX01JTiwgSU5UX01BWCwgREVDLCAiZm9sbG93X21vdXNlIiB9LAotCi0gICAgeyAiZnJhbWVyYXRlIiwgICJzZXQgdmlkZW8gZnJhbWUgcmF0ZSIsICAgICAgT0ZGU0VUKGZyYW1lcmF0ZSksICAgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAibnRzYyJ9LCAwLCAwLCBERUMgfSwKLSAgICB7ICJzaG93X3JlZ2lvbiIsICJzaG93IHRoZSBncmFiYmluZyByZWdpb24iLCBPRkZTRVQoc2hvd19yZWdpb24pLCBBVl9PUFRfVFlQRV9JTlQsICAgICAgICB7Lmk2NCA9IDB9LCAwLCAxLCBERUMgfSwKLSAgICB7ICJ2aWRlb19zaXplIiwgICJzZXQgdmlkZW8gZnJhbWUgc2l6ZSIsICAgICBPRkZTRVQod2lkdGgpLCAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9ICJ2Z2EifSwgMCwgMCwgREVDIH0sCi0gICAgeyAidXNlX3NobSIsICAgICAidXNlIE1JVC1TSE0gZXh0ZW5zaW9uIiwgICAgT0ZGU0VUKHVzZV9zaG0pLCAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgICAgey5pNjQgPSAxfSwgMCwgMSwgREVDIH0sCi0gICAgeyBOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyB4MTFfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiWDExZ3JhYiBpbmRldiIsCi0gICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKLSAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCi0gICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCi0gICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfVklERU9fSU5QVVQsCi19OwotCi0vKiogeDExIGdyYWJiZXIgZGV2aWNlIGRlbXV4ZXIgZGVjbGFyYXRpb24gKi8KLUFWSW5wdXRGb3JtYXQgZmZfeDExZ3JhYl9kZW11eGVyID0gewotICAgIC5uYW1lICAgICAgICAgICA9ICJ4MTFncmFiIiwKLSAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiWDExZ3JhYiIpLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihYMTFHcmFiQ29udGV4dCksCi0gICAgLnJlYWRfaGVhZGVyICAgID0geDExZ3JhYl9yZWFkX2hlYWRlciwKLSAgICAucmVhZF9wYWNrZXQgICAgPSB4MTFncmFiX3JlYWRfcGFja2V0LAotICAgIC5yZWFkX2Nsb3NlICAgICA9IHgxMWdyYWJfcmVhZF9jbG9zZSwKLSAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCi0gICAgLnByaXZfY2xhc3MgICAgID0gJngxMV9jbGFzcywKLX07CmRpZmYgLS1naXQgYS9saWJhdmRldmljZS94Y2JncmFiLmMgYi9saWJhdmRldmljZS94Y2JncmFiLmMKaW5kZXggMmRhN2VjNy4uNmQxNDJhYiAxMDA2NDQKLS0tIGEvbGliYXZkZXZpY2UveGNiZ3JhYi5jCisrKyBiL2xpYmF2ZGV2aWNlL3hjYmdyYWIuYwpAQCAtNDksNiArNDksOCBAQAogdHlwZWRlZiBzdHJ1Y3QgWENCR3JhYkNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogCisgICAgdWludDhfdCAqYnVmZmVyOworCiAgICAgeGNiX2Nvbm5lY3Rpb25fdCAqY29ubjsKICAgICB4Y2Jfc2NyZWVuX3QgKnNjcmVlbjsKICAgICB4Y2Jfd2luZG93X3Qgd2luZG93OwpAQCAtMjE5LDIyICsyMjEsMTYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZGVhbGxvY19zaG0odm9pZCAqdW51c2VkLCB1aW50OF90ICpkYXRhKQotewotICAgIHNobWR0KGRhdGEpOwotfQotCi1zdGF0aWMgaW50IHhjYmdyYWJfZnJhbWVfc2htKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3N0YXRpYyBpbnQgYWxsb2NhdGVfc2htKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBYQ0JHcmFiQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKLSAgICB4Y2Jfc2htX2dldF9pbWFnZV9jb29raWVfdCBpcTsKLSAgICB4Y2Jfc2htX2dldF9pbWFnZV9yZXBseV90ICppbWc7Ci0gICAgeGNiX2RyYXdhYmxlX3QgZHJhd2FibGUgPSBjLT5zY3JlZW4tPnJvb3Q7Ci0gICAgdWludDhfdCAqZGF0YTsKICAgICBpbnQgc2l6ZSA9IGMtPmZyYW1lX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFOwotICAgIGludCBpZCAgID0gc2htZ2V0KElQQ19QUklWQVRFLCBzaXplLCBJUENfQ1JFQVQgfCAwNzc3KTsKLSAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICplID0gTlVMTDsKKyAgICB1aW50OF90ICpkYXRhOworICAgIGludCBpZDsKIAorICAgIGlmIChjLT5idWZmZXIpCisgICAgICAgIHJldHVybiAwOworICAgIGlkID0gc2htZ2V0KElQQ19QUklWQVRFLCBzaXplLCBJUENfQ1JFQVQgfCAwNzc3KTsKICAgICBpZiAoaWQgPT0gLTEpIHsKICAgICAgICAgY2hhciBlcnJidWZbMTAyNF07CiAgICAgICAgIGludCBlcnIgPSBBVkVSUk9SKGVycm5vKTsKQEAgLTI0MywxNSArMjM5LDMxIEBACiAgICAgICAgICAgICAgICBzaXplLCBlcnJidWYpOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLQogICAgIHhjYl9zaG1fYXR0YWNoKGMtPmNvbm4sIGMtPnNlZ21lbnQsIGlkLCAwKTsKKyAgICBkYXRhID0gc2htYXQoaWQsIE5VTEwsIDApOworICAgIHNobWN0bChpZCwgSVBDX1JNSUQsIDApOworICAgIGlmICgoaW50cHRyX3QpZGF0YSA9PSAtMSB8fCAhZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJybm8pOworICAgIGMtPmJ1ZmZlciA9IGRhdGE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGNiZ3JhYl9mcmFtZV9zaG0oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFhDQkdyYWJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIHhjYl9zaG1fZ2V0X2ltYWdlX2Nvb2tpZV90IGlxOworICAgIHhjYl9zaG1fZ2V0X2ltYWdlX3JlcGx5X3QgKmltZzsKKyAgICB4Y2JfZHJhd2FibGVfdCBkcmF3YWJsZSA9IGMtPnNjcmVlbi0+cm9vdDsKKyAgICB4Y2JfZ2VuZXJpY19lcnJvcl90ICplID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gYWxsb2NhdGVfc2htKHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgaXEgPSB4Y2Jfc2htX2dldF9pbWFnZShjLT5jb25uLCBkcmF3YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPngsIGMtPnksIGMtPndpZHRoLCBjLT5oZWlnaHQsIH4wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgWENCX0lNQUdFX0ZPUk1BVF9aX1BJWE1BUCwgYy0+c2VnbWVudCwgMCk7Ci0KLSAgICB4Y2Jfc2htX2RldGFjaChjLT5jb25uLCBjLT5zZWdtZW50KTsKLQogICAgIGltZyA9IHhjYl9zaG1fZ2V0X2ltYWdlX3JlcGx5KGMtPmNvbm4sIGlxLCAmZSk7CiAKICAgICB4Y2JfZmx1c2goYy0+Y29ubik7CkBAIC0yNjQsMjUgKzI3NiwxMiBAQAogICAgICAgICAgICAgICAgZS0+cmVzcG9uc2VfdHlwZSwgZS0+ZXJyb3JfY29kZSwKICAgICAgICAgICAgICAgIGUtPnNlcXVlbmNlLCBlLT5yZXNvdXJjZV9pZCwgZS0+bWlub3JfY29kZSwgZS0+bWFqb3JfY29kZSk7CiAKLSAgICAgICAgc2htY3RsKGlkLCBJUENfUk1JRCwgMCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBQ0NFUyk7CiAgICAgfQogCiAgICAgZnJlZShpbWcpOwogCi0gICAgZGF0YSA9IHNobWF0KGlkLCBOVUxMLCAwKTsKLSAgICBzaG1jdGwoaWQsIElQQ19STUlELCAwKTsKLQotICAgIGlmICgoaW50cHRyX3QpZGF0YSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJybm8pOwotCi0gICAgcGt0LT5idWYgPSBhdl9idWZmZXJfY3JlYXRlKGRhdGEsIHNpemUsIGRlYWxsb2Nfc2htLCBOVUxMLCAwKTsKLSAgICBpZiAoIXBrdC0+YnVmKSB7Ci0gICAgICAgIHNobWR0KGRhdGEpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIHBrdC0+ZGF0YSA9IHBrdC0+YnVmLT5kYXRhOworICAgIHBrdC0+ZGF0YSA9IGMtPmJ1ZmZlcjsKICAgICBwa3QtPnNpemUgPSBjLT5mcmFtZV9zaXplOwogCiAgICAgcmV0dXJuIDA7CkBAIC00MzYsNiArNDM1LDEyIEBACiB7CiAgICAgWENCR3JhYkNvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKIAorI2lmIENPTkZJR19MSUJYQ0JfU0hNCisgICAgaWYgKGN0eC0+YnVmZmVyKSB7CisgICAgICAgIHNobWR0KGN0eC0+YnVmZmVyKTsKKyAgICB9CisjZW5kaWYKKwogICAgIHhjYl9kaXNjb25uZWN0KGN0eC0+Y29ubik7CiAKICAgICByZXR1cm4gMDsKQEAgLTUwNCw3ICs1MDksNyBAQAogCiAgICAgICAgIGZtdCsrOwogICAgIH0KLSAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUGl4bWFwIGZvcm1hdCBub3QgbWFwcGFibGUuXG4iKTsKKyAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLCAiTWFwcGluZyB0aGlzIHBpeG1hcCBmb3JtYXQiKTsKIAogICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKIH0KQEAgLTU0OCwxMyArNTUzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmF2Z19mcmFtZV9yYXRlLm51bSB9OwogICAgIGMtPnRpbWVfZnJhbWUgPSBhdl9nZXR0aW1lKCk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU87Ci0gICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gYy0+d2lkdGg7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gYy0+aGVpZ2h0OwotICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlICA9IGMtPnRpbWVfYmFzZTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgID0gYy0+d2lkdGg7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gYy0+aGVpZ2h0OwogCi0gICAgcmV0ID0gcGl4Zm10X2Zyb21fcGl4bWFwX2Zvcm1hdChzLCBnZW8tPmRlcHRoLCAmc3QtPmNvZGVjLT5waXhfZm10KTsKKyAgICByZXQgPSBwaXhmbXRfZnJvbV9waXhtYXBfZm9ybWF0KHMsIGdlby0+ZGVwdGgsICZzdC0+Y29kZWNwYXItPmZvcm1hdCk7CiAKICAgICBmcmVlKGdlbyk7CiAKQEAgLTYyNSwxNCArNjI5LDE0IEBACiAgICAgWENCR3JhYkNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CiAgICAgaW50IHNjcmVlbl9udW0sIHJldDsKICAgICBjb25zdCB4Y2Jfc2V0dXBfdCAqc2V0dXA7Ci0gICAgY2hhciAqZGlzcGxheV9uYW1lID0gYXZfc3RyZHVwKHMtPmZpbGVuYW1lKTsKKyAgICBjaGFyICpkaXNwbGF5X25hbWUgPSBhdl9zdHJkdXAocy0+dXJsKTsKIAogICAgIGlmICghZGlzcGxheV9uYW1lKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgaWYgKCFzc2NhbmYocy0+ZmlsZW5hbWUsICIlW14rXSslZCwlZCIsIGRpc3BsYXlfbmFtZSwgJmMtPngsICZjLT55KSkgeworICAgIGlmICghc3NjYW5mKHMtPnVybCwgIiVbXitdKyVkLCVkIiwgZGlzcGxheV9uYW1lLCAmYy0+eCwgJmMtPnkpKSB7CiAgICAgICAgICpkaXNwbGF5X25hbWUgPSAwOwotICAgICAgICBzc2NhbmYocy0+ZmlsZW5hbWUsICIrJWQsJWQiLCAmYy0+eCwgJmMtPnkpOworICAgICAgICBzc2NhbmYocy0+dXJsLCAiKyVkLCVkIiwgJmMtPngsICZjLT55KTsKICAgICB9CiAKICAgICBjLT5jb25uID0geGNiX2Nvbm5lY3QoZGlzcGxheV9uYW1lWzBdID8gZGlzcGxheV9uYW1lIDogTlVMTCwgJnNjcmVlbl9udW0pOwpAQCAtNjQwLDcgKzY0NCw3IEBACiAKICAgICBpZiAoKHJldCA9IHhjYl9jb25uZWN0aW9uX2hhc19lcnJvcihjLT5jb25uKSkpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBvcGVuIGRpc3BsYXkgJXMsIGVycm9yICVkLlxuIiwKLSAgICAgICAgICAgICAgIHMtPmZpbGVuYW1lWzBdID8gcy0+ZmlsZW5hbWUgOiAiZGVmYXVsdCIsIHJldCk7CisgICAgICAgICAgICAgICBzLT51cmxbMF0gPyBzLT51cmwgOiAiZGVmYXVsdCIsIHJldCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAgICAgfQogCkBAIC02ODYsNyArNjkwLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotQVZJbnB1dEZvcm1hdCBmZl94MTFncmFiX3hjYl9kZW11eGVyID0geworQVZJbnB1dEZvcm1hdCBmZl94Y2JncmFiX2RlbXV4ZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gIngxMWdyYWIiLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJYMTEgc2NyZWVuIGNhcHR1cmUsIHVzaW5nIFhDQiIpLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihYQ0JHcmFiQ29udGV4dCksCmRpZmYgLS1naXQgYS9saWJhdmRldmljZS94di5jIGIvbGliYXZkZXZpY2UveHYuYwppbmRleCA2NGNkZGViLi5jM2VkMmU0IDEwMDY0NAotLS0gYS9saWJhdmRldmljZS94di5jCisrKyBiL2xpYmF2ZGV2aWNlL3h2LmMKQEAgLTEwOSwyMiArMTA5LDIyIEBACiAgICAgWENvbG9yIGZnY29sb3I7CiAgICAgWFdpbmRvd0F0dHJpYnV0ZXMgd2luZG93X2F0dHJzOwogICAgIGludCBudW1fZm9ybWF0cyA9IDAsIGosIHRhZywgcmV0OwotICAgIEFWQ29kZWNDb250ZXh0ICplbmNjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAKICAgICBpZiAoICAgcy0+bmJfc3RyZWFtcyA+IDEKLSAgICAgICAgfHwgZW5jY3R4LT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTwotICAgICAgICB8fCBlbmNjdHgtPmNvZGVjX2lkICAgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKKyAgICAgICAgfHwgcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTworICAgICAgICB8fCBwYXItPmNvZGVjX2lkICAgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk9ubHkgc3VwcG9ydHMgb25lIHJhd3ZpZGVvIHN0cmVhbVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgaWYgKCEodGFnID0geHZfZ2V0X3RhZ19mcm9tX2Zvcm1hdChlbmNjdHgtPnBpeF9mbXQpKSkgeworICAgIGlmICghKHRhZyA9IHh2X2dldF90YWdfZnJvbV9mb3JtYXQocGFyLT5mb3JtYXQpKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCAnJXMnLCBvbmx5IHl1djQyMHAsIHV5dnk0MjIsIHl1eXY0MjIgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWRcbiIsCi0gICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGVuY2N0eC0+cGl4X2ZtdCkpOworICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShwYXItPmZvcm1hdCkpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQotICAgIHh2LT5pbWFnZV9mb3JtYXQgPSBlbmNjdHgtPnBpeF9mbXQ7CisgICAgeHYtPmltYWdlX2Zvcm1hdCA9IHBhci0+Zm9ybWF0OwogCiAgICAgeHYtPmRpc3BsYXkgPSBYT3BlbkRpc3BsYXkoeHYtPmRpc3BsYXlfbmFtZSk7CiAgICAgaWYgKCF4di0+ZGlzcGxheSkgewpAQCAtMTMyLDEyICsxMzIsMTIgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICB4di0+aW1hZ2Vfd2lkdGggID0gZW5jY3R4LT53aWR0aDsKLSAgICB4di0+aW1hZ2VfaGVpZ2h0ID0gZW5jY3R4LT5oZWlnaHQ7CisgICAgeHYtPmltYWdlX3dpZHRoICA9IHBhci0+d2lkdGg7CisgICAgeHYtPmltYWdlX2hlaWdodCA9IHBhci0+aGVpZ2h0OwogICAgIGlmICgheHYtPndpbmRvd193aWR0aCAmJiAheHYtPndpbmRvd19oZWlnaHQpIHsKLSAgICAgICAgQVZSYXRpb25hbCBzYXIgPSBlbmNjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0gICAgICAgIHh2LT53aW5kb3dfd2lkdGggID0gZW5jY3R4LT53aWR0aDsKLSAgICAgICAgeHYtPndpbmRvd19oZWlnaHQgPSBlbmNjdHgtPmhlaWdodDsKKyAgICAgICAgQVZSYXRpb25hbCBzYXIgPSBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIHh2LT53aW5kb3dfd2lkdGggID0gcGFyLT53aWR0aDsKKyAgICAgICAgeHYtPndpbmRvd19oZWlnaHQgPSBwYXItPmhlaWdodDsKICAgICAgICAgaWYgKHNhci5udW0pIHsKICAgICAgICAgICAgIGlmIChzYXIubnVtID4gc2FyLmRlbikKICAgICAgICAgICAgICAgICB4di0+d2luZG93X3dpZHRoID0gYXZfcmVzY2FsZSh4di0+d2luZG93X3dpZHRoLCBzYXIubnVtLCBzYXIuZGVuKTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4di0+d2luZG93X3dpZHRoLCB4di0+d2luZG93X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCk7CiAgICAgICAgIGlmICgheHYtPndpbmRvd190aXRsZSkgewotICAgICAgICAgICAgaWYgKCEoeHYtPndpbmRvd190aXRsZSA9IGF2X3N0cmR1cChzLT5maWxlbmFtZSkpKSB7CisgICAgICAgICAgICBpZiAoISh4di0+d2luZG93X3RpdGxlID0gYXZfc3RyZHVwKHMtPnVybCkpKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KQEAgLTE4OSwxNCArMTg5LDE0IEBACiAgICAgaWYgKGogPj0gbnVtX2Zvcm1hdHMpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBwaXhlbCBmb3JtYXQgJXMsIGFib3J0aW5nXG4iLAotICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShlbmNjdHgtPnBpeF9mbXQpKTsKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocGFyLT5mb3JtYXQpKTsKICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCiAgICAgeHYtPmdjID0gWENyZWF0ZUdDKHh2LT5kaXNwbGF5LCB4di0+d2luZG93LCAwLCAwKTsKLSAgICB4di0+aW1hZ2Vfd2lkdGggID0gZW5jY3R4LT53aWR0aDsKLSAgICB4di0+aW1hZ2VfaGVpZ2h0ID0gZW5jY3R4LT5oZWlnaHQ7CisgICAgeHYtPmltYWdlX3dpZHRoICA9IHBhci0+d2lkdGg7CisgICAgeHYtPmltYWdlX2hlaWdodCA9IHBhci0+aGVpZ2h0OwogICAgIHh2LT55dXZfaW1hZ2UgPSBYdlNobUNyZWF0ZUltYWdlKHh2LT5kaXNwbGF5LCB4di0+eHZfcG9ydCwgdGFnLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh2LT5pbWFnZV93aWR0aCwgeHYtPmltYWdlX2hlaWdodCwgJnh2LT55dXZfc2htaW5mbyk7CiAgICAgeHYtPnl1dl9zaG1pbmZvLnNobWlkID0gc2htZ2V0KElQQ19QUklWQVRFLCB4di0+eXV2X2ltYWdlLT5kYXRhX3NpemUsCkBAIC0yMjgsMTEgKzIyOCwxMSBAQAogICAgIFhWQ29udGV4dCAqeHYgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZSYXRpb25hbCBzYXIsIGRhcjsgLyogc2FtcGxlIGFuZCBkaXNwbGF5IGFzcGVjdCByYXRpb3MgKi8KICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmNjdHggPSBzdC0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKIAogICAgIC8qIGNvbXB1dGUgb3ZlcmxheSB3aWR0aCBhbmQgaGVpZ2h0IGZyb20gdGhlIGNvZGVjIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KICAgICBzYXIgPSBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPyBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA6IChBVlJhdGlvbmFsKXsgMSwgMSB9OwotICAgIGRhciA9IGF2X211bF9xKHNhciwgKEFWUmF0aW9uYWwpeyBlbmNjdHgtPndpZHRoLCBlbmNjdHgtPmhlaWdodCB9KTsKKyAgICBkYXIgPSBhdl9tdWxfcShzYXIsIChBVlJhdGlvbmFsKXsgcGFyLT53aWR0aCwgcGFyLT5oZWlnaHQgfSk7CiAKICAgICAvKiB3ZSBzdXBwb3NlIHRoZSBzY3JlZW4gaGFzIGEgMS8xIHNhbXBsZSBhc3BlY3QgcmF0aW8gKi8KICAgICAvKiBmaXQgaW4gdGhlIHdpbmRvdyAqLwpAQCAtMzIxLDEyICszMjEsMTIgQEAKIAogc3RhdGljIGludCB4dl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgdWludDhfdCAqZGF0YVs0XTsKICAgICBpbnQgbGluZXNpemVbNF07CiAKLSAgICBhdl9pbWFnZV9maWxsX2FycmF5cyhkYXRhLCBsaW5lc2l6ZSwgcGt0LT5kYXRhLCBjdHgtPnBpeF9mbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQsIDEpOworICAgIGF2X2ltYWdlX2ZpbGxfYXJyYXlzKGRhdGEsIGxpbmVzaXplLCBwa3QtPmRhdGEsIHBhci0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+d2lkdGgsIHBhci0+aGVpZ2h0LCAxKTsKICAgICByZXR1cm4gd3JpdGVfcGljdHVyZShzLCBkYXRhLCBsaW5lc2l6ZSk7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL01ha2VmaWxlIGIvbGliYXZmaWx0ZXIvTWFrZWZpbGUKaW5kZXggODkxNjU4OC4uYmNkNWQ0MyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbGliYXZmaWx0ZXIvTWFrZWZpbGUKQEAgLTEsOSArMSw3IEBACi1pbmNsdWRlICQoU1VCRElSKS4uL2NvbmZpZy5tYWsKLQogTkFNRSA9IGF2ZmlsdGVyCitERVNDID0gRkZtcGVnIGF1ZGlvL3ZpZGVvIGZpbHRlcmluZyBsaWJyYXJ5CiAKIEhFQURFUlMgPSBhdmZpbHRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBhdmZpbHRlcmdyYXBoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBidWZmZXJzaW5rLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBidWZmZXJzcmMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICB2ZXJzaW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE4LDI5ICsxNiw0MiBAQAogICAgICAgIGZpZm8ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZvcm1hdHMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZyYW1lcG9vbC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGZyYW1lcXVldWUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGdyYXBoZHVtcC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGdyYXBocGFyc2VyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIG9wZW5jbF9hbGxrZXJuZWxzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHRyYW5zZm9ybS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHZpZGVvLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCitPQkpTLSQoSEFWRV9USFJFQURTKSAgICAgICAgICAgICAgICAgICAgICAgICArPSBwdGhyZWFkLm8KKworIyBzdWJzeXN0ZW1zCitPQkpTLSQoQ09ORklHX1FTVlZQUCkgICAgICAgICAgICAgICAgICAgICAgICArPSBxc3Z2cHAubworCisjIGF1ZGlvIGZpbHRlcnMKK09CSlMtJChDT05GSUdfQUJFTkNIX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGZfYmVuY2gubwogT0JKUy0kKENPTkZJR19BQ09NUFJFU1NPUl9GSUxURVIpICAgICAgICAgICAgKz0gYWZfc2lkZWNoYWluY29tcHJlc3MubworT0JKUy0kKENPTkZJR19BQ09OVFJBU1RfRklMVEVSKSAgICAgICAgICAgICAgKz0gYWZfYWNvbnRyYXN0Lm8KK09CSlMtJChDT05GSUdfQUNPUFlfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IGFmX2Fjb3B5Lm8KIE9CSlMtJChDT05GSUdfQUNST1NTRkFERV9GSUxURVIpICAgICAgICAgICAgICs9IGFmX2FmYWRlLm8KK09CSlMtJChDT05GSUdfQUNSVVNIRVJfRklMVEVSKSAgICAgICAgICAgICAgICs9IGFmX2FjcnVzaGVyLm8KIE9CSlMtJChDT05GSUdfQURFTEFZX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2FkZWxheS5vCiBPQkpTLSQoQ09ORklHX0FFQ0hPX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBhZl9hZWNoby5vCiBPQkpTLSQoQ09ORklHX0FFTVBIQVNJU19GSUxURVIpICAgICAgICAgICAgICArPSBhZl9hZW1waGFzaXMubwotT0JKUy0kKENPTkZJR19BRkZURklMVF9GSUxURVIpICAgICAgICAgICAgICAgKz0gYWZfYWZmdGZpbHQubyB3aW5kb3dfZnVuYy5vCi1PQkpTLSQoQ09ORklHX0FORVFVQUxJWkVSX0ZJTFRFUikgICAgICAgICAgICArPSBhZl9hbmVxdWFsaXplci5vCiBPQkpTLSQoQ09ORklHX0FFVkFMX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBhZXZhbC5vCiBPQkpTLSQoQ09ORklHX0FGQURFX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBhZl9hZmFkZS5vCitPQkpTLSQoQ09ORklHX0FGRlRGSUxUX0ZJTFRFUikgICAgICAgICAgICAgICArPSBhZl9hZmZ0ZmlsdC5vCitPQkpTLSQoQ09ORklHX0FGSVJfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSBhZl9hZmlyLm8KIE9CSlMtJChDT05GSUdfQUZPUk1BVF9GSUxURVIpICAgICAgICAgICAgICAgICs9IGFmX2Fmb3JtYXQubwogT0JKUy0kKENPTkZJR19BR0FURV9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gYWZfYWdhdGUubworT0JKUy0kKENPTkZJR19BSUlSX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gYWZfYWlpci5vCiBPQkpTLSQoQ09ORklHX0FJTlRFUkxFQVZFX0ZJTFRFUikgICAgICAgICAgICArPSBmX2ludGVybGVhdmUubwogT0JKUy0kKENPTkZJR19BTElNSVRFUl9GSUxURVIpICAgICAgICAgICAgICAgKz0gYWZfYWxpbWl0ZXIubwogT0JKUy0kKENPTkZJR19BTExQQVNTX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gYWZfYmlxdWFkcy5vCitPQkpTLSQoQ09ORklHX0FMT09QX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBmX2xvb3AubwogT0JKUy0kKENPTkZJR19BTUVSR0VfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gYWZfYW1lcmdlLm8KIE9CSlMtJChDT05GSUdfQU1FVEFEQVRBX0ZJTFRFUikgICAgICAgICAgICAgICs9IGZfbWV0YWRhdGEubwogT0JKUy0kKENPTkZJR19BTUlYX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gYWZfYW1peC5vCitPQkpTLSQoQ09ORklHX0FORVFVQUxJWkVSX0ZJTFRFUikgICAgICAgICAgICArPSBhZl9hbmVxdWFsaXplci5vCiBPQkpTLSQoQ09ORklHX0FOVUxMX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBhZl9hbnVsbC5vCiBPQkpTLSQoQ09ORklHX0FQQURfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSBhZl9hcGFkLm8KIE9CSlMtJChDT05GSUdfQVBFUk1TX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGZfcGVybXMubwpAQCAtNTYsMTAgKzY3LDEwIEBACiBPQkpTLSQoQ09ORklHX0FTRVRSQVRFX0ZJTFRFUikgICAgICAgICAgICAgICArPSBhZl9hc2V0cmF0ZS5vCiBPQkpTLSQoQ09ORklHX0FTRVRUQl9GSUxURVIpICAgICAgICAgICAgICAgICArPSBzZXR0Yi5vCiBPQkpTLSQoQ09ORklHX0FTSE9XSU5GT19GSUxURVIpICAgICAgICAgICAgICArPSBhZl9hc2hvd2luZm8ubworT0JKUy0kKENPTkZJR19BU0lERURBVEFfRklMVEVSKSAgICAgICAgICAgICAgKz0gZl9zaWRlZGF0YS5vCiBPQkpTLSQoQ09ORklHX0FTUExJVF9GSUxURVIpICAgICAgICAgICAgICAgICArPSBzcGxpdC5vCiBPQkpTLSQoQ09ORklHX0FTVEFUU19GSUxURVIpICAgICAgICAgICAgICAgICArPSBhZl9hc3RhdHMubwotT0JKUy0kKENPTkZJR19BU1RSRUFNU0VMRUNUX0ZJTFRFUikgICAgICAgICAgKz0gZl9zdHJlYW1zZWxlY3QubwotT0JKUy0kKENPTkZJR19BU1lOQ1RTX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gYWZfYXN5bmN0cy5vCitPQkpTLSQoQ09ORklHX0FTVFJFQU1TRUxFQ1RfRklMVEVSKSAgICAgICAgICArPSBmX3N0cmVhbXNlbGVjdC5vIGZyYW1lc3luYy5vCiBPQkpTLSQoQ09ORklHX0FURU1QT19GSUxURVIpICAgICAgICAgICAgICAgICArPSBhZl9hdGVtcG8ubwogT0JKUy0kKENPTkZJR19BVFJJTV9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdHJpbS5vCiBPQkpTLSQoQ09ORklHX0FaTVFfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSBmX3ptcS5vCkBAIC03MywxNyArODQsMjcgQEAKIE9CSlMtJChDT05GSUdfQ0hPUlVTX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IGFmX2Nob3J1cy5vIGdlbmVyYXRlX3dhdmVfdGFibGUubwogT0JKUy0kKENPTkZJR19DT01QQU5EX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gYWZfY29tcGFuZC5vCiBPQkpTLSQoQ09ORklHX0NPTVBFTlNBVElPTkRFTEFZX0ZJTFRFUikgICAgICArPSBhZl9jb21wZW5zYXRpb25kZWxheS5vCitPQkpTLSQoQ09ORklHX0NST1NTRkVFRF9GSUxURVIpICAgICAgICAgICAgICArPSBhZl9jcm9zc2ZlZWQubworT0JKUy0kKENPTkZJR19DUllTVEFMSVpFUl9GSUxURVIpICAgICAgICAgICAgKz0gYWZfY3J5c3RhbGl6ZXIubwogT0JKUy0kKENPTkZJR19EQ1NISUZUX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gYWZfZGNzaGlmdC5vCitPQkpTLSQoQ09ORklHX0RSTUVURVJfRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl9kcm1ldGVyLm8KIE9CSlMtJChDT05GSUdfRFlOQVVETk9STV9GSUxURVIpICAgICAgICAgICAgICs9IGFmX2R5bmF1ZG5vcm0ubwogT0JKUy0kKENPTkZJR19FQVJXQVhfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gYWZfZWFyd2F4Lm8KIE9CSlMtJChDT05GSUdfRUJVUjEyOF9GSUxURVIpICAgICAgICAgICAgICAgICs9IGZfZWJ1cjEyOC5vCiBPQkpTLSQoQ09ORklHX0VRVUFMSVpFUl9GSUxURVIpICAgICAgICAgICAgICArPSBhZl9iaXF1YWRzLm8KIE9CSlMtJChDT05GSUdfRVhUUkFTVEVSRU9fRklMVEVSKSAgICAgICAgICAgICs9IGFmX2V4dHJhc3RlcmVvLm8KK09CSlMtJChDT05GSUdfRklSRVFVQUxJWkVSX0ZJTFRFUikgICAgICAgICAgICs9IGFmX2ZpcmVxdWFsaXplci5vCiBPQkpTLSQoQ09ORklHX0ZMQU5HRVJfRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl9mbGFuZ2VyLm8gZ2VuZXJhdGVfd2F2ZV90YWJsZS5vCitPQkpTLSQoQ09ORklHX0hBQVNfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSBhZl9oYWFzLm8KK09CSlMtJChDT05GSUdfSERDRF9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IGFmX2hkY2QubworT0JKUy0kKENPTkZJR19IRUFEUEhPTkVfRklMVEVSKSAgICAgICAgICAgICAgKz0gYWZfaGVhZHBob25lLm8KIE9CSlMtJChDT05GSUdfSElHSFBBU1NfRklMVEVSKSAgICAgICAgICAgICAgICs9IGFmX2JpcXVhZHMubwogT0JKUy0kKENPTkZJR19KT0lOX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gYWZfam9pbi5vCiBPQkpTLSQoQ09ORklHX0xBRFNQQV9GSUxURVIpICAgICAgICAgICAgICAgICArPSBhZl9sYWRzcGEubworT0JKUy0kKENPTkZJR19MT1VETk9STV9GSUxURVIpICAgICAgICAgICAgICAgKz0gYWZfbG91ZG5vcm0ubyBlYnVyMTI4Lm8KIE9CSlMtJChDT05GSUdfTE9XUEFTU19GSUxURVIpICAgICAgICAgICAgICAgICs9IGFmX2JpcXVhZHMubworT0JKUy0kKENPTkZJR19MVjJfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gYWZfbHYyLm8KK09CSlMtJChDT05GSUdfTUNPTVBBTkRfRklMVEVSKSAgICAgICAgICAgICAgICs9IGFmX21jb21wYW5kLm8KIE9CSlMtJChDT05GSUdfUEFOX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICs9IGFmX3Bhbi5vCiBPQkpTLSQoQ09ORklHX1JFUExBWUdBSU5fRklMVEVSKSAgICAgICAgICAgICArPSBhZl9yZXBsYXlnYWluLm8KIE9CSlMtJChDT05GSUdfUkVTQU1QTEVfRklMVEVSKSAgICAgICAgICAgICAgICs9IGFmX3Jlc2FtcGxlLm8KQEAgLTk1LDYgKzExNiw4IEBACiBPQkpTLSQoQ09ORklHX1NPRkFMSVpFUl9GSUxURVIpICAgICAgICAgICAgICArPSBhZl9zb2ZhbGl6ZXIubwogT0JKUy0kKENPTkZJR19TVEVSRU9UT09MU19GSUxURVIpICAgICAgICAgICAgKz0gYWZfc3RlcmVvdG9vbHMubwogT0JKUy0kKENPTkZJR19TVEVSRU9XSURFTl9GSUxURVIpICAgICAgICAgICAgKz0gYWZfc3RlcmVvd2lkZW4ubworT0JKUy0kKENPTkZJR19TVVBFUkVRVUFMSVpFUl9GSUxURVIpICAgICAgICAgKz0gYWZfc3VwZXJlcXVhbGl6ZXIubworT0JKUy0kKENPTkZJR19TVVJST1VORF9GSUxURVIpICAgICAgICAgICAgICAgKz0gYWZfc3Vycm91bmQubwogT0JKUy0kKENPTkZJR19UUkVCTEVfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gYWZfYmlxdWFkcy5vCiBPQkpTLSQoQ09ORklHX1RSRU1PTE9fRklMVEVSKSAgICAgICAgICAgICAgICArPSBhZl90cmVtb2xvLm8KIE9CSlMtJChDT05GSUdfVklCUkFUT19GSUxURVIpICAgICAgICAgICAgICAgICs9IGFmX3ZpYnJhdG8ubyBnZW5lcmF0ZV93YXZlX3RhYmxlLm8KQEAgLTEwNSw1NyArMTI4LDgzIEBACiBPQkpTLSQoQ09ORklHX0FOT0lTRVNSQ19GSUxURVIpICAgICAgICAgICAgICArPSBhc3JjX2Fub2lzZXNyYy5vCiBPQkpTLSQoQ09ORklHX0FOVUxMU1JDX0ZJTFRFUikgICAgICAgICAgICAgICArPSBhc3JjX2FudWxsc3JjLm8KIE9CSlMtJChDT05GSUdfRkxJVEVfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IGFzcmNfZmxpdGUubworT0JKUy0kKENPTkZJR19ISUxCRVJUX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gYXNyY19oaWxiZXJ0Lm8KIE9CSlMtJChDT05GSUdfU0lORV9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IGFzcmNfc2luZS5vCiAKIE9CSlMtJChDT05GSUdfQU5VTExTSU5LX0ZJTFRFUikgICAgICAgICAgICAgICs9IGFzaW5rX2FudWxsc2luay5vCiAKLU9CSlMtJChDT05GSUdfQVNTX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICs9IHZmX3N1YnRpdGxlcy5vCisjIHZpZGVvIGZpbHRlcnMKIE9CSlMtJChDT05GSUdfQUxQSEFFWFRSQUNUX0ZJTFRFUikgICAgICAgICAgICs9IHZmX2V4dHJhY3RwbGFuZXMubwogT0JKUy0kKENPTkZJR19BTFBIQU1FUkdFX0ZJTFRFUikgICAgICAgICAgICAgKz0gdmZfYWxwaGFtZXJnZS5vCitPQkpTLSQoQ09ORklHX0FTU19GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9zdWJ0aXRsZXMubwogT0JKUy0kKENPTkZJR19BVEFERU5PSVNFX0ZJTFRFUikgICAgICAgICAgICAgKz0gdmZfYXRhZGVub2lzZS5vCitPQkpTLSQoQ09ORklHX0FWR0JMVVJfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9hdmdibHVyLm8KK09CSlMtJChDT05GSUdfQVZHQkxVUl9PUEVOQ0xfRklMVEVSKSAgICAgICAgICs9IHZmX2F2Z2JsdXJfb3BlbmNsLm8gb3BlbmNsLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmNsL2F2Z2JsdXIubwogT0JKUy0kKENPTkZJR19CQk9YX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gYmJveC5vIHZmX2Jib3gubworT0JKUy0kKENPTkZJR19CRU5DSF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gZl9iZW5jaC5vCitPQkpTLSQoQ09ORklHX0JJVFBMQU5FTk9JU0VfRklMVEVSKSAgICAgICAgICArPSB2Zl9iaXRwbGFuZW5vaXNlLm8KIE9CSlMtJChDT05GSUdfQkxBQ0tERVRFQ1RfRklMVEVSKSAgICAgICAgICAgICs9IHZmX2JsYWNrZGV0ZWN0Lm8KIE9CSlMtJChDT05GSUdfQkxBQ0tGUkFNRV9GSUxURVIpICAgICAgICAgICAgICs9IHZmX2JsYWNrZnJhbWUubwotT0JKUy0kKENPTkZJR19CTEVORF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfYmxlbmQubyBkdWFsaW5wdXQubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19CTEVORF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfYmxlbmQubyBmcmFtZXN5bmMubwogT0JKUy0kKENPTkZJR19CT1hCTFVSX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfYm94Ymx1ci5vCitPQkpTLSQoQ09ORklHX0JXRElGX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl9id2RpZi5vCiBPQkpTLSQoQ09ORklHX0NIUk9NQUtFWV9GSUxURVIpICAgICAgICAgICAgICArPSB2Zl9jaHJvbWFrZXkubworT0JKUy0kKENPTkZJR19DSUVTQ09QRV9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfY2llc2NvcGUubwogT0JKUy0kKENPTkZJR19DT0RFQ1ZJRVdfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfY29kZWN2aWV3Lm8KIE9CSlMtJChDT05GSUdfQ09MT1JCQUxBTkNFX0ZJTFRFUikgICAgICAgICAgICs9IHZmX2NvbG9yYmFsYW5jZS5vCiBPQkpTLSQoQ09ORklHX0NPTE9SQ0hBTk5FTE1JWEVSX0ZJTFRFUikgICAgICArPSB2Zl9jb2xvcmNoYW5uZWxtaXhlci5vCiBPQkpTLSQoQ09ORklHX0NPTE9SS0VZX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9jb2xvcmtleS5vCiBPQkpTLSQoQ09ORklHX0NPTE9STEVWRUxTX0ZJTFRFUikgICAgICAgICAgICArPSB2Zl9jb2xvcmxldmVscy5vCiBPQkpTLSQoQ09ORklHX0NPTE9STUFUUklYX0ZJTFRFUikgICAgICAgICAgICArPSB2Zl9jb2xvcm1hdHJpeC5vCitPQkpTLSQoQ09ORklHX0NPTE9SU1BBQ0VfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9jb2xvcnNwYWNlLm8gY29sb3JzcGFjZWRzcC5vCiBPQkpTLSQoQ09ORklHX0NPTlZPTFVUSU9OX0ZJTFRFUikgICAgICAgICAgICArPSB2Zl9jb252b2x1dGlvbi5vCitPQkpTLSQoQ09ORklHX0NPTlZPTFVUSU9OX09QRU5DTF9GSUxURVIpICAgICArPSB2Zl9jb252b2x1dGlvbl9vcGVuY2wubyBvcGVuY2wubyBcCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5jbC9jb252b2x1dGlvbi5vCitPQkpTLSQoQ09ORklHX0NPTlZPTFZFX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9jb252b2x2ZS5vIGZyYW1lc3luYy5vCiBPQkpTLSQoQ09ORklHX0NPUFlfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2Zl9jb3B5Lm8KK09CSlMtJChDT05GSUdfQ09SRUlNQUdFX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX2NvcmVpbWFnZS5vCiBPQkpTLSQoQ09ORklHX0NPVkVSX1JFQ1RfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9jb3Zlcl9yZWN0Lm8gbGF2ZnV0aWxzLm8KIE9CSlMtJChDT05GSUdfQ1JPUF9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHZmX2Nyb3AubwogT0JKUy0kKENPTkZJR19DUk9QREVURUNUX0ZJTFRFUikgICAgICAgICAgICAgKz0gdmZfY3JvcGRldGVjdC5vCiBPQkpTLSQoQ09ORklHX0NVUlZFU19GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9jdXJ2ZXMubworT0JKUy0kKENPTkZJR19EQVRBU0NPUEVfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfZGF0YXNjb3BlLm8KIE9CSlMtJChDT05GSUdfRENURE5PSVpfRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX2RjdGRub2l6Lm8KIE9CSlMtJChDT05GSUdfREVCQU5EX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2RlYmFuZC5vCiBPQkpTLSQoQ09ORklHX0RFQ0lNQVRFX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9kZWNpbWF0ZS5vCitPQkpTLSQoQ09ORklHX0RFQ09OVk9MVkVfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9jb252b2x2ZS5vIGZyYW1lc3luYy5vCiBPQkpTLSQoQ09ORklHX0RFRkxBVEVfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9uZWlnaGJvci5vCitPQkpTLSQoQ09ORklHX0RFRkxJQ0tFUl9GSUxURVIpICAgICAgICAgICAgICArPSB2Zl9kZWZsaWNrZXIubworT0JKUy0kKENPTkZJR19ERUlOVEVSTEFDRV9RU1ZfRklMVEVSKSAgICAgICAgKz0gdmZfZGVpbnRlcmxhY2VfcXN2Lm8KK09CSlMtJChDT05GSUdfREVJTlRFUkxBQ0VfVkFBUElfRklMVEVSKSAgICAgICs9IHZmX2RlaW50ZXJsYWNlX3ZhYXBpLm8gdmFhcGlfdnBwLm8KIE9CSlMtJChDT05GSUdfREVKVURERVJfRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX2RlanVkZGVyLm8KIE9CSlMtJChDT05GSUdfREVMT0dPX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2RlbG9nby5vCitPQkpTLSQoQ09ORklHX0RFTk9JU0VfVkFBUElfRklMVEVSKSAgICAgICAgICArPSB2Zl9taXNjX3ZhYXBpLm8gdmFhcGlfdnBwLm8KIE9CSlMtJChDT05GSUdfREVTSEFLRV9GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX2Rlc2hha2UubworT0JKUy0kKENPTkZJR19ERVNQSUxMX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfZGVzcGlsbC5vCiBPQkpTLSQoQ09ORklHX0RFVEVMRUNJTkVfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9kZXRlbGVjaW5lLm8KIE9CSlMtJChDT05GSUdfRElMQVRJT05fRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX25laWdoYm9yLm8KIE9CSlMtJChDT05GSUdfRElTUExBQ0VfRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX2Rpc3BsYWNlLm8gZnJhbWVzeW5jLm8KK09CSlMtJChDT05GSUdfRE9VQkxFV0VBVkVfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3dlYXZlLm8KIE9CSlMtJChDT05GSUdfRFJBV0JPWF9GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX2RyYXdib3gubwogT0JKUy0kKENPTkZJR19EUkFXR1JBUEhfRklMVEVSKSAgICAgICAgICAgICAgKz0gZl9kcmF3Z3JhcGgubwogT0JKUy0kKENPTkZJR19EUkFXR1JJRF9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfZHJhd2JveC5vCiBPQkpTLSQoQ09ORklHX0RSQVdURVhUX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9kcmF3dGV4dC5vCi1PQkpTLSQoQ09ORklHX0VMQkdfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2Zl9lbGJnLm8KIE9CSlMtJChDT05GSUdfRURHRURFVEVDVF9GSUxURVIpICAgICAgICAgICAgICs9IHZmX2VkZ2VkZXRlY3QubworT0JKUy0kKENPTkZJR19FTEJHX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfZWxiZy5vCitPQkpTLSQoQ09ORklHX0VOVFJPUFlfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9lbnRyb3B5Lm8KIE9CSlMtJChDT05GSUdfRVFfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgICs9IHZmX2VxLm8KIE9CSlMtJChDT05GSUdfRVJPU0lPTl9GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX25laWdoYm9yLm8KIE9CSlMtJChDT05GSUdfRVhUUkFDVFBMQU5FU19GSUxURVIpICAgICAgICAgICs9IHZmX2V4dHJhY3RwbGFuZXMubwogT0JKUy0kKENPTkZJR19GQURFX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfZmFkZS5vCiBPQkpTLSQoQ09ORklHX0ZGVEZJTFRfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9mZnRmaWx0Lm8KIE9CSlMtJChDT05GSUdfRklFTERfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX2ZpZWxkLm8KK09CSlMtJChDT05GSUdfRklFTERISU5UX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX2ZpZWxkaGludC5vCiBPQkpTLSQoQ09ORklHX0ZJRUxETUFUQ0hfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9maWVsZG1hdGNoLm8KIE9CSlMtJChDT05GSUdfRklFTERPUkRFUl9GSUxURVIpICAgICAgICAgICAgICs9IHZmX2ZpZWxkb3JkZXIubworT0JKUy0kKENPTkZJR19GSUxMQk9SREVSU19GSUxURVIpICAgICAgICAgICAgKz0gdmZfZmlsbGJvcmRlcnMubwogT0JKUy0kKENPTkZJR19GSU5EX1JFQ1RfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfZmluZF9yZWN0Lm8gbGF2ZnV0aWxzLm8KK09CSlMtJChDT05GSUdfRkxPT0RGSUxMX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX2Zsb29kZmlsbC5vCiBPQkpTLSQoQ09ORklHX0ZPUk1BVF9GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9mb3JtYXQubwogT0JKUy0kKENPTkZJR19GUFNfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfZnBzLm8KIE9CSlMtJChDT05GSUdfRlJBTUVQQUNLX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX2ZyYW1lcGFjay5vCkBAIC0xNjMsOSArMjEyLDEwIEBACiBPQkpTLSQoQ09ORklHX0ZSQU1FU1RFUF9GSUxURVIpICAgICAgICAgICAgICArPSB2Zl9mcmFtZXN0ZXAubwogT0JKUy0kKENPTkZJR19GUkVJMFJfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfZnJlaTByLm8KIE9CSlMtJChDT05GSUdfRlNQUF9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHZmX2ZzcHAubworT0JKUy0kKENPTkZJR19HQkxVUl9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfZ2JsdXIubwogT0JKUy0kKENPTkZJR19HRVFfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfZ2VxLm8KIE9CSlMtJChDT05GSUdfR1JBREZVTl9GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX2dyYWRmdW4ubwotT0JKUy0kKENPTkZJR19IQUxEQ0xVVF9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfbHV0M2QubyBkdWFsaW5wdXQubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19IQUxEQ0xVVF9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfbHV0M2QubyBmcmFtZXN5bmMubwogT0JKUy0kKENPTkZJR19IRkxJUF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfaGZsaXAubwogT0JKUy0kKENPTkZJR19ISVNURVFfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfaGlzdGVxLm8KIE9CSlMtJChDT05GSUdfSElTVE9HUkFNX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX2hpc3RvZ3JhbS5vCkBAIC0xNzMsNiArMjIzLDExIEBACiBPQkpTLSQoQ09ORklHX0hRWF9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9ocXgubwogT0JKUy0kKENPTkZJR19IU1RBQ0tfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfc3RhY2subyBmcmFtZXN5bmMubwogT0JKUy0kKENPTkZJR19IVUVfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfaHVlLm8KK09CSlMtJChDT05GSUdfSFdET1dOTE9BRF9GSUxURVIpICAgICAgICAgICAgICs9IHZmX2h3ZG93bmxvYWQubworT0JKUy0kKENPTkZJR19IV01BUF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfaHdtYXAubworT0JKUy0kKENPTkZJR19IV1VQTE9BRF9DVURBX0ZJTFRFUikgICAgICAgICAgKz0gdmZfaHd1cGxvYWRfY3VkYS5vCitPQkpTLSQoQ09ORklHX0hXVVBMT0FEX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9od3VwbG9hZC5vCitPQkpTLSQoQ09ORklHX0hZU1RFUkVTSVNfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9oeXN0ZXJlc2lzLm8gZnJhbWVzeW5jLm8KIE9CSlMtJChDT05GSUdfSURFVF9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHZmX2lkZXQubwogT0JKUy0kKENPTkZJR19JTF9GSUxURVIpICAgICAgICAgICAgICAgICAgICAgKz0gdmZfaWwubwogT0JKUy0kKENPTkZJR19JTkZMQVRFX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfbmVpZ2hib3IubwpAQCAtMTgwLDg4ICsyMzUsMTM0IEBACiBPQkpTLSQoQ09ORklHX0lOVEVSTEVBVkVfRklMVEVSKSAgICAgICAgICAgICArPSBmX2ludGVybGVhdmUubwogT0JKUy0kKENPTkZJR19LRVJOREVJTlRfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfa2VybmRlaW50Lm8KIE9CSlMtJChDT05GSUdfTEVOU0NPUlJFQ1RJT05fRklMVEVSKSAgICAgICAgICs9IHZmX2xlbnNjb3JyZWN0aW9uLm8KLU9CSlMtJChDT05GSUdfTFVUM0RfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX2x1dDNkLm8KK09CSlMtJChDT05GSUdfTElCVk1BRl9GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX2xpYnZtYWYubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19MSU1JVEVSX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfbGltaXRlci5vCitPQkpTLSQoQ09ORklHX0xPT1BfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSBmX2xvb3AubworT0JKUy0kKENPTkZJR19MVU1BS0VZX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdmZfbHVtYWtleS5vCiBPQkpTLSQoQ09ORklHX0xVVF9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9sdXQubworT0JKUy0kKENPTkZJR19MVVQyX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfbHV0Mi5vIGZyYW1lc3luYy5vCitPQkpTLSQoQ09ORklHX0xVVDNEX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl9sdXQzZC5vCiBPQkpTLSQoQ09ORklHX0xVVFJHQl9GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9sdXQubwogT0JKUy0kKENPTkZJR19MVVRZVVZfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfbHV0Lm8KK09CSlMtJChDT05GSUdfTUFTS0VEQ0xBTVBfRklMVEVSKSAgICAgICAgICAgICs9IHZmX21hc2tlZGNsYW1wLm8gZnJhbWVzeW5jLm8KIE9CSlMtJChDT05GSUdfTUFTS0VETUVSR0VfRklMVEVSKSAgICAgICAgICAgICs9IHZmX21hc2tlZG1lcmdlLm8gZnJhbWVzeW5jLm8KIE9CSlMtJChDT05GSUdfTUNERUlOVF9GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX21jZGVpbnQubwogT0JKUy0kKENPTkZJR19NRVJHRVBMQU5FU19GSUxURVIpICAgICAgICAgICAgKz0gdmZfbWVyZ2VwbGFuZXMubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19NRVNUSU1BVEVfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfbWVzdGltYXRlLm8gbW90aW9uX2VzdGltYXRpb24ubwogT0JKUy0kKENPTkZJR19NRVRBREFUQV9GSUxURVIpICAgICAgICAgICAgICAgKz0gZl9tZXRhZGF0YS5vCitPQkpTLSQoQ09ORklHX01JREVRVUFMSVpFUl9GSUxURVIpICAgICAgICAgICArPSB2Zl9taWRlcXVhbGl6ZXIubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19NSU5URVJQT0xBVEVfRklMVEVSKSAgICAgICAgICAgKz0gdmZfbWludGVycG9sYXRlLm8gbW90aW9uX2VzdGltYXRpb24ubworT0JKUy0kKENPTkZJR19NSVhfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfbWl4Lm8KIE9CSlMtJChDT05GSUdfTVBERUNJTUFURV9GSUxURVIpICAgICAgICAgICAgICs9IHZmX21wZGVjaW1hdGUubwogT0JKUy0kKENPTkZJR19ORUdBVEVfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfbHV0Lm8KK09CSlMtJChDT05GSUdfTkxNRUFOU19GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX25sbWVhbnMubwogT0JKUy0kKENPTkZJR19OTkVESV9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfbm5lZGkubwogT0JKUy0kKENPTkZJR19OT0ZPUk1BVF9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfZm9ybWF0Lm8KIE9CSlMtJChDT05GSUdfTk9JU0VfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX25vaXNlLm8KK09CSlMtJChDT05GSUdfTk9STUFMSVpFX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX25vcm1hbGl6ZS5vCiBPQkpTLSQoQ09ORklHX05VTExfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2Zl9udWxsLm8KIE9CSlMtJChDT05GSUdfT0NSX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICs9IHZmX29jci5vCiBPQkpTLSQoQ09ORklHX09DVl9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9saWJvcGVuY3YubwotT0JKUy0kKENPTkZJR19PUEVOQ0wpICAgICAgICAgICAgICAgICAgICAgICAgKz0gZGVzaGFrZV9vcGVuY2wubyB1bnNoYXJwX29wZW5jbC5vCi1PQkpTLSQoQ09ORklHX09WRVJMQVlfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9vdmVybGF5Lm8gZHVhbGlucHV0Lm8gZnJhbWVzeW5jLm8KK09CSlMtJChDT05GSUdfT1NDSUxMT1NDT1BFX0ZJTFRFUikgICAgICAgICAgICs9IHZmX2RhdGFzY29wZS5vCitPQkpTLSQoQ09ORklHX09WRVJMQVlfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9vdmVybGF5Lm8gZnJhbWVzeW5jLm8KK09CSlMtJChDT05GSUdfT1ZFUkxBWV9PUEVOQ0xfRklMVEVSKSAgICAgICAgICs9IHZmX292ZXJsYXlfb3BlbmNsLm8gb3BlbmNsLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmNsL292ZXJsYXkubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19PVkVSTEFZX1FTVl9GSUxURVIpICAgICAgICAgICAgKz0gdmZfb3ZlcmxheV9xc3YubyBmcmFtZXN5bmMubwogT0JKUy0kKENPTkZJR19PV0RFTk9JU0VfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfb3dkZW5vaXNlLm8KIE9CSlMtJChDT05GSUdfUEFEX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICs9IHZmX3BhZC5vCiBPQkpTLSQoQ09ORklHX1BBTEVUVEVHRU5fRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9wYWxldHRlZ2VuLm8KLU9CSlMtJChDT05GSUdfUEFMRVRURVVTRV9GSUxURVIpICAgICAgICAgICAgICs9IHZmX3BhbGV0dGV1c2UubyBkdWFsaW5wdXQubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19QQUxFVFRFVVNFX0ZJTFRFUikgICAgICAgICAgICAgKz0gdmZfcGFsZXR0ZXVzZS5vIGZyYW1lc3luYy5vCiBPQkpTLSQoQ09ORklHX1BFUk1TX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBmX3Blcm1zLm8KIE9CSlMtJChDT05GSUdfUEVSU1BFQ1RJVkVfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3BlcnNwZWN0aXZlLm8KIE9CSlMtJChDT05GSUdfUEhBU0VfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX3BoYXNlLm8KIE9CSlMtJChDT05GSUdfUElYREVTQ1RFU1RfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3BpeGRlc2N0ZXN0Lm8KK09CSlMtJChDT05GSUdfUElYU0NPUEVfRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX2RhdGFzY29wZS5vCiBPQkpTLSQoQ09ORklHX1BQX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICArPSB2Zl9wcC5vCiBPQkpTLSQoQ09ORklHX1BQN19GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB2Zl9wcDcubwotT0JKUy0kKENPTkZJR19QU05SX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfcHNuci5vIGR1YWxpbnB1dC5vIGZyYW1lc3luYy5vCitPQkpTLSQoQ09ORklHX1BSRU1VTFRJUExZX0ZJTFRFUikgICAgICAgICAgICArPSB2Zl9wcmVtdWx0aXBseS5vIGZyYW1lc3luYy5vCitPQkpTLSQoQ09ORklHX1BSRVdJVFRfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9jb252b2x1dGlvbi5vCitPQkpTLSQoQ09ORklHX1BST0NBTVBfVkFBUElfRklMVEVSKSAgICAgICAgICArPSB2Zl9wcm9jYW1wX3ZhYXBpLm8gdmFhcGlfdnBwLm8KK09CSlMtJChDT05GSUdfUFJPR1JBTV9PUEVOQ0xfRklMVEVSKSAgICAgICAgICs9IHZmX3Byb2dyYW1fb3BlbmNsLm8gb3BlbmNsLm8gZnJhbWVzeW5jLm8KK09CSlMtJChDT05GSUdfUFNFVURPQ09MT1JfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3BzZXVkb2NvbG9yLm8KK09CSlMtJChDT05GSUdfUFNOUl9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHZmX3BzbnIubyBmcmFtZXN5bmMubwogT0JKUy0kKENPTkZJR19QVUxMVVBfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfcHVsbHVwLm8KIE9CSlMtJChDT05GSUdfUVBfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgICs9IHZmX3FwLm8KIE9CSlMtJChDT05GSUdfUkFORE9NX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX3JhbmRvbS5vCitPQkpTLSQoQ09ORklHX1JFQURFSUE2MDhfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9yZWFkZWlhNjA4Lm8KK09CSlMtJChDT05GSUdfUkVBRFZJVENfRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX3JlYWR2aXRjLm8KIE9CSlMtJChDT05GSUdfUkVBTFRJTUVfRklMVEVSKSAgICAgICAgICAgICAgICs9IGZfcmVhbHRpbWUubworT0JKUy0kKENPTkZJR19SRU1BUF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfcmVtYXAubyBmcmFtZXN5bmMubwogT0JKUy0kKENPTkZJR19SRU1PVkVHUkFJTl9GSUxURVIpICAgICAgICAgICAgKz0gdmZfcmVtb3ZlZ3JhaW4ubwogT0JKUy0kKENPTkZJR19SRU1PVkVMT0dPX0ZJTFRFUikgICAgICAgICAgICAgKz0gYmJveC5vIGxzd3N1dGlscy5vIGxhdmZ1dGlscy5vIHZmX3JlbW92ZWxvZ28ubwogT0JKUy0kKENPTkZJR19SRVBFQVRGSUVMRFNfRklMVEVSKSAgICAgICAgICAgKz0gdmZfcmVwZWF0ZmllbGRzLm8KIE9CSlMtJChDT05GSUdfUkVWRVJTRV9GSUxURVIpICAgICAgICAgICAgICAgICs9IGZfcmV2ZXJzZS5vCitPQkpTLSQoQ09ORklHX1JPQkVSVFNfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl9jb252b2x1dGlvbi5vCiBPQkpTLSQoQ09ORklHX1JPVEFURV9GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9yb3RhdGUubwotT0JKUy0kKENPTkZJR19TRVBBUkFURUZJRUxEU19GSUxURVIpICAgICAgICAgKz0gdmZfc2VwYXJhdGVmaWVsZHMubwogT0JKUy0kKENPTkZJR19TQUJfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfc2FiLm8KLU9CSlMtJChDT05GSUdfU0NBTEVfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX3NjYWxlLm8KLU9CSlMtJChDT05GSUdfU0NBTEUyUkVGX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3NjYWxlLm8KK09CSlMtJChDT05GSUdfU0NBTEVfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX3NjYWxlLm8gc2NhbGUubworT0JKUy0kKENPTkZJR19TQ0FMRV9DVURBX0ZJTFRFUikgICAgICAgICAgICAgKz0gdmZfc2NhbGVfY3VkYS5vIHZmX3NjYWxlX2N1ZGEucHR4Lm8KK09CSlMtJChDT05GSUdfU0NBTEVfTlBQX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3NjYWxlX25wcC5vIHNjYWxlLm8KK09CSlMtJChDT05GSUdfU0NBTEVfUVNWX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3NjYWxlX3Fzdi5vCitPQkpTLSQoQ09ORklHX1NDQUxFX1ZBQVBJX0ZJTFRFUikgICAgICAgICAgICArPSB2Zl9zY2FsZV92YWFwaS5vIHNjYWxlLm8gdmFhcGlfdnBwLm8KK09CSlMtJChDT05GSUdfU0NBTEUyUkVGX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3NjYWxlLm8gc2NhbGUubwogT0JKUy0kKENPTkZJR19TRUxFQ1RfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gZl9zZWxlY3QubwogT0JKUy0kKENPTkZJR19TRUxFQ1RJVkVDT0xPUl9GSUxURVIpICAgICAgICAgKz0gdmZfc2VsZWN0aXZlY29sb3IubwogT0JKUy0kKENPTkZJR19TRU5EQ01EX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gZl9zZW5kY21kLm8KK09CSlMtJChDT05GSUdfU0VQQVJBVEVGSUVMRFNfRklMVEVSKSAgICAgICAgICs9IHZmX3NlcGFyYXRlZmllbGRzLm8KIE9CSlMtJChDT05GSUdfU0VUREFSX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2FzcGVjdC5vCiBPQkpTLSQoQ09ORklHX1NFVEZJRUxEX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9zZXRmaWVsZC5vCiBPQkpTLSQoQ09ORklHX1NFVFBUU19GSUxURVIpICAgICAgICAgICAgICAgICArPSBzZXRwdHMubworT0JKUy0kKENPTkZJR19TRVRSQU5HRV9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfc2V0cGFyYW1zLm8KIE9CSlMtJChDT05GSUdfU0VUU0FSX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHZmX2FzcGVjdC5vCiBPQkpTLSQoQ09ORklHX1NFVFRCX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSBzZXR0Yi5vCitPQkpTLSQoQ09ORklHX1NIQVJQTkVTU19WQUFQSV9GSUxURVIpICAgICAgICArPSB2Zl9taXNjX3ZhYXBpLm8gdmFhcGlfdnBwLm8KIE9CSlMtJChDT05GSUdfU0hPV0lORk9fRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX3Nob3dpbmZvLm8KIE9CSlMtJChDT05GSUdfU0hPV1BBTEVUVEVfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3Nob3dwYWxldHRlLm8KIE9CSlMtJChDT05GSUdfU0hVRkZMRUZSQU1FU19GSUxURVIpICAgICAgICAgICs9IHZmX3NodWZmbGVmcmFtZXMubwogT0JKUy0kKENPTkZJR19TSFVGRkxFUExBTkVTX0ZJTFRFUikgICAgICAgICAgKz0gdmZfc2h1ZmZsZXBsYW5lcy5vCitPQkpTLSQoQ09ORklHX1NJREVEQVRBX0ZJTFRFUikgICAgICAgICAgICAgICArPSBmX3NpZGVkYXRhLm8KIE9CSlMtJChDT05GSUdfU0lHTkFMU1RBVFNfRklMVEVSKSAgICAgICAgICAgICs9IHZmX3NpZ25hbHN0YXRzLm8KK09CSlMtJChDT05GSUdfU0lHTkFUVVJFX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3NpZ25hdHVyZS5vCiBPQkpTLSQoQ09ORklHX1NNQVJUQkxVUl9GSUxURVIpICAgICAgICAgICAgICArPSB2Zl9zbWFydGJsdXIubworT0JKUy0kKENPTkZJR19TT0JFTF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfY29udm9sdXRpb24ubwogT0JKUy0kKENPTkZJR19TUExJVF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gc3BsaXQubwogT0JKUy0kKENPTkZJR19TUFBfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0gdmZfc3BwLm8KLU9CSlMtJChDT05GSUdfU1NJTV9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHZmX3NzaW0ubyBkdWFsaW5wdXQubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19TU0lNX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0gdmZfc3NpbS5vIGZyYW1lc3luYy5vCiBPQkpTLSQoQ09ORklHX1NURVJFTzNEX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9zdGVyZW8zZC5vCi1PQkpTLSQoQ09ORklHX1NUUkVBTVNFTEVDVF9GSUxURVIpICAgICAgICAgICArPSBmX3N0cmVhbXNlbGVjdC5vCitPQkpTLSQoQ09ORklHX1NUUkVBTVNFTEVDVF9GSUxURVIpICAgICAgICAgICArPSBmX3N0cmVhbXNlbGVjdC5vIGZyYW1lc3luYy5vCiBPQkpTLSQoQ09ORklHX1NVQlRJVExFU19GSUxURVIpICAgICAgICAgICAgICArPSB2Zl9zdWJ0aXRsZXMubwogT0JKUy0kKENPTkZJR19TVVBFUjJYU0FJX0ZJTFRFUikgICAgICAgICAgICAgKz0gdmZfc3VwZXIyeHNhaS5vCiBPQkpTLSQoQ09ORklHX1NXQVBSRUNUX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl9zd2FwcmVjdC5vCiBPQkpTLSQoQ09ORklHX1NXQVBVVl9GSUxURVIpICAgICAgICAgICAgICAgICArPSB2Zl9zd2FwdXYubwotT0JKUy0kKENPTkZJR19UQkxFTkRfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfYmxlbmQubyBkdWFsaW5wdXQubyBmcmFtZXN5bmMubworT0JKUy0kKENPTkZJR19UQkxFTkRfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfYmxlbmQubyBmcmFtZXN5bmMubwogT0JKUy0kKENPTkZJR19URUxFQ0lORV9GSUxURVIpICAgICAgICAgICAgICAgKz0gdmZfdGVsZWNpbmUubworT0JKUy0kKENPTkZJR19USFJFU0hPTERfRklMVEVSKSAgICAgICAgICAgICAgKz0gdmZfdGhyZXNob2xkLm8gZnJhbWVzeW5jLm8KIE9CSlMtJChDT05GSUdfVEhVTUJOQUlMX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3RodW1ibmFpbC5vCitPQkpTLSQoQ09ORklHX1RIVU1CTkFJTF9DVURBX0ZJTFRFUikgICAgICAgICArPSB2Zl90aHVtYm5haWxfY3VkYS5vIHZmX3RodW1ibmFpbF9jdWRhLnB0eC5vCiBPQkpTLSQoQ09ORklHX1RJTEVfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2Zl90aWxlLm8KIE9CSlMtJChDT05GSUdfVElOVEVSTEFDRV9GSUxURVIpICAgICAgICAgICAgICs9IHZmX3RpbnRlcmxhY2UubworT0JKUy0kKENPTkZJR19UTFVUMl9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfbHV0Mi5vIGZyYW1lc3luYy5vCitPQkpTLSQoQ09ORklHX1RPTkVNQVBfRklMVEVSKSAgICAgICAgICAgICAgICArPSB2Zl90b25lbWFwLm8KIE9CSlMtJChDT05GSUdfVFJBTlNQT1NFX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3RyYW5zcG9zZS5vCiBPQkpTLSQoQ09ORklHX1RSSU1fRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB0cmltLm8KK09CSlMtJChDT05GSUdfVU5QUkVNVUxUSVBMWV9GSUxURVIpICAgICAgICAgICs9IHZmX3ByZW11bHRpcGx5Lm8gZnJhbWVzeW5jLm8KIE9CSlMtJChDT05GSUdfVU5TSEFSUF9GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX3Vuc2hhcnAubworT0JKUy0kKENPTkZJR19VTlNIQVJQX09QRU5DTF9GSUxURVIpICAgICAgICAgKz0gdmZfdW5zaGFycF9vcGVuY2wubyBvcGVuY2wubyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuY2wvdW5zaGFycC5vCiBPQkpTLSQoQ09ORklHX1VTUFBfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB2Zl91c3BwLm8KK09CSlMtJChDT05GSUdfVkFHVUVERU5PSVNFUl9GSUxURVIpICAgICAgICAgICs9IHZmX3ZhZ3VlZGVub2lzZXIubwogT0JKUy0kKENPTkZJR19WRUNUT1JTQ09QRV9GSUxURVIpICAgICAgICAgICAgKz0gdmZfdmVjdG9yc2NvcGUubwogT0JKUy0kKENPTkZJR19WRkxJUF9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdmZfdmZsaXAubworT0JKUy0kKENPTkZJR19WRlJERVRfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfdmZyZGV0Lm8KIE9CSlMtJChDT05GSUdfVklEU1RBQkRFVEVDVF9GSUxURVIpICAgICAgICAgICs9IHZpZHN0YWJ1dGlscy5vIHZmX3ZpZHN0YWJkZXRlY3QubwogT0JKUy0kKENPTkZJR19WSURTVEFCVFJBTlNGT1JNX0ZJTFRFUikgICAgICAgKz0gdmlkc3RhYnV0aWxzLm8gdmZfdmlkc3RhYnRyYW5zZm9ybS5vCiBPQkpTLSQoQ09ORklHX1ZJR05FVFRFX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2Zl92aWduZXR0ZS5vCitPQkpTLSQoQ09ORklHX1ZNQUZNT1RJT05fRklMVEVSKSAgICAgICAgICAgICArPSB2Zl92bWFmbW90aW9uLm8gZnJhbWVzeW5jLm8KK09CSlMtJChDT05GSUdfVlBQX1FTVl9GSUxURVIpICAgICAgICAgICAgICAgICs9IHZmX3ZwcF9xc3YubwogT0JKUy0kKENPTkZJR19WU1RBQ0tfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfc3RhY2subyBmcmFtZXN5bmMubwogT0JKUy0kKENPTkZJR19XM0ZESUZfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdmZfdzNmZGlmLm8KIE9CSlMtJChDT05GSUdfV0FWRUZPUk1fRklMVEVSKSAgICAgICAgICAgICAgICs9IHZmX3dhdmVmb3JtLm8KK09CSlMtJChDT05GSUdfV0VBVkVfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHZmX3dlYXZlLm8KIE9CSlMtJChDT05GSUdfWEJSX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgICs9IHZmX3hici5vCiBPQkpTLSQoQ09ORklHX1lBRElGX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB2Zl95YWRpZi5vCiBPQkpTLSQoQ09ORklHX1pNUV9GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSBmX3ptcS5vCkBAIC0yNzIsMzQgKzM3MywzOCBAQAogT0JKUy0kKENPTkZJR19BTExZVVZfRklMVEVSKSAgICAgICAgICAgICAgICAgKz0gdnNyY190ZXN0c3JjLm8KIE9CSlMtJChDT05GSUdfQ0VMTEFVVE9fRklMVEVSKSAgICAgICAgICAgICAgICs9IHZzcmNfY2VsbGF1dG8ubwogT0JKUy0kKENPTkZJR19DT0xPUl9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0gdnNyY190ZXN0c3JjLm8KK09CSlMtJChDT05GSUdfQ09SRUlNQUdFU1JDX0ZJTFRFUikgICAgICAgICAgICs9IHZmX2NvcmVpbWFnZS5vCiBPQkpTLSQoQ09ORklHX0ZSRUkwUl9TUkNfRklMVEVSKSAgICAgICAgICAgICArPSB2Zl9mcmVpMHIubwogT0JKUy0kKENPTkZJR19IQUxEQ0xVVFNSQ19GSUxURVIpICAgICAgICAgICAgKz0gdnNyY190ZXN0c3JjLm8KIE9CSlMtJChDT05GSUdfTElGRV9GSUxURVIpICAgICAgICAgICAgICAgICAgICs9IHZzcmNfbGlmZS5vCiBPQkpTLSQoQ09ORklHX01BTkRFTEJST1RfRklMVEVSKSAgICAgICAgICAgICArPSB2c3JjX21hbmRlbGJyb3QubwogT0JKUy0kKENPTkZJR19NUFRFU1RTUkNfRklMVEVSKSAgICAgICAgICAgICAgKz0gdnNyY19tcHRlc3RzcmMubwogT0JKUy0kKENPTkZJR19OVUxMU1JDX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0gdnNyY190ZXN0c3JjLm8KK09CSlMtJChDT05GSUdfT1BFTkNMU1JDX0ZJTFRFUikgICAgICAgICAgICAgICs9IHZmX3Byb2dyYW1fb3BlbmNsLm8gb3BlbmNsLm8KIE9CSlMtJChDT05GSUdfUkdCVEVTVFNSQ19GSUxURVIpICAgICAgICAgICAgICs9IHZzcmNfdGVzdHNyYy5vCiBPQkpTLSQoQ09ORklHX1NNUFRFQkFSU19GSUxURVIpICAgICAgICAgICAgICArPSB2c3JjX3Rlc3RzcmMubwogT0JKUy0kKENPTkZJR19TTVBURUhEQkFSU19GSUxURVIpICAgICAgICAgICAgKz0gdnNyY190ZXN0c3JjLm8KIE9CSlMtJChDT05GSUdfVEVTVFNSQ19GSUxURVIpICAgICAgICAgICAgICAgICs9IHZzcmNfdGVzdHNyYy5vCiBPQkpTLSQoQ09ORklHX1RFU1RTUkMyX0ZJTFRFUikgICAgICAgICAgICAgICArPSB2c3JjX3Rlc3RzcmMubworT0JKUy0kKENPTkZJR19ZVVZURVNUU1JDX0ZJTFRFUikgICAgICAgICAgICAgKz0gdnNyY190ZXN0c3JjLm8KIAogT0JKUy0kKENPTkZJR19OVUxMU0lOS19GSUxURVIpICAgICAgICAgICAgICAgKz0gdnNpbmtfbnVsbHNpbmsubwogCiAjIG11bHRpbWVkaWEgZmlsdGVycworT0JKUy0kKENPTkZJR19BQklUU0NPUEVfRklMVEVSKSAgICAgICAgICAgICAgKz0gYXZmX2FiaXRzY29wZS5vCiBPQkpTLSQoQ09ORklHX0FEUkFXR1JBUEhfRklMVEVSKSAgICAgICAgICAgICArPSBmX2RyYXdncmFwaC5vCiBPQkpTLSQoQ09ORklHX0FISVNUT0dSQU1fRklMVEVSKSAgICAgICAgICAgICArPSBhdmZfYWhpc3RvZ3JhbS5vCiBPQkpTLSQoQ09ORklHX0FQSEFTRU1FVEVSX0ZJTFRFUikgICAgICAgICAgICArPSBhdmZfYXBoYXNlbWV0ZXIubwogT0JKUy0kKENPTkZJR19BVkVDVE9SU0NPUEVfRklMVEVSKSAgICAgICAgICAgKz0gYXZmX2F2ZWN0b3JzY29wZS5vCiBPQkpTLSQoQ09ORklHX0NPTkNBVF9GSUxURVIpICAgICAgICAgICAgICAgICArPSBhdmZfY29uY2F0Lm8KIE9CSlMtJChDT05GSUdfU0hPV0NRVF9GSUxURVIpICAgICAgICAgICAgICAgICs9IGF2Zl9zaG93Y3F0Lm8gbHN3c3V0aWxzLm8gbGF2ZnV0aWxzLm8KLU9CSlMtJChDT05GSUdfU0hPV0ZSRVFTX0ZJTFRFUikgICAgICAgICAgICAgICs9IGF2Zl9zaG93ZnJlcXMubyB3aW5kb3dfZnVuYy5vCi1PQkpTLSQoQ09ORklHX1NIT1dTUEVDVFJVTV9GSUxURVIpICAgICAgICAgICArPSBhdmZfc2hvd3NwZWN0cnVtLm8gd2luZG93X2Z1bmMubwotT0JKUy0kKENPTkZJR19TSE9XU1BFQ1RSVU1QSUNfRklMVEVSKSAgICAgICAgKz0gYXZmX3Nob3dzcGVjdHJ1bS5vIHdpbmRvd19mdW5jLm8KK09CSlMtJChDT05GSUdfU0hPV0ZSRVFTX0ZJTFRFUikgICAgICAgICAgICAgICs9IGF2Zl9zaG93ZnJlcXMubworT0JKUy0kKENPTkZJR19TSE9XU1BFQ1RSVU1fRklMVEVSKSAgICAgICAgICAgKz0gYXZmX3Nob3dzcGVjdHJ1bS5vCitPQkpTLSQoQ09ORklHX1NIT1dTUEVDVFJVTVBJQ19GSUxURVIpICAgICAgICArPSBhdmZfc2hvd3NwZWN0cnVtLm8KIE9CSlMtJChDT05GSUdfU0hPV1ZPTFVNRV9GSUxURVIpICAgICAgICAgICAgICs9IGF2Zl9zaG93dm9sdW1lLm8KIE9CSlMtJChDT05GSUdfU0hPV1dBVkVTX0ZJTFRFUikgICAgICAgICAgICAgICs9IGF2Zl9zaG93d2F2ZXMubwogT0JKUy0kKENPTkZJR19TSE9XV0FWRVNQSUNfRklMVEVSKSAgICAgICAgICAgKz0gYXZmX3Nob3d3YXZlcy5vCi1PQkpTLSQoQ09ORklHX1NQRUNUUlVNU1lOVEhfRklMVEVSKSAgICAgICAgICArPSB2YWZfc3BlY3RydW1zeW50aC5vIHdpbmRvd19mdW5jLm8KK09CSlMtJChDT05GSUdfU1BFQ1RSVU1TWU5USF9GSUxURVIpICAgICAgICAgICs9IHZhZl9zcGVjdHJ1bXN5bnRoLm8KIAogIyBtdWx0aW1lZGlhIHNvdXJjZXMKIE9CSlMtJChDT05GSUdfQU1PVklFX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHNyY19tb3ZpZS5vCkBAIC0zMDksMTUgKzQxNCwyMyBAQAogU0xJQk9CSlMtJChIQVZFX0dOVV9XSU5EUkVTKSAgICAgICAgICAgICAgICAgKz0gYXZmaWx0ZXJyZXMubwogCiBTS0lQSEVBREVSUy0kKENPTkZJR19MSUJWSURTVEFCKSAgICAgICAgICAgICArPSB2aWRzdGFidXRpbHMuaAotU0tJUEhFQURFUlMtJChDT05GSUdfT1BFTkNMKSAgICAgICAgICAgICAgICAgKz0gb3BlbmNsX2ludGVybmFsLmggZGVzaGFrZV9vcGVuY2xfa2VybmVsLmggdW5zaGFycF9vcGVuY2xfa2VybmVsLmgKIAotT0JKUy0kKEhBVkVfVEhSRUFEUykgICAgICAgICAgICAgICAgICAgICAgICAgKz0gcHRocmVhZC5vCiBPQkpTLSQoQ09ORklHX1NIQVJFRCkgICAgICAgICAgICAgICAgICAgICAgICArPSBsb2cyX3RhYi5vCiAKK1NLSVBIRUFERVJTLSQoQ09ORklHX1FTVlZQUCkgICAgICAgICAgICAgICAgICs9IHFzdnZwcC5oCitTS0lQSEVBREVSUy0kKENPTkZJR19PUEVOQ0wpICAgICAgICAgICAgICAgICArPSBvcGVuY2wuaAorU0tJUEhFQURFUlMtJChDT05GSUdfVkFBUEkpICAgICAgICAgICAgICAgICAgKz0gdmFhcGlfdnBwLmgKKwogVE9PTFMgICAgID0gZ3JhcGgyZG90Ci1URVNUUFJPR1MgPSBkcmF3dXRpbHMgZmlsdGZtdHMgZm9ybWF0cworVEVTVFBST0dTID0gZHJhd3V0aWxzIGZpbHRmbXRzIGZvcm1hdHMgaW50ZWdyYWwKIAogVE9PTFMtJChDT05GSUdfTElCWk1RKSArPSB6bXFzZW5kCiAKIGNsZWFuOjoKIAkkKFJNKSAkKENMRUFOU1VGRklYRVM6JT1saWJhdmZpbHRlci9saWJtcGNvZGVjcy8lKQorCitPUEVOQ0wgPSAkKHN1YnN0ICQoU1JDX1BBVEgpLywsJCh3aWxkY2FyZCAkKFNSQ19QQVRIKS9saWJhdmZpbHRlci9vcGVuY2wvKi5jbCkpCisuU0VDT05EQVJZOiAkKE9QRU5DTDouY2w9LmMpCitsaWJhdmZpbHRlci9vcGVuY2wvJS5jOiBUQUcgPSBPUEVOQ0wKK2xpYmF2ZmlsdGVyL29wZW5jbC8lLmM6ICQoU1JDX1BBVEgpL2xpYmF2ZmlsdGVyL29wZW5jbC8lLmNsCisJJChNKSQoU1JDX1BBVEgpL3Rvb2xzL2NsMmMgJDwgJEAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FldmFsLmMgYi9saWJhdmZpbHRlci9hZXZhbC5jCmluZGV4IGFjOWRlYTguLmNkZGRiYWYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FldmFsLmMKKysrIGIvbGliYXZmaWx0ZXIvYWV2YWwuYwpAQCAtNTMsNyArNTMsNyBAQAogICAgIFZBUl9WQVJTX05CCiB9OwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBFdmFsQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgY2hhciAqc2FtcGxlX3JhdGVfc3RyOwogICAgIGludCBzYW1wbGVfcmF0ZTsKQEAgLTI3NywxNiArMjc3LDI0IEBACiAgICAgQVZGcmFtZSAqc2FtcGxlc3JlZjsKICAgICBpbnQgaSwgajsKICAgICBpbnQ2NF90IHQgPSBhdl9yZXNjYWxlKGV2YWwtPm4sIEFWX1RJTUVfQkFTRSwgZXZhbC0+c2FtcGxlX3JhdGUpOworICAgIGludCBuYl9zYW1wbGVzOwogCiAgICAgaWYgKGV2YWwtPmR1cmF0aW9uID49IDAgJiYgdCA+PSBldmFsLT5kdXJhdGlvbikKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogCi0gICAgc2FtcGxlc3JlZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgZXZhbC0+bmJfc2FtcGxlcyk7CisgICAgaWYgKGV2YWwtPmR1cmF0aW9uID49IDApIHsKKyAgICAgICAgbmJfc2FtcGxlcyA9IEZGTUlOKGV2YWwtPm5iX3NhbXBsZXMsIGF2X3Jlc2NhbGUoZXZhbC0+ZHVyYXRpb24sIGV2YWwtPnNhbXBsZV9yYXRlLCBBVl9USU1FX0JBU0UpIC0gZXZhbC0+cHRzKTsKKyAgICAgICAgaWYgKCFuYl9zYW1wbGVzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0gZWxzZSB7CisgICAgICAgIG5iX3NhbXBsZXMgPSBldmFsLT5uYl9zYW1wbGVzOworICAgIH0KKyAgICBzYW1wbGVzcmVmID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKTsKICAgICBpZiAoIXNhbXBsZXNyZWYpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICAvKiBldmFsdWF0ZSBleHByZXNzaW9uIGZvciBlYWNoIHNpbmdsZSBzYW1wbGUgYW5kIGZvciBlYWNoIGNoYW5uZWwgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgZXZhbC0+bmJfc2FtcGxlczsgaSsrLCBldmFsLT5uKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2FtcGxlczsgaSsrLCBldmFsLT5uKyspIHsKICAgICAgICAgZXZhbC0+dmFyX3ZhbHVlc1tWQVJfTl0gPSBldmFsLT5uOwogICAgICAgICBldmFsLT52YXJfdmFsdWVzW1ZBUl9UXSA9IGV2YWwtPnZhcl92YWx1ZXNbVkFSX05dICogKGRvdWJsZSkxL2V2YWwtPnNhbXBsZV9yYXRlOwogCkBAIC0yOTgsNyArMzA2LDcgQEAKIAogICAgIHNhbXBsZXNyZWYtPnB0cyA9IGV2YWwtPnB0czsKICAgICBzYW1wbGVzcmVmLT5zYW1wbGVfcmF0ZSA9IGV2YWwtPnNhbXBsZV9yYXRlOwotICAgIGV2YWwtPnB0cyArPSBldmFsLT5uYl9zYW1wbGVzOworICAgIGV2YWwtPnB0cyArPSBuYl9zYW1wbGVzOwogCiAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBzYW1wbGVzcmVmKTsKIH0KQEAgLTQxOSwxMCArNDI3LDExIEBACiAgICAgZG91YmxlIHQwOwogICAgIGludCBpLCBqOwogCi0gICAgLyogZG8gdm9sdW1lIHNjYWxpbmcgaW4tcGxhY2UgaWYgaW5wdXQgYnVmZmVyIGlzIHdyaXRhYmxlICovCiAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKTsKLSAgICBpZiAoIW91dCkKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQogICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CiAKICAgICB0MCA9IFRTMlQoaW4tPnB0cywgaW5saW5rLT50aW1lX2Jhc2UpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfYWNvbnRyYXN0LmMgYi9saWJhdmZpbHRlci9hZl9hY29udHJhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDgwNTMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvYWZfYWNvbnRyYXN0LmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggUm9iIFN5a2VzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQXVkaW9Db250cmFzdENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGZsb2F0IGNvbnRyYXN0OworICAgIHZvaWQgKCpmaWx0ZXIpKHZvaWQgKipkc3QsIGNvbnN0IHZvaWQgKipzcmMsCisgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBjaGFubmVscywgZmxvYXQgY29udHJhc3QpOworfSBBdWRpb0NvbnRyYXN0Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQXVkaW9Db250cmFzdENvbnRleHQsIHgpCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhY29udHJhc3Rfb3B0aW9uc1tdID0geworICAgIHsgImNvbnRyYXN0IiwgInNldCBjb250cmFzdCIsIE9GRlNFVChjb250cmFzdCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0zM30sIDAsIDEwMCwgQSB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYWNvbnRyYXN0KTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0cyA9IE5VTEw7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsIEFWX1NBTVBMRV9GTVRfREJMUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9mbHQodm9pZCAqKmQsIGNvbnN0IHZvaWQgKipzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjb250cmFzdCkKK3sKKyAgICBjb25zdCBmbG9hdCAqc3JjID0gc1swXTsKKyAgICBmbG9hdCAqZHN0ID0gZFswXTsKKyAgICBpbnQgbiwgYzsKKworICAgIGZvciAobiA9IDA7IG4gPCBuYl9zYW1wbGVzOyBuKyspIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGQgPSBzcmNbY10gKiBNX1BJXzI7CisKKyAgICAgICAgICAgIGRzdFtjXSA9IHNpbmYoZCArIGNvbnRyYXN0ICogc2luZihkICogNCkpOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICs9IGM7CisgICAgICAgIHNyYyArPSBjOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyX2RibCh2b2lkICoqZCwgY29uc3Qgdm9pZCAqKnMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNvbnRyYXN0KQoreworICAgIGNvbnN0IGRvdWJsZSAqc3JjID0gc1swXTsKKyAgICBkb3VibGUgKmRzdCA9IGRbMF07CisgICAgaW50IG4sIGM7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmJfc2FtcGxlczsgbisrKSB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBkb3VibGUgZCA9IHNyY1tjXSAqIE1fUElfMjsKKworICAgICAgICAgICAgZHN0W2NdID0gc2luKGQgKyBjb250cmFzdCAqIHNpbihkICogNCkpOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICs9IGM7CisgICAgICAgIHNyYyArPSBjOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyX2ZsdHAodm9pZCAqKmQsIGNvbnN0IHZvaWQgKipzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNvbnRyYXN0KQoreworICAgIGludCBuLCBjOworCisgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgY29uc3QgZmxvYXQgKnNyYyA9IHNbY107CisgICAgICAgIGZsb2F0ICpkc3QgPSBkW2NdOworCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBuYl9zYW1wbGVzOyBuKyspIHsKKyAgICAgICAgICAgIGZsb2F0IGQgPSBzcmNbbl0gKiBNX1BJXzI7CisKKyAgICAgICAgICAgIGRzdFtuXSA9IHNpbmYoZCArIGNvbnRyYXN0ICogc2luZihkICogNCkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXJfZGJscCh2b2lkICoqZCwgY29uc3Qgdm9pZCAqKnMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY29udHJhc3QpCit7CisgICAgaW50IG4sIGM7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICBjb25zdCBkb3VibGUgKnNyYyA9IHNbY107CisgICAgICAgIGRvdWJsZSAqZHN0ID0gZFtjXTsKKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbmJfc2FtcGxlczsgbisrKSB7CisgICAgICAgICAgICBkb3VibGUgZCA9IHNyY1tuXSAqIE1fUElfMjsKKworICAgICAgICAgICAgZHN0W25dID0gc2luKGQgKyBjb250cmFzdCAqIHNpbihkICogNCkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEF1ZGlvQ29udHJhc3RDb250ZXh0ICpzICAgID0gY3R4LT5wcml2OworCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6ICBzLT5maWx0ZXIgPSBmaWx0ZXJfZmx0OyAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDogIHMtPmZpbHRlciA9IGZpbHRlcl9kYmw7ICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUDogcy0+ZmlsdGVyID0gZmlsdGVyX2ZsdHA7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOiBzLT5maWx0ZXIgPSBmaWx0ZXJfZGJscDsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBdWRpb0NvbnRyYXN0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXQ7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIHMtPmZpbHRlcigodm9pZCAqKilvdXQtPmV4dGVuZGVkX2RhdGEsIChjb25zdCB2b2lkICoqKWluLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICBpbi0+bmJfc2FtcGxlcywgaW4tPmNoYW5uZWxzLCBzLT5jb250cmFzdCAvIDc1MCk7CisKKyAgICBpZiAob3V0ICE9IGluKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hY29udHJhc3QgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFjb250cmFzdCIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNpbXBsZSBhdWRpbyBkeW5hbWljIHJhbmdlIGNvbXByZXNzaW9uL2V4cGFuc2lvbiBmaWx0ZXIuIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoQXVkaW9Db250cmFzdENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhY29udHJhc3RfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICA9IG91dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfYWNvcHkuYyBiL2xpYmF2ZmlsdGVyL2FmX2Fjb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg0OTA2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2Fjb3B5LmMKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKKworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBhdl9mcmFtZV9jb3B5KG91dCwgaW4pOworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhY29weV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFjb3B5X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hY29weSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhY29weSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29weSB0aGUgaW5wdXQgYXVkaW8gdW5jaGFuZ2VkIHRvIHRoZSBvdXRwdXQuIiksCisgICAgLmlucHV0cyAgICAgICAgPSBhY29weV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhY29weV9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FjcnVzaGVyLmMgYi9saWJhdmZpbHRlci9hZl9hY3J1c2hlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2U3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9hZl9hY3J1c2hlci5jCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSBNYXJrdXMgU2NobWlkdCBhbmQgQ2hyaXN0aWFuIEhvbHNjaHVoCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKK3R5cGVkZWYgc3RydWN0IExGT0NvbnRleHQgeworICAgIGRvdWJsZSBmcmVxOworICAgIGRvdWJsZSBvZmZzZXQ7CisgICAgaW50IHNyYXRlOworICAgIGRvdWJsZSBhbW91bnQ7CisgICAgZG91YmxlIHB3aWR0aDsKKyAgICBkb3VibGUgcGhhc2U7Cit9IExGT0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFNSQ29udGV4dCB7CisgICAgZG91YmxlIHRhcmdldDsKKyAgICBkb3VibGUgcmVhbDsKKyAgICBkb3VibGUgc2FtcGxlczsKKyAgICBkb3VibGUgbGFzdDsKK30gU1JDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBBQ3J1c2hlckNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgZG91YmxlIGxldmVsX2luOworICAgIGRvdWJsZSBsZXZlbF9vdXQ7CisgICAgZG91YmxlIGJpdHM7CisgICAgZG91YmxlIG1peDsKKyAgICBpbnQgbW9kZTsKKyAgICBkb3VibGUgZGM7CisgICAgZG91YmxlIGlkYzsKKyAgICBkb3VibGUgYWE7CisgICAgZG91YmxlIHNhbXBsZXM7CisgICAgaW50IGlzX2xmbzsKKyAgICBkb3VibGUgbGZvcmFuZ2U7CisgICAgZG91YmxlIGxmb3JhdGU7CisKKyAgICBkb3VibGUgc3FyOworICAgIGRvdWJsZSBhYTE7CisgICAgZG91YmxlIGNvZWZmOworICAgIGludCAgICByb3VuZDsKKyAgICBkb3VibGUgc292OworICAgIGRvdWJsZSBzbWluOworICAgIGRvdWJsZSBzZGlmZjsKKworICAgIExGT0NvbnRleHQgbGZvOworICAgIFNSQ29udGV4dCAqc3I7Cit9IEFDcnVzaGVyQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQUNydXNoZXJDb250ZXh0LCB4KQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gYWNydXNoZXJfb3B0aW9uc1tdID0geworICAgIHsgImxldmVsX2luIiwgInNldCBsZXZlbCBpbiIsICAgICAgICAgT0ZGU0VUKGxldmVsX2luKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MX0sICAgIDAuMDE1NjI1LCA2NCwgQSB9LAorICAgIHsgImxldmVsX291dCIsInNldCBsZXZlbCBvdXQiLCAgICAgICAgT0ZGU0VUKGxldmVsX291dCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MX0sICAgIDAuMDE1NjI1LCA2NCwgQSB9LAorICAgIHsgImJpdHMiLCAgICAgInNldCBiaXQgcmVkdWN0aW9uIiwgICAgT0ZGU0VUKGJpdHMpLCAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9OH0sICAgIDEsICAgICAgICA2NCwgQSB9LAorICAgIHsgIm1peCIsICAgICAgInNldCBtaXgiLCAgICAgICAgICAgICAgT0ZGU0VUKG1peCksICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9LjV9LCAgIDAsICAgICAgICAgMSwgQSB9LAorICAgIHsgIm1vZGUiLCAgICAgInNldCBtb2RlIiwgICAgICAgICAgICAgT0ZGU0VUKG1vZGUpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQ9MH0sICAgIDAsICAgICAgICAgMSwgQSwgIm1vZGUiIH0sCisgICAgeyAgICJsaW4iLCAgICAibGluZWFyIiwgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND0wfSwgICAgMCwgICAgICAgICAwLCBBLCAibW9kZSIgfSwKKyAgICB7ICAgImxvZyIsICAgICJsb2dhcml0aG1pYyIsICAgICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTF9LCAgICAwLCAgICAgICAgIDAsIEEsICJtb2RlIiB9LAorICAgIHsgImRjIiwgICAgICAgInNldCBEQyIsICAgICAgICAgICAgICAgT0ZGU0VUKGRjKSwgICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MX0sICAuMjUsICAgICAgICAgNCwgQSB9LAorICAgIHsgImFhIiwgICAgICAgInNldCBhbnRpLWFsaWFzaW5nIiwgICAgT0ZGU0VUKGFhKSwgICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9LjV9LCAgIDAsICAgICAgICAgMSwgQSB9LAorICAgIHsgInNhbXBsZXMiLCAgInNldCBzYW1wbGUgcmVkdWN0aW9uIiwgT0ZGU0VUKHNhbXBsZXMpLCAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MX0sICAgIDEsICAgICAgIDI1MCwgQSB9LAorICAgIHsgImxmbyIsICAgICAgImVuYWJsZSBMRk8iLCAgICAgICAgICAgT0ZGU0VUKGlzX2xmbyksICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MH0sICAgIDAsICAgICAgICAgMSwgQSB9LAorICAgIHsgImxmb3JhbmdlIiwgInNldCBMRk8gZGVwdGgiLCAgICAgICAgT0ZGU0VUKGxmb3JhbmdlKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MjB9LCAgIDEsICAgICAgIDI1MCwgQSB9LAorICAgIHsgImxmb3JhdGUiLCAgInNldCBMRk8gcmF0ZSIsICAgICAgICAgT0ZGU0VUKGxmb3JhdGUpLCAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9LjN9LCAuMDEsICAgICAgIDIwMCwgQSB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYWNydXNoZXIpOworCitzdGF0aWMgZG91YmxlIHNhbXBsZXJlZHVjdGlvbihBQ3J1c2hlckNvbnRleHQgKnMsIFNSQ29udGV4dCAqc3IsIGRvdWJsZSBpbikKK3sKKyAgICBzci0+c2FtcGxlcysrOworICAgIGlmIChzci0+c2FtcGxlcyA+PSBzLT5yb3VuZCkgeworICAgICAgICBzci0+dGFyZ2V0ICs9IHMtPnNhbXBsZXM7CisgICAgICAgIHNyLT5yZWFsICs9IHMtPnJvdW5kOworICAgICAgICBpZiAoc3ItPnRhcmdldCArIHMtPnNhbXBsZXMgPj0gc3ItPnJlYWwgKyAxKSB7CisgICAgICAgICAgICBzci0+bGFzdCA9IGluOworICAgICAgICAgICAgc3ItPnRhcmdldCA9IDA7CisgICAgICAgICAgICBzci0+cmVhbCAgID0gMDsKKyAgICAgICAgfQorICAgICAgICBzci0+c2FtcGxlcyA9IDA7CisgICAgfQorICAgIHJldHVybiBzci0+bGFzdDsKK30KKworc3RhdGljIGRvdWJsZSBhZGRfZGMoZG91YmxlIHMsIGRvdWJsZSBkYywgZG91YmxlIGlkYykKK3sKKyAgICByZXR1cm4gcyA+IDAgPyBzICogZGMgOiBzICogaWRjOworfQorCitzdGF0aWMgZG91YmxlIHJlbW92ZV9kYyhkb3VibGUgcywgZG91YmxlIGRjLCBkb3VibGUgaWRjKQoreworICAgIHJldHVybiBzID4gMCA/IHMgKiBpZGMgOiBzICogZGM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIGZhY3Rvcihkb3VibGUgeSwgZG91YmxlIGssIGRvdWJsZSBhYTEsIGRvdWJsZSBhYSkKK3sKKyAgICByZXR1cm4gMC41ICogKHNpbihNX1BJICogKGZhYnMoeSAtIGspIC0gYWExKSAvIGFhIC0gTV9QSV8yKSArIDEpOworfQorCitzdGF0aWMgZG91YmxlIGJpdHJlZHVjdGlvbihBQ3J1c2hlckNvbnRleHQgKnMsIGRvdWJsZSBpbikKK3sKKyAgICBjb25zdCBkb3VibGUgc3FyID0gcy0+c3FyOworICAgIGNvbnN0IGRvdWJsZSBjb2VmZiA9IHMtPmNvZWZmOworICAgIGNvbnN0IGRvdWJsZSBhYSA9IHMtPmFhOworICAgIGNvbnN0IGRvdWJsZSBhYTEgPSBzLT5hYTE7CisgICAgZG91YmxlIHksIGs7CisKKyAgICAvLyBhZGQgZGMKKyAgICBpbiA9IGFkZF9kYyhpbiwgcy0+ZGMsIHMtPmlkYyk7CisKKyAgICAvLyBtYWluIHJvdW5kaW5nIGNhbGN1bGF0aW9uIGRlcGVuZGluZyBvbiBtb2RlCisKKyAgICAvLyB0aGUgaWRlYSBmb3IgYW50aS1hbGlhc2luZzoKKyAgICAvLyB5b3UgbmVlZCBhIGZ1bmN0aW9uIGYgd2hpY2ggYnJpbmdzIHlvdSB0byB0aGUgc2NhbGUsIHdoZXJlCisgICAgLy8geW91IHdhbnQgdG8gcm91bmQgYW5kIHRoZSBmdW5jdGlvbiBmX2IgKHdpdGggZihmX2IpPWlkKSB3aGljaAorICAgIC8vIGJyaW5ncyB5b3UgYmFjayB0byB5b3VyIG9yaWdpbmFsIHNjYWxlLgorICAgIC8vCisgICAgLy8gdGhlbiB5b3UgY2FuIHVzZSB0aGUgbG9naWMgYmVsb3cgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisgICAgLy8geSA9IGYoaW4pIGFuZCBrID0gcm91bmRmKHkpCisgICAgLy8gaWYgKHkgPiBrICsgYWExKQorICAgIC8vICAgICAgayA9IGZfYihrKSArICggZl9iKGsrMSkgLSBmX2IoaykgKSAqIDAuNSAqIChzaW4oeCAtIFBJLzIpICsgMSkKKyAgICAvLyBpZiAoeSA8IGsgKyBhYTEpCisgICAgLy8gICAgICBrID0gZl9iKGspIC0gKCBmX2IoaysxKSAtIGZfYihrKSApICogMC41ICogKHNpbih4IC0gUEkvMikgKyAxKQorICAgIC8vCisgICAgLy8gd2hlcmVhcyB4ID0gKGZhYnMoZihpbikgLSBrKSAtIGFhMSkgKiBQSSAvIGFhCisgICAgLy8gZm9yIGJvdGggY2FzZXMuCisKKyAgICBzd2l0Y2ggKHMtPm1vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gbGluZWFyCisgICAgICAgIHkgPSBpbiAqIGNvZWZmOworICAgICAgICBrID0gcm91bmRmKHkpOworICAgICAgICBpZiAoayAtIGFhMSA8PSB5ICYmIHkgPD0gayArIGFhMSkgeworICAgICAgICAgICAgayAvPSBjb2VmZjsKKyAgICAgICAgfSBlbHNlIGlmICh5ID4gayArIGFhMSkgeworICAgICAgICAgICAgayA9IGsgLyBjb2VmZiArICgoayArIDEpIC8gY29lZmYgLSBrIC8gY29lZmYpICoKKyAgICAgICAgICAgICAgICBmYWN0b3IoeSwgaywgYWExLCBhYSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBrID0gayAvIGNvZWZmIC0gKGsgLyBjb2VmZiAtIChrIC0gMSkgLyBjb2VmZikgKgorICAgICAgICAgICAgICAgIGZhY3Rvcih5LCBrLCBhYTEsIGFhKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIC8vIGxvZ2FyaXRobWljCisgICAgICAgIHkgPSBzcXIgKiBsb2coZmFicyhpbikpICsgc3FyICogc3FyOworICAgICAgICBrID0gcm91bmRmKHkpOworICAgICAgICBpZighaW4pIHsKKyAgICAgICAgICAgIGsgPSAwOworICAgICAgICB9IGVsc2UgaWYgKGsgLSBhYTEgPD0geSAmJiB5IDw9IGsgKyBhYTEpIHsKKyAgICAgICAgICAgIGsgPSBpbiAvIGZhYnMoaW4pICogZXhwKGsgLyBzcXIgLSBzcXIpOworICAgICAgICB9IGVsc2UgaWYgKHkgPiBrICsgYWExKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IGV4cChrIC8gc3FyIC0gc3FyKTsKKyAgICAgICAgICAgIGsgPSBGRlNJR04oaW4pICogKHggKyAoZXhwKChrICsgMSkgLyBzcXIgLSBzcXIpIC0geCkgKgorICAgICAgICAgICAgICAgIGZhY3Rvcih5LCBrLCBhYTEsIGFhKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IGV4cChrIC8gc3FyIC0gc3FyKTsKKyAgICAgICAgICAgIGsgPSBpbiAvIGZhYnMoaW4pICogKHggLSAoeCAtIGV4cCgoayAtIDEpIC8gc3FyIC0gc3FyKSkgKgorICAgICAgICAgICAgICAgIGZhY3Rvcih5LCBrLCBhYTEsIGFhKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gbWl4IGJldHdlZW4gZHJ5IGFuZCB3ZXQgc2lnbmFsCisgICAgayArPSAoaW4gLSBrKSAqIHMtPm1peDsKKworICAgIC8vIHJlbW92ZSBkYworICAgIGsgPSByZW1vdmVfZGMoaywgcy0+ZGMsIHMtPmlkYyk7CisKKyAgICByZXR1cm4gazsKK30KKworc3RhdGljIGRvdWJsZSBsZm9fZ2V0KExGT0NvbnRleHQgKmxmbykKK3sKKyAgICBkb3VibGUgcGhzID0gRkZNSU4oMTAwLiwgbGZvLT5waGFzZSAvIEZGTUlOKDEuOTksIEZGTUFYKDAuMDEsIGxmby0+cHdpZHRoKSkgKyBsZm8tPm9mZnNldCk7CisgICAgZG91YmxlIHZhbDsKKworICAgIGlmIChwaHMgPiAxKQorICAgICAgICBwaHMgPSBmbW9kKHBocywgMS4pOworCisgICAgdmFsID0gc2luKChwaHMgKiAzNjAuKSAqIE1fUEkgLyAxODApOworCisgICAgcmV0dXJuIHZhbCAqIGxmby0+YW1vdW50OworfQorCitzdGF0aWMgdm9pZCBsZm9fYWR2YW5jZShMRk9Db250ZXh0ICpsZm8sIHVuc2lnbmVkIGNvdW50KQoreworICAgIGxmby0+cGhhc2UgPSBmYWJzKGxmby0+cGhhc2UgKyBjb3VudCAqIGxmby0+ZnJlcSAqICgxLiAvIGxmby0+c3JhdGUpKTsKKyAgICBpZiAobGZvLT5waGFzZSA+PSAxLikKKyAgICAgICAgbGZvLT5waGFzZSA9IGZtb2QobGZvLT5waGFzZSwgMS4pOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBQ3J1c2hlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBjb25zdCBkb3VibGUgKnNyYyA9IChjb25zdCBkb3VibGUgKilpbi0+ZGF0YVswXTsKKyAgICBkb3VibGUgKmRzdDsKKyAgICBjb25zdCBkb3VibGUgbGV2ZWxfaW4gPSBzLT5sZXZlbF9pbjsKKyAgICBjb25zdCBkb3VibGUgbGV2ZWxfb3V0ID0gcy0+bGV2ZWxfb3V0OworICAgIGNvbnN0IGRvdWJsZSBtaXggPSBzLT5taXg7CisgICAgaW50IG4sIGM7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZHN0ID0gKGRvdWJsZSAqKW91dC0+ZGF0YVswXTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgaW4tPm5iX3NhbXBsZXM7IG4rKykgeworICAgICAgICBpZiAocy0+aXNfbGZvKSB7CisgICAgICAgICAgICBzLT5zYW1wbGVzID0gcy0+c21pbiArIHMtPnNkaWZmICogKGxmb19nZXQoJnMtPmxmbykgKyAwLjUpOworICAgICAgICAgICAgcy0+cm91bmQgPSByb3VuZChzLT5zYW1wbGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBzYW1wbGUgPSBzcmNbY10gKiBsZXZlbF9pbjsKKworICAgICAgICAgICAgc2FtcGxlID0gbWl4ICogc2FtcGxlcmVkdWN0aW9uKHMsICZzLT5zcltjXSwgc2FtcGxlKSArIHNyY1tjXSAqICgxLiAtIG1peCkgKiBsZXZlbF9pbjsKKyAgICAgICAgICAgIGRzdFtjXSA9IGJpdHJlZHVjdGlvbihzLCBzYW1wbGUpICogbGV2ZWxfb3V0OworICAgICAgICB9CisgICAgICAgIHNyYyArPSBjOworICAgICAgICBkc3QgKz0gYzsKKworICAgICAgICBpZiAocy0+aXNfbGZvKQorICAgICAgICAgICAgbGZvX2FkdmFuY2UoJnMtPmxmbywgMSk7CisgICAgfQorCisgICAgaWYgKGluICE9IG91dCkKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH07CisgICAgaW50IHJldDsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0ID0gZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0ID0gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFDcnVzaGVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzLT5zcik7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQUNydXNoZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGRvdWJsZSByYWQsIHN1bmRlciwgc21heCwgc292ZXI7CisKKyAgICBzLT5pZGMgPSAxLiAvIHMtPmRjOworICAgIHMtPmNvZWZmID0gZXhwMihzLT5iaXRzKSAtIDE7CisgICAgcy0+c3FyID0gc3FydChzLT5jb2VmZiAvIDIpOworICAgIHMtPmFhMSA9ICgxLiAtIHMtPmFhKSAvIDIuOworICAgIHMtPnJvdW5kID0gcm91bmQocy0+c2FtcGxlcyk7CisgICAgcmFkID0gcy0+bGZvcmFuZ2UgLyAyLjsKKyAgICBzLT5zbWluID0gRkZNQVgocy0+c2FtcGxlcyAtIHJhZCwgMS4pOworICAgIHN1bmRlciAgID0gcy0+c2FtcGxlcyAtIHJhZCAtIHMtPnNtaW47CisgICAgc21heCA9IEZGTUlOKHMtPnNhbXBsZXMgKyByYWQsIDI1MC4pOworICAgIHNvdmVyICAgID0gcy0+c2FtcGxlcyArIHJhZCAtIHNtYXg7CisgICAgc21heCAgICAtPSBzdW5kZXI7CisgICAgcy0+c21pbiAtPSBzb3ZlcjsKKyAgICBzLT5zZGlmZiA9IHNtYXggLSBzLT5zbWluOworCisgICAgcy0+bGZvLmZyZXEgPSBzLT5sZm9yYXRlOworICAgIHMtPmxmby5wd2lkdGggPSAxLjsKKyAgICBzLT5sZm8uc3JhdGUgPSBpbmxpbmstPnNhbXBsZV9yYXRlOworICAgIHMtPmxmby5hbW91bnQgPSAuNTsKKworICAgIHMtPnNyID0gYXZfY2FsbG9jKGlubGluay0+Y2hhbm5lbHMsIHNpemVvZigqcy0+c3IpKTsKKyAgICBpZiAoIXMtPnNyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl9hZl9hY3J1c2hlcl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2FjcnVzaGVyX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hY3J1c2hlciA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhY3J1c2hlciIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVkdWNlIGF1ZGlvIGJpdCByZXNvbHV0aW9uLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEFDcnVzaGVyQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmYWNydXNoZXJfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfYWZfYWNydXNoZXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfYWZfYWNydXNoZXJfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9hZGVsYXkuYyBiL2xpYmF2ZmlsdGVyL2FmX2FkZWxheS5jCmluZGV4IDA5YmYzYzcuLmQ2ZDgxYmEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2FkZWxheS5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2FkZWxheS5jCkBAIC0xMzgsMTQgKzEzOCwyMCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9kZWxheXM7IGkrKykgewogICAgICAgICBDaGFuRGVsYXkgKmQgPSAmcy0+Y2hhbmRlbGF5W2ldOwogICAgICAgICBmbG9hdCBkZWxheTsKKyAgICAgICAgY2hhciB0eXBlID0gMDsKKyAgICAgICAgaW50IHJldDsKIAogICAgICAgICBpZiAoIShhcmcgPSBhdl9zdHJ0b2socCwgInwiLCAmc2F2ZXB0cikpKQogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgcCA9IE5VTEw7Ci0gICAgICAgIHNzY2FuZihhcmcsICIlZiIsICZkZWxheSk7CiAKLSAgICAgICAgZC0+ZGVsYXkgPSBkZWxheSAqIGlubGluay0+c2FtcGxlX3JhdGUgLyAxMDAwLjA7CisgICAgICAgIHJldCA9IHNzY2FuZihhcmcsICIlZCVjIiwgJmQtPmRlbGF5LCAmdHlwZSk7CisgICAgICAgIGlmIChyZXQgIT0gMiB8fCB0eXBlICE9ICdTJykgeworICAgICAgICAgICAgc3NjYW5mKGFyZywgIiVmIiwgJmRlbGF5KTsKKyAgICAgICAgICAgIGQtPmRlbGF5ID0gZGVsYXkgKiBpbmxpbmstPnNhbXBsZV9yYXRlIC8gMTAwMC4wOworICAgICAgICB9CisKICAgICAgICAgaWYgKGQtPmRlbGF5IDwgMCkgewogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRGVsYXkgbXVzdCBiZSBub24gbmVnYXRpdmUgbnVtYmVyLlxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwpAQCAtMTY1LDExICsxNzEsNiBAQAogICAgICAgICBzLT5tYXhfZGVsYXkgPSBGRk1BWChzLT5tYXhfZGVsYXksIGQtPmRlbGF5KTsKICAgICB9CiAKLSAgICBpZiAoIXMtPm1heF9kZWxheSkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJBdCBsZWFzdCBvbmUgZGVsYXkgPjAgbXVzdCBiZSBzcGVjaWZpZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0KICAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CiAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1U4UCA6IHMtPmRlbGF5X2NoYW5uZWwgPSBkZWxheV9jaGFubmVsX3U4cCA7IGJyZWFrOwogICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOiBzLT5kZWxheV9jaGFubmVsID0gZGVsYXlfY2hhbm5lbF9zMTZwOyBicmVhazsKQEAgLTE5MSw3ICsxOTIsNyBAQAogICAgIGlmIChjdHgtPmlzX2Rpc2FibGVkIHx8ICFzLT5kZWxheXMpCiAgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBmcmFtZSk7CiAKLSAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgIG91dF9mcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIoY3R4LT5vdXRwdXRzWzBdLCBmcmFtZS0+bmJfc2FtcGxlcyk7CiAgICAgaWYgKCFvdXRfZnJhbWUpIHsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfYWVjaG8uYyBiL2xpYmF2ZmlsdGVyL2FmX2FlY2hvLmMKaW5kZXggODIwNDllOS4uYjlhYzE4ZCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYWVjaG8uYworKysgYi9saWJhdmZpbHRlci9hZl9hZWNoby5jCkBAIC03Nyw3ICs3Nyw4IEBACiAgICAgZm9yIChpID0gMDsgaSA8ICpuYl9pdGVtczsgaSsrKSB7CiAgICAgICAgIGNoYXIgKnRzdHIgPSBhdl9zdHJ0b2socCwgInwiLCAmc2F2ZXB0cik7CiAgICAgICAgIHAgPSBOVUxMOwotICAgICAgICBuZXdfbmJfaXRlbXMgKz0gc3NjYW5mKHRzdHIsICIlZiIsICZpdGVtc1tpXSkgPT0gMTsKKyAgICAgICAgaWYgKHRzdHIpCisgICAgICAgICAgICBuZXdfbmJfaXRlbXMgKz0gc3NjYW5mKHRzdHIsICIlZiIsICZpdGVtc1tuZXdfbmJfaXRlbXNdKSA9PSAxOwogICAgIH0KIAogICAgICpuYl9pdGVtcyA9IG5ld19uYl9pdGVtczsKQEAgLTI3OCw3ICsyNzksNyBAQAogICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShmcmFtZSkpIHsKICAgICAgICAgb3V0X2ZyYW1lID0gZnJhbWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0X2ZyYW1lID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgb3V0X2ZyYW1lID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihjdHgtPm91dHB1dHNbMF0sIGZyYW1lLT5uYl9zYW1wbGVzKTsKICAgICAgICAgaWYgKCFvdXRfZnJhbWUpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9hZW1waGFzaXMuYyBiL2xpYmF2ZmlsdGVyL2FmX2FlbXBoYXNpcy5jCmluZGV4IGE1YjhlMzAuLmUxZmE5M2EgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2FlbXBoYXNpcy5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2FlbXBoYXNpcy5jCkBAIC05Niw3ICs5Niw3IEBACiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgewogICAgICAgICBvdXQgPSBpbjsKICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKICAgICAgICAgaWYgKCFvdXQpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9hZmFkZS5jIGIvbGliYXZmaWx0ZXIvYWZfYWZhZGUuYwppbmRleCA5YWNhZGM1Li4yODViNWI2IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9hZmFkZS5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2FmYWRlLmMKQEAgLTIzLDI5ICsyMywzNCBAQAogICogZmFkZSBhdWRpbyBmaWx0ZXIKICAqLwogCisjZGVmaW5lIEZGX0lOVEVSTkFMX0ZJRUxEUyAxCisjaW5jbHVkZSAiZnJhbWVxdWV1ZS5oIgorCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F1ZGlvX2ZpZm8uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAiYXVkaW8uaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZpbHRlcnMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBBdWRpb0ZhZGVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgdHlwZTsKICAgICBpbnQgY3VydmUsIGN1cnZlMjsKLSAgICBpbnQgbmJfc2FtcGxlczsKKyAgICBpbnQ2NF90IG5iX3NhbXBsZXM7CiAgICAgaW50NjRfdCBzdGFydF9zYW1wbGU7CiAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICBpbnQ2NF90IHN0YXJ0X3RpbWU7CiAgICAgaW50IG92ZXJsYXA7CiAgICAgaW50IGNmMF9lb2Y7CisgICAgaW50IHByZXZfc2l6ZTsKICAgICBpbnQgY3Jvc3NmYWRlX2lzX292ZXI7CiAgICAgQVZBdWRpb0ZpZm8gKmZpZm9bMl07CiAgICAgaW50NjRfdCBwdHM7CiAKICAgICB2b2lkICgqZmFkZV9zYW1wbGVzKSh1aW50OF90ICoqZHN0LCB1aW50OF90ICogY29uc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLCBpbnQgZGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnQsIGludCByYW5nZSwgaW50IGN1cnZlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0LCBpbnQ2NF90IHJhbmdlLCBpbnQgY3VydmUpOwogICAgIHZvaWQgKCpjcm9zc2ZhZGVfc2FtcGxlcykodWludDhfdCAqKmRzdCwgdWludDhfdCAqIGNvbnN0ICpjZjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICogY29uc3QgKmNmMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBpbnQgY2hhbm5lbHMsCkBAIC05MCw3ICs5NSw3IEBACiAgICAgcmV0dXJuIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKIH0KIAotc3RhdGljIGRvdWJsZSBmYWRlX2dhaW4oaW50IGN1cnZlLCBpbnQ2NF90IGluZGV4LCBpbnQgcmFuZ2UpCitzdGF0aWMgZG91YmxlIGZhZGVfZ2FpbihpbnQgY3VydmUsIGludDY0X3QgaW5kZXgsIGludDY0X3QgcmFuZ2UpCiB7CiAjZGVmaW5lIENVQkUoYSkgKChhKSooYSkqKGEpKQogICAgIGRvdWJsZSBnYWluOwpAQCAtMTU0LDcgKzE1OSw3IEBACiAjZGVmaW5lIEZBREVfUExBTkFSKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIHZvaWQgZmFkZV9zYW1wbGVzXyMjIG5hbWUgIyNwKHVpbnQ4X3QgKipkc3QsIHVpbnQ4X3QgKiBjb25zdCAqc3JjLCAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLCBpbnQgZGlyLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydCwgaW50IHJhbmdlLCBpbnQgY3VydmUpICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnQsIGludDY0X3QgcmFuZ2UsIGludCBjdXJ2ZSkgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBpbnQgaSwgYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTcyLDcgKzE3Nyw3IEBACiAjZGVmaW5lIEZBREUobmFtZSwgdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIHZvaWQgZmFkZV9zYW1wbGVzXyMjIG5hbWUgKHVpbnQ4X3QgKipkc3QsIHVpbnQ4X3QgKiBjb25zdCAqc3JjLCAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLCBpbnQgZGlyLCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzdGFydCwgaW50IHJhbmdlLCBpbnQgY3VydmUpICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc3RhcnQsIGludDY0X3QgcmFuZ2UsIGludCBjdXJ2ZSkgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgdHlwZSAqZCA9ICh0eXBlICopZHN0WzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGNvbnN0IHR5cGUgKnMgPSAodHlwZSAqKXNyY1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIyOCwxMCArMjMzLDEwIEBACiAgICAgeyAib3V0IiwgICAgICAgICAgImZhZGUtb3V0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IDEgICAgfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LAogICAgIHsgInN0YXJ0X3NhbXBsZSIsICJzZXQgbnVtYmVyIG9mIGZpcnN0IHNhbXBsZSB0byBzdGFydCBmYWRpbmciLCAgT0ZGU0VUKHN0YXJ0X3NhbXBsZSksIEFWX09QVF9UWVBFX0lOVDY0LCAgey5pNjQgPSAwICAgIH0sIDAsIElOVDY0X01BWCwgRkxBR1MgfSwKICAgICB7ICJzcyIsICAgICAgICAgICAic2V0IG51bWJlciBvZiBmaXJzdCBzYW1wbGUgdG8gc3RhcnQgZmFkaW5nIiwgIE9GRlNFVChzdGFydF9zYW1wbGUpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsuaTY0ID0gMCAgICB9LCAwLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCi0gICAgeyAibmJfc2FtcGxlcyIsICAgInNldCBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgZmFkZSBkdXJhdGlvbiIsICAgICBPRkZTRVQobmJfc2FtcGxlcyksICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDQ0MTAwfSwgMSwgSU5UMzJfTUFYLCBGTEFHUyB9LAotICAgIHsgIm5zIiwgICAgICAgICAgICJzZXQgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIGZhZGUgZHVyYXRpb24iLCAgICAgT0ZGU0VUKG5iX3NhbXBsZXMpLCAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSA0NDEwMH0sIDEsIElOVDMyX01BWCwgRkxBR1MgfSwKLSAgICB7ICJzdGFydF90aW1lIiwgICAic2V0IHRpbWUgdG8gc3RhcnQgZmFkaW5nIiwgICAgICAgICAgICAgICAgICAgIE9GRlNFVChzdGFydF90aW1lKSwgICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAwLiB9LCAwLCBJTlQzMl9NQVgsIEZMQUdTIH0sCi0gICAgeyAic3QiLCAgICAgICAgICAgInNldCB0aW1lIHRvIHN0YXJ0IGZhZGluZyIsICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfdGltZSksICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMC4gfSwgMCwgSU5UMzJfTUFYLCBGTEFHUyB9LAorICAgIHsgIm5iX3NhbXBsZXMiLCAgICJzZXQgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIGZhZGUgZHVyYXRpb24iLCAgICAgT0ZGU0VUKG5iX3NhbXBsZXMpLCAgIEFWX09QVF9UWVBFX0lOVDY0LCAgey5pNjQgPSA0NDEwMH0sIDEsIElOVDY0X01BWCwgRkxBR1MgfSwKKyAgICB7ICJucyIsICAgICAgICAgICAic2V0IG51bWJlciBvZiBzYW1wbGVzIGZvciBmYWRlIGR1cmF0aW9uIiwgICAgIE9GRlNFVChuYl9zYW1wbGVzKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsuaTY0ID0gNDQxMDB9LCAxLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyAic3RhcnRfdGltZSIsICAgInNldCB0aW1lIHRvIHN0YXJ0IGZhZGluZyIsICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfdGltZSksICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMC4gfSwgMCwgSU5UNjRfTUFYLCBGTEFHUyB9LAorICAgIHsgInN0IiwgICAgICAgICAgICJzZXQgdGltZSB0byBzdGFydCBmYWRpbmciLCAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0YXJ0X3RpbWUpLCAgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IDAuIH0sIDAsIElOVDY0X01BWCwgRkxBR1MgfSwKICAgICB7ICJkdXJhdGlvbiIsICAgICAic2V0IGZhZGUgZHVyYXRpb24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChkdXJhdGlvbiksICAgICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAwLiB9LCAwLCBJTlQzMl9NQVgsIEZMQUdTIH0sCiAgICAgeyAiZCIsICAgICAgICAgICAgInNldCBmYWRlIGR1cmF0aW9uIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZHVyYXRpb24pLCAgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMC4gfSwgMCwgSU5UMzJfTUFYLCBGTEFHUyB9LAogICAgIHsgImN1cnZlIiwgICAgICAgICJzZXQgZmFkZSBjdXJ2ZSB0eXBlIiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGN1cnZlKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSBUUkkgIH0sIDAsIE5CX0NVUlZFUyAtIDEsIEZMQUdTLCAiY3VydmUiIH0sCkBAIC0yODIsNyArMjg3LDcgQEAKICAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoYnVmKSkgewogICAgICAgICBvdXRfYnVmID0gYnVmOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dF9idWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgbmJfc2FtcGxlcyk7CisgICAgICAgIG91dF9idWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpOwogICAgICAgICBpZiAoIW91dF9idWYpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dF9idWYsIGJ1Zik7CkBAIC0yOTEsNyArMjk2LDcgQEAKICAgICBpZiAoKCFzLT50eXBlICYmIChjdXJfc2FtcGxlICsgbmJfc2FtcGxlcyA8IHMtPnN0YXJ0X3NhbXBsZSkpIHx8CiAgICAgICAgICggcy0+dHlwZSAmJiAocy0+c3RhcnRfc2FtcGxlICsgcy0+bmJfc2FtcGxlcyA8IGN1cl9zYW1wbGUpKSkgewogICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKG91dF9idWYtPmV4dGVuZGVkX2RhdGEsIDAsIG5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKG91dF9idWYpLCBvdXRfYnVmLT5mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9idWYtPmNoYW5uZWxzLCBvdXRfYnVmLT5mb3JtYXQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludDY0X3Qgc3RhcnQ7CiAKQEAgLTMwMSw3ICszMDYsNyBAQAogICAgICAgICAgICAgc3RhcnQgPSBzLT5zdGFydF9zYW1wbGUgKyBzLT5uYl9zYW1wbGVzIC0gY3VyX3NhbXBsZTsKIAogICAgICAgICBzLT5mYWRlX3NhbXBsZXMob3V0X2J1Zi0+ZXh0ZW5kZWRfZGF0YSwgYnVmLT5leHRlbmRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcywgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCBidWYtPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgcy0+dHlwZSA/IC0xIDogMSwgc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzLT5uYl9zYW1wbGVzLCBzLT5jdXJ2ZSk7CiAgICAgfQpAQCAtNDI4LDE1NyArNDMzLDEyNyBAQAogQ1JPU1NGQURFKHMxNiwgaW50MTZfdCkKIENST1NTRkFERShzMzIsIGludDMyX3QpCiAKLXN0YXRpYyBpbnQgYWNyb3NzZmFkZV9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQorc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eCAgPSBpbmxpbmstPmRzdDsKICAgICBBdWRpb0ZhZGVDb250ZXh0ICpzICAgPSBjdHgtPnByaXY7CiAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOwotICAgIEFWRnJhbWUgKm91dCwgKmNmWzJdID0geyBOVUxMIH07Ci0gICAgaW50IHJldCA9IDAsIG5iX3NhbXBsZXM7CisgICAgQVZGcmFtZSAqaW4gPSBOVUxMLCAqb3V0LCAqY2ZbMl0gPSB7IE5VTEwgfTsKKyAgICBpbnQgcmV0ID0gMCwgbmJfc2FtcGxlcywgc3RhdHVzOworICAgIGludDY0X3QgcHRzOwogCiAgICAgaWYgKHMtPmNyb3NzZmFkZV9pc19vdmVyKSB7CisgICAgICAgIHJldCA9IGZmX2lubGlua19jb25zdW1lX2ZyYW1lKGN0eC0+aW5wdXRzWzFdLCAmaW4pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIGlmIChmZl9pbmxpbmtfYWNrbm93bGVkZ2Vfc3RhdHVzKGN0eC0+aW5wdXRzWzFdLCAmc3RhdHVzLCAmcHRzKSkgeworICAgICAgICAgICAgZmZfb3V0bGlua19zZXRfc3RhdHVzKGN0eC0+b3V0cHV0c1swXSwgc3RhdHVzLCBwdHMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZmZfb3V0bGlua19mcmFtZV93YW50ZWQoY3R4LT5vdXRwdXRzWzBdKSAmJiAhaW4pIHsKKyAgICAgICAgICAgICAgICBmZl9pbmxpbmtfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1sxXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgaW4tPnB0cyA9IHMtPnB0czsKICAgICAgICAgcy0+cHRzICs9IGF2X3Jlc2NhbGVfcShpbi0+bmJfc2FtcGxlcywKICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgb3V0bGluay0+c2FtcGxlX3JhdGUgfSwgb3V0bGluay0+dGltZV9iYXNlKTsKICAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBpbik7Ci0gICAgfSBlbHNlIGlmIChpbmxpbmsgPT0gY3R4LT5pbnB1dHNbMF0pIHsKLSAgICAgICAgYXZfYXVkaW9fZmlmb193cml0ZShzLT5maWZvWzBdLCAodm9pZCAqKilpbi0+ZXh0ZW5kZWRfZGF0YSwgaW4tPm5iX3NhbXBsZXMpOworICAgIH0KIAotICAgICAgICBuYl9zYW1wbGVzID0gYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9bMF0pIC0gcy0+bmJfc2FtcGxlczsKKyAgICBpZiAoZmZfZnJhbWVxdWV1ZV9xdWV1ZWRfc2FtcGxlcygmY3R4LT5pbnB1dHNbMF0tPmZpZm8pID4gcy0+bmJfc2FtcGxlcykgeworICAgICAgICBuYl9zYW1wbGVzID0gZmZfZnJhbWVxdWV1ZV9xdWV1ZWRfc2FtcGxlcygmY3R4LT5pbnB1dHNbMF0tPmZpZm8pIC0gcy0+bmJfc2FtcGxlczsKICAgICAgICAgaWYgKG5iX3NhbXBsZXMgPiAwKSB7Ci0gICAgICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpOwotICAgICAgICAgICAgaWYgKCFvdXQpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgcmV0ID0gZmZfaW5saW5rX2NvbnN1bWVfc2FtcGxlcyhjdHgtPmlucHV0c1swXSwgbmJfc2FtcGxlcywgbmJfc2FtcGxlcywgJmluKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF2X2F1ZGlvX2ZpZm9fcmVhZChzLT5maWZvWzBdLCAodm9pZCAqKilvdXQtPmV4dGVuZGVkX2RhdGEsIG5iX3NhbXBsZXMpOwotICAgICAgICAgICAgb3V0LT5wdHMgPSBzLT5wdHM7Ci0gICAgICAgICAgICBzLT5wdHMgKz0gYXZfcmVzY2FsZV9xKG5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSB9LCBvdXRsaW5rLT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvWzFdKSA8IHMtPm5iX3NhbXBsZXMpIHsKLSAgICAgICAgaWYgKCFzLT5vdmVybGFwICYmIGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvWzBdKSA+IDApIHsKLSAgICAgICAgICAgIG5iX3NhbXBsZXMgPSBhdl9hdWRpb19maWZvX3NpemUocy0+Zmlmb1swXSk7Ci0KLSAgICAgICAgICAgIGNmWzBdID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKTsKLSAgICAgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7Ci0gICAgICAgICAgICBpZiAoIW91dCB8fCAhY2ZbMF0pIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZfYXVkaW9fZmlmb19yZWFkKHMtPmZpZm9bMF0sICh2b2lkICoqKWNmWzBdLT5leHRlbmRlZF9kYXRhLCBuYl9zYW1wbGVzKTsKLQotICAgICAgICAgICAgcy0+ZmFkZV9zYW1wbGVzKG91dC0+ZXh0ZW5kZWRfZGF0YSwgY2ZbMF0tPmV4dGVuZGVkX2RhdGEsIG5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+Y2hhbm5lbHMsIC0xLCBuYl9zYW1wbGVzIC0gMSwgbmJfc2FtcGxlcywgcy0+Y3VydmUpOwotICAgICAgICAgICAgb3V0LT5wdHMgPSBzLT5wdHM7Ci0gICAgICAgICAgICBzLT5wdHMgKz0gYXZfcmVzY2FsZV9xKG5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSB9LCBvdXRsaW5rLT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmZpZm9bMV0sICh2b2lkICoqKWluLT5leHRlbmRlZF9kYXRhLCBpbi0+bmJfc2FtcGxlcyk7Ci0gICAgfSBlbHNlIGlmIChhdl9hdWRpb19maWZvX3NpemUocy0+Zmlmb1sxXSkgPj0gcy0+bmJfc2FtcGxlcykgewotICAgICAgICBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmZpZm9bMV0sICh2b2lkICoqKWluLT5leHRlbmRlZF9kYXRhLCBpbi0+bmJfc2FtcGxlcyk7Ci0KKyAgICAgICAgaW4tPnB0cyA9IHMtPnB0czsKKyAgICAgICAgcy0+cHRzICs9IGF2X3Jlc2NhbGVfcShpbi0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgb3V0bGluay0+c2FtcGxlX3JhdGUgfSwgb3V0bGluay0+dGltZV9iYXNlKTsKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBpbik7CisgICAgfSBlbHNlIGlmIChmZl9mcmFtZXF1ZXVlX3F1ZXVlZF9zYW1wbGVzKCZjdHgtPmlucHV0c1sxXS0+ZmlmbykgPj0gcy0+bmJfc2FtcGxlcykgewogICAgICAgICBpZiAocy0+b3ZlcmxhcCkgewotICAgICAgICAgICAgY2ZbMF0gPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIHMtPm5iX3NhbXBsZXMpOwotICAgICAgICAgICAgY2ZbMV0gPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIHMtPm5iX3NhbXBsZXMpOwogICAgICAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBzLT5uYl9zYW1wbGVzKTsKLSAgICAgICAgICAgIGlmICghb3V0IHx8ICFjZlswXSB8fCAhY2ZbMV0pIHsKKyAgICAgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIHJldCA9IGZmX2lubGlua19jb25zdW1lX3NhbXBsZXMoY3R4LT5pbnB1dHNbMF0sIHMtPm5iX3NhbXBsZXMsIHMtPm5iX3NhbXBsZXMsICZjZlswXSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhdl9hdWRpb19maWZvX3JlYWQocy0+Zmlmb1swXSwgKHZvaWQgKiopY2ZbMF0tPmV4dGVuZGVkX2RhdGEsIHMtPm5iX3NhbXBsZXMpOwotICAgICAgICAgICAgYXZfYXVkaW9fZmlmb19yZWFkKHMtPmZpZm9bMV0sICh2b2lkICoqKWNmWzFdLT5leHRlbmRlZF9kYXRhLCBzLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIHJldCA9IGZmX2lubGlua19jb25zdW1lX3NhbXBsZXMoY3R4LT5pbnB1dHNbMV0sIHMtPm5iX3NhbXBsZXMsIHMtPm5iX3NhbXBsZXMsICZjZlsxXSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcy0+Y3Jvc3NmYWRlX3NhbXBsZXMob3V0LT5leHRlbmRlZF9kYXRhLCBjZlswXS0+ZXh0ZW5kZWRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmWzFdLT5leHRlbmRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bmJfc2FtcGxlcywgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm5iX3NhbXBsZXMsIG91dC0+Y2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jdXJ2ZSwgcy0+Y3VydmUyKTsKICAgICAgICAgICAgIG91dC0+cHRzID0gcy0+cHRzOwogICAgICAgICAgICAgcy0+cHRzICs9IGF2X3Jlc2NhbGVfcShzLT5uYl9zYW1wbGVzLAogICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgb3V0bGluay0+c2FtcGxlX3JhdGUgfSwgb3V0bGluay0+dGltZV9iYXNlKTsKLSAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgcy0+Y3Jvc3NmYWRlX2lzX292ZXIgPSAxOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmY2ZbMF0pOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmY2ZbMV0pOworICAgICAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBzLT5uYl9zYW1wbGVzKTsKLSAgICAgICAgICAgIGNmWzFdID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBzLT5uYl9zYW1wbGVzKTsKLSAgICAgICAgICAgIGlmICghb3V0IHx8ICFjZlsxXSkgewotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgIHJldCA9IGZmX2lubGlua19jb25zdW1lX3NhbXBsZXMoY3R4LT5pbnB1dHNbMF0sIHMtPm5iX3NhbXBsZXMsIHMtPm5iX3NhbXBsZXMsICZjZlswXSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF2X2F1ZGlvX2ZpZm9fcmVhZChzLT5maWZvWzFdLCAodm9pZCAqKiljZlsxXS0+ZXh0ZW5kZWRfZGF0YSwgcy0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICBzLT5mYWRlX3NhbXBsZXMob3V0LT5leHRlbmRlZF9kYXRhLCBjZlswXS0+ZXh0ZW5kZWRfZGF0YSwgcy0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT5jaGFubmVscywgLTEsIHMtPm5iX3NhbXBsZXMgLSAxLCBzLT5uYl9zYW1wbGVzLCBzLT5jdXJ2ZSk7CisgICAgICAgICAgICBvdXQtPnB0cyA9IHMtPnB0czsKKyAgICAgICAgICAgIHMtPnB0cyArPSBhdl9yZXNjYWxlX3Eocy0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIG91dGxpbmstPnNhbXBsZV9yYXRlIH0sIG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZjZlswXSk7CisgICAgICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgcy0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgICAgICByZXQgPSBmZl9pbmxpbmtfY29uc3VtZV9zYW1wbGVzKGN0eC0+aW5wdXRzWzFdLCBzLT5uYl9zYW1wbGVzLCBzLT5uYl9zYW1wbGVzLCAmY2ZbMV0pOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHMtPmZhZGVfc2FtcGxlcyhvdXQtPmV4dGVuZGVkX2RhdGEsIGNmWzFdLT5leHRlbmRlZF9kYXRhLCBzLT5uYl9zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPmNoYW5uZWxzLCAxLCAwLCBzLT5uYl9zYW1wbGVzLCBzLT5jdXJ2ZTIpOwogICAgICAgICAgICAgb3V0LT5wdHMgPSBzLT5wdHM7CiAgICAgICAgICAgICBzLT5wdHMgKz0gYXZfcmVzY2FsZV9xKHMtPm5iX3NhbXBsZXMsCiAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSB9LCBvdXRsaW5rLT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBzLT5jcm9zc2ZhZGVfaXNfb3ZlciA9IDE7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZjZlsxXSk7CisgICAgICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CiAgICAgICAgIH0KLQotICAgICAgICBuYl9zYW1wbGVzID0gYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9bMV0pOwotICAgICAgICBpZiAobmJfc2FtcGxlcyA+IDApIHsKLSAgICAgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7Ci0gICAgICAgICAgICBpZiAoIW91dCkgewotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF2X2F1ZGlvX2ZpZm9fcmVhZChzLT5maWZvWzFdLCAodm9pZCAqKilvdXQtPmV4dGVuZGVkX2RhdGEsIG5iX3NhbXBsZXMpOwotICAgICAgICAgICAgb3V0LT5wdHMgPSBzLT5wdHM7Ci0gICAgICAgICAgICBzLT5wdHMgKz0gYXZfcmVzY2FsZV9xKG5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSB9LCBvdXRsaW5rLT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcy0+Y3Jvc3NmYWRlX2lzX292ZXIgPSAxOwotICAgIH0KLQotZmFpbDoKLSAgICBhdl9mcmFtZV9mcmVlKCZpbik7Ci0gICAgYXZfZnJhbWVfZnJlZSgmY2ZbMF0pOwotICAgIGF2X2ZyYW1lX2ZyZWUoJmNmWzFdKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGFjcm9zc2ZhZGVfcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCi17Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7Ci0gICAgQXVkaW9GYWRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIGlmICghcy0+Y2YwX2VvZikgewotICAgICAgICBBVkZpbHRlckxpbmsgKmNmMCA9IGN0eC0+aW5wdXRzWzBdOwotICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGNmMCk7Ci0gICAgICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICB9IGVsc2UgaWYgKGZmX291dGxpbmtfZnJhbWVfd2FudGVkKGN0eC0+b3V0cHV0c1swXSkpIHsKKyAgICAgICAgaWYgKCFzLT5jZjBfZW9mICYmIGN0eC0+aW5wdXRzWzBdLT5zdGF0dXNfaW4pIHsKICAgICAgICAgICAgIHMtPmNmMF9lb2YgPSAxOwotICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFWRmlsdGVyTGluayAqY2YxID0gY3R4LT5pbnB1dHNbMV07Ci0gICAgICAgIGludCBuYl9zYW1wbGVzID0gYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9bMV0pOwotCi0gICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY2YxKTsKLSAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBuYl9zYW1wbGVzID4gMCkgewotICAgICAgICAgICAgQVZGcmFtZSAqb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKTsKLSAgICAgICAgICAgIGlmICghb3V0KQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgICAgIGF2X2F1ZGlvX2ZpZm9fcmVhZChzLT5maWZvWzFdLCAodm9pZCAqKilvdXQtPmV4dGVuZGVkX2RhdGEsIG5iX3NhbXBsZXMpOwotICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgICAgIGlmIChjdHgtPmlucHV0c1sxXS0+c3RhdHVzX2luKSB7CisgICAgICAgICAgICBmZl9vdXRsaW5rX3NldF9zdGF0dXMoY3R4LT5vdXRwdXRzWzBdLCBBVkVSUk9SX0VPRiwgQVZfTk9QVFNfVkFMVUUpOworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFzLT5jZjBfZW9mKQorICAgICAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmZl9pbmxpbmtfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1sxXSk7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KIAogICAgIHJldHVybiByZXQ7CkBAIC02MTUsMzIgKzU5MCwxNyBAQAogCiAgICAgY29uZmlnX291dHB1dChvdXRsaW5rKTsKIAotICAgIHMtPmZpZm9bMF0gPSBhdl9hdWRpb19maWZvX2FsbG9jKG91dGxpbmstPmZvcm1hdCwgb3V0bGluay0+Y2hhbm5lbHMsIHMtPm5iX3NhbXBsZXMpOwotICAgIHMtPmZpZm9bMV0gPSBhdl9hdWRpb19maWZvX2FsbG9jKG91dGxpbmstPmZvcm1hdCwgb3V0bGluay0+Y2hhbm5lbHMsIHMtPm5iX3NhbXBsZXMpOwotICAgIGlmICghcy0+Zmlmb1swXSB8fCAhcy0+Zmlmb1sxXSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKLXsKLSAgICBBdWRpb0ZhZGVDb250ZXh0ICpzID0gY3R4LT5wcml2OwotCi0gICAgYXZfYXVkaW9fZmlmb19mcmVlKHMtPmZpZm9bMF0pOwotICAgIGF2X2F1ZGlvX2ZpZm9fZnJlZShzLT5maWZvWzFdKTsKLX0KLQogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2Fjcm9zc2ZhZGVfaW5wdXRzW10gPSB7CiAgICAgewogICAgICAgICAubmFtZSAgICAgICAgID0gImNyb3NzZmFkZTAiLAogICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAotICAgICAgICAuZmlsdGVyX2ZyYW1lID0gYWNyb3NzZmFkZV9maWx0ZXJfZnJhbWUsCiAgICAgfSwKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAiY3Jvc3NmYWRlMSIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBhY3Jvc3NmYWRlX2ZpbHRlcl9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtNjQ5LDcgKzYwOSw2IEBACiAgICAgewogICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKICAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCi0gICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gYWNyb3NzZmFkZV9yZXF1ZXN0X2ZyYW1lLAogICAgICAgICAuY29uZmlnX3Byb3BzICA9IGFjcm9zc2ZhZGVfY29uZmlnX291dHB1dCwKICAgICB9LAogICAgIHsgTlVMTCB9CkBAIC02NjAsNyArNjE5LDcgQEAKICAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDcm9zcyBmYWRlIHR3byBpbnB1dCBhdWRpbyBzdHJlYW1zLiIpLAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKICAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihBdWRpb0ZhZGVDb250ZXh0KSwKLSAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAogICAgIC5wcml2X2NsYXNzICAgID0gJmFjcm9zc2ZhZGVfY2xhc3MsCiAgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl9hZl9hY3Jvc3NmYWRlX2lucHV0cywKICAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX2FmX2Fjcm9zc2ZhZGVfb3V0cHV0cywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FmZnRmaWx0LmMgYi9saWJhdmZpbHRlci9hZl9hZmZ0ZmlsdC5jCmluZGV4IDhlNDFmNTIuLjdmMjhlMWYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2FmZnRmaWx0LmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYWZmdGZpbHQuYwpAQCAtNjAsNyArNjAsNyBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFmZnRmaWx0X29wdGlvbnNbXSA9IHsKICAgICB7ICJyZWFsIiwgInNldCBjaGFubmVscyByZWFsIGV4cHJlc3Npb25zIiwgICAgICAgT0ZGU0VUKHJlYWxfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIxIiB9LCAwLCAwLCBBIH0sCiAgICAgeyAiaW1hZyIsICAic2V0IGNoYW5uZWxzIGltYWdpbmFyeSBleHByZXNzaW9ucyIsIE9GRlNFVChpbWdfc3RyKSwgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMIH0sIDAsIDAsIEEgfSwKLSAgICB7ICJ3aW5fc2l6ZSIsICJzZXQgd2luZG93IHNpemUiLCBPRkZTRVQoZmZ0X2JpdHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEyfSwgNCwgMTYsIEEsICJmZnQiIH0sCisgICAgeyAid2luX3NpemUiLCAic2V0IHdpbmRvdyBzaXplIiwgT0ZGU0VUKGZmdF9iaXRzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMn0sIDQsIDE3LCBBLCAiZmZ0IiB9LAogICAgICAgICB7ICJ3MTYiLCAgICAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9NH0sICAwLCAwLCBBLCAiZmZ0IiB9LAogICAgICAgICB7ICJ3MzIiLCAgICAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9NX0sICAwLCAwLCBBLCAiZmZ0IiB9LAogICAgICAgICB7ICJ3NjQiLCAgICAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Nn0sICAwLCAwLCBBLCAiZmZ0IiB9LApAQCAtNzQsNiArNzQsNyBAQAogICAgICAgICB7ICJ3MTYzODQiLCAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTR9LCAwLCAwLCBBLCAiZmZ0IiB9LAogICAgICAgICB7ICJ3MzI3NjgiLCAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTV9LCAwLCAwLCBBLCAiZmZ0IiB9LAogICAgICAgICB7ICJ3NjU1MzYiLCAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTZ9LCAwLCAwLCBBLCAiZmZ0IiB9LAorICAgICAgICB7ICJ3MTMxMDcyIiwwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTd9LCAwLCAwLCBBLCAiZmZ0IiB9LAogICAgIHsgIndpbl9mdW5jIiwgInNldCB3aW5kb3cgZnVuY3Rpb24iLCBPRkZTRVQod2luX2Z1bmMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gV0ZVTkNfSEFOTklOR30sIDAsIE5CX1dGVU5DLTEsIEEsICJ3aW5fZnVuYyIgfSwKICAgICAgICAgeyAicmVjdCIsICAgICAiUmVjdGFuZ3VsYXIiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19SRUNUfSwgICAgIDAsIDAsIEEsICJ3aW5fZnVuYyIgfSwKICAgICAgICAgeyAiYmFydGxldHQiLCAiQmFydGxldHQiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19CQVJUTEVUVH0sIDAsIDAsIEEsICJ3aW5fZnVuYyIgfSwKQEAgLTE2NSw3ICsxNjYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPndpbmRvd19mdW5jX2x1dCkpOwogICAgIGlmICghcy0+d2luZG93X2Z1bmNfbHV0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIGZmX2dlbmVyYXRlX3dpbmRvd19mdW5jKHMtPndpbmRvd19mdW5jX2x1dCwgcy0+d2luZG93X3NpemUsIHMtPndpbl9mdW5jLCAmb3ZlcmxhcCk7CisgICAgZ2VuZXJhdGVfd2luZG93X2Z1bmMocy0+d2luZG93X2Z1bmNfbHV0LCBzLT53aW5kb3dfc2l6ZSwgcy0+d2luX2Z1bmMsICZvdmVybGFwKTsKICAgICBpZiAocy0+b3ZlcmxhcCA9PSAxKQogICAgICAgICBzLT5vdmVybGFwID0gb3ZlcmxhcDsKIApAQCAtMTk2LDggKzE5NywxMCBAQAogICAgIGludCBjaCwgbiwgcmV0LCBpLCBqLCBrOwogICAgIGludCBzdGFydCA9IHMtPnN0YXJ0LCBlbmQgPSBzLT5lbmQ7CiAKLSAgICBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmZpZm8sICh2b2lkICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgcmV0ID0gYXZfYXVkaW9fZmlmb193cml0ZShzLT5maWZvLCAodm9pZCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgZnJhbWUtPm5iX3NhbXBsZXMpOwogICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIHdoaWxlIChhdl9hdWRpb19maWZvX3NpemUocy0+ZmlmbykgPj0gd2luZG93X3NpemUpIHsKICAgICAgICAgaWYgKCFpbikgewpAQCAtMzE1LDcgKzMxOCw3IEBACiAgICAgfQogCiAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiAwOwogfQogCiBzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCkBAIC0zNzAsNiArMzczLDkgQEAKICAgICBhdl9mcmVlcCgmcy0+cmVhbCk7CiAgICAgYXZfZnJlZXAoJnMtPmltYWcpOwogICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmJ1ZmZlcik7CisgICAgYXZfZnJlZXAoJnMtPndpbmRvd19mdW5jX2x1dCk7CisKKyAgICBhdl9hdWRpb19maWZvX2ZyZWUocy0+Zmlmbyk7CiB9CiAKIHN0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FmaXIuYyBiL2xpYmF2ZmlsdGVyL2FmX2FmaXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njg3MjQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvYWZfYWZpci5jCkBAIC0wLDAgKzEsNTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBbiBhcmJpdHJhcnkgYXVkaW8gRklSIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXVkaW9fZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZmZnQuaCIKKworI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhZl9hZmlyLmgiCisKK3N0YXRpYyB2b2lkIGZjbXVsX2FkZF9jKGZsb2F0ICpzdW0sIGNvbnN0IGZsb2F0ICp0LCBjb25zdCBmbG9hdCAqYywgcHRyZGlmZl90IGxlbikKK3sKKyAgICBpbnQgbjsKKworICAgIGZvciAobiA9IDA7IG4gPCBsZW47IG4rKykgeworICAgICAgICBjb25zdCBmbG9hdCBjcmUgPSBjWzIgKiBuICAgIF07CisgICAgICAgIGNvbnN0IGZsb2F0IGNpbSA9IGNbMiAqIG4gKyAxXTsKKyAgICAgICAgY29uc3QgZmxvYXQgdHJlID0gdFsyICogbiAgICBdOworICAgICAgICBjb25zdCBmbG9hdCB0aW0gPSB0WzIgKiBuICsgMV07CisKKyAgICAgICAgc3VtWzIgKiBuICAgIF0gKz0gdHJlICogY3JlIC0gdGltICogY2ltOworICAgICAgICBzdW1bMiAqIG4gKyAxXSArPSB0cmUgKiBjaW0gKyB0aW0gKiBjcmU7CisgICAgfQorCisgICAgc3VtWzIgKiBuXSArPSB0WzIgKiBuXSAqIGNbMiAqIG5dOworfQorCitzdGF0aWMgaW50IGZpcl9jaGFubmVsKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBjaCwgaW50IG5iX2pvYnMpCit7CisgICAgQXVkaW9GSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGZsb2F0ICpzcmMgPSAoY29uc3QgZmxvYXQgKilzLT5pblswXS0+ZXh0ZW5kZWRfZGF0YVtjaF07CisgICAgaW50IGluZGV4MSA9IChzLT5pbmRleCArIDEpICUgMzsKKyAgICBpbnQgaW5kZXgyID0gKHMtPmluZGV4ICsgMikgJSAzOworICAgIGZsb2F0ICpzdW0gPSBzLT5zdW1bY2hdOworICAgIEFWRnJhbWUgKm91dCA9IGFyZzsKKyAgICBmbG9hdCAqYmxvY2s7CisgICAgZmxvYXQgKmRzdDsKKyAgICBpbnQgbiwgaSwgajsKKworICAgIG1lbXNldChzdW0sIDAsIHNpemVvZigqc3VtKSAqIHMtPmZmdF9sZW5ndGgpOworICAgIGJsb2NrID0gcy0+YmxvY2tbY2hdICsgcy0+cGFydF9pbmRleCAqIHMtPmJsb2NrX3NpemU7CisgICAgbWVtc2V0KGJsb2NrLCAwLCBzaXplb2YoKmJsb2NrKSAqIHMtPmZmdF9sZW5ndGgpOworCisgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKGJsb2NrICsgcy0+cGFydF9zaXplLCBzcmMsIHMtPmRyeV9nYWluLCBGRkFMSUdOKHMtPm5iX3NhbXBsZXMsIDQpKTsKKyAgICBlbW1zX2MoKTsKKworICAgIGF2X3JkZnRfY2FsYyhzLT5yZGZ0W2NoXSwgYmxvY2spOworICAgIGJsb2NrWzIgKiBzLT5wYXJ0X3NpemVdID0gYmxvY2tbMV07CisgICAgYmxvY2tbMV0gPSAwOworCisgICAgaiA9IHMtPnBhcnRfaW5kZXg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGFydGl0aW9uczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBjb2Zmc2V0ID0gaSAqIHMtPmNvZWZmX3NpemU7CisgICAgICAgIGNvbnN0IEZGVENvbXBsZXggKmNvZWZmID0gcy0+Y29lZmZbY2ggKiAhcy0+b25lMm1hbnldICsgY29mZnNldDsKKworICAgICAgICBibG9jayA9IHMtPmJsb2NrW2NoXSArIGogKiBzLT5ibG9ja19zaXplOworICAgICAgICBzLT5mY211bF9hZGQoc3VtLCBibG9jaywgKGNvbnN0IGZsb2F0ICopY29lZmYsIHMtPnBhcnRfc2l6ZSk7CisKKyAgICAgICAgaWYgKGogPT0gMCkKKyAgICAgICAgICAgIGogPSBzLT5uYl9wYXJ0aXRpb25zOworICAgICAgICBqLS07CisgICAgfQorCisgICAgc3VtWzFdID0gc3VtWzIgKiBzLT5wYXJ0X3NpemVdOworICAgIGF2X3JkZnRfY2FsYyhzLT5pcmRmdFtjaF0sIHN1bSk7CisKKyAgICBkc3QgPSAoZmxvYXQgKilzLT5idWZmZXItPmV4dGVuZGVkX2RhdGFbY2hdICsgaW5kZXgxICogcy0+cGFydF9zaXplOworICAgIGZvciAobiA9IDA7IG4gPCBzLT5wYXJ0X3NpemU7IG4rKykgeworICAgICAgICBkc3Rbbl0gKz0gc3VtW25dOworICAgIH0KKworICAgIGRzdCA9IChmbG9hdCAqKXMtPmJ1ZmZlci0+ZXh0ZW5kZWRfZGF0YVtjaF0gKyBpbmRleDIgKiBzLT5wYXJ0X3NpemU7CisKKyAgICBtZW1jcHkoZHN0LCBzdW0gKyBzLT5wYXJ0X3NpemUsIHMtPnBhcnRfc2l6ZSAqIHNpemVvZigqZHN0KSk7CisKKyAgICBkc3QgPSAoZmxvYXQgKilzLT5idWZmZXItPmV4dGVuZGVkX2RhdGFbY2hdICsgcy0+aW5kZXggKiBzLT5wYXJ0X3NpemU7CisKKyAgICBpZiAob3V0KSB7CisgICAgICAgIGZsb2F0ICpwdHIgPSAoZmxvYXQgKilvdXQtPmV4dGVuZGVkX2RhdGFbY2hdOworICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF9zY2FsYXIocHRyLCBkc3QsIHMtPndldF9nYWluLCBGRkFMSUdOKG91dC0+bmJfc2FtcGxlcywgNCkpOworICAgICAgICBlbW1zX2MoKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaXJfZnJhbWUoQXVkaW9GSVJDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGcmFtZSAqb3V0ID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgcy0+bmJfc2FtcGxlcyA9IEZGTUlOKHMtPnBhcnRfc2l6ZSwgYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9bMF0pKTsKKworICAgIGlmICghcy0+d2FudF9za2lwKSB7CisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgcy0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzLT5pblswXSA9IGZmX2dldF9hdWRpb19idWZmZXIoY3R4LT5pbnB1dHNbMF0sIHMtPm5iX3NhbXBsZXMpOworICAgIGlmICghcy0+aW5bMF0pIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBhdl9hdWRpb19maWZvX3BlZWsocy0+Zmlmb1swXSwgKHZvaWQgKiopcy0+aW5bMF0tPmV4dGVuZGVkX2RhdGEsIHMtPm5iX3NhbXBsZXMpOworCisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpcl9jaGFubmVsLCBvdXQsIE5VTEwsIG91dGxpbmstPmNoYW5uZWxzKTsKKworICAgIHMtPnBhcnRfaW5kZXggPSAocy0+cGFydF9pbmRleCArIDEpICUgcy0+bmJfcGFydGl0aW9uczsKKworICAgIGF2X2F1ZGlvX2ZpZm9fZHJhaW4ocy0+Zmlmb1swXSwgcy0+bmJfc2FtcGxlcyk7CisKKyAgICBpZiAoIXMtPndhbnRfc2tpcCkgeworICAgICAgICBvdXQtPnB0cyA9IHMtPnB0czsKKyAgICAgICAgaWYgKHMtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHMtPnB0cyArPSBhdl9yZXNjYWxlX3Eob3V0LT5uYl9zYW1wbGVzLCAoQVZSYXRpb25hbCl7MSwgb3V0bGluay0+c2FtcGxlX3JhdGV9LCBvdXRsaW5rLT50aW1lX2Jhc2UpOworICAgIH0KKworICAgIHMtPmluZGV4Kys7CisgICAgaWYgKHMtPmluZGV4ID09IDMpCisgICAgICAgIHMtPmluZGV4ID0gMDsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmluWzBdKTsKKworICAgIGlmIChzLT53YW50X3NraXAgPT0gMSkgeworICAgICAgICBzLT53YW50X3NraXAgPSAwOworICAgICAgICByZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29udmVydF9jb2VmZnMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXVkaW9GSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpLCBjaCwgbiwgTjsKKworICAgIHMtPm5iX3RhcHMgPSBhdl9hdWRpb19maWZvX3NpemUocy0+Zmlmb1sxXSk7CisgICAgaWYgKHMtPm5iX3RhcHMgPD0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGZvciAobiA9IDQ7ICgxIDw8IG4pIDwgcy0+bmJfdGFwczsgbisrKTsKKyAgICBOID0gRkZNSU4obiwgMTYpOworICAgIHMtPmlyX2xlbmd0aCA9IDEgPDwgbjsKKyAgICBzLT5mZnRfbGVuZ3RoID0gKDEgPDwgKE4gKyAxKSkgKyAxOworICAgIHMtPnBhcnRfc2l6ZSA9IDEgPDwgKE4gLSAxKTsKKyAgICBzLT5ibG9ja19zaXplID0gRkZBTElHTihzLT5mZnRfbGVuZ3RoLCAzMik7CisgICAgcy0+Y29lZmZfc2l6ZSA9IEZGQUxJR04ocy0+cGFydF9zaXplICsgMSwgMzIpOworICAgIHMtPm5iX3BhcnRpdGlvbnMgPSAocy0+bmJfdGFwcyArIHMtPnBhcnRfc2l6ZSAtIDEpIC8gcy0+cGFydF9zaXplOworICAgIHMtPm5iX2NvZWZmcyA9IHMtPmlyX2xlbmd0aCArIHMtPm5iX3BhcnRpdGlvbnM7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjdHgtPmlucHV0c1swXS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgcy0+c3VtW2NoXSA9IGF2X2NhbGxvYyhzLT5mZnRfbGVuZ3RoLCBzaXplb2YoKipzLT5zdW0pKTsKKyAgICAgICAgaWYgKCFzLT5zdW1bY2hdKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjdHgtPmlucHV0c1sxXS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgcy0+Y29lZmZbY2hdID0gYXZfY2FsbG9jKHMtPm5iX3BhcnRpdGlvbnMgKiBzLT5jb2VmZl9zaXplLCBzaXplb2YoKipzLT5jb2VmZikpOworICAgICAgICBpZiAoIXMtPmNvZWZmW2NoXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZm9yIChjaCA9IDA7IGNoIDwgY3R4LT5pbnB1dHNbMF0tPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIHMtPmJsb2NrW2NoXSA9IGF2X2NhbGxvYyhzLT5uYl9wYXJ0aXRpb25zICogcy0+YmxvY2tfc2l6ZSwgc2l6ZW9mKCoqcy0+YmxvY2spKTsKKyAgICAgICAgaWYgKCFzLT5ibG9ja1tjaF0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGN0eC0+aW5wdXRzWzBdLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBzLT5yZGZ0W2NoXSAgPSBhdl9yZGZ0X2luaXQoTiwgREZUX1IyQyk7CisgICAgICAgIHMtPmlyZGZ0W2NoXSA9IGF2X3JkZnRfaW5pdChOLCBJREZUX0MyUik7CisgICAgICAgIGlmICghcy0+cmRmdFtjaF0gfHwgIXMtPmlyZGZ0W2NoXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcy0+aW5bMV0gPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGN0eC0+aW5wdXRzWzFdLCBzLT5uYl90YXBzKTsKKyAgICBpZiAoIXMtPmluWzFdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+YnVmZmVyID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihjdHgtPmlucHV0c1swXSwgcy0+cGFydF9zaXplICogMyk7CisgICAgaWYgKCFzLT5idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9hdWRpb19maWZvX3JlYWQocy0+Zmlmb1sxXSwgKHZvaWQgKiopcy0+aW5bMV0tPmV4dGVuZGVkX2RhdGEsIHMtPm5iX3RhcHMpOworCisgICAgaWYgKHMtPmFnYWluKSB7CisgICAgICAgIGZsb2F0IHBvd2VyID0gMDsKKworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjdHgtPmlucHV0c1sxXS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZsb2F0ICp0aW1lID0gKGZsb2F0ICopcy0+aW5bMV0tPmV4dGVuZGVkX2RhdGFbIXMtPm9uZTJtYW55ICogY2hdOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfdGFwczsgaSsrKQorICAgICAgICAgICAgICAgIHBvd2VyICs9IEZGQUJTKHRpbWVbaV0pOworICAgICAgICB9CisKKyAgICAgICAgcy0+Z2FpbiA9IHNxcnRmKDEuZiAvIChjdHgtPmlucHV0c1sxXS0+Y2hhbm5lbHMgKiBwb3dlcikpIC8gKHNxcnRmKGN0eC0+aW5wdXRzWzFdLT5jaGFubmVscykpOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjdHgtPmlucHV0c1sxXS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZsb2F0ICp0aW1lID0gKGZsb2F0ICopcy0+aW5bMV0tPmV4dGVuZGVkX2RhdGFbIXMtPm9uZTJtYW55ICogY2hdOworCisgICAgICAgICAgICBzLT5mZHNwLT52ZWN0b3JfZm11bF9zY2FsYXIodGltZSwgdGltZSwgcy0+Z2FpbiwgRkZBTElHTihzLT5uYl90YXBzLCA0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjdHgtPmlucHV0c1sxXS0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZmxvYXQgKnRpbWUgPSAoZmxvYXQgKilzLT5pblsxXS0+ZXh0ZW5kZWRfZGF0YVshcy0+b25lMm1hbnkgKiBjaF07CisgICAgICAgIGZsb2F0ICpibG9jayA9IHMtPmJsb2NrW2NoXTsKKyAgICAgICAgRkZUQ29tcGxleCAqY29lZmYgPSBzLT5jb2VmZltjaF07CisKKyAgICAgICAgZm9yIChpID0gRkZNQVgoMSwgcy0+bGVuZ3RoICogcy0+bmJfdGFwcyk7IGkgPCBzLT5uYl90YXBzOyBpKyspCisgICAgICAgICAgICB0aW1lW2ldID0gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGFydGl0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBzY2FsZSA9IDEuZiAvIHMtPnBhcnRfc2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IGludCB0b2Zmc2V0ID0gaSAqIHMtPnBhcnRfc2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IGludCBjb2Zmc2V0ID0gaSAqIHMtPmNvZWZmX3NpemU7CisgICAgICAgICAgICBjb25zdCBpbnQgYm9mZnNldCA9IHMtPnBhcnRfc2l6ZTsKKyAgICAgICAgICAgIGNvbnN0IGludCByZW1haW5pbmcgPSBzLT5uYl90YXBzIC0gKGkgKiBzLT5wYXJ0X3NpemUpOworICAgICAgICAgICAgY29uc3QgaW50IHNpemUgPSByZW1haW5pbmcgPj0gcy0+cGFydF9zaXplID8gcy0+cGFydF9zaXplIDogcmVtYWluaW5nOworCisgICAgICAgICAgICBtZW1zZXQoYmxvY2ssIDAsIHNpemVvZigqYmxvY2spICogcy0+ZmZ0X2xlbmd0aCk7CisgICAgICAgICAgICBtZW1jcHkoYmxvY2sgKyBib2Zmc2V0LCB0aW1lICsgdG9mZnNldCwgc2l6ZSAqIHNpemVvZigqYmxvY2spKTsKKworICAgICAgICAgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnRbMF0sIGJsb2NrKTsKKworICAgICAgICAgICAgY29lZmZbY29mZnNldF0ucmUgPSBibG9ja1swXSAqIHNjYWxlOworICAgICAgICAgICAgY29lZmZbY29mZnNldF0uaW0gPSAwOworICAgICAgICAgICAgZm9yIChuID0gMTsgbiA8IHMtPnBhcnRfc2l6ZTsgbisrKSB7CisgICAgICAgICAgICAgICAgY29lZmZbY29mZnNldCArIG5dLnJlID0gYmxvY2tbMiAqIG5dICogc2NhbGU7CisgICAgICAgICAgICAgICAgY29lZmZbY29mZnNldCArIG5dLmltID0gYmxvY2tbMiAqIG4gKyAxXSAqIHNjYWxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29lZmZbY29mZnNldCArIHMtPnBhcnRfc2l6ZV0ucmUgPSBibG9ja1sxXSAqIHNjYWxlOworICAgICAgICAgICAgY29lZmZbY29mZnNldCArIHMtPnBhcnRfc2l6ZV0uaW0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+aW5bMV0pOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIm5iX3RhcHM6ICVkXG4iLCBzLT5uYl90YXBzKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJuYl9wYXJ0aXRpb25zOiAlZFxuIiwgcy0+bmJfcGFydGl0aW9ucyk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAicGFydGl0aW9uIHNpemU6ICVkXG4iLCBzLT5wYXJ0X3NpemUpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgImlyX2xlbmd0aDogJWRcbiIsIHMtPmlyX2xlbmd0aCk7CisKKyAgICBzLT5oYXZlX2NvZWZmcyA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX2lyKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5kc3Q7CisgICAgQXVkaW9GSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBuYl90YXBzLCBtYXhfbmJfdGFwcywgcmV0OworCisgICAgcmV0ID0gYXZfYXVkaW9fZmlmb193cml0ZShzLT5maWZvWzFdLCAodm9pZCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG5iX3RhcHMgPSBhdl9hdWRpb19maWZvX3NpemUocy0+Zmlmb1sxXSk7CisgICAgbWF4X25iX3RhcHMgPSBNQVhfSVJfRFVSQVRJT04gKiBjdHgtPm91dHB1dHNbMF0tPnNhbXBsZV9yYXRlOworICAgIGlmIChuYl90YXBzID4gbWF4X25iX3RhcHMpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIGJpZyBudW1iZXIgb2YgY29lZmZpY2llbnRzOiAlZCA+ICVkLlxuIiwgbmJfdGFwcywgbWF4X25iX3RhcHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OworICAgIEF1ZGlvRklSQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGF2X2F1ZGlvX2ZpZm9fd3JpdGUocy0+Zmlmb1swXSwgKHZvaWQgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgaWYgKHJldCA+IDAgJiYgcy0+cHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBzLT5wdHMgPSBmcmFtZS0+cHRzOworCisgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIXMtPmhhdmVfY29lZmZzICYmIHMtPmVvZl9jb2VmZnMpIHsKKyAgICAgICAgcmV0ID0gY29udmVydF9jb2VmZnMoY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChzLT5oYXZlX2NvZWZmcykgeworICAgICAgICB3aGlsZSAoYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9bMF0pID49IHMtPnBhcnRfc2l6ZSkgeworICAgICAgICAgICAgcmV0ID0gZmlyX2ZyYW1lKHMsIG91dGxpbmspOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBdWRpb0ZJUkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGlmICghcy0+ZW9mX2NvZWZmcykgeworICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzFdKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgcy0+ZW9mX2NvZWZmcyA9IDE7CisgICAgICAgICAgICByZXQgPSAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgcy0+aGF2ZV9jb2VmZnMpIHsKKyAgICAgICAgaWYgKHMtPm5lZWRfcGFkZGluZykgeworICAgICAgICAgICAgQVZGcmFtZSAqc2lsZW5jZSA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgcy0+cGFydF9zaXplKTsKKworICAgICAgICAgICAgaWYgKCFzaWxlbmNlKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICByZXQgPSBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmZpZm9bMF0sICh2b2lkICoqKXNpbGVuY2UtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbGVuY2UtPm5iX3NhbXBsZXMpOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmc2lsZW5jZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcy0+bmVlZF9wYWRkaW5nID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChhdl9hdWRpb19maWZvX3NpemUocy0+Zmlmb1swXSkgPiAwKSB7CisgICAgICAgICAgICByZXQgPSBmaXJfZnJhbWUocywgb3V0bGluayk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworICAgIGludCByZXQsIGk7CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfY291bnRzKCk7CisgICAgaWYgKChyZXQgPSBmZl9jaGFubmVsX2xheW91dHNfcmVmKGxheW91dHMsICZjdHgtPm91dHB1dHNbMF0tPmluX2NoYW5uZWxfbGF5b3V0cykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpOworICAgICAgICBpZiAoKHJldCA9IGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmN0eC0+aW5wdXRzW2ldLT5vdXRfY2hhbm5lbF9sYXlvdXRzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CisgICAgaWYgKChyZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQXVkaW9GSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKGN0eC0+aW5wdXRzWzBdLT5jaGFubmVscyAhPSBjdHgtPmlucHV0c1sxXS0+Y2hhbm5lbHMgJiYKKyAgICAgICAgY3R4LT5pbnB1dHNbMV0tPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlNlY29uZCBpbnB1dCBtdXN0IGhhdmUgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMgYXMgZmlyc3QgaW5wdXQgb3IgIgorICAgICAgICAgICAgICAgImV4YWN0bHkgMSBjaGFubmVsLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcy0+b25lMm1hbnkgPSBjdHgtPmlucHV0c1sxXS0+Y2hhbm5lbHMgPT0gMTsKKyAgICBvdXRsaW5rLT5zYW1wbGVfcmF0ZSA9IGN0eC0+aW5wdXRzWzBdLT5zYW1wbGVfcmF0ZTsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgICA9IGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQgPSBjdHgtPmlucHV0c1swXS0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgb3V0bGluay0+Y2hhbm5lbHMgPSBjdHgtPmlucHV0c1swXS0+Y2hhbm5lbHM7CisKKyAgICBzLT5maWZvWzBdID0gYXZfYXVkaW9fZmlmb19hbGxvYyhjdHgtPmlucHV0c1swXS0+Zm9ybWF0LCBjdHgtPmlucHV0c1swXS0+Y2hhbm5lbHMsIDEwMjQpOworICAgIHMtPmZpZm9bMV0gPSBhdl9hdWRpb19maWZvX2FsbG9jKGN0eC0+aW5wdXRzWzFdLT5mb3JtYXQsIGN0eC0+aW5wdXRzWzFdLT5jaGFubmVscywgMTAyNCk7CisgICAgaWYgKCFzLT5maWZvWzBdIHx8ICFzLT5maWZvWzFdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+c3VtID0gYXZfY2FsbG9jKG91dGxpbmstPmNoYW5uZWxzLCBzaXplb2YoKnMtPnN1bSkpOworICAgIHMtPmNvZWZmID0gYXZfY2FsbG9jKGN0eC0+aW5wdXRzWzFdLT5jaGFubmVscywgc2l6ZW9mKCpzLT5jb2VmZikpOworICAgIHMtPmJsb2NrID0gYXZfY2FsbG9jKGN0eC0+aW5wdXRzWzBdLT5jaGFubmVscywgc2l6ZW9mKCpzLT5ibG9jaykpOworICAgIHMtPnJkZnQgPSBhdl9jYWxsb2Mob3V0bGluay0+Y2hhbm5lbHMsIHNpemVvZigqcy0+cmRmdCkpOworICAgIHMtPmlyZGZ0ID0gYXZfY2FsbG9jKG91dGxpbmstPmNoYW5uZWxzLCBzaXplb2YoKnMtPmlyZGZ0KSk7CisgICAgaWYgKCFzLT5zdW0gfHwgIXMtPmNvZWZmIHx8ICFzLT5ibG9jayB8fCAhcy0+cmRmdCB8fCAhcy0+aXJkZnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5uYl9jaGFubmVscyA9IG91dGxpbmstPmNoYW5uZWxzOworICAgIHMtPm5iX2NvZWZfY2hhbm5lbHMgPSBjdHgtPmlucHV0c1sxXS0+Y2hhbm5lbHM7CisgICAgcy0+d2FudF9za2lwID0gMTsKKyAgICBzLT5uZWVkX3BhZGRpbmcgPSAxOworICAgIHMtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEF1ZGlvRklSQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgY2g7CisKKyAgICBpZiAocy0+c3VtKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+c3VtW2NoXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPnN1bSk7CisKKyAgICBpZiAocy0+Y29lZmYpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfY29lZl9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmNvZWZmW2NoXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPmNvZWZmKTsKKworICAgIGlmIChzLT5ibG9jaykgeworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmJsb2NrW2NoXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPmJsb2NrKTsKKworICAgIGlmIChzLT5yZGZ0KSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBhdl9yZGZ0X2VuZChzLT5yZGZ0W2NoXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPnJkZnQpOworCisgICAgaWYgKHMtPmlyZGZ0KSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICBhdl9yZGZ0X2VuZChzLT5pcmRmdFtjaF0pOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWVwKCZzLT5pcmRmdCk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5pblswXSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+aW5bMV0pOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmJ1ZmZlcik7CisKKyAgICBhdl9hdWRpb19maWZvX2ZyZWUocy0+Zmlmb1swXSk7CisgICAgYXZfYXVkaW9fZmlmb19mcmVlKHMtPmZpZm9bMV0pOworCisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb0ZJUkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5mY211bF9hZGQgPSBmY211bF9hZGRfYzsKKworICAgIHMtPmZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKDApOworICAgIGlmICghcy0+ZmRzcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfYWZpcl9pbml0X3g4NihzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYWZpcl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJtYWluIiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSx7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJpciIsCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gcmVhZF9pciwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYWZpcl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNkZWZpbmUgQUYgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBdWRpb0ZJUkNvbnRleHQsIHgpCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhZmlyX29wdGlvbnNbXSA9IHsKKyAgICB7ICJkcnkiLCAgICAic2V0IGRyeSBnYWluIiwgICAgIE9GRlNFVChkcnlfZ2FpbiksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMSwgQUYgfSwKKyAgICB7ICJ3ZXQiLCAgICAic2V0IHdldCBnYWluIiwgICAgIE9GRlNFVCh3ZXRfZ2FpbiksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMSwgQUYgfSwKKyAgICB7ICJsZW5ndGgiLCAic2V0IElSIGxlbmd0aCIsICAgIE9GRlNFVChsZW5ndGgpLCAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMSwgQUYgfSwKKyAgICB7ICJhZ2FpbiIsICAiZW5hYmxlIGF1dG8gZ2FpbiIsIE9GRlNFVChhZ2FpbiksICAgIEFWX09QVF9UWVBFX0JPT0wsICB7Lmk2ND0xfSwgMCwgMSwgQUYgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFmaXIpOworCitBVkZpbHRlciBmZl9hZl9hZmlyID0geworICAgIC5uYW1lICAgICAgICAgID0gImFmaXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IEZpbml0ZSBJbXB1bHNlIFJlc3BvbnNlIGZpbHRlciB3aXRoIHN1cHBsaWVkIGNvZWZmaWNpZW50cyBpbiAybmQgc3RyZWFtLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEF1ZGlvRklSQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmYWZpcl9jbGFzcywKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgID0gYWZpcl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhZmlyX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfYWZpci5oIGIvbGliYXZmaWx0ZXIvYWZfYWZpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZWI2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9hZl9hZmlyLmgKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9BRklSX0gKKyNkZWZpbmUgQVZGSUxURVJfQUZJUl9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXVkaW9fZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZmZnQuaCIKKworI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBNQVhfSVJfRFVSQVRJT04gMzAKKwordHlwZWRlZiBzdHJ1Y3QgQXVkaW9GSVJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGZsb2F0IHdldF9nYWluOworICAgIGZsb2F0IGRyeV9nYWluOworICAgIGZsb2F0IGxlbmd0aDsKKyAgICBpbnQgYWdhaW47CisKKyAgICBmbG9hdCBnYWluOworCisgICAgaW50IGVvZl9jb2VmZnM7CisgICAgaW50IGhhdmVfY29lZmZzOworICAgIGludCBuYl9jb2VmZnM7CisgICAgaW50IG5iX3RhcHM7CisgICAgaW50IHBhcnRfc2l6ZTsKKyAgICBpbnQgcGFydF9pbmRleDsKKyAgICBpbnQgY29lZmZfc2l6ZTsKKyAgICBpbnQgYmxvY2tfc2l6ZTsKKyAgICBpbnQgbmJfcGFydGl0aW9uczsKKyAgICBpbnQgbmJfY2hhbm5lbHM7CisgICAgaW50IGlyX2xlbmd0aDsKKyAgICBpbnQgZmZ0X2xlbmd0aDsKKyAgICBpbnQgbmJfY29lZl9jaGFubmVsczsKKyAgICBpbnQgb25lMm1hbnk7CisgICAgaW50IG5iX3NhbXBsZXM7CisgICAgaW50IHdhbnRfc2tpcDsKKyAgICBpbnQgbmVlZF9wYWRkaW5nOworCisgICAgUkRGVENvbnRleHQgKipyZGZ0LCAqKmlyZGZ0OworICAgIGZsb2F0ICoqc3VtOworICAgIGZsb2F0ICoqYmxvY2s7CisgICAgRkZUQ29tcGxleCAqKmNvZWZmOworCisgICAgQVZBdWRpb0ZpZm8gKmZpZm9bMl07CisgICAgQVZGcmFtZSAqaW5bMl07CisgICAgQVZGcmFtZSAqYnVmZmVyOworICAgIGludDY0X3QgcHRzOworICAgIGludCBpbmRleDsKKworICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOworICAgIHZvaWQgKCpmY211bF9hZGQpKGZsb2F0ICpzdW0sIGNvbnN0IGZsb2F0ICp0LCBjb25zdCBmbG9hdCAqYywKKyAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGVuKTsKK30gQXVkaW9GSVJDb250ZXh0OworCit2b2lkIGZmX2FmaXJfaW5pdF94ODYoQXVkaW9GSVJDb250ZXh0ICpzKTsKKworI2VuZGlmIC8qIEFWRklMVEVSX0FGSVJfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfYWdhdGUuYyBiL2xpYmF2ZmlsdGVyL2FmX2FnYXRlLmMKaW5kZXggMzI4ZTI1Yi4uYmE5Njg2MyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYWdhdGUuYworKysgYi9saWJhdmZpbHRlci9hZl9hZ2F0ZS5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJmaWx0ZXJzLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgImhlcm1pdGUuaCIKIApAQCAtMjEzLDcgKzIxNCw3IEBACiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgewogICAgICAgICBvdXQgPSBpbjsKICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKICAgICAgICAgaWYgKCFvdXQpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0yNjUsNzAgKzI2Niw2OSBAQAogI2RlZmluZSBzaWRlY2hhaW5nYXRlX29wdGlvbnMgb3B0aW9ucwogQVZGSUxURVJfREVGSU5FX0NMQVNTKHNpZGVjaGFpbmdhdGUpOwogCi1zdGF0aWMgaW50IHNjZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewotICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OwogICAgIEF1ZGlvR2F0ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOwotICAgIEFWRnJhbWUgKm91dCwgKmluWzJdID0geyBOVUxMIH07CisgICAgQVZGcmFtZSAqb3V0ID0gTlVMTCwgKmluWzJdID0geyBOVUxMIH07CisgICAgaW50IHJldCwgaSwgbmJfc2FtcGxlczsKICAgICBkb3VibGUgKmRzdDsKLSAgICBpbnQgbmJfc2FtcGxlczsKLSAgICBpbnQgaTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0gICAgICAgIGlmIChsaW5rID09IGN0eC0+aW5wdXRzW2ldKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgYXZfYXNzZXJ0MChpIDwgMik7Ci0gICAgYXZfYXVkaW9fZmlmb193cml0ZShzLT5maWZvW2ldLCAodm9pZCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzKTsKLSAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgRkZfRklMVEVSX0ZPUldBUkRfU1RBVFVTX0JBQ0tfQUxMKGN0eC0+b3V0cHV0c1swXSwgY3R4KTsKKyAgICBpZiAoKHJldCA9IGZmX2lubGlua19jb25zdW1lX2ZyYW1lKGN0eC0+aW5wdXRzWzBdLCAmaW5bMF0pKSA+IDApIHsKKyAgICAgICAgYXZfYXVkaW9fZmlmb193cml0ZShzLT5maWZvWzBdLCAodm9pZCAqKilpblswXS0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblswXS0+bmJfc2FtcGxlcyk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluWzBdKTsKKyAgICB9CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBmZl9pbmxpbmtfY29uc3VtZV9mcmFtZShjdHgtPmlucHV0c1sxXSwgJmluWzFdKSkgPiAwKSB7CisgICAgICAgIGF2X2F1ZGlvX2ZpZm9fd3JpdGUocy0+Zmlmb1sxXSwgKHZvaWQgKiopaW5bMV0tPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5bMV0tPm5iX3NhbXBsZXMpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpblsxXSk7CisgICAgfQorICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgbmJfc2FtcGxlcyA9IEZGTUlOKGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvWzBdKSwgYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9bMV0pKTsKLSAgICBpZiAoIW5iX3NhbXBsZXMpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKTsKLSAgICBpZiAoIW91dCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgIGluW2ldID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihjdHgtPmlucHV0c1tpXSwgbmJfc2FtcGxlcyk7Ci0gICAgICAgIGlmICghaW5baV0pIHsKLSAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluWzBdKTsKLSAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluWzFdKTsKLSAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CisgICAgaWYgKG5iX3NhbXBsZXMpIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihjdHgtPm91dHB1dHNbMF0sIG5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGluW2ldID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihjdHgtPmlucHV0c1tpXSwgbmJfc2FtcGxlcyk7CisgICAgICAgICAgICBpZiAoIWluW2ldKSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5bMF0pOworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluWzFdKTsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9hdWRpb19maWZvX3JlYWQocy0+Zmlmb1tpXSwgKHZvaWQgKiopaW5baV0tPmRhdGEsIG5iX3NhbXBsZXMpOwogICAgICAgICB9Ci0gICAgICAgIGF2X2F1ZGlvX2ZpZm9fcmVhZChzLT5maWZvW2ldLCAodm9pZCAqKilpbltpXS0+ZGF0YSwgbmJfc2FtcGxlcyk7CisKKyAgICAgICAgZHN0ID0gKGRvdWJsZSAqKW91dC0+ZGF0YVswXTsKKyAgICAgICAgb3V0LT5wdHMgPSBzLT5wdHM7CisgICAgICAgIHMtPnB0cyArPSBuYl9zYW1wbGVzOworCisgICAgICAgIGdhdGUocywgKGRvdWJsZSAqKWluWzBdLT5kYXRhWzBdLCBkc3QsCisgICAgICAgICAgICAgKGRvdWJsZSAqKWluWzFdLT5kYXRhWzBdLCBuYl9zYW1wbGVzLAorICAgICAgICAgICAgIHMtPmxldmVsX2luLCBzLT5sZXZlbF9zYywKKyAgICAgICAgICAgICBjdHgtPmlucHV0c1swXSwgY3R4LT5pbnB1dHNbMV0pOworCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluWzBdKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5bMV0pOworCisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0KLSAgICBkc3QgPSAoZG91YmxlICopb3V0LT5kYXRhWzBdOwotICAgIG91dC0+cHRzID0gcy0+cHRzOwotICAgIHMtPnB0cyArPSBuYl9zYW1wbGVzOwotCi0gICAgZ2F0ZShzLCAoZG91YmxlICopaW5bMF0tPmRhdGFbMF0sIGRzdCwKLSAgICAgICAgIChkb3VibGUgKilpblsxXS0+ZGF0YVswXSwgbmJfc2FtcGxlcywKLSAgICAgICAgIHMtPmxldmVsX2luLCBzLT5sZXZlbF9zYywKLSAgICAgICAgIGN0eC0+aW5wdXRzWzBdLCBjdHgtPmlucHV0c1sxXSk7Ci0KLSAgICBhdl9mcmFtZV9mcmVlKCZpblswXSk7Ci0gICAgYXZfZnJhbWVfZnJlZSgmaW5bMV0pOwotCi0gICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwotfQotCi1zdGF0aWMgaW50IHNjcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCi17Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7Ci0gICAgQXVkaW9HYXRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgaTsKLQotICAgIC8qIGdldCBhIGZyYW1lIG9uIGVhY2ggaW5wdXQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbaV07Ci0gICAgICAgIGlmICghYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9baV0pKQotICAgICAgICAgICAgcmV0dXJuIGZmX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsKKyAgICBGRl9GSUxURVJfRk9SV0FSRF9TVEFUVVMoY3R4LT5pbnB1dHNbMF0sIGN0eC0+b3V0cHV0c1swXSk7CisgICAgRkZfRklMVEVSX0ZPUldBUkRfU1RBVFVTKGN0eC0+aW5wdXRzWzFdLCBjdHgtPm91dHB1dHNbMF0pOworICAgIGlmIChmZl9vdXRsaW5rX2ZyYW1lX3dhbnRlZChjdHgtPm91dHB1dHNbMF0pKSB7CisgICAgICAgIGlmICghYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9bMF0pKQorICAgICAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworICAgICAgICBpZiAoIWF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvWzFdKSkKKyAgICAgICAgICAgIGZmX2lubGlua19yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzFdKTsKICAgICB9Ci0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDA4LDExICs0MDgsOSBAQAogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICAgID0gIm1haW4iLAogICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IHNjZmlsdGVyX2ZyYW1lLAogICAgIH0sewogICAgICAgICAubmFtZSAgICAgICAgICAgPSAic2lkZWNoYWluIiwKICAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAotICAgICAgICAuZmlsdGVyX2ZyYW1lICAgPSBzY2ZpbHRlcl9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtNDIyLDcgKzQyMCw2IEBACiAgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBzY2NvbmZpZ19vdXRwdXQsCi0gICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gc2NyZXF1ZXN0X2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC00MzMsNiArNDMwLDcgQEAKICAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoQXVkaW9HYXRlQ29udGV4dCksCiAgICAgLnByaXZfY2xhc3MgICAgID0gJnNpZGVjaGFpbmdhdGVfY2xhc3MsCiAgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gc2NxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgICA9IGFjdGl2YXRlLAogICAgIC51bmluaXQgICAgICAgICA9IHVuaW5pdCwKICAgICAuaW5wdXRzICAgICAgICAgPSBzaWRlY2hhaW5nYXRlX2lucHV0cywKICAgICAub3V0cHV0cyAgICAgICAgPSBzaWRlY2hhaW5nYXRlX291dHB1dHMsCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9haWlyLmMgYi9saWJhdmZpbHRlci9hZl9haWlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYyYTU2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2FpaXIuYwpAQCAtMCwwICsxLDg0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOCBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIEFWRnJhbWUgKmluLCAqb3V0OworfSBUaHJlYWREYXRhOworCit0eXBlZGVmIHN0cnVjdCBQYWlyIHsKKyAgICBpbnQgYSwgYjsKK30gUGFpcjsKKwordHlwZWRlZiBzdHJ1Y3QgQmlxdWFkQ29udGV4dCB7CisgICAgZG91YmxlIGEwLCBhMSwgYTI7CisgICAgZG91YmxlIGIwLCBiMSwgYjI7CisgICAgZG91YmxlIGkxLCBpMjsKKyAgICBkb3VibGUgbzEsIG8yOworfSBCaXF1YWRDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBJSVJDaGFubmVsIHsKKyAgICBpbnQgbmJfYWJbMl07CisgICAgZG91YmxlICphYlsyXTsKKyAgICBkb3VibGUgZzsKKyAgICBkb3VibGUgKmNhY2hlWzJdOworICAgIEJpcXVhZENvbnRleHQgKmJpcXVhZHM7CisgICAgaW50IGNsaXBwaW5nczsKK30gSUlSQ2hhbm5lbDsKKwordHlwZWRlZiBzdHJ1Y3QgQXVkaW9JSVJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBjaGFyICphX3N0ciwgKmJfc3RyLCAqZ19zdHI7CisgICAgZG91YmxlIGRyeV9nYWluLCB3ZXRfZ2FpbjsKKyAgICBpbnQgZm9ybWF0OworICAgIGludCBwcm9jZXNzOworICAgIGludCBwcmVjaXNpb247CisKKyAgICBJSVJDaGFubmVsICppaXI7CisgICAgaW50IGNoYW5uZWxzOworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2Zvcm1hdDsKKworICAgIGludCAoKmlpcl9jaGFubmVsKShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgY2gsIGludCBuYl9qb2JzKTsKK30gQXVkaW9JSVJDb250ZXh0OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOworICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkxQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworICAgIGludCByZXQ7CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfY291bnRzKCk7CisgICAgaWYgKCFsYXlvdXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzYW1wbGVfZm10c1swXSA9IHMtPnNhbXBsZV9mb3JtYXQ7CisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKK30KKworI2RlZmluZSBJSVJfQ0gobmFtZSwgdHlwZSwgbWluLCBtYXgsIG5lZWRfY2xpcHBpbmcpICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBpaXJfY2hfIyMgbmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgY2gsIGludCBuYl9qb2JzKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEF1ZGlvSUlSQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSBpZyA9IHMtPmRyeV9nYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSBvZyA9IHMtPndldF9nYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRocmVhZERhdGEgKnRkID0gYXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFWRnJhbWUgKmluID0gdGQtPmluLCAqb3V0ID0gdGQtPm91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHR5cGUgKnNyYyA9IChjb25zdCB0eXBlICopaW4tPmV4dGVuZGVkX2RhdGFbY2hdOyAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSAqaWMgPSAoZG91YmxlICopcy0+aWlyW2NoXS5jYWNoZVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSAqb2MgPSAoZG91YmxlICopcy0+aWlyW2NoXS5jYWNoZVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBuYl9hID0gcy0+aWlyW2NoXS5uYl9hYlswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBuYl9iID0gcy0+aWlyW2NoXS5uYl9hYlsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSAqYSA9IHMtPmlpcltjaF0uYWJbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSAqYiA9IHMtPmlpcltjaF0uYWJbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAqY2xpcHBpbmdzID0gJnMtPmlpcltjaF0uY2xpcHBpbmdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmRzdCA9ICh0eXBlICopb3V0LT5leHRlbmRlZF9kYXRhW2NoXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAobiA9IDA7IG4gPCBpbi0+bmJfc2FtcGxlczsgbisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgc2FtcGxlID0gMC47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZW1tb3ZlKCZpY1sxXSwgJmljWzBdLCAobmJfYiAtIDEpICogc2l6ZW9mKCppYykpOyAgICAgICAgICAgICAgXAorICAgICAgICBtZW1tb3ZlKCZvY1sxXSwgJm9jWzBdLCAobmJfYSAtIDEpICogc2l6ZW9mKCpvYykpOyAgICAgICAgICAgICAgXAorICAgICAgICBpY1swXSA9IHNyY1tuXSAqIGlnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHggPSAwOyB4IDwgbmJfYjsgeCsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2FtcGxlICs9IGJbeF0gKiBpY1t4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHggPSAxOyB4IDwgbmJfYTsgeCsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2FtcGxlIC09IGFbeF0gKiBvY1t4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvY1swXSA9IHNhbXBsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzYW1wbGUgKj0gb2c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobmVlZF9jbGlwcGluZyAmJiBzYW1wbGUgPCBtaW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCpjbGlwcGluZ3MpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W25dID0gbWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKG5lZWRfY2xpcHBpbmcgJiYgc2FtcGxlID4gbWF4KSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCpjbGlwcGluZ3MpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W25dID0gbWF4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W25dID0gc2FtcGxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitJSVJfQ0goczE2cCwgaW50MTZfdCwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIDEpCitJSVJfQ0goczMycCwgaW50MzJfdCwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIDEpCitJSVJfQ0goZmx0cCwgZmxvYXQsICAgICAgICAgLTEuLCAgICAgICAgMS4sIDApCitJSVJfQ0goZGJscCwgZG91YmxlLCAgICAgICAgLTEuLCAgICAgICAgMS4sIDApCisKKyNkZWZpbmUgU0VSSUFMX0lJUl9DSChuYW1lLCB0eXBlLCBtaW4sIG1heCwgbmVlZF9jbGlwcGluZykgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGlpcl9jaF9zZXJpYWxfIyMgbmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgY2gsIGludCBuYl9qb2JzKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEF1ZGlvSUlSQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSBpZyA9IHMtPmRyeV9nYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSBvZyA9IHMtPndldF9nYWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRocmVhZERhdGEgKnRkID0gYXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFWRnJhbWUgKmluID0gdGQtPmluLCAqb3V0ID0gdGQtPm91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHR5cGUgKnNyYyA9IChjb25zdCB0eXBlICopaW4tPmV4dGVuZGVkX2RhdGFbY2hdOyAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmRzdCA9ICh0eXBlICopb3V0LT5leHRlbmRlZF9kYXRhW2NoXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElJUkNoYW5uZWwgKmlpciA9ICZzLT5paXJbY2hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAqY2xpcHBpbmdzID0gJmlpci0+Y2xpcHBpbmdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBuYl9iaXF1YWRzID0gKEZGTUFYKGlpci0+bmJfYWJbMF0sIGlpci0+bmJfYWJbMV0pICsgMSkgLyAyOyAgICAgXAorICAgIGludCBuLCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBuYl9iaXF1YWRzOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBkb3VibGUgYTEgPSAtaWlyLT5iaXF1YWRzW2ldLmExOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBkb3VibGUgYTIgPSAtaWlyLT5iaXF1YWRzW2ldLmEyOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBkb3VibGUgYjAgPSBpaXItPmJpcXVhZHNbaV0uYjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBkb3VibGUgYjEgPSBpaXItPmJpcXVhZHNbaV0uYjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBkb3VibGUgYjIgPSBpaXItPmJpcXVhZHNbaV0uYjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgaTEgPSBpaXItPmJpcXVhZHNbaV0uaTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgaTIgPSBpaXItPmJpcXVhZHNbaV0uaTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgbzEgPSBpaXItPmJpcXVhZHNbaV0ubzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgbzIgPSBpaXItPmJpcXVhZHNbaV0ubzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaW4tPm5iX3NhbXBsZXM7IG4rKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHNhbXBsZSA9IGlnICogKGkgPyBkc3Rbbl0gOiBzcmNbbl0pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIG8wID0gc2FtcGxlICogYjAgKyBpMSAqIGIxICsgaTIgKiBiMiArIG8xICogYTEgKyBvMiAqIGEyOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpMiA9IGkxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpMSA9IHNyY1tuXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvMiA9IG8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvMSA9IG8wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvMCAqPSBvZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobmVlZF9jbGlwcGluZyAmJiBvMCA8IG1pbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCpjbGlwcGluZ3MpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W25dID0gbWluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgaWYgKG5lZWRfY2xpcHBpbmcgJiYgbzAgPiBtYXgpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKCpjbGlwcGluZ3MpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W25dID0gbWF4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W25dID0gbzA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlpci0+YmlxdWFkc1tpXS5pMSA9IGkxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlpci0+YmlxdWFkc1tpXS5pMiA9IGkyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlpci0+YmlxdWFkc1tpXS5vMSA9IG8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlpci0+YmlxdWFkc1tpXS5vMiA9IG8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1NFUklBTF9JSVJfQ0goczE2cCwgaW50MTZfdCwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIDEpCitTRVJJQUxfSUlSX0NIKHMzMnAsIGludDMyX3QsIElOVDMyX01JTiwgSU5UMzJfTUFYLCAxKQorU0VSSUFMX0lJUl9DSChmbHRwLCBmbG9hdCwgICAgICAgICAtMS4sICAgICAgICAxLiwgMCkKK1NFUklBTF9JSVJfQ0goZGJscCwgZG91YmxlLCAgICAgICAgLTEuLCAgICAgICAgMS4sIDApCisKK3N0YXRpYyB2b2lkIGNvdW50X2NvZWZmaWNpZW50cyhjaGFyICppdGVtX3N0ciwgaW50ICpuYl9pdGVtcykKK3sKKyAgICBjaGFyICpwOworCisgICAgaWYgKCFpdGVtX3N0cikKKyAgICAgICAgcmV0dXJuOworCisgICAgKm5iX2l0ZW1zID0gMTsKKyAgICBmb3IgKHAgPSBpdGVtX3N0cjsgKnAgJiYgKnAgIT0gJ3wnOyBwKyspIHsKKyAgICAgICAgaWYgKCpwID09ICcgJykKKyAgICAgICAgICAgICgqbmJfaXRlbXMpKys7CisgICAgfQorfQorCitzdGF0aWMgaW50IHJlYWRfZ2FpbnMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNoYXIgKml0ZW1fc3RyLCBpbnQgbmJfaXRlbXMpCit7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNoYXIgKnAsICphcmcsICpvbGRfc3RyLCAqcHJldl9hcmcgPSBOVUxMLCAqc2F2ZXB0ciA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBwID0gb2xkX3N0ciA9IGF2X3N0cmR1cChpdGVtX3N0cik7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pdGVtczsgaSsrKSB7CisgICAgICAgIGlmICghKGFyZyA9IGF2X3N0cnRvayhwLCAifCIsICZzYXZlcHRyKSkpCisgICAgICAgICAgICBhcmcgPSBwcmV2X2FyZzsKKworICAgICAgICBpZiAoIWFyZykgeworICAgICAgICAgICAgYXZfZnJlZXAoJm9sZF9zdHIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBpZiAoc3NjYW5mKGFyZywgIiVsZiIsICZzLT5paXJbaV0uZykgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBnYWlucyBzdXBwbGllZDogJXNcbiIsIGFyZyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmb2xkX3N0cik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgcHJldl9hcmcgPSBhcmc7CisgICAgfQorCisgICAgYXZfZnJlZXAoJm9sZF9zdHIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF90Zl9jb2VmZmljaWVudHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNoYXIgKml0ZW1fc3RyLCBpbnQgbmJfaXRlbXMsIGRvdWJsZSAqZHN0KQoreworICAgIGNoYXIgKnAsICphcmcsICpvbGRfc3RyLCAqc2F2ZXB0ciA9IE5VTEw7CisgICAgaW50IGk7CisKKyAgICBwID0gb2xkX3N0ciA9IGF2X3N0cmR1cChpdGVtX3N0cik7CisgICAgaWYgKCFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9pdGVtczsgaSsrKSB7CisgICAgICAgIGlmICghKGFyZyA9IGF2X3N0cnRvayhwLCAiICIsICZzYXZlcHRyKSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgaWYgKHNzY2FuZihhcmcsICIlbGYiLCAmZHN0W2ldKSAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvZWZmaWNpZW50cyBzdXBwbGllZDogJXNcbiIsIGFyZyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmb2xkX3N0cik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJlZXAoJm9sZF9zdHIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF96cF9jb2VmZmljaWVudHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNoYXIgKml0ZW1fc3RyLCBpbnQgbmJfaXRlbXMsIGRvdWJsZSAqZHN0LCBjb25zdCBjaGFyICpmb3JtYXQpCit7CisgICAgY2hhciAqcCwgKmFyZywgKm9sZF9zdHIsICpzYXZlcHRyID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIHAgPSBvbGRfc3RyID0gYXZfc3RyZHVwKGl0ZW1fc3RyKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX2l0ZW1zOyBpKyspIHsKKyAgICAgICAgaWYgKCEoYXJnID0gYXZfc3RydG9rKHAsICIgIiwgJnNhdmVwdHIpKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBpZiAoc3NjYW5mKGFyZywgZm9ybWF0LCAmZHN0W2kqMl0sICZkc3RbaSoyKzFdKSAhPSAyKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNvZWZmaWNpZW50cyBzdXBwbGllZDogJXNcbiIsIGFyZyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmb2xkX3N0cik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJlZXAoJm9sZF9zdHIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpmb3JtYXRbXSA9IHsgIiVsZiIsICIlbGYgJWxmaSIsICIlbGYgJWxmciIsICIlbGYgJWxmZCIgfTsKKworc3RhdGljIGludCByZWFkX2NoYW5uZWxzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgY2hhbm5lbHMsIHVpbnQ4X3QgKml0ZW1fc3RyLCBpbnQgYWIpCit7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNoYXIgKnAsICphcmcsICpvbGRfc3RyLCAqcHJldl9hcmcgPSBOVUxMLCAqc2F2ZXB0ciA9IE5VTEw7CisgICAgaW50IGksIHJldDsKKworICAgIHAgPSBvbGRfc3RyID0gYXZfc3RyZHVwKGl0ZW1fc3RyKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgSUlSQ2hhbm5lbCAqaWlyID0gJnMtPmlpcltpXTsKKworICAgICAgICBpZiAoIShhcmcgPSBhdl9zdHJ0b2socCwgInwiLCAmc2F2ZXB0cikpKQorICAgICAgICAgICAgYXJnID0gcHJldl9hcmc7CisKKyAgICAgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZvbGRfc3RyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBjb3VudF9jb2VmZmljaWVudHMoYXJnLCAmaWlyLT5uYl9hYlthYl0pOworCisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBpaXItPmNhY2hlW2FiXSA9IGF2X2NhbGxvYyhpaXItPm5iX2FiW2FiXSArIDEsIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgaWlyLT5hYlthYl0gPSBhdl9jYWxsb2MoaWlyLT5uYl9hYlthYl0gKiAoISFzLT5mb3JtYXQgKyAxKSwgc2l6ZW9mKGRvdWJsZSkpOworICAgICAgICBpZiAoIWlpci0+YWJbYWJdIHx8ICFpaXItPmNhY2hlW2FiXSkgeworICAgICAgICAgICAgYXZfZnJlZXAoJm9sZF9zdHIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCA9IHJlYWRfenBfY29lZmZpY2llbnRzKGN0eCwgYXJnLCBpaXItPm5iX2FiW2FiXSwgaWlyLT5hYlthYl0sIGZvcm1hdFtzLT5mb3JtYXRdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHJlYWRfdGZfY29lZmZpY2llbnRzKGN0eCwgYXJnLCBpaXItPm5iX2FiW2FiXSwgaWlyLT5hYlthYl0pOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmb2xkX3N0cik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHByZXZfYXJnID0gYXJnOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZvbGRfc3RyKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdWx0aXBseShkb3VibGUgd3JlLCBkb3VibGUgd2ltLCBpbnQgbnB6LCBkb3VibGUgKmNvZWZmcykKK3sKKyAgICBkb3VibGUgbndyZSA9IC13cmUsIG53aW0gPSAtd2ltOworICAgIGRvdWJsZSBjcmUsIGNpbTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IG5wejsgaSA+PSAxOyBpLS0pIHsKKyAgICAgICAgY3JlID0gY29lZmZzWzIgKiBpICsgMF07CisgICAgICAgIGNpbSA9IGNvZWZmc1syICogaSArIDFdOworCisgICAgICAgIGNvZWZmc1syICogaSArIDBdID0gKG53cmUgKiBjcmUgLSBud2ltICogY2ltKSArIGNvZWZmc1syICogKGkgLSAxKSArIDBdOworICAgICAgICBjb2VmZnNbMiAqIGkgKyAxXSA9IChud3JlICogY2ltICsgbndpbSAqIGNyZSkgKyBjb2VmZnNbMiAqIChpIC0gMSkgKyAxXTsKKyAgICB9CisKKyAgICBjcmUgPSBjb2VmZnNbMF07CisgICAgY2ltID0gY29lZmZzWzFdOworICAgIGNvZWZmc1swXSA9IG53cmUgKiBjcmUgLSBud2ltICogY2ltOworICAgIGNvZWZmc1sxXSA9IG53cmUgKiBjaW0gKyBud2ltICogY3JlOworfQorCitzdGF0aWMgaW50IGV4cGFuZChBVkZpbHRlckNvbnRleHQgKmN0eCwgZG91YmxlICpweiwgaW50IG5iLCBkb3VibGUgKmNvZWZmcykKK3sKKyAgICBpbnQgaTsKKworICAgIGNvZWZmc1swXSA9IDEuMDsKKyAgICBjb2VmZnNbMV0gPSAwLjA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmI7IGkrKykgeworICAgICAgICBjb2VmZnNbMiAqIChpICsgMSkgICAgXSA9IDAuMDsKKyAgICAgICAgY29lZmZzWzIgKiAoaSArIDEpICsgMV0gPSAwLjA7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG5iOyBpKyspCisgICAgICAgIG11bHRpcGx5KHB6WzIgKiBpXSwgcHpbMiAqIGkgKyAxXSwgbmIsIGNvZWZmcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmIgKyAxOyBpKyspIHsKKyAgICAgICAgaWYgKGZhYnMoY29lZmZzWzIgKiBpICsgMV0pID4gRkxUX0VQU0lMT04pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNvZWZmOiAlbGYgb2Ygel4lZCBpcyBub3QgcmVhbDsgcG9sZXMvemVyb3MgYXJlIG5vdCBjb21wbGV4IGNvbmp1Z2F0ZXMuXG4iLAorICAgICAgICAgICAgICAgICAgIGNvZWZmc1syICogaSArIDFdLCBpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb252ZXJ0X3pwMnRmKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgY2hhbm5lbHMpCit7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBjaCwgaSwgaiwgcmV0ID0gMDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIElJUkNoYW5uZWwgKmlpciA9ICZzLT5paXJbY2hdOworICAgICAgICBkb3VibGUgKnRvcGMsICpib3RjOworCisgICAgICAgIHRvcGMgPSBhdl9jYWxsb2MoKGlpci0+bmJfYWJbMF0gKyAxKSAqIDIsIHNpemVvZigqdG9wYykpOworICAgICAgICBib3RjID0gYXZfY2FsbG9jKChpaXItPm5iX2FiWzFdICsgMSkgKiAyLCBzaXplb2YoKmJvdGMpKTsKKyAgICAgICAgaWYgKCF0b3BjIHx8ICFib3RjKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBleHBhbmQoY3R4LCBpaXItPmFiWzBdLCBpaXItPm5iX2FiWzBdLCBib3RjKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGV4cGFuZChjdHgsIGlpci0+YWJbMV0sIGlpci0+bmJfYWJbMV0sIHRvcGMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMCwgaSA9IGlpci0+bmJfYWJbMV07IGkgPj0gMDsgaisrLCBpLS0pIHsKKyAgICAgICAgICAgIGlpci0+YWJbMV1bal0gPSB0b3BjWzIgKiBpXTsKKyAgICAgICAgfQorICAgICAgICBpaXItPm5iX2FiWzFdKys7CisKKyAgICAgICAgZm9yIChqID0gMCwgaSA9IGlpci0+bmJfYWJbMF07IGkgPj0gMDsgaisrLCBpLS0pIHsKKyAgICAgICAgICAgIGlpci0+YWJbMF1bal0gPSBib3RjWzIgKiBpXTsKKyAgICAgICAgfQorICAgICAgICBpaXItPm5iX2FiWzBdKys7CisKK2ZhaWw6CisgICAgICAgIGF2X2ZyZWUodG9wYyk7CisgICAgICAgIGF2X2ZyZWUoYm90Yyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZWNvbXBvc2VfenAyYmlxdWFkcyhBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IGNoYW5uZWxzKQoreworICAgIEF1ZGlvSUlSQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgY2gsIHJldDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIElJUkNoYW5uZWwgKmlpciA9ICZzLT5paXJbY2hdOworICAgICAgICBpbnQgbmJfYmlxdWFkcyA9IChGRk1BWChpaXItPm5iX2FiWzBdLCBpaXItPm5iX2FiWzFdKSArIDEpIC8gMjsKKyAgICAgICAgaW50IGN1cnJlbnRfYmlxdWFkID0gMDsKKworICAgICAgICBpaXItPmJpcXVhZHMgPSBhdl9jYWxsb2MobmJfYmlxdWFkcywgc2l6ZW9mKEJpcXVhZENvbnRleHQpKTsKKyAgICAgICAgaWYgKCFpaXItPmJpcXVhZHMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHdoaWxlIChuYl9iaXF1YWRzLS0pIHsKKyAgICAgICAgICAgIFBhaXIgb3V0bW9zdF9wb2xlID0geyAtMSwgLTEgfTsKKyAgICAgICAgICAgIFBhaXIgbmVhcmVzdF96ZXJvID0geyAtMSwgLTEgfTsKKyAgICAgICAgICAgIGRvdWJsZSB6ZXJvc1s0XSA9IHsgMCB9OworICAgICAgICAgICAgZG91YmxlIHBvbGVzWzRdID0geyAwIH07CisgICAgICAgICAgICBkb3VibGUgYls2XSA9IHsgMCB9OworICAgICAgICAgICAgZG91YmxlIGFbNl0gPSB7IDAgfTsKKyAgICAgICAgICAgIGRvdWJsZSBtaW5fZGlzdGFuY2UgPSBEQkxfTUFYOworICAgICAgICAgICAgZG91YmxlIG1heF9tYWcgPSAwOworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpaXItPm5iX2FiWzBdOyBpKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgbWFnOworCisgICAgICAgICAgICAgICAgaWYgKGlzbmFuKGlpci0+YWJbMF1bMiAqIGldKSB8fCBpc25hbihpaXItPmFiWzBdWzIgKiBpICsgMV0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBtYWcgPSBoeXBvdChpaXItPmFiWzBdWzIgKiBpXSwgaWlyLT5hYlswXVsyICogaSArIDFdKTsKKworICAgICAgICAgICAgICAgIGlmIChtYWcgPiBtYXhfbWFnKSB7CisgICAgICAgICAgICAgICAgICAgIG1heF9tYWcgPSBtYWc7CisgICAgICAgICAgICAgICAgICAgIG91dG1vc3RfcG9sZS5hID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpaXItPm5iX2FiWzFdOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNuYW4oaWlyLT5hYlswXVsyICogaV0pIHx8IGlzbmFuKGlpci0+YWJbMF1bMiAqIGkgKyAxXSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKGlpci0+YWJbMF1bMiAqIGkgICAgXSA9PSAgaWlyLT5hYlswXVsyICogb3V0bW9zdF9wb2xlLmEgICAgXSAmJgorICAgICAgICAgICAgICAgICAgICBpaXItPmFiWzBdWzIgKiBpICsgMV0gPT0gLWlpci0+YWJbMF1bMiAqIG91dG1vc3RfcG9sZS5hICsgMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0bW9zdF9wb2xlLmIgPSBpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAib3V0bW9zdF9wb2xlIGlzICVkLiVkXG4iLCBvdXRtb3N0X3BvbGUuYSwgb3V0bW9zdF9wb2xlLmIpOworCisgICAgICAgICAgICBpZiAob3V0bW9zdF9wb2xlLmEgPCAwIHx8IG91dG1vc3RfcG9sZS5iIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWlyLT5uYl9hYlsxXTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIGRpc3RhbmNlOworCisgICAgICAgICAgICAgICAgaWYgKGlzbmFuKGlpci0+YWJbMV1bMiAqIGldKSB8fCBpc25hbihpaXItPmFiWzFdWzIgKiBpICsgMV0pKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IGh5cG90KGlpci0+YWJbMF1bMiAqIG91dG1vc3RfcG9sZS5hICAgIF0gLSBpaXItPmFiWzFdWzIgKiBpICAgIF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaXItPmFiWzBdWzIgKiBvdXRtb3N0X3BvbGUuYSArIDFdIC0gaWlyLT5hYlsxXVsyICogaSArIDFdKTsKKworICAgICAgICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG1pbl9kaXN0YW5jZSkgeworICAgICAgICAgICAgICAgICAgICBtaW5fZGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgICAgICAgICAgICAgICAgICAgbmVhcmVzdF96ZXJvLmEgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGlpci0+bmJfYWJbMV07IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChpc25hbihpaXItPmFiWzFdWzIgKiBpXSkgfHwgaXNuYW4oaWlyLT5hYlsxXVsyICogaSArIDFdKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiAoaWlyLT5hYlsxXVsyICogaSAgICBdID09ICBpaXItPmFiWzFdWzIgKiBuZWFyZXN0X3plcm8uYSAgICBdICYmCisgICAgICAgICAgICAgICAgICAgIGlpci0+YWJbMV1bMiAqIGkgKyAxXSA9PSAtaWlyLT5hYlsxXVsyICogbmVhcmVzdF96ZXJvLmEgKyAxXSkgeworICAgICAgICAgICAgICAgICAgICBuZWFyZXN0X3plcm8uYiA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJuZWFyZXN0X3plcm8gaXMgJWQuJWRcbiIsIG5lYXJlc3RfemVyby5hLCBuZWFyZXN0X3plcm8uYik7CisKKyAgICAgICAgICAgIGlmIChuZWFyZXN0X3plcm8uYSA8IDAgfHwgbmVhcmVzdF96ZXJvLmIgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgICAgIHBvbGVzWzBdID0gaWlyLT5hYlswXVsyICogb3V0bW9zdF9wb2xlLmEgICAgXTsKKyAgICAgICAgICAgIHBvbGVzWzFdID0gaWlyLT5hYlswXVsyICogb3V0bW9zdF9wb2xlLmEgKyAxXTsKKworICAgICAgICAgICAgemVyb3NbMF0gPSBpaXItPmFiWzFdWzIgKiBuZWFyZXN0X3plcm8uYSAgICBdOworICAgICAgICAgICAgemVyb3NbMV0gPSBpaXItPmFiWzFdWzIgKiBuZWFyZXN0X3plcm8uYSArIDFdOworCisgICAgICAgICAgICBpZiAobmVhcmVzdF96ZXJvLmEgPT0gbmVhcmVzdF96ZXJvLmIgJiYgb3V0bW9zdF9wb2xlLmEgPT0gb3V0bW9zdF9wb2xlLmIpIHsKKyAgICAgICAgICAgICAgICB6ZXJvc1syXSA9IDA7CisgICAgICAgICAgICAgICAgemVyb3NbM10gPSAwOworCisgICAgICAgICAgICAgICAgcG9sZXNbMl0gPSAwOworICAgICAgICAgICAgICAgIHBvbGVzWzNdID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcG9sZXNbMl0gPSBpaXItPmFiWzBdWzIgKiBvdXRtb3N0X3BvbGUuYiAgICBdOworICAgICAgICAgICAgICAgIHBvbGVzWzNdID0gaWlyLT5hYlswXVsyICogb3V0bW9zdF9wb2xlLmIgKyAxXTsKKworICAgICAgICAgICAgICAgIHplcm9zWzJdID0gaWlyLT5hYlsxXVsyICogbmVhcmVzdF96ZXJvLmIgICAgXTsKKyAgICAgICAgICAgICAgICB6ZXJvc1szXSA9IGlpci0+YWJbMV1bMiAqIG5lYXJlc3RfemVyby5iICsgMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IGV4cGFuZChjdHgsIHplcm9zLCAyLCBiKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIHJldCA9IGV4cGFuZChjdHgsIHBvbGVzLCAyLCBhKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIGlpci0+YWJbMF1bMiAqIG91dG1vc3RfcG9sZS5hXSA9IGlpci0+YWJbMF1bMiAqIG91dG1vc3RfcG9sZS5hICsgMV0gPSBOQU47CisgICAgICAgICAgICBpaXItPmFiWzBdWzIgKiBvdXRtb3N0X3BvbGUuYl0gPSBpaXItPmFiWzBdWzIgKiBvdXRtb3N0X3BvbGUuYiArIDFdID0gTkFOOworICAgICAgICAgICAgaWlyLT5hYlsxXVsyICogbmVhcmVzdF96ZXJvLmFdID0gaWlyLT5hYlsxXVsyICogbmVhcmVzdF96ZXJvLmEgKyAxXSA9IE5BTjsKKyAgICAgICAgICAgIGlpci0+YWJbMV1bMiAqIG5lYXJlc3RfemVyby5iXSA9IGlpci0+YWJbMV1bMiAqIG5lYXJlc3RfemVyby5iICsgMV0gPSBOQU47CisKKyAgICAgICAgICAgIGlpci0+YmlxdWFkc1tjdXJyZW50X2JpcXVhZF0uYTAgPSAxLjA7CisgICAgICAgICAgICBpaXItPmJpcXVhZHNbY3VycmVudF9iaXF1YWRdLmExID0gYVsyXSAvIGFbNF07CisgICAgICAgICAgICBpaXItPmJpcXVhZHNbY3VycmVudF9iaXF1YWRdLmEyID0gYVswXSAvIGFbNF07CisgICAgICAgICAgICBpaXItPmJpcXVhZHNbY3VycmVudF9iaXF1YWRdLmIwID0gYls0XSAvIGFbNF0gKiAoY3VycmVudF9iaXF1YWQgPyAxLjAgOiBpaXItPmcpOworICAgICAgICAgICAgaWlyLT5iaXF1YWRzW2N1cnJlbnRfYmlxdWFkXS5iMSA9IGJbMl0gLyBhWzRdICogKGN1cnJlbnRfYmlxdWFkID8gMS4wIDogaWlyLT5nKTsKKyAgICAgICAgICAgIGlpci0+YmlxdWFkc1tjdXJyZW50X2JpcXVhZF0uYjIgPSBiWzBdIC8gYVs0XSAqIChjdXJyZW50X2JpcXVhZCA/IDEuMCA6IGlpci0+Zyk7CisKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiYT0lbGYgJWxmICVsZjpiPSVsZiAlbGYgJWxmXG4iLAorICAgICAgICAgICAgICAgICAgIGlpci0+YmlxdWFkc1tjdXJyZW50X2JpcXVhZF0uYTAsCisgICAgICAgICAgICAgICAgICAgaWlyLT5iaXF1YWRzW2N1cnJlbnRfYmlxdWFkXS5hMSwKKyAgICAgICAgICAgICAgICAgICBpaXItPmJpcXVhZHNbY3VycmVudF9iaXF1YWRdLmEyLAorICAgICAgICAgICAgICAgICAgIGlpci0+YmlxdWFkc1tjdXJyZW50X2JpcXVhZF0uYjAsCisgICAgICAgICAgICAgICAgICAgaWlyLT5iaXF1YWRzW2N1cnJlbnRfYmlxdWFkXS5iMSwKKyAgICAgICAgICAgICAgICAgICBpaXItPmJpcXVhZHNbY3VycmVudF9iaXF1YWRdLmIyKTsKKworICAgICAgICAgICAgY3VycmVudF9iaXF1YWQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X3ByMnpwKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgY2hhbm5lbHMpCit7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBjaDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIElJUkNoYW5uZWwgKmlpciA9ICZzLT5paXJbY2hdOworICAgICAgICBpbnQgbjsKKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaWlyLT5uYl9hYlswXTsgbisrKSB7CisgICAgICAgICAgICBkb3VibGUgciA9IGlpci0+YWJbMF1bMipuXTsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IGlpci0+YWJbMF1bMipuKzFdOworCisgICAgICAgICAgICBpaXItPmFiWzBdWzIqbl0gICA9IHIgKiBjb3MoYW5nbGUpOworICAgICAgICAgICAgaWlyLT5hYlswXVsyKm4rMV0gPSByICogc2luKGFuZ2xlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBpaXItPm5iX2FiWzFdOyBuKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSByID0gaWlyLT5hYlsxXVsyKm5dOworICAgICAgICAgICAgZG91YmxlIGFuZ2xlID0gaWlyLT5hYlsxXVsyKm4rMV07CisKKyAgICAgICAgICAgIGlpci0+YWJbMV1bMipuXSAgID0gciAqIGNvcyhhbmdsZSk7CisgICAgICAgICAgICBpaXItPmFiWzFdWzIqbisxXSA9IHIgKiBzaW4oYW5nbGUpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0X3BkMnpwKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgY2hhbm5lbHMpCit7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBjaDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIElJUkNoYW5uZWwgKmlpciA9ICZzLT5paXJbY2hdOworICAgICAgICBpbnQgbjsKKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaWlyLT5uYl9hYlswXTsgbisrKSB7CisgICAgICAgICAgICBkb3VibGUgciA9IGlpci0+YWJbMF1bMipuXTsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IE1fUEkqaWlyLT5hYlswXVsyKm4rMV0vMTgwLjsKKworICAgICAgICAgICAgaWlyLT5hYlswXVsyKm5dICAgPSByICogY29zKGFuZ2xlKTsKKyAgICAgICAgICAgIGlpci0+YWJbMF1bMipuKzFdID0gciAqIHNpbihhbmdsZSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaWlyLT5uYl9hYlsxXTsgbisrKSB7CisgICAgICAgICAgICBkb3VibGUgciA9IGlpci0+YWJbMV1bMipuXTsKKyAgICAgICAgICAgIGRvdWJsZSBhbmdsZSA9IE1fUEkqaWlyLT5hYlsxXVsyKm4rMV0vMTgwLjsKKworICAgICAgICAgICAgaWlyLT5hYlsxXVsyKm5dICAgPSByICogY29zKGFuZ2xlKTsKKyAgICAgICAgICAgIGlpci0+YWJbMV1bMipuKzFdID0gciAqIHNpbihhbmdsZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgaW50IGNoLCByZXQsIGk7CisKKyAgICBzLT5jaGFubmVscyA9IGlubGluay0+Y2hhbm5lbHM7CisgICAgcy0+aWlyID0gYXZfY2FsbG9jKHMtPmNoYW5uZWxzLCBzaXplb2YoKnMtPmlpcikpOworICAgIGlmICghcy0+aWlyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gcmVhZF9nYWlucyhjdHgsIHMtPmdfc3RyLCBpbmxpbmstPmNoYW5uZWxzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IHJlYWRfY2hhbm5lbHMoY3R4LCBpbmxpbmstPmNoYW5uZWxzLCBzLT5hX3N0ciwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSByZWFkX2NoYW5uZWxzKGN0eCwgaW5saW5rLT5jaGFubmVscywgcy0+Yl9zdHIsIDEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHMtPmZvcm1hdCA9PSAyKSB7CisgICAgICAgIGNvbnZlcnRfcHIyenAoY3R4LCBpbmxpbmstPmNoYW5uZWxzKTsKKyAgICB9IGVsc2UgaWYgKHMtPmZvcm1hdCA9PSAzKSB7CisgICAgICAgIGNvbnZlcnRfcGQyenAoY3R4LCBpbmxpbmstPmNoYW5uZWxzKTsKKyAgICB9CisKKyAgICBpZiAocy0+Zm9ybWF0ID09IDApCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAidGYgY29lZmZpY2llbnRzIGZvcm1hdCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIHRvbyBoaWdoIG51bWJlciBvZiB6ZXJvcy9wb2xlcy5cbiIpOworCisgICAgaWYgKHMtPmZvcm1hdCA+IDAgJiYgcy0+cHJvY2VzcyA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRGlyZWN0IHByb2Nlc3NzaW5nIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgenAgY29lZmZpY2llbnRzIGZvcm1hdC5cbiIpOworCisgICAgICAgIHJldCA9IGNvbnZlcnRfenAydGYoY3R4LCBpbmxpbmstPmNoYW5uZWxzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSBpZiAocy0+Zm9ybWF0ID09IDAgJiYgcy0+cHJvY2VzcyA9PSAxKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlNlcmlhbCBjYXNjYWRpbmcgaXMgbm90IGltcGxlbWVudGVkIGZvciB0cmFuc2ZlciBmdW5jdGlvbi5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfSBlbHNlIGlmIChzLT5mb3JtYXQgPiAwICYmIHMtPnByb2Nlc3MgPT0gMSkgeworICAgICAgICBpZiAoaW5saW5rLT5mb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQKQorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJTZXJpYWwgY2FzY2FkaW5nIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgaTE2IHByZWNpc2lvbi5cbiIpOworCisgICAgICAgIHJldCA9IGRlY29tcG9zZV96cDJiaXF1YWRzKGN0eCwgaW5saW5rLT5jaGFubmVscyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBpbmxpbmstPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIElJUkNoYW5uZWwgKmlpciA9ICZzLT5paXJbY2hdOworCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBpaXItPm5iX2FiWzBdOyBpKyspIHsKKyAgICAgICAgICAgIGlpci0+YWJbMF1baV0gLz0gaWlyLT5hYlswXVswXTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpaXItPm5iX2FiWzFdOyBpKyspIHsKKyAgICAgICAgICAgIGlpci0+YWJbMV1baV0gKj0gaWlyLT5nIC8gaWlyLT5hYlswXVswXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMUDogcy0+aWlyX2NoYW5uZWwgPSBzLT5wcm9jZXNzID09IDEgPyBpaXJfY2hfc2VyaWFsX2RibHAgOiBpaXJfY2hfZGJscDsgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6IHMtPmlpcl9jaGFubmVsID0gcy0+cHJvY2VzcyA9PSAxID8gaWlyX2NoX3NlcmlhbF9mbHRwIDogaWlyX2NoX2ZsdHA7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzJQOiBzLT5paXJfY2hhbm5lbCA9IHMtPnByb2Nlc3MgPT0gMSA/IGlpcl9jaF9zZXJpYWxfczMycCA6IGlpcl9jaF9zMzJwOyBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDogcy0+aWlyX2NoYW5uZWwgPSBzLT5wcm9jZXNzID09IDEgPyBpaXJfY2hfc2VyaWFsX3MxNnAgOiBpaXJfY2hfczE2cDsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEF1ZGlvSUlSQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgVGhyZWFkRGF0YSB0ZDsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IGNoOworCisgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgeworICAgICAgICBvdXQgPSBpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICB9CisKKyAgICB0ZC5pbiAgPSBpbjsKKyAgICB0ZC5vdXQgPSBvdXQ7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHMtPmlpcl9jaGFubmVsLCAmdGQsIE5VTEwsIG91dGxpbmstPmNoYW5uZWxzKTsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IG91dGxpbmstPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGlmIChzLT5paXJbY2hdLmNsaXBwaW5ncyA+IDApCisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIkNoYW5uZWwgJWQgY2xpcHBpbmcgJWQgdGltZXMuIFBsZWFzZSByZWR1Y2UgZ2Fpbi5cbiIsCisgICAgICAgICAgICAgICAgICAgY2gsIHMtPmlpcltjaF0uY2xpcHBpbmdzKTsKKyAgICAgICAgcy0+aWlyW2NoXS5jbGlwcGluZ3MgPSAwOworICAgIH0KKworICAgIGlmIChpbiAhPSBvdXQpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKCFzLT5hX3N0ciB8fCAhcy0+Yl9zdHIgfHwgIXMtPmdfc3RyKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlZhbGlkIGNvZWZmaWNpZW50cyBhcmUgbWFuZGF0b3J5LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgc3dpdGNoIChzLT5wcmVjaXNpb24pIHsKKyAgICBjYXNlIDA6IHMtPnNhbXBsZV9mb3JtYXQgPSBBVl9TQU1QTEVfRk1UX0RCTFA7IGJyZWFrOworICAgIGNhc2UgMTogcy0+c2FtcGxlX2Zvcm1hdCA9IEFWX1NBTVBMRV9GTVRfRkxUUDsgYnJlYWs7CisgICAgY2FzZSAyOiBzLT5zYW1wbGVfZm9ybWF0ID0gQVZfU0FNUExFX0ZNVF9TMzJQOyBicmVhazsKKyAgICBjYXNlIDM6IHMtPnNhbXBsZV9mb3JtYXQgPSBBVl9TQU1QTEVfRk1UX1MxNlA7IGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXVkaW9JSVJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBjaDsKKworICAgIGlmIChzLT5paXIpIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIElJUkNoYW5uZWwgKmlpciA9ICZzLT5paXJbY2hdOworICAgICAgICAgICAgYXZfZnJlZXAoJmlpci0+YWJbMF0pOworICAgICAgICAgICAgYXZfZnJlZXAoJmlpci0+YWJbMV0pOworICAgICAgICAgICAgYXZfZnJlZXAoJmlpci0+Y2FjaGVbMF0pOworICAgICAgICAgICAgYXZfZnJlZXAoJmlpci0+Y2FjaGVbMV0pOworICAgICAgICAgICAgYXZfZnJlZXAoJmlpci0+YmlxdWFkcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPmlpcik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEF1ZGlvSUlSQ29udGV4dCwgeCkKKyNkZWZpbmUgQUYgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhaWlyX29wdGlvbnNbXSA9IHsKKyAgICB7ICJ6IiwgInNldCBCL251bWVyYXRvci96ZXJvcyBjb2VmZmljaWVudHMiLCAgIE9GRlNFVChiX3N0ciksICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjErMGkgMS0waSJ9LCAwLCAwLCBBRiB9LAorICAgIHsgInAiLCAic2V0IEEvZGVub21pbmF0b3IvcG9sZXMgY29lZmZpY2llbnRzIiwgT0ZGU0VUKGFfc3RyKSwgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMSswaSAxLTBpIn0sIDAsIDAsIEFGIH0sCisgICAgeyAiayIsICJzZXQgY2hhbm5lbHMgZ2FpbnMiLCAgICAgICAgICAgICAgICAgICBPRkZTRVQoZ19zdHIpLCAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIxfDEifSwgMCwgMCwgQUYgfSwKKyAgICB7ICJkcnkiLCAic2V0IGRyeSBnYWluIiwgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChkcnlfZ2FpbiksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MX0sICAgICAwLCAxLCBBRiB9LAorICAgIHsgIndldCIsICJzZXQgd2V0IGdhaW4iLCAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHdldF9nYWluKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgICAgIDAsIDEsIEFGIH0sCisgICAgeyAiZiIsICJzZXQgY29lZmZpY2llbnRzIGZvcm1hdCIsICAgICAgICAgICAgICBPRkZTRVQoZm9ybWF0KSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTF9LCAgICAgMCwgMywgQUYsICJmb3JtYXQiIH0sCisgICAgeyAidGYiLCAidHJhbnNmZXIgZnVuY3Rpb24iLCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTB9LCAgICAgMCwgMCwgQUYsICJmb3JtYXQiIH0sCisgICAgeyAienAiLCAiWi1wbGFuZSB6ZXJvcy9wb2xlcyIsICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTF9LCAgICAgMCwgMCwgQUYsICJmb3JtYXQiIH0sCisgICAgeyAicHIiLCAiWi1wbGFuZSB6ZXJvcy9wb2xlcyAocG9sYXIgcmFkaWFucykiLCAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTJ9LCAgICAgMCwgMCwgQUYsICJmb3JtYXQiIH0sCisgICAgeyAicGQiLCAiWi1wbGFuZSB6ZXJvcy9wb2xlcyAocG9sYXIgZGVncmVlcykiLCAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTN9LCAgICAgMCwgMCwgQUYsICJmb3JtYXQiIH0sCisgICAgeyAiciIsICJzZXQga2luZCBvZiBwcm9jZXNzaW5nIiwgICAgICAgICAgICAgICBPRkZTRVQocHJvY2VzcyksICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTF9LCAgICAgMCwgMSwgQUYsICJwcm9jZXNzIiB9LAorICAgIHsgImQiLCAiZGlyZWN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND0wfSwgICAgIDAsIDAsIEFGLCAicHJvY2VzcyIgfSwKKyAgICB7ICJzIiwgInNlcmlhbCBjYXNjYWRpbmciLCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9MX0sICAgICAwLCAwLCBBRiwgInByb2Nlc3MiIH0sCisgICAgeyAiZSIsICJzZXQgcHJlY2lzaW9uIiwgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocHJlY2lzaW9uKSxBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTB9LCAgICAgMCwgMywgQUYsICJwcmVjaXNpb24iIH0sCisgICAgeyAiZGJsIiwgImRvdWJsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQiLCAgICAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTB9LCAgICAgMCwgMCwgQUYsICJwcmVjaXNpb24iIH0sCisgICAgeyAiZmx0IiwgInNpbmdsZS1wcmVjaXNpb24gZmxvYXRpbmctcG9pbnQiLCAgICAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTF9LCAgICAgMCwgMCwgQUYsICJwcmVjaXNpb24iIH0sCisgICAgeyAiaTMyIiwgIjMyLWJpdCBpbnRlZ2VycyIsICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTJ9LCAgICAgMCwgMCwgQUYsICJwcmVjaXNpb24iIH0sCisgICAgeyAiaTE2IiwgIjE2LWJpdCBpbnRlZ2VycyIsICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTN9LCAgICAgMCwgMCwgQUYsICJwcmVjaXNpb24iIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYWlpcik7CisKK0FWRmlsdGVyIGZmX2FmX2FpaXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYWlpciIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgSW5maW5pdGUgSW1wdWxzZSBSZXNwb25zZSBmaWx0ZXIgd2l0aCBzdXBwbGllZCBjb2VmZmljaWVudHMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQXVkaW9JSVJDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZhaWlyX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FsaW1pdGVyLmMgYi9saWJhdmZpbHRlci9hZl9hbGltaXRlci5jCmluZGV4IDQ2MjExYTcuLmM0MWU5NTUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2FsaW1pdGVyLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYWxpbWl0ZXIuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgewogICAgICAgICBvdXQgPSBpbjsKICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKICAgICAgICAgaWYgKCFvdXQpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0zMjcsNiArMzI3LDExIEBACiAgICAgcy0+YnVmZmVyX3NpemUgPSBpbmxpbmstPnNhbXBsZV9yYXRlICogcy0+YXR0YWNrICogaW5saW5rLT5jaGFubmVsczsKICAgICBzLT5idWZmZXJfc2l6ZSAtPSBzLT5idWZmZXJfc2l6ZSAlIGlubGluay0+Y2hhbm5lbHM7CiAKKyAgICBpZiAocy0+YnVmZmVyX3NpemUgPD0gMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJBdHRhY2sgaXMgdG9vIHNtYWxsLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FtZXJnZS5jIGIvbGliYXZmaWx0ZXIvYWZfYW1lcmdlLmMKaW5kZXggMmI0ZWRiMC4uMDljNjYwZSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYW1lcmdlLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYW1lcmdlLmMKQEAgLTIzLDYgKzIzLDkgQEAKICAqIEF1ZGlvIG1lcmdpbmcgZmlsdGVyCiAgKi8KIAorI2RlZmluZSBGRl9JTlRFUk5BTF9GSUVMRFMgMQorI2luY2x1ZGUgImZyYW1lcXVldWUuaCIKKwogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKQEAgLTM0LDcgKzM3LDcgQEAKIAogI2RlZmluZSBTV1JfQ0hfTUFYIDY0CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IEFNZXJnZUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCBuYl9pbnB1dHM7CiAgICAgaW50IHJvdXRlW1NXUl9DSF9NQVhdOyAvKio8IGNoYW5uZWxzIHJvdXRpbmcsIHNlZSBjb3B5X3NhbXBsZXMgKi8KQEAgLTUyLDcgKzU1LDcgQEAKIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFtZXJnZV9vcHRpb25zW10gPSB7CiAgICAgeyAiaW5wdXRzIiwgInNwZWNpZnkgdGhlIG51bWJlciBvZiBpbnB1dHMiLCBPRkZTRVQobmJfaW5wdXRzKSwKLSAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMiB9LCAyLCBTV1JfQ0hfTUFYLCBGTEFHUyB9LAorICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAyIH0sIDEsIFNXUl9DSF9NQVgsIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTkzLDEwICs5NiwxNSBAQAogICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAwLCBpbmxheW91dFtpXSk7CiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlVzaW5nIFwiJXNcIiBmb3IgaW5wdXQgJWRcbiIsIGJ1ZiwgaSArIDEpOwogICAgICAgICB9Ci0gICAgICAgIHMtPmluW2ldLm5iX2NoID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGlubGF5b3V0W2ldKTsKLSAgICAgICAgaWYgKG91dGxheW91dCAmIGlubGF5b3V0W2ldKQorICAgICAgICBzLT5pbltpXS5uYl9jaCA9IEZGX0xBWU9VVDJDT1VOVChpbmxheW91dFtpXSk7CisgICAgICAgIGlmIChzLT5pbltpXS5uYl9jaCkgewogICAgICAgICAgICAgb3ZlcmxhcCsrOwotICAgICAgICBvdXRsYXlvdXQgfD0gaW5sYXlvdXRbaV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5pbltpXS5uYl9jaCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhpbmxheW91dFtpXSk7CisgICAgICAgICAgICBpZiAob3V0bGF5b3V0ICYgaW5sYXlvdXRbaV0pCisgICAgICAgICAgICAgICAgb3ZlcmxhcCsrOworICAgICAgICAgICAgb3V0bGF5b3V0IHw9IGlubGF5b3V0W2ldOworICAgICAgICB9CiAgICAgICAgIG5iX2NoICs9IHMtPmluW2ldLm5iX2NoOwogICAgIH0KICAgICBpZiAobmJfY2ggPiBTV1JfQ0hfTUFYKSB7CkBAIC0xODIsNyArMTkwLDkgQEAKICAgICBpbnQgaSwgcmV0OwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKQotICAgICAgICBpZiAoIXMtPmluW2ldLm5iX3NhbXBsZXMpCisgICAgICAgIGlmICghcy0+aW5baV0ubmJfc2FtcGxlcyB8fAorICAgICAgICAgICAgLyogZGV0ZWN0IEVPRiBpbW1lZGlhdGVseSAqLworICAgICAgICAgICAgKGN0eC0+aW5wdXRzW2ldLT5zdGF0dXNfaW4gJiYgIWN0eC0+aW5wdXRzW2ldLT5zdGF0dXNfb3V0KSkKICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1tpXSkpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIHJldHVybiAwOwpAQCAtMjcwLDcgKzI4MCw3IEBACiAKICAgICBvdXRidWYtPm5iX3NhbXBsZXMgICAgID0gbmJfc2FtcGxlczsKICAgICBvdXRidWYtPmNoYW5uZWxfbGF5b3V0ID0gb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQ7Ci0gICAgYXZfZnJhbWVfc2V0X2NoYW5uZWxzKG91dGJ1Ziwgb3V0bGluay0+Y2hhbm5lbHMpOworICAgIG91dGJ1Zi0+Y2hhbm5lbHMgICAgICAgPSBvdXRsaW5rLT5jaGFubmVsczsKIAogICAgIHdoaWxlIChuYl9zYW1wbGVzKSB7CiAgICAgICAgIG5zID0gbmJfc2FtcGxlczsKQEAgLTMxMiw3ICszMjIsNyBAQAogc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgQU1lcmdlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgcmV0OwogCiAgICAgcy0+aW4gPSBhdl9jYWxsb2Mocy0+bmJfaW5wdXRzLCBzaXplb2YoKnMtPmluKSk7CiAgICAgaWYgKCFzLT5pbikKQEAgLTMyNiw3ICszMzYsMTAgQEAKICAgICAgICAgfTsKICAgICAgICAgaWYgKCFuYW1lKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZmZfaW5zZXJ0X2lucGFkKGN0eCwgaSwgJnBhZCk7CisgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X2lucGFkKGN0eCwgaSwgJnBhZCkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnBhZC5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9hbWl4LmMgYi9saWJhdmZpbHRlci9hZl9hbWl4LmMKaW5kZXggZTY0ZTI4OS4uNDZmMWJmNiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYW1peC5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2FtaXguYwpAQCAtNDEsNiArNDEsNyBAQAogCiAjaW5jbHVkZSAiYXVkaW8uaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZpbHRlcnMuaCIKICNpbmNsdWRlICJmb3JtYXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtMTUxLDYgKzE1Miw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKy8qIEZJWE1FOiB1c2UgZGlyZWN0bHkgbGlua3MgZmlmbyAqLwogCiB0eXBlZGVmIHN0cnVjdCBNaXhDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgICAgICAgLyoqPCBjbGFzcyBmb3IgQVZPcHRpb25zICovCkBAIC0xNjAsNiArMTYyLDcgQEAKICAgICBpbnQgYWN0aXZlX2lucHV0czsgICAgICAgICAgLyoqPCBudW1iZXIgb2YgaW5wdXQgY3VycmVudGx5IGFjdGl2ZSAqLwogICAgIGludCBkdXJhdGlvbl9tb2RlOyAgICAgICAgICAvKio8IG1vZGUgZm9yIGRldGVybWluaW5nIGR1cmF0aW9uICovCiAgICAgZmxvYXQgZHJvcG91dF90cmFuc2l0aW9uOyAgIC8qKjwgdHJhbnNpdGlvbiB0aW1lIHdoZW4gYW4gaW5wdXQgZHJvcHMgb3V0ICovCisgICAgY2hhciAqd2VpZ2h0c19zdHI7ICAgICAgICAgIC8qKjwgc3RyaW5nIGZvciBjdXN0b20gd2VpZ2h0cyBmb3IgZXZlcnkgaW5wdXQgKi8KIAogICAgIGludCBuYl9jaGFubmVsczsgICAgICAgICAgICAvKio8IG51bWJlciBvZiBjaGFubmVscyAqLwogICAgIGludCBzYW1wbGVfcmF0ZTsgICAgICAgICAgICAvKio8IHNhbXBsZSByYXRlICovCkBAIC0xNjcsNyArMTcwLDkgQEAKICAgICBBVkF1ZGlvRmlmbyAqKmZpZm9zOyAgICAgICAgLyoqPCBhdWRpbyBmaWZvIGZvciBlYWNoIGlucHV0ICovCiAgICAgdWludDhfdCAqaW5wdXRfc3RhdGU7ICAgICAgIC8qKjwgY3VycmVudCBzdGF0ZSBvZiBlYWNoIGlucHV0ICovCiAgICAgZmxvYXQgKmlucHV0X3NjYWxlOyAgICAgICAgIC8qKjwgbWl4aW5nIHNjYWxlIGZhY3RvciBmb3IgZWFjaCBpbnB1dCAqLwotICAgIGZsb2F0IHNjYWxlX25vcm07ICAgICAgICAgICAvKio8IG5vcm1hbGl6YXRpb24gZmFjdG9yIGZvciBhbGwgaW5wdXRzICovCisgICAgZmxvYXQgKndlaWdodHM7ICAgICAgICAgICAgIC8qKjwgY3VzdG9tIHdlaWdodHMgZm9yIGV2ZXJ5IGlucHV0ICovCisgICAgZmxvYXQgd2VpZ2h0X3N1bTsgICAgICAgICAgIC8qKjwgc3VtIG9mIGN1c3RvbSB3ZWlnaHRzIGZvciBldmVyeSBpbnB1dCAqLworICAgIGZsb2F0ICpzY2FsZV9ub3JtOyAgICAgICAgICAvKio8IG5vcm1hbGl6YXRpb24gZmFjdG9yIGZvciBldmVyeSBpbnB1dCAqLwogICAgIGludDY0X3QgbmV4dF9wdHM7ICAgICAgICAgICAvKio8IGNhbGN1bGF0ZWQgcHRzIGZvciBuZXh0IG91dHB1dCBmcmFtZSAqLwogICAgIEZyYW1lTGlzdCAqZnJhbWVfbGlzdDsgICAgICAvKio8IGxpc3Qgb2YgZnJhbWUgaW5mbyBmb3IgdGhlIGZpcnN0IGlucHV0ICovCiB9IE1peENvbnRleHQ7CkBAIC0xNzcsMTUgKzE4MiwxNyBAQAogI2RlZmluZSBGIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFtaXhfb3B0aW9uc1tdID0gewogICAgIHsgImlucHV0cyIsICJOdW1iZXIgb2YgaW5wdXRzLiIsCi0gICAgICAgICAgICBPRkZTRVQobmJfaW5wdXRzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAyIH0sIDEsIDMyLCBBfEYgfSwKKyAgICAgICAgICAgIE9GRlNFVChuYl9pbnB1dHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDIgfSwgMSwgMTAyNCwgQXxGIH0sCiAgICAgeyAiZHVyYXRpb24iLCAiSG93IHRvIGRldGVybWluZSB0aGUgZW5kLW9mLXN0cmVhbS4iLAogICAgICAgICAgICAgT0ZGU0VUKGR1cmF0aW9uX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IERVUkFUSU9OX0xPTkdFU1QgfSwgMCwgIDIsIEF8RiwgImR1cmF0aW9uIiB9LAotICAgICAgICB7ICJsb25nZXN0IiwgICJEdXJhdGlvbiBvZiBsb25nZXN0IGlucHV0LiIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRFVSQVRJT05fTE9OR0VTVCAgfSwgSU5UX01JTiwgSU5UX01BWCwgQXxGLCAiZHVyYXRpb24iIH0sCi0gICAgICAgIHsgInNob3J0ZXN0IiwgIkR1cmF0aW9uIG9mIHNob3J0ZXN0IGlucHV0LiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBEVVJBVElPTl9TSE9SVEVTVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBfEYsICJkdXJhdGlvbiIgfSwKLSAgICAgICAgeyAiZmlyc3QiLCAgICAiRHVyYXRpb24gb2YgZmlyc3QgaW5wdXQuIiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IERVUkFUSU9OX0ZJUlNUICAgIH0sIElOVF9NSU4sIElOVF9NQVgsIEF8RiwgImR1cmF0aW9uIiB9LAorICAgICAgICB7ICJsb25nZXN0IiwgICJEdXJhdGlvbiBvZiBsb25nZXN0IGlucHV0LiIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRFVSQVRJT05fTE9OR0VTVCAgfSwgMCwgMCwgQXxGLCAiZHVyYXRpb24iIH0sCisgICAgICAgIHsgInNob3J0ZXN0IiwgIkR1cmF0aW9uIG9mIHNob3J0ZXN0IGlucHV0LiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBEVVJBVElPTl9TSE9SVEVTVCB9LCAwLCAwLCBBfEYsICJkdXJhdGlvbiIgfSwKKyAgICAgICAgeyAiZmlyc3QiLCAgICAiRHVyYXRpb24gb2YgZmlyc3QgaW5wdXQuIiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IERVUkFUSU9OX0ZJUlNUICAgIH0sIDAsIDAsIEF8RiwgImR1cmF0aW9uIiB9LAogICAgIHsgImRyb3BvdXRfdHJhbnNpdGlvbiIsICJUcmFuc2l0aW9uIHRpbWUsIGluIHNlY29uZHMsIGZvciB2b2x1bWUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW5vcm1hbGl6YXRpb24gd2hlbiBhbiBpbnB1dCBzdHJlYW0gZW5kcy4iLAogICAgICAgICAgICAgT0ZGU0VUKGRyb3BvdXRfdHJhbnNpdGlvbiksIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSAyLjAgfSwgMCwgSU5UX01BWCwgQXxGIH0sCisgICAgeyAid2VpZ2h0cyIsICJTZXQgd2VpZ2h0IGZvciBlYWNoIGlucHV0LiIsCisgICAgICAgICAgICBPRkZTRVQod2VpZ2h0c19zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIxIDEifSwgMCwgMCwgQXxGIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTIwMCwxNiArMjA3LDI2IEBACiAgKi8KIHN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9zY2FsZXMoTWl4Q29udGV4dCAqcywgaW50IG5iX3NhbXBsZXMpCiB7CisgICAgZmxvYXQgd2VpZ2h0X3N1bSA9IDAuZjsKICAgICBpbnQgaTsKIAotICAgIGlmIChzLT5zY2FsZV9ub3JtID4gcy0+YWN0aXZlX2lucHV0cykgewotICAgICAgICBzLT5zY2FsZV9ub3JtIC09IG5iX3NhbXBsZXMgLyAocy0+ZHJvcG91dF90cmFuc2l0aW9uICogcy0+c2FtcGxlX3JhdGUpOwotICAgICAgICBzLT5zY2FsZV9ub3JtID0gRkZNQVgocy0+c2NhbGVfbm9ybSwgcy0+YWN0aXZlX2lucHV0cyk7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKQorICAgICAgICBpZiAocy0+aW5wdXRfc3RhdGVbaV0gJiBJTlBVVF9PTikKKyAgICAgICAgICAgIHdlaWdodF9zdW0gKz0gcy0+d2VpZ2h0c1tpXTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpZiAocy0+aW5wdXRfc3RhdGVbaV0gJiBJTlBVVF9PTikgeworICAgICAgICAgICAgaWYgKHMtPnNjYWxlX25vcm1baV0gPiB3ZWlnaHRfc3VtIC8gcy0+d2VpZ2h0c1tpXSkgeworICAgICAgICAgICAgICAgIHMtPnNjYWxlX25vcm1baV0gLT0gKChzLT53ZWlnaHRfc3VtIC8gcy0+d2VpZ2h0c1tpXSkgLyBzLT5uYl9pbnB1dHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3NhbXBsZXMgLyAocy0+ZHJvcG91dF90cmFuc2l0aW9uICogcy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIHMtPnNjYWxlX25vcm1baV0gPSBGRk1BWChzLT5zY2FsZV9ub3JtW2ldLCB3ZWlnaHRfc3VtIC8gcy0+d2VpZ2h0c1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKICAgICAgICAgaWYgKHMtPmlucHV0X3N0YXRlW2ldICYgSU5QVVRfT04pCi0gICAgICAgICAgICBzLT5pbnB1dF9zY2FsZVtpXSA9IDEuMGYgLyBzLT5zY2FsZV9ub3JtOworICAgICAgICAgICAgcy0+aW5wdXRfc2NhbGVbaV0gPSAxLjBmIC8gcy0+c2NhbGVfbm9ybVtpXTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcy0+aW5wdXRfc2NhbGVbaV0gPSAwLjBmOwogICAgIH0KQEAgLTIzNSw3ICsyNTIsNyBAQAogICAgIGlmICghcy0+Zmlmb3MpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzLT5uYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXRsaW5rLT5jaGFubmVsX2xheW91dCk7CisgICAgcy0+bmJfY2hhbm5lbHMgPSBvdXRsaW5rLT5jaGFubmVsczsKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKICAgICAgICAgcy0+Zmlmb3NbaV0gPSBhdl9hdWRpb19maWZvX2FsbG9jKG91dGxpbmstPmZvcm1hdCwgcy0+bmJfY2hhbm5lbHMsIDEwMjQpOwogICAgICAgICBpZiAoIXMtPmZpZm9zW2ldKQpAQCAtMjQ5LDkgKzI2NiwxMSBAQAogICAgIHMtPmFjdGl2ZV9pbnB1dHMgPSBzLT5uYl9pbnB1dHM7CiAKICAgICBzLT5pbnB1dF9zY2FsZSA9IGF2X21hbGxvY3pfYXJyYXkocy0+bmJfaW5wdXRzLCBzaXplb2YoKnMtPmlucHV0X3NjYWxlKSk7Ci0gICAgaWYgKCFzLT5pbnB1dF9zY2FsZSkKKyAgICBzLT5zY2FsZV9ub3JtICA9IGF2X21hbGxvY3pfYXJyYXkocy0+bmJfaW5wdXRzLCBzaXplb2YoKnMtPnNjYWxlX25vcm0pKTsKKyAgICBpZiAoIXMtPmlucHV0X3NjYWxlIHx8ICFzLT5zY2FsZV9ub3JtKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHMtPnNjYWxlX25vcm0gPSBzLT5hY3RpdmVfaW5wdXRzOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykKKyAgICAgICAgcy0+c2NhbGVfbm9ybVtpXSA9IHMtPndlaWdodF9zdW0gLyBzLT53ZWlnaHRzW2ldOwogICAgIGNhbGN1bGF0ZV9zY2FsZXMocywgMCk7CiAKICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCBvdXRsaW5rLT5jaGFubmVsX2xheW91dCk7CkBAIC0yNjMsOCArMjgyLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjYWxjX2FjdGl2ZV9pbnB1dHMoTWl4Q29udGV4dCAqcyk7Ci0KIC8qKgogICogUmVhZCBzYW1wbGVzIGZyb20gdGhlIGlucHV0IEZJRk9zLCBtaXgsIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IGxpbmsuCiAgKi8KQEAgLTI3MywxMSArMjkwLDcgQEAKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKICAgICBNaXhDb250ZXh0ICAgICAgKnMgPSBjdHgtPnByaXY7CiAgICAgQVZGcmFtZSAqb3V0X2J1ZiwgKmluX2J1ZjsKLSAgICBpbnQgbmJfc2FtcGxlcywgbnMsIHJldCwgaTsKLQotICAgIHJldCA9IGNhbGNfYWN0aXZlX2lucHV0cyhzKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpbnQgbmJfc2FtcGxlcywgbnMsIGk7CiAKICAgICBpZiAocy0+aW5wdXRfc3RhdGVbMF0gJiBJTlBVVF9PTikgewogICAgICAgICAvKiBmaXJzdCBpbnB1dCBsaXZlOiB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgZnJhbWUgc2l6ZSAqLwpAQCAtMzAzLDggKzMxNiwxMCBAQAogICAgICAgICAgICAgICAgIG5iX3NhbXBsZXMgPSBGRk1JTihuYl9zYW1wbGVzLCBucyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG5iX3NhbXBsZXMgPT0gSU5UX01BWCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICAgICAgaWYgKG5iX3NhbXBsZXMgPT0gSU5UX01BWCkgeworICAgICAgICAgICAgZmZfb3V0bGlua19zZXRfc3RhdHVzKG91dGxpbmssIEFWRVJST1JfRU9GLCBzLT5uZXh0X3B0cyk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHMtPm5leHRfcHRzID0gZnJhbWVfbGlzdF9uZXh0X3B0cyhzLT5mcmFtZV9saXN0KTsKQEAgLTMxMiw2ICszMjcsOSBAQAogCiAgICAgY2FsY3VsYXRlX3NjYWxlcyhzLCBuYl9zYW1wbGVzKTsKIAorICAgIGlmIChuYl9zYW1wbGVzID09IDApCisgICAgICAgIHJldHVybiAwOworCiAgICAgb3V0X2J1ZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7CiAgICAgaWYgKCFvdXRfYnVmKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpAQCAtMzMzLDEwICszNTEsMTkgQEAKICAgICAgICAgICAgIHBsYW5lX3NpemUgPSBuYl9zYW1wbGVzICogKHMtPnBsYW5hciA/IDEgOiBzLT5uYl9jaGFubmVscyk7CiAgICAgICAgICAgICBwbGFuZV9zaXplID0gRkZBTElHTihwbGFuZV9zaXplLCAxNik7CiAKLSAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBwbGFuZXM7IHArKykgewotICAgICAgICAgICAgICAgIHMtPmZkc3AtPnZlY3Rvcl9mbWFjX3NjYWxhcigoZmxvYXQgKilvdXRfYnVmLT5leHRlbmRlZF9kYXRhW3BdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBpbl9idWYtPmV4dGVuZGVkX2RhdGFbcF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfc2NhbGVbaV0sIHBsYW5lX3NpemUpOworICAgICAgICAgICAgaWYgKG91dF9idWYtPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVCB8fAorICAgICAgICAgICAgICAgIG91dF9idWYtPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX0ZMVFApIHsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcGxhbmVzOyBwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyKChmbG9hdCAqKW91dF9idWYtPmV4dGVuZGVkX2RhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgaW5fYnVmLT5leHRlbmRlZF9kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfc2NhbGVbaV0sIHBsYW5lX3NpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHBsYW5lczsgcCsrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmZkc3AtPnZlY3Rvcl9kbWFjX3NjYWxhcigoZG91YmxlICopb3V0X2J1Zi0+ZXh0ZW5kZWRfZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUgKikgaW5fYnVmLT5leHRlbmRlZF9kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfc2NhbGVbaV0sIHBsYW5lX3NpemUpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTM1NSwyNSArMzgyLDE3IEBACiBzdGF0aWMgaW50IHJlcXVlc3Rfc2FtcGxlcyhBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IG1pbl9zYW1wbGVzKQogewogICAgIE1peENvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgaW50IGksIHJldDsKKyAgICBpbnQgaTsKIAogICAgIGF2X2Fzc2VydDAocy0+bmJfaW5wdXRzID4gMSk7CiAKICAgICBmb3IgKGkgPSAxOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKLSAgICAgICAgcmV0ID0gMDsKLSAgICAgICAgaWYgKCEocy0+aW5wdXRfc3RhdGVbaV0gJiBJTlBVVF9PTikpCisgICAgICAgIGlmICghKHMtPmlucHV0X3N0YXRlW2ldICYgSU5QVVRfT04pIHx8CisgICAgICAgICAgICAgKHMtPmlucHV0X3N0YXRlW2ldICYgSU5QVVRfRU9GKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBpZiAoYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm9zW2ldKSA+PSBtaW5fc2FtcGxlcykKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW2ldKTsKLSAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgewotICAgICAgICAgICAgcy0+aW5wdXRfc3RhdGVbaV0gfD0gSU5QVVRfRU9GOwotICAgICAgICAgICAgaWYgKGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvc1tpXSkgPT0gMCkgewotICAgICAgICAgICAgICAgIHMtPmlucHV0X3N0YXRlW2ldID0gMDsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbaV0pOwogICAgIH0KICAgICByZXR1cm4gb3V0cHV0X2ZyYW1lKGN0eC0+b3V0cHV0c1swXSk7CiB9CkBAIC0zOTksOTYgKzQxOCwxMzQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3N0YXRpYyBpbnQgYWN0aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7Ci0gICAgTWl4Q29udGV4dCAgICAgICpzID0gY3R4LT5wcml2OwotICAgIGludCByZXQ7Ci0gICAgaW50IHdhbnRlZF9zYW1wbGVzOwotCi0gICAgcmV0ID0gY2FsY19hY3RpdmVfaW5wdXRzKHMpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgaWYgKCEocy0+aW5wdXRfc3RhdGVbMF0gJiBJTlBVVF9PTikpCi0gICAgICAgIHJldHVybiByZXF1ZXN0X3NhbXBsZXMoY3R4LCAxKTsKLQotICAgIGlmIChzLT5mcmFtZV9saXN0LT5uYl9mcmFtZXMgPT0gMCkgewotICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKLSAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgewotICAgICAgICAgICAgcy0+aW5wdXRfc3RhdGVbMF0gPSAwOwotICAgICAgICAgICAgaWYgKHMtPm5iX2lucHV0cyA9PSAxKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKLSAgICAgICAgICAgIHJldHVybiBvdXRwdXRfZnJhbWUoY3R4LT5vdXRwdXRzWzBdKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBhdl9hc3NlcnQwKHMtPmZyYW1lX2xpc3QtPm5iX2ZyYW1lcyA+IDApOwotCi0gICAgd2FudGVkX3NhbXBsZXMgPSBmcmFtZV9saXN0X25leHRfZnJhbWVfc2l6ZShzLT5mcmFtZV9saXN0KTsKLQotICAgIHJldHVybiByZXF1ZXN0X3NhbXBsZXMoY3R4LCB3YW50ZWRfc2FtcGxlcyk7Ci19Ci0KLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCi17Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICAqY3R4ID0gaW5saW5rLT5kc3Q7Ci0gICAgTWl4Q29udGV4dCAgICAgICAqcyA9IGN0eC0+cHJpdjsKICAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07Ci0gICAgaW50IGksIHJldCA9IDA7CisgICAgTWl4Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpidWYgPSBOVUxMOworICAgIGludCBpLCByZXQ7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykKLSAgICAgICAgaWYgKGN0eC0+aW5wdXRzW2ldID09IGlubGluaykKLSAgICAgICAgICAgIGJyZWFrOwotICAgIGlmIChpID49IGN0eC0+bmJfaW5wdXRzKSB7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgInVua25vd24gaW5wdXQgbGlua1xuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBmYWlsOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzW2ldOworCisgICAgICAgIGlmICgocmV0ID0gZmZfaW5saW5rX2NvbnN1bWVfZnJhbWUoY3R4LT5pbnB1dHNbaV0sICZidWYpKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cyA9IGF2X3Jlc2NhbGVfcShidWYtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICByZXQgPSBmcmFtZV9saXN0X2FkZF9mcmFtZShzLT5mcmFtZV9saXN0LCBidWYtPm5iX3NhbXBsZXMsIHB0cyk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldCA9IGF2X2F1ZGlvX2ZpZm9fd3JpdGUocy0+Zmlmb3NbaV0sICh2b2lkICoqKWJ1Zi0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYpOworCisgICAgICAgICAgICByZXQgPSBvdXRwdXRfZnJhbWUob3V0bGluayk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGkgPT0gMCkgewotICAgICAgICBpbnQ2NF90IHB0cyA9IGF2X3Jlc2NhbGVfcShidWYtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSk7Ci0gICAgICAgIHJldCA9IGZyYW1lX2xpc3RfYWRkX2ZyYW1lKHMtPmZyYW1lX2xpc3QsIGJ1Zi0+bmJfc2FtcGxlcywgcHRzKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGludDY0X3QgcHRzOworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIGlmIChmZl9pbmxpbmtfYWNrbm93bGVkZ2Vfc3RhdHVzKGN0eC0+aW5wdXRzW2ldLCAmc3RhdHVzLCAmcHRzKSkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfc3RhdGVbaV0gPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+bmJfaW5wdXRzID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZmX291dGxpbmtfc2V0X3N0YXR1cyhvdXRsaW5rLCBzdGF0dXMsIHB0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmlucHV0X3N0YXRlW2ldIHw9IElOUFVUX0VPRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvc1tpXSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5wdXRfc3RhdGVbaV0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0ID0gYXZfYXVkaW9fZmlmb193cml0ZShzLT5maWZvc1tpXSwgKHZvaWQgKiopYnVmLT5leHRlbmRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5uYl9zYW1wbGVzKTsKKyAgICBpZiAoY2FsY19hY3RpdmVfaW5wdXRzKHMpKSB7CisgICAgICAgIGZmX291dGxpbmtfc2V0X3N0YXR1cyhvdXRsaW5rLCBBVkVSUk9SX0VPRiwgcy0+bmV4dF9wdHMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKLSAgICBhdl9mcmFtZV9mcmVlKCZidWYpOwotICAgIHJldHVybiBvdXRwdXRfZnJhbWUob3V0bGluayk7CisgICAgaWYgKGZmX291dGxpbmtfZnJhbWVfd2FudGVkKG91dGxpbmspKSB7CisgICAgICAgIGludCB3YW50ZWRfc2FtcGxlczsKIAotZmFpbDoKLSAgICBhdl9mcmFtZV9mcmVlKCZidWYpOworICAgICAgICBpZiAoIShzLT5pbnB1dF9zdGF0ZVswXSAmIElOUFVUX09OKSkKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0X3NhbXBsZXMoY3R4LCAxKTsKIAotICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmIChzLT5mcmFtZV9saXN0LT5uYl9mcmFtZXMgPT0gMCkgeworICAgICAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYXZfYXNzZXJ0MChzLT5mcmFtZV9saXN0LT5uYl9mcmFtZXMgPiAwKTsKKworICAgICAgICB3YW50ZWRfc2FtcGxlcyA9IGZyYW1lX2xpc3RfbmV4dF9mcmFtZV9zaXplKHMtPmZyYW1lX2xpc3QpOworCisgICAgICAgIHJldHVybiByZXF1ZXN0X3NhbXBsZXMoY3R4LCB3YW50ZWRfc2FtcGxlcyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewogICAgIE1peENvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgaW50IGk7CisgICAgY2hhciAqcCwgKmFyZywgKnNhdmVwdHIgPSBOVUxMOworICAgIGZsb2F0IGxhc3Rfd2VpZ2h0ID0gMS5mOworICAgIGludCBpLCByZXQ7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKLSAgICAgICAgY2hhciBuYW1lWzMyXTsKICAgICAgICAgQVZGaWx0ZXJQYWQgcGFkID0geyAwIH07CiAKLSAgICAgICAgc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiaW5wdXQlZCIsIGkpOwogICAgICAgICBwYWQudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIHBhZC5uYW1lICAgICAgICAgICA9IGF2X3N0cmR1cChuYW1lKTsKKyAgICAgICAgcGFkLm5hbWUgICAgICAgICAgID0gYXZfYXNwcmludGYoImlucHV0JWQiLCBpKTsKICAgICAgICAgaWYgKCFwYWQubmFtZSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIHBhZC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZTsKIAotICAgICAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmcGFkKTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmcGFkKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHMtPmZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKDApOwogICAgIGlmICghcy0+ZmRzcCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAorICAgIHMtPndlaWdodHMgPSBhdl9tYWxsb2N6X2FycmF5KHMtPm5iX2lucHV0cywgc2l6ZW9mKCpzLT53ZWlnaHRzKSk7CisgICAgaWYgKCFzLT53ZWlnaHRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcCA9IHMtPndlaWdodHNfc3RyOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpZiAoIShhcmcgPSBhdl9zdHJ0b2socCwgIiAiLCAmc2F2ZXB0cikpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgcCA9IE5VTEw7CisgICAgICAgIHNzY2FuZihhcmcsICIlZiIsICZsYXN0X3dlaWdodCk7CisgICAgICAgIHMtPndlaWdodHNbaV0gPSBsYXN0X3dlaWdodDsKKyAgICAgICAgcy0+d2VpZ2h0X3N1bSArPSBsYXN0X3dlaWdodDsKKyAgICB9CisKKyAgICBmb3IgKDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIHMtPndlaWdodHNbaV0gPSBsYXN0X3dlaWdodDsKKyAgICAgICAgcy0+d2VpZ2h0X3N1bSArPSBsYXN0X3dlaWdodDsKKyAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNTA2LDYgKzU2Myw4IEBACiAgICAgYXZfZnJlZXAoJnMtPmZyYW1lX2xpc3QpOwogICAgIGF2X2ZyZWVwKCZzLT5pbnB1dF9zdGF0ZSk7CiAgICAgYXZfZnJlZXAoJnMtPmlucHV0X3NjYWxlKTsKKyAgICBhdl9mcmVlcCgmcy0+c2NhbGVfbm9ybSk7CisgICAgYXZfZnJlZXAoJnMtPndlaWdodHMpOwogICAgIGF2X2ZyZWVwKCZzLT5mZHNwKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKQpAQCAtNTE4LDcgKzU3Nyw3IEBACiAgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKICAgICBpbnQgcmV0OwogCi0gICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfY291bnRzKCk7CiAgICAgaWYgKCFsYXlvdXRzKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgZ290byBmYWlsOwpAQCAtNTI2LDYgKzU4NSw4IEBACiAKICAgICBpZiAoKHJldCA9IGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIEFWX1NBTVBMRV9GTVRfRkxUICkpICAgICAgICAgIDwgMCB8fAogICAgICAgICAocmV0ID0gZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgQVZfU0FNUExFX0ZNVF9GTFRQKSkgICAgICAgICAgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9hZGRfZm9ybWF0KCZmb3JtYXRzLCBBVl9TQU1QTEVfRk1UX0RCTCApKSAgICAgICAgICA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIEFWX1NBTVBMRV9GTVRfREJMUCkpICAgICAgICAgIDwgMCB8fAogICAgICAgICAocmV0ID0gZmZfc2V0X2NvbW1vbl9mb3JtYXRzICAgICAgICAoY3R4LCBmb3JtYXRzKSkgICAgICAgICAgPCAwIHx8CiAgICAgICAgIChyZXQgPSBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpKSAgICAgICAgICA8IDAgfHwKICAgICAgICAgKHJldCA9IGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmZl9hbGxfc2FtcGxlcmF0ZXMoKSkpIDwgMCkKQEAgLTU0Myw3ICs2MDQsNiBAQAogICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKICAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKLSAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTU1NSw2ICs2MTUsNyBAQAogICAgIC5wcml2X2NsYXNzICAgICA9ICZhbWl4X2NsYXNzLAogICAgIC5pbml0ICAgICAgICAgICA9IGluaXQsCiAgICAgLnVuaW5pdCAgICAgICAgID0gdW5pbml0LAorICAgIC5hY3RpdmF0ZSAgICAgICA9IGFjdGl2YXRlLAogICAgIC5xdWVyeV9mb3JtYXRzICA9IHF1ZXJ5X2Zvcm1hdHMsCiAgICAgLmlucHV0cyAgICAgICAgID0gTlVMTCwKICAgICAub3V0cHV0cyAgICAgICAgPSBhdmZpbHRlcl9hZl9hbWl4X291dHB1dHMsCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9hbmVxdWFsaXplci5jIGIvbGliYXZmaWx0ZXIvYWZfYW5lcXVhbGl6ZXIuYwppbmRleCBhMzQ0Yzc3Li4yNDAzNDYwIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9hbmVxdWFsaXplci5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2FuZXF1YWxpemVyLmMKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmZtYXRoLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FudWxsLmMgYi9saWJhdmZpbHRlci9hZl9hbnVsbC5jCmluZGV4IGZmZjQ1NmUuLjFkMGFmNDUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2FudWxsLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYW51bGwuYwpAQCAtNDYsNyArNDYsNiBAQAogQVZGaWx0ZXIgZmZfYWZfYW51bGwgPSB7CiAgICAgLm5hbWUgICAgICAgICAgPSAiYW51bGwiLAogICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlBhc3MgdGhlIHNvdXJjZSB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dC4iKSwKLSAgICAucXVlcnlfZm9ybWF0cyA9IGZmX3F1ZXJ5X2Zvcm1hdHNfYWxsLAogICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfYWZfYW51bGxfaW5wdXRzLAogICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfYWZfYW51bGxfb3V0cHV0cywKIH07CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9hcGFkLmMgYi9saWJhdmZpbHRlci9hZl9hcGFkLmMKaW5kZXggMGEyZDQyMC4uZjdhNDE5OSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYXBhZC5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2FwYWQuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgImF1ZGlvLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQVBhZENvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludDY0X3QgbmV4dF9wdHM7CiAKQEAgLTExOSw3ICsxMTksNyBAQAogCiAgICAgICAgIGF2X3NhbXBsZXNfc2V0X3NpbGVuY2Uob3V0c2FtcGxlc3JlZi0+ZXh0ZW5kZWRfZGF0YSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmFtZV9nZXRfY2hhbm5lbHMob3V0c2FtcGxlc3JlZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0c2FtcGxlc3JlZi0+Y2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0c2FtcGxlc3JlZi0+Zm9ybWF0KTsKIAogICAgICAgICBvdXRzYW1wbGVzcmVmLT5wdHMgPSBzLT5uZXh0X3B0czsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FwaGFzZXIuYyBiL2xpYmF2ZmlsdGVyL2FmX2FwaGFzZXIuYwppbmRleCAzM2VjYjFhLi5iZjQ2Y2M4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9hcGhhc2VyLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYXBoYXNlci5jCkBAIC0yNDcsMTQgKzI0NywxNiBAQAogICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbmJ1ZikpIHsKICAgICAgICAgb3V0YnVmID0gaW5idWY7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0YnVmID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIGluYnVmLT5uYl9zYW1wbGVzKTsKLSAgICAgICAgaWYgKCFvdXRidWYpCisgICAgICAgIG91dGJ1ZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgaW5idWYtPm5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dGJ1ZikgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5idWYpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQogICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dGJ1ZiwgaW5idWYpOwogICAgIH0KIAogICAgIHMtPnBoYXNlcihzLCBpbmJ1Zi0+ZXh0ZW5kZWRfZGF0YSwgb3V0YnVmLT5leHRlbmRlZF9kYXRhLAotICAgICAgICAgICAgICBvdXRidWYtPm5iX3NhbXBsZXMsIGF2X2ZyYW1lX2dldF9jaGFubmVscyhvdXRidWYpKTsKKyAgICAgICAgICAgICAgb3V0YnVmLT5uYl9zYW1wbGVzLCBvdXRidWYtPmNoYW5uZWxzKTsKIAogICAgIGlmIChpbmJ1ZiAhPSBvdXRidWYpCiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluYnVmKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FwdWxzYXRvci5jIGIvbGliYXZmaWx0ZXIvYWZfYXB1bHNhdG9yLmMKaW5kZXggODAyYjhkMC4uNjc3MTFhMiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYXB1bHNhdG9yLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYXB1bHNhdG9yLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICBkb3VibGUgb2Zmc2V0X3I7CiAgICAgZG91YmxlIHB3aWR0aDsKICAgICBkb3VibGUgYnBtOwotICAgIGRvdWJsZSBoejsKKyAgICBkb3VibGUgaGVydHo7CiAgICAgaW50IG1zOwogICAgIGludCB0aW1pbmc7CiAKQEAgLTc2LDcgKzc2LDcgQEAKICAgICB7ICAgImh6IiwgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9VU5JVF9IWn0sICAgMCwgICAgICAgICAgMCwgRkxBR1MsICJ0aW1pbmciIH0sCiAgICAgeyAiYnBtIiwgICAgICAgICAgICAgICAic2V0IEJQTSIsIE9GRlNFVChicG0pLCAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTEyMH0sICAgIDMwLCAgICAgICAgICAzMDAsIEZMQUdTIH0sCiAgICAgeyAibXMiLCAgICAgICAgICAgICAgICAgInNldCBtcyIsIE9GRlNFVChtcyksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTUwMH0sICAgIDEwLCAgICAgICAgIDIwMDAsIEZMQUdTIH0sCi0gICAgeyAiaHoiLCAgICAgICAgICAic2V0IGZyZXF1ZW5jeSIsIE9GRlNFVChoeiksICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTJ9LCAgICAwLjAxLCAgICAgICAgICAxMDAsIEZMQUdTIH0sCisgICAgeyAiaHoiLCAgICAgICAgICAic2V0IGZyZXF1ZW5jeSIsIE9GRlNFVChoZXJ0eiksICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTJ9LCAgICAwLjAxLCAgICAgICAgICAxMDAsIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTIwOCw3ICsyMDgsNyBAQAogICAgIHN3aXRjaCAocy0+dGltaW5nKSB7CiAgICAgY2FzZSBVTklUX0JQTTogIGZyZXEgPSBzLT5icG0gLyA2MDsgICAgICAgICBicmVhazsKICAgICBjYXNlIFVOSVRfTVM6ICAgZnJlcSA9IDEgLyAocy0+bXMgLyAxMDAwLik7IGJyZWFrOwotICAgIGNhc2UgVU5JVF9IWjogICBmcmVxID0gcy0+aHo7ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBVTklUX0haOiAgIGZyZXEgPSBzLT5oZXJ0ejsgICAgICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfYXJlc2FtcGxlLmMgYi9saWJhdmZpbHRlci9hZl9hcmVzYW1wbGUuYwppbmRleCAwMjhlMTA1Li5lZjEwNjIxIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9hcmVzYW1wbGUuYworKysgYi9saWJhdmZpbHRlci9hZl9hcmVzYW1wbGUuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgImF1ZGlvLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQVJlc2FtcGxlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IHNhbXBsZV9yYXRlX2FyZzsKICAgICBkb3VibGUgcmF0aW87CkBAIC0xOTUsMTIgKzE5NSwxNCBAQAogCiAgICAgb3V0c2FtcGxlc3JlZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbl9vdXQpOwogCi0gICAgaWYoIW91dHNhbXBsZXNyZWYpCisgICAgaWYoIW91dHNhbXBsZXNyZWYpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzcmVmKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CiAKICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHNhbXBsZXNyZWYsIGluc2FtcGxlc3JlZik7CiAgICAgb3V0c2FtcGxlc3JlZi0+Zm9ybWF0ICAgICAgICAgICAgICAgID0gb3V0bGluay0+Zm9ybWF0OwotICAgIGF2X2ZyYW1lX3NldF9jaGFubmVscyhvdXRzYW1wbGVzcmVmLCBvdXRsaW5rLT5jaGFubmVscyk7CisgICAgb3V0c2FtcGxlc3JlZi0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gb3V0bGluay0+Y2hhbm5lbHM7CiAgICAgb3V0c2FtcGxlc3JlZi0+Y2hhbm5lbF9sYXlvdXQgICAgICAgID0gb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQ7CiAgICAgb3V0c2FtcGxlc3JlZi0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gb3V0bGluay0+c2FtcGxlX3JhdGU7CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FzZXRuc2FtcGxlcy5jIGIvbGliYXZmaWx0ZXIvYWZfYXNldG5zYW1wbGVzLmMKaW5kZXggYjVhYTE5My4uZWNiNzZlNiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYXNldG5zYW1wbGVzLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYXNldG5zYW1wbGVzLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQVNOU0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCBuYl9vdXRfc2FtcGxlczsgIC8vLzwgaG93IG1hbnkgc2FtcGxlcyB0byBvdXRwdXQKICAgICBBVkF1ZGlvRmlmbyAqZmlmbzsgICAvLy88IHNhbXBsZXMgYXJlIHF1ZXVlZCBoZXJlCkBAIC0xNDAsMTEgKzE0MCwxNCBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfQotICAgIGF2X2F1ZGlvX2ZpZm9fd3JpdGUoYXNucy0+ZmlmbywgKHZvaWQgKiopaW5zYW1wbGVzLT5leHRlbmRlZF9kYXRhLCBuYl9zYW1wbGVzKTsKLSAgICBpZiAoYXNucy0+bmV4dF9vdXRfcHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgIHJldCA9IGF2X2F1ZGlvX2ZpZm9fd3JpdGUoYXNucy0+ZmlmbywgKHZvaWQgKiopaW5zYW1wbGVzLT5leHRlbmRlZF9kYXRhLCBuYl9zYW1wbGVzKTsKKyAgICBpZiAocmV0ID4gMCAmJiBhc25zLT5uZXh0X291dF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCiAgICAgICAgIGFzbnMtPm5leHRfb3V0X3B0cyA9IGluc2FtcGxlcy0+cHRzOwogICAgIGF2X2ZyYW1lX2ZyZWUoJmluc2FtcGxlcyk7CiAKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKwogICAgIHdoaWxlIChhdl9hdWRpb19maWZvX3NpemUoYXNucy0+ZmlmbykgPj0gYXNucy0+bmJfb3V0X3NhbXBsZXMpCiAgICAgICAgIHB1c2hfc2FtcGxlcyhvdXRsaW5rKTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2FzZXRyYXRlLmMgYi9saWJhdmZpbHRlci9hZl9hc2V0cmF0ZS5jCmluZGV4IDY2ZmViZDcuLjUwYTVmNDMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2FzZXRyYXRlLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYXNldHJhdGUuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQVNldFJhdGVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgc2FtcGxlX3JhdGU7CiAgICAgaW50IHJlc2NhbGVfcHRzOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfYXNob3dpbmZvLmMgYi9saWJhdmZpbHRlci9hZl9hc2hvd2luZm8uYwppbmRleCBjYTMzYWRkLi45MDQ2ZThkIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9hc2hvd2luZm8uYworKysgYi9saWJhdmZpbHRlci9hZl9hc2hvd2luZm8uYwpAQCAtMTk5LDE3ICsxOTksMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVfY2hlY2tzdW1zWzBdOwogICAgIH0KIAotICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoY2hsYXlvdXRfc3RyLCBzaXplb2YoY2hsYXlvdXRfc3RyKSwgLTEsCisgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhjaGxheW91dF9zdHIsIHNpemVvZihjaGxheW91dF9zdHIpLCBidWYtPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5jaGFubmVsX2xheW91dCk7CiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywKICAgICAgICAgICAgIm46JSJQUklkNjQiIHB0czolcyBwdHNfdGltZTolcyBwb3M6JSJQUklkNjQiICIKICAgICAgICAgICAgImZtdDolcyBjaGFubmVsczolZCBjaGxheW91dDolcyByYXRlOiVkIG5iX3NhbXBsZXM6JWQgIgogICAgICAgICAgICAiY2hlY2tzdW06JTA4IlBSSVgzMiIgIiwKLSAgICAgICAgICAgaW5saW5rLT5mcmFtZV9jb3VudCwKKyAgICAgICAgICAgaW5saW5rLT5mcmFtZV9jb3VudF9vdXQsCiAgICAgICAgICAgIGF2X3RzMnN0cihidWYtPnB0cyksIGF2X3RzMnRpbWVzdHIoYnVmLT5wdHMsICZpbmxpbmstPnRpbWVfYmFzZSksCi0gICAgICAgICAgIGF2X2ZyYW1lX2dldF9wa3RfcG9zKGJ1ZiksCi0gICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoYnVmLT5mb3JtYXQpLCBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoYnVmKSwgY2hsYXlvdXRfc3RyLAorICAgICAgICAgICBidWYtPnBrdF9wb3MsCisgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoYnVmLT5mb3JtYXQpLCBidWYtPmNoYW5uZWxzLCBjaGxheW91dF9zdHIsCiAgICAgICAgICAgIGJ1Zi0+c2FtcGxlX3JhdGUsIGJ1Zi0+bmJfc2FtcGxlcywKICAgICAgICAgICAgY2hlY2tzdW0pOwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9hc3RhdHMuYyBiL2xpYmF2ZmlsdGVyL2FmX2FzdGF0cy5jCmluZGV4IGIzYjhmMjguLjI5MjJkYTkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2FzdGF0cy5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2FzdGF0cy5jCkBAIC0yOCwxOSArMjgsMjIgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgQ2hhbm5lbFN0YXRzIHsKICAgICBkb3VibGUgbGFzdDsKKyAgICBkb3VibGUgbWluX25vbl96ZXJvOwogICAgIGRvdWJsZSBzaWdtYV94LCBzaWdtYV94MjsKICAgICBkb3VibGUgYXZnX3NpZ21hX3gyLCBtaW5fc2lnbWFfeDIsIG1heF9zaWdtYV94MjsKICAgICBkb3VibGUgbWluLCBtYXg7CisgICAgZG91YmxlIG5taW4sIG5tYXg7CiAgICAgZG91YmxlIG1pbl9ydW4sIG1heF9ydW47CiAgICAgZG91YmxlIG1pbl9ydW5zLCBtYXhfcnVuczsKICAgICBkb3VibGUgbWluX2RpZmYsIG1heF9kaWZmOwogICAgIGRvdWJsZSBkaWZmMV9zdW07Ci0gICAgdWludDY0X3QgbWFzazsKKyAgICBkb3VibGUgZGlmZjFfc3VtX3gyOworICAgIHVpbnQ2NF90IG1hc2ssIGltYXNrOwogICAgIHVpbnQ2NF90IG1pbl9jb3VudCwgbWF4X2NvdW50OwogICAgIHVpbnQ2NF90IG5iX3NhbXBsZXM7CiB9IENoYW5uZWxTdGF0czsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQXVkaW9TdGF0c0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIENoYW5uZWxTdGF0cyAqY2hzdGF0czsKICAgICBpbnQgbmJfY2hhbm5lbHM7CkBAIC01MCw2ICs1Myw3IEBACiAgICAgaW50IG1ldGFkYXRhOwogICAgIGludCByZXNldF9jb3VudDsKICAgICBpbnQgbmJfZnJhbWVzOworICAgIGludCBtYXhiaXRkZXB0aDsKIH0gQXVkaW9TdGF0c0NvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEF1ZGlvU3RhdHNDb250ZXh0LCB4KQpAQCAtNjksNiArNzMsMTAgQEAKICAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CiAgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c1tdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMiwgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX1M2NCwgQVZfU0FNUExFX0ZNVF9TNjRQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX0ZMVCwgQVZfU0FNUExFX0ZNVF9GTFRQLAogICAgICAgICBBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9EQkxQLAogICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKICAgICB9OwpAQCAtOTgsMTQgKzEwNiwyOCBAQAogewogICAgIGludCBjOwogCi0gICAgbWVtc2V0KHMtPmNoc3RhdHMsIDAsIHNpemVvZigqcy0+Y2hzdGF0cykpOwotCiAgICAgZm9yIChjID0gMDsgYyA8IHMtPm5iX2NoYW5uZWxzOyBjKyspIHsKICAgICAgICAgQ2hhbm5lbFN0YXRzICpwID0gJnMtPmNoc3RhdHNbY107CiAKLSAgICAgICAgcC0+bWluID0gcC0+bWluX3NpZ21hX3gyID0gREJMX01BWDsKLSAgICAgICAgcC0+bWF4ID0gcC0+bWF4X3NpZ21hX3gyID0gREJMX01JTjsKLSAgICAgICAgcC0+bWluX2RpZmYgPSBwLT5tYXhfZGlmZiA9IC0xOworICAgICAgICBwLT5taW4gPSBwLT5ubWluID0gcC0+bWluX3NpZ21hX3gyID0gREJMX01BWDsKKyAgICAgICAgcC0+bWF4ID0gcC0+bm1heCA9IHAtPm1heF9zaWdtYV94MiA9IERCTF9NSU47CisgICAgICAgIHAtPm1pbl9ub25femVybyA9IERCTF9NQVg7CisgICAgICAgIHAtPm1pbl9kaWZmID0gREJMX01BWDsKKyAgICAgICAgcC0+bWF4X2RpZmYgPSBEQkxfTUlOOworICAgICAgICBwLT5zaWdtYV94ID0gMDsKKyAgICAgICAgcC0+c2lnbWFfeDIgPSAwOworICAgICAgICBwLT5hdmdfc2lnbWFfeDIgPSAwOworICAgICAgICBwLT5taW5fcnVuID0gMDsKKyAgICAgICAgcC0+bWF4X3J1biA9IDA7CisgICAgICAgIHAtPm1pbl9ydW5zID0gMDsKKyAgICAgICAgcC0+bWF4X3J1bnMgPSAwOworICAgICAgICBwLT5kaWZmMV9zdW0gPSAwOworICAgICAgICBwLT5kaWZmMV9zdW1feDIgPSAwOworICAgICAgICBwLT5tYXNrID0gMDsKKyAgICAgICAgcC0+aW1hc2sgPSAweEZGRkZGRkZGRkZGRkZGRkY7CisgICAgICAgIHAtPm1pbl9jb3VudCA9IDA7CisgICAgICAgIHAtPm1heF9jb3VudCA9IDA7CisgICAgICAgIHAtPm5iX3NhbXBsZXMgPSAwOwogICAgIH0KIH0KIApAQCAtMTE5LDI1ICsxNDEsMzUgQEAKICAgICBzLT5uYl9jaGFubmVscyA9IG91dGxpbmstPmNoYW5uZWxzOwogICAgIHMtPm11bHQgPSBleHAoKC0xIC8gcy0+dGltZV9jb25zdGFudCAvIG91dGxpbmstPnNhbXBsZV9yYXRlKSk7CiAgICAgcy0+dGNfc2FtcGxlcyA9IDUgKiBzLT50aW1lX2NvbnN0YW50ICogb3V0bGluay0+c2FtcGxlX3JhdGUgKyAuNTsKKyAgICBzLT5uYl9mcmFtZXMgPSAwOworICAgIHMtPm1heGJpdGRlcHRoID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUob3V0bGluay0+Zm9ybWF0KSAqIDg7CiAKICAgICByZXNldF9zdGF0cyhzKTsKIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdW5zaWduZWQgYml0X2RlcHRoKHVpbnQ2NF90IG1hc2spCitzdGF0aWMgdm9pZCBiaXRfZGVwdGgoQXVkaW9TdGF0c0NvbnRleHQgKnMsIHVpbnQ2NF90IG1hc2ssIHVpbnQ2NF90IGltYXNrLCBBVlJhdGlvbmFsICpkZXB0aCkKIHsKLSAgICB1bnNpZ25lZCByZXN1bHQgPSA2NDsKKyAgICB1bnNpZ25lZCByZXN1bHQgPSBzLT5tYXhiaXRkZXB0aDsKKworICAgIG1hc2sgPSBtYXNrICYgKH5pbWFzayk7CiAKICAgICBmb3IgKDsgcmVzdWx0ICYmICEobWFzayAmIDEpOyAtLXJlc3VsdCwgbWFzayA+Pj0gMSk7CiAKLSAgICByZXR1cm4gcmVzdWx0OworICAgIGRlcHRoLT5kZW4gPSByZXN1bHQ7CisgICAgZGVwdGgtPm51bSA9IDA7CisKKyAgICBmb3IgKDsgcmVzdWx0OyAtLXJlc3VsdCwgbWFzayA+Pj0gMSkKKyAgICAgICAgaWYgKG1hc2sgJiAxKQorICAgICAgICAgICAgZGVwdGgtPm51bSsrOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3N0YXQoQXVkaW9TdGF0c0NvbnRleHQgKnMsIENoYW5uZWxTdGF0cyAqcCwgZG91YmxlIGQpCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3N0YXQoQXVkaW9TdGF0c0NvbnRleHQgKnMsIENoYW5uZWxTdGF0cyAqcCwgZG91YmxlIGQsIGRvdWJsZSBuZCwgaW50NjRfdCBpKQogewogICAgIGlmIChkIDwgcC0+bWluKSB7CiAgICAgICAgIHAtPm1pbiA9IGQ7CisgICAgICAgIHAtPm5taW4gPSBuZDsKICAgICAgICAgcC0+bWluX3J1biA9IDE7CiAgICAgICAgIHAtPm1pbl9ydW5zID0gMDsKICAgICAgICAgcC0+bWluX2NvdW50ID0gMTsKQEAgLTE0OCw4ICsxODAsMTIgQEAKICAgICAgICAgcC0+bWluX3J1bnMgKz0gcC0+bWluX3J1biAqIHAtPm1pbl9ydW47CiAgICAgfQogCisgICAgaWYgKGQgIT0gMCAmJiBGRkFCUyhkKSA8IHAtPm1pbl9ub25femVybykKKyAgICAgICAgcC0+bWluX25vbl96ZXJvID0gRkZBQlMoZCk7CisKICAgICBpZiAoZCA+IHAtPm1heCkgewogICAgICAgICBwLT5tYXggPSBkOworICAgICAgICBwLT5ubWF4ID0gbmQ7CiAgICAgICAgIHAtPm1heF9ydW4gPSAxOwogICAgICAgICBwLT5tYXhfcnVucyA9IDA7CiAgICAgICAgIHAtPm1heF9jb3VudCA9IDE7CkBAIC0xNjAsMTQgKzE5NiwxNiBAQAogICAgICAgICBwLT5tYXhfcnVucyArPSBwLT5tYXhfcnVuICogcC0+bWF4X3J1bjsKICAgICB9CiAKLSAgICBwLT5zaWdtYV94ICs9IGQ7Ci0gICAgcC0+c2lnbWFfeDIgKz0gZCAqIGQ7Ci0gICAgcC0+YXZnX3NpZ21hX3gyID0gcC0+YXZnX3NpZ21hX3gyICogcy0+bXVsdCArICgxLjAgLSBzLT5tdWx0KSAqIGQgKiBkOwotICAgIHAtPm1pbl9kaWZmID0gRkZNSU4ocC0+bWluX2RpZmYgPT0gLTEgPyBEQkxfTUFYIDogcC0+bWluX2RpZmYsIGZhYnMoZCAtIChwLT5taW5fZGlmZiA9PSAtMSA/IERCTF9NQVggOiBwLT5sYXN0KSkpOwotICAgIHAtPm1heF9kaWZmID0gRkZNQVgocC0+bWF4X2RpZmYsIGZhYnMoZCAtIChwLT5tYXhfZGlmZiA9PSAtMSA/IGQgOiBwLT5sYXN0KSkpOworICAgIHAtPnNpZ21hX3ggKz0gbmQ7CisgICAgcC0+c2lnbWFfeDIgKz0gbmQgKiBuZDsKKyAgICBwLT5hdmdfc2lnbWFfeDIgPSBwLT5hdmdfc2lnbWFfeDIgKiBzLT5tdWx0ICsgKDEuMCAtIHMtPm11bHQpICogbmQgKiBuZDsKKyAgICBwLT5taW5fZGlmZiA9IEZGTUlOKHAtPm1pbl9kaWZmLCBmYWJzKGQgLSBwLT5sYXN0KSk7CisgICAgcC0+bWF4X2RpZmYgPSBGRk1BWChwLT5tYXhfZGlmZiwgZmFicyhkIC0gcC0+bGFzdCkpOwogICAgIHAtPmRpZmYxX3N1bSArPSBmYWJzKGQgLSBwLT5sYXN0KTsKKyAgICBwLT5kaWZmMV9zdW1feDIgKz0gKGQgLSBwLT5sYXN0KSAqIChkIC0gcC0+bGFzdCk7CiAgICAgcC0+bGFzdCA9IGQ7Ci0gICAgcC0+bWFzayB8PSBsbHJpbnQoZCAqIChVSU5UNjRfQygxKSA8PCA2MykpOworICAgIHAtPm1hc2sgfD0gaTsKKyAgICBwLT5pbWFzayAmPSBpOwogCiAgICAgaWYgKHAtPm5iX3NhbXBsZXMgPj0gcy0+dGNfc2FtcGxlcykgewogICAgICAgICBwLT5tYXhfc2lnbWFfeDIgPSBGRk1BWChwLT5tYXhfc2lnbWFfeDIsIHAtPmF2Z19zaWdtYV94Mik7CkBAIC0xOTQsMTUgKzIzMiwxOCBAQAogCiBzdGF0aWMgdm9pZCBzZXRfbWV0YWRhdGEoQXVkaW9TdGF0c0NvbnRleHQgKnMsIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhKQogewotICAgIHVpbnQ2NF90IG1hc2sgPSAwLCBtaW5fY291bnQgPSAwLCBtYXhfY291bnQgPSAwLCBuYl9zYW1wbGVzID0gMDsKKyAgICB1aW50NjRfdCBtYXNrID0gMCwgaW1hc2sgPSAweEZGRkZGRkZGRkZGRkZGRkYsIG1pbl9jb3VudCA9IDAsIG1heF9jb3VudCA9IDAsIG5iX3NhbXBsZXMgPSAwOwogICAgIGRvdWJsZSBtaW5fcnVucyA9IDAsIG1heF9ydW5zID0gMCwKICAgICAgICAgICAgbWluID0gREJMX01BWCwgbWF4ID0gREJMX01JTiwgbWluX2RpZmYgPSBEQkxfTUFYLCBtYXhfZGlmZiA9IDAsCisgICAgICAgICAgIG5taW4gPSBEQkxfTUFYLCBubWF4ID0gREJMX01JTiwKICAgICAgICAgICAgbWF4X3NpZ21hX3ggPSAwLAogICAgICAgICAgICBkaWZmMV9zdW0gPSAwLAorICAgICAgICAgICBkaWZmMV9zdW1feDIgPSAwLAogICAgICAgICAgICBzaWdtYV94ID0gMCwKICAgICAgICAgICAgc2lnbWFfeDIgPSAwLAogICAgICAgICAgICBtaW5fc2lnbWFfeDIgPSBEQkxfTUFYLAogICAgICAgICAgICBtYXhfc2lnbWFfeDIgPSBEQkxfTUlOOworICAgIEFWUmF0aW9uYWwgZGVwdGg7CiAgICAgaW50IGM7CiAKICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY2hhbm5lbHM7IGMrKykgewpAQCAtMjEzLDkgKzI1NCwxMiBAQAogCiAgICAgICAgIG1pbiA9IEZGTUlOKG1pbiwgcC0+bWluKTsKICAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBwLT5tYXgpOworICAgICAgICBubWluID0gRkZNSU4obm1pbiwgcC0+bm1pbik7CisgICAgICAgIG5tYXggPSBGRk1BWChubWF4LCBwLT5ubWF4KTsKICAgICAgICAgbWluX2RpZmYgPSBGRk1JTihtaW5fZGlmZiwgcC0+bWluX2RpZmYpOwogICAgICAgICBtYXhfZGlmZiA9IEZGTUFYKG1heF9kaWZmLCBwLT5tYXhfZGlmZik7Ci0gICAgICAgIGRpZmYxX3N1bSArPSBwLT5kaWZmMV9zdW0sCisgICAgICAgIGRpZmYxX3N1bSArPSBwLT5kaWZmMV9zdW07CisgICAgICAgIGRpZmYxX3N1bV94MiArPSBwLT5kaWZmMV9zdW1feDI7CiAgICAgICAgIG1pbl9zaWdtYV94MiA9IEZGTUlOKG1pbl9zaWdtYV94MiwgcC0+bWluX3NpZ21hX3gyKTsKICAgICAgICAgbWF4X3NpZ21hX3gyID0gRkZNQVgobWF4X3NpZ21hX3gyLCBwLT5tYXhfc2lnbWFfeDIpOwogICAgICAgICBzaWdtYV94ICs9IHAtPnNpZ21hX3g7CkBAIC0yMjUsNiArMjY5LDcgQEAKICAgICAgICAgbWluX3J1bnMgKz0gcC0+bWluX3J1bnM7CiAgICAgICAgIG1heF9ydW5zICs9IHAtPm1heF9ydW5zOwogICAgICAgICBtYXNrIHw9IHAtPm1hc2s7CisgICAgICAgIGltYXNrICY9IHAtPmltYXNrOwogICAgICAgICBuYl9zYW1wbGVzICs9IHAtPm5iX3NhbXBsZXM7CiAgICAgICAgIGlmIChmYWJzKHAtPnNpZ21hX3gpID4gZmFicyhtYXhfc2lnbWFfeCkpCiAgICAgICAgICAgICBtYXhfc2lnbWFfeCA9IHAtPnNpZ21hX3g7CkBAIC0yMzUsMTQgKzI4MCwxOCBAQAogICAgICAgICBzZXRfbWV0YShtZXRhZGF0YSwgYyArIDEsICJNaW5fZGlmZmVyZW5jZSIsICIlZiIsIHAtPm1pbl9kaWZmKTsKICAgICAgICAgc2V0X21ldGEobWV0YWRhdGEsIGMgKyAxLCAiTWF4X2RpZmZlcmVuY2UiLCAiJWYiLCBwLT5tYXhfZGlmZik7CiAgICAgICAgIHNldF9tZXRhKG1ldGFkYXRhLCBjICsgMSwgIk1lYW5fZGlmZmVyZW5jZSIsICIlZiIsIHAtPmRpZmYxX3N1bSAvIChwLT5uYl9zYW1wbGVzIC0gMSkpOwotICAgICAgICBzZXRfbWV0YShtZXRhZGF0YSwgYyArIDEsICJQZWFrX2xldmVsIiwgIiVmIiwgTElORUFSX1RPX0RCKEZGTUFYKC1wLT5taW4sIHAtPm1heCkpKTsKKyAgICAgICAgc2V0X21ldGEobWV0YWRhdGEsIGMgKyAxLCAiUk1TX2RpZmZlcmVuY2UiLCAiJWYiLCBzcXJ0KHAtPmRpZmYxX3N1bV94MiAvIChwLT5uYl9zYW1wbGVzIC0gMSkpKTsKKyAgICAgICAgc2V0X21ldGEobWV0YWRhdGEsIGMgKyAxLCAiUGVha19sZXZlbCIsICIlZiIsIExJTkVBUl9UT19EQihGRk1BWCgtcC0+bm1pbiwgcC0+bm1heCkpKTsKICAgICAgICAgc2V0X21ldGEobWV0YWRhdGEsIGMgKyAxLCAiUk1TX2xldmVsIiwgIiVmIiwgTElORUFSX1RPX0RCKHNxcnQocC0+c2lnbWFfeDIgLyBwLT5uYl9zYW1wbGVzKSkpOwogICAgICAgICBzZXRfbWV0YShtZXRhZGF0YSwgYyArIDEsICJSTVNfcGVhayIsICIlZiIsIExJTkVBUl9UT19EQihzcXJ0KHAtPm1heF9zaWdtYV94MikpKTsKICAgICAgICAgc2V0X21ldGEobWV0YWRhdGEsIGMgKyAxLCAiUk1TX3Ryb3VnaCIsICIlZiIsIExJTkVBUl9UT19EQihzcXJ0KHAtPm1pbl9zaWdtYV94MikpKTsKICAgICAgICAgc2V0X21ldGEobWV0YWRhdGEsIGMgKyAxLCAiQ3Jlc3RfZmFjdG9yIiwgIiVmIiwgcC0+c2lnbWFfeDIgPyBGRk1BWCgtcC0+bWluLCBwLT5tYXgpIC8gc3FydChwLT5zaWdtYV94MiAvIHAtPm5iX3NhbXBsZXMpIDogMSk7CiAgICAgICAgIHNldF9tZXRhKG1ldGFkYXRhLCBjICsgMSwgIkZsYXRfZmFjdG9yIiwgIiVmIiwgTElORUFSX1RPX0RCKChwLT5taW5fcnVucyArIHAtPm1heF9ydW5zKSAvIChwLT5taW5fY291bnQgKyBwLT5tYXhfY291bnQpKSk7CiAgICAgICAgIHNldF9tZXRhKG1ldGFkYXRhLCBjICsgMSwgIlBlYWtfY291bnQiLCAiJWYiLCAoZmxvYXQpKHAtPm1pbl9jb3VudCArIHAtPm1heF9jb3VudCkpOwotICAgICAgICBzZXRfbWV0YShtZXRhZGF0YSwgYyArIDEsICJCaXRfZGVwdGgiLCAiJWYiLCBiaXRfZGVwdGgocC0+bWFzaykpOworICAgICAgICBiaXRfZGVwdGgocywgcC0+bWFzaywgcC0+aW1hc2ssICZkZXB0aCk7CisgICAgICAgIHNldF9tZXRhKG1ldGFkYXRhLCBjICsgMSwgIkJpdF9kZXB0aCIsICIlZiIsIGRlcHRoLm51bSk7CisgICAgICAgIHNldF9tZXRhKG1ldGFkYXRhLCBjICsgMSwgIkJpdF9kZXB0aDIiLCAiJWYiLCBkZXB0aC5kZW4pOworICAgICAgICBzZXRfbWV0YShtZXRhZGF0YSwgYyArIDEsICJEeW5hbWljX3JhbmdlIiwgIiVmIiwgTElORUFSX1RPX0RCKDIgKiBGRk1BWChGRkFCUyhwLT5taW4pLCBGRkFCUyhwLT5tYXgpKS8gcC0+bWluX25vbl96ZXJvKSk7CiAgICAgfQogCiAgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLkRDX29mZnNldCIsICIlZiIsIG1heF9zaWdtYV94IC8gKG5iX3NhbXBsZXMgLyBzLT5uYl9jaGFubmVscykpOwpAQCAtMjUxLDcwICszMDAsMTQzIEBACiAgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLk1pbl9kaWZmZXJlbmNlIiwgIiVmIiwgbWluX2RpZmYpOwogICAgIHNldF9tZXRhKG1ldGFkYXRhLCAwLCAiT3ZlcmFsbC5NYXhfZGlmZmVyZW5jZSIsICIlZiIsIG1heF9kaWZmKTsKICAgICBzZXRfbWV0YShtZXRhZGF0YSwgMCwgIk92ZXJhbGwuTWVhbl9kaWZmZXJlbmNlIiwgIiVmIiwgZGlmZjFfc3VtIC8gKG5iX3NhbXBsZXMgLSBzLT5uYl9jaGFubmVscykpOwotICAgIHNldF9tZXRhKG1ldGFkYXRhLCAwLCAiT3ZlcmFsbC5QZWFrX2xldmVsIiwgIiVmIiwgTElORUFSX1RPX0RCKEZGTUFYKC1taW4sIG1heCkpKTsKKyAgICBzZXRfbWV0YShtZXRhZGF0YSwgMCwgIk92ZXJhbGwuUk1TX2RpZmZlcmVuY2UiLCAiJWYiLCBzcXJ0KGRpZmYxX3N1bV94MiAvIChuYl9zYW1wbGVzIC0gcy0+bmJfY2hhbm5lbHMpKSk7CisgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLlBlYWtfbGV2ZWwiLCAiJWYiLCBMSU5FQVJfVE9fREIoRkZNQVgoLW5taW4sIG5tYXgpKSk7CiAgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLlJNU19sZXZlbCIsICIlZiIsIExJTkVBUl9UT19EQihzcXJ0KHNpZ21hX3gyIC8gbmJfc2FtcGxlcykpKTsKICAgICBzZXRfbWV0YShtZXRhZGF0YSwgMCwgIk92ZXJhbGwuUk1TX3BlYWsiLCAiJWYiLCBMSU5FQVJfVE9fREIoc3FydChtYXhfc2lnbWFfeDIpKSk7CiAgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLlJNU190cm91Z2giLCAiJWYiLCBMSU5FQVJfVE9fREIoc3FydChtaW5fc2lnbWFfeDIpKSk7CiAgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLkZsYXRfZmFjdG9yIiwgIiVmIiwgTElORUFSX1RPX0RCKChtaW5fcnVucyArIG1heF9ydW5zKSAvIChtaW5fY291bnQgKyBtYXhfY291bnQpKSk7CiAgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLlBlYWtfY291bnQiLCAiJWYiLCAoZmxvYXQpKG1pbl9jb3VudCArIG1heF9jb3VudCkgLyAoZG91YmxlKXMtPm5iX2NoYW5uZWxzKTsKLSAgICBzZXRfbWV0YShtZXRhZGF0YSwgMCwgIk92ZXJhbGwuQml0X2RlcHRoIiwgIiVmIiwgYml0X2RlcHRoKG1hc2spKTsKKyAgICBiaXRfZGVwdGgocywgbWFzaywgaW1hc2ssICZkZXB0aCk7CisgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLkJpdF9kZXB0aCIsICIlZiIsIGRlcHRoLm51bSk7CisgICAgc2V0X21ldGEobWV0YWRhdGEsIDAsICJPdmVyYWxsLkJpdF9kZXB0aDIiLCAiJWYiLCBkZXB0aC5kZW4pOwogICAgIHNldF9tZXRhKG1ldGFkYXRhLCAwLCAiT3ZlcmFsbC5OdW1iZXJfb2Zfc2FtcGxlcyIsICIlZiIsIG5iX3NhbXBsZXMgLyBzLT5uYl9jaGFubmVscyk7CiB9CiAKIHN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCiB7CiAgICAgQXVkaW9TdGF0c0NvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSA9IGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGJ1Zik7CisgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEgPSAmYnVmLT5tZXRhZGF0YTsKICAgICBjb25zdCBpbnQgY2hhbm5lbHMgPSBzLT5uYl9jaGFubmVsczsKLSAgICBjb25zdCBkb3VibGUgKnNyYzsKICAgICBpbnQgaSwgYzsKIAorICAgIGlmIChzLT5yZXNldF9jb3VudCA+IDApIHsKKyAgICAgICAgaWYgKHMtPm5iX2ZyYW1lcyA+PSBzLT5yZXNldF9jb3VudCkgeworICAgICAgICAgICAgcmVzZXRfc3RhdHMocyk7CisgICAgICAgICAgICBzLT5uYl9mcmFtZXMgPSAwOworICAgICAgICB9CisgICAgICAgIHMtPm5iX2ZyYW1lcysrOworICAgIH0KKwogICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMUDoKICAgICAgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHsKICAgICAgICAgICAgIENoYW5uZWxTdGF0cyAqcCA9ICZzLT5jaHN0YXRzW2NdOwotICAgICAgICAgICAgc3JjID0gKGNvbnN0IGRvdWJsZSAqKWJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjXTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqc3JjID0gKGNvbnN0IGRvdWJsZSAqKWJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjXTsKIAogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrLCBzcmMrKykKLSAgICAgICAgICAgICAgICB1cGRhdGVfc3RhdChzLCBwLCAqc3JjKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVfc3RhdChzLCBwLCAqc3JjLCAqc3JjLCBsbHJpbnQoKnNyYyAqIChVSU5UNjRfQygxKSA8PCA2MykpKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMOgotICAgICAgICBzcmMgPSAoY29uc3QgZG91YmxlICopYnVmLT5leHRlbmRlZF9kYXRhWzBdOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkw6IHsKKyAgICAgICAgY29uc3QgZG91YmxlICpzcmMgPSAoY29uc3QgZG91YmxlICopYnVmLT5leHRlbmRlZF9kYXRhWzBdOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBidWYtPm5iX3NhbXBsZXM7IGkrKykgewogICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyssIHNyYysrKQotICAgICAgICAgICAgICAgIHVwZGF0ZV9zdGF0KHMsICZzLT5jaHN0YXRzW2NdLCAqc3JjKTsKKyAgICAgICAgICAgICAgICB1cGRhdGVfc3RhdChzLCAmcy0+Y2hzdGF0c1tjXSwgKnNyYywgKnNyYywgbGxyaW50KCpzcmMgKiAoVUlOVDY0X0MoMSkgPDwgNjMpKSk7CisgICAgICAgIH19CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFRQOgorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgQ2hhbm5lbFN0YXRzICpwID0gJnMtPmNoc3RhdHNbY107CisgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjID0gKGNvbnN0IGZsb2F0ICopYnVmLT5leHRlbmRlZF9kYXRhW2NdOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmLT5uYl9zYW1wbGVzOyBpKyssIHNyYysrKQorICAgICAgICAgICAgICAgIHVwZGF0ZV9zdGF0KHMsIHAsICpzcmMsICpzcmMsIGxscmludCgqc3JjICogKFVJTlQ2NF9DKDEpIDw8IDMxKSkpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6IHsKKyAgICAgICAgY29uc3QgZmxvYXQgKnNyYyA9IChjb25zdCBmbG9hdCAqKWJ1Zi0+ZXh0ZW5kZWRfZGF0YVswXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYnVmLT5uYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrLCBzcmMrKykKKyAgICAgICAgICAgICAgICB1cGRhdGVfc3RhdChzLCAmcy0+Y2hzdGF0c1tjXSwgKnNyYywgKnNyYywgbGxyaW50KCpzcmMgKiAoVUlOVDY0X0MoMSkgPDwgMzEpKSk7CisgICAgICAgIH19CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TNjRQOgorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgQ2hhbm5lbFN0YXRzICpwID0gJnMtPmNoc3RhdHNbY107CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90ICpzcmMgPSAoY29uc3QgaW50NjRfdCAqKWJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrLCBzcmMrKykKKyAgICAgICAgICAgICAgICB1cGRhdGVfc3RhdChzLCBwLCAqc3JjLCAqc3JjIC8gKGRvdWJsZSlJTlQ2NF9NQVgsICpzcmMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TNjQ6IHsKKyAgICAgICAgY29uc3QgaW50NjRfdCAqc3JjID0gKGNvbnN0IGludDY0X3QgKilidWYtPmV4dGVuZGVkX2RhdGFbMF07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKywgc3JjKyspCisgICAgICAgICAgICAgICAgdXBkYXRlX3N0YXQocywgJnMtPmNoc3RhdHNbY10sICpzcmMsICpzcmMgLyAoZG91YmxlKUlOVDY0X01BWCwgKnNyYyk7CisgICAgICAgIH19CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzJQOgorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgQ2hhbm5lbFN0YXRzICpwID0gJnMtPmNoc3RhdHNbY107CisgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpzcmMgPSAoY29uc3QgaW50MzJfdCAqKWJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrLCBzcmMrKykKKyAgICAgICAgICAgICAgICB1cGRhdGVfc3RhdChzLCBwLCAqc3JjLCAqc3JjIC8gKGRvdWJsZSlJTlQzMl9NQVgsICpzcmMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6IHsKKyAgICAgICAgY29uc3QgaW50MzJfdCAqc3JjID0gKGNvbnN0IGludDMyX3QgKilidWYtPmV4dGVuZGVkX2RhdGFbMF07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKywgc3JjKyspCisgICAgICAgICAgICAgICAgdXBkYXRlX3N0YXQocywgJnMtPmNoc3RhdHNbY10sICpzcmMsICpzcmMgLyAoZG91YmxlKUlOVDMyX01BWCwgKnNyYyk7CisgICAgICAgIH19CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgQ2hhbm5lbFN0YXRzICpwID0gJnMtPmNoc3RhdHNbY107CisgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpzcmMgPSAoY29uc3QgaW50MTZfdCAqKWJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrLCBzcmMrKykKKyAgICAgICAgICAgICAgICB1cGRhdGVfc3RhdChzLCBwLCAqc3JjLCAqc3JjIC8gKGRvdWJsZSlJTlQxNl9NQVgsICpzcmMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6IHsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqc3JjID0gKGNvbnN0IGludDE2X3QgKilidWYtPmV4dGVuZGVkX2RhdGFbMF07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKywgc3JjKyspCisgICAgICAgICAgICAgICAgdXBkYXRlX3N0YXQocywgJnMtPmNoc3RhdHNbY10sICpzcmMsICpzcmMgLyAoZG91YmxlKUlOVDE2X01BWCwgKnNyYyk7CisgICAgICAgIH19CisgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIGlmIChzLT5tZXRhZGF0YSkKICAgICAgICAgc2V0X21ldGFkYXRhKHMsIG1ldGFkYXRhKTsKIAotICAgIGlmIChzLT5yZXNldF9jb3VudCA+IDApIHsKLSAgICAgICAgcy0+bmJfZnJhbWVzKys7Ci0gICAgICAgIGlmIChzLT5uYl9mcmFtZXMgPj0gcy0+cmVzZXRfY291bnQpIHsKLSAgICAgICAgICAgIHJlc2V0X3N0YXRzKHMpOwotICAgICAgICAgICAgcy0+bmJfZnJhbWVzID0gMDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoaW5saW5rLT5kc3QtPm91dHB1dHNbMF0sIGJ1Zik7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X3N0YXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewogICAgIEF1ZGlvU3RhdHNDb250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIHVpbnQ2NF90IG1hc2sgPSAwLCBtaW5fY291bnQgPSAwLCBtYXhfY291bnQgPSAwLCBuYl9zYW1wbGVzID0gMDsKKyAgICB1aW50NjRfdCBtYXNrID0gMCwgaW1hc2sgPSAweEZGRkZGRkZGRkZGRkZGRkYsIG1pbl9jb3VudCA9IDAsIG1heF9jb3VudCA9IDAsIG5iX3NhbXBsZXMgPSAwOwogICAgIGRvdWJsZSBtaW5fcnVucyA9IDAsIG1heF9ydW5zID0gMCwKICAgICAgICAgICAgbWluID0gREJMX01BWCwgbWF4ID0gREJMX01JTiwgbWluX2RpZmYgPSBEQkxfTUFYLCBtYXhfZGlmZiA9IDAsCisgICAgICAgICAgIG5taW4gPSBEQkxfTUFYLCBubWF4ID0gREJMX01JTiwKICAgICAgICAgICAgbWF4X3NpZ21hX3ggPSAwLAorICAgICAgICAgICBkaWZmMV9zdW1feDIgPSAwLAogICAgICAgICAgICBkaWZmMV9zdW0gPSAwLAogICAgICAgICAgICBzaWdtYV94ID0gMCwKICAgICAgICAgICAgc2lnbWFfeDIgPSAwLAogICAgICAgICAgICBtaW5fc2lnbWFfeDIgPSBEQkxfTUFYLAogICAgICAgICAgICBtYXhfc2lnbWFfeDIgPSBEQkxfTUlOOworICAgIEFWUmF0aW9uYWwgZGVwdGg7CiAgICAgaW50IGM7CiAKICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY2hhbm5lbHM7IGMrKykgewpAQCAtMzI1LDkgKzQ0NywxMiBAQAogCiAgICAgICAgIG1pbiA9IEZGTUlOKG1pbiwgcC0+bWluKTsKICAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBwLT5tYXgpOworICAgICAgICBubWluID0gRkZNSU4obm1pbiwgcC0+bm1pbik7CisgICAgICAgIG5tYXggPSBGRk1BWChubWF4LCBwLT5ubWF4KTsKICAgICAgICAgbWluX2RpZmYgPSBGRk1JTihtaW5fZGlmZiwgcC0+bWluX2RpZmYpOwogICAgICAgICBtYXhfZGlmZiA9IEZGTUFYKG1heF9kaWZmLCBwLT5tYXhfZGlmZik7Ci0gICAgICAgIGRpZmYxX3N1bSArPSBwLT5kaWZmMV9zdW0sCisgICAgICAgIGRpZmYxX3N1bV94MiArPSBwLT5kaWZmMV9zdW1feDI7CisgICAgICAgIGRpZmYxX3N1bSArPSBwLT5kaWZmMV9zdW07CiAgICAgICAgIG1pbl9zaWdtYV94MiA9IEZGTUlOKG1pbl9zaWdtYV94MiwgcC0+bWluX3NpZ21hX3gyKTsKICAgICAgICAgbWF4X3NpZ21hX3gyID0gRkZNQVgobWF4X3NpZ21hX3gyLCBwLT5tYXhfc2lnbWFfeDIpOwogICAgICAgICBzaWdtYV94ICs9IHAtPnNpZ21hX3g7CkBAIC0zMzcsNiArNDYyLDcgQEAKICAgICAgICAgbWluX3J1bnMgKz0gcC0+bWluX3J1bnM7CiAgICAgICAgIG1heF9ydW5zICs9IHAtPm1heF9ydW5zOwogICAgICAgICBtYXNrIHw9IHAtPm1hc2s7CisgICAgICAgIGltYXNrICY9IHAtPmltYXNrOwogICAgICAgICBuYl9zYW1wbGVzICs9IHAtPm5iX3NhbXBsZXM7CiAgICAgICAgIGlmIChmYWJzKHAtPnNpZ21hX3gpID4gZmFicyhtYXhfc2lnbWFfeCkpCiAgICAgICAgICAgICBtYXhfc2lnbWFfeCA9IHAtPnNpZ21hX3g7CkBAIC0zNDgsMTUgKzQ3NCwxOCBAQAogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIk1pbiBkaWZmZXJlbmNlOiAlZlxuIiwgcC0+bWluX2RpZmYpOwogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIk1heCBkaWZmZXJlbmNlOiAlZlxuIiwgcC0+bWF4X2RpZmYpOwogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIk1lYW4gZGlmZmVyZW5jZTogJWZcbiIsIHAtPmRpZmYxX3N1bSAvIChwLT5uYl9zYW1wbGVzIC0gMSkpOwotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlBlYWsgbGV2ZWwgZEI6ICVmXG4iLCBMSU5FQVJfVE9fREIoRkZNQVgoLXAtPm1pbiwgcC0+bWF4KSkpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlJNUyBkaWZmZXJlbmNlOiAlZlxuIiwgc3FydChwLT5kaWZmMV9zdW1feDIgLyAocC0+bmJfc2FtcGxlcyAtIDEpKSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiUGVhayBsZXZlbCBkQjogJWZcbiIsIExJTkVBUl9UT19EQihGRk1BWCgtcC0+bm1pbiwgcC0+bm1heCkpKTsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSTVMgbGV2ZWwgZEI6ICVmXG4iLCBMSU5FQVJfVE9fREIoc3FydChwLT5zaWdtYV94MiAvIHAtPm5iX3NhbXBsZXMpKSk7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiUk1TIHBlYWsgZEI6ICVmXG4iLCBMSU5FQVJfVE9fREIoc3FydChwLT5tYXhfc2lnbWFfeDIpKSk7CiAgICAgICAgIGlmIChwLT5taW5fc2lnbWFfeDIgIT0gMSkKICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiUk1TIHRyb3VnaCBkQjogJWZcbiIsTElORUFSX1RPX0RCKHNxcnQocC0+bWluX3NpZ21hX3gyKSkpOwotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkNyZXN0IGZhY3RvcjogJWZcbiIsIHAtPnNpZ21hX3gyID8gRkZNQVgoLXAtPm1pbiwgcC0+bWF4KSAvIHNxcnQocC0+c2lnbWFfeDIgLyBwLT5uYl9zYW1wbGVzKSA6IDEpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkNyZXN0IGZhY3RvcjogJWZcbiIsIHAtPnNpZ21hX3gyID8gRkZNQVgoLXAtPm5taW4sIHAtPm5tYXgpIC8gc3FydChwLT5zaWdtYV94MiAvIHAtPm5iX3NhbXBsZXMpIDogMSk7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiRmxhdCBmYWN0b3I6ICVmXG4iLCBMSU5FQVJfVE9fREIoKHAtPm1pbl9ydW5zICsgcC0+bWF4X3J1bnMpIC8gKHAtPm1pbl9jb3VudCArIHAtPm1heF9jb3VudCkpKTsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJQZWFrIGNvdW50OiAlIlBSSWQ2NCJcbiIsIHAtPm1pbl9jb3VudCArIHAtPm1heF9jb3VudCk7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiQml0IGRlcHRoOiAldVxuIiwgYml0X2RlcHRoKHAtPm1hc2spKTsKKyAgICAgICAgYml0X2RlcHRoKHMsIHAtPm1hc2ssIHAtPmltYXNrLCAmZGVwdGgpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkJpdCBkZXB0aDogJXUvJXVcbiIsIGRlcHRoLm51bSwgZGVwdGguZGVuKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJEeW5hbWljIHJhbmdlOiAlZlxuIiwgTElORUFSX1RPX0RCKDIgKiBGRk1BWChGRkFCUyhwLT5taW4pLCBGRkFCUyhwLT5tYXgpKS8gcC0+bWluX25vbl96ZXJvKSk7CiAgICAgfQogCiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJPdmVyYWxsXG4iKTsKQEAgLTM2NiwxNCArNDk1LDE2IEBACiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJNaW4gZGlmZmVyZW5jZTogJWZcbiIsIG1pbl9kaWZmKTsKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIk1heCBkaWZmZXJlbmNlOiAlZlxuIiwgbWF4X2RpZmYpOwogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiTWVhbiBkaWZmZXJlbmNlOiAlZlxuIiwgZGlmZjFfc3VtIC8gKG5iX3NhbXBsZXMgLSBzLT5uYl9jaGFubmVscykpOwotICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiUGVhayBsZXZlbCBkQjogJWZcbiIsIExJTkVBUl9UT19EQihGRk1BWCgtbWluLCBtYXgpKSk7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSTVMgZGlmZmVyZW5jZTogJWZcbiIsIHNxcnQoZGlmZjFfc3VtX3gyIC8gKG5iX3NhbXBsZXMgLSBzLT5uYl9jaGFubmVscykpKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlBlYWsgbGV2ZWwgZEI6ICVmXG4iLCBMSU5FQVJfVE9fREIoRkZNQVgoLW5taW4sIG5tYXgpKSk7CiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSTVMgbGV2ZWwgZEI6ICVmXG4iLCBMSU5FQVJfVE9fREIoc3FydChzaWdtYV94MiAvIG5iX3NhbXBsZXMpKSk7CiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSTVMgcGVhayBkQjogJWZcbiIsIExJTkVBUl9UT19EQihzcXJ0KG1heF9zaWdtYV94MikpKTsKICAgICBpZiAobWluX3NpZ21hX3gyICE9IDEpCiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiUk1TIHRyb3VnaCBkQjogJWZcbiIsIExJTkVBUl9UT19EQihzcXJ0KG1pbl9zaWdtYV94MikpKTsKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkZsYXQgZmFjdG9yOiAlZlxuIiwgTElORUFSX1RPX0RCKChtaW5fcnVucyArIG1heF9ydW5zKSAvIChtaW5fY291bnQgKyBtYXhfY291bnQpKSk7CiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJQZWFrIGNvdW50OiAlZlxuIiwgKG1pbl9jb3VudCArIG1heF9jb3VudCkgLyAoZG91YmxlKXMtPm5iX2NoYW5uZWxzKTsKLSAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkJpdCBkZXB0aDogJXVcbiIsIGJpdF9kZXB0aChtYXNrKSk7CisgICAgYml0X2RlcHRoKHMsIG1hc2ssIGltYXNrLCAmZGVwdGgpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiQml0IGRlcHRoOiAldS8ldVxuIiwgZGVwdGgubnVtLCBkZXB0aC5kZW4pOwogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiTnVtYmVyIG9mIHNhbXBsZXM6ICUiUFJJZDY0IlxuIiwgbmJfc2FtcGxlcyAvIHMtPm5iX2NoYW5uZWxzKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfYXN5bmN0cy5jIGIvbGliYXZmaWx0ZXIvYWZfYXN5bmN0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjU1OWExLi4wMDAwMDAwCi0tLSBhL2xpYmF2ZmlsdGVyL2FmX2FzeW5jdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMiArMCwwIEBACi0vKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F1ZGlvX2ZpZm8uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKLQotI2luY2x1ZGUgImF1ZGlvLmgiCi0jaW5jbHVkZSAiYXZmaWx0ZXIuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi10eXBlZGVmIHN0cnVjdCBBU3luY0NvbnRleHQgewotICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwotCi0gICAgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyOwotICAgIGludDY0X3QgcHRzOyAgICAgICAgICAgIC8vLzwgdGltZXN0YW1wIGluIHNhbXBsZXMgb2YgdGhlIGZpcnN0IHNhbXBsZSBpbiBmaWZvCi0gICAgaW50IG1pbl9kZWx0YTsgICAgICAgICAgLy8vPCBwYWQvdHJpbSBtaW4gdGhyZXNob2xkIGluIHNhbXBsZXMKLSAgICBpbnQgZmlyc3RfZnJhbWU7ICAgICAgICAvLy88IDEgdW50aWwgZmlsdGVyX2ZyYW1lKCkgaGFzIHByb2Nlc3NlZCBhdCBsZWFzdCAxIGZyYW1lIHdpdGggYSBwdHMgIT0gQVZfTk9QVFNfVkFMVUUKLSAgICBpbnQ2NF90IGZpcnN0X3B0czsgICAgICAvLy88IHVzZXItc3BlY2lmaWVkIGZpcnN0IGV4cGVjdGVkIHB0cywgaW4gc2FtcGxlcwotICAgIGludCBjb21wOyAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCByZXNhbXBsZSBjb21wZW5zYXRpb24KLQotICAgIC8qIG9wdGlvbnMgKi8KLSAgICBpbnQgcmVzYW1wbGU7Ci0gICAgZmxvYXQgbWluX2RlbHRhX3NlYzsKLSAgICBpbnQgbWF4X2NvbXA7Ci0KLSAgICAvKiBzZXQgYnkgZmlsdGVyX2ZyYW1lKCkgdG8gc2lnbmFsIGFuIG91dHB1dCBmcmFtZSB0byByZXF1ZXN0X2ZyYW1lKCkgKi8KLSAgICBpbnQgZ290X291dHB1dDsKLX0gQVN5bmNDb250ZXh0OwotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBU3luY0NvbnRleHQsIHgpCi0jZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KLSNkZWZpbmUgRiBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiBhc3luY3RzX29wdGlvbnNbXSA9IHsKLSAgICB7ICJjb21wZW5zYXRlIiwgIlN0cmV0Y2gvc3F1ZWV6ZSB0aGUgZGF0YSB0byBtYWtlIGl0IG1hdGNoIHRoZSB0aW1lc3RhbXBzIiwgT0ZGU0VUKHJlc2FtcGxlKSwgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAgIDAsIDEsICAgICAgIEF8RiB9LAotICAgIHsgIm1pbl9kZWx0YSIsICAiTWluaW11bSBkaWZmZXJlbmNlIGJldHdlZW4gdGltZXN0YW1wcyBhbmQgYXVkaW8gZGF0YSAiCi0gICAgICAgICAgICAgICAgICAgICIoaW4gc2Vjb25kcykgdG8gdHJpZ2dlciBwYWRkaW5nL3RyaW1taW4gdGhlIGRhdGEuIiwgICAgICAgIE9GRlNFVChtaW5fZGVsdGFfc2VjKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDAuMSB9LCAwLCBJTlRfTUFYLCBBfEYgfSwKLSAgICB7ICJtYXhfY29tcCIsICAgIk1heGltdW0gY29tcGVuc2F0aW9uIGluIHNhbXBsZXMgcGVyIHNlY29uZC4iLCAgICAgICAgICAgICAgT0ZGU0VUKG1heF9jb21wKSwgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgeyAuaTY0ID0gNTAwIH0sIDAsIElOVF9NQVgsIEF8RiB9LAotICAgIHsgImZpcnN0X3B0cyIsICAiQXNzdW1lIHRoZSBmaXJzdCBwdHMgc2hvdWxkIGJlIHRoaXMgdmFsdWUuIiwgICAgICAgICAgICAgICBPRkZTRVQoZmlyc3RfcHRzKSwgICAgIEFWX09QVF9UWVBFX0lOVDY0LCB7IC5pNjQgPSBBVl9OT1BUU19WQUxVRSB9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgQXxGIH0sCi0gICAgeyBOVUxMIH0KLX07Ci0KLUFWRklMVEVSX0RFRklORV9DTEFTUyhhc3luY3RzKTsKLQotc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCi17Ci0gICAgQVN5bmNDb250ZXh0ICpzID0gY3R4LT5wcml2OwotCi0gICAgcy0+cHRzICAgICAgICAgPSBBVl9OT1BUU19WQUxVRTsKLSAgICBzLT5maXJzdF9mcmFtZSA9IDE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCi17Ci0gICAgQVN5bmNDb250ZXh0ICpzID0gY3R4LT5wcml2OwotCi0gICAgaWYgKHMtPmF2cikgewotICAgICAgICBhdnJlc2FtcGxlX2Nsb3NlKHMtPmF2cik7Ci0gICAgICAgIGF2cmVzYW1wbGVfZnJlZSgmcy0+YXZyKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqbGluaykKLXsKLSAgICBBU3luY0NvbnRleHQgKnMgPSBsaW5rLT5zcmMtPnByaXY7Ci0gICAgaW50IHJldDsKLQotICAgIHMtPm1pbl9kZWx0YSA9IHMtPm1pbl9kZWx0YV9zZWMgKiBsaW5rLT5zYW1wbGVfcmF0ZTsKLSAgICBsaW5rLT50aW1lX2Jhc2UgPSAoQVZSYXRpb25hbCl7MSwgbGluay0+c2FtcGxlX3JhdGV9OwotCi0gICAgcy0+YXZyID0gYXZyZXNhbXBsZV9hbGxvY19jb250ZXh0KCk7Ci0gICAgaWYgKCFzLT5hdnIpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICBhdl9vcHRfc2V0X2ludChzLT5hdnIsICAiaW5fY2hhbm5lbF9sYXlvdXQiLCBsaW5rLT5jaGFubmVsX2xheW91dCwgMCk7Ci0gICAgYXZfb3B0X3NldF9pbnQocy0+YXZyLCAib3V0X2NoYW5uZWxfbGF5b3V0IiwgbGluay0+Y2hhbm5lbF9sYXlvdXQsIDApOwotICAgIGF2X29wdF9zZXRfaW50KHMtPmF2ciwgICJpbl9zYW1wbGVfZm10IiwgICAgIGxpbmstPmZvcm1hdCwgICAgICAgICAwKTsKLSAgICBhdl9vcHRfc2V0X2ludChzLT5hdnIsICJvdXRfc2FtcGxlX2ZtdCIsICAgICBsaW5rLT5mb3JtYXQsICAgICAgICAgMCk7Ci0gICAgYXZfb3B0X3NldF9pbnQocy0+YXZyLCAgImluX3NhbXBsZV9yYXRlIiwgICAgbGluay0+c2FtcGxlX3JhdGUsICAgIDApOwotICAgIGF2X29wdF9zZXRfaW50KHMtPmF2ciwgIm91dF9zYW1wbGVfcmF0ZSIsICAgIGxpbmstPnNhbXBsZV9yYXRlLCAgICAwKTsKLQotICAgIGlmIChzLT5yZXNhbXBsZSkKLSAgICAgICAgYXZfb3B0X3NldF9pbnQocy0+YXZyLCAiZm9yY2VfcmVzYW1wbGluZyIsIDEsIDApOwotCi0gICAgaWYgKChyZXQgPSBhdnJlc2FtcGxlX29wZW4ocy0+YXZyKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIGdldCBhbW91bnQgb2YgZGF0YSBjdXJyZW50bHkgYnVmZmVyZWQsIGluIHNhbXBsZXMgKi8KLXN0YXRpYyBpbnQ2NF90IGdldF9kZWxheShBU3luY0NvbnRleHQgKnMpCi17Ci0gICAgcmV0dXJuIGF2cmVzYW1wbGVfYXZhaWxhYmxlKHMtPmF2cikgKyBhdnJlc2FtcGxlX2dldF9kZWxheShzLT5hdnIpOwotfQotCi1zdGF0aWMgdm9pZCBoYW5kbGVfdHJpbW1pbmcoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCi17Ci0gICAgQVN5bmNDb250ZXh0ICpzID0gY3R4LT5wcml2OwotCi0gICAgaWYgKHMtPnB0cyA8IHMtPmZpcnN0X3B0cykgewotICAgICAgICBpbnQgZGVsdGEgPSBGRk1JTihzLT5maXJzdF9wdHMgLSBzLT5wdHMsIGF2cmVzYW1wbGVfYXZhaWxhYmxlKHMtPmF2cikpOwotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlRyaW1taW5nICVkIHNhbXBsZXMgZnJvbSBzdGFydFxuIiwKLSAgICAgICAgICAgICAgIGRlbHRhKTsKLSAgICAgICAgYXZyZXNhbXBsZV9yZWFkKHMtPmF2ciwgTlVMTCwgZGVsdGEpOwotICAgICAgICBzLT5wdHMgKz0gZGVsdGE7Ci0gICAgfSBlbHNlIGlmIChzLT5maXJzdF9mcmFtZSkKLSAgICAgICAgcy0+cHRzID0gcy0+Zmlyc3RfcHRzOwotfQotCi1zdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKQotewotICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+c3JjOwotICAgIEFTeW5jQ29udGV4dCAgICAgICpzID0gY3R4LT5wcml2OwotICAgIGludCByZXQgPSAwOwotICAgIGludCBuYl9zYW1wbGVzOwotCi0gICAgcy0+Z290X291dHB1dCA9IDA7Ci0gICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7Ci0KLSAgICAvKiBmbHVzaCB0aGUgZmlmbyAqLwotICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKLSAgICAgICAgaWYgKHMtPmZpcnN0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgICAgIGhhbmRsZV90cmltbWluZyhjdHgpOwotCi0gICAgICAgIGlmIChuYl9zYW1wbGVzID0gZ2V0X2RlbGF5KHMpKSB7Ci0gICAgICAgICAgICBBVkZyYW1lICpidWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGxpbmssIG5iX3NhbXBsZXMpOwotICAgICAgICAgICAgaWYgKCFidWYpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIHJldCA9IGF2cmVzYW1wbGVfY29udmVydChzLT5hdnIsIGJ1Zi0+ZXh0ZW5kZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPmxpbmVzaXplWzBdLCBuYl9zYW1wbGVzLCBOVUxMLCAwLCAwKTsKLSAgICAgICAgICAgIGlmIChyZXQgPD0gMCkgewotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IEFWRVJST1JfRU9GOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWYtPnB0cyA9IHMtPnB0czsKLSAgICAgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUobGluaywgYnVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd3JpdGVfdG9fZmlmbyhBU3luY0NvbnRleHQgKnMsIEFWRnJhbWUgKmJ1ZikKLXsKLSAgICBpbnQgcmV0ID0gYXZyZXNhbXBsZV9jb252ZXJ0KHMtPmF2ciwgTlVMTCwgMCwgMCwgYnVmLT5leHRlbmRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5saW5lc2l6ZVswXSwgYnVmLT5uYl9zYW1wbGVzKTsKLSAgICBhdl9mcmFtZV9mcmVlKCZidWYpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCi17Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICAqY3R4ID0gaW5saW5rLT5kc3Q7Ci0gICAgQVN5bmNDb250ZXh0ICAgICAgICpzID0gY3R4LT5wcml2OwotICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKLSAgICBpbnQgbmJfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoYnVmLT5jaGFubmVsX2xheW91dCk7Ci0gICAgaW50NjRfdCBwdHMgPSAoYnVmLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpID8gYnVmLT5wdHMgOgotICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKGJ1Zi0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSwgb3V0bGluay0+dGltZV9iYXNlKTsKLSAgICBpbnQgb3V0X3NpemUsIHJldDsKLSAgICBpbnQ2NF90IGRlbHRhOwotICAgIGludDY0X3QgbmV3X3B0czsKLQotICAgIC8qIGJ1ZmZlciBkYXRhIHVudGlsIHdlIGdldCB0aGUgbmV4dCB0aW1lc3RhbXAgKi8KLSAgICBpZiAocy0+cHRzID09IEFWX05PUFRTX1ZBTFVFIHx8IHB0cyA9PSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICBpZiAocHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgICAgICBzLT5wdHMgPSBwdHMgLSBnZXRfZGVsYXkocyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHdyaXRlX3RvX2ZpZm8ocywgYnVmKTsKLSAgICB9Ci0KLSAgICBpZiAocy0+Zmlyc3RfcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgIGhhbmRsZV90cmltbWluZyhjdHgpOwotICAgICAgICBpZiAoIWF2cmVzYW1wbGVfYXZhaWxhYmxlKHMtPmF2cikpCi0gICAgICAgICAgICByZXR1cm4gd3JpdGVfdG9fZmlmbyhzLCBidWYpOwotICAgIH0KLQotICAgIC8qIHdoZW4gd2UgaGF2ZSB0d28gdGltZXN0YW1wcywgY29tcHV0ZSBob3cgbWFueSBzYW1wbGVzIHdvdWxkIHdlIGhhdmUKLSAgICAgKiB0byBhZGQvcmVtb3ZlIHRvIGdldCBwcm9wZXIgc3luYyBiZXR3ZWVuIGRhdGEgYW5kIHRpbWVzdGFtcHMgKi8KLSAgICBkZWx0YSAgICA9IHB0cyAtIHMtPnB0cyAtIGdldF9kZWxheShzKTsKLSAgICBvdXRfc2l6ZSA9IGF2cmVzYW1wbGVfYXZhaWxhYmxlKHMtPmF2cik7Ci0KLSAgICBpZiAobGxhYnMoZGVsdGEpID4gcy0+bWluX2RlbHRhIHx8Ci0gICAgICAgIChzLT5maXJzdF9mcmFtZSAmJiBkZWx0YSAmJiBzLT5maXJzdF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpKSB7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiRGlzY29udGludWl0eSAtICUiUFJJZDY0IiBzYW1wbGVzLlxuIiwgZGVsdGEpOwotICAgICAgICBvdXRfc2l6ZSA9IGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KW91dF9zaXplICsgZGVsdGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChzLT5yZXNhbXBsZSkgewotICAgICAgICAgICAgLy8gYWRqdXN0IHRoZSBjb21wZW5zYXRpb24gaWYgZGVsdGEgaXMgbm9uLXplcm8KLSAgICAgICAgICAgIGludCBkZWxheSA9IGdldF9kZWxheShzKTsKLSAgICAgICAgICAgIGludCBjb21wID0gcy0+Y29tcCArIGF2X2NsaXAoZGVsdGEgKiBpbmxpbmstPnNhbXBsZV9yYXRlIC8gZGVsYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zLT5tYXhfY29tcCwgcy0+bWF4X2NvbXApOwotICAgICAgICAgICAgaWYgKGNvbXAgIT0gcy0+Y29tcCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ29tcGVuc2F0aW5nICVkIHNhbXBsZXMgcGVyIHNlY29uZC5cbiIsIGNvbXApOwotICAgICAgICAgICAgICAgIGlmIChhdnJlc2FtcGxlX3NldF9jb21wZW5zYXRpb24ocy0+YXZyLCBjb21wLCBpbmxpbmstPnNhbXBsZV9yYXRlKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHMtPmNvbXAgPSBjb21wOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBhZGp1c3QgUFRTIHRvIGF2b2lkIG1vbm90b25pY2l0eSBlcnJvcnMgd2l0aCBpbnB1dCBQVFMgaml0dGVyCi0gICAgICAgIHB0cyAtPSBkZWx0YTsKLSAgICAgICAgZGVsdGEgPSAwOwotICAgIH0KLQotICAgIGlmIChvdXRfc2l6ZSA+IDApIHsKLSAgICAgICAgQVZGcmFtZSAqYnVmX291dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgb3V0X3NpemUpOwotICAgICAgICBpZiAoIWJ1Zl9vdXQpIHsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5maXJzdF9mcmFtZSAmJiBkZWx0YSA+IDApIHsKLSAgICAgICAgICAgIGludCBwbGFuYXIgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihidWZfb3V0LT5mb3JtYXQpOwotICAgICAgICAgICAgaW50IHBsYW5lcyA9IHBsYW5hciA/ICBuYl9jaGFubmVscyA6IDE7Ci0gICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGJ1Zl9vdXQtPmZvcm1hdCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGxhbmFyID8gMSA6IG5iX2NoYW5uZWxzKTsKLQotICAgICAgICAgICAgaW50IGNoOwotCi0gICAgICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKGJ1Zl9vdXQtPmV4dGVuZGVkX2RhdGEsIDAsIGRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9jaGFubmVscywgYnVmLT5mb3JtYXQpOwotCi0gICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBwbGFuZXM7IGNoKyspCi0gICAgICAgICAgICAgICAgYnVmX291dC0+ZXh0ZW5kZWRfZGF0YVtjaF0gKz0gZGVsdGEgKiBibG9ja19zaXplOwotCi0gICAgICAgICAgICBhdnJlc2FtcGxlX3JlYWQocy0+YXZyLCBidWZfb3V0LT5leHRlbmRlZF9kYXRhLCBvdXRfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHBsYW5lczsgY2grKykKLSAgICAgICAgICAgICAgICBidWZfb3V0LT5leHRlbmRlZF9kYXRhW2NoXSAtPSBkZWx0YSAqIGJsb2NrX3NpemU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdnJlc2FtcGxlX3JlYWQocy0+YXZyLCBidWZfb3V0LT5leHRlbmRlZF9kYXRhLCBvdXRfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGlmIChkZWx0YSA+IDApIHsKLSAgICAgICAgICAgICAgICBhdl9zYW1wbGVzX3NldF9zaWxlbmNlKGJ1Zl9vdXQtPmV4dGVuZGVkX2RhdGEsIG91dF9zaXplIC0gZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSwgbmJfY2hhbm5lbHMsIGJ1Zi0+Zm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBidWZfb3V0LT5wdHMgPSBzLT5wdHM7Ci0gICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBidWZfb3V0KTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIHMtPmdvdF9vdXRwdXQgPSAxOwotICAgIH0gZWxzZSBpZiAoYXZyZXNhbXBsZV9hdmFpbGFibGUocy0+YXZyKSkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIk5vbi1tb25vdG9ub3VzIHRpbWVzdGFtcHMsIGRyb3BwaW5nICIKLSAgICAgICAgICAgICAgICJ3aG9sZSBidWZmZXIuXG4iKTsKLSAgICB9Ci0KLSAgICAvKiBkcmFpbiBhbnkgcmVtYWluaW5nIGJ1ZmZlcmVkIGRhdGEgKi8KLSAgICBhdnJlc2FtcGxlX3JlYWQocy0+YXZyLCBOVUxMLCBhdnJlc2FtcGxlX2F2YWlsYWJsZShzLT5hdnIpKTsKLQotICAgIG5ld19wdHMgPSBwdHMgLSBhdnJlc2FtcGxlX2dldF9kZWxheShzLT5hdnIpOwotICAgIC8qIGNoZWNrIGZvciBzLT5wdHMgbW9ub3RvbmljaXR5ICovCi0gICAgaWYgKG5ld19wdHMgPiBzLT5wdHMpIHsKLSAgICAgICAgcy0+cHRzID0gbmV3X3B0czsKLSAgICAgICAgcmV0ID0gYXZyZXNhbXBsZV9jb252ZXJ0KHMtPmF2ciwgTlVMTCwgMCwgMCwgYnVmLT5leHRlbmRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLT5saW5lc2l6ZVswXSwgYnVmLT5uYl9zYW1wbGVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIk5vbi1tb25vdG9ub3VzIHRpbWVzdGFtcHMsIGRyb3BwaW5nICIKLSAgICAgICAgICAgICAgICJ3aG9sZSBidWZmZXIuXG4iKTsKLSAgICAgICAgcmV0ID0gMDsKLSAgICB9Ci0KLSAgICBzLT5maXJzdF9mcmFtZSA9IDA7Ci1mYWlsOgotICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfYXN5bmN0c19pbnB1dHNbXSA9IHsKLSAgICB7Ci0gICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAotICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSAgPSBmaWx0ZXJfZnJhbWUKLSAgICB9LAotICAgIHsgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfYXN5bmN0c19vdXRwdXRzW10gPSB7Ci0gICAgewotICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKLSAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCi0gICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzLAotICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUKLSAgICB9LAotICAgIHsgTlVMTCB9Ci19OwotCi1BVkZpbHRlciBmZl9hZl9hc3luY3RzID0gewotICAgIC5uYW1lICAgICAgICA9ICJhc3luY3RzIiwKLSAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU3luYyBhdWRpbyBkYXRhIHRvIHRpbWVzdGFtcHMuIiksCi0gICAgLmluaXQgICAgICAgID0gaW5pdCwKLSAgICAudW5pbml0ICAgICAgPSB1bmluaXQsCi0gICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKEFTeW5jQ29udGV4dCksCi0gICAgLnByaXZfY2xhc3MgID0gJmFzeW5jdHNfY2xhc3MsCi0gICAgLmlucHV0cyAgICAgID0gYXZmaWx0ZXJfYWZfYXN5bmN0c19pbnB1dHMsCi0gICAgLm91dHB1dHMgICAgID0gYXZmaWx0ZXJfYWZfYXN5bmN0c19vdXRwdXRzLAotfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2F0ZW1wby5jIGIvbGliYXZmaWx0ZXIvYWZfYXRlbXBvLmMKaW5kZXggN2IzZDU3Yy4uOGIyMTRiYyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYXRlbXBvLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfYXRlbXBvLmMKQEAgLTUzLDcgKzUzLDcgQEAKIC8qKgogICogQSBmcmFnbWVudCBvZiBhdWRpbyB3YXZlZm9ybQogICovCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBBdWRpb0ZyYWdtZW50IHsKICAgICAvLyBpbmRleCBvZiB0aGUgZmlyc3Qgc2FtcGxlIG9mIHRoaXMgZnJhZ21lbnQgaW4gdGhlIG92ZXJhbGwgd2F2ZWZvcm07CiAgICAgLy8gMDogaW5wdXQgc2FtcGxlIHBvc2l0aW9uCiAgICAgLy8gMTogb3V0cHV0IHNhbXBsZSBwb3NpdGlvbgpAQCAtODQsNyArODQsNyBAQAogLyoqCiAgKiBGaWx0ZXIgc3RhdGUgbWFjaGluZQogICovCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBBVGVtcG9Db250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKIAogICAgIC8vIHJpbmctYnVmZmVyIG9mIGlucHV0IHNhbXBsZXMsIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgdGltZXMKQEAgLTY5NywxMSArNjk3LDExIEBACiAgICAgQXVkaW9GcmFnbWVudCAgICAgICAqZnJhZyA9IHlhZV9jdXJyX2ZyYWcoYXRlbXBvKTsKIAogICAgIGNvbnN0IGRvdWJsZSBwcmV2X291dHB1dF9wb3NpdGlvbiA9Ci0gICAgICAgIChkb3VibGUpKHByZXYtPnBvc2l0aW9uWzFdIC0gYXRlbXBvLT5vcmlnaW5bMV0gKyBhdGVtcG8tPndpbmRvdyAvIDIpOworICAgICAgICAoZG91YmxlKShwcmV2LT5wb3NpdGlvblsxXSAtIGF0ZW1wby0+b3JpZ2luWzFdICsgYXRlbXBvLT53aW5kb3cgLyAyKSAqCisgICAgICAgIGF0ZW1wby0+dGVtcG87CiAKICAgICBjb25zdCBkb3VibGUgaWRlYWxfb3V0cHV0X3Bvc2l0aW9uID0KLSAgICAgICAgKGRvdWJsZSkocHJldi0+cG9zaXRpb25bMF0gLSBhdGVtcG8tPm9yaWdpblswXSArIGF0ZW1wby0+d2luZG93IC8gMikgLwotICAgICAgICBhdGVtcG8tPnRlbXBvOworICAgICAgICAoZG91YmxlKShwcmV2LT5wb3NpdGlvblswXSAtIGF0ZW1wby0+b3JpZ2luWzBdICsgYXRlbXBvLT53aW5kb3cgLyAyKTsKIAogICAgIGNvbnN0IGludCBkcmlmdCA9IChpbnQpKHByZXZfb3V0cHV0X3Bvc2l0aW9uIC0gaWRlYWxfb3V0cHV0X3Bvc2l0aW9uKTsKIApAQCAtOTE0LDYgKzkxNCwxMSBAQAogCiAgICAgYXRlbXBvLT5zdGF0ZSA9IFlBRV9GTFVTSF9PVVRQVVQ7CiAKKyAgICBpZiAoIWF0ZW1wby0+bmZyYWcpIHsKKyAgICAgICAgLy8gdGhlcmUgaXMgbm90aGluZyB0byBmbHVzaDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAgICAgaWYgKGF0ZW1wby0+cG9zaXRpb25bMF0gPT0gZnJhZy0+cG9zaXRpb25bMF0gKyBmcmFnLT5uc2FtcGxlcyAmJgogICAgICAgICBhdGVtcG8tPnBvc2l0aW9uWzFdID09IGZyYWctPnBvc2l0aW9uWzFdICsgZnJhZy0+bnNhbXBsZXMpIHsKICAgICAgICAgLy8gdGhlIGN1cnJlbnQgZnJhZ21lbnQgaXMgYWxyZWFkeSBmbHVzaGVkOgpAQCAtMTAxNCw3ICsxMDE5LDcgQEAKICAgICB9OwogICAgIGludCByZXQ7CiAKLSAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfbGF5b3V0cygpOworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKICAgICBpZiAoIWxheW91dHMpIHsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CkBAIC0xMDQ0LDkgKzEwNDksOCBAQAogCiAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQgPSBpbmxpbmstPmZvcm1hdDsKICAgICBpbnQgc2FtcGxlX3JhdGUgPSAoaW50KWlubGluay0+c2FtcGxlX3JhdGU7Ci0gICAgaW50IGNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGlubGluay0+Y2hhbm5lbF9sYXlvdXQpOwogCi0gICAgcmV0dXJuIHlhZV9yZXNldChhdGVtcG8sIGZvcm1hdCwgc2FtcGxlX3JhdGUsIGNoYW5uZWxzKTsKKyAgICByZXR1cm4geWFlX3Jlc2V0KGF0ZW1wbywgZm9ybWF0LCBzYW1wbGVfcmF0ZSwgaW5saW5rLT5jaGFubmVscyk7CiB9CiAKIHN0YXRpYyBpbnQgcHVzaF9zYW1wbGVzKEFUZW1wb0NvbnRleHQgKmF0ZW1wbywKQEAgLTEwOTEsOCArMTA5NSwxMCBAQAogICAgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CiAgICAgICAgIGlmICghYXRlbXBvLT5kc3RfYnVmZmVyKSB7CiAgICAgICAgICAgICBhdGVtcG8tPmRzdF9idWZmZXIgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5fb3V0KTsKLSAgICAgICAgICAgIGlmICghYXRlbXBvLT5kc3RfYnVmZmVyKQorICAgICAgICAgICAgaWYgKCFhdGVtcG8tPmRzdF9idWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZzcmNfYnVmZmVyKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhhdGVtcG8tPmRzdF9idWZmZXIsIHNyY19idWZmZXIpOwogCiAgICAgICAgICAgICBhdGVtcG8tPmRzdCA9IGF0ZW1wby0+ZHN0X2J1ZmZlci0+ZGF0YVswXTsKQEAgLTExNDcsNiArMTE1Myw4IEBACiAKICAgICAgICAgICAgIGlmIChuX291dCkgewogICAgICAgICAgICAgICAgIHJldCA9IHB1c2hfc2FtcGxlcyhhdGVtcG8sIG91dGxpbmssIG5fb3V0KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9iaXF1YWRzLmMgYi9saWJhdmZpbHRlci9hZl9iaXF1YWRzLmMKaW5kZXggNDk1MzIwMi4uZDVjMzgyMyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYmlxdWFkcy5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2JpcXVhZHMuYwpAQCAtNzMsNyArNzMsNiBAQAogICAgIGVxdWFsaXplciwKICAgICBiYXNzLAogICAgIHRyZWJsZSwKLSAgICBiYW5kLAogICAgIGJhbmRwYXNzLAogICAgIGJhbmRyZWplY3QsCiAgICAgYWxscGFzcywKQEAgLTg3LDYgKzg2LDggQEAKICAgICBPQ1RBVkUsCiAgICAgUUZBQ1RPUiwKICAgICBTTE9QRSwKKyAgICBLSEVSVFosCisgICAgTkJfV1RZUEUsCiB9OwogCiB0eXBlZGVmIHN0cnVjdCBDaGFuQ2FjaGUgewpAQCAtMTA1LDEyICsxMDYsMTQgQEAKICAgICBkb3VibGUgZ2FpbjsKICAgICBkb3VibGUgZnJlcXVlbmN5OwogICAgIGRvdWJsZSB3aWR0aDsKKyAgICB1aW50NjRfdCBjaGFubmVsczsKIAogICAgIGRvdWJsZSBhMCwgYTEsIGEyOwogICAgIGRvdWJsZSBiMCwgYjEsIGIyOwogCiAgICAgQ2hhbkNhY2hlICpjYWNoZTsKICAgICBpbnQgY2xpcHBpbmdzOworICAgIGludCBibG9ja19hbGlnbjsKIAogICAgIHZvaWQgKCpmaWx0ZXIpKHN0cnVjdCBCaXF1YWRzQ29udGV4dCAqcywgY29uc3Qgdm9pZCAqaWJ1Ziwgdm9pZCAqb2J1ZiwgaW50IGxlbiwKICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmkxLCBkb3VibGUgKmkyLCBkb3VibGUgKm8xLCBkb3VibGUgKm8yLApAQCAtMjM1LDcgKzIzOCw3IEBACiBCSVFVQURfRklMVEVSKGZsdCwgZmxvYXQsICAgLTEuLCAxLiwgMCkKIEJJUVVBRF9GSUxURVIoZGJsLCBkb3VibGUsICAtMS4sIDEuLCAwKQogCi1zdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQorc3RhdGljIGludCBjb25maWdfZmlsdGVyKEFWRmlsdGVyTGluayAqb3V0bGluaywgaW50IHJlc2V0KQogewogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICAgID0gb3V0bGluay0+c3JjOwogICAgIEJpcXVhZHNDb250ZXh0ICpzICAgICAgID0gY3R4LT5wcml2OwpAQCAtMjU4LDYgKzI2MSw5IEBACiAgICAgY2FzZSBIRVJUWjoKICAgICAgICAgYWxwaGEgPSBzaW4odzApIC8gKDIgKiBzLT5mcmVxdWVuY3kgLyBzLT53aWR0aCk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgS0hFUlRaOgorICAgICAgICBhbHBoYSA9IHNpbih3MCkgLyAoMiAqIHMtPmZyZXF1ZW5jeSAvIChzLT53aWR0aCAqIDEwMDApKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBPQ1RBVkU6CiAgICAgICAgIGFscGhhID0gc2luKHcwKSAqIHNpbmgobG9nKDIuKSAvIDIgKiBzLT53aWR0aCAqIHcwIC8gc2luKHcwKSk7CiAgICAgICAgIGJyZWFrOwpAQCAtMzY5LDE2ICszNzUsMjAgQEAKICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKICAgICB9CiAKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgImE9JWxmICVsZiAlbGY6Yj0lbGYgJWxmICVsZlxuIiwgcy0+YTAsIHMtPmExLCBzLT5hMiwgcy0+YjAsIHMtPmIxLCBzLT5iMik7CisKICAgICBzLT5hMSAvPSBzLT5hMDsKICAgICBzLT5hMiAvPSBzLT5hMDsKICAgICBzLT5iMCAvPSBzLT5hMDsKICAgICBzLT5iMSAvPSBzLT5hMDsKICAgICBzLT5iMiAvPSBzLT5hMDsKKyAgICBzLT5hMCAvPSBzLT5hMDsKIAogICAgIHMtPmNhY2hlID0gYXZfcmVhbGxvY19mKHMtPmNhY2hlLCBzaXplb2YoQ2hhbkNhY2hlKSwgaW5saW5rLT5jaGFubmVscyk7CiAgICAgaWYgKCFzLT5jYWNoZSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBtZW1zZXQocy0+Y2FjaGUsIDAsIHNpemVvZihDaGFuQ2FjaGUpICogaW5saW5rLT5jaGFubmVscyk7CisgICAgaWYgKHJlc2V0KQorICAgICAgICBtZW1zZXQocy0+Y2FjaGUsIDAsIHNpemVvZihDaGFuQ2FjaGUpICogaW5saW5rLT5jaGFubmVscyk7CiAKICAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CiAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNlA6IHMtPmZpbHRlciA9IGJpcXVhZF9zMTY7IGJyZWFrOwpAQCAtMzg4LDkgKzM5OCwxNiBAQAogICAgIGRlZmF1bHQ6IGF2X2Fzc2VydDAoMCk7CiAgICAgfQogCisgICAgcy0+YmxvY2tfYWxpZ24gPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShpbmxpbmstPmZvcm1hdCk7CisKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICByZXR1cm4gY29uZmlnX2ZpbHRlcihvdXRsaW5rLCAxKTsKK30KKwogc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmJ1ZikKIHsKICAgICBBVkZpbHRlckNvbnRleHQgICpjdHggPSBpbmxpbmstPmRzdDsKQEAgLTQwMyw3ICs0MjAsNyBAQAogICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShidWYpKSB7CiAgICAgICAgIG91dF9idWYgPSBidWY7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0X2J1ZiA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgb3V0X2J1ZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7CiAgICAgICAgIGlmICghb3V0X2J1ZikgewogICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC00MTEsMTUgKzQyOCwyMiBAQAogICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dF9idWYsIGJ1Zik7CiAgICAgfQogCi0gICAgZm9yIChjaCA9IDA7IGNoIDwgYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGJ1Zik7IGNoKyspCisgICAgZm9yIChjaCA9IDA7IGNoIDwgYnVmLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBpZiAoISgoYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKGlubGluay0+Y2hhbm5lbF9sYXlvdXQsIGNoKSAmIHMtPmNoYW5uZWxzKSkpIHsKKyAgICAgICAgICAgIGlmIChidWYgIT0gb3V0X2J1ZikKKyAgICAgICAgICAgICAgICBtZW1jcHkob3V0X2J1Zi0+ZXh0ZW5kZWRfZGF0YVtjaF0sIGJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjaF0sIG5iX3NhbXBsZXMgKiBzLT5ibG9ja19hbGlnbik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogICAgICAgICBzLT5maWx0ZXIocywgYnVmLT5leHRlbmRlZF9kYXRhW2NoXSwKICAgICAgICAgICAgICAgICAgIG91dF9idWYtPmV4dGVuZGVkX2RhdGFbY2hdLCBuYl9zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgJnMtPmNhY2hlW2NoXS5pMSwgJnMtPmNhY2hlW2NoXS5pMiwKICAgICAgICAgICAgICAgICAgICZzLT5jYWNoZVtjaF0ubzEsICZzLT5jYWNoZVtjaF0ubzIsCiAgICAgICAgICAgICAgICAgICBzLT5iMCwgcy0+YjEsIHMtPmIyLCBzLT5hMSwgcy0+YTIpOworICAgIH0KIAogICAgIGlmIChzLT5jbGlwcGluZ3MgPiAwKQogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgImNsaXBwaW5nICVkIHRpbWVzLiBQbGVhc2UgcmVkdWNlIGdhaW4uXG4iLCBzLT5jbGlwcGluZ3MpOworICAgIHMtPmNsaXBwaW5ncyA9IDA7CiAKICAgICBpZiAoYnVmICE9IG91dF9idWYpCiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CkBAIC00MjcsNiArNDUxLDExNyBAQAogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0X2J1Zik7CiB9CiAKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXMsIGludCByZXNfbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgQmlxdWFkc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworCisgICAgaWYgKCghc3RyY21wKGNtZCwgImZyZXF1ZW5jeSIpIHx8ICFzdHJjbXAoY21kLCAiZiIpKSAmJgorICAgICAgICAocy0+ZmlsdGVyX3R5cGUgPT0gZXF1YWxpemVyIHx8CisgICAgICAgICBzLT5maWx0ZXJfdHlwZSA9PSBiYXNzICAgICAgfHwKKyAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IHRyZWJsZSAgICB8fAorICAgICAgICAgcy0+ZmlsdGVyX3R5cGUgPT0gYmFuZHBhc3MgIHx8CisgICAgICAgICBzLT5maWx0ZXJfdHlwZSA9PSBiYW5kcmVqZWN0fHwKKyAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IGxvd3Bhc3MgICB8fAorICAgICAgICAgcy0+ZmlsdGVyX3R5cGUgPT0gaGlnaHBhc3MgIHx8CisgICAgICAgICBzLT5maWx0ZXJfdHlwZSA9PSBhbGxwYXNzKSkgeworICAgICAgICBkb3VibGUgZnJlcTsKKworICAgICAgICBpZiAoc3NjYW5mKGFyZ3MsICIlbGYiLCAmZnJlcSkgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmVxdWVuY3kgdmFsdWUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBzLT5mcmVxdWVuY3kgPSBmcmVxOworICAgIH0gZWxzZSBpZiAoKCFzdHJjbXAoY21kLCAiZ2FpbiIpIHx8ICFzdHJjbXAoY21kLCAiZyIpKSAmJgorICAgICAgICAocy0+ZmlsdGVyX3R5cGUgPT0gZXF1YWxpemVyIHx8CisgICAgICAgICBzLT5maWx0ZXJfdHlwZSA9PSBiYXNzICAgICAgfHwKKyAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IHRyZWJsZSkpIHsKKyAgICAgICAgZG91YmxlIGdhaW47CisKKyAgICAgICAgaWYgKHNzY2FuZihhcmdzLCAiJWxmIiwgJmdhaW4pICE9IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZ2FpbiB2YWx1ZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPmdhaW4gPSBnYWluOworICAgIH0gZWxzZSBpZiAoKCFzdHJjbXAoY21kLCAid2lkdGgiKSB8fCAhc3RyY21wKGNtZCwgInciKSkgJiYKKyAgICAgICAgKHMtPmZpbHRlcl90eXBlID09IGVxdWFsaXplciB8fAorICAgICAgICAgcy0+ZmlsdGVyX3R5cGUgPT0gYmFzcyAgICAgIHx8CisgICAgICAgICBzLT5maWx0ZXJfdHlwZSA9PSB0cmVibGUgICAgfHwKKyAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IGJhbmRwYXNzICB8fAorICAgICAgICAgcy0+ZmlsdGVyX3R5cGUgPT0gYmFuZHJlamVjdHx8CisgICAgICAgICBzLT5maWx0ZXJfdHlwZSA9PSBsb3dwYXNzICAgfHwKKyAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IGhpZ2hwYXNzICB8fAorICAgICAgICAgcy0+ZmlsdGVyX3R5cGUgPT0gYWxscGFzcykpIHsKKyAgICAgICAgZG91YmxlIHdpZHRoOworCisgICAgICAgIGlmIChzc2NhbmYoYXJncywgIiVsZiIsICZ3aWR0aCkgIT0gMSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB3aWR0aCB2YWx1ZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPndpZHRoID0gd2lkdGg7CisgICAgfSBlbHNlIGlmICgoIXN0cmNtcChjbWQsICJ3aWR0aF90eXBlIikgfHwgIXN0cmNtcChjbWQsICJ0IikpICYmCisgICAgICAgIChzLT5maWx0ZXJfdHlwZSA9PSBlcXVhbGl6ZXIgfHwKKyAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IGJhc3MgICAgICB8fAorICAgICAgICAgcy0+ZmlsdGVyX3R5cGUgPT0gdHJlYmxlICAgIHx8CisgICAgICAgICBzLT5maWx0ZXJfdHlwZSA9PSBiYW5kcGFzcyAgfHwKKyAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IGJhbmRyZWplY3R8fAorICAgICAgICAgcy0+ZmlsdGVyX3R5cGUgPT0gbG93cGFzcyAgIHx8CisgICAgICAgICBzLT5maWx0ZXJfdHlwZSA9PSBoaWdocGFzcyAgfHwKKyAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IGFsbHBhc3MpKSB7CisgICAgICAgIGNoYXIgd2lkdGhfdHlwZTsKKworICAgICAgICBpZiAoc3NjYW5mKGFyZ3MsICIlYyIsICZ3aWR0aF90eXBlKSAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHdpZHRoX3R5cGUgdmFsdWUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKHdpZHRoX3R5cGUpIHsKKyAgICAgICAgY2FzZSAnaCc6IHdpZHRoX3R5cGUgPSBIRVJUWjsgICBicmVhazsKKyAgICAgICAgY2FzZSAncSc6IHdpZHRoX3R5cGUgPSBRRkFDVE9SOyBicmVhazsKKyAgICAgICAgY2FzZSAnbyc6IHdpZHRoX3R5cGUgPSBPQ1RBVkU7ICBicmVhazsKKyAgICAgICAgY2FzZSAncyc6IHdpZHRoX3R5cGUgPSBTTE9QRTsgICBicmVhazsKKyAgICAgICAgY2FzZSAnayc6IHdpZHRoX3R5cGUgPSBLSEVSVFo7ICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgd2lkdGhfdHlwZSB2YWx1ZTogJWNcbiIsIHdpZHRoX3R5cGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHMtPndpZHRoX3R5cGUgPSB3aWR0aF90eXBlOworICAgIH0gZWxzZSBpZiAoKCFzdHJjbXAoY21kLCAiYTAiKSB8fAorICAgICAgICAgICAgICAgICFzdHJjbXAoY21kLCAiYTEiKSB8fAorICAgICAgICAgICAgICAgICFzdHJjbXAoY21kLCAiYTIiKSB8fAorICAgICAgICAgICAgICAgICFzdHJjbXAoY21kLCAiYjAiKSB8fAorICAgICAgICAgICAgICAgICFzdHJjbXAoY21kLCAiYjEiKSB8fAorICAgICAgICAgICAgICAgICFzdHJjbXAoY21kLCAiYjIiKSkgJiYKKyAgICAgICAgICAgICAgIHMtPmZpbHRlcl90eXBlID09IGJpcXVhZCkgeworICAgICAgICBkb3VibGUgdmFsdWU7CisKKyAgICAgICAgaWYgKHNzY2FuZihhcmdzLCAiJWxmIiwgJnZhbHVlKSAhPSAxKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGJpcXVhZCB2YWx1ZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3RyY21wKGNtZCwgImEwIikpCisgICAgICAgICAgICBzLT5hMCA9IHZhbHVlOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgImExIikpCisgICAgICAgICAgICBzLT5hMSA9IHZhbHVlOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgImEyIikpCisgICAgICAgICAgICBzLT5hMiA9IHZhbHVlOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgImIwIikpCisgICAgICAgICAgICBzLT5iMCA9IHZhbHVlOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgImIxIikpCisgICAgICAgICAgICBzLT5iMSA9IHZhbHVlOworICAgICAgICBlbHNlIGlmICghc3RyY21wKGNtZCwgImIyIikpCisgICAgICAgICAgICBzLT5iMiA9IHZhbHVlOworICAgIH0KKworICAgIHJldHVybiBjb25maWdfZmlsdGVyKG91dGxpbmssIDApOworfQorCiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBCaXF1YWRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKQEAgLTQ3NSwyMSArNjEwLDI2IEBACiAgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgLnByaXZfY2xhc3MgICAgPSAmbmFtZV8jI19jbGFzcywgICAgICAgICAgICAgICAgICAgICBcCisgICAgLnByb2Nlc3NfY29tbWFuZCA9IHByb2Nlc3NfY29tbWFuZCwgICAgICAgICAgICAgICAgICBcCiB9CiAKICNpZiBDT05GSUdfRVFVQUxJWkVSX0ZJTFRFUgogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGVxdWFsaXplcl9vcHRpb25zW10gPSB7CiAgICAgeyJmcmVxdWVuY3kiLCAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIDAsIDk5OTk5OSwgRkxBR1N9LAogICAgIHsiZiIsICAgICAgICAgInNldCBjZW50cmFsIGZyZXF1ZW5jeSIsIE9GRlNFVChmcmVxdWVuY3kpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAwLCA5OTk5OTksIEZMQUdTfSwKLSAgICB7IndpZHRoX3R5cGUiLCAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgU0xPUEUsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBOQl9XVFlQRS0xLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InQiLCAgICAgICAgICAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgTkJfV1RZUEUtMSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAotICAgIHsid2lkdGgiLCAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAwLCA5OTksIEZMQUdTfSwKLSAgICB7InciLCAgICAgInNldCBiYW5kLXdpZHRoIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgMCwgOTk5LCBGTEFHU30sCisgICAgeyJrIiwgImtIeiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1LSEVSVFp9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7IndpZHRoIiwgInNldCBiYW5kLXdpZHRoIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgMCwgOTk5OTksIEZMQUdTfSwKKyAgICB7InciLCAgICAgInNldCBiYW5kLXdpZHRoIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgMCwgOTk5OTksIEZMQUdTfSwKICAgICB7ImdhaW4iLCAic2V0IGdhaW4iLCBPRkZTRVQoZ2FpbiksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC05MDAsIDkwMCwgRkxBR1N9LAogICAgIHsiZyIsICAgICJzZXQgZ2FpbiIsIE9GRlNFVChnYWluKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTkwMCwgOTAwLCBGTEFHU30sCisgICAgeyJjaGFubmVscyIsICJzZXQgY2hhbm5lbHMgdG8gZmlsdGVyIiwgT0ZGU0VUKGNoYW5uZWxzKSwgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQsIHsuaTY0PS0xfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIEZMQUdTfSwKKyAgICB7ImMiLCAgICAgICAgInNldCBjaGFubmVscyB0byBmaWx0ZXIiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgey5pNjQ9LTF9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1N9LAogICAgIHtOVUxMfQogfTsKIApAQCAtNDk5LDE1ICs2MzksMTkgQEAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBiYXNzX29wdGlvbnNbXSA9IHsKICAgICB7ImZyZXF1ZW5jeSIsICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xMDB9LCAwLCA5OTk5OTksIEZMQUdTfSwKICAgICB7ImYiLCAgICAgICAgICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xMDB9LCAwLCA5OTk5OTksIEZMQUdTfSwKLSAgICB7IndpZHRoX3R5cGUiLCAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgU0xPUEUsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBOQl9XVFlQRS0xLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InQiLCAgICAgICAgICAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgTkJfV1RZUEUtMSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsiayIsICJrSHoiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9S0hFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJ3aWR0aCIsICJzZXQgc2hlbGYgdHJhbnNpdGlvbiBzdGVlcCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgOTk5OTksIEZMQUdTfSwKICAgICB7InciLCAgICAgInNldCBzaGVsZiB0cmFuc2l0aW9uIHN0ZWVwIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLjV9LCAwLCA5OTk5OSwgRkxBR1N9LAogICAgIHsiZ2FpbiIsICJzZXQgZ2FpbiIsIE9GRlNFVChnYWluKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTkwMCwgOTAwLCBGTEFHU30sCiAgICAgeyJnIiwgICAgInNldCBnYWluIiwgT0ZGU0VUKGdhaW4pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtOTAwLCA5MDAsIEZMQUdTfSwKKyAgICB7ImNoYW5uZWxzIiwgInNldCBjaGFubmVscyB0byBmaWx0ZXIiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgey5pNjQ9LTF9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1N9LAorICAgIHsiYyIsICAgICAgICAic2V0IGNoYW5uZWxzIHRvIGZpbHRlciIsIE9GRlNFVChjaGFubmVscyksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0tMX0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHU30sCiAgICAge05VTEx9CiB9OwogCkBAIC01MTcsMTUgKzY2MSwxOSBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHRyZWJsZV9vcHRpb25zW10gPSB7CiAgICAgeyJmcmVxdWVuY3kiLCAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAogICAgIHsiZiIsICAgICAgICAgInNldCBjZW50cmFsIGZyZXF1ZW5jeSIsIE9GRlNFVChmcmVxdWVuY3kpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTMwMDB9LCAwLCA5OTk5OTksIEZMQUdTfSwKLSAgICB7IndpZHRoX3R5cGUiLCAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgU0xPUEUsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBOQl9XVFlQRS0xLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InQiLCAgICAgICAgICAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgTkJfV1RZUEUtMSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsiayIsICJrSHoiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9S0hFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJ3aWR0aCIsICJzZXQgc2hlbGYgdHJhbnNpdGlvbiBzdGVlcCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgOTk5OTksIEZMQUdTfSwKICAgICB7InciLCAgICAgInNldCBzaGVsZiB0cmFuc2l0aW9uIHN0ZWVwIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLjV9LCAwLCA5OTk5OSwgRkxBR1N9LAogICAgIHsiZ2FpbiIsICJzZXQgZ2FpbiIsIE9GRlNFVChnYWluKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgLTkwMCwgOTAwLCBGTEFHU30sCiAgICAgeyJnIiwgICAgInNldCBnYWluIiwgT0ZGU0VUKGdhaW4pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTB9LCAtOTAwLCA5MDAsIEZMQUdTfSwKKyAgICB7ImNoYW5uZWxzIiwgInNldCBjaGFubmVscyB0byBmaWx0ZXIiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgey5pNjQ9LTF9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1N9LAorICAgIHsiYyIsICAgICAgICAic2V0IGNoYW5uZWxzIHRvIGZpbHRlciIsIE9GRlNFVChjaGFubmVscyksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0tMX0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHU30sCiAgICAge05VTEx9CiB9OwogCkBAIC01MzUsMTQgKzY4MywxOCBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGJhbmRwYXNzX29wdGlvbnNbXSA9IHsKICAgICB7ImZyZXF1ZW5jeSIsICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0zMDAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCiAgICAgeyJmIiwgICAgICAgICAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAotICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBTTE9QRSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJ3aWR0aF90eXBlIiwgInNldCBmaWx0ZXItd2lkdGggdHlwZSIsIE9GRlNFVCh3aWR0aF90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1RRkFDVE9SfSwgSEVSVFosIE5CX1dUWVBFLTEsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsidCIsICAgICAgICAgICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBOQl9XVFlQRS0xLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7ImgiLCAiSHoiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9SEVSVFp9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7InEiLCAiUS1GYWN0b3IiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UUZBQ1RPUn0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsibyIsICJvY3RhdmUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T0NUQVZFfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJzIiwgInNsb3BlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNMT1BFfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCi0gICAgeyJ3aWR0aCIsICJzZXQgYmFuZC13aWR0aCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgOTk5LCBGTEFHU30sCi0gICAgeyJ3IiwgICAgICJzZXQgYmFuZC13aWR0aCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgOTk5LCBGTEFHU30sCisgICAgeyJrIiwgImtIeiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1LSEVSVFp9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7IndpZHRoIiwgInNldCBiYW5kLXdpZHRoIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLjV9LCAwLCA5OTk5OSwgRkxBR1N9LAorICAgIHsidyIsICAgICAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNX0sIDAsIDk5OTk5LCBGTEFHU30sCiAgICAgeyJjc2ciLCAgICJ1c2UgY29uc3RhbnQgc2tpcnQgZ2FpbiIsIE9GRlNFVChjc2cpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1N9LAorICAgIHsiY2hhbm5lbHMiLCAic2V0IGNoYW5uZWxzIHRvIGZpbHRlciIsIE9GRlNFVChjaGFubmVscyksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0tMX0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHU30sCisgICAgeyJjIiwgICAgICAgICJzZXQgY2hhbm5lbHMgdG8gZmlsdGVyIiwgT0ZGU0VUKGNoYW5uZWxzKSwgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQsIHsuaTY0PS0xfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIEZMQUdTfSwKICAgICB7TlVMTH0KIH07CiAKQEAgLTU1MiwxMyArNzA0LDE3IEBACiBzdGF0aWMgY29uc3QgQVZPcHRpb24gYmFuZHJlamVjdF9vcHRpb25zW10gPSB7CiAgICAgeyJmcmVxdWVuY3kiLCAic2V0IGNlbnRyYWwgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAogICAgIHsiZiIsICAgICAgICAgInNldCBjZW50cmFsIGZyZXF1ZW5jeSIsIE9GRlNFVChmcmVxdWVuY3kpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTMwMDB9LCAwLCA5OTk5OTksIEZMQUdTfSwKLSAgICB7IndpZHRoX3R5cGUiLCAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgU0xPUEUsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBOQl9XVFlQRS0xLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InQiLCAgICAgICAgICAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgTkJfV1RZUEUtMSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAotICAgIHsid2lkdGgiLCAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNX0sIDAsIDk5OSwgRkxBR1N9LAotICAgIHsidyIsICAgICAic2V0IGJhbmQtd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNX0sIDAsIDk5OSwgRkxBR1N9LAorICAgIHsiayIsICJrSHoiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9S0hFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJ3aWR0aCIsICJzZXQgYmFuZC13aWR0aCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC41fSwgMCwgOTk5OTksIEZMQUdTfSwKKyAgICB7InciLCAgICAgInNldCBiYW5kLXdpZHRoIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLjV9LCAwLCA5OTk5OSwgRkxBR1N9LAorICAgIHsiY2hhbm5lbHMiLCAic2V0IGNoYW5uZWxzIHRvIGZpbHRlciIsIE9GRlNFVChjaGFubmVscyksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0tMX0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHU30sCisgICAgeyJjIiwgICAgICAgICJzZXQgY2hhbm5lbHMgdG8gZmlsdGVyIiwgT0ZGU0VUKGNoYW5uZWxzKSwgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQsIHsuaTY0PS0xfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIEZMQUdTfSwKICAgICB7TlVMTH0KIH07CiAKQEAgLTU2OCwxNSArNzI0LDE5IEBACiBzdGF0aWMgY29uc3QgQVZPcHRpb24gbG93cGFzc19vcHRpb25zW10gPSB7CiAgICAgeyJmcmVxdWVuY3kiLCAic2V0IGZyZXF1ZW5jeSIsIE9GRlNFVChmcmVxdWVuY3kpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTUwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAogICAgIHsiZiIsICAgICAgICAgInNldCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD01MDB9LCAwLCA5OTk5OTksIEZMQUdTfSwKLSAgICB7IndpZHRoX3R5cGUiLCAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgU0xPUEUsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBOQl9XVFlQRS0xLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InQiLCAgICAgICAgICAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PVFGQUNUT1J9LCBIRVJUWiwgTkJfV1RZUEUtMSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJoIiwgIkh6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJxIiwgIlEtRmFjdG9yIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVFGQUNUT1J9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7Im8iLCAib2N0YXZlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9DVEFWRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsicyIsICJzbG9wZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TTE9QRX0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsiayIsICJrSHoiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9S0hFUlRafSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJ3aWR0aCIsICJzZXQgd2lkdGgiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuNzA3fSwgMCwgOTk5OTksIEZMQUdTfSwKICAgICB7InciLCAgICAgInNldCB3aWR0aCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC43MDd9LCAwLCA5OTk5OSwgRkxBR1N9LAogICAgIHsicG9sZXMiLCAic2V0IG51bWJlciBvZiBwb2xlcyIsIE9GRlNFVChwb2xlcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDEsIDIsIEZMQUdTfSwKICAgICB7InAiLCAgICAgInNldCBudW1iZXIgb2YgcG9sZXMiLCBPRkZTRVQocG9sZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTJ9LCAxLCAyLCBGTEFHU30sCisgICAgeyJjaGFubmVscyIsICJzZXQgY2hhbm5lbHMgdG8gZmlsdGVyIiwgT0ZGU0VUKGNoYW5uZWxzKSwgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQsIHsuaTY0PS0xfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIEZMQUdTfSwKKyAgICB7ImMiLCAgICAgICAgInNldCBjaGFubmVscyB0byBmaWx0ZXIiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgey5pNjQ9LTF9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1N9LAogICAgIHtOVUxMfQogfTsKIApAQCAtNTg2LDE1ICs3NDYsMTkgQEAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBoaWdocGFzc19vcHRpb25zW10gPSB7CiAgICAgeyJmcmVxdWVuY3kiLCAic2V0IGZyZXF1ZW5jeSIsIE9GRlNFVChmcmVxdWVuY3kpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTMwMDB9LCAwLCA5OTk5OTksIEZMQUdTfSwKICAgICB7ImYiLCAgICAgICAgICJzZXQgZnJlcXVlbmN5IiwgT0ZGU0VUKGZyZXF1ZW5jeSksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MzAwMH0sIDAsIDk5OTk5OSwgRkxBR1N9LAotICAgIHsid2lkdGhfdHlwZSIsICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBTTE9QRSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJ3aWR0aF90eXBlIiwgInNldCBmaWx0ZXItd2lkdGggdHlwZSIsIE9GRlNFVCh3aWR0aF90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1RRkFDVE9SfSwgSEVSVFosIE5CX1dUWVBFLTEsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAorICAgIHsidCIsICAgICAgICAgICJzZXQgZmlsdGVyLXdpZHRoIHR5cGUiLCBPRkZTRVQod2lkdGhfdHlwZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9UUZBQ1RPUn0sIEhFUlRaLCBOQl9XVFlQRS0xLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7ImgiLCAiSHoiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9SEVSVFp9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7InEiLCAiUS1GYWN0b3IiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UUZBQ1RPUn0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsibyIsICJvY3RhdmUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T0NUQVZFfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJzIiwgInNsb3BlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNMT1BFfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJrIiwgImtIeiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1LSEVSVFp9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7IndpZHRoIiwgInNldCB3aWR0aCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MC43MDd9LCAwLCA5OTk5OSwgRkxBR1N9LAogICAgIHsidyIsICAgICAic2V0IHdpZHRoIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLjcwN30sIDAsIDk5OTk5LCBGTEFHU30sCiAgICAgeyJwb2xlcyIsICJzZXQgbnVtYmVyIG9mIHBvbGVzIiwgT0ZGU0VUKHBvbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0yfSwgMSwgMiwgRkxBR1N9LAogICAgIHsicCIsICAgICAic2V0IG51bWJlciBvZiBwb2xlcyIsIE9GRlNFVChwb2xlcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDEsIDIsIEZMQUdTfSwKKyAgICB7ImNoYW5uZWxzIiwgInNldCBjaGFubmVscyB0byBmaWx0ZXIiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgey5pNjQ9LTF9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1N9LAorICAgIHsiYyIsICAgICAgICAic2V0IGNoYW5uZWxzIHRvIGZpbHRlciIsIE9GRlNFVChjaGFubmVscyksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0tMX0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHU30sCiAgICAge05VTEx9CiB9OwogCkBAIC02MDQsMTMgKzc2OCwxNyBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFsbHBhc3Nfb3B0aW9uc1tdID0gewogICAgIHsiZnJlcXVlbmN5IiwgInNldCBjZW50cmFsIGZyZXF1ZW5jeSIsIE9GRlNFVChmcmVxdWVuY3kpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTMwMDB9LCAwLCA5OTk5OTksIEZMQUdTfSwKICAgICB7ImYiLCAgICAgICAgICJzZXQgY2VudHJhbCBmcmVxdWVuY3kiLCBPRkZTRVQoZnJlcXVlbmN5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0zMDAwfSwgMCwgOTk5OTk5LCBGTEFHU30sCi0gICAgeyJ3aWR0aF90eXBlIiwgInNldCBmaWx0ZXItd2lkdGggdHlwZSIsIE9GRlNFVCh3aWR0aF90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1IRVJUWn0sIEhFUlRaLCBTTE9QRSwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCisgICAgeyJ3aWR0aF90eXBlIiwgInNldCBmaWx0ZXItd2lkdGggdHlwZSIsIE9GRlNFVCh3aWR0aF90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1IRVJUWn0sIEhFUlRaLCBOQl9XVFlQRS0xLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7InQiLCAgICAgICAgICAic2V0IGZpbHRlci13aWR0aCB0eXBlIiwgT0ZGU0VUKHdpZHRoX3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUhFUlRafSwgSEVSVFosIE5CX1dUWVBFLTEsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsiaCIsICJIeiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1IRVJUWn0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsicSIsICJRLUZhY3RvciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1RRkFDVE9SfSwgMCwgMCwgRkxBR1MsICJ3aWR0aF90eXBlIn0sCiAgICAgeyJvIiwgIm9jdGF2ZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1PQ1RBVkV9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKICAgICB7InMiLCAic2xvcGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0xPUEV9LCAwLCAwLCBGTEFHUywgIndpZHRoX3R5cGUifSwKKyAgICB7ImsiLCAia0h6IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUtIRVJUWn0sIDAsIDAsIEZMQUdTLCAid2lkdGhfdHlwZSJ9LAogICAgIHsid2lkdGgiLCAic2V0IGZpbHRlci13aWR0aCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9NzA3LjF9LCAwLCA5OTk5OSwgRkxBR1N9LAogICAgIHsidyIsICAgICAic2V0IGZpbHRlci13aWR0aCIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9NzA3LjF9LCAwLCA5OTk5OSwgRkxBR1N9LAorICAgIHsiY2hhbm5lbHMiLCAic2V0IGNoYW5uZWxzIHRvIGZpbHRlciIsIE9GRlNFVChjaGFubmVscyksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0tMX0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHU30sCisgICAgeyJjIiwgICAgICAgICJzZXQgY2hhbm5lbHMgdG8gZmlsdGVyIiwgT0ZGU0VUKGNoYW5uZWxzKSwgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQsIHsuaTY0PS0xfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIEZMQUdTfSwKICAgICB7TlVMTH0KIH07CiAKQEAgLTYxOCwxMiArNzg2LDE0IEBACiAjZW5kaWYgIC8qIENPTkZJR19BTExQQVNTX0ZJTFRFUiAqLwogI2lmIENPTkZJR19CSVFVQURfRklMVEVSCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gYmlxdWFkX29wdGlvbnNbXSA9IHsKLSAgICB7ImEwIiwgTlVMTCwgT0ZGU0VUKGEwKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIEZMQUdTfSwKLSAgICB7ImExIiwgTlVMTCwgT0ZGU0VUKGExKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIEZMQUdTfSwKLSAgICB7ImEyIiwgTlVMTCwgT0ZGU0VUKGEyKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIEZMQUdTfSwKLSAgICB7ImIwIiwgTlVMTCwgT0ZGU0VUKGIwKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIEZMQUdTfSwKLSAgICB7ImIxIiwgTlVMTCwgT0ZGU0VUKGIxKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIEZMQUdTfSwKLSAgICB7ImIyIiwgTlVMTCwgT0ZGU0VUKGIyKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgSU5UMTZfTUlOLCBJTlQxNl9NQVgsIEZMQUdTfSwKKyAgICB7ImEwIiwgTlVMTCwgT0ZGU0VUKGEwKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIEZMQUdTfSwKKyAgICB7ImExIiwgTlVMTCwgT0ZGU0VUKGExKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIEZMQUdTfSwKKyAgICB7ImEyIiwgTlVMTCwgT0ZGU0VUKGEyKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIEZMQUdTfSwKKyAgICB7ImIwIiwgTlVMTCwgT0ZGU0VUKGIwKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIEZMQUdTfSwKKyAgICB7ImIxIiwgTlVMTCwgT0ZGU0VUKGIxKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIEZMQUdTfSwKKyAgICB7ImIyIiwgTlVMTCwgT0ZGU0VUKGIyKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgSU5UMzJfTUlOLCBJTlQzMl9NQVgsIEZMQUdTfSwKKyAgICB7ImNoYW5uZWxzIiwgInNldCBjaGFubmVscyB0byBmaWx0ZXIiLCBPRkZTRVQoY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgey5pNjQ9LTF9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1N9LAorICAgIHsiYyIsICAgICAgICAic2V0IGNoYW5uZWxzIHRvIGZpbHRlciIsIE9GRlNFVChjaGFubmVscyksIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VULCB7Lmk2ND0tMX0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHU30sCiAgICAge05VTEx9CiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9iczJiLmMgYi9saWJhdmZpbHRlci9hZl9iczJiLmMKaW5kZXggNTRkNTJjNS4uYzAxYjk4MyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfYnMyYi5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2JzMmIuYwpAQCAtMzIsNiArMzIsOCBAQAogI2luY2x1ZGUgImZvcm1hdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCit0eXBlZGVmIHZvaWQgKCpmaWx0ZXJfZnVuYykodF9iczJiZHAgYnMyYmRwLCB1aW50OF90ICpzYW1wbGUsIGludCBuKTsKKwogdHlwZWRlZiBzdHJ1Y3QgQnMyYkNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogCkBAIC00MSwxMSArNDMsMTEgQEAKIAogICAgIHRfYnMyYmRwIGJzMmJwOwogCi0gICAgdm9pZCAoKmZpbHRlcikodF9iczJiZHAgYnMyYmRwLCB1aW50OF90ICpzYW1wbGUsIGludCBuKTsKKyAgICBmaWx0ZXJfZnVuYyBmaWx0ZXI7CiB9IEJzMmJDb250ZXh0OwogCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihCczJiQ29udGV4dCwgeCkKLSNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCiAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBiczJiX29wdGlvbnNbXSA9IHsKICAgICB7ICJwcm9maWxlIiwgIkFwcGx5IGEgcHJlLWRlZmluZWQgY3Jvc3NmZWVkIGxldmVsIiwKQEAgLTEzMyw5ICsxMzUsMTEgQEAKICAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoZnJhbWUpKSB7CiAgICAgICAgIG91dF9mcmFtZSA9IGZyYW1lOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dF9mcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBmcmFtZS0+bmJfc2FtcGxlcyk7Ci0gICAgICAgIGlmICghb3V0X2ZyYW1lKQorICAgICAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCFvdXRfZnJhbWUpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KICAgICAgICAgYXZfZnJhbWVfY29weShvdXRfZnJhbWUsIGZyYW1lKTsKICAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXRfZnJhbWUsIGZyYW1lKTsKICAgICAgICAgaWYgKHJldCA8IDApIHsKQEAgLTE2MywxOSArMTY3LDE5IEBACiAKICAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CiAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1U4OgotICAgICAgICBiczJiLT5maWx0ZXIgPSBiczJiX2Nyb3NzX2ZlZWRfdTg7CisgICAgICAgIGJzMmItPmZpbHRlciA9IChmaWx0ZXJfZnVuYykgYnMyYl9jcm9zc19mZWVkX3U4OwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OgotICAgICAgICBiczJiLT5maWx0ZXIgPSAodm9pZCopYnMyYl9jcm9zc19mZWVkX3MxNjsKKyAgICAgICAgYnMyYi0+ZmlsdGVyID0gKGZpbHRlcl9mdW5jKSBiczJiX2Nyb3NzX2ZlZWRfczE2OwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOgotICAgICAgICBiczJiLT5maWx0ZXIgPSAodm9pZCopYnMyYl9jcm9zc19mZWVkX3MzMjsKKyAgICAgICAgYnMyYi0+ZmlsdGVyID0gKGZpbHRlcl9mdW5jKSBiczJiX2Nyb3NzX2ZlZWRfczMyOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOgotICAgICAgICBiczJiLT5maWx0ZXIgPSAodm9pZCopYnMyYl9jcm9zc19mZWVkX2Y7CisgICAgICAgIGJzMmItPmZpbHRlciA9IChmaWx0ZXJfZnVuYykgYnMyYl9jcm9zc19mZWVkX2Y7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkw6Ci0gICAgICAgIGJzMmItPmZpbHRlciA9ICh2b2lkKiliczJiX2Nyb3NzX2ZlZWRfZDsKKyAgICAgICAgYnMyYi0+ZmlsdGVyID0gKGZpbHRlcl9mdW5jKSBiczJiX2Nyb3NzX2ZlZWRfZDsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfY2hhbm5lbG1hcC5jIGIvbGliYXZmaWx0ZXIvYWZfY2hhbm5lbG1hcC5jCmluZGV4IGRjYWUyYTIuLjI4NWQ3NmEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2NoYW5uZWxtYXAuYworKysgYi9saWJhdmZpbHRlci9hZl9jaGFubmVsbWFwLmMKQEAgLTE0OSwxMyArMTQ5LDYgQEAKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBtb2RlID0gTUFQX1BBSVJfU1RSX1NUUjsKICAgICAgICAgfQotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSAgICAgICAgaWYgKHN0cmNocihtYXBwaW5nLCAnLCcpKSB7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIlRoaXMgc3ludGF4IGlzIGRlcHJlY2F0ZWQsIHVzZSAiCi0gICAgICAgICAgICAgICAgICAgIid8JyB0byBzZXBhcmF0ZSB0aGUgbWFwcGluZ3MuXG4iKTsKLSAgICAgICAgICAgIHNlcGFyYXRvciA9ICcsJzsKLSAgICAgICAgfQotI2VuZGlmCiAgICAgfQogCiAgICAgaWYgKG1vZGUgIT0gTUFQX05PTkUpIHsKQEAgLTI5MSw3ICsyODQsNyBAQAogICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmNoYW5uZWxfbGF5b3V0cyA9IE5VTEw7CiAgICAgaW50IHJldDsKIAotICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9sYXlvdXRzKCk7CisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpOwogICAgIGlmICghbGF5b3V0cykgewogICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGdvdG8gZmFpbDsKQEAgLTMxNiw3ICszMDksNyBAQAogICAgIEFWRmlsdGVyQ29udGV4dCAgKmN0eCA9IGlubGluay0+ZHN0OwogICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKICAgICBjb25zdCBDaGFubmVsTWFwQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBjb25zdCBpbnQgbmNoX2luID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGlubGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGNvbnN0IGludCBuY2hfaW4gPSBpbmxpbmstPmNoYW5uZWxzOwogICAgIGNvbnN0IGludCBuY2hfb3V0ID0gcy0+bmNoOwogICAgIGludCBjaDsKICAgICB1aW50OF90ICpzb3VyY2VfcGxhbmVzW01BWF9DSF07CkBAIC0zNTQsNyArMzQ3LDcgQEAKICAgICAgICAgICAgRkZNSU4oRkZfQVJSQVlfRUxFTVMoYnVmLT5kYXRhKSwgbmNoX291dCkgKiBzaXplb2YoYnVmLT5kYXRhWzBdKSk7CiAKICAgICBidWYtPmNoYW5uZWxfbGF5b3V0ID0gb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQ7Ci0gICAgYXZfZnJhbWVfc2V0X2NoYW5uZWxzKGJ1Ziwgb3V0bGluay0+Y2hhbm5lbHMpOworICAgIGJ1Zi0+Y2hhbm5lbHMgICAgICAgPSBvdXRsaW5rLT5jaGFubmVsczsKIAogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYnVmKTsKIH0KQEAgLTM2Myw3ICszNTYsNyBAQAogewogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CiAgICAgQ2hhbm5lbE1hcENvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgaW50IG5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGlubGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGludCBuYl9jaGFubmVscyA9IGlubGluay0+Y2hhbm5lbHM7CiAgICAgaW50IGksIGVyciA9IDA7CiAgICAgY29uc3QgY2hhciAqY2hhbm5lbF9uYW1lOwogICAgIGNoYXIgbGF5b3V0X25hbWVbMjU2XTsKQEAgLTM3OCw3ICszNzEsNyBAQAogCiAgICAgICAgIGlmIChtLT5pbl9jaGFubmVsX2lkeCA8IDAgfHwgbS0+aW5fY2hhbm5lbF9pZHggPj0gbmJfY2hhbm5lbHMpIHsKICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcobGF5b3V0X25hbWUsIHNpemVvZihsYXlvdXRfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGlubGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9jaGFubmVscywgaW5saW5rLT5jaGFubmVsX2xheW91dCk7CiAgICAgICAgICAgICBpZiAobS0+aW5fY2hhbm5lbCkgewogICAgICAgICAgICAgICAgIGNoYW5uZWxfbmFtZSA9IGF2X2dldF9jaGFubmVsX25hbWUobS0+aW5fY2hhbm5lbCk7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfY2hhbm5lbHNwbGl0LmMgYi9saWJhdmZpbHRlci9hZl9jaGFubmVsc3BsaXQuYwppbmRleCBmNTA0MTQ5Li44MjFiYjczIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9jaGFubmVsc3BsaXQuYworKysgYi9saWJhdmZpbHRlci9hZl9jaGFubmVsc3BsaXQuYwpAQCAtMzgsNiArMzgsOSBAQAogCiAgICAgdWludDY0X3QgY2hhbm5lbF9sYXlvdXQ7CiAgICAgY2hhciAgICAqY2hhbm5lbF9sYXlvdXRfc3RyOworICAgIGNoYXIgICAgKmNoYW5uZWxzX3N0cjsKKworICAgIGludCAgICAgIG1hcFs2NF07CiB9IENoYW5uZWxTcGxpdENvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENoYW5uZWxTcGxpdENvbnRleHQsIHgpCkBAIC00NSw2ICs0OCw3IEBACiAjZGVmaW5lIEYgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gY2hhbm5lbHNwbGl0X29wdGlvbnNbXSA9IHsKICAgICB7ICJjaGFubmVsX2xheW91dCIsICJJbnB1dCBjaGFubmVsIGxheW91dC4iLCBPRkZTRVQoY2hhbm5lbF9sYXlvdXRfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAic3RlcmVvIiB9LCAuZmxhZ3MgPSBBfEYgfSwKKyAgICB7ICJjaGFubmVscyIsICAgICAgICAiQ2hhbm5lbHMgdG8gZXh0cmFjdC4iLCBPRkZTRVQoY2hhbm5lbHNfc3RyKSwgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiYWxsIiB9LCAgICAuZmxhZ3MgPSBBfEYgfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtNTMsOCArNTcsOSBAQAogc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgQ2hhbm5lbFNwbGl0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dDsKICAgICBpbnQgbmJfY2hhbm5lbHM7Ci0gICAgaW50IHJldCA9IDAsIGk7CisgICAgaW50IGFsbCA9IDAsIHJldCA9IDAsIGk7CiAKICAgICBpZiAoIShzLT5jaGFubmVsX2xheW91dCA9IGF2X2dldF9jaGFubmVsX2xheW91dChzLT5jaGFubmVsX2xheW91dF9zdHIpKSkgewogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIGNoYW5uZWwgbGF5b3V0ICclcycuXG4iLApAQCAtNjMsMTUgKzY4LDM4IEBACiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBuYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT5jaGFubmVsX2xheW91dCk7CisKKyAgICBpZiAoIXN0cmNtcChzLT5jaGFubmVsc19zdHIsICJhbGwiKSkgeworICAgICAgICBuYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT5jaGFubmVsX2xheW91dCk7CisgICAgICAgIGNoYW5uZWxfbGF5b3V0ID0gcy0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgICAgIGFsbCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9nZXRfZXh0ZW5kZWRfY2hhbm5lbF9sYXlvdXQocy0+Y2hhbm5lbHNfc3RyLCAmY2hhbm5lbF9sYXlvdXQsICZuYl9jaGFubmVscykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCiAgICAgZm9yIChpID0gMDsgaSA8IG5iX2NoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgdWludDY0X3QgY2hhbm5lbCA9IGF2X2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbChzLT5jaGFubmVsX2xheW91dCwgaSk7CisgICAgICAgIHVpbnQ2NF90IGNoYW5uZWwgPSBhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwoY2hhbm5lbF9sYXlvdXQsIGkpOwogICAgICAgICBBVkZpbHRlclBhZCBwYWQgID0geyAwIH07CiAKICAgICAgICAgcGFkLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CiAgICAgICAgIHBhZC5uYW1lID0gYXZfZ2V0X2NoYW5uZWxfbmFtZShjaGFubmVsKTsKIAotICAgICAgICBmZl9pbnNlcnRfb3V0cGFkKGN0eCwgaSwgJnBhZCk7CisgICAgICAgIGlmIChhbGwpIHsKKyAgICAgICAgICAgIHMtPm1hcFtpXSA9IGk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9jaGFubmVsX2luZGV4KHMtPmNoYW5uZWxfbGF5b3V0LCBjaGFubmVsKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ2hhbm5lbCBuYW1lICclcycgbm90IHByZXNlbnQgaW4gY2hhbm5lbCBsYXlvdXQgJyVzJy5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX25hbWUoY2hhbm5lbCksIHMtPmNoYW5uZWxfbGF5b3V0X3N0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+bWFwW2ldID0gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9pbnNlcnRfb3V0cGFkKGN0eCwgaSwgJnBhZCkpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogICAgIH0KIAogZmFpbDoKQEAgLTk0LDcgKzEyMiw3IEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9vdXRwdXRzOyBpKyspIHsKICAgICAgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqb3V0X2xheW91dHMgPSBOVUxMOwotICAgICAgICB1aW50NjRfdCBjaGFubmVsID0gYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKHMtPmNoYW5uZWxfbGF5b3V0LCBpKTsKKyAgICAgICAgdWludDY0X3QgY2hhbm5lbCA9IGF2X2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbChzLT5jaGFubmVsX2xheW91dCwgcy0+bWFwW2ldKTsKIAogICAgICAgICBpZiAoKHJldCA9IGZmX2FkZF9jaGFubmVsX2xheW91dCgmb3V0X2xheW91dHMsIGNoYW5uZWwpKSA8IDAgfHwKICAgICAgICAgICAgIChyZXQgPSBmZl9jaGFubmVsX2xheW91dHNfcmVmKG91dF9sYXlvdXRzLCAmY3R4LT5vdXRwdXRzW2ldLT5pbl9jaGFubmVsX2xheW91dHMpKSA8IDApCkBAIC0xMDcsNiArMTM1LDcgQEAKIHN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBDaGFubmVsU3BsaXRDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIGludCBpLCByZXQgPSAwOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKSB7CkBAIC0xMTcsMTAgKzE0NiwxMCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBidWZfb3V0LT5kYXRhWzBdID0gYnVmX291dC0+ZXh0ZW5kZWRfZGF0YVswXSA9IGJ1Zl9vdXQtPmV4dGVuZGVkX2RhdGFbaV07CisgICAgICAgIGJ1Zl9vdXQtPmRhdGFbMF0gPSBidWZfb3V0LT5leHRlbmRlZF9kYXRhWzBdID0gYnVmX291dC0+ZXh0ZW5kZWRfZGF0YVtzLT5tYXBbaV1dOwogICAgICAgICBidWZfb3V0LT5jaGFubmVsX2xheW91dCA9Ci0gICAgICAgICAgICBhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwoYnVmLT5jaGFubmVsX2xheW91dCwgaSk7Ci0gICAgICAgIGF2X2ZyYW1lX3NldF9jaGFubmVscyhidWZfb3V0LCAxKTsKKyAgICAgICAgICAgIGF2X2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbChidWYtPmNoYW5uZWxfbGF5b3V0LCBzLT5tYXBbaV0pOworICAgICAgICBidWZfb3V0LT5jaGFubmVscyA9IDE7CiAKICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1tpXSwgYnVmX291dCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfY2hvcnVzLmMgYi9saWJhdmZpbHRlci9hZl9jaG9ydXMuYwppbmRleCBjNTk2MTY0Li4yOWM0N2FiIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9jaG9ydXMuYworKysgYi9saWJhdmZpbHRlci9hZl9jaG9ydXMuYwpAQCAtOTYsNyArOTYsOCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCAqbmJfaXRlbXM7IGkrKykgewogICAgICAgICBjaGFyICp0c3RyID0gYXZfc3RydG9rKHAsICJ8IiwgJnNhdmVwdHIpOwogICAgICAgICBwID0gTlVMTDsKLSAgICAgICAgbmV3X25iX2l0ZW1zICs9IHNzY2FuZih0c3RyLCAiJWYiLCAmaXRlbXNbaV0pID09IDE7CisgICAgICAgIGlmICh0c3RyKQorICAgICAgICAgICAgbmV3X25iX2l0ZW1zICs9IHNzY2FuZih0c3RyLCAiJWYiLCAmaXRlbXNbbmV3X25iX2l0ZW1zXSkgPT0gMTsKICAgICB9CiAKICAgICAqbmJfaXRlbXMgPSBuZXdfbmJfaXRlbXM7CkBAIC0yNDYsNyArMjQ3LDcgQEAKICAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoZnJhbWUpKSB7CiAgICAgICAgIG91dF9mcmFtZSA9IGZyYW1lOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dF9mcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgIG91dF9mcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIoY3R4LT5vdXRwdXRzWzBdLCBmcmFtZS0+bmJfc2FtcGxlcyk7CiAgICAgICAgIGlmICghb3V0X2ZyYW1lKSB7CiAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfY29tcGFuZC5jIGIvbGliYXZmaWx0ZXIvYWZfY29tcGFuZC5jCmluZGV4IGI3NDYzNjQuLmMxMzhmMGIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2NvbXBhbmQuYworKysgYi9saWJhdmZpbHRlci9hZl9jb21wYW5kLmMKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZm1hdGguaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgogI2luY2x1ZGUgImF1ZGlvLmgiCkBAIC03MSw5ICs3Miw5IEBACiAjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCiAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBjb21wYW5kX29wdGlvbnNbXSA9IHsKLSAgICB7ICJhdHRhY2tzIiwgInNldCB0aW1lIG92ZXIgd2hpY2ggaW5jcmVhc2Ugb2Ygdm9sdW1lIGlzIGRldGVybWluZWQiLCBPRkZTRVQoYXR0YWNrcyksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIjAuMyIgfSwgMCwgMCwgQSB9LAorICAgIHsgImF0dGFja3MiLCAic2V0IHRpbWUgb3ZlciB3aGljaCBpbmNyZWFzZSBvZiB2b2x1bWUgaXMgZGV0ZXJtaW5lZCIsIE9GRlNFVChhdHRhY2tzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMCIgfSwgMCwgMCwgQSB9LAogICAgIHsgImRlY2F5cyIsICJzZXQgdGltZSBvdmVyIHdoaWNoIGRlY3JlYXNlIG9mIHZvbHVtZSBpcyBkZXRlcm1pbmVkIiwgT0ZGU0VUKGRlY2F5cyksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIjAuOCIgfSwgMCwgMCwgQSB9LAotICAgIHsgInBvaW50cyIsICJzZXQgcG9pbnRzIG9mIHRyYW5zZmVyIGZ1bmN0aW9uIiwgT0ZGU0VUKHBvaW50cyksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIi03MC8tNzB8LTYwLy0yMCIgfSwgMCwgMCwgQSB9LAorICAgIHsgInBvaW50cyIsICJzZXQgcG9pbnRzIG9mIHRyYW5zZmVyIGZ1bmN0aW9uIiwgT0ZGU0VUKHBvaW50cyksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIi03MC8tNzB8LTYwLy0yMHwxLzAiIH0sIDAsIDAsIEEgfSwKICAgICB7ICJzb2Z0LWtuZWUiLCAic2V0IHNvZnQta25lZSIsIE9GRlNFVChjdXJ2ZV9kQiksIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gMC4wMSB9LCAwLjAxLCA5MDAsIEEgfSwKICAgICB7ICJnYWluIiwgInNldCBvdXRwdXQgZ2FpbiIsIE9GRlNFVChnYWluX2RCKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwIH0sIC05MDAsIDkwMCwgQSB9LAogICAgIHsgInZvbHVtZSIsICJzZXQgaW5pdGlhbCB2b2x1bWUiLCBPRkZTRVQoaW5pdGlhbF92b2x1bWUpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAgfSwgLTkwMCwgMCwgQSB9LApAQCAtMTg0LDcgKzE4NSw3IEBACiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkgewogICAgICAgICBvdXRfZnJhbWUgPSBmcmFtZTsKICAgICB9IGVsc2UgewotICAgICAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgbmJfc2FtcGxlcyk7CisgICAgICAgIG91dF9mcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIoY3R4LT5vdXRwdXRzWzBdLCBuYl9zYW1wbGVzKTsKICAgICAgICAgaWYgKCFvdXRfZnJhbWUpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0yNDgsNyArMjQ5LDcgQEAKIAogICAgICAgICAgICAgaWYgKGNvdW50ID49IHMtPmRlbGF5X3NhbXBsZXMpIHsKICAgICAgICAgICAgICAgICBpZiAoIW91dF9mcmFtZSkgewotICAgICAgICAgICAgICAgICAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgbmJfc2FtcGxlcyAtIGkpOworICAgICAgICAgICAgICAgICAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGN0eC0+b3V0cHV0c1swXSwgbmJfc2FtcGxlcyAtIGkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIW91dF9mcmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTM2Nyw2ICszNjgsMTAgQEAKICAgICBwID0gcy0+YXR0YWNrczsKICAgICBmb3IgKGkgPSAwLCBuZXdfbmJfaXRlbXMgPSAwOyBpIDwgbmJfYXR0YWNrczsgaSsrKSB7CiAgICAgICAgIGNoYXIgKnRzdHIgPSBhdl9zdHJ0b2socCwgIiB8IiwgJnNhdmVwdHIpOworICAgICAgICBpZiAoIXRzdHIpIHsKKyAgICAgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQogICAgICAgICBwID0gTlVMTDsKICAgICAgICAgbmV3X25iX2l0ZW1zICs9IHNzY2FuZih0c3RyLCAiJWxmIiwgJnMtPmNoYW5uZWxzW2ldLmF0dGFjaykgPT0gMTsKICAgICAgICAgaWYgKHMtPmNoYW5uZWxzW2ldLmF0dGFjayA8IDApIHsKQEAgLTM3OSw2ICszODQsMTAgQEAKICAgICBwID0gcy0+ZGVjYXlzOwogICAgIGZvciAoaSA9IDAsIG5ld19uYl9pdGVtcyA9IDA7IGkgPCBuYl9kZWNheXM7IGkrKykgewogICAgICAgICBjaGFyICp0c3RyID0gYXZfc3RydG9rKHAsICIgfCIsICZzYXZlcHRyKTsKKyAgICAgICAgaWYgKCF0c3RyKSB7CisgICAgICAgICAgICB1bmluaXQoY3R4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KICAgICAgICAgcCA9IE5VTEw7CiAgICAgICAgIG5ld19uYl9pdGVtcyArPSBzc2NhbmYodHN0ciwgIiVsZiIsICZzLT5jaGFubmVsc1tpXS5kZWNheSkgPT0gMTsKICAgICAgICAgaWYgKHMtPmNoYW5uZWxzW2ldLmRlY2F5IDwgMCkgewpAQCAtNDA2LDcgKzQxNSw3IEBACiAgICAgZm9yIChpID0gMCwgbmV3X25iX2l0ZW1zID0gMDsgaSA8IG5iX3BvaW50czsgaSsrKSB7CiAgICAgICAgIGNoYXIgKnRzdHIgPSBhdl9zdHJ0b2socCwgIiB8IiwgJnNhdmVwdHIpOwogICAgICAgICBwID0gTlVMTDsKLSAgICAgICAgaWYgKHNzY2FuZih0c3RyLCAiJWxmLyVsZiIsICZTKGkpLngsICZTKGkpLnkpICE9IDIpIHsKKyAgICAgICAgaWYgKCF0c3RyIHx8IHNzY2FuZih0c3RyLCAiJWxmLyVsZiIsICZTKGkpLngsICZTKGkpLnkpICE9IDIpIHsKICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgYW5kL29yIG1pc3NpbmcgaW5wdXQvb3V0cHV0IHZhbHVlLlxuIik7CiAgICAgICAgICAgICB1bmluaXQoY3R4KTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2NvbXBlbnNhdGlvbmRlbGF5LmMgYi9saWJhdmZpbHRlci9hZl9jb21wZW5zYXRpb25kZWxheS5jCmluZGV4IGQ1YTM0ODQuLjA1Mjg1Y2QgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2NvbXBlbnNhdGlvbmRlbGF5LmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfY29tcGVuc2F0aW9uZGVsYXkuYwpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgQVZGcmFtZSAqb3V0OwogICAgIGludCBuLCBjaDsKIAotICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihjdHgtPm91dHB1dHNbMF0sIGluLT5uYl9zYW1wbGVzKTsKICAgICBpZiAoIW91dCkgewogICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9jcm9zc2ZlZWQuYyBiL2xpYmF2ZmlsdGVyL2FmX2Nyb3NzZmVlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWYyODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9hZl9jcm9zc2ZlZWQuYwpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisKK3R5cGVkZWYgc3RydWN0IENyb3NzZmVlZENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgZG91YmxlIHJhbmdlOworICAgIGRvdWJsZSBzdHJlbmd0aDsKKyAgICBkb3VibGUgbGV2ZWxfaW47CisgICAgZG91YmxlIGxldmVsX291dDsKKworICAgIGRvdWJsZSBhMCwgYTEsIGEyOworICAgIGRvdWJsZSBiMCwgYjEsIGIyOworCisgICAgZG91YmxlIGkxLCBpMjsKKyAgICBkb3VibGUgbzEsIG8yOworfSBDcm9zc2ZlZWRDb250ZXh0OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXQgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2FkZF9mb3JtYXQgICAgICAgICAgICAgICAgICgmZm9ybWF0cywgQVZfU0FNUExFX0ZNVF9EQkwgICkpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfc2V0X2NvbW1vbl9mb3JtYXRzICAgICAgICAgKGN0eCAgICAgLCBmb3JtYXRzICAgICAgICAgICAgKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9hZGRfY2hhbm5lbF9sYXlvdXQgICAgICAgICAoJmxheW91dCAsIEFWX0NIX0xBWU9VVF9TVEVSRU8pKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzIChjdHggICAgICwgbGF5b3V0ICAgICAgICAgICAgICkpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyAgICAgKGN0eCAgICAgLCBmZl9hbGxfc2FtcGxlcmF0ZXMoKSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIENyb3NzZmVlZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZG91YmxlIEEgPSBleHAocy0+c3RyZW5ndGggKiAtMzAgLyA0MCAqIGxvZygxMC4pKTsKKyAgICBkb3VibGUgdzAgPSAyICogTV9QSSAqICgxLiAtIHMtPnJhbmdlKSAqIDIxMDAgLyBpbmxpbmstPnNhbXBsZV9yYXRlOworICAgIGRvdWJsZSBhbHBoYTsKKworICAgIGFscGhhID0gc2luKHcwKSAvIDIgKiBzcXJ0KDIgKiAoMSAvIDAuNSAtIDEpICsgMik7CisKKyAgICBzLT5hMCA9ICAgICAgICAgIChBICsgMSkgKyAoQSAtIDEpICogY29zKHcwKSArIDIgKiBzcXJ0KEEpICogYWxwaGE7CisgICAgcy0+YTEgPSAgICAtMiAqICgoQSAtIDEpICsgKEEgKyAxKSAqIGNvcyh3MCkpOworICAgIHMtPmEyID0gICAgICAgICAgKEEgKyAxKSArIChBIC0gMSkgKiBjb3ModzApIC0gMiAqIHNxcnQoQSkgKiBhbHBoYTsKKyAgICBzLT5iMCA9ICAgICBBICogKChBICsgMSkgLSAoQSAtIDEpICogY29zKHcwKSArIDIgKiBzcXJ0KEEpICogYWxwaGEpOworICAgIHMtPmIxID0gMiAqIEEgKiAoKEEgLSAxKSAtIChBICsgMSkgKiBjb3ModzApKTsKKyAgICBzLT5iMiA9ICAgICBBICogKChBICsgMSkgLSAoQSAtIDEpICogY29zKHcwKSAtIDIgKiBzcXJ0KEEpICogYWxwaGEpOworCisgICAgcy0+YTEgLz0gcy0+YTA7CisgICAgcy0+YTIgLz0gcy0+YTA7CisgICAgcy0+YjAgLz0gcy0+YTA7CisgICAgcy0+YjEgLz0gcy0+YTA7CisgICAgcy0+YjIgLz0gcy0+YTA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIENyb3NzZmVlZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgZG91YmxlICpzcmMgPSAoY29uc3QgZG91YmxlICopaW4tPmRhdGFbMF07CisgICAgY29uc3QgZG91YmxlIGxldmVsX2luID0gcy0+bGV2ZWxfaW47CisgICAgY29uc3QgZG91YmxlIGxldmVsX291dCA9IHMtPmxldmVsX291dDsKKyAgICBjb25zdCBkb3VibGUgYjAgPSBzLT5iMDsKKyAgICBjb25zdCBkb3VibGUgYjEgPSBzLT5iMTsKKyAgICBjb25zdCBkb3VibGUgYjIgPSBzLT5iMjsKKyAgICBjb25zdCBkb3VibGUgYTEgPSBzLT5hMTsKKyAgICBjb25zdCBkb3VibGUgYTIgPSBzLT5hMjsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgZG91YmxlICpkc3Q7CisgICAgaW50IG47CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKyAgICBkc3QgPSAoZG91YmxlICopb3V0LT5kYXRhWzBdOworCisgICAgZm9yIChuID0gMDsgbiA8IG91dC0+bmJfc2FtcGxlczsgbisrLCBzcmMgKz0gMiwgZHN0ICs9IDIpIHsKKyAgICAgICAgZG91YmxlIG1pZCA9IChzcmNbMF0gKyBzcmNbMV0pICogbGV2ZWxfaW4gKiAuNTsKKyAgICAgICAgZG91YmxlIHNpZGUgPSAoc3JjWzBdIC0gc3JjWzFdKSAqIGxldmVsX2luICogLjU7CisgICAgICAgIGRvdWJsZSBvc2lkZSA9IHNpZGUgKiBiMCArIHMtPmkxICogYjEgKyBzLT5pMiAqIGIyIC0gcy0+bzEgKiBhMSAtIHMtPm8yICogYTI7CisKKyAgICAgICAgcy0+aTIgPSBzLT5pMTsKKyAgICAgICAgcy0+aTEgPSBzaWRlOworICAgICAgICBzLT5vMiA9IHMtPm8xOworICAgICAgICBzLT5vMSA9IG9zaWRlOworCisgICAgICAgIGRzdFswXSA9IChtaWQgKyBvc2lkZSkgKiBsZXZlbF9vdXQ7CisgICAgICAgIGRzdFsxXSA9IChtaWQgLSBvc2lkZSkgKiBsZXZlbF9vdXQ7CisgICAgfQorCisgICAgaWYgKG91dCAhPSBpbikKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ3Jvc3NmZWVkQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjcm9zc2ZlZWRfb3B0aW9uc1tdID0geworICAgIHsgInN0cmVuZ3RoIiwgICJzZXQgY3Jvc3NmZWVkIHN0cmVuZ3RoIiwgIE9GRlNFVChzdHJlbmd0aCksICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPS4yfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJyYW5nZSIsICAgICAic2V0IHNvdW5kc3RhZ2Ugd2lkZW5lc3MiLCBPRkZTRVQocmFuZ2UpLCAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0uNX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAibGV2ZWxfaW4iLCAgInNldCBsZXZlbCBpbiIsICAgICAgICAgICAgT0ZGU0VUKGxldmVsX2luKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9Ljl9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgImxldmVsX291dCIsICJzZXQgbGV2ZWwgb3V0IiwgICAgICAgICAgIE9GRlNFVChsZXZlbF9vdXQpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTEufSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNyb3NzZmVlZCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9jcm9zc2ZlZWQgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImNyb3NzZmVlZCIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IGhlYWRwaG9uZSBjcm9zc2ZlZWQgZmlsdGVyLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzICA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKENyb3NzZmVlZENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZjcm9zc2ZlZWRfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICA9IG91dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfY3J5c3RhbGl6ZXIuYyBiL2xpYmF2ZmlsdGVyL2FmX2NyeXN0YWxpemVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyN2UxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2NyeXN0YWxpemVyLmMKQEAgLTAsMCArMSwyNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIEZGbXBlZyBQcm9qZWN0CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ3J5c3RhbGl6ZXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBmbG9hdCBtdWx0OworICAgIGludCBjbGlwOworICAgIEFWRnJhbWUgKnByZXY7CisgICAgdm9pZCAoKmZpbHRlcikodm9pZCAqKmRzdCwgdm9pZCAqKnBydiwgY29uc3Qgdm9pZCAqKnNyYywKKyAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLCBmbG9hdCBtdWx0LCBpbnQgY2xpcCk7Cit9IENyeXN0YWxpemVyQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ3J5c3RhbGl6ZXJDb250ZXh0LCB4KQorI2RlZmluZSBBIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY3J5c3RhbGl6ZXJfb3B0aW9uc1tdID0geworICAgIHsgImkiLCAic2V0IGludGVuc2l0eSIsICAgIE9GRlNFVChtdWx0KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTIuMH0sIDAsIDEwLCBBIH0sCisgICAgeyAiYyIsICJlbmFibGUgY2xpcHBpbmciLCAgT0ZGU0VUKGNsaXApLCBBVl9PUFRfVFlQRV9CT09MLCAgey5pNjQ9MX0sICAgMCwgIDEsIEEgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNyeXN0YWxpemVyKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0cyA9IE5VTEw7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsIEFWX1NBTVBMRV9GTVRfREJMUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9mbHQodm9pZCAqKmQsIHZvaWQgKipwLCBjb25zdCB2b2lkICoqcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbXVsdCwgaW50IGNsaXApCit7CisgICAgY29uc3QgZmxvYXQgKnNyYyA9IHNbMF07CisgICAgZmxvYXQgKmRzdCA9IGRbMF07CisgICAgZmxvYXQgKnBydiA9IHBbMF07CisgICAgaW50IG4sIGM7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmJfc2FtcGxlczsgbisrKSB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBmbG9hdCBjdXJyZW50ID0gc3JjW2NdOworCisgICAgICAgICAgICBkc3RbY10gPSBjdXJyZW50ICsgKGN1cnJlbnQgLSBwcnZbY10pICogbXVsdDsKKyAgICAgICAgICAgIHBydltjXSA9IGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoY2xpcCkgeworICAgICAgICAgICAgICAgIGRzdFtjXSA9IGF2X2NsaXBmKGRzdFtjXSwgLTEsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZHN0ICs9IGM7CisgICAgICAgIHNyYyArPSBjOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyX2RibCh2b2lkICoqZCwgdm9pZCAqKnAsIGNvbnN0IHZvaWQgKipzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtdWx0LCBpbnQgY2xpcCkKK3sKKyAgICBjb25zdCBkb3VibGUgKnNyYyA9IHNbMF07CisgICAgZG91YmxlICpkc3QgPSBkWzBdOworICAgIGRvdWJsZSAqcHJ2ID0gcFswXTsKKyAgICBpbnQgbiwgYzsKKworICAgIGZvciAobiA9IDA7IG4gPCBuYl9zYW1wbGVzOyBuKyspIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBjdXJyZW50ID0gc3JjW2NdOworCisgICAgICAgICAgICBkc3RbY10gPSBjdXJyZW50ICsgKGN1cnJlbnQgLSBwcnZbY10pICogbXVsdDsKKyAgICAgICAgICAgIHBydltjXSA9IGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoY2xpcCkgeworICAgICAgICAgICAgICAgIGRzdFtjXSA9IGF2X2NsaXBkKGRzdFtjXSwgLTEsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZHN0ICs9IGM7CisgICAgICAgIHNyYyArPSBjOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyX2ZsdHAodm9pZCAqKmQsIHZvaWQgKipwLCBjb25zdCB2b2lkICoqcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtdWx0LCBpbnQgY2xpcCkKK3sKKyAgICBpbnQgbiwgYzsKKworICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMgPSBzW2NdOworICAgICAgICBmbG9hdCAqZHN0ID0gZFtjXTsKKyAgICAgICAgZmxvYXQgKnBydiA9IHBbY107CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IG5iX3NhbXBsZXM7IG4rKykgeworICAgICAgICAgICAgZmxvYXQgY3VycmVudCA9IHNyY1tuXTsKKworICAgICAgICAgICAgZHN0W25dID0gY3VycmVudCArIChjdXJyZW50IC0gcHJ2WzBdKSAqIG11bHQ7CisgICAgICAgICAgICBwcnZbMF0gPSBjdXJyZW50OworICAgICAgICAgICAgaWYgKGNsaXApIHsKKyAgICAgICAgICAgICAgICBkc3Rbbl0gPSBhdl9jbGlwZihkc3Rbbl0sIC0xLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyX2RibHAodm9pZCAqKmQsIHZvaWQgKipwLCBjb25zdCB2b2lkICoqcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzLCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtdWx0LCBpbnQgY2xpcCkKK3sKKyAgICBpbnQgbiwgYzsKKworICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSAqc3JjID0gc1tjXTsKKyAgICAgICAgZG91YmxlICpkc3QgPSBkW2NdOworICAgICAgICBkb3VibGUgKnBydiA9IHBbY107CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IG5iX3NhbXBsZXM7IG4rKykgeworICAgICAgICAgICAgZG91YmxlIGN1cnJlbnQgPSBzcmNbbl07CisKKyAgICAgICAgICAgIGRzdFtuXSA9IGN1cnJlbnQgKyAoY3VycmVudCAtIHBydlswXSkgKiBtdWx0OworICAgICAgICAgICAgcHJ2WzBdID0gY3VycmVudDsKKyAgICAgICAgICAgIGlmIChjbGlwKSB7CisgICAgICAgICAgICAgICAgZHN0W25dID0gYXZfY2xpcGQoZHN0W25dLCAtMSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQ3J5c3RhbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6ICBzLT5maWx0ZXIgPSBmaWx0ZXJfZmx0OyAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDogIHMtPmZpbHRlciA9IGZpbHRlcl9kYmw7ICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUDogcy0+ZmlsdGVyID0gZmlsdGVyX2ZsdHA7IGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOiBzLT5maWx0ZXIgPSBmaWx0ZXJfZGJscDsgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBDcnlzdGFsaXplckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0OworCisgICAgaWYgKCFzLT5wcmV2KSB7CisgICAgICAgIHMtPnByZXYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgMSk7CisgICAgICAgIGlmICghcy0+cHJldikgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbikpIHsKKyAgICAgICAgb3V0ID0gaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgcy0+ZmlsdGVyKCh2b2lkICoqKW91dC0+ZXh0ZW5kZWRfZGF0YSwgKHZvaWQgKiopcy0+cHJldi0+ZXh0ZW5kZWRfZGF0YSwgKGNvbnN0IHZvaWQgKiopaW4tPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgIGluLT5uYl9zYW1wbGVzLCBpbi0+Y2hhbm5lbHMsIHMtPm11bHQsIHMtPmNsaXApOworCisgICAgaWYgKG91dCAhPSBpbikKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDcnlzdGFsaXplckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2NyeXN0YWxpemVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjcnlzdGFsaXplciIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNpbXBsZSBleHBhbmQgYXVkaW8gZHluYW1pYyByYW5nZSBmaWx0ZXIuIiksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoQ3J5c3RhbGl6ZXJDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmY3J5c3RhbGl6ZXJfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgICA9IGlucHV0cywKKyAgICAub3V0cHV0cyAgICAgICAgPSBvdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2Rjc2hpZnQuYyBiL2xpYmF2ZmlsdGVyL2FmX2Rjc2hpZnQuYwppbmRleCA3MzMyYzEyLi5lMDA3ZWZlIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9kY3NoaWZ0LmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfZGNzaGlmdC5jCkBAIC0yOCw3ICsyOCw3IEBACiB0eXBlZGVmIHN0cnVjdCBEQ1NoaWZ0Q29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgZG91YmxlIGRjc2hpZnQ7Ci0gICAgZG91YmxlIGxpbWl0ZXJ0aHJlc2hob2xkOworICAgIGRvdWJsZSBsaW1pdGVydGhyZXNob2xkOwogICAgIGRvdWJsZSBsaW1pdGVyZ2FpbjsKIH0gRENTaGlmdENvbnRleHQ7CiAKQEAgLTQ3LDcgKzQ3LDcgQEAKIHsKICAgICBEQ1NoaWZ0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKIAotICAgIHMtPmxpbWl0ZXJ0aHJlc2hob2xkID0gSU5UMzJfTUFYICogKDEuMCAtIChmYWJzKHMtPmRjc2hpZnQpIC0gcy0+bGltaXRlcmdhaW4pKTsKKyAgICBzLT5saW1pdGVydGhyZXNob2xkID0gSU5UMzJfTUFYICogKDEuMCAtIChmYWJzKHMtPmRjc2hpZnQpIC0gcy0+bGltaXRlcmdhaW4pKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtODUsMTYgKzg1LDIxIEBACiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKICAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07Ci0gICAgQVZGcmFtZSAqb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICBBVkZyYW1lICpvdXQ7CiAgICAgRENTaGlmdENvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgaW50IGksIGo7CiAgICAgZG91YmxlIGRjc2hpZnQgPSBzLT5kY3NoaWZ0OwogCi0gICAgaWYgKCFvdXQpIHsKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbikpIHsKKyAgICAgICAgb3V0ID0gaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CiAgICAgfQotICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CiAKICAgICBpZiAocy0+bGltaXRlcmdhaW4gPiAwKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmxpbmstPmNoYW5uZWxzOyBpKyspIHsKQEAgLTEwNiwxNCArMTExLDE0IEBACiAKICAgICAgICAgICAgICAgICBkID0gc3JjW2pdOwogCi0gICAgICAgICAgICAgICAgaWYgKGQgPiBzLT5saW1pdGVydGhyZXNoaG9sZCAmJiBkY3NoaWZ0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBkID0gKGQgLSBzLT5saW1pdGVydGhyZXNoaG9sZCkgKiBzLT5saW1pdGVyZ2FpbiAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQzMl9NQVggLSBzLT5saW1pdGVydGhyZXNoaG9sZCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW1pdGVydGhyZXNoaG9sZCArIGRjc2hpZnQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkIDwgLXMtPmxpbWl0ZXJ0aHJlc2hob2xkICYmIGRjc2hpZnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGQgPSAoZCArIHMtPmxpbWl0ZXJ0aHJlc2hob2xkKSAqIHMtPmxpbWl0ZXJnYWluIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElOVDMyX01BWCAtIHMtPmxpbWl0ZXJ0aHJlc2hob2xkKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbWl0ZXJ0aHJlc2hob2xkICsgZGNzaGlmdDsKKyAgICAgICAgICAgICAgICBpZiAoZCA+IHMtPmxpbWl0ZXJ0aHJlc2hvbGQgJiYgZGNzaGlmdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZCA9IChkIC0gcy0+bGltaXRlcnRocmVzaG9sZCkgKiBzLT5saW1pdGVyZ2FpbiAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJTlQzMl9NQVggLSBzLT5saW1pdGVydGhyZXNob2xkKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbWl0ZXJ0aHJlc2hvbGQgKyBkY3NoaWZ0OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZCA8IC1zLT5saW1pdGVydGhyZXNob2xkICYmIGRjc2hpZnQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGQgPSAoZCArIHMtPmxpbWl0ZXJ0aHJlc2hvbGQpICogcy0+bGltaXRlcmdhaW4gLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSU5UMzJfTUFYIC0gcy0+bGltaXRlcnRocmVzaG9sZCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW1pdGVydGhyZXNob2xkICsgZGNzaGlmdDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBkID0gZGNzaGlmdCAqIElOVDMyX01BWCArIGQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTM0LDcgKzEzOSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgaWYgKG91dCAhPSBpbikKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKIH0KIHN0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBkY3NoaWZ0X2lucHV0c1tdID0gewpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfZHJtZXRlci5jIGIvbGliYXZmaWx0ZXIvYWZfZHJtZXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjY2NiNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9hZl9kcm1ldGVyLmMKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZmbWF0aC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ2hhbm5lbFN0YXRzIHsKKyAgICB1aW50NjRfdCBuYl9zYW1wbGVzOworICAgIHVpbnQ2NF90IGJsa251bTsKKyAgICBmbG9hdCBwZWFrOworICAgIGZsb2F0IHN1bTsKKyAgICB1aW50MzJfdCBwZWFrc1sxMDAwMV07CisgICAgdWludDMyX3Qgcm1zWzEwMDAxXTsKK30gQ2hhbm5lbFN0YXRzOworCit0eXBlZGVmIHN0cnVjdCBEUk1ldGVyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgQ2hhbm5lbFN0YXRzICpjaHN0YXRzOworICAgIGludCBuYl9jaGFubmVsczsKKyAgICB1aW50NjRfdCB0Y19zYW1wbGVzOworICAgIGRvdWJsZSB0aW1lX2NvbnN0YW50OworfSBEUk1ldGVyQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRFJNZXRlckNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZHJtZXRlcl9vcHRpb25zW10gPSB7CisgICAgeyAibGVuZ3RoIiwgInNldCB0aGUgd2luZG93IGxlbmd0aCIsIE9GRlNFVCh0aW1lX2NvbnN0YW50KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0zfSwgLjAxLCAxMCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGRybWV0ZXIpOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9TQU1QTEVfRk1UX0ZMVCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBEUk1ldGVyQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKworICAgIHMtPmNoc3RhdHMgPSBhdl9jYWxsb2Moc2l6ZW9mKCpzLT5jaHN0YXRzKSwgb3V0bGluay0+Y2hhbm5lbHMpOworICAgIGlmICghcy0+Y2hzdGF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzLT5uYl9jaGFubmVscyA9IG91dGxpbmstPmNoYW5uZWxzOworICAgIHMtPnRjX3NhbXBsZXMgPSBzLT50aW1lX2NvbnN0YW50ICogb3V0bGluay0+c2FtcGxlX3JhdGUgKyAuNTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfYmxvY2soQ2hhbm5lbFN0YXRzICpwKQoreworICAgIGludCBwZWFrX2Jpbiwgcm1zX2JpbjsKKyAgICBmbG9hdCBwZWFrLCBybXM7CisKKyAgICBybXMgPSBzcXJ0KDIgKiBwLT5zdW0gLyBwLT5uYl9zYW1wbGVzKTsKKyAgICBwZWFrID0gcC0+cGVhazsKKyAgICBybXNfYmluID0gYXZfY2xpcChybXMgKiAxMDAwMCwgMCwgMTAwMDApOworICAgIHBlYWtfYmluID0gYXZfY2xpcChwZWFrICogMTAwMDAsIDAsIDEwMDAwKTsKKyAgICBwLT5ybXNbcm1zX2Jpbl0rKzsKKyAgICBwLT5wZWFrc1twZWFrX2Jpbl0rKzsKKworICAgIHAtPnBlYWsgPSAwOworICAgIHAtPnN1bSA9IDA7CisgICAgcC0+bmJfc2FtcGxlcyA9IDA7CisgICAgcC0+YmxrbnVtKys7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV9zdGF0KERSTWV0ZXJDb250ZXh0ICpzLCBDaGFubmVsU3RhdHMgKnAsIGZsb2F0IHNhbXBsZSkKK3sKKyAgICBpZiAocC0+bmJfc2FtcGxlcyA+PSBzLT50Y19zYW1wbGVzKSB7CisgICAgICAgIGZpbmlzaF9ibG9jayhwKTsKKyAgICB9CisKKyAgICBwLT5wZWFrID0gRkZNQVgoRkZBQlMoc2FtcGxlKSwgcC0+cGVhayk7CisgICAgcC0+c3VtICs9IHNhbXBsZSAqIHNhbXBsZTsKKyAgICBwLT5uYl9zYW1wbGVzKys7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCit7CisgICAgRFJNZXRlckNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBpbnQgY2hhbm5lbHMgPSBzLT5uYl9jaGFubmVsczsKKyAgICBpbnQgaSwgYzsKKworICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUUDoKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIENoYW5uZWxTdGF0cyAqcCA9ICZzLT5jaHN0YXRzW2NdOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYyA9IChjb25zdCBmbG9hdCAqKWJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrLCBzcmMrKykKKyAgICAgICAgICAgICAgICB1cGRhdGVfc3RhdChzLCBwLCAqc3JjKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOiB7CisgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMgPSAoY29uc3QgZmxvYXQgKilidWYtPmV4dGVuZGVkX2RhdGFbMF07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGJ1Zi0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKywgc3JjKyspCisgICAgICAgICAgICAgICAgdXBkYXRlX3N0YXQocywgJnMtPmNoc3RhdHNbY10sICpzcmMpOworICAgICAgICB9fQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGlubGluay0+ZHN0LT5vdXRwdXRzWzBdLCBidWYpOworfQorCisjZGVmaW5lIFNRUihhKSAoKGEpKihhKSkKKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRFJNZXRlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZmxvYXQgZHIgPSAwOworICAgIGludCBjaDsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIENoYW5uZWxTdGF0cyAqcCA9ICZzLT5jaHN0YXRzW2NoXTsKKyAgICAgICAgZmxvYXQgY2hkciwgc2Vjb25kcGVhaywgcm1zc3VtID0gMDsKKyAgICAgICAgaW50IGksIGosIGZpcnN0ID0gMDsKKworICAgICAgICBmaW5pc2hfYmxvY2socCk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSAxMDAwMDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocC0+cGVha3NbMTAwMDAgLSBpXSkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZmlyc3QgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2Vjb25kcGVhayA9ICgxMDAwMCAtIGkpIC8gMTAwMDAuOworCisgICAgICAgIGZvciAoaSA9IDEwMDAwLCBqID0gMDsgaSA+PSAwICYmIGogPCAwLjIgKiBwLT5ibGtudW07IGktLSkgeworICAgICAgICAgICAgaWYgKHAtPnJtc1tpXSkgeworICAgICAgICAgICAgICAgIHJtc3N1bSArPSBTUVIoaSAvIDEwMDAwLikgKiBwLT5ybXNbaV07CisgICAgICAgICAgICAgICAgaiArPSBwLT5ybXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjaGRyID0gMjAgKiBsb2cxMChzZWNvbmRwZWFrIC8gc3FydChybXNzdW0gLyAoMC4yICogcC0+YmxrbnVtKSkpOworICAgICAgICBkciArPSBjaGRyOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkNoYW5uZWwgJWQ6IERSOiAlLjFmXG4iLCBjaCArIDEsIGNoZHIpOworICAgIH0KKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiT3ZlcmFsbCBEUjogJS4xZlxuIiwgZHIgLyBzLT5uYl9jaGFubmVscyk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERSTWV0ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKHMtPm5iX2NoYW5uZWxzKQorICAgICAgICBwcmludF9zdGF0cyhjdHgpOworICAgIGF2X2ZyZWVwKCZzLT5jaHN0YXRzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGRybWV0ZXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBkcm1ldGVyX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2RybWV0ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiZHJtZXRlciIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWVhc3VyZSBhdWRpbyBkeW5hbWljIHJhbmdlLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihEUk1ldGVyQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZHJtZXRlcl9jbGFzcywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IGRybWV0ZXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gZHJtZXRlcl9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2R5bmF1ZG5vcm0uYyBiL2xpYmF2ZmlsdGVyL2FmX2R5bmF1ZG5vcm0uYwppbmRleCAxZGQyMjFjLi41OTE5MzA0IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9keW5hdWRub3JtLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfZHluYXVkbm9ybS5jCkBAIC0zNDEsNyArMzQxLDcgQEAKICAgICByZXR1cm4gZmFkZV9mYWN0b3JzWzBdW3Bvc10gKiBwcmV2ICsgZmFkZV9mYWN0b3JzWzFdW3Bvc10gKiBuZXh0OwogfQogCi1zdGF0aWMgaW5saW5lIGRvdWJsZSBwb3cyKGNvbnN0IGRvdWJsZSB2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHBvd18yKGNvbnN0IGRvdWJsZSB2YWx1ZSkKIHsKICAgICByZXR1cm4gdmFsdWUgKiB2YWx1ZTsKIH0KQEAgLTM1OCw3ICszNTgsNyBAQAogICAgIGludCBjLCBpOwogCiAgICAgaWYgKGNoYW5uZWwgPT0gLTEpIHsKLSAgICAgICAgZm9yIChjID0gMDsgYyA8IGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSk7IGMrKykgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgZnJhbWUtPmNoYW5uZWxzOyBjKyspIHsKICAgICAgICAgICAgIGRvdWJsZSAqZGF0YV9wdHIgPSAoZG91YmxlICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbY107CiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bmJfc2FtcGxlczsgaSsrKQpAQCAtMzgwLDE5ICszODAsMTkgQEAKICAgICBpbnQgYywgaTsKIAogICAgIGlmIChjaGFubmVsID09IC0xKSB7Ci0gICAgICAgIGZvciAoYyA9IDA7IGMgPCBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpOyBjKyspIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGZyYW1lLT5jaGFubmVsczsgYysrKSB7CiAgICAgICAgICAgICBjb25zdCBkb3VibGUgKmRhdGFfcHRyID0gKGRvdWJsZSAqKWZyYW1lLT5leHRlbmRlZF9kYXRhW2NdOwogCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX3NhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgICAgIHJtc192YWx1ZSArPSBwb3cyKGRhdGFfcHRyW2ldKTsKKyAgICAgICAgICAgICAgICBybXNfdmFsdWUgKz0gcG93XzIoZGF0YV9wdHJbaV0pOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcm1zX3ZhbHVlIC89IGZyYW1lLT5uYl9zYW1wbGVzICogYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKTsKKyAgICAgICAgcm1zX3ZhbHVlIC89IGZyYW1lLT5uYl9zYW1wbGVzICogZnJhbWUtPmNoYW5uZWxzOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IGRvdWJsZSAqZGF0YV9wdHIgPSAoZG91YmxlICopZnJhbWUtPmV4dGVuZGVkX2RhdGFbY2hhbm5lbF07CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bmJfc2FtcGxlczsgaSsrKSB7Ci0gICAgICAgICAgICBybXNfdmFsdWUgKz0gcG93MihkYXRhX3B0cltpXSk7CisgICAgICAgICAgICBybXNfdmFsdWUgKz0gcG93XzIoZGF0YV9wdHJbaV0pOwogICAgICAgICB9CiAKICAgICAgICAgcm1zX3ZhbHVlIC89IGZyYW1lLT5uYl9zYW1wbGVzOwpAQCAtNDM5LDE1ICs0MzksMTIgQEAKICAgICBpZiAoY3F1ZXVlX2VtcHR5KHMtPmdhaW5faGlzdG9yeV9vcmlnaW5hbFtjaGFubmVsXSkgfHwKICAgICAgICAgY3F1ZXVlX2VtcHR5KHMtPmdhaW5faGlzdG9yeV9taW5pbXVtW2NoYW5uZWxdKSkgewogICAgICAgICBjb25zdCBpbnQgcHJlX2ZpbGxfc2l6ZSA9IHMtPmZpbHRlcl9zaXplIC8gMjsKKyAgICAgICAgY29uc3QgZG91YmxlIGluaXRpYWxfdmFsdWUgPSBzLT5hbHRfYm91bmRhcnlfbW9kZSA/IGN1cnJlbnRfZ2Fpbl9mYWN0b3IgOiAxLjA7CiAKLSAgICAgICAgcy0+cHJldl9hbXBsaWZpY2F0aW9uX2ZhY3RvcltjaGFubmVsXSA9IHMtPmFsdF9ib3VuZGFyeV9tb2RlID8gY3VycmVudF9nYWluX2ZhY3RvciA6IDEuMDsKKyAgICAgICAgcy0+cHJldl9hbXBsaWZpY2F0aW9uX2ZhY3RvcltjaGFubmVsXSA9IGluaXRpYWxfdmFsdWU7CiAKICAgICAgICAgd2hpbGUgKGNxdWV1ZV9zaXplKHMtPmdhaW5faGlzdG9yeV9vcmlnaW5hbFtjaGFubmVsXSkgPCBwcmVfZmlsbF9zaXplKSB7Ci0gICAgICAgICAgICBjcXVldWVfZW5xdWV1ZShzLT5nYWluX2hpc3Rvcnlfb3JpZ2luYWxbY2hhbm5lbF0sIHMtPmFsdF9ib3VuZGFyeV9tb2RlID8gY3VycmVudF9nYWluX2ZhY3RvciA6IDEuMCk7Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoY3F1ZXVlX3NpemUocy0+Z2Fpbl9oaXN0b3J5X21pbmltdW1bY2hhbm5lbF0pIDwgcHJlX2ZpbGxfc2l6ZSkgewotICAgICAgICAgICAgY3F1ZXVlX2VucXVldWUocy0+Z2Fpbl9oaXN0b3J5X21pbmltdW1bY2hhbm5lbF0sIHMtPmFsdF9ib3VuZGFyeV9tb2RlID8gY3VycmVudF9nYWluX2ZhY3RvciA6IDEuMCk7CisgICAgICAgICAgICBjcXVldWVfZW5xdWV1ZShzLT5nYWluX2hpc3Rvcnlfb3JpZ2luYWxbY2hhbm5lbF0sIGluaXRpYWxfdmFsdWUpOwogICAgICAgICB9CiAgICAgfQogCkBAIC00NTYsNiArNDUzLDE5IEBACiAgICAgd2hpbGUgKGNxdWV1ZV9zaXplKHMtPmdhaW5faGlzdG9yeV9vcmlnaW5hbFtjaGFubmVsXSkgPj0gcy0+ZmlsdGVyX3NpemUpIHsKICAgICAgICAgZG91YmxlIG1pbmltdW07CiAgICAgICAgIGF2X2Fzc2VydDAoY3F1ZXVlX3NpemUocy0+Z2Fpbl9oaXN0b3J5X29yaWdpbmFsW2NoYW5uZWxdKSA9PSBzLT5maWx0ZXJfc2l6ZSk7CisKKyAgICAgICAgaWYgKGNxdWV1ZV9lbXB0eShzLT5nYWluX2hpc3RvcnlfbWluaW11bVtjaGFubmVsXSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBwcmVfZmlsbF9zaXplID0gcy0+ZmlsdGVyX3NpemUgLyAyOworICAgICAgICAgICAgZG91YmxlIGluaXRpYWxfdmFsdWUgPSBzLT5hbHRfYm91bmRhcnlfbW9kZSA/IGNxdWV1ZV9wZWVrKHMtPmdhaW5faGlzdG9yeV9vcmlnaW5hbFtjaGFubmVsXSwgMCkgOiAxLjA7CisgICAgICAgICAgICBpbnQgaW5wdXQgPSBwcmVfZmlsbF9zaXplOworCisgICAgICAgICAgICB3aGlsZSAoY3F1ZXVlX3NpemUocy0+Z2Fpbl9oaXN0b3J5X21pbmltdW1bY2hhbm5lbF0pIDwgcHJlX2ZpbGxfc2l6ZSkgeworICAgICAgICAgICAgICAgIGlucHV0Kys7CisgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZSA9IEZGTUlOKGluaXRpYWxfdmFsdWUsIGNxdWV1ZV9wZWVrKHMtPmdhaW5faGlzdG9yeV9vcmlnaW5hbFtjaGFubmVsXSwgaW5wdXQpKTsKKyAgICAgICAgICAgICAgICBjcXVldWVfZW5xdWV1ZShzLT5nYWluX2hpc3RvcnlfbWluaW11bVtjaGFubmVsXSwgaW5pdGlhbF92YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBtaW5pbXVtID0gbWluaW11bV9maWx0ZXIocy0+Z2Fpbl9oaXN0b3J5X29yaWdpbmFsW2NoYW5uZWxdKTsKIAogICAgICAgICBjcXVldWVfZW5xdWV1ZShzLT5nYWluX2hpc3RvcnlfbWluaW11bVtjaGFubmVsXSwgbWluaW11bSk7CkBAIC01MTAsNyArNTIwLDggQEAKICAgICAgICAgZG91YmxlIHN0ZXBfc2l6ZSA9IDEuMDsKIAogICAgICAgICB3aGlsZSAoc3RlcF9zaXplID4gREJMX0VQU0lMT04pIHsKLSAgICAgICAgICAgIHdoaWxlICgoY3VycmVudF90aHJlc2hvbGQgKyBzdGVwX3NpemUgPiBjdXJyZW50X3RocmVzaG9sZCkgJiYKKyAgICAgICAgICAgIHdoaWxlICgobGxyaW50KChjdXJyZW50X3RocmVzaG9sZCArIHN0ZXBfc2l6ZSkgKiAoVUlOVDY0X0MoMSkgPDwgNjMpKSA+CisgICAgICAgICAgICAgICAgICAgIGxscmludChjdXJyZW50X3RocmVzaG9sZCAqIChVSU5UNjRfQygxKSA8PCA2MykpKSAmJgogICAgICAgICAgICAgICAgICAgIChib3VuZChjdXJyZW50X3RocmVzaG9sZCArIHN0ZXBfc2l6ZSwgMS4wKSA8PSB0aHJlc2hvbGQpKSB7CiAgICAgICAgICAgICAgICAgY3VycmVudF90aHJlc2hvbGQgKz0gc3RlcF9zaXplOwogICAgICAgICAgICAgfQpAQCAtNTM1LDcgKzU0Niw3IEBACiAgICAgICAgICAgICBjb25zdCBkb3VibGUgKmRhdGFfcHRyID0gKGRvdWJsZSAqKWZyYW1lLT5leHRlbmRlZF9kYXRhW2NdOwogCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX3NhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgICAgIHZhcmlhbmNlICs9IHBvdzIoZGF0YV9wdHJbaV0pOyAgLy8gQXNzdW1lIHRoYXQgTUVBTiBpcyAqemVybyoKKyAgICAgICAgICAgICAgICB2YXJpYW5jZSArPSBwb3dfMihkYXRhX3B0cltpXSk7ICAvLyBBc3N1bWUgdGhhdCBNRUFOIGlzICp6ZXJvKgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHZhcmlhbmNlIC89IChzLT5jaGFubmVscyAqIGZyYW1lLT5uYl9zYW1wbGVzKSAtIDE7CkBAIC01NDMsNyArNTU0LDcgQEAKICAgICAgICAgY29uc3QgZG91YmxlICpkYXRhX3B0ciA9IChkb3VibGUgKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaGFubmVsXTsKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWUtPm5iX3NhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgdmFyaWFuY2UgKz0gcG93MihkYXRhX3B0cltpXSk7ICAgICAgLy8gQXNzdW1lIHRoYXQgTUVBTiBpcyAqemVybyoKKyAgICAgICAgICAgIHZhcmlhbmNlICs9IHBvd18yKGRhdGFfcHRyW2ldKTsgICAgICAvLyBBc3N1bWUgdGhhdCBNRUFOIGlzICp6ZXJvKgogICAgICAgICB9CiAgICAgICAgIHZhcmlhbmNlIC89IGZyYW1lLT5uYl9zYW1wbGVzIC0gMTsKICAgICB9CkBAIC02OTgsOCArNzA5LDE1IEBACiAKICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKIAotICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgIWN0eC0+aXNfZGlzYWJsZWQgJiYgcy0+ZGVsYXkpCi0gICAgICAgIHJldCA9IGZsdXNoX2J1ZmZlcihzLCBjdHgtPmlucHV0c1swXSwgb3V0bGluayk7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiAhY3R4LT5pc19kaXNhYmxlZCAmJiBzLT5kZWxheSkgeworICAgICAgICBpZiAoIWNxdWV1ZV9lbXB0eShzLT5nYWluX2hpc3Rvcnlfc21vb3RoZWRbMF0pKSB7CisgICAgICAgICAgICByZXQgPSBmbHVzaF9idWZmZXIocywgY3R4LT5pbnB1dHNbMF0sIG91dGxpbmspOworICAgICAgICB9IGVsc2UgaWYgKHMtPnF1ZXVlLmF2YWlsYWJsZSkgeworICAgICAgICAgICAgQVZGcmFtZSAqb3V0ID0gZmZfYnVmcXVldWVfZ2V0KCZzLT5xdWV1ZSk7CisKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworICAgICAgICB9CisgICAgfQogCiAgICAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2VhcndheC5jIGIvbGliYXZmaWx0ZXIvYWZfZWFyd2F4LmMKaW5kZXggYjBiYTRjZi4uY2RkMmI0ZiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfZWFyd2F4LmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfZWFyd2F4LmMKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAwLCAgIC01LAogICAgIDQsICAgIDB9OwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBFYXJ3YXhDb250ZXh0IHsKICAgICBpbnQxNl90IHRhcHNbTlVNVEFQUyAqIDJdOwogfSBFYXJ3YXhDb250ZXh0OwogCkBAIC0xMTUsNyArMTE1LDcgQEAKIHsKICAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKICAgICBpbnQxNl90ICp0YXBzLCAqZW5kaW4sICppbiwgKm91dDsKLSAgICBBVkZyYW1lICpvdXRzYW1wbGVzID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIGluc2FtcGxlcy0+bmJfc2FtcGxlcyk7CisgICAgQVZGcmFtZSAqb3V0c2FtcGxlcyA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgaW5zYW1wbGVzLT5uYl9zYW1wbGVzKTsKICAgICBpbnQgbGVuOwogCiAgICAgaWYgKCFvdXRzYW1wbGVzKSB7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9leHRyYXN0ZXJlby5jIGIvbGliYXZmaWx0ZXIvYWZfZXh0cmFzdGVyZW8uYwppbmRleCBhNzQ2MDA2Li4xM2M2ZjQ3IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9leHRyYXN0ZXJlby5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2V4dHJhc3RlcmVvLmMKQEAgLTcxLDcgKzcxLDcgQEAKICAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CiAgICAgICAgIG91dCA9IGluOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgaW4tPm5iX3NhbXBsZXMpOwogICAgICAgICBpZiAoIW91dCkgewogICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTkwLDkgKzkwLDEyIEBACiAgICAgICAgIHJpZ2h0ICAgPSBhdmVyYWdlICsgbXVsdCAqIChyaWdodCAtIGF2ZXJhZ2UpOwogCiAgICAgICAgIGlmIChzLT5jbGlwKSB7Ci0gICAgICAgICAgICBkc3RbbiAqIDIgICAgXSA9IGF2X2NsaXBmKGxlZnQsICAtMSwgMSk7Ci0gICAgICAgICAgICBkc3RbbiAqIDIgKyAxXSA9IGF2X2NsaXBmKHJpZ2h0LCAtMSwgMSk7CisgICAgICAgICAgICBsZWZ0ICA9IGF2X2NsaXBmKGxlZnQsICAtMSwgMSk7CisgICAgICAgICAgICByaWdodCA9IGF2X2NsaXBmKHJpZ2h0LCAtMSwgMSk7CiAgICAgICAgIH0KKworICAgICAgICBkc3RbbiAqIDIgICAgXSA9IGxlZnQ7CisgICAgICAgIGRzdFtuICogMiArIDFdID0gcmlnaHQ7CiAgICAgfQogCiAgICAgaWYgKG91dCAhPSBpbikKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2ZpcmVxdWFsaXplci5jIGIvbGliYXZmaWx0ZXIvYWZfZmlyZXF1YWxpemVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkZGM4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2ZpcmVxdWFsaXplci5jCkBAIC0wLDAgKzEsOTgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IE11aGFtbWFkIEZhaXogPG1mY2M2NEBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2ZmZ0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKKyNkZWZpbmUgUkRGVF9CSVRTX01JTiA0CisjZGVmaW5lIFJERlRfQklUU19NQVggMTYKKworZW51bSBXaW5kb3dGdW5jIHsKKyAgICBXRlVOQ19SRUNUQU5HVUxBUiwKKyAgICBXRlVOQ19IQU5OLAorICAgIFdGVU5DX0hBTU1JTkcsCisgICAgV0ZVTkNfQkxBQ0tNQU4sCisgICAgV0ZVTkNfTlVUVEFMTDMsCisgICAgV0ZVTkNfTU5VVFRBTEwzLAorICAgIFdGVU5DX05VVFRBTEwsCisgICAgV0ZVTkNfQk5VVFRBTEwsCisgICAgV0ZVTkNfQkhBUlJJUywKKyAgICBXRlVOQ19UVUtFWSwKKyAgICBOQl9XRlVOQworfTsKKworZW51bSBTY2FsZSB7CisgICAgU0NBTEVfTElOTElOLAorICAgIFNDQUxFX0xJTkxPRywKKyAgICBTQ0FMRV9MT0dMSU4sCisgICAgU0NBTEVfTE9HTE9HLAorICAgIE5CX1NDQUxFCit9OworCisjZGVmaW5lIE5CX0dBSU5fRU5UUllfTUFYIDQwOTYKK3R5cGVkZWYgc3RydWN0IEdhaW5FbnRyeSB7CisgICAgZG91YmxlICBmcmVxOworICAgIGRvdWJsZSAgZ2FpbjsKK30gR2FpbkVudHJ5OworCit0eXBlZGVmIHN0cnVjdCBPdmVybGFwSW5kZXggeworICAgIGludCBidWZfaWR4OworICAgIGludCBvdmVybGFwX2lkeDsKK30gT3ZlcmxhcEluZGV4OworCit0eXBlZGVmIHN0cnVjdCBGSVJFcXVhbGl6ZXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIFJERlRDb250ZXh0ICAgKmFuYWx5c2lzX3JkZnQ7CisgICAgUkRGVENvbnRleHQgICAqYW5hbHlzaXNfaXJkZnQ7CisgICAgUkRGVENvbnRleHQgICAqcmRmdDsKKyAgICBSREZUQ29udGV4dCAgICppcmRmdDsKKyAgICBGRlRDb250ZXh0ICAgICpmZnRfY3R4OworICAgIFJERlRDb250ZXh0ICAgKmNlcHN0cnVtX3JkZnQ7CisgICAgUkRGVENvbnRleHQgICAqY2Vwc3RydW1faXJkZnQ7CisgICAgaW50ICAgICAgICAgICBhbmFseXNpc19yZGZ0X2xlbjsKKyAgICBpbnQgICAgICAgICAgIHJkZnRfbGVuOworICAgIGludCAgICAgICAgICAgY2Vwc3RydW1fbGVuOworCisgICAgZmxvYXQgICAgICAgICAqYW5hbHlzaXNfYnVmOworICAgIGZsb2F0ICAgICAgICAgKmR1bXBfYnVmOworICAgIGZsb2F0ICAgICAgICAgKmtlcm5lbF90bXBfYnVmOworICAgIGZsb2F0ICAgICAgICAgKmtlcm5lbF9idWY7CisgICAgZmxvYXQgICAgICAgICAqY2Vwc3RydW1fYnVmOworICAgIGZsb2F0ICAgICAgICAgKmNvbnZfYnVmOworICAgIE92ZXJsYXBJbmRleCAgKmNvbnZfaWR4OworICAgIGludCAgICAgICAgICAgZmlyX2xlbjsKKyAgICBpbnQgICAgICAgICAgIG5zYW1wbGVzX21heDsKKyAgICBpbnQ2NF90ICAgICAgIG5leHRfcHRzOworICAgIGludCAgICAgICAgICAgZnJhbWVfbnNhbXBsZXNfbWF4OworICAgIGludCAgICAgICAgICAgcmVtYWluaW5nOworCisgICAgY2hhciAgICAgICAgICAqZ2Fpbl9jbWQ7CisgICAgY2hhciAgICAgICAgICAqZ2Fpbl9lbnRyeV9jbWQ7CisgICAgY29uc3QgY2hhciAgICAqZ2FpbjsKKyAgICBjb25zdCBjaGFyICAgICpnYWluX2VudHJ5OworICAgIGRvdWJsZSAgICAgICAgZGVsYXk7CisgICAgZG91YmxlICAgICAgICBhY2N1cmFjeTsKKyAgICBpbnQgICAgICAgICAgIHdmdW5jOworICAgIGludCAgICAgICAgICAgZml4ZWQ7CisgICAgaW50ICAgICAgICAgICBtdWx0aTsKKyAgICBpbnQgICAgICAgICAgIHplcm9fcGhhc2U7CisgICAgaW50ICAgICAgICAgICBzY2FsZTsKKyAgICBjaGFyICAgICAgICAgICpkdW1wZmlsZTsKKyAgICBpbnQgICAgICAgICAgIGR1bXBzY2FsZTsKKyAgICBpbnQgICAgICAgICAgIGZmdDI7CisgICAgaW50ICAgICAgICAgICBtaW5fcGhhc2U7CisKKyAgICBpbnQgICAgICAgICAgIG5iX2dhaW5fZW50cnk7CisgICAgaW50ICAgICAgICAgICBnYWluX2VudHJ5X2VycjsKKyAgICBHYWluRW50cnkgICAgIGdhaW5fZW50cnlfdGJsW05CX0dBSU5fRU5UUllfTUFYXTsKK30gRklSRXF1YWxpemVyQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRklSRXF1YWxpemVyQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmaXJlcXVhbGl6ZXJfb3B0aW9uc1tdID0geworICAgIHsgImdhaW4iLCAic2V0IGdhaW4gY3VydmUiLCBPRkZTRVQoZ2FpbiksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImdhaW5faW50ZXJwb2xhdGUoZikiIH0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAiZ2Fpbl9lbnRyeSIsICJzZXQgZ2FpbiBlbnRyeSIsIE9GRlNFVChnYWluX2VudHJ5KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAiZGVsYXkiLCAic2V0IGRlbGF5IiwgT0ZGU0VUKGRlbGF5KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwLjAxIH0sIDAuMCwgMWUxMCwgRkxBR1MgfSwKKyAgICB7ICJhY2N1cmFjeSIsICJzZXQgYWNjdXJhY3kiLCBPRkZTRVQoYWNjdXJhY3kpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDUuMCB9LCAwLjAsIDFlMTAsIEZMQUdTIH0sCisgICAgeyAid2Z1bmMiLCAic2V0IHdpbmRvdyBmdW5jdGlvbiIsIE9GRlNFVCh3ZnVuYyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gV0ZVTkNfSEFOTiB9LCAwLCBOQl9XRlVOQy0xLCBGTEFHUywgIndmdW5jIiB9LAorICAgICAgICB7ICJyZWN0YW5ndWxhciIsICJyZWN0YW5ndWxhciB3aW5kb3ciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gV0ZVTkNfUkVDVEFOR1VMQVIgfSwgMCwgMCwgRkxBR1MsICJ3ZnVuYyIgfSwKKyAgICAgICAgeyAiaGFubiIsICJoYW5uIHdpbmRvdyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBXRlVOQ19IQU5OIH0sIDAsIDAsIEZMQUdTLCAid2Z1bmMiIH0sCisgICAgICAgIHsgImhhbW1pbmciLCAiaGFtbWluZyB3aW5kb3ciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gV0ZVTkNfSEFNTUlORyB9LCAwLCAwLCBGTEFHUywgIndmdW5jIiB9LAorICAgICAgICB7ICJibGFja21hbiIsICJibGFja21hbiB3aW5kb3ciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gV0ZVTkNfQkxBQ0tNQU4gfSwgMCwgMCwgRkxBR1MsICJ3ZnVuYyIgfSwKKyAgICAgICAgeyAibnV0dGFsbDMiLCAiMy10ZXJtIG51dHRhbGwgd2luZG93IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFdGVU5DX05VVFRBTEwzIH0sIDAsIDAsIEZMQUdTLCAid2Z1bmMiIH0sCisgICAgICAgIHsgIm1udXR0YWxsMyIsICJtaW5pbXVtIDMtdGVybSBudXR0YWxsIHdpbmRvdyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBXRlVOQ19NTlVUVEFMTDMgfSwgMCwgMCwgRkxBR1MsICJ3ZnVuYyIgfSwKKyAgICAgICAgeyAibnV0dGFsbCIsICJudXR0YWxsIHdpbmRvdyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBXRlVOQ19OVVRUQUxMIH0sIDAsIDAsIEZMQUdTLCAid2Z1bmMiIH0sCisgICAgICAgIHsgImJudXR0YWxsIiwgImJsYWNrbWFuLW51dHRhbGwgd2luZG93IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFdGVU5DX0JOVVRUQUxMIH0sIDAsIDAsIEZMQUdTLCAid2Z1bmMiIH0sCisgICAgICAgIHsgImJoYXJyaXMiLCAiYmxhY2ttYW4taGFycmlzIHdpbmRvdyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBXRlVOQ19CSEFSUklTIH0sIDAsIDAsIEZMQUdTLCAid2Z1bmMiIH0sCisgICAgICAgIHsgInR1a2V5IiwgInR1a2V5IHdpbmRvdyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBXRlVOQ19UVUtFWSB9LCAwLCAwLCBGTEFHUywgIndmdW5jIiB9LAorICAgIHsgImZpeGVkIiwgInNldCBmaXhlZCBmcmFtZSBzYW1wbGVzIiwgT0ZGU0VUKGZpeGVkKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgIm11bHRpIiwgInNldCBtdWx0aSBjaGFubmVscyBtb2RlIiwgT0ZGU0VUKG11bHRpKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInplcm9fcGhhc2UiLCAic2V0IHplcm8gcGhhc2UgbW9kZSIsIE9GRlNFVCh6ZXJvX3BoYXNlKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInNjYWxlIiwgInNldCBnYWluIHNjYWxlIiwgT0ZGU0VUKHNjYWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBTQ0FMRV9MSU5MT0cgfSwgMCwgTkJfU0NBTEUtMSwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAibGlubGluIiwgImxpbmVhci1mcmVxIGxpbmVhci1nYWluIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFNDQUxFX0xJTkxJTiB9LCAwLCAwLCBGTEFHUywgInNjYWxlIiB9LAorICAgICAgICB7ICJsaW5sb2ciLCAibGluZWFyLWZyZXEgbG9nYXJpdGhtaWMtZ2FpbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBTQ0FMRV9MSU5MT0cgfSwgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAibG9nbGluIiwgImxvZ2FyaXRobWljLWZyZXEgbGluZWFyLWdhaW4iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gU0NBTEVfTE9HTElOIH0sIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgICAgIHsgImxvZ2xvZyIsICJsb2dhcml0aG1pYy1mcmVxIGxvZ2FyaXRobWljLWdhaW4iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gU0NBTEVfTE9HTE9HIH0sIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgeyAiZHVtcGZpbGUiLCAic2V0IGR1bXAgZmlsZSIsIE9GRlNFVChkdW1wZmlsZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgImR1bXBzY2FsZSIsICJzZXQgZHVtcCBzY2FsZSIsIE9GRlNFVChkdW1wc2NhbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IFNDQUxFX0xJTkxPRyB9LCAwLCBOQl9TQ0FMRS0xLCBGTEFHUywgInNjYWxlIiB9LAorICAgIHsgImZmdDIiLCAic2V0IDItY2hhbm5lbHMgZmZ0IiwgT0ZGU0VUKGZmdDIpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAibWluX3BoYXNlIiwgInNldCBtaW5pbXVtIHBoYXNlIG1vZGUiLCBPRkZTRVQobWluX3BoYXNlKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZmlyZXF1YWxpemVyKTsKKworc3RhdGljIHZvaWQgY29tbW9uX3VuaW5pdChGSVJFcXVhbGl6ZXJDb250ZXh0ICpzKQoreworICAgIGF2X3JkZnRfZW5kKHMtPmFuYWx5c2lzX3JkZnQpOworICAgIGF2X3JkZnRfZW5kKHMtPmFuYWx5c2lzX2lyZGZ0KTsKKyAgICBhdl9yZGZ0X2VuZChzLT5yZGZ0KTsKKyAgICBhdl9yZGZ0X2VuZChzLT5pcmRmdCk7CisgICAgYXZfZmZ0X2VuZChzLT5mZnRfY3R4KTsKKyAgICBhdl9yZGZ0X2VuZChzLT5jZXBzdHJ1bV9yZGZ0KTsKKyAgICBhdl9yZGZ0X2VuZChzLT5jZXBzdHJ1bV9pcmRmdCk7CisgICAgcy0+YW5hbHlzaXNfcmRmdCA9IHMtPmFuYWx5c2lzX2lyZGZ0ID0gcy0+cmRmdCA9IHMtPmlyZGZ0ID0gTlVMTDsKKyAgICBzLT5mZnRfY3R4ID0gTlVMTDsKKyAgICBzLT5jZXBzdHJ1bV9yZGZ0ID0gTlVMTDsKKyAgICBzLT5jZXBzdHJ1bV9pcmRmdCA9IE5VTEw7CisKKyAgICBhdl9mcmVlcCgmcy0+YW5hbHlzaXNfYnVmKTsKKyAgICBhdl9mcmVlcCgmcy0+ZHVtcF9idWYpOworICAgIGF2X2ZyZWVwKCZzLT5rZXJuZWxfdG1wX2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPmtlcm5lbF9idWYpOworICAgIGF2X2ZyZWVwKCZzLT5jZXBzdHJ1bV9idWYpOworICAgIGF2X2ZyZWVwKCZzLT5jb252X2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPmNvbnZfaWR4KTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRklSRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGNvbW1vbl91bmluaXQocyk7CisgICAgYXZfZnJlZXAoJnMtPmdhaW5fY21kKTsKKyAgICBhdl9mcmVlcCgmcy0+Z2Fpbl9lbnRyeV9jbWQpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFRQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworICAgIGludCByZXQ7CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfY291bnRzKCk7CisgICAgaWYgKCFsYXlvdXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworfQorCitzdGF0aWMgdm9pZCBmYXN0X2NvbnZvbHV0ZShGSVJFcXVhbGl6ZXJDb250ZXh0ICphdl9yZXN0cmljdCBzLCBjb25zdCBmbG9hdCAqYXZfcmVzdHJpY3Qga2VybmVsX2J1ZiwgZmxvYXQgKmF2X3Jlc3RyaWN0IGNvbnZfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxhcEluZGV4ICphdl9yZXN0cmljdCBpZHgsIGZsb2F0ICphdl9yZXN0cmljdCBkYXRhLCBpbnQgbnNhbXBsZXMpCit7CisgICAgaWYgKG5zYW1wbGVzIDw9IHMtPm5zYW1wbGVzX21heCkgeworICAgICAgICBmbG9hdCAqYnVmID0gY29udl9idWYgKyBpZHgtPmJ1Zl9pZHggKiBzLT5yZGZ0X2xlbjsKKyAgICAgICAgZmxvYXQgKm9idWYgPSBjb252X2J1ZiArICFpZHgtPmJ1Zl9pZHggKiBzLT5yZGZ0X2xlbiArIGlkeC0+b3ZlcmxhcF9pZHg7CisgICAgICAgIGludCBjZW50ZXIgPSBzLT5maXJfbGVuLzI7CisgICAgICAgIGludCBrOworCisgICAgICAgIG1lbXNldChidWYsIDAsIGNlbnRlciAqIHNpemVvZigqZGF0YSkpOworICAgICAgICBtZW1jcHkoYnVmICsgY2VudGVyLCBkYXRhLCBuc2FtcGxlcyAqIHNpemVvZigqZGF0YSkpOworICAgICAgICBtZW1zZXQoYnVmICsgY2VudGVyICsgbnNhbXBsZXMsIDAsIChzLT5yZGZ0X2xlbiAtIG5zYW1wbGVzIC0gY2VudGVyKSAqIHNpemVvZigqZGF0YSkpOworICAgICAgICBhdl9yZGZ0X2NhbGMocy0+cmRmdCwgYnVmKTsKKworICAgICAgICBidWZbMF0gKj0ga2VybmVsX2J1ZlswXTsKKyAgICAgICAgYnVmWzFdICo9IGtlcm5lbF9idWZbcy0+cmRmdF9sZW4vMl07CisgICAgICAgIGZvciAoayA9IDE7IGsgPCBzLT5yZGZ0X2xlbi8yOyBrKyspIHsKKyAgICAgICAgICAgIGJ1ZlsyKmtdICo9IGtlcm5lbF9idWZba107CisgICAgICAgICAgICBidWZbMiprKzFdICo9IGtlcm5lbF9idWZba107CisgICAgICAgIH0KKworICAgICAgICBhdl9yZGZ0X2NhbGMocy0+aXJkZnQsIGJ1Zik7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5yZGZ0X2xlbiAtIGlkeC0+b3ZlcmxhcF9pZHg7IGsrKykKKyAgICAgICAgICAgIGJ1ZltrXSArPSBvYnVmW2tdOworICAgICAgICBtZW1jcHkoZGF0YSwgYnVmLCBuc2FtcGxlcyAqIHNpemVvZigqZGF0YSkpOworICAgICAgICBpZHgtPmJ1Zl9pZHggPSAhaWR4LT5idWZfaWR4OworICAgICAgICBpZHgtPm92ZXJsYXBfaWR4ID0gbnNhbXBsZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKG5zYW1wbGVzID4gcy0+bnNhbXBsZXNfbWF4ICogMikgeworICAgICAgICAgICAgZmFzdF9jb252b2x1dGUocywga2VybmVsX2J1ZiwgY29udl9idWYsIGlkeCwgZGF0YSwgcy0+bnNhbXBsZXNfbWF4KTsKKyAgICAgICAgICAgIGRhdGEgKz0gcy0+bnNhbXBsZXNfbWF4OworICAgICAgICAgICAgbnNhbXBsZXMgLT0gcy0+bnNhbXBsZXNfbWF4OworICAgICAgICB9CisgICAgICAgIGZhc3RfY29udm9sdXRlKHMsIGtlcm5lbF9idWYsIGNvbnZfYnVmLCBpZHgsIGRhdGEsIG5zYW1wbGVzLzIpOworICAgICAgICBmYXN0X2NvbnZvbHV0ZShzLCBrZXJuZWxfYnVmLCBjb252X2J1ZiwgaWR4LCBkYXRhICsgbnNhbXBsZXMvMiwgbnNhbXBsZXMgLSBuc2FtcGxlcy8yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZhc3RfY29udm9sdXRlX25vbmxpbmVhcihGSVJFcXVhbGl6ZXJDb250ZXh0ICphdl9yZXN0cmljdCBzLCBjb25zdCBmbG9hdCAqYXZfcmVzdHJpY3Qga2VybmVsX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqYXZfcmVzdHJpY3QgY29udl9idWYsIE92ZXJsYXBJbmRleCAqYXZfcmVzdHJpY3QgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICphdl9yZXN0cmljdCBkYXRhLCBpbnQgbnNhbXBsZXMpCit7CisgICAgaWYgKG5zYW1wbGVzIDw9IHMtPm5zYW1wbGVzX21heCkgeworICAgICAgICBmbG9hdCAqYnVmID0gY29udl9idWYgKyBpZHgtPmJ1Zl9pZHggKiBzLT5yZGZ0X2xlbjsKKyAgICAgICAgZmxvYXQgKm9idWYgPSBjb252X2J1ZiArICFpZHgtPmJ1Zl9pZHggKiBzLT5yZGZ0X2xlbiArIGlkeC0+b3ZlcmxhcF9pZHg7CisgICAgICAgIGludCBrOworCisgICAgICAgIG1lbWNweShidWYsIGRhdGEsIG5zYW1wbGVzICogc2l6ZW9mKCpkYXRhKSk7CisgICAgICAgIG1lbXNldChidWYgKyBuc2FtcGxlcywgMCwgKHMtPnJkZnRfbGVuIC0gbnNhbXBsZXMpICogc2l6ZW9mKCpkYXRhKSk7CisgICAgICAgIGF2X3JkZnRfY2FsYyhzLT5yZGZ0LCBidWYpOworCisgICAgICAgIGJ1ZlswXSAqPSBrZXJuZWxfYnVmWzBdOworICAgICAgICBidWZbMV0gKj0ga2VybmVsX2J1ZlsxXTsKKyAgICAgICAgZm9yIChrID0gMjsgayA8IHMtPnJkZnRfbGVuOyBrICs9IDIpIHsKKyAgICAgICAgICAgIGZsb2F0IHJlLCBpbTsKKyAgICAgICAgICAgIHJlID0gYnVmW2tdICoga2VybmVsX2J1ZltrXSAtIGJ1ZltrKzFdICoga2VybmVsX2J1ZltrKzFdOworICAgICAgICAgICAgaW0gPSBidWZba10gKiBrZXJuZWxfYnVmW2srMV0gKyBidWZbaysxXSAqIGtlcm5lbF9idWZba107CisgICAgICAgICAgICBidWZba10gPSByZTsKKyAgICAgICAgICAgIGJ1ZltrKzFdID0gaW07CisgICAgICAgIH0KKworICAgICAgICBhdl9yZGZ0X2NhbGMocy0+aXJkZnQsIGJ1Zik7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5yZGZ0X2xlbiAtIGlkeC0+b3ZlcmxhcF9pZHg7IGsrKykKKyAgICAgICAgICAgIGJ1ZltrXSArPSBvYnVmW2tdOworICAgICAgICBtZW1jcHkoZGF0YSwgYnVmLCBuc2FtcGxlcyAqIHNpemVvZigqZGF0YSkpOworICAgICAgICBpZHgtPmJ1Zl9pZHggPSAhaWR4LT5idWZfaWR4OworICAgICAgICBpZHgtPm92ZXJsYXBfaWR4ID0gbnNhbXBsZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKG5zYW1wbGVzID4gcy0+bnNhbXBsZXNfbWF4ICogMikgeworICAgICAgICAgICAgZmFzdF9jb252b2x1dGVfbm9ubGluZWFyKHMsIGtlcm5lbF9idWYsIGNvbnZfYnVmLCBpZHgsIGRhdGEsIHMtPm5zYW1wbGVzX21heCk7CisgICAgICAgICAgICBkYXRhICs9IHMtPm5zYW1wbGVzX21heDsKKyAgICAgICAgICAgIG5zYW1wbGVzIC09IHMtPm5zYW1wbGVzX21heDsKKyAgICAgICAgfQorICAgICAgICBmYXN0X2NvbnZvbHV0ZV9ub25saW5lYXIocywga2VybmVsX2J1ZiwgY29udl9idWYsIGlkeCwgZGF0YSwgbnNhbXBsZXMvMik7CisgICAgICAgIGZhc3RfY29udm9sdXRlX25vbmxpbmVhcihzLCBrZXJuZWxfYnVmLCBjb252X2J1ZiwgaWR4LCBkYXRhICsgbnNhbXBsZXMvMiwgbnNhbXBsZXMgLSBuc2FtcGxlcy8yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZhc3RfY29udm9sdXRlMihGSVJFcXVhbGl6ZXJDb250ZXh0ICphdl9yZXN0cmljdCBzLCBjb25zdCBmbG9hdCAqYXZfcmVzdHJpY3Qga2VybmVsX2J1ZiwgRkZUQ29tcGxleCAqYXZfcmVzdHJpY3QgY29udl9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmxhcEluZGV4ICphdl9yZXN0cmljdCBpZHgsIGZsb2F0ICphdl9yZXN0cmljdCBkYXRhMCwgZmxvYXQgKmF2X3Jlc3RyaWN0IGRhdGExLCBpbnQgbnNhbXBsZXMpCit7CisgICAgaWYgKG5zYW1wbGVzIDw9IHMtPm5zYW1wbGVzX21heCkgeworICAgICAgICBGRlRDb21wbGV4ICpidWYgPSBjb252X2J1ZiArIGlkeC0+YnVmX2lkeCAqIHMtPnJkZnRfbGVuOworICAgICAgICBGRlRDb21wbGV4ICpvYnVmID0gY29udl9idWYgKyAhaWR4LT5idWZfaWR4ICogcy0+cmRmdF9sZW4gKyBpZHgtPm92ZXJsYXBfaWR4OworICAgICAgICBpbnQgY2VudGVyID0gcy0+ZmlyX2xlbi8yOworICAgICAgICBpbnQgazsKKyAgICAgICAgZmxvYXQgdG1wOworCisgICAgICAgIG1lbXNldChidWYsIDAsIGNlbnRlciAqIHNpemVvZigqYnVmKSk7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBuc2FtcGxlczsgaysrKSB7CisgICAgICAgICAgICBidWZbY2VudGVyK2tdLnJlID0gZGF0YTBba107CisgICAgICAgICAgICBidWZbY2VudGVyK2tdLmltID0gZGF0YTFba107CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGJ1ZiArIGNlbnRlciArIG5zYW1wbGVzLCAwLCAocy0+cmRmdF9sZW4gLSBuc2FtcGxlcyAtIGNlbnRlcikgKiBzaXplb2YoKmJ1ZikpOworICAgICAgICBhdl9mZnRfcGVybXV0ZShzLT5mZnRfY3R4LCBidWYpOworICAgICAgICBhdl9mZnRfY2FsYyhzLT5mZnRfY3R4LCBidWYpOworCisgICAgICAgIC8qIHN3YXAgcmUgPC0+IGltLCBkbyBiYWNrd2FyZCBmZnQgdXNpbmcgZm9yd2FyZCBmZnRfY3R4ICovCisgICAgICAgIC8qIG5vcm1hbGl6ZSB3aXRoIDAuNWYgKi8KKyAgICAgICAgdG1wID0gYnVmWzBdLnJlOworICAgICAgICBidWZbMF0ucmUgPSAwLjVmICoga2VybmVsX2J1ZlswXSAqIGJ1ZlswXS5pbTsKKyAgICAgICAgYnVmWzBdLmltID0gMC41ZiAqIGtlcm5lbF9idWZbMF0gKiB0bXA7CisgICAgICAgIGZvciAoayA9IDE7IGsgPCBzLT5yZGZ0X2xlbi8yOyBrKyspIHsKKyAgICAgICAgICAgIGludCBtID0gcy0+cmRmdF9sZW4gLSBrOworICAgICAgICAgICAgdG1wID0gYnVmW2tdLnJlOworICAgICAgICAgICAgYnVmW2tdLnJlID0gMC41ZiAqIGtlcm5lbF9idWZba10gKiBidWZba10uaW07CisgICAgICAgICAgICBidWZba10uaW0gPSAwLjVmICoga2VybmVsX2J1ZltrXSAqIHRtcDsKKyAgICAgICAgICAgIHRtcCA9IGJ1ZlttXS5yZTsKKyAgICAgICAgICAgIGJ1ZlttXS5yZSA9IDAuNWYgKiBrZXJuZWxfYnVmW2tdICogYnVmW21dLmltOworICAgICAgICAgICAgYnVmW21dLmltID0gMC41ZiAqIGtlcm5lbF9idWZba10gKiB0bXA7CisgICAgICAgIH0KKyAgICAgICAgdG1wID0gYnVmW2tdLnJlOworICAgICAgICBidWZba10ucmUgPSAwLjVmICoga2VybmVsX2J1ZltrXSAqIGJ1ZltrXS5pbTsKKyAgICAgICAgYnVmW2tdLmltID0gMC41ZiAqIGtlcm5lbF9idWZba10gKiB0bXA7CisKKyAgICAgICAgYXZfZmZ0X3Blcm11dGUocy0+ZmZ0X2N0eCwgYnVmKTsKKyAgICAgICAgYXZfZmZ0X2NhbGMocy0+ZmZ0X2N0eCwgYnVmKTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+cmRmdF9sZW4gLSBpZHgtPm92ZXJsYXBfaWR4OyBrKyspIHsKKyAgICAgICAgICAgIGJ1ZltrXS5yZSArPSBvYnVmW2tdLnJlOworICAgICAgICAgICAgYnVmW2tdLmltICs9IG9idWZba10uaW07CisgICAgICAgIH0KKworICAgICAgICAvKiBzd2FwcGVkIHJlIDwtPiBpbSAqLworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbnNhbXBsZXM7IGsrKykgeworICAgICAgICAgICAgZGF0YTBba10gPSBidWZba10uaW07CisgICAgICAgICAgICBkYXRhMVtrXSA9IGJ1ZltrXS5yZTsKKyAgICAgICAgfQorICAgICAgICBpZHgtPmJ1Zl9pZHggPSAhaWR4LT5idWZfaWR4OworICAgICAgICBpZHgtPm92ZXJsYXBfaWR4ID0gbnNhbXBsZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKG5zYW1wbGVzID4gcy0+bnNhbXBsZXNfbWF4ICogMikgeworICAgICAgICAgICAgZmFzdF9jb252b2x1dGUyKHMsIGtlcm5lbF9idWYsIGNvbnZfYnVmLCBpZHgsIGRhdGEwLCBkYXRhMSwgcy0+bnNhbXBsZXNfbWF4KTsKKyAgICAgICAgICAgIGRhdGEwICs9IHMtPm5zYW1wbGVzX21heDsKKyAgICAgICAgICAgIGRhdGExICs9IHMtPm5zYW1wbGVzX21heDsKKyAgICAgICAgICAgIG5zYW1wbGVzIC09IHMtPm5zYW1wbGVzX21heDsKKyAgICAgICAgfQorICAgICAgICBmYXN0X2NvbnZvbHV0ZTIocywga2VybmVsX2J1ZiwgY29udl9idWYsIGlkeCwgZGF0YTAsIGRhdGExLCBuc2FtcGxlcy8yKTsKKyAgICAgICAgZmFzdF9jb252b2x1dGUyKHMsIGtlcm5lbF9idWYsIGNvbnZfYnVmLCBpZHgsIGRhdGEwICsgbnNhbXBsZXMvMiwgZGF0YTEgKyBuc2FtcGxlcy8yLCBuc2FtcGxlcyAtIG5zYW1wbGVzLzIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHVtcF9maXIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZJTEUgKmZwLCBpbnQgY2gpCit7CisgICAgRklSRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmF0ZSA9IGN0eC0+aW5wdXRzWzBdLT5zYW1wbGVfcmF0ZTsKKyAgICBpbnQgeGxvZyA9IHMtPmR1bXBzY2FsZSA9PSBTQ0FMRV9MT0dMSU4gfHwgcy0+ZHVtcHNjYWxlID09IFNDQUxFX0xPR0xPRzsKKyAgICBpbnQgeWxvZyA9IHMtPmR1bXBzY2FsZSA9PSBTQ0FMRV9MSU5MT0cgfHwgcy0+ZHVtcHNjYWxlID09IFNDQUxFX0xPR0xPRzsKKyAgICBpbnQgeDsKKyAgICBpbnQgY2VudGVyID0gcy0+ZmlyX2xlbiAvIDI7CisgICAgZG91YmxlIGRlbGF5ID0gcy0+emVyb19waGFzZSA/IDAuMCA6IChkb3VibGUpIGNlbnRlciAvIHJhdGU7CisgICAgZG91YmxlIHZ4LCB5YSwgeWI7CisKKyAgICBpZiAoIXMtPm1pbl9waGFzZSkgeworICAgICAgICBzLT5hbmFseXNpc19idWZbMF0gKj0gcy0+cmRmdF9sZW4vMjsKKyAgICAgICAgZm9yICh4ID0gMTsgeCA8PSBjZW50ZXI7IHgrKykgeworICAgICAgICAgICAgcy0+YW5hbHlzaXNfYnVmW3hdICo9IHMtPnJkZnRfbGVuLzI7CisgICAgICAgICAgICBzLT5hbmFseXNpc19idWZbcy0+YW5hbHlzaXNfcmRmdF9sZW4gLSB4XSAqPSBzLT5yZGZ0X2xlbi8yOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPmZpcl9sZW47IHgrKykKKyAgICAgICAgICAgIHMtPmFuYWx5c2lzX2J1Zlt4XSAqPSBzLT5yZGZ0X2xlbi8yOworICAgIH0KKworICAgIGlmIChjaCkKKyAgICAgICAgZnByaW50ZihmcCwgIlxuXG4iKTsKKworICAgIGZwcmludGYoZnAsICIjIHRpbWVbJWRdICh0aW1lIGFtcGxpdHVkZSlcbiIsIGNoKTsKKworICAgIGlmICghcy0+bWluX3BoYXNlKSB7CisgICAgZm9yICh4ID0gY2VudGVyOyB4ID4gMDsgeC0tKQorICAgICAgICBmcHJpbnRmKGZwLCAiJTE1LjEwZiAlMTUuMTBmXG4iLCBkZWxheSAtIChkb3VibGUpIHggLyByYXRlLCAoZG91YmxlKSBzLT5hbmFseXNpc19idWZbcy0+YW5hbHlzaXNfcmRmdF9sZW4gLSB4XSk7CisKKyAgICBmb3IgKHggPSAwOyB4IDw9IGNlbnRlcjsgeCsrKQorICAgICAgICBmcHJpbnRmKGZwLCAiJTE1LjEwZiAlMTUuMTBmXG4iLCBkZWxheSArIChkb3VibGUpeCAvIHJhdGUgLCAoZG91YmxlKSBzLT5hbmFseXNpc19idWZbeF0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5maXJfbGVuOyB4KyspCisgICAgICAgICAgICBmcHJpbnRmKGZwLCAiJTE1LjEwZiAlMTUuMTBmXG4iLCAoZG91YmxlKXggLyByYXRlLCAoZG91YmxlKSBzLT5hbmFseXNpc19idWZbeF0pOworICAgIH0KKworICAgIGF2X3JkZnRfY2FsYyhzLT5hbmFseXNpc19yZGZ0LCBzLT5hbmFseXNpc19idWYpOworCisgICAgZnByaW50ZihmcCwgIlxuXG4jIGZyZXFbJWRdIChmcmVxdWVuY3kgZGVzaXJlZF9nYWluIGFjdHVhbF9nYWluKVxuIiwgY2gpOworCisgICAgZm9yICh4ID0gMDsgeCA8PSBzLT5hbmFseXNpc19yZGZ0X2xlbi8yOyB4KyspIHsKKyAgICAgICAgaW50IGkgPSAoeCA9PSBzLT5hbmFseXNpc19yZGZ0X2xlbi8yKSA/IDEgOiAyICogeDsKKyAgICAgICAgdnggPSAoZG91YmxlKXggKiByYXRlIC8gcy0+YW5hbHlzaXNfcmRmdF9sZW47CisgICAgICAgIGlmICh4bG9nKQorICAgICAgICAgICAgdnggPSBsb2cyKDAuMDUqdngpOworICAgICAgICB5YSA9IHMtPmR1bXBfYnVmW2ldOworICAgICAgICB5YiA9IHMtPm1pbl9waGFzZSAmJiAoaSA+IDEpID8gaHlwb3RmKHMtPmFuYWx5c2lzX2J1ZltpXSwgcy0+YW5hbHlzaXNfYnVmW2krMV0pIDogcy0+YW5hbHlzaXNfYnVmW2ldOworICAgICAgICBpZiAocy0+bWluX3BoYXNlKQorICAgICAgICAgICAgeWIgPSBmYWJzKHliKTsKKyAgICAgICAgaWYgKHlsb2cpIHsKKyAgICAgICAgICAgIHlhID0gMjAuMCAqIGxvZzEwKGZhYnMoeWEpKTsKKyAgICAgICAgICAgIHliID0gMjAuMCAqIGxvZzEwKGZhYnMoeWIpKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGZwLCAiJTE3LjEwZiAlMTcuMTBmICUxNy4xMGZcbiIsIHZ4LCB5YSwgeWIpOworICAgIH0KK30KKworc3RhdGljIGRvdWJsZSBlbnRyeV9mdW5jKHZvaWQgKnAsIGRvdWJsZSBmcmVxLCBkb3VibGUgZ2FpbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IHA7CisgICAgRklSRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmIChzLT5uYl9nYWluX2VudHJ5ID49IE5CX0dBSU5fRU5UUllfTUFYKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImVudHJ5IHRhYmxlIG92ZXJmbG93LlxuIik7CisgICAgICAgIHMtPmdhaW5fZW50cnlfZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoaXNuYW4oZnJlcSkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAibmFuIGZyZXF1ZW5jeSAoJWcsICVnKS5cbiIsIGZyZXEsIGdhaW4pOworICAgICAgICBzLT5nYWluX2VudHJ5X2VyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHMtPm5iX2dhaW5fZW50cnkgPiAwICYmIGZyZXEgPD0gcy0+Z2Fpbl9lbnRyeV90Ymxbcy0+bmJfZ2Fpbl9lbnRyeSAtIDFdLmZyZXEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAidW5zb3J0ZWQgZnJlcXVlbmN5ICglZywgJWcpLlxuIiwgZnJlcSwgZ2Fpbik7CisgICAgICAgIHMtPmdhaW5fZW50cnlfZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzLT5nYWluX2VudHJ5X3RibFtzLT5uYl9nYWluX2VudHJ5XS5mcmVxID0gZnJlcTsKKyAgICBzLT5nYWluX2VudHJ5X3RibFtzLT5uYl9nYWluX2VudHJ5XS5nYWluID0gZ2FpbjsKKyAgICBzLT5uYl9nYWluX2VudHJ5Kys7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2Fpbl9lbnRyeV9jb21wYXJlKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqbWVtYikKK3sKKyAgICBjb25zdCBkb3VibGUgKmZyZXEgPSBrZXk7CisgICAgY29uc3QgR2FpbkVudHJ5ICplbnRyeSA9IG1lbWI7CisKKyAgICBpZiAoKmZyZXEgPCBlbnRyeVswXS5mcmVxKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYgKCpmcmVxID4gZW50cnlbMV0uZnJlcSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBkb3VibGUgZ2Fpbl9pbnRlcnBvbGF0ZV9mdW5jKHZvaWQgKnAsIGRvdWJsZSBmcmVxKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gcDsKKyAgICBGSVJFcXVhbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEdhaW5FbnRyeSAqcmVzOworICAgIGRvdWJsZSBkMCwgZDEsIGQ7CisKKyAgICBpZiAoaXNuYW4oZnJlcSkpCisgICAgICAgIHJldHVybiBmcmVxOworCisgICAgaWYgKCFzLT5uYl9nYWluX2VudHJ5KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChmcmVxIDw9IHMtPmdhaW5fZW50cnlfdGJsWzBdLmZyZXEpCisgICAgICAgIHJldHVybiBzLT5nYWluX2VudHJ5X3RibFswXS5nYWluOworCisgICAgaWYgKGZyZXEgPj0gcy0+Z2Fpbl9lbnRyeV90Ymxbcy0+bmJfZ2Fpbl9lbnRyeS0xXS5mcmVxKQorICAgICAgICByZXR1cm4gcy0+Z2Fpbl9lbnRyeV90Ymxbcy0+bmJfZ2Fpbl9lbnRyeS0xXS5nYWluOworCisgICAgcmVzID0gYnNlYXJjaCgmZnJlcSwgJnMtPmdhaW5fZW50cnlfdGJsLCBzLT5uYl9nYWluX2VudHJ5IC0gMSwgc2l6ZW9mKCpyZXMpLCBnYWluX2VudHJ5X2NvbXBhcmUpOworICAgIGF2X2Fzc2VydDAocmVzKTsKKworICAgIGQgID0gcmVzWzFdLmZyZXEgLSByZXNbMF0uZnJlcTsKKyAgICBkMCA9IGZyZXEgLSByZXNbMF0uZnJlcTsKKyAgICBkMSA9IHJlc1sxXS5mcmVxIC0gZnJlcTsKKworICAgIGlmIChkMCAmJiBkMSkKKyAgICAgICAgcmV0dXJuIChkMCAqIHJlc1sxXS5nYWluICsgZDEgKiByZXNbMF0uZ2FpbikgLyBkOworCisgICAgaWYgKGQwKQorICAgICAgICByZXR1cm4gcmVzWzFdLmdhaW47CisKKyAgICByZXR1cm4gcmVzWzBdLmdhaW47Cit9CisKK3N0YXRpYyBkb3VibGUgY3ViaWNfaW50ZXJwb2xhdGVfZnVuYyh2b2lkICpwLCBkb3VibGUgZnJlcSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IHA7CisgICAgRklSRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBHYWluRW50cnkgKnJlczsKKyAgICBkb3VibGUgeCwgeDIsIHgzOworICAgIGRvdWJsZSBhLCBiLCBjLCBkOworICAgIGRvdWJsZSBtMCwgbTEsIG0yLCBtc3VtLCB1bml0OworCisgICAgaWYgKCFzLT5uYl9nYWluX2VudHJ5KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChmcmVxIDw9IHMtPmdhaW5fZW50cnlfdGJsWzBdLmZyZXEpCisgICAgICAgIHJldHVybiBzLT5nYWluX2VudHJ5X3RibFswXS5nYWluOworCisgICAgaWYgKGZyZXEgPj0gcy0+Z2Fpbl9lbnRyeV90Ymxbcy0+bmJfZ2Fpbl9lbnRyeS0xXS5mcmVxKQorICAgICAgICByZXR1cm4gcy0+Z2Fpbl9lbnRyeV90Ymxbcy0+bmJfZ2Fpbl9lbnRyeS0xXS5nYWluOworCisgICAgcmVzID0gYnNlYXJjaCgmZnJlcSwgJnMtPmdhaW5fZW50cnlfdGJsLCBzLT5uYl9nYWluX2VudHJ5IC0gMSwgc2l6ZW9mKCpyZXMpLCBnYWluX2VudHJ5X2NvbXBhcmUpOworICAgIGF2X2Fzc2VydDAocmVzKTsKKworICAgIHVuaXQgPSByZXNbMV0uZnJlcSAtIHJlc1swXS5mcmVxOworICAgIG0wID0gcmVzICE9IHMtPmdhaW5fZW50cnlfdGJsID8KKyAgICAgICAgIHVuaXQgKiAocmVzWzBdLmdhaW4gLSByZXNbLTFdLmdhaW4pIC8gKHJlc1swXS5mcmVxIC0gcmVzWy0xXS5mcmVxKSA6IDA7CisgICAgbTEgPSByZXNbMV0uZ2FpbiAtIHJlc1swXS5nYWluOworICAgIG0yID0gcmVzICE9IHMtPmdhaW5fZW50cnlfdGJsICsgcy0+bmJfZ2Fpbl9lbnRyeSAtIDIgPworICAgICAgICAgdW5pdCAqIChyZXNbMl0uZ2FpbiAtIHJlc1sxXS5nYWluKSAvIChyZXNbMl0uZnJlcSAtIHJlc1sxXS5mcmVxKSA6IDA7CisKKyAgICBtc3VtID0gZmFicyhtMCkgKyBmYWJzKG0xKTsKKyAgICBtMCA9IG1zdW0gPiAwID8gKGZhYnMobTApICogbTEgKyBmYWJzKG0xKSAqIG0wKSAvIG1zdW0gOiAwOworICAgIG1zdW0gPSBmYWJzKG0xKSArIGZhYnMobTIpOworICAgIG0xID0gbXN1bSA+IDAgPyAoZmFicyhtMSkgKiBtMiArIGZhYnMobTIpICogbTEpIC8gbXN1bSA6IDA7CisKKyAgICBkID0gcmVzWzBdLmdhaW47CisgICAgYyA9IG0wOworICAgIGIgPSAzICogcmVzWzFdLmdhaW4gLSBtMSAtIDIgKiBjIC0gMyAqIGQ7CisgICAgYSA9IHJlc1sxXS5nYWluIC0gYiAtIGMgLSBkOworCisgICAgeCA9IChmcmVxIC0gcmVzWzBdLmZyZXEpIC8gdW5pdDsKKyAgICB4MiA9IHggKiB4OworICAgIHgzID0geDIgKiB4OworCisgICAgcmV0dXJuIGEgKiB4MyArIGIgKiB4MiArIGMgKiB4ICsgZDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJmIiwKKyAgICAic3IiLAorICAgICJjaCIsCisgICAgImNoaWQiLAorICAgICJjaHMiLAorICAgICJjaGxheW91dCIsCisgICAgTlVMTAorfTsKKworZW51bSBWYXJPZmZzZXQgeworICAgIFZBUl9GLAorICAgIFZBUl9TUiwKKyAgICBWQVJfQ0gsCisgICAgVkFSX0NISUQsCisgICAgVkFSX0NIUywKKyAgICBWQVJfQ0hMQVlPVVQsCisgICAgVkFSX05CCit9OworCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9taW5fcGhhc2Vfa2VybmVsKEZJUkVxdWFsaXplckNvbnRleHQgKnMsIGZsb2F0ICpyZGZ0X2J1ZikKK3sKKyAgICBpbnQgaywgY2Vwc3RydW1fbGVuID0gcy0+Y2Vwc3RydW1fbGVuLCByZGZ0X2xlbiA9IHMtPnJkZnRfbGVuOworICAgIGRvdWJsZSBub3JtID0gMi4wIC8gY2Vwc3RydW1fbGVuOworICAgIGRvdWJsZSBtaW52YWwgPSAxZS03IC8gcmRmdF9sZW47CisKKyAgICBtZW1zZXQocy0+Y2Vwc3RydW1fYnVmLCAwLCBjZXBzdHJ1bV9sZW4gKiBzaXplb2YoKnMtPmNlcHN0cnVtX2J1ZikpOworICAgIG1lbWNweShzLT5jZXBzdHJ1bV9idWYsIHJkZnRfYnVmLCByZGZ0X2xlbi8yICogc2l6ZW9mKCpyZGZ0X2J1ZikpOworICAgIG1lbWNweShzLT5jZXBzdHJ1bV9idWYgKyBjZXBzdHJ1bV9sZW4gLSByZGZ0X2xlbi8yLCByZGZ0X2J1ZiArIHJkZnRfbGVuLzIsIHJkZnRfbGVuLzIgICogc2l6ZW9mKCpyZGZ0X2J1ZikpOworCisgICAgYXZfcmRmdF9jYWxjKHMtPmNlcHN0cnVtX3JkZnQsIHMtPmNlcHN0cnVtX2J1Zik7CisKKyAgICBzLT5jZXBzdHJ1bV9idWZbMF0gPSBsb2coRkZNQVgocy0+Y2Vwc3RydW1fYnVmWzBdLCBtaW52YWwpKTsKKyAgICBzLT5jZXBzdHJ1bV9idWZbMV0gPSBsb2coRkZNQVgocy0+Y2Vwc3RydW1fYnVmWzFdLCBtaW52YWwpKTsKKworICAgIGZvciAoayA9IDI7IGsgPCBjZXBzdHJ1bV9sZW47IGsgKz0gMikgeworICAgICAgICBzLT5jZXBzdHJ1bV9idWZba10gPSBsb2coRkZNQVgocy0+Y2Vwc3RydW1fYnVmW2tdLCBtaW52YWwpKTsKKyAgICAgICAgcy0+Y2Vwc3RydW1fYnVmW2srMV0gPSAwOworICAgIH0KKworICAgIGF2X3JkZnRfY2FsYyhzLT5jZXBzdHJ1bV9pcmRmdCwgcy0+Y2Vwc3RydW1fYnVmKTsKKworICAgIG1lbXNldChzLT5jZXBzdHJ1bV9idWYgKyBjZXBzdHJ1bV9sZW4vMiArIDEsIDAsIChjZXBzdHJ1bV9sZW4vMiAtIDEpICogc2l6ZW9mKCpzLT5jZXBzdHJ1bV9idWYpKTsKKyAgICBmb3IgKGsgPSAxOyBrIDwgY2Vwc3RydW1fbGVuLzI7IGsrKykKKyAgICAgICAgcy0+Y2Vwc3RydW1fYnVmW2tdICo9IDI7CisKKyAgICBhdl9yZGZ0X2NhbGMocy0+Y2Vwc3RydW1fcmRmdCwgcy0+Y2Vwc3RydW1fYnVmKTsKKworICAgIHMtPmNlcHN0cnVtX2J1ZlswXSA9IGV4cChzLT5jZXBzdHJ1bV9idWZbMF0gKiBub3JtKSAqIG5vcm07CisgICAgcy0+Y2Vwc3RydW1fYnVmWzFdID0gZXhwKHMtPmNlcHN0cnVtX2J1ZlsxXSAqIG5vcm0pICogbm9ybTsKKyAgICBmb3IgKGsgPSAyOyBrIDwgY2Vwc3RydW1fbGVuOyBrICs9IDIpIHsKKyAgICAgICAgZG91YmxlIG1hZyA9IGV4cChzLT5jZXBzdHJ1bV9idWZba10gKiBub3JtKSAqIG5vcm07CisgICAgICAgIGRvdWJsZSBwaCA9IHMtPmNlcHN0cnVtX2J1ZltrKzFdICogbm9ybTsKKyAgICAgICAgcy0+Y2Vwc3RydW1fYnVmW2tdID0gbWFnICogY29zKHBoKTsKKyAgICAgICAgcy0+Y2Vwc3RydW1fYnVmW2srMV0gPSBtYWcgKiBzaW4ocGgpOworICAgIH0KKworICAgIGF2X3JkZnRfY2FsYyhzLT5jZXBzdHJ1bV9pcmRmdCwgcy0+Y2Vwc3RydW1fYnVmKTsKKyAgICBtZW1zZXQocmRmdF9idWYsIDAsIHMtPnJkZnRfbGVuICogc2l6ZW9mKCpyZGZ0X2J1ZikpOworICAgIG1lbWNweShyZGZ0X2J1Ziwgcy0+Y2Vwc3RydW1fYnVmLCBzLT5maXJfbGVuICogc2l6ZW9mKCpyZGZ0X2J1ZikpOworCisgICAgaWYgKHMtPmR1bXBmaWxlKSB7CisgICAgICAgIG1lbXNldChzLT5hbmFseXNpc19idWYsIDAsIHMtPmFuYWx5c2lzX3JkZnRfbGVuICogc2l6ZW9mKCpzLT5hbmFseXNpc19idWYpKTsKKyAgICAgICAgbWVtY3B5KHMtPmFuYWx5c2lzX2J1Ziwgcy0+Y2Vwc3RydW1fYnVmLCBzLT5maXJfbGVuICogc2l6ZW9mKCpzLT5hbmFseXNpc19idWYpKTsKKyAgICB9CisKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9rZXJuZWwoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmdhaW4sIGNvbnN0IGNoYXIgKmdhaW5fZW50cnkpCit7CisgICAgRklSRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGNvbnN0IGNoYXIgKmdhaW5fZW50cnlfZnVuY19uYW1lc1tdID0geyAiZW50cnkiLCBOVUxMIH07CisgICAgY29uc3QgY2hhciAqZ2Fpbl9mdW5jX25hbWVzW10gPSB7ICJnYWluX2ludGVycG9sYXRlIiwgImN1YmljX2ludGVycG9sYXRlIiwgTlVMTCB9OworICAgIGRvdWJsZSAoKmdhaW5fZW50cnlfZnVuY3NbXSkodm9pZCAqLCBkb3VibGUsIGRvdWJsZSkgPSB7IGVudHJ5X2Z1bmMsIE5VTEwgfTsKKyAgICBkb3VibGUgKCpnYWluX2Z1bmNzW10pKHZvaWQgKiwgZG91YmxlKSA9IHsgZ2Fpbl9pbnRlcnBvbGF0ZV9mdW5jLCBjdWJpY19pbnRlcnBvbGF0ZV9mdW5jLCBOVUxMIH07CisgICAgZG91YmxlIHZhcnNbVkFSX05CXTsKKyAgICBBVkV4cHIgKmdhaW5fZXhwcjsKKyAgICBpbnQgcmV0LCBrLCBjZW50ZXIsIGNoOworICAgIGludCB4bG9nID0gcy0+c2NhbGUgPT0gU0NBTEVfTE9HTElOIHx8IHMtPnNjYWxlID09IFNDQUxFX0xPR0xPRzsKKyAgICBpbnQgeWxvZyA9IHMtPnNjYWxlID09IFNDQUxFX0xJTkxPRyB8fCBzLT5zY2FsZSA9PSBTQ0FMRV9MT0dMT0c7CisgICAgRklMRSAqZHVtcF9mcCA9IE5VTEw7CisKKyAgICBzLT5uYl9nYWluX2VudHJ5ID0gMDsKKyAgICBzLT5nYWluX2VudHJ5X2VyciA9IDA7CisgICAgaWYgKGdhaW5fZW50cnkpIHsKKyAgICAgICAgZG91YmxlIHJlc3VsdCA9IDAuMDsKKyAgICAgICAgcmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzdWx0LCBnYWluX2VudHJ5LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fZW50cnlfZnVuY19uYW1lcywgZ2Fpbl9lbnRyeV9mdW5jcywgY3R4LCAwLCBjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmIChzLT5nYWluX2VudHJ5X2VyciA8IDApCisgICAgICAgICAgICByZXR1cm4gcy0+Z2Fpbl9lbnRyeV9lcnI7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAibmJfZ2Fpbl9lbnRyeSA9ICVkLlxuIiwgcy0+bmJfZ2Fpbl9lbnRyeSk7CisKKyAgICByZXQgPSBhdl9leHByX3BhcnNlKCZnYWluX2V4cHIsIGdhaW4sIHZhcl9uYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhaW5fZnVuY19uYW1lcywgZ2Fpbl9mdW5jcywgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChzLT5kdW1wZmlsZSAmJiAoIXMtPmR1bXBfYnVmIHx8ICFzLT5hbmFseXNpc19yZGZ0IHx8ICEoZHVtcF9mcCA9IGZvcGVuKHMtPmR1bXBmaWxlLCAidyIpKSkpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiZHVtcGluZyBmYWlsZWQuXG4iKTsKKworICAgIHZhcnNbVkFSX0NIU10gPSBpbmxpbmstPmNoYW5uZWxzOworICAgIHZhcnNbVkFSX0NITEFZT1VUXSA9IGlubGluay0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgdmFyc1tWQVJfU1JdID0gaW5saW5rLT5zYW1wbGVfcmF0ZTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBpbmxpbmstPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZsb2F0ICpyZGZ0X2J1ZiA9IHMtPmtlcm5lbF90bXBfYnVmICsgY2ggKiBzLT5yZGZ0X2xlbjsKKyAgICAgICAgZG91YmxlIHJlc3VsdDsKKyAgICAgICAgdmFyc1tWQVJfQ0hdID0gY2g7CisgICAgICAgIHZhcnNbVkFSX0NISURdID0gYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKGlubGluay0+Y2hhbm5lbF9sYXlvdXQsIGNoKTsKKyAgICAgICAgdmFyc1tWQVJfRl0gPSAwLjA7CisgICAgICAgIGlmICh4bG9nKQorICAgICAgICAgICAgdmFyc1tWQVJfRl0gPSBsb2cyKDAuMDUgKiB2YXJzW1ZBUl9GXSk7CisgICAgICAgIHJlc3VsdCA9IGF2X2V4cHJfZXZhbChnYWluX2V4cHIsIHZhcnMsIGN0eCk7CisgICAgICAgIHMtPmFuYWx5c2lzX2J1ZlswXSA9IHlsb2cgPyBwb3coMTAuMCwgMC4wNSAqIHJlc3VsdCkgOiByZXN1bHQ7CisKKyAgICAgICAgdmFyc1tWQVJfRl0gPSAwLjUgKiBpbmxpbmstPnNhbXBsZV9yYXRlOworICAgICAgICBpZiAoeGxvZykKKyAgICAgICAgICAgIHZhcnNbVkFSX0ZdID0gbG9nMigwLjA1ICogdmFyc1tWQVJfRl0pOworICAgICAgICByZXN1bHQgPSBhdl9leHByX2V2YWwoZ2Fpbl9leHByLCB2YXJzLCBjdHgpOworICAgICAgICBzLT5hbmFseXNpc19idWZbMV0gPSB5bG9nID8gcG93KDEwLjAsIDAuMDUgKiByZXN1bHQpIDogcmVzdWx0OworCisgICAgICAgIGZvciAoayA9IDE7IGsgPCBzLT5hbmFseXNpc19yZGZ0X2xlbi8yOyBrKyspIHsKKyAgICAgICAgICAgIHZhcnNbVkFSX0ZdID0gayAqICgoZG91YmxlKWlubGluay0+c2FtcGxlX3JhdGUgLyhkb3VibGUpcy0+YW5hbHlzaXNfcmRmdF9sZW4pOworICAgICAgICAgICAgaWYgKHhsb2cpCisgICAgICAgICAgICAgICAgdmFyc1tWQVJfRl0gPSBsb2cyKDAuMDUgKiB2YXJzW1ZBUl9GXSk7CisgICAgICAgICAgICByZXN1bHQgPSBhdl9leHByX2V2YWwoZ2Fpbl9leHByLCB2YXJzLCBjdHgpOworICAgICAgICAgICAgcy0+YW5hbHlzaXNfYnVmWzIqa10gPSB5bG9nID8gcG93KDEwLjAsIDAuMDUgKiByZXN1bHQpIDogcy0+bWluX3BoYXNlID8gZmFicyhyZXN1bHQpIDogcmVzdWx0OworICAgICAgICAgICAgcy0+YW5hbHlzaXNfYnVmWzIqaysxXSA9IDAuMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5kdW1wX2J1ZikKKyAgICAgICAgICAgIG1lbWNweShzLT5kdW1wX2J1Ziwgcy0+YW5hbHlzaXNfYnVmLCBzLT5hbmFseXNpc19yZGZ0X2xlbiAqIHNpemVvZigqcy0+YW5hbHlzaXNfYnVmKSk7CisKKyAgICAgICAgYXZfcmRmdF9jYWxjKHMtPmFuYWx5c2lzX2lyZGZ0LCBzLT5hbmFseXNpc19idWYpOworICAgICAgICBjZW50ZXIgPSBzLT5maXJfbGVuIC8gMjsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDw9IGNlbnRlcjsgaysrKSB7CisgICAgICAgICAgICBkb3VibGUgdSA9IGsgKiAoTV9QSS9jZW50ZXIpOworICAgICAgICAgICAgZG91YmxlIHdpbjsKKyAgICAgICAgICAgIHN3aXRjaCAocy0+d2Z1bmMpIHsKKyAgICAgICAgICAgIGNhc2UgV0ZVTkNfUkVDVEFOR1VMQVI6CisgICAgICAgICAgICAgICAgd2luID0gMS4wOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXRlVOQ19IQU5OOgorICAgICAgICAgICAgICAgIHdpbiA9IDAuNSArIDAuNSAqIGNvcyh1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0ZVTkNfSEFNTUlORzoKKyAgICAgICAgICAgICAgICB3aW4gPSAwLjUzODM2ICsgMC40NjE2NCAqIGNvcyh1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0ZVTkNfQkxBQ0tNQU46CisgICAgICAgICAgICAgICAgd2luID0gMC40MiArIDAuNSAqIGNvcyh1KSArIDAuMDggKiBjb3MoMip1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0ZVTkNfTlVUVEFMTDM6CisgICAgICAgICAgICAgICAgd2luID0gMC40MDg5NyArIDAuNSAqIGNvcyh1KSArIDAuMDkxMDMgKiBjb3MoMip1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0ZVTkNfTU5VVFRBTEwzOgorICAgICAgICAgICAgICAgIHdpbiA9IDAuNDI0MzgwMSArIDAuNDk3MzQwNiAqIGNvcyh1KSArIDAuMDc4Mjc5MyAqIGNvcygyKnUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBXRlVOQ19OVVRUQUxMOgorICAgICAgICAgICAgICAgIHdpbiA9IDAuMzU1NzY4ICsgMC40ODczOTYgKiBjb3ModSkgKyAwLjE0NDIzMiAqIGNvcygyKnUpICsgMC4wMTI2MDQgKiBjb3MoMyp1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0ZVTkNfQk5VVFRBTEw6CisgICAgICAgICAgICAgICAgd2luID0gMC4zNjM1ODE5ICsgMC40ODkxNzc1ICogY29zKHUpICsgMC4xMzY1OTk1ICogY29zKDIqdSkgKyAwLjAxMDY0MTEgKiBjb3MoMyp1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0ZVTkNfQkhBUlJJUzoKKyAgICAgICAgICAgICAgICB3aW4gPSAwLjM1ODc1ICsgMC40ODgyOSAqIGNvcyh1KSArIDAuMTQxMjggKiBjb3MoMip1KSArIDAuMDExNjggKiBjb3MoMyp1KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgV0ZVTkNfVFVLRVk6CisgICAgICAgICAgICAgICAgd2luID0gKHUgPD0gMC41ICogTV9QSSkgPyAxLjAgOiAoMC41ICsgMC41ICogY29zKDIqdSAtIE1fUEkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPmFuYWx5c2lzX2J1ZltrXSAqPSAoMi4wL3MtPmFuYWx5c2lzX3JkZnRfbGVuKSAqICgyLjAvcy0+cmRmdF9sZW4pICogd2luOworICAgICAgICAgICAgaWYgKGspCisgICAgICAgICAgICAgICAgcy0+YW5hbHlzaXNfYnVmW3MtPmFuYWx5c2lzX3JkZnRfbGVuIC0ga10gPSBzLT5hbmFseXNpc19idWZba107CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQocy0+YW5hbHlzaXNfYnVmICsgY2VudGVyICsgMSwgMCwgKHMtPmFuYWx5c2lzX3JkZnRfbGVuIC0gcy0+ZmlyX2xlbikgKiBzaXplb2YoKnMtPmFuYWx5c2lzX2J1ZikpOworICAgICAgICBtZW1jcHkocmRmdF9idWYsIHMtPmFuYWx5c2lzX2J1Ziwgcy0+cmRmdF9sZW4vMiAqIHNpemVvZigqcy0+YW5hbHlzaXNfYnVmKSk7CisgICAgICAgIG1lbWNweShyZGZ0X2J1ZiArIHMtPnJkZnRfbGVuLzIsIHMtPmFuYWx5c2lzX2J1ZiArIHMtPmFuYWx5c2lzX3JkZnRfbGVuIC0gcy0+cmRmdF9sZW4vMiwgcy0+cmRmdF9sZW4vMiAqIHNpemVvZigqcy0+YW5hbHlzaXNfYnVmKSk7CisgICAgICAgIGlmIChzLT5taW5fcGhhc2UpCisgICAgICAgICAgICBnZW5lcmF0ZV9taW5fcGhhc2Vfa2VybmVsKHMsIHJkZnRfYnVmKTsKKyAgICAgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnQsIHJkZnRfYnVmKTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+cmRmdF9sZW47IGsrKykgeworICAgICAgICAgICAgaWYgKGlzbmFuKHJkZnRfYnVmW2tdKSB8fCBpc2luZihyZGZ0X2J1ZltrXSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJmaWx0ZXIga2VybmVsIGNvbnRhaW5zIG5hbiBvciBpbmZpbml0eS5cbiIpOworICAgICAgICAgICAgICAgIGF2X2V4cHJfZnJlZShnYWluX2V4cHIpOworICAgICAgICAgICAgICAgIGlmIChkdW1wX2ZwKQorICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZHVtcF9mcCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghcy0+bWluX3BoYXNlKSB7CisgICAgICAgICAgICByZGZ0X2J1ZltzLT5yZGZ0X2xlbi0xXSA9IHJkZnRfYnVmWzFdOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHMtPnJkZnRfbGVuLzI7IGsrKykKKyAgICAgICAgICAgICAgICByZGZ0X2J1ZltrXSA9IHJkZnRfYnVmWzIqa107CisgICAgICAgICAgICByZGZ0X2J1ZltzLT5yZGZ0X2xlbi8yXSA9IHJkZnRfYnVmW3MtPnJkZnRfbGVuLTFdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGR1bXBfZnApCisgICAgICAgICAgICBkdW1wX2ZpcihjdHgsIGR1bXBfZnAsIGNoKTsKKworICAgICAgICBpZiAoIXMtPm11bHRpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgbWVtY3B5KHMtPmtlcm5lbF9idWYsIHMtPmtlcm5lbF90bXBfYnVmLCAocy0+bXVsdGkgPyBpbmxpbmstPmNoYW5uZWxzIDogMSkgKiBzLT5yZGZ0X2xlbiAqIHNpemVvZigqcy0+a2VybmVsX2J1ZikpOworICAgIGF2X2V4cHJfZnJlZShnYWluX2V4cHIpOworICAgIGlmIChkdW1wX2ZwKQorICAgICAgICBmY2xvc2UoZHVtcF9mcCk7CisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgU0VMRUNUX0dBSU4ocykgKHMtPmdhaW5fY21kID8gcy0+Z2Fpbl9jbWQgOiBzLT5nYWluKQorI2RlZmluZSBTRUxFQ1RfR0FJTl9FTlRSWShzKSAocy0+Z2Fpbl9lbnRyeV9jbWQgPyBzLT5nYWluX2VudHJ5X2NtZCA6IHMtPmdhaW5fZW50cnkpCisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgRklSRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmRmdF9iaXRzOworCisgICAgY29tbW9uX3VuaW5pdChzKTsKKworICAgIHMtPm5leHRfcHRzID0gMDsKKyAgICBzLT5mcmFtZV9uc2FtcGxlc19tYXggPSAwOworCisgICAgcy0+ZmlyX2xlbiA9IEZGTUFYKDIgKiAoaW50KShpbmxpbmstPnNhbXBsZV9yYXRlICogcy0+ZGVsYXkpICsgMSwgMyk7CisgICAgcy0+cmVtYWluaW5nID0gcy0+ZmlyX2xlbiAtIDE7CisKKyAgICBmb3IgKHJkZnRfYml0cyA9IFJERlRfQklUU19NSU47IHJkZnRfYml0cyA8PSBSREZUX0JJVFNfTUFYOyByZGZ0X2JpdHMrKykgeworICAgICAgICBzLT5yZGZ0X2xlbiA9IDEgPDwgcmRmdF9iaXRzOworICAgICAgICBzLT5uc2FtcGxlc19tYXggPSBzLT5yZGZ0X2xlbiAtIHMtPmZpcl9sZW4gKyAxOworICAgICAgICBpZiAocy0+bnNhbXBsZXNfbWF4ICogMiA+PSBzLT5maXJfbGVuKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHJkZnRfYml0cyA+IFJERlRfQklUU19NQVgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIGxhcmdlIGRlbGF5LCBwbGVhc2UgZGVjcmVhc2UgaXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoIShzLT5yZGZ0ID0gYXZfcmRmdF9pbml0KHJkZnRfYml0cywgREZUX1IyQykpIHx8ICEocy0+aXJkZnQgPSBhdl9yZGZ0X2luaXQocmRmdF9iaXRzLCBJREZUX0MyUikpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKHMtPmZmdDIgJiYgIXMtPm11bHRpICYmIGlubGluay0+Y2hhbm5lbHMgPiAxICYmICEocy0+ZmZ0X2N0eCA9IGF2X2ZmdF9pbml0KHJkZnRfYml0cywgMCkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKHMtPm1pbl9waGFzZSkgeworICAgICAgICBpbnQgY2Vwc3RydW1fYml0cyA9IHJkZnRfYml0cyArIDI7CisgICAgICAgIGlmIChjZXBzdHJ1bV9iaXRzID4gUkRGVF9CSVRTX01BWCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAidG9vIGxhcmdlIGRlbGF5LCBwbGVhc2UgZGVjcmVhc2UgaXQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBjZXBzdHJ1bV9iaXRzID0gRkZNSU4oUkRGVF9CSVRTX01BWCwgY2Vwc3RydW1fYml0cyArIDEpOworICAgICAgICBzLT5jZXBzdHJ1bV9yZGZ0ID0gYXZfcmRmdF9pbml0KGNlcHN0cnVtX2JpdHMsIERGVF9SMkMpOworICAgICAgICBzLT5jZXBzdHJ1bV9pcmRmdCA9IGF2X3JkZnRfaW5pdChjZXBzdHJ1bV9iaXRzLCBJREZUX0MyUik7CisgICAgICAgIGlmICghcy0+Y2Vwc3RydW1fcmRmdCB8fCAhcy0+Y2Vwc3RydW1faXJkZnQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHMtPmNlcHN0cnVtX2xlbiA9IDEgPDwgY2Vwc3RydW1fYml0czsKKyAgICAgICAgcy0+Y2Vwc3RydW1fYnVmID0gYXZfbWFsbG9jX2FycmF5KHMtPmNlcHN0cnVtX2xlbiwgc2l6ZW9mKCpzLT5jZXBzdHJ1bV9idWYpKTsKKyAgICAgICAgaWYgKCFzLT5jZXBzdHJ1bV9idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZvciAoIDsgcmRmdF9iaXRzIDw9IFJERlRfQklUU19NQVg7IHJkZnRfYml0cysrKSB7CisgICAgICAgIHMtPmFuYWx5c2lzX3JkZnRfbGVuID0gMSA8PCByZGZ0X2JpdHM7CisgICAgICAgIGlmIChpbmxpbmstPnNhbXBsZV9yYXRlIDw9IHMtPmFjY3VyYWN5ICogcy0+YW5hbHlzaXNfcmRmdF9sZW4pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocmRmdF9iaXRzID4gUkRGVF9CSVRTX01BWCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJ0b28gc21hbGwgYWNjdXJhY3ksIHBsZWFzZSBpbmNyZWFzZSBpdC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghKHMtPmFuYWx5c2lzX2lyZGZ0ID0gYXZfcmRmdF9pbml0KHJkZnRfYml0cywgSURGVF9DMlIpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChzLT5kdW1wZmlsZSkgeworICAgICAgICBzLT5hbmFseXNpc19yZGZ0ID0gYXZfcmRmdF9pbml0KHJkZnRfYml0cywgREZUX1IyQyk7CisgICAgICAgIHMtPmR1bXBfYnVmID0gYXZfbWFsbG9jX2FycmF5KHMtPmFuYWx5c2lzX3JkZnRfbGVuLCBzaXplb2YoKnMtPmR1bXBfYnVmKSk7CisgICAgfQorCisgICAgcy0+YW5hbHlzaXNfYnVmID0gYXZfbWFsbG9jX2FycmF5KHMtPmFuYWx5c2lzX3JkZnRfbGVuLCBzaXplb2YoKnMtPmFuYWx5c2lzX2J1ZikpOworICAgIHMtPmtlcm5lbF90bXBfYnVmID0gYXZfbWFsbG9jX2FycmF5KHMtPnJkZnRfbGVuICogKHMtPm11bHRpID8gaW5saW5rLT5jaGFubmVscyA6IDEpLCBzaXplb2YoKnMtPmtlcm5lbF90bXBfYnVmKSk7CisgICAgcy0+a2VybmVsX2J1ZiA9IGF2X21hbGxvY19hcnJheShzLT5yZGZ0X2xlbiAqIChzLT5tdWx0aSA/IGlubGluay0+Y2hhbm5lbHMgOiAxKSwgc2l6ZW9mKCpzLT5rZXJuZWxfYnVmKSk7CisgICAgcy0+Y29udl9idWYgICA9IGF2X2NhbGxvYygyICogcy0+cmRmdF9sZW4gKiBpbmxpbmstPmNoYW5uZWxzLCBzaXplb2YoKnMtPmNvbnZfYnVmKSk7CisgICAgcy0+Y29udl9pZHggICA9IGF2X2NhbGxvYyhpbmxpbmstPmNoYW5uZWxzLCBzaXplb2YoKnMtPmNvbnZfaWR4KSk7CisgICAgaWYgKCFzLT5hbmFseXNpc19idWYgfHwgIXMtPmtlcm5lbF90bXBfYnVmIHx8ICFzLT5rZXJuZWxfYnVmIHx8ICFzLT5jb252X2J1ZiB8fCAhcy0+Y29udl9pZHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJzYW1wbGVfcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBhbmFseXNpc19yZGZ0X2xlbiA9ICVkLCByZGZ0X2xlbiA9ICVkLCBmaXJfbGVuID0gJWQsIG5zYW1wbGVzX21heCA9ICVkLlxuIiwKKyAgICAgICAgICAgaW5saW5rLT5zYW1wbGVfcmF0ZSwgaW5saW5rLT5jaGFubmVscywgcy0+YW5hbHlzaXNfcmRmdF9sZW4sIHMtPnJkZnRfbGVuLCBzLT5maXJfbGVuLCBzLT5uc2FtcGxlc19tYXgpOworCisgICAgaWYgKHMtPmZpeGVkKQorICAgICAgICBpbmxpbmstPm1pbl9zYW1wbGVzID0gaW5saW5rLT5tYXhfc2FtcGxlcyA9IGlubGluay0+cGFydGlhbF9idWZfc2l6ZSA9IHMtPm5zYW1wbGVzX21heDsKKworICAgIHJldHVybiBnZW5lcmF0ZV9rZXJuZWwoY3R4LCBTRUxFQ1RfR0FJTihzKSwgU0VMRUNUX0dBSU5fRU5UUlkocykpOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBGSVJFcXVhbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBjaDsKKworICAgIGlmICghcy0+bWluX3BoYXNlKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCArIDEgPCBpbmxpbmstPmNoYW5uZWxzICYmIHMtPmZmdF9jdHg7IGNoICs9IDIpIHsKKyAgICAgICAgICAgIGZhc3RfY29udm9sdXRlMihzLCBzLT5rZXJuZWxfYnVmLCAoRkZUQ29tcGxleCAqKShzLT5jb252X2J1ZiArIDIgKiBjaCAqIHMtPnJkZnRfbGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb252X2lkeCArIGNoLCAoZmxvYXQgKikgZnJhbWUtPmV4dGVuZGVkX2RhdGFbY2hdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBmcmFtZS0+ZXh0ZW5kZWRfZGF0YVtjaCsxXSwgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICggOyBjaCA8IGlubGluay0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZhc3RfY29udm9sdXRlKHMsIHMtPmtlcm5lbF9idWYgKyAocy0+bXVsdGkgPyBjaCAqIHMtPnJkZnRfbGVuIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5jb252X2J1ZiArIDIgKiBjaCAqIHMtPnJkZnRfbGVuLCBzLT5jb252X2lkeCArIGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGZyYW1lLT5leHRlbmRlZF9kYXRhW2NoXSwgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgaW5saW5rLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZmFzdF9jb252b2x1dGVfbm9ubGluZWFyKHMsIHMtPmtlcm5lbF9idWYgKyAocy0+bXVsdGkgPyBjaCAqIHMtPnJkZnRfbGVuIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y29udl9idWYgKyAyICogY2ggKiBzLT5yZGZ0X2xlbiwgcy0+Y29udl9pZHggKyBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZnJhbWUtPmV4dGVuZGVkX2RhdGFbY2hdLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5uZXh0X3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHMtPm5leHRfcHRzID0gZnJhbWUtPnB0cyArIGF2X3Jlc2NhbGVfcShmcmFtZS0+bmJfc2FtcGxlcywgYXZfbWFrZV9xKDEsIGlubGluay0+c2FtcGxlX3JhdGUpLCBpbmxpbmstPnRpbWVfYmFzZSk7CisgICAgICAgIGlmIChzLT56ZXJvX3BoYXNlICYmICFzLT5taW5fcGhhc2UpCisgICAgICAgICAgICBmcmFtZS0+cHRzIC09IGF2X3Jlc2NhbGVfcShzLT5maXJfbGVuLzIsIGF2X21ha2VfcSgxLCBpbmxpbmstPnNhbXBsZV9yYXRlKSwgaW5saW5rLT50aW1lX2Jhc2UpOworICAgIH0KKyAgICBzLT5mcmFtZV9uc2FtcGxlc19tYXggPSBGRk1BWChzLT5mcmFtZV9uc2FtcGxlc19tYXgsIGZyYW1lLT5uYl9zYW1wbGVzKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgZnJhbWUpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEZJUkVxdWFsaXplckNvbnRleHQgKnM9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBzLT5yZW1haW5pbmcgPiAwICYmIHMtPmZyYW1lX25zYW1wbGVzX21heCA+IDApIHsKKyAgICAgICAgQVZGcmFtZSAqZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIEZGTUlOKHMtPnJlbWFpbmluZywgcy0+ZnJhbWVfbnNhbXBsZXNfbWF4KSk7CisKKyAgICAgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgYXZfc2FtcGxlc19zZXRfc2lsZW5jZShmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgMCwgZnJhbWUtPm5iX3NhbXBsZXMsIG91dGxpbmstPmNoYW5uZWxzLCBmcmFtZS0+Zm9ybWF0KTsKKyAgICAgICAgZnJhbWUtPnB0cyA9IHMtPm5leHRfcHRzOworICAgICAgICBzLT5yZW1haW5pbmcgLT0gZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgICAgIHJldCA9IGZpbHRlcl9mcmFtZShjdHgtPmlucHV0c1swXSwgZnJhbWUpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpjbWQsIGNvbnN0IGNoYXIgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXMsIGludCByZXNfbGVuLCBpbnQgZmxhZ3MpCit7CisgICAgRklSRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworCisgICAgaWYgKCFzdHJjbXAoY21kLCAiZ2FpbiIpKSB7CisgICAgICAgIGNoYXIgKmdhaW5fY21kOworCisgICAgICAgIGlmIChTRUxFQ1RfR0FJTihzKSAmJiAhc3RyY21wKFNFTEVDVF9HQUlOKHMpLCBhcmdzKSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiZXF1YWwgZ2FpbiwgZG8gbm90IHJlYnVpbGQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgZ2Fpbl9jbWQgPSBhdl9zdHJkdXAoYXJncyk7CisgICAgICAgIGlmICghZ2Fpbl9jbWQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHJldCA9IGdlbmVyYXRlX2tlcm5lbChjdHgsIGdhaW5fY21kLCBTRUxFQ1RfR0FJTl9FTlRSWShzKSk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmdhaW5fY21kKTsKKyAgICAgICAgICAgIHMtPmdhaW5fY21kID0gZ2Fpbl9jbWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmZ2Fpbl9jbWQpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGNtZCwgImdhaW5fZW50cnkiKSkgeworICAgICAgICBjaGFyICpnYWluX2VudHJ5X2NtZDsKKworICAgICAgICBpZiAoU0VMRUNUX0dBSU5fRU5UUlkocykgJiYgIXN0cmNtcChTRUxFQ1RfR0FJTl9FTlRSWShzKSwgYXJncykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgImVxdWFsIGdhaW5fZW50cnksIGRvIG5vdCByZWJ1aWxkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGdhaW5fZW50cnlfY21kID0gYXZfc3RyZHVwKGFyZ3MpOworICAgICAgICBpZiAoIWdhaW5fZW50cnlfY21kKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICByZXQgPSBnZW5lcmF0ZV9rZXJuZWwoY3R4LCBTRUxFQ1RfR0FJTihzKSwgZ2Fpbl9lbnRyeV9jbWQpOworICAgICAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5nYWluX2VudHJ5X2NtZCk7CisgICAgICAgICAgICBzLT5nYWluX2VudHJ5X2NtZCA9IGdhaW5fZW50cnlfY21kOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfZnJlZXAoJmdhaW5fZW50cnlfY21kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBmaXJlcXVhbGl6ZXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC5jb25maWdfcHJvcHMgICA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5uZWVkc193cml0YWJsZSA9IDEsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGZpcmVxdWFsaXplcl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lICA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9maXJlcXVhbGl6ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICA9ICJmaXJlcXVhbGl6ZXIiLAorICAgIC5kZXNjcmlwdGlvbiAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmluaXRlIEltcHVsc2UgUmVzcG9uc2UgRXF1YWxpemVyLiIpLAorICAgIC51bmluaXQgICAgICAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgICAgICA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByb2Nlc3NfY29tbWFuZCAgICA9IHByb2Nlc3NfY29tbWFuZCwKKyAgICAucHJpdl9zaXplICAgICAgICAgID0gc2l6ZW9mKEZJUkVxdWFsaXplckNvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgICAgICAgPSBmaXJlcXVhbGl6ZXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICAgICAgPSBmaXJlcXVhbGl6ZXJfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICAgICAgID0gJmZpcmVxdWFsaXplcl9jbGFzcywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9mbGFuZ2VyLmMgYi9saWJhdmZpbHRlci9hZl9mbGFuZ2VyLmMKaW5kZXggYTkyMzY3Yy4uYjc0OTdhMSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfZmxhbmdlci5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2ZsYW5nZXIuYwpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkgewogICAgICAgICBvdXRfZnJhbWUgPSBmcmFtZTsKICAgICB9IGVsc2UgewotICAgICAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICAgICBvdXRfZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGN0eC0+b3V0cHV0c1swXSwgZnJhbWUtPm5iX3NhbXBsZXMpOwogICAgICAgICBpZiAoIW91dF9mcmFtZSkgewogICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2hhYXMuYyBiL2xpYmF2ZmlsdGVyL2FmX2hhYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ZjOTNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvYWZfaGFhcy5jCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMTAgVmxhZGltaXIgU2Fkb3ZuaWtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisKKyNkZWZpbmUgTUFYX0hBQVNfREVMQVkgNDAKKwordHlwZWRlZiBzdHJ1Y3QgSGFhc0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgaW50IHBhcl9tX3NvdXJjZTsKKyAgICBkb3VibGUgcGFyX2RlbGF5MDsKKyAgICBkb3VibGUgcGFyX2RlbGF5MTsKKyAgICBpbnQgcGFyX3BoYXNlMDsKKyAgICBpbnQgcGFyX3BoYXNlMTsKKyAgICBpbnQgcGFyX21pZGRsZV9waGFzZTsKKyAgICBkb3VibGUgcGFyX3NpZGVfZ2FpbjsKKyAgICBkb3VibGUgcGFyX2dhaW4wOworICAgIGRvdWJsZSBwYXJfZ2FpbjE7CisgICAgZG91YmxlIHBhcl9iYWxhbmNlMDsKKyAgICBkb3VibGUgcGFyX2JhbGFuY2UxOworICAgIGRvdWJsZSBsZXZlbF9pbjsKKyAgICBkb3VibGUgbGV2ZWxfb3V0OworCisgICAgZG91YmxlICpidWZmZXI7CisgICAgc2l6ZV90IGJ1ZmZlcl9zaXplOworICAgIHVpbnQzMl90IHdyaXRlX3B0cjsKKyAgICB1aW50MzJfdCBkZWxheVsyXTsKKyAgICBkb3VibGUgYmFsYW5jZV9sWzJdOworICAgIGRvdWJsZSBiYWxhbmNlX3JbMl07CisgICAgZG91YmxlIHBoYXNlMDsKKyAgICBkb3VibGUgcGhhc2UxOworfSBIYWFzQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSGFhc0NvbnRleHQsIHgpCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBoYWFzX29wdGlvbnNbXSA9IHsKKyAgICB7ICJsZXZlbF9pbiIsICAgICAgInNldCBsZXZlbCBpbiIsICAgICAgT0ZGU0VUKGxldmVsX2luKSwgICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICB7LmRibD0xfSwgMC4wMTU2MjUsICA2NCwgQSB9LAorICAgIHsgImxldmVsX291dCIsICAgICAic2V0IGxldmVsIG91dCIsICAgICBPRkZTRVQobGV2ZWxfb3V0KSwgICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgIHsuZGJsPTF9LCAwLjAxNTYyNSwgIDY0LCBBIH0sCisgICAgeyAic2lkZV9nYWluIiwgICAgICJzZXQgc2lkZSBnYWluIiwgICAgIE9GRlNFVChwYXJfc2lkZV9nYWluKSwgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgey5kYmw9MX0sIDAuMDE1NjI1LCAgNjQsIEEgfSwKKyAgICB7ICJtaWRkbGVfc291cmNlIiwgInNldCBtaWRkbGUgc291cmNlIiwgT0ZGU0VUKHBhcl9tX3NvdXJjZSksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICB7Lmk2ND0yfSwgICAgICAgIDAsICAgMywgQSwgInNvdXJjZSIgfSwKKyAgICB7ICAgImxlZnQiLCAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICB7Lmk2ND0wfSwgICAgICAgIDAsICAgMCwgQSwgInNvdXJjZSIgfSwKKyAgICB7ICAgInJpZ2h0IiwgICAgICAgMCwgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICB7Lmk2ND0xfSwgICAgICAgIDAsICAgMCwgQSwgInNvdXJjZSIgfSwKKyAgICB7ICAgIm1pZCIsICAgICAgICAgIkwrUiIsICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICB7Lmk2ND0yfSwgICAgICAgIDAsICAgMCwgQSwgInNvdXJjZSIgfSwKKyAgICB7ICAgInNpZGUiLCAgICAgICAgIkwtUiIsICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICB7Lmk2ND0zfSwgICAgICAgIDAsICAgMCwgQSwgInNvdXJjZSIgfSwKKyAgICB7ICJtaWRkbGVfcGhhc2UiLCAgInNldCBtaWRkbGUgcGhhc2UiLCAgT0ZGU0VUKHBhcl9taWRkbGVfcGhhc2UpLCBBVl9PUFRfVFlQRV9CT09MLCAgICB7Lmk2ND0wfSwgICAgICAgIDAsICAgMSwgQSB9LAorICAgIHsgImxlZnRfZGVsYXkiLCAgICAic2V0IGxlZnQgZGVsYXkiLCAgICBPRkZTRVQocGFyX2RlbGF5MCksICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgIHsuZGJsPTIuMDV9LCAgICAgMCwgIE1BWF9IQUFTX0RFTEFZLCBBIH0sCisgICAgeyAibGVmdF9iYWxhbmNlIiwgICJzZXQgbGVmdCBiYWxhbmNlIiwgIE9GRlNFVChwYXJfYmFsYW5jZTApLCAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgey5kYmw9LTEuMH0sICAgIC0xLCAgIDEsIEEgfSwKKyAgICB7ICJsZWZ0X2dhaW4iLCAgICAgInNldCBsZWZ0IGdhaW4iLCAgICAgT0ZGU0VUKHBhcl9nYWluMCksICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICB7LmRibD0xfSwgMC4wMTU2MjUsICA2NCwgQSB9LAorICAgIHsgImxlZnRfcGhhc2UiLCAgICAic2V0IGxlZnQgcGhhc2UiLCAgICBPRkZTRVQocGFyX3BoYXNlMCksICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgIHsuaTY0PTB9LCAgICAgICAgMCwgICAxLCBBIH0sCisgICAgeyAicmlnaHRfZGVsYXkiLCAgICJzZXQgcmlnaHQgZGVsYXkiLCAgIE9GRlNFVChwYXJfZGVsYXkxKSwgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgey5kYmw9Mi4xMn0sICAgICAwLCAgTUFYX0hBQVNfREVMQVksIEEgfSwKKyAgICB7ICJyaWdodF9iYWxhbmNlIiwgInNldCByaWdodCBiYWxhbmNlIiwgT0ZGU0VUKHBhcl9iYWxhbmNlMSksICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICB7LmRibD0xfSwgICAgICAgLTEsICAgMSwgQSB9LAorICAgIHsgInJpZ2h0X2dhaW4iLCAgICAic2V0IHJpZ2h0IGdhaW4iLCAgICBPRkZTRVQocGFyX2dhaW4xKSwgICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgIHsuZGJsPTF9LCAwLjAxNTYyNSwgIDY0LCBBIH0sCisgICAgeyAicmlnaHRfcGhhc2UiLCAgICJzZXQgcmlnaHQgcGhhc2UiLCAgIE9GRlNFVChwYXJfcGhhc2UxKSwgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgICAgey5pNjQ9MX0sICAgICAgICAwLCAgIDEsIEEgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGhhYXMpOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXQgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2FkZF9mb3JtYXQgICAgICAgICAgICAgICAgICgmZm9ybWF0cywgQVZfU0FNUExFX0ZNVF9EQkwgICkpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfc2V0X2NvbW1vbl9mb3JtYXRzICAgICAgICAgKGN0eCAgICAgLCBmb3JtYXRzICAgICAgICAgICAgKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9hZGRfY2hhbm5lbF9sYXlvdXQgICAgICAgICAoJmxheW91dCAsIEFWX0NIX0xBWU9VVF9TVEVSRU8pKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzIChjdHggICAgICwgbGF5b3V0ICAgICAgICAgICAgICkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEhhYXNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHNpemVfdCBtaW5fYnVmX3NpemUgPSAoc2l6ZV90KShpbmxpbmstPnNhbXBsZV9yYXRlICogTUFYX0hBQVNfREVMQVkgKiAwLjAwMSk7CisgICAgc2l6ZV90IG5ld19idWZfc2l6ZSA9IDE7CisKKyAgICB3aGlsZSAobmV3X2J1Zl9zaXplIDwgbWluX2J1Zl9zaXplKQorICAgICAgICBuZXdfYnVmX3NpemUgPDw9IDE7CisKKyAgICBhdl9mcmVlcCgmcy0+YnVmZmVyKTsKKyAgICBzLT5idWZmZXIgPSBhdl9jYWxsb2MobmV3X2J1Zl9zaXplLCBzaXplb2YoKnMtPmJ1ZmZlcikpOworICAgIGlmICghcy0+YnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+YnVmZmVyX3NpemUgPSBuZXdfYnVmX3NpemU7CisgICAgcy0+d3JpdGVfcHRyID0gMDsKKworICAgIHMtPmRlbGF5WzBdID0gKHVpbnQzMl90KShzLT5wYXJfZGVsYXkwICogMC4wMDEgKiBpbmxpbmstPnNhbXBsZV9yYXRlKTsKKyAgICBzLT5kZWxheVsxXSA9ICh1aW50MzJfdCkocy0+cGFyX2RlbGF5MSAqIDAuMDAxICogaW5saW5rLT5zYW1wbGVfcmF0ZSk7CisKKyAgICBzLT5waGFzZTAgPSBzLT5wYXJfcGhhc2UwID8gMS4wIDogLTEuMDsKKyAgICBzLT5waGFzZTEgPSBzLT5wYXJfcGhhc2UxID8gMS4wIDogLTEuMDsKKworICAgIHMtPmJhbGFuY2VfbFswXSA9IChzLT5wYXJfYmFsYW5jZTAgKyAxKSAvIDIgKiBzLT5wYXJfZ2FpbjAgKiBzLT5waGFzZTA7CisgICAgcy0+YmFsYW5jZV9yWzBdID0gKDEuMCAtIChzLT5wYXJfYmFsYW5jZTAgKyAxKSAvIDIpICogKHMtPnBhcl9nYWluMCkgKiBzLT5waGFzZTA7CisgICAgcy0+YmFsYW5jZV9sWzFdID0gKHMtPnBhcl9iYWxhbmNlMSArIDEpIC8gMiAqIHMtPnBhcl9nYWluMSAqIHMtPnBoYXNlMTsKKyAgICBzLT5iYWxhbmNlX3JbMV0gPSAoMS4wIC0gKHMtPnBhcl9iYWxhbmNlMSArIDEpIC8gMikgKiAocy0+cGFyX2dhaW4xKSAqIHMtPnBoYXNlMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgSGFhc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgZG91YmxlICpzcmMgPSAoY29uc3QgZG91YmxlICopaW4tPmRhdGFbMF07CisgICAgY29uc3QgZG91YmxlIGxldmVsX2luID0gcy0+bGV2ZWxfaW47CisgICAgY29uc3QgZG91YmxlIGxldmVsX291dCA9IHMtPmxldmVsX291dDsKKyAgICBjb25zdCB1aW50MzJfdCBtYXNrID0gcy0+YnVmZmVyX3NpemUgLSAxOworICAgIGRvdWJsZSAqYnVmZmVyID0gcy0+YnVmZmVyOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBkb3VibGUgKmRzdDsKKyAgICBpbnQgbjsKKworICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbikpIHsKKyAgICAgICAgb3V0ID0gaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorICAgIGRzdCA9IChkb3VibGUgKilvdXQtPmRhdGFbMF07CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgaW4tPm5iX3NhbXBsZXM7IG4rKywgc3JjICs9IDIsIGRzdCArPSAyKSB7CisgICAgICAgIGRvdWJsZSBtaWQsIHNpZGVbMl0sIHNpZGVfbCwgc2lkZV9yOworICAgICAgICB1aW50MzJfdCBzMF9wdHIsIHMxX3B0cjsKKworICAgICAgICBzd2l0Y2ggKHMtPnBhcl9tX3NvdXJjZSkgeworICAgICAgICBjYXNlIDA6IG1pZCA9IHNyY1swXTsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogbWlkID0gc3JjWzFdOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBtaWQgPSAoc3JjWzBdICsgc3JjWzFdKSAqIDAuNTsgYnJlYWs7CisgICAgICAgIGNhc2UgMzogbWlkID0gKHNyY1swXSAtIHNyY1sxXSkgKiAwLjU7IGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgbWlkICo9IGxldmVsX2luOworCisgICAgICAgIGJ1ZmZlcltzLT53cml0ZV9wdHJdID0gbWlkOworCisgICAgICAgIHMwX3B0ciA9IChzLT53cml0ZV9wdHIgKyBzLT5idWZmZXJfc2l6ZSAtIHMtPmRlbGF5WzBdKSAmIG1hc2s7CisgICAgICAgIHMxX3B0ciA9IChzLT53cml0ZV9wdHIgKyBzLT5idWZmZXJfc2l6ZSAtIHMtPmRlbGF5WzFdKSAmIG1hc2s7CisKKyAgICAgICAgaWYgKHMtPnBhcl9taWRkbGVfcGhhc2UpCisgICAgICAgICAgICBtaWQgPSAtbWlkOworCisgICAgICAgIHNpZGVbMF0gPSBidWZmZXJbczBfcHRyXSAqIHMtPnBhcl9zaWRlX2dhaW47CisgICAgICAgIHNpZGVbMV0gPSBidWZmZXJbczFfcHRyXSAqIHMtPnBhcl9zaWRlX2dhaW47CisgICAgICAgIHNpZGVfbCAgPSBzaWRlWzBdICogcy0+YmFsYW5jZV9sWzBdIC0gc2lkZVsxXSAqIHMtPmJhbGFuY2VfbFsxXTsKKyAgICAgICAgc2lkZV9yICA9IHNpZGVbMV0gKiBzLT5iYWxhbmNlX3JbMV0gLSBzaWRlWzBdICogcy0+YmFsYW5jZV9yWzBdOworCisgICAgICAgIGRzdFswXSA9IChtaWQgKyBzaWRlX2wpICogbGV2ZWxfb3V0OworICAgICAgICBkc3RbMV0gPSAobWlkICsgc2lkZV9yKSAqIGxldmVsX291dDsKKworICAgICAgICBzLT53cml0ZV9wdHIgPSAocy0+d3JpdGVfcHRyICsgMSkgJiBtYXNrOworICAgIH0KKworICAgIGlmIChvdXQgIT0gaW4pCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEhhYXNDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJlZXAoJnMtPmJ1ZmZlcik7CisgICAgcy0+YnVmZmVyX3NpemUgPSAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfaGFhcyA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiaGFhcyIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IEhhYXMgU3RlcmVvIEVuaGFuY2VyLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzICA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKEhhYXNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmaGFhc19jbGFzcywKKyAgICAudW5pbml0ICAgICAgICAgPSB1bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICA9IG91dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfaGRjZC5jIGIvbGliYXZmaWx0ZXIvYWZfaGRjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMTc2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9hZl9oZGNkLmMKQEAgLTAsMCArMSwxNzg1IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAxMCwgQ2hyaXMgTW9lbGxlciwKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogIE9wdGltaXphdGlvbnMgYnkgR3VtYm9vdAorICogIEFkZGl0aW9uYWwgd29yayBieSBCdXJ0IFAuCisgKiAgT3JpZ2luYWwgY29kZSByZXZlcnNlIGVuZ2luZWVyZWQgZnJvbSBIRENEIGRlY29kZXIgbGlicmFyeSBieSBDaHJpc3RvcGhlciBLZXksCisgKiAgd2hpY2ggd2FzIGxpa2VseSByZXZlcnNlIGVuZ2luZWVyZWQgZnJvbSBXaW5kb3dzIE1lZGlhIFBsYXllci4KKyAqCisgKiAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAqICBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCisgKiAgICAgICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4KKyAqICAgICAgIHBlcm1pc3Npb24uCisgKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAqICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICogIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgKiBIRENEIGlzIEhpZ2ggRGVmaW5pdGlvbiBDb21wYXRpYmxlIERpZ2l0YWwKKyAqIGh0dHA6Ly93aWtpLmh5ZHJvZ2VuYXVkLmlvL2luZGV4LnBocD90aXRsZT1IaWdoX0RlZmluaXRpb25fQ29tcGF0aWJsZV9EaWdpdGFsCisgKgorICogTW9yZSBpbmZvcm1hdGlvbiBhYm91dCBIRENELWVuY29kZWQgYXVkaW8gQ0RzOgorICogaHR0cDovL3d3dy5hdWRpb21pc2MuY28udWsvSEZOL0hEQ0QvRW5pZ21hLmh0bWwKKyAqIGh0dHA6Ly93d3cuYXVkaW9taXNjLmNvLnVrL0hGTi9IRENEL0V4YW1pbmVkLmh0bWwKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBIRENEIGRlY29kaW5nIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKKyNkZWZpbmUgUEVBS19FWFRfTEVWRUwgMHg1OTgxIC8qICsgc2l6ZW9mKHBlYWt0YWIpLTEgPSAweDgwMDAgICovCitzdGF0aWMgY29uc3QgdWludDMyX3QgcGVha3RhYlsweDI2ODBdID0geworICAgIDB4MmNjMDgzMDAsIDB4MmNjMTA2MDAsIDB4MmNjMTg5MDAsIDB4MmNjMjBjMDAsIDB4MmNjMjhmMDAsIDB4MmNjMzEyMDAsIDB4MmNjMzk1MDAsIDB4MmNjNDE4MDAsIDB4MmNjNDliMDAsIDB4MmNjNTFlMDAsIDB4MmNjNWExMDAsIDB4MmNjNjI0MDAsIDB4MmNjNmE3MDAsIDB4MmNjNzJhMDAsIDB4MmNjN2FkMDAsIDB4MmNjODMwMDAsCisgICAgMHgyY2M4YjMwMCwgMHgyY2M5MzYwMCwgMHgyY2M5YjkwMCwgMHgyY2NhM2MwMCwgMHgyY2NhYmYwMCwgMHgyY2NiNDIwMCwgMHgyY2NiYzUwMCwgMHgyY2NjNDgwMCwgMHgyY2NjY2IwMCwgMHgyY2NkNGUwMCwgMHgyY2NkZDEwMCwgMHgyY2NlNTQwMCwgMHgyY2NlZDcwMCwgMHgyY2NmNWEwMCwgMHgyY2NmZGQwMCwgMHgyY2QwNjAwMCwKKyAgICAweDJjZDBlMzAwLCAweDJjZDE2NjAwLCAweDJjZDFlOTAwLCAweDJjZDI2YzAwLCAweDJjZDJlZjAwLCAweDJjZDM3MjAwLCAweDJjZDNmNTAwLCAweDJjZDQ3ODAwLCAweDJjZDRmYjAwLCAweDJjZDU3ZTAwLCAweDJjZDYwMTAwLCAweDJjZDY4NDAwLCAweDJjZDcwNzAwLCAweDJjZDc4YTAwLCAweDJjZDgwZDAwLCAweDJjZDg5MDAwLAorICAgIDB4MmNkOTEzMDAsIDB4MmNkOTk2MDAsIDB4MmNkYTE5MDAsIDB4MmNkYTljMDAsIDB4MmNkYjFmMDAsIDB4MmNkYmEyMDAsIDB4MmNkYzI1MDAsIDB4MmNkY2E4MDAsIDB4MmNkZDJiMDAsIDB4MmNkZGFlMDAsIDB4MmNkZTMxMDAsIDB4MmNkZWI0MDAsIDB4MmNkZjM3MDAsIDB4MmNkZmJhMDAsIDB4MmNlMDNkMDAsIDB4MmNlMGMwMDAsCisgICAgMHgyY2UxNDMwMCwgMHgyY2UxYzYwMCwgMHgyY2UyNDkwMCwgMHgyY2UyY2MwMCwgMHgyY2UzNGYwMCwgMHgyY2UzZDIwMCwgMHgyY2U0NTUwMCwgMHgyY2U0ZDgwMCwgMHgyY2U1NWIwMCwgMHgyY2U1ZGUwMCwgMHgyY2U2NjEwMCwgMHgyY2U2ZTQwMCwgMHgyY2U3NjcwMCwgMHgyY2U3ZWEwMCwgMHgyY2U4NmQwMCwgMHgyY2U4ZjAwMCwKKyAgICAweDJjZTk3MzAwLCAweDJjZTlmNjAwLCAweDJjZWE3OTAwLCAweDJjZWFmYzAwLCAweDJjZWI3ZjAwLCAweDJjZWMwMjAwLCAweDJjZWM4NTAwLCAweDJjZWQwODAwLCAweDJjZWQ4YjAwLCAweDJjZWUwZTAwLCAweDJjZWU5MTAwLCAweDJjZWYxNDAwLCAweDJjZWY5NzAwLCAweDJjZjAxYTAwLCAweDJjZjA5ZDAwLCAweDJjZjEyMDAwLAorICAgIDB4MmNmMWEzMDAsIDB4MmNmMjI2MDAsIDB4MmNmMmE5MDAsIDB4MmNmMzJjMDAsIDB4MmNmM2FmMDAsIDB4MmNmNDMyMDAsIDB4MmNmNGI1MDAsIDB4MmNmNTM4MDAsIDB4MmNmNWJiMDAsIDB4MmNmNjNlMDAsIDB4MmNmNmMxMDAsIDB4MmNmNzQ0MDAsIDB4MmNmN2M3MDAsIDB4MmNmODRhMDAsIDB4MmNmOGNkMDAsIDB4MmNmOTUwMDAsCisgICAgMHgyY2Y5ZDMwMCwgMHgyY2ZhNTYwMCwgMHgyY2ZhZDkwMCwgMHgyY2ZiNWMwMCwgMHgyY2ZiZGYwMCwgMHgyY2ZjNjIwMCwgMHgyY2ZjZTUwMCwgMHgyY2ZkNjgwMCwgMHgyY2ZkZWIwMCwgMHgyY2ZlNmUwMCwgMHgyY2ZlZjEwMCwgMHgyY2ZmNzQwMCwgMHgyY2ZmZjcwMCwgMHgyZDAwN2EwMCwgMHgyZDAwZmQwMCwgMHgyZDAxODAwMCwKKyAgICAweDJkMDIwMzAwLCAweDJkMDI4NjAwLCAweDJkMDMwOTAwLCAweDJkMDM4YzAwLCAweDJkMDQwZjAwLCAweDJkMDQ5MjAwLCAweDJkMDUxNTAwLCAweDJkMDU5ODAwLCAweDJkMDYxYjAwLCAweDJkMDY5ZTAwLCAweDJkMDcyMTAwLCAweDJkMDdhNDAwLCAweDJkMDgyNzAwLCAweDJkMDhhYTAwLCAweDJkMDkyZDAwLCAweDJkMDliMDAwLAorICAgIDB4MmQwYTMzMDAsIDB4MmQwYWI2MDAsIDB4MmQwYjM5MDAsIDB4MmQwYmJjMDAsIDB4MmQwYzNmMDAsIDB4MmQwY2MyMDAsIDB4MmQwZDQ1MDAsIDB4MmQwZGM4MDAsIDB4MmQwZTRiMDAsIDB4MmQwZWNlMDAsIDB4MmQwZjUxMDAsIDB4MmQwZmQ0MDAsIDB4MmQxMDU3MDAsIDB4MmQxMGRhMDAsIDB4MmQxMTVkMDAsIDB4MmQxMWUwMDAsCisgICAgMHgyZDEyNjMwMCwgMHgyZDEyZTYwMCwgMHgyZDEzNjkwMCwgMHgyZDEzZWMwMCwgMHgyZDE0NmYwMCwgMHgyZDE0ZjIwMCwgMHgyZDE1NzUwMCwgMHgyZDE1ZjgwMCwgMHgyZDE2N2IwMCwgMHgyZDE2ZmUwMCwgMHgyZDE3ODEwMCwgMHgyZDE4MDQwMCwgMHgyZDE4ODcwMCwgMHgyZDE5MGEwMCwgMHgyZDE5OGQwMCwgMHgyZDFhMTAwMCwKKyAgICAweDJkMWE5MzAwLCAweDJkMWIxNjAwLCAweDJkMWI5OTAwLCAweDJkMWMxYzAwLCAweDJkMWM5ZjAwLCAweDJkMWQyMjAwLCAweDJkMWRhNTAwLCAweDJkMWUyODAwLCAweDJkMWVhYjAwLCAweDJkMWYyZTAwLCAweDJkMWZiMTAwLCAweDJkMjAzNDAwLCAweDJkMjBiNzAwLCAweDJkMjEzYTAwLCAweDJkMjFiZDAwLCAweDJkMjI0MDAwLAorICAgIDB4MmQyMmMzMDAsIDB4MmQyMzQ2MDAsIDB4MmQyM2M5MDAsIDB4MmQyNDRjMDAsIDB4MmQyNGNmMDAsIDB4MmQyNTUyMDAsIDB4MmQyNWQ1MDAsIDB4MmQyNjU4MDAsIDB4MmQyNmRiMDAsIDB4MmQyNzVlMDAsIDB4MmQyN2UxMDAsIDB4MmQyODY0MDAsIDB4MmQyOGU3MDAsIDB4MmQyOTZhMDAsIDB4MmQyOWVkMDAsIDB4MmQyYTcwMDAsCisgICAgMHgyZDJhZjMwMCwgMHgyZDJiNzYwMCwgMHgyZDJiZjkwMCwgMHgyZDJjN2MwMCwgMHgyZDJjZmYwMCwgMHgyZDJkODIwMCwgMHgyZDJlMDUwMCwgMHgyZDJlODgwMCwgMHgyZDJmMGIwMCwgMHgyZDJmOGUwMCwgMHgyZDMwMTEwMCwgMHgyZDMwOTQwMCwgMHgyZDMxMTcwMCwgMHgyZDMxOWEwMCwgMHgyZDMyMWQwMCwgMHgyZDMyYTAwMCwKKyAgICAweDJkMzMyMzAwLCAweDJkMzNhNjAwLCAweDJkMzQyOTAwLCAweDJkMzRhYzAwLCAweDJkMzUyZjAwLCAweDJkMzViMjAwLCAweDJkMzYzNTAwLCAweDJkMzZiODAwLCAweDJkMzczYjAwLCAweDJkMzdiZTAwLCAweDJkMzg0MTAwLCAweDJkMzhjNDAwLCAweDJkMzk0NzAwLCAweDJkMzljYTAwLCAweDJkM2E0ZDAwLCAweDJkM2FkMDAwLAorICAgIDB4MmQzYjUzMDAsIDB4MmQzYmQ2MDAsIDB4MmQzYzU5MDAsIDB4MmQzY2RjMDAsIDB4MmQzZDVmMDAsIDB4MmQzZGUyMDAsIDB4MmQzZTY1MDAsIDB4MmQzZWU4MDAsIDB4MmQzZjZiMDAsIDB4MmQzZmVlMDAsIDB4MmQ0MDcxMDAsIDB4MmQ0MGY0MDAsIDB4MmQ0MTc3MDAsIDB4MmQ0MWZhMDAsIDB4MmQ0MjdkMDAsIDB4MmQ0MzAwMDAsCisgICAgMHgyZDQzODMwMCwgMHgyZDQ0MDYwMCwgMHgyZDQ0ODkwMCwgMHgyZDQ1MGMwMCwgMHgyZDQ1OGYwMCwgMHgyZDQ2MTIwMCwgMHgyZDQ2OTUwMCwgMHgyZDQ3MTgwMCwgMHgyZDQ3OWIwMCwgMHgyZDQ4MWUwMCwgMHgyZDQ4YTEwMCwgMHgyZDQ5MjQwMCwgMHgyZDQ5YTcwMCwgMHgyZDRhMmEwMCwgMHgyZDRhYWQwMCwgMHgyZDRiMzAwMCwKKyAgICAweDJkNGJiMzAwLCAweDJkNGMzNjAwLCAweDJkNGNiOTAwLCAweDJkNGQzYzAwLCAweDJkNGRiZjAwLCAweDJkNGU0MjAwLCAweDJkNGVjNTAwLCAweDJkNGY0ODAwLCAweDJkNGZjYjAwLCAweDJkNTA0ZTAwLCAweDJkNTBkMTAwLCAweDJkNTE1NDAwLCAweDJkNTFkNzAwLCAweDJkNTI1YTAwLCAweDJkNTJkZDAwLCAweDJkNTM2MDAwLAorICAgIDB4MmQ1M2UzMDAsIDB4MmQ1NDY2MDAsIDB4MmQ1NGU5MDAsIDB4MmQ1NTZjMDAsIDB4MmQ1NWVmMDAsIDB4MmQ1NjcyMDAsIDB4MmQ1NmY1MDAsIDB4MmQ1Nzc4MDAsIDB4MmQ1N2ZiMDAsIDB4MmQ1ODdlMDAsIDB4MmQ1OTAxMDAsIDB4MmQ1OTg0MDAsIDB4MmQ1YTA3MDAsIDB4MmQ1YThhMDAsIDB4MmQ1YjBkMDAsIDB4MmQ1YjkwMDAsCisgICAgMHgyZDVjMTMwMCwgMHgyZDVjOTYwMCwgMHgyZDVkMTkwMCwgMHgyZDVkOWMwMCwgMHgyZDVlMWYwMCwgMHgyZDVlYTIwMCwgMHgyZDVmMjUwMCwgMHgyZDVmYTgwMCwgMHgyZDYwMmIwMCwgMHgyZDYwYWUwMCwgMHgyZDYxMzEwMCwgMHgyZDYxYjQwMCwgMHgyZDYyMzcwMCwgMHgyZDYyYmEwMCwgMHgyZDYzM2QwMCwgMHgyZDYzYzAwMCwKKyAgICAweDJkNjQ0MzAwLCAweDJkNjRjNjAwLCAweDJkNjU0OTAwLCAweDJkNjVjYzAwLCAweDJkNjY0ZjAwLCAweDJkNjZkMjAwLCAweDJkNjc1NTAwLCAweDJkNjdkODAwLCAweDJkNjg1YjAwLCAweDJkNjhkZTAwLCAweDJkNjk2MTAwLCAweDJkNjllNDAwLCAweDJkNmE2NzAwLCAweDJkNmFlYTAwLCAweDJkNmI2ZDAwLCAweDJkNmJmMDAwLAorICAgIDB4MmQ2YzczMDAsIDB4MmQ2Y2Y2MDAsIDB4MmQ2ZDc5MDAsIDB4MmQ2ZGZjMDAsIDB4MmQ2ZTdmMDAsIDB4MmQ2ZjAyMDAsIDB4MmQ2Zjg1MDAsIDB4MmQ3MDA4MDAsIDB4MmQ3MDhiMDAsIDB4MmQ3MTBlMDAsIDB4MmQ3MTkxMDAsIDB4MmQ3MjE0MDAsIDB4MmQ3Mjk3MDAsIDB4MmQ3MzFhMDAsIDB4MmQ3MzlkMDAsIDB4MmQ3NDIwMDAsCisgICAgMHgyZDc0YTMwMCwgMHgyZDc1MjYwMCwgMHgyZDc1YTkwMCwgMHgyZDc2MmMwMCwgMHgyZDc2YWYwMCwgMHgyZDc3MzIwMCwgMHgyZDc3YjUwMCwgMHgyZDc4MzgwMCwgMHgyZDc4YmIwMCwgMHgyZDc5M2UwMCwgMHgyZDc5YzEwMCwgMHgyZDdhNDQwMCwgMHgyZDdhYzcwMCwgMHgyZDdiNGEwMCwgMHgyZDdiY2QwMCwgMHgyZDdjNTAwMCwKKyAgICAweDJkN2NkMzAwLCAweDJkN2Q1NjAwLCAweDJkN2RkOTAwLCAweDJkN2U1YzAwLCAweDJkN2VkZjAwLCAweDJkN2Y2MjAwLCAweDJkN2ZlNTAwLCAweDJkODA2ODAwLCAweDJkODBlYjAwLCAweDJkODE2ZTAwLCAweDJkODFmMTAwLCAweDJkODI3NDAwLCAweDJkODJmNzAwLCAweDJkODM3YTAwLCAweDJkODNmZDAwLCAweDJkODQ4MDAwLAorICAgIDB4MmQ4NTAzMDAsIDB4MmQ4NTg2MDAsIDB4MmQ4NjA5MDAsIDB4MmQ4NjhjMDAsIDB4MmQ4NzBmMDAsIDB4MmQ4NzkyMDAsIDB4MmQ4ODE1MDAsIDB4MmQ4ODk4MDAsIDB4MmQ4OTFiMDAsIDB4MmQ4OTllMDAsIDB4MmQ4YTIxMDAsIDB4MmQ4YWE0MDAsIDB4MmQ4YjI3MDAsIDB4MmQ4YmFhMDAsIDB4MmQ4YzJkMDAsIDB4MmQ4Y2IwMDAsCisgICAgMHgyZDhkMzMwMCwgMHgyZDhkYjYwMCwgMHgyZDhlMzkwMCwgMHgyZDhlYmMwMCwgMHgyZDhmM2YwMCwgMHgyZDhmYzIwMCwgMHgyZDkwNDUwMCwgMHgyZDkwYzgwMCwgMHgyZDkxNGIwMCwgMHgyZDkxY2UwMCwgMHgyZDkyNTEwMCwgMHgyZDkyZDQwMCwgMHgyZDkzNTcwMCwgMHgyZDkzZGEwMCwgMHgyZDk0NWQwMCwgMHgyZDk0ZTAwMCwKKyAgICAweDJkOTU2MzAwLCAweDJkOTVlNjAwLCAweDJkOTY2OTAwLCAweDJkOTZlYzAwLCAweDJkOTc2ZjAwLCAweDJkOTdmMjAwLCAweDJkOTg3NTAwLCAweDJkOThmODAwLCAweDJkOTk3YjAwLCAweDJkOTlmZTAwLCAweDJkOWE4MTAwLCAweDJkOWIwNDAwLCAweDJkOWI4NzAwLCAweDJkOWMwYTAwLCAweDJkOWM4ZDAwLCAweDJkOWQxMDAwLAorICAgIDB4MmQ5ZDkzMDAsIDB4MmQ5ZTE2MDAsIDB4MmQ5ZTk5MDAsIDB4MmQ5ZjFjMDAsIDB4MmQ5ZjlmMDAsIDB4MmRhMDIyMDAsIDB4MmRhMGE1MDAsIDB4MmRhMTI4MDAsIDB4MmRhMWFiMDAsIDB4MmRhMjJlMDAsIDB4MmRhMmIxMDAsIDB4MmRhMzM0MDAsIDB4MmRhM2I3MDAsIDB4MmRhNDNhMDAsIDB4MmRhNGJkMDAsIDB4MmRhNTQwMDAsCisgICAgMHgyZGE1YzMwMCwgMHgyZGE2NDYwMCwgMHgyZGE2YzkwMCwgMHgyZGE3NGMwMCwgMHgyZGE3Y2YwMCwgMHgyZGE4NTIwMCwgMHgyZGE4ZDUwMCwgMHgyZGE5NTgwMCwgMHgyZGE5ZGIwMCwgMHgyZGFhNWUwMCwgMHgyZGFhZTEwMCwgMHgyZGFiNjQwMCwgMHgyZGFiZTcwMCwgMHgyZGFjNmEwMCwgMHgyZGFjZWQwMCwgMHgyZGFkNzAwMCwKKyAgICAweDJkYWRmMzAwLCAweDJkYWU3NjAwLCAweDJkYWVmOTAwLCAweDJkYWY3YzAwLCAweDJkYWZmZjAwLCAweDJkYjA4MjAwLCAweDJkYjEwNTAwLCAweDJkYjE4ODAwLCAweDJkYjIwYjAwLCAweDJkYjI4ZTAwLCAweDJkYjMxMTAwLCAweDJkYjM5NDAwLCAweDJkYjQxNzAwLCAweDJkYjQ5YTAwLCAweDJkYjUxZDAwLCAweDJkYjVhMDAwLAorICAgIDB4MmRiNjIzMDAsIDB4MmRiNmE2MDAsIDB4MmRiNzI5MDAsIDB4MmRiN2FjMDAsIDB4MmRiODJmMDAsIDB4MmRiOGIyMDAsIDB4MmRiOTM1MDAsIDB4MmRiOWI4MDAsIDB4MmRiYTNiMDAsIDB4MmRiYWJlMDAsIDB4MmRiYjQxMDAsIDB4MmRiYmM0MDAsIDB4MmRiYzQ3MDAsIDB4MmRiY2NhMDAsIDB4MmRiZDRkMDAsIDB4MmRiZGQwMDAsCisgICAgMHgyZGJlNTMwMCwgMHgyZGJlZDYwMCwgMHgyZGJmNTkwMCwgMHgyZGJmZGMwMCwgMHgyZGMwNWYwMCwgMHgyZGMwZTIwMCwgMHgyZGMxNjUwMCwgMHgyZGMxZTgwMCwgMHgyZGMyNmIwMCwgMHgyZGMyZWUwMCwgMHgyZGMzNzEwMCwgMHgyZGMzZjQwMCwgMHgyZGM0NzcwMCwgMHgyZGM0ZmEwMCwgMHgyZGM1N2QwMCwgMHgyZGM2MDAwMCwKKyAgICAweDJkYzY4NzAwLCAweDJkYzcwZTAwLCAweDJkYzc5NTAwLCAweDJkYzgxYzAwLCAweDJkYzhhMzAwLCAweDJkYzkyYTAwLCAweDJkYzliMTAwLCAweDJkY2EzODAwLCAweDJkY2FiZjAwLCAweDJkY2I0NjAwLCAweDJkY2JjZDAwLCAweDJkY2M1NDAwLCAweDJkY2NkYjAwLCAweDJkY2Q2MjAwLCAweDJkY2RlOTAwLCAweDJkY2U3MDAwLAorICAgIDB4MmRjZWY3MDAsIDB4MmRjZjdlMDAsIDB4MmRkMDA1MDAsIDB4MmRkMDhjMDAsIDB4MmRkMTEzMDAsIDB4MmRkMTlhMDAsIDB4MmRkMjIxMDAsIDB4MmRkMmE4MDAsIDB4MmRkMzJmMDAsIDB4MmRkM2I2MDAsIDB4MmRkNDNkMDAsIDB4MmRkNGM0MDAsIDB4MmRkNTRiMDAsIDB4MmRkNWQyMDAsIDB4MmRkNjU5MDAsIDB4MmRkNmUwMDAsCisgICAgMHgyZGQ3NjcwMCwgMHgyZGQ3ZWUwMCwgMHgyZGQ4NzUwMCwgMHgyZGQ4ZmMwMCwgMHgyZGQ5ODMwMCwgMHgyZGRhMGEwMCwgMHgyZGRhOTEwMCwgMHgyZGRiMTgwMCwgMHgyZGRiOWYwMCwgMHgyZGRjMjYwMCwgMHgyZGRjYWQwMCwgMHgyZGRkMzQwMCwgMHgyZGRkYmIwMCwgMHgyZGRlNDIwMCwgMHgyZGRlYzkwMCwgMHgyZGRmNTAwMCwKKyAgICAweDJkZGZkNzAwLCAweDJkZTA1ZTAwLCAweDJkZTBlNTAwLCAweDJkZTE2YzAwLCAweDJkZTFmMzAwLCAweDJkZTI3YTAwLCAweDJkZTMwMTAwLCAweDJkZTM4ODAwLCAweDJkZTQwZjAwLCAweDJkZTQ5NjAwLCAweDJkZTUxZDAwLCAweDJkZTVhNDAwLCAweDJkZTYyYjAwLCAweDJkZTZiMjAwLCAweDJkZTczOTAwLCAweDJkZTdjMDAwLAorICAgIDB4MmRlODQ3MDAsIDB4MmRlOGNlMDAsIDB4MmRlOTU1MDAsIDB4MmRlOWRjMDAsIDB4MmRlYTYzMDAsIDB4MmRlYWVhMDAsIDB4MmRlYjcxMDAsIDB4MmRlYmY4MDAsIDB4MmRlYzdmMDAsIDB4MmRlZDA2MDAsIDB4MmRlZDhkMDAsIDB4MmRlZTE0MDAsIDB4MmRlZTliMDAsIDB4MmRlZjIyMDAsIDB4MmRlZmE5MDAsIDB4MmRmMDMwMDAsCisgICAgMHgyZGYwYjcwMCwgMHgyZGYxM2UwMCwgMHgyZGYxYzUwMCwgMHgyZGYyNGMwMCwgMHgyZGYyZDMwMCwgMHgyZGYzNWEwMCwgMHgyZGYzZTEwMCwgMHgyZGY0NjgwMCwgMHgyZGY0ZWYwMCwgMHgyZGY1NzYwMCwgMHgyZGY1ZmQwMCwgMHgyZGY2ODQwMCwgMHgyZGY3MGIwMCwgMHgyZGY3OTIwMCwgMHgyZGY4MTkwMCwgMHgyZGY4YTAwMCwKKyAgICAweDJkZjkyNzAwLCAweDJkZjlhZTAwLCAweDJkZmEzNTAwLCAweDJkZmFiYzAwLCAweDJkZmI0MzAwLCAweDJkZmJjYTAwLCAweDJkZmM1MTAwLCAweDJkZmNkODAwLCAweDJkZmQ1ZjAwLCAweDJkZmRlNjAwLCAweDJkZmU2ZDAwLCAweDJkZmVmNDAwLCAweDJkZmY3YjAwLCAweDJlMDAwMjAwLCAweDJlMDA4OTAwLCAweDJlMDExMDAwLAorICAgIDB4MmUwMTk3MDAsIDB4MmUwMjFlMDAsIDB4MmUwMmE1MDAsIDB4MmUwMzJjMDAsIDB4MmUwM2IzMDAsIDB4MmUwNDNhMDAsIDB4MmUwNGMxMDAsIDB4MmUwNTQ4MDAsIDB4MmUwNWNmMDAsIDB4MmUwNjU2MDAsIDB4MmUwNmRkMDAsIDB4MmUwNzY0MDAsIDB4MmUwN2ViMDAsIDB4MmUwODcyMDAsIDB4MmUwOGY5MDAsIDB4MmUwOTgwMDAsCisgICAgMHgyZTBhMDcwMCwgMHgyZTBhOGUwMCwgMHgyZTBiMTUwMCwgMHgyZTBiOWMwMCwgMHgyZTBjMjMwMCwgMHgyZTBjYWEwMCwgMHgyZTBkMzEwMCwgMHgyZTBkYjgwMCwgMHgyZTBlM2YwMCwgMHgyZTBlYzYwMCwgMHgyZTBmNGQwMCwgMHgyZTBmZDQwMCwgMHgyZTEwNWIwMCwgMHgyZTEwZTIwMCwgMHgyZTExNjkwMCwgMHgyZTExZjAwMCwKKyAgICAweDJlMTI3NzAwLCAweDJlMTJmZTAwLCAweDJlMTM4NTAwLCAweDJlMTQwYzAwLCAweDJlMTQ5MzAwLCAweDJlMTUxYTAwLCAweDJlMTVhMTAwLCAweDJlMTYyODAwLCAweDJlMTZhZjAwLCAweDJlMTczNjAwLCAweDJlMTdiZDAwLCAweDJlMTg0NDAwLCAweDJlMThjYjAwLCAweDJlMTk1MjAwLCAweDJlMTlkOTAwLCAweDJlMWE2MDAwLAorICAgIDB4MmUxYWU3MDAsIDB4MmUxYjZlMDAsIDB4MmUxYmY1MDAsIDB4MmUxYzdjMDAsIDB4MmUxZDAzMDAsIDB4MmUxZDhhMDAsIDB4MmUxZTExMDAsIDB4MmUxZTk4MDAsIDB4MmUxZjFmMDAsIDB4MmUxZmE2MDAsIDB4MmUyMDJkMDAsIDB4MmUyMGI0MDAsIDB4MmUyMTNiMDAsIDB4MmUyMWMyMDAsIDB4MmUyMjQ5MDAsIDB4MmUyMmQwMDAsCisgICAgMHgyZTIzNTcwMCwgMHgyZTIzZGUwMCwgMHgyZTI0NjUwMCwgMHgyZTI0ZWMwMCwgMHgyZTI1NzMwMCwgMHgyZTI1ZmEwMCwgMHgyZTI2ODEwMCwgMHgyZTI3MDgwMCwgMHgyZTI3OGYwMCwgMHgyZTI4MTYwMCwgMHgyZTI4OWQwMCwgMHgyZTI5MjQwMCwgMHgyZTI5YWIwMCwgMHgyZTJhMzIwMCwgMHgyZTJhYjkwMCwgMHgyZTJiNDAwMCwKKyAgICAweDJlMmJjNzAwLCAweDJlMmM0ZTAwLCAweDJlMmNkNTAwLCAweDJlMmQ1YzAwLCAweDJlMmRlMzAwLCAweDJlMmU2YTAwLCAweDJlMmVmMTAwLCAweDJlMmY3ODAwLCAweDJlMmZmZjAwLCAweDJlMzA4NjAwLCAweDJlMzEwZDAwLCAweDJlMzE5NDAwLCAweDJlMzIxYjAwLCAweDJlMzJhMjAwLCAweDJlMzMyOTAwLCAweDJlMzNiMDAwLAorICAgIDB4MmUzNDM3MDAsIDB4MmUzNGJlMDAsIDB4MmUzNTQ1MDAsIDB4MmUzNWNjMDAsIDB4MmUzNjUzMDAsIDB4MmUzNmRhMDAsIDB4MmUzNzYxMDAsIDB4MmUzN2U4MDAsIDB4MmUzODZmMDAsIDB4MmUzOGY2MDAsIDB4MmUzOTdkMDAsIDB4MmUzYTA0MDAsIDB4MmUzYThiMDAsIDB4MmUzYjEyMDAsIDB4MmUzYjk5MDAsIDB4MmUzYzIwMDAsCisgICAgMHgyZTNjYTcwMCwgMHgyZTNkMmUwMCwgMHgyZTNkYjUwMCwgMHgyZTNlM2MwMCwgMHgyZTNlYzMwMCwgMHgyZTNmNGEwMCwgMHgyZTNmZDEwMCwgMHgyZTQwNTgwMCwgMHgyZTQwZGYwMCwgMHgyZTQxNjYwMCwgMHgyZTQxZWQwMCwgMHgyZTQyNzQwMCwgMHgyZTQyZmIwMCwgMHgyZTQzODIwMCwgMHgyZTQ0MDkwMCwgMHgyZTQ0OTAwMCwKKyAgICAweDJlNDUxNzAwLCAweDJlNDU5ZTAwLCAweDJlNDYyNTAwLCAweDJlNDZhYzAwLCAweDJlNDczMzAwLCAweDJlNDdiYTAwLCAweDJlNDg0MTAwLCAweDJlNDhjODAwLCAweDJlNDk0ZjAwLCAweDJlNDlkNjAwLCAweDJlNGE1ZDAwLCAweDJlNGFlNDAwLCAweDJlNGI2YjAwLCAweDJlNGJmMjAwLCAweDJlNGM3OTAwLCAweDJlNGQwMDAwLAorICAgIDB4MmU0ZDg3MDAsIDB4MmU0ZTBlMDAsIDB4MmU0ZTk1MDAsIDB4MmU0ZjFjMDAsIDB4MmU0ZmEzMDAsIDB4MmU1MDJhMDAsIDB4MmU1MGIxMDAsIDB4MmU1MTM4MDAsIDB4MmU1MWJmMDAsIDB4MmU1MjQ2MDAsIDB4MmU1MmNkMDAsIDB4MmU1MzU0MDAsIDB4MmU1M2RiMDAsIDB4MmU1NDYyMDAsIDB4MmU1NGU5MDAsIDB4MmU1NTcwMDAsCisgICAgMHgyZTU1ZjcwMCwgMHgyZTU2N2UwMCwgMHgyZTU3MDUwMCwgMHgyZTU3OGMwMCwgMHgyZTU4MTMwMCwgMHgyZTU4OWEwMCwgMHgyZTU5MjEwMCwgMHgyZTU5YTgwMCwgMHgyZTVhMmYwMCwgMHgyZTVhYjYwMCwgMHgyZTViM2QwMCwgMHgyZTViYzQwMCwgMHgyZTVjNGIwMCwgMHgyZTVjZDIwMCwgMHgyZTVkNTkwMCwgMHgyZTVkZTAwMCwKKyAgICAweDJlNWU2NzAwLCAweDJlNWVlZTAwLCAweDJlNWY3NTAwLCAweDJlNWZmYzAwLCAweDJlNjA4MzAwLCAweDJlNjEwYTAwLCAweDJlNjE5MTAwLCAweDJlNjIxODAwLCAweDJlNjI5ZjAwLCAweDJlNjMyNjAwLCAweDJlNjNhZDAwLCAweDJlNjQzNDAwLCAweDJlNjRiYjAwLCAweDJlNjU0MjAwLCAweDJlNjVjOTAwLCAweDJlNjY1MDAwLAorICAgIDB4MmU2NmQ3MDAsIDB4MmU2NzVlMDAsIDB4MmU2N2U1MDAsIDB4MmU2ODZjMDAsIDB4MmU2OGYzMDAsIDB4MmU2OTdhMDAsIDB4MmU2YTAxMDAsIDB4MmU2YTg4MDAsIDB4MmU2YjBmMDAsIDB4MmU2Yjk2MDAsIDB4MmU2YzFkMDAsIDB4MmU2Y2E0MDAsIDB4MmU2ZDJiMDAsIDB4MmU2ZGIyMDAsIDB4MmU2ZTM5MDAsIDB4MmU2ZWMwMDAsCisgICAgMHgyZTZmNDcwMCwgMHgyZTZmY2UwMCwgMHgyZTcwNTUwMCwgMHgyZTcwZGMwMCwgMHgyZTcxNjMwMCwgMHgyZTcxZWEwMCwgMHgyZTcyNzEwMCwgMHgyZTcyZjgwMCwgMHgyZTczN2YwMCwgMHgyZTc0MDYwMCwgMHgyZTc0OGQwMCwgMHgyZTc1MTQwMCwgMHgyZTc1OWIwMCwgMHgyZTc2MjIwMCwgMHgyZTc2YTkwMCwgMHgyZTc3MzAwMCwKKyAgICAweDJlNzdiNzAwLCAweDJlNzgzZTAwLCAweDJlNzhjNTAwLCAweDJlNzk0YzAwLCAweDJlNzlkMzAwLCAweDJlN2E1YTAwLCAweDJlN2FlMTAwLCAweDJlN2I2ODAwLCAweDJlN2JlZjAwLCAweDJlN2M3NjAwLCAweDJlN2NmZDAwLCAweDJlN2Q4NDAwLCAweDJlN2UwYjAwLCAweDJlN2U5MjAwLCAweDJlN2YxOTAwLCAweDJlN2ZhMDAwLAorICAgIDB4MmU4MDI3MDAsIDB4MmU4MGFlMDAsIDB4MmU4MTM1MDAsIDB4MmU4MWJjMDAsIDB4MmU4MjQzMDAsIDB4MmU4MmNhMDAsIDB4MmU4MzUxMDAsIDB4MmU4M2Q4MDAsIDB4MmU4NDVmMDAsIDB4MmU4NGU2MDAsIDB4MmU4NTZkMDAsIDB4MmU4NWY0MDAsIDB4MmU4NjdiMDAsIDB4MmU4NzAyMDAsIDB4MmU4Nzg5MDAsIDB4MmU4ODEwMDAsCisgICAgMHgyZTg4OTcwMCwgMHgyZTg5MWUwMCwgMHgyZTg5YTUwMCwgMHgyZThhMmMwMCwgMHgyZThhYjMwMCwgMHgyZThiM2EwMCwgMHgyZThiYzEwMCwgMHgyZThjNDgwMCwgMHgyZThjY2YwMCwgMHgyZThkNTYwMCwgMHgyZThkZGQwMCwgMHgyZThlNjQwMCwgMHgyZThlZWIwMCwgMHgyZThmNzIwMCwgMHgyZThmZjkwMCwgMHgyZTkwODAwMCwKKyAgICAweDJlOTEwNzAwLCAweDJlOTE4ZTAwLCAweDJlOTIxNTAwLCAweDJlOTI5YzAwLCAweDJlOTMyMzAwLCAweDJlOTNhYTAwLCAweDJlOTQzMTAwLCAweDJlOTRiODAwLCAweDJlOTUzZjAwLCAweDJlOTVjNjAwLCAweDJlOTY0ZDAwLCAweDJlOTZkNDAwLCAweDJlOTc1YjAwLCAweDJlOTdlMjAwLCAweDJlOTg2OTAwLCAweDJlOThmMDAwLAorICAgIDB4MmU5OTc3MDAsIDB4MmU5OWZlMDAsIDB4MmU5YTg1MDAsIDB4MmU5YjBjMDAsIDB4MmU5YjkzMDAsIDB4MmU5YzFhMDAsIDB4MmU5Y2ExMDAsIDB4MmU5ZDI4MDAsIDB4MmU5ZGFmMDAsIDB4MmU5ZTM2MDAsIDB4MmU5ZWJkMDAsIDB4MmU5ZjQ0MDAsIDB4MmU5ZmNiMDAsIDB4MmVhMDUyMDAsIDB4MmVhMGQ5MDAsIDB4MmVhMTYwMDAsCisgICAgMHgyZWExZTcwMCwgMHgyZWEyNmUwMCwgMHgyZWEyZjUwMCwgMHgyZWEzN2MwMCwgMHgyZWE0MDMwMCwgMHgyZWE0OGEwMCwgMHgyZWE1MTEwMCwgMHgyZWE1OTgwMCwgMHgyZWE2MWYwMCwgMHgyZWE2YTYwMCwgMHgyZWE3MmQwMCwgMHgyZWE3YjQwMCwgMHgyZWE4M2IwMCwgMHgyZWE4YzIwMCwgMHgyZWE5NDkwMCwgMHgyZWE5ZDAwMCwKKyAgICAweDJlYWE1NzAwLCAweDJlYWFkZTAwLCAweDJlYWI2NTAwLCAweDJlYWJlYzAwLCAweDJlYWM3MzAwLCAweDJlYWNmYTAwLCAweDJlYWQ4MTAwLCAweDJlYWUwODAwLCAweDJlYWU4ZjAwLCAweDJlYWYxNjAwLCAweDJlYWY5ZDAwLCAweDJlYjAyNDAwLCAweDJlYjBhYjAwLCAweDJlYjEzMjAwLCAweDJlYjFiOTAwLCAweDJlYjI0MDAwLAorICAgIDB4MmViMmM3MDAsIDB4MmViMzRlMDAsIDB4MmViM2Q1MDAsIDB4MmViNDVjMDAsIDB4MmViNGUzMDAsIDB4MmViNTZhMDAsIDB4MmViNWYxMDAsIDB4MmViNjc4MDAsIDB4MmViNmZmMDAsIDB4MmViNzg2MDAsIDB4MmViODBkMDAsIDB4MmViODk0MDAsIDB4MmViOTFiMDAsIDB4MmViOWEyMDAsIDB4MmViYTI5MDAsIDB4MmViYWIwMDAsCisgICAgMHgyZWJiMzcwMCwgMHgyZWJiYmUwMCwgMHgyZWJjNDUwMCwgMHgyZWJjY2MwMCwgMHgyZWJkNTMwMCwgMHgyZWJkZGEwMCwgMHgyZWJlNjEwMCwgMHgyZWJlZTgwMCwgMHgyZWJmNmYwMCwgMHgyZWJmZjYwMCwgMHgyZWMwN2QwMCwgMHgyZWMxMDQwMCwgMHgyZWMxOGIwMCwgMHgyZWMyMTIwMCwgMHgyZWMyOTkwMCwgMHgyZWMzMjAwMCwKKyAgICAweDJlYzNhNzAwLCAweDJlYzQyZTAwLCAweDJlYzRiNTAwLCAweDJlYzUzYzAwLCAweDJlYzVjMzAwLCAweDJlYzY0YTAwLCAweDJlYzZkMTAwLCAweDJlYzc1ODAwLCAweDJlYzdkZjAwLCAweDJlYzg2NjAwLCAweDJlYzhlZDAwLCAweDJlYzk3NDAwLCAweDJlYzlmYjAwLCAweDJlY2E4MjAwLCAweDJlY2IwOTAwLCAweDJlY2I5MDAwLAorICAgIDB4MmVjYzE3MDAsIDB4MmVjYzllMDAsIDB4MmVjZDI1MDAsIDB4MmVjZGFjMDAsIDB4MmVjZTMzMDAsIDB4MmVjZWJhMDAsIDB4MmVjZjQxMDAsIDB4MmVjZmM4MDAsIDB4MmVkMDRmMDAsIDB4MmVkMGQ2MDAsIDB4MmVkMTVkMDAsIDB4MmVkMWU0MDAsIDB4MmVkMjZiMDAsIDB4MmVkMmYyMDAsIDB4MmVkMzc5MDAsIDB4MmVkNDAwMDAsCisgICAgMHgyZWQ0ODcwMCwgMHgyZWQ1MGUwMCwgMHgyZWQ1OTUwMCwgMHgyZWQ2MWMwMCwgMHgyZWQ2YTMwMCwgMHgyZWQ3MmEwMCwgMHgyZWQ3YjEwMCwgMHgyZWQ4MzgwMCwgMHgyZWQ4YmYwMCwgMHgyZWQ5NDYwMCwgMHgyZWQ5Y2QwMCwgMHgyZWRhNTQwMCwgMHgyZWRhZGIwMCwgMHgyZWRiNjIwMCwgMHgyZWRiZTkwMCwgMHgyZWRjNzAwMCwKKyAgICAweDJlZGNmNzAwLCAweDJlZGQ3ZTAwLCAweDJlZGUwNTAwLCAweDJlZGU4YzAwLCAweDJlZGYxMzAwLCAweDJlZGY5YTAwLCAweDJlZTAyMTAwLCAweDJlZTBhODAwLCAweDJlZTEyZjAwLCAweDJlZTFiNjAwLCAweDJlZTIzZDAwLCAweDJlZTJjNDAwLCAweDJlZTM0YjAwLCAweDJlZTNkMjAwLCAweDJlZTQ1OTAwLCAweDJlZTRlMDAwLAorICAgIDB4MmVlNTY3MDAsIDB4MmVlNWVlMDAsIDB4MmVlNjc1MDAsIDB4MmVlNmZjMDAsIDB4MmVlNzgzMDAsIDB4MmVlODBhMDAsIDB4MmVlODkxMDAsIDB4MmVlOTE4MDAsIDB4MmVlOTlmMDAsIDB4MmVlYTI2MDAsIDB4MmVlYWFkMDAsIDB4MmVlYjM0MDAsIDB4MmVlYmJiMDAsIDB4MmVlYzQyMDAsIDB4MmVlY2M5MDAsIDB4MmVlZDUwMDAsCisgICAgMHgyZWVkZDcwMCwgMHgyZWVlNWUwMCwgMHgyZWVlZTUwMCwgMHgyZWVmNmMwMCwgMHgyZWVmZjMwMCwgMHgyZWYwN2EwMCwgMHgyZWYxMDEwMCwgMHgyZWYxODgwMCwgMHgyZWYyMGYwMCwgMHgyZWYyOTYwMCwgMHgyZWYzMWQwMCwgMHgyZWYzYTQwMCwgMHgyZWY0MmIwMCwgMHgyZWY0YjIwMCwgMHgyZWY1MzkwMCwgMHgyZWY1YzAwMCwKKyAgICAweDJlZjY0NzAwLCAweDJlZjZjZTAwLCAweDJlZjc1NTAwLCAweDJlZjdkYzAwLCAweDJlZjg2MzAwLCAweDJlZjhlYTAwLCAweDJlZjk3MTAwLCAweDJlZjlmODAwLCAweDJlZmE3ZjAwLCAweDJlZmIwNjAwLCAweDJlZmI4ZDAwLCAweDJlZmMxNDAwLCAweDJlZmM5YjAwLCAweDJlZmQyMjAwLCAweDJlZmRhOTAwLCAweDJlZmUzMDAwLAorICAgIDB4MmVmZWI3MDAsIDB4MmVmZjNlMDAsIDB4MmVmZmM1MDAsIDB4MmYwMDRjMDAsIDB4MmYwMGQzMDAsIDB4MmYwMTVhMDAsIDB4MmYwMWUxMDAsIDB4MmYwMjY4MDAsIDB4MmYwMmVmMDAsIDB4MmYwMzc2MDAsIDB4MmYwM2ZkMDAsIDB4MmYwNDg0MDAsIDB4MmYwNTBiMDAsIDB4MmYwNTkyMDAsIDB4MmYwNjE5MDAsIDB4MmYwNmEwMDAsCisgICAgMHgyZjA3MjcwMCwgMHgyZjA3YWUwMCwgMHgyZjA4MzUwMCwgMHgyZjA4YmMwMCwgMHgyZjA5NDMwMCwgMHgyZjA5Y2EwMCwgMHgyZjBhNTEwMCwgMHgyZjBhZDgwMCwgMHgyZjBiNWYwMCwgMHgyZjBiZTYwMCwgMHgyZjBjNmQwMCwgMHgyZjBjZjQwMCwgMHgyZjBkN2IwMCwgMHgyZjBlMDIwMCwgMHgyZjBlODkwMCwgMHgyZjBmMTAwMCwKKyAgICAweDJmMGY5NzAwLCAweDJmMTAxZTAwLCAweDJmMTBhNTAwLCAweDJmMTEyYzAwLCAweDJmMTFiMzAwLCAweDJmMTIzYTAwLCAweDJmMTJjMTAwLCAweDJmMTM0ODAwLCAweDJmMTNjZjAwLCAweDJmMTQ1NjAwLCAweDJmMTRkZDAwLCAweDJmMTU2NDAwLCAweDJmMTVlYjAwLCAweDJmMTY3MjAwLCAweDJmMTZmOTAwLCAweDJmMTc4MDAwLAorICAgIDB4MmYxODA3MDAsIDB4MmYxODhlMDAsIDB4MmYxOTE1MDAsIDB4MmYxOTljMDAsIDB4MmYxYTIzMDAsIDB4MmYxYWFhMDAsIDB4MmYxYjMxMDAsIDB4MmYxYmI4MDAsIDB4MmYxYzNmMDAsIDB4MmYxY2M2MDAsIDB4MmYxZDRkMDAsIDB4MmYxZGQ0MDAsIDB4MmYxZTViMDAsIDB4MmYxZWUyMDAsIDB4MmYxZjY5MDAsIDB4MmYxZmYwMDAsCisgICAgMHgyZjIwNzcwMCwgMHgyZjIwZmUwMCwgMHgyZjIxODUwMCwgMHgyZjIyMGMwMCwgMHgyZjIyOTMwMCwgMHgyZjIzMWEwMCwgMHgyZjIzYTEwMCwgMHgyZjI0MjgwMCwgMHgyZjI0YWYwMCwgMHgyZjI1MzYwMCwgMHgyZjI1YmQwMCwgMHgyZjI2NDQwMCwgMHgyZjI2Y2IwMCwgMHgyZjI3NTIwMCwgMHgyZjI3ZDkwMCwgMHgyZjI4NjAwMCwKKyAgICAweDJmMjhlNzAwLCAweDJmMjk2ZTAwLCAweDJmMjlmNTAwLCAweDJmMmE3YzAwLCAweDJmMmIwMzAwLCAweDJmMmI4YTAwLCAweDJmMmMxMTAwLCAweDJmMmM5ODAwLCAweDJmMmQxZjAwLCAweDJmMmRhNjAwLCAweDJmMmUyZDAwLCAweDJmMmViNDAwLCAweDJmMmYzYjAwLCAweDJmMmZjMjAwLCAweDJmMzA0OTAwLCAweDJmMzBkMDAwLAorICAgIDB4MmYzMTU3MDAsIDB4MmYzMWRlMDAsIDB4MmYzMjY1MDAsIDB4MmYzMmVjMDAsIDB4MmYzMzczMDAsIDB4MmYzM2ZhMDAsIDB4MmYzNDgxMDAsIDB4MmYzNTA4MDAsIDB4MmYzNThmMDAsIDB4MmYzNjE2MDAsIDB4MmYzNjlkMDAsIDB4MmYzNzI0MDAsIDB4MmYzN2FiMDAsIDB4MmYzODMyMDAsIDB4MmYzOGI5MDAsIDB4MmYzOTQwMDAsCisgICAgMHgyZjM5YzcwMCwgMHgyZjNhNGUwMCwgMHgyZjNhZDUwMCwgMHgyZjNiNWMwMCwgMHgyZjNiZTMwMCwgMHgyZjNjNmEwMCwgMHgyZjNjZjEwMCwgMHgyZjNkNzgwMCwgMHgyZjNkZmYwMCwgMHgyZjNlODYwMCwgMHgyZjNmMGQwMCwgMHgyZjNmOTQwMCwgMHgyZjQwMWIwMCwgMHgyZjQwYTIwMCwgMHgyZjQxMjkwMCwgMHgyZjQxYjAwMCwKKyAgICAweDJmNDIzNzAwLCAweDJmNDJiZTAwLCAweDJmNDM0NTAwLCAweDJmNDNjYzAwLCAweDJmNDQ1MzAwLCAweDJmNDRkYTAwLCAweDJmNDU2MTAwLCAweDJmNDVlODAwLCAweDJmNDY2ZjAwLCAweDJmNDZmNjAwLCAweDJmNDc3ZDAwLCAweDJmNDgwNDAwLCAweDJmNDg4YjAwLCAweDJmNDkxMjAwLCAweDJmNDk5OTAwLCAweDJmNGEyMDAwLAorICAgIDB4MmY0YWE3MDAsIDB4MmY0YjJlMDAsIDB4MmY0YmI1MDAsIDB4MmY0YzNjMDAsIDB4MmY0Y2MzMDAsIDB4MmY0ZDRhMDAsIDB4MmY0ZGQxMDAsIDB4MmY0ZTU4MDAsIDB4MmY0ZWRmMDAsIDB4MmY0ZjY2MDAsIDB4MmY0ZmVkMDAsIDB4MmY1MDc0MDAsIDB4MmY1MGZiMDAsIDB4MmY1MTgyMDAsIDB4MmY1MjA5MDAsIDB4MmY1MjkwMDAsCisgICAgMHgyZjUzMTcwMCwgMHgyZjUzOWUwMCwgMHgyZjU0MjUwMCwgMHgyZjU0YWMwMCwgMHgyZjU1MzMwMCwgMHgyZjU1YmEwMCwgMHgyZjU2NDEwMCwgMHgyZjU2YzgwMCwgMHgyZjU3NGYwMCwgMHgyZjU3ZDYwMCwgMHgyZjU4NWQwMCwgMHgyZjU4ZTQwMCwgMHgyZjU5NmIwMCwgMHgyZjU5ZjIwMCwgMHgyZjVhNzkwMCwgMHgyZjViMDAwMCwKKyAgICAweDJmNWI4NzAwLCAweDJmNWMwZTAwLCAweDJmNWM5NTAwLCAweDJmNWQxYzAwLCAweDJmNWRhMzAwLCAweDJmNWUyYTAwLCAweDJmNWViMTAwLCAweDJmNWYzODAwLCAweDJmNWZiZjAwLCAweDJmNjA0NjAwLCAweDJmNjBjZDAwLCAweDJmNjE1NDAwLCAweDJmNjFkYjAwLCAweDJmNjI2MjAwLCAweDJmNjJlOTAwLCAweDJmNjM3MDAwLAorICAgIDB4MmY2M2Y3MDAsIDB4MmY2NDdlMDAsIDB4MmY2NTA1MDAsIDB4MmY2NThjMDAsIDB4MmY2NjEzMDAsIDB4MmY2NjlhMDAsIDB4MmY2NzIxMDAsIDB4MmY2N2E4MDAsIDB4MmY2ODJmMDAsIDB4MmY2OGI2MDAsIDB4MmY2OTNkMDAsIDB4MmY2OWM0MDAsIDB4MmY2YTRiMDAsIDB4MmY2YWQyMDAsIDB4MmY2YjU5MDAsIDB4MmY2YmUwMDAsCisgICAgMHgyZjZjNjcwMCwgMHgyZjZjZWUwMCwgMHgyZjZkNzUwMCwgMHgyZjZkZmMwMCwgMHgyZjZlODMwMCwgMHgyZjZmMGEwMCwgMHgyZjZmOTEwMCwgMHgyZjcwMTgwMCwgMHgyZjcwOWYwMCwgMHgyZjcxMjYwMCwgMHgyZjcxYWQwMCwgMHgyZjcyMzQwMCwgMHgyZjcyYmIwMCwgMHgyZjczNDIwMCwgMHgyZjczYzkwMCwgMHgyZjc0NTAwMCwKKyAgICAweDJmNzRkNzAwLCAweDJmNzU1ZTAwLCAweDJmNzVlNTAwLCAweDJmNzY2YzAwLCAweDJmNzZmMzAwLCAweDJmNzc3YTAwLCAweDJmNzgwMTAwLCAweDJmNzg4ODAwLCAweDJmNzkwZjAwLCAweDJmNzk5NjAwLCAweDJmN2ExZDAwLCAweDJmN2FhNDAwLCAweDJmN2IyYjAwLCAweDJmN2JiMjAwLCAweDJmN2MzOTAwLCAweDJmN2NjMDAwLAorICAgIDB4MmY3ZDQ3MDAsIDB4MmY3ZGNlMDAsIDB4MmY3ZTU1MDAsIDB4MmY3ZWRjMDAsIDB4MmY3ZjYzMDAsIDB4MmY3ZmVhMDAsIDB4MmY4MDcxMDAsIDB4MmY4MGY4MDAsIDB4MmY4MTdmMDAsIDB4MmY4MjA2MDAsIDB4MmY4MjhkMDAsIDB4MmY4MzE0MDAsIDB4MmY4MzliMDAsIDB4MmY4NDIyMDAsIDB4MmY4NGE5MDAsIDB4MmY4NTMwMDAsCisgICAgMHgyZjg1YjcwMCwgMHgyZjg2M2UwMCwgMHgyZjg2YzUwMCwgMHgyZjg3NGMwMCwgMHgyZjg3ZDMwMCwgMHgyZjg4NWEwMCwgMHgyZjg4ZTEwMCwgMHgyZjg5NjgwMCwgMHgyZjg5ZWYwMCwgMHgyZjhhNzYwMCwgMHgyZjhhZmQwMCwgMHgyZjhiODQwMCwgMHgyZjhjMGIwMCwgMHgyZjhjOTIwMCwgMHgyZjhkMTkwMCwgMHgyZjhkYTAwMCwKKyAgICAweDJmOGUyNzAwLCAweDJmOGVhZTAwLCAweDJmOGYzNTAwLCAweDJmOGZiYzAwLCAweDJmOTA0MzAwLCAweDJmOTBjYTAwLCAweDJmOTE1MTAwLCAweDJmOTFkODAwLCAweDJmOTI1ZjAwLCAweDJmOTJlNjAwLCAweDJmOTM2ZDAwLCAweDJmOTNmNDAwLCAweDJmOTQ3YjAwLCAweDJmOTUwMjAwLCAweDJmOTU4OTAwLCAweDJmOTYxMDAwLAorICAgIDB4MmY5Njk3MDAsIDB4MmY5NzFlMDAsIDB4MmY5N2E1MDAsIDB4MmY5ODJjMDAsIDB4MmY5OGIzMDAsIDB4MmY5OTNhMDAsIDB4MmY5OWMxMDAsIDB4MmY5YTQ4MDAsIDB4MmY5YWNmMDAsIDB4MmY5YjU2MDAsIDB4MmY5YmRkMDAsIDB4MmY5YzY0MDAsIDB4MmY5Y2ViMDAsIDB4MmY5ZDcyMDAsIDB4MmY5ZGY5MDAsIDB4MmY5ZTgwMDAsCisgICAgMHgyZjlmMDcwMCwgMHgyZjlmOGUwMCwgMHgyZmEwMTUwMCwgMHgyZmEwOWMwMCwgMHgyZmExMjMwMCwgMHgyZmExYWEwMCwgMHgyZmEyMzEwMCwgMHgyZmEyYjgwMCwgMHgyZmEzM2YwMCwgMHgyZmEzYzYwMCwgMHgyZmE0NGQwMCwgMHgyZmE0ZDQwMCwgMHgyZmE1NWIwMCwgMHgyZmE1ZTIwMCwgMHgyZmE2NjkwMCwgMHgyZmE2ZjAwMCwKKyAgICAweDJmYTc3NzAwLCAweDJmYTdmZTAwLCAweDJmYTg4NTAwLCAweDJmYTkwYzAwLCAweDJmYTk5MzAwLCAweDJmYWExYTAwLCAweDJmYWFhMTAwLCAweDJmYWIyODAwLCAweDJmYWJhZjAwLCAweDJmYWMzNjAwLCAweDJmYWNiZDAwLCAweDJmYWQ0NDAwLCAweDJmYWRjYjAwLCAweDJmYWU1MjAwLCAweDJmYWVkOTAwLCAweDJmYWY2MDAwLAorICAgIDB4MmZhZmU3MDAsIDB4MmZiMDZlMDAsIDB4MmZiMGY1MDAsIDB4MmZiMTdjMDAsIDB4MmZiMjAzMDAsIDB4MmZiMjhhMDAsIDB4MmZiMzExMDAsIDB4MmZiMzk4MDAsIDB4MmZiNDFmMDAsIDB4MmZiNGE2MDAsIDB4MmZiNTJkMDAsIDB4MmZiNWI0MDAsIDB4MmZiNjNiMDAsIDB4MmZiNmMyMDAsIDB4MmZiNzQ5MDAsIDB4MmZiN2QwMDAsCisgICAgMHgyZmI4NTcwMCwgMHgyZmI4ZGUwMCwgMHgyZmI5NjUwMCwgMHgyZmI5ZWMwMCwgMHgyZmJhNzMwMCwgMHgyZmJhZmEwMCwgMHgyZmJiODEwMCwgMHgyZmJjMDgwMCwgMHgyZmJjOGYwMCwgMHgyZmJkMTYwMCwgMHgyZmJkOWQwMCwgMHgyZmJlMjQwMCwgMHgyZmJlYWIwMCwgMHgyZmJmMzIwMCwgMHgyZmJmYjkwMCwgMHgyZmMwNDAwMCwKKyAgICAweDJmYzBjNzAwLCAweDJmYzE0ZTAwLCAweDJmYzFkNTAwLCAweDJmYzI1YzAwLCAweDJmYzJlMzAwLCAweDJmYzM2YTAwLCAweDJmYzNmMTAwLCAweDJmYzQ3ODAwLCAweDJmYzRmZjAwLCAweDJmYzU4NjAwLCAweDJmYzYwZDAwLCAweDJmYzY5NDAwLCAweDJmYzcxYjAwLCAweDJmYzdhMjAwLCAweDJmYzgyOTAwLCAweDJmYzhiMDAwLAorICAgIDB4MmZjOTM3MDAsIDB4MmZjOWJlMDAsIDB4MmZjYTQ1MDAsIDB4MmZjYWNjMDAsIDB4MmZjYjUzMDAsIDB4MmZjYmRhMDAsIDB4MmZjYzYxMDAsIDB4MmZjY2U4MDAsIDB4MmZjZDZmMDAsIDB4MmZjZGY2MDAsIDB4MmZjZTdkMDAsIDB4MmZjZjA0MDAsIDB4MmZjZjhiMDAsIDB4MmZkMDEyMDAsIDB4MmZkMDk5MDAsIDB4MmZkMTIwMDAsCisgICAgMHgyZmQxYTcwMCwgMHgyZmQyMmUwMCwgMHgyZmQyYjUwMCwgMHgyZmQzM2MwMCwgMHgyZmQzYzMwMCwgMHgyZmQ0NGEwMCwgMHgyZmQ0ZDEwMCwgMHgyZmQ1NTgwMCwgMHgyZmQ1ZGYwMCwgMHgyZmQ2NjYwMCwgMHgyZmQ2ZWQwMCwgMHgyZmQ3NzQwMCwgMHgyZmQ3ZmIwMCwgMHgyZmQ4ODIwMCwgMHgyZmQ5MDkwMCwgMHgyZmQ5OTAwMCwKKyAgICAweDJmZGExNzAwLCAweDJmZGE5ZTAwLCAweDJmZGIyNTAwLCAweDJmZGJhYzAwLCAweDJmZGMzMzAwLCAweDJmZGNiYTAwLCAweDJmZGQ0MTAwLCAweDJmZGRjODAwLCAweDJmZGU0ZjAwLCAweDJmZGVkNjAwLCAweDJmZGY1ZDAwLCAweDJmZGZlNDAwLCAweDJmZTA2YjAwLCAweDJmZTBmMjAwLCAweDJmZTE3OTAwLCAweDJmZTIwMDAwLAorICAgIDB4MmZlMjk2MDAsIDB4MmZlMzJjMDAsIDB4MmZlM2MyMDAsIDB4MmZlNDU4MDAsIDB4MmZlNGVlMDAsIDB4MmZlNTg0MDAsIDB4MmZlNjFhMDAsIDB4MmZlNmIwMDAsIDB4MmZlNzQ2MDAsIDB4MmZlN2RjMDAsIDB4MmZlODcyMDAsIDB4MmZlOTA4MDAsIDB4MmZlOTllMDAsIDB4MmZlYTM0MDAsIDB4MmZlYWNhMDAsIDB4MmZlYjYwMDAsCisgICAgMHgyZmViZjYwMCwgMHgyZmVjOGMwMCwgMHgyZmVkMjIwMCwgMHgyZmVkYjgwMCwgMHgyZmVlNGUwMCwgMHgyZmVlZTQwMCwgMHgyZmVmN2EwMCwgMHgyZmYwMTAwMCwgMHgyZmYwYTYwMCwgMHgyZmYxM2MwMCwgMHgyZmYxZDIwMCwgMHgyZmYyNjgwMCwgMHgyZmYyZmUwMCwgMHgyZmYzOTQwMCwgMHgyZmY0MmEwMCwgMHgyZmY0YzAwMCwKKyAgICAweDJmZjU1NjAwLCAweDJmZjVlYzAwLCAweDJmZjY4MjAwLCAweDJmZjcxODAwLCAweDJmZjdhZTAwLCAweDJmZjg0NDAwLCAweDJmZjhkYTAwLCAweDJmZjk3MDAwLCAweDJmZmEwNjAwLCAweDJmZmE5YzAwLCAweDJmZmIzMjAwLCAweDJmZmJjODAwLCAweDJmZmM1ZTAwLCAweDJmZmNmNDAwLCAweDJmZmQ4YTAwLCAweDJmZmUyMDAwLAorICAgIDB4MmZmZWI2MDAsIDB4MmZmZjRjMDAsIDB4MmZmZmUyMDAsIDB4MzAwMDc4MDAsIDB4MzAwMTBlMDAsIDB4MzAwMWE0MDAsIDB4MzAwMjNhMDAsIDB4MzAwMmQwMDAsIDB4MzAwMzY2MDAsIDB4MzAwM2ZjMDAsIDB4MzAwNDkyMDAsIDB4MzAwNTI4MDAsIDB4MzAwNWJlMDAsIDB4MzAwNjU0MDAsIDB4MzAwNmVhMDAsIDB4MzAwNzgwMDAsCisgICAgMHgzMDA4MTYwMCwgMHgzMDA4YWMwMCwgMHgzMDA5NDIwMCwgMHgzMDA5ZDgwMCwgMHgzMDBhNmUwMCwgMHgzMDBiMDQwMCwgMHgzMDBiOWEwMCwgMHgzMDBjMzAwMCwgMHgzMDBjYzYwMCwgMHgzMDBkNWMwMCwgMHgzMDBkZjIwMCwgMHgzMDBlODgwMCwgMHgzMDBmMWUwMCwgMHgzMDBmYjQwMCwgMHgzMDEwNGEwMCwgMHgzMDEwZTAwMCwKKyAgICAweDMwMTE3NjAwLCAweDMwMTIwYzAwLCAweDMwMTJhMjAwLCAweDMwMTMzODAwLCAweDMwMTNjZTAwLCAweDMwMTQ2NDAwLCAweDMwMTRmYTAwLCAweDMwMTU5MDAwLCAweDMwMTYyNjAwLCAweDMwMTZiYzAwLCAweDMwMTc1MjAwLCAweDMwMTdlODAwLCAweDMwMTg3ZTAwLCAweDMwMTkxNDAwLCAweDMwMTlhYTAwLCAweDMwMWE0MDAwLAorICAgIDB4MzAxYWQ2MDAsIDB4MzAxYjZjMDAsIDB4MzAxYzAyMDAsIDB4MzAxYzk4MDAsIDB4MzAxZDJlMDAsIDB4MzAxZGM0MDAsIDB4MzAxZTVhMDAsIDB4MzAxZWYwMDAsIDB4MzAxZjg2MDAsIDB4MzAyMDFjMDAsIDB4MzAyMGIyMDAsIDB4MzAyMTQ4MDAsIDB4MzAyMWRlMDAsIDB4MzAyMjc0MDAsIDB4MzAyMzBhMDAsIDB4MzAyM2EwMDAsCisgICAgMHgzMDI0MzYwMCwgMHgzMDI0Y2MwMCwgMHgzMDI1NjIwMCwgMHgzMDI1ZjgwMCwgMHgzMDI2OGUwMCwgMHgzMDI3MjQwMCwgMHgzMDI3YmEwMCwgMHgzMDI4NTAwMCwgMHgzMDI4ZTYwMCwgMHgzMDI5N2MwMCwgMHgzMDJhMTIwMCwgMHgzMDJhYTgwMCwgMHgzMDJiM2UwMCwgMHgzMDJiZDQwMCwgMHgzMDJjNmEwMCwgMHgzMDJkMDAwMCwKKyAgICAweDMwMmQ5NjAwLCAweDMwMmUyYzAwLCAweDMwMmVjMjAwLCAweDMwMmY1ODAwLCAweDMwMmZlZTAwLCAweDMwMzA4NDAwLCAweDMwMzExYTAwLCAweDMwMzFiMDAwLCAweDMwMzI0NjAwLCAweDMwMzJkYzAwLCAweDMwMzM3MjAwLCAweDMwMzQwODAwLCAweDMwMzQ5ZTAwLCAweDMwMzUzNDAwLCAweDMwMzVjYTAwLCAweDMwMzY2MDAwLAorICAgIDB4MzAzNmY2MDAsIDB4MzAzNzhjMDAsIDB4MzAzODIyMDAsIDB4MzAzOGI4MDAsIDB4MzAzOTRlMDAsIDB4MzAzOWU0MDAsIDB4MzAzYTdhMDAsIDB4MzAzYjEwMDAsIDB4MzAzYmE2MDAsIDB4MzAzYzNjMDAsIDB4MzAzY2QyMDAsIDB4MzAzZDY4MDAsIDB4MzAzZGZlMDAsIDB4MzAzZTk0MDAsIDB4MzAzZjJhMDAsIDB4MzAzZmMwMDAsCisgICAgMHgzMDQwNTYwMCwgMHgzMDQwZWMwMCwgMHgzMDQxODIwMCwgMHgzMDQyMTgwMCwgMHgzMDQyYWUwMCwgMHgzMDQzNDQwMCwgMHgzMDQzZGEwMCwgMHgzMDQ0NzAwMCwgMHgzMDQ1MDYwMCwgMHgzMDQ1OWMwMCwgMHgzMDQ2MzIwMCwgMHgzMDQ2YzgwMCwgMHgzMDQ3NWUwMCwgMHgzMDQ3ZjQwMCwgMHgzMDQ4OGEwMCwgMHgzMDQ5MjAwMCwKKyAgICAweDMwNDliNjAwLCAweDMwNGE0YzAwLCAweDMwNGFlMjAwLCAweDMwNGI3ODAwLCAweDMwNGMwZTAwLCAweDMwNGNhNDAwLCAweDMwNGQzYTAwLCAweDMwNGRkMDAwLCAweDMwNGU2NjAwLCAweDMwNGVmYzAwLCAweDMwNGY5MjAwLCAweDMwNTAyODAwLCAweDMwNTBiZTAwLCAweDMwNTE1NDAwLCAweDMwNTFlYTAwLCAweDMwNTI4MDAwLAorICAgIDB4MzA1MzE2MDAsIDB4MzA1M2FjMDAsIDB4MzA1NDQyMDAsIDB4MzA1NGQ4MDAsIDB4MzA1NTZlMDAsIDB4MzA1NjA0MDAsIDB4MzA1NjlhMDAsIDB4MzA1NzMwMDAsIDB4MzA1N2M2MDAsIDB4MzA1ODVjMDAsIDB4MzA1OGYyMDAsIDB4MzA1OTg4MDAsIDB4MzA1YTFlMDAsIDB4MzA1YWI0MDAsIDB4MzA1YjRhMDAsIDB4MzA1YmUwMDAsCisgICAgMHgzMDVjNzYwMCwgMHgzMDVkMGMwMCwgMHgzMDVkYTIwMCwgMHgzMDVlMzgwMCwgMHgzMDVlY2UwMCwgMHgzMDVmNjQwMCwgMHgzMDVmZmEwMCwgMHgzMDYwOTAwMCwgMHgzMDYxMjYwMCwgMHgzMDYxYmMwMCwgMHgzMDYyNTIwMCwgMHgzMDYyZTgwMCwgMHgzMDYzN2UwMCwgMHgzMDY0MTQwMCwgMHgzMDY0YWEwMCwgMHgzMDY1NDAwMCwKKyAgICAweDMwNjVkNjAwLCAweDMwNjY2YzAwLCAweDMwNjcwMjAwLCAweDMwNjc5ODAwLCAweDMwNjgyZTAwLCAweDMwNjhjNDAwLCAweDMwNjk1YTAwLCAweDMwNjlmMDAwLCAweDMwNmE4NjAwLCAweDMwNmIxYzAwLCAweDMwNmJiMjAwLCAweDMwNmM0ODAwLCAweDMwNmNkZTAwLCAweDMwNmQ3NDAwLCAweDMwNmUwYTAwLCAweDMwNmVhMDAwLAorICAgIDB4MzA2ZjM2MDAsIDB4MzA2ZmNjMDAsIDB4MzA3MDYyMDAsIDB4MzA3MGY4MDAsIDB4MzA3MThlMDAsIDB4MzA3MjI0MDAsIDB4MzA3MmJhMDAsIDB4MzA3MzUwMDAsIDB4MzA3M2U2MDAsIDB4MzA3NDdjMDAsIDB4MzA3NTEyMDAsIDB4MzA3NWE4MDAsIDB4MzA3NjNlMDAsIDB4MzA3NmQ0MDAsIDB4MzA3NzZhMDAsIDB4MzA3ODAwMDAsCisgICAgMHgzMDc4OTYwMCwgMHgzMDc5MmMwMCwgMHgzMDc5YzIwMCwgMHgzMDdhNTgwMCwgMHgzMDdhZWUwMCwgMHgzMDdiODQwMCwgMHgzMDdjMWEwMCwgMHgzMDdjYjAwMCwgMHgzMDdkNDYwMCwgMHgzMDdkZGMwMCwgMHgzMDdlNzIwMCwgMHgzMDdmMDgwMCwgMHgzMDdmOWUwMCwgMHgzMDgwMzQwMCwgMHgzMDgwY2EwMCwgMHgzMDgxNjAwMCwKKyAgICAweDMwODFmNjAwLCAweDMwODI4YzAwLCAweDMwODMyMjAwLCAweDMwODNiODAwLCAweDMwODQ0ZTAwLCAweDMwODRlNDAwLCAweDMwODU3YTAwLCAweDMwODYxMDAwLCAweDMwODZhNjAwLCAweDMwODczYzAwLCAweDMwODdkMjAwLCAweDMwODg2ODAwLCAweDMwODhmZTAwLCAweDMwODk5NDAwLCAweDMwOGEyYTAwLCAweDMwOGFjMDAwLAorICAgIDB4MzA4YjU2MDAsIDB4MzA4YmVjMDAsIDB4MzA4YzgyMDAsIDB4MzA4ZDE4MDAsIDB4MzA4ZGFlMDAsIDB4MzA4ZTQ0MDAsIDB4MzA4ZWRhMDAsIDB4MzA4ZjcwMDAsIDB4MzA5MDA2MDAsIDB4MzA5MDljMDAsIDB4MzA5MTMyMDAsIDB4MzA5MWM4MDAsIDB4MzA5MjVlMDAsIDB4MzA5MmY0MDAsIDB4MzA5MzhhMDAsIDB4MzA5NDIwMDAsCisgICAgMHgzMDk0YjYwMCwgMHgzMDk1NGMwMCwgMHgzMDk1ZTIwMCwgMHgzMDk2NzgwMCwgMHgzMDk3MGUwMCwgMHgzMDk3YTQwMCwgMHgzMDk4M2EwMCwgMHgzMDk4ZDAwMCwgMHgzMDk5NjYwMCwgMHgzMDk5ZmMwMCwgMHgzMDlhOTIwMCwgMHgzMDliMjgwMCwgMHgzMDliYmUwMCwgMHgzMDljNTQwMCwgMHgzMDljZWEwMCwgMHgzMDlkODAwMCwKKyAgICAweDMwOWUxNjAwLCAweDMwOWVhYzAwLCAweDMwOWY0MjAwLCAweDMwOWZkODAwLCAweDMwYTA2ZTAwLCAweDMwYTEwNDAwLCAweDMwYTE5YTAwLCAweDMwYTIzMDAwLCAweDMwYTJjNjAwLCAweDMwYTM1YzAwLCAweDMwYTNmMjAwLCAweDMwYTQ4ODAwLCAweDMwYTUxZTAwLCAweDMwYTViNDAwLCAweDMwYTY0YTAwLCAweDMwYTZlMDAwLAorICAgIDB4MzBhNzc2MDAsIDB4MzBhODBjMDAsIDB4MzBhOGEyMDAsIDB4MzBhOTM4MDAsIDB4MzBhOWNlMDAsIDB4MzBhYTY0MDAsIDB4MzBhYWZhMDAsIDB4MzBhYjkwMDAsIDB4MzBhYzI2MDAsIDB4MzBhY2JjMDAsIDB4MzBhZDUyMDAsIDB4MzBhZGU4MDAsIDB4MzBhZTdlMDAsIDB4MzBhZjE0MDAsIDB4MzBhZmFhMDAsIDB4MzBiMDQwMDAsCisgICAgMHgzMGIwZDYwMCwgMHgzMGIxNmMwMCwgMHgzMGIyMDIwMCwgMHgzMGIyOTgwMCwgMHgzMGIzMmUwMCwgMHgzMGIzYzQwMCwgMHgzMGI0NWEwMCwgMHgzMGI0ZjAwMCwgMHgzMGI1ODYwMCwgMHgzMGI2MWMwMCwgMHgzMGI2YjIwMCwgMHgzMGI3NDgwMCwgMHgzMGI3ZGUwMCwgMHgzMGI4NzQwMCwgMHgzMGI5MGEwMCwgMHgzMGI5YTAwMCwKKyAgICAweDMwYmEzNjAwLCAweDMwYmFjYzAwLCAweDMwYmI2MjAwLCAweDMwYmJmODAwLCAweDMwYmM4ZTAwLCAweDMwYmQyNDAwLCAweDMwYmRiYTAwLCAweDMwYmU1MDAwLCAweDMwYmVlNjAwLCAweDMwYmY3YzAwLCAweDMwYzAxMjAwLCAweDMwYzBhODAwLCAweDMwYzEzZTAwLCAweDMwYzFkNDAwLCAweDMwYzI2YTAwLCAweDMwYzMwMDAwLAorICAgIDB4MzBjMzk2MDAsIDB4MzBjNDJjMDAsIDB4MzBjNGMyMDAsIDB4MzBjNTU4MDAsIDB4MzBjNWVlMDAsIDB4MzBjNjg0MDAsIDB4MzBjNzFhMDAsIDB4MzBjN2IwMDAsIDB4MzBjODQ2MDAsIDB4MzBjOGRjMDAsIDB4MzBjOTcyMDAsIDB4MzBjYTA4MDAsIDB4MzBjYTllMDAsIDB4MzBjYjM0MDAsIDB4MzBjYmNhMDAsIDB4MzBjYzYwMDAsCisgICAgMHgzMGNjZjYwMCwgMHgzMGNkOGMwMCwgMHgzMGNlMjIwMCwgMHgzMGNlYjgwMCwgMHgzMGNmNGUwMCwgMHgzMGNmZTQwMCwgMHgzMGQwN2EwMCwgMHgzMGQxMTAwMCwgMHgzMGQxYTYwMCwgMHgzMGQyM2MwMCwgMHgzMGQyZDIwMCwgMHgzMGQzNjgwMCwgMHgzMGQzZmUwMCwgMHgzMGQ0OTQwMCwgMHgzMGQ1MmEwMCwgMHgzMGQ1YzAwMCwKKyAgICAweDMwZDY1NjAwLCAweDMwZDZlYzAwLCAweDMwZDc4MjAwLCAweDMwZDgxODAwLCAweDMwZDhhZTAwLCAweDMwZDk0NDAwLCAweDMwZDlkYTAwLCAweDMwZGE3MDAwLCAweDMwZGIwNjAwLCAweDMwZGI5YzAwLCAweDMwZGMzMjAwLCAweDMwZGNjODAwLCAweDMwZGQ1ZTAwLCAweDMwZGRmNDAwLCAweDMwZGU4YTAwLCAweDMwZGYyMDAwLAorICAgIDB4MzBkZmI2MDAsIDB4MzBlMDRjMDAsIDB4MzBlMGUyMDAsIDB4MzBlMTc4MDAsIDB4MzBlMjBlMDAsIDB4MzBlMmE0MDAsIDB4MzBlMzNhMDAsIDB4MzBlM2QwMDAsIDB4MzBlNDY2MDAsIDB4MzBlNGZjMDAsIDB4MzBlNTkyMDAsIDB4MzBlNjI4MDAsIDB4MzBlNmJlMDAsIDB4MzBlNzU0MDAsIDB4MzBlN2VhMDAsIDB4MzBlODgwMDAsCisgICAgMHgzMGU5MTYwMCwgMHgzMGU5YWMwMCwgMHgzMGVhNDIwMCwgMHgzMGVhZDgwMCwgMHgzMGViNmUwMCwgMHgzMGVjMDQwMCwgMHgzMGVjOWEwMCwgMHgzMGVkMzAwMCwgMHgzMGVkYzYwMCwgMHgzMGVlNWMwMCwgMHgzMGVlZjIwMCwgMHgzMGVmODgwMCwgMHgzMGYwMWUwMCwgMHgzMGYwYjQwMCwgMHgzMGYxNGEwMCwgMHgzMGYxZTAwMCwKKyAgICAweDMwZjI3NjAwLCAweDMwZjMwYzAwLCAweDMwZjNhMjAwLCAweDMwZjQzODAwLCAweDMwZjRjZTAwLCAweDMwZjU2NDAwLCAweDMwZjVmYTAwLCAweDMwZjY5MDAwLCAweDMwZjcyNjAwLCAweDMwZjdiYzAwLCAweDMwZjg1MjAwLCAweDMwZjhlODAwLCAweDMwZjk3ZTAwLCAweDMwZmExNDAwLCAweDMwZmFhYTAwLCAweDMwZmI0MDAwLAorICAgIDB4MzBmYmQ2MDAsIDB4MzBmYzZjMDAsIDB4MzBmZDAyMDAsIDB4MzBmZDk4MDAsIDB4MzBmZTJlMDAsIDB4MzBmZWM0MDAsIDB4MzBmZjVhMDAsIDB4MzBmZmYwMDAsIDB4MzEwMDg2MDAsIDB4MzEwMTFjMDAsIDB4MzEwMWIyMDAsIDB4MzEwMjQ4MDAsIDB4MzEwMmRlMDAsIDB4MzEwMzc0MDAsIDB4MzEwNDBhMDAsIDB4MzEwNGEwMDAsCisgICAgMHgzMTA1MzYwMCwgMHgzMTA1Y2MwMCwgMHgzMTA2NjIwMCwgMHgzMTA2ZjgwMCwgMHgzMTA3OGUwMCwgMHgzMTA4MjQwMCwgMHgzMTA4YmEwMCwgMHgzMTA5NTAwMCwgMHgzMTA5ZTYwMCwgMHgzMTBhN2MwMCwgMHgzMTBiMTIwMCwgMHgzMTBiYTgwMCwgMHgzMTBjM2UwMCwgMHgzMTBjZDQwMCwgMHgzMTBkNmEwMCwgMHgzMTBlMDAwMCwKKyAgICAweDMxMGU5NjAwLCAweDMxMGYyYzAwLCAweDMxMGZjMjAwLCAweDMxMTA1ODAwLCAweDMxMTBlZTAwLCAweDMxMTE4NDAwLCAweDMxMTIxYTAwLCAweDMxMTJiMDAwLCAweDMxMTM0NjAwLCAweDMxMTNkYzAwLCAweDMxMTQ3MjAwLCAweDMxMTUwODAwLCAweDMxMTU5ZTAwLCAweDMxMTYzNDAwLCAweDMxMTZjYTAwLCAweDMxMTc2MDAwLAorICAgIDB4MzExN2Y2MDAsIDB4MzExODhjMDAsIDB4MzExOTIyMDAsIDB4MzExOWI4MDAsIDB4MzExYTRlMDAsIDB4MzExYWU0MDAsIDB4MzExYjdhMDAsIDB4MzExYzEwMDAsIDB4MzExY2E2MDAsIDB4MzExZDNjMDAsIDB4MzExZGQyMDAsIDB4MzExZTY4MDAsIDB4MzExZWZlMDAsIDB4MzExZjk0MDAsIDB4MzEyMDJhMDAsIDB4MzEyMGMwMDAsCisgICAgMHgzMTIxNTYwMCwgMHgzMTIxZWMwMCwgMHgzMTIyODIwMCwgMHgzMTIzMTgwMCwgMHgzMTIzYWUwMCwgMHgzMTI0NDQwMCwgMHgzMTI0ZGEwMCwgMHgzMTI1NzAwMCwgMHgzMTI2MDYwMCwgMHgzMTI2OWMwMCwgMHgzMTI3MzIwMCwgMHgzMTI3YzgwMCwgMHgzMTI4NWUwMCwgMHgzMTI4ZjQwMCwgMHgzMTI5OGEwMCwgMHgzMTJhMjAwMCwKKyAgICAweDMxMmFiNjAwLCAweDMxMmI0YzAwLCAweDMxMmJlMjAwLCAweDMxMmM3ODAwLCAweDMxMmQwZTAwLCAweDMxMmRhNDAwLCAweDMxMmUzYTAwLCAweDMxMmVkMDAwLCAweDMxMmY2NjAwLCAweDMxMmZmYzAwLCAweDMxMzA5MjAwLCAweDMxMzEyODAwLCAweDMxMzFiZTAwLCAweDMxMzI1NDAwLCAweDMxMzJlYTAwLCAweDMxMzM4MDAwLAorICAgIDB4MzEzNDE2MDAsIDB4MzEzNGFjMDAsIDB4MzEzNTQyMDAsIDB4MzEzNWQ4MDAsIDB4MzEzNjZlMDAsIDB4MzEzNzA0MDAsIDB4MzEzNzlhMDAsIDB4MzEzODMwMDAsIDB4MzEzOGM2MDAsIDB4MzEzOTVjMDAsIDB4MzEzOWYyMDAsIDB4MzEzYTg4MDAsIDB4MzEzYjFlMDAsIDB4MzEzYmI0MDAsIDB4MzEzYzRhMDAsIDB4MzEzY2UwMDAsCisgICAgMHgzMTNkNzYwMCwgMHgzMTNlMGMwMCwgMHgzMTNlYTIwMCwgMHgzMTNmMzgwMCwgMHgzMTNmY2UwMCwgMHgzMTQwNjMwMCwgMHgzMTQwZjkwMCwgMHgzMTQxOGYwMCwgMHgzMTQyMjUwMCwgMHgzMTQyYmIwMCwgMHgzMTQzNTEwMCwgMHgzMTQzZTcwMCwgMHgzMTQ0N2QwMCwgMHgzMTQ1MTMwMCwgMHgzMTQ1YTkwMCwgMHgzMTQ2M2YwMCwKKyAgICAweDMxNDZkNTAwLCAweDMxNDc2YjAwLCAweDMxNDgwMTAwLCAweDMxNDg5NzAwLCAweDMxNDkyZDAwLCAweDMxNDljMzAwLCAweDMxNGE1OTAwLCAweDMxNGFlZjAwLCAweDMxNGI4NTAwLCAweDMxNGMxYjAwLCAweDMxNGNiMTAwLCAweDMxNGQ0NzAwLCAweDMxNGRkZDAwLCAweDMxNGU3MzAwLCAweDMxNGYwOTAwLCAweDMxNGY5ZjAwLAorICAgIDB4MzE1MDM1MDAsIDB4MzE1MGNiMDAsIDB4MzE1MTYxMDAsIDB4MzE1MWY3MDAsIDB4MzE1MjhkMDAsIDB4MzE1MzIzMDAsIDB4MzE1M2I5MDAsIDB4MzE1NDRmMDAsIDB4MzE1NGU1MDAsIDB4MzE1NTdiMDAsIDB4MzE1NjExMDAsIDB4MzE1NmE3MDAsIDB4MzE1NzNkMDAsIDB4MzE1N2QzMDAsIDB4MzE1ODY5MDAsIDB4MzE1OGZmMDAsCisgICAgMHgzMTU5OTUwMCwgMHgzMTVhMmIwMCwgMHgzMTVhYzEwMCwgMHgzMTViNTcwMCwgMHgzMTViZWQwMCwgMHgzMTVjODMwMCwgMHgzMTVkMTkwMCwgMHgzMTVkYWYwMCwgMHgzMTVlNDUwMCwgMHgzMTVlZGIwMCwgMHgzMTVmNzEwMCwgMHgzMTYwMDcwMCwgMHgzMTYwOWQwMCwgMHgzMTYxMzMwMCwgMHgzMTYxYzkwMCwgMHgzMTYyNWYwMCwKKyAgICAweDMxNjJmNTAwLCAweDMxNjM4YjAwLCAweDMxNjQyMTAwLCAweDMxNjRiNzAwLCAweDMxNjU0ZDAwLCAweDMxNjVlMzAwLCAweDMxNjY3OTAwLCAweDMxNjcwZjAwLCAweDMxNjdhNTAwLCAweDMxNjgzYjAwLCAweDMxNjhkMTAwLCAweDMxNjk2NzAwLCAweDMxNjlmZDAwLCAweDMxNmE5MzAwLCAweDMxNmIyOTAwLCAweDMxNmJiZjAwLAorICAgIDB4MzE2YzU1MDAsIDB4MzE2Y2ViMDAsIDB4MzE2ZDgxMDAsIDB4MzE2ZTE3MDAsIDB4MzE2ZWFkMDAsIDB4MzE2ZjQzMDAsIDB4MzE2ZmQ5MDAsIDB4MzE3MDZmMDAsIDB4MzE3MTA1MDAsIDB4MzE3MTliMDAsIDB4MzE3MjMxMDAsIDB4MzE3MmM3MDAsIDB4MzE3MzVkMDAsIDB4MzE3M2YzMDAsIDB4MzE3NDg5MDAsIDB4MzE3NTFmMDAsCisgICAgMHgzMTc1YjUwMCwgMHgzMTc2NGIwMCwgMHgzMTc2ZTEwMCwgMHgzMTc3NzcwMCwgMHgzMTc4MGQwMCwgMHgzMTc4YTMwMCwgMHgzMTc5MzkwMCwgMHgzMTc5Y2YwMCwgMHgzMTdhNjUwMCwgMHgzMTdhZmIwMCwgMHgzMTdiOTEwMCwgMHgzMTdjMjcwMCwgMHgzMTdjYmQwMCwgMHgzMTdkNTMwMCwgMHgzMTdkZTkwMCwgMHgzMTdlN2YwMCwKKyAgICAweDMxN2YxNTAwLCAweDMxN2ZhYjAwLCAweDMxODA0MTAwLCAweDMxODBkNzAwLCAweDMxODE2ZDAwLCAweDMxODIwMzAwLCAweDMxODI5OTAwLCAweDMxODMyZjAwLCAweDMxODNjNTAwLCAweDMxODQ1YjAwLCAweDMxODRmMTAwLCAweDMxODU4NzAwLCAweDMxODYxZDAwLCAweDMxODZiMzAwLCAweDMxODc0OTAwLCAweDMxODdkZjAwLAorICAgIDB4MzE4ODc1MDAsIDB4MzE4OTBiMDAsIDB4MzE4OWExMDAsIDB4MzE4YTM3MDAsIDB4MzE4YWNkMDAsIDB4MzE4YjYzMDAsIDB4MzE4YmY5MDAsIDB4MzE4YzhmMDAsIDB4MzE4ZDI1MDAsIDB4MzE4ZGJiMDAsIDB4MzE4ZTUxMDAsIDB4MzE4ZWU3MDAsIDB4MzE4ZjdkMDAsIDB4MzE5MDEzMDAsIDB4MzE5MGE5MDAsIDB4MzE5MTNmMDAsCisgICAgMHgzMTkxZDUwMCwgMHgzMTkyNmIwMCwgMHgzMTkzMDEwMCwgMHgzMTkzOTcwMCwgMHgzMTk0MmQwMCwgMHgzMTk0YzMwMCwgMHgzMTk1NTkwMCwgMHgzMTk1ZWYwMCwgMHgzMTk2ODUwMCwgMHgzMTk3MWIwMCwgMHgzMTk3YjEwMCwgMHgzMTk4NDcwMCwgMHgzMTk4ZGQwMCwgMHgzMTk5NzMwMCwgMHgzMTlhMDkwMCwgMHgzMTlhOWYwMCwKKyAgICAweDMxOWIzNTAwLCAweDMxOWJjYjAwLCAweDMxOWM2MTAwLCAweDMxOWNmNzAwLCAweDMxOWQ4ZDAwLCAweDMxOWUyMzAwLCAweDMxOWViOTAwLCAweDMxOWY0ZjAwLCAweDMxOWZlNTAwLCAweDMxYTA3YjAwLCAweDMxYTExMTAwLCAweDMxYTFhNzAwLCAweDMxYTIzZDAwLCAweDMxYTJkMzAwLCAweDMxYTM2OTAwLCAweDMxYTNmZjAwLAorICAgIDB4MzFhNDk1MDAsIDB4MzFhNTJiMDAsIDB4MzFhNWMxMDAsIDB4MzFhNjU3MDAsIDB4MzFhNmVkMDAsIDB4MzFhNzgzMDAsIDB4MzFhODE5MDAsIDB4MzFhOGFmMDAsIDB4MzFhOTQ1MDAsIDB4MzFhOWRiMDAsIDB4MzFhYTcxMDAsIDB4MzFhYjA3MDAsIDB4MzFhYjlkMDAsIDB4MzFhYzMzMDAsIDB4MzFhY2M5MDAsIDB4MzFhZDVmMDAsCisgICAgMHgzMWFkZjUwMCwgMHgzMWFlOGIwMCwgMHgzMWFmMjEwMCwgMHgzMWFmYjcwMCwgMHgzMWIwNGQwMCwgMHgzMWIwZTMwMCwgMHgzMWIxNzkwMCwgMHgzMWIyMGYwMCwgMHgzMWIyYTUwMCwgMHgzMWIzM2IwMCwgMHgzMWIzZDEwMCwgMHgzMWI0NjcwMCwgMHgzMWI0ZmQwMCwgMHgzMWI1OTMwMCwgMHgzMWI2MjkwMCwgMHgzMWI2YmYwMCwKKyAgICAweDMxYjc1NTAwLCAweDMxYjdlYjAwLCAweDMxYjg4MTAwLCAweDMxYjkxNzAwLCAweDMxYjlhZDAwLCAweDMxYmE0MzAwLCAweDMxYmFkOTAwLCAweDMxYmI2ZjAwLCAweDMxYmMwNTAwLCAweDMxYmM5YjAwLCAweDMxYmQzMTAwLCAweDMxYmRjNzAwLCAweDMxYmU1ZDAwLCAweDMxYmVmMzAwLCAweDMxYmY4OTAwLCAweDMxYzAxZjAwLAorICAgIDB4MzFjMGI1MDAsIDB4MzFjMTRiMDAsIDB4MzFjMWUxMDAsIDB4MzFjMjc3MDAsIDB4MzFjMzBkMDAsIDB4MzFjM2EzMDAsIDB4MzFjNDM5MDAsIDB4MzFjNGNmMDAsIDB4MzFjNTY1MDAsIDB4MzFjNWZiMDAsIDB4MzFjNjkxMDAsIDB4MzFjNzI3MDAsIDB4MzFjN2JkMDAsIDB4MzFjODUzMDAsIDB4MzFjOGU5MDAsIDB4MzFjOTdmMDAsCisgICAgMHgzMWNhMTUwMCwgMHgzMWNhYWIwMCwgMHgzMWNiNDEwMCwgMHgzMWNiZDcwMCwgMHgzMWNjNmQwMCwgMHgzMWNkMDMwMCwgMHgzMWNkOTkwMCwgMHgzMWNlMmYwMCwgMHgzMWNlYzUwMCwgMHgzMWNmNWIwMCwgMHgzMWNmZjEwMCwgMHgzMWQwODcwMCwgMHgzMWQxMWQwMCwgMHgzMWQxYjMwMCwgMHgzMWQyNDkwMCwgMHgzMWQyZGYwMCwKKyAgICAweDMxZDM3NTAwLCAweDMxZDQwYjAwLCAweDMxZDRhMTAwLCAweDMxZDUzNzAwLCAweDMxZDVjZDAwLCAweDMxZDY2MzAwLCAweDMxZDZmOTAwLCAweDMxZDc4ZjAwLCAweDMxZDgyNTAwLCAweDMxZDhiYjAwLCAweDMxZDk1MTAwLCAweDMxZDllNzAwLCAweDMxZGE3ZDAwLCAweDMxZGIxMzAwLCAweDMxZGJhOTAwLCAweDMxZGMzZjAwLAorICAgIDB4MzFkY2Q1MDAsIDB4MzFkZDZiMDAsIDB4MzFkZTAxMDAsIDB4MzFkZTk3MDAsIDB4MzFkZjJkMDAsIDB4MzFkZmMzMDAsIDB4MzFlMDU5MDAsIDB4MzFlMGVmMDAsIDB4MzFlMTg1MDAsIDB4MzFlMjFiMDAsIDB4MzFlMmIxMDAsIDB4MzFlMzQ3MDAsIDB4MzFlM2RkMDAsIDB4MzFlNDczMDAsIDB4MzFlNTA5MDAsIDB4MzFlNTlmMDAsCisgICAgMHgzMWU2MzUwMCwgMHgzMWU2Y2IwMCwgMHgzMWU3NjEwMCwgMHgzMWU3ZjcwMCwgMHgzMWU4OGQwMCwgMHgzMWU5MjMwMCwgMHgzMWU5YjkwMCwgMHgzMWVhNGYwMCwgMHgzMWVhZTUwMCwgMHgzMWViN2IwMCwgMHgzMWVjMTEwMCwgMHgzMWVjYTcwMCwgMHgzMWVkM2QwMCwgMHgzMWVkZDMwMCwgMHgzMWVlNjkwMCwgMHgzMWVlZmYwMCwKKyAgICAweDMxZWY5NTAwLCAweDMxZjAyYjAwLCAweDMxZjBjMTAwLCAweDMxZjE1NzAwLCAweDMxZjFlZDAwLCAweDMxZjI4MzAwLCAweDMxZjMxOTAwLCAweDMxZjNhZjAwLCAweDMxZjQ0NTAwLCAweDMxZjRkYjAwLCAweDMxZjU3MTAwLCAweDMxZjYwNzAwLCAweDMxZjY5ZDAwLCAweDMxZjczMzAwLCAweDMxZjdjOTAwLCAweDMxZjg1ZjAwLAorICAgIDB4MzFmOGY1MDAsIDB4MzFmOThiMDAsIDB4MzFmYTIxMDAsIDB4MzFmYWI3MDAsIDB4MzFmYjRkMDAsIDB4MzFmYmUzMDAsIDB4MzFmYzc5MDAsIDB4MzFmZDBmMDAsIDB4MzFmZGE1MDAsIDB4MzFmZTNiMDAsIDB4MzFmZWQxMDAsIDB4MzFmZjY3MDAsIDB4MzFmZmZkMDAsIDB4MzIwMDkzMDAsIDB4MzIwMTI5MDAsIDB4MzIwMWJmMDAsCisgICAgMHgzMjAyNTUwMCwgMHgzMjAyZWIwMCwgMHgzMjAzODEwMCwgMHgzMjA0MTcwMCwgMHgzMjA0YWQwMCwgMHgzMjA1NDMwMCwgMHgzMjA1ZDkwMCwgMHgzMjA2NmYwMCwgMHgzMjA3MDUwMCwgMHgzMjA3OWIwMCwgMHgzMjA4MzEwMCwgMHgzMjA4YzcwMCwgMHgzMjA5NWQwMCwgMHgzMjA5ZjMwMCwgMHgzMjBhODkwMCwgMHgzMjBiMWYwMCwKKyAgICAweDMyMGJiNTAwLCAweDMyMGM0YjAwLCAweDMyMGNlMTAwLCAweDMyMGQ3NzAwLCAweDMyMGUwZDAwLCAweDMyMGVhMzAwLCAweDMyMGYzOTAwLCAweDMyMGZjZjAwLCAweDMyMTA2NTAwLCAweDMyMTBmYjAwLCAweDMyMTE5MTAwLCAweDMyMTIyNzAwLCAweDMyMTJiZDAwLCAweDMyMTM1MzAwLCAweDMyMTNlOTAwLCAweDMyMTQ3ZjAwLAorICAgIDB4MzIxNTE1MDAsIDB4MzIxNWFiMDAsIDB4MzIxNjQxMDAsIDB4MzIxNmQ3MDAsIDB4MzIxNzZkMDAsIDB4MzIxODAzMDAsIDB4MzIxODk5MDAsIDB4MzIxOTJmMDAsIDB4MzIxOWM1MDAsIDB4MzIxYTViMDAsIDB4MzIxYWYxMDAsIDB4MzIxYjg3MDAsIDB4MzIxYzFkMDAsIDB4MzIxY2IzMDAsIDB4MzIxZDQ5MDAsIDB4MzIxZGRmMDAsCisgICAgMHgzMjFlNzUwMCwgMHgzMjFmMGIwMCwgMHgzMjFmYTEwMCwgMHgzMjIwMzcwMCwgMHgzMjIwY2QwMCwgMHgzMjIxNjMwMCwgMHgzMjIxZjkwMCwgMHgzMjIyOGYwMCwgMHgzMjIzMjUwMCwgMHgzMjIzYmIwMCwgMHgzMjI0NTEwMCwgMHgzMjI0ZTcwMCwgMHgzMjI1N2QwMCwgMHgzMjI2MTMwMCwgMHgzMjI2YTkwMCwgMHgzMjI3M2YwMCwKKyAgICAweDMyMjdkNTAwLCAweDMyMjg2YjAwLCAweDMyMjkwMTAwLCAweDMyMjk5NzAwLCAweDMyMmEyZDAwLCAweDMyMmFjMzAwLCAweDMyMmI1OTAwLCAweDMyMmJlZjAwLCAweDMyMmM4NTAwLCAweDMyMmQxYjAwLCAweDMyMmRiMTAwLCAweDMyMmU0NzAwLCAweDMyMmVkZDAwLCAweDMyMmY3MzAwLCAweDMyMzAwOTAwLCAweDMyMzA5ZjAwLAorICAgIDB4MzIzMTM1MDAsIDB4MzIzMWNiMDAsIDB4MzIzMjYxMDAsIDB4MzIzMmY3MDAsIDB4MzIzMzhkMDAsIDB4MzIzNDIzMDAsIDB4MzIzNGI5MDAsIDB4MzIzNTRmMDAsIDB4MzIzNWU1MDAsIDB4MzIzNjdiMDAsIDB4MzIzNzExMDAsIDB4MzIzN2E3MDAsIDB4MzIzODNkMDAsIDB4MzIzOGQzMDAsIDB4MzIzOTY5MDAsIDB4MzIzOWZmMDAsCisgICAgMHgzMjNhYTQwMCwgMHgzMjNiNDkwMCwgMHgzMjNiZWUwMCwgMHgzMjNjOTMwMCwgMHgzMjNkMzgwMCwgMHgzMjNkZGQwMCwgMHgzMjNlODIwMCwgMHgzMjNmMjcwMCwgMHgzMjNmY2MwMCwgMHgzMjQwNzEwMCwgMHgzMjQxMTYwMCwgMHgzMjQxYmIwMCwgMHgzMjQyNjAwMCwgMHgzMjQzMDUwMCwgMHgzMjQzYWEwMCwgMHgzMjQ0NGYwMCwKKyAgICAweDMyNDRmNDAwLCAweDMyNDU5OTAwLCAweDMyNDYzZTAwLCAweDMyNDZlMzAwLCAweDMyNDc4ODAwLCAweDMyNDgyZDAwLCAweDMyNDhkMjAwLCAweDMyNDk3NzAwLCAweDMyNGExYzAwLCAweDMyNGFjMTAwLCAweDMyNGI2NjAwLCAweDMyNGMwYjAwLCAweDMyNGNiMDAwLCAweDMyNGQ1NTAwLCAweDMyNGRmYTAwLCAweDMyNGU5ZjAwLAorICAgIDB4MzI0ZjQ0MDAsIDB4MzI0ZmU5MDAsIDB4MzI1MDhlMDAsIDB4MzI1MTMzMDAsIDB4MzI1MWQ4MDAsIDB4MzI1MjdkMDAsIDB4MzI1MzIyMDAsIDB4MzI1M2M3MDAsIDB4MzI1NDZjMDAsIDB4MzI1NTExMDAsIDB4MzI1NWI2MDAsIDB4MzI1NjViMDAsIDB4MzI1NzAwMDAsIDB4MzI1N2E1MDAsIDB4MzI1ODRhMDAsIDB4MzI1OGVmMDAsCisgICAgMHgzMjU5OTQwMCwgMHgzMjVhMzkwMCwgMHgzMjVhZGUwMCwgMHgzMjViODMwMCwgMHgzMjVjMjgwMCwgMHgzMjVjY2QwMCwgMHgzMjVkNzIwMCwgMHgzMjVlMTcwMCwgMHgzMjVlYmMwMCwgMHgzMjVmNjEwMCwgMHgzMjYwMDYwMCwgMHgzMjYwYWIwMCwgMHgzMjYxNTAwMCwgMHgzMjYxZjUwMCwgMHgzMjYyOWEwMCwgMHgzMjYzM2YwMCwKKyAgICAweDMyNjNlNDAwLCAweDMyNjQ4OTAwLCAweDMyNjUyZTAwLCAweDMyNjVkMzAwLCAweDMyNjY3ODAwLCAweDMyNjcxZDAwLCAweDMyNjdjMjAwLCAweDMyNjg2NzAwLCAweDMyNjkwYzAwLCAweDMyNjliMTAwLCAweDMyNmE1NjAwLCAweDMyNmFmYjAwLCAweDMyNmJhMDAwLCAweDMyNmM0NTAwLCAweDMyNmNlYTAwLCAweDMyNmQ4ZjAwLAorICAgIDB4MzI2ZTM0MDAsIDB4MzI2ZWQ5MDAsIDB4MzI2ZjdlMDAsIDB4MzI3MDIzMDAsIDB4MzI3MGM4MDAsIDB4MzI3MTZkMDAsIDB4MzI3MjEyMDAsIDB4MzI3MmI3MDAsIDB4MzI3MzVjMDAsIDB4MzI3NDAxMDAsIDB4MzI3NGE2MDAsIDB4MzI3NTRiMDAsIDB4MzI3NWYwMDAsIDB4MzI3Njk1MDAsIDB4MzI3NzNhMDAsIDB4MzI3N2RmMDAsCisgICAgMHgzMjc4ODQwMCwgMHgzMjc5MjkwMCwgMHgzMjc5Y2UwMCwgMHgzMjdhNzMwMCwgMHgzMjdiMTgwMCwgMHgzMjdiYmQwMCwgMHgzMjdjNjIwMCwgMHgzMjdkMDcwMCwgMHgzMjdkYWMwMCwgMHgzMjdlNTEwMCwgMHgzMjdlZjYwMCwgMHgzMjdmOWIwMCwgMHgzMjgwNDAwMCwgMHgzMjgwZTUwMCwgMHgzMjgxOGEwMCwgMHgzMjgyMmYwMCwKKyAgICAweDMyODJkNDAwLCAweDMyODM3OTAwLCAweDMyODQxZTAwLCAweDMyODRjMzAwLCAweDMyODU2ODAwLCAweDMyODYwZDAwLCAweDMyODZiMjAwLCAweDMyODc1NzAwLCAweDMyODdmYzAwLCAweDMyODhhMTAwLCAweDMyODk0NjAwLCAweDMyODllYjAwLCAweDMyOGE5MDAwLCAweDMyOGIzNTAwLCAweDMyOGJkYTAwLCAweDMyOGM3ZjAwLAorICAgIDB4MzI4ZDI0MDAsIDB4MzI4ZGM5MDAsIDB4MzI4ZTZlMDAsIDB4MzI4ZjEzMDAsIDB4MzI4ZmI4MDAsIDB4MzI5MDVkMDAsIDB4MzI5MTAyMDAsIDB4MzI5MWE3MDAsIDB4MzI5MjRjMDAsIDB4MzI5MmYxMDAsIDB4MzI5Mzk2MDAsIDB4MzI5NDNiMDAsIDB4MzI5NGUwMDAsIDB4MzI5NTg1MDAsIDB4MzI5NjJhMDAsIDB4MzI5NmNmMDAsCisgICAgMHgzMjk3NzQwMCwgMHgzMjk4MTkwMCwgMHgzMjk4YmUwMCwgMHgzMjk5NjMwMCwgMHgzMjlhMDgwMCwgMHgzMjlhYWQwMCwgMHgzMjliNTIwMCwgMHgzMjliZjcwMCwgMHgzMjljOWMwMCwgMHgzMjlkNDEwMCwgMHgzMjlkZTYwMCwgMHgzMjllOGIwMCwgMHgzMjlmMzAwMCwgMHgzMjlmZDUwMCwgMHgzMmEwN2EwMCwgMHgzMmExMWYwMCwKKyAgICAweDMyYTFjNDAwLCAweDMyYTI2OTAwLCAweDMyYTMwZTAwLCAweDMyYTNiMzAwLCAweDMyYTQ1ODAwLCAweDMyYTRmZDAwLCAweDMyYTVhMjAwLCAweDMyYTY0NzAwLCAweDMyYTZlYzAwLCAweDMyYTc5MTAwLCAweDMyYTgzNjAwLCAweDMyYThkYjAwLCAweDMyYTk4MDAwLCAweDMyYWEyNTAwLCAweDMyYWFjYTAwLCAweDMyYWI2ZjAwLAorICAgIDB4MzJhYzE0MDAsIDB4MzJhY2I5MDAsIDB4MzJhZDVlMDAsIDB4MzJhZTAzMDAsIDB4MzJhZWE4MDAsIDB4MzJhZjRkMDAsIDB4MzJhZmYyMDAsIDB4MzJiMDk3MDAsIDB4MzJiMTNjMDAsIDB4MzJiMWUxMDAsIDB4MzJiMjg2MDAsIDB4MzJiMzJiMDAsIDB4MzJiM2QwMDAsIDB4MzJiNDc1MDAsIDB4MzJiNTFhMDAsIDB4MzJiNWJmMDAsCisgICAgMHgzMmI2NjQwMCwgMHgzMmI3MDkwMCwgMHgzMmI3YWUwMCwgMHgzMmI4NTMwMCwgMHgzMmI4ZjgwMCwgMHgzMmI5OWQwMCwgMHgzMmJhNDIwMCwgMHgzMmJhZTcwMCwgMHgzMmJiOGMwMCwgMHgzMmJjMzEwMCwgMHgzMmJjZDYwMCwgMHgzMmJkN2IwMCwgMHgzMmJlMjAwMCwgMHgzMmJlYzUwMCwgMHgzMmJmNmEwMCwgMHgzMmMwMGYwMCwKKyAgICAweDMyYzBiNDAwLCAweDMyYzE1OTAwLCAweDMyYzFmZTAwLCAweDMyYzJhMzAwLCAweDMyYzM0ODAwLCAweDMyYzNlZDAwLCAweDMyYzQ5MjAwLCAweDMyYzUzNzAwLCAweDMyYzVkYzAwLCAweDMyYzY4MTAwLCAweDMyYzcyNjAwLCAweDMyYzdjYjAwLCAweDMyYzg3MDAwLCAweDMyYzkxNTAwLCAweDMyYzliYTAwLCAweDMyY2E1ZjAwLAorICAgIDB4MzJjYjA0MDAsIDB4MzJjYmE5MDAsIDB4MzJjYzRlMDAsIDB4MzJjY2YzMDAsIDB4MzJjZDk4MDAsIDB4MzJjZTNkMDAsIDB4MzJjZWUyMDAsIDB4MzJjZjg3MDAsIDB4MzJkMDJjMDAsIDB4MzJkMGQxMDAsIDB4MzJkMTc2MDAsIDB4MzJkMjFiMDAsIDB4MzJkMmMwMDAsIDB4MzJkMzY1MDAsIDB4MzJkNDBhMDAsIDB4MzJkNGFmMDAsCisgICAgMHgzMmQ1NTQwMCwgMHgzMmQ1ZjkwMCwgMHgzMmQ2OWUwMCwgMHgzMmQ3NDMwMCwgMHgzMmQ3ZTgwMCwgMHgzMmQ4OGQwMCwgMHgzMmQ5MzIwMCwgMHgzMmQ5ZDcwMCwgMHgzMmRhN2MwMCwgMHgzMmRiMjEwMCwgMHgzMmRiYzYwMCwgMHgzMmRjNmIwMCwgMHgzMmRkMTAwMCwgMHgzMmRkYjUwMCwgMHgzMmRlNWEwMCwgMHgzMmRlZmYwMCwKKyAgICAweDMyZGZhNDAwLCAweDMyZTA0OTAwLCAweDMyZTBlZTAwLCAweDMyZTE5MzAwLCAweDMyZTIzODAwLCAweDMyZTJkZDAwLCAweDMyZTM4MjAwLCAweDMyZTQyNzAwLCAweDMyZTRjYzAwLCAweDMyZTU3MTAwLCAweDMyZTYxNjAwLCAweDMyZTZiYjAwLCAweDMyZTc2MDAwLCAweDMyZTgwNTAwLCAweDMyZThhYTAwLCAweDMyZTk0ZjAwLAorICAgIDB4MzJlOWY0MDAsIDB4MzJlYTk5MDAsIDB4MzJlYjNlMDAsIDB4MzJlYmUzMDAsIDB4MzJlYzg4MDAsIDB4MzJlZDJkMDAsIDB4MzJlZGQyMDAsIDB4MzJlZTc3MDAsIDB4MzJlZjFjMDAsIDB4MzJlZmMxMDAsIDB4MzJmMDY2MDAsIDB4MzJmMTBiMDAsIDB4MzJmMWIwMDAsIDB4MzJmMjU1MDAsIDB4MzJmMmZhMDAsIDB4MzJmMzlmMDAsCisgICAgMHgzMmY0NDQwMCwgMHgzMmY0ZTkwMCwgMHgzMmY1OGUwMCwgMHgzMmY2MzMwMCwgMHgzMmY2ZDgwMCwgMHgzMmY3N2QwMCwgMHgzMmY4MjIwMCwgMHgzMmY4YzcwMCwgMHgzMmY5NmMwMCwgMHgzMmZhMTEwMCwgMHgzMmZhYjYwMCwgMHgzMmZiNWIwMCwgMHgzMmZjMDAwMCwgMHgzMmZjYTUwMCwgMHgzMmZkNGEwMCwgMHgzMmZkZWYwMCwKKyAgICAweDMyZmU5NDAwLCAweDMyZmYzOTAwLCAweDMyZmZkZTAwLCAweDMzMDA4MzAwLCAweDMzMDEyODAwLCAweDMzMDFjZDAwLCAweDMzMDI3MjAwLCAweDMzMDMxNzAwLCAweDMzMDNiYzAwLCAweDMzMDQ2MTAwLCAweDMzMDUwNjAwLCAweDMzMDVhYjAwLCAweDMzMDY1MDAwLCAweDMzMDZmNTAwLCAweDMzMDc5YTAwLCAweDMzMDgzZjAwLAorICAgIDB4MzMwOGU0MDAsIDB4MzMwOTg5MDAsIDB4MzMwYTJlMDAsIDB4MzMwYWQzMDAsIDB4MzMwYjc4MDAsIDB4MzMwYzFkMDAsIDB4MzMwY2MyMDAsIDB4MzMwZDY3MDAsIDB4MzMwZTBjMDAsIDB4MzMwZWIxMDAsIDB4MzMwZjU2MDAsIDB4MzMwZmZiMDAsIDB4MzMxMGEwMDAsIDB4MzMxMTQ1MDAsIDB4MzMxMWVhMDAsIDB4MzMxMjhmMDAsCisgICAgMHgzMzEzMzQwMCwgMHgzMzEzZDkwMCwgMHgzMzE0N2UwMCwgMHgzMzE1MjMwMCwgMHgzMzE1YzgwMCwgMHgzMzE2NmQwMCwgMHgzMzE3MTIwMCwgMHgzMzE3YjcwMCwgMHgzMzE4NWMwMCwgMHgzMzE5MDEwMCwgMHgzMzE5YTYwMCwgMHgzMzFhNGIwMCwgMHgzMzFhZjAwMCwgMHgzMzFiOTUwMCwgMHgzMzFjM2EwMCwgMHgzMzFjZGYwMCwKKyAgICAweDMzMWQ4NDAwLCAweDMzMWUyOTAwLCAweDMzMWVjZTAwLCAweDMzMWY3MzAwLCAweDMzMjAxODAwLCAweDMzMjBiZDAwLCAweDMzMjE2MjAwLCAweDMzMjIwNzAwLCAweDMzMjJhYzAwLCAweDMzMjM1MTAwLCAweDMzMjNmNjAwLCAweDMzMjQ5YjAwLCAweDMzMjU0MDAwLCAweDMzMjVlNTAwLCAweDMzMjY4YTAwLCAweDMzMjcyZjAwLAorICAgIDB4MzMyN2Q0MDAsIDB4MzMyODc5MDAsIDB4MzMyOTFlMDAsIDB4MzMyOWMzMDAsIDB4MzMyYTY4MDAsIDB4MzMyYjBkMDAsIDB4MzMyYmIyMDAsIDB4MzMyYzU3MDAsIDB4MzMyY2ZjMDAsIDB4MzMyZGExMDAsIDB4MzMyZTQ2MDAsIDB4MzMyZWViMDAsIDB4MzMyZjkwMDAsIDB4MzMzMDM1MDAsIDB4MzMzMGRhMDAsIDB4MzMzMTdmMDAsCisgICAgMHgzMzMyMjQwMCwgMHgzMzMyYzkwMCwgMHgzMzMzNmUwMCwgMHgzMzM0MTMwMCwgMHgzMzM0YjgwMCwgMHgzMzM1NWQwMCwgMHgzMzM2MDIwMCwgMHgzMzM2YTcwMCwgMHgzMzM3NGMwMCwgMHgzMzM3ZjEwMCwgMHgzMzM4OTYwMCwgMHgzMzM5M2IwMCwgMHgzMzM5ZTAwMCwgMHgzMzNhODUwMCwgMHgzMzNiMmEwMCwgMHgzMzNiY2YwMCwKKyAgICAweDMzM2M3NDAwLCAweDMzM2QxOTAwLCAweDMzM2RiZTAwLCAweDMzM2U2MzAwLCAweDMzM2YwODAwLCAweDMzM2ZhZDAwLCAweDMzNDA1MjAwLCAweDMzNDBmNzAwLCAweDMzNDE5YzAwLCAweDMzNDI0MTAwLCAweDMzNDJlNjAwLCAweDMzNDM4YjAwLCAweDMzNDQzMDAwLCAweDMzNDRkNTAwLCAweDMzNDU3YTAwLCAweDMzNDYxZjAwLAorICAgIDB4MzM0NmM0MDAsIDB4MzM0NzY5MDAsIDB4MzM0ODBlMDAsIDB4MzM0OGIzMDAsIDB4MzM0OTU4MDAsIDB4MzM0OWZkMDAsIDB4MzM0YWEyMDAsIDB4MzM0YjQ3MDAsIDB4MzM0YmVjMDAsIDB4MzM0YzkxMDAsIDB4MzM0ZDM2MDAsIDB4MzM0ZGRiMDAsIDB4MzM0ZTgwMDAsIDB4MzM0ZjI1MDAsIDB4MzM0ZmNhMDAsIDB4MzM1MDZmMDAsCisgICAgMHgzMzUxMTQwMCwgMHgzMzUxYjkwMCwgMHgzMzUyNWUwMCwgMHgzMzUzMDMwMCwgMHgzMzUzYTgwMCwgMHgzMzU0NGQwMCwgMHgzMzU0ZjIwMCwgMHgzMzU1OTcwMCwgMHgzMzU2M2MwMCwgMHgzMzU2ZTEwMCwgMHgzMzU3ODYwMCwgMHgzMzU4MmIwMCwgMHgzMzU4ZDAwMCwgMHgzMzU5NzUwMCwgMHgzMzVhMWEwMCwgMHgzMzVhYmYwMCwKKyAgICAweDMzNWI2NDAwLCAweDMzNWMwOTAwLCAweDMzNWNhZTAwLCAweDMzNWQ1MzAwLCAweDMzNWRmODAwLCAweDMzNWU5ZDAwLCAweDMzNWY0MjAwLCAweDMzNWZlNzAwLCAweDMzNjA4YzAwLCAweDMzNjEzMTAwLCAweDMzNjFkNjAwLCAweDMzNjI3YjAwLCAweDMzNjMyMDAwLCAweDMzNjNjNTAwLCAweDMzNjQ2YTAwLCAweDMzNjUwZjAwLAorICAgIDB4MzM2NWI0MDAsIDB4MzM2NjU5MDAsIDB4MzM2NmZlMDAsIDB4MzM2N2EzMDAsIDB4MzM2ODQ4MDAsIDB4MzM2OGVkMDAsIDB4MzM2OTkyMDAsIDB4MzM2YTM3MDAsIDB4MzM2YWRjMDAsIDB4MzM2YjgxMDAsIDB4MzM2YzI2MDAsIDB4MzM2Y2NiMDAsIDB4MzM2ZDcwMDAsIDB4MzM2ZTE1MDAsIDB4MzM2ZWJhMDAsIDB4MzM2ZjVmMDAsCisgICAgMHgzMzcwMDQwMCwgMHgzMzcwYTkwMCwgMHgzMzcxNGUwMCwgMHgzMzcxZjMwMCwgMHgzMzcyOTgwMCwgMHgzMzczM2QwMCwgMHgzMzczZTIwMCwgMHgzMzc0ODcwMCwgMHgzMzc1MmMwMCwgMHgzMzc1ZDEwMCwgMHgzMzc2NzYwMCwgMHgzMzc3MWIwMCwgMHgzMzc3YzAwMCwgMHgzMzc4NjUwMCwgMHgzMzc5MGEwMCwgMHgzMzc5YWYwMCwKKyAgICAweDMzN2E1NDAwLCAweDMzN2FmOTAwLCAweDMzN2I5ZTAwLCAweDMzN2M0MzAwLCAweDMzN2NlODAwLCAweDMzN2Q4ZDAwLCAweDMzN2UzMjAwLCAweDMzN2VkNzAwLCAweDMzN2Y3YzAwLCAweDMzODAyMTAwLCAweDMzODBjNjAwLCAweDMzODE2YjAwLCAweDMzODIxMDAwLCAweDMzODJiNTAwLCAweDMzODM1YTAwLCAweDMzODNmZjAwLAorICAgIDB4MzM4NGE3MDAsIDB4MzM4NTRmMDAsIDB4MzM4NWY3MDAsIDB4MzM4NjlmMDAsIDB4MzM4NzQ3MDAsIDB4MzM4N2VmMDAsIDB4MzM4ODk3MDAsIDB4MzM4OTNmMDAsIDB4MzM4OWU3MDAsIDB4MzM4YThmMDAsIDB4MzM4YjM3MDAsIDB4MzM4YmRmMDAsIDB4MzM4Yzg3MDAsIDB4MzM4ZDJmMDAsIDB4MzM4ZGQ3MDAsIDB4MzM4ZTdmMDAsCisgICAgMHgzMzhmMjcwMCwgMHgzMzhmY2YwMCwgMHgzMzkwNzcwMCwgMHgzMzkxMWYwMCwgMHgzMzkxYzcwMCwgMHgzMzkyNmYwMCwgMHgzMzkzMTcwMCwgMHgzMzkzYmYwMCwgMHgzMzk0NjcwMCwgMHgzMzk1MGYwMCwgMHgzMzk1YjcwMCwgMHgzMzk2NWYwMCwgMHgzMzk3MDcwMCwgMHgzMzk3YWYwMCwgMHgzMzk4NTcwMCwgMHgzMzk4ZmYwMCwKKyAgICAweDMzOTlhNzAwLCAweDMzOWE0ZjAwLCAweDMzOWFmNzAwLCAweDMzOWI5ZjAwLCAweDMzOWM0NzAwLCAweDMzOWNlZjAwLCAweDMzOWQ5NzAwLCAweDMzOWUzZjAwLCAweDMzOWVlNzAwLCAweDMzOWY4ZjAwLCAweDMzYTAzNzAwLCAweDMzYTBkZjAwLCAweDMzYTE4NzAwLCAweDMzYTIyZjAwLCAweDMzYTJkNzAwLCAweDMzYTM3ZjAwLAorICAgIDB4MzNhNDI3MDAsIDB4MzNhNGNmMDAsIDB4MzNhNTc3MDAsIDB4MzNhNjFmMDAsIDB4MzNhNmM3MDAsIDB4MzNhNzZmMDAsIDB4MzNhODE3MDAsIDB4MzNhOGJmMDAsIDB4MzNhOTY3MDAsIDB4MzNhYTBmMDAsIDB4MzNhYWI3MDAsIDB4MzNhYjVmMDAsIDB4MzNhYzA3MDAsIDB4MzNhY2FmMDAsIDB4MzNhZDU3MDAsIDB4MzNhZGZmMDAsCisgICAgMHgzM2FlYTcwMCwgMHgzM2FmNGYwMCwgMHgzM2FmZjcwMCwgMHgzM2IwOWYwMCwgMHgzM2IxNDcwMCwgMHgzM2IxZWYwMCwgMHgzM2IyOTcwMCwgMHgzM2IzM2YwMCwgMHgzM2IzZTcwMCwgMHgzM2I0OGYwMCwgMHgzM2I1MzcwMCwgMHgzM2I1ZGYwMCwgMHgzM2I2ODcwMCwgMHgzM2I3MmYwMCwgMHgzM2I3ZDcwMCwgMHgzM2I4N2YwMCwKKyAgICAweDMzYjkyNzAwLCAweDMzYjljZjAwLCAweDMzYmE3NzAwLCAweDMzYmIxZjAwLCAweDMzYmJjNzAwLCAweDMzYmM2ZjAwLCAweDMzYmQxNzAwLCAweDMzYmRiZjAwLCAweDMzYmU2NzAwLCAweDMzYmYwZjAwLCAweDMzYmZiNzAwLCAweDMzYzA1ZjAwLCAweDMzYzEwNzAwLCAweDMzYzFhZjAwLCAweDMzYzI1NzAwLCAweDMzYzJmZjAwLAorICAgIDB4MzNjM2E3MDAsIDB4MzNjNDRmMDAsIDB4MzNjNGY3MDAsIDB4MzNjNTlmMDAsIDB4MzNjNjQ3MDAsIDB4MzNjNmVmMDAsIDB4MzNjNzk3MDAsIDB4MzNjODNmMDAsIDB4MzNjOGU3MDAsIDB4MzNjOThmMDAsIDB4MzNjYTM3MDAsIDB4MzNjYWRmMDAsIDB4MzNjYjg3MDAsIDB4MzNjYzJmMDAsIDB4MzNjY2Q3MDAsIDB4MzNjZDdmMDAsCisgICAgMHgzM2NlMjcwMCwgMHgzM2NlY2YwMCwgMHgzM2NmNzcwMCwgMHgzM2QwMWYwMCwgMHgzM2QwYzcwMCwgMHgzM2QxNmYwMCwgMHgzM2QyMTcwMCwgMHgzM2QyYmYwMCwgMHgzM2QzNjcwMCwgMHgzM2Q0MGYwMCwgMHgzM2Q0YjcwMCwgMHgzM2Q1NWYwMCwgMHgzM2Q2MDcwMCwgMHgzM2Q2YWYwMCwgMHgzM2Q3NTcwMCwgMHgzM2Q4MDAwMCwKKyAgICAweDMzZDhhODAwLCAweDMzZDk1MDAwLCAweDMzZDlmODAwLCAweDMzZGFhMDAwLCAweDMzZGI0ODAwLCAweDMzZGJmMDAwLCAweDMzZGM5ODAwLCAweDMzZGQ0MDAwLCAweDMzZGRlODAwLCAweDMzZGU5MDAwLCAweDMzZGYzODAwLCAweDMzZGZlMDAwLCAweDMzZTA4ODAwLCAweDMzZTEzMDAwLCAweDMzZTFkODAwLCAweDMzZTI4MDAwLAorICAgIDB4MzNlMzI4MDAsIDB4MzNlM2QwMDAsIDB4MzNlNDc4MDAsIDB4MzNlNTIwMDAsIDB4MzNlNWM4MDAsIDB4MzNlNjcwMDAsIDB4MzNlNzE4MDAsIDB4MzNlN2MwMDAsIDB4MzNlODY4MDAsIDB4MzNlOTEwMDAsIDB4MzNlOWI4MDAsIDB4MzNlYTYwMDAsIDB4MzNlYjA4MDAsIDB4MzNlYmIwMDAsIDB4MzNlYzU4MDAsIDB4MzNlZDAwMDAsCisgICAgMHgzM2VkYTgwMCwgMHgzM2VlNTAwMCwgMHgzM2VlZjgwMCwgMHgzM2VmYTAwMCwgMHgzM2YwNDgwMCwgMHgzM2YwZjAwMCwgMHgzM2YxOTgwMCwgMHgzM2YyNDAwMCwgMHgzM2YyZTgwMCwgMHgzM2YzOTAwMCwgMHgzM2Y0MzgwMCwgMHgzM2Y0ZTAwMCwgMHgzM2Y1ODgwMCwgMHgzM2Y2MzAwMCwgMHgzM2Y2ZDgwMCwgMHgzM2Y3ODAwMCwKKyAgICAweDMzZjgyODAwLCAweDMzZjhkMDAwLCAweDMzZjk3ODAwLCAweDMzZmEyMDAwLCAweDMzZmFjODAwLCAweDMzZmI3MDAwLCAweDMzZmMxODAwLCAweDMzZmNjMDAwLCAweDMzZmQ2ODAwLCAweDMzZmUxMDAwLCAweDMzZmViODAwLCAweDMzZmY2MDAwLCAweDM0MDAwODAwLCAweDM0MDBiMDAwLCAweDM0MDE1ODAwLCAweDM0MDIwMDAwLAorICAgIDB4MzQwMmE4MDAsIDB4MzQwMzUwMDAsIDB4MzQwM2Y4MDAsIDB4MzQwNGEwMDAsIDB4MzQwNTQ4MDAsIDB4MzQwNWYwMDAsIDB4MzQwNjk4MDAsIDB4MzQwNzQwMDAsIDB4MzQwN2U4MDAsIDB4MzQwODkwMDAsIDB4MzQwOTM4MDAsIDB4MzQwOWUwMDAsIDB4MzQwYTg4MDAsIDB4MzQwYjMwMDAsIDB4MzQwYmQ4MDAsIDB4MzQwYzgwMDAsCisgICAgMHgzNDBkMjgwMCwgMHgzNDBkZDAwMCwgMHgzNDBlNzgwMCwgMHgzNDBmMjAwMCwgMHgzNDBmYzgwMCwgMHgzNDEwNzAwMCwgMHgzNDExMTgwMCwgMHgzNDExYzAwMCwgMHgzNDEyNjgwMCwgMHgzNDEzMTAwMCwgMHgzNDEzYjgwMCwgMHgzNDE0NjAwMCwgMHgzNDE1MDgwMCwgMHgzNDE1YjAwMCwgMHgzNDE2NTgwMCwgMHgzNDE3MDAwMCwKKyAgICAweDM0MTdhODAwLCAweDM0MTg1MDAwLCAweDM0MThmODAwLCAweDM0MTlhMDAwLCAweDM0MWE0ODAwLCAweDM0MWFmMDAwLCAweDM0MWI5ODAwLCAweDM0MWM0MDAwLCAweDM0MWNlODAwLCAweDM0MWQ5MDAwLCAweDM0MWUzODAwLCAweDM0MWVlMDAwLCAweDM0MWY4ODAwLCAweDM0MjAzMDAwLCAweDM0MjBkODAwLCAweDM0MjE4MDAwLAorICAgIDB4MzQyMjI4MDAsIDB4MzQyMmQwMDAsIDB4MzQyMzc4MDAsIDB4MzQyNDIwMDAsIDB4MzQyNGM4MDAsIDB4MzQyNTcwMDAsIDB4MzQyNjE4MDAsIDB4MzQyNmMwMDAsIDB4MzQyNzY4MDAsIDB4MzQyODEwMDAsIDB4MzQyOGI4MDAsIDB4MzQyOTYwMDAsIDB4MzQyYTA4MDAsIDB4MzQyYWIwMDAsIDB4MzQyYjU4MDAsIDB4MzQyYzAwMDAsCisgICAgMHgzNDJjYTgwMCwgMHgzNDJkNTAwMCwgMHgzNDJkZjgwMCwgMHgzNDJlYTAwMCwgMHgzNDJmNDgwMCwgMHgzNDJmZjAwMCwgMHgzNDMwOTgwMCwgMHgzNDMxNDAwMCwgMHgzNDMxZTgwMCwgMHgzNDMyOTAwMCwgMHgzNDMzMzgwMCwgMHgzNDMzZTAwMCwgMHgzNDM0ODgwMCwgMHgzNDM1MzAwMCwgMHgzNDM1ZDgwMCwgMHgzNDM2ODAwMCwKKyAgICAweDM0MzcyODAwLCAweDM0MzdkMDAwLCAweDM0Mzg3ODAwLCAweDM0MzkyMDAwLCAweDM0MzljODAwLCAweDM0M2E3MDAwLCAweDM0M2IxODAwLCAweDM0M2JjMDAwLCAweDM0M2M2ODAwLCAweDM0M2QxMDAwLCAweDM0M2RiODAwLCAweDM0M2U2MDAwLCAweDM0M2YwODAwLCAweDM0M2ZiMDAwLCAweDM0NDA1ODAwLCAweDM0NDEwMDAwLAorICAgIDB4MzQ0MWE4MDAsIDB4MzQ0MjUwMDAsIDB4MzQ0MmY4MDAsIDB4MzQ0M2EwMDAsIDB4MzQ0NDQ4MDAsIDB4MzQ0NGYwMDAsIDB4MzQ0NTk4MDAsIDB4MzQ0NjQwMDAsIDB4MzQ0NmU4MDAsIDB4MzQ0NzkwMDAsIDB4MzQ0ODM4MDAsIDB4MzQ0OGUwMDAsIDB4MzQ0OTg4MDAsIDB4MzQ0YTMwMDAsIDB4MzQ0YWQ4MDAsIDB4MzQ0YjgwMDAsCisgICAgMHgzNDRjMjgwMCwgMHgzNDRjZDAwMCwgMHgzNDRkNzgwMCwgMHgzNDRlMjAwMCwgMHgzNDRlYzgwMCwgMHgzNDRmNzAwMCwgMHgzNDUwMTgwMCwgMHgzNDUwYzAwMCwgMHgzNDUxNjgwMCwgMHgzNDUyMTAwMCwgMHgzNDUyYjgwMCwgMHgzNDUzNjAwMCwgMHgzNDU0MDgwMCwgMHgzNDU0YjAwMCwgMHgzNDU1NTgwMCwgMHgzNDU2MDAwMCwKKyAgICAweDM0NTZhODAwLCAweDM0NTc1MDAwLCAweDM0NTdmODAwLCAweDM0NThhMDAwLCAweDM0NTk0ODAwLCAweDM0NTlmMDAwLCAweDM0NWE5ODAwLCAweDM0NWI0MDAwLCAweDM0NWJlODAwLCAweDM0NWM5MDAwLCAweDM0NWQzODAwLCAweDM0NWRlMDAwLCAweDM0NWU4ODAwLCAweDM0NWYzMDAwLCAweDM0NWZkODAwLCAweDM0NjA4MDAwLAorICAgIDB4MzQ2MTI4MDAsIDB4MzQ2MWQwMDAsIDB4MzQ2Mjc4MDAsIDB4MzQ2MzIwMDAsIDB4MzQ2M2M4MDAsIDB4MzQ2NDcwMDAsIDB4MzQ2NTE4MDAsIDB4MzQ2NWMwMDAsIDB4MzQ2NjY4MDAsIDB4MzQ2NzEwMDAsIDB4MzQ2N2I4MDAsIDB4MzQ2ODYwMDAsIDB4MzQ2OTA4MDAsIDB4MzQ2OWIwMDAsIDB4MzQ2YTU4MDAsIDB4MzQ2YjAwMDAsCisgICAgMHgzNDZiYTgwMCwgMHgzNDZjNTAwMCwgMHgzNDZjZjgwMCwgMHgzNDZkYTAwMCwgMHgzNDZlNDgwMCwgMHgzNDZlZjAwMCwgMHgzNDZmOTgwMCwgMHgzNDcwNDAwMCwgMHgzNDcwZTgwMCwgMHgzNDcxOTAwMCwgMHgzNDcyMzgwMCwgMHgzNDcyZTAwMCwgMHgzNDczODgwMCwgMHgzNDc0MzAwMCwgMHgzNDc0ZDgwMCwgMHgzNDc1ODAwMCwKKyAgICAweDM0NzYyODAwLCAweDM0NzZkMDAwLCAweDM0Nzc3ODAwLCAweDM0NzgyMDAwLCAweDM0NzhjODAwLCAweDM0Nzk3MDAwLCAweDM0N2ExODAwLCAweDM0N2FjMDAwLCAweDM0N2I2ODAwLCAweDM0N2MxMDAwLCAweDM0N2NiODAwLCAweDM0N2Q2MDAwLCAweDM0N2UwODAwLCAweDM0N2ViMDAwLCAweDM0N2Y1ODAwLCAweDM0ODAwMDAwLAorICAgIDB4MzQ4MGE4MDAsIDB4MzQ4MTUwMDAsIDB4MzQ4MWY4MDAsIDB4MzQ4MmEwMDAsIDB4MzQ4MzQ4MDAsIDB4MzQ4M2YwMDAsIDB4MzQ4NDk4MDAsIDB4MzQ4NTQwMDAsIDB4MzQ4NWU4MDAsIDB4MzQ4NjkwMDAsIDB4MzQ4NzM4MDAsIDB4MzQ4N2UwMDAsIDB4MzQ4ODg4MDAsIDB4MzQ4OTMwMDAsIDB4MzQ4OWQ4MDAsIDB4MzQ4YTgwMDAsCisgICAgMHgzNDhiMjgwMCwgMHgzNDhiZDAwMCwgMHgzNDhjNzgwMCwgMHgzNDhkMjAwMCwgMHgzNDhkYzgwMCwgMHgzNDhlNzAwMCwgMHgzNDhmMTgwMCwgMHgzNDhmYzAwMCwgMHgzNDkwNjgwMCwgMHgzNDkxMTAwMCwgMHgzNDkxYjgwMCwgMHgzNDkyNjAwMCwgMHgzNDkzMDgwMCwgMHgzNDkzYjAwMCwgMHgzNDk0NTgwMCwgMHgzNDk1MDAwMCwKKyAgICAweDM0OTVhODAwLCAweDM0OTY1MDAwLCAweDM0OTZmODAwLCAweDM0OTdhMDAwLCAweDM0OTg0ODAwLCAweDM0OThmMDAwLCAweDM0OTk5ODAwLCAweDM0OWE0MDAwLCAweDM0OWFlODAwLCAweDM0OWI5MDAwLCAweDM0OWMzODAwLCAweDM0OWNlMDAwLCAweDM0OWQ4ODAwLCAweDM0OWUzMDAwLCAweDM0OWVkODAwLCAweDM0OWY4MDAwLAorICAgIDB4MzRhMDI4MDAsIDB4MzRhMGQwMDAsIDB4MzRhMTc4MDAsIDB4MzRhMjIwMDAsIDB4MzRhMmM4MDAsIDB4MzRhMzcwMDAsIDB4MzRhNDE4MDAsIDB4MzRhNGMwMDAsIDB4MzRhNTY4MDAsIDB4MzRhNjEwMDAsIDB4MzRhNmI4MDAsIDB4MzRhNzYwMDAsIDB4MzRhODA4MDAsIDB4MzRhOGIwMDAsIDB4MzRhOTU4MDAsIDB4MzRhYTAwMDAsCisgICAgMHgzNGFhYTgwMCwgMHgzNGFiNTAwMCwgMHgzNGFiZjgwMCwgMHgzNGFjYTAwMCwgMHgzNGFkNDgwMCwgMHgzNGFkZjAwMCwgMHgzNGFlOTgwMCwgMHgzNGFmNDAwMCwgMHgzNGFmZTgwMCwgMHgzNGIwOTAwMCwgMHgzNGIxMzgwMCwgMHgzNGIxZTAwMCwgMHgzNGIyODgwMCwgMHgzNGIzMzAwMCwgMHgzNGIzZDgwMCwgMHgzNGI0ODAwMCwKKyAgICAweDM0YjUyODAwLCAweDM0YjVkMDAwLCAweDM0YjY3ODAwLCAweDM0YjcyMDAwLCAweDM0YjdjODAwLCAweDM0Yjg3MDAwLCAweDM0YjkxODAwLCAweDM0YjljMDAwLCAweDM0YmE2ODAwLCAweDM0YmIxMDAwLCAweDM0YmJiODAwLCAweDM0YmM2MDAwLCAweDM0YmQwODAwLCAweDM0YmRiMDAwLCAweDM0YmU1ODAwLCAweDM0YmYwMDAwLAorICAgIDB4MzRiZmE4MDAsIDB4MzRjMDUwMDAsIDB4MzRjMGY4MDAsIDB4MzRjMWEwMDAsIDB4MzRjMjQ4MDAsIDB4MzRjMmYwMDAsIDB4MzRjMzk4MDAsIDB4MzRjNDQwMDAsIDB4MzRjNGU4MDAsIDB4MzRjNTkwMDAsIDB4MzRjNjM4MDAsIDB4MzRjNmUwMDAsIDB4MzRjNzg4MDAsIDB4MzRjODMwMDAsIDB4MzRjOGQ4MDAsIDB4MzRjOTgwMDAsCisgICAgMHgzNGNhMjgwMCwgMHgzNGNhZDAwMCwgMHgzNGNiNzgwMCwgMHgzNGNjMjAwMCwgMHgzNGNjYzgwMCwgMHgzNGNkNzAwMCwgMHgzNGNlMTgwMCwgMHgzNGNlYzAwMCwgMHgzNGNmNjgwMCwgMHgzNGQwMTAwMCwgMHgzNGQwYjgwMCwgMHgzNGQxNjAwMCwgMHgzNGQyMDgwMCwgMHgzNGQyYjAwMCwgMHgzNGQzNTgwMCwgMHgzNGQ0MDAwMCwKKyAgICAweDM0ZDRiYjAwLCAweDM0ZDU3NjAwLCAweDM0ZDYzMTAwLCAweDM0ZDZlYzAwLCAweDM0ZDdhNzAwLCAweDM0ZDg2MjAwLCAweDM0ZDkxZDAwLCAweDM0ZDlkODAwLCAweDM0ZGE5MzAwLCAweDM0ZGI0ZTAwLCAweDM0ZGMwOTAwLCAweDM0ZGNjNDAwLCAweDM0ZGQ3ZjAwLCAweDM0ZGUzYTAwLCAweDM0ZGVmNTAwLCAweDM0ZGZiMDAwLAorICAgIDB4MzRlMDZiMDAsIDB4MzRlMTI2MDAsIDB4MzRlMWUxMDAsIDB4MzRlMjljMDAsIDB4MzRlMzU3MDAsIDB4MzRlNDEyMDAsIDB4MzRlNGNkMDAsIDB4MzRlNTg4MDAsIDB4MzRlNjQzMDAsIDB4MzRlNmZlMDAsIDB4MzRlN2I5MDAsIDB4MzRlODc0MDAsIDB4MzRlOTJmMDAsIDB4MzRlOWVhMDAsIDB4MzRlYWE1MDAsIDB4MzRlYjYwMDAsCisgICAgMHgzNGVjMWIwMCwgMHgzNGVjZDYwMCwgMHgzNGVkOTEwMCwgMHgzNGVlNGMwMCwgMHgzNGVmMDcwMCwgMHgzNGVmYzIwMCwgMHgzNGYwN2QwMCwgMHgzNGYxMzgwMCwgMHgzNGYxZjMwMCwgMHgzNGYyYWUwMCwgMHgzNGYzNjkwMCwgMHgzNGY0MjQwMCwgMHgzNGY0ZGYwMCwgMHgzNGY1OWEwMCwgMHgzNGY2NTUwMCwgMHgzNGY3MTAwMCwKKyAgICAweDM0ZjdjYjAwLCAweDM0Zjg4NjAwLCAweDM0Zjk0MTAwLCAweDM0ZjlmYzAwLCAweDM0ZmFiNzAwLCAweDM0ZmI3MjAwLCAweDM0ZmMyZDAwLCAweDM0ZmNlODAwLCAweDM0ZmRhMzAwLCAweDM0ZmU1ZTAwLCAweDM0ZmYxOTAwLCAweDM0ZmZkNDAwLCAweDM1MDA4ZjAwLCAweDM1MDE0YTAwLCAweDM1MDIwNTAwLCAweDM1MDJjMDAwLAorICAgIDB4MzUwMzdiMDAsIDB4MzUwNDM2MDAsIDB4MzUwNGYxMDAsIDB4MzUwNWFjMDAsIDB4MzUwNjY3MDAsIDB4MzUwNzIyMDAsIDB4MzUwN2RkMDAsIDB4MzUwODk4MDAsIDB4MzUwOTUzMDAsIDB4MzUwYTBlMDAsIDB4MzUwYWM5MDAsIDB4MzUwYjg0MDAsIDB4MzUwYzNmMDAsIDB4MzUwY2ZhMDAsIDB4MzUwZGI1MDAsIDB4MzUwZTcwMDAsCisgICAgMHgzNTBmMmIwMCwgMHgzNTBmZTYwMCwgMHgzNTEwYTEwMCwgMHgzNTExNWMwMCwgMHgzNTEyMTcwMCwgMHgzNTEyZDIwMCwgMHgzNTEzOGQwMCwgMHgzNTE0NDgwMCwgMHgzNTE1MDMwMCwgMHgzNTE1YmUwMCwgMHgzNTE2NzkwMCwgMHgzNTE3MzQwMCwgMHgzNTE3ZWYwMCwgMHgzNTE4YWEwMCwgMHgzNTE5NjUwMCwgMHgzNTFhMjAwMCwKKyAgICAweDM1MWFkYjAwLCAweDM1MWI5NjAwLCAweDM1MWM1MTAwLCAweDM1MWQwYzAwLCAweDM1MWRjNzAwLCAweDM1MWU4MjAwLCAweDM1MWYzZDAwLCAweDM1MWZmODAwLCAweDM1MjBiMzAwLCAweDM1MjE2ZTAwLCAweDM1MjIyOTAwLCAweDM1MjJlNDAwLCAweDM1MjM5ZjAwLCAweDM1MjQ1YTAwLCAweDM1MjUxNTAwLCAweDM1MjVkMDAwLAorICAgIDB4MzUyNjhiMDAsIDB4MzUyNzQ2MDAsIDB4MzUyODAxMDAsIDB4MzUyOGJjMDAsIDB4MzUyOTc3MDAsIDB4MzUyYTMyMDAsIDB4MzUyYWVkMDAsIDB4MzUyYmE4MDAsIDB4MzUyYzYzMDAsIDB4MzUyZDFlMDAsIDB4MzUyZGQ5MDAsIDB4MzUyZTk0MDAsIDB4MzUyZjRmMDAsIDB4MzUzMDBhMDAsIDB4MzUzMGM1MDAsIDB4MzUzMTgwMDAsCisgICAgMHgzNTMyM2IwMCwgMHgzNTMyZjYwMCwgMHgzNTMzYjEwMCwgMHgzNTM0NmMwMCwgMHgzNTM1MjcwMCwgMHgzNTM1ZTIwMCwgMHgzNTM2OWQwMCwgMHgzNTM3NTgwMCwgMHgzNTM4MTMwMCwgMHgzNTM4Y2UwMCwgMHgzNTM5ODkwMCwgMHgzNTNhNDQwMCwgMHgzNTNhZmYwMCwgMHgzNTNiYmEwMCwgMHgzNTNjNzUwMCwgMHgzNTNkMzAwMCwKKyAgICAweDM1M2RlYjAwLCAweDM1M2VhNjAwLCAweDM1M2Y2MTAwLCAweDM1NDAxYzAwLCAweDM1NDBkNzAwLCAweDM1NDE5MjAwLCAweDM1NDI0ZDAwLCAweDM1NDMwODAwLCAweDM1NDNjMzAwLCAweDM1NDQ3ZTAwLCAweDM1NDUzOTAwLCAweDM1NDVmNDAwLCAweDM1NDZhZjAwLCAweDM1NDc2YTAwLCAweDM1NDgyNTAwLCAweDM1NDhlMDAwLAorICAgIDB4MzU0OTliMDAsIDB4MzU0YTU2MDAsIDB4MzU0YjExMDAsIDB4MzU0YmNjMDAsIDB4MzU0Yzg3MDAsIDB4MzU0ZDQyMDAsIDB4MzU0ZGZkMDAsIDB4MzU0ZWI4MDAsIDB4MzU0ZjczMDAsIDB4MzU1MDJlMDAsIDB4MzU1MGU5MDAsIDB4MzU1MWE0MDAsIDB4MzU1MjVmMDAsIDB4MzU1MzFhMDAsIDB4MzU1M2Q1MDAsIDB4MzU1NDkwMDAsCisgICAgMHgzNTU1NGIwMCwgMHgzNTU2MDYwMCwgMHgzNTU2YzEwMCwgMHgzNTU3N2MwMCwgMHgzNTU4MzcwMCwgMHgzNTU4ZjIwMCwgMHgzNTU5YWQwMCwgMHgzNTVhNjgwMCwgMHgzNTViMjMwMCwgMHgzNTViZGUwMCwgMHgzNTVjOTkwMCwgMHgzNTVkNTQwMCwgMHgzNTVlMGYwMCwgMHgzNTVlY2EwMCwgMHgzNTVmODUwMCwgMHgzNTYwNDAwMCwKKyAgICAweDM1NjBmYjAwLCAweDM1NjFiNjAwLCAweDM1NjI3MTAwLCAweDM1NjMyYzAwLCAweDM1NjNlNzAwLCAweDM1NjRhMjAwLCAweDM1NjU1ZDAwLCAweDM1NjYxODAwLCAweDM1NjZkMzAwLCAweDM1Njc4ZTAwLCAweDM1Njg0OTAwLCAweDM1NjkwNDAwLCAweDM1NjliZjAwLCAweDM1NmE3YTAwLCAweDM1NmIzNTAwLCAweDM1NmJmMDAwLAorICAgIDB4MzU2Y2FiMDAsIDB4MzU2ZDY2MDAsIDB4MzU2ZTIxMDAsIDB4MzU2ZWRjMDAsIDB4MzU2Zjk3MDAsIDB4MzU3MDUyMDAsIDB4MzU3MTBkMDAsIDB4MzU3MWM4MDAsIDB4MzU3MjgzMDAsIDB4MzU3MzNlMDAsIDB4MzU3M2Y5MDAsIDB4MzU3NGI0MDAsIDB4MzU3NTZmMDAsIDB4MzU3NjJhMDAsIDB4MzU3NmU1MDAsIDB4MzU3N2EwMDAsCisgICAgMHgzNTc4NWIwMCwgMHgzNTc5MTYwMCwgMHgzNTc5ZDEwMCwgMHgzNTdhOGMwMCwgMHgzNTdiNDcwMCwgMHgzNTdjMDIwMCwgMHgzNTdjYmQwMCwgMHgzNTdkNzgwMCwgMHgzNTdlMzMwMCwgMHgzNTdlZWUwMCwgMHgzNTdmYTkwMCwgMHgzNTgwNjQwMCwgMHgzNTgxMWYwMCwgMHgzNTgxZGEwMCwgMHgzNTgyOTUwMCwgMHgzNTgzNTAwMCwKKyAgICAweDM1ODQwYjAwLCAweDM1ODRjNjAwLCAweDM1ODU4MTAwLCAweDM1ODYzYzAwLCAweDM1ODZmNzAwLCAweDM1ODdiMjAwLCAweDM1ODg2ZDAwLCAweDM1ODkyODAwLCAweDM1ODllMzAwLCAweDM1OGE5ZTAwLCAweDM1OGI1OTAwLCAweDM1OGMxNDAwLCAweDM1OGNjZjAwLCAweDM1OGQ4YTAwLCAweDM1OGU0NTAwLCAweDM1OGYwMDAwLAorICAgIDB4MzU4ZmJiMDAsIDB4MzU5MDc2MDAsIDB4MzU5MTMxMDAsIDB4MzU5MWVjMDAsIDB4MzU5MmE3MDAsIDB4MzU5MzYyMDAsIDB4MzU5NDFkMDAsIDB4MzU5NGQ4MDAsIDB4MzU5NTkzMDAsIDB4MzU5NjRlMDAsIDB4MzU5NzA5MDAsIDB4MzU5N2M0MDAsIDB4MzU5ODdmMDAsIDB4MzU5OTNhMDAsIDB4MzU5OWY1MDAsIDB4MzU5YWIwMDAsCisgICAgMHgzNTliNmIwMCwgMHgzNTljMjYwMCwgMHgzNTljZTEwMCwgMHgzNTlkOWMwMCwgMHgzNTllNTcwMCwgMHgzNTlmMTIwMCwgMHgzNTlmY2QwMCwgMHgzNWEwODgwMCwgMHgzNWExNDMwMCwgMHgzNWExZmUwMCwgMHgzNWEyYjkwMCwgMHgzNWEzNzQwMCwgMHgzNWE0MmYwMCwgMHgzNWE0ZWEwMCwgMHgzNWE1YTUwMCwgMHgzNWE2NjAwMCwKKyAgICAweDM1YTcxYjAwLCAweDM1YTdkNjAwLCAweDM1YTg5MTAwLCAweDM1YTk0YzAwLCAweDM1YWEwNzAwLCAweDM1YWFjMjAwLCAweDM1YWI3ZDAwLCAweDM1YWMzODAwLCAweDM1YWNmMzAwLCAweDM1YWRhZTAwLCAweDM1YWU2OTAwLCAweDM1YWYyNDAwLCAweDM1YWZkZjAwLCAweDM1YjA5YTAwLCAweDM1YjE1NTAwLCAweDM1YjIxMDAwLAorICAgIDB4MzViMmNiMDAsIDB4MzViMzg2MDAsIDB4MzViNDQxMDAsIDB4MzViNGZjMDAsIDB4MzViNWI3MDAsIDB4MzViNjcyMDAsIDB4MzViNzJkMDAsIDB4MzViN2U4MDAsIDB4MzViOGEzMDAsIDB4MzViOTVlMDAsIDB4MzViYTE5MDAsIDB4MzViYWQ0MDAsIDB4MzViYjhmMDAsIDB4MzViYzRhMDAsIDB4MzViZDA1MDAsIDB4MzViZGMwMDAsCisgICAgMHgzNWJlN2IwMCwgMHgzNWJmMzYwMCwgMHgzNWJmZjEwMCwgMHgzNWMwYWMwMCwgMHgzNWMxNjcwMCwgMHgzNWMyMjIwMCwgMHgzNWMyZGQwMCwgMHgzNWMzOTgwMCwgMHgzNWM0NTMwMCwgMHgzNWM1MGUwMCwgMHgzNWM1YzkwMCwgMHgzNWM2ODQwMCwgMHgzNWM3M2YwMCwgMHgzNWM3ZmEwMCwgMHgzNWM4YjUwMCwgMHgzNWM5NzAwMCwKKyAgICAweDM1Y2EyYjAwLCAweDM1Y2FlNjAwLCAweDM1Y2JhMTAwLCAweDM1Y2M1YzAwLCAweDM1Y2QxNzAwLCAweDM1Y2RkMjAwLCAweDM1Y2U4ZDAwLCAweDM1Y2Y0ODAwLCAweDM1ZDAwMzAwLCAweDM1ZDBiZTAwLCAweDM1ZDE3OTAwLCAweDM1ZDIzNDAwLCAweDM1ZDJlZjAwLCAweDM1ZDNhYTAwLCAweDM1ZDQ2NTAwLCAweDM1ZDUyMDAwLAorICAgIDB4MzVkNWRiMDAsIDB4MzVkNjk2MDAsIDB4MzVkNzUxMDAsIDB4MzVkODBjMDAsIDB4MzVkOGM3MDAsIDB4MzVkOTgyMDAsIDB4MzVkYTNkMDAsIDB4MzVkYWY4MDAsIDB4MzVkYmIzMDAsIDB4MzVkYzZlMDAsIDB4MzVkZDI5MDAsIDB4MzVkZGU0MDAsIDB4MzVkZTlmMDAsIDB4MzVkZjVhMDAsIDB4MzVlMDE1MDAsIDB4MzVlMGQwMDAsCisgICAgMHgzNWUxOGIwMCwgMHgzNWUyNDYwMCwgMHgzNWUzMDEwMCwgMHgzNWUzYmMwMCwgMHgzNWU0NzcwMCwgMHgzNWU1MzIwMCwgMHgzNWU1ZWQwMCwgMHgzNWU2YTgwMCwgMHgzNWU3NjMwMCwgMHgzNWU4MWUwMCwgMHgzNWU4ZDkwMCwgMHgzNWU5OTQwMCwgMHgzNWVhNGYwMCwgMHgzNWViMGEwMCwgMHgzNWViYzUwMCwgMHgzNWVjODAwMCwKKyAgICAweDM1ZWQzYjAwLCAweDM1ZWRmNjAwLCAweDM1ZWViMTAwLCAweDM1ZWY2YzAwLCAweDM1ZjAyNzAwLCAweDM1ZjBlMjAwLCAweDM1ZjE5ZDAwLCAweDM1ZjI1ODAwLCAweDM1ZjMxMzAwLCAweDM1ZjNjZTAwLCAweDM1ZjQ4OTAwLCAweDM1ZjU0NDAwLCAweDM1ZjVmZjAwLCAweDM1ZjZiYTAwLCAweDM1Zjc3NTAwLCAweDM1ZjgzMDAwLAorICAgIDB4MzVmOGViMDAsIDB4MzVmOWE2MDAsIDB4MzVmYTYxMDAsIDB4MzVmYjFjMDAsIDB4MzVmYmQ3MDAsIDB4MzVmYzkyMDAsIDB4MzVmZDRkMDAsIDB4MzVmZTA4MDAsIDB4MzVmZWMzMDAsIDB4MzVmZjdlMDAsIDB4MzYwMDM5MDAsIDB4MzYwMGY0MDAsIDB4MzYwMWFmMDAsIDB4MzYwMjZhMDAsIDB4MzYwMzI1MDAsIDB4MzYwM2UwMDAsCisgICAgMHgzNjA0OWIwMCwgMHgzNjA1NTYwMCwgMHgzNjA2MTEwMCwgMHgzNjA2Y2MwMCwgMHgzNjA3ODcwMCwgMHgzNjA4NDIwMCwgMHgzNjA4ZmQwMCwgMHgzNjA5YjgwMCwgMHgzNjBhNzMwMCwgMHgzNjBiMmUwMCwgMHgzNjBiZTkwMCwgMHgzNjBjYTQwMCwgMHgzNjBkNWYwMCwgMHgzNjBlMWEwMCwgMHgzNjBlZDUwMCwgMHgzNjBmOTAwMCwKKyAgICAweDM2MTA0YjAwLCAweDM2MTEwNjAwLCAweDM2MTFjMTAwLCAweDM2MTI3YzAwLCAweDM2MTMzNzAwLCAweDM2MTNmMjAwLCAweDM2MTRhZDAwLCAweDM2MTU2ODAwLCAweDM2MTYyMzAwLCAweDM2MTZkZTAwLCAweDM2MTc5OTAwLCAweDM2MTg1NDAwLCAweDM2MTkwZjAwLCAweDM2MTljYTAwLCAweDM2MWE4NTAwLCAweDM2MWI0MDAwLAorICAgIDB4MzYxYmZiMDAsIDB4MzYxY2I2MDAsIDB4MzYxZDcxMDAsIDB4MzYxZTJjMDAsIDB4MzYxZWU3MDAsIDB4MzYxZmEyMDAsIDB4MzYyMDVkMDAsIDB4MzYyMTE4MDAsIDB4MzYyMWQzMDAsIDB4MzYyMjhlMDAsIDB4MzYyMzQ5MDAsIDB4MzYyNDA0MDAsIDB4MzYyNGJmMDAsIDB4MzYyNTdhMDAsIDB4MzYyNjM1MDAsIDB4MzYyNmYwMDAsCisgICAgMHgzNjI3YWIwMCwgMHgzNjI4NjYwMCwgMHgzNjI5MjEwMCwgMHgzNjI5ZGMwMCwgMHgzNjJhOTcwMCwgMHgzNjJiNTIwMCwgMHgzNjJjMGQwMCwgMHgzNjJjYzgwMCwgMHgzNjJkODMwMCwgMHgzNjJlM2UwMCwgMHgzNjJlZjkwMCwgMHgzNjJmYjQwMCwgMHgzNjMwNmYwMCwgMHgzNjMxMmEwMCwgMHgzNjMxZTUwMCwgMHgzNjMyYTAwMCwKKyAgICAweDM2MzM1YjAwLCAweDM2MzQxNjAwLCAweDM2MzRkMTAwLCAweDM2MzU4YzAwLCAweDM2MzY0NzAwLCAweDM2MzcwMjAwLCAweDM2MzdiZDAwLCAweDM2Mzg3ODAwLCAweDM2MzkzMzAwLCAweDM2MzllZTAwLCAweDM2M2FhOTAwLCAweDM2M2I2NDAwLCAweDM2M2MxZjAwLCAweDM2M2NkYTAwLCAweDM2M2Q5NTAwLCAweDM2M2U1MDAwLAorICAgIDB4MzYzZjBiMDAsIDB4MzYzZmM2MDAsIDB4MzY0MDgxMDAsIDB4MzY0MTNjMDAsIDB4MzY0MWY3MDAsIDB4MzY0MmIyMDAsIDB4MzY0MzZkMDAsIDB4MzY0NDI4MDAsIDB4MzY0NGUzMDAsIDB4MzY0NTllMDAsIDB4MzY0NjU5MDAsIDB4MzY0NzE0MDAsIDB4MzY0N2NmMDAsIDB4MzY0ODhhMDAsIDB4MzY0OTQ1MDAsIDB4MzY0YTAwMDAsCisgICAgMHgzNjRhYzAwMCwgMHgzNjRiODAwMCwgMHgzNjRjNDAwMCwgMHgzNjRkMDAwMCwgMHgzNjRkYzAwMCwgMHgzNjRlODAwMCwgMHgzNjRmNDAwMCwgMHgzNjUwMDAwMCwgMHgzNjUwYzAwMCwgMHgzNjUxODAwMCwgMHgzNjUyNDAwMCwgMHgzNjUzMDAwMCwgMHgzNjUzYzAwMCwgMHgzNjU0ODAwMCwgMHgzNjU1NDAwMCwgMHgzNjU2MDAwMCwKKyAgICAweDM2NTZjMDAwLCAweDM2NTc4MDAwLCAweDM2NTg0MDAwLCAweDM2NTkwMDAwLCAweDM2NTljMDAwLCAweDM2NWE4MDAwLCAweDM2NWI0MDAwLCAweDM2NWMwMDAwLCAweDM2NWNjMDAwLCAweDM2NWQ4MDAwLCAweDM2NWU0MDAwLCAweDM2NWYwMDAwLCAweDM2NWZjMDAwLCAweDM2NjA4MDAwLCAweDM2NjE0MDAwLCAweDM2NjIwMDAwLAorICAgIDB4MzY2MmMwMDAsIDB4MzY2MzgwMDAsIDB4MzY2NDQwMDAsIDB4MzY2NTAwMDAsIDB4MzY2NWMwMDAsIDB4MzY2NjgwMDAsIDB4MzY2NzQwMDAsIDB4MzY2ODAwMDAsIDB4MzY2OGMwMDAsIDB4MzY2OTgwMDAsIDB4MzY2YTQwMDAsIDB4MzY2YjAwMDAsIDB4MzY2YmMwMDAsIDB4MzY2YzgwMDAsIDB4MzY2ZDQwMDAsIDB4MzY2ZTAwMDAsCisgICAgMHgzNjZlYzAwMCwgMHgzNjZmODAwMCwgMHgzNjcwNDAwMCwgMHgzNjcxMDAwMCwgMHgzNjcxYzAwMCwgMHgzNjcyODAwMCwgMHgzNjczNDAwMCwgMHgzNjc0MDAwMCwgMHgzNjc0YzAwMCwgMHgzNjc1ODAwMCwgMHgzNjc2NDAwMCwgMHgzNjc3MDAwMCwgMHgzNjc3YzAwMCwgMHgzNjc4ODAwMCwgMHgzNjc5NDAwMCwgMHgzNjdhMDAwMCwKKyAgICAweDM2N2FjMDAwLCAweDM2N2I4MDAwLCAweDM2N2M0MDAwLCAweDM2N2QwMDAwLCAweDM2N2RjMDAwLCAweDM2N2U4MDAwLCAweDM2N2Y0MDAwLCAweDM2ODAwMDAwLCAweDM2ODBjMDAwLCAweDM2ODE4MDAwLCAweDM2ODI0MDAwLCAweDM2ODMwMDAwLCAweDM2ODNjMDAwLCAweDM2ODQ4MDAwLCAweDM2ODU0MDAwLCAweDM2ODYwMDAwLAorICAgIDB4MzY4NmMwMDAsIDB4MzY4NzgwMDAsIDB4MzY4ODQwMDAsIDB4MzY4OTAwMDAsIDB4MzY4OWMwMDAsIDB4MzY4YTgwMDAsIDB4MzY4YjQwMDAsIDB4MzY4YzAwMDAsIDB4MzY4Y2MwMDAsIDB4MzY4ZDgwMDAsIDB4MzY4ZTQwMDAsIDB4MzY4ZjAwMDAsIDB4MzY4ZmMwMDAsIDB4MzY5MDgwMDAsIDB4MzY5MTQwMDAsIDB4MzY5MjAwMDAsCisgICAgMHgzNjkyYzAwMCwgMHgzNjkzODAwMCwgMHgzNjk0NDAwMCwgMHgzNjk1MDAwMCwgMHgzNjk1YzAwMCwgMHgzNjk2ODAwMCwgMHgzNjk3NDAwMCwgMHgzNjk4MDAwMCwgMHgzNjk4YzAwMCwgMHgzNjk5ODAwMCwgMHgzNjlhNDAwMCwgMHgzNjliMDAwMCwgMHgzNjliYzAwMCwgMHgzNjljODAwMCwgMHgzNjlkNDAwMCwgMHgzNjllMDAwMCwKKyAgICAweDM2OWVjMDAwLCAweDM2OWY4MDAwLCAweDM2YTA0MDAwLCAweDM2YTEwMDAwLCAweDM2YTFjMDAwLCAweDM2YTI4MDAwLCAweDM2YTM0MDAwLCAweDM2YTQwMDAwLCAweDM2YTRjMDAwLCAweDM2YTU4MDAwLCAweDM2YTY0MDAwLCAweDM2YTcwMDAwLCAweDM2YTdjMDAwLCAweDM2YTg4MDAwLCAweDM2YTk0MDAwLCAweDM2YWEwMDAwLAorICAgIDB4MzZhYWMwMDAsIDB4MzZhYjgwMDAsIDB4MzZhYzQwMDAsIDB4MzZhZDAwMDAsIDB4MzZhZGMwMDAsIDB4MzZhZTgwMDAsIDB4MzZhZjQwMDAsIDB4MzZiMDAwMDAsIDB4MzZiMGMwMDAsIDB4MzZiMTgwMDAsIDB4MzZiMjQwMDAsIDB4MzZiMzAwMDAsIDB4MzZiM2MwMDAsIDB4MzZiNDgwMDAsIDB4MzZiNTQwMDAsIDB4MzZiNjAwMDAsCisgICAgMHgzNmI2YzAwMCwgMHgzNmI3ODAwMCwgMHgzNmI4NDAwMCwgMHgzNmI5MDAwMCwgMHgzNmI5YzAwMCwgMHgzNmJhODAwMCwgMHgzNmJiNDAwMCwgMHgzNmJjMDAwMCwgMHgzNmJjYzAwMCwgMHgzNmJkODAwMCwgMHgzNmJlNDAwMCwgMHgzNmJmMDAwMCwgMHgzNmJmYzAwMCwgMHgzNmMwODAwMCwgMHgzNmMxNDAwMCwgMHgzNmMyMDAwMCwKKyAgICAweDM2YzJjMDAwLCAweDM2YzM4MDAwLCAweDM2YzQ0MDAwLCAweDM2YzUwMDAwLCAweDM2YzVjMDAwLCAweDM2YzY4MDAwLCAweDM2Yzc0MDAwLCAweDM2YzgwMDAwLCAweDM2YzhjMDAwLCAweDM2Yzk4MDAwLCAweDM2Y2E0MDAwLCAweDM2Y2IwMDAwLCAweDM2Y2JjMDAwLCAweDM2Y2M4MDAwLCAweDM2Y2Q0MDAwLCAweDM2Y2UwMDAwLAorICAgIDB4MzZjZWMwMDAsIDB4MzZjZjgwMDAsIDB4MzZkMDQwMDAsIDB4MzZkMTAwMDAsIDB4MzZkMWMwMDAsIDB4MzZkMjgwMDAsIDB4MzZkMzQwMDAsIDB4MzZkNDAwMDAsIDB4MzZkNGMwMDAsIDB4MzZkNTgwMDAsIDB4MzZkNjQwMDAsIDB4MzZkNzAwMDAsIDB4MzZkN2MwMDAsIDB4MzZkODgwMDAsIDB4MzZkOTQwMDAsIDB4MzZkYTAwMDAsCisgICAgMHgzNmRhYzAwMCwgMHgzNmRiODAwMCwgMHgzNmRjNDAwMCwgMHgzNmRkMDAwMCwgMHgzNmRkYzAwMCwgMHgzNmRlODAwMCwgMHgzNmRmNDAwMCwgMHgzNmUwMDAwMCwgMHgzNmUwYzAwMCwgMHgzNmUxODAwMCwgMHgzNmUyNDAwMCwgMHgzNmUzMDAwMCwgMHgzNmUzYzAwMCwgMHgzNmU0ODAwMCwgMHgzNmU1NDAwMCwgMHgzNmU2MDAwMCwKKyAgICAweDM2ZTZjMDAwLCAweDM2ZTc4MDAwLCAweDM2ZTg0MDAwLCAweDM2ZTkwMDAwLCAweDM2ZTljMDAwLCAweDM2ZWE4MDAwLCAweDM2ZWI0MDAwLCAweDM2ZWMwMDAwLCAweDM2ZWNjMDAwLCAweDM2ZWQ4MDAwLCAweDM2ZWU0MDAwLCAweDM2ZWYwMDAwLCAweDM2ZWZjMDAwLCAweDM2ZjA4MDAwLCAweDM2ZjE0MDAwLCAweDM2ZjIwMDAwLAorICAgIDB4MzZmMmMwMDAsIDB4MzZmMzgwMDAsIDB4MzZmNDQwMDAsIDB4MzZmNTAwMDAsIDB4MzZmNWMwMDAsIDB4MzZmNjgwMDAsIDB4MzZmNzQwMDAsIDB4MzZmODAwMDAsIDB4MzZmOGMwMDAsIDB4MzZmOTgwMDAsIDB4MzZmYTQwMDAsIDB4MzZmYjAwMDAsIDB4MzZmYmMwMDAsIDB4MzZmYzgwMDAsIDB4MzZmZDQwMDAsIDB4MzZmZTAwMDAsCisgICAgMHgzNmZlYzAwMCwgMHgzNmZmODAwMCwgMHgzNzAwNDAwMCwgMHgzNzAxMDAwMCwgMHgzNzAxYzAwMCwgMHgzNzAyODAwMCwgMHgzNzAzNDAwMCwgMHgzNzA0MDAwMCwgMHgzNzA0YzAwMCwgMHgzNzA1ODAwMCwgMHgzNzA2NDAwMCwgMHgzNzA3MDAwMCwgMHgzNzA3YzAwMCwgMHgzNzA4ODAwMCwgMHgzNzA5NDAwMCwgMHgzNzBhMDAwMCwKKyAgICAweDM3MGFjMDAwLCAweDM3MGI4MDAwLCAweDM3MGM0MDAwLCAweDM3MGQwMDAwLCAweDM3MGRjMDAwLCAweDM3MGU4MDAwLCAweDM3MGY0MDAwLCAweDM3MTAwMDAwLCAweDM3MTBjMDAwLCAweDM3MTE4MDAwLCAweDM3MTI0MDAwLCAweDM3MTMwMDAwLCAweDM3MTNjMDAwLCAweDM3MTQ4MDAwLCAweDM3MTU0MDAwLCAweDM3MTYwMDAwLAorICAgIDB4MzcxNmMwMDAsIDB4MzcxNzgwMDAsIDB4MzcxODQwMDAsIDB4MzcxOTAwMDAsIDB4MzcxOWMwMDAsIDB4MzcxYTgwMDAsIDB4MzcxYjQwMDAsIDB4MzcxYzAwMDAsIDB4MzcxY2MwMDAsIDB4MzcxZDgwMDAsIDB4MzcxZTQwMDAsIDB4MzcxZjAwMDAsIDB4MzcxZmMwMDAsIDB4MzcyMDgwMDAsIDB4MzcyMTQwMDAsIDB4MzcyMjAwMDAsCisgICAgMHgzNzIyYzAwMCwgMHgzNzIzODAwMCwgMHgzNzI0NDAwMCwgMHgzNzI1MDAwMCwgMHgzNzI1YzAwMCwgMHgzNzI2ODAwMCwgMHgzNzI3NDAwMCwgMHgzNzI4MDAwMCwgMHgzNzI4YzAwMCwgMHgzNzI5ODAwMCwgMHgzNzJhNDAwMCwgMHgzNzJiMDAwMCwgMHgzNzJiYzAwMCwgMHgzNzJjODAwMCwgMHgzNzJkNDAwMCwgMHgzNzJlMDAwMCwKKyAgICAweDM3MmVjMDAwLCAweDM3MmY4MDAwLCAweDM3MzA0MDAwLCAweDM3MzEwMDAwLCAweDM3MzFjMDAwLCAweDM3MzI4MDAwLCAweDM3MzM0MDAwLCAweDM3MzQwMDAwLCAweDM3MzRjMDAwLCAweDM3MzU4MDAwLCAweDM3MzY0MDAwLCAweDM3MzcwMDAwLCAweDM3MzdjMDAwLCAweDM3Mzg4MDAwLCAweDM3Mzk0MDAwLCAweDM3M2EwMDAwLAorICAgIDB4MzczYWMwMDAsIDB4MzczYjgwMDAsIDB4MzczYzQwMDAsIDB4MzczZDAwMDAsIDB4MzczZGMwMDAsIDB4MzczZTgwMDAsIDB4MzczZjQwMDAsIDB4Mzc0MDAwMDAsIDB4Mzc0MGMwMDAsIDB4Mzc0MTgwMDAsIDB4Mzc0MjQwMDAsIDB4Mzc0MzAwMDAsIDB4Mzc0M2MwMDAsIDB4Mzc0NDgwMDAsIDB4Mzc0NTQwMDAsIDB4Mzc0NjAwMDAsCisgICAgMHgzNzQ2YzAwMCwgMHgzNzQ3ODAwMCwgMHgzNzQ4NDAwMCwgMHgzNzQ5MDAwMCwgMHgzNzQ5YzAwMCwgMHgzNzRhODAwMCwgMHgzNzRiNDAwMCwgMHgzNzRjMDAwMCwgMHgzNzRjYzAwMCwgMHgzNzRkODAwMCwgMHgzNzRlNDAwMCwgMHgzNzRmMDAwMCwgMHgzNzRmYzAwMCwgMHgzNzUwODAwMCwgMHgzNzUxNDAwMCwgMHgzNzUyMDAwMCwKKyAgICAweDM3NTJjMDAwLCAweDM3NTM4MDAwLCAweDM3NTQ0MDAwLCAweDM3NTUwMDAwLCAweDM3NTVjMDAwLCAweDM3NTY4MDAwLCAweDM3NTc0MDAwLCAweDM3NTgwMDAwLCAweDM3NThjMDAwLCAweDM3NTk4MDAwLCAweDM3NWE0MDAwLCAweDM3NWIwMDAwLCAweDM3NWJjMDAwLCAweDM3NWM4MDAwLCAweDM3NWQ0MDAwLCAweDM3NWUwMDAwLAorICAgIDB4Mzc1ZWMwMDAsIDB4Mzc1ZjgwMDAsIDB4Mzc2MDQwMDAsIDB4Mzc2MTAwMDAsIDB4Mzc2MWMwMDAsIDB4Mzc2MjgwMDAsIDB4Mzc2MzQwMDAsIDB4Mzc2NDAwMDAsIDB4Mzc2NGMwMDAsIDB4Mzc2NTgwMDAsIDB4Mzc2NjQwMDAsIDB4Mzc2NzAwMDAsIDB4Mzc2N2MwMDAsIDB4Mzc2ODgwMDAsIDB4Mzc2OTQwMDAsIDB4Mzc2YTAwMDAsCisgICAgMHgzNzZhYzAwMCwgMHgzNzZiODAwMCwgMHgzNzZjNDAwMCwgMHgzNzZkMDAwMCwgMHgzNzZkYzAwMCwgMHgzNzZlODAwMCwgMHgzNzZmNDAwMCwgMHgzNzcwMDAwMCwgMHgzNzcwYzAwMCwgMHgzNzcxODAwMCwgMHgzNzcyNDAwMCwgMHgzNzczMDAwMCwgMHgzNzczYzAwMCwgMHgzNzc0ODAwMCwgMHgzNzc1NDAwMCwgMHgzNzc2MDAwMCwKKyAgICAweDM3NzZjMDAwLCAweDM3Nzc4MDAwLCAweDM3Nzg0MDAwLCAweDM3NzkwMDAwLCAweDM3NzljMDAwLCAweDM3N2E4MDAwLCAweDM3N2I0MDAwLCAweDM3N2MwMDAwLCAweDM3N2NjMDAwLCAweDM3N2Q4MDAwLCAweDM3N2U0MDAwLCAweDM3N2YwMDAwLCAweDM3N2ZjMDAwLCAweDM3ODA4MDAwLCAweDM3ODE0MDAwLCAweDM3ODIwMDAwLAorICAgIDB4Mzc4MmMwMDAsIDB4Mzc4MzgwMDAsIDB4Mzc4NDQwMDAsIDB4Mzc4NTAwMDAsIDB4Mzc4NWMwMDAsIDB4Mzc4NjgwMDAsIDB4Mzc4NzQwMDAsIDB4Mzc4ODAwMDAsIDB4Mzc4OGMwMDAsIDB4Mzc4OTgwMDAsIDB4Mzc4YTQwMDAsIDB4Mzc4YjAwMDAsIDB4Mzc4YmMwMDAsIDB4Mzc4YzgwMDAsIDB4Mzc4ZDQwMDAsIDB4Mzc4ZTAwMDAsCisgICAgMHgzNzhlYzAwMCwgMHgzNzhmODAwMCwgMHgzNzkwNDAwMCwgMHgzNzkxMDAwMCwgMHgzNzkxYzAwMCwgMHgzNzkyODAwMCwgMHgzNzkzNDAwMCwgMHgzNzk0MDAwMCwgMHgzNzk0YzAwMCwgMHgzNzk1ODAwMCwgMHgzNzk2NDAwMCwgMHgzNzk3MDAwMCwgMHgzNzk3YzAwMCwgMHgzNzk4ODAwMCwgMHgzNzk5NDAwMCwgMHgzNzlhMDAwMCwKKyAgICAweDM3OWFjMDAwLCAweDM3OWI4MDAwLCAweDM3OWM0MDAwLCAweDM3OWQwMDAwLCAweDM3OWRjMDAwLCAweDM3OWU4MDAwLCAweDM3OWY0MDAwLCAweDM3YTAwMDAwLCAweDM3YTBjMDAwLCAweDM3YTE4MDAwLCAweDM3YTI0MDAwLCAweDM3YTMwMDAwLCAweDM3YTNjMDAwLCAweDM3YTQ4MDAwLCAweDM3YTU0MDAwLCAweDM3YTYwMDAwLAorICAgIDB4MzdhNmMwMDAsIDB4MzdhNzgwMDAsIDB4MzdhODQwMDAsIDB4MzdhOTAwMDAsIDB4MzdhOWMwMDAsIDB4MzdhYTgwMDAsIDB4MzdhYjQwMDAsIDB4MzdhYzAwMDAsIDB4MzdhY2MwMDAsIDB4MzdhZDgwMDAsIDB4MzdhZTQwMDAsIDB4MzdhZjAwMDAsIDB4MzdhZmMwMDAsIDB4MzdiMDgwMDAsIDB4MzdiMTQwMDAsIDB4MzdiMjAwMDAsCisgICAgMHgzN2IyYzAwMCwgMHgzN2IzODAwMCwgMHgzN2I0NDAwMCwgMHgzN2I1MDAwMCwgMHgzN2I1YzAwMCwgMHgzN2I2ODAwMCwgMHgzN2I3NDAwMCwgMHgzN2I4MDAwMCwgMHgzN2I4YzAwMCwgMHgzN2I5ODAwMCwgMHgzN2JhNDAwMCwgMHgzN2JiMDAwMCwgMHgzN2JiYzAwMCwgMHgzN2JjODAwMCwgMHgzN2JkNDAwMCwgMHgzN2JlMDAwMCwKKyAgICAweDM3YmVjMDAwLCAweDM3YmY4MDAwLCAweDM3YzA0MDAwLCAweDM3YzEwMDAwLCAweDM3YzFjMDAwLCAweDM3YzI4MDAwLCAweDM3YzM0MDAwLCAweDM3YzQwMDAwLCAweDM3YzRjMDAwLCAweDM3YzU4MDAwLCAweDM3YzY0MDAwLCAweDM3YzcwMDAwLCAweDM3YzdjMDAwLCAweDM3Yzg4MDAwLCAweDM3Yzk0MDAwLCAweDM3Y2EwMDAwLAorICAgIDB4MzdjYWQ4MDAsIDB4MzdjYmIwMDAsIDB4MzdjYzg4MDAsIDB4MzdjZDYwMDAsIDB4MzdjZTM4MDAsIDB4MzdjZjEwMDAsIDB4MzdjZmU4MDAsIDB4MzdkMGMwMDAsIDB4MzdkMTk4MDAsIDB4MzdkMjcwMDAsIDB4MzdkMzQ4MDAsIDB4MzdkNDIwMDAsIDB4MzdkNGY4MDAsIDB4MzdkNWQwMDAsIDB4MzdkNmE4MDAsIDB4MzdkNzgwMDAsCisgICAgMHgzN2Q4NTgwMCwgMHgzN2Q5MzAwMCwgMHgzN2RhMDgwMCwgMHgzN2RhZTAwMCwgMHgzN2RiYjgwMCwgMHgzN2RjOTAwMCwgMHgzN2RkNjgwMCwgMHgzN2RlNDAwMCwgMHgzN2RmMTgwMCwgMHgzN2RmZjAwMCwgMHgzN2UwYzgwMCwgMHgzN2UxYTAwMCwgMHgzN2UyNzgwMCwgMHgzN2UzNTAwMCwgMHgzN2U0MjgwMCwgMHgzN2U1MDAwMCwKKyAgICAweDM3ZTVkODAwLCAweDM3ZTZiMDAwLCAweDM3ZTc4ODAwLCAweDM3ZTg2MDAwLCAweDM3ZTkzODAwLCAweDM3ZWExMDAwLCAweDM3ZWFlODAwLCAweDM3ZWJjMDAwLCAweDM3ZWM5ODAwLCAweDM3ZWQ3MDAwLCAweDM3ZWU0ODAwLCAweDM3ZWYyMDAwLCAweDM3ZWZmODAwLCAweDM3ZjBkMDAwLCAweDM3ZjFhODAwLCAweDM3ZjI4MDAwLAorICAgIDB4MzdmMzU4MDAsIDB4MzdmNDMwMDAsIDB4MzdmNTA4MDAsIDB4MzdmNWUwMDAsIDB4MzdmNmI4MDAsIDB4MzdmNzkwMDAsIDB4MzdmODY4MDAsIDB4MzdmOTQwMDAsIDB4MzdmYTE4MDAsIDB4MzdmYWYwMDAsIDB4MzdmYmM4MDAsIDB4MzdmY2EwMDAsIDB4MzdmZDc4MDAsIDB4MzdmZTUwMDAsIDB4MzdmZjI4MDAsIDB4MzgwMDAwMDAsCisgICAgMHgzODAwZDgwMCwgMHgzODAxYjAwMCwgMHgzODAyODgwMCwgMHgzODAzNjAwMCwgMHgzODA0MzgwMCwgMHgzODA1MTAwMCwgMHgzODA1ZTgwMCwgMHgzODA2YzAwMCwgMHgzODA3OTgwMCwgMHgzODA4NzAwMCwgMHgzODA5NDgwMCwgMHgzODBhMjAwMCwgMHgzODBhZjgwMCwgMHgzODBiZDAwMCwgMHgzODBjYTgwMCwgMHgzODBkODAwMCwKKyAgICAweDM4MGU1ODAwLCAweDM4MGYzMDAwLCAweDM4MTAwODAwLCAweDM4MTBlMDAwLCAweDM4MTFiODAwLCAweDM4MTI5MDAwLCAweDM4MTM2ODAwLCAweDM4MTQ0MDAwLCAweDM4MTUxODAwLCAweDM4MTVmMDAwLCAweDM4MTZjODAwLCAweDM4MTdhMDAwLCAweDM4MTg3ODAwLCAweDM4MTk1MDAwLCAweDM4MWEyODAwLCAweDM4MWIwMDAwLAorICAgIDB4MzgxYmQ4MDAsIDB4MzgxY2IwMDAsIDB4MzgxZDg4MDAsIDB4MzgxZTYwMDAsIDB4MzgxZjM4MDAsIDB4MzgyMDEwMDAsIDB4MzgyMGU4MDAsIDB4MzgyMWMwMDAsIDB4MzgyMjk4MDAsIDB4MzgyMzcwMDAsIDB4MzgyNDQ4MDAsIDB4MzgyNTIwMDAsIDB4MzgyNWY4MDAsIDB4MzgyNmQwMDAsIDB4MzgyN2E4MDAsIDB4MzgyODgwMDAsCisgICAgMHgzODI5NTgwMCwgMHgzODJhMzAwMCwgMHgzODJiMDgwMCwgMHgzODJiZTAwMCwgMHgzODJjYjgwMCwgMHgzODJkOTAwMCwgMHgzODJlNjgwMCwgMHgzODJmNDAwMCwgMHgzODMwMTgwMCwgMHgzODMwZjAwMCwgMHgzODMxYzgwMCwgMHgzODMyYTAwMCwgMHgzODMzNzgwMCwgMHgzODM0NTAwMCwgMHgzODM1MjgwMCwgMHgzODM2MDAwMCwKKyAgICAweDM4MzZkODAwLCAweDM4MzdiMDAwLCAweDM4Mzg4ODAwLCAweDM4Mzk2MDAwLCAweDM4M2EzODAwLCAweDM4M2IxMDAwLCAweDM4M2JlODAwLCAweDM4M2NjMDAwLCAweDM4M2Q5ODAwLCAweDM4M2U3MDAwLCAweDM4M2Y0ODAwLCAweDM4NDAyMDAwLCAweDM4NDBmODAwLCAweDM4NDFkMDAwLCAweDM4NDJhODAwLCAweDM4NDM4MDAwLAorICAgIDB4Mzg0NDU4MDAsIDB4Mzg0NTMwMDAsIDB4Mzg0NjA4MDAsIDB4Mzg0NmUwMDAsIDB4Mzg0N2I4MDAsIDB4Mzg0ODkwMDAsIDB4Mzg0OTY4MDAsIDB4Mzg0YTQwMDAsIDB4Mzg0YjE4MDAsIDB4Mzg0YmYwMDAsIDB4Mzg0Y2M4MDAsIDB4Mzg0ZGEwMDAsIDB4Mzg0ZTc4MDAsIDB4Mzg0ZjUwMDAsIDB4Mzg1MDI4MDAsIDB4Mzg1MTAwMDAsCisgICAgMHgzODUxZDgwMCwgMHgzODUyYjAwMCwgMHgzODUzODgwMCwgMHgzODU0NjAwMCwgMHgzODU1MzgwMCwgMHgzODU2MTAwMCwgMHgzODU2ZTgwMCwgMHgzODU3YzAwMCwgMHgzODU4OTgwMCwgMHgzODU5NzAwMCwgMHgzODVhNDgwMCwgMHgzODViMjAwMCwgMHgzODViZjgwMCwgMHgzODVjZDAwMCwgMHgzODVkYTgwMCwgMHgzODVlODAwMCwKKyAgICAweDM4NWY1ODAwLCAweDM4NjAzMDAwLCAweDM4NjEwODAwLCAweDM4NjFlMDAwLCAweDM4NjJiODAwLCAweDM4NjM5MDAwLCAweDM4NjQ2ODAwLCAweDM4NjU0MDAwLCAweDM4NjYxODAwLCAweDM4NjZmMDAwLCAweDM4NjdjODAwLCAweDM4NjhhMDAwLCAweDM4Njk3ODAwLCAweDM4NmE1MDAwLCAweDM4NmIyODAwLCAweDM4NmMwMDAwLAorICAgIDB4Mzg2Y2Q3MDAsIDB4Mzg2ZGFmMDAsIDB4Mzg2ZTg3MDAsIDB4Mzg2ZjVmMDAsIDB4Mzg3MDM3MDAsIDB4Mzg3MTBmMDAsIDB4Mzg3MWU3MDAsIDB4Mzg3MmJmMDAsIDB4Mzg3Mzk3MDAsIDB4Mzg3NDZmMDAsIDB4Mzg3NTQ3MDAsIDB4Mzg3NjFmMDAsIDB4Mzg3NmY3MDAsIDB4Mzg3N2NmMDAsIDB4Mzg3OGE3MDAsIDB4Mzg3OTdmMDAsCisgICAgMHgzODdhNTcwMCwgMHgzODdiMmYwMCwgMHgzODdjMDcwMCwgMHgzODdjZGYwMCwgMHgzODdkYjcwMCwgMHgzODdlOGYwMCwgMHgzODdmNjcwMCwgMHgzODgwM2YwMCwgMHgzODgxMTcwMCwgMHgzODgxZWYwMCwgMHgzODgyYzcwMCwgMHgzODgzOWYwMCwgMHgzODg0NzcwMCwgMHgzODg1NGYwMCwgMHgzODg2MjcwMCwgMHgzODg2ZmYwMCwKKyAgICAweDM4ODdkNzAwLCAweDM4ODhhZjAwLCAweDM4ODk4NzAwLCAweDM4OGE1ZjAwLCAweDM4OGIzNzAwLCAweDM4OGMwZjAwLCAweDM4OGNlNzAwLCAweDM4OGRiZjAwLCAweDM4OGU5NzAwLCAweDM4OGY2ZjAwLCAweDM4OTA0NzAwLCAweDM4OTExZjAwLCAweDM4OTFmNzAwLCAweDM4OTJjZjAwLCAweDM4OTNhNzAwLCAweDM4OTQ3ZjAwLAorICAgIDB4Mzg5NTU3MDAsIDB4Mzg5NjJmMDAsIDB4Mzg5NzA3MDAsIDB4Mzg5N2RmMDAsIDB4Mzg5OGI3MDAsIDB4Mzg5OThmMDAsIDB4Mzg5YTY3MDAsIDB4Mzg5YjNmMDAsIDB4Mzg5YzE3MDAsIDB4Mzg5Y2VmMDAsIDB4Mzg5ZGM3MDAsIDB4Mzg5ZTlmMDAsIDB4Mzg5Zjc3MDAsIDB4MzhhMDRmMDAsIDB4MzhhMTI3MDAsIDB4MzhhMWZmMDAsCisgICAgMHgzOGEyZDcwMCwgMHgzOGEzYWYwMCwgMHgzOGE0ODcwMCwgMHgzOGE1NWYwMCwgMHgzOGE2MzcwMCwgMHgzOGE3MGYwMCwgMHgzOGE3ZTcwMCwgMHgzOGE4YmYwMCwgMHgzOGE5OTcwMCwgMHgzOGFhNmYwMCwgMHgzOGFiNDcwMCwgMHgzOGFjMWYwMCwgMHgzOGFjZjcwMCwgMHgzOGFkY2YwMCwgMHgzOGFlYTcwMCwgMHgzOGFmN2YwMCwKKyAgICAweDM4YjA1NzAwLCAweDM4YjEyZjAwLCAweDM4YjIwNzAwLCAweDM4YjJkZjAwLCAweDM4YjNiNzAwLCAweDM4YjQ4ZjAwLCAweDM4YjU2NzAwLCAweDM4YjYzZjAwLCAweDM4YjcxNzAwLCAweDM4YjdlZjAwLCAweDM4YjhjNzAwLCAweDM4Yjk5ZjAwLCAweDM4YmE3NzAwLCAweDM4YmI0ZjAwLCAweDM4YmMyNzAwLCAweDM4YmNmZjAwLAorICAgIDB4MzhiZGQ3MDAsIDB4MzhiZWFmMDAsIDB4MzhiZjg3MDAsIDB4MzhjMDVmMDAsIDB4MzhjMTM3MDAsIDB4MzhjMjBmMDAsIDB4MzhjMmU3MDAsIDB4MzhjM2JmMDAsIDB4MzhjNDk3MDAsIDB4MzhjNTZmMDAsIDB4MzhjNjQ3MDAsIDB4MzhjNzFmMDAsIDB4MzhjN2Y3MDAsIDB4MzhjOGNmMDAsIDB4MzhjOWE3MDAsIDB4MzhjYTdmMDAsCisgICAgMHgzOGNiNTcwMCwgMHgzOGNjMmYwMCwgMHgzOGNkMDcwMCwgMHgzOGNkZGYwMCwgMHgzOGNlYjcwMCwgMHgzOGNmOGYwMCwgMHgzOGQwNjcwMCwgMHgzOGQxM2YwMCwgMHgzOGQyMTcwMCwgMHgzOGQyZWYwMCwgMHgzOGQzYzcwMCwgMHgzOGQ0OWYwMCwgMHgzOGQ1NzcwMCwgMHgzOGQ2NGYwMCwgMHgzOGQ3MjcwMCwgMHgzOGQ3ZmYwMCwKKyAgICAweDM4ZDhkNzAwLCAweDM4ZDlhZjAwLCAweDM4ZGE4NzAwLCAweDM4ZGI1ZjAwLCAweDM4ZGMzNzAwLCAweDM4ZGQwZjAwLCAweDM4ZGRlNzAwLCAweDM4ZGViZjAwLCAweDM4ZGY5NzAwLCAweDM4ZTA2ZjAwLCAweDM4ZTE0NzAwLCAweDM4ZTIxZjAwLCAweDM4ZTJmNzAwLCAweDM4ZTNjZjAwLCAweDM4ZTRhNzAwLCAweDM4ZTU3ZjAwLAorICAgIDB4MzhlNjU3MDAsIDB4MzhlNzJmMDAsIDB4MzhlODA3MDAsIDB4MzhlOGRmMDAsIDB4MzhlOWI3MDAsIDB4MzhlYThmMDAsIDB4MzhlYjY3MDAsIDB4MzhlYzNmMDAsIDB4MzhlZDE3MDAsIDB4MzhlZGVmMDAsIDB4MzhlZWM3MDAsIDB4MzhlZjlmMDAsIDB4MzhmMDc3MDAsIDB4MzhmMTRmMDAsIDB4MzhmMjI3MDAsIDB4MzhmMmZmMDAsCisgICAgMHgzOGYzZDcwMCwgMHgzOGY0YWYwMCwgMHgzOGY1ODcwMCwgMHgzOGY2NWYwMCwgMHgzOGY3MzcwMCwgMHgzOGY4MGYwMCwgMHgzOGY4ZTcwMCwgMHgzOGY5YmYwMCwgMHgzOGZhOTcwMCwgMHgzOGZiNmYwMCwgMHgzOGZjNDcwMCwgMHgzOGZkMWYwMCwgMHgzOGZkZjcwMCwgMHgzOGZlY2YwMCwgMHgzOGZmYTcwMCwgMHgzOTAwN2YwMCwKKyAgICAweDM5MDE1NzAwLCAweDM5MDIyZjAwLCAweDM5MDMwNzAwLCAweDM5MDNkZjAwLCAweDM5MDRiNzAwLCAweDM5MDU4ZjAwLCAweDM5MDY2NzAwLCAweDM5MDczZjAwLCAweDM5MDgxNzAwLCAweDM5MDhlZjAwLCAweDM5MDljNzAwLCAweDM5MGE5ZjAwLCAweDM5MGI3NzAwLCAweDM5MGM0ZjAwLCAweDM5MGQyNzAwLCAweDM5MGRmZjAwLAorICAgIDB4MzkwZWQ3MDAsIDB4MzkwZmFmMDAsIDB4MzkxMDg3MDAsIDB4MzkxMTVmMDAsIDB4MzkxMjM3MDAsIDB4MzkxMzBmMDAsIDB4MzkxM2U3MDAsIDB4MzkxNGJmMDAsIDB4MzkxNTk3MDAsIDB4MzkxNjZmMDAsIDB4MzkxNzQ3MDAsIDB4MzkxODFmMDAsIDB4MzkxOGY3MDAsIDB4MzkxOWNmMDAsIDB4MzkxYWE3MDAsIDB4MzkxYjdmMDAsCisgICAgMHgzOTFjNTcwMCwgMHgzOTFkMmYwMCwgMHgzOTFlMDcwMCwgMHgzOTFlZGYwMCwgMHgzOTFmYjcwMCwgMHgzOTIwOGYwMCwgMHgzOTIxNjcwMCwgMHgzOTIyM2YwMCwgMHgzOTIzMTcwMCwgMHgzOTIzZWYwMCwgMHgzOTI0YzcwMCwgMHgzOTI1OWYwMCwgMHgzOTI2NzcwMCwgMHgzOTI3NGYwMCwgMHgzOTI4MjcwMCwgMHgzOTI4ZmYwMCwKKyAgICAweDM5MjlkNzAwLCAweDM5MmFhZjAwLCAweDM5MmI4NzAwLCAweDM5MmM1ZjAwLCAweDM5MmQzNzAwLCAweDM5MmUwZjAwLCAweDM5MmVlNzAwLCAweDM5MmZiZjAwLCAweDM5MzA5NzAwLCAweDM5MzE2ZjAwLCAweDM5MzI0NzAwLCAweDM5MzMxZjAwLCAweDM5MzNmNzAwLCAweDM5MzRjZjAwLCAweDM5MzVhNzAwLCAweDM5MzY3ZjAwLAorICAgIDB4MzkzNzU3MDAsIDB4MzkzODJmMDAsIDB4MzkzOTA3MDAsIDB4MzkzOWRmMDAsIDB4MzkzYWI3MDAsIDB4MzkzYjhmMDAsIDB4MzkzYzY3MDAsIDB4MzkzZDNmMDAsIDB4MzkzZTE3MDAsIDB4MzkzZWVmMDAsIDB4MzkzZmM3MDAsIDB4Mzk0MDlmMDAsIDB4Mzk0MTc3MDAsIDB4Mzk0MjRmMDAsIDB4Mzk0MzI3MDAsIDB4Mzk0M2ZmMDAsCisgICAgMHgzOTQ0ZDcwMCwgMHgzOTQ1YWYwMCwgMHgzOTQ2ODcwMCwgMHgzOTQ3NWYwMCwgMHgzOTQ4MzcwMCwgMHgzOTQ5MGYwMCwgMHgzOTQ5ZTcwMCwgMHgzOTRhYmYwMCwgMHgzOTRiOTcwMCwgMHgzOTRjNmYwMCwgMHgzOTRkNDcwMCwgMHgzOTRlMWYwMCwgMHgzOTRlZjcwMCwgMHgzOTRmY2YwMCwgMHgzOTUwYTcwMCwgMHgzOTUxN2YwMCwKKyAgICAweDM5NTI1NzAwLCAweDM5NTMyZjAwLCAweDM5NTQwNzAwLCAweDM5NTRkZjAwLCAweDM5NTViNzAwLCAweDM5NTY4ZjAwLCAweDM5NTc2NzAwLCAweDM5NTgzZjAwLCAweDM5NTkxNzAwLCAweDM5NTllZjAwLCAweDM5NWFjNzAwLCAweDM5NWI5ZjAwLCAweDM5NWM3NzAwLCAweDM5NWQ0ZjAwLCAweDM5NWUyNzAwLCAweDM5NWVmZjAwLAorICAgIDB4Mzk1ZmQ3MDAsIDB4Mzk2MGFmMDAsIDB4Mzk2MTg3MDAsIDB4Mzk2MjVmMDAsIDB4Mzk2MzM3MDAsIDB4Mzk2NDBmMDAsIDB4Mzk2NGU3MDAsIDB4Mzk2NWJmMDAsIDB4Mzk2Njk3MDAsIDB4Mzk2NzZmMDAsIDB4Mzk2ODQ3MDAsIDB4Mzk2OTFmMDAsIDB4Mzk2OWY3MDAsIDB4Mzk2YWNmMDAsIDB4Mzk2YmE3MDAsIDB4Mzk2YzdmMDAsCisgICAgMHgzOTZkNTcwMCwgMHgzOTZlMmYwMCwgMHgzOTZmMDcwMCwgMHgzOTZmZGYwMCwgMHgzOTcwYjcwMCwgMHgzOTcxOGYwMCwgMHgzOTcyNjcwMCwgMHgzOTczM2YwMCwgMHgzOTc0MTcwMCwgMHgzOTc0ZWYwMCwgMHgzOTc1YzcwMCwgMHgzOTc2OWYwMCwgMHgzOTc3NzcwMCwgMHgzOTc4NGYwMCwgMHgzOTc5MjcwMCwgMHgzOTc5ZmYwMCwKKyAgICAweDM5N2FlOTAwLCAweDM5N2JkMzAwLCAweDM5N2NiZDAwLCAweDM5N2RhNzAwLCAweDM5N2U5MTAwLCAweDM5N2Y3YjAwLCAweDM5ODA2NTAwLCAweDM5ODE0ZjAwLCAweDM5ODIzOTAwLCAweDM5ODMyMzAwLCAweDM5ODQwZDAwLCAweDM5ODRmNzAwLCAweDM5ODVlMTAwLCAweDM5ODZjYjAwLCAweDM5ODdiNTAwLCAweDM5ODg5ZjAwLAorICAgIDB4Mzk4OTg5MDAsIDB4Mzk4YTczMDAsIDB4Mzk4YjVkMDAsIDB4Mzk4YzQ3MDAsIDB4Mzk4ZDMxMDAsIDB4Mzk4ZTFiMDAsIDB4Mzk4ZjA1MDAsIDB4Mzk4ZmVmMDAsIDB4Mzk5MGQ5MDAsIDB4Mzk5MWMzMDAsIDB4Mzk5MmFkMDAsIDB4Mzk5Mzk3MDAsIDB4Mzk5NDgxMDAsIDB4Mzk5NTZiMDAsIDB4Mzk5NjU1MDAsIDB4Mzk5NzNmMDAsCisgICAgMHgzOTk4MjkwMCwgMHgzOTk5MTMwMCwgMHgzOTk5ZmQwMCwgMHgzOTlhZTcwMCwgMHgzOTliZDEwMCwgMHgzOTljYmIwMCwgMHgzOTlkYTUwMCwgMHgzOTllOGYwMCwgMHgzOTlmNzkwMCwgMHgzOWEwNjMwMCwgMHgzOWExNGQwMCwgMHgzOWEyMzcwMCwgMHgzOWEzMjEwMCwgMHgzOWE0MGIwMCwgMHgzOWE0ZjUwMCwgMHgzOWE1ZGYwMCwKKyAgICAweDM5YTZjOTAwLCAweDM5YTdiMzAwLCAweDM5YTg5ZDAwLCAweDM5YTk4NzAwLCAweDM5YWE3MTAwLCAweDM5YWI1YjAwLCAweDM5YWM0NTAwLCAweDM5YWQyZjAwLCAweDM5YWUxOTAwLCAweDM5YWYwMzAwLCAweDM5YWZlZDAwLCAweDM5YjBkNzAwLCAweDM5YjFjMTAwLCAweDM5YjJhYjAwLCAweDM5YjM5NTAwLCAweDM5YjQ3ZjAwLAorICAgIDB4MzliNTY5MDAsIDB4MzliNjUzMDAsIDB4MzliNzNkMDAsIDB4MzliODI3MDAsIDB4MzliOTExMDAsIDB4MzliOWZiMDAsIDB4MzliYWU1MDAsIDB4MzliYmNmMDAsIDB4MzliY2I5MDAsIDB4MzliZGEzMDAsIDB4MzliZThkMDAsIDB4MzliZjc3MDAsIDB4MzljMDYxMDAsIDB4MzljMTRiMDAsIDB4MzljMjM1MDAsIDB4MzljMzFmMDAsCisgICAgMHgzOWM0MDkwMCwgMHgzOWM0ZjMwMCwgMHgzOWM1ZGQwMCwgMHgzOWM2YzcwMCwgMHgzOWM3YjEwMCwgMHgzOWM4OWIwMCwgMHgzOWM5ODUwMCwgMHgzOWNhNmYwMCwgMHgzOWNiNTkwMCwgMHgzOWNjNDMwMCwgMHgzOWNkMmQwMCwgMHgzOWNlMTcwMCwgMHgzOWNmMDEwMCwgMHgzOWNmZWIwMCwgMHgzOWQwZDUwMCwgMHgzOWQxYmYwMCwKKyAgICAweDM5ZDJhOTAwLCAweDM5ZDM5MzAwLCAweDM5ZDQ3ZDAwLCAweDM5ZDU2NzAwLCAweDM5ZDY1MTAwLCAweDM5ZDczYjAwLCAweDM5ZDgyNTAwLCAweDM5ZDkwZjAwLCAweDM5ZDlmOTAwLCAweDM5ZGFlMzAwLCAweDM5ZGJjZDAwLCAweDM5ZGNiNzAwLCAweDM5ZGRhMTAwLCAweDM5ZGU4YjAwLCAweDM5ZGY3NTAwLCAweDM5ZTA1ZjAwLAorICAgIDB4MzllMTQ5MDAsIDB4MzllMjMzMDAsIDB4MzllMzFkMDAsIDB4MzllNDA3MDAsIDB4MzllNGYxMDAsIDB4MzllNWRiMDAsIDB4MzllNmM1MDAsIDB4MzllN2FmMDAsIDB4MzllODk5MDAsIDB4MzllOTgzMDAsIDB4MzllYTZkMDAsIDB4MzllYjU3MDAsIDB4MzllYzQxMDAsIDB4MzllZDJiMDAsIDB4MzllZTE1MDAsIDB4MzllZWZmMDAsCisgICAgMHgzOWVmZTkwMCwgMHgzOWYwZDMwMCwgMHgzOWYxYmQwMCwgMHgzOWYyYTcwMCwgMHgzOWYzOTEwMCwgMHgzOWY0N2IwMCwgMHgzOWY1NjUwMCwgMHgzOWY2NGYwMCwgMHgzOWY3MzkwMCwgMHgzOWY4MjMwMCwgMHgzOWY5MGQwMCwgMHgzOWY5ZjcwMCwgMHgzOWZhZTEwMCwgMHgzOWZiY2IwMCwgMHgzOWZjYjUwMCwgMHgzOWZkOWYwMCwKKyAgICAweDM5ZmU4OTAwLCAweDM5ZmY3MzAwLCAweDNhMDA1ZDAwLCAweDNhMDE0NzAwLCAweDNhMDIzMTAwLCAweDNhMDMxYjAwLCAweDNhMDQwNTAwLCAweDNhMDRlZjAwLCAweDNhMDVkOTAwLCAweDNhMDZjMzAwLCAweDNhMDdhZDAwLCAweDNhMDg5NzAwLCAweDNhMDk4MTAwLCAweDNhMGE2YjAwLCAweDNhMGI1NTAwLCAweDNhMGMzZjAwLAorICAgIDB4M2EwZDI5MDAsIDB4M2EwZTEzMDAsIDB4M2EwZWZkMDAsIDB4M2EwZmU3MDAsIDB4M2ExMGQxMDAsIDB4M2ExMWJiMDAsIDB4M2ExMmE1MDAsIDB4M2ExMzhmMDAsIDB4M2ExNDc5MDAsIDB4M2ExNTYzMDAsIDB4M2ExNjRkMDAsIDB4M2ExNzM3MDAsIDB4M2ExODIxMDAsIDB4M2ExOTBiMDAsIDB4M2ExOWY1MDAsIDB4M2ExYWRmMDAsCisgICAgMHgzYTFiYzkwMCwgMHgzYTFjYjMwMCwgMHgzYTFkOWQwMCwgMHgzYTFlODcwMCwgMHgzYTFmNzEwMCwgMHgzYTIwNWIwMCwgMHgzYTIxNDUwMCwgMHgzYTIyMmYwMCwgMHgzYTIzMTkwMCwgMHgzYTI0MDMwMCwgMHgzYTI0ZWQwMCwgMHgzYTI1ZDcwMCwgMHgzYTI2YzEwMCwgMHgzYTI3YWIwMCwgMHgzYTI4OTUwMCwgMHgzYTI5N2YwMCwKKyAgICAweDNhMmE2OTAwLCAweDNhMmI1MzAwLCAweDNhMmMzZDAwLCAweDNhMmQyNzAwLCAweDNhMmUxMTAwLCAweDNhMmVmYjAwLCAweDNhMmZlNTAwLCAweDNhMzBjZjAwLCAweDNhMzFiOTAwLCAweDNhMzJhMzAwLCAweDNhMzM4ZDAwLCAweDNhMzQ3NzAwLCAweDNhMzU2MTAwLCAweDNhMzY0YjAwLCAweDNhMzczNTAwLCAweDNhMzgxZjAwLAorICAgIDB4M2EzOTA5MDAsIDB4M2EzOWYzMDAsIDB4M2EzYWRkMDAsIDB4M2EzYmM3MDAsIDB4M2EzY2IxMDAsIDB4M2EzZDliMDAsIDB4M2EzZTg1MDAsIDB4M2EzZjZmMDAsIDB4M2E0MDU5MDAsIDB4M2E0MTQzMDAsIDB4M2E0MjJkMDAsIDB4M2E0MzE3MDAsIDB4M2E0NDAxMDAsIDB4M2E0NGViMDAsIDB4M2E0NWQ1MDAsIDB4M2E0NmJmMDAsCisgICAgMHgzYTQ3YTkwMCwgMHgzYTQ4OTMwMCwgMHgzYTQ5N2QwMCwgMHgzYTRhNjcwMCwgMHgzYTRiNTEwMCwgMHgzYTRjM2IwMCwgMHgzYTRkMjUwMCwgMHgzYTRlMGYwMCwgMHgzYTRlZjkwMCwgMHgzYTRmZTMwMCwgMHgzYTUwY2QwMCwgMHgzYTUxYjcwMCwgMHgzYTUyYTEwMCwgMHgzYTUzOGIwMCwgMHgzYTU0NzUwMCwgMHgzYTU1NWYwMCwKKyAgICAweDNhNTY0OTAwLCAweDNhNTczMzAwLCAweDNhNTgxZDAwLCAweDNhNTkwNzAwLCAweDNhNTlmMTAwLCAweDNhNWFkYjAwLCAweDNhNWJjNTAwLCAweDNhNWNhZjAwLCAweDNhNWQ5OTAwLCAweDNhNWU4MzAwLCAweDNhNWY2ZDAwLCAweDNhNjA1NzAwLCAweDNhNjE0MTAwLCAweDNhNjIyYjAwLCAweDNhNjMxNTAwLCAweDNhNjNmZjAwLAorICAgIDB4M2E2NGU5MDAsIDB4M2E2NWQzMDAsIDB4M2E2NmJkMDAsIDB4M2E2N2E3MDAsIDB4M2E2ODkxMDAsIDB4M2E2OTdiMDAsIDB4M2E2YTY1MDAsIDB4M2E2YjRmMDAsIDB4M2E2YzM5MDAsIDB4M2E2ZDIzMDAsIDB4M2E2ZTBkMDAsIDB4M2E2ZWY3MDAsIDB4M2E2ZmUxMDAsIDB4M2E3MGNiMDAsIDB4M2E3MWI1MDAsIDB4M2E3MjlmMDAsCisgICAgMHgzYTczODkwMCwgMHgzYTc0NzMwMCwgMHgzYTc1NWQwMCwgMHgzYTc2NDcwMCwgMHgzYTc3MzEwMCwgMHgzYTc4MWIwMCwgMHgzYTc5MDUwMCwgMHgzYTc5ZWYwMCwgMHgzYTdhZDkwMCwgMHgzYTdiYzMwMCwgMHgzYTdjYWQwMCwgMHgzYTdkOTcwMCwgMHgzYTdlODEwMCwgMHgzYTdmNmIwMCwgMHgzYTgwNTUwMCwgMHgzYTgxM2YwMCwKKyAgICAweDNhODIyOTAwLCAweDNhODMxMzAwLCAweDNhODNmZDAwLCAweDNhODRlNzAwLCAweDNhODVkMTAwLCAweDNhODZiYjAwLCAweDNhODdhNTAwLCAweDNhODg4ZjAwLCAweDNhODk3OTAwLCAweDNhOGE2MzAwLCAweDNhOGI0ZDAwLCAweDNhOGMzNzAwLCAweDNhOGQyMTAwLCAweDNhOGUwYjAwLCAweDNhOGVmNTAwLCAweDNhOGZkZjAwLAorICAgIDB4M2E5MGM5MDAsIDB4M2E5MWIzMDAsIDB4M2E5MjlkMDAsIDB4M2E5Mzg3MDAsIDB4M2E5NDcxMDAsIDB4M2E5NTViMDAsIDB4M2E5NjQ1MDAsIDB4M2E5NzJmMDAsIDB4M2E5ODE5MDAsIDB4M2E5OTAzMDAsIDB4M2E5OWVkMDAsIDB4M2E5YWQ3MDAsIDB4M2E5YmMxMDAsIDB4M2E5Y2FiMDAsIDB4M2E5ZDk1MDAsIDB4M2E5ZTdmMDAsCisgICAgMHgzYTlmNjkwMCwgMHgzYWEwNTMwMCwgMHgzYWExM2QwMCwgMHgzYWEyMjcwMCwgMHgzYWEzMTEwMCwgMHgzYWEzZmIwMCwgMHgzYWE0ZTUwMCwgMHgzYWE1Y2YwMCwgMHgzYWE2YjkwMCwgMHgzYWE3YTMwMCwgMHgzYWE4OGQwMCwgMHgzYWE5NzcwMCwgMHgzYWFhNjEwMCwgMHgzYWFiNGIwMCwgMHgzYWFjMzUwMCwgMHgzYWFkMWYwMCwKKyAgICAweDNhYWUwOTAwLCAweDNhYWVmMzAwLCAweDNhYWZkZDAwLCAweDNhYjBjNzAwLCAweDNhYjFiMTAwLCAweDNhYjI5YjAwLCAweDNhYjM4NTAwLCAweDNhYjQ2ZjAwLCAweDNhYjU1OTAwLCAweDNhYjY0MzAwLCAweDNhYjcyZDAwLCAweDNhYjgxNzAwLCAweDNhYjkwMTAwLCAweDNhYjllYjAwLCAweDNhYmFkNTAwLCAweDNhYmJiZjAwLAorICAgIDB4M2FiY2E5MDAsIDB4M2FiZDkzMDAsIDB4M2FiZTdkMDAsIDB4M2FiZjY3MDAsIDB4M2FjMDUxMDAsIDB4M2FjMTNiMDAsIDB4M2FjMjI1MDAsIDB4M2FjMzBmMDAsIDB4M2FjM2Y5MDAsIDB4M2FjNGUzMDAsIDB4M2FjNWNkMDAsIDB4M2FjNmI3MDAsIDB4M2FjN2ExMDAsIDB4M2FjODhiMDAsIDB4M2FjOTc1MDAsIDB4M2FjYTVmMDAsCisgICAgMHgzYWNiNDkwMCwgMHgzYWNjMzMwMCwgMHgzYWNkMWQwMCwgMHgzYWNlMDcwMCwgMHgzYWNlZjEwMCwgMHgzYWNmZGIwMCwgMHgzYWQwYzUwMCwgMHgzYWQxYWYwMCwgMHgzYWQyOTkwMCwgMHgzYWQzODMwMCwgMHgzYWQ0NmQwMCwgMHgzYWQ1NTcwMCwgMHgzYWQ2NDEwMCwgMHgzYWQ3MmIwMCwgMHgzYWQ4MTUwMCwgMHgzYWQ4ZmYwMCwKKyAgICAweDNhZDllOTAwLCAweDNhZGFkMzAwLCAweDNhZGJiZDAwLCAweDNhZGNhNzAwLCAweDNhZGQ5MTAwLCAweDNhZGU3YjAwLCAweDNhZGY2NTAwLCAweDNhZTA0ZjAwLCAweDNhZTEzOTAwLCAweDNhZTIyMzAwLCAweDNhZTMwZDAwLCAweDNhZTNmNzAwLCAweDNhZTRlMTAwLCAweDNhZTVjYjAwLCAweDNhZTZiNTAwLCAweDNhZTc5ZjAwLAorICAgIDB4M2FlODg5MDAsIDB4M2FlOTczMDAsIDB4M2FlYTVkMDAsIDB4M2FlYjQ3MDAsIDB4M2FlYzMxMDAsIDB4M2FlZDFiMDAsIDB4M2FlZTA1MDAsIDB4M2FlZWVmMDAsIDB4M2FlZmQ5MDAsIDB4M2FmMGMzMDAsIDB4M2FmMWFkMDAsIDB4M2FmMjk3MDAsIDB4M2FmMzgxMDAsIDB4M2FmNDZiMDAsIDB4M2FmNTU1MDAsIDB4M2FmNjNmMDAsCisgICAgMHgzYWY3MjkwMCwgMHgzYWY4MTMwMCwgMHgzYWY4ZmQwMCwgMHgzYWY5ZTcwMCwgMHgzYWZhZDEwMCwgMHgzYWZiYmIwMCwgMHgzYWZjYTUwMCwgMHgzYWZkOGYwMCwgMHgzYWZlNzkwMCwgMHgzYWZmNjMwMCwgMHgzYjAwNGUwMCwgMHgzYjAxMzgwMCwgMHgzYjAyMjIwMCwgMHgzYjAzMGMwMCwgMHgzYjAzZjYwMCwgMHgzYjA0ZTAwMCwKKyAgICAweDNiMDVjYTAwLCAweDNiMDZiNDAwLCAweDNiMDc5ZTAwLCAweDNiMDg4ODAwLCAweDNiMDk3MjAwLCAweDNiMGE1YzAwLCAweDNiMGI0NjAwLCAweDNiMGMzMDAwLCAweDNiMGQxYTAwLCAweDNiMGUwNDAwLCAweDNiMGVlZTAwLCAweDNiMGZkODAwLCAweDNiMTBjMjAwLCAweDNiMTFhYzAwLCAweDNiMTI5NjAwLCAweDNiMTM4MDAwLAorICAgIDB4M2IxNDZhMDAsIDB4M2IxNTU0MDAsIDB4M2IxNjNlMDAsIDB4M2IxNzI4MDAsIDB4M2IxODEyMDAsIDB4M2IxOGZjMDAsIDB4M2IxOWU2MDAsIDB4M2IxYWQwMDAsIDB4M2IxYmJhMDAsIDB4M2IxY2E0MDAsIDB4M2IxZDhlMDAsIDB4M2IxZTc4MDAsIDB4M2IxZjYyMDAsIDB4M2IyMDRjMDAsIDB4M2IyMTM2MDAsIDB4M2IyMjIwMDAsCisgICAgMHgzYjIzMGEwMCwgMHgzYjIzZjQwMCwgMHgzYjI0ZGUwMCwgMHgzYjI1YzgwMCwgMHgzYjI2YjIwMCwgMHgzYjI3OWMwMCwgMHgzYjI4ODYwMCwgMHgzYjI5NzAwMCwgMHgzYjJhNWEwMCwgMHgzYjJiNDQwMCwgMHgzYjJjMmUwMCwgMHgzYjJkMTgwMCwgMHgzYjJlMDIwMCwgMHgzYjJlZWMwMCwgMHgzYjJmZDYwMCwgMHgzYjMwYzAwMCwKKyAgICAweDNiMzFhYTAwLCAweDNiMzI5NDAwLCAweDNiMzM3ZTAwLCAweDNiMzQ2ODAwLCAweDNiMzU1MjAwLCAweDNiMzYzYzAwLCAweDNiMzcyNjAwLCAweDNiMzgxMDAwLCAweDNiMzhmYTAwLCAweDNiMzllNDAwLCAweDNiM2FjZTAwLCAweDNiM2JiODAwLCAweDNiM2NhMjAwLCAweDNiM2Q4YzAwLCAweDNiM2U3NjAwLCAweDNiM2Y2MDAwLAorICAgIDB4M2I0MDRhMDAsIDB4M2I0MTM0MDAsIDB4M2I0MjFlMDAsIDB4M2I0MzA4MDAsIDB4M2I0M2YyMDAsIDB4M2I0NGRjMDAsIDB4M2I0NWM2MDAsIDB4M2I0NmIwMDAsIDB4M2I0NzlhMDAsIDB4M2I0ODg0MDAsIDB4M2I0OTZlMDAsIDB4M2I0YTU4MDAsIDB4M2I0YjQyMDAsIDB4M2I0YzJjMDAsIDB4M2I0ZDE2MDAsIDB4M2I0ZTAwMDAsCisgICAgMHgzYjRmMDAwMCwgMHgzYjUwMDAwMCwgMHgzYjUxMDAwMCwgMHgzYjUyMDAwMCwgMHgzYjUzMDAwMCwgMHgzYjU0MDAwMCwgMHgzYjU1MDAwMCwgMHgzYjU2MDAwMCwgMHgzYjU3MDAwMCwgMHgzYjU4MDAwMCwgMHgzYjU5MDAwMCwgMHgzYjVhMDAwMCwgMHgzYjViMDAwMCwgMHgzYjVjMDAwMCwgMHgzYjVkMDAwMCwgMHgzYjVlMDAwMCwKKyAgICAweDNiNWYwMDAwLCAweDNiNjAwMDAwLCAweDNiNjEwMDAwLCAweDNiNjIwMDAwLCAweDNiNjMwMDAwLCAweDNiNjQwMDAwLCAweDNiNjUwMDAwLCAweDNiNjYwMDAwLCAweDNiNjcwMDAwLCAweDNiNjgwMDAwLCAweDNiNjkwMDAwLCAweDNiNmEwMDAwLCAweDNiNmIwMDAwLCAweDNiNmMwMDAwLCAweDNiNmQwMDAwLCAweDNiNmUwMDAwLAorICAgIDB4M2I2ZjAwMDAsIDB4M2I3MDAwMDAsIDB4M2I3MTAwMDAsIDB4M2I3MjAwMDAsIDB4M2I3MzAwMDAsIDB4M2I3NDAwMDAsIDB4M2I3NTAwMDAsIDB4M2I3NjAwMDAsIDB4M2I3NzAwMDAsIDB4M2I3ODAwMDAsIDB4M2I3OTAwMDAsIDB4M2I3YTAwMDAsIDB4M2I3YjAwMDAsIDB4M2I3YzAwMDAsIDB4M2I3ZDAwMDAsIDB4M2I3ZTAwMDAsCisgICAgMHgzYjdmMDAwMCwgMHgzYjgwMDAwMCwgMHgzYjgxMDAwMCwgMHgzYjgyMDAwMCwgMHgzYjgzMDAwMCwgMHgzYjg0MDAwMCwgMHgzYjg1MDAwMCwgMHgzYjg2MDAwMCwgMHgzYjg3MDAwMCwgMHgzYjg4MDAwMCwgMHgzYjg5MDAwMCwgMHgzYjhhMDAwMCwgMHgzYjhiMDAwMCwgMHgzYjhjMDAwMCwgMHgzYjhkMDAwMCwgMHgzYjhlMDAwMCwKKyAgICAweDNiOGYwMDAwLCAweDNiOTAwMDAwLCAweDNiOTEwMDAwLCAweDNiOTIwMDAwLCAweDNiOTMwMDAwLCAweDNiOTQwMDAwLCAweDNiOTUwMDAwLCAweDNiOTYwMDAwLCAweDNiOTcwMDAwLCAweDNiOTgwMDAwLCAweDNiOTkwMDAwLCAweDNiOWEwMDAwLCAweDNiOWIwMDAwLCAweDNiOWMwMDAwLCAweDNiOWQwMDAwLCAweDNiOWUwMDAwLAorICAgIDB4M2I5ZjAwMDAsIDB4M2JhMDAwMDAsIDB4M2JhMTAwMDAsIDB4M2JhMjAwMDAsIDB4M2JhMzAwMDAsIDB4M2JhNDAwMDAsIDB4M2JhNTAwMDAsIDB4M2JhNjAwMDAsIDB4M2JhNzAwMDAsIDB4M2JhODAwMDAsIDB4M2JhOTAwMDAsIDB4M2JhYTAwMDAsIDB4M2JhYjAwMDAsIDB4M2JhYzAwMDAsIDB4M2JhZDAwMDAsIDB4M2JhZTAwMDAsCisgICAgMHgzYmFmMDAwMCwgMHgzYmIwMDAwMCwgMHgzYmIxMDAwMCwgMHgzYmIyMDAwMCwgMHgzYmIzMDAwMCwgMHgzYmI0MDAwMCwgMHgzYmI1MDAwMCwgMHgzYmI2MDAwMCwgMHgzYmI3MDAwMCwgMHgzYmI4MDAwMCwgMHgzYmI5MDAwMCwgMHgzYmJhMDAwMCwgMHgzYmJiMDAwMCwgMHgzYmJjMDAwMCwgMHgzYmJkMDAwMCwgMHgzYmJlMDAwMCwKKyAgICAweDNiYmYwMDAwLCAweDNiYzAwMDAwLCAweDNiYzEwMDAwLCAweDNiYzIwMDAwLCAweDNiYzMwMDAwLCAweDNiYzQwMDAwLCAweDNiYzUwMDAwLCAweDNiYzYwMDAwLCAweDNiYzcwMDAwLCAweDNiYzgwMDAwLCAweDNiYzkwMDAwLCAweDNiY2EwMDAwLCAweDNiY2IwMDAwLCAweDNiY2MwMDAwLCAweDNiY2QwMDAwLCAweDNiY2UwMDAwLAorICAgIDB4M2JjZjAwMDAsIDB4M2JkMDAwMDAsIDB4M2JkMTAwMDAsIDB4M2JkMjAwMDAsIDB4M2JkMzAwMDAsIDB4M2JkNDAwMDAsIDB4M2JkNTAwMDAsIDB4M2JkNjAwMDAsIDB4M2JkNzAwMDAsIDB4M2JkODAwMDAsIDB4M2JkOTAwMDAsIDB4M2JkYTAwMDAsIDB4M2JkYjAwMDAsIDB4M2JkYzAwMDAsIDB4M2JkZDAwMDAsIDB4M2JkZTAwMDAsCisgICAgMHgzYmRmMDAwMCwgMHgzYmUwMDAwMCwgMHgzYmUxMDAwMCwgMHgzYmUyMDAwMCwgMHgzYmUzMDAwMCwgMHgzYmU0MDAwMCwgMHgzYmU1MDAwMCwgMHgzYmU2MDAwMCwgMHgzYmU3MDAwMCwgMHgzYmU4MDAwMCwgMHgzYmU5MDAwMCwgMHgzYmVhMDAwMCwgMHgzYmViMDAwMCwgMHgzYmVjMDAwMCwgMHgzYmVkMDAwMCwgMHgzYmVlMDAwMCwKKyAgICAweDNiZWYwMDAwLCAweDNiZjAwMDAwLCAweDNiZjEwMDAwLCAweDNiZjIwMDAwLCAweDNiZjMwMDAwLCAweDNiZjQwMDAwLCAweDNiZjUwMDAwLCAweDNiZjYwMDAwLCAweDNiZjcwMDAwLCAweDNiZjgwMDAwLCAweDNiZjkwMDAwLCAweDNiZmEwMDAwLCAweDNiZmIwMDAwLCAweDNiZmMwMDAwLCAweDNiZmQwMDAwLCAweDNiZmUwMDAwLAorICAgIDB4M2JmZjAwMDAsIDB4M2MwMDAwMDAsIDB4M2MwMTAwMDAsIDB4M2MwMjAwMDAsIDB4M2MwMzAwMDAsIDB4M2MwNDAwMDAsIDB4M2MwNTAwMDAsIDB4M2MwNjAwMDAsIDB4M2MwNzAwMDAsIDB4M2MwODAwMDAsIDB4M2MwOTAwMDAsIDB4M2MwYTAwMDAsIDB4M2MwYjAwMDAsIDB4M2MwYzAwMDAsIDB4M2MwZDAwMDAsIDB4M2MwZTAwMDAsCisgICAgMHgzYzBmMDAwMCwgMHgzYzEwMDAwMCwgMHgzYzExMDAwMCwgMHgzYzEyMDAwMCwgMHgzYzEzMDAwMCwgMHgzYzE0MDAwMCwgMHgzYzE1MDAwMCwgMHgzYzE2MDAwMCwgMHgzYzE3MDAwMCwgMHgzYzE4MDAwMCwgMHgzYzE5MDAwMCwgMHgzYzFhMDAwMCwgMHgzYzFiMDAwMCwgMHgzYzFjMDAwMCwgMHgzYzFkMDAwMCwgMHgzYzFlMDAwMCwKKyAgICAweDNjMWYwMDAwLCAweDNjMjAwMDAwLCAweDNjMjEwMDAwLCAweDNjMjIwMDAwLCAweDNjMjMwMDAwLCAweDNjMjQwMDAwLCAweDNjMjUwMDAwLCAweDNjMjYwMDAwLCAweDNjMjcwMDAwLCAweDNjMjgwMDAwLCAweDNjMjkwMDAwLCAweDNjMmEwMDAwLCAweDNjMmIwMDAwLCAweDNjMmMwMDAwLCAweDNjMmQwMDAwLCAweDNjMmUwMDAwLAorICAgIDB4M2MyZjAwMDAsIDB4M2MzMDAwMDAsIDB4M2MzMTAwMDAsIDB4M2MzMjAwMDAsIDB4M2MzMzAwMDAsIDB4M2MzNDAwMDAsIDB4M2MzNTAwMDAsIDB4M2MzNjAwMDAsIDB4M2MzNzAwMDAsIDB4M2MzODAwMDAsIDB4M2MzOTAwMDAsIDB4M2MzYTAwMDAsIDB4M2MzYjAwMDAsIDB4M2MzYzAwMDAsIDB4M2MzZDAwMDAsIDB4M2MzZTAwMDAsCisgICAgMHgzYzNmMDAwMCwgMHgzYzQwMDAwMCwgMHgzYzQxMDAwMCwgMHgzYzQyMDAwMCwgMHgzYzQzMDAwMCwgMHgzYzQ0MDAwMCwgMHgzYzQ1MDAwMCwgMHgzYzQ2MDAwMCwgMHgzYzQ3MDAwMCwgMHgzYzQ4MDAwMCwgMHgzYzQ5MDAwMCwgMHgzYzRhMDAwMCwgMHgzYzRiMDAwMCwgMHgzYzRjMDAwMCwgMHgzYzRkMDAwMCwgMHgzYzRlMDAwMCwKKyAgICAweDNjNGYwMDAwLCAweDNjNTAwMDAwLCAweDNjNTEwMDAwLCAweDNjNTIwMDAwLCAweDNjNTMwMDAwLCAweDNjNTQwMDAwLCAweDNjNTUwMDAwLCAweDNjNTYwMDAwLCAweDNjNTcwMDAwLCAweDNjNTgwMDAwLCAweDNjNTkwMDAwLCAweDNjNWEwMDAwLCAweDNjNWIwMDAwLCAweDNjNWMwMDAwLCAweDNjNWQwMDAwLCAweDNjNWUwMDAwLAorICAgIDB4M2M1ZjAwMDAsIDB4M2M2MDAwMDAsIDB4M2M2MTAwMDAsIDB4M2M2MjAwMDAsIDB4M2M2MzAwMDAsIDB4M2M2NDAwMDAsIDB4M2M2NTAwMDAsIDB4M2M2NjAwMDAsIDB4M2M2NzAwMDAsIDB4M2M2ODAwMDAsIDB4M2M2OTAwMDAsIDB4M2M2YTAwMDAsIDB4M2M2YjAwMDAsIDB4M2M2YzAwMDAsIDB4M2M2ZDAwMDAsIDB4M2M2ZTAwMDAsCisgICAgMHgzYzZmMDAwMCwgMHgzYzcwMDAwMCwgMHgzYzcxMDAwMCwgMHgzYzcyMDAwMCwgMHgzYzczMDAwMCwgMHgzYzc0MDAwMCwgMHgzYzc1MDAwMCwgMHgzYzc2MDAwMCwgMHgzYzc3MDAwMCwgMHgzYzc4MDAwMCwgMHgzYzc5MDAwMCwgMHgzYzdhMDAwMCwgMHgzYzdiMDAwMCwgMHgzYzdjMDAwMCwgMHgzYzdkMDAwMCwgMHgzYzdlMDAwMCwKKyAgICAweDNjN2YwMDAwLCAweDNjODAwMDAwLCAweDNjODEwMDAwLCAweDNjODIwMDAwLCAweDNjODMwMDAwLCAweDNjODQwMDAwLCAweDNjODUwMDAwLCAweDNjODYwMDAwLCAweDNjODcwMDAwLCAweDNjODgwMDAwLCAweDNjODkwMDAwLCAweDNjOGEwMDAwLCAweDNjOGIwMDAwLCAweDNjOGMwMDAwLCAweDNjOGQwMDAwLCAweDNjOGUwMDAwLAorICAgIDB4M2M4ZjAwMDAsIDB4M2M5MDAwMDAsIDB4M2M5MTAwMDAsIDB4M2M5MjAwMDAsIDB4M2M5MzAwMDAsIDB4M2M5NDAwMDAsIDB4M2M5NTAwMDAsIDB4M2M5NjAwMDAsIDB4M2M5NzAwMDAsIDB4M2M5ODAwMDAsIDB4M2M5OTAwMDAsIDB4M2M5YTAwMDAsIDB4M2M5YjAwMDAsIDB4M2M5YzAwMDAsIDB4M2M5ZDAwMDAsIDB4M2M5ZTAwMDAsCisgICAgMHgzYzlmMDAwMCwgMHgzY2EwMDAwMCwgMHgzY2ExMDAwMCwgMHgzY2EyMDAwMCwgMHgzY2EzMDAwMCwgMHgzY2E0MDAwMCwgMHgzY2E1MDAwMCwgMHgzY2E2MDAwMCwgMHgzY2E3MDAwMCwgMHgzY2E4MDAwMCwgMHgzY2E5MDAwMCwgMHgzY2FhMDAwMCwgMHgzY2FiMDAwMCwgMHgzY2FjMDAwMCwgMHgzY2FkMDAwMCwgMHgzY2FlMDAwMCwKKyAgICAweDNjYWYwMDAwLCAweDNjYjAwMDAwLCAweDNjYjEwMDAwLCAweDNjYjIwMDAwLCAweDNjYjMwMDAwLCAweDNjYjQwMDAwLCAweDNjYjUwMDAwLCAweDNjYjYwMDAwLCAweDNjYjcwMDAwLCAweDNjYjgwMDAwLCAweDNjYjkwMDAwLCAweDNjYmEwMDAwLCAweDNjYmIwMDAwLCAweDNjYmMwMDAwLCAweDNjYmQwMDAwLCAweDNjYmUwMDAwLAorICAgIDB4M2NiZjAwMDAsIDB4M2NjMDAwMDAsIDB4M2NjMTAwMDAsIDB4M2NjMjAwMDAsIDB4M2NjMzAwMDAsIDB4M2NjNDAwMDAsIDB4M2NjNTAwMDAsIDB4M2NjNjAwMDAsIDB4M2NjNzAwMDAsIDB4M2NjODAwMDAsIDB4M2NjOTAwMDAsIDB4M2NjYTAwMDAsIDB4M2NjYjAwMDAsIDB4M2NjYzAwMDAsIDB4M2NjZDAwMDAsIDB4M2NjZTAwMDAsCisgICAgMHgzY2NmMDAwMCwgMHgzY2QwMDAwMCwgMHgzY2QxMDAwMCwgMHgzY2QyMDAwMCwgMHgzY2QzMDAwMCwgMHgzY2Q0MDAwMCwgMHgzY2Q1MDAwMCwgMHgzY2Q2MDAwMCwgMHgzY2Q3MDAwMCwgMHgzY2Q4MDAwMCwgMHgzY2Q5MDAwMCwgMHgzY2RhMDAwMCwgMHgzY2RiMDAwMCwgMHgzY2RjMDAwMCwgMHgzY2RkMDAwMCwgMHgzY2RlMDAwMCwKKyAgICAweDNjZGYwMDAwLCAweDNjZTAwMDAwLCAweDNjZTEwMDAwLCAweDNjZTIwMDAwLCAweDNjZTMwMDAwLCAweDNjZTQwMDAwLCAweDNjZTUwMDAwLCAweDNjZTYwMDAwLCAweDNjZTcwMDAwLCAweDNjZTgwMDAwLCAweDNjZTkwMDAwLCAweDNjZWEwMDAwLCAweDNjZWIwMDAwLCAweDNjZWMwMDAwLCAweDNjZWQwMDAwLCAweDNjZWUwMDAwLAorICAgIDB4M2NlZjAwMDAsIDB4M2NmMDAwMDAsIDB4M2NmMTAwMDAsIDB4M2NmMjAwMDAsIDB4M2NmMzAwMDAsIDB4M2NmNDAwMDAsIDB4M2NmNTAwMDAsIDB4M2NmNjAwMDAsIDB4M2NmNzAwMDAsIDB4M2NmODAwMDAsIDB4M2NmOTAwMDAsIDB4M2NmYTAwMDAsIDB4M2NmYjAwMDAsIDB4M2NmYzAwMDAsIDB4M2NmZDAwMDAsIDB4M2NmZTAwMDAsCisgICAgMHgzY2ZmMDAwMCwgMHgzZDAwMDAwMCwgMHgzZDAxMDAwMCwgMHgzZDAyMDAwMCwgMHgzZDAzMDAwMCwgMHgzZDA0MDAwMCwgMHgzZDA1MDAwMCwgMHgzZDA2MDAwMCwgMHgzZDA3MDAwMCwgMHgzZDA4MDAwMCwgMHgzZDA5MDAwMCwgMHgzZDBhMDAwMCwgMHgzZDBiMDAwMCwgMHgzZDBjMDAwMCwgMHgzZDBkMDAwMCwgMHgzZDBlMDAwMCwKKyAgICAweDNkMGYwMDAwLCAweDNkMTAwMDAwLCAweDNkMTEwMDAwLCAweDNkMTIwMDAwLCAweDNkMTMwMDAwLCAweDNkMTQwMDAwLCAweDNkMTUwMDAwLCAweDNkMTYwMDAwLCAweDNkMTcwMDAwLCAweDNkMTgwMDAwLCAweDNkMTkwMDAwLCAweDNkMWEwMDAwLCAweDNkMWIwMDAwLCAweDNkMWMwMDAwLCAweDNkMWQwMDAwLCAweDNkMWUwMDAwLAorICAgIDB4M2QxZjAwMDAsIDB4M2QyMDAwMDAsIDB4M2QyMTAwMDAsIDB4M2QyMjAwMDAsIDB4M2QyMzAwMDAsIDB4M2QyNDAwMDAsIDB4M2QyNTAwMDAsIDB4M2QyNjAwMDAsIDB4M2QyNzAwMDAsIDB4M2QyODAwMDAsIDB4M2QyOTAwMDAsIDB4M2QyYTAwMDAsIDB4M2QyYjAwMDAsIDB4M2QyYzAwMDAsIDB4M2QyZDAwMDAsIDB4M2QyZTAwMDAsCisgICAgMHgzZDJmMDAwMCwgMHgzZDMwMDAwMCwgMHgzZDMxMDAwMCwgMHgzZDMyMDAwMCwgMHgzZDMzMDAwMCwgMHgzZDM0MDAwMCwgMHgzZDM1MDAwMCwgMHgzZDM2MDAwMCwgMHgzZDM3MDAwMCwgMHgzZDM4MDAwMCwgMHgzZDM5MDAwMCwgMHgzZDNhMDAwMCwgMHgzZDNiMDAwMCwgMHgzZDNjMDAwMCwgMHgzZDNkMDAwMCwgMHgzZDNlMDAwMCwKKyAgICAweDNkM2YwMDAwLCAweDNkNDAwMDAwLCAweDNkNDEwMDAwLCAweDNkNDIwMDAwLCAweDNkNDMwMDAwLCAweDNkNDQwMDAwLCAweDNkNDUwMDAwLCAweDNkNDYwMDAwLCAweDNkNDcwMDAwLCAweDNkNDgwMDAwLCAweDNkNDkwMDAwLCAweDNkNGEwMDAwLCAweDNkNGIwMDAwLCAweDNkNGMwMDAwLCAweDNkNGQwMDAwLCAweDNkNGUwMDAwLAorICAgIDB4M2Q0ZjIyMDAsIDB4M2Q1MDQ0MDAsIDB4M2Q1MTY2MDAsIDB4M2Q1Mjg4MDAsIDB4M2Q1M2FhMDAsIDB4M2Q1NGNjMDAsIDB4M2Q1NWVlMDAsIDB4M2Q1NzEwMDAsIDB4M2Q1ODMyMDAsIDB4M2Q1OTU0MDAsIDB4M2Q1YTc2MDAsIDB4M2Q1Yjk4MDAsIDB4M2Q1Y2JhMDAsIDB4M2Q1ZGRjMDAsIDB4M2Q1ZWZlMDAsIDB4M2Q2MDIwMDAsCisgICAgMHgzZDYxNDIwMCwgMHgzZDYyNjQwMCwgMHgzZDYzODYwMCwgMHgzZDY0YTgwMCwgMHgzZDY1Y2EwMCwgMHgzZDY2ZWMwMCwgMHgzZDY4MGUwMCwgMHgzZDY5MzAwMCwgMHgzZDZhNTIwMCwgMHgzZDZiNzQwMCwgMHgzZDZjOTYwMCwgMHgzZDZkYjgwMCwgMHgzZDZlZGEwMCwgMHgzZDZmZmMwMCwgMHgzZDcxMWUwMCwgMHgzZDcyNDAwMCwKKyAgICAweDNkNzM2MjAwLCAweDNkNzQ4NDAwLCAweDNkNzVhNjAwLCAweDNkNzZjODAwLCAweDNkNzdlYTAwLCAweDNkNzkwYzAwLCAweDNkN2EyZTAwLCAweDNkN2I1MDAwLCAweDNkN2M3MjAwLCAweDNkN2Q5NDAwLCAweDNkN2ViNjAwLCAweDNkN2ZkODAwLCAweDNkODBmYTAwLCAweDNkODIxYzAwLCAweDNkODMzZTAwLCAweDNkODQ2MDAwLAorICAgIDB4M2Q4NTgyMDAsIDB4M2Q4NmE0MDAsIDB4M2Q4N2M2MDAsIDB4M2Q4OGU4MDAsIDB4M2Q4YTBhMDAsIDB4M2Q4YjJjMDAsIDB4M2Q4YzRlMDAsIDB4M2Q4ZDcwMDAsIDB4M2Q4ZTkyMDAsIDB4M2Q4ZmI0MDAsIDB4M2Q5MGQ2MDAsIDB4M2Q5MWY4MDAsIDB4M2Q5MzFhMDAsIDB4M2Q5NDNjMDAsIDB4M2Q5NTVlMDAsIDB4M2Q5NjgwMDAsCisgICAgMHgzZDk3YTIwMCwgMHgzZDk4YzQwMCwgMHgzZDk5ZTYwMCwgMHgzZDliMDgwMCwgMHgzZDljMmEwMCwgMHgzZDlkNGMwMCwgMHgzZDllNmUwMCwgMHgzZDlmOTAwMCwgMHgzZGEwYjIwMCwgMHgzZGExZDQwMCwgMHgzZGEyZjYwMCwgMHgzZGE0MTgwMCwgMHgzZGE1M2EwMCwgMHgzZGE2NWMwMCwgMHgzZGE3N2UwMCwgMHgzZGE4YTAwMCwKKyAgICAweDNkYTljMjAwLCAweDNkYWFlNDAwLCAweDNkYWMwNjAwLCAweDNkYWQyODAwLCAweDNkYWU0YTAwLCAweDNkYWY2YzAwLCAweDNkYjA4ZTAwLCAweDNkYjFiMDAwLCAweDNkYjJkMjAwLCAweDNkYjNmNDAwLCAweDNkYjUxNjAwLCAweDNkYjYzODAwLCAweDNkYjc1YTAwLCAweDNkYjg3YzAwLCAweDNkYjk5ZTAwLCAweDNkYmFjMDAwLAorICAgIDB4M2RiYmUyMDAsIDB4M2RiZDA0MDAsIDB4M2RiZTI2MDAsIDB4M2RiZjQ4MDAsIDB4M2RjMDZhMDAsIDB4M2RjMThjMDAsIDB4M2RjMmFlMDAsIDB4M2RjM2QwMDAsIDB4M2RjNGYyMDAsIDB4M2RjNjE0MDAsIDB4M2RjNzM2MDAsIDB4M2RjODU4MDAsIDB4M2RjOTdhMDAsIDB4M2RjYTljMDAsIDB4M2RjYmJlMDAsIDB4M2RjY2UwMDAsCisgICAgMHgzZGNlMDIwMCwgMHgzZGNmMjQwMCwgMHgzZGQwNDYwMCwgMHgzZGQxNjgwMCwgMHgzZGQyOGEwMCwgMHgzZGQzYWMwMCwgMHgzZGQ0Y2UwMCwgMHgzZGQ1ZjAwMCwgMHgzZGQ3MTIwMCwgMHgzZGQ4MzQwMCwgMHgzZGQ5NTYwMCwgMHgzZGRhNzgwMCwgMHgzZGRiOWEwMCwgMHgzZGRjYmMwMCwgMHgzZGRkZGUwMCwgMHgzZGRmMDAwMCwKKyAgICAweDNkZTAyMjAwLCAweDNkZTE0NDAwLCAweDNkZTI2NjAwLCAweDNkZTM4ODAwLCAweDNkZTRhYTAwLCAweDNkZTVjYzAwLCAweDNkZTZlZTAwLCAweDNkZTgxMDAwLCAweDNkZTkzMjAwLCAweDNkZWE1NDAwLCAweDNkZWI3NjAwLCAweDNkZWM5ODAwLCAweDNkZWRiYTAwLCAweDNkZWVkYzAwLCAweDNkZWZmZTAwLCAweDNkZjEyMDAwLAorICAgIDB4M2RmMjQyMDAsIDB4M2RmMzY0MDAsIDB4M2RmNDg2MDAsIDB4M2RmNWE4MDAsIDB4M2RmNmNhMDAsIDB4M2RmN2VjMDAsIDB4M2RmOTBlMDAsIDB4M2RmYTMwMDAsIDB4M2RmYjUyMDAsIDB4M2RmYzc0MDAsIDB4M2RmZDk2MDAsIDB4M2RmZWI4MDAsIDB4M2RmZmRhMDAsIDB4M2UwMGZjMDAsIDB4M2UwMjFlMDAsIDB4M2UwMzQwMDAsCisgICAgMHgzZTA0NjIwMCwgMHgzZTA1ODQwMCwgMHgzZTA2YTYwMCwgMHgzZTA3YzgwMCwgMHgzZTA4ZWEwMCwgMHgzZTBhMGMwMCwgMHgzZTBiMmUwMCwgMHgzZTBjNTAwMCwgMHgzZTBkNzIwMCwgMHgzZTBlOTQwMCwgMHgzZTBmYjYwMCwgMHgzZTEwZDgwMCwgMHgzZTExZmEwMCwgMHgzZTEzMWMwMCwgMHgzZTE0M2UwMCwgMHgzZTE1NjAwMCwKKyAgICAweDNlMTY4MjAwLCAweDNlMTdhNDAwLCAweDNlMThjNjAwLCAweDNlMTllODAwLCAweDNlMWIwYTAwLCAweDNlMWMyYzAwLCAweDNlMWQ0ZTAwLCAweDNlMWU3MDAwLCAweDNlMWY5MjAwLCAweDNlMjBiNDAwLCAweDNlMjFkNjAwLCAweDNlMjJmODAwLCAweDNlMjQxYTAwLCAweDNlMjUzYzAwLCAweDNlMjY1ZTAwLCAweDNlMjc4MDAwLAorICAgIDB4M2UyOGEyMDAsIDB4M2UyOWM0MDAsIDB4M2UyYWU2MDAsIDB4M2UyYzA4MDAsIDB4M2UyZDJhMDAsIDB4M2UyZTRjMDAsIDB4M2UyZjZlMDAsIDB4M2UzMDkwMDAsIDB4M2UzMWIyMDAsIDB4M2UzMmQ0MDAsIDB4M2UzM2Y2MDAsIDB4M2UzNTE4MDAsIDB4M2UzNjNhMDAsIDB4M2UzNzVjMDAsIDB4M2UzODdlMDAsIDB4M2UzOWEwMDAsCisgICAgMHgzZTNhYzIwMCwgMHgzZTNiZTQwMCwgMHgzZTNkMDYwMCwgMHgzZTNlMjgwMCwgMHgzZTNmNGEwMCwgMHgzZTQwNmMwMCwgMHgzZTQxOGUwMCwgMHgzZTQyYjAwMCwgMHgzZTQzZDIwMCwgMHgzZTQ0ZjQwMCwgMHgzZTQ2MTYwMCwgMHgzZTQ3MzgwMCwgMHgzZTQ4NWEwMCwgMHgzZTQ5N2MwMCwgMHgzZTRhOWUwMCwgMHgzZTRiYzAwMCwKKyAgICAweDNlNGNlMjAwLCAweDNlNGUwNDAwLCAweDNlNGYyNjAwLCAweDNlNTA0ODAwLCAweDNlNTE2YTAwLCAweDNlNTI4YzAwLCAweDNlNTNhZTAwLCAweDNlNTRkMDAwLCAweDNlNTVmMjAwLCAweDNlNTcxNDAwLCAweDNlNTgzNjAwLCAweDNlNTk1ODAwLCAweDNlNWE3YTAwLCAweDNlNWI5YzAwLCAweDNlNWNiZTAwLCAweDNlNWRlMDAwLAorICAgIDB4M2U1ZjAyMDAsIDB4M2U2MDI0MDAsIDB4M2U2MTQ2MDAsIDB4M2U2MjY4MDAsIDB4M2U2MzhhMDAsIDB4M2U2NGFjMDAsIDB4M2U2NWNlMDAsIDB4M2U2NmYwMDAsIDB4M2U2ODEyMDAsIDB4M2U2OTM0MDAsIDB4M2U2YTU2MDAsIDB4M2U2Yjc4MDAsIDB4M2U2YzlhMDAsIDB4M2U2ZGJjMDAsIDB4M2U2ZWRlMDAsIDB4M2U3MDAwMDAsCisgICAgMHgzZTcxMjEwMCwgMHgzZTcyNDMwMCwgMHgzZTczNjUwMCwgMHgzZTc0ODcwMCwgMHgzZTc1YTkwMCwgMHgzZTc2Y2IwMCwgMHgzZTc3ZWQwMCwgMHgzZTc5MGYwMCwgMHgzZTdhMzEwMCwgMHgzZTdiNTMwMCwgMHgzZTdjNzUwMCwgMHgzZTdkOTcwMCwgMHgzZTdlYjkwMCwgMHgzZTdmZGIwMCwgMHgzZTgwZmQwMCwgMHgzZTgyMWYwMCwKKyAgICAweDNlODM0MTAwLCAweDNlODQ2MzAwLCAweDNlODU4NTAwLCAweDNlODZhNzAwLCAweDNlODdjOTAwLCAweDNlODhlYjAwLCAweDNlOGEwZDAwLCAweDNlOGIyZjAwLCAweDNlOGM1MTAwLCAweDNlOGQ3MzAwLCAweDNlOGU5NTAwLCAweDNlOGZiNzAwLCAweDNlOTBkOTAwLCAweDNlOTFmYjAwLCAweDNlOTMxZDAwLCAweDNlOTQzZjAwLAorICAgIDB4M2U5NTYxMDAsIDB4M2U5NjgzMDAsIDB4M2U5N2E1MDAsIDB4M2U5OGM3MDAsIDB4M2U5OWU5MDAsIDB4M2U5YjBiMDAsIDB4M2U5YzJkMDAsIDB4M2U5ZDRmMDAsIDB4M2U5ZTcxMDAsIDB4M2U5ZjkzMDAsIDB4M2VhMGI1MDAsIDB4M2VhMWQ3MDAsIDB4M2VhMmY5MDAsIDB4M2VhNDFiMDAsIDB4M2VhNTNkMDAsIDB4M2VhNjVmMDAsCisgICAgMHgzZWE3ODEwMCwgMHgzZWE4YTMwMCwgMHgzZWE5YzUwMCwgMHgzZWFhZTcwMCwgMHgzZWFjMDkwMCwgMHgzZWFkMmIwMCwgMHgzZWFlNGQwMCwgMHgzZWFmNmYwMCwgMHgzZWIwOTEwMCwgMHgzZWIxYjMwMCwgMHgzZWIyZDUwMCwgMHgzZWIzZjcwMCwgMHgzZWI1MTkwMCwgMHgzZWI2M2IwMCwgMHgzZWI3NWQwMCwgMHgzZWI4N2YwMCwKKyAgICAweDNlYjlhMTAwLCAweDNlYmFjMzAwLCAweDNlYmJlNTAwLCAweDNlYmQwNzAwLCAweDNlYmUyOTAwLCAweDNlYmY0YjAwLCAweDNlYzA2ZDAwLCAweDNlYzE4ZjAwLCAweDNlYzJiMTAwLCAweDNlYzNkMzAwLCAweDNlYzRmNTAwLCAweDNlYzYxNzAwLCAweDNlYzczOTAwLCAweDNlYzg1YjAwLCAweDNlYzk3ZDAwLCAweDNlY2E5ZjAwLAorICAgIDB4M2VjYmMxMDAsIDB4M2VjY2UzMDAsIDB4M2VjZTA1MDAsIDB4M2VjZjI3MDAsIDB4M2VkMDQ5MDAsIDB4M2VkMTZiMDAsIDB4M2VkMjhkMDAsIDB4M2VkM2FmMDAsIDB4M2VkNGQxMDAsIDB4M2VkNWYzMDAsIDB4M2VkNzE1MDAsIDB4M2VkODM3MDAsIDB4M2VkOTU5MDAsIDB4M2VkYTdiMDAsIDB4M2VkYjlkMDAsIDB4M2VkY2JmMDAsCisgICAgMHgzZWRkZTEwMCwgMHgzZWRmMDMwMCwgMHgzZWUwMjUwMCwgMHgzZWUxNDcwMCwgMHgzZWUyNjkwMCwgMHgzZWUzOGIwMCwgMHgzZWU0YWQwMCwgMHgzZWU1Y2YwMCwgMHgzZWU2ZjEwMCwgMHgzZWU4MTMwMCwgMHgzZWU5MzUwMCwgMHgzZWVhNTcwMCwgMHgzZWViNzkwMCwgMHgzZWVjOWIwMCwgMHgzZWVkYmQwMCwgMHgzZWVlZGYwMCwKKyAgICAweDNlZjAwMTAwLCAweDNlZjEyMzAwLCAweDNlZjI0NTAwLCAweDNlZjM2NzAwLCAweDNlZjQ4OTAwLCAweDNlZjVhYjAwLCAweDNlZjZjZDAwLCAweDNlZjdlZjAwLCAweDNlZjkxMTAwLCAweDNlZmEzMzAwLCAweDNlZmI1NTAwLCAweDNlZmM3NzAwLCAweDNlZmQ5OTAwLCAweDNlZmViYjAwLCAweDNlZmZkZDAwLCAweDNmMDBmZjAwLAorICAgIDB4M2YwMjIxMDAsIDB4M2YwMzQzMDAsIDB4M2YwNDY1MDAsIDB4M2YwNTg3MDAsIDB4M2YwNmE5MDAsIDB4M2YwN2NiMDAsIDB4M2YwOGVkMDAsIDB4M2YwYTBmMDAsIDB4M2YwYjMxMDAsIDB4M2YwYzUzMDAsIDB4M2YwZDc1MDAsIDB4M2YwZTk3MDAsIDB4M2YwZmI5MDAsIDB4M2YxMGRiMDAsIDB4M2YxMWZkMDAsIDB4M2YxMzFmMDAsCisgICAgMHgzZjE0NDEwMCwgMHgzZjE1NjMwMCwgMHgzZjE2ODUwMCwgMHgzZjE3YTcwMCwgMHgzZjE4YzkwMCwgMHgzZjE5ZWIwMCwgMHgzZjFiMGQwMCwgMHgzZjFjMmYwMCwgMHgzZjFkNTEwMCwgMHgzZjFlNzMwMCwgMHgzZjFmOTUwMCwgMHgzZjIwYjcwMCwgMHgzZjIxZDkwMCwgMHgzZjIyZmIwMCwgMHgzZjI0MWQwMCwgMHgzZjI1M2YwMCwKKyAgICAweDNmMjY2MTAwLCAweDNmMjc4MzAwLCAweDNmMjhhNTAwLCAweDNmMjljNzAwLCAweDNmMmFlOTAwLCAweDNmMmMwYjAwLCAweDNmMmQyZDAwLCAweDNmMmU0ZjAwLCAweDNmMmY3MTAwLCAweDNmMzA5MzAwLCAweDNmMzFiNTAwLCAweDNmMzJkNzAwLCAweDNmMzNmOTAwLCAweDNmMzUxYjAwLCAweDNmMzYzZDAwLCAweDNmMzc1ZjAwLAorICAgIDB4M2YzODgxMDAsIDB4M2YzOWEzMDAsIDB4M2YzYWM1MDAsIDB4M2YzYmU3MDAsIDB4M2YzZDA5MDAsIDB4M2YzZTJiMDAsIDB4M2YzZjRkMDAsIDB4M2Y0MDZmMDAsIDB4M2Y0MTkxMDAsIDB4M2Y0MmIzMDAsIDB4M2Y0M2Q1MDAsIDB4M2Y0NGY3MDAsIDB4M2Y0NjE5MDAsIDB4M2Y0NzNiMDAsIDB4M2Y0ODVkMDAsIDB4M2Y0OTdmMDAsCisgICAgMHgzZjRhYTEwMCwgMHgzZjRiYzMwMCwgMHgzZjRjZTUwMCwgMHgzZjRlMDcwMCwgMHgzZjRmMjkwMCwgMHgzZjUwNGIwMCwgMHgzZjUxNmQwMCwgMHgzZjUyOGYwMCwgMHgzZjUzYjEwMCwgMHgzZjU0ZDMwMCwgMHgzZjU1ZjUwMCwgMHgzZjU3MTcwMCwgMHgzZjU4MzkwMCwgMHgzZjU5NWIwMCwgMHgzZjVhN2QwMCwgMHgzZjViOWYwMCwKKyAgICAweDNmNWNjMTAwLCAweDNmNWRlMzAwLCAweDNmNWYwNTAwLCAweDNmNjAyNzAwLCAweDNmNjE0OTAwLCAweDNmNjI2YjAwLCAweDNmNjM4ZDAwLCAweDNmNjRhZjAwLCAweDNmNjVkMTAwLCAweDNmNjZmMzAwLCAweDNmNjgxNTAwLCAweDNmNjkzNzAwLCAweDNmNmE1OTAwLCAweDNmNmI3YjAwLCAweDNmNmM5ZDAwLCAweDNmNmRiZjAwLAorICAgIDB4M2Y2ZWUxMDAsIDB4M2Y3MDAzMDAsIDB4M2Y3MTI1MDAsIDB4M2Y3MjQ3MDAsIDB4M2Y3MzY5MDAsIDB4M2Y3NDhiMDAsIDB4M2Y3NWFkMDAsIDB4M2Y3NmNmMDAsIDB4M2Y3N2YxMDAsIDB4M2Y3OTEzMDAsIDB4M2Y3YTM1MDAsIDB4M2Y3YjU3MDAsIDB4M2Y3Yzc5MDAsIDB4M2Y3ZDliMDAsIDB4M2Y3ZWJkMDAsIDB4M2Y3ZmRmMDAsCisgICAgMHgzZjgxMDEwMCwgMHgzZjgyMjMwMCwgMHgzZjgzNDUwMCwgMHgzZjg0NjcwMCwgMHgzZjg1ODkwMCwgMHgzZjg2YWIwMCwgMHgzZjg3Y2QwMCwgMHgzZjg4ZWYwMCwgMHgzZjhhMTEwMCwgMHgzZjhiMzMwMCwgMHgzZjhjNTUwMCwgMHgzZjhkNzcwMCwgMHgzZjhlOTkwMCwgMHgzZjhmYmIwMCwgMHgzZjkwZGQwMCwgMHgzZjkxZmYwMCwKKyAgICAweDNmOTM1MzAwLCAweDNmOTRhNzAwLCAweDNmOTVmYjAwLCAweDNmOTc0ZjAwLCAweDNmOThhMzAwLCAweDNmOTlmNzAwLCAweDNmOWI0YjAwLCAweDNmOWM5ZjAwLCAweDNmOWRmMzAwLCAweDNmOWY0NzAwLCAweDNmYTA5YjAwLCAweDNmYTFlZjAwLCAweDNmYTM0MzAwLCAweDNmYTQ5NzAwLCAweDNmYTVlYjAwLCAweDNmYTczZjAwLAorICAgIDB4M2ZhODkzMDAsIDB4M2ZhOWU3MDAsIDB4M2ZhYjNiMDAsIDB4M2ZhYzhmMDAsIDB4M2ZhZGUzMDAsIDB4M2ZhZjM3MDAsIDB4M2ZiMDhiMDAsIDB4M2ZiMWRmMDAsIDB4M2ZiMzMzMDAsIDB4M2ZiNDg3MDAsIDB4M2ZiNWRiMDAsIDB4M2ZiNzJmMDAsIDB4M2ZiODgzMDAsIDB4M2ZiOWQ3MDAsIDB4M2ZiYjJiMDAsIDB4M2ZiYzdmMDAsCisgICAgMHgzZmJkZDMwMCwgMHgzZmJmMjcwMCwgMHgzZmMwN2IwMCwgMHgzZmMxY2YwMCwgMHgzZmMzMjMwMCwgMHgzZmM0NzcwMCwgMHgzZmM1Y2IwMCwgMHgzZmM3MWYwMCwgMHgzZmM4NzMwMCwgMHgzZmM5YzcwMCwgMHgzZmNiMWIwMCwgMHgzZmNjNmYwMCwgMHgzZmNkYzMwMCwgMHgzZmNmMTcwMCwgMHgzZmQwNmIwMCwgMHgzZmQxYmYwMCwKKyAgICAweDNmZDMxMzAwLCAweDNmZDQ2NzAwLCAweDNmZDViYjAwLCAweDNmZDcwZjAwLCAweDNmZDg2MzAwLCAweDNmZDliNzAwLCAweDNmZGIwYjAwLCAweDNmZGM1ZjAwLCAweDNmZGRiMzAwLCAweDNmZGYwNzAwLCAweDNmZTA1YjAwLCAweDNmZTFhZjAwLCAweDNmZTMwMzAwLCAweDNmZTQ1NzAwLCAweDNmZTVhYjAwLCAweDNmZTZmZjAwLAorICAgIDB4M2ZlODUzMDAsIDB4M2ZlOWE3MDAsIDB4M2ZlYWZiMDAsIDB4M2ZlYzRmMDAsIDB4M2ZlZGEzMDAsIDB4M2ZlZWY3MDAsIDB4M2ZmMDRiMDAsIDB4M2ZmMTlmMDAsIDB4M2ZmMmYzMDAsIDB4M2ZmNDQ3MDAsIDB4M2ZmNTliMDAsIDB4M2ZmNmVmMDAsIDB4M2ZmODQzMDAsIDB4M2ZmOTk3MDAsIDB4M2ZmYWViMDAsIDB4M2ZmYzNmMDAsCisgICAgMHgzZmZkOTMwMCwgMHgzZmZlZTcwMCwgMHg0MDAwM2IwMCwgMHg0MDAxOGYwMCwgMHg0MDAyZTMwMCwgMHg0MDA0MzcwMCwgMHg0MDA1OGIwMCwgMHg0MDA2ZGYwMCwgMHg0MDA4MzMwMCwgMHg0MDA5ODcwMCwgMHg0MDBhZGIwMCwgMHg0MDBjMmYwMCwgMHg0MDBkODMwMCwgMHg0MDBlZDcwMCwgMHg0MDEwMmIwMCwgMHg0MDExN2YwMCwKKyAgICAweDQwMTJkMzAwLCAweDQwMTQyNzAwLCAweDQwMTU3YjAwLCAweDQwMTZjZjAwLCAweDQwMTgyMzAwLCAweDQwMTk3NzAwLCAweDQwMWFjYjAwLCAweDQwMWMxZjAwLCAweDQwMWQ3MzAwLCAweDQwMWVjNzAwLCAweDQwMjAxYjAwLCAweDQwMjE2ZjAwLCAweDQwMjJjMzAwLCAweDQwMjQxNzAwLCAweDQwMjU2YjAwLCAweDQwMjZiZjAwLAorICAgIDB4NDAyODEzMDAsIDB4NDAyOTY3MDAsIDB4NDAyYWJiMDAsIDB4NDAyYzBmMDAsIDB4NDAyZDYzMDAsIDB4NDAyZWI3MDAsIDB4NDAzMDBiMDAsIDB4NDAzMTVmMDAsIDB4NDAzMmIzMDAsIDB4NDAzNDA3MDAsIDB4NDAzNTViMDAsIDB4NDAzNmFmMDAsIDB4NDAzODAzMDAsIDB4NDAzOTU3MDAsIDB4NDAzYWFiMDAsIDB4NDAzYmZmMDAsCisgICAgMHg0MDNkNTMwMCwgMHg0MDNlYTcwMCwgMHg0MDNmZmIwMCwgMHg0MDQxNGYwMCwgMHg0MDQyYTMwMCwgMHg0MDQzZjcwMCwgMHg0MDQ1NGIwMCwgMHg0MDQ2OWYwMCwgMHg0MDQ3ZjMwMCwgMHg0MDQ5NDcwMCwgMHg0MDRhOWIwMCwgMHg0MDRiZWYwMCwgMHg0MDRkNDMwMCwgMHg0MDRlOTcwMCwgMHg0MDRmZWIwMCwgMHg0MDUxM2YwMCwKKyAgICAweDQwNTI5MzAwLCAweDQwNTNlNzAwLCAweDQwNTUzYjAwLCAweDQwNTY4ZjAwLCAweDQwNTdlMzAwLCAweDQwNTkzNzAwLCAweDQwNWE4YjAwLCAweDQwNWJkZjAwLCAweDQwNWQzMzAwLCAweDQwNWU4NzAwLCAweDQwNWZkYjAwLCAweDQwNjEyZjAwLCAweDQwNjI4MzAwLCAweDQwNjNkNzAwLCAweDQwNjUyYjAwLCAweDQwNjY3ZjAwLAorICAgIDB4NDA2N2QzMDAsIDB4NDA2OTI3MDAsIDB4NDA2YTdiMDAsIDB4NDA2YmNmMDAsIDB4NDA2ZDIzMDAsIDB4NDA2ZTc3MDAsIDB4NDA2ZmNiMDAsIDB4NDA3MTFmMDAsIDB4NDA3MjczMDAsIDB4NDA3M2M3MDAsIDB4NDA3NTFiMDAsIDB4NDA3NjZmMDAsIDB4NDA3N2MzMDAsIDB4NDA3OTE3MDAsIDB4NDA3YTZiMDAsIDB4NDA3YmJmMDAsCisgICAgMHg0MDdkMTMwMCwgMHg0MDdlNjcwMCwgMHg0MDdmYmIwMCwgMHg0MDgxMGYwMCwgMHg0MDgyNjMwMCwgMHg0MDgzYjcwMCwgMHg0MDg1MGIwMCwgMHg0MDg2NWYwMCwgMHg0MDg3YjMwMCwgMHg0MDg5MDcwMCwgMHg0MDhhNWIwMCwgMHg0MDhiYWYwMCwgMHg0MDhkMDMwMCwgMHg0MDhlNTcwMCwgMHg0MDhmYWIwMCwgMHg0MDkwZmYwMCwKKyAgICAweDQwOTI1MzAwLCAweDQwOTNhNzAwLCAweDQwOTRmYjAwLCAweDQwOTY0ZjAwLCAweDQwOTdhMzAwLCAweDQwOThmNzAwLCAweDQwOWE0YjAwLCAweDQwOWI5ZjAwLCAweDQwOWNmMzAwLCAweDQwOWU0NzAwLCAweDQwOWY5YjAwLCAweDQwYTBlZjAwLCAweDQwYTI0MzAwLCAweDQwYTM5NzAwLCAweDQwYTRlYjAwLCAweDQwYTYzZjAwLAorICAgIDB4NDBhNzkzMDAsIDB4NDBhOGU3MDAsIDB4NDBhYTNiMDAsIDB4NDBhYjhmMDAsIDB4NDBhY2UzMDAsIDB4NDBhZTM3MDAsIDB4NDBhZjhiMDAsIDB4NDBiMGRmMDAsIDB4NDBiMjMzMDAsIDB4NDBiMzg3MDAsIDB4NDBiNGRiMDAsIDB4NDBiNjJmMDAsIDB4NDBiNzgzMDAsIDB4NDBiOGQ3MDAsIDB4NDBiYTJiMDAsIDB4NDBiYjdmMDAsCisgICAgMHg0MGJjZDMwMCwgMHg0MGJlMjcwMCwgMHg0MGJmN2IwMCwgMHg0MGMwY2YwMCwgMHg0MGMyMjMwMCwgMHg0MGMzNzcwMCwgMHg0MGM0Y2IwMCwgMHg0MGM2MWYwMCwgMHg0MGM3NzMwMCwgMHg0MGM4YzcwMCwgMHg0MGNhMWIwMCwgMHg0MGNiNmYwMCwgMHg0MGNjYzMwMCwgMHg0MGNlMTcwMCwgMHg0MGNmNmIwMCwgMHg0MGQwYmYwMCwKKyAgICAweDQwZDIxMzAwLCAweDQwZDM2NzAwLCAweDQwZDRiYjAwLCAweDQwZDYwZjAwLCAweDQwZDc2MzAwLCAweDQwZDhiNzAwLCAweDQwZGEwYjAwLCAweDQwZGI1ZjAwLCAweDQwZGNiMzAwLCAweDQwZGUwNzAwLCAweDQwZGY1YjAwLCAweDQwZTBhZjAwLCAweDQwZTIwMzAwLCAweDQwZTM1NzAwLCAweDQwZTRhYjAwLCAweDQwZTVmZjAwLAorICAgIDB4NDBlNzUzMDAsIDB4NDBlOGE3MDAsIDB4NDBlOWZiMDAsIDB4NDBlYjRmMDAsIDB4NDBlY2EzMDAsIDB4NDBlZGY3MDAsIDB4NDBlZjRiMDAsIDB4NDBmMDlmMDAsIDB4NDBmMWYzMDAsIDB4NDBmMzQ3MDAsIDB4NDBmNDliMDAsIDB4NDBmNWVmMDAsIDB4NDBmNzQzMDAsIDB4NDBmODk3MDAsIDB4NDBmOWViMDAsIDB4NDBmYjNmMDAsCisgICAgMHg0MGZjOTMwMCwgMHg0MGZkZTcwMCwgMHg0MGZmM2IwMCwgMHg0MTAwOGYwMCwgMHg0MTAxZTMwMCwgMHg0MTAzMzcwMCwgMHg0MTA0OGIwMCwgMHg0MTA1ZGYwMCwgMHg0MTA3MzMwMCwgMHg0MTA4ODcwMCwgMHg0MTA5ZGIwMCwgMHg0MTBiMmYwMCwgMHg0MTBjODMwMCwgMHg0MTBkZDcwMCwgMHg0MTBmMmIwMCwgMHg0MTEwN2YwMCwKKyAgICAweDQxMTFkMzAwLCAweDQxMTMyNzAwLCAweDQxMTQ3YjAwLCAweDQxMTVjZjAwLCAweDQxMTcyMzAwLCAweDQxMTg3NzAwLCAweDQxMTljYjAwLCAweDQxMWIxZjAwLCAweDQxMWM3MzAwLCAweDQxMWRjNzAwLCAweDQxMWYxYjAwLCAweDQxMjA2ZjAwLCAweDQxMjFjMzAwLCAweDQxMjMxNzAwLCAweDQxMjQ2YjAwLCAweDQxMjViZjAwLAorICAgIDB4NDEyNzEzMDAsIDB4NDEyODY3MDAsIDB4NDEyOWJiMDAsIDB4NDEyYjBmMDAsIDB4NDEyYzYzMDAsIDB4NDEyZGI3MDAsIDB4NDEyZjBiMDAsIDB4NDEzMDVmMDAsIDB4NDEzMWIzMDAsIDB4NDEzMzA3MDAsIDB4NDEzNDViMDAsIDB4NDEzNWFmMDAsIDB4NDEzNzAzMDAsIDB4NDEzODU3MDAsIDB4NDEzOWFiMDAsIDB4NDEzYWZmMDAsCisgICAgMHg0MTNjNTMwMCwgMHg0MTNkYTcwMCwgMHg0MTNlZmIwMCwgMHg0MTQwNGYwMCwgMHg0MTQxYTMwMCwgMHg0MTQyZjcwMCwgMHg0MTQ0NGIwMCwgMHg0MTQ1OWYwMCwgMHg0MTQ2ZjMwMCwgMHg0MTQ4NDcwMCwgMHg0MTQ5OWIwMCwgMHg0MTRhZWYwMCwgMHg0MTRjNDMwMCwgMHg0MTRkOTcwMCwgMHg0MTRlZWIwMCwgMHg0MTUwM2YwMCwKKyAgICAweDQxNTE5MzAwLCAweDQxNTJlNzAwLCAweDQxNTQzYjAwLCAweDQxNTU4ZjAwLCAweDQxNTZlMzAwLCAweDQxNTgzNzAwLCAweDQxNTk4YjAwLCAweDQxNWFkZjAwLCAweDQxNWMzMzAwLCAweDQxNWQ4NzAwLCAweDQxNWVkYjAwLCAweDQxNjAyZjAwLCAweDQxNjE4MzAwLCAweDQxNjJkNzAwLCAweDQxNjQyYjAwLCAweDQxNjU3ZjAwLAorICAgIDB4NDE2NmQzMDAsIDB4NDE2ODI3MDAsIDB4NDE2OTdiMDAsIDB4NDE2YWNmMDAsIDB4NDE2YzIzMDAsIDB4NDE2ZDc3MDAsIDB4NDE2ZWNiMDAsIDB4NDE3MDFmMDAsIDB4NDE3MTczMDAsIDB4NDE3MmM3MDAsIDB4NDE3NDFiMDAsIDB4NDE3NTZmMDAsIDB4NDE3NmMzMDAsIDB4NDE3ODE3MDAsIDB4NDE3OTZiMDAsIDB4NDE3YWJmMDAsCisgICAgMHg0MTdjMTMwMCwgMHg0MTdkNjcwMCwgMHg0MTdlYmIwMCwgMHg0MTgwMGYwMCwgMHg0MTgxNjMwMCwgMHg0MTgyYjcwMCwgMHg0MTg0MGIwMCwgMHg0MTg1NWYwMCwgMHg0MTg2YjMwMCwgMHg0MTg4MDcwMCwgMHg0MTg5NWIwMCwgMHg0MThhYWYwMCwgMHg0MThjMDMwMCwgMHg0MThkNTcwMCwgMHg0MThlYWIwMCwgMHg0MThmZmYwMCwKKyAgICAweDQxOTE1MzAwLCAweDQxOTJhNzAwLCAweDQxOTNmYjAwLCAweDQxOTU0ZjAwLCAweDQxOTZhMzAwLCAweDQxOTdmNzAwLCAweDQxOTk0YjAwLCAweDQxOWE5ZjAwLCAweDQxOWJmMzAwLCAweDQxOWQ0NzAwLCAweDQxOWU5YjAwLCAweDQxOWZlZjAwLCAweDQxYTE0MzAwLCAweDQxYTI5NzAwLCAweDQxYTNlYjAwLCAweDQxYTUzZjAwLAorICAgIDB4NDFhNjkzMDAsIDB4NDFhN2U3MDAsIDB4NDFhOTNiMDAsIDB4NDFhYThmMDAsIDB4NDFhYmUzMDAsIDB4NDFhZDM3MDAsIDB4NDFhZThiMDAsIDB4NDFhZmRmMDAsIDB4NDFiMTMzMDAsIDB4NDFiMjg3MDAsIDB4NDFiM2RiMDAsIDB4NDFiNTJmMDAsIDB4NDFiNjgzMDAsIDB4NDFiN2Q3MDAsIDB4NDFiOTJiMDAsIDB4NDFiYTdmMDAsCisgICAgMHg0MWJiZDMwMCwgMHg0MWJkMjcwMCwgMHg0MWJlN2IwMCwgMHg0MWJmY2YwMCwgMHg0MWMxMjMwMCwgMHg0MWMyNzcwMCwgMHg0MWMzY2IwMCwgMHg0MWM1MWYwMCwgMHg0MWM2NzMwMCwgMHg0MWM3YzcwMCwgMHg0MWM5MWIwMCwgMHg0MWNhNmYwMCwgMHg0MWNiYzMwMCwgMHg0MWNkMTcwMCwgMHg0MWNlNmIwMCwgMHg0MWNmYmYwMCwKKyAgICAweDQxZDExMzAwLCAweDQxZDI2NzAwLCAweDQxZDNiYjAwLCAweDQxZDUwZjAwLCAweDQxZDY2MzAwLCAweDQxZDdiNzAwLCAweDQxZDkwYjAwLCAweDQxZGE1ZjAwLCAweDQxZGJiMzAwLCAweDQxZGQwNzAwLCAweDQxZGU1YjAwLCAweDQxZGZhZjAwLCAweDQxZTEwMzAwLCAweDQxZTI1NzAwLCAweDQxZTNhYjAwLCAweDQxZTRmZjAwLAorICAgIDB4NDFlNjUzMDAsIDB4NDFlN2E3MDAsIDB4NDFlOGZiMDAsIDB4NDFlYTRmMDAsIDB4NDFlYmEzMDAsIDB4NDFlY2Y3MDAsIDB4NDFlZTRiMDAsIDB4NDFlZjlmMDAsIDB4NDFmMGYzMDAsIDB4NDFmMjQ3MDAsIDB4NDFmMzliMDAsIDB4NDFmNGVmMDAsIDB4NDFmNjQzMDAsIDB4NDFmNzk3MDAsIDB4NDFmOGViMDAsIDB4NDFmYTNmMDAsCisgICAgMHg0MWZiOTMwMCwgMHg0MWZjZTcwMCwgMHg0MWZlM2IwMCwgMHg0MWZmOGYwMCwgMHg0MjAwZTMwMCwgMHg0MjAyMzcwMCwgMHg0MjAzOGIwMCwgMHg0MjA0ZGYwMCwgMHg0MjA2MzMwMCwgMHg0MjA3ODcwMCwgMHg0MjA4ZGIwMCwgMHg0MjBhMmYwMCwgMHg0MjBiODMwMCwgMHg0MjBjZDcwMCwgMHg0MjBlMmIwMCwgMHg0MjBmN2YwMCwKKyAgICAweDQyMTBkMzAwLCAweDQyMTIyNzAwLCAweDQyMTM3YjAwLCAweDQyMTRjZjAwLCAweDQyMTYyMzAwLCAweDQyMTc3NzAwLCAweDQyMThjYjAwLCAweDQyMWExZjAwLCAweDQyMWI3MzAwLCAweDQyMWNjNzAwLCAweDQyMWUxYjAwLCAweDQyMWY2ZjAwLCAweDQyMjBjMzAwLCAweDQyMjIxNzAwLCAweDQyMjM2YjAwLCAweDQyMjRiZjAwLAorICAgIDB4NDIyNjEzMDAsIDB4NDIyNzY3MDAsIDB4NDIyOGJiMDAsIDB4NDIyYTBmMDAsIDB4NDIyYjYzMDAsIDB4NDIyY2I3MDAsIDB4NDIyZTBiMDAsIDB4NDIyZjVmMDAsIDB4NDIzMGIzMDAsIDB4NDIzMjA3MDAsIDB4NDIzMzViMDAsIDB4NDIzNGFmMDAsIDB4NDIzNjAzMDAsIDB4NDIzNzU3MDAsIDB4NDIzOGFiMDAsIDB4NDIzOWZmMDAsCisgICAgMHg0MjNiOWQwMCwgMHg0MjNkM2IwMCwgMHg0MjNlZDkwMCwgMHg0MjQwNzcwMCwgMHg0MjQyMTUwMCwgMHg0MjQzYjMwMCwgMHg0MjQ1NTEwMCwgMHg0MjQ2ZWYwMCwgMHg0MjQ4OGQwMCwgMHg0MjRhMmIwMCwgMHg0MjRiYzkwMCwgMHg0MjRkNjcwMCwgMHg0MjRmMDUwMCwgMHg0MjUwYTMwMCwgMHg0MjUyNDEwMCwgMHg0MjUzZGYwMCwKKyAgICAweDQyNTU3ZDAwLCAweDQyNTcxYjAwLCAweDQyNThiOTAwLCAweDQyNWE1NzAwLCAweDQyNWJmNTAwLCAweDQyNWQ5MzAwLCAweDQyNWYzMTAwLCAweDQyNjBjZjAwLCAweDQyNjI2ZDAwLCAweDQyNjQwYjAwLCAweDQyNjVhOTAwLCAweDQyNjc0NzAwLCAweDQyNjhlNTAwLCAweDQyNmE4MzAwLCAweDQyNmMyMTAwLCAweDQyNmRiZjAwLAorICAgIDB4NDI2ZjVkMDAsIDB4NDI3MGZiMDAsIDB4NDI3Mjk5MDAsIDB4NDI3NDM3MDAsIDB4NDI3NWQ1MDAsIDB4NDI3NzczMDAsIDB4NDI3OTExMDAsIDB4NDI3YWFmMDAsIDB4NDI3YzRkMDAsIDB4NDI3ZGViMDAsIDB4NDI3Zjg5MDAsIDB4NDI4MTI3MDAsIDB4NDI4MmM1MDAsIDB4NDI4NDYzMDAsIDB4NDI4NjAxMDAsIDB4NDI4NzlmMDAsCisgICAgMHg0Mjg5M2QwMCwgMHg0MjhhZGIwMCwgMHg0MjhjNzkwMCwgMHg0MjhlMTcwMCwgMHg0MjhmYjUwMCwgMHg0MjkxNTMwMCwgMHg0MjkyZjEwMCwgMHg0Mjk0OGYwMCwgMHg0Mjk2MmQwMCwgMHg0Mjk3Y2IwMCwgMHg0Mjk5NjkwMCwgMHg0MjliMDcwMCwgMHg0MjljYTUwMCwgMHg0MjllNDMwMCwgMHg0MjlmZTEwMCwgMHg0MmExN2YwMCwKKyAgICAweDQyYTMxZDAwLCAweDQyYTRiYjAwLCAweDQyYTY1OTAwLCAweDQyYTdmNzAwLCAweDQyYTk5NTAwLCAweDQyYWIzMzAwLCAweDQyYWNkMTAwLCAweDQyYWU2ZjAwLCAweDQyYjAwZDAwLCAweDQyYjFhYjAwLCAweDQyYjM0OTAwLCAweDQyYjRlNzAwLCAweDQyYjY4NTAwLCAweDQyYjgyMzAwLCAweDQyYjljMTAwLCAweDQyYmI1ZjAwLAorICAgIDB4NDJiY2ZkMDAsIDB4NDJiZTliMDAsIDB4NDJjMDM5MDAsIDB4NDJjMWQ3MDAsIDB4NDJjMzc1MDAsIDB4NDJjNTEzMDAsIDB4NDJjNmIxMDAsIDB4NDJjODRmMDAsIDB4NDJjOWVkMDAsIDB4NDJjYjhiMDAsIDB4NDJjZDI5MDAsIDB4NDJjZWM3MDAsIDB4NDJkMDY1MDAsIDB4NDJkMjAzMDAsIDB4NDJkM2ExMDAsIDB4NDJkNTNmMDAsCisgICAgMHg0MmQ2ZGQwMCwgMHg0MmQ4N2IwMCwgMHg0MmRhMTkwMCwgMHg0MmRiYjcwMCwgMHg0MmRkNTUwMCwgMHg0MmRlZjMwMCwgMHg0MmUwOTEwMCwgMHg0MmUyMmYwMCwgMHg0MmUzY2QwMCwgMHg0MmU1NmIwMCwgMHg0MmU3MDkwMCwgMHg0MmU4YTcwMCwgMHg0MmVhNDUwMCwgMHg0MmViZTMwMCwgMHg0MmVkODEwMCwgMHg0MmVmMWYwMCwKKyAgICAweDQyZjBiZDAwLCAweDQyZjI1YjAwLCAweDQyZjNmOTAwLCAweDQyZjU5NzAwLCAweDQyZjczNTAwLCAweDQyZjhkMzAwLCAweDQyZmE3MTAwLCAweDQyZmMwZjAwLCAweDQyZmRhZDAwLCAweDQyZmY0YjAwLCAweDQzMDBlOTAwLCAweDQzMDI4NzAwLCAweDQzMDQyNTAwLCAweDQzMDVjMzAwLCAweDQzMDc2MTAwLCAweDQzMDhmZjAwLAorICAgIDB4NDMwYTlkMDAsIDB4NDMwYzNiMDAsIDB4NDMwZGQ5MDAsIDB4NDMwZjc3MDAsIDB4NDMxMTE1MDAsIDB4NDMxMmIzMDAsIDB4NDMxNDUxMDAsIDB4NDMxNWVmMDAsIDB4NDMxNzhkMDAsIDB4NDMxOTJiMDAsIDB4NDMxYWM5MDAsIDB4NDMxYzY3MDAsIDB4NDMxZTA1MDAsIDB4NDMxZmEzMDAsIDB4NDMyMTQxMDAsIDB4NDMyMmRmMDAsCisgICAgMHg0MzI0N2QwMCwgMHg0MzI2MWIwMCwgMHg0MzI3YjkwMCwgMHg0MzI5NTcwMCwgMHg0MzJhZjUwMCwgMHg0MzJjOTMwMCwgMHg0MzJlMzEwMCwgMHg0MzJmY2YwMCwgMHg0MzMxNmQwMCwgMHg0MzMzMGIwMCwgMHg0MzM0YTkwMCwgMHg0MzM2NDcwMCwgMHg0MzM3ZTUwMCwgMHg0MzM5ODMwMCwgMHg0MzNiMjEwMCwgMHg0MzNjYmYwMCwKKyAgICAweDQzM2U1ZDAwLCAweDQzM2ZmYjAwLCAweDQzNDE5OTAwLCAweDQzNDMzNzAwLCAweDQzNDRkNTAwLCAweDQzNDY3MzAwLCAweDQzNDgxMTAwLCAweDQzNDlhZjAwLCAweDQzNGI0ZDAwLCAweDQzNGNlYjAwLCAweDQzNGU4OTAwLCAweDQzNTAyNzAwLCAweDQzNTFjNTAwLCAweDQzNTM2MzAwLCAweDQzNTUwMTAwLCAweDQzNTY5ZjAwLAorICAgIDB4NDM1ODNkMDAsIDB4NDM1OWRiMDAsIDB4NDM1Yjc5MDAsIDB4NDM1ZDE3MDAsIDB4NDM1ZWI1MDAsIDB4NDM2MDUzMDAsIDB4NDM2MWYxMDAsIDB4NDM2MzhmMDAsIDB4NDM2NTJkMDAsIDB4NDM2NmNiMDAsIDB4NDM2ODY5MDAsIDB4NDM2YTA3MDAsIDB4NDM2YmE1MDAsIDB4NDM2ZDQzMDAsIDB4NDM2ZWUxMDAsIDB4NDM3MDdmMDAsCisgICAgMHg0MzcyMWQwMCwgMHg0MzczYmIwMCwgMHg0Mzc1NTkwMCwgMHg0Mzc2ZjcwMCwgMHg0Mzc4OTUwMCwgMHg0MzdhMzMwMCwgMHg0MzdiZDEwMCwgMHg0MzdkNmYwMCwgMHg0MzdmMGQwMCwgMHg0MzgwYWIwMCwgMHg0MzgyNDkwMCwgMHg0MzgzZTcwMCwgMHg0Mzg1ODUwMCwgMHg0Mzg3MjMwMCwgMHg0Mzg4YzEwMCwgMHg0MzhhNWYwMCwKKyAgICAweDQzOGJmZDAwLCAweDQzOGQ5YjAwLCAweDQzOGYzOTAwLCAweDQzOTBkNzAwLCAweDQzOTI3NTAwLCAweDQzOTQxMzAwLCAweDQzOTViMTAwLCAweDQzOTc0ZjAwLCAweDQzOThlZDAwLCAweDQzOWE4YjAwLCAweDQzOWMyOTAwLCAweDQzOWRjNzAwLCAweDQzOWY2NTAwLCAweDQzYTEwMzAwLCAweDQzYTJhMTAwLCAweDQzYTQzZjAwLAorICAgIDB4NDNhNWRkMDAsIDB4NDNhNzdiMDAsIDB4NDNhOTE5MDAsIDB4NDNhYWI3MDAsIDB4NDNhYzU1MDAsIDB4NDNhZGYzMDAsIDB4NDNhZjkxMDAsIDB4NDNiMTJmMDAsIDB4NDNiMmNkMDAsIDB4NDNiNDZiMDAsIDB4NDNiNjA5MDAsIDB4NDNiN2E3MDAsIDB4NDNiOTQ1MDAsIDB4NDNiYWUzMDAsIDB4NDNiYzgxMDAsIDB4NDNiZTFmMDAsCisgICAgMHg0M2JmYmQwMCwgMHg0M2MxNWIwMCwgMHg0M2MyZjkwMCwgMHg0M2M0OTcwMCwgMHg0M2M2MzUwMCwgMHg0M2M3ZDMwMCwgMHg0M2M5NzEwMCwgMHg0M2NiMGYwMCwgMHg0M2NjYWQwMCwgMHg0M2NlNGIwMCwgMHg0M2NmZTkwMCwgMHg0M2QxODcwMCwgMHg0M2QzMjUwMCwgMHg0M2Q0YzMwMCwgMHg0M2Q2NjEwMCwgMHg0M2Q3ZmYwMCwKKyAgICAweDQzZDk5ZDAwLCAweDQzZGIzYjAwLCAweDQzZGNkOTAwLCAweDQzZGU3NzAwLCAweDQzZTAxNTAwLCAweDQzZTFiMzAwLCAweDQzZTM1MTAwLCAweDQzZTRlZjAwLCAweDQzZTY4ZDAwLCAweDQzZTgyYjAwLCAweDQzZTljOTAwLCAweDQzZWI2NzAwLCAweDQzZWQwNTAwLCAweDQzZWVhMzAwLCAweDQzZjA0MTAwLCAweDQzZjFkZjAwLAorICAgIDB4NDNmMzdkMDAsIDB4NDNmNTFiMDAsIDB4NDNmNmI5MDAsIDB4NDNmODU3MDAsIDB4NDNmOWY1MDAsIDB4NDNmYjkzMDAsIDB4NDNmZDMxMDAsIDB4NDNmZWNmMDAsIDB4NDQwMDZkMDAsIDB4NDQwMjBiMDAsIDB4NDQwM2E5MDAsIDB4NDQwNTQ3MDAsIDB4NDQwNmU1MDAsIDB4NDQwODgzMDAsIDB4NDQwYTIxMDAsIDB4NDQwYmJmMDAsCisgICAgMHg0NDBkNWQwMCwgMHg0NDBlZmIwMCwgMHg0NDEwOTkwMCwgMHg0NDEyMzcwMCwgMHg0NDEzZDUwMCwgMHg0NDE1NzMwMCwgMHg0NDE3MTEwMCwgMHg0NDE4YWYwMCwgMHg0NDFhNGQwMCwgMHg0NDFiZWIwMCwgMHg0NDFkODkwMCwgMHg0NDFmMjcwMCwgMHg0NDIwYzUwMCwgMHg0NDIyNjMwMCwgMHg0NDI0MDEwMCwgMHg0NDI1OWYwMCwKKyAgICAweDQ0MjczZDAwLCAweDQ0MjhkYjAwLCAweDQ0MmE3OTAwLCAweDQ0MmMxNzAwLCAweDQ0MmRiNTAwLCAweDQ0MmY1MzAwLCAweDQ0MzBmMTAwLCAweDQ0MzI4ZjAwLCAweDQ0MzQyZDAwLCAweDQ0MzVjYjAwLCAweDQ0Mzc2OTAwLCAweDQ0MzkwNzAwLCAweDQ0M2FhNTAwLCAweDQ0M2M0MzAwLCAweDQ0M2RlMTAwLCAweDQ0M2Y3ZjAwLAorICAgIDB4NDQ0MTFkMDAsIDB4NDQ0MmJiMDAsIDB4NDQ0NDU5MDAsIDB4NDQ0NWY3MDAsIDB4NDQ0Nzk1MDAsIDB4NDQ0OTMzMDAsIDB4NDQ0YWQxMDAsIDB4NDQ0YzZmMDAsIDB4NDQ0ZTBkMDAsIDB4NDQ0ZmFiMDAsIDB4NDQ1MTQ5MDAsIDB4NDQ1MmU3MDAsIDB4NDQ1NDg1MDAsIDB4NDQ1NjIzMDAsIDB4NDQ1N2MxMDAsIDB4NDQ1OTVmMDAsCisgICAgMHg0NDVhZmQwMCwgMHg0NDVjOWIwMCwgMHg0NDVlMzkwMCwgMHg0NDVmZDcwMCwgMHg0NDYxNzUwMCwgMHg0NDYzMTMwMCwgMHg0NDY0YjEwMCwgMHg0NDY2NGYwMCwgMHg0NDY3ZWQwMCwgMHg0NDY5OGIwMCwgMHg0NDZiMjkwMCwgMHg0NDZjYzcwMCwgMHg0NDZlNjUwMCwgMHg0NDcwMDMwMCwgMHg0NDcxYTEwMCwgMHg0NDczM2YwMCwKKyAgICAweDQ0NzRkZDAwLCAweDQ0NzY3YjAwLCAweDQ0NzgxOTAwLCAweDQ0NzliNzAwLCAweDQ0N2I1NTAwLCAweDQ0N2NmMzAwLCAweDQ0N2U5MTAwLCAweDQ0ODAyZjAwLCAweDQ0ODFjZDAwLCAweDQ0ODM2YjAwLCAweDQ0ODUwOTAwLCAweDQ0ODZhNzAwLCAweDQ0ODg0NTAwLCAweDQ0ODllMzAwLCAweDQ0OGI4MTAwLCAweDQ0OGQxZjAwLAorICAgIDB4NDQ4ZWJkMDAsIDB4NDQ5MDViMDAsIDB4NDQ5MWY5MDAsIDB4NDQ5Mzk3MDAsIDB4NDQ5NTM1MDAsIDB4NDQ5NmQzMDAsIDB4NDQ5ODcxMDAsIDB4NDQ5YTBmMDAsIDB4NDQ5YmFkMDAsIDB4NDQ5ZDRiMDAsIDB4NDQ5ZWU5MDAsIDB4NDRhMDg3MDAsIDB4NDRhMjI1MDAsIDB4NDRhM2MzMDAsIDB4NDRhNTYxMDAsIDB4NDRhNmZmMDAsCisgICAgMHg0NGE4OWQwMCwgMHg0NGFhM2IwMCwgMHg0NGFiZDkwMCwgMHg0NGFkNzcwMCwgMHg0NGFmMTUwMCwgMHg0NGIwYjMwMCwgMHg0NGIyNTEwMCwgMHg0NGIzZWYwMCwgMHg0NGI1OGQwMCwgMHg0NGI3MmIwMCwgMHg0NGI4YzkwMCwgMHg0NGJhNjcwMCwgMHg0NGJjMDUwMCwgMHg0NGJkYTMwMCwgMHg0NGJmNDEwMCwgMHg0NGMwZGYwMCwKKyAgICAweDQ0YzI3ZDAwLCAweDQ0YzQxYjAwLCAweDQ0YzViOTAwLCAweDQ0Yzc1NzAwLCAweDQ0YzhmNTAwLCAweDQ0Y2E5MzAwLCAweDQ0Y2MzMTAwLCAweDQ0Y2RjZjAwLCAweDQ0Y2Y2ZDAwLCAweDQ0ZDEwYjAwLCAweDQ0ZDJhOTAwLCAweDQ0ZDQ0NzAwLCAweDQ0ZDVlNTAwLCAweDQ0ZDc4MzAwLCAweDQ0ZDkyMTAwLCAweDQ0ZGFiZjAwLAorICAgIDB4NDRkYzVkMDAsIDB4NDRkZGZiMDAsIDB4NDRkZjk5MDAsIDB4NDRlMTM3MDAsIDB4NDRlMmQ1MDAsIDB4NDRlNDczMDAsIDB4NDRlNjExMDAsIDB4NDRlN2FmMDAsIDB4NDRlOTRkMDAsIDB4NDRlYWViMDAsIDB4NDRlYzg5MDAsIDB4NDRlZTI3MDAsIDB4NDRlZmM1MDAsIDB4NDRmMTYzMDAsIDB4NDRmMzAxMDAsIDB4NDRmNDlmMDAsCisgICAgMHg0NGY2M2QwMCwgMHg0NGY3ZGIwMCwgMHg0NGY5NzkwMCwgMHg0NGZiMTcwMCwgMHg0NGZjYjUwMCwgMHg0NGZlNTMwMCwgMHg0NGZmZjEwMCwgMHg0NTAxOGYwMCwgMHg0NTAzMmQwMCwgMHg0NTA0Y2IwMCwgMHg0NTA2NjkwMCwgMHg0NTA4MDcwMCwgMHg0NTA5YTUwMCwgMHg0NTBiNDMwMCwgMHg0NTBjZTEwMCwgMHg0NTBlN2YwMCwKKyAgICAweDQ1MTAxZDAwLCAweDQ1MTFiYjAwLCAweDQ1MTM1OTAwLCAweDQ1MTRmNzAwLCAweDQ1MTY5NTAwLCAweDQ1MTgzMzAwLCAweDQ1MTlkMTAwLCAweDQ1MWI2ZjAwLCAweDQ1MWQwZDAwLCAweDQ1MWVhYjAwLCAweDQ1MjA0OTAwLCAweDQ1MjFlNzAwLCAweDQ1MjM4NTAwLCAweDQ1MjUyMzAwLCAweDQ1MjZjMTAwLCAweDQ1Mjg1ZjAwLAorICAgIDB4NDUyOWZkMDAsIDB4NDUyYjliMDAsIDB4NDUyZDM5MDAsIDB4NDUyZWQ3MDAsIDB4NDUzMDc1MDAsIDB4NDUzMjEzMDAsIDB4NDUzM2IxMDAsIDB4NDUzNTRmMDAsIDB4NDUzNmVkMDAsIDB4NDUzODhiMDAsIDB4NDUzYTI5MDAsIDB4NDUzYmM3MDAsIDB4NDUzZDY1MDAsIDB4NDUzZjAzMDAsIDB4NDU0MGExMDAsIDB4NDU0MjNmMDAsCisgICAgMHg0NTQzZGQwMCwgMHg0NTQ1N2IwMCwgMHg0NTQ3MTkwMCwgMHg0NTQ4YjcwMCwgMHg0NTRhNTUwMCwgMHg0NTRiZjMwMCwgMHg0NTRkOTEwMCwgMHg0NTRmMmYwMCwgMHg0NTUwY2QwMCwgMHg0NTUyNmIwMCwgMHg0NTU0MDkwMCwgMHg0NTU1YTcwMCwgMHg0NTU3NDUwMCwgMHg0NTU4ZTMwMCwgMHg0NTVhODEwMCwgMHg0NTVjMWYwMCwKKyAgICAweDQ1NWRiZDAwLCAweDQ1NWY1YjAwLCAweDQ1NjBmOTAwLCAweDQ1NjI5NzAwLCAweDQ1NjQzNTAwLCAweDQ1NjVkMzAwLCAweDQ1Njc3MTAwLCAweDQ1NjkwZjAwLCAweDQ1NmFhZDAwLCAweDQ1NmM0YjAwLCAweDQ1NmRlOTAwLCAweDQ1NmY4NzAwLCAweDQ1NzEyNTAwLCAweDQ1NzJjMzAwLCAweDQ1NzQ2MTAwLCAweDQ1NzVmZjAwLAorICAgIDB4NDU3N2UzMDAsIDB4NDU3OWM3MDAsIDB4NDU3YmFiMDAsIDB4NDU3ZDhmMDAsIDB4NDU3ZjczMDAsIDB4NDU4MTU3MDAsIDB4NDU4MzNiMDAsIDB4NDU4NTFmMDAsIDB4NDU4NzAzMDAsIDB4NDU4OGU3MDAsIDB4NDU4YWNiMDAsIDB4NDU4Y2FmMDAsIDB4NDU4ZTkzMDAsIDB4NDU5MDc3MDAsIDB4NDU5MjViMDAsIDB4NDU5NDNmMDAsCisgICAgMHg0NTk2MjMwMCwgMHg0NTk4MDcwMCwgMHg0NTk5ZWIwMCwgMHg0NTliY2YwMCwgMHg0NTlkYjMwMCwgMHg0NTlmOTcwMCwgMHg0NWExN2IwMCwgMHg0NWEzNWYwMCwgMHg0NWE1NDMwMCwgMHg0NWE3MjcwMCwgMHg0NWE5MGIwMCwgMHg0NWFhZWYwMCwgMHg0NWFjZDMwMCwgMHg0NWFlYjcwMCwgMHg0NWIwOWIwMCwgMHg0NWIyN2YwMCwKKyAgICAweDQ1YjQ2MzAwLCAweDQ1YjY0NzAwLCAweDQ1YjgyYjAwLCAweDQ1YmEwZjAwLCAweDQ1YmJmMzAwLCAweDQ1YmRkNzAwLCAweDQ1YmZiYjAwLCAweDQ1YzE5ZjAwLCAweDQ1YzM4MzAwLCAweDQ1YzU2NzAwLCAweDQ1Yzc0YjAwLCAweDQ1YzkyZjAwLCAweDQ1Y2IxMzAwLCAweDQ1Y2NmNzAwLCAweDQ1Y2VkYjAwLCAweDQ1ZDBiZjAwLAorICAgIDB4NDVkMmEzMDAsIDB4NDVkNDg3MDAsIDB4NDVkNjZiMDAsIDB4NDVkODRmMDAsIDB4NDVkYTMzMDAsIDB4NDVkYzE3MDAsIDB4NDVkZGZiMDAsIDB4NDVkZmRmMDAsIDB4NDVlMWMzMDAsIDB4NDVlM2E3MDAsIDB4NDVlNThiMDAsIDB4NDVlNzZmMDAsIDB4NDVlOTUzMDAsIDB4NDVlYjM3MDAsIDB4NDVlZDFiMDAsIDB4NDVlZWZmMDAsCisgICAgMHg0NWYwZTMwMCwgMHg0NWYyYzcwMCwgMHg0NWY0YWIwMCwgMHg0NWY2OGYwMCwgMHg0NWY4NzMwMCwgMHg0NWZhNTcwMCwgMHg0NWZjM2IwMCwgMHg0NWZlMWYwMCwgMHg0NjAwMDMwMCwgMHg0NjAxZTcwMCwgMHg0NjAzY2IwMCwgMHg0NjA1YWYwMCwgMHg0NjA3OTMwMCwgMHg0NjA5NzcwMCwgMHg0NjBiNWIwMCwgMHg0NjBkM2YwMCwKKyAgICAweDQ2MGYyMzAwLCAweDQ2MTEwNzAwLCAweDQ2MTJlYjAwLCAweDQ2MTRjZjAwLCAweDQ2MTZiMzAwLCAweDQ2MTg5NzAwLCAweDQ2MWE3YjAwLCAweDQ2MWM1ZjAwLCAweDQ2MWU0MzAwLCAweDQ2MjAyNzAwLCAweDQ2MjIwYjAwLCAweDQ2MjNlZjAwLCAweDQ2MjVkMzAwLCAweDQ2MjdiNzAwLCAweDQ2Mjk5YjAwLCAweDQ2MmI3ZjAwLAorICAgIDB4NDYyZDYzMDAsIDB4NDYyZjQ3MDAsIDB4NDYzMTJiMDAsIDB4NDYzMzBmMDAsIDB4NDYzNGYzMDAsIDB4NDYzNmQ3MDAsIDB4NDYzOGJiMDAsIDB4NDYzYTlmMDAsIDB4NDYzYzgzMDAsIDB4NDYzZTY3MDAsIDB4NDY0MDRiMDAsIDB4NDY0MjJmMDAsIDB4NDY0NDEzMDAsIDB4NDY0NWY3MDAsIDB4NDY0N2RiMDAsIDB4NDY0OWJmMDAsCisgICAgMHg0NjRiYTMwMCwgMHg0NjRkODcwMCwgMHg0NjRmNmIwMCwgMHg0NjUxNGYwMCwgMHg0NjUzMzMwMCwgMHg0NjU1MTcwMCwgMHg0NjU2ZmIwMCwgMHg0NjU4ZGYwMCwgMHg0NjVhYzMwMCwgMHg0NjVjYTcwMCwgMHg0NjVlOGIwMCwgMHg0NjYwNmYwMCwgMHg0NjYyNTMwMCwgMHg0NjY0MzcwMCwgMHg0NjY2MWIwMCwgMHg0NjY3ZmYwMCwKKyAgICAweDQ2NjllMzAwLCAweDQ2NmJjNzAwLCAweDQ2NmRhYjAwLCAweDQ2NmY4ZjAwLCAweDQ2NzE3MzAwLCAweDQ2NzM1NzAwLCAweDQ2NzUzYjAwLCAweDQ2NzcxZjAwLCAweDQ2NzkwMzAwLCAweDQ2N2FlNzAwLCAweDQ2N2NjYjAwLCAweDQ2N2VhZjAwLCAweDQ2ODA5MzAwLCAweDQ2ODI3NzAwLCAweDQ2ODQ1YjAwLCAweDQ2ODYzZjAwLAorICAgIDB4NDY4ODIzMDAsIDB4NDY4YTA3MDAsIDB4NDY4YmViMDAsIDB4NDY4ZGNmMDAsIDB4NDY4ZmIzMDAsIDB4NDY5MTk3MDAsIDB4NDY5MzdiMDAsIDB4NDY5NTVmMDAsIDB4NDY5NzQzMDAsIDB4NDY5OTI3MDAsIDB4NDY5YjBiMDAsIDB4NDY5Y2VmMDAsIDB4NDY5ZWQzMDAsIDB4NDZhMGI3MDAsIDB4NDZhMjliMDAsIDB4NDZhNDdmMDAsCisgICAgMHg0NmE2NjMwMCwgMHg0NmE4NDcwMCwgMHg0NmFhMmIwMCwgMHg0NmFjMGYwMCwgMHg0NmFkZjMwMCwgMHg0NmFmZDcwMCwgMHg0NmIxYmIwMCwgMHg0NmIzOWYwMCwgMHg0NmI1ODMwMCwgMHg0NmI3NjcwMCwgMHg0NmI5NGIwMCwgMHg0NmJiMmYwMCwgMHg0NmJkMTMwMCwgMHg0NmJlZjcwMCwgMHg0NmMwZGIwMCwgMHg0NmMyYmYwMCwKKyAgICAweDQ2YzRhMzAwLCAweDQ2YzY4NzAwLCAweDQ2Yzg2YjAwLCAweDQ2Y2E0ZjAwLCAweDQ2Y2MzMzAwLCAweDQ2Y2UxNzAwLCAweDQ2Y2ZmYjAwLCAweDQ2ZDFkZjAwLCAweDQ2ZDNjMzAwLCAweDQ2ZDVhNzAwLCAweDQ2ZDc4YjAwLCAweDQ2ZDk2ZjAwLCAweDQ2ZGI1MzAwLCAweDQ2ZGQzNzAwLCAweDQ2ZGYxYjAwLCAweDQ2ZTBmZjAwLAorICAgIDB4NDZlMmUzMDAsIDB4NDZlNGM3MDAsIDB4NDZlNmFiMDAsIDB4NDZlODhmMDAsIDB4NDZlYTczMDAsIDB4NDZlYzU3MDAsIDB4NDZlZTNiMDAsIDB4NDZmMDFmMDAsIDB4NDZmMjAzMDAsIDB4NDZmM2U3MDAsIDB4NDZmNWNiMDAsIDB4NDZmN2FmMDAsIDB4NDZmOTkzMDAsIDB4NDZmYjc3MDAsIDB4NDZmZDViMDAsIDB4NDZmZjNmMDAsCisgICAgMHg0NzAxMjMwMCwgMHg0NzAzMDcwMCwgMHg0NzA0ZWIwMCwgMHg0NzA2Y2YwMCwgMHg0NzA4YjMwMCwgMHg0NzBhOTcwMCwgMHg0NzBjN2IwMCwgMHg0NzBlNWYwMCwgMHg0NzEwNDMwMCwgMHg0NzEyMjcwMCwgMHg0NzE0MGIwMCwgMHg0NzE1ZWYwMCwgMHg0NzE3ZDMwMCwgMHg0NzE5YjcwMCwgMHg0NzFiOWIwMCwgMHg0NzFkN2YwMCwKKyAgICAweDQ3MWY2MzAwLCAweDQ3MjE0NzAwLCAweDQ3MjMyYjAwLCAweDQ3MjUwZjAwLCAweDQ3MjZmMzAwLCAweDQ3MjhkNzAwLCAweDQ3MmFiYjAwLCAweDQ3MmM5ZjAwLCAweDQ3MmU4MzAwLCAweDQ3MzA2NzAwLCAweDQ3MzI0YjAwLCAweDQ3MzQyZjAwLCAweDQ3MzYxMzAwLCAweDQ3MzdmNzAwLCAweDQ3MzlkYjAwLCAweDQ3M2JiZjAwLAorICAgIDB4NDczZGEzMDAsIDB4NDczZjg3MDAsIDB4NDc0MTZiMDAsIDB4NDc0MzRmMDAsIDB4NDc0NTMzMDAsIDB4NDc0NzE3MDAsIDB4NDc0OGZiMDAsIDB4NDc0YWRmMDAsIDB4NDc0Y2MzMDAsIDB4NDc0ZWE3MDAsIDB4NDc1MDhiMDAsIDB4NDc1MjZmMDAsIDB4NDc1NDUzMDAsIDB4NDc1NjM3MDAsIDB4NDc1ODFiMDAsIDB4NDc1OWZmMDAsCisgICAgMHg0NzVjM2YwMCwgMHg0NzVlN2YwMCwgMHg0NzYwYmYwMCwgMHg0NzYyZmYwMCwgMHg0NzY1M2YwMCwgMHg0NzY3N2YwMCwgMHg0NzY5YmYwMCwgMHg0NzZiZmYwMCwgMHg0NzZlM2YwMCwgMHg0NzcwN2YwMCwgMHg0NzcyYmYwMCwgMHg0Nzc0ZmYwMCwgMHg0Nzc3M2YwMCwgMHg0Nzc5N2YwMCwgMHg0NzdiYmYwMCwgMHg0NzdkZmYwMCwKKyAgICAweDQ3ODAzZjAwLCAweDQ3ODI3ZjAwLCAweDQ3ODRiZjAwLCAweDQ3ODZmZjAwLCAweDQ3ODkzZjAwLCAweDQ3OGI3ZjAwLCAweDQ3OGRiZjAwLCAweDQ3OGZmZjAwLCAweDQ3OTIzZjAwLCAweDQ3OTQ3ZjAwLCAweDQ3OTZiZjAwLCAweDQ3OThmZjAwLCAweDQ3OWIzZjAwLCAweDQ3OWQ3ZjAwLCAweDQ3OWZiZjAwLCAweDQ3YTFmZjAwLAorICAgIDB4NDdhNDNmMDAsIDB4NDdhNjdmMDAsIDB4NDdhOGJmMDAsIDB4NDdhYWZmMDAsIDB4NDdhZDNmMDAsIDB4NDdhZjdmMDAsIDB4NDdiMWJmMDAsIDB4NDdiM2ZmMDAsIDB4NDdiNjNmMDAsIDB4NDdiODdmMDAsIDB4NDdiYWJmMDAsIDB4NDdiY2ZmMDAsIDB4NDdiZjNmMDAsIDB4NDdjMTdmMDAsIDB4NDdjM2JmMDAsIDB4NDdjNWZmMDAsCisgICAgMHg0N2M4M2YwMCwgMHg0N2NhN2YwMCwgMHg0N2NjYmYwMCwgMHg0N2NlZmYwMCwgMHg0N2QxM2YwMCwgMHg0N2QzN2YwMCwgMHg0N2Q1YmYwMCwgMHg0N2Q3ZmYwMCwgMHg0N2RhM2YwMCwgMHg0N2RjN2YwMCwgMHg0N2RlYmYwMCwgMHg0N2UwZmYwMCwgMHg0N2UzM2YwMCwgMHg0N2U1N2YwMCwgMHg0N2U3YmYwMCwgMHg0N2U5ZmYwMCwKKyAgICAweDQ3ZWMzZjAwLCAweDQ3ZWU3ZjAwLCAweDQ3ZjBiZjAwLCAweDQ3ZjJmZjAwLCAweDQ3ZjUzZjAwLCAweDQ3Zjc3ZjAwLCAweDQ3ZjliZjAwLCAweDQ3ZmJmZjAwLCAweDQ3ZmUzZjAwLCAweDQ4MDA3ZjAwLCAweDQ4MDJiZjAwLCAweDQ4MDRmZjAwLCAweDQ4MDczZjAwLCAweDQ4MDk3ZjAwLCAweDQ4MGJiZjAwLCAweDQ4MGRmZjAwLAorICAgIDB4NDgxMDNmMDAsIDB4NDgxMjdmMDAsIDB4NDgxNGJmMDAsIDB4NDgxNmZmMDAsIDB4NDgxOTNmMDAsIDB4NDgxYjdmMDAsIDB4NDgxZGJmMDAsIDB4NDgxZmZmMDAsIDB4NDgyMjNmMDAsIDB4NDgyNDdmMDAsIDB4NDgyNmJmMDAsIDB4NDgyOGZmMDAsIDB4NDgyYjNmMDAsIDB4NDgyZDdmMDAsIDB4NDgyZmJmMDAsIDB4NDgzMWZmMDAsCisgICAgMHg0ODM0M2YwMCwgMHg0ODM2N2YwMCwgMHg0ODM4YmYwMCwgMHg0ODNhZmYwMCwgMHg0ODNkM2YwMCwgMHg0ODNmN2YwMCwgMHg0ODQxYmYwMCwgMHg0ODQzZmYwMCwgMHg0ODQ2M2YwMCwgMHg0ODQ4N2YwMCwgMHg0ODRhYmYwMCwgMHg0ODRjZmYwMCwgMHg0ODRmM2YwMCwgMHg0ODUxN2YwMCwgMHg0ODUzYmYwMCwgMHg0ODU1ZmYwMCwKKyAgICAweDQ4NTgzZjAwLCAweDQ4NWE3ZjAwLCAweDQ4NWNiZjAwLCAweDQ4NWVmZjAwLCAweDQ4NjEzZjAwLCAweDQ4NjM3ZjAwLCAweDQ4NjViZjAwLCAweDQ4NjdmZjAwLCAweDQ4NmEzZjAwLCAweDQ4NmM3ZjAwLCAweDQ4NmViZjAwLCAweDQ4NzBmZjAwLCAweDQ4NzMzZjAwLCAweDQ4NzU3ZjAwLCAweDQ4NzdiZjAwLCAweDQ4NzlmZjAwLAorICAgIDB4NDg3YzNmMDAsIDB4NDg3ZTdmMDAsIDB4NDg4MGJmMDAsIDB4NDg4MmZmMDAsIDB4NDg4NTNmMDAsIDB4NDg4NzdmMDAsIDB4NDg4OWJmMDAsIDB4NDg4YmZmMDAsIDB4NDg4ZTNmMDAsIDB4NDg5MDdmMDAsIDB4NDg5MmJmMDAsIDB4NDg5NGZmMDAsIDB4NDg5NzNmMDAsIDB4NDg5OTdmMDAsIDB4NDg5YmJmMDAsIDB4NDg5ZGZmMDAsCisgICAgMHg0OGEwM2YwMCwgMHg0OGEyN2YwMCwgMHg0OGE0YmYwMCwgMHg0OGE2ZmYwMCwgMHg0OGE5M2YwMCwgMHg0OGFiN2YwMCwgMHg0OGFkYmYwMCwgMHg0OGFmZmYwMCwgMHg0OGIyM2YwMCwgMHg0OGI0N2YwMCwgMHg0OGI2YmYwMCwgMHg0OGI4ZmYwMCwgMHg0OGJiM2YwMCwgMHg0OGJkN2YwMCwgMHg0OGJmYmYwMCwgMHg0OGMxZmYwMCwKKyAgICAweDQ4YzQzZjAwLCAweDQ4YzY3ZjAwLCAweDQ4YzhiZjAwLCAweDQ4Y2FmZjAwLCAweDQ4Y2QzZjAwLCAweDQ4Y2Y3ZjAwLCAweDQ4ZDFiZjAwLCAweDQ4ZDNmZjAwLCAweDQ4ZDYzZjAwLCAweDQ4ZDg3ZjAwLCAweDQ4ZGFiZjAwLCAweDQ4ZGNmZjAwLCAweDQ4ZGYzZjAwLCAweDQ4ZTE3ZjAwLCAweDQ4ZTNiZjAwLCAweDQ4ZTVmZjAwLAorICAgIDB4NDhlODNmMDAsIDB4NDhlYTdmMDAsIDB4NDhlY2JmMDAsIDB4NDhlZWZmMDAsIDB4NDhmMTNmMDAsIDB4NDhmMzdmMDAsIDB4NDhmNWJmMDAsIDB4NDhmN2ZmMDAsIDB4NDhmYTNmMDAsIDB4NDhmYzdmMDAsIDB4NDhmZWJmMDAsIDB4NDkwMGZmMDAsIDB4NDkwMzNmMDAsIDB4NDkwNTdmMDAsIDB4NDkwN2JmMDAsIDB4NDkwOWZmMDAsCisgICAgMHg0OTBjM2YwMCwgMHg0OTBlN2YwMCwgMHg0OTEwYmYwMCwgMHg0OTEyZmYwMCwgMHg0OTE1M2YwMCwgMHg0OTE3N2YwMCwgMHg0OTE5YmYwMCwgMHg0OTFiZmYwMCwgMHg0OTFlM2YwMCwgMHg0OTIwN2YwMCwgMHg0OTIyYmYwMCwgMHg0OTI0ZmYwMCwgMHg0OTI3M2YwMCwgMHg0OTI5N2YwMCwgMHg0OTJiYmYwMCwgMHg0OTJkZmYwMCwKKyAgICAweDQ5MzAzZjAwLCAweDQ5MzI3ZjAwLCAweDQ5MzRiZjAwLCAweDQ5MzZmZjAwLCAweDQ5MzkzZjAwLCAweDQ5M2I3ZjAwLCAweDQ5M2RiZjAwLCAweDQ5M2ZmZjAwLCAweDQ5NDIzZjAwLCAweDQ5NDQ3ZjAwLCAweDQ5NDZiZjAwLCAweDQ5NDhmZjAwLCAweDQ5NGIzZjAwLCAweDQ5NGQ3ZjAwLCAweDQ5NGZiZjAwLCAweDQ5NTFmZjAwLAorICAgIDB4NDk1NDNmMDAsIDB4NDk1NjdmMDAsIDB4NDk1OGJmMDAsIDB4NDk1YWZmMDAsIDB4NDk1ZDNmMDAsIDB4NDk1ZjdmMDAsIDB4NDk2MWJmMDAsIDB4NDk2M2ZmMDAsIDB4NDk2NjNmMDAsIDB4NDk2ODdmMDAsIDB4NDk2YWJmMDAsIDB4NDk2Y2ZmMDAsIDB4NDk2ZjNmMDAsIDB4NDk3MTdmMDAsIDB4NDk3M2JmMDAsIDB4NDk3NWZmMDAsCisgICAgMHg0OTc4M2YwMCwgMHg0OTdhN2YwMCwgMHg0OTdjYmYwMCwgMHg0OTdlZmYwMCwgMHg0OTgxM2YwMCwgMHg0OTgzN2YwMCwgMHg0OTg1YmYwMCwgMHg0OTg3ZmYwMCwgMHg0OThhM2YwMCwgMHg0OThjN2YwMCwgMHg0OThlYmYwMCwgMHg0OTkwZmYwMCwgMHg0OTkzM2YwMCwgMHg0OTk1N2YwMCwgMHg0OTk3YmYwMCwgMHg0OTk5ZmYwMCwKKyAgICAweDQ5OWNiMzAwLCAweDQ5OWY2NzAwLCAweDQ5YTIxYjAwLCAweDQ5YTRjZjAwLCAweDQ5YTc4MzAwLCAweDQ5YWEzNzAwLCAweDQ5YWNlYjAwLCAweDQ5YWY5ZjAwLCAweDQ5YjI1MzAwLCAweDQ5YjUwNzAwLCAweDQ5YjdiYjAwLCAweDQ5YmE2ZjAwLCAweDQ5YmQyMzAwLCAweDQ5YmZkNzAwLCAweDQ5YzI4YjAwLCAweDQ5YzUzZjAwLAorICAgIDB4NDljN2YzMDAsIDB4NDljYWE3MDAsIDB4NDljZDViMDAsIDB4NDlkMDBmMDAsIDB4NDlkMmMzMDAsIDB4NDlkNTc3MDAsIDB4NDlkODJiMDAsIDB4NDlkYWRmMDAsIDB4NDlkZDkzMDAsIDB4NDllMDQ3MDAsIDB4NDllMmZiMDAsIDB4NDllNWFmMDAsIDB4NDllODYzMDAsIDB4NDllYjE3MDAsIDB4NDllZGNiMDAsIDB4NDlmMDdmMDAsCisgICAgMHg0OWYzMzMwMCwgMHg0OWY1ZTcwMCwgMHg0OWY4OWIwMCwgMHg0OWZiNGYwMCwgMHg0OWZlMDMwMCwgMHg0YTAwYjcwMCwgMHg0YTAzNmIwMCwgMHg0YTA2MWYwMCwgMHg0YTA4ZDMwMCwgMHg0YTBiODcwMCwgMHg0YTBlM2IwMCwgMHg0YTEwZWYwMCwgMHg0YTEzYTMwMCwgMHg0YTE2NTcwMCwgMHg0YTE5MGIwMCwgMHg0YTFiYmYwMCwKKyAgICAweDRhMWU3MzAwLCAweDRhMjEyNzAwLCAweDRhMjNkYjAwLCAweDRhMjY4ZjAwLCAweDRhMjk0MzAwLCAweDRhMmJmNzAwLCAweDRhMmVhYjAwLCAweDRhMzE1ZjAwLCAweDRhMzQxMzAwLCAweDRhMzZjNzAwLCAweDRhMzk3YzAwLCAweDRhM2MzMDAwLCAweDRhM2VlNDAwLCAweDRhNDE5ODAwLCAweDRhNDQ0YzAwLCAweDRhNDcwMDAwLAorICAgIDB4NGE0OWI0MDAsIDB4NGE0YzY4MDAsIDB4NGE0ZjFjMDAsIDB4NGE1MWQwMDAsIDB4NGE1NDg0MDAsIDB4NGE1NzM4MDAsIDB4NGE1OWVjMDAsIDB4NGE1Y2EwMDAsIDB4NGE1ZjU0MDAsIDB4NGE2MjA4MDAsIDB4NGE2NGJjMDAsIDB4NGE2NzcwMDAsIDB4NGE2YTI0MDAsIDB4NGE2Y2Q4MDAsIDB4NGE2ZjhjMDAsIDB4NGE3MjQwMDAsCisgICAgMHg0YTc0ZjQwMCwgMHg0YTc3YTgwMCwgMHg0YTdhNWMwMCwgMHg0YTdkMTAwMCwgMHg0YTdmYzQwMCwgMHg0YTgyNzgwMCwgMHg0YTg1MmMwMCwgMHg0YTg3ZTAwMCwgMHg0YThhOTQwMCwgMHg0YThkNDgwMCwgMHg0YThmZmMwMCwgMHg0YTkyYjAwMCwgMHg0YTk1NjQwMCwgMHg0YTk4MTgwMCwgMHg0YTlhY2MwMCwgMHg0YTlkODAwMCwKKyAgICAweDRhYTAzNDAwLCAweDRhYTJlODAwLCAweDRhYTU5YzAwLCAweDRhYTg1MDAwLCAweDRhYWIwNDAwLCAweDRhYWRiODAwLCAweDRhYjA2YzAwLCAweDRhYjMyMDAwLCAweDRhYjVkNDAwLCAweDRhYjg4ODAwLCAweDRhYmIzYzAwLCAweDRhYmRmMDAwLCAweDRhYzBhNDAwLCAweDRhYzM1ODAwLCAweDRhYzYwYzAwLCAweDRhYzhjMDAwLAorICAgIDB4NGFjYjc0MDAsIDB4NGFjZTI4MDAsIDB4NGFkMGRjMDAsIDB4NGFkMzkwMDAsIDB4NGFkNjQ0MDAsIDB4NGFkOGY4MDAsIDB4NGFkYmFjMDAsIDB4NGFkZTYwMDAsIDB4NGFlMTE0MDAsIDB4NGFlM2M4MDAsIDB4NGFlNjdjMDAsIDB4NGFlOTMwMDAsIDB4NGFlYmU0MDAsIDB4NGFlZTk4MDAsIDB4NGFmMTRjMDAsIDB4NGFmNDAwMDAsCisgICAgMHg0YWY2Y2MwMCwgMHg0YWY5OTgwMCwgMHg0YWZjNjQwMCwgMHg0YWZmMzAwMCwgMHg0YjAxZmMwMCwgMHg0YjA0YzgwMCwgMHg0YjA3OTQwMCwgMHg0YjBhNjAwMCwgMHg0YjBkMmMwMCwgMHg0YjBmZjgwMCwgMHg0YjEyYzQwMCwgMHg0YjE1OTAwMCwgMHg0YjE4NWMwMCwgMHg0YjFiMjgwMCwgMHg0YjFkZjQwMCwgMHg0YjIwYzAwMCwKKyAgICAweDRiMjM4YzAwLCAweDRiMjY1ODAwLCAweDRiMjkyNDAwLCAweDRiMmJmMDAwLCAweDRiMmViYzAwLCAweDRiMzE4ODAwLCAweDRiMzQ1NDAwLCAweDRiMzcyMDAwLCAweDRiMzllYzAwLCAweDRiM2NiODAwLCAweDRiM2Y4NDAwLCAweDRiNDI1MDAwLCAweDRiNDUxYzAwLCAweDRiNDdlODAwLCAweDRiNGFiNDAwLCAweDRiNGQ4MDAwLAorICAgIDB4NGI1MDRjMDAsIDB4NGI1MzE4MDAsIDB4NGI1NWU0MDAsIDB4NGI1OGIwMDAsIDB4NGI1YjdjMDAsIDB4NGI1ZTQ4MDAsIDB4NGI2MTE0MDAsIDB4NGI2M2UwMDAsIDB4NGI2NmFjMDAsIDB4NGI2OTc4MDAsIDB4NGI2YzQ0MDAsIDB4NGI2ZjEwMDAsIDB4NGI3MWRjMDAsIDB4NGI3NGE4MDAsIDB4NGI3Nzc0MDAsIDB4NGI3YTQwMDAsCisgICAgMHg0YjdkMGMwMCwgMHg0YjdmZDgwMCwgMHg0YjgyYTQwMCwgMHg0Yjg1NzAwMCwgMHg0Yjg4M2MwMCwgMHg0YjhiMDgwMCwgMHg0YjhkZDQwMCwgMHg0YjkwYTAwMCwgMHg0YjkzNmMwMCwgMHg0Yjk2MzgwMCwgMHg0Yjk5MDQwMCwgMHg0YjliZDAwMCwgMHg0YjllOWMwMCwgMHg0YmExNjgwMCwgMHg0YmE0MzQwMCwgMHg0YmE3MDAwMCwKKyAgICAweDRiYTljYzAwLCAweDRiYWM5ODAwLCAweDRiYWY2NDAwLCAweDRiYjIzMDAwLCAweDRiYjRmYzAwLCAweDRiYjdjNzAwLCAweDRiYmE5MzAwLCAweDRiYmQ1ZjAwLCAweDRiYzAyYjAwLCAweDRiYzJmNzAwLCAweDRiYzVjMzAwLCAweDRiYzg4ZjAwLCAweDRiY2I1YjAwLCAweDRiY2UyNzAwLCAweDRiZDBmMzAwLCAweDRiZDNiZjAwLAorICAgIDB4NGJkNjhiMDAsIDB4NGJkOTU3MDAsIDB4NGJkYzIzMDAsIDB4NGJkZWVmMDAsIDB4NGJlMWJiMDAsIDB4NGJlNDg3MDAsIDB4NGJlNzUzMDAsIDB4NGJlYTFmMDAsIDB4NGJlY2ViMDAsIDB4NGJlZmI3MDAsIDB4NGJmMjgzMDAsIDB4NGJmNTRmMDAsIDB4NGJmODFiMDAsIDB4NGJmYWU3MDAsIDB4NGJmZGIzMDAsIDB4NGMwMDdmMDAsCisgICAgMHg0YzAzNGIwMCwgMHg0YzA2MTcwMCwgMHg0YzA4ZTMwMCwgMHg0YzBiYWYwMCwgMHg0YzBlN2IwMCwgMHg0YzExNDcwMCwgMHg0YzE0MTMwMCwgMHg0YzE2ZGYwMCwgMHg0YzE5YWIwMCwgMHg0YzFjNzcwMCwgMHg0YzFmNDMwMCwgMHg0YzIyMGYwMCwgMHg0YzI0ZGIwMCwgMHg0YzI3YTcwMCwgMHg0YzJhNzMwMCwgMHg0YzJkM2YwMCwKKyAgICAweDRjMzAwYjAwLCAweDRjMzJkNzAwLCAweDRjMzVhMzAwLCAweDRjMzg2ZjAwLCAweDRjM2IzYjAwLCAweDRjM2UwNzAwLCAweDRjNDBkMzAwLCAweDRjNDM5ZjAwLCAweDRjNDY2YjAwLCAweDRjNDkzNzAwLCAweDRjNGMwMzAwLCAweDRjNGVjZjAwLCAweDRjNTE5YjAwLCAweDRjNTQ2NzAwLCAweDRjNTczMzAwLCAweDRjNTlmZjAwLAorICAgIDB4NGM1ZDc3MDAsIDB4NGM2MGVmMDAsIDB4NGM2NDY3MDAsIDB4NGM2N2RmMDAsIDB4NGM2YjU3MDAsIDB4NGM2ZWNmMDAsIDB4NGM3MjQ3MDAsIDB4NGM3NWJmMDAsIDB4NGM3OTM3MDAsIDB4NGM3Y2FmMDAsIDB4NGM4MDI3MDAsIDB4NGM4MzlmMDAsIDB4NGM4NzE3MDAsIDB4NGM4YThmMDAsIDB4NGM4ZTA3MDAsIDB4NGM5MTdmMDAsCisgICAgMHg0Yzk0ZjcwMCwgMHg0Yzk4NmYwMCwgMHg0YzliZTcwMCwgMHg0YzlmNWYwMCwgMHg0Y2EyZDcwMCwgMHg0Y2E2NGYwMCwgMHg0Y2E5YzcwMCwgMHg0Y2FkM2YwMCwgMHg0Y2IwYjcwMCwgMHg0Y2I0MmYwMCwgMHg0Y2I3YTcwMCwgMHg0Y2JiMWYwMCwgMHg0Y2JlOTcwMCwgMHg0Y2MyMGYwMCwgMHg0Y2M1ODcwMCwgMHg0Y2M4ZmYwMCwKKyAgICAweDRjY2M3NzAwLCAweDRjY2ZlZjAwLCAweDRjZDM2NzAwLCAweDRjZDZkZjAwLCAweDRjZGE1NzAwLCAweDRjZGRjZjAwLCAweDRjZTE0NzAwLCAweDRjZTRiZjAwLCAweDRjZTgzNzAwLCAweDRjZWJhZjAwLCAweDRjZWYyNzAwLCAweDRjZjI5ZjAwLCAweDRjZjYxNzAwLCAweDRjZjk4ZjAwLCAweDRjZmQwNzAwLCAweDRkMDA3ZjAwLAorICAgIDB4NGQwM2Y3MDAsIDB4NGQwNzZmMDAsIDB4NGQwYWU3MDAsIDB4NGQwZTVmMDAsIDB4NGQxMWQ3MDAsIDB4NGQxNTRmMDAsIDB4NGQxOGM3MDAsIDB4NGQxYzNmMDAsIDB4NGQxZmI3MDAsIDB4NGQyMzJmMDAsIDB4NGQyNmE3MDAsIDB4NGQyYTFmMDAsIDB4NGQyZDk3MDAsIDB4NGQzMTBmMDAsIDB4NGQzNDg3MDAsIDB4NGQzN2ZmMDAsCisgICAgMHg0ZDNiNzcwMCwgMHg0ZDNlZWYwMCwgMHg0ZDQyNjcwMCwgMHg0ZDQ1ZGYwMCwgMHg0ZDQ5NTcwMCwgMHg0ZDRjY2YwMCwgMHg0ZDUwNDcwMCwgMHg0ZDUzYmYwMCwgMHg0ZDU3MzcwMCwgMHg0ZDVhYWYwMCwgMHg0ZDVlMjcwMCwgMHg0ZDYxOWYwMCwgMHg0ZDY1MTcwMCwgMHg0ZDY4OGYwMCwgMHg0ZDZjMDcwMCwgMHg0ZDZmN2YwMCwKKyAgICAweDRkNzJmNzAwLCAweDRkNzY2ZjAwLCAweDRkNzllNzAwLCAweDRkN2Q1ZjAwLCAweDRkODBkNzAwLCAweDRkODQ0ZjAwLCAweDRkODdjNzAwLCAweDRkOGIzZjAwLCAweDRkOGViNzAwLCAweDRkOTIyZjAwLCAweDRkOTVhNzAwLCAweDRkOTkxZjAwLCAweDRkOWM5NzAwLCAweDRkYTAwZjAwLCAweDRkYTM4NzAwLCAweDRkYTZmZjAwLAorICAgIDB4NGRhYTc3MDAsIDB4NGRhZGVmMDAsIDB4NGRiMTY3MDAsIDB4NGRiNGRmMDAsIDB4NGRiODU3MDAsIDB4NGRiYmNmMDAsIDB4NGRiZjQ3MDAsIDB4NGRjMmJmMDAsIDB4NGRjNjM3MDAsIDB4NGRjOWFmMDAsIDB4NGRjZDI3MDAsIDB4NGRkMDlmMDAsIDB4NGRkNDE3MDAsIDB4NGRkNzhmMDAsIDB4NGRkYjA3MDAsIDB4NGRkZTdmMDAsCisgICAgMHg0ZGUxZjcwMCwgMHg0ZGU1NmYwMCwgMHg0ZGU4ZTcwMCwgMHg0ZGVjNWYwMCwgMHg0ZGVmZDcwMCwgMHg0ZGYzNGYwMCwgMHg0ZGY2YzcwMCwgMHg0ZGZhM2YwMCwgMHg0ZGZkYjcwMCwgMHg0ZTAxMmYwMCwgMHg0ZTA0YTcwMCwgMHg0ZTA4MWYwMCwgMHg0ZTBiOTcwMCwgMHg0ZTBmMGYwMCwgMHg0ZTEyODcwMCwgMHg0ZTE1ZmYwMCwKKyAgICAweDRlMTlmZjAwLCAweDRlMWRmZjAwLCAweDRlMjFmZjAwLCAweDRlMjVmZjAwLCAweDRlMjlmZjAwLCAweDRlMmRmZjAwLCAweDRlMzFmZjAwLCAweDRlMzVmZjAwLCAweDRlMzlmZjAwLCAweDRlM2RmZjAwLCAweDRlNDFmZjAwLCAweDRlNDVmZjAwLCAweDRlNDlmZjAwLCAweDRlNGRmZjAwLCAweDRlNTFmZjAwLCAweDRlNTVmZjAwLAorICAgIDB4NGU1OWZmMDAsIDB4NGU1ZGZmMDAsIDB4NGU2MWZmMDAsIDB4NGU2NWZmMDAsIDB4NGU2OWZmMDAsIDB4NGU2ZGZmMDAsIDB4NGU3MWZmMDAsIDB4NGU3NWZmMDAsIDB4NGU3OWZmMDAsIDB4NGU3ZGZmMDAsIDB4NGU4MWZmMDAsIDB4NGU4NWZmMDAsIDB4NGU4OWZmMDAsIDB4NGU4ZGZmMDAsIDB4NGU5MWZmMDAsIDB4NGU5NWZmMDAsCisgICAgMHg0ZTk5ZmYwMCwgMHg0ZTlkZmYwMCwgMHg0ZWExZmYwMCwgMHg0ZWE1ZmYwMCwgMHg0ZWE5ZmYwMCwgMHg0ZWFkZmYwMCwgMHg0ZWIxZmYwMCwgMHg0ZWI1ZmYwMCwgMHg0ZWI5ZmYwMCwgMHg0ZWJkZmYwMCwgMHg0ZWMxZmYwMCwgMHg0ZWM1ZmYwMCwgMHg0ZWM5ZmYwMCwgMHg0ZWNkZmYwMCwgMHg0ZWQxZmYwMCwgMHg0ZWQ1ZmYwMCwKKyAgICAweDRlZDlmZjAwLCAweDRlZGRmZjAwLCAweDRlZTFmZjAwLCAweDRlZTVmZjAwLCAweDRlZTlmZjAwLCAweDRlZWRmZjAwLCAweDRlZjFmZjAwLCAweDRlZjVmZjAwLCAweDRlZjlmZjAwLCAweDRlZmRmZjAwLCAweDRmMDFmZjAwLCAweDRmMDVmZjAwLCAweDRmMDlmZjAwLCAweDRmMGRmZjAwLCAweDRmMTFmZjAwLCAweDRmMTVmZjAwLAorICAgIDB4NGYxOWZmMDAsIDB4NGYxZGZmMDAsIDB4NGYyMWZmMDAsIDB4NGYyNWZmMDAsIDB4NGYyOWZmMDAsIDB4NGYyZGZmMDAsIDB4NGYzMWZmMDAsIDB4NGYzNWZmMDAsIDB4NGYzOWZmMDAsIDB4NGYzZGZmMDAsIDB4NGY0MWZmMDAsIDB4NGY0NWZmMDAsIDB4NGY0OWZmMDAsIDB4NGY0ZGZmMDAsIDB4NGY1MWZmMDAsIDB4NGY1NWZmMDAsCisgICAgMHg0ZjU5ZmYwMCwgMHg0ZjVkZmYwMCwgMHg0ZjYxZmYwMCwgMHg0ZjY1ZmYwMCwgMHg0ZjY5ZmYwMCwgMHg0ZjZkZmYwMCwgMHg0ZjcxZmYwMCwgMHg0Zjc1ZmYwMCwgMHg0Zjc5ZmYwMCwgMHg0ZjdkZmYwMCwgMHg0ZjgxZmYwMCwgMHg0Zjg1ZmYwMCwgMHg0Zjg5ZmYwMCwgMHg0ZjhkZmYwMCwgMHg0ZjkxZmYwMCwgMHg0Zjk1ZmYwMCwKKyAgICAweDRmOTlmZjAwLCAweDRmOWRmZjAwLCAweDRmYTFmZjAwLCAweDRmYTVmZjAwLCAweDRmYTlmZjAwLCAweDRmYWRmZjAwLCAweDRmYjFmZjAwLCAweDRmYjVmZjAwLCAweDRmYjlmZjAwLCAweDRmYmRmZjAwLCAweDRmYzFmZjAwLCAweDRmYzVmZjAwLCAweDRmYzlmZjAwLCAweDRmY2RmZjAwLCAweDRmZDFmZjAwLCAweDRmZDVmZjAwLAorICAgIDB4NGZkOWZmMDAsIDB4NGZkZGZmMDAsIDB4NGZlMWZmMDAsIDB4NGZlNWZmMDAsIDB4NGZlOWZmMDAsIDB4NGZlZGZmMDAsIDB4NGZmMWZmMDAsIDB4NGZmNWZmMDAsIDB4NGZmOWZmMDAsIDB4NGZmZGZmMDAsIDB4NTAwMWZmMDAsIDB4NTAwNWZmMDAsIDB4NTAwOWZmMDAsIDB4NTAwZGZmMDAsIDB4NTAxMWZmMDAsIDB4NTAxNWZmMDAsCisgICAgMHg1MDFhNzcwMCwgMHg1MDFlZWYwMCwgMHg1MDIzNjcwMCwgMHg1MDI3ZGYwMCwgMHg1MDJjNTcwMCwgMHg1MDMwY2YwMCwgMHg1MDM1NDcwMCwgMHg1MDM5YmYwMCwgMHg1MDNlMzcwMCwgMHg1MDQyYWYwMCwgMHg1MDQ3MjcwMCwgMHg1MDRiOWYwMCwgMHg1MDUwMTcwMCwgMHg1MDU0OGYwMCwgMHg1MDU5MDcwMCwgMHg1MDVkN2YwMCwKKyAgICAweDUwNjFmNzAwLCAweDUwNjY2ZjAwLCAweDUwNmFlNzAwLCAweDUwNmY1ZjAwLCAweDUwNzNkNzAwLCAweDUwNzg1MDAwLCAweDUwN2NjODAwLCAweDUwODE0MDAwLCAweDUwODViODAwLCAweDUwOGEzMDAwLCAweDUwOGVhODAwLCAweDUwOTMyMDAwLCAweDUwOTc5ODAwLCAweDUwOWMxMDAwLCAweDUwYTA4ODAwLCAweDUwYTUwMDAwLAorICAgIDB4NTBhOTc4MDAsIDB4NTBhZGYwMDAsIDB4NTBiMjY4MDAsIDB4NTBiNmUwMDAsIDB4NTBiYjU4MDAsIDB4NTBiZmQwMDAsIDB4NTBjNDQ4MDAsIDB4NTBjOGMwMDAsIDB4NTBjZDM4MDAsIDB4NTBkMWIwMDAsIDB4NTBkNjI4MDAsIDB4NTBkYWEwMDAsIDB4NTBkZjE4MDAsIDB4NTBlMzkwMDAsIDB4NTBlODA4MDAsIDB4NTBlYzgwMDAsCisgICAgMHg1MGYwZjgwMCwgMHg1MGY1NzAwMCwgMHg1MGY5ZTgwMCwgMHg1MGZlNjAwMCwgMHg1MTAyZDgwMCwgMHg1MTA3NTAwMCwgMHg1MTBiYzgwMCwgMHg1MTEwNDAwMCwgMHg1MTE0YjgwMCwgMHg1MTE5MzAwMCwgMHg1MTFkYTgwMCwgMHg1MTIyMjAwMCwgMHg1MTI2OTgwMCwgMHg1MTJiMTAwMCwgMHg1MTJmODgwMCwgMHg1MTM0MDAwMCwKKyAgICAweDUxMzk2ODAwLCAweDUxM2VkMDAwLCAweDUxNDQzODAwLCAweDUxNDlhMDAwLCAweDUxNGYwODAwLCAweDUxNTQ3MDAwLCAweDUxNTlkODAwLCAweDUxNWY0MDAwLCAweDUxNjRhODAwLCAweDUxNmExMDAwLCAweDUxNmY3ODAwLCAweDUxNzRlMDAwLCAweDUxN2E0ODAwLCAweDUxN2ZiMDAwLCAweDUxODUxODAwLCAweDUxOGE4MDAwLAorICAgIDB4NTE4ZmU4MDAsIDB4NTE5NTUwMDAsIDB4NTE5YWI4MDAsIDB4NTFhMDIwMDAsIDB4NTFhNTg4MDAsIDB4NTFhYWYwMDAsIDB4NTFiMDU4MDAsIDB4NTFiNWMwMDAsIDB4NTFiYjI4MDAsIDB4NTFjMDkwMDAsIDB4NTFjNWY4MDAsIDB4NTFjYjYwMDAsIDB4NTFkMGM4MDAsIDB4NTFkNjMwMDAsIDB4NTFkYjk4MDAsIDB4NTFlMTAwMDAsCisgICAgMHg1MWU2NjgwMCwgMHg1MWViZDAwMCwgMHg1MWYxMzgwMCwgMHg1MWY2YTAwMCwgMHg1MWZjMDgwMCwgMHg1MjAxNzAwMCwgMHg1MjA2ZDgwMCwgMHg1MjBjNDAwMCwgMHg1MjExYTgwMCwgMHg1MjE3MTAwMCwgMHg1MjFjNzgwMCwgMHg1MjIxZTAwMCwgMHg1MjI3NDgwMCwgMHg1MjJjYjAwMCwgMHg1MjMyMTgwMCwgMHg1MjM3ODAwMCwKKyAgICAweDUyM2NlODAwLCAweDUyNDI1MDAwLCAweDUyNDdiODAwLCAweDUyNGQyMDAwLCAweDUyNTI4ODAwLCAweDUyNTdmMDAwLCAweDUyNWQ1ODAwLCAweDUyNjJjMDAwLCAweDUyNjgyODAwLCAweDUyNmQ5MDAwLCAweDUyNzJmODAwLCAweDUyNzg2MDAwLCAweDUyN2RjODAwLCAweDUyODMzMDAwLCAweDUyODg5ODAwLCAweDUyOGUwMDAwLAorICAgIDB4NTI5M2MwMDAsIDB4NTI5OTgwMDAsIDB4NTI5ZjQwMDAsIDB4NTJhNTAwMDAsIDB4NTJhYWMwMDAsIDB4NTJiMDgwMDAsIDB4NTJiNjQwMDAsIDB4NTJiYzAwMDAsIDB4NTJjMWJmMDAsIDB4NTJjNzdmMDAsIDB4NTJjZDNmMDAsIDB4NTJkMmZmMDAsIDB4NTJkOGJmMDAsIDB4NTJkZTdmMDAsIDB4NTJlNDNmMDAsIDB4NTJlOWZmMDAsCisgICAgMHg1MmVmYmYwMCwgMHg1MmY1N2YwMCwgMHg1MmZiM2YwMCwgMHg1MzAwZmYwMCwgMHg1MzA2YmYwMCwgMHg1MzBjN2YwMCwgMHg1MzEyM2YwMCwgMHg1MzE3ZmYwMCwgMHg1MzFkYmYwMCwgMHg1MzIzN2YwMCwgMHg1MzI5M2YwMCwgMHg1MzJlZmYwMCwgMHg1MzM0YmYwMCwgMHg1MzNhN2YwMCwgMHg1MzQwM2YwMCwgMHg1MzQ1ZmYwMCwKKyAgICAweDUzNGJiZjAwLCAweDUzNTE3ZjAwLCAweDUzNTczZjAwLCAweDUzNWNmZjAwLCAweDUzNjJiZjAwLCAweDUzNjg3ZjAwLCAweDUzNmUzZjAwLCAweDUzNzNmZjAwLCAweDUzNzliZjAwLCAweDUzN2Y3ZjAwLCAweDUzODUzZjAwLCAweDUzOGFmZjAwLCAweDUzOTBiZjAwLCAweDUzOTY3ZjAwLCAweDUzOWMzZjAwLCAweDUzYTFmZjAwLAorICAgIDB4NTNhN2JmMDAsIDB4NTNhZDdmMDAsIDB4NTNiMzNmMDAsIDB4NTNiOGZmMDAsIDB4NTNiZWJmMDAsIDB4NTNjNDdmMDAsIDB4NTNjYTNmMDAsIDB4NTNjZmZmMDAsIDB4NTNkNWJmMDAsIDB4NTNkYjdmMDAsIDB4NTNlMTNmMDAsIDB4NTNlNmZmMDAsIDB4NTNlY2JmMDAsIDB4NTNmMjdmMDAsIDB4NTNmODNmMDAsIDB4NTNmZGZmMDAsCisgICAgMHg1NDA1NWYwMCwgMHg1NDBjYmYwMCwgMHg1NDE0MWYwMCwgMHg1NDFiN2YwMCwgMHg1NDIyZGYwMCwgMHg1NDJhM2YwMCwgMHg1NDMxOWYwMCwgMHg1NDM4ZmYwMCwgMHg1NDQwNWYwMCwgMHg1NDQ3YmYwMCwgMHg1NDRmMWYwMCwgMHg1NDU2N2YwMCwgMHg1NDVkZGYwMCwgMHg1NDY1M2YwMCwgMHg1NDZjOWYwMCwgMHg1NDczZmYwMCwKKyAgICAweDU0N2I1ZjAwLCAweDU0ODJiZjAwLCAweDU0OGExZjAwLCAweDU0OTE3ZjAwLCAweDU0OThkZjAwLCAweDU0YTAzZjAwLCAweDU0YTc5ZjAwLCAweDU0YWVmZjAwLCAweDU0YjY1ZjAwLCAweDU0YmRiZjAwLCAweDU0YzUxZjAwLCAweDU0Y2M3ZjAwLCAweDU0ZDNkZjAwLCAweDU0ZGIzZjAwLCAweDU0ZTI5ZjAwLCAweDU0ZTlmZjAwLAorICAgIDB4NTRmMTVmMDAsIDB4NTRmOGJmMDAsIDB4NTUwMDFmMDAsIDB4NTUwNzdmMDAsIDB4NTUwZWRmMDAsIDB4NTUxNjNmMDAsIDB4NTUxZDlmMDAsIDB4NTUyNGZmMDAsIDB4NTUyYzVmMDAsIDB4NTUzM2JmMDAsIDB4NTUzYjFmMDAsIDB4NTU0MjdmMDAsIDB4NTU0OWRmMDAsIDB4NTU1MTNmMDAsIDB4NTU1ODlmMDAsIDB4NTU1ZmZmMDAsCisgICAgMHg1NTY3NWYwMCwgMHg1NTZlYmYwMCwgMHg1NTc2MWYwMCwgMHg1NTdkN2YwMCwgMHg1NTg0ZGYwMCwgMHg1NThjM2YwMCwgMHg1NTkzOWYwMCwgMHg1NTlhZmYwMCwgMHg1NWEyNWYwMCwgMHg1NWE5YmYwMCwgMHg1NWIxMWYwMCwgMHg1NWI4N2YwMCwgMHg1NWJmZGYwMCwgMHg1NWM3M2YwMCwgMHg1NWNlOWYwMCwgMHg1NWQ1ZmYwMCwKKyAgICAweDU1ZGU5ZjAwLCAweDU1ZTczZjAwLCAweDU1ZWZkZjAwLCAweDU1Zjg3ZjAwLCAweDU2MDExZjAwLCAweDU2MDliZjAwLCAweDU2MTI1ZjAwLCAweDU2MWFmZjAwLCAweDU2MjM5ZjAwLCAweDU2MmMzZjAwLCAweDU2MzRkZjAwLCAweDU2M2Q3ZjAwLCAweDU2NDYxZjAwLCAweDU2NGViZjAwLCAweDU2NTc1ZjAwLCAweDU2NWZmZjAwLAorICAgIDB4NTY2ODlmMDAsIDB4NTY3MTNmMDAsIDB4NTY3OWRmMDAsIDB4NTY4MjdmMDAsIDB4NTY4YjFmMDAsIDB4NTY5M2JmMDAsIDB4NTY5YzVmMDAsIDB4NTZhNGZmMDAsIDB4NTZhZDlmMDAsIDB4NTZiNjNmMDAsIDB4NTZiZWRmMDAsIDB4NTZjNzdmMDAsIDB4NTZkMDFmMDAsIDB4NTZkOGJmMDAsIDB4NTZlMTVmMDAsIDB4NTZlOWZmMDAsCisgICAgMHg1NmYyOWYwMCwgMHg1NmZiM2YwMCwgMHg1NzAzZGYwMCwgMHg1NzBjN2YwMCwgMHg1NzE1MWYwMCwgMHg1NzFkYmYwMCwgMHg1NzI2NWYwMCwgMHg1NzJlZmYwMCwgMHg1NzM3OWYwMCwgMHg1NzQwM2YwMCwgMHg1NzQ4ZGYwMCwgMHg1NzUxN2YwMCwgMHg1NzVhMWYwMCwgMHg1NzYyYmYwMCwgMHg1NzZiNWYwMCwgMHg1NzczZmYwMCwKKyAgICAweDU3N2M5ZjAwLCAweDU3ODUzZjAwLCAweDU3OGRkZjAwLCAweDU3OTY3ZjAwLCAweDU3OWYxZjAwLCAweDU3YTdiZjAwLCAweDU3YjA1ZjAwLCAweDU3YjhmZjAwLCAweDU3YzE5ZjAwLCAweDU3Y2EzZjAwLCAweDU3ZDJkZjAwLCAweDU3ZGI3ZjAwLCAweDU3ZTQxZjAwLCAweDU3ZWNiZjAwLCAweDU3ZjU1ZjAwLCAweDU3ZmRmZjAwLAorICAgIDB4NTgwODdmMDAsIDB4NTgxMmZmMDAsIDB4NTgxZDdmMDAsIDB4NTgyN2ZmMDAsIDB4NTgzMjdmMDAsIDB4NTgzY2ZmMDAsIDB4NTg0NzdmMDAsIDB4NTg1MWZmMDAsIDB4NTg1YzdmMDAsIDB4NTg2NmZmMDAsIDB4NTg3MTdmMDAsIDB4NTg3YmZmMDAsIDB4NTg4NjdmMDAsIDB4NTg5MGZmMDAsIDB4NTg5YjdmMDAsIDB4NThhNWZmMDAsCisgICAgMHg1OGIwN2YwMCwgMHg1OGJhZmYwMCwgMHg1OGM1N2YwMCwgMHg1OGNmZmYwMCwgMHg1OGRhN2YwMCwgMHg1OGU0ZmYwMCwgMHg1OGVmN2YwMCwgMHg1OGY5ZmYwMCwgMHg1OTA0N2YwMCwgMHg1OTBlZmYwMCwgMHg1OTE5N2YwMCwgMHg1OTIzZmYwMCwgMHg1OTJlN2YwMCwgMHg1OTM4ZmYwMCwgMHg1OTQzN2YwMCwgMHg1OTRkZmYwMCwKKyAgICAweDU5NTg3ZjAwLCAweDU5NjJmZjAwLCAweDU5NmQ3ZjAwLCAweDU5NzdmZjAwLCAweDU5ODI3ZjAwLCAweDU5OGNmZjAwLCAweDU5OTc3ZjAwLCAweDU5YTFmZjAwLCAweDU5YWM3ZjAwLCAweDU5YjZmZjAwLCAweDU5YzE3ZjAwLCAweDU5Y2JmZjAwLCAweDU5ZDY3ZjAwLCAweDU5ZTBmZjAwLCAweDU5ZWI3ZjAwLCAweDU5ZjVmZjAwLAorICAgIDB4NWEwMDdmMDAsIDB4NWEwYWZmMDAsIDB4NWExNTdmMDAsIDB4NWExZmZmMDAsIDB4NWEyYTdmMDAsIDB4NWEzNGZmMDAsIDB4NWEzZjdmMDAsIDB4NWE0OWZmMDAsIDB4NWE1NDdmMDAsIDB4NWE1ZWZmMDAsIDB4NWE2OTdmMDAsIDB4NWE3M2ZmMDAsIDB4NWE3ZTdmMDAsIDB4NWE4OGZmMDAsIDB4NWE5MzdmMDAsIDB4NWE5ZGZmMDAsCisgICAgMHg1YWFhMDcwMCwgMHg1YWI2MGYwMCwgMHg1YWMyMTcwMCwgMHg1YWNlMWYwMCwgMHg1YWRhMjcwMCwgMHg1YWU2MmYwMCwgMHg1YWYyMzcwMCwgMHg1YWZlM2YwMCwgMHg1YjBhNDcwMCwgMHg1YjE2NGYwMCwgMHg1YjIyNTcwMCwgMHg1YjJlNWYwMCwgMHg1YjNhNjcwMCwgMHg1YjQ2NmYwMCwgMHg1YjUyNzcwMCwgMHg1YjVlN2YwMCwKKyAgICAweDViNmE4NzAwLCAweDViNzY4ZjAwLCAweDViODI5NzAwLCAweDViOGU5ZjAwLCAweDViOWFhNzAwLCAweDViYTZhZjAwLCAweDViYjJiNzAwLCAweDViYmViZjAwLCAweDViY2FjNzAwLCAweDViZDZjZjAwLCAweDViZTJkNzAwLCAweDViZWVkZjAwLCAweDViZmFlNzAwLCAweDVjMDZlZjAwLCAweDVjMTJmNzAwLCAweDVjMWVmZjAwLAorICAgIDB4NWMyYjA3MDAsIDB4NWMzNzBmMDAsIDB4NWM0MzE3MDAsIDB4NWM0ZjFmMDAsIDB4NWM1YjI3MDAsIDB4NWM2NzJmMDAsIDB4NWM3MzM3MDAsIDB4NWM3ZjNmMDAsIDB4NWM4YjQ3MDAsIDB4NWM5NzRmMDAsIDB4NWNhMzU3MDAsIDB4NWNhZjVmMDAsIDB4NWNiYjY3MDAsIDB4NWNjNzZmMDAsIDB4NWNkMzc3MDAsIDB4NWNkZjdmMDAsCisgICAgMHg1Y2ViODcwMCwgMHg1Y2Y3OGYwMCwgMHg1ZDAzOTcwMCwgMHg1ZDBmOWYwMCwgMHg1ZDFiYTcwMCwgMHg1ZDI3YWYwMCwgMHg1ZDMzYjcwMCwgMHg1ZDNmYmYwMCwgMHg1ZDRiYzcwMCwgMHg1ZDU3Y2YwMCwgMHg1ZDYzZDcwMCwgMHg1ZDZmZGYwMCwgMHg1ZDdiZTcwMCwgMHg1ZDg3ZWYwMCwgMHg1ZDkzZjcwMCwgMHg1ZGEwMDAwMCwKKyAgICAweDVkYWM4MDAwLCAweDVkYjkwMDAwLCAweDVkYzU4MDAwLCAweDVkZDIwMDAwLCAweDVkZGU4MDAwLCAweDVkZWIwMDAwLCAweDVkZjc4MDAwLCAweDVlMDQwMDAwLCAweDVlMTA4MDAwLCAweDVlMWQwMDAwLCAweDVlMjk4MDAwLCAweDVlMzYwMDAwLCAweDVlNDI4MDAwLCAweDVlNGYwMDAwLCAweDVlNWI4MDAwLCAweDVlNjgwMDAwLAorICAgIDB4NWU3NDgwMDAsIDB4NWU4MTAwMDAsIDB4NWU4ZDgwMDAsIDB4NWU5YTAwMDAsIDB4NWVhNjgwMDAsIDB4NWViMzAwMDAsIDB4NWViZjgwMDAsIDB4NWVjYzAwMDAsIDB4NWVkODgwMDAsIDB4NWVlNTAwMDAsIDB4NWVmMTgwMDAsIDB4NWVmZTAwMDAsIDB4NWYwYTgwMDAsIDB4NWYxNzAwMDAsIDB4NWYyMzgwMDAsIDB4NWYzMDAwMDAsCisgICAgMHg1ZjNjODAwMCwgMHg1ZjQ5MDAwMCwgMHg1ZjU1ODAwMCwgMHg1ZjYyMDAwMCwgMHg1ZjZlODAwMCwgMHg1ZjdiMDAwMCwgMHg1Zjg3ODAwMCwgMHg1Zjk0MDAwMCwgMHg1ZmEwODAwMCwgMHg1ZmFkMDAwMCwgMHg1ZmI5ODAwMCwgMHg1ZmM2MDAwMCwgMHg1ZmQyODAwMCwgMHg1ZmRmMDAwMCwgMHg1ZmViODAwMCwgMHg1ZmY4MDAwMCwKKyAgICAweDYwMDQ4MDAwLCAweDYwMTEwMDAwLCAweDYwMWQ4MDAwLCAweDYwMmEwMDAwLCAweDYwMzY4MDAwLCAweDYwNDMwMDAwLCAweDYwNGY4MDAwLCAweDYwNWMwMDAwLCAweDYwNjg4MDAwLCAweDYwNzUwMDAwLCAweDYwODE4MDAwLCAweDYwOGUwMDAwLCAweDYwOWE4MDAwLCAweDYwYTcwMDAwLCAweDYwYjM4MDAwLCAweDYwYzAwMDAwLAorICAgIDB4NjBjYzgwMDAsIDB4NjBkOTAwMDAsIDB4NjBlNTgwMDAsIDB4NjBmMjAwMDAsIDB4NjBmZTgwMDAsIDB4NjEwYjAwMDAsIDB4NjExNzgwMDAsIDB4NjEyNDAwMDAsIDB4NjEzMDgwMDAsIDB4NjEzZDAwMDAsIDB4NjE0OTgwMDAsIDB4NjE1NjAwMDAsIDB4NjE2MjgwMDAsIDB4NjE2ZjAwMDAsIDB4NjE3YjgwMDAsIDB4NjE4ODAwMDAsCisgICAgMHg2MTk0ODAwMCwgMHg2MWExMDAwMCwgMHg2MWFkODAwMCwgMHg2MWJhMDAwMCwgMHg2MWM2ODAwMCwgMHg2MWQzMDAwMCwgMHg2MWRmODAwMCwgMHg2MWVjMDAwMCwgMHg2MWY4ODAwMCwgMHg2MjA1MDAwMCwgMHg2MjExODAwMCwgMHg2MjFlMDAwMCwgMHg2MjJhODAwMCwgMHg2MjM3MDAwMCwgMHg2MjQzODAwMCwgMHg2MjUwMDAwMCwKKyAgICAweDYyNWM4MDAwLCAweDYyNjkwMDAwLCAweDYyNzU4MDAwLCAweDYyODIwMDAwLCAweDYyOGU4MDAwLCAweDYyOWIwMDAwLCAweDYyYTc4MDAwLCAweDYyYjQwMDAwLCAweDYyYzA4MDAwLCAweDYyY2QwMDAwLCAweDYyZDk4MDAwLCAweDYyZTYwMDAwLCAweDYyZjI4MDAwLCAweDYyZmYwMDAwLCAweDYzMGI4MDAwLCAweDYzMTgwMDAwLAorICAgIDB4NjMyNDgwMDAsIDB4NjMzMTAwMDAsIDB4NjMzZDgwMDAsIDB4NjM0YTAwMDAsIDB4NjM1NjgwMDAsIDB4NjM2MzAwMDAsIDB4NjM2ZjgwMDAsIDB4NjM3YzAwMDAsIDB4NjM4ODgwMDAsIDB4NjM5NTAwMDAsIDB4NjNhMTgwMDAsIDB4NjNhZTAwMDAsIDB4NjNiYTgwMDAsIDB4NjNjNzAwMDAsIDB4NjNkMzgwMDAsIDB4NjNlMDAwMDAsCisgICAgMHg2M2VjODAwMCwgMHg2M2Y5MDAwMCwgMHg2NDA1ODAwMCwgMHg2NDEyMDAwMCwgMHg2NDFlODAwMCwgMHg2NDJiMDAwMCwgMHg2NDM3ODAwMCwgMHg2NDQ0MDAwMCwgMHg2NDUwODAwMCwgMHg2NDVkMDAwMCwgMHg2NDY5ODAwMCwgMHg2NDc2MDAwMCwgMHg2NDgyODAwMCwgMHg2NDhmMDAwMCwgMHg2NDliODAwMCwgMHg2NGE4MDAwMCwKKyAgICAweDY0YjQ4MDAwLCAweDY0YzEwMDAwLCAweDY0Y2Q4MDAwLCAweDY0ZGEwMDAwLCAweDY0ZTY4MDAwLCAweDY0ZjMwMDAwLCAweDY0ZmY4MDAwLCAweDY1MGMwMDAwLCAweDY1MTg4MDAwLCAweDY1MjUwMDAwLCAweDY1MzE4MDAwLCAweDY1M2UwMDAwLCAweDY1NGE4MDAwLCAweDY1NTcwMDAwLCAweDY1NjM4MDAwLCAweDY1NzAwMDAwLAorICAgIDB4NjU3YzgwMDAsIDB4NjU4OTAwMDAsIDB4NjU5NTgwMDAsIDB4NjVhMjAwMDAsIDB4NjVhZTgwMDAsIDB4NjViYjAwMDAsIDB4NjVjNzgwMDAsIDB4NjVkNDAwMDAsIDB4NjVlMDgwMDAsIDB4NjVlZDAwMDAsIDB4NjVmOTgwMDAsIDB4NjYwNjAwMDAsIDB4NjYxMjgwMDAsIDB4NjYxZjAwMDAsIDB4NjYyYjgwMDAsIDB4NjYzODAwMDAsCisgICAgMHg2NjQ0ODAwMCwgMHg2NjUxMDAwMCwgMHg2NjVkODAwMCwgMHg2NjZhMDAwMCwgMHg2Njc2ODAwMCwgMHg2NjgzMDAwMCwgMHg2NjhmODAwMCwgMHg2NjljMDAwMCwgMHg2NmE4ODAwMCwgMHg2NmI1MDAwMCwgMHg2NmMxODAwMCwgMHg2NmNlMDAwMCwgMHg2NmRhODAwMCwgMHg2NmU3MDAwMCwgMHg2NmYzODAwMCwgMHg2NzAwMDAwMCwKKyAgICAweDY3MGM4MDAwLCAweDY3MTkwMDAwLCAweDY3MjU4MDAwLCAweDY3MzIwMDAwLCAweDY3M2U4MDAwLCAweDY3NGIwMDAwLCAweDY3NTc4MDAwLCAweDY3NjQwMDAwLCAweDY3NzA4MDAwLCAweDY3N2QwMDAwLCAweDY3ODk4MDAwLCAweDY3OTYwMDAwLCAweDY3YTI4MDAwLCAweDY3YWYwMDAwLCAweDY3YmI4MDAwLCAweDY3YzgwMDAwLAorICAgIDB4NjdkNDgwMDAsIDB4NjdlMTAwMDAsIDB4NjdlZDgwMDAsIDB4NjdmYTAwMDAsIDB4NjgwNjgwMDAsIDB4NjgxMzAwMDAsIDB4NjgxZjgwMDAsIDB4NjgyYzAwMDAsIDB4NjgzODgwMDAsIDB4Njg0NTAwMDAsIDB4Njg1MTgwMDAsIDB4Njg1ZTAwMDAsIDB4Njg2YTgwMDAsIDB4Njg3NzAwMDAsIDB4Njg4MzgwMDAsIDB4Njg5MDAwMDAsCisgICAgMHg2ODljODAwMCwgMHg2OGE5MDAwMCwgMHg2OGI1ODAwMCwgMHg2OGMyMDAwMCwgMHg2OGNlODAwMCwgMHg2OGRiMDAwMCwgMHg2OGU3ODAwMCwgMHg2OGY0MDAwMCwgMHg2OTAwODAwMCwgMHg2OTBkMDAwMCwgMHg2OTE5ODAwMCwgMHg2OTI2MDAwMCwgMHg2OTMyODAwMCwgMHg2OTNmMDAwMCwgMHg2OTRiODAwMCwgMHg2OTU4MDAwMCwKKyAgICAweDY5NjQ4MDAwLCAweDY5NzEwMDAwLCAweDY5N2Q4MDAwLCAweDY5OGEwMDAwLCAweDY5OTY4MDAwLCAweDY5YTMwMDAwLCAweDY5YWY4MDAwLCAweDY5YmMwMDAwLCAweDY5Yzg4MDAwLCAweDY5ZDUwMDAwLCAweDY5ZTE4MDAwLCAweDY5ZWUwMDAwLCAweDY5ZmE4MDAwLCAweDZhMDcwMDAwLCAweDZhMTM4MDAwLCAweDZhMjAwMDAwLAorICAgIDB4NmEyYzgwMDAsIDB4NmEzOTAwMDAsIDB4NmE0NTgwMDAsIDB4NmE1MjAwMDAsIDB4NmE1ZTgwMDAsIDB4NmE2YjAwMDAsIDB4NmE3NzgwMDAsIDB4NmE4NDAwMDAsIDB4NmE5MDgwMDAsIDB4NmE5ZDAwMDAsIDB4NmFhOTgwMDAsIDB4NmFiNjAwMDAsIDB4NmFjMjgwMDAsIDB4NmFjZjAwMDAsIDB4NmFkYjgwMDAsIDB4NmFlODAwMDAsCisgICAgMHg2YWY0ODAwMCwgMHg2YjAxMDAwMCwgMHg2YjBkODAwMCwgMHg2YjFhMDAwMCwgMHg2YjI2ODAwMCwgMHg2YjMzMDAwMCwgMHg2YjNmODAwMCwgMHg2YjRjMDAwMCwgMHg2YjU4ODAwMCwgMHg2YjY1MDAwMCwgMHg2YjcxODAwMCwgMHg2YjdlMDAwMCwgMHg2YjhhODAwMCwgMHg2Yjk3MDAwMCwgMHg2YmEzODAwMCwgMHg2YmIwMDAwMCwKKyAgICAweDZiYmM4MDAwLCAweDZiYzkwMDAwLCAweDZiZDU4MDAwLCAweDZiZTIwMDAwLCAweDZiZWU4MDAwLCAweDZiZmIwMDAwLCAweDZjMDc4MDAwLCAweDZjMTQwMDAwLCAweDZjMjA4MDAwLCAweDZjMmQwMDAwLCAweDZjMzk4MDAwLCAweDZjNDYwMDAwLCAweDZjNTI4MDAwLCAweDZjNWYwMDAwLCAweDZjNmI4MDAwLCAweDZjNzgwMDAwLAorICAgIDB4NmM4NDgwMDAsIDB4NmM5MTAwMDAsIDB4NmM5ZDgwMDAsIDB4NmNhYTAwMDAsIDB4NmNiNjgwMDAsIDB4NmNjMzAwMDAsIDB4NmNjZjgwMDAsIDB4NmNkYzAwMDAsIDB4NmNlODgwMDAsIDB4NmNmNTAwMDAsIDB4NmQwMTgwMDAsIDB4NmQwZTAwMDAsIDB4NmQxYTgwMDAsIDB4NmQyNzAwMDAsIDB4NmQzMzgwMDAsIDB4NmQ0MDAwMDAsCisgICAgMHg2ZDRjODAwMCwgMHg2ZDU5MDAwMCwgMHg2ZDY1ODAwMCwgMHg2ZDcyMDAwMCwgMHg2ZDdlODAwMCwgMHg2ZDhiMDAwMCwgMHg2ZDk3ODAwMCwgMHg2ZGE0MDAwMCwgMHg2ZGIwODAwMCwgMHg2ZGJkMDAwMCwgMHg2ZGM5ODAwMCwgMHg2ZGQ2MDAwMCwgMHg2ZGUyODAwMCwgMHg2ZGVmMDAwMCwgMHg2ZGZiODAwMCwgMHg2ZTA4MDAwMCwKKyAgICAweDZlMTQ4MDAwLCAweDZlMjEwMDAwLCAweDZlMmQ4MDAwLCAweDZlM2EwMDAwLCAweDZlNDY4MDAwLCAweDZlNTMwMDAwLCAweDZlNWY4MDAwLCAweDZlNmMwMDAwLCAweDZlNzg4MDAwLCAweDZlODUwMDAwLCAweDZlOTE4MDAwLCAweDZlOWUwMDAwLCAweDZlYWE4MDAwLCAweDZlYjcwMDAwLCAweDZlYzM4MDAwLCAweDZlZDAwMDAwLAorICAgIDB4NmVkYzgwMDAsIDB4NmVlOTAwMDAsIDB4NmVmNTgwMDAsIDB4NmYwMjAwMDAsIDB4NmYwZTgwMDAsIDB4NmYxYjAwMDAsIDB4NmYyNzgwMDAsIDB4NmYzNDAwMDAsIDB4NmY0MDgwMDAsIDB4NmY0ZDAwMDAsIDB4NmY1OTgwMDAsIDB4NmY2NjAwMDAsIDB4NmY3MjgwMDAsIDB4NmY3ZjAwMDAsIDB4NmY4YjgwMDAsIDB4NmY5ODAwMDAsCisgICAgMHg2ZmE0ODAwMCwgMHg2ZmIxMDAwMCwgMHg2ZmJkODAwMCwgMHg2ZmNhMDAwMCwgMHg2ZmQ2ODAwMCwgMHg2ZmUzMDAwMCwgMHg2ZmVmODAwMCwgMHg2ZmZjMDAwMCwgMHg3MDA4ODAwMCwgMHg3MDE1MDAwMCwgMHg3MDIxODAwMCwgMHg3MDJlMDAwMCwgMHg3MDNhODAwMCwgMHg3MDQ3MDAwMCwgMHg3MDUzODAwMCwgMHg3MDYwMDAwMCwKKyAgICAweDcwNmM4MDAwLCAweDcwNzkwMDAwLCAweDcwODU4MDAwLCAweDcwOTIwMDAwLCAweDcwOWU4MDAwLCAweDcwYWIwMDAwLCAweDcwYjc4MDAwLCAweDcwYzQwMDAwLCAweDcwZDA4MDAwLCAweDcwZGQwMDAwLCAweDcwZTk4MDAwLCAweDcwZjYwMDAwLCAweDcxMDI4MDAwLCAweDcxMGYwMDAwLCAweDcxMWI4MDAwLCAweDcxMjgwMDAwLAorICAgIDB4NzEzNDgwMDAsIDB4NzE0MTAwMDAsIDB4NzE0ZDgwMDAsIDB4NzE1YTAwMDAsIDB4NzE2NjgwMDAsIDB4NzE3MzAwMDAsIDB4NzE3ZjgwMDAsIDB4NzE4YzAwMDAsIDB4NzE5ODgwMDAsIDB4NzFhNTAwMDAsIDB4NzFiMTgwMDAsIDB4NzFiZTAwMDAsIDB4NzFjYTgwMDAsIDB4NzFkNzAwMDAsIDB4NzFlMzgwMDAsIDB4NzFmMDAwMDAsCisgICAgMHg3MWZjODAwMCwgMHg3MjA5MDAwMCwgMHg3MjE1ODAwMCwgMHg3MjIyMDAwMCwgMHg3MjJlODAwMCwgMHg3MjNiMDAwMCwgMHg3MjQ3ODAwMCwgMHg3MjU0MDAwMCwgMHg3MjYwODAwMCwgMHg3MjZkMDAwMCwgMHg3Mjc5ODAwMCwgMHg3Mjg2MDAwMCwgMHg3MjkyODAwMCwgMHg3MjlmMDAwMCwgMHg3MmFiODAwMCwgMHg3MmI4MDAwMCwKKyAgICAweDcyYzQ4MDAwLCAweDcyZDEwMDAwLCAweDcyZGQ4MDAwLCAweDcyZWEwMDAwLCAweDcyZjY4MDAwLCAweDczMDMwMDAwLCAweDczMGY4MDAwLCAweDczMWMwMDAwLCAweDczMjg4MDAwLCAweDczMzUwMDAwLCAweDczNDE4MDAwLCAweDczNGUwMDAwLCAweDczNWE4MDAwLCAweDczNjcwMDAwLCAweDczNzM4MDAwLCAweDczODAwMDAwLAorICAgIDB4NzM4YzgwMDAsIDB4NzM5OTAwMDAsIDB4NzNhNTgwMDAsIDB4NzNiMjAwMDAsIDB4NzNiZTgwMDAsIDB4NzNjYjAwMDAsIDB4NzNkNzgwMDAsIDB4NzNlNDAwMDAsIDB4NzNmMDgwMDAsIDB4NzNmZDAwMDAsIDB4NzQwOTgwMDAsIDB4NzQxNjAwMDAsIDB4NzQyMjgwMDAsIDB4NzQyZjAwMDAsIDB4NzQzYjgwMDAsIDB4NzQ0ODAwMDAsCisgICAgMHg3NDU0ODAwMCwgMHg3NDYxMDAwMCwgMHg3NDZkODAwMCwgMHg3NDdhMDAwMCwgMHg3NDg2ODAwMCwgMHg3NDkzMDAwMCwgMHg3NDlmODAwMCwgMHg3NGFjMDAwMCwgMHg3NGI4ODAwMCwgMHg3NGM1MDAwMCwgMHg3NGQxODAwMCwgMHg3NGRlMDAwMCwgMHg3NGVhODAwMCwgMHg3NGY3MDAwMCwgMHg3NTAzODAwMCwgMHg3NTEwMDAwMCwKKyAgICAweDc1MWM4MDAwLCAweDc1MjkwMDAwLCAweDc1MzU4MDAwLCAweDc1NDIwMDAwLCAweDc1NGU4MDAwLCAweDc1NWIwMDAwLCAweDc1Njc4MDAwLCAweDc1NzQwMDAwLCAweDc1ODA4MDAwLCAweDc1OGQwMDAwLCAweDc1OTk4MDAwLCAweDc1YTYwMDAwLCAweDc1YjI4MDAwLCAweDc1YmYwMDAwLCAweDc1Y2I4MDAwLCAweDc1ZDgwMDAwLAorICAgIDB4NzVlNDgwMDAsIDB4NzVmMTAwMDAsIDB4NzVmZDgwMDAsIDB4NzYwYTAwMDAsIDB4NzYxNjgwMDAsIDB4NzYyMzAwMDAsIDB4NzYyZjgwMDAsIDB4NzYzYzAwMDAsIDB4NzY0ODgwMDAsIDB4NzY1NTAwMDAsIDB4NzY2MTgwMDAsIDB4NzY2ZTAwMDAsIDB4NzY3YTgwMDAsIDB4NzY4NzAwMDAsIDB4NzY5MzgwMDAsIDB4NzZhMDAwMDAsCisgICAgMHg3NmFjODAwMCwgMHg3NmI5MDAwMCwgMHg3NmM1ODAwMCwgMHg3NmQyMDAwMCwgMHg3NmRlODAwMCwgMHg3NmViMDAwMCwgMHg3NmY3ODAwMCwgMHg3NzA0MDAwMCwgMHg3NzEwODAwMCwgMHg3NzFkMDAwMCwgMHg3NzI5ODAwMCwgMHg3NzM2MDAwMCwgMHg3NzQyODAwMCwgMHg3NzRmMDAwMCwgMHg3NzViODAwMCwgMHg3NzY4MDAwMCwKKyAgICAweDc3NzQ4MDAwLCAweDc3ODEwMDAwLCAweDc3OGQ4MDAwLCAweDc3OWEwMDAwLCAweDc3YTY4MDAwLCAweDc3YjMwMDAwLCAweDc3YmY4MDAwLCAweDc3Y2MwMDAwLCAweDc3ZDg4MDAwLCAweDc3ZTUwMDAwLCAweDc3ZjE4MDAwLCAweDc3ZmUwMDAwLCAweDc4MGE4MDAwLCAweDc4MTcwMDAwLCAweDc4MjM4MDAwLCAweDc4MzAwMDAwLAorICAgIDB4NzgzYzgwMDAsIDB4Nzg0OTAwMDAsIDB4Nzg1NTgwMDAsIDB4Nzg2MjAwMDAsIDB4Nzg2ZTgwMDAsIDB4Nzg3YjAwMDAsIDB4Nzg4NzgwMDAsIDB4Nzg5NDAwMDAsIDB4NzhhMDgwMDAsIDB4NzhhZDAwMDAsIDB4NzhiOTgwMDAsIDB4NzhjNjAwMDAsIDB4NzhkMjgwMDAsIDB4NzhkZjAwMDAsIDB4NzhlYjgwMDAsIDB4NzhmODAwMDAsCisgICAgMHg3OTA0ODAwMCwgMHg3OTExMDAwMCwgMHg3OTFkODAwMCwgMHg3OTJhMDAwMCwgMHg3OTM2ODAwMCwgMHg3OTQzMDAwMCwgMHg3OTRmODAwMCwgMHg3OTVjMDAwMCwgMHg3OTY4ODAwMCwgMHg3OTc1MDAwMCwgMHg3OTgxODAwMCwgMHg3OThlMDAwMCwgMHg3OTlhODAwMCwgMHg3OWE3MDAwMCwgMHg3OWIzODAwMCwgMHg3OWMwMDAwMCwKKyAgICAweDc5Y2M4MDAwLCAweDc5ZDkwMDAwLCAweDc5ZTU4MDAwLCAweDc5ZjIwMDAwLCAweDc5ZmU4MDAwLCAweDdhMGIwMDAwLCAweDdhMTc4MDAwLCAweDdhMjQwMDAwLCAweDdhMzA4MDAwLCAweDdhM2QwMDAwLCAweDdhNDk4MDAwLCAweDdhNTYwMDAwLCAweDdhNjI4MDAwLCAweDdhNmYwMDAwLCAweDdhN2I4MDAwLCAweDdhODgwMDAwLAorICAgIDB4N2E5NDgwMDAsIDB4N2FhMTAwMDAsIDB4N2FhZDgwMDAsIDB4N2FiYTAwMDAsIDB4N2FjNjgwMDAsIDB4N2FkMzAwMDAsIDB4N2FkZjgwMDAsIDB4N2FlYzAwMDAsIDB4N2FmODgwMDAsIDB4N2IwNTAwMDAsIDB4N2IxMTgwMDAsIDB4N2IxZTAwMDAsIDB4N2IyYTgwMDAsIDB4N2IzNzAwMDAsIDB4N2I0MzgwMDAsIDB4N2I1MDAwMDAsCisgICAgMHg3YjVjODAwMCwgMHg3YjY5MDAwMCwgMHg3Yjc1ODAwMCwgMHg3YjgyMDAwMCwgMHg3YjhlODAwMCwgMHg3YjliMDAwMCwgMHg3YmE3ODAwMCwgMHg3YmI0MDAwMCwgMHg3YmMwODAwMCwgMHg3YmNkMDAwMCwgMHg3YmQ5ODAwMCwgMHg3YmU2MDAwMCwgMHg3YmYyODAwMCwgMHg3YmZmMDAwMCwgMHg3YzBiODAwMCwgMHg3YzE4MDAwMCwKKyAgICAweDdjMjQ4MDAwLCAweDdjMzEwMDAwLCAweDdjM2Q4MDAwLCAweDdjNGEwMDAwLCAweDdjNTY4MDAwLCAweDdjNjMwMDAwLCAweDdjNmY4MDAwLCAweDdjN2MwMDAwLCAweDdjODg4MDAwLCAweDdjOTUwMDAwLCAweDdjYTE4MDAwLCAweDdjYWUwMDAwLCAweDdjYmE4MDAwLCAweDdjYzcwMDAwLCAweDdjZDM4MDAwLCAweDdjZTAwMDAwLAorICAgIDB4N2NlYzgwMDAsIDB4N2NmOTAwMDAsIDB4N2QwNTgwMDAsIDB4N2QxMjAwMDAsIDB4N2QxZTgwMDAsIDB4N2QyYjAwMDAsIDB4N2QzNzgwMDAsIDB4N2Q0NDAwMDAsIDB4N2Q1MDgwMDAsIDB4N2Q1ZDAwMDAsIDB4N2Q2OTgwMDAsIDB4N2Q3NjAwMDAsIDB4N2Q4MjgwMDAsIDB4N2Q4ZjAwMDAsIDB4N2Q5YjgwMDAsIDB4N2RhODAwMDAsCisgICAgMHg3ZGI0ODAwMCwgMHg3ZGMxMDAwMCwgMHg3ZGNkODAwMCwgMHg3ZGRhMDAwMCwgMHg3ZGU2ODAwMCwgMHg3ZGYzMDAwMCwgMHg3ZGZmODAwMCwgMHg3ZTBjMDAwMCwgMHg3ZTE4ODAwMCwgMHg3ZTI1MDAwMCwgMHg3ZTMxODAwMCwgMHg3ZTNlMDAwMCwgMHg3ZTRhODAwMCwgMHg3ZTU3MDAwMCwgMHg3ZTYzODAwMCwgMHg3ZTcwMDAwMCwKKyAgICAweDdlN2M4MDAwLCAweDdlODkwMDAwLCAweDdlOTU4MDAwLCAweDdlYTIwMDAwLCAweDdlYWU4MDAwLCAweDdlYmIwMDAwLCAweDdlYzc4MDAwLCAweDdlZDQwMDAwLCAweDdlZTA4MDAwLCAweDdlZWQwMDAwLCAweDdlZjk4MDAwLCAweDdmMDYwMDAwLCAweDdmMTI4MDAwLCAweDdmMWYwMDAwLCAweDdmMmI4MDAwLCAweDdmMzgwMDAwLAorICAgIDB4N2Y0NDgwMDAsIDB4N2Y1MTAwMDAsIDB4N2Y1ZDgwMDAsIDB4N2Y2YTAwMDAsIDB4N2Y3NjgwMDAsIDB4N2Y4MzAwMDAsIDB4N2Y4ZjgwMDAsIDB4N2Y5YzAwMDAsIDB4N2ZhODgwMDAsIDB4N2ZiNTAwMDAsIDB4N2ZjMTgwMDAsIDB4N2ZjZTAwMDAsIDB4N2ZkYTgwMDAsIDB4N2ZlNzAwMDAsIDB4N2ZmMzgwMDAsIDB4ODAwMDAwMDAKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJlYWRhaGVhZHRhYltdID0geworICAgIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MTEsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsIDB4MWYsCisgICAgMHgxMCwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxZCwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxYywgMHgxZiwgMHgxZSwgMHgxZiwgMHgxZCwgMHgxZiwgMHgxZSwKKyAgICAweDFmLCAweDBmLCAweDFmLCAweDFlLCAweDFmLCAweDFkLCAweDFmLCAweDFlLCAweDFmLCAweDFjLCAweDFmLCAweDFlLCAweDFmLCAweDFkLCAweDFmLAorICAgIDB4MWUsIDB4MWYsIDB4MWIsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWMsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWQsCisgICAgMHgxZiwgMHgxZSwgMHgwZSwgMHgxOSwgMHgwNywgMHgxZSwgMHgxZiwgMHgxZCwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxYywgMHgxZiwgMHgxZSwgMHgxZiwKKyAgICAweDFkLCAweDFmLCAweDFlLCAweDFmLCAweDFiLCAweDFmLCAweDFlLCAweDFmLCAweDFkLCAweDFmLCAweDFlLCAweDFmLCAweDFjLCAweDFmLCAweDFlLAorICAgIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWEsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWMsIDB4MWYsCisgICAgMHgxZSwgMHgxZiwgMHgxZCwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxYiwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxZCwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxYywKKyAgICAweDFmLCAweDFlLCAweDFmLCAweDFkLCAweDFmLCAweDBkLCAweDE4LCAweDIwLCAweDA2LCAweDFlLCAweDFmLCAweDEyLCAweDFmLCAweDFlLCAweDFmLAorICAgIDB4MWMsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWIsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsCisgICAgMHgxZiwgMHgxYywgMHgxZiwgMHgxZSwgMHgxZiwgMHgxZCwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxYSwgMHgwOCwgMHgxZSwgMHgxZiwgMHgxZCwgMHgxZiwKKyAgICAweDFlLCAweDFmLCAweDFjLCAweDFmLCAweDFlLCAweDFmLCAweDFkLCAweDFmLCAweDFlLCAweDFmLCAweDFiLCAweDFmLCAweDFlLCAweDFmLCAweDFkLAorICAgIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWMsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MTksIDB4MWYsIDB4MTMsIDB4MWYsCisgICAgMHgxZCwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxYywgMHgxZiwgMHgxZSwgMHgxZiwgMHgxZCwgMHgxZiwgMHgxZSwgMHgxZiwgMHgxYiwgMHgwOSwgMHgxZSwKKyAgICAweDFmLCAweDFkLCAweDFmLCAweDFlLCAweDFmLCAweDFjLCAweDFmLCAweDFlLCAweDFmLCAweDFkLCAweDFmLCAweDFlLCAweDFmLCAweDFhLCAweDE0LAorICAgIDB4MWUsIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWMsIDB4MGEsIDB4MWUsIDB4MWYsIDB4MWQsIDB4MWYsIDB4MWUsIDB4MWYsIDB4MWIsCisgICAgMHgxNSwgMHgxZSwgMHgxZiwgMHgxZCwgMHgwYiwgMHgxZSwgMHgxZiwgMHgxYywgMHgxNiwgMHgxZSwgMHgwYywgMHgxZCwgMHgxNywgMHgxZSwgMHgxZiwKKyAgICAweDIwCit9OworCisvL3ZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEgbXVsdGlwbGllZCBieSAyXjIzIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCitzdGF0aWMgY29uc3QgaW50MzJfdCBnYWludGFiW10gPSB7CisgICAgMHg4MDAwMDAsIDB4N2ZmMTQ0LCAweDdmZTI4YSwgMHg3ZmQzZDIsIDB4N2ZjNTFiLCAweDdmYjY2NiwgMHg3ZmE3YjMsIDB4N2Y5OTAxLCAweDdmOGE1MiwgMHg3ZjdiYTMsIDB4N2Y2Y2Y3LCAweDdmNWU0YywgMHg3ZjRmYTMsIDB4N2Y0MGZjLCAweDdmMzI1NiwKKyAgICAweDdmMjNiMiwgMHg3ZjE1MTAsIDB4N2YwNjZmLCAweDdlZjdkMCwgMHg3ZWU5MzMsIDB4N2VkYTk3LCAweDdlY2JmZCwgMHg3ZWJkNjUsIDB4N2VhZWNlLCAweDdlYTAzOSwgMHg3ZTkxYTYsIDB4N2U4MzE1LCAweDdlNzQ4NSwgMHg3ZTY1ZjYsIDB4N2U1NzZhLAorICAgIDB4N2U0OGRmLCAweDdlM2E1NiwgMHg3ZTJiY2UsIDB4N2UxZDQ5LCAweDdlMGVjNSwgMHg3ZTAwNDIsIDB4N2RmMWMxLCAweDdkZTM0MiwgMHg3ZGQ0YzUsIDB4N2RjNjQ5LCAweDdkYjdjZiwgMHg3ZGE5NTYsIDB4N2Q5YWRmLCAweDdkOGM2YSwgMHg3ZDdkZjcsCisgICAgMHg3ZDZmODUsIDB4N2Q2MTE1LCAweDdkNTJhNiwgMHg3ZDQ0M2EsIDB4N2QzNWNlLCAweDdkMjc2NSwgMHg3ZDE4ZmQsIDB4N2QwYTk3LCAweDdjZmMzMiwgMHg3Y2VkZDAsIDB4N2NkZjZlLCAweDdjZDEwZiwgMHg3Y2MyYjEsIDB4N2NiNDU1LCAweDdjYTVmYSwKKyAgICAweDdjOTdhMSwgMHg3Yzg5NGEsIDB4N2M3YWY0LCAweDdjNmNhMCwgMHg3YzVlNGUsIDB4N2M0ZmZkLCAweDdjNDFhZSwgMHg3YzMzNjEsIDB4N2MyNTE1LCAweDdjMTZjYiwgMHg3YzA4ODIsIDB4N2JmYTNiLCAweDdiZWJmNiwgMHg3YmRkYjMsIDB4N2JjZjcxLAorICAgIDB4N2JjMTMxLCAweDdiYjJmMiwgMHg3YmE0YjUsIDB4N2I5NjdhLCAweDdiODg0MCwgMHg3YjdhMDgsIDB4N2I2YmQyLCAweDdiNWQ5ZCwgMHg3YjRmNmEsIDB4N2I0MTM4LCAweDdiMzMwOCwgMHg3YjI0ZGEsIDB4N2IxNmFkLCAweDdiMDg4MiwgMHg3YWZhNTksCisgICAgMHg3YWVjMzEsIDB4N2FkZTBiLCAweDdhY2ZlNywgMHg3YWMxYzQsIDB4N2FiM2EzLCAweDdhYTU4MywgMHg3YTk3NjUsIDB4N2E4OTQ5LCAweDdhN2IyZSwgMHg3YTZkMTUsIDB4N2E1ZWZkLCAweDdhNTBlOCwgMHg3YTQyZDMsIDB4N2EzNGMxLCAweDdhMjZiMCwKKyAgICAweDdhMThhMCwgMHg3YTBhOTMsIDB4NzlmYzg3LCAweDc5ZWU3YywgMHg3OWUwNzMsIDB4NzlkMjZjLCAweDc5YzQ2NiwgMHg3OWI2NjIsIDB4NzlhODYwLCAweDc5OWE1ZiwgMHg3OThjNjAsIDB4Nzk3ZTYyLCAweDc5NzA2NiwgMHg3OTYyNmMsIDB4Nzk1NDczLAorICAgIDB4Nzk0NjdjLCAweDc5Mzg4NiwgMHg3OTJhOTIsIDB4NzkxY2EwLCAweDc5MGVhZiwgMHg3OTAwYzAsIDB4NzhmMmQzLCAweDc4ZTRlNywgMHg3OGQ2ZmMsIDB4NzhjOTE0LCAweDc4YmIyZCwgMHg3OGFkNDcsIDB4Nzg5ZjYzLCAweDc4OTE4MSwgMHg3ODgzYTAsCisgICAgMHg3ODc1YzEsIDB4Nzg2N2UzLCAweDc4NWEwNywgMHg3ODRjMmQsIDB4NzgzZTU0LCAweDc4MzA3ZCwgMHg3ODIyYTgsIDB4NzgxNGQ0LCAweDc4MDcwMSwgMHg3N2Y5MzEsIDB4NzdlYjYxLCAweDc3ZGQ5NCwgMHg3N2NmYzgsIDB4NzdjMWZkLCAweDc3YjQzNCwKKyAgICAweDc3YTY2ZCwgMHg3Nzk4YTgsIDB4Nzc4YWUzLCAweDc3N2QyMSwgMHg3NzZmNjAsIDB4Nzc2MWExLCAweDc3NTNlMywgMHg3NzQ2MjcsIDB4NzczODZjLCAweDc3MmFiMywgMHg3NzFjZmMsIDB4NzcwZjQ2LCAweDc3MDE5MiwgMHg3NmYzZGYsIDB4NzZlNjJlLAorICAgIDB4NzZkODdlLCAweDc2Y2FkMCwgMHg3NmJkMjQsIDB4NzZhZjc5LCAweDc2YTFkMCwgMHg3Njk0MjgsIDB4NzY4NjgyLCAweDc2NzhkZSwgMHg3NjZiM2IsIDB4NzY1ZDk5LCAweDc2NGZmYSwgMHg3NjQyNWIsIDB4NzYzNGJmLCAweDc2MjcyMywgMHg3NjE5OGEsCisgICAgMHg3NjBiZjIsIDB4NzVmZTVjLCAweDc1ZjBjNywgMHg3NWUzMzMsIDB4NzVkNWEyLCAweDc1YzgxMSwgMHg3NWJhODMsIDB4NzVhY2Y2LCAweDc1OWY2YSwgMHg3NTkxZTAsIDB4NzU4NDU4LCAweDc1NzZkMSwgMHg3NTY5NGMsIDB4NzU1YmM4LCAweDc1NGU0NiwKKyAgICAweDc1NDBjNiwgMHg3NTMzNDcsIDB4NzUyNWM5LCAweDc1MTg0ZCwgMHg3NTBhZDMsIDB4NzRmZDVhLCAweDc0ZWZlMywgMHg3NGUyNmQsIDB4NzRkNGY5LCAweDc0Yzc4NiwgMHg3NGJhMTUsIDB4NzRhY2E2LCAweDc0OWYzOCwgMHg3NDkxY2IsIDB4NzQ4NDYwLAorICAgIDB4NzQ3NmY3LCAweDc0Njk4ZiwgMHg3NDVjMjksIDB4NzQ0ZWM0LCAweDc0NDE2MSwgMHg3NDMzZmYsIDB4NzQyNjlmLCAweDc0MTk0MSwgMHg3NDBiZTQsIDB4NzNmZTg4LCAweDczZjEyZSwgMHg3M2UzZDYsIDB4NzNkNjdmLCAweDczYzkyYSwgMHg3M2JiZDYsCisgICAgMHg3M2FlODQsIDB4NzNhMTMzLCAweDczOTNlNCwgMHg3Mzg2OTYsIDB4NzM3OTRhLCAweDczNmJmZiwgMHg3MzVlYjYsIDB4NzM1MTZmLCAweDczNDQyOSwgMHg3MzM2ZTQsIDB4NzMyOWExLCAweDczMWM2MCwgMHg3MzBmMjAsIDB4NzMwMWUxLCAweDcyZjRhNSwKKyAgICAweDcyZTc2OSwgMHg3MmRhMmYsIDB4NzJjY2Y3LCAweDcyYmZjMCwgMHg3MmIyOGIsIDB4NzJhNTU3LCAweDcyOTgyNSwgMHg3MjhhZjQsIDB4NzI3ZGM1LCAweDcyNzA5OCwgMHg3MjYzNmMsIDB4NzI1NjQxLCAweDcyNDkxOCwgMHg3MjNiZjAsIDB4NzIyZWNhLAorICAgIDB4NzIyMWE2LCAweDcyMTQ4MiwgMHg3MjA3NjEsIDB4NzFmYTQxLCAweDcxZWQyMiwgMHg3MWUwMDUsIDB4NzFkMmVhLCAweDcxYzVkMCwgMHg3MWI4YjcsIDB4NzFhYmEwLCAweDcxOWU4YiwgMHg3MTkxNzcsIDB4NzE4NDY1LCAweDcxNzc1NCwgMHg3MTZhNDQsCisgICAgMHg3MTVkMzYsIDB4NzE1MDJhLCAweDcxNDMxZiwgMHg3MTM2MTUsIDB4NzEyOTBlLCAweDcxMWMwNywgMHg3MTBmMDIsIDB4NzEwMWZmLCAweDcwZjRmZCwgMHg3MGU3ZmMsIDB4NzBkYWZkLCAweDcwY2UwMCwgMHg3MGMxMDQsIDB4NzBiNDBhLCAweDcwYTcxMSwKKyAgICAweDcwOWExOSwgMHg3MDhkMjMsIDB4NzA4MDJmLCAweDcwNzMzYywgMHg3MDY2NGEsIDB4NzA1OTVhLCAweDcwNGM2YywgMHg3MDNmN2YsIDB4NzAzMjkzLCAweDcwMjVhOSwgMHg3MDE4YzAsIDB4NzAwYmQ5LCAweDZmZmVmNCwgMHg2ZmYyMGYsIDB4NmZlNTJkLAorICAgIDB4NmZkODRjLCAweDZmY2I2YywgMHg2ZmJlOGUsIDB4NmZiMWIxLCAweDZmYTRkNiwgMHg2Zjk3ZmMsIDB4NmY4YjI0LCAweDZmN2U0ZCwgMHg2ZjcxNzgsIDB4NmY2NGE0LCAweDZmNTdkMiwgMHg2ZjRiMDEsIDB4NmYzZTMxLCAweDZmMzE2MywgMHg2ZjI0OTcsCisgICAgMHg2ZjE3Y2MsIDB4NmYwYjAyLCAweDZlZmUzYSwgMHg2ZWYxNzQsIDB4NmVlNGFmLCAweDZlZDdlYiwgMHg2ZWNiMjksIDB4NmViZTY4LCAweDZlYjFhOSwgMHg2ZWE0ZWIsIDB4NmU5ODJmLCAweDZlOGI3NCwgMHg2ZTdlYmIsIDB4NmU3MjAzLCAweDZlNjU0YywKKyAgICAweDZlNTg5NywgMHg2ZTRiZTQsIDB4NmUzZjMyLCAweDZlMzI4MSwgMHg2ZTI1ZDIsIDB4NmUxOTI0LCAweDZlMGM3OCwgMHg2ZGZmY2QsIDB4NmRmMzI0LCAweDZkZTY3YywgMHg2ZGQ5ZDYsIDB4NmRjZDMxLCAweDZkYzA4ZSwgMHg2ZGIzZWMsIDB4NmRhNzRiLAorICAgIDB4NmQ5YWFjLCAweDZkOGUwZSwgMHg2ZDgxNzIsIDB4NmQ3NGQ3LCAweDZkNjgzZSwgMHg2ZDViYTYsIDB4NmQ0ZjEwLCAweDZkNDI3YiwgMHg2ZDM1ZTcsIDB4NmQyOTU1LCAweDZkMWNjNSwgMHg2ZDEwMzYsIDB4NmQwM2E4LCAweDZjZjcxYywgMHg2Y2VhOTEsCisgICAgMHg2Y2RlMDcsIDB4NmNkMTdmLCAweDZjYzRmOSwgMHg2Y2I4NzQsIDB4NmNhYmYwLCAweDZjOWY2ZSwgMHg2YzkyZWQsIDB4NmM4NjZlLCAweDZjNzlmMCwgMHg2YzZkNzQsIDB4NmM2MGY5LCAweDZjNTQ3ZiwgMHg2YzQ4MDcsIDB4NmMzYjkxLCAweDZjMmYxYiwKKyAgICAweDZjMjJhOCwgMHg2YzE2MzUsIDB4NmMwOWM0LCAweDZiZmQ1NSwgMHg2YmYwZTcsIDB4NmJlNDdhLCAweDZiZDgwZiwgMHg2YmNiYTUsIDB4NmJiZjNkLCAweDZiYjJkNiwgMHg2YmE2NzAsIDB4NmI5YTBjLCAweDZiOGRhYSwgMHg2YjgxNDgsIDB4NmI3NGU5LAorICAgIDB4NmI2ODhhLCAweDZiNWMyZCwgMHg2YjRmZDIsIDB4NmI0Mzc4LCAweDZiMzcxZiwgMHg2YjJhYzgsIDB4NmIxZTcyLCAweDZiMTIxZCwgMHg2YjA1Y2EsIDB4NmFmOTc5LCAweDZhZWQyOSwgMHg2YWUwZGEsIDB4NmFkNDhkLCAweDZhYzg0MSwgMHg2YWJiZjYsCisgICAgMHg2YWFmYWQsIDB4NmFhMzY1LCAweDZhOTcxZiwgMHg2YThhZGEsIDB4NmE3ZTk3LCAweDZhNzI1NSwgMHg2YTY2MTQsIDB4NmE1OWQ1LCAweDZhNGQ5NywgMHg2YTQxNWIsIDB4NmEzNTIwLCAweDZhMjhlNiwgMHg2YTFjYWUsIDB4NmExMDc4LCAweDZhMDQ0MiwKKyAgICAweDY5ZjgwZSwgMHg2OWViZGMsIDB4NjlkZmFiLCAweDY5ZDM3YiwgMHg2OWM3NGQsIDB4NjliYjIwLCAweDY5YWVmNCwgMHg2OWEyY2EsIDB4Njk5NmExLCAweDY5OGE3YSwgMHg2OTdlNTQsIDB4Njk3MjMwLCAweDY5NjYwYywgMHg2OTU5ZWIsIDB4Njk0ZGNhLAorICAgIDB4Njk0MWFiLCAweDY5MzU4ZSwgMHg2OTI5NzIsIDB4NjkxZDU3LCAweDY5MTEzZSwgMHg2OTA1MjYsIDB4NjhmOTBmLCAweDY4ZWNmYSwgMHg2OGUwZTYsIDB4NjhkNGQ0LCAweDY4YzhjMywgMHg2OGJjYjMsIDB4NjhiMGE1LCAweDY4YTQ5OCwgMHg2ODk4OGQsCisgICAgMHg2ODhjODMsIDB4Njg4MDdhLCAweDY4NzQ3MywgMHg2ODY4NmQsIDB4Njg1YzY4LCAweDY4NTA2NSwgMHg2ODQ0NjMsIDB4NjgzODYzLCAweDY4MmM2NCwgMHg2ODIwNjYsIDB4NjgxNDZhLCAweDY4MDg2ZiwgMHg2N2ZjNzYsIDB4NjdmMDdkLCAweDY3ZTQ4NywKKyAgICAweDY3ZDg5MSwgMHg2N2NjOWQsIDB4NjdjMGFiLCAweDY3YjRiYSwgMHg2N2E4Y2EsIDB4Njc5Y2RiLCAweDY3OTBlZSwgMHg2Nzg1MDIsIDB4Njc3OTE4LCAweDY3NmQyZiwgMHg2NzYxNDcsIDB4Njc1NTYxLCAweDY3NDk3YywgMHg2NzNkOTksIDB4NjczMWI3LAorICAgIDB4NjcyNWQ2LCAweDY3MTlmNywgMHg2NzBlMTksIDB4NjcwMjNjLCAweDY2ZjY2MSwgMHg2NmVhODcsIDB4NjZkZWFlLCAweDY2ZDJkNywgMHg2NmM3MDEsIDB4NjZiYjJkLCAweDY2YWY1OSwgMHg2NmEzODgsIDB4NjY5N2I3LCAweDY2OGJlOCwgMHg2NjgwMWEsCisgICAgMHg2Njc0NGUsIDB4NjY2ODgzLCAweDY2NWNiYSwgMHg2NjUwZjEsIDB4NjY0NTJhLCAweDY2Mzk2NSwgMHg2NjJkYTEsIDB4NjYyMWRlLCAweDY2MTYxYywgMHg2NjBhNWMsIDB4NjVmZTllLCAweDY1ZjJlMCwgMHg2NWU3MjQsIDB4NjVkYjY5LCAweDY1Y2ZiMCwKKyAgICAweDY1YzNmOCwgMHg2NWI4NDEsIDB4NjVhYzhjLCAweDY1YTBkOCwgMHg2NTk1MjUsIDB4NjU4OTc0LCAweDY1N2RjNCwgMHg2NTcyMTYsIDB4NjU2NjY4LCAweDY1NWFiYywgMHg2NTRmMTIsIDB4NjU0MzY5LCAweDY1MzdjMSwgMHg2NTJjMWEsIDB4NjUyMDc1LAorICAgIDB4NjUxNGQxLCAweDY1MDkyZiwgMHg2NGZkOGQsIDB4NjRmMWVlLCAweDY0ZTY0ZiwgMHg2NGRhYjIsIDB4NjRjZjE2LCAweDY0YzM3YywgMHg2NGI3ZTMsIDB4NjRhYzRiLCAweDY0YTBiNCwgMHg2NDk1MWYsIDB4NjQ4OThiLCAweDY0N2RmOSwgMHg2NDcyNjgsCisgICAgMHg2NDY2ZDgsIDB4NjQ1YjQ5LCAweDY0NGZiYywgMHg2NDQ0MzAsIDB4NjQzOGE2LCAweDY0MmQxZCwgMHg2NDIxOTUsIDB4NjQxNjBlLCAweDY0MGE4OSwgMHg2M2ZmMDUsIDB4NjNmMzgzLCAweDYzZTgwMiwgMHg2M2RjODIsIDB4NjNkMTAzLCAweDYzYzU4NiwKKyAgICAweDYzYmEwYSwgMHg2M2FlOGYsIDB4NjNhMzE2LCAweDYzOTc5ZSwgMHg2MzhjMjgsIDB4NjM4MGIyLCAweDYzNzUzZSwgMHg2MzY5Y2MsIDB4NjM1ZTVhLCAweDYzNTJlYSwgMHg2MzQ3N2IsIDB4NjMzYzBlLCAweDYzMzBhMiwgMHg2MzI1MzcsIDB4NjMxOWNlLAorICAgIDB4NjMwZTY2LCAweDYzMDJmZiwgMHg2MmY3OTksIDB4NjJlYzM1LCAweDYyZTBkMiwgMHg2MmQ1NzEsIDB4NjJjYTEwLCAweDYyYmViMSwgMHg2MmIzNTQsIDB4NjJhN2Y3LCAweDYyOWM5YywgMHg2MjkxNDIsIDB4NjI4NWVhLCAweDYyN2E5MywgMHg2MjZmM2QsCisgICAgMHg2MjYzZTksIDB4NjI1ODk1LCAweDYyNGQ0MywgMHg2MjQxZjMsIDB4NjIzNmE0LCAweDYyMmI1NiwgMHg2MjIwMDksIDB4NjIxNGJkLCAweDYyMDk3MywgMHg2MWZlMmIsIDB4NjFmMmUzLCAweDYxZTc5ZCwgMHg2MWRjNTgsIDB4NjFkMTE0LCAweDYxYzVkMiwKKyAgICAweDYxYmE5MSwgMHg2MWFmNTEsIDB4NjFhNDEzLCAweDYxOThkNiwgMHg2MThkOWEsIDB4NjE4MjVmLCAweDYxNzcyNiwgMHg2MTZiZWUsIDB4NjE2MGI3LCAweDYxNTU4MiwgMHg2MTRhNGUsIDB4NjEzZjFiLCAweDYxMzNlYSwgMHg2MTI4YjksIDB4NjExZDhhLAorICAgIDB4NjExMjVkLCAweDYxMDczMCwgMHg2MGZjMDUsIDB4NjBmMGRjLCAweDYwZTViMywgMHg2MGRhOGMsIDB4NjBjZjY2LCAweDYwYzQ0MSwgMHg2MGI5MWUsIDB4NjBhZGZjLCAweDYwYTJkYiwgMHg2MDk3YmMsIDB4NjA4YzlkLCAweDYwODE4MCwgMHg2MDc2NjUsCisgICAgMHg2MDZiNGEsIDB4NjA2MDMxLCAweDYwNTUxOSwgMHg2MDRhMDMsIDB4NjAzZWVkLCAweDYwMzNkOSwgMHg2MDI4YzcsIDB4NjAxZGI1LCAweDYwMTJhNSwgMHg2MDA3OTYsIDB4NWZmYzg4LCAweDVmZjE3YywgMHg1ZmU2NzEsIDB4NWZkYjY3LCAweDVmZDA1ZSwKKyAgICAweDVmYzU1NywgMHg1ZmJhNTEsIDB4NWZhZjRjLCAweDVmYTQ0OSwgMHg1Zjk5NDcsIDB4NWY4ZTQ2LCAweDVmODM0NiwgMHg1Zjc4NDgsIDB4NWY2ZDRhLCAweDVmNjI0ZSwgMHg1ZjU3NTQsIDB4NWY0YzVhLCAweDVmNDE2MiwgMHg1ZjM2NmMsIDB4NWYyYjc2LAorICAgIDB4NWYyMDgyLCAweDVmMTU4ZiwgMHg1ZjBhOWQsIDB4NWVmZmFjLCAweDVlZjRiZCwgMHg1ZWU5Y2YsIDB4NWVkZWUyLCAweDVlZDNmNywgMHg1ZWM5MGMsIDB4NWViZTIzLCAweDVlYjMzYywgMHg1ZWE4NTUsIDB4NWU5ZDcwLCAweDVlOTI4YywgMHg1ZTg3YTksCisgICAgMHg1ZTdjYzgsIDB4NWU3MWU4LCAweDVlNjcwOSwgMHg1ZTVjMmIsIDB4NWU1MTRmLCAweDVlNDY3MywgMHg1ZTNiOTksIDB4NWUzMGMxLCAweDVlMjVlOSwgMHg1ZTFiMTMsIDB4NWUxMDNlLCAweDVlMDU2YSwgMHg1ZGZhOTgsIDB4NWRlZmM3LCAweDVkZTRmNywKKyAgICAweDVkZGEyOCwgMHg1ZGNmNWEsIDB4NWRjNDhlLCAweDVkYjljMywgMHg1ZGFlZjksIDB4NWRhNDMxLCAweDVkOTk2YSwgMHg1ZDhlYTQsIDB4NWQ4M2RmLCAweDVkNzkxYiwgMHg1ZDZlNTksIDB4NWQ2Mzk4LCAweDVkNThkOCwgMHg1ZDRlMTksIDB4NWQ0MzVjLAorICAgIDB4NWQzOGEwLCAweDVkMmRlNSwgMHg1ZDIzMmIsIDB4NWQxODczLCAweDVkMGRiYywgMHg1ZDAzMDYsIDB4NWNmODUxLCAweDVjZWQ5ZCwgMHg1Y2UyZWIsIDB4NWNkODNhLCAweDVjY2Q4YSwgMHg1Y2MyZGMsIDB4NWNiODJlLCAweDVjYWQ4MiwgMHg1Y2EyZDcsCisgICAgMHg1Yzk4MmUsIDB4NWM4ZDg1LCAweDVjODJkZSwgMHg1Yzc4MzgsIDB4NWM2ZDkzLCAweDVjNjJmMCwgMHg1YzU4NGUsIDB4NWM0ZGFkLCAweDVjNDMwZCwgMHg1YzM4NmUsIDB4NWMyZGQxLCAweDVjMjMzNCwgMHg1YzE4OTksIDB4NWMwZTAwLCAweDVjMDM2NywKKyAgICAweDViZjhkMCwgMHg1YmVlM2EsIDB4NWJlM2E1LCAweDViZDkxMSwgMHg1YmNlN2YsIDB4NWJjM2VlLCAweDViYjk1ZSwgMHg1YmFlY2YsIDB4NWJhNDQxLCAweDViOTliNSwgMHg1YjhmMmEsIDB4NWI4NGEwLCAweDViN2ExNywgMHg1YjZmOTAsIDB4NWI2NTA5LAorICAgIDB4NWI1YTg0LCAweDViNTAwMCwgMHg1YjQ1N2UsIDB4NWIzYWZjLCAweDViMzA3YywgMHg1YjI1ZmQsIDB4NWIxYjdmLCAweDViMTEwMywgMHg1YjA2ODcsIDB4NWFmYzBkLCAweDVhZjE5NCwgMHg1YWU3MWMsIDB4NWFkY2E2LCAweDVhZDIzMCwgMHg1YWM3YmMsCisgICAgMHg1YWJkNDksIDB4NWFiMmQ3LCAweDVhYTg2NywgMHg1YTlkZjcsIDB4NWE5Mzg5LCAweDVhODkxYywgMHg1YTdlYjEsIDB4NWE3NDQ2LCAweDVhNjlkZCwgMHg1YTVmNzQsIDB4NWE1NTBkLCAweDVhNGFhOCwgMHg1YTQwNDMsIDB4NWEzNWUwLCAweDVhMmI3ZSwKKyAgICAweDVhMjExZCwgMHg1YTE2YmQsIDB4NWEwYzVlLCAweDVhMDIwMSwgMHg1OWY3YTUsIDB4NTllZDRhLCAweDU5ZTJmMCwgMHg1OWQ4OTcsIDB4NTljZTQwLCAweDU5YzNlOSwgMHg1OWI5OTQsIDB4NTlhZjQwLCAweDU5YTRlZSwgMHg1OTlhOWMsIDB4NTk5MDRjLAorICAgIDB4NTk4NWZkLCAweDU5N2JhZiwgMHg1OTcxNjIsIDB4NTk2NzE3LCAweDU5NWNjYywgMHg1OTUyODMsIDB4NTk0ODNiLCAweDU5M2RmNCwgMHg1OTMzYWUsIDB4NTkyOTZhLCAweDU5MWYyNywgMHg1OTE0ZTUsIDB4NTkwYWE0LCAweDU5MDA2NCwgMHg1OGY2MjUsCisgICAgMHg1OGViZTgsIDB4NThlMWFjLCAweDU4ZDc3MSwgMHg1OGNkMzcsIDB4NThjMmZlLCAweDU4YjhjNywgMHg1OGFlOTAsIDB4NThhNDViLCAweDU4OWEyNywgMHg1ODhmZjUsIDB4NTg4NWMzLCAweDU4N2I5MywgMHg1ODcxNjMsIDB4NTg2NzM1LCAweDU4NWQwOCwKKyAgICAweDU4NTJkYywgMHg1ODQ4YjIsIDB4NTgzZTg4LCAweDU4MzQ2MCwgMHg1ODJhMzksIDB4NTgyMDEzLCAweDU4MTVlZSwgMHg1ODBiY2IsIDB4NTgwMWE5LCAweDU3Zjc4NywgMHg1N2VkNjcsIDB4NTdlMzQ4LCAweDU3ZDkyYiwgMHg1N2NmMGUsIDB4NTdjNGYzLAorICAgIDB4NTdiYWQ4LCAweDU3YjBiZiwgMHg1N2E2YTcsIDB4NTc5YzkxLCAweDU3OTI3YiwgMHg1Nzg4NjYsIDB4NTc3ZTUzLCAweDU3NzQ0MSwgMHg1NzZhMzAsIDB4NTc2MDIwLCAweDU3NTYxMiwgMHg1NzRjMDQsIDB4NTc0MWY4LCAweDU3MzdlZCwgMHg1NzJkZTMsCisgICAgMHg1NzIzZGEsIDB4NTcxOWQyLCAweDU3MGZjYywgMHg1NzA1YzYsIDB4NTZmYmMyLCAweDU2ZjFiZiwgMHg1NmU3YmQsIDB4NTZkZGJjLCAweDU2ZDNiYywgMHg1NmM5YmUsIDB4NTZiZmMxLCAweDU2YjVjNCwgMHg1NmFiYzksIDB4NTZhMWNmLCAweDU2OTdkNywKKyAgICAweDU2OGRkZiwgMHg1NjgzZTksIDB4NTY3OWYzLCAweDU2NmZmZiwgMHg1NjY2MGMsIDB4NTY1YzFhLCAweDU2NTIyYSwgMHg1NjQ4M2EsIDB4NTYzZTRjLCAweDU2MzQ1ZSwgMHg1NjJhNzIsIDB4NTYyMDg3LCAweDU2MTY5ZCwgMHg1NjBjYjUsIDB4NTYwMmNkLAorICAgIDB4NTVmOGU3LCAweDU1ZWYwMSwgMHg1NWU1MWQsIDB4NTVkYjNhLCAweDU1ZDE1OCwgMHg1NWM3NzcsIDB4NTViZDk4LCAweDU1YjNiOSwgMHg1NWE5ZGMsIDB4NTVhMDAwLCAweDU1OTYyNSwgMHg1NThjNGIsIDB4NTU4MjcyLCAweDU1Nzg5YSwgMHg1NTZlYzQsCisgICAgMHg1NTY0ZWUsIDB4NTU1YjFhLCAweDU1NTE0NywgMHg1NTQ3NzUsIDB4NTUzZGE0LCAweDU1MzNkNCwgMHg1NTJhMDYsIDB4NTUyMDM4LCAweDU1MTY2YywgMHg1NTBjYTEsIDB4NTUwMmQ3LCAweDU0ZjkwZSwgMHg1NGVmNDYsIDB4NTRlNTdmLCAweDU0ZGJiYSwKKyAgICAweDU0ZDFmNSwgMHg1NGM4MzIsIDB4NTRiZTZmLCAweDU0YjRhZSwgMHg1NGFhZWUsIDB4NTRhMTMwLCAweDU0OTc3MiwgMHg1NDhkYjUsIDB4NTQ4M2ZhLCAweDU0N2EzZiwgMHg1NDcwODYsIDB4NTQ2NmNlLCAweDU0NWQxNywgMHg1NDUzNjEsIDB4NTQ0OWFjLAorICAgIDB4NTQzZmY5LCAweDU0MzY0NiwgMHg1NDJjOTUsIDB4NTQyMmU0LCAweDU0MTkzNSwgMHg1NDBmODcsIDB4NTQwNWRhLCAweDUzZmMyZSwgMHg1M2YyODMsIDB4NTNlOGRhLCAweDUzZGYzMSwgMHg1M2Q1OGEsIDB4NTNjYmU0LCAweDUzYzIzZSwgMHg1M2I4OWEsCisgICAgMHg1M2FlZjcsIDB4NTNhNTU1LCAweDUzOWJiNSwgMHg1MzkyMTUsIDB4NTM4ODc3LCAweDUzN2VkOSwgMHg1Mzc1M2QsIDB4NTM2YmEyLCAweDUzNjIwOCwgMHg1MzU4NmYsIDB4NTM0ZWQ3LCAweDUzNDU0MCwgMHg1MzNiYWEsIDB4NTMzMjE2LCAweDUzMjg4MiwKKyAgICAweDUzMWVmMCwgMHg1MzE1NWUsIDB4NTMwYmNlLCAweDUzMDIzZiwgMHg1MmY4YjEsIDB4NTJlZjI0LCAweDUyZTU5OSwgMHg1MmRjMGUsIDB4NTJkMjg0LCAweDUyYzhmYywgMHg1MmJmNzQsIDB4NTJiNWVlLCAweDUyYWM2OSwgMHg1MmEyZTUsIDB4NTI5OTYyLAorICAgIDB4NTI4ZmUwLCAweDUyODY1ZiwgMHg1MjdjZGYsIDB4NTI3MzYxLCAweDUyNjllMywgMHg1MjYwNjcsIDB4NTI1NmViLCAweDUyNGQ3MSwgMHg1MjQzZjgsIDB4NTIzYTgwLCAweDUyMzEwOSwgMHg1MjI3OTMsIDB4NTIxZTFlLCAweDUyMTRhYiwgMHg1MjBiMzgsCisgICAgMHg1MjAxYzYsIDB4NTFmODU2LCAweDUxZWVlNywgMHg1MWU1NzgsIDB4NTFkYzBiLCAweDUxZDI5ZiwgMHg1MWM5MzQsIDB4NTFiZmNhLCAweDUxYjY2MSwgMHg1MWFjZjksIDB4NTFhMzkzLCAweDUxOWEyZCwgMHg1MTkwYzksIDB4NTE4NzY1LCAweDUxN2UwMywKKyAgICAweDUxNzRhMSwgMHg1MTZiNDEsIDB4NTE2MWUyLCAweDUxNTg4NCwgMHg1MTRmMjcsIDB4NTE0NWNiLCAweDUxM2M3MCwgMHg1MTMzMTcsIDB4NTEyOWJlLCAweDUxMjA2NiwgMHg1MTE3MTAsIDB4NTEwZGJhLCAweDUxMDQ2NiwgMHg1MGZiMTMsIDB4NTBmMWMxLAorICAgIDB4NTBlODZmLCAweDUwZGYxZiwgMHg1MGQ1ZDAsIDB4NTBjYzgyLCAweDUwYzMzNiwgMHg1MGI5ZWEsIDB4NTBiMDlmLCAweDUwYTc1NSwgMHg1MDllMGQsIDB4NTA5NGM1LCAweDUwOGI3ZiwgMHg1MDgyM2EsIDB4NTA3OGY1LCAweDUwNmZiMiwgMHg1MDY2NzAsCisgICAgMHg1MDVkMmYsIDB4NTA1M2VmLCAweDUwNGFiMCwgMHg1MDQxNzIsIDB4NTAzODM1LCAweDUwMmVmOSwgMHg1MDI1YmUsIDB4NTAxYzg1LCAweDUwMTM0YywgMHg1MDBhMTUsIDB4NTAwMGRlLCAweDRmZjdhOSwgMHg0ZmVlNzQsIDB4NGZlNTQxLCAweDRmZGMwZiwKKyAgICAweDRmZDJkZSwgMHg0ZmM5YWUsIDB4NGZjMDdlLCAweDRmYjc1MCwgMHg0ZmFlMjMsIDB4NGZhNGY4LCAweDRmOWJjZCwgMHg0ZjkyYTMsIDB4NGY4OTdhLCAweDRmODA1MywgMHg0Zjc3MmMsIDB4NGY2ZTA2LCAweDRmNjRlMiwgMHg0ZjViYmUsIDB4NGY1MjljLAorICAgIDB4NGY0OTdiLCAweDRmNDA1YSwgMHg0ZjM3M2IsIDB4NGYyZTFkLCAweDRmMjUwMCwgMHg0ZjFiZTQsIDB4NGYxMmM5LCAweDRmMDlhZiwgMHg0ZjAwOTYsIDB4NGVmNzdlLCAweDRlZWU2NywgMHg0ZWU1NTEsIDB4NGVkYzNjLCAweDRlZDMyOCwgMHg0ZWNhMTYsCisgICAgMHg0ZWMxMDQsIDB4NGViN2YzLCAweDRlYWVlNCwgMHg0ZWE1ZDUsIDB4NGU5Y2M4LCAweDRlOTNiYywgMHg0ZThhYjAsIDB4NGU4MWE2LCAweDRlNzg5YywgMHg0ZTZmOTQsIDB4NGU2NjhkLCAweDRlNWQ4NywgMHg0ZTU0ODIsIDB4NGU0YjdlLCAweDRlNDI3YSwKKyAgICAweDRlMzk3OCwgMHg0ZTMwNzcsIDB4NGUyNzc3LCAweDRlMWU3OSwgMHg0ZTE1N2IsIDB4NGUwYzdlLCAweDRlMDM4MiwgMHg0ZGZhODcsIDB4NGRmMThkLCAweDRkZTg5NSwgMHg0ZGRmOWQsIDB4NGRkNmE2LCAweDRkY2RiMSwgMHg0ZGM0YmMsIDB4NGRiYmM5LAorICAgIDB4NGRiMmQ2LCAweDRkYTllNSwgMHg0ZGEwZjQsIDB4NGQ5ODA1LCAweDRkOGYxNiwgMHg0ZDg2MjksIDB4NGQ3ZDNjLCAweDRkNzQ1MSwgMHg0ZDZiNjcsIDB4NGQ2MjdlLCAweDRkNTk5NSwgMHg0ZDUwYWUsIDB4NGQ0N2M4LCAweDRkM2VlMywgMHg0ZDM1ZmYsCisgICAgMHg0ZDJkMWIsIDB4NGQyNDM5LCAweDRkMWI1OCwgMHg0ZDEyNzgsIDB4NGQwOTk5LCAweDRkMDBiYiwgMHg0Y2Y3ZGUsIDB4NGNlZjAyLCAweDRjZTYyNywgMHg0Y2RkNGQsIDB4NGNkNDc0LCAweDRjY2I5YywgMHg0Y2MyYzUsIDB4NGNiOWYwLCAweDRjYjExYiwKKyAgICAweDRjYTg0NywgMHg0YzlmNzQsIDB4NGM5NmEyLCAweDRjOGRkMSwgMHg0Yzg1MDIsIDB4NGM3YzMzLCAweDRjNzM2NSwgMHg0YzZhOTgsIDB4NGM2MWNkLCAweDRjNTkwMiwgMHg0YzUwMzgsIDB4NGM0NzcwLCAweDRjM2VhOCwgMHg0YzM1ZTEsIDB4NGMyZDFjLAorICAgIDB4NGMyNDU3LCAweDRjMWI5MywgMHg0YzEyZDEsIDB4NGMwYTBmLCAweDRjMDE0ZiwgMHg0YmY4OGYsIDB4NGJlZmQwLCAweDRiZTcxMywgMHg0YmRlNTYsIDB4NGJkNTliLCAweDRiY2NlMCwgMHg0YmM0MjYsIDB4NGJiYjZlLCAweDRiYjJiNiwgMHg0YmFhMDAsCisgICAgMHg0YmExNGEsIDB4NGI5ODk2LCAweDRiOGZlMiwgMHg0Yjg3MzAsIDB4NGI3ZTdlLCAweDRiNzVjZCwgMHg0YjZkMWUsIDB4NGI2NDZmLCAweDRiNWJjMiwgMHg0YjUzMTUsIDB4NGI0YTZhLCAweDRiNDFiZiwgMHg0YjM5MTYsIDB4NGIzMDZkLCAweDRiMjdjNiwKKyAgICAweDRiMWYxZiwgMHg0YjE2NzksIDB4NGIwZGQ1LCAweDRiMDUzMSwgMHg0YWZjOGYsIDB4NGFmM2VkLCAweDRhZWI0YywgMHg0YWUyYWQsIDB4NGFkYTBlLCAweDRhZDE3MSwgMHg0YWM4ZDQsIDB4NGFjMDM4LCAweDRhYjc5ZSwgMHg0YWFmMDQsIDB4NGFhNjZiLAorICAgIDB4NGE5ZGQ0LCAweDRhOTUzZCwgMHg0YThjYTcsIDB4NGE4NDEzLCAweDRhN2I3ZiwgMHg0YTcyZWMsIDB4NGE2YTVhLCAweDRhNjFjYSwgMHg0YTU5M2EsIDB4NGE1MGFiLCAweDRhNDgxZCwgMHg0YTNmOTEsIDB4NGEzNzA1LCAweDRhMmU3YSwgMHg0YTI1ZjAsCisgICAgMHg0YTFkNjcsIDB4NGExNGRmLCAweDRhMGM1OCwgMHg0YTAzZDIsIDB4NDlmYjRkLCAweDQ5ZjJjOSwgMHg0OWVhNDYsIDB4NDllMWM0LCAweDQ5ZDk0MywgMHg0OWQwYzMsIDB4NDljODQ0LCAweDQ5YmZjNiwgMHg0OWI3NDksIDB4NDlhZWNkLCAweDQ5YTY1MiwKKyAgICAweDQ5OWRkNywgMHg0OTk1NWUsIDB4NDk4Y2U2LCAweDQ5ODQ2ZiwgMHg0OTdiZjgsIDB4NDk3MzgzLCAweDQ5NmIwZiwgMHg0OTYyOWIsIDB4NDk1YTI5LCAweDQ5NTFiOCwgMHg0OTQ5NDcsIDB4NDk0MGQ4LCAweDQ5Mzg2OSwgMHg0OTJmZmMsIDB4NDkyNzhmLAorICAgIDB4NDkxZjIzLCAweDQ5MTZiOSwgMHg0OTBlNGYsIDB4NDkwNWU2LCAweDQ4ZmQ3ZiwgMHg0OGY1MTgsIDB4NDhlY2IyLCAweDQ4ZTQ0ZCwgMHg0OGRiZTksIDB4NDhkMzg2LCAweDQ4Y2IyNSwgMHg0OGMyYzQsIDB4NDhiYTY0LCAweDQ4YjIwNSwgMHg0OGE5YTYsCisgICAgMHg0OGExNDksIDB4NDg5OGVkLCAweDQ4OTA5MiwgMHg0ODg4MzgsIDB4NDg3ZmRmLCAweDQ4Nzc4NiwgMHg0ODZmMmYsIDB4NDg2NmQ4LCAweDQ4NWU4MywgMHg0ODU2MmYsIDB4NDg0ZGRiLCAweDQ4NDU4OSwgMHg0ODNkMzcsIDB4NDgzNGU2LCAweDQ4MmM5NywKKyAgICAweDQ4MjQ0OCwgMHg0ODFiZmEsIDB4NDgxM2FkLCAweDQ4MGI2MiwgMHg0ODAzMTcsIDB4NDdmYWNkLCAweDQ3ZjI4NCwgMHg0N2VhM2MsIDB4NDdlMWY1LCAweDQ3ZDlhZSwgMHg0N2QxNjksIDB4NDdjOTI1LCAweDQ3YzBlMiwgMHg0N2I4OWYsIDB4NDdiMDVlLAorICAgIDB4NDdhODFlLCAweDQ3OWZkZSwgMHg0Nzk3YTAsIDB4NDc4ZjYyLCAweDQ3ODcyNSwgMHg0NzdlZWEsIDB4NDc3NmFmLCAweDQ3NmU3NSwgMHg0NzY2M2MsIDB4NDc1ZTA1LCAweDQ3NTVjZSwgMHg0NzRkOTgsIDB4NDc0NTYzLCAweDQ3M2QyZiwgMHg0NzM0ZmIsCisgICAgMHg0NzJjYzksIDB4NDcyNDk4LCAweDQ3MWM2OCwgMHg0NzE0MzgsIDB4NDcwYzBhLCAweDQ3MDNkYywgMHg0NmZiYjAsIDB4NDZmMzg0LCAweDQ2ZWI1OSwgMHg0NmUzMzAsIDB4NDZkYjA3LCAweDQ2ZDJkZiwgMHg0NmNhYjgsIDB4NDZjMjkyLCAweDQ2YmE2ZCwKKyAgICAweDQ2YjI0OSwgMHg0NmFhMjYsIDB4NDZhMjAzLCAweDQ2OTllMiwgMHg0NjkxYzIsIDB4NDY4OWEyLCAweDQ2ODE4NCwgMHg0Njc5NjYsIDB4NDY3MTRhLCAweDQ2NjkyZSwgMHg0NjYxMTMsIDB4NDY1OGY5LCAweDQ2NTBlMCwgMHg0NjQ4YzksIDB4NDY0MGIxLAorICAgIDB4NDYzODliLCAweDQ2MzA4NiwgMHg0NjI4NzIsIDB4NDYyMDVmLCAweDQ2MTg0YywgMHg0NjEwM2IsIDB4NDYwODJhLCAweDQ2MDAxYiwgMHg0NWY4MGMsIDB4NDVlZmZlLCAweDQ1ZTdmMiwgMHg0NWRmZTYsIDB4NDVkN2RiLCAweDQ1Y2ZkMSwgMHg0NWM3YzgsCisgICAgMHg0NWJmYmYsIDB4NDViN2I4LCAweDQ1YWZiMiwgMHg0NWE3YWMsIDB4NDU5ZmE4LCAweDQ1OTdhNCwgMHg0NThmYTIsIDB4NDU4N2EwLCAweDQ1N2Y5ZiwgMHg0NTc3OWYsIDB4NDU2ZmEwLCAweDQ1NjdhMiwgMHg0NTVmYTUsIDB4NDU1N2E5LCAweDQ1NGZhZSwKKyAgICAweDQ1NDdiMywgMHg0NTNmYmEsIDB4NDUzN2MxLCAweDQ1MmZjYSwgMHg0NTI3ZDMsIDB4NDUxZmRkLCAweDQ1MTdlOCwgMHg0NTBmZjUsIDB4NDUwODAyLCAweDQ1MDAwZiwgMHg0NGY4MWUsIDB4NDRmMDJlLCAweDQ0ZTgzZiwgMHg0NGUwNTAsIDB4NDRkODYzLAorICAgIDB4NDRkMDc2LCAweDQ0Yzg4YSwgMHg0NGMwOWYsIDB4NDRiOGI2LCAweDQ0YjBjZCwgMHg0NGE4ZTQsIDB4NDRhMGZkLCAweDQ0OTkxNywgMHg0NDkxMzIsIDB4NDQ4OTRkLCAweDQ0ODE2YSwgMHg0NDc5ODcsIDB4NDQ3MWE1LCAweDQ0NjljNSwgMHg0NDYxZTUsCisgICAgMHg0NDVhMDYsIDB4NDQ1MjI4LCAweDQ0NGE0YiwgMHg0NDQyNmUsIDB4NDQzYTkzLCAweDQ0MzJiOCwgMHg0NDJhZGYsIDB4NDQyMzA2LCAweDQ0MWIyZSwgMHg0NDEzNTgsIDB4NDQwYjgyLCAweDQ0MDNhZCwgMHg0M2ZiZDgsIDB4NDNmNDA1LCAweDQzZWMzMywKKyAgICAweDQzZTQ2MSwgMHg0M2RjOTEsIDB4NDNkNGMxLCAweDQzY2NmMywgMHg0M2M1MjUsIDB4NDNiZDU4LCAweDQzYjU4YywgMHg0M2FkYzEsIDB4NDNhNWY2LCAweDQzOWUyZCwgMHg0Mzk2NjQsIDB4NDM4ZTlkLCAweDQzODZkNiwgMHg0MzdmMTAsIDB4NDM3NzRjLAorICAgIDB4NDM2Zjg4LCAweDQzNjdjNSwgMHg0MzYwMDIsIDB4NDM1ODQxLCAweDQzNTA4MSwgMHg0MzQ4YzEsIDB4NDM0MTAyLCAweDQzMzk0NSwgMHg0MzMxODgsIDB4NDMyOWNjLCAweDQzMjIxMSwgMHg0MzFhNTcsIDB4NDMxMjlkLCAweDQzMGFlNSwgMHg0MzAzMmUsCisgICAgMHg0MmZiNzcsIDB4NDJmM2MxLCAweDQyZWMwYywgMHg0MmU0NTgsIDB4NDJkY2E1LCAweDQyZDRmMywgMHg0MmNkNDIsIDB4NDJjNTkxLCAweDQyYmRlMiwgMHg0MmI2MzMsIDB4NDJhZTg1LCAweDQyYTZkOSwgMHg0MjlmMmQsIDB4NDI5NzgxLCAweDQyOGZkNywKKyAgICAweDQyODgyZSwgMHg0MjgwODUsIDB4NDI3OGRlLCAweDQyNzEzNywgMHg0MjY5OTEsIDB4NDI2MWVjLCAweDQyNWE0OCwgMHg0MjUyYTUsIDB4NDI0YjAzLCAweDQyNDM2MSwgMHg0MjNiYzEsIDB4NDIzNDIxLCAweDQyMmM4MiwgMHg0MjI0ZTUsIDB4NDIxZDQ4LAorICAgIDB4NDIxNWFiLCAweDQyMGUxMCwgMHg0MjA2NzYsIDB4NDFmZWRjLCAweDQxZjc0NCwgMHg0MWVmYWMsIDB4NDFlODE1LCAweDQxZTA3ZiwgMHg0MWQ4ZWEsIDB4NDFkMTU1LCAweDQxYzljMiwgMHg0MWMyMmYsIDB4NDFiYTllLCAweDQxYjMwZCwgMHg0MWFiN2QsCisgICAgMHg0MWEzZWUsIDB4NDE5YzYwLCAweDQxOTRkMiwgMHg0MThkNDYsIDB4NDE4NWJhLCAweDQxN2UzMCwgMHg0MTc2YTYsIDB4NDE2ZjFkLCAweDQxNjc5NSwgMHg0MTYwMGQsIDB4NDE1ODg3LCAweDQxNTEwMiwgMHg0MTQ5N2QsIDB4NDE0MWY5LCAweDQxM2E3NiwKKyAgICAweDQxMzJmNCwgMHg0MTJiNzMsIDB4NDEyM2YzLCAweDQxMWM3MywgMHg0MTE0ZjUsIDB4NDEwZDc3LCAweDQxMDVmYSwgMHg0MGZlN2UsIDB4NDBmNzAzLCAweDQwZWY4OSwgMHg0MGU4MGYsIDB4NDBlMDk3LCAweDQwZDkxZiwgMHg0MGQxYTgsIDB4NDBjYTMyLAorICAgIDB4NDBjMmJkLCAweDQwYmI0OSwgMHg0MGIzZDUsIDB4NDBhYzYzLCAweDQwYTRmMSwgMHg0MDlkODAsIDB4NDA5NjEwLCAweDQwOGVhMSwgMHg0MDg3MzMsIDB4NDA3ZmM1LCAweDQwNzg1OSwgMHg0MDcwZWQsIDB4NDA2OTgyLCAweDQwNjIxOCwgMHg0MDVhYWYsCisgICAgMHg0MDUzNDcsIDB4NDA0YmRmLCAweDQwNDQ3OSwgMHg0MDNkMTMsIDB4NDAzNWFlLCAweDQwMmU0YSwgMHg0MDI2ZTcsIDB4NDAxZjg1LCAweDQwMTgyMywgMHg0MDEwYzMsIDB4NDAwOTYzLCAweDQwMDIwNCwgMHgzZmZhYTYsIDB4M2ZmMzQ4LCAweDNmZWJlYywKKyAgICAweDNmZTQ5MCwgMHgzZmRkMzYsIDB4M2ZkNWRjLCAweDNmY2U4MywgMHgzZmM3MmIsIDB4M2ZiZmQzLCAweDNmYjg3ZCwgMHgzZmIxMjcsIDB4M2ZhOWQzLCAweDNmYTI3ZiwgMHgzZjliMmMsIDB4M2Y5M2Q5LCAweDNmOGM4OCwgMHgzZjg1MzcsIDB4M2Y3ZGU4LAorICAgIDB4M2Y3Njk5LCAweDNmNmY0YiwgMHgzZjY3ZmQsIDB4M2Y2MGIxLCAweDNmNTk2NiwgMHgzZjUyMWIsIDB4M2Y0YWQxLCAweDNmNDM4OCwgMHgzZjNjNDAsIDB4M2YzNGY5LCAweDNmMmRiMiwgMHgzZjI2NmMsIDB4M2YxZjI4LCAweDNmMTdlNCwgMHgzZjEwYTEsCisgICAgMHgzZjA5NWUsIDB4M2YwMjFkLCAweDNlZmFkYywgMHgzZWYzOWMsIDB4M2VlYzVkLCAweDNlZTUxZiwgMHgzZWRkZTIsIDB4M2VkNmE2LCAweDNlY2Y2YSwgMHgzZWM4MmYsIDB4M2VjMGY1LCAweDNlYjliYywgMHgzZWIyODQsIDB4M2VhYjRjLCAweDNlYTQxNiwKKyAgICAweDNlOWNlMCwgMHgzZTk1YWIsIDB4M2U4ZTc3LCAweDNlODc0MywgMHgzZTgwMTEsIDB4M2U3OGRmLCAweDNlNzFhZSwgMHgzZTZhN2UsIDB4M2U2MzRmLCAweDNlNWMyMSwgMHgzZTU0ZjMsIDB4M2U0ZGM3LCAweDNlNDY5YiwgMHgzZTNmNzAsIDB4M2UzODQ1LAorICAgIDB4M2UzMTFjLCAweDNlMjlmMywgMHgzZTIyY2MsIDB4M2UxYmE1LCAweDNlMTQ3ZiwgMHgzZTBkNTksIDB4M2UwNjM1LCAweDNkZmYxMSwgMHgzZGY3ZWYsIDB4M2RmMGNkLCAweDNkZTlhYiwgMHgzZGUyOGIsIDB4M2RkYjZiLCAweDNkZDQ0ZCwgMHgzZGNkMmYsCisgICAgMHgzZGM2MTIsIDB4M2RiZWY2LCAweDNkYjdkYSwgMHgzZGIwYzAsIDB4M2RhOWE2LCAweDNkYTI4ZCwgMHgzZDliNzUsIDB4M2Q5NDVkLCAweDNkOGQ0NywgMHgzZDg2MzEsIDB4M2Q3ZjFjLCAweDNkNzgwOCwgMHgzZDcwZjUsIDB4M2Q2OWUyLCAweDNkNjJkMSwKKyAgICAweDNkNWJjMCwgMHgzZDU0YjAsIDB4M2Q0ZGExLCAweDNkNDY5MiwgMHgzZDNmODUsIDB4M2QzODc4LCAweDNkMzE2YywgMHgzZDJhNjEsIDB4M2QyMzU2LCAweDNkMWM0ZCwgMHgzZDE1NDQsIDB4M2QwZTNjLCAweDNkMDczNSwgMHgzZDAwMmYsIDB4M2NmOTI5LAorICAgIDB4M2NmMjI1LCAweDNjZWIyMSwgMHgzY2U0MWUsIDB4M2NkZDFjLCAweDNjZDYxYSwgMHgzY2NmMWEsIDB4M2NjODFhLCAweDNjYzExYiwgMHgzY2JhMWMsIDB4M2NiMzFmLCAweDNjYWMyMiwgMHgzY2E1MjcsIDB4M2M5ZTJjLCAweDNjOTczMSwgMHgzYzkwMzgsCisgICAgMHgzYzg5M2YsIDB4M2M4MjQ4LCAweDNjN2I1MSwgMHgzYzc0NWIsIDB4M2M2ZDY1LCAweDNjNjY3MSwgMHgzYzVmN2QsIDB4M2M1ODhhLCAweDNjNTE5OCwgMHgzYzRhYTYsIDB4M2M0M2I2LCAweDNjM2NjNiwgMHgzYzM1ZDcsIDB4M2MyZWU5LCAweDNjMjdmYiwKKyAgICAweDNjMjEwZiwgMHgzYzFhMjMsIDB4M2MxMzM4LCAweDNjMGM0ZSwgMHgzYzA1NjQsIDB4M2JmZTdjLCAweDNiZjc5NCwgMHgzYmYwYWQsIDB4M2JlOWM3LCAweDNiZTJlMSwgMHgzYmRiZmQsIDB4M2JkNTE5LCAweDNiY2UzNiwgMHgzYmM3NTMsIDB4M2JjMDcyLAorICAgIDB4M2JiOTkxLCAweDNiYjJiMSwgMHgzYmFiZDIsIDB4M2JhNGY0LCAweDNiOWUxNywgMHgzYjk3M2EsIDB4M2I5MDVlLCAweDNiODk4MywgMHgzYjgyYTgsIDB4M2I3YmNmLCAweDNiNzRmNiwgMHgzYjZlMWUsIDB4M2I2NzQ3LCAweDNiNjA3MCwgMHgzYjU5OWIsCisgICAgMHgzYjUyYzYsIDB4M2I0YmYyLCAweDNiNDUxZiwgMHgzYjNlNGMsIDB4M2IzNzdiLCAweDNiMzBhYSwgMHgzYjI5ZGEsIDB4M2IyMzBhLCAweDNiMWMzYywgMHgzYjE1NmUsIDB4M2IwZWExLCAweDNiMDdkNSwgMHgzYjAxMDksIDB4M2FmYTNmLCAweDNhZjM3NSwKKyAgICAweDNhZWNhYywgMHgzYWU1ZTMsIDB4M2FkZjFjLCAweDNhZDg1NSwgMHgzYWQxOGYsIDB4M2FjYWNhLCAweDNhYzQwNiwgMHgzYWJkNDIsIDB4M2FiNjdmLCAweDNhYWZiZCwgMHgzYWE4ZmMsIDB4M2FhMjNiLCAweDNhOWI3YywgMHgzYTk0YmQsIDB4M2E4ZGZlLAorICAgIDB4M2E4NzQxLCAweDNhODA4NCwgMHgzYTc5YzksIDB4M2E3MzBkLCAweDNhNmM1MywgMHgzYTY1OWEsIDB4M2E1ZWUxLCAweDNhNTgyOSwgMHgzYTUxNzIsIDB4M2E0YWJiLCAweDNhNDQwNiwgMHgzYTNkNTEsIDB4M2EzNjlkLCAweDNhMmZlOSwgMHgzYTI5MzcsCisgICAgMHgzYTIyODUsIDB4M2ExYmQ0LCAweDNhMTUyNCwgMHgzYTBlNzQsIDB4M2EwN2M1LCAweDNhMDExOCwgMHgzOWZhNmEsIDB4MzlmM2JlLCAweDM5ZWQxMiwgMHgzOWU2NjcsIDB4MzlkZmJkLCAweDM5ZDkxNCwgMHgzOWQyNmIsIDB4MzljYmM0LCAweDM5YzUxZCwKKyAgICAweDM5YmU3NiwgMHgzOWI3ZDEsIDB4MzliMTJjLCAweDM5YWE4OCwgMHgzOWEzZTUsIDB4Mzk5ZDQyLCAweDM5OTZhMSwgMHgzOTkwMDAsIDB4Mzk4OTYwLCAweDM5ODJjMCwgMHgzOTdjMjIsIDB4Mzk3NTg0LCAweDM5NmVlNywgMHgzOTY4NGEsIDB4Mzk2MWFmLAorICAgIDB4Mzk1YjE0LCAweDM5NTQ3YSwgMHgzOTRkZTAsIDB4Mzk0NzQ4LCAweDM5NDBiMCwgMHgzOTNhMTksIDB4MzkzMzgzLCAweDM5MmNlZCwgMHgzOTI2NTgsIDB4MzkxZmM0LCAweDM5MTkzMSwgMHgzOTEyOWYsIDB4MzkwYzBkLCAweDM5MDU3YywgMHgzOGZlZWMsCisgICAgMHgzOGY4NWMsIDB4MzhmMWNlLCAweDM4ZWI0MCwgMHgzOGU0YjIsIDB4MzhkZTI2LCAweDM4ZDc5YSwgMHgzOGQxMGYsIDB4MzhjYTg1LCAweDM4YzNmYywgMHgzOGJkNzMsIDB4MzhiNmViLCAweDM4YjA2NCwgMHgzOGE5ZGUsIDB4MzhhMzU4LCAweDM4OWNkMywKKyAgICAweDM4OTY0ZiwgMHgzODhmY2IsIDB4Mzg4OTQ5LCAweDM4ODJjNywgMHgzODdjNDYsIDB4Mzg3NWM1LCAweDM4NmY0NSwgMHgzODY4YzcsIDB4Mzg2MjQ4LCAweDM4NWJjYiwgMHgzODU1NGUsIDB4Mzg0ZWQyLCAweDM4NDg1NywgMHgzODQxZGQsIDB4MzgzYjYzLAorICAgIDB4MzgzNGVhLCAweDM4MmU3MiwgMHgzODI3ZmEsIDB4MzgyMTg0LCAweDM4MWIwZSwgMHgzODE0OTgsIDB4MzgwZTI0LCAweDM4MDdiMCwgMHgzODAxM2QsIDB4MzdmYWNiLCAweDM3ZjQ1OSwgMHgzN2VkZTksIDB4MzdlNzc4LCAweDM3ZTEwOSwgMHgzN2RhOWIsCisgICAgMHgzN2Q0MmQsIDB4MzdjZGMwLCAweDM3Yzc1MywgMHgzN2MwZTgsIDB4MzdiYTdkLCAweDM3YjQxMywgMHgzN2FkYTksIDB4MzdhNzQxLCAweDM3YTBkOSwgMHgzNzlhNzIsIDB4Mzc5NDBiLCAweDM3OGRhNiwgMHgzNzg3NDEsIDB4Mzc4MGRjLCAweDM3N2E3OSwKKyAgICAweDM3NzQxNiwgMHgzNzZkYjQsIDB4Mzc2NzUzLCAweDM3NjBmMiwgMHgzNzVhOTMsIDB4Mzc1NDMzLCAweDM3NGRkNSwgMHgzNzQ3NzcsIDB4Mzc0MTFiLCAweDM3M2FiZSwgMHgzNzM0NjMsIDB4MzcyZTA4LCAweDM3MjdhZSwgMHgzNzIxNTUsIDB4MzcxYWZkLAorICAgIDB4MzcxNGE1LCAweDM3MGU0ZSwgMHgzNzA3ZjgsIDB4MzcwMWEyLCAweDM2ZmI0ZCwgMHgzNmY0ZjksIDB4MzZlZWE2LCAweDM2ZTg1MywgMHgzNmUyMDEsIDB4MzZkYmIwLCAweDM2ZDU1ZiwgMHgzNmNmMTAsIDB4MzZjOGMxLCAweDM2YzI3MiwgMHgzNmJjMjUsCisgICAgMHgzNmI1ZDgsIDB4MzZhZjhjLCAweDM2YTk0MCwgMHgzNmEyZjYsIDB4MzY5Y2FjLCAweDM2OTY2MywgMHgzNjkwMWEsIDB4MzY4OWQyLCAweDM2ODM4YiwgMHgzNjdkNDUsIDB4MzY3NmZmLCAweDM2NzBiYSwgMHgzNjZhNzYsIDB4MzY2NDMzLCAweDM2NWRmMCwKKyAgICAweDM2NTdhZSwgMHgzNjUxNmQsIDB4MzY0YjJjLCAweDM2NDRlYywgMHgzNjNlYWQsIDB4MzYzODZmLCAweDM2MzIzMSwgMHgzNjJiZjQsIDB4MzYyNWI4LCAweDM2MWY3YywgMHgzNjE5NDIsIDB4MzYxMzA4LCAweDM2MGNjZSwgMHgzNjA2OTUsIDB4MzYwMDVlLAorICAgIDB4MzVmYTI2Cit9OworCisjZGVmaW5lIEhEQ0RfUFJPQ0VTU19TVEVSRU9fREVGQVVMVCAxCisjZGVmaW5lIEhEQ0RfTUFYX0NIQU5ORUxTIDIKKworLyoqIGNvbnZlcnQgdG8gZmxvYXQgZnJvbSA0LWJpdCAoMy4xKSBmaXhlZC1wb2ludAorICogIHRoZSBhbHdheXMtbmVnYXRpdmUgdmFsdWUgaXMgc3RvcmVkIHBvc2l0aXZlLCBzbyBtYWtlIGl0IG5lZ2F0aXZlICovCisjZGVmaW5lIEdBSU5UT0ZMT0FUKGcpIChnKSA/IC0oZmxvYXQpKGc+PjEpIC0gKChnICYgMSkgPyAwLjUgOiAwLjApIDogMC4wCisKKy8qKiBhcHBseSBnYWluLCAxMS1iaXQgKDMuOCkgZml4ZWQgcG9pbnQsCisgKiAgYWx3YXlzIG5lZ2F0aXZlIGJ1dCBzdG9yZWQgcG9zaXRpdmUuICovCisjZGVmaW5lIEFQUExZX0dBSU4ocyxnKSBkb3tpbnQ2NF90IHM2NCA9IHM7IHM2NCAqPSBnYWludGFiW2ddOyBzID0gKGludDMyX3QpKHM2NCA+PiAyMyk7IH13aGlsZSgwKTsKKworLyoqIHRvbmUgZ2VuZXJhdG9yOiBzYW1wbGVfbnVtYmVyLCBmcmVxdWVuY3ksIHNhbXBsZV9yYXRlLCBhbXBsaXR1ZGUgKi8KKyNkZWZpbmUgVE9ORUdFTjE2KHNuLCBmLCBzciwgYSkgKGludDE2X3QpKHNpbigoNi4yODMxODUzMDcxOCAqIChzbikgKiAoZikpIC8oc3IpKSAqIChhKSAqIDB4N2ZmZikKKwordHlwZWRlZiBzdHJ1Y3QgaGRjZF9zdGF0ZSB7CisgICAgdWludDY0X3Qgd2luZG93OworICAgIHVuc2lnbmVkIGNoYXIgcmVhZGFoZWFkOworCisgICAgLyoqIGFyZyBpcyBzZXQgd2hlbiBhIHBhY2tldCBwcmVmaXggaXMgZm91bmQuCisgICAgICogIGNvbnRyb2wgaXMgdGhlIGFjdGl2ZSBjb250cm9sIGNvZGUsIHdoZXJlCisgICAgICogIGJpdCAwLTM6IHRhcmdldF9nYWluLCA0LWJpdCAoMy4xKSBmaXhlZC1wb2ludCB2YWx1ZQorICAgICAqICBiaXQgNCAgOiBwZWFrX2V4dGVuZAorICAgICAqICBiaXQgNSAgOiB0cmFuc2llbnRfZmlsdGVyCisgICAgICogIGJpdCA2LDc6IGFsd2F5cyB6ZXJvICovCisgICAgdWludDhfdCBhcmcsIGNvbnRyb2w7CisgICAgdW5zaWduZWQgaW50IHN1c3RhaW4sIHN1c3RhaW5fcmVzZXQ7IC8qKjwgY29kZSBkZXRlY3QgdGltZXIgKi8KKworICAgIGludCBydW5uaW5nX2dhaW47IC8qKjwgMTEtYml0ICgzLjgpIGZpeGVkIHBvaW50LCBleHRlbmRlZCBmcm9tIHRhcmdldF9nYWluICovCisKKyAgICAvKiBjb3VudGVycyAqLworICAgIGludCBjb2RlX2NvdW50ZXJBOyAgICAgICAgICAgIC8qKjwgOC1iaXQgZm9ybWF0IHBhY2tldCAqLworICAgIGludCBjb2RlX2NvdW50ZXJBX2FsbW9zdDsgICAgIC8qKjwgbG9va3MgbGlrZSBhbiBBIGNvZGUsIGJ1dCBhIGJpdCBleHBlY3RlZCB0byBiZSAwIGlzIDEgKi8KKyAgICBpbnQgY29kZV9jb3VudGVyQjsgICAgICAgICAgICAvKio8IDE2LWJpdCBmb3JtYXQgcGFja2V0LCA4LWJpdCBjb2RlLCA4LWJpdCBYT1Igb2YgY29kZSAqLworICAgIGludCBjb2RlX2NvdW50ZXJCX2NoZWNrZmFpbHM7IC8qKjwgbG9va3MgbGlrZSBhIEIgY29kZSwgYnV0IGRvZXNuJ3QgcGFzcyB0aGUgWE9SIGNoZWNrICovCisgICAgaW50IGNvZGVfY291bnRlckM7ICAgICAgICAgICAgLyoqPCBwYWNrZXQgcHJlZml4IHdhcyBmb3VuZCwgZXhwZWN0IGEgY29kZSAqLworICAgIGludCBjb2RlX2NvdW50ZXJDX3VubWF0Y2hlZDsgIC8qKjwgdG9sZCB0byBsb29rIGZvciBhIGNvZGUsIGJ1dCBkaWRuJ3QgZmluZCBvbmUgKi8KKyAgICBpbnQgY291bnRfcGVha19leHRlbmQ7ICAgICAgICAvKio8IHZhbGlkIHBhY2tldHMgd2hlcmUgcGVha19leHRlbmQgd2FzIGVuYWJsZWQgKi8KKyAgICBpbnQgY291bnRfdHJhbnNpZW50X2ZpbHRlcjsgICAvKio8IHZhbGlkIHBhY2tldHMgd2hlcmUgZmlsdGVyIHdhcyBkZXRlY3RlZCAqLworICAgIC8qKiB0YXJnZXRfZ2FpbiBpcyBhIDQtYml0ICgzLjEpIGZpeGVkLXBvaW50IHZhbHVlLCBhbHdheXMKKyAgICAgKiAgbmVnYXRpdmUsIGJ1dCBzdG9yZWQgcG9zaXRpdmUuCisgICAgICogIFRoZSAxNiBwb3NzaWJsZSB2YWx1ZXMgcmFuZ2UgZnJvbSAtNy41IHRvIDAuMCBkQiBpbgorICAgICAqICBzdGVwcyBvZiAwLjUsIGJ1dCBubyB2YWx1ZSBiZWxvdyAtNi4wIGRCIHNob3VsZCBhcHBlYXIuICovCisgICAgaW50IGdhaW5fY291bnRzWzE2XTsKKyAgICBpbnQgbWF4X2dhaW47CisgICAgLyoqIG9jY3VycmVuY2VzIG9mIGNvZGUgZGV0ZWN0IHRpbWVyIGV4cGlyaW5nIHdpdGhvdXQgZGV0ZWN0aW5nCisgICAgICogIGEgY29kZS4gLTEgZm9yIHRpbWVyIG5ldmVyIHNldC4gKi8KKyAgICBpbnQgY291bnRfc3VzdGFpbl9leHBpcmVkOworCisgICAgaW50IHJhdGU7ICAgICAgICAgICAgICAgICAgIC8qKjwgc2FtcGxpbmcgcmF0ZSAqLworICAgIGludCBfYW5hX3NuYjsgICAgICAgICAgICAgICAvKio8IHVzZWQgaW4gdGhlIGFuYWx5emUgbW9kZSB0b25lIGdlbmVyYXRvciAqLworfSBoZGNkX3N0YXRlOworCit0eXBlZGVmIGVudW0geworICAgIEhEQ0RfUEVfTkVWRVIgICAgICAgID0gMCwgLyoqPCBBbGwgdmFsaWQgcGFja2V0cyBoYXZlIFBFIHNldCB0byBvZmYgKi8KKyAgICBIRENEX1BFX0lOVEVSTUlUVEVOVCA9IDEsIC8qKjwgU29tZSB2YWxpZCBwYWNrZXRzIGhhdmUgUEUgc2V0IHRvIG9uICovCisgICAgSERDRF9QRV9QRVJNQU5FTlQgICAgPSAyLCAvKio8IEFsbCB2YWxpZCBwYWNrZXRzIGhhdmUgUEUgc2V0IHRvIG9uICAqLworfSBoZGNkX3BlOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBlX3N0cltdID0geworICAgICJuZXZlciBlbmFibGVkIiwKKyAgICAiZW5hYmxlZCBpbnRlcm1pdHRlbnRseSIsCisgICAgImVuYWJsZWQgcGVybWFuZW50bHkiCit9OworCit0eXBlZGVmIGVudW0geworICAgIEhEQ0RfTk9ORSAgICAgICAgICAgID0gMCwgIC8qKjwgSERDRCBwYWNrZXRzIGRvIG5vdCAoeWV0KSBhcHBlYXIgICovCisgICAgSERDRF9OT19FRkZFQ1QgICAgICAgPSAxLCAgLyoqPCBIRENEIHBhY2tldHMgYXBwZWFyLCBidXQgYWxsIGNvbnRyb2wgY29kZXMgYXJlIE5PUCAqLworICAgIEhEQ0RfRUZGRUNUVUFMICAgICAgID0gMiwgIC8qKjwgSERDRCBwYWNrZXRzIGFwcGVhciwgYW5kIGNoYW5nZSB0aGUgb3V0cHV0IGluIHNvbWUgd2F5ICovCit9IGhkY2RfZHY7CisKK3R5cGVkZWYgZW51bSB7CisgICAgSERDRF9QVkVSX05PTkUgICAgICAgPSAwLCAvKio8IE5vIHBhY2tldHMgKHlldCkgZGlzY292ZXJlZCAqLworICAgIEhEQ0RfUFZFUl9BICAgICAgICAgID0gMSwgLyoqPCBQYWNrZXRzIG9mIHR5cGUgQSAoOC1iaXQgY29udHJvbCkgZGlzY292ZXJlZCAqLworICAgIEhEQ0RfUFZFUl9CICAgICAgICAgID0gMiwgLyoqPCBQYWNrZXRzIG9mIHR5cGUgQiAoOC1iaXQgY29udHJvbCwgOC1iaXQgWE9SKSBkaXNjb3ZlcmVkICovCisgICAgSERDRF9QVkVSX01JWCAgICAgICAgPSAzLCAvKio8IFBhY2tldHMgb2YgdHlwZSBBIGFuZCBCIGRpc2NvdmVyZWQsIG1vc3QgbGlrZWx5IGFuIGVuY29kaW5nIGVycm9yICovCit9IGhkY2RfcGY7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcGZfc3RyW10gPSB7CisgICAgIj8iLCAiQSIsICJCIiwgIkErQiIKK307CisKK3R5cGVkZWYgc3RydWN0IGhkY2RfZGV0ZWN0aW9uX2RhdGEgeworICAgIGhkY2RfZHYgaGRjZF9kZXRlY3RlZDsKKyAgICBoZGNkX3BmIHBhY2tldF90eXBlOworICAgIGludCB0b3RhbF9wYWNrZXRzOyAgICAgICAgIC8qKjwgdmFsaWQgcGFja2V0cyAqLworICAgIGludCBlcnJvcnM7ICAgICAgICAgICAgICAgIC8qKjwgZGV0ZWN0YWJsZSBlcnJvcnMgKi8KKyAgICBoZGNkX3BlIHBlYWtfZXh0ZW5kOworICAgIGludCB1c2VzX3RyYW5zaWVudF9maWx0ZXI7CisgICAgZmxvYXQgbWF4X2dhaW5fYWRqdXN0bWVudDsgLyoqPCBpbiBkQiwgZXhwZWN0ZWQgaW4gdGhlIHJhbmdlIC03LjUgdG8gMC4wICovCisgICAgaW50IGNkdF9leHBpcmF0aW9uczsgICAgICAgLyoqPCAtMSBmb3IgbmV2ZXIgc2V0LCAwIGZvciBzZXQgYnV0IG5ldmVyIGV4cGlyZWQgKi8KKworICAgIGludCBfYWN0aXZlX2NvdW50OyAgICAgICAgIC8qKjwgdXNlZCBpbnRlcm5hbGx5ICovCit9IGhkY2RfZGV0ZWN0aW9uX2RhdGE7CisKK3R5cGVkZWYgZW51bSB7CisgICAgSERDRF9BTkFfT0ZGICAgID0gMCwKKyAgICBIRENEX0FOQV9MTEUgICAgPSAxLAorICAgIEhEQ0RfQU5BX1BFICAgICA9IDIsCisgICAgSERDRF9BTkFfQ0RUICAgID0gMywKKyAgICBIRENEX0FOQV9UR00gICAgPSA0LAorICAgIEhEQ0RfQU5BX1RPUCAgICA9IDUsIC8qKjwgdXNlZCBpbiBtYXggdmFsdWUgb2YgQVZPcHRpb24gKi8KK30gaGRjZF9hbmFfbW9kZTsKKworLyoqIGFuYWx5emUgbW9kZSBkZXNjcmlwdGlvbnM6IG1hY3JvIGZvciBBVk9wdGlvbiBkZWZpbml0aW9ucywgYXJyYXkgb2YgY29uc3QgY2hhciBmb3IgbWFwcGluZyBtb2RlIHRvIHN0cmluZyAqLworI2RlZmluZSBIRENEX0FOQV9PRkZfREVTQyAiZGlzYWJsZWQiCisjZGVmaW5lIEhEQ0RfQU5BX0xMRV9ERVNDICJnYWluIGFkanVzdG1lbnQgbGV2ZWwgYXQgZWFjaCBzYW1wbGUiCisjZGVmaW5lIEhEQ0RfQU5BX1BFX0RFU0MgICJzYW1wbGVzIHdoZXJlIHBlYWsgZXh0ZW5kIG9jY3VycyIKKyNkZWZpbmUgSERDRF9BTkFfQ0RUX0RFU0MgInNhbXBsZXMgd2hlcmUgdGhlIGNvZGUgZGV0ZWN0IHRpbWVyIGlzIGFjdGl2ZSIKKyNkZWZpbmUgSERDRF9BTkFfVEdNX0RFU0MgInNhbXBsZXMgd2hlcmUgdGhlIHRhcmdldCBnYWluIGRvZXMgbm90IG1hdGNoIGJldHdlZW4gY2hhbm5lbHMiCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGFuYV9tb2RlX3N0cltdID0geworICAgIEhEQ0RfQU5BX09GRl9ERVNDLAorICAgIEhEQ0RfQU5BX0xMRV9ERVNDLAorICAgIEhEQ0RfQU5BX1BFX0RFU0MsCisgICAgSERDRF9BTkFfQ0RUX0RFU0MsCisgICAgSERDRF9BTkFfVEdNX0RFU0MsCit9OworCit0eXBlZGVmIHN0cnVjdCBIRENEQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaGRjZF9zdGF0ZSBzdGF0ZVtIRENEX01BWF9DSEFOTkVMU107CisKKyAgICAvKiBBVk9wdGlvbiBtZW1iZXJzICovCisgICAgLyoqIHVzZSBoZGNkXypfc3RlcmVvKCkgZnVuY3Rpb25zIHRvIHByb2Nlc3MgYm90aCBjaGFubmVscyB0b2dldGhlci4KKyAgICAgKiAgLWFmIGhkY2Q9cHJvY2Vzc19zdGVyZW89MCBmb3Igb2ZmCisgICAgICogIC1hZiBoZGNkPXByb2Nlc3Nfc3RlcmVvPTEgZm9yIG9uCisgICAgICogIGRlZmF1bHQgaXMgSERDRF9QUk9DRVNTX1NURVJFT19ERUZBVUxUICovCisgICAgaW50IHByb2Nlc3Nfc3RlcmVvOworICAgIC8qKiBhbHdheXMgZXh0ZW5kIHBlYWtzIGFib3ZlIC0zZEJGUyBldmVuIGlmIFBFIGlzbid0IHNpZ25hbGVkCisgICAgICogIC1hZiBoZGNkPWZvcmNlX3BlPTAgZm9yIG9mZgorICAgICAqICAtYWYgaGRjZD1mb3JjZV9wZT0xIGZvciBvbgorICAgICAqICBkZWZhdWx0IGlzIG9mZiAqLworICAgIGludCBmb3JjZV9wZTsKKworICAgIC8qKiBhbmFseXplIG1vZGUgcmVwbGFjZXMgdGhlIGF1ZGlvIHdpdGggYSBzb2xpZCB0b25lIGFuZCBhZGp1c3RzCisgICAgICogIHRoZSBhbXBsaXR1ZGUgdG8gc2lnbmFsIHNvbWUgc3BlY2lmaWMgYXNwZWN0IG9mIHRoZSBkZWNvZGluZworICAgICAqICBwcm9jZXNzLiBTZWUgZG9jcyBvciBIRENEX0FOQV8qIGRlZmluZXMuICovCisgICAgaW50IGFuYWx5emVfbW9kZTsKKworICAgIGludCBjZHRfbXM7ICAgICAgICAgICAgICAgLyoqPCBjb2RlIGRldGVjdCB0aW1lciBwZXJpb2QgaW4gbXMgKi8KKworICAgIGludCBkaXNhYmxlX2F1dG9jb252ZXJ0OyAgLyoqPCBkaXNhYmxlIGFueSBmb3JtYXQgY29udmVyc2lvbiBvciByZXNhbXBsaW5nIGluIHRoZSBmaWx0ZXIgZ3JhcGggKi8KKworICAgIGludCBiaXRzX3Blcl9zYW1wbGU7ICAgICAgLyoqPCBiaXRzIHBlciBzYW1wbGUgMTYsIDIwLCBvciAyNCAqLworICAgIC8qIGVuZCBBVk9wdGlvbiBtZW1iZXJzICovCisKKyAgICAvKiogY29uZmlnX2lucHV0KCkgYW5kIGNvbmZpZ19vdXRwdXQoKSBzY2FuIGxpbmtzIGZvciBhbnkgcmVzYW1wbGluZworICAgICAqICBvciBmb3JtYXQgY2hhbmdlcy4gSWYgZm91bmQsIHdhcm5pbmdzIGFyZSBpc3N1ZWQgYW5kIGJhZF9jb25maWcKKyAgICAgKiAgaXMgc2V0LiAqLworICAgIGludCBiYWRfY29uZmlnOworCisgICAgQVZGaWx0ZXJDb250ZXh0ICpmY3R4OyAvKio8IGZpbHRlciBjb250ZXh0IGZvciBsb2dnaW5nIGVycm9ycyAqLworICAgIGludCBzYW1wbGVfY291bnQ7ICAgICAgLyoqPCB1c2VkIGluIGVycm9yIGxvZ2dpbmcgKi8KKyAgICBpbnQgdmFsX3RhcmdldF9nYWluOyAgIC8qKjwgbGFzdCBtYXRjaGluZyB0YXJnZXRfZ2FpbiBpbiBib3RoIGNoYW5uZWxzICovCisKKyAgICAvKiBVc2VyIGluZm9ybWF0aW9uL3N0YXRzICovCisgICAgaGRjZF9kZXRlY3Rpb25fZGF0YSBkZXRlY3Q7Cit9IEhEQ0RDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihIRENEQ29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBoZGNkX29wdGlvbnNbXSA9IHsKKyAgICB7ICJkaXNhYmxlX2F1dG9jb252ZXJ0IiwgIkRpc2FibGUgYW55IGZvcm1hdCBjb252ZXJzaW9uIG9yIHJlc2FtcGxpbmcgaW4gdGhlIGZpbHRlciBncmFwaC4iLAorICAgICAgICBPRkZTRVQoZGlzYWJsZV9hdXRvY29udmVydCksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDEgfSwgMCwgMSwgQSB9LAorICAgIHsgInByb2Nlc3Nfc3RlcmVvIiwgIlByb2Nlc3Mgc3RlcmVvIGNoYW5uZWxzIHRvZ2V0aGVyLiBPbmx5IGFwcGx5IHRhcmdldF9nYWluIHdoZW4gYm90aCBjaGFubmVscyBtYXRjaC4iLAorICAgICAgICBPRkZTRVQocHJvY2Vzc19zdGVyZW8pLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSBIRENEX1BST0NFU1NfU1RFUkVPX0RFRkFVTFQgfSwgMCwgMSwgQSB9LAorICAgIHsgImNkdF9tcyIsICJDb2RlIGRldGVjdCB0aW1lciBwZXJpb2QgaW4gbXMuIiwKKyAgICAgICAgT0ZGU0VUKGNkdF9tcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMjAwMCB9LCAxMDAsIDYwMDAwLCBBIH0sCisgICAgeyAiZm9yY2VfcGUiLCAiQWx3YXlzIGV4dGVuZCBwZWFrcyBhYm92ZSAtM2RCRlMgZXZlbiB3aGVuIFBFIGlzIG5vdCBzaWduYWxlZC4iLAorICAgICAgICBPRkZTRVQoZm9yY2VfcGUpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIEEgfSwKKyAgICB7ICJhbmFseXplX21vZGUiLCAgIlJlcGxhY2UgYXVkaW8gd2l0aCBzb2xpZCB0b25lIGFuZCBzaWduYWwgc29tZSBwcm9jZXNzaW5nIGFzcGVjdCBpbiB0aGUgYW1wbGl0dWRlLiIsCisgICAgICAgIE9GRlNFVChhbmFseXplX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2ND1IRENEX0FOQV9PRkYgfSwgMCwgSERDRF9BTkFfVE9QLTEsIEEsICJhbmFseXplX21vZGUifSwKKyAgICAgICAgeyAib2ZmIiwgSERDRF9BTkFfT0ZGX0RFU0MsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1IRENEX0FOQV9PRkZ9LCAwLCAwLCBBLCAiYW5hbHl6ZV9tb2RlIiB9LAorICAgICAgICB7ICJsbGUiLCBIRENEX0FOQV9MTEVfREVTQywgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhEQ0RfQU5BX0xMRX0sIDAsIDAsIEEsICJhbmFseXplX21vZGUiIH0sCisgICAgICAgIHsgInBlIiwgIEhEQ0RfQU5BX1BFX0RFU0MsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9SERDRF9BTkFfUEV9LCAgMCwgMCwgQSwgImFuYWx5emVfbW9kZSIgfSwKKyAgICAgICAgeyAiY2R0IiwgSERDRF9BTkFfQ0RUX0RFU0MsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1IRENEX0FOQV9DRFR9LCAwLCAwLCBBLCAiYW5hbHl6ZV9tb2RlIiB9LAorICAgICAgICB7ICJ0Z20iLCBIRENEX0FOQV9UR01fREVTQywgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhEQ0RfQU5BX1RHTX0sIDAsIDAsIEEsICJhbmFseXplX21vZGUiIH0sCisgICAgeyAiYml0c19wZXJfc2FtcGxlIiwgICJWYWxpZCBiaXRzIHBlciBzYW1wbGUgKGxvY2F0aW9uIG9mIHRoZSB0cnVlIExTQikuIiwKKyAgICAgICAgT0ZGU0VUKGJpdHNfcGVyX3NhbXBsZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0PTE2IH0sIDE2LCAyNCwgQSwgImJpdHNfcGVyX3NhbXBsZSJ9LAorICAgICAgICB7ICIxNiIsICIxNi1iaXQgKGluIHMzMiBvciBzMTYpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTE2fSwgMCwgMCwgQSwgImJpdHNfcGVyX3NhbXBsZSIgfSwKKyAgICAgICAgeyAiMjAiLCAiMjAtYml0IChpbiBzMzIpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTIwfSwgMCwgMCwgQSwgImJpdHNfcGVyX3NhbXBsZSIgfSwKKyAgICAgICAgeyAiMjQiLCAiMjQtYml0IChpbiBzMzIpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTI0fSwgIDAsIDAsIEEsICJiaXRzX3Blcl9zYW1wbGUiIH0sCisgICAge05VTEx9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoaGRjZCk7CisKK3N0YXRpYyB2b2lkIGhkY2RfcmVzZXQoaGRjZF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIHJhdGUsIHVuc2lnbmVkIGNkdF9tcykKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50NjRfdCBzdXN0YWluX3Jlc2V0ID0gKHVpbnQ2NF90KWNkdF9tcyAqIHJhdGUgLyAxMDAwOworCisgICAgc3RhdGUtPndpbmRvdyA9IDA7CisgICAgc3RhdGUtPnJlYWRhaGVhZCA9IDMyOworICAgIHN0YXRlLT5hcmcgPSAwOworICAgIHN0YXRlLT5jb250cm9sID0gMDsKKyAgICBzdGF0ZS0+cnVubmluZ19nYWluID0gMDsKKyAgICBzdGF0ZS0+c3VzdGFpbl9yZXNldCA9IHN1c3RhaW5fcmVzZXQ7CisgICAgc3RhdGUtPnN1c3RhaW4gPSAwOworCisgICAgc3RhdGUtPmNvZGVfY291bnRlckEgPSAwOworICAgIHN0YXRlLT5jb2RlX2NvdW50ZXJBX2FsbW9zdCA9IDA7CisgICAgc3RhdGUtPmNvZGVfY291bnRlckIgPSAwOworICAgIHN0YXRlLT5jb2RlX2NvdW50ZXJCX2NoZWNrZmFpbHMgPSAwOworICAgIHN0YXRlLT5jb2RlX2NvdW50ZXJDID0gMDsKKyAgICBzdGF0ZS0+Y29kZV9jb3VudGVyQ191bm1hdGNoZWQgPSAwOworICAgIHN0YXRlLT5jb3VudF9wZWFrX2V4dGVuZCA9IDA7CisgICAgc3RhdGUtPmNvdW50X3RyYW5zaWVudF9maWx0ZXIgPSAwOworICAgIGZvcihpID0gMDsgaSA8IDE2OyBpKyspIHN0YXRlLT5nYWluX2NvdW50c1tpXSA9IDA7CisgICAgc3RhdGUtPm1heF9nYWluID0gMDsKKyAgICBzdGF0ZS0+Y291bnRfc3VzdGFpbl9leHBpcmVkID0gLTE7CisKKyAgICBzdGF0ZS0+cmF0ZSA9IHJhdGU7CisgICAgc3RhdGUtPl9hbmFfc25iID0gMDsKK30KKworc3RhdGljIGludCBoZGNkX2ludGVncmF0ZShIRENEQ29udGV4dCAqY3R4LCBoZGNkX3N0YXRlICpzdGF0ZXMsIGludCBjaGFubmVscywgaW50ICpmbGFnLCBjb25zdCBpbnQzMl90ICpzYW1wbGVzLCBpbnQgY291bnQsIGludCBzdHJpZGUpCit7CisgICAgdWludDMyX3QgYml0c1tIRENEX01BWF9DSEFOTkVMU107CisgICAgaW50IHJlc3VsdCA9IGNvdW50OworICAgIGludCBpLCBqLCBmOworICAgICpmbGFnID0gMDsKKworICAgIG1lbXNldChiaXRzLCAwLCBzaXplb2YoYml0cykpOworICAgIGlmIChzdHJpZGUgPCBjaGFubmVscykgc3RyaWRlID0gY2hhbm5lbHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykKKyAgICAgICAgcmVzdWx0ID0gRkZNSU4oc3RhdGVzW2ldLnJlYWRhaGVhZCwgcmVzdWx0KTsKKworICAgIGZvciAoaiA9IHJlc3VsdCAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgYml0c1tpXSB8PSAoKihzYW1wbGVzKyspICYgMSkgPDwgajsKKyAgICAgICAgc2FtcGxlcyArPSBzdHJpZGUgLSBjaGFubmVsczsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgICBzdGF0ZXNbaV0ud2luZG93ID0gKHN0YXRlc1tpXS53aW5kb3cgPDwgcmVzdWx0KSB8IGJpdHNbaV07CisgICAgICAgIHN0YXRlc1tpXS5yZWFkYWhlYWQgLT0gcmVzdWx0OworCisgICAgICAgIGlmIChzdGF0ZXNbaV0ucmVhZGFoZWFkID09IDApIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHdiaXRzID0gKHVpbnQzMl90KShzdGF0ZXNbaV0ud2luZG93IF4gc3RhdGVzW2ldLndpbmRvdyA+PiA1IF4gc3RhdGVzW2ldLndpbmRvdyA+PiAyMyk7CisgICAgICAgICAgICBpZiAoc3RhdGVzW2ldLmFyZykgeworICAgICAgICAgICAgICAgIGYgPSAwOworICAgICAgICAgICAgICAgIGlmICgod2JpdHMgJiAweDBmYTAwNTAwKSA9PSAweDBmYTAwNTAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEE6IDgtYml0IGNvZGUgIDB4N2UwZmEwMDVbLi5dICovCisgICAgICAgICAgICAgICAgICAgIGlmICgod2JpdHMgJiAweGM4KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICBbLi5wdCBnZ2dnXQorICAgICAgICAgICAgICAgICAgICAgICAgICogMHgwZmEwMDVbLi5dIC0+IDBiWzAwLi4gMC4uLl0sIGdhaW4gcGFydCBkb3VibGVkIChzaGlmdGVkIGxlZnQgMSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc1tpXS5jb250cm9sID0gKHdiaXRzICYgMjU1KSArICh3Yml0cyAmIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgZiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXNbaV0uY29kZV9jb3VudGVyQSsrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogb25lIG9mIGJpdHMgMywgNiwgb3IgNyB3YXMgbm90IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc1tpXS5jb2RlX2NvdW50ZXJBX2FsbW9zdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eC0+ZmN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhkY2QgZXJyb3I6IENvbnRyb2wgQSBhbG1vc3Q6IDB4JTAyIlBSSXgzMiIgbmVhciAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Yml0cyAmIDB4ZmYsIGN0eC0+c2FtcGxlX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHdiaXRzICYgMHhhMDA2MDAwMCkgPT0gMHhhMDA2MDAwMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBCOiA4LWJpdCBjb2RlLCA4LWJpdCBYT1IgY2hlY2ssIDB4N2UwZmEwMDZbLi4uLl0gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCgod2JpdHMgXiAofndiaXRzID4+IDggJiAyNTUpKSAmIDB4ZmZmZjAwZmYpID09IDB4YTAwNjAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgIGNoZWNrOiAgIFsuLnB0IGdnZ2cgfiguLnB0IGdnZ2cpXQorICAgICAgICAgICAgICAgICAgICAgICAgICogMHhhMDA2Wy4uLi5dIC0+IDBiWy4uLi4gLi4uLiAgIC4uLi4gLi4uLiBdICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXNbaV0uY29udHJvbCA9IHdiaXRzID4+IDggJiAyNTU7CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc1tpXS5jb2RlX2NvdW50ZXJCKys7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBYT1IgY2hlY2sgZmFpbGVkICovCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXNbaV0uY29kZV9jb3VudGVyQl9jaGVja2ZhaWxzKys7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LT5mY3R4LCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGRjZCBlcnJvcjogQ29udHJvbCBCIGNoZWNrIGZhaWxlZDogMHglMDQiUFJJeDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoMHglMDIiUFJJeDMyIiB2cyAweCUwMiJQUkl4MzIiKSBuZWFyICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiaXRzICYgMHhmZmZmLCAod2JpdHMgJiAweGZmMDApID4+IDgsIH53Yml0cyAmIDB4ZmYsIGN0eC0+c2FtcGxlX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZikgeworICAgICAgICAgICAgICAgICAgICAqZmxhZyB8PSAoMTw8aSk7CisgICAgICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBjb3VudGVycyAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVzW2ldLmNvbnRyb2wgJiAxNikgc3RhdGVzW2ldLmNvdW50X3BlYWtfZXh0ZW5kKys7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZXNbaV0uY29udHJvbCAmIDMyKSBzdGF0ZXNbaV0uY291bnRfdHJhbnNpZW50X2ZpbHRlcisrOworICAgICAgICAgICAgICAgICAgICBzdGF0ZXNbaV0uZ2Fpbl9jb3VudHNbc3RhdGVzW2ldLmNvbnRyb2wgJiAxNV0rKzsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzW2ldLm1heF9nYWluID0gRkZNQVgoc3RhdGVzW2ldLm1heF9nYWluLCAoc3RhdGVzW2ldLmNvbnRyb2wgJiAxNSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGF0ZXNbaV0uYXJnID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3Yml0cyA9PSAweDdlMGZhMDA1IHx8IHdiaXRzID09IDB4N2UwZmEwMDYpIHsKKyAgICAgICAgICAgICAgICAvKiAweDdlMGZhMDBbLl0tPiBbMGIwMTAxIG9yIDBiMDExMF0gKi8KKyAgICAgICAgICAgICAgICBzdGF0ZXNbaV0ucmVhZGFoZWFkID0gKHdiaXRzICYgMykgKiA4OworICAgICAgICAgICAgICAgIHN0YXRlc1tpXS5hcmcgPSAxOworICAgICAgICAgICAgICAgIHN0YXRlc1tpXS5jb2RlX2NvdW50ZXJDKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh3Yml0cykKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzW2ldLnJlYWRhaGVhZCA9IHJlYWRhaGVhZHRhYlt3Yml0cyAmIDB4ZmZdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc3RhdGVzW2ldLnJlYWRhaGVhZCA9IDMxOyAvKiBmZndkIG92ZXIgZGlnaXNpbGVuY2UgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGhkY2Rfc2NhbihIRENEQ29udGV4dCAqY3R4LCBoZGNkX3N0YXRlICpzdGF0ZXMsIGludCBjaGFubmVscywgY29uc3QgaW50MzJfdCAqc2FtcGxlcywgaW50IG1heCwgaW50IHN0cmlkZSkKK3sKKyAgICBpbnQgcmVzdWx0OworICAgIGludCBpOworICAgIGludCBjZHRfYWN0aXZlW0hEQ0RfTUFYX0NIQU5ORUxTXTsKKyAgICBtZW1zZXQoY2R0X2FjdGl2ZSwgMCwgc2l6ZW9mKGNkdF9hY3RpdmUpKTsKKworICAgIGlmIChzdHJpZGUgPCBjaGFubmVscykgc3RyaWRlID0gY2hhbm5lbHM7CisKKyAgICAvKiBjb2RlIGRldGVjdCB0aW1lcnMgZm9yIGVhY2ggY2hhbm5lbCAqLworICAgIGZvcihpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaWYgKHN0YXRlc1tpXS5zdXN0YWluID4gMCkgeworICAgICAgICAgICAgY2R0X2FjdGl2ZVtpXSA9IDE7CisgICAgICAgICAgICBpZiAoc3RhdGVzW2ldLnN1c3RhaW4gPD0gICh1bnNpZ25lZCltYXgpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZXNbaV0uY29udHJvbCA9IDA7CisgICAgICAgICAgICAgICAgbWF4ID0gc3RhdGVzW2ldLnN1c3RhaW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZXNbaV0uc3VzdGFpbiAtPSBtYXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXN1bHQgPSAwOworICAgIHdoaWxlIChyZXN1bHQgPCBtYXgpIHsKKyAgICAgICAgaW50IGZsYWc7CisgICAgICAgIGludCBjb25zdW1lZCA9IGhkY2RfaW50ZWdyYXRlKGN0eCwgc3RhdGVzLCBjaGFubmVscywgJmZsYWcsIHNhbXBsZXMsIG1heCAtIHJlc3VsdCwgc3RyaWRlKTsKKyAgICAgICAgcmVzdWx0ICs9IGNvbnN1bWVkOworICAgICAgICBpZiAoZmxhZykgeworICAgICAgICAgICAgLyogcmVzZXQgdGltZXIgaWYgY29kZSBkZXRlY3RlZCBpbiBhIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmxhZyAmICgxPDxpKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZXNbaV0uc3VzdGFpbiA9IHN0YXRlc1tpXS5zdXN0YWluX3Jlc2V0OworICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGlzIGlzIHRoZSBmaXJzdCByZXNldCB0aGVuIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAgKiBmcm9tIG5ldmVyIHNldCwgdG8gbmV2ZXIgZXhwaXJlZCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVzW2ldLmNvdW50X3N1c3RhaW5fZXhwaXJlZCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlc1tpXS5jb3VudF9zdXN0YWluX2V4cGlyZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNhbXBsZXMgKz0gY29uc3VtZWQgKiBzdHJpZGU7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworICAgICAgICAvKiBjb2RlIGRldGVjdCB0aW1lciBleHBpcmVkICovCisgICAgICAgIGlmIChjZHRfYWN0aXZlW2ldICYmIHN0YXRlc1tpXS5zdXN0YWluID09IDApCisgICAgICAgICAgICBzdGF0ZXNbaV0uY291bnRfc3VzdGFpbl9leHBpcmVkKys7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqIHJlcGxhY2UgYXVkaW8gd2l0aCBzb2xpZCB0b25lLCBidXQgc2F2ZSBMU0JzICovCitzdGF0aWMgdm9pZCBoZGNkX2FuYWx5emVfcHJlcGFyZShoZGNkX3N0YXRlICpzdGF0ZSwgaW50MzJfdCAqc2FtcGxlcywgaW50IGNvdW50LCBpbnQgc3RyaWRlKSB7CisgICAgaW50IG4sIGYgPSAzMDA7CisgICAgaW50IHNvID0gc3RhdGUtPnJhdGUgLyBmOworICAgIGZvciAobiA9IDA7IG4gPCBjb3VudCAqIHN0cmlkZTsgbiArPSBzdHJpZGUpIHsKKyAgICAgICAgLyogaW4gYW5hbHl6ZSBtb2RlLCB0aGUgYXVkaW8gaXMgcmVwbGFjZWQgYnkgYSBzb2xpZCB0b25lLCBhbmQKKyAgICAgICAgICogYW1wbGl0dWRlIGlzIGNoYW5nZWQgdG8gc2lnbmFsIHdoZW4gdGhlIHNwZWNpZmllZCBmZWF0dXJlIGlzCisgICAgICAgICAqIHVzZWQuCisgICAgICAgICAqIGJpdCAwOiBIRENEIHNpZ25hbCBwcmVzZXJ2ZWQKKyAgICAgICAgICogYml0IDE6IE9yaWdpbmFsIHNhbXBsZSB3YXMgYWJvdmUgUEUgbGV2ZWwgKi8KKyAgICAgICAgaW50MzJfdCBzYXZlID0gKGFicyhzYW1wbGVzW25dKSAtIFBFQUtfRVhUX0xFVkVMID49IDApID8gMiA6IDA7IC8qIGFib3ZlIFBFIGxldmVsICovCisgICAgICAgIHNhdmUgfD0gc2FtcGxlc1tuXSAmIDE7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmUgTFNCIGZvciBIRENEIHBhY2tldHMgKi8KKyAgICAgICAgc2FtcGxlc1tuXSA9IFRPTkVHRU4xNihzdGF0ZS0+X2FuYV9zbmIsIGYsIHN0YXRlLT5yYXRlLCAwLjEpOworICAgICAgICBzYW1wbGVzW25dID0gKHNhbXBsZXNbbl0gfCAzKSBeICgofnNhdmUpICYgMyk7CisgICAgICAgIGlmICgrK3N0YXRlLT5fYW5hX3NuYiA+IHNvKSBzdGF0ZS0+X2FuYV9zbmIgPSAwOworICAgIH0KK30KKworLyoqIGVuY29kZSBhIHZhbHVlIGluIHRoZSBnaXZlbiBzYW1wbGUgYnkgYWRqdXN0aW5nIHRoZSBhbXBsaXR1ZGUgKi8KK3N0YXRpYyBpbnQzMl90IGhkY2RfYW5hbHl6ZV9nZW4oaW50MzJfdCBzYW1wbGUsIHVuc2lnbmVkIGludCB2LCB1bnNpZ25lZCBpbnQgbWF4dikKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IHIgPSAxOCwgbSA9IDEwMjQ7CisgICAgaW50NjRfdCBzNjQgPSBzYW1wbGU7CisgICAgdiA9IG0gKyAodiAqIHIgKiBtIC8gbWF4dik7CisgICAgcmV0dXJuIChpbnQzMl90KShzNjQgKiB2IC8gbSk7Cit9CisKKy8qKiBiZWhhdmVzIGxpa2UgaGRjZF9lbnZlbG9wZSgpLCBidXQgZW5jb2RlcyBwcm9jZXNzaW5nIGluZm9ybWF0aW9uIGluCisgKiAgYSB3YXkgdGhhdCBpcyBhdWRpYmxlIChhbmQgdmlzaWJsZSBpbiBhbiBhdWRpbyBlZGl0b3IpIHRvIGFpZCBhbmFseXNpcy4gKi8KK3N0YXRpYyBpbnQgaGRjZF9hbmFseXplKGludDMyX3QgKnNhbXBsZXMsIGludCBjb3VudCwgaW50IHN0cmlkZSwgaW50IGdhaW4sIGludCB0YXJnZXRfZ2FpbiwgaW50IGV4dGVuZCwgaW50IG1vZGUsIGludCBjZHRfYWN0aXZlLCBpbnQgdGdfbWlzbWF0Y2gpCit7CisgICAgc3RhdGljIGNvbnN0IGludCBtYXhnID0gMHhmIDw8IDc7CisgICAgaW50IGk7CisgICAgaW50MzJfdCAqc2FtcGxlc19lbmQgPSBzYW1wbGVzICsgc3RyaWRlICogY291bnQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICBzYW1wbGVzW2kgKiBzdHJpZGVdIDw8PSAxNTsKKyAgICAgICAgaWYgKG1vZGUgPT0gSERDRF9BTkFfUEUpIHsKKyAgICAgICAgICAgIGludCBwZWwgPSAoc2FtcGxlc1tpICogc3RyaWRlXSA+PiAxNikgJiAxOworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGUgPSBzYW1wbGVzW2kgKiBzdHJpZGVdOworICAgICAgICAgICAgc2FtcGxlc1tpICogc3RyaWRlXSA9IGhkY2RfYW5hbHl6ZV9nZW4oc2FtcGxlLCAhIShwZWwgJiYgZXh0ZW5kKSwgMSk7CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBIRENEX0FOQV9UR00gJiYgdGdfbWlzbWF0Y2ggPiAwKQorICAgICAgICAgICAgc2FtcGxlc1tpICogc3RyaWRlXSA9IGhkY2RfYW5hbHl6ZV9nZW4oc2FtcGxlc1tpICogc3RyaWRlXSwgMSwgMSk7CisgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PSBIRENEX0FOQV9DRFQgJiYgY2R0X2FjdGl2ZSkKKyAgICAgICAgICAgIHNhbXBsZXNbaSAqIHN0cmlkZV0gPSBoZGNkX2FuYWx5emVfZ2VuKHNhbXBsZXNbaSAqIHN0cmlkZV0sIDEsIDEpOworICAgIH0KKworICAgIGlmIChnYWluIDw9IHRhcmdldF9nYWluKSB7CisgICAgICAgIGludCBsZW4gPSBGRk1JTihjb3VudCwgdGFyZ2V0X2dhaW4gLSBnYWluKTsKKyAgICAgICAgLyogYXR0ZW51YXRlIHNsb3dseSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgICsrZ2FpbjsKKyAgICAgICAgICAgIGlmIChtb2RlID09IEhEQ0RfQU5BX0xMRSkKKyAgICAgICAgICAgICAgICAqc2FtcGxlcyA9IGhkY2RfYW5hbHl6ZV9nZW4oKnNhbXBsZXMsIGdhaW4sIG1heGcpOworICAgICAgICAgICAgc2FtcGxlcyArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgLT0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBsZW4gPSBGRk1JTihjb3VudCwgKGdhaW4gLSB0YXJnZXRfZ2FpbikgPj4gMyk7CisgICAgICAgIC8qIGFtcGxpZnkgcXVpY2tseSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGdhaW4gLT0gODsKKyAgICAgICAgICAgIGlmIChtb2RlID09IEhEQ0RfQU5BX0xMRSkKKyAgICAgICAgICAgICAgICAqc2FtcGxlcyA9IGhkY2RfYW5hbHl6ZV9nZW4oKnNhbXBsZXMsIGdhaW4sIG1heGcpOworICAgICAgICAgICAgc2FtcGxlcyArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdhaW4gLSA4IDwgdGFyZ2V0X2dhaW4pCisgICAgICAgICAgICBnYWluID0gdGFyZ2V0X2dhaW47CisgICAgICAgIGNvdW50IC09IGxlbjsKKyAgICB9CisKKyAgICAvKiBob2xkIGEgc3RlYWR5IGxldmVsICovCisgICAgaWYgKGdhaW4gPT0gMCkgeworICAgICAgICBpZiAoY291bnQgPiAwKQorICAgICAgICAgICAgc2FtcGxlcyArPSBjb3VudCAqIHN0cmlkZTsKKyAgICB9IGVsc2UgeworICAgICAgICB3aGlsZSAoLS1jb3VudCA+PSAwKSB7CisgICAgICAgICAgICBpZiAobW9kZSA9PSBIRENEX0FOQV9MTEUpCisgICAgICAgICAgICAgICAgKnNhbXBsZXMgPSBoZGNkX2FuYWx5emVfZ2VuKCpzYW1wbGVzLCBnYWluLCBtYXhnKTsKKyAgICAgICAgICAgIHNhbXBsZXMgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfYXNzZXJ0MChzYW1wbGVzID09IHNhbXBsZXNfZW5kKTsKKworICAgIHJldHVybiBnYWluOworfQorCisvKiogYXBwbHkgSERDRCBkZWNvZGluZyBwYXJhbWV0ZXJzIHRvIGEgc2VyaWVzIG9mIHNhbXBsZXMgKi8KK3N0YXRpYyBpbnQgaGRjZF9lbnZlbG9wZShpbnQzMl90ICpzYW1wbGVzLCBpbnQgY291bnQsIGludCBzdHJpZGUsIGludCB2Yml0cywgaW50IGdhaW4sIGludCB0YXJnZXRfZ2FpbiwgaW50IGV4dGVuZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IG1heF9hc2FtcGxlID0gc2l6ZW9mKHBlYWt0YWIpIC8gc2l6ZW9mKHBlYWt0YWJbMF0pIC0gMTsKKyAgICBpbnQzMl90ICpzYW1wbGVzX2VuZCA9IHNhbXBsZXMgKyBzdHJpZGUgKiBjb3VudDsKKyAgICBpbnQgaTsKKworICAgIGludCBwZV9sZXZlbCA9IFBFQUtfRVhUX0xFVkVMLCBzaGZ0ID0gMTU7CisgICAgaWYgKHZiaXRzICE9IDE2KSB7CisgICAgICAgIHBlX2xldmVsID0gKDEgPDwgKHZiaXRzIC0gMSkpIC0gKDB4ODAwMCAtIFBFQUtfRVhUX0xFVkVMKTsKKyAgICAgICAgc2hmdCA9IDMyIC0gdmJpdHMgLSAxOworICAgIH0KKyAgICBhdl9hc3NlcnQwKFBFQUtfRVhUX0xFVkVMICsgbWF4X2FzYW1wbGUgPT0gMHg4MDAwKTsKKworICAgIGlmIChleHRlbmQpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlID0gc2FtcGxlc1tpICogc3RyaWRlXTsKKyAgICAgICAgICAgIGludDMyX3QgYXNhbXBsZSA9IGFicyhzYW1wbGUpIC0gcGVfbGV2ZWw7CisgICAgICAgICAgICBpZiAoYXNhbXBsZSA+PSAwKSB7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MChhc2FtcGxlIDw9IG1heF9hc2FtcGxlKTsKKyAgICAgICAgICAgICAgICBzYW1wbGUgPSBzYW1wbGUgPj0gMCA/IHBlYWt0YWJbYXNhbXBsZV0gOiAtcGVha3RhYlthc2FtcGxlXTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHNhbXBsZSA8PD0gc2hmdDsKKworICAgICAgICAgICAgc2FtcGxlc1tpICogc3RyaWRlXSA9IHNhbXBsZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgICAgICAgICAgc2FtcGxlc1tpICogc3RyaWRlXSA8PD0gc2hmdDsKKyAgICB9CisKKyAgICBpZiAoZ2FpbiA8PSB0YXJnZXRfZ2FpbikgeworICAgICAgICBpbnQgbGVuID0gRkZNSU4oY291bnQsIHRhcmdldF9nYWluIC0gZ2Fpbik7CisgICAgICAgIC8qIGF0dGVudWF0ZSBzbG93bHkgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICArK2dhaW47CisgICAgICAgICAgICBBUFBMWV9HQUlOKCpzYW1wbGVzLCBnYWluKTsKKyAgICAgICAgICAgIHNhbXBsZXMgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgICAgIGNvdW50IC09IGxlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgbGVuID0gRkZNSU4oY291bnQsIChnYWluIC0gdGFyZ2V0X2dhaW4pID4+IDMpOworICAgICAgICAvKiBhbXBsaWZ5IHF1aWNrbHkgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBnYWluIC09IDg7CisgICAgICAgICAgICBBUFBMWV9HQUlOKCpzYW1wbGVzLCBnYWluKTsKKyAgICAgICAgICAgIHNhbXBsZXMgKz0gc3RyaWRlOworICAgICAgICB9CisgICAgICAgIGlmIChnYWluIC0gOCA8IHRhcmdldF9nYWluKQorICAgICAgICAgICAgZ2FpbiA9IHRhcmdldF9nYWluOworICAgICAgICBjb3VudCAtPSBsZW47CisgICAgfQorCisgICAgLyogaG9sZCBhIHN0ZWFkeSBsZXZlbCAqLworICAgIGlmIChnYWluID09IDApIHsKKyAgICAgICAgaWYgKGNvdW50ID4gMCkKKyAgICAgICAgICAgIHNhbXBsZXMgKz0gY291bnQgKiBzdHJpZGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKC0tY291bnQgPj0gMCkgeworICAgICAgICAgICAgQVBQTFlfR0FJTigqc2FtcGxlcywgZ2Fpbik7CisgICAgICAgICAgICBzYW1wbGVzICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2Fzc2VydDAoc2FtcGxlcyA9PSBzYW1wbGVzX2VuZCk7CisKKyAgICByZXR1cm4gZ2FpbjsKK30KKworLyoqIGV4dHJhY3QgZmllbGRzIGZyb20gY29udHJvbCBjb2RlICovCitzdGF0aWMgdm9pZCBoZGNkX2NvbnRyb2woSERDRENvbnRleHQgKmN0eCwgaGRjZF9zdGF0ZSAqc3RhdGUsIGludCAqcGVha19leHRlbmQsIGludCAqdGFyZ2V0X2dhaW4pCit7CisgICAgKnBlYWtfZXh0ZW5kID0gKGN0eC0+Zm9yY2VfcGUgfHwgc3RhdGUtPmNvbnRyb2wgJiAxNik7CisgICAgKnRhcmdldF9nYWluID0gKHN0YXRlLT5jb250cm9sICYgMTUpIDw8IDc7Cit9CisKK3R5cGVkZWYgZW51bSB7CisgICAgSERDRF9PSz0wLAorICAgIEhEQ0RfVEdfTUlTTUFUQ0gKK30gaGRjZF9jb250cm9sX3Jlc3VsdDsKKworc3RhdGljIGhkY2RfY29udHJvbF9yZXN1bHQgaGRjZF9jb250cm9sX3N0ZXJlbyhIRENEQ29udGV4dCAqY3R4LCBpbnQgKnBlYWtfZXh0ZW5kMCwgaW50ICpwZWFrX2V4dGVuZDEpCit7CisgICAgaW50IHRhcmdldF9nYWluWzJdOworICAgIGhkY2RfY29udHJvbChjdHgsICZjdHgtPnN0YXRlWzBdLCBwZWFrX2V4dGVuZDAsICZ0YXJnZXRfZ2FpblswXSk7CisgICAgaGRjZF9jb250cm9sKGN0eCwgJmN0eC0+c3RhdGVbMV0sIHBlYWtfZXh0ZW5kMSwgJnRhcmdldF9nYWluWzFdKTsKKyAgICBpZiAodGFyZ2V0X2dhaW5bMF0gPT0gdGFyZ2V0X2dhaW5bMV0pCisgICAgICAgIGN0eC0+dmFsX3RhcmdldF9nYWluID0gdGFyZ2V0X2dhaW5bMF07CisgICAgZWxzZSB7CisgICAgICAgIGF2X2xvZyhjdHgtPmZjdHgsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAiaGRjZCBlcnJvcjogVW5tYXRjaGVkIHRhcmdldF9nYWluIG5lYXIgJWQ6IHRnMDogJTAuMWYsIHRnMTogJTAuMWYsIGx2ZzogJTAuMWZcbiIsCisgICAgICAgICAgIGN0eC0+c2FtcGxlX2NvdW50LAorICAgICAgICAgICBHQUlOVE9GTE9BVCh0YXJnZXRfZ2FpblswXSA+PjcpLAorICAgICAgICAgICBHQUlOVE9GTE9BVCh0YXJnZXRfZ2FpblsxXSA+PjcpLAorICAgICAgICAgICBHQUlOVE9GTE9BVChjdHgtPnZhbF90YXJnZXRfZ2FpbiA+PjcpICk7CisgICAgICAgICAgIHJldHVybiBIRENEX1RHX01JU01BVENIOworICAgIH0KKyAgICByZXR1cm4gSERDRF9PSzsKK30KKworc3RhdGljIHZvaWQgaGRjZF9wcm9jZXNzKEhEQ0RDb250ZXh0ICpjdHgsIGhkY2Rfc3RhdGUgKnN0YXRlLCBpbnQzMl90ICpzYW1wbGVzLCBpbnQgY291bnQsIGludCBzdHJpZGUpCit7CisgICAgaW50MzJfdCAqc2FtcGxlc19lbmQgPSBzYW1wbGVzICsgY291bnQgKiBzdHJpZGU7CisgICAgaW50IGdhaW4gPSBzdGF0ZS0+cnVubmluZ19nYWluOworICAgIGludCBwZWFrX2V4dGVuZCwgdGFyZ2V0X2dhaW47CisgICAgaW50IGxlYWQgPSAwOworCisgICAgaWYgKGN0eC0+YW5hbHl6ZV9tb2RlKQorICAgICAgICBoZGNkX2FuYWx5emVfcHJlcGFyZShzdGF0ZSwgc2FtcGxlcywgY291bnQsIHN0cmlkZSk7CisKKyAgICBoZGNkX2NvbnRyb2woY3R4LCBzdGF0ZSwgJnBlYWtfZXh0ZW5kLCAmdGFyZ2V0X2dhaW4pOworICAgIHdoaWxlIChjb3VudCA+IGxlYWQpIHsKKyAgICAgICAgaW50IGVudmVsb3BlX3J1bjsKKyAgICAgICAgaW50IHJ1bjsKKworICAgICAgICBhdl9hc3NlcnQwKHNhbXBsZXMgKyBsZWFkICogc3RyaWRlICsgc3RyaWRlICogKGNvdW50IC0gbGVhZCkgPD0gc2FtcGxlc19lbmQpOworICAgICAgICBydW4gPSBoZGNkX3NjYW4oY3R4LCBzdGF0ZSwgMSwgc2FtcGxlcyArIGxlYWQgKiBzdHJpZGUsIGNvdW50IC0gbGVhZCwgMCkgKyBsZWFkOworICAgICAgICBlbnZlbG9wZV9ydW4gPSBydW4gLSAxOworCisgICAgICAgIGF2X2Fzc2VydDAoc2FtcGxlcyArIGVudmVsb3BlX3J1biAqIHN0cmlkZSA8PSBzYW1wbGVzX2VuZCk7CisgICAgICAgIGlmIChjdHgtPmFuYWx5emVfbW9kZSkKKyAgICAgICAgICAgIGdhaW4gPSBoZGNkX2FuYWx5emUoc2FtcGxlcywgZW52ZWxvcGVfcnVuLCBzdHJpZGUsIGdhaW4sIHRhcmdldF9nYWluLCBwZWFrX2V4dGVuZCwgY3R4LT5hbmFseXplX21vZGUsIHN0YXRlLT5zdXN0YWluLCAtMSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGdhaW4gPSBoZGNkX2VudmVsb3BlKHNhbXBsZXMsIGVudmVsb3BlX3J1biwgc3RyaWRlLCBjdHgtPmJpdHNfcGVyX3NhbXBsZSwgZ2FpbiwgdGFyZ2V0X2dhaW4sIHBlYWtfZXh0ZW5kKTsKKworICAgICAgICBzYW1wbGVzICs9IGVudmVsb3BlX3J1biAqIHN0cmlkZTsKKyAgICAgICAgY291bnQgLT0gZW52ZWxvcGVfcnVuOworICAgICAgICBsZWFkID0gcnVuIC0gZW52ZWxvcGVfcnVuOworICAgICAgICBoZGNkX2NvbnRyb2woY3R4LCBzdGF0ZSwgJnBlYWtfZXh0ZW5kLCAmdGFyZ2V0X2dhaW4pOworICAgIH0KKyAgICBpZiAobGVhZCA+IDApIHsKKyAgICAgICAgYXZfYXNzZXJ0MChzYW1wbGVzICsgbGVhZCAqIHN0cmlkZSA8PSBzYW1wbGVzX2VuZCk7CisgICAgICAgIGlmIChjdHgtPmFuYWx5emVfbW9kZSkKKyAgICAgICAgICAgIGdhaW4gPSBoZGNkX2FuYWx5emUoc2FtcGxlcywgbGVhZCwgc3RyaWRlLCBnYWluLCB0YXJnZXRfZ2FpbiwgcGVha19leHRlbmQsIGN0eC0+YW5hbHl6ZV9tb2RlLCBzdGF0ZS0+c3VzdGFpbiwgLTEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBnYWluID0gaGRjZF9lbnZlbG9wZShzYW1wbGVzLCBsZWFkLCBzdHJpZGUsIGN0eC0+Yml0c19wZXJfc2FtcGxlLCBnYWluLCB0YXJnZXRfZ2FpbiwgcGVha19leHRlbmQpOworICAgIH0KKworICAgIHN0YXRlLT5ydW5uaW5nX2dhaW4gPSBnYWluOworfQorCitzdGF0aWMgdm9pZCBoZGNkX3Byb2Nlc3Nfc3RlcmVvKEhEQ0RDb250ZXh0ICpjdHgsIGludDMyX3QgKnNhbXBsZXMsIGludCBjb3VudCkKK3sKKyAgICBjb25zdCBpbnQgc3RyaWRlID0gMjsKKyAgICBpbnQzMl90ICpzYW1wbGVzX2VuZCA9IHNhbXBsZXMgKyBjb3VudCAqIHN0cmlkZTsKKyAgICBpbnQgZ2FpblsyXSA9IHtjdHgtPnN0YXRlWzBdLnJ1bm5pbmdfZ2FpbiwgY3R4LT5zdGF0ZVsxXS5ydW5uaW5nX2dhaW59OworICAgIGludCBwZWFrX2V4dGVuZFsyXTsKKyAgICBpbnQgbGVhZCA9IDA7CisgICAgaW50IGN0bHJldDsKKworICAgIGlmIChjdHgtPmFuYWx5emVfbW9kZSkgeworICAgICAgICBoZGNkX2FuYWx5emVfcHJlcGFyZSgmY3R4LT5zdGF0ZVswXSwgc2FtcGxlcywgY291bnQsIHN0cmlkZSk7CisgICAgICAgIGhkY2RfYW5hbHl6ZV9wcmVwYXJlKCZjdHgtPnN0YXRlWzFdLCBzYW1wbGVzICsgMSwgY291bnQsIHN0cmlkZSk7CisgICAgfQorCisgICAgY3RscmV0ID0gaGRjZF9jb250cm9sX3N0ZXJlbyhjdHgsICZwZWFrX2V4dGVuZFswXSwgJnBlYWtfZXh0ZW5kWzFdKTsKKyAgICB3aGlsZSAoY291bnQgPiBsZWFkKSB7CisgICAgICAgIGludCBlbnZlbG9wZV9ydW4sIHJ1bjsKKworICAgICAgICBhdl9hc3NlcnQwKHNhbXBsZXMgKyBsZWFkICogc3RyaWRlICsgc3RyaWRlICogKGNvdW50IC0gbGVhZCkgPD0gc2FtcGxlc19lbmQpOworICAgICAgICBydW4gPSBoZGNkX3NjYW4oY3R4LCBjdHgtPnN0YXRlLCAyLCBzYW1wbGVzICsgbGVhZCAqIHN0cmlkZSwgY291bnQgLSBsZWFkLCAwKSArIGxlYWQ7CisgICAgICAgIGVudmVsb3BlX3J1biA9IHJ1biAtIDE7CisKKyAgICAgICAgYXZfYXNzZXJ0MChzYW1wbGVzICsgZW52ZWxvcGVfcnVuICogc3RyaWRlIDw9IHNhbXBsZXNfZW5kKTsKKworICAgICAgICBpZiAoY3R4LT5hbmFseXplX21vZGUpIHsKKyAgICAgICAgICAgIGdhaW5bMF0gPSBoZGNkX2FuYWx5emUoc2FtcGxlcywgZW52ZWxvcGVfcnVuLCBzdHJpZGUsIGdhaW5bMF0sIGN0eC0+dmFsX3RhcmdldF9nYWluLCBwZWFrX2V4dGVuZFswXSwKKyAgICAgICAgICAgICAgICBjdHgtPmFuYWx5emVfbW9kZSwKKyAgICAgICAgICAgICAgICBjdHgtPnN0YXRlWzBdLnN1c3RhaW4sCisgICAgICAgICAgICAgICAgKGN0bHJldCA9PSBIRENEX1RHX01JU01BVENIKSApOworICAgICAgICAgICAgZ2FpblsxXSA9IGhkY2RfYW5hbHl6ZShzYW1wbGVzICsgMSwgZW52ZWxvcGVfcnVuLCBzdHJpZGUsIGdhaW5bMV0sIGN0eC0+dmFsX3RhcmdldF9nYWluLCBwZWFrX2V4dGVuZFsxXSwKKyAgICAgICAgICAgICAgICBjdHgtPmFuYWx5emVfbW9kZSwKKyAgICAgICAgICAgICAgICBjdHgtPnN0YXRlWzFdLnN1c3RhaW4sCisgICAgICAgICAgICAgICAgKGN0bHJldCA9PSBIRENEX1RHX01JU01BVENIKSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2FpblswXSA9IGhkY2RfZW52ZWxvcGUoc2FtcGxlcywgZW52ZWxvcGVfcnVuLCBzdHJpZGUsIGN0eC0+Yml0c19wZXJfc2FtcGxlLCBnYWluWzBdLCBjdHgtPnZhbF90YXJnZXRfZ2FpbiwgcGVha19leHRlbmRbMF0pOworICAgICAgICAgICAgZ2FpblsxXSA9IGhkY2RfZW52ZWxvcGUoc2FtcGxlcyArIDEsIGVudmVsb3BlX3J1biwgc3RyaWRlLCBjdHgtPmJpdHNfcGVyX3NhbXBsZSwgZ2FpblsxXSwgY3R4LT52YWxfdGFyZ2V0X2dhaW4sIHBlYWtfZXh0ZW5kWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHNhbXBsZXMgKz0gZW52ZWxvcGVfcnVuICogc3RyaWRlOworICAgICAgICBjb3VudCAtPSBlbnZlbG9wZV9ydW47CisgICAgICAgIGxlYWQgPSBydW4gLSBlbnZlbG9wZV9ydW47CisKKyAgICAgICAgY3RscmV0ID0gaGRjZF9jb250cm9sX3N0ZXJlbyhjdHgsICZwZWFrX2V4dGVuZFswXSwgJnBlYWtfZXh0ZW5kWzFdKTsKKyAgICB9CisgICAgaWYgKGxlYWQgPiAwKSB7CisgICAgICAgIGF2X2Fzc2VydDAoc2FtcGxlcyArIGxlYWQgKiBzdHJpZGUgPD0gc2FtcGxlc19lbmQpOworICAgICAgICBpZiAoY3R4LT5hbmFseXplX21vZGUpIHsKKyAgICAgICAgICAgIGdhaW5bMF0gPSBoZGNkX2FuYWx5emUoc2FtcGxlcywgbGVhZCwgc3RyaWRlLCBnYWluWzBdLCBjdHgtPnZhbF90YXJnZXRfZ2FpbiwgcGVha19leHRlbmRbMF0sCisgICAgICAgICAgICAgICAgY3R4LT5hbmFseXplX21vZGUsCisgICAgICAgICAgICAgICAgY3R4LT5zdGF0ZVswXS5zdXN0YWluLAorICAgICAgICAgICAgICAgIChjdGxyZXQgPT0gSERDRF9UR19NSVNNQVRDSCkgKTsKKyAgICAgICAgICAgIGdhaW5bMV0gPSBoZGNkX2FuYWx5emUoc2FtcGxlcyArIDEsIGxlYWQsIHN0cmlkZSwgZ2FpblsxXSwgY3R4LT52YWxfdGFyZ2V0X2dhaW4sIHBlYWtfZXh0ZW5kWzFdLAorICAgICAgICAgICAgICAgIGN0eC0+YW5hbHl6ZV9tb2RlLAorICAgICAgICAgICAgICAgIGN0eC0+c3RhdGVbMV0uc3VzdGFpbiwKKyAgICAgICAgICAgICAgICAoY3RscmV0ID09IEhEQ0RfVEdfTUlTTUFUQ0gpICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnYWluWzBdID0gaGRjZF9lbnZlbG9wZShzYW1wbGVzLCBsZWFkLCBzdHJpZGUsIGN0eC0+Yml0c19wZXJfc2FtcGxlLCBnYWluWzBdLCBjdHgtPnZhbF90YXJnZXRfZ2FpbiwgcGVha19leHRlbmRbMF0pOworICAgICAgICAgICAgZ2FpblsxXSA9IGhkY2RfZW52ZWxvcGUoc2FtcGxlcyArIDEsIGxlYWQsIHN0cmlkZSwgY3R4LT5iaXRzX3Blcl9zYW1wbGUsIGdhaW5bMV0sIGN0eC0+dmFsX3RhcmdldF9nYWluLCBwZWFrX2V4dGVuZFsxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdHgtPnN0YXRlWzBdLnJ1bm5pbmdfZ2FpbiA9IGdhaW5bMF07CisgICAgY3R4LT5zdGF0ZVsxXS5ydW5uaW5nX2dhaW4gPSBnYWluWzFdOworfQorCitzdGF0aWMgdm9pZCBoZGNkX2RldGVjdF9yZXNldChoZGNkX2RldGVjdGlvbl9kYXRhICpkZXRlY3QpIHsKKyAgICBkZXRlY3QtPmhkY2RfZGV0ZWN0ZWQgPSBIRENEX05PTkU7CisgICAgZGV0ZWN0LT5wYWNrZXRfdHlwZSA9IEhEQ0RfUFZFUl9OT05FOworICAgIGRldGVjdC0+dG90YWxfcGFja2V0cyA9IDA7CisgICAgZGV0ZWN0LT5lcnJvcnMgPSAwOworICAgIGRldGVjdC0+cGVha19leHRlbmQgPSBIRENEX1BFX05FVkVSOworICAgIGRldGVjdC0+dXNlc190cmFuc2llbnRfZmlsdGVyID0gMDsKKyAgICBkZXRlY3QtPm1heF9nYWluX2FkanVzdG1lbnQgPSAwLjA7CisgICAgZGV0ZWN0LT5jZHRfZXhwaXJhdGlvbnMgPSAtMTsKKyAgICBkZXRlY3QtPl9hY3RpdmVfY291bnQgPSAwOworfQorCitzdGF0aWMgdm9pZCBoZGNkX2RldGVjdF9zdGFydChoZGNkX2RldGVjdGlvbl9kYXRhICpkZXRlY3QpIHsKKyAgICBkZXRlY3QtPmVycm9ycyA9IDA7ICAgICAgICAgIC8qIHJlLXN1bSBldmVyeSBwYXNzICovCisgICAgZGV0ZWN0LT50b3RhbF9wYWNrZXRzID0gMDsKKyAgICBkZXRlY3QtPl9hY3RpdmVfY291bnQgPSAwOyAgIC8qIHdpbGwgbmVlZCB0byBtYXRjaCBjaGFubmVscyBhdCBoZGNkX2RldGVjdF9lbmQoKSAqLworICAgIGRldGVjdC0+Y2R0X2V4cGlyYXRpb25zID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGhkY2RfZGV0ZWN0X29uZWNoKGhkY2Rfc3RhdGUgKnN0YXRlLCBoZGNkX2RldGVjdGlvbl9kYXRhICpkZXRlY3QpIHsKKyAgICBoZGNkX3BlIHBlID0gSERDRF9QRV9ORVZFUjsKKyAgICBkZXRlY3QtPnVzZXNfdHJhbnNpZW50X2ZpbHRlciB8PSAhIShzdGF0ZS0+Y291bnRfdHJhbnNpZW50X2ZpbHRlcik7CisgICAgZGV0ZWN0LT50b3RhbF9wYWNrZXRzICs9IHN0YXRlLT5jb2RlX2NvdW50ZXJBICsgc3RhdGUtPmNvZGVfY291bnRlckI7CisgICAgaWYgKHN0YXRlLT5jb2RlX2NvdW50ZXJBKSBkZXRlY3QtPnBhY2tldF90eXBlIHw9IEhEQ0RfUFZFUl9BOworICAgIGlmIChzdGF0ZS0+Y29kZV9jb3VudGVyQikgZGV0ZWN0LT5wYWNrZXRfdHlwZSB8PSBIRENEX1BWRVJfQjsKKyAgICBpZiAoc3RhdGUtPmNvdW50X3BlYWtfZXh0ZW5kKSB7CisgICAgICAgIC8qIGlmIGV2ZXJ5IHZhbGlkIHBhY2tldCBoYXMgdXNlZCBQRSwgY2FsbCBpdCBwZXJtYW5lbnQgKi8KKyAgICAgICAgaWYgKHN0YXRlLT5jb3VudF9wZWFrX2V4dGVuZCA9PSBzdGF0ZS0+Y29kZV9jb3VudGVyQSArIHN0YXRlLT5jb2RlX2NvdW50ZXJCKQorICAgICAgICAgICAgcGUgPSBIRENEX1BFX1BFUk1BTkVOVDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGUgPSBIRENEX1BFX0lOVEVSTUlUVEVOVDsKKyAgICAgICAgaWYgKGRldGVjdC0+cGVha19leHRlbmQgIT0gSERDRF9QRV9JTlRFUk1JVFRFTlQpCisgICAgICAgICAgICBkZXRlY3QtPnBlYWtfZXh0ZW5kID0gcGU7CisgICAgfQorICAgIGRldGVjdC0+bWF4X2dhaW5fYWRqdXN0bWVudCA9IEZGTUlOKGRldGVjdC0+bWF4X2dhaW5fYWRqdXN0bWVudCwgR0FJTlRPRkxPQVQoc3RhdGUtPm1heF9nYWluKSk7CisgICAgZGV0ZWN0LT5lcnJvcnMgKz0gc3RhdGUtPmNvZGVfY291bnRlckFfYWxtb3N0CisgICAgICAgICsgc3RhdGUtPmNvZGVfY291bnRlckJfY2hlY2tmYWlscworICAgICAgICArIHN0YXRlLT5jb2RlX2NvdW50ZXJDX3VubWF0Y2hlZDsKKyAgICBpZiAoc3RhdGUtPnN1c3RhaW4pIGRldGVjdC0+X2FjdGl2ZV9jb3VudCsrOworICAgIGlmIChzdGF0ZS0+Y291bnRfc3VzdGFpbl9leHBpcmVkID49IDApIHsKKyAgICAgICAgaWYgKGRldGVjdC0+Y2R0X2V4cGlyYXRpb25zID09IC0xKSBkZXRlY3QtPmNkdF9leHBpcmF0aW9ucyA9IDA7CisgICAgICAgIGRldGVjdC0+Y2R0X2V4cGlyYXRpb25zICs9IHN0YXRlLT5jb3VudF9zdXN0YWluX2V4cGlyZWQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoZGNkX2RldGVjdF9lbmQoaGRjZF9kZXRlY3Rpb25fZGF0YSAqZGV0ZWN0LCBpbnQgY2hhbm5lbHMpIHsKKyAgICAvKiBIRENEIGlzIGRldGVjdGVkIGlmIGEgdmFsaWQgcGFja2V0IGlzIGFjdGl2ZSBpbiBhbGwKKyAgICAgKiBjaGFubmVscyBhdCB0aGUgc2FtZSB0aW1lLiAqLworICAgIGlmIChkZXRlY3QtPl9hY3RpdmVfY291bnQgPT0gY2hhbm5lbHMpIHsKKyAgICAgICAgaWYgKGRldGVjdC0+bWF4X2dhaW5fYWRqdXN0bWVudCB8fCBkZXRlY3QtPnBlYWtfZXh0ZW5kKQorICAgICAgICAgICAgZGV0ZWN0LT5oZGNkX2RldGVjdGVkID0gSERDRF9FRkZFQ1RVQUw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRldGVjdC0+aGRjZF9kZXRlY3RlZCA9IEhEQ0RfTk9fRUZGRUNUOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgSERDRENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBjb25zdCBpbnQxNl90ICppbl9kYXRhOworICAgIGNvbnN0IGludDMyX3QgKmluX2RhdGEzMjsKKyAgICBpbnQzMl90ICpvdXRfZGF0YTsKKyAgICBpbnQgbiwgYywgcmVzdWx0OworICAgIGludCBhID0gMzIgLSBzLT5iaXRzX3Blcl9zYW1wbGU7CisKKyAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJlc3VsdCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgaWYgKHJlc3VsdCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIG91dC0+Zm9ybWF0ID0gb3V0bGluay0+Zm9ybWF0OyAvLyBpcyB0aGlzIG5lZWRlZD8KKworICAgIG91dF9kYXRhID0gKGludDMyX3QqKW91dC0+ZGF0YVswXTsKKyAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgorICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGluLT5uYl9zYW1wbGVzOyBuKyspCisgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGluLT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICAgICAgICAgIGluX2RhdGEgPSAoaW50MTZfdCopaW4tPmV4dGVuZGVkX2RhdGFbY107CisgICAgICAgICAgICAgICAgICAgIG91dF9kYXRhWyhuICogaW4tPmNoYW5uZWxzKSArIGNdID0gaW5fZGF0YVtuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNjoKKyAgICAgICAgICAgIGluX2RhdGEgID0gKGludDE2X3QqKWluLT5kYXRhWzBdOworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IGluLT5uYl9zYW1wbGVzICogaW4tPmNoYW5uZWxzOyBuKyspCisgICAgICAgICAgICAgICAgb3V0X2RhdGFbbl0gPSBpbl9kYXRhW25dOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlA6CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaW4tPm5iX3NhbXBsZXM7IG4rKykKKyAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgaW4tPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW5fZGF0YTMyID0gKGludDMyX3QqKWluLT5leHRlbmRlZF9kYXRhW2NdOworICAgICAgICAgICAgICAgICAgICBvdXRfZGF0YVsobiAqIGluLT5jaGFubmVscykgKyBjXSA9IGluX2RhdGEzMltuXSA+PiBhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOgorICAgICAgICAgICAgaW5fZGF0YTMyICA9IChpbnQzMl90Kilpbi0+ZGF0YVswXTsKKyAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBpbi0+bmJfc2FtcGxlcyAqIGluLT5jaGFubmVsczsgbisrKQorICAgICAgICAgICAgICAgIG91dF9kYXRhW25dID0gaW5fZGF0YTMyW25dID4+IGE7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocy0+cHJvY2Vzc19zdGVyZW8pIHsKKyAgICAgICAgaGRjZF9kZXRlY3Rfc3RhcnQoJnMtPmRldGVjdCk7CisgICAgICAgIGhkY2RfcHJvY2Vzc19zdGVyZW8ocywgb3V0X2RhdGEsIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgaGRjZF9kZXRlY3Rfb25lY2goJnMtPnN0YXRlWzBdLCAmcy0+ZGV0ZWN0KTsKKyAgICAgICAgaGRjZF9kZXRlY3Rfb25lY2goJnMtPnN0YXRlWzFdLCAmcy0+ZGV0ZWN0KTsKKyAgICAgICAgaGRjZF9kZXRlY3RfZW5kKCZzLT5kZXRlY3QsIDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGhkY2RfZGV0ZWN0X3N0YXJ0KCZzLT5kZXRlY3QpOworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgaW4tPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGhkY2RfcHJvY2VzcyhzLCAmcy0+c3RhdGVbY10sIG91dF9kYXRhICsgYywgaW4tPm5iX3NhbXBsZXMsIGluLT5jaGFubmVscyk7CisgICAgICAgICAgICBoZGNkX2RldGVjdF9vbmVjaCgmcy0+c3RhdGVbY10sICZzLT5kZXRlY3QpOworICAgICAgICB9CisgICAgICAgIGhkY2RfZGV0ZWN0X2VuZCgmcy0+ZGV0ZWN0LCBpbi0+Y2hhbm5lbHMpOworICAgIH0KKworICAgIHMtPnNhbXBsZV9jb3VudCArPSBpbi0+bmJfc2FtcGxlcyAqIGluLT5jaGFubmVsczsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IHNhbXBsZV9yYXRlc1tdID0geworICAgICAgICA0NDEwMCwgNDgwMDAsCisgICAgICAgIDg4MjAwLCA5NjAwMCwKKyAgICAgICAgMTc2NDAwLCAxOTIwMDAsCisgICAgICAgIC0xCisgICAgfTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmluX2Zvcm1hdHM7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpvdXRfZm9ybWF0czsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzID0gTlVMTDsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayAgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10c19pbltdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMiwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzX291dFtdID0geworICAgICAgICBBVl9TQU1QTEVfRk1UX1MzMiwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfYWRkX2NoYW5uZWxfbGF5b3V0KCZsYXlvdXRzLCBBVl9DSF9MQVlPVVRfTU9OTyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gZmZfYWRkX2NoYW5uZWxfbGF5b3V0KCZsYXlvdXRzLCBBVl9DSF9MQVlPVVRfU1RFUkVPKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpbl9mb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10c19pbik7CisgICAgcmV0ID0gZmZfZm9ybWF0c19yZWYoaW5fZm9ybWF0cywgJmlubGluay0+b3V0X2Zvcm1hdHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgb3V0X2Zvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzX291dCk7CisgICAgcmV0ID0gZmZfZm9ybWF0c19yZWYob3V0X2Zvcm1hdHMsICZvdXRsaW5rLT5pbl9mb3JtYXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybgorICAgICAgICBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfcmF0ZXMpICk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEhEQ0RDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpLCBqOworCisgICAgLyogZHVtcCB0aGUgc3RhdGUgZm9yIGVhY2ggY2hhbm5lbCBmb3IgQVZfTE9HX1ZFUkJPU0UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgSERDRF9NQVhfQ0hBTk5FTFM7IGkrKykgeworICAgICAgICBoZGNkX3N0YXRlICpzdGF0ZSA9ICZzLT5zdGF0ZVtpXTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJDaGFubmVsICVkOiBjb3VudGVyIEE6ICVkLCBCOiAlZCwgQzogJWRcbiIsIGksCisgICAgICAgICAgICAgICAgc3RhdGUtPmNvZGVfY291bnRlckEsIHN0YXRlLT5jb2RlX2NvdW50ZXJCLCBzdGF0ZS0+Y29kZV9jb3VudGVyQyk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ2hhbm5lbCAlZDogcGU6ICVkLCB0ZjogJWQsIGFsbW9zdF9BOiAlZCwgY2hlY2tmYWlsX0I6ICVkLCB1bm1hdGNoZWRfQzogJWQsIGNkdF9leHBpcmVkOiAlZFxuIiwgaSwKKyAgICAgICAgICAgIHN0YXRlLT5jb3VudF9wZWFrX2V4dGVuZCwKKyAgICAgICAgICAgIHN0YXRlLT5jb3VudF90cmFuc2llbnRfZmlsdGVyLAorICAgICAgICAgICAgc3RhdGUtPmNvZGVfY291bnRlckFfYWxtb3N0LAorICAgICAgICAgICAgc3RhdGUtPmNvZGVfY291bnRlckJfY2hlY2tmYWlscywKKyAgICAgICAgICAgIHN0YXRlLT5jb2RlX2NvdW50ZXJDX3VubWF0Y2hlZCwKKyAgICAgICAgICAgIHN0YXRlLT5jb3VudF9zdXN0YWluX2V4cGlyZWQpOworICAgICAgICBmb3IgKGogPSAwOyBqIDw9IHN0YXRlLT5tYXhfZ2FpbjsgaisrKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNoYW5uZWwgJWQ6IHRnICUwLjFmOiAlZFxuIiwgaSwgR0FJTlRPRkxPQVQoaiksIHN0YXRlLT5nYWluX2NvdW50c1tqXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJQYWNrZXRzOiB0eXBlOiAlcywgdG90YWw6ICVkXG4iLAorICAgICAgICBwZl9zdHJbcy0+ZGV0ZWN0LnBhY2tldF90eXBlXSwKKyAgICAgICAgcy0+ZGV0ZWN0LnRvdGFsX3BhY2tldHMpOworCisgICAgLyogbG9nIHRoZSBIRENEIGRlY29kZSBpbmZvcm1hdGlvbiAqLworICAgIGlmIChzLT5kZXRlY3QuaGRjZF9kZXRlY3RlZCkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAiSERDRCBkZXRlY3RlZDogeWVzLCBwZWFrX2V4dGVuZDogJXMsIG1heF9nYWluX2FkajogJTAuMWYgZEIsIHRyYW5zaWVudF9maWx0ZXI6ICVzLCBkZXRlY3RhYmxlIGVycm9yczogJWQlcyVzXG4iLAorICAgICAgICAgICAgcGVfc3RyW3MtPmRldGVjdC5wZWFrX2V4dGVuZF0sCisgICAgICAgICAgICBzLT5kZXRlY3QubWF4X2dhaW5fYWRqdXN0bWVudCwKKyAgICAgICAgICAgIChzLT5kZXRlY3QudXNlc190cmFuc2llbnRfZmlsdGVyKSA/ICJkZXRlY3RlZCIgOiAibm90IGRldGVjdGVkIiwKKyAgICAgICAgICAgIHMtPmRldGVjdC5lcnJvcnMsIChzLT5kZXRlY3QuZXJyb3JzKSA/ICIgKHRyeSAtdiB2ZXJib3NlKSIgOiAiIiwKKyAgICAgICAgICAgIChzLT5iYWRfY29uZmlnKSA/ICIgKGJhZF9jb25maWcpIiA6ICIiCisgICAgICAgICAgICApOworICAgIGVsc2UKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJIRENEIGRldGVjdGVkOiBubyVzXG4iLAorICAgICAgICAgICAgKHMtPmJhZF9jb25maWcpID8gIiAoYmFkX2NvbmZpZykiIDogIiIKKyAgICAgICAgICAgICk7Cit9CisKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSERDRENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5zYW1wbGVfY291bnQgPSAwOworICAgIHMtPmZjdHggPSBjdHg7CisgICAgcy0+YmFkX2NvbmZpZyA9IDA7CisKKyAgICBpZiAocy0+ZGlzYWJsZV9hdXRvY29udmVydCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkRpc2FibGluZyBhdXRvbWF0aWMgZm9ybWF0IGNvbnZlcnNpb24uXG4iKTsKKyAgICAgICAgYXZmaWx0ZXJfZ3JhcGhfc2V0X2F1dG9fY29udmVydChjdHgtPmdyYXBoLCBBVkZJTFRFUl9BVVRPX0NPTlZFUlRfTk9ORSk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykgeworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgSERDRENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGM7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkF1dG8tY29udmVydDogJXNcbiIsCisgICAgICAgIChjdHgtPmdyYXBoLT5kaXNhYmxlX2F1dG9fY29udmVydCkgPyAiZGlzYWJsZWQiIDogImVuYWJsZWQiKTsKKworICAgIGlmICgoaW5saW5rLT5mb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMTYgfHwKKyAgICAgICAgIGlubGluay0+Zm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfUzE2UCkgJiYKKyAgICAgICAgIHMtPmJpdHNfcGVyX3NhbXBsZSAhPSAxNikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJiaXRzX3Blcl9zYW1wbGUgJWQgZG9lcyBub3QgZml0IGludG8gc2FtcGxlIGZvcm1hdCAlcywgZmFsbGluZyBiYWNrIHRvIDE2XG4iLAorICAgICAgICAgICAgICAgIHMtPmJpdHNfcGVyX3NhbXBsZSwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShpbmxpbmstPmZvcm1hdCkgKTsKKyAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlID0gMTY7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJMb29raW5nIGZvciAlZC1iaXQgSERDRCBpbiBzYW1wbGUgZm9ybWF0ICVzXG4iLAorICAgICAgICAgICAgcy0+Yml0c19wZXJfc2FtcGxlLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGlubGluay0+Zm9ybWF0KSApOworICAgIH0KKworICAgIGlmIChzLT5iaXRzX3Blcl9zYW1wbGUgIT0gMTYpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiMjAgYW5kIDI0LWJpdCBIRENEIGRlY29kaW5nIGlzIGV4cGVyaW1lbnRhbFxuIik7CisgICAgaWYgKGlubGluay0+c2FtcGxlX3JhdGUgIT0gNDQxMDApCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiSERDRCBkZWNvZGluZyBmb3Igc2FtcGxlIHJhdGVzIG90aGVyIHRoYW4gNDQxMDAgaXMgZXhwZXJpbWVudGFsXG4iKTsKKworICAgIGhkY2RfZGV0ZWN0X3Jlc2V0KCZzLT5kZXRlY3QpOworICAgIGZvciAoYyA9IDA7IGMgPCBIRENEX01BWF9DSEFOTkVMUzsgYysrKSB7CisgICAgICAgIGhkY2RfcmVzZXQoJnMtPnN0YXRlW2NdLCBpbmxpbmstPnNhbXBsZV9yYXRlLCBzLT5jZHRfbXMpOworICAgIH0KKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNEVCBwZXJpb2Q6ICVkbXMgKCV1IHNhbXBsZXMgQDQ0MTAwSHopXG4iLAorICAgICAgICBzLT5jZHRfbXMsIHMtPnN0YXRlWzBdLnN1c3RhaW5fcmVzZXQgKTsKKworICAgIGlmIChpbmxpbmstPmNoYW5uZWxzICE9IDIgJiYgcy0+cHJvY2Vzc19zdGVyZW8pIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJwcm9jZXNzX3N0ZXJlbyBkaXNhYmxlZCAoY2hhbm5lbHMgPSAlZClcbiIsIGlubGluay0+Y2hhbm5lbHMpOworICAgICAgICBzLT5wcm9jZXNzX3N0ZXJlbyA9IDA7CisgICAgfQorICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiUHJvY2VzcyBtb2RlOiAlc1xuIiwKKyAgICAgICAgKHMtPnByb2Nlc3Nfc3RlcmVvKSA/ICJwcm9jZXNzIHN0ZXJlbyBjaGFubmVscyB0b2dldGhlciIgOiAicHJvY2VzcyBlYWNoIGNoYW5uZWwgc2VwYXJhdGVseSIpOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJGb3JjZSBQRTogJXNcbiIsCisgICAgICAgIChzLT5mb3JjZV9wZSkgPyAib24iIDogIm9mZiIpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiQW5hbHl6ZSBtb2RlOiBbJWRdICVzXG4iLAorICAgICAgICBzLT5hbmFseXplX21vZGUsIGFuYV9tb2RlX3N0cltzLT5hbmFseXplX21vZGVdICk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2hkY2RfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl9hZl9oZGNkX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9oZGNkID0geworICAgIC5uYW1lICAgICAgICAgID0gImhkY2QiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IEhpZ2ggRGVmaW5pdGlvbiBDb21wYXRpYmxlIERpZ2l0YWwgKEhEQ0QpIGRlY29kaW5nLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEhEQ0RDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZoZGNkX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl9hZl9oZGNkX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX2FmX2hkY2Rfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9oZWFkcGhvbmUuYyBiL2xpYmF2ZmlsdGVyL2FmX2hlYWRwaG9uZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTAxMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9hZl9oZWFkcGhvbmUuYwpAQCAtMCwwICsxLDkxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBQYXVsIEIgTWFob2wKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE1IEFuZHJlYXMgRnVjaHMsIFdvbGZnYW5nIEhyYXVkYQorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXVkaW9fZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mbG9hdF9kc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50bWF0aC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2ZmZ0LmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKworI2RlZmluZSBUSU1FX0RPTUFJTiAgICAgIDAKKyNkZWZpbmUgRlJFUVVFTkNZX0RPTUFJTiAxCisKKyNkZWZpbmUgSFJJUl9TVEVSRU8gMAorI2RlZmluZSBIUklSX01VTFRJICAxCisKK3R5cGVkZWYgc3RydWN0IEhlYWRwaG9uZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgY2hhciAqbWFwOworICAgIGludCB0eXBlOworCisgICAgaW50IGxmZV9jaGFubmVsOworCisgICAgaW50IGhhdmVfaHJpcnM7CisgICAgaW50IGVvZl9ocmlyczsKKyAgICBpbnQ2NF90IHB0czsKKworICAgIGludCBpcl9sZW47CisKKyAgICBpbnQgbWFwcGluZ1s2NF07CisKKyAgICBpbnQgbmJfaW5wdXRzOworCisgICAgaW50IG5iX2lyczsKKworICAgIGZsb2F0IGdhaW47CisgICAgZmxvYXQgbGZlX2dhaW4sIGdhaW5fbGZlOworCisgICAgZmxvYXQgKnJpbmdidWZmZXJbMl07CisgICAgaW50IHdyaXRlWzJdOworCisgICAgaW50IGJ1ZmZlcl9sZW5ndGg7CisgICAgaW50IG5fZmZ0OworICAgIGludCBzaXplOworICAgIGludCBocmlyX2ZtdDsKKworICAgIGludCAqZGVsYXlbMl07CisgICAgZmxvYXQgKmRhdGFfaXJbMl07CisgICAgZmxvYXQgKnRlbXBfc3JjWzJdOworICAgIEZGVENvbXBsZXggKnRlbXBfZmZ0WzJdOworCisgICAgRkZUQ29udGV4dCAqZmZ0WzJdLCAqaWZmdFsyXTsKKyAgICBGRlRDb21wbGV4ICpkYXRhX2hydGZbMl07CisKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcDsKKyAgICBzdHJ1Y3QgaGVhZHBob25lX2lucHV0cyB7CisgICAgICAgIEFWQXVkaW9GaWZvICpmaWZvOworICAgICAgICBBVkZyYW1lICAgICAqZnJhbWU7CisgICAgICAgIGludCAgICAgICAgICBpcl9sZW47CisgICAgICAgIGludCAgICAgICAgICBkZWxheV9sOworICAgICAgICBpbnQgICAgICAgICAgZGVsYXlfcjsKKyAgICAgICAgaW50ICAgICAgICAgIGVvZjsKKyAgICB9ICppbjsKK30gSGVhZHBob25lQ29udGV4dDsKKworc3RhdGljIGludCBwYXJzZV9jaGFubmVsX25hbWUoSGVhZHBob25lQ29udGV4dCAqcywgaW50IHgsIGNoYXIgKiphcmcsIGludCAqcmNoYW5uZWwsIGNoYXIgKmJ1ZikKK3sKKyAgICBpbnQgbGVuLCBpLCBjaGFubmVsX2lkID0gMDsKKyAgICBpbnQ2NF90IGxheW91dCwgbGF5b3V0MDsKKworICAgIGlmIChzc2NhbmYoKmFyZywgIiU3W0EtWl0lbiIsIGJ1ZiwgJmxlbikpIHsKKyAgICAgICAgbGF5b3V0MCA9IGxheW91dCA9IGF2X2dldF9jaGFubmVsX2xheW91dChidWYpOworICAgICAgICBpZiAobGF5b3V0ID09IEFWX0NIX0xPV19GUkVRVUVOQ1kpCisgICAgICAgICAgICBzLT5sZmVfY2hhbm5lbCA9IHg7CisgICAgICAgIGZvciAoaSA9IDMyOyBpID4gMDsgaSA+Pj0gMSkgeworICAgICAgICAgICAgaWYgKGxheW91dCA+PSAxTEwgPDwgaSkgeworICAgICAgICAgICAgICAgIGNoYW5uZWxfaWQgKz0gaTsKKyAgICAgICAgICAgICAgICBsYXlvdXQgPj49IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNoYW5uZWxfaWQgPj0gNjQgfHwgbGF5b3V0MCAhPSAxTEwgPDwgY2hhbm5lbF9pZCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICpyY2hhbm5lbCA9IGNoYW5uZWxfaWQ7CisgICAgICAgICphcmcgKz0gbGVuOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfbWFwKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEhlYWRwaG9uZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY2hhciAqYXJnLCAqdG9rZW5pemVyLCAqcCwgKmFyZ3MgPSBhdl9zdHJkdXAocy0+bWFwKTsKKyAgICBpbnQgaTsKKworICAgIGlmICghYXJncykKKyAgICAgICAgcmV0dXJuOworICAgIHAgPSBhcmdzOworCisgICAgcy0+bGZlX2NoYW5uZWwgPSAtMTsKKyAgICBzLT5uYl9pbnB1dHMgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKKyAgICAgICAgcy0+bWFwcGluZ1tpXSA9IC0xOworICAgIH0KKworICAgIHdoaWxlICgoYXJnID0gYXZfc3RydG9rKHAsICJ8IiwgJnRva2VuaXplcikpKSB7CisgICAgICAgIGludCBvdXRfY2hfaWQ7CisgICAgICAgIGNoYXIgYnVmWzhdOworCisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBpZiAocGFyc2VfY2hhbm5lbF9uYW1lKHMsIHMtPm5iX2lycywgJmFyZywgJm91dF9jaF9pZCwgYnVmKSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gcGFyc2UgXCclc1wnIGFzIGNoYW5uZWwgbmFtZS5cbiIsIGJ1Zik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzLT5tYXBwaW5nW3MtPm5iX2lyc10gPSBvdXRfY2hfaWQ7CisgICAgICAgIHMtPm5iX2lycysrOworICAgIH0KKworICAgIGlmIChzLT5ocmlyX2ZtdCA9PSBIUklSX01VTFRJKQorICAgICAgICBzLT5uYl9pbnB1dHMgPSAyOworICAgIGVsc2UKKyAgICAgICAgcy0+bmJfaW5wdXRzID0gcy0+bmJfaXJzICsgMTsKKworICAgIGF2X2ZyZWUoYXJncyk7Cit9CisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIEFWRnJhbWUgKmluLCAqb3V0OworICAgIGludCAqd3JpdGU7CisgICAgaW50ICoqZGVsYXk7CisgICAgZmxvYXQgKippcjsKKyAgICBpbnQgKm5fY2xpcHBpbmdzOworICAgIGZsb2F0ICoqcmluZ2J1ZmZlcjsKKyAgICBmbG9hdCAqKnRlbXBfc3JjOworICAgIEZGVENvbXBsZXggKip0ZW1wX2ZmdDsKK30gVGhyZWFkRGF0YTsKKworc3RhdGljIGludCBoZWFkcGhvbmVfY29udm9sdXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgSGVhZHBob25lQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbiwgKm91dCA9IHRkLT5vdXQ7CisgICAgaW50IG9mZnNldCA9IGpvYm5yOworICAgIGludCAqd3JpdGUgPSAmdGQtPndyaXRlW2pvYm5yXTsKKyAgICBjb25zdCBpbnQgKmNvbnN0IGRlbGF5ID0gdGQtPmRlbGF5W2pvYm5yXTsKKyAgICBjb25zdCBmbG9hdCAqY29uc3QgaXIgPSB0ZC0+aXJbam9ibnJdOworICAgIGludCAqbl9jbGlwcGluZ3MgPSAmdGQtPm5fY2xpcHBpbmdzW2pvYm5yXTsKKyAgICBmbG9hdCAqcmluZ2J1ZmZlciA9IHRkLT5yaW5nYnVmZmVyW2pvYm5yXTsKKyAgICBmbG9hdCAqdGVtcF9zcmMgPSB0ZC0+dGVtcF9zcmNbam9ibnJdOworICAgIGNvbnN0IGludCBpcl9sZW4gPSBzLT5pcl9sZW47CisgICAgY29uc3QgZmxvYXQgKnNyYyA9IChjb25zdCBmbG9hdCAqKWluLT5kYXRhWzBdOworICAgIGZsb2F0ICpkc3QgPSAoZmxvYXQgKilvdXQtPmRhdGFbMF07CisgICAgY29uc3QgaW50IGluX2NoYW5uZWxzID0gaW4tPmNoYW5uZWxzOworICAgIGNvbnN0IGludCBidWZmZXJfbGVuZ3RoID0gcy0+YnVmZmVyX2xlbmd0aDsKKyAgICBjb25zdCB1aW50MzJfdCBtb2R1bG8gPSAodWludDMyX3QpYnVmZmVyX2xlbmd0aCAtIDE7CisgICAgZmxvYXQgKmJ1ZmZlclsxNl07CisgICAgaW50IHdyID0gKndyaXRlOworICAgIGludCByZWFkOworICAgIGludCBpLCBsOworCisgICAgZHN0ICs9IG9mZnNldDsKKyAgICBmb3IgKGwgPSAwOyBsIDwgaW5fY2hhbm5lbHM7IGwrKykgeworICAgICAgICBidWZmZXJbbF0gPSByaW5nYnVmZmVyICsgbCAqIGJ1ZmZlcl9sZW5ndGg7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGluLT5uYl9zYW1wbGVzOyBpKyspIHsKKyAgICAgICAgY29uc3QgZmxvYXQgKnRlbXBfaXIgPSBpcjsKKworICAgICAgICAqZHN0ID0gMDsKKyAgICAgICAgZm9yIChsID0gMDsgbCA8IGluX2NoYW5uZWxzOyBsKyspIHsKKyAgICAgICAgICAgICooYnVmZmVyW2xdICsgd3IpID0gc3JjW2xdOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChsID0gMDsgbCA8IGluX2NoYW5uZWxzOyBsKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjb25zdCBicHRyID0gYnVmZmVyW2xdOworCisgICAgICAgICAgICBpZiAobCA9PSBzLT5sZmVfY2hhbm5lbCkgeworICAgICAgICAgICAgICAgICpkc3QgKz0gKihidWZmZXJbcy0+bGZlX2NoYW5uZWxdICsgd3IpICogcy0+Z2Fpbl9sZmU7CisgICAgICAgICAgICAgICAgdGVtcF9pciArPSBGRkFMSUdOKGlyX2xlbiwgMTYpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWFkID0gKHdyIC0gKihkZWxheSArIGwpIC0gKGlyX2xlbiAtIDEpICsgYnVmZmVyX2xlbmd0aCkgJiBtb2R1bG87CisKKyAgICAgICAgICAgIGlmIChyZWFkICsgaXJfbGVuIDwgYnVmZmVyX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX3NyYywgYnB0ciArIHJlYWQsIGlyX2xlbiAqIHNpemVvZigqdGVtcF9zcmMpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IEZGTUlOKGlyX2xlbiAtIChyZWFkICUgaXJfbGVuKSwgYnVmZmVyX2xlbmd0aCAtIHJlYWQpOworCisgICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfc3JjLCBicHRyICsgcmVhZCwgbGVuICogc2l6ZW9mKCp0ZW1wX3NyYykpOworICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX3NyYyArIGxlbiwgYnB0ciwgKGlyX2xlbiAtIGxlbikgKiBzaXplb2YoKnRlbXBfc3JjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFswXSArPSBzLT5mZHNwLT5zY2FsYXJwcm9kdWN0X2Zsb2F0KHRlbXBfaXIsIHRlbXBfc3JjLCBpcl9sZW4pOworICAgICAgICAgICAgdGVtcF9pciArPSBGRkFMSUdOKGlyX2xlbiwgMTYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhYnMoKmRzdCkgPiAxKQorICAgICAgICAgICAgKm5fY2xpcHBpbmdzICs9IDE7CisKKyAgICAgICAgZHN0ICs9IDI7CisgICAgICAgIHNyYyArPSBpbl9jaGFubmVsczsKKyAgICAgICAgd3IgICA9ICh3ciArIDEpICYgbW9kdWxvOworICAgIH0KKworICAgICp3cml0ZSA9IHdyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGVhZHBob25lX2Zhc3RfY29udm9sdXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgSGVhZHBob25lQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbiwgKm91dCA9IHRkLT5vdXQ7CisgICAgaW50IG9mZnNldCA9IGpvYm5yOworICAgIGludCAqd3JpdGUgPSAmdGQtPndyaXRlW2pvYm5yXTsKKyAgICBGRlRDb21wbGV4ICpocnRmID0gcy0+ZGF0YV9ocnRmW2pvYm5yXTsKKyAgICBpbnQgKm5fY2xpcHBpbmdzID0gJnRkLT5uX2NsaXBwaW5nc1tqb2Jucl07CisgICAgZmxvYXQgKnJpbmdidWZmZXIgPSB0ZC0+cmluZ2J1ZmZlcltqb2Jucl07CisgICAgY29uc3QgaW50IGlyX2xlbiA9IHMtPmlyX2xlbjsKKyAgICBjb25zdCBmbG9hdCAqc3JjID0gKGNvbnN0IGZsb2F0ICopaW4tPmRhdGFbMF07CisgICAgZmxvYXQgKmRzdCA9IChmbG9hdCAqKW91dC0+ZGF0YVswXTsKKyAgICBjb25zdCBpbnQgaW5fY2hhbm5lbHMgPSBpbi0+Y2hhbm5lbHM7CisgICAgY29uc3QgaW50IGJ1ZmZlcl9sZW5ndGggPSBzLT5idWZmZXJfbGVuZ3RoOworICAgIGNvbnN0IHVpbnQzMl90IG1vZHVsbyA9ICh1aW50MzJfdClidWZmZXJfbGVuZ3RoIC0gMTsKKyAgICBGRlRDb21wbGV4ICpmZnRfaW4gPSBzLT50ZW1wX2ZmdFtqb2Jucl07CisgICAgRkZUQ29udGV4dCAqaWZmdCA9IHMtPmlmZnRbam9ibnJdOworICAgIEZGVENvbnRleHQgKmZmdCA9IHMtPmZmdFtqb2Jucl07CisgICAgY29uc3QgaW50IG5fZmZ0ID0gcy0+bl9mZnQ7CisgICAgY29uc3QgZmxvYXQgZmZ0X3NjYWxlID0gMS4wZiAvIHMtPm5fZmZ0OworICAgIEZGVENvbXBsZXggKmhydGZfb2Zmc2V0OworICAgIGludCB3ciA9ICp3cml0ZTsKKyAgICBpbnQgbl9yZWFkOworICAgIGludCBpLCBqOworCisgICAgZHN0ICs9IG9mZnNldDsKKworICAgIG5fcmVhZCA9IEZGTUlOKHMtPmlyX2xlbiwgaW4tPm5iX3NhbXBsZXMpOworICAgIGZvciAoaiA9IDA7IGogPCBuX3JlYWQ7IGorKykgeworICAgICAgICBkc3RbMiAqIGpdICAgICA9IHJpbmdidWZmZXJbd3JdOworICAgICAgICByaW5nYnVmZmVyW3dyXSA9IDAuMDsKKyAgICAgICAgd3IgID0gKHdyICsgMSkgJiBtb2R1bG87CisgICAgfQorCisgICAgZm9yIChqID0gbl9yZWFkOyBqIDwgaW4tPm5iX3NhbXBsZXM7IGorKykgeworICAgICAgICBkc3RbMiAqIGpdID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5fY2hhbm5lbHM7IGkrKykgeworICAgICAgICBpZiAoaSA9PSBzLT5sZmVfY2hhbm5lbCkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGluLT5uYl9zYW1wbGVzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkc3RbMiAqIGpdICs9IHNyY1tpICsgaiAqIGluX2NoYW5uZWxzXSAqIHMtPmdhaW5fbGZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXQgPSBpICogbl9mZnQ7CisgICAgICAgIGhydGZfb2Zmc2V0ID0gaHJ0ZiArIG9mZnNldDsKKworICAgICAgICBtZW1zZXQoZmZ0X2luLCAwLCBzaXplb2YoRkZUQ29tcGxleCkgKiBuX2ZmdCk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGluLT5uYl9zYW1wbGVzOyBqKyspIHsKKyAgICAgICAgICAgIGZmdF9pbltqXS5yZSA9IHNyY1tqICogaW5fY2hhbm5lbHMgKyBpXTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZmdF9wZXJtdXRlKGZmdCwgZmZ0X2luKTsKKyAgICAgICAgYXZfZmZ0X2NhbGMoZmZ0LCBmZnRfaW4pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbl9mZnQ7IGorKykgeworICAgICAgICAgICAgY29uc3QgRkZUQ29tcGxleCAqaGNvbXBsZXggPSBocnRmX29mZnNldCArIGo7CisgICAgICAgICAgICBjb25zdCBmbG9hdCByZSA9IGZmdF9pbltqXS5yZTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IGltID0gZmZ0X2luW2pdLmltOworCisgICAgICAgICAgICBmZnRfaW5bal0ucmUgPSByZSAqIGhjb21wbGV4LT5yZSAtIGltICogaGNvbXBsZXgtPmltOworICAgICAgICAgICAgZmZ0X2luW2pdLmltID0gcmUgKiBoY29tcGxleC0+aW0gKyBpbSAqIGhjb21wbGV4LT5yZTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZmdF9wZXJtdXRlKGlmZnQsIGZmdF9pbik7CisgICAgICAgIGF2X2ZmdF9jYWxjKGlmZnQsIGZmdF9pbik7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGluLT5uYl9zYW1wbGVzOyBqKyspIHsKKyAgICAgICAgICAgIGRzdFsyICogal0gKz0gZmZ0X2luW2pdLnJlICogZmZ0X3NjYWxlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGlyX2xlbiAtIDE7IGorKykgeworICAgICAgICAgICAgaW50IHdyaXRlX3BvcyA9ICh3ciArIGopICYgbW9kdWxvOworCisgICAgICAgICAgICAqKHJpbmdidWZmZXIgKyB3cml0ZV9wb3MpICs9IGZmdF9pbltpbi0+bmJfc2FtcGxlcyArIGpdLnJlICogZmZ0X3NjYWxlOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG91dC0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGlmIChmYWJzKCpkc3QpID4gMSkgeworICAgICAgICAgICAgbl9jbGlwcGluZ3NbMF0rKzsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCArPSAyOworICAgIH0KKworICAgICp3cml0ZSA9IHdyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9pcihBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBIZWFkcGhvbmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpcl9sZW4sIG1heF9pcl9sZW4sIGlucHV0X251bWJlciwgcmV0OworCisgICAgZm9yIChpbnB1dF9udW1iZXIgPSAwOyBpbnB1dF9udW1iZXIgPCBzLT5uYl9pbnB1dHM7IGlucHV0X251bWJlcisrKQorICAgICAgICBpZiAoaW5saW5rID09IGN0eC0+aW5wdXRzW2lucHV0X251bWJlcl0pCisgICAgICAgICAgICBicmVhazsKKworICAgIHJldCA9IGF2X2F1ZGlvX2ZpZm9fd3JpdGUocy0+aW5baW5wdXRfbnVtYmVyXS5maWZvLCAodm9pZCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaXJfbGVuID0gYXZfYXVkaW9fZmlmb19zaXplKHMtPmluW2lucHV0X251bWJlcl0uZmlmbyk7CisgICAgbWF4X2lyX2xlbiA9IDY1NTM2OworICAgIGlmIChpcl9sZW4gPiBtYXhfaXJfbGVuKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBiaWcgbGVuZ3RoIG9mIElSczogJWQgPiAlZC5cbiIsIGlyX2xlbiwgbWF4X2lyX2xlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHMtPmluW2lucHV0X251bWJlcl0uaXJfbGVuID0gaXJfbGVuOworICAgIHMtPmlyX2xlbiA9IEZGTUFYKGlyX2xlbiwgcy0+aXJfbGVuKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhlYWRwaG9uZV9mcmFtZShIZWFkcGhvbmVDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKm91dGxpbmssIGludCBtYXhfbmJfc2FtcGxlcykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZyYW1lICppbiA9IHMtPmluWzBdLmZyYW1lOworICAgIGludCBuX2NsaXBwaW5nc1syXSA9IHsgMCB9OworICAgIFRocmVhZERhdGEgdGQ7CisgICAgQVZGcmFtZSAqb3V0OworCisgICAgYXZfYXVkaW9fZmlmb19yZWFkKHMtPmluWzBdLmZpZm8sICh2b2lkICoqKWluLT5leHRlbmRlZF9kYXRhLCBzLT5zaXplKTsKKworICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG91dC0+cHRzID0gcy0+cHRzOworICAgIGlmIChzLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPnB0cyArPSBhdl9yZXNjYWxlX3Eob3V0LT5uYl9zYW1wbGVzLCAoQVZSYXRpb25hbCl7MSwgb3V0bGluay0+c2FtcGxlX3JhdGV9LCBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgdGQuaW4gPSBpbjsgdGQub3V0ID0gb3V0OyB0ZC53cml0ZSA9IHMtPndyaXRlOworICAgIHRkLmRlbGF5ID0gcy0+ZGVsYXk7IHRkLmlyID0gcy0+ZGF0YV9pcjsgdGQubl9jbGlwcGluZ3MgPSBuX2NsaXBwaW5nczsKKyAgICB0ZC5yaW5nYnVmZmVyID0gcy0+cmluZ2J1ZmZlcjsgdGQudGVtcF9zcmMgPSBzLT50ZW1wX3NyYzsKKyAgICB0ZC50ZW1wX2ZmdCA9IHMtPnRlbXBfZmZ0OworCisgICAgaWYgKHMtPnR5cGUgPT0gVElNRV9ET01BSU4pIHsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGhlYWRwaG9uZV9jb252b2x1dGUsICZ0ZCwgTlVMTCwgMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGhlYWRwaG9uZV9mYXN0X2NvbnZvbHV0ZSwgJnRkLCBOVUxMLCAyKTsKKyAgICB9CisgICAgZW1tc19jKCk7CisKKyAgICBpZiAobl9jbGlwcGluZ3NbMF0gKyBuX2NsaXBwaW5nc1sxXSA+IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICIlZCBvZiAlZCBzYW1wbGVzIGNsaXBwZWQuIFBsZWFzZSByZWR1Y2UgZ2Fpbi5cbiIsCisgICAgICAgICAgICAgICBuX2NsaXBwaW5nc1swXSArIG5fY2xpcHBpbmdzWzFdLCBvdXQtPm5iX3NhbXBsZXMgKiAyKTsKKyAgICB9CisKKyAgICBvdXQtPm5iX3NhbXBsZXMgPSBtYXhfbmJfc2FtcGxlczsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgY29udmVydF9jb2VmZnMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIHN0cnVjdCBIZWFkcGhvbmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGludCBpcl9sZW4gPSBzLT5pcl9sZW47CisgICAgaW50IG5iX2lycyA9IHMtPm5iX2lyczsKKyAgICBpbnQgbmJfaW5wdXRfY2hhbm5lbHMgPSBjdHgtPmlucHV0c1swXS0+Y2hhbm5lbHM7CisgICAgZmxvYXQgZ2Fpbl9saW4gPSBleHBmKChzLT5nYWluIC0gMyAqIG5iX2lucHV0X2NoYW5uZWxzKSAvIDIwICogTV9MTjEwKTsKKyAgICBGRlRDb21wbGV4ICpkYXRhX2hydGZfbCA9IE5VTEw7CisgICAgRkZUQ29tcGxleCAqZGF0YV9ocnRmX3IgPSBOVUxMOworICAgIEZGVENvbXBsZXggKmZmdF9pbl9sID0gTlVMTDsKKyAgICBGRlRDb21wbGV4ICpmZnRfaW5fciA9IE5VTEw7CisgICAgZmxvYXQgKmRhdGFfaXJfbCA9IE5VTEw7CisgICAgZmxvYXQgKmRhdGFfaXJfciA9IE5VTEw7CisgICAgaW50IG9mZnNldCA9IDAsIHJldCA9IDA7CisgICAgaW50IG5fZmZ0OworICAgIGludCBpLCBqLCBrOworCisgICAgcy0+YnVmZmVyX2xlbmd0aCA9IDEgPDwgKDMyIC0gZmZfY2x6KHMtPmlyX2xlbikpOworICAgIHMtPm5fZmZ0ID0gbl9mZnQgPSAxIDw8ICgzMiAtIGZmX2NseihzLT5pcl9sZW4gKyBzLT5zaXplKSk7CisKKyAgICBpZiAocy0+dHlwZSA9PSBGUkVRVUVOQ1lfRE9NQUlOKSB7CisgICAgICAgIGZmdF9pbl9sID0gYXZfY2FsbG9jKG5fZmZ0LCBzaXplb2YoKmZmdF9pbl9sKSk7CisgICAgICAgIGZmdF9pbl9yID0gYXZfY2FsbG9jKG5fZmZ0LCBzaXplb2YoKmZmdF9pbl9yKSk7CisgICAgICAgIGlmICghZmZ0X2luX2wgfHwgIWZmdF9pbl9yKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBhdl9mZnRfZW5kKHMtPmZmdFswXSk7CisgICAgICAgIGF2X2ZmdF9lbmQocy0+ZmZ0WzFdKTsKKyAgICAgICAgcy0+ZmZ0WzBdID0gYXZfZmZ0X2luaXQobG9nMihzLT5uX2ZmdCksIDApOworICAgICAgICBzLT5mZnRbMV0gPSBhdl9mZnRfaW5pdChsb2cyKHMtPm5fZmZ0KSwgMCk7CisgICAgICAgIGF2X2ZmdF9lbmQocy0+aWZmdFswXSk7CisgICAgICAgIGF2X2ZmdF9lbmQocy0+aWZmdFsxXSk7CisgICAgICAgIHMtPmlmZnRbMF0gPSBhdl9mZnRfaW5pdChsb2cyKHMtPm5fZmZ0KSwgMSk7CisgICAgICAgIHMtPmlmZnRbMV0gPSBhdl9mZnRfaW5pdChsb2cyKHMtPm5fZmZ0KSwgMSk7CisKKyAgICAgICAgaWYgKCFzLT5mZnRbMF0gfHwgIXMtPmZmdFsxXSB8fCAhcy0+aWZmdFswXSB8fCAhcy0+aWZmdFsxXSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSBGRlQgY29udGV4dHMgb2Ygc2l6ZSAlZC5cbiIsIHMtPm5fZmZ0KTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPmRhdGFfaXJbMF0gPSBhdl9jYWxsb2MoRkZBTElHTihzLT5pcl9sZW4sIDE2KSwgc2l6ZW9mKGZsb2F0KSAqIHMtPm5iX2lycyk7CisgICAgcy0+ZGF0YV9pclsxXSA9IGF2X2NhbGxvYyhGRkFMSUdOKHMtPmlyX2xlbiwgMTYpLCBzaXplb2YoZmxvYXQpICogcy0+bmJfaXJzKTsKKyAgICBzLT5kZWxheVswXSA9IGF2X2NhbGxvYyhzLT5uYl9pcnMsIHNpemVvZihmbG9hdCkpOworICAgIHMtPmRlbGF5WzFdID0gYXZfY2FsbG9jKHMtPm5iX2lycywgc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBpZiAocy0+dHlwZSA9PSBUSU1FX0RPTUFJTikgeworICAgICAgICBzLT5yaW5nYnVmZmVyWzBdID0gYXZfY2FsbG9jKHMtPmJ1ZmZlcl9sZW5ndGgsIHNpemVvZihmbG9hdCkgKiBuYl9pbnB1dF9jaGFubmVscyk7CisgICAgICAgIHMtPnJpbmdidWZmZXJbMV0gPSBhdl9jYWxsb2Mocy0+YnVmZmVyX2xlbmd0aCwgc2l6ZW9mKGZsb2F0KSAqIG5iX2lucHV0X2NoYW5uZWxzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5yaW5nYnVmZmVyWzBdID0gYXZfY2FsbG9jKHMtPmJ1ZmZlcl9sZW5ndGgsIHNpemVvZihmbG9hdCkpOworICAgICAgICBzLT5yaW5nYnVmZmVyWzFdID0gYXZfY2FsbG9jKHMtPmJ1ZmZlcl9sZW5ndGgsIHNpemVvZihmbG9hdCkpOworICAgICAgICBzLT50ZW1wX2ZmdFswXSA9IGF2X2NhbGxvYyhzLT5uX2ZmdCwgc2l6ZW9mKEZGVENvbXBsZXgpKTsKKyAgICAgICAgcy0+dGVtcF9mZnRbMV0gPSBhdl9jYWxsb2Mocy0+bl9mZnQsIHNpemVvZihGRlRDb21wbGV4KSk7CisgICAgICAgIGlmICghcy0+dGVtcF9mZnRbMF0gfHwgIXMtPnRlbXBfZmZ0WzFdKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXMtPmRhdGFfaXJbMF0gfHwgIXMtPmRhdGFfaXJbMV0gfHwKKyAgICAgICAgIXMtPnJpbmdidWZmZXJbMF0gfHwgIXMtPnJpbmdidWZmZXJbMV0pIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcy0+aW5bMF0uZnJhbWUgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGN0eC0+aW5wdXRzWzBdLCBzLT5zaXplKTsKKyAgICBpZiAoIXMtPmluWzBdLmZyYW1lKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzIC0gMTsgaSsrKSB7CisgICAgICAgIHMtPmluW2kgKyAxXS5mcmFtZSA9IGZmX2dldF9hdWRpb19idWZmZXIoY3R4LT5pbnB1dHNbaSArIDFdLCBzLT5pcl9sZW4pOworICAgICAgICBpZiAoIXMtPmluW2kgKyAxXS5mcmFtZSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnR5cGUgPT0gVElNRV9ET01BSU4pIHsKKyAgICAgICAgcy0+dGVtcF9zcmNbMF0gPSBhdl9jYWxsb2MoRkZBTElHTihpcl9sZW4sIDE2KSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIHMtPnRlbXBfc3JjWzFdID0gYXZfY2FsbG9jKEZGQUxJR04oaXJfbGVuLCAxNiksIHNpemVvZihmbG9hdCkpOworCisgICAgICAgIGRhdGFfaXJfbCA9IGF2X2NhbGxvYyhuYl9pcnMgKiBGRkFMSUdOKGlyX2xlbiwgMTYpLCBzaXplb2YoKmRhdGFfaXJfbCkpOworICAgICAgICBkYXRhX2lyX3IgPSBhdl9jYWxsb2MobmJfaXJzICogRkZBTElHTihpcl9sZW4sIDE2KSwgc2l6ZW9mKCpkYXRhX2lyX3IpKTsKKyAgICAgICAgaWYgKCFkYXRhX2lyX3IgfHwgIWRhdGFfaXJfbCB8fCAhcy0+dGVtcF9zcmNbMF0gfHwgIXMtPnRlbXBfc3JjWzFdKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhX2hydGZfbCA9IGF2X2NhbGxvYyhuX2ZmdCwgc2l6ZW9mKCpkYXRhX2hydGZfbCkgKiBuYl9pcnMpOworICAgICAgICBkYXRhX2hydGZfciA9IGF2X2NhbGxvYyhuX2ZmdCwgc2l6ZW9mKCpkYXRhX2hydGZfcikgKiBuYl9pcnMpOworICAgICAgICBpZiAoIWRhdGFfaHJ0Zl9yIHx8ICFkYXRhX2hydGZfbCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0cyAtIDE7IGkrKykgeworICAgICAgICBpbnQgbGVuID0gcy0+aW5baSArIDFdLmlyX2xlbjsKKyAgICAgICAgaW50IGRlbGF5X2wgPSBzLT5pbltpICsgMV0uZGVsYXlfbDsKKyAgICAgICAgaW50IGRlbGF5X3IgPSBzLT5pbltpICsgMV0uZGVsYXlfcjsKKyAgICAgICAgZmxvYXQgKnB0cjsKKworICAgICAgICBhdl9hdWRpb19maWZvX3JlYWQocy0+aW5baSArIDFdLmZpZm8sICh2b2lkICoqKXMtPmluW2kgKyAxXS5mcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgbGVuKTsKKyAgICAgICAgcHRyID0gKGZsb2F0ICopcy0+aW5baSArIDFdLmZyYW1lLT5leHRlbmRlZF9kYXRhWzBdOworCisgICAgICAgIGlmIChzLT5ocmlyX2ZtdCA9PSBIUklSX1NURVJFTykgeworICAgICAgICAgICAgaW50IGlkeCA9IC0xOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5saW5rLT5jaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPm1hcHBpbmdbaV0gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgoYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKGlubGluay0+Y2hhbm5lbF9sYXlvdXQsIGopKSA9PSAoMUxMIDw8IHMtPm1hcHBpbmdbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIGlkeCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlkeCA9PSAtMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChzLT50eXBlID09IFRJTUVfRE9NQUlOKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gaWR4ICogRkZBTElHTihsZW4sIDE2KTsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YV9pcl9sW29mZnNldCArIGpdID0gcHRyW2xlbiAqIDIgLSBqICogMiAtIDJdICogZ2Fpbl9saW47CisgICAgICAgICAgICAgICAgICAgIGRhdGFfaXJfcltvZmZzZXQgKyBqXSA9IHB0cltsZW4gKiAyIC0gaiAqIDIgLSAxXSAqIGdhaW5fbGluOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KGZmdF9pbl9sLCAwLCBuX2ZmdCAqIHNpemVvZigqZmZ0X2luX2wpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoZmZ0X2luX3IsIDAsIG5fZmZ0ICogc2l6ZW9mKCpmZnRfaW5fcikpOworCisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gaWR4ICogbl9mZnQ7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZmdF9pbl9sW2RlbGF5X2wgKyBqXS5yZSA9IHB0cltqICogMiAgICBdICogZ2Fpbl9saW47CisgICAgICAgICAgICAgICAgICAgIGZmdF9pbl9yW2RlbGF5X3IgKyBqXS5yZSA9IHB0cltqICogMiArIDFdICogZ2Fpbl9saW47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXZfZmZ0X3Blcm11dGUocy0+ZmZ0WzBdLCBmZnRfaW5fbCk7CisgICAgICAgICAgICAgICAgYXZfZmZ0X2NhbGMocy0+ZmZ0WzBdLCBmZnRfaW5fbCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGFfaHJ0Zl9sICsgb2Zmc2V0LCBmZnRfaW5fbCwgbl9mZnQgKiBzaXplb2YoKmZmdF9pbl9sKSk7CisgICAgICAgICAgICAgICAgYXZfZmZ0X3Blcm11dGUocy0+ZmZ0WzBdLCBmZnRfaW5fcik7CisgICAgICAgICAgICAgICAgYXZfZmZ0X2NhbGMocy0+ZmZ0WzBdLCBmZnRfaW5fcik7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGFfaHJ0Zl9yICsgb2Zmc2V0LCBmZnRfaW5fciwgbl9mZnQgKiBzaXplb2YoKmZmdF9pbl9yKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgSSwgTiA9IGN0eC0+aW5wdXRzWzFdLT5jaGFubmVsczsKKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IE4gLyAyOyBrKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gLTE7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5saW5rLT5jaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5tYXBwaW5nW2tdIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKGF2X2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbChpbmxpbmstPmNoYW5uZWxfbGF5b3V0LCBqKSkgPT0gKDFMTCA8PCBzLT5tYXBwaW5nW2tdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpZHggPT0gLTEpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgSSA9IGlkeCAqIDI7CisgICAgICAgICAgICAgICAgaWYgKHMtPnR5cGUgPT0gVElNRV9ET01BSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gaWR4ICogRkZBTElHTihsZW4sIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2lyX2xbb2Zmc2V0ICsgal0gPSBwdHJbbGVuICogTiAtIGogKiBOIC0gTiArIEkgICAgXSAqIGdhaW5fbGluOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9pcl9yW29mZnNldCArIGpdID0gcHRyW2xlbiAqIE4gLSBqICogTiAtIE4gKyBJICsgMV0gKiBnYWluX2xpbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChmZnRfaW5fbCwgMCwgbl9mZnQgKiBzaXplb2YoKmZmdF9pbl9sKSk7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChmZnRfaW5fciwgMCwgbl9mZnQgKiBzaXplb2YoKmZmdF9pbl9yKSk7CisKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gaWR4ICogbl9mZnQ7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmZ0X2luX2xbZGVsYXlfbCArIGpdLnJlID0gcHRyW2ogKiBOICsgSSAgICBdICogZ2Fpbl9saW47CisgICAgICAgICAgICAgICAgICAgICAgICBmZnRfaW5fcltkZWxheV9yICsgal0ucmUgPSBwdHJbaiAqIE4gKyBJICsgMV0gKiBnYWluX2xpbjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGF2X2ZmdF9wZXJtdXRlKHMtPmZmdFswXSwgZmZ0X2luX2wpOworICAgICAgICAgICAgICAgICAgICBhdl9mZnRfY2FsYyhzLT5mZnRbMF0sIGZmdF9pbl9sKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGFfaHJ0Zl9sICsgb2Zmc2V0LCBmZnRfaW5fbCwgbl9mZnQgKiBzaXplb2YoKmZmdF9pbl9sKSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZmdF9wZXJtdXRlKHMtPmZmdFswXSwgZmZ0X2luX3IpOworICAgICAgICAgICAgICAgICAgICBhdl9mZnRfY2FsYyhzLT5mZnRbMF0sIGZmdF9pbl9yKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGFfaHJ0Zl9yICsgb2Zmc2V0LCBmZnRfaW5fciwgbl9mZnQgKiBzaXplb2YoKmZmdF9pbl9yKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHMtPnR5cGUgPT0gVElNRV9ET01BSU4pIHsKKyAgICAgICAgbWVtY3B5KHMtPmRhdGFfaXJbMF0sIGRhdGFfaXJfbCwgc2l6ZW9mKGZsb2F0KSAqIG5iX2lycyAqIEZGQUxJR04oaXJfbGVuLCAxNikpOworICAgICAgICBtZW1jcHkocy0+ZGF0YV9pclsxXSwgZGF0YV9pcl9yLCBzaXplb2YoZmxvYXQpICogbmJfaXJzICogRkZBTElHTihpcl9sZW4sIDE2KSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZGF0YV9ocnRmWzBdID0gYXZfY2FsbG9jKG5fZmZ0ICogcy0+bmJfaXJzLCBzaXplb2YoRkZUQ29tcGxleCkpOworICAgICAgICBzLT5kYXRhX2hydGZbMV0gPSBhdl9jYWxsb2Mobl9mZnQgKiBzLT5uYl9pcnMsIHNpemVvZihGRlRDb21wbGV4KSk7CisgICAgICAgIGlmICghcy0+ZGF0YV9ocnRmWzBdIHx8ICFzLT5kYXRhX2hydGZbMV0pIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIG1lbWNweShzLT5kYXRhX2hydGZbMF0sIGRhdGFfaHJ0Zl9sLAorICAgICAgICAgICAgc2l6ZW9mKEZGVENvbXBsZXgpICogbmJfaXJzICogbl9mZnQpOworICAgICAgICBtZW1jcHkocy0+ZGF0YV9ocnRmWzFdLCBkYXRhX2hydGZfciwKKyAgICAgICAgICAgIHNpemVvZihGRlRDb21wbGV4KSAqIG5iX2lycyAqIG5fZmZ0KTsKKyAgICB9CisKKyAgICBzLT5oYXZlX2hyaXJzID0gMTsKKworZmFpbDoKKworICAgIGF2X2ZyZWVwKCZkYXRhX2lyX2wpOworICAgIGF2X2ZyZWVwKCZkYXRhX2lyX3IpOworCisgICAgYXZfZnJlZXAoJmRhdGFfaHJ0Zl9sKTsKKyAgICBhdl9mcmVlcCgmZGF0YV9ocnRmX3IpOworCisgICAgYXZfZnJlZXAoJmZmdF9pbl9sKTsKKyAgICBhdl9mcmVlcCgmZmZ0X2luX3IpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgSGVhZHBob25lQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgaW50IHJldCA9IDA7CisKKyAgICByZXQgPSBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmluWzBdLmZpZm8sICh2b2lkICoqKWluLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+bmJfc2FtcGxlcyk7CisgICAgaWYgKHMtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcy0+cHRzID0gaW4tPnB0czsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFzLT5oYXZlX2hyaXJzICYmIHMtPmVvZl9ocmlycykgeworICAgICAgICByZXQgPSBjb252ZXJ0X2NvZWZmcyhjdHgsIGlubGluayk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+aGF2ZV9ocmlycykgeworICAgICAgICB3aGlsZSAoYXZfYXVkaW9fZmlmb19zaXplKHMtPmluWzBdLmZpZm8pID49IHMtPnNpemUpIHsKKyAgICAgICAgICAgIHJldCA9IGhlYWRwaG9uZV9mcmFtZShzLCBvdXRsaW5rLCBzLT5zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0cnVjdCBIZWFkcGhvbmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqc3RlcmVvX2xheW91dCA9IE5VTEw7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqaHJpcl9sYXlvdXRzID0gTlVMTDsKKyAgICBpbnQgcmV0LCBpOworCisgICAgcmV0ID0gZmZfYWRkX2Zvcm1hdCgmZm9ybWF0cywgQVZfU0FNUExFX0ZNVF9GTFQpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9sYXlvdXRzKCk7CisgICAgaWYgKCFsYXlvdXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmY3R4LT5pbnB1dHNbMF0tPm91dF9jaGFubmVsX2xheW91dHMpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJnN0ZXJlb19sYXlvdXQsIEFWX0NIX0xBWU9VVF9TVEVSRU8pOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+aHJpcl9mbXQgPT0gSFJJUl9NVUxUSSkgeworICAgICAgICBocmlyX2xheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKKyAgICAgICAgaWYgKCFocmlyX2xheW91dHMpCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldCA9IGZmX2NoYW5uZWxfbGF5b3V0c19yZWYoaHJpcl9sYXlvdXRzLCAmY3R4LT5pbnB1dHNbMV0tPm91dF9jaGFubmVsX2xheW91dHMpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGZmX2NoYW5uZWxfbGF5b3V0c19yZWYoc3RlcmVvX2xheW91dCwgJmN0eC0+aW5wdXRzW2ldLT5vdXRfY2hhbm5lbF9sYXlvdXRzKTsKKyAgICAgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IGZmX2NoYW5uZWxfbGF5b3V0c19yZWYoc3RlcmVvX2xheW91dCwgJmN0eC0+b3V0cHV0c1swXS0+aW5fY2hhbm5lbF9sYXlvdXRzKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEhlYWRwaG9uZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+bmJfaXJzIDwgaW5saW5rLT5jaGFubmVscykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOdW1iZXIgb2YgSFJJUnMgbXVzdCBiZSA+PSAlZC5cbiIsIGlubGluay0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBIZWFkcGhvbmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpLCByZXQ7CisKKyAgICBBVkZpbHRlclBhZCBwYWQgPSB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiaW4wIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9OworICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X2lucGFkKGN0eCwgMCwgJnBhZCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICghcy0+bWFwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlZhbGlkIG1hcHBpbmcgbXVzdCBiZSBzZXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBwYXJzZV9tYXAoY3R4KTsKKworICAgIHMtPmluID0gYXZfY2FsbG9jKHMtPm5iX2lucHV0cywgc2l6ZW9mKCpzLT5pbikpOworICAgIGlmICghcy0+aW4pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgY2hhciAqbmFtZSA9IGF2X2FzcHJpbnRmKCJocmlyJWQiLCBpIC0gMSk7CisgICAgICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsKKyAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSBuYW1lLAorICAgICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgICAgIC5maWx0ZXJfZnJhbWUgPSByZWFkX2lyLAorICAgICAgICB9OworICAgICAgICBpZiAoIW5hbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZiAoKHJldCA9IGZmX2luc2VydF9pbnBhZChjdHgsIGksICZwYWQpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwYWQubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgcy0+ZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoMCk7CisgICAgaWYgKCFzLT5mZHNwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgSGVhZHBob25lQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGludCBpOworCisgICAgaWYgKHMtPmhyaXJfZm10ID09IEhSSVJfTVVMVEkpIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICpocmlyX2xpbmsgPSBjdHgtPmlucHV0c1sxXTsKKworICAgICAgICBpZiAoaHJpcl9saW5rLT5jaGFubmVscyA8IGlubGluay0+Y2hhbm5lbHMgKiAyKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOdW1iZXIgb2YgY2hhbm5lbHMgaW4gSFJJUiBzdHJlYW0gbXVzdCBiZSA+PSAlZC5cbiIsIGlubGluay0+Y2hhbm5lbHMgKiAyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgcy0+aW5baV0uZmlmbyA9IGF2X2F1ZGlvX2ZpZm9fYWxsb2MoY3R4LT5pbnB1dHNbaV0tPmZvcm1hdCwgY3R4LT5pbnB1dHNbaV0tPmNoYW5uZWxzLCAxMDI0KTsKKyAgICAgICAgaWYgKCFzLT5pbltpXS5maWZvKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcy0+Z2Fpbl9sZmUgPSBleHBmKChzLT5nYWluIC0gMyAqIGlubGluay0+Y2hhbm5lbHMgLSA2ICsgcy0+bGZlX2dhaW4pIC8gMjAgKiBNX0xOMTApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgSGVhZHBob25lQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgcmV0OworCisgICAgZm9yIChpID0gMTsgIXMtPmVvZl9ocmlycyAmJiBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKCFzLT5pbltpXS5lb2YpIHsKKyAgICAgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbaV0pOworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikgeworICAgICAgICAgICAgICAgIHMtPmluW2ldLmVvZiA9IDE7CisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaSA9PSBzLT5uYl9pbnB1dHMgLSAxKQorICAgICAgICAgICAgICAgIHMtPmVvZl9ocmlycyA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5pblswXS5maWZvKSA+IDAgJiYgcy0+aGF2ZV9ocmlycykgeworICAgICAgICBpbnQgbmJfc2FtcGxlcyA9IGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5pblswXS5maWZvKTsKKyAgICAgICAgQVZGcmFtZSAqaW4gPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGN0eC0+aW5wdXRzWzBdLCBzLT5zaXplIC0gbmJfc2FtcGxlcyk7CisKKyAgICAgICAgaWYgKCFpbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgYXZfc2FtcGxlc19zZXRfc2lsZW5jZShpbi0+ZXh0ZW5kZWRfZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmZvcm1hdCk7CisKKyAgICAgICAgcmV0ID0gYXZfYXVkaW9fZmlmb193cml0ZShzLT5pblswXS5maWZvLCAodm9pZCAqKilpbi0+ZXh0ZW5kZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSBoZWFkcGhvbmVfZnJhbWUocywgb3V0bGluaywgbmJfc2FtcGxlcyk7CisKKyAgICAgICAgYXZfYXVkaW9fZmlmb19kcmFpbihzLT5pblswXS5maWZvLCBhdl9hdWRpb19maWZvX3NpemUocy0+aW5bMF0uZmlmbykpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEhlYWRwaG9uZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBhdl9mZnRfZW5kKHMtPmlmZnRbMF0pOworICAgIGF2X2ZmdF9lbmQocy0+aWZmdFsxXSk7CisgICAgYXZfZmZ0X2VuZChzLT5mZnRbMF0pOworICAgIGF2X2ZmdF9lbmQocy0+ZmZ0WzFdKTsKKyAgICBhdl9mcmVlcCgmcy0+ZGVsYXlbMF0pOworICAgIGF2X2ZyZWVwKCZzLT5kZWxheVsxXSk7CisgICAgYXZfZnJlZXAoJnMtPmRhdGFfaXJbMF0pOworICAgIGF2X2ZyZWVwKCZzLT5kYXRhX2lyWzFdKTsKKyAgICBhdl9mcmVlcCgmcy0+cmluZ2J1ZmZlclswXSk7CisgICAgYXZfZnJlZXAoJnMtPnJpbmdidWZmZXJbMV0pOworICAgIGF2X2ZyZWVwKCZzLT50ZW1wX3NyY1swXSk7CisgICAgYXZfZnJlZXAoJnMtPnRlbXBfc3JjWzFdKTsKKyAgICBhdl9mcmVlcCgmcy0+dGVtcF9mZnRbMF0pOworICAgIGF2X2ZyZWVwKCZzLT50ZW1wX2ZmdFsxXSk7CisgICAgYXZfZnJlZXAoJnMtPmRhdGFfaHJ0ZlswXSk7CisgICAgYXZfZnJlZXAoJnMtPmRhdGFfaHJ0ZlsxXSk7CisgICAgYXZfZnJlZXAoJnMtPmZkc3ApOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmluW2ldLmZyYW1lKTsKKyAgICAgICAgYXZfYXVkaW9fZmlmb19mcmVlKHMtPmluW2ldLmZpZm8pOworICAgICAgICBpZiAoY3R4LT5pbnB1dF9wYWRzICYmIGkpCisgICAgICAgICAgICBhdl9mcmVlcCgmY3R4LT5pbnB1dF9wYWRzW2ldLm5hbWUpOworICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+aW4pOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihIZWFkcGhvbmVDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGhlYWRwaG9uZV9vcHRpb25zW10gPSB7CisgICAgeyAibWFwIiwgICAgICAgInNldCBjaGFubmVscyBjb252b2x1dGlvbiBtYXBwaW5ncyIsICBPRkZTRVQobWFwKSwgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZ2FpbiIsICAgICAgInNldCBnYWluIGluIGRCIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZ2FpbiksICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsPTB9LCAgICAgLTIwLCAgNDAsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAibGZlIiwgICAgICAgInNldCBsZmUgZ2FpbiBpbiBkQiIsICAgICAgICAgICAgICAgICBPRkZTRVQobGZlX2dhaW4pLCBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsPTB9LCAgICAgLTIwLCAgNDAsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAidHlwZSIsICAgICAgInNldCBwcm9jZXNzaW5nIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQodHlwZSksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTF9LCAgICAgICAwLCAgIDEsIC5mbGFncyA9IEZMQUdTLCAidHlwZSIgfSwKKyAgICB7ICJ0aW1lIiwgICAgICAidGltZSBkb21haW4iLCAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9MH0sICAgICAgIDAsICAgMCwgLmZsYWdzID0gRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgImZyZXEiLCAgICAgICJmcmVxdWVuY3kgZG9tYWluIiwgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND0xfSwgICAgICAgMCwgICAwLCAuZmxhZ3MgPSBGTEFHUywgInR5cGUiIH0sCisgICAgeyAic2l6ZSIsICAgICAgInNldCBmcmFtZSBzaXplIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc2l6ZSksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTEwMjR9LDEwMjQsOTYwMDAsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiaHJpciIsICAgICAgInNldCBocmlyIGZvcm1hdCIsICAgICAgICAgICAgICAgICAgICBPRkZTRVQoaHJpcl9mbXQpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PUhSSVJfU1RFUkVPfSwgMCwgMSwgLmZsYWdzID0gRkxBR1MsICJocmlyIiB9LAorICAgIHsgInN0ZXJlbyIsICAgICJocmlyIGZpbGVzIGhhdmUgZXhhY3RseSAyIGNoYW5uZWxzIiwgMCwgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND1IUklSX1NURVJFT30sIDAsIDAsIC5mbGFncyA9IEZMQUdTLCAiaHJpciIgfSwKKyAgICB7ICJtdWx0aWNoIiwgICAic2luZ2xlIG11bHRpY2hhbm5lbCBocmlyIGZpbGUiLCAgICAgIDAsICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9SFJJUl9NVUxUSX0sICAwLCAwLCAuZmxhZ3MgPSBGTEFHUywgImhyaXIiIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhoZWFkcGhvbmUpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9oZWFkcGhvbmUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiaGVhZHBob25lIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSBoZWFkcGhvbmUgYmluYXVyYWwgc3BhdGlhbGl6YXRpb24gd2l0aCBIUlRGcyBpbiBhZGRpdGlvbmFsIHN0cmVhbXMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoSGVhZHBob25lQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmaGVhZHBob25lX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUyB8IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfam9pbi5jIGIvbGliYXZmaWx0ZXIvYWZfam9pbi5jCmluZGV4IGJkNzgwY2MuLjRmODZlMTMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2pvaW4uYworKysgYi9saWJhdmZpbHRlci9hZl9qb2luLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJhdWRpby5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImZpbHRlcnMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiB0eXBlZGVmIHN0cnVjdCBDaGFubmVsTWFwIHsKQEAgLTc4LDQ4ICs3OSwxMiBAQAogCiBBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moam9pbik7CiAKLXN0YXRpYyBpbnQgdHJ5X3B1c2hfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpOwotCi1zdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmZyYW1lKQotewotICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OwotICAgIEpvaW5Db250ZXh0ICAgICAgICpzID0gY3R4LT5wcml2OwotICAgIGludCBpLCBqOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspCi0gICAgICAgIGlmIChsaW5rID09IGN0eC0+aW5wdXRzW2ldKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgYXZfYXNzZXJ0MChpIDwgY3R4LT5uYl9pbnB1dHMpOwotICAgIGF2X2Fzc2VydDAoIXMtPmlucHV0X2ZyYW1lc1tpXSk7Ci0gICAgcy0+aW5wdXRfZnJhbWVzW2ldID0gZnJhbWU7Ci0KLSAgICAvKiByZXF1ZXN0IHRoZSBzYW1lIG51bWJlciBvZiBzYW1wbGVzIG9uIGFsbCBpbnB1dHMgKi8KLSAgICAvKiBGSVhNRSB0aGF0IG1lYW5zIGEgZnJhbWUgYXJyaXZpbmcgYXN5bmNocm9ub3VzbHkgb24gYSBkaWZmZXJlbnQgaW5wdXQKLSAgICAgICB3aWxsIG5vdCBoYXZlIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHNhbXBsZXMgKi8KLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgIGludCBuYl9zYW1wbGVzID0gcy0+aW5wdXRfZnJhbWVzWzBdLT5uYl9zYW1wbGVzOwotCi0gICAgICAgIGZvciAoaiA9IDE7ICFpICYmIGogPCBjdHgtPm5iX2lucHV0czsgaisrKQotICAgICAgICAgICAgY3R4LT5pbnB1dHNbal0tPnJlcXVlc3Rfc2FtcGxlcyA9IG5iX3NhbXBsZXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRyeV9wdXNoX2ZyYW1lKGN0eCk7Ci19Ci0KIHN0YXRpYyBpbnQgcGFyc2VfbWFwcyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBKb2luQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKICAgICBjaGFyIHNlcGFyYXRvciA9ICd8JzsKICAgICBjaGFyICpjdXIgICAgICA9IHMtPm1hcDsKIAotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSAgICBpZiAoY3VyICYmIHN0cmNocihjdXIsICcsJykpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJUaGlzIHN5bnRheCBpcyBkZXByZWNhdGVkLCB1c2UgJ3wnIHRvICIKLSAgICAgICAgICAgICAgICJzZXBhcmF0ZSB0aGUgbWFwcGluZ3MuXG4iKTsKLSAgICAgICAgc2VwYXJhdG9yID0gJywnOwotICAgIH0KLSNlbmRpZgotCiAgICAgd2hpbGUgKGN1ciAmJiAqY3VyKSB7CiAgICAgICAgIGNoYXIgKnNlcCwgKm5leHQsICpwOwogICAgICAgICB1aW50NjRfdCBpbl9jaGFubmVsID0gMCwgb3V0X2NoYW5uZWwgPSAwOwpAQCAtMjI4LDExICsxOTMsMTEgQEAKICAgICAgICAgcGFkLm5hbWUgICAgICAgICAgID0gYXZfc3RyZHVwKG5hbWUpOwogICAgICAgICBpZiAoIXBhZC5uYW1lKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgcGFkLmZpbHRlcl9mcmFtZSAgID0gZmlsdGVyX2ZyYW1lOwogCi0gICAgICAgIHBhZC5uZWVkc19maWZvID0gMTsKLQotICAgICAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmcGFkKTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmcGFkKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMzk1LDIxICszNjAsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgam9pbl9yZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKLXsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKLSAgICBKb2luQ29udGV4dCAqcyAgICAgICA9IGN0eC0+cHJpdjsKLSAgICBpbnQgaTsKLQotICAgIC8qIGdldCBhIGZyYW1lIG9uIGVhY2ggaW5wdXQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykgewotICAgICAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzW2ldOwotICAgICAgICBpZiAoIXMtPmlucHV0X2ZyYW1lc1tpXSkKLSAgICAgICAgICAgIHJldHVybiBmZl9yZXF1ZXN0X2ZyYW1lKGlubGluayk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHRyeV9wdXNoX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewogICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKQEAgLTQyNSw2ICszNzUsOCBAQAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIG5iX3NhbXBsZXMgPSBGRk1JTihuYl9zYW1wbGVzLCBzLT5pbnB1dF9mcmFtZXNbaV0tPm5iX3NhbXBsZXMpOwogICAgIH0KKyAgICBpZiAoIW5iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiAwOwogCiAgICAgLyogc2V0dXAgdGhlIG91dHB1dCBmcmFtZSAqLwogICAgIGZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKQEAgLTQ5MSw3ICs0NDMsNyBAQAogCiAgICAgZnJhbWUtPm5iX3NhbXBsZXMgICAgID0gbmJfc2FtcGxlczsKICAgICBmcmFtZS0+Y2hhbm5lbF9sYXlvdXQgPSBvdXRsaW5rLT5jaGFubmVsX2xheW91dDsKLSAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbHMoZnJhbWUsIG91dGxpbmstPmNoYW5uZWxzKTsKKyAgICBmcmFtZS0+Y2hhbm5lbHMgICAgICAgPSBvdXRsaW5rLT5jaGFubmVsczsKICAgICBmcmFtZS0+c2FtcGxlX3JhdGUgICAgPSBvdXRsaW5rLT5zYW1wbGVfcmF0ZTsKICAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgPSBvdXRsaW5rLT5mb3JtYXQ7CiAgICAgZnJhbWUtPnB0cyAgICAgICAgICAgID0gcy0+aW5wdXRfZnJhbWVzWzBdLT5wdHM7CkBAIC01MTMsMTIgKzQ2NSw2MSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYWN0aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSm9pbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGksIHJldCwgc3RhdHVzOworICAgIGludCBuYl9zYW1wbGVzID0gMDsKKyAgICBpbnQ2NF90IHB0czsKKworICAgIGlmICghcy0+aW5wdXRfZnJhbWVzWzBdKSB7CisgICAgICAgIHJldCA9IGZmX2lubGlua19jb25zdW1lX2ZyYW1lKGN0eC0+aW5wdXRzWzBdLCAmcy0+aW5wdXRfZnJhbWVzWzBdKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoZmZfaW5saW5rX2Fja25vd2xlZGdlX3N0YXR1cyhjdHgtPmlucHV0c1swXSwgJnN0YXR1cywgJnB0cykpIHsKKyAgICAgICAgICAgIGZmX291dGxpbmtfc2V0X3N0YXR1cyhjdHgtPm91dHB1dHNbMF0sIHN0YXR1cywgcHRzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZmX291dGxpbmtfZnJhbWVfd2FudGVkKGN0eC0+b3V0cHV0c1swXSkgJiYgIXMtPmlucHV0X2ZyYW1lc1swXSkgeworICAgICAgICAgICAgICAgIGZmX2lubGlua19yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXMtPmlucHV0X2ZyYW1lc1swXSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuYl9zYW1wbGVzID0gcy0+aW5wdXRfZnJhbWVzWzBdLT5uYl9zYW1wbGVzOworCisgICAgZm9yIChpID0gMTsgaSA8IGN0eC0+bmJfaW5wdXRzICYmIG5iX3NhbXBsZXMgPiAwOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPmlucHV0X2ZyYW1lc1tpXSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmIChmZl9pbmxpbmtfY2hlY2tfYXZhaWxhYmxlX3NhbXBsZXMoY3R4LT5pbnB1dHNbaV0sIG5iX3NhbXBsZXMpID4gMCkgeworICAgICAgICAgICAgcmV0ID0gZmZfaW5saW5rX2NvbnN1bWVfc2FtcGxlcyhjdHgtPmlucHV0c1tpXSwgbmJfc2FtcGxlcywgbmJfc2FtcGxlcywgJnMtPmlucHV0X2ZyYW1lc1tpXSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZmX2lubGlua19hY2tub3dsZWRnZV9zdGF0dXMoY3R4LT5pbnB1dHNbaV0sICZzdGF0dXMsICZwdHMpKSB7CisgICAgICAgICAgICAgICAgZmZfb3V0bGlua19zZXRfc3RhdHVzKGN0eC0+b3V0cHV0c1swXSwgc3RhdHVzLCBwdHMpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZmX291dGxpbmtfZnJhbWVfd2FudGVkKGN0eC0+b3V0cHV0c1swXSkpIHsKKyAgICAgICAgICAgICAgICBmZl9pbmxpbmtfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1tpXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ5X3B1c2hfZnJhbWUoY3R4KTsKK30KKwogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2pvaW5fb3V0cHV0c1tdID0gewogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgICAgICAuY29uZmlnX3Byb3BzICA9IGpvaW5fY29uZmlnX291dHB1dCwKLSAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSBqb2luX3JlcXVlc3RfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTUzMSw2ICs1MzIsNyBAQAogICAgIC5wcml2X2NsYXNzICAgICA9ICZqb2luX2NsYXNzLAogICAgIC5pbml0ICAgICAgICAgICA9IGpvaW5faW5pdCwKICAgICAudW5pbml0ICAgICAgICAgPSBqb2luX3VuaW5pdCwKKyAgICAuYWN0aXZhdGUgICAgICAgPSBhY3RpdmF0ZSwKICAgICAucXVlcnlfZm9ybWF0cyAgPSBqb2luX3F1ZXJ5X2Zvcm1hdHMsCiAgICAgLmlucHV0cyAgICAgICAgID0gTlVMTCwKICAgICAub3V0cHV0cyAgICAgICAgPSBhdmZpbHRlcl9hZl9qb2luX291dHB1dHMsCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9sYWRzcGEuYyBiL2xpYmF2ZmlsdGVyL2FmX2xhZHNwYS5jCmluZGV4IDU1MzJkYWMuLjNiZTI2YmMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX2xhZHNwYS5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2xhZHNwYS5jCkBAIC0zMTgsOCArMzE4LDYgQEAKIAogICAgICAgICByZXQgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIExBRFNQQUNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0KICAgICAgICAgb3V0bGluay0+c2FtcGxlX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgb3V0bGluay0+dGltZV9iYXNlICAgPSAoQVZSYXRpb25hbCl7MSwgcy0+c2FtcGxlX3JhdGV9OwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9sb3Vkbm9ybS5jIGIvbGliYXZmaWx0ZXIvYWZfbG91ZG5vcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTRiMjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvYWZfbG91ZG5vcm0uYwpAQCAtMCwwICsxLDkzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBLeWxlIFN3YW5zb24gPGtAeWxvLnBoPi4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyogaHR0cDovL2sueWxvLnBoLzIwMTYvMDQvMDQvbG91ZG5vcm0uaHRtbCAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgImVidXIxMjguaCIKKworZW51bSBGcmFtZVR5cGUgeworICAgIEZJUlNUX0ZSQU1FLAorICAgIElOTkVSX0ZSQU1FLAorICAgIEZJTkFMX0ZSQU1FLAorICAgIExJTkVBUl9NT0RFLAorICAgIEZSQU1FX05CCit9OworCitlbnVtIExpbWl0ZXJTdGF0ZSB7CisgICAgT1VULAorICAgIEFUVEFDSywKKyAgICBTVVNUQUlOLAorICAgIFJFTEVBU0UsCisgICAgU1RBVEVfTkIKK307CisKK2VudW0gUHJpbnRGb3JtYXQgeworICAgIE5PTkUsCisgICAgSlNPTiwKKyAgICBTVU1NQVJZLAorICAgIFBGX05CCit9OworCit0eXBlZGVmIHN0cnVjdCBMb3VkTm9ybUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGRvdWJsZSB0YXJnZXRfaTsKKyAgICBkb3VibGUgdGFyZ2V0X2xyYTsKKyAgICBkb3VibGUgdGFyZ2V0X3RwOworICAgIGRvdWJsZSBtZWFzdXJlZF9pOworICAgIGRvdWJsZSBtZWFzdXJlZF9scmE7CisgICAgZG91YmxlIG1lYXN1cmVkX3RwOworICAgIGRvdWJsZSBtZWFzdXJlZF90aHJlc2g7CisgICAgZG91YmxlIG9mZnNldDsKKyAgICBpbnQgbGluZWFyOworICAgIGludCBkdWFsX21vbm87CisgICAgZW51bSBQcmludEZvcm1hdCBwcmludF9mb3JtYXQ7CisKKyAgICBkb3VibGUgKmJ1ZjsKKyAgICBpbnQgYnVmX3NpemU7CisgICAgaW50IGJ1Zl9pbmRleDsKKyAgICBpbnQgcHJldl9idWZfaW5kZXg7CisKKyAgICBkb3VibGUgZGVsdGFbMzBdOworICAgIGRvdWJsZSB3ZWlnaHRzWzIxXTsKKyAgICBkb3VibGUgcHJldl9kZWx0YTsKKyAgICBpbnQgaW5kZXg7CisKKyAgICBkb3VibGUgZ2Fpbl9yZWR1Y3Rpb25bMl07CisgICAgZG91YmxlICpsaW1pdGVyX2J1ZjsKKyAgICBkb3VibGUgKnByZXZfc21wOworICAgIGludCBsaW1pdGVyX2J1Zl9pbmRleDsKKyAgICBpbnQgbGltaXRlcl9idWZfc2l6ZTsKKyAgICBlbnVtIExpbWl0ZXJTdGF0ZSBsaW1pdGVyX3N0YXRlOworICAgIGludCBwZWFrX2luZGV4OworICAgIGludCBlbnZfaW5kZXg7CisgICAgaW50IGVudl9jbnQ7CisgICAgaW50IGF0dGFja19sZW5ndGg7CisgICAgaW50IHJlbGVhc2VfbGVuZ3RoOworCisgICAgaW50NjRfdCBwdHM7CisgICAgZW51bSBGcmFtZVR5cGUgZnJhbWVfdHlwZTsKKyAgICBpbnQgYWJvdmVfdGhyZXNob2xkOworICAgIGludCBwcmV2X25iX3NhbXBsZXM7CisgICAgaW50IGNoYW5uZWxzOworCisgICAgRkZFQlVSMTI4U3RhdGUgKnIxMjhfaW47CisgICAgRkZFQlVSMTI4U3RhdGUgKnIxMjhfb3V0OworfSBMb3VkTm9ybUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKExvdWROb3JtQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBsb3Vkbm9ybV9vcHRpb25zW10gPSB7CisgICAgeyAiSSIsICAgICAgICAgICAgICAgICJzZXQgaW50ZWdyYXRlZCBsb3VkbmVzcyB0YXJnZXQiLCAgICBPRkZTRVQodGFyZ2V0X2kpLCAgICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgIHsuZGJsID0gLTI0Ln0sICAgLTcwLiwgICAgICAgLTUuLCAgRkxBR1MgfSwKKyAgICB7ICJpIiwgICAgICAgICAgICAgICAgInNldCBpbnRlZ3JhdGVkIGxvdWRuZXNzIHRhcmdldCIsICAgIE9GRlNFVCh0YXJnZXRfaSksICAgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgey5kYmwgPSAtMjQufSwgICAtNzAuLCAgICAgICAtNS4sICBGTEFHUyB9LAorICAgIHsgIkxSQSIsICAgICAgICAgICAgICAic2V0IGxvdWRuZXNzIHJhbmdlIHRhcmdldCIsICAgICAgICAgT0ZGU0VUKHRhcmdldF9scmEpLCAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICB7LmRibCA9ICA3Ln0sICAgICAxLiwgICAgICAgIDIwLiwgIEZMQUdTIH0sCisgICAgeyAibHJhIiwgICAgICAgICAgICAgICJzZXQgbG91ZG5lc3MgcmFuZ2UgdGFyZ2V0IiwgICAgICAgICBPRkZTRVQodGFyZ2V0X2xyYSksICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgIHsuZGJsID0gIDcufSwgICAgIDEuLCAgICAgICAgMjAuLCAgRkxBR1MgfSwKKyAgICB7ICJUUCIsICAgICAgICAgICAgICAgInNldCBtYXhpbXVtIHRydWUgcGVhayIsICAgICAgICAgICAgIE9GRlNFVCh0YXJnZXRfdHApLCAgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgey5kYmwgPSAtMi59LCAgICAtOS4sICAgICAgICAgMC4sICBGTEFHUyB9LAorICAgIHsgInRwIiwgICAgICAgICAgICAgICAic2V0IG1heGltdW0gdHJ1ZSBwZWFrIiwgICAgICAgICAgICAgT0ZGU0VUKHRhcmdldF90cCksICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICB7LmRibCA9IC0yLn0sICAgIC05LiwgICAgICAgICAwLiwgIEZMQUdTIH0sCisgICAgeyAibWVhc3VyZWRfSSIsICAgICAgICJtZWFzdXJlZCBJTCBvZiBpbnB1dCBmaWxlIiwgICAgICAgICBPRkZTRVQobWVhc3VyZWRfaSksICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgIHsuZGJsID0gIDAufSwgICAgLTk5LiwgICAgICAgIDAuLCAgRkxBR1MgfSwKKyAgICB7ICJtZWFzdXJlZF9pIiwgICAgICAgIm1lYXN1cmVkIElMIG9mIGlucHV0IGZpbGUiLCAgICAgICAgIE9GRlNFVChtZWFzdXJlZF9pKSwgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgey5kYmwgPSAgMC59LCAgICAtOTkuLCAgICAgICAgMC4sICBGTEFHUyB9LAorICAgIHsgIm1lYXN1cmVkX0xSQSIsICAgICAibWVhc3VyZWQgTFJBIG9mIGlucHV0IGZpbGUiLCAgICAgICAgT0ZGU0VUKG1lYXN1cmVkX2xyYSksICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICB7LmRibCA9ICAwLn0sICAgICAwLiwgICAgICAgIDk5LiwgIEZMQUdTIH0sCisgICAgeyAibWVhc3VyZWRfbHJhIiwgICAgICJtZWFzdXJlZCBMUkEgb2YgaW5wdXQgZmlsZSIsICAgICAgICBPRkZTRVQobWVhc3VyZWRfbHJhKSwgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgIHsuZGJsID0gIDAufSwgICAgIDAuLCAgICAgICAgOTkuLCAgRkxBR1MgfSwKKyAgICB7ICJtZWFzdXJlZF9UUCIsICAgICAgIm1lYXN1cmVkIHRydWUgcGVhayBvZiBpbnB1dCBmaWxlIiwgIE9GRlNFVChtZWFzdXJlZF90cCksICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgey5kYmwgPSAgOTkufSwgICAtOTkuLCAgICAgICA5OS4sICBGTEFHUyB9LAorICAgIHsgIm1lYXN1cmVkX3RwIiwgICAgICAibWVhc3VyZWQgdHJ1ZSBwZWFrIG9mIGlucHV0IGZpbGUiLCAgT0ZGU0VUKG1lYXN1cmVkX3RwKSwgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICB7LmRibCA9ICA5OS59LCAgIC05OS4sICAgICAgIDk5LiwgIEZMQUdTIH0sCisgICAgeyAibWVhc3VyZWRfdGhyZXNoIiwgICJtZWFzdXJlZCB0aHJlc2hvbGQgb2YgaW5wdXQgZmlsZSIsICBPRkZTRVQobWVhc3VyZWRfdGhyZXNoKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgIHsuZGJsID0gLTcwLn0sICAgLTk5LiwgICAgICAgIDAuLCAgRkxBR1MgfSwKKyAgICB7ICJvZmZzZXQiLCAgICAgICAgICAgInNldCBvZmZzZXQgZ2FpbiIsICAgICAgICAgICAgICAgICAgIE9GRlNFVChvZmZzZXQpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgey5kYmwgPSAgMC59LCAgICAtOTkuLCAgICAgICA5OS4sICBGTEFHUyB9LAorICAgIHsgImxpbmVhciIsICAgICAgICAgICAibm9ybWFsaXplIGxpbmVhcmx5IGlmIHBvc3NpYmxlIiwgICAgT0ZGU0VUKGxpbmVhciksICAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgICB7Lmk2NCA9ICAxfSwgICAgICAgIDAsICAgICAgICAgMSwgIEZMQUdTIH0sCisgICAgeyAiZHVhbF9tb25vIiwgICAgICAgICJ0cmVhdCBtb25vIGlucHV0IGFzIGR1YWwtbW9ubyIsICAgICBPRkZTRVQoZHVhbF9tb25vKSwgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgIHsuaTY0ID0gIDB9LCAgICAgICAgMCwgICAgICAgICAxLCAgRkxBR1MgfSwKKyAgICB7ICJwcmludF9mb3JtYXQiLCAgICAgInNldCBwcmludCBmb3JtYXQgZm9yIHN0YXRzIiwgICAgICAgIE9GRlNFVChwcmludF9mb3JtYXQpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgey5pNjQgPSAgTk9ORX0sICBOT05FLCAgUEZfTkIgLTEsICBGTEFHUywgInByaW50X2Zvcm1hdCIgfSwKKyAgICB7ICAgICAibm9uZSIsICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgey5pNjQgPSAgTk9ORX0sICAgICAwLCAgICAgICAgIDAsICBGTEFHUywgInByaW50X2Zvcm1hdCIgfSwKKyAgICB7ICAgICAianNvbiIsICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgey5pNjQgPSAgSlNPTn0sICAgICAwLCAgICAgICAgIDAsICBGTEFHUywgInByaW50X2Zvcm1hdCIgfSwKKyAgICB7ICAgICAic3VtbWFyeSIsICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgey5pNjQgPSAgU1VNTUFSWX0sICAwLCAgICAgICAgIDAsICBGTEFHUywgInByaW50X2Zvcm1hdCIgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGxvdWRub3JtKTsKKworc3RhdGljIGlubGluZSBpbnQgZnJhbWVfc2l6ZShpbnQgc2FtcGxlX3JhdGUsIGludCBmcmFtZV9sZW5fbXNlYykKK3sKKyAgICBjb25zdCBpbnQgZnJhbWVfc2l6ZSA9IHJvdW5kKChkb3VibGUpc2FtcGxlX3JhdGUgKiAoZnJhbWVfbGVuX21zZWMgLyAxMDAwLjApKTsKKyAgICByZXR1cm4gZnJhbWVfc2l6ZSArIChmcmFtZV9zaXplICUgMik7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfZ2F1c3NpYW5fZmlsdGVyKExvdWROb3JtQ29udGV4dCAqcykKK3sKKyAgICBkb3VibGUgdG90YWxfd2VpZ2h0ID0gMC4wOworICAgIGNvbnN0IGRvdWJsZSBzaWdtYSA9IDMuNTsKKyAgICBkb3VibGUgYWRqdXN0OworICAgIGludCBpOworCisgICAgY29uc3QgaW50IG9mZnNldCA9IDIxIC8gMjsKKyAgICBjb25zdCBkb3VibGUgYzEgPSAxLjAgLyAoc2lnbWEgKiBzcXJ0KDIuMCAqIE1fUEkpKTsKKyAgICBjb25zdCBkb3VibGUgYzIgPSAyLjAgKiBwb3coc2lnbWEsIDIuMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjE7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgeCA9IGkgLSBvZmZzZXQ7CisgICAgICAgIHMtPndlaWdodHNbaV0gPSBjMSAqIGV4cCgtKHBvdyh4LCAyLjApIC8gYzIpKTsKKyAgICAgICAgdG90YWxfd2VpZ2h0ICs9IHMtPndlaWdodHNbaV07CisgICAgfQorCisgICAgYWRqdXN0ID0gMS4wIC8gdG90YWxfd2VpZ2h0OworICAgIGZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKQorICAgICAgICBzLT53ZWlnaHRzW2ldICo9IGFkanVzdDsKK30KKworc3RhdGljIGRvdWJsZSBnYXVzc2lhbl9maWx0ZXIoTG91ZE5vcm1Db250ZXh0ICpzLCBpbnQgaW5kZXgpCit7CisgICAgZG91YmxlIHJlc3VsdCA9IDAuOworICAgIGludCBpOworCisgICAgaW5kZXggPSBpbmRleCAtIDEwID4gMCA/IGluZGV4IC0gMTAgOiBpbmRleCArIDIwOworICAgIGZvciAoaSA9IDA7IGkgPCAyMTsgaSsrKQorICAgICAgICByZXN1bHQgKz0gcy0+ZGVsdGFbKChpbmRleCArIGkpIDwgMzApID8gKGluZGV4ICsgaSkgOiAoaW5kZXggKyBpIC0gMzApXSAqIHMtPndlaWdodHNbaV07CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBkZXRlY3RfcGVhayhMb3VkTm9ybUNvbnRleHQgKnMsIGludCBvZmZzZXQsIGludCBuYl9zYW1wbGVzLCBpbnQgY2hhbm5lbHMsIGludCAqcGVha19kZWx0YSwgZG91YmxlICpwZWFrX3ZhbHVlKQoreworICAgIGludCBuLCBjLCBpLCBpbmRleDsKKyAgICBkb3VibGUgY2VpbGluZzsKKyAgICBkb3VibGUgKmJ1ZjsKKworICAgICpwZWFrX2RlbHRhID0gLTE7CisgICAgYnVmID0gcy0+bGltaXRlcl9idWY7CisgICAgY2VpbGluZyA9IHMtPnRhcmdldF90cDsKKworICAgIGluZGV4ID0gcy0+bGltaXRlcl9idWZfaW5kZXggKyAob2Zmc2V0ICogY2hhbm5lbHMpICsgKDE5MjAgKiBjaGFubmVscyk7CisgICAgaWYgKGluZGV4ID49IHMtPmxpbWl0ZXJfYnVmX3NpemUpCisgICAgICAgIGluZGV4IC09IHMtPmxpbWl0ZXJfYnVmX3NpemU7CisKKyAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBGSVJTVF9GUkFNRSkgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykKKyAgICAgICAgICAgIHMtPnByZXZfc21wW2NdID0gZmFicyhidWZbaW5kZXggKyBjIC0gY2hhbm5lbHNdKTsKKyAgICB9CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgbmJfc2FtcGxlczsgbisrKSB7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICBkb3VibGUgdGhpcywgbmV4dCwgbWF4X3BlYWs7CisKKyAgICAgICAgICAgIHRoaXMgPSBmYWJzKGJ1ZlsoaW5kZXggKyBjKSA8IHMtPmxpbWl0ZXJfYnVmX3NpemUgPyAoaW5kZXggKyBjKSA6IChpbmRleCArIGMgLSBzLT5saW1pdGVyX2J1Zl9zaXplKV0pOworICAgICAgICAgICAgbmV4dCA9IGZhYnMoYnVmWyhpbmRleCArIGMgKyBjaGFubmVscykgPCBzLT5saW1pdGVyX2J1Zl9zaXplID8gKGluZGV4ICsgYyArIGNoYW5uZWxzKSA6IChpbmRleCArIGMgKyBjaGFubmVscyAtIHMtPmxpbWl0ZXJfYnVmX3NpemUpXSk7CisKKyAgICAgICAgICAgIGlmICgocy0+cHJldl9zbXBbY10gPD0gdGhpcykgJiYgKG5leHQgPD0gdGhpcykgJiYgKHRoaXMgPiBjZWlsaW5nKSAmJiAobiA+IDApKSB7CisgICAgICAgICAgICAgICAgaW50IGRldGVjdGVkOworCisgICAgICAgICAgICAgICAgZGV0ZWN0ZWQgPSAxOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDI7IGkgPCAxMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBmYWJzKGJ1ZlsoaW5kZXggKyBjICsgKGkgKiBjaGFubmVscykpIDwgcy0+bGltaXRlcl9idWZfc2l6ZSA/IChpbmRleCArIGMgKyAoaSAqIGNoYW5uZWxzKSkgOiAoaW5kZXggKyBjICsgKGkgKiBjaGFubmVscykgLSBzLT5saW1pdGVyX2J1Zl9zaXplKV0pOworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA+IHRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFkZXRlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYyA9PSAwIHx8IGZhYnMoYnVmW2luZGV4ICsgY10pID4gbWF4X3BlYWspCisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcGVhayA9IGZhYnMoYnVmW2luZGV4ICsgY10pOworCisgICAgICAgICAgICAgICAgICAgIHMtPnByZXZfc21wW2NdID0gZmFicyhidWZbKGluZGV4ICsgYykgPCBzLT5saW1pdGVyX2J1Zl9zaXplID8gKGluZGV4ICsgYykgOiAoaW5kZXggKyBjIC0gcy0+bGltaXRlcl9idWZfc2l6ZSldKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqcGVha19kZWx0YSA9IG47CisgICAgICAgICAgICAgICAgcy0+cGVha19pbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgICpwZWFrX3ZhbHVlID0gbWF4X3BlYWs7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5wcmV2X3NtcFtjXSA9IHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBpbmRleCArPSBjaGFubmVsczsKKyAgICAgICAgaWYgKGluZGV4ID49IHMtPmxpbWl0ZXJfYnVmX3NpemUpCisgICAgICAgICAgICBpbmRleCAtPSBzLT5saW1pdGVyX2J1Zl9zaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdHJ1ZV9wZWFrX2xpbWl0ZXIoTG91ZE5vcm1Db250ZXh0ICpzLCBkb3VibGUgKm91dCwgaW50IG5iX3NhbXBsZXMsIGludCBjaGFubmVscykKK3sKKyAgICBpbnQgbiwgYywgaW5kZXgsIHBlYWtfZGVsdGEsIHNtcF9jbnQ7CisgICAgZG91YmxlIGNlaWxpbmcsIHBlYWtfdmFsdWU7CisgICAgZG91YmxlICpidWY7CisKKyAgICBidWYgPSBzLT5saW1pdGVyX2J1ZjsKKyAgICBjZWlsaW5nID0gcy0+dGFyZ2V0X3RwOworICAgIGluZGV4ID0gcy0+bGltaXRlcl9idWZfaW5kZXg7CisgICAgc21wX2NudCA9IDA7CisKKyAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBGSVJTVF9GUkFNRSkgeworICAgICAgICBkb3VibGUgbWF4OworCisgICAgICAgIG1heCA9IDAuOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMTkyMDsgbisrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgICBtYXggPSBmYWJzKGJ1ZltjXSkgPiBtYXggPyBmYWJzKGJ1ZltjXSkgOiBtYXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYgKz0gY2hhbm5lbHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF4ID4gY2VpbGluZykgeworICAgICAgICAgICAgcy0+Z2Fpbl9yZWR1Y3Rpb25bMV0gPSBjZWlsaW5nIC8gbWF4OworICAgICAgICAgICAgcy0+bGltaXRlcl9zdGF0ZSA9IFNVU1RBSU47CisgICAgICAgICAgICBidWYgPSBzLT5saW1pdGVyX2J1ZjsKKworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IDE5MjA7IG4rKykgeworICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlbnY7CisgICAgICAgICAgICAgICAgICAgIGVudiA9IHMtPmdhaW5fcmVkdWN0aW9uWzFdOworICAgICAgICAgICAgICAgICAgICBidWZbY10gKj0gZW52OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWYgKz0gY2hhbm5lbHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBidWYgPSBzLT5saW1pdGVyX2J1ZjsKKyAgICB9CisKKyAgICBkbyB7CisKKyAgICAgICAgc3dpdGNoKHMtPmxpbWl0ZXJfc3RhdGUpIHsKKyAgICAgICAgY2FzZSBPVVQ6CisgICAgICAgICAgICBkZXRlY3RfcGVhayhzLCBzbXBfY250LCBuYl9zYW1wbGVzIC0gc21wX2NudCwgY2hhbm5lbHMsICZwZWFrX2RlbHRhLCAmcGVha192YWx1ZSk7CisgICAgICAgICAgICBpZiAocGVha19kZWx0YSAhPSAtMSkgeworICAgICAgICAgICAgICAgIHMtPmVudl9jbnQgPSAwOworICAgICAgICAgICAgICAgIHNtcF9jbnQgKz0gKHBlYWtfZGVsdGEgLSBzLT5hdHRhY2tfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBzLT5nYWluX3JlZHVjdGlvblswXSA9IDEuOworICAgICAgICAgICAgICAgIHMtPmdhaW5fcmVkdWN0aW9uWzFdID0gY2VpbGluZyAvIHBlYWtfdmFsdWU7CisgICAgICAgICAgICAgICAgcy0+bGltaXRlcl9zdGF0ZSA9IEFUVEFDSzsKKworICAgICAgICAgICAgICAgIHMtPmVudl9pbmRleCA9IHMtPnBlYWtfaW5kZXggLSAocy0+YXR0YWNrX2xlbmd0aCAqIGNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+ZW52X2luZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcy0+ZW52X2luZGV4ICs9IHMtPmxpbWl0ZXJfYnVmX3NpemU7CisKKyAgICAgICAgICAgICAgICBzLT5lbnZfaW5kZXggKz0gKHMtPmVudl9jbnQgKiBjaGFubmVscyk7CisgICAgICAgICAgICAgICAgaWYgKHMtPmVudl9pbmRleCA+IHMtPmxpbWl0ZXJfYnVmX3NpemUpCisgICAgICAgICAgICAgICAgICAgIHMtPmVudl9pbmRleCAtPSBzLT5saW1pdGVyX2J1Zl9zaXplOworCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNtcF9jbnQgPSBuYl9zYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBBVFRBQ0s6CisgICAgICAgICAgICBmb3IgKDsgcy0+ZW52X2NudCA8IHMtPmF0dGFja19sZW5ndGg7IHMtPmVudl9jbnQrKykgeworICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlbnY7CisgICAgICAgICAgICAgICAgICAgIGVudiA9IHMtPmdhaW5fcmVkdWN0aW9uWzBdIC0gKChkb3VibGUpIHMtPmVudl9jbnQgLyAocy0+YXR0YWNrX2xlbmd0aCAtIDEpICogKHMtPmdhaW5fcmVkdWN0aW9uWzBdIC0gcy0+Z2Fpbl9yZWR1Y3Rpb25bMV0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmW3MtPmVudl9pbmRleCArIGNdICo9IGVudjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzLT5lbnZfaW5kZXggKz0gY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgaWYgKHMtPmVudl9pbmRleCA+PSBzLT5saW1pdGVyX2J1Zl9zaXplKQorICAgICAgICAgICAgICAgICAgICBzLT5lbnZfaW5kZXggLT0gcy0+bGltaXRlcl9idWZfc2l6ZTsKKworICAgICAgICAgICAgICAgIHNtcF9jbnQrKzsKKyAgICAgICAgICAgICAgICBpZiAoc21wX2NudCA+PSBuYl9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmVudl9jbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc21wX2NudCA8IG5iX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICBzLT5lbnZfY250ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5hdHRhY2tfbGVuZ3RoID0gMTkyMDsKKyAgICAgICAgICAgICAgICBzLT5saW1pdGVyX3N0YXRlID0gU1VTVEFJTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1VTVEFJTjoKKyAgICAgICAgICAgIGRldGVjdF9wZWFrKHMsIHNtcF9jbnQsIG5iX3NhbXBsZXMsIGNoYW5uZWxzLCAmcGVha19kZWx0YSwgJnBlYWtfdmFsdWUpOworICAgICAgICAgICAgaWYgKHBlYWtfZGVsdGEgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBzLT5saW1pdGVyX3N0YXRlID0gUkVMRUFTRTsKKyAgICAgICAgICAgICAgICBzLT5nYWluX3JlZHVjdGlvblswXSA9IHMtPmdhaW5fcmVkdWN0aW9uWzFdOworICAgICAgICAgICAgICAgIHMtPmdhaW5fcmVkdWN0aW9uWzFdID0gMS47CisgICAgICAgICAgICAgICAgcy0+ZW52X2NudCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRvdWJsZSBnYWluX3JlZHVjdGlvbjsKKyAgICAgICAgICAgICAgICBnYWluX3JlZHVjdGlvbiA9IGNlaWxpbmcgLyBwZWFrX3ZhbHVlOworCisgICAgICAgICAgICAgICAgaWYgKGdhaW5fcmVkdWN0aW9uIDwgcy0+Z2Fpbl9yZWR1Y3Rpb25bMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+bGltaXRlcl9zdGF0ZSA9IEFUVEFDSzsKKworICAgICAgICAgICAgICAgICAgICBzLT5hdHRhY2tfbGVuZ3RoID0gcGVha19kZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmF0dGFja19sZW5ndGggPD0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmF0dGFja19sZW5ndGggPSAgMjsKKworICAgICAgICAgICAgICAgICAgICBzLT5nYWluX3JlZHVjdGlvblswXSA9IHMtPmdhaW5fcmVkdWN0aW9uWzFdOworICAgICAgICAgICAgICAgICAgICBzLT5nYWluX3JlZHVjdGlvblsxXSA9IGdhaW5fcmVkdWN0aW9uOworICAgICAgICAgICAgICAgICAgICBzLT5lbnZfY250ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChzLT5lbnZfY250ID0gMDsgcy0+ZW52X2NudCA8IHBlYWtfZGVsdGE7IHMtPmVudl9jbnQrKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGVudjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IHMtPmdhaW5fcmVkdWN0aW9uWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmW3MtPmVudl9pbmRleCArIGNdICo9IGVudjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHMtPmVudl9pbmRleCArPSBjaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPmVudl9pbmRleCA+PSBzLT5saW1pdGVyX2J1Zl9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZW52X2luZGV4IC09IHMtPmxpbWl0ZXJfYnVmX3NpemU7CisKKyAgICAgICAgICAgICAgICAgICAgc21wX2NudCsrOworICAgICAgICAgICAgICAgICAgICBpZiAoc21wX2NudCA+PSBuYl9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzLT5lbnZfY250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgUkVMRUFTRToKKyAgICAgICAgICAgIGZvciAoOyBzLT5lbnZfY250IDwgcy0+cmVsZWFzZV9sZW5ndGg7IHMtPmVudl9jbnQrKykgeworICAgICAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlbnY7CisgICAgICAgICAgICAgICAgICAgIGVudiA9IHMtPmdhaW5fcmVkdWN0aW9uWzBdICsgKCgoZG91YmxlKSBzLT5lbnZfY250IC8gKHMtPnJlbGVhc2VfbGVuZ3RoIC0gMSkpICogKHMtPmdhaW5fcmVkdWN0aW9uWzFdIC0gcy0+Z2Fpbl9yZWR1Y3Rpb25bMF0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmW3MtPmVudl9pbmRleCArIGNdICo9IGVudjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzLT5lbnZfaW5kZXggKz0gY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgaWYgKHMtPmVudl9pbmRleCA+PSBzLT5saW1pdGVyX2J1Zl9zaXplKQorICAgICAgICAgICAgICAgICAgICBzLT5lbnZfaW5kZXggLT0gcy0+bGltaXRlcl9idWZfc2l6ZTsKKworICAgICAgICAgICAgICAgIHNtcF9jbnQrKzsKKyAgICAgICAgICAgICAgICBpZiAoc21wX2NudCA+PSBuYl9zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmVudl9jbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc21wX2NudCA8IG5iX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICBzLT5lbnZfY250ID0gMDsKKyAgICAgICAgICAgICAgICBzLT5saW1pdGVyX3N0YXRlID0gT1VUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoc21wX2NudCA8IG5iX3NhbXBsZXMpOworCisgICAgZm9yIChuID0gMDsgbiA8IG5iX3NhbXBsZXM7IG4rKykgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgb3V0W2NdID0gYnVmW2luZGV4ICsgY107CisgICAgICAgICAgICBpZiAoZmFicyhvdXRbY10pID4gY2VpbGluZykgeworICAgICAgICAgICAgICAgIG91dFtjXSA9IGNlaWxpbmcgKiAob3V0W2NdIDwgMCA/IC0xIDogMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3V0ICs9IGNoYW5uZWxzOworICAgICAgICBpbmRleCArPSBjaGFubmVsczsKKyAgICAgICAgaWYgKGluZGV4ID49IHMtPmxpbWl0ZXJfYnVmX3NpemUpCisgICAgICAgICAgICBpbmRleCAtPSBzLT5saW1pdGVyX2J1Zl9zaXplOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTG91ZE5vcm1Db250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgY29uc3QgZG91YmxlICpzcmM7CisgICAgZG91YmxlICpkc3Q7CisgICAgZG91YmxlICpidWY7CisgICAgZG91YmxlICpsaW1pdGVyX2J1ZjsKKyAgICBpbnQgaSwgbiwgYywgc3ViZnJhbWVfbGVuZ3RoLCBzcmNfaW5kZXg7CisgICAgZG91YmxlIGdhaW4sIGdhaW5fbmV4dCwgZW52X2dsb2JhbCwgZW52X3Nob3J0dGVybSwKKyAgICBnbG9iYWwsIHNob3J0dGVybSwgbHJhLCByZWxhdGl2ZV90aHJlc2hvbGQ7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIGlmIChzLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHMtPnB0cyA9IGluLT5wdHM7CisKKyAgICBvdXQtPnB0cyA9IHMtPnB0czsKKyAgICBzcmMgPSAoY29uc3QgZG91YmxlICopaW4tPmRhdGFbMF07CisgICAgZHN0ID0gKGRvdWJsZSAqKW91dC0+ZGF0YVswXTsKKyAgICBidWYgPSBzLT5idWY7CisgICAgbGltaXRlcl9idWYgPSBzLT5saW1pdGVyX2J1ZjsKKworICAgIGZmX2VidXIxMjhfYWRkX2ZyYW1lc19kb3VibGUocy0+cjEyOF9pbiwgc3JjLCBpbi0+bmJfc2FtcGxlcyk7CisKKyAgICBpZiAocy0+ZnJhbWVfdHlwZSA9PSBGSVJTVF9GUkFNRSAmJiBpbi0+bmJfc2FtcGxlcyA8IGZyYW1lX3NpemUoaW5saW5rLT5zYW1wbGVfcmF0ZSwgMzAwMCkpIHsKKyAgICAgICAgZG91YmxlIG9mZnNldCwgb2Zmc2V0X3RwLCB0cnVlX3BlYWs7CisKKyAgICAgICAgZmZfZWJ1cjEyOF9sb3VkbmVzc19nbG9iYWwocy0+cjEyOF9pbiwgJmdsb2JhbCk7CisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSB0bXA7CisgICAgICAgICAgICBmZl9lYnVyMTI4X3NhbXBsZV9wZWFrKHMtPnIxMjhfaW4sIGMsICZ0bXApOworICAgICAgICAgICAgaWYgKGMgPT0gMCB8fCB0bXAgPiB0cnVlX3BlYWspCisgICAgICAgICAgICAgICAgdHJ1ZV9wZWFrID0gdG1wOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0ICAgID0gcy0+dGFyZ2V0X2kgLSBnbG9iYWw7CisgICAgICAgIG9mZnNldF90cCA9IHRydWVfcGVhayArIG9mZnNldDsKKyAgICAgICAgcy0+b2Zmc2V0ID0gb2Zmc2V0X3RwIDwgcy0+dGFyZ2V0X3RwID8gb2Zmc2V0IDogcy0+dGFyZ2V0X3RwIC0gdHJ1ZV9wZWFrOworICAgICAgICBzLT5vZmZzZXQgPSBwb3coMTAuLCBzLT5vZmZzZXQgLyAyMC4pOworICAgICAgICBzLT5mcmFtZV90eXBlID0gTElORUFSX01PREU7CisgICAgfQorCisgICAgc3dpdGNoIChzLT5mcmFtZV90eXBlKSB7CisgICAgY2FzZSBGSVJTVF9GUkFNRToKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IGluLT5uYl9zYW1wbGVzOyBuKyspIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgICAgICBidWZbcy0+YnVmX2luZGV4ICsgY10gPSBzcmNbY107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgKz0gaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgICAgIHMtPmJ1Zl9pbmRleCArPSBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICB9CisKKyAgICAgICAgZmZfZWJ1cjEyOF9sb3VkbmVzc19zaG9ydHRlcm0ocy0+cjEyOF9pbiwgJnNob3J0dGVybSk7CisKKyAgICAgICAgaWYgKHNob3J0dGVybSA8IHMtPm1lYXN1cmVkX3RocmVzaCkgeworICAgICAgICAgICAgcy0+YWJvdmVfdGhyZXNob2xkID0gMDsKKyAgICAgICAgICAgIGVudl9zaG9ydHRlcm0gPSBzaG9ydHRlcm0gPD0gLTcwLiA/IDAuIDogcy0+dGFyZ2V0X2kgLSBzLT5tZWFzdXJlZF9pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+YWJvdmVfdGhyZXNob2xkID0gMTsKKyAgICAgICAgICAgIGVudl9zaG9ydHRlcm0gPSBzaG9ydHRlcm0gPD0gLTcwLiA/IDAuIDogcy0+dGFyZ2V0X2kgLSBzaG9ydHRlcm07CisgICAgICAgIH0KKworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMzA7IG4rKykKKyAgICAgICAgICAgIHMtPmRlbHRhW25dID0gcG93KDEwLiwgZW52X3Nob3J0dGVybSAvIDIwLik7CisgICAgICAgIHMtPnByZXZfZGVsdGEgPSBzLT5kZWx0YVtzLT5pbmRleF07CisKKyAgICAgICAgcy0+YnVmX2luZGV4ID0KKyAgICAgICAgcy0+bGltaXRlcl9idWZfaW5kZXggPSAwOworCisgICAgICAgIGZvciAobiA9IDA7IG4gPCAocy0+bGltaXRlcl9idWZfc2l6ZSAvIGlubGluay0+Y2hhbm5lbHMpOyBuKyspIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgICAgICBsaW1pdGVyX2J1ZltzLT5saW1pdGVyX2J1Zl9pbmRleCArIGNdID0gYnVmW3MtPmJ1Zl9pbmRleCArIGNdICogcy0+ZGVsdGFbcy0+aW5kZXhdICogcy0+b2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+bGltaXRlcl9idWZfaW5kZXggKz0gaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgICAgIGlmIChzLT5saW1pdGVyX2J1Zl9pbmRleCA+PSBzLT5saW1pdGVyX2J1Zl9zaXplKQorICAgICAgICAgICAgICAgIHMtPmxpbWl0ZXJfYnVmX2luZGV4IC09IHMtPmxpbWl0ZXJfYnVmX3NpemU7CisKKyAgICAgICAgICAgIHMtPmJ1Zl9pbmRleCArPSBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICB9CisKKyAgICAgICAgc3ViZnJhbWVfbGVuZ3RoID0gZnJhbWVfc2l6ZShpbmxpbmstPnNhbXBsZV9yYXRlLCAxMDApOworICAgICAgICB0cnVlX3BlYWtfbGltaXRlcihzLCBkc3QsIHN1YmZyYW1lX2xlbmd0aCwgaW5saW5rLT5jaGFubmVscyk7CisgICAgICAgIGZmX2VidXIxMjhfYWRkX2ZyYW1lc19kb3VibGUocy0+cjEyOF9vdXQsIGRzdCwgc3ViZnJhbWVfbGVuZ3RoKTsKKworICAgICAgICBzLT5wdHMgKz0KKyAgICAgICAgb3V0LT5uYl9zYW1wbGVzID0KKyAgICAgICAgaW5saW5rLT5taW5fc2FtcGxlcyA9CisgICAgICAgIGlubGluay0+bWF4X3NhbXBsZXMgPQorICAgICAgICBpbmxpbmstPnBhcnRpYWxfYnVmX3NpemUgPSBzdWJmcmFtZV9sZW5ndGg7CisKKyAgICAgICAgcy0+ZnJhbWVfdHlwZSA9IElOTkVSX0ZSQU1FOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSU5ORVJfRlJBTUU6CisgICAgICAgIGdhaW4gICAgICA9IGdhdXNzaWFuX2ZpbHRlcihzLCBzLT5pbmRleCArIDEwIDwgMzAgPyBzLT5pbmRleCArIDEwIDogcy0+aW5kZXggKyAxMCAtIDMwKTsKKyAgICAgICAgZ2Fpbl9uZXh0ID0gZ2F1c3NpYW5fZmlsdGVyKHMsIHMtPmluZGV4ICsgMTEgPCAzMCA/IHMtPmluZGV4ICsgMTEgOiBzLT5pbmRleCArIDExIC0gMzApOworCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBpbi0+bmJfc2FtcGxlczsgbisrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgaW5saW5rLT5jaGFubmVsczsgYysrKSB7CisgICAgICAgICAgICAgICAgYnVmW3MtPnByZXZfYnVmX2luZGV4ICsgY10gPSBzcmNbY107CisgICAgICAgICAgICAgICAgbGltaXRlcl9idWZbcy0+bGltaXRlcl9idWZfaW5kZXggKyBjXSA9IGJ1ZltzLT5idWZfaW5kZXggKyBjXSAqIChnYWluICsgKCgoZG91YmxlKSBuIC8gaW4tPm5iX3NhbXBsZXMpICogKGdhaW5fbmV4dCAtIGdhaW4pKSkgKiBzLT5vZmZzZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgKz0gaW5saW5rLT5jaGFubmVsczsKKworICAgICAgICAgICAgcy0+bGltaXRlcl9idWZfaW5kZXggKz0gaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgICAgIGlmIChzLT5saW1pdGVyX2J1Zl9pbmRleCA+PSBzLT5saW1pdGVyX2J1Zl9zaXplKQorICAgICAgICAgICAgICAgIHMtPmxpbWl0ZXJfYnVmX2luZGV4IC09IHMtPmxpbWl0ZXJfYnVmX3NpemU7CisKKyAgICAgICAgICAgIHMtPnByZXZfYnVmX2luZGV4ICs9IGlubGluay0+Y2hhbm5lbHM7CisgICAgICAgICAgICBpZiAocy0+cHJldl9idWZfaW5kZXggPj0gcy0+YnVmX3NpemUpCisgICAgICAgICAgICAgICAgcy0+cHJldl9idWZfaW5kZXggLT0gcy0+YnVmX3NpemU7CisKKyAgICAgICAgICAgIHMtPmJ1Zl9pbmRleCArPSBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICAgICAgaWYgKHMtPmJ1Zl9pbmRleCA+PSBzLT5idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICBzLT5idWZfaW5kZXggLT0gcy0+YnVmX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBzdWJmcmFtZV9sZW5ndGggPSAoZnJhbWVfc2l6ZShpbmxpbmstPnNhbXBsZV9yYXRlLCAxMDApIC0gaW4tPm5iX3NhbXBsZXMpICogaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgcy0+bGltaXRlcl9idWZfaW5kZXggPSBzLT5saW1pdGVyX2J1Zl9pbmRleCArIHN1YmZyYW1lX2xlbmd0aCA8IHMtPmxpbWl0ZXJfYnVmX3NpemUgPyBzLT5saW1pdGVyX2J1Zl9pbmRleCArIHN1YmZyYW1lX2xlbmd0aCA6IHMtPmxpbWl0ZXJfYnVmX2luZGV4ICsgc3ViZnJhbWVfbGVuZ3RoIC0gcy0+bGltaXRlcl9idWZfc2l6ZTsKKworICAgICAgICB0cnVlX3BlYWtfbGltaXRlcihzLCBkc3QsIGluLT5uYl9zYW1wbGVzLCBpbmxpbmstPmNoYW5uZWxzKTsKKyAgICAgICAgZmZfZWJ1cjEyOF9hZGRfZnJhbWVzX2RvdWJsZShzLT5yMTI4X291dCwgZHN0LCBpbi0+bmJfc2FtcGxlcyk7CisKKyAgICAgICAgZmZfZWJ1cjEyOF9sb3VkbmVzc19yYW5nZShzLT5yMTI4X2luLCAmbHJhKTsKKyAgICAgICAgZmZfZWJ1cjEyOF9sb3VkbmVzc19nbG9iYWwocy0+cjEyOF9pbiwgJmdsb2JhbCk7CisgICAgICAgIGZmX2VidXIxMjhfbG91ZG5lc3Nfc2hvcnR0ZXJtKHMtPnIxMjhfaW4sICZzaG9ydHRlcm0pOworICAgICAgICBmZl9lYnVyMTI4X3JlbGF0aXZlX3RocmVzaG9sZChzLT5yMTI4X2luLCAmcmVsYXRpdmVfdGhyZXNob2xkKTsKKworICAgICAgICBpZiAocy0+YWJvdmVfdGhyZXNob2xkID09IDApIHsKKyAgICAgICAgICAgIGRvdWJsZSBzaG9ydHRlcm1fb3V0OworCisgICAgICAgICAgICBpZiAoc2hvcnR0ZXJtID4gcy0+bWVhc3VyZWRfdGhyZXNoKQorICAgICAgICAgICAgICAgIHMtPnByZXZfZGVsdGEgKj0gMS4wMDU4OworCisgICAgICAgICAgICBmZl9lYnVyMTI4X2xvdWRuZXNzX3Nob3J0dGVybShzLT5yMTI4X291dCwgJnNob3J0dGVybV9vdXQpOworICAgICAgICAgICAgaWYgKHNob3J0dGVybV9vdXQgPj0gcy0+dGFyZ2V0X2kpCisgICAgICAgICAgICAgICAgcy0+YWJvdmVfdGhyZXNob2xkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaG9ydHRlcm0gPCByZWxhdGl2ZV90aHJlc2hvbGQgfHwgc2hvcnR0ZXJtIDw9IC03MC4gfHwgcy0+YWJvdmVfdGhyZXNob2xkID09IDApIHsKKyAgICAgICAgICAgIHMtPmRlbHRhW3MtPmluZGV4XSA9IHMtPnByZXZfZGVsdGE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbnZfZ2xvYmFsID0gZmFicyhzaG9ydHRlcm0gLSBnbG9iYWwpIDwgKHMtPnRhcmdldF9scmEgLyAyLikgPyBzaG9ydHRlcm0gLSBnbG9iYWwgOiAocy0+dGFyZ2V0X2xyYSAvIDIuKSAqICgoc2hvcnR0ZXJtIC0gZ2xvYmFsKSA8IDAgPyAtMSA6IDEpOworICAgICAgICAgICAgZW52X3Nob3J0dGVybSA9IHMtPnRhcmdldF9pIC0gc2hvcnR0ZXJtOworICAgICAgICAgICAgcy0+ZGVsdGFbcy0+aW5kZXhdID0gcG93KDEwLiwgKGVudl9nbG9iYWwgKyBlbnZfc2hvcnR0ZXJtKSAvIDIwLik7CisgICAgICAgIH0KKworICAgICAgICBzLT5wcmV2X2RlbHRhID0gcy0+ZGVsdGFbcy0+aW5kZXhdOworICAgICAgICBzLT5pbmRleCsrOworICAgICAgICBpZiAocy0+aW5kZXggPj0gMzApCisgICAgICAgICAgICBzLT5pbmRleCAtPSAzMDsKKyAgICAgICAgcy0+cHJldl9uYl9zYW1wbGVzID0gaW4tPm5iX3NhbXBsZXM7CisgICAgICAgIHMtPnB0cyArPSBpbi0+bmJfc2FtcGxlczsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZJTkFMX0ZSQU1FOgorICAgICAgICBnYWluID0gZ2F1c3NpYW5fZmlsdGVyKHMsIHMtPmluZGV4ICsgMTAgPCAzMCA/IHMtPmluZGV4ICsgMTAgOiBzLT5pbmRleCArIDEwIC0gMzApOworICAgICAgICBzLT5saW1pdGVyX2J1Zl9pbmRleCA9IDA7CisgICAgICAgIHNyY19pbmRleCA9IDA7CisKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IHMtPmxpbWl0ZXJfYnVmX3NpemUgLyBpbmxpbmstPmNoYW5uZWxzOyBuKyspIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgICAgICBzLT5saW1pdGVyX2J1ZltzLT5saW1pdGVyX2J1Zl9pbmRleCArIGNdID0gc3JjW3NyY19pbmRleCArIGNdICogZ2FpbiAqIHMtPm9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyY19pbmRleCArPSBpbmxpbmstPmNoYW5uZWxzOworCisgICAgICAgICAgICBzLT5saW1pdGVyX2J1Zl9pbmRleCArPSBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICAgICAgaWYgKHMtPmxpbWl0ZXJfYnVmX2luZGV4ID49IHMtPmxpbWl0ZXJfYnVmX3NpemUpCisgICAgICAgICAgICAgICAgcy0+bGltaXRlcl9idWZfaW5kZXggLT0gcy0+bGltaXRlcl9idWZfc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN1YmZyYW1lX2xlbmd0aCA9IGZyYW1lX3NpemUoaW5saW5rLT5zYW1wbGVfcmF0ZSwgMTAwKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluLT5uYl9zYW1wbGVzIC8gc3ViZnJhbWVfbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRydWVfcGVha19saW1pdGVyKHMsIGRzdCwgc3ViZnJhbWVfbGVuZ3RoLCBpbmxpbmstPmNoYW5uZWxzKTsKKworICAgICAgICAgICAgZm9yIChuID0gMDsgbiA8IHN1YmZyYW1lX2xlbmd0aDsgbisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGlubGluay0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3JjX2luZGV4IDwgKGluLT5uYl9zYW1wbGVzICogaW5saW5rLT5jaGFubmVscykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ZXJfYnVmW3MtPmxpbWl0ZXJfYnVmX2luZGV4ICsgY10gPSBzcmNbc3JjX2luZGV4ICsgY10gKiBnYWluICogcy0+b2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRlcl9idWZbcy0+bGltaXRlcl9idWZfaW5kZXggKyBjXSA9IDAuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHNyY19pbmRleCA8IChpbi0+bmJfc2FtcGxlcyAqIGlubGluay0+Y2hhbm5lbHMpKQorICAgICAgICAgICAgICAgICAgICBzcmNfaW5kZXggKz0gaW5saW5rLT5jaGFubmVsczsKKworICAgICAgICAgICAgICAgIHMtPmxpbWl0ZXJfYnVmX2luZGV4ICs9IGlubGluay0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgaWYgKHMtPmxpbWl0ZXJfYnVmX2luZGV4ID49IHMtPmxpbWl0ZXJfYnVmX3NpemUpCisgICAgICAgICAgICAgICAgICAgIHMtPmxpbWl0ZXJfYnVmX2luZGV4IC09IHMtPmxpbWl0ZXJfYnVmX3NpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdCArPSAoc3ViZnJhbWVfbGVuZ3RoICogaW5saW5rLT5jaGFubmVscyk7CisgICAgICAgIH0KKworICAgICAgICBkc3QgPSAoZG91YmxlICopb3V0LT5kYXRhWzBdOworICAgICAgICBmZl9lYnVyMTI4X2FkZF9mcmFtZXNfZG91YmxlKHMtPnIxMjhfb3V0LCBkc3QsIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExJTkVBUl9NT0RFOgorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgaW4tPm5iX3NhbXBsZXM7IG4rKykgeworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGlubGluay0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgICAgIGRzdFtjXSA9IHNyY1tjXSAqIHMtPm9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyYyArPSBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICAgICAgZHN0ICs9IGlubGluay0+Y2hhbm5lbHM7CisgICAgICAgIH0KKworICAgICAgICBkc3QgPSAoZG91YmxlICopb3V0LT5kYXRhWzBdOworICAgICAgICBmZl9lYnVyMTI4X2FkZF9mcmFtZXNfZG91YmxlKHMtPnIxMjhfb3V0LCBkc3QsIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgcy0+cHRzICs9IGluLT5uYl9zYW1wbGVzOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaW4gIT0gb3V0KQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgaW50IHJldDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIExvdWROb3JtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIHMtPmZyYW1lX3R5cGUgPT0gSU5ORVJfRlJBTUUpIHsKKyAgICAgICAgZG91YmxlICpzcmM7CisgICAgICAgIGRvdWJsZSAqYnVmOworICAgICAgICBpbnQgbmJfc2FtcGxlcywgbiwgYywgb2Zmc2V0OworICAgICAgICBBVkZyYW1lICpmcmFtZTsKKworICAgICAgICBuYl9zYW1wbGVzICA9IChzLT5idWZfc2l6ZSAvIGlubGluay0+Y2hhbm5lbHMpIC0gcy0+cHJldl9uYl9zYW1wbGVzOworICAgICAgICBuYl9zYW1wbGVzIC09IChmcmFtZV9zaXplKGlubGluay0+c2FtcGxlX3JhdGUsIDEwMCkgLSBzLT5wcmV2X25iX3NhbXBsZXMpOworCisgICAgICAgIGZyYW1lID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gbmJfc2FtcGxlczsKKworICAgICAgICBidWYgPSBzLT5idWY7CisgICAgICAgIHNyYyA9IChkb3VibGUgKilmcmFtZS0+ZGF0YVswXTsKKworICAgICAgICBvZmZzZXQgID0gKChzLT5saW1pdGVyX2J1Zl9zaXplIC8gaW5saW5rLT5jaGFubmVscykgLSBzLT5wcmV2X25iX3NhbXBsZXMpICogaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgb2Zmc2V0IC09IChmcmFtZV9zaXplKGlubGluay0+c2FtcGxlX3JhdGUsIDEwMCkgLSBzLT5wcmV2X25iX3NhbXBsZXMpICogaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgcy0+YnVmX2luZGV4ID0gcy0+YnVmX2luZGV4IC0gb2Zmc2V0IDwgMCA/IHMtPmJ1Zl9pbmRleCAtIG9mZnNldCArIHMtPmJ1Zl9zaXplIDogcy0+YnVmX2luZGV4IC0gb2Zmc2V0OworCisgICAgICAgIGZvciAobiA9IDA7IG4gPCBuYl9zYW1wbGVzOyBuKyspIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgICAgICBzcmNbY10gPSBidWZbcy0+YnVmX2luZGV4ICsgY107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmMgKz0gaW5saW5rLT5jaGFubmVsczsKKyAgICAgICAgICAgIHMtPmJ1Zl9pbmRleCArPSBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICAgICAgaWYgKHMtPmJ1Zl9pbmRleCA+PSBzLT5idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICBzLT5idWZfaW5kZXggLT0gcy0+YnVmX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBzLT5mcmFtZV90eXBlID0gRklOQUxfRlJBTUU7CisgICAgICAgIHJldCA9IGZpbHRlcl9mcmFtZShpbmxpbmssIGZyYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExvdWROb3JtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGlucHV0X3NyYXRlW10gPSB7MTkyMDAwLCAtMX07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkwsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH07CisgICAgaW50IHJldDsKKworICAgIGxheW91dHMgPSBmZl9hbGxfY2hhbm5lbF9jb3VudHMoKTsKKyAgICBpZiAoIWxheW91dHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0ID0gZmZfc2V0X2NvbW1vbl9jaGFubmVsX2xheW91dHMoY3R4LCBsYXlvdXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHNhbXBsZV9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0ID0gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocy0+ZnJhbWVfdHlwZSAhPSBMSU5FQVJfTU9ERSkgeworICAgICAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChpbnB1dF9zcmF0ZSk7CisgICAgICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldCA9IGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9zYW1wbGVyYXRlcyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0ID0gZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJm91dGxpbmstPmluX3NhbXBsZXJhdGVzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIExvdWROb3JtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPnIxMjhfaW4gPSBmZl9lYnVyMTI4X2luaXQoaW5saW5rLT5jaGFubmVscywgaW5saW5rLT5zYW1wbGVfcmF0ZSwgMCwgRkZfRUJVUjEyOF9NT0RFX0kgfCBGRl9FQlVSMTI4X01PREVfUyB8IEZGX0VCVVIxMjhfTU9ERV9MUkEgfCBGRl9FQlVSMTI4X01PREVfU0FNUExFX1BFQUspOworICAgIGlmICghcy0+cjEyOF9pbikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPnIxMjhfb3V0ID0gZmZfZWJ1cjEyOF9pbml0KGlubGluay0+Y2hhbm5lbHMsIGlubGluay0+c2FtcGxlX3JhdGUsIDAsIEZGX0VCVVIxMjhfTU9ERV9JIHwgRkZfRUJVUjEyOF9NT0RFX1MgfCBGRl9FQlVSMTI4X01PREVfTFJBIHwgRkZfRUJVUjEyOF9NT0RFX1NBTVBMRV9QRUFLKTsKKyAgICBpZiAoIXMtPnIxMjhfb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKGlubGluay0+Y2hhbm5lbHMgPT0gMSAmJiBzLT5kdWFsX21vbm8pIHsKKyAgICAgICAgZmZfZWJ1cjEyOF9zZXRfY2hhbm5lbChzLT5yMTI4X2luLCAgMCwgRkZfRUJVUjEyOF9EVUFMX01PTk8pOworICAgICAgICBmZl9lYnVyMTI4X3NldF9jaGFubmVsKHMtPnIxMjhfb3V0LCAwLCBGRl9FQlVSMTI4X0RVQUxfTU9OTyk7CisgICAgfQorCisgICAgcy0+YnVmX3NpemUgPSBmcmFtZV9zaXplKGlubGluay0+c2FtcGxlX3JhdGUsIDMwMDApICogaW5saW5rLT5jaGFubmVsczsKKyAgICBzLT5idWYgPSBhdl9tYWxsb2NfYXJyYXkocy0+YnVmX3NpemUsIHNpemVvZigqcy0+YnVmKSk7CisgICAgaWYgKCFzLT5idWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5saW1pdGVyX2J1Zl9zaXplID0gZnJhbWVfc2l6ZShpbmxpbmstPnNhbXBsZV9yYXRlLCAyMTApICogaW5saW5rLT5jaGFubmVsczsKKyAgICBzLT5saW1pdGVyX2J1ZiA9IGF2X21hbGxvY19hcnJheShzLT5idWZfc2l6ZSwgc2l6ZW9mKCpzLT5saW1pdGVyX2J1ZikpOworICAgIGlmICghcy0+bGltaXRlcl9idWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5wcmV2X3NtcCA9IGF2X21hbGxvY19hcnJheShpbmxpbmstPmNoYW5uZWxzLCBzaXplb2YoKnMtPnByZXZfc21wKSk7CisgICAgaWYgKCFzLT5wcmV2X3NtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGluaXRfZ2F1c3NpYW5fZmlsdGVyKHMpOworCisgICAgaWYgKHMtPmZyYW1lX3R5cGUgIT0gTElORUFSX01PREUpIHsKKyAgICAgICAgaW5saW5rLT5taW5fc2FtcGxlcyA9CisgICAgICAgIGlubGluay0+bWF4X3NhbXBsZXMgPQorICAgICAgICBpbmxpbmstPnBhcnRpYWxfYnVmX3NpemUgPSBmcmFtZV9zaXplKGlubGluay0+c2FtcGxlX3JhdGUsIDMwMDApOworICAgIH0KKworICAgIHMtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIHMtPmJ1Zl9pbmRleCA9CisgICAgcy0+cHJldl9idWZfaW5kZXggPQorICAgIHMtPmxpbWl0ZXJfYnVmX2luZGV4ID0gMDsKKyAgICBzLT5jaGFubmVscyA9IGlubGluay0+Y2hhbm5lbHM7CisgICAgcy0+aW5kZXggPSAxOworICAgIHMtPmxpbWl0ZXJfc3RhdGUgPSBPVVQ7CisgICAgcy0+b2Zmc2V0ID0gcG93KDEwLiwgcy0+b2Zmc2V0IC8gMjAuKTsKKyAgICBzLT50YXJnZXRfdHAgPSBwb3coMTAuLCBzLT50YXJnZXRfdHAgLyAyMC4pOworICAgIHMtPmF0dGFja19sZW5ndGggPSBmcmFtZV9zaXplKGlubGluay0+c2FtcGxlX3JhdGUsIDEwKTsKKyAgICBzLT5yZWxlYXNlX2xlbmd0aCA9IGZyYW1lX3NpemUoaW5saW5rLT5zYW1wbGVfcmF0ZSwgMTAwKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMb3VkTm9ybUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgcy0+ZnJhbWVfdHlwZSA9IEZJUlNUX0ZSQU1FOworCisgICAgaWYgKHMtPmxpbmVhcikgeworICAgICAgICBkb3VibGUgb2Zmc2V0LCBvZmZzZXRfdHA7CisgICAgICAgIG9mZnNldCAgICA9IHMtPnRhcmdldF9pIC0gcy0+bWVhc3VyZWRfaTsKKyAgICAgICAgb2Zmc2V0X3RwID0gcy0+bWVhc3VyZWRfdHAgKyBvZmZzZXQ7CisKKyAgICAgICAgaWYgKHMtPm1lYXN1cmVkX3RwICE9IDk5ICYmIHMtPm1lYXN1cmVkX3RocmVzaCAhPSAtNzAgJiYgcy0+bWVhc3VyZWRfbHJhICE9IDAgJiYgcy0+bWVhc3VyZWRfaSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKG9mZnNldF90cCA8PSBzLT50YXJnZXRfdHApICYmIChzLT5tZWFzdXJlZF9scmEgPD0gcy0+dGFyZ2V0X2xyYSkpIHsKKyAgICAgICAgICAgICAgICBzLT5mcmFtZV90eXBlID0gTElORUFSX01PREU7CisgICAgICAgICAgICAgICAgcy0+b2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExvdWROb3JtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBkb3VibGUgaV9pbiwgaV9vdXQsIGxyYV9pbiwgbHJhX291dCwgdGhyZXNoX2luLCB0aHJlc2hfb3V0LCB0cF9pbiwgdHBfb3V0OworICAgIGludCBjOworCisgICAgaWYgKCFzLT5yMTI4X2luIHx8ICFzLT5yMTI4X291dCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBmZl9lYnVyMTI4X2xvdWRuZXNzX3JhbmdlKHMtPnIxMjhfaW4sICZscmFfaW4pOworICAgIGZmX2VidXIxMjhfbG91ZG5lc3NfZ2xvYmFsKHMtPnIxMjhfaW4sICZpX2luKTsKKyAgICBmZl9lYnVyMTI4X3JlbGF0aXZlX3RocmVzaG9sZChzLT5yMTI4X2luLCAmdGhyZXNoX2luKTsKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICBkb3VibGUgdG1wOworICAgICAgICBmZl9lYnVyMTI4X3NhbXBsZV9wZWFrKHMtPnIxMjhfaW4sIGMsICZ0bXApOworICAgICAgICBpZiAoKGMgPT0gMCkgfHwgKHRtcCA+IHRwX2luKSkKKyAgICAgICAgICAgIHRwX2luID0gdG1wOworICAgIH0KKworICAgIGZmX2VidXIxMjhfbG91ZG5lc3NfcmFuZ2Uocy0+cjEyOF9vdXQsICZscmFfb3V0KTsKKyAgICBmZl9lYnVyMTI4X2xvdWRuZXNzX2dsb2JhbChzLT5yMTI4X291dCwgJmlfb3V0KTsKKyAgICBmZl9lYnVyMTI4X3JlbGF0aXZlX3RocmVzaG9sZChzLT5yMTI4X291dCwgJnRocmVzaF9vdXQpOworICAgIGZvciAoYyA9IDA7IGMgPCBzLT5jaGFubmVsczsgYysrKSB7CisgICAgICAgIGRvdWJsZSB0bXA7CisgICAgICAgIGZmX2VidXIxMjhfc2FtcGxlX3BlYWsocy0+cjEyOF9vdXQsIGMsICZ0bXApOworICAgICAgICBpZiAoKGMgPT0gMCkgfHwgKHRtcCA+IHRwX291dCkpCisgICAgICAgICAgICB0cF9vdXQgPSB0bXA7CisgICAgfQorCisgICAgc3dpdGNoKHMtPnByaW50X2Zvcm1hdCkgeworICAgIGNhc2UgTk9ORToKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpTT046CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgIlxue1xuIgorICAgICAgICAgICAgIlx0XCJpbnB1dF9pXCIgOiBcIiUuMmZcIixcbiIKKyAgICAgICAgICAgICJcdFwiaW5wdXRfdHBcIiA6IFwiJS4yZlwiLFxuIgorICAgICAgICAgICAgIlx0XCJpbnB1dF9scmFcIiA6IFwiJS4yZlwiLFxuIgorICAgICAgICAgICAgIlx0XCJpbnB1dF90aHJlc2hcIiA6IFwiJS4yZlwiLFxuIgorICAgICAgICAgICAgIlx0XCJvdXRwdXRfaVwiIDogXCIlLjJmXCIsXG4iCisgICAgICAgICAgICAiXHRcIm91dHB1dF90cFwiIDogXCIlKy4yZlwiLFxuIgorICAgICAgICAgICAgIlx0XCJvdXRwdXRfbHJhXCIgOiBcIiUuMmZcIixcbiIKKyAgICAgICAgICAgICJcdFwib3V0cHV0X3RocmVzaFwiIDogXCIlLjJmXCIsXG4iCisgICAgICAgICAgICAiXHRcIm5vcm1hbGl6YXRpb25fdHlwZVwiIDogXCIlc1wiLFxuIgorICAgICAgICAgICAgIlx0XCJ0YXJnZXRfb2Zmc2V0XCIgOiBcIiUuMmZcIlxuIgorICAgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgICBpX2luLAorICAgICAgICAgICAgMjAuICogbG9nMTAodHBfaW4pLAorICAgICAgICAgICAgbHJhX2luLAorICAgICAgICAgICAgdGhyZXNoX2luLAorICAgICAgICAgICAgaV9vdXQsCisgICAgICAgICAgICAyMC4gKiBsb2cxMCh0cF9vdXQpLAorICAgICAgICAgICAgbHJhX291dCwKKyAgICAgICAgICAgIHRocmVzaF9vdXQsCisgICAgICAgICAgICBzLT5mcmFtZV90eXBlID09IExJTkVBUl9NT0RFID8gImxpbmVhciIgOiAiZHluYW1pYyIsCisgICAgICAgICAgICBzLT50YXJnZXRfaSAtIGlfb3V0CisgICAgICAgICk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVU1NQVJZOgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJJbnB1dCBJbnRlZ3JhdGVkOiAgICUrNi4xZiBMVUZTXG4iCisgICAgICAgICAgICAiSW5wdXQgVHJ1ZSBQZWFrOiAgICAlKzYuMWYgZEJUUFxuIgorICAgICAgICAgICAgIklucHV0IExSQTogICAgICAgICAgJTYuMWYgTFVcbiIKKyAgICAgICAgICAgICJJbnB1dCBUaHJlc2hvbGQ6ICAgICUrNi4xZiBMVUZTXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiT3V0cHV0IEludGVncmF0ZWQ6ICAlKzYuMWYgTFVGU1xuIgorICAgICAgICAgICAgIk91dHB1dCBUcnVlIFBlYWs6ICAgJSs2LjFmIGRCVFBcbiIKKyAgICAgICAgICAgICJPdXRwdXQgTFJBOiAgICAgICAgICU2LjFmIExVXG4iCisgICAgICAgICAgICAiT3V0cHV0IFRocmVzaG9sZDogICAlKzYuMWYgTFVGU1xuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIk5vcm1hbGl6YXRpb24gVHlwZTogICAlc1xuIgorICAgICAgICAgICAgIlRhcmdldCBPZmZzZXQ6ICAgICAgJSs2LjFmIExVXG4iLAorICAgICAgICAgICAgaV9pbiwKKyAgICAgICAgICAgIDIwLiAqIGxvZzEwKHRwX2luKSwKKyAgICAgICAgICAgIGxyYV9pbiwKKyAgICAgICAgICAgIHRocmVzaF9pbiwKKyAgICAgICAgICAgIGlfb3V0LAorICAgICAgICAgICAgMjAuICogbG9nMTAodHBfb3V0KSwKKyAgICAgICAgICAgIGxyYV9vdXQsCisgICAgICAgICAgICB0aHJlc2hfb3V0LAorICAgICAgICAgICAgcy0+ZnJhbWVfdHlwZSA9PSBMSU5FQVJfTU9ERSA/ICJMaW5lYXIiIDogIkR5bmFtaWMiLAorICAgICAgICAgICAgcy0+dGFyZ2V0X2kgLSBpX291dAorICAgICAgICApOworICAgICAgICBicmVhazsKKyAgICB9CisKK2VuZDoKKyAgICBpZiAocy0+cjEyOF9pbikKKyAgICAgICAgZmZfZWJ1cjEyOF9kZXN0cm95KCZzLT5yMTI4X2luKTsKKyAgICBpZiAocy0+cjEyOF9vdXQpCisgICAgICAgIGZmX2VidXIxMjhfZGVzdHJveSgmcy0+cjEyOF9vdXQpOworICAgIGF2X2ZyZWVwKCZzLT5saW1pdGVyX2J1Zik7CisgICAgYXZfZnJlZXAoJnMtPnByZXZfc21wKTsKKyAgICBhdl9mcmVlcCgmcy0+YnVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX2FmX2xvdWRub3JtX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYXZmaWx0ZXJfYWZfbG91ZG5vcm1fb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfbG91ZG5vcm0gPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAibG91ZG5vcm0iLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkVCVSBSMTI4IGxvdWRuZXNzIG5vcm1hbGl6YXRpb24iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihMb3VkTm9ybUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmxvdWRub3JtX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl9hZl9sb3Vkbm9ybV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl9hZl9sb3Vkbm9ybV9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX2x2Mi5jIGIvbGliYXZmaWx0ZXIvYWZfbHYyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEwYTZmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2FmX2x2Mi5jCkBAIC0wLDAgKzEsNjAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTYgRGF2aWQgUm9iaWxsYXJkIDxodHRwOi8vZHJvYmlsbGEubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBMVjIgd3JhcHBlcgorICovCisKKyNpbmNsdWRlIDxsaWx2L2xpbHYuaD4KKyNpbmNsdWRlIDxsdjIvbHYycGx1Zy5pbi9ucy9leHQvYXRvbS9hdG9tLmg+CisjaW5jbHVkZSA8bHYyL2x2MnBsdWcuaW4vbnMvZXh0L2J1Zi1zaXplL2J1Zi1zaXplLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFVSSVRhYmxlIHsKKyAgICBjaGFyICAgICoqdXJpczsKKyAgICBzaXplX3QgICAgbl91cmlzOworfSBVUklUYWJsZTsKKwordHlwZWRlZiBzdHJ1Y3QgTFYyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY2hhciAqcGx1Z2luX3VyaTsKKyAgICBjaGFyICpvcHRpb25zOworCisgICAgdW5zaWduZWQgbmJfaW5wdXRzOworICAgIHVuc2lnbmVkIG5iX2lucHV0Y29udHJvbHM7CisgICAgdW5zaWduZWQgbmJfb3V0cHV0czsKKworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgbmJfc2FtcGxlczsKKyAgICBpbnQ2NF90IHB0czsKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworCisgICAgTGlsdldvcmxkICAgICAgICAgKndvcmxkOworICAgIGNvbnN0IExpbHZQbHVnaW4gICpwbHVnaW47CisgICAgdWludDMyX3QgICAgICAgICAgIG5iX3BvcnRzOworICAgIGZsb2F0ICAgICAgICAgICAgICp2YWx1ZXM7CisgICAgVVJJVGFibGUgICAgICAgICAgIHVyaV90YWJsZTsKKyAgICBMVjJfVVJJRF9NYXAgICAgICAgbWFwOworICAgIExWMl9GZWF0dXJlICAgICAgICBtYXBfZmVhdHVyZTsKKyAgICBMVjJfVVJJRF9Vbm1hcCAgICAgdW5tYXA7CisgICAgTFYyX0ZlYXR1cmUgICAgICAgIHVubWFwX2ZlYXR1cmU7CisgICAgTFYyX0F0b21fU2VxdWVuY2UgIHNlcV9pblsyXTsKKyAgICBMVjJfQXRvbV9TZXF1ZW5jZSAqc2VxX291dDsKKyAgICBjb25zdCBMVjJfRmVhdHVyZSAqZmVhdHVyZXNbNV07CisKKyAgICBmbG9hdCAqbWluczsKKyAgICBmbG9hdCAqbWF4ZXM7CisgICAgZmxvYXQgKmNvbnRyb2xzOworCisgICAgTGlsdkluc3RhbmNlICppbnN0YW5jZTsKKworICAgIExpbHZOb2RlICAqYXRvbV9BdG9tUG9ydDsKKyAgICBMaWx2Tm9kZSAgKmF0b21fU2VxdWVuY2U7CisgICAgTGlsdk5vZGUgICpsdjJfQXVkaW9Qb3J0OworICAgIExpbHZOb2RlICAqbHYyX0NWUG9ydDsKKyAgICBMaWx2Tm9kZSAgKmx2Ml9Db250cm9sUG9ydDsKKyAgICBMaWx2Tm9kZSAgKmx2Ml9PcHRpb25hbDsKKyAgICBMaWx2Tm9kZSAgKmx2Ml9JbnB1dFBvcnQ7CisgICAgTGlsdk5vZGUgICpsdjJfT3V0cHV0UG9ydDsKKyAgICBMaWx2Tm9kZSAgKnVyaWRfbWFwOworICAgIExpbHZOb2RlICAqcG93ZXJPZjJCbG9ja0xlbmd0aDsKKyAgICBMaWx2Tm9kZSAgKmZpeGVkQmxvY2tMZW5ndGg7CisgICAgTGlsdk5vZGUgICpib3VuZGVkQmxvY2tMZW5ndGg7Cit9IExWMkNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKExWMkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBsdjJfb3B0aW9uc1tdID0geworICAgIHsgInBsdWdpbiIsICJzZXQgcGx1Z2luIHVyaSIsIE9GRlNFVChwbHVnaW5fdXJpKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInAiLCAgICAgICJzZXQgcGx1Z2luIHVyaSIsIE9GRlNFVChwbHVnaW5fdXJpKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImNvbnRyb2xzIiwgInNldCBwbHVnaW4gb3B0aW9ucyIsIE9GRlNFVChvcHRpb25zKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImMiLCAgICAgICAgInNldCBwbHVnaW4gb3B0aW9ucyIsIE9GRlNFVChvcHRpb25zKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInNhbXBsZV9yYXRlIiwgInNldCBzYW1wbGUgcmF0ZSIsIE9GRlNFVChzYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9NDQxMDB9LCAxLCBJTlQzMl9NQVgsIEZMQUdTIH0sCisgICAgeyAicyIsICAgICAgICAgICAic2V0IHNhbXBsZSByYXRlIiwgT0ZGU0VUKHNhbXBsZV9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND00NDEwMH0sIDEsIElOVDMyX01BWCwgRkxBR1MgfSwKKyAgICB7ICJuYl9zYW1wbGVzIiwgInNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHJlcXVlc3RlZCBmcmFtZSIsIE9GRlNFVChuYl9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMDI0fSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJuIiwgICAgICAgICAgInNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHJlcXVlc3RlZCBmcmFtZSIsIE9GRlNFVChuYl9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMDI0fSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJkdXJhdGlvbiIsICJzZXQgYXVkaW8gZHVyYXRpb24iLCBPRkZTRVQoZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQ9LTF9LCAtMSwgSU5UNjRfTUFYLCBGTEFHUyB9LAorICAgIHsgImQiLCAgICAgICAgInNldCBhdWRpbyBkdXJhdGlvbiIsIE9GRlNFVChkdXJhdGlvbiksIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2ND0tMX0sIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhsdjIpOworCitzdGF0aWMgdm9pZCB1cmlfdGFibGVfaW5pdChVUklUYWJsZSAqdGFibGUpCit7CisgICAgdGFibGUtPnVyaXMgICA9IE5VTEw7CisgICAgdGFibGUtPm5fdXJpcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHVyaV90YWJsZV9kZXN0cm95KFVSSVRhYmxlICp0YWJsZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bl91cmlzOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJnRhYmxlLT51cmlzW2ldKTsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmdGFibGUtPnVyaXMpOworfQorCitzdGF0aWMgTFYyX1VSSUQgdXJpX3RhYmxlX21hcChMVjJfVVJJRF9NYXBfSGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqdXJpKQoreworICAgIFVSSVRhYmxlICp0YWJsZSA9IChVUklUYWJsZSopaGFuZGxlOworICAgIGNvbnN0IHNpemVfdCBsZW4gPSBzdHJsZW4odXJpKTsKKyAgICBzaXplX3QgaTsKKyAgICBjaGFyICoqdG1wOworCisgICAgZm9yIChpID0gMDsgaSA8IHRhYmxlLT5uX3VyaXM7IGkrKykgeworICAgICAgICBpZiAoIXN0cmNtcCh0YWJsZS0+dXJpc1tpXSwgdXJpKSkgeworICAgICAgICAgICAgcmV0dXJuIGkgKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgdG1wID0gYXZfY2FsbG9jKHRhYmxlLT5uX3VyaXMgKyAxLCBzaXplb2YoY2hhciopKTsKKyAgICBpZiAoIXRtcCkKKyAgICAgICAgcmV0dXJuIHRhYmxlLT5uX3VyaXM7CisgICAgbWVtY3B5KHRtcCwgdGFibGUtPnVyaXMsIHRhYmxlLT5uX3VyaXMgKiBzaXplb2YoY2hhcioqKSk7CisKKyAgICBhdl9mcmVlKHRhYmxlLT51cmlzKTsKKyAgICB0YWJsZS0+dXJpcyA9IHRtcDsKKyAgICB0YWJsZS0+dXJpc1t0YWJsZS0+bl91cmlzXSA9IGF2X21hbGxvYyhsZW4gKyAxKTsKKyAgICBpZiAoIXRhYmxlLT51cmlzW3RhYmxlLT5uX3VyaXNdKQorICAgICAgICByZXR1cm4gdGFibGUtPm5fdXJpczsKKworICAgIG1lbWNweSh0YWJsZS0+dXJpc1t0YWJsZS0+bl91cmlzXSwgdXJpLCBsZW4gKyAxKTsKKyAgICB0YWJsZS0+bl91cmlzKys7CisKKyAgICByZXR1cm4gdGFibGUtPm5fdXJpczsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnVyaV90YWJsZV91bm1hcChMVjJfVVJJRF9NYXBfSGFuZGxlIGhhbmRsZSwgTFYyX1VSSUQgdXJpZCkKK3sKKyAgICBVUklUYWJsZSAqdGFibGUgPSAoVVJJVGFibGUqKWhhbmRsZTsKKworICAgIGlmICh1cmlkID4gMCAmJiB1cmlkIDw9IHRhYmxlLT5uX3VyaXMpIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlLT51cmlzW3VyaWQgLSAxXTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY29ubmVjdF9wb3J0cyhMVjJDb250ZXh0ICpzLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KQoreworICAgIGludCBpY2ggPSAwLCBvY2ggPSAwLCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3BvcnRzOyBpKyspIHsKKyAgICAgICAgY29uc3QgTGlsdlBvcnQgKnBvcnQgPSBsaWx2X3BsdWdpbl9nZXRfcG9ydF9ieV9pbmRleChzLT5wbHVnaW4sIGkpOworCisgICAgICAgIGlmIChsaWx2X3BvcnRfaXNfYShzLT5wbHVnaW4sIHBvcnQsIHMtPmx2Ml9BdWRpb1BvcnQpIHx8CisgICAgICAgICAgICBsaWx2X3BvcnRfaXNfYShzLT5wbHVnaW4sIHBvcnQsIHMtPmx2Ml9DVlBvcnQpKSB7CisgICAgICAgICAgICBpZiAobGlsdl9wb3J0X2lzX2Eocy0+cGx1Z2luLCBwb3J0LCBzLT5sdjJfSW5wdXRQb3J0KSkgeworICAgICAgICAgICAgICAgIGxpbHZfaW5zdGFuY2VfY29ubmVjdF9wb3J0KHMtPmluc3RhbmNlLCBpLCBpbi0+ZXh0ZW5kZWRfZGF0YVtpY2grK10pOworICAgICAgICAgICAgfSBlbHNlIGlmIChsaWx2X3BvcnRfaXNfYShzLT5wbHVnaW4sIHBvcnQsIHMtPmx2Ml9PdXRwdXRQb3J0KSkgeworICAgICAgICAgICAgICAgIGxpbHZfaW5zdGFuY2VfY29ubmVjdF9wb3J0KHMtPmluc3RhbmNlLCBpLCBvdXQtPmV4dGVuZGVkX2RhdGFbb2NoKytdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAicG9ydCAlZCBuZWl0aGVyIGlucHV0IG5vciBvdXRwdXQsIHNraXBwaW5nXG4iLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChsaWx2X3BvcnRfaXNfYShzLT5wbHVnaW4sIHBvcnQsIHMtPmF0b21fQXRvbVBvcnQpKSB7CisgICAgICAgICAgICBpZiAobGlsdl9wb3J0X2lzX2Eocy0+cGx1Z2luLCBwb3J0LCBzLT5sdjJfSW5wdXRQb3J0KSkgeworICAgICAgICAgICAgICAgIGxpbHZfaW5zdGFuY2VfY29ubmVjdF9wb3J0KHMtPmluc3RhbmNlLCBpLCAmcy0+c2VxX2luKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbGlsdl9pbnN0YW5jZV9jb25uZWN0X3BvcnQocy0+aW5zdGFuY2UsIGksIHMtPnNlcV9vdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxpbHZfcG9ydF9pc19hKHMtPnBsdWdpbiwgcG9ydCwgcy0+bHYyX0NvbnRyb2xQb3J0KSkgeworICAgICAgICAgICAgbGlsdl9pbnN0YW5jZV9jb25uZWN0X3BvcnQocy0+aW5zdGFuY2UsIGksICZzLT5jb250cm9sc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5zZXFfaW5bMF0uYXRvbS5zaXplID0gc2l6ZW9mKExWMl9BdG9tX1NlcXVlbmNlX0JvZHkpOworICAgIHMtPnNlcV9pblswXS5hdG9tLnR5cGUgPSB1cmlfdGFibGVfbWFwKCZzLT51cmlfdGFibGUsIExWMl9BVE9NX19TZXF1ZW5jZSk7CisgICAgcy0+c2VxX291dC0+YXRvbS5zaXplICA9IDk2MjQ7CisgICAgcy0+c2VxX291dC0+YXRvbS50eXBlICA9IHVyaV90YWJsZV9tYXAoJnMtPnVyaV90YWJsZSwgTFYyX0FUT01fX0NodW5rKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTFYyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXQ7CisKKyAgICBpZiAoIXMtPm5iX291dHB1dHMgfHwKKyAgICAgICAgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSAmJiBzLT5uYl9pbnB1dHMgPT0gcy0+bmJfb3V0cHV0cykpIHsKKyAgICAgICAgb3V0ID0gaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihjdHgtPm91dHB1dHNbMF0sIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICB9CisKKyAgICBjb25uZWN0X3BvcnRzKHMsIGluLCBvdXQpOworCisgICAgbGlsdl9pbnN0YW5jZV9ydW4ocy0+aW5zdGFuY2UsIGluLT5uYl9zYW1wbGVzKTsKKworICAgIGlmIChvdXQgIT0gaW4pCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXQpOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIExWMkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludDY0X3QgdDsKKworICAgIGlmIChjdHgtPm5iX2lucHV0cykKKyAgICAgICAgcmV0dXJuIGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworCisgICAgdCA9IGF2X3Jlc2NhbGUocy0+cHRzLCBBVl9USU1FX0JBU0UsIHMtPnNhbXBsZV9yYXRlKTsKKyAgICBpZiAocy0+ZHVyYXRpb24gPj0gMCAmJiB0ID49IHMtPmR1cmF0aW9uKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIHMtPm5iX3NhbXBsZXMpOworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY29ubmVjdF9wb3J0cyhzLCBvdXQsIG91dCk7CisKKyAgICBsaWx2X2luc3RhbmNlX3J1bihzLT5pbnN0YW5jZSwgb3V0LT5uYl9zYW1wbGVzKTsKKworICAgIG91dC0+c2FtcGxlX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZTsKKyAgICBvdXQtPnB0cyAgICAgICAgID0gcy0+cHRzOworICAgIHMtPnB0cyAgICAgICAgICArPSBzLT5uYl9zYW1wbGVzOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgY29uc3QgTFYyX0ZlYXR1cmUgYnVmX3NpemVfZmVhdHVyZXNbM10gPSB7CisgICAgeyBMVjJfQlVGX1NJWkVfX3Bvd2VyT2YyQmxvY2tMZW5ndGgsIE5VTEwgfSwKKyAgICB7IExWMl9CVUZfU0laRV9fZml4ZWRCbG9ja0xlbmd0aCwgICAgTlVMTCB9LAorICAgIHsgTFYyX0JVRl9TSVpFX19ib3VuZGVkQmxvY2tMZW5ndGgsICBOVUxMIH0sCit9OworCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIExWMkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY2hhciAqcCwgKmFyZywgKnNhdmVwdHIgPSBOVUxMOworICAgIGludCBpLCBzYW1wbGVfcmF0ZTsKKworICAgIHVyaV90YWJsZV9pbml0KCZzLT51cmlfdGFibGUpOworICAgIHMtPm1hcC5oYW5kbGUgPSAmcy0+dXJpX3RhYmxlOworICAgIHMtPm1hcC5tYXAgPSB1cmlfdGFibGVfbWFwOworICAgIHMtPm1hcF9mZWF0dXJlLlVSSSA9IExWMl9VUklEX01BUF9VUkk7CisgICAgcy0+bWFwX2ZlYXR1cmUuZGF0YSA9ICZzLT5tYXA7CisgICAgcy0+dW5tYXAuaGFuZGxlID0gJnMtPnVyaV90YWJsZTsKKyAgICBzLT51bm1hcC51bm1hcCAgPSB1cmlfdGFibGVfdW5tYXA7CisgICAgcy0+dW5tYXBfZmVhdHVyZS5VUkkgPSBMVjJfVVJJRF9VTk1BUF9VUkk7CisgICAgcy0+dW5tYXBfZmVhdHVyZS5kYXRhID0gJnMtPnVubWFwOworICAgIHMtPmZlYXR1cmVzWzBdID0gJnMtPm1hcF9mZWF0dXJlOworICAgIHMtPmZlYXR1cmVzWzFdID0gJnMtPnVubWFwX2ZlYXR1cmU7CisgICAgcy0+ZmVhdHVyZXNbMl0gPSAmYnVmX3NpemVfZmVhdHVyZXNbMF07CisgICAgcy0+ZmVhdHVyZXNbM10gPSAmYnVmX3NpemVfZmVhdHVyZXNbMV07CisgICAgcy0+ZmVhdHVyZXNbNF0gPSAmYnVmX3NpemVfZmVhdHVyZXNbMl07CisKKyAgICBpZiAoY3R4LT5uYl9pbnB1dHMpIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKworICAgICAgICBvdXRsaW5rLT5mb3JtYXQgICAgICA9IGlubGluay0+Zm9ybWF0OworICAgICAgICBvdXRsaW5rLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlID0gaW5saW5rLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgaWYgKHMtPm5iX2lucHV0cyA9PSBzLT5uYl9vdXRwdXRzKSB7CisgICAgICAgICAgICBvdXRsaW5rLT5jaGFubmVsX2xheW91dCA9IGlubGluay0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgICAgICAgICBvdXRsaW5rLT5jaGFubmVscyA9IGlubGluay0+Y2hhbm5lbHM7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIG91dGxpbmstPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGUgPSBzLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgb3V0bGluay0+dGltZV9iYXNlICAgPSAoQVZSYXRpb25hbCl7MSwgcy0+c2FtcGxlX3JhdGV9OworICAgIH0KKworICAgIHMtPmluc3RhbmNlID0gbGlsdl9wbHVnaW5faW5zdGFudGlhdGUocy0+cGx1Z2luLCBzYW1wbGVfcmF0ZSwgcy0+ZmVhdHVyZXMpOworICAgIGlmICghcy0+aW5zdGFuY2UpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbnN0YW50aWF0ZSA8JXM+XG4iLCBsaWx2X25vZGVfYXNfdXJpKGxpbHZfcGx1Z2luX2dldF91cmkocy0+cGx1Z2luKSkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPm1pbnMgICAgID0gYXZfY2FsbG9jKHMtPm5iX3BvcnRzLCBzaXplb2YoZmxvYXQpKTsKKyAgICBzLT5tYXhlcyAgICA9IGF2X2NhbGxvYyhzLT5uYl9wb3J0cywgc2l6ZW9mKGZsb2F0KSk7CisgICAgcy0+Y29udHJvbHMgPSBhdl9jYWxsb2Mocy0+bmJfcG9ydHMsIHNpemVvZihmbG9hdCkpOworCisgICAgaWYgKCFzLT5taW5zIHx8ICFzLT5tYXhlcyB8fCAhcy0+Y29udHJvbHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBsaWx2X3BsdWdpbl9nZXRfcG9ydF9yYW5nZXNfZmxvYXQocy0+cGx1Z2luLCBzLT5taW5zLCBzLT5tYXhlcywgcy0+Y29udHJvbHMpOworICAgIHMtPnNlcV9vdXQgPSBhdl9tYWxsb2Moc2l6ZW9mKExWMl9BdG9tX1NlcXVlbmNlKSArIDk2MjQpOworICAgIGlmICghcy0+c2VxX291dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChzLT5vcHRpb25zICYmICFzdHJjbXAocy0+b3B0aW9ucywgImhlbHAiKSkgeworICAgICAgICBpZiAoIXMtPm5iX2lucHV0Y29udHJvbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICJUaGUgJyVzJyBwbHVnaW4gZG9lcyBub3QgaGF2ZSBhbnkgaW5wdXQgY29udHJvbHMuXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPnBsdWdpbl91cmkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgIlRoZSAnJXMnIHBsdWdpbiBoYXMgdGhlIGZvbGxvd2luZyBpbnB1dCBjb250cm9sczpcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+cGx1Z2luX3VyaSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcG9ydHM7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IExpbHZQb3J0ICpwb3J0ID0gbGlsdl9wbHVnaW5fZ2V0X3BvcnRfYnlfaW5kZXgocy0+cGx1Z2luLCBpKTsKKyAgICAgICAgICAgICAgICBjb25zdCBMaWx2Tm9kZSAqc3ltYm9sID0gbGlsdl9wb3J0X2dldF9zeW1ib2wocy0+cGx1Z2luLCBwb3J0KTsKKyAgICAgICAgICAgICAgICBMaWx2Tm9kZSAqbmFtZSA9IGxpbHZfcG9ydF9nZXRfbmFtZShzLT5wbHVnaW4sIHBvcnQpOworCisgICAgICAgICAgICAgICAgaWYgKGxpbHZfcG9ydF9pc19hKHMtPnBsdWdpbiwgcG9ydCwgcy0+bHYyX0lucHV0UG9ydCkgJiYKKyAgICAgICAgICAgICAgICAgICAgbGlsdl9wb3J0X2lzX2Eocy0+cGx1Z2luLCBwb3J0LCBzLT5sdjJfQ29udHJvbFBvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiJXNcdFx0PGZsb2F0PiAoZnJvbSAlZiB0byAlZikgKGRlZmF1bHQgJWYpXHRcdCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlsdl9ub2RlX2FzX3N0cmluZyhzeW1ib2wpLCBzLT5taW5zW2ldLCBzLT5tYXhlc1tpXSwgcy0+Y29udHJvbHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWx2X25vZGVfYXNfc3RyaW5nKG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsaWx2X25vZGVfZnJlZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0KKworICAgIHAgPSBzLT5vcHRpb25zOworICAgIHdoaWxlIChzLT5vcHRpb25zKSB7CisgICAgICAgIGNvbnN0IExpbHZQb3J0ICpwb3J0OworICAgICAgICBMaWx2Tm9kZSAqc3ltOworICAgICAgICBmbG9hdCB2YWw7CisgICAgICAgIGNoYXIgKnN0ciwgKnZzdHI7CisgICAgICAgIGludCBpbmRleDsKKworICAgICAgICBpZiAoIShhcmcgPSBhdl9zdHJ0b2socCwgIiB8IiwgJnNhdmVwdHIpKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBwID0gTlVMTDsKKworICAgICAgICB2c3RyID0gc3Ryc3RyKGFyZywgIj0iKTsKKyAgICAgICAgaWYgKHZzdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzeW50YXguXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICB2c3RyWzBdID0gMDsKKyAgICAgICAgc3RyICA9IGFyZzsKKyAgICAgICAgdmFsICA9IGF0b2YodnN0cisxKTsKKyAgICAgICAgc3ltICA9IGxpbHZfbmV3X3N0cmluZyhzLT53b3JsZCwgc3RyKTsKKyAgICAgICAgcG9ydCA9IGxpbHZfcGx1Z2luX2dldF9wb3J0X2J5X3N5bWJvbChzLT5wbHVnaW4sIHN5bSk7CisgICAgICAgIGxpbHZfbm9kZV9mcmVlKHN5bSk7CisgICAgICAgIGlmICghcG9ydCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBvcHRpb246IDwlcz5cbiIsIHN0cik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbmRleCA9IGxpbHZfcG9ydF9nZXRfaW5kZXgocy0+cGx1Z2luLCBwb3J0KTsKKyAgICAgICAgICAgIHMtPmNvbnRyb2xzW2luZGV4XSA9IHZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzLT5uYl9pbnB1dHMgJiYKKyAgICAgICAgKGxpbHZfcGx1Z2luX2hhc19mZWF0dXJlKHMtPnBsdWdpbiwgcy0+cG93ZXJPZjJCbG9ja0xlbmd0aCkgfHwKKyAgICAgICAgIGxpbHZfcGx1Z2luX2hhc19mZWF0dXJlKHMtPnBsdWdpbiwgcy0+Zml4ZWRCbG9ja0xlbmd0aCkgfHwKKyAgICAgICAgIGxpbHZfcGx1Z2luX2hhc19mZWF0dXJlKHMtPnBsdWdpbiwgcy0+Ym91bmRlZEJsb2NrTGVuZ3RoKSkpIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKworICAgICAgICBpbmxpbmstPnBhcnRpYWxfYnVmX3NpemUgPSBpbmxpbmstPm1pbl9zYW1wbGVzID0gaW5saW5rLT5tYXhfc2FtcGxlcyA9IDQwOTY7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExWMkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgTGlsdlBsdWdpbnMgKnBsdWdpbnM7CisgICAgY29uc3QgTGlsdlBsdWdpbiAqcGx1Z2luOworICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsgTlVMTCB9OworICAgIExpbHZOb2RlICp1cmk7CisgICAgaW50IGk7CisKKyAgICBzLT53b3JsZCA9IGxpbHZfd29ybGRfbmV3KCk7CisgICAgaWYgKCFzLT53b3JsZCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHVyaSA9IGxpbHZfbmV3X3VyaShzLT53b3JsZCwgcy0+cGx1Z2luX3VyaSk7CisgICAgaWYgKCF1cmkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGx1Z2luIFVSSSA8JXM+XG4iLCBzLT5wbHVnaW5fdXJpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBsaWx2X3dvcmxkX2xvYWRfYWxsKHMtPndvcmxkKTsKKyAgICBwbHVnaW5zID0gbGlsdl93b3JsZF9nZXRfYWxsX3BsdWdpbnMocy0+d29ybGQpOworICAgIHBsdWdpbiAgPSBsaWx2X3BsdWdpbnNfZ2V0X2J5X3VyaShwbHVnaW5zLCB1cmkpOworICAgIGxpbHZfbm9kZV9mcmVlKHVyaSk7CisKKyAgICBpZiAoIXBsdWdpbikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUGx1Z2luIDwlcz4gbm90IGZvdW5kXG4iLCBzLT5wbHVnaW5fdXJpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5wbHVnaW4gPSBwbHVnaW47CisgICAgcy0+bmJfcG9ydHMgPSBsaWx2X3BsdWdpbl9nZXRfbnVtX3BvcnRzKHMtPnBsdWdpbik7CisKKyAgICBzLT5sdjJfSW5wdXRQb3J0ICAgICAgID0gbGlsdl9uZXdfdXJpKHMtPndvcmxkLCBMVjJfQ09SRV9fSW5wdXRQb3J0KTsKKyAgICBzLT5sdjJfT3V0cHV0UG9ydCAgICAgID0gbGlsdl9uZXdfdXJpKHMtPndvcmxkLCBMVjJfQ09SRV9fT3V0cHV0UG9ydCk7CisgICAgcy0+bHYyX0F1ZGlvUG9ydCAgICAgICA9IGxpbHZfbmV3X3VyaShzLT53b3JsZCwgTFYyX0NPUkVfX0F1ZGlvUG9ydCk7CisgICAgcy0+bHYyX0NvbnRyb2xQb3J0ICAgICA9IGxpbHZfbmV3X3VyaShzLT53b3JsZCwgTFYyX0NPUkVfX0NvbnRyb2xQb3J0KTsKKyAgICBzLT5sdjJfT3B0aW9uYWwgICAgICAgID0gbGlsdl9uZXdfdXJpKHMtPndvcmxkLCBMVjJfQ09SRV9fY29ubmVjdGlvbk9wdGlvbmFsKTsKKyAgICBzLT5hdG9tX0F0b21Qb3J0ICAgICAgID0gbGlsdl9uZXdfdXJpKHMtPndvcmxkLCBMVjJfQVRPTV9fQXRvbVBvcnQpOworICAgIHMtPmF0b21fU2VxdWVuY2UgICAgICAgPSBsaWx2X25ld191cmkocy0+d29ybGQsIExWMl9BVE9NX19TZXF1ZW5jZSk7CisgICAgcy0+dXJpZF9tYXAgICAgICAgICAgICA9IGxpbHZfbmV3X3VyaShzLT53b3JsZCwgTFYyX1VSSURfX21hcCk7CisgICAgcy0+cG93ZXJPZjJCbG9ja0xlbmd0aCA9IGxpbHZfbmV3X3VyaShzLT53b3JsZCwgTFYyX0JVRl9TSVpFX19wb3dlck9mMkJsb2NrTGVuZ3RoKTsKKyAgICBzLT5maXhlZEJsb2NrTGVuZ3RoICAgID0gbGlsdl9uZXdfdXJpKHMtPndvcmxkLCBMVjJfQlVGX1NJWkVfX2ZpeGVkQmxvY2tMZW5ndGgpOworICAgIHMtPmJvdW5kZWRCbG9ja0xlbmd0aCAgPSBsaWx2X25ld191cmkocy0+d29ybGQsIExWMl9CVUZfU0laRV9fYm91bmRlZEJsb2NrTGVuZ3RoKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9wb3J0czsgaSsrKSB7CisgICAgICAgIGNvbnN0IExpbHZQb3J0ICpscG9ydCA9IGxpbHZfcGx1Z2luX2dldF9wb3J0X2J5X2luZGV4KHMtPnBsdWdpbiwgaSk7CisgICAgICAgIGludCBpc19pbnB1dCA9IDA7CisgICAgICAgIGludCBpc19vcHRpb25hbCA9IDA7CisKKyAgICAgICAgaXNfb3B0aW9uYWwgPSBsaWx2X3BvcnRfaGFzX3Byb3BlcnR5KHMtPnBsdWdpbiwgbHBvcnQsIHMtPmx2Ml9PcHRpb25hbCk7CisKKyAgICAgICAgaWYgKGxpbHZfcG9ydF9pc19hKHMtPnBsdWdpbiwgbHBvcnQsIHMtPmx2Ml9JbnB1dFBvcnQpKSB7CisgICAgICAgICAgICBpc19pbnB1dCA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoIWxpbHZfcG9ydF9pc19hKHMtPnBsdWdpbiwgbHBvcnQsIHMtPmx2Ml9PdXRwdXRQb3J0KSAmJiAhaXNfb3B0aW9uYWwpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobGlsdl9wb3J0X2lzX2Eocy0+cGx1Z2luLCBscG9ydCwgcy0+bHYyX0NvbnRyb2xQb3J0KSkgeworICAgICAgICAgICAgaWYgKGlzX2lucHV0KSB7CisgICAgICAgICAgICAgICAgcy0+bmJfaW5wdXRjb250cm9scysrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxpbHZfcG9ydF9pc19hKHMtPnBsdWdpbiwgbHBvcnQsIHMtPmx2Ml9BdWRpb1BvcnQpKSB7CisgICAgICAgICAgICBpZiAoaXNfaW5wdXQpIHsKKyAgICAgICAgICAgICAgICBzLT5uYl9pbnB1dHMrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+bmJfb3V0cHV0cysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcGFkLnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisKKyAgICBpZiAocy0+bmJfaW5wdXRzKSB7CisgICAgICAgIHBhZC5uYW1lID0gYXZfYXNwcmludGYoImluMDolczoldSIsIHMtPnBsdWdpbl91cmksIHMtPm5iX2lucHV0cyk7CisgICAgICAgIGlmICghcGFkLm5hbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHBhZC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWU7CisgICAgICAgIGlmIChmZl9pbnNlcnRfaW5wYWQoY3R4LCBjdHgtPm5iX2lucHV0cywgJnBhZCkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTFYyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFRQLCBBVl9TQU1QTEVfRk1UX05PTkUgfTsKKyAgICBpbnQgcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChzLT5uYl9pbnB1dHMpIHsKKyAgICAgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgICAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHJldCA9IGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBzYW1wbGVfcmF0ZXNbXSA9IHsgcy0+c2FtcGxlX3JhdGUsIC0xIH07CisKKyAgICAgICAgcmV0ID0gZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX3JhdGVzKSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+bmJfaW5wdXRzID09IDIgJiYgcy0+bmJfb3V0cHV0cyA9PSAyKSB7CisgICAgICAgIGxheW91dHMgPSBOVUxMOworICAgICAgICByZXQgPSBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJmxheW91dHMsIEFWX0NIX0xBWU9VVF9TVEVSRU8pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+bmJfaW5wdXRzID49IDEpIHsKKyAgICAgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgICAgICAgICB1aW50NjRfdCBpbmxheW91dCA9IEZGX0NPVU5UMkxBWU9VVChzLT5uYl9pbnB1dHMpOworCisgICAgICAgICAgICBsYXlvdXRzID0gTlVMTDsKKyAgICAgICAgICAgIHJldCA9IGZmX2FkZF9jaGFubmVsX2xheW91dCgmbGF5b3V0cywgaW5sYXlvdXQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJldCA9IGZmX2NoYW5uZWxfbGF5b3V0c19yZWYobGF5b3V0cywgJmlubGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgICAgICBpZiAoIXMtPm5iX291dHB1dHMpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9jaGFubmVsX2xheW91dHNfcmVmKGxheW91dHMsICZvdXRsaW5rLT5pbl9jaGFubmVsX2xheW91dHMpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPm5iX291dHB1dHMgPj0gMSkgeworICAgICAgICAgICAgdWludDY0X3Qgb3V0bGF5b3V0ID0gRkZfQ09VTlQyTEFZT1VUKHMtPm5iX291dHB1dHMpOworCisgICAgICAgICAgICBsYXlvdXRzID0gTlVMTDsKKyAgICAgICAgICAgIHJldCA9IGZmX2FkZF9jaGFubmVsX2xheW91dCgmbGF5b3V0cywgb3V0bGF5b3V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICByZXQgPSBmZl9jaGFubmVsX2xheW91dHNfcmVmKGxheW91dHMsICZvdXRsaW5rLT5pbl9jaGFubmVsX2xheW91dHMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMVjJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgbGlsdl9ub2RlX2ZyZWUocy0+cG93ZXJPZjJCbG9ja0xlbmd0aCk7CisgICAgbGlsdl9ub2RlX2ZyZWUocy0+Zml4ZWRCbG9ja0xlbmd0aCk7CisgICAgbGlsdl9ub2RlX2ZyZWUocy0+Ym91bmRlZEJsb2NrTGVuZ3RoKTsKKyAgICBsaWx2X25vZGVfZnJlZShzLT51cmlkX21hcCk7CisgICAgbGlsdl9ub2RlX2ZyZWUocy0+YXRvbV9TZXF1ZW5jZSk7CisgICAgbGlsdl9ub2RlX2ZyZWUocy0+YXRvbV9BdG9tUG9ydCk7CisgICAgbGlsdl9ub2RlX2ZyZWUocy0+bHYyX09wdGlvbmFsKTsKKyAgICBsaWx2X25vZGVfZnJlZShzLT5sdjJfQ29udHJvbFBvcnQpOworICAgIGxpbHZfbm9kZV9mcmVlKHMtPmx2Ml9BdWRpb1BvcnQpOworICAgIGxpbHZfbm9kZV9mcmVlKHMtPmx2Ml9PdXRwdXRQb3J0KTsKKyAgICBsaWx2X25vZGVfZnJlZShzLT5sdjJfSW5wdXRQb3J0KTsKKyAgICB1cmlfdGFibGVfZGVzdHJveSgmcy0+dXJpX3RhYmxlKTsKKyAgICBsaWx2X2luc3RhbmNlX2ZyZWUocy0+aW5zdGFuY2UpOworICAgIGxpbHZfd29ybGRfZnJlZShzLT53b3JsZCk7CisgICAgYXZfZnJlZXAoJnMtPm1pbnMpOworICAgIGF2X2ZyZWVwKCZzLT5tYXhlcyk7CisgICAgYXZfZnJlZXAoJnMtPmNvbnRyb2xzKTsKKyAgICBhdl9mcmVlcCgmcy0+c2VxX291dCk7CisKKyAgICBpZiAoY3R4LT5uYl9pbnB1dHMpCisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPmlucHV0X3BhZHNbMF0ubmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBsdjJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9sdjIgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAibHYyIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSBMVjIgZWZmZWN0LiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKExWMkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmx2Ml9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gMCwKKyAgICAub3V0cHV0cyAgICAgICA9IGx2Ml9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX0lOUFVUUywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9tY29tcGFuZC5jIGIvbGliYXZmaWx0ZXIvYWZfbWNvbXBhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTQyNTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvYWZfbWNvbXBhbmQuYwpAQCAtMCwwICsxLDY4OSBAQAorLyoKKyAqIENPcHlyaWdodCAoYykgMjAwMiBEYW5pZWwgUG91enpuZXIKKyAqIENvcHlyaWdodCAoYykgMTk5OSBDaHJpcyBCYWd3ZWxsCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgTmljayBCYWlsZXkKKyAqIENvcHlyaWdodCAoYykgMjAwNyBSb2IgU3lrZXMgPHJvYnNAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICogQ29weXJpZ2h0IChjKSAyMDEzIFBhdWwgQiBNYWhvbAorICogQ29weXJpZ2h0IChjKSAyMDE0IEFuZHJldyBLZWxsZXkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogYXVkaW8gbXVsdGliYW5kIGNvbXBhbmQgZmlsdGVyCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZm1hdGguaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBDb21wYW5kU2VnbWVudCB7CisgICAgZG91YmxlIHgsIHk7CisgICAgZG91YmxlIGEsIGI7Cit9IENvbXBhbmRTZWdtZW50OworCit0eXBlZGVmIHN0cnVjdCBDb21wYW5kVCB7CisgICAgQ29tcGFuZFNlZ21lbnQgKnNlZ21lbnRzOworICAgIGludCBuYl9zZWdtZW50czsKKyAgICBkb3VibGUgaW5fbWluX2xpbjsKKyAgICBkb3VibGUgb3V0X21pbl9saW47CisgICAgZG91YmxlIGN1cnZlX2RCOworICAgIGRvdWJsZSBnYWluX2RCOworfSBDb21wYW5kVDsKKworI2RlZmluZSBOIDQKKwordHlwZWRlZiBzdHJ1Y3QgUHJldkNyb3Nzb3ZlciB7CisgICAgZG91YmxlIGluOworICAgIGRvdWJsZSBvdXRfbG93OworICAgIGRvdWJsZSBvdXRfaGlnaDsKK30gUHJldkNyb3Nzb3ZlcltOICogMl07CisKK3R5cGVkZWYgc3RydWN0IENyb3Nzb3ZlciB7CisgIFByZXZDcm9zc292ZXIgKnByZXZpb3VzOworICBzaXplX3QgICAgICAgICBwb3M7CisgIGRvdWJsZSAgICAgICAgIGNvZWZzWzMgKihOKzEpXTsKK30gQ3Jvc3NvdmVyOworCit0eXBlZGVmIHN0cnVjdCBDb21wQmFuZCB7CisgICAgQ29tcGFuZFQgdHJhbnNmZXJfZm47CisgICAgZG91YmxlICphdHRhY2tfcmF0ZTsKKyAgICBkb3VibGUgKmRlY2F5X3JhdGU7CisgICAgZG91YmxlICp2b2x1bWU7CisgICAgZG91YmxlIGRlbGF5OworICAgIGRvdWJsZSB0b3BmcmVxOworICAgIENyb3Nzb3ZlciBmaWx0ZXI7CisgICAgQVZGcmFtZSAqZGVsYXlfYnVmOworICAgIHNpemVfdCBkZWxheV9zaXplOworICAgIHB0cmRpZmZfdCBkZWxheV9idWZfcHRyOworICAgIHNpemVfdCBkZWxheV9idWZfY250OworfSBDb21wQmFuZDsKKwordHlwZWRlZiBzdHJ1Y3QgTUNvbXBhbmRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGNoYXIgKmFyZ3M7CisKKyAgICBpbnQgbmJfYmFuZHM7CisgICAgQ29tcEJhbmQgKmJhbmRzOworICAgIEFWRnJhbWUgKmJhbmRfYnVmMSwgKmJhbmRfYnVmMiwgKmJhbmRfYnVmMzsKKyAgICBpbnQgYmFuZF9zYW1wbGVzOworICAgIHNpemVfdCBkZWxheV9idWZfc2l6ZTsKK30gTUNvbXBhbmRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNQ29tcGFuZENvbnRleHQsIHgpCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBtY29tcGFuZF9vcHRpb25zW10gPSB7CisgICAgeyAiYXJncyIsICJzZXQgcGFyYW1ldGVycyBmb3IgZWFjaCBiYW5kIiwgT0ZGU0VUKGFyZ3MpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIwLjAwNSwwLjEgNiAtNDcvLTQwLC0zNC8tMzQsLTE3Ly0zMyAxMDAgfCAwLjAwMywwLjA1IDYgLTQ3Ly00MCwtMzQvLTM0LC0xNy8tMzMgNDAwIHwgMC4wMDA2MjUsMC4wMTI1IDYgLTQ3Ly00MCwtMzQvLTM0LC0xNS8tMzMgMTYwMCB8IDAuMDAwMSwwLjAyNSA2IC00Ny8tNDAsLTM0Ly0zNCwtMzEvLTMxLC0wLy0zMCA2NDAwIHwgMCwwLjAyNSA2IC0zOC8tMzEsLTI4Ly0yOCwtMC8tMjUgMjIwMDAiIH0sIDAsIDAsIEEgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG1jb21wYW5kKTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTUNvbXBhbmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+YmFuZF9idWYxKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5iYW5kX2J1ZjIpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmJhbmRfYnVmMyk7CisKKyAgICBpZiAocy0+YmFuZHMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2JhbmRzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5iYW5kc1tpXS5hdHRhY2tfcmF0ZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+YmFuZHNbaV0uZGVjYXlfcmF0ZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+YmFuZHNbaV0udm9sdW1lKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5iYW5kc1tpXS50cmFuc2Zlcl9mbi5zZWdtZW50cyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+YmFuZHNbaV0uZmlsdGVyLnByZXZpb3VzKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmJhbmRzW2ldLmRlbGF5X2J1Zik7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPmJhbmRzKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzW10gPSB7CisgICAgICAgIEFWX1NBTVBMRV9GTVRfREJMUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKK30KKworc3RhdGljIHZvaWQgY291bnRfaXRlbXMoY2hhciAqaXRlbV9zdHIsIGludCAqbmJfaXRlbXMsIGNoYXIgZGVsaW1pdGVyKQoreworICAgIGNoYXIgKnA7CisKKyAgICAqbmJfaXRlbXMgPSAxOworICAgIGZvciAocCA9IGl0ZW1fc3RyOyAqcDsgcCsrKSB7CisgICAgICAgIGlmICgqcCA9PSBkZWxpbWl0ZXIpCisgICAgICAgICAgICAoKm5iX2l0ZW1zKSsrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3ZvbHVtZShDb21wQmFuZCAqY2IsIGRvdWJsZSBpbiwgaW50IGNoKQoreworICAgIGRvdWJsZSBkZWx0YSA9IGluIC0gY2ItPnZvbHVtZVtjaF07CisKKyAgICBpZiAoZGVsdGEgPiAwLjApCisgICAgICAgIGNiLT52b2x1bWVbY2hdICs9IGRlbHRhICogY2ItPmF0dGFja19yYXRlW2NoXTsKKyAgICBlbHNlCisgICAgICAgIGNiLT52b2x1bWVbY2hdICs9IGRlbHRhICogY2ItPmRlY2F5X3JhdGVbY2hdOworfQorCitzdGF0aWMgZG91YmxlIGdldF92b2x1bWUoQ29tcGFuZFQgKnMsIGRvdWJsZSBpbl9saW4pCit7CisgICAgQ29tcGFuZFNlZ21lbnQgKmNzOworICAgIGRvdWJsZSBpbl9sb2csIG91dF9sb2c7CisgICAgaW50IGk7CisKKyAgICBpZiAoaW5fbGluIDw9IHMtPmluX21pbl9saW4pCisgICAgICAgIHJldHVybiBzLT5vdXRfbWluX2xpbjsKKworICAgIGluX2xvZyA9IGxvZyhpbl9saW4pOworCisgICAgZm9yIChpID0gMTsgaSA8IHMtPm5iX3NlZ21lbnRzOyBpKyspCisgICAgICAgIGlmIChpbl9sb2cgPD0gcy0+c2VnbWVudHNbaV0ueCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGNzID0gJnMtPnNlZ21lbnRzW2kgLSAxXTsKKyAgICBpbl9sb2cgLT0gY3MtPng7CisgICAgb3V0X2xvZyA9IGNzLT55ICsgaW5fbG9nICogKGNzLT5hICogaW5fbG9nICsgY3MtPmIpOworCisgICAgcmV0dXJuIGV4cChvdXRfbG9nKTsKK30KKworc3RhdGljIGludCBwYXJzZV9wb2ludHMoY2hhciAqcG9pbnRzLCBpbnQgbmJfcG9pbnRzLCBkb3VibGUgcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFuZFQgKnMsIEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBuZXdfbmJfaXRlbXMsIG51bTsKKyAgICBjaGFyICpzYXZlcHRyID0gTlVMTDsKKyAgICBjaGFyICpwID0gcG9pbnRzOworICAgIGludCBpOworCisjZGVmaW5lIFMoeCkgcy0+c2VnbWVudHNbMiAqICgoeCkgKyAxKV0KKyAgICBmb3IgKGkgPSAwLCBuZXdfbmJfaXRlbXMgPSAwOyBpIDwgbmJfcG9pbnRzOyBpKyspIHsKKyAgICAgICAgY2hhciAqdHN0ciA9IGF2X3N0cnRvayhwLCAiLCIsICZzYXZlcHRyKTsKKyAgICAgICAgcCA9IE5VTEw7CisgICAgICAgIGlmICghdHN0ciB8fCBzc2NhbmYodHN0ciwgIiVsZi8lbGYiLCAmUyhpKS54LCAmUyhpKS55KSAhPSAyKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGFuZC9vciBtaXNzaW5nIGlucHV0L291dHB1dCB2YWx1ZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaSAmJiBTKGkgLSAxKS54ID4gUyhpKS54KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJUcmFuc2ZlciBmdW5jdGlvbiBpbnB1dCB2YWx1ZXMgbXVzdCBiZSBpbmNyZWFzaW5nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIFMoaSkueSAtPSBTKGkpLng7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiVkOiB4PSVmIHk9JWZcbiIsIGksIFMoaSkueCwgUyhpKS55KTsKKyAgICAgICAgbmV3X25iX2l0ZW1zKys7CisgICAgfQorICAgIG51bSA9IG5ld19uYl9pdGVtczsKKworICAgIC8qIEFkZCAwLDAgaWYgbmVjZXNzYXJ5ICovCisgICAgaWYgKG51bSA9PSAwIHx8IFMobnVtIC0gMSkueCkKKyAgICAgICAgbnVtKys7CisKKyN1bmRlZiBTCisjZGVmaW5lIFMoeCkgcy0+c2VnbWVudHNbMiAqICh4KV0KKyAgICAvKiBBZGQgYSB0YWlsIG9mZiBzZWdtZW50IGF0IHRoZSBzdGFydCAqLworICAgIFMoMCkueCA9IFMoMSkueCAtIDIgKiBzLT5jdXJ2ZV9kQjsKKyAgICBTKDApLnkgPSBTKDEpLnk7CisgICAgbnVtKys7CisKKyAgICAvKiBKb2luIGFkamFjZW50IGNvbGluZWFyIHNlZ21lbnRzICovCisgICAgZm9yIChpID0gMjsgaSA8IG51bTsgaSsrKSB7CisgICAgICAgIGRvdWJsZSBnMSA9IChTKGkgLSAxKS55IC0gUyhpIC0gMikueSkgKiAoUyhpIC0gMCkueCAtIFMoaSAtIDEpLngpOworICAgICAgICBkb3VibGUgZzIgPSAoUyhpIC0gMCkueSAtIFMoaSAtIDEpLnkpICogKFMoaSAtIDEpLnggLSBTKGkgLSAyKS54KTsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgaWYgKGZhYnMoZzEgLSBnMikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbnVtLS07CisgICAgICAgIGZvciAoaiA9IC0taTsgaiA8IG51bTsgaisrKQorICAgICAgICAgICAgUyhqKSA9IFMoaiArIDEpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zZWdtZW50czsgaSArPSAyKSB7CisgICAgICAgIHMtPnNlZ21lbnRzW2ldLnkgKz0gcy0+Z2Fpbl9kQjsKKyAgICAgICAgcy0+c2VnbWVudHNbaV0ueCAqPSBNX0xOMTAgLyAyMDsKKyAgICAgICAgcy0+c2VnbWVudHNbaV0ueSAqPSBNX0xOMTAgLyAyMDsKKyAgICB9CisKKyNkZWZpbmUgTCh4KSBzLT5zZWdtZW50c1tpIC0gKHgpXQorICAgIGZvciAoaSA9IDQ7IGkgPCBzLT5uYl9zZWdtZW50czsgaSArPSAyKSB7CisgICAgICAgIGRvdWJsZSB4LCB5LCBjeCwgY3ksIGluMSwgaW4yLCBvdXQxLCBvdXQyLCB0aGV0YSwgbGVuLCByOworCisgICAgICAgIEwoNCkuYSA9IDA7CisgICAgICAgIEwoNCkuYiA9IChMKDIpLnkgLSBMKDQpLnkpIC8gKEwoMikueCAtIEwoNCkueCk7CisKKyAgICAgICAgTCgyKS5hID0gMDsKKyAgICAgICAgTCgyKS5iID0gKEwoMCkueSAtIEwoMikueSkgLyAoTCgwKS54IC0gTCgyKS54KTsKKworICAgICAgICB0aGV0YSA9IGF0YW4yKEwoMikueSAtIEwoNCkueSwgTCgyKS54IC0gTCg0KS54KTsKKyAgICAgICAgbGVuID0gaHlwb3QoTCgyKS54IC0gTCg0KS54LCBMKDIpLnkgLSBMKDQpLnkpOworICAgICAgICByID0gRkZNSU4ocmFkaXVzLCBsZW4pOworICAgICAgICBMKDMpLnggPSBMKDIpLnggLSByICogY29zKHRoZXRhKTsKKyAgICAgICAgTCgzKS55ID0gTCgyKS55IC0gciAqIHNpbih0aGV0YSk7CisKKyAgICAgICAgdGhldGEgPSBhdGFuMihMKDApLnkgLSBMKDIpLnksIEwoMCkueCAtIEwoMikueCk7CisgICAgICAgIGxlbiA9IGh5cG90KEwoMCkueCAtIEwoMikueCwgTCgwKS55IC0gTCgyKS55KTsKKyAgICAgICAgciA9IEZGTUlOKHJhZGl1cywgbGVuIC8gMik7CisgICAgICAgIHggPSBMKDIpLnggKyByICogY29zKHRoZXRhKTsKKyAgICAgICAgeSA9IEwoMikueSArIHIgKiBzaW4odGhldGEpOworCisgICAgICAgIGN4ID0gKEwoMykueCArIEwoMikueCArIHgpIC8gMzsKKyAgICAgICAgY3kgPSAoTCgzKS55ICsgTCgyKS55ICsgeSkgLyAzOworCisgICAgICAgIEwoMikueCA9IHg7CisgICAgICAgIEwoMikueSA9IHk7CisKKyAgICAgICAgaW4xICA9IGN4IC0gTCgzKS54OworICAgICAgICBvdXQxID0gY3kgLSBMKDMpLnk7CisgICAgICAgIGluMiAgPSBMKDIpLnggLSBMKDMpLng7CisgICAgICAgIG91dDIgPSBMKDIpLnkgLSBMKDMpLnk7CisgICAgICAgIEwoMykuYSA9IChvdXQyIC8gaW4yIC0gb3V0MSAvIGluMSkgLyAoaW4yIC0gaW4xKTsKKyAgICAgICAgTCgzKS5iID0gb3V0MSAvIGluMSAtIEwoMykuYSAqIGluMTsKKyAgICB9CisgICAgTCgzKS54ID0gMDsKKyAgICBMKDMpLnkgPSBMKDIpLnk7CisKKyAgICBzLT5pbl9taW5fbGluICA9IGV4cChzLT5zZWdtZW50c1sxXS54KTsKKyAgICBzLT5vdXRfbWluX2xpbiA9IGV4cChzLT5zZWdtZW50c1sxXS55KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzcXVhcmVfcXVhZHJhdGljKGRvdWJsZSBjb25zdCAqeCwgZG91YmxlICp5KQoreworICAgIHlbMF0gPSB4WzBdICogeFswXTsKKyAgICB5WzFdID0gMiAqIHhbMF0gKiB4WzFdOworICAgIHlbMl0gPSAyICogeFswXSAqIHhbMl0gKyB4WzFdICogeFsxXTsKKyAgICB5WzNdID0gMiAqIHhbMV0gKiB4WzJdOworICAgIHlbNF0gPSB4WzJdICogeFsyXTsKK30KKworc3RhdGljIGludCBjcm9zc292ZXJfc2V0dXAoQVZGaWx0ZXJMaW5rICpvdXRsaW5rLCBDcm9zc292ZXIgKnAsIGRvdWJsZSBmcmVxdWVuY3kpCit7CisgICAgZG91YmxlIHcwID0gMiAqIE1fUEkgKiBmcmVxdWVuY3kgLyBvdXRsaW5rLT5zYW1wbGVfcmF0ZTsKKyAgICBkb3VibGUgUSA9IHNxcnQoLjUpLCBhbHBoYSA9IHNpbih3MCkgLyAoMipRKTsKKyAgICBkb3VibGUgeFs5XSwgbm9ybTsKKyAgICBpbnQgaTsKKworICAgIGlmICh3MCA+IE1fUEkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICB4WzBdID0gICgxIC0gY29zKHcwKSkvMjsgICAgICAgICAgIC8qIENmLiBmaWx0ZXJfTFBGIGluIGJpcXVhZHMuYyAqLworICAgIHhbMV0gPSAgIDEgLSBjb3ModzApOworICAgIHhbMl0gPSAgKDEgLSBjb3ModzApKS8yOworICAgIHhbM10gPSAgKDEgKyBjb3ModzApKS8yOyAgICAgICAgICAgLyogQ2YuIGZpbHRlcl9IUEYgaW4gYmlxdWFkcy5jICovCisgICAgeFs0XSA9IC0oMSArIGNvcyh3MCkpOworICAgIHhbNV0gPSAgKDEgKyBjb3ModzApKS8yOworICAgIHhbNl0gPSAgIDEgKyBhbHBoYTsKKyAgICB4WzddID0gIC0yKmNvcyh3MCk7CisgICAgeFs4XSA9ICAgMSAtIGFscGhhOworCisgICAgZm9yIChub3JtID0geFs2XSwgaSA9IDA7IGkgPCA5OyArK2kpCisgICAgICAgIHhbaV0gLz0gbm9ybTsKKworICAgIHNxdWFyZV9xdWFkcmF0aWMoeCAgICAsIHAtPmNvZWZzKTsKKyAgICBzcXVhcmVfcXVhZHJhdGljKHggKyAzLCBwLT5jb2VmcyArIDUpOworICAgIHNxdWFyZV9xdWFkcmF0aWMoeCArIDYsIHAtPmNvZWZzICsgMTApOworCisgICAgcC0+cHJldmlvdXMgPSBhdl9jYWxsb2Mob3V0bGluay0+Y2hhbm5lbHMsIHNpemVvZigqcC0+cHJldmlvdXMpKTsKKyAgICBpZiAoIXAtPnByZXZpb3VzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gb3V0bGluay0+c3JjOworICAgIE1Db21wYW5kQ29udGV4dCAqcyAgICA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0LCBjaCwgaSwgaywgbmV3X25iX2l0ZW1zLCBuYl9iYW5kczsKKyAgICBjaGFyICpwID0gcy0+YXJncywgKnNhdmVwdHIgPSBOVUxMOworICAgIGludCBtYXhfZGVsYXlfc2l6ZSA9IDA7CisKKyAgICBjb3VudF9pdGVtcyhzLT5hcmdzLCAmbmJfYmFuZHMsICd8Jyk7CisgICAgcy0+bmJfYmFuZHMgPSBGRk1BWCgxLCBuYl9iYW5kcyk7CisKKyAgICBzLT5iYW5kcyA9IGF2X2NhbGxvYyhuYl9iYW5kcywgc2l6ZW9mKCpzLT5iYW5kcykpOworICAgIGlmICghcy0+YmFuZHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwLCBuZXdfbmJfaXRlbXMgPSAwOyBpIDwgbmJfYmFuZHM7IGkrKykgeworICAgICAgICBpbnQgbmJfcG9pbnRzLCBuYl9hdHRhY2tzLCBuYl9pdGVtcyA9IDA7CisgICAgICAgIGNoYXIgKnRzdHIyLCAqdHN0ciA9IGF2X3N0cnRvayhwLCAifCIsICZzYXZlcHRyKTsKKyAgICAgICAgY2hhciAqcDIsICpwMywgKnNhdmVwdHIyID0gTlVMTCwgKnNhdmVwdHIzID0gTlVMTDsKKyAgICAgICAgZG91YmxlIHJhZGl1czsKKworICAgICAgICBpZiAoIXRzdHIpIHsKKyAgICAgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBwID0gTlVMTDsKKworICAgICAgICBwMiA9IHRzdHI7CisgICAgICAgIGNvdW50X2l0ZW1zKHRzdHIsICZuYl9pdGVtcywgJyAnKTsKKyAgICAgICAgdHN0cjIgPSBhdl9zdHJ0b2socDIsICIgIiwgJnNhdmVwdHIyKTsKKyAgICAgICAgaWYgKCF0c3RyMikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiYXQgbGVhc3Qgb25lIGF0dGFja3MvZGVjYXlzIHJhdGUgaXMgbWFuZGF0b3J5XG4iKTsKKyAgICAgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBwMiA9IE5VTEw7CisgICAgICAgIHAzID0gdHN0cjI7CisKKyAgICAgICAgY291bnRfaXRlbXModHN0cjIsICZuYl9hdHRhY2tzLCAnLCcpOworICAgICAgICBpZiAoIW5iX2F0dGFja3MgfHwgbmJfYXR0YWNrcyAmIDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIm51bWJlciBvZiBhdHRhY2tzIHJhdGUgcGx1cyBkZWNheXMgcmF0ZSBtdXN0IGJlIGV2ZW5cbiIpOworICAgICAgICAgICAgdW5pbml0KGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgcy0+YmFuZHNbaV0uYXR0YWNrX3JhdGUgPSBhdl9jYWxsb2Mob3V0bGluay0+Y2hhbm5lbHMsIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgcy0+YmFuZHNbaV0uZGVjYXlfcmF0ZSA9IGF2X2NhbGxvYyhvdXRsaW5rLT5jaGFubmVscywgc2l6ZW9mKGRvdWJsZSkpOworICAgICAgICBzLT5iYW5kc1tpXS52b2x1bWUgPSBhdl9jYWxsb2Mob3V0bGluay0+Y2hhbm5lbHMsIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IEZGTUlOKG5iX2F0dGFja3MgLyAyLCBvdXRsaW5rLT5jaGFubmVscyk7IGsrKykgeworICAgICAgICAgICAgY2hhciAqdHN0cjMgPSBhdl9zdHJ0b2socDMsICIsIiwgJnNhdmVwdHIzKTsKKworICAgICAgICAgICAgcDMgPSBOVUxMOworICAgICAgICAgICAgc3NjYW5mKHRzdHIzLCAiJWxmIiwgJnMtPmJhbmRzW2ldLmF0dGFja19yYXRlW2tdKTsKKyAgICAgICAgICAgIHRzdHIzID0gYXZfc3RydG9rKHAzLCAiLCIsICZzYXZlcHRyMyk7CisgICAgICAgICAgICBzc2NhbmYodHN0cjMsICIlbGYiLCAmcy0+YmFuZHNbaV0uZGVjYXlfcmF0ZVtrXSk7CisKKyAgICAgICAgICAgIGlmIChzLT5iYW5kc1tpXS5hdHRhY2tfcmF0ZVtrXSA+IDEuMCAvIG91dGxpbmstPnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICAgICAgcy0+YmFuZHNbaV0uYXR0YWNrX3JhdGVba10gPSAxLjAgLSBleHAoLTEuMCAvIChvdXRsaW5rLT5zYW1wbGVfcmF0ZSAqIHMtPmJhbmRzW2ldLmF0dGFja19yYXRlW2tdKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPmJhbmRzW2ldLmF0dGFja19yYXRlW2tdID0gMS4wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocy0+YmFuZHNbaV0uZGVjYXlfcmF0ZVtrXSA+IDEuMCAvIG91dGxpbmstPnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICAgICAgcy0+YmFuZHNbaV0uZGVjYXlfcmF0ZVtrXSA9IDEuMCAtIGV4cCgtMS4wIC8gKG91dGxpbmstPnNhbXBsZV9yYXRlICogcy0+YmFuZHNbaV0uZGVjYXlfcmF0ZVtrXSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzLT5iYW5kc1tpXS5kZWNheV9yYXRlW2tdID0gMS4wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChjaCA9IGs7IGNoIDwgb3V0bGluay0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIHMtPmJhbmRzW2ldLmF0dGFja19yYXRlW2NoXSA9IHMtPmJhbmRzW2ldLmF0dGFja19yYXRlW2sgLSAxXTsKKyAgICAgICAgICAgIHMtPmJhbmRzW2ldLmRlY2F5X3JhdGVbY2hdICA9IHMtPmJhbmRzW2ldLmRlY2F5X3JhdGVbayAtIDFdOworICAgICAgICB9CisKKyAgICAgICAgdHN0cjIgPSBhdl9zdHJ0b2socDIsICIgIiwgJnNhdmVwdHIyKTsKKyAgICAgICAgaWYgKCF0c3RyMikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAidHJhbnNmZXIgZnVuY3Rpb24gY3VydmUgaW4gZEIgbXVzdCBiZSBzZXRcbiIpOworICAgICAgICAgICAgdW5pbml0KGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHNzY2FuZih0c3RyMiwgIiVsZiIsICZzLT5iYW5kc1tpXS50cmFuc2Zlcl9mbi5jdXJ2ZV9kQik7CisKKyAgICAgICAgcmFkaXVzID0gcy0+YmFuZHNbaV0udHJhbnNmZXJfZm4uY3VydmVfZEIgKiBNX0xOMTAgLyAyMC4wOworCisgICAgICAgIHRzdHIyID0gYXZfc3RydG9rKHAyLCAiICIsICZzYXZlcHRyMik7CisgICAgICAgIGlmICghdHN0cjIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgInRyYW5zZmVyIHBvaW50cyBtaXNzaW5nXG4iKTsKKyAgICAgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50X2l0ZW1zKHRzdHIyLCAmbmJfcG9pbnRzLCAnLCcpOworICAgICAgICBzLT5iYW5kc1tpXS50cmFuc2Zlcl9mbi5uYl9zZWdtZW50cyA9IChuYl9wb2ludHMgKyA0KSAqIDI7CisgICAgICAgIHMtPmJhbmRzW2ldLnRyYW5zZmVyX2ZuLnNlZ21lbnRzID0gYXZfY2FsbG9jKHMtPmJhbmRzW2ldLnRyYW5zZmVyX2ZuLm5iX3NlZ21lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ29tcGFuZFNlZ21lbnQpKTsKKyAgICAgICAgaWYgKCFzLT5iYW5kc1tpXS50cmFuc2Zlcl9mbi5zZWdtZW50cykgeworICAgICAgICAgICAgdW5pbml0KGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gcGFyc2VfcG9pbnRzKHRzdHIyLCBuYl9wb2ludHMsIHJhZGl1cywgJnMtPmJhbmRzW2ldLnRyYW5zZmVyX2ZuLCBjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAidHJhbnNmZXIgcG9pbnRzIHBhcnNpbmcgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHVuaW5pdChjdHgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHRzdHIyID0gYXZfc3RydG9rKHAyLCAiICIsICZzYXZlcHRyMik7CisgICAgICAgIGlmICghdHN0cjIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNyb3Nzb3Zlcl9mcmVxdWVuY3kgaXMgbWlzc2luZ1xuIik7CisgICAgICAgICAgICB1bmluaXQoY3R4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBuZXdfbmJfaXRlbXMgKz0gc3NjYW5mKHRzdHIyLCAiJWxmIiwgJnMtPmJhbmRzW2ldLnRvcGZyZXEpID09IDE7CisgICAgICAgIGlmIChzLT5iYW5kc1tpXS50b3BmcmVxIDwgMCB8fCBzLT5iYW5kc1tpXS50b3BmcmVxID49IG91dGxpbmstPnNhbXBsZV9yYXRlIC8gMikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY3Jvc3NvdmVyX2ZyZXF1ZW5jeTogJWYsIHNob3VsZCBiZSA+PTAgYW5kIGxvd2VyIHRoYW4gaGFsZiBvZiBzYW1wbGUgcmF0ZTogJWQuXG4iLCBzLT5iYW5kc1tpXS50b3BmcmVxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSAvIDIpOworICAgICAgICAgICAgdW5pbml0KGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPmJhbmRzW2ldLnRvcGZyZXEgIT0gMCkgeworICAgICAgICAgICAgcmV0ID0gY3Jvc3NvdmVyX3NldHVwKG91dGxpbmssICZzLT5iYW5kc1tpXS5maWx0ZXIsIHMtPmJhbmRzW2ldLnRvcGZyZXEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICB1bmluaXQoY3R4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHN0cjIgPSBhdl9zdHJ0b2socDIsICIgIiwgJnNhdmVwdHIyKTsKKyAgICAgICAgaWYgKHRzdHIyKSB7CisgICAgICAgICAgICBzc2NhbmYodHN0cjIsICIlbGYiLCAmcy0+YmFuZHNbaV0uZGVsYXkpOworICAgICAgICAgICAgbWF4X2RlbGF5X3NpemUgPSBGRk1BWChtYXhfZGVsYXlfc2l6ZSwgcy0+YmFuZHNbaV0uZGVsYXkgKiBvdXRsaW5rLT5zYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgICAgIHRzdHIyID0gYXZfc3RydG9rKHAyLCAiICIsICZzYXZlcHRyMik7CisgICAgICAgICAgICBpZiAodHN0cjIpIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgaW5pdGlhbF92b2x1bWU7CisKKyAgICAgICAgICAgICAgICBzc2NhbmYodHN0cjIsICIlbGYiLCAmaW5pdGlhbF92b2x1bWUpOworICAgICAgICAgICAgICAgIGluaXRpYWxfdm9sdW1lID0gcG93KDEwLjAsIGluaXRpYWxfdm9sdW1lIC8gMjApOworCisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG91dGxpbmstPmNoYW5uZWxzOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+YmFuZHNbaV0udm9sdW1lW2tdID0gaW5pdGlhbF92b2x1bWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHN0cjIgPSBhdl9zdHJ0b2socDIsICIgIiwgJnNhdmVwdHIyKTsKKyAgICAgICAgICAgICAgICBpZiAodHN0cjIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3NjYW5mKHRzdHIyLCAiJWxmIiwgJnMtPmJhbmRzW2ldLnRyYW5zZmVyX2ZuLmdhaW5fZEIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzLT5uYl9iYW5kcyA9IG5ld19uYl9pdGVtczsKKworICAgIGZvciAoaSA9IDA7IG1heF9kZWxheV9zaXplID4gMCAmJiBpIDwgcy0+bmJfYmFuZHM7IGkrKykgeworICAgICAgICBzLT5iYW5kc1tpXS5kZWxheV9idWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG1heF9kZWxheV9zaXplKTsKKyAgICAgICAgaWYgKCFzLT5iYW5kc1tpXS5kZWxheV9idWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBzLT5kZWxheV9idWZfc2l6ZSA9IG1heF9kZWxheV9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ09OVk9MVkUgXyBfIF8gXworCitzdGF0aWMgdm9pZCBjcm9zc292ZXIoaW50IGNoLCBDcm9zc292ZXIgKnAsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICppYnVmLCBkb3VibGUgKm9idWZfbG93LAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqb2J1Zl9oaWdoLCBzaXplX3QgbGVuKQoreworICAgIGRvdWJsZSBvdXRfbG93LCBvdXRfaGlnaDsKKworICAgIHdoaWxlIChsZW4tLSkgeworICAgICAgICBwLT5wb3MgPSBwLT5wb3MgPyBwLT5wb3MgLSAxIDogTiAtIDE7CisjZGVmaW5lIF8gb3V0X2xvdyArPSBwLT5jb2Vmc1tqXSAqIHAtPnByZXZpb3VzW2NoXVtwLT5wb3MgKyBqXS5pbiBcCisgICAgICAgICAgICAtIHAtPmNvZWZzWzIqTisyICsgal0gKiBwLT5wcmV2aW91c1tjaF1bcC0+cG9zICsgal0ub3V0X2xvdywgaisrOworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaiA9IDE7CisgICAgICAgICAgICBvdXRfbG93ID0gcC0+Y29lZnNbMF0gKiAqaWJ1ZjsKKyAgICAgICAgICAgIENPTlZPTFZFCisgICAgICAgICAgICAqb2J1Zl9sb3crKyA9IG91dF9sb3c7CisgICAgICAgIH0KKyN1bmRlZiBfCisjZGVmaW5lIF8gb3V0X2hpZ2ggKz0gcC0+Y29lZnNbaitOKzFdICogcC0+cHJldmlvdXNbY2hdW3AtPnBvcyArIGpdLmluIFwKKyAgICAgICAgICAgIC0gcC0+Y29lZnNbMipOKzIgKyBqXSAqIHAtPnByZXZpb3VzW2NoXVtwLT5wb3MgKyBqXS5vdXRfaGlnaCwgaisrOworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaiA9IDE7CisgICAgICAgICAgICBvdXRfaGlnaCA9IHAtPmNvZWZzW04rMV0gKiAqaWJ1ZjsKKyAgICAgICAgICAgIENPTlZPTFZFCisgICAgICAgICAgICAqb2J1Zl9oaWdoKysgPSBvdXRfaGlnaDsKKyAgICAgICAgfQorICAgICAgICBwLT5wcmV2aW91c1tjaF1bcC0+cG9zICsgTl0uaW4gPSBwLT5wcmV2aW91c1tjaF1bcC0+cG9zXS5pbiA9ICppYnVmKys7CisgICAgICAgIHAtPnByZXZpb3VzW2NoXVtwLT5wb3MgKyBOXS5vdXRfbG93ID0gcC0+cHJldmlvdXNbY2hdW3AtPnBvc10ub3V0X2xvdyA9IG91dF9sb3c7CisgICAgICAgIHAtPnByZXZpb3VzW2NoXVtwLT5wb3MgKyBOXS5vdXRfaGlnaCA9IHAtPnByZXZpb3VzW2NoXVtwLT5wb3NdLm91dF9oaWdoID0gb3V0X2hpZ2g7CisgICAgfQorfQorCitzdGF0aWMgaW50IG1jb21wYW5kX2NoYW5uZWwoTUNvbXBhbmRDb250ZXh0ICpjLCBDb21wQmFuZCAqbCwgZG91YmxlICppYnVmLCBkb3VibGUgKm9idWYsIGludCBsZW4sIGludCBjaCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgICAgICBkb3VibGUgbGV2ZWxfaW5fbGluLCBsZXZlbF9vdXRfbGluLCBjaGVja2J1ZjsKKyAgICAgICAgLyogTWFpbnRhaW4gdGhlIHZvbHVtZSBmaWVsZHMgYnkgc2ltdWxhdGluZyBhIGxlYWt5IHB1bXAgY2lyY3VpdCAqLworICAgICAgICB1cGRhdGVfdm9sdW1lKGwsIGZhYnMoaWJ1ZltpXSksIGNoKTsKKworICAgICAgICAvKiBWb2x1bWUgbWVtb3J5IGlzIHVwZGF0ZWQ6IHBlcmZvcm0gY29tcGFuZCAqLworICAgICAgICBsZXZlbF9pbl9saW4gPSBsLT52b2x1bWVbY2hdOworICAgICAgICBsZXZlbF9vdXRfbGluID0gZ2V0X3ZvbHVtZSgmbC0+dHJhbnNmZXJfZm4sIGxldmVsX2luX2xpbik7CisKKyAgICAgICAgaWYgKGMtPmRlbGF5X2J1Zl9zaXplIDw9IDApIHsKKyAgICAgICAgICAgIGNoZWNrYnVmID0gaWJ1ZltpXSAqIGxldmVsX291dF9saW47CisgICAgICAgICAgICBvYnVmW2ldID0gY2hlY2tidWY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgKmRlbGF5X2J1ZiA9IChkb3VibGUgKilsLT5kZWxheV9idWYtPmV4dGVuZGVkX2RhdGFbY2hdOworCisgICAgICAgICAgICAvKiBGSVhNRTogbm90ZSB0aGF0IHRoaXMgbG9va2FoZWFkIGFsZ29yaXRobSBpcyByZWFsbHkgbGFtZToKKyAgICAgICAgICAgICAgIHRoZSByZXNwb25zZSB0byBhIHBlYWsgaXMgcmVsZWFzZWQgYmVmb3JlIHRoZSBwZWFrCisgICAgICAgICAgICAgICBhcnJpdmVzLiAqLworCisgICAgICAgICAgICAvKiBiZWNhdXNlIHZvbHVtZSBhcHBsaWNhdGlvbiBkZWxheXMgZGlmZmVyIGJhbmQgdG8gYmFuZCwgYnV0CisgICAgICAgICAgICAgICB0b3RhbCBkZWxheSBkb2Vzbid0LCB0aGUgdm9sdW1lIGlzIGFwcGxpZWQgaW4gYW4gaXRlcmF0aW9uCisgICAgICAgICAgICAgICBwcmVjZWRpbmcgdGhhdCBpbiB3aGljaCB0aGUgc2FtcGxlIGdvZXMgdG8gb2J1ZiwgZXhjZXB0IGluCisgICAgICAgICAgICAgICB0aGUgYmFuZChzKSB3aXRoIHRoZSBsb25nZXN0IHZvbCBhcHAgZGVsYXkuCisKKyAgICAgICAgICAgICAgIHRoZSBvZmZzZXQgYmV0d2VlbiBkZWxheV9idWZfcHRyIGFuZCB0aGUgc2FtcGxlIHRvIGFwcGx5CisgICAgICAgICAgICAgICB2b2wgdG8sIGlzIGEgY29uc3RhbnQgZXF1YWwgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGlzCisgICAgICAgICAgICAgICBiYW5kJ3MgZGVsYXkgYW5kIHRoZSBsb25nZXN0IGRlbGF5IG9mIGFsbCB0aGUgYmFuZHMuICovCisKKyAgICAgICAgICAgIGlmIChsLT5kZWxheV9idWZfY250ID49IGwtPmRlbGF5X3NpemUpIHsKKyAgICAgICAgICAgICAgICBjaGVja2J1ZiA9CisgICAgICAgICAgICAgICAgICAgIGRlbGF5X2J1ZlsobC0+ZGVsYXlfYnVmX3B0ciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZGVsYXlfYnVmX3NpemUgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwtPmRlbGF5X3NpemUpICUgYy0+ZGVsYXlfYnVmX3NpemVdICogbGV2ZWxfb3V0X2xpbjsKKyAgICAgICAgICAgICAgICBkZWxheV9idWZbKGwtPmRlbGF5X2J1Zl9wdHIgKyBjLT5kZWxheV9idWZfc2l6ZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsLT5kZWxheV9zaXplKSAlIGMtPmRlbGF5X2J1Zl9zaXplXSA9IGNoZWNrYnVmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGwtPmRlbGF5X2J1Zl9jbnQgPj0gYy0+ZGVsYXlfYnVmX3NpemUpIHsKKyAgICAgICAgICAgICAgICBvYnVmW2ldID0gZGVsYXlfYnVmW2wtPmRlbGF5X2J1Zl9wdHJdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsLT5kZWxheV9idWZfY250Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxheV9idWZbbC0+ZGVsYXlfYnVmX3B0cisrXSA9IGlidWZbaV07CisgICAgICAgICAgICBsLT5kZWxheV9idWZfcHRyICU9IGMtPmRlbGF5X2J1Zl9zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgTUNvbXBhbmRDb250ZXh0ICpzICAgID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKm91dCwgKmFidWYsICpiYnVmLCAqY2J1ZjsKKyAgICBpbnQgY2gsIGJhbmQsIGk7CisKKyAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKHMtPmJhbmRfc2FtcGxlcyA8IGluLT5uYl9zYW1wbGVzKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmJhbmRfYnVmMSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmJhbmRfYnVmMik7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmJhbmRfYnVmMyk7CisKKyAgICAgICAgcy0+YmFuZF9idWYxID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgIHMtPmJhbmRfYnVmMiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBzLT5iYW5kX2J1ZjMgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgcy0+YmFuZF9zYW1wbGVzID0gaW4tPm5iX3NhbXBsZXM7CisgICAgfQorCisgICAgZm9yIChjaCA9IDA7IGNoIDwgb3V0bGluay0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZG91YmxlICphLCAqZHN0ID0gKGRvdWJsZSAqKW91dC0+ZXh0ZW5kZWRfZGF0YVtjaF07CisKKyAgICAgICAgZm9yIChiYW5kID0gMCwgYWJ1ZiA9IGluLCBiYnVmID0gcy0+YmFuZF9idWYyLCBjYnVmID0gcy0+YmFuZF9idWYxOyBiYW5kIDwgcy0+bmJfYmFuZHM7IGJhbmQrKykgeworICAgICAgICAgICAgQ29tcEJhbmQgKmIgPSAmcy0+YmFuZHNbYmFuZF07CisKKyAgICAgICAgICAgIGlmIChiLT50b3BmcmVxKSB7CisgICAgICAgICAgICAgICAgY3Jvc3NvdmVyKGNoLCAmYi0+ZmlsdGVyLCAoZG91YmxlICopYWJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjaF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUgKiliYnVmLT5leHRlbmRlZF9kYXRhW2NoXSwgKGRvdWJsZSAqKWNidWYtPmV4dGVuZGVkX2RhdGFbY2hdLCBpbi0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJidWYgPSBhYnVmOworICAgICAgICAgICAgICAgIGFidWYgPSBjYnVmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYWJ1ZiA9PSBpbikKKyAgICAgICAgICAgICAgICBhYnVmID0gcy0+YmFuZF9idWYzOworICAgICAgICAgICAgbWNvbXBhbmRfY2hhbm5lbChzLCBiLCAoZG91YmxlICopYmJ1Zi0+ZXh0ZW5kZWRfZGF0YVtjaF0sIChkb3VibGUgKilhYnVmLT5leHRlbmRlZF9kYXRhW2NoXSwgb3V0LT5uYl9zYW1wbGVzLCBjaCk7CisgICAgICAgICAgICBhID0gKGRvdWJsZSAqKWFidWYtPmV4dGVuZGVkX2RhdGFbY2hdOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dC0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgZHN0W2ldICs9IGFbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZGU1dBUChBVkZyYW1lICosIGFidWYsIGNidWYpOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0LT5wdHMgPSBpbi0+cHRzOworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG1jb21wYW5kX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbWNvbXBhbmRfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCisKK0FWRmlsdGVyIGZmX2FmX21jb21wYW5kID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtY29tcGFuZCIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoCisgICAgICAgICAgICAiTXVsdGliYW5kIENvbXByZXNzIG9yIGV4cGFuZCBhdWRpbyBkeW5hbWljIHJhbmdlLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzICA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKE1Db21wYW5kQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgID0gJm1jb21wYW5kX2NsYXNzLAorICAgIC51bmluaXQgICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICAgPSBtY29tcGFuZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gbWNvbXBhbmRfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9wYW4uYyBiL2xpYmF2ZmlsdGVyL2FmX3Bhbi5jCmluZGV4IDFlYjEwMmMuLjM0ZTUyMmMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX3Bhbi5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX3Bhbi5jCkBAIC0xMDIsMTkgKzEwMiwyNSBAQAogewogICAgIFBhbkNvbnRleHQgKmNvbnN0IHBhbiA9IGN0eC0+cHJpdjsKICAgICBjaGFyICphcmcsICphcmcwLCAqdG9rZW5pemVyLCAqYXJncyA9IGF2X3N0cmR1cChwYW4tPmFyZ3MpOwotICAgIGludCBvdXRfY2hfaWQsIGluX2NoX2lkLCBsZW4sIG5hbWVkLCByZXQ7CisgICAgaW50IG91dF9jaF9pZCwgaW5fY2hfaWQsIGxlbiwgbmFtZWQsIHJldCwgc2lnbiA9IDE7CiAgICAgaW50IG5iX2luX2NoYW5uZWxzWzJdID0geyAwLCAwIH07IC8vIG51bWJlciBvZiB1bm5hbWVkIGFuZCBuYW1lZCBpbnB1dCBjaGFubmVscworICAgIGludCB1c2VkX291dF9jaFtNQVhfQ0hBTk5FTFNdID0gezB9OwogICAgIGRvdWJsZSBnYWluOwogCiAgICAgaWYgKCFwYW4tPmFyZ3MpIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgInBhbiBmaWx0ZXIgbmVlZHMgYSBjaGFubmVsIGxheW91dCBhbmQgYSBzZXQgIgotICAgICAgICAgICAgICAgIm9mIGNoYW5uZWxzIGRlZmluaXRpb25zIGFzIHBhcmFtZXRlclxuIik7CisgICAgICAgICAgICAgICAib2YgY2hhbm5lbCBkZWZpbml0aW9ucyBhcyBwYXJhbWV0ZXJcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KICAgICBpZiAoIWFyZ3MpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXJnID0gYXZfc3RydG9rKGFyZ3MsICJ8IiwgJnRva2VuaXplcik7CisgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ2hhbm5lbCBsYXlvdXQgbm90IHNwZWNpZmllZFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KICAgICByZXQgPSBmZl9wYXJzZV9jaGFubmVsX2xheW91dCgmcGFuLT5vdXRfY2hhbm5lbF9sYXlvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhbi0+bmJfb3V0cHV0X2NoYW5uZWxzLCBhcmcsIGN0eCk7CiAgICAgaWYgKHJldCA8IDApCkBAIC0xMjIsNiArMTI4LDcgQEAKIAogICAgIC8qIHBhcnNlIGNoYW5uZWwgc3BlY2lmaWNhdGlvbnMgKi8KICAgICB3aGlsZSAoKGFyZyA9IGFyZzAgPSBhdl9zdHJ0b2soTlVMTCwgInwiLCAmdG9rZW5pemVyKSkpIHsKKyAgICAgICAgaW50IHVzZWRfaW5fY2hbTUFYX0NIQU5ORUxTXSA9IHswfTsKICAgICAgICAgLyogY2hhbm5lbCBuYW1lICovCiAgICAgICAgIGlmIChwYXJzZV9jaGFubmVsX25hbWUoJmFyZywgJm91dF9jaF9pZCwgJm5hbWVkKSkgewogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLApAQCAtMTQ4LDYgKzE1NSwxMyBAQAogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CisgICAgICAgIGlmICh1c2VkX291dF9jaFtvdXRfY2hfaWRdKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkNhbiBub3QgcmVmZXJlbmNlIG91dCBjaGFubmVsICVkIHR3aWNlXG4iLCBvdXRfY2hfaWQpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHVzZWRfb3V0X2NoW291dF9jaF9pZF0gPSAxOwogICAgICAgICBza2lwX3NwYWNlcygmYXJnKTsKICAgICAgICAgaWYgKCphcmcgPT0gJz0nKSB7CiAgICAgICAgICAgICBhcmcrKzsKQEAgLTE2MSw2ICsxNzUsNyBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgICAgIC8qIGdhaW5zICovCisgICAgICAgIHNpZ24gPSAxOwogICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgZ2FpbiA9IDE7CiAgICAgICAgICAgICBpZiAoc3NjYW5mKGFyZywgIiVsZiVuIColbiIsICZnYWluLCAmbGVuLCAmbGVuKSkKQEAgLTE3OCwxNCArMTkzLDI1IEBACiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhbi0+Z2FpbltvdXRfY2hfaWRdW2luX2NoX2lkXSA9IGdhaW47CisgICAgICAgICAgICBpZiAodXNlZF9pbl9jaFtpbl9jaF9pZF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJDYW4gbm90IHJlZmVyZW5jZSBpbiBjaGFubmVsICVkIHR3aWNlXG4iLCBpbl9jaF9pZCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVzZWRfaW5fY2hbaW5fY2hfaWRdID0gMTsKKyAgICAgICAgICAgIHBhbi0+Z2FpbltvdXRfY2hfaWRdW2luX2NoX2lkXSA9IHNpZ24gKiBnYWluOwogICAgICAgICAgICAgc2tpcF9zcGFjZXMoJmFyZyk7CiAgICAgICAgICAgICBpZiAoISphcmcpCiAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBpZiAoKmFyZyAhPSAnKycpIHsKKyAgICAgICAgICAgIGlmICgqYXJnID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKmFyZyAhPSAnKycpIHsKICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTeW50YXggZXJyb3IgbmVhciBcIiUuOHNcIlxuIiwgYXJnKTsKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaWduID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGFyZysrOwogICAgICAgICB9CkBAIC0yNzYsNyArMzAyLDcgQEAKICAgICBpZiAobGluay0+Y2hhbm5lbHMgPiBNQVhfQ0hBTk5FTFMgfHwKICAgICAgICAgcGFuLT5uYl9vdXRwdXRfY2hhbm5lbHMgPiBNQVhfQ0hBTk5FTFMpIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgImFmX3BhbiBzdXBwb3J0IGEgbWF4aW11bSBvZiAlZCBjaGFubmVscy4gIgorICAgICAgICAgICAgICAgImFmX3BhbiBzdXBwb3J0cyBhIG1heGltdW0gb2YgJWQgY2hhbm5lbHMuICIKICAgICAgICAgICAgICAgICJGZWVsIGZyZWUgdG8gYXNrIGZvciBhIGhpZ2hlciBsaW1pdC5cbiIsIE1BWF9DSEFOTkVMUyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CkBAIC0zMjIsNyArMzQ4LDcgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIHQgPSAwOwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxpbmstPmNoYW5uZWxzOyBqKyspCi0gICAgICAgICAgICAgICAgdCArPSBwYW4tPmdhaW5baV1bal07CisgICAgICAgICAgICAgICAgdCArPSBmYWJzKHBhbi0+Z2FpbltpXVtqXSk7CiAgICAgICAgICAgICBpZiAodCA+IC0xRS01ICYmIHQgPCAxRS01KSB7CiAgICAgICAgICAgICAgICAgLy8gdCBpcyBhbG1vc3QgMCBidXQgbm90IGV4YWN0bHksIHRoaXMgaXMgcHJvYmFibHkgYSBtaXN0YWtlCiAgICAgICAgICAgICAgICAgaWYgKHQpCkBAIC0zNzQsMTMgKzQwMCwxNSBAQAogICAgIEFWRnJhbWUgKm91dHNhbXBsZXMgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG4pOwogICAgIFBhbkNvbnRleHQgKnBhbiA9IGlubGluay0+ZHN0LT5wcml2OwogCi0gICAgaWYgKCFvdXRzYW1wbGVzKQorICAgIGlmICghb3V0c2FtcGxlcykgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnNhbXBsZXMpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KICAgICBzd3JfY29udmVydChwYW4tPnN3ciwgb3V0c2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YSwgbiwKICAgICAgICAgICAgICAgICAodm9pZCAqKWluc2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YSwgbik7CiAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXRzYW1wbGVzLCBpbnNhbXBsZXMpOwogICAgIG91dHNhbXBsZXMtPmNoYW5uZWxfbGF5b3V0ID0gb3V0bGluay0+Y2hhbm5lbF9sYXlvdXQ7Ci0gICAgYXZfZnJhbWVfc2V0X2NoYW5uZWxzKG91dHNhbXBsZXMsIG91dGxpbmstPmNoYW5uZWxzKTsKKyAgICBvdXRzYW1wbGVzLT5jaGFubmVscyA9IG91dGxpbmstPmNoYW5uZWxzOwogCiAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHNhbXBsZXMpOwogICAgIGF2X2ZyYW1lX2ZyZWUoJmluc2FtcGxlcyk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9yZXBsYXlnYWluLmMgYi9saWJhdmZpbHRlci9hZl9yZXBsYXlnYWluLmMKaW5kZXggYzhmNmY5Ni4uOTc2MTczNCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfcmVwbGF5Z2Fpbi5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX3JlcGxheWdhaW4uYwpAQCAtNTU0LDcgKzU1NCw3IEBACiAgICAgdWludDMyX3QgbGV2ZWw7CiAgICAgQVZGcmFtZSAqb3V0OwogCi0gICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKICAgICBpZiAoIW91dCkgewogICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9ydWJiZXJiYW5kLmMgYi9saWJhdmZpbHRlci9hZl9ydWJiZXJiYW5kLmMKaW5kZXggZGVkMjU0NC4uZWE2ZjRmZiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfcnViYmVyYmFuZC5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX3J1YmJlcmJhbmQuYwpAQCAtMTI4LDcgKzEyOCw3IEBACiAKICAgICBuYl9zYW1wbGVzID0gcnViYmVyYmFuZF9hdmFpbGFibGUocy0+cmJzKTsKICAgICBpZiAobmJfc2FtcGxlcyA+IDApIHsKLSAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIG5iX3NhbXBsZXMpOworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpOwogICAgICAgICBpZiAoIW91dCkgewogICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICAgICAgbmJfc2FtcGxlcyA9IHJ1YmJlcmJhbmRfYXZhaWxhYmxlKHMtPnJicyk7CiAKICAgICAgICAgICAgIGlmIChuYl9zYW1wbGVzID4gMCkgewotICAgICAgICAgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpOwogICAgICAgICAgICAgICAgIGlmICghb3V0KQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKHMtPm5iX3NhbXBsZXNfb3V0LApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfc2lkZWNoYWluY29tcHJlc3MuYyBiL2xpYmF2ZmlsdGVyL2FmX3NpZGVjaGFpbmNvbXByZXNzLmMKaW5kZXggM2Y1NDBlMi4uODg4MDQ5ZSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfc2lkZWNoYWluY29tcHJlc3MuYworKysgYi9saWJhdmZpbHRlci9hZl9zaWRlY2hhaW5jb21wcmVzcy5jCkBAIC0zMiw2ICszMiw3IEBACiAKICNpbmNsdWRlICJhdWRpby5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZmlsdGVycy5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKICNpbmNsdWRlICJoZXJtaXRlLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTcyLDcgKzczLDcgQEAKICAgICB7ICJyYXRpbyIsICAgICAic2V0IHJhdGlvIiwgICAgICAgICAgT0ZGU0VUKHJhdGlvKSwgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9Mn0sICAgICAgICAgICAgICAgMSwgICAyMCwgQXxGIH0sCiAgICAgeyAiYXR0YWNrIiwgICAgInNldCBhdHRhY2siLCAgICAgICAgIE9GRlNFVChhdHRhY2spLCAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTIwfSwgICAgICAgICAgIDAuMDEsIDIwMDAsIEF8RiB9LAogICAgIHsgInJlbGVhc2UiLCAgICJzZXQgcmVsZWFzZSIsICAgICAgICBPRkZTRVQocmVsZWFzZSksICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0yNTB9LCAgICAgICAgICAwLjAxLCA5MDAwLCBBfEYgfSwKLSAgICB7ICJtYWtldXAiLCAgICAic2V0IG1ha2UgdXAgZ2FpbiIsICAgT0ZGU0VUKG1ha2V1cCksICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9Mn0sICAgICAgICAgICAgICAgMSwgICA2NCwgQXxGIH0sCisgICAgeyAibWFrZXVwIiwgICAgInNldCBtYWtlIHVwIGdhaW4iLCAgIE9GRlNFVChtYWtldXApLCAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAgICAgICAgICAgICAgIDEsICAgNjQsIEF8RiB9LAogICAgIHsgImtuZWUiLCAgICAgICJzZXQga25lZSIsICAgICAgICAgICBPRkZTRVQoa25lZSksICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0yLjgyODQzfSwgICAgICAgICAxLCAgICA4LCBBfEYgfSwKICAgICB7ICJsaW5rIiwgICAgICAic2V0IGxpbmsgdHlwZSIsICAgICAgT0ZGU0VUKGxpbmspLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQ9MH0sICAgICAgICAgICAgICAgMCwgICAgMSwgQXxGLCAibGluayIgfSwKICAgICB7ICAgImF2ZXJhZ2UiLCAwLCAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9MH0sICAgICAgICAgICAgICAgMCwgICAgMCwgQXxGLCAibGluayIgfSwKQEAgLTE4Myw3MCArMTg0LDY5IEBACiB9CiAKICNpZiBDT05GSUdfU0lERUNIQUlOQ09NUFJFU1NfRklMVEVSCi1zdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmZyYW1lKQorc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPmRzdDsKICAgICBTaWRlY2hhaW5Db21wcmVzc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOwogICAgIEFWRnJhbWUgKm91dCA9IE5VTEwsICppblsyXSA9IHsgTlVMTCB9OworICAgIGludCByZXQsIGksIG5iX3NhbXBsZXM7CiAgICAgZG91YmxlICpkc3Q7Ci0gICAgaW50IG5iX3NhbXBsZXM7Ci0gICAgaW50IGk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICBpZiAobGluayA9PSBjdHgtPmlucHV0c1tpXSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIGF2X2Fzc2VydDAoaSA8IDIpOwotICAgIGF2X2F1ZGlvX2ZpZm9fd3JpdGUocy0+Zmlmb1tpXSwgKHZvaWQgKiopZnJhbWUtPmV4dGVuZGVkX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyk7Ci0gICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgIEZGX0ZJTFRFUl9GT1JXQVJEX1NUQVRVU19CQUNLX0FMTChjdHgtPm91dHB1dHNbMF0sIGN0eCk7CisgICAgaWYgKChyZXQgPSBmZl9pbmxpbmtfY29uc3VtZV9mcmFtZShjdHgtPmlucHV0c1swXSwgJmluWzBdKSkgPiAwKSB7CisgICAgICAgIGF2X2F1ZGlvX2ZpZm9fd3JpdGUocy0+Zmlmb1swXSwgKHZvaWQgKiopaW5bMF0tPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5bMF0tPm5iX3NhbXBsZXMpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpblswXSk7CisgICAgfQorICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gZmZfaW5saW5rX2NvbnN1bWVfZnJhbWUoY3R4LT5pbnB1dHNbMV0sICZpblsxXSkpID4gMCkgeworICAgICAgICBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmZpZm9bMV0sICh2b2lkICoqKWluWzFdLT5leHRlbmRlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluWzFdLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5bMV0pOworICAgIH0KKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIG5iX3NhbXBsZXMgPSBGRk1JTihhdl9hdWRpb19maWZvX3NpemUocy0+Zmlmb1swXSksIGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvWzFdKSk7Ci0gICAgaWYgKCFuYl9zYW1wbGVzKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7Ci0gICAgaWYgKCFvdXQpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICBpbltpXSA9IGZmX2dldF9hdWRpb19idWZmZXIoY3R4LT5pbnB1dHNbaV0sIG5iX3NhbXBsZXMpOwotICAgICAgICBpZiAoIWluW2ldKSB7Ci0gICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpblswXSk7Ci0gICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpblsxXSk7Ci0gICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgIGlmIChuYl9zYW1wbGVzKSB7CisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIoY3R4LT5vdXRwdXRzWzBdLCBuYl9zYW1wbGVzKTsKKyAgICAgICAgaWYgKCFvdXQpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBpbltpXSA9IGZmX2dldF9hdWRpb19idWZmZXIoY3R4LT5pbnB1dHNbaV0sIG5iX3NhbXBsZXMpOworICAgICAgICAgICAgaWYgKCFpbltpXSkgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluWzBdKTsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpblsxXSk7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfYXVkaW9fZmlmb19yZWFkKHMtPmZpZm9baV0sICh2b2lkICoqKWluW2ldLT5kYXRhLCBuYl9zYW1wbGVzKTsKICAgICAgICAgfQotICAgICAgICBhdl9hdWRpb19maWZvX3JlYWQocy0+Zmlmb1tpXSwgKHZvaWQgKiopaW5baV0tPmRhdGEsIG5iX3NhbXBsZXMpOworCisgICAgICAgIGRzdCA9IChkb3VibGUgKilvdXQtPmRhdGFbMF07CisgICAgICAgIG91dC0+cHRzID0gcy0+cHRzOworICAgICAgICBzLT5wdHMgKz0gbmJfc2FtcGxlczsKKworICAgICAgICBjb21wcmVzc29yKHMsIChkb3VibGUgKilpblswXS0+ZGF0YVswXSwgZHN0LAorICAgICAgICAgICAgICAgICAgIChkb3VibGUgKilpblsxXS0+ZGF0YVswXSwgbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICBzLT5sZXZlbF9pbiwgcy0+bGV2ZWxfc2MsCisgICAgICAgICAgICAgICAgICAgY3R4LT5pbnB1dHNbMF0sIGN0eC0+aW5wdXRzWzFdKTsKKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpblswXSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluWzFdKTsKKworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQotCi0gICAgZHN0ID0gKGRvdWJsZSAqKW91dC0+ZGF0YVswXTsKLSAgICBvdXQtPnB0cyA9IHMtPnB0czsKLSAgICBzLT5wdHMgKz0gbmJfc2FtcGxlczsKLQotICAgIGNvbXByZXNzb3IocywgKGRvdWJsZSAqKWluWzBdLT5kYXRhWzBdLCBkc3QsCi0gICAgICAgICAgICAgICAoZG91YmxlICopaW5bMV0tPmRhdGFbMF0sIG5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICBzLT5sZXZlbF9pbiwgcy0+bGV2ZWxfc2MsCi0gICAgICAgICAgICAgICBjdHgtPmlucHV0c1swXSwgY3R4LT5pbnB1dHNbMV0pOwotCi0gICAgYXZfZnJhbWVfZnJlZSgmaW5bMF0pOwotICAgIGF2X2ZyYW1lX2ZyZWUoJmluWzFdKTsKLQotICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKLX0KLQotc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKLXsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKLSAgICBTaWRlY2hhaW5Db21wcmVzc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgaW50IGk7Ci0KLSAgICAvKiBnZXQgYSBmcmFtZSBvbiBlYWNoIGlucHV0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzW2ldOwotICAgICAgICBpZiAoIWF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvW2ldKSkKLSAgICAgICAgICAgIHJldHVybiBmZl9yZXF1ZXN0X2ZyYW1lKGlubGluayk7CisgICAgRkZfRklMVEVSX0ZPUldBUkRfU1RBVFVTKGN0eC0+aW5wdXRzWzBdLCBjdHgtPm91dHB1dHNbMF0pOworICAgIEZGX0ZJTFRFUl9GT1JXQVJEX1NUQVRVUyhjdHgtPmlucHV0c1sxXSwgY3R4LT5vdXRwdXRzWzBdKTsKKyAgICBpZiAoZmZfb3V0bGlua19mcmFtZV93YW50ZWQoY3R4LT5vdXRwdXRzWzBdKSkgeworICAgICAgICBpZiAoIWF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvWzBdKSkKKyAgICAgICAgICAgIGZmX2lubGlua19yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICAgICAgaWYgKCFhdl9hdWRpb19maWZvX3NpemUocy0+Zmlmb1sxXSkpCisgICAgICAgICAgICBmZl9pbmxpbmtfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1sxXSk7CiAgICAgfQotCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTMyNSwxMSArMzI1LDkgQEAKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJtYWluIiwKICAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAotICAgICAgICAuZmlsdGVyX2ZyYW1lICAgPSBmaWx0ZXJfZnJhbWUsCiAgICAgfSx7CiAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJzaWRlY2hhaW4iLAogICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtMzM5LDcgKzMzNyw2IEBACiAgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAotICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTM1MCw2ICszNDcsNyBAQAogICAgIC5wcml2X3NpemUgICAgICA9IHNpemVvZihTaWRlY2hhaW5Db21wcmVzc0NvbnRleHQpLAogICAgIC5wcml2X2NsYXNzICAgICA9ICZzaWRlY2hhaW5jb21wcmVzc19jbGFzcywKICAgICAucXVlcnlfZm9ybWF0cyAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgICA9IGFjdGl2YXRlLAogICAgIC51bmluaXQgICAgICAgICA9IHVuaW5pdCwKICAgICAuaW5wdXRzICAgICAgICAgPSBzaWRlY2hhaW5jb21wcmVzc19pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgID0gc2lkZWNoYWluY29tcHJlc3Nfb3V0cHV0cywKQEAgLTM2OSw3ICszNjcsNyBAQAogICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbikpIHsKICAgICAgICAgb3V0ID0gaW47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBpbi0+bmJfc2FtcGxlcyk7CiAgICAgICAgIGlmICghb3V0KSB7CiAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfc2lsZW5jZWRldGVjdC5jIGIvbGliYXZmaWx0ZXIvYWZfc2lsZW5jZWRldGVjdC5jCmluZGV4IGIwNDhkNjMuLjZlMzIxYTUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX3NpbGVuY2VkZXRlY3QuYworKysgYi9saWJhdmZpbHRlci9hZl9zaWxlbmNlZGV0ZWN0LmMKQEAgLTM2LDkgKzM2LDE0IEBACiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgZG91YmxlIG5vaXNlOyAgICAgICAgICAgICAgIC8vLzwgbm9pc2UgYW1wbGl0dWRlIHJhdGlvCiAgICAgZG91YmxlIGR1cmF0aW9uOyAgICAgICAgICAgIC8vLzwgbWluaW11bSBkdXJhdGlvbiBvZiBzaWxlbmNlIHVudGlsIG5vdGlmaWNhdGlvbgotICAgIGludDY0X3QgbmJfbnVsbF9zYW1wbGVzOyAgICAvLy88IGN1cnJlbnQgbnVtYmVyIG9mIGNvbnRpbnVvdXMgemVybyBzYW1wbGVzCi0gICAgaW50NjRfdCBzdGFydDsgICAgICAgICAgICAgIC8vLzwgaWYgc2lsZW5jZSBpcyBkZXRlY3RlZCwgdGhpcyB2YWx1ZSBjb250YWlucyB0aGUgdGltZSBvZiB0aGUgZmlyc3QgemVybyBzYW1wbGUKKyAgICBpbnQgbW9ubzsgICAgICAgICAgICAgICAgICAgLy8vPCBtb25vIG1vZGUgOiBjaGVjayBlYWNoIGNoYW5uZWwgc2VwYXJhdGVseSAoZGVmYXVsdCA9IGNoZWNrIHdoZW4gQUxMIGNoYW5uZWxzIGFyZSBzaWxlbnQpCisgICAgaW50IGNoYW5uZWxzOyAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgaW50IGluZGVwZW5kYW50X2NoYW5uZWxzOyAgIC8vLzwgbnVtYmVyIG9mIGVudHJpZXMgaW4gZm9sbG93aW5nIGFycmF5cyAoYWx3YXlzIDEgaW4gbW9ubyBtb2RlKQorICAgIGludDY0X3QgKm5iX251bGxfc2FtcGxlczsgICAvLy88IChhcnJheSkgY3VycmVudCBudW1iZXIgb2YgY29udGludW91cyB6ZXJvIHNhbXBsZXMKKyAgICBpbnQ2NF90ICpzdGFydDsgICAgICAgICAgICAgLy8vPCAoYXJyYXkpIGlmIHNpbGVuY2UgaXMgZGV0ZWN0ZWQsIHRoaXMgdmFsdWUgY29udGFpbnMgdGhlIHRpbWUgb2YgdGhlIGZpcnN0IHplcm8gc2FtcGxlIChkZWZhdWx0L3Vuc2V0ID0gSU5UNjRfTUlOKQorICAgIGludDY0X3QgZnJhbWVfZW5kOyAgICAgICAgICAvLy88IHB0cyBvZiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lICh1c2VkIHRvIGNvbXB1dGUgZHVyYXRpb24gb2Ygc2lsZW5jZSBhdCBFT1MpCiAgICAgaW50IGxhc3Rfc2FtcGxlX3JhdGU7ICAgICAgIC8vLzwgbGFzdCBzYW1wbGUgcmF0ZSB0byBjaGVjayBmb3Igc2FtcGxlIHJhdGUgY2hhbmdlcworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlOyAgICAgICAvLy88IHRpbWVfYmFzZQogCiAgICAgdm9pZCAoKnNpbGVuY2VkZXRlY3QpKHN0cnVjdCBTaWxlbmNlRGV0ZWN0Q29udGV4dCAqcywgQVZGcmFtZSAqaW5zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcywgaW50NjRfdCBuYl9zYW1wbGVzX25vdGlmeSwKQEAgLTUyLDQ0ICs1Nyw2MSBAQAogICAgIHsgIm5vaXNlIiwgICAgICJzZXQgbm9pc2UgdG9sZXJhbmNlIiwgICAgICAgICAgICAgIE9GRlNFVChub2lzZSksICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuMDAxfSwgICAgICAgICAgMCwgREJMX01BWCwgIEZMQUdTIH0sCiAgICAgeyAiZCIsICAgICAgICAgInNldCBtaW5pbXVtIGR1cmF0aW9uIGluIHNlY29uZHMiLCAgT0ZGU0VUKGR1cmF0aW9uKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9Mi59LCAgICAgICAgICAgICAwLCAyNCo2MCo2MCwgRkxBR1MgfSwKICAgICB7ICJkdXJhdGlvbiIsICAic2V0IG1pbmltdW0gZHVyYXRpb24gaW4gc2Vjb25kcyIsICBPRkZTRVQoZHVyYXRpb24pLCAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0yLn0sICAgICAgICAgICAgIDAsIDI0KjYwKjYwLCBGTEFHUyB9LAorICAgIHsgIm1vbm8iLCAgICAgICJjaGVjayBlYWNoIGNoYW5uZWwgc2VwYXJhdGVseSIsICAgIE9GRlNFVChtb25vKSwgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgIHsuaTY0PTAufSwgICAgICAgICAgICAgMCwgMSwgRkxBR1MgfSwKICAgICB7IE5VTEwgfQogfTsKIAogQVZGSUxURVJfREVGSU5FX0NMQVNTKHNpbGVuY2VkZXRlY3QpOwogCi1zdGF0aWMgY2hhciAqZ2V0X21ldGFkYXRhX3ZhbChBVkZyYW1lICppbnNhbXBsZXMsIGNvbnN0IGNoYXIgKmtleSkKK3N0YXRpYyB2b2lkIHNldF9tZXRhKEFWRnJhbWUgKmluc2FtcGxlcywgaW50IGNoYW5uZWwsIGNvbnN0IGNoYXIgKmtleSwgY2hhciAqdmFsdWUpCiB7Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUgPSBhdl9kaWN0X2dldChpbnNhbXBsZXMtPm1ldGFkYXRhLCBrZXksIE5VTEwsIDApOwotICAgIHJldHVybiBlICYmIGUtPnZhbHVlID8gZS0+dmFsdWUgOiBOVUxMOwotfQorICAgIGNoYXIga2V5MlsxMjhdOwogCisgICAgaWYgKGNoYW5uZWwpCisgICAgICAgIHNucHJpbnRmKGtleTIsIHNpemVvZihrZXkyKSwgImxhdmZpLiVzLiVkIiwga2V5LCBjaGFubmVsKTsKKyAgICBlbHNlCisgICAgICAgIHNucHJpbnRmKGtleTIsIHNpemVvZihrZXkyKSwgImxhdmZpLiVzIiwga2V5KTsKKyAgICBhdl9kaWN0X3NldCgmaW5zYW1wbGVzLT5tZXRhZGF0YSwga2V5MiwgdmFsdWUsIDApOworfQogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCB1cGRhdGUoU2lsZW5jZURldGVjdENvbnRleHQgKnMsIEFWRnJhbWUgKmluc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19zaWxlbmNlLCBpbnQ2NF90IG5iX3NhbXBsZXNfbm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3NpbGVuY2UsIGludCBjdXJyZW50X3NhbXBsZSwgaW50NjRfdCBuYl9zYW1wbGVzX25vdGlmeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlKQogeworICAgIGludCBjaGFubmVsID0gY3VycmVudF9zYW1wbGUgJSBzLT5pbmRlcGVuZGFudF9jaGFubmVsczsKICAgICBpZiAoaXNfc2lsZW5jZSkgewotICAgICAgICBpZiAoIXMtPnN0YXJ0KSB7Ci0gICAgICAgICAgICBzLT5uYl9udWxsX3NhbXBsZXMrKzsKLSAgICAgICAgICAgIGlmIChzLT5uYl9udWxsX3NhbXBsZXMgPj0gbmJfc2FtcGxlc19ub3RpZnkpIHsKLSAgICAgICAgICAgICAgICBzLT5zdGFydCA9IGluc2FtcGxlcy0+cHRzIC0gKGludDY0X3QpKHMtPmR1cmF0aW9uIC8gYXZfcTJkKHRpbWVfYmFzZSkgKyAuNSk7Ci0gICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJmluc2FtcGxlcy0+bWV0YWRhdGEsICJsYXZmaS5zaWxlbmNlX3N0YXJ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKHMtPnN0YXJ0LCAmdGltZV9iYXNlKSwgMCk7CisgICAgICAgIGlmIChzLT5zdGFydFtjaGFubmVsXSA9PSBJTlQ2NF9NSU4pIHsKKyAgICAgICAgICAgIHMtPm5iX251bGxfc2FtcGxlc1tjaGFubmVsXSsrOworICAgICAgICAgICAgaWYgKHMtPm5iX251bGxfc2FtcGxlc1tjaGFubmVsXSA+PSBuYl9zYW1wbGVzX25vdGlmeSkgeworICAgICAgICAgICAgICAgIHMtPnN0YXJ0W2NoYW5uZWxdID0gaW5zYW1wbGVzLT5wdHMgKyBhdl9yZXNjYWxlX3EoY3VycmVudF9zYW1wbGUgLyBzLT5jaGFubmVscyArIDEgLSBuYl9zYW1wbGVzX25vdGlmeSAqIHMtPmluZGVwZW5kYW50X2NoYW5uZWxzIC8gcy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIHMtPmxhc3Rfc2FtcGxlX3JhdGUgfSwgdGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICBzZXRfbWV0YShpbnNhbXBsZXMsIHMtPm1vbm8gPyBjaGFubmVsICsgMSA6IDAsICJzaWxlbmNlX3N0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIocy0+c3RhcnRbY2hhbm5lbF0sICZ0aW1lX2Jhc2UpKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+bW9ubykKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiY2hhbm5lbDogJWQgfCAiLCBjaGFubmVsKTsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJzaWxlbmNlX3N0YXJ0OiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21ldGFkYXRhX3ZhbChpbnNhbXBsZXMsICJsYXZmaS5zaWxlbmNlX3N0YXJ0IikpOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfdHMydGltZXN0cihzLT5zdGFydFtjaGFubmVsXSwgJnRpbWVfYmFzZSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHMtPnN0YXJ0KSB7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldCgmaW5zYW1wbGVzLT5tZXRhZGF0YSwgImxhdmZpLnNpbGVuY2VfZW5kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIoaW5zYW1wbGVzLT5wdHMsICZ0aW1lX2Jhc2UpLCAwKTsKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZpbnNhbXBsZXMtPm1ldGFkYXRhLCAibGF2Zmkuc2lsZW5jZV9kdXJhdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGluc2FtcGxlcy0+cHRzIC0gcy0+c3RhcnQsICZ0aW1lX2Jhc2UpLCAwKTsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgICAgICAgICAic2lsZW5jZV9lbmQ6ICVzIHwgc2lsZW5jZV9kdXJhdGlvbjogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgZ2V0X21ldGFkYXRhX3ZhbChpbnNhbXBsZXMsICJsYXZmaS5zaWxlbmNlX2VuZCIpLAotICAgICAgICAgICAgICAgICAgIGdldF9tZXRhZGF0YV92YWwoaW5zYW1wbGVzLCAibGF2Zmkuc2lsZW5jZV9kdXJhdGlvbiIpKTsKKyAgICAgICAgaWYgKHMtPnN0YXJ0W2NoYW5uZWxdID4gSU5UNjRfTUlOKSB7CisgICAgICAgICAgICBpbnQ2NF90IGVuZF9wdHMgPSBpbnNhbXBsZXMgPyBpbnNhbXBsZXMtPnB0cyArIGF2X3Jlc2NhbGVfcShjdXJyZW50X3NhbXBsZSAvIHMtPmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIHMtPmxhc3Rfc2FtcGxlX3JhdGUgfSwgdGltZV9iYXNlKQorICAgICAgICAgICAgICAgICAgICA6IHMtPmZyYW1lX2VuZDsKKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25fdHMgPSBlbmRfcHRzIC0gcy0+c3RhcnRbY2hhbm5lbF07CisgICAgICAgICAgICBpZiAoaW5zYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgc2V0X21ldGEoaW5zYW1wbGVzLCBzLT5tb25vID8gY2hhbm5lbCArIDEgOiAwLCAic2lsZW5jZV9lbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZfdHMydGltZXN0cihlbmRfcHRzLCAmdGltZV9iYXNlKSk7CisgICAgICAgICAgICAgICAgc2V0X21ldGEoaW5zYW1wbGVzLCBzLT5tb25vID8gY2hhbm5lbCArIDEgOiAwLCAic2lsZW5jZV9kdXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGR1cmF0aW9uX3RzLCAmdGltZV9iYXNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+bW9ubykKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJjaGFubmVsOiAlZCB8ICIsIGNoYW5uZWwpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAic2lsZW5jZV9lbmQ6ICVzIHwgc2lsZW5jZV9kdXJhdGlvbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIoZW5kX3B0cywgJnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIoZHVyYXRpb25fdHMsICZ0aW1lX2Jhc2UpKTsKICAgICAgICAgfQotICAgICAgICBzLT5uYl9udWxsX3NhbXBsZXMgPSBzLT5zdGFydCA9IDA7CisgICAgICAgIHMtPm5iX251bGxfc2FtcGxlc1tjaGFubmVsXSA9IDA7CisgICAgICAgIHMtPnN0YXJ0W2NoYW5uZWxdID0gSU5UNjRfTUlOOwogICAgIH0KIH0KIApAQCAtMTAzLDcgKzEyNSw3IEBACiAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKywgcCsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVwZGF0ZShzLCBpbnNhbXBsZXMsICpwIDwgbm9pc2UgJiYgKnAgPiAtbm9pc2UsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVwZGF0ZShzLCBpbnNhbXBsZXMsICpwIDwgbm9pc2UgJiYgKnAgPiAtbm9pc2UsIGksICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICBuYl9zYW1wbGVzX25vdGlmeSwgdGltZV9iYXNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKQEAgLTExNiw2ICsxMzgsMTggQEAKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwogICAgIFNpbGVuY2VEZXRlY3RDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBjOworCisgICAgcy0+Y2hhbm5lbHMgPSBpbmxpbmstPmNoYW5uZWxzOworICAgIHMtPmluZGVwZW5kYW50X2NoYW5uZWxzID0gcy0+bW9ubyA/IHMtPmNoYW5uZWxzIDogMTsKKyAgICBzLT5uYl9udWxsX3NhbXBsZXMgPSBhdl9tYWxsb2N6X2FycmF5KHNpemVvZigqcy0+bmJfbnVsbF9zYW1wbGVzKSwgcy0+aW5kZXBlbmRhbnRfY2hhbm5lbHMpOworICAgIGlmICghcy0+bmJfbnVsbF9zYW1wbGVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPnN0YXJ0ID0gYXZfbWFsbG9jX2FycmF5KHNpemVvZigqcy0+c3RhcnQpLCBzLT5pbmRlcGVuZGFudF9jaGFubmVscyk7CisgICAgaWYgKCFzLT5zdGFydCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+aW5kZXBlbmRhbnRfY2hhbm5lbHM7IGMrKykKKyAgICAgICAgcy0+c3RhcnRbY10gPSBJTlQ2NF9NSU47CiAKICAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CiAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDogcy0+c2lsZW5jZWRldGVjdCA9IHNpbGVuY2VkZXRlY3RfZGJsOyBicmVhazsKQEAgLTEzOSwxMiArMTczLDE4IEBACiAgICAgY29uc3QgaW50IG5iX2NoYW5uZWxzICAgICAgICAgICA9IGlubGluay0+Y2hhbm5lbHM7CiAgICAgY29uc3QgaW50IHNyYXRlICAgICAgICAgICAgICAgICA9IGlubGluay0+c2FtcGxlX3JhdGU7CiAgICAgY29uc3QgaW50IG5iX3NhbXBsZXMgICAgICAgICAgICA9IGluc2FtcGxlcy0+bmJfc2FtcGxlcyAgICAgKiBuYl9jaGFubmVsczsKLSAgICBjb25zdCBpbnQ2NF90IG5iX3NhbXBsZXNfbm90aWZ5ID0gc3JhdGUgKiBzLT5kdXJhdGlvbiAqIG5iX2NoYW5uZWxzOworICAgIGNvbnN0IGludDY0X3QgbmJfc2FtcGxlc19ub3RpZnkgPSBzcmF0ZSAqIHMtPmR1cmF0aW9uICogKHMtPm1vbm8gPyAxIDogbmJfY2hhbm5lbHMpOworICAgIGludCBjOwogCiAgICAgLy8gc2NhbGUgbnVtYmVyIG9mIG51bGwgc2FtcGxlcyB0byB0aGUgbmV3IHNhbXBsZSByYXRlCiAgICAgaWYgKHMtPmxhc3Rfc2FtcGxlX3JhdGUgJiYgcy0+bGFzdF9zYW1wbGVfcmF0ZSAhPSBzcmF0ZSkKLSAgICAgICAgcy0+bmJfbnVsbF9zYW1wbGVzID0gc3JhdGUgKiBzLT5uYl9udWxsX3NhbXBsZXMgLyBzLT5sYXN0X3NhbXBsZV9yYXRlOworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+aW5kZXBlbmRhbnRfY2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgcy0+bmJfbnVsbF9zYW1wbGVzW2NdID0gc3JhdGUgKiBzLT5uYl9udWxsX3NhbXBsZXNbY10gLyBzLT5sYXN0X3NhbXBsZV9yYXRlOworICAgICAgICB9CiAgICAgcy0+bGFzdF9zYW1wbGVfcmF0ZSA9IHNyYXRlOworICAgIHMtPnRpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworICAgIHMtPmZyYW1lX2VuZCA9IGluc2FtcGxlcy0+cHRzICsgYXZfcmVzY2FsZV9xKGluc2FtcGxlcy0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgcy0+bGFzdF9zYW1wbGVfcmF0ZSB9LCBpbmxpbmstPnRpbWVfYmFzZSk7CiAKICAgICAvLyBUT0RPOiBkb2N1bWVudCBtZXRhZGF0YQogICAgIHMtPnNpbGVuY2VkZXRlY3QocywgaW5zYW1wbGVzLCBuYl9zYW1wbGVzLCBuYl9zYW1wbGVzX25vdGlmeSwKQEAgLTE4Niw2ICsyMjYsMTggQEAKICAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOwogfQogCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTaWxlbmNlRGV0ZWN0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgYzsKKworICAgIGZvciAoYyA9IDA7IGMgPCBzLT5pbmRlcGVuZGFudF9jaGFubmVsczsgYysrKQorICAgICAgICBpZiAocy0+c3RhcnRbY10gPiBJTlQ2NF9NSU4pCisgICAgICAgICAgICB1cGRhdGUocywgTlVMTCwgMCwgYywgMCwgcy0+dGltZV9iYXNlKTsKKyAgICBhdl9mcmVlcCgmcy0+bmJfbnVsbF9zYW1wbGVzKTsKKyAgICBhdl9mcmVlcCgmcy0+c3RhcnQpOworfQorCiBzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2lsZW5jZWRldGVjdF9pbnB1dHNbXSA9IHsKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCkBAIC0yMDksNiArMjYxLDcgQEAKICAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZXRlY3Qgc2lsZW5jZS4iKSwKICAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTaWxlbmNlRGV0ZWN0Q29udGV4dCksCiAgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAogICAgIC5pbnB1dHMgICAgICAgID0gc2lsZW5jZWRldGVjdF9pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBzaWxlbmNlZGV0ZWN0X291dHB1dHMsCiAgICAgLnByaXZfY2xhc3MgICAgPSAmc2lsZW5jZWRldGVjdF9jbGFzcywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX3NpbGVuY2VyZW1vdmUuYyBiL2xpYmF2ZmlsdGVyL2FmX3NpbGVuY2VyZW1vdmUuYwppbmRleCBmMTU2ZDE4Li5kODI2YTIyIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9zaWxlbmNlcmVtb3ZlLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfc2lsZW5jZXJlbW92ZS5jCkBAIC0xODYsOCArMTg2LDE3IEBACiAKICAgICBzLT5zdGFydF9kdXJhdGlvbiA9IGF2X3Jlc2NhbGUocy0+c3RhcnRfZHVyYXRpb24sIGlubGluay0+c2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRSk7CisgICAgaWYgKHMtPnN0YXJ0X2R1cmF0aW9uIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgInN0YXJ0IGR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlXG4iKTsKKyAgICAgICAgcy0+c3RhcnRfZHVyYXRpb24gPSAtcy0+c3RhcnRfZHVyYXRpb247CisgICAgfQorCiAgICAgcy0+c3RvcF9kdXJhdGlvbiAgPSBhdl9yZXNjYWxlKHMtPnN0b3BfZHVyYXRpb24sIGlubGluay0+c2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRSk7CisgICAgaWYgKHMtPnN0b3BfZHVyYXRpb24gPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAic3RvcCBkdXJhdGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZVxuIik7CisgICAgICAgIHMtPnN0b3BfZHVyYXRpb24gPSAtcy0+c3RvcF9kdXJhdGlvbjsKKyAgICB9CiAKICAgICBzLT5zdGFydF9ob2xkb2ZmID0gYXZfbWFsbG9jX2FycmF5KEZGTUFYKHMtPnN0YXJ0X2R1cmF0aW9uLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+c3RhcnRfaG9sZG9mZikgKgpAQCAtMjE3LDExICsyMjYsMTggQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZmx1c2goQVZGcmFtZSAqb3V0LCBBVkZpbHRlckxpbmsgKm91dGxpbmssCitzdGF0aWMgdm9pZCBmbHVzaChTaWxlbmNlUmVtb3ZlQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKm91dCwgQVZGaWx0ZXJMaW5rICpvdXRsaW5rLAogICAgICAgICAgICAgICAgICAgaW50ICpuYl9zYW1wbGVzX3dyaXR0ZW4sIGludCAqcmV0KQogewogICAgIGlmICgqbmJfc2FtcGxlc193cml0dGVuKSB7CiAgICAgICAgIG91dC0+bmJfc2FtcGxlcyA9ICpuYl9zYW1wbGVzX3dyaXR0ZW4gLyBvdXRsaW5rLT5jaGFubmVsczsKKworICAgICAgICBvdXQtPnB0cyA9IHMtPm5leHRfcHRzOworICAgICAgICBzLT5uZXh0X3B0cyArPSBhdl9yZXNjYWxlX3Eob3V0LT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIG91dGxpbmstPnNhbXBsZV9yYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSk7CisKICAgICAgICAgKnJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwogICAgICAgICAqbmJfc2FtcGxlc193cml0dGVuID0gMDsKICAgICB9IGVsc2UgewpAQCAtMjk3LDYgKzMxMywxMiBAQAogCiAgICAgICAgIG1lbWNweShvdXQtPmRhdGFbMF0sICZzLT5zdGFydF9ob2xkb2ZmW3MtPnN0YXJ0X2hvbGRvZmZfb2Zmc2V0XSwKICAgICAgICAgICAgICAgIG5icyAqIHNpemVvZihkb3VibGUpKTsKKworICAgICAgICBvdXQtPnB0cyA9IHMtPm5leHRfcHRzOworICAgICAgICBzLT5uZXh0X3B0cyArPSBhdl9yZXNjYWxlX3Eob3V0LT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIG91dGxpbmstPnNhbXBsZV9yYXRlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSk7CisKICAgICAgICAgcy0+c3RhcnRfaG9sZG9mZl9vZmZzZXQgKz0gbmJzOwogCiAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwpAQCAtMzMwLDcgKzM1Miw3IEBACiAKICAgICAgICAgICAgICAgICBpZiAodGhyZXNob2xkICYmIHMtPnN0b3BfaG9sZG9mZl9lbmQgJiYgIXMtPmxlYXZlX3NpbGVuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgcy0+bW9kZSA9IFNJTEVOQ0VfQ09QWV9GTFVTSDsKLSAgICAgICAgICAgICAgICAgICAgZmx1c2gob3V0LCBvdXRsaW5rLCAmbmJfc2FtcGxlc193cml0dGVuLCAmcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgZmx1c2gocywgb3V0LCBvdXRsaW5rLCAmbmJfc2FtcGxlc193cml0dGVuLCAmcmV0KTsKICAgICAgICAgICAgICAgICAgICAgZ290byBzaWxlbmNlX2NvcHlfZmx1c2g7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJlc2hvbGQpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+Y2hhbm5lbHM7IGorKykgewpAQCAtMzU4LDcgKzM4MCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXMtPnJlc3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bW9kZSA9IFNJTEVOQ0VfU1RPUDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2gob3V0LCBvdXRsaW5rLCAmbmJfc2FtcGxlc193cml0dGVuLCAmcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2gocywgb3V0LCBvdXRsaW5rLCAmbmJfc2FtcGxlc193cml0dGVuLCAmcmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBzaWxlbmNlX3N0b3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RvcF9mb3VuZF9wZXJpb2RzID0gMDsKQEAgLTM2NywxOSArMzg5LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXJ0X2hvbGRvZmZfZW5kID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfd2luZG93KHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tb2RlID0gU0lMRU5DRV9UUklNOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaChvdXQsIG91dGxpbmssICZuYl9zYW1wbGVzX3dyaXR0ZW4sICZyZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaChzLCBvdXQsIG91dGxpbmssICZuYl9zYW1wbGVzX3dyaXR0ZW4sICZyZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNpbGVuY2VfdHJpbTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tb2RlID0gU0lMRU5DRV9DT1BZX0ZMVVNIOwotICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2gob3V0LCBvdXRsaW5rLCAmbmJfc2FtcGxlc193cml0dGVuLCAmcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoKHMsIG91dCwgb3V0bGluaywgJm5iX3NhbXBsZXNfd3JpdHRlbiwgJnJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHNpbGVuY2VfY29weV9mbHVzaDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsdXNoKG91dCwgb3V0bGluaywgJm5iX3NhbXBsZXNfd3JpdHRlbiwgJnJldCk7CisgICAgICAgICAgICBmbHVzaChzLCBvdXQsIG91dGxpbmssICZuYl9zYW1wbGVzX3dyaXR0ZW4sICZyZXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG9idWYsIGlidWYsIHNpemVvZihkb3VibGUpICogbmJzICogaW5saW5rLT5jaGFubmVscyk7CisKKyAgICAgICAgICAgIG91dC0+cHRzID0gcy0+bmV4dF9wdHM7CisgICAgICAgICAgICBzLT5uZXh0X3B0cyArPSBhdl9yZXNjYWxlX3Eob3V0LT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+dGltZV9iYXNlKTsKKwogICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC00MDEsNiArNDI5LDExIEBACiAgICAgICAgICAgICAgICBuYnMgKiBzaXplb2YoZG91YmxlKSk7CiAgICAgICAgIHMtPnN0b3BfaG9sZG9mZl9vZmZzZXQgKz0gbmJzOwogCisgICAgICAgIG91dC0+cHRzID0gcy0+bmV4dF9wdHM7CisgICAgICAgIHMtPm5leHRfcHRzICs9IGF2X3Jlc2NhbGVfcShvdXQtPm5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgb3V0bGluay0+c2FtcGxlX3JhdGV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+dGltZV9iYXNlKTsKKwogICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKIAogICAgICAgICBpZiAocy0+c3RvcF9ob2xkb2ZmX29mZnNldCA9PSBzLT5zdG9wX2hvbGRvZmZfZW5kKSB7CkBAIC00MzksNyArNDcyLDEzIEBACiAKICAgICAgICAgICAgIG1lbWNweShmcmFtZS0+ZGF0YVswXSwgJnMtPnN0b3BfaG9sZG9mZltzLT5zdG9wX2hvbGRvZmZfb2Zmc2V0XSwKICAgICAgICAgICAgICAgICAgICBuYnMgKiBzaXplb2YoZG91YmxlKSk7Ci0gICAgICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5pbnB1dHNbMF0sIGZyYW1lKTsKKworICAgICAgICAgICAgZnJhbWUtPnB0cyA9IHMtPm5leHRfcHRzOworICAgICAgICAgICAgcy0+bmV4dF9wdHMgKz0gYXZfcmVzY2FsZV9xKGZyYW1lLT5uYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluay0+dGltZV9iYXNlKTsKKworICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGZyYW1lKTsKICAgICAgICAgfQogICAgICAgICBzLT5tb2RlID0gU0lMRU5DRV9TVE9QOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX3NvZmFsaXplci5jIGIvbGliYXZmaWx0ZXIvYWZfc29mYWxpemVyLmMKaW5kZXggMGYxMjMxZi4uZDkwOThkNyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfc29mYWxpemVyLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfc29mYWxpemVyLmMKQEAgLTI2LDkgKzI2LDExIEBACiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8bmV0Y2RmLmg+CisjaW5jbHVkZSA8bXlzb2ZhLmg+CiAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2F2ZmZ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRtYXRoLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgpAQCAtMzksMjggKzQxLDMwIEBACiAjZGVmaW5lIFRJTUVfRE9NQUlOICAgICAgMAogI2RlZmluZSBGUkVRVUVOQ1lfRE9NQUlOIDEKIAotdHlwZWRlZiBzdHJ1Y3QgTkNTb2ZhIHsgIC8qIGNvbnRhaW5zIGRhdGEgb2Ygb25lIFNPRkEgZmlsZSAqLwotICAgIGludCBuY2lkOyAgICAgICAgICAgIC8qIG5ldENERiBJRCBvZiB0aGUgb3BlbmVkIFNPRkEgZmlsZSAqLwordHlwZWRlZiBzdHJ1Y3QgTXlTb2ZhIHsgIC8qIGNvbnRhaW5zIGRhdGEgb2Ygb25lIFNPRkEgZmlsZSAqLworICAgIHN0cnVjdCBNWVNPRkFfRUFTWSAqZWFzeTsKICAgICBpbnQgbl9zYW1wbGVzOyAgICAgICAvKiBsZW5ndGggb2Ygb25lIGltcHVsc2UgcmVzcG9uc2UgKElSKSAqLwotICAgIGludCBtX2RpbTsgICAgICAgICAgIC8qIG51bWJlciBvZiBtZWFzdXJlbWVudCBwb3NpdGlvbnMgKi8KLSAgICBpbnQgKmRhdGFfZGVsYXk7ICAgICAvKiBicm9hZGJhbmQgZGVsYXkgb2YgZWFjaCBJUiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbCBtZWFzdXJlbWVudCBwb3NpdGlvbnMgZm9yIGVhY2ggcmVjZWl2ZXIgKGkuZS4gZWFyKTogKi8KLSAgICBmbG9hdCAqc3BfYTsgICAgICAgICAvKiBhemltdXRoIGFuZ2xlcyAqLwotICAgIGZsb2F0ICpzcF9lOyAgICAgICAgIC8qIGVsZXZhdGlvbiBhbmdsZXMgKi8KLSAgICBmbG9hdCAqc3BfcjsgICAgICAgICAvKiByYWRpaSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRhdGEgYXQgZWFjaCBtZWFzdXJlbWVudCBwb3NpdGlvbiBmb3IgZWFjaCByZWNlaXZlcjogKi8KLSAgICBmbG9hdCAqZGF0YV9pcjsgICAgICAvKiBJUnMgKHRpbWUtZG9tYWluKSAqLwotfSBOQ1NvZmE7CisgICAgZmxvYXQgKmxpciwgKnJpcjsgICAgLyogSVJzICh0aW1lLWRvbWFpbikgKi8KKyAgICBpbnQgbWF4X2RlbGF5OworfSBNeVNvZmE7CisKK3R5cGVkZWYgc3RydWN0IFZpcnR1YWxTcGVha2VyIHsKKyAgICB1aW50OF90IHNldDsKKyAgICBmbG9hdCBhemltOworICAgIGZsb2F0IGVsZXY7Cit9IFZpcnR1YWxTcGVha2VyOwogCiB0eXBlZGVmIHN0cnVjdCBTT0ZBbGl6ZXJDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKIAogICAgIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgICAgICAvKiBuYW1lIG9mIFNPRkEgZmlsZSAqLwotICAgIE5DU29mYSBzb2ZhOyAgICAgICAgICAgICAgICAvKiBjb250YWlucyBkYXRhIG9mIHRoZSBTT0ZBIGZpbGUgKi8KKyAgICBNeVNvZmEgc29mYTsgICAgICAgICAgICAgICAgLyogY29udGFpbnMgZGF0YSBvZiB0aGUgU09GQSBmaWxlICovCiAKICAgICBpbnQgc2FtcGxlX3JhdGU7ICAgICAgICAgICAgLyogc2FtcGxlIHJhdGUgZnJvbSBTT0ZBIGZpbGUgKi8KICAgICBmbG9hdCAqc3BlYWtlcl9hemltOyAgICAgICAgLyogYXppbXV0aCBvZiB0aGUgdmlydHVhbCBsb3Vkc3BlYWtlcnMgKi8KICAgICBmbG9hdCAqc3BlYWtlcl9lbGV2OyAgICAgICAgLyogZWxldmF0aW9uIG9mIHRoZSB2aXJ0dWFsIGxvdWRzcGVha2VycyAqLworICAgIGNoYXIgKnNwZWFrZXJzX3BvczsgICAgICAgICAvKiBjdXN0b20gcG9zaXRpb25zIG9mIHRoZSB2aXJ0dWFsIGxvdWRzcGVha2VycyAqLworICAgIGZsb2F0IGxmZV9nYWluOyAgICAgICAgICAgICAvKiBpbml0aWFsIGdhaW4gZm9yIHRoZSBMRkUgY2hhbm5lbCAqLwogICAgIGZsb2F0IGdhaW5fbGZlOyAgICAgICAgICAgICAvKiBnYWluIGFwcGxpZWQgdG8gTEZFIGNoYW5uZWwgKi8KICAgICBpbnQgbGZlX2NoYW5uZWw7ICAgICAgICAgICAgLyogTEZFIGNoYW5uZWwgcG9zaXRpb24gaW4gY2hhbm5lbCBsYXlvdXQgKi8KIApAQCAtODksMjc0ICs5Myw5OSBAQAogICAgIGZsb2F0IHJhZGl1czsgICAgICAgIC8qIGRpc3RhbmNlIHZpcnR1YWwgbG91ZHNwZWFrZXJzIHRvIGxpc3RlbmVyIChpbiBtZXRyZXMpICovCiAgICAgaW50IHR5cGU7ICAgICAgICAgICAgLyogcHJvY2Vzc2luZyB0eXBlICovCiAKKyAgICBWaXJ0dWFsU3BlYWtlciB2c3BrcnBvc1s2NF07CisKICAgICBGRlRDb250ZXh0ICpmZnRbMl0sICppZmZ0WzJdOwogICAgIEZGVENvbXBsZXggKmRhdGFfaHJ0ZlsyXTsKIAogICAgIEFWRmxvYXREU1BDb250ZXh0ICpmZHNwOwogfSBTT0ZBbGl6ZXJDb250ZXh0OwogCi1zdGF0aWMgaW50IGNsb3NlX3NvZmEoc3RydWN0IE5DU29mYSAqc29mYSkKK3N0YXRpYyBpbnQgY2xvc2Vfc29mYShzdHJ1Y3QgTXlTb2ZhICpzb2ZhKQogewotICAgIGF2X2ZyZWVwKCZzb2ZhLT5kYXRhX2RlbGF5KTsKLSAgICBhdl9mcmVlcCgmc29mYS0+c3BfYSk7Ci0gICAgYXZfZnJlZXAoJnNvZmEtPnNwX2UpOwotICAgIGF2X2ZyZWVwKCZzb2ZhLT5zcF9yKTsKLSAgICBhdl9mcmVlcCgmc29mYS0+ZGF0YV9pcik7Ci0gICAgbmNfY2xvc2Uoc29mYS0+bmNpZCk7Ci0gICAgc29mYS0+bmNpZCA9IDA7CisgICAgbXlzb2ZhX2Nsb3NlKHNvZmEtPmVhc3kpOworICAgIHNvZmEtPmVhc3kgPSBOVUxMOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbG9hZF9zb2ZhKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBjaGFyICpmaWxlbmFtZSwgaW50ICpzYW1wbGluZ3JhdGUpCitzdGF0aWMgaW50IHByZWxvYWRfc29mYShBVkZpbHRlckNvbnRleHQgKmN0eCwgY2hhciAqZmlsZW5hbWUsIGludCAqc2FtcGxpbmdyYXRlKQogewogICAgIHN0cnVjdCBTT0ZBbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIC8qIHZhcmlhYmxlcyBhc3NvY2lhdGVkIHdpdGggY29udGVudCBvZiBTT0ZBIGZpbGU6ICovCi0gICAgaW50IG5jaWQsIG5fZGltcywgbl92YXJzLCBuX2dhdHRzLCBuX3VubGltX2RpbV9pZCwgc3RhdHVzOwotICAgIGNoYXIgZGF0YV9kZWxheV9kaW1fbmFtZVtOQ19NQVhfTkFNRV07Ci0gICAgZmxvYXQgKnNwX2EsICpzcF9lLCAqc3BfciwgKmRhdGFfaXI7Ci0gICAgY2hhciAqc29mYV9jb252ZW50aW9uczsKLSAgICBjaGFyIGRpbV9uYW1lW05DX01BWF9OQU1FXTsgICAvKiBuYW1lcyBvZiBuZXRDREYgZGltZW5zaW9ucyAqLwotICAgIHNpemVfdCAqZGltX2xlbmd0aDsgICAgICAgICAgIC8qIGxlbmd0aHMgb2YgbmV0Q0RGIGRpbWVuc2lvbnMgKi8KLSAgICBjaGFyICp0ZXh0OwotICAgIHVuc2lnbmVkIGludCBzYW1wbGVfcmF0ZTsKLSAgICBpbnQgZGF0YV9kZWxheV9kaW1faWRbMl07Ci0gICAgaW50IHNhbXBsaW5ncmF0ZV9pZDsKLSAgICBpbnQgZGF0YV9kZWxheV9pZDsKLSAgICBpbnQgbl9zYW1wbGVzOwotICAgIGludCBtX2RpbV9pZCA9IC0xOwotICAgIGludCBuX2RpbV9pZCA9IC0xOwotICAgIGludCBkYXRhX2lyX2lkOwotICAgIHNpemVfdCBhdHRfbGVuOwotICAgIGludCBtX2RpbTsKLSAgICBpbnQgKmRhdGFfZGVsYXk7Ci0gICAgaW50IHNwX2lkOwotICAgIGludCBpLCByZXQ7CisgICAgc3RydWN0IE1ZU09GQV9IUlRGICpteXNvZmE7CisgICAgaW50IHJldDsKIAotICAgIHMtPnNvZmEubmNpZCA9IDA7Ci0gICAgc3RhdHVzID0gbmNfb3BlbihmaWxlbmFtZSwgTkNfTk9XUklURSwgJm5jaWQpOyAvKiBvcGVuIFNPRkEgZmlsZSByZWFkLW9ubHkgKi8KLSAgICBpZiAoc3RhdHVzICE9IE5DX05PRVJSKSB7CisgICAgbXlzb2ZhID0gbXlzb2ZhX2xvYWQoZmlsZW5hbWUsICZyZXQpOworICAgIGlmIChyZXQgfHwgIW15c29mYSkgewogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW4ndCBmaW5kIFNPRkEtZmlsZSAnJXMnXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgLyogZ2V0IG51bWJlciBvZiBkaW1lbnNpb25zLCB2YXJzLCBnbG9iYWwgYXR0cmlidXRlcyBhbmQgSWQgb2YgdW5saW1pdGVkIGRpbWVuc2lvbnM6ICovCi0gICAgbmNfaW5xKG5jaWQsICZuX2RpbXMsICZuX3ZhcnMsICZuX2dhdHRzLCAmbl91bmxpbV9kaW1faWQpOwotCi0gICAgLyogLS0gZ2V0IG51bWJlciBvZiBtZWFzdXJlbWVudHMgKCJNIikgYW5kIGxlbmd0aCBvZiBvbmUgSVIgKCJOIikgLS0gKi8KLSAgICBkaW1fbGVuZ3RoID0gYXZfbWFsbG9jX2FycmF5KG5fZGltcywgc2l6ZW9mKCpkaW1fbGVuZ3RoKSk7Ci0gICAgaWYgKCFkaW1fbGVuZ3RoKSB7Ci0gICAgICAgIG5jX2Nsb3NlKG5jaWQpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBuX2RpbXM7IGkrKykgeyAvKiBnbyB0aHJvdWdoIGFsbCBkaW1lbnNpb25zIG9mIGZpbGUgKi8KLSAgICAgICAgbmNfaW5xX2RpbShuY2lkLCBpLCAoY2hhciAqKSZkaW1fbmFtZSwgJmRpbV9sZW5ndGhbaV0pOyAvKiBnZXQgZGltZW5zaW9ucyAqLwotICAgICAgICBpZiAoIXN0cm5jbXAoIk0iLCAoY29uc3QgY2hhciAqKSZkaW1fbmFtZSwgMSkpIC8qIGdldCBJRCBvZiBkaW1lbnNpb24gIk0iICovCi0gICAgICAgICAgICBtX2RpbV9pZCA9IGk7Ci0gICAgICAgIGlmICghc3RybmNtcCgiTiIsIChjb25zdCBjaGFyICopJmRpbV9uYW1lLCAxKSkgLyogZ2V0IElEIG9mIGRpbWVuc2lvbiAiTiIgKi8KLSAgICAgICAgICAgIG5fZGltX2lkID0gaTsKLSAgICB9Ci0KLSAgICBpZiAoKG1fZGltX2lkID09IC0xKSB8fCAobl9kaW1faWQgPT0gLTEpKSB7IC8qIGRpbWVuc2lvbiAiTSIgb3IgIk4iIGNvdWxkbid0IGJlIGZvdW5kICovCi0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNhbid0IGZpbmQgcmVxdWlyZWQgZGltZW5zaW9ucyBpbiBTT0ZBIGZpbGUuXG4iKTsKLSAgICAgICAgYXZfZnJlZXAoJmRpbV9sZW5ndGgpOwotICAgICAgICBuY19jbG9zZShuY2lkKTsKKyAgICBpZiAobXlzb2ZhLT5EYXRhU2FtcGxpbmdSYXRlLmVsZW1lbnRzICE9IDEpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotCi0gICAgbl9zYW1wbGVzID0gZGltX2xlbmd0aFtuX2RpbV9pZF07IC8qIGdldCBsZW5ndGggb2Ygb25lIElSICovCi0gICAgbV9kaW0gICAgID0gZGltX2xlbmd0aFttX2RpbV9pZF07IC8qIGdldCBudW1iZXIgb2YgbWVhc3VyZW1lbnRzICovCi0KLSAgICBhdl9mcmVlcCgmZGltX2xlbmd0aCk7Ci0KLSAgICAvKiAtLSBjaGVjayBmaWxlIHR5cGUgLS0gKi8KLSAgICAvKiBnZXQgbGVuZ3RoIG9mIGF0dHJpdHViZSAiQ29udmVudGlvbnMiICovCi0gICAgc3RhdHVzID0gbmNfaW5xX2F0dGxlbihuY2lkLCBOQ19HTE9CQUwsICJDb252ZW50aW9ucyIsICZhdHRfbGVuKTsKLSAgICBpZiAoc3RhdHVzICE9IE5DX05PRVJSKSB7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNhbid0IGdldCBsZW5ndGggb2YgYXR0cmlidXRlIFwiQ29udmVudGlvbnNcIi5cbiIpOwotICAgICAgICBuY19jbG9zZShuY2lkKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgd2hldGhlciBmaWxlIGlzIFNPRkEgZmlsZSAqLwotICAgIHRleHQgPSBhdl9tYWxsb2MoYXR0X2xlbiArIDEpOwotICAgIGlmICghdGV4dCkgewotICAgICAgICBuY19jbG9zZShuY2lkKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICBuY19nZXRfYXR0X3RleHQobmNpZCwgTkNfR0xPQkFMLCAiQ29udmVudGlvbnMiLCB0ZXh0KTsKLSAgICAqKHRleHQgKyBhdHRfbGVuKSA9IDA7Ci0gICAgaWYgKHN0cm5jbXAoIlNPRkEiLCB0ZXh0LCA0KSkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOb3QgYSBTT0ZBIGZpbGUhXG4iKTsKLSAgICAgICAgYXZfZnJlZXAoJnRleHQpOwotICAgICAgICBuY19jbG9zZShuY2lkKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0gICAgYXZfZnJlZXAoJnRleHQpOwotCi0gICAgc3RhdHVzID0gbmNfaW5xX2F0dGxlbihuY2lkLCBOQ19HTE9CQUwsICJMaWNlbnNlIiwgJmF0dF9sZW4pOwotICAgIGlmIChzdGF0dXMgPT0gTkNfTk9FUlIpIHsKLSAgICAgICAgdGV4dCA9IGF2X21hbGxvYyhhdHRfbGVuICsgMSk7Ci0gICAgICAgIGlmICh0ZXh0KSB7Ci0gICAgICAgICAgICBuY19nZXRfYXR0X3RleHQobmNpZCwgTkNfR0xPQkFMLCAiTGljZW5zZSIsIHRleHQpOwotICAgICAgICAgICAgKih0ZXh0ICsgYXR0X2xlbikgPSAwOwotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJTT0ZBIGZpbGUgTGljZW5zZTogJXNcbiIsIHRleHQpOwotICAgICAgICAgICAgYXZfZnJlZXAoJnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gbmNfaW5xX2F0dGxlbihuY2lkLCBOQ19HTE9CQUwsICJTb3VyY2VEZXNjcmlwdGlvbiIsICZhdHRfbGVuKTsKLSAgICBpZiAoc3RhdHVzID09IE5DX05PRVJSKSB7Ci0gICAgICAgIHRleHQgPSBhdl9tYWxsb2MoYXR0X2xlbiArIDEpOwotICAgICAgICBpZiAodGV4dCkgewotICAgICAgICAgICAgbmNfZ2V0X2F0dF90ZXh0KG5jaWQsIE5DX0dMT0JBTCwgIlNvdXJjZURlc2NyaXB0aW9uIiwgdGV4dCk7Ci0gICAgICAgICAgICAqKHRleHQgKyBhdHRfbGVuKSA9IDA7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlNPRkEgZmlsZSBTb3VyY2VEZXNjcmlwdGlvbjogJXNcbiIsIHRleHQpOwotICAgICAgICAgICAgYXZfZnJlZXAoJnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gbmNfaW5xX2F0dGxlbihuY2lkLCBOQ19HTE9CQUwsICJDb21tZW50IiwgJmF0dF9sZW4pOwotICAgIGlmIChzdGF0dXMgPT0gTkNfTk9FUlIpIHsKLSAgICAgICAgdGV4dCA9IGF2X21hbGxvYyhhdHRfbGVuICsgMSk7Ci0gICAgICAgIGlmICh0ZXh0KSB7Ci0gICAgICAgICAgICBuY19nZXRfYXR0X3RleHQobmNpZCwgTkNfR0xPQkFMLCAiQ29tbWVudCIsIHRleHQpOwotICAgICAgICAgICAgKih0ZXh0ICsgYXR0X2xlbikgPSAwOwotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJTT0ZBIGZpbGUgQ29tbWVudDogJXNcbiIsIHRleHQpOwotICAgICAgICAgICAgYXZfZnJlZXAoJnRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzID0gbmNfaW5xX2F0dGxlbihuY2lkLCBOQ19HTE9CQUwsICJTT0ZBQ29udmVudGlvbnMiLCAmYXR0X2xlbik7Ci0gICAgaWYgKHN0YXR1cyAhPSBOQ19OT0VSUikgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW4ndCBnZXQgbGVuZ3RoIG9mIGF0dHJpYnV0ZSBcIlNPRkFDb252ZW50aW9uc1wiLlxuIik7Ci0gICAgICAgIG5jX2Nsb3NlKG5jaWQpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICBzb2ZhX2NvbnZlbnRpb25zID0gYXZfbWFsbG9jKGF0dF9sZW4gKyAxKTsKLSAgICBpZiAoIXNvZmFfY29udmVudGlvbnMpIHsKLSAgICAgICAgbmNfY2xvc2UobmNpZCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgbmNfZ2V0X2F0dF90ZXh0KG5jaWQsIE5DX0dMT0JBTCwgIlNPRkFDb252ZW50aW9ucyIsIHNvZmFfY29udmVudGlvbnMpOwotICAgICooc29mYV9jb252ZW50aW9ucyArIGF0dF9sZW4pID0gMDsKLSAgICBpZiAoc3RybmNtcCgiU2ltcGxlRnJlZUZpZWxkSFJJUiIsIHNvZmFfY29udmVudGlvbnMsIGF0dF9sZW4pKSB7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vdCBhIFNpbXBsZUZyZWVGaWVsZEhSSVIgZmlsZSFcbiIpOwotICAgICAgICBhdl9mcmVlcCgmc29mYV9jb252ZW50aW9ucyk7Ci0gICAgICAgIG5jX2Nsb3NlKG5jaWQpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBhdl9mcmVlcCgmc29mYV9jb252ZW50aW9ucyk7Ci0KLSAgICAvKiAtLSBnZXQgc2FtcGxpbmcgcmF0ZSBvZiBIUlRGcyAtLSAqLwotICAgIC8qIHJlYWQgSUQsIHRoZW4gdmFsdWUgKi8KLSAgICBzdGF0dXMgID0gbmNfaW5xX3ZhcmlkKG5jaWQsICJEYXRhLlNhbXBsaW5nUmF0ZSIsICZzYW1wbGluZ3JhdGVfaWQpOwotICAgIHN0YXR1cyArPSBuY19nZXRfdmFyX3VpbnQobmNpZCwgc2FtcGxpbmdyYXRlX2lkLCAmc2FtcGxlX3JhdGUpOwotICAgIGlmIChzdGF0dXMgIT0gTkNfTk9FUlIpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGRuJ3QgcmVhZCBEYXRhLlNhbXBsaW5nUmF0ZS5cbiIpOwotICAgICAgICBuY19jbG9zZShuY2lkKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0gICAgKnNhbXBsaW5ncmF0ZSA9IHNhbXBsZV9yYXRlOyAvKiByZW1lbWJlciBzYW1wbGluZyByYXRlICovCi0KLSAgICAvKiAtLSBhbGxvY2F0ZSBtZW1vcnkgZm9yIG9uZSB2YWx1ZSBmb3IgZWFjaCBtZWFzdXJlbWVudCBwb3NpdGlvbjogLS0gKi8KLSAgICBzcF9hID0gcy0+c29mYS5zcF9hID0gYXZfbWFsbG9jX2FycmF5KG1fZGltLCBzaXplb2YoZmxvYXQpKTsKLSAgICBzcF9lID0gcy0+c29mYS5zcF9lID0gYXZfbWFsbG9jX2FycmF5KG1fZGltLCBzaXplb2YoZmxvYXQpKTsKLSAgICBzcF9yID0gcy0+c29mYS5zcF9yID0gYXZfbWFsbG9jX2FycmF5KG1fZGltLCBzaXplb2YoZmxvYXQpKTsKLSAgICAvKiBkZWxheSBhbmQgSVIgdmFsdWVzIHJlcXVpcmVkIGZvciBlYWNoIGVhciBhbmQgbWVhc3VyZW1lbnQgcG9zaXRpb246ICovCi0gICAgZGF0YV9kZWxheSA9IHMtPnNvZmEuZGF0YV9kZWxheSA9IGF2X2NhbGxvYyhtX2RpbSwgMiAqIHNpemVvZihpbnQpKTsKLSAgICBkYXRhX2lyID0gcy0+c29mYS5kYXRhX2lyID0gYXZfbWFsbG9jX2FycmF5KG1fZGltICogbl9zYW1wbGVzLCBzaXplb2YoZmxvYXQpICogMik7Ci0KLSAgICBpZiAoIWRhdGFfZGVsYXkgfHwgIXNwX2EgfHwgIXNwX2UgfHwgIXNwX3IgfHwgIWRhdGFfaXIpIHsKLSAgICAgICAgLyogaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQgKi8KLSAgICAgICAgY2xvc2Vfc29mYSgmcy0+c29mYSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgLyogZ2V0IGltcHVsc2UgcmVzcG9uc2VzIChIUlRGcyk6ICovCi0gICAgLyogZ2V0IGNvcnJlc3BvbmRpbmcgSUQgKi8KLSAgICBzdGF0dXMgPSBuY19pbnFfdmFyaWQobmNpZCwgIkRhdGEuSVIiLCAmZGF0YV9pcl9pZCk7Ci0gICAgc3RhdHVzICs9IG5jX2dldF92YXJfZmxvYXQobmNpZCwgZGF0YV9pcl9pZCwgZGF0YV9pcik7IC8qIHJlYWQgYW5kIHN0b3JlIElScyAqLwotICAgIGlmIChzdGF0dXMgIT0gTkNfTk9FUlIpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGRuJ3QgcmVhZCBEYXRhLklSIVxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBnZXQgc291cmNlIHBvc2l0aW9ucyBvZiB0aGUgSFJURnMgaW4gdGhlIFNPRkEgZmlsZTogKi8KLSAgICBzdGF0dXMgID0gbmNfaW5xX3ZhcmlkKG5jaWQsICJTb3VyY2VQb3NpdGlvbiIsICZzcF9pZCk7IC8qIGdldCBjb3JyZXNwb25kaW5nIElEICovCi0gICAgc3RhdHVzICs9IG5jX2dldF92YXJhX2Zsb2F0KG5jaWQsIHNwX2lkLCAoc2l6ZV90WzJdKXsgMCwgMCB9ICwKLSAgICAgICAgICAgICAgICAoc2l6ZV90WzJdKXsgbV9kaW0sIDF9LCBzcF9hKTsgLyogcmVhZCAmIHN0b3JlIGF6aW11dGggYW5nbGVzICovCi0gICAgc3RhdHVzICs9IG5jX2dldF92YXJhX2Zsb2F0KG5jaWQsIHNwX2lkLCAoc2l6ZV90WzJdKXsgMCwgMSB9ICwKLSAgICAgICAgICAgICAgICAoc2l6ZV90WzJdKXsgbV9kaW0sIDF9LCBzcF9lKTsgLyogcmVhZCAmIHN0b3JlIGVsZXZhdGlvbiBhbmdsZXMgKi8KLSAgICBzdGF0dXMgKz0gbmNfZ2V0X3ZhcmFfZmxvYXQobmNpZCwgc3BfaWQsIChzaXplX3RbMl0peyAwLCAyIH0gLAotICAgICAgICAgICAgICAgIChzaXplX3RbMl0peyBtX2RpbSwgMX0sIHNwX3IpOyAvKiByZWFkICYgc3RvcmUgcmFkaWkgKi8KLSAgICBpZiAoc3RhdHVzICE9IE5DX05PRVJSKSB7IC8qIGlmIGFueSBzb3VyY2UgcG9zaXRpb24gdmFyaWFibGUgY291ZG4ndCBiZSByZWFkICovCi0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkbid0IHJlYWQgU291cmNlUG9zaXRpb24uXG4iKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8qIHJlYWQgRGF0YS5EZWxheSwgY2hlY2sgZm9yIGVycm9ycyBhbmQgZml0IGl0IHRvIGRhdGFfZGVsYXkgKi8KLSAgICBzdGF0dXMgID0gbmNfaW5xX3ZhcmlkKG5jaWQsICJEYXRhLkRlbGF5IiwgJmRhdGFfZGVsYXlfaWQpOwotICAgIHN0YXR1cyArPSBuY19pbnFfdmFyZGltaWQobmNpZCwgZGF0YV9kZWxheV9pZCwgJmRhdGFfZGVsYXlfZGltX2lkWzBdKTsKLSAgICBzdGF0dXMgKz0gbmNfaW5xX2RpbW5hbWUobmNpZCwgZGF0YV9kZWxheV9kaW1faWRbMF0sIGRhdGFfZGVsYXlfZGltX25hbWUpOwotICAgIGlmIChzdGF0dXMgIT0gTkNfTk9FUlIpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGRuJ3QgcmVhZCBEYXRhLkRlbGF5LlxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBEYXRhLkRlbGF5IGRpbWVuc2lvbiBjaGVjayAqLwotICAgIC8qIGRpbWVuc2lvbiBvZiBEYXRhLkRlbGF5IGlzIFtJIFJdOiAqLwotICAgIGlmICghc3RybmNtcChkYXRhX2RlbGF5X2RpbV9uYW1lLCAiSSIsIDIpKSB7Ci0gICAgICAgIC8qIGNoZWNrIDIgY2hhcmFjdGVycyB0byBhc3N1cmUgc3RyaW5nIGlzIDAtdGVybWluYXRlZCBhZnRlciAiSSIgKi8KLSAgICAgICAgaW50IGRlbGF5WzJdOyAvKiBkZWxheXMgZ2V0IGZyb20gU09GQSBmaWxlOiAqLwotCi0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkRhdGEuRGVsYXkgaGFzIGRpbWVuc2lvbiBbSSBSXVxuIik7Ci0gICAgICAgIHN0YXR1cyA9IG5jX2dldF92YXJfaW50KG5jaWQsIGRhdGFfZGVsYXlfaWQsICZkZWxheVswXSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTkNfTk9FUlIpIHsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkbid0IHJlYWQgRGF0YS5EZWxheVxuIik7Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIGludCAqZGF0YV9kZWxheV9yID0gZGF0YV9kZWxheSArIG1fZGltOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9kaW07IGkrKykgeyAvKiBleHRlbmQgZ2l2ZW4gZGltZW5zaW9uIFtJIFJdIHRvIFtNIFJdICovCi0gICAgICAgICAgICAvKiBhc3NpZ24gY29uc3RhbnQgZGVsYXkgdmFsdWUgZm9yIGFsbCBtZWFzdXJlbWVudHMgdG8gZGF0YV9kZWxheSBmaWVsZHMgKi8KLSAgICAgICAgICAgIGRhdGFfZGVsYXlbaV0gICA9IGRlbGF5WzBdOwotICAgICAgICAgICAgZGF0YV9kZWxheV9yW2ldID0gZGVsYXlbMV07Ci0gICAgICAgIH0KLSAgICAgICAgLyogZGltZW5zaW9uIG9mIERhdGEuRGVsYXkgaXMgW00gUl0gKi8KLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGRhdGFfZGVsYXlfZGltX25hbWUsICJNIiwgMikpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRGF0YS5EZWxheSBpbiBkaW1lbnNpb24gW00gUl1cbiIpOwotICAgICAgICAvKiBnZXQgZGVsYXlzIGZyb20gU09GQSBmaWxlOiAqLwotICAgICAgICBzdGF0dXMgPSBuY19nZXRfdmFyX2ludChuY2lkLCBkYXRhX2RlbGF5X2lkLCBkYXRhX2RlbGF5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOQ19OT0VSUikgewotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGRuJ3QgcmVhZCBEYXRhLkRlbGF5XG4iKTsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeyAvKiBkaW1lbnNpb24gb2YgRGF0YS5EZWxheSBpcyBuZWl0aGVyIFtJIFJdIG5vciBbTSBSXSAqLwotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJEYXRhLkRlbGF5IGRvZXMgbm90IGhhdmUgdGhlIHJlcXVpcmVkIGRpbWVuc2lvbnMgW0kgUl0gb3IgW00gUl0uXG4iKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLQotICAgIC8qIHNhdmUgaW5mb3JtYXRpb24gaW4gU09GQSBzdHJ1Y3Q6ICovCi0gICAgcy0+c29mYS5tX2RpbSA9IG1fZGltOyAvKiBuby4gbWVhc3VyZW1lbnQgcG9zaXRpb25zICovCi0gICAgcy0+c29mYS5uX3NhbXBsZXMgPSBuX3NhbXBsZXM7IC8qIGxlbmd0aCBvbiBvbmUgSVIgKi8KLSAgICBzLT5zb2ZhLm5jaWQgPSBuY2lkOyAvKiBuZXRDREYgSUQgb2YgU09GQSBmaWxlICovCi0gICAgbmNfY2xvc2UobmNpZCk7IC8qIGNsb3NlIFNPRkEgZmlsZSAqLworICAgICpzYW1wbGluZ3JhdGUgPSBteXNvZmEtPkRhdGFTYW1wbGluZ1JhdGUudmFsdWVzWzBdOworICAgIHMtPnNvZmEubl9zYW1wbGVzID0gbXlzb2ZhLT5OOworICAgIG15c29mYV9mcmVlKG15c29mYSk7CiAKICAgICByZXR1cm4gMDsKK30KIAotZXJyb3I6Ci0gICAgY2xvc2Vfc29mYSgmcy0+c29mYSk7Ci0gICAgcmV0dXJuIHJldDsKK3N0YXRpYyBpbnQgcGFyc2VfY2hhbm5lbF9uYW1lKGNoYXIgKiphcmcsIGludCAqcmNoYW5uZWwsIGNoYXIgKmJ1ZikKK3sKKyAgICBpbnQgbGVuLCBpLCBjaGFubmVsX2lkID0gMDsKKyAgICBpbnQ2NF90IGxheW91dCwgbGF5b3V0MDsKKworICAgIC8qIHRyeSB0byBwYXJzZSBhIGNoYW5uZWwgbmFtZSwgZS5nLiAiRkwiICovCisgICAgaWYgKHNzY2FuZigqYXJnLCAiJTdbQS1aXSVuIiwgYnVmLCAmbGVuKSkgeworICAgICAgICBsYXlvdXQwID0gbGF5b3V0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KGJ1Zik7CisgICAgICAgIC8qIGNoYW5uZWxfaWQgPC0gZmlyc3Qgc2V0IGJpdCBpbiBsYXlvdXQgKi8KKyAgICAgICAgZm9yIChpID0gMzI7IGkgPiAwOyBpID4+PSAxKSB7CisgICAgICAgICAgICBpZiAobGF5b3V0ID49IDFMTCA8PCBpKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbF9pZCArPSBpOworICAgICAgICAgICAgICAgIGxheW91dCA+Pj0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiByZWplY3QgbGF5b3V0cyB0aGF0IGFyZSBub3QgYSBzaW5nbGUgY2hhbm5lbCAqLworICAgICAgICBpZiAoY2hhbm5lbF9pZCA+PSA2NCB8fCBsYXlvdXQwICE9IDFMTCA8PCBjaGFubmVsX2lkKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgKnJjaGFubmVsID0gY2hhbm5lbF9pZDsKKyAgICAgICAgKmFyZyArPSBsZW47CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9zcGVha2VyX3BvcyhBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50NjRfdCBpbl9jaGFubmVsX2xheW91dCkKK3sKKyAgICBTT0ZBbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNoYXIgKmFyZywgKnRva2VuaXplciwgKnAsICphcmdzID0gYXZfc3RyZHVwKHMtPnNwZWFrZXJzX3Bvcyk7CisKKyAgICBpZiAoIWFyZ3MpCisgICAgICAgIHJldHVybjsKKyAgICBwID0gYXJnczsKKworICAgIHdoaWxlICgoYXJnID0gYXZfc3RydG9rKHAsICJ8IiwgJnRva2VuaXplcikpKSB7CisgICAgICAgIGNoYXIgYnVmWzhdOworICAgICAgICBmbG9hdCBhemltLCBlbGV2OworICAgICAgICBpbnQgb3V0X2NoX2lkOworCisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBpZiAocGFyc2VfY2hhbm5lbF9uYW1lKCZhcmcsICZvdXRfY2hfaWQsIGJ1ZikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIHBhcnNlIFwnJXNcJyBhcyBjaGFubmVsIG5hbWUuXG4iLCBidWYpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNzY2FuZihhcmcsICIlZiAlZiIsICZhemltLCAmZWxldikgPT0gMikgeworICAgICAgICAgICAgcy0+dnNwa3Jwb3Nbb3V0X2NoX2lkXS5zZXQgPSAxOworICAgICAgICAgICAgcy0+dnNwa3Jwb3Nbb3V0X2NoX2lkXS5hemltID0gYXppbTsKKyAgICAgICAgICAgIHMtPnZzcGtycG9zW291dF9jaF9pZF0uZWxldiA9IGVsZXY7CisgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKGFyZywgIiVmIiwgJmF6aW0pID09IDEpIHsKKyAgICAgICAgICAgIHMtPnZzcGtycG9zW291dF9jaF9pZF0uc2V0ID0gMTsKKyAgICAgICAgICAgIHMtPnZzcGtycG9zW291dF9jaF9pZF0uYXppbSA9IGF6aW07CisgICAgICAgICAgICBzLT52c3BrcnBvc1tvdXRfY2hfaWRdLmVsZXYgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZnJlZShhcmdzKTsKIH0KIAogc3RhdGljIGludCBnZXRfc3BlYWtlcl9wb3MoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCkBAIC0zNzMsOSArMjAyLDEyIEBACiAKICAgICBzLT5sZmVfY2hhbm5lbCA9IC0xOwogCisgICAgaWYgKHMtPnNwZWFrZXJzX3BvcykKKyAgICAgICAgcGFyc2Vfc3BlYWtlcl9wb3MoY3R4LCBjaGFubmVsc19sYXlvdXQpOworCiAgICAgLyogc2V0IHNwZWFrZXIgcG9zaXRpb25zIGFjY29yZGluZyB0byBpbnB1dCBjaGFubmVsIGNvbmZpZ3VyYXRpb246ICovCiAgICAgZm9yIChtID0gMCwgY2ggPSAwOyBjaCA8IG5fY29udiAmJiBtIDwgNjQ7IG0rKykgewotICAgICAgICB1aW50NjRfdCBtYXNrID0gY2hhbm5lbHNfbGF5b3V0ICYgKDEgPDwgbSk7CisgICAgICAgIHVpbnQ2NF90IG1hc2sgPSBjaGFubmVsc19sYXlvdXQgJiAoMVVMTCA8PCBtKTsKIAogICAgICAgICBzd2l0Y2ggKG1hc2spIHsKICAgICAgICAgY2FzZSBBVl9DSF9GUk9OVF9MRUZUOiAgICAgICAgICAgIGF6aW1bY2hdID0gIDMwOyAgICAgIGJyZWFrOwpAQCAtNDE0LDYgKzI0NiwxMiBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzLT52c3BrcnBvc1ttXS5zZXQpIHsKKyAgICAgICAgICAgIGF6aW1bY2hdID0gcy0+dnNwa3Jwb3NbbV0uYXppbTsKKyAgICAgICAgICAgIGVsZXZbY2hdID0gcy0+dnNwa3Jwb3NbbV0uZWxldjsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChtYXNrKQogICAgICAgICAgICAgY2grKzsKICAgICB9CkBAIC00MjUsNzYgKzI2Myw2IEBACiAKIH0KIAotc3RhdGljIGludCBtYXhfZGVsYXkoc3RydWN0IE5DU29mYSAqc29mYSkKLXsKLSAgICBpbnQgaSwgbWF4ID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzb2ZhLT5tX2RpbSAqIDI7IGkrKykgewotICAgICAgICAvKiBzZWFyY2ggbWF4aW11bSBkZWxheSBpbiBnaXZlbiBTT0ZBIGZpbGUgKi8KLSAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBzb2ZhLT5kYXRhX2RlbGF5W2ldKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbWF4OwotfQotCi1zdGF0aWMgaW50IGZpbmRfbShTT0ZBbGl6ZXJDb250ZXh0ICpzLCBpbnQgYXppbSwgaW50IGVsZXYsIGZsb2F0IHJhZGl1cykKLXsKLSAgICAvKiBnZXQgc291cmNlIHBvc2l0aW9ucyBhbmQgTSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgU09GQSBmaWxlICovCi0gICAgZmxvYXQgKnNwX2EgPSBzLT5zb2ZhLnNwX2E7IC8qIGF6aW11dGggYW5nbGUgKi8KLSAgICBmbG9hdCAqc3BfZSA9IHMtPnNvZmEuc3BfZTsgLyogZWxldmF0aW9uIGFuZ2xlICovCi0gICAgZmxvYXQgKnNwX3IgPSBzLT5zb2ZhLnNwX3I7IC8qIHJhZGl1cyAqLwotICAgIGludCBtX2RpbSA9IHMtPnNvZmEubV9kaW07IC8qIG5vLiBtZWFzdXJlbWVudHMgKi8KLSAgICBpbnQgYmVzdF9pZCA9IDA7IC8qIGluZGV4IG0gY3VycmVudGx5IGNsb3Nlc3QgdG8gZGVzaXJlZCBzb3VyY2UgcG9zLiAqLwotICAgIGZsb2F0IGRlbHRhID0gMTAwMDsgLyogb2Zmc2V0IGJldHdlZW4gZGVzaXJlZCBhbmQgY3VycmVudGx5IGJlc3QgcG9zLiAqLwotICAgIGZsb2F0IGN1cnJlbnQ7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9kaW07IGkrKykgewotICAgICAgICAvKiBzZWFyY2ggdGhyb3VnaCBhbGwgbWVhc3VyZW1lbnRzIGluIGN1cnJlbnRseSBzZWxlY3RlZCBTT0ZBIGZpbGUgKi8KLSAgICAgICAgLyogZGlzdGFuY2Ugb2YgY3VycmVudCB0byBkZXNpcmVkIHNvdXJjZSBwb3NpdGlvbjogKi8KLSAgICAgICAgY3VycmVudCA9IGZhYnMoc3BfYVtpXSAtIGF6aW0pICsKLSAgICAgICAgICAgICAgICAgIGZhYnMoc3BfZVtpXSAtIGVsZXYpICsKLSAgICAgICAgICAgICAgICAgIGZhYnMoc3BfcltpXSAtIHJhZGl1cyk7Ci0gICAgICAgIGlmIChjdXJyZW50IDw9IGRlbHRhKSB7Ci0gICAgICAgICAgICAvKiBpZiBjdXJyZW50IGRpc3RhbmNlIGlzIHNtYWxsZXIgdGhhbiBzbWFsbGVzdCBkaXN0YW5jZSBzbyBmYXIgKi8KLSAgICAgICAgICAgIGRlbHRhID0gY3VycmVudDsKLSAgICAgICAgICAgIGJlc3RfaWQgPSBpOyAvKiByZW1lbWJlciBpbmRleCAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGJlc3RfaWQ7Ci19Ci0KLXN0YXRpYyBpbnQgY29tcGVuc2F0ZV92b2x1bWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCi17Ci0gICAgc3RydWN0IFNPRkFsaXplckNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgZmxvYXQgY29tcGVuc2F0ZTsKLSAgICBmbG9hdCBlbmVyZ3kgPSAwOwotICAgIGZsb2F0ICppcjsKLSAgICBpbnQgbTsKLQotICAgIGlmIChzLT5zb2ZhLm5jaWQpIHsKLSAgICAgICAgLyogZmluZCBJUiBhdCBmcm9udCBjZW50ZXIgcG9zaXRpb24gaW4gdGhlIFNPRkEgZmlsZSAoSVIgY2xvc2VzdCB0byAwwrAsMMKwLDFtKSAqLwotICAgICAgICBzdHJ1Y3QgTkNTb2ZhICpzb2ZhID0gJnMtPnNvZmE7Ci0gICAgICAgIG0gPSBmaW5kX20ocywgMCwgMCwgMSk7Ci0gICAgICAgIC8qIGdldCBlbmVyZ3kgb2YgdGhhdCBJUiBhbmQgY29tcGVuc2F0ZSB2b2x1bWUgKi8KLSAgICAgICAgaXIgPSBzb2ZhLT5kYXRhX2lyICsgMiAqIG0gKiBzb2ZhLT5uX3NhbXBsZXM7Ci0gICAgICAgIGlmIChzb2ZhLT5uX3NhbXBsZXMgJiAzMSkgewotICAgICAgICAgICAgZW5lcmd5ID0gYXZwcml2X3NjYWxhcnByb2R1Y3RfZmxvYXRfYyhpciwgaXIsIHNvZmEtPm5fc2FtcGxlcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbmVyZ3kgPSBzLT5mZHNwLT5zY2FsYXJwcm9kdWN0X2Zsb2F0KGlyLCBpciwgc29mYS0+bl9zYW1wbGVzKTsKLSAgICAgICAgfQotICAgICAgICBjb21wZW5zYXRlID0gMjU2IC8gKHNvZmEtPm5fc2FtcGxlcyAqIHNxcnQoZW5lcmd5KSk7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkNvbXBlbnNhdGUtZmFjdG9yOiAlZlxuIiwgY29tcGVuc2F0ZSk7Ci0gICAgICAgIGlyID0gc29mYS0+ZGF0YV9pcjsKLSAgICAgICAgLyogYXBwbHkgdm9sdW1lIGNvbXBlbnNhdGlvbiB0byBJUnMgKi8KLSAgICAgICAgcy0+ZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKGlyLCBpciwgY29tcGVuc2F0ZSwgc29mYS0+bl9zYW1wbGVzICogc29mYS0+bV9kaW0gKiAyKTsKLSAgICAgICAgZW1tc19jKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KIHR5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgewogICAgIEFWRnJhbWUgKmluLCAqb3V0OwogICAgIGludCAqd3JpdGU7CkBAIC01NDAsMTAgKzMwOCwxMCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBpbi0+bmJfc2FtcGxlczsgaSsrKSB7CiAgICAgICAgIGNvbnN0IGZsb2F0ICp0ZW1wX2lyID0gaXI7IC8qIHVzaW5nIHNhbWUgc2V0IG9mIElScyBmb3IgZWFjaCBzYW1wbGUgKi8KIAotICAgICAgICAqZHN0ID0gMDsKKyAgICAgICAgZHN0WzBdID0gMDsKICAgICAgICAgZm9yIChsID0gMDsgbCA8IGluX2NoYW5uZWxzOyBsKyspIHsKICAgICAgICAgICAgIC8qIHdyaXRlIGN1cnJlbnQgaW5wdXQgc2FtcGxlIHRvIHJpbmdidWZmZXIgKGZvciBlYWNoIGNoYW5uZWwpICovCi0gICAgICAgICAgICAqKGJ1ZmZlcltsXSArIHdyKSA9IHNyY1tsXTsKKyAgICAgICAgICAgIGJ1ZmZlcltsXVt3cl0gPSBzcmNbbF07CiAgICAgICAgIH0KIAogICAgICAgICAvKiBsb29wIGdvZXMgdGhyb3VnaCBhbGwgY2hhbm5lbHMgdG8gYmUgY29udm9sdmVkICovCkBAIC01NTQsMzEgKzMyMiwzMSBAQAogICAgICAgICAgICAgICAgIC8qIExGRSBpcyBhbiBpbnB1dCBjaGFubmVsIGJ1dCByZXF1aXJlcyBubyBjb252b2x1dGlvbiAqLwogICAgICAgICAgICAgICAgIC8qIGFwcGx5IGdhaW4gdG8gTEZFIHNpZ25hbCBhbmQgYWRkIHRvIG91dHB1dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAqZHN0ICs9ICooYnVmZmVyW3MtPmxmZV9jaGFubmVsXSArIHdyKSAqIHMtPmdhaW5fbGZlOwotICAgICAgICAgICAgICAgIHRlbXBfaXIgKz0gbl9zYW1wbGVzOworICAgICAgICAgICAgICAgIHRlbXBfaXIgKz0gRkZBTElHTihuX3NhbXBsZXMsIDMyKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogY3VycmVudCByZWFkIHBvc2l0aW9uIGluIHJpbmdidWZmZXI6IGlucHV0IHNhbXBsZSB3cml0ZSBwb3NpdGlvbgogICAgICAgICAgICAgICogLSBkZWxheSBmb3IgbC10aCBjaC4gKyBkaWZmLiBiZXR3LiBJUiBsZW5ndGggYW5kIGJ1ZmZlciBsZW5ndGgKICAgICAgICAgICAgICAqIChtb2QgYnVmZmVyIGxlbmd0aCkgKi8KLSAgICAgICAgICAgIHJlYWQgPSAod3IgLSAqKGRlbGF5ICsgbCkgLSAobl9zYW1wbGVzIC0gMSkgKyBidWZmZXJfbGVuZ3RoKSAmIG1vZHVsbzsKKyAgICAgICAgICAgIHJlYWQgPSAod3IgLSBkZWxheVtsXSAtIChuX3NhbXBsZXMgLSAxKSArIGJ1ZmZlcl9sZW5ndGgpICYgbW9kdWxvOwogCiAgICAgICAgICAgICBpZiAocmVhZCArIG5fc2FtcGxlcyA8IGJ1ZmZlcl9sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBtZW1jcHkodGVtcF9zcmMsIGJwdHIgKyByZWFkLCBuX3NhbXBsZXMgKiBzaXplb2YoKnRlbXBfc3JjKSk7CisgICAgICAgICAgICAgICAgbWVtbW92ZSh0ZW1wX3NyYywgYnB0ciArIHJlYWQsIG5fc2FtcGxlcyAqIHNpemVvZigqdGVtcF9zcmMpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaW50IGxlbiA9IEZGTUlOKG5fc2FtcGxlcyAtIChyZWFkICUgbl9zYW1wbGVzKSwgYnVmZmVyX2xlbmd0aCAtIHJlYWQpOwogCi0gICAgICAgICAgICAgICAgbWVtY3B5KHRlbXBfc3JjLCBicHRyICsgcmVhZCwgbGVuICogc2l6ZW9mKCp0ZW1wX3NyYykpOwotICAgICAgICAgICAgICAgIG1lbWNweSh0ZW1wX3NyYyArIGxlbiwgYnB0ciwgKG5fc2FtcGxlcyAtIGxlbikgKiBzaXplb2YoKnRlbXBfc3JjKSk7CisgICAgICAgICAgICAgICAgbWVtbW92ZSh0ZW1wX3NyYywgYnB0ciArIHJlYWQsIGxlbiAqIHNpemVvZigqdGVtcF9zcmMpKTsKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKHRlbXBfc3JjICsgbGVuLCBicHRyLCAobl9zYW1wbGVzIC0gbGVuKSAqIHNpemVvZigqdGVtcF9zcmMpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogbXVsdGlwbHkgc2lnbmFsIGFuZCBJUiwgYW5kIGFkZCB1cCB0aGUgcmVzdWx0cyAqLwogICAgICAgICAgICAgZHN0WzBdICs9IHMtPmZkc3AtPnNjYWxhcnByb2R1Y3RfZmxvYXQodGVtcF9pciwgdGVtcF9zcmMsIG5fc2FtcGxlcyk7Ci0gICAgICAgICAgICB0ZW1wX2lyICs9IG5fc2FtcGxlczsKKyAgICAgICAgICAgIHRlbXBfaXIgKz0gRkZBTElHTihuX3NhbXBsZXMsIDMyKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIGNsaXBwaW5ncyBjb3VudGVyICovCi0gICAgICAgIGlmIChmYWJzKCpkc3QpID4gMSkKKyAgICAgICAgaWYgKGZhYnMoZHN0WzBdKSA+IDEpCiAgICAgICAgICAgICAqbl9jbGlwcGluZ3MgKz0gMTsKIAogICAgICAgICAvKiBtb3ZlIG91dHB1dCBidWZmZXIgcG9pbnRlciBieSArMiB0byBnZXQgdG8gbmV4dCBzYW1wbGUgb2YgcHJvY2Vzc2VkIGNoYW5uZWw6ICovCkBAIC02MTUsNiArMzgzLDggQEAKICAgICBGRlRDb250ZXh0ICpmZnQgPSBzLT5mZnRbam9ibnJdOwogICAgIGNvbnN0IGludCBuX2NvbnYgPSBzLT5uX2NvbnY7CiAgICAgY29uc3QgaW50IG5fZmZ0ID0gcy0+bl9mZnQ7CisgICAgY29uc3QgZmxvYXQgZmZ0X3NjYWxlID0gMS4wZiAvIHMtPm5fZmZ0OworICAgIEZGVENvbXBsZXggKmhydGZfb2Zmc2V0OwogICAgIGludCB3ciA9ICp3cml0ZTsKICAgICBpbnQgbl9yZWFkOwogICAgIGludCBpLCBqOwpAQCAtNjQ4LDYgKzQxOCw3IEBACiAKICAgICAgICAgLyogb3V0ZXIgbG9vcDogZ28gdGhyb3VnaCBhbGwgaW5wdXQgY2hhbm5lbHMgdG8gYmUgY29udm9sdmVkICovCiAgICAgICAgIG9mZnNldCA9IGkgKiBuX2ZmdDsgLyogbm8uIHNhbXBsZXMgYWxyZWFkeSBwcm9jZXNzZWQgKi8KKyAgICAgICAgaHJ0Zl9vZmZzZXQgPSBocnRmICsgb2Zmc2V0OwogCiAgICAgICAgIC8qIGZpbGwgRkZUIGlucHV0IHdpdGggMCAod2Ugd2FudCB0byB6ZXJvLXBhZCkgKi8KICAgICAgICAgbWVtc2V0KGZmdF9pbiwgMCwgc2l6ZW9mKEZGVENvbXBsZXgpICogbl9mZnQpOwpAQCAtNjYyLDE0ICs0MzMsMTUgQEAKICAgICAgICAgYXZfZmZ0X3Blcm11dGUoZmZ0LCBmZnRfaW4pOwogICAgICAgICBhdl9mZnRfY2FsYyhmZnQsIGZmdF9pbik7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuX2ZmdDsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBGRlRDb21wbGV4ICpoY29tcGxleCA9IGhydGZfb2Zmc2V0ICsgajsKICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJlID0gZmZ0X2luW2pdLnJlOwogICAgICAgICAgICAgY29uc3QgZmxvYXQgaW0gPSBmZnRfaW5bal0uaW07CiAKICAgICAgICAgICAgIC8qIGNvbXBsZXggbXVsdGlwbGljYXRpb24gb2YgaW5wdXQgc2lnbmFsIGFuZCBIUlRGcyAqLwogICAgICAgICAgICAgLyogb3V0cHV0IGNoYW5uZWwgKHJlYWwpOiAqLwotICAgICAgICAgICAgZmZ0X2luW2pdLnJlID0gcmUgKiAoaHJ0ZiArIG9mZnNldCArIGopLT5yZSAtIGltICogKGhydGYgKyBvZmZzZXQgKyBqKS0+aW07CisgICAgICAgICAgICBmZnRfaW5bal0ucmUgPSByZSAqIGhjb21wbGV4LT5yZSAtIGltICogaGNvbXBsZXgtPmltOwogICAgICAgICAgICAgLyogb3V0cHV0IGNoYW5uZWwgKGltYWcpOiAqLwotICAgICAgICAgICAgZmZ0X2luW2pdLmltID0gcmUgKiAoaHJ0ZiArIG9mZnNldCArIGopLT5pbSArIGltICogKGhydGYgKyBvZmZzZXQgKyBqKS0+cmU7CisgICAgICAgICAgICBmZnRfaW5bal0uaW0gPSByZSAqIGhjb21wbGV4LT5pbSArIGltICogaGNvbXBsZXgtPnJlOwogICAgICAgICB9CiAKICAgICAgICAgLyogdHJhbnNmb3JtIG91dHB1dCBzaWduYWwgb2YgY3VycmVudCBjaGFubmVsIGJhY2sgdG8gdGltZSBkb21haW4gKi8KQEAgLTY3OCwxNCArNDUwLDE0IEBACiAKICAgICAgICAgZm9yIChqID0gMDsgaiA8IGluLT5uYl9zYW1wbGVzOyBqKyspIHsKICAgICAgICAgICAgIC8qIHdyaXRlIG91dHB1dCBzaWduYWwgb2YgY3VycmVudCBjaGFubmVsIHRvIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgIGRzdFsyICogal0gKz0gZmZ0X2luW2pdLnJlIC8gKGZsb2F0KW5fZmZ0OworICAgICAgICAgICAgZHN0WzIgKiBqXSArPSBmZnRfaW5bal0ucmUgKiBmZnRfc2NhbGU7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGogPSAwOyBqIDwgbl9zYW1wbGVzIC0gMTsgaisrKSB7IC8qIG92ZXJmbG93IGxlbmd0aCBpcyBJUiBsZW5ndGggLSAxICovCiAgICAgICAgICAgICAvKiB3cml0ZSB0aGUgcmVzdCBvZiBvdXRwdXQgc2lnbmFsIHRvIG92ZXJmbG93IGJ1ZmZlciAqLwogICAgICAgICAgICAgaW50IHdyaXRlX3BvcyA9ICh3ciArIGopICYgbW9kdWxvOwogCi0gICAgICAgICAgICAqKHJpbmdidWZmZXIgKyB3cml0ZV9wb3MpICs9IGZmdF9pbltpbi0+bmJfc2FtcGxlcyArIGpdLnJlIC8gKGZsb2F0KW5fZmZ0OworICAgICAgICAgICAgKihyaW5nYnVmZmVyICsgd3JpdGVfcG9zKSArPSBmZnRfaW5baW4tPm5iX3NhbXBsZXMgKyBqXS5yZSAqIGZmdF9zY2FsZTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNjkzLDcgKzQ2NSw3IEBACiAgICAgZm9yIChpID0gMDsgaSA8IG91dC0+bmJfc2FtcGxlczsgaSsrKSB7CiAgICAgICAgIC8qIGNsaXBwaW5ncyBjb3VudGVyICovCiAgICAgICAgIGlmIChmYWJzKCpkc3QpID4gMSkgeyAvKiBpZiBjdXJyZW50IG91dHB1dCBzYW1wbGUgPiAxICovCi0gICAgICAgICAgICAqbl9jbGlwcGluZ3MgPSAqbl9jbGlwcGluZ3MgKyAxOworICAgICAgICAgICAgbl9jbGlwcGluZ3NbMF0rKzsKICAgICAgICAgfQogCiAgICAgICAgIC8qIG1vdmUgb3V0cHV0IGJ1ZmZlciBwb2ludGVyIGJ5ICsyIHRvIGdldCB0byBuZXh0IHNhbXBsZSBvZiBwcm9jZXNzZWQgY2hhbm5lbDogKi8KQEAgLTc4MiwxNCArNTU0LDE0IEBACiAgICAgcmV0dXJuIGZmX3NldF9jb21tb25fc2FtcGxlcmF0ZXMoY3R4LCBmb3JtYXRzKTsKIH0KIAotc3RhdGljIGludCBsb2FkX2RhdGEoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGludCBhemltLCBpbnQgZWxldiwgZmxvYXQgcmFkaXVzKQorc3RhdGljIGludCBsb2FkX2RhdGEoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGludCBhemltLCBpbnQgZWxldiwgZmxvYXQgcmFkaXVzLCBpbnQgc2FtcGxlX3JhdGUpCiB7CiAgICAgc3RydWN0IFNPRkFsaXplckNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgY29uc3QgaW50IG5fc2FtcGxlcyA9IHMtPnNvZmEubl9zYW1wbGVzOworICAgIGludCBuX3NhbXBsZXM7CiAgICAgaW50IG5fY29udiA9IHMtPm5fY29udjsgLyogbm8uIGNoYW5uZWxzIHRvIGNvbnZvbHZlICovCi0gICAgaW50IG5fZmZ0ID0gcy0+bl9mZnQ7Ci0gICAgaW50IGRlbGF5X2xbMTZdOyAvKiBicm9hZGJhbmQgZGVsYXkgZm9yIGVhY2ggSVIgKi8KLSAgICBpbnQgZGVsYXlfclsxNl07CisgICAgaW50IG5fZmZ0OworICAgIGZsb2F0IGRlbGF5X2w7IC8qIGJyb2FkYmFuZCBkZWxheSBmb3IgZWFjaCBJUiAqLworICAgIGZsb2F0IGRlbGF5X3I7CiAgICAgaW50IG5iX2lucHV0X2NoYW5uZWxzID0gY3R4LT5pbnB1dHNbMF0tPmNoYW5uZWxzOyAvKiBuby4gaW5wdXQgY2hhbm5lbHMgKi8KICAgICBmbG9hdCBnYWluX2xpbiA9IGV4cGYoKHMtPmdhaW4gLSAzICogbmJfaW5wdXRfY2hhbm5lbHMpIC8gMjAgKiBNX0xOMTApOyAvKiBnYWluIC0gM2RCL2NoYW5uZWwgKi8KICAgICBGRlRDb21wbGV4ICpkYXRhX2hydGZfbCA9IE5VTEw7CkBAIC03OTksNjggKzU3MSwxNjYgQEAKICAgICBmbG9hdCAqZGF0YV9pcl9sID0gTlVMTDsKICAgICBmbG9hdCAqZGF0YV9pcl9yID0gTlVMTDsKICAgICBpbnQgb2Zmc2V0ID0gMDsgLyogdXNlZCBmb3IgZmFzdGVyIHBvaW50ZXIgYXJpdGhtZXRpY3MgaW4gZm9yLWxvb3AgKi8KLSAgICBpbnQgbVsxNl07IC8qIG1lYXN1cmVtZW50IGluZGV4IG0gb2YgSVIgY2xvc2VzdCB0byByZXF1aXJlZCBzb3VyY2UgcG9zaXRpb25zICovCiAgICAgaW50IGksIGosIGF6aW1fb3JpZyA9IGF6aW0sIGVsZXZfb3JpZyA9IGVsZXY7CisgICAgaW50IGZpbHRlcl9sZW5ndGgsIHJldCA9IDA7CisgICAgaW50IG5fY3VycmVudDsKKyAgICBpbnQgbl9tYXggPSAwOwogCi0gICAgaWYgKCFzLT5zb2ZhLm5jaWQpIHsgLyogaWYgYW4gaW52YWxpZCBTT0ZBIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQgKi8KKyAgICBzLT5zb2ZhLmVhc3kgPSBteXNvZmFfb3BlbihzLT5maWxlbmFtZSwgc2FtcGxlX3JhdGUsICZmaWx0ZXJfbGVuZ3RoLCAmcmV0KTsKKyAgICBpZiAoIXMtPnNvZmEuZWFzeSB8fCByZXQpIHsgLyogaWYgYW4gaW52YWxpZCBTT0ZBIGZpbGUgaGFzIGJlZW4gc2VsZWN0ZWQgKi8KICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiU2VsZWN0ZWQgU09GQSBmaWxlIGlzIGludmFsaWQuIFBsZWFzZSBzZWxlY3QgdmFsaWQgU09GQSBmaWxlLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGlmIChzLT50eXBlID09IFRJTUVfRE9NQUlOKSB7Ci0gICAgICAgIHMtPnRlbXBfc3JjWzBdID0gYXZfY2FsbG9jKEZGQUxJR04obl9zYW1wbGVzLCAxNiksIHNpemVvZihmbG9hdCkpOwotICAgICAgICBzLT50ZW1wX3NyY1sxXSA9IGF2X2NhbGxvYyhGRkFMSUdOKG5fc2FtcGxlcywgMTYpLCBzaXplb2YoZmxvYXQpKTsKKyAgICBuX3NhbXBsZXMgPSBzLT5zb2ZhLm5fc2FtcGxlczsKIAotICAgICAgICAvKiBnZXQgdGVtcG9yYXJ5IElSIGZvciBMIGFuZCBSIGNoYW5uZWwgKi8KLSAgICAgICAgZGF0YV9pcl9sID0gYXZfbWFsbG9jX2FycmF5KG5fY29udiAqIG5fc2FtcGxlcywgc2l6ZW9mKCpkYXRhX2lyX2wpKTsKLSAgICAgICAgZGF0YV9pcl9yID0gYXZfbWFsbG9jX2FycmF5KG5fY29udiAqIG5fc2FtcGxlcywgc2l6ZW9mKCpkYXRhX2lyX3IpKTsKLSAgICAgICAgaWYgKCFkYXRhX2lyX3IgfHwgIWRhdGFfaXJfbCB8fCAhcy0+dGVtcF9zcmNbMF0gfHwgIXMtPnRlbXBfc3JjWzFdKSB7Ci0gICAgICAgICAgICBhdl9mcmVlKGRhdGFfaXJfbCk7Ci0gICAgICAgICAgICBhdl9mcmVlKGRhdGFfaXJfcik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPmRhdGFfaXJbMF0gPSBhdl9jYWxsb2MoRkZBTElHTihuX3NhbXBsZXMsIDMyKSwgc2l6ZW9mKGZsb2F0KSAqIHMtPm5fY29udik7CisgICAgcy0+ZGF0YV9pclsxXSA9IGF2X2NhbGxvYyhGRkFMSUdOKG5fc2FtcGxlcywgMzIpLCBzaXplb2YoZmxvYXQpICogcy0+bl9jb252KTsKKyAgICBzLT5kZWxheVswXSA9IGF2X2NhbGxvYyhzLT5uX2NvbnYsIHNpemVvZihpbnQpKTsKKyAgICBzLT5kZWxheVsxXSA9IGF2X2NhbGxvYyhzLT5uX2NvbnYsIHNpemVvZihpbnQpKTsKKworICAgIGlmICghcy0+ZGF0YV9pclswXSB8fCAhcy0+ZGF0YV9pclsxXSB8fCAhcy0+ZGVsYXlbMF0gfHwgIXMtPmRlbGF5WzFdKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8qIGdldCB0ZW1wb3JhcnkgSVIgZm9yIEwgYW5kIFIgY2hhbm5lbCAqLworICAgIGRhdGFfaXJfbCA9IGF2X2NhbGxvYyhuX2NvbnYgKiBGRkFMSUdOKG5fc2FtcGxlcywgMzIpLCBzaXplb2YoKmRhdGFfaXJfbCkpOworICAgIGRhdGFfaXJfciA9IGF2X2NhbGxvYyhuX2NvbnYgKiBGRkFMSUdOKG5fc2FtcGxlcywgMzIpLCBzaXplb2YoKmRhdGFfaXJfcikpOworICAgIGlmICghZGF0YV9pcl9yIHx8ICFkYXRhX2lyX2wpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKHMtPnR5cGUgPT0gVElNRV9ET01BSU4pIHsKKyAgICAgICAgcy0+dGVtcF9zcmNbMF0gPSBhdl9jYWxsb2MoRkZBTElHTihuX3NhbXBsZXMsIDMyKSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIHMtPnRlbXBfc3JjWzFdID0gYXZfY2FsbG9jKEZGQUxJR04obl9zYW1wbGVzLCAzMiksIHNpemVvZihmbG9hdCkpOworICAgICAgICBpZiAoIXMtPnRlbXBfc3JjWzBdIHx8ICFzLT50ZW1wX3NyY1sxXSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CisgICAgfQorCisgICAgcy0+c3BlYWtlcl9hemltID0gYXZfY2FsbG9jKHMtPm5fY29udiwgc2l6ZW9mKCpzLT5zcGVha2VyX2F6aW0pKTsKKyAgICBzLT5zcGVha2VyX2VsZXYgPSBhdl9jYWxsb2Mocy0+bl9jb252LCBzaXplb2YoKnMtPnNwZWFrZXJfZWxldikpOworICAgIGlmICghcy0+c3BlYWtlcl9hemltIHx8ICFzLT5zcGVha2VyX2VsZXYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLyogZ2V0IHNwZWFrZXIgcG9zaXRpb25zICovCisgICAgaWYgKChyZXQgPSBnZXRfc3BlYWtlcl9wb3MoY3R4LCBzLT5zcGVha2VyX2F6aW0sIHMtPnNwZWFrZXJfZWxldikpIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCBnZXQgc3BlYWtlciBwb3NpdGlvbnMuIElucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bl9jb252OyBpKyspIHsKKyAgICAgICAgZmxvYXQgY29vcmRpbmF0ZXNbM107CisKKyAgICAgICAgLyogbG9hZCBhbmQgc3RvcmUgSVJzIGFuZCBjb3JyZXNwb25kaW5nIGRlbGF5cyAqLworICAgICAgICBhemltID0gKGludCkocy0+c3BlYWtlcl9hemltW2ldICsgYXppbV9vcmlnKSAlIDM2MDsKKyAgICAgICAgZWxldiA9IChpbnQpKHMtPnNwZWFrZXJfZWxldltpXSArIGVsZXZfb3JpZykgJSA5MDsKKworICAgICAgICBjb29yZGluYXRlc1swXSA9IGF6aW07CisgICAgICAgIGNvb3JkaW5hdGVzWzFdID0gZWxldjsKKyAgICAgICAgY29vcmRpbmF0ZXNbMl0gPSByYWRpdXM7CisKKyAgICAgICAgbXlzb2ZhX3MyYyhjb29yZGluYXRlcyk7CisKKyAgICAgICAgLyogZ2V0IGlkIG9mIElSIGNsb3Nlc3QgdG8gZGVzaXJlZCBwb3NpdGlvbiAqLworICAgICAgICBteXNvZmFfZ2V0ZmlsdGVyX2Zsb2F0KHMtPnNvZmEuZWFzeSwgY29vcmRpbmF0ZXNbMF0sIGNvb3JkaW5hdGVzWzFdLCBjb29yZGluYXRlc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2lyX2wgKyBGRkFMSUdOKG5fc2FtcGxlcywgMzIpICogaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX2lyX3IgKyBGRkFMSUdOKG5fc2FtcGxlcywgMzIpICogaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVsYXlfbCwgJmRlbGF5X3IpOworCisgICAgICAgIHMtPmRlbGF5WzBdW2ldID0gZGVsYXlfbCAqIHNhbXBsZV9yYXRlOworICAgICAgICBzLT5kZWxheVsxXVtpXSA9IGRlbGF5X3IgKiBzYW1wbGVfcmF0ZTsKKworICAgICAgICBzLT5zb2ZhLm1heF9kZWxheSA9IEZGTUFYMyhzLT5zb2ZhLm1heF9kZWxheSwgcy0+ZGVsYXlbMF1baV0sIHMtPmRlbGF5WzFdW2ldKTsKKyAgICB9CisKKyAgICAvKiBnZXQgc2l6ZSBvZiByaW5nYnVmZmVyIChsb25nZXN0IElSIHBsdXMgbWF4LiBkZWxheSkgKi8KKyAgICAvKiB0aGVuIGNob29zZSBuZXh0IHBvd2VyIG9mIDIgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiAqLworICAgIG5fY3VycmVudCA9IHMtPnNvZmEubl9zYW1wbGVzICsgcy0+c29mYS5tYXhfZGVsYXk7CisgICAgLyogbGVuZ3RoIG9mIGxvbmdlc3QgSVIgcGx1cyBtYXguIGRlbGF5ICovCisgICAgbl9tYXggPSBGRk1BWChuX21heCwgbl9jdXJyZW50KTsKKworICAgIC8qIGJ1ZmZlciBsZW5ndGggaXMgbG9uZ2VzdCBJUiBwbHVzIG1heC4gZGVsYXkgLT4gbmV4dCBwb3dlciBvZiAyCisgICAgICAgKDMyIC0gY291bnQgbGVhZGluZyB6ZXJvcyBnaXZlcyByZXF1aXJlZCBleHBvbmVudCkgICovCisgICAgcy0+YnVmZmVyX2xlbmd0aCA9IDEgPDwgKDMyIC0gZmZfY2x6KG5fbWF4KSk7CisgICAgcy0+bl9mZnQgPSBuX2ZmdCA9IDEgPDwgKDMyIC0gZmZfY2x6KG5fbWF4ICsgc2FtcGxlX3JhdGUpKTsKKworICAgIGlmIChzLT50eXBlID09IEZSRVFVRU5DWV9ET01BSU4pIHsKKyAgICAgICAgYXZfZmZ0X2VuZChzLT5mZnRbMF0pOworICAgICAgICBhdl9mZnRfZW5kKHMtPmZmdFsxXSk7CisgICAgICAgIHMtPmZmdFswXSA9IGF2X2ZmdF9pbml0KGxvZzIocy0+bl9mZnQpLCAwKTsKKyAgICAgICAgcy0+ZmZ0WzFdID0gYXZfZmZ0X2luaXQobG9nMihzLT5uX2ZmdCksIDApOworICAgICAgICBhdl9mZnRfZW5kKHMtPmlmZnRbMF0pOworICAgICAgICBhdl9mZnRfZW5kKHMtPmlmZnRbMV0pOworICAgICAgICBzLT5pZmZ0WzBdID0gYXZfZmZ0X2luaXQobG9nMihzLT5uX2ZmdCksIDEpOworICAgICAgICBzLT5pZmZ0WzFdID0gYXZfZmZ0X2luaXQobG9nMihzLT5uX2ZmdCksIDEpOworCisgICAgICAgIGlmICghcy0+ZmZ0WzBdIHx8ICFzLT5mZnRbMV0gfHwgIXMtPmlmZnRbMF0gfHwgIXMtPmlmZnRbMV0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgRkZUIGNvbnRleHRzIG9mIHNpemUgJWQuXG4iLCBzLT5uX2ZmdCk7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+dHlwZSA9PSBUSU1FX0RPTUFJTikgeworICAgICAgICBzLT5yaW5nYnVmZmVyWzBdID0gYXZfY2FsbG9jKHMtPmJ1ZmZlcl9sZW5ndGgsIHNpemVvZihmbG9hdCkgKiBuYl9pbnB1dF9jaGFubmVscyk7CisgICAgICAgIHMtPnJpbmdidWZmZXJbMV0gPSBhdl9jYWxsb2Mocy0+YnVmZmVyX2xlbmd0aCwgc2l6ZW9mKGZsb2F0KSAqIG5iX2lucHV0X2NoYW5uZWxzKTsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBnZXQgdGVtcG9yYXJ5IEhSVEYgbWVtb3J5IGZvciBMIGFuZCBSIGNoYW5uZWwgKi8KICAgICAgICAgZGF0YV9ocnRmX2wgPSBhdl9tYWxsb2NfYXJyYXkobl9mZnQsIHNpemVvZigqZGF0YV9ocnRmX2wpICogbl9jb252KTsKICAgICAgICAgZGF0YV9ocnRmX3IgPSBhdl9tYWxsb2NfYXJyYXkobl9mZnQsIHNpemVvZigqZGF0YV9ocnRmX3IpICogbl9jb252KTsKICAgICAgICAgaWYgKCFkYXRhX2hydGZfciB8fCAhZGF0YV9ocnRmX2wpIHsKLSAgICAgICAgICAgIGF2X2ZyZWUoZGF0YV9ocnRmX2wpOwotICAgICAgICAgICAgYXZfZnJlZShkYXRhX2hydGZfcik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgcy0+cmluZ2J1ZmZlclswXSA9IGF2X2NhbGxvYyhzLT5idWZmZXJfbGVuZ3RoLCBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgcy0+cmluZ2J1ZmZlclsxXSA9IGF2X2NhbGxvYyhzLT5idWZmZXJfbGVuZ3RoLCBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgcy0+dGVtcF9mZnRbMF0gPSBhdl9tYWxsb2NfYXJyYXkocy0+bl9mZnQsIHNpemVvZihGRlRDb21wbGV4KSk7CisgICAgICAgIHMtPnRlbXBfZmZ0WzFdID0gYXZfbWFsbG9jX2FycmF5KHMtPm5fZmZ0LCBzaXplb2YoRkZUQ29tcGxleCkpOworICAgICAgICBpZiAoIXMtPnRlbXBfZmZ0WzBdIHx8ICFzLT50ZW1wX2ZmdFsxXSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzLT5yaW5nYnVmZmVyWzBdIHx8ICFzLT5yaW5nYnVmZmVyWzFdKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChzLT50eXBlID09IEZSRVFVRU5DWV9ET01BSU4pIHsKKyAgICAgICAgZmZ0X2luX2wgPSBhdl9jYWxsb2Mobl9mZnQsIHNpemVvZigqZmZ0X2luX2wpKTsKKyAgICAgICAgZmZ0X2luX3IgPSBhdl9jYWxsb2Mobl9mZnQsIHNpemVvZigqZmZ0X2luX3IpKTsKKyAgICAgICAgaWYgKCFmZnRfaW5fbCB8fCAhZmZ0X2luX3IpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uX2NvbnY7IGkrKykgewotICAgICAgICAvKiBsb2FkIGFuZCBzdG9yZSBJUnMgYW5kIGNvcnJlc3BvbmRpbmcgZGVsYXlzICovCi0gICAgICAgIGF6aW0gPSAoaW50KShzLT5zcGVha2VyX2F6aW1baV0gKyBhemltX29yaWcpICUgMzYwOwotICAgICAgICBlbGV2ID0gKGludCkocy0+c3BlYWtlcl9lbGV2W2ldICsgZWxldl9vcmlnKSAlIDkwOwotICAgICAgICAvKiBnZXQgaWQgb2YgSVIgY2xvc2VzdCB0byBkZXNpcmVkIHBvc2l0aW9uICovCi0gICAgICAgIG1baV0gPSBmaW5kX20ocywgYXppbSwgZWxldiwgcmFkaXVzKTsKKyAgICAgICAgZmxvYXQgKmxpciwgKnJpcjsKIAotICAgICAgICAvKiBsb2FkIHRoZSBkZWxheXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IElScyAqLwotICAgICAgICBkZWxheV9sW2ldID0gKihzLT5zb2ZhLmRhdGFfZGVsYXkgKyAyICogbVtpXSk7Ci0gICAgICAgIGRlbGF5X3JbaV0gPSAqKHMtPnNvZmEuZGF0YV9kZWxheSArIDIgKiBtW2ldICsgMSk7CisgICAgICAgIG9mZnNldCA9IGkgKiBGRkFMSUdOKG5fc2FtcGxlcywgMzIpOyAvKiBuby4gc2FtcGxlcyBhbHJlYWR5IHdyaXR0ZW4gKi8KKworICAgICAgICBsaXIgPSBkYXRhX2lyX2wgKyBvZmZzZXQ7CisgICAgICAgIHJpciA9IGRhdGFfaXJfciArIG9mZnNldDsKIAogICAgICAgICBpZiAocy0+dHlwZSA9PSBUSU1FX0RPTUFJTikgewotICAgICAgICAgICAgb2Zmc2V0ID0gaSAqIG5fc2FtcGxlczsgLyogbm8uIHNhbXBsZXMgYWxyZWFkeSB3cml0dGVuICovCiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbl9zYW1wbGVzOyBqKyspIHsKICAgICAgICAgICAgICAgICAvKiBsb2FkIHJldmVyc2VkIElScyBvZiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAqIHNhbXBsZS1ieS1zYW1wbGUgZm9yIGxlZnQgYW5kIHJpZ2h0IGVhcjsgYW5kIGFwcGx5IGdhaW4gKi8KLSAgICAgICAgICAgICAgICAqKGRhdGFfaXJfbCArIG9mZnNldCArIGopID0gLyogbGVmdCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgKihzLT5zb2ZhLmRhdGFfaXIgKyAyICogbVtpXSAqIG5fc2FtcGxlcyArIG5fc2FtcGxlcyAtIDEgLSBqKSAqIGdhaW5fbGluOwotICAgICAgICAgICAgICAgICooZGF0YV9pcl9yICsgb2Zmc2V0ICsgaikgPSAvKiByaWdodCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgKihzLT5zb2ZhLmRhdGFfaXIgKyAyICogbVtpXSAqIG5fc2FtcGxlcyArIG5fc2FtcGxlcyAtIDEgLSBqICArIG5fc2FtcGxlcykgKiBnYWluX2xpbjsKKyAgICAgICAgICAgICAgICBzLT5kYXRhX2lyWzBdW29mZnNldCArIGpdID0gbGlyW25fc2FtcGxlcyAtIDEgLSBqXSAqIGdhaW5fbGluOworICAgICAgICAgICAgICAgIHMtPmRhdGFfaXJbMV1bb2Zmc2V0ICsgal0gPSByaXJbbl9zYW1wbGVzIC0gMSAtIGpdICogZ2Fpbl9saW47CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmZnRfaW5fbCA9IGF2X2NhbGxvYyhuX2ZmdCwgc2l6ZW9mKCpmZnRfaW5fbCkpOwotICAgICAgICAgICAgZmZ0X2luX3IgPSBhdl9jYWxsb2Mobl9mZnQsIHNpemVvZigqZmZ0X2luX3IpKTsKLSAgICAgICAgICAgIGlmICghZmZ0X2luX2wgfHwgIWZmdF9pbl9yKSB7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShkYXRhX2hydGZfbCk7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShkYXRhX2hydGZfcik7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShmZnRfaW5fbCk7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShmZnRfaW5fcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChmZnRfaW5fbCwgMCwgbl9mZnQgKiBzaXplb2YoKmZmdF9pbl9sKSk7CisgICAgICAgICAgICBtZW1zZXQoZmZ0X2luX3IsIDAsIG5fZmZ0ICogc2l6ZW9mKCpmZnRfaW5fcikpOwogCiAgICAgICAgICAgICBvZmZzZXQgPSBpICogbl9mZnQ7IC8qIG5vLiBzYW1wbGVzIGFscmVhZHkgd3JpdHRlbiAqLwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5fc2FtcGxlczsgaisrKSB7CkBAIC04NjgsMTAgKzczOCw4IEBACiAgICAgICAgICAgICAgICAgICogc2FtcGxlLWJ5LXNhbXBsZSBhbmQgYXBwbHkgZ2FpbiwKICAgICAgICAgICAgICAgICAgKiBMIGNoYW5uZWwgaXMgbG9hZGVkIHRvIHJlYWwgcGFydCwgUiBjaGFubmVsIHRvIGltYWcgcGFydCwKICAgICAgICAgICAgICAgICAgKiBJUnMgYXJlZCBzaGlmdGVkIGJ5IEwgYW5kIFIgZGVsYXkgKi8KLSAgICAgICAgICAgICAgICBmZnRfaW5fbFtkZWxheV9sW2ldICsgal0ucmUgPSAvKiBsZWZ0IGNoYW5uZWwgKi8KLSAgICAgICAgICAgICAgICAqKHMtPnNvZmEuZGF0YV9pciArIDIgKiBtW2ldICogbl9zYW1wbGVzICsgaikgKiBnYWluX2xpbjsKLSAgICAgICAgICAgICAgICBmZnRfaW5fcltkZWxheV9yW2ldICsgal0ucmUgPSAvKiByaWdodCBjaGFubmVsICovCi0gICAgICAgICAgICAgICAgKihzLT5zb2ZhLmRhdGFfaXIgKyAoMiAqIG1baV0gKyAxKSAqIG5fc2FtcGxlcyArIGopICogZ2Fpbl9saW47CisgICAgICAgICAgICAgICAgZmZ0X2luX2xbcy0+ZGVsYXlbMF1baV0gKyBqXS5yZSA9IGxpcltqXSAqIGdhaW5fbGluOworICAgICAgICAgICAgICAgIGZmdF9pbl9yW3MtPmRlbGF5WzFdW2ldICsgal0ucmUgPSByaXJbal0gKiBnYWluX2xpbjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogYWN0dWFsbHkgdHJhbnNmb3JtIHRvIGZyZXF1ZW5jeSBkb21haW4gKElScyAtPiBIUlRGcykgKi8KQEAgLTg4Miw0NSArNzUwLDMzIEBACiAgICAgICAgICAgICBhdl9mZnRfY2FsYyhzLT5mZnRbMF0sIGZmdF9pbl9yKTsKICAgICAgICAgICAgIG1lbWNweShkYXRhX2hydGZfciArIG9mZnNldCwgZmZ0X2luX3IsIG5fZmZ0ICogc2l6ZW9mKCpmZnRfaW5fcikpOwogICAgICAgICB9Ci0KLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiSW5kZXg6ICVkLCBBemltdXRoOiAlZiwgRWxldmF0aW9uOiAlZiwgUmFkaXVzOiAlZiBvZiBTT0ZBIGZpbGUuXG4iLAotICAgICAgICAgICAgICAgbVtpXSwgKihzLT5zb2ZhLnNwX2EgKyBtW2ldKSwgKihzLT5zb2ZhLnNwX2UgKyBtW2ldKSwgKihzLT5zb2ZhLnNwX3IgKyBtW2ldKSk7CiAgICAgfQogCi0gICAgaWYgKHMtPnR5cGUgPT0gVElNRV9ET01BSU4pIHsKLSAgICAgICAgLyogY29weSBJUnMgYW5kIGRlbGF5cyB0byBhbGxvY2F0ZWQgbWVtb3J5IGluIHRoZSBTT0ZBbGl6ZXJDb250ZXh0IHN0cnVjdDogKi8KLSAgICAgICAgbWVtY3B5KHMtPmRhdGFfaXJbMF0sIGRhdGFfaXJfbCwgc2l6ZW9mKGZsb2F0KSAqIG5fY29udiAqIG5fc2FtcGxlcyk7Ci0gICAgICAgIG1lbWNweShzLT5kYXRhX2lyWzFdLCBkYXRhX2lyX3IsIHNpemVvZihmbG9hdCkgKiBuX2NvbnYgKiBuX3NhbXBsZXMpOwotCi0gICAgICAgIGF2X2ZyZWVwKCZkYXRhX2lyX2wpOyAvKiBmcmVlIHRlbXBvcmFyeSBJUiBtZW1vcnkgKi8KLSAgICAgICAgYXZfZnJlZXAoJmRhdGFfaXJfcik7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAocy0+dHlwZSA9PSBGUkVRVUVOQ1lfRE9NQUlOKSB7CiAgICAgICAgIHMtPmRhdGFfaHJ0ZlswXSA9IGF2X21hbGxvY19hcnJheShuX2ZmdCAqIHMtPm5fY29udiwgc2l6ZW9mKEZGVENvbXBsZXgpKTsKICAgICAgICAgcy0+ZGF0YV9ocnRmWzFdID0gYXZfbWFsbG9jX2FycmF5KG5fZmZ0ICogcy0+bl9jb252LCBzaXplb2YoRkZUQ29tcGxleCkpOwogICAgICAgICBpZiAoIXMtPmRhdGFfaHJ0ZlswXSB8fCAhcy0+ZGF0YV9ocnRmWzFdKSB7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmZGF0YV9ocnRmX2wpOwotICAgICAgICAgICAgYXZfZnJlZXAoJmRhdGFfaHJ0Zl9yKTsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZmZnRfaW5fbCk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmZmZ0X2luX3IpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsgLyogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkICovCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KIAogICAgICAgICBtZW1jcHkocy0+ZGF0YV9ocnRmWzBdLCBkYXRhX2hydGZfbCwgLyogY29weSBIUlRGIGRhdGEgdG8gKi8KICAgICAgICAgICAgIHNpemVvZihGRlRDb21wbGV4KSAqIG5fY29udiAqIG5fZmZ0KTsgLyogZmlsdGVyIHN0cnVjdCAqLwogICAgICAgICBtZW1jcHkocy0+ZGF0YV9ocnRmWzFdLCBkYXRhX2hydGZfciwKICAgICAgICAgICAgIHNpemVvZihGRlRDb21wbGV4KSAqIG5fY29udiAqIG5fZmZ0KTsKLQotICAgICAgICBhdl9mcmVlcCgmZGF0YV9ocnRmX2wpOyAvKiBmcmVlIHRlbXBvcmFyeSBIUlRGIG1lbW9yeSAqLwotICAgICAgICBhdl9mcmVlcCgmZGF0YV9ocnRmX3IpOwotCi0gICAgICAgIGF2X2ZyZWVwKCZmZnRfaW5fbCk7IC8qIGZyZWUgdGVtcG9yYXJ5IEZGVCBtZW1vcnkgKi8KLSAgICAgICAgYXZfZnJlZXAoJmZmdF9pbl9yKTsKICAgICB9CiAKLSAgICBtZW1jcHkocy0+ZGVsYXlbMF0sICZkZWxheV9sWzBdLCBzaXplb2YoaW50KSAqIHMtPm5fY29udik7Ci0gICAgbWVtY3B5KHMtPmRlbGF5WzFdLCAmZGVsYXlfclswXSwgc2l6ZW9mKGludCkgKiBzLT5uX2NvbnYpOworZmFpbDoKKyAgICBhdl9mcmVlcCgmZGF0YV9ocnRmX2wpOyAvKiBmcmVlIHRlbXBvcmFyeSBIUlRGIG1lbW9yeSAqLworICAgIGF2X2ZyZWVwKCZkYXRhX2hydGZfcik7CiAKLSAgICByZXR1cm4gMDsKKyAgICBhdl9mcmVlcCgmZGF0YV9pcl9sKTsgLyogZnJlZSB0ZW1wcmFyeSBJUiBtZW1vcnkgKi8KKyAgICBhdl9mcmVlcCgmZGF0YV9pcl9yKTsKKworICAgIGF2X2ZyZWVwKCZmZnRfaW5fbCk7IC8qIGZyZWUgdGVtcG9yYXJ5IEZGVCBtZW1vcnkgKi8KKyAgICBhdl9mcmVlcCgmZmZ0X2luX3IpOworCisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCkBAIC05MjgsMTIgKzc4NCwxMyBAQAogICAgIFNPRkFsaXplckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgaW50IHJldDsKIAotICAgIC8qIGxvYWQgU09GQSBmaWxlLCAqLwotICAgIC8qIGluaXRpYWxpemUgZmlsZSBJRHMgdG8gMCBiZWZvcmUgYXR0ZW1wdGluZyB0byBsb2FkIFNPRkEgZmlsZXMsCi0gICAgICogdGhpcyBhc3N1cmVzIHRoYXQgaW4gY2FzZSBvZiBlcnJvciwgb25seSB0aGUgbWVtb3J5IG9mIGFscmVhZHkKLSAgICAgKiBsb2FkZWQgZmlsZXMgaXMgZnJlZSdkICovCi0gICAgcy0+c29mYS5uY2lkID0gMDsKLSAgICByZXQgPSBsb2FkX3NvZmEoY3R4LCBzLT5maWxlbmFtZSwgJnMtPnNhbXBsZV9yYXRlKTsKKyAgICBpZiAoIXMtPmZpbGVuYW1lKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlZhbGlkIFNPRkEgZmlsZW5hbWUgbXVzdCBiZSBzZXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvKiBwcmVsb2FkIFNPRkEgZmlsZSwgKi8KKyAgICByZXQgPSBwcmVsb2FkX3NvZmEoY3R4LCBzLT5maWxlbmFtZSwgJnMtPnNhbXBsZV9yYXRlKTsKICAgICBpZiAocmV0KSB7CiAgICAgICAgIC8qIGZpbGUgbG9hZGluZyBlcnJvciAqLwogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGlsZSBsb2FkaW5nIFNPRkEgZmlsZTogJyVzJ1xuIiwgcy0+ZmlsZW5hbWUpOwpAQCAtOTU3LDEwICs4MTQsNiBAQAogewogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CiAgICAgU09GQWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgbmJfaW5wdXRfY2hhbm5lbHMgPSBpbmxpbmstPmNoYW5uZWxzOyAvKiBuby4gaW5wdXQgY2hhbm5lbHMgKi8KLSAgICBpbnQgbl9tYXhfaXIgPSAwOwotICAgIGludCBuX2N1cnJlbnQ7Ci0gICAgaW50IG5fbWF4ID0gMDsKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKHMtPnR5cGUgPT0gRlJFUVVFTkNZX0RPTUFJTikgewpAQCAtOTcwLDg3ICs4MjMsMTYgQEAKICAgICB9CiAKICAgICAvKiBnYWluIC0zIGRCIHBlciBjaGFubmVsLCAtNiBkQiB0byBnZXQgTEZFIG9uIGEgc2ltaWxhciBsZXZlbCAqLwotICAgIHMtPmdhaW5fbGZlID0gZXhwZigocy0+Z2FpbiAtIDMgKiBpbmxpbmstPmNoYW5uZWxzIC0gNikgLyAyMCAqIE1fTE4xMCk7CisgICAgcy0+Z2Fpbl9sZmUgPSBleHBmKChzLT5nYWluIC0gMyAqIGlubGluay0+Y2hhbm5lbHMgLSA2ICsgcy0+bGZlX2dhaW4pIC8gMjAgKiBNX0xOMTApOwogCi0gICAgcy0+bl9jb252ID0gbmJfaW5wdXRfY2hhbm5lbHM7Ci0KLSAgICAvKiBnZXQgc2l6ZSBvZiByaW5nYnVmZmVyIChsb25nZXN0IElSIHBsdXMgbWF4LiBkZWxheSkgKi8KLSAgICAvKiB0aGVuIGNob29zZSBuZXh0IHBvd2VyIG9mIDIgZm9yIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbiAqLwotICAgIG5fY3VycmVudCA9IHMtPnNvZmEubl9zYW1wbGVzICsgbWF4X2RlbGF5KCZzLT5zb2ZhKTsKLSAgICBpZiAobl9jdXJyZW50ID4gbl9tYXgpIHsKLSAgICAgICAgLyogbGVuZ3RoIG9mIGxvbmdlc3QgSVIgcGx1cyBtYXguIGRlbGF5IChpbiBhbGwgU09GQSBmaWxlcykgKi8KLSAgICAgICAgbl9tYXggPSBuX2N1cnJlbnQ7Ci0gICAgICAgIC8qIGxlbmd0aCBvZiBsb25nZXN0IElSICh3aXRob3V0IGRlbGF5LCBpbiBhbGwgU09GQSBmaWxlcykgKi8KLSAgICAgICAgbl9tYXhfaXIgPSBzLT5zb2ZhLm5fc2FtcGxlczsKLSAgICB9Ci0gICAgLyogYnVmZmVyIGxlbmd0aCBpcyBsb25nZXN0IElSIHBsdXMgbWF4LiBkZWxheSAtPiBuZXh0IHBvd2VyIG9mIDIKLSAgICAgICAoMzIgLSBjb3VudCBsZWFkaW5nIHplcm9zIGdpdmVzIHJlcXVpcmVkIGV4cG9uZW50KSAgKi8KLSAgICBzLT5idWZmZXJfbGVuZ3RoID0gMSA8PCAoMzIgLSBmZl9jbHoobl9tYXgpKTsKLSAgICBzLT5uX2ZmdCAgICAgICAgID0gMSA8PCAoMzIgLSBmZl9jbHoobl9tYXggKyBpbmxpbmstPnNhbXBsZV9yYXRlKSk7Ci0KLSAgICBpZiAocy0+dHlwZSA9PSBGUkVRVUVOQ1lfRE9NQUlOKSB7Ci0gICAgICAgIGF2X2ZmdF9lbmQocy0+ZmZ0WzBdKTsKLSAgICAgICAgYXZfZmZ0X2VuZChzLT5mZnRbMV0pOwotICAgICAgICBzLT5mZnRbMF0gPSBhdl9mZnRfaW5pdChsb2cyKHMtPm5fZmZ0KSwgMCk7Ci0gICAgICAgIHMtPmZmdFsxXSA9IGF2X2ZmdF9pbml0KGxvZzIocy0+bl9mZnQpLCAwKTsKLSAgICAgICAgYXZfZmZ0X2VuZChzLT5pZmZ0WzBdKTsKLSAgICAgICAgYXZfZmZ0X2VuZChzLT5pZmZ0WzFdKTsKLSAgICAgICAgcy0+aWZmdFswXSA9IGF2X2ZmdF9pbml0KGxvZzIocy0+bl9mZnQpLCAxKTsKLSAgICAgICAgcy0+aWZmdFsxXSA9IGF2X2ZmdF9pbml0KGxvZzIocy0+bl9mZnQpLCAxKTsKLQotICAgICAgICBpZiAoIXMtPmZmdFswXSB8fCAhcy0+ZmZ0WzFdIHx8ICFzLT5pZmZ0WzBdIHx8ICFzLT5pZmZ0WzFdKSB7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gY3JlYXRlIEZGVCBjb250ZXh0cy5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGltcHVsc2UgcmVzcG9uc2VzLCBkZWxheXMgYW5kIHRoZSByaW5nYnVmZmVycyAqLwotICAgIC8qIHNpemU6IChsb25nZXN0IElSKSAqIChudW1iZXIgb2YgY2hhbm5lbHMgdG8gY29udm9sdXRlKSAqLwotICAgIHMtPmRhdGFfaXJbMF0gPSBhdl9tYWxsb2NfYXJyYXkobl9tYXhfaXIsIHNpemVvZihmbG9hdCkgKiBzLT5uX2NvbnYpOwotICAgIHMtPmRhdGFfaXJbMV0gPSBhdl9tYWxsb2NfYXJyYXkobl9tYXhfaXIsIHNpemVvZihmbG9hdCkgKiBzLT5uX2NvbnYpOwotICAgIC8qIGxlbmd0aDogIG51bWJlciBvZiBjaGFubmVscyB0byBjb252b2x1dGUgKi8KLSAgICBzLT5kZWxheVswXSA9IGF2X21hbGxvY19hcnJheShzLT5uX2NvbnYsIHNpemVvZihmbG9hdCkpOwotICAgIHMtPmRlbGF5WzFdID0gYXZfbWFsbG9jX2FycmF5KHMtPm5fY29udiwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgLyogbGVuZ3RoOiAoYnVmZmVyIGxlbmd0aCkgKiAobnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzKSwKLSAgICAgKiBPUjogYnVmZmVyIGxlbmd0aCAoaWYgZnJlcXVlbmN5IGRvbWFpbiBwcm9jZXNzaW5nKQotICAgICAqIGNhbGxvYyB6ZXJvLWluaXRpYWxpemVzIHRoZSBidWZmZXIgKi8KLQotICAgIGlmIChzLT50eXBlID09IFRJTUVfRE9NQUlOKSB7Ci0gICAgICAgIHMtPnJpbmdidWZmZXJbMF0gPSBhdl9jYWxsb2Mocy0+YnVmZmVyX2xlbmd0aCwgc2l6ZW9mKGZsb2F0KSAqIG5iX2lucHV0X2NoYW5uZWxzKTsKLSAgICAgICAgcy0+cmluZ2J1ZmZlclsxXSA9IGF2X2NhbGxvYyhzLT5idWZmZXJfbGVuZ3RoLCBzaXplb2YoZmxvYXQpICogbmJfaW5wdXRfY2hhbm5lbHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHMtPnJpbmdidWZmZXJbMF0gPSBhdl9jYWxsb2Mocy0+YnVmZmVyX2xlbmd0aCwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgICAgIHMtPnJpbmdidWZmZXJbMV0gPSBhdl9jYWxsb2Mocy0+YnVmZmVyX2xlbmd0aCwgc2l6ZW9mKGZsb2F0KSk7Ci0gICAgICAgIHMtPnRlbXBfZmZ0WzBdID0gYXZfbWFsbG9jX2FycmF5KHMtPm5fZmZ0LCBzaXplb2YoRkZUQ29tcGxleCkpOwotICAgICAgICBzLT50ZW1wX2ZmdFsxXSA9IGF2X21hbGxvY19hcnJheShzLT5uX2ZmdCwgc2l6ZW9mKEZGVENvbXBsZXgpKTsKLSAgICAgICAgaWYgKCFzLT50ZW1wX2ZmdFswXSB8fCAhcy0+dGVtcF9mZnRbMV0pCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLQotICAgIC8qIGxlbmd0aDogbnVtYmVyIG9mIGNoYW5uZWxzIHRvIGNvbnZvbHV0ZSAqLwotICAgIHMtPnNwZWFrZXJfYXppbSA9IGF2X2NhbGxvYyhzLT5uX2NvbnYsIHNpemVvZigqcy0+c3BlYWtlcl9hemltKSk7Ci0gICAgcy0+c3BlYWtlcl9lbGV2ID0gYXZfY2FsbG9jKHMtPm5fY29udiwgc2l6ZW9mKCpzLT5zcGVha2VyX2VsZXYpKTsKLQotICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZDogKi8KLSAgICBpZiAoIXMtPmRhdGFfaXJbMF0gfHwgIXMtPmRhdGFfaXJbMV0gfHwgIXMtPmRlbGF5WzFdIHx8Ci0gICAgICAgICFzLT5kZWxheVswXSB8fCAhcy0+cmluZ2J1ZmZlclswXSB8fCAhcy0+cmluZ2J1ZmZlclsxXSB8fAotICAgICAgICAhcy0+c3BlYWtlcl9hemltIHx8ICFzLT5zcGVha2VyX2VsZXYpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICBjb21wZW5zYXRlX3ZvbHVtZShjdHgpOwotCi0gICAgLyogZ2V0IHNwZWFrZXIgcG9zaXRpb25zICovCi0gICAgaWYgKChyZXQgPSBnZXRfc3BlYWtlcl9wb3MoY3R4LCBzLT5zcGVha2VyX2F6aW0sIHMtPnNwZWFrZXJfZWxldikpIDwgMCkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCBnZXQgc3BlYWtlciBwb3NpdGlvbnMuIElucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBub3Qgc3VwcG9ydGVkLlxuIik7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorICAgIHMtPm5fY29udiA9IGlubGluay0+Y2hhbm5lbHM7CiAKICAgICAvKiBsb2FkIElScyB0byBkYXRhX2lyWzBdIGFuZCBkYXRhX2lyWzFdIGZvciByZXF1aXJlZCBkaXJlY3Rpb25zICovCi0gICAgaWYgKChyZXQgPSBsb2FkX2RhdGEoY3R4LCBzLT5yb3RhdGlvbiwgcy0+ZWxldmF0aW9uLCBzLT5yYWRpdXMpKSA8IDApCisgICAgaWYgKChyZXQgPSBsb2FkX2RhdGEoY3R4LCBzLT5yb3RhdGlvbiwgcy0+ZWxldmF0aW9uLCBzLT5yYWRpdXMsIGlubGluay0+c2FtcGxlX3JhdGUpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJTYW1wbGVyYXRlOiAlZCBDaGFubmVscyB0byBjb252b2x1dGU6ICVkLCBMZW5ndGggb2YgcmluZ2J1ZmZlcjogJWQgeCAlZFxuIiwKLSAgICAgICAgaW5saW5rLT5zYW1wbGVfcmF0ZSwgcy0+bl9jb252LCBuYl9pbnB1dF9jaGFubmVscywgcy0+YnVmZmVyX2xlbmd0aCk7CisgICAgICAgIGlubGluay0+c2FtcGxlX3JhdGUsIHMtPm5fY29udiwgaW5saW5rLT5jaGFubmVscywgcy0+YnVmZmVyX2xlbmd0aCk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTEwNTksMTMgKzg0MSw3IEBACiB7CiAgICAgU09GQWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKIAotICAgIGlmIChzLT5zb2ZhLm5jaWQpIHsKLSAgICAgICAgYXZfZnJlZXAoJnMtPnNvZmEuc3BfYSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzLT5zb2ZhLnNwX2UpOwotICAgICAgICBhdl9mcmVlcCgmcy0+c29mYS5zcF9yKTsKLSAgICAgICAgYXZfZnJlZXAoJnMtPnNvZmEuZGF0YV9kZWxheSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZzLT5zb2ZhLmRhdGFfaXIpOwotICAgIH0KKyAgICBjbG9zZV9zb2ZhKCZzLT5zb2ZhKTsKICAgICBhdl9mZnRfZW5kKHMtPmlmZnRbMF0pOwogICAgIGF2X2ZmdF9lbmQocy0+aWZmdFsxXSk7CiAgICAgYXZfZmZ0X2VuZChzLT5mZnRbMF0pOwpAQCAtMTA5OSw2ICs4NzUsOCBAQAogICAgIHsgInR5cGUiLCAgICAgICJzZXQgcHJvY2Vzc2luZyIsIE9GRlNFVCh0eXBlKSwgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTF9LCAgICAgICAwLCAgIDEsIC5mbGFncyA9IEZMQUdTLCAidHlwZSIgfSwKICAgICB7ICJ0aW1lIiwgICAgICAidGltZSBkb21haW4iLCAgICAgIDAsICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND0wfSwgICAgICAgMCwgICAwLCAuZmxhZ3MgPSBGTEFHUywgInR5cGUiIH0sCiAgICAgeyAiZnJlcSIsICAgICAgImZyZXF1ZW5jeSBkb21haW4iLCAwLCAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9MX0sICAgICAgIDAsICAgMCwgLmZsYWdzID0gRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgInNwZWFrZXJzIiwgICJzZXQgc3BlYWtlciBjdXN0b20gcG9zaXRpb25zIiwgT0ZGU0VUKHNwZWFrZXJzX3BvcyksIEFWX09QVF9UWVBFX1NUUklORywgIHsuc3RyPTB9LCAgICAwLCAwLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImxmZWdhaW4iLCAgICJzZXQgbGZlIGdhaW4iLCAgICAgICAgICAgICAgICAgT0ZGU0VUKGxmZV9nYWluKSwgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgIHsuZGJsPTB9LCAgIC05LCA5LCAuZmxhZ3MgPSBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9zdGVyZW90b29scy5jIGIvbGliYXZmaWx0ZXIvYWZfc3RlcmVvdG9vbHMuYwppbmRleCA4YWIxODRkLi43ZTUyOTc4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9zdGVyZW90b29scy5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX3N0ZXJlb3Rvb2xzLmMKQEAgLTMzLDYgKzMzLDggQEAKICAgICBpbnQgcGhhc2VfbDsKICAgICBpbnQgcGhhc2VfcjsKICAgICBpbnQgbW9kZTsKKyAgICBpbnQgYm1vZGVfaW47CisgICAgaW50IGJtb2RlX291dDsKICAgICBkb3VibGUgc2xldjsKICAgICBkb3VibGUgc2JhbDsKICAgICBkb3VibGUgbWxldjsKQEAgLTY3LDcgKzY5LDcgQEAKICAgICB7ICJtdXRlciIsICAgICAgICJtdXRlIFIiLCAgICAgICAgICAgT0ZGU0VUKG11dGVfciksICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgICB7Lmk2ND0wfSwgICAwLCAgICAgICAgICAxLCBBIH0sCiAgICAgeyAicGhhc2VsIiwgICAgICAicGhhc2UgTCIsICAgICAgICAgIE9GRlNFVChwaGFzZV9sKSwgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MH0sICAgMCwgICAgICAgICAgMSwgQSB9LAogICAgIHsgInBoYXNlciIsICAgICAgInBoYXNlIFIiLCAgICAgICAgICBPRkZTRVQocGhhc2VfciksICAgICBBVl9PUFRfVFlQRV9CT09MLCAgIHsuaTY0PTB9LCAgIDAsICAgICAgICAgIDEsIEEgfSwKLSAgICB7ICJtb2RlIiwgICAgICAgICJzZXQgc3RlcmVvIG1vZGUiLCAgT0ZGU0VUKG1vZGUpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0wfSwgICAwLCAgICAgICAgICA2LCBBLCAibW9kZSIgfSwKKyAgICB7ICJtb2RlIiwgICAgICAgICJzZXQgc3RlcmVvIG1vZGUiLCAgT0ZGU0VUKG1vZGUpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0wfSwgICAwLCAgICAgICAgICA4LCBBLCAibW9kZSIgfSwKICAgICB7ICAgICAibHI+bHIiLCAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND0wfSwgICAwLCAgICAgICAgICAwLCBBLCAibW9kZSIgfSwKICAgICB7ICAgICAibHI+bXMiLCAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND0xfSwgICAwLCAgICAgICAgICAwLCBBLCAibW9kZSIgfSwKICAgICB7ICAgICAibXM+bHIiLCAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND0yfSwgICAwLCAgICAgICAgICAwLCBBLCAibW9kZSIgfSwKQEAgLTc1LDYgKzc3LDggQEAKICAgICB7ICAgICAibHI+cnIiLCAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND00fSwgICAwLCAgICAgICAgICAwLCBBLCAibW9kZSIgfSwKICAgICB7ICAgICAibHI+bCtyIiwgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND01fSwgICAwLCAgICAgICAgICAwLCBBLCAibW9kZSIgfSwKICAgICB7ICAgICAibHI+cmwiLCAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND02fSwgICAwLCAgICAgICAgICAwLCBBLCAibW9kZSIgfSwKKyAgICB7ICAgICAibXM+bGwiLCAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND03fSwgICAwLCAgICAgICAgICAwLCBBLCAibW9kZSIgfSwKKyAgICB7ICAgICAibXM+cnIiLCAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND04fSwgICAwLCAgICAgICAgICAwLCBBLCAibW9kZSIgfSwKICAgICB7ICJzbGV2IiwgICAgICAgICJzZXQgc2lkZSBsZXZlbCIsICAgT0ZGU0VUKHNsZXYpLCAgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgICAwLjAxNTYyNSwgIDY0LCBBIH0sCiAgICAgeyAic2JhbCIsICAgICAgICAic2V0IHNpZGUgYmFsYW5jZSIsIE9GRlNFVChzYmFsKSwgICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sICAtMSwgICAgICAgICAgMSwgQSB9LAogICAgIHsgIm1sZXYiLCAgICAgICAgInNldCBtaWRkbGUgbGV2ZWwiLCBPRkZTRVQobWxldiksICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAgIDAuMDE1NjI1LCAgNjQsIEEgfSwKQEAgLTgzLDYgKzg3LDExIEBACiAgICAgeyAiZGVsYXkiLCAgICAgICAic2V0IGRlbGF5IiwgICAgICAgIE9GRlNFVChkZWxheSksICAgICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MH0sIC0yMCwgICAgICAgICAyMCwgQSB9LAogICAgIHsgInNjbGV2ZWwiLCAgICAgInNldCBTL0MgbGV2ZWwiLCAgICBPRkZTRVQoc2NfbGV2ZWwpLCAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTF9LCAgIDEsICAgICAgICAxMDAsIEEgfSwKICAgICB7ICJwaGFzZSIsICAgICAgICJzZXQgc3RlcmVvIHBoYXNlIiwgT0ZGU0VUKHBoYXNlKSwgICAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wfSwgICAwLCAgICAgICAgMzYwLCBBIH0sCisgICAgeyAiYm1vZGVfaW4iLCAgICAic2V0IGJhbGFuY2UgaW4gbW9kZSIsIE9GRlNFVChibW9kZV9pbiksIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQ9MH0sICAgMCwgICAgICAgICAgMiwgQSwgImJtb2RlIiB9LAorICAgIHsgICAgICJiYWxhbmNlIiwgICAwLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0PTB9LCAgIDAsICAgICAgICAgIDAsIEEsICJibW9kZSIgfSwKKyAgICB7ICAgICAiYW1wbGl0dWRlIiwgMCwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2ND0xfSwgICAwLCAgICAgICAgICAwLCBBLCAiYm1vZGUiIH0sCisgICAgeyAgICAgInBvd2VyIiwgICAgIDAsICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQ9Mn0sICAgMCwgICAgICAgICAgMCwgQSwgImJtb2RlIiB9LAorICAgIHsgImJtb2RlX291dCIsICJzZXQgYmFsYW5jZSBvdXQgbW9kZSIsIE9GRlNFVChibW9kZV9vdXQpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTB9LCAgIDAsICAgICAgICAgIDIsIEEsICJibW9kZSIgfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtMTU3LDcgKzE2Niw3IEBACiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgewogICAgICAgICBvdXQgPSBpbjsKICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKICAgICAgICAgaWYgKCFvdXQpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0xNjcsMTMgKzE3NiwzMSBAQAogICAgIGRzdCA9IChkb3VibGUgKilvdXQtPmRhdGFbMF07CiAKICAgICBmb3IgKG4gPSAwOyBuIDwgaW4tPm5iX3NhbXBsZXM7IG4rKywgc3JjICs9IDIsIGRzdCArPSAyKSB7Ci0gICAgICAgIGRvdWJsZSBMID0gc3JjWzBdLCBSID0gc3JjWzFdLCBsLCByLCBtLCBTOworICAgICAgICBkb3VibGUgTCA9IHNyY1swXSwgUiA9IHNyY1sxXSwgbCwgciwgbSwgUywgZ2wsIGdyLCBnZDsKIAogICAgICAgICBMICo9IGxldmVsX2luOwogICAgICAgICBSICo9IGxldmVsX2luOwogCi0gICAgICAgIEwgKj0gMS4gLSBGRk1BWCgwLiwgYmFsYW5jZV9pbik7Ci0gICAgICAgIFIgKj0gMS4gKyBGRk1JTigwLiwgYmFsYW5jZV9pbik7CisgICAgICAgIGdsID0gMS4gLSBGRk1BWCgwLiwgYmFsYW5jZV9pbik7CisgICAgICAgIGdyID0gMS4gKyBGRk1JTigwLiwgYmFsYW5jZV9pbik7CisgICAgICAgIHN3aXRjaCAocy0+Ym1vZGVfaW4pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZ2QgPSBnbCAtIGdyOworICAgICAgICAgICAgZ2wgPSAxLiArIGdkOworICAgICAgICAgICAgZ3IgPSAxLiAtIGdkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChiYWxhbmNlX2luIDwgMC4pIHsKKyAgICAgICAgICAgICAgICBnciA9IEZGTUFYKDAuNSwgZ3IpOworICAgICAgICAgICAgICAgIGdsID0gMS4gLyBncjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYmFsYW5jZV9pbiA+IDAuKSB7CisgICAgICAgICAgICAgICAgZ2wgPSBGRk1BWCgwLjUsIGdsKTsKKyAgICAgICAgICAgICAgICBnciA9IDEuIC8gZ2w7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBMICo9IGdsOworICAgICAgICBSICo9IGdyOwogCiAgICAgICAgIGlmIChzLT5zb2Z0Y2xpcCkgewogICAgICAgICAgICAgUiA9IHMtPmludl9hdGFuX3NoYXBlICogYXRhbihSICogc2NfbGV2ZWwpOwpAQCAtMjIyLDYgKzI0OSwxNiBAQAogICAgICAgICAgICAgTCA9IGw7CiAgICAgICAgICAgICBSID0gcjsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6CisgICAgICAgICAgICBsID0gTCAqIG1sZXYgKiBGRk1JTigxLiwgMi4gLSBtcGFuKSArIFIgKiBzbGV2ICogRkZNSU4oMS4sIDIuIC0gc2JhbCk7CisgICAgICAgICAgICBMID0gbDsKKyAgICAgICAgICAgIFIgPSBsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIHIgPSBMICogbWxldiAqIEZGTUlOKDEuLCBtcGFuKSAgICAgIC0gUiAqIHNsZXYgKiBGRk1JTigxLiwgc2JhbCk7CisgICAgICAgICAgICBMID0gcjsKKyAgICAgICAgICAgIFIgPSByOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBMICo9IDEuIC0gbXV0ZV9sOwpAQCAtMjUzLDggKzI5MCwyNyBAQAogCiAgICAgICAgIHMtPnBvcyA9IChzLT5wb3MgKyAyKSAlIHMtPmxlbmd0aDsKIAotICAgICAgICBMICo9IDEuIC0gRkZNQVgoMC4sIGJhbGFuY2Vfb3V0KTsKLSAgICAgICAgUiAqPSAxLiArIEZGTUlOKDAuLCBiYWxhbmNlX291dCk7CisgICAgICAgIGdsID0gMS4gLSBGRk1BWCgwLiwgYmFsYW5jZV9vdXQpOworICAgICAgICBnciA9IDEuICsgRkZNSU4oMC4sIGJhbGFuY2Vfb3V0KTsKKyAgICAgICAgc3dpdGNoIChzLT5ibW9kZV9vdXQpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZ2QgPSBnbCAtIGdyOworICAgICAgICAgICAgZ2wgPSAxLiArIGdkOworICAgICAgICAgICAgZ3IgPSAxLiAtIGdkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGlmIChiYWxhbmNlX291dCA8IDAuKSB7CisgICAgICAgICAgICAgICAgZ3IgPSBGRk1BWCgwLjUsIGdyKTsKKyAgICAgICAgICAgICAgICBnbCA9IDEuIC8gZ3I7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJhbGFuY2Vfb3V0ID4gMC4pIHsKKyAgICAgICAgICAgICAgICBnbCA9IEZGTUFYKDAuNSwgZ2wpOworICAgICAgICAgICAgICAgIGdyID0gMS4gLyBnbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEwgKj0gZ2w7CisgICAgICAgIFIgKj0gZ3I7CisKIAogICAgICAgICBMICo9IGxldmVsX291dDsKICAgICAgICAgUiAqPSBsZXZlbF9vdXQ7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl9zdGVyZW93aWRlbi5jIGIvbGliYXZmaWx0ZXIvYWZfc3RlcmVvd2lkZW4uYwppbmRleCAxNTRhOGIxLi5lZjE2ZmNlIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl9zdGVyZW93aWRlbi5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX3N0ZXJlb3dpZGVuLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBmbG9hdCBkcnltaXg7CiAKICAgICBmbG9hdCAqYnVmZmVyOwotICAgIGZsb2F0ICp3cml0ZTsKKyAgICBmbG9hdCAqY3VyOwogICAgIGludCBsZW5ndGg7CiB9IFN0ZXJlb1dpZGVuQ29udGV4dDsKIApAQCAtNzIsMTEgKzcyLDEyIEBACiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKICAgICBTdGVyZW9XaWRlbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAKLSAgICBzLT5sZW5ndGggPSAyICogcy0+ZGVsYXkgKiBpbmxpbmstPnNhbXBsZV9yYXRlIC8gMTAwMDsKKyAgICBzLT5sZW5ndGggPSBzLT5kZWxheSAqIGlubGluay0+c2FtcGxlX3JhdGUgLyAxMDAwOworICAgIHMtPmxlbmd0aCAqPSAyOwogICAgIHMtPmJ1ZmZlciA9IGF2X2NhbGxvYyhzLT5sZW5ndGgsIHNpemVvZigqcy0+YnVmZmVyKSk7CiAgICAgaWYgKCFzLT5idWZmZXIpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgcy0+d3JpdGUgPSBzLT5idWZmZXI7CisgICAgcy0+Y3VyID0gcy0+YnVmZmVyOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC05Nyw3ICs5OCw3IEBACiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgewogICAgICAgICBvdXQgPSBpbjsKICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKICAgICAgICAgaWYgKCFvdXQpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0xMDYsMjMgKzEwNywxNyBAQAogICAgIH0KICAgICBkc3QgPSAoZmxvYXQgKilvdXQtPmRhdGFbMF07CiAKLSAgICBmb3IgKG4gPSAwOyBuIDwgaW4tPm5iX3NhbXBsZXM7IG4rKywgc3JjICs9IDIsIGRzdCArPSAyKSB7CisgICAgZm9yIChuID0gMDsgbiA8IGluLT5uYl9zYW1wbGVzOyBuKyssIHNyYyArPSAyLCBkc3QgKz0gMiwgcy0+Y3VyICs9IDIpIHsKICAgICAgICAgY29uc3QgZmxvYXQgbGVmdCA9IHNyY1swXSwgcmlnaHQgPSBzcmNbMV07Ci0gICAgICAgIGZsb2F0ICpyZWFkID0gcy0+d3JpdGUgKyAyOwogCi0gICAgICAgIGlmIChyZWFkID4gcy0+YnVmZmVyICsgcy0+bGVuZ3RoKQotICAgICAgICAgICAgcmVhZCA9IHMtPmJ1ZmZlcjsKKyAgICAgICAgaWYgKHMtPmN1ciA9PSBzLT5idWZmZXIgKyBzLT5sZW5ndGgpCisgICAgICAgICAgICBzLT5jdXIgPSBzLT5idWZmZXI7CiAKLSAgICAgICAgZHN0WzBdID0gZHJ5bWl4ICogbGVmdCAtIGNyb3NzZmVlZCAqIHJpZ2h0IC0gZmVlZGJhY2sgKiByZWFkWzFdOwotICAgICAgICBkc3RbMV0gPSBkcnltaXggKiByaWdodCAtIGNyb3NzZmVlZCAqIGxlZnQgLSBmZWVkYmFjayAqIHJlYWRbMF07CisgICAgICAgIGRzdFswXSA9IGRyeW1peCAqIGxlZnQgLSBjcm9zc2ZlZWQgKiByaWdodCAtIGZlZWRiYWNrICogcy0+Y3VyWzFdOworICAgICAgICBkc3RbMV0gPSBkcnltaXggKiByaWdodCAtIGNyb3NzZmVlZCAqIGxlZnQgLSBmZWVkYmFjayAqIHMtPmN1clswXTsKIAotICAgICAgICBzLT53cml0ZVswXSA9IGxlZnQ7Ci0gICAgICAgIHMtPndyaXRlWzFdID0gcmlnaHQ7Ci0KLSAgICAgICAgaWYgKHMtPndyaXRlID09IHMtPmJ1ZmZlciArIHMtPmxlbmd0aCkKLSAgICAgICAgICAgIHMtPndyaXRlID0gcy0+YnVmZmVyOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzLT53cml0ZSArPSAyOworICAgICAgICBzLT5jdXJbMF0gPSBsZWZ0OworICAgICAgICBzLT5jdXJbMV0gPSByaWdodDsKICAgICB9CiAKICAgICBpZiAob3V0ICE9IGluKQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfc3VwZXJlcXVhbGl6ZXIuYyBiL2xpYmF2ZmlsdGVyL2FmX3N1cGVyZXF1YWxpemVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4Y2NhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2FmX3N1cGVyZXF1YWxpemVyLmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTmFva2kgU2hpYmF0YQorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmZmdC5oIgorCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKKyNkZWZpbmUgTkJBTkRTIDE3CisjZGVmaW5lIE0gMTUKKwordHlwZWRlZiBzdHJ1Y3QgRXFQYXJhbWV0ZXIgeworICAgIGZsb2F0IGxvd2VyLCB1cHBlciwgZ2FpbjsKK30gRXFQYXJhbWV0ZXI7CisKK3R5cGVkZWYgc3RydWN0IFN1cGVyRXF1YWxpemVyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBFcVBhcmFtZXRlciBwYXJhbXNbTkJBTkRTICsgMV07CisKKyAgICBmbG9hdCBnYWluc1tOQkFORFMgKyAxXTsKKworICAgIGZsb2F0IGZhY3RbTSArIDFdOworICAgIGZsb2F0IGFhOworICAgIGZsb2F0IGl6YTsKKyAgICBmbG9hdCAqaXJlcywgKmlyZXN0OworICAgIGZsb2F0ICpmc2FtcGxlczsKKyAgICBpbnQgd2lubGVuLCB0YWJzaXplOworCisgICAgQVZGcmFtZSAqaW4sICpvdXQ7CisgICAgUkRGVENvbnRleHQgKnJkZnQsICppcmRmdDsKK30gU3VwZXJFcXVhbGl6ZXJDb250ZXh0OworCitzdGF0aWMgY29uc3QgZmxvYXQgYmFuZHNbXSA9IHsKKyAgICA2NS40MDYzOTIsIDkyLjQ5ODYwNiwgMTMwLjgxMjc4LCAxODQuOTk3MjEsIDI2MS42MjU1NywgMzY5Ljk5NDQyLCA1MjMuMjUxMTMsIDczOS45ODg0LCAxMDQ2LjUwMjMsCisgICAgMTQ3OS45NzY4LCAyMDkzLjAwNDUsIDI5NTkuOTUzNiwgNDE4Ni4wMDkxLCA1OTE5LjkwNzIsIDgzNzIuMDE4MSwgMTE4MzkuODE0LCAxNjc0NC4wMzYKK307CisKK3N0YXRpYyBmbG9hdCBpemVybyhTdXBlckVxdWFsaXplckNvbnRleHQgKnMsIGZsb2F0IHgpCit7CisgICAgZmxvYXQgcmV0ID0gMTsKKyAgICBpbnQgbTsKKworICAgIGZvciAobSA9IDE7IG0gPD0gTTsgbSsrKSB7CisgICAgICAgIGZsb2F0IHQ7CisKKyAgICAgICAgdCA9IHBvdyh4IC8gMiwgbSkgLyBzLT5mYWN0W21dOworICAgICAgICByZXQgKz0gdCp0OworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBmbG9hdCBobl9scGYoaW50IG4sIGZsb2F0IGYsIGZsb2F0IGZzKQoreworICAgIGZsb2F0IHQgPSAxIC8gZnM7CisgICAgZmxvYXQgb21lZ2EgPSAyICogTV9QSSAqIGY7CisKKyAgICBpZiAobiAqIG9tZWdhICogdCA9PSAwKQorICAgICAgICByZXR1cm4gMiAqIGYgKiB0OworICAgIHJldHVybiAyICogZiAqIHQgKiBzaW5mKG4gKiBvbWVnYSAqIHQpIC8gKG4gKiBvbWVnYSAqIHQpOworfQorCitzdGF0aWMgZmxvYXQgaG5faW1wKGludCBuKQoreworICAgIHJldHVybiBuID09IDAgPyAxLmYgOiAwLmY7Cit9CisKK3N0YXRpYyBmbG9hdCBobihpbnQgbiwgRXFQYXJhbWV0ZXIgKnBhcmFtLCBmbG9hdCBmcykKK3sKKyAgICBmbG9hdCByZXQsIGxobjsKKyAgICBpbnQgaTsKKworICAgIGxobiA9IGhuX2xwZihuLCBwYXJhbVswXS51cHBlciwgZnMpOworICAgIHJldCA9IHBhcmFtWzBdLmdhaW4qbGhuOworCisgICAgZm9yIChpID0gMTsgaSA8IE5CQU5EUyArIDEgJiYgcGFyYW1baV0udXBwZXIgPCBmcyAvIDI7IGkrKykgeworICAgICAgICBmbG9hdCBsaG4yID0gaG5fbHBmKG4sIHBhcmFtW2ldLnVwcGVyLCBmcyk7CisgICAgICAgIHJldCArPSBwYXJhbVtpXS5nYWluICogKGxobjIgLSBsaG4pOworICAgICAgICBsaG4gPSBsaG4yOworICAgIH0KKworICAgIHJldCArPSBwYXJhbVtpXS5nYWluICogKGhuX2ltcChuKSAtIGxobik7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgZmxvYXQgYWxwaGEoZmxvYXQgYSkKK3sKKyAgICBpZiAoYSA8PSAyMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKGEgPD0gNTApCisgICAgICAgIHJldHVybiAuNTg0MmYgKiBwb3coYSAtIDIxLCAwLjRmKSArIDAuMDc4ODZmICogKGEgLSAyMSk7CisgICAgcmV0dXJuIC4xMTAyZiAqIChhIC0gOC43Zik7Cit9CisKK3N0YXRpYyBmbG9hdCB3aW4oU3VwZXJFcXVhbGl6ZXJDb250ZXh0ICpzLCBmbG9hdCBuLCBpbnQgTikKK3sKKyAgICByZXR1cm4gaXplcm8ocywgYWxwaGEocy0+YWEpICogc3FydGYoMSAtIDQgKiBuICogbiAvICgoTiAtIDEpICogKE4gLSAxKSkpKSAvIHMtPml6YTsKK30KKworc3RhdGljIHZvaWQgcHJvY2Vzc19wYXJhbShmbG9hdCAqYmMsIEVxUGFyYW1ldGVyICpwYXJhbSwgZmxvYXQgZnMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IE5CQU5EUzsgaSsrKSB7CisgICAgICAgIHBhcmFtW2ldLmxvd2VyID0gaSA9PSAwID8gMCA6IGJhbmRzW2kgLSAxXTsKKyAgICAgICAgcGFyYW1baV0udXBwZXIgPSBpID09IE5CQU5EUyA/IGZzIDogYmFuZHNbaV07CisgICAgICAgIHBhcmFtW2ldLmdhaW4gID0gYmNbaV07CisgICAgfQorfQorCitzdGF0aWMgaW50IGVxdV9pbml0KFN1cGVyRXF1YWxpemVyQ29udGV4dCAqcywgaW50IHdiKQoreworICAgIGludCBpLGo7CisKKyAgICBzLT5yZGZ0ICA9IGF2X3JkZnRfaW5pdCh3YiwgREZUX1IyQyk7CisgICAgcy0+aXJkZnQgPSBhdl9yZGZ0X2luaXQod2IsIElERlRfQzJSKTsKKyAgICBpZiAoIXMtPnJkZnQgfHwgIXMtPmlyZGZ0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+YWEgPSA5NjsKKyAgICBzLT53aW5sZW4gPSAoMSA8PCAod2ItMSkpLTE7CisgICAgcy0+dGFic2l6ZSAgPSAxIDw8IHdiOworCisgICAgcy0+aXJlcyAgICAgPSBhdl9jYWxsb2Mocy0+dGFic2l6ZSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgcy0+aXJlc3QgICAgPSBhdl9jYWxsb2Mocy0+dGFic2l6ZSwgc2l6ZW9mKGZsb2F0KSk7CisgICAgcy0+ZnNhbXBsZXMgPSBhdl9jYWxsb2Mocy0+dGFic2l6ZSwgc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDw9IE07IGkrKykgeworICAgICAgICBzLT5mYWN0W2ldID0gMTsKKyAgICAgICAgZm9yIChqID0gMTsgaiA8PSBpOyBqKyspCisgICAgICAgICAgICBzLT5mYWN0W2ldICo9IGo7CisgICAgfQorCisgICAgcy0+aXphID0gaXplcm8ocywgYWxwaGEocy0+YWEpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtYWtlX2ZpcihTdXBlckVxdWFsaXplckNvbnRleHQgKnMsIGZsb2F0ICpsYmMsIGZsb2F0ICpyYmMsIEVxUGFyYW1ldGVyICpwYXJhbSwgZmxvYXQgZnMpCit7CisgICAgY29uc3QgaW50IHdpbmxlbiA9IHMtPndpbmxlbjsKKyAgICBjb25zdCBpbnQgdGFic2l6ZSA9IHMtPnRhYnNpemU7CisgICAgZmxvYXQgKm5pcmVzOworICAgIGludCBpOworCisgICAgaWYgKGZzIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIHByb2Nlc3NfcGFyYW0obGJjLCBwYXJhbSwgZnMpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aW5sZW47IGkrKykKKyAgICAgICAgcy0+aXJlc3RbaV0gPSBobihpIC0gd2lubGVuIC8gMiwgcGFyYW0sIGZzKSAqIHdpbihzLCBpIC0gd2lubGVuIC8gMiwgd2lubGVuKTsKKyAgICBmb3IgKDsgaSA8IHRhYnNpemU7IGkrKykKKyAgICAgICAgcy0+aXJlc3RbaV0gPSAwOworCisgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnQsIHMtPmlyZXN0KTsKKyAgICBuaXJlcyA9IHMtPmlyZXM7CisgICAgZm9yIChpID0gMDsgaSA8IHRhYnNpemU7IGkrKykKKyAgICAgICAgbmlyZXNbaV0gPSBzLT5pcmVzdFtpXTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgU3VwZXJFcXVhbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBjb25zdCBmbG9hdCAqaXJlcyA9IHMtPmlyZXM7CisgICAgZmxvYXQgKmZzYW1wbGVzID0gcy0+ZnNhbXBsZXM7CisgICAgaW50IGNoLCBpOworCisgICAgQVZGcmFtZSAqb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBzLT53aW5sZW4pOworICAgIGZsb2F0ICpzcmMsICpkc3QsICpwdHI7CisKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZm9yIChjaCA9IDA7IGNoIDwgaW4tPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIHB0ciA9IChmbG9hdCAqKW91dC0+ZXh0ZW5kZWRfZGF0YVtjaF07CisgICAgICAgIGRzdCA9IChmbG9hdCAqKXMtPm91dC0+ZXh0ZW5kZWRfZGF0YVtjaF07CisgICAgICAgIHNyYyA9IChmbG9hdCAqKWluLT5leHRlbmRlZF9kYXRhW2NoXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+d2lubGVuOyBpKyspCisgICAgICAgICAgICBmc2FtcGxlc1tpXSA9IHNyY1tpXTsKKyAgICAgICAgZm9yICg7IGkgPCBzLT50YWJzaXplOyBpKyspCisgICAgICAgICAgICBmc2FtcGxlc1tpXSA9IDA7CisKKyAgICAgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnQsIGZzYW1wbGVzKTsKKworICAgICAgICBmc2FtcGxlc1swXSA9IGlyZXNbMF0gKiBmc2FtcGxlc1swXTsKKyAgICAgICAgZnNhbXBsZXNbMV0gPSBpcmVzWzFdICogZnNhbXBsZXNbMV07CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBzLT50YWJzaXplIC8gMjsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCByZSwgaW07CisKKyAgICAgICAgICAgIHJlID0gaXJlc1tpKjIgIF0gKiBmc2FtcGxlc1tpKjJdIC0gaXJlc1tpKjIrMV0gKiBmc2FtcGxlc1tpKjIrMV07CisgICAgICAgICAgICBpbSA9IGlyZXNbaSoyKzFdICogZnNhbXBsZXNbaSoyXSArIGlyZXNbaSoyICBdICogZnNhbXBsZXNbaSoyKzFdOworCisgICAgICAgICAgICBmc2FtcGxlc1tpKjIgIF0gPSByZTsKKyAgICAgICAgICAgIGZzYW1wbGVzW2kqMisxXSA9IGltOworICAgICAgICB9CisKKyAgICAgICAgYXZfcmRmdF9jYWxjKHMtPmlyZGZ0LCBmc2FtcGxlcyk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPndpbmxlbjsgaSsrKQorICAgICAgICAgICAgZHN0W2ldICs9IGZzYW1wbGVzW2ldIC8gcy0+dGFic2l6ZSAqIDI7CisgICAgICAgIGZvciAoaSA9IHMtPndpbmxlbjsgaSA8IHMtPnRhYnNpemU7IGkrKykKKyAgICAgICAgICAgIGRzdFtpXSAgPSBmc2FtcGxlc1tpXSAvIHMtPnRhYnNpemUgKiAyOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+d2lubGVuOyBpKyspCisgICAgICAgICAgICBwdHJbaV0gPSBkc3RbaV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT53aW5sZW47IGkrKykKKyAgICAgICAgICAgIGRzdFtpXSA9IGRzdFtpK3MtPndpbmxlbl07CisgICAgfQorCisgICAgb3V0LT5wdHMgPSBpbi0+cHRzOworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU3VwZXJFcXVhbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcmV0dXJuIGVxdV9pbml0KHMsIDE0KTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXRzW10gPSB7CisgICAgICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9OT05FCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICgocmV0ID0gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFN1cGVyRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlubGluay0+cGFydGlhbF9idWZfc2l6ZSA9CisgICAgaW5saW5rLT5taW5fc2FtcGxlcyA9CisgICAgaW5saW5rLT5tYXhfc2FtcGxlcyA9IHMtPndpbmxlbjsKKworICAgIHMtPm91dCA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBzLT50YWJzaXplKTsKKyAgICBpZiAoIXMtPm91dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFN1cGVyRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIG1ha2VfZmlyKHMsIHMtPmdhaW5zLCBzLT5nYWlucywgcy0+cGFyYW1zLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU3VwZXJFcXVhbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+b3V0KTsKKyAgICBhdl9mcmVlcCgmcy0+aXJlc3QpOworICAgIGF2X2ZyZWVwKCZzLT5pcmVzKTsKKyAgICBhdl9mcmVlcCgmcy0+ZnNhbXBsZXMpOworICAgIGF2X3JkZnRfZW5kKHMtPnJkZnQpOworICAgIGF2X3JkZnRfZW5kKHMtPmlyZGZ0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHN1cGVyZXF1YWxpemVyX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc3VwZXJlcXVhbGl6ZXJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworI2RlZmluZSBBRiBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFN1cGVyRXF1YWxpemVyQ29udGV4dCwgeCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHN1cGVyZXF1YWxpemVyX29wdGlvbnNbXSA9IHsKKyAgICB7ICAiMWIiLCAic2V0IDY1SHogYmFuZCBnYWluIiwgICAgT0ZGU0VUKGdhaW5zIFswXSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMjAsIEFGIH0sCisgICAgeyAgIjJiIiwgInNldCA5Mkh6IGJhbmQgZ2FpbiIsICAgIE9GRlNFVChnYWlucyBbMV0pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MX0sIDAsIDIwLCBBRiB9LAorICAgIHsgICIzYiIsICJzZXQgMTMxSHogYmFuZCBnYWluIiwgICBPRkZTRVQoZ2FpbnMgWzJdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTF9LCAwLCAyMCwgQUYgfSwKKyAgICB7ICAiNGIiLCAic2V0IDE4NUh6IGJhbmQgZ2FpbiIsICAgT0ZGU0VUKGdhaW5zIFszXSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMjAsIEFGIH0sCisgICAgeyAgIjViIiwgInNldCAyNjJIeiBiYW5kIGdhaW4iLCAgIE9GRlNFVChnYWlucyBbNF0pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MX0sIDAsIDIwLCBBRiB9LAorICAgIHsgICI2YiIsICJzZXQgMzcwSHogYmFuZCBnYWluIiwgICBPRkZTRVQoZ2FpbnMgWzVdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTF9LCAwLCAyMCwgQUYgfSwKKyAgICB7ICAiN2IiLCAic2V0IDUyM0h6IGJhbmQgZ2FpbiIsICAgT0ZGU0VUKGdhaW5zIFs2XSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMjAsIEFGIH0sCisgICAgeyAgIjhiIiwgInNldCA3NDBIeiBiYW5kIGdhaW4iLCAgIE9GRlNFVChnYWlucyBbN10pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MX0sIDAsIDIwLCBBRiB9LAorICAgIHsgICI5YiIsICJzZXQgMTA0N0h6IGJhbmQgZ2FpbiIsICBPRkZTRVQoZ2FpbnMgWzhdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTF9LCAwLCAyMCwgQUYgfSwKKyAgICB7ICIxMGIiLCAic2V0IDE0ODBIeiBiYW5kIGdhaW4iLCAgT0ZGU0VUKGdhaW5zIFs5XSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMjAsIEFGIH0sCisgICAgeyAiMTFiIiwgInNldCAyMDkzSHogYmFuZCBnYWluIiwgIE9GRlNFVChnYWluc1sxMF0pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MX0sIDAsIDIwLCBBRiB9LAorICAgIHsgIjEyYiIsICJzZXQgMjk2MEh6IGJhbmQgZ2FpbiIsICBPRkZTRVQoZ2FpbnNbMTFdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTF9LCAwLCAyMCwgQUYgfSwKKyAgICB7ICIxM2IiLCAic2V0IDQxODZIeiBiYW5kIGdhaW4iLCAgT0ZGU0VUKGdhaW5zWzEyXSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMjAsIEFGIH0sCisgICAgeyAiMTRiIiwgInNldCA1OTIwSHogYmFuZCBnYWluIiwgIE9GRlNFVChnYWluc1sxM10pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MX0sIDAsIDIwLCBBRiB9LAorICAgIHsgIjE1YiIsICJzZXQgODM3Mkh6IGJhbmQgZ2FpbiIsICBPRkZTRVQoZ2FpbnNbMTRdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTF9LCAwLCAyMCwgQUYgfSwKKyAgICB7ICIxNmIiLCAic2V0IDExODQwSHogYmFuZCBnYWluIiwgT0ZGU0VUKGdhaW5zWzE1XSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xfSwgMCwgMjAsIEFGIH0sCisgICAgeyAiMTdiIiwgInNldCAxNjc0NEh6IGJhbmQgZ2FpbiIsIE9GRlNFVChnYWluc1sxNl0pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MX0sIDAsIDIwLCBBRiB9LAorICAgIHsgIjE4YiIsICJzZXQgMjAwMDBIeiBiYW5kIGdhaW4iLCBPRkZTRVQoZ2FpbnNbMTddKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTF9LCAwLCAyMCwgQUYgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHN1cGVyZXF1YWxpemVyKTsKKworQVZGaWx0ZXIgZmZfYWZfc3VwZXJlcXVhbGl6ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAic3VwZXJlcXVhbGl6ZXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IDE4IGJhbmQgZXF1YWxpemF0aW9uIGZpbHRlci4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTdXBlckVxdWFsaXplckNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnN1cGVyZXF1YWxpemVyX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSBzdXBlcmVxdWFsaXplcl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBzdXBlcmVxdWFsaXplcl9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX3N1cnJvdW5kLmMgYi9saWJhdmZpbHRlci9hZl9zdXJyb3VuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOWFmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9hZl9zdXJyb3VuZC5jCkBAIC0wLDAgKzEsMTQ4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdWRpb19maWZvLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZmZnQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorCit0eXBlZGVmIHN0cnVjdCBBdWRpb1N1cnJvdW5kQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBjaGFyICpvdXRfY2hhbm5lbF9sYXlvdXRfc3RyOworICAgIGNoYXIgKmluX2NoYW5uZWxfbGF5b3V0X3N0cjsKKworICAgIGZsb2F0IGxldmVsX2luOworICAgIGZsb2F0IGxldmVsX291dDsKKyAgICBmbG9hdCBmY19pbjsKKyAgICBmbG9hdCBmY19vdXQ7CisgICAgZmxvYXQgbGZlX2luOworICAgIGZsb2F0IGxmZV9vdXQ7CisKKyAgICBmbG9hdCAqaW5wdXRfbGV2ZWxzOworICAgIGZsb2F0ICpvdXRwdXRfbGV2ZWxzOworICAgIGludCBvdXRwdXRfbGZlOworICAgIGludCBsb3djdXRmOworICAgIGludCBoaWdoY3V0ZjsKKworICAgIGZsb2F0IGxvd2N1dDsKKyAgICBmbG9hdCBoaWdoY3V0OworCisgICAgdWludDY0X3Qgb3V0X2NoYW5uZWxfbGF5b3V0OworICAgIHVpbnQ2NF90IGluX2NoYW5uZWxfbGF5b3V0OworICAgIGludCBuYl9pbl9jaGFubmVsczsKKyAgICBpbnQgbmJfb3V0X2NoYW5uZWxzOworCisgICAgQVZGcmFtZSAqaW5wdXQ7CisgICAgQVZGcmFtZSAqb3V0cHV0OworICAgIEFWRnJhbWUgKm92ZXJsYXBfYnVmZmVyOworCisgICAgaW50IGJ1Zl9zaXplOworICAgIGludCBob3Bfc2l6ZTsKKyAgICBBVkF1ZGlvRmlmbyAqZmlmbzsKKyAgICBSREZUQ29udGV4dCAqKnJkZnQsICoqaXJkZnQ7CisgICAgZmxvYXQgKndpbmRvd19mdW5jX2x1dDsKKworICAgIGludDY0X3QgcHRzOworCisgICAgdm9pZCAoKmZpbHRlcikoQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworICAgIHZvaWQgKCp1cG1peF9zdGVyZW8pKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1hZ190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKTsKKyAgICB2b2lkICgqdXBtaXhfMl8xKShBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGZlX2ltLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxmZV9yZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgIGludCBuKTsKKyAgICB2b2lkICgqdXBtaXhfM18wKShBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19tYWcsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbik7CisgICAgdm9pZCAoKnVwbWl4XzVfMCkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19yZSwgZmxvYXQgY19pbSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWxsLCBmbG9hdCBtYWdfdG90YWxyLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZsX3BoYXNlLCBmbG9hdCBmcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBibF9waGFzZSwgZmxvYXQgYnJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2xfcGhhc2UsIGZsb2F0IHNyX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhsLCBmbG9hdCB5bCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4ciwgZmxvYXQgeXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG4pOworICAgIHZvaWQgKCp1cG1peF81XzEpKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNfcmUsIGZsb2F0IGNfaW0sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGZlX3JlLCBmbG9hdCBsZmVfaW0sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWFnX3RvdGFsbCwgZmxvYXQgbWFnX3RvdGFsciwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmbF9waGFzZSwgZmxvYXQgZnJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmxfcGhhc2UsIGZsb2F0IGJyX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNsX3BoYXNlLCBmbG9hdCBzcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4bCwgZmxvYXQgeWwsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeHIsIGZsb2F0IHlyLAorICAgICAgICAgICAgICAgICAgICAgIGludCBuKTsKK30gQXVkaW9TdXJyb3VuZENvbnRleHQ7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHMgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZl9hZGRfZm9ybWF0KCZmb3JtYXRzLCBBVl9TQU1QTEVfRk1UX0ZMVFApOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGxheW91dHMgPSBOVUxMOworICAgIHJldCA9IGZmX2FkZF9jaGFubmVsX2xheW91dCgmbGF5b3V0cywgcy0+b3V0X2NoYW5uZWxfbGF5b3V0KTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmY3R4LT5vdXRwdXRzWzBdLT5pbl9jaGFubmVsX2xheW91dHMpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBsYXlvdXRzID0gTlVMTDsKKyAgICByZXQgPSBmZl9hZGRfY2hhbm5lbF9sYXlvdXQoJmxheW91dHMsIHMtPmluX2NoYW5uZWxfbGF5b3V0KTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmY3R4LT5pbnB1dHNbMF0tPm91dF9jaGFubmVsX2xheW91dHMpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3JtYXRzID0gZmZfYWxsX3NhbXBsZXJhdGVzKCk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX3NhbXBsZXJhdGVzKGN0eCwgZm9ybWF0cyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGNoOworCisgICAgcy0+cmRmdCA9IGF2X2NhbGxvYyhpbmxpbmstPmNoYW5uZWxzLCBzaXplb2YoKnMtPnJkZnQpKTsKKyAgICBpZiAoIXMtPnJkZnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBpbmxpbmstPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIHMtPnJkZnRbY2hdICA9IGF2X3JkZnRfaW5pdChmZl9sb2cyKHMtPmJ1Zl9zaXplKSwgREZUX1IyQyk7CisgICAgICAgIGlmICghcy0+cmRmdFtjaF0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBzLT5uYl9pbl9jaGFubmVscyA9IGlubGluay0+Y2hhbm5lbHM7CisgICAgcy0+aW5wdXRfbGV2ZWxzID0gYXZfbWFsbG9jX2FycmF5KHMtPm5iX2luX2NoYW5uZWxzLCBzaXplb2YoKnMtPmlucHV0X2xldmVscykpOworICAgIGlmICghcy0+aW5wdXRfbGV2ZWxzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGZvciAoY2ggPSAwOyAgY2ggPCBzLT5uYl9pbl9jaGFubmVsczsgY2grKykKKyAgICAgICAgcy0+aW5wdXRfbGV2ZWxzW2NoXSA9IHMtPmxldmVsX2luOworICAgIGNoID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X2NoYW5uZWxfaW5kZXgoaW5saW5rLT5jaGFubmVsX2xheW91dCwgQVZfQ0hfRlJPTlRfQ0VOVEVSKTsKKyAgICBpZiAoY2ggPj0gMCkKKyAgICAgICAgcy0+aW5wdXRfbGV2ZWxzW2NoXSAqPSBzLT5mY19pbjsKKyAgICBjaCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9jaGFubmVsX2luZGV4KGlubGluay0+Y2hhbm5lbF9sYXlvdXQsIEFWX0NIX0xPV19GUkVRVUVOQ1kpOworICAgIGlmIChjaCA+PSAwKQorICAgICAgICBzLT5pbnB1dF9sZXZlbHNbY2hdICo9IHMtPmxmZV9pbjsKKworICAgIHMtPmlucHV0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIHMtPmJ1Zl9zaXplICogMik7CisgICAgaWYgKCFzLT5pbnB1dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPmZpZm8gPSBhdl9hdWRpb19maWZvX2FsbG9jKGlubGluay0+Zm9ybWF0LCBpbmxpbmstPmNoYW5uZWxzLCBzLT5idWZfc2l6ZSk7CisgICAgaWYgKCFzLT5maWZvKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+bG93Y3V0ID0gMS5mICogcy0+bG93Y3V0ZiAvIChpbmxpbmstPnNhbXBsZV9yYXRlICogMC41KSAqIChzLT5idWZfc2l6ZSAvIDIpOworICAgIHMtPmhpZ2hjdXQgPSAxLmYgKiBzLT5oaWdoY3V0ZiAvIChpbmxpbmstPnNhbXBsZV9yYXRlICogMC41KSAqIChzLT5idWZfc2l6ZSAvIDIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGNoOworCisgICAgcy0+aXJkZnQgPSBhdl9jYWxsb2Mob3V0bGluay0+Y2hhbm5lbHMsIHNpemVvZigqcy0+aXJkZnQpKTsKKyAgICBpZiAoIXMtPmlyZGZ0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgb3V0bGluay0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgcy0+aXJkZnRbY2hdID0gYXZfcmRmdF9pbml0KGZmX2xvZzIocy0+YnVmX3NpemUpLCBJREZUX0MyUik7CisgICAgICAgIGlmICghcy0+aXJkZnRbY2hdKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgcy0+bmJfb3V0X2NoYW5uZWxzID0gb3V0bGluay0+Y2hhbm5lbHM7CisgICAgcy0+b3V0cHV0X2xldmVscyA9IGF2X21hbGxvY19hcnJheShzLT5uYl9vdXRfY2hhbm5lbHMsIHNpemVvZigqcy0+b3V0cHV0X2xldmVscykpOworICAgIGlmICghcy0+b3V0cHV0X2xldmVscykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmb3IgKGNoID0gMDsgIGNoIDwgcy0+bmJfb3V0X2NoYW5uZWxzOyBjaCsrKQorICAgICAgICBzLT5vdXRwdXRfbGV2ZWxzW2NoXSA9IHMtPmxldmVsX291dDsKKyAgICBjaCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9jaGFubmVsX2luZGV4KG91dGxpbmstPmNoYW5uZWxfbGF5b3V0LCBBVl9DSF9GUk9OVF9DRU5URVIpOworICAgIGlmIChjaCA+PSAwKQorICAgICAgICBzLT5vdXRwdXRfbGV2ZWxzW2NoXSAqPSBzLT5mY19vdXQ7CisgICAgY2ggPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfY2hhbm5lbF9pbmRleChvdXRsaW5rLT5jaGFubmVsX2xheW91dCwgQVZfQ0hfTE9XX0ZSRVFVRU5DWSk7CisgICAgaWYgKGNoID49IDApCisgICAgICAgIHMtPm91dHB1dF9sZXZlbHNbY2hdICo9IHMtPmxmZV9vdXQ7CisKKyAgICBzLT5vdXRwdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIHMtPmJ1Zl9zaXplICogMik7CisgICAgcy0+b3ZlcmxhcF9idWZmZXIgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIHMtPmJ1Zl9zaXplICogMik7CisgICAgaWYgKCFzLT5vdmVybGFwX2J1ZmZlciB8fCAhcy0+b3V0cHV0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0ZXJlb19wb3NpdGlvbihmbG9hdCBhLCBmbG9hdCBwLCBmbG9hdCAqeCwgZmxvYXQgKnkpCit7CisgICAgICAqeCA9IGF2X2NsaXBmKGErRkZNQVgoMCwgc2luZihwLU1fUElfMikpKkZGRElGRlNJR04oYSwwKSwgLTEsIDEpOworICAgICAgKnkgPSBhdl9jbGlwZihjb3NmKGEqTV9QSV8yK01fUEkpKmNvc2YoTV9QSV8yLXAvTV9QSSkqTV9MTjEwKzEsIC0xLCAxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdldF9sZmUoaW50IG91dHB1dF9sZmUsIGludCBuLCBmbG9hdCBsb3djdXQsIGZsb2F0IGhpZ2hjdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbGZlX21hZywgZmxvYXQgKm1hZ190b3RhbCkKK3sKKyAgICBpZiAob3V0cHV0X2xmZSAmJiBuIDwgaGlnaGN1dCkgeworICAgICAgICAqbGZlX21hZyAgICA9IG4gPCBsb3djdXQgPyAxLmYgOiAuNWYqKDEuZitjb3NmKE1fUEkqKGxvd2N1dC1uKS8obG93Y3V0LWhpZ2hjdXQpKSk7CisgICAgICAgICpsZmVfbWFnICAgKj0gKm1hZ190b3RhbDsKKyAgICAgICAgKm1hZ190b3RhbCAtPSAqbGZlX21hZzsKKyAgICB9IGVsc2UgeworICAgICAgICAqbGZlX21hZyA9IDAuZjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVwbWl4XzFfMChBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbikKK3sKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCBtYWcsICpkc3Q7CisKKyAgICBkc3QgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMF07CisKKyAgICBtYWcgPSBzcXJ0ZigxLmYgLSBmYWJzZih4KSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKworICAgIGRzdFsyICogbiAgICBdID0gbWFnICogY29zZihjX3BoYXNlKTsKKyAgICBkc3RbMiAqIG4gKyAxXSA9IG1hZyAqIHNpbmYoY19waGFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwbWl4X3N0ZXJlbyhBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbikKK3sKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCBsX21hZywgcl9tYWcsICpkc3RsLCAqZHN0cjsKKworICAgIGRzdGwgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMF07CisgICAgZHN0ciA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKworICAgIGxfbWFnID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICByX21hZyA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisKKyAgICBkc3RsWzIgKiBuICAgIF0gPSBsX21hZyAqIGNvc2YobF9waGFzZSk7CisgICAgZHN0bFsyICogbiArIDFdID0gbF9tYWcgKiBzaW5mKGxfcGhhc2UpOworCisgICAgZHN0clsyICogbiAgICBdID0gcl9tYWcgKiBjb3NmKHJfcGhhc2UpOworICAgIGRzdHJbMiAqIG4gKyAxXSA9IHJfbWFnICogc2luZihyX3BoYXNlKTsKK30KKworc3RhdGljIHZvaWQgdXBtaXhfMl8xKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1hZ190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgIGludCBuKQoreworICAgIEF1ZGlvU3Vycm91bmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGZsb2F0IGxmZV9tYWcsIGxfbWFnLCByX21hZywgKmRzdGwsICpkc3RyLCAqZHN0bGZlOworCisgICAgZHN0bCA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzFdOworICAgIGRzdGxmZSA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKworICAgIGdldF9sZmUocy0+b3V0cHV0X2xmZSwgbiwgcy0+bG93Y3V0LCBzLT5oaWdoY3V0LCAmbGZlX21hZywgJm1hZ190b3RhbCk7CisKKyAgICBsX21hZyA9IHNxcnRmKC41ZiAqICggeCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgcl9tYWcgPSBzcXJ0ZiguNWYgKiAoLXggKyAxLmYpKSAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworCisgICAgZHN0bFsyICogbiAgICBdID0gbF9tYWcgKiBjb3NmKGxfcGhhc2UpOworICAgIGRzdGxbMiAqIG4gKyAxXSA9IGxfbWFnICogc2luZihsX3BoYXNlKTsKKworICAgIGRzdHJbMiAqIG4gICAgXSA9IHJfbWFnICogY29zZihyX3BoYXNlKTsKKyAgICBkc3RyWzIgKiBuICsgMV0gPSByX21hZyAqIHNpbmYocl9waGFzZSk7CisKKyAgICBkc3RsZmVbMiAqIG4gICAgXSA9IGxmZV9tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGxmZVsyICogbiArIDFdID0gbGZlX21hZyAqIHNpbmYoY19waGFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwbWl4XzNfMChBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbikKK3sKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCBsX21hZywgcl9tYWcsIGNfbWFnLCAqZHN0YywgKmRzdGwsICpkc3RyOworCisgICAgZHN0bCA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzFdOworICAgIGRzdGMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMl07CisKKyAgICBjX21hZyA9IHNxcnRmKDEuZiAtIGZhYnNmKHgpKSAgICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgbF9tYWcgPSBzcXJ0ZiguNWYgKiAoIHggKyAxLmYpKSAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworICAgIHJfbWFnID0gc3FydGYoLjVmICogKC14ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKworICAgIGRzdGxbMiAqIG4gICAgXSA9IGxfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3RsWzIgKiBuICsgMV0gPSBsX21hZyAqIHNpbmYobF9waGFzZSk7CisKKyAgICBkc3RyWzIgKiBuICAgIF0gPSByX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0clsyICogbiArIDFdID0gcl9tYWcgKiBzaW5mKHJfcGhhc2UpOworCisgICAgZHN0Y1syICogbiAgICBdID0gY19tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGNbMiAqIG4gKyAxXSA9IGNfbWFnICogc2luZihjX3BoYXNlKTsKK30KKworc3RhdGljIHZvaWQgdXBtaXhfM18xKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1hZ190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgIGludCBuKQoreworICAgIEF1ZGlvU3Vycm91bmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGZsb2F0IGxmZV9tYWcsIGxfbWFnLCByX21hZywgY19tYWcsICpkc3RjLCAqZHN0bCwgKmRzdHIsICpkc3RsZmU7CisKKyAgICBkc3RsID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIGRzdHIgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMV07CisgICAgZHN0YyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBkc3RsZmUgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbM107CisKKyAgICBnZXRfbGZlKHMtPm91dHB1dF9sZmUsIG4sIHMtPmxvd2N1dCwgcy0+aGlnaGN1dCwgJmxmZV9tYWcsICZtYWdfdG90YWwpOworCisgICAgY19tYWcgPSBzcXJ0ZigxLmYgLSBmYWJzZih4KSkgICAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworICAgIGxfbWFnID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICByX21hZyA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisKKyAgICBkc3RsWzIgKiBuICAgIF0gPSBsX21hZyAqIGNvc2YobF9waGFzZSk7CisgICAgZHN0bFsyICogbiArIDFdID0gbF9tYWcgKiBzaW5mKGxfcGhhc2UpOworCisgICAgZHN0clsyICogbiAgICBdID0gcl9tYWcgKiBjb3NmKHJfcGhhc2UpOworICAgIGRzdHJbMiAqIG4gKyAxXSA9IHJfbWFnICogc2luZihyX3BoYXNlKTsKKworICAgIGRzdGNbMiAqIG4gICAgXSA9IGNfbWFnICogY29zZihjX3BoYXNlKTsKKyAgICBkc3RjWzIgKiBuICsgMV0gPSBjX21hZyAqIHNpbmYoY19waGFzZSk7CisKKyAgICBkc3RsZmVbMiAqIG4gICAgXSA9IGxmZV9tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGxmZVsyICogbiArIDFdID0gbGZlX21hZyAqIHNpbmYoY19waGFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwbWl4XzNfMV9zdXJyb3VuZChBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjX21hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbikKK3sKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCBsZmVfbWFnLCBsX21hZywgcl9tYWcsICpkc3RjLCAqZHN0bCwgKmRzdHIsICpkc3RsZmU7CisKKyAgICBkc3RsID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIGRzdHIgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMV07CisgICAgZHN0YyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBkc3RsZmUgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbM107CisKKyAgICBnZXRfbGZlKHMtPm91dHB1dF9sZmUsIG4sIHMtPmxvd2N1dCwgcy0+aGlnaGN1dCwgJmxmZV9tYWcsICZjX21hZyk7CisKKyAgICBsX21hZyA9IHNxcnRmKC41ZiAqICggeCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgcl9tYWcgPSBzcXJ0ZiguNWYgKiAoLXggKyAxLmYpKSAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworCisgICAgZHN0bFsyICogbiAgICBdID0gbF9tYWcgKiBjb3NmKGxfcGhhc2UpOworICAgIGRzdGxbMiAqIG4gKyAxXSA9IGxfbWFnICogc2luZihsX3BoYXNlKTsKKworICAgIGRzdHJbMiAqIG4gICAgXSA9IHJfbWFnICogY29zZihyX3BoYXNlKTsKKyAgICBkc3RyWzIgKiBuICsgMV0gPSByX21hZyAqIHNpbmYocl9waGFzZSk7CisKKyAgICBkc3RjWzIgKiBuICAgIF0gPSBjX21hZyAqIGNvc2YoY19waGFzZSk7CisgICAgZHN0Y1syICogbiArIDFdID0gY19tYWcgKiBzaW5mKGNfcGhhc2UpOworCisgICAgZHN0bGZlWzIgKiBuICAgIF0gPSBsZmVfbWFnICogY29zZihjX3BoYXNlKTsKKyAgICBkc3RsZmVbMiAqIG4gKyAxXSA9IGxmZV9tYWcgKiBzaW5mKGNfcGhhc2UpOworfQorCitzdGF0aWMgdm9pZCB1cG1peF80XzAoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbF9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWFnX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgaW50IG4pCit7CisgICAgZmxvYXQgYl9tYWcsIGxfbWFnLCByX21hZywgY19tYWcsICpkc3RjLCAqZHN0bCwgKmRzdHIsICpkc3RiOworICAgIEF1ZGlvU3Vycm91bmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgZHN0bCA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzFdOworICAgIGRzdGMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMl07CisgICAgZHN0YiA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVszXTsKKworICAgIGNfbWFnID0gc3FydGYoMS5mIC0gZmFic2YoeCkpICAgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICBiX21hZyA9IHNxcnRmKDEuZiAtIGZhYnNmKHgpKSAgICogKCgxLmYgLSB5KSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgbF9tYWcgPSBzcXJ0ZiguNWYgKiAoIHggKyAxLmYpKSAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworICAgIHJfbWFnID0gc3FydGYoLjVmICogKC14ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKworICAgIGRzdGxbMiAqIG4gICAgXSA9IGxfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3RsWzIgKiBuICsgMV0gPSBsX21hZyAqIHNpbmYobF9waGFzZSk7CisKKyAgICBkc3RyWzIgKiBuICAgIF0gPSByX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0clsyICogbiArIDFdID0gcl9tYWcgKiBzaW5mKHJfcGhhc2UpOworCisgICAgZHN0Y1syICogbiAgICBdID0gY19tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGNbMiAqIG4gKyAxXSA9IGNfbWFnICogc2luZihjX3BoYXNlKTsKKworICAgIGRzdGJbMiAqIG4gICAgXSA9IGJfbWFnICogY29zZihjX3BoYXNlKTsKKyAgICBkc3RiWzIgKiBuICsgMV0gPSBiX21hZyAqIHNpbmYoY19waGFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwbWl4XzRfMShBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbikKK3sKKyAgICBmbG9hdCBsZmVfbWFnLCBiX21hZywgbF9tYWcsIHJfbWFnLCBjX21hZywgKmRzdGMsICpkc3RsLCAqZHN0ciwgKmRzdGIsICpkc3RsZmU7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBkc3RsID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIGRzdHIgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMV07CisgICAgZHN0YyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBkc3RsZmUgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbM107CisgICAgZHN0YiA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs0XTsKKworICAgIGdldF9sZmUocy0+b3V0cHV0X2xmZSwgbiwgcy0+bG93Y3V0LCBzLT5oaWdoY3V0LCAmbGZlX21hZywgJm1hZ190b3RhbCk7CisKKyAgICBkc3RsZmVbMiAqIG4gICAgXSA9IGxmZV9tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGxmZVsyICogbiArIDFdID0gbGZlX21hZyAqIHNpbmYoY19waGFzZSk7CisKKyAgICBjX21hZyA9IHNxcnRmKDEuZiAtIGZhYnNmKHgpKSAgICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgYl9tYWcgPSBzcXJ0ZigxLmYgLSBmYWJzZih4KSkgICAqICgoMS5mIC0geSkgKiAuNWYpICogbWFnX3RvdGFsOworICAgIGxfbWFnID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICByX21hZyA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisKKyAgICBkc3RsWzIgKiBuICAgIF0gPSBsX21hZyAqIGNvc2YobF9waGFzZSk7CisgICAgZHN0bFsyICogbiArIDFdID0gbF9tYWcgKiBzaW5mKGxfcGhhc2UpOworCisgICAgZHN0clsyICogbiAgICBdID0gcl9tYWcgKiBjb3NmKHJfcGhhc2UpOworICAgIGRzdHJbMiAqIG4gKyAxXSA9IHJfbWFnICogc2luZihyX3BoYXNlKTsKKworICAgIGRzdGNbMiAqIG4gICAgXSA9IGNfbWFnICogY29zZihjX3BoYXNlKTsKKyAgICBkc3RjWzIgKiBuICsgMV0gPSBjX21hZyAqIHNpbmYoY19waGFzZSk7CisKKyAgICBkc3RiWzIgKiBuICAgIF0gPSBiX21hZyAqIGNvc2YoY19waGFzZSk7CisgICAgZHN0YlsyICogbiArIDFdID0gYl9tYWcgKiBzaW5mKGNfcGhhc2UpOworfQorCitzdGF0aWMgdm9pZCB1cG1peF81XzBfYmFjayhBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1hZ190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbikKK3sKKyAgICBmbG9hdCBsX21hZywgcl9tYWcsIGxzX21hZywgcnNfbWFnLCBjX21hZywgKmRzdGMsICpkc3RsLCAqZHN0ciwgKmRzdGxzLCAqZHN0cnM7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBkc3RsICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBkc3RjICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBkc3RscyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVszXTsKKyAgICBkc3RycyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs0XTsKKworICAgIGNfbWFnICA9IHNxcnRmKDEuZiAtIGZhYnNmKHgpKSAgICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgbF9tYWcgID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICByX21hZyAgPSBzcXJ0ZiguNWYgKiAoLXggKyAxLmYpKSAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworICAgIGxzX21hZyA9IHNxcnRmKC41ZiAqICggeCArIDEuZikpICogKDEuZiAtICgoeSArIDEuZikgKiAuNWYpKSAqIG1hZ190b3RhbDsKKyAgICByc19tYWcgPSBzcXJ0ZiguNWYgKiAoLXggKyAxLmYpKSAqICgxLmYgLSAoKHkgKyAxLmYpICogLjVmKSkgKiBtYWdfdG90YWw7CisKKyAgICBkc3RsWzIgKiBuICAgIF0gPSBsX21hZyAqIGNvc2YobF9waGFzZSk7CisgICAgZHN0bFsyICogbiArIDFdID0gbF9tYWcgKiBzaW5mKGxfcGhhc2UpOworCisgICAgZHN0clsyICogbiAgICBdID0gcl9tYWcgKiBjb3NmKHJfcGhhc2UpOworICAgIGRzdHJbMiAqIG4gKyAxXSA9IHJfbWFnICogc2luZihyX3BoYXNlKTsKKworICAgIGRzdGNbMiAqIG4gICAgXSA9IGNfbWFnICogY29zZihjX3BoYXNlKTsKKyAgICBkc3RjWzIgKiBuICsgMV0gPSBjX21hZyAqIHNpbmYoY19waGFzZSk7CisKKyAgICBkc3Rsc1syICogbiAgICBdID0gbHNfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3Rsc1syICogbiArIDFdID0gbHNfbWFnICogc2luZihsX3BoYXNlKTsKKworICAgIGRzdHJzWzIgKiBuICAgIF0gPSByc19tYWcgKiBjb3NmKHJfcGhhc2UpOworICAgIGRzdHJzWzIgKiBuICsgMV0gPSByc19tYWcgKiBzaW5mKHJfcGhhc2UpOworfQorCitzdGF0aWMgdm9pZCB1cG1peF81XzFfYmFjayhBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1hZ190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbikKK3sKKyAgICBmbG9hdCBsZmVfbWFnLCBsX21hZywgcl9tYWcsIGxzX21hZywgcnNfbWFnLCBjX21hZywgKmRzdGMsICpkc3RsLCAqZHN0ciwgKmRzdGxzLCAqZHN0cnMsICpkc3RsZmU7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBkc3RsICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBkc3RjICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBkc3RsZmUgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbM107CisgICAgZHN0bHMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbNF07CisgICAgZHN0cnMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbNV07CisKKyAgICBnZXRfbGZlKHMtPm91dHB1dF9sZmUsIG4sIHMtPmxvd2N1dCwgcy0+aGlnaGN1dCwgJmxmZV9tYWcsICZtYWdfdG90YWwpOworCisgICAgY19tYWcgID0gc3FydGYoMS5mIC0gZmFic2YoeCkpICAgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICBsX21hZyAgPSBzcXJ0ZiguNWYgKiAoIHggKyAxLmYpKSAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworICAgIHJfbWFnICA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgbHNfbWFnID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoMS5mIC0gKCh5ICsgMS5mKSAqIC41ZikpICogbWFnX3RvdGFsOworICAgIHJzX21hZyA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKDEuZiAtICgoeSArIDEuZikgKiAuNWYpKSAqIG1hZ190b3RhbDsKKworICAgIGRzdGxbMiAqIG4gICAgXSA9IGxfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3RsWzIgKiBuICsgMV0gPSBsX21hZyAqIHNpbmYobF9waGFzZSk7CisKKyAgICBkc3RyWzIgKiBuICAgIF0gPSByX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0clsyICogbiArIDFdID0gcl9tYWcgKiBzaW5mKHJfcGhhc2UpOworCisgICAgZHN0Y1syICogbiAgICBdID0gY19tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGNbMiAqIG4gKyAxXSA9IGNfbWFnICogc2luZihjX3BoYXNlKTsKKworICAgIGRzdGxmZVsyICogbiAgICBdID0gbGZlX21hZyAqIGNvc2YoY19waGFzZSk7CisgICAgZHN0bGZlWzIgKiBuICsgMV0gPSBsZmVfbWFnICogc2luZihjX3BoYXNlKTsKKworICAgIGRzdGxzWzIgKiBuICAgIF0gPSBsc19tYWcgKiBjb3NmKGxfcGhhc2UpOworICAgIGRzdGxzWzIgKiBuICsgMV0gPSBsc19tYWcgKiBzaW5mKGxfcGhhc2UpOworCisgICAgZHN0cnNbMiAqIG4gICAgXSA9IHJzX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0cnNbMiAqIG4gKyAxXSA9IHJzX21hZyAqIHNpbmYocl9waGFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwbWl4XzVfMV9iYWNrX3N1cnJvdW5kKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbF9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19tYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4pCit7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZmxvYXQgbGZlX21hZywgbF9tYWcsIHJfbWFnLCAqZHN0YywgKmRzdGwsICpkc3RyLCAqZHN0bGZlOworICAgIGZsb2F0IGxzX21hZywgcnNfbWFnLCAqZHN0bHMsICpkc3RyczsKKworICAgIGRzdGwgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMF07CisgICAgZHN0ciA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBkc3RjID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzJdOworICAgIGRzdGxmZSA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVszXTsKKyAgICBkc3RscyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs0XTsKKyAgICBkc3RycyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs1XTsKKworICAgIGdldF9sZmUocy0+b3V0cHV0X2xmZSwgbiwgcy0+bG93Y3V0LCBzLT5oaWdoY3V0LCAmbGZlX21hZywgJmNfbWFnKTsKKworICAgIGxfbWFnID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICByX21hZyA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgbHNfbWFnID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoMS5mIC0gKCh5ICsgMS5mKSAqIC41ZikpICogbWFnX3RvdGFsOworICAgIHJzX21hZyA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKDEuZiAtICgoeSArIDEuZikgKiAuNWYpKSAqIG1hZ190b3RhbDsKKworICAgIGRzdGxbMiAqIG4gICAgXSA9IGxfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3RsWzIgKiBuICsgMV0gPSBsX21hZyAqIHNpbmYobF9waGFzZSk7CisKKyAgICBkc3RyWzIgKiBuICAgIF0gPSByX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0clsyICogbiArIDFdID0gcl9tYWcgKiBzaW5mKHJfcGhhc2UpOworCisgICAgZHN0Y1syICogbiAgICBdID0gY19tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGNbMiAqIG4gKyAxXSA9IGNfbWFnICogc2luZihjX3BoYXNlKTsKKworICAgIGRzdGxmZVsyICogbiAgICBdID0gbGZlX21hZyAqIGNvc2YoY19waGFzZSk7CisgICAgZHN0bGZlWzIgKiBuICsgMV0gPSBsZmVfbWFnICogc2luZihjX3BoYXNlKTsKKworICAgIGRzdGxzWzIgKiBuICAgIF0gPSBsc19tYWcgKiBjb3NmKGxfcGhhc2UpOworICAgIGRzdGxzWzIgKiBuICsgMV0gPSBsc19tYWcgKiBzaW5mKGxfcGhhc2UpOworCisgICAgZHN0cnNbMiAqIG4gICAgXSA9IHJzX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0cnNbMiAqIG4gKyAxXSA9IHJzX21hZyAqIHNpbmYocl9waGFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwbWl4XzVfMV9iYWNrXzJfMShBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY19waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGZlX3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxmZV9pbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKQoreworICAgIEF1ZGlvU3Vycm91bmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGZsb2F0IGNfbWFnLCBsX21hZywgcl9tYWcsICpkc3RjLCAqZHN0bCwgKmRzdHIsICpkc3RsZmU7CisgICAgZmxvYXQgbHNfbWFnLCByc19tYWcsICpkc3RscywgKmRzdHJzOworCisgICAgZHN0bCA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzFdOworICAgIGRzdGMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbMl07CisgICAgZHN0bGZlID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzNdOworICAgIGRzdGxzID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzRdOworICAgIGRzdHJzID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzVdOworCisgICAgY19tYWcgID0gc3FydGYoMS5mIC0gZmFic2YoeCkpICAgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICBsX21hZyAgPSBzcXJ0ZiguNWYgKiAoIHggKyAxLmYpKSAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworICAgIHJfbWFnICA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgbHNfbWFnID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoMS5mIC0gKCh5ICsgMS5mKSAqIC41ZikpICogbWFnX3RvdGFsOworICAgIHJzX21hZyA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKDEuZiAtICgoeSArIDEuZikgKiAuNWYpKSAqIG1hZ190b3RhbDsKKworICAgIGRzdGxbMiAqIG4gICAgXSA9IGxfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3RsWzIgKiBuICsgMV0gPSBsX21hZyAqIHNpbmYobF9waGFzZSk7CisKKyAgICBkc3RyWzIgKiBuICAgIF0gPSByX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0clsyICogbiArIDFdID0gcl9tYWcgKiBzaW5mKHJfcGhhc2UpOworCisgICAgZHN0Y1syICogbiAgICBdID0gY19tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGNbMiAqIG4gKyAxXSA9IGNfbWFnICogc2luZihjX3BoYXNlKTsKKworICAgIGRzdGxmZVsyICogbiAgICBdID0gbGZlX3JlOworICAgIGRzdGxmZVsyICogbiArIDFdID0gbGZlX2ltOworCisgICAgZHN0bHNbMiAqIG4gICAgXSA9IGxzX21hZyAqIGNvc2YobF9waGFzZSk7CisgICAgZHN0bHNbMiAqIG4gKyAxXSA9IGxzX21hZyAqIHNpbmYobF9waGFzZSk7CisKKyAgICBkc3Ryc1syICogbiAgICBdID0gcnNfbWFnICogY29zZihyX3BoYXNlKTsKKyAgICBkc3Ryc1syICogbiArIDFdID0gcnNfbWFnICogc2luZihyX3BoYXNlKTsKK30KKworc3RhdGljIHZvaWQgdXBtaXhfN18wKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1hZ190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgIGludCBuKQoreworICAgIGZsb2F0IGxfbWFnLCByX21hZywgbHNfbWFnLCByc19tYWcsIGNfbWFnLCBsYl9tYWcsIHJiX21hZzsKKyAgICBmbG9hdCAqZHN0YywgKmRzdGwsICpkc3RyLCAqZHN0bHMsICpkc3RycywgKmRzdGxiLCAqZHN0cmI7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBkc3RsICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBkc3RjICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBkc3RsYiA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVszXTsKKyAgICBkc3RyYiA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs0XTsKKyAgICBkc3RscyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs1XTsKKyAgICBkc3RycyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs2XTsKKworICAgIGNfbWFnICA9IHNxcnRmKDEuZiAtIGZhYnNmKHgpKSAgICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgbF9tYWcgID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICByX21hZyAgPSBzcXJ0ZiguNWYgKiAoLXggKyAxLmYpKSAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworICAgIGxiX21hZyA9IHNxcnRmKC41ZiAqICggeCArIDEuZikpICogKDEuZiAtICgoeSArIDEuZikgKiAuNWYpKSAqIG1hZ190b3RhbDsKKyAgICByYl9tYWcgPSBzcXJ0ZiguNWYgKiAoLXggKyAxLmYpKSAqICgxLmYgLSAoKHkgKyAxLmYpICogLjVmKSkgKiBtYWdfdG90YWw7CisgICAgbHNfbWFnID0gc3FydGYoLjVmICogKCB4ICsgMS5mKSkgKiAoMS5mIC0gZmFic2YoeSkpICogbWFnX3RvdGFsOworICAgIHJzX21hZyA9IHNxcnRmKC41ZiAqICgteCArIDEuZikpICogKDEuZiAtIGZhYnNmKHkpKSAqIG1hZ190b3RhbDsKKworICAgIGRzdGxbMiAqIG4gICAgXSA9IGxfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3RsWzIgKiBuICsgMV0gPSBsX21hZyAqIHNpbmYobF9waGFzZSk7CisKKyAgICBkc3RyWzIgKiBuICAgIF0gPSByX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0clsyICogbiArIDFdID0gcl9tYWcgKiBzaW5mKHJfcGhhc2UpOworCisgICAgZHN0Y1syICogbiAgICBdID0gY19tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGNbMiAqIG4gKyAxXSA9IGNfbWFnICogc2luZihjX3BoYXNlKTsKKworICAgIGRzdGxiWzIgKiBuICAgIF0gPSBsYl9tYWcgKiBjb3NmKGxfcGhhc2UpOworICAgIGRzdGxiWzIgKiBuICsgMV0gPSBsYl9tYWcgKiBzaW5mKGxfcGhhc2UpOworCisgICAgZHN0cmJbMiAqIG4gICAgXSA9IHJiX21hZyAqIGNvc2Yocl9waGFzZSk7CisgICAgZHN0cmJbMiAqIG4gKyAxXSA9IHJiX21hZyAqIHNpbmYocl9waGFzZSk7CisKKyAgICBkc3Rsc1syICogbiAgICBdID0gbHNfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3Rsc1syICogbiArIDFdID0gbHNfbWFnICogc2luZihsX3BoYXNlKTsKKworICAgIGRzdHJzWzIgKiBuICAgIF0gPSByc19tYWcgKiBjb3NmKHJfcGhhc2UpOworICAgIGRzdHJzWzIgKiBuICsgMV0gPSByc19tYWcgKiBzaW5mKHJfcGhhc2UpOworfQorCitzdGF0aWMgdm9pZCB1cG1peF83XzEoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbF9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWFnX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgaW50IG4pCit7CisgICAgZmxvYXQgbGZlX21hZywgbF9tYWcsIHJfbWFnLCBsc19tYWcsIHJzX21hZywgY19tYWcsIGxiX21hZywgcmJfbWFnOworICAgIGZsb2F0ICpkc3RjLCAqZHN0bCwgKmRzdHIsICpkc3RscywgKmRzdHJzLCAqZHN0bGIsICpkc3RyYiwgKmRzdGxmZTsKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGRzdGwgID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIGRzdHIgID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzFdOworICAgIGRzdGMgID0gKGZsb2F0ICopcy0+b3V0cHV0LT5leHRlbmRlZF9kYXRhWzJdOworICAgIGRzdGxmZSA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVszXTsKKyAgICBkc3RsYiA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs0XTsKKyAgICBkc3RyYiA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs1XTsKKyAgICBkc3RscyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs2XTsKKyAgICBkc3RycyA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVs3XTsKKworICAgIGdldF9sZmUocy0+b3V0cHV0X2xmZSwgbiwgcy0+bG93Y3V0LCBzLT5oaWdoY3V0LCAmbGZlX21hZywgJm1hZ190b3RhbCk7CisKKyAgICBjX21hZyAgPSBzcXJ0ZigxLmYgLSBmYWJzZih4KSkgICAqICgoeSArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsOworICAgIGxfbWFnICA9IHNxcnRmKC41ZiAqICggeCArIDEuZikpICogKCh5ICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWw7CisgICAgcl9tYWcgID0gc3FydGYoLjVmICogKC14ICsgMS5mKSkgKiAoKHkgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbDsKKyAgICBsYl9tYWcgPSBzcXJ0ZiguNWYgKiAoIHggKyAxLmYpKSAqICgxLmYgLSAoKHkgKyAxLmYpICogLjVmKSkgKiBtYWdfdG90YWw7CisgICAgcmJfbWFnID0gc3FydGYoLjVmICogKC14ICsgMS5mKSkgKiAoMS5mIC0gKCh5ICsgMS5mKSAqIC41ZikpICogbWFnX3RvdGFsOworICAgIGxzX21hZyA9IHNxcnRmKC41ZiAqICggeCArIDEuZikpICogKDEuZiAtIGZhYnNmKHkpKSAqIG1hZ190b3RhbDsKKyAgICByc19tYWcgPSBzcXJ0ZiguNWYgKiAoLXggKyAxLmYpKSAqICgxLmYgLSBmYWJzZih5KSkgKiBtYWdfdG90YWw7CisKKyAgICBkc3RsWzIgKiBuICAgIF0gPSBsX21hZyAqIGNvc2YobF9waGFzZSk7CisgICAgZHN0bFsyICogbiArIDFdID0gbF9tYWcgKiBzaW5mKGxfcGhhc2UpOworCisgICAgZHN0clsyICogbiAgICBdID0gcl9tYWcgKiBjb3NmKHJfcGhhc2UpOworICAgIGRzdHJbMiAqIG4gKyAxXSA9IHJfbWFnICogc2luZihyX3BoYXNlKTsKKworICAgIGRzdGNbMiAqIG4gICAgXSA9IGNfbWFnICogY29zZihjX3BoYXNlKTsKKyAgICBkc3RjWzIgKiBuICsgMV0gPSBjX21hZyAqIHNpbmYoY19waGFzZSk7CisKKyAgICBkc3RsZmVbMiAqIG4gICAgXSA9IGxmZV9tYWcgKiBjb3NmKGNfcGhhc2UpOworICAgIGRzdGxmZVsyICogbiArIDFdID0gbGZlX21hZyAqIHNpbmYoY19waGFzZSk7CisKKyAgICBkc3RsYlsyICogbiAgICBdID0gbGJfbWFnICogY29zZihsX3BoYXNlKTsKKyAgICBkc3RsYlsyICogbiArIDFdID0gbGJfbWFnICogc2luZihsX3BoYXNlKTsKKworICAgIGRzdHJiWzIgKiBuICAgIF0gPSByYl9tYWcgKiBjb3NmKHJfcGhhc2UpOworICAgIGRzdHJiWzIgKiBuICsgMV0gPSByYl9tYWcgKiBzaW5mKHJfcGhhc2UpOworCisgICAgZHN0bHNbMiAqIG4gICAgXSA9IGxzX21hZyAqIGNvc2YobF9waGFzZSk7CisgICAgZHN0bHNbMiAqIG4gKyAxXSA9IGxzX21hZyAqIHNpbmYobF9waGFzZSk7CisKKyAgICBkc3Ryc1syICogbiAgICBdID0gcnNfbWFnICogY29zZihyX3BoYXNlKTsKKyAgICBkc3Ryc1syICogbiArIDFdID0gcnNfbWFnICogc2luZihyX3BoYXNlKTsKK30KKworc3RhdGljIHZvaWQgdXBtaXhfN18xXzVfMF9zaWRlKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNfcmUsIGZsb2F0IGNfaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWFnX3RvdGFsbCwgZmxvYXQgbWFnX3RvdGFsciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmbF9waGFzZSwgZmxvYXQgZnJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmxfcGhhc2UsIGZsb2F0IGJyX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNsX3BoYXNlLCBmbG9hdCBzcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4bCwgZmxvYXQgeWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeHIsIGZsb2F0IHlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuKQoreworICAgIGZsb2F0IGZsX21hZywgZnJfbWFnLCBsc19tYWcsIHJzX21hZywgbGJfbWFnLCByYl9tYWc7CisgICAgZmxvYXQgKmRzdGMsICpkc3RsLCAqZHN0ciwgKmRzdGxzLCAqZHN0cnMsICpkc3RsYiwgKmRzdHJiLCAqZHN0bGZlOworICAgIGZsb2F0IGxmZV9tYWcsIGNfcGhhc2UsIG1hZ190b3RhbCA9IChtYWdfdG90YWxsICsgbWFnX3RvdGFscikgKiAwLjU7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBkc3RsICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBkc3RjICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBkc3RsZmUgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbM107CisgICAgZHN0bGIgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbNF07CisgICAgZHN0cmIgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbNV07CisgICAgZHN0bHMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbNl07CisgICAgZHN0cnMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbN107CisKKyAgICBjX3BoYXNlID0gYXRhbjJmKGNfaW0sIGNfcmUpOworCisgICAgZ2V0X2xmZShzLT5vdXRwdXRfbGZlLCBuLCBzLT5sb3djdXQsIHMtPmhpZ2hjdXQsICZsZmVfbWFnLCAmbWFnX3RvdGFsKTsKKworICAgIGZsX21hZyA9IHNxcnRmKC41ZiAqICh4bCArIDEuZikpICogKCh5bCArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsbDsKKyAgICBmcl9tYWcgPSBzcXJ0ZiguNWYgKiAoeHIgKyAxLmYpKSAqICgoeXIgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbHI7CisgICAgbGJfbWFnID0gc3FydGYoLjVmICogKC14bCArIDEuZikpICogKCh5bCArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsbDsKKyAgICByYl9tYWcgPSBzcXJ0ZiguNWYgKiAoLXhyICsgMS5mKSkgKiAoKHlyICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWxyOworICAgIGxzX21hZyA9IHNxcnRmKDEuZiAtIGZhYnNmKHhsKSkgKiAoKHlsICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWxsOworICAgIHJzX21hZyA9IHNxcnRmKDEuZiAtIGZhYnNmKHhyKSkgKiAoKHlyICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWxyOworCisgICAgZHN0bFsyICogbiAgICBdID0gZmxfbWFnICogY29zZihmbF9waGFzZSk7CisgICAgZHN0bFsyICogbiArIDFdID0gZmxfbWFnICogc2luZihmbF9waGFzZSk7CisKKyAgICBkc3RyWzIgKiBuICAgIF0gPSBmcl9tYWcgKiBjb3NmKGZyX3BoYXNlKTsKKyAgICBkc3RyWzIgKiBuICsgMV0gPSBmcl9tYWcgKiBzaW5mKGZyX3BoYXNlKTsKKworICAgIGRzdGNbMiAqIG4gICAgXSA9IGNfcmU7CisgICAgZHN0Y1syICogbiArIDFdID0gY19pbTsKKworICAgIGRzdGxmZVsyICogbiAgICBdID0gbGZlX21hZyAqIGNvc2YoY19waGFzZSk7CisgICAgZHN0bGZlWzIgKiBuICsgMV0gPSBsZmVfbWFnICogc2luZihjX3BoYXNlKTsKKworICAgIGRzdGxiWzIgKiBuICAgIF0gPSBsYl9tYWcgKiBjb3NmKGJsX3BoYXNlKTsKKyAgICBkc3RsYlsyICogbiArIDFdID0gbGJfbWFnICogc2luZihibF9waGFzZSk7CisKKyAgICBkc3RyYlsyICogbiAgICBdID0gcmJfbWFnICogY29zZihicl9waGFzZSk7CisgICAgZHN0cmJbMiAqIG4gKyAxXSA9IHJiX21hZyAqIHNpbmYoYnJfcGhhc2UpOworCisgICAgZHN0bHNbMiAqIG4gICAgXSA9IGxzX21hZyAqIGNvc2Yoc2xfcGhhc2UpOworICAgIGRzdGxzWzIgKiBuICsgMV0gPSBsc19tYWcgKiBzaW5mKHNsX3BoYXNlKTsKKworICAgIGRzdHJzWzIgKiBuICAgIF0gPSByc19tYWcgKiBjb3NmKHNyX3BoYXNlKTsKKyAgICBkc3Ryc1syICogbiArIDFdID0gcnNfbWFnICogc2luZihzcl9waGFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIHVwbWl4XzdfMV81XzEoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNfcmUsIGZsb2F0IGNfaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxmZV9yZSwgZmxvYXQgbGZlX2ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWdfdG90YWxsLCBmbG9hdCBtYWdfdG90YWxyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmbF9waGFzZSwgZmxvYXQgZnJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJsX3BoYXNlLCBmbG9hdCBicl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2xfcGhhc2UsIGZsb2F0IHNyX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4bCwgZmxvYXQgeWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhyLCBmbG9hdCB5ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4pCit7CisgICAgZmxvYXQgZmxfbWFnLCBmcl9tYWcsIGxzX21hZywgcnNfbWFnLCBsYl9tYWcsIHJiX21hZzsKKyAgICBmbG9hdCAqZHN0YywgKmRzdGwsICpkc3RyLCAqZHN0bHMsICpkc3RycywgKmRzdGxiLCAqZHN0cmIsICpkc3RsZmU7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBkc3RsICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVswXTsKKyAgICBkc3RyICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBkc3RjICA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBkc3RsZmUgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbM107CisgICAgZHN0bGIgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbNF07CisgICAgZHN0cmIgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbNV07CisgICAgZHN0bHMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbNl07CisgICAgZHN0cnMgPSAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbN107CisKKyAgICBmbF9tYWcgPSBzcXJ0ZiguNWYgKiAoeGwgKyAxLmYpKSAqICgoeWwgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbGw7CisgICAgZnJfbWFnID0gc3FydGYoLjVmICogKHhyICsgMS5mKSkgKiAoKHlyICsgMS5mKSAqIC41ZikgKiBtYWdfdG90YWxyOworICAgIGxiX21hZyA9IHNxcnRmKC41ZiAqICgteGwgKyAxLmYpKSAqICgoeWwgKyAxLmYpICogLjVmKSAqIG1hZ190b3RhbGw7CisgICAgcmJfbWFnID0gc3FydGYoLjVmICogKC14ciArIDEuZikpICogKCh5ciArIDEuZikgKiAuNWYpICogbWFnX3RvdGFscjsKKyAgICBsc19tYWcgPSBzcXJ0ZigxLmYgLSBmYWJzZih4bCkpICogKCh5bCArIDEuZikgKiAuNWYpICogbWFnX3RvdGFsbDsKKyAgICByc19tYWcgPSBzcXJ0ZigxLmYgLSBmYWJzZih4cikpICogKCh5ciArIDEuZikgKiAuNWYpICogbWFnX3RvdGFscjsKKworICAgIGRzdGxbMiAqIG4gICAgXSA9IGZsX21hZyAqIGNvc2YoZmxfcGhhc2UpOworICAgIGRzdGxbMiAqIG4gKyAxXSA9IGZsX21hZyAqIHNpbmYoZmxfcGhhc2UpOworCisgICAgZHN0clsyICogbiAgICBdID0gZnJfbWFnICogY29zZihmcl9waGFzZSk7CisgICAgZHN0clsyICogbiArIDFdID0gZnJfbWFnICogc2luZihmcl9waGFzZSk7CisKKyAgICBkc3RjWzIgKiBuICAgIF0gPSBjX3JlOworICAgIGRzdGNbMiAqIG4gKyAxXSA9IGNfaW07CisKKyAgICBkc3RsZmVbMiAqIG4gICAgXSA9IGxmZV9yZTsKKyAgICBkc3RsZmVbMiAqIG4gKyAxXSA9IGxmZV9pbTsKKworICAgIGRzdGxiWzIgKiBuICAgIF0gPSBsYl9tYWcgKiBjb3NmKGJsX3BoYXNlKTsKKyAgICBkc3RsYlsyICogbiArIDFdID0gbGJfbWFnICogc2luZihibF9waGFzZSk7CisKKyAgICBkc3RyYlsyICogbiAgICBdID0gcmJfbWFnICogY29zZihicl9waGFzZSk7CisgICAgZHN0cmJbMiAqIG4gKyAxXSA9IHJiX21hZyAqIHNpbmYoYnJfcGhhc2UpOworCisgICAgZHN0bHNbMiAqIG4gICAgXSA9IGxzX21hZyAqIGNvc2Yoc2xfcGhhc2UpOworICAgIGRzdGxzWzIgKiBuICsgMV0gPSBsc19tYWcgKiBzaW5mKHNsX3BoYXNlKTsKKworICAgIGRzdHJzWzIgKiBuICAgIF0gPSByc19tYWcgKiBjb3NmKHNyX3BoYXNlKTsKKyAgICBkc3Ryc1syICogbiArIDFdID0gcnNfbWFnICogc2luZihzcl9waGFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9zdGVyZW8oQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZmxvYXQgKnNyY2wsICpzcmNyOworICAgIGludCBuOworCisgICAgc3JjbCA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIHNyY3IgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKworICAgIGZvciAobiA9IDA7IG4gPCBzLT5idWZfc2l6ZTsgbisrKSB7CisgICAgICAgIGZsb2F0IGxfcmUgPSBzcmNsWzIgKiBuXSwgcl9yZSA9IHNyY3JbMiAqIG5dOworICAgICAgICBmbG9hdCBsX2ltID0gc3JjbFsyICogbiArIDFdLCByX2ltID0gc3JjclsyICogbiArIDFdOworICAgICAgICBmbG9hdCBjX3BoYXNlID0gYXRhbjJmKGxfaW0gKyByX2ltLCBsX3JlICsgcl9yZSk7CisgICAgICAgIGZsb2F0IGxfbWFnID0gaHlwb3RmKGxfcmUsIGxfaW0pOworICAgICAgICBmbG9hdCByX21hZyA9IGh5cG90ZihyX3JlLCByX2ltKTsKKyAgICAgICAgZmxvYXQgbF9waGFzZSA9IGF0YW4yZihsX2ltLCBsX3JlKTsKKyAgICAgICAgZmxvYXQgcl9waGFzZSA9IGF0YW4yZihyX2ltLCByX3JlKTsKKyAgICAgICAgZmxvYXQgcGhhc2VfZGlmID0gZmFic2YobF9waGFzZSAtIHJfcGhhc2UpOworICAgICAgICBmbG9hdCBtYWdfZGlmID0gKGxfbWFnIC0gcl9tYWcpIC8gKGxfbWFnICsgcl9tYWcpOworICAgICAgICBmbG9hdCBtYWdfdG90YWwgPSBoeXBvdGYobF9tYWcsIHJfbWFnKTsKKyAgICAgICAgZmxvYXQgeCwgeTsKKworICAgICAgICBpZiAocGhhc2VfZGlmID4gTV9QSSkKKyAgICAgICAgICAgIHBoYXNlX2RpZiA9IDIgKiBNX1BJIC0gcGhhc2VfZGlmOworCisgICAgICAgIHN0ZXJlb19wb3NpdGlvbihtYWdfZGlmLCBwaGFzZV9kaWYsICZ4LCAmeSk7CisKKyAgICAgICAgcy0+dXBtaXhfc3RlcmVvKGN0eCwgbF9waGFzZSwgcl9waGFzZSwgY19waGFzZSwgbWFnX3RvdGFsLCB4LCB5LCBuKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9zdXJyb3VuZChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCAqc3JjbCwgKnNyY3IsICpzcmNjOworICAgIGludCBuOworCisgICAgc3JjbCA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIHNyY3IgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBzcmNjID0gKGZsb2F0ICopcy0+aW5wdXQtPmV4dGVuZGVkX2RhdGFbMl07CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+YnVmX3NpemU7IG4rKykgeworICAgICAgICBmbG9hdCBsX3JlID0gc3JjbFsyICogbl0sIHJfcmUgPSBzcmNyWzIgKiBuXTsKKyAgICAgICAgZmxvYXQgbF9pbSA9IHNyY2xbMiAqIG4gKyAxXSwgcl9pbSA9IHNyY3JbMiAqIG4gKyAxXTsKKyAgICAgICAgZmxvYXQgY19yZSA9IHNyY2NbMiAqIG5dLCBjX2ltID0gc3JjY1syICogbiArIDFdOworICAgICAgICBmbG9hdCBjX21hZyA9IGh5cG90ZihjX3JlLCBjX2ltKTsKKyAgICAgICAgZmxvYXQgY19waGFzZSA9IGF0YW4yZihjX2ltLCBjX3JlKTsKKyAgICAgICAgZmxvYXQgbF9tYWcgPSBoeXBvdGYobF9yZSwgbF9pbSk7CisgICAgICAgIGZsb2F0IHJfbWFnID0gaHlwb3RmKHJfcmUsIHJfaW0pOworICAgICAgICBmbG9hdCBsX3BoYXNlID0gYXRhbjJmKGxfaW0sIGxfcmUpOworICAgICAgICBmbG9hdCByX3BoYXNlID0gYXRhbjJmKHJfaW0sIHJfcmUpOworICAgICAgICBmbG9hdCBwaGFzZV9kaWYgPSBmYWJzZihsX3BoYXNlIC0gcl9waGFzZSk7CisgICAgICAgIGZsb2F0IG1hZ19kaWYgPSAobF9tYWcgLSByX21hZykgLyAobF9tYWcgKyByX21hZyk7CisgICAgICAgIGZsb2F0IG1hZ190b3RhbCA9IGh5cG90ZihsX21hZywgcl9tYWcpOworICAgICAgICBmbG9hdCB4LCB5OworCisgICAgICAgIGlmIChwaGFzZV9kaWYgPiBNX1BJKQorICAgICAgICAgICAgcGhhc2VfZGlmID0gMiAqIE1fUEkgLSBwaGFzZV9kaWY7CisKKyAgICAgICAgc3RlcmVvX3Bvc2l0aW9uKG1hZ19kaWYsIHBoYXNlX2RpZiwgJngsICZ5KTsKKworICAgICAgICBzLT51cG1peF8zXzAoY3R4LCBsX3BoYXNlLCByX3BoYXNlLCBjX3BoYXNlLCBjX21hZywgbWFnX3RvdGFsLCB4LCB5LCBuKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl8yXzEoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZmxvYXQgKnNyY2wsICpzcmNyLCAqc3JjbGZlOworICAgIGludCBuOworCisgICAgc3JjbCA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIHNyY3IgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBzcmNsZmUgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKworICAgIGZvciAobiA9IDA7IG4gPCBzLT5idWZfc2l6ZTsgbisrKSB7CisgICAgICAgIGZsb2F0IGxfcmUgPSBzcmNsWzIgKiBuXSwgcl9yZSA9IHNyY3JbMiAqIG5dOworICAgICAgICBmbG9hdCBsX2ltID0gc3JjbFsyICogbiArIDFdLCByX2ltID0gc3JjclsyICogbiArIDFdOworICAgICAgICBmbG9hdCBsZmVfcmUgPSBzcmNsZmVbMiAqIG5dLCBsZmVfaW0gPSBzcmNsZmVbMiAqIG4gKyAxXTsKKyAgICAgICAgZmxvYXQgY19waGFzZSA9IGF0YW4yZihsX2ltICsgcl9pbSwgbF9yZSArIHJfcmUpOworICAgICAgICBmbG9hdCBsX21hZyA9IGh5cG90ZihsX3JlLCBsX2ltKTsKKyAgICAgICAgZmxvYXQgcl9tYWcgPSBoeXBvdGYocl9yZSwgcl9pbSk7CisgICAgICAgIGZsb2F0IGxfcGhhc2UgPSBhdGFuMmYobF9pbSwgbF9yZSk7CisgICAgICAgIGZsb2F0IHJfcGhhc2UgPSBhdGFuMmYocl9pbSwgcl9yZSk7CisgICAgICAgIGZsb2F0IHBoYXNlX2RpZiA9IGZhYnNmKGxfcGhhc2UgLSByX3BoYXNlKTsKKyAgICAgICAgZmxvYXQgbWFnX2RpZiA9IChsX21hZyAtIHJfbWFnKSAvIChsX21hZyArIHJfbWFnKTsKKyAgICAgICAgZmxvYXQgbWFnX3RvdGFsID0gaHlwb3RmKGxfbWFnLCByX21hZyk7CisgICAgICAgIGZsb2F0IHgsIHk7CisKKyAgICAgICAgaWYgKHBoYXNlX2RpZiA+IE1fUEkpCisgICAgICAgICAgICBwaGFzZV9kaWYgPSAyICogTV9QSSAtIHBoYXNlX2RpZjsKKworICAgICAgICBzdGVyZW9fcG9zaXRpb24obWFnX2RpZiwgcGhhc2VfZGlmLCAmeCwgJnkpOworCisgICAgICAgIHMtPnVwbWl4XzJfMShjdHgsIGxfcGhhc2UsIHJfcGhhc2UsIGNfcGhhc2UsIG1hZ190b3RhbCwgbGZlX3JlLCBsZmVfaW0sIHgsIHksIG4pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyXzVfMF9zaWRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEF1ZGlvU3Vycm91bmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGZsb2F0ICpzcmNsLCAqc3JjciwgKnNyY2MsICpzcmNzbCwgKnNyY3NyOworICAgIGludCBuOworCisgICAgc3JjbCA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIHNyY3IgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBzcmNjID0gKGZsb2F0ICopcy0+aW5wdXQtPmV4dGVuZGVkX2RhdGFbMl07CisgICAgc3Jjc2wgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVszXTsKKyAgICBzcmNzciA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzRdOworCisgICAgZm9yIChuID0gMDsgbiA8IHMtPmJ1Zl9zaXplOyBuKyspIHsKKyAgICAgICAgZmxvYXQgZmxfcmUgPSBzcmNsWzIgKiBuXSwgZnJfcmUgPSBzcmNyWzIgKiBuXTsKKyAgICAgICAgZmxvYXQgZmxfaW0gPSBzcmNsWzIgKiBuICsgMV0sIGZyX2ltID0gc3JjclsyICogbiArIDFdOworICAgICAgICBmbG9hdCBjX3JlID0gc3JjY1syICogbl0sIGNfaW0gPSBzcmNjWzIgKiBuICsgMV07CisgICAgICAgIGZsb2F0IHNsX3JlID0gc3Jjc2xbMiAqIG5dLCBzbF9pbSA9IHNyY3NsWzIgKiBuICsgMV07CisgICAgICAgIGZsb2F0IHNyX3JlID0gc3Jjc3JbMiAqIG5dLCBzcl9pbSA9IHNyY3NyWzIgKiBuICsgMV07CisgICAgICAgIGZsb2F0IGZsX21hZyA9IGh5cG90ZihmbF9yZSwgZmxfaW0pOworICAgICAgICBmbG9hdCBmcl9tYWcgPSBoeXBvdGYoZnJfcmUsIGZyX2ltKTsKKyAgICAgICAgZmxvYXQgZmxfcGhhc2UgPSBhdGFuMmYoZmxfaW0sIGZsX3JlKTsKKyAgICAgICAgZmxvYXQgZnJfcGhhc2UgPSBhdGFuMmYoZnJfaW0sIGZyX3JlKTsKKyAgICAgICAgZmxvYXQgc2xfbWFnID0gaHlwb3RmKHNsX3JlLCBzbF9pbSk7CisgICAgICAgIGZsb2F0IHNyX21hZyA9IGh5cG90Zihzcl9yZSwgc3JfaW0pOworICAgICAgICBmbG9hdCBzbF9waGFzZSA9IGF0YW4yZihzbF9pbSwgc2xfcmUpOworICAgICAgICBmbG9hdCBzcl9waGFzZSA9IGF0YW4yZihzcl9pbSwgc3JfcmUpOworICAgICAgICBmbG9hdCBwaGFzZV9kaWZsID0gZmFic2YoZmxfcGhhc2UgLSBzbF9waGFzZSk7CisgICAgICAgIGZsb2F0IHBoYXNlX2RpZnIgPSBmYWJzZihmcl9waGFzZSAtIHNyX3BoYXNlKTsKKyAgICAgICAgZmxvYXQgbWFnX2RpZmwgPSAoZmxfbWFnIC0gc2xfbWFnKSAvIChmbF9tYWcgKyBzbF9tYWcpOworICAgICAgICBmbG9hdCBtYWdfZGlmciA9IChmcl9tYWcgLSBzcl9tYWcpIC8gKGZyX21hZyArIHNyX21hZyk7CisgICAgICAgIGZsb2F0IG1hZ190b3RhbGwgPSBoeXBvdGYoZmxfbWFnLCBzbF9tYWcpOworICAgICAgICBmbG9hdCBtYWdfdG90YWxyID0gaHlwb3RmKGZyX21hZywgc3JfbWFnKTsKKyAgICAgICAgZmxvYXQgYmxfcGhhc2UgPSBhdGFuMmYoZmxfaW0gKyBzbF9pbSwgZmxfcmUgKyBzbF9yZSk7CisgICAgICAgIGZsb2F0IGJyX3BoYXNlID0gYXRhbjJmKGZyX2ltICsgc3JfaW0sIGZyX3JlICsgc3JfcmUpOworICAgICAgICBmbG9hdCB4bCwgeWw7CisgICAgICAgIGZsb2F0IHhyLCB5cjsKKworICAgICAgICBpZiAocGhhc2VfZGlmbCA+IE1fUEkpCisgICAgICAgICAgICBwaGFzZV9kaWZsID0gMiAqIE1fUEkgLSBwaGFzZV9kaWZsOworCisgICAgICAgIGlmIChwaGFzZV9kaWZyID4gTV9QSSkKKyAgICAgICAgICAgIHBoYXNlX2RpZnIgPSAyICogTV9QSSAtIHBoYXNlX2RpZnI7CisKKyAgICAgICAgc3RlcmVvX3Bvc2l0aW9uKG1hZ19kaWZsLCBwaGFzZV9kaWZsLCAmeGwsICZ5bCk7CisgICAgICAgIHN0ZXJlb19wb3NpdGlvbihtYWdfZGlmciwgcGhhc2VfZGlmciwgJnhyLCAmeXIpOworCisgICAgICAgIHMtPnVwbWl4XzVfMChjdHgsIGNfcmUsIGNfaW0sCisgICAgICAgICAgICAgICAgICAgICBtYWdfdG90YWxsLCBtYWdfdG90YWxyLAorICAgICAgICAgICAgICAgICAgICAgZmxfcGhhc2UsIGZyX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgYmxfcGhhc2UsIGJyX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgc2xfcGhhc2UsIHNyX3BoYXNlLAorICAgICAgICAgICAgICAgICAgICAgeGwsIHlsLCB4ciwgeXIsIG4pOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyXzVfMV9zaWRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEF1ZGlvU3Vycm91bmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGZsb2F0ICpzcmNsLCAqc3JjciwgKnNyY2MsICpzcmNsZmUsICpzcmNzbCwgKnNyY3NyOworICAgIGludCBuOworCisgICAgc3JjbCA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzBdOworICAgIHNyY3IgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVsxXTsKKyAgICBzcmNjID0gKGZsb2F0ICopcy0+aW5wdXQtPmV4dGVuZGVkX2RhdGFbMl07CisgICAgc3JjbGZlID0gKGZsb2F0ICopcy0+aW5wdXQtPmV4dGVuZGVkX2RhdGFbM107CisgICAgc3Jjc2wgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVs0XTsKKyAgICBzcmNzciA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzVdOworCisgICAgZm9yIChuID0gMDsgbiA8IHMtPmJ1Zl9zaXplOyBuKyspIHsKKyAgICAgICAgZmxvYXQgZmxfcmUgPSBzcmNsWzIgKiBuXSwgZnJfcmUgPSBzcmNyWzIgKiBuXTsKKyAgICAgICAgZmxvYXQgZmxfaW0gPSBzcmNsWzIgKiBuICsgMV0sIGZyX2ltID0gc3JjclsyICogbiArIDFdOworICAgICAgICBmbG9hdCBjX3JlID0gc3JjY1syICogbl0sIGNfaW0gPSBzcmNjWzIgKiBuICsgMV07CisgICAgICAgIGZsb2F0IGxmZV9yZSA9IHNyY2xmZVsyICogbl0sIGxmZV9pbSA9IHNyY2xmZVsyICogbiArIDFdOworICAgICAgICBmbG9hdCBzbF9yZSA9IHNyY3NsWzIgKiBuXSwgc2xfaW0gPSBzcmNzbFsyICogbiArIDFdOworICAgICAgICBmbG9hdCBzcl9yZSA9IHNyY3NyWzIgKiBuXSwgc3JfaW0gPSBzcmNzclsyICogbiArIDFdOworICAgICAgICBmbG9hdCBmbF9tYWcgPSBoeXBvdGYoZmxfcmUsIGZsX2ltKTsKKyAgICAgICAgZmxvYXQgZnJfbWFnID0gaHlwb3RmKGZyX3JlLCBmcl9pbSk7CisgICAgICAgIGZsb2F0IGZsX3BoYXNlID0gYXRhbjJmKGZsX2ltLCBmbF9yZSk7CisgICAgICAgIGZsb2F0IGZyX3BoYXNlID0gYXRhbjJmKGZyX2ltLCBmcl9yZSk7CisgICAgICAgIGZsb2F0IHNsX21hZyA9IGh5cG90ZihzbF9yZSwgc2xfaW0pOworICAgICAgICBmbG9hdCBzcl9tYWcgPSBoeXBvdGYoc3JfcmUsIHNyX2ltKTsKKyAgICAgICAgZmxvYXQgc2xfcGhhc2UgPSBhdGFuMmYoc2xfaW0sIHNsX3JlKTsKKyAgICAgICAgZmxvYXQgc3JfcGhhc2UgPSBhdGFuMmYoc3JfaW0sIHNyX3JlKTsKKyAgICAgICAgZmxvYXQgcGhhc2VfZGlmbCA9IGZhYnNmKGZsX3BoYXNlIC0gc2xfcGhhc2UpOworICAgICAgICBmbG9hdCBwaGFzZV9kaWZyID0gZmFic2YoZnJfcGhhc2UgLSBzcl9waGFzZSk7CisgICAgICAgIGZsb2F0IG1hZ19kaWZsID0gKGZsX21hZyAtIHNsX21hZykgLyAoZmxfbWFnICsgc2xfbWFnKTsKKyAgICAgICAgZmxvYXQgbWFnX2RpZnIgPSAoZnJfbWFnIC0gc3JfbWFnKSAvIChmcl9tYWcgKyBzcl9tYWcpOworICAgICAgICBmbG9hdCBtYWdfdG90YWxsID0gaHlwb3RmKGZsX21hZywgc2xfbWFnKTsKKyAgICAgICAgZmxvYXQgbWFnX3RvdGFsciA9IGh5cG90Zihmcl9tYWcsIHNyX21hZyk7CisgICAgICAgIGZsb2F0IGJsX3BoYXNlID0gYXRhbjJmKGZsX2ltICsgc2xfaW0sIGZsX3JlICsgc2xfcmUpOworICAgICAgICBmbG9hdCBicl9waGFzZSA9IGF0YW4yZihmcl9pbSArIHNyX2ltLCBmcl9yZSArIHNyX3JlKTsKKyAgICAgICAgZmxvYXQgeGwsIHlsOworICAgICAgICBmbG9hdCB4ciwgeXI7CisKKyAgICAgICAgaWYgKHBoYXNlX2RpZmwgPiBNX1BJKQorICAgICAgICAgICAgcGhhc2VfZGlmbCA9IDIgKiBNX1BJIC0gcGhhc2VfZGlmbDsKKworICAgICAgICBpZiAocGhhc2VfZGlmciA+IE1fUEkpCisgICAgICAgICAgICBwaGFzZV9kaWZyID0gMiAqIE1fUEkgLSBwaGFzZV9kaWZyOworCisgICAgICAgIHN0ZXJlb19wb3NpdGlvbihtYWdfZGlmbCwgcGhhc2VfZGlmbCwgJnhsLCAmeWwpOworICAgICAgICBzdGVyZW9fcG9zaXRpb24obWFnX2RpZnIsIHBoYXNlX2RpZnIsICZ4ciwgJnlyKTsKKworICAgICAgICBzLT51cG1peF81XzEoY3R4LCBjX3JlLCBjX2ltLCBsZmVfcmUsIGxmZV9pbSwKKyAgICAgICAgICAgICAgICAgICAgIG1hZ190b3RhbGwsIG1hZ190b3RhbHIsCisgICAgICAgICAgICAgICAgICAgICBmbF9waGFzZSwgZnJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICBibF9waGFzZSwgYnJfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICBzbF9waGFzZSwgc3JfcGhhc2UsCisgICAgICAgICAgICAgICAgICAgICB4bCwgeWwsIHhyLCB5ciwgbik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXJfNV8xX2JhY2soQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZmxvYXQgKnNyY2wsICpzcmNyLCAqc3JjYywgKnNyY2xmZSwgKnNyY2JsLCAqc3JjYnI7CisgICAgaW50IG47CisKKyAgICBzcmNsID0gKGZsb2F0ICopcy0+aW5wdXQtPmV4dGVuZGVkX2RhdGFbMF07CisgICAgc3JjciA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzFdOworICAgIHNyY2MgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVsyXTsKKyAgICBzcmNsZmUgPSAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVszXTsKKyAgICBzcmNibCA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhWzRdOworICAgIHNyY2JyID0gKGZsb2F0ICopcy0+aW5wdXQtPmV4dGVuZGVkX2RhdGFbNV07CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+YnVmX3NpemU7IG4rKykgeworICAgICAgICBmbG9hdCBmbF9yZSA9IHNyY2xbMiAqIG5dLCBmcl9yZSA9IHNyY3JbMiAqIG5dOworICAgICAgICBmbG9hdCBmbF9pbSA9IHNyY2xbMiAqIG4gKyAxXSwgZnJfaW0gPSBzcmNyWzIgKiBuICsgMV07CisgICAgICAgIGZsb2F0IGNfcmUgPSBzcmNjWzIgKiBuXSwgY19pbSA9IHNyY2NbMiAqIG4gKyAxXTsKKyAgICAgICAgZmxvYXQgbGZlX3JlID0gc3JjbGZlWzIgKiBuXSwgbGZlX2ltID0gc3JjbGZlWzIgKiBuICsgMV07CisgICAgICAgIGZsb2F0IGJsX3JlID0gc3JjYmxbMiAqIG5dLCBibF9pbSA9IHNyY2JsWzIgKiBuICsgMV07CisgICAgICAgIGZsb2F0IGJyX3JlID0gc3JjYnJbMiAqIG5dLCBicl9pbSA9IHNyY2JyWzIgKiBuICsgMV07CisgICAgICAgIGZsb2F0IGZsX21hZyA9IGh5cG90ZihmbF9yZSwgZmxfaW0pOworICAgICAgICBmbG9hdCBmcl9tYWcgPSBoeXBvdGYoZnJfcmUsIGZyX2ltKTsKKyAgICAgICAgZmxvYXQgZmxfcGhhc2UgPSBhdGFuMmYoZmxfaW0sIGZsX3JlKTsKKyAgICAgICAgZmxvYXQgZnJfcGhhc2UgPSBhdGFuMmYoZnJfaW0sIGZyX3JlKTsKKyAgICAgICAgZmxvYXQgYmxfbWFnID0gaHlwb3RmKGJsX3JlLCBibF9pbSk7CisgICAgICAgIGZsb2F0IGJyX21hZyA9IGh5cG90Zihicl9yZSwgYnJfaW0pOworICAgICAgICBmbG9hdCBibF9waGFzZSA9IGF0YW4yZihibF9pbSwgYmxfcmUpOworICAgICAgICBmbG9hdCBicl9waGFzZSA9IGF0YW4yZihicl9pbSwgYnJfcmUpOworICAgICAgICBmbG9hdCBwaGFzZV9kaWZsID0gZmFic2YoZmxfcGhhc2UgLSBibF9waGFzZSk7CisgICAgICAgIGZsb2F0IHBoYXNlX2RpZnIgPSBmYWJzZihmcl9waGFzZSAtIGJyX3BoYXNlKTsKKyAgICAgICAgZmxvYXQgbWFnX2RpZmwgPSAoZmxfbWFnIC0gYmxfbWFnKSAvIChmbF9tYWcgKyBibF9tYWcpOworICAgICAgICBmbG9hdCBtYWdfZGlmciA9IChmcl9tYWcgLSBicl9tYWcpIC8gKGZyX21hZyArIGJyX21hZyk7CisgICAgICAgIGZsb2F0IG1hZ190b3RhbGwgPSBoeXBvdGYoZmxfbWFnLCBibF9tYWcpOworICAgICAgICBmbG9hdCBtYWdfdG90YWxyID0gaHlwb3RmKGZyX21hZywgYnJfbWFnKTsKKyAgICAgICAgZmxvYXQgc2xfcGhhc2UgPSBhdGFuMmYoZmxfaW0gKyBibF9pbSwgZmxfcmUgKyBibF9yZSk7CisgICAgICAgIGZsb2F0IHNyX3BoYXNlID0gYXRhbjJmKGZyX2ltICsgYnJfaW0sIGZyX3JlICsgYnJfcmUpOworICAgICAgICBmbG9hdCB4bCwgeWw7CisgICAgICAgIGZsb2F0IHhyLCB5cjsKKworICAgICAgICBpZiAocGhhc2VfZGlmbCA+IE1fUEkpCisgICAgICAgICAgICBwaGFzZV9kaWZsID0gMiAqIE1fUEkgLSBwaGFzZV9kaWZsOworCisgICAgICAgIGlmIChwaGFzZV9kaWZyID4gTV9QSSkKKyAgICAgICAgICAgIHBoYXNlX2RpZnIgPSAyICogTV9QSSAtIHBoYXNlX2RpZnI7CisKKyAgICAgICAgc3RlcmVvX3Bvc2l0aW9uKG1hZ19kaWZsLCBwaGFzZV9kaWZsLCAmeGwsICZ5bCk7CisgICAgICAgIHN0ZXJlb19wb3NpdGlvbihtYWdfZGlmciwgcGhhc2VfZGlmciwgJnhyLCAmeXIpOworCisgICAgICAgIHMtPnVwbWl4XzVfMShjdHgsIGNfcmUsIGNfaW0sIGxmZV9yZSwgbGZlX2ltLAorICAgICAgICAgICAgICAgICAgICAgbWFnX3RvdGFsbCwgbWFnX3RvdGFsciwKKyAgICAgICAgICAgICAgICAgICAgIGZsX3BoYXNlLCBmcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgIGJsX3BoYXNlLCBicl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgIHNsX3BoYXNlLCBzcl9waGFzZSwKKyAgICAgICAgICAgICAgICAgICAgIHhsLCB5bCwgeHIsIHlyLCBuKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCBvdmVybGFwOworICAgIGludCBpOworCisgICAgaWYgKCEocy0+b3V0X2NoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KHMtPm91dF9jaGFubmVsX2xheW91dF9zdHIpKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwYXJzaW5nIG91dHB1dCBjaGFubmVsIGxheW91dCAnJXMnLlxuIiwKKyAgICAgICAgICAgICAgIHMtPm91dF9jaGFubmVsX2xheW91dF9zdHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghKHMtPmluX2NoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KHMtPmluX2NoYW5uZWxfbGF5b3V0X3N0cikpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgaW5wdXQgY2hhbm5lbCBsYXlvdXQgJyVzJy5cbiIsCisgICAgICAgICAgICAgICBzLT5pbl9jaGFubmVsX2xheW91dF9zdHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChzLT5sb3djdXRmID49IHMtPmhpZ2hjdXRmKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkxvdyBjdXQtb2ZmICclZCcgc2hvdWxkIGJlIGxlc3MgdGhhbiBoaWdoIGN1dC1vZmYgJyVkJy5cbiIsCisgICAgICAgICAgICAgICBzLT5sb3djdXRmLCBzLT5oaWdoY3V0Zik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgc3dpdGNoIChzLT5pbl9jaGFubmVsX2xheW91dCkgeworICAgIGNhc2UgQVZfQ0hfTEFZT1VUX1NURVJFTzoKKyAgICAgICAgcy0+ZmlsdGVyID0gZmlsdGVyX3N0ZXJlbzsKKyAgICAgICAgc3dpdGNoIChzLT5vdXRfY2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfTU9OTzoKKyAgICAgICAgICAgIHMtPnVwbWl4X3N0ZXJlbyA9IHVwbWl4XzFfMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF9TVEVSRU86CisgICAgICAgICAgICBzLT51cG1peF9zdGVyZW8gPSB1cG1peF9zdGVyZW87CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfMlBPSU5UMToKKyAgICAgICAgICAgIHMtPnVwbWl4X3N0ZXJlbyA9IHVwbWl4XzJfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF9TVVJST1VORDoKKyAgICAgICAgICAgIHMtPnVwbWl4X3N0ZXJlbyA9IHVwbWl4XzNfMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF8zUE9JTlQxOgorICAgICAgICAgICAgcy0+dXBtaXhfc3RlcmVvID0gdXBtaXhfM18xOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzRQT0lOVDA6CisgICAgICAgICAgICBzLT51cG1peF9zdGVyZW8gPSB1cG1peF80XzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DSF9MQVlPVVRfNFBPSU5UMToKKyAgICAgICAgICAgIHMtPnVwbWl4X3N0ZXJlbyA9IHVwbWl4XzRfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQwX0JBQ0s6CisgICAgICAgICAgICBzLT51cG1peF9zdGVyZW8gPSB1cG1peF81XzBfYmFjazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0s6CisgICAgICAgICAgICBzLT51cG1peF9zdGVyZW8gPSB1cG1peF81XzFfYmFjazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF83UE9JTlQwOgorICAgICAgICAgICAgcy0+dXBtaXhfc3RlcmVvID0gdXBtaXhfN18wOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzdQT0lOVDE6CisgICAgICAgICAgICBzLT51cG1peF9zdGVyZW8gPSB1cG1peF83XzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF8yUE9JTlQxOgorICAgICAgICBzLT5maWx0ZXIgPSBmaWx0ZXJfMl8xOworICAgICAgICBzd2l0Y2ggKHMtPm91dF9jaGFubmVsX2xheW91dCkgeworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0s6CisgICAgICAgICAgICBzLT51cG1peF8yXzEgPSB1cG1peF81XzFfYmFja18yXzE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NIX0xBWU9VVF9TVVJST1VORDoKKyAgICAgICAgcy0+ZmlsdGVyID0gZmlsdGVyX3N1cnJvdW5kOworICAgICAgICBzd2l0Y2ggKHMtPm91dF9jaGFubmVsX2xheW91dCkgeworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF8zUE9JTlQxOgorICAgICAgICAgICAgcy0+dXBtaXhfM18wID0gdXBtaXhfM18xX3N1cnJvdW5kOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSzoKKyAgICAgICAgICAgIHMtPnVwbWl4XzNfMCA9IHVwbWl4XzVfMV9iYWNrX3N1cnJvdW5kOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMDoKKyAgICAgICAgcy0+ZmlsdGVyID0gZmlsdGVyXzVfMF9zaWRlOworICAgICAgICBzd2l0Y2ggKHMtPm91dF9jaGFubmVsX2xheW91dCkgeworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF83UE9JTlQxOgorICAgICAgICAgICAgcy0+dXBtaXhfNV8wID0gdXBtaXhfN18xXzVfMF9zaWRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DSF9MQVlPVVRfNVBPSU5UMToKKyAgICAgICAgcy0+ZmlsdGVyID0gZmlsdGVyXzVfMV9zaWRlOworICAgICAgICBzd2l0Y2ggKHMtPm91dF9jaGFubmVsX2xheW91dCkgeworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF83UE9JTlQxOgorICAgICAgICAgICAgcy0+dXBtaXhfNV8xID0gdXBtaXhfN18xXzVfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ0hfTEFZT1VUXzVQT0lOVDFfQkFDSzoKKyAgICAgICAgcy0+ZmlsdGVyID0gZmlsdGVyXzVfMV9iYWNrOworICAgICAgICBzd2l0Y2ggKHMtPm91dF9jaGFubmVsX2xheW91dCkgeworICAgICAgICBjYXNlIEFWX0NIX0xBWU9VVF83UE9JTlQxOgorICAgICAgICAgICAgcy0+dXBtaXhfNV8xID0gdXBtaXhfN18xXzVfMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CitmYWlsOgorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCB1cG1peDogJyVzJyAtPiAnJXMnLlxuIiwKKyAgICAgICAgICAgICAgIHMtPmluX2NoYW5uZWxfbGF5b3V0X3N0ciwgcy0+b3V0X2NoYW5uZWxfbGF5b3V0X3N0cik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcy0+YnVmX3NpemUgPSA0MDk2OworICAgIHMtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgcy0+d2luZG93X2Z1bmNfbHV0ID0gYXZfY2FsbG9jKHMtPmJ1Zl9zaXplLCBzaXplb2YoKnMtPndpbmRvd19mdW5jX2x1dCkpOworICAgIGlmICghcy0+d2luZG93X2Z1bmNfbHV0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPmJ1Zl9zaXplOyBpKyspCisgICAgICAgIHMtPndpbmRvd19mdW5jX2x1dFtpXSA9IHNxcnRmKDAuNSAqICgxIC0gY29zZigyICogTV9QSSAqIGkgLyBzLT5idWZfc2l6ZSkpIC8gcy0+YnVmX3NpemUpOworICAgIG92ZXJsYXAgPSAuNTsKKyAgICBzLT5ob3Bfc2l6ZSA9IHMtPmJ1Zl9zaXplICogKDEuIC0gb3ZlcmxhcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmZnRfY2hhbm5lbChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgY2gsIGludCBuYl9qb2JzKQoreworICAgIEF1ZGlvU3Vycm91bmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGZsb2F0IGxldmVsX2luID0gcy0+aW5wdXRfbGV2ZWxzW2NoXTsKKyAgICBmbG9hdCAqZHN0OworICAgIGludCBuOworCisgICAgbWVtc2V0KHMtPmlucHV0LT5leHRlbmRlZF9kYXRhW2NoXSArIHMtPmJ1Zl9zaXplICogc2l6ZW9mKGZsb2F0KSwgMCwgcy0+YnVmX3NpemUgKiBzaXplb2YoZmxvYXQpKTsKKworICAgIGRzdCA9IChmbG9hdCAqKXMtPmlucHV0LT5leHRlbmRlZF9kYXRhW2NoXTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+YnVmX3NpemU7IG4rKykgeworICAgICAgICBkc3Rbbl0gKj0gcy0+d2luZG93X2Z1bmNfbHV0W25dICogbGV2ZWxfaW47CisgICAgfQorCisgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnRbY2hdLCAoZmxvYXQgKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YVtjaF0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWZmdF9jaGFubmVsKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBjaCwgaW50IG5iX2pvYnMpCit7CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgZmxvYXQgbGV2ZWxfb3V0ID0gcy0+b3V0cHV0X2xldmVsc1tjaF07CisgICAgQVZGcmFtZSAqb3V0ID0gYXJnOworICAgIGZsb2F0ICpkc3QsICpwdHI7CisgICAgaW50IG47CisKKyAgICBhdl9yZGZ0X2NhbGMocy0+aXJkZnRbY2hdLCAoZmxvYXQgKilzLT5vdXRwdXQtPmV4dGVuZGVkX2RhdGFbY2hdKTsKKworICAgIGRzdCA9IChmbG9hdCAqKXMtPm91dHB1dC0+ZXh0ZW5kZWRfZGF0YVtjaF07CisgICAgcHRyID0gKGZsb2F0ICopcy0+b3ZlcmxhcF9idWZmZXItPmV4dGVuZGVkX2RhdGFbY2hdOworCisgICAgbWVtbW92ZShzLT5vdmVybGFwX2J1ZmZlci0+ZXh0ZW5kZWRfZGF0YVtjaF0sCisgICAgICAgICAgICBzLT5vdmVybGFwX2J1ZmZlci0+ZXh0ZW5kZWRfZGF0YVtjaF0gKyBzLT5ob3Bfc2l6ZSAqIHNpemVvZihmbG9hdCksCisgICAgICAgICAgICBzLT5idWZfc2l6ZSAqIHNpemVvZihmbG9hdCkpOworICAgIG1lbXNldChzLT5vdmVybGFwX2J1ZmZlci0+ZXh0ZW5kZWRfZGF0YVtjaF0gKyBzLT5idWZfc2l6ZSAqIHNpemVvZihmbG9hdCksCisgICAgICAgICAgIDAsIHMtPmhvcF9zaXplICogc2l6ZW9mKGZsb2F0KSk7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+YnVmX3NpemU7IG4rKykgeworICAgICAgICBwdHJbbl0gKz0gZHN0W25dICogcy0+d2luZG93X2Z1bmNfbHV0W25dICogbGV2ZWxfb3V0OworICAgIH0KKworICAgIHB0ciA9IChmbG9hdCAqKXMtPm92ZXJsYXBfYnVmZmVyLT5leHRlbmRlZF9kYXRhW2NoXTsKKyAgICBkc3QgPSAoZmxvYXQgKilvdXQtPmV4dGVuZGVkX2RhdGFbY2hdOworICAgIG1lbWNweShkc3QsIHB0ciwgcy0+aG9wX3NpemUgKiBzaXplb2YoZmxvYXQpKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgQXVkaW9TdXJyb3VuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGF2X2F1ZGlvX2ZpZm9fd3JpdGUocy0+ZmlmbywgKHZvaWQgKiopaW4tPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+bmJfc2FtcGxlcyk7CisgICAgaWYgKHJldCA+PSAwICYmIHMtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgcy0+cHRzID0gaW4tPnB0czsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHdoaWxlIChhdl9hdWRpb19maWZvX3NpemUocy0+ZmlmbykgPj0gcy0+YnVmX3NpemUpIHsKKyAgICAgICAgQVZGcmFtZSAqb3V0OworCisgICAgICAgIHJldCA9IGF2X2F1ZGlvX2ZpZm9fcGVlayhzLT5maWZvLCAodm9pZCAqKilzLT5pbnB1dC0+ZXh0ZW5kZWRfZGF0YSwgcy0+YnVmX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZmdF9jaGFubmVsLCBOVUxMLCBOVUxMLCBpbmxpbmstPmNoYW5uZWxzKTsKKworICAgICAgICBzLT5maWx0ZXIoY3R4KTsKKworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIHMtPmhvcF9zaXplKTsKKyAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBpZmZ0X2NoYW5uZWwsIG91dCwgTlVMTCwgb3V0bGluay0+Y2hhbm5lbHMpOworCisgICAgICAgIG91dC0+cHRzID0gcy0+cHRzOworICAgICAgICBpZiAocy0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgcy0+cHRzICs9IGF2X3Jlc2NhbGVfcShvdXQtPm5iX3NhbXBsZXMsIChBVlJhdGlvbmFsKXsxLCBvdXRsaW5rLT5zYW1wbGVfcmF0ZX0sIG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgICAgIGF2X2F1ZGlvX2ZpZm9fZHJhaW4ocy0+Zmlmbywgcy0+aG9wX3NpemUpOworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEF1ZGlvU3Vycm91bmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQgPSAwOworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvKSA+IDAgJiYgYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm8pIDwgcy0+YnVmX3NpemUpIHsKKyAgICAgICAgQVZGcmFtZSAqaW47CisKKyAgICAgICAgaW4gPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIHMtPmJ1Zl9zaXplIC0gYXZfYXVkaW9fZmlmb19zaXplKHMtPmZpZm8pKTsKKyAgICAgICAgaWYgKCFpbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldCA9IGZpbHRlcl9mcmFtZShjdHgtPmlucHV0c1swXSwgaW4pOworICAgICAgICBhdl9hdWRpb19maWZvX2RyYWluKHMtPmZpZm8sIHMtPmJ1Zl9zaXplKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdWRpb1N1cnJvdW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgY2g7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5pbnB1dCk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+b3V0cHV0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5vdmVybGFwX2J1ZmZlcik7CisKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBzLT5uYl9pbl9jaGFubmVsczsgY2grKykgeworICAgICAgICBhdl9yZGZ0X2VuZChzLT5yZGZ0W2NoXSk7CisgICAgfQorICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX291dF9jaGFubmVsczsgY2grKykgeworICAgICAgICBhdl9yZGZ0X2VuZChzLT5pcmRmdFtjaF0pOworICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+aW5wdXRfbGV2ZWxzKTsKKyAgICBhdl9mcmVlcCgmcy0+b3V0cHV0X2xldmVscyk7CisgICAgYXZfZnJlZXAoJnMtPnJkZnQpOworICAgIGF2X2ZyZWVwKCZzLT5pcmRmdCk7CisgICAgYXZfYXVkaW9fZmlmb19mcmVlKHMtPmZpZm8pOworICAgIGF2X2ZyZWVwKCZzLT53aW5kb3dfZnVuY19sdXQpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBdWRpb1N1cnJvdW5kQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzdXJyb3VuZF9vcHRpb25zW10gPSB7CisgICAgeyAiY2hsX291dCIsICAgInNldCBvdXRwdXQgY2hhbm5lbCBsYXlvdXQiLCBPRkZTRVQob3V0X2NoYW5uZWxfbGF5b3V0X3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjUuMSJ9LCAwLCAgIDAsIEZMQUdTIH0sCisgICAgeyAiY2hsX2luIiwgICAgInNldCBpbnB1dCBjaGFubmVsIGxheW91dCIsICBPRkZTRVQoaW5fY2hhbm5lbF9sYXlvdXRfc3RyKSwgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9InN0ZXJlbyJ9LDAsIDAsIEZMQUdTIH0sCisgICAgeyAibGV2ZWxfaW4iLCAgInNldCBpbnB1dCBsZXZlbCIsICAgICAgICAgICBPRkZTRVQobGV2ZWxfaW4pLCAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmw9MX0sICAgICAwLCAgMTAsIEZMQUdTIH0sCisgICAgeyAibGV2ZWxfb3V0IiwgInNldCBvdXRwdXQgbGV2ZWwiLCAgICAgICAgICBPRkZTRVQobGV2ZWxfb3V0KSwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmw9MX0sICAgICAwLCAgMTAsIEZMQUdTIH0sCisgICAgeyAibGZlIiwgICAgICAgIm91dHB1dCBMRkUiLCAgICAgICAgICAgICAgICBPRkZTRVQob3V0cHV0X2xmZSksICAgICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQ9MX0sICAgICAwLCAgIDEsIEZMQUdTIH0sCisgICAgeyAibGZlX2xvdyIsICAgIkxGRSBsb3cgY3V0IG9mZiIsICAgICAgICAgICBPRkZTRVQobG93Y3V0ZiksICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQ9MTI4fSwgICAwLCAyNTYsIEZMQUdTIH0sCisgICAgeyAibGZlX2hpZ2giLCAgIkxGRSBoaWdoIGN1dCBvZmYiLCAgICAgICAgICBPRkZTRVQoaGlnaGN1dGYpLCAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQ9MjU2fSwgICAwLCA1MTIsIEZMQUdTIH0sCisgICAgeyAiZmNfaW4iLCAgICAgInNldCBmcm9udCBjZW50ZXIgY2hhbm5lbCBpbnB1dCBsZXZlbCIsICBPRkZTRVQoZmNfaW4pLCAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmw9MX0sICAgICAwLCAgMTAsIEZMQUdTIH0sCisgICAgeyAiZmNfb3V0IiwgICAgInNldCBmcm9udCBjZW50ZXIgY2hhbm5lbCBvdXRwdXQgbGV2ZWwiLCBPRkZTRVQoZmNfb3V0KSwgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmw9MX0sICAgICAwLCAgMTAsIEZMQUdTIH0sCisgICAgeyAibGZlX2luIiwgICAgInNldCBsZmUgY2hhbm5lbCBpbnB1dCBsZXZlbCIsICBPRkZTRVQobGZlX2luKSwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmw9MX0sICAgICAwLCAgMTAsIEZMQUdTIH0sCisgICAgeyAibGZlX291dCIsICAgInNldCBsZmUgY2hhbm5lbCBvdXRwdXQgbGV2ZWwiLCBPRkZTRVQobGZlX291dCksICAgICAgICAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgey5kYmw9MX0sICAgICAwLCAgMTAsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzdXJyb3VuZCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYWZfc3Vycm91bmQgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInN1cnJvdW5kIiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgYXVkaW8gc3Vycm91bmQgdXBtaXggZmlsdGVyLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzICA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKEF1ZGlvU3Vycm91bmRDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmc3Vycm91bmRfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSB1bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICA9IG91dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FmX3RyZW1vbG8uYyBiL2xpYmF2ZmlsdGVyL2FmX3RyZW1vbG8uYwppbmRleCA1NzJlOWUzLi44Y2JjNzk4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl90cmVtb2xvLmMKKysrIGIvbGliYXZmaWx0ZXIvYWZfdHJlbW9sby5jCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgewogICAgICAgICBvdXQgPSBpbjsKICAgICB9IGVsc2UgewotICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgaW4tPm5iX3NhbXBsZXMpOworICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIGluLT5uYl9zYW1wbGVzKTsKICAgICAgICAgaWYgKCFvdXQpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl92aWJyYXRvLmMgYi9saWJhdmZpbHRlci9hZl92aWJyYXRvLmMKaW5kZXggYzc2OTFmMi4uMjJiYmFiNiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWZfdmlicmF0by5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX3ZpYnJhdG8uYwpAQCAtNjMsNyArNjMsNyBAQAogICAgIGlmIChhdl9mcmFtZV9pc193cml0YWJsZShpbikpIHsKICAgICAgICAgb3V0ID0gaW47CiAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihpbmxpbmssIGluLT5uYl9zYW1wbGVzKTsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBpbi0+bmJfc2FtcGxlcyk7CiAgICAgICAgIGlmICghb3V0KSB7CiAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWZfdm9sdW1lLmMgYi9saWJhdmZpbHRlci9hZl92b2x1bWUuYwppbmRleCAzOTEzZTdiLi5iMTA2ZWQ4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hZl92b2x1bWUuYworKysgYi9saWJhdmZpbHRlci9hZl92b2x1bWUuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZm1hdGguaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZmxvYXRfZHNwLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKQEAgLTM5Miw5ICszOTMsOSBAQAogICAgIH0KICAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX1BUU10gPSBUUzJEKGJ1Zi0+cHRzKTsKICAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX1QgIF0gPSBUUzJUKGJ1Zi0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSk7Ci0gICAgdm9sLT52YXJfdmFsdWVzW1ZBUl9OICBdID0gaW5saW5rLT5mcmFtZV9jb3VudDsKKyAgICB2b2wtPnZhcl92YWx1ZXNbVkFSX04gIF0gPSBpbmxpbmstPmZyYW1lX2NvdW50X291dDsKIAotICAgIHBvcyA9IGF2X2ZyYW1lX2dldF9wa3RfcG9zKGJ1Zik7CisgICAgcG9zID0gYnVmLT5wa3RfcG9zOwogICAgIHZvbC0+dmFyX3ZhbHVlc1tWQVJfUE9TXSA9IHBvcyA9PSAtMSA/IE5BTiA6IHBvczsKICAgICBpZiAodm9sLT5ldmFsX21vZGUgPT0gRVZBTF9NT0RFX0ZSQU1FKQogICAgICAgICBzZXRfdm9sdW1lKGN0eCk7CkBAIC00MDksOSArNDEwLDExIEBACiAgICAgICAgICAgICAmJiAodm9sLT5wcmVjaXNpb24gIT0gUFJFQ0lTSU9OX0ZJWEVEIHx8IHZvbC0+dm9sdW1lX2kgPiAwKSkgewogICAgICAgICBvdXRfYnVmID0gYnVmOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dF9idWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGlubGluaywgbmJfc2FtcGxlcyk7Ci0gICAgICAgIGlmICghb3V0X2J1ZikKKyAgICAgICAgb3V0X2J1ZiA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgbmJfc2FtcGxlcyk7CisgICAgICAgIGlmICghb3V0X2J1ZikgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KICAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXRfYnVmLCBidWYpOwogICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0X2J1Zik7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hZl92b2x1bWVkZXRlY3QuYyBiL2xpYmF2ZmlsdGVyL2FmX3ZvbHVtZWRldGVjdC5jCmluZGV4IDQ4MTViY2MuLjQzYzFlYmYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2FmX3ZvbHVtZWRldGVjdC5jCisrKyBiL2xpYmF2ZmlsdGVyL2FmX3ZvbHVtZWRldGVjdC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBWb2xEZXRlY3RDb250ZXh0IHsKICAgICAvKioKICAgICAgKiBOdW1iZXIgb2Ygc2FtcGxlcyBhdCBlYWNoIFBDTSB2YWx1ZS4KICAgICAgKiBoaXN0b2dyYW1bMHg4MDAwICsgaV0gaXMgdGhlIG51bWJlciBvZiBzYW1wbGVzIGF0IHZhbHVlIGkuCkBAIC00MSw5ICs0MSwxOSBAQAogICAgICAgICBBVl9TQU1QTEVfRk1UX05PTkUKICAgICB9OwogICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKyAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOworICAgIGludCByZXQ7CiAKICAgICBpZiAoIShmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cykpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2NvdW50cygpOworICAgIGlmICghbGF5b3V0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2NoYW5uZWxfbGF5b3V0cyhjdHgsIGxheW91dHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCiAgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOwogfQogCkBAIC01MSw5ICs2MSw4IEBACiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKICAgICBWb2xEZXRlY3RDb250ZXh0ICp2ZCA9IGN0eC0+cHJpdjsKLSAgICBpbnQ2NF90IGxheW91dCAgPSBzYW1wbGVzLT5jaGFubmVsX2xheW91dDsKICAgICBpbnQgbmJfc2FtcGxlcyAgPSBzYW1wbGVzLT5uYl9zYW1wbGVzOwotICAgIGludCBuYl9jaGFubmVscyA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhsYXlvdXQpOworICAgIGludCBuYl9jaGFubmVscyA9IHNhbXBsZXMtPmNoYW5uZWxzOwogICAgIGludCBuYl9wbGFuZXMgICA9IG5iX2NoYW5uZWxzOwogICAgIGludCBwbGFuZSwgaTsKICAgICBpbnQxNl90ICpwY207CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMgYi9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMKaW5kZXggZmE3ZDMwNC4uNjhiMjk5MiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jCisrKyBiL2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYwpAQCAtMTksMzE5ICsxOSw0NjEgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAib3BlbmNsX2FsbGtlcm5lbHMuaCIKKworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FiZW5jaDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hY29tcHJlc3NvcjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hY29udHJhc3Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYWNvcHk7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYWNyb3NzZmFkZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hY3J1c2hlcjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hZGVsYXk7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYWVjaG87CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYWVtcGhhc2lzOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FldmFsOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FmYWRlOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FmZnRmaWx0OworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FmaXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYWZvcm1hdDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hZ2F0ZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9haWlyOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FpbnRlcmxlYXZlOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FsaW1pdGVyOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FsbHBhc3M7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYWxvb3A7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYW1lcmdlOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FtZXRhZGF0YTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hbWl4OworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FuZXF1YWxpemVyOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FudWxsOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FwYWQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYXBlcm1zOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FwaGFzZXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYXB1bHNhdG9yOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FyZWFsdGltZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hcmVzYW1wbGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYXJldmVyc2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYXNlbGVjdDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hc2VuZGNtZDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hc2V0bnNhbXBsZXM7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYXNldHB0czsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hc2V0cmF0ZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hc2V0dGI7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYXNob3dpbmZvOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FzaWRlZGF0YTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hc3BsaXQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYXN0YXRzOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2FzdHJlYW1zZWxlY3Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYXRlbXBvOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2F0cmltOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2F6bXE7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYmFuZHBhc3M7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfYmFuZHJlamVjdDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9iYXNzOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2JpcXVhZDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9iczJiOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2NoYW5uZWxtYXA7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfY2hhbm5lbHNwbGl0OworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2Nob3J1czsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9jb21wYW5kOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2NvbXBlbnNhdGlvbmRlbGF5OworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2Nyb3NzZmVlZDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9jcnlzdGFsaXplcjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9kY3NoaWZ0OworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2RybWV0ZXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfZHluYXVkbm9ybTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9lYXJ3YXg7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfZWJ1cjEyODsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9lcXVhbGl6ZXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfZXh0cmFzdGVyZW87CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfZmlyZXF1YWxpemVyOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2ZsYW5nZXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfaGFhczsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9oZGNkOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2hlYWRwaG9uZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9oaWdocGFzczsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9qb2luOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2xhZHNwYTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9sb3Vkbm9ybTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9sb3dwYXNzOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX2x2MjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9tY29tcGFuZDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9wYW47CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfcmVwbGF5Z2FpbjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9yZXNhbXBsZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9ydWJiZXJiYW5kOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX3NpZGVjaGFpbmNvbXByZXNzOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX3NpZGVjaGFpbmdhdGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfc2lsZW5jZWRldGVjdDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9zaWxlbmNlcmVtb3ZlOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX3NvZmFsaXplcjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9zdGVyZW90b29sczsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9zdGVyZW93aWRlbjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9zdXBlcmVxdWFsaXplcjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9zdXJyb3VuZDsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl90cmVibGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfYWZfdHJlbW9sbzsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl92aWJyYXRvOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FmX3ZvbHVtZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl92b2x1bWVkZXRlY3Q7CisKK2V4dGVybiBBVkZpbHRlciBmZl9hc3JjX2FldmFsc3JjOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FzcmNfYW5vaXNlc3JjOworZXh0ZXJuIEFWRmlsdGVyIGZmX2FzcmNfYW51bGxzcmM7CitleHRlcm4gQVZGaWx0ZXIgZmZfYXNyY19mbGl0ZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hc3JjX2hpbGJlcnQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfYXNyY19zaW5lOworCitleHRlcm4gQVZGaWx0ZXIgZmZfYXNpbmtfYW51bGxzaW5rOworCitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfYWxwaGFleHRyYWN0OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2FscGhhbWVyZ2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfYXNzOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2F0YWRlbm9pc2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfYXZnYmx1cjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9hdmdibHVyX29wZW5jbDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9iYm94OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2JlbmNoOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2JpdHBsYW5lbm9pc2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfYmxhY2tkZXRlY3Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfYmxhY2tmcmFtZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9ibGVuZDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9ib3hibHVyOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2J3ZGlmOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2Nocm9tYWtleTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9jaWVzY29wZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9jb2RlY3ZpZXc7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfY29sb3JiYWxhbmNlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2NvbG9yY2hhbm5lbG1peGVyOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2NvbG9ya2V5OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2NvbG9ybGV2ZWxzOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2NvbG9ybWF0cml4OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2NvbG9yc3BhY2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfY29udm9sdXRpb247CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfY29udm9sdXRpb25fb3BlbmNsOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2NvbnZvbHZlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2NvcHk7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfY29yZWltYWdlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2NvdmVyX3JlY3Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfY3JvcDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9jcm9wZGV0ZWN0OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2N1cnZlczsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9kYXRhc2NvcGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZGN0ZG5vaXo7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZGViYW5kOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RlY2ltYXRlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RlY29udm9sdmU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZGVmbGF0ZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9kZWZsaWNrZXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZGVpbnRlcmxhY2VfcXN2OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RlaW50ZXJsYWNlX3ZhYXBpOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RlanVkZGVyOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RlbG9nbzsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9kZW5vaXNlX3ZhYXBpOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2Rlc2hha2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZGVzcGlsbDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9kZXRlbGVjaW5lOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RpbGF0aW9uOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2Rpc3BsYWNlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RvdWJsZXdlYXZlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RyYXdib3g7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZHJhd2dyYXBoOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RyYXdncmlkOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2RyYXd0ZXh0OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2VkZ2VkZXRlY3Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZWxiZzsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9lbnRyb3B5OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2VxOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2Vyb3Npb247CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZXh0cmFjdHBsYW5lczsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9mYWRlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2ZmdGZpbHQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZmllbGQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZmllbGRoaW50OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2ZpZWxkbWF0Y2g7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZmllbGRvcmRlcjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9maWxsYm9yZGVyczsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9maW5kX3JlY3Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZmxvb2RmaWxsOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2Zvcm1hdDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9mcHM7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZnJhbWVwYWNrOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2ZyYW1lcmF0ZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9mcmFtZXN0ZXA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZnJlaTByOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2ZzcHA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZ2JsdXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfZ2VxOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2dyYWRmdW47CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfaGFsZGNsdXQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfaGZsaXA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfaGlzdGVxOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2hpc3RvZ3JhbTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9ocWRuM2Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfaHF4OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2hzdGFjazsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9odWU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfaHdkb3dubG9hZDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9od21hcDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9od3VwbG9hZDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9od3VwbG9hZF9jdWRhOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2h5c3RlcmVzaXM7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfaWRldDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9pbDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9pbmZsYXRlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2ludGVybGFjZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9pbnRlcmxlYXZlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2tlcm5kZWludDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9sZW5zY29ycmVjdGlvbjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9saWJ2bWFmOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2xpbWl0ZXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbG9vcDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9sdW1ha2V5OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2x1dDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9sdXQyOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2x1dDNkOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX2x1dHJnYjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9sdXR5dXY7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbWFza2VkY2xhbXA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbWFza2VkbWVyZ2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbWNkZWludDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9tZXJnZXBsYW5lczsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9tZXN0aW1hdGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbWV0YWRhdGE7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbWlkZXF1YWxpemVyOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX21pbnRlcnBvbGF0ZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9taXg7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbXBkZWNpbWF0ZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9uZWdhdGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbmxtZWFuczsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9ubmVkaTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9ub2Zvcm1hdDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9ub2lzZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9ub3JtYWxpemU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfbnVsbDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9vY3I7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfb2N2OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX29zY2lsbG9zY29wZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9vdmVybGF5OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX292ZXJsYXlfb3BlbmNsOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX292ZXJsYXlfcXN2OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX293ZGVub2lzZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9wYWQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcGFsZXR0ZWdlbjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9wYWxldHRldXNlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3Blcm1zOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3BlcnNwZWN0aXZlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3BoYXNlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3BpeGRlc2N0ZXN0OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3BpeHNjb3BlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3BwOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3BwNzsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9wcmVtdWx0aXBseTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9wcmV3aXR0OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3Byb2NhbXBfdmFhcGk7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcHJvZ3JhbV9vcGVuY2w7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcHNldWRvY29sb3I7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcHNucjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9wdWxsdXA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcXA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcmFuZG9tOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3JlYWRlaWE2MDg7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcmVhZHZpdGM7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcmVhbHRpbWU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcmVtYXA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcmVtb3ZlZ3JhaW47CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcmVtb3ZlbG9nbzsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9yZXBlYXRmaWVsZHM7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfcmV2ZXJzZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9yb2JlcnRzOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3JvdGF0ZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zYWI7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2NhbGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2NhbGVfY3VkYTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zY2FsZV9ucHA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2NhbGVfcXN2OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3NjYWxlX3ZhYXBpOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3NjYWxlMnJlZjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zZWxlY3Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2VsZWN0aXZlY29sb3I7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2VuZGNtZDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zZXBhcmF0ZWZpZWxkczsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zZXRkYXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2V0ZmllbGQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2V0cHRzOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3NldHJhbmdlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3NldHNhcjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zZXR0YjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zaGFycG5lc3NfdmFhcGk7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2hvd2luZm87CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2hvd3BhbGV0dGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc2h1ZmZsZWZyYW1lczsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zaHVmZmxlcGxhbmVzOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3NpZGVkYXRhOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3NpZ25hbHN0YXRzOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3NpZ25hdHVyZTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zbWFydGJsdXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc29iZWw7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc3BsaXQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc3BwOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3NzaW07CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc3RlcmVvM2Q7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfc3RyZWFtc2VsZWN0OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3N1YnRpdGxlczsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9zdXBlcjJ4c2FpOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3N3YXByZWN0OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3N3YXB1djsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl90YmxlbmQ7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdGVsZWNpbmU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdGhyZXNob2xkOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3RodW1ibmFpbDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl90aHVtYm5haWxfY3VkYTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl90aWxlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3RpbnRlcmxhY2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdGx1dDI7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdG9uZW1hcDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl90cmFuc3Bvc2U7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdHJpbTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl91bnByZW11bHRpcGx5OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3Vuc2hhcnA7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdW5zaGFycF9vcGVuY2w7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdXNwcDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl92YWd1ZWRlbm9pc2VyOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3ZlY3RvcnNjb3BlOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3ZmbGlwOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3ZmcmRldDsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl92aWRzdGFiZGV0ZWN0OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3ZpZHN0YWJ0cmFuc2Zvcm07CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdmlnbmV0dGU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfdm1hZm1vdGlvbjsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl92cHBfcXN2OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3ZzdGFjazsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl93M2ZkaWY7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfd2F2ZWZvcm07CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfd2VhdmU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdmZfeGJyOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3lhZGlmOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3ptcTsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl96b29tcGFuOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZmX3pzY2FsZTsKKworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZzcmNfYWxscmdiOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZzcmNfYWxseXV2OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZzcmNfY2VsbGF1dG87CitleHRlcm4gQVZGaWx0ZXIgZmZfdnNyY19jb2xvcjsKK2V4dGVybiBBVkZpbHRlciBmZl92c3JjX2NvcmVpbWFnZXNyYzsKK2V4dGVybiBBVkZpbHRlciBmZl92c3JjX2ZyZWkwcl9zcmM7CitleHRlcm4gQVZGaWx0ZXIgZmZfdnNyY19oYWxkY2x1dHNyYzsKK2V4dGVybiBBVkZpbHRlciBmZl92c3JjX2xpZmU7CitleHRlcm4gQVZGaWx0ZXIgZmZfdnNyY19tYW5kZWxicm90OworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZzcmNfbXB0ZXN0c3JjOworZXh0ZXJuIEFWRmlsdGVyIGZmX3ZzcmNfbnVsbHNyYzsKK2V4dGVybiBBVkZpbHRlciBmZl92c3JjX29wZW5jbHNyYzsKK2V4dGVybiBBVkZpbHRlciBmZl92c3JjX3JnYnRlc3RzcmM7CitleHRlcm4gQVZGaWx0ZXIgZmZfdnNyY19zbXB0ZWJhcnM7CitleHRlcm4gQVZGaWx0ZXIgZmZfdnNyY19zbXB0ZWhkYmFyczsKK2V4dGVybiBBVkZpbHRlciBmZl92c3JjX3Rlc3RzcmM7CitleHRlcm4gQVZGaWx0ZXIgZmZfdnNyY190ZXN0c3JjMjsKK2V4dGVybiBBVkZpbHRlciBmZl92c3JjX3l1dnRlc3RzcmM7CisKK2V4dGVybiBBVkZpbHRlciBmZl92c2lua19udWxsc2luazsKKworLyogbXVsdGltZWRpYSBmaWx0ZXJzICovCitleHRlcm4gQVZGaWx0ZXIgZmZfYXZmX2FiaXRzY29wZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hdmZfYWRyYXdncmFwaDsKK2V4dGVybiBBVkZpbHRlciBmZl9hdmZfYWhpc3RvZ3JhbTsKK2V4dGVybiBBVkZpbHRlciBmZl9hdmZfYXBoYXNlbWV0ZXI7CitleHRlcm4gQVZGaWx0ZXIgZmZfYXZmX2F2ZWN0b3JzY29wZTsKK2V4dGVybiBBVkZpbHRlciBmZl9hdmZfY29uY2F0OworZXh0ZXJuIEFWRmlsdGVyIGZmX2F2Zl9zaG93Y3F0OworZXh0ZXJuIEFWRmlsdGVyIGZmX2F2Zl9zaG93ZnJlcXM7CitleHRlcm4gQVZGaWx0ZXIgZmZfYXZmX3Nob3dzcGVjdHJ1bTsKK2V4dGVybiBBVkZpbHRlciBmZl9hdmZfc2hvd3NwZWN0cnVtcGljOworZXh0ZXJuIEFWRmlsdGVyIGZmX2F2Zl9zaG93dm9sdW1lOworZXh0ZXJuIEFWRmlsdGVyIGZmX2F2Zl9zaG93d2F2ZXM7CitleHRlcm4gQVZGaWx0ZXIgZmZfYXZmX3Nob3d3YXZlc3BpYzsKK2V4dGVybiBBVkZpbHRlciBmZl92YWZfc3BlY3RydW1zeW50aDsKKworLyogbXVsdGltZWRpYSBzb3VyY2VzICovCitleHRlcm4gQVZGaWx0ZXIgZmZfYXZzcmNfYW1vdmllOworZXh0ZXJuIEFWRmlsdGVyIGZmX2F2c3JjX21vdmllOworCisvKiB0aG9zZSBmaWx0ZXJzIGFyZSBwYXJ0IG9mIHB1YmxpYyBvciBpbnRlcm5hbCBBUEksCisgKiB0aGV5IGFyZSBmb3JtYXR0ZWQgdG8gbm90IGJlIGZvdW5kIGJ5IHRoZSBncmVwCisgKiBhcyB0aGV5IGFyZSBtYW51YWxseSBhZGRlZCBhZ2FpbiAoZHVlIHRvIHRoZWlyICduYW1lcycKKyAqIGJlaW5nIHRoZSBzYW1lIHdoaWxlIGhhdmluZyBkaWZmZXJlbnQgJ3R5cGVzJykuICovCitleHRlcm4gIEFWRmlsdGVyIGZmX2FzcmNfYWJ1ZmZlcjsKK2V4dGVybiAgQVZGaWx0ZXIgZmZfdnNyY19idWZmZXI7CitleHRlcm4gIEFWRmlsdGVyIGZmX2FzaW5rX2FidWZmZXI7CitleHRlcm4gIEFWRmlsdGVyIGZmX3ZzaW5rX2J1ZmZlcjsKK2V4dGVybiBBVkZpbHRlciBmZl9hZl9hZmlmbzsKK2V4dGVybiBBVkZpbHRlciBmZl92Zl9maWZvOworCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvZmlsdGVyX2xpc3QuYyIKIAogCi0jZGVmaW5lIFJFR0lTVEVSX0ZJTFRFUihYLCB4LCB5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGV4dGVybiBBVkZpbHRlciBmZl8jI3kjI18jI3g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChDT05GSUdfIyNYIyNfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBhdmZpbHRlcl9yZWdpc3RlcigmZmZfIyN5IyNfIyN4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjb25zdCBBVkZpbHRlciAqYXZfZmlsdGVyX2l0ZXJhdGUodm9pZCAqKm9wYXF1ZSkKK3sKKyAgICB1aW50cHRyX3QgaSA9ICh1aW50cHRyX3QpKm9wYXF1ZTsKKyAgICBjb25zdCBBVkZpbHRlciAqZiA9IGZpbHRlcl9saXN0W2ldOworCisgICAgaWYgKGYpCisgICAgICAgICpvcGFxdWUgPSAodm9pZCopKGkgKyAxKTsKKworICAgIHJldHVybiBmOworfQorCitjb25zdCBBVkZpbHRlciAqYXZmaWx0ZXJfZ2V0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjb25zdCBBVkZpbHRlciAqZiA9IE5VTEw7CisgICAgdm9pZCAqb3BhcXVlID0gMDsKKworICAgIGlmICghbmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICB3aGlsZSAoKGYgPSBhdl9maWx0ZXJfaXRlcmF0ZSgmb3BhcXVlKSkpCisgICAgICAgIGlmICghc3RyY21wKGYtPm5hbWUsIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIChBVkZpbHRlciAqKWY7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisjaWYgRkZfQVBJX05FWFQKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKK3N0YXRpYyBBVk9uY2UgYXZfZmlsdGVyX25leHRfaW5pdCA9IEFWX09OQ0VfSU5JVDsKKworc3RhdGljIHZvaWQgYXZfZmlsdGVyX2luaXRfbmV4dCh2b2lkKQoreworICAgIEFWRmlsdGVyICpwcmV2ID0gTlVMTCwgKnA7CisgICAgdm9pZCAqaSA9IDA7CisgICAgd2hpbGUgKChwID0gKEFWRmlsdGVyKilhdl9maWx0ZXJfaXRlcmF0ZSgmaSkpKSB7CisgICAgICAgIGlmIChwcmV2KQorICAgICAgICAgICAgcHJldi0+bmV4dCA9IHA7CisgICAgICAgIHByZXYgPSBwOwogICAgIH0KLQotI2RlZmluZSBSRUdJU1RFUl9GSUxURVJfVU5DT05ESVRJT05BTCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBleHRlcm4gQVZGaWx0ZXIgZmZfIyN4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBhdmZpbHRlcl9yZWdpc3RlcigmZmZfIyN4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KK30KIAogdm9pZCBhdmZpbHRlcl9yZWdpc3Rlcl9hbGwodm9pZCkKIHsKLSAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkOwotCi0gICAgaWYgKGluaXRpYWxpemVkKQotICAgICAgICByZXR1cm47Ci0gICAgaW5pdGlhbGl6ZWQgPSAxOwotCi0gICAgUkVHSVNURVJfRklMVEVSKEFDT01QUkVTU09SLCAgICBhY29tcHJlc3NvciwgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBQ1JPU1NGQURFLCAgICAgYWNyb3NzZmFkZSwgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQURFTEFZLCAgICAgICAgIGFkZWxheSwgICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFFQ0hPLCAgICAgICAgICBhZWNobywgICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBRU1QSEFTSVMsICAgICAgYWVtcGhhc2lzLCAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQUVWQUwsICAgICAgICAgIGFldmFsLCAgICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFGQURFLCAgICAgICAgICBhZmFkZSwgICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBRkZURklMVCwgICAgICAgYWZmdGZpbHQsICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQUZPUk1BVCwgICAgICAgIGFmb3JtYXQsICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFHQVRFLCAgICAgICAgICBhZ2F0ZSwgICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBSU5URVJMRUFWRSwgICAgYWludGVybGVhdmUsICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQUxJTUlURVIsICAgICAgIGFsaW1pdGVyLCAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFMTFBBU1MsICAgICAgICBhbGxwYXNzLCAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBTUVSR0UsICAgICAgICAgYW1lcmdlLCAgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQU1FVEFEQVRBLCAgICAgIGFtZXRhZGF0YSwgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFNSVgsICAgICAgICAgICBhbWl4LCAgICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBTkVRVUFMSVpFUiwgICAgYW5lcXVhbGl6ZXIsICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQU5VTEwsICAgICAgICAgIGFudWxsLCAgICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFQQUQsICAgICAgICAgICBhcGFkLCAgICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBUEVSTVMsICAgICAgICAgYXBlcm1zLCAgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVBIQVNFUiwgICAgICAgIGFwaGFzZXIsICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFQVUxTQVRPUiwgICAgICBhcHVsc2F0b3IsICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBUkVBTFRJTUUsICAgICAgYXJlYWx0aW1lLCAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVJFU0FNUExFLCAgICAgIGFyZXNhbXBsZSwgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFSRVZFUlNFLCAgICAgICBhcmV2ZXJzZSwgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBU0VMRUNULCAgICAgICAgYXNlbGVjdCwgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVNFTkRDTUQsICAgICAgIGFzZW5kY21kLCAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFTRVROU0FNUExFUywgICBhc2V0bnNhbXBsZXMsICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBU0VUUFRTLCAgICAgICAgYXNldHB0cywgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVNFVFJBVEUsICAgICAgIGFzZXRyYXRlLCAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFTRVRUQiwgICAgICAgICBhc2V0dGIsICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBU0hPV0lORk8sICAgICAgYXNob3dpbmZvLCAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVNQTElULCAgICAgICAgIGFzcGxpdCwgICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFTVEFUUywgICAgICAgICBhc3RhdHMsICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBU1RSRUFNU0VMRUNULCAgYXN0cmVhbXNlbGVjdCwgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVNZTkNUUywgICAgICAgIGFzeW5jdHMsICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFURU1QTywgICAgICAgICBhdGVtcG8sICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBVFJJTSwgICAgICAgICAgYXRyaW0sICAgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVpNUSwgICAgICAgICAgIGF6bXEsICAgICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEJBTkRQQVNTLCAgICAgICBiYW5kcGFzcywgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihCQU5EUkVKRUNULCAgICAgYmFuZHJlamVjdCwgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQkFTUywgICAgICAgICAgIGJhc3MsICAgICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEJJUVVBRCwgICAgICAgICBiaXF1YWQsICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihCUzJCLCAgICAgICAgICAgYnMyYiwgICAgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQ0hBTk5FTE1BUCwgICAgIGNoYW5uZWxtYXAsICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKENIQU5ORUxTUExJVCwgICBjaGFubmVsc3BsaXQsICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihDSE9SVVMsICAgICAgICAgY2hvcnVzLCAgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQ09NUEFORCwgICAgICAgIGNvbXBhbmQsICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKENPTVBFTlNBVElPTkRFTEFZLCBjb21wZW5zYXRpb25kZWxheSwgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihEQ1NISUZULCAgICAgICAgZGNzaGlmdCwgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRFlOQVVETk9STSwgICAgIGR5bmF1ZG5vcm0sICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEVBUldBWCwgICAgICAgICBlYXJ3YXgsICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihFQlVSMTI4LCAgICAgICAgZWJ1cjEyOCwgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRVFVQUxJWkVSLCAgICAgIGVxdWFsaXplciwgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEVYVFJBU1RFUkVPLCAgICBleHRyYXN0ZXJlbywgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihGTEFOR0VSLCAgICAgICAgZmxhbmdlciwgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoSElHSFBBU1MsICAgICAgIGhpZ2hwYXNzLCAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEpPSU4sICAgICAgICAgICBqb2luLCAgICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihMQURTUEEsICAgICAgICAgbGFkc3BhLCAgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoTE9XUEFTUywgICAgICAgIGxvd3Bhc3MsICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFBBTiwgICAgICAgICAgICBwYW4sICAgICAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihSRVBMQVlHQUlOLCAgICAgcmVwbGF5Z2FpbiwgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoUkVTQU1QTEUsICAgICAgIHJlc2FtcGxlLCAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFJVQkJFUkJBTkQsICAgICBydWJiZXJiYW5kLCAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTSURFQ0hBSU5DT01QUkVTUywgc2lkZWNoYWluY29tcHJlc3MsIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0lERUNIQUlOR0FURSwgIHNpZGVjaGFpbmdhdGUsICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNJTEVOQ0VERVRFQ1QsICBzaWxlbmNlZGV0ZWN0LCAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTSUxFTkNFUkVNT1ZFLCAgc2lsZW5jZXJlbW92ZSwgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU09GQUxJWkVSLCAgICAgIHNvZmFsaXplciwgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNURVJFT1RPT0xTLCAgICBzdGVyZW90b29scywgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTVEVSRU9XSURFTiwgICAgc3RlcmVvd2lkZW4sICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoVFJFQkxFLCAgICAgICAgIHRyZWJsZSwgICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFRSRU1PTE8sICAgICAgICB0cmVtb2xvLCAgICAgICAgYWYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihWSUJSQVRPLCAgICAgICAgdmlicmF0bywgICAgICAgIGFmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoVk9MVU1FLCAgICAgICAgIHZvbHVtZSwgICAgICAgICBhZik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFZPTFVNRURFVEVDVCwgICB2b2x1bWVkZXRlY3QsICAgYWYpOwotCi0gICAgUkVHSVNURVJfRklMVEVSKEFFVkFMU1JDLCAgICAgICBhZXZhbHNyYywgICAgICAgYXNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFOT0lTRVNSQywgICAgICBhbm9pc2VzcmMsICAgICAgYXNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFOVUxMU1JDLCAgICAgICBhbnVsbHNyYywgICAgICAgYXNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKEZMSVRFLCAgICAgICAgICBmbGl0ZSwgICAgICAgICAgYXNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNJTkUsICAgICAgICAgICBzaW5lLCAgICAgICAgICAgYXNyYyk7Ci0KLSAgICBSRUdJU1RFUl9GSUxURVIoQU5VTExTSU5LLCAgICAgIGFudWxsc2luaywgICAgICBhc2luayk7Ci0KLSAgICBSRUdJU1RFUl9GSUxURVIoQUxQSEFFWFRSQUNULCAgIGFscGhhZXh0cmFjdCwgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFMUEhBTUVSR0UsICAgICBhbHBoYW1lcmdlLCAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBVEFERU5PSVNFLCAgICAgYXRhZGVub2lzZSwgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVNTLCAgICAgICAgICAgIGFzcywgICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEJCT1gsICAgICAgICAgICBiYm94LCAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihCTEFDS0RFVEVDVCwgICAgYmxhY2tkZXRlY3QsICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQkxBQ0tGUkFNRSwgICAgIGJsYWNrZnJhbWUsICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEJMRU5ELCAgICAgICAgICBibGVuZCwgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihCT1hCTFVSLCAgICAgICAgYm94Ymx1ciwgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQ0hST01BS0VZLCAgICAgIGNocm9tYWtleSwgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKENPREVDVklFVywgICAgICBjb2RlY3ZpZXcsICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihDT0xPUkJBTEFOQ0UsICAgY29sb3JiYWxhbmNlLCAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQ09MT1JDSEFOTkVMTUlYRVIsIGNvbG9yY2hhbm5lbG1peGVyLCB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKENPTE9SS0VZLCAgICAgICBjb2xvcmtleSwgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihDT0xPUkxFVkVMUywgICAgY29sb3JsZXZlbHMsICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQ09MT1JNQVRSSVgsICAgIGNvbG9ybWF0cml4LCAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKENPTlZPTFVUSU9OLCAgICBjb252b2x1dGlvbiwgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihDT1BZLCAgICAgICAgICAgY29weSwgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQ09WRVJfUkVDVCwgICAgIGNvdmVyX3JlY3QsICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKENST1AsICAgICAgICAgICBjcm9wLCAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihDUk9QREVURUNULCAgICAgY3JvcGRldGVjdCwgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQ1VSVkVTLCAgICAgICAgIGN1cnZlcywgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKERDVEROT0laLCAgICAgICBkY3Rkbm9peiwgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihERUJBTkQsICAgICAgICAgZGViYW5kLCAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoREVDSU1BVEUsICAgICAgIGRlY2ltYXRlLCAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKERFRkxBVEUsICAgICAgICBkZWZsYXRlLCAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihERUpVRERFUiwgICAgICAgZGVqdWRkZXIsICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoREVMT0dPLCAgICAgICAgIGRlbG9nbywgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKERFU0hBS0UsICAgICAgICBkZXNoYWtlLCAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihERVRFTEVDSU5FLCAgICAgZGV0ZWxlY2luZSwgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRElMQVRJT04sICAgICAgIGRpbGF0aW9uLCAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKERJU1BMQUNFLCAgICAgICBkaXNwbGFjZSwgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihEUkFXQk9YLCAgICAgICAgZHJhd2JveCwgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRFJBV0dSQVBILCAgICAgIGRyYXdncmFwaCwgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKERSQVdHUklELCAgICAgICBkcmF3Z3JpZCwgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihEUkFXVEVYVCwgICAgICAgZHJhd3RleHQsICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRURHRURFVEVDVCwgICAgIGVkZ2VkZXRlY3QsICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEVMQkcsICAgICAgICAgICBlbGJnLCAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihFUSwgICAgICAgICAgICAgZXEsICAgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRVJPU0lPTiwgICAgICAgIGVyb3Npb24sICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEVYVFJBQ1RQTEFORVMsICBleHRyYWN0cGxhbmVzLCAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihGQURFLCAgICAgICAgICAgZmFkZSwgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRkZURklMVCwgICAgICAgIGZmdGZpbHQsICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEZJRUxELCAgICAgICAgICBmaWVsZCwgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihGSUVMRE1BVENILCAgICAgZmllbGRtYXRjaCwgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRklFTERPUkRFUiwgICAgIGZpZWxkb3JkZXIsICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEZJTkRfUkVDVCwgICAgICBmaW5kX3JlY3QsICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihGT1JNQVQsICAgICAgICAgZm9ybWF0LCAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRlBTLCAgICAgICAgICAgIGZwcywgICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEZSQU1FUEFDSywgICAgICBmcmFtZXBhY2ssICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihGUkFNRVJBVEUsICAgICAgZnJhbWVyYXRlLCAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoRlJBTUVTVEVQLCAgICAgIGZyYW1lc3RlcCwgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEZSRUkwUiwgICAgICAgICBmcmVpMHIsICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihGU1BQLCAgICAgICAgICAgZnNwcCwgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoR0VRLCAgICAgICAgICAgIGdlcSwgICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEdSQURGVU4sICAgICAgICBncmFkZnVuLCAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihIQUxEQ0xVVCwgICAgICAgaGFsZGNsdXQsICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoSEZMSVAsICAgICAgICAgIGhmbGlwLCAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEhJU1RFUSwgICAgICAgICBoaXN0ZXEsICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihISVNUT0dSQU0sICAgICAgaGlzdG9ncmFtLCAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoSFFETjNELCAgICAgICAgIGhxZG4zZCwgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEhRWCwgICAgICAgICAgICBocXgsICAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihIU1RBQ0ssICAgICAgICAgaHN0YWNrLCAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoSFVFLCAgICAgICAgICAgIGh1ZSwgICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKElERVQsICAgICAgICAgICBpZGV0LCAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihJTCwgICAgICAgICAgICAgaWwsICAgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoSU5GTEFURSwgICAgICAgIGluZmxhdGUsICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKElOVEVSTEFDRSwgICAgICBpbnRlcmxhY2UsICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihJTlRFUkxFQVZFLCAgICAgaW50ZXJsZWF2ZSwgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoS0VSTkRFSU5ULCAgICAgIGtlcm5kZWludCwgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKExFTlNDT1JSRUNUSU9OLCBsZW5zY29ycmVjdGlvbiwgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihMVVQzRCwgICAgICAgICAgbHV0M2QsICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoTFVULCAgICAgICAgICAgIGx1dCwgICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKExVVFJHQiwgICAgICAgICBsdXRyZ2IsICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihMVVRZVVYsICAgICAgICAgbHV0eXV2LCAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoTUFTS0VETUVSR0UsICAgIG1hc2tlZG1lcmdlLCAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKE1DREVJTlQsICAgICAgICBtY2RlaW50LCAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihNRVJHRVBMQU5FUywgICAgbWVyZ2VwbGFuZXMsICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoTUVUQURBVEEsICAgICAgIG1ldGFkYXRhLCAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKE1QREVDSU1BVEUsICAgICBtcGRlY2ltYXRlLCAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihORUdBVEUsICAgICAgICAgbmVnYXRlLCAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoTk5FREksICAgICAgICAgIG5uZWRpLCAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKE5PRk9STUFULCAgICAgICBub2Zvcm1hdCwgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihOT0lTRSwgICAgICAgICAgbm9pc2UsICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoTlVMTCwgICAgICAgICAgIG51bGwsICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKE9DUiwgICAgICAgICAgICBvY3IsICAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihPQ1YsICAgICAgICAgICAgb2N2LCAgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoT1ZFUkxBWSwgICAgICAgIG92ZXJsYXksICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKE9XREVOT0lTRSwgICAgICBvd2Rlbm9pc2UsICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihQQUQsICAgICAgICAgICAgcGFkLCAgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoUEFMRVRURUdFTiwgICAgIHBhbGV0dGVnZW4sICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFBBTEVUVEVVU0UsICAgICBwYWxldHRldXNlLCAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihQRVJNUywgICAgICAgICAgcGVybXMsICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoUEVSU1BFQ1RJVkUsICAgIHBlcnNwZWN0aXZlLCAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFBIQVNFLCAgICAgICAgICBwaGFzZSwgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihQSVhERVNDVEVTVCwgICAgcGl4ZGVzY3Rlc3QsICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoUFAsICAgICAgICAgICAgIHBwLCAgICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFBQNywgICAgICAgICAgICBwcDcsICAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihQU05SLCAgICAgICAgICAgcHNuciwgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoUFVMTFVQLCAgICAgICAgIHB1bGx1cCwgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFFQLCAgICAgICAgICAgICBxcCwgICAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihSQU5ET00sICAgICAgICAgcmFuZG9tLCAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoUkVBTFRJTUUsICAgICAgIHJlYWx0aW1lLCAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFJFTU9WRUdSQUlOLCAgICByZW1vdmVncmFpbiwgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihSRU1PVkVMT0dPLCAgICAgcmVtb3ZlbG9nbywgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoUkVQRUFURklFTERTLCAgIHJlcGVhdGZpZWxkcywgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFJFVkVSU0UsICAgICAgICByZXZlcnNlLCAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihST1RBVEUsICAgICAgICAgcm90YXRlLCAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0FCLCAgICAgICAgICAgIHNhYiwgICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNDQUxFLCAgICAgICAgICBzY2FsZSwgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTQ0FMRTJSRUYsICAgICAgc2NhbGUycmVmLCAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0VMRUNULCAgICAgICAgIHNlbGVjdCwgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNFTEVDVElWRUNPTE9SLCBzZWxlY3RpdmVjb2xvciwgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTRU5EQ01ELCAgICAgICAgc2VuZGNtZCwgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0VQQVJBVEVGSUVMRFMsIHNlcGFyYXRlZmllbGRzLCB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNFVERBUiwgICAgICAgICBzZXRkYXIsICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTRVRGSUVMRCwgICAgICAgc2V0ZmllbGQsICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0VUUFRTLCAgICAgICAgIHNldHB0cywgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNFVFNBUiwgICAgICAgICBzZXRzYXIsICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTRVRUQiwgICAgICAgICAgc2V0dGIsICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0hPV0lORk8sICAgICAgIHNob3dpbmZvLCAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNIT1dQQUxFVFRFLCAgICBzaG93cGFsZXR0ZSwgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTSFVGRkxFRlJBTUVTLCAgc2h1ZmZsZWZyYW1lcywgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0hVRkZMRVBMQU5FUywgIHNodWZmbGVwbGFuZXMsICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNJR05BTFNUQVRTLCAgICBzaWduYWxzdGF0cywgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTTUFSVEJMVVIsICAgICAgc21hcnRibHVyLCAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU1BMSVQsICAgICAgICAgIHNwbGl0LCAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNQUCwgICAgICAgICAgICBzcHAsICAgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTU0lNLCAgICAgICAgICAgc3NpbSwgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU1RFUkVPM0QsICAgICAgIHN0ZXJlbzNkLCAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNUUkVBTVNFTEVDVCwgICBzdHJlYW1zZWxlY3QsICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTVUJUSVRMRVMsICAgICAgc3VidGl0bGVzLCAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU1VQRVIyWFNBSSwgICAgIHN1cGVyMnhzYWksICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNXQVBSRUNULCAgICAgICBzd2FwcmVjdCwgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTV0FQVVYsICAgICAgICAgc3dhcHV2LCAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoVEJMRU5ELCAgICAgICAgIHRibGVuZCwgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFRFTEVDSU5FLCAgICAgICB0ZWxlY2luZSwgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihUSFVNQk5BSUwsICAgICAgdGh1bWJuYWlsLCAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoVElMRSwgICAgICAgICAgIHRpbGUsICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFRJTlRFUkxBQ0UsICAgICB0aW50ZXJsYWNlLCAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihUUkFOU1BPU0UsICAgICAgdHJhbnNwb3NlLCAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoVFJJTSwgICAgICAgICAgIHRyaW0sICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFVOU0hBUlAsICAgICAgICB1bnNoYXJwLCAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihVU1BQLCAgICAgICAgICAgdXNwcCwgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoVkVDVE9SU0NPUEUsICAgIHZlY3RvcnNjb3BlLCAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFZGTElQLCAgICAgICAgICB2ZmxpcCwgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihWSURTVEFCREVURUNULCAgdmlkc3RhYmRldGVjdCwgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoVklEU1RBQlRSQU5TRk9STSwgdmlkc3RhYnRyYW5zZm9ybSwgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihWSUdORVRURSwgICAgICAgdmlnbmV0dGUsICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoVlNUQUNLLCAgICAgICAgIHZzdGFjaywgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFczRkRJRiwgICAgICAgICB3M2ZkaWYsICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihXQVZFRk9STSwgICAgICAgd2F2ZWZvcm0sICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoWEJSLCAgICAgICAgICAgIHhiciwgICAgICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFlBRElGLCAgICAgICAgICB5YWRpZiwgICAgICAgICAgdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihaTVEsICAgICAgICAgICAgem1xLCAgICAgICAgICAgIHZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoWk9PTVBBTiwgICAgICAgIHpvb21wYW4sICAgICAgICB2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFpTQ0FMRSwgICAgICAgICB6c2NhbGUsICAgICAgICAgdmYpOwotCi0gICAgUkVHSVNURVJfRklMVEVSKEFMTFJHQiwgICAgICAgICBhbGxyZ2IsICAgICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFMTFlVViwgICAgICAgICBhbGx5dXYsICAgICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKENFTExBVVRPLCAgICAgICBjZWxsYXV0bywgICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKENPTE9SLCAgICAgICAgICBjb2xvciwgICAgICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKEZSRUkwUiwgICAgICAgICBmcmVpMHJfc3JjLCAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKEhBTERDTFVUU1JDLCAgICBoYWxkY2x1dHNyYywgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKExJRkUsICAgICAgICAgICBsaWZlLCAgICAgICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKE1BTkRFTEJST1QsICAgICBtYW5kZWxicm90LCAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKE1QVEVTVFNSQywgICAgICBtcHRlc3RzcmMsICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKE5VTExTUkMsICAgICAgICBudWxsc3JjLCAgICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKFJHQlRFU1RTUkMsICAgICByZ2J0ZXN0c3JjLCAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNNUFRFQkFSUywgICAgICBzbXB0ZWJhcnMsICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNNUFRFSERCQVJTLCAgICBzbXB0ZWhkYmFycywgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKFRFU1RTUkMsICAgICAgICB0ZXN0c3JjLCAgICAgICAgdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKFRFU1RTUkMyLCAgICAgICB0ZXN0c3JjMiwgICAgICAgdnNyYyk7Ci0KLSAgICBSRUdJU1RFUl9GSUxURVIoTlVMTFNJTkssICAgICAgIG51bGxzaW5rLCAgICAgICB2c2luayk7Ci0KLSAgICAvKiBtdWx0aW1lZGlhIGZpbHRlcnMgKi8KLSAgICBSRUdJU1RFUl9GSUxURVIoQURSQVdHUkFQSCwgICAgIGFkcmF3Z3JhcGgsICAgICBhdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihBSElTVE9HUkFNLCAgICAgYWhpc3RvZ3JhbSwgICAgIGF2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKEFQSEFTRU1FVEVSLCAgICBhcGhhc2VtZXRlciwgICAgYXZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoQVZFQ1RPUlNDT1BFLCAgIGF2ZWN0b3JzY29wZSwgICBhdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihDT05DQVQsICAgICAgICAgY29uY2F0LCAgICAgICAgIGF2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNIT1dDUVQsICAgICAgICBzaG93Y3F0LCAgICAgICAgYXZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0hPV0ZSRVFTLCAgICAgIHNob3dmcmVxcywgICAgICBhdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTSE9XU1BFQ1RSVU0sICAgc2hvd3NwZWN0cnVtLCAgIGF2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNIT1dTUEVDVFJVTVBJQywgc2hvd3NwZWN0cnVtcGljLCBhdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTSE9XVk9MVU1FLCAgICAgc2hvd3ZvbHVtZSwgICAgIGF2Zik7Ci0gICAgUkVHSVNURVJfRklMVEVSKFNIT1dXQVZFUywgICAgICBzaG93d2F2ZXMsICAgICAgYXZmKTsKLSAgICBSRUdJU1RFUl9GSUxURVIoU0hPV1dBVkVTUElDLCAgIHNob3d3YXZlc3BpYywgICBhdmYpOwotICAgIFJFR0lTVEVSX0ZJTFRFUihTUEVDVFJVTVNZTlRILCAgc3BlY3RydW1zeW50aCwgIHZhZik7Ci0KLSAgICAvKiBtdWx0aW1lZGlhIHNvdXJjZXMgKi8KLSAgICBSRUdJU1RFUl9GSUxURVIoQU1PVklFLCAgICAgICAgIGFtb3ZpZSwgICAgICAgICBhdnNyYyk7Ci0gICAgUkVHSVNURVJfRklMVEVSKE1PVklFLCAgICAgICAgICBtb3ZpZSwgICAgICAgICAgYXZzcmMpOwotCi0gICAgLyogdGhvc2UgZmlsdGVycyBhcmUgcGFydCBvZiBwdWJsaWMgb3IgaW50ZXJuYWwgQVBJID0+IHJlZ2lzdGVyZWQKLSAgICAgKiB1bmNvbmRpdGlvbmFsbHkgKi8KLSAgICBSRUdJU1RFUl9GSUxURVJfVU5DT05ESVRJT05BTChhc3JjX2FidWZmZXIpOwotICAgIFJFR0lTVEVSX0ZJTFRFUl9VTkNPTkRJVElPTkFMKHZzcmNfYnVmZmVyKTsKLSAgICBSRUdJU1RFUl9GSUxURVJfVU5DT05ESVRJT05BTChhc2lua19hYnVmZmVyKTsKLSAgICBSRUdJU1RFUl9GSUxURVJfVU5DT05ESVRJT05BTCh2c2lua19idWZmZXIpOwotICAgIFJFR0lTVEVSX0ZJTFRFUl9VTkNPTkRJVElPTkFMKGFmX2FmaWZvKTsKLSAgICBSRUdJU1RFUl9GSUxURVJfVU5DT05ESVRJT05BTCh2Zl9maWZvKTsKLSAgICBmZl9vcGVuY2xfcmVnaXN0ZXJfZmlsdGVyX2tlcm5lbF9jb2RlX2FsbCgpOworICAgIGZmX3RocmVhZF9vbmNlKCZhdl9maWx0ZXJfbmV4dF9pbml0LCBhdl9maWx0ZXJfaW5pdF9uZXh0KTsKIH0KKworaW50IGF2ZmlsdGVyX3JlZ2lzdGVyKEFWRmlsdGVyICpmaWx0ZXIpCit7CisgICAgZmZfdGhyZWFkX29uY2UoJmF2X2ZpbHRlcl9uZXh0X2luaXQsIGF2X2ZpbHRlcl9pbml0X25leHQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IEFWRmlsdGVyICphdmZpbHRlcl9uZXh0KGNvbnN0IEFWRmlsdGVyICpwcmV2KQoreworICAgIGZmX3RocmVhZF9vbmNlKCZhdl9maWx0ZXJfbmV4dF9pbml0LCBhdl9maWx0ZXJfaW5pdF9uZXh0KTsKKworICAgIHJldHVybiBwcmV2ID8gcHJldi0+bmV4dCA6IGZpbHRlcl9saXN0WzBdOworfQorCitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYXNyY19hbm9pc2VzcmMuYyBiL2xpYmF2ZmlsdGVyL2FzcmNfYW5vaXNlc3JjLmMKaW5kZXggZTRkNDAxMy4uNzhmMGFmNCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXNyY19hbm9pc2VzcmMuYworKysgYi9saWJhdmZpbHRlci9hc3JjX2Fub2lzZXNyYy5jCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBBTm9pc2VTcmNDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgc2FtcGxlX3JhdGU7CiAgICAgZG91YmxlIGFtcGxpdHVkZTsKQEAgLTQxLDI0ICs0MSwzNSBAQAogICAgIEFWTEZHIGM7CiB9IEFOb2lzZVNyY0NvbnRleHQ7CiAKK2VudW0gTm9pc2VNb2RlIHsKKyAgICBOTV9XSElURSwKKyAgICBOTV9QSU5LLAorICAgIE5NX0JST1dOLAorICAgIE5NX0JMVUUsCisgICAgTk1fVklPTEVULAorICAgIE5NX05CCit9OworCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBTm9pc2VTcmNDb250ZXh0LCB4KQogI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFub2lzZXNyY19vcHRpb25zW10gPSB7Ci0gICAgeyAic2FtcGxlX3JhdGUiLCAgInNldCBzYW1wbGUgcmF0ZSIsICBPRkZTRVQoc2FtcGxlX3JhdGUpLCAgQVZfT1BUX1RZUEVfSU5ULCAgICAgICB7Lmk2NCA9IDQ4MDAwfSwgIDE1LCAgSU5UX01BWCwgICAgRkxBR1MgfSwKLSAgICB7ICJyIiwgICAgICAgICAgICAic2V0IHNhbXBsZSByYXRlIiwgIE9GRlNFVChzYW1wbGVfcmF0ZSksICBBVl9PUFRfVFlQRV9JTlQsICAgICAgIHsuaTY0ID0gNDgwMDB9LCAgMTUsICBJTlRfTUFYLCAgICBGTEFHUyB9LAotICAgIHsgImFtcGxpdHVkZSIsICAgICJzZXQgYW1wbGl0dWRlIiwgICAgT0ZGU0VUKGFtcGxpdHVkZSksICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgICAgey5kYmwgPSAxLn0sICAgICAwLiwgIDEuLCAgICAgICAgIEZMQUdTIH0sCi0gICAgeyAiYSIsICAgICAgICAgICAgInNldCBhbXBsaXR1ZGUiLCAgICBPRkZTRVQoYW1wbGl0dWRlKSwgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgICB7LmRibCA9IDEufSwgICAgIDAuLCAgMS4sICAgICAgICAgRkxBR1MgfSwKLSAgICB7ICJkdXJhdGlvbiIsICAgICAic2V0IGR1cmF0aW9uIiwgICAgIE9GRlNFVChkdXJhdGlvbiksICAgICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgIHsuaTY0ID0gIDB9LCAgICAgIDAsICBJTlQ2NF9NQVgsICBGTEFHUyB9LAotICAgIHsgImQiLCAgICAgICAgICAgICJzZXQgZHVyYXRpb24iLCAgICAgT0ZGU0VUKGR1cmF0aW9uKSwgICAgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCAgey5pNjQgPSAgMH0sICAgICAgMCwgIElOVDY0X01BWCwgIEZMQUdTIH0sCi0gICAgeyAiY29sb3IiLCAgICAgICAgInNldCBub2lzZSBjb2xvciIsICBPRkZTRVQoY29sb3IpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgICB7Lmk2NCA9ICAxfSwgICAgICAwLCAgMiwgICAgICAgICAgRkxBR1MsICJjb2xvciIgfSwKLSAgICB7ICJjb2xvdXIiLCAgICAgICAic2V0IG5vaXNlIGNvbG9yIiwgIE9GRlNFVChjb2xvciksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgIHsuaTY0ID0gIDF9LCAgICAgIDAsICAyLCAgICAgICAgICBGTEFHUywgImNvbG9yIiB9LAotICAgIHsgImMiLCAgICAgICAgICAgICJzZXQgbm9pc2UgY29sb3IiLCAgT0ZGU0VUKGNvbG9yKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICAgey5pNjQgPSAgMH0sICAgICAgMCwgIDIsICAgICAgICAgIEZMQUdTLCAiY29sb3IiIH0sCi0gICAgeyAgICAgIndoaXRlIiwgICAgMCwgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgICB7Lmk2NCA9ICAwfSwgICAgICAwLCAgMCwgICAgICAgICAgRkxBR1MsICJjb2xvciIgfSwKLSAgICB7ICAgICAicGluayIsICAgICAwLCAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICAgIHsuaTY0ID0gIDF9LCAgICAgIDAsICAwLCAgICAgICAgICBGTEFHUywgImNvbG9yIiB9LAotICAgIHsgICAgICJicm93biIsICAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgICAgey5pNjQgPSAgMn0sICAgICAgMCwgIDAsICAgICAgICAgIEZMQUdTLCAiY29sb3IiIH0sCi0gICAgeyAic2VlZCIsICAgICAgICAgInNldCByYW5kb20gc2VlZCIsICBPRkZTRVQoc2VlZCksICAgICAgICAgQVZfT1BUX1RZUEVfSU5UNjQsICAgICB7Lmk2NCA9IC0xfSwgICAgIC0xLCAgVUlOVF9NQVgsICAgRkxBR1MgfSwKLSAgICB7ICJzIiwgICAgICAgICAgICAic2V0IHJhbmRvbSBzZWVkIiwgIE9GRlNFVChzZWVkKSwgICAgICAgICBBVl9PUFRfVFlQRV9JTlQ2NCwgICAgIHsuaTY0ID0gLTF9LCAgICAgLTEsICBVSU5UX01BWCwgICBGTEFHUyB9LAorICAgIHsgInNhbXBsZV9yYXRlIiwgICJzZXQgc2FtcGxlIHJhdGUiLCAgT0ZGU0VUKHNhbXBsZV9yYXRlKSwgIEFWX09QVF9UWVBFX0lOVCwgICAgICAgey5pNjQgPSA0ODAwMH0sICAgICAxNSwgIElOVF9NQVgsICAgIEZMQUdTIH0sCisgICAgeyAiciIsICAgICAgICAgICAgInNldCBzYW1wbGUgcmF0ZSIsICBPRkZTRVQoc2FtcGxlX3JhdGUpLCAgQVZfT1BUX1RZUEVfSU5ULCAgICAgICB7Lmk2NCA9IDQ4MDAwfSwgICAgIDE1LCAgSU5UX01BWCwgICAgRkxBR1MgfSwKKyAgICB7ICJhbXBsaXR1ZGUiLCAgICAic2V0IGFtcGxpdHVkZSIsICAgIE9GRlNFVChhbXBsaXR1ZGUpLCAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICAgIHsuZGJsID0gMS59LCAgICAgICAgMC4sICAxLiwgICAgICAgICBGTEFHUyB9LAorICAgIHsgImEiLCAgICAgICAgICAgICJzZXQgYW1wbGl0dWRlIiwgICAgT0ZGU0VUKGFtcGxpdHVkZSksICAgIEFWX09QVF9UWVBFX0RPVUJMRSwgICAgey5kYmwgPSAxLn0sICAgICAgICAwLiwgIDEuLCAgICAgICAgIEZMQUdTIH0sCisgICAgeyAiZHVyYXRpb24iLCAgICAgInNldCBkdXJhdGlvbiIsICAgICBPRkZTRVQoZHVyYXRpb24pLCAgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sICB7Lmk2NCA9ICAwfSwgICAgICAgICAwLCAgSU5UNjRfTUFYLCAgRkxBR1MgfSwKKyAgICB7ICJkIiwgICAgICAgICAgICAic2V0IGR1cmF0aW9uIiwgICAgIE9GRlNFVChkdXJhdGlvbiksICAgICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgIHsuaTY0ID0gIDB9LCAgICAgICAgIDAsICBJTlQ2NF9NQVgsICBGTEFHUyB9LAorICAgIHsgImNvbG9yIiwgICAgICAgICJzZXQgbm9pc2UgY29sb3IiLCAgT0ZGU0VUKGNvbG9yKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICAgey5pNjQgPSAgMH0sICAgICAgICAgMCwgIE5NX05CIC0gMSwgIEZMQUdTLCAiY29sb3IiIH0sCisgICAgeyAiY29sb3VyIiwgICAgICAgInNldCBub2lzZSBjb2xvciIsICBPRkZTRVQoY29sb3IpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgICB7Lmk2NCA9ICAwfSwgICAgICAgICAwLCAgTk1fTkIgLSAxLCAgRkxBR1MsICJjb2xvciIgfSwKKyAgICB7ICJjIiwgICAgICAgICAgICAic2V0IG5vaXNlIGNvbG9yIiwgIE9GRlNFVChjb2xvciksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgIHsuaTY0ID0gIDB9LCAgICAgICAgIDAsICBOTV9OQiAtIDEsICBGTEFHUywgImNvbG9yIiB9LAorICAgIHsgICAgICJ3aGl0ZSIsICAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgICAgey5pNjQgPSBOTV9XSElURX0sICAgMCwgIDAsICAgICAgICAgIEZMQUdTLCAiY29sb3IiIH0sCisgICAgeyAgICAgInBpbmsiLCAgICAgMCwgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgICB7Lmk2NCA9IE5NX1BJTkt9LCAgICAwLCAgMCwgICAgICAgICAgRkxBR1MsICJjb2xvciIgfSwKKyAgICB7ICAgICAiYnJvd24iLCAgICAwLCAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICAgIHsuaTY0ID0gTk1fQlJPV059LCAgIDAsICAwLCAgICAgICAgICBGTEFHUywgImNvbG9yIiB9LAorICAgIHsgICAgICJibHVlIiwgICAgIDAsICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgICAgey5pNjQgPSBOTV9CTFVFfSwgICAgMCwgIDAsICAgICAgICAgIEZMQUdTLCAiY29sb3IiIH0sCisgICAgeyAgICAgInZpb2xldCIsICAgMCwgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgICB7Lmk2NCA9IE5NX1ZJT0xFVH0sICAwLCAgMCwgICAgICAgICAgRkxBR1MsICJjb2xvciIgfSwKKyAgICB7ICJzZWVkIiwgICAgICAgICAic2V0IHJhbmRvbSBzZWVkIiwgIE9GRlNFVChzZWVkKSwgICAgICAgICBBVl9PUFRfVFlQRV9JTlQ2NCwgICAgIHsuaTY0ID0gLTF9LCAgICAgICAgLTEsICBVSU5UX01BWCwgICBGTEFHUyB9LAorICAgIHsgInMiLCAgICAgICAgICAgICJzZXQgcmFuZG9tIHNlZWQiLCAgT0ZGU0VUKHNlZWQpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVDY0LCAgICAgey5pNjQgPSAtMX0sICAgICAgICAtMSwgIFVJTlRfTUFYLCAgIEZMQUdTIH0sCiAgICAgeyAibmJfc2FtcGxlcyIsICAgInNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcGVyIHJlcXVlc3RlZCBmcmFtZSIsIE9GRlNFVChuYl9zYW1wbGVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDEwMjR9LCAxLCBJTlRfTUFYLCBGTEFHUyB9LAogICAgIHsgIm4iLCAgICAgICAgICAgICJzZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciByZXF1ZXN0ZWQgZnJhbWUiLCBPRkZTRVQobmJfc2FtcGxlcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxMDI0fSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKICAgICB7TlVMTH0KQEAgLTEwMyw3ICsxMTQsNyBAQAogc3RhdGljIGRvdWJsZSB3aGl0ZV9maWx0ZXIoZG91YmxlIHdoaXRlLCBkb3VibGUgKmJ1ZikKIHsKICAgICByZXR1cm4gd2hpdGU7Ci19OworfQogCiBzdGF0aWMgZG91YmxlIHBpbmtfZmlsdGVyKGRvdWJsZSB3aGl0ZSwgZG91YmxlICpidWYpCiB7CkBAIC0xMjEsNiArMTMyLDIyIEBACiAgICAgcmV0dXJuIHBpbmsgKiAwLjExOwogfQogCitzdGF0aWMgZG91YmxlIGJsdWVfZmlsdGVyKGRvdWJsZSB3aGl0ZSwgZG91YmxlICpidWYpCit7CisgICAgZG91YmxlIGJsdWU7CisKKyAgICAvKiBTYW1lIGFzIHBpbmtfZmlsdGVyIGJ1dCBzdWJ0cmFjdCB0aGUgb2Zmc2V0cyByYXRoZXIgdGhhbiBhZGQgKi8KKyAgICBidWZbMF0gPSAwLjA1NTUxNzkgKiB3aGl0ZSAtIDAuOTk4ODYgKiBidWZbMF07CisgICAgYnVmWzFdID0gMC4wNzUwNzU5ICogd2hpdGUgLSAwLjk5MzMyICogYnVmWzFdOworICAgIGJ1ZlsyXSA9IDAuMTUzODUyMCAqIHdoaXRlIC0gMC45NjkwMCAqIGJ1ZlsyXTsKKyAgICBidWZbM10gPSAwLjMxMDQ4NTYgKiB3aGl0ZSAtIDAuODY2NTAgKiBidWZbM107CisgICAgYnVmWzRdID0gMC41MzI5NTIyICogd2hpdGUgLSAwLjU1MDAwICogYnVmWzRdOworICAgIGJ1Zls1XSA9IC0wLjAxNjg5OCAqIHdoaXRlICsgMC43NjE2MCAqIGJ1Zls1XTsKKyAgICBibHVlID0gYnVmWzBdICsgYnVmWzFdICsgYnVmWzJdICsgYnVmWzNdICsgYnVmWzRdICsgYnVmWzVdICsgYnVmWzZdICsgd2hpdGUgKiAwLjUzNjI7CisgICAgYnVmWzZdID0gd2hpdGUgKiAwLjExNTkyNjsKKyAgICByZXR1cm4gYmx1ZSAqIDAuMTE7Cit9CisKIHN0YXRpYyBkb3VibGUgYnJvd25fZmlsdGVyKGRvdWJsZSB3aGl0ZSwgZG91YmxlICpidWYpCiB7CiAgICAgZG91YmxlIGJyb3duOwpAQCAtMTMwLDYgKzE1NywxNSBAQAogICAgIHJldHVybiBicm93biAqIDMuNTsKIH0KIAorc3RhdGljIGRvdWJsZSB2aW9sZXRfZmlsdGVyKGRvdWJsZSB3aGl0ZSwgZG91YmxlICpidWYpCit7CisgICAgZG91YmxlIHZpb2xldDsKKworICAgIHZpb2xldCA9ICgoMC4wMiAqIHdoaXRlKSAtIGJ1ZlswXSkgLyAxLjAyOworICAgIGJ1ZlswXSA9IHZpb2xldDsKKyAgICByZXR1cm4gdmlvbGV0ICogMy41OworfQorCiBzdGF0aWMgYXZfY29sZCBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKQEAgLTE0NCw5ICsxODAsMTEgQEAKICAgICBzLT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUocy0+ZHVyYXRpb24sIHMtPnNhbXBsZV9yYXRlLCBBVl9USU1FX0JBU0UpOwogCiAgICAgc3dpdGNoIChzLT5jb2xvcikgewotICAgIGNhc2UgMDogcy0+ZmlsdGVyID0gd2hpdGVfZmlsdGVyOyBicmVhazsKLSAgICBjYXNlIDE6IHMtPmZpbHRlciA9IHBpbmtfZmlsdGVyOyAgYnJlYWs7Ci0gICAgY2FzZSAyOiBzLT5maWx0ZXIgPSBicm93bl9maWx0ZXI7IGJyZWFrOworICAgIGNhc2UgTk1fV0hJVEU6ICBzLT5maWx0ZXIgPSB3aGl0ZV9maWx0ZXI7ICBicmVhazsKKyAgICBjYXNlIE5NX1BJTks6ICAgcy0+ZmlsdGVyID0gcGlua19maWx0ZXI7ICAgYnJlYWs7CisgICAgY2FzZSBOTV9CUk9XTjogIHMtPmZpbHRlciA9IGJyb3duX2ZpbHRlcjsgIGJyZWFrOworICAgIGNhc2UgTk1fQkxVRTogICBzLT5maWx0ZXIgPSBibHVlX2ZpbHRlcjsgICBicmVhazsKKyAgICBjYXNlIE5NX1ZJT0xFVDogcy0+ZmlsdGVyID0gdmlvbGV0X2ZpbHRlcjsgYnJlYWs7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hc3JjX2FudWxsc3JjLmMgYi9saWJhdmZpbHRlci9hc3JjX2FudWxsc3JjLmMKaW5kZXggOTRiZDBjYS4uY2I2NzY5NCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXNyY19hbnVsbHNyYy5jCisrKyBiL2xpYmF2ZmlsdGVyL2FzcmNfYW51bGxzcmMuYwpAQCAtMzQsNyArMzQsNyBAQAogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQU51bGxDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBjaGFyICAgKmNoYW5uZWxfbGF5b3V0X3N0cjsKICAgICB1aW50NjRfdCBjaGFubmVsX2xheW91dDsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FzcmNfZmxpdGUuYyBiL2xpYmF2ZmlsdGVyL2FzcmNfZmxpdGUuYwppbmRleCBiM2Y4M2FiLi5jOTYxOWViIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9hc3JjX2ZsaXRlLmMKKysrIGIvbGliYXZmaWx0ZXIvYXNyY19mbGl0ZS5jCkBAIC0zMiw3ICszMiw3IEBACiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IEZsaXRlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgY2hhciAqdm9pY2Vfc3RyOwogICAgIGNoYXIgKnRleHRmaWxlOwpAQCAtMTcwLDggKzE3MCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghKGZsaXRlLT50ZXh0ID0gYXZfbWFsbG9jKHRleHRidWZfc2l6ZSsxKSkpCisgICAgICAgIGlmICghKGZsaXRlLT50ZXh0ID0gYXZfbWFsbG9jKHRleHRidWZfc2l6ZSsxKSkpIHsKKyAgICAgICAgICAgIGF2X2ZpbGVfdW5tYXAodGV4dGJ1ZiwgdGV4dGJ1Zl9zaXplKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KICAgICAgICAgbWVtY3B5KGZsaXRlLT50ZXh0LCB0ZXh0YnVmLCB0ZXh0YnVmX3NpemUpOwogICAgICAgICBmbGl0ZS0+dGV4dFt0ZXh0YnVmX3NpemVdID0gMDsKICAgICAgICAgYXZfZmlsZV91bm1hcCh0ZXh0YnVmLCB0ZXh0YnVmX3NpemUpOwpAQCAtMjUzLDggKzI1NSw4IEBACiAgICAgbWVtY3B5KHNhbXBsZXNyZWYtPmRhdGFbMF0sIGZsaXRlLT53YXZlX3NhbXBsZXMsCiAgICAgICAgICAgIG5iX3NhbXBsZXMgKiBmbGl0ZS0+d2F2ZS0+bnVtX2NoYW5uZWxzICogMik7CiAgICAgc2FtcGxlc3JlZi0+cHRzID0gZmxpdGUtPnB0czsKLSAgICBhdl9mcmFtZV9zZXRfcGt0X3BvcyhzYW1wbGVzcmVmLCAtMSk7Ci0gICAgYXZfZnJhbWVfc2V0X3NhbXBsZV9yYXRlKHNhbXBsZXNyZWYsIGZsaXRlLT53YXZlLT5zYW1wbGVfcmF0ZSk7CisgICAgc2FtcGxlc3JlZi0+cGt0X3BvcyA9IC0xOworICAgIHNhbXBsZXNyZWYtPnNhbXBsZV9yYXRlID0gZmxpdGUtPndhdmUtPnNhbXBsZV9yYXRlOwogICAgIGZsaXRlLT5wdHMgKz0gbmJfc2FtcGxlczsKICAgICBmbGl0ZS0+d2F2ZV9zYW1wbGVzICs9IG5iX3NhbXBsZXMgKiBmbGl0ZS0+d2F2ZS0+bnVtX2NoYW5uZWxzOwogICAgIGZsaXRlLT53YXZlX25iX3NhbXBsZXMgLT0gbmJfc2FtcGxlczsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FzcmNfaGlsYmVydC5jIGIvbGliYXZmaWx0ZXIvYXNyY19oaWxiZXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhMzk1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2FzcmNfaGlsYmVydC5jCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE4IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIndpbmRvd19mdW5jLmgiCisKK3R5cGVkZWYgc3RydWN0IEhpbGJlcnRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgbmJfdGFwczsKKyAgICBpbnQgbmJfc2FtcGxlczsKKyAgICBpbnQgd2luX2Z1bmM7CisKKyAgICBmbG9hdCAqdGFwczsKKyAgICBpbnQ2NF90IHB0czsKK30gSGlsYmVydENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEhpbGJlcnRDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGhpbGJlcnRfb3B0aW9uc1tdID0geworICAgIHsgInNhbXBsZV9yYXRlIiwgInNldCBzYW1wbGUgcmF0ZSIsICAgIE9GRlNFVChzYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9NDQxMDB9LCAgMSwgSU5UX01BWCwgICAgRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgICAgICAgICJzZXQgc2FtcGxlIHJhdGUiLCAgICBPRkZTRVQoc2FtcGxlX3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTQ0MTAwfSwgIDEsIElOVF9NQVgsICAgIEZMQUdTIH0sCisgICAgeyAidGFwcyIsICAgICAgICAic2V0IG51bWJlciBvZiB0YXBzIiwgT0ZGU0VUKG5iX3RhcHMpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0yMjA1MX0sIDExLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInQiLCAgICAgICAgICAgInNldCBudW1iZXIgb2YgdGFwcyIsIE9GRlNFVChuYl90YXBzKSwgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MjIwNTF9LCAxMSwgVUlOVDE2X01BWCwgRkxBR1MgfSwKKyAgICB7ICJuYl9zYW1wbGVzIiwgICJzZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciByZXF1ZXN0ZWQgZnJhbWUiLCBPRkZTRVQobmJfc2FtcGxlcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxMDI0fSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJuIiwgICAgICAgICAgICJzZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHBlciByZXF1ZXN0ZWQgZnJhbWUiLCBPRkZTRVQobmJfc2FtcGxlcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxMDI0fSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJ3aW5fZnVuYyIsICJzZXQgd2luZG93IGZ1bmN0aW9uIiwgT0ZGU0VUKHdpbl9mdW5jKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1XRlVOQ19CTEFDS01BTn0sIDAsIE5CX1dGVU5DLTEsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgeyAidyIsICAgICAgICAic2V0IHdpbmRvdyBmdW5jdGlvbiIsIE9GRlNFVCh3aW5fZnVuYyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9V0ZVTkNfQkxBQ0tNQU59LCAwLCBOQl9XRlVOQy0xLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJyZWN0IiwgICAgICJSZWN0YW5ndWxhciIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX1JFQ1R9LCAgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAiYmFydGxldHQiLCAiQmFydGxldHQiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19CQVJUTEVUVH0sIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgImhhbm5pbmciLCAgIkhhbm5pbmciLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfSEFOTklOR30sICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJoYW1taW5nIiwgICJIYW1taW5nIiwgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0hBTU1JTkd9LCAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAiYmxhY2ttYW4iLCAiQmxhY2ttYW4iLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19CTEFDS01BTn0sIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgIndlbGNoIiwgICAgIldlbGNoIiwgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfV0VMQ0h9LCAgICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJmbGF0dG9wIiwgICJGbGF0LXRvcCIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0ZMQVRUT1B9LCAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAiYmhhcnJpcyIsICAiQmxhY2ttYW4tSGFycmlzIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19CSEFSUklTfSwgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgImJudXR0YWxsIiwgIkJsYWNrbWFuLU51dHRhbGwiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfQk5VVFRBTEx9LCAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJiaGFubiIsICAgICJCYXJ0bGV0dC1IYW5uIiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0JIQU5OfSwgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAic2luZSIsICAgICAiU2luZSIsICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19TSU5FfSwgICAgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgIm51dHRhbGwiLCAgIk51dHRhbGwiLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfTlVUVEFMTH0sICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJsYW5jem9zIiwgICJMYW5jem9zIiwgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0xBTkNaT1N9LCAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAiZ2F1c3MiLCAgICAiR2F1c3MiLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19HQVVTU30sICAgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgInR1a2V5IiwgICAgIlR1a2V5IiwgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfVFVLRVl9LCAgICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJkb2xwaCIsICAgICJEb2xwaC1DaGVieXNoZXYiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0RPTFBIfSwgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAiY2F1Y2h5IiwgICAiQ2F1Y2h5IiwgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19DQVVDSFl9LCAgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgInBhcnplbiIsICAgIlBhcnplbiIsICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfUEFSWkVOfSwgICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJwb2lzc29uIiwgICJQb2lzc29uIiwgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX1BPSVNTT059LCAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICB7TlVMTH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhoaWxiZXJ0KTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSGlsYmVydENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoIShzLT5uYl90YXBzICYgMSkpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk51bWJlciBvZiB0YXBzICVkIG11c3QgYmUgb2RkIGxlbmd0aC5cbiIsIHMtPm5iX3RhcHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBIaWxiZXJ0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzLT50YXBzKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgSGlsYmVydENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgY2hsYXlvdXRzW10gPSB7IEFWX0NIX0xBWU9VVF9NT05PLCAtMSB9OworICAgIGludCBzYW1wbGVfcmF0ZXNbXSA9IHsgcy0+c2FtcGxlX3JhdGUsIC0xIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgICAgIEFWX1NBTVBMRV9GTVRfTk9ORQorICAgIH07CisKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0czsKKyAgICBpbnQgcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMgKGN0eCwgZm9ybWF0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBsYXlvdXRzID0gYXZmaWx0ZXJfbWFrZV9mb3JtYXQ2NF9saXN0KGNobGF5b3V0cyk7CisgICAgaWYgKCFsYXlvdXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IGZmX3NldF9jb21tb25fY2hhbm5lbF9sYXlvdXRzKGN0eCwgbGF5b3V0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfcmF0ZXMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9zYW1wbGVyYXRlcyhjdHgsIGZvcm1hdHMpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBIaWxiZXJ0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBmbG9hdCBvdmVybGFwOworICAgIGludCBpOworCisgICAgcy0+dGFwcyA9IGF2X21hbGxvY19hcnJheShzLT5uYl90YXBzLCBzaXplb2YoKnMtPnRhcHMpKTsKKyAgICBpZiAoIXMtPnRhcHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBnZW5lcmF0ZV93aW5kb3dfZnVuYyhzLT50YXBzLCBzLT5uYl90YXBzLCBzLT53aW5fZnVuYywgJm92ZXJsYXApOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3RhcHM7IGkrKykgeworICAgICAgICBpbnQgayA9IC0ocy0+bmJfdGFwcyAvIDIpICsgaTsKKworICAgICAgICBpZiAoayAmIDEpIHsKKyAgICAgICAgICAgIGZsb2F0IHBrID0gTV9QSSAqIGs7CisKKyAgICAgICAgICAgIHMtPnRhcHNbaV0gKj0gKDEuZiAtIGNvc2YocGspKSAvIHBrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+dGFwc1tpXSA9IDAuZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPnB0cyA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBIaWxiZXJ0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgbmJfc2FtcGxlczsKKworICAgIG5iX3NhbXBsZXMgPSBGRk1JTihzLT5uYl9zYW1wbGVzLCBzLT5uYl90YXBzIC0gcy0+cHRzKTsKKyAgICBpZiAoIW5iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIGlmICghKGZyYW1lID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihvdXRsaW5rLCBuYl9zYW1wbGVzKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBtZW1jcHkoZnJhbWUtPmRhdGFbMF0sIHMtPnRhcHMgKyBzLT5wdHMsIG5iX3NhbXBsZXMgKiBzaXplb2YoZmxvYXQpKTsKKworICAgIGZyYW1lLT5wdHMgPSBzLT5wdHM7CisgICAgcy0+cHRzICAgICs9IG5iX3NhbXBsZXM7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBoaWxiZXJ0X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hc3JjX2hpbGJlcnQgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiaGlsYmVydCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiR2VuZXJhdGUgYSBIaWxiZXJ0IHRyYW5zZm9ybSBGSVIgY29lZmZpY2llbnRzLiIpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoSGlsYmVydENvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICA9IGhpbGJlcnRfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZoaWxiZXJ0X2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2FzcmNfc2luZS5jIGIvbGliYXZmaWx0ZXIvYXNyY19zaW5lLmMKaW5kZXggMmEyZjNjMy4uM2E4NzIxMCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXNyY19zaW5lLmMKKysrIGIvbGliYXZmaWx0ZXIvYXNyY19zaW5lLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFNpbmVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBkb3VibGUgZnJlcXVlbmN5OwogICAgIGRvdWJsZSBiZWVwX2ZhY3RvcjsKQEAgLTIxOSw3ICsyMTksNyBAQAogICAgIFNpbmVDb250ZXh0ICpzaW5lID0gb3V0bGluay0+c3JjLT5wcml2OwogICAgIEFWRnJhbWUgKmZyYW1lOwogICAgIGRvdWJsZSB2YWx1ZXNbVkFSX1ZBUlNfTkJdID0gewotICAgICAgICBbVkFSX05dICAgPSBvdXRsaW5rLT5mcmFtZV9jb3VudCwKKyAgICAgICAgW1ZBUl9OXSAgID0gb3V0bGluay0+ZnJhbWVfY291bnRfaW4sCiAgICAgICAgIFtWQVJfUFRTXSA9IHNpbmUtPnB0cywKICAgICAgICAgW1ZBUl9UXSAgID0gc2luZS0+cHRzICogYXZfcTJkKG91dGxpbmstPnRpbWVfYmFzZSksCiAgICAgICAgIFtWQVJfVEJdICA9IGF2X3EyZChvdXRsaW5rLT50aW1lX2Jhc2UpLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYXVkaW8uYyBiL2xpYmF2ZmlsdGVyL2F1ZGlvLmMKaW5kZXggNTFmZWYwMy4uNTk5NmY2MCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXVkaW8uYworKysgYi9saWJhdmZpbHRlci9hdWRpby5jCkBAIC0yMiwxMiArMjIsMTQgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCiAKICNpbmNsdWRlICJhdWRpby5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAorI2RlZmluZSBCVUZGRVJfQUxJR04gMAorCisKIEFWRnJhbWUgKmZmX251bGxfZ2V0X2F1ZGlvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmxpbmssIGludCBuYl9zYW1wbGVzKQogewogICAgIHJldHVybiBmZl9nZXRfYXVkaW9fYnVmZmVyKGxpbmstPmRzdC0+b3V0cHV0c1swXSwgbmJfc2FtcGxlcyk7CkBAIC0zNSwyOSArMzcsNDggQEAKIAogQVZGcmFtZSAqZmZfZGVmYXVsdF9nZXRfYXVkaW9fYnVmZmVyKEFWRmlsdGVyTGluayAqbGluaywgaW50IG5iX3NhbXBsZXMpCiB7Ci0gICAgQVZGcmFtZSAqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIEFWRnJhbWUgKmZyYW1lID0gTlVMTDsKICAgICBpbnQgY2hhbm5lbHMgPSBsaW5rLT5jaGFubmVsczsKLSAgICBpbnQgcmV0OwogCiAgICAgYXZfYXNzZXJ0MChjaGFubmVscyA9PSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGluay0+Y2hhbm5lbF9sYXlvdXQpIHx8ICFhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGluay0+Y2hhbm5lbF9sYXlvdXQpKTsKIAorICAgIGlmICghbGluay0+ZnJhbWVfcG9vbCkgeworICAgICAgICBsaW5rLT5mcmFtZV9wb29sID0gZmZfZnJhbWVfcG9vbF9hdWRpb19pbml0KGF2X2J1ZmZlcl9hbGxvY3osIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX3NhbXBsZXMsIGxpbmstPmZvcm1hdCwgQlVGRkVSX0FMSUdOKTsKKyAgICAgICAgaWYgKCFsaW5rLT5mcmFtZV9wb29sKQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHBvb2xfY2hhbm5lbHMgPSAwOworICAgICAgICBpbnQgcG9vbF9uYl9zYW1wbGVzID0gMDsKKyAgICAgICAgaW50IHBvb2xfYWxpZ24gPSAwOworICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHBvb2xfZm9ybWF0ID0gQVZfU0FNUExFX0ZNVF9OT05FOworCisgICAgICAgIGlmIChmZl9mcmFtZV9wb29sX2dldF9hdWRpb19jb25maWcobGluay0+ZnJhbWVfcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9vbF9jaGFubmVscywgJnBvb2xfbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9vbF9mb3JtYXQsICZwb29sX2FsaWduKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvb2xfY2hhbm5lbHMgIT0gY2hhbm5lbHMgfHwgcG9vbF9uYl9zYW1wbGVzIDwgbmJfc2FtcGxlcyB8fAorICAgICAgICAgICAgcG9vbF9mb3JtYXQgIT0gbGluay0+Zm9ybWF0IHx8IHBvb2xfYWxpZ24gIT0gQlVGRkVSX0FMSUdOKSB7CisKKyAgICAgICAgICAgIGZmX2ZyYW1lX3Bvb2xfdW5pbml0KChGRkZyYW1lUG9vbCAqKikmbGluay0+ZnJhbWVfcG9vbCk7CisgICAgICAgICAgICBsaW5rLT5mcmFtZV9wb29sID0gZmZfZnJhbWVfcG9vbF9hdWRpb19pbml0KGF2X2J1ZmZlcl9hbGxvY3osIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCBsaW5rLT5mb3JtYXQsIEJVRkZFUl9BTElHTik7CisgICAgICAgICAgICBpZiAoIWxpbmstPmZyYW1lX3Bvb2wpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcmFtZSA9IGZmX2ZyYW1lX3Bvb2xfZ2V0KGxpbmstPmZyYW1lX3Bvb2wpOwogICAgIGlmICghZnJhbWUpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgZnJhbWUtPm5iX3NhbXBsZXMgICAgID0gbmJfc2FtcGxlczsKLSAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgPSBsaW5rLT5mb3JtYXQ7Ci0gICAgYXZfZnJhbWVfc2V0X2NoYW5uZWxzKGZyYW1lLCBsaW5rLT5jaGFubmVscyk7CisgICAgZnJhbWUtPm5iX3NhbXBsZXMgPSBuYl9zYW1wbGVzOwogICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCA9IGxpbmstPmNoYW5uZWxfbGF5b3V0OwotICAgIGZyYW1lLT5zYW1wbGVfcmF0ZSAgICA9IGxpbmstPnNhbXBsZV9yYXRlOwotICAgIHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIoZnJhbWUsIDApOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQorICAgIGZyYW1lLT5zYW1wbGVfcmF0ZSA9IGxpbmstPnNhbXBsZV9yYXRlOwogCi0gICAgYXZfc2FtcGxlc19zZXRfc2lsZW5jZShmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgMCwgbmJfc2FtcGxlcywgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5mb3JtYXQpOwotCisgICAgYXZfc2FtcGxlc19zZXRfc2lsZW5jZShmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgMCwgbmJfc2FtcGxlcywgY2hhbm5lbHMsIGxpbmstPmZvcm1hdCk7CiAKICAgICByZXR1cm4gZnJhbWU7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hdmZfYWJpdHNjb3BlLmMgYi9saWJhdmZpbHRlci9hdmZfYWJpdHNjb3BlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUzZWFhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2F2Zl9hYml0c2NvcGUuYwpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQXVkaW9CaXRTY29wZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCB3LCBoOworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKKyAgICBjaGFyICpjb2xvcnM7CisKKyAgICBpbnQgbmJfY2hhbm5lbHM7CisgICAgaW50IGRlcHRoOworICAgIHVpbnQ4X3QgKmZnOworCisgICAgdWludDY0X3QgY291bnRlcls2NF07Cit9IEF1ZGlvQml0U2NvcGVDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihBdWRpb0JpdFNjb3BlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhYml0c2NvcGVfb3B0aW9uc1tdID0geworICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInIiLCAgICAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInNpemUiLCAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSIxMDI0eDI1NiJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInMiLCAgICAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSIxMDI0eDI1NiJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgImNvbG9ycyIsICJzZXQgY2hhbm5lbHMgY29sb3JzIiwgT0ZGU0VUKGNvbG9ycyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAicmVkfGdyZWVufGJsdWV8eWVsbG93fG9yYW5nZXxsaW1lfHBpbmt8bWFnZW50YXxicm93biIgfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFiaXRzY29wZSk7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBOVUxMOworICAgIEFWRmlsdGVyQ2hhbm5lbExheW91dHMgKmxheW91dHM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdHNbXSA9IHsgQVZfU0FNUExFX0ZNVF9TMTZQLCBBVl9TQU1QTEVfRk1UX1MzMlAsIEFWX1NBTVBMRV9GTVRfTk9ORSB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsgQVZfUElYX0ZNVF9SR0JBLCBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBpbnQgcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qoc2FtcGxlX2ZtdHMpOworICAgIGlmICgocmV0ID0gZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmlubGluay0+b3V0X2Zvcm1hdHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfY291bnRzKCk7CisgICAgaWYgKCFsYXlvdXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICgocmV0ID0gZmZfY2hhbm5lbF9sYXlvdXRzX3JlZihsYXlvdXRzLCAmaW5saW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX2FsbF9zYW1wbGVyYXRlcygpOworICAgIGlmICgocmV0ID0gZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJmlubGluay0+b3V0X3NhbXBsZXJhdGVzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOworICAgIGlmICgocmV0ID0gZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJm91dGxpbmstPmluX2Zvcm1hdHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBdWRpb0JpdFNjb3BlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgY2gsIG5iX3NhbXBsZXM7CisgICAgY2hhciAqY29sb3JzLCAqc2F2ZXB0ciA9IE5VTEw7CisKKyAgICBuYl9zYW1wbGVzID0gRkZNQVgoMTAyNCwgKChkb3VibGUpaW5saW5rLT5zYW1wbGVfcmF0ZSAvIGF2X3EyZChzLT5mcmFtZV9yYXRlKSkgKyAwLjUpOworICAgIGlubGluay0+cGFydGlhbF9idWZfc2l6ZSA9CisgICAgaW5saW5rLT5taW5fc2FtcGxlcyA9CisgICAgaW5saW5rLT5tYXhfc2FtcGxlcyA9IG5iX3NhbXBsZXM7CisgICAgcy0+bmJfY2hhbm5lbHMgPSBpbmxpbmstPmNoYW5uZWxzOworICAgIHMtPmRlcHRoID0gaW5saW5rLT5mb3JtYXQgPT0gQVZfU0FNUExFX0ZNVF9TMTZQID8gMTYgOiAzMjsKKworICAgIHMtPmZnID0gYXZfbWFsbG9jX2FycmF5KHMtPm5iX2NoYW5uZWxzLCA0ICogc2l6ZW9mKCpzLT5mZykpOworICAgIGlmICghcy0+ZmcpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBjb2xvcnMgPSBhdl9zdHJkdXAocy0+Y29sb3JzKTsKKyAgICBpZiAoIWNvbG9ycykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2NoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIHVpbnQ4X3QgZmdbNF0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKKyAgICAgICAgY2hhciAqY29sb3I7CisKKyAgICAgICAgY29sb3IgPSBhdl9zdHJ0b2soY2ggPT0gMCA/IGNvbG9ycyA6IE5VTEwsICIgfCIsICZzYXZlcHRyKTsKKyAgICAgICAgaWYgKGNvbG9yKQorICAgICAgICAgICAgYXZfcGFyc2VfY29sb3IoZmcsIGNvbG9yLCAtMSwgY3R4KTsKKyAgICAgICAgcy0+ZmdbNCAqIGNoICsgMF0gPSBmZ1swXTsKKyAgICAgICAgcy0+ZmdbNCAqIGNoICsgMV0gPSBmZ1sxXTsKKyAgICAgICAgcy0+ZmdbNCAqIGNoICsgMl0gPSBmZ1syXTsKKyAgICAgICAgcy0+ZmdbNCAqIGNoICsgM10gPSBmZ1szXTsKKyAgICB9CisgICAgYXZfZnJlZShjb2xvcnMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQXVkaW9CaXRTY29wZUNvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisKKyAgICBvdXRsaW5rLT53ID0gcy0+dzsKKyAgICBvdXRsaW5rLT5oID0gcy0+aDsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IHMtPmZyYW1lX3JhdGU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY291bnRfYml0cyhBdWRpb0JpdFNjb3BlQ29udGV4dCAqcywgdWludDMyX3Qgc2FtcGxlLCBpbnQgbWF4KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisgICAgICAgIGlmIChzYW1wbGUgJiAoMSA8PCBpKSkKKyAgICAgICAgICAgIHMtPmNvdW50ZXJbaV0rKzsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnNhbXBsZXMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgQXVkaW9CaXRTY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0cGljcmVmOworICAgIGludCBjaCwgaSwgaiwgYjsKKworICAgIG91dHBpY3JlZiA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXRwaWNyZWYpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0bGluay0+aDsgaSsrKQorICAgICAgICBtZW1zZXQob3V0cGljcmVmLT5kYXRhWzBdICsgaSAqIG91dHBpY3JlZi0+bGluZXNpemVbMF0sIDAsIG91dGxpbmstPncgKiA0KTsKKworICAgIG91dHBpY3JlZi0+cHRzID0gaW5zYW1wbGVzLT5wdHM7CisgICAgb3V0cGljcmVmLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CisKKyAgICBzd2l0Y2ggKGluc2FtcGxlcy0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNlA6CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGlubGluay0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICppbiA9ICh1aW50MTZfdCAqKWluc2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YVtjaF07CisgICAgICAgICAgICBpbnQgdyA9IG91dHBpY3JlZi0+d2lkdGggLyBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICAgICAgaW50IGggPSBvdXRwaWNyZWYtPmhlaWdodCAvIDE2OworICAgICAgICAgICAgdWludDMyX3QgY29sb3IgPSBBVl9STjMyKCZzLT5mZ1s0ICogY2hdKTsKKworICAgICAgICAgICAgbWVtc2V0KHMtPmNvdW50ZXIsIDAsIHNpemVvZihzLT5jb3VudGVyKSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zYW1wbGVzLT5uYl9zYW1wbGVzOyBpKyspCisgICAgICAgICAgICAgICAgY291bnRfYml0cyhzLCBpbltpXSwgMTYpOworCisgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgMTY7IGIrKykgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCBoIC0gMTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dHBpY3JlZi0+ZGF0YVswXSArIChiICogaCArIGopICogb3V0cGljcmVmLT5saW5lc2l6ZVswXSArIHcgKiBjaCAqIDQ7CisgICAgICAgICAgICAgICAgICAgIGludCB3dyA9IChzLT5jb3VudGVyWzE2IC0gYiAtIDFdIC8gKGZsb2F0KWluc2FtcGxlcy0+bmJfc2FtcGxlcykgKiAodyAtIDEpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3dzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjMyKCZkc3RbaSAqIDRdLCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlA6CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGlubGluay0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90ICppbiA9ICh1aW50MzJfdCAqKWluc2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YVtjaF07CisgICAgICAgICAgICBpbnQgdyA9IG91dHBpY3JlZi0+d2lkdGggLyBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICAgICAgaW50IGggPSBvdXRwaWNyZWYtPmhlaWdodCAvIDMyOworICAgICAgICAgICAgdWludDMyX3QgY29sb3IgPSBBVl9STjMyKCZzLT5mZ1s0ICogY2hdKTsKKworICAgICAgICAgICAgbWVtc2V0KHMtPmNvdW50ZXIsIDAsIHNpemVvZihzLT5jb3VudGVyKSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zYW1wbGVzLT5uYl9zYW1wbGVzOyBpKyspCisgICAgICAgICAgICAgICAgY291bnRfYml0cyhzLCBpbltpXSwgMzIpOworCisgICAgICAgICAgICBmb3IgKGIgPSAwOyBiIDwgMzI7IGIrKykgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCBoIC0gMTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dHBpY3JlZi0+ZGF0YVswXSArIChiICogaCArIGopICogb3V0cGljcmVmLT5saW5lc2l6ZVswXSArIHcgKiBjaCAqIDQ7CisgICAgICAgICAgICAgICAgICAgIGludCB3dyA9IChzLT5jb3VudGVyWzMyIC0gYiAtIDFdIC8gKGZsb2F0KWluc2FtcGxlcy0+bmJfc2FtcGxlcykgKiAodyAtIDEpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB3dzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjMyKCZkc3RbaSAqIDRdLCBjb2xvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cGljcmVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfYXZmX2FiaXRzY29wZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhYml0c2NvcGUiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbnZlcnQgaW5wdXQgYXVkaW8gdG8gYXVkaW8gYml0IHNjb3BlIHZpZGVvIG91dHB1dC4iKSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQXVkaW9CaXRTY29wZUNvbnRleHQpLAorICAgIC5pbnB1dHMgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZhYml0c2NvcGVfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYXZmX2FoaXN0b2dyYW0uYyBiL2xpYmF2ZmlsdGVyL2F2Zl9haGlzdG9ncmFtLmMKaW5kZXggYTcxNmE5Ni4uNTg3NDE1MSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXZmX2FoaXN0b2dyYW0uYworKysgYi9saWJhdmZpbHRlci9hdmZfYWhpc3RvZ3JhbS5jCkBAIC02Myw4ICs2Myw4IEBACiAgICAgeyAiZG1vZGUiLCAic2V0IG1ldGhvZCB0byBkaXNwbGF5IGNoYW5uZWxzIiwgT0ZGU0VUKGRtb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1TSU5HTEV9LCAwLCBOQl9ETU9ERVMtMSwgRkxBR1MsICJkbW9kZSIgfSwKICAgICAgICAgeyAic2luZ2xlIiwgImFsbCBjaGFubmVscyB1c2Ugc2luZ2xlIGhpc3RvZ3JhbSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TSU5HTEV9LCAgIDAsIDAsIEZMQUdTLCAiZG1vZGUiIH0sCiAgICAgICAgIHsgInNlcGFyYXRlIiwgImVhY2ggY2hhbm5lbCBoYXZlIG93biBoaXN0b2dyYW0iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0VQQVJBVEV9LCAwLCAwLCBGTEFHUywgImRtb2RlIiB9LAotICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCAwLCBGTEFHUyB9LAotICAgIHsgInIiLCAgICAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInIiLCAgICAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAogICAgIHsgInNpemUiLCAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSJoZDcyMCJ9LCAwLCAwLCBGTEFHUyB9LAogICAgIHsgInMiLCAgICAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSJoZDcyMCJ9LCAwLCAwLCBGTEFHUyB9LAogICAgIHsgInNjYWxlIiwgInNldCBkaXNwbGF5IHNjYWxlIiwgT0ZGU0VUKHNjYWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1MT0d9LCBMSU5FQVIsIE5CX1NDQUxFUy0xLCBGTEFHUywgInNjYWxlIiB9LApAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgY29uc3QgaW50IEggPSBzLT5oaXN0b2dyYW1faDsKICAgICBjb25zdCBpbnQgdyA9IHMtPnc7CiAgICAgaW50IGMsIHksIG4sIHAsIGJpbjsKLSAgICB1aW50NjRfdCBhY21heCA9IDA7CisgICAgdWludDY0X3QgYWNtYXggPSAxOwogCiAgICAgaWYgKCFzLT5vdXQgfHwgcy0+b3V0LT53aWR0aCAgIT0gb3V0bGluay0+dyB8fAogICAgICAgICAgICAgICAgICAgIHMtPm91dC0+aGVpZ2h0ICE9IG91dGxpbmstPmgpIHsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2F2Zl9hcGhhc2VtZXRlci5jIGIvbGliYXZmaWx0ZXIvYXZmX2FwaGFzZW1ldGVyLmMKaW5kZXggN2MxZTk5My4uOGNkZWU5NCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXZmX2FwaGFzZW1ldGVyLmMKKysrIGIvbGliYXZmaWx0ZXIvYXZmX2FwaGFzZW1ldGVyLmMKQEAgLTM3LDYgKzM3LDcgQEAKIHR5cGVkZWYgc3RydWN0IEF1ZGlvUGhhc2VNZXRlckNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgZG9fdmlkZW87CiAgICAgaW50IHcsIGg7CiAgICAgQVZSYXRpb25hbCBmcmFtZV9yYXRlOwogICAgIGludCBjb250cmFzdFs0XTsKQEAgLTQ5LDE0ICs1MCwxNSBAQAogI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFwaGFzZW1ldGVyX29wdGlvbnNbXSA9IHsKLSAgICB7ICJyYXRlIiwgInNldCB2aWRlbyByYXRlIiwgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0cj0iMjUifSwgMCwgMCwgRkxBR1MgfSwKLSAgICB7ICJyIiwgICAgInNldCB2aWRlbyByYXRlIiwgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0cj0iMjUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyYXRlIiwgInNldCB2aWRlbyByYXRlIiwgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0cj0iMjUifSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgInNldCB2aWRlbyByYXRlIiwgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0cj0iMjUifSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKICAgICB7ICJzaXplIiwgInNldCB2aWRlbyBzaXplIiwgT0ZGU0VUKHcpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0cj0iODAweDQwMCJ9LCAwLCAwLCBGTEFHUyB9LAogICAgIHsgInMiLCAgICAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSI4MDB4NDAwIn0sIDAsIDAsIEZMQUdTIH0sCiAgICAgeyAicmMiLCAic2V0IHJlZCBjb250cmFzdCIsICAgT0ZGU0VUKGNvbnRyYXN0WzBdKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0yfSwgMCwgMjU1LCBGTEFHUyB9LAogICAgIHsgImdjIiwgInNldCBncmVlbiBjb250cmFzdCIsIE9GRlNFVChjb250cmFzdFsxXSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9N30sIDAsIDI1NSwgRkxBR1MgfSwKICAgICB7ICJiYyIsICJzZXQgYmx1ZSBjb250cmFzdCIsICBPRkZTRVQoY29udHJhc3RbMl0pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAyNTUsIEZMQUdTIH0sCiAgICAgeyAibXBjIiwgInNldCBtZWRpYW4gcGhhc2UgY29sb3IiLCBPRkZTRVQobXBjX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAibm9uZSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInZpZGVvIiwgInNldCB2aWRlbyBvdXRwdXQiLCBPRkZTRVQoZG9fdmlkZW8pLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDF9LCAwLCAxLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC02NCw2ICs2Niw3IEBACiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKKyAgICBBdWRpb1BoYXNlTWV0ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IE5VTEw7CiAgICAgQVZGaWx0ZXJDaGFubmVsTGF5b3V0cyAqbGF5b3V0ID0gTlVMTDsKICAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOwpAQCAtNzQsMTcgKzc3LDI0IEBACiAKICAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzYW1wbGVfZm10cyk7CiAgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZiAgICAgICAgIChmb3JtYXRzLCAmaW5saW5rLT5vdXRfZm9ybWF0cyAgICAgICAgKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9mb3JtYXRzX3JlZiAgICAgICAgIChmb3JtYXRzLCAmb3V0bGluay0+aW5fZm9ybWF0cyAgICAgICAgKSkgPCAwIHx8CiAgICAgICAgIChyZXQgPSBmZl9hZGRfY2hhbm5lbF9sYXlvdXQgICgmbGF5b3V0LCBBVl9DSF9MQVlPVVRfU1RFUkVPICAgICAgICAgKSkgPCAwIHx8Ci0gICAgICAgIChyZXQgPSBmZl9jaGFubmVsX2xheW91dHNfcmVmIChsYXlvdXQgLCAmaW5saW5rLT5vdXRfY2hhbm5lbF9sYXlvdXRzKSkgPCAwKQorICAgICAgICAocmV0ID0gZmZfY2hhbm5lbF9sYXlvdXRzX3JlZiAobGF5b3V0ICwgJmlubGluay0+b3V0X2NoYW5uZWxfbGF5b3V0cykpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfY2hhbm5lbF9sYXlvdXRzX3JlZiAobGF5b3V0ICwgJm91dGxpbmstPmluX2NoYW5uZWxfbGF5b3V0cykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGZvcm1hdHMgPSBmZl9hbGxfc2FtcGxlcmF0ZXMoKTsKLSAgICBpZiAoKHJldCA9IGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9zYW1wbGVyYXRlcykpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9zYW1wbGVyYXRlcykpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJm91dGxpbmstPmluX3NhbXBsZXJhdGVzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOwotICAgIGlmICgocmV0ID0gZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJm91dGxpbmstPmluX2Zvcm1hdHMpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKHMtPmRvX3ZpZGVvKSB7CisgICAgICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1sxXTsKKworICAgICAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisgICAgICAgIGlmICgocmV0ID0gZmZfZm9ybWF0c19yZWYoZm9ybWF0cywgJm91dGxpbmstPmluX2Zvcm1hdHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KIAogICAgIHJldHVybiAwOwogfQpAQCAtOTUsMTUgKzEwNSwxNyBAQAogICAgIEF1ZGlvUGhhc2VNZXRlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgaW50IG5iX3NhbXBsZXM7CiAKLSAgICBuYl9zYW1wbGVzID0gRkZNQVgoMTAyNCwgKChkb3VibGUpaW5saW5rLT5zYW1wbGVfcmF0ZSAvIGF2X3EyZChzLT5mcmFtZV9yYXRlKSkgKyAwLjUpOwotICAgIGlubGluay0+cGFydGlhbF9idWZfc2l6ZSA9Ci0gICAgaW5saW5rLT5taW5fc2FtcGxlcyA9Ci0gICAgaW5saW5rLT5tYXhfc2FtcGxlcyA9IG5iX3NhbXBsZXM7CisgICAgaWYgKHMtPmRvX3ZpZGVvKSB7CisgICAgICAgIG5iX3NhbXBsZXMgPSBGRk1BWCgxMDI0LCAoKGRvdWJsZSlpbmxpbmstPnNhbXBsZV9yYXRlIC8gYXZfcTJkKHMtPmZyYW1lX3JhdGUpKSArIDAuNSk7CisgICAgICAgIGlubGluay0+cGFydGlhbF9idWZfc2l6ZSA9CisgICAgICAgIGlubGluay0+bWluX3NhbXBsZXMgPQorICAgICAgICBpbmxpbmstPm1heF9zYW1wbGVzID0gbmJfc2FtcGxlczsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3N0YXRpYyBpbnQgY29uZmlnX3ZpZGVvX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CiAgICAgQXVkaW9QaGFzZU1ldGVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKQEAgLTEzMSw4ICsxNDMsOSBAQAogc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQogewogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7Ci0gICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOwogICAgIEF1ZGlvUGhhc2VNZXRlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gcy0+ZG9fdmlkZW8gPyBjdHgtPm91dHB1dHNbMV0gOiBOVUxMOworICAgIEFWRmlsdGVyTGluayAqYW91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CiAgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGE7CiAgICAgY29uc3QgaW50IHJjID0gcy0+Y29udHJhc3RbMF07CiAgICAgY29uc3QgaW50IGdjID0gcy0+Y29udHJhc3RbMV07CkBAIC0xNDIsOCArMTU1LDggQEAKICAgICB1aW50OF90ICpkc3Q7CiAgICAgaW50IGk7CiAKLSAgICBpZiAoIXMtPm91dCB8fCBzLT5vdXQtPndpZHRoICAhPSBvdXRsaW5rLT53IHx8Ci0gICAgICAgICAgICAgICAgICAgcy0+b3V0LT5oZWlnaHQgIT0gb3V0bGluay0+aCkgeworICAgIGlmIChzLT5kb192aWRlbyAmJiAoIXMtPm91dCB8fCBzLT5vdXQtPndpZHRoICAhPSBvdXRsaW5rLT53IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dC0+aGVpZ2h0ICE9IG91dGxpbmstPmgpKSB7CiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm91dCk7CiAgICAgICAgIHMtPm91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CiAgICAgICAgIGlmICghcy0+b3V0KSB7CkBAIC0xNTQsNyArMTY3LDcgQEAKICAgICAgICAgb3V0ID0gcy0+b3V0OwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0bGluay0+aDsgaSsrKQogICAgICAgICAgICAgbWVtc2V0KG91dC0+ZGF0YVswXSArIGkgKiBvdXQtPmxpbmVzaXplWzBdLCAwLCBvdXRsaW5rLT53ICogNCk7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKHMtPmRvX3ZpZGVvKSB7CiAgICAgICAgIG91dCA9IHMtPm91dDsKICAgICAgICAgZm9yIChpID0gb3V0bGluay0+aCAtIDE7IGkgPj0gMTA7IGktLSkKICAgICAgICAgICAgIG1lbW1vdmUob3V0LT5kYXRhWzBdICsgKGkgICkgKiBvdXQtPmxpbmVzaXplWzBdLApAQCAtMTYzLDcgKzE3Niw2IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRsaW5rLT53OyBpKyspCiAgICAgICAgICAgICBBVl9XTDMyKG91dC0+ZGF0YVswXSArIGkgKiA0LCAwKTsKICAgICB9Ci0gICAgcy0+b3V0LT5wdHMgPSBpbi0+cHRzOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGluLT5uYl9zYW1wbGVzOyBpKyspIHsKICAgICAgICAgY29uc3QgZmxvYXQgKnNyYyA9IChmbG9hdCAqKWluLT5kYXRhWzBdICsgaSAqIDI7CkBAIC0xNzEsMjQgKzE4MywyOCBAQAogICAgICAgICBjb25zdCBmbG9hdCBwaGFzZSA9IGlzbmFuKGYpID8gMSA6IGY7CiAgICAgICAgIGNvbnN0IGludCB4ID0gZ2V0X3gocGhhc2UsIHMtPncpOwogCi0gICAgICAgIGRzdCA9IG91dC0+ZGF0YVswXSArIHggKiA0OwotICAgICAgICBkc3RbMF0gPSBGRk1JTigyNTUsIGRzdFswXSArIHJjKTsKLSAgICAgICAgZHN0WzFdID0gRkZNSU4oMjU1LCBkc3RbMV0gKyBnYyk7Ci0gICAgICAgIGRzdFsyXSA9IEZGTUlOKDI1NSwgZHN0WzJdICsgYmMpOwotICAgICAgICBkc3RbM10gPSAyNTU7CisgICAgICAgIGlmIChzLT5kb192aWRlbykgeworICAgICAgICAgICAgZHN0ID0gb3V0LT5kYXRhWzBdICsgeCAqIDQ7CisgICAgICAgICAgICBkc3RbMF0gPSBGRk1JTigyNTUsIGRzdFswXSArIHJjKTsKKyAgICAgICAgICAgIGRzdFsxXSA9IEZGTUlOKDI1NSwgZHN0WzFdICsgZ2MpOworICAgICAgICAgICAgZHN0WzJdID0gRkZNSU4oMjU1LCBkc3RbMl0gKyBiYyk7CisgICAgICAgICAgICBkc3RbM10gPSAyNTU7CisgICAgICAgIH0KICAgICAgICAgZnBoYXNlICs9IHBoYXNlOwogICAgIH0KICAgICBmcGhhc2UgLz0gaW4tPm5iX3NhbXBsZXM7CiAKLSAgICBpZiAocy0+ZHJhd19tZWRpYW5fcGhhc2UpIHsKLSAgICAgICAgZHN0ID0gb3V0LT5kYXRhWzBdICsgZ2V0X3goZnBoYXNlLCBzLT53KSAqIDQ7Ci0gICAgICAgIEFWX1dMMzIoZHN0LCBBVl9STDMyKHMtPm1wYykpOworICAgIGlmIChzLT5kb192aWRlbykgeworICAgICAgICBpZiAocy0+ZHJhd19tZWRpYW5fcGhhc2UpIHsKKyAgICAgICAgICAgIGRzdCA9IG91dC0+ZGF0YVswXSArIGdldF94KGZwaGFzZSwgcy0+dykgKiA0OworICAgICAgICAgICAgQVZfV0wzMihkc3QsIEFWX1JMMzIocy0+bXBjKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgMTAgJiYgaSA8IG91dGxpbmstPmg7IGkrKykKKyAgICAgICAgICAgIG1lbWNweShvdXQtPmRhdGFbMF0gKyBpICogb3V0LT5saW5lc2l6ZVswXSwgb3V0LT5kYXRhWzBdLCBvdXRsaW5rLT53ICogNCk7CiAgICAgfQogCi0gICAgZm9yIChpID0gMTsgaSA8IDEwICYmIGkgPCBvdXRsaW5rLT5oOyBpKyspCi0gICAgICAgIG1lbWNweShvdXQtPmRhdGFbMF0gKyBpICogb3V0LT5saW5lc2l6ZVswXSwgb3V0LT5kYXRhWzBdLCBvdXRsaW5rLT53ICogNCk7Ci0KLSAgICBtZXRhZGF0YSA9IGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKG91dCk7CisgICAgbWV0YWRhdGEgPSAmaW4tPm1ldGFkYXRhOwogICAgIGlmIChtZXRhZGF0YSkgewogICAgICAgICB1aW50OF90IHZhbHVlWzEyOF07CiAKQEAgLTE5NiwxNSArMjEyLDQ4IEBACiAgICAgICAgIGF2X2RpY3Rfc2V0KG1ldGFkYXRhLCAibGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2UiLCB2YWx1ZSwgMCk7CiAgICAgfQogCi0gICAgYXZfZnJhbWVfZnJlZSgmaW4pOwotICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYXZfZnJhbWVfY2xvbmUocy0+b3V0KSk7CisgICAgaWYgKHMtPmRvX3ZpZGVvKSB7CisgICAgICAgIHMtPm91dC0+cHRzID0gaW4tPnB0czsKKyAgICAgICAgZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGF2X2ZyYW1lX2Nsb25lKHMtPm91dCkpOworICAgIH0KKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGFvdXRsaW5rLCBpbik7CiB9CiAKIHN0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewogICAgIEF1ZGlvUGhhc2VNZXRlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CiAKICAgICBhdl9mcmFtZV9mcmVlKCZzLT5vdXQpOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX291dHB1dHM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+b3V0cHV0X3BhZHNbaV0ubmFtZSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEF1ZGlvUGhhc2VNZXRlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJQYWQgcGFkOworCisgICAgcGFkID0gKEFWRmlsdGVyUGFkKXsKKyAgICAgICAgLm5hbWUgICAgICAgICA9IGF2X3N0cmR1cCgib3V0MCIpLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH07CisgICAgaWYgKCFwYWQubmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBmZl9pbnNlcnRfb3V0cGFkKGN0eCwgMCwgJnBhZCk7CisKKyAgICBpZiAocy0+ZG9fdmlkZW8pIHsKKyAgICAgICAgcGFkID0gKEFWRmlsdGVyUGFkKXsKKyAgICAgICAgICAgIC5uYW1lICAgICAgICAgPSBhdl9zdHJkdXAoIm91dDEiKSwKKyAgICAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3ZpZGVvX291dHB1dCwKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCFwYWQubmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZmX2luc2VydF9vdXRwYWQoY3R4LCAxLCAmcGFkKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0gewpAQCAtMjE3LDIyICsyNjYsMTUgQEAKICAgICB7IE5VTEwgfQogfTsKIAotc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKLSAgICB7Ci0gICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCi0gICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAotICAgIH0sCi0gICAgeyBOVUxMIH0KLX07Ci0KIEFWRmlsdGVyIGZmX2F2Zl9hcGhhc2VtZXRlciA9IHsKICAgICAubmFtZSAgICAgICAgICA9ICJhcGhhc2VtZXRlciIsCiAgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29udmVydCBpbnB1dCBhdWRpbyB0byBwaGFzZSBtZXRlciB2aWRlbyBvdXRwdXQuIiksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAogICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKICAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihBdWRpb1BoYXNlTWV0ZXJDb250ZXh0KSwKICAgICAuaW5wdXRzICAgICAgICA9IGlucHV0cywKLSAgICAub3V0cHV0cyAgICAgICA9IG91dHB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBOVUxMLAogICAgIC5wcml2X2NsYXNzICAgID0gJmFwaGFzZW1ldGVyX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYXZmX2F2ZWN0b3JzY29wZS5jIGIvbGliYXZmaWx0ZXIvYXZmX2F2ZWN0b3JzY29wZS5jCmluZGV4IDI5ZDAyODcuLjc1ZTBlZTUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2F2Zl9hdmVjdG9yc2NvcGUuYworKysgYi9saWJhdmZpbHRlci9hdmZfYXZlY3RvcnNjb3BlLmMKQEAgLTQ2LDYgKzQ2LDE0IEBACiAgICAgRFJBV19OQiwKIH07CiAKK2VudW0gVmVjdG9yU2NvcGVTY2FsZSB7CisgICAgTElOLAorICAgIFNRUlQsCisgICAgQ0JSVCwKKyAgICBMT0csCisgICAgU0NBTEVfTkIsCit9OworCiB0eXBlZGVmIHN0cnVjdCBBdWRpb1ZlY3RvclNjb3BlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgQVZGcmFtZSAqb3V0cGljcmVmOwpAQCAtNTMsOSArNjEsMTIgQEAKICAgICBpbnQgaHcsIGhoOwogICAgIGludCBtb2RlOwogICAgIGludCBkcmF3OworICAgIGludCBzY2FsZTsKICAgICBpbnQgY29udHJhc3RbNF07CiAgICAgaW50IGZhZGVbNF07CiAgICAgZG91YmxlIHpvb207CisgICAgaW50IHN3YXA7CisgICAgaW50IG1pcnJvcjsKICAgICB1bnNpZ25lZCBwcmV2X3gsIHByZXZfeTsKICAgICBBVlJhdGlvbmFsIGZyYW1lX3JhdGU7CiB9IEF1ZGlvVmVjdG9yU2NvcGVDb250ZXh0OwpAQCAtNjksOCArODAsOCBAQAogICAgIHsgImxpc3Nham91cyIsICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElTU0FKT1VTfSwgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAogICAgIHsgImxpc3Nham91c194eSIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElTU0FKT1VTX1hZfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAogICAgIHsgInBvbGFyIiwgICAgICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UE9MQVJ9LCAgICAgICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAotICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCAwLCBGTEFHUyB9LAotICAgIHsgInIiLCAgICAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInIiLCAgICAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAogICAgIHsgInNpemUiLCAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQodyksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSI0MDB4NDAwIn0sIDAsIDAsIEZMQUdTIH0sCiAgICAgeyAicyIsICAgICJzZXQgdmlkZW8gc2l6ZSIsIE9GRlNFVCh3KSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHI9IjQwMHg0MDAifSwgMCwgMCwgRkxBR1MgfSwKICAgICB7ICJyYyIsICJzZXQgcmVkIGNvbnRyYXN0IiwgICBPRkZTRVQoY29udHJhc3RbMF0pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTQwfSwgIDAsIDI1NSwgRkxBR1MgfSwKQEAgLTgxLDEwICs5MiwyMSBAQAogICAgIHsgImdmIiwgInNldCBncmVlbiBmYWRlIiwgICAgIE9GRlNFVChmYWRlWzFdKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMH0sIDAsIDI1NSwgRkxBR1MgfSwKICAgICB7ICJiZiIsICJzZXQgYmx1ZSBmYWRlIiwgICAgICBPRkZTRVQoZmFkZVsyXSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9NX0sICAwLCAyNTUsIEZMQUdTIH0sCiAgICAgeyAiYWYiLCAic2V0IGFscGhhIGZhZGUiLCAgICAgT0ZGU0VUKGZhZGVbM10pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTV9LCAgMCwgMjU1LCBGTEFHUyB9LAotICAgIHsgInpvb20iLCAic2V0IHpvb20gZmFjdG9yIiwgIE9GRlNFVCh6b29tKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgIDEsIDEwLCBGTEFHUyB9LAorICAgIHsgInpvb20iLCAic2V0IHpvb20gZmFjdG9yIiwgIE9GRlNFVCh6b29tKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0xfSwgIDAsIDEwLCBGTEFHUyB9LAogICAgIHsgImRyYXciLCAic2V0IGRyYXcgbW9kZSIsIE9GRlNFVChkcmF3KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1ET1R9LCAwLCBEUkFXX05CLTEsIEZMQUdTLCAiZHJhdyIgfSwKICAgICB7ICJkb3QiLCAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RE9UfSAsIDAsIDAsIEZMQUdTLCAiZHJhdyIgfSwKICAgICB7ICJsaW5lIiwgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElORX0sIDAsIDAsIEZMQUdTLCAiZHJhdyIgfSwKKyAgICB7ICJzY2FsZSIsICJzZXQgYW1wbGl0dWRlIHNjYWxlIG1vZGUiLCBPRkZTRVQoc2NhbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUxJTn0sIDAsIFNDQUxFX05CLTEsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgeyAibGluIiwgICAibGluZWFyIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TElOfSwgIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgeyAic3FydCIsICAic3F1YXJlIHJvb3QiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U1FSVH0sIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgeyAiY2JydCIsICAiY3ViZSByb290IiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q0JSVH0sIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgeyAibG9nIiwgICAibG9nYXJpdGhtaWMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TE9HfSwgIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCisgICAgeyAic3dhcCIsICJzd2FwIHggYXhpcyB3aXRoIHkgYXhpcyIsIE9GRlNFVChzd2FwKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAibWlycm9yIiwgIm1pcnJvciBheGlzIiwgT0ZGU0VUKG1pcnJvciksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDAsIDMsIEZMQUdTLCAibWlycm9yIiB9LAorICAgIHsgIm5vbmUiLCAgIm5vIG1pcnJvciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgRkxBR1MsICJtaXJyb3IiIH0sCisgICAgeyAieCIsICAibWlycm9yIHgiLCAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgIm1pcnJvciIgfSwKKyAgICB7ICJ5IiwgICJtaXJyb3IgeSIsICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Mn0sIDAsIDAsIEZMQUdTLCAibWlycm9yIiB9LAorICAgIHsgInh5IiwgIm1pcnJvciBib3RoIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0zfSwgMCwgMCwgRkxBR1MsICJtaXJyb3IiIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTIwNiw3ICsyMjgsNyBAQAogICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBzLT5mcmFtZV9yYXRlOwogCiAgICAgcy0+cHJldl94ID0gcy0+aHcgPSBzLT53IC8gMjsKLSAgICBzLT5wcmV2X3kgPSBzLT5oaCA9IHMtPmggLyAyOworICAgIHMtPnByZXZfeSA9IHMtPmhoID0gcy0+bW9kZSA9PSBQT0xBUiA/IHMtPmggLSAxIDogcy0+aCAvIDI7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTIyMCw3ICsyNDIsNyBAQAogICAgIGNvbnN0IGludCBoaCA9IHMtPmhoOwogICAgIHVuc2lnbmVkIHgsIHk7CiAgICAgdW5zaWduZWQgcHJldl94ID0gcy0+cHJldl94LCBwcmV2X3kgPSBzLT5wcmV2X3k7Ci0gICAgY29uc3QgZG91YmxlIHpvb20gPSBzLT56b29tOworICAgIGRvdWJsZSB6b29tID0gcy0+em9vbTsKICAgICBpbnQgaTsKIAogICAgIGlmICghcy0+b3V0cGljcmVmIHx8IHMtPm91dHBpY3JlZi0+d2lkdGggICE9IG91dGxpbmstPncgfHwKQEAgLTIzMiw2ICsyNTQsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgfQogCisgICAgICAgIHMtPm91dHBpY3JlZi0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLDF9OwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0bGluay0+aDsgaSsrKQogICAgICAgICAgICAgbWVtc2V0KHMtPm91dHBpY3JlZi0+ZGF0YVswXSArIGkgKiBzLT5vdXRwaWNyZWYtPmxpbmVzaXplWzBdLCAwLCBvdXRsaW5rLT53ICogNCk7CiAgICAgfQpAQCAtMjM5LDY5ICsyNjIsMTAxIEBACiAKICAgICBmYWRlKHMpOwogCi0gICAgc3dpdGNoIChpbnNhbXBsZXMtPmZvcm1hdCkgewotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnNhbXBsZXMtPm5iX3NhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgaW50MTZfdCAqc3JjID0gKGludDE2X3QgKilpbnNhbXBsZXMtPmRhdGFbMF0gKyBpICogMjsKKyAgICBpZiAoem9vbSA8IDEpIHsKKyAgICAgICAgZmxvYXQgbWF4ID0gMDsKIAotICAgICAgICAgICAgaWYgKHMtPm1vZGUgPT0gTElTU0FKT1VTKSB7Ci0gICAgICAgICAgICAgICAgeCA9ICgoc3JjWzFdIC0gc3JjWzBdKSAqIHpvb20gLyAoZmxvYXQpKFVJTlQxNl9NQVgpICsgMSkgKiBodzsKLSAgICAgICAgICAgICAgICB5ID0gKDEuMCAtIChzcmNbMF0gKyBzcmNbMV0pICogem9vbSAvIChmbG9hdClVSU5UMTZfTUFYKSAqIGhoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5tb2RlID09IExJU1NBSk9VU19YWSkgewotICAgICAgICAgICAgICAgIHggPSAoc3JjWzFdICogem9vbSAvIChmbG9hdClJTlQxNl9NQVggKyAxKSAqIGh3OwotICAgICAgICAgICAgICAgIHkgPSAoc3JjWzBdICogem9vbSAvIChmbG9hdClJTlQxNl9NQVggKyAxKSAqIGhoOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbG9hdCBzeCwgc3ksIGN4LCBjeTsKKyAgICAgICAgc3dpdGNoIChpbnNhbXBsZXMtPmZvcm1hdCkgeworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OiB7CisgICAgICAgICAgICBpbnQxNl90ICpzYW1wbGVzID0gKGludDE2X3QgKilpbnNhbXBsZXMtPmRhdGFbMF07CiAKLSAgICAgICAgICAgICAgICBzeCA9IHNyY1sxXSAqIHpvb20gLyAoZmxvYXQpSU5UMTZfTUFYOwotICAgICAgICAgICAgICAgIHN5ID0gc3JjWzBdICogem9vbSAvIChmbG9hdClJTlQxNl9NQVg7Ci0gICAgICAgICAgICAgICAgY3ggPSBzeCAqIHNxcnRmKDEgLSAwLjUqc3kqc3kpOwotICAgICAgICAgICAgICAgIGN5ID0gc3kgKiBzcXJ0ZigxIC0gMC41KnN4KnN4KTsKLSAgICAgICAgICAgICAgICB4ID0gaHcgKyBodyAqIEZGU0lHTihjeCArIGN5KSAqIChjeCAtIGN5KSAqIC43OwotICAgICAgICAgICAgICAgIHkgPSBzLT5oIC0gcy0+aCAqIGZhYnNmKGN4ICsgY3kpICogLjc7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5zYW1wbGVzLT5uYl9zYW1wbGVzICogMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gc2FtcGxlc1tpXSAvIChmbG9hdClJTlQxNl9NQVg7CisgICAgICAgICAgICAgICAgbWF4ID0gRkZNQVgoRkZBQlMoc2FtcGxlKSwgbWF4KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHMtPmRyYXcgPT0gRE9UKSB7Ci0gICAgICAgICAgICAgICAgZHJhd19kb3QocywgeCwgeSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRyYXdfbGluZShzLCB4LCB5LCBwcmV2X3gsIHByZXZfeSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwcmV2X3ggPSB4OwotICAgICAgICAgICAgcHJldl95ID0geTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOiB7CisgICAgICAgICAgICBmbG9hdCAqc2FtcGxlcyA9IChmbG9hdCAqKWluc2FtcGxlcy0+ZGF0YVswXTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc2FtcGxlcy0+bmJfc2FtcGxlcyAqIDI7IGkrKykgeworICAgICAgICAgICAgICAgIG1heCA9IEZGTUFYKEZGQUJTKHNhbXBsZXNbaV0pLCBtYXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQyKDApOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbnNhbXBsZXMtPm5iX3NhbXBsZXM7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgKnNyYyA9IChmbG9hdCAqKWluc2FtcGxlcy0+ZGF0YVswXSArIGkgKiAyOwogCi0gICAgICAgICAgICBpZiAocy0+bW9kZSA9PSBMSVNTQUpPVVMpIHsKLSAgICAgICAgICAgICAgICB4ID0gKChzcmNbMV0gLSBzcmNbMF0pICogem9vbSAvIDIgKyAxKSAqIGh3OwotICAgICAgICAgICAgICAgIHkgPSAoMS4wIC0gKHNyY1swXSArIHNyY1sxXSkgKiB6b29tIC8gMikgKiBoaDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+bW9kZSA9PSBMSVNTQUpPVVNfWFkpewotICAgICAgICAgICAgICAgIHggPSAoc3JjWzFdICogem9vbSArIDEpICogaHc7Ci0gICAgICAgICAgICAgICAgeSA9IChzcmNbMF0gKiB6b29tICsgMSkgKiBoaDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgc3gsIHN5LCBjeCwgY3k7CisgICAgICAgIHpvb20gPSAxLiAvIG1heDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBzeCA9IHNyY1sxXSAqIHpvb207Ci0gICAgICAgICAgICAgICAgc3kgPSBzcmNbMF0gKiB6b29tOwotICAgICAgICAgICAgICAgIGN4ID0gc3ggKiBzcXJ0ZigxIC0gMC41ICogc3kgKiBzeSk7Ci0gICAgICAgICAgICAgICAgY3kgPSBzeSAqIHNxcnRmKDEgLSAwLjUgKiBzeCAqIHN4KTsKLSAgICAgICAgICAgICAgICB4ID0gaHcgKyBodyAqIEZGU0lHTihjeCArIGN5KSAqIChjeCAtIGN5KSAqIC43OwotICAgICAgICAgICAgICAgIHkgPSBzLT5oIC0gcy0+aCAqIGZhYnNmKGN4ICsgY3kpICogLjc7Ci0gICAgICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGluc2FtcGxlcy0+bmJfc2FtcGxlczsgaSsrKSB7CisgICAgICAgIGludDE2X3QgKnNhbXBsZXMgPSAoaW50MTZfdCAqKWluc2FtcGxlcy0+ZGF0YVswXSArIGkgKiAyOworICAgICAgICBmbG9hdCAqc2FtcGxlc2YgPSAoZmxvYXQgKilpbnNhbXBsZXMtPmRhdGFbMF0gKyBpICogMjsKKyAgICAgICAgZmxvYXQgc3JjWzJdOwogCi0gICAgICAgICAgICBpZiAocy0+ZHJhdyA9PSBET1QpIHsKLSAgICAgICAgICAgICAgICBkcmF3X2RvdChzLCB4LCB5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHJhd19saW5lKHMsIHgsIHksIHByZXZfeCwgcHJldl95KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByZXZfeCA9IHg7Ci0gICAgICAgICAgICBwcmV2X3kgPSB5OworICAgICAgICBzd2l0Y2ggKGluc2FtcGxlcy0+Zm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6CisgICAgICAgICAgICBzcmNbMF0gPSBzYW1wbGVzWzBdIC8gKGZsb2F0KUlOVDE2X01BWDsKKyAgICAgICAgICAgIHNyY1sxXSA9IHNhbXBsZXNbMV0gLyAoZmxvYXQpSU5UMTZfTUFYOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6CisgICAgICAgICAgICBzcmNbMF0gPSBzYW1wbGVzZlswXTsKKyAgICAgICAgICAgIHNyY1sxXSA9IHNhbXBsZXNmWzFdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQyKDApOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2Fzc2VydDAoMCk7CisKKyAgICAgICAgc3dpdGNoIChzLT5zY2FsZSkgeworICAgICAgICBjYXNlIFNRUlQ6CisgICAgICAgICAgICBzcmNbMF0gPSBGRlNJR04oc3JjWzBdKSAqIHNxcnRmKEZGQUJTKHNyY1swXSkpOworICAgICAgICAgICAgc3JjWzFdID0gRkZTSUdOKHNyY1sxXSkgKiBzcXJ0ZihGRkFCUyhzcmNbMV0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENCUlQ6CisgICAgICAgICAgICBzcmNbMF0gPSBGRlNJR04oc3JjWzBdKSAqIGNicnRmKEZGQUJTKHNyY1swXSkpOworICAgICAgICAgICAgc3JjWzFdID0gRkZTSUdOKHNyY1sxXSkgKiBjYnJ0ZihGRkFCUyhzcmNbMV0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExPRzoKKyAgICAgICAgICAgIHNyY1swXSA9IEZGU0lHTihzcmNbMF0pICogbG9nZigxICsgRkZBQlMoc3JjWzBdKSkgLyBsb2dmKDIpOworICAgICAgICAgICAgc3JjWzFdID0gRkZTSUdOKHNyY1sxXSkgKiBsb2dmKDEgKyBGRkFCUyhzcmNbMV0pKSAvIGxvZ2YoMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5taXJyb3IgJiAxKQorICAgICAgICAgICAgc3JjWzBdID0gLXNyY1swXTsKKworICAgICAgICBpZiAocy0+bWlycm9yICYgMikKKyAgICAgICAgICAgIHNyY1sxXSA9IC1zcmNbMV07CisKKyAgICAgICAgaWYgKHMtPnN3YXApCisgICAgICAgICAgICBGRlNXQVAoZmxvYXQsIHNyY1swXSwgc3JjWzFdKTsKKworICAgICAgICBpZiAocy0+bW9kZSA9PSBMSVNTQUpPVVMpIHsKKyAgICAgICAgICAgIHggPSAoKHNyY1sxXSAtIHNyY1swXSkgKiB6b29tIC8gMiArIDEpICogaHc7CisgICAgICAgICAgICB5ID0gKDEuMCAtIChzcmNbMF0gKyBzcmNbMV0pICogem9vbSAvIDIpICogaGg7CisgICAgICAgIH0gZWxzZSBpZiAocy0+bW9kZSA9PSBMSVNTQUpPVVNfWFkpIHsKKyAgICAgICAgICAgIHggPSAoc3JjWzFdICogem9vbSArIDEpICogaHc7CisgICAgICAgICAgICB5ID0gKHNyY1swXSAqIHpvb20gKyAxKSAqIGhoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmxvYXQgc3gsIHN5LCBjeCwgY3k7CisKKyAgICAgICAgICAgIHN4ID0gc3JjWzFdICogem9vbTsKKyAgICAgICAgICAgIHN5ID0gc3JjWzBdICogem9vbTsKKyAgICAgICAgICAgIGN4ID0gc3ggKiBzcXJ0ZigxIC0gMC41ICogc3kgKiBzeSk7CisgICAgICAgICAgICBjeSA9IHN5ICogc3FydGYoMSAtIDAuNSAqIHN4ICogc3gpOworICAgICAgICAgICAgeCA9IGh3ICsgaHcgKiBGRlNJR04oY3ggKyBjeSkgKiAoY3ggLSBjeSkgKiAuNzsKKyAgICAgICAgICAgIHkgPSBzLT5oIC0gcy0+aCAqIGZhYnNmKGN4ICsgY3kpICogLjc7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZHJhdyA9PSBET1QpIHsKKyAgICAgICAgICAgIGRyYXdfZG90KHMsIHgsIHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHJhd19saW5lKHMsIHgsIHksIHByZXZfeCwgcHJldl95KTsKKyAgICAgICAgfQorICAgICAgICBwcmV2X3ggPSB4OworICAgICAgICBwcmV2X3kgPSB5OwogICAgIH0KIAogICAgIHMtPnByZXZfeCA9IHgsIHMtPnByZXZfeSA9IHk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hdmZfY29uY2F0LmMgYi9saWJhdmZpbHRlci9hdmZfY29uY2F0LmMKaW5kZXggNGZhOTQ0Ny4uNDZiZDQyMyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXZmX2NvbmNhdC5jCisrKyBiL2xpYmF2ZmlsdGVyL2F2Zl9jb25jYXQuYwpAQCAtMzYsNyArMzYsNyBAQAogCiAjZGVmaW5lIFRZUEVfQUxMIDIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQ29uY2F0Q29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgdW5zaWduZWQgbmJfc3RyZWFtc1tUWVBFX0FMTF07IC8qKjwgbnVtYmVyIG9mIG91dCBzdHJlYW1zIG9mIGVhY2ggdHlwZSAqLwogICAgIHVuc2lnbmVkIG5iX3NlZ21lbnRzOwpAQCAtMjYwLDcgKzI2MCw2IEBACiAgICAgaW50IGZyYW1lX25iX3NhbXBsZXMsIHJldDsKICAgICBBVlJhdGlvbmFsIHJhdGVfdGIgPSB7IDEsIGN0eC0+aW5wdXRzW2luX25vXS0+c2FtcGxlX3JhdGUgfTsKICAgICBBVkZyYW1lICpidWY7Ci0gICAgaW50IG5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKG91dGxpbmstPmNoYW5uZWxfbGF5b3V0KTsKIAogICAgIGlmICghcmF0ZV90Yi5kZW4pCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKQEAgLTI3Myw3ICsyNzIsNyBAQAogICAgICAgICBpZiAoIWJ1ZikKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGF2X3NhbXBsZXNfc2V0X3NpbGVuY2UoYnVmLT5leHRlbmRlZF9kYXRhLCAwLCBmcmFtZV9uYl9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iX2NoYW5uZWxzLCBvdXRsaW5rLT5mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPmNoYW5uZWxzLCBvdXRsaW5rLT5mb3JtYXQpOwogICAgICAgICBidWYtPnB0cyA9IGJhc2VfcHRzICsgYXZfcmVzY2FsZV9xKHNlbnQsIHJhdGVfdGIsIG91dGxpbmstPnRpbWVfYmFzZSk7CiAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBidWYpOwogICAgICAgICBpZiAocmV0IDwgMCkKQEAgLTM2Miw2ICszNjEsNyBAQAogewogICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGN0eC0+cHJpdjsKICAgICB1bnNpZ25lZCBzZWcsIHR5cGUsIHN0cjsKKyAgICBpbnQgcmV0OwogCiAgICAgLyogY3JlYXRlIGlucHV0IHBhZHMgKi8KICAgICBmb3IgKHNlZyA9IDA7IHNlZyA8IGNhdC0+bmJfc2VnbWVudHM7IHNlZysrKSB7CkBAIC0zNzQsNyArMzc0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXJfZnJhbWUgICAgID0gZmlsdGVyX2ZyYW1lLAogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgcGFkLm5hbWUgPSBhdl9hc3ByaW50ZigiaW4lZDolYyVkIiwgc2VnLCAidmEiW3R5cGVdLCBzdHIpOwotICAgICAgICAgICAgICAgIGZmX2luc2VydF9pbnBhZChjdHgsIGN0eC0+bmJfaW5wdXRzLCAmcGFkKTsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2luc2VydF9pbnBhZChjdHgsIGN0eC0+bmJfaW5wdXRzLCAmcGFkKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwYWQubmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzg3LDcgKzM5MCwxMCBAQAogICAgICAgICAgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKICAgICAgICAgICAgIH07CiAgICAgICAgICAgICBwYWQubmFtZSA9IGF2X2FzcHJpbnRmKCJvdXQ6JWMlZCIsICJ2YSJbdHlwZV0sIHN0cik7Ci0gICAgICAgICAgICBmZl9pbnNlcnRfb3V0cGFkKGN0eCwgY3R4LT5uYl9vdXRwdXRzLCAmcGFkKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X291dHBhZChjdHgsIGN0eC0+bmJfb3V0cHV0cywgJnBhZCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwYWQubmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNDEyLDYgKzQxOCwxOSBAQAogICAgIGF2X2ZyZWVwKCZjYXQtPmluKTsKIH0KIAorc3RhdGljIGludCBwcm9jZXNzX2NvbW1hbmQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmNtZCwgY29uc3QgY2hhciAqYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlcywgaW50IHJlc19sZW4sIGludCBmbGFncykKK3sKKyAgICBpbnQgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworCisgICAgaWYgKCFzdHJjbXAoY21kLCAibmV4dCIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiQ29tbWFuZCByZWNlaXZlZDogbmV4dFxuIik7CisgICAgICAgIHJldHVybiBmbHVzaF9zZWdtZW50KGN0eCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwogQVZGaWx0ZXIgZmZfYXZmX2NvbmNhdCA9IHsKICAgICAubmFtZSAgICAgICAgICA9ICJjb25jYXQiLAogICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbmNhdGVuYXRlIGF1ZGlvIGFuZCB2aWRlbyBzdHJlYW1zLiIpLApAQCAtNDIzLDQgKzQ0Miw1IEBACiAgICAgLm91dHB1dHMgICAgICAgPSBOVUxMLAogICAgIC5wcml2X2NsYXNzICAgID0gJmNvbmNhdF9jbGFzcywKICAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMgfCBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUywKKyAgICAucHJvY2Vzc19jb21tYW5kID0gcHJvY2Vzc19jb21tYW5kLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93Y3F0LmMgYi9saWJhdmZpbHRlci9hdmZfc2hvd2NxdC5jCmluZGV4IDcxMmE5OTkuLjg3NWJhNDggMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93Y3F0LmMKKysrIGIvbGliYXZmaWx0ZXIvYXZmX3Nob3djcXQuYwpAQCAtMTgsOSArMTgsNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2F2ZmZ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCkBAIC0yOCw2ICsyNSw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL3hnYV9mb250X2RhdGEuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibGF2ZnV0aWxzLmgiCkBAIC0zOCw2ICszNiwxMCBAQAogI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAogI2VuZGlmCiAKKyNpZiBDT05GSUdfTElCRk9OVENPTkZJRworI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgorI2VuZGlmCisKICNpbmNsdWRlICJhdmZfc2hvd2NxdC5oIgogCiAjZGVmaW5lIEJBU0VGUkVRICAgICAgICAyMC4wMTUyMzEyNjQwODAwNzQ3NQpAQCAtNDgsNiArNTAsOSBAQAogI2RlZmluZSBGT05UQ09MT1IgICAgICAgInN0KDAsIChtaWRpKGYpLTU5LjUpLzEyKTsiIFwKICAgICAic3QoMSwgaWYoYmV0d2VlbihsZCgwKSwwLDEpLCAwLjUtMC41KmNvcygyKlBJKmxkKDApKSwgMCkpOyIgXAogICAgICJyKDEtbGQoMSkpICsgYihsZCgxKSkiCisjZGVmaW5lIENTQ0hFTUUgICAgICAgICAiMXwwLjV8MHwwfDAuNXwxIgorI2RlZmluZSBQVFNfU1RFUCAxMAorI2RlZmluZSBQVFNfVE9MRVJBTkNFIDEKIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2hvd0NRVENvbnRleHQsIHgpCiAjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0pCkBAIC01NSw5ICs2MCw5IEBACiBzdGF0aWMgY29uc3QgQVZPcHRpb24gc2hvd2NxdF9vcHRpb25zW10gPSB7CiAgICAgeyAic2l6ZSIsICAgICAgICAgInNldCB2aWRlbyBzaXplIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgeyAuc3RyID0gIjE5MjB4MTA4MCIgfSwgICAgICAwLCAwLCAgICAgICAgRkxBR1MgfSwKICAgICB7ICJzIiwgICAgICAgICAgICAic2V0IHZpZGVvIHNpemUiLCBPRkZTRVQod2lkdGgpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7IC5zdHIgPSAiMTkyMHgxMDgwIiB9LCAgICAgIDAsIDAsICAgICAgICBGTEFHUyB9LAotICAgIHsgImZwcyIsICAgICAgICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChyYXRlKSwgIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsgLnN0ciA9ICIyNSIgfSwgICAgICAgICAgICAgMCwgMCwgICAgICAgIEZMQUdTIH0sCi0gICAgeyAicmF0ZSIsICAgICAgICAgInNldCB2aWRlbyByYXRlIiwgT0ZGU0VUKHJhdGUpLCAgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgeyAuc3RyID0gIjI1IiB9LCAgICAgICAgICAgICAwLCAwLCAgICAgICAgRkxBR1MgfSwKLSAgICB7ICJyIiwgICAgICAgICAgICAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQocmF0ZSksICBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7IC5zdHIgPSAiMjUiIH0sICAgICAgICAgICAgIDAsIDAsICAgICAgICBGTEFHUyB9LAorICAgIHsgImZwcyIsICAgICAgICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChyYXRlKSwgIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsgLnN0ciA9ICIyNSIgfSwgICAgICAgICAgICAgMSwgMTAwMCwgICAgIEZMQUdTIH0sCisgICAgeyAicmF0ZSIsICAgICAgICAgInNldCB2aWRlbyByYXRlIiwgT0ZGU0VUKHJhdGUpLCAgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgeyAuc3RyID0gIjI1IiB9LCAgICAgICAgICAgICAxLCAxMDAwLCAgICAgRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgICAgICAgICAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQocmF0ZSksICBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7IC5zdHIgPSAiMjUiIH0sICAgICAgICAgICAgIDEsIDEwMDAsICAgICBGTEFHUyB9LAogICAgIHsgImJhcl9oIiwgICAic2V0IGJhcmdyYXBoIGhlaWdodCIsIE9GRlNFVChiYXJfaCksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sICAgICAgICAgICAgICAtMSwgSU5UX01BWCwgIEZMQUdTIH0sCiAgICAgeyAiYXhpc19oIiwgICAgICAic2V0IGF4aXMgaGVpZ2h0IiwgT0ZGU0VUKGF4aXNfaCksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgICAgICAgICAgICAgIC0xLCBJTlRfTUFYLCAgRkxBR1MgfSwKICAgICB7ICJzb25vX2giLCAgInNldCBzb25vZ3JhbSBoZWlnaHQiLCBPRkZTRVQoc29ub19oKSwgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAgICAgICAgICAgICAgLTEsIElOVF9NQVgsICBGTEFHUyB9LApAQCAtNzAsMTkgKzc1LDMxIEBACiAgICAgeyAiZ2FtbWEiLCAgICAic2V0IHNvbm9ncmFtIGdhbW1hIiwgT0ZGU0VUKHNvbm9fZyksICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMy4wIH0sICAgICAgICAgICAgMS4wLCA3LjAsICAgICAgRkxBR1MgfSwKICAgICB7ICJiYXJfZyIsICAgICJzZXQgYmFyZ3JhcGggZ2FtbWEiLCBPRkZTRVQoYmFyX2cpLCAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSAxLjAgfSwgICAgICAgICAgICAxLjAsIDcuMCwgICAgICBGTEFHUyB9LAogICAgIHsgImdhbW1hMiIsICAgInNldCBiYXJncmFwaCBnYW1tYSIsIE9GRlNFVChiYXJfZyksICAgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDEuMCB9LCAgICAgICAgICAgIDEuMCwgNy4wLCAgICAgIEZMQUdTIH0sCi0gICAgeyAidGltZWNsYW1wIiwgICAgICJzZXQgdGltZWNsYW1wIiwgT0ZGU0VUKHRpbWVjbGFtcCksIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gMC4xNyB9LCAgICAgICAgICAgMC4xLCAxLjAsICAgICAgRkxBR1MgfSwKLSAgICB7ICJ0YyIsICAgICAgICAgICAgInNldCB0aW1lY2xhbXAiLCBPRkZTRVQodGltZWNsYW1wKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwLjE3IH0sICAgICAgICAgICAwLjEsIDEuMCwgICAgICBGTEFHUyB9LAorICAgIHsgImJhcl90IiwgICJzZXQgYmFyIHRyYW5zcGFyZW5jeSIsIE9GRlNFVChiYXJfdCksICAgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDEuMCB9LCAgICAgICAgICAgIDAuMCwgMS4wLCAgICAgIEZMQUdTIH0sCisgICAgeyAidGltZWNsYW1wIiwgICAgICJzZXQgdGltZWNsYW1wIiwgT0ZGU0VUKHRpbWVjbGFtcCksIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gMC4xNyB9LCAgICAgICAgIDAuMDAyLCAxLjAsICAgICAgRkxBR1MgfSwKKyAgICB7ICJ0YyIsICAgICAgICAgICAgInNldCB0aW1lY2xhbXAiLCBPRkZTRVQodGltZWNsYW1wKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAwLjE3IH0sICAgICAgICAgMC4wMDIsIDEuMCwgICAgICBGTEFHUyB9LAorICAgIHsgImF0dGFjayIsICAgICAgInNldCBhdHRhY2sgdGltZSIsIE9GRlNFVChhdHRhY2spLCAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IDAgfSwgICAgICAgICAgICAgIDAuMCwgMS4wLCAgICAgIEZMQUdTIH0sCiAgICAgeyAiYmFzZWZyZXEiLCAic2V0IGJhc2UgZnJlcXVlbmN5IiwgT0ZGU0VUKGJhc2VmcmVxKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gQkFTRUZSRVEgfSwgICAgICAxMC4wLCAxMDAwMDAuMCwgRkxBR1MgfSwKICAgICB7ICJlbmRmcmVxIiwgICAic2V0IGVuZCBmcmVxdWVuY3kiLCBPRkZTRVQoZW5kZnJlcSksICAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSBFTkRGUkVRIH0sICAgICAgIDEwLjAsIDEwMDAwMC4wLCBGTEFHUyB9LAogICAgIHsgImNvZWZmY2xhbXAiLCAgICJzZXQgY29lZmZjbGFtcCIsIE9GRlNFVChjb2VmZmNsYW1wKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDEuMCB9LCAgICAgICAgICAgIDAuMSwgMTAuMCwgICAgIEZMQUdTIH0sCiAgICAgeyAidGxlbmd0aCIsICAgICAgICAgInNldCB0bGVuZ3RoIiwgT0ZGU0VUKHRsZW5ndGgpLCAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gVExFTkdUSCB9LCAgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJjb3VudCIsICAgInNldCB0cmFuc2Zvcm0gY291bnQiLCBPRkZTRVQoY291bnQpLCAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSA2IH0sICAgICAgICAgICAgICAgIDEsIDMwLCAgICAgICBGTEFHUyB9LAogICAgIHsgImZjb3VudCIsICAic2V0IGZyZXF1ZW5jeSBjb3VudCIsIE9GRlNFVChmY291bnQpLCAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgICAgICAgICAgICAgICAgMCwgMTAsICAgICAgIEZMQUdTIH0sCi0gICAgeyAiZm9udGZpbGUiLCAgICAgICJzZXQgYXhpcyBmb250IiwgT0ZGU0VUKGZvbnRmaWxlKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAgICAgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJmb250ZmlsZSIsICJzZXQgYXhpcyBmb250IGZpbGUiLCBPRkZTRVQoZm9udGZpbGUpLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImZvbnQiLCAgICAgICAgICAic2V0IGF4aXMgZm9udCIsIE9GRlNFVChmb250KSwgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCiAgICAgeyAiZm9udGNvbG9yIiwgICAgInNldCBmb250IGNvbG9yIiwgT0ZGU0VUKGZvbnRjb2xvciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gRk9OVENPTE9SIH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJheGlzZmlsZSIsICAgICAic2V0IGF4aXMgaW1hZ2UiLCBPRkZTRVQoYXhpc2ZpbGUpLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICAgICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAogICAgIHsgImF4aXMiLCAgICAgICAgICAgICAgImRyYXcgYXhpcyIsIE9GRlNFVChheGlzKSwgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDEgfSwgICAgICAgICAgICAgICAgMCwgMSwgICAgICAgIEZMQUdTIH0sCiAgICAgeyAidGV4dCIsICAgICAgICAgICAgICAiZHJhdyBheGlzIiwgT0ZGU0VUKGF4aXMpLCAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9LCAgICAgICAgICAgICAgICAwLCAxLCAgICAgICAgRkxBR1MgfSwKKyAgICB7ICJjc3AiLCAgICAgICAgICJzZXQgY29sb3Igc3BhY2UiLCBPRkZTRVQoY3NwKSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfSwgMCwgSU5UX01BWCwgRkxBR1MsICJjc3AiIH0sCisgICAgICAgIHsgInVuc3BlY2lmaWVkIiwgInVuc3BlY2lmaWVkIiwgMCwgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEIH0sIDAsIDAsIEZMQUdTLCAiY3NwIiB9LAorICAgICAgICB7ICJidDcwOSIsICAgICAgICAgICAgICJidDcwOSIsIDAsICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWQ09MX1NQQ19CVDcwOSB9LCAgICAgICAwLCAwLCBGTEFHUywgImNzcCIgfSwKKyAgICAgICAgeyAiZmNjIiwgICAgICAgICAgICAgICAgICJmY2MiLCAwLCAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVkNPTF9TUENfRkNDIH0sICAgICAgICAgMCwgMCwgRkxBR1MsICJjc3AiIH0sCisgICAgICAgIHsgImJ0NDcwYmciLCAgICAgICAgICJidDQ3MGJnIiwgMCwgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZDT0xfU1BDX0JUNDcwQkcgfSwgICAgIDAsIDAsIEZMQUdTLCAiY3NwIiB9LAorICAgICAgICB7ICJzbXB0ZTE3MG0iLCAgICAgInNtcHRlMTcwbSIsIDAsICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWQ09MX1NQQ19TTVBURTE3ME0gfSwgICAwLCAwLCBGTEFHUywgImNzcCIgfSwKKyAgICAgICAgeyAic21wdGUyNDBtIiwgICAgICJzbXB0ZTI0MG0iLCAwLCAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVkNPTF9TUENfU01QVEUyNDBNIH0sICAgMCwgMCwgRkxBR1MsICJjc3AiIH0sCisgICAgICAgIHsgImJ0MjAyMG5jbCIsICAgICAiYnQyMDIwbmNsIiwgMCwgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZDT0xfU1BDX0JUMjAyMF9OQ0wgfSwgIDAsIDAsIEZMQUdTLCAiY3NwIiB9LAorICAgIHsgImNzY2hlbWUiLCAgICAic2V0IGNvbG9yIHNjaGVtZSIsIE9GRlNFVChjc2NoZW1lKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IENTQ0hFTUUgfSwgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTkxLDcgKzEwOCwzMyBAQAogc3RhdGljIHZvaWQgY29tbW9uX3VuaW5pdChTaG93Q1FUQ29udGV4dCAqcykKIHsKICAgICBpbnQgazsKKyAgICBpbnQgbGV2ZWwgPSBBVl9MT0dfREVCVUc7CisgICAgaW50NjRfdCBwbG90X3RpbWU7CiAKKyAgICBpZiAocy0+ZmZ0X3RpbWUpCisgICAgICAgIGF2X2xvZyhzLT5jdHgsIGxldmVsLCAiZmZ0X3RpbWUgICAgICAgICA9ICUxNi4zZiBzLlxuIiwgcy0+ZmZ0X3RpbWUgKiAxZS02KTsKKyAgICBpZiAocy0+Y3F0X3RpbWUpCisgICAgICAgIGF2X2xvZyhzLT5jdHgsIGxldmVsLCAiY3F0X3RpbWUgICAgICAgICA9ICUxNi4zZiBzLlxuIiwgcy0+Y3F0X3RpbWUgKiAxZS02KTsKKyAgICBpZiAocy0+cHJvY2Vzc19jcXRfdGltZSkKKyAgICAgICAgYXZfbG9nKHMtPmN0eCwgbGV2ZWwsICJwcm9jZXNzX2NxdF90aW1lID0gJTE2LjNmIHMuXG4iLCBzLT5wcm9jZXNzX2NxdF90aW1lICogMWUtNik7CisgICAgaWYgKHMtPnVwZGF0ZV9zb25vX3RpbWUpCisgICAgICAgIGF2X2xvZyhzLT5jdHgsIGxldmVsLCAidXBkYXRlX3Nvbm9fdGltZSA9ICUxNi4zZiBzLlxuIiwgcy0+dXBkYXRlX3Nvbm9fdGltZSAqIDFlLTYpOworICAgIGlmIChzLT5hbGxvY190aW1lKQorICAgICAgICBhdl9sb2cocy0+Y3R4LCBsZXZlbCwgImFsbG9jX3RpbWUgICAgICAgPSAlMTYuM2Ygcy5cbiIsIHMtPmFsbG9jX3RpbWUgKiAxZS02KTsKKyAgICBpZiAocy0+YmFyX3RpbWUpCisgICAgICAgIGF2X2xvZyhzLT5jdHgsIGxldmVsLCAiYmFyX3RpbWUgICAgICAgICA9ICUxNi4zZiBzLlxuIiwgcy0+YmFyX3RpbWUgKiAxZS02KTsKKyAgICBpZiAocy0+YXhpc190aW1lKQorICAgICAgICBhdl9sb2cocy0+Y3R4LCBsZXZlbCwgImF4aXNfdGltZSAgICAgICAgPSAlMTYuM2Ygcy5cbiIsIHMtPmF4aXNfdGltZSAqIDFlLTYpOworICAgIGlmIChzLT5zb25vX3RpbWUpCisgICAgICAgIGF2X2xvZyhzLT5jdHgsIGxldmVsLCAic29ub190aW1lICAgICAgICA9ICUxNi4zZiBzLlxuIiwgcy0+c29ub190aW1lICogMWUtNik7CisKKyAgICBwbG90X3RpbWUgPSBzLT5mZnRfdGltZSArIHMtPmNxdF90aW1lICsgcy0+cHJvY2Vzc19jcXRfdGltZSArIHMtPnVwZGF0ZV9zb25vX3RpbWUKKyAgICAgICAgICAgICAgKyBzLT5hbGxvY190aW1lICsgcy0+YmFyX3RpbWUgKyBzLT5heGlzX3RpbWUgKyBzLT5zb25vX3RpbWU7CisgICAgaWYgKHBsb3RfdGltZSkKKyAgICAgICAgYXZfbG9nKHMtPmN0eCwgbGV2ZWwsICJwbG90X3RpbWUgICAgICAgID0gJTE2LjNmIHMuXG4iLCBwbG90X3RpbWUgKiAxZS02KTsKKworICAgIHMtPmZmdF90aW1lID0gcy0+Y3F0X3RpbWUgPSBzLT5wcm9jZXNzX2NxdF90aW1lID0gcy0+dXBkYXRlX3Nvbm9fdGltZQorICAgICAgICAgICAgICAgID0gcy0+YWxsb2NfdGltZSA9IHMtPmJhcl90aW1lID0gcy0+YXhpc190aW1lID0gcy0+c29ub190aW1lID0gMDsKICAgICAvKiBheGlzX2ZyYW1lIG1heSBiZSBub24gcmVmZXJlbmNlIGNvdW50ZWQgZnJhbWUgKi8KICAgICBpZiAocy0+YXhpc19mcmFtZSAmJiAhcy0+YXhpc19mcmFtZS0+YnVmWzBdKSB7CiAgICAgICAgIGF2X2ZyZWVwKHMtPmF4aXNfZnJhbWUtPmRhdGEpOwpAQCAtMTA0LDEyICsxNDcsMTMgQEAKICAgICBhdl9mZnRfZW5kKHMtPmZmdF9jdHgpOwogICAgIHMtPmZmdF9jdHggPSBOVUxMOwogICAgIGlmIChzLT5jb2VmZnMpCi0gICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5jcXRfbGVuICogMjsgaysrKQorICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+Y3F0X2xlbjsgaysrKQogICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmNvZWZmc1trXS52YWwpOwogICAgIGF2X2ZyZWVwKCZzLT5jb2VmZnMpOwogICAgIGF2X2ZyZWVwKCZzLT5mZnRfZGF0YSk7CiAgICAgYXZfZnJlZXAoJnMtPmZmdF9yZXN1bHQpOwogICAgIGF2X2ZyZWVwKCZzLT5jcXRfcmVzdWx0KTsKKyAgICBhdl9mcmVlcCgmcy0+YXR0YWNrX2RhdGEpOwogICAgIGF2X2ZyZWVwKCZzLT5jX2J1Zik7CiAgICAgYXZfZnJlZXAoJnMtPmhfYnVmKTsKICAgICBhdl9mcmVlcCgmcy0+cmNwX2hfYnVmKTsKQEAgLTI1MCw2MSArMjk0LDI1IEBACiAgICAgfQogfQogCi0jaWYgMAotc3RhdGljIHZvaWQgY3F0X2NhbGNfaW50ZXJsZWF2ZShGRlRDb21wbGV4ICpkc3QsIGNvbnN0IEZGVENvbXBsZXggKnNyYywgY29uc3QgQ29lZmZzICpjb2VmZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBmZnRfbGVuKQotewotICAgIGludCBrLCB4LCBpLCBtOwotCi0gICAgZm9yIChrID0gMDsgayA8IGxlbjsgaysrKSB7Ci0gICAgICAgIEZGVENvbXBsZXggbCwgciwgYSA9IHswLDB9LCBiID0gezAsMH07Ci0KLSAgICAgICAgbSA9IDIgKiBrOwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgY29lZmZzW21dLmxlbjsgeCsrKSB7Ci0gICAgICAgICAgICBGRlRTYW1wbGUgdSA9IGNvZWZmc1ttXS52YWxbeF07Ci0gICAgICAgICAgICBpID0gY29lZmZzW21dLnN0YXJ0ICsgeDsKLSAgICAgICAgICAgIGEucmUgKz0gdSAqIHNyY1tpXS5yZTsKLSAgICAgICAgICAgIGEuaW0gKz0gdSAqIHNyY1tpXS5pbTsKLSAgICAgICAgfQotCi0gICAgICAgIG0rKzsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGNvZWZmc1ttXS5sZW47IHgrKykgewotICAgICAgICAgICAgRkZUU2FtcGxlIHUgPSBjb2VmZnNbbV0udmFsW3hdOwotICAgICAgICAgICAgaSA9IGNvZWZmc1ttXS5zdGFydCArIHg7Ci0gICAgICAgICAgICBiLnJlICs9IHUgKiBzcmNbaV0ucmU7Ci0gICAgICAgICAgICBiLmltICs9IHUgKiBzcmNbaV0uaW07Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXBhcmF0ZSBsZWZ0IGFuZCByaWdodCwgKGFuZCBtdWx0aXBseSBieSAyLjApICovCi0gICAgICAgIGwucmUgPSBhLnJlICsgYi5yZTsKLSAgICAgICAgbC5pbSA9IGEuaW0gLSBiLmltOwotICAgICAgICByLnJlID0gYi5pbSArIGEuaW07Ci0gICAgICAgIHIuaW0gPSBiLnJlIC0gYS5yZTsKLSAgICAgICAgZHN0W2tdLnJlID0gbC5yZSAqIGwucmUgKyBsLmltICogbC5pbTsKLSAgICAgICAgZHN0W2tdLmltID0gci5yZSAqIHIucmUgKyByLmltICogci5pbTsKLSAgICB9Ci19Ci0jZW5kaWYKLQogc3RhdGljIGludCBpbml0X2NxdChTaG93Q1FUQ29udGV4dCAqcykKIHsKICAgICBjb25zdCBjaGFyICp2YXJfbmFtZXNbXSA9IHsgInRpbWVjbGFtcCIsICJ0YyIsICJmcmVxdWVuY3kiLCAiZnJlcSIsICJmIiwgTlVMTCB9OwogICAgIEFWRXhwciAqZXhwciA9IE5VTEw7CiAgICAgaW50IHJhdGUgPSBzLT5jdHgtPmlucHV0c1swXS0+c2FtcGxlX3JhdGU7Ci0gICAgaW50IG5iX2NxdF9jb2VmZnMgPSAwLCBuYl9jcXRfY29lZmZzX3IgPSAwOworICAgIGludCBuYl9jcXRfY29lZmZzID0gMDsKICAgICBpbnQgaywgeCwgcmV0OwogCiAgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlKCZleHByLCBzLT50bGVuZ3RoLCB2YXJfbmFtZXMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIHMtPmN0eCkpIDwgMCkKICAgICAgICAgZ290byBlcnJvcjsKIAogICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICBpZiAoIShzLT5jb2VmZnMgPSBhdl9jYWxsb2Mocy0+Y3F0X2xlbiAqIDIsIHNpemVvZigqcy0+Y29lZmZzKSkpKQorICAgIGlmICghKHMtPmNvZWZmcyA9IGF2X2NhbGxvYyhzLT5jcXRfbGVuLCBzaXplb2YoKnMtPmNvZWZmcykpKSkKICAgICAgICAgZ290byBlcnJvcjsKIAogICAgIGZvciAoayA9IDA7IGsgPCBzLT5jcXRfbGVuOyBrKyspIHsKICAgICAgICAgZG91YmxlIHZhcnNbXSA9IHsgcy0+dGltZWNsYW1wLCBzLT50aW1lY2xhbXAsIHMtPmZyZXFba10sIHMtPmZyZXFba10sIHMtPmZyZXFba10gfTsKICAgICAgICAgZG91YmxlIGZsZW4sIGNlbnRlciwgdGxlbmd0aDsKLSAgICAgICAgaW50IHN0YXJ0LCBlbmQsIG0gPSAocy0+Y3F0X2NvZWZmc190eXBlID09IENPRUZGU19UWVBFX0lOVEVSTEVBVkUpID8gKDIgKiBrKSA6IGs7CisgICAgICAgIGludCBzdGFydCwgZW5kLCBtID0gazsKIAogICAgICAgICBpZiAocy0+ZnJlcVtrXSA+IDAuNSAqIHJhdGUpCiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTMyMiwxNCArMzMwLDYgQEAKICAgICAgICAgaWYgKCEocy0+Y29lZmZzW21dLnZhbCA9IGF2X2NhbGxvYyhzLT5jb2VmZnNbbV0ubGVuLCBzaXplb2YoKnMtPmNvZWZmc1ttXS52YWwpKSkpCiAgICAgICAgICAgICBnb3RvIGVycm9yOwogCi0gICAgICAgIGlmIChzLT5jcXRfY29lZmZzX3R5cGUgPT0gQ09FRkZTX1RZUEVfSU5URVJMRUFWRSkgewotICAgICAgICAgICAgcy0+Y29lZmZzW20rMV0uc3RhcnQgPSAocy0+ZmZ0X2xlbiAtIGVuZCkgJiB+KHMtPmNxdF9hbGlnbiAtIDEpOwotICAgICAgICAgICAgcy0+Y29lZmZzW20rMV0ubGVuID0gKChzLT5mZnRfbGVuIC0gc3RhcnQpIHwgKHMtPmNxdF9hbGlnbiAtIDEpKSArIDEgLSBzLT5jb2VmZnNbbSsxXS5zdGFydDsKLSAgICAgICAgICAgIG5iX2NxdF9jb2VmZnNfciArPSBzLT5jb2VmZnNbbSsxXS5sZW47Ci0gICAgICAgICAgICBpZiAoIShzLT5jb2VmZnNbbSsxXS52YWwgPSBhdl9jYWxsb2Mocy0+Y29lZmZzW20rMV0ubGVuLCBzaXplb2YoKnMtPmNvZWZmc1ttKzFdLnZhbCkpKSkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICB9Ci0KICAgICAgICAgZm9yICh4ID0gc3RhcnQ7IHggPD0gZW5kOyB4KyspIHsKICAgICAgICAgICAgIGludCBzaWduID0gKHggJiAxKSA/ICgtMSkgOiAxOwogICAgICAgICAgICAgZG91YmxlIHkgPSAyLjAgKiBNX1BJICogKHggLSBjZW50ZXIpICogKDEuMCAvIGZsZW4pOwpAQCAtMzM3LDIyICszMzcsMjAgQEAKICAgICAgICAgICAgIGRvdWJsZSB3ID0gMC4zNTU3NjggKyAwLjQ4NzM5NiAqIGNvcyh5KSArIDAuMTQ0MjMyICogY29zKDIqeSkgKyAwLjAxMjYwNCAqIGNvcygzKnkpOwogICAgICAgICAgICAgdyAqPSBzaWduICogKDEuMCAvIHMtPmZmdF9sZW4pOwogICAgICAgICAgICAgcy0+Y29lZmZzW21dLnZhbFt4IC0gcy0+Y29lZmZzW21dLnN0YXJ0XSA9IHc7Ci0gICAgICAgICAgICBpZiAocy0+Y3F0X2NvZWZmc190eXBlID09IENPRUZGU19UWVBFX0lOVEVSTEVBVkUpCi0gICAgICAgICAgICAgICAgcy0+Y29lZmZzW20rMV0udmFsWyhzLT5mZnRfbGVuIC0geCkgLSBzLT5jb2VmZnNbbSsxXS5zdGFydF0gPSB3OwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHMtPnBlcm11dGVfY29lZmZzKQorICAgICAgICAgICAgcy0+cGVybXV0ZV9jb2VmZnMocy0+Y29lZmZzW21dLnZhbCwgcy0+Y29lZmZzW21dLmxlbik7CiAgICAgfQogCiAgICAgYXZfZXhwcl9mcmVlKGV4cHIpOwotICAgIGlmIChzLT5jcXRfY29lZmZzX3R5cGUgPT0gQ09FRkZTX1RZUEVfREVGQVVMVCkKLSAgICAgICAgYXZfbG9nKHMtPmN0eCwgQVZfTE9HX0lORk8sICJuYl9jcXRfY29lZmZzID0gJWQuXG4iLCBuYl9jcXRfY29lZmZzKTsKLSAgICBlbHNlCi0gICAgICAgIGF2X2xvZyhzLT5jdHgsIEFWX0xPR19JTkZPLCAibmJfY3F0X2NvZWZmcyA9IHslZCwlZH0uXG4iLCBuYl9jcXRfY29lZmZzLCBuYl9jcXRfY29lZmZzX3IpOworICAgIGF2X2xvZyhzLT5jdHgsIEFWX0xPR19JTkZPLCAibmJfY3F0X2NvZWZmcyA9ICVkLlxuIiwgbmJfY3F0X2NvZWZmcyk7CiAgICAgcmV0dXJuIDA7CiAKIGVycm9yOgogICAgIGF2X2V4cHJfZnJlZShleHByKTsKICAgICBpZiAocy0+Y29lZmZzKQotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+Y3F0X2xlbiAqIDI7IGsrKykKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHMtPmNxdF9sZW47IGsrKykKICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5jb2VmZnNba10udmFsKTsKICAgICBhdl9mcmVlcCgmcy0+Y29lZmZzKTsKICAgICByZXR1cm4gcmV0OwpAQCAtMzg4LDkgKzM4Niw5IEBACiB7CiAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQjI0OiAgIGZvcm1hdCA9IEFWX1BJWF9GTVRfUkdCQTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOiBmb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0NDRQOyBicmVhazsKLSAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA6IGZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWQTQyMlA7IGJyZWFrOwotICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDogZm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVZBNDIwUDsgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6IGZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWQTQ0NFA7IGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gZm9ybWF0OwogfQpAQCAtNDQyLDI5ICs0NDAsMzEgQEAKIHN0YXRpYyBkb3VibGUgcl9mdW5jKHZvaWQgKnAsIGRvdWJsZSB4KQogewogICAgIHggPSBhdl9jbGlwZCh4LCAwLjAsIDEuMCk7Ci0gICAgcmV0dXJuIChpbnQpKHgqMjU1LjArMC41KSA8PCAxNjsKKyAgICByZXR1cm4gbHJpbnQoeCoyNTUuMCkgPDwgMTY7CiB9CiAKIHN0YXRpYyBkb3VibGUgZ19mdW5jKHZvaWQgKnAsIGRvdWJsZSB4KQogewogICAgIHggPSBhdl9jbGlwZCh4LCAwLjAsIDEuMCk7Ci0gICAgcmV0dXJuIChpbnQpKHgqMjU1LjArMC41KSA8PCA4OworICAgIHJldHVybiBscmludCh4KjI1NS4wKSA8PCA4OwogfQogCiBzdGF0aWMgZG91YmxlIGJfZnVuYyh2b2lkICpwLCBkb3VibGUgeCkKIHsKICAgICB4ID0gYXZfY2xpcGQoeCwgMC4wLCAxLjApOwotICAgIHJldHVybiAoaW50KSh4KjI1NS4wKzAuNSk7CisgICAgcmV0dXJuIGxyaW50KHgqMjU1LjApOwogfQogCi1zdGF0aWMgaW50IGluaXRfYXhpc19jb2xvcihTaG93Q1FUQ29udGV4dCAqcywgQVZGcmFtZSAqdG1wKQorc3RhdGljIGludCBpbml0X2F4aXNfY29sb3IoU2hvd0NRVENvbnRleHQgKnMsIEFWRnJhbWUgKnRtcCwgaW50IGhhbGYpCiB7CiAgICAgY29uc3QgY2hhciAqdmFyX25hbWVzW10gPSB7ICJ0aW1lY2xhbXAiLCAidGMiLCAiZnJlcXVlbmN5IiwgImZyZXEiLCAiZiIsIE5VTEwgfTsKICAgICBjb25zdCBjaGFyICpmdW5jX25hbWVzW10gPSB7ICJtaWRpIiwgInIiLCAiZyIsICJiIiwgTlVMTCB9OwogICAgIGRvdWJsZSAoKmZ1bmNzW10pKHZvaWQgKiwgZG91YmxlKSA9IHsgbWlkaSwgcl9mdW5jLCBnX2Z1bmMsIGJfZnVuYyB9OwogICAgIEFWRXhwciAqZXhwciA9IE5VTEw7CiAgICAgZG91YmxlICpmcmVxID0gTlVMTDsKLSAgICBpbnQgeCwgeSwgcmV0OworICAgIGludCB4LCB4cywgeSwgcmV0OworICAgIGludCB3aWR0aCA9IGhhbGYgPyAxOTIwLzIgOiAxOTIwLCBoZWlnaHQgPSBoYWxmID8gMTYgOiAzMjsKKyAgICBpbnQgc3RlcCA9IGhhbGYgPyAyIDogMTsKIAogICAgIGlmIChzLT5iYXNlZnJlcSAhPSAoZG91YmxlKSBCQVNFRlJFUSB8fCBzLT5lbmRmcmVxICE9IChkb3VibGUpIEVOREZSRVEpIHsKICAgICAgICAgYXZfbG9nKHMtPmN0eCwgQVZfTE9HX1dBUk5JTkcsICJmb250IGF4aXMgcmVuZGVyaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBub24tZGVmYXVsdCBmcmVxdWVuY3kgcmFuZ2UsIgpAQCAtNDgzLDE3ICs0ODMsMTYgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICBmb3IgKHggPSAwOyB4IDwgMTkyMDsgeCsrKSB7Ci0gICAgICAgIGRvdWJsZSB2YXJzW10gPSB7IHMtPnRpbWVjbGFtcCwgcy0+dGltZWNsYW1wLCBmcmVxW3hdLCBmcmVxW3hdLCBmcmVxW3hdIH07CisgICAgZm9yICh4ID0gMCwgeHMgPSAwOyB4IDwgd2lkdGg7IHgrKywgeHMgKz0gc3RlcCkgeworICAgICAgICBkb3VibGUgdmFyc1tdID0geyBzLT50aW1lY2xhbXAsIHMtPnRpbWVjbGFtcCwgZnJlcVt4c10sIGZyZXFbeHNdLCBmcmVxW3hzXSB9OwogICAgICAgICBpbnQgY29sb3IgPSAoaW50KSBhdl9leHByX2V2YWwoZXhwciwgdmFycywgTlVMTCk7CiAgICAgICAgIHVpbnQ4X3QgciA9IChjb2xvciA+PiAxNikgJiAweEZGLCBnID0gKGNvbG9yID4+IDgpICYgMHhGRiwgYiA9IGNvbG9yICYgMHhGRjsKICAgICAgICAgdWludDhfdCAqZGF0YSA9IHRtcC0+ZGF0YVswXTsKICAgICAgICAgaW50IGxpbmVzaXplID0gdG1wLT5saW5lc2l6ZVswXTsKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IDMyOyB5KyspIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CiAgICAgICAgICAgICBkYXRhW2xpbmVzaXplICogeSArIDQgKiB4XSA9IHI7CiAgICAgICAgICAgICBkYXRhW2xpbmVzaXplICogeSArIDQgKiB4ICsgMV0gPSBnOwogICAgICAgICAgICAgZGF0YVtsaW5lc2l6ZSAqIHkgKyA0ICogeCArIDJdID0gYjsKLSAgICAgICAgICAgIGRhdGFbbGluZXNpemUgKiB5ICsgNCAqIHggKyAzXSA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUwMyw3ICs1MDIsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlbmRlcl9mcmVldHlwZShTaG93Q1FUQ29udGV4dCAqcywgQVZGcmFtZSAqdG1wKQorc3RhdGljIGludCByZW5kZXJfZnJlZXR5cGUoU2hvd0NRVENvbnRleHQgKnMsIEFWRnJhbWUgKnRtcCwgY2hhciAqZm9udGZpbGUpCiB7CiAjaWYgQ09ORklHX0xJQkZSRUVUWVBFCiAgICAgY29uc3QgY2hhciAqc3RyID0gIkVGIEcgQSBCQyBEICI7CkBAIC01MTcsMTMgKzUxNiwxMyBAQAogICAgIGludCBub25fbW9ub3NwYWNlX3dhcm5pbmcgPSAwOwogICAgIGludCB4OwogCi0gICAgaWYgKCFzLT5mb250ZmlsZSkKKyAgICBpZiAoIWZvbnRmaWxlKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCiAgICAgaWYgKEZUX0luaXRfRnJlZVR5cGUoJmxpYikpCiAgICAgICAgIGdvdG8gZmFpbDsKIAotICAgIGlmIChGVF9OZXdfRmFjZShsaWIsIHMtPmZvbnRmaWxlLCAwLCAmZmFjZSkpCisgICAgaWYgKEZUX05ld19GYWNlKGxpYiwgZm9udGZpbGUsIDAsICZmYWNlKSkKICAgICAgICAgZ290byBmYWlsOwogCiAgICAgaWYgKEZUX1NldF9DaGFyX1NpemUoZmFjZSwgMTYqNjQsIDAsIDAsIDApKQpAQCAtNTc2LDM2ICs1NzUsOTkgQEAKICAgICByZXR1cm4gMDsKIAogZmFpbDoKLSAgICBhdl9sb2cocy0+Y3R4LCBBVl9MT0dfV0FSTklORywgImVycm9yIHdoaWxlIGxvYWRpbmcgZnJlZXR5cGUgZm9udCwgdXNpbmcgZGVmYXVsdCBmb250IGluc3RlYWQuXG4iKTsKKyAgICBhdl9sb2cocy0+Y3R4LCBBVl9MT0dfV0FSTklORywgImVycm9yIHdoaWxlIGxvYWRpbmcgZnJlZXR5cGUgZm9udC5cbiIpOwogICAgIEZUX0RvbmVfRmFjZShmYWNlKTsKICAgICBGVF9Eb25lX0ZyZWVUeXBlKGxpYik7CiAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICNlbHNlCi0gICAgaWYgKHMtPmZvbnRmaWxlKQorICAgIGlmIChmb250ZmlsZSkKICAgICAgICAgYXZfbG9nKHMtPmN0eCwgQVZfTE9HX1dBUk5JTkcsICJmcmVldHlwZSBpcyBub3QgYXZhaWxhYmxlLCBpZ25vcmluZyBmb250ZmlsZSBvcHRpb24uXG4iKTsKICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbnQgcmVuZGVyX2ZvbnRjb25maWcoU2hvd0NRVENvbnRleHQgKnMsIEFWRnJhbWUgKnRtcCwgY2hhciogZm9udCkKK3sKKyNpZiBDT05GSUdfTElCRk9OVENPTkZJRworICAgIEZjQ29uZmlnICpmb250Y29uZmlnOworICAgIEZjUGF0dGVybiAqcGF0LCAqYmVzdDsKKyAgICBGY1Jlc3VsdCByZXN1bHQgPSBGY1Jlc3VsdE1hdGNoOworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBpLCByZXQ7CisKKyAgICBpZiAoIWZvbnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBmb3IgKGkgPSAwOyBmb250W2ldOyBpKyspIHsKKyAgICAgICAgaWYgKGZvbnRbaV0gPT0gJ3wnKQorICAgICAgICAgICAgZm9udFtpXSA9ICc6JzsKKyAgICB9CisKKyAgICBpZiAoIShmb250Y29uZmlnID0gRmNJbml0TG9hZENvbmZpZ0FuZEZvbnRzKCkpKSB7CisgICAgICAgIGF2X2xvZyhzLT5jdHgsIEFWX0xPR19FUlJPUiwgImltcG9zc2libGUgdG8gaW5pdCBmb250Y29uZmlnLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKCEocGF0ID0gRmNOYW1lUGFyc2UoKHVpbnQ4X3QgKilmb250KSkpIHsKKyAgICAgICAgYXZfbG9nKHMtPmN0eCwgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IHBhcnNlIGZvbnRjb25maWcgcGF0LlxuIik7CisgICAgICAgIEZjQ29uZmlnRGVzdHJveShmb250Y29uZmlnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBGY0RlZmF1bHRTdWJzdGl0dXRlKHBhdCk7CisKKyAgICBpZiAoIUZjQ29uZmlnU3Vic3RpdHV0ZShmb250Y29uZmlnLCBwYXQsIEZjTWF0Y2hQYXR0ZXJuKSkgeworICAgICAgICBhdl9sb2cocy0+Y3R4LCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3Qgc3Vic3RpdHVlIGZvbnRjb25maWcgb3B0aW9ucy5cbiIpOworICAgICAgICBGY1BhdHRlcm5EZXN0cm95KHBhdCk7CisgICAgICAgIEZjQ29uZmlnRGVzdHJveShmb250Y29uZmlnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBiZXN0ID0gRmNGb250TWF0Y2goZm9udGNvbmZpZywgcGF0LCAmcmVzdWx0KTsKKyAgICBGY1BhdHRlcm5EZXN0cm95KHBhdCk7CisKKyAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKCFiZXN0IHx8IHJlc3VsdCAhPSBGY1Jlc3VsdE1hdGNoKSB7CisgICAgICAgIGF2X2xvZyhzLT5jdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBmaW5kIGEgdmFsaWQgZm9udCBmb3IgJXMuXG4iLCBmb250KTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChGY1BhdHRlcm5HZXRTdHJpbmcoYmVzdCwgRkNfRklMRSwgMCwgKEZjQ2hhcjggKiopJmZpbGVuYW1lKSAhPSBGY1Jlc3VsdE1hdGNoKSB7CisgICAgICAgIGF2X2xvZyhzLT5jdHgsIEFWX0xPR19FUlJPUiwgIm5vIGZpbGUgcGF0aCBmb3IgJXNcbiIsIGZvbnQpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gcmVuZGVyX2ZyZWV0eXBlKHMsIHRtcCwgZmlsZW5hbWUpOworCitmYWlsOgorICAgIEZjUGF0dGVybkRlc3Ryb3koYmVzdCk7CisgICAgRmNDb25maWdEZXN0cm95KGZvbnRjb25maWcpOworICAgIHJldHVybiByZXQ7CisjZWxzZQorICAgIGlmIChmb250KQorICAgICAgICBhdl9sb2cocy0+Y3R4LCBBVl9MT0dfV0FSTklORywgImZvbnRjb25maWcgaXMgbm90IGF2YWlsYWJsZSwgaWdub3JpbmcgZm9udCBvcHRpb24uXG4iKTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworI2VuZGlmCit9CisKIHN0YXRpYyBpbnQgcmVuZGVyX2RlZmF1bHRfZm9udChBVkZyYW1lICp0bXApCiB7CiAgICAgY29uc3QgY2hhciAqc3RyID0gIkVGIEcgQSBCQyBEICI7CiAgICAgaW50IHgsIHUsIHYsIG1hc2s7CiAgICAgdWludDhfdCAqZGF0YSA9IHRtcC0+ZGF0YVswXTsKICAgICBpbnQgbGluZXNpemUgPSB0bXAtPmxpbmVzaXplWzBdOworICAgIGludCB3aWR0aCA9IDE5MjAvMiwgaGVpZ2h0ID0gMTY7CiAKLSAgICBmb3IgKHggPSAwOyB4IDwgMTkyMDsgeCArPSAxOTIpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gd2lkdGgvMTApIHsKICAgICAgICAgdWludDhfdCAqc3RhcnRwdHIgPSBkYXRhICsgNCAqIHg7CiAgICAgICAgIGZvciAodSA9IDA7IHUgPCAxMjsgdSsrKSB7Ci0gICAgICAgICAgICBmb3IgKHYgPSAwOyB2IDwgMTY7IHYrKykgewotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnAgPSBzdGFydHB0ciArIDIgKiB2ICogbGluZXNpemUgKyAxNiAqIDQgKiB1OwotICAgICAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEsIHAgKz0gOCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobWFzayAmIGF2cHJpdl92Z2ExNl9mb250W3N0clt1XSAqIDE2ICsgdl0pIHsKKyAgICAgICAgICAgIGZvciAodiA9IDA7IHYgPCBoZWlnaHQ7IHYrKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnAgPSBzdGFydHB0ciArIHYgKiBsaW5lc2l6ZSArIGhlaWdodC8yICogNCAqIHU7CisgICAgICAgICAgICAgICAgZm9yIChtYXNrID0gMHg4MDsgbWFzazsgbWFzayA+Pj0gMSwgcCArPSA0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXNrICYgYXZwcml2X3ZnYTE2X2ZvbnRbc3RyW3VdICogMTYgKyB2XSkKICAgICAgICAgICAgICAgICAgICAgICAgIHBbM10gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwWzddID0gMjU1OwotICAgICAgICAgICAgICAgICAgICAgICAgcFtsaW5lc2l6ZSszXSA9IDI1NTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBbbGluZXNpemUrN10gPSAyNTU7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcFszXSA9IDA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02MTgsMjIgKzY4MCwyOSBAQAogewogICAgIEFWRnJhbWUgKnRtcCA9IE5VTEw7CiAgICAgaW50IHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICBpbnQgd2lkdGggPSAxOTIwLCBoZWlnaHQgPSAzMjsKKyAgICBpbnQgZGVmYXVsdF9mb250ID0gMDsKIAotICAgIGlmICghKHRtcCA9IGFsbG9jX2ZyYW1lX2VtcHR5KEFWX1BJWF9GTVRfUkdCQSwgMTkyMCwgMzIpKSkKKyAgICBpZiAoISh0bXAgPSBhbGxvY19mcmFtZV9lbXB0eShBVl9QSVhfRk1UX1JHQkEsIHdpZHRoLCBoZWlnaHQpKSkKICAgICAgICAgZ290byBmYWlsOwogCiAgICAgaWYgKCEocy0+YXhpc19mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCkpKQogICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICBpZiAoKHJldCA9IGluaXRfYXhpc19jb2xvcihzLCB0bXApKSA8IDApCisgICAgaWYgKHJlbmRlcl9mcmVldHlwZShzLCB0bXAsIHMtPmZvbnRmaWxlKSA8IDAgJiYKKyAgICAgICAgcmVuZGVyX2ZvbnRjb25maWcocywgdG1wLCBzLT5mb250KSA8IDAgJiYKKyAgICAgICAgKGRlZmF1bHRfZm9udCA9IDEsIHJldCA9IHJlbmRlcl9kZWZhdWx0X2ZvbnQodG1wKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICBpZiAocmVuZGVyX2ZyZWV0eXBlKHMsIHRtcCkgPCAwICYmIChyZXQgPSByZW5kZXJfZGVmYXVsdF9mb250KHRtcCkpIDwgMCkKKyAgICBpZiAoZGVmYXVsdF9mb250KQorICAgICAgICB3aWR0aCAvPSAyLCBoZWlnaHQgLz0gMjsKKworICAgIGlmICgocmV0ID0gaW5pdF9heGlzX2NvbG9yKHMsIHRtcCwgZGVmYXVsdF9mb250KSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKICAgICBpZiAoKHJldCA9IGZmX3NjYWxlX2ltYWdlKHMtPmF4aXNfZnJhbWUtPmRhdGEsIHMtPmF4aXNfZnJhbWUtPmxpbmVzaXplLCBzLT53aWR0aCwgcy0+YXhpc19oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydF9heGlzX3BpeGVsX2Zvcm1hdChzLT5mb3JtYXQpLCB0bXAtPmRhdGEsIHRtcC0+bGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwLCAzMiwgQVZfUElYX0ZNVF9SR0JBLCBzLT5jdHgpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBBVl9QSVhfRk1UX1JHQkEsIHMtPmN0eCkpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCiAgICAgYXZfZnJhbWVfZnJlZSgmdG1wKTsKQEAgLTY2MSwzNSArNzMwLDM1IEBACiAgICAgcmV0dXJuIGV4cGYobG9nZih2KSAvIGcpOwogfQogCi1zdGF0aWMgdm9pZCByZ2JfZnJvbV9jcXQoQ29sb3JGbG9hdCAqYywgY29uc3QgRkZUQ29tcGxleCAqdiwgZmxvYXQgZywgaW50IGxlbikKK3N0YXRpYyB2b2lkIHJnYl9mcm9tX2NxdChDb2xvckZsb2F0ICpjLCBjb25zdCBGRlRDb21wbGV4ICp2LCBmbG9hdCBnLCBpbnQgbGVuLCBmbG9hdCBjc2NoZW1lWzZdKQogewogICAgIGludCB4OwogICAgIGZvciAoeCA9IDA7IHggPCBsZW47IHgrKykgewotICAgICAgICBjW3hdLnJnYi5yID0gMjU1LjBmICogY2FsY3VsYXRlX2dhbW1hKEZGTUlOKDEuMGYsIHZbeF0ucmUpLCBnKTsKLSAgICAgICAgY1t4XS5yZ2IuZyA9IDI1NS4wZiAqIGNhbGN1bGF0ZV9nYW1tYShGRk1JTigxLjBmLCAwLjVmICogKHZbeF0ucmUgKyB2W3hdLmltKSksIGcpOwotICAgICAgICBjW3hdLnJnYi5iID0gMjU1LjBmICogY2FsY3VsYXRlX2dhbW1hKEZGTUlOKDEuMGYsIHZbeF0uaW0pLCBnKTsKKyAgICAgICAgY1t4XS5yZ2IuciA9IDI1NS4wZiAqIGNhbGN1bGF0ZV9nYW1tYShGRk1JTigxLjBmLCBjc2NoZW1lWzBdICogdlt4XS5yZSArIGNzY2hlbWVbM10gKiB2W3hdLmltKSwgZyk7CisgICAgICAgIGNbeF0ucmdiLmcgPSAyNTUuMGYgKiBjYWxjdWxhdGVfZ2FtbWEoRkZNSU4oMS4wZiwgY3NjaGVtZVsxXSAqIHZbeF0ucmUgKyBjc2NoZW1lWzRdICogdlt4XS5pbSksIGcpOworICAgICAgICBjW3hdLnJnYi5iID0gMjU1LjBmICogY2FsY3VsYXRlX2dhbW1hKEZGTUlOKDEuMGYsIGNzY2hlbWVbMl0gKiB2W3hdLnJlICsgY3NjaGVtZVs1XSAqIHZbeF0uaW0pLCBnKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHl1dl9mcm9tX2NxdChDb2xvckZsb2F0ICpjLCBjb25zdCBGRlRDb21wbGV4ICp2LCBmbG9hdCBnYW1tYSwgaW50IGxlbikKK3N0YXRpYyB2b2lkIHl1dl9mcm9tX2NxdChDb2xvckZsb2F0ICpjLCBjb25zdCBGRlRDb21wbGV4ICp2LCBmbG9hdCBnYW1tYSwgaW50IGxlbiwgZmxvYXQgY21bM11bM10sIGZsb2F0IGNzY2hlbWVbNl0pCiB7CiAgICAgaW50IHg7CiAgICAgZm9yICh4ID0gMDsgeCA8IGxlbjsgeCsrKSB7CiAgICAgICAgIGZsb2F0IHIsIGcsIGI7Ci0gICAgICAgIHIgPSBjYWxjdWxhdGVfZ2FtbWEoRkZNSU4oMS4wZiwgdlt4XS5yZSksIGdhbW1hKTsKLSAgICAgICAgZyA9IGNhbGN1bGF0ZV9nYW1tYShGRk1JTigxLjBmLCAwLjVmICogKHZbeF0ucmUgKyB2W3hdLmltKSksIGdhbW1hKTsKLSAgICAgICAgYiA9IGNhbGN1bGF0ZV9nYW1tYShGRk1JTigxLjBmLCB2W3hdLmltKSwgZ2FtbWEpOwotICAgICAgICBjW3hdLnl1di55ID0gNjUuNDgxZiAqIHIgKyAxMjguNTUzZiAqIGcgKyAyNC45NjZmICogYjsKLSAgICAgICAgY1t4XS55dXYudSA9IC0zNy43OTdmICogciAtIDc0LjIwM2YgKiBnICsgMTEyLjBmICogYjsKLSAgICAgICAgY1t4XS55dXYudiA9IDExMi4wZiAqIHIgLSA5My43ODZmICogZyAtIDE4LjIxNCAqIGI7CisgICAgICAgIHIgPSBjYWxjdWxhdGVfZ2FtbWEoRkZNSU4oMS4wZiwgY3NjaGVtZVswXSAqIHZbeF0ucmUgKyBjc2NoZW1lWzNdICogdlt4XS5pbSksIGdhbW1hKTsKKyAgICAgICAgZyA9IGNhbGN1bGF0ZV9nYW1tYShGRk1JTigxLjBmLCBjc2NoZW1lWzFdICogdlt4XS5yZSArIGNzY2hlbWVbNF0gKiB2W3hdLmltKSwgZ2FtbWEpOworICAgICAgICBiID0gY2FsY3VsYXRlX2dhbW1hKEZGTUlOKDEuMGYsIGNzY2hlbWVbMl0gKiB2W3hdLnJlICsgY3NjaGVtZVs1XSAqIHZbeF0uaW0pLCBnYW1tYSk7CisgICAgICAgIGNbeF0ueXV2LnkgPSBjbVswXVswXSAqIHIgKyBjbVswXVsxXSAqIGcgKyBjbVswXVsyXSAqIGI7CisgICAgICAgIGNbeF0ueXV2LnUgPSBjbVsxXVswXSAqIHIgKyBjbVsxXVsxXSAqIGcgKyBjbVsxXVsyXSAqIGI7CisgICAgICAgIGNbeF0ueXV2LnYgPSBjbVsyXVswXSAqIHIgKyBjbVsyXVsxXSAqIGcgKyBjbVsyXVsyXSAqIGI7CiAgICAgfQogfQogCiBzdGF0aWMgdm9pZCBkcmF3X2Jhcl9yZ2IoQVZGcmFtZSAqb3V0LCBjb25zdCBmbG9hdCAqaCwgY29uc3QgZmxvYXQgKnJjcF9oLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbG9yRmxvYXQgKmMsIGludCBiYXJfaCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb2xvckZsb2F0ICpjLCBpbnQgYmFyX2gsIGZsb2F0IGJhcl90KQogewogICAgIGludCB4LCB5LCB3ID0gb3V0LT53aWR0aDsKLSAgICBmbG9hdCBtdWwsIGh0LCByY3BfYmFyX2ggPSAxLjBmIC8gYmFyX2g7CisgICAgZmxvYXQgbXVsLCBodCwgcmNwX2Jhcl9oID0gMS4wZiAvIGJhcl9oLCByY3BfYmFyX3QgPSAxLjBmIC8gYmFyX3Q7CiAgICAgdWludDhfdCAqdiA9IG91dC0+ZGF0YVswXSwgKmxwOwogICAgIGludCBscyA9IG91dC0+bGluZXNpemVbMF07CiAKQEAgLTcwMywxOSArNzcyLDQ2IEBACiAgICAgICAgICAgICAgICAgKmxwKysgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtdWwgPSAoaFt4XSAtIGh0KSAqIHJjcF9oW3hdOwotICAgICAgICAgICAgICAgICpscCsrID0gbXVsICogY1t4XS5yZ2IuciArIDAuNWY7Ci0gICAgICAgICAgICAgICAgKmxwKysgPSBtdWwgKiBjW3hdLnJnYi5nICsgMC41ZjsKLSAgICAgICAgICAgICAgICAqbHArKyA9IG11bCAqIGNbeF0ucmdiLmIgKyAwLjVmOworICAgICAgICAgICAgICAgIG11bCA9IChtdWwgPCBiYXJfdCkgPyAobXVsICogcmNwX2Jhcl90KSA6IDEuMGY7CisgICAgICAgICAgICAgICAgKmxwKysgPSBscmludGYobXVsICogY1t4XS5yZ2Iucik7CisgICAgICAgICAgICAgICAgKmxwKysgPSBscmludGYobXVsICogY1t4XS5yZ2IuZyk7CisgICAgICAgICAgICAgICAgKmxwKysgPSBscmludGYobXVsICogY1t4XS5yZ2IuYik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKKyNkZWZpbmUgRFJBV19CQVJfV0lUSF9DSFJPTUEoeCkgXAorZG8geyBcCisgICAgaWYgKGhbeF0gPD0gaHQpIHsgXAorICAgICAgICAqbHB5KysgPSAxNjsgXAorICAgICAgICAqbHB1KysgPSAxMjg7IFwKKyAgICAgICAgKmxwdisrID0gMTI4OyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBtdWwgPSAoaFt4XSAtIGh0KSAqIHJjcF9oW3hdOyBcCisgICAgICAgIG11bCA9IChtdWwgPCBiYXJfdCkgPyAobXVsICogcmNwX2Jhcl90KSA6IDEuMGY7IFwKKyAgICAgICAgKmxweSsrID0gbHJpbnRmKG11bCAqIGNbeF0ueXV2LnkgKyAxNi4wZik7IFwKKyAgICAgICAgKmxwdSsrID0gbHJpbnRmKG11bCAqIGNbeF0ueXV2LnUgKyAxMjguMGYpOyBcCisgICAgICAgICpscHYrKyA9IGxyaW50ZihtdWwgKiBjW3hdLnl1di52ICsgMTI4LjBmKTsgXAorICAgIH0gXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBEUkFXX0JBUl9XSVRIT1VUX0NIUk9NQSh4KSBcCitkbyB7IFwKKyAgICBpZiAoaFt4XSA8PSBodCkgeyBcCisgICAgICAgICpscHkrKyA9IDE2OyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBtdWwgPSAoaFt4XSAtIGh0KSAqIHJjcF9oW3hdOyBcCisgICAgICAgIG11bCA9IChtdWwgPCBiYXJfdCkgPyAobXVsICogcmNwX2Jhcl90KSA6IDEuMGY7IFwKKyAgICAgICAgKmxweSsrID0gbHJpbnRmKG11bCAqIGNbeF0ueXV2LnkgKyAxNi4wZik7IFwKKyAgICB9IFwKK30gd2hpbGUgKDApCisKIHN0YXRpYyB2b2lkIGRyYXdfYmFyX3l1dihBVkZyYW1lICpvdXQsIGNvbnN0IGZsb2F0ICpoLCBjb25zdCBmbG9hdCAqcmNwX2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29sb3JGbG9hdCAqYywgaW50IGJhcl9oKQorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbG9yRmxvYXQgKmMsIGludCBiYXJfaCwgZmxvYXQgYmFyX3QpCiB7CiAgICAgaW50IHgsIHksIHloLCB3ID0gb3V0LT53aWR0aDsKLSAgICBmbG9hdCBtdWwsIGh0LCByY3BfYmFyX2ggPSAxLjBmIC8gYmFyX2g7CisgICAgZmxvYXQgbXVsLCBodCwgcmNwX2Jhcl9oID0gMS4wZiAvIGJhcl9oLCByY3BfYmFyX3QgPSAxLjBmIC8gYmFyX3Q7CiAgICAgdWludDhfdCAqdnkgPSBvdXQtPmRhdGFbMF0sICp2dSA9IG91dC0+ZGF0YVsxXSwgKnZ2ID0gb3V0LT5kYXRhWzJdOwogICAgIHVpbnQ4X3QgKmxweSwgKmxwdSwgKmxwdjsKICAgICBpbnQgbHN5ID0gb3V0LT5saW5lc2l6ZVswXSwgbHN1ID0gb3V0LT5saW5lc2l6ZVsxXSwgbHN2ID0gb3V0LT5saW5lc2l6ZVsyXTsKQEAgLTcyNywzNiArODIzLDE1IEBACiAgICAgICAgIGxweSA9IHZ5ICsgeSAqIGxzeTsKICAgICAgICAgbHB1ID0gdnUgKyB5aCAqIGxzdTsKICAgICAgICAgbHB2ID0gdnYgKyB5aCAqIGxzdjsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgewotICAgICAgICAgICAgaWYgKGhbeF0gPD0gaHQpIHsKLSAgICAgICAgICAgICAgICAqbHB5KysgPSAxNjsKLSAgICAgICAgICAgICAgICAqbHB1KysgPSAxMjg7Ci0gICAgICAgICAgICAgICAgKmxwdisrID0gMTI4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtdWwgPSAoaFt4XSAtIGh0KSAqIHJjcF9oW3hdOwotICAgICAgICAgICAgICAgICpscHkrKyA9IG11bCAqIGNbeF0ueXV2LnkgKyAxNi41ZjsKLSAgICAgICAgICAgICAgICAqbHB1KysgPSBtdWwgKiBjW3hdLnl1di51ICsgMTI4LjVmOwotICAgICAgICAgICAgICAgICpscHYrKyA9IG11bCAqIGNbeF0ueXV2LnYgKyAxMjguNWY7CisgICAgICAgIGlmIChmbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCArPSAyKSB7CisgICAgICAgICAgICAgICAgRFJBV19CQVJfV0lUSF9DSFJPTUEoeCk7CisgICAgICAgICAgICAgICAgRFJBV19CQVJfV0lUSF9DSFJPTUEoeCsxKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8qIHUgYW5kIHYgYXJlIHNraXBwZWQgb24geXV2NDIycCBhbmQgeXV2NDIwcCAqLwotICAgICAgICAgICAgaWYgKGZtdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFApIHsKLSAgICAgICAgICAgICAgICBpZiAoaFt4KzFdIDw9IGh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICpscHkrKyA9IDE2OwotICAgICAgICAgICAgICAgICAgICAqbHB1KysgPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgICpscHYrKyA9IDEyODsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtdWwgPSAoaFt4KzFdIC0gaHQpICogcmNwX2hbeCsxXTsKLSAgICAgICAgICAgICAgICAgICAgKmxweSsrID0gbXVsICogY1t4KzFdLnl1di55ICsgMTYuNWY7Ci0gICAgICAgICAgICAgICAgICAgICpscHUrKyA9IG11bCAqIGNbeCsxXS55dXYudSArIDEyOC41ZjsKLSAgICAgICAgICAgICAgICAgICAgKmxwdisrID0gbXVsICogY1t4KzFdLnl1di52ICsgMTI4LjVmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhbeCsxXSA8PSBodCkgewotICAgICAgICAgICAgICAgICAgICAqbHB5KysgPSAxNjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtdWwgPSAoaFt4KzFdIC0gaHQpICogcmNwX2hbeCsxXTsKLSAgICAgICAgICAgICAgICAgICAgKmxweSsrID0gbXVsICogY1t4KzFdLnl1di55ICsgMTYuNWY7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIERSQVdfQkFSX1dJVEhfQ0hST01BKHgpOworICAgICAgICAgICAgICAgIERSQVdfQkFSX1dJVEhPVVRfQ0hST01BKHgrMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNzY0LDQ2ICs4MzksMjAgQEAKICAgICAgICAgbHB5ID0gdnkgKyAoeSsxKSAqIGxzeTsKICAgICAgICAgbHB1ID0gdnUgKyAoeSsxKSAqIGxzdTsKICAgICAgICAgbHB2ID0gdnYgKyAoeSsxKSAqIGxzdjsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgewotICAgICAgICAgICAgLyogdSBhbmQgdiBhcmUgc2tpcHBlZCBvbiB5dXY0MjBwICovCi0gICAgICAgICAgICBpZiAoZm10ICE9IEFWX1BJWF9GTVRfWVVWNDIwUCkgewotICAgICAgICAgICAgICAgIGlmIChoW3hdIDw9IGh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICpscHkrKyA9IDE2OwotICAgICAgICAgICAgICAgICAgICAqbHB1KysgPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgICpscHYrKyA9IDEyODsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtdWwgPSAoaFt4XSAtIGh0KSAqIHJjcF9oW3hdOwotICAgICAgICAgICAgICAgICAgICAqbHB5KysgPSBtdWwgKiBjW3hdLnl1di55ICsgMTYuNWY7Ci0gICAgICAgICAgICAgICAgICAgICpscHUrKyA9IG11bCAqIGNbeF0ueXV2LnUgKyAxMjguNWY7Ci0gICAgICAgICAgICAgICAgICAgICpscHYrKyA9IG11bCAqIGNbeF0ueXV2LnYgKyAxMjguNWY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoaFt4XSA8PSBodCkgewotICAgICAgICAgICAgICAgICAgICAqbHB5KysgPSAxNjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtdWwgPSAoaFt4XSAtIGh0KSAqIHJjcF9oW3hdOwotICAgICAgICAgICAgICAgICAgICAqbHB5KysgPSBtdWwgKiBjW3hdLnl1di55ICsgMTYuNWY7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBpZiAoZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIERSQVdfQkFSX1dJVEhfQ0hST01BKHgpOworICAgICAgICAgICAgICAgIERSQVdfQkFSX1dJVEhfQ0hST01BKHgrMSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiB1IGFuZCB2IGFyZSBza2lwcGVkIG9uIHl1djQyMnAgYW5kIHl1djQyMHAgKi8KLSAgICAgICAgICAgIGlmIChvdXQtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQ0NFApIHsKLSAgICAgICAgICAgICAgICBpZiAoaFt4KzFdIDw9IGh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICpscHkrKyA9IDE2OwotICAgICAgICAgICAgICAgICAgICAqbHB1KysgPSAxMjg7Ci0gICAgICAgICAgICAgICAgICAgICpscHYrKyA9IDEyODsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtdWwgPSAoaFt4KzFdIC0gaHQpICogcmNwX2hbeCsxXTsKLSAgICAgICAgICAgICAgICAgICAgKmxweSsrID0gbXVsICogY1t4KzFdLnl1di55ICsgMTYuNWY7Ci0gICAgICAgICAgICAgICAgICAgICpscHUrKyA9IG11bCAqIGNbeCsxXS55dXYudSArIDEyOC41ZjsKLSAgICAgICAgICAgICAgICAgICAgKmxwdisrID0gbXVsICogY1t4KzFdLnl1di52ICsgMTI4LjVmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhbeCsxXSA8PSBodCkgewotICAgICAgICAgICAgICAgICAgICAqbHB5KysgPSAxNjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtdWwgPSAoaFt4KzFdIC0gaHQpICogcmNwX2hbeCsxXTsKLSAgICAgICAgICAgICAgICAgICAgKmxweSsrID0gbXVsICogY1t4KzFdLnl1di55ICsgMTYuNWY7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlApIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBEUkFXX0JBUl9XSVRIX0NIUk9NQSh4KTsKKyAgICAgICAgICAgICAgICBEUkFXX0JBUl9XSVRIT1VUX0NIUk9NQSh4KzEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIERSQVdfQkFSX1dJVEhPVVRfQ0hST01BKHgpOworICAgICAgICAgICAgICAgIERSQVdfQkFSX1dJVEhPVVRfQ0hST01BKHgrMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC04MTksMjAgKzg2OCwxMDIgQEAKICAgICAgICAgbHAgPSBvdXQtPmRhdGFbMF0gKyAob2ZmICsgeSkgKiBvdXQtPmxpbmVzaXplWzBdOwogICAgICAgICBscGEgPSBheGlzLT5kYXRhWzBdICsgeSAqIGF4aXMtPmxpbmVzaXplWzBdOwogICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgICAgICBhID0gcmNwXzI1NSAqIGxwYVszXTsKLSAgICAgICAgICAgICpscCsrID0gYSAqIGxwYVswXSArICgxLjBmIC0gYSkgKiBjW3hdLnJnYi5yICsgMC41ZjsKLSAgICAgICAgICAgICpscCsrID0gYSAqIGxwYVsxXSArICgxLjBmIC0gYSkgKiBjW3hdLnJnYi5nICsgMC41ZjsKLSAgICAgICAgICAgICpscCsrID0gYSAqIGxwYVsyXSArICgxLjBmIC0gYSkgKiBjW3hdLnJnYi5iICsgMC41ZjsKKyAgICAgICAgICAgIGlmICghbHBhWzNdKSB7CisgICAgICAgICAgICAgICAgKmxwKysgPSBscmludGYoY1t4XS5yZ2Iucik7CisgICAgICAgICAgICAgICAgKmxwKysgPSBscmludGYoY1t4XS5yZ2IuZyk7CisgICAgICAgICAgICAgICAgKmxwKysgPSBscmludGYoY1t4XS5yZ2IuYik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGxwYVszXSA9PSAyNTUpIHsKKyAgICAgICAgICAgICAgICAqbHArKyA9IGxwYVswXTsKKyAgICAgICAgICAgICAgICAqbHArKyA9IGxwYVsxXTsKKyAgICAgICAgICAgICAgICAqbHArKyA9IGxwYVsyXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYSA9IHJjcF8yNTUgKiBscGFbM107CisgICAgICAgICAgICAgICAgKmxwKysgPSBscmludGYoYSAqIGxwYVswXSArICgxLjBmIC0gYSkgKiBjW3hdLnJnYi5yKTsKKyAgICAgICAgICAgICAgICAqbHArKyA9IGxyaW50ZihhICogbHBhWzFdICsgKDEuMGYgLSBhKSAqIGNbeF0ucmdiLmcpOworICAgICAgICAgICAgICAgICpscCsrID0gbHJpbnRmKGEgKiBscGFbMl0gKyAoMS4wZiAtIGEpICogY1t4XS5yZ2IuYik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBscGEgKz0gNDsKICAgICAgICAgfQogICAgIH0KIH0KIAorI2RlZmluZSBCTEVORF9XSVRIX0NIUk9NQShjKSBcCitkbyB7IFwKKyAgICBpZiAoISpscGFhKSB7IFwKKyAgICAgICAgKmxweSA9IGxyaW50ZihjLnl1di55ICsgMTYuMGYpOyBcCisgICAgICAgICpscHUgPSBscmludGYoYy55dXYudSArIDEyOC4wZik7IFwKKyAgICAgICAgKmxwdiA9IGxyaW50ZihjLnl1di52ICsgMTI4LjBmKTsgXAorICAgIH0gZWxzZSBpZiAoMjU1ID09ICpscGFhKSB7IFwKKyAgICAgICAgKmxweSA9ICpscGF5OyBcCisgICAgICAgICpscHUgPSAqbHBhdTsgXAorICAgICAgICAqbHB2ID0gKmxwYXY7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIGZsb2F0IGEgPSAoMS4wZi8yNTUuMGYpICogKCpscGFhKTsgXAorICAgICAgICAqbHB5ID0gbHJpbnRmKGEgKiAoKmxwYXkpICsgKDEuMGYgLSBhKSAqIChjLnl1di55ICsgMTYuMGYpKTsgXAorICAgICAgICAqbHB1ID0gbHJpbnRmKGEgKiAoKmxwYXUpICsgKDEuMGYgLSBhKSAqIChjLnl1di51ICsgMTI4LjBmKSk7IFwKKyAgICAgICAgKmxwdiA9IGxyaW50ZihhICogKCpscGF2KSArICgxLjBmIC0gYSkgKiAoYy55dXYudiArIDEyOC4wZikpOyBcCisgICAgfSBcCisgICAgbHB5Kys7IGxwdSsrOyBscHYrKzsgXAorICAgIGxwYXkrKzsgbHBhdSsrOyBscGF2Kys7IGxwYWErKzsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBCTEVORF9XSVRIT1VUX0NIUk9NQShjLCBhbHBoYV9pbmMpIFwKK2RvIHsgXAorICAgIGlmICghKmxwYWEpIHsgXAorICAgICAgICAqbHB5ID0gbHJpbnRmKGMueXV2LnkgKyAxNi4wZik7IFwKKyAgICB9IGVsc2UgaWYgKDI1NSA9PSAqbHBhYSkgeyBcCisgICAgICAgICpscHkgPSAqbHBheTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZmxvYXQgYSA9ICgxLjBmLzI1NS4wZikgKiAoKmxwYWEpOyBcCisgICAgICAgICpscHkgPSBscmludGYoYSAqICgqbHBheSkgKyAoMS4wZiAtIGEpICogKGMueXV2LnkgKyAxNi4wZikpOyBcCisgICAgfSBcCisgICAgbHB5Kys7IFwKKyAgICBscGF5Kys7IGxwYWEgKz0gYWxwaGFfaW5jOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEJMRU5EX0NIUk9NQTIoYykgXAorZG8geyBcCisgICAgaWYgKCFscGFhWzBdICYmICFscGFhWzFdKSB7IFwKKyAgICAgICAgKmxwdSA9IGxyaW50ZihjLnl1di51ICsgMTI4LjBmKTsgXAorICAgICAgICAqbHB2ID0gbHJpbnRmKGMueXV2LnYgKyAxMjguMGYpOyBcCisgICAgfSBlbHNlIGlmICgyNTUgPT0gbHBhYVswXSAmJiAyNTUgPT0gbHBhYVsxXSkgeyBcCisgICAgICAgICpscHUgPSAqbHBhdTsgKmxwdiA9ICpscGF2OyBcCisgICAgfSBlbHNlIHsgXAorICAgICAgICBmbG9hdCBhMCA9ICgwLjVmLzI1NS4wZikgKiBscGFhWzBdOyBcCisgICAgICAgIGZsb2F0IGExID0gKDAuNWYvMjU1LjBmKSAqIGxwYWFbMV07IFwKKyAgICAgICAgZmxvYXQgYiA9IDEuMGYgLSBhMCAtIGExOyBcCisgICAgICAgICpscHUgPSBscmludGYoYTAgKiBscGF1WzBdICsgYTEgKiBscGF1WzFdICsgYiAqIChjLnl1di51ICsgMTI4LjBmKSk7IFwKKyAgICAgICAgKmxwdiA9IGxyaW50ZihhMCAqIGxwYXZbMF0gKyBhMSAqIGxwYXZbMV0gKyBiICogKGMueXV2LnYgKyAxMjguMGYpKTsgXAorICAgIH0gXAorICAgIGxwYXUgKz0gMjsgbHBhdiArPSAyOyBscGFhKys7IGxwdSsrOyBscHYrKzsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBCTEVORF9DSFJPTUEyeDIoYykgXAorZG8geyBcCisgICAgaWYgKCFscGFhWzBdICYmICFscGFhWzFdICYmICFscGFhW2xzYWFdICYmICFscGFhW2xzYWErMV0pIHsgXAorICAgICAgICAqbHB1ID0gbHJpbnRmKGMueXV2LnUgKyAxMjguMGYpOyBcCisgICAgICAgICpscHYgPSBscmludGYoYy55dXYudiArIDEyOC4wZik7IFwKKyAgICB9IGVsc2UgaWYgKDI1NSA9PSBscGFhWzBdICYmIDI1NSA9PSBscGFhWzFdICYmIFwKKyAgICAgICAgICAgICAgIDI1NSA9PSBscGFhW2xzYWFdICYmIDI1NSA9PSBscGFhW2xzYWErMV0pIHsgXAorICAgICAgICAqbHB1ID0gKmxwYXU7ICpscHYgPSAqbHBhdjsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgZmxvYXQgYTAgPSAoMC4yNWYvMjU1LjBmKSAqIGxwYWFbMF07IFwKKyAgICAgICAgZmxvYXQgYTEgPSAoMC4yNWYvMjU1LjBmKSAqIGxwYWFbMV07IFwKKyAgICAgICAgZmxvYXQgYTIgPSAoMC4yNWYvMjU1LjBmKSAqIGxwYWFbbHNhYV07IFwKKyAgICAgICAgZmxvYXQgYTMgPSAoMC4yNWYvMjU1LjBmKSAqIGxwYWFbbHNhYSsxXTsgXAorICAgICAgICBmbG9hdCBiID0gMS4wZiAtIGEwIC0gYTEgLSBhMiAtIGEzOyBcCisgICAgICAgICpscHUgPSBscmludGYoYTAgKiBscGF1WzBdICsgYTEgKiBscGF1WzFdICsgYTIgKiBscGF1W2xzYXVdICsgYTMgKiBscGF1W2xzYXUrMV0gXAorICAgICAgICAgICAgICAgICAgICArIGIgKiAoYy55dXYudSArIDEyOC4wZikpOyBcCisgICAgICAgICpscHYgPSBscmludGYoYTAgKiBscGF2WzBdICsgYTEgKiBscGF2WzFdICsgYTIgKiBscGF2W2xzYXZdICsgYTMgKiBscGF2W2xzYXYrMV0gXAorICAgICAgICAgICAgICAgICAgICArIGIgKiAoYy55dXYudiArIDEyOC4wZikpOyBcCisgICAgfSBcCisgICAgbHBhdSArPSAyOyBscGF2ICs9IDI7IGxwYWErKzsgbHB1Kys7IGxwdisrOyBcCit9IHdoaWxlICgwKQorCiBzdGF0aWMgdm9pZCBkcmF3X2F4aXNfeXV2KEFWRnJhbWUgKm91dCwgQVZGcmFtZSAqYXhpcywgY29uc3QgQ29sb3JGbG9hdCAqYywgaW50IG9mZikKIHsKICAgICBpbnQgZm10ID0gb3V0LT5mb3JtYXQsIHgsIHksIHloLCB3ID0gYXhpcy0+d2lkdGgsIGggPSBheGlzLT5oZWlnaHQ7CiAgICAgaW50IG9mZmggPSAoZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgPyBvZmYgLyAyIDogb2ZmOwotICAgIGZsb2F0IGEsIHJjcF8yNTUgPSAxLjBmIC8gMjU1LjBmOwogICAgIHVpbnQ4X3QgKnZ5ID0gb3V0LT5kYXRhWzBdLCAqdnUgPSBvdXQtPmRhdGFbMV0sICp2diA9IG91dC0+ZGF0YVsyXTsKICAgICB1aW50OF90ICp2YXkgPSBheGlzLT5kYXRhWzBdLCAqdmF1ID0gYXhpcy0+ZGF0YVsxXSwgKnZhdiA9IGF4aXMtPmRhdGFbMl0sICp2YWEgPSBheGlzLT5kYXRhWzNdOwogICAgIGludCBsc3kgPSBvdXQtPmxpbmVzaXplWzBdLCBsc3UgPSBvdXQtPmxpbmVzaXplWzFdLCBsc3YgPSBvdXQtPmxpbmVzaXplWzJdOwpAQCAtODQ1LDIwICs5NzYsMjUgQEAKICAgICAgICAgbHB1ID0gdnUgKyAob2ZmaCArIHloKSAqIGxzdTsKICAgICAgICAgbHB2ID0gdnYgKyAob2ZmaCArIHloKSAqIGxzdjsKICAgICAgICAgbHBheSA9IHZheSArIHkgKiBsc2F5OwotICAgICAgICBscGF1ID0gdmF1ICsgeWggKiBsc2F1OwotICAgICAgICBscGF2ID0gdmF2ICsgeWggKiBsc2F2OworICAgICAgICBscGF1ID0gdmF1ICsgeSAqIGxzYXU7CisgICAgICAgIGxwYXYgPSB2YXYgKyB5ICogbHNhdjsKICAgICAgICAgbHBhYSA9IHZhYSArIHkgKiBsc2FhOwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCArPSAyKSB7Ci0gICAgICAgICAgICBhID0gcmNwXzI1NSAqICgqbHBhYSsrKTsKLSAgICAgICAgICAgICpscHkrKyA9IGEgKiAoKmxwYXkrKykgKyAoMS4wZiAtIGEpICogKGNbeF0ueXV2LnkgKyAxNi4wZikgKyAwLjVmOwotICAgICAgICAgICAgKmxwdSsrID0gYSAqICgqbHBhdSsrKSArICgxLjBmIC0gYSkgKiAoY1t4XS55dXYudSArIDEyOC4wZikgKyAwLjVmOwotICAgICAgICAgICAgKmxwdisrID0gYSAqICgqbHBhdisrKSArICgxLjBmIC0gYSkgKiAoY1t4XS55dXYudiArIDEyOC4wZikgKyAwLjVmOwotICAgICAgICAgICAgLyogdSBhbmQgdiBhcmUgc2tpcHBlZCBvbiB5dXY0MjJwIGFuZCB5dXY0MjBwICovCi0gICAgICAgICAgICBhID0gcmNwXzI1NSAqICgqbHBhYSsrKTsKLSAgICAgICAgICAgICpscHkrKyA9IGEgKiAoKmxwYXkrKykgKyAoMS4wZiAtIGEpICogKGNbeCsxXS55dXYueSArIDE2LjBmKSArIDAuNWY7Ci0gICAgICAgICAgICBpZiAoZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UCkgewotICAgICAgICAgICAgICAgICpscHUrKyA9IGEgKiAoKmxwYXUrKykgKyAoMS4wZiAtIGEpICogKGNbeCsxXS55dXYudSArIDEyOC4wZikgKyAwLjVmOwotICAgICAgICAgICAgICAgICpscHYrKyA9IGEgKiAoKmxwYXYrKykgKyAoMS4wZiAtIGEpICogKGNbeCsxXS55dXYudiArIDEyOC4wZikgKyAwLjVmOworICAgICAgICBpZiAoZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIEJMRU5EX1dJVEhfQ0hST01BKGNbeF0pOworICAgICAgICAgICAgICAgIEJMRU5EX1dJVEhfQ0hST01BKGNbeCsxXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIEJMRU5EX1dJVEhPVVRfQ0hST01BKGNbeF0sIDApOworICAgICAgICAgICAgICAgIEJMRU5EX0NIUk9NQTIoY1t4XSk7CisgICAgICAgICAgICAgICAgQkxFTkRfV0lUSE9VVF9DSFJPTUEoY1t4KzFdLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBCTEVORF9XSVRIT1VUX0NIUk9NQShjW3hdLCAwKTsKKyAgICAgICAgICAgICAgICBCTEVORF9DSFJPTUEyeDIoY1t4XSk7CisgICAgICAgICAgICAgICAgQkxFTkRfV0lUSE9VVF9DSFJPTUEoY1t4KzFdLCAxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC04NjksMjAgKzEwMDUsMjEgQEAKICAgICAgICAgbHBhdSA9IHZhdSArICh5ICsgMSkgKiBsc2F1OwogICAgICAgICBscGF2ID0gdmF2ICsgKHkgKyAxKSAqIGxzYXY7CiAgICAgICAgIGxwYWEgPSB2YWEgKyAoeSArIDEpICogbHNhYTsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dC0+d2lkdGg7IHggKz0gMikgewotICAgICAgICAgICAgLyogdSBhbmQgdiBhcmUgc2tpcHBlZCBvbiB5dXY0MjBwICovCi0gICAgICAgICAgICBhID0gcmNwXzI1NSAqICgqbHBhYSsrKTsKLSAgICAgICAgICAgICpscHkrKyA9IGEgKiAoKmxwYXkrKykgKyAoMS4wZiAtIGEpICogKGNbeF0ueXV2LnkgKyAxNi4wZikgKyAwLjVmOwotICAgICAgICAgICAgaWYgKGZtdCAhPSBBVl9QSVhfRk1UX1lVVjQyMFApIHsKLSAgICAgICAgICAgICAgICAqbHB1KysgPSBhICogKCpscGF1KyspICsgKDEuMGYgLSBhKSAqIChjW3hdLnl1di51ICsgMTI4LjBmKSArIDAuNWY7Ci0gICAgICAgICAgICAgICAgKmxwdisrID0gYSAqICgqbHBhdisrKSArICgxLjBmIC0gYSkgKiAoY1t4XS55dXYudiArIDEyOC4wZikgKyAwLjVmOworICAgICAgICBpZiAoZm10ID09IEFWX1BJWF9GTVRfWVVWNDQ0UCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIEJMRU5EX1dJVEhfQ0hST01BKGNbeF0pOworICAgICAgICAgICAgICAgIEJMRU5EX1dJVEhfQ0hST01BKGNbeCsxXSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiB1IGFuZCB2IGFyZSBza2lwcGVkIG9uIHl1djQyMnAgYW5kIHl1djQyMHAgKi8KLSAgICAgICAgICAgIGEgPSByY3BfMjU1ICogKCpscGFhKyspOwotICAgICAgICAgICAgKmxweSsrID0gYSAqICgqbHBheSsrKSArICgxLjBmIC0gYSkgKiAoY1t4KzFdLnl1di55ICsgMTYuMGYpICsgMC41ZjsKLSAgICAgICAgICAgIGlmIChmbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQKSB7Ci0gICAgICAgICAgICAgICAgKmxwdSsrID0gYSAqICgqbHBhdSsrKSArICgxLjBmIC0gYSkgKiAoY1t4KzFdLnl1di51ICsgMTI4LjBmKSArIDAuNWY7Ci0gICAgICAgICAgICAgICAgKmxwdisrID0gYSAqICgqbHBhdisrKSArICgxLjBmIC0gYSkgKiAoY1t4KzFdLnl1di52ICsgMTI4LjBmKSArIDAuNWY7CisgICAgICAgIH0gZWxzZSBpZiAoZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgeworICAgICAgICAgICAgICAgIEJMRU5EX1dJVEhPVVRfQ0hST01BKGNbeF0sIDApOworICAgICAgICAgICAgICAgIEJMRU5EX0NIUk9NQTIoY1t4XSk7CisgICAgICAgICAgICAgICAgQkxFTkRfV0lUSE9VVF9DSFJPTUEoY1t4KzFdLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4ICs9IDIpIHsKKyAgICAgICAgICAgICAgICBCTEVORF9XSVRIT1VUX0NIUk9NQShjW3hdLCAxKTsKKyAgICAgICAgICAgICAgICBCTEVORF9XSVRIT1VUX0NIUk9NQShjW3grMV0sIDEpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtOTE4LDkgKzEwNTUsOSBAQAogICAgIHVpbnQ4X3QgKmxwID0gc29uby0+ZGF0YVswXSArIGlkeCAqIHNvbm8tPmxpbmVzaXplWzBdOwogCiAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgewotICAgICAgICAqbHArKyA9IGNbeF0ucmdiLnIgKyAwLjVmOwotICAgICAgICAqbHArKyA9IGNbeF0ucmdiLmcgKyAwLjVmOwotICAgICAgICAqbHArKyA9IGNbeF0ucmdiLmIgKyAwLjVmOworICAgICAgICAqbHArKyA9IGxyaW50ZihjW3hdLnJnYi5yKTsKKyAgICAgICAgKmxwKysgPSBscmludGYoY1t4XS5yZ2IuZyk7CisgICAgICAgICpscCsrID0gbHJpbnRmKGNbeF0ucmdiLmIpOwogICAgIH0KIH0KIApAQCAtOTMyLDEzICsxMDY5LDEzIEBACiAgICAgdWludDhfdCAqbHB2ID0gc29uby0+ZGF0YVsyXSArIGlkeCAqIHNvbm8tPmxpbmVzaXplWzJdOwogCiAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHggKz0gMikgewotICAgICAgICAqbHB5KysgPSBjW3hdLnl1di55ICsgMTYuNWY7Ci0gICAgICAgICpscHUrKyA9IGNbeF0ueXV2LnUgKyAxMjguNWY7Ci0gICAgICAgICpscHYrKyA9IGNbeF0ueXV2LnYgKyAxMjguNWY7Ci0gICAgICAgICpscHkrKyA9IGNbeCsxXS55dXYueSArIDE2LjVmOworICAgICAgICAqbHB5KysgPSBscmludGYoY1t4XS55dXYueSArIDE2LjBmKTsKKyAgICAgICAgKmxwdSsrID0gbHJpbnRmKGNbeF0ueXV2LnUgKyAxMjguMGYpOworICAgICAgICAqbHB2KysgPSBscmludGYoY1t4XS55dXYudiArIDEyOC4wZik7CisgICAgICAgICpscHkrKyA9IGxyaW50ZihjW3grMV0ueXV2LnkgKyAxNi4wZik7CiAgICAgICAgIGlmIChmbXQgPT0gQVZfUElYX0ZNVF9ZVVY0NDRQKSB7Ci0gICAgICAgICAgICAqbHB1KysgPSBjW3grMV0ueXV2LnUgKyAxMjguNWY7Ci0gICAgICAgICAgICAqbHB2KysgPSBjW3grMV0ueXV2LnYgKyAxMjguNWY7CisgICAgICAgICAgICAqbHB1KysgPSBscmludGYoY1t4KzFdLnl1di51ICsgMTI4LjBmKTsKKyAgICAgICAgICAgICpscHYrKyA9IGxyaW50ZihjW3grMV0ueXV2LnYgKyAxMjguMGYpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtOTg0LDQzICsxMTIxLDEzNSBAQAogICAgIH0KIAogICAgIGlmIChzLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0IyNCkKLSAgICAgICAgcmdiX2Zyb21fY3F0KHMtPmNfYnVmLCBzLT5jcXRfcmVzdWx0LCBzLT5zb25vX2csIHMtPndpZHRoKTsKKyAgICAgICAgcmdiX2Zyb21fY3F0KHMtPmNfYnVmLCBzLT5jcXRfcmVzdWx0LCBzLT5zb25vX2csIHMtPndpZHRoLCBzLT5jc2NoZW1lX3YpOwogICAgIGVsc2UKLSAgICAgICAgeXV2X2Zyb21fY3F0KHMtPmNfYnVmLCBzLT5jcXRfcmVzdWx0LCBzLT5zb25vX2csIHMtPndpZHRoKTsKKyAgICAgICAgeXV2X2Zyb21fY3F0KHMtPmNfYnVmLCBzLT5jcXRfcmVzdWx0LCBzLT5zb25vX2csIHMtPndpZHRoLCBzLT5jbWF0cml4LCBzLT5jc2NoZW1lX3YpOwogfQogCi1zdGF0aWMgaW50IHBsb3RfY3F0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQorc3RhdGljIGludCBwbG90X2NxdChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqKmZyYW1lb3V0KQogewogICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKICAgICBTaG93Q1FUQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQ2NF90IGxhc3RfdGltZSwgY3VyX3RpbWU7CisKKyNkZWZpbmUgVVBEQVRFX1RJTUUodCkgXAorICAgIGN1cl90aW1lID0gYXZfZ2V0dGltZSgpOyBcCisgICAgdCArPSBjdXJfdGltZSAtIGxhc3RfdGltZTsgXAorICAgIGxhc3RfdGltZSA9IGN1cl90aW1lCisKKyAgICBsYXN0X3RpbWUgPSBhdl9nZXR0aW1lKCk7CiAKICAgICBtZW1jcHkocy0+ZmZ0X3Jlc3VsdCwgcy0+ZmZ0X2RhdGEsIHMtPmZmdF9sZW4gKiBzaXplb2YoKnMtPmZmdF9kYXRhKSk7CisgICAgaWYgKHMtPmF0dGFja19kYXRhKSB7CisgICAgICAgIGludCBrOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+cmVtYWluaW5nX2ZpbGxfbWF4OyBrKyspIHsKKyAgICAgICAgICAgIHMtPmZmdF9yZXN1bHRbcy0+ZmZ0X2xlbi8yK2tdLnJlICo9IHMtPmF0dGFja19kYXRhW2tdOworICAgICAgICAgICAgcy0+ZmZ0X3Jlc3VsdFtzLT5mZnRfbGVuLzIra10uaW0gKj0gcy0+YXR0YWNrX2RhdGFba107CisgICAgICAgIH0KKyAgICB9CisKICAgICBhdl9mZnRfcGVybXV0ZShzLT5mZnRfY3R4LCBzLT5mZnRfcmVzdWx0KTsKICAgICBhdl9mZnRfY2FsYyhzLT5mZnRfY3R4LCBzLT5mZnRfcmVzdWx0KTsKICAgICBzLT5mZnRfcmVzdWx0W3MtPmZmdF9sZW5dID0gcy0+ZmZ0X3Jlc3VsdFswXTsKKyAgICBVUERBVEVfVElNRShzLT5mZnRfdGltZSk7CisKICAgICBzLT5jcXRfY2FsYyhzLT5jcXRfcmVzdWx0LCBzLT5mZnRfcmVzdWx0LCBzLT5jb2VmZnMsIHMtPmNxdF9sZW4sIHMtPmZmdF9sZW4pOworICAgIFVQREFURV9USU1FKHMtPmNxdF90aW1lKTsKKwogICAgIHByb2Nlc3NfY3F0KHMpOwotICAgIGlmIChzLT5zb25vX2gpCisgICAgVVBEQVRFX1RJTUUocy0+cHJvY2Vzc19jcXRfdGltZSk7CisKKyAgICBpZiAocy0+c29ub19oKSB7CiAgICAgICAgIHMtPnVwZGF0ZV9zb25vKHMtPnNvbm9fZnJhbWUsIHMtPmNfYnVmLCBzLT5zb25vX2lkeCk7CisgICAgICAgIFVQREFURV9USU1FKHMtPnVwZGF0ZV9zb25vX3RpbWUpOworICAgIH0KKwogICAgIGlmICghcy0+c29ub19jb3VudCkgewotICAgICAgICBBVkZyYW1lICpvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBBVkZyYW1lICpvdXQgPSAqZnJhbWVvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOwogICAgICAgICBpZiAoIW91dCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGlmIChzLT5iYXJfaCkKLSAgICAgICAgICAgIHMtPmRyYXdfYmFyKG91dCwgcy0+aF9idWYsIHMtPnJjcF9oX2J1Ziwgcy0+Y19idWYsIHMtPmJhcl9oKTsKLSAgICAgICAgaWYgKHMtPmF4aXNfaCkKKyAgICAgICAgb3V0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfbWFrZV9xKDEsIDEpOworICAgICAgICBvdXQtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfTVBFRzsKKyAgICAgICAgb3V0LT5jb2xvcnNwYWNlID0gcy0+Y3NwOworICAgICAgICBVUERBVEVfVElNRShzLT5hbGxvY190aW1lKTsKKworICAgICAgICBpZiAocy0+YmFyX2gpIHsKKyAgICAgICAgICAgIHMtPmRyYXdfYmFyKG91dCwgcy0+aF9idWYsIHMtPnJjcF9oX2J1Ziwgcy0+Y19idWYsIHMtPmJhcl9oLCBzLT5iYXJfdCk7CisgICAgICAgICAgICBVUERBVEVfVElNRShzLT5iYXJfdGltZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+YXhpc19oKSB7CiAgICAgICAgICAgICBzLT5kcmF3X2F4aXMob3V0LCBzLT5heGlzX2ZyYW1lLCBzLT5jX2J1Ziwgcy0+YmFyX2gpOwotICAgICAgICBpZiAocy0+c29ub19oKQorICAgICAgICAgICAgVVBEQVRFX1RJTUUocy0+YXhpc190aW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5zb25vX2gpIHsKICAgICAgICAgICAgIHMtPmRyYXdfc29ubyhvdXQsIHMtPnNvbm9fZnJhbWUsIHMtPmJhcl9oICsgcy0+YXhpc19oLCBzLT5zb25vX2lkeCk7Ci0gICAgICAgIG91dC0+cHRzID0gcy0+ZnJhbWVfY291bnQ7Ci0gICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwotICAgICAgICBzLT5mcmFtZV9jb3VudCsrOworICAgICAgICAgICAgVVBEQVRFX1RJTUUocy0+c29ub190aW1lKTsKKyAgICAgICAgfQorICAgICAgICBvdXQtPnB0cyA9IHMtPm5leHRfcHRzOworICAgICAgICBzLT5uZXh0X3B0cyArPSBQVFNfU1RFUDsKICAgICB9CiAgICAgcy0+c29ub19jb3VudCA9IChzLT5zb25vX2NvdW50ICsgMSkgJSBzLT5jb3VudDsKICAgICBpZiAocy0+c29ub19oKQogICAgICAgICBzLT5zb25vX2lkeCA9IChzLT5zb25vX2lkeCArIHMtPnNvbm9faCAtIDEpICUgcy0+c29ub19oOwotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfY29sb3JtYXRyaXgoU2hvd0NRVENvbnRleHQgKnMpCit7CisgICAgZG91YmxlIGtyLCBrZywga2I7CisKKyAgICAvKiBmcm9tIHZmX2NvbG9yc3BhY2UuYyAqLworICAgIHN3aXRjaCAocy0+Y3NwKSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMtPmN0eCwgQVZfTE9HX1dBUk5JTkcsICJ1bnN1cHBvcnRlZCBjb2xvcnNwYWNlLCBzZXR0aW5nIGl0IHRvIHVuc3BlY2lmaWVkLlxuIik7CisgICAgICAgIHMtPmNzcCA9IEFWQ09MX1NQQ19VTlNQRUNJRklFRDsKKyAgICBjYXNlIEFWQ09MX1NQQ19VTlNQRUNJRklFRDoKKyAgICBjYXNlIEFWQ09MX1NQQ19CVDQ3MEJHOgorICAgIGNhc2UgQVZDT0xfU1BDX1NNUFRFMTcwTToKKyAgICAgICAga3IgPSAwLjI5OTsga2IgPSAwLjExNDsgYnJlYWs7CisgICAgY2FzZSBBVkNPTF9TUENfQlQ3MDk6CisgICAgICAgIGtyID0gMC4yMTI2OyBrYiA9IDAuMDcyMjsgYnJlYWs7CisgICAgY2FzZSBBVkNPTF9TUENfRkNDOgorICAgICAgICBrciA9IDAuMzA7IGtiID0gMC4xMTsgYnJlYWs7CisgICAgY2FzZSBBVkNPTF9TUENfU01QVEUyNDBNOgorICAgICAgICBrciA9IDAuMjEyOyBrYiA9IDAuMDg3OyBicmVhazsKKyAgICBjYXNlIEFWQ09MX1NQQ19CVDIwMjBfTkNMOgorICAgICAgICBrciA9IDAuMjYyNzsga2IgPSAwLjA1OTM7IGJyZWFrOworICAgIH0KKworICAgIGtnID0gMS4wIC0ga3IgLSBrYjsKKyAgICBzLT5jbWF0cml4WzBdWzBdID0gMjE5LjAgKiBrcjsKKyAgICBzLT5jbWF0cml4WzBdWzFdID0gMjE5LjAgKiBrZzsKKyAgICBzLT5jbWF0cml4WzBdWzJdID0gMjE5LjAgKiBrYjsKKyAgICBzLT5jbWF0cml4WzFdWzBdID0gLTExMi4wICoga3IgLyAoMS4wIC0ga2IpOworICAgIHMtPmNtYXRyaXhbMV1bMV0gPSAtMTEyLjAgKiBrZyAvICgxLjAgLSBrYik7CisgICAgcy0+Y21hdHJpeFsxXVsyXSA9IDExMi4wOworICAgIHMtPmNtYXRyaXhbMl1bMF0gPSAxMTIuMDsKKyAgICBzLT5jbWF0cml4WzJdWzFdID0gLTExMi4wICoga2cgLyAoMS4wIC0ga3IpOworICAgIHMtPmNtYXRyaXhbMl1bMl0gPSAtMTEyLjAgKiBrYiAvICgxLjAgLSBrcik7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9jc2NoZW1lKFNob3dDUVRDb250ZXh0ICpzKQoreworICAgIGNoYXIgdGFpbFsyXTsKKyAgICBpbnQgazsKKworICAgIGlmIChzc2NhbmYocy0+Y3NjaGVtZSwgIiAlZiB8ICVmIHwgJWYgfCAlZiB8ICVmIHwgJWYgJTFzIiwgJnMtPmNzY2hlbWVfdlswXSwKKyAgICAgICAgJnMtPmNzY2hlbWVfdlsxXSwgJnMtPmNzY2hlbWVfdlsyXSwgJnMtPmNzY2hlbWVfdlszXSwgJnMtPmNzY2hlbWVfdls0XSwKKyAgICAgICAgJnMtPmNzY2hlbWVfdls1XSwgdGFpbCkgIT0gNikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZm9yIChrID0gMDsgayA8IDY7IGsrKykKKyAgICAgICAgaWYgKGlzbmFuKHMtPmNzY2hlbWVfdltrXSkgfHwgcy0+Y3NjaGVtZV92W2tdIDwgMC4wZiB8fCBzLT5jc2NoZW1lX3Zba10gPiAxLjBmKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfbG9nKHMtPmN0eCwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjc2NoZW1lLlxuIik7CisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIH0KIAogLyogbWFpbiBmaWx0ZXIgY29udHJvbCAqLwpAQCAtMTA3Niw3ICsxMzA1LDkgQEAKICAgICAgICAgfSB3aGlsZShzLT5mY291bnQgKiBzLT53aWR0aCA8IDE5MjAgJiYgcy0+ZmNvdW50IDwgMTApOwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIGluaXRfY29sb3JtYXRyaXgocyk7CisKKyAgICByZXR1cm4gaW5pdF9jc2NoZW1lKHMpOwogfQogCiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKQEAgLTExMzMsNyArMTM2NCw3IEBACiAgICAgcy0+Zm9ybWF0ID0gb3V0bGluay0+Zm9ybWF0OwogICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9tYWtlX3EoMSwgMSk7CiAgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IHMtPnJhdGU7Ci0gICAgb3V0bGluay0+dGltZV9iYXNlID0gYXZfaW52X3Eocy0+cmF0ZSk7CisgICAgb3V0bGluay0+dGltZV9iYXNlID0gYXZfbXVsX3EoYXZfaW52X3Eocy0+cmF0ZSksIGF2X21ha2VfcSgxLCBQVFNfU1RFUCkpOwogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAidmlkZW86ICVkeCVkICVzICVkLyVkIGZwcywgYmFyX2ggPSAlZCwgYXhpc19oID0gJWQsIHNvbm9faCA9ICVkLlxuIiwKICAgICAgICAgICAgcy0+d2lkdGgsIHMtPmhlaWdodCwgYXZfZ2V0X3BpeF9mbXRfbmFtZShzLT5mb3JtYXQpLCBzLT5yYXRlLm51bSwgcy0+cmF0ZS5kZW4sCiAgICAgICAgICAgIHMtPmJhcl9oLCBzLT5heGlzX2gsIHMtPnNvbm9faCk7CkBAIC0xMTQ1LDcgKzEzNzYsNyBAQAogICAgIGlmICgocmV0ID0gaW5pdF92b2x1bWUocykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIHMtPmZmdF9iaXRzID0gY2VpbChsb2cyKGlubGluay0+c2FtcGxlX3JhdGUgKiBzLT50aW1lY2xhbXApKTsKKyAgICBzLT5mZnRfYml0cyA9IEZGTUFYKGNlaWwobG9nMihpbmxpbmstPnNhbXBsZV9yYXRlICogcy0+dGltZWNsYW1wKSksIDQpOwogICAgIHMtPmZmdF9sZW4gPSAxIDw8IHMtPmZmdF9iaXRzOwogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiZmZ0X2xlbiA9ICVkLCBjcXRfbGVuID0gJWQuXG4iLCBzLT5mZnRfbGVuLCBzLT5jcXRfbGVuKTsKIApAQCAtMTE1Niw5ICsxMzg3LDI0IEBACiAgICAgaWYgKCFzLT5mZnRfY3R4IHx8ICFzLT5mZnRfZGF0YSB8fCAhcy0+ZmZ0X3Jlc3VsdCB8fCAhcy0+Y3F0X3Jlc3VsdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAorICAgIHMtPnJlbWFpbmluZ19maWxsX21heCA9IHMtPmZmdF9sZW4gLyAyOworICAgIGlmIChzLT5hdHRhY2sgPiAwLjApIHsKKyAgICAgICAgaW50IGs7CisKKyAgICAgICAgcy0+cmVtYWluaW5nX2ZpbGxfbWF4ID0gRkZNSU4ocy0+cmVtYWluaW5nX2ZpbGxfbWF4LCBjZWlsKGlubGluay0+c2FtcGxlX3JhdGUgKiBzLT5hdHRhY2spKTsKKyAgICAgICAgcy0+YXR0YWNrX2RhdGEgPSBhdl9tYWxsb2NfYXJyYXkocy0+cmVtYWluaW5nX2ZpbGxfbWF4LCBzaXplb2YoKnMtPmF0dGFja19kYXRhKSk7CisgICAgICAgIGlmICghcy0+YXR0YWNrX2RhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5yZW1haW5pbmdfZmlsbF9tYXg7IGsrKykgeworICAgICAgICAgICAgZG91YmxlIHkgPSBNX1BJICogayAvIChpbmxpbmstPnNhbXBsZV9yYXRlICogcy0+YXR0YWNrKTsKKyAgICAgICAgICAgIHMtPmF0dGFja19kYXRhW2tdID0gMC4zNTU3NjggKyAwLjQ4NzM5NiAqIGNvcyh5KSArIDAuMTQ0MjMyICogY29zKDIqeSkgKyAwLjAxMjYwNCAqIGNvcygzKnkpOworICAgICAgICB9CisgICAgfQorCiAgICAgcy0+Y3F0X2FsaWduID0gMTsKLSAgICBzLT5jcXRfY29lZmZzX3R5cGUgPSBDT0VGRlNfVFlQRV9ERUZBVUxUOwogICAgIHMtPmNxdF9jYWxjID0gY3F0X2NhbGM7CisgICAgcy0+cGVybXV0ZV9jb2VmZnMgPSBOVUxMOwogICAgIHMtPmRyYXdfc29ubyA9IGRyYXdfc29ubzsKICAgICBpZiAocy0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCMjQpIHsKICAgICAgICAgcy0+ZHJhd19iYXIgPSBkcmF3X2Jhcl9yZ2I7CkBAIC0xMTcwLDYgKzE0MTYsOSBAQAogICAgICAgICBzLT51cGRhdGVfc29ubyA9IHVwZGF0ZV9zb25vX3l1djsKICAgICB9CiAKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3Nob3djcXRfaW5pdF94ODYocyk7CisKICAgICBpZiAoKHJldCA9IGluaXRfY3F0KHMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTEyMDksOSArMTQ1OCw5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBzLT5zb25vX2NvdW50ID0gMDsKLSAgICBzLT5mcmFtZV9jb3VudCA9IDA7CisgICAgcy0+bmV4dF9wdHMgPSAwOwogICAgIHMtPnNvbm9faWR4ID0gMDsKLSAgICBzLT5yZW1haW5pbmdfZmlsbCA9IHMtPmZmdF9sZW4gLyAyOworICAgIHMtPnJlbWFpbmluZ19maWxsID0gcy0+cmVtYWluaW5nX2ZpbGxfbWF4OwogICAgIHMtPnJlbWFpbmluZ19mcmFjID0gMDsKICAgICBzLT5zdGVwX2ZyYWMgPSBhdl9kaXZfcShhdl9tYWtlX3EoaW5saW5rLT5zYW1wbGVfcmF0ZSwgcy0+Y291bnQpICwgcy0+cmF0ZSk7CiAgICAgcy0+c3RlcCA9IChpbnQpKHMtPnN0ZXBfZnJhYy5udW0gLyBzLT5zdGVwX2ZyYWMuZGVuKTsKQEAgLTEyMzIsMjIgKzE0ODEsMjcgQEAKIHN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnNhbXBsZXMpCiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CiAgICAgU2hvd0NRVENvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgaW50IHJlbWFpbmluZywgc3RlcCwgcmV0LCB4LCBpLCBqLCBtOwogICAgIGZsb2F0ICphdWRpb19kYXRhOworICAgIEFWRnJhbWUgKm91dCA9IE5VTEw7CiAKICAgICBpZiAoIWluc2FtcGxlcykgewotICAgICAgICB3aGlsZSAocy0+cmVtYWluaW5nX2ZpbGwgPCBzLT5mZnRfbGVuIC8gMikgewotICAgICAgICAgICAgbWVtc2V0KCZzLT5mZnRfZGF0YVtzLT5mZnRfbGVuIC0gcy0+cmVtYWluaW5nX2ZpbGxdLCAwLCBzaXplb2YoKnMtPmZmdF9kYXRhKSAqIHMtPnJlbWFpbmluZ19maWxsKTsKLSAgICAgICAgICAgIHJldCA9IHBsb3RfY3F0KGN0eCk7CisgICAgICAgIHdoaWxlIChzLT5yZW1haW5pbmdfZmlsbCA8IHMtPnJlbWFpbmluZ19maWxsX21heCkgeworICAgICAgICAgICAgbWVtc2V0KCZzLT5mZnRfZGF0YVtzLT5mZnRfbGVuLzIgKyBzLT5yZW1haW5pbmdfZmlsbF9tYXggLSBzLT5yZW1haW5pbmdfZmlsbF0sIDAsIHNpemVvZigqcy0+ZmZ0X2RhdGEpICogcy0+cmVtYWluaW5nX2ZpbGwpOworICAgICAgICAgICAgcmV0ID0gcGxvdF9jcXQoY3R4LCAmb3V0KTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAgICAgICAgIHN0ZXAgPSBzLT5zdGVwICsgKHMtPnN0ZXBfZnJhYy5udW0gKyBzLT5yZW1haW5pbmdfZnJhYykgLyBzLT5zdGVwX2ZyYWMuZGVuOwogICAgICAgICAgICAgcy0+cmVtYWluaW5nX2ZyYWMgPSAocy0+c3RlcF9mcmFjLm51bSArIHMtPnJlbWFpbmluZ19mcmFjKSAlIHMtPnN0ZXBfZnJhYy5kZW47Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgKHMtPmZmdF9sZW4tc3RlcCk7IHgrKykKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCAocy0+ZmZ0X2xlbi8yICsgcy0+cmVtYWluaW5nX2ZpbGxfbWF4IC0gc3RlcCk7IHgrKykKICAgICAgICAgICAgICAgICBzLT5mZnRfZGF0YVt4XSA9IHMtPmZmdF9kYXRhW3grc3RlcF07CiAgICAgICAgICAgICBzLT5yZW1haW5pbmdfZmlsbCArPSBzdGVwOworCisgICAgICAgICAgICBpZiAob3V0KQorICAgICAgICAgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAgICAgfQpAQCAtMTI1NywyMSArMTUxMSwzOSBAQAogCiAgICAgd2hpbGUgKHJlbWFpbmluZykgewogICAgICAgICBpID0gaW5zYW1wbGVzLT5uYl9zYW1wbGVzIC0gcmVtYWluaW5nOwotICAgICAgICBqID0gcy0+ZmZ0X2xlbiAtIHMtPnJlbWFpbmluZ19maWxsOworICAgICAgICBqID0gcy0+ZmZ0X2xlbi8yICsgcy0+cmVtYWluaW5nX2ZpbGxfbWF4IC0gcy0+cmVtYWluaW5nX2ZpbGw7CiAgICAgICAgIGlmIChyZW1haW5pbmcgPj0gcy0+cmVtYWluaW5nX2ZpbGwpIHsKICAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBzLT5yZW1haW5pbmdfZmlsbDsgbSsrKSB7CiAgICAgICAgICAgICAgICAgcy0+ZmZ0X2RhdGFbaittXS5yZSA9IGF1ZGlvX2RhdGFbMiooaSttKV07CiAgICAgICAgICAgICAgICAgcy0+ZmZ0X2RhdGFbaittXS5pbSA9IGF1ZGlvX2RhdGFbMiooaSttKSsxXTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IHBsb3RfY3F0KGN0eCk7CisgICAgICAgICAgICByZXQgPSBwbG90X2NxdChjdHgsICZvdXQpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbnNhbXBsZXMpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZW1haW5pbmcgLT0gcy0+cmVtYWluaW5nX2ZpbGw7CisgICAgICAgICAgICBpZiAob3V0KSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBwdHMgPSBhdl9yZXNjYWxlX3EoaW5zYW1wbGVzLT5wdHMsIGlubGluay0+dGltZV9iYXNlLCBhdl9tYWtlX3EoMSwgaW5saW5rLT5zYW1wbGVfcmF0ZSkpOworICAgICAgICAgICAgICAgIHB0cyArPSBpbnNhbXBsZXMtPm5iX3NhbXBsZXMgLSByZW1haW5pbmcgLSBzLT5yZW1haW5pbmdfZmlsbF9tYXg7CisgICAgICAgICAgICAgICAgcHRzID0gYXZfcmVzY2FsZV9xKHB0cywgYXZfbWFrZV9xKDEsIGlubGluay0+c2FtcGxlX3JhdGUpLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworICAgICAgICAgICAgICAgIGlmIChGRkFCUyhwdHMgLSBvdXQtPnB0cykgPiBQVFNfVE9MRVJBTkNFKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgImNoYW5naW5nIHB0cyBmcm9tICUiUFJJZDY0IiAoJS4zZikgdG8gJSJQUklkNjQiICglLjNmKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPnB0cywgb3V0LT5wdHMgKiBhdl9xMmQob3V0bGluay0+dGltZV9iYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cywgcHRzICogYXZfcTJkKG91dGxpbmstPnRpbWVfYmFzZSkpOworICAgICAgICAgICAgICAgICAgICBvdXQtPnB0cyA9IHB0czsKKyAgICAgICAgICAgICAgICAgICAgcy0+bmV4dF9wdHMgPSBwdHMgKyBQVFNfU1RFUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0ZXAgPSBzLT5zdGVwICsgKHMtPnN0ZXBfZnJhYy5udW0gKyBzLT5yZW1haW5pbmdfZnJhYykgLyBzLT5zdGVwX2ZyYWMuZGVuOwogICAgICAgICAgICAgcy0+cmVtYWluaW5nX2ZyYWMgPSAocy0+c3RlcF9mcmFjLm51bSArIHMtPnJlbWFpbmluZ19mcmFjKSAlIHMtPnN0ZXBfZnJhYy5kZW47Ci0gICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgcy0+ZmZ0X2xlbi1zdGVwOyBtKyspCisgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgcy0+ZmZ0X2xlbi8yICsgcy0+cmVtYWluaW5nX2ZpbGxfbWF4IC0gc3RlcDsgbSsrKQogICAgICAgICAgICAgICAgIHMtPmZmdF9kYXRhW21dID0gcy0+ZmZ0X2RhdGFbbStzdGVwXTsKICAgICAgICAgICAgIHMtPnJlbWFpbmluZ19maWxsID0gc3RlcDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTEyOTQsNyArMTU2Niw3IEBACiAKICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGlubGluayk7CiAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRikKLSAgICAgICAgZmlsdGVyX2ZyYW1lKGlubGluaywgTlVMTCk7CisgICAgICAgIHJldCA9IGZpbHRlcl9mcmFtZShpbmxpbmssIE5VTEwpOwogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93Y3F0LmggYi9saWJhdmZpbHRlci9hdmZfc2hvd2NxdC5oCmluZGV4IGE0OGIyYjAuLjBjZWY1YTIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93Y3F0LmgKKysrIGIvbGliYXZmaWx0ZXIvYXZmX3Nob3djcXQuaApAQCAtMjUsMjEgKzI1LDE2IEBACiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBDb2VmZnMgewogICAgIEZGVFNhbXBsZSAqdmFsOwogICAgIGludCBzdGFydCwgbGVuOwogfSBDb2VmZnM7CiAKLWVudW0gQ29lZmZzVHlwZSB7Ci0gICAgQ09FRkZTX1RZUEVfREVGQVVMVCwKLSAgICBDT0VGRlNfVFlQRV9JTlRFUkxFQVZFCi19OwotCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBSR0JGbG9hdCB7CiAgICAgZmxvYXQgciwgZywgYjsKIH0gUkdCRmxvYXQ7CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFlVVkZsb2F0IHsKICAgICBmbG9hdCB5LCB1LCB2OwogfSBZVVZGbG9hdDsKIApAQCAtNDgsNyArNDMsNyBAQAogICAgIFlVVkZsb2F0IHl1djsKIH0gQ29sb3JGbG9hdDsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgU2hvd0NRVENvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgICAgICAgKmNsYXNzOwogICAgIEFWRmlsdGVyQ29udGV4dCAgICAgKmN0eDsKICAgICBBVkZyYW1lICAgICAgICAgICAgICpheGlzX2ZyYW1lOwpAQCAtNjAsMzEgKzU1LDQ0IEBACiAgICAgQVZSYXRpb25hbCAgICAgICAgICBzdGVwX2ZyYWM7CiAgICAgaW50ICAgICAgICAgICAgICAgICByZW1haW5pbmdfZnJhYzsKICAgICBpbnQgICAgICAgICAgICAgICAgIHJlbWFpbmluZ19maWxsOwotICAgIGludDY0X3QgICAgICAgICAgICAgZnJhbWVfY291bnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICByZW1haW5pbmdfZmlsbF9tYXg7CisgICAgaW50NjRfdCAgICAgICAgICAgICBuZXh0X3B0czsKICAgICBkb3VibGUgICAgICAgICAgICAgICpmcmVxOwogICAgIEZGVENvbnRleHQgICAgICAgICAgKmZmdF9jdHg7CiAgICAgQ29lZmZzICAgICAgICAgICAgICAqY29lZmZzOwogICAgIEZGVENvbXBsZXggICAgICAgICAgKmZmdF9kYXRhOwogICAgIEZGVENvbXBsZXggICAgICAgICAgKmZmdF9yZXN1bHQ7CiAgICAgRkZUQ29tcGxleCAgICAgICAgICAqY3F0X3Jlc3VsdDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICphdHRhY2tfZGF0YTsKICAgICBpbnQgICAgICAgICAgICAgICAgIGZmdF9iaXRzOwogICAgIGludCAgICAgICAgICAgICAgICAgZmZ0X2xlbjsKICAgICBpbnQgICAgICAgICAgICAgICAgIGNxdF9sZW47CiAgICAgaW50ICAgICAgICAgICAgICAgICBjcXRfYWxpZ247Ci0gICAgZW51bSBDb2VmZnNUeXBlICAgICBjcXRfY29lZmZzX3R5cGU7CiAgICAgQ29sb3JGbG9hdCAgICAgICAgICAqY19idWY7CiAgICAgZmxvYXQgICAgICAgICAgICAgICAqaF9idWY7CiAgICAgZmxvYXQgICAgICAgICAgICAgICAqcmNwX2hfYnVmOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgKnNvbm9fdl9idWY7CiAgICAgZmxvYXQgICAgICAgICAgICAgICAqYmFyX3ZfYnVmOworICAgIGZsb2F0ICAgICAgICAgICAgICAgY21hdHJpeFszXVszXTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIGNzY2hlbWVfdls2XTsKICAgICAvKiBjYWxsYmFjayAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgKCpjcXRfY2FsYykoRkZUQ29tcGxleCAqZHN0LCBjb25zdCBGRlRDb21wbGV4ICpzcmMsIGNvbnN0IENvZWZmcyAqY29lZmZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IGZmdF9sZW4pOworICAgIHZvaWQgICAgICAgICAgICAgICAgKCpwZXJtdXRlX2NvZWZmcykoZmxvYXQgKnYsIGludCBsZW4pOwogICAgIHZvaWQgICAgICAgICAgICAgICAgKCpkcmF3X2JhcikoQVZGcmFtZSAqb3V0LCBjb25zdCBmbG9hdCAqaCwgY29uc3QgZmxvYXQgKnJjcF9oLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29sb3JGbG9hdCAqYywgaW50IGJhcl9oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbG9yRmxvYXQgKmMsIGludCBiYXJfaCwgZmxvYXQgYmFyX3QpOwogICAgIHZvaWQgICAgICAgICAgICAgICAgKCpkcmF3X2F4aXMpKEFWRnJhbWUgKm91dCwgQVZGcmFtZSAqYXhpcywgY29uc3QgQ29sb3JGbG9hdCAqYywgaW50IG9mZik7CiAgICAgdm9pZCAgICAgICAgICAgICAgICAoKmRyYXdfc29ubykoQVZGcmFtZSAqb3V0LCBBVkZyYW1lICpzb25vLCBpbnQgb2ZmLCBpbnQgaWR4KTsKICAgICB2b2lkICAgICAgICAgICAgICAgICgqdXBkYXRlX3Nvbm8pKEFWRnJhbWUgKnNvbm8sIGNvbnN0IENvbG9yRmxvYXQgKmMsIGludCBpZHgpOworICAgIC8qIHBlcmZvcm1hbmNlIGRlYnVnZ2luZyAqLworICAgIGludDY0X3QgICAgICAgICAgICAgZmZ0X3RpbWU7CisgICAgaW50NjRfdCAgICAgICAgICAgICBjcXRfdGltZTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgIHByb2Nlc3NfY3F0X3RpbWU7CisgICAgaW50NjRfdCAgICAgICAgICAgICB1cGRhdGVfc29ub190aW1lOworICAgIGludDY0X3QgICAgICAgICAgICAgYWxsb2NfdGltZTsKKyAgICBpbnQ2NF90ICAgICAgICAgICAgIGJhcl90aW1lOworICAgIGludDY0X3QgICAgICAgICAgICAgYXhpc190aW1lOworICAgIGludDY0X3QgICAgICAgICAgICAgc29ub190aW1lOwogICAgIC8qIG9wdGlvbiAqLwogICAgIGludCAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodDsKICAgICBBVlJhdGlvbmFsICAgICAgICAgIHJhdGU7CkBAIC05Niw3ICsxMDQsOSBAQAogICAgIGNoYXIgICAgICAgICAgICAgICAgKmJhcl92OwogICAgIGZsb2F0ICAgICAgICAgICAgICAgc29ub19nOwogICAgIGZsb2F0ICAgICAgICAgICAgICAgYmFyX2c7CisgICAgZmxvYXQgICAgICAgICAgICAgICBiYXJfdDsKICAgICBkb3VibGUgICAgICAgICAgICAgIHRpbWVjbGFtcDsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGF0dGFjazsKICAgICBkb3VibGUgICAgICAgICAgICAgIGJhc2VmcmVxOwogICAgIGRvdWJsZSAgICAgICAgICAgICAgZW5kZnJlcTsKICAgICBmbG9hdCAgICAgICAgICAgICAgIGNvZWZmY2xhbXA7IC8qIGRlcHJlY2F0ZWQgLSBpZ25vcmVkICovCkBAIC0xMDQsOSArMTE0LDE0IEBACiAgICAgaW50ICAgICAgICAgICAgICAgICBjb3VudDsKICAgICBpbnQgICAgICAgICAgICAgICAgIGZjb3VudDsKICAgICBjaGFyICAgICAgICAgICAgICAgICpmb250ZmlsZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICpmb250OwogICAgIGNoYXIgICAgICAgICAgICAgICAgKmZvbnRjb2xvcjsKICAgICBjaGFyICAgICAgICAgICAgICAgICpheGlzZmlsZTsKICAgICBpbnQgICAgICAgICAgICAgICAgIGF4aXM7CisgICAgaW50ICAgICAgICAgICAgICAgICBjc3A7CisgICAgY2hhciAgICAgICAgICAgICAgICAqY3NjaGVtZTsKIH0gU2hvd0NRVENvbnRleHQ7CiAKK3ZvaWQgZmZfc2hvd2NxdF9pbml0X3g4NihTaG93Q1FUQ29udGV4dCAqcyk7CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYXZmX3Nob3dmcmVxcy5jIGIvbGliYXZmaWx0ZXIvYXZmX3Nob3dmcmVxcy5jCmluZGV4IGIzMzU4N2IuLjIyZjI4ZWMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93ZnJlcXMuYworKysgYi9saWJhdmZpbHRlci9hdmZfc2hvd2ZyZXFzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSA8ZmxvYXQuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2F2ZmZ0LmgiCkBAIC01Myw2ICs1NCw3IEBACiAgICAgZmxvYXQgKiphdmdfZGF0YTsKICAgICBmbG9hdCAqd2luZG93X2Z1bmNfbHV0OwogICAgIGZsb2F0IG92ZXJsYXA7CisgICAgZmxvYXQgbWluYW1wOwogICAgIGludCBob3Bfc2l6ZTsKICAgICBpbnQgbmJfY2hhbm5lbHM7CiAgICAgaW50IG5iX2ZyZXE7CkBAIC0xMTIsMTIgKzExNCwxNyBAQAogICAgICAgICB7ICJsYW5jem9zIiwgICJMYW5jem9zIiwgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0xBTkNaT1N9LCAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKICAgICAgICAgeyAiZ2F1c3MiLCAgICAiR2F1c3MiLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19HQVVTU30sICAgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCiAgICAgICAgIHsgInR1a2V5IiwgICAgIlR1a2V5IiwgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfVFVLRVl9LCAgICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJkb2xwaCIsICAgICJEb2xwaC1DaGVieXNoZXYiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0RPTFBIfSwgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAiY2F1Y2h5IiwgICAiQ2F1Y2h5IiwgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19DQVVDSFl9LCAgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgInBhcnplbiIsICAgIlBhcnplbiIsICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfUEFSWkVOfSwgICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJwb2lzc29uIiwgICJQb2lzc29uIiwgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX1BPSVNTT059LCAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKICAgICB7ICJvdmVybGFwIiwgICJzZXQgd2luZG93IG92ZXJsYXAiLCBPRkZTRVQob3ZlcmxhcCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xLn0sIDAuLCAxLiwgRkxBR1MgfSwKICAgICB7ICJhdmVyYWdpbmciLCAic2V0IHRpbWUgYXZlcmFnaW5nIiwgT0ZGU0VUKGF2ZyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MX0sIDAsIElOVDMyX01BWCwgRkxBR1MgfSwKICAgICB7ICJjb2xvcnMiLCAic2V0IGNoYW5uZWxzIGNvbG9ycyIsIE9GRlNFVChjb2xvcnMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gInJlZHxncmVlbnxibHVlfHllbGxvd3xvcmFuZ2V8bGltZXxwaW5rfG1hZ2VudGF8YnJvd24iIH0sIDAsIDAsIEZMQUdTIH0sCiAgICAgeyAiY21vZGUiLCAic2V0IGNoYW5uZWwgbW9kZSIsIE9GRlNFVChjbW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Q09NQklORUR9LCAwLCBOQl9DTU9ERVMtMSwgRkxBR1MsICJjbW9kZSIgfSwKICAgICAgICAgeyAiY29tYmluZWQiLCAic2hvdyBhbGwgY2hhbm5lbHMgaW4gc2FtZSB3aW5kb3ciLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTUJJTkVEfSwgMCwgMCwgRkxBR1MsICJjbW9kZSIgfSwKICAgICAgICAgeyAic2VwYXJhdGUiLCAic2hvdyBlYWNoIGNoYW5uZWwgaW4gb3duIHdpbmRvdyIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNFUEFSQVRFfSwgMCwgMCwgRkxBR1MsICJjbW9kZSIgfSwKKyAgICB7ICJtaW5hbXAiLCAgInNldCBtaW5pbXVtIGFtcGxpdHVkZSIsIE9GRlNFVChtaW5hbXApLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MWUtNn0sIEZMVF9NSU4sIDFlLTYsIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTIxMSw3ICsyMTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPndpbmRvd19mdW5jX2x1dCkpOwogICAgIGlmICghcy0+d2luZG93X2Z1bmNfbHV0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIGZmX2dlbmVyYXRlX3dpbmRvd19mdW5jKHMtPndpbmRvd19mdW5jX2x1dCwgcy0+d2luX3NpemUsIHMtPndpbl9mdW5jLCAmb3ZlcmxhcCk7CisgICAgZ2VuZXJhdGVfd2luZG93X2Z1bmMocy0+d2luZG93X2Z1bmNfbHV0LCBzLT53aW5fc2l6ZSwgcy0+d2luX2Z1bmMsICZvdmVybGFwKTsKICAgICBpZiAocy0+b3ZlcmxhcCA9PSAxLikKICAgICAgICAgcy0+b3ZlcmxhcCA9IG92ZXJsYXA7CiAgICAgcy0+aG9wX3NpemUgPSAoMS4gLSBzLT5vdmVybGFwKSAqIHMtPndpbl9zaXplOwpAQCAtMjgxLDYgKzI4OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKm91dCwgQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQogewogICAgIGNvbnN0IGludCB3ID0gcy0+dzsKKyAgICBjb25zdCBmbG9hdCBtaW4gPSBzLT5taW5hbXA7CiAgICAgY29uc3QgZmxvYXQgYXZnID0gcy0+YXZnX2RhdGFbY2hdW2ZdOwogICAgIGNvbnN0IGZsb2F0IGJzaXplID0gZ2V0X2JzaXplKHMsIGYpOwogICAgIGNvbnN0IGludCBzeCA9IGdldF9zeChzLCBmKTsKQEAgLTI5NSw3ICszMDMsNyBAQAogICAgICAgICBhID0gMS4wIC0gY2JydChhKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBU19MT0c6Ci0gICAgICAgIGEgPSBsb2coYXZfY2xpcGQoYSwgMWUtNiwgMSkpIC8gbG9nKDFlLTYpOworICAgICAgICBhID0gbG9nKGF2X2NsaXBkKGEsIG1pbiwgMSkpIC8gbG9nKG1pbik7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVNfTElORUFSOgogICAgICAgICBhID0gMS4wIC0gYTsKQEAgLTMxOCwxMiArMzI2LDEyIEBACiAKICAgICBzd2l0Y2ggKHMtPmF2ZykgewogICAgIGNhc2UgMDoKLSAgICAgICAgeSA9IHMtPmF2Z19kYXRhW2NoXVtmXSA9ICFvdXRsaW5rLT5mcmFtZV9jb3VudCA/IHkgOiBGRk1JTihhdmcsIHkpOworICAgICAgICB5ID0gcy0+YXZnX2RhdGFbY2hdW2ZdID0gIW91dGxpbmstPmZyYW1lX2NvdW50X2luID8geSA6IEZGTUlOKGF2ZywgeSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMToKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgcy0+YXZnX2RhdGFbY2hdW2ZdID0gYXZnICsgeSAqICh5IC0gYXZnKSAvIChGRk1JTihvdXRsaW5rLT5mcmFtZV9jb3VudCArIDEsIHMtPmF2ZykgKiB5KTsKKyAgICAgICAgcy0+YXZnX2RhdGFbY2hdW2ZdID0gYXZnICsgeSAqICh5IC0gYXZnKSAvIChGRk1JTihvdXRsaW5rLT5mcmFtZV9jb3VudF9pbiArIDEsIHMtPmF2ZykgKiB5KTsKICAgICAgICAgeSA9IHMtPmF2Z19kYXRhW2NoXVtmXTsKICAgICAgICAgYnJlYWs7CiAgICAgfQpAQCAtNDI2LDYgKzQzNCw3IEBACiAKICAgICBhdl9mcmVlKGNvbG9ycyk7CiAgICAgb3V0LT5wdHMgPSBpbi0+cHRzOworICAgIG91dC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLDF9OwogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYXZmX3Nob3dzcGVjdHJ1bS5jIGIvbGliYXZmaWx0ZXIvYXZmX3Nob3dzcGVjdHJ1bS5jCmluZGV4IDZiZTk3YWYuLjk1NmY2MmYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93c3BlY3RydW0uYworKysgYi9saWJhdmZpbHRlci9hdmZfc2hvd3NwZWN0cnVtLmMKQEAgLTQ4LDcgKzQ4LDcgQEAKIGVudW0gU2xpZGVNb2RlICAgIHsgUkVQTEFDRSwgU0NST0xMLCBGVUxMRlJBTUUsIFJTQ1JPTEwsIE5CX1NMSURFUyB9OwogZW51bSBPcmllbnRhdGlvbiAgeyBWRVJUSUNBTCwgSE9SSVpPTlRBTCwgTkJfT1JJRU5UQVRJT05TIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFNob3dTcGVjdHJ1bUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCB3LCBoOwogICAgIEFWRnJhbWUgKm91dHBpY3JlZjsKQEAgLTYxLDkgKzYxLDEwIEBACiAgICAgaW50IGNvbG9yX21vZGU7ICAgICAgICAgICAgIC8vLzwgZGlzcGxheSBjb2xvciBzY2hlbWUKICAgICBpbnQgc2NhbGU7CiAgICAgZmxvYXQgc2F0dXJhdGlvbjsgICAgICAgICAgIC8vLzwgY29sb3Igc2F0dXJhdGlvbiBtdWx0aXBsaWVyCisgICAgZmxvYXQgcm90YXRpb247ICAgICAgICAgICAgIC8vLzwgY29sb3Igcm90YXRpb24KICAgICBpbnQgZGF0YTsKICAgICBpbnQgeHBvczsgICAgICAgICAgICAgICAgICAgLy8vPCB4IHBvc2l0aW9uIChjdXJyZW50IGNvbHVtbikKLSAgICBGRlRDb250ZXh0ICpmZnQ7ICAgICAgICAgICAgLy8vPCBGYXN0IEZvdXJpZXIgVHJhbnNmb3JtIGNvbnRleHQKKyAgICBGRlRDb250ZXh0ICoqZmZ0OyAgICAgICAgICAgLy8vPCBGYXN0IEZvdXJpZXIgVHJhbnNmb3JtIGNvbnRleHQKICAgICBpbnQgZmZ0X2JpdHM7ICAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYml0cyAoRkZUIHdpbmRvdyBzaXplID0gMTw8ZmZ0X2JpdHMpCiAgICAgRkZUQ29tcGxleCAqKmZmdF9kYXRhOyAgICAgIC8vLzwgYmlucyBob2xkZXIgZm9yIGVhY2ggKGRpc3BsYXllZCkgY2hhbm5lbHMKICAgICBmbG9hdCAqd2luZG93X2Z1bmNfbHV0OyAgICAgLy8vPCBXaW5kb3cgZnVuY3Rpb24gTFVUCkBAIC03Niw2ICs3Nyw3IEBACiAgICAgZmxvYXQgZ2FpbjsKICAgICBpbnQgaG9wX3NpemU7CiAgICAgZmxvYXQgKmNvbWJpbmVfYnVmZmVyOyAgICAgIC8vLzwgY29sb3IgY29tYmluaW5nIGJ1ZmZlciAoMyAqIGggaXRlbXMpCisgICAgZmxvYXQgKipjb2xvcl9idWZmZXI7ICAgICAgIC8vLzwgY29sb3IgYnVmZmVyICgzICogaCAqIGNoIGl0ZW1zKQogICAgIEFWQXVkaW9GaWZvICpmaWZvOwogICAgIGludDY0X3QgcHRzOwogICAgIGludCBzaW5nbGVfcGljOwpAQCAtOTIsOCArOTQsOCBAQAogICAgIHsgInNsaWRlIiwgInNldCBzbGlkaW5nIG1vZGUiLCBPRkZTRVQoc2xpZGluZyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgTkJfU0xJREVTLTEsIEZMQUdTLCAic2xpZGUiIH0sCiAgICAgICAgIHsgInJlcGxhY2UiLCAicmVwbGFjZSBvbGQgY29sdW1ucyB3aXRoIG5ldyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1SRVBMQUNFfSwgMCwgMCwgRkxBR1MsICJzbGlkZSIgfSwKICAgICAgICAgeyAic2Nyb2xsIiwgInNjcm9sbCBmcm9tIHJpZ2h0IHRvIGxlZnQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0NST0xMfSwgMCwgMCwgRkxBR1MsICJzbGlkZSIgfSwKLSAgICAgICAgeyAicnNjcm9sbCIsICJzY3JvbGwgZnJvbSBsZWZ0IHRvIHJpZ2h0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVJTQ1JPTEx9LCAwLCAwLCBGTEFHUywgInNsaWRlIiB9LAogICAgICAgICB7ICJmdWxsZnJhbWUiLCAicmV0dXJuIGZ1bGwgZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZVTExGUkFNRX0sIDAsIDAsIEZMQUdTLCAic2xpZGUiIH0sCisgICAgICAgIHsgInJzY3JvbGwiLCAic2Nyb2xsIGZyb20gbGVmdCB0byByaWdodCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1SU0NST0xMfSwgMCwgMCwgRkxBR1MsICJzbGlkZSIgfSwKICAgICB7ICJtb2RlIiwgInNldCBjaGFubmVsIGRpc3BsYXkgbW9kZSIsIE9GRlNFVChtb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1DT01CSU5FRH0sIENPTUJJTkVELCBOQl9NT0RFUy0xLCBGTEFHUywgIm1vZGUiIH0sCiAgICAgICAgIHsgImNvbWJpbmVkIiwgImNvbWJpbmVkIG1vZGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q09NQklORUR9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCiAgICAgICAgIHsgInNlcGFyYXRlIiwgInNlcGFyYXRlIG1vZGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0VQQVJBVEV9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCkBAIC0xMDgsMTIgKzExMCwxMiBAQAogICAgICAgICB7ICJmcnVpdCIsICAgICAiZnJ1aXQgYmFzZWQgY29sb3JpbmciLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GUlVJVH0sICAgICAwLCAwLCBGTEFHUywgImNvbG9yIiB9LAogICAgICAgICB7ICJjb29sIiwgICAgICAiY29vbCBiYXNlZCBjb2xvcmluZyIsICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DT09MfSwgICAgICAwLCAwLCBGTEFHUywgImNvbG9yIiB9LAogICAgIHsgInNjYWxlIiwgInNldCBkaXNwbGF5IHNjYWxlIiwgT0ZGU0VUKHNjYWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1TUVJUfSwgTElORUFSLCBOQl9TQ0FMRVMtMSwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAibGluIiwgICJsaW5lYXIiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MSU5FQVJ9LCAwLCAwLCBGTEFHUywgInNjYWxlIiB9LAogICAgICAgICB7ICJzcXJ0IiwgInNxdWFyZSByb290IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNRUlR9LCAgIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCiAgICAgICAgIHsgImNicnQiLCAiY3ViaWMgcm9vdCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q0JSVH0sICAgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAibG9nIiwgICJsb2dhcml0aG1pYyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MT0d9LCAgICAwLCAwLCBGTEFHUywgInNjYWxlIiB9LAogICAgICAgICB7ICI0dGhydCIsIjR0aCByb290IiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZPVVJUSFJUfSwgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKICAgICAgICAgeyAiNXRocnQiLCI1dGggcm9vdCIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GSUZUSFJUfSwgIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCi0gICAgICAgIHsgImxvZyIsICAibG9nYXJpdGhtaWMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TE9HfSwgICAgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKLSAgICAgICAgeyAibGluIiwgICJsaW5lYXIiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MSU5FQVJ9LCAwLCAwLCBGTEFHUywgInNjYWxlIiB9LAogICAgIHsgInNhdHVyYXRpb24iLCAiY29sb3Igc2F0dXJhdGlvbiBtdWx0aXBsaWVyIiwgT0ZGU0VUKHNhdHVyYXRpb24pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAxfSwgLTEwLCAxMCwgRkxBR1MgfSwKICAgICB7ICJ3aW5fZnVuYyIsICJzZXQgd2luZG93IGZ1bmN0aW9uIiwgT0ZGU0VUKHdpbl9mdW5jKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFdGVU5DX0hBTk5JTkd9LCAwLCBOQl9XRlVOQy0xLCBGTEFHUywgIndpbl9mdW5jIiB9LAogICAgICAgICB7ICJyZWN0IiwgICAgICJSZWN0YW5ndWxhciIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX1JFQ1R9LCAgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKQEAgLTEzMiw2ICsxMzQsMTAgQEAKICAgICAgICAgeyAibGFuY3pvcyIsICAiTGFuY3pvcyIsICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19MQU5DWk9TfSwgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCiAgICAgICAgIHsgImdhdXNzIiwgICAgIkdhdXNzIiwgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfR0FVU1N9LCAgICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAogICAgICAgICB7ICJ0dWtleSIsICAgICJUdWtleSIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX1RVS0VZfSwgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAiZG9scGgiLCAgICAiRG9scGgtQ2hlYnlzaGV2IiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19ET0xQSH0sICAgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgImNhdWNoeSIsICAgIkNhdWNoeSIsICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfQ0FVQ0hZfSwgICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJwYXJ6ZW4iLCAgICJQYXJ6ZW4iLCAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX1BBUlpFTn0sICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAicG9pc3NvbiIsICAiUG9pc3NvbiIsICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19QT0lTU09OfSwgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCiAgICAgeyAib3JpZW50YXRpb24iLCAic2V0IG9yaWVudGF0aW9uIiwgT0ZGU0VUKG9yaWVudGF0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1WRVJUSUNBTH0sIDAsIE5CX09SSUVOVEFUSU9OUy0xLCBGTEFHUywgIm9yaWVudGF0aW9uIiB9LAogICAgICAgICB7ICJ2ZXJ0aWNhbCIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVZFUlRJQ0FMfSwgICAwLCAwLCBGTEFHUywgIm9yaWVudGF0aW9uIiB9LAogICAgICAgICB7ICJob3Jpem9udGFsIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUhPUklaT05UQUx9LCAwLCAwLCBGTEFHUywgIm9yaWVudGF0aW9uIiB9LApAQCAtMTQwLDYgKzE0Niw3IEBACiAgICAgeyAiZGF0YSIsICJzZXQgZGF0YSBtb2RlIiwgT0ZGU0VUKGRhdGEpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIE5CX0RNT0RFUy0xLCBGTEFHUywgImRhdGEiIH0sCiAgICAgICAgIHsgIm1hZ25pdHVkZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1EX01BR05JVFVERX0sIDAsIDAsIEZMQUdTLCAiZGF0YSIgfSwKICAgICAgICAgeyAicGhhc2UiLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PURfUEhBU0V9LCAgICAgMCwgMCwgRkxBR1MsICJkYXRhIiB9LAorICAgIHsgInJvdGF0aW9uIiwgImNvbG9yIHJvdGF0aW9uIiwgT0ZGU0VUKHJvdGF0aW9uKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMH0sIC0xLCAxLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC0yMjMsMTIgKzIzMCwyMSBAQAogICAgIGludCBpOwogCiAgICAgYXZfZnJlZXAoJnMtPmNvbWJpbmVfYnVmZmVyKTsKLSAgICBhdl9mZnRfZW5kKHMtPmZmdCk7CisgICAgaWYgKHMtPmZmdCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZGlzcGxheV9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgYXZfZmZ0X2VuZChzLT5mZnRbaV0pOworICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+ZmZ0KTsKICAgICBpZiAocy0+ZmZ0X2RhdGEpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7IGkrKykKICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5mZnRfZGF0YVtpXSk7CiAgICAgfQogICAgIGF2X2ZyZWVwKCZzLT5mZnRfZGF0YSk7CisgICAgaWYgKHMtPmNvbG9yX2J1ZmZlcikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZGlzcGxheV9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmNvbG9yX2J1ZmZlcltpXSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZzLT5jb2xvcl9idWZmZXIpOwogICAgIGF2X2ZyZWVwKCZzLT53aW5kb3dfZnVuY19sdXQpOwogICAgIGlmIChzLT5tYWduaXR1ZGVzKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9kaXNwbGF5X2NoYW5uZWxzOyBpKyspCkBAIC0yODMsMTEgKzI5OSwxNCBAQAogICAgIGludCBpLCBmZnRfYml0cywgaCwgdzsKICAgICBmbG9hdCBvdmVybGFwOwogCisgICAgcy0+cHRzID0gQVZfTk9QVFNfVkFMVUU7CisKICAgICBpZiAoIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgInNob3dzcGVjdHJ1bXBpYyIpKQogICAgICAgICBzLT5zaW5nbGVfcGljID0gMTsKIAogICAgIG91dGxpbmstPncgPSBzLT53OwogICAgIG91dGxpbmstPmggPSBzLT5oOworICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MSwxfTsKIAogICAgIGlmIChzLT5sZWdlbmQpIHsKICAgICAgICAgcy0+c3RhcnRfeCA9IGxvZzEwKGlubGluay0+c2FtcGxlX3JhdGUpICogMjU7CkBAIC0zMTAsMjYgKzMyOSwzNiBAQAogICAgIH0KICAgICBzLT53aW5fc2l6ZSA9IDEgPDwgZmZ0X2JpdHM7CiAKKyAgICBpZiAoIXMtPmZmdCkgeworICAgICAgICBzLT5mZnQgPSBhdl9jYWxsb2MoaW5saW5rLT5jaGFubmVscywgc2l6ZW9mKCpzLT5mZnQpKTsKKyAgICAgICAgaWYgKCFzLT5mZnQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKwogICAgIC8qIChyZS0pY29uZmlndXJhdGlvbiBpZiB0aGUgdmlkZW8gb3V0cHV0IGNoYW5nZWQgKG9yIGZpcnN0IGluaXQpICovCiAgICAgaWYgKGZmdF9iaXRzICE9IHMtPmZmdF9iaXRzKSB7CiAgICAgICAgIEFWRnJhbWUgKm91dHBpY3JlZjsKIAotICAgICAgICBhdl9mZnRfZW5kKHMtPmZmdCk7Ci0gICAgICAgIHMtPmZmdCA9IGF2X2ZmdF9pbml0KGZmdF9iaXRzLCAwKTsKLSAgICAgICAgaWYgKCFzLT5mZnQpIHsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgRkZUIGNvbnRleHQuICIKLSAgICAgICAgICAgICAgICAgICAiVGhlIHdpbmRvdyBzaXplIG1pZ2h0IGJlIHRvbyBoaWdoLlxuIik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICB9CiAgICAgICAgIHMtPmZmdF9iaXRzID0gZmZ0X2JpdHM7CiAKICAgICAgICAgLyogRkZUIGJ1ZmZlcnM6IHgyIGZvciBlYWNoIChkaXNwbGF5KSBjaGFubmVsIGJ1ZmZlci4KICAgICAgICAgICogTm90ZTogd2UgdXNlIGZyZWUgYW5kIG1hbGxvYyBpbnN0ZWFkIG9mIGEgcmVhbGxvYy1saWtlIGZ1bmN0aW9uIHRvCiAgICAgICAgICAqIG1ha2Ugc3VyZSB0aGUgYnVmZmVyIGlzIGFsaWduZWQgaW4gbWVtb3J5IGZvciB0aGUgRkZUIGZ1bmN0aW9ucy4gKi8KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7IGkrKykKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgYXZfZmZ0X2VuZChzLT5mZnRbaV0pOwogICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmZmdF9kYXRhW2ldKTsKKyAgICAgICAgfQogICAgICAgICBhdl9mcmVlcCgmcy0+ZmZ0X2RhdGEpOworCiAgICAgICAgIHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMgPSBpbmxpbmstPmNoYW5uZWxzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZGlzcGxheV9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBzLT5mZnRbaV0gPSBhdl9mZnRfaW5pdChmZnRfYml0cywgMCk7CisgICAgICAgICAgICBpZiAoIXMtPmZmdFtpXSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBjcmVhdGUgRkZUIGNvbnRleHQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgIlRoZSB3aW5kb3cgc2l6ZSBtaWdodCBiZSB0b28gaGlnaC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBzLT5tYWduaXR1ZGVzID0gYXZfY2FsbG9jKHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMsIHNpemVvZigqcy0+bWFnbml0dWRlcykpOwogICAgICAgICBpZiAoIXMtPm1hZ25pdHVkZXMpCkBAIC0zNDAsNyArMzY5LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CiAKLSAgICAgICAgcy0+cGhhc2VzID0gYXZfY2FsbG9jKHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMsIHNpemVvZigqcy0+bWFnbml0dWRlcykpOworICAgICAgICBzLT5waGFzZXMgPSBhdl9jYWxsb2Mocy0+bmJfZGlzcGxheV9jaGFubmVscywgc2l6ZW9mKCpzLT5waGFzZXMpKTsKICAgICAgICAgaWYgKCFzLT5waGFzZXMpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZGlzcGxheV9jaGFubmVsczsgaSsrKSB7CkBAIC0zNDksNiArMzc4LDE2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgfQogCisgICAgICAgIGF2X2ZyZWVwKCZzLT5jb2xvcl9idWZmZXIpOworICAgICAgICBzLT5jb2xvcl9idWZmZXIgPSBhdl9jYWxsb2Mocy0+bmJfZGlzcGxheV9jaGFubmVscywgc2l6ZW9mKCpzLT5jb2xvcl9idWZmZXIpKTsKKyAgICAgICAgaWYgKCFzLT5jb2xvcl9idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfZGlzcGxheV9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBzLT5jb2xvcl9idWZmZXJbaV0gPSBhdl9jYWxsb2Mocy0+b3JpZW50YXRpb24gPT0gVkVSVElDQUwgPyBzLT5oICogMyA6IHMtPncgKiAzLCBzaXplb2YoKipzLT5jb2xvcl9idWZmZXIpKTsKKyAgICAgICAgICAgIGlmICghcy0+Y29sb3JfYnVmZmVyW2ldKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKwogICAgICAgICBzLT5mZnRfZGF0YSA9IGF2X2NhbGxvYyhzLT5uYl9kaXNwbGF5X2NoYW5uZWxzLCBzaXplb2YoKnMtPmZmdF9kYXRhKSk7CiAgICAgICAgIGlmICghcy0+ZmZ0X2RhdGEpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpAQCAtMzY0LDcgKzQwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT53aW5kb3dfZnVuY19sdXQpKTsKICAgICAgICAgaWYgKCFzLT53aW5kb3dfZnVuY19sdXQpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBmZl9nZW5lcmF0ZV93aW5kb3dfZnVuYyhzLT53aW5kb3dfZnVuY19sdXQsIHMtPndpbl9zaXplLCBzLT53aW5fZnVuYywgJm92ZXJsYXApOworICAgICAgICBnZW5lcmF0ZV93aW5kb3dfZnVuYyhzLT53aW5kb3dfZnVuY19sdXQsIHMtPndpbl9zaXplLCBzLT53aW5fZnVuYywgJm92ZXJsYXApOwogICAgICAgICBpZiAocy0+b3ZlcmxhcCA9PSAxKQogICAgICAgICAgICAgcy0+b3ZlcmxhcCA9IG92ZXJsYXA7CiAgICAgICAgIHMtPmhvcF9zaXplID0gKDEuIC0gcy0+b3ZlcmxhcCkgKiBzLT53aW5fc2l6ZTsKQEAgLTM4NCwxMyArNDIzLDEzIEBACiAgICAgICAgICAgICBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOwogICAgICAgICBpZiAoIW91dHBpY3JlZikKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MSwxfTsKKyAgICAgICAgb3V0cGljcmVmLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRsaW5rLT5oOyBpKyspIHsKICAgICAgICAgICAgIG1lbXNldChvdXRwaWNyZWYtPmRhdGFbMF0gKyBpICogb3V0cGljcmVmLT5saW5lc2l6ZVswXSwgICAwLCBvdXRsaW5rLT53KTsKICAgICAgICAgICAgIG1lbXNldChvdXRwaWNyZWYtPmRhdGFbMV0gKyBpICogb3V0cGljcmVmLT5saW5lc2l6ZVsxXSwgMTI4LCBvdXRsaW5rLT53KTsKICAgICAgICAgICAgIG1lbXNldChvdXRwaWNyZWYtPmRhdGFbMl0gKyBpICogb3V0cGljcmVmLT5saW5lc2l6ZVsyXSwgMTI4LCBvdXRsaW5rLT53KTsKICAgICAgICAgfQotICAgICAgICBhdl9mcmFtZV9zZXRfY29sb3JfcmFuZ2Uob3V0cGljcmVmLCBBVkNPTF9SQU5HRV9KUEVHKTsKKyAgICAgICAgb3V0cGljcmVmLT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CiAgICAgfQogCiAgICAgaWYgKChzLT5vcmllbnRhdGlvbiA9PSBWRVJUSUNBTCAgICYmIHMtPnhwb3MgPj0gcy0+dykgfHwKQEAgLTQyMywyNSArNDYyLDI3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJ1bl9mZnQoU2hvd1NwZWN0cnVtQ29udGV4dCAqcywgQVZGcmFtZSAqZmluKQorc3RhdGljIGludCBydW5fY2hhbm5lbF9mZnQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKIHsKLSAgICBpbnQgY2gsIG47CisgICAgU2hvd1NwZWN0cnVtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBmbG9hdCAqd2luZG93X2Z1bmNfbHV0ID0gcy0+d2luZG93X2Z1bmNfbHV0OworICAgIEFWRnJhbWUgKmZpbiA9IGFyZzsKKyAgICBjb25zdCBpbnQgY2ggPSBqb2JucjsKKyAgICBpbnQgbjsKIAogICAgIC8qIGZpbGwgRkZUIGlucHV0IHdpdGggdGhlIG51bWJlciBvZiBzYW1wbGVzIGF2YWlsYWJsZSAqLwotICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgY29uc3QgZmxvYXQgKnAgPSAoZmxvYXQgKilmaW4tPmV4dGVuZGVkX2RhdGFbY2hdOworICAgIGNvbnN0IGZsb2F0ICpwID0gKGZsb2F0ICopZmluLT5leHRlbmRlZF9kYXRhW2NoXTsKIAotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcy0+d2luX3NpemU7IG4rKykgewotICAgICAgICAgICAgcy0+ZmZ0X2RhdGFbY2hdW25dLnJlID0gcFtuXSAqIHMtPndpbmRvd19mdW5jX2x1dFtuXTsKLSAgICAgICAgICAgIHMtPmZmdF9kYXRhW2NoXVtuXS5pbSA9IDA7Ci0gICAgICAgIH0KKyAgICBmb3IgKG4gPSAwOyBuIDwgcy0+d2luX3NpemU7IG4rKykgeworICAgICAgICBzLT5mZnRfZGF0YVtjaF1bbl0ucmUgPSBwW25dICogd2luZG93X2Z1bmNfbHV0W25dOworICAgICAgICBzLT5mZnRfZGF0YVtjaF1bbl0uaW0gPSAwOwogICAgIH0KIAogICAgIC8qIHJ1biBGRlQgb24gZWFjaCBzYW1wbGVzIHNldCAqLwotICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgYXZfZmZ0X3Blcm11dGUocy0+ZmZ0LCBzLT5mZnRfZGF0YVtjaF0pOwotICAgICAgICBhdl9mZnRfY2FsYyhzLT5mZnQsIHMtPmZmdF9kYXRhW2NoXSk7Ci0gICAgfQorICAgIGF2X2ZmdF9wZXJtdXRlKHMtPmZmdFtjaF0sIHMtPmZmdF9kYXRhW2NoXSk7CisgICAgYXZfZmZ0X2NhbGMocy0+ZmZ0W2NoXSwgcy0+ZmZ0X2RhdGFbY2hdKTsKKworICAgIHJldHVybiAwOwogfQogCiAjZGVmaW5lIFJFKHksIGNoKSBzLT5mZnRfZGF0YVtjaF1beV0ucmUKQEAgLTQ0OSwzMCArNDkwLDMzIEBACiAjZGVmaW5lIE1BR05JVFVERSh5LCBjaCkgaHlwb3QoUkUoeSwgY2gpLCBJTSh5LCBjaCkpCiAjZGVmaW5lIFBIQVNFKHksIGNoKSBhdGFuMihJTSh5LCBjaCksIFJFKHksIGNoKSkKIAotc3RhdGljIHZvaWQgY2FsY19tYWduaXR1ZGVzKFNob3dTcGVjdHJ1bUNvbnRleHQgKnMpCitzdGF0aWMgaW50IGNhbGNfY2hhbm5lbF9tYWduaXR1ZGVzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCiB7CisgICAgU2hvd1NwZWN0cnVtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKICAgICBjb25zdCBkb3VibGUgdyA9IHMtPndpbl9zY2FsZSAqIChzLT5zY2FsZSA9PSBMT0cgPyBzLT53aW5fc2NhbGUgOiAxKTsKLSAgICBpbnQgY2gsIHksIGggPSBzLT5vcmllbnRhdGlvbiA9PSBWRVJUSUNBTCA/IHMtPmggOiBzLT53OworICAgIGludCB5LCBoID0gcy0+b3JpZW50YXRpb24gPT0gVkVSVElDQUwgPyBzLT5oIDogcy0+dzsKICAgICBjb25zdCBmbG9hdCBmID0gcy0+Z2FpbiAqIHc7CisgICAgY29uc3QgaW50IGNoID0gam9ibnI7CisgICAgZmxvYXQgKm1hZ25pdHVkZXMgPSBzLT5tYWduaXR1ZGVzW2NoXTsKIAotICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgZmxvYXQgKm1hZ25pdHVkZXMgPSBzLT5tYWduaXR1ZGVzW2NoXTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKQorICAgICAgICBtYWduaXR1ZGVzW3ldID0gTUFHTklUVURFKHksIGNoKSAqIGY7CiAKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykKLSAgICAgICAgICAgIG1hZ25pdHVkZXNbeV0gPSBNQUdOSVRVREUoeSwgY2gpICogZjsKLSAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNhbGNfcGhhc2VzKFNob3dTcGVjdHJ1bUNvbnRleHQgKnMpCitzdGF0aWMgaW50IGNhbGNfY2hhbm5lbF9waGFzZXMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKIHsKLSAgICBpbnQgY2gsIHksIGggPSBzLT5vcmllbnRhdGlvbiA9PSBWRVJUSUNBTCA/IHMtPmggOiBzLT53OworICAgIFNob3dTcGVjdHJ1bUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgaW50IGggPSBzLT5vcmllbnRhdGlvbiA9PSBWRVJUSUNBTCA/IHMtPmggOiBzLT53OworICAgIGNvbnN0IGludCBjaCA9IGpvYm5yOworICAgIGZsb2F0ICpwaGFzZXMgPSBzLT5waGFzZXNbY2hdOworICAgIGludCB5OwogCi0gICAgZm9yIChjaCA9IDA7IGNoIDwgcy0+bmJfZGlzcGxheV9jaGFubmVsczsgY2grKykgewotICAgICAgICBmbG9hdCAqcGhhc2VzID0gcy0+cGhhc2VzW2NoXTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKQorICAgICAgICBwaGFzZXNbeV0gPSAoUEhBU0UoeSwgY2gpIC8gTV9QSSArIDEpIC8gMjsKIAotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKQotICAgICAgICAgICAgcGhhc2VzW3ldID0gKFBIQVNFKHksIGNoKSAvIE1fUEkgKyAxKSAvIDI7Ci0gICAgfQorICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBhY2FsY19tYWduaXR1ZGVzKFNob3dTcGVjdHJ1bUNvbnRleHQgKnMpCkBAIC01NDIsMTMgKzU4NiwxNyBAQAogCiAgICAgaWYgKHMtPmNvbG9yX21vZGUgPT0gQ0hBTk5FTCkgewogICAgICAgICBpZiAocy0+bmJfZGlzcGxheV9jaGFubmVscyA+IDEpIHsKLSAgICAgICAgICAgICp1ZiAqPSAwLjUgKiBzaW4oKDIgKiBNX1BJICogY2gpIC8gcy0+bmJfZGlzcGxheV9jaGFubmVscyk7Ci0gICAgICAgICAgICAqdmYgKj0gMC41ICogY29zKCgyICogTV9QSSAqIGNoKSAvIHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMpOworICAgICAgICAgICAgKnVmICo9IDAuNSAqIHNpbigoMiAqIE1fUEkgKiBjaCkgLyBzLT5uYl9kaXNwbGF5X2NoYW5uZWxzICsgTV9QSSAqIHMtPnJvdGF0aW9uKTsKKyAgICAgICAgICAgICp2ZiAqPSAwLjUgKiBjb3MoKDIgKiBNX1BJICogY2gpIC8gcy0+bmJfZGlzcGxheV9jaGFubmVscyArIE1fUEkgKiBzLT5yb3RhdGlvbik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqdWYgPSAwLjBmOwotICAgICAgICAgICAgKnZmID0gMC4wZjsKKyAgICAgICAgICAgICp1ZiAqPSAwLjUgKiBzaW4oTV9QSSAqIHMtPnJvdGF0aW9uKTsKKyAgICAgICAgICAgICp2ZiAqPSAwLjUgKiBjb3MoTV9QSSAqIHMtPnJvdGF0aW9uICsgTV9QSV8yKTsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICp1ZiArPSAqdWYgKiBzaW4oTV9QSSAqIHMtPnJvdGF0aW9uKTsKKyAgICAgICAgKnZmICs9ICp2ZiAqIGNvcyhNX1BJICogcy0+cm90YXRpb24gKyBNX1BJXzIpOwogICAgIH0KKwogICAgICp1ZiAqPSBzLT5zYXR1cmF0aW9uOwogICAgICp2ZiAqPSBzLT5zYXR1cmF0aW9uOwogfQpAQCAtNTg3LDEzICs2MzUsMTMgQEAKICAgICAgICAgICAgICAgKyBjb2xvcl90YWJsZVtjbV1baV0udiAqIGxlcnBmcmFjOwogICAgICAgICB9CiAKLSAgICAgICAgb3V0WzBdICs9IHkgKiB5ZjsKLSAgICAgICAgb3V0WzFdICs9IHUgKiB1ZjsKLSAgICAgICAgb3V0WzJdICs9IHYgKiB2ZjsKKyAgICAgICAgb3V0WzBdID0geSAqIHlmOworICAgICAgICBvdXRbMV0gPSB1ICogdWY7CisgICAgICAgIG91dFsyXSA9IHYgKiB2ZjsKICAgICB9IGVsc2UgewotICAgICAgICBvdXRbMF0gKz0gYSAqIHlmOwotICAgICAgICBvdXRbMV0gKz0gYSAqIHVmOwotICAgICAgICBvdXRbMl0gKz0gYSAqIHZmOworICAgICAgICBvdXRbMF0gPSBhICogeWY7CisgICAgICAgIG91dFsxXSA9IGEgKiB1ZjsKKyAgICAgICAgb3V0WzJdID0gYSAqIHZmOwogICAgIH0KIH0KIApAQCAtNjA4LDczICs2NTYsODUgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBpbnQgcGxvdF9jaGFubmVsKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgU2hvd1NwZWN0cnVtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBpbnQgaCA9IHMtPm9yaWVudGF0aW9uID09IFZFUlRJQ0FMID8gcy0+Y2hhbm5lbF9oZWlnaHQgOiBzLT5jaGFubmVsX3dpZHRoOworICAgIGNvbnN0IGludCBjaCA9IGpvYm5yOworICAgIGZsb2F0ICptYWduaXR1ZGVzID0gcy0+bWFnbml0dWRlc1tjaF07CisgICAgZmxvYXQgKnBoYXNlcyA9IHMtPnBoYXNlc1tjaF07CisgICAgZmxvYXQgeWYsIHVmLCB2ZjsKKyAgICBpbnQgeTsKKworICAgIC8qIGRlY2lkZSBjb2xvciByYW5nZSAqLworICAgIGNvbG9yX3JhbmdlKHMsIGNoLCAmeWYsICZ1ZiwgJnZmKTsKKworICAgIC8qIGRyYXcgdGhlIGNoYW5uZWwgKi8KKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGludCByb3cgPSAocy0+bW9kZSA9PSBDT01CSU5FRCkgPyB5IDogY2ggKiBoICsgeTsKKyAgICAgICAgZmxvYXQgKm91dCA9ICZzLT5jb2xvcl9idWZmZXJbY2hdWzMgKiByb3ddOworICAgICAgICBmbG9hdCBhOworCisgICAgICAgIHN3aXRjaCAocy0+ZGF0YSkgeworICAgICAgICBjYXNlIERfTUFHTklUVURFOgorICAgICAgICAgICAgLyogZ2V0IG1hZ25pdHVkZSAqLworICAgICAgICAgICAgYSA9IG1hZ25pdHVkZXNbeV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEX1BIQVNFOgorICAgICAgICAgICAgLyogZ2V0IHBoYXNlICovCisgICAgICAgICAgICBhID0gcGhhc2VzW3ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisKKyAgICAgICAgLyogYXBwbHkgc2NhbGUgKi8KKyAgICAgICAgc3dpdGNoIChzLT5zY2FsZSkgeworICAgICAgICBjYXNlIExJTkVBUjoKKyAgICAgICAgICAgIGEgPSBhdl9jbGlwZihhLCAwLCAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNRUlQ6CisgICAgICAgICAgICBhID0gYXZfY2xpcGYoc3FydChhKSwgMCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQlJUOgorICAgICAgICAgICAgYSA9IGF2X2NsaXBmKGNicnQoYSksIDAsIDEpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRk9VUlRIUlQ6CisgICAgICAgICAgICBhID0gYXZfY2xpcGYoc3FydChzcXJ0KGEpKSwgMCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGSUZUSFJUOgorICAgICAgICAgICAgYSA9IGF2X2NsaXBmKHBvdyhhLCAwLjIwKSwgMCwgMSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMT0c6CisgICAgICAgICAgICBhID0gMSArIGxvZzEwKGF2X2NsaXBkKGEsIDFlLTYsIDEpKSAvIDY7IC8vIHplcm8gPSAtMTIwZEJGUworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisKKyAgICAgICAgcGlja19jb2xvcihzLCB5ZiwgdWYsIHZmLCBhLCBvdXQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHBsb3Rfc3BlY3RydW1fY29sdW1uKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbnNhbXBsZXMpCiB7Ci0gICAgaW50IHJldDsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwogICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKICAgICBTaG93U3BlY3RydW1Db250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIEFWRnJhbWUgKm91dHBpY3JlZiA9IHMtPm91dHBpY3JlZjsKLSAgICBpbnQgaCA9IHMtPm9yaWVudGF0aW9uID09IFZFUlRJQ0FMID8gcy0+Y2hhbm5lbF9oZWlnaHQgOiBzLT5jaGFubmVsX3dpZHRoOwotCi0gICAgaW50IGNoLCBwbGFuZSwgeCwgeTsKKyAgICBpbnQgcmV0LCBwbGFuZSwgeCwgeSwgeiA9IHMtPm9yaWVudGF0aW9uID09IFZFUlRJQ0FMID8gcy0+aCA6IHMtPnc7CiAKICAgICAvKiBmaWxsIGEgbmV3IHNwZWN0cnVtIGNvbHVtbiAqLwogICAgIC8qIGluaXRpYWxpemUgYnVmZmVyIGZvciBjb21iaW5pbmcgdG8gYmxhY2sgKi8KLSAgICBjbGVhcl9jb21iaW5lX2J1ZmZlcihzLCBzLT5vcmllbnRhdGlvbiA9PSBWRVJUSUNBTCA/IHMtPmggOiBzLT53KTsKKyAgICBjbGVhcl9jb21iaW5lX2J1ZmZlcihzLCB6KTsKIAotICAgIGZvciAoY2ggPSAwOyBjaCA8IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgZmxvYXQgKm1hZ25pdHVkZXMgPSBzLT5tYWduaXR1ZGVzW2NoXTsKLSAgICAgICAgZmxvYXQgKnBoYXNlcyA9IHMtPnBoYXNlc1tjaF07Ci0gICAgICAgIGZsb2F0IHlmLCB1ZiwgdmY7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHBsb3RfY2hhbm5lbCwgTlVMTCwgTlVMTCwgcy0+bmJfZGlzcGxheV9jaGFubmVscyk7CiAKLSAgICAgICAgLyogZGVjaWRlIGNvbG9yIHJhbmdlICovCi0gICAgICAgIGNvbG9yX3JhbmdlKHMsIGNoLCAmeWYsICZ1ZiwgJnZmKTsKLQotICAgICAgICAvKiBkcmF3IHRoZSBjaGFubmVsICovCi0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgICAgIGludCByb3cgPSAocy0+bW9kZSA9PSBDT01CSU5FRCkgPyB5IDogY2ggKiBoICsgeTsKLSAgICAgICAgICAgIGZsb2F0ICpvdXQgPSAmcy0+Y29tYmluZV9idWZmZXJbMyAqIHJvd107Ci0gICAgICAgICAgICBmbG9hdCBhOwotCi0gICAgICAgICAgICBzd2l0Y2ggKHMtPmRhdGEpIHsKLSAgICAgICAgICAgIGNhc2UgRF9NQUdOSVRVREU6Ci0gICAgICAgICAgICAgICAgLyogZ2V0IG1hZ25pdHVkZSAqLwotICAgICAgICAgICAgICAgIGEgPSBtYWduaXR1ZGVzW3ldOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBEX1BIQVNFOgotICAgICAgICAgICAgICAgIC8qIGdldCBwaGFzZSAqLwotICAgICAgICAgICAgICAgIGEgPSBwaGFzZXNbeV07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGFwcGx5IHNjYWxlICovCi0gICAgICAgICAgICBzd2l0Y2ggKHMtPnNjYWxlKSB7Ci0gICAgICAgICAgICBjYXNlIExJTkVBUjoKLSAgICAgICAgICAgICAgICBhID0gYXZfY2xpcGYoYSwgMCwgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNRUlQ6Ci0gICAgICAgICAgICAgICAgYSA9IGF2X2NsaXBmKHNxcnQoYSksIDAsIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBDQlJUOgotICAgICAgICAgICAgICAgIGEgPSBhdl9jbGlwZihjYnJ0KGEpLCAwLCAxKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRk9VUlRIUlQ6Ci0gICAgICAgICAgICAgICAgYSA9IGF2X2NsaXBmKHNxcnQoc3FydChhKSksIDAsIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGSUZUSFJUOgotICAgICAgICAgICAgICAgIGEgPSBhdl9jbGlwZihwb3coYSwgMC4yMCksIDAsIDEpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBMT0c6Ci0gICAgICAgICAgICAgICAgYSA9IDEgKyBsb2cxMChhdl9jbGlwZChhLCAxZS02LCAxKSkgLyA2OyAvLyB6ZXJvID0gLTEyMGRCRlMKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcGlja19jb2xvcihzLCB5ZiwgdWYsIHZmLCBhLCBvdXQpOworICAgIGZvciAoeSA9IDA7IHkgPCB6ICogMzsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5uYl9kaXNwbGF5X2NoYW5uZWxzOyB4KyspIHsKKyAgICAgICAgICAgIHMtPmNvbWJpbmVfYnVmZmVyW3ldICs9IHMtPmNvbG9yX2J1ZmZlclt4XVt5XTsKICAgICAgICAgfQogICAgIH0KIApAQCAtODE1LDExICs4NzUsMTMgQEAKIAogICAgICAgICBhdl9hc3NlcnQwKGZpbi0+bmJfc2FtcGxlcyA9PSBzLT53aW5fc2l6ZSk7CiAKLSAgICAgICAgcnVuX2ZmdChzLCBmaW4pOworICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgcnVuX2NoYW5uZWxfZmZ0LCBmaW4sIE5VTEwsIHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMpOworCiAgICAgICAgIGlmIChzLT5kYXRhID09IERfTUFHTklUVURFKQotICAgICAgICAgICAgY2FsY19tYWduaXR1ZGVzKHMpOworICAgICAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGNhbGNfY2hhbm5lbF9tYWduaXR1ZGVzLCBOVUxMLCBOVUxMLCBzLT5uYl9kaXNwbGF5X2NoYW5uZWxzKTsKKwogICAgICAgICBpZiAocy0+ZGF0YSA9PSBEX1BIQVNFKQotICAgICAgICAgICAgY2FsY19waGFzZXMocyk7CisgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgY2FsY19jaGFubmVsX3BoYXNlcywgTlVMTCwgTlVMTCwgcy0+bmJfZGlzcGxheV9jaGFubmVscyk7CiAKICAgICAgICAgcmV0ID0gcGxvdF9zcGVjdHJ1bV9jb2x1bW4oaW5saW5rLCBmaW4pOwogICAgICAgICBhdl9mcmFtZV9mcmVlKCZmaW4pOwpAQCAtODYyLDYgKzkyNCw3IEBACiAgICAgLmlucHV0cyAgICAgICAgPSBzaG93c3BlY3RydW1faW5wdXRzLAogICAgIC5vdXRwdXRzICAgICAgID0gc2hvd3NwZWN0cnVtX291dHB1dHMsCiAgICAgLnByaXZfY2xhc3MgICAgPSAmc2hvd3NwZWN0cnVtX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAogfTsKICNlbmRpZiAvLyBDT05GSUdfU0hPV1NQRUNUUlVNX0ZJTFRFUgogCkBAIC04ODQsMTIgKzk0NywxMiBAQAogICAgICAgICB7ICJmcnVpdCIsICAgICAiZnJ1aXQgYmFzZWQgY29sb3JpbmciLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GUlVJVH0sICAgICAwLCAwLCBGTEFHUywgImNvbG9yIiB9LAogICAgICAgICB7ICJjb29sIiwgICAgICAiY29vbCBiYXNlZCBjb2xvcmluZyIsICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DT09MfSwgICAgICAwLCAwLCBGTEFHUywgImNvbG9yIiB9LAogICAgIHsgInNjYWxlIiwgInNldCBkaXNwbGF5IHNjYWxlIiwgT0ZGU0VUKHNjYWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1MT0d9LCAwLCBOQl9TQ0FMRVMtMSwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAibGluIiwgICJsaW5lYXIiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MSU5FQVJ9LCAwLCAwLCBGTEFHUywgInNjYWxlIiB9LAogICAgICAgICB7ICJzcXJ0IiwgInNxdWFyZSByb290IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNRUlR9LCAgIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCiAgICAgICAgIHsgImNicnQiLCAiY3ViaWMgcm9vdCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q0JSVH0sICAgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAibG9nIiwgICJsb2dhcml0aG1pYyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MT0d9LCAgICAwLCAwLCBGTEFHUywgInNjYWxlIiB9LAogICAgICAgICB7ICI0dGhydCIsIjR0aCByb290IiwgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZPVVJUSFJUfSwgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKICAgICAgICAgeyAiNXRocnQiLCI1dGggcm9vdCIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GSUZUSFJUfSwgIDAsIDAsIEZMQUdTLCAic2NhbGUiIH0sCi0gICAgICAgIHsgImxvZyIsICAibG9nYXJpdGhtaWMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TE9HfSwgICAgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKLSAgICAgICAgeyAibGluIiwgICJsaW5lYXIiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MSU5FQVJ9LCAwLCAwLCBGTEFHUywgInNjYWxlIiB9LAogICAgIHsgInNhdHVyYXRpb24iLCAiY29sb3Igc2F0dXJhdGlvbiBtdWx0aXBsaWVyIiwgT0ZGU0VUKHNhdHVyYXRpb24pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAxfSwgLTEwLCAxMCwgRkxBR1MgfSwKICAgICB7ICJ3aW5fZnVuYyIsICJzZXQgd2luZG93IGZ1bmN0aW9uIiwgT0ZGU0VUKHdpbl9mdW5jKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFdGVU5DX0hBTk5JTkd9LCAwLCBOQl9XRlVOQy0xLCBGTEFHUywgIndpbl9mdW5jIiB9LAogICAgICAgICB7ICJyZWN0IiwgICAgICJSZWN0YW5ndWxhciIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX1JFQ1R9LCAgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKQEAgLTkwOCwxMSArOTcxLDE2IEBACiAgICAgICAgIHsgImxhbmN6b3MiLCAgIkxhbmN6b3MiLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfTEFOQ1pPU30sICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAogICAgICAgICB7ICJnYXVzcyIsICAgICJHYXVzcyIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0dBVVNTfSwgICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKICAgICAgICAgeyAidHVrZXkiLCAgICAiVHVrZXkiLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19UVUtFWX0sICAgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgImRvbHBoIiwgICAgIkRvbHBoLUNoZWJ5c2hldiIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfRE9MUEh9LCAgICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAorICAgICAgICB7ICJjYXVjaHkiLCAgICJDYXVjaHkiLCAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVdGVU5DX0NBVUNIWX0sICAgMCwgMCwgRkxBR1MsICJ3aW5fZnVuYyIgfSwKKyAgICAgICAgeyAicGFyemVuIiwgICAiUGFyemVuIiwgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1XRlVOQ19QQVJaRU59LCAgIDAsIDAsIEZMQUdTLCAid2luX2Z1bmMiIH0sCisgICAgICAgIHsgInBvaXNzb24iLCAgIlBvaXNzb24iLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9V0ZVTkNfUE9JU1NPTn0sICAwLCAwLCBGTEFHUywgIndpbl9mdW5jIiB9LAogICAgIHsgIm9yaWVudGF0aW9uIiwgInNldCBvcmllbnRhdGlvbiIsIE9GRlNFVChvcmllbnRhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9VkVSVElDQUx9LCAwLCBOQl9PUklFTlRBVElPTlMtMSwgRkxBR1MsICJvcmllbnRhdGlvbiIgfSwKICAgICAgICAgeyAidmVydGljYWwiLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1WRVJUSUNBTH0sICAgMCwgMCwgRkxBR1MsICJvcmllbnRhdGlvbiIgfSwKICAgICAgICAgeyAiaG9yaXpvbnRhbCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1IT1JJWk9OVEFMfSwgMCwgMCwgRkxBR1MsICJvcmllbnRhdGlvbiIgfSwKICAgICB7ICJnYWluIiwgInNldCBzY2FsZSBnYWluIiwgT0ZGU0VUKGdhaW4pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmwgPSAxfSwgMCwgMTI4LCBGTEFHUyB9LAogICAgIHsgImxlZ2VuZCIsICJkcmF3IGxlZ2VuZCIsIE9GRlNFVChsZWdlbmQpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDF9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInJvdGF0aW9uIiwgImNvbG9yIHJvdGF0aW9uIiwgT0ZGU0VUKHJvdGF0aW9uKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMH0sIC0xLCAxLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC05NTQsMTkgKzEwMjIsMjIgQEAKIAogc3RhdGljIGludCBzaG93c3BlY3RydW1waWNfcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCiB7Ci0gICAgU2hvd1NwZWN0cnVtQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKLSAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IG91dGxpbmstPnNyYy0+aW5wdXRzWzBdOwotICAgIGludCByZXQ7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgU2hvd1NwZWN0cnVtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIGludCByZXQsIHNhbXBsZXM7CiAKICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGlubGluayk7Ci0gICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBzLT5vdXRwaWNyZWYpIHsKLSAgICAgICAgaW50IHNhbXBsZXMgPSBhdl9hdWRpb19maWZvX3NpemUocy0+Zmlmbyk7CisgICAgc2FtcGxlcyA9IGF2X2F1ZGlvX2ZpZm9fc2l6ZShzLT5maWZvKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIHMtPm91dHBpY3JlZiAmJiBzYW1wbGVzID4gMCkgewogICAgICAgICBpbnQgY29uc3VtZWQgPSAwOwogICAgICAgICBpbnQgeSwgeCA9IDAsIHN6ID0gcy0+b3JpZW50YXRpb24gPT0gVkVSVElDQUwgPyBzLT53IDogcy0+aDsKICAgICAgICAgaW50IGNoLCBzcGYsIHNwYjsKICAgICAgICAgQVZGcmFtZSAqZmluOwogCiAgICAgICAgIHNwZiA9IHMtPndpbl9zaXplICogKHNhbXBsZXMgLyAoKHMtPndpbl9zaXplICogc3opICogY2VpbChzYW1wbGVzIC8gKGZsb2F0KShzLT53aW5fc2l6ZSAqIHN6KSkpKTsKKyAgICAgICAgc3BmID0gRkZNQVgoMSwgc3BmKTsKKwogICAgICAgICBzcGIgPSAoc2FtcGxlcyAvIChzcGYgKiBzeikpICogc3BmOwogCiAgICAgICAgIGZpbiA9IGZmX2dldF9hdWRpb19idWZmZXIoaW5saW5rLCBzLT53aW5fc2l6ZSk7CkBAIC05ODksNyArMTA2MCw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBydW5fZmZ0KHMsIGZpbik7CisgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgcnVuX2NoYW5uZWxfZmZ0LCBmaW4sIE5VTEwsIHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMpOwogICAgICAgICAgICAgYWNhbGNfbWFnbml0dWRlcyhzKTsKIAogICAgICAgICAgICAgY29uc3VtZWQgKz0gc3BmOwpAQCAtMTA1NCwxMyArMTEyNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gMjAwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5ICs9IDQwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoeiA9IHkgKiAoaW5saW5rLT5zYW1wbGVfcmF0ZSAvIDIpIC8gKGZsb2F0KSgxIDw8IChpbnQpY2VpbChsb2cyKGgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoZXJ0eiA9IHkgKiAoaW5saW5rLT5zYW1wbGVfcmF0ZSAvIDIpIC8gKGZsb2F0KSgxIDw8IChpbnQpY2VpbChsb2cyKGgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp1bml0czsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh6ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVydHogPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyA9IGF2X2FzcHJpbnRmKCJEQyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzID0gYXZfYXNwcmludGYoIiUuMmYiLCBoeik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSBhdl9hc3ByaW50ZigiJS4yZiIsIGhlcnR6KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5pdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIApAQCAtMTExOSwxMyArMTE5MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gMjAwOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4ICs9IDgwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoeiA9IHggKiAoaW5saW5rLT5zYW1wbGVfcmF0ZSAvIDIpIC8gKGZsb2F0KSgxIDw8IChpbnQpY2VpbChsb2cyKHcpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoZXJ0eiA9IHggKiAoaW5saW5rLT5zYW1wbGVfcmF0ZSAvIDIpIC8gKGZsb2F0KSgxIDw8IChpbnQpY2VpbChsb2cyKHcpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICp1bml0czsKIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh6ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVydHogPT0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0cyA9IGF2X2FzcHJpbnRmKCJEQyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzID0gYXZfYXNwcmludGYoIiUuMmYiLCBoeik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMgPSBhdl9hc3ByaW50ZigiJS4yZiIsIGhlcnR6KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdW5pdHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIApAQCAtMTE2NiwxNCArMTIzNywzMSBAQAogICAgICAgICAgICAgICAgICAgICBmb3IgKGNobiA9IDA7IGNobiA8IChzLT5tb2RlID09IFNFUEFSQVRFID8gMSA6IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMpOyBjaG4rKykgewogICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeWYsIHVmLCB2ZjsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsID0gKG11bHRpKSA/IHMtPm5iX2Rpc3BsYXlfY2hhbm5lbHMgLSBjaCAtIDEgOiBjaG47CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsb3V0WzNdOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9yYW5nZShzLCBjaGFubmVsLCAmeWYsICZ1ZiwgJnZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tfY29sb3IocywgeWYsIHVmLCB2ZiwgeSAvIChmbG9hdCloLCBvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGlja19jb2xvcihzLCB5ZiwgdWYsIHZmLCB5IC8gKGZsb2F0KWgsIGxvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0WzBdICs9IGxvdXRbMF07CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRbMV0gKz0gbG91dFsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFsyXSArPSBsb3V0WzJdOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5vdXRwaWNyZWYtPmRhdGFbMF0rKHMtPnN0YXJ0X3kgKyBoICogKGNoICsgMSkgLSB5IC0gMSkgKiBzLT5vdXRwaWNyZWYtPmxpbmVzaXplWzBdICsgcy0+dyArIHMtPnN0YXJ0X3ggKyAyMCwgYXZfY2xpcF91aW50OChvdXRbMF0pLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5vdXRwaWNyZWYtPmRhdGFbMV0rKHMtPnN0YXJ0X3kgKyBoICogKGNoICsgMSkgLSB5IC0gMSkgKiBzLT5vdXRwaWNyZWYtPmxpbmVzaXplWzFdICsgcy0+dyArIHMtPnN0YXJ0X3ggKyAyMCwgYXZfY2xpcF91aW50OChvdXRbMV0pLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzLT5vdXRwaWNyZWYtPmRhdGFbMl0rKHMtPnN0YXJ0X3kgKyBoICogKGNoICsgMSkgLSB5IC0gMSkgKiBzLT5vdXRwaWNyZWYtPmxpbmVzaXplWzJdICsgcy0+dyArIHMtPnN0YXJ0X3ggKyAyMCwgYXZfY2xpcF91aW50OChvdXRbMl0pLCAxMCk7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgY2ggPT0gMCAmJiB5IDwgaDsgeSArPSBoIC8gMTApIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUgPSAxMjAuMCAqIGxvZzEwKDEuIC0geSAvIChmbG9hdCloKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqdGV4dDsKKworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAtMTIwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBhdl9hc3ByaW50ZigiJS4wZiBkQiIsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGRyYXd0ZXh0KHMtPm91dHBpY3JlZiwgcy0+dyArIHMtPnN0YXJ0X3ggKyAzNSwgcy0+c3RhcnRfeSArIHkgLSA1LCB0ZXh0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZSh0ZXh0KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMTIyMyw2ICsxMzExLDcgQEAKICAgICAuaW5wdXRzICAgICAgICA9IHNob3dzcGVjdHJ1bXBpY19pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBzaG93c3BlY3RydW1waWNfb3V0cHV0cywKICAgICAucHJpdl9jbGFzcyAgICA9ICZzaG93c3BlY3RydW1waWNfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCiB9OwogCiAjZW5kaWYgLy8gQ09ORklHX1NIT1dTUEVDVFJVTVBJQ19GSUxURVIKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93dm9sdW1lLmMgYi9saWJhdmZpbHRlci9hdmZfc2hvd3ZvbHVtZS5jCmluZGV4IGY3Y2NkZjcuLjZiNTUzYzQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93dm9sdW1lLmMKKysrIGIvbGliYXZmaWx0ZXIvYXZmX3Nob3d2b2x1bWUuYwpAQCAtMzEsOCArMzEsOSBAQAogI2luY2x1ZGUgInZpZGVvLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geyAgICJWT0xVTUUiLCAgICJDSEFOTkVMIiwgICAgICAgIE5VTEwgfTsKLWVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgVkFSX1ZPTFVNRSwgVkFSX0NIQU5ORUwsIFZBUl9WQVJTX05CIH07CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7ICAgIlZPTFVNRSIsICAgIkNIQU5ORUwiLCAgICJQRUFLIiwgICAgICAgIE5VTEwgfTsKK2VudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgVkFSX1ZPTFVNRSwgVkFSX0NIQU5ORUwsIFZBUl9QRUFLLCBWQVJfVkFSU19OQiB9OworZW51bSBEaXNwbGF5U2NhbGUgICB7IExJTkVBUiwgTE9HLCBOQl9ESVNQTEFZX1NDQUxFIH07CiAKIHR5cGVkZWYgc3RydWN0IFNob3dWb2x1bWVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKQEAgLTQxLDI3ICs0Miw1NiBAQAogICAgIGRvdWJsZSBmOwogICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKICAgICBjaGFyICpjb2xvcjsKKyAgICBpbnQgb3JpZW50YXRpb247CisgICAgaW50IHN0ZXA7CisgICAgZmxvYXQgYmdvcGFjaXR5OworICAgIGludCBtb2RlOwogCiAgICAgQVZGcmFtZSAqb3V0OwogICAgIEFWRXhwciAqY19leHByOwogICAgIGludCBkcmF3X3RleHQ7CiAgICAgaW50IGRyYXdfdm9sdW1lOwogICAgIGRvdWJsZSAqdmFsdWVzOworICAgIHVpbnQzMl90ICpjb2xvcl9sdXQ7CisgICAgZmxvYXQgKm1heDsKKyAgICBmbG9hdCBybXNfZmFjdG9yOworICAgIGludCBkaXNwbGF5X3NjYWxlOworCisgICAgZG91YmxlIGRyYXdfcGVyc2lzdGVudF9kdXJhdGlvbjsgLyogaW4gc2Vjb25kICovCisgICAgdWludDhfdCBwZXJzaXN0YW50X21heF9yZ2JhWzRdOworICAgIGludCBwZXJzaXN0ZW50X21heF9mcmFtZXM7IC8qIG51bWJlciBvZiBmcmFtZXMgdG8gY2hlY2sgbWF4IHZhbHVlICovCisgICAgZmxvYXQgKm1heF9wZXJzaXN0ZW50OyAvKiBtYXggdmFsdWUgZm9yIGRyYXdfcGVyc2lzdGVudF9tYXggZm9yIGVhY2ggY2hhbm5lbCAqLworICAgIGludCAqbmJfZnJhbWVzX21heF9kaXNwbGF5OyAvKiBudW1iZXIgb2YgZnJhbWUgZm9yIGVhY2ggY2hhbm5lbCwgZm9yIGRpc3BsYXlpbmcgdGhlIG1heCB2YWx1ZSAqLworCisgICAgdm9pZCAoKm1ldGVyKShmbG9hdCAqc3JjLCBpbnQgbmJfc2FtcGxlcywgZmxvYXQgKm1heCwgZmxvYXQgZmFjdG9yKTsKIH0gU2hvd1ZvbHVtZUNvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNob3dWb2x1bWVDb250ZXh0LCB4KQogI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNob3d2b2x1bWVfb3B0aW9uc1tdID0gewotICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0cj0iMjUifSwgMCwgMCwgRkxBR1MgfSwKLSAgICB7ICJyIiwgICAgInNldCB2aWRlbyByYXRlIiwgIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHI9IjI1In0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAicmF0ZSIsICJzZXQgdmlkZW8gcmF0ZSIsICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyPSIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInIiLCAgICAic2V0IHZpZGVvIHJhdGUiLCAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0cj0iMjUifSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKICAgICB7ICJiIiwgInNldCBib3JkZXIgd2lkdGgiLCAgIE9GRlNFVChiKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMCwgNSwgRkxBR1MgfSwKLSAgICB7ICJ3IiwgInNldCBjaGFubmVsIHdpZHRoIiwgIE9GRlNFVCh3KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND00MDB9LCA4MCwgMTA4MCwgRkxBR1MgfSwKLSAgICB7ICJoIiwgInNldCBjaGFubmVsIGhlaWdodCIsIE9GRlNFVChoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0yMH0sIDEsIDEwMCwgRkxBR1MgfSwKLSAgICB7ICJmIiwgInNldCBmYWRlIiwgICAgICAgICAgIE9GRlNFVChmKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLjk1fSwgMC4wMDEsIDEsIEZMQUdTIH0sCi0gICAgeyAiYyIsICJzZXQgdm9sdW1lIGNvbG9yIGV4cHJlc3Npb24iLCBPRkZTRVQoY29sb3IpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJpZihndGUoVk9MVU1FLC02KSwgaWYoZ3RlKFZPTFVNRSwtMiksIGlmKGd0ZShWT0xVTUUsLTEpLCBpZihndChWT0xVTUUsMCksIDB4ZmYwMDAwZmYsIDB4ZmYwMDY2ZmYpLCAweGZmMDBmZmZmKSwweGZmMDBmZjAwKSwweGZmZmYwMDAwKSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInciLCAic2V0IGNoYW5uZWwgd2lkdGgiLCAgT0ZGU0VUKHcpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTQwMH0sIDgwLCA4MTkyLCBGTEFHUyB9LAorICAgIHsgImgiLCAic2V0IGNoYW5uZWwgaGVpZ2h0IiwgT0ZGU0VUKGgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTIwfSwgMSwgOTAwLCBGTEFHUyB9LAorICAgIHsgImYiLCAic2V0IGZhZGUiLCAgICAgICAgICAgT0ZGU0VUKGYpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTAuOTV9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgImMiLCAic2V0IHZvbHVtZSBjb2xvciBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbG9yKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iUEVBSyoyNTUrZmxvb3IoKDEtUEVBSykqMjU1KSoyNTYrMHhmZjAwMDAwMCJ9LCAwLCAwLCBGTEFHUyB9LAogICAgIHsgInQiLCAiZGlzcGxheSBjaGFubmVsIG5hbWVzIiwgT0ZGU0VUKGRyYXdfdGV4dCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTF9LCAwLCAxLCBGTEFHUyB9LAogICAgIHsgInYiLCAiZGlzcGxheSB2b2x1bWUgdmFsdWUiLCBPRkZTRVQoZHJhd192b2x1bWUpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0xfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJkbSIsICJkdXJhdGlvbiBmb3IgbWF4IHZhbHVlIGRpc3BsYXkiLCBPRkZTRVQoZHJhd19wZXJzaXN0ZW50X2R1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibD0wLn0sIDAsIDkwMDAsIEZMQUdTfSwKKyAgICB7ICJkbWMiLCJzZXQgY29sb3Igb2YgdGhlIG1heCB2YWx1ZSBsaW5lIiwgT0ZGU0VUKHBlcnNpc3RhbnRfbWF4X3JnYmEpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHIgPSAib3JhbmdlIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJvIiwgInNldCBvcmllbnRhdGlvbiIsIE9GRlNFVChvcmllbnRhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTLCAib3JpZW50YXRpb24iIH0sCisgICAgeyAgICJoIiwgImhvcml6b250YWwiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAib3JpZW50YXRpb24iIH0sCisgICAgeyAgICJ2IiwgInZlcnRpY2FsIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEZMQUdTLCAib3JpZW50YXRpb24iIH0sCisgICAgeyAicyIsICJzZXQgc3RlcCBzaXplIiwgT0ZGU0VUKHN0ZXApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCA1LCBGTEFHUyB9LAorICAgIHsgInAiLCAic2V0IGJhY2tncm91bmQgb3BhY2l0eSIsIE9GRlNFVChiZ29wYWNpdHkpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAibSIsICJzZXQgbW9kZSIsIE9GRlNFVChtb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgICAicCIsICJwZWFrIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAgICJyIiwgInJtcyIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJkcyIsICJzZXQgZGlzcGxheSBzY2FsZSIsIE9GRlNFVChkaXNwbGF5X3NjYWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1MSU5FQVJ9LCBMSU5FQVIsIE5CX0RJU1BMQVlfU0NBTEUgLSAxLCBGTEFHUywgImRpc3BsYXlfc2NhbGUiIH0sCisgICAgeyAgICJsaW4iLCAibGluZWFyIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUxJTkVBUn0sIDAsIDAsIEZMQUdTLCAiZGlzcGxheV9zY2FsZSIgfSwKKyAgICB7ICAgImxvZyIsICJsb2ciLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUxPR30sIDAsIDAsIEZMQUdTLCAiZGlzcGxheV9zY2FsZSIgfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtOTYsNyArMTI2LDcgQEAKICAgICBpZiAoKHJldCA9IGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZpbmxpbmstPm91dF9mb3JtYXRzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgbGF5b3V0cyA9IGZmX2FsbF9jaGFubmVsX2xheW91dHMoKTsKKyAgICBsYXlvdXRzID0gZmZfYWxsX2NoYW5uZWxfY291bnRzKCk7CiAgICAgaWYgKChyZXQgPSBmZl9jaGFubmVsX2xheW91dHNfcmVmKGxheW91dHMsICZpbmxpbmstPm91dF9jaGFubmVsX2xheW91dHMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTExMSw2ICsxNDEsMjMgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZmluZF9wZWFrKGZsb2F0ICpzcmMsIGludCBuYl9zYW1wbGVzLCBmbG9hdCAqcGVhaywgZmxvYXQgZmFjdG9yKQoreworICAgIGludCBpOworCisgICAgKnBlYWsgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zYW1wbGVzOyBpKyspCisgICAgICAgICpwZWFrID0gRkZNQVgoKnBlYWssIEZGQUJTKHNyY1tpXSkpOworfQorCitzdGF0aWMgdm9pZCBmaW5kX3JtcyhmbG9hdCAqc3JjLCBpbnQgbmJfc2FtcGxlcywgZmxvYXQgKnJtcywgZmxvYXQgZmFjdG9yKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX3NhbXBsZXM7IGkrKykKKyAgICAgICAgKnJtcyArPSBmYWN0b3IgKiAoc3JjW2ldICogc3JjW2ldIC0gKnJtcyk7Cit9CisKIHN0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQogewogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CkBAIC0xMjQsNiArMTcxLDI4IEBACiAgICAgcy0+dmFsdWVzID0gYXZfY2FsbG9jKGlubGluay0+Y2hhbm5lbHMgKiBWQVJfVkFSU19OQiwgc2l6ZW9mKGRvdWJsZSkpOwogICAgIGlmICghcy0+dmFsdWVzKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+Y29sb3JfbHV0ID0gYXZfY2FsbG9jKHMtPncsIHNpemVvZigqcy0+Y29sb3JfbHV0KSAqIGlubGluay0+Y2hhbm5lbHMpOworICAgIGlmICghcy0+Y29sb3JfbHV0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+bWF4ID0gYXZfY2FsbG9jKGlubGluay0+Y2hhbm5lbHMsIHNpemVvZigqcy0+bWF4KSk7CisgICAgaWYgKCFzLT5tYXgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5ybXNfZmFjdG9yID0gMTAwMDAuIC8gaW5saW5rLT5zYW1wbGVfcmF0ZTsKKworICAgIHN3aXRjaCAocy0+bW9kZSkgeworICAgIGNhc2UgMDogcy0+bWV0ZXIgPSBmaW5kX3BlYWs7IGJyZWFrOworICAgIGNhc2UgMTogcy0+bWV0ZXIgPSBmaW5kX3JtczsgIGJyZWFrOworICAgIGRlZmF1bHQ6IHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisKKyAgICBpZiAocy0+ZHJhd19wZXJzaXN0ZW50X2R1cmF0aW9uID4gMC4pIHsKKyAgICAgICAgcy0+cGVyc2lzdGVudF9tYXhfZnJhbWVzID0gKGludCkgRkZNQVgoYXZfcTJkKHMtPmZyYW1lX3JhdGUpICogcy0+ZHJhd19wZXJzaXN0ZW50X2R1cmF0aW9uLCAxLik7CisgICAgICAgIHMtPm1heF9wZXJzaXN0ZW50ID0gYXZfY2FsbG9jKGlubGluay0+Y2hhbm5lbHMgKiBzLT5wZXJzaXN0ZW50X21heF9mcmFtZXMsIHNpemVvZigqcy0+bWF4X3BlcnNpc3RlbnQpKTsKKyAgICAgICAgcy0+bmJfZnJhbWVzX21heF9kaXNwbGF5ID0gYXZfY2FsbG9jKGlubGluay0+Y2hhbm5lbHMgKiBzLT5wZXJzaXN0ZW50X21heF9mcmFtZXMsIHNpemVvZigqcy0+bmJfZnJhbWVzX21heF9kaXNwbGF5KSk7CisgICAgfQogICAgIHJldHVybiAwOwogfQogCkBAIC0xMzEsMTYgKzIwMCwzNiBAQAogewogICAgIFNob3dWb2x1bWVDb250ZXh0ICpzID0gb3V0bGluay0+c3JjLT5wcml2OwogICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgaW50IGNoOwogCi0gICAgb3V0bGluay0+dyA9IHMtPnc7Ci0gICAgb3V0bGluay0+aCA9IHMtPmggKiBpbmxpbmstPmNoYW5uZWxzICsgKGlubGluay0+Y2hhbm5lbHMgLSAxKSAqIHMtPmI7CisgICAgaWYgKHMtPm9yaWVudGF0aW9uKSB7CisgICAgICAgIG91dGxpbmstPmggPSBzLT53OworICAgICAgICBvdXRsaW5rLT53ID0gcy0+aCAqIGlubGluay0+Y2hhbm5lbHMgKyAoaW5saW5rLT5jaGFubmVscyAtIDEpICogcy0+YjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRsaW5rLT53ID0gcy0+dzsKKyAgICAgICAgb3V0bGluay0+aCA9IHMtPmggKiBpbmxpbmstPmNoYW5uZWxzICsgKGlubGluay0+Y2hhbm5lbHMgLSAxKSAqIHMtPmI7CisgICAgfQorCiAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLDF9OwogICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBzLT5mcmFtZV9yYXRlOwogCisgICAgZm9yIChjaCA9IDA7IGNoIDwgaW5saW5rLT5jaGFubmVsczsgY2grKykgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+dzsgaSsrKSB7CisgICAgICAgICAgICBmbG9hdCBtYXggPSBpIC8gKGZsb2F0KShzLT53IC0gMSk7CisKKyAgICAgICAgICAgIHMtPnZhbHVlc1tjaCAqIFZBUl9WQVJTX05CICsgVkFSX1BFQUtdID0gbWF4OworICAgICAgICAgICAgcy0+dmFsdWVzW2NoICogVkFSX1ZBUlNfTkIgKyBWQVJfVk9MVU1FXSA9IDIwLjAgKiBsb2cxMChtYXgpOworICAgICAgICAgICAgcy0+dmFsdWVzW2NoICogVkFSX1ZBUlNfTkIgKyBWQVJfQ0hBTk5FTF0gPSBjaDsKKyAgICAgICAgICAgIHMtPmNvbG9yX2x1dFtjaCAqIHMtPncgKyBpXSA9IGF2X2V4cHJfZXZhbChzLT5jX2V4cHIsICZzLT52YWx1ZXNbY2ggKiBWQVJfVkFSU19OQl0sIE5VTEwpOworICAgICAgICB9CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYXd0ZXh0KEFWRnJhbWUgKnBpYywgaW50IHgsIGludCB5LCBjb25zdCBjaGFyICp0eHQpCitzdGF0aWMgdm9pZCBkcmF3dGV4dChBVkZyYW1lICpwaWMsIGludCB4LCBpbnQgeSwgY29uc3QgY2hhciAqdHh0LCBpbnQgbykKIHsKICAgICBjb25zdCB1aW50OF90ICpmb250OwogICAgIGludCBmb250X2hlaWdodDsKQEAgLTE1MCwxNSArMjM5LDgwIEBACiAKICAgICBmb3IgKGkgPSAwOyB0eHRbaV07IGkrKykgewogICAgICAgICBpbnQgY2hhcl95LCBtYXNrOwotICAgICAgICB1aW50OF90ICpwID0gcGljLT5kYXRhWzBdICsgeSpwaWMtPmxpbmVzaXplWzBdICsgKHggKyBpKjgpKjQ7CiAKLSAgICAgICAgZm9yIChjaGFyX3kgPSAwOyBjaGFyX3kgPCBmb250X2hlaWdodDsgY2hhcl95KyspIHsKLSAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZm9udFt0eHRbaV0gKiBmb250X2hlaWdodCArIGNoYXJfeV0gJiBtYXNrKQotICAgICAgICAgICAgICAgICAgICBBVl9XTjMyKHAsIH5BVl9STjMyKHApKTsKLSAgICAgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgIGlmIChvKSB7IC8qIHZlcnRpY2FsIG9yaWVudGF0aW9uICovCisgICAgICAgICAgICBmb3IgKGNoYXJfeSA9IGZvbnRfaGVpZ2h0IC0gMTsgY2hhcl95ID49IDA7IGNoYXJfeS0tKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcCA9IHBpYy0+ZGF0YVswXSArICh5ICsgaSAqIDEwKSAqIHBpYy0+bGluZXNpemVbMF0gKyB4ICogNDsKKyAgICAgICAgICAgICAgICBmb3IgKG1hc2sgPSAweDgwOyBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb250W3R4dFtpXSAqIGZvbnRfaGVpZ2h0ICsgZm9udF9oZWlnaHQgLSAxIC0gY2hhcl95XSAmIG1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjMyKCZwW2NoYXJfeSAqIDRdLCB+QVZfUk4zMigmcFtjaGFyX3kgKiA0XSkpOworICAgICAgICAgICAgICAgICAgICBwICs9IHBpYy0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcCArPSBwaWMtPmxpbmVzaXplWzBdIC0gOCo0OworICAgICAgICB9IGVsc2UgeyAvKiBob3Jpem9udGFsIG9yaWVudGF0aW9uICovCisgICAgICAgICAgICB1aW50OF90ICpwID0gcGljLT5kYXRhWzBdICsgeSAqIHBpYy0+bGluZXNpemVbMF0gKyAoeCArIGkgKiA4KSAqIDQ7CisgICAgICAgICAgICBmb3IgKGNoYXJfeSA9IDA7IGNoYXJfeSA8IGZvbnRfaGVpZ2h0OyBjaGFyX3krKykgeworICAgICAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRbdHh0W2ldICogZm9udF9oZWlnaHQgKyBjaGFyX3ldICYgbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dOMzIocCwgfkFWX1JOMzIocCkpOworICAgICAgICAgICAgICAgICAgICBwICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAgKz0gcGljLT5saW5lc2l6ZVswXSAtIDggKiA0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjbGVhcl9waWN0dXJlKFNob3dWb2x1bWVDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgaW50IGksIGo7CisgICAgY29uc3QgdWludDMyX3QgYmcgPSAodWludDMyX3QpKHMtPmJnb3BhY2l0eSAqIDI1NSkgPDwgMjQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgb3V0bGluay0+aDsgaSsrKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3QgPSAodWludDMyX3QgKikocy0+b3V0LT5kYXRhWzBdICsgaSAqIHMtPm91dC0+bGluZXNpemVbMF0pOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0bGluay0+dzsgaisrKQorICAgICAgICAgICAgQVZfV04zMkEoZHN0ICsgaiwgYmcpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgY2FsY19tYXhfZHJhdyhTaG93Vm9sdW1lQ29udGV4dCAqcywgQVZGaWx0ZXJMaW5rICpvdXRsaW5rLCBmbG9hdCBtYXgpCit7CisgICAgZmxvYXQgbWF4X3ZhbDsKKyAgICBpZiAocy0+ZGlzcGxheV9zY2FsZSA9PSBMSU5FQVIpIHsKKyAgICAgICAgbWF4X3ZhbCA9IG1heDsKKyAgICB9IGVsc2UgeyAvKiBsb2cgKi8KKyAgICAgICAgbWF4X3ZhbCA9IGF2X2NsaXBmKDAuMjEgKiBsb2cxMChtYXgpICsgMSwgMCwgMSk7CisgICAgfQorICAgIGlmIChzLT5vcmllbnRhdGlvbikgeyAvKiB2ZXJ0aWNhbCAqLworICAgICAgICByZXR1cm4gb3V0bGluay0+aCAtIG91dGxpbmstPmggKiBtYXhfdmFsOworICAgIH0gZWxzZSB7IC8qIGhvcml6b250YWwgKi8KKyAgICAgICAgcmV0dXJuIHMtPncgKiBtYXhfdmFsOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGNhbGNfcGVyc2lzdGVudF9tYXgoU2hvd1ZvbHVtZUNvbnRleHQgKnMsIGZsb2F0IG1heCwgaW50IGNoYW5uZWwpCit7CisgICAgLyogdXBkYXRlIG1heCB2YWx1ZSBmb3IgcGVyc2lzdGVudCBtYXggZGlzcGxheSAqLworICAgIGlmICgobWF4ID49IHMtPm1heF9wZXJzaXN0ZW50W2NoYW5uZWxdKSB8fCAocy0+bmJfZnJhbWVzX21heF9kaXNwbGF5W2NoYW5uZWxdID49IHMtPnBlcnNpc3RlbnRfbWF4X2ZyYW1lcykpIHsgLyogdXBkYXRlIG1heCB2YWx1ZSBmb3IgZGlzcGxheSAqLworICAgICAgICBzLT5tYXhfcGVyc2lzdGVudFtjaGFubmVsXSA9IG1heDsKKyAgICAgICAgcy0+bmJfZnJhbWVzX21heF9kaXNwbGF5W2NoYW5uZWxdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5uYl9mcmFtZXNfbWF4X2Rpc3BsYXlbY2hhbm5lbF0gKz0gMTsgLyogaW5jcmVtZW50ZSBkaXNwbGF5IGZyYW1lIGNvdW50ICovCisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHJhd19tYXhfbGluZShTaG93Vm9sdW1lQ29udGV4dCAqcywgaW50IG1heF9kcmF3LCBpbnQgY2hhbm5lbCkKK3sKKyAgICBpbnQgazsKKyAgICBpZiAocy0+b3JpZW50YXRpb24pIHsgLyogdmVydGljYWwgKi8KKyAgICAgICAgdWludDhfdCAqZHN0ID0gcy0+b3V0LT5kYXRhWzBdICsgbWF4X2RyYXcgKiBzLT5vdXQtPmxpbmVzaXplWzBdICsgY2hhbm5lbCAqIChzLT5iICsgcy0+aCkgKiA0OworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+aDsgaysrKSB7CisgICAgICAgICAgICBtZW1jcHkoZHN0ICsgayAqIDQsIHMtPnBlcnNpc3RhbnRfbWF4X3JnYmEsIHNpemVvZihzLT5wZXJzaXN0YW50X21heF9yZ2JhKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBob3Jpem9udGFsICovCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5oOyBrKyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IHMtPm91dC0+ZGF0YVswXSArIChjaGFubmVsICogcy0+aCArIGNoYW5uZWwgKiBzLT5iICsgaykgKiBzLT5vdXQtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgbWVtY3B5KGRzdCArIG1heF9kcmF3ICogNCwgcy0+cGVyc2lzdGFudF9tYXhfcmdiYSwgc2l6ZW9mKHMtPnBlcnNpc3RhbnRfbWF4X3JnYmEpKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE2OCw3ICszMjIsOCBAQAogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CiAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOwogICAgIFNob3dWb2x1bWVDb250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIGludCBjLCBpLCBqLCBrOworICAgIGNvbnN0IGludCBzdGVwID0gcy0+c3RlcDsKKyAgICBpbnQgYywgaiwgaywgbWF4X2RyYXc7CiAgICAgQVZGcmFtZSAqb3V0OwogCiAgICAgaWYgKCFzLT5vdXQgfHwgcy0+b3V0LT53aWR0aCAgIT0gb3V0bGluay0+dyB8fApAQCAtMTc5LDQ1ICszMzQsOTcgQEAKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluc2FtcGxlcyk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dGxpbmstPmg7IGkrKykKLSAgICAgICAgICAgIG1lbXNldChzLT5vdXQtPmRhdGFbMF0gKyBpICogcy0+b3V0LT5saW5lc2l6ZVswXSwgMCwgb3V0bGluay0+dyAqIDQpOworICAgICAgICBjbGVhcl9waWN0dXJlKHMsIG91dGxpbmspOwogICAgIH0KICAgICBzLT5vdXQtPnB0cyA9IGluc2FtcGxlcy0+cHRzOwogCi0gICAgZm9yIChqID0gMDsgaiA8IG91dGxpbmstPmg7IGorKykgewotICAgICAgICB1aW50OF90ICpkc3QgPSBzLT5vdXQtPmRhdGFbMF0gKyBqICogcy0+b3V0LT5saW5lc2l6ZVswXTsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IHMtPnc7IGsrKykgewotICAgICAgICAgICAgZHN0W2sgKiA0ICsgMF0gPSBGRk1BWChkc3RbayAqIDQgKyAwXSAqIHMtPmYsIDApOwotICAgICAgICAgICAgZHN0W2sgKiA0ICsgMV0gPSBGRk1BWChkc3RbayAqIDQgKyAxXSAqIHMtPmYsIDApOwotICAgICAgICAgICAgZHN0W2sgKiA0ICsgMl0gPSBGRk1BWChkc3RbayAqIDQgKyAyXSAqIHMtPmYsIDApOwotICAgICAgICAgICAgZHN0W2sgKiA0ICsgM10gPSBGRk1BWChkc3RbayAqIDQgKyAzXSAqIHMtPmYsIDApOworICAgIGlmICgocy0+ZiA8IDEuKSAmJiAocy0+ZiA+IDAuKSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0bGluay0+aDsgaisrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBzLT5vdXQtPmRhdGFbMF0gKyBqICogcy0+b3V0LT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhID0gcy0+YmdvcGFjaXR5ICogMjU1OworCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgb3V0bGluay0+dzsgaysrKSB7CisgICAgICAgICAgICAgICAgZHN0W2sgKiA0ICsgMF0gPSBGRk1BWChkc3RbayAqIDQgKyAwXSAqIHMtPmYsIDApOworICAgICAgICAgICAgICAgIGRzdFtrICogNCArIDFdID0gRkZNQVgoZHN0W2sgKiA0ICsgMV0gKiBzLT5mLCAwKTsKKyAgICAgICAgICAgICAgICBkc3RbayAqIDQgKyAyXSA9IEZGTUFYKGRzdFtrICogNCArIDJdICogcy0+ZiwgMCk7CisgICAgICAgICAgICAgICAgZHN0W2sgKiA0ICsgM10gPSBGRk1BWChkc3RbayAqIDQgKyAzXSAqIHMtPmYsIGFscGhhKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+ZiA9PSAwLikgeworICAgICAgICBjbGVhcl9waWN0dXJlKHMsIG91dGxpbmspOwogICAgIH0KIAotICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzOyBjKyspIHsKLSAgICAgICAgZmxvYXQgKnNyYyA9IChmbG9hdCAqKWluc2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YVtjXTsKLSAgICAgICAgZmxvYXQgbWF4ID0gMDsKLSAgICAgICAgdWludDMyX3QgY29sb3I7CisgICAgaWYgKHMtPm9yaWVudGF0aW9uKSB7IC8qIHZlcnRpY2FsICovCisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzOyBjKyspIHsKKyAgICAgICAgICAgIGZsb2F0ICpzcmMgPSAoZmxvYXQgKilpbnNhbXBsZXMtPmV4dGVuZGVkX2RhdGFbY107CisgICAgICAgICAgICB1aW50MzJfdCAqbHV0ID0gcy0+Y29sb3JfbHV0ICsgcy0+dyAqIGM7CisgICAgICAgICAgICBmbG9hdCBtYXg7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGluc2FtcGxlcy0+bmJfc2FtcGxlczsgaSsrKQotICAgICAgICAgICAgbWF4ID0gRkZNQVgobWF4LCBzcmNbaV0pOworICAgICAgICAgICAgcy0+bWV0ZXIoc3JjLCBpbnNhbXBsZXMtPm5iX3NhbXBsZXMsICZzLT5tYXhbY10sIHMtPnJtc19mYWN0b3IpOworICAgICAgICAgICAgbWF4ID0gcy0+bWF4W2NdOwogCi0gICAgICAgIHMtPnZhbHVlc1tjICogVkFSX1ZBUlNfTkIgKyBWQVJfVk9MVU1FXSA9IDIwLjAgKiBsb2cxMChtYXgpOwotICAgICAgICBtYXggPSBhdl9jbGlwZihtYXgsIDAsIDEpOwotICAgICAgICBzLT52YWx1ZXNbYyAqIFZBUl9WQVJTX05CICsgVkFSX0NIQU5ORUxdID0gYzsKLSAgICAgICAgY29sb3IgPSBhdl9leHByX2V2YWwocy0+Y19leHByLCAmcy0+dmFsdWVzW2MgKiBWQVJfVkFSU19OQl0sIE5VTEwpOworICAgICAgICAgICAgcy0+dmFsdWVzW2MgKiBWQVJfVkFSU19OQiArIFZBUl9WT0xVTUVdID0gMjAuMCAqIGxvZzEwKG1heCk7CisgICAgICAgICAgICBtYXggPSBhdl9jbGlwZihtYXgsIDAsIDEpOworICAgICAgICAgICAgbWF4X2RyYXcgPSBjYWxjX21heF9kcmF3KHMsIG91dGxpbmssIG1heCk7CiAKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPmg7IGorKykgewotICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gcy0+b3V0LT5kYXRhWzBdICsgKGMgKiBzLT5oICsgYyAqIHMtPmIgKyBqKSAqIHMtPm91dC0+bGluZXNpemVbMF07CisgICAgICAgICAgICBmb3IgKGogPSBtYXhfZHJhdzsgaiA8IHMtPnc7IGorKykgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IHMtPm91dC0+ZGF0YVswXSArIGogKiBzLT5vdXQtPmxpbmVzaXplWzBdICsgYyAqIChzLT5iICsgcy0+aCkgKiA0OworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBzLT5oOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgQVZfV04zMkEoJmRzdFtrICogNF0sIGx1dFtzLT53IC0gaiAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGogJiBzdGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgaiArPSBzdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHMtPncgKiBtYXg7IGsrKykKLSAgICAgICAgICAgICAgICBBVl9XTjMyQShkc3QgKyBrICogNCwgY29sb3IpOworICAgICAgICAgICAgaWYgKHMtPmggPj0gOCAmJiBzLT5kcmF3X3RleHQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjaGFubmVsX25hbWUgPSBhdl9nZXRfY2hhbm5lbF9uYW1lKGF2X2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbChpbnNhbXBsZXMtPmNoYW5uZWxfbGF5b3V0LCBjKSk7CisgICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRyYXd0ZXh0KHMtPm91dCwgYyAqIChzLT5oICsgcy0+YikgKyAocy0+aCAtIDEwKSAvIDIsIG91dGxpbmstPmggLSAzNSwgY2hhbm5lbF9uYW1lLCAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPmRyYXdfcGVyc2lzdGVudF9kdXJhdGlvbiA+IDAuKSB7CisgICAgICAgICAgICAgICAgY2FsY19wZXJzaXN0ZW50X21heChzLCBtYXgsIGMpOworICAgICAgICAgICAgICAgIG1heF9kcmF3ID0gRkZNQVgoMCwgY2FsY19tYXhfZHJhdyhzLCBvdXRsaW5rLCBzLT5tYXhfcGVyc2lzdGVudFtjXSkgLSAxKTsKKyAgICAgICAgICAgICAgICBkcmF3X21heF9saW5lKHMsIG1heF9kcmF3LCBjKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSB7IC8qIGhvcml6b250YWwgKi8KKyAgICAgICAgZm9yIChjID0gMDsgYyA8IGlubGluay0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgZmxvYXQgKnNyYyA9IChmbG9hdCAqKWluc2FtcGxlcy0+ZXh0ZW5kZWRfZGF0YVtjXTsKKyAgICAgICAgICAgIHVpbnQzMl90ICpsdXQgPSBzLT5jb2xvcl9sdXQgKyBzLT53ICogYzsKKyAgICAgICAgICAgIGZsb2F0IG1heDsKIAotICAgICAgICBpZiAocy0+aCA+PSA4ICYmIHMtPmRyYXdfdGV4dCkKLSAgICAgICAgICAgIGRyYXd0ZXh0KHMtPm91dCwgMiwgYyAqIChzLT5oICsgcy0+YikgKyAocy0+aCAtIDgpIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX25hbWUoYXZfY2hhbm5lbF9sYXlvdXRfZXh0cmFjdF9jaGFubmVsKGluc2FtcGxlcy0+Y2hhbm5lbF9sYXlvdXQsIGMpKSk7CisgICAgICAgICAgICBzLT5tZXRlcihzcmMsIGluc2FtcGxlcy0+bmJfc2FtcGxlcywgJnMtPm1heFtjXSwgcy0+cm1zX2ZhY3Rvcik7CisgICAgICAgICAgICBtYXggPSBzLT5tYXhbY107CisKKyAgICAgICAgICAgIHMtPnZhbHVlc1tjICogVkFSX1ZBUlNfTkIgKyBWQVJfVk9MVU1FXSA9IDIwLjAgKiBsb2cxMChtYXgpOworICAgICAgICAgICAgbWF4ID0gYXZfY2xpcGYobWF4LCAwLCAxKTsKKyAgICAgICAgICAgIG1heF9kcmF3ID0gY2FsY19tYXhfZHJhdyhzLCBvdXRsaW5rLCBtYXgpOworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+aDsgaisrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gcy0+b3V0LT5kYXRhWzBdICsgKGMgKiBzLT5oICsgYyAqIHMtPmIgKyBqKSAqIHMtPm91dC0+bGluZXNpemVbMF07CisKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbWF4X2RyYXc7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBBVl9XTjMyQShkc3QgKyBrICogNCwgbHV0W2tdKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsgJiBzdGVwKQorICAgICAgICAgICAgICAgICAgICAgICAgayArPSBzdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPmggPj0gOCAmJiBzLT5kcmF3X3RleHQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjaGFubmVsX25hbWUgPSBhdl9nZXRfY2hhbm5lbF9uYW1lKGF2X2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbChpbnNhbXBsZXMtPmNoYW5uZWxfbGF5b3V0LCBjKSk7CisgICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsX25hbWUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGRyYXd0ZXh0KHMtPm91dCwgMiwgYyAqIChzLT5oICsgcy0+YikgKyAocy0+aCAtIDgpIC8gMiwgY2hhbm5lbF9uYW1lLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHMtPmRyYXdfcGVyc2lzdGVudF9kdXJhdGlvbiA+IDAuKSB7CisgICAgICAgICAgICAgICAgY2FsY19wZXJzaXN0ZW50X21heChzLCBtYXgsIGMpOworICAgICAgICAgICAgICAgIG1heF9kcmF3ID0gRkZNQVgoMCwgY2FsY19tYXhfZHJhdyhzLCBvdXRsaW5rLCBzLT5tYXhfcGVyc2lzdGVudFtjXSkgLSAxKTsKKyAgICAgICAgICAgICAgICBkcmF3X21heF9saW5lKHMsIG1heF9kcmF3LCBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIGF2X2ZyYW1lX2ZyZWUoJmluc2FtcGxlcyk7CkBAIC0yMjYsMTIgKzQzMywxNiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUob3V0KTsKIAotICAgIGZvciAoYyA9IDA7IGMgPCBpbmxpbmstPmNoYW5uZWxzICYmIHMtPmRyYXdfdm9sdW1lOyBjKyspIHsKLSAgICAgICAgaWYgKHMtPmggPj0gOCkgewotICAgICAgICAgICAgY2hhciBidWZbMTZdOworICAgIC8qIGRyYXcgdm9sdW1lIGxldmVsICovCisgICAgZm9yIChjID0gMDsgYyA8IGlubGluay0+Y2hhbm5lbHMgJiYgcy0+aCA+PSA4ICYmIHMtPmRyYXdfdm9sdW1lOyBjKyspIHsKKyAgICAgICAgY2hhciBidWZbMTZdOwogCisgICAgICAgIGlmIChzLT5vcmllbnRhdGlvbikgeyAvKiB2ZXJ0aWNhbCAqLwogICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiUuMmYiLCBzLT52YWx1ZXNbYyAqIFZBUl9WQVJTX05CICsgVkFSX1ZPTFVNRV0pOwotICAgICAgICAgICAgZHJhd3RleHQob3V0LCBGRk1BWCgwLCBzLT53IC0gOCAqIChpbnQpc3RybGVuKGJ1ZikpLCBjICogKHMtPmggKyBzLT5iKSArIChzLT5oIC0gOCkgLyAyLCBidWYpOworICAgICAgICAgICAgZHJhd3RleHQob3V0LCBjICogKHMtPmggKyBzLT5iKSArIChzLT5oIC0gOCkgLyAyLCAyLCBidWYsIDEpOworICAgICAgICB9IGVsc2UgeyAvKiBob3Jpem9udGFsICovCisgICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJS4yZiIsIHMtPnZhbHVlc1tjICogVkFSX1ZBUlNfTkIgKyBWQVJfVk9MVU1FXSk7CisgICAgICAgICAgICBkcmF3dGV4dChvdXQsIEZGTUFYKDAsIHMtPncgLSA4ICogKGludClzdHJsZW4oYnVmKSksIGMgKiAocy0+aCArIHMtPmIpICsgKHMtPmggLSA4KSAvIDIsIGJ1ZiwgMCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI0NSw2ICs0NTYsOCBAQAogICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm91dCk7CiAgICAgYXZfZXhwcl9mcmVlKHMtPmNfZXhwcik7CiAgICAgYXZfZnJlZXAoJnMtPnZhbHVlcyk7CisgICAgYXZfZnJlZXAoJnMtPmNvbG9yX2x1dCk7CisgICAgYXZfZnJlZXAoJnMtPm1heCk7CiB9CiAKIHN0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzaG93dm9sdW1lX2lucHV0c1tdID0gewpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYXZmX3Nob3d3YXZlcy5jIGIvbGliYXZmaWx0ZXIvYXZmX3Nob3d3YXZlcy5jCmluZGV4IDI2OWRjMTEuLmJiN2Y0ZWEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2F2Zl9zaG93d2F2ZXMuYworKysgYi9saWJhdmZpbHRlci9hdmZfc2hvd3dhdmVzLmMKQEAgLTQ1LDE1ICs0NSwyMyBAQAogZW51bSBTaG93V2F2ZXNTY2FsZSB7CiAgICAgU0NBTEVfTElOLAogICAgIFNDQUxFX0xPRywKKyAgICBTQ0FMRV9TUVJULAorICAgIFNDQUxFX0NCUlQsCiAgICAgU0NBTEVfTkIsCiB9OwogCitlbnVtIFNob3dXYXZlc0RyYXdNb2RlIHsKKyAgICBEUkFXX1NDQUxFLAorICAgIERSQVdfRlVMTCwKKyAgICBEUkFXX05CLAorfTsKKwogc3RydWN0IGZyYW1lX25vZGUgewogICAgIEFWRnJhbWUgKmZyYW1lOwogICAgIHN0cnVjdCBmcmFtZV9ub2RlICpuZXh0OwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgU2hvd1dhdmVzQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IHcsIGg7CiAgICAgQVZSYXRpb25hbCByYXRlOwpAQCAtNjYsNiArNzQsNyBAQAogICAgIGludCBzYW1wbGVfY291bnRfbW9kOwogICAgIGludCBtb2RlOyAgICAgICAgICAgICAgICAgICAvLy88IFNob3dXYXZlc01vZGUKICAgICBpbnQgc2NhbGU7ICAgICAgICAgICAgICAgICAgLy8vPCBTaG93V2F2ZXNTY2FsZQorICAgIGludCBkcmF3X21vZGU7ICAgICAgICAgICAgICAvLy88IFNob3dXYXZlc0RyYXdNb2RlCiAgICAgaW50IHNwbGl0X2NoYW5uZWxzOwogICAgIHVpbnQ4X3QgKmZnOwogCkBAIC05MywxMyArMTAyLDE4IEBACiAgICAgICAgIHsgInAycCIsICAgImRyYXcgYSBsaW5lIGJldHdlZW4gc2FtcGxlcyIsICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX1AyUH0sICAgICAgICAgICAuZmxhZ3M9RkxBR1MsIC51bml0PSJtb2RlIn0sCiAgICAgICAgIHsgImNsaW5lIiwgImRyYXcgYSBjZW50ZXJlZCBsaW5lIGZvciBlYWNoIHNhbXBsZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NT0RFX0NFTlRFUkVEX0xJTkV9LCAuZmxhZ3M9RkxBR1MsIC51bml0PSJtb2RlIn0sCiAgICAgeyAibiIsICAgICJzZXQgaG93IG1hbnkgc2FtcGxlcyB0byBzaG93IGluIHRoZSBzYW1lIHBvaW50IiwgT0ZGU0VUKG4pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCi0gICAgeyAicmF0ZSIsICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKLSAgICB7ICJyIiwgICAgInNldCB2aWRlbyByYXRlIiwgT0ZGU0VUKHJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInJhdGUiLCAic2V0IHZpZGVvIHJhdGUiLCBPRkZTRVQocmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAiciIsICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKICAgICB7ICJzcGxpdF9jaGFubmVscyIsICJkcmF3IGNoYW5uZWxzIHNlcGFyYXRlbHkiLCBPRkZTRVQoc3BsaXRfY2hhbm5lbHMpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDB9LCAwLCAxLCBGTEFHUyB9LAogICAgIHsgImNvbG9ycyIsICJzZXQgY2hhbm5lbHMgY29sb3JzIiwgT0ZGU0VUKGNvbG9ycyksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAicmVkfGdyZWVufGJsdWV8eWVsbG93fG9yYW5nZXxsaW1lfHBpbmt8bWFnZW50YXxicm93biIgfSwgMCwgMCwgRkxBR1MgfSwKICAgICB7ICJzY2FsZSIsICJzZXQgYW1wbGl0dWRlIHNjYWxlIiwgT0ZGU0VUKHNjYWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDAgfSwgMCwgU0NBTEVfTkItMSwgRkxBR1MsIC51bml0PSJzY2FsZSIgfSwKICAgICAgICAgeyAibGluIiwgImxpbmVhciIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNDQUxFX0xJTn0sIC5mbGFncz1GTEFHUywgLnVuaXQ9InNjYWxlIn0sCiAgICAgICAgIHsgImxvZyIsICJsb2dhcml0aG1pYyIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TQ0FMRV9MT0d9LCAuZmxhZ3M9RkxBR1MsIC51bml0PSJzY2FsZSJ9LAorICAgICAgICB7ICJzcXJ0IiwgInNxdWFyZSByb290IiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0NBTEVfU1FSVH0sIC5mbGFncz1GTEFHUywgLnVuaXQ9InNjYWxlIn0sCisgICAgICAgIHsgImNicnQiLCAiY3ViaWMgcm9vdCIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TQ0FMRV9DQlJUfSwgLmZsYWdzPUZMQUdTLCAudW5pdD0ic2NhbGUifSwKKyAgICB7ICJkcmF3IiwgInNldCBkcmF3IG1vZGUiLCBPRkZTRVQoZHJhd19tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERSQVdfU0NBTEV9LCAwLCBEUkFXX05CLTEsIEZMQUdTLCAudW5pdD0iZHJhdyIgfSwKKyAgICAgICAgeyAic2NhbGUiLCAic2NhbGUgcGl4ZWwgdmFsdWVzIGZvciBlYWNoIGRyYXduIHNhbXBsZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1EUkFXX1NDQUxFfSwgLmZsYWdzPUZMQUdTLCAudW5pdD0iZHJhdyJ9LAorICAgICAgICB7ICJmdWxsIiwgICJkcmF3IGV2ZXJ5IHBpeGVsIGZvciBzYW1wbGUgZGlyZWN0bHkiLCAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PURSQVdfRlVMTH0sICAuZmxhZ3M9RkxBR1MsIC51bml0PSJkcmF3In0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTE3OCw5ICsxOTIsMjkgQEAKICAgICByZXR1cm4gbG9nMTAoMSArIEZGQUJTKHNhbXBsZSkpICogaGVpZ2h0IC8gbG9nMTAoMSArIElOVDE2X01BWCk7CiB9CiAKLXN0YXRpYyB2b2lkIGRyYXdfc2FtcGxlX3BvaW50X3JnYmEodWludDhfdCAqYnVmLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnByZXZfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBjb2xvcls0XSwgaW50IGgpCitzdGF0aWMgaW50IGdldF9zcXJ0X2goaW50MTZfdCBzYW1wbGUsIGludCBoZWlnaHQpCit7CisgICAgcmV0dXJuIGhlaWdodC8yIC0gRkZTSUdOKHNhbXBsZSkgKiAoc3FydChGRkFCUyhzYW1wbGUpKSAqIChoZWlnaHQvMikgLyBzcXJ0KElOVDE2X01BWCkpOworfQorCitzdGF0aWMgaW50IGdldF9zcXJ0X2gyKGludDE2X3Qgc2FtcGxlLCBpbnQgaGVpZ2h0KQoreworICAgIHJldHVybiBzcXJ0KEZGQUJTKHNhbXBsZSkpICogaGVpZ2h0IC8gc3FydChJTlQxNl9NQVgpOworfQorCitzdGF0aWMgaW50IGdldF9jYnJ0X2goaW50MTZfdCBzYW1wbGUsIGludCBoZWlnaHQpCit7CisgICAgcmV0dXJuIGhlaWdodC8yIC0gRkZTSUdOKHNhbXBsZSkgKiAoY2JydChGRkFCUyhzYW1wbGUpKSAqIChoZWlnaHQvMikgLyBjYnJ0KElOVDE2X01BWCkpOworfQorCitzdGF0aWMgaW50IGdldF9jYnJ0X2gyKGludDE2X3Qgc2FtcGxlLCBpbnQgaGVpZ2h0KQoreworICAgIHJldHVybiBjYnJ0KEZGQUJTKHNhbXBsZSkpICogaGVpZ2h0IC8gY2JydChJTlQxNl9NQVgpOworfQorCitzdGF0aWMgdm9pZCBkcmF3X3NhbXBsZV9wb2ludF9yZ2JhX3NjYWxlKHVpbnQ4X3QgKmJ1ZiwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpwcmV2X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgY29sb3JbNF0sIGludCBoKQogewogICAgIGlmIChoID49IDAgJiYgaCA8IGhlaWdodCkgewogICAgICAgICBidWZbaCAqIGxpbmVzaXplICsgMF0gKz0gY29sb3JbMF07CkBAIC0xOTAsOSArMjI0LDIxIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBkcmF3X3NhbXBsZV9saW5lX3JnYmEodWludDhfdCAqYnVmLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcHJldl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgY29sb3JbNF0sIGludCBoKQorc3RhdGljIHZvaWQgZHJhd19zYW1wbGVfcG9pbnRfcmdiYV9mdWxsKHVpbnQ4X3QgKmJ1ZiwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpwcmV2X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgY29sb3JbNF0sIGludCBoKQoreworICAgIGlmIChoID49IDAgJiYgaCA8IGhlaWdodCkgeworICAgICAgICBidWZbaCAqIGxpbmVzaXplICsgMF0gPSBjb2xvclswXTsKKyAgICAgICAgYnVmW2ggKiBsaW5lc2l6ZSArIDFdID0gY29sb3JbMV07CisgICAgICAgIGJ1ZltoICogbGluZXNpemUgKyAyXSA9IGNvbG9yWzJdOworICAgICAgICBidWZbaCAqIGxpbmVzaXplICsgM10gPSBjb2xvclszXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfc2FtcGxlX2xpbmVfcmdiYV9zY2FsZSh1aW50OF90ICpidWYsIGludCBoZWlnaHQsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpwcmV2X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBjb2xvcls0XSwgaW50IGgpCiB7CiAgICAgaW50IGs7CiAgICAgaW50IHN0YXJ0ICAgPSBoZWlnaHQvMjsKQEAgLTIwNyw5ICsyNTMsMjYgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGRyYXdfc2FtcGxlX3AycF9yZ2JhKHVpbnQ4X3QgKmJ1ZiwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcHJldl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBjb2xvcls0XSwgaW50IGgpCitzdGF0aWMgdm9pZCBkcmF3X3NhbXBsZV9saW5lX3JnYmFfZnVsbCh1aW50OF90ICpidWYsIGludCBoZWlnaHQsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnByZXZfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgY29sb3JbNF0sIGludCBoKQoreworICAgIGludCBrOworICAgIGludCBzdGFydCAgID0gaGVpZ2h0LzI7CisgICAgaW50IGVuZCAgICAgPSBhdl9jbGlwKGgsIDAsIGhlaWdodC0xKTsKKyAgICBpZiAoc3RhcnQgPiBlbmQpCisgICAgICAgIEZGU1dBUChpbnQxNl90LCBzdGFydCwgZW5kKTsKKyAgICBmb3IgKGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7CisgICAgICAgIGJ1ZltrICogbGluZXNpemUgKyAwXSA9IGNvbG9yWzBdOworICAgICAgICBidWZbayAqIGxpbmVzaXplICsgMV0gPSBjb2xvclsxXTsKKyAgICAgICAgYnVmW2sgKiBsaW5lc2l6ZSArIDJdID0gY29sb3JbMl07CisgICAgICAgIGJ1ZltrICogbGluZXNpemUgKyAzXSA9IGNvbG9yWzNdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHJhd19zYW1wbGVfcDJwX3JnYmFfc2NhbGUodWludDhfdCAqYnVmLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpwcmV2X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGNvbG9yWzRdLCBpbnQgaCkKIHsKICAgICBpbnQgazsKICAgICBpZiAoaCA+PSAwICYmIGggPCBoZWlnaHQpIHsKQEAgLTIzMyw5ICsyOTYsMzUgQEAKICAgICAqcHJldl95ID0gaDsKIH0KIAotc3RhdGljIHZvaWQgZHJhd19zYW1wbGVfY2xpbmVfcmdiYSh1aW50OF90ICpidWYsIGludCBoZWlnaHQsIGludCBsaW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcHJldl95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGNvbG9yWzRdLCBpbnQgaCkKK3N0YXRpYyB2b2lkIGRyYXdfc2FtcGxlX3AycF9yZ2JhX2Z1bGwodWludDhfdCAqYnVmLCBpbnQgaGVpZ2h0LCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnByZXZfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBjb2xvcls0XSwgaW50IGgpCit7CisgICAgaW50IGs7CisgICAgaWYgKGggPj0gMCAmJiBoIDwgaGVpZ2h0KSB7CisgICAgICAgIGJ1ZltoICogbGluZXNpemUgKyAwXSA9IGNvbG9yWzBdOworICAgICAgICBidWZbaCAqIGxpbmVzaXplICsgMV0gPSBjb2xvclsxXTsKKyAgICAgICAgYnVmW2ggKiBsaW5lc2l6ZSArIDJdID0gY29sb3JbMl07CisgICAgICAgIGJ1ZltoICogbGluZXNpemUgKyAzXSA9IGNvbG9yWzNdOworICAgICAgICBpZiAoKnByZXZfeSAmJiBoICE9ICpwcmV2X3kpIHsKKyAgICAgICAgICAgIGludCBzdGFydCA9ICpwcmV2X3k7CisgICAgICAgICAgICBpbnQgZW5kID0gYXZfY2xpcChoLCAwLCBoZWlnaHQtMSk7CisgICAgICAgICAgICBpZiAoc3RhcnQgPiBlbmQpCisgICAgICAgICAgICAgICAgRkZTV0FQKGludDE2X3QsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgZm9yIChrID0gc3RhcnQgKyAxOyBrIDwgZW5kOyBrKyspIHsKKyAgICAgICAgICAgICAgICBidWZbayAqIGxpbmVzaXplICsgMF0gPSBjb2xvclswXTsKKyAgICAgICAgICAgICAgICBidWZbayAqIGxpbmVzaXplICsgMV0gPSBjb2xvclsxXTsKKyAgICAgICAgICAgICAgICBidWZbayAqIGxpbmVzaXplICsgMl0gPSBjb2xvclsyXTsKKyAgICAgICAgICAgICAgICBidWZbayAqIGxpbmVzaXplICsgM10gPSBjb2xvclszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAqcHJldl95ID0gaDsKK30KKworc3RhdGljIHZvaWQgZHJhd19zYW1wbGVfY2xpbmVfcmdiYV9zY2FsZSh1aW50OF90ICpidWYsIGludCBoZWlnaHQsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcHJldl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGNvbG9yWzRdLCBpbnQgaCkKIHsKICAgICBpbnQgazsKICAgICBjb25zdCBpbnQgc3RhcnQgPSAoaGVpZ2h0IC0gaCkgLyAyOwpAQCAtMjQ3LDYgKzMzNiwyMCBAQAogICAgICAgICBidWZbayAqIGxpbmVzaXplICsgM10gKz0gY29sb3JbM107CiAgICAgfQogfQorIHN0YXRpYyB2b2lkIGRyYXdfc2FtcGxlX2NsaW5lX3JnYmFfZnVsbCh1aW50OF90ICpidWYsIGludCBoZWlnaHQsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcHJldl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGNvbG9yWzRdLCBpbnQgaCkKK3sKKyAgICBpbnQgazsKKyAgICBjb25zdCBpbnQgc3RhcnQgPSAoaGVpZ2h0IC0gaCkgLyAyOworICAgIGNvbnN0IGludCBlbmQgICA9IHN0YXJ0ICsgaDsKKyAgICBmb3IgKGsgPSBzdGFydDsgayA8IGVuZDsgaysrKSB7CisgICAgICAgIGJ1ZltrICogbGluZXNpemUgKyAwXSA9IGNvbG9yWzBdOworICAgICAgICBidWZbayAqIGxpbmVzaXplICsgMV0gPSBjb2xvclsxXTsKKyAgICAgICAgYnVmW2sgKiBsaW5lc2l6ZSArIDJdID0gY29sb3JbMl07CisgICAgICAgIGJ1ZltrICogbGluZXNpemUgKyAzXSA9IGNvbG9yWzNdOworICAgIH0KK30KIAogc3RhdGljIHZvaWQgZHJhd19zYW1wbGVfcG9pbnRfZ3JheSh1aW50OF90ICpidWYsIGludCBoZWlnaHQsIGludCBsaW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcHJldl95LApAQCAtMzQ0LDEwICs0NDcsMTAgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE6CiAgICAgICAgIHN3aXRjaCAoc2hvd3dhdmVzLT5tb2RlKSB7Ci0gICAgICAgIGNhc2UgTU9ERV9QT0lOVDogICAgICAgICBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gZHJhd19zYW1wbGVfcG9pbnRfcmdiYTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgTU9ERV9MSU5FOiAgICAgICAgICBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gZHJhd19zYW1wbGVfbGluZV9yZ2JhOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTU9ERV9QMlA6ICAgICAgICAgICBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gZHJhd19zYW1wbGVfcDJwX3JnYmE7ICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTU9ERV9DRU5URVJFRF9MSU5FOiBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gZHJhd19zYW1wbGVfY2xpbmVfcmdiYTsgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV9QT0lOVDogICAgICAgICBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gc2hvd3dhdmVzLT5kcmF3X21vZGUgPT0gRFJBV19TQ0FMRSA/IGRyYXdfc2FtcGxlX3BvaW50X3JnYmFfc2NhbGUgOiBkcmF3X3NhbXBsZV9wb2ludF9yZ2JhX2Z1bGw7IGJyZWFrOworICAgICAgICBjYXNlIE1PREVfTElORTogICAgICAgICAgc2hvd3dhdmVzLT5kcmF3X3NhbXBsZSA9IHNob3d3YXZlcy0+ZHJhd19tb2RlID09IERSQVdfU0NBTEUgPyBkcmF3X3NhbXBsZV9saW5lX3JnYmFfc2NhbGUgIDogZHJhd19zYW1wbGVfbGluZV9yZ2JhX2Z1bGw7ICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX1AyUDogICAgICAgICAgIHNob3d3YXZlcy0+ZHJhd19zYW1wbGUgPSBzaG93d2F2ZXMtPmRyYXdfbW9kZSA9PSBEUkFXX1NDQUxFID8gZHJhd19zYW1wbGVfcDJwX3JnYmFfc2NhbGUgICA6IGRyYXdfc2FtcGxlX3AycF9yZ2JhX2Z1bGw7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgTU9ERV9DRU5URVJFRF9MSU5FOiBzaG93d2F2ZXMtPmRyYXdfc2FtcGxlID0gc2hvd3dhdmVzLT5kcmF3X21vZGUgPT0gRFJBV19TQ0FMRSA/IGRyYXdfc2FtcGxlX2NsaW5lX3JnYmFfc2NhbGUgOiBkcmF3X3NhbXBsZV9jbGluZV9yZ2JhX2Z1bGw7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOwogICAgICAgICB9CkBAIC0zNzYsNiArNDc5LDI2IEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTQ0FMRV9TUVJUOgorICAgICAgICBzd2l0Y2ggKHNob3d3YXZlcy0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUE9JTlQ6CisgICAgICAgIGNhc2UgTU9ERV9MSU5FOgorICAgICAgICBjYXNlIE1PREVfUDJQOiAgICAgICAgICAgc2hvd3dhdmVzLT5nZXRfaCA9IGdldF9zcXJ0X2g7ICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX0NFTlRFUkVEX0xJTkU6IHNob3d3YXZlcy0+Z2V0X2ggPSBnZXRfc3FydF9oMjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTQ0FMRV9DQlJUOgorICAgICAgICBzd2l0Y2ggKHNob3d3YXZlcy0+bW9kZSkgeworICAgICAgICBjYXNlIE1PREVfUE9JTlQ6CisgICAgICAgIGNhc2UgTU9ERV9MSU5FOgorICAgICAgICBjYXNlIE1PREVfUDJQOiAgICAgICAgICAgc2hvd3dhdmVzLT5nZXRfaCA9IGdldF9jYnJ0X2g7ICBicmVhazsKKyAgICAgICAgY2FzZSBNT0RFX0NFTlRFUkVEX0xJTkU6IHNob3d3YXZlcy0+Z2V0X2ggPSBnZXRfY2JydF9oMjsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgc2hvd3dhdmVzLT5mZyA9IGF2X21hbGxvY19hcnJheShuYl9jaGFubmVscywgNCAqIHNpemVvZigqc2hvd3dhdmVzLT5mZykpOwpAQCAtMzg2LDggKzUwOSwxMiBAQAogICAgIGlmICghY29sb3JzKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgLyogbXVsdGlwbGljYXRpb24gZmFjdG9yLCBwcmUtY29tcHV0ZWQgdG8gYXZvaWQgaW4tbG9vcCBkaXZpc2lvbnMgKi8KLSAgICB4ID0gMjU1IC8gKChzaG93d2F2ZXMtPnNwbGl0X2NoYW5uZWxzID8gMSA6IG5iX2NoYW5uZWxzKSAqIHNob3d3YXZlcy0+bik7CisgICAgaWYgKHNob3d3YXZlcy0+ZHJhd19tb2RlID09IERSQVdfU0NBTEUpIHsKKyAgICAgICAgLyogbXVsdGlwbGljYXRpb24gZmFjdG9yLCBwcmUtY29tcHV0ZWQgdG8gYXZvaWQgaW4tbG9vcCBkaXZpc2lvbnMgKi8KKyAgICAgICAgeCA9IDI1NSAvICgoc2hvd3dhdmVzLT5zcGxpdF9jaGFubmVscyA/IDEgOiBuYl9jaGFubmVscykgKiBzaG93d2F2ZXMtPm4pOworICAgIH0gZWxzZSB7CisgICAgICAgIHggPSAyNTU7CisgICAgfQogICAgIGlmIChvdXRsaW5rLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0JBKSB7CiAgICAgICAgIHVpbnQ4X3QgZmdbNF0gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYgfTsKIApAQCAtNjMyLDYgKzc1OSw4IEBACiAgICAgeyAic2NhbGUiLCAic2V0IGFtcGxpdHVkZSBzY2FsZSIsIE9GRlNFVChzY2FsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwIH0sIDAsIFNDQUxFX05CLTEsIEZMQUdTLCAudW5pdD0ic2NhbGUiIH0sCiAgICAgICAgIHsgImxpbiIsICJsaW5lYXIiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TQ0FMRV9MSU59LCAuZmxhZ3M9RkxBR1MsIC51bml0PSJzY2FsZSJ9LAogICAgICAgICB7ICJsb2ciLCAibG9nYXJpdGhtaWMiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0NBTEVfTE9HfSwgLmZsYWdzPUZMQUdTLCAudW5pdD0ic2NhbGUifSwKKyAgICAgICAgeyAic3FydCIsICJzcXVhcmUgcm9vdCIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNDQUxFX1NRUlR9LCAuZmxhZ3M9RkxBR1MsIC51bml0PSJzY2FsZSJ9LAorICAgICAgICB7ICJjYnJ0IiwgImN1YmljIHJvb3QiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U0NBTEVfQ0JSVH0sIC5mbGFncz1GTEFHUywgLnVuaXQ9InNjYWxlIn0sCiAgICAgeyBOVUxMIH0KIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2F2ZmlsdGVyLmMgYi9saWJhdmZpbHRlci9hdmZpbHRlci5jCmluZGV4IDJmNGQ1OWYuLmVkODE2MTEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2F2ZmlsdGVyLmMKKysrIGIvbGliYXZmaWx0ZXIvYXZmaWx0ZXIuYwpAQCAtMTksMjkgKzE5LDMzIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAotI2luY2x1ZGUgImxpYmF2dXRpbC9hdG9taWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCisKKyNkZWZpbmUgRkZfSU5URVJOQUxfRklFTERTIDEKKyNpbmNsdWRlICJmcmFtZXF1ZXVlLmgiCiAKICNpbmNsdWRlICJhdWRpby5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZmlsdGVycy5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ZmdmVyc2lvbi5oIgogY29uc3QgY2hhciBhdl9maWx0ZXJfZmZ2ZXJzaW9uW10gPSAiRkZtcGVnIHZlcnNpb24gIiBGRk1QRUdfVkVSU0lPTjsKIAotc3RhdGljIGludCBmZl9maWx0ZXJfZnJhbWVfZnJhbWVkKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpOwotCiB2b2lkIGZmX3Rsb2dfcmVmKHZvaWQgKmN0eCwgQVZGcmFtZSAqcmVmLCBpbnQgZW5kKQogewogICAgIGF2X3VudXNlZCBjaGFyIGJ1ZlsxNl07CkBAIC00OSw3ICs1Myw3IEBACiAgICAgICAgICAgICAicmVmWyVwIGJ1ZjolcCBkYXRhOiVwIGxpbmVzaXplWyVkLCAlZCwgJWQsICVkXSBwdHM6JSJQUklkNjQiIHBvczolIlBSSWQ2NCwKICAgICAgICAgICAgIHJlZiwgcmVmLT5idWYsIHJlZi0+ZGF0YVswXSwKICAgICAgICAgICAgIHJlZi0+bGluZXNpemVbMF0sIHJlZi0+bGluZXNpemVbMV0sIHJlZi0+bGluZXNpemVbMl0sIHJlZi0+bGluZXNpemVbM10sCi0gICAgICAgICAgICByZWYtPnB0cywgYXZfZnJhbWVfZ2V0X3BrdF9wb3MocmVmKSk7CisgICAgICAgICAgICByZWYtPnB0cywgcmVmLT5wa3RfcG9zKTsKIAogICAgIGlmIChyZWYtPndpZHRoKSB7CiAgICAgICAgIGZmX3Rsb2coY3R4LCAiIGE6JWQvJWQgczolZHglZCBpOiVjIGlza2V5OiVkIHR5cGU6JWMiLApAQCAtMTMzLDYgKzEzNywxMCBAQAogewogICAgIEFWRmlsdGVyTGluayAqbGluazsKIAorICAgIGF2X2Fzc2VydDAoc3JjLT5ncmFwaCk7CisgICAgYXZfYXNzZXJ0MChkc3QtPmdyYXBoKTsKKyAgICBhdl9hc3NlcnQwKHNyYy0+Z3JhcGggPT0gZHN0LT5ncmFwaCk7CisKICAgICBpZiAoc3JjLT5uYl9vdXRwdXRzIDw9IHNyY3BhZCB8fCBkc3QtPm5iX2lucHV0cyA8PSBkc3RwYWQgfHwKICAgICAgICAgc3JjLT5vdXRwdXRzW3NyY3BhZF0gICAgICB8fCBkc3QtPmlucHV0c1tkc3RwYWRdKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwpAQCAtMTU4LDYgKzE2Niw3IEBACiAgICAgbGluay0+dHlwZSAgICA9IHNyYy0+b3V0cHV0X3BhZHNbc3JjcGFkXS50eXBlOwogICAgIGF2X2Fzc2VydDAoQVZfUElYX0ZNVF9OT05FID09IC0xICYmIEFWX1NBTVBMRV9GTVRfTk9ORSA9PSAtMSk7CiAgICAgbGluay0+Zm9ybWF0ICA9IC0xOworICAgIGZmX2ZyYW1lcXVldWVfaW5pdCgmbGluay0+ZmlmbywgJnNyYy0+Z3JhcGgtPmludGVybmFsLT5mcmFtZV9xdWV1ZXMpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNjgsMjYgKzE3Nyw1OSBAQAogICAgICAgICByZXR1cm47CiAKICAgICBhdl9mcmFtZV9mcmVlKCYoKmxpbmspLT5wYXJ0aWFsX2J1Zik7Ci0gICAgZmZfdmlkZW9fZnJhbWVfcG9vbF91bmluaXQoKEZGVmlkZW9GcmFtZVBvb2wqKikmKCpsaW5rKS0+dmlkZW9fZnJhbWVfcG9vbCk7CisgICAgZmZfZnJhbWVxdWV1ZV9mcmVlKCYoKmxpbmspLT5maWZvKTsKKyAgICBmZl9mcmFtZV9wb29sX3VuaW5pdCgoRkZGcmFtZVBvb2wqKikmKCpsaW5rKS0+ZnJhbWVfcG9vbCk7CiAKICAgICBhdl9mcmVlcChsaW5rKTsKIH0KIAorI2lmIEZGX0FQSV9GSUxURVJfR0VUX1NFVAogaW50IGF2ZmlsdGVyX2xpbmtfZ2V0X2NoYW5uZWxzKEFWRmlsdGVyTGluayAqbGluaykKIHsKICAgICByZXR1cm4gbGluay0+Y2hhbm5lbHM7CiB9CisjZW5kaWYKKwordm9pZCBmZl9maWx0ZXJfc2V0X3JlYWR5KEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyLCB1bnNpZ25lZCBwcmlvcml0eSkKK3sKKyAgICBmaWx0ZXItPnJlYWR5ID0gRkZNQVgoZmlsdGVyLT5yZWFkeSwgcHJpb3JpdHkpOworfQorCisvKioKKyAqIENsZWFyIGZyYW1lX2Jsb2NrZWRfaW4gb24gYWxsIG91dHB1dHMuCisgKiBUaGlzIGlzIG5lY2Vzc2FyeSB3aGVuZXZlciBzb21ldGhpbmcgY2hhbmdlcyBvbiBpbnB1dC4KKyAqLworc3RhdGljIHZvaWQgZmlsdGVyX3VuYmxvY2soQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIpCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5iX291dHB1dHM7IGkrKykKKyAgICAgICAgZmlsdGVyLT5vdXRwdXRzW2ldLT5mcmFtZV9ibG9ja2VkX2luID0gMDsKK30KKwogCiB2b2lkIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X2luX3N0YXR1cyhBVkZpbHRlckxpbmsgKmxpbmssIGludCBzdGF0dXMsIGludDY0X3QgcHRzKQogewotICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X291dF9zdGF0dXMobGluaywgc3RhdHVzLCBwdHMpOworICAgIGlmIChsaW5rLT5zdGF0dXNfaW4gPT0gc3RhdHVzKQorICAgICAgICByZXR1cm47CisgICAgYXZfYXNzZXJ0MCghbGluay0+c3RhdHVzX2luKTsKKyAgICBsaW5rLT5zdGF0dXNfaW4gPSBzdGF0dXM7CisgICAgbGluay0+c3RhdHVzX2luX3B0cyA9IHB0czsKKyAgICBsaW5rLT5mcmFtZV93YW50ZWRfb3V0ID0gMDsKKyAgICBsaW5rLT5mcmFtZV9ibG9ja2VkX2luID0gMDsKKyAgICBmaWx0ZXJfdW5ibG9jayhsaW5rLT5kc3QpOworICAgIGZmX2ZpbHRlcl9zZXRfcmVhZHkobGluay0+ZHN0LCAyMDApOwogfQogCiB2b2lkIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X291dF9zdGF0dXMoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgc3RhdHVzLCBpbnQ2NF90IHB0cykKIHsKLSAgICBsaW5rLT5zdGF0dXMgPSBzdGF0dXM7Ci0gICAgbGluay0+ZnJhbWVfd2FudGVkX2luID0gbGluay0+ZnJhbWVfd2FudGVkX291dCA9IDA7Ci0gICAgZmZfdXBkYXRlX2xpbmtfY3VycmVudF9wdHMobGluaywgcHRzKTsKKyAgICBhdl9hc3NlcnQwKCFsaW5rLT5mcmFtZV93YW50ZWRfb3V0KTsKKyAgICBhdl9hc3NlcnQwKCFsaW5rLT5zdGF0dXNfb3V0KTsKKyAgICBsaW5rLT5zdGF0dXNfb3V0ID0gc3RhdHVzOworICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGZmX3VwZGF0ZV9saW5rX2N1cnJlbnRfcHRzKGxpbmssIHB0cyk7CisgICAgZmlsdGVyX3VuYmxvY2sobGluay0+ZHN0KTsKKyAgICBmZl9maWx0ZXJfc2V0X3JlYWR5KGxpbmstPnNyYywgMjAwKTsKIH0KIAogdm9pZCBhdmZpbHRlcl9saW5rX3NldF9jbG9zZWQoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgY2xvc2VkKQpAQCAtMzE0LDYgKzM1NiwxNSBAQAogICAgICAgICAgICAgICAgICAgICBsaW5rLT50aW1lX2Jhc2UgPSAoQVZSYXRpb25hbCkgezEsIGxpbmstPnNhbXBsZV9yYXRlfTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKGxpbmstPnNyYy0+bmJfaW5wdXRzICYmIGxpbmstPnNyYy0+aW5wdXRzWzBdLT5od19mcmFtZXNfY3R4ICYmCisgICAgICAgICAgICAgICAgIShsaW5rLT5zcmMtPmZpbHRlci0+ZmxhZ3NfaW50ZXJuYWwgJiBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFKSkgeworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoIWxpbmstPmh3X2ZyYW1lc19jdHggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgbm90IGJlIHNldCBieSBub24taHdmcmFtZS1hd2FyZSBmaWx0ZXIiKTsKKyAgICAgICAgICAgICAgICBsaW5rLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihsaW5rLT5zcmMtPmlucHV0c1swXS0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICAgICAgaWYgKCFsaW5rLT5od19mcmFtZXNfY3R4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpZiAoKGNvbmZpZ19saW5rID0gbGluay0+ZHN0cGFkLT5jb25maWdfcHJvcHMpKQogICAgICAgICAgICAgICAgIGlmICgocmV0ID0gY29uZmlnX2xpbmsobGluaykpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cobGluay0+ZHN0LCBBVl9MT0dfRVJST1IsCkBAIC0zNTcsMzQgKzQwOCw2MSBAQAogewogICAgIEZGX1RQUklOVEZfU1RBUlQoTlVMTCwgcmVxdWVzdF9mcmFtZSk7IGZmX3Rsb2dfbGluayhOVUxMLCBsaW5rLCAxKTsKIAotICAgIGlmIChsaW5rLT5zdGF0dXMpCi0gICAgICAgIHJldHVybiBsaW5rLT5zdGF0dXM7Ci0gICAgbGluay0+ZnJhbWVfd2FudGVkX2luID0gMTsKKyAgICBhdl9hc3NlcnQxKCFsaW5rLT5kc3QtPmZpbHRlci0+YWN0aXZhdGUpOworICAgIGlmIChsaW5rLT5zdGF0dXNfb3V0KQorICAgICAgICByZXR1cm4gbGluay0+c3RhdHVzX291dDsKKyAgICBpZiAobGluay0+c3RhdHVzX2luKSB7CisgICAgICAgIGlmIChmZl9mcmFtZXF1ZXVlX3F1ZXVlZF9mcmFtZXMoJmxpbmstPmZpZm8pKSB7CisgICAgICAgICAgICBhdl9hc3NlcnQxKCFsaW5rLT5mcmFtZV93YW50ZWRfb3V0KTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDEobGluay0+ZHN0LT5yZWFkeSA+PSAzMDApOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBBY2tub3dsZWRnZSBzdGF0dXMgY2hhbmdlLiBGaWx0ZXJzIHVzaW5nIGZmX3JlcXVlc3RfZnJhbWUoKSB3aWxsCisgICAgICAgICAgICAgICBoYW5kbGUgdGhlIGNoYW5nZSBhdXRvbWF0aWNhbGx5LiBGaWx0ZXJzIGNhbiBhbHNvIGNoZWNrIHRoZQorICAgICAgICAgICAgICAgc3RhdHVzIGRpcmVjdGx5IGJ1dCBub25lIGRvIHlldC4gKi8KKyAgICAgICAgICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X291dF9zdGF0dXMobGluaywgbGluay0+c3RhdHVzX2luLCBsaW5rLT5zdGF0dXNfaW5fcHRzKTsKKyAgICAgICAgICAgIHJldHVybiBsaW5rLT5zdGF0dXNfb3V0OworICAgICAgICB9CisgICAgfQogICAgIGxpbmstPmZyYW1lX3dhbnRlZF9vdXQgPSAxOworICAgIGZmX2ZpbHRlcl9zZXRfcmVhZHkobGluay0+c3JjLCAxMDApOwogICAgIHJldHVybiAwOwogfQogCi1pbnQgZmZfcmVxdWVzdF9mcmFtZV90b19maWx0ZXIoQVZGaWx0ZXJMaW5rICpsaW5rKQorc3RhdGljIGludDY0X3QgZ3Vlc3Nfc3RhdHVzX3B0cyhBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IHN0YXR1cywgQVZSYXRpb25hbCBsaW5rX3RpbWVfYmFzZSkKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIGludDY0X3QgciA9IElOVDY0X01BWDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKQorICAgICAgICBpZiAoY3R4LT5pbnB1dHNbaV0tPnN0YXR1c19vdXQgPT0gc3RhdHVzKQorICAgICAgICAgICAgciA9IEZGTUlOKHIsIGF2X3Jlc2NhbGVfcShjdHgtPmlucHV0c1tpXS0+Y3VycmVudF9wdHMsIGN0eC0+aW5wdXRzW2ldLT50aW1lX2Jhc2UsIGxpbmtfdGltZV9iYXNlKSk7CisgICAgaWYgKHIgPCBJTlQ2NF9NQVgpCisgICAgICAgIHJldHVybiByOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRU9GIHRpbWVzdGFtcCBub3QgcmVsaWFibGVcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKQorICAgICAgICByID0gRkZNSU4ociwgYXZfcmVzY2FsZV9xKGN0eC0+aW5wdXRzW2ldLT5zdGF0dXNfaW5fcHRzLCBjdHgtPmlucHV0c1tpXS0+dGltZV9iYXNlLCBsaW5rX3RpbWVfYmFzZSkpOworICAgIGlmIChyIDwgSU5UNjRfTUFYKQorICAgICAgICByZXR1cm4gcjsKKyAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7Cit9CisKK3N0YXRpYyBpbnQgZmZfcmVxdWVzdF9mcmFtZV90b19maWx0ZXIoQVZGaWx0ZXJMaW5rICpsaW5rKQogewogICAgIGludCByZXQgPSAtMTsKIAogICAgIEZGX1RQUklOVEZfU1RBUlQoTlVMTCwgcmVxdWVzdF9mcmFtZV90b19maWx0ZXIpOyBmZl90bG9nX2xpbmsoTlVMTCwgbGluaywgMSk7Ci0gICAgbGluay0+ZnJhbWVfd2FudGVkX2luID0gMDsKKyAgICAvKiBBc3N1bWUgdGhlIGZpbHRlciBpcyBibG9ja2VkLCBsZXQgdGhlIG1ldGhvZCBjbGVhciBpdCBpZiBub3QgKi8KKyAgICBsaW5rLT5mcmFtZV9ibG9ja2VkX2luID0gMTsKICAgICBpZiAobGluay0+c3JjcGFkLT5yZXF1ZXN0X2ZyYW1lKQogICAgICAgICByZXQgPSBsaW5rLT5zcmNwYWQtPnJlcXVlc3RfZnJhbWUobGluayk7CiAgICAgZWxzZSBpZiAobGluay0+c3JjLT5pbnB1dHNbMF0pCiAgICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUobGluay0+c3JjLT5pbnB1dHNbMF0pOwotICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgbGluay0+cGFydGlhbF9idWYpIHsKLSAgICAgICAgQVZGcmFtZSAqcGJ1ZiA9IGxpbmstPnBhcnRpYWxfYnVmOwotICAgICAgICBsaW5rLT5wYXJ0aWFsX2J1ZiA9IE5VTEw7Ci0gICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZV9mcmFtZWQobGluaywgcGJ1Zik7Ci0gICAgICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X2luX3N0YXR1cyhsaW5rLCBBVkVSUk9SX0VPRiwgQVZfTk9QVFNfVkFMVUUpOwotICAgICAgICBsaW5rLT5mcmFtZV93YW50ZWRfb3V0ID0gMDsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9CiAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVBR0FJTikgJiYgcmV0ICE9IGxpbmstPnN0YXR1cykKLSAgICAgICAgICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X2luX3N0YXR1cyhsaW5rLCByZXQsIEFWX05PUFRTX1ZBTFVFKTsKKyAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVBR0FJTikgJiYgcmV0ICE9IGxpbmstPnN0YXR1c19pbikKKyAgICAgICAgICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X2luX3N0YXR1cyhsaW5rLCByZXQsIGd1ZXNzX3N0YXR1c19wdHMobGluay0+c3JjLCByZXQsIGxpbmstPnRpbWVfYmFzZSkpOworICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgcmV0ID0gMDsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTQ5Nyw1OCArNTc1LDYgQEAKICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogfQogCi1zdGF0aWMgQVZGaWx0ZXIgKmZpcnN0X2ZpbHRlcjsKLXN0YXRpYyBBVkZpbHRlciAqKmxhc3RfZmlsdGVyID0gJmZpcnN0X2ZpbHRlcjsKLQotI2lmICFGRl9BUElfTk9DT05TVF9HRVRfTkFNRQotY29uc3QKLSNlbmRpZgotQVZGaWx0ZXIgKmF2ZmlsdGVyX2dldF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0gICAgY29uc3QgQVZGaWx0ZXIgKmYgPSBOVUxMOwotCi0gICAgaWYgKCFuYW1lKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIHdoaWxlICgoZiA9IGF2ZmlsdGVyX25leHQoZikpKQotICAgICAgICBpZiAoIXN0cmNtcChmLT5uYW1lLCBuYW1lKSkKLSAgICAgICAgICAgIHJldHVybiAoQVZGaWx0ZXIgKilmOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBhdmZpbHRlcl9yZWdpc3RlcihBVkZpbHRlciAqZmlsdGVyKQotewotICAgIEFWRmlsdGVyICoqZiA9IGxhc3RfZmlsdGVyOwotCi0gICAgLyogdGhlIGZpbHRlciBtdXN0IHNlbGVjdCBnZW5lcmljIG9yIGludGVybmFsIGV4Y2x1c2l2ZWx5ICovCi0gICAgYXZfYXNzZXJ0MCgoZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORSkgIT0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FKTsKLQotICAgIGZpbHRlci0+bmV4dCA9IE5VTEw7Ci0KLSAgICB3aGlsZSgqZiB8fCBhdnByaXZfYXRvbWljX3B0cl9jYXMoKHZvaWQgKiB2b2xhdGlsZSAqKWYsIE5VTEwsIGZpbHRlcikpCi0gICAgICAgIGYgPSAmKCpmKS0+bmV4dDsKLSAgICBsYXN0X2ZpbHRlciA9ICZmaWx0ZXItPm5leHQ7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotY29uc3QgQVZGaWx0ZXIgKmF2ZmlsdGVyX25leHQoY29uc3QgQVZGaWx0ZXIgKnByZXYpCi17Ci0gICAgcmV0dXJuIHByZXYgPyBwcmV2LT5uZXh0IDogZmlyc3RfZmlsdGVyOwotfQotCi0jaWYgRkZfQVBJX09MRF9GSUxURVJfUkVHSVNURVIKLUFWRmlsdGVyICoqYXZfZmlsdGVyX25leHQoQVZGaWx0ZXIgKipmaWx0ZXIpCi17Ci0gICAgcmV0dXJuIGZpbHRlciA/ICYoKmZpbHRlciktPm5leHQgOiAmZmlyc3RfZmlsdGVyOwotfQotCi12b2lkIGF2ZmlsdGVyX3VuaW5pdCh2b2lkKQotewotfQotI2VuZGlmCi0KIGludCBhdmZpbHRlcl9wYWRfY291bnQoY29uc3QgQVZGaWx0ZXJQYWQgKnBhZHMpCiB7CiAgICAgaW50IGNvdW50OwpAQCAtNTc3LDEwICs2MDMsMTEgQEAKIAogc3RhdGljIGNvbnN0IEFWQ2xhc3MgKmZpbHRlcl9jaGlsZF9jbGFzc19uZXh0KGNvbnN0IEFWQ2xhc3MgKnByZXYpCiB7CisgICAgdm9pZCAqb3BhcXVlID0gTlVMTDsKICAgICBjb25zdCBBVkZpbHRlciAqZiA9IE5VTEw7CiAKICAgICAvKiBmaW5kIHRoZSBmaWx0ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBwcmV2ICovCi0gICAgd2hpbGUgKHByZXYgJiYgKGYgPSBhdmZpbHRlcl9uZXh0KGYpKSkKKyAgICB3aGlsZSAocHJldiAmJiAoZiA9IGF2X2ZpbHRlcl9pdGVyYXRlKCZvcGFxdWUpKSkKICAgICAgICAgaWYgKGYtPnByaXZfY2xhc3MgPT0gcHJldikKICAgICAgICAgICAgIGJyZWFrOwogCkBAIC01ODksNyArNjE2LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICAvKiBmaW5kIG5leHQgZmlsdGVyIHdpdGggc3BlY2lmaWMgb3B0aW9ucyAqLwotICAgIHdoaWxlICgoZiA9IGF2ZmlsdGVyX25leHQoZikpKQorICAgIHdoaWxlICgoZiA9IGF2X2ZpbHRlcl9pdGVyYXRlKCZvcGFxdWUpKSkKICAgICAgICAgaWYgKGYtPnByaXZfY2xhc3MpCiAgICAgICAgICAgICByZXR1cm4gZi0+cHJpdl9jbGFzczsKIApAQCAtNjAzLDYgKzYzMCwxMCBAQAogICAgICAgICB7IC5pNjQgPSBBVkZJTFRFUl9USFJFQURfU0xJQ0UgfSwgMCwgSU5UX01BWCwgRkxBR1MsICJ0aHJlYWRfdHlwZSIgfSwKICAgICAgICAgeyAic2xpY2UiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZGSUxURVJfVEhSRUFEX1NMSUNFIH0sIC51bml0ID0gInRocmVhZF90eXBlIiB9LAogICAgIHsgImVuYWJsZSIsICJzZXQgZW5hYmxlIGV4cHJlc3Npb24iLCBPRkZTRVQoZW5hYmxlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAidGhyZWFkcyIsICJBbGxvd2VkIG51bWJlciBvZiB0aHJlYWRzIiwgT0ZGU0VUKG5iX3RocmVhZHMpLCBBVl9PUFRfVFlQRV9JTlQsCisgICAgICAgIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJleHRyYV9od19mcmFtZXMiLCAiTnVtYmVyIG9mIGV4dHJhIGhhcmR3YXJlIGZyYW1lcyB0byBhbGxvY2F0ZSBmb3IgdGhlIHVzZXIiLAorICAgICAgICBPRkZTRVQoZXh0cmFfaHdfZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UX01BWCwgRkxBR1MgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKQEAgLTYzMiw2ICs2NjMsNyBAQAogQVZGaWx0ZXJDb250ZXh0ICpmZl9maWx0ZXJfYWxsb2MoY29uc3QgQVZGaWx0ZXIgKmZpbHRlciwgY29uc3QgY2hhciAqaW5zdF9uYW1lKQogewogICAgIEFWRmlsdGVyQ29udGV4dCAqcmV0OworICAgIGludCBwcmVpbml0ZWQgPSAwOwogCiAgICAgaWYgKCFmaWx0ZXIpCiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjQ4LDYgKzY4MCwxMSBAQAogICAgICAgICBpZiAoIXJldC0+cHJpdikKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KKyAgICBpZiAoZmlsdGVyLT5wcmVpbml0KSB7CisgICAgICAgIGlmIChmaWx0ZXItPnByZWluaXQocmV0KSA8IDApCisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgcHJlaW5pdGVkID0gMTsKKyAgICB9CiAKICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKHJldCk7CiAgICAgaWYgKGZpbHRlci0+cHJpdl9jbGFzcykgewpAQCAtNjg1LDYgKzcyMiw4IEBACiAgICAgcmV0dXJuIHJldDsKIAogZXJyOgorICAgIGlmIChwcmVpbml0ZWQpCisgICAgICAgIGZpbHRlci0+dW5pbml0KHJldCk7CiAgICAgYXZfZnJlZXAoJnJldC0+aW5wdXRzKTsKICAgICBhdl9mcmVlcCgmcmV0LT5pbnB1dF9wYWRzKTsKICAgICByZXQtPm5iX2lucHV0cyA9IDA7CkBAIC02OTcsMTQgKzczNiw2IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLSNpZiBGRl9BUElfQVZGSUxURVJfT1BFTgotaW50IGF2ZmlsdGVyX29wZW4oQVZGaWx0ZXJDb250ZXh0ICoqZmlsdGVyX2N0eCwgQVZGaWx0ZXIgKmZpbHRlciwgY29uc3QgY2hhciAqaW5zdF9uYW1lKQotewotICAgICpmaWx0ZXJfY3R4ID0gZmZfZmlsdGVyX2FsbG9jKGZpbHRlciwgaW5zdF9uYW1lKTsKLSAgICByZXR1cm4gKmZpbHRlcl9jdHggPyAwIDogQVZFUlJPUihFTk9NRU0pOwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIGZyZWVfbGluayhBVkZpbHRlckxpbmsgKmxpbmspCiB7CiAgICAgaWYgKCFsaW5rKQpAQCAtNzE1LDYgKzc0Niw4IEBACiAgICAgaWYgKGxpbmstPmRzdCkKICAgICAgICAgbGluay0+ZHN0LT5pbnB1dHNbbGluay0+ZHN0cGFkIC0gbGluay0+ZHN0LT5pbnB1dF9wYWRzXSA9IE5VTEw7CiAKKyAgICBhdl9idWZmZXJfdW5yZWYoJmxpbmstPmh3X2ZyYW1lc19jdHgpOworCiAgICAgZmZfZm9ybWF0c191bnJlZigmbGluay0+aW5fZm9ybWF0cyk7CiAgICAgZmZfZm9ybWF0c191bnJlZigmbGluay0+b3V0X2Zvcm1hdHMpOwogICAgIGZmX2Zvcm1hdHNfdW5yZWYoJmxpbmstPmluX3NhbXBsZXJhdGVzKTsKQEAgLTc0Nyw2ICs3ODAsOCBAQAogICAgIGlmIChmaWx0ZXItPmZpbHRlci0+cHJpdl9jbGFzcykKICAgICAgICAgYXZfb3B0X2ZyZWUoZmlsdGVyLT5wcml2KTsKIAorICAgIGF2X2J1ZmZlcl91bnJlZigmZmlsdGVyLT5od19kZXZpY2VfY3R4KTsKKwogICAgIGF2X2ZyZWVwKCZmaWx0ZXItPm5hbWUpOwogICAgIGF2X2ZyZWVwKCZmaWx0ZXItPmlucHV0X3BhZHMpOwogICAgIGF2X2ZyZWVwKCZmaWx0ZXItPm91dHB1dF9wYWRzKTsKQEAgLTc2NCw2ICs3OTksMTMgQEAKICAgICBhdl9mcmVlKGZpbHRlcik7CiB9CiAKK2ludCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgIGlmIChjdHgtPm5iX3RocmVhZHMgPiAwKQorICAgICAgICAgcmV0dXJuIEZGTUlOKGN0eC0+bmJfdGhyZWFkcywgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcyk7CisgICAgIHJldHVybiBjdHgtPmdyYXBoLT5uYl90aHJlYWRzOworfQorCiBzdGF0aWMgaW50IHByb2Nlc3Nfb3B0aW9ucyhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFyZ3MpCiB7CkBAIC04MTgsNyArODYwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgYXZfZGljdF9zZXQob3B0aW9ucywga2V5LCB2YWx1ZSwgMCk7Ci0gICAgICAgIGlmICgocmV0ID0gYXZfb3B0X3NldChjdHgtPnByaXYsIGtleSwgdmFsdWUsIDApKSA8IDApIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9vcHRfc2V0KGN0eC0+cHJpdiwga2V5LCB2YWx1ZSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTikpIDwgMCkgewogICAgICAgICAgICAgaWYgKCFhdl9vcHRfZmluZChjdHgtPnByaXYsIGtleSwgTlVMTCwgMCwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiB8IEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSB7CiAgICAgICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfT1BUSU9OX05PVF9GT1VORCkKICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcHRpb24gJyVzJyBub3QgZm91bmRcbiIsIGtleSk7CkBAIC04NDIsMTMgKzg4NCw2IEBACiAgICAgcmV0dXJuIGNvdW50OwogfQogCi0jaWYgRkZfQVBJX0FWRklMVEVSX0lOSVRfRklMVEVSCi1pbnQgYXZmaWx0ZXJfaW5pdF9maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIsIGNvbnN0IGNoYXIgKmFyZ3MsIHZvaWQgKm9wYXF1ZSkKLXsKLSAgICByZXR1cm4gYXZmaWx0ZXJfaW5pdF9zdHIoZmlsdGVyLCBhcmdzKTsKLX0KLSNlbmRpZgotCiBpbnQgYXZmaWx0ZXJfaW5pdF9kaWN0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQogewogICAgIGludCByZXQgPSAwOwpAQCAtODY5LDcgKzkwNCw3IEBACiAgICAgfQogCiAgICAgaWYgKGN0eC0+ZmlsdGVyLT5wcml2X2NsYXNzKSB7Ci0gICAgICAgIHJldCA9IGF2X29wdF9zZXRfZGljdChjdHgtPnByaXYsIG9wdGlvbnMpOworICAgICAgICByZXQgPSBhdl9vcHRfc2V0X2RpY3QyKGN0eC0+cHJpdiwgb3B0aW9ucywgQVZfT1BUX1NFQVJDSF9DSElMRFJFTik7CiAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhcHBseWluZyBvcHRpb25zIHRvIHRoZSBmaWx0ZXIuXG4iKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC04OTksNyArOTM0LDcgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KIAotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMgfHwgRkZfQVBJX09MRF9GSUxURVJfT1BUU19FUlJPUgorI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFNfRVJST1IKICAgICAgICAgICAgIGlmICggICAhc3RyY21wKGZpbHRlci0+ZmlsdGVyLT5uYW1lLCAiZm9ybWF0IikgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChmaWx0ZXItPmZpbHRlci0+bmFtZSwgIm5vZm9ybWF0IikgICB8fAogICAgICAgICAgICAgICAgICAgICFzdHJjbXAoZmlsdGVyLT5maWx0ZXItPm5hbWUsICJmcmVpMHIiKSAgICAgfHwKQEAgLTk1OSwxNCArOTk0LDYgQEAKICAgICAgICAgICAgIHdoaWxlICgocCA9IHN0cmNocihwLCAnOicpKSkKICAgICAgICAgICAgICAgICAqcCsrID0gJ3wnOwogCi0jaWYgRkZfQVBJX09MRF9GSUxURVJfT1BUUwotICAgICAgICAgICAgaWYgKGRlcHJlY2F0ZWQpCi0gICAgICAgICAgICAgICAgYXZfbG9nKGZpbHRlciwgQVZfTE9HX1dBUk5JTkcsICJUaGlzIHN5bnRheCBpcyBkZXByZWNhdGVkLiBVc2UgIgotICAgICAgICAgICAgICAgICAgICAgICAiJ3wnIHRvIHNlcGFyYXRlIHRoZSBsaXN0IGl0ZW1zLlxuIik7Ci0KLSAgICAgICAgICAgIGF2X2xvZyhmaWx0ZXIsIEFWX0xPR19ERUJVRywgImNvbXBhdDogY2FsbGVkIHdpdGggYXJncz1bJXNdXG4iLCBjb3B5KTsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3Nfb3B0aW9ucyhmaWx0ZXIsICZvcHRpb25zLCBjb3B5KTsKLSNlbHNlCiAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhmaWx0ZXIsIEFWX0xPR19FUlJPUiwgIlRoaXMgc3ludGF4IGlzIGRlcHJlY2F0ZWQuIFVzZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICInfCcgdG8gc2VwYXJhdGUgdGhlIGxpc3QgaXRlbXMgKCclcycgaW5zdGVhZCBvZiAnJXMnKVxuIiwKQEAgLTk3NSw3ICsxMDAyLDYgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc19vcHRpb25zKGZpbHRlciwgJm9wdGlvbnMsIGNvcHkpOwogICAgICAgICAgICAgfQotI2VuZGlmCiAgICAgICAgICAgICBhdl9mcmVlcCgmY29weSk7CiAKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtMTAyNSwxNDMgKzEwNTEsMzUgQEAKICAgICBpbnQgKCpmaWx0ZXJfZnJhbWUpKEFWRmlsdGVyTGluayAqLCBBVkZyYW1lICopOwogICAgIEFWRmlsdGVyQ29udGV4dCAqZHN0Y3R4ID0gbGluay0+ZHN0OwogICAgIEFWRmlsdGVyUGFkICpkc3QgPSBsaW5rLT5kc3RwYWQ7Ci0gICAgQVZGcmFtZSAqb3V0ID0gTlVMTDsKICAgICBpbnQgcmV0OwotICAgIEFWRmlsdGVyQ29tbWFuZCAqY21kPSBsaW5rLT5kc3QtPmNvbW1hbmRfcXVldWU7Ci0gICAgaW50NjRfdCBwdHM7Ci0KLSAgICBpZiAobGluay0+c3RhdHVzKSB7Ci0gICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKLSAgICAgICAgcmV0dXJuIGxpbmstPnN0YXR1czsKLSAgICB9CiAKICAgICBpZiAoIShmaWx0ZXJfZnJhbWUgPSBkc3QtPmZpbHRlcl9mcmFtZSkpCiAgICAgICAgIGZpbHRlcl9mcmFtZSA9IGRlZmF1bHRfZmlsdGVyX2ZyYW1lOwogCi0gICAgLyogY29weSB0aGUgZnJhbWUgaWYgbmVlZGVkICovCi0gICAgaWYgKGRzdC0+bmVlZHNfd3JpdGFibGUgJiYgIWF2X2ZyYW1lX2lzX3dyaXRhYmxlKGZyYW1lKSkgewotICAgICAgICBhdl9sb2cobGluay0+ZHN0LCBBVl9MT0dfREVCVUcsICJDb3B5aW5nIGRhdGEgaW4gYXZmaWx0ZXIuXG4iKTsKLQotICAgICAgICBzd2l0Y2ggKGxpbmstPnR5cGUpIHsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGxpbmssIGxpbmstPncsIGxpbmstPmgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihsaW5rLCBmcmFtZS0+bmJfc2FtcGxlcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW91dCkgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGZyYW1lKTsKKyAgICBpZiAoZHN0LT5uZWVkc193cml0YWJsZSkgeworICAgICAgICByZXQgPSBmZl9pbmxpbmtfbWFrZV9mcmFtZV93cml0YWJsZShsaW5rLCAmZnJhbWUpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKLQotICAgICAgICBzd2l0Y2ggKGxpbmstPnR5cGUpIHsKLSAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICBhdl9pbWFnZV9jb3B5KG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwgKGNvbnN0IHVpbnQ4X3QgKiopZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmZvcm1hdCwgZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgICAgICAgIGF2X3NhbXBsZXNfY29weShvdXQtPmV4dGVuZGVkX2RhdGEsIGZyYW1lLT5leHRlbmRlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGZyYW1lLT5uYl9zYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIG91dCA9IGZyYW1lOwotCi0gICAgd2hpbGUoY21kICYmIGNtZC0+dGltZSA8PSBvdXQtPnB0cyAqIGF2X3EyZChsaW5rLT50aW1lX2Jhc2UpKXsKLSAgICAgICAgYXZfbG9nKGxpbmstPmRzdCwgQVZfTE9HX0RFQlVHLAotICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgY29tbWFuZCB0aW1lOiVmIGNvbW1hbmQ6JXMgYXJnOiVzXG4iLAotICAgICAgICAgICAgICAgY21kLT50aW1lLCBjbWQtPmNvbW1hbmQsIGNtZC0+YXJnKTsKLSAgICAgICAgYXZmaWx0ZXJfcHJvY2Vzc19jb21tYW5kKGxpbmstPmRzdCwgY21kLT5jb21tYW5kLCBjbWQtPmFyZywgMCwgMCwgY21kLT5mbGFncyk7Ci0gICAgICAgIGZmX2NvbW1hbmRfcXVldWVfcG9wKGxpbmstPmRzdCk7Ci0gICAgICAgIGNtZD0gbGluay0+ZHN0LT5jb21tYW5kX3F1ZXVlOwogICAgIH0KIAotICAgIHB0cyA9IG91dC0+cHRzOwotICAgIGlmIChkc3RjdHgtPmVuYWJsZV9zdHIpIHsKLSAgICAgICAgaW50NjRfdCBwb3MgPSBhdl9mcmFtZV9nZXRfcGt0X3BvcyhvdXQpOwotICAgICAgICBkc3RjdHgtPnZhcl92YWx1ZXNbVkFSX05dID0gbGluay0+ZnJhbWVfY291bnQ7Ci0gICAgICAgIGRzdGN0eC0+dmFyX3ZhbHVlc1tWQVJfVF0gPSBwdHMgPT0gQVZfTk9QVFNfVkFMVUUgPyBOQU4gOiBwdHMgKiBhdl9xMmQobGluay0+dGltZV9iYXNlKTsKLSAgICAgICAgZHN0Y3R4LT52YXJfdmFsdWVzW1ZBUl9XXSA9IGxpbmstPnc7Ci0gICAgICAgIGRzdGN0eC0+dmFyX3ZhbHVlc1tWQVJfSF0gPSBsaW5rLT5oOwotICAgICAgICBkc3RjdHgtPnZhcl92YWx1ZXNbVkFSX1BPU10gPSBwb3MgPT0gLTEgPyBOQU4gOiBwb3M7CisgICAgZmZfaW5saW5rX3Byb2Nlc3NfY29tbWFuZHMobGluaywgZnJhbWUpOworICAgIGRzdGN0eC0+aXNfZGlzYWJsZWQgPSAhZmZfaW5saW5rX2V2YWx1YXRlX3RpbWVsaW5lX2F0X2ZyYW1lKGxpbmssIGZyYW1lKTsKIAotICAgICAgICBkc3RjdHgtPmlzX2Rpc2FibGVkID0gZmFicyhhdl9leHByX2V2YWwoZHN0Y3R4LT5lbmFibGUsIGRzdGN0eC0+dmFyX3ZhbHVlcywgTlVMTCkpIDwgMC41OwotICAgICAgICBpZiAoZHN0Y3R4LT5pc19kaXNhYmxlZCAmJgotICAgICAgICAgICAgKGRzdGN0eC0+ZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDKSkKLSAgICAgICAgICAgIGZpbHRlcl9mcmFtZSA9IGRlZmF1bHRfZmlsdGVyX2ZyYW1lOwotICAgIH0KLSAgICByZXQgPSBmaWx0ZXJfZnJhbWUobGluaywgb3V0KTsKLSAgICBsaW5rLT5mcmFtZV9jb3VudCsrOwotICAgIGZmX3VwZGF0ZV9saW5rX2N1cnJlbnRfcHRzKGxpbmssIHB0cyk7CisgICAgaWYgKGRzdGN0eC0+aXNfZGlzYWJsZWQgJiYKKyAgICAgICAgKGRzdGN0eC0+ZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDKSkKKyAgICAgICAgZmlsdGVyX2ZyYW1lID0gZGVmYXVsdF9maWx0ZXJfZnJhbWU7CisgICAgcmV0ID0gZmlsdGVyX2ZyYW1lKGxpbmssIGZyYW1lKTsKKyAgICBsaW5rLT5mcmFtZV9jb3VudF9vdXQrKzsKICAgICByZXR1cm4gcmV0OwogCiBmYWlsOgotICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CiAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZmZfZmlsdGVyX2ZyYW1lX25lZWRzX2ZyYW1pbmcoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSkKLXsKLSAgICBpbnQgaW5zYW1wbGVzID0gZnJhbWUtPm5iX3NhbXBsZXMsIGlucG9zID0gMCwgbmJfc2FtcGxlczsKLSAgICBBVkZyYW1lICpwYnVmID0gbGluay0+cGFydGlhbF9idWY7Ci0gICAgaW50IG5iX2NoYW5uZWxzID0gYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKTsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIC8qIEhhbmRsZSBmcmFtaW5nIChtaW5fc2FtcGxlcywgbWF4X3NhbXBsZXMpICovCi0gICAgd2hpbGUgKGluc2FtcGxlcykgewotICAgICAgICBpZiAoIXBidWYpIHsKLSAgICAgICAgICAgIEFWUmF0aW9uYWwgc2FtcGxlc190YiA9IHsgMSwgbGluay0+c2FtcGxlX3JhdGUgfTsKLSAgICAgICAgICAgIHBidWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGxpbmssIGxpbmstPnBhcnRpYWxfYnVmX3NpemUpOwotICAgICAgICAgICAgaWYgKCFwYnVmKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGxpbmstPmRzdCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzIGRyb3BwZWQgZHVlIHRvIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMocGJ1ZiwgZnJhbWUpOwotICAgICAgICAgICAgcGJ1Zi0+cHRzID0gZnJhbWUtPnB0czsKLSAgICAgICAgICAgIGlmIChwYnVmLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICAgICAgcGJ1Zi0+cHRzICs9IGF2X3Jlc2NhbGVfcShpbnBvcywgc2FtcGxlc190YiwgbGluay0+dGltZV9iYXNlKTsKLSAgICAgICAgICAgIHBidWYtPm5iX3NhbXBsZXMgPSAwOwotICAgICAgICB9Ci0gICAgICAgIG5iX3NhbXBsZXMgPSBGRk1JTihpbnNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5wYXJ0aWFsX2J1Zl9zaXplIC0gcGJ1Zi0+bmJfc2FtcGxlcyk7Ci0gICAgICAgIGF2X3NhbXBsZXNfY29weShwYnVmLT5leHRlbmRlZF9kYXRhLCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBidWYtPm5iX3NhbXBsZXMsIGlucG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgbmJfc2FtcGxlcywgbmJfY2hhbm5lbHMsIGxpbmstPmZvcm1hdCk7Ci0gICAgICAgIGlucG9zICAgICAgICAgICAgICAgICAgICs9IG5iX3NhbXBsZXM7Ci0gICAgICAgIGluc2FtcGxlcyAgICAgICAgICAgICAgIC09IG5iX3NhbXBsZXM7Ci0gICAgICAgIHBidWYtPm5iX3NhbXBsZXMgKz0gbmJfc2FtcGxlczsKLSAgICAgICAgaWYgKHBidWYtPm5iX3NhbXBsZXMgPj0gbGluay0+bWluX3NhbXBsZXMpIHsKLSAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZV9mcmFtZWQobGluaywgcGJ1Zik7Ci0gICAgICAgICAgICBwYnVmID0gTlVMTDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsaW5rLT5mcmFtZV93YW50ZWRfb3V0KQotICAgICAgICAgICAgICAgIGxpbmstPmZyYW1lX3dhbnRlZF9pbiA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwotICAgIGxpbmstPnBhcnRpYWxfYnVmID0gcGJ1ZjsKLSAgICByZXR1cm4gcmV0OwotfQotCiBpbnQgZmZfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCiB7CisgICAgaW50IHJldDsKICAgICBGRl9UUFJJTlRGX1NUQVJUKE5VTEwsIGZpbHRlcl9mcmFtZSk7IGZmX3Rsb2dfbGluayhOVUxMLCBsaW5rLCAxKTsgZmZfdGxvZyhOVUxMLCAiICIpOyBmZl90bG9nX3JlZihOVUxMLCBmcmFtZSwgMSk7CiAKICAgICAvKiBDb25zaXN0ZW5jeSBjaGVja3MgKi8KQEAgLTExODAsNyArMTA5OCw3IEBACiAgICAgICAgICAgICBhdl9sb2cobGluay0+ZHN0LCBBVl9MT0dfRVJST1IsICJGb3JtYXQgY2hhbmdlIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBpZiAoYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGZyYW1lKSAhPSBsaW5rLT5jaGFubmVscykgeworICAgICAgICBpZiAoZnJhbWUtPmNoYW5uZWxzICE9IGxpbmstPmNoYW5uZWxzKSB7CiAgICAgICAgICAgICBhdl9sb2cobGluay0+ZHN0LCBBVl9MT0dfRVJST1IsICJDaGFubmVsIGNvdW50IGNoYW5nZSBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KQEAgLTExOTQsMjMgKzExMTIsNTMzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBsaW5rLT5mcmFtZV93YW50ZWRfb3V0ID0gMDsKLSAgICAvKiBHbyBkaXJlY3RseSB0byBhY3R1YWwgZmlsdGVyaW5nIGlmIHBvc3NpYmxlICovCi0gICAgaWYgKGxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCi0gICAgICAgIGxpbmstPm1pbl9zYW1wbGVzICYmCi0gICAgICAgIChsaW5rLT5wYXJ0aWFsX2J1ZiB8fAotICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPCBsaW5rLT5taW5fc2FtcGxlcyB8fAotICAgICAgICAgZnJhbWUtPm5iX3NhbXBsZXMgPiBsaW5rLT5tYXhfc2FtcGxlcykpIHsKLSAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZV9uZWVkc19mcmFtaW5nKGxpbmssIGZyYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lX2ZyYW1lZChsaW5rLCBmcmFtZSk7CisgICAgbGluay0+ZnJhbWVfYmxvY2tlZF9pbiA9IGxpbmstPmZyYW1lX3dhbnRlZF9vdXQgPSAwOworICAgIGxpbmstPmZyYW1lX2NvdW50X2luKys7CisgICAgZmlsdGVyX3VuYmxvY2sobGluay0+ZHN0KTsKKyAgICByZXQgPSBmZl9mcmFtZXF1ZXVlX2FkZCgmbGluay0+ZmlmbywgZnJhbWUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CisgICAgZmZfZmlsdGVyX3NldF9yZWFkeShsaW5rLT5kc3QsIDMwMCk7CisgICAgcmV0dXJuIDA7CisKIGVycm9yOgogICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiB9CiAKK3N0YXRpYyBpbnQgc2FtcGxlc19yZWFkeShBVkZpbHRlckxpbmsgKmxpbmssIHVuc2lnbmVkIG1pbikKK3sKKyAgICByZXR1cm4gZmZfZnJhbWVxdWV1ZV9xdWV1ZWRfZnJhbWVzKCZsaW5rLT5maWZvKSAmJgorICAgICAgICAgICAoZmZfZnJhbWVxdWV1ZV9xdWV1ZWRfc2FtcGxlcygmbGluay0+ZmlmbykgPj0gbWluIHx8CisgICAgICAgICAgICBsaW5rLT5zdGF0dXNfaW4pOworfQorCitzdGF0aWMgaW50IHRha2Vfc2FtcGxlcyhBVkZpbHRlckxpbmsgKmxpbmssIHVuc2lnbmVkIG1pbiwgdW5zaWduZWQgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqKnJmcmFtZSkKK3sKKyAgICBBVkZyYW1lICpmcmFtZTAsICpmcmFtZSwgKmJ1ZjsKKyAgICB1bnNpZ25lZCBuYl9zYW1wbGVzLCBuYl9mcmFtZXMsIGksIHA7CisgICAgaW50IHJldDsKKworICAgIC8qIE5vdGU6IHRoaXMgZnVuY3Rpb24gcmVsaWVzIG9uIG5vIGZvcm1hdCBjaGFuZ2VzIGFuZCBtdXN0IG9ubHkgYmUKKyAgICAgICBjYWxsZWQgd2l0aCBlbm91Z2ggc2FtcGxlcy4gKi8KKyAgICBhdl9hc3NlcnQxKHNhbXBsZXNfcmVhZHkobGluaywgbGluay0+bWluX3NhbXBsZXMpKTsKKyAgICBmcmFtZTAgPSBmcmFtZSA9IGZmX2ZyYW1lcXVldWVfcGVlaygmbGluay0+ZmlmbywgMCk7CisgICAgaWYgKCFsaW5rLT5maWZvLnNhbXBsZXNfc2tpcHBlZCAmJiBmcmFtZS0+bmJfc2FtcGxlcyA+PSBtaW4gJiYgZnJhbWUtPm5iX3NhbXBsZXMgPD0gbWF4KSB7CisgICAgICAgICpyZnJhbWUgPSBmZl9mcmFtZXF1ZXVlX3Rha2UoJmxpbmstPmZpZm8pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbmJfZnJhbWVzID0gMDsKKyAgICBuYl9zYW1wbGVzID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobmJfc2FtcGxlcyArIGZyYW1lLT5uYl9zYW1wbGVzID4gbWF4KSB7CisgICAgICAgICAgICBpZiAobmJfc2FtcGxlcyA8IG1pbikKKyAgICAgICAgICAgICAgICBuYl9zYW1wbGVzID0gbWF4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbmJfc2FtcGxlcyArPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICAgICAgbmJfZnJhbWVzKys7CisgICAgICAgIGlmIChuYl9mcmFtZXMgPT0gZmZfZnJhbWVxdWV1ZV9xdWV1ZWRfZnJhbWVzKCZsaW5rLT5maWZvKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmcmFtZSA9IGZmX2ZyYW1lcXVldWVfcGVlaygmbGluay0+ZmlmbywgbmJfZnJhbWVzKTsKKyAgICB9CisKKyAgICBidWYgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGxpbmssIG5iX3NhbXBsZXMpOworICAgIGlmICghYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMoYnVmLCBmcmFtZTApOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGJ1Zi0+cHRzID0gZnJhbWUwLT5wdHM7CisKKyAgICBwID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgZnJhbWUgPSBmZl9mcmFtZXF1ZXVlX3Rha2UoJmxpbmstPmZpZm8pOworICAgICAgICBhdl9zYW1wbGVzX2NvcHkoYnVmLT5leHRlbmRlZF9kYXRhLCBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzLCBsaW5rLT5jaGFubmVscywgbGluay0+Zm9ybWF0KTsKKyAgICAgICAgcCArPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgIH0KKyAgICBpZiAocCA8IG5iX3NhbXBsZXMpIHsKKyAgICAgICAgdW5zaWduZWQgbiA9IG5iX3NhbXBsZXMgLSBwOworICAgICAgICBmcmFtZSA9IGZmX2ZyYW1lcXVldWVfcGVlaygmbGluay0+ZmlmbywgMCk7CisgICAgICAgIGF2X3NhbXBsZXNfY29weShidWYtPmV4dGVuZGVkX2RhdGEsIGZyYW1lLT5leHRlbmRlZF9kYXRhLCBwLCAwLCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Y2hhbm5lbHMsIGxpbmstPmZvcm1hdCk7CisgICAgICAgIGZmX2ZyYW1lcXVldWVfc2tpcF9zYW1wbGVzKCZsaW5rLT5maWZvLCBuLCBsaW5rLT50aW1lX2Jhc2UpOworICAgIH0KKworICAgICpyZnJhbWUgPSBidWY7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmZfZmlsdGVyX2ZyYW1lX3RvX2ZpbHRlcihBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBOVUxMOworICAgIEFWRmlsdGVyQ29udGV4dCAqZHN0ID0gbGluay0+ZHN0OworICAgIGludCByZXQ7CisKKyAgICBhdl9hc3NlcnQxKGZmX2ZyYW1lcXVldWVfcXVldWVkX2ZyYW1lcygmbGluay0+ZmlmbykpOworICAgIHJldCA9IGxpbmstPm1pbl9zYW1wbGVzID8KKyAgICAgICAgICBmZl9pbmxpbmtfY29uc3VtZV9zYW1wbGVzKGxpbmssIGxpbmstPm1pbl9zYW1wbGVzLCBsaW5rLT5tYXhfc2FtcGxlcywgJmZyYW1lKSA6CisgICAgICAgICAgZmZfaW5saW5rX2NvbnN1bWVfZnJhbWUobGluaywgJmZyYW1lKTsKKyAgICBhdl9hc3NlcnQxKHJldCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfYXNzZXJ0MSghZnJhbWUpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICAvKiBUaGUgZmlsdGVyIHdpbGwgc29vbiBoYXZlIHJlY2VpdmVkIGEgbmV3IGZyYW1lLCB0aGF0IG1heSBhbGxvdyBpdCB0bworICAgICAgIHByb2R1Y2Ugb25lIG9yIG1vcmU6IHVuYmxvY2sgaXRzIG91dHB1dHMuICovCisgICAgZmlsdGVyX3VuYmxvY2soZHN0KTsKKyAgICAvKiBBVkZpbHRlclBhZC5maWx0ZXJfZnJhbWUoKSBleHBlY3QgZnJhbWVfY291bnRfb3V0IHRvIGhhdmUgdGhlIHZhbHVlCisgICAgICAgYmVmb3JlIHRoZSBmcmFtZTsgZmZfZmlsdGVyX2ZyYW1lX2ZyYW1lZCgpIHdpbGwgcmUtaW5jcmVtZW50IGl0LiAqLworICAgIGxpbmstPmZyYW1lX2NvdW50X291dC0tOworICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZV9mcmFtZWQobGluaywgZnJhbWUpOworICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBsaW5rLT5zdGF0dXNfb3V0KSB7CisgICAgICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X291dF9zdGF0dXMobGluaywgcmV0LCBBVl9OT1BUU19WQUxVRSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUnVuIG9uY2UgYWdhaW4sIHRvIHNlZSBpZiBzZXZlcmFsIGZyYW1lcyB3ZXJlIGF2YWlsYWJsZSwgb3IgaWYKKyAgICAgICAgICAgdGhlIGlucHV0IHN0YXR1cyBoYXMgYWxzbyBjaGFuZ2VkLCBvciBhbnkgb3RoZXIgcmVhc29uLiAqLworICAgICAgICBmZl9maWx0ZXJfc2V0X3JlYWR5KGRzdCwgMzAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmb3J3YXJkX3N0YXR1c19jaGFuZ2UoQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIsIEFWRmlsdGVyTGluayAqaW4pCit7CisgICAgdW5zaWduZWQgb3V0ID0gMCwgcHJvZ3Jlc3MgPSAwOworICAgIGludCByZXQ7CisKKyAgICBhdl9hc3NlcnQwKCFpbi0+c3RhdHVzX291dCk7CisgICAgaWYgKCFmaWx0ZXItPm5iX291dHB1dHMpIHsKKyAgICAgICAgLyogbm90IG5lY2Vzc2FyeSB3aXRoIHRoZSBjdXJyZW50IEFQSSBhbmQgc2lua3MgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHdoaWxlICghaW4tPnN0YXR1c19vdXQpIHsKKyAgICAgICAgaWYgKCFmaWx0ZXItPm91dHB1dHNbb3V0XS0+c3RhdHVzX2luKSB7CisgICAgICAgICAgICBwcm9ncmVzcysrOworICAgICAgICAgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZV90b19maWx0ZXIoZmlsdGVyLT5vdXRwdXRzW291dF0pOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKytvdXQgPT0gZmlsdGVyLT5uYl9vdXRwdXRzKSB7CisgICAgICAgICAgICBpZiAoIXByb2dyZXNzKSB7CisgICAgICAgICAgICAgICAgLyogRXZlcnkgb3V0cHV0IGFscmVhZHkgY2xvc2VkOiBpbnB1dCBubyBsb25nZXIgaW50ZXJlc3RpbmcKKyAgICAgICAgICAgICAgICAgICAoZXhhbXBsZTogb3ZlcmxheSBpbiBzaG9ydGVzdCBtb2RlLCBvdGhlciBpbnB1dCBjbG9zZWQpLiAqLworICAgICAgICAgICAgICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X291dF9zdGF0dXMoaW4sIGluLT5zdGF0dXNfaW4sIGluLT5zdGF0dXNfaW5fcHRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2dyZXNzID0gMDsKKyAgICAgICAgICAgIG91dCA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZmZfZmlsdGVyX3NldF9yZWFkeShmaWx0ZXIsIDIwMCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmZfZmlsdGVyX2FjdGl2YXRlX2RlZmF1bHQoQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIpCit7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIGlmIChzYW1wbGVzX3JlYWR5KGZpbHRlci0+aW5wdXRzW2ldLCBmaWx0ZXItPmlucHV0c1tpXS0+bWluX3NhbXBsZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lX3RvX2ZpbHRlcihmaWx0ZXItPmlucHV0c1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKGZpbHRlci0+aW5wdXRzW2ldLT5zdGF0dXNfaW4gJiYgIWZpbHRlci0+aW5wdXRzW2ldLT5zdGF0dXNfb3V0KSB7CisgICAgICAgICAgICBhdl9hc3NlcnQxKCFmZl9mcmFtZXF1ZXVlX3F1ZXVlZF9mcmFtZXMoJmZpbHRlci0+aW5wdXRzW2ldLT5maWZvKSk7CisgICAgICAgICAgICByZXR1cm4gZm9yd2FyZF9zdGF0dXNfY2hhbmdlKGZpbHRlciwgZmlsdGVyLT5pbnB1dHNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5iX291dHB1dHM7IGkrKykgeworICAgICAgICBpZiAoZmlsdGVyLT5vdXRwdXRzW2ldLT5mcmFtZV93YW50ZWRfb3V0ICYmCisgICAgICAgICAgICAhZmlsdGVyLT5vdXRwdXRzW2ldLT5mcmFtZV9ibG9ja2VkX2luKSB7CisgICAgICAgICAgICByZXR1cm4gZmZfcmVxdWVzdF9mcmFtZV90b19maWx0ZXIoZmlsdGVyLT5vdXRwdXRzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkZFUlJPUl9OT1RfUkVBRFk7Cit9CisKKy8qCisgICBGaWx0ZXIgc2NoZWR1bGluZyBhbmQgYWN0aXZhdGlvbgorCisgICBXaGVuIGEgZmlsdGVyIGlzIGFjdGl2YXRlZCwgaXQgbXVzdDoKKyAgIC0gaWYgcG9zc2libGUsIG91dHB1dCBhIGZyYW1lOworICAgLSBlbHNlLCBpZiByZWxldmFudCwgZm9yd2FyZCB0aGUgaW5wdXQgc3RhdHVzIGNoYW5nZTsKKyAgIC0gZWxzZSwgY2hlY2sgb3V0cHV0cyBmb3Igd2FudGVkIGZyYW1lcyBhbmQgZm9yd2FyZCB0aGUgcmVxdWVzdHMuCisKKyAgIFRoZSBmb2xsb3dpbmcgQVZGaWx0ZXJMaW5rIGZpZWxkcyBhcmUgdXNlZCBmb3IgYWN0aXZhdGlvbjoKKworICAgLSBmcmFtZV93YW50ZWRfb3V0OgorCisgICAgIFRoaXMgZmllbGQgaW5kaWNhdGVzIGlmIGEgZnJhbWUgaXMgbmVlZGVkIG9uIHRoaXMgaW5wdXQgb2YgdGhlCisgICAgIGRlc3RpbmF0aW9uIGZpbHRlci4gQSBwb3NpdGl2ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBhIGZyYW1lIGlzIG5lZWRlZAorICAgICB0byBwcm9jZXNzIHF1ZXVlZCBmcmFtZXMgb3IgaW50ZXJuYWwgZGF0YSBvciB0byBzYXRpc2Z5IHRoZQorICAgICBhcHBsaWNhdGlvbjsgYSB6ZXJvIHZhbHVlIGluZGljYXRlcyB0aGF0IGEgZnJhbWUgaXMgbm90IGVzcGVjaWFsbHkKKyAgICAgbmVlZGVkIGJ1dCBjb3VsZCBiZSBwcm9jZXNzZWQgYW55d2F5OyBhIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IGEKKyAgICAgZnJhbWUgd291bGQganVzdCBiZSBxdWV1ZWQuCisKKyAgICAgSXQgaXMgc2V0IGJ5IGZpbHRlcnMgdXNpbmcgZmZfcmVxdWVzdF9mcmFtZSgpIG9yIGZmX3JlcXVlc3Rfbm9fZnJhbWUoKSwKKyAgICAgd2hlbiByZXF1ZXN0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHRocm91Z2ggYSBzcGVjaWZpYyBBUEkgb3Igd2hlbiBpdCBpcworICAgICBzZXQgb24gb25lIG9mIHRoZSBvdXRwdXRzLgorCisgICAgIEl0IGlzIGNsZWFyZWQgd2hlbiBhIGZyYW1lIGlzIHNlbnQgZnJvbSB0aGUgc291cmNlIHVzaW5nCisgICAgIGZmX2ZpbHRlcl9mcmFtZSgpLgorCisgICAgIEl0IGlzIGFsc28gY2xlYXJlZCB3aGVuIGEgc3RhdHVzIGNoYW5nZSBpcyBzZW50IGZyb20gdGhlIHNvdXJjZSB1c2luZworICAgICBmZl9hdmZpbHRlcl9saW5rX3NldF9pbl9zdGF0dXMoKS4KKworICAgLSBmcmFtZV9ibG9ja2VkX2luOgorCisgICAgIFRoaXMgZmllbGQgbWVhbnMgdGhhdCB0aGUgc291cmNlIGZpbHRlciBjYW4gbm90IGdlbmVyYXRlIGEgZnJhbWUgYXMgaXMuCisgICAgIEl0cyBnb2FsIGlzIHRvIGF2b2lkIHJlcGVhdGVkbHkgY2FsbGluZyB0aGUgcmVxdWVzdF9mcmFtZSgpIG1ldGhvZCBvbgorICAgICB0aGUgc2FtZSBsaW5rLgorCisgICAgIEl0IGlzIHNldCBieSB0aGUgZnJhbWV3b3JrIG9uIGFsbCBvdXRwdXRzIG9mIGEgZmlsdGVyIGJlZm9yZSBhY3RpdmF0aW5nIGl0LgorCisgICAgIEl0IGlzIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBieSBmZl9maWx0ZXJfZnJhbWUoKS4KKworICAgICBJdCBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCBieSBmZl9hdmZpbHRlcl9saW5rX3NldF9pbl9zdGF0dXMoKS4KKworICAgICBJdCBpcyBhbHNvIGNsZWFyZWQgb24gYWxsIG91dHB1dHMgKHVzaW5nIGZpbHRlcl91bmJsb2NrKCkpIHdoZW4KKyAgICAgc29tZXRoaW5nIGhhcHBlbnMgb24gYW4gaW5wdXQ6IHByb2Nlc3NpbmcgYSBmcmFtZSBvciBjaGFuZ2luZyB0aGUKKyAgICAgc3RhdHVzLgorCisgICAtIGZpZm86CisKKyAgICAgQ29udGFpbnMgdGhlIGZyYW1lcyBxdWV1ZWQgb24gYSBmaWx0ZXIgaW5wdXQuIElmIGl0IGNvbnRhaW5zIGZyYW1lcyBhbmQKKyAgICAgZnJhbWVfd2FudGVkX291dCBpcyBub3Qgc2V0LCB0aGVuIHRoZSBmaWx0ZXIgY2FuIGJlIGFjdGl2YXRlZC4gSWYgdGhhdAorICAgICByZXN1bHQgaW4gdGhlIGZpbHRlciBub3QgYWJsZSB0byB1c2UgdGhlc2UgZnJhbWVzLCB0aGUgZmlsdGVyIG11c3Qgc2V0CisgICAgIGZyYW1lX3dhbnRlZF9vdXQgdG8gYXNrIGZvciBtb3JlIGZyYW1lcy4KKworICAgLSBzdGF0dXNfaW4gYW5kIHN0YXR1c19pbl9wdHM6CisKKyAgICAgU3RhdHVzIChFT0Ygb3IgZXJyb3IgY29kZSkgb2YgdGhlIGxpbmsgYW5kIHRpbWVzdGFtcCBvZiB0aGUgc3RhdHVzCisgICAgIGNoYW5nZSAoaW4gbGluayB0aW1lIGJhc2UsIHNhbWUgYXMgZnJhbWVzKSBhcyBzZWVuIGZyb20gdGhlIGlucHV0IG9mCisgICAgIHRoZSBsaW5rLiBUaGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaWRlcmVkIGhhcHBlbmluZyBhZnRlciB0aGUgZnJhbWVzCisgICAgIHF1ZXVlZCBpbiBmaWZvLgorCisgICAgIEl0IGlzIHNldCBieSB0aGUgc291cmNlIGZpbHRlciB1c2luZyBmZl9hdmZpbHRlcl9saW5rX3NldF9pbl9zdGF0dXMoKS4KKworICAgLSBzdGF0dXNfb3V0OgorCisgICAgIFN0YXR1cyBvZiB0aGUgbGluayBhcyBzZWVuIGZyb20gdGhlIG91dHB1dCBvZiB0aGUgbGluay4gVGhlIHN0YXR1cworICAgICBjaGFuZ2UgaXMgY29uc2lkZXJlZCBoYXZpbmcgYWxyZWFkeSBoYXBwZW5lZC4KKworICAgICBJdCBpcyBzZXQgYnkgdGhlIGRlc3RpbmF0aW9uIGZpbHRlciB1c2luZworICAgICBmZl9hdmZpbHRlcl9saW5rX3NldF9vdXRfc3RhdHVzKCkuCisKKyAgIEZpbHRlcnMgYXJlIGFjdGl2YXRlZCBhY2NvcmRpbmcgdG8gdGhlIHJlYWR5IGZpZWxkLCBzZXQgdXNpbmcgdGhlCisgICBmZl9maWx0ZXJfc2V0X3JlYWR5KCkuIEV2ZW50dWFsbHksIGEgcHJpb3JpdHkgcXVldWUgd2lsbCBiZSB1c2VkLgorICAgZmZfZmlsdGVyX3NldF9yZWFkeSgpIGlzIGNhbGxlZCB3aGVuZXZlciBhbnl0aGluZyBjb3VsZCBjYXVzZSBwcm9ncmVzcyB0bworICAgYmUgcG9zc2libGUuIE1hcmtpbmcgYSBmaWx0ZXIgcmVhZHkgd2hlbiBpdCBpcyBub3QgaXMgbm90IGEgcHJvYmxlbSwKKyAgIGV4Y2VwdCBmb3IgdGhlIHNtYWxsIG92ZXJoZWFkIGl0IGNhdXNlcy4KKworICAgQ29uZGl0aW9ucyB0aGF0IGNhdXNlIGEgZmlsdGVyIHRvIGJlIG1hcmtlZCByZWFkeSBhcmU6CisKKyAgIC0gZnJhbWVzIGFkZGVkIG9uIGFuIGlucHV0IGxpbms7CisKKyAgIC0gY2hhbmdlcyBpbiB0aGUgaW5wdXQgb3Igb3V0cHV0IHN0YXR1cyBvZiBhbiBpbnB1dCBsaW5rOworCisgICAtIHJlcXVlc3RzIGZvciBhIGZyYW1lIG9uIGFuIG91dHB1dCBsaW5rOworCisgICAtIGFmdGVyIGFueSBhY3R1YWwgcHJvY2Vzc2luZyB1c2luZyB0aGUgbGVnYWN5IG1ldGhvZHMgKGZpbHRlcl9mcmFtZSgpLAorICAgICBhbmQgcmVxdWVzdF9mcmFtZSgpIHRvIGFja25vd2xlZGdlIHN0YXR1cyBjaGFuZ2VzKSwgdG8gcnVuIG9uY2UgbW9yZQorICAgICBhbmQgY2hlY2sgaWYgZW5vdWdoIGlucHV0IHdhcyBwcmVzZW50IGZvciBzZXZlcmFsIGZyYW1lcy4KKworICAgRXhlbXBsZXMgb2Ygc2NlbmFyaW9zIHRvIGNvbnNpZGVyOgorCisgICAtIGJ1ZmZlcnNyYzogYWN0aXZhdGUgaWYgZnJhbWVfd2FudGVkX291dCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uOworICAgICBhY3RpdmF0ZSB3aGVuIHRoZSBhcHBsaWNhdGlvbiBhZGRzIGEgZnJhbWUgdG8gcHVzaCBpdCBpbW1lZGlhdGVseS4KKworICAgLSB0ZXN0c3JjOiBhY3RpdmF0ZSBvbmx5IGlmIGZyYW1lX3dhbnRlZF9vdXQgdG8gcHJvZHVjZSBhbmQgcHVzaCBhIGZyYW1lLgorCisgICAtIGNvbmNhdCAobm90IGF0IHN0aXRjaCBwb2ludHMpOiBjYW4gcHJvY2VzcyBhIGZyYW1lIG9uIGFueSBvdXRwdXQuCisgICAgIEFjdGl2YXRlIGlmIGZyYW1lX3dhbnRlZF9vdXQgb24gb3V0cHV0IHRvIGZvcndhcmQgb24gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgaW5wdXQuIEFjdGl2YXRlIHdoZW4gYSBmcmFtZSBpcyBwcmVzZW50IG9uIGlucHV0IHRvIHByb2Nlc3MgaXQKKyAgICAgaW1tZWRpYXRlbHkuCisKKyAgIC0gZnJhbWVzeW5jOiBuZWVkcyBhdCBsZWFzdCBvbmUgZnJhbWUgb24gZWFjaCBpbnB1dDsgZXh0cmEgZnJhbWVzIG9uIHRoZQorICAgICB3cm9uZyBpbnB1dCB3aWxsIGFjY3VtdWxhdGUuIFdoZW4gYSBmcmFtZSBpcyBmaXJzdCBhZGRlZCBvbiBvbmUgaW5wdXQsCisgICAgIHNldCBmcmFtZV93YW50ZWRfb3V0PDAgb24gaXQgdG8gYXZvaWQgZ2V0dGluZyBtb3JlICh3b3VsZCB0cmlnZ2VyCisgICAgIHRlc3RzcmMpIGFuZCBmcmFtZV93YW50ZWRfb3V0PjAgb24gdGhlIG90aGVyIHRvIGFsbG93IHByb2Nlc3NpbmcgaXQuCisKKyAgIEFjdGl2YXRpb24gb2Ygb2xkIGZpbHRlcnM6CisKKyAgIEluIG9yZGVyIHRvIGFjdGl2YXRlIGEgZmlsdGVyIGltcGxlbWVudGluZyB0aGUgbGVnYWN5IGZpbHRlcl9mcmFtZSgpIGFuZAorICAgcmVxdWVzdF9mcmFtZSgpIG1ldGhvZHMsIHBlcmZvcm0gdGhlIGZpcnN0IHBvc3NpYmxlIG9mIHRoZSBmb2xsb3dpbmcKKyAgIGFjdGlvbnM6CisKKyAgIC0gSWYgYW4gaW5wdXQgaGFzIGZyYW1lcyBpbiBmaWZvIGFuZCBmcmFtZV93YW50ZWRfb3V0ID09IDAsIGRlcXVldWUgYQorICAgICBmcmFtZSBhbmQgY2FsbCBmaWx0ZXJfZnJhbWUoKS4KKworICAgICBSYXRpbmFsZTogZmlsdGVyIGZyYW1lcyBhcyBzb29uIGFzIHBvc3NpYmxlIGluc3RlYWQgb2YgbGVhdmluZyB0aGVtCisgICAgIHF1ZXVlZDsgZnJhbWVfd2FudGVkX291dCA8IDAgaXMgbm90IHBvc3NpYmxlIHNpbmNlIHRoZSBvbGQgQVBJIGRvZXMgbm90CisgICAgIHNldCBpdCBub3IgcHJvdmlkZXMgYW55IHNpbWlsYXIgZmVlZGJhY2s7IGZyYW1lX3dhbnRlZF9vdXQgPiAwIGhhcHBlbnMKKyAgICAgd2hlbiBtaW5fc2FtcGxlcyA+IDAgYW5kIHRoZXJlIGFyZSBub3QgZW5vdWdoIHNhbXBsZXMgcXVldWVkLgorCisgICAtIElmIGFuIGlucHV0IGhhcyBzdGF0dXNfaW4gc2V0IGJ1dCBub3Qgc3RhdHVzX291dCwgdHJ5IHRvIGNhbGwKKyAgICAgcmVxdWVzdF9mcmFtZSgpIG9uIG9uZSBvZiB0aGUgb3V0cHV0cyBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgdHJpZ2dlcgorICAgICByZXF1ZXN0X2ZyYW1lKCkgb24gdGhlIGlucHV0IHdpdGggc3RhdHVzX2luIGFuZCBhY2tub3dsZWRnZSBpdC4gVGhpcyBpcworICAgICBhd2t3YXJkIGFuZCBmcmFnaWxlLCBmaWx0ZXJzIHdpdGggc2V2ZXJhbCBpbnB1dHMgb3Igb3V0cHV0cyBzaG91bGQgYmUKKyAgICAgdXBkYXRlZCB0byBkaXJlY3QgYWN0aXZhdGlvbiBhcyBzb29uIGFzIHBvc3NpYmxlLgorCisgICAtIElmIGFuIG91dHB1dCBoYXMgZnJhbWVfd2FudGVkX291dCA+IDAgYW5kIG5vdCBmcmFtZV9ibG9ja2VkX2luLCBjYWxsCisgICAgIHJlcXVlc3RfZnJhbWUoKS4KKworICAgICBSYXRpb25hbGU6IGNoZWNraW5nIGZyYW1lX2Jsb2NrZWRfaW4gaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIHJlcXVlc3RpbmcKKyAgICAgcmVwZWF0ZWRseSBvbiBhIGJsb2NrZWQgaW5wdXQgaWYgYW5vdGhlciBpcyBub3QgYmxvY2tlZCAoZXhhbXBsZToKKyAgICAgW2J1ZmZlcnNyYzFdW3Rlc3RzcmMxXVtidWZmZXJzcmMyXVt0ZXN0c3JjMl1jb25jYXQ9dj0yKS4KKworICAgICBUT0RPOiByZXNwZWN0IG5lZWRzX2ZpZm8gYW5kIHJlbW92ZSBhdXRvLWluc2VydGVkIGZpZm9zLgorCisgKi8KKworaW50IGZmX2ZpbHRlcl9hY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmZpbHRlcikKK3sKKyAgICBpbnQgcmV0OworCisgICAgLyogR2VuZXJpYyB0aW1lbGluZSBzdXBwb3J0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgYnV0IHNob3VsZCBiZSBlYXN5ICovCisgICAgYXZfYXNzZXJ0MSghKGZpbHRlci0+ZmlsdGVyLT5mbGFncyAmIEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDICYmCisgICAgICAgICAgICAgICAgIGZpbHRlci0+ZmlsdGVyLT5hY3RpdmF0ZSkpOworICAgIGZpbHRlci0+cmVhZHkgPSAwOworICAgIHJldCA9IGZpbHRlci0+ZmlsdGVyLT5hY3RpdmF0ZSA/IGZpbHRlci0+ZmlsdGVyLT5hY3RpdmF0ZShmaWx0ZXIpIDoKKyAgICAgICAgICBmZl9maWx0ZXJfYWN0aXZhdGVfZGVmYXVsdChmaWx0ZXIpOworICAgIGlmIChyZXQgPT0gRkZFUlJPUl9OT1RfUkVBRFkpCisgICAgICAgIHJldCA9IDA7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGZmX2lubGlua19hY2tub3dsZWRnZV9zdGF0dXMoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgKnJzdGF0dXMsIGludDY0X3QgKnJwdHMpCit7CisgICAgKnJwdHMgPSBsaW5rLT5jdXJyZW50X3B0czsKKyAgICBpZiAoZmZfZnJhbWVxdWV1ZV9xdWV1ZWRfZnJhbWVzKCZsaW5rLT5maWZvKSkKKyAgICAgICAgcmV0dXJuICpyc3RhdHVzID0gMDsKKyAgICBpZiAobGluay0+c3RhdHVzX291dCkKKyAgICAgICAgcmV0dXJuICpyc3RhdHVzID0gbGluay0+c3RhdHVzX291dDsKKyAgICBpZiAoIWxpbmstPnN0YXR1c19pbikKKyAgICAgICAgcmV0dXJuICpyc3RhdHVzID0gMDsKKyAgICAqcnN0YXR1cyA9IGxpbmstPnN0YXR1c19vdXQgPSBsaW5rLT5zdGF0dXNfaW47CisgICAgZmZfdXBkYXRlX2xpbmtfY3VycmVudF9wdHMobGluaywgbGluay0+c3RhdHVzX2luX3B0cyk7CisgICAgKnJwdHMgPSBsaW5rLT5jdXJyZW50X3B0czsKKyAgICByZXR1cm4gMTsKK30KKworaW50IGZmX2lubGlua19jaGVja19hdmFpbGFibGVfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIHJldHVybiBmZl9mcmFtZXF1ZXVlX3F1ZXVlZF9mcmFtZXMoJmxpbmstPmZpZm8pID4gMDsKK30KKworaW50IGZmX2lubGlua19jaGVja19hdmFpbGFibGVfc2FtcGxlcyhBVkZpbHRlckxpbmsgKmxpbmssIHVuc2lnbmVkIG1pbikKK3sKKyAgICB1aW50NjRfdCBzYW1wbGVzID0gZmZfZnJhbWVxdWV1ZV9xdWV1ZWRfc2FtcGxlcygmbGluay0+Zmlmbyk7CisgICAgYXZfYXNzZXJ0MShtaW4pOworICAgIHJldHVybiBzYW1wbGVzID49IG1pbiB8fCAobGluay0+c3RhdHVzX2luICYmIHNhbXBsZXMpOworfQorCitzdGF0aWMgdm9pZCBjb25zdW1lX3VwZGF0ZShBVkZpbHRlckxpbmsgKmxpbmssIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIGZmX3VwZGF0ZV9saW5rX2N1cnJlbnRfcHRzKGxpbmssIGZyYW1lLT5wdHMpOworICAgIGZmX2lubGlua19wcm9jZXNzX2NvbW1hbmRzKGxpbmssIGZyYW1lKTsKKyAgICBsaW5rLT5kc3QtPmlzX2Rpc2FibGVkID0gIWZmX2lubGlua19ldmFsdWF0ZV90aW1lbGluZV9hdF9mcmFtZShsaW5rLCBmcmFtZSk7CisgICAgbGluay0+ZnJhbWVfY291bnRfb3V0Kys7Cit9CisKK2ludCBmZl9pbmxpbmtfY29uc3VtZV9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKipyZnJhbWUpCit7CisgICAgQVZGcmFtZSAqZnJhbWU7CisKKyAgICAqcmZyYW1lID0gTlVMTDsKKyAgICBpZiAoIWZmX2lubGlua19jaGVja19hdmFpbGFibGVfZnJhbWUobGluaykpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKGxpbmstPmZpZm8uc2FtcGxlc19za2lwcGVkKSB7CisgICAgICAgIGZyYW1lID0gZmZfZnJhbWVxdWV1ZV9wZWVrKCZsaW5rLT5maWZvLCAwKTsKKyAgICAgICAgcmV0dXJuIGZmX2lubGlua19jb25zdW1lX3NhbXBsZXMobGluaywgZnJhbWUtPm5iX3NhbXBsZXMsIGZyYW1lLT5uYl9zYW1wbGVzLCByZnJhbWUpOworICAgIH0KKworICAgIGZyYW1lID0gZmZfZnJhbWVxdWV1ZV90YWtlKCZsaW5rLT5maWZvKTsKKyAgICBjb25zdW1lX3VwZGF0ZShsaW5rLCBmcmFtZSk7CisgICAgKnJmcmFtZSA9IGZyYW1lOworICAgIHJldHVybiAxOworfQorCitpbnQgZmZfaW5saW5rX2NvbnN1bWVfc2FtcGxlcyhBVkZpbHRlckxpbmsgKmxpbmssIHVuc2lnbmVkIG1pbiwgdW5zaWduZWQgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKipyZnJhbWUpCit7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgaW50IHJldDsKKworICAgIGF2X2Fzc2VydDEobWluKTsKKyAgICAqcmZyYW1lID0gTlVMTDsKKyAgICBpZiAoIWZmX2lubGlua19jaGVja19hdmFpbGFibGVfc2FtcGxlcyhsaW5rLCBtaW4pKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAobGluay0+c3RhdHVzX2luKQorICAgICAgICBtaW4gPSBGRk1JTihtaW4sIGZmX2ZyYW1lcXVldWVfcXVldWVkX3NhbXBsZXMoJmxpbmstPmZpZm8pKTsKKyAgICByZXQgPSB0YWtlX3NhbXBsZXMobGluaywgbWluLCBtYXgsICZmcmFtZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgY29uc3VtZV91cGRhdGUobGluaywgZnJhbWUpOworICAgICpyZnJhbWUgPSBmcmFtZTsKKyAgICByZXR1cm4gMTsKK30KKworaW50IGZmX2lubGlua19tYWtlX2ZyYW1lX3dyaXRhYmxlKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqKnJmcmFtZSkKK3sKKyAgICBBVkZyYW1lICpmcmFtZSA9ICpyZnJhbWU7CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoZnJhbWUpKQorICAgICAgICByZXR1cm4gMDsKKyAgICBhdl9sb2cobGluay0+ZHN0LCBBVl9MT0dfREVCVUcsICJDb3B5aW5nIGRhdGEgaW4gYXZmaWx0ZXIuXG4iKTsKKworICAgIHN3aXRjaCAobGluay0+dHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGxpbmssIGxpbmstPncsIGxpbmstPmgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgb3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihsaW5rLCBmcmFtZS0+bmJfc2FtcGxlcyk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN3aXRjaCAobGluay0+dHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBhdl9pbWFnZV9jb3B5KG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwgKGNvbnN0IHVpbnQ4X3QgKiopZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+Zm9ybWF0LCBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgYXZfc2FtcGxlc19jb3B5KG91dC0+ZXh0ZW5kZWRfZGF0YSwgZnJhbWUtPmV4dGVuZGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBmcmFtZS0+bmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5mb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKCEicmVhY2hlZCIpOworICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAqcmZyYW1lID0gb3V0OworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfaW5saW5rX3Byb2Nlc3NfY29tbWFuZHMoQVZGaWx0ZXJMaW5rICpsaW5rLCBjb25zdCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbW1hbmQgKmNtZCA9IGxpbmstPmRzdC0+Y29tbWFuZF9xdWV1ZTsKKworICAgIHdoaWxlKGNtZCAmJiBjbWQtPnRpbWUgPD0gZnJhbWUtPnB0cyAqIGF2X3EyZChsaW5rLT50aW1lX2Jhc2UpKXsKKyAgICAgICAgYXZfbG9nKGxpbmstPmRzdCwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIlByb2Nlc3NpbmcgY29tbWFuZCB0aW1lOiVmIGNvbW1hbmQ6JXMgYXJnOiVzXG4iLAorICAgICAgICAgICAgICAgY21kLT50aW1lLCBjbWQtPmNvbW1hbmQsIGNtZC0+YXJnKTsKKyAgICAgICAgYXZmaWx0ZXJfcHJvY2Vzc19jb21tYW5kKGxpbmstPmRzdCwgY21kLT5jb21tYW5kLCBjbWQtPmFyZywgMCwgMCwgY21kLT5mbGFncyk7CisgICAgICAgIGZmX2NvbW1hbmRfcXVldWVfcG9wKGxpbmstPmRzdCk7CisgICAgICAgIGNtZD0gbGluay0+ZHN0LT5jb21tYW5kX3F1ZXVlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2lubGlua19ldmFsdWF0ZV90aW1lbGluZV9hdF9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqZHN0Y3R4ID0gbGluay0+ZHN0OworICAgIGludDY0X3QgcHRzID0gZnJhbWUtPnB0czsKKyAgICBpbnQ2NF90IHBvcyA9IGZyYW1lLT5wa3RfcG9zOworCisgICAgaWYgKCFkc3RjdHgtPmVuYWJsZV9zdHIpCisgICAgICAgIHJldHVybiAxOworCisgICAgZHN0Y3R4LT52YXJfdmFsdWVzW1ZBUl9OXSA9IGxpbmstPmZyYW1lX2NvdW50X291dDsKKyAgICBkc3RjdHgtPnZhcl92YWx1ZXNbVkFSX1RdID0gcHRzID09IEFWX05PUFRTX1ZBTFVFID8gTkFOIDogcHRzICogYXZfcTJkKGxpbmstPnRpbWVfYmFzZSk7CisgICAgZHN0Y3R4LT52YXJfdmFsdWVzW1ZBUl9XXSA9IGxpbmstPnc7CisgICAgZHN0Y3R4LT52YXJfdmFsdWVzW1ZBUl9IXSA9IGxpbmstPmg7CisgICAgZHN0Y3R4LT52YXJfdmFsdWVzW1ZBUl9QT1NdID0gcG9zID09IC0xID8gTkFOIDogcG9zOworCisgICAgcmV0dXJuIGZhYnMoYXZfZXhwcl9ldmFsKGRzdGN0eC0+ZW5hYmxlLCBkc3RjdHgtPnZhcl92YWx1ZXMsIE5VTEwpKSA+PSAwLjU7Cit9CisKK3ZvaWQgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIGF2X2Fzc2VydDEoIWxpbmstPnN0YXR1c19pbik7CisgICAgYXZfYXNzZXJ0MSghbGluay0+c3RhdHVzX291dCk7CisgICAgbGluay0+ZnJhbWVfd2FudGVkX291dCA9IDE7CisgICAgZmZfZmlsdGVyX3NldF9yZWFkeShsaW5rLT5zcmMsIDEwMCk7Cit9CisKK3ZvaWQgZmZfaW5saW5rX3NldF9zdGF0dXMoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgc3RhdHVzKQoreworICAgIGlmIChsaW5rLT5zdGF0dXNfb3V0KQorICAgICAgICByZXR1cm47CisgICAgbGluay0+ZnJhbWVfd2FudGVkX291dCA9IDA7CisgICAgbGluay0+ZnJhbWVfYmxvY2tlZF9pbiA9IDA7CisgICAgZmZfYXZmaWx0ZXJfbGlua19zZXRfb3V0X3N0YXR1cyhsaW5rLCBzdGF0dXMsIEFWX05PUFRTX1ZBTFVFKTsKKyAgICB3aGlsZSAoZmZfZnJhbWVxdWV1ZV9xdWV1ZWRfZnJhbWVzKCZsaW5rLT5maWZvKSkgeworICAgICAgICAgICBBVkZyYW1lICpmcmFtZSA9IGZmX2ZyYW1lcXVldWVfdGFrZSgmbGluay0+Zmlmbyk7CisgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICB9CisgICAgaWYgKCFsaW5rLT5zdGF0dXNfaW4pCisgICAgICAgIGxpbmstPnN0YXR1c19pbiA9IHN0YXR1czsKK30KKworaW50IGZmX291dGxpbmtfZ2V0X3N0YXR1cyhBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgcmV0dXJuIGxpbmstPnN0YXR1c19pbjsKK30KKwogY29uc3QgQVZDbGFzcyAqYXZmaWx0ZXJfZ2V0X2NsYXNzKHZvaWQpCiB7CiAgICAgcmV0dXJuICZhdmZpbHRlcl9jbGFzczsKIH0KKworaW50IGZmX2ZpbHRlcl9pbml0X2h3X2ZyYW1lcyhBVkZpbHRlckNvbnRleHQgKmF2Y3R4LCBBVkZpbHRlckxpbmsgKmxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0X3Bvb2xfc2l6ZSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqZnJhbWVzOworCisgICAgLy8gTXVzdCBhbHJlYWR5IGJlIHNldCBieSBjYWxsZXIuCisgICAgYXZfYXNzZXJ0MChsaW5rLT5od19mcmFtZXNfY3R4KTsKKworICAgIGZyYW1lcyA9IChBVkhXRnJhbWVzQ29udGV4dCopbGluay0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKworICAgIGlmIChmcmFtZXMtPmluaXRpYWxfcG9vbF9zaXplID09IDApIHsKKyAgICAgICAgLy8gRHluYW1pYyBhbGxvY2F0aW9uIGlzIG5lY2Vzc2FyaWx5IHN1cHBvcnRlZC4KKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5leHRyYV9od19mcmFtZXMgPj0gMCkgeworICAgICAgICBmcmFtZXMtPmluaXRpYWxfcG9vbF9zaXplICs9IGF2Y3R4LT5leHRyYV9od19mcmFtZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnJhbWVzLT5pbml0aWFsX3Bvb2xfc2l6ZSA9IGRlZmF1bHRfcG9vbF9zaXplOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCBiL2xpYmF2ZmlsdGVyL2F2ZmlsdGVyLmgKaW5kZXggMDRiZjU4NS4uOWQ3MGU3MSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXZmaWx0ZXIuaAorKysgYi9saWJhdmZpbHRlci9hdmZpbHRlci5oCkBAIC0yOSw3ICsyOSw5IEBACiAgKi8KIAogLyoqCi0gKiBAZGVmZ3JvdXAgbGF2ZmkgTGliYXZmaWx0ZXIgLSBncmFwaC1iYXNlZCBmcmFtZSBlZGl0aW5nIGxpYnJhcnkKKyAqIEBkZWZncm91cCBsYXZmaSBsaWJhdmZpbHRlcgorICogR3JhcGgtYmFzZWQgZnJhbWUgZWRpdGluZyBsaWJyYXJ5LgorICoKICAqIEB7CiAgKi8KIApAQCAtMzcsNiArMzksNyBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZ1dGlsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgpAQCAtMTkyLDYgKzE5NSwyMSBAQAogICAgICAqLwogCiAgICAgLyoqCisgICAgICogRmlsdGVyIHByZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICAgICAqCisgICAgICogVGhpcyBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlsdGVyIGNvbnRleHQgaXMKKyAgICAgKiBhbGxvY2F0ZWQsIHRvIGFsbG93IGFsbG9jYXRpbmcgYW5kIGluaXRpbmcgc3ViLW9iamVjdHMuCisgICAgICoKKyAgICAgKiBJZiB0aGlzIGNhbGxiYWNrIGlzIG5vdCBOVUxMLCB0aGUgdW5pbml0IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIG9uCisgICAgICogYWxsb2NhdGlvbiBmYWlsdXJlLgorICAgICAqCisgICAgICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsCisgICAgICogICAgICAgICBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZSAoYnV0IHRoZSBjb2RlIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgZHJvcHBlZCBhbmQgdHJlYXRlZCBhcyBFTk9NRU0gYnkgdGhlIGNhbGxpbmcgY29kZSkKKyAgICAgKi8KKyAgICBpbnQgKCpwcmVpbml0KShBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKKyAgICAvKioKICAgICAgKiBGaWx0ZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgICAgICoKICAgICAgKiBUaGlzIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSBkdXJpbmcgdGhlIGZpbHRlciBsaWZldGltZSwgYWZ0ZXIKQEAgLTI2NSw2ICsyODMsOCBAQAogCiAgICAgaW50IHByaXZfc2l6ZTsgICAgICAvLy88IHNpemUgb2YgcHJpdmF0ZSBkYXRhIHRvIGFsbG9jYXRlIGZvciB0aGUgZmlsdGVyCiAKKyAgICBpbnQgZmxhZ3NfaW50ZXJuYWw7IC8vLzwgQWRkaXRpb25hbCBmbGFncyBmb3IgYXZmaWx0ZXIgaW50ZXJuYWwgdXNlIG9ubHkuCisKICAgICAvKioKICAgICAgKiBVc2VkIGJ5IHRoZSBmaWx0ZXIgcmVnaXN0cmF0aW9uIHN5c3RlbS4gTXVzdCBub3QgYmUgdG91Y2hlZCBieSBhbnkgb3RoZXIKICAgICAgKiBjb2RlLgpAQCAtMjkxLDYgKzMxMSwyMCBAQAogICAgICAqIHVzZWQgZm9yIHByb3ZpZGluZyBiaW5hcnkgZGF0YS4KICAgICAgKi8KICAgICBpbnQgKCppbml0X29wYXF1ZSkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKm9wYXF1ZSk7CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgYWN0aXZhdGlvbiBmdW5jdGlvbi4KKyAgICAgKgorICAgICAqIENhbGxlZCB3aGVuIGFueSBwcm9jZXNzaW5nIGlzIG5lZWRlZCBmcm9tIHRoZSBmaWx0ZXIsIGluc3RlYWQgb2YgYW55CisgICAgICogZmlsdGVyX2ZyYW1lIGFuZCByZXF1ZXN0X2ZyYW1lIG9uIHBhZHMuCisgICAgICoKKyAgICAgKiBUaGUgZnVuY3Rpb24gbXVzdCBleGFtaW5lIGlubGlua3MgYW5kIG91dGxpbmtzIGFuZCBwZXJmb3JtIGEgc2luZ2xlCisgICAgICogc3RlcCBvZiBwcm9jZXNzaW5nLiBJZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvLCB0aGUgZnVuY3Rpb24gbXVzdCBkbworICAgICAqIG5vdGhpbmcgYW5kIG5vdCByZXR1cm4gYW4gZXJyb3IuIElmIG1vcmUgc3RlcHMgYXJlIG9yIG1heSBiZQorICAgICAqIHBvc3NpYmxlLCBpdCBtdXN0IHVzZSBmZl9maWx0ZXJfc2V0X3JlYWR5KCkgdG8gc2NoZWR1bGUgYW5vdGhlcgorICAgICAqIGFjdGl2YXRpb24uCisgICAgICovCisgICAgaW50ICgqYWN0aXZhdGUpKEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKIH0gQVZGaWx0ZXI7CiAKIC8qKgpAQCAtMzQ5LDYgKzM4Myw0NSBAQAogICAgIHZvaWQgKmVuYWJsZTsgICAgICAgICAgICAgICAgICAgLy8vPCBwYXJzZWQgZXhwcmVzc2lvbiAoQVZFeHByKikKICAgICBkb3VibGUgKnZhcl92YWx1ZXM7ICAgICAgICAgICAgIC8vLzwgdmFyaWFibGUgdmFsdWVzIGZvciB0aGUgZW5hYmxlIGV4cHJlc3Npb24KICAgICBpbnQgaXNfZGlzYWJsZWQ7ICAgICAgICAgICAgICAgIC8vLzwgdGhlIGVuYWJsZWQgc3RhdGUgZnJvbSB0aGUgbGFzdCBleHByZXNzaW9uIGV2YWx1YXRpb24KKworICAgIC8qKgorICAgICAqIEZvciBmaWx0ZXJzIHdoaWNoIHdpbGwgY3JlYXRlIGhhcmR3YXJlIGZyYW1lcywgc2V0cyB0aGUgZGV2aWNlIHRoZQorICAgICAqIGZpbHRlciBzaG91bGQgY3JlYXRlIHRoZW0gaW4uICBBbGwgb3RoZXIgZmlsdGVycyB3aWxsIGlnbm9yZSB0aGlzIGZpZWxkOgorICAgICAqIGluIHBhcnRpY3VsYXIsIGEgZmlsdGVyIHdoaWNoIGNvbnN1bWVzIG9yIHByb2Nlc3NlcyBoYXJkd2FyZSBmcmFtZXMgd2lsbAorICAgICAqIGluc3RlYWQgdXNlIHRoZSBod19mcmFtZXNfY3R4IGZpZWxkIGluIEFWRmlsdGVyTGluayB0byBjYXJyeSB0aGUKKyAgICAgKiBoYXJkd2FyZSBjb250ZXh0IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIEFWQnVmZmVyUmVmICpod19kZXZpY2VfY3R4OworCisgICAgLyoqCisgICAgICogTWF4IG51bWJlciBvZiB0aHJlYWRzIGFsbG93ZWQgaW4gdGhpcyBmaWx0ZXIgaW5zdGFuY2UuCisgICAgICogSWYgPD0gMCwgaXRzIHZhbHVlIGlzIGlnbm9yZWQuCisgICAgICogT3ZlcnJpZGVzIGdsb2JhbCBudW1iZXIgb2YgdGhyZWFkcyBzZXQgcGVyIGZpbHRlciBncmFwaC4KKyAgICAgKi8KKyAgICBpbnQgbmJfdGhyZWFkczsKKworICAgIC8qKgorICAgICAqIFJlYWR5IHN0YXR1cyBvZiB0aGUgZmlsdGVyLgorICAgICAqIEEgbm9uLTAgdmFsdWUgbWVhbnMgdGhhdCB0aGUgZmlsdGVyIG5lZWRzIGFjdGl2YXRpbmc7CisgICAgICogYSBoaWdoZXIgdmFsdWUgc3VnZ2VzdHMgYSBtb3JlIHVyZ2VudCBhY3RpdmF0aW9uLgorICAgICAqLworICAgIHVuc2lnbmVkIHJlYWR5OworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIGV4dHJhIGhhcmR3YXJlIGZyYW1lcyB3aGljaCB0aGUgZmlsdGVyIHdpbGwKKyAgICAgKiBhbGxvY2F0ZSBvbiBpdHMgb3V0cHV0IGxpbmtzIGZvciB1c2UgaW4gZm9sbG93aW5nIGZpbHRlcnMgb3IgYnkKKyAgICAgKiB0aGUgY2FsbGVyLgorICAgICAqCisgICAgICogU29tZSBoYXJkd2FyZSBmaWx0ZXJzIHJlcXVpcmUgYWxsIGZyYW1lcyB0aGF0IHRoZXkgd2lsbCB1c2UgZm9yCisgICAgICogb3V0cHV0IHRvIGJlIGRlZmluZWQgaW4gYWR2YW5jZSBiZWZvcmUgZmlsdGVyaW5nIHN0YXJ0cy4gIEZvciBzdWNoCisgICAgICogZmlsdGVycywgYW55IGhhcmR3YXJlIGZyYW1lIHBvb2xzIHVzZWQgZm9yIG91dHB1dCBtdXN0IHRoZXJlZm9yZSBiZQorICAgICAqIG9mIGZpeGVkIHNpemUuICBUaGUgZXh0cmEgZnJhbWVzIHNldCBoZXJlIGFyZSBvbiB0b3Agb2YgYW55IG51bWJlcgorICAgICAqIHRoYXQgdGhlIGZpbHRlciBuZWVkcyBpbnRlcm5hbGx5IGluIG9yZGVyIHRvIG9wZXJhdGUgbm9ybWFsbHkuCisgICAgICoKKyAgICAgKiBUaGlzIGZpZWxkIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgZ3JhcGggY29udGFpbmluZyB0aGlzIGZpbHRlciBpcworICAgICAqIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgaW50IGV4dHJhX2h3X2ZyYW1lczsKIH07CiAKIC8qKgpAQCAtMzU3LDYgKzQzMCwxMSBAQAogICogdGhlIHBhZHMgaW52b2x2ZWQuIEluIGFkZGl0aW9uLCB0aGlzIGxpbmsgYWxzbyBjb250YWlucyB0aGUgcGFyYW1ldGVycwogICogd2hpY2ggaGF2ZSBiZWVuIG5lZ290aWF0ZWQgYW5kIGFncmVlZCB1cG9uIGJldHdlZW4gdGhlIGZpbHRlciwgc3VjaCBhcwogICogaW1hZ2UgZGltZW5zaW9ucywgZm9ybWF0LCBldGMuCisgKgorICogQXBwbGljYXRpb25zIG11c3Qgbm90IG5vcm1hbGx5IGFjY2VzcyB0aGUgbGluayBzdHJ1Y3R1cmUgZGlyZWN0bHkuCisgKiBVc2UgdGhlIGJ1ZmZlcnNyYyBhbmQgYnVmZmVyc2luayBBUEkgaW5zdGVhZC4KKyAqIEluIHRoZSBmdXR1cmUsIGFjY2VzcyB0byB0aGUgaGVhZGVyIG1heSBiZSByZXNlcnZlZCBmb3IgZmlsdGVycworICogaW1wbGVtZW50YXRpb24uCiAgKi8KIHN0cnVjdCBBVkZpbHRlckxpbmsgewogICAgIEFWRmlsdGVyQ29udGV4dCAqc3JjOyAgICAgICAvLy88IHNvdXJjZSBmaWx0ZXIKQEAgLTQ5MCwxOCArNTY4LDYgQEAKICAgICBpbnQgbWF4X3NhbXBsZXM7CiAKICAgICAvKioKLSAgICAgKiBMaW5rIHN0YXR1cy4KLSAgICAgKiBJZiBub3QgemVybywgYWxsIGF0dGVtcHRzIG9mIGZpbHRlcl9mcmFtZSBvciByZXF1ZXN0X2ZyYW1lCi0gICAgICogd2lsbCBmYWlsIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29kZSwgYW5kIGlmIG5lY2Vzc2FyeSB0aGUgcmVmZXJlbmNlCi0gICAgICogd2lsbCBiZSBkZXN0cm95ZWQuCi0gICAgICogSWYgcmVxdWVzdF9mcmFtZSByZXR1cm5zIGFuIGVycm9yLCB0aGUgc3RhdHVzIGlzIHNldCBvbiB0aGUKLSAgICAgKiBjb3JyZXNwb25kaW5nIGxpbmsuCi0gICAgICogSXQgY2FuIGJlIHNldCBhbHNvIGJlIHNldCBieSBlaXRoZXIgdGhlIHNvdXJjZSBvciB0aGUgZGVzdGluYXRpb24KLSAgICAgKiBmaWx0ZXIuCi0gICAgICovCi0gICAgaW50IHN0YXR1czsKLQotICAgIC8qKgogICAgICAqIE51bWJlciBvZiBjaGFubmVscy4KICAgICAgKi8KICAgICBpbnQgY2hhbm5lbHM7CkBAIC01MTQsMTkgKzU4MCwxMiBAQAogICAgIC8qKgogICAgICAqIE51bWJlciBvZiBwYXN0IGZyYW1lcyBzZW50IHRocm91Z2ggdGhlIGxpbmsuCiAgICAgICovCi0gICAgaW50NjRfdCBmcmFtZV9jb3VudDsKKyAgICBpbnQ2NF90IGZyYW1lX2NvdW50X2luLCBmcmFtZV9jb3VudF9vdXQ7CiAKICAgICAvKioKLSAgICAgKiBBIHBvaW50ZXIgdG8gYSBGRlZpZGVvRnJhbWVQb29sIHN0cnVjdC4KKyAgICAgKiBBIHBvaW50ZXIgdG8gYSBGRkZyYW1lUG9vbCBzdHJ1Y3QuCiAgICAgICovCi0gICAgdm9pZCAqdmlkZW9fZnJhbWVfcG9vbDsKLQotICAgIC8qKgotICAgICAqIFRydWUgaWYgYSBmcmFtZSBpcyBjdXJyZW50bHkgd2FudGVkIG9uIHRoZSBpbnB1dCBvZiB0aGlzIGZpbHRlci4KLSAgICAgKiBTZXQgd2hlbiBmZl9yZXF1ZXN0X2ZyYW1lKCkgaXMgY2FsbGVkIGJ5IHRoZSBvdXRwdXQsCi0gICAgICogY2xlYXJlZCB3aGVuIHRoZSByZXF1ZXN0IGlzIGhhbmRsZWQgb3IgZm9yd2FyZGVkLgotICAgICAqLwotICAgIGludCBmcmFtZV93YW50ZWRfaW47CisgICAgdm9pZCAqZnJhbWVfcG9vbDsKIAogICAgIC8qKgogICAgICAqIFRydWUgaWYgYSBmcmFtZSBpcyBjdXJyZW50bHkgd2FudGVkIG9uIHRoZSBvdXRwdXQgb2YgdGhpcyBmaWx0ZXIuCkBAIC01MzQsNiArNTkzLDU3IEBACiAgICAgICogY2xlYXJlZCB3aGVuIGEgZnJhbWUgaXMgZmlsdGVyZWQuCiAgICAgICovCiAgICAgaW50IGZyYW1lX3dhbnRlZF9vdXQ7CisKKyAgICAvKioKKyAgICAgKiBGb3IgaHdhY2NlbCBwaXhlbCBmb3JtYXRzLCB0aGlzIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byB0aGUKKyAgICAgKiBBVkhXRnJhbWVzQ29udGV4dCBkZXNjcmliaW5nIHRoZSBmcmFtZXMuCisgICAgICovCisgICAgQVZCdWZmZXJSZWYgKmh3X2ZyYW1lc19jdHg7CisKKyNpZm5kZWYgRkZfSU5URVJOQUxfRklFTERTCisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBzdHJ1Y3R1cmUgbWVtYmVycy4KKyAgICAgKiBUaGUgZmllbGRzIGJlbG93IHRoaXMgbGltaXQgYXJlIGludGVybmFsIGZvciBsaWJhdmZpbHRlcidzIHVzZQorICAgICAqIGFuZCBtdXN0IGluIG5vIHdheSBiZSBhY2Nlc3NlZCBieSBhcHBsaWNhdGlvbnMuCisgICAgICovCisgICAgY2hhciByZXNlcnZlZFsweEYwMDBdOworCisjZWxzZSAvKiBGRl9JTlRFUk5BTF9GSUVMRFMgKi8KKworICAgIC8qKgorICAgICAqIFF1ZXVlIG9mIGZyYW1lcyB3YWl0aW5nIHRvIGJlIGZpbHRlcmVkLgorICAgICAqLworICAgIEZGRnJhbWVRdWV1ZSBmaWZvOworCisgICAgLyoqCisgICAgICogSWYgc2V0LCB0aGUgc291cmNlIGZpbHRlciBjYW4gbm90IGdlbmVyYXRlIGEgZnJhbWUgYXMgaXMuCisgICAgICogVGhlIGdvYWwgaXMgdG8gYXZvaWQgcmVwZWF0ZWRseSBjYWxsaW5nIHRoZSByZXF1ZXN0X2ZyYW1lKCkgbWV0aG9kIG9uCisgICAgICogdGhlIHNhbWUgbGluay4KKyAgICAgKi8KKyAgICBpbnQgZnJhbWVfYmxvY2tlZF9pbjsKKworICAgIC8qKgorICAgICAqIExpbmsgaW5wdXQgc3RhdHVzLgorICAgICAqIElmIG5vdCB6ZXJvLCBhbGwgYXR0ZW1wdHMgb2YgZmlsdGVyX2ZyYW1lIHdpbGwgZmFpbCB3aXRoIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgY29kZS4KKyAgICAgKi8KKyAgICBpbnQgc3RhdHVzX2luOworCisgICAgLyoqCisgICAgICogVGltZXN0YW1wIG9mIHRoZSBpbnB1dCBzdGF0dXMgY2hhbmdlLgorICAgICAqLworICAgIGludDY0X3Qgc3RhdHVzX2luX3B0czsKKworICAgIC8qKgorICAgICAqIExpbmsgb3V0cHV0IHN0YXR1cy4KKyAgICAgKiBJZiBub3QgemVybywgYWxsIGF0dGVtcHRzIG9mIHJlcXVlc3RfZnJhbWUgd2lsbCBmYWlsIHdpdGggdGhlCisgICAgICogY29ycmVzcG9uZGluZyBjb2RlLgorICAgICAqLworICAgIGludCBzdGF0dXNfb3V0OworCisjZW5kaWYgLyogRkZfSU5URVJOQUxfRklFTERTICovCisKIH07CiAKIC8qKgpAQCAtNTUzLDEwICs2NjMsMTQgQEAKICAqLwogdm9pZCBhdmZpbHRlcl9saW5rX2ZyZWUoQVZGaWx0ZXJMaW5rICoqbGluayk7CiAKKyNpZiBGRl9BUElfRklMVEVSX0dFVF9TRVQKIC8qKgogICogR2V0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb2YgYSBsaW5rLgorICogQGRlcHJlY2F0ZWQgVXNlIGF2X2J1ZmZlcnNpbmtfZ2V0X2NoYW5uZWxzKCkKICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdmZpbHRlcl9saW5rX2dldF9jaGFubmVscyhBVkZpbHRlckxpbmsgKmxpbmspOworI2VuZGlmCiAKIC8qKgogICogU2V0IHRoZSBjbG9zZWQgZmllbGQgb2YgYSBsaW5rLgpAQCAtNTgzLDE0ICs2OTcsMjEgQEAKICAqLwogaW50IGF2ZmlsdGVyX3Byb2Nlc3NfY29tbWFuZChBVkZpbHRlckNvbnRleHQgKmZpbHRlciwgY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICphcmcsIGNoYXIgKnJlcywgaW50IHJlc19sZW4sIGludCBmbGFncyk7CiAKLS8qKiBJbml0aWFsaXplIHRoZSBmaWx0ZXIgc3lzdGVtLiBSZWdpc3RlciBhbGwgYnVpbHRpbiBmaWx0ZXJzLiAqLwotdm9pZCBhdmZpbHRlcl9yZWdpc3Rlcl9hbGwodm9pZCk7CisvKioKKyAqIEl0ZXJhdGUgb3ZlciBhbGwgcmVnaXN0ZXJlZCBmaWx0ZXJzLgorICoKKyAqIEBwYXJhbSBvcGFxdWUgYSBwb2ludGVyIHdoZXJlIGxpYmF2ZmlsdGVyIHdpbGwgc3RvcmUgdGhlIGl0ZXJhdGlvbiBzdGF0ZS4gTXVzdAorICogICAgICAgICAgICAgICBwb2ludCB0byBOVUxMIHRvIHN0YXJ0IHRoZSBpdGVyYXRpb24uCisgKgorICogQHJldHVybiB0aGUgbmV4dCByZWdpc3RlcmVkIGZpbHRlciBvciBOVUxMIHdoZW4gdGhlIGl0ZXJhdGlvbiBpcworICogICAgICAgICBmaW5pc2hlZAorICovCitjb25zdCBBVkZpbHRlciAqYXZfZmlsdGVyX2l0ZXJhdGUodm9pZCAqKm9wYXF1ZSk7CiAKLSNpZiBGRl9BUElfT0xEX0ZJTFRFUl9SRUdJU1RFUgotLyoqIFVuaW5pdGlhbGl6ZSB0aGUgZmlsdGVyIHN5c3RlbS4gVW5yZWdpc3RlciBhbGwgZmlsdGVycy4gKi8KKyNpZiBGRl9BUElfTkVYVAorLyoqIEluaXRpYWxpemUgdGhlIGZpbHRlciBzeXN0ZW0uIFJlZ2lzdGVyIGFsbCBidWlsdGluIGZpbHRlcnMuICovCiBhdHRyaWJ1dGVfZGVwcmVjYXRlZAotdm9pZCBhdmZpbHRlcl91bmluaXQodm9pZCk7Ci0jZW5kaWYKK3ZvaWQgYXZmaWx0ZXJfcmVnaXN0ZXJfYWxsKHZvaWQpOwogCiAvKioKICAqIFJlZ2lzdGVyIGEgZmlsdGVyLiBUaGlzIGlzIG9ubHkgbmVlZGVkIGlmIHlvdSBwbGFuIHRvIHVzZQpAQCAtNjAyLDY5ICs3MjMsMjcgQEAKICAqIEByZXR1cm4gMCBpZiB0aGUgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBhIG5lZ2F0aXZlIHZhbHVlCiAgKiBvdGhlcndpc2UKICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdmZpbHRlcl9yZWdpc3RlcihBVkZpbHRlciAqZmlsdGVyKTsKIAogLyoqCisgKiBJdGVyYXRlIG92ZXIgYWxsIHJlZ2lzdGVyZWQgZmlsdGVycy4KKyAqIEByZXR1cm4gSWYgcHJldiBpcyBub24tTlVMTCwgbmV4dCByZWdpc3RlcmVkIGZpbHRlciBhZnRlciBwcmV2IG9yIE5VTEwgaWYKKyAqIHByZXYgaXMgdGhlIGxhc3QgZmlsdGVyLiBJZiBwcmV2IGlzIE5VTEwsIHJldHVybiB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBmaWx0ZXIuCisgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCitjb25zdCBBVkZpbHRlciAqYXZmaWx0ZXJfbmV4dChjb25zdCBBVkZpbHRlciAqcHJldik7CisjZW5kaWYKKworLyoqCiAgKiBHZXQgYSBmaWx0ZXIgZGVmaW5pdGlvbiBtYXRjaGluZyB0aGUgZ2l2ZW4gbmFtZS4KICAqCiAgKiBAcGFyYW0gbmFtZSB0aGUgZmlsdGVyIG5hbWUgdG8gZmluZAogICogQHJldHVybiAgICAgdGhlIGZpbHRlciBkZWZpbml0aW9uLCBpZiBhbnkgbWF0Y2hpbmcgb25lIGlzIHJlZ2lzdGVyZWQuCiAgKiAgICAgICAgICAgICBOVUxMIGlmIG5vbmUgZm91bmQuCiAgKi8KLSNpZiAhRkZfQVBJX05PQ09OU1RfR0VUX05BTUUKLWNvbnN0Ci0jZW5kaWYKLUFWRmlsdGVyICphdmZpbHRlcl9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKK2NvbnN0IEFWRmlsdGVyICphdmZpbHRlcl9nZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKIAotLyoqCi0gKiBJdGVyYXRlIG92ZXIgYWxsIHJlZ2lzdGVyZWQgZmlsdGVycy4KLSAqIEByZXR1cm4gSWYgcHJldiBpcyBub24tTlVMTCwgbmV4dCByZWdpc3RlcmVkIGZpbHRlciBhZnRlciBwcmV2IG9yIE5VTEwgaWYKLSAqIHByZXYgaXMgdGhlIGxhc3QgZmlsdGVyLiBJZiBwcmV2IGlzIE5VTEwsIHJldHVybiB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBmaWx0ZXIuCi0gKi8KLWNvbnN0IEFWRmlsdGVyICphdmZpbHRlcl9uZXh0KGNvbnN0IEFWRmlsdGVyICpwcmV2KTsKLQotI2lmIEZGX0FQSV9PTERfRklMVEVSX1JFR0lTVEVSCi0vKioKLSAqIElmIGZpbHRlciBpcyBOVUxMLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBmaWx0ZXIgcG9pbnRlciwKLSAqIGlmIGZpbHRlciBpcyBub24tTlVMTCwgcmV0dXJucyB0aGUgbmV4dCBwb2ludGVyIGFmdGVyIGZpbHRlci4KLSAqIElmIHRoZSByZXR1cm5lZCBwb2ludGVyIHBvaW50cyB0byBOVUxMLCB0aGUgbGFzdCByZWdpc3RlcmVkIGZpbHRlcgotICogd2FzIGFscmVhZHkgcmVhY2hlZC4KLSAqIEBkZXByZWNhdGVkIHVzZSBhdmZpbHRlcl9uZXh0KCkKLSAqLwotYXR0cmlidXRlX2RlcHJlY2F0ZWQKLUFWRmlsdGVyICoqYXZfZmlsdGVyX25leHQoQVZGaWx0ZXIgKipmaWx0ZXIpOwotI2VuZGlmCi0KLSNpZiBGRl9BUElfQVZGSUxURVJfT1BFTgotLyoqCi0gKiBDcmVhdGUgYSBmaWx0ZXIgaW5zdGFuY2UuCi0gKgotICogQHBhcmFtIGZpbHRlcl9jdHggcHV0IGhlcmUgYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIGZpbHRlciBjb250ZXh0Ci0gKiBvbiBzdWNjZXNzLCBOVUxMIG9uIGZhaWx1cmUKLSAqIEBwYXJhbSBmaWx0ZXIgICAgdGhlIGZpbHRlciB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YKLSAqIEBwYXJhbSBpbnN0X25hbWUgTmFtZSB0byBnaXZlIHRvIHRoZSBuZXcgaW5zdGFuY2UuIENhbiBiZSBOVUxMIGZvciBub25lLgotICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG90aGVyd2lzZQotICogQGRlcHJlY2F0ZWQgdXNlIGF2ZmlsdGVyX2dyYXBoX2FsbG9jX2ZpbHRlcigpIGluc3RlYWQKLSAqLwotYXR0cmlidXRlX2RlcHJlY2F0ZWQKLWludCBhdmZpbHRlcl9vcGVuKEFWRmlsdGVyQ29udGV4dCAqKmZpbHRlcl9jdHgsIEFWRmlsdGVyICpmaWx0ZXIsIGNvbnN0IGNoYXIgKmluc3RfbmFtZSk7Ci0jZW5kaWYKLQotCi0jaWYgRkZfQVBJX0FWRklMVEVSX0lOSVRfRklMVEVSCi0vKioKLSAqIEluaXRpYWxpemUgYSBmaWx0ZXIuCi0gKgotICogQHBhcmFtIGZpbHRlciB0aGUgZmlsdGVyIHRvIGluaXRpYWxpemUKLSAqIEBwYXJhbSBhcmdzICAgQSBzdHJpbmcgb2YgcGFyYW1ldGVycyB0byB1c2Ugd2hlbiBpbml0aWFsaXppbmcgdGhlIGZpbHRlci4KLSAqICAgICAgICAgICAgICAgVGhlIGZvcm1hdCBhbmQgbWVhbmluZyBvZiB0aGlzIHN0cmluZyB2YXJpZXMgYnkgZmlsdGVyLgotICogQHBhcmFtIG9wYXF1ZSBBbnkgZXh0cmEgbm9uLXN0cmluZyBkYXRhIG5lZWRlZCBieSB0aGUgZmlsdGVyLiBUaGUgbWVhbmluZwotICogICAgICAgICAgICAgICBvZiB0aGlzIHBhcmFtZXRlciB2YXJpZXMgYnkgZmlsdGVyLgotICogQHJldHVybiAgICAgICB6ZXJvIG9uIHN1Y2Nlc3MKLSAqLwotYXR0cmlidXRlX2RlcHJlY2F0ZWQKLWludCBhdmZpbHRlcl9pbml0X2ZpbHRlcihBVkZpbHRlckNvbnRleHQgKmZpbHRlciwgY29uc3QgY2hhciAqYXJncywgdm9pZCAqb3BhcXVlKTsKLSNlbmRpZgogCiAvKioKICAqIEluaXRpYWxpemUgYSBmaWx0ZXIgd2l0aCB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycy4KQEAgLTc2NCw3ICs4NDMsOSBAQAogICAgIHVuc2lnbmVkIG5iX2ZpbHRlcnM7CiAKICAgICBjaGFyICpzY2FsZV9zd3Nfb3B0czsgLy8vPCBzd3Mgb3B0aW9ucyB0byB1c2UgZm9yIHRoZSBhdXRvLWluc2VydGVkIHNjYWxlIGZpbHRlcnMKLSAgICBjaGFyICpyZXNhbXBsZV9sYXZyX29wdHM7ICAgLy8vPCBsaWJhdnJlc2FtcGxlIG9wdGlvbnMgdG8gdXNlIGZvciB0aGUgYXV0by1pbnNlcnRlZCByZXNhbXBsZSBmaWx0ZXJzCisjaWYgRkZfQVBJX0xBVlJfT1BUUworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkIGNoYXIgKnJlc2FtcGxlX2xhdnJfb3B0czsgICAvLy88IGxpYmF2cmVzYW1wbGUgb3B0aW9ucyB0byB1c2UgZm9yIHRoZSBhdXRvLWluc2VydGVkIHJlc2FtcGxlIGZpbHRlcnMKKyNlbmRpZgogCiAgICAgLyoqCiAgICAgICogVHlwZSBvZiBtdWx0aXRocmVhZGluZyBhbGxvd2VkIGZvciBmaWx0ZXJzIGluIHRoaXMgZ3JhcGguIEEgY29tYmluYXRpb24KQEAgLTg2MywyMCArOTQ0LDYgQEAKICAqLwogQVZGaWx0ZXJDb250ZXh0ICphdmZpbHRlcl9ncmFwaF9nZXRfZmlsdGVyKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBjb25zdCBjaGFyICpuYW1lKTsKIAotI2lmIEZGX0FQSV9BVkZJTFRFUl9PUEVOCi0vKioKLSAqIEFkZCBhbiBleGlzdGluZyBmaWx0ZXIgaW5zdGFuY2UgdG8gYSBmaWx0ZXIgZ3JhcGguCi0gKgotICogQHBhcmFtIGdyYXBoY3R4ICB0aGUgZmlsdGVyIGdyYXBoCi0gKiBAcGFyYW0gZmlsdGVyIHRoZSBmaWx0ZXIgdG8gYmUgYWRkZWQKLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2UgYXZmaWx0ZXJfZ3JhcGhfYWxsb2NfZmlsdGVyKCkgdG8gYWxsb2NhdGUgYSBmaWx0ZXIgaW4gYQotICogZmlsdGVyIGdyYXBoCi0gKi8KLWF0dHJpYnV0ZV9kZXByZWNhdGVkCi1pbnQgYXZmaWx0ZXJfZ3JhcGhfYWRkX2ZpbHRlcihBVkZpbHRlckdyYXBoICpncmFwaGN0eCwgQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIpOwotI2VuZGlmCi0KIC8qKgogICogQ3JlYXRlIGFuZCBhZGQgYSBmaWx0ZXIgaW5zdGFuY2UgaW50byBhbiBleGlzdGluZyBncmFwaC4KICAqIFRoZSBmaWx0ZXIgaW5zdGFuY2UgaXMgY3JlYXRlZCBmcm9tIHRoZSBmaWx0ZXIgZmlsdCBhbmQgaW5pdGVkCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmMgYi9saWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmMKaW5kZXggOWY1MGI0MS4uNGNjNjg5MiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYXZmaWx0ZXJncmFwaC5jCisrKyBiL2xpYmF2ZmlsdGVyL2F2ZmlsdGVyZ3JhcGguYwpAQCAtMjgsMjcgKzI4LDM0IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogCisjZGVmaW5lIEZGX0lOVEVSTkFMX0ZJRUxEUyAxCisjaW5jbHVkZSAiZnJhbWVxdWV1ZS5oIgorCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJidWZmZXJzaW5rLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFWRmlsdGVyR3JhcGgsIHgpCi0jZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorI2RlZmluZSBGIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorI2RlZmluZSBWIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisjZGVmaW5lIEEgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBmaWx0ZXJncmFwaF9vcHRpb25zW10gPSB7CiAgICAgeyAidGhyZWFkX3R5cGUiLCAiQWxsb3dlZCB0aHJlYWQgdHlwZXMiLCBPRkZTRVQodGhyZWFkX3R5cGUpLCBBVl9PUFRfVFlQRV9GTEFHUywKLSAgICAgICAgeyAuaTY0ID0gQVZGSUxURVJfVEhSRUFEX1NMSUNFIH0sIDAsIElOVF9NQVgsIEZMQUdTLCAidGhyZWFkX3R5cGUiIH0sCi0gICAgICAgIHsgInNsaWNlIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWRklMVEVSX1RIUkVBRF9TTElDRSB9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAidGhyZWFkX3R5cGUiIH0sCisgICAgICAgIHsgLmk2NCA9IEFWRklMVEVSX1RIUkVBRF9TTElDRSB9LCAwLCBJTlRfTUFYLCBGfFZ8QSwgInRocmVhZF90eXBlIiB9LAorICAgICAgICB7ICJzbGljZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVkZJTFRFUl9USFJFQURfU0xJQ0UgfSwgLmZsYWdzID0gRnxWfEEsIC51bml0ID0gInRocmVhZF90eXBlIiB9LAogICAgIHsgInRocmVhZHMiLCAgICAgIk1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMiLCBPRkZTRVQobmJfdGhyZWFkcyksCi0gICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIEZ8VnxBIH0sCiAgICAgeyJzY2FsZV9zd3Nfb3B0cyIgICAgICAgLCAiZGVmYXVsdCBzY2FsZSBmaWx0ZXIgb3B0aW9ucyIgICAgICAgICwgT0ZGU0VUKHNjYWxlX3N3c19vcHRzKSAgICAgICAgLAotICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTIH0sCisgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRnxWIH0sCiAgICAgeyJhcmVzYW1wbGVfc3dyX29wdHMiICAgLCAiZGVmYXVsdCBhcmVzYW1wbGUgZmlsdGVyIG9wdGlvbnMiICAgICwgT0ZGU0VUKGFyZXNhbXBsZV9zd3Jfb3B0cykgICAgLAotICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTIH0sCisgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRnxBIH0sCiAgICAgeyBOVUxMIH0sCiB9OwogCkBAIC04NywxOCArOTQsMjQgQEAKIAogICAgIHJldC0+YXZfY2xhc3MgPSAmZmlsdGVyZ3JhcGhfY2xhc3M7CiAgICAgYXZfb3B0X3NldF9kZWZhdWx0cyhyZXQpOworICAgIGZmX2ZyYW1lcXVldWVfZ2xvYmFsX2luaXQoJnJldC0+aW50ZXJuYWwtPmZyYW1lX3F1ZXVlcyk7CiAKICAgICByZXR1cm4gcmV0OwogfQogCiB2b2lkIGZmX2ZpbHRlcl9ncmFwaF9yZW1vdmVfZmlsdGVyKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBBVkZpbHRlckNvbnRleHQgKmZpbHRlcikKIHsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgajsKICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnM7IGkrKykgewogICAgICAgICBpZiAoZ3JhcGgtPmZpbHRlcnNbaV0gPT0gZmlsdGVyKSB7CiAgICAgICAgICAgICBGRlNXQVAoQVZGaWx0ZXJDb250ZXh0KiwgZ3JhcGgtPmZpbHRlcnNbaV0sCiAgICAgICAgICAgICAgICAgICAgZ3JhcGgtPmZpbHRlcnNbZ3JhcGgtPm5iX2ZpbHRlcnMgLSAxXSk7CiAgICAgICAgICAgICBncmFwaC0+bmJfZmlsdGVycy0tOworICAgICAgICAgICAgZmlsdGVyLT5ncmFwaCA9IE5VTEw7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqPGZpbHRlci0+bmJfb3V0cHV0czsgaisrKQorICAgICAgICAgICAgICAgIGlmIChmaWx0ZXItPm91dHB1dHNbal0pCisgICAgICAgICAgICAgICAgICAgIGZpbHRlci0+b3V0cHV0c1tqXS0+Z3JhcGggPSBOVUxMOworCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTgsMjkgKzEzMSwxNCBAQAogCiAgICAgYXZfZnJlZXAoJigqZ3JhcGgpLT5zY2FsZV9zd3Nfb3B0cyk7CiAgICAgYXZfZnJlZXAoJigqZ3JhcGgpLT5hcmVzYW1wbGVfc3dyX29wdHMpOworI2lmIEZGX0FQSV9MQVZSX09QVFMKICAgICBhdl9mcmVlcCgmKCpncmFwaCktPnJlc2FtcGxlX2xhdnJfb3B0cyk7CisjZW5kaWYKICAgICBhdl9mcmVlcCgmKCpncmFwaCktPmZpbHRlcnMpOwogICAgIGF2X2ZyZWVwKCYoKmdyYXBoKS0+aW50ZXJuYWwpOwogICAgIGF2X2ZyZWVwKGdyYXBoKTsKIH0KIAotI2lmIEZGX0FQSV9BVkZJTFRFUl9PUEVOCi1pbnQgYXZmaWx0ZXJfZ3JhcGhfYWRkX2ZpbHRlcihBVkZpbHRlckdyYXBoICpncmFwaCwgQVZGaWx0ZXJDb250ZXh0ICpmaWx0ZXIpCi17Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICoqZmlsdGVycyA9IGF2X3JlYWxsb2MoZ3JhcGgtPmZpbHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmaWx0ZXJzKSAqIChncmFwaC0+bmJfZmlsdGVycyArIDEpKTsKLSAgICBpZiAoIWZpbHRlcnMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICBncmFwaC0+ZmlsdGVycyA9IGZpbHRlcnM7Ci0gICAgZ3JhcGgtPmZpbHRlcnNbZ3JhcGgtPm5iX2ZpbHRlcnMrK10gPSBmaWx0ZXI7Ci0KLSAgICBmaWx0ZXItPmdyYXBoID0gZ3JhcGg7Ci0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCiBpbnQgYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcihBVkZpbHRlckNvbnRleHQgKipmaWx0X2N0eCwgY29uc3QgQVZGaWx0ZXIgKmZpbHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphcmdzLCB2b2lkICpvcGFxdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZpbHRlckdyYXBoICpncmFwaF9jdHgpCkBAIC0xODEsNyArMTc5LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGludCByZXQgPSBmZl9ncmFwaF90aHJlYWRfaW5pdChncmFwaCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhncmFwaCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIHRocmVhZGluZy5cbiIpOworICAgICAgICAgICAgICAgIGF2X2xvZyhncmFwaCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIHRocmVhZGluZzogJXMuXG4iLCBhdl9lcnIyc3RyKHJldCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNjgsNiArMjY2LDI3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZ3JhcGhfY2hlY2tfbGlua3MoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIEFWQ2xhc3MgKmxvZ19jdHgpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpmOworICAgIEFWRmlsdGVyTGluayAqbDsKKyAgICB1bnNpZ25lZCBpLCBqOworICAgIGludCByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ3JhcGgtPm5iX2ZpbHRlcnM7IGkrKykgeworICAgICAgICBmID0gZ3JhcGgtPmZpbHRlcnNbaV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmLT5uYl9vdXRwdXRzOyBqKyspIHsKKyAgICAgICAgICAgIGwgPSBmLT5vdXRwdXRzW2pdOworICAgICAgICAgICAgaWYgKGwtPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZTIobC0+dywgbC0+aCwgSU5UNjRfTUFYLCBsLT5mb3JtYXQsIDAsIGYpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBBVkZpbHRlckNvbnRleHQgKmF2ZmlsdGVyX2dyYXBoX2dldF9maWx0ZXIoQVZGaWx0ZXJHcmFwaCAqZ3JhcGgsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgaW50IGk7CkBAIC00OTcsMTEgKzUxNiwxOCBAQAogCiAgICAgICAgICAgICBpZiAoY29udmVydF9uZWVkZWQpIHsKICAgICAgICAgICAgICAgICBBVkZpbHRlckNvbnRleHQgKmNvbnZlcnQ7Ci0gICAgICAgICAgICAgICAgQVZGaWx0ZXIgKmZpbHRlcjsKKyAgICAgICAgICAgICAgICBjb25zdCBBVkZpbHRlciAqZmlsdGVyOwogICAgICAgICAgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rLCAqb3V0bGluazsKLSAgICAgICAgICAgICAgICBjaGFyIHNjYWxlX2FyZ3NbMjU2XTsKICAgICAgICAgICAgICAgICBjaGFyIGluc3RfbmFtZVszMF07CiAKKyAgICAgICAgICAgICAgICBpZiAoZ3JhcGgtPmRpc2FibGVfYXV0b19jb252ZXJ0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGZpbHRlcnMgJyVzJyBhbmQgJyVzJyBkbyBub3QgaGF2ZSBhIGNvbW1vbiBmb3JtYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCBhdXRvbWF0aWMgY29udmVyc2lvbiBpcyBkaXNhYmxlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5zcmMtPm5hbWUsIGxpbmstPmRzdC0+bmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLyogY291bGRuJ3QgbWVyZ2UgZm9ybWF0IGxpc3RzLiBhdXRvLWluc2VydCBjb252ZXJzaW9uIGZpbHRlciAqLwogICAgICAgICAgICAgICAgIHN3aXRjaCAobGluay0+dHlwZSkgewogICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgpAQCAtNTExLDcgKzUzNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgc25wcmludGYoaW5zdF9uYW1lLCBzaXplb2YoaW5zdF9uYW1lKSwgImF1dG8taW5zZXJ0ZWQgc2NhbGVyICVkIiwKKyAgICAgICAgICAgICAgICAgICAgc25wcmludGYoaW5zdF9uYW1lLCBzaXplb2YoaW5zdF9uYW1lKSwgImF1dG9fc2NhbGVyXyVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVyX2NvdW50KyspOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmY29udmVydCwgZmlsdGVyLApAQCAtNTI2LDEyICs1NTIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGluc3RfbmFtZSwgc2l6ZW9mKGluc3RfbmFtZSksICJhdXRvLWluc2VydGVkIHJlc2FtcGxlciAlZCIsCisgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGluc3RfbmFtZSwgc2l6ZW9mKGluc3RfbmFtZSksICJhdXRvX3Jlc2FtcGxlcl8lZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2FtcGxlcl9jb3VudCsrKTsKLSAgICAgICAgICAgICAgICAgICAgc2NhbGVfYXJnc1swXSA9ICdcMCc7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChncmFwaC0+YXJlc2FtcGxlX3N3cl9vcHRzKQotICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoc2NhbGVfYXJncywgc2l6ZW9mKHNjYWxlX2FyZ3MpLCAiJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgtPmFyZXNhbXBsZV9zd3Jfb3B0cyk7CiAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZmaWx0ZXJfZ3JhcGhfY3JlYXRlX2ZpbHRlcigmY29udmVydCwgZmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdF9uYW1lLCBncmFwaC0+YXJlc2FtcGxlX3N3cl9vcHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZ3JhcGgpKSA8IDApCkBAIC04NTgsNiArODgwLDggQEAKICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dGxpbmstPmluX3NhbXBsZXJhdGVzLT5uYl9mb3JtYXRzOyBqKyspIHsKICAgICAgICAgICAgIGludCBkaWZmID0gYWJzKHNhbXBsZV9yYXRlIC0gb3V0bGluay0+aW5fc2FtcGxlcmF0ZXMtPmZvcm1hdHNbal0pOwogCisgICAgICAgICAgICBhdl9hc3NlcnQwKGRpZmYgPCBJTlRfTUFYKTsgLy8gVGhpcyB3b3VsZCBsZWFkIHRvIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCBiZXN0X2RpZmYgYnV0IGlzIG9ubHkgcG9zc2libGUgd2l0aCBpbnZhbGlkIHNhbXBsZSByYXRlcworCiAgICAgICAgICAgICBpZiAoZGlmZiA8IGJlc3RfZGlmZikgewogICAgICAgICAgICAgICAgIGJlc3RfZGlmZiA9IGRpZmY7CiAgICAgICAgICAgICAgICAgYmVzdF9pZHggID0gajsKQEAgLTEyMTMsNyArMTIzNyw3IEBACiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBmLT5uYl9pbnB1dHM7IGorKykgewogICAgICAgICAgICAgQVZGaWx0ZXJMaW5rICpsaW5rID0gZi0+aW5wdXRzW2pdOwogICAgICAgICAgICAgQVZGaWx0ZXJDb250ZXh0ICpmaWZvX2N0eDsKLSAgICAgICAgICAgIEFWRmlsdGVyICpmaWZvOworICAgICAgICAgICAgY29uc3QgQVZGaWx0ZXIgKmZpZm87CiAgICAgICAgICAgICBjaGFyIG5hbWVbMzJdOwogCiAgICAgICAgICAgICBpZiAoIWxpbmstPmRzdHBhZC0+bmVlZHNfZmlmbykKQEAgLTEyMjMsNyArMTI0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImZpZm8iKSA6CiAgICAgICAgICAgICAgICAgICAgYXZmaWx0ZXJfZ2V0X2J5X25hbWUoImFmaWZvIik7CiAKLSAgICAgICAgICAgIHNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImF1dG8taW5zZXJ0ZWQgZmlmbyAlZCIsIGZpZm9fY291bnQrKyk7CisgICAgICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJhdXRvX2ZpZm9fJWQiLCBmaWZvX2NvdW50KyspOwogCiAgICAgICAgICAgICByZXQgPSBhdmZpbHRlcl9ncmFwaF9jcmVhdGVfZmlsdGVyKCZmaWZvX2N0eCwgZmlmbywgbmFtZSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgZ3JhcGgpOwpAQCAtMTI1MSw2ICsxMjc1LDggQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICBpZiAoKHJldCA9IGdyYXBoX2NvbmZpZ19saW5rcyhncmFwaGN0eCwgbG9nX2N0eCkpKQogICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICgocmV0ID0gZ3JhcGhfY2hlY2tfbGlua3MoZ3JhcGhjdHgsIGxvZ19jdHgpKSkKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICBpZiAoKHJldCA9IGdyYXBoX2NvbmZpZ19wb2ludGVycyhncmFwaGN0eCwgbG9nX2N0eCkpKQogICAgICAgICByZXR1cm4gcmV0OwogCkBAIC0xMzAyLDYgKzEzMjgsOSBAQAogICAgICAgICAgICAgICAgIHF1ZXVlID0gJigqcXVldWUpLT5uZXh0OwogICAgICAgICAgICAgbmV4dCA9ICpxdWV1ZTsKICAgICAgICAgICAgICpxdWV1ZSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWRmlsdGVyQ29tbWFuZCkpOworICAgICAgICAgICAgaWYgKCEqcXVldWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKwogICAgICAgICAgICAgKCpxdWV1ZSktPmNvbW1hbmQgPSBhdl9zdHJkdXAoY29tbWFuZCk7CiAgICAgICAgICAgICAoKnF1ZXVlKS0+YXJnICAgICA9IGF2X3N0cmR1cChhcmcpOwogICAgICAgICAgICAgKCpxdWV1ZSktPnRpbWUgICAgPSB0czsKQEAgLTEzNjQsMTUgKzEzOTMsMjMgQEAKICAgICBoZWFwX2J1YmJsZV9kb3duKGdyYXBoLCBsaW5rLCBsaW5rLT5hZ2VfaW5kZXgpOwogfQogCi0KIGludCBhdmZpbHRlcl9ncmFwaF9yZXF1ZXN0X29sZGVzdChBVkZpbHRlckdyYXBoICpncmFwaCkKIHsKICAgICBBVkZpbHRlckxpbmsgKm9sZGVzdCA9IGdyYXBoLT5zaW5rX2xpbmtzWzBdOworICAgIGludDY0X3QgZnJhbWVfY291bnQ7CiAgICAgaW50IHI7CiAKICAgICB3aGlsZSAoZ3JhcGgtPnNpbmtfbGlua3NfY291bnQpIHsKICAgICAgICAgb2xkZXN0ID0gZ3JhcGgtPnNpbmtfbGlua3NbMF07Ci0gICAgICAgIHIgPSBmZl9yZXF1ZXN0X2ZyYW1lKG9sZGVzdCk7CisgICAgICAgIGlmIChvbGRlc3QtPmRzdC0+ZmlsdGVyLT5hY3RpdmF0ZSkgeworICAgICAgICAgICAgLyogRm9yIG5vdywgYnVmZmVyc2luayBpcyB0aGUgb25seSBmaWx0ZXIgaW1wbGVtZW50aW5nIGFjdGl2YXRlLiAqLworICAgICAgICAgICAgciA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX2ZsYWdzKG9sZGVzdC0+ZHN0LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0JVRkZFUlNJTktfRkxBR19QRUVLKTsKKyAgICAgICAgICAgIGlmIChyICE9IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgciA9IGZmX3JlcXVlc3RfZnJhbWUob2xkZXN0KTsKKyAgICAgICAgfQogICAgICAgICBpZiAociAhPSBBVkVSUk9SX0VPRikKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBhdl9sb2cob2xkZXN0LT5kc3QsIEFWX0xPR19ERUJVRywgIkVPRiBvbiBzaW5rIGxpbmsgJXM6JXMuXG4iLApAQCAtMTM4Niw1MCArMTQyMywzMiBAQAogICAgIH0KICAgICBpZiAoIWdyYXBoLT5zaW5rX2xpbmtzX2NvdW50KQogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgYXZfYXNzZXJ0MSghb2xkZXN0LT5kc3QtPmZpbHRlci0+YWN0aXZhdGUpOwogICAgIGF2X2Fzc2VydDEob2xkZXN0LT5hZ2VfaW5kZXggPj0gMCk7Ci0gICAgd2hpbGUgKG9sZGVzdC0+ZnJhbWVfd2FudGVkX291dCkgeworICAgIGZyYW1lX2NvdW50ID0gb2xkZXN0LT5mcmFtZV9jb3VudF9vdXQ7CisgICAgd2hpbGUgKGZyYW1lX2NvdW50ID09IG9sZGVzdC0+ZnJhbWVfY291bnRfb3V0KSB7CiAgICAgICAgIHIgPSBmZl9maWx0ZXJfZ3JhcGhfcnVuX29uY2UoZ3JhcGgpOwotICAgICAgICBpZiAociA8IDApCisgICAgICAgIGlmIChyID09IEFWRVJST1IoRUFHQUlOKSAmJgorICAgICAgICAgICAgIW9sZGVzdC0+ZnJhbWVfd2FudGVkX291dCAmJiAhb2xkZXN0LT5mcmFtZV9ibG9ja2VkX2luICYmCisgICAgICAgICAgICAhb2xkZXN0LT5zdGF0dXNfaW4pCisgICAgICAgICAgICBmZl9yZXF1ZXN0X2ZyYW1lKG9sZGVzdCk7CisgICAgICAgIGVsc2UgaWYgKHIgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgQVZGaWx0ZXJMaW5rICpncmFwaF9ydW5fb25jZV9maW5kX2ZpbHRlcihBVkZpbHRlckdyYXBoICpncmFwaCkKLXsKLSAgICB1bnNpZ25lZCBpLCBqOwotICAgIEFWRmlsdGVyQ29udGV4dCAqZjsKLQotICAgIC8qIFRPRE86IHJlcGxhY2Ugc2Nhbm5pbmcgdGhlIGdyYXBoIHdpdGggYSBwcmlvcml0eSBsaXN0ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGdyYXBoLT5uYl9maWx0ZXJzOyBpKyspIHsKLSAgICAgICAgZiA9IGdyYXBoLT5maWx0ZXJzW2ldOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgZi0+bmJfb3V0cHV0czsgaisrKQotICAgICAgICAgICAgaWYgKGYtPm91dHB1dHNbal0tPmZyYW1lX3dhbnRlZF9pbikKLSAgICAgICAgICAgICAgICByZXR1cm4gZi0+b3V0cHV0c1tqXTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGdyYXBoLT5uYl9maWx0ZXJzOyBpKyspIHsKLSAgICAgICAgZiA9IGdyYXBoLT5maWx0ZXJzW2ldOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgZi0+bmJfb3V0cHV0czsgaisrKQotICAgICAgICAgICAgaWYgKGYtPm91dHB1dHNbal0tPmZyYW1lX3dhbnRlZF9vdXQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGYtPm91dHB1dHNbal07Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCiBpbnQgZmZfZmlsdGVyX2dyYXBoX3J1bl9vbmNlKEFWRmlsdGVyR3JhcGggKmdyYXBoKQogewotICAgIEFWRmlsdGVyTGluayAqbGluazsKLSAgICBpbnQgcmV0OworICAgIEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyOworICAgIHVuc2lnbmVkIGk7CiAKLSAgICBsaW5rID0gZ3JhcGhfcnVuX29uY2VfZmluZF9maWx0ZXIoZ3JhcGgpOwotICAgIGlmICghbGluaykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJVc2VsZXNzIHJ1biBvZiBhIGZpbHRlciBncmFwaFxuIik7CisgICAgYXZfYXNzZXJ0MChncmFwaC0+bmJfZmlsdGVycyk7CisgICAgZmlsdGVyID0gZ3JhcGgtPmZpbHRlcnNbMF07CisgICAgZm9yIChpID0gMTsgaSA8IGdyYXBoLT5uYl9maWx0ZXJzOyBpKyspCisgICAgICAgIGlmIChncmFwaC0+ZmlsdGVyc1tpXS0+cmVhZHkgPiBmaWx0ZXItPnJlYWR5KQorICAgICAgICAgICAgZmlsdGVyID0gZ3JhcGgtPmZpbHRlcnNbaV07CisgICAgaWYgKCFmaWx0ZXItPnJlYWR5KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOwotICAgIH0KLSAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lX3RvX2ZpbHRlcihsaW5rKTsKLSAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GKQotICAgICAgICAvKiBsb2NhbCBFT0Ygd2lsbCBiZSBmb3J3YXJkZWQgdGhyb3VnaCByZXF1ZXN0X2ZyYW1lKCkgLwotICAgICAgICAgICBzZXRfc3RhdHVzKCkgdW50aWwgaXQgcmVhY2hlcyB0aGUgc2luayAqLwotICAgICAgICByZXQgPSAwOwotICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogMTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2FjdGl2YXRlKGZpbHRlcik7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmggYi9saWJhdmZpbHRlci9hdmZpbHRlcmdyYXBoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMWQ1ODEuLjAwMDAwMDAKLS0tIGEvbGliYXZmaWx0ZXIvYXZmaWx0ZXJncmFwaC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIEZpbHRlciBncmFwaHMKLSAqIGNvcHlyaWdodCAoYykgMjAwNyBCb2JieSBCaW5naGFtCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZGSUxURVJfQVZGSUxURVJHUkFQSF9ICi0jZGVmaW5lIEFWRklMVEVSX0FWRklMVEVSR1JBUEhfSAotCi0jaW5jbHVkZSAiYXZmaWx0ZXIuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCi0KLSNlbmRpZiAvKiBBVkZJTFRFUl9BVkZJTFRFUkdSQVBIX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2Jib3guaCBiL2xpYmF2ZmlsdGVyL2Jib3guaAppbmRleCBlYjczMTU0Li5jZjAyNmI4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9iYm94LmgKKysrIGIvbGliYXZmaWx0ZXIvYmJveC5oCkBAIC0yMyw3ICsyMyw3IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRkZCb3VuZGluZ0JveCB7CiAgICAgaW50IHgxLCB4MiwgeTEsIHkyOwogfSBGRkJvdW5kaW5nQm94OwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9ibGVuZC5oIGIvbGliYXZmaWx0ZXIvYmxlbmQuaAppbmRleCBjY2VmMTM2Li5lYjIwMjI2IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9ibGVuZC5oCisrKyBiL2xpYmF2ZmlsdGVyL2JsZW5kLmgKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBCTEVORF9CVVJOLAogICAgIEJMRU5EX0RBUktFTiwKICAgICBCTEVORF9ESUZGRVJFTkNFLAotICAgIEJMRU5EX0RJRkZFUkVOQ0UxMjgsCisgICAgQkxFTkRfR1JBSU5FWFRSQUNULAogICAgIEJMRU5EX0RJVklERSwKICAgICBCTEVORF9ET0RHRSwKICAgICBCTEVORF9FWENMVVNJT04sCkBAIC01NCw4ICs1NCwxMSBAQAogICAgIEJMRU5EX0hBUkRNSVgsCiAgICAgQkxFTkRfTElORUFSTElHSFQsCiAgICAgQkxFTkRfR0xPVywKLSAgICBCTEVORF9BRERJVElPTjEyOCwKKyAgICBCTEVORF9HUkFJTk1FUkdFLAogICAgIEJMRU5EX01VTFRJUExZMTI4LAorICAgIEJMRU5EX0hFQVQsCisgICAgQkxFTkRfRlJFRVpFLAorICAgIEJMRU5EX0VYVFJFTUlUWSwKICAgICBCTEVORF9OQgogfTsKIApAQCAtNjgsNyArNzEsNyBAQAogICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYm90dG9tLCBwdHJkaWZmX3QgYm90dG9tX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLCBwdHJkaWZmX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgc3RydWN0IEZpbHRlclBhcmFtcyAqcGFyYW0sIGRvdWJsZSAqdmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdCBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcywgaW50IHN0YXJ0eSk7CiB9IEZpbHRlclBhcmFtczsKIAogdm9pZCBmZl9ibGVuZF9pbml0KEZpbHRlclBhcmFtcyAqcGFyYW0sIGludCBpc18xNmJpdCk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9idWZmZXJzaW5rLmMgYi9saWJhdmZpbHRlci9idWZmZXJzaW5rLmMKaW5kZXggMmZlYjU2ZC4uMGY4N2I1NCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvYnVmZmVyc2luay5jCisrKyBiL2xpYmF2ZmlsdGVyL2J1ZmZlcnNpbmsuYwpAQCAtMjMsMjIgKzIzLDIzIEBACiAgKiBidWZmZXIgc2luawogICovCiAKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXVkaW9fZmlmby5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAKKyNkZWZpbmUgRkZfSU5URVJOQUxfRklFTERTIDEKKyNpbmNsdWRlICJmcmFtZXF1ZXVlLmgiCisKICNpbmNsdWRlICJhdWRpby5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiYnVmZmVyc2luay5oIgorI2luY2x1ZGUgImZpbHRlcnMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiB0eXBlZGVmIHN0cnVjdCBCdWZmZXJTaW5rQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Ci0gICAgQVZGaWZvQnVmZmVyICpmaWZvOyAgICAgICAgICAgICAgICAgICAgICAvLy88IEZJRk8gYnVmZmVyIG9mIHZpZGVvIGZyYW1lIHJlZmVyZW5jZXMKICAgICB1bnNpZ25lZCB3YXJuaW5nX2xpbWl0OwogCiAgICAgLyogb25seSB1c2VkIGZvciB2aWRlbyAqLwpAQCAtNTYsMTc0ICs1Nyw3NCBAQAogICAgIGludCAqc2FtcGxlX3JhdGVzOyAgICAgICAgICAgICAgICAgICAgICAvLy88IGxpc3Qgb2YgYWNjZXB0ZWQgc2FtcGxlIHJhdGVzLCB0ZXJtaW5hdGVkIGJ5IC0xCiAgICAgaW50IHNhbXBsZV9yYXRlc19zaXplOwogCi0gICAgLyogb25seSB1c2VkIGZvciBjb21wYXQgQVBJICovCi0gICAgQVZBdWRpb0ZpZm8gKmF1ZGlvX2ZpZm87ICAgICAvLy88IEZJRk8gZm9yIGF1ZGlvIHNhbXBsZXMKLSAgICBpbnQ2NF90IG5leHRfcHRzOyAgICAgICAgICAgIC8vLzwgaW50ZXJwb2xhdGluZyBhdWRpbyBwdHMKKyAgICBBVkZyYW1lICpwZWVrZWRfZnJhbWU7CiB9IEJ1ZmZlclNpbmtDb250ZXh0OwogCiAjZGVmaW5lIE5CX0lURU1TKGxpc3QpIChsaXN0ICMjIF9zaXplIC8gc2l6ZW9mKCpsaXN0KSkKICNkZWZpbmUgRklGT19JTklUX1NJWkUgOAogI2RlZmluZSBGSUZPX0lOSVRfRUxFTUVOVF9TSVpFIHNpemVvZih2b2lkICopCiAKLXN0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQotewotICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpzaW5rID0gY3R4LT5wcml2OwotICAgIEFWRnJhbWUgKmZyYW1lOwotCi0gICAgaWYgKHNpbmstPmF1ZGlvX2ZpZm8pCi0gICAgICAgIGF2X2F1ZGlvX2ZpZm9fZnJlZShzaW5rLT5hdWRpb19maWZvKTsKLQotICAgIGlmIChzaW5rLT5maWZvKSB7Ci0gICAgICAgIHdoaWxlIChhdl9maWZvX3NpemUoc2luay0+ZmlmbykgPj0gRklGT19JTklUX0VMRU1FTlRfU0laRSkgewotICAgICAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQoc2luay0+ZmlmbywgJmZyYW1lLCBzaXplb2YoZnJhbWUpLCBOVUxMKTsKLSAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKLSAgICAgICAgfQotICAgICAgICBhdl9maWZvX2ZyZWVwKCZzaW5rLT5maWZvKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbnQgYWRkX2J1ZmZlcl9yZWYoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKnJlZikKLXsKLSAgICBCdWZmZXJTaW5rQ29udGV4dCAqYnVmID0gY3R4LT5wcml2OwotCi0gICAgaWYgKGF2X2ZpZm9fc3BhY2UoYnVmLT5maWZvKSA8IEZJRk9fSU5JVF9FTEVNRU5UX1NJWkUpIHsKLSAgICAgICAgLyogcmVhbGxvYyBmaWZvIHNpemUgKi8KLSAgICAgICAgaWYgKGF2X2ZpZm9fcmVhbGxvYzIoYnVmLT5maWZvLCBhdl9maWZvX3NpemUoYnVmLT5maWZvKSAqIDIpIDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJDYW5ub3QgYnVmZmVyIG1vcmUgZnJhbWVzLiBDb25zdW1lIHNvbWUgYXZhaWxhYmxlIGZyYW1lcyAiCi0gICAgICAgICAgICAgICAgICAgImJlZm9yZSBhZGRpbmcgbmV3IG9uZXMuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjYWNoZSBmcmFtZSAqLwotICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShidWYtPmZpZm8sICZyZWYsIEZJRk9fSU5JVF9FTEVNRU5UX1NJWkUsIE5VTEwpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmZyYW1lKQotewotICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OwotICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBsaW5rLT5kc3QtPnByaXY7Ci0gICAgaW50IHJldDsKLQotICAgIGlmICgocmV0ID0gYWRkX2J1ZmZlcl9yZWYoY3R4LCBmcmFtZSkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoYnVmLT53YXJuaW5nX2xpbWl0ICYmCi0gICAgICAgIGF2X2ZpZm9fc2l6ZShidWYtPmZpZm8pIC8gRklGT19JTklUX0VMRU1FTlRfU0laRSA+PSBidWYtPndhcm5pbmdfbGltaXQpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAiJWQgYnVmZmVycyBxdWV1ZWQgaW4gJXMsIHNvbWV0aGluZyBtYXkgYmUgd3JvbmcuXG4iLAotICAgICAgICAgICAgICAgYnVmLT53YXJuaW5nX2xpbWl0LAotICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoY3R4LT5uYW1lLCBjdHgtPmZpbHRlci0+bmFtZSkpOwotICAgICAgICBidWYtPndhcm5pbmdfbGltaXQgKj0gMTA7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCiBpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdl9idWZmZXJzaW5rX2dldF9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpCiB7CiAgICAgcmV0dXJuIGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX2ZsYWdzKGN0eCwgZnJhbWUsIDApOwogfQogCi1pbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdl9idWZmZXJzaW5rX2dldF9mcmFtZV9mbGFncyhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncykKK3N0YXRpYyBpbnQgcmV0dXJuX29yX2tlZXBfZnJhbWUoQnVmZmVyU2lua0NvbnRleHQgKmJ1ZiwgQVZGcmFtZSAqb3V0LCBBVkZyYW1lICppbiwgaW50IGZsYWdzKQoreworICAgIGlmICgoZmxhZ3MgJiBBVl9CVUZGRVJTSU5LX0ZMQUdfUEVFSykpIHsKKyAgICAgICAgYnVmLT5wZWVrZWRfZnJhbWUgPSBpbjsKKyAgICAgICAgcmV0dXJuIG91dCA/IGF2X2ZyYW1lX3JlZihvdXQsIGluKSA6IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYXNzZXJ0MShvdXQpOworICAgICAgICBidWYtPnBlZWtlZF9mcmFtZSA9IE5VTEw7CisgICAgICAgIGF2X2ZyYW1lX21vdmVfcmVmKG91dCwgaW4pOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBnZXRfZnJhbWVfaW50ZXJuYWwoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MsIGludCBzYW1wbGVzKQogewogICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBjdHgtPnByaXY7CiAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKLSAgICBpbnQgcmV0OworICAgIGludCBzdGF0dXMsIHJldDsKICAgICBBVkZyYW1lICpjdXJfZnJhbWU7CisgICAgaW50NjRfdCBwdHM7CiAKLSAgICAvKiBubyBwaWNyZWYgYXZhaWxhYmxlLCBmZXRjaCBpdCBmcm9tIHRoZSBmaWx0ZXJjaGFpbiAqLwotICAgIHdoaWxlICghYXZfZmlmb19zaXplKGJ1Zi0+ZmlmbykpIHsKLSAgICAgICAgaWYgKGlubGluay0+c3RhdHVzKQotICAgICAgICAgICAgcmV0dXJuIGlubGluay0+c3RhdHVzOwotICAgICAgICBpZiAoZmxhZ3MgJiBBVl9CVUZGRVJTSU5LX0ZMQUdfTk9fUkVRVUVTVCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Ci0gICAgICAgIGlmICgocmV0ID0gZmZfcmVxdWVzdF9mcmFtZShpbmxpbmspKSA8IDApCisgICAgaWYgKGJ1Zi0+cGVla2VkX2ZyYW1lKQorICAgICAgICByZXR1cm4gcmV0dXJuX29yX2tlZXBfZnJhbWUoYnVmLCBmcmFtZSwgYnVmLT5wZWVrZWRfZnJhbWUsIGZsYWdzKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIHJldCA9IHNhbXBsZXMgPyBmZl9pbmxpbmtfY29uc3VtZV9zYW1wbGVzKGlubGluaywgc2FtcGxlcywgc2FtcGxlcywgJmN1cl9mcmFtZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgZmZfaW5saW5rX2NvbnN1bWVfZnJhbWUoaW5saW5rLCAmY3VyX2ZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIHdoaWxlIChpbmxpbmstPmZyYW1lX3dhbnRlZF9vdXQpIHsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQpIHsKKyAgICAgICAgICAgIC8qIFRPRE8gcmV0dXJuIHRoZSBmcmFtZSBpbnN0ZWFkIG9mIGNvcHlpbmcgaXQgKi8KKyAgICAgICAgICAgIHJldHVybiByZXR1cm5fb3Jfa2VlcF9mcmFtZShidWYsIGZyYW1lLCBjdXJfZnJhbWUsIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmZl9pbmxpbmtfYWNrbm93bGVkZ2Vfc3RhdHVzKGlubGluaywgJnN0YXR1cywgJnB0cykpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYgQVZfQlVGRkVSU0lOS19GTEFHX05PX1JFUVVFU1QpKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICB9IGVsc2UgaWYgKGlubGluay0+ZnJhbWVfd2FudGVkX291dCkgewogICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2dyYXBoX3J1bl9vbmNlKGN0eC0+Z3JhcGgpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZmX2lubGlua19yZXF1ZXN0X2ZyYW1lKGlubGluayk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAoZmxhZ3MgJiBBVl9CVUZGRVJTSU5LX0ZMQUdfUEVFSykgewotICAgICAgICBjdXJfZnJhbWUgPSAqKChBVkZyYW1lICoqKWF2X2ZpZm9fcGVlazIoYnVmLT5maWZvLCAwKSk7Ci0gICAgICAgIGlmICgocmV0ID0gYXZfZnJhbWVfcmVmKGZyYW1lLCBjdXJfZnJhbWUpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKGJ1Zi0+ZmlmbywgJmN1cl9mcmFtZSwgc2l6ZW9mKGN1cl9mcmFtZSksIE5VTEwpOwotICAgICAgICBhdl9mcmFtZV9tb3ZlX3JlZihmcmFtZSwgY3VyX2ZyYW1lKTsKLSAgICAgICAgYXZfZnJhbWVfZnJlZSgmY3VyX2ZyYW1lKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZWFkX2Zyb21fZmlmbyhBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zYW1wbGVzKQoraW50IGF0dHJpYnV0ZV9hbGlnbl9hcmcgYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfZmxhZ3MoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCiB7Ci0gICAgQnVmZmVyU2lua0NvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgQVZGaWx0ZXJMaW5rICAgKmxpbmsgPSBjdHgtPmlucHV0c1swXTsKLSAgICBBVkZyYW1lICp0bXA7Ci0KLSAgICBpZiAoISh0bXAgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKGxpbmssIG5iX3NhbXBsZXMpKSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBhdl9hdWRpb19maWZvX3JlYWQocy0+YXVkaW9fZmlmbywgKHZvaWQqKil0bXAtPmV4dGVuZGVkX2RhdGEsIG5iX3NhbXBsZXMpOwotCi0gICAgdG1wLT5wdHMgPSBzLT5uZXh0X3B0czsKLSAgICBpZiAocy0+bmV4dF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgIHMtPm5leHRfcHRzICs9IGF2X3Jlc2NhbGVfcShuYl9zYW1wbGVzLCAoQVZSYXRpb25hbCl7MSwgbGluay0+c2FtcGxlX3JhdGV9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+dGltZV9iYXNlKTsKLQotICAgIGF2X2ZyYW1lX21vdmVfcmVmKGZyYW1lLCB0bXApOwotICAgIGF2X2ZyYW1lX2ZyZWUoJnRtcCk7Ci0KLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZ2V0X2ZyYW1lX2ludGVybmFsKGN0eCwgZnJhbWUsIGZsYWdzLCBjdHgtPmlucHV0c1swXS0+bWluX3NhbXBsZXMpOwogfQogCiBpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdl9idWZmZXJzaW5rX2dldF9zYW1wbGVzKEFWRmlsdGVyQ29udGV4dCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwgaW50IG5iX3NhbXBsZXMpCiB7Ci0gICAgQnVmZmVyU2lua0NvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgQVZGaWx0ZXJMaW5rICAgKmxpbmsgPSBjdHgtPmlucHV0c1swXTsKLSAgICBBVkZyYW1lICpjdXJfZnJhbWU7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAoIXMtPmF1ZGlvX2ZpZm8pIHsKLSAgICAgICAgaW50IG5iX2NoYW5uZWxzID0gbGluay0+Y2hhbm5lbHM7Ci0gICAgICAgIGlmICghKHMtPmF1ZGlvX2ZpZm8gPSBhdl9hdWRpb19maWZvX2FsbG9jKGxpbmstPmZvcm1hdCwgbmJfY2hhbm5lbHMsIG5iX3NhbXBsZXMpKSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgd2hpbGUgKHJldCA+PSAwKSB7Ci0gICAgICAgIGlmIChhdl9hdWRpb19maWZvX3NpemUocy0+YXVkaW9fZmlmbykgPj0gbmJfc2FtcGxlcykKLSAgICAgICAgICAgIHJldHVybiByZWFkX2Zyb21fZmlmbyhjdHgsIGZyYW1lLCBuYl9zYW1wbGVzKTsKLQotICAgICAgICBpZiAoIShjdXJfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIHJldCA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX2ZsYWdzKGN0eCwgY3VyX2ZyYW1lLCAwKTsKLSAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBhdl9hdWRpb19maWZvX3NpemUocy0+YXVkaW9fZmlmbykpIHsKLSAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmN1cl9mcmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gcmVhZF9mcm9tX2ZpZm8oY3R4LCBmcmFtZSwgYXZfYXVkaW9fZmlmb19zaXplKHMtPmF1ZGlvX2ZpZm8pKTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZjdXJfZnJhbWUpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjdXJfZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICAgICAgcy0+bmV4dF9wdHMgPSBjdXJfZnJhbWUtPnB0cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcShhdl9hdWRpb19maWZvX3NpemUocy0+YXVkaW9fZmlmbyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIGxpbmstPnNhbXBsZV9yYXRlIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT50aW1lX2Jhc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0ID0gYXZfYXVkaW9fZmlmb193cml0ZShzLT5hdWRpb19maWZvLCAodm9pZCoqKWN1cl9mcmFtZS0+ZXh0ZW5kZWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfZnJhbWUtPm5iX3NhbXBsZXMpOwotICAgICAgICBhdl9mcmFtZV9mcmVlKCZjdXJfZnJhbWUpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIGdldF9mcmFtZV9pbnRlcm5hbChjdHgsIGZyYW1lLCAwLCBuYl9zYW1wbGVzKTsKIH0KIAogQVZCdWZmZXJTaW5rUGFyYW1zICphdl9idWZmZXJzaW5rX3BhcmFtc19hbGxvYyh2b2lkKQpAQCAtMjUwLDEzICsxNTEsMjQgQEAKIHsKICAgICBCdWZmZXJTaW5rQ29udGV4dCAqYnVmID0gY3R4LT5wcml2OwogCi0gICAgYnVmLT5maWZvID0gYXZfZmlmb19hbGxvY19hcnJheShGSUZPX0lOSVRfU0laRSwgRklGT19JTklUX0VMRU1FTlRfU0laRSk7Ci0gICAgaWYgKCFidWYtPmZpZm8pIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGZpZm9cbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KICAgICBidWYtPndhcm5pbmdfbGltaXQgPSAxMDA7Ci0gICAgYnVmLT5uZXh0X3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEJ1ZmZlclNpbmtDb250ZXh0ICpidWYgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoYnVmLT53YXJuaW5nX2xpbWl0ICYmCisgICAgICAgIGZmX2ZyYW1lcXVldWVfcXVldWVkX2ZyYW1lcygmY3R4LT5pbnB1dHNbMF0tPmZpZm8pID49IGJ1Zi0+d2FybmluZ19saW1pdCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICIlZCBidWZmZXJzIHF1ZXVlZCBpbiAlcywgc29tZXRoaW5nIG1heSBiZSB3cm9uZy5cbiIsCisgICAgICAgICAgICAgICBidWYtPndhcm5pbmdfbGltaXQsCisgICAgICAgICAgICAgICAoY2hhciAqKWF2X3hfaWZfbnVsbChjdHgtPm5hbWUsIGN0eC0+ZmlsdGVyLT5uYW1lKSk7CisgICAgICAgIGJ1Zi0+d2FybmluZ19saW1pdCAqPSAxMDsKKyAgICB9CisKKyAgICAvKiBUaGUgZnJhbWUgaXMgcXVldWVkLCB0aGUgcmVzdCBpcyB1cCB0byBnZXRfZnJhbWVfaW50ZXJuYWwgKi8KICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjY4LDE0ICsxODAsMjcgQEAKICAgICBpbmxpbmstPnBhcnRpYWxfYnVmX3NpemUgPSBmcmFtZV9zaXplOwogfQogCi1BVlJhdGlvbmFsIGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX3JhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCi17Ci0gICAgYXZfYXNzZXJ0MCggICAhc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiYnVmZmVyc2luayIpCi0gICAgICAgICAgICAgICB8fCAhc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiZmZidWZmZXJzaW5rIikpOwotCi0gICAgcmV0dXJuIGN0eC0+aW5wdXRzWzBdLT5mcmFtZV9yYXRlOworI2RlZmluZSBNQUtFX0FWRklMVEVSTElOS19BQ0NFU1NPUih0eXBlLCBmaWVsZCkgXAordHlwZSBhdl9idWZmZXJzaW5rX2dldF8jI2ZpZWxkKGNvbnN0IEFWRmlsdGVyQ29udGV4dCAqY3R4KSB7IFwKKyAgICBhdl9hc3NlcnQwKGN0eC0+ZmlsdGVyLT5hY3RpdmF0ZSA9PSBhY3RpdmF0ZSk7IFwKKyAgICByZXR1cm4gY3R4LT5pbnB1dHNbMF0tPmZpZWxkOyBcCiB9CiAKK01BS0VfQVZGSUxURVJMSU5LX0FDQ0VTU09SKGVudW0gQVZNZWRpYVR5cGUgLCB0eXBlICAgICAgICAgICAgICAgKQorTUFLRV9BVkZJTFRFUkxJTktfQUNDRVNTT1IoQVZSYXRpb25hbCAgICAgICAsIHRpbWVfYmFzZSAgICAgICAgICApCitNQUtFX0FWRklMVEVSTElOS19BQ0NFU1NPUihpbnQgICAgICAgICAgICAgICwgZm9ybWF0ICAgICAgICAgICAgICkKKworTUFLRV9BVkZJTFRFUkxJTktfQUNDRVNTT1IoQVZSYXRpb25hbCAgICAgICAsIGZyYW1lX3JhdGUgICAgICAgICApCitNQUtFX0FWRklMVEVSTElOS19BQ0NFU1NPUihpbnQgICAgICAgICAgICAgICwgdyAgICAgICAgICAgICAgICAgICkKK01BS0VfQVZGSUxURVJMSU5LX0FDQ0VTU09SKGludCAgICAgICAgICAgICAgLCBoICAgICAgICAgICAgICAgICAgKQorTUFLRV9BVkZJTFRFUkxJTktfQUNDRVNTT1IoQVZSYXRpb25hbCAgICAgICAsIHNhbXBsZV9hc3BlY3RfcmF0aW8pCisKK01BS0VfQVZGSUxURVJMSU5LX0FDQ0VTU09SKGludCAgICAgICAgICAgICAgLCBjaGFubmVscyAgICAgICAgICAgKQorTUFLRV9BVkZJTFRFUkxJTktfQUNDRVNTT1IodWludDY0X3QgICAgICAgICAsIGNoYW5uZWxfbGF5b3V0ICAgICApCitNQUtFX0FWRklMVEVSTElOS19BQ0NFU1NPUihpbnQgICAgICAgICAgICAgICwgc2FtcGxlX3JhdGUgICAgICAgICkKKworTUFLRV9BVkZJTFRFUkxJTktfQUNDRVNTT1IoQVZCdWZmZXJSZWYgKiAgICAsIGh3X2ZyYW1lc19jdHggICAgICApCisKIHN0YXRpYyBhdl9jb2xkIGludCB2c2lua19pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICpvcGFxdWUpCiB7CiAgICAgQnVmZmVyU2lua0NvbnRleHQgKmJ1ZiA9IGN0eC0+cHJpdjsKQEAgLTQxMyw3ICszMzgsNiBAQAogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtNDI0LDkgKzM0OCw5IEBACiAgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKEJ1ZmZlclNpbmtDb250ZXh0KSwKICAgICAucHJpdl9jbGFzcyAgPSAmYnVmZmVyc2lua19jbGFzcywKICAgICAuaW5pdF9vcGFxdWUgPSB2c2lua19pbml0LAotICAgIC51bmluaXQgICAgICA9IHVuaW5pdCwKIAogICAgIC5xdWVyeV9mb3JtYXRzID0gdnNpbmtfcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgPSBhY3RpdmF0ZSwKICAgICAuaW5wdXRzICAgICAgPSBhdmZpbHRlcl92c2lua19idWZmZXJfaW5wdXRzLAogICAgIC5vdXRwdXRzICAgICA9IE5VTEwsCiB9OwpAQCAtNDM1LDcgKzM1OSw2IEBACiAgICAgewogICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAotICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC00NDYsOSArMzY5LDkgQEAKICAgICAucHJpdl9jbGFzcyAgPSAmYWJ1ZmZlcnNpbmtfY2xhc3MsCiAgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKEJ1ZmZlclNpbmtDb250ZXh0KSwKICAgICAuaW5pdF9vcGFxdWUgPSBhc2lua19pbml0LAotICAgIC51bmluaXQgICAgICA9IHVuaW5pdCwKIAogICAgIC5xdWVyeV9mb3JtYXRzID0gYXNpbmtfcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgPSBhY3RpdmF0ZSwKICAgICAuaW5wdXRzICAgICAgPSBhdmZpbHRlcl9hc2lua19hYnVmZmVyX2lucHV0cywKICAgICAub3V0cHV0cyAgICAgPSBOVUxMLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2J1ZmZlcnNpbmsuaCBiL2xpYmF2ZmlsdGVyL2J1ZmZlcnNpbmsuaAppbmRleCBlMzk5YjkxLi4yMWQ2YmI1IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9idWZmZXJzaW5rLmgKKysrIGIvbGliYXZmaWx0ZXIvYnVmZmVyc2luay5oCkBAIC02Miw3ICs2Miw3IEBACiAvKioKICAqIFN0cnVjdCB0byB1c2UgZm9yIGluaXRpYWxpemluZyBhIGJ1ZmZlcnNpbmsgY29udGV4dC4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQVZCdWZmZXJTaW5rUGFyYW1zIHsKICAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeGVsX2ZtdHM7IC8vLzwgbGlzdCBvZiBhbGxvd2VkIHBpeGVsIGZvcm1hdHMsIHRlcm1pbmF0ZWQgYnkgQVZfUElYX0ZNVF9OT05FCiB9IEFWQnVmZmVyU2lua1BhcmFtczsKIApAQCAtNzYsNyArNzYsNyBAQAogLyoqCiAgKiBTdHJ1Y3QgdG8gdXNlIGZvciBpbml0aWFsaXppbmcgYW4gYWJ1ZmZlcnNpbmsgY29udGV4dC4KICAqLwotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQVZBQnVmZmVyU2lua1BhcmFtcyB7CiAgICAgY29uc3QgZW51bSBBVlNhbXBsZUZvcm1hdCAqc2FtcGxlX2ZtdHM7IC8vLzwgbGlzdCBvZiBhbGxvd2VkIHNhbXBsZSBmb3JtYXRzLCB0ZXJtaW5hdGVkIGJ5IEFWX1NBTVBMRV9GTVRfTk9ORQogICAgIGNvbnN0IGludDY0X3QgKmNoYW5uZWxfbGF5b3V0czsgICAgICAgICAvLy88IGxpc3Qgb2YgYWxsb3dlZCBjaGFubmVsIGxheW91dHMsIHRlcm1pbmF0ZWQgYnkgLTEKICAgICBjb25zdCBpbnQgKmNoYW5uZWxfY291bnRzOyAgICAgICAgICAgICAgLy8vPCBsaXN0IG9mIGFsbG93ZWQgY2hhbm5lbCBjb3VudHMsIHRlcm1pbmF0ZWQgYnkgLTEKQEAgLTEwMSw5ICsxMDEsMjcgQEAKIHZvaWQgYXZfYnVmZmVyc2lua19zZXRfZnJhbWVfc2l6ZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdW5zaWduZWQgZnJhbWVfc2l6ZSk7CiAKIC8qKgotICogR2V0IHRoZSBmcmFtZSByYXRlIG9mIHRoZSBpbnB1dC4KKyAqIEBkZWZncm91cCBsYXZmaV9idWZmZXJzaW5rX2FjY2Vzc29ycyBCdWZmZXIgc2luayBhY2Nlc3NvcnMKKyAqIEdldCB0aGUgcHJvcGVydGllcyBvZiB0aGUgc3RyZWFtCisgKiBAewogICovCi1BVlJhdGlvbmFsIGF2X2J1ZmZlcnNpbmtfZ2V0X2ZyYW1lX3JhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworCitlbnVtIEFWTWVkaWFUeXBlIGF2X2J1ZmZlcnNpbmtfZ2V0X3R5cGUgICAgICAgICAgICAgICAgKGNvbnN0IEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKK0FWUmF0aW9uYWwgICAgICAgYXZfYnVmZmVyc2lua19nZXRfdGltZV9iYXNlICAgICAgICAgICAoY29uc3QgQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworaW50ICAgICAgICAgICAgICBhdl9idWZmZXJzaW5rX2dldF9mb3JtYXQgICAgICAgICAgICAgIChjb25zdCBBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKK0FWUmF0aW9uYWwgICAgICAgYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfcmF0ZSAgICAgICAgICAoY29uc3QgQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworaW50ICAgICAgICAgICAgICBhdl9idWZmZXJzaW5rX2dldF93ICAgICAgICAgICAgICAgICAgIChjb25zdCBBVkZpbHRlckNvbnRleHQgKmN0eCk7CitpbnQgICAgICAgICAgICAgIGF2X2J1ZmZlcnNpbmtfZ2V0X2ggICAgICAgICAgICAgICAgICAgKGNvbnN0IEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKK0FWUmF0aW9uYWwgICAgICAgYXZfYnVmZmVyc2lua19nZXRfc2FtcGxlX2FzcGVjdF9yYXRpbyAoY29uc3QgQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworCitpbnQgICAgICAgICAgICAgIGF2X2J1ZmZlcnNpbmtfZ2V0X2NoYW5uZWxzICAgICAgICAgICAgKGNvbnN0IEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKK3VpbnQ2NF90ICAgICAgICAgYXZfYnVmZmVyc2lua19nZXRfY2hhbm5lbF9sYXlvdXQgICAgICAoY29uc3QgQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworaW50ICAgICAgICAgICAgICBhdl9idWZmZXJzaW5rX2dldF9zYW1wbGVfcmF0ZSAgICAgICAgIChjb25zdCBBVkZpbHRlckNvbnRleHQgKmN0eCk7CisKK0FWQnVmZmVyUmVmICogICAgYXZfYnVmZmVyc2lua19nZXRfaHdfZnJhbWVzX2N0eCAgICAgICAoY29uc3QgQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworCisvKiogQH0gKi8KIAogLyoqCiAgKiBHZXQgYSBmcmFtZSB3aXRoIGZpbHRlcmVkIGRhdGEgZnJvbSBzaW5rIGFuZCBwdXQgaXQgaW4gZnJhbWUuCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9idWZmZXJzcmMuYyBiL2xpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5jCmluZGV4IDM5MjBiMDQuLmNkNTZmOGMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5jCisrKyBiL2xpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5jCkBAIC01NCw2ICs1NCw4IEBACiAgICAgQVZSYXRpb25hbCAgICAgICAgcGl4ZWxfYXNwZWN0OwogICAgIGNoYXIgICAgICAgICAgICAgICpzd3NfcGFyYW07CiAKKyAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eDsKKwogICAgIC8qIGF1ZGlvIG9ubHkgKi8KICAgICBpbnQgc2FtcGxlX3JhdGU7CiAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10OwpAQCAtNjEsNiArNjMsNyBAQAogICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OwogICAgIGNoYXIgICAgKmNoYW5uZWxfbGF5b3V0X3N0cjsKIAorICAgIGludCBnb3RfZm9ybWF0X2Zyb21fcGFyYW1zOwogICAgIGludCBlb2Y7CiB9IEJ1ZmZlclNvdXJjZUNvbnRleHQ7CiAKQEAgLTc2LDYgKzc5LDYyIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7XAogICAgIH0KIAorQVZCdWZmZXJTcmNQYXJhbWV0ZXJzICphdl9idWZmZXJzcmNfcGFyYW1ldGVyc19hbGxvYyh2b2lkKQoreworICAgIEFWQnVmZmVyU3JjUGFyYW1ldGVycyAqcGFyID0gYXZfbWFsbG9jeihzaXplb2YoKnBhcikpOworICAgIGlmICghcGFyKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHBhci0+Zm9ybWF0ID0gLTE7CisKKyAgICByZXR1cm4gcGFyOworfQorCitpbnQgYXZfYnVmZmVyc3JjX3BhcmFtZXRlcnNfc2V0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkJ1ZmZlclNyY1BhcmFtZXRlcnMgKnBhcmFtKQoreworICAgIEJ1ZmZlclNvdXJjZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocGFyYW0tPnRpbWVfYmFzZS5udW0gPiAwICYmIHBhcmFtLT50aW1lX2Jhc2UuZGVuID4gMCkKKyAgICAgICAgcy0+dGltZV9iYXNlID0gcGFyYW0tPnRpbWVfYmFzZTsKKworICAgIHN3aXRjaCAoY3R4LT5maWx0ZXItPm91dHB1dHNbMF0udHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICBpZiAocGFyYW0tPmZvcm1hdCAhPSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgIHMtPmdvdF9mb3JtYXRfZnJvbV9wYXJhbXMgPSAxOworICAgICAgICAgICAgcy0+cGl4X2ZtdCA9IHBhcmFtLT5mb3JtYXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtLT53aWR0aCA+IDApCisgICAgICAgICAgICBzLT53ID0gcGFyYW0tPndpZHRoOworICAgICAgICBpZiAocGFyYW0tPmhlaWdodCA+IDApCisgICAgICAgICAgICBzLT5oID0gcGFyYW0tPmhlaWdodDsKKyAgICAgICAgaWYgKHBhcmFtLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDAgJiYgcGFyYW0tPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID4gMCkKKyAgICAgICAgICAgIHMtPnBpeGVsX2FzcGVjdCA9IHBhcmFtLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICBpZiAocGFyYW0tPmZyYW1lX3JhdGUubnVtID4gMCAmJiBwYXJhbS0+ZnJhbWVfcmF0ZS5kZW4gPiAwKQorICAgICAgICAgICAgcy0+ZnJhbWVfcmF0ZSA9IHBhcmFtLT5mcmFtZV9yYXRlOworICAgICAgICBpZiAocGFyYW0tPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICBzLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihwYXJhbS0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICBpZiAoIXMtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgaWYgKHBhcmFtLT5mb3JtYXQgIT0gQVZfU0FNUExFX0ZNVF9OT05FKSB7CisgICAgICAgICAgICBzLT5nb3RfZm9ybWF0X2Zyb21fcGFyYW1zID0gMTsKKyAgICAgICAgICAgIHMtPnNhbXBsZV9mbXQgPSBwYXJhbS0+Zm9ybWF0OworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbS0+c2FtcGxlX3JhdGUgPiAwKQorICAgICAgICAgICAgcy0+c2FtcGxlX3JhdGUgPSBwYXJhbS0+c2FtcGxlX3JhdGU7CisgICAgICAgIGlmIChwYXJhbS0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgICAgICBzLT5jaGFubmVsX2xheW91dCA9IHBhcmFtLT5jaGFubmVsX2xheW91dDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBpbnQgYXR0cmlidXRlX2FsaWduX2FyZyBhdl9idWZmZXJzcmNfd3JpdGVfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IEFWRnJhbWUgKmZyYW1lKQogewogICAgIHJldHVybiBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKGN0eCwgKEFWRnJhbWUgKilmcmFtZSwKQEAgLTk2LDcgKzE1NSw3IEBACiAgICAgaW50IHJldCA9IDA7CiAKICAgICBpZiAoZnJhbWUgJiYgZnJhbWUtPmNoYW5uZWxfbGF5b3V0ICYmCi0gICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhmcmFtZS0+Y2hhbm5lbF9sYXlvdXQpICE9IGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSkpIHsKKyAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGZyYW1lLT5jaGFubmVsX2xheW91dCkgIT0gZnJhbWUtPmNoYW5uZWxzKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkxheW91dCBpbmRpY2F0ZXMgYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGNoYW5uZWxzIHRoYW4gYWN0dWFsbHkgcHJlc2VudFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQpAQCAtMTE0LDYgKzE3MywyMCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgcHVzaF9mcmFtZShBVkZpbHRlckdyYXBoICpncmFwaCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2dyYXBoX3J1bl9vbmNlKGdyYXBoKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ludGVybmFsKEFWRmlsdGVyQ29udGV4dCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCiB7CkBAIC0xMjMsMTAgKzE5Niw5IEBACiAKICAgICBzLT5uYl9mYWlsZWRfcmVxdWVzdHMgPSAwOwogCi0gICAgaWYgKCFmcmFtZSkgewotICAgICAgICBzLT5lb2YgPSAxOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9IGVsc2UgaWYgKHMtPmVvZikKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm4gYXZfYnVmZmVyc3JjX2Nsb3NlKGN0eCwgQVZfTk9QVFNfVkFMVUUsIGZsYWdzKTsKKyAgICBpZiAocy0+ZW9mKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCiAgICAgcmVmY291bnRlZCA9ICEhZnJhbWUtPmJ1ZlswXTsKQEAgLTE0Myw3ICsyMTUsNyBAQAogICAgICAgICBpZiAoIWZyYW1lLT5jaGFubmVsX2xheW91dCkKICAgICAgICAgICAgIGZyYW1lLT5jaGFubmVsX2xheW91dCA9IHMtPmNoYW5uZWxfbGF5b3V0OwogICAgICAgICBDSEVDS19BVURJT19QQVJBTV9DSEFOR0UoY3R4LCBzLCBmcmFtZS0+c2FtcGxlX3JhdGUsIGZyYW1lLT5jaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSksIGZyYW1lLT5mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmNoYW5uZWxzLCBmcmFtZS0+Zm9ybWF0KTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKQEAgLTE3NiwxOCArMjQ4LDMzIEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgaWYgKChmbGFncyAmIEFWX0JVRkZFUlNSQ19GTEFHX1BVU0gpKQotICAgICAgICBpZiAoKHJldCA9IGN0eC0+b3V0cHV0X3BhZHNbMF0ucmVxdWVzdF9mcmFtZShjdHgtPm91dHB1dHNbMF0pKSA8IDApCisgICAgaWYgKChyZXQgPSBjdHgtPm91dHB1dF9wYWRzWzBdLnJlcXVlc3RfZnJhbWUoY3R4LT5vdXRwdXRzWzBdKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChmbGFncyAmIEFWX0JVRkZFUlNSQ19GTEFHX1BVU0gpKSB7CisgICAgICAgIHJldCA9IHB1c2hfZnJhbWUoY3R4LT5ncmFwaCk7CisgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KIAoraW50IGF2X2J1ZmZlcnNyY19jbG9zZShBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50NjRfdCBwdHMsIHVuc2lnbmVkIGZsYWdzKQoreworICAgIEJ1ZmZlclNvdXJjZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5lb2YgPSAxOworICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X2luX3N0YXR1cyhjdHgtPm91dHB1dHNbMF0sIEFWRVJST1JfRU9GLCBwdHMpOworICAgIHJldHVybiAoZmxhZ3MgJiBBVl9CVUZGRVJTUkNfRkxBR19QVVNIKSA/IHB1c2hfZnJhbWUoY3R4LT5ncmFwaCkgOiAwOworfQorCiBzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF92aWRlbyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBCdWZmZXJTb3VyY2VDb250ZXh0ICpjID0gY3R4LT5wcml2OwogCi0gICAgaWYgKGMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FIHx8ICFjLT53IHx8ICFjLT5oIHx8IGF2X3EyZChjLT50aW1lX2Jhc2UpIDw9IDApIHsKKyAgICBpZiAoIShjLT5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORSB8fCBjLT5nb3RfZm9ybWF0X2Zyb21fcGFyYW1zKSB8fCAhYy0+dyB8fCAhYy0+aCB8fAorICAgICAgICBhdl9xMmQoYy0+dGltZV9iYXNlKSA8PSAwKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFyYW1ldGVycyBwcm92aWRlZC5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KQEAgLTIxNywxNiArMzA0LDggQEAKICAgICB7ICJ2aWRlb19zaXplIiwgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQodyksICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsICAgICAgICAgICAgICAgIC5mbGFncyA9IFYgfSwKICAgICB7ICJoZWlnaHQiLCAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoaCksICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIFYgfSwKICAgICB7ICJwaXhfZm10IiwgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocGl4X2ZtdCksICAgICAgICAgIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCwgeyAuaTY0ID0gQVZfUElYX0ZNVF9OT05FIH0sIC5taW4gPSBBVl9QSVhfRk1UX05PTkUsIC5tYXggPSBJTlRfTUFYLCAuZmxhZ3MgPSBWIH0sCi0jaWYgRkZfQVBJX09MRF9GSUxURVJfT1BUUwotICAgIC8qIHRob3NlIDQgYXJlIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBvcHRpb24gcGFzc2luZyBzeXN0ZW0gd2hlcmUgZWFjaCBmaWx0ZXIKLSAgICAgKiBkaWQgaXRzIG93biBwYXJzaW5nICovCi0gICAgeyAidGltZV9iYXNlX251bSIsICJkZXByZWNhdGVkLCBkbyBub3QgdXNlIiwgT0ZGU0VUKHRpbWVfYmFzZS5udW0pLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWIH0sCi0gICAgeyAidGltZV9iYXNlX2RlbiIsICJkZXByZWNhdGVkLCBkbyBub3QgdXNlIiwgT0ZGU0VUKHRpbWVfYmFzZS5kZW4pLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWIH0sCi0gICAgeyAic2FyX251bSIsICAgICAgICJkZXByZWNhdGVkLCBkbyBub3QgdXNlIiwgT0ZGU0VUKHBpeGVsX2FzcGVjdC5udW0pLCBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWIH0sCi0gICAgeyAic2FyX2RlbiIsICAgICAgICJkZXByZWNhdGVkLCBkbyBub3QgdXNlIiwgT0ZGU0VUKHBpeGVsX2FzcGVjdC5kZW4pLCBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCBWIH0sCi0jZW5kaWYKLSAgICB7ICJzYXIiLCAgICAgICAgICAgInNhbXBsZSBhc3BlY3QgcmF0aW8iLCAgICBPRkZTRVQocGl4ZWxfYXNwZWN0KSwgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7IC5kYmwgPSAxIH0sIDAsIERCTF9NQVgsIFYgfSwKLSAgICB7ICJwaXhlbF9hc3BlY3QiLCAgInNhbXBsZSBhc3BlY3QgcmF0aW8iLCAgICBPRkZTRVQocGl4ZWxfYXNwZWN0KSwgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7IC5kYmwgPSAxIH0sIDAsIERCTF9NQVgsIFYgfSwKKyAgICB7ICJzYXIiLCAgICAgICAgICAgInNhbXBsZSBhc3BlY3QgcmF0aW8iLCAgICBPRkZTRVQocGl4ZWxfYXNwZWN0KSwgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7IC5kYmwgPSAwIH0sIDAsIERCTF9NQVgsIFYgfSwKKyAgICB7ICJwaXhlbF9hc3BlY3QiLCAgInNhbXBsZSBhc3BlY3QgcmF0aW8iLCAgICBPRkZTRVQocGl4ZWxfYXNwZWN0KSwgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7IC5kYmwgPSAwIH0sIDAsIERCTF9NQVgsIFYgfSwKICAgICB7ICJ0aW1lX2Jhc2UiLCAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQodGltZV9iYXNlKSwgICAgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7IC5kYmwgPSAwIH0sIDAsIERCTF9NQVgsIFYgfSwKICAgICB7ICJmcmFtZV9yYXRlIiwgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZnJhbWVfcmF0ZSksICAgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7IC5kYmwgPSAwIH0sIDAsIERCTF9NQVgsIFYgfSwKICAgICB7ICJzd3NfcGFyYW0iLCAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3dzX3BhcmFtKSwgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgICAgICAgICAgICAgICAgICAgIC5mbGFncyA9IFYgfSwKQEAgLTI1MSwxOSArMzMwLDIxIEBACiAgICAgQnVmZmVyU291cmNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKICAgICBpbnQgcmV0ID0gMDsKIAotICAgIGlmIChzLT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfTk9ORSkgeworICAgIGlmICghKHMtPnNhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9OT05FIHx8IHMtPmdvdF9mb3JtYXRfZnJvbV9wYXJhbXMpKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlNhbXBsZSBmb3JtYXQgd2FzIG5vdCBzZXQgb3Igd2FzIGludmFsaWRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIGlmIChzLT5jaGFubmVsX2xheW91dF9zdHIpIHsKKyAgICBpZiAocy0+Y2hhbm5lbF9sYXlvdXRfc3RyIHx8IHMtPmNoYW5uZWxfbGF5b3V0KSB7CiAgICAgICAgIGludCBuOwogCi0gICAgICAgIHMtPmNoYW5uZWxfbGF5b3V0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0KHMtPmNoYW5uZWxfbGF5b3V0X3N0cik7CiAgICAgICAgIGlmICghcy0+Y2hhbm5lbF9sYXlvdXQpIHsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2hhbm5lbCBsYXlvdXQgJXMuXG4iLAotICAgICAgICAgICAgICAgICAgIHMtPmNoYW5uZWxfbGF5b3V0X3N0cik7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgcy0+Y2hhbm5lbF9sYXlvdXQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXQocy0+Y2hhbm5lbF9sYXlvdXRfc3RyKTsKKyAgICAgICAgICAgIGlmICghcy0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNoYW5uZWwgbGF5b3V0ICVzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2hhbm5lbF9sYXlvdXRfc3RyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG4gPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+Y2hhbm5lbF9sYXlvdXQpOwogICAgICAgICBpZiAocy0+Y2hhbm5lbHMpIHsKQEAgLTMwNSw2ICszODYsNyBAQAogICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5maWZvLCAmZnJhbWUsIHNpemVvZihmcmFtZSksIE5VTEwpOwogICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CiAgICAgfQorICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+aHdfZnJhbWVzX2N0eCk7CiAgICAgYXZfZmlmb19mcmVlcCgmcy0+Zmlmbyk7CiB9CiAKQEAgLTM1Miw2ICs0MzQsMTIgQEAKICAgICAgICAgbGluay0+dyA9IGMtPnc7CiAgICAgICAgIGxpbmstPmggPSBjLT5oOwogICAgICAgICBsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYy0+cGl4ZWxfYXNwZWN0OworCisgICAgICAgIGlmIChjLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgICAgICBsaW5rLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihjLT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgICAgIGlmICghbGluay0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgogICAgICAgICBpZiAoIWMtPmNoYW5uZWxfbGF5b3V0KQpAQCAtMzcwLDYgKzQ1OCw3IEBACiB7CiAgICAgQnVmZmVyU291cmNlQ29udGV4dCAqYyA9IGxpbmstPnNyYy0+cHJpdjsKICAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBpbnQgcmV0OwogCiAgICAgaWYgKCFhdl9maWZvX3NpemUoYy0+ZmlmbykpIHsKICAgICAgICAgaWYgKGMtPmVvZikKQEAgLTM3OSw3ICs0NjgsOSBAQAogICAgIH0KICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChjLT5maWZvLCAmZnJhbWUsIHNpemVvZihmcmFtZSksIE5VTEwpOwogCi0gICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShsaW5rLCBmcmFtZSk7CisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGxpbmssIGZyYW1lKTsKKworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcG9sbF9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmspCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9idWZmZXJzcmMuaCBiL2xpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oCmluZGV4IDg0N2MwOTMuLjA2NTIxMTMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oCisrKyBiL2xpYmF2ZmlsdGVyL2J1ZmZlcnNyYy5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjYsNyArMjUsNiBAQAogICogTWVtb3J5IGJ1ZmZlciBzb3VyY2UgQVBJLgogICovCiAKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogCiAvKioKQEAgLTY2LDYgKzY0LDgwIEBACiB1bnNpZ25lZCBhdl9idWZmZXJzcmNfZ2V0X25iX2ZhaWxlZF9yZXF1ZXN0cyhBVkZpbHRlckNvbnRleHQgKmJ1ZmZlcl9zcmMpOwogCiAvKioKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSBwYXJhbWV0ZXJzIGRlc2NyaWJpbmcgdGhlIGZyYW1lcyB0aGF0IHdpbGwgYmUKKyAqIHBhc3NlZCB0byB0aGlzIGZpbHRlci4KKyAqCisgKiBJdCBzaG91bGQgYmUgYWxsb2NhdGVkIHdpdGggYXZfYnVmZmVyc3JjX3BhcmFtZXRlcnNfYWxsb2MoKSBhbmQgZnJlZWQgd2l0aAorICogYXZfZnJlZSgpLiBBbGwgdGhlIGFsbG9jYXRlZCBmaWVsZHMgaW4gaXQgcmVtYWluIG93bmVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWQnVmZmVyU3JjUGFyYW1ldGVycyB7CisgICAgLyoqCisgICAgICogdmlkZW86IHRoZSBwaXhlbCBmb3JtYXQsIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGVudW0gQVZQaXhlbEZvcm1hdAorICAgICAqIGF1ZGlvOiB0aGUgc2FtcGxlIGZvcm1hdCwgdmFsdWUgY29ycmVzcG9uZHMgdG8gZW51bSBBVlNhbXBsZUZvcm1hdAorICAgICAqLworICAgIGludCBmb3JtYXQ7CisgICAgLyoqCisgICAgICogVGhlIHRpbWViYXNlIHRvIGJlIHVzZWQgZm9yIHRoZSB0aW1lc3RhbXBzIG9uIHRoZSBpbnB1dCBmcmFtZXMuCisgICAgICovCisgICAgQVZSYXRpb25hbCB0aW1lX2Jhc2U7CisKKyAgICAvKioKKyAgICAgKiBWaWRlbyBvbmx5LCB0aGUgZGlzcGxheSBkaW1lbnNpb25zIG9mIHRoZSBpbnB1dCBmcmFtZXMuCisgICAgICovCisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisKKyAgICAvKioKKyAgICAgKiBWaWRlbyBvbmx5LCB0aGUgc2FtcGxlIChwaXhlbCkgYXNwZWN0IHJhdGlvLgorICAgICAqLworICAgIEFWUmF0aW9uYWwgc2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgIC8qKgorICAgICAqIFZpZGVvIG9ubHksIHRoZSBmcmFtZSByYXRlIG9mIHRoZSBpbnB1dCB2aWRlby4gVGhpcyBmaWVsZCBtdXN0IG9ubHkgYmUKKyAgICAgKiBzZXQgdG8gYSBub24temVybyB2YWx1ZSBpZiBpbnB1dCBzdHJlYW0gaGFzIGEga25vd24gY29uc3RhbnQgZnJhbWVyYXRlCisgICAgICogYW5kIHNob3VsZCBiZSBsZWZ0IGF0IGl0cyBpbml0aWFsIHZhbHVlIGlmIHRoZSBmcmFtZXJhdGUgaXMgdmFyaWFibGUgb3IKKyAgICAgKiB1bmtub3duLgorICAgICAqLworICAgIEFWUmF0aW9uYWwgZnJhbWVfcmF0ZTsKKworICAgIC8qKgorICAgICAqIFZpZGVvIHdpdGggYSBod2FjY2VsIHBpeGVsIGZvcm1hdCBvbmx5LiBUaGlzIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byBhbgorICAgICAqIEFWSFdGcmFtZXNDb250ZXh0IGluc3RhbmNlIGRlc2NyaWJpbmcgdGhlIGlucHV0IGZyYW1lcy4KKyAgICAgKi8KKyAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eDsKKworICAgIC8qKgorICAgICAqIEF1ZGlvIG9ubHksIHRoZSBhdWRpbyBzYW1wbGluZyByYXRlIGluIHNhbXBsZXMgcGVyIHNlY29uLgorICAgICAqLworICAgIGludCBzYW1wbGVfcmF0ZTsKKworICAgIC8qKgorICAgICAqIEF1ZGlvIG9ubHksIHRoZSBhdWRpbyBjaGFubmVsIGxheW91dAorICAgICAqLworICAgIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworfSBBVkJ1ZmZlclNyY1BhcmFtZXRlcnM7CisKKy8qKgorICogQWxsb2NhdGUgYSBuZXcgQVZCdWZmZXJTcmNQYXJhbWV0ZXJzIGluc3RhbmNlLiBJdCBzaG91bGQgYmUgZnJlZWQgYnkgdGhlCisgKiBjYWxsZXIgd2l0aCBhdl9mcmVlKCkuCisgKi8KK0FWQnVmZmVyU3JjUGFyYW1ldGVycyAqYXZfYnVmZmVyc3JjX3BhcmFtZXRlcnNfYWxsb2Modm9pZCk7CisKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgYnVmZmVyc3JjIG9yIGFidWZmZXJzcmMgZmlsdGVyIHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtZXRlcnMuCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBsYXRlciBjYWxscyBvdmVycmlkZSB0aGUKKyAqIHByZXZpb3VzIG9uZXMuIFNvbWUgb2YgdGhlIHBhcmFtZXRlcnMgbWF5IGFsc28gYmUgc2V0IHRocm91Z2ggQVZPcHRpb25zLCB0aGVuCisgKiB3aGF0ZXZlciBtZXRob2QgaXMgdXNlZCBsYXN0IHRha2VzIHByZWNlZGVuY2UuCisgKgorICogQHBhcmFtIGN0eCBhbiBpbnN0YW5jZSBvZiB0aGUgYnVmZmVyc3JjIG9yIGFidWZmZXJzcmMgZmlsdGVyCisgKiBAcGFyYW0gcGFyYW0gdGhlIHN0cmVhbSBwYXJhbWV0ZXJzLiBUaGUgZnJhbWVzIGxhdGVyIHBhc3NlZCB0byB0aGlzIGZpbHRlcgorICogICAgICAgICAgICAgIG11c3QgY29uZm9ybSB0byB0aG9zZSBwYXJhbWV0ZXJzLiBBbGwgdGhlIGFsbG9jYXRlZCBmaWVsZHMgaW4KKyAqICAgICAgICAgICAgICBwYXJhbSByZW1haW4gb3duZWQgYnkgdGhlIGNhbGxlciwgbGliYXZmaWx0ZXIgd2lsbCBtYWtlIGludGVybmFsCisgKiAgICAgICAgICAgICAgY29waWVzIG9yIHJlZmVyZW5jZXMgd2hlbiBuZWNlc3NhcnkuCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGF2X2J1ZmZlcnNyY19wYXJhbWV0ZXJzX3NldChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZCdWZmZXJTcmNQYXJhbWV0ZXJzICpwYXJhbSk7CisKKy8qKgogICogQWRkIGEgZnJhbWUgdG8gdGhlIGJ1ZmZlciBzb3VyY2UuCiAgKgogICogQHBhcmFtIGN0eCAgIGFuIGluc3RhbmNlIG9mIHRoZSBidWZmZXJzcmMgZmlsdGVyCkBAIC0xMjEsNiArMTkzLDE0IEBACiBpbnQgYXZfYnVmZmVyc3JjX2FkZF9mcmFtZV9mbGFncyhBVkZpbHRlckNvbnRleHQgKmJ1ZmZlcl9zcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKTsKIAorLyoqCisgKiBDbG9zZSB0aGUgYnVmZmVyIHNvdXJjZSBhZnRlciBFT0YuCisgKgorICogVGhpcyBpcyBzaW1pbGFyIHRvIHBhc3NpbmcgTlVMTCB0byBhdl9idWZmZXJzcmNfYWRkX2ZyYW1lX2ZsYWdzKCkKKyAqIGV4Y2VwdCBpdCB0YWtlcyB0aGUgdGltZXN0YW1wIG9mIHRoZSBFT0YsIGkuZS4gdGhlIHRpbWVzdGFtcCBvZiB0aGUgZW5kCisgKiBvZiB0aGUgbGFzdCBmcmFtZS4KKyAqLworaW50IGF2X2J1ZmZlcnNyY19jbG9zZShBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50NjRfdCBwdHMsIHVuc2lnbmVkIGZsYWdzKTsKIAogLyoqCiAgKiBAfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYndkaWYuaCBiL2xpYmF2ZmlsdGVyL2J3ZGlmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI0MmM3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2J3ZGlmLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0JXRElGX0gKKyNkZWZpbmUgQVZGSUxURVJfQldESUZfSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCitlbnVtIEJXRElGTW9kZSB7CisgICAgQldESUZfTU9ERV9TRU5EX0ZSQU1FID0gMCwgLy8vPCBzZW5kIDEgZnJhbWUgZm9yIGVhY2ggZnJhbWUKKyAgICBCV0RJRl9NT0RFX1NFTkRfRklFTEQgPSAxLCAvLy88IHNlbmQgMSBmcmFtZSBmb3IgZWFjaCBmaWVsZAorfTsKKworZW51bSBCV0RJRlBhcml0eSB7CisgICAgQldESUZfUEFSSVRZX1RGRiAgPSAgMCwgLy8vPCB0b3AgZmllbGQgZmlyc3QKKyAgICBCV0RJRl9QQVJJVFlfQkZGICA9ICAxLCAvLy88IGJvdHRvbSBmaWVsZCBmaXJzdAorICAgIEJXRElGX1BBUklUWV9BVVRPID0gLTEsIC8vLzwgYXV0byBkZXRlY3Rpb24KK307CisKK2VudW0gQldESUZEZWludCB7CisgICAgQldESUZfREVJTlRfQUxMICAgICAgICA9IDAsIC8vLzwgZGVpbnRlcmxhY2UgYWxsIGZyYW1lcworICAgIEJXRElGX0RFSU5UX0lOVEVSTEFDRUQgPSAxLCAvLy88IG9ubHkgZGVpbnRlcmxhY2UgZnJhbWVzIG1hcmtlZCBhcyBpbnRlcmxhY2VkCit9OworCit0eXBlZGVmIHN0cnVjdCBCV0RJRkNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgaW50IG1vZGU7ICAgICAgICAgICAvLy88IEJXRElGTW9kZQorICAgIGludCBwYXJpdHk7ICAgICAgICAgLy8vPCBCV0RJRlBhcml0eQorICAgIGludCBkZWludDsgICAgICAgICAgLy8vPCBCV0RJRkRlaW50CisKKyAgICBpbnQgZnJhbWVfcGVuZGluZzsKKworICAgIEFWRnJhbWUgKmN1cjsKKyAgICBBVkZyYW1lICpuZXh0OworICAgIEFWRnJhbWUgKnByZXY7CisgICAgQVZGcmFtZSAqb3V0OworCisgICAgdm9pZCAoKmZpbHRlcl9pbnRyYSkodm9pZCAqZHN0MSwgdm9pZCAqY3VyMSwgaW50IHcsIGludCBwcmVmcywgaW50IG1yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVmczMsIGludCBtcmVmczMsIGludCBwYXJpdHksIGludCBjbGlwX21heCk7CisgICAgdm9pZCAoKmZpbHRlcl9saW5lKSh2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwgdm9pZCAqbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgcHJlZnMsIGludCBtcmVmcywgaW50IHByZWZzMiwgaW50IG1yZWZzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVmczMsIGludCBtcmVmczMsIGludCBwcmVmczQsIGludCBtcmVmczQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyaXR5LCBpbnQgY2xpcF9tYXgpOworICAgIHZvaWQgKCpmaWx0ZXJfZWRnZSkodm9pZCAqZHN0LCB2b2lkICpwcmV2LCB2b2lkICpjdXIsIHZvaWQgKm5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsIGludCBwcmVmczIsIGludCBtcmVmczIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyaXR5LCBpbnQgY2xpcF9tYXgsIGludCBzcGF0KTsKKworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqY3NwOworICAgIGludCBpbnRlcl9maWVsZDsKKyAgICBpbnQgZW9mOworfSBCV0RJRkNvbnRleHQ7CisKK3ZvaWQgZmZfYndkaWZfaW5pdF94ODYoQldESUZDb250ZXh0ICpid2RpZik7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9CV0RJRl9IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9jb2xvcnNwYWNlZHNwLmMgYi9saWJhdmZpbHRlci9jb2xvcnNwYWNlZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhiYTVjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2NvbG9yc3BhY2Vkc3AuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb2xvcnNwYWNlZHNwLmgiCisKKy8qCisgKiBTU19XL0ggc3RhbmRzIGZvciAic3Vic2FtcGxpbmdfdy9oIgorICogaXQncyBhbmFsb2dvdXMgdG8gQVZQaXhGbXREZXNjcmlwdG9yLT5sb2cyX2Nocm9tYV93L2guCisgKi8KKyNkZWZpbmUgU1NfVyAwCisjZGVmaW5lIFNTX0ggMAorCisjZGVmaW5lIEJJVF9ERVBUSCA4CisjaW5jbHVkZSAiY29sb3JzcGFjZWRzcF90ZW1wbGF0ZS5jIgorCisjdW5kZWYgQklUX0RFUFRICisjZGVmaW5lIEJJVF9ERVBUSCAxMAorI2luY2x1ZGUgImNvbG9yc3BhY2Vkc3BfdGVtcGxhdGUuYyIKKworI3VuZGVmIEJJVF9ERVBUSAorI2RlZmluZSBCSVRfREVQVEggMTIKKyNpbmNsdWRlICJjb2xvcnNwYWNlZHNwX3RlbXBsYXRlLmMiCisKKyN1bmRlZiBTU19XCisjdW5kZWYgU1NfSAorCisjZGVmaW5lIFNTX1cgMQorI2RlZmluZSBTU19IIDAKKworI3VuZGVmIEJJVF9ERVBUSAorI2RlZmluZSBCSVRfREVQVEggOAorI2luY2x1ZGUgImNvbG9yc3BhY2Vkc3BfdGVtcGxhdGUuYyIKKworI3VuZGVmIEJJVF9ERVBUSAorI2RlZmluZSBCSVRfREVQVEggMTAKKyNpbmNsdWRlICJjb2xvcnNwYWNlZHNwX3RlbXBsYXRlLmMiCisKKyN1bmRlZiBCSVRfREVQVEgKKyNkZWZpbmUgQklUX0RFUFRIIDEyCisjaW5jbHVkZSAiY29sb3JzcGFjZWRzcF90ZW1wbGF0ZS5jIgorCisjdW5kZWYgU1NfVworI3VuZGVmIFNTX0gKKworI2RlZmluZSBTU19XIDEKKyNkZWZpbmUgU1NfSCAxCisKKyN1bmRlZiBCSVRfREVQVEgKKyNkZWZpbmUgQklUX0RFUFRIIDgKKyNpbmNsdWRlICJjb2xvcnNwYWNlZHNwX3RlbXBsYXRlLmMiCisKKyN1bmRlZiBCSVRfREVQVEgKKyNkZWZpbmUgQklUX0RFUFRIIDEwCisjaW5jbHVkZSAiY29sb3JzcGFjZWRzcF90ZW1wbGF0ZS5jIgorCisjdW5kZWYgQklUX0RFUFRICisjZGVmaW5lIEJJVF9ERVBUSCAxMgorI2luY2x1ZGUgImNvbG9yc3BhY2Vkc3BfdGVtcGxhdGUuYyIKKworc3RhdGljIHZvaWQgbXVsdGlwbHkzeDNfYyhpbnQxNl90ICpidWZbM10sIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgY29uc3QgaW50MTZfdCBtWzNdWzNdWzhdKQoreworICAgIGludCB5LCB4OworICAgIGludDE2X3QgKmJ1ZjAgPSBidWZbMF0sICpidWYxID0gYnVmWzFdLCAqYnVmMiA9IGJ1ZlsyXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaW50IHYwID0gYnVmMFt4XSwgdjEgPSBidWYxW3hdLCB2MiA9IGJ1ZjJbeF07CisKKyAgICAgICAgICAgIGJ1ZjBbeF0gPSBhdl9jbGlwX2ludDE2KChtWzBdWzBdWzBdICogdjAgKyBtWzBdWzFdWzBdICogdjEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1bMF1bMl1bMF0gKiB2MiArIDgxOTIpID4+IDE0KTsKKyAgICAgICAgICAgIGJ1ZjFbeF0gPSBhdl9jbGlwX2ludDE2KChtWzFdWzBdWzBdICogdjAgKyBtWzFdWzFdWzBdICogdjEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1bMV1bMl1bMF0gKiB2MiArIDgxOTIpID4+IDE0KTsKKyAgICAgICAgICAgIGJ1ZjJbeF0gPSBhdl9jbGlwX2ludDE2KChtWzJdWzBdWzBdICogdjAgKyBtWzJdWzFdWzBdICogdjEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1bMl1bMl1bMF0gKiB2MiArIDgxOTIpID4+IDE0KTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZjAgKz0gc3RyaWRlOworICAgICAgICBidWYxICs9IHN0cmlkZTsKKyAgICAgICAgYnVmMiArPSBzdHJpZGU7CisgICAgfQorfQorCit2b2lkIGZmX2NvbG9yc3BhY2Vkc3BfaW5pdChDb2xvclNwYWNlRFNQQ29udGV4dCAqZHNwKQoreworI2RlZmluZSBpbml0X3l1djJyZ2JfZm4oYml0KSBcCisgICAgZHNwLT55dXYycmdiW0JQUF8jI2JpdF1bU1NfNDQ0XSA9IHl1djJyZ2JfNDQ0cCMjYml0IyNfYzsgXAorICAgIGRzcC0+eXV2MnJnYltCUFBfIyNiaXRdW1NTXzQyMl0gPSB5dXYycmdiXzQyMnAjI2JpdCMjX2M7IFwKKyAgICBkc3AtPnl1djJyZ2JbQlBQXyMjYml0XVtTU180MjBdID0geXV2MnJnYl80MjBwIyNiaXQjI19jCisKKyAgICBpbml0X3l1djJyZ2JfZm4oIDgpOworICAgIGluaXRfeXV2MnJnYl9mbigxMCk7CisgICAgaW5pdF95dXYycmdiX2ZuKDEyKTsKKworI2RlZmluZSBpbml0X3JnYjJ5dXZfZm4oYml0KSBcCisgICAgZHNwLT5yZ2IyeXV2W0JQUF8jI2JpdF1bU1NfNDQ0XSA9IHJnYjJ5dXZfNDQ0cCMjYml0IyNfYzsgXAorICAgIGRzcC0+cmdiMnl1dltCUFBfIyNiaXRdW1NTXzQyMl0gPSByZ2IyeXV2XzQyMnAjI2JpdCMjX2M7IFwKKyAgICBkc3AtPnJnYjJ5dXZbQlBQXyMjYml0XVtTU180MjBdID0gcmdiMnl1dl80MjBwIyNiaXQjI19jCisKKyAgICBpbml0X3JnYjJ5dXZfZm4oIDgpOworICAgIGluaXRfcmdiMnl1dl9mbigxMCk7CisgICAgaW5pdF9yZ2IyeXV2X2ZuKDEyKTsKKworI2RlZmluZSBpbml0X3JnYjJ5dXZfZnNiX2ZuKGJpdCkgXAorICAgIGRzcC0+cmdiMnl1dl9mc2JbQlBQXyMjYml0XVtTU180NDRdID0gcmdiMnl1dl9mc2JfNDQ0cCMjYml0IyNfYzsgXAorICAgIGRzcC0+cmdiMnl1dl9mc2JbQlBQXyMjYml0XVtTU180MjJdID0gcmdiMnl1dl9mc2JfNDIycCMjYml0IyNfYzsgXAorICAgIGRzcC0+cmdiMnl1dl9mc2JbQlBQXyMjYml0XVtTU180MjBdID0gcmdiMnl1dl9mc2JfNDIwcCMjYml0IyNfYworCisgICAgaW5pdF9yZ2IyeXV2X2ZzYl9mbiggOCk7CisgICAgaW5pdF9yZ2IyeXV2X2ZzYl9mbigxMCk7CisgICAgaW5pdF9yZ2IyeXV2X2ZzYl9mbigxMik7CisKKyNkZWZpbmUgaW5pdF95dXYyeXV2X2ZuKGlkeDEsIGJpdDEsIGJpdDIpIFwKKyAgICBkc3AtPnl1djJ5dXZbaWR4MV1bQlBQXyMjYml0Ml1bU1NfNDQ0XSA9IHl1djJ5dXZfNDQ0cCMjYml0MSMjdG8jI2JpdDIjI19jOyBcCisgICAgZHNwLT55dXYyeXV2W2lkeDFdW0JQUF8jI2JpdDJdW1NTXzQyMl0gPSB5dXYyeXV2XzQyMnAjI2JpdDEjI3RvIyNiaXQyIyNfYzsgXAorICAgIGRzcC0+eXV2Mnl1dltpZHgxXVtCUFBfIyNiaXQyXVtTU180MjBdID0geXV2Mnl1dl80MjBwIyNiaXQxIyN0byMjYml0MiMjX2MKKyNkZWZpbmUgaW5pdF95dXYyeXV2X2ZucyhiaXQxKSBcCisgICAgaW5pdF95dXYyeXV2X2ZuKEJQUF8jI2JpdDEsIGJpdDEsICA4KTsgXAorICAgIGluaXRfeXV2Mnl1dl9mbihCUFBfIyNiaXQxLCBiaXQxLCAxMCk7IFwKKyAgICBpbml0X3l1djJ5dXZfZm4oQlBQXyMjYml0MSwgYml0MSwgMTIpCisKKyAgICBpbml0X3l1djJ5dXZfZm5zKCA4KTsKKyAgICBpbml0X3l1djJ5dXZfZm5zKDEwKTsKKyAgICBpbml0X3l1djJ5dXZfZm5zKDEyKTsKKworICAgIGRzcC0+bXVsdGlwbHkzeDMgPSBtdWx0aXBseTN4M19jOworCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9jb2xvcnNwYWNlZHNwX3g4Nl9pbml0KGRzcCk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9jb2xvcnNwYWNlZHNwLmggYi9saWJhdmZpbHRlci9jb2xvcnNwYWNlZHNwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxZTRmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2NvbG9yc3BhY2Vkc3AuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9DT0xPUlNQQUNFRFNQX0gKKyNkZWZpbmUgQVZGSUxURVJfQ09MT1JTUEFDRURTUF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiB2b2lkICgqeXV2MnJnYl9mbikoaW50MTZfdCAqcmdiWzNdLCBwdHJkaWZmX3QgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnl1dlszXSwgY29uc3QgcHRyZGlmZl90IHl1dl9zdHJpZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgeXV2MnJnYl9jb2VmZnNbM11bM11bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHl1dl9vZmZzZXRbOF0pOwordHlwZWRlZiB2b2lkICgqcmdiMnl1dl9mbikodWludDhfdCAqeXV2WzNdLCBjb25zdCBwdHJkaWZmX3QgeXV2X3N0cmlkZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnJnYlszXSwgcHRyZGlmZl90IHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgcmdiMnl1dl9jb2VmZnNbM11bM11bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHl1dl9vZmZzZXRbOF0pOwordHlwZWRlZiB2b2lkICgqcmdiMnl1dl9mc2JfZm4pKHVpbnQ4X3QgKnl1dlszXSwgY29uc3QgcHRyZGlmZl90IHl1dl9zdHJpZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqcmdiWzNdLCBwdHJkaWZmX3QgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgcmdiMnl1dl9jb2VmZnNbM11bM11bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCB5dXZfb2Zmc2V0WzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqcm5kWzNdWzJdKTsKK3R5cGVkZWYgdm9pZCAoKnl1djJ5dXZfZm4pKHVpbnQ4X3QgKnl1dl9vdXRbM10sIGNvbnN0IHB0cmRpZmZfdCB5dXZfb3V0X3N0cmlkZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnl1dl9pblszXSwgY29uc3QgcHRyZGlmZl90IHl1dl9pbl9zdHJpZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgeXV2Mnl1dl9jb2VmZnNbM11bM11bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHl1dl9vZmZzZXRbMl1bOF0pOworCitlbnVtIEJpdERlcHRoSW5kZXggeworICAgIEJQUF84LAorICAgIEJQUF8xMCwKKyAgICBCUFBfMTIsCisgICAgTkJfQlBQLAorfTsKKworZW51bSBDaHJvbWFTdWJzYW1wbGluZ0luZGV4IHsKKyAgICBTU180NDQsCisgICAgU1NfNDIyLAorICAgIFNTXzQyMCwKKyAgICBOQl9TUywKK307CisKK3R5cGVkZWYgc3RydWN0IENvbG9yU3BhY2VEU1BDb250ZXh0IHsKKyAgICAvKiBDb252ZXJ0IGlucHV0IFlVViBwaXhlbCBidWZmZXIgZnJvbSBhIHVzZXIgaW50byBhbiBpbnRlcm5hbCwgMTVicHAgYXJyYXkKKyAgICAgKiBvZiBpbnRlcm1lZGlhdGUgUkdCIGRhdGEuICovCisgICAgeXV2MnJnYl9mbiB5dXYycmdiW05CX0JQUF1bTkJfU1NdOworICAgIC8qIENvbnZlcnQgaW50ZXJtZWRpYXRlIFJHQiBkYXRhICgxNWJwcCwgaW50ZXJuYWwgZm9ybWF0KSBpbnRvIFlVViBkYXRhIGFuZAorICAgICAqIHN0b3JlIGludG8gdXNlci1wcm92aWRlZCBvdXRwdXQgYnVmZmVyICovCisgICAgcmdiMnl1dl9mbiByZ2IyeXV2W05CX0JQUF1bTkJfU1NdOworICAgIC8qIFNhbWUgYXMgcmdiMnl1digpLCBidXQgdXNlIGZsb3lkLXN0ZWluYmVyZyBkaXRoZXJpbmcgKi8KKyAgICByZ2IyeXV2X2ZzYl9mbiByZ2IyeXV2X2ZzYltOQl9CUFBdW05CX1NTXTsKKyAgICAvKiBEaXJlY3QgeXV2LXRvLXl1diBjb252ZXJzaW9uIChpbnB1dCBhbmQgb3V0cHV0IGFyZSBib3RoIHVzZXItcHJvdmlkZWQKKyAgICAgKiBidWZmZXJzKSAqLworICAgIHl1djJ5dXZfZm4geXV2Mnl1dltOQl9CUFAgLyogaW4gKi9dW05CX0JQUCAvKiBvdXQgKi9dW05CX1NTXTsKKworICAgIC8qIEluLXBsYWNlIDN4MyBtYXRyaXggbXVsdGlwbGljYXRpb24uIElucHV0IGFuZCBvdXRwdXQgYXJlIGJvdGggMTVicHAKKyAgICAgKiAob3VyIGludGVybmFsIGRhdGEgZm9ybWF0KSAqLworICAgIHZvaWQgKCptdWx0aXBseTN4MykoaW50MTZfdCAqZGF0YVszXSwgcHRyZGlmZl90IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgY29uc3QgaW50MTZfdCBtWzNdWzNdWzhdKTsKK30gQ29sb3JTcGFjZURTUENvbnRleHQ7CisKK3ZvaWQgZmZfY29sb3JzcGFjZWRzcF9pbml0KENvbG9yU3BhY2VEU1BDb250ZXh0ICpkc3ApOworCisvKiBpbnRlcm5hbCAqLwordm9pZCBmZl9jb2xvcnNwYWNlZHNwX3g4Nl9pbml0KENvbG9yU3BhY2VEU1BDb250ZXh0ICpkc3ApOworCisjZW5kaWYgLyogQVZGSUxURVJfQ09MT1JTUEFDRURTUF9IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9jb2xvcnNwYWNlZHNwX3RlbXBsYXRlLmMgYi9saWJhdmZpbHRlci9jb2xvcnNwYWNlZHNwX3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhYzBkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2NvbG9yc3BhY2Vkc3BfdGVtcGxhdGUuYwpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKworI3VuZGVmIGF2ZworI3VuZGVmIHNzCisKKyNpZiBTU19XID09IDAKKyNkZWZpbmUgc3MgNDQ0CisjZGVmaW5lIGF2ZyhhLGIsYyxkKSAoYSkKKyNlbGlmIFNTX0ggPT0gMAorI2RlZmluZSBzcyA0MjIKKyNkZWZpbmUgYXZnKGEsYixjLGQpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKKyNlbHNlCisjZGVmaW5lIHNzIDQyMAorI2RlZmluZSBhdmcoYSxiLGMsZCkgKCgoYSkgKyAoYikgKyAoYykgKyAoZCkgKyAyKSA+PiAyKQorI2VuZGlmCisKKyN1bmRlZiBmbgorI3VuZGVmIGZuMgorI3VuZGVmIGZuMworI2RlZmluZSBmbjMoYSxiLGMpIGEjI18jI2MjI3AjI2IjI19jCisjZGVmaW5lIGZuMihhLGIsYykgZm4zKGEsYixjKQorI2RlZmluZSBmbihhKSBmbjIoYSwgQklUX0RFUFRILCBzcykKKworI3VuZGVmIHBpeGVsCisjdW5kZWYgYXZfY2xpcF9waXhlbAorI2lmIEJJVF9ERVBUSCA9PSA4CisjZGVmaW5lIHBpeGVsIHVpbnQ4X3QKKyNkZWZpbmUgYXZfY2xpcF9waXhlbCh4KSBhdl9jbGlwX3VpbnQ4KHgpCisjZWxzZQorI2RlZmluZSBwaXhlbCB1aW50MTZfdAorI2RlZmluZSBhdl9jbGlwX3BpeGVsKHgpIGF2X2NsaXBfdWludHAyKHgsIEJJVF9ERVBUSCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBmbih5dXYycmdiKShpbnQxNl90ICpyZ2JbM10sIHB0cmRpZmZfdCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqX3l1dlszXSwgY29uc3QgcHRyZGlmZl90IHl1dl9zdHJpZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgeXV2MnJnYl9jb2VmZnNbM11bM11bOF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHl1dl9vZmZzZXRbOF0pCit7CisgICAgcGl4ZWwgKip5dXYgPSAocGl4ZWwgKiopIF95dXY7CisgICAgY29uc3QgcGl4ZWwgKnl1djAgPSB5dXZbMF0sICp5dXYxID0geXV2WzFdLCAqeXV2MiA9IHl1dlsyXTsKKyAgICBpbnQxNl90ICpyZ2IwID0gcmdiWzBdLCAqcmdiMSA9IHJnYlsxXSwgKnJnYjIgPSByZ2JbMl07CisgICAgaW50IHksIHg7CisgICAgaW50IGN5ID0geXV2MnJnYl9jb2VmZnNbMF1bMF1bMF07CisgICAgaW50IGNydiA9IHl1djJyZ2JfY29lZmZzWzBdWzJdWzBdOworICAgIGludCBjZ3UgPSB5dXYycmdiX2NvZWZmc1sxXVsxXVswXTsKKyAgICBpbnQgY2d2ID0geXV2MnJnYl9jb2VmZnNbMV1bMl1bMF07CisgICAgaW50IGNidSA9IHl1djJyZ2JfY29lZmZzWzJdWzFdWzBdOworICAgIGNvbnN0IGludCBzaCA9IEJJVF9ERVBUSCAtIDEsIHJuZCA9IDEgPDwgKHNoIC0gMSk7CisgICAgY29uc3QgaW50IHV2X29mZnNldCA9IDEyOCA8PCAoQklUX0RFUFRIIC0gOCk7CisKKyAgICBhdl9hc3NlcnQyKHl1djJyZ2JfY29lZmZzWzBdWzFdWzBdID09IDApOworICAgIGF2X2Fzc2VydDIoeXV2MnJnYl9jb2VmZnNbMl1bMl1bMF0gPT0gMCk7CisgICAgYXZfYXNzZXJ0Mih5dXYycmdiX2NvZWZmc1sxXVswXVswXSA9PSBjeSAmJiB5dXYycmdiX2NvZWZmc1syXVswXVswXSA9PSBjeSk7CisKKyAgICB3ID0gQVZfQ0VJTF9SU0hJRlQodywgU1NfVyk7CisgICAgaCA9IEFWX0NFSUxfUlNISUZUKGgsIFNTX0gpOworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaW50IHkwMCA9IHl1djBbeCA8PCBTU19XXSAtIHl1dl9vZmZzZXRbMF07CisjaWYgU1NfVyA9PSAxCisgICAgICAgICAgICBpbnQgeTAxID0geXV2MFsyICogeCArIDFdIC0geXV2X29mZnNldFswXTsKKyNpZiBTU19IID09IDEKKyAgICAgICAgICAgIGludCB5MTAgPSB5dXYwW3l1dl9zdHJpZGVbMF0gLyBzaXplb2YocGl4ZWwpICsgMiAqIHhdIC0geXV2X29mZnNldFswXTsKKyAgICAgICAgICAgIGludCB5MTEgPSB5dXYwW3l1dl9zdHJpZGVbMF0gLyBzaXplb2YocGl4ZWwpICsgMiAqIHggKyAxXSAtIHl1dl9vZmZzZXRbMF07CisjZW5kaWYKKyNlbmRpZgorICAgICAgICAgICAgaW50IHUgPSB5dXYxW3hdIC0gdXZfb2Zmc2V0LCB2ID0geXV2Mlt4XSAtIHV2X29mZnNldDsKKworICAgICAgICAgICAgcmdiMFt4IDw8IFNTX1ddICAgICAgICAgICAgICA9IGF2X2NsaXBfaW50MTYoKHkwMCAqIGN5ICsgY3J2ICogdiArIHJuZCkgPj4gc2gpOworI2lmIFNTX1cgPT0gMQorICAgICAgICAgICAgcmdiMFsyICogeCArIDFdICAgICAgICAgICAgICA9IGF2X2NsaXBfaW50MTYoKHkwMSAqIGN5ICsgY3J2ICogdiArIHJuZCkgPj4gc2gpOworI2lmIFNTX0ggPT0gMQorICAgICAgICAgICAgcmdiMFsyICogeCArIHJnYl9zdHJpZGVdICAgICA9IGF2X2NsaXBfaW50MTYoKHkxMCAqIGN5ICsgY3J2ICogdiArIHJuZCkgPj4gc2gpOworICAgICAgICAgICAgcmdiMFsyICogeCArIHJnYl9zdHJpZGUgKyAxXSA9IGF2X2NsaXBfaW50MTYoKHkxMSAqIGN5ICsgY3J2ICogdiArIHJuZCkgPj4gc2gpOworI2VuZGlmCisjZW5kaWYKKworICAgICAgICAgICAgcmdiMVt4IDw8IFNTX1ddICAgICAgICAgICAgICA9IGF2X2NsaXBfaW50MTYoKHkwMCAqIGN5ICsgY2d1ICogdSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2d2ICogdiArIHJuZCkgPj4gc2gpOworI2lmIFNTX1cgPT0gMQorICAgICAgICAgICAgcmdiMVsyICogeCArIDFdICAgICAgICAgICAgICA9IGF2X2NsaXBfaW50MTYoKHkwMSAqIGN5ICsgY2d1ICogdSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2d2ICogdiArIHJuZCkgPj4gc2gpOworI2lmIFNTX0ggPT0gMQorICAgICAgICAgICAgcmdiMVsyICogeCArIHJnYl9zdHJpZGVdICAgICA9IGF2X2NsaXBfaW50MTYoKHkxMCAqIGN5ICsgY2d1ICogdSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2d2ICogdiArIHJuZCkgPj4gc2gpOworICAgICAgICAgICAgcmdiMVsyICogeCArIHJnYl9zdHJpZGUgKyAxXSA9IGF2X2NsaXBfaW50MTYoKHkxMSAqIGN5ICsgY2d1ICogdSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2d2ICogdiArIHJuZCkgPj4gc2gpOworI2VuZGlmCisjZW5kaWYKKworICAgICAgICAgICAgcmdiMlt4IDw8IFNTX1ddICAgICAgICAgICAgICA9IGF2X2NsaXBfaW50MTYoKHkwMCAqIGN5ICsgY2J1ICogdSArIHJuZCkgPj4gc2gpOworI2lmIFNTX1cgPT0gMQorICAgICAgICAgICAgcmdiMlsyICogeCArIDFdICAgICAgICAgICAgICA9IGF2X2NsaXBfaW50MTYoKHkwMSAqIGN5ICsgY2J1ICogdSArIHJuZCkgPj4gc2gpOworI2lmIFNTX0ggPT0gMQorICAgICAgICAgICAgcmdiMlsyICogeCArIHJnYl9zdHJpZGVdICAgICA9IGF2X2NsaXBfaW50MTYoKHkxMCAqIGN5ICsgY2J1ICogdSArIHJuZCkgPj4gc2gpOworICAgICAgICAgICAgcmdiMlsyICogeCArIHJnYl9zdHJpZGUgKyAxXSA9IGF2X2NsaXBfaW50MTYoKHkxMSAqIGN5ICsgY2J1ICogdSArIHJuZCkgPj4gc2gpOworI2VuZGlmCisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIHl1djAgKz0gKHl1dl9zdHJpZGVbMF0gKiAoMSA8PCBTU19IKSkgLyBzaXplb2YocGl4ZWwpOworICAgICAgICB5dXYxICs9IHl1dl9zdHJpZGVbMV0gLyBzaXplb2YocGl4ZWwpOworICAgICAgICB5dXYyICs9IHl1dl9zdHJpZGVbMl0gLyBzaXplb2YocGl4ZWwpOworICAgICAgICByZ2IwICs9IHJnYl9zdHJpZGUgKiAoMSA8PCBTU19IKTsKKyAgICAgICAgcmdiMSArPSByZ2Jfc3RyaWRlICogKDEgPDwgU1NfSCk7CisgICAgICAgIHJnYjIgKz0gcmdiX3N0cmlkZSAqICgxIDw8IFNTX0gpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZm4ocmdiMnl1dikodWludDhfdCAqX3l1dlszXSwgY29uc3QgcHRyZGlmZl90IHl1dl9zdHJpZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpyZ2JbM10sIHB0cmRpZmZfdCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBjb25zdCBpbnQxNl90IHJnYjJ5dXZfY29lZmZzWzNdWzNdWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCB5dXZfb2Zmc2V0WzhdKQoreworICAgIHBpeGVsICoqeXV2ID0gKHBpeGVsICoqKSBfeXV2OworICAgIHBpeGVsICp5dXYwID0geXV2WzBdLCAqeXV2MSA9IHl1dlsxXSwgKnl1djIgPSB5dXZbMl07CisgICAgY29uc3QgaW50MTZfdCAqcmdiMCA9IHJnYlswXSwgKnJnYjEgPSByZ2JbMV0sICpyZ2IyID0gcmdiWzJdOworICAgIGludCB5LCB4OworICAgIGNvbnN0IGludCBzaCA9IDI5IC0gQklUX0RFUFRIOworICAgIGNvbnN0IGludCBybmQgPSAxIDw8IChzaCAtIDEpOworICAgIGludCBjcnkgPSByZ2IyeXV2X2NvZWZmc1swXVswXVswXTsKKyAgICBpbnQgY2d5ID0gcmdiMnl1dl9jb2VmZnNbMF1bMV1bMF07CisgICAgaW50IGNieSA9IHJnYjJ5dXZfY29lZmZzWzBdWzJdWzBdOworICAgIGludCBjcnUgPSByZ2IyeXV2X2NvZWZmc1sxXVswXVswXTsKKyAgICBpbnQgY2d1ID0gcmdiMnl1dl9jb2VmZnNbMV1bMV1bMF07CisgICAgaW50IGNidXJ2ID0gcmdiMnl1dl9jb2VmZnNbMV1bMl1bMF07CisgICAgaW50IGNndiA9IHJnYjJ5dXZfY29lZmZzWzJdWzFdWzBdOworICAgIGludCBjYnYgPSByZ2IyeXV2X2NvZWZmc1syXVsyXVswXTsKKyAgICBwdHJkaWZmX3QgczAgPSB5dXZfc3RyaWRlWzBdIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gMTI4IDw8IChCSVRfREVQVEggLSA4KTsKKworICAgIGF2X2Fzc2VydDIocmdiMnl1dl9jb2VmZnNbMV1bMl1bMF0gPT0gcmdiMnl1dl9jb2VmZnNbMl1bMF1bMF0pOworICAgIHcgPSBBVl9DRUlMX1JTSElGVCh3LCBTU19XKTsKKyAgICBoID0gQVZfQ0VJTF9SU0hJRlQoaCwgU1NfSCk7CisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBpbnQgcjAwID0gcmdiMFt4IDw8IFNTX1ddLCBnMDAgPSByZ2IxW3ggPDwgU1NfV10sIGIwMCA9IHJnYjJbeCA8PCBTU19XXTsKKyNpZiBTU19XID09IDEKKyAgICAgICAgICAgIGludCByMDEgPSByZ2IwW3ggKiAyICsgMV0sIGcwMSA9IHJnYjFbeCAqIDIgKyAxXSwgYjAxID0gcmdiMlt4ICogMiArIDFdOworI2lmIFNTX0ggPT0gMQorICAgICAgICAgICAgaW50IHIxMCA9IHJnYjBbeCAqIDIgKyAwICsgc10sIGcxMCA9IHJnYjFbeCAqIDIgKyAwICsgc10sIGIxMCA9IHJnYjJbeCAqIDIgKyAwICsgc107CisgICAgICAgICAgICBpbnQgcjExID0gcmdiMFt4ICogMiArIDEgKyBzXSwgZzExID0gcmdiMVt4ICogMiArIDEgKyBzXSwgYjExID0gcmdiMlt4ICogMiArIDEgKyBzXTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICAgICAgICAgIHl1djBbeCA8PCBTU19XXSAgICAgID0gYXZfY2xpcF9waXhlbCh5dXZfb2Zmc2V0WzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHIwMCAqIGNyeSArIGcwMCAqIGNneSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMDAgKiBjYnkgKyBybmQpID4+IHNoKSk7CisjaWYgU1NfVyA9PSAxCisgICAgICAgICAgICB5dXYwW3ggKiAyICsgMV0gICAgICA9IGF2X2NsaXBfcGl4ZWwoeXV2X29mZnNldFswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyMDEgKiBjcnkgKyBnMDEgKiBjZ3kgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjAxICogY2J5ICsgcm5kKSA+PiBzaCkpOworI2lmIFNTX0ggPT0gMQorICAgICAgICAgICAgeXV2MFt4ICogMiArIDAgKyBzMF0gPSBhdl9jbGlwX3BpeGVsKHl1dl9vZmZzZXRbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocjEwICogY3J5ICsgZzEwICogY2d5ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIxMCAqIGNieSArIHJuZCkgPj4gc2gpKTsKKyAgICAgICAgICAgIHl1djBbeCAqIDIgKyAxICsgczBdID0gYXZfY2xpcF9waXhlbCh5dXZfb2Zmc2V0WzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHIxMSAqIGNyeSArIGcxMSAqIGNneSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiMTEgKiBjYnkgKyBybmQpID4+IHNoKSk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgICAgICAgICB5dXYxW3hdICAgICAgPSBhdl9jbGlwX3BpeGVsKHV2X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYXZnKHIwMCwgcjAxLCByMTAsIHIxMSkgKiBjcnUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZyhnMDAsIGcwMSwgZzEwLCBnMTEpICogY2d1ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcoYjAwLCBiMDEsIGIxMCwgYjExKSAqIGNidXJ2ICsgcm5kKSA+PiBzaCkpOworICAgICAgICAgICAgeXV2Mlt4XSAgICAgID0gYXZfY2xpcF9waXhlbCh1dl9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGF2ZyhyMDAsIHIwMSwgcjEwLCByMTEpICogY2J1cnYgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZyhnMDAsIGcwMSwgZzEwLCBnMTEpICogY2d2ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmcoYjAwLCBiMDEsIGIxMCwgYjExKSAqIGNidiArIHJuZCkgPj4gc2gpKTsKKyAgICAgICAgfQorCisgICAgICAgIHl1djAgKz0gczAgKiAoMSA8PCBTU19IKTsKKyAgICAgICAgeXV2MSArPSB5dXZfc3RyaWRlWzFdIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICAgICAgeXV2MiArPSB5dXZfc3RyaWRlWzJdIC8gc2l6ZW9mKHBpeGVsKTsKKyAgICAgICAgcmdiMCArPSBzICogKDEgPDwgU1NfSCk7CisgICAgICAgIHJnYjEgKz0gcyAqICgxIDw8IFNTX0gpOworICAgICAgICByZ2IyICs9IHMgKiAoMSA8PCBTU19IKTsKKyAgICB9Cit9CisKKy8qIGZsb3lkLXN0ZWluYmVyZyBkaXRoZXJpbmcgLSBmb3IgYW55IG1pZC10b3AgcGl4ZWwgQSBpbiBhIDN4MiBibG9jayBvZiBwaXhlbHM6CisgKiAgICAxIEEgMgorICogICAgMyA0IDUKKyAqIHRoZSByb3VuZGluZyBlcnJvciBpcyBkaXN0cmlidXRlZCBvdmVyIHRoZSBuZWlnaGJvdXJpbmcgcGl4ZWxzOgorICogICAgMjogNy8xNnRoLCAzOiAzLzE2dGgsIDQ6IDUvMTZ0aCBhbmQgNTogMS8xNnRoCisgKi8KK3N0YXRpYyB2b2lkIGZuKHJnYjJ5dXZfZnNiKSh1aW50OF90ICpfeXV2WzNdLCBjb25zdCBwdHJkaWZmX3QgeXV2X3N0cmlkZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpyZ2JbM10sIHB0cmRpZmZfdCBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgY29uc3QgaW50MTZfdCByZ2IyeXV2X2NvZWZmc1szXVszXVs4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHl1dl9vZmZzZXRbOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpybmRfc2NyYXRjaFszXVsyXSkKK3sKKyAgICBwaXhlbCAqKnl1diA9IChwaXhlbCAqKikgX3l1djsKKyAgICBwaXhlbCAqeXV2MCA9IHl1dlswXSwgKnl1djEgPSB5dXZbMV0sICp5dXYyID0geXV2WzJdOworICAgIGNvbnN0IGludDE2X3QgKnJnYjAgPSByZ2JbMF0sICpyZ2IxID0gcmdiWzFdLCAqcmdiMiA9IHJnYlsyXTsKKyAgICBpbnQgeSwgeDsKKyAgICBjb25zdCBpbnQgc2ggPSAyOSAtIEJJVF9ERVBUSDsKKyAgICBjb25zdCBpbnQgcm5kID0gMSA8PCAoc2ggLSAxKTsKKyAgICBpbnQgY3J5ID0gcmdiMnl1dl9jb2VmZnNbMF1bMF1bMF07CisgICAgaW50IGNneSA9IHJnYjJ5dXZfY29lZmZzWzBdWzFdWzBdOworICAgIGludCBjYnkgPSByZ2IyeXV2X2NvZWZmc1swXVsyXVswXTsKKyAgICBpbnQgY3J1ID0gcmdiMnl1dl9jb2VmZnNbMV1bMF1bMF07CisgICAgaW50IGNndSA9IHJnYjJ5dXZfY29lZmZzWzFdWzFdWzBdOworICAgIGludCBjYnVydiA9IHJnYjJ5dXZfY29lZmZzWzFdWzJdWzBdOworICAgIGludCBjZ3YgPSByZ2IyeXV2X2NvZWZmc1syXVsxXVswXTsKKyAgICBpbnQgY2J2ID0gcmdiMnl1dl9jb2VmZnNbMl1bMl1bMF07CisgICAgcHRyZGlmZl90IHMwID0geXV2X3N0cmlkZVswXSAvIHNpemVvZihwaXhlbCk7CisgICAgY29uc3QgaW50IHV2X29mZnNldCA9IDEyOCA8PCAoQklUX0RFUFRIIC0gOCk7CisgICAgdW5zaWduZWQgbWFzayA9ICgxIDw8IHNoKSAtIDE7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIHJuZF9zY3JhdGNoWzBdWzBdW3hdID0KKyAgICAgICAgcm5kX3NjcmF0Y2hbMF1bMV1beF0gPSBybmQ7CisgICAgfQorICAgIGF2X2Fzc2VydDIocmdiMnl1dl9jb2VmZnNbMV1bMl1bMF0gPT0gcmdiMnl1dl9jb2VmZnNbMl1bMF1bMF0pOworICAgIHcgPSBBVl9DRUlMX1JTSElGVCh3LCBTU19XKTsKKyAgICBoID0gQVZfQ0VJTF9SU0hJRlQoaCwgU1NfSCk7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICBybmRfc2NyYXRjaFsxXVswXVt4XSA9CisgICAgICAgIHJuZF9zY3JhdGNoWzFdWzFdW3hdID0KKyAgICAgICAgcm5kX3NjcmF0Y2hbMl1bMF1beF0gPQorICAgICAgICBybmRfc2NyYXRjaFsyXVsxXVt4XSA9IHJuZDsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBpbnQgcjAwID0gcmdiMFt4IDw8IFNTX1ddLCBnMDAgPSByZ2IxW3ggPDwgU1NfV10sIGIwMCA9IHJnYjJbeCA8PCBTU19XXTsKKyAgICAgICAgICAgIGludCB5MDA7CisjaWYgU1NfVyA9PSAxCisgICAgICAgICAgICBpbnQgcjAxID0gcmdiMFt4ICogMiArIDFdLCBnMDEgPSByZ2IxW3ggKiAyICsgMV0sIGIwMSA9IHJnYjJbeCAqIDIgKyAxXTsKKyAgICAgICAgICAgIGludCB5MDE7CisjaWYgU1NfSCA9PSAxCisgICAgICAgICAgICBpbnQgcjEwID0gcmdiMFt4ICogMiArIDAgKyBzXSwgZzEwID0gcmdiMVt4ICogMiArIDAgKyBzXSwgYjEwID0gcmdiMlt4ICogMiArIDAgKyBzXTsKKyAgICAgICAgICAgIGludCByMTEgPSByZ2IwW3ggKiAyICsgMSArIHNdLCBnMTEgPSByZ2IxW3ggKiAyICsgMSArIHNdLCBiMTEgPSByZ2IyW3ggKiAyICsgMSArIHNdOworICAgICAgICAgICAgaW50IHkxMCwgeTExOworI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgIGludCB1LCB2LCBkaWZmOworCisgICAgICAgICAgICB5MDAgPSByMDAgKiBjcnkgKyBnMDAgKiBjZ3kgKyBiMDAgKiBjYnkgKyBybmRfc2NyYXRjaFswXVt5ICYgIVNTX0hdW3ggPDwgU1NfV107CisgICAgICAgICAgICBkaWZmID0gKHkwMCAmIG1hc2spIC0gcm5kOworICAgICAgICAgICAgeXV2MFt4IDw8IFNTX1ddICAgICAgPSBhdl9jbGlwX3BpeGVsKHl1dl9vZmZzZXRbMF0gKyAoeTAwID4+IHNoKSk7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVsgKHkgJiAhU1NfSCldWyh4IDw8IFNTX1cpICsgMV0gKz0gKGRpZmYgKiA3ICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzBdWyEoeSAmICFTU19IKV1bKHggPDwgU1NfVykgLSAxXSArPSAoZGlmZiAqIDMgKyA4KSA+PiA0OworICAgICAgICAgICAgcm5kX3NjcmF0Y2hbMF1bISh5ICYgIVNTX0gpXVsoeCA8PCBTU19XKSArIDBdICs9IChkaWZmICogNSArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVshKHkgJiAhU1NfSCldWyh4IDw8IFNTX1cpICsgMV0gKz0gKGRpZmYgKiAxICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzBdWyAoeSAmICFTU19IKV1bKHggPDwgU1NfVykgKyAwXSAgPSBybmQ7CisjaWYgU1NfVyA9PSAxCisgICAgICAgICAgICB5MDEgPSByMDEgKiBjcnkgKyBnMDEgKiBjZ3kgKyBiMDEgKiBjYnkgKyBybmRfc2NyYXRjaFswXVt5ICYgIVNTX0hdW3ggKiAyICsgMV07CisgICAgICAgICAgICBkaWZmID0gKHkwMSAmIG1hc2spIC0gcm5kOworICAgICAgICAgICAgeXV2MFt4ICogMiArIDFdICAgICAgPSBhdl9jbGlwX3BpeGVsKHl1dl9vZmZzZXRbMF0gKyAoeTAxID4+IHNoKSk7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVsgKHkgJiAhU1NfSCldW3ggKiAyICsgMl0gKz0gKGRpZmYgKiA3ICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzBdWyEoeSAmICFTU19IKV1beCAqIDIgKyAwXSArPSAoZGlmZiAqIDMgKyA4KSA+PiA0OworICAgICAgICAgICAgcm5kX3NjcmF0Y2hbMF1bISh5ICYgIVNTX0gpXVt4ICogMiArIDFdICs9IChkaWZmICogNSArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVshKHkgJiAhU1NfSCldW3ggKiAyICsgMl0gKz0gKGRpZmYgKiAxICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzBdWyAoeSAmICFTU19IKV1beCAqIDIgKyAxXSAgPSBybmQ7CisjaWYgU1NfSCA9PSAxCisgICAgICAgICAgICB5MTAgPSByMTAgKiBjcnkgKyBnMTAgKiBjZ3kgKyBiMTAgKiBjYnkgKyBybmRfc2NyYXRjaFswXVsxXVt4ICogMiArIDBdOworICAgICAgICAgICAgZGlmZiA9ICh5MTAgJiBtYXNrKSAtIHJuZDsKKyAgICAgICAgICAgIHl1djBbeCAqIDIgKyAwICsgczBdID0gYXZfY2xpcF9waXhlbCh5dXZfb2Zmc2V0WzBdICsgKHkxMCA+PiBzaCkpOworICAgICAgICAgICAgcm5kX3NjcmF0Y2hbMF1bMV1beCAqIDIgKyAxXSArPSAoZGlmZiAqIDcgKyA4KSA+PiA0OworICAgICAgICAgICAgcm5kX3NjcmF0Y2hbMF1bMF1beCAqIDIgLSAxXSArPSAoZGlmZiAqIDMgKyA4KSA+PiA0OworICAgICAgICAgICAgcm5kX3NjcmF0Y2hbMF1bMF1beCAqIDIgKyAwXSArPSAoZGlmZiAqIDUgKyA4KSA+PiA0OworICAgICAgICAgICAgcm5kX3NjcmF0Y2hbMF1bMF1beCAqIDIgKyAxXSArPSAoZGlmZiAqIDEgKyA4KSA+PiA0OworICAgICAgICAgICAgcm5kX3NjcmF0Y2hbMF1bMV1beCAqIDIgKyAwXSAgPSBybmQ7CisKKyAgICAgICAgICAgIHkxMSA9IHIxMSAqIGNyeSArIGcxMSAqIGNneSArIGIxMSAqIGNieSArIHJuZF9zY3JhdGNoWzBdWzFdW3ggKiAyICsgMV07CisgICAgICAgICAgICBkaWZmID0gKHkxMSAmIG1hc2spIC0gcm5kOworICAgICAgICAgICAgeXV2MFt4ICogMiArIDEgKyBzMF0gPSBhdl9jbGlwX3BpeGVsKHl1dl9vZmZzZXRbMF0gKyAoeTExID4+IHNoKSk7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVsxXVt4ICogMiArIDJdICs9IChkaWZmICogNyArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVswXVt4ICogMiArIDBdICs9IChkaWZmICogMyArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVswXVt4ICogMiArIDFdICs9IChkaWZmICogNSArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVswXVt4ICogMiArIDJdICs9IChkaWZmICogMSArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFswXVsxXVt4ICogMiArIDFdICA9IHJuZDsKKyNlbmRpZgorI2VuZGlmCisKKyAgICAgICAgICAgIHUgPSBhdmcocjAwLCByMDEsIHIxMCwgcjExKSAqIGNydSArCisgICAgICAgICAgICAgICAgYXZnKGcwMCwgZzAxLCBnMTAsIGcxMSkgKiBjZ3UgKworICAgICAgICAgICAgICAgIGF2ZyhiMDAsIGIwMSwgYjEwLCBiMTEpICogY2J1cnYgKyBybmRfc2NyYXRjaFsxXVt5ICYgMV1beF07CisgICAgICAgICAgICBkaWZmID0gKHUgJiBtYXNrKSAtIHJuZDsKKyAgICAgICAgICAgIHl1djFbeF0gPSBhdl9jbGlwX3BpeGVsKHV2X29mZnNldCArICh1ID4+IHNoKSk7CisgICAgICAgICAgICBybmRfc2NyYXRjaFsxXVsgKHkgJiAxKV1beCArIDFdICs9IChkaWZmICogNyArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFsxXVshKHkgJiAxKV1beCAtIDFdICs9IChkaWZmICogMyArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFsxXVshKHkgJiAxKV1beCArIDBdICs9IChkaWZmICogNSArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFsxXVshKHkgJiAxKV1beCArIDFdICs9IChkaWZmICogMSArIDgpID4+IDQ7CisgICAgICAgICAgICBybmRfc2NyYXRjaFsxXVsgKHkgJiAxKV1beCArIDBdICA9IHJuZDsKKworICAgICAgICAgICAgdiA9IGF2ZyhyMDAsIHIwMSwgcjEwLCByMTEpICogY2J1cnYgKworICAgICAgICAgICAgICAgIGF2ZyhnMDAsIGcwMSwgZzEwLCBnMTEpICogY2d2ICsKKyAgICAgICAgICAgICAgICBhdmcoYjAwLCBiMDEsIGIxMCwgYjExKSAqIGNidiArIHJuZF9zY3JhdGNoWzJdW3kgJiAxXVt4XTsKKyAgICAgICAgICAgIGRpZmYgPSAodiAmIG1hc2spIC0gcm5kOworICAgICAgICAgICAgeXV2Mlt4XSA9IGF2X2NsaXBfcGl4ZWwodXZfb2Zmc2V0ICsgKHYgPj4gc2gpKTsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzJdWyAoeSAmIDEpXVt4ICsgMV0gKz0gKGRpZmYgKiA3ICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzJdWyEoeSAmIDEpXVt4IC0gMV0gKz0gKGRpZmYgKiAzICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzJdWyEoeSAmIDEpXVt4ICsgMF0gKz0gKGRpZmYgKiA1ICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzJdWyEoeSAmIDEpXVt4ICsgMV0gKz0gKGRpZmYgKiAxICsgOCkgPj4gNDsKKyAgICAgICAgICAgIHJuZF9zY3JhdGNoWzJdWyAoeSAmIDEpXVt4ICsgMF0gID0gcm5kOworICAgICAgICB9CisKKyAgICAgICAgeXV2MCArPSBzMCAqICgxIDw8IFNTX0gpOworICAgICAgICB5dXYxICs9IHl1dl9zdHJpZGVbMV0gLyBzaXplb2YocGl4ZWwpOworICAgICAgICB5dXYyICs9IHl1dl9zdHJpZGVbMl0gLyBzaXplb2YocGl4ZWwpOworICAgICAgICByZ2IwICs9IHMgKiAoMSA8PCBTU19IKTsKKyAgICAgICAgcmdiMSArPSBzICogKDEgPDwgU1NfSCk7CisgICAgICAgIHJnYjIgKz0gcyAqICgxIDw8IFNTX0gpOworICAgIH0KK30KKworI3VuZGVmIElOX0JJVF9ERVBUSAorI3VuZGVmIE9VVF9CSVRfREVQVEgKKyNkZWZpbmUgT1VUX0JJVF9ERVBUSCBCSVRfREVQVEgKKyNkZWZpbmUgSU5fQklUX0RFUFRIIDgKKyNpbmNsdWRlICJjb2xvcnNwYWNlZHNwX3l1djJ5dXZfdGVtcGxhdGUuYyIKKworI3VuZGVmIElOX0JJVF9ERVBUSAorI2RlZmluZSBJTl9CSVRfREVQVEggMTAKKyNpbmNsdWRlICJjb2xvcnNwYWNlZHNwX3l1djJ5dXZfdGVtcGxhdGUuYyIKKworI3VuZGVmIElOX0JJVF9ERVBUSAorI2RlZmluZSBJTl9CSVRfREVQVEggMTIKKyNpbmNsdWRlICJjb2xvcnNwYWNlZHNwX3l1djJ5dXZfdGVtcGxhdGUuYyIKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2NvbG9yc3BhY2Vkc3BfeXV2Mnl1dl90ZW1wbGF0ZS5jIGIvbGliYXZmaWx0ZXIvY29sb3JzcGFjZWRzcF95dXYyeXV2X3RlbXBsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhZTM4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2NvbG9yc3BhY2Vkc3BfeXV2Mnl1dl90ZW1wbGF0ZS5jCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKyN1bmRlZiBvcGl4ZWwKKyNkZWZpbmUgb3BpeGVsIHBpeGVsCisKKyN1bmRlZiBpcGl4ZWwKKyNpZiBJTl9CSVRfREVQVEggPT0gOAorI2RlZmluZSBpcGl4ZWwgdWludDhfdAorI2Vsc2UKKyNkZWZpbmUgaXBpeGVsIHVpbnQxNl90CisjZW5kaWYKKworI3VuZGVmIGZuCisjdW5kZWYgZm4yCisjdW5kZWYgZm4zCisjZGVmaW5lIGZuMyhhLGIsYyxkKSBhIyNfIyNkIyNwIyNiIyN0byMjYyMjX2MKKyNkZWZpbmUgZm4yKGEsYixjLGQpIGZuMyhhLGIsYyxkKQorI2RlZmluZSBmbihhKSBmbjIoYSwgSU5fQklUX0RFUFRILCBPVVRfQklUX0RFUFRILCBzcykKKworc3RhdGljIHZvaWQgZm4oeXV2Mnl1dikodWludDhfdCAqX2RzdFszXSwgY29uc3QgcHRyZGlmZl90IGRzdF9zdHJpZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpfc3JjWzNdLCBjb25zdCBwdHJkaWZmX3Qgc3JjX3N0cmlkZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgY29uc3QgaW50MTZfdCBjWzNdWzNdWzhdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCB5dXZfb2Zmc2V0WzJdWzhdKQoreworICAgIG9waXhlbCAqKmRzdCA9IChvcGl4ZWwgKiopIF9kc3Q7CisgICAgaXBpeGVsICoqc3JjID0gKGlwaXhlbCAqKikgX3NyYzsKKyAgICBjb25zdCBpcGl4ZWwgKnNyYzAgPSBzcmNbMF0sICpzcmMxID0gc3JjWzFdLCAqc3JjMiA9IHNyY1syXTsKKyAgICBvcGl4ZWwgKmRzdDAgPSBkc3RbMF0sICpkc3QxID0gZHN0WzFdLCAqZHN0MiA9IGRzdFsyXTsKKyAgICBpbnQgeSwgeDsKKyAgICBjb25zdCBpbnQgc2ggPSAxNCArIElOX0JJVF9ERVBUSCAtIE9VVF9CSVRfREVQVEg7CisgICAgY29uc3QgaW50IHJuZCA9IDEgPDwgKHNoIC0gMSk7CisgICAgaW50IHlfb2ZmX2luID0geXV2X29mZnNldFswXVswXTsKKyAgICBpbnQgeV9vZmZfb3V0ID0geXV2X29mZnNldFsxXVswXSA8PCBzaDsKKyAgICBjb25zdCBpbnQgdXZfb2ZmX2luID0gMTI4IDw8IChJTl9CSVRfREVQVEggLSA4KTsKKyAgICBjb25zdCBpbnQgdXZfb2ZmX291dCA9IHJuZCArICgxMjggPDwgKE9VVF9CSVRfREVQVEggLSA4ICsgc2gpKTsKKyAgICBpbnQgY3l5ID0gY1swXVswXVswXSwgY3l1ID0gY1swXVsxXVswXSwgY3l2ID0gY1swXVsyXVswXTsKKyAgICBpbnQgY3V1ID0gY1sxXVsxXVswXSwgY3V2ID0gY1sxXVsyXVswXSwgY3Z1ID0gY1syXVsxXVswXSwgY3Z2ID0gY1syXVsyXVswXTsKKworICAgIGF2X2Fzc2VydDIoY1sxXVswXVswXSA9PSAwKTsKKyAgICBhdl9hc3NlcnQyKGNbMl1bMF1bMF0gPT0gMCk7CisgICAgdyA9IEFWX0NFSUxfUlNISUZUKHcsIFNTX1cpOworICAgIGggPSBBVl9DRUlMX1JTSElGVChoLCBTU19IKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCB5MDAgPSBzcmMwW3ggPDwgU1NfV10gLSB5X29mZl9pbjsKKyNpZiBTU19XID09IDEKKyAgICAgICAgICAgIGludCB5MDEgPSBzcmMwWzIgKiB4ICsgMV0gLSB5X29mZl9pbjsKKyNpZiBTU19IID09IDEKKyAgICAgICAgICAgIGludCB5MTAgPSBzcmMwW3NyY19zdHJpZGVbMF0gLyBzaXplb2YoaXBpeGVsKSArIDIgKiB4XSAtIHlfb2ZmX2luOworICAgICAgICAgICAgaW50IHkxMSA9IHNyYzBbc3JjX3N0cmlkZVswXSAvIHNpemVvZihpcGl4ZWwpICsgMiAqIHggKyAxXSAtIHlfb2ZmX2luOworI2VuZGlmCisjZW5kaWYKKyAgICAgICAgICAgIGludCB1ID0gc3JjMVt4XSAtIHV2X29mZl9pbiwgdiA9IHNyYzJbeF0gLSB1dl9vZmZfaW47CisgICAgICAgICAgICBpbnQgdXZfdmFsID0gY3l1ICogdSArIGN5diAqIHYgKyBybmQgKyB5X29mZl9vdXQ7CisKKyAgICAgICAgICAgIGRzdDBbeCA8PCBTU19XXSA9IGF2X2NsaXBfcGl4ZWwoKGN5eSAqIHkwMCArIHV2X3ZhbCkgPj4gc2gpOworI2lmIFNTX1cgPT0gMQorICAgICAgICAgICAgZHN0MFt4ICogMiArIDFdID0gYXZfY2xpcF9waXhlbCgoY3l5ICogeTAxICsgdXZfdmFsKSA+PiBzaCk7CisjaWYgU1NfSCA9PSAxCisgICAgICAgICAgICBkc3QwW3ggKiAyICsgMCArIGRzdF9zdHJpZGVbMF0gLyBzaXplb2Yob3BpeGVsKV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfY2xpcF9waXhlbCgoY3l5ICogeTEwICsgdXZfdmFsKSA+PiBzaCk7CisgICAgICAgICAgICBkc3QwW3ggKiAyICsgMSArIGRzdF9zdHJpZGVbMF0gLyBzaXplb2Yob3BpeGVsKV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfY2xpcF9waXhlbCgoY3l5ICogeTExICsgdXZfdmFsKSA+PiBzaCk7CisjZW5kaWYKKyNlbmRpZgorCisgICAgICAgICAgICBkc3QxW3hdID0gYXZfY2xpcF9waXhlbCgodSAqIGN1dSArIHYgKiBjdXYgKyB1dl9vZmZfb3V0KSA+PiBzaCk7CisgICAgICAgICAgICBkc3QyW3hdID0gYXZfY2xpcF9waXhlbCgodSAqIGN2dSArIHYgKiBjdnYgKyB1dl9vZmZfb3V0KSA+PiBzaCk7CisgICAgICAgIH0KKworICAgICAgICBkc3QwICs9IChkc3Rfc3RyaWRlWzBdICogKDEgPDwgU1NfSCkpIC8gc2l6ZW9mKG9waXhlbCk7CisgICAgICAgIGRzdDEgKz0gZHN0X3N0cmlkZVsxXSAvIHNpemVvZihvcGl4ZWwpOworICAgICAgICBkc3QyICs9IGRzdF9zdHJpZGVbMl0gLyBzaXplb2Yob3BpeGVsKTsKKyAgICAgICAgc3JjMCArPSAoc3JjX3N0cmlkZVswXSAqICgxIDw8IFNTX0gpKSAvIHNpemVvZihpcGl4ZWwpOworICAgICAgICBzcmMxICs9IHNyY19zdHJpZGVbMV0gLyBzaXplb2YoaXBpeGVsKTsKKyAgICAgICAgc3JjMiArPSBzcmNfc3RyaWRlWzJdIC8gc2l6ZW9mKGlwaXhlbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZGVzaGFrZS5oIGIvbGliYXZmaWx0ZXIvZGVzaGFrZS5oCmluZGV4IGJlY2Q2YzIuLjQwNmNiYWIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2Rlc2hha2UuaAorKysgYi9saWJhdmZpbHRlci9kZXNoYWtlLmgKQEAgLTI2LDkgKzI2LDYgQEAKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgInRyYW5zZm9ybS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhlbHV0aWxzLmgiCi0jaWYgQ09ORklHX09QRU5DTAotI2luY2x1ZGUgImxpYmF2dXRpbC9vcGVuY2wuaCIKLSNlbmRpZgogCiAKIGVudW0gU2VhcmNoTWV0aG9kIHsKQEAgLTM3LDQzICszNCwyNSBAQAogICAgIFNFQVJDSF9DT1VOVAogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgSW50TW90aW9uVmVjdG9yIHsKICAgICBpbnQgeDsgICAgICAgICAgICAgLy8vPCBIb3Jpem9udGFsIHNoaWZ0CiAgICAgaW50IHk7ICAgICAgICAgICAgIC8vLzwgVmVydGljYWwgc2hpZnQKIH0gSW50TW90aW9uVmVjdG9yOwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBNb3Rpb25WZWN0b3IgewogICAgIGRvdWJsZSB4OyAgICAgICAgICAgICAvLy88IEhvcml6b250YWwgc2hpZnQKICAgICBkb3VibGUgeTsgICAgICAgICAgICAgLy8vPCBWZXJ0aWNhbCBzaGlmdAogfSBNb3Rpb25WZWN0b3I7CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFRyYW5zZm9ybSB7CiAgICAgTW90aW9uVmVjdG9yIHZlYzsgICAgIC8vLzwgTW90aW9uIHZlY3RvcgogICAgIGRvdWJsZSBhbmdsZTsgICAgICAgICAvLy88IEFuZ2xlIG9mIHJvdGF0aW9uCiAgICAgZG91YmxlIHpvb207ICAgICAgICAgIC8vLzwgWm9vbSBwZXJjZW50YWdlCiB9IFRyYW5zZm9ybTsKIAotI2lmIENPTkZJR19PUEVOQ0wKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZTsKLSAgICBjbF9wcm9ncmFtIHByb2dyYW07Ci0gICAgY2xfa2VybmVsIGtlcm5lbF9sdW1hOwotICAgIGNsX2tlcm5lbCBrZXJuZWxfY2hyb21hOwotICAgIGludCBpbl9wbGFuZV9zaXplWzhdOwotICAgIGludCBvdXRfcGxhbmVfc2l6ZVs4XTsKLSAgICBpbnQgcGxhbmVfbnVtOwotICAgIGNsX21lbSBjbF9pbmJ1ZjsKLSAgICBzaXplX3QgY2xfaW5idWZfc2l6ZTsKLSAgICBjbF9tZW0gY2xfb3V0YnVmOwotICAgIHNpemVfdCBjbF9vdXRidWZfc2l6ZTsKLX0gRGVzaGFrZU9wZW5jbENvbnRleHQ7Ci0KLSNlbmRpZgotCiAjZGVmaW5lIE1BWF9SIDY0CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IERlc2hha2VDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgY291bnRzWzIqTUFYX1IrMV1bMipNQVhfUisxXTsgLy8vIDwgU2NyYXRjaCBidWZmZXIgZm9yIG1vdGlvbiBzZWFyY2gKICAgICBkb3VibGUgKmFuZ2xlczsgICAgICAgICAgICAvLy88IFNjcmF0Y2ggYnVmZmVyIGZvciBibG9jayBhbmdsZXMKQEAgLTk2LDkgKzc1LDYgQEAKICAgICBpbnQgY3k7CiAgICAgY2hhciAqZmlsZW5hbWU7ICAgICAgICAgICAgLy8vPCBNb3Rpb24gc2VhcmNoIGRldGFpbGVkIGxvZyBmaWxlbmFtZQogICAgIGludCBvcGVuY2w7Ci0jaWYgQ09ORklHX09QRU5DTAotICAgIERlc2hha2VPcGVuY2xDb250ZXh0IG9wZW5jbF9jdHg7Ci0jZW5kaWYKICAgICBpbnQgKCogdHJhbnNmb3JtKShBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgY3csIGludCBjaCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbWF0cml4X3ksIGNvbnN0IGZsb2F0ICptYXRyaXhfdXYsIGVudW0gSW50ZXJwb2xhdGVNZXRob2QgaW50ZXJwb2xhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgZW51bSBGaWxsTWV0aG9kIGZpbGwsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZGVzaGFrZV9vcGVuY2wuYyBiL2xpYmF2ZmlsdGVyL2Rlc2hha2Vfb3BlbmNsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYWU3ZDUuLjAwMDAwMDAKLS0tIGEvbGliYXZmaWx0ZXIvZGVzaGFrZV9vcGVuY2wuYworKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFdlaSBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMyBMZW5ueSBXYW5nCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLS8qKgotICogQGZpbGUKLSAqIHRyYW5zZm9ybSBpbnB1dCB2aWRlbwotICovCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgotI2luY2x1ZGUgImRlc2hha2Vfb3BlbmNsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wZW5jbF9pbnRlcm5hbC5oIgotCi0jZGVmaW5lIFBMQU5FX05VTSAzCi0jZGVmaW5lIFJPVU5EX1RPXzE2KGEpICgoKCgoYSkgLSAxKS8xNikrMSkqMTYpCi0KLWludCBmZl9vcGVuY2xfdHJhbnNmb3JtKEFWRmlsdGVyQ29udGV4dCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgY3csIGludCBjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICptYXRyaXhfeSwgY29uc3QgZmxvYXQgKm1hdHJpeF91diwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gSW50ZXJwb2xhdGVNZXRob2QgaW50ZXJwb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEZpbGxNZXRob2QgZmlsbCwgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCkKLXsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBjbF9pbnQgc3RhdHVzOwotICAgIERlc2hha2VDb250ZXh0ICpkZXNoYWtlID0gY3R4LT5wcml2OwotICAgIGZsb2F0NCBwYWNrZWRfbWF0cml4X2x1ID0ge21hdHJpeF95WzBdLCBtYXRyaXhfeVsxXSwgbWF0cml4X3lbMl0sIG1hdHJpeF95WzVdfTsKLSAgICBmbG9hdDQgcGFja2VkX21hdHJpeF9jaCA9IHttYXRyaXhfdXZbMF0sIG1hdHJpeF91dlsxXSwgbWF0cml4X3V2WzJdLCBtYXRyaXhfdXZbNV19OwotICAgIHNpemVfdCBnbG9iYWxfd29ya3NpemVfbHVbMl0gPSB7KHNpemVfdClST1VORF9UT18xNih3aWR0aCksIChzaXplX3QpUk9VTkRfVE9fMTYoaGVpZ2h0KX07Ci0gICAgc2l6ZV90IGdsb2JhbF93b3Jrc2l6ZV9jaFsyXSA9IHsoc2l6ZV90KVJPVU5EX1RPXzE2KGN3KSwgKHNpemVfdCkoMipST1VORF9UT18xNihjaCkpfTsKLSAgICBzaXplX3QgbG9jYWxfd29ya3NpemVbMl0gPSB7MTYsIDE2fTsKLSAgICBGRk9wZW5jbFBhcmFtIHBhcmFtX2x1ID0gezB9OwotICAgIEZGT3BlbmNsUGFyYW0gcGFyYW1fY2ggPSB7MH07Ci0gICAgcGFyYW1fbHUuY3R4ID0gcGFyYW1fY2guY3R4ID0gY3R4OwotICAgIHBhcmFtX2x1Lmtlcm5lbCA9IGRlc2hha2UtPm9wZW5jbF9jdHgua2VybmVsX2x1bWE7Ci0gICAgcGFyYW1fY2gua2VybmVsID0gZGVzaGFrZS0+b3BlbmNsX2N0eC5rZXJuZWxfY2hyb21hOwotCi0gICAgaWYgKCh1bnNpZ25lZCBpbnQpaW50ZXJwb2xhdGUgPiBJTlRFUlBPTEFURV9CSVFVQURSQVRJQykgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTZWxlY3RlZCBpbnRlcnBvbGF0ZSBtZXRob2QgaXMgaW52YWxpZFxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIHJldCA9IGF2cHJpdl9vcGVuY2xfc2V0X3BhcmFtZXRlcigmcGFyYW1fbHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9pbmJ1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9vdXRidWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHBhY2tlZF9tYXRyaXhfbHUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGludGVycG9sYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhmaWxsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhpbi0+bGluZXNpemVbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKG91dC0+bGluZXNpemVbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8od2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIHJldCA9IGF2cHJpdl9vcGVuY2xfc2V0X3BhcmFtZXRlcigmcGFyYW1fY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9pbmJ1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9vdXRidWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHBhY2tlZF9tYXRyaXhfY2gpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGludGVycG9sYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhmaWxsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhpbi0+bGluZXNpemVbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKG91dC0+bGluZXNpemVbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGluLT5saW5lc2l6ZVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8ob3V0LT5saW5lc2l6ZVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oaGVpZ2h0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oY2gpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGN3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBzdGF0dXMgPSBjbEVucXVldWVORFJhbmdlS2VybmVsKGRlc2hha2UtPm9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHgua2VybmVsX2x1bWEsIDIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfd29ya3NpemVfbHUsIGxvY2FsX3dvcmtzaXplLCAwLCBOVUxMLCBOVUxMKTsKLSAgICBzdGF0dXMgfD0gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbChkZXNoYWtlLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4Lmtlcm5lbF9jaHJvbWEsIDIsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfd29ya3NpemVfY2gsIGxvY2FsX3dvcmtzaXplLCAwLCBOVUxMLCBOVUxMKTsKLSAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIHJ1biBrZXJuZWwgZXJyb3Igb2NjdXJyZWQ6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICB9Ci0gICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9yZWFkX2ltYWdlKG91dC0+ZGF0YSwgZGVzaGFrZS0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5wbGFuZV9udW0sIGRlc2hha2UtPm9wZW5jbF9jdHguY2xfb3V0YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX291dGJ1Zl9zaXplKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgZmZfb3BlbmNsX2Rlc2hha2VfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKLXsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBEZXNoYWtlQ29udGV4dCAqZGVzaGFrZSA9IGN0eC0+cHJpdjsKLSAgICByZXQgPSBhdl9vcGVuY2xfaW5pdChOVUxMKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LnBsYW5lX251bSA9IFBMQU5FX05VTTsKLSAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUgPSBhdl9vcGVuY2xfZ2V0X2NvbW1hbmRfcXVldWUoKTsKLSAgICBpZiAoIWRlc2hha2UtPm9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZ2V0IE9wZW5DTCBjb21tYW5kIHF1ZXVlIGluIGZpbHRlciAnZGVzaGFrZSdcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LnByb2dyYW0gPSBhdl9vcGVuY2xfY29tcGlsZSgiYXZmaWx0ZXJfdHJhbnNmb3JtIiwgTlVMTCk7Ci0gICAgaWYgKCFkZXNoYWtlLT5vcGVuY2xfY3R4LnByb2dyYW0pIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIGZhaWxlZCB0byBjb21waWxlIHByb2dyYW0gJ2F2ZmlsdGVyX3RyYW5zZm9ybSdcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBpZiAoIWRlc2hha2UtPm9wZW5jbF9jdHgua2VybmVsX2x1bWEpIHsKLSAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYSA9IGNsQ3JlYXRlS2VybmVsKGRlc2hha2UtPm9wZW5jbF9jdHgucHJvZ3JhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdmZpbHRlcl90cmFuc2Zvcm1fbHVtYSIsICZyZXQpOwotICAgICAgICBpZiAocmV0ICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBmYWlsZWQgdG8gY3JlYXRlIGtlcm5lbCAnYXZmaWx0ZXJfdHJhbnNmb3JtX2x1bWEnXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFkZXNoYWtlLT5vcGVuY2xfY3R4Lmtlcm5lbF9jaHJvbWEpIHsKLSAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5rZXJuZWxfY2hyb21hID0gY2xDcmVhdGVLZXJuZWwoZGVzaGFrZS0+b3BlbmNsX2N0eC5wcm9ncmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXZmaWx0ZXJfdHJhbnNmb3JtX2Nocm9tYSIsICZyZXQpOwotICAgICAgICBpZiAocmV0ICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBmYWlsZWQgdG8gY3JlYXRlIGtlcm5lbCAnYXZmaWx0ZXJfdHJhbnNmb3JtX2Nocm9tYSdcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGZmX29wZW5jbF9kZXNoYWtlX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKLXsKLSAgICBEZXNoYWtlQ29udGV4dCAqZGVzaGFrZSA9IGN0eC0+cHJpdjsKLSAgICBhdl9vcGVuY2xfYnVmZmVyX3JlbGVhc2UoJmRlc2hha2UtPm9wZW5jbF9jdHguY2xfaW5idWYpOwotICAgIGF2X29wZW5jbF9idWZmZXJfcmVsZWFzZSgmZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9vdXRidWYpOwotICAgIGNsUmVsZWFzZUtlcm5lbChkZXNoYWtlLT5vcGVuY2xfY3R4Lmtlcm5lbF9sdW1hKTsKLSAgICBjbFJlbGVhc2VLZXJuZWwoZGVzaGFrZS0+b3BlbmNsX2N0eC5rZXJuZWxfY2hyb21hKTsKLSAgICBjbFJlbGVhc2VQcm9ncmFtKGRlc2hha2UtPm9wZW5jbF9jdHgucHJvZ3JhbSk7Ci0gICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlID0gTlVMTDsKLSAgICBhdl9vcGVuY2xfdW5pbml0KCk7Ci19Ci0KLWludCBmZl9vcGVuY2xfZGVzaGFrZV9wcm9jZXNzX2lub3V0X2J1ZihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCkKLXsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBBVkZpbHRlckxpbmsgKmxpbmsgPSBjdHgtPmlucHV0c1swXTsKLSAgICBEZXNoYWtlQ29udGV4dCAqZGVzaGFrZSA9IGN0eC0+cHJpdjsKLSAgICBjb25zdCBpbnQgaHNoaWZ0ID0gYXZfcGl4X2ZtdF9kZXNjX2dldChsaW5rLT5mb3JtYXQpLT5sb2cyX2Nocm9tYV9oOwotICAgIGludCBjaHJvbWFfaGVpZ2h0ID0gQVZfQ0VJTF9SU0hJRlQobGluay0+aCwgaHNoaWZ0KTsKLQotICAgIGlmICgoIWRlc2hha2UtPm9wZW5jbF9jdHguY2xfaW5idWYpIHx8ICghZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9vdXRidWYpKSB7Ci0gICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVswXSAgPSAoaW4tPmxpbmVzaXplWzBdICogaW4tPmhlaWdodCk7Ci0gICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVsxXSAgPSAoaW4tPmxpbmVzaXplWzFdICogY2hyb21hX2hlaWdodCk7Ci0gICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVsyXSAgPSAoaW4tPmxpbmVzaXplWzJdICogY2hyb21hX2hlaWdodCk7Ci0gICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHgub3V0X3BsYW5lX3NpemVbMF0gPSAob3V0LT5saW5lc2l6ZVswXSAqIG91dC0+aGVpZ2h0KTsKLSAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVsxXSA9IChvdXQtPmxpbmVzaXplWzFdICogY2hyb21hX2hlaWdodCk7Ci0gICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHgub3V0X3BsYW5lX3NpemVbMl0gPSAob3V0LT5saW5lc2l6ZVsyXSAqIGNocm9tYV9oZWlnaHQpOwotICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX2luYnVmX3NpemUgID0gZGVzaGFrZS0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzBdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVsxXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LmluX3BsYW5lX3NpemVbMl07Ci0gICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguY2xfb3V0YnVmX3NpemUgPSBkZXNoYWtlLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplWzBdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHgub3V0X3BsYW5lX3NpemVbMV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVsyXTsKLSAgICAgICAgaWYgKCFkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX2luYnVmKSB7Ci0gICAgICAgICAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX2NyZWF0ZSgmZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9pbmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9pbmJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9NRU1fUkVBRF9PTkxZLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX291dGJ1ZikgewotICAgICAgICAgICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoJmRlc2hha2UtPm9wZW5jbF9jdHguY2xfb3V0YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNoYWtlLT5vcGVuY2xfY3R4LmNsX291dGJ1Zl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9NRU1fUkVBRF9XUklURSwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldCA9IGF2X29wZW5jbF9idWZmZXJfd3JpdGVfaW1hZ2UoZGVzaGFrZS0+b3BlbmNsX2N0eC5jbF9pbmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHguY2xfaW5idWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGluLT5kYXRhLGRlc2hha2UtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2hha2UtPm9wZW5jbF9jdHgucGxhbmVfbnVtKTsKLSAgICBpZihyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9kZXNoYWtlX29wZW5jbC5oIGIvbGliYXZmaWx0ZXIvZGVzaGFrZV9vcGVuY2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIwYTI0MS4uMDAwMDAwMAotLS0gYS9saWJhdmZpbHRlci9kZXNoYWtlX29wZW5jbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBXZWkgR2FvIDx3ZWlnYW9AbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZGSUxURVJfREVTSEFLRV9PUEVOQ0xfSAotI2RlZmluZSBBVkZJTFRFUl9ERVNIQUtFX09QRU5DTF9ICi0KLSNpbmNsdWRlICJkZXNoYWtlLmgiCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBmbG9hdCB4OwotICAgIGZsb2F0IHk7Ci0gICAgZmxvYXQgejsKLSAgICBmbG9hdCB3OwotfSBmbG9hdDQ7Ci0KLWludCBmZl9vcGVuY2xfZGVzaGFrZV9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKLQotdm9pZCBmZl9vcGVuY2xfZGVzaGFrZV91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpOwotCi1pbnQgZmZfb3BlbmNsX2Rlc2hha2VfcHJvY2Vzc19pbm91dF9idWYoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpOwotCi1pbnQgZmZfb3BlbmNsX3RyYW5zZm9ybShBVkZpbHRlckNvbnRleHQgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGN3LCBpbnQgY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbWF0cml4X3ksIGNvbnN0IGZsb2F0ICptYXRyaXhfdXYsCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEludGVycG9sYXRlTWV0aG9kIGludGVycG9sYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBGaWxsTWV0aG9kIGZpbGwsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpOwotCi0jZW5kaWYgLyogQVZGSUxURVJfREVTSEFLRV9PUEVOQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZGVzaGFrZV9vcGVuY2xfa2VybmVsLmggYi9saWJhdmZpbHRlci9kZXNoYWtlX29wZW5jbF9rZXJuZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWQ2Zi4uMDAwMDAwMAotLS0gYS9saWJhdmZpbHRlci9kZXNoYWtlX29wZW5jbF9rZXJuZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFdlaSBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMyBMZW5ueSBXYW5nCi0gKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZuZGVmIEFWRklMVEVSX0RFU0hBS0VfT1BFTkNMX0tFUk5FTF9ICi0jZGVmaW5lIEFWRklMVEVSX0RFU0hBS0VfT1BFTkNMX0tFUk5FTF9ICi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvb3BlbmNsLmgiCi0KLWNvbnN0IGNoYXIgKmZmX2tlcm5lbF9kZXNoYWtlX29wZW5jbCA9IEFWX09QRU5DTF9LRVJORUwoCi1pbmxpbmUgdW5zaWduZWQgY2hhciBwaXhlbChnbG9iYWwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgeCwgaW50IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsaW50IHN0cmlkZSwgdW5zaWduZWQgY2hhciBkZWYpCi17Ci0gICAgcmV0dXJuICh4IDwgMCB8fCB5IDwgMCB8fCB4ID49IHcgfHwgeSA+PSBoKSA/IGRlZiA6IHNyY1t4ICsgeSAqIHN0cmlkZV07Ci19Ci0KLXVuc2lnbmVkIGNoYXIgaW50ZXJwb2xhdGVfbmVhcmVzdChmbG9hdCB4LCBmbG9hdCB5LCBnbG9iYWwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgdW5zaWduZWQgY2hhciBkZWYpCi17Ci0gICAgcmV0dXJuIHBpeGVsKHNyYywgKGludCkoeCArIDAuNWYpLCAoaW50KSh5ICsgMC41ZiksIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKLX0KLQotdW5zaWduZWQgY2hhciBpbnRlcnBvbGF0ZV9iaWxpbmVhcihmbG9hdCB4LCBmbG9hdCB5LCBnbG9iYWwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIHVuc2lnbmVkIGNoYXIgZGVmKQotewotICAgIGludCB4X2MsIHhfZiwgeV9jLCB5X2Y7Ci0gICAgaW50IHYxLCB2MiwgdjMsIHY0OwotICAgIHhfZiA9IChpbnQpeDsKLSAgICB5X2YgPSAoaW50KXk7Ci0gICAgeF9jID0geF9mICsgMTsKLSAgICB5X2MgPSB5X2YgKyAxOwotCi0gICAgaWYgKHhfZiA8IC0xIHx8IHhfZiA+IHdpZHRoIHx8IHlfZiA8IC0xIHx8IHlfZiA+IGhlaWdodCkgewotICAgICAgICByZXR1cm4gZGVmOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHY0ID0gcGl4ZWwoc3JjLCB4X2YsIHlfZiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOwotICAgICAgICB2MiA9IHBpeGVsKHNyYywgeF9jLCB5X2YsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKLSAgICAgICAgdjMgPSBwaXhlbChzcmMsIHhfZiwgeV9jLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGRlZik7Ci0gICAgICAgIHYxID0gcGl4ZWwoc3JjLCB4X2MsIHlfYywgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOwotICAgICAgICByZXR1cm4gKHYxKih4IC0geF9mKSooeSAtIHlfZikgKyB2MiooKHggLSB4X2YpKih5X2MgLSB5KSkgKwotICAgICAgICAgICAgICAgIHYzKih4X2MgLSB4KSooeSAtIHlfZikgKyB2NCooKHhfYyAtIHgpKih5X2MgLSB5KSkpOwotICAgIH0KLX0KLQotdW5zaWduZWQgY2hhciBpbnRlcnBvbGF0ZV9iaXF1YWRyYXRpYyhmbG9hdCB4LCBmbG9hdCB5LCBnbG9iYWwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIHVuc2lnbmVkIGNoYXIgZGVmKQotewotICAgIGludCAgICAgeF9jLCB4X2YsIHlfYywgeV9mOwotICAgIHVuc2lnbmVkIGNoYXIgdjEsICB2MiwgIHYzLCAgdjQ7Ci0gICAgZmxvYXQgICBmMSwgIGYyLCAgZjMsICBmNDsKLSAgICB4X2YgPSAoaW50KXg7Ci0gICAgeV9mID0gKGludCl5OwotICAgIHhfYyA9IHhfZiArIDE7Ci0gICAgeV9jID0geV9mICsgMTsKLQotICAgIGlmICh4X2YgPCAtIDEgfHwgeF9mID4gd2lkdGggfHwgeV9mIDwgLTEgfHwgeV9mID4gaGVpZ2h0KQotICAgICAgICByZXR1cm4gZGVmOwotICAgIGVsc2UgewotICAgICAgICB2NCA9IHBpeGVsKHNyYywgeF9mLCB5X2YsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKLSAgICAgICAgdjIgPSBwaXhlbChzcmMsIHhfYywgeV9mLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIGRlZik7Ci0gICAgICAgIHYzID0gcGl4ZWwoc3JjLCB4X2YsIHlfYywgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBkZWYpOwotICAgICAgICB2MSA9IHBpeGVsKHNyYywgeF9jLCB5X2MsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgZGVmKTsKLQotICAgICAgICBmMSA9IDEgLSBzcXJ0KCh4X2MgLSB4KSAqICh5X2MgLSB5KSk7Ci0gICAgICAgIGYyID0gMSAtIHNxcnQoKHhfYyAtIHgpICogKHkgLSB5X2YpKTsKLSAgICAgICAgZjMgPSAxIC0gc3FydCgoeCAtIHhfZikgKiAoeV9jIC0geSkpOwotICAgICAgICBmNCA9IDEgLSBzcXJ0KCh4IC0geF9mKSAqICh5IC0geV9mKSk7Ci0gICAgICAgIHJldHVybiAodjEgKiBmMSArIHYyICogZjIgKyB2MyAqIGYzICsgdjQgKiBmNCkgLyAoZjEgKyBmMiArIGYzICsgZjQpOwotICAgIH0KLX0KLQotaW5saW5lIGNvbnN0IGZsb2F0IGNsaXBmKGZsb2F0IGEsIGZsb2F0IGFtaW4sIGZsb2F0IGFtYXgpCi17Ci0gICAgaWYgICAgICAoYSA8IGFtaW4pIHJldHVybiBhbWluOwotICAgIGVsc2UgaWYgKGEgPiBhbWF4KSByZXR1cm4gYW1heDsKLSAgICBlbHNlICAgICAgICAgICAgICAgcmV0dXJuIGE7Ci19Ci0KLWlubGluZSBpbnQgbWlycm9yKGludCB2LCBpbnQgbSkKLXsKLSAgICB3aGlsZSAoKHVuc2lnbmVkKXYgPiAodW5zaWduZWQpbSkgewotICAgICAgICB2ID0gLXY7Ci0gICAgICAgIGlmICh2IDwgMCkKLSAgICAgICAgICAgIHYgKz0gMiAqIG07Ci0gICAgfQotICAgIHJldHVybiB2OwotfQotCi1rZXJuZWwgdm9pZCBhdmZpbHRlcl90cmFuc2Zvcm1fbHVtYShnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW50ZXJwb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlX2x1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGVfbHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQotewotICAgIGludCB4ID0gZ2V0X2dsb2JhbF9pZCgwKTsKLSAgICBpbnQgeSA9IGdldF9nbG9iYWxfaWQoMSk7Ci0gICAgaW50IGlkeF9kc3QgPSB5ICogZHN0X3N0cmlkZV9sdSArIHg7Ci0gICAgdW5zaWduZWQgY2hhciBkZWYgPSAwOwotICAgIGZsb2F0IHhfcyA9IHggKiBtYXRyaXgueCArIHkgKiBtYXRyaXgueSArIG1hdHJpeC56OwotICAgIGZsb2F0IHlfcyA9IHggKiAoLW1hdHJpeC55KSArIHkgKiBtYXRyaXgueCArIG1hdHJpeC53OwotCi0gICAgaWYgKHggPCB3aWR0aCAmJiB5IDwgaGVpZ2h0KSB7Ci0gICAgICAgIHN3aXRjaCAoZmlsbCkgewotICAgICAgICAgICAgY2FzZSAwOiAvL0ZJTExfQkxBTksKLSAgICAgICAgICAgICAgICBkZWYgPSAwOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAvL0ZJTExfT1JJR0lOQUwKLSAgICAgICAgICAgICAgICBkZWYgPSBzcmNbeSpzcmNfc3RyaWRlX2x1ICsgeF07Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI6IC8vRklMTF9DTEFNUAotICAgICAgICAgICAgICAgIHlfcyA9IGNsaXBmKHlfcywgMCwgaGVpZ2h0IC0gMSk7Ci0gICAgICAgICAgICAgICAgeF9zID0gY2xpcGYoeF9zLCAwLCB3aWR0aCAtIDEpOwotICAgICAgICAgICAgICAgIGRlZiA9IHNyY1soaW50KXlfcyAqIHNyY19zdHJpZGVfbHUgKyAoaW50KXhfc107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM6IC8vRklMTF9NSVJST1IKLSAgICAgICAgICAgICAgICB5X3MgPSBtaXJyb3IoeV9zLCBoZWlnaHQgLSAxKTsKLSAgICAgICAgICAgICAgICB4X3MgPSBtaXJyb3IoeF9zLCB3aWR0aCAtIDEpOwotICAgICAgICAgICAgICAgIGRlZiA9IHNyY1soaW50KXlfcyAqIHNyY19zdHJpZGVfbHUgKyAoaW50KXhfc107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChpbnRlcnBvbGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOiAvL0lOVEVSUE9MQVRFX05FQVJFU1QKLSAgICAgICAgICAgICAgICBkc3RbaWR4X2RzdF0gPSBpbnRlcnBvbGF0ZV9uZWFyZXN0KHhfcywgeV9zLCBzcmMsIHdpZHRoLCBoZWlnaHQsIHNyY19zdHJpZGVfbHUsIGRlZik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IC8vSU5URVJQT0xBVEVfQklMSU5FQVIKLSAgICAgICAgICAgICAgICBkc3RbaWR4X2RzdF0gPSBpbnRlcnBvbGF0ZV9iaWxpbmVhcih4X3MsIHlfcywgc3JjLCB3aWR0aCwgaGVpZ2h0LCBzcmNfc3RyaWRlX2x1LCBkZWYpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiAvL0lOVEVSUE9MQVRFX0JJUVVBRFJBVElDCi0gICAgICAgICAgICAgICAgZHN0W2lkeF9kc3RdID0gaW50ZXJwb2xhdGVfYmlxdWFkcmF0aWMoeF9zLCB5X3MsIHNyYywgd2lkdGgsIGhlaWdodCwgc3JjX3N0cmlkZV9sdSwgZGVmKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotCi1rZXJuZWwgdm9pZCBhdmZpbHRlcl90cmFuc2Zvcm1fY2hyb21hKGdsb2JhbCB1bnNpZ25lZCBjaGFyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0NCBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnRlcnBvbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlX2x1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZV9sdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGVfY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlX2NoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGN3KQotewotCi0gICAgaW50IHggPSBnZXRfZ2xvYmFsX2lkKDApOwotICAgIGludCB5ID0gZ2V0X2dsb2JhbF9pZCgxKTsKLSAgICBpbnQgcGFkX2NoID0gZ2V0X2dsb2JhbF9zaXplKDEpPj4xOwotICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpkc3RfdSA9IGRzdCArIGhlaWdodCAqIGRzdF9zdHJpZGVfbHU7Ci0gICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKnNyY191ID0gc3JjICsgaGVpZ2h0ICogc3JjX3N0cmlkZV9sdTsKLSAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0X3YgPSBkc3RfdSArIGNoICogZHN0X3N0cmlkZV9jaDsKLSAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjX3YgPSBzcmNfdSArIGNoICogc3JjX3N0cmlkZV9jaDsKLSAgICBzcmMgPSB5IDwgcGFkX2NoID8gc3JjX3UgOiBzcmNfdjsKLSAgICBkc3QgPSB5IDwgcGFkX2NoID8gZHN0X3UgOiBkc3RfdjsKLSAgICB5ID0gc2VsZWN0KHkgLSBwYWRfY2gsIHksIHkgPCBwYWRfY2gpOwotICAgIGZsb2F0IHhfcyA9IHggKiBtYXRyaXgueCArIHkgKiBtYXRyaXgueSArIG1hdHJpeC56OwotICAgIGZsb2F0IHlfcyA9IHggKiAoLW1hdHJpeC55KSArIHkgKiBtYXRyaXgueCArIG1hdHJpeC53OwotICAgIGludCBpZHhfZHN0ID0geSAqIGRzdF9zdHJpZGVfY2ggKyB4OwotICAgIHVuc2lnbmVkIGNoYXIgZGVmOwotCi0gICAgaWYgKHggPCBjdyAmJiB5IDwgY2gpIHsKLSAgICAgICAgc3dpdGNoIChmaWxsKSB7Ci0gICAgICAgICAgICBjYXNlIDA6IC8vRklMTF9CTEFOSwotICAgICAgICAgICAgICAgIGRlZiA9IDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IC8vRklMTF9PUklHSU5BTAotICAgICAgICAgICAgICAgIGRlZiA9IHNyY1t5KnNyY19zdHJpZGVfY2ggKyB4XTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogLy9GSUxMX0NMQU1QCi0gICAgICAgICAgICAgICAgeV9zID0gY2xpcGYoeV9zLCAwLCBjaCAtIDEpOwotICAgICAgICAgICAgICAgIHhfcyA9IGNsaXBmKHhfcywgMCwgY3cgLSAxKTsKLSAgICAgICAgICAgICAgICBkZWYgPSBzcmNbKGludCl5X3MgKiBzcmNfc3RyaWRlX2NoICsgKGludCl4X3NdOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOiAvL0ZJTExfTUlSUk9SCi0gICAgICAgICAgICAgICAgeV9zID0gbWlycm9yKHlfcywgY2ggLSAxKTsKLSAgICAgICAgICAgICAgICB4X3MgPSBtaXJyb3IoeF9zLCBjdyAtIDEpOwotICAgICAgICAgICAgICAgIGRlZiA9IHNyY1soaW50KXlfcyAqIHNyY19zdHJpZGVfY2ggKyAoaW50KXhfc107Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChpbnRlcnBvbGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOiAvL0lOVEVSUE9MQVRFX05FQVJFU1QKLSAgICAgICAgICAgICAgICBkc3RbaWR4X2RzdF0gPSBpbnRlcnBvbGF0ZV9uZWFyZXN0KHhfcywgeV9zLCBzcmMsIGN3LCBjaCwgc3JjX3N0cmlkZV9jaCwgZGVmKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTogLy9JTlRFUlBPTEFURV9CSUxJTkVBUgotICAgICAgICAgICAgICAgIGRzdFtpZHhfZHN0XSA9IGludGVycG9sYXRlX2JpbGluZWFyKHhfcywgeV9zLCBzcmMsIGN3LCBjaCwgc3JjX3N0cmlkZV9jaCwgZGVmKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogLy9JTlRFUlBPTEFURV9CSVFVQURSQVRJQwotICAgICAgICAgICAgICAgIGRzdFtpZHhfZHN0XSA9IGludGVycG9sYXRlX2JpcXVhZHJhdGljKHhfcywgeV9zLCBzcmMsIGN3LCBjaCwgc3JjX3N0cmlkZV9jaCwgZGVmKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgfQotfQotKTsKLQotI2VuZGlmIC8qIEFWRklMVEVSX0RFU0hBS0VfT1BFTkNMX0tFUk5FTF9IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9kcmF3dXRpbHMuYyBiL2xpYmF2ZmlsdGVyL2RyYXd1dGlscy5jCmluZGV4IDIzYTBlYjUuLmRiOGM3YTYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2RyYXd1dGlscy5jCisrKyBiL2xpYmF2ZmlsdGVyL2RyYXd1dGlscy5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb2xvcnNwYWNlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImRyYXd1dGlscy5oIgpAQCAtNTIsMTEgKzUzLDIzIEBACiAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjA6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjI0OiByZ2JhX21hcFtCTFVFIF0gPSAwOyByZ2JhX21hcFtHUkVFTl0gPSAxOyByZ2JhX21hcFtSRUQgIF0gPSAyOyByZ2JhX21hcFtBTFBIQV0gPSAzOyBicmVhazsKLSAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDk6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMDoKLSAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyOgotICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA5QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTRMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxMEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEyTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDE2QkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6ICByZ2JhX21hcFtHUkVFTl0gPSAwOyByZ2JhX21hcFtCTFVFIF0gPSAxOyByZ2JhX21hcFtSRUQgIF0gPSAyOyByZ2JhX21hcFtBTFBIQV0gPSAzOyBicmVhazsKICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgLyogdW5zdXBwb3J0ZWQgKi8KICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKQEAgLTE3MSwxMiArMTg0LDE2IEBACiAKICAgICBpZiAoIWRlc2MgfHwgIWRlc2MtPm5hbWUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgaWYgKGRlc2MtPmZsYWdzICYgfihBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpKQorICAgIGlmIChkZXNjLT5mbGFncyAmIH4oQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBGRl9QU0VVRE9QQUwgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIGlmIChmb3JtYXQgPT0gQVZfUElYX0ZNVF9QMDEwTEUgfHwgZm9ybWF0ID09IEFWX1BJWF9GTVRfUDAxMEJFIHx8IGZvcm1hdCA9PSBBVl9QSVhfRk1UX1AwMTZMRSB8fCBmb3JtYXQgPT0gQVZfUElYX0ZNVF9QMDE2QkUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX2NvbXBvbmVudHM7IGkrKykgewogICAgICAgICBjID0gJmRlc2MtPmNvbXBbaV07Ci0gICAgICAgIC8qIGZvciBub3csIG9ubHkgOC1iaXRzIGZvcm1hdHMgKi8KLSAgICAgICAgaWYgKGMtPmRlcHRoICE9IDgpCisgICAgICAgIC8qIGZvciBub3csIG9ubHkgOC0xNiBiaXRzIGZvcm1hdHMgKi8KKyAgICAgICAgaWYgKGMtPmRlcHRoIDwgOCB8fCBjLT5kZXB0aCA+IDE2KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKICAgICAgICAgaWYgKGMtPnBsYW5lID49IE1BWF9QTEFORVMpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwpAQCAtMTg0LDIxICsyMDEsMjMgQEAKICAgICAgICAgaWYgKHBpeGVsc3RlcFtjLT5wbGFuZV0gIT0gMCAmJgogICAgICAgICAgICAgcGl4ZWxzdGVwW2MtPnBsYW5lXSAhPSBjLT5zdGVwKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgaWYgKHBpeGVsc3RlcFtjLT5wbGFuZV0gPT0gNiAmJgorICAgICAgICAgICAgYy0+ZGVwdGggPT0gMTYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogICAgICAgICBwaXhlbHN0ZXBbYy0+cGxhbmVdID0gYy0+c3RlcDsKICAgICAgICAgaWYgKHBpeGVsc3RlcFtjLT5wbGFuZV0gPj0gOCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgICAgIG5iX3BsYW5lcyA9IEZGTUFYKG5iX3BsYW5lcywgYy0+cGxhbmUgKyAxKTsKICAgICB9Ci0gICAgaWYgKChkZXNjLT5sb2cyX2Nocm9tYV93IHx8IGRlc2MtPmxvZzJfY2hyb21hX2gpICYmIG5iX3BsYW5lcyA8IDMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7IC8qIGV4Y2x1ZGUgTlYxMiBhbmQgTlYyMSAqLwogICAgIG1lbXNldChkcmF3LCAwLCBzaXplb2YoKmRyYXcpKTsKICAgICBkcmF3LT5kZXNjICAgICAgPSBkZXNjOwogICAgIGRyYXctPmZvcm1hdCAgICA9IGZvcm1hdDsKICAgICBkcmF3LT5uYl9wbGFuZXMgPSBuYl9wbGFuZXM7CisgICAgZHJhdy0+ZmxhZ3MgICAgID0gZmxhZ3M7CiAgICAgbWVtY3B5KGRyYXctPnBpeGVsc3RlcCwgcGl4ZWxzdGVwLCBzaXplb2YoZHJhdy0+cGl4ZWxzdGVwKSk7CiAgICAgZHJhdy0+aHN1YlsxXSA9IGRyYXctPmhzdWJbMl0gPSBkcmF3LT5oc3ViX21heCA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CiAgICAgZHJhdy0+dnN1YlsxXSA9IGRyYXctPnZzdWJbMl0gPSBkcmF3LT52c3ViX21heCA9IGRlc2MtPmxvZzJfY2hyb21hX2g7Ci0gICAgZm9yIChpID0gMDsgaSA8ICgoZGVzYy0+bmJfY29tcG9uZW50cyAtIDEpIHwgMSk7IGkrKykKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGRlc2MtPm5iX2NvbXBvbmVudHMgLSAhIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSAmJiAhKGZsYWdzICYgRkZfRFJBV19QUk9DRVNTX0FMUEhBKSkpOyBpKyspCiAgICAgICAgIGRyYXctPmNvbXBfbWFza1tkZXNjLT5jb21wW2ldLnBsYW5lXSB8PQogICAgICAgICAgICAgMSA8PCBkZXNjLT5jb21wW2ldLm9mZnNldDsKICAgICByZXR1cm4gMDsKQEAgLTIxNCwyMSArMjMzLDQ1IEBACiAgICAgaWYgKChkcmF3LT5kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpICYmCiAgICAgICAgIGZmX2ZpbGxfcmdiYV9tYXAocmdiYV9tYXAsIGRyYXctPmZvcm1hdCkgPj0gMCkgewogICAgICAgICBpZiAoZHJhdy0+bmJfcGxhbmVzID09IDEpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgY29sb3ItPmNvbXBbMF0udThbcmdiYV9tYXBbaV1dID0gcmdiYVtpXTsKKyAgICAgICAgICAgICAgICBpZiAoZHJhdy0+ZGVzYy0+Y29tcFtyZ2JhX21hcFtpXV0uZGVwdGggPiA4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbG9yLT5jb21wWzBdLnUxNltyZ2JhX21hcFtpXV0gPSBjb2xvci0+Y29tcFswXS51OFtyZ2JhX21hcFtpXV0gPDwgODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICAgICAgICAgIGNvbG9yLT5jb21wW3JnYmFfbWFwW2ldXS51OFswXSA9IHJnYmFbaV07CisgICAgICAgICAgICAgICAgaWYgKGRyYXctPmRlc2MtPmNvbXBbcmdiYV9tYXBbaV1dLmRlcHRoID4gOCkKKyAgICAgICAgICAgICAgICAgICAgY29sb3ItPmNvbXBbcmdiYV9tYXBbaV1dLnUxNlswXSA9IGNvbG9yLT5jb21wW3JnYmFfbWFwW2ldXS51OFswXSA8PCAoZHJhdy0+ZGVzYy0+Y29tcFtyZ2JhX21hcFtpXV0uZGVwdGggLSA4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoZHJhdy0+bmJfcGxhbmVzID09IDMgfHwgZHJhdy0+bmJfcGxhbmVzID09IDQpIHsKKyAgICB9IGVsc2UgaWYgKGRyYXctPm5iX3BsYW5lcyA+PSAyKSB7CiAgICAgICAgIC8qIGFzc3VtZSBZVVYgKi8KLSAgICAgICAgY29sb3ItPmNvbXBbMF0udThbMF0gPSBSR0JfVE9fWV9DQ0lSKHJnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl0pOwotICAgICAgICBjb2xvci0+Y29tcFsxXS51OFswXSA9IFJHQl9UT19VX0NDSVIocmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXSwgMCk7Ci0gICAgICAgIGNvbG9yLT5jb21wWzJdLnU4WzBdID0gUkdCX1RPX1ZfQ0NJUihyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdLCAwKTsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gZHJhdy0+ZGVzYzsKKyAgICAgICAgY29sb3ItPmNvbXBbZGVzYy0+Y29tcFswXS5wbGFuZV0udThbZGVzYy0+Y29tcFswXS5vZmZzZXRdID0gUkdCX1RPX1lfQ0NJUihyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdKTsKKyAgICAgICAgY29sb3ItPmNvbXBbZGVzYy0+Y29tcFsxXS5wbGFuZV0udThbZGVzYy0+Y29tcFsxXS5vZmZzZXRdID0gUkdCX1RPX1VfQ0NJUihyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdLCAwKTsKKyAgICAgICAgY29sb3ItPmNvbXBbZGVzYy0+Y29tcFsyXS5wbGFuZV0udThbZGVzYy0+Y29tcFsyXS5vZmZzZXRdID0gUkdCX1RPX1ZfQ0NJUihyZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdLCAwKTsKICAgICAgICAgY29sb3ItPmNvbXBbM10udThbMF0gPSByZ2JhWzNdOwotICAgIH0gZWxzZSBpZiAoZHJhdy0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfR1JBWTggfHwgZHJhdy0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfR1JBWThBKSB7CisjZGVmaW5lIEVYUEFORChjb21wbikgXAorICAgICAgICBpZiAoZGVzYy0+Y29tcFtjb21wbl0uZGVwdGggPiA4KSBcCisgICAgICAgICAgICBjb2xvci0+Y29tcFtkZXNjLT5jb21wW2NvbXBuXS5wbGFuZV0udTE2W2Rlc2MtPmNvbXBbY29tcG5dLm9mZnNldF0gPSBcCisgICAgICAgICAgICBjb2xvci0+Y29tcFtkZXNjLT5jb21wW2NvbXBuXS5wbGFuZV0udThbZGVzYy0+Y29tcFtjb21wbl0ub2Zmc2V0XSA8PCBcCisgICAgICAgICAgICAgICAgKGRyYXctPmRlc2MtPmNvbXBbY29tcG5dLmRlcHRoICsgZHJhdy0+ZGVzYy0+Y29tcFtjb21wbl0uc2hpZnQgLSA4KQorICAgICAgICBFWFBBTkQoMyk7CisgICAgICAgIEVYUEFORCgyKTsKKyAgICAgICAgRVhQQU5EKDEpOworICAgICAgICBFWFBBTkQoMCk7CisgICAgfSBlbHNlIGlmIChkcmF3LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9HUkFZOCB8fCBkcmF3LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9HUkFZOEEgfHwKKyAgICAgICAgICAgICAgIGRyYXctPmZvcm1hdCA9PSBBVl9QSVhfRk1UX0dSQVkxNkxFIHx8IGRyYXctPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lBMTZMRSB8fAorICAgICAgICAgICAgICAgZHJhdy0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfR1JBWTlMRSAgfHwKKyAgICAgICAgICAgICAgIGRyYXctPmZvcm1hdCA9PSBBVl9QSVhfRk1UX0dSQVkxMExFIHx8CisgICAgICAgICAgICAgICBkcmF3LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9HUkFZMTJMRSkgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBkcmF3LT5kZXNjOwogICAgICAgICBjb2xvci0+Y29tcFswXS51OFswXSA9IFJHQl9UT19ZX0NDSVIocmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXSk7CisgICAgICAgIEVYUEFORCgwKTsKICAgICAgICAgY29sb3ItPmNvbXBbMV0udThbMF0gPSByZ2JhWzNdOworICAgICAgICBFWFBBTkQoMSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgIkNvbG9yIGNvbnZlcnNpb24gbm90IGltcGxlbWVudGVkIGZvciAlc1xuIiwgZHJhdy0+ZGVzYy0+bmFtZSk7CkBAIC0yNzIsNiArMzE1LDcgQEAKIHsKICAgICBpbnQgcGxhbmUsIHgsIHksIHdwLCBocDsKICAgICB1aW50OF90ICpwMCwgKnA7CisgICAgRkZEcmF3Q29sb3IgY29sb3JfdG1wID0gKmNvbG9yOwogCiAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZHJhdy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CiAgICAgICAgIHAwID0gcG9pbnRlcl9hdChkcmF3LCBkc3QsIGRzdF9saW5lc2l6ZSwgcGxhbmUsIGRzdF94LCBkc3RfeSk7CkBAIC0yODAsOSArMzI0LDE1IEBACiAgICAgICAgIGlmICghaHApCiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIHAgPSBwMDsKKworICAgICAgICBpZiAoSEFWRV9CSUdFTkRJQU4gJiYgZHJhdy0+ZGVzYy0+Y29tcFswXS5kZXB0aCA+IDgpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IDIqeCA8IGRyYXctPnBpeGVsc3RlcFtwbGFuZV07IHgrKykKKyAgICAgICAgICAgICAgICBjb2xvcl90bXAuY29tcFtwbGFuZV0udTE2W3hdID0gYXZfYnN3YXAxNihjb2xvcl90bXAuY29tcFtwbGFuZV0udTE2W3hdKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIGNvcHkgZmlyc3QgbGluZSBmcm9tIGNvbG9yICovCiAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3cDsgeCsrKSB7Ci0gICAgICAgICAgICBtZW1jcHkocCwgY29sb3ItPmNvbXBbcGxhbmVdLnU4LCBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdKTsKKyAgICAgICAgICAgIG1lbWNweShwLCBjb2xvcl90bXAuY29tcFtwbGFuZV0udTgsIGRyYXctPnBpeGVsc3RlcFtwbGFuZV0pOwogICAgICAgICAgICAgcCArPSBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdOwogICAgICAgICB9CiAgICAgICAgIHdwICo9IGRyYXctPnBpeGVsc3RlcFtwbGFuZV07CkBAIC0zNjEsNiArNDExLDMxIEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBibGVuZF9saW5lMTYodWludDhfdCAqZHN0LCB1bnNpZ25lZCBzcmMsIHVuc2lnbmVkIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeCwgaW50IHcsIHVuc2lnbmVkIGhzdWIsIGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CisgICAgdW5zaWduZWQgYXNyYyA9IGFscGhhICogc3JjOworICAgIHVuc2lnbmVkIHRhdSA9IDB4MTAwMDEgLSBhbHBoYTsKKyAgICBpbnQgeDsKKworICAgIGlmIChsZWZ0KSB7CisgICAgICAgIHVuc2lnbmVkIHN1YmEgPSAobGVmdCAqIGFscGhhKSA+PiBoc3ViOworICAgICAgICB1aW50MTZfdCB2YWx1ZSA9IEFWX1JMMTYoZHN0KTsKKyAgICAgICAgQVZfV0wxNihkc3QsICh2YWx1ZSAqICgweDEwMDAxIC0gc3ViYSkgKyBzcmMgKiBzdWJhKSA+PiAxNik7CisgICAgICAgIGRzdCArPSBkeDsKKyAgICB9CisgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICB1aW50MTZfdCB2YWx1ZSA9IEFWX1JMMTYoZHN0KTsKKyAgICAgICAgQVZfV0wxNihkc3QsICh2YWx1ZSAqIHRhdSArIGFzcmMpID4+IDE2KTsKKyAgICAgICAgZHN0ICs9IGR4OworICAgIH0KKyAgICBpZiAocmlnaHQpIHsKKyAgICAgICAgdW5zaWduZWQgc3ViYSA9IChyaWdodCAqIGFscGhhKSA+PiBoc3ViOworICAgICAgICB1aW50MTZfdCB2YWx1ZSA9IEFWX1JMMTYoZHN0KTsKKyAgICAgICAgQVZfV0wxNihkc3QsICh2YWx1ZSAqICgweDEwMDAxIC0gc3ViYSkgKyBzcmMgKiBzdWJhKSA+PiAxNik7CisgICAgfQorfQorCiB2b2lkIGZmX2JsZW5kX3JlY3RhbmdsZShGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbXSwgaW50IGRzdF9saW5lc2l6ZVtdLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93LCBpbnQgZHN0X2gsCkBAIC0zNzUsOSArNDUwLDE1IEBACiAgICAgY2xpcF9pbnRlcnZhbChkc3RfaCwgJnkwLCAmaCwgTlVMTCk7CiAgICAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgIWNvbG9yLT5yZ2JhWzNdKQogICAgICAgICByZXR1cm47Ci0gICAgLyogMHgxMDIwMyAqIGFscGhhICsgMiBpcyBpbiB0aGUgWyAyIDsgMHgxMDEwMTAxIC0gMiBdIHJhbmdlICovCi0gICAgYWxwaGEgPSAweDEwMjAzICogY29sb3ItPnJnYmFbM10gKyAweDI7Ci0gICAgbmJfcGxhbmVzID0gKGRyYXctPm5iX3BsYW5lcyAtIDEpIHwgMTsgLyogZWxpbWluYXRlIGFscGhhICovCisgICAgaWYgKGRyYXctPmRlc2MtPmNvbXBbMF0uZGVwdGggPD0gOCkgeworICAgICAgICAvKiAweDEwMjAzICogYWxwaGEgKyAyIGlzIGluIHRoZSBbIDIgOyAweDEwMTAxMDEgLSAyIF0gcmFuZ2UgKi8KKyAgICAgICAgYWxwaGEgPSAweDEwMjAzICogY29sb3ItPnJnYmFbM10gKyAweDI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogMHgxMDEgKiBhbHBoYSBpcyBpbiB0aGUgWyAyIDsgMHgxMDAxXSByYW5nZSAqLworICAgICAgICBhbHBoYSA9IDB4MTAxICogY29sb3ItPnJnYmFbM10gKyAweDI7CisgICAgfQorICAgIG5iX3BsYW5lcyA9IGRyYXctPm5iX3BsYW5lcyAtICEhKGRyYXctPmRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBICYmICEoZHJhdy0+ZmxhZ3MgJiBGRl9EUkFXX1BST0NFU1NfQUxQSEEpKTsKKyAgICBuYl9wbGFuZXMgKz0gIW5iX3BsYW5lczsKICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBuYl9wbGFuZXM7IHBsYW5lKyspIHsKICAgICAgICAgbmJfY29tcCA9IGRyYXctPnBpeGVsc3RlcFtwbGFuZV07CiAgICAgICAgIHAwID0gcG9pbnRlcl9hdChkcmF3LCBkc3QsIGRzdF9saW5lc2l6ZSwgcGxhbmUsIHgwLCB5MCk7CkBAIC0zODgsMjkgKzQ2OSw3NyBAQAogICAgICAgICBzdWJzYW1wbGluZ19ib3VuZHMoZHJhdy0+aHN1YltwbGFuZV0sICZ4X3N1YiwgJndfc3ViLCAmbGVmdCwgJnJpZ2h0KTsKICAgICAgICAgc3Vic2FtcGxpbmdfYm91bmRzKGRyYXctPnZzdWJbcGxhbmVdLCAmeV9zdWIsICZoX3N1YiwgJnRvcCwgJmJvdHRvbSk7CiAgICAgICAgIGZvciAoY29tcCA9IDA7IGNvbXAgPCBuYl9jb21wOyBjb21wKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBkZXB0aCA9IGRyYXctPmRlc2MtPmNvbXBbY29tcF0uZGVwdGg7CisKICAgICAgICAgICAgIGlmICghY29tcG9uZW50X3VzZWQoZHJhdywgcGxhbmUsIGNvbXApKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgcCA9IHAwICsgY29tcDsKICAgICAgICAgICAgIGlmICh0b3ApIHsKLSAgICAgICAgICAgICAgICBibGVuZF9saW5lKHAsIGNvbG9yLT5jb21wW3BsYW5lXS51OFtjb21wXSwgYWxwaGEgPj4gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPnBpeGVsc3RlcFtwbGFuZV0sIHdfc3ViLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy0+aHN1YltwbGFuZV0sIGxlZnQsIHJpZ2h0KTsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggPD0gOCkgeworICAgICAgICAgICAgICAgICAgICBibGVuZF9saW5lKHAsIGNvbG9yLT5jb21wW3BsYW5lXS51OFtjb21wXSwgYWxwaGEgPj4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLCB3X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgbGVmdCwgcmlnaHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJsZW5kX2xpbmUxNihwLCBjb2xvci0+Y29tcFtwbGFuZV0udTE2W2NvbXBdLCBhbHBoYSA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwgd19zdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgbGVmdCwgcmlnaHQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwICs9IGRzdF9saW5lc2l6ZVtwbGFuZV07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaF9zdWI7IHkrKykgewotICAgICAgICAgICAgICAgIGJsZW5kX2xpbmUocCwgY29sb3ItPmNvbXBbcGxhbmVdLnU4W2NvbXBdLCBhbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPnBpeGVsc3RlcFtwbGFuZV0sIHdfc3ViLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy0+aHN1YltwbGFuZV0sIGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgICAgICAgICBwICs9IGRzdF9saW5lc2l6ZVtwbGFuZV07CisgICAgICAgICAgICBpZiAoZGVwdGggPD0gOCkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoX3N1YjsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsZW5kX2xpbmUocCwgY29sb3ItPmNvbXBbcGxhbmVdLnU4W2NvbXBdLCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLCB3X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgbGVmdCwgcmlnaHQpOworICAgICAgICAgICAgICAgICAgICBwICs9IGRzdF9saW5lc2l6ZVtwbGFuZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaF9zdWI7IHkrKykgeworICAgICAgICAgICAgICAgICAgICBibGVuZF9saW5lMTYocCwgY29sb3ItPmNvbXBbcGxhbmVdLnUxNltjb21wXSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLCB3X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBsZWZ0LCByaWdodCk7CisgICAgICAgICAgICAgICAgICAgIHAgKz0gZHN0X2xpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYm90dG9tKQotICAgICAgICAgICAgICAgIGJsZW5kX2xpbmUocCwgY29sb3ItPmNvbXBbcGxhbmVdLnU4W2NvbXBdLCBhbHBoYSA+PiAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwgd19zdWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgbGVmdCwgcmlnaHQpOworICAgICAgICAgICAgaWYgKGJvdHRvbSkgeworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8PSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGJsZW5kX2xpbmUocCwgY29sb3ItPmNvbXBbcGxhbmVdLnU4W2NvbXBdLCBhbHBoYSA+PiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPnBpeGVsc3RlcFtwbGFuZV0sIHdfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBsZWZ0LCByaWdodCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYmxlbmRfbGluZTE2KHAsIGNvbG9yLT5jb21wW3BsYW5lXS51MTZbY29tcF0sIGFscGhhID4+IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLCB3X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBsZWZ0LCByaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBibGVuZF9waXhlbDE2KHVpbnQ4X3QgKmRzdCwgdW5zaWduZWQgc3JjLCB1bnNpZ25lZCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFzaywgaW50IG1hc2tfbGluZXNpemUsIGludCBsMmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB3LCB1bnNpZ25lZCBoLCB1bnNpZ25lZCBzaGlmdCwgdW5zaWduZWQgeG0wKQoreworICAgIHVuc2lnbmVkIHhtLCB4LCB5LCB0ID0gMDsKKyAgICB1bnNpZ25lZCB4bXNoZiA9IDMgLSBsMmRlcHRoOworICAgIHVuc2lnbmVkIHhtbW9kID0gNyA+PiBsMmRlcHRoOworICAgIHVuc2lnbmVkIG1iaXRzID0gKDEgPDwgKDEgPDwgbDJkZXB0aCkpIC0gMTsKKyAgICB1bnNpZ25lZCBtbXVsdCA9IDI1NSAvIG1iaXRzOworICAgIHVpbnQxNl90IHZhbHVlID0gQVZfUkwxNihkc3QpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICB4bSA9IHhtMDsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgdCArPSAoKG1hc2tbeG0gPj4geG1zaGZdID4+ICgofnhtICYgeG1tb2QpIDw8IGwyZGVwdGgpKSAmIG1iaXRzKQorICAgICAgICAgICAgICAgICAqIG1tdWx0OworICAgICAgICAgICAgeG0rKzsKKyAgICAgICAgfQorICAgICAgICBtYXNrICs9IG1hc2tfbGluZXNpemU7CisgICAgfQorICAgIGFscGhhID0gKHQgPj4gc2hpZnQpICogYWxwaGE7CisgICAgQVZfV0wxNihkc3QsICgoMHgxMDAwMSAtIGFscGhhKSAqIHZhbHVlICsgYWxwaGEgKiBzcmMpID4+IDE2KTsKK30KKwogc3RhdGljIHZvaWQgYmxlbmRfcGl4ZWwodWludDhfdCAqZHN0LCB1bnNpZ25lZCBzcmMsIHVuc2lnbmVkIGFscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFzaywgaW50IG1hc2tfbGluZXNpemUsIGludCBsMmRlcHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgdywgdW5zaWduZWQgaCwgdW5zaWduZWQgc2hpZnQsIHVuc2lnbmVkIHhtMCkKQEAgLTQzNCw2ICs1NjMsMzEgQEAKICAgICAqZHN0ID0gKCgweDEwMTAxMDEgLSBhbHBoYSkgKiAqZHN0ICsgYWxwaGEgKiBzcmMpID4+IDI0OwogfQogCitzdGF0aWMgdm9pZCBibGVuZF9saW5lX2h2MTYodWludDhfdCAqZHN0LCBpbnQgZHN0X2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNyYywgdW5zaWduZWQgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWFzaywgaW50IG1hc2tfbGluZXNpemUsIGludCBsMmRlcHRoLCBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoc3ViLCB1bnNpZ25lZCB2c3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4bSwgaW50IGxlZnQsIGludCByaWdodCwgaW50IGhiYW5kKQoreworICAgIGludCB4OworCisgICAgaWYgKGxlZnQpIHsKKyAgICAgICAgYmxlbmRfcGl4ZWwxNihkc3QsIHNyYywgYWxwaGEsIG1hc2ssIG1hc2tfbGluZXNpemUsIGwyZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgbGVmdCwgaGJhbmQsIGhzdWIgKyB2c3ViLCB4bSk7CisgICAgICAgIGRzdCArPSBkc3RfZGVsdGE7CisgICAgICAgIHhtICs9IGxlZnQ7CisgICAgfQorICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgYmxlbmRfcGl4ZWwxNihkc3QsIHNyYywgYWxwaGEsIG1hc2ssIG1hc2tfbGluZXNpemUsIGwyZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgMSA8PCBoc3ViLCBoYmFuZCwgaHN1YiArIHZzdWIsIHhtKTsKKyAgICAgICAgZHN0ICs9IGRzdF9kZWx0YTsKKyAgICAgICAgeG0gKz0gMSA8PCBoc3ViOworICAgIH0KKyAgICBpZiAocmlnaHQpCisgICAgICAgIGJsZW5kX3BpeGVsMTYoZHN0LCBzcmMsIGFscGhhLCBtYXNrLCBtYXNrX2xpbmVzaXplLCBsMmRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0LCBoYmFuZCwgaHN1YiArIHZzdWIsIHhtKTsKK30KKwogc3RhdGljIHZvaWQgYmxlbmRfbGluZV9odih1aW50OF90ICpkc3QsIGludCBkc3RfZGVsdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNyYywgdW5zaWduZWQgYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1hc2ssIGludCBtYXNrX2xpbmVzaXplLCBpbnQgbDJkZXB0aCwgaW50IHcsCkBAIC00NzQsMTAgKzYyOCwxNSBAQAogICAgIG1hc2sgKz0geW0wICogbWFza19saW5lc2l6ZTsKICAgICBpZiAobWFza193IDw9IDAgfHwgbWFza19oIDw9IDAgfHwgIWNvbG9yLT5yZ2JhWzNdKQogICAgICAgICByZXR1cm47Ci0gICAgLyogYWxwaGEgaXMgaW4gdGhlIFsgMCA7IDB4MTAyMDMgXSByYW5nZSwKLSAgICAgICBhbHBoYSAqIG1hc2sgaXMgaW4gdGhlIFsgMCA7IDB4MTAxMDEwMSAtIDQgXSByYW5nZSAqLwotICAgIGFscGhhID0gKDB4MTAzMDcgKiBjb2xvci0+cmdiYVszXSArIDB4MykgPj4gODsKLSAgICBuYl9wbGFuZXMgPSAoZHJhdy0+bmJfcGxhbmVzIC0gMSkgfCAxOyAvKiBlbGltaW5hdGUgYWxwaGEgKi8KKyAgICBpZiAoZHJhdy0+ZGVzYy0+Y29tcFswXS5kZXB0aCA8PSA4KSB7CisgICAgICAgIC8qIGFscGhhIGlzIGluIHRoZSBbIDAgOyAweDEwMjAzIF0gcmFuZ2UsCisgICAgICAgICAgIGFscGhhICogbWFzayBpcyBpbiB0aGUgWyAwIDsgMHgxMDEwMTAxIC0gNCBdIHJhbmdlICovCisgICAgICAgIGFscGhhID0gKDB4MTAzMDcgKiBjb2xvci0+cmdiYVszXSArIDB4MykgPj4gODsKKyAgICB9IGVsc2UgeworICAgICAgICBhbHBoYSA9ICgweDEwMSAqIGNvbG9yLT5yZ2JhWzNdICsgMHgyKSA+PiA4OworICAgIH0KKyAgICBuYl9wbGFuZXMgPSBkcmF3LT5uYl9wbGFuZXMgLSAhIShkcmF3LT5kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSAmJiAhKGRyYXctPmZsYWdzICYgRkZfRFJBV19QUk9DRVNTX0FMUEhBKSk7CisgICAgbmJfcGxhbmVzICs9ICFuYl9wbGFuZXM7CiAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgbmJfcGxhbmVzOyBwbGFuZSsrKSB7CiAgICAgICAgIG5iX2NvbXAgPSBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdOwogICAgICAgICBwMCA9IHBvaW50ZXJfYXQoZHJhdywgZHN0LCBkc3RfbGluZXNpemUsIHBsYW5lLCB4MCwgeTApOwpAQCAtNDg4LDM0ICs2NDcsNjUgQEAKICAgICAgICAgc3Vic2FtcGxpbmdfYm91bmRzKGRyYXctPmhzdWJbcGxhbmVdLCAmeF9zdWIsICZ3X3N1YiwgJmxlZnQsICZyaWdodCk7CiAgICAgICAgIHN1YnNhbXBsaW5nX2JvdW5kcyhkcmF3LT52c3ViW3BsYW5lXSwgJnlfc3ViLCAmaF9zdWIsICZ0b3AsICZib3R0b20pOwogICAgICAgICBmb3IgKGNvbXAgPSAwOyBjb21wIDwgbmJfY29tcDsgY29tcCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgZGVwdGggPSBkcmF3LT5kZXNjLT5jb21wW2NvbXBdLmRlcHRoOworCiAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudF91c2VkKGRyYXcsIHBsYW5lLCBjb21wKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIHAgPSBwMCArIGNvbXA7CiAgICAgICAgICAgICBtID0gbWFzazsKICAgICAgICAgICAgIGlmICh0b3ApIHsKLSAgICAgICAgICAgICAgICBibGVuZF9saW5lX2h2KHAsIGRyYXctPnBpeGVsc3RlcFtwbGFuZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci0+Y29tcFtwbGFuZV0udThbY29tcF0sIGFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwgbWFza19saW5lc2l6ZSwgbDJkZXB0aCwgd19zdWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgZHJhdy0+dnN1YltwbGFuZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bTAsIGxlZnQsIHJpZ2h0LCB0b3ApOworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8PSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGJsZW5kX2xpbmVfaHYocCwgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci0+Y29tcFtwbGFuZV0udThbY29tcF0sIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sIG1hc2tfbGluZXNpemUsIGwyZGVwdGgsIHdfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBkcmF3LT52c3ViW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bTAsIGxlZnQsIHJpZ2h0LCB0b3ApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJsZW5kX2xpbmVfaHYxNihwLCBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItPmNvbXBbcGxhbmVdLnUxNltjb21wXSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCBtYXNrX2xpbmVzaXplLCBsMmRlcHRoLCB3X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBkcmF3LT52c3ViW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtMCwgbGVmdCwgcmlnaHQsIHRvcCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHAgKz0gZHN0X2xpbmVzaXplW3BsYW5lXTsKICAgICAgICAgICAgICAgICBtICs9IHRvcCAqIG1hc2tfbGluZXNpemU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaF9zdWI7IHkrKykgewotICAgICAgICAgICAgICAgIGJsZW5kX2xpbmVfaHYocCwgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLT5jb21wW3BsYW5lXS51OFtjb21wXSwgYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCBtYXNrX2xpbmVzaXplLCBsMmRlcHRoLCB3X3N1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBkcmF3LT52c3ViW3BsYW5lXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtMCwgbGVmdCwgcmlnaHQsIDEgPDwgZHJhdy0+dnN1YltwbGFuZV0pOwotICAgICAgICAgICAgICAgIHAgKz0gZHN0X2xpbmVzaXplW3BsYW5lXTsKLSAgICAgICAgICAgICAgICBtICs9IG1hc2tfbGluZXNpemUgPDwgZHJhdy0+dnN1YltwbGFuZV07CisgICAgICAgICAgICBpZiAoZGVwdGggPD0gOCkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoX3N1YjsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsZW5kX2xpbmVfaHYocCwgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci0+Y29tcFtwbGFuZV0udThbY29tcF0sIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sIG1hc2tfbGluZXNpemUsIGwyZGVwdGgsIHdfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBkcmF3LT52c3ViW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bTAsIGxlZnQsIHJpZ2h0LCAxIDw8IGRyYXctPnZzdWJbcGxhbmVdKTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBkc3RfbGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgICAgICBtICs9IG1hc2tfbGluZXNpemUgPDwgZHJhdy0+dnN1YltwbGFuZV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaF9zdWI7IHkrKykgeworICAgICAgICAgICAgICAgICAgICBibGVuZF9saW5lX2h2MTYocCwgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLT5jb21wW3BsYW5lXS51MTZbY29tcF0sIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwgbWFza19saW5lc2l6ZSwgbDJkZXB0aCwgd19zdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgZHJhdy0+dnN1YltwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bTAsIGxlZnQsIHJpZ2h0LCAxIDw8IGRyYXctPnZzdWJbcGxhbmVdKTsKKyAgICAgICAgICAgICAgICAgICAgcCArPSBkc3RfbGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgICAgICBtICs9IG1hc2tfbGluZXNpemUgPDwgZHJhdy0+dnN1YltwbGFuZV07CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJvdHRvbSkKLSAgICAgICAgICAgICAgICBibGVuZF9saW5lX2h2KHAsIGRyYXctPnBpeGVsc3RlcFtwbGFuZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci0+Y29tcFtwbGFuZV0udThbY29tcF0sIGFscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSwgbWFza19saW5lc2l6ZSwgbDJkZXB0aCwgd19zdWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3LT5oc3ViW3BsYW5lXSwgZHJhdy0+dnN1YltwbGFuZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bTAsIGxlZnQsIHJpZ2h0LCBib3R0b20pOworICAgICAgICAgICAgaWYgKGJvdHRvbSkgeworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA8PSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGJsZW5kX2xpbmVfaHYocCwgZHJhdy0+cGl4ZWxzdGVwW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci0+Y29tcFtwbGFuZV0udThbY29tcF0sIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0sIG1hc2tfbGluZXNpemUsIGwyZGVwdGgsIHdfc3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBkcmF3LT52c3ViW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bTAsIGxlZnQsIHJpZ2h0LCBib3R0b20pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJsZW5kX2xpbmVfaHYxNihwLCBkcmF3LT5waXhlbHN0ZXBbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItPmNvbXBbcGxhbmVdLnUxNltjb21wXSwgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLCBtYXNrX2xpbmVzaXplLCBsMmRlcHRoLCB3X3N1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXctPmhzdWJbcGxhbmVdLCBkcmF3LT52c3ViW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtMCwgbGVmdCwgcmlnaHQsIGJvdHRvbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQpAQCAtNTQ1LDQzICs3MzUsMyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgcmV0dXJuIGZtdHM7CiB9Ci0KLSNpZmRlZiBURVNUCi0KLSN1bmRlZiBwcmludGYKLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZjsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7Ci0gICAgRkZEcmF3Q29udGV4dCBkcmF3OwotICAgIEZGRHJhd0NvbG9yIGNvbG9yOwotICAgIGludCByLCBpOwotCi0gICAgZm9yIChmID0gMDsgYXZfcGl4X2ZtdF9kZXNjX2dldChmKTsgZisrKSB7Ci0gICAgICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGYpOwotICAgICAgICBpZiAoIWRlc2MtPm5hbWUpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcHJpbnRmKCJUZXN0aW5nICVzLi4uJSpzIiwgZGVzYy0+bmFtZSwKLSAgICAgICAgICAgICAgIChpbnQpKDE2IC0gc3RybGVuKGRlc2MtPm5hbWUpKSwgIiIpOwotICAgICAgICByID0gZmZfZHJhd19pbml0KCZkcmF3LCBmLCAwKTsKLSAgICAgICAgaWYgKHIgPCAwKSB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlsxMjhdOwotICAgICAgICAgICAgYXZfc3RyZXJyb3IociwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgICAgICAgICBwcmludGYoIm5vOiAlc1xuIiwgYnVmKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGZmX2RyYXdfY29sb3IoJmRyYXcsICZjb2xvciwgKHVpbnQ4X3RbXSkgeyAxLCAwLCAwLCAxIH0pOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGNvbG9yKTsgaSsrKQotICAgICAgICAgICAgaWYgKCgodWludDhfdCAqKSZjb2xvcilbaV0gIT0gMTI4KQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoaSA9PSBzaXplb2YoY29sb3IpKSB7Ci0gICAgICAgICAgICBwcmludGYoImZhbGxiYWNrIGNvbG9yXG4iKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHByaW50Zigib2tcbiIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9kcmF3dXRpbHMuaCBiL2xpYmF2ZmlsdGVyL2RyYXd1dGlscy5oCmluZGV4IGUyNDdkZDYuLmNmNTM2MzUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2RyYXd1dGlscy5oCisrKyBiL2xpYmF2ZmlsdGVyL2RyYXd1dGlscy5oCkBAIC01NSwyMyArNTUsMjkgQEAKICAgICB1aW50OF90IHZzdWJbTUFYX1BMQU5FU107ICAvKjwgdmVydGljYWwgc3Vic2FtcGxpbmcgKi8KICAgICB1aW50OF90IGhzdWJfbWF4OwogICAgIHVpbnQ4X3QgdnN1Yl9tYXg7CisgICAgdW5zaWduZWQgZmxhZ3M7CiB9IEZGRHJhd0NvbnRleHQ7CiAKIHR5cGVkZWYgc3RydWN0IEZGRHJhd0NvbG9yIHsKICAgICB1aW50OF90IHJnYmFbNF07CiAgICAgdW5pb24gewotICAgICAgICB1aW50MzJfdCB1MzI7Ci0gICAgICAgIHVpbnQxNl90IHUxNjsKLSAgICAgICAgdWludDhfdCAgdThbNF07CisgICAgICAgIHVpbnQzMl90IHUzMls0XTsKKyAgICAgICAgdWludDE2X3QgdTE2WzhdOworICAgICAgICB1aW50OF90ICB1OFsxNl07CiAgICAgfSBjb21wW01BWF9QTEFORVNdOwogfSBGRkRyYXdDb2xvcjsKIAogLyoqCisgICogUHJvY2VzcyBhbHBoYSBwaXhlbCBjb21wb25lbnQuCisgICovCisjZGVmaW5lIEZGX0RSQVdfUFJPQ0VTU19BTFBIQSAxCisKKy8qKgogICogSW5pdCBhIGRyYXcgY29udGV4dC4KICAqCiAgKiBPbmx5IGEgbGltaXRlZCBudW1iZXIgb2YgcGl4ZWwgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLCBpZiBmb3JtYXQgaXMgbm90CiAgKiBzdXBwb3J0ZWQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVycm9yLgotICogTm8gZmxhZ3MgY3VycmVudGx5IGRlZmluZWQuCisgKiBmbGFncyBpcyBjb21iaW5hdGlvbiBvZiBGRl9EUkFXXyogZmxhZ3MuCiAgKiBAcmV0dXJuICAwIGZvciBzdWNjZXNzLCA8IDAgZm9yIGVycm9yCiAgKi8KIGludCBmZl9kcmF3X2luaXQoRkZEcmF3Q29udGV4dCAqZHJhdywgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCwgdW5zaWduZWQgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZHVhbGlucHV0LmMgYi9saWJhdmZpbHRlci9kdWFsaW5wdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwNzhhMi4uMDAwMDAwMAotLS0gYS9saWJhdmZpbHRlci9kdWFsaW5wdXQuYworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgImR1YWxpbnB1dC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKLQotc3RhdGljIGludCBwcm9jZXNzX2ZyYW1lKEZGRnJhbWVTeW5jICpmcykKLXsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGZzLT5wYXJlbnQ7Ci0gICAgRkZEdWFsSW5wdXRDb250ZXh0ICpzID0gZnMtPm9wYXF1ZTsKLSAgICBBVkZyYW1lICptYWlucGljID0gTlVMTCwgKnNlY29uZHBpYyA9IE5VTEw7Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoJnMtPmZzLCAwLCAmbWFpbnBpYywgICAxKSkgPCAwIHx8Ci0gICAgICAgIChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMSwgJnNlY29uZHBpYywgMCkpIDwgMCkgewotICAgICAgICBhdl9mcmFtZV9mcmVlKCZtYWlucGljKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgYXZfYXNzZXJ0MChtYWlucGljKTsKLSAgICBtYWlucGljLT5wdHMgPSBhdl9yZXNjYWxlX3Eocy0+ZnMucHRzLCBzLT5mcy50aW1lX2Jhc2UsIGN0eC0+b3V0cHV0c1swXS0+dGltZV9iYXNlKTsKLSAgICBpZiAoc2Vjb25kcGljICYmICFjdHgtPmlzX2Rpc2FibGVkKQotICAgICAgICBtYWlucGljID0gcy0+cHJvY2VzcyhjdHgsIG1haW5waWMsIHNlY29uZHBpYyk7Ci0gICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgbWFpbnBpYyk7Ci0gICAgYXZfYXNzZXJ0MShyZXQgIT0gQVZFUlJPUihFQUdBSU4pKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgZmZfZHVhbGlucHV0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZGRHVhbElucHV0Q29udGV4dCAqcykKLXsKLSAgICBGRkZyYW1lU3luY0luICppbjsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfaW5pdCgmcy0+ZnMsIGN0eCwgMikpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGluID0gcy0+ZnMuaW47Ci0gICAgcy0+ZnMub3BhcXVlID0gczsKLSAgICBzLT5mcy5vbl9ldmVudCA9IHByb2Nlc3NfZnJhbWU7Ci0gICAgaW5bMF0udGltZV9iYXNlID0gY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZTsKLSAgICBpblsxXS50aW1lX2Jhc2UgPSBjdHgtPmlucHV0c1sxXS0+dGltZV9iYXNlOwotICAgIGluWzBdLnN5bmMgICA9IDI7Ci0gICAgaW5bMF0uYmVmb3JlID0gRVhUX1NUT1A7Ci0gICAgaW5bMF0uYWZ0ZXIgID0gRVhUX0lORklOSVRZOwotICAgIGluWzFdLnN5bmMgICA9IDE7Ci0gICAgaW5bMV0uYmVmb3JlID0gRVhUX05VTEw7Ci0gICAgaW5bMV0uYWZ0ZXIgID0gRVhUX0lORklOSVRZOwotCi0gICAgaWYgKHMtPnNob3J0ZXN0KQotICAgICAgICBpblswXS5hZnRlciA9IGluWzFdLmFmdGVyID0gRVhUX1NUT1A7Ci0gICAgaWYgKCFzLT5yZXBlYXRsYXN0KSB7Ci0gICAgICAgIGluWzFdLmFmdGVyID0gRVhUX05VTEw7Ci0gICAgICAgIGluWzFdLnN5bmMgID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2NvbmZpZ3VyZSgmcy0+ZnMpOwotfQotCi1pbnQgZmZfZHVhbGlucHV0X2ZpbHRlcl9mcmFtZShGRkR1YWxJbnB1dENvbnRleHQgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKLXsKLSAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2ZpbHRlcl9mcmFtZSgmcy0+ZnMsIGlubGluaywgaW4pOwotfQotCi1pbnQgZmZfZHVhbGlucHV0X3JlcXVlc3RfZnJhbWUoRkZEdWFsSW5wdXRDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKm91dGxpbmspCi17Ci0gICAgcmV0dXJuIGZmX2ZyYW1lc3luY19yZXF1ZXN0X2ZyYW1lKCZzLT5mcywgb3V0bGluayk7Ci19Ci0KLXZvaWQgZmZfZHVhbGlucHV0X3VuaW5pdChGRkR1YWxJbnB1dENvbnRleHQgKnMpCi17Ci0gICAgZmZfZnJhbWVzeW5jX3VuaW5pdCgmcy0+ZnMpOwotfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZHVhbGlucHV0LmggYi9saWJhdmZpbHRlci9kdWFsaW5wdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmMjNlNi4uMDAwMDAwMAotLS0gYS9saWJhdmZpbHRlci9kdWFsaW5wdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogRG91YmxlIGlucHV0IHN0cmVhbXMgaGVscGVyIGZvciBmaWx0ZXJzCi0gKi8KLQotI2lmbmRlZiBBVkZJTFRFUl9EVUFMSU5QVVRfSAotI2RlZmluZSBBVkZJTFRFUl9EVUFMSU5QVVRfSAotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSAiYnVmZmVycXVldWUuaCIKLSNpbmNsdWRlICJmcmFtZXN5bmMuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgRkZGcmFtZVN5bmMgZnM7Ci0KLSAgICBBVkZyYW1lICooKnByb2Nlc3MpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICptYWluLCBjb25zdCBBVkZyYW1lICpzZWNvbmQpOwotICAgIGludCBzaG9ydGVzdDsgICAgICAgICAgICAgICAvLy88IHRlcm1pbmF0ZSBzdHJlYW0gd2hlbiB0aGUgc2Vjb25kIGlucHV0IHRlcm1pbmF0ZXMKLSAgICBpbnQgcmVwZWF0bGFzdDsgICAgICAgICAgICAgLy8vPCByZXBlYXQgbGFzdCBzZWNvbmQgZnJhbWUKLX0gRkZEdWFsSW5wdXRDb250ZXh0OwotCi1pbnQgZmZfZHVhbGlucHV0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZGRHVhbElucHV0Q29udGV4dCAqcyk7Ci1pbnQgZmZfZHVhbGlucHV0X2ZpbHRlcl9mcmFtZShGRkR1YWxJbnB1dENvbnRleHQgKnMsIEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbik7Ci1pbnQgZmZfZHVhbGlucHV0X3JlcXVlc3RfZnJhbWUoRkZEdWFsSW5wdXRDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKm91dGxpbmspOwotdm9pZCBmZl9kdWFsaW5wdXRfdW5pbml0KEZGRHVhbElucHV0Q29udGV4dCAqcyk7Ci0KLSNlbmRpZiAvKiBBVkZJTFRFUl9EVUFMSU5QVVRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZWJ1cjEyOC5jIGIvbGliYXZmaWx0ZXIvZWJ1cjEyOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMTAwODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9lYnVyMTI4LmMKQEAgLTAsMCArMSw3NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgSmFuIEtva2Vtw7xsbGVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICoKKyAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBsaWJlYnVyMTI4IHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly9naXRodWIuY29tL2ppaXh5ai9saWJlYnVyMTI4LworICoKKyAqIExpYmVidXIxMjggaGFzIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0OgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCisgKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCisgKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCisgKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKKyAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KKyAqIFRIRSBTT0ZUV0FSRS4KKyovCisKKyNpbmNsdWRlICJlYnVyMTI4LmgiCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4gICAgICAgICAgICAgICAvKiBZb3UgbWF5IGhhdmUgdG8gZGVmaW5lIF9VU0VfTUFUSF9ERUZJTkVTIGlmIHlvdSB1c2UgTVNWQyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCisKKyNkZWZpbmUgQ0hFQ0tfRVJST1IoY29uZGl0aW9uLCBlcnJvcmNvZGUsIGdvdG9fcG9pbnQpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChjb25kaXRpb24pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlcnJjb2RlID0gKGVycm9yY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ290byBnb3RvX3BvaW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIEFMTU9TVF9aRVJPIDAuMDAwMDAxCisKKyNkZWZpbmUgUkVMQVRJVkVfR0FURSAgICAgICAgICgtMTAuMCkKKyNkZWZpbmUgUkVMQVRJVkVfR0FURV9GQUNUT1IgIHBvdygxMC4wLCBSRUxBVElWRV9HQVRFIC8gMTAuMCkKKyNkZWZpbmUgTUlOVVNfMjBEQiAgICAgICAgICAgIHBvdygxMC4wLCAtMjAuMCAvIDEwLjApCisKK3N0cnVjdCBGRkVCVVIxMjhTdGF0ZUludGVybmFsIHsKKyAgICAvKiogRmlsdGVyZWQgYXVkaW8gZGF0YSAodXNlZCBhcyByaW5nIGJ1ZmZlcikuICovCisgICAgZG91YmxlICphdWRpb19kYXRhOworICAgIC8qKiBTaXplIG9mIGF1ZGlvX2RhdGEgYXJyYXkuICovCisgICAgc2l6ZV90IGF1ZGlvX2RhdGFfZnJhbWVzOworICAgIC8qKiBDdXJyZW50IGluZGV4IGZvciBhdWRpb19kYXRhLiAqLworICAgIHNpemVfdCBhdWRpb19kYXRhX2luZGV4OworICAgIC8qKiBIb3cgbWFueSBmcmFtZXMgYXJlIG5lZWRlZCBmb3IgYSBnYXRpbmcgYmxvY2suIFdpbGwgY29ycmVzcG9uZCB0byA0MDBtcworICAgICAqICBvZiBhdWRpbyBhdCBpbml0aWFsaXphdGlvbiwgYW5kIDEwMG1zIGFmdGVyIHRoZSBmaXJzdCBibG9jayAoNzUlIG92ZXJsYXAKKyAgICAgKiAgYXMgc3BlY2lmaWVkIGluIHRoZSAyMDExIHJldmlzaW9uIG9mIEJTMTc3MCkuICovCisgICAgdW5zaWduZWQgbG9uZyBuZWVkZWRfZnJhbWVzOworICAgIC8qKiBUaGUgY2hhbm5lbCBtYXAuIEhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZXJlIGFyZSBjaGFubmVscy4gKi8KKyAgICBpbnQgKmNoYW5uZWxfbWFwOworICAgIC8qKiBIb3cgbWFueSBzYW1wbGVzIGZpdCBpbiAxMDBtcyAocm91bmRlZCkuICovCisgICAgdW5zaWduZWQgbG9uZyBzYW1wbGVzX2luXzEwMG1zOworICAgIC8qKiBCUy4xNzcwIGZpbHRlciBjb2VmZmljaWVudHMgKG5vbWluYXRvcikuICovCisgICAgZG91YmxlIGJbNV07CisgICAgLyoqIEJTLjE3NzAgZmlsdGVyIGNvZWZmaWNpZW50cyAoZGVub21pbmF0b3IpLiAqLworICAgIGRvdWJsZSBhWzVdOworICAgIC8qKiBCUy4xNzcwIGZpbHRlciBzdGF0ZS4gKi8KKyAgICBkb3VibGUgdls1XVs1XTsKKyAgICAvKiogSGlzdG9ncmFtcywgdXNlZCB0byBjYWxjdWxhdGUgTFJBLiAqLworICAgIHVuc2lnbmVkIGxvbmcgKmJsb2NrX2VuZXJneV9oaXN0b2dyYW07CisgICAgdW5zaWduZWQgbG9uZyAqc2hvcnRfdGVybV9ibG9ja19lbmVyZ3lfaGlzdG9ncmFtOworICAgIC8qKiBLZWVwcyB0cmFjayBvZiB3aGVuIGEgbmV3IHNob3J0IHRlcm0gYmxvY2sgaXMgbmVlZGVkLiAqLworICAgIHNpemVfdCBzaG9ydF90ZXJtX2ZyYW1lX2NvdW50ZXI7CisgICAgLyoqIE1heGltdW0gc2FtcGxlIHBlYWssIG9uZSBwZXIgY2hhbm5lbCAqLworICAgIGRvdWJsZSAqc2FtcGxlX3BlYWs7CisgICAgLyoqIFRoZSBtYXhpbXVtIHdpbmRvdyBkdXJhdGlvbiBpbiBtcy4gKi8KKyAgICB1bnNpZ25lZCBsb25nIHdpbmRvdzsKKyAgICAvKiogRGF0YSBwb2ludGVyIGFycmF5IGZvciBpbnRlcmxlYXZlZCBkYXRhICovCisgICAgdm9pZCAqKmRhdGFfcHRyczsKK307CisKK3N0YXRpYyBBVk9uY2UgaGlzdG9ncmFtX2luaXQgPSBBVl9PTkNFX0lOSVQ7CitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDMyLCBkb3VibGUsIGhpc3RvZ3JhbV9lbmVyZ2llcylbMTAwMF07CitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDMyLCBkb3VibGUsIGhpc3RvZ3JhbV9lbmVyZ3lfYm91bmRhcmllcylbMTAwMV07CisKK3N0YXRpYyB2b2lkIGVidXIxMjhfaW5pdF9maWx0ZXIoRkZFQlVSMTI4U3RhdGUgKiBzdCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGRvdWJsZSBmMCA9IDE2ODEuOTc0NDUwOTU1NTMzOworICAgIGRvdWJsZSBHID0gMy45OTk4NDM4NTM5NzMzNDc7CisgICAgZG91YmxlIFEgPSAwLjcwNzE3NTIzNjk1NTQxOTY7CisKKyAgICBkb3VibGUgSyA9IHRhbihNX1BJICogZjAgLyAoZG91YmxlKSBzdC0+c2FtcGxlcmF0ZSk7CisgICAgZG91YmxlIFZoID0gcG93KDEwLjAsIEcgLyAyMC4wKTsKKyAgICBkb3VibGUgVmIgPSBwb3coVmgsIDAuNDk5NjY2Nzc0MTU0NTQxNik7CisKKyAgICBkb3VibGUgcGJbM10gPSB7IDAuMCwgMC4wLCAwLjAgfTsKKyAgICBkb3VibGUgcGFbM10gPSB7IDEuMCwgMC4wLCAwLjAgfTsKKyAgICBkb3VibGUgcmJbM10gPSB7IDEuMCwgLTIuMCwgMS4wIH07CisgICAgZG91YmxlIHJhWzNdID0geyAxLjAsIDAuMCwgMC4wIH07CisKKyAgICBkb3VibGUgYTAgPSAxLjAgKyBLIC8gUSArIEsgKiBLOworICAgIHBiWzBdID0gKFZoICsgVmIgKiBLIC8gUSArIEsgKiBLKSAvIGEwOworICAgIHBiWzFdID0gMi4wICogKEsgKiBLIC0gVmgpIC8gYTA7CisgICAgcGJbMl0gPSAoVmggLSBWYiAqIEsgLyBRICsgSyAqIEspIC8gYTA7CisgICAgcGFbMV0gPSAyLjAgKiAoSyAqIEsgLSAxLjApIC8gYTA7CisgICAgcGFbMl0gPSAoMS4wIC0gSyAvIFEgKyBLICogSykgLyBhMDsKKworICAgIGYwID0gMzguMTM1NDcwODc2MDI0NDQ7CisgICAgUSA9IDAuNTAwMzI3MDM3MzIzODc3MzsKKyAgICBLID0gdGFuKE1fUEkgKiBmMCAvIChkb3VibGUpIHN0LT5zYW1wbGVyYXRlKTsKKworICAgIHJhWzFdID0gMi4wICogKEsgKiBLIC0gMS4wKSAvICgxLjAgKyBLIC8gUSArIEsgKiBLKTsKKyAgICByYVsyXSA9ICgxLjAgLSBLIC8gUSArIEsgKiBLKSAvICgxLjAgKyBLIC8gUSArIEsgKiBLKTsKKworICAgIHN0LT5kLT5iWzBdID0gcGJbMF0gKiByYlswXTsKKyAgICBzdC0+ZC0+YlsxXSA9IHBiWzBdICogcmJbMV0gKyBwYlsxXSAqIHJiWzBdOworICAgIHN0LT5kLT5iWzJdID0gcGJbMF0gKiByYlsyXSArIHBiWzFdICogcmJbMV0gKyBwYlsyXSAqIHJiWzBdOworICAgIHN0LT5kLT5iWzNdID0gcGJbMV0gKiByYlsyXSArIHBiWzJdICogcmJbMV07CisgICAgc3QtPmQtPmJbNF0gPSBwYlsyXSAqIHJiWzJdOworCisgICAgc3QtPmQtPmFbMF0gPSBwYVswXSAqIHJhWzBdOworICAgIHN0LT5kLT5hWzFdID0gcGFbMF0gKiByYVsxXSArIHBhWzFdICogcmFbMF07CisgICAgc3QtPmQtPmFbMl0gPSBwYVswXSAqIHJhWzJdICsgcGFbMV0gKiByYVsxXSArIHBhWzJdICogcmFbMF07CisgICAgc3QtPmQtPmFbM10gPSBwYVsxXSAqIHJhWzJdICsgcGFbMl0gKiByYVsxXTsKKyAgICBzdC0+ZC0+YVs0XSA9IHBhWzJdICogcmFbMl07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA1OyArK2opIHsKKyAgICAgICAgICAgIHN0LT5kLT52W2ldW2pdID0gMC4wOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGVidXIxMjhfaW5pdF9jaGFubmVsX21hcChGRkVCVVIxMjhTdGF0ZSAqIHN0KQoreworICAgIHNpemVfdCBpOworICAgIHN0LT5kLT5jaGFubmVsX21hcCA9CisgICAgICAgIChpbnQgKikgYXZfbWFsbG9jX2FycmF5KHN0LT5jaGFubmVscywgc2l6ZW9mKGludCkpOworICAgIGlmICghc3QtPmQtPmNoYW5uZWxfbWFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmIChzdC0+Y2hhbm5lbHMgPT0gNCkgeworICAgICAgICBzdC0+ZC0+Y2hhbm5lbF9tYXBbMF0gPSBGRl9FQlVSMTI4X0xFRlQ7CisgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFsxXSA9IEZGX0VCVVIxMjhfUklHSFQ7CisgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFsyXSA9IEZGX0VCVVIxMjhfTEVGVF9TVVJST1VORDsKKyAgICAgICAgc3QtPmQtPmNoYW5uZWxfbWFwWzNdID0gRkZfRUJVUjEyOF9SSUdIVF9TVVJST1VORDsKKyAgICB9IGVsc2UgaWYgKHN0LT5jaGFubmVscyA9PSA1KSB7CisgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFswXSA9IEZGX0VCVVIxMjhfTEVGVDsKKyAgICAgICAgc3QtPmQtPmNoYW5uZWxfbWFwWzFdID0gRkZfRUJVUjEyOF9SSUdIVDsKKyAgICAgICAgc3QtPmQtPmNoYW5uZWxfbWFwWzJdID0gRkZfRUJVUjEyOF9DRU5URVI7CisgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFszXSA9IEZGX0VCVVIxMjhfTEVGVF9TVVJST1VORDsKKyAgICAgICAgc3QtPmQtPmNoYW5uZWxfbWFwWzRdID0gRkZfRUJVUjEyOF9SSUdIVF9TVVJST1VORDsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPmNoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFtpXSA9IEZGX0VCVVIxMjhfTEVGVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBzdC0+ZC0+Y2hhbm5lbF9tYXBbaV0gPSBGRl9FQlVSMTI4X1JJR0hUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFtpXSA9IEZGX0VCVVIxMjhfQ0VOVEVSOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFtpXSA9IEZGX0VCVVIxMjhfVU5VU0VEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFtpXSA9IEZGX0VCVVIxMjhfTEVGVF9TVVJST1VORDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBzdC0+ZC0+Y2hhbm5lbF9tYXBbaV0gPSBGRl9FQlVSMTI4X1JJR0hUX1NVUlJPVU5EOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBzdC0+ZC0+Y2hhbm5lbF9tYXBbaV0gPSBGRl9FQlVSMTI4X1VOVVNFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfaGlzdG9ncmFtKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgLyogaW5pdGlhbGl6ZSBzdGF0aWMgY29uc3RhbnRzICovCisgICAgaGlzdG9ncmFtX2VuZXJneV9ib3VuZGFyaWVzWzBdID0gcG93KDEwLjAsICgtNzAuMCArIDAuNjkxKSAvIDEwLjApOworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKyAgICAgICAgaGlzdG9ncmFtX2VuZXJnaWVzW2ldID0KKyAgICAgICAgICAgIHBvdygxMC4wLCAoKGRvdWJsZSkgaSAvIDEwLjAgLSA2OS45NSArIDAuNjkxKSAvIDEwLjApOworICAgIH0KKyAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMTsgKytpKSB7CisgICAgICAgIGhpc3RvZ3JhbV9lbmVyZ3lfYm91bmRhcmllc1tpXSA9CisgICAgICAgICAgICBwb3coMTAuMCwgKChkb3VibGUpIGkgLyAxMC4wIC0gNzAuMCArIDAuNjkxKSAvIDEwLjApOworICAgIH0KK30KKworRkZFQlVSMTI4U3RhdGUgKmZmX2VidXIxMjhfaW5pdCh1bnNpZ25lZCBpbnQgY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB3aW5kb3csIGludCBtb2RlKQoreworICAgIGludCBlcnJjb2RlOworICAgIEZGRUJVUjEyOFN0YXRlICpzdDsKKworICAgIHN0ID0gKEZGRUJVUjEyOFN0YXRlICopIGF2X21hbGxvYyhzaXplb2YoRkZFQlVSMTI4U3RhdGUpKTsKKyAgICBDSEVDS19FUlJPUighc3QsIDAsIGV4aXQpCisgICAgc3QtPmQgPSAoc3RydWN0IEZGRUJVUjEyOFN0YXRlSW50ZXJuYWwgKikKKyAgICAgICAgYXZfbWFsbG9jKHNpemVvZihzdHJ1Y3QgRkZFQlVSMTI4U3RhdGVJbnRlcm5hbCkpOworICAgIENIRUNLX0VSUk9SKCFzdC0+ZCwgMCwgZnJlZV9zdGF0ZSkKKyAgICBzdC0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBlcnJjb2RlID0gZWJ1cjEyOF9pbml0X2NoYW5uZWxfbWFwKHN0KTsKKyAgICBDSEVDS19FUlJPUihlcnJjb2RlLCAwLCBmcmVlX2ludGVybmFsKQorCisgICAgc3QtPmQtPnNhbXBsZV9wZWFrID0KKyAgICAgICAgKGRvdWJsZSAqKSBhdl9tYWxsb2N6X2FycmF5KGNoYW5uZWxzLCBzaXplb2YoZG91YmxlKSk7CisgICAgQ0hFQ0tfRVJST1IoIXN0LT5kLT5zYW1wbGVfcGVhaywgMCwgZnJlZV9jaGFubmVsX21hcCkKKworICAgIHN0LT5zYW1wbGVyYXRlID0gc2FtcGxlcmF0ZTsKKyAgICBzdC0+ZC0+c2FtcGxlc19pbl8xMDBtcyA9IChzdC0+c2FtcGxlcmF0ZSArIDUpIC8gMTA7CisgICAgc3QtPm1vZGUgPSBtb2RlOworICAgIGlmICgobW9kZSAmIEZGX0VCVVIxMjhfTU9ERV9TKSA9PSBGRl9FQlVSMTI4X01PREVfUykgeworICAgICAgICBzdC0+ZC0+d2luZG93ID0gRkZNQVgod2luZG93LCAzMDAwKTsKKyAgICB9IGVsc2UgaWYgKChtb2RlICYgRkZfRUJVUjEyOF9NT0RFX00pID09IEZGX0VCVVIxMjhfTU9ERV9NKSB7CisgICAgICAgIHN0LT5kLT53aW5kb3cgPSBGRk1BWCh3aW5kb3csIDQwMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBmcmVlX3NhbXBsZV9wZWFrOworICAgIH0KKyAgICBzdC0+ZC0+YXVkaW9fZGF0YV9mcmFtZXMgPSBzdC0+c2FtcGxlcmF0ZSAqIHN0LT5kLT53aW5kb3cgLyAxMDAwOworICAgIGlmIChzdC0+ZC0+YXVkaW9fZGF0YV9mcmFtZXMgJSBzdC0+ZC0+c2FtcGxlc19pbl8xMDBtcykgeworICAgICAgICAvKiByb3VuZCB1cCB0byBtdWx0aXBsZSBvZiBzYW1wbGVzX2luXzEwMG1zICovCisgICAgICAgIHN0LT5kLT5hdWRpb19kYXRhX2ZyYW1lcyA9IHN0LT5kLT5hdWRpb19kYXRhX2ZyYW1lcworICAgICAgICAgICAgKyBzdC0+ZC0+c2FtcGxlc19pbl8xMDBtcworICAgICAgICAgICAgLSAoc3QtPmQtPmF1ZGlvX2RhdGFfZnJhbWVzICUgc3QtPmQtPnNhbXBsZXNfaW5fMTAwbXMpOworICAgIH0KKyAgICBzdC0+ZC0+YXVkaW9fZGF0YSA9CisgICAgICAgIChkb3VibGUgKikgYXZfbWFsbG9jel9hcnJheShzdC0+ZC0+YXVkaW9fZGF0YV9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y2hhbm5lbHMgKiBzaXplb2YoZG91YmxlKSk7CisgICAgQ0hFQ0tfRVJST1IoIXN0LT5kLT5hdWRpb19kYXRhLCAwLCBmcmVlX3NhbXBsZV9wZWFrKQorCisgICAgZWJ1cjEyOF9pbml0X2ZpbHRlcihzdCk7CisKKyAgICBzdC0+ZC0+YmxvY2tfZW5lcmd5X2hpc3RvZ3JhbSA9CisgICAgICAgIGF2X21hbGxvY3ooMTAwMCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisgICAgQ0hFQ0tfRVJST1IoIXN0LT5kLT5ibG9ja19lbmVyZ3lfaGlzdG9ncmFtLCAwLCBmcmVlX2F1ZGlvX2RhdGEpCisgICAgc3QtPmQtPnNob3J0X3Rlcm1fYmxvY2tfZW5lcmd5X2hpc3RvZ3JhbSA9CisgICAgICAgIGF2X21hbGxvY3ooMTAwMCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisgICAgQ0hFQ0tfRVJST1IoIXN0LT5kLT5zaG9ydF90ZXJtX2Jsb2NrX2VuZXJneV9oaXN0b2dyYW0sIDAsCisgICAgICAgICAgICAgICAgZnJlZV9ibG9ja19lbmVyZ3lfaGlzdG9ncmFtKQorICAgIHN0LT5kLT5zaG9ydF90ZXJtX2ZyYW1lX2NvdW50ZXIgPSAwOworCisgICAgLyogdGhlIGZpcnN0IGJsb2NrIG5lZWRzIDQwMG1zIG9mIGF1ZGlvIGRhdGEgKi8KKyAgICBzdC0+ZC0+bmVlZGVkX2ZyYW1lcyA9IHN0LT5kLT5zYW1wbGVzX2luXzEwMG1zICogNDsKKyAgICAvKiBzdGFydCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgKi8KKyAgICBzdC0+ZC0+YXVkaW9fZGF0YV9pbmRleCA9IDA7CisKKyAgICBpZiAoZmZfdGhyZWFkX29uY2UoJmhpc3RvZ3JhbV9pbml0LCAmaW5pdF9oaXN0b2dyYW0pICE9IDApCisgICAgICAgIGdvdG8gZnJlZV9zaG9ydF90ZXJtX2Jsb2NrX2VuZXJneV9oaXN0b2dyYW07CisKKyAgICBzdC0+ZC0+ZGF0YV9wdHJzID0gYXZfbWFsbG9jX2FycmF5KGNoYW5uZWxzLCBzaXplb2Yodm9pZCAqKSk7CisgICAgQ0hFQ0tfRVJST1IoIXN0LT5kLT5kYXRhX3B0cnMsIDAsCisgICAgICAgICAgICAgICAgZnJlZV9zaG9ydF90ZXJtX2Jsb2NrX2VuZXJneV9oaXN0b2dyYW0pOworCisgICAgcmV0dXJuIHN0OworCitmcmVlX3Nob3J0X3Rlcm1fYmxvY2tfZW5lcmd5X2hpc3RvZ3JhbToKKyAgICBhdl9mcmVlKHN0LT5kLT5zaG9ydF90ZXJtX2Jsb2NrX2VuZXJneV9oaXN0b2dyYW0pOworZnJlZV9ibG9ja19lbmVyZ3lfaGlzdG9ncmFtOgorICAgIGF2X2ZyZWUoc3QtPmQtPmJsb2NrX2VuZXJneV9oaXN0b2dyYW0pOworZnJlZV9hdWRpb19kYXRhOgorICAgIGF2X2ZyZWUoc3QtPmQtPmF1ZGlvX2RhdGEpOworZnJlZV9zYW1wbGVfcGVhazoKKyAgICBhdl9mcmVlKHN0LT5kLT5zYW1wbGVfcGVhayk7CitmcmVlX2NoYW5uZWxfbWFwOgorICAgIGF2X2ZyZWUoc3QtPmQtPmNoYW5uZWxfbWFwKTsKK2ZyZWVfaW50ZXJuYWw6CisgICAgYXZfZnJlZShzdC0+ZCk7CitmcmVlX3N0YXRlOgorICAgIGF2X2ZyZWUoc3QpOworZXhpdDoKKyAgICByZXR1cm4gTlVMTDsKK30KKwordm9pZCBmZl9lYnVyMTI4X2Rlc3Ryb3koRkZFQlVSMTI4U3RhdGUgKiogc3QpCit7CisgICAgYXZfZnJlZSgoKnN0KS0+ZC0+YmxvY2tfZW5lcmd5X2hpc3RvZ3JhbSk7CisgICAgYXZfZnJlZSgoKnN0KS0+ZC0+c2hvcnRfdGVybV9ibG9ja19lbmVyZ3lfaGlzdG9ncmFtKTsKKyAgICBhdl9mcmVlKCgqc3QpLT5kLT5hdWRpb19kYXRhKTsKKyAgICBhdl9mcmVlKCgqc3QpLT5kLT5jaGFubmVsX21hcCk7CisgICAgYXZfZnJlZSgoKnN0KS0+ZC0+c2FtcGxlX3BlYWspOworICAgIGF2X2ZyZWUoKCpzdCktPmQtPmRhdGFfcHRycyk7CisgICAgYXZfZnJlZSgoKnN0KS0+ZCk7CisgICAgYXZfZnJlZSgqc3QpOworICAgICpzdCA9IE5VTEw7Cit9CisKKyNkZWZpbmUgRUJVUjEyOF9GSUxURVIodHlwZSwgc2NhbGluZ19mYWN0b3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgZWJ1cjEyOF9maWx0ZXJfIyN0eXBlKEZGRUJVUjEyOFN0YXRlKiBzdCwgY29uc3QgdHlwZSoqIHNyY3MsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY19pbmRleCwgc2l6ZV90IGZyYW1lcywgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSogYXVkaW9fZGF0YSA9IHN0LT5kLT5hdWRpb19kYXRhICsgc3QtPmQtPmF1ZGlvX2RhdGFfaW5kZXg7ICAgICAgICAgICAgICBcCisgICAgc2l6ZV90IGksIGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoc3QtPm1vZGUgJiBGRl9FQlVSMTI4X01PREVfU0FNUExFX1BFQUspID09IEZGX0VCVVIxMjhfTU9ERV9TQU1QTEVfUEVBSykgeyBcCisgICAgICAgIGZvciAoYyA9IDA7IGMgPCBzdC0+Y2hhbm5lbHM7ICsrYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSBtYXggPSAwLjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lczsgKytpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdHlwZSB2ID0gc3Jjc1tjXVtzcmNfaW5kZXggKyBpICogc3RyaWRlXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAodiA+IG1heCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBtYXggPSAgICAgICAgdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgtdiA+IG1heCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gLTEuMCAqIHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1heCAvPSBzY2FsaW5nX2ZhY3RvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG1heCA+IHN0LT5kLT5zYW1wbGVfcGVha1tjXSkgc3QtPmQtPnNhbXBsZV9wZWFrW2NdID0gbWF4OyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoYyA9IDA7IGMgPCBzdC0+Y2hhbm5lbHM7ICsrYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBjaSA9IHN0LT5kLT5jaGFubmVsX21hcFtjXSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGNpIDwgMCkgY29udGludWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmIChjaSA9PSBGRl9FQlVSMTI4X0RVQUxfTU9OTyAtIDEpIGNpID0gMDsgLypkdWFsIG1vbm8gKi8gICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXM7ICsraSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0LT5kLT52W2NpXVswXSA9IChkb3VibGUpIChzcmNzW2NdW3NyY19pbmRleCArIGkgKiBzdHJpZGVdIC8gc2NhbGluZ19mYWN0b3IpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0LT5kLT5hWzFdICogc3QtPmQtPnZbY2ldWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3QtPmQtPmFbMl0gKiBzdC0+ZC0+dltjaV1bMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgLSBzdC0+ZC0+YVszXSAqIHN0LT5kLT52W2NpXVszXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0LT5kLT5hWzRdICogc3QtPmQtPnZbY2ldWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXVkaW9fZGF0YVtpICogc3QtPmNoYW5uZWxzICsgY10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+ZC0+YlswXSAqIHN0LT5kLT52W2NpXVswXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHN0LT5kLT5iWzFdICogc3QtPmQtPnZbY2ldWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICsgc3QtPmQtPmJbMl0gKiBzdC0+ZC0+dltjaV1bMl0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKyBzdC0+ZC0+YlszXSAqIHN0LT5kLT52W2NpXVszXSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICArIHN0LT5kLT5iWzRdICogc3QtPmQtPnZbY2ldWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3QtPmQtPnZbY2ldWzRdID0gc3QtPmQtPnZbY2ldWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdC0+ZC0+dltjaV1bM10gPSBzdC0+ZC0+dltjaV1bMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0LT5kLT52W2NpXVsyXSA9IHN0LT5kLT52W2NpXVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3QtPmQtPnZbY2ldWzFdID0gc3QtPmQtPnZbY2ldWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3QtPmQtPnZbY2ldWzRdID0gZmFicyhzdC0+ZC0+dltjaV1bNF0pIDwgREJMX01JTiA/IDAuMCA6IHN0LT5kLT52W2NpXVs0XTsgXAorICAgICAgICBzdC0+ZC0+dltjaV1bM10gPSBmYWJzKHN0LT5kLT52W2NpXVszXSkgPCBEQkxfTUlOID8gMC4wIDogc3QtPmQtPnZbY2ldWzNdOyBcCisgICAgICAgIHN0LT5kLT52W2NpXVsyXSA9IGZhYnMoc3QtPmQtPnZbY2ldWzJdKSA8IERCTF9NSU4gPyAwLjAgOiBzdC0+ZC0+dltjaV1bMl07IFwKKyAgICAgICAgc3QtPmQtPnZbY2ldWzFdID0gZmFicyhzdC0+ZC0+dltjaV1bMV0pIDwgREJMX01JTiA/IDAuMCA6IHN0LT5kLT52W2NpXVsxXTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CitFQlVSMTI4X0ZJTFRFUihzaG9ydCwgLSgoZG91YmxlKVNIUlRfTUlOKSkKK0VCVVIxMjhfRklMVEVSKGludCwgLSgoZG91YmxlKUlOVF9NSU4pKQorRUJVUjEyOF9GSUxURVIoZmxvYXQsICAxLjApCitFQlVSMTI4X0ZJTFRFUihkb3VibGUsIDEuMCkKKworc3RhdGljIGRvdWJsZSBlYnVyMTI4X2VuZXJneV90b19sb3VkbmVzcyhkb3VibGUgZW5lcmd5KQoreworICAgIHJldHVybiAxMCAqIChsb2coZW5lcmd5KSAvIGxvZygxMC4wKSkgLSAwLjY5MTsKK30KKworc3RhdGljIHNpemVfdCBmaW5kX2hpc3RvZ3JhbV9pbmRleChkb3VibGUgZW5lcmd5KQoreworICAgIHNpemVfdCBpbmRleF9taW4gPSAwOworICAgIHNpemVfdCBpbmRleF9tYXggPSAxMDAwOworICAgIHNpemVfdCBpbmRleF9taWQ7CisKKyAgICBkbyB7CisgICAgICAgIGluZGV4X21pZCA9IChpbmRleF9taW4gKyBpbmRleF9tYXgpIC8gMjsKKyAgICAgICAgaWYgKGVuZXJneSA+PSBoaXN0b2dyYW1fZW5lcmd5X2JvdW5kYXJpZXNbaW5kZXhfbWlkXSkgeworICAgICAgICAgICAgaW5kZXhfbWluID0gaW5kZXhfbWlkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5kZXhfbWF4ID0gaW5kZXhfbWlkOworICAgICAgICB9CisgICAgfSB3aGlsZSAoaW5kZXhfbWF4IC0gaW5kZXhfbWluICE9IDEpOworCisgICAgcmV0dXJuIGluZGV4X21pbjsKK30KKworc3RhdGljIHZvaWQgZWJ1cjEyOF9jYWxjX2dhdGluZ19ibG9jayhGRkVCVVIxMjhTdGF0ZSAqIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVzX3Blcl9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpvcHRpb25hbF9vdXRwdXQpCit7CisgICAgc2l6ZV90IGksIGM7CisgICAgZG91YmxlIHN1bSA9IDAuMDsKKyAgICBkb3VibGUgY2hhbm5lbF9zdW07CisgICAgZm9yIChjID0gMDsgYyA8IHN0LT5jaGFubmVsczsgKytjKSB7CisgICAgICAgIGlmIChzdC0+ZC0+Y2hhbm5lbF9tYXBbY10gPT0gRkZfRUJVUjEyOF9VTlVTRUQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2hhbm5lbF9zdW0gPSAwLjA7CisgICAgICAgIGlmIChzdC0+ZC0+YXVkaW9fZGF0YV9pbmRleCA8IGZyYW1lc19wZXJfYmxvY2sgKiBzdC0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+ZC0+YXVkaW9fZGF0YV9pbmRleCAvIHN0LT5jaGFubmVsczsgKytpKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbF9zdW0gKz0gc3QtPmQtPmF1ZGlvX2RhdGFbaSAqIHN0LT5jaGFubmVscyArIGNdICoKKyAgICAgICAgICAgICAgICAgICAgc3QtPmQtPmF1ZGlvX2RhdGFbaSAqIHN0LT5jaGFubmVscyArIGNdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gc3QtPmQtPmF1ZGlvX2RhdGFfZnJhbWVzIC0KKyAgICAgICAgICAgICAgICAgKGZyYW1lc19wZXJfYmxvY2sgLQorICAgICAgICAgICAgICAgICAgc3QtPmQtPmF1ZGlvX2RhdGFfaW5kZXggLyBzdC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgICBpIDwgc3QtPmQtPmF1ZGlvX2RhdGFfZnJhbWVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBjaGFubmVsX3N1bSArPSBzdC0+ZC0+YXVkaW9fZGF0YVtpICogc3QtPmNoYW5uZWxzICsgY10gKgorICAgICAgICAgICAgICAgICAgICBzdC0+ZC0+YXVkaW9fZGF0YVtpICogc3QtPmNoYW5uZWxzICsgY107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPQorICAgICAgICAgICAgICAgICBzdC0+ZC0+YXVkaW9fZGF0YV9pbmRleCAvIHN0LT5jaGFubmVscyAtIGZyYW1lc19wZXJfYmxvY2s7CisgICAgICAgICAgICAgICAgIGkgPCBzdC0+ZC0+YXVkaW9fZGF0YV9pbmRleCAvIHN0LT5jaGFubmVsczsgKytpKSB7CisgICAgICAgICAgICAgICAgY2hhbm5lbF9zdW0gKz0KKyAgICAgICAgICAgICAgICAgICAgc3QtPmQtPmF1ZGlvX2RhdGFbaSAqIHN0LT5jaGFubmVscyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNdICogc3QtPmQtPmF1ZGlvX2RhdGFbaSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNoYW5uZWxzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPmQtPmNoYW5uZWxfbWFwW2NdID09IEZGX0VCVVIxMjhfTXAxMTAgfHwKKyAgICAgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFtjXSA9PSBGRl9FQlVSMTI4X01tMTEwIHx8CisgICAgICAgICAgICBzdC0+ZC0+Y2hhbm5lbF9tYXBbY10gPT0gRkZfRUJVUjEyOF9NcDA2MCB8fAorICAgICAgICAgICAgc3QtPmQtPmNoYW5uZWxfbWFwW2NdID09IEZGX0VCVVIxMjhfTW0wNjAgfHwKKyAgICAgICAgICAgIHN0LT5kLT5jaGFubmVsX21hcFtjXSA9PSBGRl9FQlVSMTI4X01wMDkwIHx8CisgICAgICAgICAgICBzdC0+ZC0+Y2hhbm5lbF9tYXBbY10gPT0gRkZfRUJVUjEyOF9NbTA5MCkgeworICAgICAgICAgICAgY2hhbm5lbF9zdW0gKj0gMS40MTsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+ZC0+Y2hhbm5lbF9tYXBbY10gPT0gRkZfRUJVUjEyOF9EVUFMX01PTk8pIHsKKyAgICAgICAgICAgIGNoYW5uZWxfc3VtICo9IDIuMDsKKyAgICAgICAgfQorICAgICAgICBzdW0gKz0gY2hhbm5lbF9zdW07CisgICAgfQorICAgIHN1bSAvPSAoZG91YmxlKSBmcmFtZXNfcGVyX2Jsb2NrOworICAgIGlmIChvcHRpb25hbF9vdXRwdXQpIHsKKyAgICAgICAgKm9wdGlvbmFsX291dHB1dCA9IHN1bTsKKyAgICB9IGVsc2UgaWYgKHN1bSA+PSBoaXN0b2dyYW1fZW5lcmd5X2JvdW5kYXJpZXNbMF0pIHsKKyAgICAgICAgKytzdC0+ZC0+YmxvY2tfZW5lcmd5X2hpc3RvZ3JhbVtmaW5kX2hpc3RvZ3JhbV9pbmRleChzdW0pXTsKKyAgICB9Cit9CisKK2ludCBmZl9lYnVyMTI4X3NldF9jaGFubmVsKEZGRUJVUjEyOFN0YXRlICogc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbF9udW1iZXIsIGludCB2YWx1ZSkKK3sKKyAgICBpZiAoY2hhbm5lbF9udW1iZXIgPj0gc3QtPmNoYW5uZWxzKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAodmFsdWUgPT0gRkZfRUJVUjEyOF9EVUFMX01PTk8gJiYKKyAgICAgICAgKHN0LT5jaGFubmVscyAhPSAxIHx8IGNoYW5uZWxfbnVtYmVyICE9IDApKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBzdC0+ZC0+Y2hhbm5lbF9tYXBbY2hhbm5lbF9udW1iZXJdID0gdmFsdWU7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWJ1cjEyOF9lbmVyZ3lfc2hvcnR0ZXJtKEZGRUJVUjEyOFN0YXRlICogc3QsIGRvdWJsZSAqb3V0KTsKKyNkZWZpbmUgRkZfRUJVUjEyOF9BRERfRlJBTUVTX1BMQU5BUih0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfZWJ1cjEyOF9hZGRfZnJhbWVzX3BsYW5hcl8jI3R5cGUoRkZFQlVSMTI4U3RhdGUqIHN0LCBjb25zdCB0eXBlKiogc3JjcywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXMsIGludCBzdHJpZGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplX3Qgc3JjX2luZGV4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoZnJhbWVzID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZyYW1lcyA+PSBzdC0+ZC0+bmVlZGVkX2ZyYW1lcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVidXIxMjhfZmlsdGVyXyMjdHlwZShzdCwgc3Jjcywgc3JjX2luZGV4LCBzdC0+ZC0+bmVlZGVkX2ZyYW1lcywgc3RyaWRlKTsgIFwKKyAgICAgICAgICAgIHNyY19pbmRleCArPSBzdC0+ZC0+bmVlZGVkX2ZyYW1lcyAqIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZyYW1lcyAtPSBzdC0+ZC0+bmVlZGVkX2ZyYW1lczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0LT5kLT5hdWRpb19kYXRhX2luZGV4ICs9IHN0LT5kLT5uZWVkZWRfZnJhbWVzICogc3QtPmNoYW5uZWxzOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgbmV3IGdhdGluZyBibG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICgoc3QtPm1vZGUgJiBGRl9FQlVSMTI4X01PREVfSSkgPT0gRkZfRUJVUjEyOF9NT0RFX0kpIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlYnVyMTI4X2NhbGNfZ2F0aW5nX2Jsb2NrKHN0LCBzdC0+ZC0+c2FtcGxlc19pbl8xMDBtcyAqIDQsIE5VTEwpOyAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICgoc3QtPm1vZGUgJiBGRl9FQlVSMTI4X01PREVfTFJBKSA9PSBGRl9FQlVSMTI4X01PREVfTFJBKSB7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdC0+ZC0+c2hvcnRfdGVybV9mcmFtZV9jb3VudGVyICs9IHN0LT5kLT5uZWVkZWRfZnJhbWVzOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmQtPnNob3J0X3Rlcm1fZnJhbWVfY291bnRlciA9PSBzdC0+ZC0+c2FtcGxlc19pbl8xMDBtcyAqIDMwKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHN0X2VuZXJneTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZWJ1cjEyOF9lbmVyZ3lfc2hvcnR0ZXJtKHN0LCAmc3RfZW5lcmd5KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0X2VuZXJneSA+PSBoaXN0b2dyYW1fZW5lcmd5X2JvdW5kYXJpZXNbMF0pIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICsrc3QtPmQtPnNob3J0X3Rlcm1fYmxvY2tfZW5lcmd5X2hpc3RvZ3JhbVsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX2hpc3RvZ3JhbV9pbmRleChzdF9lbmVyZ3kpXTsgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc3QtPmQtPnNob3J0X3Rlcm1fZnJhbWVfY291bnRlciA9IHN0LT5kLT5zYW1wbGVzX2luXzEwMG1zICogMjA7ICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIDEwMG1zIGFyZSBuZWVkZWQgZm9yIGFsbCBibG9ja3MgYmVzaWRlcyB0aGUgZmlyc3Qgb25lICovICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0LT5kLT5uZWVkZWRfZnJhbWVzID0gc3QtPmQtPnNhbXBsZXNfaW5fMTAwbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIHJlc2V0IGF1ZGlvX2RhdGFfaW5kZXggd2hlbiBidWZmZXIgZnVsbCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChzdC0+ZC0+YXVkaW9fZGF0YV9pbmRleCA9PSBzdC0+ZC0+YXVkaW9fZGF0YV9mcmFtZXMgKiBzdC0+Y2hhbm5lbHMpIHsgIFwKKyAgICAgICAgICAgICAgICBzdC0+ZC0+YXVkaW9fZGF0YV9pbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVidXIxMjhfZmlsdGVyXyMjdHlwZShzdCwgc3Jjcywgc3JjX2luZGV4LCBmcmFtZXMsIHN0cmlkZSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0LT5kLT5hdWRpb19kYXRhX2luZGV4ICs9IGZyYW1lcyAqIHN0LT5jaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICgoc3QtPm1vZGUgJiBGRl9FQlVSMTI4X01PREVfTFJBKSA9PSBGRl9FQlVSMTI4X01PREVfTFJBKSB7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdC0+ZC0+c2hvcnRfdGVybV9mcmFtZV9jb3VudGVyICs9IGZyYW1lczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN0LT5kLT5uZWVkZWRfZnJhbWVzIC09IGZyYW1lczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZyYW1lcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK0ZGX0VCVVIxMjhfQUREX0ZSQU1FU19QTEFOQVIoc2hvcnQpCitGRl9FQlVSMTI4X0FERF9GUkFNRVNfUExBTkFSKGludCkKK0ZGX0VCVVIxMjhfQUREX0ZSQU1FU19QTEFOQVIoZmxvYXQpCitGRl9FQlVSMTI4X0FERF9GUkFNRVNfUExBTkFSKGRvdWJsZSkKKyNkZWZpbmUgRkZfRUJVUjEyOF9BRERfRlJBTUVTKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX2VidXIxMjhfYWRkX2ZyYW1lc18jI3R5cGUoRkZFQlVSMTI4U3RhdGUqIHN0LCBjb25zdCB0eXBlKiBzcmMsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHR5cGUgKipidWYgPSAoY29uc3QgdHlwZSoqKXN0LT5kLT5kYXRhX3B0cnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgc3QtPmNoYW5uZWxzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBidWZbaV0gPSBzcmMgKyBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZmX2VidXIxMjhfYWRkX2ZyYW1lc19wbGFuYXJfIyN0eXBlKHN0LCBidWYsIGZyYW1lcywgc3QtPmNoYW5uZWxzKTsgICAgICAgICAgXAorfQorRkZfRUJVUjEyOF9BRERfRlJBTUVTKHNob3J0KQorRkZfRUJVUjEyOF9BRERfRlJBTUVTKGludCkKK0ZGX0VCVVIxMjhfQUREX0ZSQU1FUyhmbG9hdCkKK0ZGX0VCVVIxMjhfQUREX0ZSQU1FUyhkb3VibGUpCisKK3N0YXRpYyBpbnQgZWJ1cjEyOF9jYWxjX3JlbGF0aXZlX3RocmVzaG9sZChGRkVCVVIxMjhTdGF0ZSAqKnN0cywgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpyZWxhdGl2ZV90aHJlc2hvbGQpCit7CisgICAgc2l6ZV90IGksIGo7CisgICAgaW50IGFib3ZlX3RocmVzaF9jb3VudGVyID0gMDsKKyAgICAqcmVsYXRpdmVfdGhyZXNob2xkID0gMC4wOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBsb25nICpibG9ja19lbmVyZ3lfaGlzdG9ncmFtID0gc3RzW2ldLT5kLT5ibG9ja19lbmVyZ3lfaGlzdG9ncmFtOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMTAwMDsgKytqKSB7CisgICAgICAgICAgICAqcmVsYXRpdmVfdGhyZXNob2xkICs9IGJsb2NrX2VuZXJneV9oaXN0b2dyYW1bal0gKiBoaXN0b2dyYW1fZW5lcmdpZXNbal07CisgICAgICAgICAgICBhYm92ZV90aHJlc2hfY291bnRlciArPSBibG9ja19lbmVyZ3lfaGlzdG9ncmFtW2pdOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGFib3ZlX3RocmVzaF9jb3VudGVyICE9IDApIHsKKyAgICAgICAgKnJlbGF0aXZlX3RocmVzaG9sZCAvPSAoZG91YmxlKWFib3ZlX3RocmVzaF9jb3VudGVyOworICAgICAgICAqcmVsYXRpdmVfdGhyZXNob2xkICo9IFJFTEFUSVZFX0dBVEVfRkFDVE9SOworICAgIH0KKworICAgIHJldHVybiBhYm92ZV90aHJlc2hfY291bnRlcjsKK30KKworc3RhdGljIGludCBlYnVyMTI4X2dhdGVkX2xvdWRuZXNzKEZGRUJVUjEyOFN0YXRlICoqIHN0cywgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpvdXQpCit7CisgICAgZG91YmxlIGdhdGVkX2xvdWRuZXNzID0gMC4wOworICAgIGRvdWJsZSByZWxhdGl2ZV90aHJlc2hvbGQ7CisgICAgc2l6ZV90IGFib3ZlX3RocmVzaF9jb3VudGVyOworICAgIHNpemVfdCBpLCBqLCBzdGFydF9pbmRleDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisgICAgICAgIGlmICgoc3RzW2ldLT5tb2RlICYgRkZfRUJVUjEyOF9NT0RFX0kpICE9IEZGX0VCVVIxMjhfTU9ERV9JKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmICghZWJ1cjEyOF9jYWxjX3JlbGF0aXZlX3RocmVzaG9sZChzdHMsIHNpemUsICZyZWxhdGl2ZV90aHJlc2hvbGQpKSB7CisgICAgICAgICpvdXQgPSAtSFVHRV9WQUw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGFib3ZlX3RocmVzaF9jb3VudGVyID0gMDsKKyAgICBpZiAocmVsYXRpdmVfdGhyZXNob2xkIDwgaGlzdG9ncmFtX2VuZXJneV9ib3VuZGFyaWVzWzBdKSB7CisgICAgICAgIHN0YXJ0X2luZGV4ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGFydF9pbmRleCA9IGZpbmRfaGlzdG9ncmFtX2luZGV4KHJlbGF0aXZlX3RocmVzaG9sZCk7CisgICAgICAgIGlmIChyZWxhdGl2ZV90aHJlc2hvbGQgPiBoaXN0b2dyYW1fZW5lcmdpZXNbc3RhcnRfaW5kZXhdKSB7CisgICAgICAgICAgICArK3N0YXJ0X2luZGV4OworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gc3RhcnRfaW5kZXg7IGogPCAxMDAwOyArK2opIHsKKyAgICAgICAgICAgIGdhdGVkX2xvdWRuZXNzICs9IHN0c1tpXS0+ZC0+YmxvY2tfZW5lcmd5X2hpc3RvZ3JhbVtqXSAqCisgICAgICAgICAgICAgICAgaGlzdG9ncmFtX2VuZXJnaWVzW2pdOworICAgICAgICAgICAgYWJvdmVfdGhyZXNoX2NvdW50ZXIgKz0gc3RzW2ldLT5kLT5ibG9ja19lbmVyZ3lfaGlzdG9ncmFtW2pdOworICAgICAgICB9CisgICAgfQorICAgIGlmICghYWJvdmVfdGhyZXNoX2NvdW50ZXIpIHsKKyAgICAgICAgKm91dCA9IC1IVUdFX1ZBTDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGdhdGVkX2xvdWRuZXNzIC89IChkb3VibGUpIGFib3ZlX3RocmVzaF9jb3VudGVyOworICAgICpvdXQgPSBlYnVyMTI4X2VuZXJneV90b19sb3VkbmVzcyhnYXRlZF9sb3VkbmVzcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9lYnVyMTI4X3JlbGF0aXZlX3RocmVzaG9sZChGRkVCVVIxMjhTdGF0ZSAqIHN0LCBkb3VibGUgKm91dCkKK3sKKyAgICBkb3VibGUgcmVsYXRpdmVfdGhyZXNob2xkOworCisgICAgaWYgKChzdC0+bW9kZSAmIEZGX0VCVVIxMjhfTU9ERV9JKSAhPSBGRl9FQlVSMTI4X01PREVfSSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmICghZWJ1cjEyOF9jYWxjX3JlbGF0aXZlX3RocmVzaG9sZCgmc3QsIDEsICZyZWxhdGl2ZV90aHJlc2hvbGQpKSB7CisgICAgICAgICpvdXQgPSAtNzAuMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKm91dCA9IGVidXIxMjhfZW5lcmd5X3RvX2xvdWRuZXNzKHJlbGF0aXZlX3RocmVzaG9sZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9lYnVyMTI4X2xvdWRuZXNzX2dsb2JhbChGRkVCVVIxMjhTdGF0ZSAqIHN0LCBkb3VibGUgKm91dCkKK3sKKyAgICByZXR1cm4gZWJ1cjEyOF9nYXRlZF9sb3VkbmVzcygmc3QsIDEsIG91dCk7Cit9CisKK2ludCBmZl9lYnVyMTI4X2xvdWRuZXNzX2dsb2JhbF9tdWx0aXBsZShGRkVCVVIxMjhTdGF0ZSAqKiBzdHMsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqb3V0KQoreworICAgIHJldHVybiBlYnVyMTI4X2dhdGVkX2xvdWRuZXNzKHN0cywgc2l6ZSwgb3V0KTsKK30KKworc3RhdGljIGludCBlYnVyMTI4X2VuZXJneV9pbl9pbnRlcnZhbChGRkVCVVIxMjhTdGF0ZSAqIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW50ZXJ2YWxfZnJhbWVzLCBkb3VibGUgKm91dCkKK3sKKyAgICBpZiAoaW50ZXJ2YWxfZnJhbWVzID4gc3QtPmQtPmF1ZGlvX2RhdGFfZnJhbWVzKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGVidXIxMjhfY2FsY19nYXRpbmdfYmxvY2soc3QsIGludGVydmFsX2ZyYW1lcywgb3V0KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlYnVyMTI4X2VuZXJneV9zaG9ydHRlcm0oRkZFQlVSMTI4U3RhdGUgKiBzdCwgZG91YmxlICpvdXQpCit7CisgICAgcmV0dXJuIGVidXIxMjhfZW5lcmd5X2luX2ludGVydmFsKHN0LCBzdC0+ZC0+c2FtcGxlc19pbl8xMDBtcyAqIDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQpOworfQorCitpbnQgZmZfZWJ1cjEyOF9sb3VkbmVzc19tb21lbnRhcnkoRkZFQlVSMTI4U3RhdGUgKiBzdCwgZG91YmxlICpvdXQpCit7CisgICAgZG91YmxlIGVuZXJneTsKKyAgICBpbnQgZXJyb3IgPSBlYnVyMTI4X2VuZXJneV9pbl9pbnRlcnZhbChzdCwgc3QtPmQtPnNhbXBsZXNfaW5fMTAwbXMgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmVyZ3kpOworICAgIGlmIChlcnJvcikgeworICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgfSBlbHNlIGlmIChlbmVyZ3kgPD0gMC4wKSB7CisgICAgICAgICpvdXQgPSAtSFVHRV9WQUw7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqb3V0ID0gZWJ1cjEyOF9lbmVyZ3lfdG9fbG91ZG5lc3MoZW5lcmd5KTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2VidXIxMjhfbG91ZG5lc3Nfc2hvcnR0ZXJtKEZGRUJVUjEyOFN0YXRlICogc3QsIGRvdWJsZSAqb3V0KQoreworICAgIGRvdWJsZSBlbmVyZ3k7CisgICAgaW50IGVycm9yID0gZWJ1cjEyOF9lbmVyZ3lfc2hvcnR0ZXJtKHN0LCAmZW5lcmd5KTsKKyAgICBpZiAoZXJyb3IpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0gZWxzZSBpZiAoZW5lcmd5IDw9IDAuMCkgeworICAgICAgICAqb3V0ID0gLUhVR0VfVkFMOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKm91dCA9IGVidXIxMjhfZW5lcmd5X3RvX2xvdWRuZXNzKGVuZXJneSk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9lYnVyMTI4X2xvdWRuZXNzX3dpbmRvdyhGRkVCVVIxMjhTdGF0ZSAqIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgd2luZG93LCBkb3VibGUgKm91dCkKK3sKKyAgICBkb3VibGUgZW5lcmd5OworICAgIHNpemVfdCBpbnRlcnZhbF9mcmFtZXMgPSBzdC0+c2FtcGxlcmF0ZSAqIHdpbmRvdyAvIDEwMDA7CisgICAgaW50IGVycm9yID0gZWJ1cjEyOF9lbmVyZ3lfaW5faW50ZXJ2YWwoc3QsIGludGVydmFsX2ZyYW1lcywgJmVuZXJneSk7CisgICAgaWYgKGVycm9yKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9IGVsc2UgaWYgKGVuZXJneSA8PSAwLjApIHsKKyAgICAgICAgKm91dCA9IC1IVUdFX1ZBTDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICpvdXQgPSBlYnVyMTI4X2VuZXJneV90b19sb3VkbmVzcyhlbmVyZ3kpOworICAgIHJldHVybiAwOworfQorCisvKiBFQlUgLSBURUNIIDMzNDIgKi8KK2ludCBmZl9lYnVyMTI4X2xvdWRuZXNzX3JhbmdlX211bHRpcGxlKEZGRUJVUjEyOFN0YXRlICoqIHN0cywgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKm91dCkKK3sKKyAgICBzaXplX3QgaSwgajsKKyAgICBzaXplX3Qgc3RsX3NpemU7CisgICAgZG91YmxlIHN0bF9wb3dlciwgc3RsX2ludGVncmF0ZWQ7CisgICAgLyogSGlnaCBhbmQgbG93IHBlcmNlbnRpbGUgZW5lcmd5ICovCisgICAgZG91YmxlIGhfZW4sIGxfZW47CisgICAgdW5zaWduZWQgbG9uZyBoaXN0WzEwMDBdID0geyAwIH07CisgICAgc2l6ZV90IHBlcmNlbnRpbGVfbG93LCBwZXJjZW50aWxlX2hpZ2g7CisgICAgc2l6ZV90IGluZGV4OworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBpZiAoc3RzW2ldKSB7CisgICAgICAgICAgICBpZiAoKHN0c1tpXS0+bW9kZSAmIEZGX0VCVVIxMjhfTU9ERV9MUkEpICE9CisgICAgICAgICAgICAgICAgRkZfRUJVUjEyOF9NT0RFX0xSQSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGxfc2l6ZSA9IDA7CisgICAgc3RsX3Bvd2VyID0gMC4wOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgaWYgKCFzdHNbaV0pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDEwMDA7ICsraikgeworICAgICAgICAgICAgaGlzdFtqXSArPSBzdHNbaV0tPmQtPnNob3J0X3Rlcm1fYmxvY2tfZW5lcmd5X2hpc3RvZ3JhbVtqXTsKKyAgICAgICAgICAgIHN0bF9zaXplICs9IHN0c1tpXS0+ZC0+c2hvcnRfdGVybV9ibG9ja19lbmVyZ3lfaGlzdG9ncmFtW2pdOworICAgICAgICAgICAgc3RsX3Bvd2VyICs9IHN0c1tpXS0+ZC0+c2hvcnRfdGVybV9ibG9ja19lbmVyZ3lfaGlzdG9ncmFtW2pdCisgICAgICAgICAgICAgICAgKiBoaXN0b2dyYW1fZW5lcmdpZXNbal07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzdGxfc2l6ZSkgeworICAgICAgICAqb3V0ID0gMC4wOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzdGxfcG93ZXIgLz0gc3RsX3NpemU7CisgICAgc3RsX2ludGVncmF0ZWQgPSBNSU5VU18yMERCICogc3RsX3Bvd2VyOworCisgICAgaWYgKHN0bF9pbnRlZ3JhdGVkIDwgaGlzdG9ncmFtX2VuZXJneV9ib3VuZGFyaWVzWzBdKSB7CisgICAgICAgIGluZGV4ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmRleCA9IGZpbmRfaGlzdG9ncmFtX2luZGV4KHN0bF9pbnRlZ3JhdGVkKTsKKyAgICAgICAgaWYgKHN0bF9pbnRlZ3JhdGVkID4gaGlzdG9ncmFtX2VuZXJnaWVzW2luZGV4XSkgeworICAgICAgICAgICAgKytpbmRleDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGxfc2l6ZSA9IDA7CisgICAgZm9yIChqID0gaW5kZXg7IGogPCAxMDAwOyArK2opIHsKKyAgICAgICAgc3RsX3NpemUgKz0gaGlzdFtqXTsKKyAgICB9CisgICAgaWYgKCFzdGxfc2l6ZSkgeworICAgICAgICAqb3V0ID0gMC4wOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwZXJjZW50aWxlX2xvdyA9IChzaXplX3QpICgoc3RsX3NpemUgLSAxKSAqIDAuMSArIDAuNSk7CisgICAgcGVyY2VudGlsZV9oaWdoID0gKHNpemVfdCkgKChzdGxfc2l6ZSAtIDEpICogMC45NSArIDAuNSk7CisKKyAgICBzdGxfc2l6ZSA9IDA7CisgICAgaiA9IGluZGV4OworICAgIHdoaWxlIChzdGxfc2l6ZSA8PSBwZXJjZW50aWxlX2xvdykgeworICAgICAgICBzdGxfc2l6ZSArPSBoaXN0W2orK107CisgICAgfQorICAgIGxfZW4gPSBoaXN0b2dyYW1fZW5lcmdpZXNbaiAtIDFdOworICAgIHdoaWxlIChzdGxfc2l6ZSA8PSBwZXJjZW50aWxlX2hpZ2gpIHsKKyAgICAgICAgc3RsX3NpemUgKz0gaGlzdFtqKytdOworICAgIH0KKyAgICBoX2VuID0gaGlzdG9ncmFtX2VuZXJnaWVzW2ogLSAxXTsKKyAgICAqb3V0ID0KKyAgICAgICAgZWJ1cjEyOF9lbmVyZ3lfdG9fbG91ZG5lc3MoaF9lbikgLQorICAgICAgICBlYnVyMTI4X2VuZXJneV90b19sb3VkbmVzcyhsX2VuKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2VidXIxMjhfbG91ZG5lc3NfcmFuZ2UoRkZFQlVSMTI4U3RhdGUgKiBzdCwgZG91YmxlICpvdXQpCit7CisgICAgcmV0dXJuIGZmX2VidXIxMjhfbG91ZG5lc3NfcmFuZ2VfbXVsdGlwbGUoJnN0LCAxLCBvdXQpOworfQorCitpbnQgZmZfZWJ1cjEyOF9zYW1wbGVfcGVhayhGRkVCVVIxMjhTdGF0ZSAqIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxfbnVtYmVyLCBkb3VibGUgKm91dCkKK3sKKyAgICBpZiAoKHN0LT5tb2RlICYgRkZfRUJVUjEyOF9NT0RFX1NBTVBMRV9QRUFLKSAhPQorICAgICAgICBGRl9FQlVSMTI4X01PREVfU0FNUExFX1BFQUspIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9IGVsc2UgaWYgKGNoYW5uZWxfbnVtYmVyID49IHN0LT5jaGFubmVscykgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICAqb3V0ID0gc3QtPmQtPnNhbXBsZV9wZWFrW2NoYW5uZWxfbnVtYmVyXTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2VidXIxMjguaCBiL2xpYmF2ZmlsdGVyL2VidXIxMjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDM2NzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvZWJ1cjEyOC5oCkBAIC0wLDAgKzEsMjk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEphbiBLb2tlbcO8bGxlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqCisgKiBUaGlzIGZpbGUgaXMgYmFzZWQgb24gbGliZWJ1cjEyOCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qaWl4eWovbGliZWJ1cjEyOC8KKyAqCisqLworCisjaWZuZGVmIEFWRklMVEVSX0VCVVIxMjhfSAorI2RlZmluZSBBVkZJTFRFUl9FQlVSMTI4X0gKKworLyoqIFxmaWxlIGVidXIxMjguaAorICogIFxicmllZiBsaWJlYnVyMTI4IC0gYSBsaWJyYXJ5IGZvciBsb3VkbmVzcyBtZWFzdXJlbWVudCBhY2NvcmRpbmcgdG8KKyAqICAgICAgICAgdGhlIEVCVSBSMTI4IHN0YW5kYXJkLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4gICAgICAgICAgICAgLyogZm9yIHNpemVfdCAqLworCisvKiogXGVudW0gY2hhbm5lbAorICogIFVzZSB0aGVzZSB2YWx1ZXMgd2hlbiBzZXR0aW5nIHRoZSBjaGFubmVsIG1hcCB3aXRoIGVidXIxMjhfc2V0X2NoYW5uZWwoKS4KKyAqICBTZWUgZGVmaW5pdGlvbnMgaW4gSVRVIFItUkVDLUJTIDE3NzAtNAorICovCitlbnVtIGNoYW5uZWwgeworICAgIEZGX0VCVVIxMjhfVU5VU0VEID0gMCwgICAvKio8IHVudXNlZCBjaGFubmVsIChmb3IgZXhhbXBsZSBMRkUgY2hhbm5lbCkgKi8KKyAgICBGRl9FQlVSMTI4X0xFRlQsCisgICAgRkZfRUJVUjEyOF9NcDAzMCA9IDEsICAgIC8qKjwgaXR1IE0rMDMwICovCisgICAgRkZfRUJVUjEyOF9SSUdIVCwKKyAgICBGRl9FQlVSMTI4X01tMDMwID0gMiwgICAgLyoqPCBpdHUgTS0wMzAgKi8KKyAgICBGRl9FQlVSMTI4X0NFTlRFUiwKKyAgICBGRl9FQlVSMTI4X01wMDAwID0gMywgICAgLyoqPCBpdHUgTSswMDAgKi8KKyAgICBGRl9FQlVSMTI4X0xFRlRfU1VSUk9VTkQsCisgICAgRkZfRUJVUjEyOF9NcDExMCA9IDQsICAgIC8qKjwgaXR1IE0rMTEwICovCisgICAgRkZfRUJVUjEyOF9SSUdIVF9TVVJST1VORCwKKyAgICBGRl9FQlVSMTI4X01tMTEwID0gNSwgICAgLyoqPCBpdHUgTS0xMTAgKi8KKyAgICBGRl9FQlVSMTI4X0RVQUxfTU9OTywgICAgLyoqPCBhIGNoYW5uZWwgdGhhdCBpcyBjb3VudGVkIHR3aWNlICovCisgICAgRkZfRUJVUjEyOF9NcFNDLCAgICAgICAgIC8qKjwgaXR1IE0rU0MgKi8KKyAgICBGRl9FQlVSMTI4X01tU0MsICAgICAgICAgLyoqPCBpdHUgTS1TQyAqLworICAgIEZGX0VCVVIxMjhfTXAwNjAsICAgICAgICAvKio8IGl0dSBNKzA2MCAqLworICAgIEZGX0VCVVIxMjhfTW0wNjAsICAgICAgICAvKio8IGl0dSBNLTA2MCAqLworICAgIEZGX0VCVVIxMjhfTXAwOTAsICAgICAgICAvKio8IGl0dSBNKzA5MCAqLworICAgIEZGX0VCVVIxMjhfTW0wOTAsICAgICAgICAvKio8IGl0dSBNLTA5MCAqLworICAgIEZGX0VCVVIxMjhfTXAxMzUsICAgICAgICAvKio8IGl0dSBNKzEzNSAqLworICAgIEZGX0VCVVIxMjhfTW0xMzUsICAgICAgICAvKio8IGl0dSBNLTEzNSAqLworICAgIEZGX0VCVVIxMjhfTXAxODAsICAgICAgICAvKio8IGl0dSBNKzE4MCAqLworICAgIEZGX0VCVVIxMjhfVXAwMDAsICAgICAgICAvKio8IGl0dSBVKzAwMCAqLworICAgIEZGX0VCVVIxMjhfVXAwMzAsICAgICAgICAvKio8IGl0dSBVKzAzMCAqLworICAgIEZGX0VCVVIxMjhfVW0wMzAsICAgICAgICAvKio8IGl0dSBVLTAzMCAqLworICAgIEZGX0VCVVIxMjhfVXAwNDUsICAgICAgICAvKio8IGl0dSBVKzA0NSAqLworICAgIEZGX0VCVVIxMjhfVW0wNDUsICAgICAgICAvKio8IGl0dSBVLTAzMCAqLworICAgIEZGX0VCVVIxMjhfVXAwOTAsICAgICAgICAvKio8IGl0dSBVKzA5MCAqLworICAgIEZGX0VCVVIxMjhfVW0wOTAsICAgICAgICAvKio8IGl0dSBVLTA5MCAqLworICAgIEZGX0VCVVIxMjhfVXAxMTAsICAgICAgICAvKio8IGl0dSBVKzExMCAqLworICAgIEZGX0VCVVIxMjhfVW0xMTAsICAgICAgICAvKio8IGl0dSBVLTExMCAqLworICAgIEZGX0VCVVIxMjhfVXAxMzUsICAgICAgICAvKio8IGl0dSBVKzEzNSAqLworICAgIEZGX0VCVVIxMjhfVW0xMzUsICAgICAgICAvKio8IGl0dSBVLTEzNSAqLworICAgIEZGX0VCVVIxMjhfVXAxODAsICAgICAgICAvKio8IGl0dSBVKzE4MCAqLworICAgIEZGX0VCVVIxMjhfVHAwMDAsICAgICAgICAvKio8IGl0dSBUKzAwMCAqLworICAgIEZGX0VCVVIxMjhfQnAwMDAsICAgICAgICAvKio8IGl0dSBCKzAwMCAqLworICAgIEZGX0VCVVIxMjhfQnAwNDUsICAgICAgICAvKio8IGl0dSBCKzA0NSAqLworICAgIEZGX0VCVVIxMjhfQm0wNDUgICAgICAgICAvKio8IGl0dSBCLTA0NSAqLworfTsKKworLyoqIFxlbnVtIG1vZGUKKyAqICBVc2UgdGhlc2UgdmFsdWVzIGluIGVidXIxMjhfaW5pdCAob3InZWQpLiBUcnkgdG8gdXNlIHRoZSBsb3dlc3QgcG9zc2libGUKKyAqICBtb2RlcyB0aGF0IHN1aXQgeW91ciBuZWVkcywgYXMgcGVyZm9ybWFuY2Ugd2lsbCBiZSBiZXR0ZXIuCisgKi8KK2VudW0gbW9kZSB7CisgIC8qKiBjYW4gY2FsbCBmZl9lYnVyMTI4X2xvdWRuZXNzX21vbWVudGFyeSAqLworICAgIEZGX0VCVVIxMjhfTU9ERV9NID0gKDEgPDwgMCksCisgIC8qKiBjYW4gY2FsbCBmZl9lYnVyMTI4X2xvdWRuZXNzX3Nob3J0dGVybSAqLworICAgIEZGX0VCVVIxMjhfTU9ERV9TID0gKDEgPDwgMSkgfCBGRl9FQlVSMTI4X01PREVfTSwKKyAgLyoqIGNhbiBjYWxsIGZmX2VidXIxMjhfbG91ZG5lc3NfZ2xvYmFsXyogYW5kIGZmX2VidXIxMjhfcmVsYXRpdmVfdGhyZXNob2xkICovCisgICAgRkZfRUJVUjEyOF9NT0RFX0kgPSAoMSA8PCAyKSB8IEZGX0VCVVIxMjhfTU9ERV9NLAorICAvKiogY2FuIGNhbGwgZmZfZWJ1cjEyOF9sb3VkbmVzc19yYW5nZSAqLworICAgIEZGX0VCVVIxMjhfTU9ERV9MUkEgPSAoMSA8PCAzKSB8IEZGX0VCVVIxMjhfTU9ERV9TLAorICAvKiogY2FuIGNhbGwgZmZfZWJ1cjEyOF9zYW1wbGVfcGVhayAqLworICAgIEZGX0VCVVIxMjhfTU9ERV9TQU1QTEVfUEVBSyA9ICgxIDw8IDQpIHwgRkZfRUJVUjEyOF9NT0RFX00sCit9OworCisvKiogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBGRkVCVVIxMjhTdGF0ZUludGVybmFsICovCitzdHJ1Y3QgRkZFQlVSMTI4U3RhdGVJbnRlcm5hbDsKKworLyoqIFxicmllZiBDb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdGUgb2YgYSBsb3VkbmVzcyBtZWFzdXJlbWVudC4KKyAqCisgKiAgWW91IHNob3VsZCBub3QgbmVlZCB0byBtb2RpZnkgdGhpcyBzdHJ1Y3QgZGlyZWN0bHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZGRUJVUjEyOFN0YXRlIHsKKyAgICBpbnQgbW9kZTsgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgY3VycmVudCBtb2RlLiAqLworICAgIHVuc2lnbmVkIGludCBjaGFubmVsczsgICAgICAgICAgICAvKio8IFRoZSBudW1iZXIgb2YgY2hhbm5lbHMuICovCisgICAgdW5zaWduZWQgbG9uZyBzYW1wbGVyYXRlOyAgICAgICAgIC8qKjwgVGhlIHNhbXBsZSByYXRlLiAqLworICAgIHN0cnVjdCBGRkVCVVIxMjhTdGF0ZUludGVybmFsICpkOyAvKio8IEludGVybmFsIHN0YXRlLiAqLworfSBGRkVCVVIxMjhTdGF0ZTsKKworLyoqIFxicmllZiBJbml0aWFsaXplIGxpYnJhcnkgc3RhdGUuCisgKgorICogIEBwYXJhbSBjaGFubmVscyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLgorICogIEBwYXJhbSBzYW1wbGVyYXRlIHRoZSBzYW1wbGUgcmF0ZS4KKyAqICBAcGFyYW0gd2luZG93IHNldCB0aGUgbWF4aW11bSB3aW5kb3cgc2l6ZSBpbiBtcywgc2V0IHRvIDAgZm9yIGF1dG8uCisgKiAgQHBhcmFtIG1vZGUgc2VlIHRoZSBtb2RlIGVudW0gZm9yIHBvc3NpYmxlIHZhbHVlcy4KKyAqICBAcmV0dXJuIGFuIGluaXRpYWxpemVkIGxpYnJhcnkgc3RhdGUuCisgKi8KK0ZGRUJVUjEyOFN0YXRlICpmZl9lYnVyMTI4X2luaXQodW5zaWduZWQgaW50IGNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgd2luZG93LCBpbnQgbW9kZSk7CisKKy8qKiBcYnJpZWYgRGVzdHJveSBsaWJyYXJ5IHN0YXRlLgorICoKKyAqICBAcGFyYW0gc3QgcG9pbnRlciB0byBhIGxpYnJhcnkgc3RhdGUuCisgKi8KK3ZvaWQgZmZfZWJ1cjEyOF9kZXN0cm95KEZGRUJVUjEyOFN0YXRlICoqIHN0KTsKKworLyoqIFxicmllZiBTZXQgY2hhbm5lbCB0eXBlLgorICoKKyAqICBUaGUgZGVmYXVsdCBpczoKKyAqICAtIDAgLT4gRkZfRUJVUjEyOF9MRUZUCisgKiAgLSAxIC0+IEZGX0VCVVIxMjhfUklHSFQKKyAqICAtIDIgLT4gRkZfRUJVUjEyOF9DRU5URVIKKyAqICAtIDMgLT4gRkZfRUJVUjEyOF9VTlVTRUQKKyAqICAtIDQgLT4gRkZfRUJVUjEyOF9MRUZUX1NVUlJPVU5ECisgKiAgLSA1IC0+IEZGX0VCVVIxMjhfUklHSFRfU1VSUk9VTkQKKyAqCisgKiAgQHBhcmFtIHN0IGxpYnJhcnkgc3RhdGUuCisgKiAgQHBhcmFtIGNoYW5uZWxfbnVtYmVyIHplcm8gYmFzZWQgY2hhbm5lbCBpbmRleC4KKyAqICBAcGFyYW0gdmFsdWUgY2hhbm5lbCB0eXBlIGZyb20gdGhlICJjaGFubmVsIiBlbnVtLgorICogIEByZXR1cm4KKyAqICAgIC0gMCBvbiBzdWNjZXNzLgorICogICAgLSBBVkVSUk9SKEVJTlZBTCkgaWYgaW52YWxpZCBjaGFubmVsIGluZGV4LgorICovCitpbnQgZmZfZWJ1cjEyOF9zZXRfY2hhbm5lbChGRkVCVVIxMjhTdGF0ZSAqIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxfbnVtYmVyLCBpbnQgdmFsdWUpOworCisvKiogXGJyaWVmIEFkZCBmcmFtZXMgdG8gYmUgcHJvY2Vzc2VkLgorICoKKyAqICBAcGFyYW0gc3QgbGlicmFyeSBzdGF0ZS4KKyAqICBAcGFyYW0gc3JjIGFycmF5IG9mIHNvdXJjZSBmcmFtZXMuIENoYW5uZWxzIG11c3QgYmUgaW50ZXJsZWF2ZWQuCisgKiAgQHBhcmFtIGZyYW1lcyBudW1iZXIgb2YgZnJhbWVzLiBOb3QgbnVtYmVyIG9mIHNhbXBsZXMhCisgKi8KK3ZvaWQgZmZfZWJ1cjEyOF9hZGRfZnJhbWVzX3Nob3J0KEZGRUJVUjEyOFN0YXRlICogc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKy8qKiBcYnJpZWYgU2VlIFxyZWYgZWJ1cjEyOF9hZGRfZnJhbWVzX3Nob3J0ICovCit2b2lkIGZmX2VidXIxMjhfYWRkX2ZyYW1lc19pbnQoRkZFQlVSMTI4U3RhdGUgKiBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKnNyYywgc2l6ZV90IGZyYW1lcyk7CisvKiogXGJyaWVmIFNlZSBccmVmIGVidXIxMjhfYWRkX2ZyYW1lc19zaG9ydCAqLwordm9pZCBmZl9lYnVyMTI4X2FkZF9mcmFtZXNfZmxvYXQoRkZFQlVSMTI4U3RhdGUgKiBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMsIHNpemVfdCBmcmFtZXMpOworLyoqIFxicmllZiBTZWUgXHJlZiBlYnVyMTI4X2FkZF9mcmFtZXNfc2hvcnQgKi8KK3ZvaWQgZmZfZWJ1cjEyOF9hZGRfZnJhbWVzX2RvdWJsZShGRkVCVVIxMjhTdGF0ZSAqIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqc3JjLCBzaXplX3QgZnJhbWVzKTsKKworLyoqIFxicmllZiBBZGQgZnJhbWVzIHRvIGJlIHByb2Nlc3NlZC4KKyAqCisgKiAgQHBhcmFtIHN0IGxpYnJhcnkgc3RhdGUuCisgKiAgQHBhcmFtIHNyY3MgYXJyYXkgb2Ygc291cmNlIGZyYW1lIGNoYW5uZWwgZGF0YSBwb2ludGVycworICogIEBwYXJhbSBmcmFtZXMgbnVtYmVyIG9mIGZyYW1lcy4gTm90IG51bWJlciBvZiBzYW1wbGVzIQorICogIEBwYXJhbSBzdHJpZGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gc2tpcCB0byBmb3IgdGhlIG5leHQgc2FtcGxlIG9mIHRoZSBzYW1lIGNoYW5uZWwKKyAqLwordm9pZCBmZl9lYnVyMTI4X2FkZF9mcmFtZXNfcGxhbmFyX3Nob3J0KEZGRUJVUjEyOFN0YXRlICogc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQgKipzcmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXMsIGludCBzdHJpZGUpOworLyoqIFxicmllZiBTZWUgXHJlZiBlYnVyMTI4X2FkZF9mcmFtZXNfcGxhbmFyX3Nob3J0ICovCit2b2lkIGZmX2VidXIxMjhfYWRkX2ZyYW1lc19wbGFuYXJfaW50KEZGRUJVUjEyOFN0YXRlICogc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqKnNyY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZXMsIGludCBzdHJpZGUpOworLyoqIFxicmllZiBTZWUgXHJlZiBlYnVyMTI4X2FkZF9mcmFtZXNfcGxhbmFyX3Nob3J0ICovCit2b2lkIGZmX2VidXIxMjhfYWRkX2ZyYW1lc19wbGFuYXJfZmxvYXQoRkZFQlVSMTI4U3RhdGUgKiBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqKnNyY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lcywgaW50IHN0cmlkZSk7CisvKiogXGJyaWVmIFNlZSBccmVmIGVidXIxMjhfYWRkX2ZyYW1lc19wbGFuYXJfc2hvcnQgKi8KK3ZvaWQgZmZfZWJ1cjEyOF9hZGRfZnJhbWVzX3BsYW5hcl9kb3VibGUoRkZFQlVSMTI4U3RhdGUgKiBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlICoqc3JjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lcywgaW50IHN0cmlkZSk7CisKKy8qKiBcYnJpZWYgR2V0IGdsb2JhbCBpbnRlZ3JhdGVkIGxvdWRuZXNzIGluIExVRlMuCisgKgorICogIEBwYXJhbSBzdCBsaWJyYXJ5IHN0YXRlLgorICogIEBwYXJhbSBvdXQgaW50ZWdyYXRlZCBsb3VkbmVzcyBpbiBMVUZTLiAtSFVHRV9WQUwgaWYgcmVzdWx0IGlzIG5lZ2F0aXZlCisgKiAgICAgICAgICAgICBpbmZpbml0eS4KKyAqICBAcmV0dXJuCisgKiAgICAtIDAgb24gc3VjY2Vzcy4KKyAqICAgIC0gQVZFUlJPUihFSU5WQUwpIGlmIG1vZGUgIkZGX0VCVVIxMjhfTU9ERV9JIiBoYXMgbm90IGJlZW4gc2V0LgorICovCitpbnQgZmZfZWJ1cjEyOF9sb3VkbmVzc19nbG9iYWwoRkZFQlVSMTI4U3RhdGUgKiBzdCwgZG91YmxlICpvdXQpOworLyoqIFxicmllZiBHZXQgZ2xvYmFsIGludGVncmF0ZWQgbG91ZG5lc3MgaW4gTFVGUyBhY3Jvc3MgbXVsdGlwbGUgaW5zdGFuY2VzLgorICoKKyAqICBAcGFyYW0gc3RzIGFycmF5IG9mIGxpYnJhcnkgc3RhdGVzLgorICogIEBwYXJhbSBzaXplIGxlbmd0aCBvZiBzdHMKKyAqICBAcGFyYW0gb3V0IGludGVncmF0ZWQgbG91ZG5lc3MgaW4gTFVGUy4gLUhVR0VfVkFMIGlmIHJlc3VsdCBpcyBuZWdhdGl2ZQorICogICAgICAgICAgICAgaW5maW5pdHkuCisgKiAgQHJldHVybgorICogICAgLSAwIG9uIHN1Y2Nlc3MuCisgKiAgICAtIEFWRVJST1IoRUlOVkFMKSBpZiBtb2RlICJGRl9FQlVSMTI4X01PREVfSSIgaGFzIG5vdCBiZWVuIHNldC4KKyAqLworaW50IGZmX2VidXIxMjhfbG91ZG5lc3NfZ2xvYmFsX211bHRpcGxlKEZGRUJVUjEyOFN0YXRlICoqIHN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgZG91YmxlICpvdXQpOworCisvKiogXGJyaWVmIEdldCBtb21lbnRhcnkgbG91ZG5lc3MgKGxhc3QgNDAwbXMpIGluIExVRlMuCisgKgorICogIEBwYXJhbSBzdCBsaWJyYXJ5IHN0YXRlLgorICogIEBwYXJhbSBvdXQgbW9tZW50YXJ5IGxvdWRuZXNzIGluIExVRlMuIC1IVUdFX1ZBTCBpZiByZXN1bHQgaXMgbmVnYXRpdmUKKyAqICAgICAgICAgICAgIGluZmluaXR5LgorICogIEByZXR1cm4KKyAqICAgIC0gMCBvbiBzdWNjZXNzLgorICovCitpbnQgZmZfZWJ1cjEyOF9sb3VkbmVzc19tb21lbnRhcnkoRkZFQlVSMTI4U3RhdGUgKiBzdCwgZG91YmxlICpvdXQpOworLyoqIFxicmllZiBHZXQgc2hvcnQtdGVybSBsb3VkbmVzcyAobGFzdCAzcykgaW4gTFVGUy4KKyAqCisgKiAgQHBhcmFtIHN0IGxpYnJhcnkgc3RhdGUuCisgKiAgQHBhcmFtIG91dCBzaG9ydC10ZXJtIGxvdWRuZXNzIGluIExVRlMuIC1IVUdFX1ZBTCBpZiByZXN1bHQgaXMgbmVnYXRpdmUKKyAqICAgICAgICAgICAgIGluZmluaXR5LgorICogIEByZXR1cm4KKyAqICAgIC0gMCBvbiBzdWNjZXNzLgorICogICAgLSBBVkVSUk9SKEVJTlZBTCkgaWYgbW9kZSAiRkZfRUJVUjEyOF9NT0RFX1MiIGhhcyBub3QgYmVlbiBzZXQuCisgKi8KK2ludCBmZl9lYnVyMTI4X2xvdWRuZXNzX3Nob3J0dGVybShGRkVCVVIxMjhTdGF0ZSAqIHN0LCBkb3VibGUgKm91dCk7CisKKy8qKiBcYnJpZWYgR2V0IGxvdWRuZXNzIG9mIHRoZSBzcGVjaWZpZWQgd2luZG93IGluIExVRlMuCisgKgorICogIHdpbmRvdyBtdXN0IG5vdCBiZSBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCB3aW5kb3cgc2V0IGluIHN0LgorICoKKyAqICBAcGFyYW0gc3QgbGlicmFyeSBzdGF0ZS4KKyAqICBAcGFyYW0gd2luZG93IHdpbmRvdyBpbiBtcyB0byBjYWxjdWxhdGUgbG91ZG5lc3MuCisgKiAgQHBhcmFtIG91dCBsb3VkbmVzcyBpbiBMVUZTLiAtSFVHRV9WQUwgaWYgcmVzdWx0IGlzIG5lZ2F0aXZlIGluZmluaXR5LgorICogIEByZXR1cm4KKyAqICAgIC0gMCBvbiBzdWNjZXNzLgorICogICAgLSBBVkVSUk9SKEVJTlZBTCkgaWYgd2luZG93IGxhcmdlciB0aGFuIGN1cnJlbnQgd2luZG93IGluIHN0LgorICovCitpbnQgZmZfZWJ1cjEyOF9sb3VkbmVzc193aW5kb3coRkZFQlVSMTI4U3RhdGUgKiBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHdpbmRvdywgZG91YmxlICpvdXQpOworCisvKiogXGJyaWVmIEdldCBsb3VkbmVzcyByYW5nZSAoTFJBKSBvZiBwcm9ncmFtbWUgaW4gTFUuCisgKgorICogIENhbGN1bGF0ZXMgbG91ZG5lc3MgcmFuZ2UgYWNjb3JkaW5nIHRvIEVCVSAzMzQyLgorICoKKyAqICBAcGFyYW0gc3QgbGlicmFyeSBzdGF0ZS4KKyAqICBAcGFyYW0gb3V0IGxvdWRuZXNzIHJhbmdlIChMUkEpIGluIExVLiBXaWxsIG5vdCBiZSBjaGFuZ2VkIGluIGNhc2Ugb2YKKyAqICAgICAgICAgICAgIGVycm9yLiBBVkVSUk9SKEVJTlZBTCkgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGlzIGNhc2UuCisgKiAgQHJldHVybgorICogICAgLSAwIG9uIHN1Y2Nlc3MuCisgKiAgICAtIEFWRVJST1IoRUlOVkFMKSBpZiBtb2RlICJGRl9FQlVSMTI4X01PREVfTFJBIiBoYXMgbm90IGJlZW4gc2V0LgorICovCitpbnQgZmZfZWJ1cjEyOF9sb3VkbmVzc19yYW5nZShGRkVCVVIxMjhTdGF0ZSAqIHN0LCBkb3VibGUgKm91dCk7CisvKiogXGJyaWVmIEdldCBsb3VkbmVzcyByYW5nZSAoTFJBKSBpbiBMVSBhY3Jvc3MgbXVsdGlwbGUgaW5zdGFuY2VzLgorICoKKyAqICBDYWxjdWxhdGVzIGxvdWRuZXNzIHJhbmdlIGFjY29yZGluZyB0byBFQlUgMzM0Mi4KKyAqCisgKiAgQHBhcmFtIHN0cyBhcnJheSBvZiBsaWJyYXJ5IHN0YXRlcy4KKyAqICBAcGFyYW0gc2l6ZSBsZW5ndGggb2Ygc3RzCisgKiAgQHBhcmFtIG91dCBsb3VkbmVzcyByYW5nZSAoTFJBKSBpbiBMVS4gV2lsbCBub3QgYmUgY2hhbmdlZCBpbiBjYXNlIG9mCisgKiAgICAgICAgICAgICBlcnJvci4gQVZFUlJPUihFSU5WQUwpIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhpcyBjYXNlLgorICogIEByZXR1cm4KKyAqICAgIC0gMCBvbiBzdWNjZXNzLgorICogICAgLSBBVkVSUk9SKEVJTlZBTCkgaWYgbW9kZSAiRkZfRUJVUjEyOF9NT0RFX0xSQSIgaGFzIG5vdCBiZWVuIHNldC4KKyAqLworaW50IGZmX2VidXIxMjhfbG91ZG5lc3NfcmFuZ2VfbXVsdGlwbGUoRkZFQlVSMTI4U3RhdGUgKiogc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGRvdWJsZSAqb3V0KTsKKworLyoqIFxicmllZiBHZXQgbWF4aW11bSBzYW1wbGUgcGVhayBvZiBzZWxlY3RlZCBjaGFubmVsIGluIGZsb2F0IGZvcm1hdC4KKyAqCisgKiAgQHBhcmFtIHN0IGxpYnJhcnkgc3RhdGUKKyAqICBAcGFyYW0gY2hhbm5lbF9udW1iZXIgY2hhbm5lbCB0byBhbmFseXNlCisgKiAgQHBhcmFtIG91dCBtYXhpbXVtIHNhbXBsZSBwZWFrIGluIGZsb2F0IGZvcm1hdCAoMS4wIGlzIDAgZEJGUykKKyAqICBAcmV0dXJuCisgKiAgICAtIDAgb24gc3VjY2Vzcy4KKyAqICAgIC0gQVZFUlJPUihFSU5WQUwpIGlmIG1vZGUgIkZGX0VCVVIxMjhfTU9ERV9TQU1QTEVfUEVBSyIgaGFzIG5vdCBiZWVuIHNldC4KKyAqICAgIC0gQVZFUlJPUihFSU5WQUwpIGlmIGludmFsaWQgY2hhbm5lbCBpbmRleC4KKyAqLworaW50IGZmX2VidXIxMjhfc2FtcGxlX3BlYWsoRkZFQlVSMTI4U3RhdGUgKiBzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsX251bWJlciwgZG91YmxlICpvdXQpOworCisvKiogXGJyaWVmIEdldCByZWxhdGl2ZSB0aHJlc2hvbGQgaW4gTFVGUy4KKyAqCisgKiAgQHBhcmFtIHN0IGxpYnJhcnkgc3RhdGUKKyAqICBAcGFyYW0gb3V0IHJlbGF0aXZlIHRocmVzaG9sZCBpbiBMVUZTLgorICogIEByZXR1cm4KKyAqICAgIC0gMCBvbiBzdWNjZXNzLgorICogICAgLSBBVkVSUk9SKEVJTlZBTCkgaWYgbW9kZSAiRkZfRUJVUjEyOF9NT0RFX0kiIGhhcyBub3QgYmVlbiBzZXQuCisgKi8KK2ludCBmZl9lYnVyMTI4X3JlbGF0aXZlX3RocmVzaG9sZChGRkVCVVIxMjhTdGF0ZSAqIHN0LCBkb3VibGUgKm91dCk7CisKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQVZGSUxURVJfRUJVUjEyOF9IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9mX2JlbmNoLmMgYi9saWJhdmZpbHRlci9mX2JlbmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllMTAwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2ZfYmVuY2guYwpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZW51bSBCZW5jaEFjdGlvbiB7CisgICAgQUNUSU9OX1NUQVJULAorICAgIEFDVElPTl9TVE9QLAorICAgIE5CX0FDVElPTgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgQmVuY2hDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgYWN0aW9uOworICAgIGludDY0X3QgbWF4LCBtaW47CisgICAgaW50NjRfdCBzdW07CisgICAgaW50IG47Cit9IEJlbmNoQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQmVuY2hDb250ZXh0LCB4KQorI2RlZmluZSBERUZJTkVfT1BUSU9OUyhmaWx0X25hbWUsIEZMQUdTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZpbHRfbmFtZSMjX29wdGlvbnNbXSA9IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgImFjdGlvbiIsICJzZXQgYWN0aW9uIiwgT0ZGU0VUKGFjdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9QUNUSU9OX1NUQVJUfSwgMCwgTkJfQUNUSU9OLTEsIEZMQUdTLCAiYWN0aW9uIiB9LCAgXAorICAgICAgICB7ICJzdGFydCIsICJzdGFydCB0aW1lciIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QUNUSU9OX1NUQVJUfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJhY3Rpb24iIH0sICAgICAgXAorICAgICAgICB7ICJzdG9wIiwgICJzdG9wIHRpbWVyIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QUNUSU9OX1NUT1B9LCAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJhY3Rpb24iIH0sICAgICAgXAorICAgIHsgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIFNUQVJUX1RJTUVfS0VZICJsYXZmaS5iZW5jaC5zdGFydF90aW1lIgorI2RlZmluZSBUMkYodikgKCh2KSAvIDEwMDAwMDAuKQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBCZW5jaENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgcy0+bWluID0gSU5UNjRfTUFYOworICAgIHMtPm1heCA9IElOVDY0X01JTjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQmVuY2hDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBjb25zdCBpbnQ2NF90IHQgPSBhdl9nZXR0aW1lKCk7CisKKyAgICBpZiAodCA8IDApCisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW4pOworCisgICAgaWYgKHMtPmFjdGlvbiA9PSBBQ1RJT05fU1RBUlQpIHsKKyAgICAgICAgYXZfZGljdF9zZXRfaW50KCZpbi0+bWV0YWRhdGEsIFNUQVJUX1RJTUVfS0VZLCB0LCAwKTsKKyAgICB9IGVsc2UgaWYgKHMtPmFjdGlvbiA9PSBBQ1RJT05fU1RPUCkgeworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZSA9IGF2X2RpY3RfZ2V0KGluLT5tZXRhZGF0YSwgU1RBUlRfVElNRV9LRVksIE5VTEwsIDApOworICAgICAgICBpZiAoZSkgeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBzdGFydCA9IHN0cnRvbGwoZS0+dmFsdWUsIE5VTEwsIDApOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkaWZmID0gdCAtIHN0YXJ0OworICAgICAgICAgICAgcy0+c3VtICs9IGRpZmY7CisgICAgICAgICAgICBzLT5uKys7CisgICAgICAgICAgICBzLT5taW4gPSBGRk1JTihzLT5taW4sIGRpZmYpOworICAgICAgICAgICAgcy0+bWF4ID0gRkZNQVgocy0+bWF4LCBkaWZmKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgInQ6JWYgYXZnOiVmIG1heDolZiBtaW46JWZcbiIsCisgICAgICAgICAgICAgICAgICAgVDJGKGRpZmYpLCBUMkYocy0+c3VtIC8gcy0+biksIFQyRihzLT5tYXgpLCBUMkYocy0+bWluKSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGljdF9zZXQoJmluLT5tZXRhZGF0YSwgU1RBUlRfVElNRV9LRVksIE5VTEwsIDApOworICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW4pOworfQorCisjaWYgQ09ORklHX0JFTkNIX0ZJTFRFUgorREVGSU5FX09QVElPTlMoYmVuY2gsIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTSk7CitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYmVuY2gpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYmVuY2hfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBiZW5jaF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfYmVuY2ggPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiYmVuY2giLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJlbmNobWFyayBwYXJ0IG9mIGEgZmlsdGVyZ3JhcGguIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQmVuY2hDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSBiZW5jaF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBiZW5jaF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmJlbmNoX2NsYXNzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfQkVOQ0hfRklMVEVSICovCisKKyNpZiBDT05GSUdfQUJFTkNIX0ZJTFRFUgorREVGSU5FX09QVElPTlMoYWJlbmNoLCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0pOworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFiZW5jaCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhYmVuY2hfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhYmVuY2hfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FiZW5jaCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhYmVuY2giLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJlbmNobWFyayBwYXJ0IG9mIGEgZmlsdGVyZ3JhcGguIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQmVuY2hDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSBhYmVuY2hfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYWJlbmNoX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmYWJlbmNoX2NsYXNzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfQUJFTkNIX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZl9kcmF3Z3JhcGguYyBiL2xpYmF2ZmlsdGVyL2ZfZHJhd2dyYXBoLmMKaW5kZXggMGNhMGQyMi4uOGJlOWI5ZiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZl9kcmF3Z3JhcGguYworKysgYi9saWJhdmZpbHRlci9mX2RyYXdncmFwaC5jCkBAIC00NCw2ICs0NCw5IEBACiAgICAgaW50ICAgICAgICAgICB4OwogICAgIGludCAgICAgICAgICAgcHJldl95WzRdOwogICAgIGludCAgICAgICAgICAgZmlyc3Q7CisgICAgZmxvYXQgICAgICAgICAqdmFsdWVzWzRdOworICAgIGludCAgICAgICAgICAgdmFsdWVzX3NpemVbNF07CisgICAgaW50ICAgICAgICAgICBuYl92YWx1ZXM7CiB9IERyYXdHcmFwaENvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERyYXdHcmFwaENvbnRleHQsIHgpCkBAIC02NSwxMSArNjgsMTIgQEAKICAgICAgICAgeyJiYXIiLCAiZHJhdyBiYXJzIiwgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAibW9kZSJ9LAogICAgICAgICB7ImRvdCIsICJkcmF3IGRvdHMiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgRkxBR1MsICJtb2RlIn0sCiAgICAgICAgIHsibGluZSIsICJkcmF3IGxpbmVzIiwgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Mn0sIDAsIDAsIEZMQUdTLCAibW9kZSJ9LAotICAgIHsgInNsaWRlIiwgInNldCBzbGlkZSBtb2RlIiwgT0ZGU0VUKHNsaWRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMywgRkxBR1MsICJzbGlkZSIgfSwKKyAgICB7ICJzbGlkZSIsICJzZXQgc2xpZGUgbW9kZSIsIE9GRlNFVChzbGlkZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDQsIEZMQUdTLCAic2xpZGUiIH0sCiAgICAgICAgIHsiZnJhbWUiLCAiZHJhdyBuZXcgZnJhbWVzIiwgT0ZGU0VUKHNsaWRlKSwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBGTEFHUywgInNsaWRlIn0sCiAgICAgICAgIHsicmVwbGFjZSIsICJyZXBsYWNlIG9sZCBjb2x1bW5zIHdpdGggbmV3IiwgT0ZGU0VUKHNsaWRlKSwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgInNsaWRlIn0sCiAgICAgICAgIHsic2Nyb2xsIiwgInNjcm9sbCBmcm9tIHJpZ2h0IHRvIGxlZnQiLCBPRkZTRVQoc2xpZGUpLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Mn0sIDAsIDAsIEZMQUdTLCAic2xpZGUifSwKICAgICAgICAgeyJyc2Nyb2xsIiwgInNjcm9sbCBmcm9tIGxlZnQgdG8gcmlnaHQiLCBPRkZTRVQoc2xpZGUpLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9M30sIDAsIDAsIEZMQUdTLCAic2xpZGUifSwKKyAgICAgICAgeyJwaWN0dXJlIiwgImRpc3BsYXkgZ3JhcGggaW4gc2luZ2xlIGZyYW1lIiwgT0ZGU0VUKHNsaWRlKSwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTR9LCAwLCAwLCBGTEFHUywgInNsaWRlIn0sCiAgICAgeyAic2l6ZSIsICJzZXQgZ3JhcGggc2l6ZSIsIE9GRlNFVCh3KSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHI9IjkwMHgyNTYifSwgMCwgMCwgRkxBR1MgfSwKICAgICB7ICJzIiwgInNldCBncmFwaCBzaXplIiwgT0ZGU0VUKHcpLCBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0cj0iOTAweDI1NiJ9LCAwLCAwLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CkBAIC0xMDAsNiArMTA0LDE4IEBACiAKICAgICBzLT5maXJzdCA9IDE7CiAKKyAgICBpZiAocy0+c2xpZGUgPT0gNCkgeworICAgICAgICBzLT52YWx1ZXNbMF0gPSBhdl9mYXN0X3JlYWxsb2MoTlVMTCwgJnMtPnZhbHVlc19zaXplWzBdLCAyMDAwKTsKKyAgICAgICAgcy0+dmFsdWVzWzFdID0gYXZfZmFzdF9yZWFsbG9jKE5VTEwsICZzLT52YWx1ZXNfc2l6ZVsxXSwgMjAwMCk7CisgICAgICAgIHMtPnZhbHVlc1syXSA9IGF2X2Zhc3RfcmVhbGxvYyhOVUxMLCAmcy0+dmFsdWVzX3NpemVbMl0sIDIwMDApOworICAgICAgICBzLT52YWx1ZXNbM10gPSBhdl9mYXN0X3JlYWxsb2MoTlVMTCwgJnMtPnZhbHVlc19zaXplWzNdLCAyMDAwKTsKKworICAgICAgICBpZiAoIXMtPnZhbHVlc1swXSB8fCAhcy0+dmFsdWVzWzFdIHx8CisgICAgICAgICAgICAhcy0+dmFsdWVzWzJdIHx8ICFzLT52YWx1ZXNbM10pIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTQ0LDIxICsxNjAsNDcgQEAKICAgICBBVkZyYW1lICpvdXQgPSBzLT5vdXQ7CiAgICAgaW50IGk7CiAKLSAgICBpZiAoIXMtPm91dCB8fCBzLT5vdXQtPndpZHRoICAhPSBvdXRsaW5rLT53IHx8Ci0gICAgICAgICAgICAgICAgICAgcy0+b3V0LT5oZWlnaHQgIT0gb3V0bGluay0+aCkgewotICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5vdXQpOwotICAgICAgICBzLT5vdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOwotICAgICAgICBvdXQgPSBzLT5vdXQ7Ci0gICAgICAgIGlmICghcy0+b3V0KSB7Ci0gICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgaWYgKHMtPnNsaWRlID09IDQgJiYgcy0+bmJfdmFsdWVzID49IHMtPnZhbHVlc19zaXplWzBdIC8gc2l6ZW9mKGZsb2F0KSkgeworICAgICAgICBmbG9hdCAqcHRyOworCisgICAgICAgIHB0ciA9IGF2X2Zhc3RfcmVhbGxvYyhzLT52YWx1ZXNbMF0sICZzLT52YWx1ZXNfc2l6ZVswXSwgcy0+dmFsdWVzX3NpemVbMF0gKiAyKTsKKyAgICAgICAgaWYgKCFwdHIpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICB9CisgICAgICAgIHMtPnZhbHVlc1swXSA9IHB0cjsKIAotICAgICAgICBjbGVhcl9pbWFnZShzLCBvdXQsIG91dGxpbmspOworICAgICAgICBwdHIgPSBhdl9mYXN0X3JlYWxsb2Mocy0+dmFsdWVzWzFdLCAmcy0+dmFsdWVzX3NpemVbMV0sIHMtPnZhbHVlc19zaXplWzFdICogMik7CisgICAgICAgIGlmICghcHRyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcy0+dmFsdWVzWzFdID0gcHRyOworCisgICAgICAgIHB0ciA9IGF2X2Zhc3RfcmVhbGxvYyhzLT52YWx1ZXNbMl0sICZzLT52YWx1ZXNfc2l6ZVsyXSwgcy0+dmFsdWVzX3NpemVbMl0gKiAyKTsKKyAgICAgICAgaWYgKCFwdHIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzLT52YWx1ZXNbMl0gPSBwdHI7CisKKyAgICAgICAgcHRyID0gYXZfZmFzdF9yZWFsbG9jKHMtPnZhbHVlc1szXSwgJnMtPnZhbHVlc19zaXplWzNdLCBzLT52YWx1ZXNfc2l6ZVszXSAqIDIpOworICAgICAgICBpZiAoIXB0cikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHMtPnZhbHVlc1szXSA9IHB0cjsKICAgICB9Ci0gICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKIAotICAgIG1ldGFkYXRhID0gYXZfZnJhbWVfZ2V0X21ldGFkYXRhKGluKTsKKyAgICBpZiAocy0+c2xpZGUgIT0gNCB8fCBzLT5uYl92YWx1ZXMgPT0gMCkgeworICAgICAgICBpZiAoIXMtPm91dCB8fCBzLT5vdXQtPndpZHRoICAhPSBvdXRsaW5rLT53IHx8CisgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dC0+aGVpZ2h0ICE9IG91dGxpbmstPmgpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm91dCk7CisgICAgICAgICAgICBzLT5vdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICAgICAgb3V0ID0gcy0+b3V0OworICAgICAgICAgICAgaWYgKCFzLT5vdXQpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xlYXJfaW1hZ2Uocywgb3V0LCBvdXRsaW5rKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIH0KKworICAgIG1ldGFkYXRhID0gaW4tPm1ldGFkYXRhOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICBkb3VibGUgdmFsdWVzW1ZBUl9WQVJTX05CXTsKQEAgLTE2Niw2ICsyMDgsOSBAQAogICAgICAgICB1aW50MzJfdCBmZywgYmc7CiAgICAgICAgIGZsb2F0IHZmOwogCisgICAgICAgIGlmIChzLT5zbGlkZSA9PSA0KQorICAgICAgICAgICAgcy0+dmFsdWVzW2ldW3MtPm5iX3ZhbHVlc10gPSBOQU47CisKICAgICAgICAgZSA9IGF2X2RpY3RfZ2V0KG1ldGFkYXRhLCBzLT5rZXlbaV0sIE5VTEwsIDApOwogICAgICAgICBpZiAoIWUgfHwgIWUtPnZhbHVlKQogICAgICAgICAgICAgY29udGludWU7CkBAIC0xNzUsNiArMjIwLDExIEBACiAKICAgICAgICAgdmYgPSBhdl9jbGlwZih2Ziwgcy0+bWluLCBzLT5tYXgpOwogCisgICAgICAgIGlmIChzLT5zbGlkZSA9PSA0KSB7CisgICAgICAgICAgICBzLT52YWx1ZXNbaV1bcy0+bmJfdmFsdWVzXSA9IHZmOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICB2YWx1ZXNbVkFSX01JTl0gPSBzLT5taW47CiAgICAgICAgIHZhbHVlc1tWQVJfTUFYXSA9IHMtPm1heDsKICAgICAgICAgdmFsdWVzW1ZBUl9WQUxdID0gdmY7CkBAIC0yNTUsMTIgKzMwNSw5OSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcy0+bmJfdmFsdWVzKys7CiAgICAgcy0+eCsrOwogCiAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworCisgICAgaWYgKHMtPnNsaWRlID09IDQpCisgICAgICAgIHJldHVybiAwOworCiAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBhdl9mcmFtZV9jbG9uZShzLT5vdXQpKTsKIH0KIAorc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBEcmF3R3JhcGhDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKm91dCA9IHMtPm91dDsKKyAgICBpbnQgcmV0LCBpLCBrLCBzdGVwLCBsOworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisKKyAgICBpZiAocy0+c2xpZGUgPT0gNCAmJiByZXQgPT0gQVZFUlJPUl9FT0YgJiYgcy0+bmJfdmFsdWVzID4gMCkgeworICAgICAgICBzLT54ID0gbCA9IDA7CisgICAgICAgIHN0ZXAgPSBjZWlsKHMtPm5iX3ZhbHVlcyAvIChmbG9hdClzLT53KTsKKworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+bmJfdmFsdWVzOyBrKyspIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWVzW1ZBUl9WQVJTX05CXTsKKyAgICAgICAgICAgICAgICBpbnQgaiwgeSwgeCwgb2xkOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGZnLCBiZzsKKyAgICAgICAgICAgICAgICBmbG9hdCB2ZiA9IHMtPnZhbHVlc1tpXVtrXTsKKworICAgICAgICAgICAgICAgIGlmIChpc25hbih2ZikpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgdmFsdWVzW1ZBUl9NSU5dID0gcy0+bWluOworICAgICAgICAgICAgICAgIHZhbHVlc1tWQVJfTUFYXSA9IHMtPm1heDsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbVkFSX1ZBTF0gPSB2ZjsKKworICAgICAgICAgICAgICAgIGZnID0gYXZfZXhwcl9ldmFsKHMtPmZnX2V4cHJbaV0sIHZhbHVlcywgTlVMTCk7CisgICAgICAgICAgICAgICAgYmcgPSBBVl9STjMyKHMtPmJnKTsKKworICAgICAgICAgICAgICAgIHggPSBzLT54OworICAgICAgICAgICAgICAgIHkgPSAob3V0bGluay0+aCAtIDEpICogKDEgLSAoKHZmIC0gcy0+bWluKSAvIChzLT5tYXggLSBzLT5taW4pKSk7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHMtPm1vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIG9sZCA9IEFWX1JOMzIob3V0LT5kYXRhWzBdICsgeSAqIG91dC0+bGluZXNpemVbMF0gKyB4ICogNCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IHk7IGogPCBvdXRsaW5rLT5oOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGQgIT0gYmcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZfUk4zMihvdXQtPmRhdGFbMF0gKyBqICogb3V0LT5saW5lc2l6ZVswXSArIHggKiA0KSAhPSBvbGQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUk4zMihvdXQtPmRhdGFbMF0gKyBGRk1JTihqKzEsIG91dGxpbmstPmggLSAxKSAqIG91dC0+bGluZXNpemVbMF0gKyB4ICogNCkgIT0gb2xkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19kb3QoZmcsIHgsIGosIG91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2RvdChmZywgeCwgaiwgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGRyYXdfZG90KGZnLCB4LCB5LCBvdXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5maXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+Zmlyc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldl95W2ldID0geTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICh5IDw9IHMtPnByZXZfeVtpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0geTsgaiA8PSBzLT5wcmV2X3lbaV07IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2RvdChmZywgeCwgaiwgb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IHMtPnByZXZfeVtpXTsgaiA8PSB5OyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19kb3QoZmcsIHgsIGosIG91dCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcy0+cHJldl95W2ldID0geTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsKys7CisgICAgICAgICAgICBpZiAobCA+PSBzdGVwKSB7CisgICAgICAgICAgICAgICAgbCA9IDA7CisgICAgICAgICAgICAgICAgcy0+eCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcy0+bmJfdmFsdWVzID0gMDsKKyAgICAgICAgb3V0LT5wdHMgPSAwOworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBzLT5vdXQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCiB7CiAgICAgRHJhd0dyYXBoQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKQEAgLTI3OSw3ICs0MTYsMTQgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgIGF2X2V4cHJfZnJlZShzLT5mZ19leHByW2ldKTsKLSAgICBhdl9mcmFtZV9mcmVlKCZzLT5vdXQpOworCisgICAgaWYgKHMtPnNsaWRlICE9IDQpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm91dCk7CisKKyAgICBhdl9mcmVlcCgmcy0+dmFsdWVzWzBdKTsKKyAgICBhdl9mcmVlcCgmcy0+dmFsdWVzWzFdKTsKKyAgICBhdl9mcmVlcCgmcy0+dmFsdWVzWzJdKTsKKyAgICBhdl9mcmVlcCgmcy0+dmFsdWVzWzNdKTsKIH0KIAogI2lmIENPTkZJR19EUkFXR1JBUEhfRklMVEVSCkBAIC0zMDAsNiArNDQ0LDcgQEAKICAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtMzM3LDYgKzQ4Miw3IEBACiAgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2ZfZWJ1cjEyOC5jIGIvbGliYXZmaWx0ZXIvZl9lYnVyMTI4LmMKaW5kZXggYzRiMzBiNC4uMWU4YjkwZiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZl9lYnVyMTI4LmMKKysrIGIvbGliYXZmaWx0ZXIvZl9lYnVyMTI4LmMKQEAgLTMsMTkgKzMsMTkgQEAKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKgogICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCi0gKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCiAvKioKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZm1hdGguaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCkBAIC04OSw3ICs5MCw3IEBACiAKIHN0cnVjdCByZWN0IHsgaW50IHgsIHksIHcsIGg7IH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IEVCVVIxMjhDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsgICAgICAgICAgIC8vLzwgQVZDbGFzcyBjb250ZXh0IGZvciBsb2cgYW5kIG9wdGlvbnMgcHVycG9zZQogCiAgICAgLyogcGVhayBtZXRlcmluZyAqLwpAQCAtMTQwLDcgKzE0MSw3IEBACiAgICAgaW50IGxvZ2xldmVsOyAgICAgICAgICAgICAgICAgICAvLy88IGxvZyBsZXZlbCBmb3IgZnJhbWUgbG9nZ2luZwogICAgIGludCBtZXRhZGF0YTsgICAgICAgICAgICAgICAgICAgLy8vPCB3aGV0aGVyIG9yIG5vdCB0byBpbmplY3QgbG91ZG5lc3MgcmVzdWx0cyBpbiBmcmFtZXMKICAgICBpbnQgZHVhbF9tb25vOyAgICAgICAgICAgICAgICAgIC8vLzwgd2hldGhlciBvciBub3QgdG8gdHJlYXQgc2luZ2xlIGNoYW5uZWwgaW5wdXQgZmlsZXMgYXMgZHVhbC1tb25vCi0gICAgZG91YmxlIHBhbl9sYXc7ICAgICAgICAgICAgICAgICAvLy88IHBhbiBsYXcgdmFsdWUgdXNlZCB0byBjYWx1bGF0ZSBkdWFsLW1vbm8gbWVhc3VyZW1lbnRzCisgICAgZG91YmxlIHBhbl9sYXc7ICAgICAgICAgICAgICAgICAvLy88IHBhbiBsYXcgdmFsdWUgdXNlZCB0byBjYWxjdWxhdGUgZHVhbC1tb25vIG1lYXN1cmVtZW50cwogfSBFQlVSMTI4Q29udGV4dDsKIAogZW51bSB7CkBAIC0yNjgsNiArMjY5LDcgQEAKICAgICB9CiAgICAgb3V0bGluay0+dyA9IGVidXIxMjgtPnc7CiAgICAgb3V0bGluay0+aCA9IGVidXIxMjgtPmg7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLDF9OwogCiAjZGVmaW5lIFBBRCA4CiAKQEAgLTI5OCw3ICszMDAsNyBAQAogICAgICAgICBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOwogICAgIGlmICghb3V0cGljcmVmKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MSwxfTsKKyAgICBvdXRwaWNyZWYtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MSwxfTsKIAogICAgIC8qIGluaXQgeSByZWZlcmVuY2VzIHZhbHVlcyAodG8gZHJhdyBMVSBsaW5lcykgKi8KICAgICBlYnVyMTI4LT55X2xpbmVfcmVmID0gYXZfY2FsbG9jKGVidXIxMjgtPmdyYXBoLmggKyAxLCBzaXplb2YoKmVidXIxMjgtPnlfbGluZV9yZWYpKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2ZfaW50ZXJsZWF2ZS5jIGIvbGliYXZmaWx0ZXIvZl9pbnRlcmxlYXZlLmMKaW5kZXggNDIyZjJiZi4uZDhhNzNiNSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZl9pbnRlcmxlYXZlLmMKKysrIGIvbGliYXZmaWx0ZXIvZl9pbnRlcmxlYXZlLmMKQEAgLTI2LDYgKzI2LDEwIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorCisjZGVmaW5lIEZGX0lOVEVSTkFMX0ZJRUxEUyAxCisjaW5jbHVkZSAiZnJhbWVxdWV1ZS5oIgorCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKICNpbmNsdWRlICJidWZmZXJxdWV1ZS5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKQEAgLTMzLDcgKzM3LDcgQEAKICNpbmNsdWRlICJhdWRpby5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IEludGVybGVhdmVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgbmJfaW5wdXRzOwogICAgIHN0cnVjdCBGRkJ1ZlF1ZXVlICpxdWV1ZXM7CkBAIC01OSw3ICs2Myw3IEBACiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfaW5wdXRzOyBpKyspIHsKICAgICAgICAgc3RydWN0IEZGQnVmUXVldWUgKnEgPSAmcy0+cXVldWVzW2ldOwogCi0gICAgICAgIGlmICghcS0+YXZhaWxhYmxlICYmICFjdHgtPmlucHV0c1tpXS0+c3RhdHVzKQorICAgICAgICBpZiAoIXEtPmF2YWlsYWJsZSAmJiAhY3R4LT5pbnB1dHNbaV0tPnN0YXR1c19vdXQpCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgaWYgKHEtPmF2YWlsYWJsZSkgewogICAgICAgICAgICAgZnJhbWUgPSBmZl9idWZxdWV1ZV9wZWVrKHEsIDApOwpAQCAtMTA2LDcgKzExMCw3IEBACiB7CiAgICAgSW50ZXJsZWF2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgY29uc3QgQVZGaWx0ZXJQYWQgKm91dHBhZCA9ICZjdHgtPmZpbHRlci0+b3V0cHV0c1swXTsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgcmV0OwogCiAgICAgcy0+cXVldWVzID0gYXZfY2FsbG9jKHMtPm5iX2lucHV0cywgc2l6ZW9mKHMtPnF1ZXVlc1swXSkpOwogICAgIGlmICghcy0+cXVldWVzKQpAQCAtMTI5LDcgKzEzMywxMCBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKICAgICAgICAgfQotICAgICAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmaW5wYWQpOworICAgICAgICBpZiAoKHJldCA9IGZmX2luc2VydF9pbnBhZChjdHgsIGksICZpbnBhZCkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJmlucGFkLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMTkwLDcgKzE5Nyw3IEBACiAgICAgaW50IGksIHJldDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKSB7Ci0gICAgICAgIGlmICghcy0+cXVldWVzW2ldLmF2YWlsYWJsZSAmJiAhY3R4LT5pbnB1dHNbaV0tPnN0YXR1cykgeworICAgICAgICBpZiAoIXMtPnF1ZXVlc1tpXS5hdmFpbGFibGUgJiYgIWN0eC0+aW5wdXRzW2ldLT5zdGF0dXNfb3V0KSB7CiAgICAgICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW2ldKTsKICAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUl9FT0YpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2ZfbG9vcC5jIGIvbGliYXZmaWx0ZXIvZl9sb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU1ZmU2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL2ZfbG9vcC5jCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F1ZGlvX2ZpZm8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgTG9vcENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQVZBdWRpb0ZpZm8gKmZpZm87CisgICAgQVZBdWRpb0ZpZm8gKmxlZnQ7CisgICAgQVZGcmFtZSAqKmZyYW1lczsKKyAgICBpbnQgbmJfZnJhbWVzOworICAgIGludCBjdXJyZW50X2ZyYW1lOworICAgIGludDY0X3Qgc3RhcnRfcHRzOworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgaW50NjRfdCBjdXJyZW50X3NhbXBsZTsKKyAgICBpbnQ2NF90IG5iX3NhbXBsZXM7CisgICAgaW50NjRfdCBpZ25vcmVkX3NhbXBsZXM7CisKKyAgICBpbnQgbG9vcDsKKyAgICBpbnQ2NF90IHNpemU7CisgICAgaW50NjRfdCBzdGFydDsKKyAgICBpbnQ2NF90IHB0czsKK30gTG9vcENvbnRleHQ7CisKKyNkZWZpbmUgQUZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorI2RlZmluZSBWRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihMb29wQ29udGV4dCwgeCkKKworI2lmIENPTkZJR19BTE9PUF9GSUxURVIKKworc3RhdGljIGludCBhY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTG9vcENvbnRleHQgKnMgID0gY3R4LT5wcml2OworCisgICAgcy0+ZmlmbyA9IGF2X2F1ZGlvX2ZpZm9fYWxsb2MoaW5saW5rLT5mb3JtYXQsIGlubGluay0+Y2hhbm5lbHMsIDgxOTIpOworICAgIHMtPmxlZnQgPSBhdl9hdWRpb19maWZvX2FsbG9jKGlubGluay0+Zm9ybWF0LCBpbmxpbmstPmNoYW5uZWxzLCA4MTkyKTsKKyAgICBpZiAoIXMtPmZpZm8gfHwgIXMtPmxlZnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBhdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExvb3BDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfYXVkaW9fZmlmb19mcmVlKHMtPmZpZm8pOworICAgIGF2X2F1ZGlvX2ZpZm9fZnJlZShzLT5sZWZ0KTsKK30KKworc3RhdGljIGludCBwdXNoX3NhbXBsZXMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGludCBuYl9zYW1wbGVzKQoreworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBMb29wQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IHJldCwgaSA9IDA7CisKKyAgICB3aGlsZSAocy0+bG9vcCAhPSAwICYmIGkgPCBuYl9zYW1wbGVzKSB7CisgICAgICAgIG91dCA9IGZmX2dldF9hdWRpb19idWZmZXIob3V0bGluaywgRkZNSU4obmJfc2FtcGxlcywgcy0+bmJfc2FtcGxlcyAtIHMtPmN1cnJlbnRfc2FtcGxlKSk7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcmV0ID0gYXZfYXVkaW9fZmlmb19wZWVrX2F0KHMtPmZpZm8sICh2b2lkICoqKW91dC0+ZXh0ZW5kZWRfZGF0YSwgb3V0LT5uYl9zYW1wbGVzLCBzLT5jdXJyZW50X3NhbXBsZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBvdXQtPnB0cyA9IHMtPnB0czsKKyAgICAgICAgb3V0LT5uYl9zYW1wbGVzID0gcmV0OworICAgICAgICBzLT5wdHMgKz0gb3V0LT5uYl9zYW1wbGVzOworICAgICAgICBpICs9IG91dC0+bmJfc2FtcGxlczsKKyAgICAgICAgcy0+Y3VycmVudF9zYW1wbGUgKz0gb3V0LT5uYl9zYW1wbGVzOworCisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKHMtPmN1cnJlbnRfc2FtcGxlID49IHMtPm5iX3NhbXBsZXMpIHsKKyAgICAgICAgICAgIHMtPmN1cnJlbnRfc2FtcGxlID0gMDsKKworICAgICAgICAgICAgaWYgKHMtPmxvb3AgPiAwKQorICAgICAgICAgICAgICAgIHMtPmxvb3AtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgTG9vcENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAocy0+aWdub3JlZF9zYW1wbGVzICsgZnJhbWUtPm5iX3NhbXBsZXMgPiBzLT5zdGFydCAmJiBzLT5zaXplID4gMCAmJiBzLT5sb29wICE9IDApIHsKKyAgICAgICAgaWYgKHMtPm5iX3NhbXBsZXMgPCBzLT5zaXplKSB7CisgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IEZGTUlOKGZyYW1lLT5uYl9zYW1wbGVzLCBzLT5zaXplIC0gcy0+bmJfc2FtcGxlcyk7CisgICAgICAgICAgICBpbnQgZHJhaW4gPSAwOworCisgICAgICAgICAgICByZXQgPSBhdl9hdWRpb19maWZvX3dyaXRlKHMtPmZpZm8sICh2b2lkICoqKWZyYW1lLT5leHRlbmRlZF9kYXRhLCB3cml0dGVuKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoIXMtPm5iX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICBkcmFpbiA9IEZGTUFYKDAsIHMtPnN0YXJ0IC0gcy0+aWdub3JlZF9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBzLT5wdHMgPSBmcmFtZS0+cHRzOworICAgICAgICAgICAgICAgIGF2X2F1ZGlvX2ZpZm9fZHJhaW4ocy0+ZmlmbywgZHJhaW4pOworICAgICAgICAgICAgICAgIHMtPnB0cyArPSBzLT5zdGFydCAtIHMtPmlnbm9yZWRfc2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPm5iX3NhbXBsZXMgKz0gcmV0IC0gZHJhaW47CisgICAgICAgICAgICBkcmFpbiA9IGZyYW1lLT5uYl9zYW1wbGVzIC0gd3JpdHRlbjsKKyAgICAgICAgICAgIGlmIChzLT5uYl9zYW1wbGVzID09IHMtPnNpemUgJiYgZHJhaW4gPiAwKSB7CisgICAgICAgICAgICAgICAgaW50IHJldDI7CisKKyAgICAgICAgICAgICAgICByZXQyID0gYXZfYXVkaW9fZmlmb193cml0ZShzLT5sZWZ0LCAodm9pZCAqKilmcmFtZS0+ZXh0ZW5kZWRfZGF0YSwgZnJhbWUtPm5iX3NhbXBsZXMpOworICAgICAgICAgICAgICAgIGlmIChyZXQyIDwgMCkKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0MjsKKyAgICAgICAgICAgICAgICBhdl9hdWRpb19maWZvX2RyYWluKHMtPmxlZnQsIGRyYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lLT5uYl9zYW1wbGVzID0gcmV0OworICAgICAgICAgICAgcy0+cHRzICs9IHJldDsKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbmJfc2FtcGxlcyA9IGZyYW1lLT5uYl9zYW1wbGVzOworCisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgICAgICByZXQgPSBwdXNoX3NhbXBsZXMoY3R4LCBuYl9zYW1wbGVzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmlnbm9yZWRfc2FtcGxlcyArPSBmcmFtZS0+bmJfc2FtcGxlczsKKyAgICAgICAgZnJhbWUtPnB0cyA9IHMtPnB0czsKKyAgICAgICAgcy0+cHRzICs9IGZyYW1lLT5uYl9zYW1wbGVzOworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIExvb3BDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKCghcy0+c2l6ZSkgfHwKKyAgICAgICAgKHMtPm5iX3NhbXBsZXMgPCBzLT5zaXplKSB8fAorICAgICAgICAocy0+bmJfc2FtcGxlcyA+PSBzLT5zaXplICYmIHMtPmxvb3AgPT0gMCkpIHsKKyAgICAgICAgaW50IG5iX3NhbXBsZXMgPSBhdl9hdWRpb19maWZvX3NpemUocy0+bGVmdCk7CisKKyAgICAgICAgaWYgKHMtPmxvb3AgPT0gMCAmJiBuYl9zYW1wbGVzID4gMCkgeworICAgICAgICAgICAgQVZGcmFtZSAqb3V0OworCisgICAgICAgICAgICBvdXQgPSBmZl9nZXRfYXVkaW9fYnVmZmVyKG91dGxpbmssIG5iX3NhbXBsZXMpOworICAgICAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGF2X2F1ZGlvX2ZpZm9fcmVhZChzLT5sZWZ0LCAodm9pZCAqKilvdXQtPmV4dGVuZGVkX2RhdGEsIG5iX3NhbXBsZXMpOworICAgICAgICAgICAgb3V0LT5wdHMgPSBzLT5wdHM7CisgICAgICAgICAgICBzLT5wdHMgKz0gbmJfc2FtcGxlczsKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBwdXNoX3NhbXBsZXMoY3R4LCAxMDI0KTsKKyAgICB9CisKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIHMtPm5iX3NhbXBsZXMgPiAwICYmIHMtPmxvb3AgIT0gMCkgeworICAgICAgICByZXQgPSBwdXNoX3NhbXBsZXMoY3R4LCBvdXRsaW5rLT5zYW1wbGVfcmF0ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFsb29wX29wdGlvbnNbXSA9IHsKKyAgICB7ICJsb29wIiwgICJudW1iZXIgb2YgbG9vcHMiLCAgICAgICAgICAgICAgIE9GRlNFVChsb29wKSwgIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2NCA9IDAgfSwgLTEsIElOVF9NQVgsICAgQUZMQUdTIH0sCisgICAgeyAic2l6ZSIsICAibWF4IG51bWJlciBvZiBzYW1wbGVzIHRvIGxvb3AiLCBPRkZTRVQoc2l6ZSksICBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSAwIH0sICAwLCBJTlQzMl9NQVgsIEFGTEFHUyB9LAorICAgIHsgInN0YXJ0IiwgInNldCB0aGUgbG9vcCBzdGFydCBzYW1wbGUiLCAgICAgT0ZGU0VUKHN0YXJ0KSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsuaTY0ID0gMCB9LCAgMCwgSU5UNjRfTUFYLCBBRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFsb29wKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGFpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBhZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gYWNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgYW91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSBhcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl9hZl9hbG9vcCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhbG9vcCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTG9vcCBhdWRpbyBzYW1wbGVzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKExvb3BDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZhbG9vcF9jbGFzcywKKyAgICAudW5pbml0ICAgICAgICA9IGF1bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSBhaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYW91dHB1dHMsCit9OworI2VuZGlmIC8qIENPTkZJR19BTE9PUF9GSUxURVIgKi8KKworI2lmIENPTkZJR19MT09QX0ZJTFRFUgorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBMb29wQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPmZyYW1lcyA9IGF2X2NhbGxvYyhzLT5zaXplLCBzaXplb2YoKnMtPmZyYW1lcykpOworICAgIGlmICghcy0+ZnJhbWVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExvb3BDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2ZyYW1lczsgaSsrKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZXNbaV0pOworCisgICAgYXZfZnJlZXAoJnMtPmZyYW1lcyk7CisgICAgcy0+bmJfZnJhbWVzID0gMDsKK30KKworc3RhdGljIGludCBwdXNoX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBMb29wQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQ2NF90IHB0czsKKyAgICBpbnQgcmV0OworCisgICAgQVZGcmFtZSAqb3V0ID0gYXZfZnJhbWVfY2xvbmUocy0+ZnJhbWVzW3MtPmN1cnJlbnRfZnJhbWVdKTsKKworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG91dC0+cHRzICs9IHMtPmR1cmF0aW9uIC0gcy0+c3RhcnRfcHRzOworICAgIHB0cyA9IG91dC0+cHRzICsgb3V0LT5wa3RfZHVyYXRpb247CisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgcy0+Y3VycmVudF9mcmFtZSsrOworCisgICAgaWYgKHMtPmN1cnJlbnRfZnJhbWUgPj0gcy0+bmJfZnJhbWVzKSB7CisgICAgICAgIHMtPmR1cmF0aW9uID0gcHRzOworICAgICAgICBzLT5jdXJyZW50X2ZyYW1lID0gMDsKKworICAgICAgICBpZiAocy0+bG9vcCA+IDApCisgICAgICAgICAgICBzLT5sb29wLS07CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIExvb3BDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGlubGluay0+ZnJhbWVfY291bnRfb3V0ID49IHMtPnN0YXJ0ICYmIHMtPnNpemUgPiAwICYmIHMtPmxvb3AgIT0gMCkgeworICAgICAgICBpZiAocy0+bmJfZnJhbWVzIDwgcy0+c2l6ZSkgeworICAgICAgICAgICAgaWYgKCFzLT5uYl9mcmFtZXMpCisgICAgICAgICAgICAgICAgcy0+c3RhcnRfcHRzID0gZnJhbWUtPnB0czsKKyAgICAgICAgICAgIHMtPmZyYW1lc1tzLT5uYl9mcmFtZXNdID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworICAgICAgICAgICAgaWYgKCFzLT5mcmFtZXNbcy0+bmJfZnJhbWVzXSkgeworICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+bmJfZnJhbWVzKys7CisgICAgICAgICAgICBzLT5kdXJhdGlvbiA9IGZyYW1lLT5wdHMgKyBmcmFtZS0+cGt0X2R1cmF0aW9uOworICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGZyYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgICAgIHJldCA9IHB1c2hfZnJhbWUoY3R4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lLT5wdHMgKz0gcy0+ZHVyYXRpb247CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBMb29wQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICgoIXMtPnNpemUpIHx8CisgICAgICAgIChzLT5uYl9mcmFtZXMgPCBzLT5zaXplKSB8fAorICAgICAgICAocy0+bmJfZnJhbWVzID49IHMtPnNpemUgJiYgcy0+bG9vcCA9PSAwKSkgeworICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBwdXNoX2ZyYW1lKGN0eCk7CisgICAgfQorCisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBzLT5uYl9mcmFtZXMgPiAwICYmIHMtPmxvb3AgIT0gMCkgeworICAgICAgICByZXQgPSBwdXNoX2ZyYW1lKGN0eCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGxvb3Bfb3B0aW9uc1tdID0geworICAgIHsgImxvb3AiLCAgIm51bWJlciBvZiBsb29wcyIsICAgICAgICAgICAgICBPRkZTRVQobG9vcCksICBBVl9PUFRfVFlQRV9JTlQsICAgey5pNjQgPSAwIH0sIC0xLCBJTlRfTUFYLCAgIFZGTEFHUyB9LAorICAgIHsgInNpemUiLCAgIm1heCBudW1iZXIgb2YgZnJhbWVzIHRvIGxvb3AiLCBPRkZTRVQoc2l6ZSksICBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSAwIH0sICAwLCBJTlQxNl9NQVgsIFZGTEFHUyB9LAorICAgIHsgInN0YXJ0IiwgInNldCB0aGUgbG9vcCBzdGFydCBmcmFtZSIsICAgICBPRkZTRVQoc3RhcnQpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSAwIH0sICAwLCBJTlQ2NF9NQVgsIFZGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MobG9vcCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2xvb3AgPSB7CisgICAgLm5hbWUgICAgICAgID0gImxvb3AiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMb29wIHZpZGVvIGZyYW1lcy4iKSwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoTG9vcENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICA9ICZsb29wX2NsYXNzLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICA9IGlucHV0cywKKyAgICAub3V0cHV0cyAgICAgPSBvdXRwdXRzLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfTE9PUF9GSUxURVIgKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2ZfbWV0YWRhdGEuYyBiL2xpYmF2ZmlsdGVyL2ZfbWV0YWRhdGEuYwppbmRleCBmYTZiOWQzLi41MjNhOTRkIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9mX21ldGFkYXRhLmMKKysrIGIvbGliYXZmaWx0ZXIvZl9tZXRhZGF0YS5jCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2aW8uaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImF1ZGlvLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgpAQCAtNzksNyArODEsNyBAQAogICAgIEFWRXhwciAqZXhwcjsKICAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CiAKLSAgICBGSUxFICpmaWxlOworICAgIEFWSU9Db250ZXh0KiBhdmlvX2NvbnRleHQ7CiAgICAgY2hhciAqZmlsZV9zdHI7CiAKICAgICBpbnQgKCpjb21wYXJlKShzdHJ1Y3QgTWV0YWRhdGFDb250ZXh0ICpzLApAQCAtMTc5LDggKzE4MSwxMSBAQAogICAgIHZhX2xpc3QgYXJndW1lbnRfbGlzdDsKIAogICAgIHZhX3N0YXJ0KGFyZ3VtZW50X2xpc3QsIG1zZyk7Ci0gICAgaWYgKG1zZykKLSAgICAgICAgdmZwcmludGYocy0+ZmlsZSwgbXNnLCBhcmd1bWVudF9saXN0KTsKKyAgICBpZiAobXNnKSB7CisgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgIHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBtc2csIGFyZ3VtZW50X2xpc3QpOworICAgICAgICBhdmlvX3dyaXRlKHMtPmF2aW9fY29udGV4dCwgYnVmLCBhdl9zdHJubGVuKGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgICB9CiAgICAgdmFfZW5kKGFyZ3VtZW50X2xpc3QpOwogfQogCkBAIC0xODksNyArMTk0LDcgQEAKICAgICBNZXRhZGF0YUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgaW50IHJldDsKIAotICAgIGlmICghcy0+a2V5ICYmIHMtPm1vZGUgIT0gTUVUQURBVEFfUFJJTlQpIHsKKyAgICBpZiAoIXMtPmtleSAmJiBzLT5tb2RlICE9IE1FVEFEQVRBX1BSSU5UICYmIHMtPm1vZGUgIT0gTUVUQURBVEFfREVMRVRFKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiTWV0YWRhdGEga2V5IG11c3QgYmUgc2V0XG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CkBAIC0yMzUsMjUgKzI0MCwyOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHMtPmZpbGVfc3RyKSB7Ci0gICAgICAgIGlmICghc3RyY21wKHMtPmZpbGVfc3RyLCAiLSIpKSB7Ci0gICAgICAgICAgICBzLT5maWxlID0gc3Rkb3V0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcy0+ZmlsZSA9IGZvcGVuKHMtPmZpbGVfc3RyLCAidyIpOwotICAgICAgICAgICAgaWYgKCFzLT5maWxlKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVyciA9IEFWRVJST1IoZXJybm8pOwotICAgICAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07Ci0gICAgICAgICAgICAgICAgYXZfc3RyZXJyb3IoZXJyLCBidWYsIHNpemVvZihidWYpKTsKLSAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgb3BlbiBmaWxlICVzOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmlsZV9zdHIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGlmIChzLT5tb2RlID09IE1FVEFEQVRBX1BSSU5UICYmIHMtPmZpbGVfc3RyKSB7CiAgICAgICAgIHMtPnByaW50ID0gcHJpbnRfZmlsZTsKICAgICB9IGVsc2UgewogICAgICAgICBzLT5wcmludCA9IHByaW50X2xvZzsKICAgICB9CiAKKyAgICBzLT5hdmlvX2NvbnRleHQgPSBOVUxMOworICAgIGlmIChzLT5maWxlX3N0cikgeworICAgICAgICBpZiAoIXN0cmNtcCgiLSIsIHMtPmZpbGVfc3RyKSkgeworICAgICAgICAgICAgcmV0ID0gYXZpb19vcGVuKCZzLT5hdmlvX2NvbnRleHQsICJwaXBlOjEiLCBBVklPX0ZMQUdfV1JJVEUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gYXZpb19vcGVuKCZzLT5hdmlvX2NvbnRleHQsIHMtPmZpbGVfc3RyLCBBVklPX0ZMQUdfV1JJVEUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgICAgICBhdl9zdHJlcnJvcihyZXQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgIHMtPmZpbGVfc3RyLCBidWYpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiAwOwogfQogCkBAIC0yNjEsOSArMjcwLDkgQEAKIHsKICAgICBNZXRhZGF0YUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAKLSAgICBpZiAocy0+ZmlsZSAmJiBzLT5maWxlICE9IHN0ZG91dCkKLSAgICAgICAgZmNsb3NlKHMtPmZpbGUpOwotICAgIHMtPmZpbGUgPSBOVUxMOworICAgIGlmIChzLT5hdmlvX2NvbnRleHQpIHsKKyAgICAgICAgYXZpb19jbG9zZXAoJnMtPmF2aW9fY29udGV4dCk7CisgICAgfQogfQogCiBzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCkBAIC0yNzEsMTMgKzI4MCwxMyBAQAogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CiAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOwogICAgIE1ldGFkYXRhQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhID0gYXZfZnJhbWVfZ2V0X21ldGFkYXRhKGZyYW1lKTsKKyAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSA9ICZmcmFtZS0+bWV0YWRhdGE7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7CiAKLSAgICBpZiAoIW1ldGFkYXRhKQorICAgIGlmICghKm1ldGFkYXRhKQogICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGZyYW1lKTsKIAotICAgIGUgPSBhdl9kaWN0X2dldChtZXRhZGF0YSwgIXMtPmtleSA/ICIiIDogcy0+a2V5LCBOVUxMLAorICAgIGUgPSBhdl9kaWN0X2dldCgqbWV0YWRhdGEsICFzLT5rZXkgPyAiIiA6IHMtPmtleSwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgIXMtPmtleSA/IEFWX0RJQ1RfSUdOT1JFX1NVRkZJWDogMCk7CiAKICAgICBzd2l0Y2ggKHMtPm1vZGUpIHsKQEAgLTI5MywzNCArMzAyLDM2IEBACiAgICAgICAgIGlmIChlICYmIGUtPnZhbHVlKSB7CiAgICAgICAgICAgICA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldCgmbWV0YWRhdGEsIHMtPmtleSwgcy0+dmFsdWUsIDApOworICAgICAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsIHMtPmtleSwgcy0+dmFsdWUsIDApOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1FVEFEQVRBX01PRElGWToKICAgICAgICAgaWYgKGUgJiYgZS0+dmFsdWUpIHsKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZtZXRhZGF0YSwgcy0+a2V5LCBzLT52YWx1ZSwgMCk7CisgICAgICAgICAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgcy0+a2V5LCBzLT52YWx1ZSwgMCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUVUQURBVEFfUFJJTlQ6CiAgICAgICAgIGlmICghcy0+a2V5ICYmIGUpIHsKLSAgICAgICAgICAgIHMtPnByaW50KGN0eCwgImZyYW1lICUiUFJJZDY0IiBwdHMgJSJQUklkNjQiXG4iLCBpbmxpbmstPmZyYW1lX2NvdW50LCBmcmFtZS0+cHRzKTsKKyAgICAgICAgICAgIHMtPnByaW50KGN0eCwgImZyYW1lOiUtNCJQUklkNjQiIHB0czolLTdzIHB0c190aW1lOiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT5mcmFtZV9jb3VudF9vdXQsIGF2X3RzMnN0cihmcmFtZS0+cHRzKSwgYXZfdHMydGltZXN0cihmcmFtZS0+cHRzLCAmaW5saW5rLT50aW1lX2Jhc2UpKTsKICAgICAgICAgICAgIHMtPnByaW50KGN0eCwgIiVzPSVzXG4iLCBlLT5rZXksIGUtPnZhbHVlKTsKLSAgICAgICAgICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KG1ldGFkYXRhLCAiIiwgZSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkgIT0gTlVMTCkgeworICAgICAgICAgICAgd2hpbGUgKChlID0gYXZfZGljdF9nZXQoKm1ldGFkYXRhLCAiIiwgZSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHMtPnByaW50KGN0eCwgIiVzPSVzXG4iLCBlLT5rZXksIGUtPnZhbHVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChlICYmIGUtPnZhbHVlICYmICghcy0+dmFsdWUgfHwgKGUtPnZhbHVlICYmIHMtPmNvbXBhcmUocywgZS0+dmFsdWUsIHMtPnZhbHVlKSkpKSB7Ci0gICAgICAgICAgICBzLT5wcmludChjdHgsICJmcmFtZSAlIlBSSWQ2NCIgcHRzICUiUFJJZDY0IlxuIiwgaW5saW5rLT5mcmFtZV9jb3VudCwgZnJhbWUtPnB0cyk7CisgICAgICAgICAgICBzLT5wcmludChjdHgsICJmcmFtZTolLTQiUFJJZDY0IiBwdHM6JS03cyBwdHNfdGltZTolc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgIGlubGluay0+ZnJhbWVfY291bnRfb3V0LCBhdl90czJzdHIoZnJhbWUtPnB0cyksIGF2X3RzMnRpbWVzdHIoZnJhbWUtPnB0cywgJmlubGluay0+dGltZV9iYXNlKSk7CiAgICAgICAgICAgICBzLT5wcmludChjdHgsICIlcz0lc1xuIiwgcy0+a2V5LCBlLT52YWx1ZSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUVUQURBVEFfREVMRVRFOgotICAgICAgICBpZiAoZSAmJiBlLT52YWx1ZSAmJiBzLT52YWx1ZSAmJiBzLT5jb21wYXJlKHMsIGUtPnZhbHVlLCBzLT52YWx1ZSkpIHsKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZtZXRhZGF0YSwgcy0+a2V5LCBOVUxMLCAwKTsKLSAgICAgICAgfSBlbHNlIGlmIChlICYmIGUtPnZhbHVlKSB7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldCgmbWV0YWRhdGEsIHMtPmtleSwgTlVMTCwgMCk7CisgICAgICAgIGlmICghcy0+a2V5KSB7CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUobWV0YWRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKGUgJiYgZS0+dmFsdWUgJiYgKCFzLT52YWx1ZSB8fCBzLT5jb21wYXJlKHMsIGUtPnZhbHVlLCBzLT52YWx1ZSkpKSB7CisgICAgICAgICAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgcy0+a2V5LCBOVUxMLCAwKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGZyYW1lKTsKICAgICAgICAgYnJlYWs7CkBAIC0zNjIsNyArMzczLDYgQEAKICAgICAucHJpdl9jbGFzcyAgICA9ICZhbWV0YWRhdGFfY2xhc3MsCiAgICAgLmluaXQgICAgICAgICAgPSBpbml0LAogICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAotICAgIC5xdWVyeV9mb3JtYXRzID0gZmZfcXVlcnlfZm9ybWF0c19hbGwsCiAgICAgLmlucHV0cyAgICAgICAgPSBhaW5wdXRzLAogICAgIC5vdXRwdXRzICAgICAgID0gYW91dHB1dHMsCiAgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2ZfcGVybXMuYyBiL2xpYmF2ZmlsdGVyL2ZfcGVybXMuYwppbmRleCA0MGI4ODExLi5kYzZlY2JiIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9mX3Blcm1zLmMKKysrIGIvbGliYXZmaWx0ZXIvZl9wZXJtcy5jCkBAIC0zMyw3ICszMyw3IEBACiAgICAgTkJfTU9ERVMKIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFBlcm1zQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgQVZMRkcgbGZnOwogICAgIGludDY0X3QgcmFuZG9tX3NlZWQ7CkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgIGlmIChzLT5yYW5kb21fc2VlZCA9PSAtMSkKICAgICAgICAgICAgIHMtPnJhbmRvbV9zZWVkID0gYXZfZ2V0X3JhbmRvbV9zZWVkKCk7CiAgICAgICAgIHNlZWQgPSBzLT5yYW5kb21fc2VlZDsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJyYW5kb20gc2VlZDogMHglMDh4XG4iLCBzZWVkKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJyYW5kb20gc2VlZDogMHglMDgiUFJJeDMyIlxuIiwgc2VlZCk7CiAgICAgICAgIGF2X2xmZ19pbml0KCZzLT5sZmcsIHNlZWQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZl9zZWxlY3QuYyBiL2xpYmF2ZmlsdGVyL2Zfc2VsZWN0LmMKaW5kZXggNTJmNDc0ZS4uYjFiMmNiYyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZl9zZWxlY3QuYworKysgYi9saWJhdmZpbHRlci9mX3NlbGVjdC5jCkBAIC0xODYsNyArMTg2LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBwYWQudHlwZSA9IGN0eC0+ZmlsdGVyLT5pbnB1dHNbMF0udHlwZTsKICAgICAgICAgcGFkLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lOwotICAgICAgICBmZl9pbnNlcnRfb3V0cGFkKGN0eCwgaSwgJnBhZCk7CisgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X291dHBhZChjdHgsIGksICZwYWQpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwYWQubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0yODQsNyArMjg3LDcgQEAKIAogc3RhdGljIGRvdWJsZSBnZXRfY29uY2F0ZGVjX3NlbGVjdChBVkZyYW1lICpmcmFtZSwgaW50NjRfdCBwdHMpCiB7Ci0gICAgQVZEaWN0aW9uYXJ5ICptZXRhZGF0YSA9IGF2X2ZyYW1lX2dldF9tZXRhZGF0YShmcmFtZSk7CisgICAgQVZEaWN0aW9uYXJ5ICptZXRhZGF0YSA9IGZyYW1lLT5tZXRhZGF0YTsKICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqc3RhcnRfdGltZV9lbnRyeSA9IGF2X2RpY3RfZ2V0KG1ldGFkYXRhLCAibGF2Zi5jb25jYXRkZWMuc3RhcnRfdGltZSIsIE5VTEwsIDApOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICpkdXJhdGlvbl9lbnRyeSA9IGF2X2RpY3RfZ2V0KG1ldGFkYXRhLCAibGF2Zi5jb25jYXRkZWMuZHVyYXRpb24iLCBOVUxMLCAwKTsKICAgICBpZiAoc3RhcnRfdGltZV9lbnRyeSkgewpAQCAtMzE4LDEwICszMjEsMTAgQEAKICAgICBpZiAoaXNuYW4oc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9TVEFSVF9UXSkpCiAgICAgICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU1RBUlRfVF0gPSBUUzJEKGZyYW1lLT5wdHMpICogYXZfcTJkKGlubGluay0+dGltZV9iYXNlKTsKIAotICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfTiAgXSA9IGlubGluay0+ZnJhbWVfY291bnQ7CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9OICBdID0gaW5saW5rLT5mcmFtZV9jb3VudF9vdXQ7CiAgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QVFNdID0gVFMyRChmcmFtZS0+cHRzKTsKICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1QgIF0gPSBUUzJEKGZyYW1lLT5wdHMpICogYXZfcTJkKGlubGluay0+dGltZV9iYXNlKTsKLSAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX1BPU10gPSBhdl9mcmFtZV9nZXRfcGt0X3BvcyhmcmFtZSkgPT0gLTEgPyBOQU4gOiBhdl9mcmFtZV9nZXRfcGt0X3BvcyhmcmFtZSk7CisgICAgc2VsZWN0LT52YXJfdmFsdWVzW1ZBUl9QT1NdID0gZnJhbWUtPnBrdF9wb3MgPT0gLTEgPyBOQU4gOiBmcmFtZS0+cGt0X3BvczsKICAgICBzZWxlY3QtPnZhcl92YWx1ZXNbVkFSX0tFWV0gPSBmcmFtZS0+a2V5X2ZyYW1lOwogICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfQ09OQ0FUREVDX1NFTEVDVF0gPSBnZXRfY29uY2F0ZGVjX3NlbGVjdChmcmFtZSwgYXZfcmVzY2FsZV9xKGZyYW1lLT5wdHMsIGlubGluay0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSkpOwogCkBAIC0zNDAsNyArMzQzLDcgQEAKICAgICAgICAgICAgIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU0NFTkVdID0gZ2V0X3NjZW5lX3Njb3JlKGN0eCwgZnJhbWUpOwogICAgICAgICAgICAgLy8gVE9ETzogZG9jdW1lbnQgbWV0YWRhdGEKICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZiIsIHNlbGVjdC0+dmFyX3ZhbHVlc1tWQVJfU0NFTkVdKTsKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGZyYW1lKSwgImxhdmZpLnNjZW5lX3Njb3JlIiwgYnVmLCAwKTsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZmcmFtZS0+bWV0YWRhdGEsICJsYXZmaS5zY2VuZV9zY29yZSIsIGJ1ZiwgMCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZl9zZW5kY21kLmMgYi9saWJhdmZpbHRlci9mX3NlbmRjbWQuYwppbmRleCBmYjMwMjIwLi5iODc0MGU4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9mX3NlbmRjbWQuYworKysgYi9saWJhdmZpbHRlci9mX3NlbmRjbWQuYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgImF2ZmlsdGVyZ3JhcGguaCIKICNpbmNsdWRlICJhdWRpby5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAKQEAgLTU1LDEzICs1NCwxMyBAQAogICAgIHJldHVybiBwYnVmLT5zdHI7CiB9CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IENvbW1hbmQgewogICAgIGludCBmbGFnczsKICAgICBjaGFyICp0YXJnZXQsICpjb21tYW5kLCAqYXJnOwogICAgIGludCBpbmRleDsKIH0gQ29tbWFuZDsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgSW50ZXJ2YWwgewogICAgIGludDY0X3Qgc3RhcnRfdHM7ICAgICAgICAgIC8vLzwgc3RhcnQgdGltZXN0YW1wIGV4cHJlc3NlZCBhcyBtaWNyb3NlY29uZHMgdW5pdHMKICAgICBpbnQ2NF90IGVuZF90czsgICAgICAgICAgICAvLy88IGVuZCAgIHRpbWVzdGFtcCBleHByZXNzZWQgYXMgbWljcm9zZWNvbmRzIHVuaXRzCiAgICAgaW50IGluZGV4OyAgICAgICAgICAgICAgICAgLy8vPCB1bmlxdWUgaW5kZXggZm9yIHRoZXNlIGludGVydmFsIGNvbW1hbmRzCkBAIC03MCw3ICs2OSw3IEBACiAgICAgaW50IGVuYWJsZWQ7ICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IHRpbWUgZGV0ZWN0ZWQgaW5zaWRlIHRoaXMgaW50ZXJ2YWwKIH0gSW50ZXJ2YWw7CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFNlbmRDbWRDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBJbnRlcnZhbCAqaW50ZXJ2YWxzOwogICAgIGludCAgIG5iX2ludGVydmFsczsKQEAgLTI2OCw2ICsyNjcsMTMgQEAKICAgICAgICAgY2hhciAqc3RhcnQsICplbmQ7CiAKICAgICAgICAgc3RhcnQgPSBhdl9zdHJ0b2soaW50ZXJ2YWxzdHIsICItIiwgJmVuZCk7CisgICAgICAgIGlmICghc3RhcnQpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW50ZXJ2YWwgc3BlY2lmaWNhdGlvbiAnJXMnIGluIGludGVydmFsICMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBpbnRlcnZhbHN0ciwgaW50ZXJ2YWxfY291bnQpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KICAgICAgICAgaWYgKChyZXQgPSBhdl9wYXJzZV90aW1lKCZpbnRlcnZhbC0+c3RhcnRfdHMsIHN0YXJ0LCAxKSkgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHN0YXJ0IHRpbWUgc3BlY2lmaWNhdGlvbiAnJXMnIGluIGludGVydmFsICMlZFxuIiwKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2Zfc2lkZWRhdGEuYyBiL2xpYmF2ZmlsdGVyL2Zfc2lkZWRhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQyNDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvZl9zaWRlZGF0YS5jCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGZpbHRlciBmb3IgbWFuaXB1bGF0aW5nIGZyYW1lIHNpZGUgZGF0YQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworZW51bSBTaWRlRGF0YU1vZGUgeworICAgIFNJREVEQVRBX1NFTEVDVCwKKyAgICBTSURFREFUQV9ERUxFVEUsCisgICAgU0lERURBVEFfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IFNpZGVEYXRhQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBpbnQgbW9kZTsKKyAgICBlbnVtIEFWRnJhbWVTaWRlRGF0YVR5cGUgdHlwZTsKK30gU2lkZURhdGFDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTaWRlRGF0YUNvbnRleHQsIHgpCisjZGVmaW5lIERFRklORV9PUFRJT05TKGZpbHRfbmFtZSwgRkxBR1MpIFwKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmaWx0X25hbWUjI19vcHRpb25zW10gPSB7IFwKKyAgICB7ICJtb2RlIiwgInNldCBhIG1vZGUgb2Ygb3BlcmF0aW9uIiwgT0ZGU0VUKG1vZGUpLCAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwIH0sIDAsIFNJREVEQVRBX05CLTEsIEZMQUdTLCAibW9kZSIgfSwgXAorICAgIHsgICAic2VsZWN0IiwgInNlbGVjdCBmcmFtZSIsICAgICAgICAwLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IFNJREVEQVRBX1NFTEVDVCB9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sIFwKKyAgICB7ICAgImRlbGV0ZSIsICJkZWxldGUgc2lkZSBkYXRhIiwgICAgMCwgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBTSURFREFUQV9ERUxFVEUgfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LCBcCisgICAgeyAidHlwZSIsICAgInNldCBzaWRlIGRhdGEgdHlwZSIsICAgIE9GRlNFVCh0eXBlKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIEZMQUdTLCAidHlwZSIgfSwgXAorICAgIHsgICAiUEFOU0NBTiIsICAgICAgICAgICAgICAgICAgICAiIiwgMCwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IEFWX0ZSQU1FX0RBVEFfUEFOU0NBTiAgICAgICAgICAgICAgICAgICAgfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LCBcCisgICAgeyAgICJBNTNfQ0MiLCAgICAgICAgICAgICAgICAgICAgICIiLCAwLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gQVZfRlJBTUVfREFUQV9BNTNfQ0MgICAgICAgICAgICAgICAgICAgICB9LCAwLCAwLCBGTEFHUywgInR5cGUiIH0sIFwKKyAgICB7ICAgIlNURVJFTzNEIiwgICAgICAgICAgICAgICAgICAgIiIsIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBBVl9GUkFNRV9EQVRBX1NURVJFTzNEICAgICAgICAgICAgICAgICAgIH0sIDAsIDAsIEZMQUdTLCAidHlwZSIgfSwgXAorICAgIHsgICAiTUFUUklYRU5DT0RJTkciLCAgICAgICAgICAgICAiIiwgMCwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IEFWX0ZSQU1FX0RBVEFfTUFUUklYRU5DT0RJTkcgICAgICAgICAgICAgfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LCBcCisgICAgeyAgICJET1dOTUlYX0lORk8iLCAgICAgICAgICAgICAgICIiLCAwLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gQVZfRlJBTUVfREFUQV9ET1dOTUlYX0lORk8gICAgICAgICAgICAgICB9LCAwLCAwLCBGTEFHUywgInR5cGUiIH0sIFwKKyAgICB7ICAgIlJFUExBWUdBSU4iLCAgICAgICAgICAgICAgICAgIiIsIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBBVl9GUkFNRV9EQVRBX1JFUExBWUdBSU4gICAgICAgICAgICAgICAgIH0sIDAsIDAsIEZMQUdTLCAidHlwZSIgfSwgXAorICAgIHsgICAiRElTUExBWU1BVFJJWCIsICAgICAgICAgICAgICAiIiwgMCwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IEFWX0ZSQU1FX0RBVEFfRElTUExBWU1BVFJJWCAgICAgICAgICAgICAgfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LCBcCisgICAgeyAgICJBRkQiLCAgICAgICAgICAgICAgICAgICAgICAgICIiLCAwLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gQVZfRlJBTUVfREFUQV9BRkQgICAgICAgICAgICAgICAgICAgICAgICB9LCAwLCAwLCBGTEFHUywgInR5cGUiIH0sIFwKKyAgICB7ICAgIk1PVElPTl9WRUNUT1JTIiwgICAgICAgICAgICAgIiIsIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBBVl9GUkFNRV9EQVRBX01PVElPTl9WRUNUT1JTICAgICAgICAgICAgIH0sIDAsIDAsIEZMQUdTLCAidHlwZSIgfSwgXAorICAgIHsgICAiU0tJUF9TQU1QTEVTIiwgICAgICAgICAgICAgICAiIiwgMCwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IEFWX0ZSQU1FX0RBVEFfU0tJUF9TQU1QTEVTICAgICAgICAgICAgICAgfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LCBcCisgICAgeyAgICJBVURJT19TRVJWSUNFX1RZUEUiLCAgICAgICAgICIiLCAwLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgIHsuaTY0ID0gQVZfRlJBTUVfREFUQV9BVURJT19TRVJWSUNFX1RZUEUgICAgICAgICB9LCAwLCAwLCBGTEFHUywgInR5cGUiIH0sIFwKKyAgICB7ICAgIk1BU1RFUklOR19ESVNQTEFZX01FVEFEQVRBIiwgIiIsIDAsICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgey5pNjQgPSBBVl9GUkFNRV9EQVRBX01BU1RFUklOR19ESVNQTEFZX01FVEFEQVRBIH0sIDAsIDAsIEZMQUdTLCAidHlwZSIgfSwgXAorICAgIHsgICAiR09QX1RJTUVDT0RFIiwgICAgICAgICAgICAgICAiIiwgMCwgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICB7Lmk2NCA9IEFWX0ZSQU1FX0RBVEFfR09QX1RJTUVDT0RFICAgICAgICAgICAgICAgfSwgMCwgMCwgRkxBR1MsICJ0eXBlIiB9LCBcCisgICAgeyBOVUxMIH0gXAorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBTaWRlRGF0YUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+dHlwZSA9PSAtMSAmJiBzLT5tb2RlICE9IFNJREVEQVRBX0RFTEVURSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTaWRlIGRhdGEgdHlwZSBtdXN0IGJlIHNldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBTaWRlRGF0YUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9IE5VTEw7CisKKyAgICBpZiAocy0+dHlwZSAhPSAtMSkKKyAgICAgICBzZCA9IGF2X2ZyYW1lX2dldF9zaWRlX2RhdGEoZnJhbWUsIHMtPnR5cGUpOworCisgICAgc3dpdGNoIChzLT5tb2RlKSB7CisgICAgY2FzZSBTSURFREFUQV9TRUxFQ1Q6CisgICAgICAgIGlmIChzZCkgeworICAgICAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTSURFREFUQV9ERUxFVEU6CisgICAgICAgIGlmIChzLT50eXBlID09IC0xKSB7CisgICAgICAgICAgICB3aGlsZSAoZnJhbWUtPm5iX3NpZGVfZGF0YSkKKyAgICAgICAgICAgICAgICBhdl9mcmFtZV9yZW1vdmVfc2lkZV9kYXRhKGZyYW1lLCBmcmFtZS0+c2lkZV9kYXRhWzBdLT50eXBlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzZCkgeworICAgICAgICAgICAgYXZfZnJhbWVfcmVtb3ZlX3NpZGVfZGF0YShmcmFtZSwgcy0+dHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgfTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKworICAgIHJldHVybiAwOworfQorCisjaWYgQ09ORklHX0FTSURFREFUQV9GSUxURVIKKworREVGSU5FX09QVElPTlMoYXNpZGVkYXRhLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0pOworQVZGSUxURVJfREVGSU5FX0NMQVNTKGFzaWRlZGF0YSk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX2FmX2FzaWRlZGF0YSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJhc2lkZWRhdGEiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1hbmlwdWxhdGUgYXVkaW8gZnJhbWUgc2lkZSBkYXRhLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFNpZGVEYXRhQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmYXNpZGVkYXRhX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IGFpbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBhb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfQVNJREVEQVRBX0ZJTFRFUiAqLworCisjaWYgQ09ORklHX1NJREVEQVRBX0ZJTFRFUgorCitERUZJTkVfT1BUSU9OUyhzaWRlZGF0YSwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNKTsKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzaWRlZGF0YSk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zaWRlZGF0YSA9IHsKKyAgICAubmFtZSAgICAgICAgPSAic2lkZWRhdGEiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNYW5pcHVsYXRlIHZpZGVvIGZyYW1lIHNpZGUgZGF0YS4iKSwKKyAgICAucHJpdl9zaXplICAgPSBzaXplb2YoU2lkZURhdGFDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgPSAmc2lkZWRhdGFfY2xhc3MsCisgICAgLmluaXQgICAgICAgID0gaW5pdCwKKyAgICAuaW5wdXRzICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgID0gb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CisjZW5kaWYgLyogQ09ORklHX1NJREVEQVRBX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZl9zdHJlYW1zZWxlY3QuYyBiL2xpYmF2ZmlsdGVyL2Zfc3RyZWFtc2VsZWN0LmMKaW5kZXggZGI0NmM5OS4uOTIzZGViMSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZl9zdHJlYW1zZWxlY3QuYworKysgYi9saWJhdmZpbHRlci9mX3N0cmVhbXNlbGVjdC5jCkBAIC00OCwxMiArNDgsNiBAQAogCiBBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc3RyZWFtc2VsZWN0KTsKIAotc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQotewotICAgIFN0cmVhbVNlbGVjdENvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2ZpbHRlcl9mcmFtZSgmcy0+ZnMsIGlubGluaywgaW4pOwotfQotCiBzdGF0aWMgaW50IHByb2Nlc3NfZnJhbWUoRkZGcmFtZVN5bmMgKmZzKQogewogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gZnMtPnBhcmVudDsKQEAgLTcyLDcgKzY2LDcgQEAKICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQ7CiAKICAgICAgICAgICAgICAgICBpZiAocy0+aXNfYXVkaW8gJiYgcy0+bGFzdF9wdHNbal0gPT0gaW5bal0tPnB0cyAmJgotICAgICAgICAgICAgICAgICAgICBjdHgtPm91dHB1dHNbaV0tPmZyYW1lX2NvdW50ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5vdXRwdXRzW2ldLT5mcmFtZV9jb3VudF9pbiA+IDApCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIG91dCA9IGF2X2ZyYW1lX2Nsb25lKGluW2pdKTsKICAgICAgICAgICAgICAgICBpZiAoIW91dCkKQEAgLTkwLDEwICs4NCwxMCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewotICAgIFN0cmVhbVNlbGVjdENvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7Ci0gICAgcmV0dXJuIGZmX2ZyYW1lc3luY19yZXF1ZXN0X2ZyYW1lKCZzLT5mcywgb3V0bGluayk7CisgICAgU3RyZWFtU2VsZWN0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7CiB9CiAKIHN0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCkBAIC0xNTEsOSArMTQ1LDggQEAKICAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2NvbmZpZ3VyZSgmcy0+ZnMpOwogfQogCi1zdGF0aWMgaW50IHBhcnNlX2RlZmluaXRpb24oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGludCBuYl9wYWRzLCB2b2lkICpmaWx0ZXJfZnJhbWUsIGludCBpc19hdWRpbykKK3N0YXRpYyBpbnQgcGFyc2VfZGVmaW5pdGlvbihBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IG5iX3BhZHMsIGludCBpc19pbnB1dCwgaW50IGlzX2F1ZGlvKQogewotICAgIGNvbnN0IGludCBpc19pbnB1dCA9ICEhZmlsdGVyX2ZyYW1lOwogICAgIGNvbnN0IGNoYXIgKnBhZHR5cGUgPSBpc19pbnB1dCA/ICJpbiIgOiAib3V0IjsKICAgICBpbnQgaSA9IDAsIHJldCA9IDA7CiAKQEAgLTE2OSwxMSArMTYyLDkgQEAKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiQWRkICVzIHBhZCAlc1xuIiwgcGFkdHlwZSwgcGFkLm5hbWUpOwogCiAgICAgICAgIGlmIChpc19pbnB1dCkgewotICAgICAgICAgICAgcGFkLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZTsKICAgICAgICAgICAgIHJldCA9IGZmX2luc2VydF9pbnBhZChjdHgsIGksICZwYWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcGFkLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0OwotICAgICAgICAgICAgcGFkLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lOwogICAgICAgICAgICAgcmV0ID0gZmZfaW5zZXJ0X291dHBhZChjdHgsIGksICZwYWQpOwogICAgICAgICB9CiAKQEAgLTI2Nyw3ICsyNTgsNyBAQAogICAgIGlmICghc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiYXN0cmVhbXNlbGVjdCIpKQogICAgICAgICBzLT5pc19hdWRpbyA9IDE7CiAKLSAgICBmb3IgKDs7KSB7CisgICAgZm9yICg7IG1hcDspIHsKICAgICAgICAgY2hhciAqcDsKIAogICAgICAgICBzdHJ0b2wobWFwLCAmcCwgMCk7CkBAIC0yODEsOCArMjcyLDggQEAKICAgICBpZiAoIXMtPmxhc3RfcHRzKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgaWYgKChyZXQgPSBwYXJzZV9kZWZpbml0aW9uKGN0eCwgcy0+bmJfaW5wdXRzLCBmaWx0ZXJfZnJhbWUsIHMtPmlzX2F1ZGlvKSkgPCAwIHx8Ci0gICAgICAgIChyZXQgPSBwYXJzZV9kZWZpbml0aW9uKGN0eCwgbmJfb3V0cHV0cywgTlVMTCwgcy0+aXNfYXVkaW8pKSA8IDApCisgICAgaWYgKChyZXQgPSBwYXJzZV9kZWZpbml0aW9uKGN0eCwgcy0+bmJfaW5wdXRzLCAxLCBzLT5pc19hdWRpbykpIDwgMCB8fAorICAgICAgICAocmV0ID0gcGFyc2VfZGVmaW5pdGlvbihjdHgsIG5iX291dHB1dHMsIDAsIHMtPmlzX2F1ZGlvKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiQ29uZmlndXJlZCB3aXRoICVkIGlucGFkIGFuZCAlZCBvdXRwYWRcbiIsCkBAIC0zMzIsNiArMzIzLDcgQEAKICAgICAucXVlcnlfZm9ybWF0cyAgID0gcXVlcnlfZm9ybWF0cywKICAgICAucHJvY2Vzc19jb21tYW5kID0gcHJvY2Vzc19jb21tYW5kLAogICAgIC51bmluaXQgICAgICAgICAgPSB1bmluaXQsCisgICAgLmFjdGl2YXRlICAgICAgICA9IGFjdGl2YXRlLAogICAgIC5wcml2X3NpemUgICAgICAgPSBzaXplb2YoU3RyZWFtU2VsZWN0Q29udGV4dCksCiAgICAgLnByaXZfY2xhc3MgICAgICA9ICZzdHJlYW1zZWxlY3RfY2xhc3MsCiAgICAgLmZsYWdzICAgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMgfCBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUywKQEAgLTM0Nyw2ICszMzksNyBAQAogICAgIC5xdWVyeV9mb3JtYXRzICAgPSBxdWVyeV9mb3JtYXRzLAogICAgIC5wcm9jZXNzX2NvbW1hbmQgPSBwcm9jZXNzX2NvbW1hbmQsCiAgICAgLnVuaW5pdCAgICAgICAgICA9IHVuaW5pdCwKKyAgICAuYWN0aXZhdGUgICAgICAgID0gYWN0aXZhdGUsCiAgICAgLnByaXZfc2l6ZSAgICAgICA9IHNpemVvZihTdHJlYW1TZWxlY3RDb250ZXh0KSwKICAgICAucHJpdl9jbGFzcyAgICAgID0gJmFzdHJlYW1zZWxlY3RfY2xhc3MsCiAgICAgLmZsYWdzICAgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMgfCBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2Zfem1xLmMgYi9saWJhdmZpbHRlci9mX3ptcS5jCmluZGV4IGQ2YzNjNjUuLjg5ZGE1YmUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2Zfem1xLmMKKysrIGIvbGliYXZmaWx0ZXIvZl96bXEuYwpAQCAtMjksMTEgKzI5LDEwIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJhdmZpbHRlcmdyYXBoLmgiCiAjaW5jbHVkZSAiYXVkaW8uaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBaTVFDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICB2b2lkICp6bXE7CiAgICAgdm9pZCAqcmVzcG9uZGVyOwpAQCAtODYsNyArODUsNyBAQAogICAgIHptcV9jdHhfZGVzdHJveSh6bXEtPnptcSk7CiB9CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IENvbW1hbmQgewogICAgIGNoYXIgKnRhcmdldCwgKmNvbW1hbmQsICphcmc7CiB9IENvbW1hbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2ZpZm8uYyBiL2xpYmF2ZmlsdGVyL2ZpZm8uYwppbmRleCBmMGI3N2ZmLi4wZmEwZjg2IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9maWZvLmMKKysrIGIvbGliYXZmaWx0ZXIvZmlmby5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIHN0YXRpYyB2b2lkIGJ1ZmZlcl9vZmZzZXQoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCkKIHsKLSAgICBpbnQgbmJfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgIGludCBuYl9jaGFubmVscyA9IGxpbmstPmNoYW5uZWxzOwogICAgIGludCBwbGFuYXIgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihsaW5rLT5mb3JtYXQpOwogICAgIGludCBwbGFuZXMgPSBwbGFuYXIgPyBuYl9jaGFubmVscyA6IDE7CiAgICAgaW50IGJsb2NrX2FsaWduID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUobGluay0+Zm9ybWF0KSAqIChwbGFuYXIgPyAxIDogbmJfY2hhbm5lbHMpOwpAQCAtMTI5LDcgKzEyOSw3IEBACiBzdGF0aWMgaW50IGNhbGNfcHRyX2FsaWdubWVudChBVkZyYW1lICpmcmFtZSkKIHsKICAgICBpbnQgcGxhbmVzID0gYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZnJhbWUtPmZvcm1hdCkgPwotICAgICAgICAgICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoZnJhbWUtPmNoYW5uZWxfbGF5b3V0KSA6IDE7CisgICAgICAgICAgICAgICAgIGZyYW1lLT5jaGFubmVscyA6IDE7CiAgICAgaW50IG1pbl9hbGlnbiA9IDEyODsKICAgICBpbnQgcDsKIApAQCAtMTcwLDcgKzE3MCw3IEBACiAgICAgICAgICAgICBidWZmZXJfb2Zmc2V0KGxpbmssIGhlYWQsIGxpbmstPnJlcXVlc3Rfc2FtcGxlcyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpbnQgbmJfY2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMobGluay0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICBpbnQgbmJfY2hhbm5lbHMgPSBsaW5rLT5jaGFubmVsczsKIAogICAgICAgICBpZiAoIXMtPm91dCkgewogICAgICAgICAgICAgcy0+b3V0ID0gZmZfZ2V0X2F1ZGlvX2J1ZmZlcihsaW5rLCBsaW5rLT5yZXF1ZXN0X3NhbXBsZXMpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZmlsdGVycy5oIGIvbGliYXZmaWx0ZXIvZmlsdGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMjY1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9maWx0ZXJzLmgKQEAgLTAsMCArMSwyNDEgQEAKKy8qCisgKiBGaWx0ZXJzIGltcGxlbWVudGF0aW9uIGhlbHBlciBmdW5jdGlvbnMKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9GSUxURVJTX0gKKyNkZWZpbmUgQVZGSUxURVJfRklMVEVSU19ICisKKy8qKgorICogRmlsdGVycyBpbXBsZW1lbnRhdGlvbiBoZWxwZXIgZnVuY3Rpb25zCisgKi8KKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworLyoqCisgKiBTcGVjaWFsIHJldHVybiBjb2RlIHdoZW4gYWN0aXZhdGUoKSBkaWQgbm90IGRvIGFueXRoaW5nLgorICovCisjZGVmaW5lIEZGRVJST1JfTk9UX1JFQURZIEZGRVJSVEFHKCdOJywnUicsJ0QnLCdZJykKKworLyoqCisgKiBNYXJrIGEgZmlsdGVyIHJlYWR5IGFuZCBzY2hlZHVsZSBpdCBmb3IgYWN0aXZhdGlvbi4KKyAqCisgKiBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgZG9uZSB3aGVuIHNvbWV0aGluZyBoYXBwZW5zIHRvIHRoZSBmaWx0ZXIgKHF1ZXVlZAorICogZnJhbWUsIHN0YXR1cyBjaGFuZ2UsIHJlcXVlc3Qgb24gb3V0cHV0KS4KKyAqIEZpbHRlcnMgaW1wbGVtZW50aW5nIHRoZSBhY3RpdmF0ZSBjYWxsYmFjayBjYW4gY2FsbCBpdCBkaXJlY3RseSB0bworICogcGVyZm9ybSBvbmUgbW9yZSByb3VuZCBvZiBwcm9jZXNzaW5nIGxhdGVyLgorICogSXQgaXMgYWxzbyB1c2VmdWwgZm9yIGZpbHRlcnMgcmVhY3RpbmcgdG8gZXh0ZXJuYWwgb3IgYXN5bmNocm9ub3VzCisgKiBldmVudHMuCisgKi8KK3ZvaWQgZmZfZmlsdGVyX3NldF9yZWFkeShBVkZpbHRlckNvbnRleHQgKmZpbHRlciwgdW5zaWduZWQgcHJpb3JpdHkpOworCisvKioKKyAqIFByb2Nlc3MgdGhlIGNvbW1hbmRzIHF1ZXVlZCBpbiB0aGUgbGluayB1cCB0byB0aGUgdGltZSBvZiB0aGUgZnJhbWUuCisgKiBDb21tYW5kcyB3aWxsIHRyaWdnZXIgdGhlIHByb2Nlc3NfY29tbWFuZCgpIGNhbGxiYWNrLgorICogQHJldHVybiAgPj0gMCBvciBBVkVSUk9SIGNvZGUuCisgKi8KK2ludCBmZl9pbmxpbmtfcHJvY2Vzc19jb21tYW5kcyhBVkZpbHRlckxpbmsgKmxpbmssIGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBFdmFsdWF0ZSB0aGUgdGltZWxpbmUgZXhwcmVzc2lvbiBvZiB0aGUgbGluayBmb3IgdGhlIHRpbWUgYW5kIHByb3BlcnRpZXMKKyAqIG9mIHRoZSBmcmFtZS4KKyAqIEByZXR1cm4gID4wIGlmIGVuYWJsZWQsIDAgaWYgZGlzYWJsZWQKKyAqIEBub3RlICBJdCBkb2VzIG5vdCB1cGRhdGUgbGluay0+ZHN0LT5pc19kaXNhYmxlZC4KKyAqLworaW50IGZmX2lubGlua19ldmFsdWF0ZV90aW1lbGluZV9hdF9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBUZXN0IGlmIGEgZnJhbWUgaXMgYXZhaWxhYmxlIG9uIHRoZSBsaW5rLgorICogQHJldHVybiAgPjAgaWYgYSBmcmFtZSBpcyBhdmFpbGFibGUKKyAqLworaW50IGZmX2lubGlua19jaGVja19hdmFpbGFibGVfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKTsKKworLyoqCisgKiBUZXN0IGlmIGVub3VnaCBzYW1wbGVzIGFyZSBhdmFpbGFibGUgb24gdGhlIGxpbmsuCisgKiBAcmV0dXJuICA+MCBpZiBlbm91Z2ggc2FtcGxlcyBhcmUgYXZhaWxhYmxlCisgKiBAbm90ZSAgb24gRU9GIGFuZCBlcnJvciwgbWluIGJlY29tZXMgMQorICovCitpbnQgZmZfaW5saW5rX2NoZWNrX2F2YWlsYWJsZV9zYW1wbGVzKEFWRmlsdGVyTGluayAqbGluaywgdW5zaWduZWQgbWluKTsKKworLyoqCisgKiBUYWtlIGEgZnJhbWUgZnJvbSB0aGUgbGluaydzIEZJRk8gYW5kIHVwZGF0ZSB0aGUgbGluaydzIHN0YXRzLgorICoKKyAqIElmIGZmX2lubGlua19jaGVja19hdmFpbGFibGVfZnJhbWUoKSB3YXMgcHJldmlvdXNseSBjYWxsZWQsIHRoZQorICogcHJlZmVycmVkIHdheSBvZiBleHByZXNzaW5nIGl0IGlzICJhdl9hc3NlcnQxKHJldCk7IiBpbW1lZGlhdGVseSBhZnRlcgorICogZmZfaW5saW5rX2NvbnN1bWVfZnJhbWUoKS4gTmVnYXRpdmUgZXJyb3IgY29kZXMgbXVzdCBzdGlsbCBiZSBjaGVja2VkLgorICoKKyAqIEBub3RlICBNYXkgdHJpZ2dlciBwcm9jZXNzX2NvbW1hbmQoKSBhbmQvb3IgdXBkYXRlIGlzX2Rpc2FibGVkLgorICogQHJldHVybiAgPjAgaWYgYSBmcmFtZSBpcyBhdmFpbGFibGUsCisgKiAgICAgICAgICAwIGFuZCBzZXQgcmZyYW1lIHRvIE5VTEwgaWYgbm8gZnJhbWUgYXZhaWxhYmxlLAorICogICAgICAgICAgb3IgQVZFUlJPUiBjb2RlCisgKi8KK2ludCBmZl9pbmxpbmtfY29uc3VtZV9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKipyZnJhbWUpOworCisvKioKKyAqIFRha2Ugc2FtcGxlcyBmcm9tIHRoZSBsaW5rJ3MgRklGTyBhbmQgdXBkYXRlIHRoZSBsaW5rJ3Mgc3RhdHMuCisgKgorICogSWYgZmZfaW5saW5rX2NoZWNrX2F2YWlsYWJsZV9zYW1wbGVzKCkgd2FzIHByZXZpb3VzbHkgY2FsbGVkLCB0aGUKKyAqIHByZWZlcnJlZCB3YXkgb2YgZXhwcmVzc2luZyBpdCBpcyAiYXZfYXNzZXJ0MShyZXQpOyIgaW1tZWRpYXRlbHkgYWZ0ZXIKKyAqIGZmX2lubGlua19jb25zdW1lX3NhbXBsZXMoKS4gTmVnYXRpdmUgZXJyb3IgY29kZXMgbXVzdCBzdGlsbCBiZSBjaGVja2VkLgorICoKKyAqIEBub3RlICBNYXkgdHJpZ2dlciBwcm9jZXNzX2NvbW1hbmQoKSBhbmQvb3IgdXBkYXRlIGlzX2Rpc2FibGVkLgorICogQHJldHVybiAgPjAgaWYgYSBmcmFtZSBpcyBhdmFpbGFibGUsCisgKiAgICAgICAgICAwIGFuZCBzZXQgcmZyYW1lIHRvIE5VTEwgaWYgbm8gZnJhbWUgYXZhaWxhYmxlLAorICogICAgICAgICAgb3IgQVZFUlJPUiBjb2RlCisgKi8KK2ludCBmZl9pbmxpbmtfY29uc3VtZV9zYW1wbGVzKEFWRmlsdGVyTGluayAqbGluaywgdW5zaWduZWQgbWluLCB1bnNpZ25lZCBtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqKnJmcmFtZSk7CisKKy8qKgorICogTWFrZSBzdXJlIGEgZnJhbWUgaXMgd3JpdGFibGUuCisgKiBUaGlzIGlzIHNpbWlsYXIgdG8gYXZfZnJhbWVfbWFrZV93cml0YWJsZSgpIGV4Y2VwdCBpdCB1c2VzIHRoZSBsaW5rJ3MKKyAqIGJ1ZmZlciBhbGxvY2F0aW9uIGNhbGxiYWNrLCBhbmQgdGhlcmVmb3JlIGFsbG93cyBkaXJlY3QgcmVuZGVyaW5nLgorICovCitpbnQgZmZfaW5saW5rX21ha2VfZnJhbWVfd3JpdGFibGUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICoqcmZyYW1lKTsKKworLyoqCisgKiBUZXN0IGFuZCBhY2tub3dsZWRnZSB0aGUgY2hhbmdlIG9mIHN0YXR1cyBvbiB0aGUgbGluay4KKyAqCisgKiBTdGF0dXMgbWVhbnMgRU9GIG9yIGFuIGVycm9yIGNvbmRpdGlvbjsgYSBjaGFuZ2UgZnJvbSB0aGUgbm9ybWFsICgwKQorICogc3RhdHVzIHRvIGEgbm9uLXplcm8gc3RhdHVzIGNhbiBiZSBxdWV1ZWQgaW4gYSBmaWx0ZXIncyBpbnB1dCBsaW5rLCBpdAorICogYmVjb21lcyByZWxldmFudCBhZnRlciB0aGUgZnJhbWVzIHF1ZXVlZCBpbiB0aGUgbGluaydzIEZJRk8gYXJlCisgKiBwcm9jZXNzZWQuIFRoaXMgZnVuY3Rpb24gdGVzdHMgaWYgZnJhbWVzIGFyZSBzdGlsbCBxdWV1ZWQgYW5kIGlmIGEgcXVldWVkCisgKiBzdGF0dXMgY2hhbmdlIGhhcyBub3QgeWV0IGJlZW4gcHJvY2Vzc2VkLiBJbiB0aGF0IGNhc2UgaXQgcGVyZm9ybXMgYmFzaWMKKyAqIHRyZWF0bWVudCAodXBkYXRpbmcgdGhlIGxpbmsncyB0aW1lc3RhbXApIGFuZCByZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUgdG8KKyAqIGxldCB0aGUgZmlsdGVyIGRvIGl0cyBvd24gdHJlYXRtZW50cyAoZmx1c2hpbmcuLi4pLgorICoKKyAqIEZpbHRlcnMgaW1wbGVtZW50aW5nIHRoZSBhY3RpdmF0ZSBjYWxsYmFjayBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4KKyAqIHRoZXkgdGhpbmsgaXQgbWlnaHQgc3VjY2VlZCAodXN1YWxseSBhZnRlciBjaGVja2luZyB1bnN1Y2Nlc3NmdWxseSBmb3IgYQorICogcXVldWVkIGZyYW1lKS4KKyAqIEZpbHRlcnMgaW1wbGVtZW50aW5nIHRoZSBmaWx0ZXJfZnJhbWUgYW5kIHJlcXVlc3RfZnJhbWUgY2FsbGJhY2tzIGRvIG5vdAorICogbmVlZCB0byBjYWxsIHRoYXQgc2luY2UgdGhlIHNhbWUgdHJlYXRtZW50IGhhcHBlbnMgaW4gZmZfZmlsdGVyX2ZyYW1lKCkuCisgKgorICogQHBhcmFtW291dF0gcnN0YXR1cyAgbmV3IG9yIGN1cnJlbnQgc3RhdHVzCisgKiBAcGFyYW1bb3V0XSBycHRzICAgICBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgbGluayBpbiBsaW5rIHRpbWUgYmFzZQorICogQHJldHVybiAgPjAgaWYgc3RhdHVzIGNoYW5nZWQsIDwwIGlmIHN0YXR1cyBhbHJlYWR5IGFja2VkLCAwIG90aGVyd2lzZQorICovCitpbnQgZmZfaW5saW5rX2Fja25vd2xlZGdlX3N0YXR1cyhBVkZpbHRlckxpbmsgKmxpbmssIGludCAqcnN0YXR1cywgaW50NjRfdCAqcnB0cyk7CisKKy8qKgorICogTWFyayB0aGF0IGEgZnJhbWUgaXMgd2FudGVkIG9uIHRoZSBsaW5rLgorICogVW5saWtlIGZmX2ZpbHRlcl9mcmFtZSgpLCBpdCBtdXN0IG5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgbGluayBoYXMgYQorICogbm9uLXplcm8gc3RhdHVzLCBhbmQgdGh1cyBkb2VzIG5vdCBhY2tub3dsZWRnZSBpdC4KKyAqIEFsc28gaXQgY2Fubm90IGZhaWwuCisgKi8KK3ZvaWQgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKTsKKworLyoqCisgKiBTZXQgdGhlIHN0YXR1cyBvbiBhbiBpbnB1dCBsaW5rLgorICogQWxzbyBkaXNjYXJkIGFsbCBmcmFtZXMgaW4gdGhlIGxpbmsncyBGSUZPLgorICovCit2b2lkIGZmX2lubGlua19zZXRfc3RhdHVzKEFWRmlsdGVyTGluayAqbGluaywgaW50IHN0YXR1cyk7CisKKy8qKgorICogVGVzdCBpZiBhIGZyYW1lIGlzIHdhbnRlZCBvbiBhbiBvdXRwdXQgbGluay4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZmZfb3V0bGlua19mcmFtZV93YW50ZWQoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIHJldHVybiBsaW5rLT5mcmFtZV93YW50ZWRfb3V0OworfQorCisvKioKKyAqIEdldCB0aGUgc3RhdHVzIG9uIGFuIG91dHB1dCBsaW5rLgorICovCitpbnQgZmZfb3V0bGlua19nZXRfc3RhdHVzKEFWRmlsdGVyTGluayAqbGluayk7CisKKy8qKgorICogU2V0IHRoZSBzdGF0dXMgZmllbGQgb2YgYSBsaW5rIGZyb20gdGhlIHNvdXJjZSBmaWx0ZXIuCisgKiBUaGUgcHRzIHNob3VsZCByZWZsZWN0IHRoZSB0aW1lc3RhbXAgb2YgdGhlIHN0YXR1cyBjaGFuZ2UsCisgKiBpbiBsaW5rIHRpbWUgYmFzZSBhbmQgcmVsYXRpdmUgdG8gdGhlIGZyYW1lcyB0aW1lbGluZS4KKyAqIEluIHBhcnRpY3VsYXIsIGZvciBBVkVSUk9SX0VPRiwgaXQgc2hvdWxkIHJlZmxlY3QgdGhlCisgKiBlbmQgdGltZSBvZiB0aGUgbGFzdCBmcmFtZS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGZmX291dGxpbmtfc2V0X3N0YXR1cyhBVkZpbHRlckxpbmsgKmxpbmssIGludCBzdGF0dXMsIGludDY0X3QgcHRzKQoreworICAgIGZmX2F2ZmlsdGVyX2xpbmtfc2V0X2luX3N0YXR1cyhsaW5rLCBzdGF0dXMsIHB0cyk7Cit9CisKKy8qKgorICogRm9yd2FyZCB0aGUgc3RhdHVzIG9uIGFuIG91dHB1dCBsaW5rIHRvIGFuIGlucHV0IGxpbmsuCisgKiBJZiB0aGUgc3RhdHVzIGlzIHNldCwgaXQgd2lsbCBkaXNjYXJkIGFsbCBxdWV1ZWQgZnJhbWVzIGFuZCB0aGlzIG1hY3JvCisgKiB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4KKyAqLworI2RlZmluZSBGRl9GSUxURVJfRk9SV0FSRF9TVEFUVVNfQkFDSyhvdXRsaW5rLCBpbmxpbmspIGRvIHsgXAorICAgIGludCByZXQgPSBmZl9vdXRsaW5rX2dldF9zdGF0dXMob3V0bGluayk7IFwKKyAgICBpZiAocmV0KSB7IFwKKyAgICAgICAgZmZfaW5saW5rX3NldF9zdGF0dXMoaW5saW5rLCByZXQpOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIEZvcndhcmQgdGhlIHN0YXR1cyBvbiBhbiBvdXRwdXQgbGluayB0byBhbGwgaW5wdXQgbGlua3MuCisgKiBJZiB0aGUgc3RhdHVzIGlzIHNldCwgaXQgd2lsbCBkaXNjYXJkIGFsbCBxdWV1ZWQgZnJhbWVzIGFuZCB0aGlzIG1hY3JvCisgKiB3aWxsIHJldHVybiBpbW1lZGlhdGVseS4KKyAqLworI2RlZmluZSBGRl9GSUxURVJfRk9SV0FSRF9TVEFUVVNfQkFDS19BTEwob3V0bGluaywgZmlsdGVyKSBkbyB7IFwKKyAgICBpbnQgcmV0ID0gZmZfb3V0bGlua19nZXRfc3RhdHVzKG91dGxpbmspOyBcCisgICAgaWYgKHJldCkgeyBcCisgICAgICAgIHVuc2lnbmVkIGk7IFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bmJfaW5wdXRzOyBpKyspIFwKKyAgICAgICAgICAgIGZmX2lubGlua19zZXRfc3RhdHVzKGZpbHRlci0+aW5wdXRzW2ldLCByZXQpOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIEFja25vd2xlZGdlIHRoZSBzdGF0dXMgb24gYW4gaW5wdXQgbGluayBhbmQgZm9yd2FyZCBpdCB0byBhbiBvdXRwdXQgbGluay4KKyAqIElmIHRoZSBzdGF0dXMgaXMgc2V0LCB0aGlzIG1hY3JvIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgorICovCisjZGVmaW5lIEZGX0ZJTFRFUl9GT1JXQVJEX1NUQVRVUyhpbmxpbmssIG91dGxpbmspIGRvIHsgXAorICAgIGludCBzdGF0dXM7IFwKKyAgICBpbnQ2NF90IHB0czsgXAorICAgIGlmIChmZl9pbmxpbmtfYWNrbm93bGVkZ2Vfc3RhdHVzKGlubGluaywgJnN0YXR1cywgJnB0cykpIHsgXAorICAgICAgICBmZl9vdXRsaW5rX3NldF9zdGF0dXMob3V0bGluaywgc3RhdHVzLCBwdHMpOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIEFja25vd2xlZGdlIHRoZSBzdGF0dXMgb24gYW4gaW5wdXQgbGluayBhbmQgZm9yd2FyZCBpdCB0byBhbiBvdXRwdXQgbGluay4KKyAqIElmIHRoZSBzdGF0dXMgaXMgc2V0LCB0aGlzIG1hY3JvIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5LgorICovCisjZGVmaW5lIEZGX0ZJTFRFUl9GT1JXQVJEX1NUQVRVU19BTEwoaW5saW5rLCBmaWx0ZXIpIGRvIHsgXAorICAgIGludCBzdGF0dXM7IFwKKyAgICBpbnQ2NF90IHB0czsgXAorICAgIGlmIChmZl9pbmxpbmtfYWNrbm93bGVkZ2Vfc3RhdHVzKGlubGluaywgJnN0YXR1cywgJnB0cykpIHsgXAorICAgICAgICB1bnNpZ25lZCBpOyBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXItPm5iX291dHB1dHM7IGkrKykgXAorICAgICAgICAgICAgZmZfb3V0bGlua19zZXRfc3RhdHVzKGZpbHRlci0+b3V0cHV0c1tpXSwgc3RhdHVzLCBwdHMpOyBcCisgICAgICAgIHJldHVybiAwOyBcCisgICAgfSBcCit9IHdoaWxlICgwKQorCisvKioKKyAqIEZvcndhcmQgdGhlIGZyYW1lX3dhbnRlZF9vdXQgZmxhZyBmcm9tIGFuIG91dHB1dCBsaW5rIHRvIGFuIGlucHV0IGxpbmsuCisgKiBJZiB0aGUgZmxhZyBpcyBzZXQsIHRoaXMgbWFjcm8gd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkuCisgKi8KKyNkZWZpbmUgRkZfRklMVEVSX0ZPUldBUkRfV0FOVEVEKG91dGxpbmssIGlubGluaykgZG8geyBcCisgICAgaWYgKGZmX291dGxpbmtfZnJhbWVfd2FudGVkKG91dGxpbmspKSB7IFwKKyAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsgXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAorfSB3aGlsZSAoMCkKKworI2VuZGlmIC8qIEFWRklMVEVSX0ZJTFRFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZmlsdGZtdHMuYyBiL2xpYmF2ZmlsdGVyL2ZpbHRmbXRzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YTJkOTQuLjAwMDAwMDAKLS0tIGEvbGliYXZmaWx0ZXIvZmlsdGZtdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA5IFN0ZWZhbm8gU2FiYXRpbmkKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvc2FtcGxlZm10LmgiCi0KLSNpbmNsdWRlICJsaWJhdmZpbHRlci9hdmZpbHRlci5oIgotI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2Zvcm1hdHMuaCIKLQotc3RhdGljIHZvaWQgcHJpbnRfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmZpbHRlcl9jdHgpCi17Ci0gICAgaW50IGksIGo7Ci0KLSNkZWZpbmUgUFJJTlRfRk1UUyhpbm91dCwgb3V0aW4sIElOT1VUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyX2N0eC0+bmJfIyNpbm91dCMjcHV0czsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoZmlsdGVyX2N0eC0+aW5vdXQjI3B1dHNbaV0tPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7ICAgXAotICAgICAgICAgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIGZpbHRlcl9jdHgtPmlub3V0IyNwdXRzW2ldLT5vdXRpbiMjX2Zvcm1hdHM7ICAgICAgICAgICAgXAotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZtdHMtPm5iX2Zvcm1hdHM7IGorKykgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBpZihhdl9nZXRfcGl4X2ZtdF9uYW1lKGZtdHMtPmZvcm1hdHNbal0pKSAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBwcmludGYoI0lOT1VUICJQVVRbJWRdICVzOiBmbXQ6JXNcbiIsICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgaSwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKGZpbHRlcl9jdHgtPmlub3V0IyNwdXRfcGFkcywgaSksICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGZtdHMtPmZvcm1hdHNbal0pKTsgICAgICAgICAgXAotICAgICAgICB9IGVsc2UgaWYgKGZpbHRlcl9jdHgtPmlub3V0IyNwdXRzW2ldLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeyBcCi0gICAgICAgICAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBmbXRzID0gZmlsdGVyX2N0eC0+aW5vdXQjI3B1dHNbaV0tPm91dGluIyNfZm9ybWF0czsgICAgICAgICBcCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZm10cy0+bmJfZm9ybWF0czsgaisrKSAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHByaW50ZigjSU5PVVQgIlBVVFslZF0gJXM6IGZtdDolc1xuIiwgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICBpLCBhdmZpbHRlcl9wYWRfZ2V0X25hbWUoZmlsdGVyX2N0eC0+aW5vdXQjI3B1dF9wYWRzLCBpKSwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoZm10cy0+Zm9ybWF0c1tqXSkpOyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBsYXlvdXRzID0gZmlsdGVyX2N0eC0+aW5vdXQjI3B1dHNbaV0tPm91dGluIyNfY2hhbm5lbF9sYXlvdXRzOyBcCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGF5b3V0cy0+bmJfY2hhbm5lbF9sYXlvdXRzOyBqKyspIHsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgY2hhciBidWZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAtMSwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRzLT5jaGFubmVsX2xheW91dHNbal0pOyAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBwcmludGYoI0lOT1VUICJQVVRbJWRdICVzOiBjaGxheW91dDolc1xuIiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgaSwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKGZpbHRlcl9jdHgtPmlub3V0IyNwdXRfcGFkcywgaSksIGJ1Zik7IFwKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotICAgIFBSSU5UX0ZNVFMoaW4sICBvdXQsIElOKTsKLSAgICBQUklOVF9GTVRTKG91dCwgaW4sICBPVVQpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgQVZGaWx0ZXIgKmZpbHRlcjsKLSAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlcl9jdHg7Ci0gICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGhfY3R4OwotICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9uYW1lOwotICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9hcmdzID0gTlVMTDsKLSAgICBpbnQgaTsKLSAgICBpbnQgcmV0ID0gMDsKLQotICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKLQotICAgIGlmIChhcmdjIDwgMikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsdGVyIG5hbWUgYXMgYXJndW1lbnRcbiIpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBmaWx0ZXJfbmFtZSA9IGFyZ3ZbMV07Ci0gICAgaWYgKGFyZ2MgPiAyKQotICAgICAgICBmaWx0ZXJfYXJncyA9IGFyZ3ZbMl07Ci0KLSAgICAvKiBhbGxvY2F0ZSBncmFwaCAqLwotICAgIGdyYXBoX2N0eCA9IGF2ZmlsdGVyX2dyYXBoX2FsbG9jKCk7Ci0gICAgaWYgKCFncmFwaF9jdHgpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgYXZmaWx0ZXJfcmVnaXN0ZXJfYWxsKCk7Ci0KLSAgICAvKiBnZXQgYSBjb3JyZXNwb25kaW5nIGZpbHRlciBhbmQgb3BlbiBpdCAqLwotICAgIGlmICghKGZpbHRlciA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKGZpbHRlcl9uYW1lKSkpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbnJlY29nbml6ZWQgZmlsdGVyIHdpdGggbmFtZSAnJXMnXG4iLCBmaWx0ZXJfbmFtZSk7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIC8qIG9wZW4gZmlsdGVyIGFuZCBhZGQgaXQgdG8gdGhlIGdyYXBoICovCi0gICAgaWYgKCEoZmlsdGVyX2N0eCA9IGF2ZmlsdGVyX2dyYXBoX2FsbG9jX2ZpbHRlcihncmFwaF9jdHgsIGZpbHRlciwgZmlsdGVyX25hbWUpKSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkltcG9zc2libGUgdG8gb3BlbiBmaWx0ZXIgd2l0aCBuYW1lICclcydcbiIsCi0gICAgICAgICAgICAgICAgZmlsdGVyX25hbWUpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKGF2ZmlsdGVyX2luaXRfc3RyKGZpbHRlcl9jdHgsIGZpbHRlcl9hcmdzKSA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbXBvc3NpYmxlIHRvIGluaXQgZmlsdGVyICclcycgd2l0aCBhcmd1bWVudHMgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICBmaWx0ZXJfbmFtZSwgZmlsdGVyX2FyZ3MpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICAvKiBjcmVhdGUgYSBsaW5rIGZvciBlYWNoIG9mIHRoZSBpbnB1dCBwYWRzICovCi0gICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcl9jdHgtPm5iX2lucHV0czsgaSsrKSB7Ci0gICAgICAgIEFWRmlsdGVyTGluayAqbGluayA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWRmlsdGVyTGluaykpOwotICAgICAgICBpZiAoIWxpbmspIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmlsdGVyIGlucHV0IGxpbmtcbiIpOwotICAgICAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgICBsaW5rLT50eXBlID0gYXZmaWx0ZXJfcGFkX2dldF90eXBlKGZpbHRlcl9jdHgtPmlucHV0X3BhZHMsIGkpOwotICAgICAgICBmaWx0ZXJfY3R4LT5pbnB1dHNbaV0gPSBsaW5rOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyX2N0eC0+bmJfb3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIEFWRmlsdGVyTGluayAqbGluayA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWRmlsdGVyTGluaykpOwotICAgICAgICBpZiAoIWxpbmspIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmlsdGVyIG91dHB1dCBsaW5rXG4iKTsKLSAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgbGluay0+dHlwZSA9IGF2ZmlsdGVyX3BhZF9nZXRfdHlwZShmaWx0ZXJfY3R4LT5vdXRwdXRfcGFkcywgaSk7Ci0gICAgICAgIGZpbHRlcl9jdHgtPm91dHB1dHNbaV0gPSBsaW5rOwotICAgIH0KLQotICAgIGlmIChmaWx0ZXItPnF1ZXJ5X2Zvcm1hdHMpCi0gICAgICAgIGZpbHRlci0+cXVlcnlfZm9ybWF0cyhmaWx0ZXJfY3R4KTsKLSAgICBlbHNlCi0gICAgICAgIGZmX2RlZmF1bHRfcXVlcnlfZm9ybWF0cyhmaWx0ZXJfY3R4KTsKLQotICAgIHByaW50X2Zvcm1hdHMoZmlsdGVyX2N0eCk7Ci0KLWZhaWw6Ci0gICAgYXZmaWx0ZXJfZnJlZShmaWx0ZXJfY3R4KTsKLSAgICBhdmZpbHRlcl9ncmFwaF9mcmVlKCZncmFwaF9jdHgpOwotICAgIGZmbHVzaChzdGRvdXQpOwotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9mb3JtYXRzLmMgYi9saWJhdmZpbHRlci9mb3JtYXRzLmMKaW5kZXggZjEyZGNmNC4uMzFlZTQ0NSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZm9ybWF0cy5jCisrKyBiL2xpYmF2ZmlsdGVyL2Zvcm1hdHMuYwpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGItPm5iOyBqKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgaWYgKGEtPmZtdHNbaV0gPT0gYi0+Zm10c1tqXSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgaWYoayA+PSBGRk1JTihhLT5uYiwgYi0+bmIpKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkR1cGxpY2F0ZSBmb3JtYXRzIGluIGF2ZmlsdGVyX21lcmdlX2Zvcm1hdHMoKSBkZXRlY3RlZFxuIik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJEdXBsaWNhdGUgZm9ybWF0cyBpbiAlcyBkZXRlY3RlZFxuIiwgX19GVU5DVElPTl9fKTsgXAogICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShyZXQtPmZtdHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHJldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTk2LDEyICs1OTYsMTIgQEAKIAogaW50IGZmX2RlZmF1bHRfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICByZXR1cm4gZGVmYXVsdF9xdWVyeV9mb3JtYXRzX2NvbW1vbihjdHgsIGZmX2FsbF9jaGFubmVsX2xheW91dHMpOworICAgIHJldHVybiBkZWZhdWx0X3F1ZXJ5X2Zvcm1hdHNfY29tbW9uKGN0eCwgZmZfYWxsX2NoYW5uZWxfY291bnRzKTsKIH0KIAotaW50IGZmX3F1ZXJ5X2Zvcm1hdHNfYWxsKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoraW50IGZmX3F1ZXJ5X2Zvcm1hdHNfYWxsX2xheW91dHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7Ci0gICAgcmV0dXJuIGRlZmF1bHRfcXVlcnlfZm9ybWF0c19jb21tb24oY3R4LCBmZl9hbGxfY2hhbm5lbF9jb3VudHMpOworICAgIHJldHVybiBkZWZhdWx0X3F1ZXJ5X2Zvcm1hdHNfY29tbW9uKGN0eCwgZmZfYWxsX2NoYW5uZWxfbGF5b3V0cyk7CiB9CiAKIC8qIGludGVybmFsIGZ1bmN0aW9ucyBmb3IgcGFyc2luZyBhdWRpbyBmb3JtYXQgYXJndW1lbnRzICovCkBAIC02NjIsNzMgKzY2MiwyMCBAQAogaW50IGZmX3BhcnNlX2NoYW5uZWxfbGF5b3V0KGludDY0X3QgKnJldCwgaW50ICpucmV0LCBjb25zdCBjaGFyICphcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nX2N0eCkKIHsKLSAgICBjaGFyICp0YWlsOwogICAgIGludDY0X3QgY2hsYXlvdXQ7CisgICAgaW50IG5iX2NoYW5uZWxzOwogCi0gICAgY2hsYXlvdXQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXQoYXJnKTsKLSAgICBpZiAoY2hsYXlvdXQgPT0gMCkgewotICAgICAgICBjaGxheW91dCA9IHN0cnRvbChhcmcsICZ0YWlsLCAxMCk7Ci0gICAgICAgIGlmICghKCp0YWlsID09ICdcMCcgfHwgKnRhaWwgPT0gJ2MnICYmICoodGFpbCArIDEpID09ICdcMCcpIHx8IGNobGF5b3V0IDw9IDAgfHwgY2hsYXlvdXQgPiA2MykgewotICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2hhbm5lbCBsYXlvdXQgJyVzJ1xuIiwgYXJnKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5yZXQpIHsKLSAgICAgICAgICAgICpucmV0ID0gY2hsYXlvdXQ7Ci0gICAgICAgICAgICAqcmV0ID0gMDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisgICAgaWYgKGF2X2dldF9leHRlbmRlZF9jaGFubmVsX2xheW91dChhcmcsICZjaGxheW91dCwgJm5iX2NoYW5uZWxzKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY2hhbm5lbCBsYXlvdXQgJyVzJ1xuIiwgYXJnKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKCFjaGxheW91dCAmJiAhbnJldCkgeworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjaGFubmVsIGxheW91dCAnJXMnIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBhcmcpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KICAgICAqcmV0ID0gY2hsYXlvdXQ7CiAgICAgaWYgKG5yZXQpCi0gICAgICAgICpucmV0ID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGNobGF5b3V0KTsKLSAgICByZXR1cm4gMDsKLX0KLQotI2lmZGVmIFRFU1QKLQotI3VuZGVmIHByaW50ZgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGNvbnN0IGludDY0X3QgKmNsOwotICAgIGNoYXIgYnVmWzUxMl07Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgY2hhciAqdGVzdHN0cmluZ3NbXSA9ewotICAgICAgICAiYmxhaCIsCi0gICAgICAgICIxIiwKLSAgICAgICAgIjIiLAotICAgICAgICAiLTEiLAotICAgICAgICAiNjAiLAotICAgICAgICAiNjUiLAotICAgICAgICAiMWMiLAotICAgICAgICAiMmMiLAotICAgICAgICAiLTFjIiwKLSAgICAgICAgIjYwYyIsCi0gICAgICAgICI2NWMiLAotICAgICAgICAiNS4xIiwKLSAgICAgICAgInN0ZXJlbyIsCi0gICAgICAgICIxKzErMSsxIiwKLSAgICAgICAgIjFjKzFjKzFjKzFjIiwKLSAgICAgICAgIjJjKzFjIiwKLSAgICAgICAgIjB4MyIsCi0gICAgfTsKLQotICAgIGZvciAoY2wgPSBhdmZpbHRlcl9hbGxfY2hhbm5lbF9sYXlvdXRzOyAqY2wgIT0gLTE7IGNsKyspIHsKLSAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAtMSwgKmNsKTsKLSAgICAgICAgcHJpbnRmKCIlc1xuIiwgYnVmKTsKLSAgICB9Ci0KLSAgICBmb3IgKCBpID0gMDsgaTxGRl9BUlJBWV9FTEVNUyh0ZXN0c3RyaW5ncyk7IGkrKykgewotICAgICAgICBpbnQ2NF90IGxheW91dCA9IC0xOwotICAgICAgICBpbnQgY291bnQgPSAtMTsKLSAgICAgICAgaW50IHJldDsKLSAgICAgICAgcmV0ID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoJmxheW91dCwgJmNvdW50LCB0ZXN0c3RyaW5nc1tpXSwgTlVMTCk7Ci0KLSAgICAgICAgcHJpbnRmICgiJWQgPSBmZl9wYXJzZV9jaGFubmVsX2xheW91dCglMDE2IlBSSVg2NCIsICUyZCwgJXMpO1xuIiwgcmV0ID8gLTEgOiAwLCBsYXlvdXQsIGNvdW50LCB0ZXN0c3RyaW5nc1tpXSk7Ci0gICAgfQorICAgICAgICAqbnJldCA9IG5iX2NoYW5uZWxzOwogCiAgICAgcmV0dXJuIDA7CiB9Ci0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9mb3JtYXRzLmggYi9saWJhdmZpbHRlci9mb3JtYXRzLmgKaW5kZXggY2UwOWQzYy4uODcwODA5YiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZm9ybWF0cy5oCisrKyBiL2xpYmF2ZmlsdGVyL2Zvcm1hdHMuaApAQCAtMTg2LDE1ICsxODYsMTMgQEAKIGF2X3dhcm5fdW51c2VkX3Jlc3VsdAogaW50IGZmX2RlZmF1bHRfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCk7CiAKLS8qKgotICogU2V0IHRoZSBmb3JtYXRzIGxpc3QgdG8gYWxsIGV4aXN0aW5nIGZvcm1hdHMuCi0gKiBUaGlzIGZ1bmN0aW9uIGJlaGF2ZXMgbGlrZSBmZl9kZWZhdWx0X3F1ZXJ5X2Zvcm1hdHMoKSwgZXhjZXB0IGl0IGFsc28KLSAqIGFjY2VwdHMgY2hhbm5lbCBsYXlvdXRzIHdpdGggdW5rbm93biBkaXNwb3NpdGlvbi4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZAotICogd2l0aCBhdWRpbyBmaWx0ZXJzLgorIC8qKgorICogU2V0IHRoZSBmb3JtYXRzIGxpc3QgdG8gYWxsIGtub3duIGNoYW5uZWwgbGF5b3V0cy4gVGhpcyBmdW5jdGlvbiBiZWhhdmVzCisgKiBsaWtlIGZmX2RlZmF1bHRfcXVlcnlfZm9ybWF0cygpLCBleGNlcHQgaXQgb25seSBhY2NlcHRzIGtub3duIGNoYW5uZWwKKyAqIGxheW91dHMuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCBhdWRpbyBmaWx0ZXJzLgogICovCiBhdl93YXJuX3VudXNlZF9yZXN1bHQKLWludCBmZl9xdWVyeV9mb3JtYXRzX2FsbChBVkZpbHRlckNvbnRleHQgKmN0eCk7Ci0KK2ludCBmZl9xdWVyeV9mb3JtYXRzX2FsbF9sYXlvdXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKIAogLyoqCiAgKiBDcmVhdGUgYSBsaXN0IG9mIHN1cHBvcnRlZCBmb3JtYXRzLiBUaGlzIGlzIGludGVuZGVkIGZvciB1c2UgaW4KQEAgLTI3Myw3ICsyNzEsNiBAQAogdm9pZCBmZl9mb3JtYXRzX3VucmVmKEFWRmlsdGVyRm9ybWF0cyAqKnJlZik7CiAKIC8qKgotICoKICAqICAgICAgICAgQmVmb3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIKICAqICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX18KICAqICB8Zm9ybWF0cyB8PC0tLS0tLS0tLS4gICAgICAgICAgICB8Zm9ybWF0cyB8PC0tLS0tLS0tLS4KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2ZyYW1lcG9vbC5jIGIvbGliYXZmaWx0ZXIvZnJhbWVwb29sLmMKaW5kZXggNmRmNTc0ZS4uM2IxNzhjZSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZnJhbWVwb29sLmMKKysrIGIvbGliYXZmaWx0ZXIvZnJhbWVwb29sLmMKQEAgLTIwLDE2ICsyMCwyNyBAQAogCiAjaW5jbHVkZSAiZnJhbWVwb29sLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgogCi1zdHJ1Y3QgRkZWaWRlb0ZyYW1lUG9vbCB7CitzdHJ1Y3QgRkZGcmFtZVBvb2wgewogCisgICAgZW51bSBBVk1lZGlhVHlwZSB0eXBlOworCisgICAgLyogdmlkZW8gKi8KICAgICBpbnQgd2lkdGg7CiAgICAgaW50IGhlaWdodDsKKworICAgIC8qIGF1ZGlvICovCisgICAgaW50IHBsYW5lczsKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgaW50IG5iX3NhbXBsZXM7CisKKyAgICAvKiBjb21tb24gKi8KICAgICBpbnQgZm9ybWF0OwogICAgIGludCBhbGlnbjsKICAgICBpbnQgbGluZXNpemVbNF07CkBAIC0zNywyOSArNDgsMzAgQEAKIAogfTsKIAotRkZWaWRlb0ZyYW1lUG9vbCAqZmZfdmlkZW9fZnJhbWVfcG9vbF9pbml0KEFWQnVmZmVyUmVmKiAoKmFsbG9jKShpbnQgc2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24pCitGRkZyYW1lUG9vbCAqZmZfZnJhbWVfcG9vbF92aWRlb19pbml0KEFWQnVmZmVyUmVmKiAoKmFsbG9jKShpbnQgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsaWduKQogewogICAgIGludCBpLCByZXQ7Ci0gICAgRkZWaWRlb0ZyYW1lUG9vbCAqcG9vbDsKKyAgICBGRkZyYW1lUG9vbCAqcG9vbDsKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZvcm1hdCk7CiAKICAgICBpZiAoIWRlc2MpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgcG9vbCA9IGF2X21hbGxvY3ooc2l6ZW9mKEZGVmlkZW9GcmFtZVBvb2wpKTsKKyAgICBwb29sID0gYXZfbWFsbG9jeihzaXplb2YoRkZGcmFtZVBvb2wpKTsKICAgICBpZiAoIXBvb2wpCiAgICAgICAgIHJldHVybiBOVUxMOwogCisgICAgcG9vbC0+dHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKICAgICBwb29sLT53aWR0aCA9IHdpZHRoOwogICAgIHBvb2wtPmhlaWdodCA9IGhlaWdodDsKICAgICBwb29sLT5mb3JtYXQgPSBmb3JtYXQ7CiAgICAgcG9vbC0+YWxpZ24gPSBhbGlnbjsKIAotICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZSh3aWR0aCwgaGVpZ2h0LCAwLCBOVUxMKSkgPCAwKSB7CisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplMih3aWR0aCwgaGVpZ2h0LCBJTlQ2NF9NQVgsIGZvcm1hdCwgMCwgTlVMTCkpIDwgMCkgewogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCkBAIC05MSw3ICsxMDMsNyBAQAogICAgIH0KIAogICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwKLSAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSB7CisgICAgICAgIGRlc2MtPmZsYWdzICYgRkZfUFNFVURPUEFMKSB7CiAgICAgICAgIHBvb2wtPnBvb2xzWzFdID0gYXZfYnVmZmVyX3Bvb2xfaW5pdChBVlBBTEVUVEVfU0laRSwgYWxsb2MpOwogICAgICAgICBpZiAoIXBvb2wtPnBvb2xzWzFdKQogICAgICAgICAgICAgZ290byBmYWlsOwpAQCAtMTAwLDExICsxMTIsNDkgQEAKICAgICByZXR1cm4gcG9vbDsKIAogZmFpbDoKLSAgICBmZl92aWRlb19mcmFtZV9wb29sX3VuaW5pdCgmcG9vbCk7CisgICAgZmZfZnJhbWVfcG9vbF91bmluaXQoJnBvb2wpOwogICAgIHJldHVybiBOVUxMOwogfQogCi1pbnQgZmZfdmlkZW9fZnJhbWVfcG9vbF9nZXRfY29uZmlnKEZGVmlkZW9GcmFtZVBvb2wgKnBvb2wsCitGRkZyYW1lUG9vbCAqZmZfZnJhbWVfcG9vbF9hdWRpb19pbml0KEFWQnVmZmVyUmVmKiAoKmFsbG9jKShpbnQgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24pCit7CisgICAgaW50IHJldCwgcGxhbmFyOworICAgIEZGRnJhbWVQb29sICpwb29sOworCisgICAgcG9vbCA9IGF2X21hbGxvY3ooc2l6ZW9mKEZGRnJhbWVQb29sKSk7CisgICAgaWYgKCFwb29sKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHBsYW5hciA9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGZvcm1hdCk7CisKKyAgICBwb29sLT50eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHBvb2wtPnBsYW5lcyA9IHBsYW5hciA/IGNoYW5uZWxzIDogMTsKKyAgICBwb29sLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIHBvb2wtPm5iX3NhbXBsZXMgPSBuYl9zYW1wbGVzOworICAgIHBvb2wtPmZvcm1hdCA9IGZvcm1hdDsKKyAgICBwb29sLT5hbGlnbiA9IGFsaWduOworCisgICAgcmV0ID0gYXZfc2FtcGxlc19nZXRfYnVmZmVyX3NpemUoJnBvb2wtPmxpbmVzaXplWzBdLCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzLCBmb3JtYXQsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBwb29sLT5wb29sc1swXSA9IGF2X2J1ZmZlcl9wb29sX2luaXQocG9vbC0+bGluZXNpemVbMF0sIE5VTEwpOworICAgIGlmICghcG9vbC0+cG9vbHNbMF0pCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHJldHVybiBwb29sOworCitmYWlsOgorICAgIGZmX2ZyYW1lX3Bvb2xfdW5pbml0KCZwb29sKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGZmX2ZyYW1lX3Bvb2xfZ2V0X3ZpZGVvX2NvbmZpZyhGRkZyYW1lUG9vbCAqcG9vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqZm9ybWF0LApAQCAtMTEzLDYgKzE2Myw4IEBACiAgICAgaWYgKCFwb29sKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCisgICAgYXZfYXNzZXJ0MChwb29sLT50eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyk7CisKICAgICAqd2lkdGggPSBwb29sLT53aWR0aDsKICAgICAqaGVpZ2h0ID0gcG9vbC0+aGVpZ2h0OwogICAgICpmb3JtYXQgPSBwb29sLT5mb3JtYXQ7CkBAIC0xMjEsOCArMTczLDI2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK2ludCBmZl9mcmFtZV9wb29sX2dldF9hdWRpb19jb25maWcoRkZGcmFtZVBvb2wgKnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmJfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlNhbXBsZUZvcm1hdCAqZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmFsaWduKQoreworICAgIGlmICghcG9vbCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIAotQVZGcmFtZSAqZmZfdmlkZW9fZnJhbWVfcG9vbF9nZXQoRkZWaWRlb0ZyYW1lUG9vbCAqcG9vbCkKKyAgICBhdl9hc3NlcnQwKHBvb2wtPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKTsKKworICAgICpjaGFubmVscyA9IHBvb2wtPmNoYW5uZWxzOworICAgICpuYl9zYW1wbGVzID0gcG9vbC0+bmJfc2FtcGxlczsKKyAgICAqZm9ybWF0ID0gcG9vbC0+Zm9ybWF0OworICAgICphbGlnbiA9IHBvb2wtPmFsaWduOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWRnJhbWUgKmZmX2ZyYW1lX3Bvb2xfZ2V0KEZGRnJhbWVQb29sICpwb29sKQogewogICAgIGludCBpOwogICAgIEFWRnJhbWUgKmZyYW1lOwpAQCAtMTMzLDQwICsyMDMsNzcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocG9vbC0+Zm9ybWF0KTsKLSAgICBpZiAoIWRlc2MpIHsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLQotICAgIGZyYW1lLT53aWR0aCA9IHBvb2wtPndpZHRoOwotICAgIGZyYW1lLT5oZWlnaHQgPSBwb29sLT5oZWlnaHQ7Ci0gICAgZnJhbWUtPmZvcm1hdCA9IHBvb2wtPmZvcm1hdDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgZnJhbWUtPmxpbmVzaXplW2ldID0gcG9vbC0+bGluZXNpemVbaV07Ci0gICAgICAgIGlmICghcG9vbC0+cG9vbHNbaV0pCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBmcmFtZS0+YnVmW2ldID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KHBvb2wtPnBvb2xzW2ldKTsKLSAgICAgICAgaWYgKCFmcmFtZS0+YnVmW2ldKSB7CisgICAgc3dpdGNoKHBvb2wtPnR5cGUpIHsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocG9vbC0+Zm9ybWF0KTsKKyAgICAgICAgaWYgKCFkZXNjKSB7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KIAotICAgICAgICBmcmFtZS0+ZGF0YVtpXSA9IGZyYW1lLT5idWZbaV0tPmRhdGE7Ci0gICAgfQorICAgICAgICBmcmFtZS0+d2lkdGggPSBwb29sLT53aWR0aDsKKyAgICAgICAgZnJhbWUtPmhlaWdodCA9IHBvb2wtPmhlaWdodDsKKyAgICAgICAgZnJhbWUtPmZvcm1hdCA9IHBvb2wtPmZvcm1hdDsKIAotICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwKLSAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSB7Ci0gICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQgPQotICAgICAgICAgICAgcG9vbC0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfUEFMOCA/IEFWX1BJWF9GTVRfQkdSOCA6IHBvb2wtPmZvcm1hdDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgZnJhbWUtPmxpbmVzaXplW2ldID0gcG9vbC0+bGluZXNpemVbaV07CisgICAgICAgICAgICBpZiAoIXBvb2wtPnBvb2xzW2ldKQorICAgICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGF2X2Fzc2VydDAoZnJhbWUtPmRhdGFbMV0gIT0gTlVMTCk7Ci0gICAgICAgIGlmIChhdnByaXZfc2V0X3N5c3RlbWF0aWNfcGFsMigodWludDMyX3QgKilmcmFtZS0+ZGF0YVsxXSwgZm9ybWF0KSA8IDApIHsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGZyYW1lLT5idWZbaV0gPSBhdl9idWZmZXJfcG9vbF9nZXQocG9vbC0+cG9vbHNbaV0pOworICAgICAgICAgICAgaWYgKCFmcmFtZS0+YnVmW2ldKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICAgICAgZnJhbWUtPmRhdGFbaV0gPSBmcmFtZS0+YnVmW2ldLT5kYXRhOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgZnJhbWUtPmV4dGVuZGVkX2RhdGEgPSBmcmFtZS0+ZGF0YTsKKyAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCB8fAorICAgICAgICAgICAgZGVzYy0+ZmxhZ3MgJiBGRl9QU0VVRE9QQUwpIHsKKyAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQgPQorICAgICAgICAgICAgICAgIHBvb2wtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1BBTDggPyBBVl9QSVhfRk1UX0JHUjggOiBwb29sLT5mb3JtYXQ7CisKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoZnJhbWUtPmRhdGFbMV0gIT0gTlVMTCk7CisgICAgICAgICAgICBpZiAoYXZwcml2X3NldF9zeXN0ZW1hdGljX3BhbDIoKHVpbnQzMl90ICopZnJhbWUtPmRhdGFbMV0sIGZvcm1hdCkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhID0gZnJhbWUtPmRhdGE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgorICAgICAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IHBvb2wtPm5iX3NhbXBsZXM7CisgICAgICAgIGZyYW1lLT5jaGFubmVscyA9IHBvb2wtPmNoYW5uZWxzOworICAgICAgICBmcmFtZS0+Zm9ybWF0ID0gcG9vbC0+Zm9ybWF0OworICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0gPSBwb29sLT5saW5lc2l6ZVswXTsKKworICAgICAgICBpZiAocG9vbC0+cGxhbmVzID4gQVZfTlVNX0RBVEFfUE9JTlRFUlMpIHsKKyAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhID0gYXZfbWFsbG9jel9hcnJheShwb29sLT5wbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmcmFtZS0+ZXh0ZW5kZWRfZGF0YSkpOworICAgICAgICAgICAgZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZiA9IHBvb2wtPnBsYW5lcyAtIEFWX05VTV9EQVRBX1BPSU5URVJTOworICAgICAgICAgICAgZnJhbWUtPmV4dGVuZGVkX2J1ZiA9IGF2X21hbGxvY3pfYXJyYXkoZnJhbWUtPm5iX2V4dGVuZGVkX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqZnJhbWUtPmV4dGVuZGVkX2J1ZikpOworICAgICAgICAgICAgaWYgKCFmcmFtZS0+ZXh0ZW5kZWRfZGF0YSB8fCAhZnJhbWUtPmV4dGVuZGVkX2J1ZikKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZS0+ZXh0ZW5kZWRfZGF0YSA9IGZyYW1lLT5kYXRhOworICAgICAgICAgICAgYXZfYXNzZXJ0MChmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmID09IDApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGTUlOKHBvb2wtPnBsYW5lcywgQVZfTlVNX0RBVEFfUE9JTlRFUlMpOyBpKyspIHsKKyAgICAgICAgICAgIGZyYW1lLT5idWZbaV0gPSBhdl9idWZmZXJfcG9vbF9nZXQocG9vbC0+cG9vbHNbMF0pOworICAgICAgICAgICAgaWYgKCFmcmFtZS0+YnVmW2ldKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW2ldID0gZnJhbWUtPmRhdGFbaV0gPSBmcmFtZS0+YnVmW2ldLT5kYXRhOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZS0+bmJfZXh0ZW5kZWRfYnVmOyBpKyspIHsKKyAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9idWZbaV0gPSBhdl9idWZmZXJfcG9vbF9nZXQocG9vbC0+cG9vbHNbMF0pOworICAgICAgICAgICAgaWYgKCFmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGZyYW1lLT5leHRlbmRlZF9kYXRhW2kgKyBBVl9OVU1fREFUQV9QT0lOVEVSU10gPSBmcmFtZS0+ZXh0ZW5kZWRfYnVmW2ldLT5kYXRhOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9CiAKICAgICByZXR1cm4gZnJhbWU7CiBmYWlsOgpAQCAtMTc0LDcgKzI4MSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgZmZfdmlkZW9fZnJhbWVfcG9vbF91bmluaXQoRkZWaWRlb0ZyYW1lUG9vbCAqKnBvb2wpCit2b2lkIGZmX2ZyYW1lX3Bvb2xfdW5pbml0KEZGRnJhbWVQb29sICoqcG9vbCkKIHsKICAgICBpbnQgaTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZnJhbWVwb29sLmggYi9saWJhdmZpbHRlci9mcmFtZXBvb2wuaAppbmRleCAyYTZjOWU4Li5lNTU2MGU0IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9mcmFtZXBvb2wuaAorKysgYi9saWJhdmZpbHRlci9mcmFtZXBvb2wuaApAQCAtMjUsMTEgKzI1LDExIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ZyYW1lLmgiCiAKIC8qKgotICogVmlkZW8gZnJhbWUgcG9vbC4gVGhpcyBzdHJ1Y3R1cmUgaXMgb3BhcXVlIGFuZCBub3QgbWVhbnQgdG8gYmUgYWNjZXNzZWQKLSAqIGRpcmVjdGx5LiBJdCBpcyBhbGxvY2F0ZWQgd2l0aCBmZl92aWRlb19mcmFtZV9wb29sX2luaXQoKSBhbmQgZnJlZWQgd2l0aAotICogZmZfdmlkZW9fZnJhbWVfcG9vbF91bmluaXQoKS4KKyAqIEZyYW1lIHBvb2wuIFRoaXMgc3RydWN0dXJlIGlzIG9wYXF1ZSBhbmQgbm90IG1lYW50IHRvIGJlIGFjY2Vzc2VkCisgKiBkaXJlY3RseS4gSXQgaXMgYWxsb2NhdGVkIHdpdGggZmZfZnJhbWVfcG9vbF9pbml0KCkgYW5kIGZyZWVkIHdpdGgKKyAqIGZmX2ZyYW1lX3Bvb2xfdW5pbml0KCkuCiAgKi8KLXR5cGVkZWYgc3RydWN0IEZGVmlkZW9GcmFtZVBvb2wgRkZWaWRlb0ZyYW1lUG9vbDsKK3R5cGVkZWYgc3RydWN0IEZGRnJhbWVQb29sIEZGRnJhbWVQb29sOwogCiAvKioKICAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgdmlkZW8gZnJhbWUgcG9vbC4KQEAgLTQzLDE5ICs0MywzNyBAQAogICogQHBhcmFtIGFsaWduIGJ1ZmZlcnMgYWxpZ25lbWVudCBvZiBlYWNoIGZyYW1lIGluIHRoaXMgcG9vbAogICogQHJldHVybiBuZXdseSBjcmVhdGVkIHZpZGVvIGZyYW1lIHBvb2wgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvci4KICAqLwotRkZWaWRlb0ZyYW1lUG9vbCAqZmZfdmlkZW9fZnJhbWVfcG9vbF9pbml0KEFWQnVmZmVyUmVmKiAoKmFsbG9jKShpbnQgc2l6ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24pOworRkZGcmFtZVBvb2wgKmZmX2ZyYW1lX3Bvb2xfdmlkZW9faW5pdChBVkJ1ZmZlclJlZiogKCphbGxvYykoaW50IHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGlnbik7CiAKIC8qKgotICogRGVhbGxvY2F0ZSB0aGUgdmlkZW8gZnJhbWUgcG9vbC4gSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2hpbGUKLSAqIHNvbWUgb2YgdGhlIGFsbG9jYXRlZCB2aWRlbyBmcmFtZSBhcmUgc3RpbGwgaW4gdXNlLgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gYXVkaW8gZnJhbWUgcG9vbC4KICAqCi0gKiBAcGFyYW0gcG9vbCBwb2ludGVyIHRvIHRoZSB2aWRlbyBmcmFtZSBwb29sIHRvIGJlIGZyZWVkLiBJdCB3aWxsIGJlIHNldCB0byBOVUxMLgorICogQHBhcmFtIGFsbG9jIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWxsb2NhdGUgbmV3IGZyYW1lIGJ1ZmZlcnMgd2hlbgorICogdGhlIHBvb2wgaXMgZW1wdHkuIE1heSBiZSBOVUxMLCB0aGVuIHRoZSBkZWZhdWx0IGFsbG9jYXRvciB3aWxsIGJlIHVzZWQKKyAqIChhdl9idWZmZXJfYWxsb2MoKSkuCisgKiBAcGFyYW0gY2hhbm5lbHMgY2hhbm5lbHMgb2YgZWFjaCBmcmFtZSBpbiB0aGlzIHBvb2wKKyAqIEBwYXJhbSBuYl9zYW1wbGVzIG51bWJlciBvZiBzYW1wbGVzIG9mIGVhY2ggZnJhbWUgaW4gdGhpcyBwb29sCisgKiBAcGFyYW0gZm9ybWF0IGZvcm1hdCBvZiBlYWNoIGZyYW1lIGluIHRoaXMgcG9vbAorICogQHBhcmFtIGFsaWduIGJ1ZmZlcnMgYWxpZ25lbWVudCBvZiBlYWNoIGZyYW1lIGluIHRoaXMgcG9vbAorICogQHJldHVybiBuZXdseSBjcmVhdGVkIGF1ZGlvIGZyYW1lIHBvb2wgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvci4KICAqLwotdm9pZCBmZl92aWRlb19mcmFtZV9wb29sX3VuaW5pdChGRlZpZGVvRnJhbWVQb29sICoqcG9vbCk7CitGRkZyYW1lUG9vbCAqZmZfZnJhbWVfcG9vbF9hdWRpb19pbml0KEFWQnVmZmVyUmVmKiAoKmFsbG9jKShpbnQgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24pOworCisvKioKKyAqIERlYWxsb2NhdGUgdGhlIGZyYW1lIHBvb2wuIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIHdoaWxlCisgKiBzb21lIG9mIHRoZSBhbGxvY2F0ZWQgZnJhbWUgYXJlIHN0aWxsIGluIHVzZS4KKyAqCisgKiBAcGFyYW0gcG9vbCBwb2ludGVyIHRvIHRoZSBmcmFtZSBwb29sIHRvIGJlIGZyZWVkLiBJdCB3aWxsIGJlIHNldCB0byBOVUxMLgorICovCit2b2lkIGZmX2ZyYW1lX3Bvb2xfdW5pbml0KEZGRnJhbWVQb29sICoqcG9vbCk7CiAKIC8qKgogICogR2V0IHRoZSB2aWRlbyBmcmFtZSBwb29sIGNvbmZpZ3VyYXRpb24uCkBAIC02NiwxOSArODQsMzUgQEAKICAqIEBwYXJhbSBhbGlnbiBidWZmZXJzIGFsaWduZW1lbnQgb2YgZWFjaCBmcmFtZSBpbiB0aGlzIHBvb2wKICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb3RoZXJ3aXNlLgogICovCi1pbnQgZmZfdmlkZW9fZnJhbWVfcG9vbF9nZXRfY29uZmlnKEZGVmlkZW9GcmFtZVBvb2wgKnBvb2wsCitpbnQgZmZfZnJhbWVfcG9vbF9nZXRfdmlkZW9fY29uZmlnKEZGRnJhbWVQb29sICpwb29sLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0ICpmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYWxpZ24pOwogCiAvKioKKyAqIEdldCB0aGUgYXVkaW8gZnJhbWUgcG9vbCBjb25maWd1cmF0aW9uLgorICoKKyAqIEBwYXJhbSBjaGFubmVscyBjaGFubmVscyBvZiBlYWNoIGZyYW1lIGluIHRoaXMgcG9vbAorICogQHBhcmFtIG5iX3NhbXBsZXMgbnVtYmVyIG9mIHNhbXBsZXMgb2YgZWFjaCBmcmFtZSBpbiB0aGlzIHBvb2wKKyAqIEBwYXJhbSBmb3JtYXQgZm9ybWF0IG9mIGVhY2ggZnJhbWUgaW4gdGhpcyBwb29sCisgKiBAcGFyYW0gYWxpZ24gYnVmZmVycyBhbGlnbmVtZW50IG9mIGVhY2ggZnJhbWUgaW4gdGhpcyBwb29sCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIG90aGVyd2lzZS4KKyAqLworaW50IGZmX2ZyYW1lX3Bvb2xfZ2V0X2F1ZGlvX2NvbmZpZyhGRkZyYW1lUG9vbCAqcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpuYl9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0ICpmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYWxpZ24pOworCisKKy8qKgogICogQWxsb2NhdGUgYSBuZXcgQVZGcmFtZSwgcmV1c3Npbmcgb2xkIGJ1ZmZlcnMgZnJvbSB0aGUgcG9vbCB3aGVuIGF2YWlsYWJsZS4KICAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBzaW11bHRhbmVvdXNseSBmcm9tIG11bHRpcGxlIHRocmVhZHMuCiAgKgogICogQHJldHVybiBhIG5ldyBBVkZyYW1lIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZXJyb3IuCiAgKi8KLUFWRnJhbWUgKmZmX3ZpZGVvX2ZyYW1lX3Bvb2xfZ2V0KEZGVmlkZW9GcmFtZVBvb2wgKnBvb2wpOworQVZGcmFtZSAqZmZfZnJhbWVfcG9vbF9nZXQoRkZGcmFtZVBvb2wgKnBvb2wpOwogCiAKICNlbmRpZiAvKiBBVkZJTFRFUl9GUkFNRVBPT0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZnJhbWVxdWV1ZS5jIGIvbGliYXZmaWx0ZXIvZnJhbWVxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDExMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9mcmFtZXF1ZXVlLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBHZW5lcmljIGZyYW1lIHF1ZXVlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImZyYW1lcXVldWUuaCIKKworc3RhdGljIGlubGluZSBGRkZyYW1lQnVja2V0ICpidWNrZXQoRkZGcmFtZVF1ZXVlICpmcSwgc2l6ZV90IGlkeCkKK3sKKyAgICByZXR1cm4gJmZxLT5xdWV1ZVsoZnEtPnRhaWwgKyBpZHgpICYgKGZxLT5hbGxvY2F0ZWQgLSAxKV07Cit9CisKK3ZvaWQgZmZfZnJhbWVxdWV1ZV9nbG9iYWxfaW5pdChGRkZyYW1lUXVldWVHbG9iYWwgKmZxZykKK3sKK30KKworc3RhdGljIHZvaWQgY2hlY2tfY29uc2lzdGVuY3koRkZGcmFtZVF1ZXVlICpmcSkKK3sKKyNpZiBkZWZpbmVkKEFTU0VSVF9MRVZFTCkgJiYgQVNTRVJUX0xFVkVMID49IDIKKyAgICB1aW50NjRfdCBuYl9zYW1wbGVzID0gMDsKKyAgICBzaXplX3QgaTsKKworICAgIGF2X2Fzc2VydDAoZnEtPnF1ZXVlZCA9PSBmcS0+dG90YWxfZnJhbWVzX2hlYWQgLSBmcS0+dG90YWxfZnJhbWVzX3RhaWwpOworICAgIGZvciAoaSA9IDA7IGkgPCBmcS0+cXVldWVkOyBpKyspCisgICAgICAgIG5iX3NhbXBsZXMgKz0gYnVja2V0KGZxLCBpKS0+ZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgYXZfYXNzZXJ0MChuYl9zYW1wbGVzID09IGZxLT50b3RhbF9zYW1wbGVzX2hlYWQgLSBmcS0+dG90YWxfc2FtcGxlc190YWlsKTsKKyNlbmRpZgorfQorCit2b2lkIGZmX2ZyYW1lcXVldWVfaW5pdChGRkZyYW1lUXVldWUgKmZxLCBGRkZyYW1lUXVldWVHbG9iYWwgKmZxZykKK3sKKyAgICBmcS0+cXVldWUgPSAmZnEtPmZpcnN0X2J1Y2tldDsKKyAgICBmcS0+YWxsb2NhdGVkID0gMTsKK30KKwordm9pZCBmZl9mcmFtZXF1ZXVlX2ZyZWUoRkZGcmFtZVF1ZXVlICpmcSkKK3sKKyAgICB3aGlsZSAoZnEtPnF1ZXVlZCkgeworICAgICAgICBBVkZyYW1lICpmcmFtZSA9IGZmX2ZyYW1lcXVldWVfdGFrZShmcSk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICB9CisgICAgaWYgKGZxLT5xdWV1ZSAhPSAmZnEtPmZpcnN0X2J1Y2tldCkKKyAgICAgICAgYXZfZnJlZXAoJmZxLT5xdWV1ZSk7Cit9CisKK2ludCBmZl9mcmFtZXF1ZXVlX2FkZChGRkZyYW1lUXVldWUgKmZxLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBGRkZyYW1lQnVja2V0ICpiOworCisgICAgY2hlY2tfY29uc2lzdGVuY3koZnEpOworICAgIGlmIChmcS0+cXVldWVkID09IGZxLT5hbGxvY2F0ZWQpIHsKKyAgICAgICAgaWYgKGZxLT5hbGxvY2F0ZWQgPT0gMSkgeworICAgICAgICAgICAgc2l6ZV90IG5hID0gODsKKyAgICAgICAgICAgIEZGRnJhbWVCdWNrZXQgKm5xID0gYXZfcmVhbGxvY19hcnJheShOVUxMLCBuYSwgc2l6ZW9mKCpucSkpOworICAgICAgICAgICAgaWYgKCFucSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbnFbMF0gPSBmcS0+cXVldWVbMF07CisgICAgICAgICAgICBmcS0+cXVldWUgPSBucTsKKyAgICAgICAgICAgIGZxLT5hbGxvY2F0ZWQgPSBuYTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBuYSA9IGZxLT5hbGxvY2F0ZWQgPDwgMTsKKyAgICAgICAgICAgIEZGRnJhbWVCdWNrZXQgKm5xID0gYXZfcmVhbGxvY19hcnJheShmcS0+cXVldWUsIG5hLCBzaXplb2YoKm5xKSk7CisgICAgICAgICAgICBpZiAoIW5xKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBpZiAoZnEtPnRhaWwgKyBmcS0+cXVldWVkID4gZnEtPmFsbG9jYXRlZCkKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKG5xICsgZnEtPmFsbG9jYXRlZCwgbnEsCisgICAgICAgICAgICAgICAgICAgICAgICAoZnEtPnRhaWwgKyBmcS0+cXVldWVkIC0gZnEtPmFsbG9jYXRlZCkgKiBzaXplb2YoKm5xKSk7CisgICAgICAgICAgICBmcS0+cXVldWUgPSBucTsKKyAgICAgICAgICAgIGZxLT5hbGxvY2F0ZWQgPSBuYTsKKyAgICAgICAgfQorICAgIH0KKyAgICBiID0gYnVja2V0KGZxLCBmcS0+cXVldWVkKTsKKyAgICBiLT5mcmFtZSA9IGZyYW1lOworICAgIGZxLT5xdWV1ZWQrKzsKKyAgICBmcS0+dG90YWxfZnJhbWVzX2hlYWQrKzsKKyAgICBmcS0+dG90YWxfc2FtcGxlc19oZWFkICs9IGZyYW1lLT5uYl9zYW1wbGVzOworICAgIGNoZWNrX2NvbnNpc3RlbmN5KGZxKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZGcmFtZSAqZmZfZnJhbWVxdWV1ZV90YWtlKEZGRnJhbWVRdWV1ZSAqZnEpCit7CisgICAgRkZGcmFtZUJ1Y2tldCAqYjsKKworICAgIGNoZWNrX2NvbnNpc3RlbmN5KGZxKTsKKyAgICBhdl9hc3NlcnQxKGZxLT5xdWV1ZWQpOworICAgIGIgPSBidWNrZXQoZnEsIDApOworICAgIGZxLT5xdWV1ZWQtLTsKKyAgICBmcS0+dGFpbCsrOworICAgIGZxLT50YWlsICY9IGZxLT5hbGxvY2F0ZWQgLSAxOworICAgIGZxLT50b3RhbF9mcmFtZXNfdGFpbCsrOworICAgIGZxLT50b3RhbF9zYW1wbGVzX3RhaWwgKz0gYi0+ZnJhbWUtPm5iX3NhbXBsZXM7CisgICAgZnEtPnNhbXBsZXNfc2tpcHBlZCA9IDA7CisgICAgY2hlY2tfY29uc2lzdGVuY3koZnEpOworICAgIHJldHVybiBiLT5mcmFtZTsKK30KKworQVZGcmFtZSAqZmZfZnJhbWVxdWV1ZV9wZWVrKEZGRnJhbWVRdWV1ZSAqZnEsIHNpemVfdCBpZHgpCit7CisgICAgRkZGcmFtZUJ1Y2tldCAqYjsKKworICAgIGNoZWNrX2NvbnNpc3RlbmN5KGZxKTsKKyAgICBhdl9hc3NlcnQxKGlkeCA8IGZxLT5xdWV1ZWQpOworICAgIGIgPSBidWNrZXQoZnEsIGlkeCk7CisgICAgY2hlY2tfY29uc2lzdGVuY3koZnEpOworICAgIHJldHVybiBiLT5mcmFtZTsKK30KKwordm9pZCBmZl9mcmFtZXF1ZXVlX3NraXBfc2FtcGxlcyhGRkZyYW1lUXVldWUgKmZxLCBzaXplX3Qgc2FtcGxlcywgQVZSYXRpb25hbCB0aW1lX2Jhc2UpCit7CisgICAgRkZGcmFtZUJ1Y2tldCAqYjsKKyAgICBzaXplX3QgYnl0ZXM7CisgICAgaW50IHBsYW5hciwgcGxhbmVzLCBpOworCisgICAgY2hlY2tfY29uc2lzdGVuY3koZnEpOworICAgIGF2X2Fzc2VydDEoZnEtPnF1ZXVlZCk7CisgICAgYiA9IGJ1Y2tldChmcSwgMCk7CisgICAgYXZfYXNzZXJ0MShzYW1wbGVzIDwgYi0+ZnJhbWUtPm5iX3NhbXBsZXMpOworICAgIHBsYW5hciA9IGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGItPmZyYW1lLT5mb3JtYXQpOworICAgIHBsYW5lcyA9IHBsYW5hciA/IGItPmZyYW1lLT5jaGFubmVscyA6IDE7CisgICAgYnl0ZXMgPSBzYW1wbGVzICogYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUoYi0+ZnJhbWUtPmZvcm1hdCk7CisgICAgaWYgKCFwbGFuYXIpCisgICAgICAgIGJ5dGVzICo9IGItPmZyYW1lLT5jaGFubmVsczsKKyAgICBpZiAoYi0+ZnJhbWUtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgYi0+ZnJhbWUtPnB0cyArPSBhdl9yZXNjYWxlX3Eoc2FtcGxlcywgYXZfbWFrZV9xKDEsIGItPmZyYW1lLT5zYW1wbGVfcmF0ZSksIHRpbWVfYmFzZSk7CisgICAgYi0+ZnJhbWUtPm5iX3NhbXBsZXMgLT0gc2FtcGxlczsKKyAgICBiLT5mcmFtZS0+bGluZXNpemVbMF0gLT0gYnl0ZXM7CisgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lczsgaSsrKQorICAgICAgICBiLT5mcmFtZS0+ZXh0ZW5kZWRfZGF0YVtpXSArPSBieXRlczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzICYmIGkgPCBBVl9OVU1fREFUQV9QT0lOVEVSUzsgaSsrKQorICAgICAgICBiLT5mcmFtZS0+ZGF0YVtpXSA9IGItPmZyYW1lLT5leHRlbmRlZF9kYXRhW2ldOworICAgIGZxLT50b3RhbF9zYW1wbGVzX3RhaWwgKz0gc2FtcGxlczsKKyAgICBmcS0+c2FtcGxlc19za2lwcGVkID0gMTsKKyAgICBmZl9mcmFtZXF1ZXVlX3VwZGF0ZV9wZWVrZWQoZnEsIDApOworfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZnJhbWVxdWV1ZS5oIGIvbGliYXZmaWx0ZXIvZnJhbWVxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0OWQ4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9mcmFtZXF1ZXVlLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBHZW5lcmljIGZyYW1lIHF1ZXVlCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9GUkFNRVFVRVVFX0gKKyNkZWZpbmUgQVZGSUxURVJfRlJBTUVRVUVVRV9ICisKKy8qKgorICogRkZGcmFtZVF1ZXVlOiBzaW1wbGUgQVZGcmFtZSBxdWV1ZSBBUEkKKyAqCisgKiBOb3RlOiB0aGlzIEFQSSBpcyBub3QgdGhyZWFkLXNhZmUuIENvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBzYW1lIHF1ZXVlCisgKiBtdXN0IGJlIHByb3RlY3RlZCBieSBhIG11dGV4IG9yIGFueSBzeW5jaHJvbml6YXRpb24gbWVjaGFuaXNtLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZnJhbWUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRkZGcmFtZUJ1Y2tldCB7CisgICAgQVZGcmFtZSAqZnJhbWU7Cit9IEZGRnJhbWVCdWNrZXQ7CisKKy8qKgorICogU3RydWN0dXJlIHRvIGhvbGQgZ2xvYmFsIG9wdGlvbnMgYW5kIHN0YXRpc3RpY3MgZm9yIGZyYW1lIHF1ZXVlcy4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyBpbnRlbmRlZCB0byBhbGxvdyBpbXBsZW1lbnRpbmcgZ2xvYmFsIGNvbnRyb2wgb2YgdGhlCisgKiBmcmFtZSBxdWV1ZXMsIGluY2x1ZGluZyBtZW1vcnkgY29uc3VtcHRpb24gY2Fwcy4KKyAqCisgKiBJdCBpcyBjdXJyZW50bHkgZW1wdHkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEZGRnJhbWVRdWV1ZUdsb2JhbCB7CisgICAgY2hhciBkdW1teTsgLyogQyBkb2VzIG5vdCBhbGxvdyBlbXB0eSBzdHJ1Y3RzICovCit9IEZGRnJhbWVRdWV1ZUdsb2JhbDsKKworLyoqCisgKiBRdWV1ZSBvZiBBVkZyYW1lIHBvaW50ZXJzLgorICovCit0eXBlZGVmIHN0cnVjdCBGRkZyYW1lUXVldWUgeworCisgICAgLyoqCisgICAgICogQXJyYXkgb2YgYWxsb2NhdGVkIGJ1Y2tldHMsIHVzZWQgYXMgYSBjaXJjdWxhciBidWZmZXIuCisgICAgICovCisgICAgRkZGcmFtZUJ1Y2tldCAqcXVldWU7CisKKyAgICAvKioKKyAgICAgKiBTaXplIG9mIHRoZSBhcnJheSBvZiBidWNrZXRzLgorICAgICAqLworICAgIHNpemVfdCBhbGxvY2F0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBUYWlsIG9mIHRoZSBxdWV1ZS4KKyAgICAgKiBJdCBpcyB0aGUgaW5kZXggaW4gdGhlIGFycmF5IG9mIHRoZSBuZXh0IGZyYW1lIHRvIHRha2UuCisgICAgICovCisgICAgc2l6ZV90IHRhaWw7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgY3VycmVudGx5IHF1ZXVlZCBmcmFtZXMuCisgICAgICovCisgICAgc2l6ZV90IHF1ZXVlZDsKKworICAgIC8qKgorICAgICAqIFByZS1hbGxvY2F0ZWQgYnVja2V0IGZvciBxdWV1ZXMgb2Ygc2l6ZSAxLgorICAgICAqLworICAgIEZGRnJhbWVCdWNrZXQgZmlyc3RfYnVja2V0OworCisgICAgLyoqCisgICAgICogVG90YWwgbnVtYmVyIG9mIGZyYW1lcyBlbnRlcmVkIGluIHRoZSBxdWV1ZS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCB0b3RhbF9mcmFtZXNfaGVhZDsKKworICAgIC8qKgorICAgICAqIFRvdGFsIG51bWJlciBvZiBmcmFtZXMgZGVxdWV1ZWQgZnJvbSB0aGUgcXVldWUuCisgICAgICogcXVldWVkID0gdG90YWxfZnJhbWVzX2hlYWQgLSB0b3RhbF9mcmFtZXNfdGFpbAorICAgICAqLworICAgIHVpbnQ2NF90IHRvdGFsX2ZyYW1lc190YWlsOworCisgICAgLyoqCisgICAgICogVG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgZW50ZXJlZCBpbiB0aGUgcXVldWUuCisgICAgICovCisgICAgdWludDY0X3QgdG90YWxfc2FtcGxlc19oZWFkOworCisgICAgLyoqCisgICAgICogVG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgZGVxdWV1ZWQgZnJvbSB0aGUgcXVldWUuCisgICAgICogcXVldWVkX3NhbXBsZXMgPSB0b3RhbF9zYW1wbGVzX2hlYWQgLSB0b3RhbF9zYW1wbGVzX3RhaWwKKyAgICAgKi8KKyAgICB1aW50NjRfdCB0b3RhbF9zYW1wbGVzX3RhaWw7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB0aGF0IHNhbXBsZXMgYXJlIHNraXBwZWQKKyAgICAgKi8KKyAgICBpbnQgc2FtcGxlc19za2lwcGVkOworCit9IEZGRnJhbWVRdWV1ZTsKKworLyoqCisgKiBJbml0IGEgZ2xvYmFsIHN0cnVjdHVyZS4KKyAqLwordm9pZCBmZl9mcmFtZXF1ZXVlX2dsb2JhbF9pbml0KEZGRnJhbWVRdWV1ZUdsb2JhbCAqZnFnKTsKKworLyoqCisgKiBJbml0IGEgZnJhbWUgcXVldWUgYW5kIGF0dGFjaCBpdCB0byBhIGdsb2JhbCBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgZmZfZnJhbWVxdWV1ZV9pbml0KEZGRnJhbWVRdWV1ZSAqZnEsIEZGRnJhbWVRdWV1ZUdsb2JhbCAqZnFnKTsKKworLyoqCisgKiBGcmVlIHRoZSBxdWV1ZSBhbmQgYWxsIHF1ZXVlZCBmcmFtZXMuCisgKi8KK3ZvaWQgZmZfZnJhbWVxdWV1ZV9mcmVlKEZGRnJhbWVRdWV1ZSAqZnEpOworCisvKioKKyAqIEFkZCBhIGZyYW1lLgorICogQHJldHVybiAgPj0wIG9yIGFuIEFWRVJST1IgY29kZS4KKyAqLworaW50IGZmX2ZyYW1lcXVldWVfYWRkKEZGRnJhbWVRdWV1ZSAqZnEsIEFWRnJhbWUgKmZyYW1lKTsKKworLyoqCisgKiBUYWtlIHRoZSBmaXJzdCBmcmFtZSBpbiB0aGUgcXVldWUuCisgKiBNdXN0IG5vdCBiZSB1c2VkIHdpdGggZW1wdHkgcXVldWVzLgorICovCitBVkZyYW1lICpmZl9mcmFtZXF1ZXVlX3Rha2UoRkZGcmFtZVF1ZXVlICpmcSk7CisKKy8qKgorICogQWNjZXNzIGEgZnJhbWUgaW4gdGhlIHF1ZXVlLCB3aXRob3V0IHJlbW92aW5nIGl0LgorICogVGhlIGZpcnN0IGZyYW1lIGlzIG51bWJlcmVkIDA7IHRoZSBkZXNpZ25hdGVkIGZyYW1lIG11c3QgZXhpc3QuCisgKi8KK0FWRnJhbWUgKmZmX2ZyYW1lcXVldWVfcGVlayhGRkZyYW1lUXVldWUgKmZxLCBzaXplX3QgaWR4KTsKKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBxdWV1ZWQgZnJhbWVzLgorICovCitzdGF0aWMgaW5saW5lIHNpemVfdCBmZl9mcmFtZXF1ZXVlX3F1ZXVlZF9mcmFtZXMoY29uc3QgRkZGcmFtZVF1ZXVlICpmcSkKK3sKKyAgICByZXR1cm4gZnEtPnF1ZXVlZDsKK30KKworLyoqCisgKiBHZXQgdGhlIG51bWJlciBvZiBxdWV1ZWQgc2FtcGxlcy4KKyAqLworc3RhdGljIGlubGluZSB1aW50NjRfdCBmZl9mcmFtZXF1ZXVlX3F1ZXVlZF9zYW1wbGVzKGNvbnN0IEZGRnJhbWVRdWV1ZSAqZnEpCit7CisgICAgcmV0dXJuIGZxLT50b3RhbF9zYW1wbGVzX2hlYWQgLSBmcS0+dG90YWxfc2FtcGxlc190YWlsOworfQorCisvKioKKyAqIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyBhZnRlciBhIGZyYW1lIGFjY2Vzc2VkIHVzaW5nIGZmX2ZyYW1lcXVldWVfcGVlaygpCisgKiB3YXMgbW9kaWZpZWQuCisgKiBDdXJyZW50bHkgdXNlZCBvbmx5IGFzIGEgbWFya2VyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZmZfZnJhbWVxdWV1ZV91cGRhdGVfcGVla2VkKEZGRnJhbWVRdWV1ZSAqZnEsIHNpemVfdCBpZHgpCit7Cit9CisKKy8qKgorICogU2tpcCBzYW1wbGVzIGZyb20gdGhlIGZpcnN0IGZyYW1lIGluIHRoZSBxdWV1ZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB3aGVuIHRoZSBmaXJzdCBmcmFtZSB3YXMgYWNjZXNzZWQgdXNpbmcKKyAqIGZmX2ZyYW1lcXVldWVfcGVlaygpIGFuZCBzYW1wbGVzIHdlcmUgY29uc3VtZWQgZnJvbSBpdC4KKyAqIEl0IGFkYXB0cyB0aGUgZGF0YSBwb2ludGVycyBhbmQgdGltZXN0YW1wcyBvZiB0aGUgaGVhZCBmcmFtZSB0byBhY2NvdW50CisgKiBmb3IgdGhlIHNraXBwZWQgc2FtcGxlcy4KKyAqLwordm9pZCBmZl9mcmFtZXF1ZXVlX3NraXBfc2FtcGxlcyhGRkZyYW1lUXVldWUgKmZxLCBzaXplX3Qgc2FtcGxlcywgQVZSYXRpb25hbCB0aW1lX2Jhc2UpOworCisjZW5kaWYgLyogQVZGSUxURVJfRlJBTUVRVUVVRV9IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9mcmFtZXJhdGUuaCBiL2xpYmF2ZmlsdGVyL2ZyYW1lcmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmQ1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9mcmFtZXJhdGUuaApAQCAtMCwwICsxLDc0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfRlJBTUVSQVRFX0gKKyNkZWZpbmUgQVZGSUxURVJfRlJBTUVSQVRFX0gKKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhlbHV0aWxzLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKworI2RlZmluZSBCTEVORF9GVU5DX1BBUkFNUyBjb25zdCB1aW50OF90ICpzcmMxLCBwdHJkaWZmX3Qgc3JjMV9saW5lc2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMyLCBwdHJkaWZmX3Qgc3JjMl9saW5lc2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLCBwdHJkaWZmX3QgaGVpZ2h0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWN0b3IxLCBpbnQgZmFjdG9yMiwgaW50IGhhbGYKKworI2RlZmluZSBCTEVORF9GQUNUT1JfREVQVEg4ICAgNworI2RlZmluZSBCTEVORF9GQUNUT1JfREVQVEgxNiAxNQorCit0eXBlZGVmIHZvaWQgKCpibGVuZF9mdW5jKShCTEVORF9GVU5DX1BBUkFNUyk7CisKK3R5cGVkZWYgc3RydWN0IEZyYW1lUmF0ZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIC8vIHBhcmFtZXRlcnMKKyAgICBBVlJhdGlvbmFsIGRlc3RfZnJhbWVfcmF0ZTsgICAgICAgICAvLy88IG91dHB1dCBmcmFtZXMgcGVyIHNlY29uZAorICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZmxhZ3MgYWZmZWN0aW5nIGZyYW1lIHJhdGUgY29udmVyc2lvbiBhbGdvcml0aG0KKyAgICBkb3VibGUgc2NlbmVfc2NvcmU7ICAgICAgICAgICAgICAgICAvLy88IHNjb3JlIHRoYXQgZGVub3RlcyBhIHNjZW5lIGNoYW5nZSBoYXMgaGFwcGVuZWQKKyAgICBpbnQgaW50ZXJwX3N0YXJ0OyAgICAgICAgICAgICAgICAgICAvLy88IHN0YXJ0IG9mIHJhbmdlIHRvIGFwcGx5IGxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgaW50IGludGVycF9lbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBlbmQgb2YgcmFuZ2UgdG8gYXBwbHkgbGluZWFyIGludGVycG9sYXRpb24KKworICAgIGludCBsaW5lX3NpemVbNF07ICAgICAgICAgICAgICAgICAgIC8vLzwgYnl0ZXMgb2YgcGl4ZWwgZGF0YSBwZXIgbGluZSBmb3IgZWFjaCBwbGFuZQorICAgIGludCB2c3ViOworCisgICAgQVZSYXRpb25hbCBzcmNlX3RpbWVfYmFzZTsgICAgICAgICAgLy8vPCB0aW1lYmFzZSBvZiBzb3VyY2UKKyAgICBBVlJhdGlvbmFsIGRlc3RfdGltZV9iYXNlOyAgICAgICAgICAvLy88IHRpbWViYXNlIG9mIGRlc3RpbmF0aW9uCisKKyAgICBhdl9waXhlbHV0aWxzX3NhZF9mbiBzYWQ7ICAgICAgICAgICAvLy88IFN1bSBvZiB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBmdW5jdGlvbiAoc2NlbmUgZGV0ZWN0IG9ubHkpCisgICAgZG91YmxlIHByZXZfbWFmZDsgICAgICAgICAgICAgICAgICAgLy8vPCBwcmV2aW91cyBNQUZEICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjZW5lIGRldGVjdCBvbmx5KQorCisgICAgaW50IGJsZW5kX2ZhY3Rvcl9tYXg7CisgICAgaW50IGJpdGRlcHRoOworICAgIEFWRnJhbWUgKndvcms7CisKKyAgICBBVkZyYW1lICpmMDsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGxhc3QgZnJhbWUKKyAgICBBVkZyYW1lICpmMTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGN1cnJlbnQgZnJhbWUKKyAgICBpbnQ2NF90IHB0czA7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IGxhc3QgZnJhbWUgcHRzIGluIGRlc3RfdGltZV9iYXNlCisgICAgaW50NjRfdCBwdHMxOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGZyYW1lIHB0cyBpbiBkZXN0X3RpbWVfYmFzZQorICAgIGludDY0X3QgZGVsdGE7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHRzMSB0byBwdHMwIGRlbHRhCisgICAgZG91YmxlIHNjb3JlOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzY2VuZSBjaGFuZ2Ugc2NvcmUgKGYwIHRvIGYxKQorICAgIGludCBmbHVzaDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgMSBpZiB0aGUgZmlsdGVyIGlzIGJlaW5nIGZsdXNoZWQKKyAgICBpbnQ2NF90IHN0YXJ0X3B0czsgICAgICAgICAgICAgICAgICAvLy88IHB0cyBvZiB0aGUgZmlyc3Qgb3V0cHV0IGZyYW1lCisgICAgaW50NjRfdCBuOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBvdXRwdXQgZnJhbWUgY291bnRlcgorCisgICAgYmxlbmRfZnVuYyBibGVuZDsKK30gRnJhbWVSYXRlQ29udGV4dDsKKwordm9pZCBmZl9mcmFtZXJhdGVfaW5pdChGcmFtZVJhdGVDb250ZXh0ICpzKTsKK3ZvaWQgZmZfZnJhbWVyYXRlX2luaXRfeDg2KEZyYW1lUmF0ZUNvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZGSUxURVJfRlJBTUVSQVRFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2ZyYW1lc3luYy5jIGIvbGliYXZmaWx0ZXIvZnJhbWVzeW5jLmMKaW5kZXggNzkyMGNkYi4uZGExMmM1OCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvZnJhbWVzeW5jLmMKKysrIGIvbGliYXZmaWx0ZXIvZnJhbWVzeW5jLmMKQEAgLTE5LDI0ICsxOSwzNyBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKLSNpbmNsdWRlICJidWZmZXJxdWV1ZS5oIgorI2luY2x1ZGUgImZpbHRlcnMuaCIKICNpbmNsdWRlICJmcmFtZXN5bmMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCiAjZGVmaW5lIE9GRlNFVChtZW1iZXIpIG9mZnNldG9mKEZGRnJhbWVTeW5jLCBtZW1iZXIpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCiAKIHN0YXRpYyBjb25zdCBjaGFyICpmcmFtZXN5bmNfbmFtZSh2b2lkICpwdHIpCiB7CiAgICAgcmV0dXJuICJmcmFtZXN5bmMiOwogfQogCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZnJhbWVzeW5jX29wdGlvbnNbXSA9IHsKKyAgICB7ICJlb2ZfYWN0aW9uIiwgIkFjdGlvbiB0byB0YWtlIHdoZW4gZW5jb3VudGVyaW5nIEVPRiBmcm9tIHNlY29uZGFyeSBpbnB1dCAiLAorICAgICAgICBPRkZTRVQob3B0X2VvZl9hY3Rpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEVPRl9BQ1RJT05fUkVQRUFUIH0sCisgICAgICAgIEVPRl9BQ1RJT05fUkVQRUFULCBFT0ZfQUNUSU9OX1BBU1MsIC5mbGFncyA9IEZMQUdTLCAiZW9mX2FjdGlvbiIgfSwKKyAgICAgICAgeyAicmVwZWF0IiwgIlJlcGVhdCB0aGUgcHJldmlvdXMgZnJhbWUuIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRU9GX0FDVElPTl9SRVBFQVQgfSwgLmZsYWdzID0gRkxBR1MsICJlb2ZfYWN0aW9uIiB9LAorICAgICAgICB7ICJlbmRhbGwiLCAiRW5kIGJvdGggc3RyZWFtcy4iLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBFT0ZfQUNUSU9OX0VOREFMTCB9LCAuZmxhZ3MgPSBGTEFHUywgImVvZl9hY3Rpb24iIH0sCisgICAgICAgIHsgInBhc3MiLCAgICJQYXNzIHRocm91Z2ggdGhlIG1haW4gaW5wdXQuIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEVPRl9BQ1RJT05fUEFTUyB9LCAgIC5mbGFncyA9IEZMQUdTLCAiZW9mX2FjdGlvbiIgfSwKKyAgICB7ICJzaG9ydGVzdCIsICJmb3JjZSB0ZXJtaW5hdGlvbiB3aGVuIHRoZSBzaG9ydGVzdCBpbnB1dCB0ZXJtaW5hdGVzIiwgT0ZGU0VUKG9wdF9zaG9ydGVzdCksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJyZXBlYXRsYXN0IiwgImV4dGVuZCBsYXN0IGZyYW1lIG9mIHNlY29uZGFyeSBzdHJlYW1zIGJleW9uZCBFT0YiLCBPRkZTRVQob3B0X3JlcGVhdGxhc3QpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAxIH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CiBzdGF0aWMgY29uc3QgQVZDbGFzcyBmcmFtZXN5bmNfY2xhc3MgPSB7CiAgICAgLnZlcnNpb24gICAgICAgICAgICAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiAgICAgLmNsYXNzX25hbWUgICAgICAgICAgICAgICAgPSAiZnJhbWVzeW5jIiwKICAgICAuaXRlbV9uYW1lICAgICAgICAgICAgICAgICA9IGZyYW1lc3luY19uYW1lLAogICAgIC5jYXRlZ29yeSAgICAgICAgICAgICAgICAgID0gQVZfQ0xBU1NfQ0FURUdPUllfRklMVEVSLAotICAgIC5vcHRpb24gICAgICAgICAgICAgICAgICAgID0gTlVMTCwKKyAgICAub3B0aW9uICAgICAgICAgICAgICAgICAgICA9IGZyYW1lc3luY19vcHRpb25zLAogICAgIC5wYXJlbnRfbG9nX2NvbnRleHRfb2Zmc2V0ID0gT0ZGU0VUKHBhcmVudCksCiB9OwogCkBAIC00Niw5ICs1OSwyOSBAQAogICAgIFNUQVRFX0VPRiwKIH07CiAKLWludCBmZl9mcmFtZXN5bmNfaW5pdChGRkZyYW1lU3luYyAqZnMsIHZvaWQgKnBhcmVudCwgdW5zaWduZWQgbmJfaW4pCitzdGF0aWMgaW50IGNvbnN1bWVfZnJvbV9maWZvcyhGRkZyYW1lU3luYyAqZnMpOworCitjb25zdCBBVkNsYXNzICpmcmFtZXN5bmNfZ2V0X2NsYXNzKHZvaWQpCiB7CisgICAgcmV0dXJuICZmcmFtZXN5bmNfY2xhc3M7Cit9CisKK3ZvaWQgZmZfZnJhbWVzeW5jX3ByZWluaXQoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIGlmIChmcy0+Y2xhc3MpCisgICAgICAgIHJldHVybjsKICAgICBmcy0+Y2xhc3MgID0gJmZyYW1lc3luY19jbGFzczsKKyAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKGZzKTsKK30KKworaW50IGZmX2ZyYW1lc3luY19pbml0KEZGRnJhbWVTeW5jICpmcywgQVZGaWx0ZXJDb250ZXh0ICpwYXJlbnQsIHVuc2lnbmVkIG5iX2luKQoreworICAgIC8qIEZvciBmaWx0ZXJzIHdpdGggc2V2ZXJhbCBvdXRwdXRzLCB3ZSB3aWxsIG5vdCBiZSBhYmxlIHRvIGFzc3VtZSB3aGljaAorICAgICAgIG91dHB1dCBpcyByZWxldmFudCBmb3IgZmZfb3V0bGlua19mcmFtZV93YW50ZWQoKSBhbmQKKyAgICAgICBmZl9vdXRsaW5rX3NldF9zdGF0dXMoKS4gVG8gYmUgZGVzaWduZWQgd2hlbiBuZWVkZWQuICovCisgICAgYXZfYXNzZXJ0MChwYXJlbnQtPm5iX291dHB1dHMgPT0gMSk7CisKKyAgICBmZl9mcmFtZXN5bmNfcHJlaW5pdChmcyk7CiAgICAgZnMtPnBhcmVudCA9IHBhcmVudDsKICAgICBmcy0+bmJfaW4gID0gbmJfaW47CiAKQEAgLTU4LDYgKzkxLDEzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIGZyYW1lc3luY19lb2YoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIGZzLT5lb2YgPSAxOworICAgIGZzLT5mcmFtZV9yZWFkeSA9IDA7CisgICAgZmZfb3V0bGlua19zZXRfc3RhdHVzKGZzLT5wYXJlbnQtPm91dHB1dHNbMF0sIEFWRVJST1JfRU9GLCBBVl9OT1BUU19WQUxVRSk7Cit9CisKIHN0YXRpYyB2b2lkIGZyYW1lc3luY19zeW5jX2xldmVsX3VwZGF0ZShGRkZyYW1lU3luYyAqZnMpCiB7CiAgICAgdW5zaWduZWQgaSwgbGV2ZWwgPSAwOwpAQCAtNzEsNyArMTExLDcgQEAKICAgICBpZiAobGV2ZWwpCiAgICAgICAgIGZzLT5zeW5jX2xldmVsID0gbGV2ZWw7CiAgICAgZWxzZQotICAgICAgICBmcy0+ZW9mID0gMTsKKyAgICAgICAgZnJhbWVzeW5jX2VvZihmcyk7CiB9CiAKIGludCBmZl9mcmFtZXN5bmNfY29uZmlndXJlKEZGRnJhbWVTeW5jICpmcykKQEAgLTc5LDYgKzExOSwyNSBAQAogICAgIHVuc2lnbmVkIGk7CiAgICAgaW50NjRfdCBnY2QsIGxjbTsKIAorICAgIGlmICghZnMtPm9wdF9yZXBlYXRsYXN0IHx8IGZzLT5vcHRfZW9mX2FjdGlvbiA9PSBFT0ZfQUNUSU9OX1BBU1MpIHsKKyAgICAgICAgZnMtPm9wdF9yZXBlYXRsYXN0ID0gMDsKKyAgICAgICAgZnMtPm9wdF9lb2ZfYWN0aW9uID0gRU9GX0FDVElPTl9QQVNTOworICAgIH0KKyAgICBpZiAoZnMtPm9wdF9zaG9ydGVzdCB8fCBmcy0+b3B0X2VvZl9hY3Rpb24gPT0gRU9GX0FDVElPTl9FTkRBTEwpIHsKKyAgICAgICAgZnMtPm9wdF9zaG9ydGVzdCA9IDE7CisgICAgICAgIGZzLT5vcHRfZW9mX2FjdGlvbiA9IEVPRl9BQ1RJT05fRU5EQUxMOworICAgIH0KKyAgICBpZiAoZnMtPm9wdF9zaG9ydGVzdCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnMtPm5iX2luOyBpKyspCisgICAgICAgICAgICBmcy0+aW5baV0uYWZ0ZXIgPSBFWFRfU1RPUDsKKyAgICB9CisgICAgaWYgKCFmcy0+b3B0X3JlcGVhdGxhc3QpIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGZzLT5uYl9pbjsgaSsrKSB7CisgICAgICAgICAgICBmcy0+aW5baV0uYWZ0ZXIgPSBFWFRfTlVMTDsKKyAgICAgICAgICAgIGZzLT5pbltpXS5zeW5jICA9IDA7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoIWZzLT50aW1lX2Jhc2UubnVtKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcy0+bmJfaW47IGkrKykgewogICAgICAgICAgICAgaWYgKGZzLT5pbltpXS5zeW5jKSB7CkBAIC0xMTUsMzMgKzE3NCwyMyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmcmFtZXN5bmNfYWR2YW5jZShGRkZyYW1lU3luYyAqZnMpCitzdGF0aWMgaW50IGZyYW1lc3luY19hZHZhbmNlKEZGRnJhbWVTeW5jICpmcykKIHsKLSAgICBpbnQgbGF0ZXN0OwogICAgIHVuc2lnbmVkIGk7CiAgICAgaW50NjRfdCBwdHM7CisgICAgaW50IHJldDsKIAotICAgIGlmIChmcy0+ZW9mKQotICAgICAgICByZXR1cm47Ci0gICAgd2hpbGUgKCFmcy0+ZnJhbWVfcmVhZHkpIHsKLSAgICAgICAgbGF0ZXN0ID0gLTE7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBmcy0+bmJfaW47IGkrKykgewotICAgICAgICAgICAgaWYgKCFmcy0+aW5baV0uaGF2ZV9uZXh0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxhdGVzdCA8IDAgfHwgZnMtPmluW2ldLnB0cyA8IGZzLT5pbltsYXRlc3RdLnB0cykKLSAgICAgICAgICAgICAgICAgICAgbGF0ZXN0ID0gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobGF0ZXN0ID49IDApIHsKLSAgICAgICAgICAgIGZzLT5pbl9yZXF1ZXN0ID0gbGF0ZXN0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICB3aGlsZSAoIShmcy0+ZnJhbWVfcmVhZHkgfHwgZnMtPmVvZikpIHsKKyAgICAgICAgcmV0ID0gY29uc3VtZV9mcm9tX2ZpZm9zKGZzKTsKKyAgICAgICAgaWYgKHJldCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICBwdHMgPSBmcy0+aW5bMF0ucHRzX25leHQ7Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBmcy0+bmJfaW47IGkrKykKLSAgICAgICAgICAgIGlmIChmcy0+aW5baV0ucHRzX25leHQgPCBwdHMpCisgICAgICAgIHB0cyA9IElOVDY0X01BWDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZzLT5uYl9pbjsgaSsrKQorICAgICAgICAgICAgaWYgKGZzLT5pbltpXS5oYXZlX25leHQgJiYgZnMtPmluW2ldLnB0c19uZXh0IDwgcHRzKQogICAgICAgICAgICAgICAgIHB0cyA9IGZzLT5pbltpXS5wdHNfbmV4dDsKICAgICAgICAgaWYgKHB0cyA9PSBJTlQ2NF9NQVgpIHsKLSAgICAgICAgICAgIGZzLT5lb2YgPSAxOworICAgICAgICAgICAgZnJhbWVzeW5jX2VvZihmcyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnMtPm5iX2luOyBpKyspIHsKQEAgLTE1OSwxMSArMjA4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgZnMtPmZyYW1lX3JlYWR5ID0gMTsKICAgICAgICAgICAgICAgICBpZiAoZnMtPmluW2ldLnN0YXRlID09IFNUQVRFX0VPRiAmJgogICAgICAgICAgICAgICAgICAgICBmcy0+aW5baV0uYWZ0ZXIgPT0gRVhUX1NUT1ApCi0gICAgICAgICAgICAgICAgICAgIGZzLT5lb2YgPSAxOworICAgICAgICAgICAgICAgICAgICBmcmFtZXN5bmNfZW9mKGZzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoZnMtPmVvZikKLSAgICAgICAgICAgIGZzLT5mcmFtZV9yZWFkeSA9IDA7CiAgICAgICAgIGlmIChmcy0+ZnJhbWVfcmVhZHkpCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnMtPm5iX2luOyBpKyspCiAgICAgICAgICAgICAgICAgaWYgKChmcy0+aW5baV0uc3RhdGUgPT0gU1RBVEVfQk9GICYmCkBAIC0xNzEsNiArMjE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZnMtPmZyYW1lX3JlYWR5ID0gMDsKICAgICAgICAgZnMtPnB0cyA9IHB0czsKICAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQ2NF90IGZyYW1lc3luY19wdHNfZXh0cmFwb2xhdGUoRkZGcmFtZVN5bmMgKmZzLCB1bnNpZ25lZCBpbiwKQEAgLTE4NSw0OSArMjMzLDI4IEBACiAgICAgaW50NjRfdCBwdHM7CiAKICAgICBhdl9hc3NlcnQwKCFmcy0+aW5baW5dLmhhdmVfbmV4dCk7Ci0gICAgaWYgKGZyYW1lKSB7Ci0gICAgICAgIHB0cyA9IGF2X3Jlc2NhbGVfcShmcmFtZS0+cHRzLCBmcy0+aW5baW5dLnRpbWVfYmFzZSwgZnMtPnRpbWVfYmFzZSk7Ci0gICAgICAgIGZyYW1lLT5wdHMgPSBwdHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHRzID0gZnMtPmluW2luXS5zdGF0ZSAhPSBTVEFURV9SVU4gfHwgZnMtPmluW2luXS5hZnRlciA9PSBFWFRfSU5GSU5JVFkKLSAgICAgICAgICAgID8gSU5UNjRfTUFYIDogZnJhbWVzeW5jX3B0c19leHRyYXBvbGF0ZShmcywgaW4sIGZzLT5pbltpbl0ucHRzKTsKLSAgICAgICAgZnMtPmluW2luXS5zeW5jID0gMDsKLSAgICAgICAgZnJhbWVzeW5jX3N5bmNfbGV2ZWxfdXBkYXRlKGZzKTsKLSAgICB9CisgICAgYXZfYXNzZXJ0MChmcmFtZSk7CisgICAgcHRzID0gYXZfcmVzY2FsZV9xKGZyYW1lLT5wdHMsIGZzLT5pbltpbl0udGltZV9iYXNlLCBmcy0+dGltZV9iYXNlKTsKKyAgICBmcmFtZS0+cHRzID0gcHRzOwogICAgIGZzLT5pbltpbl0uZnJhbWVfbmV4dCA9IGZyYW1lOwogICAgIGZzLT5pbltpbl0ucHRzX25leHQgICA9IHB0czsKICAgICBmcy0+aW5baW5dLmhhdmVfbmV4dCAgPSAxOwogfQogCi1pbnQgZmZfZnJhbWVzeW5jX2FkZF9mcmFtZShGRkZyYW1lU3luYyAqZnMsIHVuc2lnbmVkIGluLCBBVkZyYW1lICpmcmFtZSkKK3N0YXRpYyB2b2lkIGZyYW1lc3luY19pbmplY3Rfc3RhdHVzKEZGRnJhbWVTeW5jICpmcywgdW5zaWduZWQgaW4sIGludCBzdGF0dXMsIGludDY0X3QgcHRzKQogewotICAgIGF2X2Fzc2VydDEoaW4gPCBmcy0+bmJfaW4pOwotICAgIGlmICghZnMtPmluW2luXS5oYXZlX25leHQpCi0gICAgICAgIGZyYW1lc3luY19pbmplY3RfZnJhbWUoZnMsIGluLCBmcmFtZSk7Ci0gICAgZWxzZQotICAgICAgICBmZl9idWZxdWV1ZV9hZGQoZnMsICZmcy0+aW5baW5dLnF1ZXVlLCBmcmFtZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgZmZfZnJhbWVzeW5jX25leHQoRkZGcmFtZVN5bmMgKmZzKQotewotICAgIHVuc2lnbmVkIGk7Ci0KLSAgICBhdl9hc3NlcnQwKCFmcy0+ZnJhbWVfcmVhZHkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBmcy0+bmJfaW47IGkrKykKLSAgICAgICAgaWYgKCFmcy0+aW5baV0uaGF2ZV9uZXh0ICYmIGZzLT5pbltpXS5xdWV1ZS5hdmFpbGFibGUpCi0gICAgICAgICAgICBmcmFtZXN5bmNfaW5qZWN0X2ZyYW1lKGZzLCBpLCBmZl9idWZxdWV1ZV9nZXQoJmZzLT5pbltpXS5xdWV1ZSkpOwotICAgIGZzLT5mcmFtZV9yZWFkeSA9IDA7Ci0gICAgZnJhbWVzeW5jX2FkdmFuY2UoZnMpOwotfQotCi12b2lkIGZmX2ZyYW1lc3luY19kcm9wKEZGRnJhbWVTeW5jICpmcykKLXsKLSAgICBmcy0+ZnJhbWVfcmVhZHkgPSAwOworICAgIGF2X2Fzc2VydDAoIWZzLT5pbltpbl0uaGF2ZV9uZXh0KTsKKyAgICBwdHMgPSBmcy0+aW5baW5dLnN0YXRlICE9IFNUQVRFX1JVTiB8fCBmcy0+aW5baW5dLmFmdGVyID09IEVYVF9JTkZJTklUWQorICAgICAgICA/IElOVDY0X01BWCA6IGZyYW1lc3luY19wdHNfZXh0cmFwb2xhdGUoZnMsIGluLCBmcy0+aW5baW5dLnB0cyk7CisgICAgZnMtPmluW2luXS5zeW5jID0gMDsKKyAgICBmcmFtZXN5bmNfc3luY19sZXZlbF91cGRhdGUoZnMpOworICAgIGZzLT5pbltpbl0uZnJhbWVfbmV4dCA9IE5VTEw7CisgICAgZnMtPmluW2luXS5wdHNfbmV4dCAgID0gcHRzOworICAgIGZzLT5pbltpbl0uaGF2ZV9uZXh0ICA9IDE7CiB9CiAKIGludCBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgdW5zaWduZWQgaW4sIEFWRnJhbWUgKipyZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBnZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZ2V0KQogewogICAgIEFWRnJhbWUgKmZyYW1lOwogICAgIHVuc2lnbmVkIG5lZWRfY29weSA9IDAsIGk7CkBAIC0yNzAsNjYgKzI5NywxMTcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgZnMtPm5iX2luOyBpKyspIHsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnMtPmluW2ldLmZyYW1lKTsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnMtPmluW2ldLmZyYW1lX25leHQpOwotICAgICAgICBmZl9idWZxdWV1ZV9kaXNjYXJkX2FsbCgmZnMtPmluW2ldLnF1ZXVlKTsKICAgICB9CiAKICAgICBhdl9mcmVlcCgmZnMtPmluKTsKIH0KIAotaW50IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgdW5zaWduZWQgYWxsKQorc3RhdGljIGludCBjb25zdW1lX2Zyb21fZmlmb3MoRkZGcmFtZVN5bmMgKmZzKQogewotICAgIGludCByZXQsIGNvdW50ID0gMDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGZzLT5wYXJlbnQ7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBOVUxMOworICAgIGludDY0X3QgcHRzOworICAgIHVuc2lnbmVkIGksIG5iX2FjdGl2ZSwgbmJfbWlzczsKKyAgICBpbnQgcmV0LCBzdGF0dXM7CiAKLSAgICBhdl9hc3NlcnQwKGZzLT5vbl9ldmVudCk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgZmZfZnJhbWVzeW5jX25leHQoZnMpOwotICAgICAgICBpZiAoZnMtPmVvZiB8fCAhZnMtPmZyYW1lX3JlYWR5KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICgocmV0ID0gZnMtPm9uX2V2ZW50KGZzKSkgPCAwKQorICAgIG5iX2FjdGl2ZSA9IG5iX21pc3MgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBmcy0+bmJfaW47IGkrKykgeworICAgICAgICBpZiAoZnMtPmluW2ldLmhhdmVfbmV4dCB8fCBmcy0+aW5baV0uc3RhdGUgPT0gU1RBVEVfRU9GKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIG5iX2FjdGl2ZSsrOworICAgICAgICByZXQgPSBmZl9pbmxpbmtfY29uc3VtZV9mcmFtZShjdHgtPmlucHV0c1tpXSwgJmZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICBmZl9mcmFtZXN5bmNfZHJvcChmcyk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIGlmICghYWxsKQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoZnJhbWUpOworICAgICAgICAgICAgZnJhbWVzeW5jX2luamVjdF9mcmFtZShmcywgaSwgZnJhbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gZmZfaW5saW5rX2Fja25vd2xlZGdlX3N0YXR1cyhjdHgtPmlucHV0c1tpXSwgJnN0YXR1cywgJnB0cyk7CisgICAgICAgICAgICBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgICAgIGZyYW1lc3luY19pbmplY3Rfc3RhdHVzKGZzLCBpLCBzdGF0dXMsIHB0cyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgICAgICBuYl9taXNzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFjb3VudCAmJiBmcy0+ZW9mKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Ci0gICAgcmV0dXJuIGNvdW50OworICAgIGlmIChuYl9taXNzKSB7CisgICAgICAgIGlmIChuYl9taXNzID09IG5iX2FjdGl2ZSAmJiAhZmZfb3V0bGlua19mcmFtZV93YW50ZWQoY3R4LT5vdXRwdXRzWzBdKSkKKyAgICAgICAgICAgIHJldHVybiBGRkVSUk9SX05PVF9SRUFEWTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZzLT5uYl9pbjsgaSsrKQorICAgICAgICAgICAgaWYgKCFmcy0+aW5baV0uaGF2ZV9uZXh0ICYmIGZzLT5pbltpXS5zdGF0ZSAhPSBTVEFURV9FT0YpCisgICAgICAgICAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbaV0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIDE7CiB9CiAKLWludCBmZl9mcmFtZXN5bmNfZmlsdGVyX2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgQVZGaWx0ZXJMaW5rICppbmxpbmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICppbikKK2ludCBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoRkZGcmFtZVN5bmMgKmZzKQogewogICAgIGludCByZXQ7CiAKLSAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKGZzLCAxKSkgPCAwKQorICAgIHJldCA9IGZyYW1lc3luY19hZHZhbmNlKGZzKTsKKyAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19hZGRfZnJhbWUoZnMsIEZGX0lOTElOS19JRFgoaW5saW5rKSwgaW4pKSA8IDApCisgICAgaWYgKGZzLT5lb2YgfHwgIWZzLT5mcmFtZV9yZWFkeSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0ID0gZnMtPm9uX2V2ZW50KGZzKTsKKyAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKGZzLCAwKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OworICAgIGZzLT5mcmFtZV9yZWFkeSA9IDA7CisKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGZmX2ZyYW1lc3luY19yZXF1ZXN0X2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoraW50IGZmX2ZyYW1lc3luY19pbml0X2R1YWxpbnB1dChGRkZyYW1lU3luYyAqZnMsIEFWRmlsdGVyQ29udGV4dCAqcGFyZW50KQogewotICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOwotICAgIGludCBpbnB1dCwgcmV0OworICAgIGludCByZXQ7CiAKLSAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKGZzLCAwKSkgPCAwKQorICAgIHJldCA9IGZmX2ZyYW1lc3luY19pbml0KGZzLCBwYXJlbnQsIDIpOworICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwotICAgIGlmIChyZXQgPiAwKQotICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoZnMtPmVvZikKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwotICAgIGlucHV0ID0gZnMtPmluX3JlcXVlc3Q7Ci0gICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1tpbnB1dF0pOwotICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKLSAgICAgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfYWRkX2ZyYW1lKGZzLCBpbnB1dCwgTlVMTCkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX3Byb2Nlc3NfZnJhbWUoZnMsIDApKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICByZXQgPSAwOworICAgIGZzLT5pblswXS50aW1lX2Jhc2UgPSBwYXJlbnQtPmlucHV0c1swXS0+dGltZV9iYXNlOworICAgIGZzLT5pblsxXS50aW1lX2Jhc2UgPSBwYXJlbnQtPmlucHV0c1sxXS0+dGltZV9iYXNlOworICAgIGZzLT5pblswXS5zeW5jICAgPSAyOworICAgIGZzLT5pblswXS5iZWZvcmUgPSBFWFRfU1RPUDsKKyAgICBmcy0+aW5bMF0uYWZ0ZXIgID0gRVhUX0lORklOSVRZOworICAgIGZzLT5pblsxXS5zeW5jICAgPSAxOworICAgIGZzLT5pblsxXS5iZWZvcmUgPSBFWFRfTlVMTDsKKyAgICBmcy0+aW5bMV0uYWZ0ZXIgID0gRVhUX0lORklOSVRZOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZnJhbWVzeW5jX2R1YWxpbnB1dF9nZXQoRkZGcmFtZVN5bmMgKmZzLCBBVkZyYW1lICoqZjAsIEFWRnJhbWUgKipmMSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGZzLT5wYXJlbnQ7CisgICAgQVZGcmFtZSAqbWFpbnBpYyA9IE5VTEwsICpzZWNvbmRwaWMgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoZnMsIDAsICZtYWlucGljLCAgIDEpKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoZnMsIDEsICZzZWNvbmRwaWMsIDApKSA8IDApIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmbWFpbnBpYyk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQotICAgIHJldHVybiByZXQ7CisgICAgYXZfYXNzZXJ0MChtYWlucGljKTsKKyAgICBtYWlucGljLT5wdHMgPSBhdl9yZXNjYWxlX3EoZnMtPnB0cywgZnMtPnRpbWVfYmFzZSwgY3R4LT5vdXRwdXRzWzBdLT50aW1lX2Jhc2UpOworICAgIGlmIChjdHgtPmlzX2Rpc2FibGVkKQorICAgICAgICBzZWNvbmRwaWMgPSBOVUxMOworICAgICpmMCA9IG1haW5waWM7CisgICAgKmYxID0gc2Vjb25kcGljOworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfZnJhbWVzeW5jX2R1YWxpbnB1dF9nZXRfd3JpdGFibGUoRkZGcmFtZVN5bmMgKmZzLCBBVkZyYW1lICoqZjAsIEFWRnJhbWUgKipmMSkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfZnJhbWVzeW5jX2R1YWxpbnB1dF9nZXQoZnMsIGYwLCBmMSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gZmZfaW5saW5rX21ha2VfZnJhbWVfd3JpdGFibGUoZnMtPnBhcmVudC0+aW5wdXRzWzBdLCBmMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZShmMCk7CisgICAgICAgICpmMSA9IE5VTEw7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZnJhbWVzeW5jLmggYi9saWJhdmZpbHRlci9mcmFtZXN5bmMuaAppbmRleCA3YmE5OWQ1Li5hYmYzYmY1IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9mcmFtZXN5bmMuaAorKysgYi9saWJhdmZpbHRlci9mcmFtZXN5bmMuaApAQCAtMjMsOSArMjMsMTQgQEAKIAogI2luY2x1ZGUgImJ1ZmZlcnF1ZXVlLmgiCiAKK2VudW0gRU9GQWN0aW9uIHsKKyAgICBFT0ZfQUNUSU9OX1JFUEVBVCwKKyAgICBFT0ZfQUNUSU9OX0VOREFMTCwKKyAgICBFT0ZfQUNUSU9OX1BBU1MKK307CisKIC8qCiAgKiBUT0RPCi0gKiBDYWxsYmFjay1iYXNlZCBBUEkgc2ltaWxhciB0byBkdWFsaW5wdXQuCiAgKiBFeHBvcnQgY29udmVuaWVudCBvcHRpb25zLgogICovCiAKQEAgLTQxLDE2ICs0Niw5IEBACiAgKiBzaXR1YXRpb25zIHdoZXJlIHNvbWUgc3RyZWFtIGV4dGVuZCBiZXlvbmQgdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kIG9mCiAgKiBvdGhlcnMgY2FuIGJlIGNvbmZpZ3VyZWQuCiAgKgotICogVGhlIGJhc2ljIHdvcmtpbmcgb2YgdGhpcyBBUEkgaXMgdGhlIGZvbGxvd2luZzoKLSAqCi0gKiAtIFdoZW4gYSBmcmFtZSBpcyBhdmFpbGFibGUgb24gYW55IGlucHV0LCBhZGQgaXQgdXNpbmcKLSAqICAgZmZfZnJhbWVzeW5jX2FkZF9mcmFtZSgpLgotICoKLSAqIC0gV2hlbiBhIGZyYW1lIGV2ZW50IGlzIHJlYWR5IHRvIGJlIHByb2Nlc3NlZCAoaS5lLiBhZnRlciBhZGRpbmcgYSBmcmFtZQotICogICBvciB3aGVuIHJlcXVlc3RlZCBvbiBpbnB1dCk6Ci0gKiAgIC0gY2FsbCBmZl9mcmFtZXN5bmNfbmV4dCgpOwotICogICAtIGlmIGZzLT5mcmFtZV9yZWFkeSBpcyB0cnVlLCBwcm9jZXNzIHRoZSBmcmFtZXM7Ci0gKiAgIC0gY2FsbCBmZl9mcmFtZXN5bmNfZHJvcCgpLgorICogVGhlIGJhc2ljIHdvcmtpbmcgb2YgdGhpcyBBUEkgaXMgdGhlIGZvbGxvd2luZzogc2V0IHRoZSBvbl9ldmVudAorICogY2FsbGJhY2ssIHRoZW4gY2FsbCBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoKSBmcm9tIHRoZSBmaWx0ZXIncyBhY3RpdmF0ZQorICogY2FsbGJhY2suCiAgKi8KIAogLyoqCkBAIC04MywxMSArODEsNiBAQAogdHlwZWRlZiBzdHJ1Y3QgRkZGcmFtZVN5bmNJbiB7CiAKICAgICAvKioKLSAgICAgKiBRdWV1ZSBvZiBpbmNvbWluZyBBVkZyYW1lLCBhbmQgTlVMTCB0byBtYXJrIEVPRgotICAgICAqLwotICAgIHN0cnVjdCBGRkJ1ZlF1ZXVlIHF1ZXVlOwotCi0gICAgLyoqCiAgICAgICogRXh0cmFwb2xhdGlvbiBtb2RlIGZvciB0aW1lc3RhbXBzIGJlZm9yZSB0aGUgZmlyc3QgZnJhbWUKICAgICAgKi8KICAgICBlbnVtIEZGRnJhbWVTeW5jRXh0TW9kZSBiZWZvcmU7CkBAIC0xNTIsNyArMTQ1LDExIEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IEZGRnJhbWVTeW5jIHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKLSAgICB2b2lkICpwYXJlbnQ7CisKKyAgICAvKioKKyAgICAgKiBQYXJlbnQgZmlsdGVyIGNvbnRleHQuCisgICAgICovCisgICAgQVZGaWx0ZXJDb250ZXh0ICpwYXJlbnQ7CiAKICAgICAvKioKICAgICAgKiBOdW1iZXIgb2YgaW5wdXQgc3RyZWFtcwpAQCAtMjA1LDE5ICsyMDIsMzcgQEAKICAgICAgKi8KICAgICBGRkZyYW1lU3luY0luICppbjsKIAorICAgIGludCBvcHRfcmVwZWF0bGFzdDsKKyAgICBpbnQgb3B0X3Nob3J0ZXN0OworICAgIGludCBvcHRfZW9mX2FjdGlvbjsKKwogfSBGRkZyYW1lU3luYzsKIAogLyoqCisgKiBHZXQgdGhlIGNsYXNzIGZvciB0aGUgZnJhbWVzeW5jIG9iamVjdC4KKyAqLworY29uc3QgQVZDbGFzcyAqZnJhbWVzeW5jX2dldF9jbGFzcyh2b2lkKTsKKworLyoqCisgKiBQcmUtaW5pdGlhbGl6ZSBhIGZyYW1lIHN5bmMgc3RydWN0dXJlLgorICoKKyAqIEl0IHNldHMgdGhlIGNsYXNzIHBvaW50ZXIgYW5kIGluaXRzIHRoZSBvcHRpb25zIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICogVGhlIGVudGlyZSBzdHJ1Y3R1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgYWxyZWFkeSBzZXQgdG8gMC4KKyAqIFRoaXMgc3RlcCBpcyBvcHRpb25hbCwgYnV0IG5lY2Vzc2FyeSB0byB1c2UgdGhlIG9wdGlvbnMuCisgKi8KK3ZvaWQgZmZfZnJhbWVzeW5jX3ByZWluaXQoRkZGcmFtZVN5bmMgKmZzKTsKKworLyoqCiAgKiBJbml0aWFsaXplIGEgZnJhbWUgc3luYyBzdHJ1Y3R1cmUuCiAgKgotICogVGhlIGVudGlyZSBzdHJ1Y3R1cmUgaXMgZXhwZWN0ZWQgdG8gYmUgYWxyZWFkeSBzZXQgdG8gMC4KKyAqIFRoZSBlbnRpcmUgc3RydWN0dXJlIGlzIGV4cGVjdGVkIHRvIGJlIGFscmVhZHkgc2V0IHRvIDAgb3IgcHJlaW5pdGVkLgogICoKICAqIEBwYXJhbSAgZnMgICAgICBmcmFtZSBzeW5jIHN0cnVjdHVyZSB0byBpbml0aWFsaXplCi0gKiBAcGFyYW0gIHBhcmVudCAgcGFyZW50IG9iamVjdCwgdXNlZCBmb3IgbG9nZ2luZworICogQHBhcmFtICBwYXJlbnQgIHBhcmVudCBBVkZpbHRlckNvbnRleHQgb2JqZWN0CiAgKiBAcGFyYW0gIG5iX2luICAgbnVtYmVyIG9mIGlucHV0cwogICogQHJldHVybiAgPj0gMCBmb3Igc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKICAqLwotaW50IGZmX2ZyYW1lc3luY19pbml0KEZGRnJhbWVTeW5jICpmcywgdm9pZCAqcGFyZW50LCB1bnNpZ25lZCBuYl9pbik7CitpbnQgZmZfZnJhbWVzeW5jX2luaXQoRkZGcmFtZVN5bmMgKmZzLCBBVkZpbHRlckNvbnRleHQgKnBhcmVudCwgdW5zaWduZWQgbmJfaW4pOwogCiAvKioKICAqIENvbmZpZ3VyZSBhIGZyYW1lIHN5bmMgc3RydWN0dXJlLgpAQCAtMjM0LDI5ICsyNDksNiBAQAogdm9pZCBmZl9mcmFtZXN5bmNfdW5pbml0KEZGRnJhbWVTeW5jICpmcyk7CiAKIC8qKgotICogQWRkIGEgZnJhbWUgdG8gYW4gaW5wdXQKLSAqCi0gKiBUeXBpY2FsbHkgY2FsbGVkIGZyb20gdGhlIGZpbHRlcl9mcmFtZSgpIG1ldGhvZC4KLSAqCi0gKiBAcGFyYW0gZnMgICAgIGZyYW1lIHN5bmMgc3RydWN0dXJlCi0gKiBAcGFyYW0gaW4gICAgIGluZGV4IG9mIHRoZSBpbnB1dAotICogQHBhcmFtIGZyYW1lICBpbnB1dCBmcmFtZSwgb3IgTlVMTCBmb3IgRU9GCi0gKi8KLWludCBmZl9mcmFtZXN5bmNfYWRkX2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgdW5zaWduZWQgaW4sIEFWRnJhbWUgKmZyYW1lKTsKLQotLyoqCi0gKiBQcmVwYXJlIHRoZSBuZXh0IGZyYW1lIGV2ZW50LgotICoKLSAqIFRoZSBzdGF0dXMgb2YgdGhlIG9wZXJhdGlvbiBjYW4gYmUgZm91bmQgaW4gZnMtPmZyYW1lX3JlYWR5IGFuZCBmcy0+ZW9mLgotICovCi12b2lkIGZmX2ZyYW1lc3luY19uZXh0KEZGRnJhbWVTeW5jICpmcyk7Ci0KLS8qKgotICogRHJvcCB0aGUgY3VycmVudCBmcmFtZSBldmVudC4KLSAqLwotdm9pZCBmZl9mcmFtZXN5bmNfZHJvcChGRkZyYW1lU3luYyAqZnMpOwotCi0vKioKICAqIEdldCB0aGUgY3VycmVudCBmcmFtZSBpbiBhbiBpbnB1dC4KICAqCiAgKiBAcGFyYW0gZnMgICAgICBmcmFtZSBzeW5jIHN0cnVjdHVyZQpAQCAtMjY3LDMxICsyNTksNjYgQEAKICAqICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBmcmFtZXN5bmMgc3RydWN0dXJlCiAgKi8KIGludCBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgdW5zaWduZWQgaW4sIEFWRnJhbWUgKipyZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGdldCk7CiAKIC8qKgotICogUHJvY2VzcyBvbmUgb3Igc2V2ZXJhbCBmcmFtZSB1c2luZyB0aGUgb25fZXZlbnQgY2FsbGJhY2suCisgKiBFeGFtaW5lIHRoZSBmcmFtZXMgaW4gdGhlIGZpbHRlcidzIGlucHV0IGFuZCB0cnkgdG8gcHJvZHVjZSBvdXRwdXQuCiAgKgotICogQHJldHVybiAgbnVtYmVyIG9mIGZyYW1lcyBwcm9jZXNzZWQgb3IgbmVnYXRpdmUgZXJyb3IgY29kZQorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhY3RpdmF0ZQorICogbWV0aG9kIG9mIGEgZmlsdGVyIHVzaW5nIGZyYW1lc3luYy4KICAqLwotaW50IGZmX2ZyYW1lc3luY19wcm9jZXNzX2ZyYW1lKEZGRnJhbWVTeW5jICpmcywgdW5zaWduZWQgYWxsKTsKLQoraW50IGZmX2ZyYW1lc3luY19hY3RpdmF0ZShGRkZyYW1lU3luYyAqZnMpOwogCiAvKioKLSAqIEFjY2VwdCBhIGZyYW1lIG9uIGEgZmlsdGVyIGlucHV0LgorICogSW5pdGlhbGl6ZSBhIGZyYW1lIHN5bmMgc3RydWN0dXJlIGZvciBkdWFsaW5wdXQuCiAgKgotICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIG9mIGFsbCBmaWx0ZXJfZnJhbWUKLSAqIG1ldGhvZHMgb2YgYSBmaWx0ZXIgdXNpbmcgZnJhbWVzeW5jLgorICogQ29tcGFyZWQgdG8gZ2VuZXJpYyBmcmFtZXN5bmMsIGR1YWxpbnB1dCBhc3N1bWVzIHRoZSBmaXJzdCBpbnB1dCBpcyB0aGUKKyAqIG1haW4gb25lIGFuZCB0aGUgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCBvbiBpdC4gVGhlIGZpcnN0IGlucHV0IHdpbGwgYmUKKyAqIHRoZSBvbmx5IG9uZSB3aXRoIHN5bmMgc2V0IGFuZCBnZW5lcmljIHRpbWVsaW5lIHN1cHBvcnQgd2lsbCBqdXN0IHBhc3MgaXQKKyAqIHVuY2hhbmdlZCB3aGVuIGRpc2FibGVkLgorICoKKyAqIEVxdWl2YWxlbnQgdG8gZmZfZnJhbWVzeW5jX2luaXQoZnMsIHBhcmVudCwgMikgdGhlbiBzZXR0aW5nIHRoZSB0aW1lCisgKiBiYXNlLCBzeW5jIGFuZCBleHQgbW9kZXMgb24gdGhlIGlucHV0cy4KICAqLwotaW50IGZmX2ZyYW1lc3luY19maWx0ZXJfZnJhbWUoRkZGcmFtZVN5bmMgKmZzLCBBVkZpbHRlckxpbmsgKmlubGluaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluKTsKK2ludCBmZl9mcmFtZXN5bmNfaW5pdF9kdWFsaW5wdXQoRkZGcmFtZVN5bmMgKmZzLCBBVkZpbHRlckNvbnRleHQgKnBhcmVudCk7CiAKIC8qKgotICogUmVxdWVzdCBhIGZyYW1lIG9uIHRoZSBmaWx0ZXIgb3V0cHV0LgotICoKLSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgZmlsdGVyX2ZyYW1lCi0gKiBtZXRob2RzIG9mIGEgZmlsdGVyIHVzaW5nIGZyYW1lc3luYyBpZiBpdCBoYXMgb25seSBvbmUgb3V0cHV0LgorICogQHBhcmFtIGYwICB1c2VkIHRvIHJldHVybiB0aGUgbWFpbiBmcmFtZQorICogQHBhcmFtIGYxICB1c2VkIHRvIHJldHVybiB0aGUgc2Vjb25kIGZyYW1lLCBvciBOVUxMIGlmIGRpc2FibGVkCisgKiBAcmV0dXJuICA+PTAgZm9yIHN1Y2Nlc3Mgb3IgQVZFUlJPUiBjb2RlCisgKiBAbm90ZSAgVGhlIGZyYW1lIHJldHVybmVkIGluIGYwIGJlbG9uZ3MgdG8gdGhlIGNhbGxlciAoZ2V0ID0gMSBpbgorICogZmZfZnJhbWVzeW5jX2dldF9mcmFtZSgpKSB3aGlsZSB0aGUgZnJhbWUgcmV0dXJuZWQgaW4gZjEgaXMgc3RpbGwgb3duZWQKKyAqIGJ5IHRoZSBmcmFtZXN5bmMgc3RydWN0dXJlLgogICovCi1pbnQgZmZfZnJhbWVzeW5jX3JlcXVlc3RfZnJhbWUoRkZGcmFtZVN5bmMgKmZzLCBBVkZpbHRlckxpbmsgKm91dGxpbmspOworaW50IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRfZ2V0KEZGRnJhbWVTeW5jICpmcywgQVZGcmFtZSAqKmYwLCBBVkZyYW1lICoqZjEpOworCisvKioKKyAqIFNhbWUgYXMgZmZfZnJhbWVzeW5jX2R1YWxpbnB1dF9nZXQoKSwgYnV0IG1ha2Ugc3VyZSB0aGF0IGYwIGlzIHdyaXRhYmxlLgorICovCitpbnQgZmZfZnJhbWVzeW5jX2R1YWxpbnB1dF9nZXRfd3JpdGFibGUoRkZGcmFtZVN5bmMgKmZzLCBBVkZyYW1lICoqZjAsIEFWRnJhbWUgKipmMSk7CisKKyNkZWZpbmUgRlJBTUVTWU5DX0RFRklORV9DTEFTUyhuYW1lLCBjb250ZXh0LCBmaWVsZCkgXAorc3RhdGljIGludCBuYW1lIyNfZnJhbWVzeW5jX3ByZWluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpIHsgXAorICAgIGNvbnRleHQgKnMgPSBjdHgtPnByaXY7IFwKKyAgICBmZl9mcmFtZXN5bmNfcHJlaW5pdCgmcy0+ZmllbGQpOyBcCisgICAgcmV0dXJuIDA7IFwKK30gXAorc3RhdGljIGNvbnN0IEFWQ2xhc3MgKm5hbWUjI19jaGlsZF9jbGFzc19uZXh0KGNvbnN0IEFWQ2xhc3MgKnByZXYpIHsgXAorICAgIHJldHVybiBwcmV2ID8gTlVMTCA6IGZyYW1lc3luY19nZXRfY2xhc3MoKTsgXAorfSBcCitzdGF0aWMgdm9pZCAqbmFtZSMjX2NoaWxkX25leHQodm9pZCAqb2JqLCB2b2lkICpwcmV2KSB7IFwKKyAgICBjb250ZXh0ICpzID0gb2JqOyBcCisgICAgcy0+ZnMuY2xhc3MgPSBmcmFtZXN5bmNfZ2V0X2NsYXNzKCk7IC8qIEZJWE1FICovIFwKKyAgICByZXR1cm4gcHJldiA/IE5VTEwgOiAmcy0+ZmllbGQ7IFwKK30gXAorc3RhdGljIGNvbnN0IEFWQ2xhc3MgbmFtZSMjX2NsYXNzID0geyBcCisgICAgLmNsYXNzX25hbWUgICAgICAgPSAjbmFtZSwgXAorICAgIC5pdGVtX25hbWUgICAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsIFwKKyAgICAub3B0aW9uICAgICAgICAgICA9IG5hbWUjI19vcHRpb25zLCBcCisgICAgLnZlcnNpb24gICAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsIFwKKyAgICAuY2F0ZWdvcnkgICAgICAgICA9IEFWX0NMQVNTX0NBVEVHT1JZX0ZJTFRFUiwgXAorICAgIC5jaGlsZF9jbGFzc19uZXh0ID0gbmFtZSMjX2NoaWxkX2NsYXNzX25leHQsIFwKKyAgICAuY2hpbGRfbmV4dCAgICAgICA9IG5hbWUjI19jaGlsZF9uZXh0LCBcCit9CiAKICNlbmRpZiAvKiBBVkZJTFRFUl9GUkFNRVNZTkNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvZ3JhcGhkdW1wLmMgYi9saWJhdmZpbHRlci9ncmFwaGR1bXAuYwppbmRleCA1MzFiYjU3Li43Mzc3NzE5IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9ncmFwaGR1bXAuYworKysgYi9saWJhdmZpbHRlci9ncmFwaGR1bXAuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCi0jaW5jbHVkZSAiYXZmaWx0ZXJncmFwaC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKIHN0YXRpYyBpbnQgcHJpbnRfbGlua19wcm9wKEFWQlByaW50ICpidWYsIEFWRmlsdGVyTGluayAqbGluaykKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2dyYXBocGFyc2VyLmMgYi9saWJhdmZpbHRlci9ncmFwaHBhcnNlci5jCmluZGV4IGQ5ZjQwZDYuLmQ5MmI1MzYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL2dyYXBocGFyc2VyLmMKKysrIGIvbGliYXZmaWx0ZXIvZ3JhcGhwYXJzZXIuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogCi0jZGVmaW5lIFdISVRFU1BBQ0VTICIgXG5cdCIKKyNkZWZpbmUgV0hJVEVTUEFDRVMgIiBcblx0XHIiCiAKIC8qKgogICogTGluayB0d28gZmlsdGVycyB0b2dldGhlci4KQEAgLTg4LDIwICs4OCwzNiBAQAogICogQHBhcmFtIGZpbHRfY3R4IHB1dCBoZXJlIGEgZmlsdGVyIGNvbnRleHQgaW4gY2FzZSBvZiBzdWNjZXNzZnVsIGNyZWF0aW9uIGFuZCBjb25maWd1cmF0aW9uLCBOVUxMIG90aGVyd2lzZS4KICAqIEBwYXJhbSBjdHggdGhlIGZpbHRlcmdyYXBoIGNvbnRleHQKICAqIEBwYXJhbSBpbmRleCBhbiBpbmRleCB3aGljaCBpcyBzdXBwb3NlZCB0byBiZSB1bmlxdWUgZm9yIGVhY2ggZmlsdGVyIGluc3RhbmNlIGFkZGVkIHRvIHRoZSBmaWx0ZXJncmFwaAotICogQHBhcmFtIGZpbHRfbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsdGVyIHRvIGNyZWF0ZQorICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbHRlciB0byBjcmVhdGUsIGNhbiBiZSBmaWx0ZXIgbmFtZSBvciBmaWx0ZXJfbmFtZVxAaWQgYXMgaW5zdGFuY2UgbmFtZQogICogQHBhcmFtIGFyZ3MgdGhlIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZmlsdGVyIGR1cmluZyBpdHMgaW5pdGlhbGl6YXRpb24KICAqIEBwYXJhbSBsb2dfY3R4IHRoZSBsb2cgY29udGV4dCB0byB1c2UKICAqIEByZXR1cm4gPj0gMCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG90aGVyd2lzZQogICovCiBzdGF0aWMgaW50IGNyZWF0ZV9maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICoqZmlsdF9jdHgsIEFWRmlsdGVyR3JhcGggKmN0eCwgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbHRfbmFtZSwgY29uc3QgY2hhciAqYXJncywgdm9pZCAqbG9nX2N0eCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICphcmdzLCB2b2lkICpsb2dfY3R4KQogewotICAgIEFWRmlsdGVyICpmaWx0OwotICAgIGNoYXIgaW5zdF9uYW1lWzMwXTsKKyAgICBjb25zdCBBVkZpbHRlciAqZmlsdDsKKyAgICBjaGFyIG5hbWUyWzMwXTsKKyAgICBjb25zdCBjaGFyICppbnN0X25hbWUgPSBOVUxMLCAqZmlsdF9uYW1lID0gTlVMTDsKICAgICBjaGFyICp0bXBfYXJncyA9IE5VTEw7Ci0gICAgaW50IHJldDsKKyAgICBpbnQgcmV0LCBrOwogCi0gICAgc25wcmludGYoaW5zdF9uYW1lLCBzaXplb2YoaW5zdF9uYW1lKSwgIlBhcnNlZF8lc18lZCIsIGZpbHRfbmFtZSwgaW5kZXgpOworICAgIGF2X3N0cmxjcHkobmFtZTIsIG5hbWUsIHNpemVvZihuYW1lMikpOworCisgICAgZm9yIChrID0gMDsgbmFtZTJba107IGsrKykgeworICAgICAgICBpZiAobmFtZTJba10gPT0gJ0AnICYmIG5hbWVbaysxXSkgeworICAgICAgICAgICAgbmFtZTJba10gPSAwOworICAgICAgICAgICAgaW5zdF9uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIGZpbHRfbmFtZSA9IG5hbWUyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWluc3RfbmFtZSkgeworICAgICAgICBzbnByaW50ZihuYW1lMiwgc2l6ZW9mKG5hbWUyKSwgIlBhcnNlZF8lc18lZCIsIG5hbWUsIGluZGV4KTsKKyAgICAgICAgaW5zdF9uYW1lID0gbmFtZTI7CisgICAgICAgIGZpbHRfbmFtZSA9IG5hbWU7CisgICAgfQogCiAgICAgZmlsdCA9IGF2ZmlsdGVyX2dldF9ieV9uYW1lKGZpbHRfbmFtZSk7CiAKQEAgLTE2NSwxMiArMTgxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIHZvaWQgKmxvZ19jdHgpCiB7CiAgICAgY2hhciAqb3B0cyA9IE5VTEw7Ci0gICAgY2hhciAqbmFtZSA9IGF2X2dldF90b2tlbihidWYsICI9LDtbXG4iKTsKKyAgICBjaGFyICpuYW1lID0gYXZfZ2V0X3Rva2VuKGJ1ZiwgIj0sO1siKTsKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKCoqYnVmID09ICc9JykgewogICAgICAgICAoKmJ1ZikrKzsKLSAgICAgICAgb3B0cyA9IGF2X2dldF90b2tlbihidWYsICJbXSw7XG4iKTsKKyAgICAgICAgb3B0cyA9IGF2X2dldF90b2tlbihidWYsICJbXSw7Iik7CiAgICAgfQogCiAgICAgcmV0ID0gY3JlYXRlX2ZpbHRlcihmaWx0X2N0eCwgZ3JhcGgsIGluZGV4LCBuYW1lLCBvcHRzLCBsb2dfY3R4KTsKQEAgLTM1NCw3ICszNzAsNyBAQAogICAgICAgICAgICAgYXZfZnJlZXAoJm1hdGNoKTsKICAgICAgICAgICAgIGF2X2ZyZWVwKCZpbnB1dCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBOb3QgaW4gdGhlIGxpc3QsIHNvIGFkZCB0aGUgZmlyc3QgaW5wdXQgYXMgYSBvcGVuX291dHB1dCAqLworICAgICAgICAgICAgLyogTm90IGluIHRoZSBsaXN0LCBzbyBhZGQgdGhlIGZpcnN0IGlucHV0IGFzIGFuIG9wZW5fb3V0cHV0ICovCiAgICAgICAgICAgICBpbnB1dC0+bmFtZSA9IG5hbWU7CiAgICAgICAgICAgICBpbnNlcnRfaW5vdXQob3Blbl9vdXRwdXRzLCBpbnB1dCk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2hmbGlwLmggYi9saWJhdmZpbHRlci9oZmxpcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDA5MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9oZmxpcC5oCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgQmVub2l0IEZvdWV0CisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU3RlZmFubyBTYWJhdGluaQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0hGTElQX0gKKyNkZWZpbmUgQVZGSUxURVJfSEZMSVBfSAorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRmxpcENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBtYXhfc3RlcFs0XTsgICAgLy8vPCBtYXggcGl4ZWwgc3RlcCBmb3IgZWFjaCBwbGFuZSwgZXhwcmVzc2VkIGFzIGEgbnVtYmVyIG9mIGJ5dGVzCisgICAgaW50IHBsYW5ld2lkdGhbNF07ICAvLy88IHdpZHRoIG9mIGVhY2ggcGxhbmUKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07IC8vLzwgaGVpZ2h0IG9mIGVhY2ggcGxhbmUKKworICAgIHZvaWQgKCpmbGlwX2xpbmVbNF0pKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgdyk7Cit9IEZsaXBDb250ZXh0OworCitpbnQgZmZfaGZsaXBfaW5pdChGbGlwQ29udGV4dCAqcywgaW50IHN0ZXBbNF0sIGludCBuYl9wbGFuZXMpOwordm9pZCBmZl9oZmxpcF9pbml0X3g4NihGbGlwQ29udGV4dCAqcywgaW50IHN0ZXBbNF0sIGludCBuYl9wbGFuZXMpOworCisjZW5kaWYgLyogQVZGSUxURVJfSEZMSVBfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvaW50ZXJsYWNlLmggYi9saWJhdmZpbHRlci9pbnRlcmxhY2UuaAppbmRleCA0NGYxZTA2Li5iNDFmMGQ1IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9pbnRlcmxhY2UuaAorKysgYi9saWJhdmZpbHRlci9pbnRlcmxhY2UuaApAQCAtMjUsOSArMjUsMTEgQEAKICNpZm5kZWYgQVZGSUxURVJfSU5URVJMQUNFX0gKICNkZWZpbmUgQVZGSUxURVJfSU5URVJMQUNFX0gKIAorI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKIAogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgpAQCAtNDQsMTUgKzQ2LDIzIEBACiAgICAgRklFTERfTE9XRVIgPSAxLAogfTsKIAorZW51bSBWTFBGaWx0ZXIgeworICAgIFZMUEZfT0ZGID0gMCwKKyAgICBWTFBGX0xJTiA9IDEsCisgICAgVkxQRl9DTVAgPSAyLAorfTsKKwogdHlwZWRlZiBzdHJ1Y3QgSW50ZXJsYWNlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgZW51bSBTY2FuTW9kZSBzY2FuOyAgICAvLyB0b3Agb3IgYm90dG9tIGZpZWxkIGZpcnN0IHNjYW5uaW5nCi0gICAgaW50IGxvd3Bhc3M7ICAgICAgICAgICAvLyBlbmFibGUgb3IgZGlzYWJsZSBsb3cgcGFzcyBmaWx0ZXJuaW5nCisgICAgaW50IGxvd3Bhc3M7ICAgICAgICAgICAvLyBlbmFibGUgb3IgZGlzYWJsZSBsb3cgcGFzcyBmaWx0ZXJpbmcKICAgICBBVkZyYW1lICpjdXIsICpuZXh0OyAgIC8vIHRoZSB0d28gZnJhbWVzIGZyb20gd2hpY2ggdGhlIG5ldyBvbmUgaXMgb2J0YWluZWQKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmNzcDsKICAgICB2b2lkICgqbG93cGFzc19saW5lKSh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsIGNvbnN0IHVpbnQ4X3QgKnNyY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSwgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1yZWYsIHB0cmRpZmZfdCBwcmVmLCBpbnQgY2xpcF9tYXgpOwogfSBJbnRlcmxhY2VDb250ZXh0OwogCi12b2lkIGZmX2ludGVybGFjZV9pbml0X3g4NihJbnRlcmxhY2VDb250ZXh0ICppbnRlcmxhY2UpOwordm9pZCBmZl9pbnRlcmxhY2VfaW5pdChJbnRlcmxhY2VDb250ZXh0ICppbnRlcmxhY2UsIGludCBkZXB0aCk7Cit2b2lkIGZmX2ludGVybGFjZV9pbml0X3g4NihJbnRlcmxhY2VDb250ZXh0ICppbnRlcmxhY2UsIGludCBkZXB0aCk7CiAKICNlbmRpZiAvKiBBVkZJTFRFUl9JTlRFUkxBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvaW50ZXJuYWwuaCBiL2xpYmF2ZmlsdGVyL2ludGVybmFsLmgKaW5kZXggNzY5ZTY1Yi4uNDk4YmQzMyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvaW50ZXJuYWwuaAorKysgYi9saWJhdmZpbHRlci9pbnRlcm5hbC5oCkBAIC0yNiwxMyArMjYsMTQgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCi0jaW5jbHVkZSAiYXZmaWx0ZXJncmFwaC5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKICNpbmNsdWRlICJmcmFtZXBvb2wuaCIKKyNpbmNsdWRlICJmcmFtZXF1ZXVlLmgiCiAjaW5jbHVkZSAidGhyZWFkLmgiCiAjaW5jbHVkZSAidmVyc2lvbi5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgogCiB0eXBlZGVmIHN0cnVjdCBBVkZpbHRlckNvbW1hbmQgewogICAgIGRvdWJsZSB0aW1lOyAgICAgICAgICAgICAgICAvLy88IHRpbWUgZXhwcmVzc2VkIGluIHNlY29uZHMKQEAgLTE0Nyw2ICsxNDgsNyBAQAogc3RydWN0IEFWRmlsdGVyR3JhcGhJbnRlcm5hbCB7CiAgICAgdm9pZCAqdGhyZWFkOwogICAgIGF2ZmlsdGVyX2V4ZWN1dGVfZnVuYyAqdGhyZWFkX2V4ZWN1dGU7CisgICAgRkZGcmFtZVF1ZXVlR2xvYmFsIGZyYW1lX3F1ZXVlczsKIH07CiAKIHN0cnVjdCBBVkZpbHRlckludGVybmFsIHsKQEAgLTI0NSwxNCArMjQ3LDYgQEAKIAogLyogbWlzYyB0cmFjZSBmdW5jdGlvbnMgKi8KIAotLyogI2RlZmluZSBGRl9BVkZJTFRFUl9UUkFDRSAqLwotCi0jaWZkZWYgRkZfQVZGSUxURVJfVFJBQ0UKLSMgICAgZGVmaW5lIGZmX3Rsb2cocGN0eCwgLi4uKSBhdl9sb2cocGN0eCwgQVZfTE9HX0RFQlVHLCBfX1ZBX0FSR1NfXykKLSNlbHNlCi0jICAgIGRlZmluZSBmZl90bG9nKHBjdHgsIC4uLikgZG8geyBpZiAoMCkgYXZfbG9nKHBjdHgsIEFWX0xPR19ERUJVRywgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQotI2VuZGlmCi0KICNkZWZpbmUgRkZfVFBSSU5URl9TVEFSVChjdHgsIGZ1bmMpIGZmX3Rsb2coTlVMTCwgIiUtMTZzOiAiLCAjZnVuYykKIAogY2hhciAqZmZfZ2V0X3JlZl9wZXJtc19zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmX3NpemUsIGludCBwZXJtcyk7CkBAIC0zMDcsNiArMzAxLDkgQEAKIC8qKgogICogUmVxdWVzdCBhbiBpbnB1dCBmcmFtZSBmcm9tIHRoZSBmaWx0ZXIgYXQgdGhlIG90aGVyIGVuZCBvZiB0aGUgbGluay4KICAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIHVzZWQgYnkgZmlsdGVycyB1c2luZyB0aGUgYWN0aXZhdGUgY2FsbGJhY2ssCisgKiB1c2UgZmZfbGlua19zZXRfZnJhbWVfd2FudGVkKCkgaW5zdGVhZC4KKyAqCiAgKiBUaGUgaW5wdXQgZmlsdGVyIG1heSBwYXNzIHRoZSByZXF1ZXN0IG9uIHRvIGl0cyBpbnB1dHMsIGZ1bGZpbGwgdGhlCiAgKiByZXF1ZXN0IGZyb20gYW4gaW50ZXJuYWwgYnVmZmVyIG9yIGFueSBvdGhlciBtZWFucyBzcGVjaWZpYyB0byBpdHMgZnVuY3Rpb24uCiAgKgpAQCAtMzM0LDggKzMzMSw2IEBACiAgKi8KIGludCBmZl9yZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqbGluayk7CiAKLWludCBmZl9yZXF1ZXN0X2ZyYW1lX3RvX2ZpbHRlcihBVkZpbHRlckxpbmsgKmxpbmspOwotCiAjZGVmaW5lIEFWRklMVEVSX0RFRklORV9DTEFTUyhmbmFtZSkgICAgICAgICAgICBcCiAgICAgc3RhdGljIGNvbnN0IEFWQ2xhc3MgZm5hbWUjI19jbGFzcyA9IHsgICAgICBcCiAgICAgICAgIC5jbGFzc19uYW1lID0gI2ZuYW1lLCAgICAgICAgICAgICAgICAgICBcCkBAIC0zNzYsMTIgKzM3MSwyMCBAQAogICovCiBBVkZpbHRlckNvbnRleHQgKmZmX2ZpbHRlcl9hbGxvYyhjb25zdCBBVkZpbHRlciAqZmlsdGVyLCBjb25zdCBjaGFyICppbnN0X25hbWUpOwogCitpbnQgZmZfZmlsdGVyX2FjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqZmlsdGVyKTsKKwogLyoqCiAgKiBSZW1vdmUgYSBmaWx0ZXIgZnJvbSBhIGdyYXBoOwogICovCiB2b2lkIGZmX2ZpbHRlcl9ncmFwaF9yZW1vdmVfZmlsdGVyKEFWRmlsdGVyR3JhcGggKmdyYXBoLCBBVkZpbHRlckNvbnRleHQgKmZpbHRlcik7CiAKIC8qKgorICogVGhlIGZpbHRlciBpcyBhd2FyZSBvZiBoYXJkd2FyZSBmcmFtZXMsIGFuZCBhbnkgaGFyZHdhcmUgZnJhbWUgY29udGV4dAorICogc2hvdWxkIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHByb3BhZ2F0ZWQgdGhyb3VnaCBpdC4KKyAqLworI2RlZmluZSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFICgxIDw8IDApCisKKy8qKgogICogUnVuIG9uZSByb3VuZCBvZiBwcm9jZXNzaW5nIG9uIGEgZmlsdGVyIGdyYXBoLgogICovCiBpbnQgZmZfZmlsdGVyX2dyYXBoX3J1bl9vbmNlKEFWRmlsdGVyR3JhcGggKmdyYXBoKTsKQEAgLTQwMiw0ICs0MDUsMjYgQEAKICAgICByZXR1cm4gcXNjYWxlOwogfQogCisvKioKKyAqIEdldCBudW1iZXIgb2YgdGhyZWFkcyBmb3IgY3VycmVudCBmaWx0ZXIgaW5zdGFuY2UuCisgKiBUaGlzIG51bWJlciBpcyBhbHdheXMgc2FtZSBvciBsZXNzIHRoYW4gZ3JhcGgtPm5iX3RocmVhZHMuCisgKi8KK2ludCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpOworCisvKioKKyAqIFBlcmZvcm0gYW55IGFkZGl0aW9uYWwgc2V0dXAgcmVxdWlyZWQgZm9yIGhhcmR3YXJlIGZyYW1lcy4KKyAqCisgKiBsaW5rLT5od19mcmFtZXNfY3R4IG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgKiBJbnNpZGUgbGluay0+aHdfZnJhbWVzX2N0eCwgdGhlIGZpZWxkcyBmb3JtYXQsIHN3X2Zvcm1hdCwgd2lkdGggYW5kCisgKiBoZWlnaHQgbXVzdCBiZSBzZXQuICBJZiBkeW5hbWljYWxseSBhbGxvY2F0ZWQgcG9vbHMgYXJlIG5vdCBzdXBwb3J0ZWQsCisgKiB0aGVuIGluaXRpYWxfcG9vbF9zaXplIG11c3QgYWxzbyBiZSBzZXQsIHRvIHRoZSBtaW5pbXVtIGhhcmR3YXJlIGZyYW1lCisgKiBwb29sIHNpemUgbmVjZXNzYXJ5IGZvciB0aGUgZmlsdGVyIHRvIHdvcmsgKHRha2luZyBpbnRvIGFjY291bnQgYW55CisgKiBmcmFtZXMgd2hpY2ggbmVlZCB0byBzdG9yZWQgZm9yIHVzZSBpbiBvcGVyYXRpb25zIGFzIGFwcHJvcHJpYXRlKS4gIElmCisgKiBkZWZhdWx0X3Bvb2xfc2l6ZSBpcyBub256ZXJvLCB0aGVuIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgcG9vbCBzaXplIGlmCisgKiBubyBvdGhlciBtb2RpZmljYXRpb24gdGFrZXMgcGxhY2UgKHRoaXMgY2FuIGJlIHVzZWQgdG8gcHJlc2VydmUKKyAqIGNvbXBhdGliaWxpdHkpLgorICovCitpbnQgZmZfZmlsdGVyX2luaXRfaHdfZnJhbWVzKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgsIEFWRmlsdGVyTGluayAqbGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfcG9vbF9zaXplKTsKKwogI2VuZGlmIC8qIEFWRklMVEVSX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL2xhdmZ1dGlscy5jIGIvbGliYXZmaWx0ZXIvbGF2ZnV0aWxzLmMKaW5kZXggNzA2YmFkZi4uZGI0YjY5YiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvbGF2ZnV0aWxzLmMKKysrIGIvbGliYXZmaWx0ZXIvbGF2ZnV0aWxzLmMKQEAgLTI5LDYgKzI5LDcgQEAKICAgICBBVkZvcm1hdENvbnRleHQgKmZvcm1hdF9jdHggPSBOVUxMOwogICAgIEFWQ29kZWMgKmNvZGVjOwogICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlY19jdHg7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBBVkZyYW1lICpmcmFtZTsKICAgICBpbnQgZnJhbWVfZGVjb2RlZCwgcmV0ID0gMDsKICAgICBBVlBhY2tldCBwa3Q7CkBAIC0zNiw5ICszNyw3IEBACiAKICAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKIAotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwotCi0gICAgaWZvcm1hdCA9IGF2X2ZpbmRfaW5wdXRfZm9ybWF0KCJpbWFnZTIiKTsKKyAgICBpZm9ybWF0ID0gYXZfZmluZF9pbnB1dF9mb3JtYXQoImltYWdlMnBpcGUiKTsKICAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmZvcm1hdF9jdHgsIGZpbGVuYW1lLCBpZm9ybWF0LCBOVUxMKSkgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gaW5wdXQgZmlsZSAnJXMnXG4iLCBmaWxlbmFtZSk7CkBAIC01MCwxNCArNDksMjcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICBjb2RlY19jdHggPSBmb3JtYXRfY3R4LT5zdHJlYW1zWzBdLT5jb2RlYzsKLSAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKGNvZGVjX2N0eC0+Y29kZWNfaWQpOworICAgIHBhciA9IGZvcm1hdF9jdHgtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOworICAgIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIocGFyLT5jb2RlY19pZCk7CiAgICAgaWYgKCFjb2RlYykgewogICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmQgY29kZWNcbiIpOwogICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIGdvdG8gZW5kOwogICAgIH0KIAorICAgIGNvZGVjX2N0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoY29kZWMpOworICAgIGlmICghY29kZWNfY3R4KSB7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2MgdmlkZW8gZGVjb2RlciBjb250ZXh0XG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChjb2RlY19jdHgsIHBhcik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjb3B5IGNvZGVjIHBhcmFtZXRlcnMgdG8gZGVjb2RlciBjb250ZXh0XG4iKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCiAgICAgYXZfZGljdF9zZXQoJm9wdCwgInRocmVhZF90eXBlIiwgInNsaWNlIiwgMCk7CiAgICAgaWYgKChyZXQgPSBhdmNvZGVjX29wZW4yKGNvZGVjX2N0eCwgY29kZWMsICZvcHQpKSA8IDApIHsKICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIGNvZGVjXG4iKTsKQEAgLTk2LDcgKzEwOCw3IEBACiAKIGVuZDoKICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7Ci0gICAgYXZjb2RlY19jbG9zZShjb2RlY19jdHgpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZjb2RlY19jdHgpOwogICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZmb3JtYXRfY3R4KTsKICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CiAgICAgYXZfZGljdF9mcmVlKCZvcHQpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvbGliYXZmaWx0ZXIudiBiL2xpYmF2ZmlsdGVyL2xpYmF2ZmlsdGVyLnYKaW5kZXggODNlODg4Ny4uNjUxOGU1ZiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvbGliYXZmaWx0ZXIudgorKysgYi9saWJhdmZpbHRlci9saWJhdmZpbHRlci52CkBAIC0xLDQgKzEsNyBAQAotTElCQVZGSUxURVJfJE1BSk9SIHsKLSAgICAgICAgZ2xvYmFsOiBhdmZpbHRlcl8qOyBhdl8qOwotICAgICAgICBsb2NhbDogKjsKK0xJQkFWRklMVEVSX01BSk9SIHsKKyAgICBnbG9iYWw6CisgICAgICAgIGF2ZmlsdGVyXyo7CisgICAgICAgIGF2Xyo7CisgICAgbG9jYWw6CisgICAgICAgICo7CiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvbGltaXRlci5oIGIvbGliYXZmaWx0ZXIvbGltaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZDQyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9saW1pdGVyLmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX0xJTUlURVJfSAorI2RlZmluZSBBVkZJTFRFUl9MSU1JVEVSX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit0eXBlZGVmIHN0cnVjdCBMaW1pdGVyRFNQQ29udGV4dCB7CisgICAgdm9pZCAoKmxpbWl0ZXIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc2xpbmVzaXplLCBwdHJkaWZmX3QgZGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBtaW4sIGludCBtYXgpOworfSBMaW1pdGVyRFNQQ29udGV4dDsKKwordm9pZCBmZl9saW1pdGVyX2luaXRfeDg2KExpbWl0ZXJEU1BDb250ZXh0ICpkc3AsIGludCBicHApOworCisjZW5kaWYgLyogQVZGSUxURVJfTElNSVRFUl9IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9tYXNrZWRtZXJnZS5oIGIvbGliYXZmaWx0ZXIvbWFza2VkbWVyZ2UuaAppbmRleCBhOGM3NTUxLi44ZTJiMWNmIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci9tYXNrZWRtZXJnZS5oCisrKyBiL2xpYmF2ZmlsdGVyL21hc2tlZG1lcmdlLmgKQEAgLTI3LDYgKzI3LDcgQEAKIHR5cGVkZWYgc3RydWN0IE1hc2tlZE1lcmdlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IHdpZHRoWzRdLCBoZWlnaHRbNF07CisgICAgaW50IGxpbmVzaXplWzRdOwogICAgIGludCBuYl9wbGFuZXM7CiAgICAgaW50IHBsYW5lczsKICAgICBpbnQgaGFsZiwgZGVwdGg7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9tb3Rpb25fZXN0aW1hdGlvbi5jIGIvbGliYXZmaWx0ZXIvbW90aW9uX2VzdGltYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjliYTIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvbW90aW9uX2VzdGltYXRpb24uYwpAQCAtMCwwICsxLDQzMiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgRGF2aW5kZXIgU2luZ2ggKERTTV8pIDxkcy5tdWRoYXI8QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgIm1vdGlvbl9lc3RpbWF0aW9uLmgiCisKK3N0YXRpYyBjb25zdCBpbnQ4X3Qgc3FyMVs4XVsyXSAgPSB7eyAwLC0xfSwgeyAwLCAxfSwgey0xLCAwfSwgeyAxLCAwfSwgey0xLC0xfSwgey0xLCAxfSwgeyAxLC0xfSwgeyAxLCAxfX07CitzdGF0aWMgY29uc3QgaW50OF90IGRpYTFbNF1bMl0gID0ge3stMSwgMH0sIHsgMCwtMX0sIHsgMSwgMH0sIHsgMCwgMX19Oworc3RhdGljIGNvbnN0IGludDhfdCBkaWEyWzhdWzJdICA9IHt7LTIsIDB9LCB7LTEsLTF9LCB7IDAsLTJ9LCB7IDEsLTF9LCB7IDIsIDB9LCB7IDEsIDF9LCB7IDAsIDJ9LCB7LTEsIDF9fTsKK3N0YXRpYyBjb25zdCBpbnQ4X3QgaGV4Mls2XVsyXSAgPSB7ey0yLCAwfSwgey0xLC0yfSwgey0xLCAyfSwgeyAxLC0yfSwgeyAxLCAyfSwgeyAyLCAwfX07CitzdGF0aWMgY29uc3QgaW50OF90IGhleDRbMTZdWzJdID0ge3stNCwtMn0sIHstNCwtMX0sIHstNCwgMH0sIHstNCwgMX0sIHstNCwgMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgNCwtMn0sIHsgNCwtMX0sIHsgNCwgMH0sIHsgNCwgMX0sIHsgNCwgMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMiwgM30sIHsgMCwgNH0sIHsgMiwgM30sIHstMiwtM30sIHsgMCwtNH0sIHsgMiwtM319OworCisjZGVmaW5lIENPU1RfTVYoeCwgeSlcCitkbyB7XAorICAgIGNvc3QgPSBtZV9jdHgtPmdldF9jb3N0KG1lX2N0eCwgeF9tYiwgeV9tYiwgeCwgeSk7XAorICAgIGlmIChjb3N0IDwgY29zdF9taW4pIHtcCisgICAgICAgIGNvc3RfbWluID0gY29zdDtcCisgICAgICAgIG12WzBdID0geDtcCisgICAgICAgIG12WzFdID0geTtcCisgICAgfVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBDT1NUX1BfTVYoeCwgeSlcCitpZiAoeCA+PSB4X21pbiAmJiB4IDw9IHhfbWF4ICYmIHkgPj0geV9taW4gJiYgeSA8PSB5X21heClcCisgICAgQ09TVF9NVih4LCB5KTsKKwordm9pZCBmZl9tZV9pbml0X2NvbnRleHQoQVZNb3Rpb25Fc3RDb250ZXh0ICptZV9jdHgsIGludCBtYl9zaXplLCBpbnQgc2VhcmNoX3BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeF9taW4sIGludCB4X21heCwgaW50IHlfbWluLCBpbnQgeV9tYXgpCit7CisgICAgbWVfY3R4LT53aWR0aCA9IHdpZHRoOworICAgIG1lX2N0eC0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIG1lX2N0eC0+bWJfc2l6ZSA9IG1iX3NpemU7CisgICAgbWVfY3R4LT5zZWFyY2hfcGFyYW0gPSBzZWFyY2hfcGFyYW07CisgICAgbWVfY3R4LT5nZXRfY29zdCA9ICZmZl9tZV9jbXBfc2FkOworICAgIG1lX2N0eC0+eF9taW4gPSB4X21pbjsKKyAgICBtZV9jdHgtPnhfbWF4ID0geF9tYXg7CisgICAgbWVfY3R4LT55X21pbiA9IHlfbWluOworICAgIG1lX2N0eC0+eV9tYXggPSB5X21heDsKK30KKwordWludDY0X3QgZmZfbWVfY21wX3NhZChBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgeF9tdiwgaW50IHlfbXYpCit7CisgICAgY29uc3QgaW50IGxpbmVzaXplID0gbWVfY3R4LT5saW5lc2l6ZTsKKyAgICB1aW50OF90ICpkYXRhX3JlZiA9IG1lX2N0eC0+ZGF0YV9yZWY7CisgICAgdWludDhfdCAqZGF0YV9jdXIgPSBtZV9jdHgtPmRhdGFfY3VyOworICAgIHVpbnQ2NF90IHNhZCA9IDA7CisgICAgaW50IGksIGo7CisKKyAgICBkYXRhX3JlZiArPSB5X212ICogbGluZXNpemU7CisgICAgZGF0YV9jdXIgKz0geV9tYiAqIGxpbmVzaXplOworCisgICAgZm9yIChqID0gMDsgaiA8IG1lX2N0eC0+bWJfc2l6ZTsgaisrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWVfY3R4LT5tYl9zaXplOyBpKyspCisgICAgICAgICAgICBzYWQgKz0gRkZBQlMoZGF0YV9yZWZbeF9tdiArIGkgKyBqICogbGluZXNpemVdIC0gZGF0YV9jdXJbeF9tYiArIGkgKyBqICogbGluZXNpemVdKTsKKworICAgIHJldHVybiBzYWQ7Cit9CisKK3VpbnQ2NF90IGZmX21lX3NlYXJjaF9lc2EoQVZNb3Rpb25Fc3RDb250ZXh0ICptZV9jdHgsIGludCB4X21iLCBpbnQgeV9tYiwgaW50ICptdikKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgeF9taW4gPSBGRk1BWChtZV9jdHgtPnhfbWluLCB4X21iIC0gbWVfY3R4LT5zZWFyY2hfcGFyYW0pOworICAgIGludCB5X21pbiA9IEZGTUFYKG1lX2N0eC0+eV9taW4sIHlfbWIgLSBtZV9jdHgtPnNlYXJjaF9wYXJhbSk7CisgICAgaW50IHhfbWF4ID0gRkZNSU4oeF9tYiArIG1lX2N0eC0+c2VhcmNoX3BhcmFtLCBtZV9jdHgtPnhfbWF4KTsKKyAgICBpbnQgeV9tYXggPSBGRk1JTih5X21iICsgbWVfY3R4LT5zZWFyY2hfcGFyYW0sIG1lX2N0eC0+eV9tYXgpOworICAgIHVpbnQ2NF90IGNvc3QsIGNvc3RfbWluOworCisgICAgaWYgKCEoY29zdF9taW4gPSBtZV9jdHgtPmdldF9jb3N0KG1lX2N0eCwgeF9tYiwgeV9tYiwgeF9tYiwgeV9tYikpKQorICAgICAgICByZXR1cm4gY29zdF9taW47CisKKyAgICBmb3IgKHkgPSB5X21pbjsgeSA8PSB5X21heDsgeSsrKQorICAgICAgICBmb3IgKHggPSB4X21pbjsgeCA8PSB4X21heDsgeCsrKQorICAgICAgICAgICAgQ09TVF9NVih4LCB5KTsKKworICAgIHJldHVybiBjb3N0X21pbjsKK30KKwordWludDY0X3QgZmZfbWVfc2VhcmNoX3RzcyhBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgKm12KQoreworICAgIGludCB4LCB5OworICAgIGludCB4X21pbiA9IEZGTUFYKG1lX2N0eC0+eF9taW4sIHhfbWIgLSBtZV9jdHgtPnNlYXJjaF9wYXJhbSk7CisgICAgaW50IHlfbWluID0gRkZNQVgobWVfY3R4LT55X21pbiwgeV9tYiAtIG1lX2N0eC0+c2VhcmNoX3BhcmFtKTsKKyAgICBpbnQgeF9tYXggPSBGRk1JTih4X21iICsgbWVfY3R4LT5zZWFyY2hfcGFyYW0sIG1lX2N0eC0+eF9tYXgpOworICAgIGludCB5X21heCA9IEZGTUlOKHlfbWIgKyBtZV9jdHgtPnNlYXJjaF9wYXJhbSwgbWVfY3R4LT55X21heCk7CisgICAgdWludDY0X3QgY29zdCwgY29zdF9taW47CisgICAgaW50IHN0ZXAgPSBST1VOREVEX0RJVihtZV9jdHgtPnNlYXJjaF9wYXJhbSwgMik7CisgICAgaW50IGk7CisKKyAgICBtdlswXSA9IHhfbWI7CisgICAgbXZbMV0gPSB5X21iOworCisgICAgaWYgKCEoY29zdF9taW4gPSBtZV9jdHgtPmdldF9jb3N0KG1lX2N0eCwgeF9tYiwgeV9tYiwgeF9tYiwgeV9tYikpKQorICAgICAgICByZXR1cm4gY29zdF9taW47CisKKyAgICBkbyB7CisgICAgICAgIHggPSBtdlswXTsKKyAgICAgICAgeSA9IG12WzFdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBDT1NUX1BfTVYoeCArIHNxcjFbaV1bMF0gKiBzdGVwLCB5ICsgc3FyMVtpXVsxXSAqIHN0ZXApOworCisgICAgICAgIHN0ZXAgPSBzdGVwID4+IDE7CisKKyAgICB9IHdoaWxlIChzdGVwID4gMCk7CisKKyAgICByZXR1cm4gY29zdF9taW47Cit9CisKK3VpbnQ2NF90IGZmX21lX3NlYXJjaF90ZGxzKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeF9tYiwgaW50IHlfbWIsIGludCAqbXYpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHhfbWluID0gRkZNQVgobWVfY3R4LT54X21pbiwgeF9tYiAtIG1lX2N0eC0+c2VhcmNoX3BhcmFtKTsKKyAgICBpbnQgeV9taW4gPSBGRk1BWChtZV9jdHgtPnlfbWluLCB5X21iIC0gbWVfY3R4LT5zZWFyY2hfcGFyYW0pOworICAgIGludCB4X21heCA9IEZGTUlOKHhfbWIgKyBtZV9jdHgtPnNlYXJjaF9wYXJhbSwgbWVfY3R4LT54X21heCk7CisgICAgaW50IHlfbWF4ID0gRkZNSU4oeV9tYiArIG1lX2N0eC0+c2VhcmNoX3BhcmFtLCBtZV9jdHgtPnlfbWF4KTsKKyAgICB1aW50NjRfdCBjb3N0LCBjb3N0X21pbjsKKyAgICBpbnQgc3RlcCA9IFJPVU5ERURfRElWKG1lX2N0eC0+c2VhcmNoX3BhcmFtLCAyKTsKKyAgICBpbnQgaTsKKworICAgIG12WzBdID0geF9tYjsKKyAgICBtdlsxXSA9IHlfbWI7CisKKyAgICBpZiAoIShjb3N0X21pbiA9IG1lX2N0eC0+Z2V0X2Nvc3QobWVfY3R4LCB4X21iLCB5X21iLCB4X21iLCB5X21iKSkpCisgICAgICAgIHJldHVybiBjb3N0X21pbjsKKworICAgIGRvIHsKKyAgICAgICAgeCA9IG12WzBdOworICAgICAgICB5ID0gbXZbMV07CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIENPU1RfUF9NVih4ICsgZGlhMVtpXVswXSAqIHN0ZXAsIHkgKyBkaWExW2ldWzFdICogc3RlcCk7CisKKyAgICAgICAgaWYgKHggPT0gbXZbMF0gJiYgeSA9PSBtdlsxXSkKKyAgICAgICAgICAgIHN0ZXAgPSBzdGVwID4+IDE7CisKKyAgICB9IHdoaWxlIChzdGVwID4gMCk7CisKKyAgICByZXR1cm4gY29zdF9taW47Cit9CisKK3VpbnQ2NF90IGZmX21lX3NlYXJjaF9udHNzKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeF9tYiwgaW50IHlfbWIsIGludCAqbXYpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHhfbWluID0gRkZNQVgobWVfY3R4LT54X21pbiwgeF9tYiAtIG1lX2N0eC0+c2VhcmNoX3BhcmFtKTsKKyAgICBpbnQgeV9taW4gPSBGRk1BWChtZV9jdHgtPnlfbWluLCB5X21iIC0gbWVfY3R4LT5zZWFyY2hfcGFyYW0pOworICAgIGludCB4X21heCA9IEZGTUlOKHhfbWIgKyBtZV9jdHgtPnNlYXJjaF9wYXJhbSwgbWVfY3R4LT54X21heCk7CisgICAgaW50IHlfbWF4ID0gRkZNSU4oeV9tYiArIG1lX2N0eC0+c2VhcmNoX3BhcmFtLCBtZV9jdHgtPnlfbWF4KTsKKyAgICB1aW50NjRfdCBjb3N0LCBjb3N0X21pbjsKKyAgICBpbnQgc3RlcCA9IFJPVU5ERURfRElWKG1lX2N0eC0+c2VhcmNoX3BhcmFtLCAyKTsKKyAgICBpbnQgZmlyc3Rfc3RlcCA9IDE7CisgICAgaW50IGk7CisKKyAgICBtdlswXSA9IHhfbWI7CisgICAgbXZbMV0gPSB5X21iOworCisgICAgaWYgKCEoY29zdF9taW4gPSBtZV9jdHgtPmdldF9jb3N0KG1lX2N0eCwgeF9tYiwgeV9tYiwgeF9tYiwgeV9tYikpKQorICAgICAgICByZXR1cm4gY29zdF9taW47CisKKyAgICBkbyB7CisgICAgICAgIHggPSBtdlswXTsKKyAgICAgICAgeSA9IG12WzFdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICBDT1NUX1BfTVYoeCArIHNxcjFbaV1bMF0gKiBzdGVwLCB5ICsgc3FyMVtpXVsxXSAqIHN0ZXApOworCisgICAgICAgIC8qIGFkZGl0aW9uIHRvIFRTUyBpbiBOVFNTICovCisgICAgICAgIGlmIChmaXJzdF9zdGVwKSB7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisgICAgICAgICAgICAgICAgQ09TVF9QX01WKHggKyBzcXIxW2ldWzBdLCB5ICsgc3FyMVtpXVsxXSk7CisKKyAgICAgICAgICAgIGlmICh4ID09IG12WzBdICYmIHkgPT0gbXZbMV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvc3RfbWluOworCisgICAgICAgICAgICBpZiAoRkZBQlMoeCAtIG12WzBdKSA8PSAxICYmIEZGQUJTKHkgLSBtdlsxXSkgPD0gMSkgeworICAgICAgICAgICAgICAgIHggPSBtdlswXTsKKyAgICAgICAgICAgICAgICB5ID0gbXZbMV07CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgICAgICAgICBDT1NUX1BfTVYoeCArIHNxcjFbaV1bMF0sIHkgKyBzcXIxW2ldWzFdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29zdF9taW47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpcnN0X3N0ZXAgPSAwOworICAgICAgICB9CisKKyAgICAgICAgc3RlcCA9IHN0ZXAgPj4gMTsKKworICAgIH0gd2hpbGUgKHN0ZXAgPiAwKTsKKworICAgIHJldHVybiBjb3N0X21pbjsKK30KKwordWludDY0X3QgZmZfbWVfc2VhcmNoX2ZzcyhBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgKm12KQoreworICAgIGludCB4LCB5OworICAgIGludCB4X21pbiA9IEZGTUFYKG1lX2N0eC0+eF9taW4sIHhfbWIgLSBtZV9jdHgtPnNlYXJjaF9wYXJhbSk7CisgICAgaW50IHlfbWluID0gRkZNQVgobWVfY3R4LT55X21pbiwgeV9tYiAtIG1lX2N0eC0+c2VhcmNoX3BhcmFtKTsKKyAgICBpbnQgeF9tYXggPSBGRk1JTih4X21iICsgbWVfY3R4LT5zZWFyY2hfcGFyYW0sIG1lX2N0eC0+eF9tYXgpOworICAgIGludCB5X21heCA9IEZGTUlOKHlfbWIgKyBtZV9jdHgtPnNlYXJjaF9wYXJhbSwgbWVfY3R4LT55X21heCk7CisgICAgdWludDY0X3QgY29zdCwgY29zdF9taW47CisgICAgaW50IHN0ZXAgPSAyOworICAgIGludCBpOworCisgICAgbXZbMF0gPSB4X21iOworICAgIG12WzFdID0geV9tYjsKKworICAgIGlmICghKGNvc3RfbWluID0gbWVfY3R4LT5nZXRfY29zdChtZV9jdHgsIHhfbWIsIHlfbWIsIHhfbWIsIHlfbWIpKSkKKyAgICAgICAgcmV0dXJuIGNvc3RfbWluOworCisgICAgZG8geworICAgICAgICB4ID0gbXZbMF07CisgICAgICAgIHkgPSBtdlsxXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorICAgICAgICAgICAgQ09TVF9QX01WKHggKyBzcXIxW2ldWzBdICogc3RlcCwgeSArIHNxcjFbaV1bMV0gKiBzdGVwKTsKKworICAgICAgICBpZiAoeCA9PSBtdlswXSAmJiB5ID09IG12WzFdKQorICAgICAgICAgICAgc3RlcCA9IHN0ZXAgPj4gMTsKKworICAgIH0gd2hpbGUgKHN0ZXAgPiAwKTsKKworICAgIHJldHVybiBjb3N0X21pbjsKK30KKwordWludDY0X3QgZmZfbWVfc2VhcmNoX2RzKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeF9tYiwgaW50IHlfbWIsIGludCAqbXYpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHhfbWluID0gRkZNQVgobWVfY3R4LT54X21pbiwgeF9tYiAtIG1lX2N0eC0+c2VhcmNoX3BhcmFtKTsKKyAgICBpbnQgeV9taW4gPSBGRk1BWChtZV9jdHgtPnlfbWluLCB5X21iIC0gbWVfY3R4LT5zZWFyY2hfcGFyYW0pOworICAgIGludCB4X21heCA9IEZGTUlOKHhfbWIgKyBtZV9jdHgtPnNlYXJjaF9wYXJhbSwgbWVfY3R4LT54X21heCk7CisgICAgaW50IHlfbWF4ID0gRkZNSU4oeV9tYiArIG1lX2N0eC0+c2VhcmNoX3BhcmFtLCBtZV9jdHgtPnlfbWF4KTsKKyAgICB1aW50NjRfdCBjb3N0LCBjb3N0X21pbjsKKyAgICBpbnQgaTsKKyAgICBhdl91bnVzZWQgaW50IGRpcl94LCBkaXJfeTsKKworICAgIGlmICghKGNvc3RfbWluID0gbWVfY3R4LT5nZXRfY29zdChtZV9jdHgsIHhfbWIsIHlfbWIsIHhfbWIsIHlfbWIpKSkKKyAgICAgICAgcmV0dXJuIGNvc3RfbWluOworCisgICAgeCA9IHhfbWI7IHkgPSB5X21iOworICAgIGRpcl94ID0gZGlyX3kgPSAwOworCisgICAgZG8geworICAgICAgICB4ID0gbXZbMF07CisgICAgICAgIHkgPSBtdlsxXTsKKworI2lmIDEKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKyAgICAgICAgICAgIENPU1RfUF9NVih4ICsgZGlhMltpXVswXSwgeSArIGRpYTJbaV1bMV0pOworI2Vsc2UKKyAgICAgICAgLyogdGhpcyB2ZXJzaW9uIHNraXBzIHByZXZpb3VzbHkgZXhhbWluZWQgMyBvciA1IGxvY2F0aW9ucyBiYXNlZCBvbiBwcmV2IG9yaWdpbiAqLworICAgICAgICBpZiAoZGlyX3ggPD0gMCkKKyAgICAgICAgICAgIENPU1RfUF9NVih4IC0gMiwgeSk7CisgICAgICAgIGlmIChkaXJfeCA8PSAwICYmIGRpcl95IDw9IDApCisgICAgICAgICAgICBDT1NUX1BfTVYoeCAtIDEsIHkgLSAxKTsKKyAgICAgICAgaWYgKGRpcl95IDw9IDApCisgICAgICAgICAgICBDT1NUX1BfTVYoeCwgeSAtIDIpOworICAgICAgICBpZiAoZGlyX3ggPj0gMCAmJiBkaXJfeSA8PSAwKQorICAgICAgICAgICAgQ09TVF9QX01WKHggKyAxLCB5IC0gMSk7CisgICAgICAgIGlmIChkaXJfeCA+PSAwKQorICAgICAgICAgICAgQ09TVF9QX01WKHggKyAyLCB5KTsKKyAgICAgICAgaWYgKGRpcl94ID49IDAgJiYgZGlyX3kgPj0gMCkKKyAgICAgICAgICAgIENPU1RfUF9NVih4ICsgMSwgeSArIDEpOworICAgICAgICBpZiAoZGlyX3kgPj0gMCkKKyAgICAgICAgICAgIENPU1RfUF9NVih4LCB5ICsgMik7CisgICAgICAgIGlmIChkaXJfeCA8PSAwICYmIGRpcl95ID49IDApCisgICAgICAgICAgICBDT1NUX1BfTVYoeCAtIDEsIHkgKyAxKTsKKworICAgICAgICBkaXJfeCA9IG12WzBdIC0geDsKKyAgICAgICAgZGlyX3kgPSBtdlsxXSAtIHk7CisjZW5kaWYKKworICAgIH0gd2hpbGUgKHggIT0gbXZbMF0gfHwgeSAhPSBtdlsxXSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBDT1NUX1BfTVYoeCArIGRpYTFbaV1bMF0sIHkgKyBkaWExW2ldWzFdKTsKKworICAgIHJldHVybiBjb3N0X21pbjsKK30KKwordWludDY0X3QgZmZfbWVfc2VhcmNoX2hleGJzKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeF9tYiwgaW50IHlfbWIsIGludCAqbXYpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHhfbWluID0gRkZNQVgobWVfY3R4LT54X21pbiwgeF9tYiAtIG1lX2N0eC0+c2VhcmNoX3BhcmFtKTsKKyAgICBpbnQgeV9taW4gPSBGRk1BWChtZV9jdHgtPnlfbWluLCB5X21iIC0gbWVfY3R4LT5zZWFyY2hfcGFyYW0pOworICAgIGludCB4X21heCA9IEZGTUlOKHhfbWIgKyBtZV9jdHgtPnNlYXJjaF9wYXJhbSwgbWVfY3R4LT54X21heCk7CisgICAgaW50IHlfbWF4ID0gRkZNSU4oeV9tYiArIG1lX2N0eC0+c2VhcmNoX3BhcmFtLCBtZV9jdHgtPnlfbWF4KTsKKyAgICB1aW50NjRfdCBjb3N0LCBjb3N0X21pbjsKKyAgICBpbnQgaTsKKworICAgIGlmICghKGNvc3RfbWluID0gbWVfY3R4LT5nZXRfY29zdChtZV9jdHgsIHhfbWIsIHlfbWIsIHhfbWIsIHlfbWIpKSkKKyAgICAgICAgcmV0dXJuIGNvc3RfbWluOworCisgICAgZG8geworICAgICAgICB4ID0gbXZbMF07CisgICAgICAgIHkgPSBtdlsxXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgQ09TVF9QX01WKHggKyBoZXgyW2ldWzBdLCB5ICsgaGV4MltpXVsxXSk7CisKKyAgICB9IHdoaWxlICh4ICE9IG12WzBdIHx8IHkgIT0gbXZbMV0pOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgQ09TVF9QX01WKHggKyBkaWExW2ldWzBdLCB5ICsgZGlhMVtpXVsxXSk7CisKKyAgICByZXR1cm4gY29zdF9taW47Cit9CisKKy8qIHR3byBzdWJzZXRzIG9mIHByZWRpY3RvcnMgYXJlIHVzZWQKKyAgIG1lLT5wcmVkX3h8eSBpcyBzZXQgdG8gbWVkaWFuIG9mIGN1cnJlbnQgZnJhbWUncyBsZWZ0LCB0b3AsIHRvcC1yaWdodAorICAgc2V0IDE6IG1lLT5wcmVkc1swXSBoYXM6ICgwLCAwKSwgbGVmdCwgdG9wLCB0b3AtcmlnaHQsIGNvbGxvY2F0ZWQgYmxvY2sgaW4gcHJldiBmcmFtZQorICAgc2V0IDI6IG1lLT5wcmVkc1sxXSBoYXM6IGFjY2VsZXJhdG9yIG12LCB0b3AsIGxlZnQsIHJpZ2h0LCBib3R0b20gYWRqIG1iIG9mIHByZXYgZnJhbWUKKyovCit1aW50NjRfdCBmZl9tZV9zZWFyY2hfZXB6cyhBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgKm12KQoreworICAgIGludCB4LCB5OworICAgIGludCB4X21pbiA9IEZGTUFYKG1lX2N0eC0+eF9taW4sIHhfbWIgLSBtZV9jdHgtPnNlYXJjaF9wYXJhbSk7CisgICAgaW50IHlfbWluID0gRkZNQVgobWVfY3R4LT55X21pbiwgeV9tYiAtIG1lX2N0eC0+c2VhcmNoX3BhcmFtKTsKKyAgICBpbnQgeF9tYXggPSBGRk1JTih4X21iICsgbWVfY3R4LT5zZWFyY2hfcGFyYW0sIG1lX2N0eC0+eF9tYXgpOworICAgIGludCB5X21heCA9IEZGTUlOKHlfbWIgKyBtZV9jdHgtPnNlYXJjaF9wYXJhbSwgbWVfY3R4LT55X21heCk7CisgICAgdWludDY0X3QgY29zdCwgY29zdF9taW47CisgICAgaW50IGk7CisKKyAgICBBVk1vdGlvbkVzdFByZWRpY3RvciAqcHJlZHMgPSBtZV9jdHgtPnByZWRzOworCisgICAgY29zdF9taW4gPSBVSU5UNjRfTUFYOworCisgICAgQ09TVF9QX01WKHhfbWIgKyBtZV9jdHgtPnByZWRfeCwgeV9tYiArIG1lX2N0eC0+cHJlZF95KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwcmVkc1swXS5uYjsgaSsrKQorICAgICAgICBDT1NUX1BfTVYoeF9tYiArIHByZWRzWzBdLm12c1tpXVswXSwgeV9tYiArIHByZWRzWzBdLm12c1tpXVsxXSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcHJlZHNbMV0ubmI7IGkrKykKKyAgICAgICAgQ09TVF9QX01WKHhfbWIgKyBwcmVkc1sxXS5tdnNbaV1bMF0sIHlfbWIgKyBwcmVkc1sxXS5tdnNbaV1bMV0pOworCisgICAgZG8geworICAgICAgICB4ID0gbXZbMF07CisgICAgICAgIHkgPSBtdlsxXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgQ09TVF9QX01WKHggKyBkaWExW2ldWzBdLCB5ICsgZGlhMVtpXVsxXSk7CisKKyAgICB9IHdoaWxlICh4ICE9IG12WzBdIHx8IHkgIT0gbXZbMV0pOworCisgICAgcmV0dXJuIGNvc3RfbWluOworfQorCisvKiByZXF1aXJlZCBwcmVkaWN0b3Igb3JkZXI6IG1lZGlhbiwgKDAsMCksIGxlZnQsIHRvcCwgdG9wLXJpZ2h0CisgICBydWxlcyB3aGVuIG1iIG5vdCBhdmFpbGFibGU6CisgICByZXBsYWNlIGxlZnQgd2l0aCAoMCwgMCkKKyAgIHJlcGxhY2UgdG9wLXJpZ2h0IHdpdGggdG9wLWxlZnQKKyAgIHJlcGxhY2UgdG9wIHR3byB3aXRoIGxlZnQKKyAgIHJlcGVhdGVkIGNhbiBiZSBza2lwcGVkLCBpZiBubyBwcmVkaWN0b3JzIGFyZSB1c2VkLCBzZXQgbWVfY3R4LT5wcmVkIHRvICgwLDApCisqLwordWludDY0X3QgZmZfbWVfc2VhcmNoX3VtaChBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgKm12KQoreworICAgIGludCB4LCB5OworICAgIGludCB4X21pbiA9IEZGTUFYKG1lX2N0eC0+eF9taW4sIHhfbWIgLSBtZV9jdHgtPnNlYXJjaF9wYXJhbSk7CisgICAgaW50IHlfbWluID0gRkZNQVgobWVfY3R4LT55X21pbiwgeV9tYiAtIG1lX2N0eC0+c2VhcmNoX3BhcmFtKTsKKyAgICBpbnQgeF9tYXggPSBGRk1JTih4X21iICsgbWVfY3R4LT5zZWFyY2hfcGFyYW0sIG1lX2N0eC0+eF9tYXgpOworICAgIGludCB5X21heCA9IEZGTUlOKHlfbWIgKyBtZV9jdHgtPnNlYXJjaF9wYXJhbSwgbWVfY3R4LT55X21heCk7CisgICAgdWludDY0X3QgY29zdCwgY29zdF9taW47CisgICAgaW50IGQsIGk7CisgICAgaW50IGVuZF94LCBlbmRfeTsKKworICAgIEFWTW90aW9uRXN0UHJlZGljdG9yICpwcmVkID0gJm1lX2N0eC0+cHJlZHNbMF07CisKKyAgICBjb3N0X21pbiA9IFVJTlQ2NF9NQVg7CisKKyAgICBDT1NUX1BfTVYoeF9tYiArIG1lX2N0eC0+cHJlZF94LCB5X21iICsgbWVfY3R4LT5wcmVkX3kpOworCisgICAgZm9yIChpID0gMDsgaSA8IHByZWQtPm5iOyBpKyspCisgICAgICAgIENPU1RfUF9NVih4X21iICsgcHJlZC0+bXZzW2ldWzBdLCB5X21iICsgcHJlZC0+bXZzW2ldWzFdKTsKKworICAgIC8vIFVuc3ltbWV0cmljYWwtY3Jvc3MgU2VhcmNoCisgICAgeCA9IG12WzBdOworICAgIHkgPSBtdlsxXTsKKyAgICBmb3IgKGQgPSAxOyBkIDw9IG1lX2N0eC0+c2VhcmNoX3BhcmFtOyBkICs9IDIpIHsKKyAgICAgICAgQ09TVF9QX01WKHggLSBkLCB5KTsKKyAgICAgICAgQ09TVF9QX01WKHggKyBkLCB5KTsKKyAgICAgICAgaWYgKGQgPD0gbWVfY3R4LT5zZWFyY2hfcGFyYW0gLyAyKSB7CisgICAgICAgICAgICBDT1NUX1BfTVYoeCwgeSAtIGQpOworICAgICAgICAgICAgQ09TVF9QX01WKHgsIHkgKyBkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVuZXZlbiBNdWx0aS1IZXhhZ29uLUdyaWQgU2VhcmNoCisgICAgZW5kX3ggPSBGRk1JTihtdlswXSArIDIsIHhfbWF4KTsKKyAgICBlbmRfeSA9IEZGTUlOKG12WzFdICsgMiwgeV9tYXgpOworICAgIGZvciAoeSA9IEZGTUFYKHlfbWluLCBtdlsxXSAtIDIpOyB5IDw9IGVuZF95OyB5KyspCisgICAgICAgIGZvciAoeCA9IEZGTUFYKHhfbWluLCBtdlswXSAtIDIpOyB4IDw9IGVuZF94OyB4KyspCisgICAgICAgICAgICBDT1NUX1BfTVYoeCwgeSk7CisKKyAgICB4ID0gbXZbMF07CisgICAgeSA9IG12WzFdOworICAgIGZvciAoZCA9IDE7IGQgPD0gbWVfY3R4LT5zZWFyY2hfcGFyYW0gLyA0OyBkKyspCisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgaSsrKQorICAgICAgICAgICAgQ09TVF9QX01WKHggKyBoZXg0W2ldWzBdICogZCwgeSArIGhleDRbaV1bMV0gKiBkKTsKKworICAgIC8vIEV4dGVuZGVkIEhleGFnb24tYmFzZWQgU2VhcmNoCisgICAgZG8geworICAgICAgICB4ID0gbXZbMF07CisgICAgICAgIHkgPSBtdlsxXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQorICAgICAgICAgICAgQ09TVF9QX01WKHggKyBoZXgyW2ldWzBdLCB5ICsgaGV4MltpXVsxXSk7CisKKyAgICB9IHdoaWxlICh4ICE9IG12WzBdIHx8IHkgIT0gbXZbMV0pOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgQ09TVF9QX01WKHggKyBkaWExW2ldWzBdLCB5ICsgZGlhMVtpXVsxXSk7CisKKyAgICByZXR1cm4gY29zdF9taW47Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9tb3Rpb25fZXN0aW1hdGlvbi5oIGIvbGliYXZmaWx0ZXIvbW90aW9uX2VzdGltYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWUyOWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvbW90aW9uX2VzdGltYXRpb24uaApAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNiBEYXZpbmRlciBTaW5naCAoRFNNXykgPGRzLm11ZGhhcjxAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX01PVElPTl9FU1RJTUFUSU9OX0gKKyNkZWZpbmUgQVZGSUxURVJfTU9USU9OX0VTVElNQVRJT05fSAorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorCisjZGVmaW5lIEFWX01FX01FVEhPRF9FU0EgICAgICAgIDEKKyNkZWZpbmUgQVZfTUVfTUVUSE9EX1RTUyAgICAgICAgMgorI2RlZmluZSBBVl9NRV9NRVRIT0RfVERMUyAgICAgICAzCisjZGVmaW5lIEFWX01FX01FVEhPRF9OVFNTICAgICAgIDQKKyNkZWZpbmUgQVZfTUVfTUVUSE9EX0ZTUyAgICAgICAgNQorI2RlZmluZSBBVl9NRV9NRVRIT0RfRFMgICAgICAgICA2CisjZGVmaW5lIEFWX01FX01FVEhPRF9IRVhCUyAgICAgIDcKKyNkZWZpbmUgQVZfTUVfTUVUSE9EX0VQWlMgICAgICAgOAorI2RlZmluZSBBVl9NRV9NRVRIT0RfVU1IICAgICAgICA5CisKK3R5cGVkZWYgc3RydWN0IEFWTW90aW9uRXN0UHJlZGljdG9yIHsKKyAgICBpbnQgbXZzWzEwXVsyXTsKKyAgICBpbnQgbmI7Cit9IEFWTW90aW9uRXN0UHJlZGljdG9yOworCit0eXBlZGVmIHN0cnVjdCBBVk1vdGlvbkVzdENvbnRleHQgeworICAgIHVpbnQ4X3QgKmRhdGFfY3VyLCAqZGF0YV9yZWY7CisgICAgaW50IGxpbmVzaXplOworCisgICAgaW50IG1iX3NpemU7CisgICAgaW50IHNlYXJjaF9wYXJhbTsKKworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworCisgICAgaW50IHhfbWluOworICAgIGludCB4X21heDsKKyAgICBpbnQgeV9taW47CisgICAgaW50IHlfbWF4OworCisgICAgaW50IHByZWRfeDsgICAgIC8vLzwgbWVkaWFuIHByZWRpY3RvciB4CisgICAgaW50IHByZWRfeTsgICAgIC8vLzwgbWVkaWFuIHByZWRpY3RvciB5CisgICAgQVZNb3Rpb25Fc3RQcmVkaWN0b3IgcHJlZHNbMl07CisKKyAgICB1aW50NjRfdCAoKmdldF9jb3N0KShzdHJ1Y3QgQVZNb3Rpb25Fc3RDb250ZXh0ICptZV9jdHgsIGludCB4X21iLCBpbnQgeV9tYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXZfeCwgaW50IG12X3kpOworfSBBVk1vdGlvbkVzdENvbnRleHQ7CisKK3ZvaWQgZmZfbWVfaW5pdF9jb250ZXh0KEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgbWJfc2l6ZSwgaW50IHNlYXJjaF9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHhfbWluLCBpbnQgeF9tYXgsIGludCB5X21pbiwgaW50IHlfbWF4KTsKKwordWludDY0X3QgZmZfbWVfY21wX3NhZChBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgeF9tdiwgaW50IHlfbXYpOworCit1aW50NjRfdCBmZl9tZV9zZWFyY2hfZXNhKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeF9tYiwgaW50IHlfbWIsIGludCAqbXYpOworCit1aW50NjRfdCBmZl9tZV9zZWFyY2hfdHNzKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeF9tYiwgaW50IHlfbWIsIGludCAqbXYpOworCit1aW50NjRfdCBmZl9tZV9zZWFyY2hfdGRscyhBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgKm12KTsKKwordWludDY0X3QgZmZfbWVfc2VhcmNoX250c3MoQVZNb3Rpb25Fc3RDb250ZXh0ICptZV9jdHgsIGludCB4X21iLCBpbnQgeV9tYiwgaW50ICptdik7CisKK3VpbnQ2NF90IGZmX21lX3NlYXJjaF9mc3MoQVZNb3Rpb25Fc3RDb250ZXh0ICptZV9jdHgsIGludCB4X21iLCBpbnQgeV9tYiwgaW50ICptdik7CisKK3VpbnQ2NF90IGZmX21lX3NlYXJjaF9kcyhBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgKm12KTsKKwordWludDY0X3QgZmZfbWVfc2VhcmNoX2hleGJzKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeF9tYiwgaW50IHlfbWIsIGludCAqbXYpOworCit1aW50NjRfdCBmZl9tZV9zZWFyY2hfZXB6cyhBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgKm12KTsKKwordWludDY0X3QgZmZfbWVfc2VhcmNoX3VtaChBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCwgaW50IHhfbWIsIGludCB5X21iLCBpbnQgKm12KTsKKworI2VuZGlmIC8qIEFWRklMVEVSX01PVElPTl9FU1RJTUFUSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL29wZW5jbC5jIGIvbGliYXZmaWx0ZXIvb3BlbmNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2MTY2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL29wZW5jbC5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfb3BlbmNsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJvcGVuY2wuaCIKKworaW50IGZmX29wZW5jbF9maWx0ZXJfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIGNvbnN0IHN0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9PUEVOQ0wsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0czsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGF2Y3R4LCBmb3JtYXRzKTsKK30KKworc3RhdGljIGludCBvcGVuY2xfZmlsdGVyX3NldF9kZXZpY2UoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpkZXZpY2UpCit7CisgICAgT3BlbkNMRmlsdGVyQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+ZGV2aWNlX3JlZik7CisKKyAgICBjdHgtPmRldmljZV9yZWYgPSBhdl9idWZmZXJfcmVmKGRldmljZSk7CisgICAgaWYgKCFjdHgtPmRldmljZV9yZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBjdHgtPmRldmljZSA9IChBVkhXRGV2aWNlQ29udGV4dCopY3R4LT5kZXZpY2VfcmVmLT5kYXRhOworICAgIGN0eC0+aHdjdHggID0gY3R4LT5kZXZpY2UtPmh3Y3R4OworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9vcGVuY2xfZmlsdGVyX2NvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAqYXZjdHggPSBpbmxpbmstPmRzdDsKKyAgICBPcGVuQ0xGaWx0ZXJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqaW5wdXRfZnJhbWVzOworICAgIGludCBlcnI7CisKKyAgICBpZiAoIWlubGluay0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBmaWx0ZXJpbmcgcmVxdWlyZXMgYSAiCisgICAgICAgICAgICAgICAiaGFyZHdhcmUgZnJhbWVzIGNvbnRleHQgb24gdGhlIGlucHV0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8gRXh0cmFjdCB0aGUgZGV2aWNlIGFuZCBkZWZhdWx0IG91dHB1dCBmb3JtYXQgZnJvbSB0aGUgZmlyc3QgaW5wdXQuCisgICAgaWYgKGF2Y3R4LT5pbnB1dHNbMF0gIT0gaW5saW5rKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlucHV0X2ZyYW1lcyA9IChBVkhXRnJhbWVzQ29udGV4dCopaW5saW5rLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgIGlmIChpbnB1dF9mcmFtZXMtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX09QRU5DTCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGVyciA9IG9wZW5jbF9maWx0ZXJfc2V0X2RldmljZShhdmN0eCwgaW5wdXRfZnJhbWVzLT5kZXZpY2VfcmVmKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIC8vIERlZmF1bHQgb3V0cHV0IHBhcmFtZXRlcnMgbWF0Y2ggaW5wdXQgcGFyYW1ldGVycy4KKyAgICBpZiAoY3R4LT5vdXRwdXRfZm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgY3R4LT5vdXRwdXRfZm9ybWF0ID0gaW5wdXRfZnJhbWVzLT5zd19mb3JtYXQ7CisgICAgaWYgKCFjdHgtPm91dHB1dF93aWR0aCkKKyAgICAgICAgY3R4LT5vdXRwdXRfd2lkdGggID0gaW5saW5rLT53OworICAgIGlmICghY3R4LT5vdXRwdXRfaGVpZ2h0KQorICAgICAgICBjdHgtPm91dHB1dF9oZWlnaHQgPSBpbmxpbmstPmg7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX29wZW5jbF9maWx0ZXJfY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgKmF2Y3R4ID0gb3V0bGluay0+c3JjOworICAgIE9wZW5DTEZpbHRlckNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIEFWQnVmZmVyUmVmICAgICAgICpvdXRwdXRfZnJhbWVzX3JlZiA9IE5VTEw7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKm91dHB1dF9mcmFtZXM7CisgICAgaW50IGVycjsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmb3V0bGluay0+aHdfZnJhbWVzX2N0eCk7CisKKyAgICBpZiAoIWN0eC0+ZGV2aWNlX3JlZikgeworICAgICAgICBpZiAoIWF2Y3R4LT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBmaWx0ZXJpbmcgcmVxdWlyZXMgYW4gIgorICAgICAgICAgICAgICAgICAgICJPcGVuQ0wgZGV2aWNlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gb3BlbmNsX2ZpbHRlcl9zZXRfZGV2aWNlKGF2Y3R4LCBhdmN0eC0+aHdfZGV2aWNlX2N0eCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBvdXRwdXRfZnJhbWVzX3JlZiA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGN0eC0+ZGV2aWNlX3JlZik7CisgICAgaWYgKCFvdXRwdXRfZnJhbWVzX3JlZikgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgb3V0cHV0X2ZyYW1lcyA9IChBVkhXRnJhbWVzQ29udGV4dCopb3V0cHV0X2ZyYW1lc19yZWYtPmRhdGE7CisKKyAgICBvdXRwdXRfZnJhbWVzLT5mb3JtYXQgICAgPSBBVl9QSVhfRk1UX09QRU5DTDsKKyAgICBvdXRwdXRfZnJhbWVzLT5zd19mb3JtYXQgPSBjdHgtPm91dHB1dF9mb3JtYXQ7CisgICAgb3V0cHV0X2ZyYW1lcy0+d2lkdGggICAgID0gY3R4LT5vdXRwdXRfd2lkdGg7CisgICAgb3V0cHV0X2ZyYW1lcy0+aGVpZ2h0ICAgID0gY3R4LT5vdXRwdXRfaGVpZ2h0OworCisgICAgZXJyID0gYXZfaHdmcmFtZV9jdHhfaW5pdChvdXRwdXRfZnJhbWVzX3JlZik7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdGlhbGlzZSBvdXRwdXQgIgorICAgICAgICAgICAgICAgImZyYW1lczogJWQuXG4iLCBlcnIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb3V0bGluay0+aHdfZnJhbWVzX2N0eCA9IG91dHB1dF9mcmFtZXNfcmVmOworICAgIG91dGxpbmstPncgPSBjdHgtPm91dHB1dF93aWR0aDsKKyAgICBvdXRsaW5rLT5oID0gY3R4LT5vdXRwdXRfaGVpZ2h0OworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2J1ZmZlcl91bnJlZigmb3V0cHV0X2ZyYW1lc19yZWYpOworICAgIHJldHVybiBlcnI7Cit9CisKK2ludCBmZl9vcGVuY2xfZmlsdGVyX2luaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBPcGVuQ0xGaWx0ZXJDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKworICAgIGN0eC0+b3V0cHV0X2Zvcm1hdCA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX29wZW5jbF9maWx0ZXJfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgT3BlbkNMRmlsdGVyQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgY2xfaW50IGNsZTsKKworICAgIGlmIChjdHgtPnByb2dyYW0pIHsKKyAgICAgICAgY2xlID0gY2xSZWxlYXNlUHJvZ3JhbShjdHgtPnByb2dyYW0pOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlICIKKyAgICAgICAgICAgICAgICAgICAicHJvZ3JhbTogJWQuXG4iLCBjbGUpOworICAgIH0KKworICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5kZXZpY2VfcmVmKTsKK30KKworaW50IGZmX29wZW5jbF9maWx0ZXJfbG9hZF9wcm9ncmFtKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnByb2dyYW1fc291cmNlX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zdHJpbmdzKQoreworICAgIE9wZW5DTEZpbHRlckNvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIGNsX2ludCBjbGU7CisKKyAgICBjdHgtPnByb2dyYW0gPSBjbENyZWF0ZVByb2dyYW1XaXRoU291cmNlKGN0eC0+aHdjdHgtPmNvbnRleHQsIG5iX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtX3NvdXJjZV9hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZjbGUpOworICAgIGlmICghY3R4LT5wcm9ncmFtKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBwcm9ncmFtOiAlZC5cbiIsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgY2xlID0gY2xCdWlsZFByb2dyYW0oY3R4LT5wcm9ncmFtLCAxLCAmY3R4LT5od2N0eC0+ZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBidWlsZCBwcm9ncmFtOiAlZC5cbiIsIGNsZSk7CisKKyAgICAgICAgaWYgKGNsZSA9PSBDTF9CVUlMRF9QUk9HUkFNX0ZBSUxVUkUpIHsKKyAgICAgICAgICAgIGNoYXIgKmxvZzsKKyAgICAgICAgICAgIHNpemVfdCBsb2dfbGVuZ3RoOworCisgICAgICAgICAgICBjbEdldFByb2dyYW1CdWlsZEluZm8oY3R4LT5wcm9ncmFtLCBjdHgtPmh3Y3R4LT5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfUFJPR1JBTV9CVUlMRF9MT0csIDAsIE5VTEwsICZsb2dfbGVuZ3RoKTsKKworICAgICAgICAgICAgbG9nID0gYXZfbWFsbG9jKGxvZ19sZW5ndGgpOworICAgICAgICAgICAgaWYgKGxvZykgeworICAgICAgICAgICAgICAgIGNsZSA9IGNsR2V0UHJvZ3JhbUJ1aWxkSW5mbyhjdHgtPnByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+aHdjdHgtPmRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfUFJPR1JBTV9CVUlMRF9MT0csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19sZW5ndGgsIGxvZywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKGNsZSA9PSBDTF9TVUNDRVNTKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkJ1aWxkIGxvZzpcbiVzXG4iLCBsb2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9mcmVlKGxvZyk7CisgICAgICAgIH0KKworICAgICAgICBjbFJlbGVhc2VQcm9ncmFtKGN0eC0+cHJvZ3JhbSk7CisgICAgICAgIGN0eC0+cHJvZ3JhbSA9IE5VTEw7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9vcGVuY2xfZmlsdGVyX2xvYWRfcHJvZ3JhbV9mcm9tX2ZpbGUoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgRklMRSAqZmlsZTsKKyAgICBjaGFyICpzcmMgPSBOVUxMOworICAgIHNpemVfdCBwb3MsIGxlbiwgcmI7CisgICAgY29uc3QgY2hhciAqc3JjX2NvbnN0OworICAgIGludCBlcnI7CisKKyAgICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgaWYgKCFmaWxlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG9wZW4gcHJvZ3JhbSAiCisgICAgICAgICAgICAgICAic291cmNlIGZpbGUgXCIlc1wiLlxuIiwgZmlsZW5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOworICAgIH0KKworICAgIGxlbiA9IDEgPDwgMTY7CisgICAgcG9zID0gMDsKKworICAgIGVyciA9IGF2X3JlYWxsb2NwKCZzcmMsIGxlbik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IHNucHJpbnRmKHNyYywgbGVuLCAiI2xpbmUgMSBcIiVzXCJcbiIsIGZpbGVuYW1lKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoZXJyID4gbGVuIC8gMikgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgcG9zID0gZXJyOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcmIgPSBmcmVhZChzcmMgKyBwb3MsIDEsIGxlbiAtIHBvcyAtIDEsIGZpbGUpOworICAgICAgICBpZiAocmIgPT0gMCAmJiBmZXJyb3IoZmlsZSkpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBwb3MgKz0gcmI7CisgICAgICAgIGlmIChwb3MgPCBsZW4pCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGVuIDw8PSAxOworICAgICAgICBlcnIgPSBhdl9yZWFsbG9jcCgmc3JjLCBsZW4pOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgc3JjW3Bvc10gPSAwOworCisgICAgc3JjX2NvbnN0ID0gc3JjOworCisgICAgZXJyID0gZmZfb3BlbmNsX2ZpbHRlcl9sb2FkX3Byb2dyYW0oYXZjdHgsICZzcmNfY29uc3QsIDEpOworZmFpbDoKKyAgICBmY2xvc2UoZmlsZSk7CisgICAgYXZfZnJlZXAoJnNyYyk7CisgICAgcmV0dXJuIGVycjsKK30KKworaW50IGZmX29wZW5jbF9maWx0ZXJfd29ya19zaXplX2Zyb21faW1hZ2UoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqd29ya19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIGludCBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19hbGlnbm1lbnQpCit7CisgICAgY2xfbWVtIGltYWdlOworICAgIGNsX21lbV9vYmplY3RfdHlwZSB0eXBlOworICAgIHNpemVfdCB3aWR0aCwgaGVpZ2h0OworICAgIGNsX2ludCBjbGU7CisKKyAgICBpZiAoZnJhbWUtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX09QRU5DTCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgZm9ybWF0ICVzLCAiCisgICAgICAgICAgICAgICAib3BlbmNsIHJlcXVpcmVkLlxuIiwgYXZfZ2V0X3BpeF9mbXRfbmFtZShmcmFtZS0+Zm9ybWF0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaW1hZ2UgPSAoY2xfbWVtKWZyYW1lLT5kYXRhW3BsYW5lXTsKKyAgICBpZiAoIWltYWdlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiUGxhbmUgJWQgcmVxdWlyZWQgYnV0IG5vdCBzZXQuXG4iLAorICAgICAgICAgICAgICAgcGxhbmUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGNsZSA9IGNsR2V0TWVtT2JqZWN0SW5mbyhpbWFnZSwgQ0xfTUVNX1RZUEUsIHNpemVvZih0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGUsIE5VTEwpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBvYmplY3QgdHlwZSBvZiAiCisgICAgICAgICAgICAgICAicGxhbmUgJWQ6ICVkLlxuIiwgcGxhbmUsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorICAgIGlmICh0eXBlICE9IENMX01FTV9PQkpFQ1RfSU1BR0UyRCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlBsYW5lICVkIGlzIG5vdCBhIDJEIGltYWdlLlxuIiwKKyAgICAgICAgICAgICAgIHBsYW5lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjbGUgPSBjbEdldEltYWdlSW5mbyhpbWFnZSwgQ0xfSU1BR0VfV0lEVEgsICBzaXplb2Yoc2l6ZV90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmd2lkdGgsIE5VTEwpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBwbGFuZSAlZCB3aWR0aDogJWQuXG4iLAorICAgICAgICAgICAgICAgcGxhbmUsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgY2xlID0gY2xHZXRJbWFnZUluZm8oaW1hZ2UsIENMX0lNQUdFX0hFSUdIVCwgc2l6ZW9mKHNpemVfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJmhlaWdodCwgTlVMTCk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IHBsYW5lICVkIGhlaWdodDogJWQuXG4iLAorICAgICAgICAgICAgICAgcGxhbmUsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKGJsb2NrX2FsaWdubWVudCkgeworICAgICAgICB3aWR0aCAgPSBGRkFMSUdOKHdpZHRoLCAgYmxvY2tfYWxpZ25tZW50KTsKKyAgICAgICAgaGVpZ2h0ID0gRkZBTElHTihoZWlnaHQsIGJsb2NrX2FsaWdubWVudCk7CisgICAgfQorCisgICAgd29ya19zaXplWzBdID0gd2lkdGg7CisgICAgd29ya19zaXplWzFdID0gaGVpZ2h0OworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9vcGVuY2wuaCBiL2xpYmF2ZmlsdGVyL29wZW5jbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTQ1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9vcGVuY2wuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX09QRU5DTF9ICisjZGVmaW5lIEFWRklMVEVSX09QRU5DTF9ICisKKy8vIFRoZSBpbnRlbmRlZCB0YXJnZXQgaXMgT3BlbkNMIDEuMiwgc28gZGlzYWJsZSB3YXJuaW5ncyBmb3IgQVBJcworLy8gZGVwcmVjYXRlZCBhZnRlciB0aGF0LiAgVGhpcyBwcmltYXJpbHkgYXBwbGllcyB0byBjbENyZWF0ZUNvbW1hbmRRdWV1ZSgpLAorLy8gd2UgY2FuJ3QgdXNlIHRoZSByZXBsYWNlbWVudCBjbENyZWF0ZUNvbW1hbmRRdWV1ZVdpdGhQcm9wZXJ0aWVzKCkgYmVjYXVzZQorLy8gaXQgd2FzIGludHJvZHVjZWQgaW4gT3BlbkNMIDIuMC4KKyNkZWZpbmUgQ0xfVVNFX0RFUFJFQ0FURURfT1BFTkNMXzFfMl9BUElTCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfb3BlbmNsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkNMRmlsdGVyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAgICAgKmNsYXNzOworCisgICAgQVZCdWZmZXJSZWYgICAgICAgKmRldmljZV9yZWY7CisgICAgQVZIV0RldmljZUNvbnRleHQgKmRldmljZTsKKyAgICBBVk9wZW5DTERldmljZUNvbnRleHQgKmh3Y3R4OworCisgICAgY2xfcHJvZ3JhbSAgICAgICAgIHByb2dyYW07CisKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0cHV0X2Zvcm1hdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgb3V0cHV0X3dpZHRoOworICAgIGludCAgICAgICAgICAgICAgICBvdXRwdXRfaGVpZ2h0OworfSBPcGVuQ0xGaWx0ZXJDb250ZXh0OworCisvKioKKyAqIFJldHVybiB0aGF0IGFsbCBpbnB1dHMgYW5kIG91dHB1dHMgc3VwcG9ydCBvbmx5IEFWX1BJWF9GTVRfT1BFTkNMLgorICovCitpbnQgZmZfb3BlbmNsX2ZpbHRlcl9xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpOworCisvKioKKyAqIENoZWNrIHRoYXQgdGhlIGlucHV0IGxpbmsgY29udGFpbnMgYSBzdWl0YWJsZSBoYXJkd2FyZSBmcmFtZXMKKyAqIGNvbnRleHQgYW5kIGV4dHJhY3QgdGhlIGRldmljZSBmcm9tIGl0LgorICovCitpbnQgZmZfb3BlbmNsX2ZpbHRlcl9jb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspOworCisvKioKKyAqIENyZWF0ZSBhIHN1aXRhYmxlIGhhcmR3YXJlIGZyYW1lcyBjb250ZXh0IGZvciB0aGUgb3V0cHV0LgorICovCitpbnQgZmZfb3BlbmNsX2ZpbHRlcl9jb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluayk7CisKKy8qKgorICogSW5pdGlhbGlzZSBhbiBPcGVuQ0wgZmlsdGVyIGNvbnRleHQuCisgKi8KK2ludCBmZl9vcGVuY2xfZmlsdGVyX2luaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCk7CisKKy8qKgorICogVW5pbml0aWFsaXNlIGFuIE9wZW5DTCBmaWx0ZXIgY29udGV4dC4KKyAqLwordm9pZCBmZl9vcGVuY2xfZmlsdGVyX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KTsKKworLyoqCisgKiBMb2FkIGEgbmV3IE9wZW5DTCBwcm9ncmFtIGZyb20gc3RyaW5ncyBpbiBtZW1vcnkuCisgKgorICogQ3JlYXRlcyBhIG5ldyBwcm9ncmFtIGFuZCBjb21waWxlcyBpdCBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLgorICogV2lsbCBsb2cgYW55IGJ1aWxkIGVycm9ycyBpZiBjb21waWxhdGlvbiBmYWlscy4KKyAqLworaW50IGZmX29wZW5jbF9maWx0ZXJfbG9hZF9wcm9ncmFtKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKnByb2dyYW1fc291cmNlX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9zdHJpbmdzKTsKKworLyoqCisgKiBMb2FkIGEgbmV3IE9wZW5DTCBwcm9ncmFtIGZyb20gYSBmaWxlLgorICoKKyAqIFNhbWUgYXMgZmZfb3BlbmNsX2ZpbHRlcl9sb2FkX3Byb2dyYW0oKSwgYnV0IGZyb20gYSBmaWxlLgorICovCitpbnQgZmZfb3BlbmNsX2ZpbHRlcl9sb2FkX3Byb2dyYW1fZnJvbV9maWxlKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKworLyoqCisgKiBGaW5kIHRoZSB3b3JrIHNpemUgbmVlZGVkIG5lZWRlZCBmb3IgYSBnaXZlbiBwbGFuZSBvZiBhbiBpbWFnZS4KKyAqLworaW50IGZmX29wZW5jbF9maWx0ZXJfd29ya19zaXplX2Zyb21faW1hZ2UoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqd29ya19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZnJhbWUsIGludCBwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19hbGlnbm1lbnQpOworCisjZW5kaWYgLyogQVZGSUxURVJfT1BFTkNMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL29wZW5jbC9hdmdibHVyLmNsIGIvbGliYXZmaWx0ZXIvb3BlbmNsL2F2Z2JsdXIuY2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4ZDcwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL29wZW5jbC9hdmdibHVyLmNsCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggRHlsYW4gRmVybmFuZG8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworCitfX2tlcm5lbCB2b2lkIGF2Z2JsdXJfaG9yaXooX193cml0ZV9vbmx5IGltYWdlMmRfdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZWFkX29ubHkgIGltYWdlMmRfdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhZCkKK3sKKyAgICBjb25zdCBzYW1wbGVyX3Qgc2FtcGxlciA9IChDTEtfTk9STUFMSVpFRF9DT09SRFNfRkFMU0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMS19GSUxURVJfTkVBUkVTVCk7CisgICAgaW50MiBsb2MgPSAoaW50MikoZ2V0X2dsb2JhbF9pZCgwKSwgZ2V0X2dsb2JhbF9pZCgxKSk7CisgICAgaW50MiBzaXplID0gKGludDIpKGdldF9nbG9iYWxfc2l6ZSgwKSwgZ2V0X2dsb2JhbF9zaXplKDEpKTsKKworICAgIGludCBjb3VudCA9IDA7CisgICAgZmxvYXQ0IGFjYyA9IChmbG9hdDQpKDAsMCwwLDApOworCisgICAgZm9yIChpbnQgeHggPSBtYXgoMCwgbG9jLnggLSByYWQpOyB4eCA8IG1pbihsb2MueCArIHJhZCArIDEsIHNpemUueCk7IHh4KyspIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgYWNjICs9IHJlYWRfaW1hZ2VmKHNyYywgc2FtcGxlciwgKGludDIpKHh4LCBsb2MueSkpOworICAgIH0KKworICAgIHdyaXRlX2ltYWdlZihkc3QsIGxvYywgYWNjIC8gY291bnQpOworfQorCitfX2tlcm5lbCB2b2lkIGF2Z2JsdXJfdmVydChfX3dyaXRlX29ubHkgaW1hZ2UyZF90IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVhZF9vbmx5ICBpbWFnZTJkX3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJhZHYpCit7CisgICAgY29uc3Qgc2FtcGxlcl90IHNhbXBsZXIgPSAoQ0xLX05PUk1BTElaRURfQ09PUkRTX0ZBTFNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEtfRklMVEVSX05FQVJFU1QpOworICAgIGludDIgbG9jID0gKGludDIpKGdldF9nbG9iYWxfaWQoMCksIGdldF9nbG9iYWxfaWQoMSkpOworICAgIGludDIgc2l6ZSA9IChpbnQyKShnZXRfZ2xvYmFsX3NpemUoMCksIGdldF9nbG9iYWxfc2l6ZSgxKSk7CisKKyAgICBpbnQgY291bnQgPSAwOworICAgIGZsb2F0NCBhY2MgPSAoZmxvYXQ0KSgwLDAsMCwwKTsKKworICAgIGZvciAoaW50IHl5ID0gbWF4KDAsIGxvYy55IC0gcmFkdik7IHl5IDwgbWluKGxvYy55ICsgcmFkdiArIDEsIHNpemUueSk7IHl5KyspIHsKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgYWNjICs9IHJlYWRfaW1hZ2VmKHNyYywgc2FtcGxlciwgKGludDIpKGxvYy54LCB5eSkpOworICAgIH0KKworICAgIHdyaXRlX2ltYWdlZihkc3QsIGxvYywgYWNjIC8gY291bnQpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvb3BlbmNsL2NvbnZvbHV0aW9uLmNsIGIvbGliYXZmaWx0ZXIvb3BlbmNsL2NvbnZvbHV0aW9uLmNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZWY0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9vcGVuY2wvY29udm9sdXRpb24uY2wKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxOCBEYW5pbCBJYXNoY2hlbmtvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKK19fa2VybmVsIHZvaWQgY29udm9sdXRpb25fZ2xvYmFsKF9fd3JpdGVfb25seSBpbWFnZTJkX3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZWFkX29ubHkgIGltYWdlMmRfdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29lZl9tYXRyaXhfZGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb25zdGFudCBmbG9hdCAqY29lZl9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiaWFzKQoreworICAgIGNvbnN0IHNhbXBsZXJfdCBzYW1wbGVyID0gKENMS19OT1JNQUxJWkVEX0NPT1JEU19GQUxTRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xLX0FERFJFU1NfQ0xBTVBfVE9fRURHRSAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEtfRklMVEVSX05FQVJFU1QpOworCisgICAgY29uc3QgaW50IGhhbGZfbWF0cml4X2RpbSA9IChjb2VmX21hdHJpeF9kaW0gLyAyKTsKKyAgICBpbnQyIGxvYyA9IChpbnQyKShnZXRfZ2xvYmFsX2lkKDApLCBnZXRfZ2xvYmFsX2lkKDEpKTsKKyAgICBmbG9hdDQgY29udlBpeCA9IChmbG9hdDQpKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpOworCisgICAgZm9yIChpbnQgY29udl9pID0gLWhhbGZfbWF0cml4X2RpbTsgY29udl9pIDw9IGhhbGZfbWF0cml4X2RpbTsgY29udl9pKyspIHsKKyAgICAgICAgZm9yIChpbnQgY29udl9qID0gLWhhbGZfbWF0cml4X2RpbTsgY29udl9qIDw9IGhhbGZfbWF0cml4X2RpbTsgY29udl9qKyspIHsKKyAgICAgICAgICAgIGZsb2F0NCBweCA9IHJlYWRfaW1hZ2VmKHNyYywgc2FtcGxlciwgbG9jICsgKGludDIpKGNvbnZfaiwgY29udl9pKSk7CisgICAgICAgICAgICBjb252UGl4ICs9IHB4ICogY29lZl9tYXRyaXhbKGNvbnZfaSArIGhhbGZfbWF0cml4X2RpbSkgKiBjb2VmX21hdHJpeF9kaW0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb252X2ogKyBoYWxmX21hdHJpeF9kaW0pXTsKKyAgICAgICAgfQorICAgICB9CisgICAgIGZsb2F0NCBkc3RQaXggPSBjb252UGl4ICogZGl2ICsgYmlhczsKKyAgICAgd3JpdGVfaW1hZ2VmKGRzdCwgbG9jLCBkc3RQaXgpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvb3BlbmNsL292ZXJsYXkuY2wgYi9saWJhdmZpbHRlci9vcGVuY2wvb3ZlcmxheS5jbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc4M2QwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvb3BlbmNsL292ZXJsYXkuY2wKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworX19rZXJuZWwgdm9pZCBvdmVybGF5X25vX2FscGhhKF9fd3JpdGVfb25seSBpbWFnZTJkX3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVhZF9vbmx5ICBpbWFnZTJkX3QgbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlYWRfb25seSAgaW1hZ2UyZF90IG92ZXJsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfcG9zaXRpb24pCit7CisgICAgY29uc3Qgc2FtcGxlcl90IHNhbXBsZXIgPSAoQ0xLX05PUk1BTElaRURfQ09PUkRTX0ZBTFNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEtfRklMVEVSX05FQVJFU1QpOworCisgICAgaW50MiBvdmVybGF5X3NpemUgPSBnZXRfaW1hZ2VfZGltKG92ZXJsYXkpOworICAgIGludDIgbG9jID0gKGludDIpKGdldF9nbG9iYWxfaWQoMCksIGdldF9nbG9iYWxfaWQoMSkpOworCisgICAgaWYgKGxvYy54IDwgIHhfcG9zaXRpb24gfHwKKyAgICAgICAgbG9jLnkgPCAgeV9wb3NpdGlvbiB8fAorICAgICAgICBsb2MueCA+PSBvdmVybGF5X3NpemUueCArIHhfcG9zaXRpb24gfHwKKyAgICAgICAgbG9jLnkgPj0gb3ZlcmxheV9zaXplLnkgKyB5X3Bvc2l0aW9uKSB7CisgICAgICAgIGZsb2F0NCB2YWwgPSByZWFkX2ltYWdlZihtYWluLCBzYW1wbGVyLCBsb2MpOworICAgICAgICB3cml0ZV9pbWFnZWYoZHN0LCBsb2MsIHZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MiBsb2Nfb3ZlcmxheSA9IChpbnQyKSh4X3Bvc2l0aW9uLCB5X3Bvc2l0aW9uKTsKKyAgICAgICAgZmxvYXQ0IHZhbCAgICAgICA9IHJlYWRfaW1hZ2VmKG92ZXJsYXksIHNhbXBsZXIsIGxvYyAtIGxvY19vdmVybGF5KTsKKyAgICAgICAgd3JpdGVfaW1hZ2VmKGRzdCwgbG9jLCB2YWwpOworICAgIH0KK30KKworX19rZXJuZWwgdm9pZCBvdmVybGF5X2ludGVybmFsX2FscGhhKF9fd3JpdGVfb25seSBpbWFnZTJkX3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVhZF9vbmx5ICBpbWFnZTJkX3QgbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlYWRfb25seSAgaW1hZ2UyZF90IG92ZXJsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfcG9zaXRpb24pCit7CisgICAgY29uc3Qgc2FtcGxlcl90IHNhbXBsZXIgPSAoQ0xLX05PUk1BTElaRURfQ09PUkRTX0ZBTFNFIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTEtfRklMVEVSX05FQVJFU1QpOworCisgICAgaW50MiBvdmVybGF5X3NpemUgPSBnZXRfaW1hZ2VfZGltKG92ZXJsYXkpOworICAgIGludDIgbG9jID0gKGludDIpKGdldF9nbG9iYWxfaWQoMCksIGdldF9nbG9iYWxfaWQoMSkpOworCisgICAgaWYgKGxvYy54IDwgIHhfcG9zaXRpb24gfHwKKyAgICAgICAgbG9jLnkgPCAgeV9wb3NpdGlvbiB8fAorICAgICAgICBsb2MueCA+PSBvdmVybGF5X3NpemUueCArIHhfcG9zaXRpb24gfHwKKyAgICAgICAgbG9jLnkgPj0gb3ZlcmxheV9zaXplLnkgKyB5X3Bvc2l0aW9uKSB7CisgICAgICAgIGZsb2F0NCB2YWwgPSByZWFkX2ltYWdlZihtYWluLCBzYW1wbGVyLCBsb2MpOworICAgICAgICB3cml0ZV9pbWFnZWYoZHN0LCBsb2MsIHZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MiBsb2Nfb3ZlcmxheSAgPSAoaW50MikoeF9wb3NpdGlvbiwgeV9wb3NpdGlvbik7CisgICAgICAgIGZsb2F0NCBpbl9tYWluICAgID0gcmVhZF9pbWFnZWYobWFpbiwgICAgc2FtcGxlciwgbG9jKTsKKyAgICAgICAgZmxvYXQ0IGluX292ZXJsYXkgPSByZWFkX2ltYWdlZihvdmVybGF5LCBzYW1wbGVyLCBsb2MgLSBsb2Nfb3ZlcmxheSk7CisgICAgICAgIGZsb2F0NCB2YWwgICAgICAgID0gaW5fb3ZlcmxheSAqIGluX292ZXJsYXkudyArIGluX21haW4gKiAoMS4wZiAtIGluX292ZXJsYXkudyk7CisgICAgICAgIHdyaXRlX2ltYWdlZihkc3QsIGxvYywgdmFsKTsKKyAgICB9Cit9CisKK19fa2VybmVsIHZvaWQgb3ZlcmxheV9leHRlcm5hbF9hbHBoYShfX3dyaXRlX29ubHkgaW1hZ2UyZF90IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3JlYWRfb25seSAgaW1hZ2UyZF90IG1haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZWFkX29ubHkgIGltYWdlMmRfdCBvdmVybGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVhZF9vbmx5ICBpbWFnZTJkX3QgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2Fkal94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9hZGpfeSkKK3sKKyAgICBjb25zdCBzYW1wbGVyX3Qgc2FtcGxlciA9IChDTEtfTk9STUFMSVpFRF9DT09SRFNfRkFMU0UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMS19GSUxURVJfTkVBUkVTVCk7CisKKyAgICBpbnQyIG92ZXJsYXlfc2l6ZSA9IGdldF9pbWFnZV9kaW0ob3ZlcmxheSk7CisgICAgaW50MiBsb2MgPSAoaW50MikoZ2V0X2dsb2JhbF9pZCgwKSwgZ2V0X2dsb2JhbF9pZCgxKSk7CisKKyAgICBpZiAobG9jLnggPCAgeF9wb3NpdGlvbiB8fAorICAgICAgICBsb2MueSA8ICB5X3Bvc2l0aW9uIHx8CisgICAgICAgIGxvYy54ID49IG92ZXJsYXlfc2l6ZS54ICsgeF9wb3NpdGlvbiB8fAorICAgICAgICBsb2MueSA+PSBvdmVybGF5X3NpemUueSArIHlfcG9zaXRpb24pIHsKKyAgICAgICAgZmxvYXQ0IHZhbCA9IHJlYWRfaW1hZ2VmKG1haW4sIHNhbXBsZXIsIGxvYyk7CisgICAgICAgIHdyaXRlX2ltYWdlZihkc3QsIGxvYywgdmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQyIGxvY19vdmVybGF5ICA9IChpbnQyKSh4X3Bvc2l0aW9uLCB5X3Bvc2l0aW9uKTsKKyAgICAgICAgZmxvYXQ0IGluX21haW4gICAgPSByZWFkX2ltYWdlZihtYWluLCAgICBzYW1wbGVyLCBsb2MpOworICAgICAgICBmbG9hdDQgaW5fb3ZlcmxheSA9IHJlYWRfaW1hZ2VmKG92ZXJsYXksIHNhbXBsZXIsIGxvYyAtIGxvY19vdmVybGF5KTsKKworICAgICAgICBpbnQyIGxvY19hbHBoYSAgICA9IChpbnQyKShsb2MueCAqIGFscGhhX2Fkal94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MueSAqIGFscGhhX2Fkal95KSAtIGxvY19vdmVybGF5OworICAgICAgICBmbG9hdDQgaW5fYWxwaGEgICA9IHJlYWRfaW1hZ2VmKGFscGhhLCAgIHNhbXBsZXIsIGxvY19hbHBoYSk7CisKKyAgICAgICAgZmxvYXQ0IHZhbCA9IGluX292ZXJsYXkgKiBpbl9hbHBoYS54ICsgaW5fbWFpbiAqICgxLjBmIC0gaW5fYWxwaGEueCk7CisgICAgICAgIHdyaXRlX2ltYWdlZihkc3QsIGxvYywgdmFsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9vcGVuY2wvdW5zaGFycC5jbCBiL2xpYmF2ZmlsdGVyL29wZW5jbC91bnNoYXJwLmNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Mjk4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9vcGVuY2wvdW5zaGFycC5jbApAQCAtMCwwICsxLDk5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKK19fa2VybmVsIHZvaWQgdW5zaGFycF9nbG9iYWwoX193cml0ZV9vbmx5IGltYWdlMmRfdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmVhZF9vbmx5ICBpbWFnZTJkX3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fY29uc3RhbnQgZmxvYXQgKmNvZWZfbWF0cml4KQoreworICAgIGNvbnN0IHNhbXBsZXJfdCBzYW1wbGVyID0gKENMS19OT1JNQUxJWkVEX0NPT1JEU19GQUxTRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBpbnQyIGxvYyAgICA9IChpbnQyKShnZXRfZ2xvYmFsX2lkKDApLCBnZXRfZ2xvYmFsX2lkKDEpKTsKKyAgICBpbnQyIGNlbnRyZSA9IChpbnQyKShzaXplX3ggLyAyLCBzaXplX3kgLyAyKTsKKworICAgIGZsb2F0NCB2YWwgPSByZWFkX2ltYWdlZihzcmMsIHNhbXBsZXIsIGxvYyk7CisgICAgZmxvYXQ0IHN1bSA9IDAuMGY7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgc2l6ZV95OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemVfeDsgeCsrKSB7CisgICAgICAgICAgICBpbnQyIHBvcyA9IGxvYyArIChpbnQyKSh4LCB5KSAtIGNlbnRyZTsKKyAgICAgICAgICAgIHN1bSArPSBjb2VmX21hdHJpeFt5ICogc2l6ZV94ICsgeF0gKgorICAgICAgICAgICAgICAgIHJlYWRfaW1hZ2VmKHNyYywgc2FtcGxlciwgcG9zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdyaXRlX2ltYWdlZihkc3QsIGxvYywgdmFsICsgKHZhbCAtIHN1bSkgKiBhbW91bnQpOworfQorCitfX2tlcm5lbCB2b2lkIHVuc2hhcnBfbG9jYWwoX193cml0ZV9vbmx5IGltYWdlMmRfdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yZWFkX29ubHkgIGltYWdlMmRfdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2NvbnN0YW50IGZsb2F0ICpjb2VmX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19jb25zdGFudCBmbG9hdCAqY29lZl95KQoreworICAgIGNvbnN0IHNhbXBsZXJfdCBzYW1wbGVyID0gKENMS19OT1JNQUxJWkVEX0NPT1JEU19GQUxTRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xLX0FERFJFU1NfQ0xBTVBfVE9fRURHRSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xLX0ZJTFRFUl9ORUFSRVNUKTsKKyAgICBpbnQyIGJsb2NrID0gKGludDIpKGdldF9ncm91cF9pZCgwKSwgZ2V0X2dyb3VwX2lkKDEpKSAqIDE2OworICAgIGludDIgcG9zICAgPSAoaW50MikoZ2V0X2xvY2FsX2lkKDApLCBnZXRfbG9jYWxfaWQoMSkpOworCisgICAgX19sb2NhbCBmbG9hdDQgdG1wWzMyXVszMl07CisKKyAgICBpbnQgcmFkX3ggPSBzaXplX3ggLyAyOworICAgIGludCByYWRfeSA9IHNpemVfeSAvIDI7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDw9IDE7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDw9IDE7IHgrKykgeworICAgICAgICAgICAgdG1wW3Bvcy55ICsgMTYgKiB5XVtwb3MueCArIDE2ICogeF0gPQorICAgICAgICAgICAgICAgIHJlYWRfaW1hZ2VmKHNyYywgc2FtcGxlciwgYmxvY2sgKyBwb3MgKyAoaW50MikoMTYgKiB4IC0gOCwgMTYgKiB5IC0gOCkpOworICAgICAgICB9CisgICAgfQorCisgICAgYmFycmllcihDTEtfTE9DQUxfTUVNX0ZFTkNFKTsKKworICAgIGZsb2F0NCB2YWwgPSB0bXBbcG9zLnkgKyA4XVtwb3MueCArIDhdOworCisgICAgZmxvYXQ0IGhvcml6WzJdOworICAgIGZvciAoeSA9IDA7IHkgPD0gMTsgeSsrKSB7CisgICAgICAgIGhvcml6W3ldID0gMC4wZjsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemVfeDsgeCsrKQorICAgICAgICAgICAgaG9yaXpbeV0gKz0gY29lZl94W3hdICogdG1wW3Bvcy55ICsgeSAqIDE2XVtwb3MueCArIDggKyB4IC0gcmFkX3hdOworICAgIH0KKworICAgIGJhcnJpZXIoQ0xLX0xPQ0FMX01FTV9GRU5DRSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDw9IDE7IHkrKykgeworICAgICAgICB0bXBbcG9zLnkgKyB5ICogMTZdW3Bvcy54ICsgOF0gPSBob3Jpelt5XTsKKyAgICB9CisKKyAgICBiYXJyaWVyKENMS19MT0NBTF9NRU1fRkVOQ0UpOworCisgICAgZmxvYXQ0IHN1bSA9IDAuMGY7CisgICAgZm9yICh5ID0gMDsgeSA8IHNpemVfeTsgeSsrKQorICAgICAgICBzdW0gKz0gY29lZl95W3ldICogdG1wW3Bvcy55ICsgOCArIHkgLSByYWRfeV1bcG9zLnggKyA4XTsKKworICAgIGlmIChibG9jay54ICsgcG9zLnggPCBnZXRfaW1hZ2Vfd2lkdGgoZHN0KSAmJgorICAgICAgICBibG9jay55ICsgcG9zLnkgPCBnZXRfaW1hZ2VfaGVpZ2h0KGRzdCkpCisgICAgICAgIHdyaXRlX2ltYWdlZihkc3QsIGJsb2NrICsgcG9zLCB2YWwgKyAodmFsIC0gc3VtKSAqIGFtb3VudCk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9vcGVuY2xfYWxsa2VybmVscy5jIGIvbGliYXZmaWx0ZXIvb3BlbmNsX2FsbGtlcm5lbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4MGZhOC4uMDAwMDAwMAotLS0gYS9saWJhdmZpbHRlci9vcGVuY2xfYWxsa2VybmVscy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBXZWkgR2FvIDx3ZWlnYW9AbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJvcGVuY2xfYWxsa2VybmVscy5oIgotI2lmIENPTkZJR19PUEVOQ0wKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3BlbmNsLmgiCi0jaW5jbHVkZSAiZGVzaGFrZV9vcGVuY2xfa2VybmVsLmgiCi0jaW5jbHVkZSAidW5zaGFycF9vcGVuY2xfa2VybmVsLmgiCi0jZW5kaWYKLQotI2RlZmluZSBPUEVOQ0xfUkVHSVNURVJfS0VSTkVMX0NPREUoWCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoQ09ORklHXyMjWCMjX0ZJTFRFUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXZfb3BlbmNsX3JlZ2lzdGVyX2tlcm5lbF9jb2RlKGZmX2tlcm5lbF8jI3gjI19vcGVuY2wpOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotdm9pZCBmZl9vcGVuY2xfcmVnaXN0ZXJfZmlsdGVyX2tlcm5lbF9jb2RlX2FsbCh2b2lkKQotewotICNpZiBDT05GSUdfT1BFTkNMCi0gICBPUEVOQ0xfUkVHSVNURVJfS0VSTkVMX0NPREUoREVTSEFLRSwgICAgIGRlc2hha2UpOwotICAgT1BFTkNMX1JFR0lTVEVSX0tFUk5FTF9DT0RFKFVOU0hBUlAsICAgICB1bnNoYXJwKTsKLSAjZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL29wZW5jbF9hbGxrZXJuZWxzLmggYi9saWJhdmZpbHRlci9vcGVuY2xfYWxsa2VybmVscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2I2NTBkLi4wMDAwMDAwCi0tLSBhL2xpYmF2ZmlsdGVyL29wZW5jbF9hbGxrZXJuZWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFdlaSBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2lmbmRlZiBBVkZJTFRFUl9PUEVOQ0xfQUxMS0VSTkVMU19ICi0jZGVmaW5lIEFWRklMVEVSX09QRU5DTF9BTExLRVJORUxTX0gKLQotI2luY2x1ZGUgImF2ZmlsdGVyLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLXZvaWQgZmZfb3BlbmNsX3JlZ2lzdGVyX2ZpbHRlcl9rZXJuZWxfY29kZV9hbGwodm9pZCk7Ci0KLSNlbmRpZiAvKiBBVkZJTFRFUl9PUEVOQ0xfQUxMS0VSTkVMU19IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9vcGVuY2xfc291cmNlLmggYi9saWJhdmZpbHRlci9vcGVuY2xfc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiOTk2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL29wZW5jbF9zb3VyY2UuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfT1BFTkNMX1NPVVJDRV9ICisjZGVmaW5lIEFWRklMVEVSX09QRU5DTF9TT1VSQ0VfSAorCitleHRlcm4gY29uc3QgY2hhciAqZmZfb3BlbmNsX3NvdXJjZV9hdmdibHVyOworZXh0ZXJuIGNvbnN0IGNoYXIgKmZmX29wZW5jbF9zb3VyY2VfY29udm9sdXRpb247CitleHRlcm4gY29uc3QgY2hhciAqZmZfb3BlbmNsX3NvdXJjZV9vdmVybGF5OworZXh0ZXJuIGNvbnN0IGNoYXIgKmZmX29wZW5jbF9zb3VyY2VfdW5zaGFycDsKKworI2VuZGlmIC8qIEFWRklMVEVSX09QRU5DTF9TT1VSQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvcHRocmVhZC5jIGIvbGliYXZmaWx0ZXIvcHRocmVhZC5jCmluZGV4IDM3Y2E3M2YuLjdlMzdjNzMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3B0aHJlYWQuYworKysgYi9saWJhdmZpbHRlci9wdGhyZWFkLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCiAgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yOCw2ICsyNyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NsaWNldGhyZWFkLmgiCiAKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC0zNSwxNzAgKzM1LDU2IEBACiAKIHR5cGVkZWYgc3RydWN0IFRocmVhZENvbnRleHQgewogICAgIEFWRmlsdGVyR3JhcGggKmdyYXBoOwotCi0gICAgaW50IG5iX3RocmVhZHM7Ci0gICAgcHRocmVhZF90ICp3b3JrZXJzOworICAgIEFWU2xpY2VUaHJlYWQgKnRocmVhZDsKICAgICBhdmZpbHRlcl9hY3Rpb25fZnVuYyAqZnVuYzsKIAogICAgIC8qIHBlci1leGVjdXRlIHBhcmFtZXRlcnMgKi8KICAgICBBVkZpbHRlckNvbnRleHQgKmN0eDsKICAgICB2b2lkICphcmc7CiAgICAgaW50ICAgKnJldHM7Ci0gICAgaW50IG5iX3JldHM7Ci0gICAgaW50IG5iX2pvYnM7Ci0KLSAgICBwdGhyZWFkX2NvbmRfdCBsYXN0X2pvYl9jb25kOwotICAgIHB0aHJlYWRfY29uZF90IGN1cnJlbnRfam9iX2NvbmQ7Ci0gICAgcHRocmVhZF9tdXRleF90IGN1cnJlbnRfam9iX2xvY2s7Ci0gICAgaW50IGN1cnJlbnRfam9iOwotICAgIHVuc2lnbmVkIGludCBjdXJyZW50X2V4ZWN1dGU7Ci0gICAgaW50IGRvbmU7CiB9IFRocmVhZENvbnRleHQ7CiAKLXN0YXRpYyB2b2lkKiBhdHRyaWJ1dGVfYWxpZ25fYXJnIHdvcmtlcih2b2lkICp2KQorc3RhdGljIHZvaWQgd29ya2VyX2Z1bmModm9pZCAqcHJpdiwgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIsIGludCBuYl9qb2JzLCBpbnQgbmJfdGhyZWFkcykKIHsKLSAgICBUaHJlYWRDb250ZXh0ICpjID0gdjsKLSAgICBpbnQgb3VyX2pvYiAgICAgID0gYy0+bmJfam9iczsKLSAgICBpbnQgbmJfdGhyZWFkcyAgID0gYy0+bmJfdGhyZWFkczsKLSAgICB1bnNpZ25lZCBpbnQgbGFzdF9leGVjdXRlID0gMDsKLSAgICBpbnQgc2VsZl9pZDsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0gICAgc2VsZl9pZCA9IGMtPmN1cnJlbnRfam9iKys7Ci0gICAgZm9yICg7OykgewotICAgICAgICB3aGlsZSAob3VyX2pvYiA+PSBjLT5uYl9qb2JzKSB7Ci0gICAgICAgICAgICBpZiAoYy0+Y3VycmVudF9qb2IgPT0gbmJfdGhyZWFkcyArIGMtPm5iX2pvYnMpCi0gICAgICAgICAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmYy0+bGFzdF9qb2JfY29uZCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChsYXN0X2V4ZWN1dGUgPT0gYy0+Y3VycmVudF9leGVjdXRlICYmICFjLT5kb25lKQotICAgICAgICAgICAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZjLT5jdXJyZW50X2pvYl9jb25kLCAmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0gICAgICAgICAgICBsYXN0X2V4ZWN1dGUgPSBjLT5jdXJyZW50X2V4ZWN1dGU7Ci0gICAgICAgICAgICBvdXJfam9iID0gc2VsZl9pZDsKLQotICAgICAgICAgICAgaWYgKGMtPmRvbmUpIHsKLSAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOwotCi0gICAgICAgIGMtPnJldHNbb3VyX2pvYiAlIGMtPm5iX3JldHNdID0gYy0+ZnVuYyhjLT5jdHgsIGMtPmFyZywgb3VyX2pvYiwgYy0+bmJfam9icyk7Ci0KLSAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKLSAgICAgICAgb3VyX2pvYiA9IGMtPmN1cnJlbnRfam9iKys7Ci0gICAgfQorICAgIFRocmVhZENvbnRleHQgKmMgPSBwcml2OworICAgIGludCByZXQgPSBjLT5mdW5jKGMtPmN0eCwgYy0+YXJnLCBqb2JuciwgbmJfam9icyk7CisgICAgaWYgKGMtPnJldHMpCisgICAgICAgIGMtPnJldHNbam9ibnJdID0gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBzbGljZV90aHJlYWRfdW5pbml0KFRocmVhZENvbnRleHQgKmMpCiB7Ci0gICAgaW50IGk7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmMtPmN1cnJlbnRfam9iX2xvY2spOwotICAgIGMtPmRvbmUgPSAxOwotICAgIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoJmMtPmN1cnJlbnRfam9iX2NvbmQpOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uYl90aHJlYWRzOyBpKyspCi0gICAgICAgICBwdGhyZWFkX2pvaW4oYy0+d29ya2Vyc1tpXSwgTlVMTCk7Ci0KLSAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmMtPmN1cnJlbnRfam9iX2xvY2spOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZjLT5jdXJyZW50X2pvYl9jb25kKTsKLSAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmYy0+bGFzdF9qb2JfY29uZCk7Ci0gICAgYXZfZnJlZXAoJmMtPndvcmtlcnMpOwotfQotCi1zdGF0aWMgdm9pZCBzbGljZV90aHJlYWRfcGFya193b3JrZXJzKFRocmVhZENvbnRleHQgKmMpCi17Ci0gICAgd2hpbGUgKGMtPmN1cnJlbnRfam9iICE9IGMtPm5iX3RocmVhZHMgKyBjLT5uYl9qb2JzKQotICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmYy0+bGFzdF9qb2JfY29uZCwgJmMtPmN1cnJlbnRfam9iX2xvY2spOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZjLT5jdXJyZW50X2pvYl9sb2NrKTsKKyAgICBhdnByaXZfc2xpY2V0aHJlYWRfZnJlZSgmYy0+dGhyZWFkKTsKIH0KIAogc3RhdGljIGludCB0aHJlYWRfZXhlY3V0ZShBVkZpbHRlckNvbnRleHQgKmN0eCwgYXZmaWx0ZXJfYWN0aW9uX2Z1bmMgKmZ1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmFyZywgaW50ICpyZXQsIGludCBuYl9qb2JzKQogewogICAgIFRocmVhZENvbnRleHQgKmMgPSBjdHgtPmdyYXBoLT5pbnRlcm5hbC0+dGhyZWFkOwotICAgIGludCBkdW1teV9yZXQ7CiAKICAgICBpZiAobmJfam9icyA8PSAwKQogICAgICAgICByZXR1cm4gMDsKLQotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0KLSAgICBjLT5jdXJyZW50X2pvYiA9IGMtPm5iX3RocmVhZHM7Ci0gICAgYy0+bmJfam9icyAgICAgPSBuYl9qb2JzOwogICAgIGMtPmN0eCAgICAgICAgID0gY3R4OwogICAgIGMtPmFyZyAgICAgICAgID0gYXJnOwogICAgIGMtPmZ1bmMgICAgICAgID0gZnVuYzsKLSAgICBpZiAocmV0KSB7Ci0gICAgICAgIGMtPnJldHMgICAgPSByZXQ7Ci0gICAgICAgIGMtPm5iX3JldHMgPSBuYl9qb2JzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGMtPnJldHMgICAgPSAmZHVtbXlfcmV0OwotICAgICAgICBjLT5uYl9yZXRzID0gMTsKLSAgICB9Ci0gICAgYy0+Y3VycmVudF9leGVjdXRlKys7CisgICAgYy0+cmV0cyAgICAgICAgPSByZXQ7CiAKLSAgICBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCZjLT5jdXJyZW50X2pvYl9jb25kKTsKLQotICAgIHNsaWNlX3RocmVhZF9wYXJrX3dvcmtlcnMoYyk7Ci0KKyAgICBhdnByaXZfc2xpY2V0aHJlYWRfZXhlY3V0ZShjLT50aHJlYWQsIG5iX2pvYnMsIDApOwogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHRocmVhZF9pbml0X2ludGVybmFsKFRocmVhZENvbnRleHQgKmMsIGludCBuYl90aHJlYWRzKQogewotICAgIGludCBpLCByZXQ7Ci0KLSAgICBpZiAoIW5iX3RocmVhZHMpIHsKLSAgICAgICAgaW50IG5iX2NwdXMgPSBhdl9jcHVfY291bnQoKTsKLSAgICAgICAgLy8gdXNlIG51bWJlciBvZiBjb3JlcyArIDEgYXMgdGhyZWFkIGNvdW50IGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKLSAgICAgICAgaWYgKG5iX2NwdXMgPiAxKQotICAgICAgICAgICAgbmJfdGhyZWFkcyA9IG5iX2NwdXMgKyAxOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBuYl90aHJlYWRzID0gMTsKLSAgICB9Ci0KKyAgICBuYl90aHJlYWRzID0gYXZwcml2X3NsaWNldGhyZWFkX2NyZWF0ZSgmYy0+dGhyZWFkLCBjLCB3b3JrZXJfZnVuYywgTlVMTCwgbmJfdGhyZWFkcyk7CiAgICAgaWYgKG5iX3RocmVhZHMgPD0gMSkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICBjLT5uYl90aHJlYWRzID0gbmJfdGhyZWFkczsKLSAgICBjLT53b3JrZXJzID0gYXZfbWFsbG9jel9hcnJheShzaXplb2YoKmMtPndvcmtlcnMpLCBuYl90aHJlYWRzKTsKLSAgICBpZiAoIWMtPndvcmtlcnMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICBjLT5jdXJyZW50X2pvYiA9IDA7Ci0gICAgYy0+bmJfam9icyAgICAgPSAwOwotICAgIGMtPmRvbmUgICAgICAgID0gMDsKLQotICAgIHB0aHJlYWRfY29uZF9pbml0KCZjLT5jdXJyZW50X2pvYl9jb25kLCBOVUxMKTsKLSAgICBwdGhyZWFkX2NvbmRfaW5pdCgmYy0+bGFzdF9qb2JfY29uZCwgICAgTlVMTCk7Ci0KLSAgICBwdGhyZWFkX211dGV4X2luaXQoJmMtPmN1cnJlbnRfam9iX2xvY2ssIE5VTEwpOwotICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5iX3RocmVhZHM7IGkrKykgewotICAgICAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmYy0+d29ya2Vyc1tpXSwgTlVMTCwgd29ya2VyLCBjKTsKLSAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYy0+Y3VycmVudF9qb2JfbG9jayk7Ci0gICAgICAgICAgIGMtPm5iX3RocmVhZHMgPSBpOwotICAgICAgICAgICBzbGljZV90aHJlYWRfdW5pbml0KGMpOwotICAgICAgICAgICByZXR1cm4gQVZFUlJPUihyZXQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc2xpY2VfdGhyZWFkX3Bhcmtfd29ya2VycyhjKTsKLQotICAgIHJldHVybiBjLT5uYl90aHJlYWRzOworICAgICAgICBhdnByaXZfc2xpY2V0aHJlYWRfZnJlZSgmYy0+dGhyZWFkKTsKKyAgICByZXR1cm4gRkZNQVgobmJfdGhyZWFkcywgMSk7CiB9CiAKIGludCBmZl9ncmFwaF90aHJlYWRfaW5pdChBVkZpbHRlckdyYXBoICpncmFwaCkKIHsKICAgICBpbnQgcmV0OwogCi0jaWYgSEFWRV9XMzJUSFJFQURTCi0gICAgdzMydGhyZWFkX2luaXQoKTsKLSNlbmRpZgotCiAgICAgaWYgKGdyYXBoLT5uYl90aHJlYWRzID09IDEpIHsKICAgICAgICAgZ3JhcGgtPnRocmVhZF90eXBlID0gMDsKICAgICAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9xc3Z2cHAuYyBiL2xpYmF2ZmlsdGVyL3FzdnZwcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMDEyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9xc3Z2cHAuYwpAQCAtMCwwICsxLDczMyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBJbnRlbCBRdWljayBTeW5jIFZpZGVvIFZQUCBiYXNlIGZ1bmN0aW9uCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dF9xc3YuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInFzdnZwcC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKyNkZWZpbmUgSVNfVklERU9fTUVNT1JZKG1vZGUpICAobW9kZSAmIChNRlhfTUVNVFlQRV9WSURFT19NRU1PUllfREVDT0RFUl9UQVJHRVQgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX1BST0NFU1NPUl9UQVJHRVQpKQorI2RlZmluZSBJU19PUEFRVUVfTUVNT1JZKG1vZGUpIChtb2RlICYgTUZYX01FTVRZUEVfT1BBUVVFX0ZSQU1FKQorI2RlZmluZSBJU19TWVNURU1fTUVNT1JZKG1vZGUpIChtb2RlICYgTUZYX01FTVRZUEVfU1lTVEVNX01FTU9SWSkKKwordHlwZWRlZiBzdHJ1Y3QgUVNWRnJhbWUgeworICAgIEFWRnJhbWUgICAgICAgICAgKmZyYW1lOworICAgIG1meEZyYW1lU3VyZmFjZTEgKnN1cmZhY2U7CisgICAgbWZ4RnJhbWVTdXJmYWNlMSAgc3VyZmFjZV9pbnRlcm5hbDsgIC8qIGZvciBzeXN0ZW0gbWVtb3J5ICovCisgICAgc3RydWN0IFFTVkZyYW1lICAqbmV4dDsKK30gUVNWRnJhbWU7CisKKy8qIGFic3RyYWN0IHN0cnVjdCBmb3IgYWxsIFFTViBmaWx0ZXJzICovCitzdHJ1Y3QgUVNWVlBQQ29udGV4dCB7CisgICAgbWZ4U2Vzc2lvbiAgICAgICAgICBzZXNzaW9uOworICAgIGludCAoKmZpbHRlcl9mcmFtZSkgKEFWRmlsdGVyTGluayAqb3V0bGluaywgQVZGcmFtZSAqZnJhbWUpOy8qIGNhbGxiYWNrICovCisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICBvdXRfc3dfZm9ybWF0OyAgIC8qIFJlYWwgb3V0cHV0IGZvcm1hdCAqLworICAgIG1meFZpZGVvUGFyYW0gICAgICAgdnBwX3BhcmFtOworICAgIG1meEZyYW1lSW5mbyAgICAgICAqZnJhbWVfaW5mb3M7ICAgICAvKiBmcmFtZSBpbmZvIGZvciBlYWNoIGlucHV0ICovCisKKyAgICAvKiBtZW1iZXJzIHJlbGF0ZWQgdG8gdGhlIGlucHV0L291dHB1dCBzdXJmYWNlICovCisgICAgaW50ICAgICAgICAgICAgICAgICBpbl9tZW1fbW9kZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG91dF9tZW1fbW9kZTsKKyAgICBRU1ZGcmFtZSAgICAgICAgICAgKmluX2ZyYW1lX2xpc3Q7CisgICAgUVNWRnJhbWUgICAgICAgICAgICpvdXRfZnJhbWVfbGlzdDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5iX3N1cmZhY2VfcHRyc19pbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5iX3N1cmZhY2VfcHRyc19vdXQ7CisgICAgbWZ4RnJhbWVTdXJmYWNlMSAgKipzdXJmYWNlX3B0cnNfaW47CisgICAgbWZ4RnJhbWVTdXJmYWNlMSAgKipzdXJmYWNlX3B0cnNfb3V0OworCisgICAgLyogTUZYVlBQIGV4dGVybiBwYXJhbWV0ZXJzICovCisgICAgbWZ4RXh0T3BhcXVlU3VyZmFjZUFsbG9jIG9wYXF1ZV9hbGxvYzsKKyAgICBtZnhFeHRCdWZmZXIgICAgICAqKmV4dF9idWZmZXJzOworICAgIGludCAgICAgICAgICAgICAgICAgbmJfZXh0X2J1ZmZlcnM7Cit9OworCitzdGF0aWMgY29uc3QgbWZ4SGFuZGxlVHlwZSBoYW5kbGVfdHlwZXNbXSA9IHsKKyAgICBNRlhfSEFORExFX1ZBX0RJU1BMQVksCisgICAgTUZYX0hBTkRMRV9EM0Q5X0RFVklDRV9NQU5BR0VSLAorICAgIE1GWF9IQU5ETEVfRDNEMTFfREVWSUNFLAorfTsKKworc3RhdGljIGNvbnN0IEFWUmF0aW9uYWwgZGVmYXVsdF90YiA9IHsgMSwgOTAwMDAgfTsKKworLyogZnVuY3Rpb25zIGZvciBmcmFtZUFsbG9jICovCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX2FsbG9jKG1meEhETCBwdGhpcywgbWZ4RnJhbWVBbGxvY1JlcXVlc3QgKnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWZ4RnJhbWVBbGxvY1Jlc3BvbnNlICpyZXNwKQoreworICAgIFFTVlZQUENvbnRleHQgKnMgPSBwdGhpczsKKyAgICBpbnQgaTsKKworICAgIGlmICghKHJlcS0+VHlwZSAmIE1GWF9NRU1UWVBFX1ZJREVPX01FTU9SWV9QUk9DRVNTT1JfVEFSR0VUKSB8fAorICAgICAgICAhKHJlcS0+VHlwZSAmIChNRlhfTUVNVFlQRV9GUk9NX1ZQUElOIHwgTUZYX01FTVRZUEVfRlJPTV9WUFBPVVQpKSB8fAorICAgICAgICAhKHJlcS0+VHlwZSAmIE1GWF9NRU1UWVBFX0VYVEVSTkFMX0ZSQU1FKSkKKyAgICAgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7CisKKyAgICBpZiAocmVxLT5UeXBlICYgTUZYX01FTVRZUEVfRlJPTV9WUFBJTikgeworICAgICAgICByZXNwLT5taWRzID0gYXZfbWFsbG9jeihzLT5uYl9zdXJmYWNlX3B0cnNfaW4gKiBzaXplb2YoKnJlc3AtPm1pZHMpKTsKKyAgICAgICAgaWYgKCFyZXNwLT5taWRzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3VyZmFjZV9wdHJzX2luOyBpKyspCisgICAgICAgICAgICByZXNwLT5taWRzW2ldID0gcy0+c3VyZmFjZV9wdHJzX2luW2ldLT5EYXRhLk1lbUlkOworCisgICAgICAgIHJlc3AtPk51bUZyYW1lQWN0dWFsID0gcy0+bmJfc3VyZmFjZV9wdHJzX2luOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3AtPm1pZHMgPSBhdl9tYWxsb2N6KHMtPm5iX3N1cmZhY2VfcHRyc19vdXQgKiBzaXplb2YoKnJlc3AtPm1pZHMpKTsKKyAgICAgICAgaWYgKCFyZXNwLT5taWRzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3VyZmFjZV9wdHJzX291dDsgaSsrKQorICAgICAgICAgICAgcmVzcC0+bWlkc1tpXSA9IHMtPnN1cmZhY2VfcHRyc19vdXRbaV0tPkRhdGEuTWVtSWQ7CisKKyAgICAgICAgcmVzcC0+TnVtRnJhbWVBY3R1YWwgPSBzLT5uYl9zdXJmYWNlX3B0cnNfb3V0OworICAgIH0KKworICAgIHJldHVybiBNRlhfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBtZnhTdGF0dXMgZnJhbWVfZnJlZShtZnhIREwgcHRoaXMsIG1meEZyYW1lQWxsb2NSZXNwb25zZSAqcmVzcCkKK3sKKyAgICBhdl9mcmVlcCgmcmVzcC0+bWlkcyk7CisgICAgcmV0dXJuIE1GWF9FUlJfTk9ORTsKK30KKworc3RhdGljIG1meFN0YXR1cyBmcmFtZV9sb2NrKG1meEhETCBwdGhpcywgbWZ4TWVtSWQgbWlkLCBtZnhGcmFtZURhdGEgKnB0cikKK3sKKyAgICByZXR1cm4gTUZYX0VSUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdGljIG1meFN0YXR1cyBmcmFtZV91bmxvY2sobWZ4SERMIHB0aGlzLCBtZnhNZW1JZCBtaWQsIG1meEZyYW1lRGF0YSAqcHRyKQoreworICAgIHJldHVybiBNRlhfRVJSX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX2dldF9oZGwobWZ4SERMIHB0aGlzLCBtZnhNZW1JZCBtaWQsIG1meEhETCAqaGRsKQoreworICAgICpoZGwgPSBtaWQ7CisgICAgcmV0dXJuIE1GWF9FUlJfTk9ORTsKK30KKworc3RhdGljIGludCBwaXhfZm10X3RvX21meF9mb3VyY2MoaW50IGZvcm1hdCkKK3sKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICByZXR1cm4gTUZYX0ZPVVJDQ19ZVjEyOworICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICByZXR1cm4gTUZYX0ZPVVJDQ19OVjEyOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOgorICAgICAgICByZXR1cm4gTUZYX0ZPVVJDQ19ZVVkyOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgcmV0dXJuIE1GWF9GT1VSQ0NfUkdCNDsKKyAgICB9CisKKyAgICByZXR1cm4gTUZYX0ZPVVJDQ19OVjEyOworfQorCitzdGF0aWMgaW50IG1hcF9mcmFtZV90b19zdXJmYWNlKEFWRnJhbWUgKmZyYW1lLCBtZnhGcmFtZVN1cmZhY2UxICpzdXJmYWNlKQoreworICAgIHN3aXRjaCAoZnJhbWUtPmZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICBzdXJmYWNlLT5EYXRhLlkgID0gZnJhbWUtPmRhdGFbMF07CisgICAgICAgIHN1cmZhY2UtPkRhdGEuVVYgPSBmcmFtZS0+ZGF0YVsxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA6CisgICAgICAgIHN1cmZhY2UtPkRhdGEuWSA9IGZyYW1lLT5kYXRhWzBdOworICAgICAgICBzdXJmYWNlLT5EYXRhLlUgPSBmcmFtZS0+ZGF0YVsxXTsKKyAgICAgICAgc3VyZmFjZS0+RGF0YS5WID0gZnJhbWUtPmRhdGFbMl07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOgorICAgICAgICBzdXJmYWNlLT5EYXRhLlkgPSBmcmFtZS0+ZGF0YVswXTsKKyAgICAgICAgc3VyZmFjZS0+RGF0YS5VID0gZnJhbWUtPmRhdGFbMF0gKyAxOworICAgICAgICBzdXJmYWNlLT5EYXRhLlYgPSBmcmFtZS0+ZGF0YVswXSArIDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IzMjoKKyAgICAgICAgc3VyZmFjZS0+RGF0YS5CID0gZnJhbWUtPmRhdGFbMF07CisgICAgICAgIHN1cmZhY2UtPkRhdGEuRyA9IGZyYW1lLT5kYXRhWzBdICsgMTsKKyAgICAgICAgc3VyZmFjZS0+RGF0YS5SID0gZnJhbWUtPmRhdGFbMF0gKyAyOworICAgICAgICBzdXJmYWNlLT5EYXRhLkEgPSBmcmFtZS0+ZGF0YVswXSArIDM7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBNRlhfRVJSX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBzdXJmYWNlLT5EYXRhLlBpdGNoID0gZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIGZpbGwgdGhlIHN1cmZhY2UgaW5mbyAqLworc3RhdGljIGludCBmaWxsX2ZyYW1laW5mb19ieV9saW5rKG1meEZyYW1lSW5mbyAqZnJhbWVpbmZvLCBBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICAgICAgICBwaXhfZm10OworICAgIEFWSFdGcmFtZXNDb250ZXh0ICAgICAgICAqZnJhbWVzX2N0eDsKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgICAgICAgKmZyYW1lc19od2N0eDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisKKyAgICBpZiAobGluay0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfUVNWKSB7CisgICAgICAgIGlmICghbGluay0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgZnJhbWVzX2N0eCAgID0gKEFWSFdGcmFtZXNDb250ZXh0ICopbGluay0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICAgICAgZnJhbWVzX2h3Y3R4ID0gZnJhbWVzX2N0eC0+aHdjdHg7CisgICAgICAgICpmcmFtZWluZm8gICA9IGZyYW1lc19od2N0eC0+c3VyZmFjZXNbMF0uSW5mbzsKKyAgICB9IGVsc2UgeworICAgICAgICBwaXhfZm10ID0gbGluay0+Zm9ybWF0OworICAgICAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICAgICAgaWYgKCFkZXNjKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworCisgICAgICAgIGZyYW1laW5mby0+Q3JvcFggICAgICAgICAgPSAwOworICAgICAgICBmcmFtZWluZm8tPkNyb3BZICAgICAgICAgID0gMDsKKyAgICAgICAgZnJhbWVpbmZvLT5XaWR0aCAgICAgICAgICA9IEZGQUxJR04obGluay0+dywgMzIpOworICAgICAgICBmcmFtZWluZm8tPkhlaWdodCAgICAgICAgID0gRkZBTElHTihsaW5rLT5oLCAzMik7CisgICAgICAgIGZyYW1laW5mby0+UGljU3RydWN0ICAgICAgPSBNRlhfUElDU1RSVUNUX1BST0dSRVNTSVZFOworICAgICAgICBmcmFtZWluZm8tPkZvdXJDQyAgICAgICAgID0gcGl4X2ZtdF90b19tZnhfZm91cmNjKHBpeF9mbXQpOworICAgICAgICBmcmFtZWluZm8tPkJpdERlcHRoTHVtYSAgID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICAgICAgZnJhbWVpbmZvLT5CaXREZXB0aENocm9tYSA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgICAgIGZyYW1laW5mby0+U2hpZnQgICAgICAgICAgPSBkZXNjLT5jb21wWzBdLmRlcHRoID4gODsKKyAgICAgICAgaWYgKGRlc2MtPmxvZzJfY2hyb21hX3cgJiYgZGVzYy0+bG9nMl9jaHJvbWFfaCkKKyAgICAgICAgICAgIGZyYW1laW5mby0+Q2hyb21hRm9ybWF0ID0gTUZYX0NIUk9NQUZPUk1BVF9ZVVY0MjA7CisgICAgICAgIGVsc2UgaWYgKGRlc2MtPmxvZzJfY2hyb21hX3cpCisgICAgICAgICAgICBmcmFtZWluZm8tPkNocm9tYUZvcm1hdCA9IE1GWF9DSFJPTUFGT1JNQVRfWVVWNDIyOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcmFtZWluZm8tPkNocm9tYUZvcm1hdCA9IE1GWF9DSFJPTUFGT1JNQVRfWVVWNDQ0OworICAgIH0KKworICAgIGZyYW1laW5mby0+Q3JvcFcgICAgICAgICAgPSBsaW5rLT53OworICAgIGZyYW1laW5mby0+Q3JvcEggICAgICAgICAgPSBsaW5rLT5oOworICAgIGZyYW1laW5mby0+RnJhbWVSYXRlRXh0TiAgPSBsaW5rLT5mcmFtZV9yYXRlLm51bTsKKyAgICBmcmFtZWluZm8tPkZyYW1lUmF0ZUV4dEQgID0gbGluay0+ZnJhbWVfcmF0ZS5kZW47CisgICAgZnJhbWVpbmZvLT5Bc3BlY3RSYXRpb1cgICA9IGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8gbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gOiAxOworICAgIGZyYW1laW5mby0+QXNwZWN0UmF0aW9IICAgPSBsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA/IGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIDogMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjbGVhcl91bnVzZWRfZnJhbWVzKFFTVkZyYW1lICpsaXN0KQoreworICAgIHdoaWxlIChsaXN0KSB7CisgICAgICAgIGlmIChsaXN0LT5zdXJmYWNlICYmICFsaXN0LT5zdXJmYWNlLT5EYXRhLkxvY2tlZCkgeworICAgICAgICAgICAgbGlzdC0+c3VyZmFjZSA9IE5VTEw7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZsaXN0LT5mcmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbGlzdCA9IGxpc3QtPm5leHQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjbGVhcl9mcmFtZV9saXN0KFFTVkZyYW1lICoqbGlzdCkKK3sKKyAgICB3aGlsZSAoKmxpc3QpIHsKKyAgICAgICAgUVNWRnJhbWUgKmZyYW1lOworCisgICAgICAgIGZyYW1lID0gKmxpc3Q7CisgICAgICAgICpsaXN0ID0gKCpsaXN0KS0+bmV4dDsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUtPmZyYW1lKTsKKyAgICAgICAgYXZfZnJlZXAoJmZyYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyBRU1ZGcmFtZSAqZ2V0X2ZyZWVfZnJhbWUoUVNWRnJhbWUgKipsaXN0KQoreworICAgIFFTVkZyYW1lICpvdXQgPSAqbGlzdDsKKworICAgIGZvciAoOyBvdXQ7IG91dCA9IG91dC0+bmV4dCkgeworICAgICAgICBpZiAoIW91dC0+c3VyZmFjZSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghb3V0KSB7CisgICAgICAgIG91dCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpvdXQpKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW4ndCBhbGxvYyBuZXcgb3V0cHV0IGZyYW1lLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBvdXQtPm5leHQgID0gKmxpc3Q7CisgICAgICAgICpsaXN0ICAgICAgPSBvdXQ7CisgICAgfQorCisgICAgcmV0dXJuIG91dDsKK30KKworLyogZ2V0IHRoZSBpbnB1dCBzdXJmYWNlICovCitzdGF0aWMgUVNWRnJhbWUgKnN1Ym1pdF9mcmFtZShRU1ZWUFBDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqcGljcmVmKQoreworICAgIFFTVkZyYW1lICAgICAgICAqcXN2X2ZyYW1lOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisKKyAgICBjbGVhcl91bnVzZWRfZnJhbWVzKHMtPmluX2ZyYW1lX2xpc3QpOworCisgICAgcXN2X2ZyYW1lID0gZ2V0X2ZyZWVfZnJhbWUoJnMtPmluX2ZyYW1lX2xpc3QpOworICAgIGlmICghcXN2X2ZyYW1lKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFR1cm4gQVZGcmFtZSBpbnRvIG1meEZyYW1lU3VyZmFjZTEuCisgICAgICogRm9yIHZpZGVvL29wYXF1ZSBtZW1vcnkgbW9kZSwgcGl4X2ZtdCBpcyBBVl9QSVhfRk1UX1FTViwgYW5kCisgICAgICogbWZ4RnJhbWVTdXJmYWNlMSBpcyBzdG9yZWQgaW4gQVZGcmFtZS0+ZGF0YVszXTsKKyAgICAgKiBmb3Igc3lzdGVtIG1lbW9yeSBtb2RlLCByYXcgdmlkZW8gZGF0YSBpcyBzdG9yZWQgaW4KKyAgICAgKiBBVkZyYW1lLCB3ZSBzaG91bGQgbWFwIGl0IGludG8gbWZ4RnJhbWVTdXJmYWNlMS4KKyAgICAgKi8KKyAgICBpZiAoIUlTX1NZU1RFTV9NRU1PUlkocy0+aW5fbWVtX21vZGUpKSB7CisgICAgICAgIGlmIChwaWNyZWYtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX1FTVikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUVNWVlBQIGdldHMgYSB3cm9uZyBmcmFtZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcXN2X2ZyYW1lLT5mcmFtZSAgID0gYXZfZnJhbWVfY2xvbmUocGljcmVmKTsKKyAgICAgICAgcXN2X2ZyYW1lLT5zdXJmYWNlID0gKG1meEZyYW1lU3VyZmFjZTEgKilxc3ZfZnJhbWUtPmZyYW1lLT5kYXRhWzNdOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIG1ha2UgYSBjb3B5IGlmIHRoZSBpbnB1dCBpcyBub3QgcGFkZGVkIGFzIGxpYm1meCByZXF1aXJlcyAqLworICAgICAgICBpZiAocGljcmVmLT5oZWlnaHQgJiAzMSB8fCBwaWNyZWYtPmxpbmVzaXplWzBdICYgMzEpIHsKKyAgICAgICAgICAgIHFzdl9mcmFtZS0+ZnJhbWUgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGlubGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGQUxJR04oaW5saW5rLT53LCAzMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFMSUdOKGlubGluay0+aCwgMzIpKTsKKyAgICAgICAgICAgIGlmICghcXN2X2ZyYW1lLT5mcmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgcXN2X2ZyYW1lLT5mcmFtZS0+d2lkdGggICA9IHBpY3JlZi0+d2lkdGg7CisgICAgICAgICAgICBxc3ZfZnJhbWUtPmZyYW1lLT5oZWlnaHQgID0gcGljcmVmLT5oZWlnaHQ7CisKKyAgICAgICAgICAgIGlmIChhdl9mcmFtZV9jb3B5KHFzdl9mcmFtZS0+ZnJhbWUsIHBpY3JlZikgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcXN2X2ZyYW1lLT5mcmFtZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMocXN2X2ZyYW1lLT5mcmFtZSwgcGljcmVmKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnBpY3JlZik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcXN2X2ZyYW1lLT5mcmFtZSA9IGF2X2ZyYW1lX2Nsb25lKHBpY3JlZik7CisKKyAgICAgICAgaWYgKG1hcF9mcmFtZV90b19zdXJmYWNlKHFzdl9mcmFtZS0+ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZxc3ZfZnJhbWUtPnN1cmZhY2VfaW50ZXJuYWwpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgZnJhbWUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHFzdl9mcmFtZS0+c3VyZmFjZSA9ICZxc3ZfZnJhbWUtPnN1cmZhY2VfaW50ZXJuYWw7CisgICAgfQorCisgICAgcXN2X2ZyYW1lLT5zdXJmYWNlLT5JbmZvICAgICAgICAgICA9IHMtPmZyYW1lX2luZm9zW0ZGX0lOTElOS19JRFgoaW5saW5rKV07CisgICAgcXN2X2ZyYW1lLT5zdXJmYWNlLT5EYXRhLlRpbWVTdGFtcCA9IGF2X3Jlc2NhbGVfcShxc3ZfZnJhbWUtPmZyYW1lLT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnRpbWVfYmFzZSwgZGVmYXVsdF90Yik7CisKKyAgICBxc3ZfZnJhbWUtPnN1cmZhY2UtPkluZm8uUGljU3RydWN0ID0KKyAgICAgICAgICAgICFxc3ZfZnJhbWUtPmZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lID8gTUZYX1BJQ1NUUlVDVF9QUk9HUkVTU0lWRSA6CisgICAgICAgICAgICAocXN2X2ZyYW1lLT5mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID8gTUZYX1BJQ1NUUlVDVF9GSUVMRF9URkYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GWF9QSUNTVFJVQ1RfRklFTERfQkZGKTsKKyAgICBpZiAocXN2X2ZyYW1lLT5mcmFtZS0+cmVwZWF0X3BpY3QgPT0gMSkKKyAgICAgICAgcXN2X2ZyYW1lLT5zdXJmYWNlLT5JbmZvLlBpY1N0cnVjdCB8PSBNRlhfUElDU1RSVUNUX0ZJRUxEX1JFUEVBVEVEOworICAgIGVsc2UgaWYgKHFzdl9mcmFtZS0+ZnJhbWUtPnJlcGVhdF9waWN0ID09IDIpCisgICAgICAgIHFzdl9mcmFtZS0+c3VyZmFjZS0+SW5mby5QaWNTdHJ1Y3QgfD0gTUZYX1BJQ1NUUlVDVF9GUkFNRV9ET1VCTElORzsKKyAgICBlbHNlIGlmIChxc3ZfZnJhbWUtPmZyYW1lLT5yZXBlYXRfcGljdCA9PSA0KQorICAgICAgICBxc3ZfZnJhbWUtPnN1cmZhY2UtPkluZm8uUGljU3RydWN0IHw9IE1GWF9QSUNTVFJVQ1RfRlJBTUVfVFJJUExJTkc7CisKKyAgICByZXR1cm4gcXN2X2ZyYW1lOworfQorCisvKiBnZXQgdGhlIG91dHB1dCBzdXJmYWNlICovCitzdGF0aWMgUVNWRnJhbWUgKnF1ZXJ5X2ZyYW1lKFFTVlZQUENvbnRleHQgKnMsIEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBRU1ZGcmFtZSAgICAgICAgKm91dF9mcmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgIHJldDsKKworICAgIGNsZWFyX3VudXNlZF9mcmFtZXMocy0+b3V0X2ZyYW1lX2xpc3QpOworCisgICAgb3V0X2ZyYW1lID0gZ2V0X2ZyZWVfZnJhbWUoJnMtPm91dF9mcmFtZV9saXN0KTsKKyAgICBpZiAoIW91dF9mcmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICAvKiBGb3IgdmlkZW8gbWVtb3J5LCBnZXQgYSBodyBmcmFtZTsKKyAgICAgKiBGb3Igc3lzdGVtIG1lbW9yeSwgZ2V0IGEgc3cgZnJhbWUgYW5kIG1hcCBpdCBpbnRvIGEgbWZ4X3N1cmZhY2UuICovCisgICAgaWYgKCFJU19TWVNURU1fTUVNT1JZKHMtPm91dF9tZW1fbW9kZSkpIHsKKyAgICAgICAgb3V0X2ZyYW1lLT5mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghb3V0X2ZyYW1lLT5mcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIHJldCA9IGF2X2h3ZnJhbWVfZ2V0X2J1ZmZlcihvdXRsaW5rLT5od19mcmFtZXNfY3R4LCBvdXRfZnJhbWUtPmZyYW1lLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNhbid0IGFsbG9jYXRlIGEgc3VyZmFjZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBvdXRfZnJhbWUtPnN1cmZhY2UgPSAobWZ4RnJhbWVTdXJmYWNlMSAqKW91dF9mcmFtZS0+ZnJhbWUtPmRhdGFbM107CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogR2V0IGEgZnJhbWUgd2l0aCBhbGlnbmVkIGRpbWVuc2lvbnMuCisgICAgICAgICAqIExpYm1meCBuZWVkIHN5c3RlbSBtZW1vcnkgYmVpbmcgMTI4eDY0IGFsaWduZWQgKi8KKyAgICAgICAgb3V0X2ZyYW1lLT5mcmFtZSA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZBTElHTihvdXRsaW5rLT53LCAxMjgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFMSUdOKG91dGxpbmstPmgsIDY0KSk7CisgICAgICAgIGlmICghb3V0X2ZyYW1lLT5mcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIG91dF9mcmFtZS0+ZnJhbWUtPndpZHRoICA9IG91dGxpbmstPnc7CisgICAgICAgIG91dF9mcmFtZS0+ZnJhbWUtPmhlaWdodCA9IG91dGxpbmstPmg7CisKKyAgICAgICAgcmV0ID0gbWFwX2ZyYW1lX3RvX3N1cmZhY2Uob3V0X2ZyYW1lLT5mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0X2ZyYW1lLT5zdXJmYWNlX2ludGVybmFsKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBvdXRfZnJhbWUtPnN1cmZhY2UgPSAmb3V0X2ZyYW1lLT5zdXJmYWNlX2ludGVybmFsOworICAgIH0KKworICAgIG91dF9mcmFtZS0+c3VyZmFjZS0+SW5mbyA9IHMtPnZwcF9wYXJhbS52cHAuT3V0OworCisgICAgcmV0dXJuIG91dF9mcmFtZTsKK30KKworLyogY3JlYXRlIHRoZSBRU1Ygc2Vzc2lvbiAqLworc3RhdGljIGludCBpbml0X3ZwcF9zZXNzaW9uKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgsIFFTVlZQUENvbnRleHQgKnMpCit7CisgICAgQVZGaWx0ZXJMaW5rICAgICAgICAgICAgICAgICAqaW5saW5rID0gYXZjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgICAgICAgICAgICAgICAgKm91dGxpbmsgPSBhdmN0eC0+b3V0cHV0c1swXTsKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgICppbl9mcmFtZXNfaHdjdHggPSBOVUxMOworICAgIEFWUVNWRnJhbWVzQ29udGV4dCAqb3V0X2ZyYW1lc19od2N0eCA9IE5VTEw7CisKKyAgICBBVkJ1ZmZlclJlZiAqZGV2aWNlX3JlZjsKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqZGV2aWNlX2N0eDsKKyAgICBBVlFTVkRldmljZUNvbnRleHQgKmRldmljZV9od2N0eDsKKyAgICBtZnhIREwgaGFuZGxlOworICAgIG1meEhhbmRsZVR5cGUgaGFuZGxlX3R5cGU7CisgICAgbWZ4VmVyc2lvbiB2ZXI7CisgICAgbWZ4SU1QTCBpbXBsOworICAgIGludCByZXQsIGk7CisKKyAgICBpZiAoaW5saW5rLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0ICopaW5saW5rLT5od19mcmFtZXNfY3R4LT5kYXRhOworCisgICAgICAgIGRldmljZV9yZWYgICAgICA9IGZyYW1lc19jdHgtPmRldmljZV9yZWY7CisgICAgICAgIGluX2ZyYW1lc19od2N0eCA9IGZyYW1lc19jdHgtPmh3Y3R4OworCisgICAgICAgIHMtPmluX21lbV9tb2RlID0gaW5fZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlOworCisgICAgICAgIHMtPnN1cmZhY2VfcHRyc19pbiA9IGF2X21hbGxvY3pfYXJyYXkoaW5fZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPnN1cmZhY2VfcHRyc19pbikpOworICAgICAgICBpZiAoIXMtPnN1cmZhY2VfcHRyc19pbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluX2ZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7IGkrKykKKyAgICAgICAgICAgIHMtPnN1cmZhY2VfcHRyc19pbltpXSA9IGluX2ZyYW1lc19od2N0eC0+c3VyZmFjZXMgKyBpOworCisgICAgICAgIHMtPm5iX3N1cmZhY2VfcHRyc19pbiA9IGluX2ZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7CisgICAgfSBlbHNlIGlmIChhdmN0eC0+aHdfZGV2aWNlX2N0eCkgeworICAgICAgICBkZXZpY2VfcmVmICAgICA9IGF2Y3R4LT5od19kZXZpY2VfY3R4OworICAgICAgICBzLT5pbl9tZW1fbW9kZSA9IE1GWF9NRU1UWVBFX1NZU1RFTV9NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyBodyBjb250ZXh0IHByb3ZpZGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZGV2aWNlX2N0eCAgID0gKEFWSFdEZXZpY2VDb250ZXh0ICopZGV2aWNlX3JlZi0+ZGF0YTsKKyAgICBkZXZpY2VfaHdjdHggPSBkZXZpY2VfY3R4LT5od2N0eDsKKworICAgIGlmIChvdXRsaW5rLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9RU1YpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKm91dF9mcmFtZXNfY3R4OworICAgICAgICBBVkJ1ZmZlclJlZiAqb3V0X2ZyYW1lc19yZWYgPSBhdl9od2ZyYW1lX2N0eF9hbGxvYyhkZXZpY2VfcmVmKTsKKyAgICAgICAgaWYgKCFvdXRfZnJhbWVzX3JlZikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgcy0+b3V0X21lbV9tb2RlID0gSVNfT1BBUVVFX01FTU9SWShzLT5pbl9tZW1fbW9kZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICBNRlhfTUVNVFlQRV9PUEFRVUVfRlJBTUUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICBNRlhfTUVNVFlQRV9WSURFT19NRU1PUllfREVDT0RFUl9UQVJHRVQ7CisKKyAgICAgICAgb3V0X2ZyYW1lc19jdHggICA9IChBVkhXRnJhbWVzQ29udGV4dCAqKW91dF9mcmFtZXNfcmVmLT5kYXRhOworICAgICAgICBvdXRfZnJhbWVzX2h3Y3R4ID0gb3V0X2ZyYW1lc19jdHgtPmh3Y3R4OworCisgICAgICAgIG91dF9mcmFtZXNfY3R4LT5mb3JtYXQgICAgICAgICAgICA9IEFWX1BJWF9GTVRfUVNWOworICAgICAgICBvdXRfZnJhbWVzX2N0eC0+d2lkdGggICAgICAgICAgICAgPSBGRkFMSUdOKG91dGxpbmstPncsIDMyKTsKKyAgICAgICAgb3V0X2ZyYW1lc19jdHgtPmhlaWdodCAgICAgICAgICAgID0gRkZBTElHTihvdXRsaW5rLT5oLCAzMik7CisgICAgICAgIG91dF9mcmFtZXNfY3R4LT5zd19mb3JtYXQgICAgICAgICA9IHMtPm91dF9zd19mb3JtYXQ7CisgICAgICAgIG91dF9mcmFtZXNfY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSA9IDY0OworICAgICAgICBvdXRfZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlICAgICAgPSBzLT5vdXRfbWVtX21vZGU7CisKKyAgICAgICAgcmV0ID0gYXZfaHdmcmFtZV9jdHhfaW5pdChvdXRfZnJhbWVzX3JlZik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJm91dF9mcmFtZXNfcmVmKTsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgY3JlYXRpbmcgZnJhbWVzX2N0eCBmb3Igb3V0cHV0IHBhZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIHMtPnN1cmZhY2VfcHRyc19vdXQgPSBhdl9tYWxsb2N6X2FycmF5KG91dF9mcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPnN1cmZhY2VfcHRyc19vdXQpKTsKKyAgICAgICAgaWYgKCFzLT5zdXJmYWNlX3B0cnNfb3V0KSB7CisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJm91dF9mcmFtZXNfcmVmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0X2ZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7IGkrKykKKyAgICAgICAgICAgIHMtPnN1cmZhY2VfcHRyc19vdXRbaV0gPSBvdXRfZnJhbWVzX2h3Y3R4LT5zdXJmYWNlcyArIGk7CisgICAgICAgIHMtPm5iX3N1cmZhY2VfcHRyc19vdXQgPSBvdXRfZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlczsKKworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJm91dGxpbmstPmh3X2ZyYW1lc19jdHgpOworICAgICAgICBvdXRsaW5rLT5od19mcmFtZXNfY3R4ID0gb3V0X2ZyYW1lc19yZWY7CisgICAgfSBlbHNlCisgICAgICAgIHMtPm91dF9tZW1fbW9kZSA9IE1GWF9NRU1UWVBFX1NZU1RFTV9NRU1PUlk7CisKKyAgICAvKiBleHRyYWN0IHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSAibWFzdGVyIiBzZXNzaW9uIGdpdmVuIHRvIHVzICovCisgICAgcmV0ID0gTUZYUXVlcnlJTVBMKGRldmljZV9od2N0eC0+c2Vzc2lvbiwgJmltcGwpOworICAgIGlmIChyZXQgPT0gTUZYX0VSUl9OT05FKQorICAgICAgICByZXQgPSBNRlhRdWVyeVZlcnNpb24oZGV2aWNlX2h3Y3R4LT5zZXNzaW9uLCAmdmVyKTsKKyAgICBpZiAocmV0ICE9IE1GWF9FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHF1ZXJ5aW5nIHRoZSBzZXNzaW9uIGF0dHJpYnV0ZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhoYW5kbGVfdHlwZXMpOyBpKyspIHsKKyAgICAgICAgcmV0ID0gTUZYVmlkZW9DT1JFX0dldEhhbmRsZShkZXZpY2VfaHdjdHgtPnNlc3Npb24sIGhhbmRsZV90eXBlc1tpXSwgJmhhbmRsZSk7CisgICAgICAgIGlmIChyZXQgPT0gTUZYX0VSUl9OT05FKSB7CisgICAgICAgICAgICBoYW5kbGVfdHlwZSA9IGhhbmRsZV90eXBlc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY3JlYXRlIGEgInNsYXZlIiBzZXNzaW9uIHdpdGggdGhvc2Ugc2FtZSBwcm9wZXJ0aWVzLCB0byBiZSB1c2VkIGZvciB2cHAgKi8KKyAgICByZXQgPSBNRlhJbml0KGltcGwsICZ2ZXIsICZzLT5zZXNzaW9uKTsKKyAgICBpZiAocmV0ICE9IE1GWF9FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBhIHNlc3Npb24gZm9yIHNjYWxpbmdcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgcmV0ID0gTUZYVmlkZW9DT1JFX1NldEhhbmRsZShzLT5zZXNzaW9uLCBoYW5kbGVfdHlwZSwgaGFuZGxlKTsKKyAgICAgICAgaWYgKHJldCAhPSBNRlhfRVJSX05PTkUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChRU1ZfUlVOVElNRV9WRVJTSU9OX0FUTEVBU1QodmVyLCAxLCAyNSkpIHsKKyAgICAgICAgcmV0ID0gTUZYSm9pblNlc3Npb24oZGV2aWNlX2h3Y3R4LT5zZXNzaW9uLCBzLT5zZXNzaW9uKTsKKyAgICAgICAgaWYgKHJldCAhPSBNRlhfRVJSX05PTkUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChJU19PUEFRVUVfTUVNT1JZKHMtPmluX21lbV9tb2RlKSB8fCBJU19PUEFRVUVfTUVNT1JZKHMtPm91dF9tZW1fbW9kZSkpIHsKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLkluLlN1cmZhY2VzICAgPSBzLT5zdXJmYWNlX3B0cnNfaW47CisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5Jbi5OdW1TdXJmYWNlID0gcy0+bmJfc3VyZmFjZV9wdHJzX2luOworICAgICAgICBzLT5vcGFxdWVfYWxsb2MuSW4uVHlwZSAgICAgICA9IHMtPmluX21lbV9tb2RlOworCisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5PdXQuU3VyZmFjZXMgICA9IHMtPnN1cmZhY2VfcHRyc19vdXQ7CisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5PdXQuTnVtU3VyZmFjZSA9IHMtPm5iX3N1cmZhY2VfcHRyc19vdXQ7CisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5PdXQuVHlwZSAgICAgICA9IHMtPm91dF9tZW1fbW9kZTsKKworICAgICAgICBzLT5vcGFxdWVfYWxsb2MuSGVhZGVyLkJ1ZmZlcklkID0gTUZYX0VYVEJVRkZfT1BBUVVFX1NVUkZBQ0VfQUxMT0NBVElPTjsKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLkhlYWRlci5CdWZmZXJTeiA9IHNpemVvZihzLT5vcGFxdWVfYWxsb2MpOworICAgIH0gZWxzZSBpZiAoSVNfVklERU9fTUVNT1JZKHMtPmluX21lbV9tb2RlKSB8fCBJU19WSURFT19NRU1PUlkocy0+b3V0X21lbV9tb2RlKSkgeworICAgICAgICBtZnhGcmFtZUFsbG9jYXRvciBmcmFtZV9hbGxvY2F0b3IgPSB7CisgICAgICAgICAgICAucHRoaXMgID0gcywKKyAgICAgICAgICAgIC5BbGxvYyAgPSBmcmFtZV9hbGxvYywKKyAgICAgICAgICAgIC5Mb2NrICAgPSBmcmFtZV9sb2NrLAorICAgICAgICAgICAgLlVubG9jayA9IGZyYW1lX3VubG9jaywKKyAgICAgICAgICAgIC5HZXRIREwgPSBmcmFtZV9nZXRfaGRsLAorICAgICAgICAgICAgLkZyZWUgICA9IGZyYW1lX2ZyZWUsCisgICAgICAgIH07CisKKyAgICAgICAgcmV0ID0gTUZYVmlkZW9DT1JFX1NldEZyYW1lQWxsb2NhdG9yKHMtPnNlc3Npb24sICZmcmFtZV9hbGxvY2F0b3IpOworICAgICAgICBpZiAocmV0ICE9IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmZl9xc3Z2cHBfY3JlYXRlKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgsIFFTVlZQUENvbnRleHQgKip2cHAsIFFTVlZQUFBhcmFtICpwYXJhbSkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0OworICAgIFFTVlZQUENvbnRleHQgKnM7CisKKyAgICBzID0gYXZfbWFsbG9jeihzaXplb2YoKnMpKTsKKyAgICBpZiAoIXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5maWx0ZXJfZnJhbWUgID0gcGFyYW0tPmZpbHRlcl9mcmFtZTsKKyAgICBpZiAoIXMtPmZpbHRlcl9mcmFtZSkKKyAgICAgICAgcy0+ZmlsdGVyX2ZyYW1lID0gZmZfZmlsdGVyX2ZyYW1lOworICAgIHMtPm91dF9zd19mb3JtYXQgPSBwYXJhbS0+b3V0X3N3X2Zvcm1hdDsKKworICAgIC8qIGNyZWF0ZSB0aGUgdnBwIHNlc3Npb24gKi8KKyAgICByZXQgPSBpbml0X3ZwcF9zZXNzaW9uKGF2Y3R4LCBzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsZWQ7CisKKyAgICBzLT5mcmFtZV9pbmZvcyA9IGF2X21hbGxvY3pfYXJyYXkoYXZjdHgtPm5iX2lucHV0cywgc2l6ZW9mKCpzLT5mcmFtZV9pbmZvcykpOworICAgIGlmICghcy0+ZnJhbWVfaW5mb3MpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICAvKiBJbml0IGVhY2ggaW5wdXQncyBpbmZvcm1hdGlvbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgcmV0ID0gZmlsbF9mcmFtZWluZm9fYnlfbGluaygmcy0+ZnJhbWVfaW5mb3NbaV0sIGF2Y3R4LT5pbnB1dHNbaV0pOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgIH0KKworICAgIC8qIFVwZGF0ZSBpbnB1dCdzIGZyYW1lIGluZm8gYWNjb3JkaW5nIHRvIGNyb3AgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW0tPm51bV9jcm9wOyBpKyspIHsKKyAgICAgICAgUVNWVlBQQ3JvcCAqY3JvcCA9IHBhcmFtLT5jcm9wICsgaTsKKyAgICAgICAgaWYgKGNyb3AtPmluX2lkeCA+IGF2Y3R4LT5uYl9pbnB1dHMpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisgICAgICAgIHMtPmZyYW1lX2luZm9zW2Nyb3AtPmluX2lkeF0uQ3JvcFggPSBjcm9wLT54OworICAgICAgICBzLT5mcmFtZV9pbmZvc1tjcm9wLT5pbl9pZHhdLkNyb3BZID0gY3JvcC0+eTsKKyAgICAgICAgcy0+ZnJhbWVfaW5mb3NbY3JvcC0+aW5faWR4XS5Dcm9wVyA9IGNyb3AtPnc7CisgICAgICAgIHMtPmZyYW1lX2luZm9zW2Nyb3AtPmluX2lkeF0uQ3JvcEggPSBjcm9wLT5oOworICAgIH0KKworICAgIHMtPnZwcF9wYXJhbS52cHAuSW4gPSBzLT5mcmFtZV9pbmZvc1swXTsKKworICAgIHJldCA9IGZpbGxfZnJhbWVpbmZvX2J5X2xpbmsoJnMtPnZwcF9wYXJhbS52cHAuT3V0LCBhdmN0eC0+b3V0cHV0c1swXSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsIHRvIGdldCBmcmFtZSBpbmZvIGZyb20gbGluay5cbiIpOworICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICB9CisKKyAgICBpZiAoSVNfT1BBUVVFX01FTU9SWShzLT5pbl9tZW1fbW9kZSkgfHwgSVNfT1BBUVVFX01FTU9SWShzLT5vdXRfbWVtX21vZGUpKSB7CisgICAgICAgIHMtPm5iX2V4dF9idWZmZXJzID0gcGFyYW0tPm51bV9leHRfYnVmICsgMTsKKyAgICAgICAgcy0+ZXh0X2J1ZmZlcnMgPSBhdl9tYWxsb2N6X2FycmF5KHMtPm5iX2V4dF9idWZmZXJzLCBzaXplb2YoKnMtPmV4dF9idWZmZXJzKSk7CisgICAgICAgIGlmICghcy0+ZXh0X2J1ZmZlcnMpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICB9CisKKyAgICAgICAgcy0+ZXh0X2J1ZmZlcnNbMF0gPSAobWZ4RXh0QnVmZmVyICopJnMtPm9wYXF1ZV9hbGxvYzsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHBhcmFtLT5udW1fZXh0X2J1ZjsgaSsrKQorICAgICAgICAgICAgcy0+ZXh0X2J1ZmZlcnNbaV0gICAgPSBwYXJhbS0+ZXh0X2J1ZltpIC0gMV07CisgICAgICAgIHMtPnZwcF9wYXJhbS5FeHRQYXJhbSAgICA9IHMtPmV4dF9idWZmZXJzOworICAgICAgICBzLT52cHBfcGFyYW0uTnVtRXh0UGFyYW0gPSBzLT5uYl9leHRfYnVmZmVyczsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT52cHBfcGFyYW0uTnVtRXh0UGFyYW0gPSBwYXJhbS0+bnVtX2V4dF9idWY7CisgICAgICAgIHMtPnZwcF9wYXJhbS5FeHRQYXJhbSAgICA9IHBhcmFtLT5leHRfYnVmOworICAgIH0KKworICAgIHMtPnZwcF9wYXJhbS5Bc3luY0RlcHRoID0gMTsKKworICAgIGlmIChJU19TWVNURU1fTUVNT1JZKHMtPmluX21lbV9tb2RlKSkKKyAgICAgICAgcy0+dnBwX3BhcmFtLklPUGF0dGVybiB8PSBNRlhfSU9QQVRURVJOX0lOX1NZU1RFTV9NRU1PUlk7CisgICAgZWxzZSBpZiAoSVNfVklERU9fTUVNT1JZKHMtPmluX21lbV9tb2RlKSkKKyAgICAgICAgcy0+dnBwX3BhcmFtLklPUGF0dGVybiB8PSBNRlhfSU9QQVRURVJOX0lOX1ZJREVPX01FTU9SWTsKKyAgICBlbHNlIGlmIChJU19PUEFRVUVfTUVNT1JZKHMtPmluX21lbV9tb2RlKSkKKyAgICAgICAgcy0+dnBwX3BhcmFtLklPUGF0dGVybiB8PSBNRlhfSU9QQVRURVJOX0lOX09QQVFVRV9NRU1PUlk7CisKKyAgICBpZiAoSVNfU1lTVEVNX01FTU9SWShzLT5vdXRfbWVtX21vZGUpKQorICAgICAgICBzLT52cHBfcGFyYW0uSU9QYXR0ZXJuIHw9IE1GWF9JT1BBVFRFUk5fT1VUX1NZU1RFTV9NRU1PUlk7CisgICAgZWxzZSBpZiAoSVNfVklERU9fTUVNT1JZKHMtPm91dF9tZW1fbW9kZSkpCisgICAgICAgIHMtPnZwcF9wYXJhbS5JT1BhdHRlcm4gfD0gTUZYX0lPUEFUVEVSTl9PVVRfVklERU9fTUVNT1JZOworICAgIGVsc2UgaWYgKElTX09QQVFVRV9NRU1PUlkocy0+b3V0X21lbV9tb2RlKSkKKyAgICAgICAgcy0+dnBwX3BhcmFtLklPUGF0dGVybiB8PSBNRlhfSU9QQVRURVJOX09VVF9PUEFRVUVfTUVNT1JZOworCisgICAgcmV0ID0gTUZYVmlkZW9WUFBfSW5pdChzLT5zZXNzaW9uLCAmcy0+dnBwX3BhcmFtKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgYSBxc3Z2cHAsIHJldCA9ICVkLlxuIiwgcmV0KTsKKyAgICAgICAgZ290byBmYWlsZWQ7CisgICAgfQorCisgICAgKnZwcCA9IHM7CisgICAgcmV0dXJuIDA7CisKK2ZhaWxlZDoKKyAgICBmZl9xc3Z2cHBfZnJlZSgmcyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfcXN2dnBwX2ZyZWUoUVNWVlBQQ29udGV4dCAqKnZwcCkKK3sKKyAgICBRU1ZWUFBDb250ZXh0ICpzID0gKnZwcDsKKworICAgIGlmICghcykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAocy0+c2Vzc2lvbikgeworICAgICAgICBNRlhWaWRlb1ZQUF9DbG9zZShzLT5zZXNzaW9uKTsKKyAgICAgICAgTUZYQ2xvc2Uocy0+c2Vzc2lvbik7CisgICAgfQorCisgICAgLyogcmVsZWFzZSBhbGwgdGhlIHJlc291cmNlcyAqLworICAgIGNsZWFyX2ZyYW1lX2xpc3QoJnMtPmluX2ZyYW1lX2xpc3QpOworICAgIGNsZWFyX2ZyYW1lX2xpc3QoJnMtPm91dF9mcmFtZV9saXN0KTsKKyAgICBhdl9mcmVlcCgmcy0+c3VyZmFjZV9wdHJzX2luKTsKKyAgICBhdl9mcmVlcCgmcy0+c3VyZmFjZV9wdHJzX291dCk7CisgICAgYXZfZnJlZXAoJnMtPmV4dF9idWZmZXJzKTsKKyAgICBhdl9mcmVlcCgmcy0+ZnJhbWVfaW5mb3MpOworICAgIGF2X2ZyZWVwKHZwcCk7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3FzdnZwcF9maWx0ZXJfZnJhbWUoUVNWVlBQQ29udGV4dCAqcywgQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKnBpY3JlZikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICpjdHggICAgID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICAgICAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBtZnhTeW5jUG9pbnQgICAgICBzeW5jOworICAgIFFTVkZyYW1lICAgICAgICAgKmluX2ZyYW1lLCAqb3V0X2ZyYW1lOworICAgIGludCAgICAgICAgICAgICAgIHJldCwgZmlsdGVyX3JldDsKKworICAgIGluX2ZyYW1lID0gc3VibWl0X2ZyYW1lKHMsIGlubGluaywgcGljcmVmKTsKKyAgICBpZiAoIWluX2ZyYW1lKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzdWJtaXQgZnJhbWUgb24gaW5wdXRbJWRdXG4iLAorICAgICAgICAgICAgICAgRkZfSU5MSU5LX0lEWChpbmxpbmspKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIG91dF9mcmFtZSA9IHF1ZXJ5X2ZyYW1lKHMsIG91dGxpbmspOworICAgICAgICBpZiAoIW91dF9mcmFtZSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IGFuIG91dHB1dCBmcmFtZS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJldCA9IE1GWFZpZGVvVlBQX1J1bkZyYW1lVlBQQXN5bmMocy0+c2Vzc2lvbiwgaW5fZnJhbWUtPnN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9mcmFtZS0+c3VyZmFjZSwgTlVMTCwgJnN5bmMpOworICAgICAgICAgICAgaWYgKHJldCA9PSBNRlhfV1JOX0RFVklDRV9CVVNZKQorICAgICAgICAgICAgICAgIGF2X3VzbGVlcCg1MDApOworICAgICAgICB9IHdoaWxlIChyZXQgPT0gTUZYX1dSTl9ERVZJQ0VfQlVTWSk7CisKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IE1GWF9FUlJfTU9SRV9TVVJGQUNFKSB7CisgICAgICAgICAgICAvKiBJZ25vcmUgbW9yZV9kYXRhIGVycm9yICovCisgICAgICAgICAgICBpZiAocmV0ID09IE1GWF9FUlJfTU9SRV9EQVRBKQorICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE1GWFZpZGVvQ09SRV9TeW5jT3BlcmF0aW9uKHMtPnNlc3Npb24sIHN5bmMsIDEwMDApIDwgMCkKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiU3luYyBmYWlsZWQuXG4iKTsKKworICAgICAgICBvdXRfZnJhbWUtPmZyYW1lLT5wdHMgPSBhdl9yZXNjYWxlX3Eob3V0X2ZyYW1lLT5zdXJmYWNlLT5EYXRhLlRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfdGIsIG91dGxpbmstPnRpbWVfYmFzZSk7CisKKyAgICAgICAgZmlsdGVyX3JldCA9IHMtPmZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXRfZnJhbWUtPmZyYW1lKTsKKyAgICAgICAgaWYgKGZpbHRlcl9yZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXRfZnJhbWUtPmZyYW1lKTsKKyAgICAgICAgICAgIHJldCA9IGZpbHRlcl9yZXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBvdXRfZnJhbWUtPmZyYW1lID0gTlVMTDsKKyAgICB9IHdoaWxlKHJldCA9PSBNRlhfRVJSX01PUkVfU1VSRkFDRSk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvcXN2dnBwLmggYi9saWJhdmZpbHRlci9xc3Z2cHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjAyYjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvcXN2dnBwLmgKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBJbnRlbCBRdWljayBTeW5jIFZpZGVvIFZQUCBiYXNlIGZ1bmN0aW9uCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9RU1ZWUFBfSAorI2RlZmluZSBBVkZJTFRFUl9RU1ZWUFBfSAorCisjaW5jbHVkZSA8bWZ4L21meHZpZGVvLmg+CisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCisjZGVmaW5lIEZGX0lOTElOS19JRFgobGluaykgICgoaW50KSgobGluayktPmRzdHBhZCAtIChsaW5rKS0+ZHN0LT5pbnB1dF9wYWRzKSkKKyNkZWZpbmUgRkZfT1VUTElOS19JRFgobGluaykgKChpbnQpKChsaW5rKS0+c3JjcGFkIC0gKGxpbmspLT5zcmMtPm91dHB1dF9wYWRzKSkKKworI2RlZmluZSBRU1ZfVkVSU0lPTl9BVExFQVNUKE1BSk9SLCBNSU5PUikgICBcCisgICAgKE1GWF9WRVJTSU9OX01BSk9SID4gKE1BSk9SKSB8fCAgICAgICAgIFwKKyAgICAgTUZYX1ZFUlNJT05fTUFKT1IgPT0gKE1BSk9SKSAmJiBNRlhfVkVSU0lPTl9NSU5PUiA+PSAoTUlOT1IpKQorCisjZGVmaW5lIFFTVl9SVU5USU1FX1ZFUlNJT05fQVRMRUFTVChNRlhfVkVSU0lPTiwgTUFKT1IsIE1JTk9SKSBcCisgICAgKE1GWF9WRVJTSU9OLk1ham9yID4gKE1BSk9SKSkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKE1GWF9WRVJTSU9OLk1ham9yID09IChNQUpPUikgJiYgTUZYX1ZFUlNJT04uTWlub3IgPj0gKE1JTk9SKSkKKwordHlwZWRlZiBzdHJ1Y3QgUVNWVlBQQ29udGV4dCBRU1ZWUFBDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBRU1ZWUFBDcm9wIHsKKyAgICBpbnQgaW5faWR4OyAgICAgICAgLy8vPCBJbnB1dCBpbmRleAorICAgIGludCB4LCB5LCB3LCBoOyAgICAvLy88IENyb3AgcmVjdGFuZ2xlCit9IFFTVlZQUENyb3A7CisKK3R5cGVkZWYgc3RydWN0IFFTVlZQUFBhcmFtIHsKKyAgICAvKiBkZWZhdWx0IGlzIGZmX2ZpbHRlcl9mcmFtZSAqLworICAgIGludCAoKmZpbHRlcl9mcmFtZSkoQVZGaWx0ZXJMaW5rICpvdXRsaW5rLCBBVkZyYW1lICpmcmFtZSk7CisKKyAgICAvKiBUbyBmaWxsIHdpdGggTUZYIGVuaGFuY2VkIGZpbHRlciBjb25maWd1cmF0aW9ucyAqLworICAgIGludCBudW1fZXh0X2J1ZjsKKyAgICBtZnhFeHRCdWZmZXIgKipleHRfYnVmOworCisgICAgLyogUmVhbCBvdXRwdXQgZm9ybWF0ICovCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9zd19mb3JtYXQ7CisKKyAgICAvKiBDcm9wIGluZm9ybWF0aW9uIGZvciBlYWNoIGlucHV0LCBpZiBuZWVkZWQgKi8KKyAgICBpbnQgbnVtX2Nyb3A7CisgICAgUVNWVlBQQ3JvcCAqY3JvcDsKK30gUVNWVlBQUGFyYW07CisKKy8qIGNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgUVNWIHNlc3Npb24gKi8KK2ludCBmZl9xc3Z2cHBfY3JlYXRlKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgsIFFTVlZQUENvbnRleHQgKip2cHAsIFFTVlZQUFBhcmFtICpwYXJhbSk7CisKKy8qIHJlbGVhc2UgdGhlIHJlc291cmNlcyAoZWcuc3VyZmFjZXMpICovCitpbnQgZmZfcXN2dnBwX2ZyZWUoUVNWVlBQQ29udGV4dCAqKnZwcCk7CisKKy8qIHZwcCBmaWx0ZXIgZnJhbWUgYW5kIGNhbGwgdGhlIGNiIGlmIG5lZWRlZCAqLworaW50IGZmX3FzdnZwcF9maWx0ZXJfZnJhbWUoUVNWVlBQQ29udGV4dCAqdnBwLCBBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpOworCisjZW5kaWYgLyogQVZGSUxURVJfUVNWVlBQX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3NjYWxlLmMgYi9saWJhdmZpbHRlci9zY2FsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWU5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9zY2FsZS5jCkBAIC0wLDAgKzEsMjEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IEJvYmJ5IEJpbmdoYW0KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgInNjYWxlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7CisgICAgIlBJIiwKKyAgICAiUEhJIiwKKyAgICAiRSIsCisgICAgImluX3ciLCAgICJpdyIsCisgICAgImluX2giLCAgICJpaCIsCisgICAgIm91dF93IiwgICJvdyIsCisgICAgIm91dF9oIiwgICJvaCIsCisgICAgImEiLAorICAgICJzYXIiLAorICAgICJkYXIiLAorICAgICJoc3ViIiwKKyAgICAidnN1YiIsCisgICAgIm9oc3ViIiwKKyAgICAib3ZzdWIiLAorICAgIE5VTEwKK307CisKK2VudW0gdmFyX25hbWUgeworICAgIFZBUl9QSSwKKyAgICBWQVJfUEhJLAorICAgIFZBUl9FLAorICAgIFZBUl9JTl9XLCAgIFZBUl9JVywKKyAgICBWQVJfSU5fSCwgICBWQVJfSUgsCisgICAgVkFSX09VVF9XLCAgVkFSX09XLAorICAgIFZBUl9PVVRfSCwgIFZBUl9PSCwKKyAgICBWQVJfQSwKKyAgICBWQVJfU0FSLAorICAgIFZBUl9EQVIsCisgICAgVkFSX0hTVUIsCisgICAgVkFSX1ZTVUIsCisgICAgVkFSX09IU1VCLAorICAgIFZBUl9PVlNVQiwKKyAgICBWQVJTX05CCit9OworCisvKioKKyAqIFRoaXMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB2YXJfbmFtZXMgc28gdGhhdCBpdCBpcyBhbHdheXMgYQorICogY29tcGxldGUgbGlzdCBvZiB2YXJfbmFtZXMgd2l0aCB0aGUgc2NhbGUycmVmIHNwZWNpZmljIG5hbWVzCisgKiBhcHBlbmRlZC4gc2NhbGUycmVmIHZhbHVlcyBtdXN0IGFwcGVhciBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIKKyAqIGluIHRoZSB2YXJfbmFtZV9zY2FsZTJyZWYgZW51bSBidXQgYWxzbyBiZSBiZWxvdyBhbGwgb2YgdGhlCisgKiBub24tc2NhbGUycmVmIHNwZWNpZmljIHZhbHVlcy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc19zY2FsZTJyZWZbXSA9IHsKKyAgICAiUEkiLAorICAgICJQSEkiLAorICAgICJFIiwKKyAgICAiaW5fdyIsICAgIml3IiwKKyAgICAiaW5faCIsICAgImloIiwKKyAgICAib3V0X3ciLCAgIm93IiwKKyAgICAib3V0X2giLCAgIm9oIiwKKyAgICAiYSIsCisgICAgInNhciIsCisgICAgImRhciIsCisgICAgImhzdWIiLAorICAgICJ2c3ViIiwKKyAgICAib2hzdWIiLAorICAgICJvdnN1YiIsCisgICAgIm1haW5fdyIsCisgICAgIm1haW5faCIsCisgICAgIm1haW5fYSIsCisgICAgIm1haW5fc2FyIiwKKyAgICAibWFpbl9kYXIiLCAibWRhciIsCisgICAgIm1haW5faHN1YiIsCisgICAgIm1haW5fdnN1YiIsCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZV9zY2FsZTJyZWYgeworICAgIFZBUl9TMlJfTUFJTl9XLAorICAgIFZBUl9TMlJfTUFJTl9ILAorICAgIFZBUl9TMlJfTUFJTl9BLAorICAgIFZBUl9TMlJfTUFJTl9TQVIsCisgICAgVkFSX1MyUl9NQUlOX0RBUiwgVkFSX1MyUl9NREFSLAorICAgIFZBUl9TMlJfTUFJTl9IU1VCLAorICAgIFZBUl9TMlJfTUFJTl9WU1VCLAorICAgIFZBUlNfUzJSX05CCit9OworCitpbnQgZmZfc2NhbGVfZXZhbF9kaW1lbnNpb25zKHZvaWQgKmxvZ19jdHgsCisgICAgY29uc3QgY2hhciAqd19leHByLCBjb25zdCBjaGFyICpoX2V4cHIsCisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRmlsdGVyTGluayAqb3V0bGluaywKKyAgICBpbnQgKnJldF93LCBpbnQgKnJldF9oKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqb3V0X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgY29uc3QgY2hhciAqZXhwcjsKKyAgICBpbnQgdywgaDsKKyAgICBpbnQgZmFjdG9yX3csIGZhY3Rvcl9oOworICAgIGludCBldmFsX3csIGV2YWxfaDsKKyAgICBpbnQgcmV0OworICAgIGNvbnN0IGNoYXIgc2NhbGUycmVmID0gb3V0bGluay0+c3JjLT5uYl9pbnB1dHMgPT0gMiAmJiBvdXRsaW5rLT5zcmMtPmlucHV0c1sxXSA9PSBpbmxpbms7CisgICAgZG91YmxlIHZhcl92YWx1ZXNbVkFSU19OQiArIFZBUlNfUzJSX05CXSwgcmVzOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqbWFpbl9kZXNjOworICAgIGNvbnN0IEFWRmlsdGVyTGluayAqbWFpbl9saW5rOworICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpuYW1lcyA9IHNjYWxlMnJlZiA/IHZhcl9uYW1lc19zY2FsZTJyZWYgOiB2YXJfbmFtZXM7CisKKyAgICBpZiAoc2NhbGUycmVmKSB7CisgICAgICAgIG1haW5fbGluayA9IG91dGxpbmstPnNyYy0+aW5wdXRzWzBdOworICAgICAgICBtYWluX2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG1haW5fbGluay0+Zm9ybWF0KTsKKyAgICB9CisKKyAgICB2YXJfdmFsdWVzW1ZBUl9QSV0gICAgPSBNX1BJOworICAgIHZhcl92YWx1ZXNbVkFSX1BISV0gICA9IE1fUEhJOworICAgIHZhcl92YWx1ZXNbVkFSX0VdICAgICA9IE1fRTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9JTl9XXSAgPSB2YXJfdmFsdWVzW1ZBUl9JV10gPSBpbmxpbmstPnc7CisgICAgdmFyX3ZhbHVlc1tWQVJfSU5fSF0gID0gdmFyX3ZhbHVlc1tWQVJfSUhdID0gaW5saW5rLT5oOworICAgIHZhcl92YWx1ZXNbVkFSX09VVF9XXSA9IHZhcl92YWx1ZXNbVkFSX09XXSA9IE5BTjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVVRfSF0gPSB2YXJfdmFsdWVzW1ZBUl9PSF0gPSBOQU47CisgICAgdmFyX3ZhbHVlc1tWQVJfQV0gICAgID0gKGRvdWJsZSkgaW5saW5rLT53IC8gaW5saW5rLT5oOworICAgIHZhcl92YWx1ZXNbVkFSX1NBUl0gICA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPworICAgICAgICAoZG91YmxlKSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtIC8gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA6IDE7CisgICAgdmFyX3ZhbHVlc1tWQVJfREFSXSAgID0gdmFyX3ZhbHVlc1tWQVJfQV0gKiB2YXJfdmFsdWVzW1ZBUl9TQVJdOworICAgIHZhcl92YWx1ZXNbVkFSX0hTVUJdICA9IDEgPDwgZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICB2YXJfdmFsdWVzW1ZBUl9WU1VCXSAgPSAxIDw8IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgdmFyX3ZhbHVlc1tWQVJfT0hTVUJdID0gMSA8PCBvdXRfZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVlNVQl0gPSAxIDw8IG91dF9kZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgaWYgKHNjYWxlMnJlZikgeworICAgICAgICB2YXJfdmFsdWVzW1ZBUlNfTkIgKyBWQVJfUzJSX01BSU5fV10gPSBtYWluX2xpbmstPnc7CisgICAgICAgIHZhcl92YWx1ZXNbVkFSU19OQiArIFZBUl9TMlJfTUFJTl9IXSA9IG1haW5fbGluay0+aDsKKyAgICAgICAgdmFyX3ZhbHVlc1tWQVJTX05CICsgVkFSX1MyUl9NQUlOX0FdID0gKGRvdWJsZSkgbWFpbl9saW5rLT53IC8gbWFpbl9saW5rLT5oOworICAgICAgICB2YXJfdmFsdWVzW1ZBUlNfTkIgKyBWQVJfUzJSX01BSU5fU0FSXSA9IG1haW5fbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPworICAgICAgICAgICAgKGRvdWJsZSkgbWFpbl9saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAvIG1haW5fbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gOiAxOworICAgICAgICB2YXJfdmFsdWVzW1ZBUlNfTkIgKyBWQVJfUzJSX01BSU5fREFSXSA9IHZhcl92YWx1ZXNbVkFSU19OQiArIFZBUl9TMlJfTURBUl0gPQorICAgICAgICAgICAgdmFyX3ZhbHVlc1tWQVJTX05CICsgVkFSX1MyUl9NQUlOX0FdICogdmFyX3ZhbHVlc1tWQVJTX05CICsgVkFSX1MyUl9NQUlOX1NBUl07CisgICAgICAgIHZhcl92YWx1ZXNbVkFSU19OQiArIFZBUl9TMlJfTUFJTl9IU1VCXSA9IDEgPDwgbWFpbl9kZXNjLT5sb2cyX2Nocm9tYV93OworICAgICAgICB2YXJfdmFsdWVzW1ZBUlNfTkIgKyBWQVJfUzJSX01BSU5fVlNVQl0gPSAxIDw8IG1haW5fZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICB9CisKKyAgICAvKiBldmFsdWF0ZSB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCAoZXhwciA9IHdfZXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGxvZ19jdHgpOworICAgIGV2YWxfdyA9IHZhcl92YWx1ZXNbVkFSX09VVF9XXSA9IHZhcl92YWx1ZXNbVkFSX09XXSA9IChpbnQpIHJlcyA9PSAwID8gaW5saW5rLT53IDogKGludCkgcmVzOworCisgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gaF9leHByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMsIHZhcl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGxvZ19jdHgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBldmFsX2ggPSB2YXJfdmFsdWVzW1ZBUl9PVVRfSF0gPSB2YXJfdmFsdWVzW1ZBUl9PSF0gPSAoaW50KSByZXMgPT0gMCA/IGlubGluay0+aCA6IChpbnQpIHJlczsKKyAgICAvKiBldmFsdWF0ZSBhZ2FpbiB0aGUgd2lkdGgsIGFzIGl0IG1heSBkZXBlbmQgb24gdGhlIG91dHB1dCBoZWlnaHQgKi8KKyAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJnJlcywgKGV4cHIgPSB3X2V4cHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgbG9nX2N0eCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGV2YWxfdyA9IChpbnQpIHJlcyA9PSAwID8gaW5saW5rLT53IDogKGludCkgcmVzOworCisgICAgdyA9IGV2YWxfdzsKKyAgICBoID0gZXZhbF9oOworCisgICAgLyogQ2hlY2sgaWYgaXQgaXMgcmVxdWVzdGVkIHRoYXQgdGhlIHJlc3VsdCBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IGEgc29tZQorICAgICAqIGZhY3RvciAodyBvciBoID0gLW4gd2l0aCBuIGJlaW5nIHRoZSBmYWN0b3IpLiAqLworICAgIGZhY3Rvcl93ID0gMTsKKyAgICBmYWN0b3JfaCA9IDE7CisgICAgaWYgKHcgPCAtMSkgeworICAgICAgICBmYWN0b3JfdyA9IC13OworICAgIH0KKyAgICBpZiAoaCA8IC0xKSB7CisgICAgICAgIGZhY3Rvcl9oID0gLWg7CisgICAgfQorCisgICAgaWYgKHcgPCAwICYmIGggPCAwKSB7CisgICAgICAgIHcgPSBpbmxpbmstPnc7CisgICAgICAgIGggPSBpbmxpbmstPmg7CisgICAgfQorCisgICAgLyogTWFrZSBzdXJlIHRoYXQgdGhlIHJlc3VsdCBpcyBkaXZpc2libGUgYnkgdGhlIGZhY3RvciB3ZSBkZXRlcm1pbmVkCisgICAgICogZWFybGllci4gSWYgbm8gZmFjdG9yIHdhcyBzZXQsIGl0IGlzIG5vdGhpbmcgd2lsbCBoYXBwZW4gYXMgdGhlIGRlZmF1bHQKKyAgICAgKiBmYWN0b3IgaXMgMSAqLworICAgIGlmICh3IDwgMCkKKyAgICAgICAgdyA9IGF2X3Jlc2NhbGUoaCwgaW5saW5rLT53LCBpbmxpbmstPmggKiBmYWN0b3JfdykgKiBmYWN0b3JfdzsKKyAgICBpZiAoaCA8IDApCisgICAgICAgIGggPSBhdl9yZXNjYWxlKHcsIGlubGluay0+aCwgaW5saW5rLT53ICogZmFjdG9yX2gpICogZmFjdG9yX2g7CisKKyAgICAqcmV0X3cgPSB3OworICAgICpyZXRfaCA9IGg7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAiRXJyb3Igd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uICclcycuXG4iCisgICAgICAgICAgICJNYXliZSB0aGUgZXhwcmVzc2lvbiBmb3Igb3V0X3c6JyVzJyBvciBmb3Igb3V0X2g6JyVzJyBpcyBzZWxmLXJlZmVyZW5jaW5nLlxuIiwKKyAgICAgICAgICAgZXhwciwgd19leHByLCBoX2V4cHIpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9zY2FsZS5oIGIvbGliYXZmaWx0ZXIvc2NhbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmU2N2QwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvc2NhbGUuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZGSUxURVJfU0NBTEVfSAorI2RlZmluZSBBVkZJTFRFUl9TQ0FMRV9ICisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCitpbnQgZmZfc2NhbGVfZXZhbF9kaW1lbnNpb25zKHZvaWQgKmN0eCwKKyAgICBjb25zdCBjaGFyICp3X2V4cHIsIGNvbnN0IGNoYXIgKmhfZXhwciwKKyAgICBBVkZpbHRlckxpbmsgKmlubGluaywgQVZGaWx0ZXJMaW5rICpvdXRsaW5rLAorICAgIGludCAqcmV0X3csIGludCAqcmV0X2gpOworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9zZXRwdHMuYyBiL2xpYmF2ZmlsdGVyL3NldHB0cy5jCmluZGV4IDJjY2NhMjguLjQ1MDU0OTggMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3NldHB0cy5jCisrKyBiL2xpYmF2ZmlsdGVyL3NldHB0cy5jCkBAIC0xNjUsNyArMTY1LDcgQEAKICAgICB9CiAgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QVFMgICAgICAgXSA9IFRTMkQoZnJhbWUtPnB0cyk7CiAgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9UICAgICAgICAgXSA9IFRTMlQoZnJhbWUtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UpOwotICAgIHNldHB0cy0+dmFyX3ZhbHVlc1tWQVJfUE9TICAgICAgIF0gPSBhdl9mcmFtZV9nZXRfcGt0X3BvcyhmcmFtZSkgPT0gLTEgPyBOQU4gOiBhdl9mcmFtZV9nZXRfcGt0X3BvcyhmcmFtZSk7CisgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9QT1MgICAgICAgXSA9IGZyYW1lLT5wa3RfcG9zID09IC0xID8gTkFOIDogZnJhbWUtPnBrdF9wb3M7CiAgICAgc2V0cHRzLT52YXJfdmFsdWVzW1ZBUl9SVENUSU1FICAgXSA9IGF2X2dldHRpbWUoKTsKIAogICAgIGlmIChpbmxpbmstPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9zaWduYXR1cmUuaCBiL2xpYmF2ZmlsdGVyL3NpZ25hdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTk4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci9zaWduYXR1cmUuaApAQCAtMCwwICsxLDU2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBHZXJpb24gRW50cnVwCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBFRy03IHZpZGVvIHNpZ25hdHVyZSBjYWxjdWxhdGlvbiBhbmQgbG9va3VwIGZpbHRlcgorICovCisKKyNpZm5kZWYgQVZGSUxURVJfU0lHTkFUVVJFX0gKKyNkZWZpbmUgQVZGSUxURVJfU0lHTkFUVVJFX0gKKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCisjZGVmaW5lIEVMRU1FTlRfQ09VTlQgMTAKKyNkZWZpbmUgU0lHRUxFTV9TSVpFIDM4MAorI2RlZmluZSBESUZGRUxFTV9TSVpFIDM0OCAvKiBTSUdFTEVNX1NJWkUgLSBlbGVtX2ExIC0gZWxlbV9hMiAqLworI2RlZmluZSBDT0FSU0VfU0laRSA5MAorCitlbnVtIGxvb2t1cF9tb2RlIHsKKyAgICBNT0RFX09GRiwKKyAgICBNT0RFX0ZVTEwsCisgICAgTU9ERV9GQVNULAorICAgIE5CX0xPT0tVUF9NT0RFCit9OworCitlbnVtIGZvcm1hdHMgeworICAgIEZPUk1BVF9CSU5BUlksCisgICAgRk9STUFUX1hNTCwKKyAgICBOQl9GT1JNQVRTCit9OworCit0eXBlZGVmIHN0cnVjdCBQb2ludCB7CisgICAgdWludDhfdCB4OworICAgIHVpbnQ4X3QgeTsKK30gUG9pbnQ7CisKK3R5cGVkZWYgc3RydWN0IEJsb2NrIHsKKyAgICBQb2ludCB1cDsKKyAgICBQb2ludCB0bzsKK30gQmxvY2s7CisKK3R5cGVkZWYgc3RydWN0IEVsZW1DYXQgeworICAgIGludCBhdl9lbGVtOyAvKiBhdmVyYWdlIGVsZW1lbnQgY2F0ZWdvcnkgKi8KKyAgICBzaG9ydCBsZWZ0X2NvdW50OyAvKiBjb3VudCBvZiBibG9ja3MgdGhhdCB3aWxsIGJlIGFkZGVkIHRvZ2V0aGVyICovCisgICAgc2hvcnQgYmxvY2tfY291bnQ7IC8qIGNvdW50IG9mIGJsb2NrcyBwZXIgZWxlbWVudCAqLworICAgIHNob3J0IGVsZW1fY291bnQ7CisgICAgY29uc3QgQmxvY2sqIGJsb2NrczsKK30gRWxlbUNhdDsKKwordHlwZWRlZiBzdHJ1Y3QgRmluZVNpZ25hdHVyZSB7CisgICAgc3RydWN0IEZpbmVTaWduYXR1cmUqIG5leHQ7CisgICAgc3RydWN0IEZpbmVTaWduYXR1cmUqIHByZXY7CisgICAgdWludDY0X3QgcHRzOworICAgIHVpbnQzMl90IGluZGV4OyAvKiBuZWVkZWQgZm9yIHhtbGV4cG9ydCAqLworICAgIHVpbnQ4X3QgY29uZmlkZW5jZTsKKyAgICB1aW50OF90IHdvcmRzWzVdOworICAgIHVpbnQ4X3QgZnJhbWVzaWdbU0lHRUxFTV9TSVpFLzVdOworfSBGaW5lU2lnbmF0dXJlOworCit0eXBlZGVmIHN0cnVjdCBDb2Fyc2VTaWduYXR1cmUgeworICAgIHVpbnQ4X3QgZGF0YVs1XVszMV07IC8qIDUgd29yZHMgd2l0aCBtaW4uIDI0MyBiaXQgKi8KKyAgICBzdHJ1Y3QgRmluZVNpZ25hdHVyZSogZmlyc3Q7IC8qIGFzc29jaWF0ZWQgRmluZXNpZ25hdHVyZXMgKi8KKyAgICBzdHJ1Y3QgRmluZVNpZ25hdHVyZSogbGFzdDsKKyAgICBzdHJ1Y3QgQ29hcnNlU2lnbmF0dXJlKiBuZXh0OworfSBDb2Fyc2VTaWduYXR1cmU7CisKKy8qIGxvb2t1cCB0eXBlcyAqLwordHlwZWRlZiBzdHJ1Y3QgTWF0Y2hpbmdJbmZvIHsKKyAgICBkb3VibGUgbWVhbmRpc3Q7CisgICAgZG91YmxlIGZyYW1lcmF0ZXJhdGlvOyAvKiBzZWNvbmQvZmlyc3QgKi8KKyAgICBpbnQgc2NvcmU7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgbWF0Y2hmcmFtZXM7IC8qIG51bWJlciBvZiBtYXRjaGluZyBmcmFtZXMgKi8KKyAgICBpbnQgd2hvbGU7CisgICAgc3RydWN0IEZpbmVTaWduYXR1cmUqIGZpcnN0OworICAgIHN0cnVjdCBGaW5lU2lnbmF0dXJlKiBzZWNvbmQ7CisgICAgc3RydWN0IE1hdGNoaW5nSW5mbyogbmV4dDsKK30gTWF0Y2hpbmdJbmZvOworCit0eXBlZGVmIHN0cnVjdCBTdHJlYW1Db250ZXh0IHsKKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKKyAgICAvKiBuZWVkZWQgZm9yIHhtbF9leHBvcnQgKi8KKyAgICBpbnQgdzsgLyogaGVpZ2h0ICovCisgICAgaW50IGg7IC8qIHdpZHRoICovCisKKyAgICAvKiBvdmVyZmxvdyBwcm90ZWN0aW9uICovCisgICAgaW50IGRpdmlkZTsKKworICAgIEZpbmVTaWduYXR1cmUqIGZpbmVzaWdsaXN0OworICAgIEZpbmVTaWduYXR1cmUqIGN1cmZpbmVzaWc7CisKKyAgICBDb2Fyc2VTaWduYXR1cmUqIGNvYXJzZXNpZ2xpc3Q7CisgICAgQ29hcnNlU2lnbmF0dXJlKiBjb2Fyc2VlbmQ7IC8qIG5lZWRlZCBmb3IgeG1sIGV4cG9ydCAqLworICAgIC8qIGhlbHBlcnMgdG8gc3RvcmUgdGhlIGFsdGVybmF0aW5nIHNpZ25hdHVyZXMgKi8KKyAgICBDb2Fyc2VTaWduYXR1cmUqIGN1cmNvYXJzZXNpZzE7CisgICAgQ29hcnNlU2lnbmF0dXJlKiBjdXJjb2Fyc2VzaWcyOworCisgICAgaW50IGNvYXJzZWNvdW50OyAvKiBjb3VudGVyIGZyb20gMCB0byA4OSAqLworICAgIGludCBtaWRjb2Fyc2U7ICAgLyogd2hldGhlciBpdCBpcyBhIGNvYXJzZXNpZ25hdHVyZSBiZWdpbm5pbmcgZnJvbSA0NSArIGkgKiA5MCAqLworICAgIHVpbnQzMl90IGxhc3RpbmRleDsgLyogaGVscGVyIHRvIHN0b3JlIGFtb3VudCBvZiBmcmFtZXMgKi8KKworICAgIGludCBleHBvcnRlZDsgLyogYm9vbGVhbiB3aGV0aGVyIHN0cmVhbSBhbHJlYWR5IGV4cG9ydGVkICovCit9IFN0cmVhbUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFNpZ25hdHVyZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIC8qIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgbmJfaW5wdXRzOworICAgIGNoYXIgKmZpbGVuYW1lOworICAgIGludCBmb3JtYXQ7CisgICAgaW50IHRod29yZGRpc3Q7CisgICAgaW50IHRoY29tcG9zZGlzdDsKKyAgICBpbnQgdGhsMTsKKyAgICBpbnQgdGhkaTsKKyAgICBpbnQgdGhpdDsKKyAgICAvKiBlbmQgaW5wdXQgcGFyYW1ldGVycyAqLworCisgICAgdWludDhfdCBsMWRpc3RsdXRbMjQzKjI0Mi8yXTsgLyogMjQzICsgMjQyICsgMjQxIC4uLiAqLworICAgIFN0cmVhbUNvbnRleHQqIHN0cmVhbWNvbnRleHRzOworfSBTaWduYXR1cmVDb250ZXh0OworCisKK3N0YXRpYyBjb25zdCBCbG9jayBlbGVtX2ExX2RhdGFbXSA9IHsKKyAgICB7eyAwLCAwfSx7IDcsIDd9fSwKKyAgICB7eyA4LCAwfSx7MTUsIDd9fSwKKyAgICB7eyAwLCA4fSx7IDcsMTV9fSwKKyAgICB7eyA4LCA4fSx7MTUsMTV9fSwKKyAgICB7ezE2LCAwfSx7MjMsIDd9fSwKKyAgICB7ezI0LCAwfSx7MzEsIDd9fSwKKyAgICB7ezE2LCA4fSx7MjMsMTV9fSwKKyAgICB7ezI0LCA4fSx7MzEsMTV9fSwKKyAgICB7eyAwLDE2fSx7IDcsMjN9fSwKKyAgICB7eyA4LDE2fSx7MTUsMjN9fSwKKyAgICB7eyAwLDI0fSx7IDcsMzF9fSwKKyAgICB7eyA4LDI0fSx7MTUsMzF9fSwKKyAgICB7ezE2LDE2fSx7MjMsMjN9fSwKKyAgICB7ezI0LDE2fSx7MzEsMjN9fSwKKyAgICB7ezE2LDI0fSx7MjMsMzF9fSwKKyAgICB7ezI0LDI0fSx7MzEsMzF9fSwKKyAgICB7eyAwLCAwfSx7MTUsMTV9fSwKKyAgICB7ezE2LCAwfSx7MzEsMTV9fSwKKyAgICB7eyAwLDE2fSx7MTUsMzF9fSwKKyAgICB7ezE2LDE2fSx7MzEsMzF9fQorfTsKK3N0YXRpYyBjb25zdCBFbGVtQ2F0IGVsZW1fYTEgPSB7IDEsIDEsIDEsIDIwLCBlbGVtX2ExX2RhdGEgfTsKKworc3RhdGljIGNvbnN0IEJsb2NrIGVsZW1fYTJfZGF0YVtdID0geworICAgIHt7IDIsIDJ9LHsgOSwgOX19LAorICAgIHt7MTIsIDJ9LHsxOSwgOX19LAorICAgIHt7MjIsIDJ9LHsyOSwgOX19LAorICAgIHt7IDIsMTJ9LHsgOSwxOX19LAorICAgIHt7MTIsMTJ9LHsxOSwxOX19LAorICAgIHt7MjIsMTJ9LHsyOSwxOX19LAorICAgIHt7IDIsMjJ9LHsgOSwyOX19LAorICAgIHt7MTIsMjJ9LHsxOSwyOX19LAorICAgIHt7MjIsMjJ9LHsyOSwyOX19LAorICAgIHt7IDksIDl9LHsyMiwyMn19LAorICAgIHt7IDYsIDZ9LHsyNSwyNX19LAorICAgIHt7IDMsIDN9LHsyOCwyOH19Cit9Oworc3RhdGljIGNvbnN0IEVsZW1DYXQgZWxlbV9hMiA9IHsgMSwgMSwgMSwgMTIsIGVsZW1fYTJfZGF0YSB9OworCitzdGF0aWMgY29uc3QgQmxvY2sgZWxlbV9kMV9kYXRhW10gPSB7CisgICAge3sgMCwgMH0seyAxLCAzfX0se3sgMiwgMH0seyAzLCAzfX0sCisgICAge3sgNCwgMH0seyA3LCAxfX0se3sgNCwgMn0seyA3LCAzfX0sCisgICAge3sgMCwgNn0seyAzLCA3fX0se3sgMCwgNH0seyAzLCA1fX0sCisgICAge3sgNiwgNH0seyA3LCA3fX0se3sgNCwgNH0seyA1LCA3fX0sCisgICAge3sgOCwgMH0seyA5LCAzfX0se3sxMCwgMH0sezExLCAzfX0sCisgICAge3sxMiwgMH0sezE1LCAxfX0se3sxMiwgMn0sezE1LCAzfX0sCisgICAge3sgOCwgNn0sezExLCA3fX0se3sgOCwgNH0sezExLCA1fX0sCisgICAge3sxNCwgNH0sezE1LCA3fX0se3sxMiwgNH0sezEzLCA3fX0sCisgICAge3sgMCwgOH0seyAxLDExfX0se3sgMiwgOH0seyAzLDExfX0sCisgICAge3sgNCwgOH0seyA3LCA5fX0se3sgNCwxMH0seyA3LDExfX0sCisgICAge3sgMCwxNH0seyAzLDE1fX0se3sgMCwxMn0seyAzLDEzfX0sCisgICAge3sgNiwxMn0seyA3LDE1fX0se3sgNCwxMn0seyA1LDE1fX0sCisgICAge3sgOCwgOH0seyA5LDExfX0se3sxMCwgOH0sezExLDExfX0sCisgICAge3sxMiwgOH0sezE1LCA5fX0se3sxMiwxMH0sezE1LDExfX0sCisgICAge3sgOCwxNH0sezExLDE1fX0se3sgOCwxMn0sezExLDEzfX0sCisgICAge3sxNCwxMn0sezE1LDE1fX0se3sxMiwxMn0sezEzLDE1fX0sCisgICAge3sxNiwgMH0sezE5LCAxfX0se3sxNiwgMn0sezE5LCAzfX0sCisgICAge3syMiwgMH0sezIzLCAzfX0se3syMCwgMH0sezIxLCAzfX0sCisgICAge3sxNiwgNH0sezE3LCA3fX0se3sxOCwgNH0sezE5LCA3fX0sCisgICAge3syMCwgNn0sezIzLCA3fX0se3syMCwgNH0sezIzLCA1fX0sCisgICAge3syNCwgMH0sezI3LCAxfX0se3syNCwgMn0sezI3LCAzfX0sCisgICAge3szMCwgMH0sezMxLCAzfX0se3syOCwgMH0sezI5LCAzfX0sCisgICAge3syNCwgNH0sezI1LCA3fX0se3syNiwgNH0sezI3LCA3fX0sCisgICAge3syOCwgNn0sezMxLCA3fX0se3syOCwgNH0sezMxLCA1fX0sCisgICAge3sxNiwgOH0sezE5LCA5fX0se3sxNiwxMH0sezE5LDExfX0sCisgICAge3syMiwgOH0sezIzLDExfX0se3syMCwgOH0sezIxLDExfX0sCisgICAge3sxNiwxMn0sezE3LDE1fX0se3sxOCwxMn0sezE5LDE1fX0sCisgICAge3syMCwxNH0sezIzLDE1fX0se3syMCwxMn0sezIzLDEzfX0sCisgICAge3syNCwgOH0sezI3LCA5fX0se3syNCwxMH0sezI3LDExfX0sCisgICAge3szMCwgOH0sezMxLDExfX0se3syOCwgOH0sezI5LDExfX0sCisgICAge3syNCwxMn0sezI1LDE1fX0se3syNiwxMn0sezI3LDE1fX0sCisgICAge3syOCwxNH0sezMxLDE1fX0se3syOCwxMn0sezMxLDEzfX0sCisgICAge3sgMCwxNn0seyAzLDE3fX0se3sgMCwxOH0seyAzLDE5fX0sCisgICAge3sgNiwxNn0seyA3LDE5fX0se3sgNCwxNn0seyA1LDE5fX0sCisgICAge3sgMCwyMH0seyAxLDIzfX0se3sgMiwyMH0seyAzLDIzfX0sCisgICAge3sgNCwyMn0seyA3LDIzfX0se3sgNCwyMH0seyA3LDIxfX0sCisgICAge3sgOCwxNn0sezExLDE3fX0se3sgOCwxOH0sezExLDE5fX0sCisgICAge3sxNCwxNn0sezE1LDE5fX0se3sxMiwxNn0sezEzLDE5fX0sCisgICAge3sgOCwyMH0seyA5LDIzfX0se3sxMCwyMH0sezExLDIzfX0sCisgICAge3sxMiwyMn0sezE1LDIzfX0se3sxMiwyMH0sezE1LDIxfX0sCisgICAge3sgMCwyNH0seyAzLDI1fX0se3sgMCwyNn0seyAzLDI3fX0sCisgICAge3sgNiwyNH0seyA3LDI3fX0se3sgNCwyNH0seyA1LDI3fX0sCisgICAge3sgMCwyOH0seyAxLDMxfX0se3sgMiwyOH0seyAzLDMxfX0sCisgICAge3sgNCwzMH0seyA3LDMxfX0se3sgNCwyOH0seyA3LDI5fX0sCisgICAge3sgOCwyNH0sezExLDI1fX0se3sgOCwyNn0sezExLDI3fX0sCisgICAge3sxNCwyNH0sezE1LDI3fX0se3sxMiwyNH0sezEzLDI3fX0sCisgICAge3sgOCwyOH0seyA5LDMxfX0se3sxMCwyOH0sezExLDMxfX0sCisgICAge3sxMiwzMH0sezE1LDMxfX0se3sxMiwyOH0sezE1LDI5fX0sCisgICAge3sxNiwxNn0sezE3LDE5fX0se3sxOCwxNn0sezE5LDE5fX0sCisgICAge3syMCwxNn0sezIzLDE3fX0se3syMCwxOH0sezIzLDE5fX0sCisgICAge3sxNiwyMn0sezE5LDIzfX0se3sxNiwyMH0sezE5LDIxfX0sCisgICAge3syMiwyMH0sezIzLDIzfX0se3syMCwyMH0sezIxLDIzfX0sCisgICAge3syNCwxNn0sezI1LDE5fX0se3syNiwxNn0sezI3LDE5fX0sCisgICAge3syOCwxNn0sezMxLDE3fX0se3syOCwxOH0sezMxLDE5fX0sCisgICAge3syNCwyMn0sezI3LDIzfX0se3syNCwyMH0sezI3LDIxfX0sCisgICAge3szMCwyMH0sezMxLDIzfX0se3syOCwyMH0sezI5LDIzfX0sCisgICAge3sxNiwyNH0sezE3LDI3fX0se3sxOCwyNH0sezE5LDI3fX0sCisgICAge3syMCwyNH0sezIzLDI1fX0se3syMCwyNn0sezIzLDI3fX0sCisgICAge3sxNiwzMH0sezE5LDMxfX0se3sxNiwyOH0sezE5LDI5fX0sCisgICAge3syMiwyOH0sezIzLDMxfX0se3syMCwyOH0sezIxLDMxfX0sCisgICAge3syNCwyNH0sezI1LDI3fX0se3syNiwyNH0sezI3LDI3fX0sCisgICAge3syOCwyNH0sezMxLDI1fX0se3syOCwyNn0sezMxLDI3fX0sCisgICAge3syNCwzMH0sezI3LDMxfX0se3syNCwyOH0sezI3LDI5fX0sCisgICAge3szMCwyOH0sezMxLDMxfX0se3syOCwyOH0sezI5LDMxfX0sCisgICAge3sgMiwgMn0seyAzLCA1fX0se3sgNCwgMn0seyA1LCA1fX0sCisgICAge3sgNiwgMn0seyA5LCAzfX0se3sgNiwgNH0seyA5LCA1fX0sCisgICAge3sgMiwgOH0seyA1LCA5fX0se3sgMiwgNn0seyA1LCA3fX0sCisgICAge3sgOCwgNn0seyA5LCA5fX0se3sgNiwgNn0seyA3LCA5fX0sCisgICAge3sxMiwgMn0sezEzLCA1fX0se3sxNCwgMn0sezE1LCA1fX0sCisgICAge3sxNiwgMn0sezE5LCAzfX0se3sxNiwgNH0sezE5LCA1fX0sCisgICAge3sxMiwgOH0sezE1LCA5fX0se3sxMiwgNn0sezE1LCA3fX0sCisgICAge3sxOCwgNn0sezE5LCA5fX0se3sxNiwgNn0sezE3LCA5fX0sCisgICAge3syMiwgMn0sezIzLCA1fX0se3syNCwgMn0sezI1LCA1fX0sCisgICAge3syNiwgMn0sezI5LCAzfX0se3syNiwgNH0sezI5LCA1fX0sCisgICAge3syMiwgOH0sezI1LCA5fX0se3syMiwgNn0sezI1LCA3fX0sCisgICAge3syOCwgNn0sezI5LCA5fX0se3syNiwgNn0sezI3LCA5fX0sCisgICAge3sgMiwxMn0seyAzLDE1fX0se3sgNCwxMn0seyA1LDE1fX0sCisgICAge3sgNiwxMn0seyA5LDEzfX0se3sgNiwxNH0seyA5LDE1fX0sCisgICAge3sgMiwxOH0seyA1LDE5fX0se3sgMiwxNn0seyA1LDE3fX0sCisgICAge3sgOCwxNn0seyA5LDE5fX0se3sgNiwxNn0seyA3LDE5fX0sCisgICAge3sxMiwxMn0sezE1LDEzfX0se3sxMiwxNH0sezE1LDE1fX0sCisgICAge3sxNiwxMn0sezE5LDEzfX0se3sxNiwxNH0sezE5LDE1fX0sCisgICAge3sxMiwxOH0sezE1LDE5fX0se3sxMiwxNn0sezE1LDE3fX0sCisgICAge3sxNiwxOH0sezE5LDE5fX0se3sxNiwxNn0sezE5LDE3fX0sCisgICAge3syMiwxMn0sezIzLDE1fX0se3syNCwxMn0sezI1LDE1fX0sCisgICAge3syNiwxMn0sezI5LDEzfX0se3syNiwxNH0sezI5LDE1fX0sCisgICAge3syMiwxOH0sezI1LDE5fX0se3syMiwxNn0sezI1LDE3fX0sCisgICAge3syOCwxNn0sezI5LDE5fX0se3syNiwxNn0sezI3LDE5fX0sCisgICAge3sgMiwyMn0seyAzLDI1fX0se3sgNCwyMn0seyA1LDI1fX0sCisgICAge3sgNiwyMn0seyA5LDIzfX0se3sgNiwyNH0seyA5LDI1fX0sCisgICAge3sgMiwyOH0seyA1LDI5fX0se3sgMiwyNn0seyA1LDI3fX0sCisgICAge3sgOCwyNn0seyA5LDI5fX0se3sgNiwyNn0seyA3LDI5fX0sCisgICAge3sxMiwyMn0sezEzLDI1fX0se3sxNCwyMn0sezE1LDI1fX0sCisgICAge3sxNiwyMn0sezE5LDIzfX0se3sxNiwyNH0sezE5LDI1fX0sCisgICAge3sxMiwyOH0sezE1LDI5fX0se3sxMiwyNn0sezE1LDI3fX0sCisgICAge3sxOCwyNn0sezE5LDI5fX0se3sxNiwyNn0sezE3LDI5fX0sCisgICAge3syMiwyMn0sezIzLDI1fX0se3syNCwyMn0sezI1LDI1fX0sCisgICAge3syNiwyMn0sezI5LDIzfX0se3syNiwyNH0sezI5LDI1fX0sCisgICAge3syMiwyOH0sezI1LDI5fX0se3syMiwyNn0sezI1LDI3fX0sCisgICAge3syOCwyNn0sezI5LDI5fX0se3syNiwyNn0sezI3LDI5fX0sCisgICAge3sgNywgN30sezEwLCA4fX0se3sgNywgOX0sezEwLDEwfX0sCisgICAge3sxMSwgN30sezEyLDEwfX0se3sxMywgN30sezE0LDEwfX0sCisgICAge3sgNywxMX0seyA4LDE0fX0se3sgOSwxMX0sezEwLDE0fX0sCisgICAge3sxMSwxMX0sezE0LDEyfX0se3sxMSwxM30sezE0LDE0fX0sCisgICAge3sxNywgN30sezIwLCA4fX0se3sxNywgOX0sezIwLDEwfX0sCisgICAge3syMSwgN30sezIyLDEwfX0se3syMywgN30sezI0LDEwfX0sCisgICAge3sxNywxMX0sezE4LDE0fX0se3sxOSwxMX0sezIwLDE0fX0sCisgICAge3syMSwxMX0sezI0LDEyfX0se3syMSwxM30sezI0LDE0fX0sCisgICAge3sgNywxN30sezEwLDE4fX0se3sgNywxOX0sezEwLDIwfX0sCisgICAge3sxMSwxN30sezEyLDIwfX0se3sxMywxN30sezE0LDIwfX0sCisgICAge3sgNywyMX0seyA4LDI0fX0se3sgOSwyMX0sezEwLDI0fX0sCisgICAge3sxMSwyMX0sezE0LDIyfX0se3sxMSwyM30sezE0LDI0fX0sCisgICAge3sxNywxN30sezIwLDE4fX0se3sxNywxOX0sezIwLDIwfX0sCisgICAge3syMSwxN30sezIyLDIwfX0se3syMywxN30sezI0LDIwfX0sCisgICAge3sxNywyMX0sezE4LDI0fX0se3sxOSwyMX0sezIwLDI0fX0sCisgICAge3syMSwyMX0sezI0LDIyfX0se3syMSwyM30sezI0LDI0fX0KK307CitzdGF0aWMgY29uc3QgRWxlbUNhdCBlbGVtX2QxID0geyAwLCAxLCAyLCAxMTYsIGVsZW1fZDFfZGF0YSB9OworCitzdGF0aWMgY29uc3QgQmxvY2sgZWxlbV9kMl9kYXRhW10gPSB7CisgICAge3sgMCwgMH0seyAzLCAzfX0se3sgNCwgNH0seyA3LCA3fX0se3sgNCwgMH0seyA3LCAzfX0se3sgMCwgNH0seyAzLCA3fX0sCisgICAge3sgOCwgMH0sezExLCAzfX0se3sxMiwgNH0sezE1LCA3fX0se3sxMiwgMH0sezE1LCAzfX0se3sgOCwgNH0sezExLCA3fX0sCisgICAge3sxNiwgMH0sezE5LCAzfX0se3syMCwgNH0sezIzLCA3fX0se3syMCwgMH0sezIzLCAzfX0se3sxNiwgNH0sezE5LCA3fX0sCisgICAge3syNCwgMH0sezI3LCAzfX0se3syOCwgNH0sezMxLCA3fX0se3syOCwgMH0sezMxLCAzfX0se3syNCwgNH0sezI3LCA3fX0sCisgICAge3sgMCwgOH0seyAzLDExfX0se3sgNCwxMn0seyA3LDE1fX0se3sgNCwgOH0seyA3LDExfX0se3sgMCwxMn0seyAzLDE1fX0sCisgICAge3sgOCwgOH0sezExLDExfX0se3sxMiwxMn0sezE1LDE1fX0se3sxMiwgOH0sezE1LDExfX0se3sgOCwxMn0sezExLDE1fX0sCisgICAge3sxNiwgOH0sezE5LDExfX0se3syMCwxMn0sezIzLDE1fX0se3syMCwgOH0sezIzLDExfX0se3sxNiwxMn0sezE5LDE1fX0sCisgICAge3syNCwgOH0sezI3LDExfX0se3syOCwxMn0sezMxLDE1fX0se3syOCwgOH0sezMxLDExfX0se3syNCwxMn0sezI3LDE1fX0sCisgICAge3sgMCwxNn0seyAzLDE5fX0se3sgNCwyMH0seyA3LDIzfX0se3sgNCwxNn0seyA3LDE5fX0se3sgMCwyMH0seyAzLDIzfX0sCisgICAge3sgOCwxNn0sezExLDE5fX0se3sxMiwyMH0sezE1LDIzfX0se3sxMiwxNn0sezE1LDE5fX0se3sgOCwyMH0sezExLDIzfX0sCisgICAge3sxNiwxNn0sezE5LDE5fX0se3syMCwyMH0sezIzLDIzfX0se3syMCwxNn0sezIzLDE5fX0se3sxNiwyMH0sezE5LDIzfX0sCisgICAge3syNCwxNn0sezI3LDE5fX0se3syOCwyMH0sezMxLDIzfX0se3syOCwxNn0sezMxLDE5fX0se3syNCwyMH0sezI3LDIzfX0sCisgICAge3sgMCwyNH0seyAzLDI3fX0se3sgNCwyOH0seyA3LDMxfX0se3sgNCwyNH0seyA3LDI3fX0se3sgMCwyOH0seyAzLDMxfX0sCisgICAge3sgOCwyNH0sezExLDI3fX0se3sxMiwyOH0sezE1LDMxfX0se3sxMiwyNH0sezE1LDI3fX0se3sgOCwyOH0sezExLDMxfX0sCisgICAge3sxNiwyNH0sezE5LDI3fX0se3syMCwyOH0sezIzLDMxfX0se3syMCwyNH0sezIzLDI3fX0se3sxNiwyOH0sezE5LDMxfX0sCisgICAge3syNCwyNH0sezI3LDI3fX0se3syOCwyOH0sezMxLDMxfX0se3syOCwyNH0sezMxLDI3fX0se3syNCwyOH0sezI3LDMxfX0sCisgICAge3sgNCwgNH0seyA3LCA3fX0se3sgOCwgOH0sezExLDExfX0se3sgOCwgNH0sezExLCA3fX0se3sgNCwgOH0seyA3LDExfX0sCisgICAge3sxMiwgNH0sezE1LCA3fX0se3sxNiwgOH0sezE5LDExfX0se3sxNiwgNH0sezE5LCA3fX0se3sxMiwgOH0sezE1LDExfX0sCisgICAge3syMCwgNH0sezIzLCA3fX0se3syNCwgOH0sezI3LDExfX0se3syNCwgNH0sezI3LCA3fX0se3syMCwgOH0sezIzLDExfX0sCisgICAge3sgNCwxMn0seyA3LDE1fX0se3sgOCwxNn0sezExLDE5fX0se3sgOCwxMn0sezExLDE1fX0se3sgNCwxNn0seyA3LDE5fX0sCisgICAge3sxMiwxMn0sezE1LDE1fX0se3sxNiwxNn0sezE5LDE5fX0se3sxNiwxMn0sezE5LDE1fX0se3sxMiwxNn0sezE1LDE5fX0sCisgICAge3syMCwxMn0sezIzLDE1fX0se3syNCwxNn0sezI3LDE5fX0se3syNCwxMn0sezI3LDE1fX0se3syMCwxNn0sezIzLDE5fX0sCisgICAge3sgNCwyMH0seyA3LDIzfX0se3sgOCwyNH0sezExLDI3fX0se3sgOCwyMH0sezExLDIzfX0se3sgNCwyNH0seyA3LDI3fX0sCisgICAge3sxMiwyMH0sezE1LDIzfX0se3sxNiwyNH0sezE5LDI3fX0se3sxNiwyMH0sezE5LDIzfX0se3sxMiwyNH0sezE1LDI3fX0sCisgICAge3syMCwyMH0sezIzLDIzfX0se3syNCwyNH0sezI3LDI3fX0se3syNCwyMH0sezI3LDIzfX0se3syMCwyNH0sezIzLDI3fX0KK307CitzdGF0aWMgY29uc3QgRWxlbUNhdCBlbGVtX2QyID0geyAwLCAyLCA0LCAyNSwgZWxlbV9kMl9kYXRhIH07CisKK3N0YXRpYyBjb25zdCBCbG9jayBlbGVtX2QzX2RhdGFbXSA9IHsKKyAgICB7eyAxLCAxfSx7MTAsMTB9fSx7ezExLCAxfSx7MjAsMTB9fSwKKyAgICB7eyAxLCAxfSx7MTAsMTB9fSx7ezIxLCAxfSx7MzAsMTB9fSwKKyAgICB7eyAxLCAxfSx7MTAsMTB9fSx7eyAxLDExfSx7MTAsMjB9fSwKKyAgICB7eyAxLCAxfSx7MTAsMTB9fSx7ezExLDExfSx7MjAsMjB9fSwKKyAgICB7eyAxLCAxfSx7MTAsMTB9fSx7ezIxLDExfSx7MzAsMjB9fSwKKyAgICB7eyAxLCAxfSx7MTAsMTB9fSx7eyAxLDIxfSx7MTAsMzB9fSwKKyAgICB7eyAxLCAxfSx7MTAsMTB9fSx7ezExLDIxfSx7MjAsMzB9fSwKKyAgICB7eyAxLCAxfSx7MTAsMTB9fSx7ezIxLDIxfSx7MzAsMzB9fSwKKyAgICB7ezExLCAxfSx7MjAsMTB9fSx7ezIxLCAxfSx7MzAsMTB9fSwKKyAgICB7ezExLCAxfSx7MjAsMTB9fSx7eyAxLDExfSx7MTAsMjB9fSwKKyAgICB7ezExLCAxfSx7MjAsMTB9fSx7ezExLDExfSx7MjAsMjB9fSwKKyAgICB7ezExLCAxfSx7MjAsMTB9fSx7ezIxLDExfSx7MzAsMjB9fSwKKyAgICB7ezExLCAxfSx7MjAsMTB9fSx7eyAxLDIxfSx7MTAsMzB9fSwKKyAgICB7ezExLCAxfSx7MjAsMTB9fSx7ezExLDIxfSx7MjAsMzB9fSwKKyAgICB7ezExLCAxfSx7MjAsMTB9fSx7ezIxLDIxfSx7MzAsMzB9fSwKKyAgICB7ezIxLCAxfSx7MzAsMTB9fSx7eyAxLDExfSx7MTAsMjB9fSwKKyAgICB7ezIxLCAxfSx7MzAsMTB9fSx7ezExLDExfSx7MjAsMjB9fSwKKyAgICB7ezIxLCAxfSx7MzAsMTB9fSx7ezIxLDExfSx7MzAsMjB9fSwKKyAgICB7ezIxLCAxfSx7MzAsMTB9fSx7eyAxLDIxfSx7MTAsMzB9fSwKKyAgICB7ezIxLCAxfSx7MzAsMTB9fSx7ezExLDIxfSx7MjAsMzB9fSwKKyAgICB7ezIxLCAxfSx7MzAsMTB9fSx7ezIxLDIxfSx7MzAsMzB9fSwKKyAgICB7eyAxLDExfSx7MTAsMjB9fSx7ezExLDExfSx7MjAsMjB9fSwKKyAgICB7eyAxLDExfSx7MTAsMjB9fSx7ezIxLDExfSx7MzAsMjB9fSwKKyAgICB7eyAxLDExfSx7MTAsMjB9fSx7eyAxLDIxfSx7MTAsMzB9fSwKKyAgICB7eyAxLDExfSx7MTAsMjB9fSx7ezExLDIxfSx7MjAsMzB9fSwKKyAgICB7eyAxLDExfSx7MTAsMjB9fSx7ezIxLDIxfSx7MzAsMzB9fSwKKyAgICB7ezExLDExfSx7MjAsMjB9fSx7ezIxLDExfSx7MzAsMjB9fSwKKyAgICB7ezExLDExfSx7MjAsMjB9fSx7eyAxLDIxfSx7MTAsMzB9fSwKKyAgICB7ezExLDExfSx7MjAsMjB9fSx7ezExLDIxfSx7MjAsMzB9fSwKKyAgICB7ezExLDExfSx7MjAsMjB9fSx7ezIxLDIxfSx7MzAsMzB9fSwKKyAgICB7ezIxLDExfSx7MzAsMjB9fSx7eyAxLDIxfSx7MTAsMzB9fSwKKyAgICB7ezIxLDExfSx7MzAsMjB9fSx7ezExLDIxfSx7MjAsMzB9fSwKKyAgICB7ezIxLDExfSx7MzAsMjB9fSx7ezIxLDIxfSx7MzAsMzB9fSwKKyAgICB7eyAxLDIxfSx7MTAsMzB9fSx7ezExLDIxfSx7MjAsMzB9fSwKKyAgICB7eyAxLDIxfSx7MTAsMzB9fSx7ezIxLDIxfSx7MzAsMzB9fSwKKyAgICB7ezExLDIxfSx7MjAsMzB9fSx7ezIxLDIxfSx7MzAsMzB9fQorfTsKK3N0YXRpYyBjb25zdCBFbGVtQ2F0IGVsZW1fZDMgPSB7IDAsIDEsIDIsIDM2LCBlbGVtX2QzX2RhdGEgfTsKKworc3RhdGljIGNvbnN0IEJsb2NrIGVsZW1fZDRfZGF0YVtdID0geworICAgIHt7IDcsMTN9LHsxMiwxOH19LHt7MTksMTN9LHsyNCwxOH19LAorICAgIHt7MTMsIDd9LHsxOCwxMn19LHt7MTMsMTl9LHsxOCwyNH19LAorICAgIHt7IDcsIDd9LHsxMiwxMn19LHt7MTksMTl9LHsyNCwyNH19LAorICAgIHt7MTksIDd9LHsyNCwxMn19LHt7IDcsMTl9LHsxMiwyNH19LAorICAgIHt7MTMsIDd9LHsxOCwxMn19LHt7MTksMTN9LHsyNCwxOH19LAorICAgIHt7MTksMTN9LHsyNCwxOH19LHt7MTMsMTl9LHsxOCwyNH19LAorICAgIHt7MTMsMTl9LHsxOCwyNH19LHt7IDcsMTN9LHsxMiwxOH19LAorICAgIHt7IDcsMTN9LHsxMiwxOH19LHt7MTMsIDd9LHsxOCwxMn19LAorICAgIHt7IDcsIDd9LHsxMiwxMn19LHt7MTksIDd9LHsyNCwxMn19LAorICAgIHt7MTksIDd9LHsyNCwxMn19LHt7MTksMTl9LHsyNCwyNH19LAorICAgIHt7MTksMTl9LHsyNCwyNH19LHt7IDcsMTl9LHsxMiwyNH19LAorICAgIHt7IDcsMTl9LHsxMiwyNH19LHt7IDcsIDd9LHsxMiwxMn19LAorICAgIHt7MTMsMTN9LHsxOCwxOH19LHt7MTMsIDF9LHsxOCwgNn19LAorICAgIHt7MTMsMTN9LHsxOCwxOH19LHt7MjUsMTN9LHszMCwxOH19LAorICAgIHt7MTMsMTN9LHsxOCwxOH19LHt7MTMsMjV9LHsxOCwzMH19LAorICAgIHt7MTMsMTN9LHsxOCwxOH19LHt7IDEsMTN9LHsgNiwxOH19LAorICAgIHt7MTMsIDF9LHsxOCwgNn19LHt7MTMsMjV9LHsxOCwzMH19LAorICAgIHt7IDEsMTN9LHsgNiwxOH19LHt7MjUsMTN9LHszMCwxOH19LAorICAgIHt7IDcsIDF9LHsxMiwgNn19LHt7MTksIDF9LHsyNCwgNn19LAorICAgIHt7IDcsMjV9LHsxMiwzMH19LHt7MTksMjV9LHsyNCwzMH19LAorICAgIHt7IDEsIDd9LHsgNiwxMn19LHt7IDEsMTl9LHsgNiwyNH19LAorICAgIHt7MjUsIDd9LHszMCwxMn19LHt7MjUsMTl9LHszMCwyNH19LAorICAgIHt7IDcsIDF9LHsxMiwgNn19LHt7IDEsIDd9LHsgNiwxMn19LAorICAgIHt7MTksIDF9LHsyNCwgNn19LHt7MjUsIDd9LHszMCwxMn19LAorICAgIHt7MjUsMTl9LHszMCwyNH19LHt7MTksMjV9LHsyNCwzMH19LAorICAgIHt7IDEsMTl9LHsgNiwyNH19LHt7IDcsMjV9LHsxMiwzMH19LAorICAgIHt7IDEsIDF9LHsgNiwgNn19LHt7MjUsIDF9LHszMCwgNn19LAorICAgIHt7MjUsIDF9LHszMCwgNn19LHt7MjUsMjV9LHszMCwzMH19LAorICAgIHt7MjUsMjV9LHszMCwzMH19LHt7IDEsMjV9LHsgNiwzMH19LAorICAgIHt7IDEsMjV9LHsgNiwzMH19LHt7IDEsIDF9LHsgNiwgNn19Cit9Oworc3RhdGljIGNvbnN0IEVsZW1DYXQgZWxlbV9kNCA9IHsgMCwgMSwgMiwgMzAsIGVsZW1fZDRfZGF0YSB9OworCitzdGF0aWMgY29uc3QgQmxvY2sgZWxlbV9kNV9kYXRhW10gPSB7CisgICAge3sgMSwgMX0sezEwLCAzfX0se3sgMSwgNH0seyAzLCA3fX0se3sgOCwgNH0sezEwLCA3fX0se3sgMSwgOH0sezEwLDEwfX0se3sgNCwgNH0seyA3LCA3fX0sCisgICAge3sxMSwgMX0sezIwLCAzfX0se3sxMSwgNH0sezEzLCA3fX0se3sxOCwgNH0sezIwLCA3fX0se3sxMSwgOH0sezIwLDEwfX0se3sxNCwgNH0sezE3LCA3fX0sCisgICAge3syMSwgMX0sezMwLCAzfX0se3syMSwgNH0sezIzLCA3fX0se3syOCwgNH0sezMwLCA3fX0se3syMSwgOH0sezMwLDEwfX0se3syNCwgNH0sezI3LCA3fX0sCisgICAge3sgMSwxMX0sezEwLDEzfX0se3sgMSwxNH0seyAzLDE3fX0se3sgOCwxNH0sezEwLDE3fX0se3sgMSwxOH0sezEwLDIwfX0se3sgNCwxNH0seyA3LDE3fX0sCisgICAge3sxMSwxMX0sezIwLDEzfX0se3sxMSwxNH0sezEzLDE3fX0se3sxOCwxNH0sezIwLDE3fX0se3sxMSwxOH0sezIwLDIwfX0se3sxNCwxNH0sezE3LDE3fX0sCisgICAge3syMSwxMX0sezMwLDEzfX0se3syMSwxNH0sezIzLDE3fX0se3syOCwxNH0sezMwLDE3fX0se3syMSwxOH0sezMwLDIwfX0se3syNCwxNH0sezI3LDE3fX0sCisgICAge3sgMSwyMX0sezEwLDIzfX0se3sgMSwyNH0seyAzLDI3fX0se3sgOCwyNH0sezEwLDI3fX0se3sgMSwyOH0sezEwLDMwfX0se3sgNCwyNH0seyA3LDI3fX0sCisgICAge3sxMSwyMX0sezIwLDIzfX0se3sxMSwyNH0sezEzLDI3fX0se3sxOCwyNH0sezIwLDI3fX0se3sxMSwyOH0sezIwLDMwfX0se3sxNCwyNH0sezE3LDI3fX0sCisgICAge3syMSwyMX0sezMwLDIzfX0se3syMSwyNH0sezIzLDI3fX0se3syOCwyNH0sezMwLDI3fX0se3syMSwyOH0sezMwLDMwfX0se3syNCwyNH0sezI3LDI3fX0sCisgICAge3sgNiwgNn0sezE1LCA4fX0se3sgNiwgOX0seyA4LDEyfX0se3sxMywgOX0sezE1LDEyfX0se3sgNiwxM30sezE1LDE1fX0se3sgOSwgOX0sezEyLDEyfX0sCisgICAge3sxNiwgNn0sezI1LCA4fX0se3sxNiwgOX0sezE4LDEyfX0se3syMywgOX0sezI1LDEyfX0se3sxNiwxM30sezI1LDE1fX0se3sxOSwgOX0sezIyLDEyfX0sCisgICAge3sgNiwxNn0sezE1LDE4fX0se3sgNiwxOX0seyA4LDIyfX0se3sxMywxOX0sezE1LDIyfX0se3sgNiwyM30sezE1LDI1fX0se3sgOSwxOX0sezEyLDIyfX0sCisgICAge3sxNiwxNn0sezI1LDE4fX0se3sxNiwxOX0sezE4LDIyfX0se3syMywxOX0sezI1LDIyfX0se3sxNiwyM30sezI1LDI1fX0se3sxOSwxOX0sezIyLDIyfX0sCisgICAge3sgNiwgMX0sezE1LCAzfX0se3sgNiwgNH0seyA4LCA3fX0se3sxMywgNH0sezE1LCA3fX0se3sgNiwgOH0sezE1LDEwfX0se3sgOSwgNH0sezEyLCA3fX0sCisgICAge3sxNiwgMX0sezI1LCAzfX0se3sxNiwgNH0sezE4LCA3fX0se3syMywgNH0sezI1LCA3fX0se3sxNiwgOH0sezI1LDEwfX0se3sxOSwgNH0sezIyLCA3fX0sCisgICAge3sgMSwgNn0sezEwLCA4fX0se3sgMSwgOX0seyAzLDEyfX0se3sgOCwgOX0sezEwLDEyfX0se3sgMSwxM30sezEwLDE1fX0se3sgNCwgOX0seyA3LDEyfX0sCisgICAge3sxMSwgNn0sezIwLCA4fX0se3sxMSwgOX0sezEzLDEyfX0se3sxOCwgOX0sezIwLDEyfX0se3sxMSwxM30sezIwLDE1fX0se3sxNCwgOX0sezE3LDEyfX0sCisgICAge3syMSwgNn0sezMwLCA4fX0se3syMSwgOX0sezIzLDEyfX0se3syOCwgOX0sezMwLDEyfX0se3syMSwxM30sezMwLDE1fX0se3syNCwgOX0sezI3LDEyfX0sCisgICAge3sgNiwxMX0sezE1LDEzfX0se3sgNiwxNH0seyA4LDE3fX0se3sxMywxNH0sezE1LDE3fX0se3sgNiwxOH0sezE1LDIwfX0se3sgOSwxNH0sezEyLDE3fX0sCisgICAge3sxNiwxMX0sezI1LDEzfX0se3sxNiwxNH0sezE4LDE3fX0se3syMywxNH0sezI1LDE3fX0se3sxNiwxOH0sezI1LDIwfX0se3sxOSwxNH0sezIyLDE3fX0sCisgICAge3sgMSwxNn0sezEwLDE4fX0se3sgMSwxOX0seyAzLDIyfX0se3sgOCwxOX0sezEwLDIyfX0se3sgMSwyM30sezEwLDI1fX0se3sgNCwxOX0seyA3LDIyfX0sCisgICAge3sxMSwxNn0sezIwLDE4fX0se3sxMSwxOX0sezEzLDIyfX0se3sxOCwxOX0sezIwLDIyfX0se3sxMSwyM30sezIwLDI1fX0se3sxNCwxOX0sezE3LDIyfX0sCisgICAge3syMSwxNn0sezMwLDE4fX0se3syMSwxOX0sezIzLDIyfX0se3syOCwxOX0sezMwLDIyfX0se3syMSwyM30sezMwLDI1fX0se3syNCwxOX0sezI3LDIyfX0sCisgICAge3sgNiwyMX0sezE1LDIzfX0se3sgNiwyNH0seyA4LDI3fX0se3sxMywyNH0sezE1LDI3fX0se3sgNiwyOH0sezE1LDMwfX0se3sgOSwyNH0sezEyLDI3fX0sCisgICAge3sxNiwyMX0sezI1LDIzfX0se3sxNiwyNH0sezE4LDI3fX0se3syMywyNH0sezI1LDI3fX0se3sxNiwyOH0sezI1LDMwfX0se3sxOSwyNH0sezIyLDI3fX0sCisgICAge3sgMiwgMn0sezE0LCA2fX0se3sgMiwgN30seyA2LCA5fX0se3sxMCwgN30sezE0LCA5fX0se3sgMiwxMH0sezE0LDE0fX0se3sgNywgN30seyA5LCA5fX0sCisgICAge3sgNywgMn0sezE5LCA2fX0se3sgNywgN30sezExLCA5fX0se3sxNSwgN30sezE5LCA5fX0se3sgNywxMH0sezE5LDE0fX0se3sxMiwgN30sezE0LCA5fX0sCisgICAge3sxMiwgMn0sezI0LCA2fX0se3sxMiwgN30sezE2LCA5fX0se3syMCwgN30sezI0LCA5fX0se3sxMiwxMH0sezI0LDE0fX0se3sxNywgN30sezE5LCA5fX0sCisgICAge3sxNywgMn0sezI5LCA2fX0se3sxNywgN30sezIxLCA5fX0se3syNSwgN30sezI5LCA5fX0se3sxNywxMH0sezI5LDE0fX0se3syMiwgN30sezI0LCA5fX0sCisgICAge3sgMiwgN30sezE0LDExfX0se3sgMiwxMn0seyA2LDE0fX0se3sxMCwxMn0sezE0LDE0fX0se3sgMiwxNX0sezE0LDE5fX0se3sgNywxMn0seyA5LDE0fX0sCisgICAge3sgNywgN30sezE5LDExfX0se3sgNywxMn0sezExLDE0fX0se3sxNSwxMn0sezE5LDE0fX0se3sgNywxNX0sezE5LDE5fX0se3sxMiwxMn0sezE0LDE0fX0sCisgICAge3sxMiwgN30sezI0LDExfX0se3sxMiwxMn0sezE2LDE0fX0se3syMCwxMn0sezI0LDE0fX0se3sxMiwxNX0sezI0LDE5fX0se3sxNywxMn0sezE5LDE0fX0sCisgICAge3sxNywgN30sezI5LDExfX0se3sxNywxMn0sezIxLDE0fX0se3syNSwxMn0sezI5LDE0fX0se3sxNywxNX0sezI5LDE5fX0se3syMiwxMn0sezI0LDE0fX0sCisgICAge3sgMiwxMn0sezE0LDE2fX0se3sgMiwxN30seyA2LDE5fX0se3sxMCwxN30sezE0LDE5fX0se3sgMiwyMH0sezE0LDI0fX0se3sgNywxN30seyA5LDE5fX0sCisgICAge3sgNywxMn0sezE5LDE2fX0se3sgNywxN30sezExLDE5fX0se3sxNSwxN30sezE5LDE5fX0se3sgNywyMH0sezE5LDI0fX0se3sxMiwxN30sezE0LDE5fX0sCisgICAge3sxMiwxMn0sezI0LDE2fX0se3sxMiwxN30sezE2LDE5fX0se3syMCwxN30sezI0LDE5fX0se3sxMiwyMH0sezI0LDI0fX0se3sxNywxN30sezE5LDE5fX0sCisgICAge3sxNywxMn0sezI5LDE2fX0se3sxNywxN30sezIxLDE5fX0se3syNSwxN30sezI5LDE5fX0se3sxNywyMH0sezI5LDI0fX0se3syMiwxN30sezI0LDE5fX0sCisgICAge3sgMiwxN30sezE0LDIxfX0se3sgMiwyMn0seyA2LDI0fX0se3sxMCwyMn0sezE0LDI0fX0se3sgMiwyNX0sezE0LDI5fX0se3sgNywyMn0seyA5LDI0fX0sCisgICAge3sgNywxN30sezE5LDIxfX0se3sgNywyMn0sezExLDI0fX0se3sxNSwyMn0sezE5LDI0fX0se3sgNywyNX0sezE5LDI5fX0se3sxMiwyMn0sezE0LDI0fX0sCisgICAge3sxMiwxN30sezI0LDIxfX0se3sxMiwyMn0sezE2LDI0fX0se3syMCwyMn0sezI0LDI0fX0se3sxMiwyNX0sezI0LDI5fX0se3sxNywyMn0sezE5LDI0fX0sCisgICAge3sxNywxN30sezI5LDIxfX0se3sxNywyMn0sezIxLDI0fX0se3syNSwyMn0sezI5LDI0fX0se3sxNywyNX0sezI5LDI5fX0se3syMiwyMn0sezI0LDI0fX0sCisgICAge3sgOCwgM30sezEzLCA0fX0se3sgOCwgNX0seyA5LCA2fX0se3sxMiwgNX0sezEzLCA2fX0se3sgOCwgN30sezEzLCA4fX0se3sxMCwgNX0sezExLCA2fX0sCisgICAge3sxMywgM30sezE4LCA0fX0se3sxMywgNX0sezE0LCA2fX0se3sxNywgNX0sezE4LCA2fX0se3sxMywgN30sezE4LCA4fX0se3sxNSwgNX0sezE2LCA2fX0sCisgICAge3sxOCwgM30sezIzLCA0fX0se3sxOCwgNX0sezE5LCA2fX0se3syMiwgNX0sezIzLCA2fX0se3sxOCwgN30sezIzLCA4fX0se3syMCwgNX0sezIxLCA2fX0sCisgICAge3sgMywgOH0seyA4LCA5fX0se3sgMywxMH0seyA0LDExfX0se3sgNywxMH0seyA4LDExfX0se3sgMywxMn0seyA4LDEzfX0se3sgNSwxMH0seyA2LDExfX0sCisgICAge3sgOCwgOH0sezEzLCA5fX0se3sgOCwxMH0seyA5LDExfX0se3sxMiwxMH0sezEzLDExfX0se3sgOCwxMn0sezEzLDEzfX0se3sxMCwxMH0sezExLDExfX0sCisgICAge3sxMywgOH0sezE4LCA5fX0se3sxMywxMH0sezE0LDExfX0se3sxNywxMH0sezE4LDExfX0se3sxMywxMn0sezE4LDEzfX0se3sxNSwxMH0sezE2LDExfX0sCisgICAge3sxOCwgOH0sezIzLCA5fX0se3sxOCwxMH0sezE5LDExfX0se3syMiwxMH0sezIzLDExfX0se3sxOCwxMn0sezIzLDEzfX0se3syMCwxMH0sezIxLDExfX0sCisgICAge3syMywgOH0sezI4LCA5fX0se3syMywxMH0sezI0LDExfX0se3syNywxMH0sezI4LDExfX0se3syMywxMn0sezI4LDEzfX0se3syNSwxMH0sezI2LDExfX0sCisgICAge3sgMywxM30seyA4LDE0fX0se3sgMywxNX0seyA0LDE2fX0se3sgNywxNX0seyA4LDE2fX0se3sgMywxN30seyA4LDE4fX0se3sgNSwxNX0seyA2LDE2fX0sCisgICAge3sgOCwxM30sezEzLDE0fX0se3sgOCwxNX0seyA5LDE2fX0se3sxMiwxNX0sezEzLDE2fX0se3sgOCwxN30sezEzLDE4fX0se3sxMCwxNX0sezExLDE2fX0sCisgICAge3sxMywxM30sezE4LDE0fX0se3sxMywxNX0sezE0LDE2fX0se3sxNywxNX0sezE4LDE2fX0se3sxMywxN30sezE4LDE4fX0se3sxNSwxNX0sezE2LDE2fX0sCisgICAge3sxOCwxM30sezIzLDE0fX0se3sxOCwxNX0sezE5LDE2fX0se3syMiwxNX0sezIzLDE2fX0se3sxOCwxN30sezIzLDE4fX0se3syMCwxNX0sezIxLDE2fX0sCisgICAge3syMywxM30sezI4LDE0fX0se3syMywxNX0sezI0LDE2fX0se3syNywxNX0sezI4LDE2fX0se3syMywxN30sezI4LDE4fX0se3syNSwxNX0sezI2LDE2fX0sCisgICAge3sgMywxOH0seyA4LDE5fX0se3sgMywyMH0seyA0LDIxfX0se3sgNywyMH0seyA4LDIxfX0se3sgMywyMn0seyA4LDIzfX0se3sgNSwyMH0seyA2LDIxfX0sCisgICAge3sgOCwxOH0sezEzLDE5fX0se3sgOCwyMH0seyA5LDIxfX0se3sxMiwyMH0sezEzLDIxfX0se3sgOCwyMn0sezEzLDIzfX0se3sxMCwyMH0sezExLDIxfX0sCisgICAge3sxMywxOH0sezE4LDE5fX0se3sxMywyMH0sezE0LDIxfX0se3sxNywyMH0sezE4LDIxfX0se3sxMywyMn0sezE4LDIzfX0se3sxNSwyMH0sezE2LDIxfX0sCisgICAge3sxOCwxOH0sezIzLDE5fX0se3sxOCwyMH0sezE5LDIxfX0se3syMiwyMH0sezIzLDIxfX0se3sxOCwyMn0sezIzLDIzfX0se3syMCwyMH0sezIxLDIxfX0sCisgICAge3syMywxOH0sezI4LDE5fX0se3syMywyMH0sezI0LDIxfX0se3syNywyMH0sezI4LDIxfX0se3syMywyMn0sezI4LDIzfX0se3syNSwyMH0sezI2LDIxfX0sCisgICAge3sgOCwyM30sezEzLDI0fX0se3sgOCwyNX0seyA5LDI2fX0se3sxMiwyNX0sezEzLDI2fX0se3sgOCwyN30sezEzLDI4fX0se3sxMCwyNX0sezExLDI2fX0sCisgICAge3sxMywyM30sezE4LDI0fX0se3sxMywyNX0sezE0LDI2fX0se3sxNywyNX0sezE4LDI2fX0se3sxMywyN30sezE4LDI4fX0se3sxNSwyNX0sezE2LDI2fX0sCisgICAge3sxOCwyM30sezIzLDI0fX0se3sxOCwyNX0sezE5LDI2fX0se3syMiwyNX0sezIzLDI2fX0se3sxOCwyN30sezIzLDI4fX0se3syMCwyNX0sezIxLDI2fX0KK307CitzdGF0aWMgY29uc3QgRWxlbUNhdCBlbGVtX2Q1ID0geyAwLCA0LCA1LCA2MiwgZWxlbV9kNV9kYXRhIH07CisKK3N0YXRpYyBjb25zdCBCbG9jayBlbGVtX2Q2X2RhdGFbXSA9IHsKKyAgICB7eyAzLCA1fSx7MTIsMTB9fSx7eyA1LCAzfSx7MTAsMTJ9fSwKKyAgICB7ezExLCA1fSx7MjAsMTB9fSx7ezEzLCAzfSx7MTgsMTJ9fSwKKyAgICB7ezE5LCA1fSx7MjgsMTB9fSx7ezIxLCAzfSx7MjYsMTJ9fSwKKyAgICB7eyAzLDEzfSx7MTIsMTh9fSx7eyA1LDExfSx7MTAsMjB9fSwKKyAgICB7ezExLDEzfSx7MjAsMTh9fSx7ezEzLDExfSx7MTgsMjB9fSwKKyAgICB7ezE5LDEzfSx7MjgsMTh9fSx7ezIxLDExfSx7MjYsMjB9fSwKKyAgICB7eyAzLDIxfSx7MTIsMjZ9fSx7eyA1LDE5fSx7MTAsMjh9fSwKKyAgICB7ezExLDIxfSx7MjAsMjZ9fSx7ezEzLDE5fSx7MTgsMjh9fSwKKyAgICB7ezE5LDIxfSx7MjgsMjZ9fSx7ezIxLDE5fSx7MjYsMjh9fQorfTsKK3N0YXRpYyBjb25zdCBFbGVtQ2F0IGVsZW1fZDYgPSB7IDAsIDEsIDIsIDksIGVsZW1fZDZfZGF0YSB9OworCitzdGF0aWMgY29uc3QgQmxvY2sgZWxlbV9kN19kYXRhW10gPSB7CisgICAge3sgMCwgNH0seyAzLCA3fX0se3sgOCwgNH0sezExLCA3fX0se3sgNCwgNH0seyA3LCA3fX0sCisgICAge3sgNCwgMH0seyA3LCAzfX0se3sgNCwgOH0seyA3LDExfX0se3sgNCwgNH0seyA3LCA3fX0sCisgICAge3sgNSwgNH0seyA4LCA3fX0se3sxMywgNH0sezE2LCA3fX0se3sgOSwgNH0sezEyLCA3fX0sCisgICAge3sgOSwgMH0sezEyLCAzfX0se3sgOSwgOH0sezEyLDExfX0se3sgOSwgNH0sezEyLCA3fX0sCisgICAge3sxMCwgNH0sezEzLCA3fX0se3sxOCwgNH0sezIxLCA3fX0se3sxNCwgNH0sezE3LCA3fX0sCisgICAge3sxNCwgMH0sezE3LCAzfX0se3sxNCwgOH0sezE3LDExfX0se3sxNCwgNH0sezE3LCA3fX0sCisgICAge3sxNSwgNH0sezE4LCA3fX0se3syMywgNH0sezI2LCA3fX0se3sxOSwgNH0sezIyLCA3fX0sCisgICAge3sxOSwgMH0sezIyLCAzfX0se3sxOSwgOH0sezIyLDExfX0se3sxOSwgNH0sezIyLCA3fX0sCisgICAge3syMCwgNH0sezIzLCA3fX0se3syOCwgNH0sezMxLCA3fX0se3syNCwgNH0sezI3LCA3fX0sCisgICAge3syNCwgMH0sezI3LCAzfX0se3syNCwgOH0sezI3LDExfX0se3syNCwgNH0sezI3LCA3fX0sCisgICAge3sgMCwgOX0seyAzLDEyfX0se3sgOCwgOX0sezExLDEyfX0se3sgNCwgOX0seyA3LDEyfX0sCisgICAge3sgNCwgNX0seyA3LCA4fX0se3sgNCwxM30seyA3LDE2fX0se3sgNCwgOX0seyA3LDEyfX0sCisgICAge3sgNSwgOX0seyA4LDEyfX0se3sxMywgOX0sezE2LDEyfX0se3sgOSwgOX0sezEyLDEyfX0sCisgICAge3sgOSwgNX0sezEyLCA4fX0se3sgOSwxM30sezEyLDE2fX0se3sgOSwgOX0sezEyLDEyfX0sCisgICAge3sxMCwgOX0sezEzLDEyfX0se3sxOCwgOX0sezIxLDEyfX0se3sxNCwgOX0sezE3LDEyfX0sCisgICAge3sxNCwgNX0sezE3LCA4fX0se3sxNCwxM30sezE3LDE2fX0se3sxNCwgOX0sezE3LDEyfX0sCisgICAge3sxNSwgOX0sezE4LDEyfX0se3syMywgOX0sezI2LDEyfX0se3sxOSwgOX0sezIyLDEyfX0sCisgICAge3sxOSwgNX0sezIyLCA4fX0se3sxOSwxM30sezIyLDE2fX0se3sxOSwgOX0sezIyLDEyfX0sCisgICAge3syMCwgOX0sezIzLDEyfX0se3syOCwgOX0sezMxLDEyfX0se3syNCwgOX0sezI3LDEyfX0sCisgICAge3syNCwgNX0sezI3LCA4fX0se3syNCwxM30sezI3LDE2fX0se3syNCwgOX0sezI3LDEyfX0sCisgICAge3sgMCwxNH0seyAzLDE3fX0se3sgOCwxNH0sezExLDE3fX0se3sgNCwxNH0seyA3LDE3fX0sCisgICAge3sgNCwxMH0seyA3LDEzfX0se3sgNCwxOH0seyA3LDIxfX0se3sgNCwxNH0seyA3LDE3fX0sCisgICAge3sgNSwxNH0seyA4LDE3fX0se3sxMywxNH0sezE2LDE3fX0se3sgOSwxNH0sezEyLDE3fX0sCisgICAge3sgOSwxMH0sezEyLDEzfX0se3sgOSwxOH0sezEyLDIxfX0se3sgOSwxNH0sezEyLDE3fX0sCisgICAge3sxMCwxNH0sezEzLDE3fX0se3sxOCwxNH0sezIxLDE3fX0se3sxNCwxNH0sezE3LDE3fX0sCisgICAge3sxNCwxMH0sezE3LDEzfX0se3sxNCwxOH0sezE3LDIxfX0se3sxNCwxNH0sezE3LDE3fX0sCisgICAge3sxNSwxNH0sezE4LDE3fX0se3syMywxNH0sezI2LDE3fX0se3sxOSwxNH0sezIyLDE3fX0sCisgICAge3sxOSwxMH0sezIyLDEzfX0se3sxOSwxOH0sezIyLDIxfX0se3sxOSwxNH0sezIyLDE3fX0sCisgICAge3syMCwxNH0sezIzLDE3fX0se3syOCwxNH0sezMxLDE3fX0se3syNCwxNH0sezI3LDE3fX0sCisgICAge3syNCwxMH0sezI3LDEzfX0se3syNCwxOH0sezI3LDIxfX0se3syNCwxNH0sezI3LDE3fX0sCisgICAge3sgMCwxOX0seyAzLDIyfX0se3sgOCwxOX0sezExLDIyfX0se3sgNCwxOX0seyA3LDIyfX0sCisgICAge3sgNCwxNX0seyA3LDE4fX0se3sgNCwyM30seyA3LDI2fX0se3sgNCwxOX0seyA3LDIyfX0sCisgICAge3sgNSwxOX0seyA4LDIyfX0se3sxMywxOX0sezE2LDIyfX0se3sgOSwxOX0sezEyLDIyfX0sCisgICAge3sgOSwxNX0sezEyLDE4fX0se3sgOSwyM30sezEyLDI2fX0se3sgOSwxOX0sezEyLDIyfX0sCisgICAge3sxMCwxOX0sezEzLDIyfX0se3sxOCwxOX0sezIxLDIyfX0se3sxNCwxOX0sezE3LDIyfX0sCisgICAge3sxNCwxNX0sezE3LDE4fX0se3sxNCwyM30sezE3LDI2fX0se3sxNCwxOX0sezE3LDIyfX0sCisgICAge3sxNSwxOX0sezE4LDIyfX0se3syMywxOX0sezI2LDIyfX0se3sxOSwxOX0sezIyLDIyfX0sCisgICAge3sxOSwxNX0sezIyLDE4fX0se3sxOSwyM30sezIyLDI2fX0se3sxOSwxOX0sezIyLDIyfX0sCisgICAge3syMCwxOX0sezIzLDIyfX0se3syOCwxOX0sezMxLDIyfX0se3syNCwxOX0sezI3LDIyfX0sCisgICAge3syNCwxNX0sezI3LDE4fX0se3syNCwyM30sezI3LDI2fX0se3syNCwxOX0sezI3LDIyfX0sCisgICAge3sgMCwyNH0seyAzLDI3fX0se3sgOCwyNH0sezExLDI3fX0se3sgNCwyNH0seyA3LDI3fX0sCisgICAge3sgNCwyMH0seyA3LDIzfX0se3sgNCwyOH0seyA3LDMxfX0se3sgNCwyNH0seyA3LDI3fX0sCisgICAge3sgNSwyNH0seyA4LDI3fX0se3sxMywyNH0sezE2LDI3fX0se3sgOSwyNH0sezEyLDI3fX0sCisgICAge3sgOSwyMH0sezEyLDIzfX0se3sgOSwyOH0sezEyLDMxfX0se3sgOSwyNH0sezEyLDI3fX0sCisgICAge3sxMCwyNH0sezEzLDI3fX0se3sxOCwyNH0sezIxLDI3fX0se3sxNCwyNH0sezE3LDI3fX0sCisgICAge3sxNCwyMH0sezE3LDIzfX0se3sxNCwyOH0sezE3LDMxfX0se3sxNCwyNH0sezE3LDI3fX0sCisgICAge3sxNSwyNH0sezE4LDI3fX0se3syMywyNH0sezI2LDI3fX0se3sxOSwyNH0sezIyLDI3fX0sCisgICAge3sxOSwyMH0sezIyLDIzfX0se3sxOSwyOH0sezIyLDMxfX0se3sxOSwyNH0sezIyLDI3fX0sCisgICAge3syMCwyNH0sezIzLDI3fX0se3syOCwyNH0sezMxLDI3fX0se3syNCwyNH0sezI3LDI3fX0sCisgICAge3syNCwyMH0sezI3LDIzfX0se3syNCwyOH0sezI3LDMxfX0se3syNCwyNH0sezI3LDI3fX0KK307CitzdGF0aWMgY29uc3QgRWxlbUNhdCBlbGVtX2Q3ID0geyAwLCAyLCAzLCA1MCwgZWxlbV9kN19kYXRhIH07CisKK3N0YXRpYyBjb25zdCBCbG9jayBlbGVtX2Q4X2RhdGFbXSA9IHsKKyAgICB7eyAwLCAwfSx7IDcsIDN9fSx7eyAwLCA0fSx7IDcsIDd9fSwKKyAgICB7eyA4LCAwfSx7MTEsIDd9fSx7ezEyLCAwfSx7MTUsIDd9fSwKKyAgICB7eyAwLCA4fSx7IDMsMTV9fSx7eyA0LCA4fSx7IDcsMTV9fSwKKyAgICB7eyA4LCA4fSx7MTUsMTF9fSx7eyA4LDEyfSx7MTUsMTV9fSwKKyAgICB7ezE2LCAwfSx7MTksIDd9fSx7ezIwLCAwfSx7MjMsIDd9fSwKKyAgICB7ezI0LCAwfSx7MzEsIDN9fSx7ezI0LCA0fSx7MzEsIDd9fSwKKyAgICB7ezE2LCA4fSx7MjMsMTF9fSx7ezE2LDEyfSx7MjMsMTV9fSwKKyAgICB7ezI0LCA4fSx7MjcsMTV9fSx7ezI4LCA4fSx7MzEsMTV9fSwKKyAgICB7eyAwLDE2fSx7IDMsMjN9fSx7eyA0LDE2fSx7IDcsMjN9fSwKKyAgICB7eyA4LDE2fSx7MTUsMTl9fSx7eyA4LDIwfSx7MTUsMjN9fSwKKyAgICB7eyAwLDI0fSx7IDcsMjd9fSx7eyAwLDI4fSx7IDcsMzF9fSwKKyAgICB7eyA4LDI0fSx7MTEsMzF9fSx7ezEyLDI0fSx7MTUsMzF9fSwKKyAgICB7ezE2LDE2fSx7MjMsMTl9fSx7ezE2LDIwfSx7MjMsMjN9fSwKKyAgICB7ezI0LDE2fSx7MjcsMjN9fSx7ezI4LDE2fSx7MzEsMjN9fSwKKyAgICB7ezE2LDI0fSx7MTksMzF9fSx7ezIwLDI0fSx7MjMsMzF9fSwKKyAgICB7ezI0LDI0fSx7MzEsMjd9fSx7ezI0LDI4fSx7MzEsMzF9fSwKKyAgICB7eyAwLCAwfSx7IDcsMTV9fSx7eyA4LCAwfSx7MTUsMTV9fSwKKyAgICB7ezE2LCAwfSx7MzEsIDd9fSx7ezE2LCA4fSx7MzEsMTV9fSwKKyAgICB7eyAwLDE2fSx7MTUsMjN9fSx7eyAwLDI0fSx7MTUsMzF9fSwKKyAgICB7ezE2LDE2fSx7MjMsMzF9fSx7ezI0LDE2fSx7MzEsMzF9fQorfTsKK3N0YXRpYyBjb25zdCBFbGVtQ2F0IGVsZW1fZDggPSB7IDAsIDEsIDIsIDIwLCBlbGVtX2Q4X2RhdGEgfTsKKworc3RhdGljIGNvbnN0IEVsZW1DYXQqIGVsZW1lbnRzW0VMRU1FTlRfQ09VTlRdID0geyAmZWxlbV9hMSwgJmVsZW1fYTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbGVtX2QxLCAmZWxlbV9kMiwgJmVsZW1fZDMsICZlbGVtX2Q0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWxlbV9kNSwgJmVsZW1fZDYsICZlbGVtX2Q3LCAmZWxlbV9kOCB9OworI2VuZGlmIC8qIEFWRklMVEVSX1NJR05BVFVSRV9IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9zaWduYXR1cmVfbG9va3VwLmMgYi9saWJhdmZpbHRlci9zaWduYXR1cmVfbG9va3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcyYzcxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3NpZ25hdHVyZV9sb29rdXAuYwpAQCAtMCwwICsxLDU4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBHZXJpb24gRW50cnVwCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworLyoqCisgKiBAZmlsZQorICogTVBFRy03IHZpZGVvIHNpZ25hdHVyZSBjYWxjdWxhdGlvbiBhbmQgbG9va3VwIGZpbHRlcgorICovCisKKyNpbmNsdWRlICJzaWduYXR1cmUuaCIKKworI2RlZmluZSBIT1VHSF9NQVhfT0ZGU0VUIDkwCisjZGVmaW5lIE1BWF9GUkFNRVJBVEUgNjAKKworI2RlZmluZSBESVJfUFJFViAwCisjZGVmaW5lIERJUl9ORVhUIDEKKyNkZWZpbmUgRElSX1BSRVZfRU5EIDIKKyNkZWZpbmUgRElSX05FWFRfRU5EIDMKKworI2RlZmluZSBTVEFUVVNfTlVMTCAwCisjZGVmaW5lIFNUQVRVU19FTkRfUkVBQ0hFRCAxCisjZGVmaW5lIFNUQVRVU19CRUdJTl9SRUFDSEVEIDIKKworc3RhdGljIHZvaWQgZmlsbF9sMWRpc3RsdXQodWludDhfdCBsdXRbXSkKK3sKKyAgICBpbnQgaSwgaiwgdG1wX2ksIHRtcF9qLGNvdW50OworICAgIHVpbnQ4X3QgZGlzdDsKKworICAgIGZvciAoaSA9IDAsIGNvdW50ID0gMDsgaSA8IDI0MjsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgMjQzOyBqKyssIGNvdW50KyspIHsKKyAgICAgICAgICAgIC8qIHRlcm5hcnkgZGlzdGFuY2UgYmV0d2VlbiBpIGFuZCBqICovCisgICAgICAgICAgICBkaXN0ID0gMDsKKyAgICAgICAgICAgIHRtcF9pID0gaTsgdG1wX2ogPSBqOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGRpc3QgKz0gRkZBQlMoKHRtcF9qICUgMykgLSAodG1wX2kgJSAzKSk7CisgICAgICAgICAgICAgICAgdG1wX2ogLz0gMzsKKyAgICAgICAgICAgICAgICB0bXBfaSAvPSAzOworICAgICAgICAgICAgfSB3aGlsZSAodG1wX2kgPiAwIHx8IHRtcF9qID4gMCk7CisgICAgICAgICAgICBsdXRbY291bnRdID0gZGlzdDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHVuc2lnbmVkIGludCBpbnRlcnNlY3Rpb25fd29yZChjb25zdCB1aW50OF90ICpmaXJzdCwgY29uc3QgdWludDhfdCAqc2Vjb25kKQoreworICAgIHVuc2lnbmVkIGludCB2YWw9MCxpOworICAgIGZvciAoaSA9IDA7IGkgPCAyODsgaSArPSA0KSB7CisgICAgICAgIHZhbCArPSBhdl9wb3Bjb3VudCggKGZpcnN0W2ldICAgJiBzZWNvbmRbaV0gICkgPDwgMjQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdFtpKzFdICYgc2Vjb25kW2krMV0pIDw8IDE2IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlyc3RbaSsyXSAmIHNlY29uZFtpKzJdKSA8PCA4ICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0W2krM10gJiBzZWNvbmRbaSszXSkgKTsKKyAgICB9CisgICAgdmFsICs9IGF2X3BvcGNvdW50KCAoZmlyc3RbMjhdICYgc2Vjb25kWzI4XSkgPDwgMTYgfAorICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0WzI5XSAmIHNlY29uZFsyOV0pIDw8IDggIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdFszMF0gJiBzZWNvbmRbMzBdKSApOworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdW5pb25fd29yZChjb25zdCB1aW50OF90ICpmaXJzdCwgY29uc3QgdWludDhfdCAqc2Vjb25kKQoreworICAgIHVuc2lnbmVkIGludCB2YWw9MCxpOworICAgIGZvciAoaSA9IDA7IGkgPCAyODsgaSArPSA0KSB7CisgICAgICAgIHZhbCArPSBhdl9wb3Bjb3VudCggKGZpcnN0W2ldICAgfCBzZWNvbmRbaV0gICkgPDwgMjQgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdFtpKzFdIHwgc2Vjb25kW2krMV0pIDw8IDE2IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlyc3RbaSsyXSB8IHNlY29uZFtpKzJdKSA8PCA4ICB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0W2krM10gfCBzZWNvbmRbaSszXSkgKTsKKyAgICB9CisgICAgdmFsICs9IGF2X3BvcGNvdW50KCAoZmlyc3RbMjhdIHwgc2Vjb25kWzI4XSkgPDwgMTYgfAorICAgICAgICAgICAgICAgICAgICAgICAgKGZpcnN0WzI5XSB8IHNlY29uZFsyOV0pIDw8IDggIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmaXJzdFszMF0gfCBzZWNvbmRbMzBdKSApOworICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2wxZGlzdChBVkZpbHRlckNvbnRleHQgKmN0eCwgU2lnbmF0dXJlQ29udGV4dCAqc2MsIGNvbnN0IHVpbnQ4X3QgKmZpcnN0LCBjb25zdCB1aW50OF90ICpzZWNvbmQpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdW5zaWduZWQgaW50IGRpc3QgPSAwOworICAgIHVpbnQ4X3QgZiwgczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBTSUdFTEVNX1NJWkUvNTsgaSsrKSB7CisgICAgICAgIGlmIChmaXJzdFtpXSAhPSBzZWNvbmRbaV0pIHsKKyAgICAgICAgICAgIGYgPSBmaXJzdFtpXTsKKyAgICAgICAgICAgIHMgPSBzZWNvbmRbaV07CisgICAgICAgICAgICBpZiAoZiA+IHMpIHsKKyAgICAgICAgICAgICAgICAvKiBsaXR0bGUgdmFyaWF0aW9uIG9mIGdhdXNzIHN1bSBmb3JtdWxhICovCisgICAgICAgICAgICAgICAgZGlzdCArPSBzYy0+bDFkaXN0bHV0WzI0MyoyNDIvMiAtICgyNDMtcykqKDI0Mi1zKS8yICsgZiAtIHMgLSAxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlzdCArPSBzYy0+bDFkaXN0bHV0WzI0MyoyNDIvMiAtICgyNDMtZikqKDI0Mi1mKS8yICsgcyAtIGYgLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGlzdDsKK30KKworLyoqCisgKiBjYWxjdWxhdGVzIHRoZSBqYWNjYXJkIGRpc3RhbmNlIGFuZCBldmFsdWF0ZXMgYSBwYWlyIG9mIGNvYXJzZSBzaWduYXR1cmVzIGFzIGdvb2QKKyAqIEByZXR1cm4gMCBpZiBwYWlyIGlzIGJhZCwgMSBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBnZXRfamFjY2FyZGRpc3QoU2lnbmF0dXJlQ29udGV4dCAqc2MsIENvYXJzZVNpZ25hdHVyZSAqZmlyc3QsIENvYXJzZVNpZ25hdHVyZSAqc2Vjb25kKQoreworICAgIGludCBqYWNjYXJkZGlzdCwgaSwgY29tcG9zZGlzdCA9IDAsIGN3dGhjb3VudCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBpZiAoKGphY2NhcmRkaXN0ID0gaW50ZXJzZWN0aW9uX3dvcmQoZmlyc3QtPmRhdGFbaV0sIHNlY29uZC0+ZGF0YVtpXSkpID4gMCkgeworICAgICAgICAgICAgamFjY2FyZGRpc3QgLz0gdW5pb25fd29yZChmaXJzdC0+ZGF0YVtpXSwgc2Vjb25kLT5kYXRhW2ldKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoamFjY2FyZGRpc3QgPj0gc2MtPnRod29yZGRpc3QpIHsKKyAgICAgICAgICAgIGlmICgrK2N3dGhjb3VudCA+IDIpIHsKKyAgICAgICAgICAgICAgICAvKiBtb3JlIHRoYW4gaGFsZiAoNS8yKSBvZiBkaXN0YW5jZXMgYXJlIHRvbyB3aWRlICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29tcG9zZGlzdCArPSBqYWNjYXJkZGlzdDsKKyAgICAgICAgaWYgKGNvbXBvc2Rpc3QgPiBzYy0+dGhjb21wb3NkaXN0KSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLyoqCisgKiBzdGVwIHRocm91Z2ggdGhlIGNvYXJzZXNpZ25hdHVyZXMgYXMgbG9uZyBhcyBhIGdvb2QgY2FuZGlkYXRlIGlzIGZvdW5kCisgKiBAcmV0dXJuIDAgaWYgbm8gY2FuZGlkYXRlIGlzIGZvdW5kLCAxIG90aGVyd2lzZQorICovCitzdGF0aWMgaW50IGZpbmRfbmV4dF9jb2Fyc2VjYW5kaWRhdGUoU2lnbmF0dXJlQ29udGV4dCAqc2MsIENvYXJzZVNpZ25hdHVyZSAqc2Vjb25kc3RhcnQsIENvYXJzZVNpZ25hdHVyZSAqKmZpcnN0LCBDb2Fyc2VTaWduYXR1cmUgKipzZWNvbmQsIGludCBzdGFydCkKK3sKKyAgICAvKiBnbyBvbmUgY29hcnNlc2lnbmF0dXJlIGZvcmV3b3JkICovCisgICAgaWYgKCFzdGFydCkgeworICAgICAgICBpZiAoKCpzZWNvbmQpLT5uZXh0KSB7CisgICAgICAgICAgICAqc2Vjb25kID0gKCpzZWNvbmQpLT5uZXh0OworICAgICAgICB9IGVsc2UgaWYgKCgqZmlyc3QpLT5uZXh0KSB7CisgICAgICAgICAgICAqc2Vjb25kID0gc2Vjb25kc3RhcnQ7CisgICAgICAgICAgICAqZmlyc3QgPSAoKmZpcnN0KS0+bmV4dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGdldF9qYWNjYXJkZGlzdChzYywgKmZpcnN0LCAqc2Vjb25kKSkKKyAgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIC8qIG5leHQgc2lnbmF0dXJlICovCisgICAgICAgIGlmICgoKnNlY29uZCktPm5leHQpIHsKKyAgICAgICAgICAgICpzZWNvbmQgPSAoKnNlY29uZCktPm5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoKCpmaXJzdCktPm5leHQpIHsKKyAgICAgICAgICAgICpzZWNvbmQgPSBzZWNvbmRzdGFydDsKKyAgICAgICAgICAgICpmaXJzdCA9ICgqZmlyc3QpLT5uZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKgorICogY29tcGFyZXMgZnJhbWVzaWduYXR1cmVzIGFuZCBzb3J0cyBvdXQgc2lnbmF0dXJlcyB3aXRoIGEgbDEgZGlzdGFuY2UgYWJvdmUgYSBnaXZlbiB0aHJlc2hvbGQuCisgKiBUaGVuIHRyaWVzIHRvIGZpbmQgb3V0IG9mZnNldCBhbmQgZGlmZmVyZW5jZXMgYmV0d2VlbiBmcmFtZXJhdGVzIHdpdGggYSBob3VnaCB0cmFuc2Zvcm1hdGlvbgorICovCitzdGF0aWMgTWF0Y2hpbmdJbmZvKiBnZXRfbWF0Y2hpbmdfcGFyYW1ldGVycyhBVkZpbHRlckNvbnRleHQgKmN0eCwgU2lnbmF0dXJlQ29udGV4dCAqc2MsIEZpbmVTaWduYXR1cmUgKmZpcnN0LCBGaW5lU2lnbmF0dXJlICpzZWNvbmQpCit7CisgICAgRmluZVNpZ25hdHVyZSAqZiwgKnM7CisgICAgc2l6ZV90IGksIGosIGssIGwsIGhtYXggPSAwLCBzY29yZTsKKyAgICBpbnQgZnJhbWVyYXRlLCBvZmZzZXQsIGwxZGlzdDsKKyAgICBkb3VibGUgbTsKKyAgICBNYXRjaGluZ0luZm8gKmNhbmRzID0gTlVMTCwgKmMgPSBOVUxMOworCisgICAgc3RydWN0IHsKKyAgICAgICAgdWludDhfdCBzaXplOworICAgICAgICB1bnNpZ25lZCBpbnQgZGlzdDsKKyAgICAgICAgRmluZVNpZ25hdHVyZSAqYTsKKyAgICAgICAgdWludDhfdCBiX3Bvc1tDT0FSU0VfU0laRV07CisgICAgICAgIEZpbmVTaWduYXR1cmUgKmJbQ09BUlNFX1NJWkVdOworICAgIH0gcGFpcnNbQ09BUlNFX1NJWkVdOworCisgICAgdHlwZWRlZiBzdHJ1Y3QgaHNwYWNlX2VsZW0geworICAgICAgICBpbnQgZGlzdDsKKyAgICAgICAgc2l6ZV90IHNjb3JlOworICAgICAgICBGaW5lU2lnbmF0dXJlICphOworICAgICAgICBGaW5lU2lnbmF0dXJlICpiOworICAgIH0gaHNwYWNlX2VsZW07CisKKyAgICAvKiBob3VnaHNwYWNlICovCisgICAgaHNwYWNlX2VsZW0qKiBoc3BhY2UgPSBhdl9tYWxsb2NfYXJyYXkoTUFYX0ZSQU1FUkFURSwgc2l6ZW9mKGhzcGFjZV9lbGVtICopKTsKKworICAgIC8qIGluaXRpYWxpemUgaG91Z2hzcGFjZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBNQVhfRlJBTUVSQVRFOyBpKyspIHsKKyAgICAgICAgaHNwYWNlW2ldID0gYXZfbWFsbG9jX2FycmF5KDIgKiBIT1VHSF9NQVhfT0ZGU0VUICsgMSwgc2l6ZW9mKGhzcGFjZV9lbGVtKSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBIT1VHSF9NQVhfT0ZGU0VUOyBqKyspIHsKKyAgICAgICAgICAgIGhzcGFjZVtpXVtqXS5zY29yZSA9IDA7CisgICAgICAgICAgICBoc3BhY2VbaV1bal0uZGlzdCA9IDk5OTk5OworICAgICAgICB9CisgICAgfQorCisgICAgLyogbDEgZGlzdGFuY2VzICovCisgICAgZm9yIChpID0gMCwgZiA9IGZpcnN0OyBpIDwgQ09BUlNFX1NJWkUgJiYgZi0+bmV4dDsgaSsrLCBmID0gZi0+bmV4dCkgeworICAgICAgICBwYWlyc1tpXS5zaXplID0gMDsKKyAgICAgICAgcGFpcnNbaV0uZGlzdCA9IDk5OTk5OworICAgICAgICBwYWlyc1tpXS5hID0gZjsKKyAgICAgICAgZm9yIChqID0gMCwgcyA9IHNlY29uZDsgaiA8IENPQVJTRV9TSVpFICYmIHMtPm5leHQ7IGorKywgcyA9IHMtPm5leHQpIHsKKyAgICAgICAgICAgIC8qIGwxIGRpc3RhbmNlIG9mIGZpbmVzaWduYXR1cmUgKi8KKyAgICAgICAgICAgIGwxZGlzdCA9IGdldF9sMWRpc3QoY3R4LCBzYywgZi0+ZnJhbWVzaWcsIHMtPmZyYW1lc2lnKTsKKyAgICAgICAgICAgIGlmIChsMWRpc3QgPCBzYy0+dGhsMSkgeworICAgICAgICAgICAgICAgIGlmIChsMWRpc3QgPCBwYWlyc1tpXS5kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIHBhaXJzW2ldLnNpemUgPSAxOworICAgICAgICAgICAgICAgICAgICBwYWlyc1tpXS5kaXN0ID0gbDFkaXN0OworICAgICAgICAgICAgICAgICAgICBwYWlyc1tpXS5iX3Bvc1swXSA9IGo7CisgICAgICAgICAgICAgICAgICAgIHBhaXJzW2ldLmJbMF0gPSBzOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobDFkaXN0ID09IHBhaXJzW2ldLmRpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFpcnNbaV0uYltwYWlyc1tpXS5zaXplXSA9IHM7CisgICAgICAgICAgICAgICAgICAgIHBhaXJzW2ldLmJfcG9zW3BhaXJzW2ldLnNpemVdID0gajsKKyAgICAgICAgICAgICAgICAgICAgcGFpcnNbaV0uc2l6ZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBsYXN0IGluY29tcGxldGUgY29hcnNlc2lnbmF0dXJlICovCisgICAgaWYgKGYtPm5leHQgPT0gTlVMTCkgeworICAgICAgICBmb3IgKDsgaSA8IENPQVJTRV9TSVpFOyBpKyspIHsKKyAgICAgICAgICAgIHBhaXJzW2ldLnNpemUgPSAwOworICAgICAgICAgICAgcGFpcnNbaV0uZGlzdCA9IDk5OTk5OworICAgICAgICB9CisgICAgfQorCisgICAgLyogaG91Z2ggdHJhbnNmb3JtYXRpb24gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ09BUlNFX1NJWkU7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGFpcnNbaV0uc2l6ZTsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGsgPSBpICsgMTsgayA8IENPQVJTRV9TSVpFOyBrKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgcGFpcnNba10uc2l6ZTsgbCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyc1tpXS5iW2pdICE9IHBhaXJzW2tdLmJbbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbmVhciByZWdyZXNzaW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBtID0gKHBhaXJzW2tdLmJfcG9zW2xdLXBhaXJzW2ldLmJfcG9zW2pdKSAvIChrLWkpOyAvKiBnb29kIHZhbHVlIGJldHdlZW4gMC4wIC0gMi4wICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXJhdGUgPSAoaW50KSBtKjMwICsgMC41OyAvKiByb3VuZCB1cCB0byAwIC0gNjAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmFtZXJhdGU+MCAmJiBmcmFtZXJhdGUgPD0gTUFYX0ZSQU1FUkFURSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHBhaXJzW2ldLmJfcG9zW2pdIC0gKChpbnQpIG0qaSArIDAuNSk7IC8qIG9ubHkgc2Vjb25kIHBhcnQgaGFzIHRvIGJlIHJvdW5kZWQgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gLUhPVUdIX01BWF9PRkZTRVQgJiYgb2Zmc2V0IDwgSE9VR0hfTUFYX09GRlNFVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpcnNbaV0uZGlzdCA8IHBhaXJzW2tdLmRpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYWlyc1tpXS5kaXN0IDwgaHNwYWNlW2ZyYW1lcmF0ZS0xXVtvZmZzZXQrSE9VR0hfTUFYX09GRlNFVF0uZGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGFjZVtmcmFtZXJhdGUtMV1bb2Zmc2V0K0hPVUdIX01BWF9PRkZTRVRdLmRpc3QgPSBwYWlyc1tpXS5kaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGFjZVtmcmFtZXJhdGUtMV1bb2Zmc2V0K0hPVUdIX01BWF9PRkZTRVRdLmEgPSBwYWlyc1tpXS5hOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGFjZVtmcmFtZXJhdGUtMV1bb2Zmc2V0K0hPVUdIX01BWF9PRkZTRVRdLmIgPSBwYWlyc1tpXS5iW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXJzW2tdLmRpc3QgPCBoc3BhY2VbZnJhbWVyYXRlLTFdW29mZnNldCtIT1VHSF9NQVhfT0ZGU0VUXS5kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwYWNlW2ZyYW1lcmF0ZS0xXVtvZmZzZXQrSE9VR0hfTUFYX09GRlNFVF0uZGlzdCA9IHBhaXJzW2tdLmRpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwYWNlW2ZyYW1lcmF0ZS0xXVtvZmZzZXQrSE9VR0hfTUFYX09GRlNFVF0uYSA9IHBhaXJzW2tdLmE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNwYWNlW2ZyYW1lcmF0ZS0xXVtvZmZzZXQrSE9VR0hfTUFYX09GRlNFVF0uYiA9IHBhaXJzW2tdLmJbbF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29yZSA9IGhzcGFjZVtmcmFtZXJhdGUtMV1bb2Zmc2V0K0hPVUdIX01BWF9PRkZTRVRdLnNjb3JlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gaG1heCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobWF4ID0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzcGFjZVtmcmFtZXJhdGUtMV1bb2Zmc2V0K0hPVUdIX01BWF9PRkZTRVRdLnNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGhtYXggPiAwKSB7CisgICAgICAgIGhtYXggPSAoaW50KSAoMC43KmhtYXgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0ZSQU1FUkFURTsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgSE9VR0hfTUFYX09GRlNFVDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGhtYXggPCBoc3BhY2VbaV1bal0uc2NvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGF2X21hbGxvYyhzaXplb2YoTWF0Y2hpbmdJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FuZHMgPSBjOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYy0+bmV4dCA9IGF2X21hbGxvYyhzaXplb2YoTWF0Y2hpbmdJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWMtPm5leHQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0ZBVEFMLCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGMtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYy0+ZnJhbWVyYXRlcmF0aW8gPSAoaSsxLjApIC8gMzA7CisgICAgICAgICAgICAgICAgICAgIGMtPnNjb3JlID0gaHNwYWNlW2ldW2pdLnNjb3JlOworICAgICAgICAgICAgICAgICAgICBjLT5vZmZzZXQgPSBqLTkwOworICAgICAgICAgICAgICAgICAgICBjLT5maXJzdCA9IGhzcGFjZVtpXVtqXS5hOworICAgICAgICAgICAgICAgICAgICBjLT5zZWNvbmQgPSBoc3BhY2VbaV1bal0uYjsKKyAgICAgICAgICAgICAgICAgICAgYy0+bmV4dCA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgLyogbm90IHVzZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgYy0+bWVhbmRpc3QgPSAwOworICAgICAgICAgICAgICAgICAgICBjLT5tYXRjaGZyYW1lcyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGMtPndob2xlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9GUkFNRVJBVEU7IGkrKykgeworICAgICAgICBhdl9mcmVlcCgmaHNwYWNlW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmhzcGFjZSk7CisgICAgcmV0dXJuIGNhbmRzOworfQorCitzdGF0aWMgaW50IGl0ZXJhdGVfZnJhbWUoZG91YmxlIGZyciwgRmluZVNpZ25hdHVyZSAqKmEsIEZpbmVTaWduYXR1cmUgKipiLCBpbnQgZmNvdW50LCBpbnQgKmJjb3VudCwgaW50IGRpcikKK3sKKyAgICBpbnQgc3RlcDsKKworICAgIC8qIGJldHdlZW4gMSBhbmQgMiwgYmVjYXVzZSBmcnIgaXMgYmV0d2VlbiAxIGFuZCAyICovCisgICAgc3RlcCA9ICgoaW50KSAwLjUgKyBmY291bnQgICAgICogZnJyKSAvKiBjdXJyZW50IGZyYW1lICovCisgICAgICAgICAgLSgoaW50KSAwLjUgKyAoZmNvdW50LTEpICogZnJyKTsvKiBsYXN0IGZyYW1lICovCisKKyAgICBpZiAoZGlyID09IERJUl9ORVhUKSB7CisgICAgICAgIGlmIChmcnIgPj0gMS4wKSB7CisgICAgICAgICAgICBpZiAoKCphKS0+bmV4dCkgeworICAgICAgICAgICAgICAgICphID0gKCphKS0+bmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIERJUl9ORVhUX0VORDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHN0ZXAgPT0gMSkgeworICAgICAgICAgICAgICAgIGlmICgoKmIpLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICpiID0gKCpiKS0+bmV4dDsKKyAgICAgICAgICAgICAgICAgICAgKCpiY291bnQpKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUl9ORVhUX0VORDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoKmIpLT5uZXh0ICYmICgqYiktPm5leHQtPm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmIgPSAoKmIpLT5uZXh0LT5uZXh0OworICAgICAgICAgICAgICAgICAgICAoKmJjb3VudCkrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSX05FWFRfRU5EOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoKmIpLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgKmIgPSAoKmIpLT5uZXh0OworICAgICAgICAgICAgICAgICgqYmNvdW50KSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRElSX05FWFRfRU5EOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RlcCA9PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKCgqYSktPm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgKmEgPSAoKmEpLT5uZXh0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJfTkVYVF9FTkQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKCphKS0+bmV4dCAmJiAoKmEpLT5uZXh0LT5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICphID0gKCphKS0+bmV4dC0+bmV4dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSX05FWFRfRU5EOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRElSX05FWFQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZyciA+PSAxLjApIHsKKyAgICAgICAgICAgIGlmICgoKmEpLT5wcmV2KSB7CisgICAgICAgICAgICAgICAgKmEgPSAoKmEpLT5wcmV2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRElSX1BSRVZfRU5EOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3RlcCA9PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKCgqYiktPnByZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgKmIgPSAoKmIpLT5wcmV2OworICAgICAgICAgICAgICAgICAgICAoKmJjb3VudCkrKzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSX1BSRVZfRU5EOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCgqYiktPnByZXYgJiYgKCpiKS0+cHJldi0+cHJldikgeworICAgICAgICAgICAgICAgICAgICAqYiA9ICgqYiktPnByZXYtPnByZXY7CisgICAgICAgICAgICAgICAgICAgICgqYmNvdW50KSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJfUFJFVl9FTkQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCgqYiktPnByZXYpIHsKKyAgICAgICAgICAgICAgICAqYiA9ICgqYiktPnByZXY7CisgICAgICAgICAgICAgICAgKCpiY291bnQpKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBESVJfUFJFVl9FTkQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzdGVwID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCphKS0+cHJldikgeworICAgICAgICAgICAgICAgICAgICAqYSA9ICgqYSktPnByZXY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUl9QUkVWX0VORDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoKmEpLT5wcmV2ICYmICgqYSktPnByZXYtPnByZXYpIHsKKyAgICAgICAgICAgICAgICAgICAgKmEgPSAoKmEpLT5wcmV2LT5wcmV2OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJfUFJFVl9FTkQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBESVJfUFJFVjsKKyAgICB9Cit9CisKK3N0YXRpYyBNYXRjaGluZ0luZm8gZXZhbHVhdGVfcGFyYW1ldGVycyhBVkZpbHRlckNvbnRleHQgKmN0eCwgU2lnbmF0dXJlQ29udGV4dCAqc2MsIE1hdGNoaW5nSW5mbyAqaW5mb3MsIE1hdGNoaW5nSW5mbyBiZXN0bWF0Y2gsIGludCBtb2RlKQoreworICAgIGludCBkaXN0LCBkaXN0c3VtID0gMCwgYmNvdW50ID0gMSwgZGlyID0gRElSX05FWFQ7CisgICAgaW50IGZjb3VudCA9IDAsIGdvb2RmY291bnQgPSAwLCBnb29kYSA9IDAsIGdvb2RiID0gMDsKKyAgICBkb3VibGUgbWVhbmRpc3QsIG1pbm1lYW5kaXN0ID0gYmVzdG1hdGNoLm1lYW5kaXN0OworICAgIGludCB0b2xlcmFuY2Vjb3VudCA9IDA7CisgICAgRmluZVNpZ25hdHVyZSAqYSwgKmIsICphcHJldiwgKmJwcmV2OworICAgIGludCBzdGF0dXMgPSBTVEFUVVNfTlVMTDsKKworICAgIGZvciAoOyBpbmZvcyAhPSBOVUxMOyBpbmZvcyA9IGluZm9zLT5uZXh0KSB7CisgICAgICAgIGEgPSBpbmZvcy0+Zmlyc3Q7CisgICAgICAgIGIgPSBpbmZvcy0+c2Vjb25kOworICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgZGlzdCA9IGdldF9sMWRpc3QoY3R4LCBzYywgYS0+ZnJhbWVzaWcsIGItPmZyYW1lc2lnKTsKKworICAgICAgICAgICAgaWYgKGRpc3QgPiBzYy0+dGhsMSkgeworICAgICAgICAgICAgICAgIGlmIChhLT5jb25maWRlbmNlID49IDEgfHwgYi0+Y29uZmlkZW5jZSA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGJhZCBmcmFtZSAoYmVjYXVzZSBoaWdoIGRpZmZlcmVudCBpbmZvcm1hdGlvbikgKi8KKyAgICAgICAgICAgICAgICAgICAgdG9sZXJhbmNlY291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodG9sZXJhbmNlY291bnQgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgIGEgPSBhcHJldjsKKyAgICAgICAgICAgICAgICAgICAgYiA9IGJwcmV2OworICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IERJUl9ORVhUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0dXJuIGFyb3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgYSA9IGluZm9zLT5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBpbmZvcy0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gRElSX1BSRVY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogZ29vZCBmcmFtZSAqLworICAgICAgICAgICAgICAgIGRpc3RzdW0gKz0gZGlzdDsKKyAgICAgICAgICAgICAgICBnb29kZmNvdW50Kys7CisgICAgICAgICAgICAgICAgdG9sZXJhbmNlY291bnQ9MDsKKworICAgICAgICAgICAgICAgIGFwcmV2ID0gYTsKKyAgICAgICAgICAgICAgICBicHJldiA9IGI7CisKKyAgICAgICAgICAgICAgICBpZiAoYS0+Y29uZmlkZW5jZSA8IDEpIGdvb2RhKys7CisgICAgICAgICAgICAgICAgaWYgKGItPmNvbmZpZGVuY2UgPCAxKSBnb29kYisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmY291bnQrKzsKKworICAgICAgICAgICAgZGlyID0gaXRlcmF0ZV9mcmFtZShpbmZvcy0+ZnJhbWVyYXRlcmF0aW8sICZhLCAmYiwgZmNvdW50LCAmYmNvdW50LCBkaXIpOworICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfTkVYVF9FTkQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBTVEFUVVNfRU5EX1JFQUNIRUQ7CisgICAgICAgICAgICAgICAgYSA9IGluZm9zLT5maXJzdDsKKyAgICAgICAgICAgICAgICBiID0gaW5mb3MtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBkaXIgPSBpdGVyYXRlX2ZyYW1lKGluZm9zLT5mcmFtZXJhdGVyYXRpbywgJmEsICZiLCBmY291bnQsICZiY291bnQsIERJUl9QUkVWKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRpciA9PSBESVJfUFJFVl9FTkQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgfD0gU1RBVFVTX0JFR0lOX1JFQUNIRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzYy0+dGhkaSAhPSAwICYmIGJjb3VudCA+PSBzYy0+dGhkaSkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBlbm91Z2ggZnJhbWVzIGZvdW5kICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmNvdW50IDwgc2MtPnRoZGkpCisgICAgICAgICAgICBjb250aW51ZTsgLyogbWF0Y2hpbmcgc2VxdWVuY2UgaXMgdG9vIHNob3J0ICovCisgICAgICAgIGlmICgoZG91YmxlKSBnb29kZmNvdW50IC8gKGRvdWJsZSkgZmNvdW50IDwgc2MtPnRoaXQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKChkb3VibGUpIGdvb2RmY291bnQqMC41IDwgRkZNQVgoZ29vZGEsIGdvb2RiKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG1lYW5kaXN0ID0gKGRvdWJsZSkgZ29vZGZjb3VudCAvIChkb3VibGUpIGRpc3RzdW07CisKKyAgICAgICAgaWYgKG1lYW5kaXN0IDwgbWlubWVhbmRpc3QgfHwKKyAgICAgICAgICAgICAgICBzdGF0dXMgPT0gU1RBVFVTX0VORF9SRUFDSEVEIHwgU1RBVFVTX0JFR0lOX1JFQUNIRUQgfHwKKyAgICAgICAgICAgICAgICBtb2RlID09IE1PREVfRkFTVCl7CisgICAgICAgICAgICBtaW5tZWFuZGlzdCA9IG1lYW5kaXN0OworICAgICAgICAgICAgLyogYmVzdGNhbmRpZGF0ZSBpbiB0aGlzIGl0ZXJhdGlvbiAqLworICAgICAgICAgICAgYmVzdG1hdGNoLm1lYW5kaXN0ID0gbWVhbmRpc3Q7CisgICAgICAgICAgICBiZXN0bWF0Y2gubWF0Y2hmcmFtZXMgPSBiY291bnQ7CisgICAgICAgICAgICBiZXN0bWF0Y2guZnJhbWVyYXRlcmF0aW8gPSBpbmZvcy0+ZnJhbWVyYXRlcmF0aW87CisgICAgICAgICAgICBiZXN0bWF0Y2guc2NvcmUgPSBpbmZvcy0+c2NvcmU7CisgICAgICAgICAgICBiZXN0bWF0Y2gub2Zmc2V0ID0gaW5mb3MtPm9mZnNldDsKKyAgICAgICAgICAgIGJlc3RtYXRjaC5maXJzdCA9IGluZm9zLT5maXJzdDsKKyAgICAgICAgICAgIGJlc3RtYXRjaC5zZWNvbmQgPSBpbmZvcy0+c2Vjb25kOworICAgICAgICAgICAgYmVzdG1hdGNoLndob2xlID0gMDsgLyogd2lsbCBiZSBzZXQgdG8gdHJ1ZSBsYXRlciAqLworICAgICAgICAgICAgYmVzdG1hdGNoLm5leHQgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLyogd2hvbGUgc2VxdWVuY2UgaXMgYXV0b21hdGljYWxseSBiZXN0IG1hdGNoICovCisgICAgICAgIGlmIChzdGF0dXMgPT0gKFNUQVRVU19FTkRfUkVBQ0hFRCB8IFNUQVRVU19CRUdJTl9SRUFDSEVEKSkgeworICAgICAgICAgICAgYmVzdG1hdGNoLndob2xlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZmlyc3QgbWF0Y2hpbmcgc2VxdWVuY2UgaXMgZW5vdWdoLCBmaW5kaW5nIHRoZSBiZXN0IG9uZSBpcyBub3QgbmVjZXNzYXJ5ICovCisgICAgICAgIGlmIChtb2RlID09IE1PREVfRkFTVCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJlc3RtYXRjaDsKK30KKworc3RhdGljIHZvaWQgc2xsX2ZyZWUoTWF0Y2hpbmdJbmZvICpzbGwpCit7CisgICAgdm9pZCAqdG1wOworICAgIHdoaWxlIChzbGwpIHsKKyAgICAgICAgdG1wID0gc2xsOworICAgICAgICBzbGwgPSBzbGwtPm5leHQ7CisgICAgICAgIGF2X2ZyZWVwKCZ0bXApOworICAgIH0KK30KKworc3RhdGljIE1hdGNoaW5nSW5mbyBsb29rdXBfc2lnbmF0dXJlcyhBVkZpbHRlckNvbnRleHQgKmN0eCwgU2lnbmF0dXJlQ29udGV4dCAqc2MsIFN0cmVhbUNvbnRleHQgKmZpcnN0LCBTdHJlYW1Db250ZXh0ICpzZWNvbmQsIGludCBtb2RlKQoreworICAgIENvYXJzZVNpZ25hdHVyZSAqY3MsICpjczI7CisgICAgTWF0Y2hpbmdJbmZvICppbmZvczsKKyAgICBNYXRjaGluZ0luZm8gYmVzdG1hdGNoOworICAgIE1hdGNoaW5nSW5mbyAqaTsKKworICAgIGNzID0gZmlyc3QtPmNvYXJzZXNpZ2xpc3Q7CisgICAgY3MyID0gc2Vjb25kLT5jb2Fyc2VzaWdsaXN0OworCisgICAgLyogc2NvcmUgb2YgYmVzdG1hdGNoIGlzIDAsIGlmIG5vIG1hdGNoIGlzIGZvdW5kICovCisgICAgYmVzdG1hdGNoLnNjb3JlID0gMDsKKyAgICBiZXN0bWF0Y2gubWVhbmRpc3QgPSA5OTk5OTsKKyAgICBiZXN0bWF0Y2gud2hvbGUgPSAwOworCisgICAgZmlsbF9sMWRpc3RsdXQoc2MtPmwxZGlzdGx1dCk7CisKKyAgICAvKiBzdGFnZSAxOiBjb2Fyc2VzaWduYXR1cmUgbWF0Y2hpbmcgKi8KKyAgICBpZiAoZmluZF9uZXh0X2NvYXJzZWNhbmRpZGF0ZShzYywgc2Vjb25kLT5jb2Fyc2VzaWdsaXN0LCAmY3MsICZjczIsIDEpID09IDApCisgICAgICAgIHJldHVybiBiZXN0bWF0Y2g7IC8qIG5vIGNhbmRpZGF0ZSBmb3VuZCAqLworICAgIGRvIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiU3RhZ2UgMTogZ290IGNvYXJzZXNpZ25hdHVyZSBwYWlyLiAiCisgICAgICAgICAgICAgICAiaW5kaWNlcyBvZiBmaXJzdCBmcmFtZTogJSJQUkl1MzIiIGFuZCAlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICBjcy0+Zmlyc3QtPmluZGV4LCBjczItPmZpcnN0LT5pbmRleCk7CisgICAgICAgIC8qIHN0YWdlIDI6IGwxLWRpc3RhbmNlIGFuZCBob3VnaC10cmFuc2Zvcm0gKi8KKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiU3RhZ2UgMjogY2FsY3VsYXRlIG1hdGNoaW5nIHBhcmFtZXRlcnNcbiIpOworICAgICAgICBpbmZvcyA9IGdldF9tYXRjaGluZ19wYXJhbWV0ZXJzKGN0eCwgc2MsIGNzLT5maXJzdCwgY3MyLT5maXJzdCk7CisgICAgICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPT0gQVZfTE9HX0RFQlVHKSB7CisgICAgICAgICAgICBmb3IgKGkgPSBpbmZvczsgaSAhPSBOVUxMOyBpID0gaS0+bmV4dCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlN0YWdlIDI6IG1hdGNoaW5nIHBhaXIgYXQgJSJQUkl1MzIiIGFuZCAlIlBSSXUzMiIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgInJhdGlvICVmLCBvZmZzZXQgJWRcbiIsIGktPmZpcnN0LT5pbmRleCwgaS0+c2Vjb25kLT5pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgaS0+ZnJhbWVyYXRlcmF0aW8sIGktPm9mZnNldCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogc3RhZ2UgMzogZXZhbHVhdGlvbiAqLworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJTdGFnZSAzOiBldmFsdWF0ZVxuIik7CisgICAgICAgIGlmIChpbmZvcykgeworICAgICAgICAgICAgYmVzdG1hdGNoID0gZXZhbHVhdGVfcGFyYW1ldGVycyhjdHgsIHNjLCBpbmZvcywgYmVzdG1hdGNoLCBtb2RlKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlN0YWdlIDM6IGJlc3QgbWF0Y2hpbmcgcGFpciBhdCAlIlBSSXUzMiIgYW5kICUiUFJJdTMyIiwgIgorICAgICAgICAgICAgICAgICAgICJyYXRpbyAlZiwgb2Zmc2V0ICVkLCBzY29yZSAlZCwgJWQgZnJhbWVzIG1hdGNoaW5nXG4iLAorICAgICAgICAgICAgICAgICAgIGJlc3RtYXRjaC5maXJzdC0+aW5kZXgsIGJlc3RtYXRjaC5zZWNvbmQtPmluZGV4LAorICAgICAgICAgICAgICAgICAgIGJlc3RtYXRjaC5mcmFtZXJhdGVyYXRpbywgYmVzdG1hdGNoLm9mZnNldCwgYmVzdG1hdGNoLnNjb3JlLCBiZXN0bWF0Y2gubWF0Y2hmcmFtZXMpOworICAgICAgICAgICAgc2xsX2ZyZWUoaW5mb3MpOworICAgICAgICB9CisgICAgfSB3aGlsZSAoZmluZF9uZXh0X2NvYXJzZWNhbmRpZGF0ZShzYywgc2Vjb25kLT5jb2Fyc2VzaWdsaXN0LCAmY3MsICZjczIsIDApICYmICFiZXN0bWF0Y2gud2hvbGUpOworICAgIHJldHVybiBiZXN0bWF0Y2g7CisKK30KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3NwbGl0LmMgYi9saWJhdmZpbHRlci9zcGxpdC5jCmluZGV4IGM1NDVmZDYuLjhiMjYwYTkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3NwbGl0LmMKKysrIGIvbGliYXZmaWx0ZXIvc3BsaXQuYwpAQCAtMzAsNiArMzAsOSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAKKyNkZWZpbmUgRkZfSU5URVJOQUxfRklFTERTIDEKKyNpbmNsdWRlICJmcmFtZXF1ZXVlLmgiCisKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImF1ZGlvLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgpAQCAtNDQsNyArNDcsNyBAQAogc3RhdGljIGF2X2NvbGQgaW50IHNwbGl0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgU3BsaXRDb250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIGludCBpOworICAgIGludCBpLCByZXQ7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfb3V0cHV0czsgaSsrKSB7CiAgICAgICAgIGNoYXIgbmFtZVszMl07CkBAIC01Niw3ICs1OSwxMCBAQAogICAgICAgICBpZiAoIXBhZC5uYW1lKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICAgICBmZl9pbnNlcnRfb3V0cGFkKGN0eCwgaSwgJnBhZCk7CisgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X291dHBhZChjdHgsIGksICZwYWQpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwYWQubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC03OCw3ICs4NCw3IEBACiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKSB7CiAgICAgICAgIEFWRnJhbWUgKmJ1Zl9vdXQ7CiAKLSAgICAgICAgaWYgKGN0eC0+b3V0cHV0c1tpXS0+c3RhdHVzKQorICAgICAgICBpZiAoY3R4LT5vdXRwdXRzW2ldLT5zdGF0dXNfaW4pCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgYnVmX291dCA9IGF2X2ZyYW1lX2Nsb25lKGZyYW1lKTsKICAgICAgICAgaWYgKCFidWZfb3V0KSB7CkBAIC05NSw3ICsxMDEsNyBAQAogfQogCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTcGxpdENvbnRleHQsIHgpCi0jZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX0FVRElPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0pCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewogICAgIHsgIm91dHB1dHMiLCAic2V0IG51bWJlciBvZiBvdXRwdXRzIiwgT0ZGU0VUKG5iX291dHB1dHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDIgfSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKICAgICB7IE5VTEwgfQpAQCAtMTQ0LDcgKzE1MCw2IEBACiAgICAgLnByaXZfY2xhc3MgID0gJmFzcGxpdF9jbGFzcywKICAgICAuaW5pdCAgICAgICAgPSBzcGxpdF9pbml0LAogICAgIC51bmluaXQgICAgICA9IHNwbGl0X3VuaW5pdCwKLSAgICAucXVlcnlfZm9ybWF0cyA9IGZmX3F1ZXJ5X2Zvcm1hdHNfYWxsLAogICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX2FmX2FzcGxpdF9pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgID0gTlVMTCwKICAgICAuZmxhZ3MgICAgICAgPSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfT1VUUFVUUywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3NyY19tb3ZpZS5jIGIvbGliYXZmaWx0ZXIvc3JjX21vdmllLmMKaW5kZXggODJkMmJjZC4uYmNhYmZjYyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvc3JjX21vdmllLmMKKysrIGIvbGliYXZmaWx0ZXIvc3JjX21vdmllLmMKQEAgLTM3LDcgKzM3LDExIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisKICNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorCiAjaW5jbHVkZSAiYXVkaW8uaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKQEAgLTQ2LDcgKzUwLDEwIEBACiAKIHR5cGVkZWYgc3RydWN0IE1vdmllU3RyZWFtIHsKICAgICBBVlN0cmVhbSAqc3Q7CisgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjX2N0eDsKICAgICBpbnQgZG9uZTsKKyAgICBpbnQ2NF90IGRpc2NvbnRpbnVpdHlfdGhyZXNob2xkOworICAgIGludDY0X3QgbGFzdF9wdHM7CiB9IE1vdmllU3RyZWFtOwogCiB0eXBlZGVmIHN0cnVjdCBNb3ZpZUNvbnRleHQgewpAQCAtNTksNiArNjYsOCBAQAogICAgIGNoYXIgKnN0cmVhbV9zcGVjczsgLyoqPCB1c2VyLXByb3ZpZGVkIGxpc3Qgb2Ygc3RyZWFtcywgc2VwYXJhdGVkIGJ5ICsgKi8KICAgICBpbnQgc3RyZWFtX2luZGV4OyAvKio8IGZvciBjb21wYXRpYmlsaXR5ICovCiAgICAgaW50IGxvb3BfY291bnQ7CisgICAgaW50NjRfdCBkaXNjb250aW51aXR5X3RocmVzaG9sZDsKKyAgICBpbnQ2NF90IHRzX29mZnNldDsKIAogICAgIEFWRm9ybWF0Q29udGV4dCAqZm9ybWF0X2N0eDsKICAgICBpbnQgZW9mOwpAQCAtODMsNiArOTIsNyBAQAogICAgIHsgInN0cmVhbXMiLCAgICAgICJzZXQgc3RyZWFtcyIsICAgICAgICAgICAgIE9GRlNFVChzdHJlYW1fc3BlY3MpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIDB9LCAgQ0hBUl9NQVgsIENIQVJfTUFYLCBGTEFHUyB9LAogICAgIHsgInMiLCAgICAgICAgICAgICJzZXQgc3RyZWFtcyIsICAgICAgICAgICAgIE9GRlNFVChzdHJlYW1fc3BlY3MpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIDB9LCAgQ0hBUl9NQVgsIENIQVJfTUFYLCBGTEFHUyB9LAogICAgIHsgImxvb3AiLCAgICAgICAgICJzZXQgbG9vcCBjb3VudCIsICAgICAgICAgIE9GRlNFVChsb29wX2NvdW50KSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gIDF9LCAgMCwgICAgICAgIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAiZGlzY29udGludWl0eSIsICJzZXQgZGlzY29udGludWl0eSB0aHJlc2hvbGQiLCBPRkZTRVQoZGlzY29udGludWl0eV90aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAwfSwgMCwgSU5UNjRfTUFYLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9LAogfTsKIApAQCAtMTMzLDExICsxNDMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlkIG5vdCBtYXRjaCBhbnkgc3RyZWFtIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoZm91bmQtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyAmJgotICAgICAgICBmb3VuZC0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgaWYgKGZvdW5kLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgZm91bmQtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfRVJST1IsICJTdHJlYW0gc3BlY2lmaWVyIFwiJXNcIiBtYXRjaGVkIGEgJXMgc3RyZWFtLCIKICAgICAgICAgICAgICAgICJjdXJyZW50bHkgdW5zdXBwb3J0ZWQgYnkgbGliYXZmaWx0ZXJcbiIsIHNwZWMsCi0gICAgICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoZm91bmQtPmNvZGVjLT5jb2RlY190eXBlKSk7CisgICAgICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoZm91bmQtPmNvZGVjcGFyLT5jb2RlY190eXBlKSk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICByZXR1cm4gZm91bmQ7CkBAIC0xNDgsMTUgKzE1OCwyMyBAQAogICAgIEFWQ29kZWMgKmNvZGVjOwogICAgIGludCByZXQ7CiAKLSAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKHN0LT5zdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKHN0LT5zdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKICAgICBpZiAoIWNvZGVjKSB7CiAgICAgICAgIGF2X2xvZyhsb2csIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBmaW5kIGFueSBjb2RlY1xuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgc3QtPnN0LT5jb2RlYy0+cmVmY291bnRlZF9mcmFtZXMgPSAxOworICAgIHN0LT5jb2RlY19jdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGNvZGVjKTsKKyAgICBpZiAoIXN0LT5jb2RlY19jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBpZiAoKHJldCA9IGF2Y29kZWNfb3BlbjIoc3QtPnN0LT5jb2RlYywgY29kZWMsIE5VTEwpKSA8IDApIHsKKyAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChzdC0+Y29kZWNfY3R4LCBzdC0+c3QtPmNvZGVjcGFyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHN0LT5jb2RlY19jdHgtPnJlZmNvdW50ZWRfZnJhbWVzID0gMTsKKworICAgIGlmICgocmV0ID0gYXZjb2RlY19vcGVuMihzdC0+Y29kZWNfY3R4LCBjb2RlYywgTlVMTCkpIDwgMCkgewogICAgICAgICBhdl9sb2cobG9nLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBjb2RlY1xuIik7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTY2LDI0ICsxODQsMjQgQEAKIAogc3RhdGljIGludCBndWVzc19jaGFubmVsX2xheW91dChNb3ZpZVN0cmVhbSAqc3QsIGludCBzdF9pbmRleCwgdm9pZCAqbG9nX2N0eCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqZGVjX2N0eCA9IHN0LT5zdC0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmRlY19wYXIgPSBzdC0+c3QtPmNvZGVjcGFyOwogICAgIGNoYXIgYnVmWzI1Nl07Ci0gICAgaW50NjRfdCBjaGwgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChkZWNfY3R4LT5jaGFubmVscyk7CisgICAgaW50NjRfdCBjaGwgPSBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dChkZWNfcGFyLT5jaGFubmVscyk7CiAKICAgICBpZiAoIWNobCkgewogICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIkNoYW5uZWwgbGF5b3V0IGlzIG5vdCBzZXQgaW4gc3RyZWFtICVkLCBhbmQgY291bGQgbm90ICIKICAgICAgICAgICAgICAgICJiZSBndWVzc2VkIGZyb20gdGhlIG51bWJlciBvZiBjaGFubmVscyAoJWQpXG4iLAotICAgICAgICAgICAgICAgc3RfaW5kZXgsIGRlY19jdHgtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgIHN0X2luZGV4LCBkZWNfcGFyLT5jaGFubmVscyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCBkZWNfY3R4LT5jaGFubmVscywgY2hsKTsKKyAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGRlY19wYXItPmNoYW5uZWxzLCBjaGwpOwogICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgIkNoYW5uZWwgbGF5b3V0IGlzIG5vdCBzZXQgaW4gb3V0cHV0IHN0cmVhbSAlZCwgIgogICAgICAgICAgICAiZ3Vlc3NlZCBjaGFubmVsIGxheW91dCBpcyAnJXMnXG4iLAogICAgICAgICAgICBzdF9pbmRleCwgYnVmKTsKLSAgICBkZWNfY3R4LT5jaGFubmVsX2xheW91dCA9IGNobDsKKyAgICBkZWNfcGFyLT5jaGFubmVsX2xheW91dCA9IGNobDsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjIxLDggKzIzOSw2IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIC8vIFRyeSB0byBmaW5kIHRoZSBtb3ZpZSBmb3JtYXQgKGNvbnRhaW5lcikKICAgICBpZm9ybWF0ID0gbW92aWUtPmZvcm1hdF9uYW1lID8gYXZfZmluZF9pbnB1dF9mb3JtYXQobW92aWUtPmZvcm1hdF9uYW1lKSA6IE5VTEw7CiAKQEAgLTI0MCw3ICsyNTYsNyBAQAogICAgICAgICB0aW1lc3RhbXAgPSBtb3ZpZS0+c2Vla19wb2ludDsKICAgICAgICAgLy8gYWRkIHRoZSBzdHJlYW0gc3RhcnQgdGltZSwgc2hvdWxkIGl0IGV4aXN0CiAgICAgICAgIGlmIChtb3ZpZS0+Zm9ybWF0X2N0eC0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICAgICAgaWYgKHRpbWVzdGFtcCA+IElOVDY0X01BWCAtIG1vdmllLT5mb3JtYXRfY3R4LT5zdGFydF90aW1lKSB7CisgICAgICAgICAgICBpZiAodGltZXN0YW1wID4gMCAmJiBtb3ZpZS0+Zm9ybWF0X2N0eC0+c3RhcnRfdGltZSA+IElOVDY0X01BWCAtIHRpbWVzdGFtcCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBzZWVrIHZhbHVlIG92ZXJmbG93IHdpdGggc3RhcnRfdGltZTolIlBSSWQ2NCIgc2Vla19wb2ludDolIlBSSWQ2NCJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIG1vdmllLT5maWxlX25hbWUsIG1vdmllLT5mb3JtYXRfY3R4LT5zdGFydF90aW1lLCBtb3ZpZS0+c2Vla19wb2ludCk7CkBAIC0yNzMsNiArMjg5LDggQEAKICAgICAgICAgc3QtPmRpc2NhcmQgPSBBVkRJU0NBUkRfREVGQVVMVDsKICAgICAgICAgbW92aWUtPnN0W2ldLnN0ID0gc3Q7CiAgICAgICAgIG1vdmllLT5tYXhfc3RyZWFtX2luZGV4ID0gRkZNQVgobW92aWUtPm1heF9zdHJlYW1faW5kZXgsIHN0LT5pbmRleCk7CisgICAgICAgIG1vdmllLT5zdFtpXS5kaXNjb250aW51aXR5X3RocmVzaG9sZCA9CisgICAgICAgICAgICBhdl9yZXNjYWxlX3EobW92aWUtPmRpc2NvbnRpbnVpdHlfdGhyZXNob2xkLCBBVl9USU1FX0JBU0VfUSwgc3QtPnRpbWVfYmFzZSk7CiAgICAgfQogICAgIGlmIChhdl9zdHJ0b2soTlVMTCwgIisiLCAmY3Vyc29yKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOwpAQCAtMjg3LDIyICszMDUsMjUgQEAKICAgICAgICAgQVZGaWx0ZXJQYWQgcGFkID0geyAwIH07CiAgICAgICAgIG1vdmllLT5vdXRfaW5kZXhbbW92aWUtPnN0W2ldLnN0LT5pbmRleF0gPSBpOwogICAgICAgICBzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJvdXQlZCIsIGkpOwotICAgICAgICBwYWQudHlwZSAgICAgICAgICA9IG1vdmllLT5zdFtpXS5zdC0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgICAgIHBhZC50eXBlICAgICAgICAgID0gbW92aWUtPnN0W2ldLnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZTsKICAgICAgICAgcGFkLm5hbWUgICAgICAgICAgPSBhdl9zdHJkdXAobmFtZSk7CiAgICAgICAgIGlmICghcGFkLm5hbWUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBwYWQuY29uZmlnX3Byb3BzICA9IG1vdmllX2NvbmZpZ19vdXRwdXRfcHJvcHM7CiAgICAgICAgIHBhZC5yZXF1ZXN0X2ZyYW1lID0gbW92aWVfcmVxdWVzdF9mcmFtZTsKLSAgICAgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIGksICZwYWQpOwotICAgICAgICByZXQgPSBvcGVuX3N0cmVhbShjdHgsICZtb3ZpZS0+c3RbaV0pOwotICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgaWYgKChyZXQgPSBmZl9pbnNlcnRfb3V0cGFkKGN0eCwgaSwgJnBhZCkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnBhZC5uYW1lKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmICggbW92aWUtPnN0W2ldLnN0LT5jb2RlYy0+Y29kZWMtPnR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCi0gICAgICAgICAgICAhbW92aWUtPnN0W2ldLnN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG1vdmllLT5zdFtpXS5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICAhbW92aWUtPnN0W2ldLnN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQpIHsKICAgICAgICAgICAgIHJldCA9IGd1ZXNzX2NoYW5uZWxfbGF5b3V0KCZtb3ZpZS0+c3RbaV0sIGksIGN0eCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CisgICAgICAgIHJldCA9IG9wZW5fc3RyZWFtKGN0eCwgJm1vdmllLT5zdFtpXSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInNlZWtfcG9pbnQ6JSJQUklpNjQiIGZvcm1hdF9uYW1lOiVzIGZpbGVfbmFtZTolcyBzdHJlYW1faW5kZXg6JWRcbiIsCkBAIC0zMjAsNyArMzQxLDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9vdXRwdXRzOyBpKyspIHsKICAgICAgICAgYXZfZnJlZXAoJmN0eC0+b3V0cHV0X3BhZHNbaV0ubmFtZSk7CiAgICAgICAgIGlmIChtb3ZpZS0+c3RbaV0uc3QpCi0gICAgICAgICAgICBhdmNvZGVjX2Nsb3NlKG1vdmllLT5zdFtpXS5zdC0+Y29kZWMpOworICAgICAgICAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJm1vdmllLT5zdFtpXS5jb2RlY19jdHgpOwogICAgIH0KICAgICBhdl9mcmVlcCgmbW92aWUtPnN0KTsKICAgICBhdl9mcmVlcCgmbW92aWUtPm91dF9pbmRleCk7CkBAIC0zMzcsMTcgKzM1OCwxNyBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKSB7CiAgICAgICAgIE1vdmllU3RyZWFtICpzdCA9ICZtb3ZpZS0+c3RbaV07Ci0gICAgICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPnN0LT5jb2RlYzsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmMgPSBzdC0+c3QtPmNvZGVjcGFyOwogICAgICAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbaV07CiAKICAgICAgICAgc3dpdGNoIChjLT5jb2RlY190eXBlKSB7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgbGlzdFswXSA9IGMtPnBpeF9mbXQ7CisgICAgICAgICAgICBsaXN0WzBdID0gYy0+Zm9ybWF0OwogICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KGxpc3QpLCAmb3V0bGluay0+aW5fZm9ybWF0cykpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgbGlzdFswXSA9IGMtPnNhbXBsZV9mbXQ7CisgICAgICAgICAgICBsaXN0WzBdID0gYy0+Zm9ybWF0OwogICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KGxpc3QpLCAmb3V0bGluay0+aW5fZm9ybWF0cykpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgbGlzdFswXSA9IGMtPnNhbXBsZV9yYXRlOwpAQCAtMzcwLDcgKzM5MSw3IEBACiAgICAgTW92aWVDb250ZXh0ICptb3ZpZSAgPSBjdHgtPnByaXY7CiAgICAgdW5zaWduZWQgb3V0X2lkID0gRkZfT1VUTElOS19JRFgob3V0bGluayk7CiAgICAgTW92aWVTdHJlYW0gKnN0ID0gJm1vdmllLT5zdFtvdXRfaWRdOwotICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPnN0LT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqYyA9IHN0LT5zdC0+Y29kZWNwYXI7CiAKICAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBzdC0+c3QtPnRpbWVfYmFzZTsKIApAQCAtNDI5LDcgKzQ1MCw3IEBACiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGF2Y29kZWNfZmx1c2hfYnVmZmVycyhtb3ZpZS0+c3RbaV0uc3QtPmNvZGVjKTsKKyAgICAgICAgYXZjb2RlY19mbHVzaF9idWZmZXJzKG1vdmllLT5zdFtpXS5jb2RlY19jdHgpOwogICAgICAgICBtb3ZpZS0+c3RbaV0uZG9uZSA9IDA7CiAgICAgfQogICAgIG1vdmllLT5lb2YgPSAwOwpAQCAtNTAyLDEzICs1MjMsMTMgQEAKICAgICBpZiAoIWZyYW1lKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgZnJhbWVfdHlwZSA9IHN0LT5zdC0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgZnJhbWVfdHlwZSA9IHN0LT5zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGU7CiAgICAgc3dpdGNoIChmcmFtZV90eXBlKSB7CiAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgIHJldCA9IGF2Y29kZWNfZGVjb2RlX3ZpZGVvMihzdC0+c3QtPmNvZGVjLCBmcmFtZSwgJmdvdF9mcmFtZSwgcGt0KTsKKyAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfdmlkZW8yKHN0LT5jb2RlY19jdHgsIGZyYW1lLCAmZ290X2ZyYW1lLCBwa3QpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfYXVkaW80KHN0LT5zdC0+Y29kZWMsIGZyYW1lLCAmZ290X2ZyYW1lLCBwa3QpOworICAgICAgICByZXQgPSBhdmNvZGVjX2RlY29kZV9hdWRpbzQoc3QtPmNvZGVjX2N0eCwgZnJhbWUsICZnb3RfZnJhbWUsIHBrdCk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PU1lTKTsKQEAgLTUyMiw3ICs1NDMsNyBAQAogICAgICAgICBtb3ZpZS0+cGt0LmRhdGEgPSBOVUxMOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgaWYgKCFyZXQgfHwgc3QtPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgaWYgKCFyZXQgfHwgc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgIHJldCA9IHBrdC0+c2l6ZTsKIAogICAgIHBrdC0+ZGF0YSArPSByZXQ7CkBAIC01MzksMTEgKzU2MCwyNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICBmcmFtZS0+cHRzID0gYXZfZnJhbWVfZ2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChmcmFtZSk7CisgICAgZnJhbWUtPnB0cyA9IGZyYW1lLT5iZXN0X2VmZm9ydF90aW1lc3RhbXA7CisgICAgaWYgKGZyYW1lLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaWYgKG1vdmllLT50c19vZmZzZXQpCisgICAgICAgICAgICBmcmFtZS0+cHRzICs9IGF2X3Jlc2NhbGVfcV9ybmQobW92aWUtPnRzX29mZnNldCwgQVZfVElNRV9CQVNFX1EsIG91dGxpbmstPnRpbWVfYmFzZSwgQVZfUk9VTkRfVVApOworICAgICAgICBpZiAoc3QtPmRpc2NvbnRpbnVpdHlfdGhyZXNob2xkKSB7CisgICAgICAgICAgICBpZiAoc3QtPmxhc3RfcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBkaWZmID0gZnJhbWUtPnB0cyAtIHN0LT5sYXN0X3B0czsKKyAgICAgICAgICAgICAgICBpZiAoZGlmZiA8IDAgfHwgZGlmZiA+IHN0LT5kaXNjb250aW51aXR5X3RocmVzaG9sZCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkRpc2NvbnRpbnVpdHkgaW4gc3RyZWFtOiVkIGRpZmY6JSJQUklkNjQiXG4iLCBwa3Rfb3V0X2lkLCBkaWZmKTsKKyAgICAgICAgICAgICAgICAgICAgbW92aWUtPnRzX29mZnNldCArPSBhdl9yZXNjYWxlX3Ffcm5kKC1kaWZmLCBvdXRsaW5rLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RLCBBVl9ST1VORF9VUCk7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5wdHMgLT0gZGlmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3QtPmxhc3RfcHRzID0gZnJhbWUtPnB0czsKKyAgICB9CiAgICAgZmZfZGxvZyhjdHgsICJtb3ZpZV9wdXNoX2ZyYW1lKCk6IGZpbGU6JyVzJyAlc1xuIiwgbW92aWUtPmZpbGVfbmFtZSwKICAgICAgICAgICAgIGRlc2NyaWJlX2ZyYW1lX3RvX3N0cigoY2hhclsxMDI0XSl7MH0sIDEwMjQsIGZyYW1lLCBmcmFtZV90eXBlLCBvdXRsaW5rKSk7CiAKLSAgICBpZiAoc3QtPnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICBpZiAoc3QtPnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgaWYgKGZyYW1lLT5mb3JtYXQgIT0gb3V0bGluay0+Zm9ybWF0KSB7CiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGb3JtYXQgY2hhbmdlZCAlcyAtPiAlcywgZGlzY2FyZGluZyBmcmFtZVxuIiwKICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dGxpbmstPmZvcm1hdCksCkBAIC01NzMsNiArNjA5LDQ5IEBACiAgICAgfQogfQogCitzdGF0aWMgaW50IHByb2Nlc3NfY29tbWFuZChBVkZpbHRlckNvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICphcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcmVzLCBpbnQgcmVzX2xlbiwgaW50IGZsYWdzKQoreworICAgIE1vdmllQ29udGV4dCAqbW92aWUgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCA9IEFWRVJST1IoRU5PU1lTKTsKKworICAgIGlmICghc3RyY21wKGNtZCwgInNlZWsiKSkgeworICAgICAgICBpbnQgaWR4LCBmbGFncywgaTsKKyAgICAgICAgaW50NjRfdCB0czsKKyAgICAgICAgY2hhciB0YWlsWzJdOworCisgICAgICAgIGlmIChzc2NhbmYoYXJncywgIiVpfCUiU0NOaTY0InwlaSAlMXMiLCAmaWR4LCAmdHMsICZmbGFncywgdGFpbCkgIT0gMykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgcmV0ID0gYXZfc2Vla19mcmFtZShtb3ZpZS0+Zm9ybWF0X2N0eCwgaWR4LCB0cywgZmxhZ3MpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfb3V0cHV0czsgaSsrKSB7CisgICAgICAgICAgICBhdmNvZGVjX2ZsdXNoX2J1ZmZlcnMobW92aWUtPnN0W2ldLmNvZGVjX2N0eCk7CisgICAgICAgICAgICBtb3ZpZS0+c3RbaV0uZG9uZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiZ2V0X2R1cmF0aW9uIikpIHsKKyAgICAgICAgaW50IHByaW50X2xlbjsKKyAgICAgICAgY2hhciB0YWlsWzJdOworCisgICAgICAgIGlmICghcmVzIHx8IHJlc19sZW4gPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAgICAgaWYgKGFyZ3MgJiYgc3NjYW5mKGFyZ3MsICIlMXMiLCB0YWlsKSA9PSAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICBwcmludF9sZW4gPSBzbnByaW50ZihyZXMsIHJlc19sZW4sICIlIlBSSWQ2NCwgbW92aWUtPmZvcm1hdF9jdHgtPmR1cmF0aW9uKTsKKyAgICAgICAgaWYgKHByaW50X2xlbiA8IDAgfHwgcHJpbnRfbGVuID49IHJlc19sZW4pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKICNpZiBDT05GSUdfTU9WSUVfRklMVEVSCiAKIEFWRklMVEVSX0RFRklORV9DTEFTUyhtb3ZpZSk7CkBAIC01ODksNiArNjY4LDcgQEAKICAgICAuaW5wdXRzICAgID0gTlVMTCwKICAgICAub3V0cHV0cyAgID0gTlVMTCwKICAgICAuZmxhZ3MgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCisgICAgLnByb2Nlc3NfY29tbWFuZCA9IHByb2Nlc3NfY29tbWFuZAogfTsKIAogI2VuZGlmICAvKiBDT05GSUdfTU9WSUVfRklMVEVSICovCkBAIC02MTAsNiArNjkwLDcgQEAKICAgICAub3V0cHV0cyAgICA9IE5VTEwsCiAgICAgLnByaXZfY2xhc3MgPSAmYW1vdmllX2NsYXNzLAogICAgIC5mbGFncyAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX09VVFBVVFMsCisgICAgLnByb2Nlc3NfY29tbWFuZCA9IHByb2Nlc3NfY29tbWFuZCwKIH07CiAKICNlbmRpZiAvKiBDT05GSUdfQU1PVklFX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdGVzdHMvZHJhd3V0aWxzLmMgYi9saWJhdmZpbHRlci90ZXN0cy9kcmF3dXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmU1M2RkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdGVzdHMvZHJhd3V0aWxzLmMKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvZHJhd3V0aWxzLmgiCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIEZGRHJhd0NvbnRleHQgZHJhdzsKKyAgICBGRkRyYXdDb2xvciBjb2xvcjsKKyAgICBpbnQgciwgaTsKKworICAgIGZvciAoZiA9IDA7IGF2X3BpeF9mbXRfZGVzY19nZXQoZik7IGYrKykgeworICAgICAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmKTsKKyAgICAgICAgaWYgKCFkZXNjLT5uYW1lKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHByaW50ZigiVGVzdGluZyAlcy4uLiUqcyIsIGRlc2MtPm5hbWUsCisgICAgICAgICAgICAgICAoaW50KSgxNiAtIHN0cmxlbihkZXNjLT5uYW1lKSksICIiKTsKKyAgICAgICAgciA9IGZmX2RyYXdfaW5pdCgmZHJhdywgZiwgMCk7CisgICAgICAgIGlmIChyIDwgMCkgeworICAgICAgICAgICAgY2hhciBidWZbMTI4XTsKKyAgICAgICAgICAgIGF2X3N0cmVycm9yKHIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgcHJpbnRmKCJubzogJXNcbiIsIGJ1Zik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmZl9kcmF3X2NvbG9yKCZkcmF3LCAmY29sb3IsICh1aW50OF90W10pIHsgMSwgMCwgMCwgMSB9KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihjb2xvcik7IGkrKykKKyAgICAgICAgICAgIGlmICgoKHVpbnQ4X3QgKikmY29sb3IpW2ldICE9IDEyOCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGkgPT0gc2l6ZW9mKGNvbG9yKSkgeworICAgICAgICAgICAgcHJpbnRmKCJmYWxsYmFjayBjb2xvclxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIm9rXG4iKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci90ZXN0cy9maWx0Zm10cy5jIGIvbGliYXZmaWx0ZXIvdGVzdHMvZmlsdGZtdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTU4NjIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdGVzdHMvZmlsdGZtdHMuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBTdGVmYW5vIFNhYmF0aW5pCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NhbXBsZWZtdC5oIgorCisjZGVmaW5lIEZGX0lOVEVSTkFMX0ZJRUxEUyAxCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvZnJhbWVxdWV1ZS5oIgorCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9mb3JtYXRzLmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvaW50ZXJuYWwuaCIKKworc3RhdGljIHZvaWQgcHJpbnRfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmZpbHRlcl9jdHgpCit7CisgICAgaW50IGksIGo7CisKKyNkZWZpbmUgUFJJTlRfRk1UUyhpbm91dCwgb3V0aW4sIElOT1VUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgZmlsdGVyX2N0eC0+bmJfIyNpbm91dCMjcHV0czsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZmlsdGVyX2N0eC0+aW5vdXQjI3B1dHNbaV0tPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7ICAgXAorICAgICAgICAgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZpbHRlcl9jdHgtPmlub3V0IyNwdXRzW2ldLT5vdXRpbiMjX2Zvcm1hdHM7ICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZtdHMtPm5iX2Zvcm1hdHM7IGorKykgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZihhdl9nZXRfcGl4X2ZtdF9uYW1lKGZtdHMtPmZvcm1hdHNbal0pKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwcmludGYoI0lOT1VUICJQVVRbJWRdICVzOiBmbXQ6JXNcbiIsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKGZpbHRlcl9jdHgtPmlub3V0IyNwdXRfcGFkcywgaSksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGZtdHMtPmZvcm1hdHNbal0pKTsgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKGZpbHRlcl9jdHgtPmlub3V0IyNwdXRzW2ldLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeyBcCisgICAgICAgICAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBVkZpbHRlckNoYW5uZWxMYXlvdXRzICpsYXlvdXRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmbXRzID0gZmlsdGVyX2N0eC0+aW5vdXQjI3B1dHNbaV0tPm91dGluIyNfZm9ybWF0czsgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZm10cy0+bmJfZm9ybWF0czsgaisrKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHByaW50ZigjSU5PVVQgIlBVVFslZF0gJXM6IGZtdDolc1xuIiwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBpLCBhdmZpbHRlcl9wYWRfZ2V0X25hbWUoZmlsdGVyX2N0eC0+aW5vdXQjI3B1dF9wYWRzLCBpKSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9zYW1wbGVfZm10X25hbWUoZm10cy0+Zm9ybWF0c1tqXSkpOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsYXlvdXRzID0gZmlsdGVyX2N0eC0+aW5vdXQjI3B1dHNbaV0tPm91dGluIyNfY2hhbm5lbF9sYXlvdXRzOyBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGF5b3V0cy0+bmJfY2hhbm5lbF9sYXlvdXRzOyBqKyspIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY2hhciBidWZbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAtMSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRzLT5jaGFubmVsX2xheW91dHNbal0pOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwcmludGYoI0lOT1VUICJQVVRbJWRdICVzOiBjaGxheW91dDolc1xuIiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgYXZmaWx0ZXJfcGFkX2dldF9uYW1lKGZpbHRlcl9jdHgtPmlub3V0IyNwdXRfcGFkcywgaSksIGJ1Zik7IFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworICAgIFBSSU5UX0ZNVFMoaW4sICBvdXQsIElOKTsKKyAgICBQUklOVF9GTVRTKG91dCwgaW4sICBPVVQpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgY29uc3QgQVZGaWx0ZXIgKmZpbHRlcjsKKyAgICBBVkZpbHRlckNvbnRleHQgKmZpbHRlcl9jdHg7CisgICAgQVZGaWx0ZXJHcmFwaCAqZ3JhcGhfY3R4OworICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9uYW1lOworICAgIGNvbnN0IGNoYXIgKmZpbHRlcl9hcmdzID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKKworICAgIGlmIChhcmdjIDwgMikgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1pc3NpbmcgZmlsdGVyIG5hbWUgYXMgYXJndW1lbnRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBmaWx0ZXJfbmFtZSA9IGFyZ3ZbMV07CisgICAgaWYgKGFyZ2MgPiAyKQorICAgICAgICBmaWx0ZXJfYXJncyA9IGFyZ3ZbMl07CisKKyAgICAvKiBhbGxvY2F0ZSBncmFwaCAqLworICAgIGdyYXBoX2N0eCA9IGF2ZmlsdGVyX2dyYXBoX2FsbG9jKCk7CisgICAgaWYgKCFncmFwaF9jdHgpCisgICAgICAgIHJldHVybiAxOworCisgICAgLyogZ2V0IGEgY29ycmVzcG9uZGluZyBmaWx0ZXIgYW5kIG9wZW4gaXQgKi8KKyAgICBpZiAoIShmaWx0ZXIgPSBhdmZpbHRlcl9nZXRfYnlfbmFtZShmaWx0ZXJfbmFtZSkpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIGZpbHRlciB3aXRoIG5hbWUgJyVzJ1xuIiwgZmlsdGVyX25hbWUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvKiBvcGVuIGZpbHRlciBhbmQgYWRkIGl0IHRvIHRoZSBncmFwaCAqLworICAgIGlmICghKGZpbHRlcl9jdHggPSBhdmZpbHRlcl9ncmFwaF9hbGxvY19maWx0ZXIoZ3JhcGhfY3R4LCBmaWx0ZXIsIGZpbHRlcl9uYW1lKSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbXBvc3NpYmxlIHRvIG9wZW4gZmlsdGVyIHdpdGggbmFtZSAnJXMnXG4iLAorICAgICAgICAgICAgICAgIGZpbHRlcl9uYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChhdmZpbHRlcl9pbml0X3N0cihmaWx0ZXJfY3R4LCBmaWx0ZXJfYXJncykgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW1wb3NzaWJsZSB0byBpbml0IGZpbHRlciAnJXMnIHdpdGggYXJndW1lbnRzICclcydcbiIsCisgICAgICAgICAgICAgICAgZmlsdGVyX25hbWUsIGZpbHRlcl9hcmdzKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLyogY3JlYXRlIGEgbGluayBmb3IgZWFjaCBvZiB0aGUgaW5wdXQgcGFkcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBmaWx0ZXJfY3R4LT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBBVkZpbHRlckxpbmsgKmxpbmsgPSBhdl9tYWxsb2N6KHNpemVvZihBVkZpbHRlckxpbmspKTsKKyAgICAgICAgaWYgKCFsaW5rKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZpbHRlciBpbnB1dCBsaW5rXG4iKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgbGluay0+dHlwZSA9IGF2ZmlsdGVyX3BhZF9nZXRfdHlwZShmaWx0ZXJfY3R4LT5pbnB1dF9wYWRzLCBpKTsKKyAgICAgICAgZmlsdGVyX2N0eC0+aW5wdXRzW2ldID0gbGluazsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGZpbHRlcl9jdHgtPm5iX291dHB1dHM7IGkrKykgeworICAgICAgICBBVkZpbHRlckxpbmsgKmxpbmsgPSBhdl9tYWxsb2N6KHNpemVvZihBVkZpbHRlckxpbmspKTsKKyAgICAgICAgaWYgKCFsaW5rKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZpbHRlciBvdXRwdXQgbGlua1xuIik7CisgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGxpbmstPnR5cGUgPSBhdmZpbHRlcl9wYWRfZ2V0X3R5cGUoZmlsdGVyX2N0eC0+b3V0cHV0X3BhZHMsIGkpOworICAgICAgICBmaWx0ZXJfY3R4LT5vdXRwdXRzW2ldID0gbGluazsKKyAgICB9CisKKyAgICBpZiAoZmlsdGVyLT5xdWVyeV9mb3JtYXRzKQorICAgICAgICBmaWx0ZXItPnF1ZXJ5X2Zvcm1hdHMoZmlsdGVyX2N0eCk7CisgICAgZWxzZQorICAgICAgICBmZl9kZWZhdWx0X3F1ZXJ5X2Zvcm1hdHMoZmlsdGVyX2N0eCk7CisKKyAgICBwcmludF9mb3JtYXRzKGZpbHRlcl9jdHgpOworCitmYWlsOgorICAgIGF2ZmlsdGVyX2ZyZWUoZmlsdGVyX2N0eCk7CisgICAgYXZmaWx0ZXJfZ3JhcGhfZnJlZSgmZ3JhcGhfY3R4KTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdGVzdHMvZm9ybWF0cy5jIGIvbGliYXZmaWx0ZXIvdGVzdHMvZm9ybWF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NTA3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci90ZXN0cy9mb3JtYXRzLmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCb2JieSBCaW5naGFtCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9mb3JtYXRzLmMiCisKKyN1bmRlZiBwcmludGYKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBjb25zdCBpbnQ2NF90ICpjbDsKKyAgICBjaGFyIGJ1Zls1MTJdOworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKnRlc3RzdHJpbmdzW10gPXsKKyAgICAgICAgImJsYWgiLAorICAgICAgICAiMSIsCisgICAgICAgICIyIiwKKyAgICAgICAgIi0xIiwKKyAgICAgICAgIjYwIiwKKyAgICAgICAgIjY1IiwKKyAgICAgICAgIjFjIiwKKyAgICAgICAgIjJjIiwKKyAgICAgICAgIi0xYyIsCisgICAgICAgICI2MGMiLAorICAgICAgICAiNjVjIiwKKyAgICAgICAgIjJDIiwKKyAgICAgICAgIjYwQyIsCisgICAgICAgICI2NUMiLAorICAgICAgICAiNS4xIiwKKyAgICAgICAgInN0ZXJlbyIsCisgICAgICAgICIxKzErMSsxIiwKKyAgICAgICAgIjFjKzFjKzFjKzFjIiwKKyAgICAgICAgIjJjKzFjIiwKKyAgICAgICAgIjB4MyIsCisgICAgfTsKKworICAgIGZvciAoY2wgPSBhdmZpbHRlcl9hbGxfY2hhbm5lbF9sYXlvdXRzOyAqY2wgIT0gLTE7IGNsKyspIHsKKyAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhidWYsIHNpemVvZihidWYpLCAtMSwgKmNsKTsKKyAgICAgICAgcHJpbnRmKCIlc1xuIiwgYnVmKTsKKyAgICB9CisKKyAgICBmb3IgKCBpID0gMDsgaTxGRl9BUlJBWV9FTEVNUyh0ZXN0c3RyaW5ncyk7IGkrKykgeworICAgICAgICBpbnQ2NF90IGxheW91dCA9IC0xOworICAgICAgICBpbnQgY291bnQgPSAtMTsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgcmV0ID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoJmxheW91dCwgJmNvdW50LCB0ZXN0c3RyaW5nc1tpXSwgTlVMTCk7CisKKyAgICAgICAgcHJpbnRmICgiJWQgPSBmZl9wYXJzZV9jaGFubmVsX2xheW91dCglMDE2IlBSSVg2NCIsICUyZCwgJXMpO1xuIiwgcmV0ID8gLTEgOiAwLCBsYXlvdXQsIGNvdW50LCB0ZXN0c3RyaW5nc1tpXSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci90ZXN0cy9pbnRlZ3JhbC5jIGIvbGliYXZmaWx0ZXIvdGVzdHMvaW50ZWdyYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDlmZWZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdGVzdHMvaW50ZWdyYWwuYwpAQCAtMCwwICsxLDkwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmZpbHRlci92Zl9ubG1lYW5zLmMiCisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfaW50ZWdyYWwoY29uc3QgdWludDMyX3QgKmlpLCBpbnQgdywgaW50IGgsIGludCBsel8zMikKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgIHByaW50ZigiICU3eCIsIGlpW3kqbHpfMzIgKyB4XSk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS1cbiIpOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCByZXQgPSAwLCB4b2ZmLCB5b2ZmOworCisgICAgLy8gYXJiaXRyYXJ5IHRlc3Qgc291cmNlIG9mIHNpemUgNng0IGFuZCBsaW5lc2l6ZT04CisgICAgY29uc3QgaW50IHcgPSA2LCBoID0gNSwgbHogPSA4OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHNyY1tdID0geworICAgICAgICAweGIwLCAweDcxLCAweGZiLCAweGQ4LCAweDAxLCAweGQ5LCAvKioqLyAweDAxLCAweDAyLAorICAgICAgICAweDUxLCAweDhlLCAweDQxLCAweDBmLCAweDg0LCAweDU4LCAvKioqLyAweDAzLCAweDA0LAorICAgICAgICAweGM3LCAweDhkLCAweDA3LCAweDcwLCAweDVjLCAweDQ3LCAvKioqLyAweDA1LCAweDA2LAorICAgICAgICAweDA5LCAweDRlLCAweGZjLCAweDc0LCAweDhmLCAweDlhLCAvKioqLyAweDA3LCAweDA4LAorICAgICAgICAweDYwLCAweDhlLCAweDIwLCAweGFhLCAweDk1LCAweDdkLCAvKioqLyAweDA5LCAweDBhLAorICAgIH07CisKKyAgICBjb25zdCBpbnQgZSA9IDM7CisgICAgY29uc3QgaW50IGlpX3cgPSB3K2UqMiwgaWlfaCA9IGgrZSoyOworCisgICAgLy8gYWxpZ24gdG8gNCB0aGUgbGluZXNpemUsICIrMSIgaXMgZm9yIHRoZSBzcGFjZSBvZiB0aGUgbGVmdCAwLWNvbHVtbgorICAgIGNvbnN0IGludCBpaV9sel8zMiA9ICgoaWlfdyArIDEpICsgMykgJiB+MzsKKworICAgIC8vICIrMSIgaXMgZm9yIHRoZSBzcGFjZSBvZiB0aGUgdG9wIDAtbGluZQorICAgIHVpbnQzMl90ICppaSAgPSBhdl9tYWxsb2N6X2FycmF5KGlpX2ggKyAxLCBpaV9sel8zMiAqIHNpemVvZigqaWkpKTsKKyAgICB1aW50MzJfdCAqaWkyID0gYXZfbWFsbG9jel9hcnJheShpaV9oICsgMSwgaWlfbHpfMzIgKiBzaXplb2YoKmlpMikpOworCisgICAgdWludDMyX3QgKmlpX3N0YXJ0ICA9IGlpICArIGlpX2x6XzMyICsgMTsgLy8gc2tpcCB0b3AgMC1saW5lIGFuZCBsZWZ0IDAtY29sdW1uCisgICAgdWludDMyX3QgKmlpX3N0YXJ0MiA9IGlpMiArIGlpX2x6XzMyICsgMTsgLy8gc2tpcCB0b3AgMC1saW5lIGFuZCBsZWZ0IDAtY29sdW1uCisKKyAgICBpZiAoIWlpIHx8ICFpaTIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGZvciAoeW9mZiA9IC1lOyB5b2ZmIDw9IGU7IHlvZmYrKykgeworICAgICAgICBmb3IgKHhvZmYgPSAtZTsgeG9mZiA8PSBlOyB4b2ZmKyspIHsKKyAgICAgICAgICAgIHByaW50ZigieG9mZj0lZCB5b2ZmPSVkXG4iLCB4b2ZmLCB5b2ZmKTsKKworICAgICAgICAgICAgY29tcHV0ZV9zc2RfaW50ZWdyYWxfaW1hZ2UoaWlfc3RhcnQsIGlpX2x6XzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBseiwgeG9mZiwgeW9mZiwgZSwgdywgaCk7CisgICAgICAgICAgICBkaXNwbGF5X2ludGVncmFsKGlpX3N0YXJ0LCBpaV93LCBpaV9oLCBpaV9sel8zMik7CisKKyAgICAgICAgICAgIGNvbXB1dGVfdW5zYWZlX3NzZF9pbnRlZ3JhbF9pbWFnZShpaV9zdGFydDIsIGlpX2x6XzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBseiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4b2ZmLCB5b2ZmLCBlLCB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpX3csIGlpX2gpOworICAgICAgICAgICAgZGlzcGxheV9pbnRlZ3JhbChpaV9zdGFydDIsIGlpX3csIGlpX2gsIGlpX2x6XzMyKTsKKworICAgICAgICAgICAgaWYgKG1lbWNtcChpaSwgaWkyLCAoaWlfaCsxKSAqIGlpX2x6XzMyICogc2l6ZW9mKCppaSkpKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJJbnRlZ3JhbCBtaXNtYXRjaFxuIik7CisgICAgICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworZW5kOgorICAgIGF2X2ZyZWVwKCZpaSk7CisgICAgYXZfZnJlZXAoJmlpMik7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3RocmVhZC5oIGIvbGliYXZmaWx0ZXIvdGhyZWFkLmgKaW5kZXggNWYzNDdlOC4uYzcwOWYxNyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdGhyZWFkLmgKKysrIGIvbGliYXZmaWx0ZXIvdGhyZWFkLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCiAgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci90aHJlc2hvbGQuaCBiL2xpYmF2ZmlsdGVyL3RocmVzaG9sZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NWE5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci90aHJlc2hvbGQuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX1RIUkVTSE9MRF9ICisjZGVmaW5lIEFWRklMVEVSX1RIUkVTSE9MRF9ICisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZyYW1lc3luYy5oIgorCit0eXBlZGVmIHN0cnVjdCBUaHJlc2hvbGRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludCBkZXB0aDsKKyAgICBpbnQgcGxhbmVzOworICAgIGludCBicGM7CisKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCB3aWR0aFs0XSwgaGVpZ2h0WzRdOworCisgICAgdm9pZCAoKnRocmVzaG9sZCkoY29uc3QgdWludDhfdCAqaW4sIGNvbnN0IHVpbnQ4X3QgKnRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptaW4sIGNvbnN0IHVpbnQ4X3QgKm1heCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGlsaW5lc2l6ZSwgcHRyZGlmZl90IHRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZmxpbmVzaXplLCBwdHJkaWZmX3Qgc2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBvbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKTsKKworICAgIEFWRnJhbWUgKmZyYW1lc1s0XTsKKyAgICBGRkZyYW1lU3luYyBmczsKK30gVGhyZXNob2xkQ29udGV4dDsKKwordm9pZCBmZl90aHJlc2hvbGRfaW5pdChUaHJlc2hvbGRDb250ZXh0ICpzKTsKK3ZvaWQgZmZfdGhyZXNob2xkX2luaXRfeDg2KFRocmVzaG9sZENvbnRleHQgKnMpOworCisjZW5kaWYgLyogQVZGSUxURVJfVEhSRVNIT0xEX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3RpbnRlcmxhY2UuaCBiL2xpYmF2ZmlsdGVyL3RpbnRlcmxhY2UuaAppbmRleCAzYjcwM2U3Li5iNWMzOWFhIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci90aW50ZXJsYWNlLmgKKysrIGIvbGliYXZmaWx0ZXIvdGludGVybGFjZS5oCkBAIC0yNyw5ICsyNywxNiBAQAogI2lmbmRlZiBBVkZJTFRFUl9USU5URVJMQUNFX0gKICNkZWZpbmUgQVZGSUxURVJfVElOVEVSTEFDRV9ICiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJkcmF3dXRpbHMuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogCisjZGVmaW5lIFRJTlRFUkxBQ0VfRkxBR19WTFBGIDAxCisjZGVmaW5lIFRJTlRFUkxBQ0VfRkxBR19FWEFDVF9UQiAyCisjZGVmaW5lIFRJTlRFUkxBQ0VfRkxBR19DVkxQRiA0CisKIGVudW0gVEludGVybGFjZU1vZGUgewogICAgIE1PREVfTUVSR0UgPSAwLAogICAgIE1PREVfRFJPUF9FVkVOLApAQCAtNDIsNyArNDksNyBAQAogICAgIE1PREVfTkIsCiB9OwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBUSW50ZXJsYWNlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IG1vZGU7ICAgICAgICAgICAgICAgICAgIC8vLzwgVEludGVybGFjZU1vZGUsIGludGVybGFjZSBtb2RlIHNlbGVjdGVkCiAgICAgQVZSYXRpb25hbCBwcmVvdXRfdGltZV9iYXNlOwpAQCAtNTMsOCArNjAsMTEgQEAKICAgICBBVkZyYW1lICpuZXh0OwogICAgIHVpbnQ4X3QgKmJsYWNrX2RhdGFbNF07ICAgICAvLy88IGJ1ZmZlciB1c2VkIHRvIGZpbGwgcGFkZGVkIGxpbmVzCiAgICAgaW50IGJsYWNrX2xpbmVzaXplWzRdOworICAgIEZGRHJhd0NvbnRleHQgZHJhdzsKKyAgICBGRkRyYXdDb2xvciBjb2xvcjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmNzcDsKICAgICB2b2lkICgqbG93cGFzc19saW5lKSh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3Qgd2lkdGgsIGNvbnN0IHVpbnQ4X3QgKnNyY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSwgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1yZWYsIHB0cmRpZmZfdCBwcmVmLCBpbnQgY2xpcF9tYXgpOwogfSBUSW50ZXJsYWNlQ29udGV4dDsKIAogdm9pZCBmZl90aW50ZXJsYWNlX2luaXRfeDg2KFRJbnRlcmxhY2VDb250ZXh0ICppbnRlcmxhY2UpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdHJpbS5jIGIvbGliYXZmaWx0ZXIvdHJpbS5jCmluZGV4IDkxNDFhYzUuLjFkYmJhYmIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3RyaW0uYworKysgYi9saWJhdmZpbHRlci90cmltLmMKQEAgLTE2LDggKzE2LDYgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSA8ZmxvYXQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJjb25maWcuaCIKQEAgLTQzLDkgKzQxLDYgQEAKICAgICBpbnQ2NF90IGR1cmF0aW9uOwogICAgIGludDY0X3Qgc3RhcnRfdGltZSwgZW5kX3RpbWU7CiAgICAgaW50NjRfdCBzdGFydF9mcmFtZSwgZW5kX2ZyYW1lOwotCi0gICAgZG91YmxlIGR1cmF0aW9uX2RibDsKLSAgICBkb3VibGUgc3RhcnRfdGltZV9kYmwsIGVuZF90aW1lX2RibDsKICAgICAvKgogICAgICAqIGluIHRoZSBsaW5rIHRpbWViYXNlIGZvciB2aWRlbywKICAgICAgKiBpbiAxL3NhbXBsZXJhdGUgZm9yIGF1ZGlvCkBAIC05MSwxMyArODYsNiBAQAogICAgIEFWUmF0aW9uYWwgdGIgPSAoaW5saW5rLT50eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgPwogICAgICAgICAgICAgICAgICAgICAgaW5saW5rLT50aW1lX2Jhc2UgOiAoQVZSYXRpb25hbCl7IDEsIGlubGluay0+c2FtcGxlX3JhdGUgfTsKIAotICAgIGlmIChzLT5zdGFydF90aW1lX2RibCAhPSBEQkxfTUFYKQotICAgICAgICBzLT5zdGFydF90aW1lID0gcy0+c3RhcnRfdGltZV9kYmwgKiAxZTY7Ci0gICAgaWYgKHMtPmVuZF90aW1lX2RibCAhPSBEQkxfTUFYKQotICAgICAgICBzLT5lbmRfdGltZSA9IHMtPmVuZF90aW1lX2RibCAqIDFlNjsKLSAgICBpZiAocy0+ZHVyYXRpb25fZGJsICE9IDApCi0gICAgICAgIHMtPmR1cmF0aW9uID0gcy0+ZHVyYXRpb25fZGJsICogMWU2OwotCiAgICAgaWYgKHMtPnN0YXJ0X3RpbWUgIT0gSU5UNjRfTUFYKSB7CiAgICAgICAgIGludDY0X3Qgc3RhcnRfcHRzID0gYXZfcmVzY2FsZV9xKHMtPnN0YXJ0X3RpbWUsIEFWX1RJTUVfQkFTRV9RLCB0Yik7CiAgICAgICAgIGlmIChzLT5zdGFydF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgc3RhcnRfcHRzIDwgcy0+c3RhcnRfcHRzKQpAQCAtMTE2LDIzICsxMDQsMjEgQEAKIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVHJpbUNvbnRleHQsIHgpCiAjZGVmaW5lIENPTU1PTl9PUFRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgInN0YXJ0IiwgICAgICAgIlRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgZnJhbWUgdGhhdCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzaG91bGQgYmUgcGFzc2VkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0YXJ0X3RpbWUpLCAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsgLmk2NCA9IElOVDY0X01BWCB9LCAgICBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1MgfSwgXAogICAgIHsgInN0YXJ0aSIsICAgICAgIlRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgZnJhbWUgdGhhdCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICJzaG91bGQgYmUgcGFzc2VkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0YXJ0X3RpbWUpLCAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsgLmk2NCA9IElOVDY0X01BWCB9LCAgICBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1MgfSwgXAorICAgIHsgImVuZCIsICAgICAgICAgIlRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgZnJhbWUgdGhhdCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzaG91bGQgYmUgZHJvcHBlZCBhZ2FpbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGVuZF90aW1lKSwgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsgLmk2NCA9IElOVDY0X01BWCB9LCAgICBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1MgfSwgXAogICAgIHsgImVuZGkiLCAgICAgICAgIlRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgZnJhbWUgdGhhdCAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICJzaG91bGQgYmUgZHJvcHBlZCBhZ2FpbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGVuZF90aW1lKSwgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsgLmk2NCA9IElOVDY0X01BWCB9LCAgICBJTlQ2NF9NSU4sIElOVDY0X01BWCwgRkxBR1MgfSwgXAogICAgIHsgInN0YXJ0X3B0cyIsICAgIlRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgZnJhbWUgdGhhdCBzaG91bGQgYmUgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAiIHBhc3NlZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfcHRzKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsgLmk2NCA9IEFWX05PUFRTX1ZBTFVFIH0sIElOVDY0X01JTiwgSU5UNjRfTUFYLCBGTEFHUyB9LCBcCiAgICAgeyAiZW5kX3B0cyIsICAgICAiVGltZXN0YW1wIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0IHNob3VsZCBiZSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAiZHJvcHBlZCBhZ2FpbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChlbmRfcHRzKSwgICAgIEFWX09QVF9UWVBFX0lOVDY0LCAgeyAuaTY0ID0gQVZfTk9QVFNfVkFMVUUgfSwgSU5UNjRfTUlOLCBJTlQ2NF9NQVgsIEZMQUdTIH0sIFwKKyAgICB7ICJkdXJhdGlvbiIsICAgICJNYXhpbXVtIGR1cmF0aW9uIG9mIHRoZSBvdXRwdXQiLCAgICAgICAgICAgICAgICAgICBPRkZTRVQoZHVyYXRpb24pLCAgICBBVl9PUFRfVFlQRV9EVVJBVElPTiwgeyAuaTY0ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgMCwgSU5UNjRfTUFYLCBGTEFHUyB9LCBcCiAgICAgeyAiZHVyYXRpb25pIiwgICAiTWF4aW11bSBkdXJhdGlvbiBvZiB0aGUgb3V0cHV0IiwgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGR1cmF0aW9uKSwgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsgLmk2NCA9IDAgfSwgICAgICAgICAgICAgICAgICAgIDAsIElOVDY0X01BWCwgRkxBR1MgfSwKIAotI2RlZmluZSBDT01QQVRfT1BUUyBcCi0gICAgeyAic3RhcnQiLCAgICAgICAiVGltZXN0YW1wIGluIHNlY29uZHMgb2YgdGhlIGZpcnN0IGZyYW1lIHRoYXQgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAic2hvdWxkIGJlIHBhc3NlZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChzdGFydF90aW1lX2RibCksQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSBEQkxfTUFYIH0sICAgICAgIC1EQkxfTUFYLCBEQkxfTUFYLCAgICAgRkxBR1MgfSwgXAotICAgIHsgImVuZCIsICAgICAgICAgIlRpbWVzdGFtcCBpbiBzZWNvbmRzIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0ICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgInNob3VsZCBiZSBkcm9wcGVkIGFnYWluIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZW5kX3RpbWVfZGJsKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gREJMX01BWCB9LCAgICAgICAtREJMX01BWCwgREJMX01BWCwgICAgIEZMQUdTIH0sIFwKLSAgICB7ICJkdXJhdGlvbiIsICAgICJNYXhpbXVtIGR1cmF0aW9uIG9mIHRoZSBvdXRwdXQgaW4gc2Vjb25kcyIsICAgICAgICBPRkZTRVQoZHVyYXRpb25fZGJsKSwgIEFWX09QVF9UWVBFX0RPVUJMRSwgeyAuZGJsID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAwLCAgIERCTF9NQVgsIEZMQUdTIH0sCi0KIAogI2lmIENPTkZJR19UUklNX0ZJTFRFUgogc3RhdGljIGludCB0cmltX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCkBAIC0xOTcsNyArMTgzLDYgQEAKICAgICAgICAgInRvIHRoZSBvdXRwdXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3RhcnRfZnJhbWUpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsgLmk2NCA9IC0xIH0sICAgICAgIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCiAgICAgeyAiZW5kX2ZyYW1lIiwgICAiTnVtYmVyIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0IHNob3VsZCBiZSBkcm9wcGVkICIKICAgICAgICAgImFnYWluIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZW5kX2ZyYW1lKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsgLmk2NCA9IElOVDY0X01BWCB9LCAwLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCi0gICAgQ09NUEFUX09QVFMKICAgICB7IE5VTEwgfQogfTsKICN1bmRlZiBGTEFHUwpAQCAtMzUyLDcgKzMzNyw2IEBACiAgICAgICAgICJwYXNzZWQgdG8gdGhlIG91dHB1dCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHN0YXJ0X3NhbXBsZSksIEFWX09QVF9UWVBFX0lOVDY0LCAgeyAuaTY0ID0gLTEgfSwgICAgICAgLTEsIElOVDY0X01BWCwgRkxBR1MgfSwKICAgICB7ICJlbmRfc2FtcGxlIiwgICAiTnVtYmVyIG9mIHRoZSBmaXJzdCBhdWRpbyBzYW1wbGUgdGhhdCBzaG91bGQgYmUgIgogICAgICAgICAiZHJvcHBlZCBhZ2FpbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChlbmRfc2FtcGxlKSwgICBBVl9PUFRfVFlQRV9JTlQ2NCwgIHsgLmk2NCA9IElOVDY0X01BWCB9LCAwLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCi0gICAgQ09NUEFUX09QVFMKICAgICB7IE5VTEwgfQogfTsKICN1bmRlZiBGTEFHUwpAQCAtMzgxLDcgKzM2NSw2IEBACiAgICAgLm5hbWUgICAgICAgID0gImF0cmltIiwKICAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUGljayBvbmUgY29udGludW91cyBzZWN0aW9uIGZyb20gdGhlIGlucHV0LCBkcm9wIHRoZSByZXN0LiIpLAogICAgIC5pbml0ICAgICAgICA9IGluaXQsCi0gICAgLnF1ZXJ5X2Zvcm1hdHMgPSBmZl9xdWVyeV9mb3JtYXRzX2FsbCwKICAgICAucHJpdl9zaXplICAgPSBzaXplb2YoVHJpbUNvbnRleHQpLAogICAgIC5wcml2X2NsYXNzICA9ICZhdHJpbV9jbGFzcywKICAgICAuaW5wdXRzICAgICAgPSBhdHJpbV9pbnB1dHMsCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci91bnNoYXJwLmggYi9saWJhdmZpbHRlci91bnNoYXJwLmgKaW5kZXggZmM2NTFjMC4uY2FmZjk4NiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdW5zaGFycC5oCisrKyBiL2xpYmF2ZmlsdGVyL3Vuc2hhcnAuaApAQCAtMjQsMzggKzI0LDEwIEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgotI2lmIENPTkZJR19PUEVOQ0wKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3BlbmNsLmgiCi0jZW5kaWYKIAogI2RlZmluZSBNSU5fTUFUUklYX1NJWkUgMwogI2RlZmluZSBNQVhfTUFUUklYX1NJWkUgNjMKIAotI2lmIENPTkZJR19PUEVOQ0wKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZTsKLSAgICBjbF9wcm9ncmFtIHByb2dyYW07Ci0gICAgY2xfa2VybmVsIGtlcm5lbF9kZWZhdWx0OwotICAgIGNsX2tlcm5lbCBrZXJuZWxfbHVtYTsKLSAgICBjbF9rZXJuZWwga2VybmVsX2Nocm9tYTsKLSAgICBjbF9tZW0gY2xfbHVtYV9tYXNrOwotICAgIGNsX21lbSBjbF9jaHJvbWFfbWFzazsKLSAgICBjbF9tZW0gY2xfbHVtYV9tYXNrX3g7Ci0gICAgY2xfbWVtIGNsX2Nocm9tYV9tYXNrX3g7Ci0gICAgY2xfbWVtIGNsX2x1bWFfbWFza195OwotICAgIGNsX21lbSBjbF9jaHJvbWFfbWFza195OwotICAgIGludCBpbl9wbGFuZV9zaXplWzhdOwotICAgIGludCBvdXRfcGxhbmVfc2l6ZVs4XTsKLSAgICBpbnQgcGxhbmVfbnVtOwotICAgIGNsX21lbSBjbF9pbmJ1ZjsKLSAgICBzaXplX3QgY2xfaW5idWZfc2l6ZTsKLSAgICBjbF9tZW0gY2xfb3V0YnVmOwotICAgIHNpemVfdCBjbF9vdXRidWZfc2l6ZTsKLSAgICBpbnQgdXNlX2Zhc3Rfa2VybmVsczsKLX0gVW5zaGFycE9wZW5jbENvbnRleHQ7Ci0KLSNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBVbnNoYXJwRmlsdGVyUGFyYW0gewogICAgIGludCBtc2l6ZV94OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBtYXRyaXggd2lkdGgKQEAgLTc2LDkgKzQ4LDYgQEAKICAgICBVbnNoYXJwRmlsdGVyUGFyYW0gY2hyb21hOyAvLy88IGNocm9tYSBwYXJhbWV0ZXJzICh3aWR0aCwgaGVpZ2h0LCBhbW91bnQpCiAgICAgaW50IGhzdWIsIHZzdWI7CiAgICAgaW50IG9wZW5jbDsKLSNpZiBDT05GSUdfT1BFTkNMCi0gICAgVW5zaGFycE9wZW5jbENvbnRleHQgb3BlbmNsX2N0eDsKLSNlbmRpZgogICAgIGludCAoKiBhcHBseV91bnNoYXJwKShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCk7CiB9IFVuc2hhcnBDb250ZXh0OwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbC5jIGIvbGliYXZmaWx0ZXIvdW5zaGFycF9vcGVuY2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg0OTIwYy4uMDAwMDAwMAotLS0gYS9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgV2VpIEdhbyA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEzIExlbm55IFdhbmcKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogdW5zaGFycCBpbnB1dCB2aWRlbwotICovCi0KLSNpbmNsdWRlICJ1bnNoYXJwX29wZW5jbC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvb3BlbmNsX2ludGVybmFsLmgiCi0KLSNkZWZpbmUgUExBTkVfTlVNIDMKLSNkZWZpbmUgUk9VTkRfVE9fMTYoYSkgKCgoKChhKSAtIDEpLzE2KSsxKSoxNikKLQotc3RhdGljIGlubGluZSB2b2lkIGFkZF9tYXNrX2NvdW50ZXIodWludDMyX3QgKmRzdCwgdWludDMyX3QgKmNvdW50ZXIxLCB1aW50MzJfdCAqY291bnRlcjIsIGludCBsZW4pCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIGRzdFtpXSA9IGNvdW50ZXIxW2ldICsgY291bnRlcjJbaV07Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGNvbXB1dGVfbWFzayhpbnQgc3RlcCwgdWludDMyX3QgKm1hc2spCi17Ci0gICAgaW50IGksIHosIHJldCA9IDA7Ci0gICAgaW50IGNvdW50ZXJfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKiAoMiAqIHN0ZXAgKyAxKTsKLSAgICB1aW50MzJfdCAqdGVtcDFfY291bnRlciwgKnRlbXAyX2NvdW50ZXIsICoqY291bnRlcjsKLSAgICB0ZW1wMV9jb3VudGVyID0gYXZfbWFsbG9jeihjb3VudGVyX3NpemUpOwotICAgIGlmICghdGVtcDFfY291bnRlcikgewotICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICB0ZW1wMl9jb3VudGVyID0gYXZfbWFsbG9jeihjb3VudGVyX3NpemUpOwotICAgIGlmICghdGVtcDJfY291bnRlcikgewotICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICBjb3VudGVyID0gYXZfbWFsbG9jel9hcnJheSgyICogc3RlcCArIDEsIHNpemVvZih1aW50MzJfdCAqKSk7Ci0gICAgaWYgKCFjb3VudGVyKSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAyICogc3RlcCArIDE7IGkrKykgewotICAgICAgICBjb3VudGVyW2ldID0gYXZfbWFsbG9jeihjb3VudGVyX3NpemUpOwotICAgICAgICBpZiAoIWNvdW50ZXJbaV0pIHsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAyICogc3RlcCArIDE7IGkrKykgewotICAgICAgICBtZW1zZXQodGVtcDFfY291bnRlciwgMCwgY291bnRlcl9zaXplKTsKLSAgICAgICAgdGVtcDFfY291bnRlcltpXSA9IDE7Ci0gICAgICAgIGZvciAoeiA9IDA7IHogPCBzdGVwICogMjsgeiArPSAyKSB7Ci0gICAgICAgICAgICBhZGRfbWFza19jb3VudGVyKHRlbXAyX2NvdW50ZXIsIGNvdW50ZXJbel0sIHRlbXAxX2NvdW50ZXIsIHN0ZXAgKiAyKTsKLSAgICAgICAgICAgIG1lbWNweShjb3VudGVyW3pdLCB0ZW1wMV9jb3VudGVyLCBjb3VudGVyX3NpemUpOwotICAgICAgICAgICAgYWRkX21hc2tfY291bnRlcih0ZW1wMV9jb3VudGVyLCBjb3VudGVyW3ogKyAxXSwgdGVtcDJfY291bnRlciwgc3RlcCAqIDIpOwotICAgICAgICAgICAgbWVtY3B5KGNvdW50ZXJbeiArIDFdLCB0ZW1wMl9jb3VudGVyLCBjb3VudGVyX3NpemUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1lbWNweShtYXNrLCB0ZW1wMV9jb3VudGVyLCBjb3VudGVyX3NpemUpOwotZW5kOgotICAgIGF2X2ZyZWVwKCZ0ZW1wMV9jb3VudGVyKTsKLSAgICBhdl9mcmVlcCgmdGVtcDJfY291bnRlcik7Ci0gICAgZm9yIChpID0gMDsgaSA8IDIgKiBzdGVwICsgMTsgaSsrKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZjb3VudGVyW2ldKTsKLSAgICB9Ci0gICAgYXZfZnJlZXAoJmNvdW50ZXIpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY29weV9zZXBhcmFibGVfbWFza3MoY2xfbWVtIGNsX21hc2tfeCwgY2xfbWVtIGNsX21hc2tfeSwgaW50IHN0ZXBfeCwgaW50IHN0ZXBfeSkKLXsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICB1aW50MzJfdCAqbWFza194LCAqbWFza195OwotICAgIHNpemVfdCBzaXplX21hc2tfeCA9IHNpemVvZih1aW50MzJfdCkgKiAoMiAqIHN0ZXBfeCArIDEpOwotICAgIHNpemVfdCBzaXplX21hc2tfeSA9IHNpemVvZih1aW50MzJfdCkgKiAoMiAqIHN0ZXBfeSArIDEpOwotICAgIG1hc2tfeCA9IGF2X21hbGxvY3pfYXJyYXkoMiAqIHN0ZXBfeCArIDEsIHNpemVvZih1aW50MzJfdCkpOwotICAgIGlmICghbWFza194KSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIG1hc2tfeSA9IGF2X21hbGxvY3pfYXJyYXkoMiAqIHN0ZXBfeSArIDEsIHNpemVvZih1aW50MzJfdCkpOwotICAgIGlmICghbWFza195KSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotCi0gICAgcmV0ID0gY29tcHV0ZV9tYXNrKHN0ZXBfeCwgbWFza194KTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgcmV0ID0gY29tcHV0ZV9tYXNrKHN0ZXBfeSwgbWFza195KTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBlbmQ7Ci0KLSAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX3dyaXRlKGNsX21hc2tfeCwgKHVpbnQ4X3QgKiltYXNrX3gsIHNpemVfbWFza194KTsKLSAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX3dyaXRlKGNsX21hc2tfeSwgKHVpbnQ4X3QgKiltYXNrX3ksIHNpemVfbWFza195KTsKLWVuZDoKLSAgICBhdl9mcmVlcCgmbWFza194KTsKLSAgICBhdl9mcmVlcCgmbWFza195KTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZ2VuZXJhdGVfbWFzayhBVkZpbHRlckNvbnRleHQgKmN0eCkKLXsKLSAgICBjbF9tZW0gbWFza3NbNF07Ci0gICAgY2xfbWVtIG1hc2tfbWF0cml4WzJdOwotICAgIGludCBpLCByZXQgPSAwLCBzdGVwX3hbMl0sIHN0ZXBfeVsyXTsKLQotICAgIFVuc2hhcnBDb250ZXh0ICp1bnNoYXJwID0gY3R4LT5wcml2OwotICAgIG1hc2tfbWF0cml4WzBdID0gdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9sdW1hX21hc2s7Ci0gICAgbWFza19tYXRyaXhbMV0gPSB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2Nocm9tYV9tYXNrOwotICAgIG1hc2tzWzBdID0gdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9sdW1hX21hc2tfeDsKLSAgICBtYXNrc1sxXSA9IHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfbHVtYV9tYXNrX3k7Ci0gICAgbWFza3NbMl0gPSB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2Nocm9tYV9tYXNrX3g7Ci0gICAgbWFza3NbM10gPSB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2Nocm9tYV9tYXNrX3k7Ci0gICAgc3RlcF94WzBdID0gdW5zaGFycC0+bHVtYS5zdGVwc194OwotICAgIHN0ZXBfeFsxXSA9IHVuc2hhcnAtPmNocm9tYS5zdGVwc194OwotICAgIHN0ZXBfeVswXSA9IHVuc2hhcnAtPmx1bWEuc3RlcHNfeTsKLSAgICBzdGVwX3lbMV0gPSB1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeTsKLQotICAgIC8qIHVzZSBkZWZhdWx0IGtlcm5lbCBpZiBhbnkgbWF0cml4IGRpbSBsYXJnZXIgdGhhbiA4IGR1ZSB0byBsaW1pdGVkIGxvY2FsIG1lbSBzaXplICovCi0gICAgaWYgKHN0ZXBfeFswXT44IHx8IHN0ZXBfeFsxXT44IHx8IHN0ZXBfeVswXT44IHx8IHN0ZXBfeVsxXT44KQotICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LnVzZV9mYXN0X2tlcm5lbHMgPSAwOwotICAgIGVsc2UKLSAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC51c2VfZmFzdF9rZXJuZWxzID0gMTsKLQotICAgIGlmICghbWFza3NbMF0gfHwgIW1hc2tzWzFdIHx8ICFtYXNrc1syXSB8fCAhbWFza3NbM10pIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTHVtYSBtYXNrIGFuZCBjaHJvbWEgbWFzayBzaG91bGQgbm90IGJlIE5VTExcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBpZiAoIW1hc2tfbWF0cml4WzBdIHx8ICFtYXNrX21hdHJpeFsxXSkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJMdW1hIG1hc2sgYW5kIGNocm9tYSBtYXNrIHNob3VsZCBub3QgYmUgTlVMTFxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgcmV0ID0gY29weV9zZXBhcmFibGVfbWFza3MobWFza3NbMippXSwgbWFza3NbMippKzFdLCBzdGVwX3hbaV0sIHN0ZXBfeVtpXSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IGZmX29wZW5jbF9hcHBseV91bnNoYXJwKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KQotewotICAgIGludCByZXQ7Ci0gICAgQVZGaWx0ZXJMaW5rICpsaW5rID0gY3R4LT5pbnB1dHNbMF07Ci0gICAgVW5zaGFycENvbnRleHQgKnVuc2hhcnAgPSBjdHgtPnByaXY7Ci0gICAgY2xfaW50IHN0YXR1czsKLSAgICBGRk9wZW5jbFBhcmFtIGtlcm5lbDEgPSB7MH07Ci0gICAgRkZPcGVuY2xQYXJhbSBrZXJuZWwyID0gezB9OwotICAgIGludCB3aWR0aCA9IGxpbmstPnc7Ci0gICAgaW50IGhlaWdodCA9IGxpbmstPmg7Ci0gICAgaW50IGN3ID0gQVZfQ0VJTF9SU0hJRlQobGluay0+dywgdW5zaGFycC0+aHN1Yik7Ci0gICAgaW50IGNoID0gQVZfQ0VJTF9SU0hJRlQobGluay0+aCwgdW5zaGFycC0+dnN1Yik7Ci0gICAgc2l6ZV90IGdsb2JhbFdvcmtTaXplMWQgPSB3aWR0aCAqIGhlaWdodCArIDIgKiBjaCAqIGN3OwotICAgIHNpemVfdCBnbG9iYWxXb3JrU2l6ZTJkTHVtYVsyXTsKLSAgICBzaXplX3QgZ2xvYmFsV29ya1NpemUyZENocm9tYVsyXTsKLSAgICBzaXplX3QgbG9jYWxXb3JrU2l6ZTJkWzJdID0gezE2LCAxNn07Ci0KLSAgICBpZiAodW5zaGFycC0+b3BlbmNsX2N0eC51c2VfZmFzdF9rZXJuZWxzKSB7Ci0gICAgICAgIGdsb2JhbFdvcmtTaXplMmRMdW1hWzBdID0gKHNpemVfdClST1VORF9UT18xNih3aWR0aCk7Ci0gICAgICAgIGdsb2JhbFdvcmtTaXplMmRMdW1hWzFdID0gKHNpemVfdClST1VORF9UT18xNihoZWlnaHQpOwotICAgICAgICBnbG9iYWxXb3JrU2l6ZTJkQ2hyb21hWzBdID0gKHNpemVfdClST1VORF9UT18xNihjdyk7Ci0gICAgICAgIGdsb2JhbFdvcmtTaXplMmRDaHJvbWFbMV0gPSAoc2l6ZV90KSgyKlJPVU5EX1RPXzE2KGNoKSk7Ci0KLSAgICAgICAga2VybmVsMS5jdHggPSBjdHg7Ci0gICAgICAgIGtlcm5lbDEua2VybmVsID0gdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYTsKLSAgICAgICAgcmV0ID0gYXZwcml2X29wZW5jbF9zZXRfcGFyYW1ldGVyKCZrZXJuZWwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2luYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2x1bWFfbWFza194KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+b3BlbmNsX2N0eC5jbF9sdW1hX21hc2tfeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmx1bWEuYW1vdW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+bHVtYS5zY2FsZWJpdHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5sdW1hLmhhbGZzY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGluLT5saW5lc2l6ZVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKG91dC0+bGluZXNpemVbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh3aWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAga2VybmVsMi5jdHggPSBjdHg7Ci0gICAgICAgIGtlcm5lbDIua2VybmVsID0gdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfY2hyb21hOwotICAgICAgICByZXQgPSBhdnByaXZfb3BlbmNsX3NldF9wYXJhbWV0ZXIoJmtlcm5lbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfaW5idWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX291dGJ1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfY2hyb21hX21hc2tfeCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfY2hyb21hX21hc2tfeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmNocm9tYS5hbW91bnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5jaHJvbWEuc2NhbGViaXRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+Y2hyb21hLmhhbGZzY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGluLT5saW5lc2l6ZVswXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGluLT5saW5lc2l6ZVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKG91dC0+bGluZXNpemVbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhvdXQtPmxpbmVzaXplWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8obGluay0+dyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGxpbmstPmgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhjdyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGNoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgc3RhdHVzID0gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCh1bnNoYXJwLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYSwgMiwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxXb3JrU2l6ZTJkTHVtYSwgbG9jYWxXb3JrU2l6ZTJkLCAwLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgc3RhdHVzIHw9Y2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCh1bnNoYXJwLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfY2hyb21hLCAyLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFdvcmtTaXplMmRDaHJvbWEsIGxvY2FsV29ya1NpemUyZCwgMCwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIHJ1biBrZXJuZWwgZXJyb3Igb2NjdXJyZWQ6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgeyAgICAvKiB1c2UgZGVmYXVsdCBrZXJuZWwgKi8KLSAgICAgICAga2VybmVsMS5jdHggPSBjdHg7Ci0gICAgICAgIGtlcm5lbDEua2VybmVsID0gdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfZGVmYXVsdDsKLQotICAgICAgICByZXQgPSBhdnByaXZfb3BlbmNsX3NldF9wYXJhbWV0ZXIoJmtlcm5lbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfaW5idWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX291dGJ1ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfbHVtYV9tYXNrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+b3BlbmNsX2N0eC5jbF9jaHJvbWFfbWFzayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmx1bWEuYW1vdW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+Y2hyb21hLmFtb3VudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmx1bWEuc3RlcHNfeCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmx1bWEuc3RlcHNfeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmNocm9tYS5zdGVwc194KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8odW5zaGFycC0+Y2hyb21hLnN0ZXBzX3kpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5sdW1hLnNjYWxlYml0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmNocm9tYS5zY2FsZWJpdHMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyh1bnNoYXJwLT5sdW1hLmhhbGZzY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKHVuc2hhcnAtPmNocm9tYS5oYWxmc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhpbi0+bGluZXNpemVbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhpbi0+bGluZXNpemVbMV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhvdXQtPmxpbmVzaXplWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8ob3V0LT5saW5lc2l6ZVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX09QRU5DTF9QQVJBTV9JTkZPKGxpbmstPmgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhsaW5rLT53KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfT1BFTkNMX1BBUkFNX0lORk8oY2gpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9PUEVOQ0xfUEFSQU1fSU5GTyhjdyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIHN0YXR1cyA9IGNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwodW5zaGFycC0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2RlZmF1bHQsIDEsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdsb2JhbFdvcmtTaXplMWQsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBydW4ga2VybmVsIGVycm9yIG9jY3VycmVkOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vYmxvY2tpbmcgbWFwIGlzIHN1ZmZmaWNpZW50LCBubyBuZWVkIGZvciBjbEZpbmlzaAotICAgIC8vY2xGaW5pc2godW5zaGFycC0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlKTsKLQotICAgIHJldHVybiBhdl9vcGVuY2xfYnVmZmVyX3JlYWRfaW1hZ2Uob3V0LT5kYXRhLCB1bnNoYXJwLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5wbGFuZV9udW0sIHVuc2hhcnAtPm9wZW5jbF9jdHguY2xfb3V0YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWZfc2l6ZSk7Ci19Ci0KLWludCBmZl9vcGVuY2xfdW5zaGFycF9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQotewotICAgIGludCByZXQgPSAwOwotICAgIGNoYXIgYnVpbGRfb3B0c1s5Nl07Ci0gICAgVW5zaGFycENvbnRleHQgKnVuc2hhcnAgPSBjdHgtPnByaXY7Ci0gICAgcmV0ID0gYXZfb3BlbmNsX2luaXQoTlVMTCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfbHVtYV9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgKiAoMiAqIHVuc2hhcnAtPmx1bWEuc3RlcHNfeCArIDEpICogKDIgKiB1bnNoYXJwLT5sdW1hLnN0ZXBzX3kgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9NRU1fUkVBRF9PTkxZLCBOVUxMKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICByZXQgPSBhdl9vcGVuY2xfYnVmZmVyX2NyZWF0ZSgmdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9jaHJvbWFfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpICogKDIgKiB1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeCArIDEpICogKDIgKiB1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeSArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX09OTFksIE5VTEwpOwotICAgIC8vIHNlcGFyYWJsZSBmaWx0ZXJzCi0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfbHVtYV9tYXNrX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSAqICgyICogdW5zaGFycC0+bHVtYS5zdGVwc194ICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfTUVNX1JFQURfT05MWSwgTlVMTCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfbHVtYV9tYXNrX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSAqICgyICogdW5zaGFycC0+bHVtYS5zdGVwc195ICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfTUVNX1JFQURfT05MWSwgTlVMTCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfY2hyb21hX21hc2tfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YodWludDMyX3QpICogKDIgKiB1bnNoYXJwLT5jaHJvbWEuc3RlcHNfeCArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX09OTFksIE5VTEwpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIHJldCA9IGF2X29wZW5jbF9idWZmZXJfY3JlYXRlKCZ1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2Nocm9tYV9tYXNrX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSAqICgyICogdW5zaGFycC0+Y2hyb21hLnN0ZXBzX3kgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9NRU1fUkVBRF9PTkxZLCBOVUxMKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICByZXQgPSBnZW5lcmF0ZV9tYXNrKGN0eCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgdW5zaGFycC0+b3BlbmNsX2N0eC5wbGFuZV9udW0gPSBQTEFORV9OVU07Ci0gICAgdW5zaGFycC0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlID0gYXZfb3BlbmNsX2dldF9jb21tYW5kX3F1ZXVlKCk7Ci0gICAgaWYgKCF1bnNoYXJwLT5vcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGdldCBPcGVuQ0wgY29tbWFuZCBxdWV1ZSBpbiBmaWx0ZXIgJ3Vuc2hhcnAnXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVpbGRfb3B0cywgOTYsICItRCBMVV9SQURJVVNfWD0lZCAtRCBMVV9SQURJVVNfWT0lZCAtRCBDSF9SQURJVVNfWD0lZCAtRCBDSF9SQURJVVNfWT0lZCIsCi0gICAgICAgICAgICAyKnVuc2hhcnAtPmx1bWEuc3RlcHNfeCsxLCAyKnVuc2hhcnAtPmx1bWEuc3RlcHNfeSsxLCAyKnVuc2hhcnAtPmNocm9tYS5zdGVwc194KzEsIDIqdW5zaGFycC0+Y2hyb21hLnN0ZXBzX3krMSk7Ci0gICAgdW5zaGFycC0+b3BlbmNsX2N0eC5wcm9ncmFtID0gYXZfb3BlbmNsX2NvbXBpbGUoInVuc2hhcnAiLCBidWlsZF9vcHRzKTsKLSAgICBpZiAoIXVuc2hhcnAtPm9wZW5jbF9jdHgucHJvZ3JhbSkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wgZmFpbGVkIHRvIGNvbXBpbGUgcHJvZ3JhbSAndW5zaGFycCdcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBpZiAodW5zaGFycC0+b3BlbmNsX2N0eC51c2VfZmFzdF9rZXJuZWxzKSB7Ci0gICAgICAgIGlmICghdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYSkgewotICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfbHVtYSA9IGNsQ3JlYXRlS2VybmVsKHVuc2hhcnAtPm9wZW5jbF9jdHgucHJvZ3JhbSwgInVuc2hhcnBfbHVtYSIsICZyZXQpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIGZhaWxlZCB0byBjcmVhdGUga2VybmVsICd1bnNoYXJwX2x1bWEnXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghdW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfY2hyb21hKSB7Ci0gICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9jaHJvbWEgPSBjbENyZWF0ZUtlcm5lbCh1bnNoYXJwLT5vcGVuY2xfY3R4LnByb2dyYW0sICJ1bnNoYXJwX2Nocm9tYSIsICZyZXQpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wgZmFpbGVkIHRvIGNyZWF0ZSBrZXJuZWwgJ3Vuc2hhcnBfY2hyb21hJ1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKCF1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9kZWZhdWx0KSB7Ci0gICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9kZWZhdWx0ID0gY2xDcmVhdGVLZXJuZWwodW5zaGFycC0+b3BlbmNsX2N0eC5wcm9ncmFtLCAidW5zaGFycF9kZWZhdWx0IiwgJnJldCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBmYWlsZWQgdG8gY3JlYXRlIGtlcm5lbCAndW5zaGFycF9kZWZhdWx0J1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGZmX29wZW5jbF91bnNoYXJwX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKLXsKLSAgICBVbnNoYXJwQ29udGV4dCAqdW5zaGFycCA9IGN0eC0+cHJpdjsKLSAgICBhdl9vcGVuY2xfYnVmZmVyX3JlbGVhc2UoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfaW5idWYpOwotICAgIGF2X29wZW5jbF9idWZmZXJfcmVsZWFzZSgmdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWYpOwotICAgIGF2X29wZW5jbF9idWZmZXJfcmVsZWFzZSgmdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9sdW1hX21hc2spOwotICAgIGF2X29wZW5jbF9idWZmZXJfcmVsZWFzZSgmdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9jaHJvbWFfbWFzayk7Ci0gICAgYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKCZ1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2x1bWFfbWFza194KTsKLSAgICBhdl9vcGVuY2xfYnVmZmVyX3JlbGVhc2UoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfY2hyb21hX21hc2tfeCk7Ci0gICAgYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKCZ1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2x1bWFfbWFza195KTsKLSAgICBhdl9vcGVuY2xfYnVmZmVyX3JlbGVhc2UoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfY2hyb21hX21hc2tfeSk7Ci0gICAgY2xSZWxlYXNlS2VybmVsKHVuc2hhcnAtPm9wZW5jbF9jdHgua2VybmVsX2RlZmF1bHQpOwotICAgIGNsUmVsZWFzZUtlcm5lbCh1bnNoYXJwLT5vcGVuY2xfY3R4Lmtlcm5lbF9sdW1hKTsKLSAgICBjbFJlbGVhc2VLZXJuZWwodW5zaGFycC0+b3BlbmNsX2N0eC5rZXJuZWxfY2hyb21hKTsKLSAgICBjbFJlbGVhc2VQcm9ncmFtKHVuc2hhcnAtPm9wZW5jbF9jdHgucHJvZ3JhbSk7Ci0gICAgdW5zaGFycC0+b3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlID0gTlVMTDsKLSAgICBhdl9vcGVuY2xfdW5pbml0KCk7Ci19Ci0KLWludCBmZl9vcGVuY2xfdW5zaGFycF9wcm9jZXNzX2lub3V0X2J1ZihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCkKLXsKLSAgICBpbnQgcmV0ID0gMDsKLSAgICBBVkZpbHRlckxpbmsgKmxpbmsgPSBjdHgtPmlucHV0c1swXTsKLSAgICBVbnNoYXJwQ29udGV4dCAqdW5zaGFycCA9IGN0eC0+cHJpdjsKLSAgICBpbnQgY2ggPSBBVl9DRUlMX1JTSElGVChsaW5rLT5oLCB1bnNoYXJwLT52c3ViKTsKLQotICAgIGlmICgoIXVuc2hhcnAtPm9wZW5jbF9jdHguY2xfaW5idWYpIHx8ICghdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWYpKSB7Ci0gICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVswXSAgPSAoaW4tPmxpbmVzaXplWzBdICogaW4tPmhlaWdodCk7Ci0gICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVsxXSAgPSAoaW4tPmxpbmVzaXplWzFdICogY2gpOwotICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmluX3BsYW5lX3NpemVbMl0gID0gKGluLT5saW5lc2l6ZVsyXSAqIGNoKTsKLSAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVswXSA9IChvdXQtPmxpbmVzaXplWzBdICogb3V0LT5oZWlnaHQpOwotICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplWzFdID0gKG91dC0+bGluZXNpemVbMV0gKiBjaCk7Ci0gICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgub3V0X3BsYW5lX3NpemVbMl0gPSAob3V0LT5saW5lc2l6ZVsyXSAqIGNoKTsKLSAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9pbmJ1Zl9zaXplICA9IHVuc2hhcnAtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZVswXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmluX3BsYW5lX3NpemVbMV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5pbl9wbGFuZV9zaXplWzJdOwotICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX291dGJ1Zl9zaXplID0gdW5zaGFycC0+b3BlbmNsX2N0eC5vdXRfcGxhbmVfc2l6ZVswXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4Lm91dF9wbGFuZV9zaXplWzFdICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2hhcnAtPm9wZW5jbF9jdHgub3V0X3BsYW5lX3NpemVbMl07Ci0gICAgICAgIGlmICghdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9pbmJ1ZikgewotICAgICAgICAgICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfaW5idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2luYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9NRU1fUkVBRF9PTkxZLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX291dGJ1ZikgewotICAgICAgICAgICAgcmV0ID0gYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoJnVuc2hhcnAtPm9wZW5jbF9jdHguY2xfb3V0YnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaGFycC0+b3BlbmNsX2N0eC5jbF9vdXRidWZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX1dSSVRFLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGF2X29wZW5jbF9idWZmZXJfd3JpdGVfaW1hZ2UodW5zaGFycC0+b3BlbmNsX2N0eC5jbF9pbmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LmNsX2luYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgaW4tPmRhdGEsIHVuc2hhcnAtPm9wZW5jbF9jdHguaW5fcGxhbmVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNoYXJwLT5vcGVuY2xfY3R4LnBsYW5lX251bSk7Ci19CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbC5oIGIvbGliYXZmaWx0ZXIvdW5zaGFycF9vcGVuY2wuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FlZmFiNi4uMDAwMDAwMAotLS0gYS9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBXZWkgR2FvIDx3ZWlnYW9AbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZGSUxURVJfVU5TSEFSUF9PUEVOQ0xfSAotI2RlZmluZSBBVkZJTFRFUl9VTlNIQVJQX09QRU5DTF9ICi0KLSNpbmNsdWRlICJ1bnNoYXJwLmgiCi0KLWludCBmZl9vcGVuY2xfdW5zaGFycF9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KTsKLQotdm9pZCBmZl9vcGVuY2xfdW5zaGFycF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpOwotCi1pbnQgZmZfb3BlbmNsX3Vuc2hhcnBfcHJvY2Vzc19pbm91dF9idWYoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpOwotCi1pbnQgZmZfb3BlbmNsX2FwcGx5X3Vuc2hhcnAoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpOwotCi0jZW5kaWYgLyogQVZGSUxURVJfVU5TSEFSUF9PUEVOQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdW5zaGFycF9vcGVuY2xfa2VybmVsLmggYi9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbF9rZXJuZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3ZDBmMS4uMDAwMDAwMAotLS0gYS9saWJhdmZpbHRlci91bnNoYXJwX29wZW5jbF9rZXJuZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFdlaSBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMyBMZW5ueSBXYW5nCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZGSUxURVJfVU5TSEFSUF9PUEVOQ0xfS0VSTkVMX0gKLSNkZWZpbmUgQVZGSUxURVJfVU5TSEFSUF9PUEVOQ0xfS0VSTkVMX0gKLQotI2luY2x1ZGUgImxpYmF2dXRpbC9vcGVuY2wuaCIKLQotY29uc3QgY2hhciAqZmZfa2VybmVsX3Vuc2hhcnBfb3BlbmNsID0gQVZfT1BFTkNMX0tFUk5FTCgKLWlubGluZSB1bnNpZ25lZCBjaGFyIGNsaXBfdWludDgoaW50IGEpCi17Ci0gICAgaWYgKGEgJiAofjB4RkYpKQotICAgICAgICByZXR1cm4gKC1hKT4+MzE7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYTsKLX0KLQota2VybmVsIHZvaWQgdW5zaGFycF9sdW1hKAotICAgICAgICAgICAgICAgICAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjLAotICAgICAgICAgICAgICAgICAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICBnbG9iYWwgaW50ICptYXNrX3gsCi0gICAgICAgICAgICAgICAgICAgIGdsb2JhbCBpbnQgKm1hc2tfeSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGFtb3VudCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHNjYWxlYml0cywKLSAgICAgICAgICAgICAgICAgICAgaW50IGhhbGZzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpCi17Ci0gICAgaW50MiB0aHJlYWRJZHgsIGJsb2NrSWR4LCBnbG9iYWxJZHg7Ci0gICAgdGhyZWFkSWR4LnggPSBnZXRfbG9jYWxfaWQoMCk7Ci0gICAgdGhyZWFkSWR4LnkgPSBnZXRfbG9jYWxfaWQoMSk7Ci0gICAgYmxvY2tJZHgueCA9IGdldF9ncm91cF9pZCgwKTsKLSAgICBibG9ja0lkeC55ID0gZ2V0X2dyb3VwX2lkKDEpOwotICAgIGdsb2JhbElkeC54ID0gZ2V0X2dsb2JhbF9pZCgwKTsKLSAgICBnbG9iYWxJZHgueSA9IGdldF9nbG9iYWxfaWQoMSk7Ci0KLSAgICBpZiAoIWFtb3VudCkgewotICAgICAgICBpZiAoZ2xvYmFsSWR4LnggPCB3aWR0aCAmJiBnbG9iYWxJZHgueSA8IGhlaWdodCkKLSAgICAgICAgICAgIGRzdFtnbG9iYWxJZHgueCArIGdsb2JhbElkeC55KmRzdF9zdHJpZGVdID0gc3JjW2dsb2JhbElkeC54ICsgZ2xvYmFsSWR4Lnkqc3JjX3N0cmlkZV07Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBsb2NhbCB1bnNpZ25lZCBpbnQgbFszMl1bMzJdOwotICAgIGxvY2FsIHVuc2lnbmVkIGludCBsY3hbTFVfUkFESVVTX1hdOwotICAgIGxvY2FsIHVuc2lnbmVkIGludCBsY3lbTFVfUkFESVVTX1ldOwotICAgIGludCBpbmRleEl4LCBpbmRleEl5LCBpLCBqOwotCi0gICAgLy9sb2FkIHVwIHRpbGU6IGFjdHVhbCB3b3Jrc3BhY2UgKyBoYWxvIG9mIDggcG9pbnRzIGluIHggYW5kIHkgXG4KLSAgICBmb3IoaSA9IDA7IGkgPD0gMTsgaSsrKSB7Ci0gICAgICAgIGluZGV4SXkgPSAtOCArIChibG9ja0lkeC55ICsgaSkgKiAxNiArIHRocmVhZElkeC55OwotICAgICAgICBpbmRleEl5ID0gaW5kZXhJeSA8IDAgPyAwIDogaW5kZXhJeTsKLSAgICAgICAgaW5kZXhJeSA9IGluZGV4SXkgPj0gaGVpZ2h0ID8gaGVpZ2h0IC0gMTogaW5kZXhJeTsKLSAgICAgICAgZm9yKGogPSAwOyBqIDw9IDE7IGorKykgewotICAgICAgICAgICAgaW5kZXhJeCA9IC04ICsgKGJsb2NrSWR4LnggKyBqKSAqIDE2ICsgdGhyZWFkSWR4Lng7Ci0gICAgICAgICAgICBpbmRleEl4ID0gaW5kZXhJeCA8IDAgPyAwIDogaW5kZXhJeDsKLSAgICAgICAgICAgIGluZGV4SXggPSBpbmRleEl4ID49IHdpZHRoID8gd2lkdGggLSAxOiBpbmRleEl4OwotICAgICAgICAgICAgbFtpKjE2ICsgdGhyZWFkSWR4LnldW2oqMTYgKyB0aHJlYWRJZHgueF0gPSBzcmNbaW5kZXhJeSpzcmNfc3RyaWRlICsgaW5kZXhJeF07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgaW5kZXhMID0gdGhyZWFkSWR4LnkqMTYgKyB0aHJlYWRJZHgueDsKLSAgICBpZiAoaW5kZXhMIDwgTFVfUkFESVVTX1gpCi0gICAgICAgIGxjeFtpbmRleExdID0gbWFza194W2luZGV4TF07Ci0gICAgaWYgKGluZGV4TCA8IExVX1JBRElVU19ZKQotICAgICAgICBsY3lbaW5kZXhMXSA9IG1hc2tfeVtpbmRleExdOwotICAgIGJhcnJpZXIoQ0xLX0xPQ0FMX01FTV9GRU5DRSk7Ci0KLSAgICAvL25lZWRlZCBmb3IgdW5zaGFycCBtYXNrIGFwcGxpY2F0aW9uIGluIHRoZSBlbmQgXG4KLSAgICBpbnQgb3JpZ192YWx1ZSA9IChpbnQpbFt0aHJlYWRJZHgueSArIDhdW3RocmVhZElkeC54ICsgOF07Ci0KLSAgICBpbnQgaWR4LCBpZHksIG1hc2tJbmRleDsKLSAgICBpbnQgdGVtcFsyXSA9IHswfTsKLSAgICBpbnQgc3RlcHNfeCA9IChMVV9SQURJVVNfWC0xKS8yOwotICAgIGludCBzdGVwc195ID0gKExVX1JBRElVU19ZLTEpLzI7Ci0KLSAgICAvLyBjb21wdXRlIHRoZSBhY3R1YWwgd29ya3NwYWNlICsgbGVmdCZyaWdodCBoYWxvcyBcbgotICAgICAgXG4jcHJhZ21hIHVucm9sbFxuCi0gICAgZm9yIChqID0gMDsgaiA8PTE7IGorKykgewotICAgICAgLy9leHRyYSB3b3JrIHRvIGNvdmVyIGxlZnQgYW5kIHJpZ2h0IGhhbG9zIFxuCi0gICAgICBpZHggPSAxNipqICsgdGhyZWFkSWR4Lng7Ci0gICAgICBcbiNwcmFnbWEgdW5yb2xsXG4KLSAgICAgICAgZm9yIChpID0gLXN0ZXBzX3k7IGkgPD0gc3RlcHNfeTsgaSsrKSB7Ci0gICAgICAgICAgaWR5ID0gOCArIGkgKyB0aHJlYWRJZHgueTsKLSAgICAgICAgICBtYXNrSW5kZXggPSAoaSArIHN0ZXBzX3kpOwotICAgICAgICAgIHRlbXBbal0gKz0gKGludClsW2lkeV1baWR4XSAqIGxjeVttYXNrSW5kZXhdOwotICAgICAgICB9Ci0gICAgfQotICAgIGJhcnJpZXIoQ0xLX0xPQ0FMX01FTV9GRU5DRSk7Ci0gICAgLy9zYXZlIHJlc3VsdHMgZnJvbSB0aGUgdmVydGljYWwgZmlsdGVyIGluIGxvY2FsIG1lbW9yeSBcbgotICAgIGlkeSA9IDggKyB0aHJlYWRJZHgueTsKLSAgICAgIFxuI3ByYWdtYSB1bnJvbGxcbgotICAgIGZvciAoaiA9IDA7IGogPD0xOyBqKyspIHsKLSAgICAgIGlkeCA9IDE2KmogKyB0aHJlYWRJZHgueDsKLSAgICAgIGxbaWR5XVtpZHhdID0gdGVtcFtqXTsKLSAgICB9Ci0gICAgYmFycmllcihDTEtfTE9DQUxfTUVNX0ZFTkNFKTsKLQotICAgIC8vY29tcHV0ZSByZXN1bHRzIHdpdGggdGhlIGhvcml6b250YWwgZmlsdGVyIFxuCi0gICAgaW50IHN1bSA9IDA7Ci0gICAgaWR5ID0gOCArIHRocmVhZElkeC55OwotICAgIFxuI3ByYWdtYSB1bnJvbGxcbgotICAgICAgZm9yIChqID0gLXN0ZXBzX3g7IGogPD0gc3RlcHNfeDsgaisrKSB7Ci0gICAgICAgIGlkeCA9IDggKyBqICsgdGhyZWFkSWR4Lng7Ci0gICAgICAgIG1hc2tJbmRleCA9IGogKyBzdGVwc194OwotICAgICAgICBzdW0gKz0gKGludClsW2lkeV1baWR4XSAqIGxjeFttYXNrSW5kZXhdOwotICAgICAgfQotCi0gICAgaW50IHJlcyA9IG9yaWdfdmFsdWUgKyAoKChvcmlnX3ZhbHVlIC0gKGludCkoKHN1bSArIGhhbGZzY2FsZSkgPj4gc2NhbGViaXRzKSkgKiBhbW91bnQpID4+IDE2KTsKLQotICAgIGlmIChnbG9iYWxJZHgueCA8IHdpZHRoICYmIGdsb2JhbElkeC55IDwgaGVpZ2h0KQotICAgICAgICBkc3RbZ2xvYmFsSWR4LnggKyBnbG9iYWxJZHgueSpkc3Rfc3RyaWRlXSA9IGNsaXBfdWludDgocmVzKTsKLX0KLQota2VybmVsIHZvaWQgdW5zaGFycF9jaHJvbWEoCi0gICAgICAgICAgICAgICAgICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpzcmNfeSwKLSAgICAgICAgICAgICAgICAgICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKmRzdF95LAotICAgICAgICAgICAgICAgICAgICBnbG9iYWwgaW50ICptYXNrX3gsCi0gICAgICAgICAgICAgICAgICAgIGdsb2JhbCBpbnQgKm1hc2tfeSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGFtb3VudCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHNjYWxlYml0cywKLSAgICAgICAgICAgICAgICAgICAgaW50IGhhbGZzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IHNyY19zdHJpZGVfbHUsCi0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlX2NoLAotICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0cmlkZV9sdSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGVfY2gsCi0gICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGN3LAotICAgICAgICAgICAgICAgICAgICBpbnQgY2gpCi17Ci0gICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKmRzdF91ID0gZHN0X3kgKyBoZWlnaHQgKiBkc3Rfc3RyaWRlX2x1OwotICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpkc3RfdiA9IGRzdF91ICsgY2ggKiBkc3Rfc3RyaWRlX2NoOwotICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpzcmNfdSA9IHNyY195ICsgaGVpZ2h0ICogc3JjX3N0cmlkZV9sdTsKLSAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjX3YgPSBzcmNfdSArIGNoICogc3JjX3N0cmlkZV9jaDsKLSAgICBpbnQyIHRocmVhZElkeCwgYmxvY2tJZHgsIGdsb2JhbElkeDsKLSAgICB0aHJlYWRJZHgueCA9IGdldF9sb2NhbF9pZCgwKTsKLSAgICB0aHJlYWRJZHgueSA9IGdldF9sb2NhbF9pZCgxKTsKLSAgICBibG9ja0lkeC54ID0gZ2V0X2dyb3VwX2lkKDApOwotICAgIGJsb2NrSWR4LnkgPSBnZXRfZ3JvdXBfaWQoMSk7Ci0gICAgZ2xvYmFsSWR4LnggPSBnZXRfZ2xvYmFsX2lkKDApOwotICAgIGdsb2JhbElkeC55ID0gZ2V0X2dsb2JhbF9pZCgxKTsKLSAgICBpbnQgcGFkY2ggPSBnZXRfZ2xvYmFsX3NpemUoMSkvMjsKLSAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjID0gZ2xvYmFsSWR4Lnk+PXBhZGNoID8gc3JjX3YgOiBzcmNfdTsKLSAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0ID0gZ2xvYmFsSWR4Lnk+PXBhZGNoID8gZHN0X3YgOiBkc3RfdTsKLQotICAgIGJsb2NrSWR4LnkgPSBnbG9iYWxJZHgueT49cGFkY2ggPyBibG9ja0lkeC55IC0gZ2V0X251bV9ncm91cHMoMSkvMiA6IGJsb2NrSWR4Lnk7Ci0gICAgZ2xvYmFsSWR4LnkgPSBnbG9iYWxJZHgueT49cGFkY2ggPyBnbG9iYWxJZHgueSAtIHBhZGNoIDogZ2xvYmFsSWR4Lnk7Ci0KLSAgICBpZiAoIWFtb3VudCkgewotICAgICAgICBpZiAoZ2xvYmFsSWR4LnggPCBjdyAmJiBnbG9iYWxJZHgueSA8IGNoKQotICAgICAgICAgICAgZHN0W2dsb2JhbElkeC54ICsgZ2xvYmFsSWR4LnkqZHN0X3N0cmlkZV9jaF0gPSBzcmNbZ2xvYmFsSWR4LnggKyBnbG9iYWxJZHgueSpzcmNfc3RyaWRlX2NoXTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGxvY2FsIHVuc2lnbmVkIGludCBsWzMyXVszMl07Ci0gICAgbG9jYWwgdW5zaWduZWQgaW50IGxjeFtDSF9SQURJVVNfWF07Ci0gICAgbG9jYWwgdW5zaWduZWQgaW50IGxjeVtDSF9SQURJVVNfWV07Ci0gICAgaW50IGluZGV4SXgsIGluZGV4SXksIGksIGo7Ci0gICAgZm9yKGkgPSAwOyBpIDw9IDE7IGkrKykgewotICAgICAgICBpbmRleEl5ID0gLTggKyAoYmxvY2tJZHgueSArIGkpICogMTYgKyB0aHJlYWRJZHgueTsKLSAgICAgICAgaW5kZXhJeSA9IGluZGV4SXkgPCAwID8gMCA6IGluZGV4SXk7Ci0gICAgICAgIGluZGV4SXkgPSBpbmRleEl5ID49IGNoID8gY2ggLSAxOiBpbmRleEl5OwotICAgICAgICBmb3IoaiA9IDA7IGogPD0gMTsgaisrKSB7Ci0gICAgICAgICAgICBpbmRleEl4ID0gLTggKyAoYmxvY2tJZHgueCArIGopICogMTYgKyB0aHJlYWRJZHgueDsKLSAgICAgICAgICAgIGluZGV4SXggPSBpbmRleEl4IDwgMCA/IDAgOiBpbmRleEl4OwotICAgICAgICAgICAgaW5kZXhJeCA9IGluZGV4SXggPj0gY3cgPyBjdyAtIDE6IGluZGV4SXg7Ci0gICAgICAgICAgICBsW2kqMTYgKyB0aHJlYWRJZHgueV1baioxNiArIHRocmVhZElkeC54XSA9IHNyY1tpbmRleEl5ICogc3JjX3N0cmlkZV9jaCArIGluZGV4SXhdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50IGluZGV4TCA9IHRocmVhZElkeC55KjE2ICsgdGhyZWFkSWR4Lng7Ci0gICAgaWYgKGluZGV4TCA8IENIX1JBRElVU19YKQotICAgICAgICBsY3hbaW5kZXhMXSA9IG1hc2tfeFtpbmRleExdOwotICAgIGlmIChpbmRleEwgPCBDSF9SQURJVVNfWSkKLSAgICAgICAgbGN5W2luZGV4TF0gPSBtYXNrX3lbaW5kZXhMXTsKLSAgICBiYXJyaWVyKENMS19MT0NBTF9NRU1fRkVOQ0UpOwotCi0gICAgaW50IG9yaWdfdmFsdWUgPSAoaW50KWxbdGhyZWFkSWR4LnkgKyA4XVt0aHJlYWRJZHgueCArIDhdOwotCi0gICAgaW50IGlkeCwgaWR5LCBtYXNrSW5kZXg7Ci0gICAgaW50IHN0ZXBzX3ggPSBDSF9SQURJVVNfWC8yOwotICAgIGludCBzdGVwc195ID0gQ0hfUkFESVVTX1kvMjsKLSAgICBpbnQgdGVtcFsyXSA9IHswLDB9OwotCi0gICAgXG4jcHJhZ21hIHVucm9sbFxuCi0gICAgICBmb3IgKGogPSAwOyBqIDw9IDE7IGorKykgewotICAgICAgICBpZHggPSAxNipqICsgdGhyZWFkSWR4Lng7Ci0gICAgICAgIFxuI3ByYWdtYSB1bnJvbGxcbgotICAgICAgICAgIGZvciAoaSA9IC1zdGVwc195OyBpIDw9IHN0ZXBzX3k7IGkrKykgewotICAgICAgICAgICAgaWR5ID0gOCArIGkgKyB0aHJlYWRJZHgueTsKLSAgICAgICAgICAgIG1hc2tJbmRleCA9IGkgKyBzdGVwc195OwotICAgICAgICAgICAgdGVtcFtqXSArPSAoaW50KWxbaWR5XVtpZHhdICogbGN5W21hc2tJbmRleF07Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgYmFycmllcihDTEtfTE9DQUxfTUVNX0ZFTkNFKTsKLSAgICBpZHkgPSA4ICsgdGhyZWFkSWR4Lnk7Ci0gICAgXG4jcHJhZ21hIHVucm9sbFxuCi0gICAgZm9yIChqID0gMDsgaiA8PSAxOyBqKyspIHsKLSAgICAgIGlkeCA9IDE2KmogKyB0aHJlYWRJZHgueDsKLSAgICAgIGxbaWR5XVtpZHhdID0gdGVtcFtqXTsKLSAgICB9Ci0gICAgYmFycmllcihDTEtfTE9DQUxfTUVNX0ZFTkNFKTsKLQotICAgIC8vY29tcHV0ZSByZXN1bHRzIHdpdGggdGhlIGhvcml6b250YWwgZmlsdGVyIFxuCi0gICAgaW50IHN1bSA9IDA7Ci0gICAgaWR5ID0gOCArIHRocmVhZElkeC55OwotICAgIFxuI3ByYWdtYSB1bnJvbGxcbgotICAgICAgZm9yIChqID0gLXN0ZXBzX3g7IGogPD0gc3RlcHNfeDsgaisrKSB7Ci0gICAgICAgIGlkeCA9IDggKyBqICsgdGhyZWFkSWR4Lng7Ci0gICAgICAgIG1hc2tJbmRleCA9IGogKyBzdGVwc194OwotICAgICAgICBzdW0gKz0gKGludClsW2lkeV1baWR4XSAqIGxjeFttYXNrSW5kZXhdOwotICAgICAgfQotCi0gICAgaW50IHJlcyA9IG9yaWdfdmFsdWUgKyAoKChvcmlnX3ZhbHVlIC0gKGludCkoKHN1bSArIGhhbGZzY2FsZSkgPj4gc2NhbGViaXRzKSkgKiBhbW91bnQpID4+IDE2KTsKLQotICAgIGlmIChnbG9iYWxJZHgueCA8IGN3ICYmIGdsb2JhbElkeC55IDwgY2gpCi0gICAgICAgIGRzdFtnbG9iYWxJZHgueCArIGdsb2JhbElkeC55KmRzdF9zdHJpZGVfY2hdID0gY2xpcF91aW50OChyZXMpOwotfQotCi1rZXJuZWwgdm9pZCB1bnNoYXJwX2RlZmF1bHQoZ2xvYmFsICB1bnNpZ25lZCBjaGFyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgIGdsb2JhbCAgdW5zaWduZWQgY2hhciAqZHN0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBnbG9iYWwgIHVuc2lnbmVkIGludCAqbWFza19sdSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xvYmFsICB1bnNpZ25lZCBpbnQgKm1hc2tfY2gsCi0gICAgICAgICAgICAgICAgICAgIGludCBhbW91bnRfbHUsCi0gICAgICAgICAgICAgICAgICAgIGludCBhbW91bnRfY2gsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGVwX3hfbHUsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGVwX3lfbHUsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGVwX3hfY2gsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdGVwX3lfY2gsCi0gICAgICAgICAgICAgICAgICAgIGludCBzY2FsZWJpdHNfbHUsCi0gICAgICAgICAgICAgICAgICAgIGludCBzY2FsZWJpdHNfY2gsCi0gICAgICAgICAgICAgICAgICAgIGludCBoYWxmc2NhbGVfbHUsCi0gICAgICAgICAgICAgICAgICAgIGludCBoYWxmc2NhbGVfY2gsCi0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfc3RyaWRlX2x1LAotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0cmlkZV9jaCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGVfbHUsCi0gICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlX2NoLAotICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGludCBjaCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGN3KQotewotICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpkc3RfeSA9IGRzdDsKLSAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqZHN0X3UgPSBkc3RfeSArIGhlaWdodCAqIGRzdF9zdHJpZGVfbHU7Ci0gICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKmRzdF92ID0gZHN0X3UgKyBjaCAqIGRzdF9zdHJpZGVfY2g7Ci0KLSAgICBnbG9iYWwgdW5zaWduZWQgY2hhciAqc3JjX3kgPSBzcmM7Ci0gICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKnNyY191ID0gc3JjX3kgKyBoZWlnaHQgKiBzcmNfc3RyaWRlX2x1OwotICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICpzcmNfdiA9IHNyY191ICsgY2ggKiBzcmNfc3RyaWRlX2NoOwotCi0gICAgZ2xvYmFsIHVuc2lnbmVkIGNoYXIgKnRlbXBfZHN0OwotICAgIGdsb2JhbCB1bnNpZ25lZCBjaGFyICp0ZW1wX3NyYzsKLSAgICBjb25zdCBnbG9iYWwgdW5zaWduZWQgaW50ICp0ZW1wX21hc2s7Ci0gICAgaW50IGdsb2JhbF9pZCA9IGdldF9nbG9iYWxfaWQoMCk7Ci0gICAgaW50IGksIGosIHgsIHksIHRlbXBfc3JjX3N0cmlkZSwgdGVtcF9kc3Rfc3RyaWRlLCB0ZW1wX2hlaWdodCwgdGVtcF93aWR0aCwgdGVtcF9zdGVwc194LCB0ZW1wX3N0ZXBzX3ksCi0gICAgICAgIHRlbXBfYW1vdW50LCB0ZW1wX3NjYWxlYml0cywgdGVtcF9oYWxmc2NhbGUsIHN1bSwgaWR4X3gsIGlkeF95LCB0ZW1wLCByZXM7Ci0gICAgaWYgKGdsb2JhbF9pZCA8IHdpZHRoICogaGVpZ2h0KSB7Ci0gICAgICAgIHkgPSBnbG9iYWxfaWQgLyB3aWR0aDsKLSAgICAgICAgeCA9IGdsb2JhbF9pZCAlIHdpZHRoOwotICAgICAgICB0ZW1wX2RzdCA9IGRzdF95OwotICAgICAgICB0ZW1wX3NyYyA9IHNyY195OwotICAgICAgICB0ZW1wX3NyY19zdHJpZGUgPSBzcmNfc3RyaWRlX2x1OwotICAgICAgICB0ZW1wX2RzdF9zdHJpZGUgPSBkc3Rfc3RyaWRlX2x1OwotICAgICAgICB0ZW1wX2hlaWdodCA9IGhlaWdodDsKLSAgICAgICAgdGVtcF93aWR0aCA9IHdpZHRoOwotICAgICAgICB0ZW1wX3N0ZXBzX3ggPSBzdGVwX3hfbHU7Ci0gICAgICAgIHRlbXBfc3RlcHNfeSA9IHN0ZXBfeV9sdTsKLSAgICAgICAgdGVtcF9tYXNrID0gbWFza19sdTsKLSAgICAgICAgdGVtcF9hbW91bnQgPSBhbW91bnRfbHU7Ci0gICAgICAgIHRlbXBfc2NhbGViaXRzID0gc2NhbGViaXRzX2x1OwotICAgICAgICB0ZW1wX2hhbGZzY2FsZSA9IGhhbGZzY2FsZV9sdTsKLSAgICB9IGVsc2UgaWYgKChnbG9iYWxfaWQgPj0gd2lkdGggKiBoZWlnaHQpICYmIChnbG9iYWxfaWQgPCB3aWR0aCAqIGhlaWdodCArIGNoICogY3cpKSB7Ci0gICAgICAgIHkgPSAoZ2xvYmFsX2lkIC0gd2lkdGggKiBoZWlnaHQpIC8gY3c7Ci0gICAgICAgIHggPSAoZ2xvYmFsX2lkIC0gd2lkdGggKiBoZWlnaHQpICUgY3c7Ci0gICAgICAgIHRlbXBfZHN0ID0gZHN0X3U7Ci0gICAgICAgIHRlbXBfc3JjID0gc3JjX3U7Ci0gICAgICAgIHRlbXBfc3JjX3N0cmlkZSA9IHNyY19zdHJpZGVfY2g7Ci0gICAgICAgIHRlbXBfZHN0X3N0cmlkZSA9IGRzdF9zdHJpZGVfY2g7Ci0gICAgICAgIHRlbXBfaGVpZ2h0ID0gY2g7Ci0gICAgICAgIHRlbXBfd2lkdGggPSBjdzsKLSAgICAgICAgdGVtcF9zdGVwc194ID0gc3RlcF94X2NoOwotICAgICAgICB0ZW1wX3N0ZXBzX3kgPSBzdGVwX3lfY2g7Ci0gICAgICAgIHRlbXBfbWFzayA9IG1hc2tfY2g7Ci0gICAgICAgIHRlbXBfYW1vdW50ID0gYW1vdW50X2NoOwotICAgICAgICB0ZW1wX3NjYWxlYml0cyA9IHNjYWxlYml0c19jaDsKLSAgICAgICAgdGVtcF9oYWxmc2NhbGUgPSBoYWxmc2NhbGVfY2g7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgeSA9IChnbG9iYWxfaWQgLSB3aWR0aCAqIGhlaWdodCAtIGNoICogY3cpIC8gY3c7Ci0gICAgICAgIHggPSAoZ2xvYmFsX2lkIC0gd2lkdGggKiBoZWlnaHQgLSBjaCAqIGN3KSAlIGN3OwotICAgICAgICB0ZW1wX2RzdCA9IGRzdF92OwotICAgICAgICB0ZW1wX3NyYyA9IHNyY192OwotICAgICAgICB0ZW1wX3NyY19zdHJpZGUgPSBzcmNfc3RyaWRlX2NoOwotICAgICAgICB0ZW1wX2RzdF9zdHJpZGUgPSBkc3Rfc3RyaWRlX2NoOwotICAgICAgICB0ZW1wX2hlaWdodCA9IGNoOwotICAgICAgICB0ZW1wX3dpZHRoID0gY3c7Ci0gICAgICAgIHRlbXBfc3RlcHNfeCA9IHN0ZXBfeF9jaDsKLSAgICAgICAgdGVtcF9zdGVwc195ID0gc3RlcF95X2NoOwotICAgICAgICB0ZW1wX21hc2sgPSBtYXNrX2NoOwotICAgICAgICB0ZW1wX2Ftb3VudCA9IGFtb3VudF9jaDsKLSAgICAgICAgdGVtcF9zY2FsZWJpdHMgPSBzY2FsZWJpdHNfY2g7Ci0gICAgICAgIHRlbXBfaGFsZnNjYWxlID0gaGFsZnNjYWxlX2NoOwotICAgIH0KLSAgICBpZiAodGVtcF9hbW91bnQpIHsKLSAgICAgICAgc3VtID0gMDsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8PSAyICogdGVtcF9zdGVwc195OyBqKyspIHsKLSAgICAgICAgICAgIGlkeF95ID0gKHkgLSB0ZW1wX3N0ZXBzX3kgKyBqKSA8PSAwID8gMCA6ICh5IC0gdGVtcF9zdGVwc195ICsgaikgPj0gdGVtcF9oZWlnaHQgPyB0ZW1wX2hlaWdodC0xIDogeSAtIHRlbXBfc3RlcHNfeSArIGo7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IDIgKiB0ZW1wX3N0ZXBzX3g7IGkrKykgewotICAgICAgICAgICAgICAgIGlkeF94ID0gKHggLSB0ZW1wX3N0ZXBzX3ggKyBpKSA8PSAwID8gMCA6ICh4IC0gdGVtcF9zdGVwc194ICsgaSkgPj0gdGVtcF93aWR0aCA/IHRlbXBfd2lkdGgtMSA6IHggLSB0ZW1wX3N0ZXBzX3ggKyBpOwotICAgICAgICAgICAgICAgIHN1bSArPSB0ZW1wX21hc2tbaSArIGogKiAoMiAqIHRlbXBfc3RlcHNfeCArIDEpXSAqIHRlbXBfc3JjW2lkeF94ICsgaWR4X3kgKiB0ZW1wX3NyY19zdHJpZGVdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHRlbXAgPSAoaW50KXRlbXBfc3JjW3ggKyB5ICogdGVtcF9zcmNfc3RyaWRlXTsKLSAgICAgICAgcmVzID0gdGVtcCArICgoKHRlbXAgLSAoaW50KSgoc3VtICsgdGVtcF9oYWxmc2NhbGUpID4+IHRlbXBfc2NhbGViaXRzKSkgKiB0ZW1wX2Ftb3VudCkgPj4gMTYpOwotICAgICAgICB0ZW1wX2RzdFt4ICsgeSAqIHRlbXBfZHN0X3N0cmlkZV0gPSBjbGlwX3VpbnQ4KHJlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdGVtcF9kc3RbeCArIHkgKiB0ZW1wX2RzdF9zdHJpZGVdID0gdGVtcF9zcmNbeCArIHkgKiB0ZW1wX3NyY19zdHJpZGVdOwotICAgIH0KLX0KLSk7Ci0KLSNlbmRpZiAvKiBBVkZJTFRFUl9VTlNIQVJQX09QRU5DTF9LRVJORUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmFhcGlfdnBwLmMgYi9saWJhdmZpbHRlci92YWFwaV92cHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWJiYzNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmFhcGlfdnBwLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2YWFwaV92cHAuaCIKKworaW50IGZmX3ZhYXBpX3ZwcF9xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfVkFBUEksIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9OworICAgIGludCBlcnI7CisKKyAgICBpZiAoKGVyciA9IGZmX2Zvcm1hdHNfcmVmKGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2Y3R4LT5pbnB1dHNbMF0tPm91dF9mb3JtYXRzKSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIGlmICgoZXJyID0gZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpKSA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl92YWFwaV92cHBfcGlwZWxpbmVfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElWUFBDb250ZXh0ICpjdHggICA9IGF2Y3R4LT5wcml2OworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2ZpbHRlcl9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgaWYgKGN0eC0+ZmlsdGVyX2J1ZmZlcnNbaV0gIT0gVkFfSU5WQUxJRF9JRCkgeworICAgICAgICAgICAgdmFEZXN0cm95QnVmZmVyKGN0eC0+aHdjdHgtPmRpc3BsYXksIGN0eC0+ZmlsdGVyX2J1ZmZlcnNbaV0pOworICAgICAgICAgICAgY3R4LT5maWx0ZXJfYnVmZmVyc1tpXSA9IFZBX0lOVkFMSURfSUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgY3R4LT5uYl9maWx0ZXJfYnVmZmVycyA9IDA7CisKKyAgICBpZiAoY3R4LT52YV9jb250ZXh0ICE9IFZBX0lOVkFMSURfSUQpIHsKKyAgICAgICAgdmFEZXN0cm95Q29udGV4dChjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQpOworICAgICAgICBjdHgtPnZhX2NvbnRleHQgPSBWQV9JTlZBTElEX0lEOworICAgIH0KKworICAgIGlmIChjdHgtPnZhX2NvbmZpZyAhPSBWQV9JTlZBTElEX0lEKSB7CisgICAgICAgIHZhRGVzdHJveUNvbmZpZyhjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbmZpZyk7CisgICAgICAgIGN0eC0+dmFfY29uZmlnID0gVkFfSU5WQUxJRF9JRDsKKyAgICB9CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+ZGV2aWNlX3JlZik7CisgICAgY3R4LT5od2N0eCA9IE5VTEw7Cit9CisKK2ludCBmZl92YWFwaV92cHBfY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqYXZjdHggPSBpbmxpbmstPmRzdDsKKyAgICBWQUFQSVZQUENvbnRleHQgKmN0eCAgID0gYXZjdHgtPnByaXY7CisKKyAgICBpZiAoY3R4LT5waXBlbGluZV91bmluaXQpCisgICAgICAgIGN0eC0+cGlwZWxpbmVfdW5pbml0KGF2Y3R4KTsKKworICAgIGlmICghaW5saW5rLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQSBoYXJkd2FyZSBmcmFtZXMgcmVmZXJlbmNlIGlzICIKKyAgICAgICAgICAgICAgICJyZXF1aXJlZCB0byBhc3NvY2lhdGUgdGhlIHByb2Nlc3NpbmcgZGV2aWNlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY3R4LT5pbnB1dF9mcmFtZXNfcmVmID0gYXZfYnVmZmVyX3JlZihpbmxpbmstPmh3X2ZyYW1lc19jdHgpOworICAgIGlmICghY3R4LT5pbnB1dF9mcmFtZXNfcmVmKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQSBpbnB1dCBmcmFtZXMgcmVmZXJlbmNlIGNyZWF0ZSAiCisgICAgICAgICAgICAgICAiZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGN0eC0+aW5wdXRfZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0KiljdHgtPmlucHV0X2ZyYW1lc19yZWYtPmRhdGE7CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX3ZhYXBpX3ZwcF9jb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmF2Y3R4ID0gb3V0bGluay0+c3JjOworICAgIFZBQVBJVlBQQ29udGV4dCAqY3R4ICAgPSBhdmN0eC0+cHJpdjsKKyAgICBBVlZBQVBJSFdDb25maWcgKmh3Y29uZmlnID0gTlVMTDsKKyAgICBBVkhXRnJhbWVzQ29uc3RyYWludHMgKmNvbnN0cmFpbnRzID0gTlVMTDsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqb3V0cHV0X2ZyYW1lczsKKyAgICBBVlZBQVBJRnJhbWVzQ29udGV4dCAqdmFfZnJhbWVzOworICAgIFZBU3RhdHVzIHZhczsKKyAgICBpbnQgZXJyLCBpOworCisgICAgaWYgKGN0eC0+cGlwZWxpbmVfdW5pbml0KQorICAgICAgICBjdHgtPnBpcGVsaW5lX3VuaW5pdChhdmN0eCk7CisKKyAgICBpZiAoIWN0eC0+b3V0cHV0X3dpZHRoKQorICAgICAgICBjdHgtPm91dHB1dF93aWR0aCAgPSBhdmN0eC0+aW5wdXRzWzBdLT53OworICAgIGlmICghY3R4LT5vdXRwdXRfaGVpZ2h0KQorICAgICAgICBjdHgtPm91dHB1dF9oZWlnaHQgPSBhdmN0eC0+aW5wdXRzWzBdLT5oOworCisgICAgYXZfYXNzZXJ0MChjdHgtPmlucHV0X2ZyYW1lcyk7CisgICAgY3R4LT5kZXZpY2VfcmVmID0gYXZfYnVmZmVyX3JlZihjdHgtPmlucHV0X2ZyYW1lcy0+ZGV2aWNlX3JlZik7CisgICAgaWYgKCFjdHgtPmRldmljZV9yZWYpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBIGRldmljZSByZWZlcmVuY2UgY3JlYXRlICIKKyAgICAgICAgICAgICAgICJmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgY3R4LT5od2N0eCA9ICgoQVZIV0RldmljZUNvbnRleHQqKWN0eC0+ZGV2aWNlX3JlZi0+ZGF0YSktPmh3Y3R4OworCisgICAgYXZfYXNzZXJ0MChjdHgtPnZhX2NvbmZpZyA9PSBWQV9JTlZBTElEX0lEKTsKKyAgICB2YXMgPSB2YUNyZWF0ZUNvbmZpZyhjdHgtPmh3Y3R4LT5kaXNwbGF5LCBWQVByb2ZpbGVOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFZBRW50cnlwb2ludFZpZGVvUHJvYywgTlVMTCwgMCwgJmN0eC0+dmFfY29uZmlnKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBwcm9jZXNzaW5nIHBpcGVsaW5lICIKKyAgICAgICAgICAgICAgICJjb25maWc6ICVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGh3Y29uZmlnID0gYXZfaHdkZXZpY2VfaHdjb25maWdfYWxsb2MoY3R4LT5kZXZpY2VfcmVmKTsKKyAgICBpZiAoIWh3Y29uZmlnKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBod2NvbmZpZy0+Y29uZmlnX2lkID0gY3R4LT52YV9jb25maWc7CisKKyAgICBjb25zdHJhaW50cyA9IGF2X2h3ZGV2aWNlX2dldF9od2ZyYW1lX2NvbnN0cmFpbnRzKGN0eC0+ZGV2aWNlX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3Y29uZmlnKTsKKyAgICBpZiAoIWNvbnN0cmFpbnRzKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChjdHgtPm91dHB1dF9mb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKQorICAgICAgICBjdHgtPm91dHB1dF9mb3JtYXQgPSBjdHgtPmlucHV0X2ZyYW1lcy0+c3dfZm9ybWF0OworICAgIGlmIChjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cykgeworICAgICAgICBmb3IgKGkgPSAwOyBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0c1tpXSAhPSBBVl9QSVhfRk1UX05PTkU7IGkrKykgeworICAgICAgICAgICAgaWYgKGN0eC0+b3V0cHV0X2Zvcm1hdCA9PSBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0c1tpXSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHNbaV0gPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0ICIKKyAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVzLlxuIiwgYXZfZ2V0X3BpeF9mbXRfbmFtZShjdHgtPm91dHB1dF9mb3JtYXQpKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdHgtPm91dHB1dF93aWR0aCAgPCBjb25zdHJhaW50cy0+bWluX3dpZHRoICB8fAorICAgICAgICBjdHgtPm91dHB1dF9oZWlnaHQgPCBjb25zdHJhaW50cy0+bWluX2hlaWdodCB8fAorICAgICAgICBjdHgtPm91dHB1dF93aWR0aCAgPiBjb25zdHJhaW50cy0+bWF4X3dpZHRoICB8fAorICAgICAgICBjdHgtPm91dHB1dF9oZWlnaHQgPiBjb25zdHJhaW50cy0+bWF4X2hlaWdodCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgc2NhbGluZyB0byAiCisgICAgICAgICAgICAgICAic2l6ZSAlZHglZCAoY29uc3RyYWludHM6IHdpZHRoICVkLSVkIGhlaWdodCAlZC0lZCkuXG4iLAorICAgICAgICAgICAgICAgY3R4LT5vdXRwdXRfd2lkdGgsIGN0eC0+b3V0cHV0X2hlaWdodCwKKyAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLT5taW5fd2lkdGgsICBjb25zdHJhaW50cy0+bWF4X3dpZHRoLAorICAgICAgICAgICAgICAgY29uc3RyYWludHMtPm1pbl9oZWlnaHQsIGNvbnN0cmFpbnRzLT5tYXhfaGVpZ2h0KTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb3V0bGluay0+aHdfZnJhbWVzX2N0eCA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGN0eC0+ZGV2aWNlX3JlZik7CisgICAgaWYgKCFvdXRsaW5rLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBIVyBmcmFtZSBjb250ZXh0ICIKKyAgICAgICAgICAgICAgICJmb3Igb3V0cHV0LlxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG91dHB1dF9mcmFtZXMgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKW91dGxpbmstPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICBvdXRwdXRfZnJhbWVzLT5mb3JtYXQgICAgPSBBVl9QSVhfRk1UX1ZBQVBJOworICAgIG91dHB1dF9mcmFtZXMtPnN3X2Zvcm1hdCA9IGN0eC0+b3V0cHV0X2Zvcm1hdDsKKyAgICBvdXRwdXRfZnJhbWVzLT53aWR0aCAgICAgPSBjdHgtPm91dHB1dF93aWR0aDsKKyAgICBvdXRwdXRfZnJhbWVzLT5oZWlnaHQgICAgPSBjdHgtPm91dHB1dF9oZWlnaHQ7CisKKyAgICBvdXRwdXRfZnJhbWVzLT5pbml0aWFsX3Bvb2xfc2l6ZSA9IDQ7CisKKyAgICBlcnIgPSBmZl9maWx0ZXJfaW5pdF9od19mcmFtZXMoYXZjdHgsIG91dGxpbmssIDEwKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXJyID0gYXZfaHdmcmFtZV9jdHhfaW5pdChvdXRsaW5rLT5od19mcmFtZXNfY3R4KTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXNlIFZBQVBJIGZyYW1lICIKKyAgICAgICAgICAgICAgICJjb250ZXh0IGZvciBvdXRwdXQ6ICVkXG4iLCBlcnIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgdmFfZnJhbWVzID0gb3V0cHV0X2ZyYW1lcy0+aHdjdHg7CisKKyAgICBhdl9hc3NlcnQwKGN0eC0+dmFfY29udGV4dCA9PSBWQV9JTlZBTElEX0lEKTsKKyAgICB2YXMgPSB2YUNyZWF0ZUNvbnRleHQoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b3V0cHV0X3dpZHRoLCBjdHgtPm91dHB1dF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZBX1BST0dSRVNTSVZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9mcmFtZXMtPnN1cmZhY2VfaWRzLCB2YV9mcmFtZXMtPm5iX3N1cmZhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT52YV9jb250ZXh0KTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBwcm9jZXNzaW5nIHBpcGVsaW5lICIKKyAgICAgICAgICAgICAgICJjb250ZXh0OiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIG91dGxpbmstPncgPSBjdHgtPm91dHB1dF93aWR0aDsKKyAgICBvdXRsaW5rLT5oID0gY3R4LT5vdXRwdXRfaGVpZ2h0OworCisgICAgaWYgKGN0eC0+YnVpbGRfZmlsdGVyX3BhcmFtcykgeworICAgICAgICBlcnIgPSBjdHgtPmJ1aWxkX2ZpbHRlcl9wYXJhbXMoYXZjdHgpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmaHdjb25maWcpOworICAgIGF2X2h3ZnJhbWVfY29uc3RyYWludHNfZnJlZSgmY29uc3RyYWludHMpOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2J1ZmZlcl91bnJlZigmb3V0bGluay0+aHdfZnJhbWVzX2N0eCk7CisgICAgYXZfZnJlZXAoJmh3Y29uZmlnKTsKKyAgICBhdl9od2ZyYW1lX2NvbnN0cmFpbnRzX2ZyZWUoJmNvbnN0cmFpbnRzKTsKKyAgICByZXR1cm4gZXJyOworfQorCitpbnQgZmZfdmFhcGlfdnBwX2NvbG91cl9zdGFuZGFyZChlbnVtIEFWQ29sb3JTcGFjZSBhdl9jcykKK3sKKyAgICBzd2l0Y2goYXZfY3MpIHsKKyNkZWZpbmUgQ1MoYXYsIHZhKSBjYXNlIEFWQ09MX1NQQ18gIyMgYXY6IHJldHVybiBWQVByb2NDb2xvclN0YW5kYXJkICMjIHZhOworICAgICAgICBDUyhCVDcwOSwgICAgIEJUNzA5KTsKKyAgICAgICAgQ1MoQlQ0NzBCRywgICBCVDYwMSk7CisgICAgICAgIENTKFNNUFRFMTcwTSwgU01QVEUxNzBNKTsKKyAgICAgICAgQ1MoU01QVEUyNDBNLCBTTVBURTI0ME0pOworI3VuZGVmIENTCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFZBUHJvY0NvbG9yU3RhbmRhcmROb25lOworICAgIH0KK30KKworaW50IGZmX3ZhYXBpX3ZwcF9tYWtlX3BhcmFtX2J1ZmZlcnMoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KQoreworICAgIFZBU3RhdHVzIHZhczsKKyAgICBWQUJ1ZmZlcklEIGJ1ZmZlcjsKKyAgICBWQUFQSVZQUENvbnRleHQgKmN0eCAgID0gYXZjdHgtPnByaXY7CisKKyAgICBhdl9hc3NlcnQwKGN0eC0+bmJfZmlsdGVyX2J1ZmZlcnMgKyAxIDw9IFZBUHJvY0ZpbHRlckNvdW50KTsKKworICAgIHZhcyA9IHZhQ3JlYXRlQnVmZmVyKGN0eC0+aHdjdHgtPmRpc3BsYXksIGN0eC0+dmFfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBzaXplLCBjb3VudCwgKHZvaWQqKWRhdGEsICZidWZmZXIpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIHBhcmFtZXRlciAiCisgICAgICAgICAgICAgICAiYnVmZmVyICh0eXBlICVkKTogJWQgKCVzKS5cbiIsCisgICAgICAgICAgICAgICB0eXBlLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgY3R4LT5maWx0ZXJfYnVmZmVyc1tjdHgtPm5iX2ZpbHRlcl9idWZmZXJzKytdID0gYnVmZmVyOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJQYXJhbSBidWZmZXIgKHR5cGUgJWQsICV6dSBieXRlcywgY291bnQgJWQpICIKKyAgICAgICAgICAgImlzICUjeC5cbiIsIHR5cGUsIHNpemUsIGNvdW50LCBidWZmZXIpOworICAgIHJldHVybiAwOworfQorCisKK2ludCBmZl92YWFwaV92cHBfcmVuZGVyX3BpY3R1cmUoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFQcm9jUGlwZWxpbmVQYXJhbWV0ZXJCdWZmZXIgKnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFTdXJmYWNlSUQgb3V0cHV0X3N1cmZhY2UpCit7CisgICAgVkFCdWZmZXJJRCBwYXJhbXNfaWQ7CisgICAgVkFTdGF0dXMgdmFzOworICAgIGludCBlcnIgPSAwOworICAgIFZBQVBJVlBQQ29udGV4dCAqY3R4ICAgPSBhdmN0eC0+cHJpdjsKKworICAgIHZhcyA9IHZhQmVnaW5QaWN0dXJlKGN0eC0+aHdjdHgtPmRpc3BsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT52YV9jb250ZXh0LCBvdXRwdXRfc3VyZmFjZSk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhdHRhY2ggbmV3IHBpY3R1cmU6ICIKKyAgICAgICAgICAgICAgICIlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICB2YXMgPSB2YUNyZWF0ZUJ1ZmZlcihjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVkFQcm9jUGlwZWxpbmVQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcGFyYW1zKSwgMSwgcGFyYW1zLCAmcGFyYW1zX2lkKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBwYXJhbWV0ZXIgYnVmZmVyOiAiCisgICAgICAgICAgICAgICAiJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWxfYWZ0ZXJfYmVnaW47CisgICAgfQorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUGlwZWxpbmUgcGFyYW1ldGVyIGJ1ZmZlciBpcyAlI3guXG4iLAorICAgICAgICAgICBwYXJhbXNfaWQpOworCisgICAgdmFzID0gdmFSZW5kZXJQaWN0dXJlKGN0eC0+aHdjdHgtPmRpc3BsYXksIGN0eC0+dmFfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtc19pZCwgMSk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZW5kZXIgcGFyYW1ldGVyIGJ1ZmZlcjogIgorICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsX2FmdGVyX2JlZ2luOworICAgIH0KKworICAgIHZhcyA9IHZhRW5kUGljdHVyZShjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc3RhcnQgcGljdHVyZSBwcm9jZXNzaW5nOiAiCisgICAgICAgICAgICAgICAiJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWxfYWZ0ZXJfcmVuZGVyOworICAgIH0KKworICAgIGlmIChDT05GSUdfVkFBUElfMSB8fCBjdHgtPmh3Y3R4LT5kcml2ZXJfcXVpcmtzICYKKyAgICAgICAgQVZfVkFBUElfRFJJVkVSX1FVSVJLX1JFTkRFUl9QQVJBTV9CVUZGRVJTKSB7CisgICAgICAgIHZhcyA9IHZhRGVzdHJveUJ1ZmZlcihjdHgtPmh3Y3R4LT5kaXNwbGF5LCBwYXJhbXNfaWQpOworICAgICAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBmcmVlIHBhcmFtZXRlciBidWZmZXI6ICIKKyAgICAgICAgICAgICAgICAgICAiJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgICAgIC8vIEFuZCBpZ25vcmUuCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworICAgIC8vIFdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoYXQgaWYgdmFCZWdpblBpY3R1cmUgaGFzIGJlZW4gY2FsbGVkLCB3ZSBhbHNvCisgICAgLy8gY2FsbCB2YVJlbmRlclBpY3R1cmUgYW5kIHZhRW5kUGljdHVyZS4gIFRoZXNlIGNhbGxzIG1heSB3ZWxsIGZhaWwgb3IKKyAgICAvLyBkbyBzb21ldGhpbmcgZWxzZSBuYXN0eSwgYnV0IG9uY2Ugd2UncmUgaW4gdGhpcyBmYWlsdXJlIGNhc2UgdGhlcmUKKyAgICAvLyBpc24ndCBtdWNoIGVsc2Ugd2UgY2FuIGRvLgorZmFpbF9hZnRlcl9iZWdpbjoKKyAgICB2YVJlbmRlclBpY3R1cmUoY3R4LT5od2N0eC0+ZGlzcGxheSwgY3R4LT52YV9jb250ZXh0LCAmcGFyYW1zX2lkLCAxKTsKK2ZhaWxfYWZ0ZXJfcmVuZGVyOgorICAgIHZhRW5kUGljdHVyZShjdHgtPmh3Y3R4LT5kaXNwbGF5LCBjdHgtPnZhX2NvbnRleHQpOworZmFpbDoKKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIGZmX3ZhYXBpX3ZwcF9jdHhfaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIGludCBpOworICAgIFZBQVBJVlBQQ29udGV4dCAqY3R4ICAgPSBhdmN0eC0+cHJpdjsKKworICAgIGN0eC0+dmFfY29uZmlnICA9IFZBX0lOVkFMSURfSUQ7CisgICAgY3R4LT52YV9jb250ZXh0ID0gVkFfSU5WQUxJRF9JRDsKKyAgICBjdHgtPnZhbGlkX2lkcyAgPSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IFZBUHJvY0ZpbHRlckNvdW50OyBpKyspCisgICAgICAgIGN0eC0+ZmlsdGVyX2J1ZmZlcnNbaV0gPSBWQV9JTlZBTElEX0lEOworICAgIGN0eC0+bmJfZmlsdGVyX2J1ZmZlcnMgPSAwOworfQorCit2b2lkIGZmX3ZhYXBpX3ZwcF9jdHhfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElWUFBDb250ZXh0ICpjdHggICA9IGF2Y3R4LT5wcml2OworICAgIGlmIChjdHgtPnZhbGlkX2lkcyAmJiBjdHgtPnBpcGVsaW5lX3VuaW5pdCkKKyAgICAgICAgY3R4LT5waXBlbGluZV91bmluaXQoYXZjdHgpOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPmlucHV0X2ZyYW1lc19yZWYpOworICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5kZXZpY2VfcmVmKTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZhYXBpX3ZwcC5oIGIvbGliYXZmaWx0ZXIvdmFhcGlfdnBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJjMzEwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZhYXBpX3ZwcC5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZJTFRFUl9WQUFQSV9WUFBfSAorI2RlZmluZSBBVkZJTFRFUl9WQUFQSV9WUFBfSAorCisjaW5jbHVkZSA8dmEvdmEuaD4KKyNpbmNsdWRlIDx2YS92YV92cHAuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X3ZhYXBpLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorCit0eXBlZGVmIHN0cnVjdCBWQUFQSVZQUENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmh3Y3R4OworICAgIEFWQnVmZmVyUmVmICpkZXZpY2VfcmVmOworCisgICAgaW50IHZhbGlkX2lkczsKKyAgICBWQUNvbmZpZ0lEICB2YV9jb25maWc7CisgICAgVkFDb250ZXh0SUQgdmFfY29udGV4dDsKKworICAgIEFWQnVmZmVyUmVmICAgICAgICppbnB1dF9mcmFtZXNfcmVmOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICppbnB1dF9mcmFtZXM7CisKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0cHV0X2Zvcm1hdDsKKyAgICBpbnQgb3V0cHV0X3dpZHRoOyAgIC8vIGNvbXB1dGVkIHdpZHRoCisgICAgaW50IG91dHB1dF9oZWlnaHQ7ICAvLyBjb21wdXRlZCBoZWlnaHQKKworICAgIFZBQnVmZmVySUQgICAgICAgICBmaWx0ZXJfYnVmZmVyc1tWQVByb2NGaWx0ZXJDb3VudF07CisgICAgaW50ICAgICAgICAgICAgICAgIG5iX2ZpbHRlcl9idWZmZXJzOworCisgICAgaW50ICgqYnVpbGRfZmlsdGVyX3BhcmFtcykoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCk7CisKKyAgICB2b2lkICgqcGlwZWxpbmVfdW5pbml0KShBVkZpbHRlckNvbnRleHQgKmF2Y3R4KTsKK30gVkFBUElWUFBDb250ZXh0OworCit2b2lkIGZmX3ZhYXBpX3ZwcF9jdHhfaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KTsKKwordm9pZCBmZl92YWFwaV92cHBfY3R4X3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KTsKKworaW50IGZmX3ZhYXBpX3ZwcF9xdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpOworCit2b2lkIGZmX3ZhYXBpX3ZwcF9waXBlbGluZV91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCk7CisKK2ludCBmZl92YWFwaV92cHBfY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKTsKKworaW50IGZmX3ZhYXBpX3ZwcF9jb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluayk7CisKK2ludCBmZl92YWFwaV92cHBfY29sb3VyX3N0YW5kYXJkKGVudW0gQVZDb2xvclNwYWNlIGF2X2NzKTsKKworaW50IGZmX3ZhYXBpX3ZwcF9tYWtlX3BhcmFtX2J1ZmZlcnMoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50KTsKKworaW50IGZmX3ZhYXBpX3ZwcF9yZW5kZXJfcGljdHVyZShBVkZpbHRlckNvbnRleHQgKmF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVByb2NQaXBlbGluZVBhcmFtZXRlckJ1ZmZlciAqcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVN1cmZhY2VJRCBvdXRwdXRfc3VyZmFjZSk7CisKKyNlbmRpZiAvKiBBVkZJTFRFUl9WQUFQSV9WUFBfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmFmX3NwZWN0cnVtc3ludGguYyBiL2xpYmF2ZmlsdGVyL3ZhZl9zcGVjdHJ1bXN5bnRoLmMKaW5kZXggOGQ0MDE0ZS4uZmVkMmNiYiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmFmX3NwZWN0cnVtc3ludGguYworKysgYi9saWJhdmZpbHRlci92YWZfc3BlY3RydW1zeW50aC5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy9hdmZmdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZm1hdGguaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgpAQCAtMjA5LDcgKzIxMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+d2luZG93X2Z1bmNfbHV0KSk7CiAgICAgaWYgKCFzLT53aW5kb3dfZnVuY19sdXQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgZmZfZ2VuZXJhdGVfd2luZG93X2Z1bmMocy0+d2luZG93X2Z1bmNfbHV0LCBzLT53aW5fc2l6ZSwgcy0+d2luX2Z1bmMsICZvdmVybGFwKTsKKyAgICBnZW5lcmF0ZV93aW5kb3dfZnVuYyhzLT53aW5kb3dfZnVuY19sdXQsIHMtPndpbl9zaXplLCBzLT53aW5fZnVuYywgJm92ZXJsYXApOwogICAgIGlmIChzLT5vdmVybGFwID09IDEpCiAgICAgICAgIHMtPm92ZXJsYXAgPSBvdmVybGFwOwogICAgIHMtPmhvcF9zaXplID0gKDEgLSBzLT5vdmVybGFwKSAqIHMtPndpbl9zaXplOwpAQCAtNDE4LDYgKzQxOSw4IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92ZXJzaW9uLmggYi9saWJhdmZpbHRlci92ZXJzaW9uLmgKaW5kZXggMWZlNzc1Ny4uODc0NjhkZiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmVyc2lvbi5oCisrKyBiL2xpYmF2ZmlsdGVyL3ZlcnNpb24uaApAQCAtMjksOCArMjksOCBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL3ZlcnNpb24uaCIKIAotI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01BSk9SICAgNgotI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01JTk9SICAzMQorI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01BSk9SICAgNworI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01JTk9SICAxNgogI2RlZmluZSBMSUJBVkZJTFRFUl9WRVJTSU9OX01JQ1JPIDEwMAogCiAjZGVmaW5lIExJQkFWRklMVEVSX1ZFUlNJT05fSU5UIEFWX1ZFUlNJT05fSU5UKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IsIFwKQEAgLTQ5LDIzICs0OSwxNyBAQAogICogdGhlIHB1YmxpYyBBUEkgYW5kIG1heSBjaGFuZ2UsIGJyZWFrIG9yIGRpc2FwcGVhciBhdCBhbnkgdGltZS4KICAqLwogCi0jaWZuZGVmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSNkZWZpbmUgRkZfQVBJX09MRF9GSUxURVJfT1BUUyAgICAgICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA3KQotI2VuZGlmCiAjaWZuZGVmIEZGX0FQSV9PTERfRklMVEVSX09QVFNfRVJST1IKLSNkZWZpbmUgRkZfQVBJX09MRF9GSUxURVJfT1BUU19FUlJPUiAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA3KQorI2RlZmluZSBGRl9BUElfT0xEX0ZJTFRFUl9PUFRTX0VSUk9SICAgICAgICAoTElCQVZGSUxURVJfVkVSU0lPTl9NQUpPUiA8IDgpCiAjZW5kaWYKLSNpZm5kZWYgRkZfQVBJX0FWRklMVEVSX09QRU4KLSNkZWZpbmUgRkZfQVBJX0FWRklMVEVSX09QRU4gICAgICAgICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA3KQorI2lmbmRlZiBGRl9BUElfTEFWUl9PUFRTCisjZGVmaW5lIEZGX0FQSV9MQVZSX09QVFMgICAgICAgICAgICAgICAgICAgIChMSUJBVkZJTFRFUl9WRVJTSU9OX01BSk9SIDwgOCkKICNlbmRpZgotI2lmbmRlZiBGRl9BUElfQVZGSUxURVJfSU5JVF9GSUxURVIKLSNkZWZpbmUgRkZfQVBJX0FWRklMVEVSX0lOSVRfRklMVEVSICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA3KQorI2lmbmRlZiBGRl9BUElfRklMVEVSX0dFVF9TRVQKKyNkZWZpbmUgRkZfQVBJX0ZJTFRFUl9HRVRfU0VUICAgICAgICAgICAgICAgKExJQkFWRklMVEVSX1ZFUlNJT05fTUFKT1IgPCA4KQogI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9PTERfRklMVEVSX1JFR0lTVEVSCi0jZGVmaW5lIEZGX0FQSV9PTERfRklMVEVSX1JFR0lTVEVSICAgICAgICAgIChMSUJBVkZJTFRFUl9WRVJTSU9OX01BSk9SIDwgNykKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfTk9DT05TVF9HRVRfTkFNRQotI2RlZmluZSBGRl9BUElfTk9DT05TVF9HRVRfTkFNRSAgICAgICAgICAgICAoTElCQVZGSUxURVJfVkVSU0lPTl9NQUpPUiA8IDcpCisjaWZuZGVmIEZGX0FQSV9ORVhUCisjZGVmaW5lIEZGX0FQSV9ORVhUICAgICAgICAgICAgICAgICAgICAgICAgIChMSUJBVkZJTFRFUl9WRVJTSU9OX01BSk9SIDwgOCkKICNlbmRpZgogCiAjZW5kaWYgLyogQVZGSUxURVJfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9hbHBoYW1lcmdlLmMgYi9saWJhdmZpbHRlci92Zl9hbHBoYW1lcmdlLmMKaW5kZXggYThhOGQ1Ni4uNDVmYTM0MCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfYWxwaGFtZXJnZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2FscGhhbWVyZ2UuYwpAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKICNpbmNsdWRlICJidWZmZXJxdWV1ZS5oIgpAQCAtMzUsNyArMzYsNyBAQAogCiBlbnVtIHsgWSwgVSwgViwgQSB9OwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBBbHBoYU1lcmdlQ29udGV4dCB7CiAgICAgaW50IGlzX3BhY2tlZF9yZ2I7CiAgICAgdWludDhfdCByZ2JhX21hcFs0XTsKICAgICBzdHJ1Y3QgRkZCdWZRdWV1ZSBxdWV1ZV9tYWluOwpAQCAtNTMsNiArNTQsNyBAQAogewogICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbWFpbl9mbXRzW10gPSB7CiAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAsCiAgICAgICAgIEFWX1BJWF9GTVRfUkdCQSwgQVZfUElYX0ZNVF9CR1JBLCBBVl9QSVhfRk1UX0FSR0IsIEFWX1BJWF9GTVRfQUJHUiwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKQEAgLTg0LDcgKzg2LDggQEAKIHsKICAgICBBbHBoYU1lcmdlQ29udGV4dCAqbWVyZ2UgPSBpbmxpbmstPmRzdC0+cHJpdjsKICAgICBtZXJnZS0+aXNfcGFja2VkX3JnYiA9Ci0gICAgICAgIGZmX2ZpbGxfcmdiYV9tYXAobWVyZ2UtPnJnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCkgPj0gMDsKKyAgICAgICAgZmZfZmlsbF9yZ2JhX21hcChtZXJnZS0+cmdiYV9tYXAsIGlubGluay0+Zm9ybWF0KSA+PSAwICYmCisgICAgICAgIGlubGluay0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSQVA7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEyOSwxNCArMTMyLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpbnQgeTsKICAgICAgICAgY29uc3QgaW50IG1haW5fbGluZXNpemUgPSBtYWluX2J1Zi0+bGluZXNpemVbQV07CiAgICAgICAgIGNvbnN0IGludCBhbHBoYV9saW5lc2l6ZSA9IGFscGhhX2J1Zi0+bGluZXNpemVbWV07Ci0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBoICYmIHkgPCBhbHBoYV9idWYtPmhlaWdodDsgeSsrKSB7Ci0gICAgICAgICAgICBtZW1jcHkobWFpbl9idWYtPmRhdGFbQV0gKyB5ICogbWFpbl9saW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBhbHBoYV9idWYtPmRhdGFbWV0gKyB5ICogYWxwaGFfbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgRkZNSU4obWFpbl9saW5lc2l6ZSwgYWxwaGFfbGluZXNpemUpKTsKLSAgICAgICAgfQorICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG1haW5fYnVmLT5kYXRhW0FdLCBtYWluX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2J1Zi0+ZGF0YVtZXSwgYWxwaGFfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4obWFpbl9saW5lc2l6ZSwgYWxwaGFfbGluZXNpemUpLCBhbHBoYV9idWYtPmhlaWdodCk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9hc3BlY3QuYyBiL2xpYmF2ZmlsdGVyL3ZmX2FzcGVjdC5jCmluZGV4IGJmMzA4MjQuLmMwNDI2OTggMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2FzcGVjdC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2FzcGVjdC5jCkBAIC02MSwzNSArNjEsOSBAQAogICAgIEFWUmF0aW9uYWwgZGFyOwogICAgIEFWUmF0aW9uYWwgc2FyOwogICAgIGludCBtYXg7Ci0jaWYgRkZfQVBJX09MRF9GSUxURVJfT1BUUwotICAgIGZsb2F0IGFzcGVjdF9kZW47Ci0jZW5kaWYKICAgICBjaGFyICpyYXRpb19leHByOwogfSBBc3BlY3RDb250ZXh0OwogCi1zdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKLXsKLSNpZiBGRl9BUElfT0xEX0ZJTFRFUl9PUFRTCi0gICAgQXNwZWN0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgcmV0OwotCi0gICAgaWYgKHMtPnJhdGlvX2V4cHIgJiYgcy0+YXNwZWN0X2RlbiA+IDApIHsKLSAgICAgICAgZG91YmxlIG51bTsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAibnVtOmRlbiBzeW50YXggaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBudW0vZGVuIG9yIG5hbWVkIG9wdGlvbnMgaW5zdGVhZFxuIik7Ci0gICAgICAgIHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJm51bSwgcy0+cmF0aW9fZXhwciwgTlVMTCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlIHJhdGlvIG51bWVyYXRvciBcIiVzXCJcbiIsIHMtPnJhdGlvX2V4cHIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgfQotICAgICAgICBzLT5zYXIgPSBzLT5kYXIgPSBhdl9kMnEobnVtIC8gcy0+YXNwZWN0X2Rlbiwgcy0+bWF4KTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmZyYW1lKQogewogICAgIEFzcGVjdENvbnRleHQgKnMgPSBsaW5rLT5kc3QtPnByaXY7CkBAIC0xNTEsMzggKzEyNSwzNCBAQAogCiAjaWYgQ09ORklHX1NFVERBUl9GSUxURVIKIAotc3RhdGljIGludCBzZXRkYXJfY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQorc3RhdGljIGludCBzZXRkYXJfY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKIHsKLSAgICBBc3BlY3RDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBc3BlY3RDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIEFWUmF0aW9uYWwgZGFyOwogICAgIEFWUmF0aW9uYWwgb2xkX2RhcjsKICAgICBBVlJhdGlvbmFsIG9sZF9zYXIgPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CiAgICAgaW50IHJldDsKIAotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSAgICBpZiAoIShzLT5yYXRpb19leHByICYmIHMtPmFzcGVjdF9kZW4gPiAwKSkgewotI2VuZGlmCiAgICAgaWYgKChyZXQgPSBnZXRfYXNwZWN0X3JhdGlvKGlubGluaywgJnMtPmRhcikpKQogICAgICAgICByZXR1cm4gcmV0OwotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSAgICB9Ci0jZW5kaWYKIAogICAgIGlmIChzLT5kYXIubnVtICYmIHMtPmRhci5kZW4pIHsKICAgICAgICAgYXZfcmVkdWNlKCZzLT5zYXIubnVtLCAmcy0+c2FyLmRlbiwKICAgICAgICAgICAgICAgICAgICBzLT5kYXIubnVtICogaW5saW5rLT5oLAogICAgICAgICAgICAgICAgICAgIHMtPmRhci5kZW4gKiBpbmxpbmstPncsIElOVF9NQVgpOwotICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzLT5zYXI7CisgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzLT5zYXI7CiAgICAgICAgIGRhciA9IHMtPmRhcjsKICAgICB9IGVsc2UgewotICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDEsIDEgfTsKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgMSwgMSB9OwogICAgICAgICBkYXIgPSAoQVZSYXRpb25hbCl7IGlubGluay0+dywgaW5saW5rLT5oIH07CiAgICAgfQogCiAgICAgY29tcHV0ZV9kYXIoJm9sZF9kYXIsIG9sZF9zYXIsIGlubGluay0+dywgaW5saW5rLT5oKTsKLSAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19WRVJCT1NFLCAidzolZCBoOiVkIGRhcjolZC8lZCBzYXI6JWQvJWQgLT4gZGFyOiVkLyVkIHNhcjolZC8lZFxuIiwKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInc6JWQgaDolZCBkYXI6JWQvJWQgc2FyOiVkLyVkIC0+IGRhcjolZC8lZCBzYXI6JWQvJWRcbiIsCiAgICAgICAgICAgIGlubGluay0+dywgaW5saW5rLT5oLCBvbGRfZGFyLm51bSwgb2xkX2Rhci5kZW4sIG9sZF9zYXIubnVtLCBvbGRfc2FyLmRlbiwKLSAgICAgICAgICAgZGFyLm51bSwgZGFyLmRlbiwgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgICAgIGRhci5udW0sIGRhci5kZW4sIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTE5MSw5ICsxNjEsNiBAQAogICAgIHsgImRhciIsICAgInNldCBkaXNwbGF5IGFzcGVjdCByYXRpbyIsIE9GRlNFVChyYXRpb19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKICAgICB7ICJyYXRpbyIsICJzZXQgZGlzcGxheSBhc3BlY3QgcmF0aW8iLCBPRkZTRVQocmF0aW9fZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIjAiIH0sIC5mbGFncyA9IEZMQUdTIH0sCiAgICAgeyAiciIsICAgICAic2V0IGRpc3BsYXkgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHJhdGlvX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIwIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSAgICB7ICJkYXJfZGVuIiwgTlVMTCwgT0ZGU0VUKGFzcGVjdF9kZW4pLCBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMCB9LCAwLCBGTFRfTUFYLCBGTEFHUyB9LAotI2VuZGlmCiAgICAgeyAibWF4IiwgICAic2V0IG1heCB2YWx1ZSBmb3Igbm9taW5hdG9yIG9yIGRlbm9taW5hdG9yIGluIHRoZSByYXRpbyIsIE9GRlNFVChtYXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEwMH0sIDEsIElOVF9NQVgsIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0yMDQsNyArMTcxLDYgQEAKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5jb25maWdfcHJvcHMgPSBzZXRkYXJfY29uZmlnX3Byb3BzLAogICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KQEAgLTIxNCw2ICsxODAsNyBAQAogICAgIHsKICAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gc2V0ZGFyX2NvbmZpZ19wcm9wcywKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtMjIxLDcgKzE4OCw2IEBACiBBVkZpbHRlciBmZl92Zl9zZXRkYXIgPSB7CiAgICAgLm5hbWUgICAgICAgID0gInNldGRhciIsCiAgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNldCB0aGUgZnJhbWUgZGlzcGxheSBhc3BlY3QgcmF0aW8uIiksCi0gICAgLmluaXQgICAgICAgID0gaW5pdCwKICAgICAucHJpdl9zaXplICAgPSBzaXplb2YoQXNwZWN0Q29udGV4dCksCiAgICAgLnByaXZfY2xhc3MgID0gJnNldGRhcl9jbGFzcywKICAgICAuaW5wdXRzICAgICAgPSBhdmZpbHRlcl92Zl9zZXRkYXJfaW5wdXRzLApAQCAtMjMyLDI5ICsxOTgsMjUgQEAKIAogI2lmIENPTkZJR19TRVRTQVJfRklMVEVSCiAKLXN0YXRpYyBpbnQgc2V0c2FyX2NvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3N0YXRpYyBpbnQgc2V0c2FyX2NvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCiB7Ci0gICAgQXNwZWN0Q29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgQXNwZWN0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKICAgICBBVlJhdGlvbmFsIG9sZF9zYXIgPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CiAgICAgQVZSYXRpb25hbCBvbGRfZGFyLCBkYXI7CiAgICAgaW50IHJldDsKIAotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSAgICBpZiAoIShzLT5yYXRpb19leHByICYmIHMtPmFzcGVjdF9kZW4gPiAwKSkgewotI2VuZGlmCiAgICAgaWYgKChyZXQgPSBnZXRfYXNwZWN0X3JhdGlvKGlubGluaywgJnMtPnNhcikpKQogICAgICAgICByZXR1cm4gcmV0OwotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSAgICB9Ci0jZW5kaWYKIAotICAgIGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHMtPnNhcjsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcy0+c2FyOwogCiAgICAgY29tcHV0ZV9kYXIoJm9sZF9kYXIsIG9sZF9zYXIsIGlubGluay0+dywgaW5saW5rLT5oKTsKICAgICBjb21wdXRlX2RhcigmZGFyLCBzLT5zYXIsIGlubGluay0+dywgaW5saW5rLT5oKTsKLSAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19WRVJCT1NFLCAidzolZCBoOiVkIHNhcjolZC8lZCBkYXI6JWQvJWQgLT4gc2FyOiVkLyVkIGRhcjolZC8lZFxuIiwKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgInc6JWQgaDolZCBzYXI6JWQvJWQgZGFyOiVkLyVkIC0+IHNhcjolZC8lZCBkYXI6JWQvJWRcbiIsCiAgICAgICAgICAgIGlubGluay0+dywgaW5saW5rLT5oLCBvbGRfc2FyLm51bSwgb2xkX3Nhci5kZW4sIG9sZF9kYXIubnVtLCBvbGRfZGFyLmRlbiwKLSAgICAgICAgICAgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwgZGFyLm51bSwgZGFyLmRlbik7CisgICAgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwgZGFyLm51bSwgZGFyLmRlbik7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTI2Myw5ICsyMjUsNiBAQAogICAgIHsgInNhciIsICAgInNldCBzYW1wbGUgKHBpeGVsKSBhc3BlY3QgcmF0aW8iLCBPRkZTRVQocmF0aW9fZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIjAiIH0sIC5mbGFncyA9IEZMQUdTIH0sCiAgICAgeyAicmF0aW8iLCAic2V0IHNhbXBsZSAocGl4ZWwpIGFzcGVjdCByYXRpbyIsIE9GRlNFVChyYXRpb19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKICAgICB7ICJyIiwgICAgICJzZXQgc2FtcGxlIChwaXhlbCkgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHJhdGlvX2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIwIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAotI2lmIEZGX0FQSV9PTERfRklMVEVSX09QVFMKLSAgICB7ICJzYXJfZGVuIiwgTlVMTCwgT0ZGU0VUKGFzcGVjdF9kZW4pLCBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMCB9LCAwLCBGTFRfTUFYLCBGTEFHUyB9LAotI2VuZGlmCiAgICAgeyAibWF4IiwgICAic2V0IG1heCB2YWx1ZSBmb3Igbm9taW5hdG9yIG9yIGRlbm9taW5hdG9yIGluIHRoZSByYXRpbyIsIE9GRlNFVChtYXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEwMH0sIDEsIElOVF9NQVgsIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0yNzYsNyArMjM1LDYgQEAKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5jb25maWdfcHJvcHMgPSBzZXRzYXJfY29uZmlnX3Byb3BzLAogICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KQEAgLTI4Niw2ICsyNDQsNyBAQAogICAgIHsKICAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gc2V0c2FyX2NvbmZpZ19wcm9wcywKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtMjkzLDcgKzI1Miw2IEBACiBBVkZpbHRlciBmZl92Zl9zZXRzYXIgPSB7CiAgICAgLm5hbWUgICAgICAgID0gInNldHNhciIsCiAgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNldCB0aGUgcGl4ZWwgc2FtcGxlIGFzcGVjdCByYXRpby4iKSwKLSAgICAuaW5pdCAgICAgICAgPSBpbml0LAogICAgIC5wcml2X3NpemUgICA9IHNpemVvZihBc3BlY3RDb250ZXh0KSwKICAgICAucHJpdl9jbGFzcyAgPSAmc2V0c2FyX2NsYXNzLAogICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX3ZmX3NldHNhcl9pbnB1dHMsCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9hdGFkZW5vaXNlLmMgYi9saWJhdmZpbHRlci92Zl9hdGFkZW5vaXNlLmMKaW5kZXggYWEwOTAyMS4uMDNiNzcyYyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfYXRhZGVub2lzZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2F0YWRlbm9pc2UuYwpAQCAtMjUsNiArMjUsNyBAQAogICogRGF2aWQgQmFydG92xI1hayBhbmQgTWlyb3NsYXYgVnJhbmtpxIcKICAqLwogCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKQEAgLTQ0LDYgKzQ1LDcgQEAKICAgICBmbG9hdCBmdGhyYVs0XSwgZnRocmJbNF07CiAgICAgaW50IHRocmFbNF0sIHRocmJbNF07CiAKKyAgICBpbnQgcGxhbmVzOwogICAgIGludCBuYl9wbGFuZXM7CiAgICAgaW50IHBsYW5ld2lkdGhbNF07CiAgICAgaW50IHBsYW5laGVpZ2h0WzRdOwpAQCAtNjcsNyArNjksOCBAQAogICAgIHsgIjFiIiwgInNldCB0aHJlc2hvbGQgQiBmb3IgMm5kIHBsYW5lIiwgT0ZGU0VUKGZ0aHJiWzFdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMDR9LCAwLCA1LjAsIEZMQUdTIH0sCiAgICAgeyAiMmEiLCAic2V0IHRocmVzaG9sZCBBIGZvciAzcmQgcGxhbmUiLCBPRkZTRVQoZnRocmFbMl0pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC4wMn0sIDAsIDAuMywgRkxBR1MgfSwKICAgICB7ICIyYiIsICJzZXQgdGhyZXNob2xkIEIgZm9yIDNyZCBwbGFuZSIsIE9GRlNFVChmdGhyYlsyXSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjA0fSwgMCwgNS4wLCBGTEFHUyB9LAotICAgIHsgInMiLCAgInNldCBob3cgbWFueSBmcmFtZXMgdG8gdXNlIiwgICAgT0ZGU0VUKHNpemUpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTMzfSwgICA1LCBTSVpFLCBGTEFHUyB9LAorICAgIHsgInMiLCAgInNldCBob3cgbWFueSBmcmFtZXMgdG8gdXNlIiwgICAgT0ZGU0VUKHNpemUpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTl9LCAgIDUsIFNJWkUsIEZMQUdTIH0sCisgICAgeyAicCIsICAic2V0IHdoYXQgcGxhbmVzIHRvIGZpbHRlciIsICAgICBPRkZTRVQocGxhbmVzKSwgICBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQ9N30sICAgIDAsIDE1LCAgRkxBR1MgfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtNzcsNiArODAsMTAgQEAKIHsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2ZtdHNbXSA9IHsKICAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOSwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTEyLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNiwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCBBVl9QSVhfRk1UX1lVVjQxMVAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwKQEAgLTg1LDYgKzkyLDEwIEBACiAgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDksIEFWX1BJWF9GTVRfWVVWNDIyUDksIEFWX1BJWF9GTVRfWVVWNDQ0UDksCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDIwUDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQyMFAxNCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKICAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKICAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKQEAgLTEzNiw2ICsxNDcsMTIgQEAKICAgICAgICAgY29uc3QgaW50ICpsaW5lc2l6ZSA9IChjb25zdCBpbnQgKilzLT5saW5lc2l6ZVtwXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjZltTSVpFXTsKIAorICAgICAgICBpZiAoISgoMSA8PCBwKSAmIHMtPnBsYW5lcykpIHsKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZHN0LCBvdXQtPmxpbmVzaXplW3BdLCBzcmMsIGluLT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgc2xpY2VfZW5kIC0gc2xpY2Vfc3RhcnQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgICAgc3JjZltpXSA9IGRhdGFbaV0gKyBzbGljZV9zdGFydCAqIGxpbmVzaXplW2ldOwogCkBAIC0yMDcsNiArMjI0LDEyIEBACiAgICAgICAgIGNvbnN0IGludCAqbGluZXNpemUgPSAoY29uc3QgaW50ICopcy0+bGluZXNpemVbcF07CiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNmW1NJWkVdOwogCisgICAgICAgIGlmICghKCgxIDw8IHApICYgcy0+cGxhbmVzKSkgeworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZSgodWludDhfdCAqKWRzdCwgb3V0LT5saW5lc2l6ZVtwXSwgKHVpbnQ4X3QgKilzcmMsIGluLT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyAqIDIsIHNsaWNlX2VuZCAtIHNsaWNlX3N0YXJ0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnNpemU7IGkrKykKICAgICAgICAgICAgIHNyY2ZbaV0gPSAoY29uc3QgdWludDE2X3QgKikoZGF0YVtpXSArIHNsaWNlX3N0YXJ0ICogbGluZXNpemVbaV0pOwogCkBAIC0zMzcsNyArMzYwLDcgQEAKICAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHMtPmZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOMyhzLT5wbGFuZWhlaWdodFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVoZWlnaHRbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKICAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKICAgICB9IGVsc2UgewogICAgICAgICBvdXQgPSBhdl9mcmFtZV9jbG9uZShpbik7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9hdmdibHVyLmMgYi9saWJhdmZpbHRlci92Zl9hdmdibHVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZkNGE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2F2Z2JsdXIuYwpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQorICogU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgQXZlcmFnZUJsdXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludCByYWRpdXM7CisgICAgaW50IHJhZGl1c1Y7CisgICAgaW50IHBsYW5lczsKKworICAgIGludCBkZXB0aDsKKyAgICBpbnQgcGxhbmV3aWR0aFs0XTsKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07CisgICAgZmxvYXQgKmJ1ZmZlcjsKKyAgICBpbnQgbmJfcGxhbmVzOworCisgICAgaW50ICgqZmlsdGVyX2hvcml6b250YWxseSkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icyk7CisgICAgaW50ICgqZmlsdGVyX3ZlcnRpY2FsbHkpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpOworfSBBdmVyYWdlQmx1ckNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEF2ZXJhZ2VCbHVyQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBhdmdibHVyX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzaXplWCIsICAic2V0IGhvcml6b250YWwgc2l6ZSIsICBPRkZTRVQocmFkaXVzKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MX0sICAgMSwgMTAyNCwgRkxBR1MgfSwKKyAgICB7ICJwbGFuZXMiLCAic2V0IHBsYW5lcyB0byBmaWx0ZXIiLCBPRkZTRVQocGxhbmVzKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MHhGfSwgMCwgIDB4RiwgRkxBR1MgfSwKKyAgICB7ICJzaXplWSIsICAic2V0IHZlcnRpY2FsIHNpemUiLCAgICBPRkZTRVQocmFkaXVzViksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sICAgMCwgMTAyNCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGF2Z2JsdXIpOworCit0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCB3aWR0aDsKKyAgICB1aW50OF90ICpwdHI7CisgICAgaW50IGxpbmVzaXplOworfSBUaHJlYWREYXRhOworCisjZGVmaW5lIEhPUklaT05UQUxfRklMVEVSKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBmaWx0ZXJfaG9yaXpvbnRhbGx5XyMjbmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQXZlcmFnZUJsdXJDb250ZXh0ICpzID0gY3R4LT5wcml2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRocmVhZERhdGEgKnRkID0gYXJnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gdGQtPmhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHdpZHRoID0gdGQtPndpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChoZWlnaHQgKiAgam9ibnIgICApIC8gbmJfam9iczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kICAgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHJhZGl1cyA9IEZGTUlOKHMtPnJhZGl1cywgd2lkdGggLyAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBsaW5lc2l6ZSA9IHRkLT5saW5lc2l6ZSAvIHNpemVvZih0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbG9hdCAqYnVmZmVyID0gcy0+YnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdHlwZSAqc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0ICpwdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeSwgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIEZpbHRlciBob3Jpem9udGFsbHkgYWxvbmcgZWFjaCByb3cgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSBzbGljZV9zdGFydDsgeSA8IHNsaWNlX2VuZDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZsb2F0IGFjYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYyA9IChjb25zdCB0eXBlICopdGQtPnB0ciArIGxpbmVzaXplICogeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwdHIgPSBidWZmZXIgKyB3aWR0aCAqIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoeCA9IDA7IHggPCByYWRpdXM7IHgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYWNjICs9IHNyY1t4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvdW50ICs9IHJhZGl1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8PSByYWRpdXM7IHgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhY2MgKz0gc3JjW3ggKyByYWRpdXNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHB0clt4XSA9IGFjYyAvIGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIHJhZGl1czsgeCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhY2MgKz0gc3JjW3ggKyByYWRpdXNdIC0gc3JjW3ggLSByYWRpdXMgLSAxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHRyW3hdID0gYWNjIC8gY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKDsgeCA8IHdpZHRoOyB4KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjYyAtPSBzcmNbeCAtIHJhZGl1c107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb3VudC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHRyW3hdID0gYWNjIC8gY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0hPUklaT05UQUxfRklMVEVSKDgsIHVpbnQ4X3QpCitIT1JJWk9OVEFMX0ZJTFRFUigxNiwgdWludDE2X3QpCisKKyNkZWZpbmUgVkVSVElDQUxfRklMVEVSKG5hbWUsIHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGZpbHRlcl92ZXJ0aWNhbGx5XyMjbmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBdmVyYWdlQmx1ckNvbnRleHQgKnMgPSBjdHgtPnByaXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBoZWlnaHQgPSB0ZC0+aGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgd2lkdGggPSB0ZC0+d2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKHdpZHRoICogIGpvYm5yICAgKSAvIG5iX2pvYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBzbGljZV9lbmQgICA9ICh3aWR0aCAqIChqb2JucisxKSkgLyBuYl9qb2JzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgcmFkaXVzID0gRkZNSU4ocy0+cmFkaXVzViwgaGVpZ2h0IC8gMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGxpbmVzaXplID0gdGQtPmxpbmVzaXplIC8gc2l6ZW9mKHR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKmJ1ZmZlciA9ICh0eXBlICopdGQtPnB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBmbG9hdCAqc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSAqcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogRmlsdGVyIHZlcnRpY2FsbHkgYWxvbmcgZWFjaCBjb2x1bW4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IHNsaWNlX3N0YXJ0OyB4IDwgc2xpY2VfZW5kOyB4KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmxvYXQgYWNjID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBjb3VudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHRyID0gYnVmZmVyICsgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYyA9IHMtPmJ1ZmZlciArIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHJhZGl1czsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhY2MgKz0gc3JjWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3JjICs9IHdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvdW50ICs9IHJhZGl1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjID0gcy0+YnVmZmVyICsgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHB0ciA9IGJ1ZmZlciArIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IHJhZGl1czsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjYyArPSBzcmNbKGkgKyByYWRpdXMpICogd2lkdGhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb3VudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcHRyW2kgKiBsaW5lc2l6ZV0gPSBhY2MgLyBjb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKDsgaSA8IGhlaWdodCAtIHJhZGl1czsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjYyArPSBzcmNbKGkgKyByYWRpdXMpICogd2lkdGhdIC0gc3JjWyhpIC0gcmFkaXVzIC0gMSkgKiB3aWR0aF07ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwdHJbaSAqIGxpbmVzaXplXSA9IGFjYyAvIGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoOyBpIDwgaGVpZ2h0OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYWNjIC09IHNyY1soaSAtIHJhZGl1cykgKiB3aWR0aF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvdW50LS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwdHJbaSAqIGxpbmVzaXplXSA9IGFjYyAvIGNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworVkVSVElDQUxfRklMVEVSKDgsIHVpbnQ4X3QpCitWRVJUSUNBTF9GSUxURVIoMTYsIHVpbnQxNl90KQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBBdmVyYWdlQmx1ckNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKworICAgIHMtPmRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBzLT5wbGFuZXdpZHRoWzFdID0gcy0+cGxhbmV3aWR0aFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgcy0+cGxhbmV3aWR0aFswXSA9IHMtPnBsYW5ld2lkdGhbM10gPSBpbmxpbmstPnc7CisgICAgcy0+cGxhbmVoZWlnaHRbMV0gPSBzLT5wbGFuZWhlaWdodFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgcy0+cGxhbmVoZWlnaHRbMF0gPSBzLT5wbGFuZWhlaWdodFszXSA9IGlubGluay0+aDsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKworICAgIHMtPmJ1ZmZlciA9IGF2X21hbGxvY19hcnJheShpbmxpbmstPncsIGlubGluay0+aCAqIHNpemVvZigqcy0+YnVmZmVyKSk7CisgICAgaWYgKCFzLT5idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAocy0+cmFkaXVzViA8PSAwKSB7CisgICAgICAgIHMtPnJhZGl1c1YgPSBzLT5yYWRpdXM7CisgICAgfQorCisgICAgaWYgKHMtPmRlcHRoID09IDgpIHsKKyAgICAgICAgcy0+ZmlsdGVyX2hvcml6b250YWxseSA9IGZpbHRlcl9ob3Jpem9udGFsbHlfODsKKyAgICAgICAgcy0+ZmlsdGVyX3ZlcnRpY2FsbHkgPSBmaWx0ZXJfdmVydGljYWxseV84OworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmZpbHRlcl9ob3Jpem9udGFsbHkgPSBmaWx0ZXJfaG9yaXpvbnRhbGx5XzE2OworICAgICAgICBzLT5maWx0ZXJfdmVydGljYWxseSA9IGZpbHRlcl92ZXJ0aWNhbGx5XzE2OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhdmVyYWdlaWlyMmQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsIGludCBwbGFuZSkKK3sKKyAgICBBdmVyYWdlQmx1ckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgaW50IHdpZHRoID0gcy0+cGxhbmV3aWR0aFtwbGFuZV07CisgICAgY29uc3QgaW50IGhlaWdodCA9IHMtPnBsYW5laGVpZ2h0W3BsYW5lXTsKKyAgICBjb25zdCBpbnQgbmJfdGhyZWFkcyA9IGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpOworICAgIFRocmVhZERhdGEgdGQ7CisKKyAgICB0ZC53aWR0aCA9IHdpZHRoOworICAgIHRkLmhlaWdodCA9IGhlaWdodDsKKyAgICB0ZC5wdHIgPSBpbi0+ZGF0YVtwbGFuZV07CisgICAgdGQubGluZXNpemUgPSBpbi0+bGluZXNpemVbcGxhbmVdOworICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBzLT5maWx0ZXJfaG9yaXpvbnRhbGx5LCAmdGQsIE5VTEwsIEZGTUlOKGhlaWdodCwgbmJfdGhyZWFkcykpOworICAgIHRkLnB0ciA9IG91dC0+ZGF0YVtwbGFuZV07CisgICAgdGQubGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgcy0+ZmlsdGVyX3ZlcnRpY2FsbHksICZ0ZCwgTlVMTCwgRkZNSU4od2lkdGgsIG5iX3RocmVhZHMpKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LCBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFA5LCBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUlAxNCwgQVZfUElYX0ZNVF9HQlJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRfR0JSQVAxMCwgQVZfUElYX0ZNVF9HQlJBUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTksIEFWX1BJWF9GTVRfR1JBWTEwLCBBVl9QSVhfRk1UX0dSQVkxMiwgQVZfUElYX0ZNVF9HUkFZMTYsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBdmVyYWdlQmx1ckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIGNvbnN0IGludCBoZWlnaHQgPSBzLT5wbGFuZWhlaWdodFtwbGFuZV07CisgICAgICAgIGNvbnN0IGludCB3aWR0aCA9IHMtPnBsYW5ld2lkdGhbcGxhbmVdOworCisgICAgICAgIGlmICghKHMtPnBsYW5lcyAmICgxIDw8IHBsYW5lKSkpIHsKKyAgICAgICAgICAgIGlmIChvdXQgIT0gaW4pCisgICAgICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbcGxhbmVdLCBvdXQtPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhW3BsYW5lXSwgaW4tPmxpbmVzaXplW3BsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICogKChzLT5kZXB0aCArIDcpIC8gOCksIGhlaWdodCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF2ZXJhZ2VpaXIyZChjdHgsIGluLCBvdXQsIHBsYW5lKTsKKyAgICB9CisKKyAgICBpZiAob3V0ICE9IGluKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBdmVyYWdlQmx1ckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmcy0+YnVmZmVyKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2Z2JsdXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmdibHVyX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9hdmdibHVyID0geworICAgIC5uYW1lICAgICAgICAgID0gImF2Z2JsdXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IEF2ZXJhZ2UgQmx1ciBmaWx0ZXIuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQXZlcmFnZUJsdXJDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZhdmdibHVyX2NsYXNzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGF2Z2JsdXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZnYmx1cl9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMgfCBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfYXZnYmx1cl9vcGVuY2wuYyBiL2xpYmF2ZmlsdGVyL3ZmX2F2Z2JsdXJfb3BlbmNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjZWJiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2F2Z2JsdXJfb3BlbmNsLmMKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggRHlsYW4gRmVybmFuZG8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAib3BlbmNsLmgiCisjaW5jbHVkZSAib3BlbmNsX3NvdXJjZS5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgQXZlcmFnZUJsdXJPcGVuQ0xDb250ZXh0IHsKKyAgICBPcGVuQ0xGaWx0ZXJDb250ZXh0IG9jZjsKKworICAgIGludCAgICAgICAgICAgICAgaW5pdGlhbGlzZWQ7CisgICAgY2xfa2VybmVsICAgICAgICBrZXJuZWxfaG9yaXo7CisgICAgY2xfa2VybmVsICAgICAgICBrZXJuZWxfdmVydDsKKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWU7CisKKyAgICBpbnQgcmFkaXVzOworICAgIGludCByYWRpdXNWOworICAgIGludCBwbGFuZXM7CisKK30gQXZlcmFnZUJsdXJPcGVuQ0xDb250ZXh0OworCisKK3N0YXRpYyBpbnQgYXZnYmx1cl9vcGVuY2xfaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIEF2ZXJhZ2VCbHVyT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgY2xfaW50IGNsZTsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gZmZfb3BlbmNsX2ZpbHRlcl9sb2FkX3Byb2dyYW0oYXZjdHgsICZmZl9vcGVuY2xfc291cmNlX2F2Z2JsdXIsIDEpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBjdHgtPmNvbW1hbmRfcXVldWUgPSBjbENyZWF0ZUNvbW1hbmRRdWV1ZShjdHgtPm9jZi5od2N0eC0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPm9jZi5od2N0eC0+ZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICZjbGUpOworICAgIGlmICghY3R4LT5jb21tYW5kX3F1ZXVlKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBPcGVuQ0wgIgorICAgICAgICAgICAgICAgImNvbW1hbmQgcXVldWU6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY3R4LT5rZXJuZWxfaG9yaXogPSBjbENyZWF0ZUtlcm5lbChjdHgtPm9jZi5wcm9ncmFtLCJhdmdibHVyX2hvcml6IiwgJmNsZSk7CisgICAgaWYgKCFjdHgtPmtlcm5lbF9ob3JpeikgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUga2VybmVsOiAlZC5cbiIsIGNsZSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGN0eC0+a2VybmVsX3ZlcnQgPSBjbENyZWF0ZUtlcm5lbChjdHgtPm9jZi5wcm9ncmFtLCJhdmdibHVyX3ZlcnQiLCAmY2xlKTsKKyAgICBpZiAoIWN0eC0+a2VybmVsX3ZlcnQpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGtlcm5lbDogJWQuXG4iLCBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5yYWRpdXNWIDw9IDApIHsKKyAgICAgICAgY3R4LT5yYWRpdXNWID0gY3R4LT5yYWRpdXM7CisgICAgfQorCisgICAgY3R4LT5pbml0aWFsaXNlZCA9IDE7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaWYgKGN0eC0+Y29tbWFuZF9xdWV1ZSkKKyAgICAgICAgY2xSZWxlYXNlQ29tbWFuZFF1ZXVlKGN0eC0+Y29tbWFuZF9xdWV1ZSk7CisgICAgaWYgKGN0eC0+a2VybmVsX2hvcml6KQorICAgICAgICBjbFJlbGVhc2VLZXJuZWwoY3R4LT5rZXJuZWxfaG9yaXopOworICAgIGlmIChjdHgtPmtlcm5lbF92ZXJ0KQorICAgICAgICBjbFJlbGVhc2VLZXJuZWwoY3R4LT5rZXJuZWxfdmVydCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBhdmdibHVyX29wZW5jbF9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucHV0KQoreworICAgIEFWRmlsdGVyQ29udGV4dCAgICAqYXZjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgICAgICpvdXRsaW5rID0gYXZjdHgtPm91dHB1dHNbMF07CisgICAgQXZlcmFnZUJsdXJPcGVuQ0xDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXRwdXQgPSBOVUxMOworICAgIEFWRnJhbWUgKmludGVybWVkaWF0ZSA9IE5VTEw7CisgICAgY2xfaW50IGNsZTsKKyAgICBzaXplX3QgZ2xvYmFsX3dvcmtbMl07CisgICAgY2xfbWVtIHNyYywgZHN0LCBpbnRlcjsKKyAgICBpbnQgZXJyLCBwLCByYWRpdXNfeCwgcmFkaXVzX3k7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgaW5wdXQ6ICVzLCAldXgldSAoJSJQUklkNjQiKS5cbiIsCisgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoaW5wdXQtPmZvcm1hdCksCisgICAgICAgICAgIGlucHV0LT53aWR0aCwgaW5wdXQtPmhlaWdodCwgaW5wdXQtPnB0cyk7CisKKyAgICBpZiAoIWlucHV0LT5od19mcmFtZXNfY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaWYgKCFjdHgtPmluaXRpYWxpc2VkKSB7CisgICAgICAgIGVyciA9IGF2Z2JsdXJfb3BlbmNsX2luaXQoYXZjdHgpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgIH0KKworICAgIG91dHB1dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXRwdXQpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaW50ZXJtZWRpYXRlID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIWludGVybWVkaWF0ZSkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgRkZfQVJSQVlfRUxFTVMob3V0cHV0LT5kYXRhKTsgcCsrKSB7CisgICAgICAgIHNyYyA9IChjbF9tZW0pIGlucHV0LT5kYXRhW3BdOworICAgICAgICBkc3QgPSAoY2xfbWVtKW91dHB1dC0+ZGF0YVtwXTsKKyAgICAgICAgaW50ZXIgPSAoY2xfbWVtKSBpbnRlcm1lZGlhdGUtPmRhdGFbcF07CisKKyAgICAgICAgaWYgKCFkc3QpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICByYWRpdXNfeCA9IGN0eC0+cmFkaXVzOworICAgICAgICByYWRpdXNfeSA9IGN0eC0+cmFkaXVzVjsKKworICAgICAgICBpZiAoIShjdHgtPnBsYW5lcyAmICgxIDw8IHApKSkgeworICAgICAgICAgICAgcmFkaXVzX3ggPSAwOworICAgICAgICAgICAgcmFkaXVzX3kgPSAwOworICAgICAgICB9CisKKyAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWxfaG9yaXosIDAsIHNpemVvZihjbF9tZW0pLCAmaW50ZXIpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBrZXJuZWwgIgorICAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBpbWFnZSBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsX2hvcml6LCAxLCBzaXplb2YoY2xfbWVtKSwgJnNyYyk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgInNvdXJjZSBpbWFnZSBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsX2hvcml6LCAyLCBzaXplb2YoY2xfaW50KSwgJnJhZGl1c194KTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQga2VybmVsICIKKyAgICAgICAgICAgICAgICAgICAic2l6ZVggYXJndW1lbnQ6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGZmX29wZW5jbF9maWx0ZXJfd29ya19zaXplX2Zyb21faW1hZ2UoYXZjdHgsIGdsb2JhbF93b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZSwgcCwgMCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiUnVuIGtlcm5lbCBvbiBwbGFuZSAlZCAiCisgICAgICAgICAgICAgICAiKCUiU0laRV9TUEVDSUZJRVIieCUiU0laRV9TUEVDSUZJRVIiKS5cbiIsCisgICAgICAgICAgICAgICBwLCBnbG9iYWxfd29ya1swXSwgZ2xvYmFsX3dvcmtbMV0pOworCisgICAgICAgIGNsZSA9IGNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwoY3R4LT5jb21tYW5kX3F1ZXVlLCBjdHgtPmtlcm5lbF9ob3JpeiwgMiwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfd29yaywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBlbnF1ZXVlIGtlcm5lbDogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgIGNsZSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbF92ZXJ0LCAwLCBzaXplb2YoY2xfbWVtKSwgJmRzdCk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGltYWdlIGFyZ3VtZW50OiAlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWxfdmVydCwgMSwgc2l6ZW9mKGNsX21lbSksICZpbnRlcik7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgInNvdXJjZSBpbWFnZSBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsX3ZlcnQsIDIsIHNpemVvZihjbF9pbnQpLCAmcmFkaXVzX3kpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBrZXJuZWwgIgorICAgICAgICAgICAgICAgICAgICJzaXplWSBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZmZfb3BlbmNsX2ZpbHRlcl93b3JrX3NpemVfZnJvbV9pbWFnZShhdmN0eCwgZ2xvYmFsX3dvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBwLCAwKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJSdW4ga2VybmVsIG9uIHBsYW5lICVkICIKKyAgICAgICAgICAgICAgICIoJSJTSVpFX1NQRUNJRklFUiJ4JSJTSVpFX1NQRUNJRklFUiIpLlxuIiwKKyAgICAgICAgICAgICAgIHAsIGdsb2JhbF93b3JrWzBdLCBnbG9iYWxfd29ya1sxXSk7CisKKyAgICAgICAgY2xlID0gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbChjdHgtPmNvbW1hbmRfcXVldWUsIGN0eC0+a2VybmVsX3ZlcnQsIDIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3dvcmssIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZW5xdWV1ZSBrZXJuZWw6ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICBjbGUpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBjbGUgPSBjbEZpbmlzaChjdHgtPmNvbW1hbmRfcXVldWUpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBmaW5pc2ggY29tbWFuZCBxdWV1ZTogJWQuXG4iLAorICAgICAgICAgICAgICAgY2xlKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZXJyID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXRwdXQsIGlucHV0KTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYXZfZnJhbWVfZnJlZSgmaW5wdXQpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmludGVybWVkaWF0ZSk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgb3V0cHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dHB1dC0+Zm9ybWF0KSwKKyAgICAgICAgICAgb3V0cHV0LT53aWR0aCwgb3V0cHV0LT5oZWlnaHQsIG91dHB1dC0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cHV0KTsKKworZmFpbDoKKyAgICBjbEZpbmlzaChjdHgtPmNvbW1hbmRfcXVldWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmlucHV0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXQpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmludGVybWVkaWF0ZSk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBhdmdibHVyX29wZW5jbF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBBdmVyYWdlQmx1ck9wZW5DTENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIGNsX2ludCBjbGU7CisKKworICAgIGlmIChjdHgtPmtlcm5lbF9ob3JpeikgeworICAgICAgICBjbGUgPSBjbFJlbGVhc2VLZXJuZWwoY3R4LT5rZXJuZWxfaG9yaXopOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlICIKKyAgICAgICAgICAgICAgICAgICAia2VybmVsOiAlZC5cbiIsIGNsZSk7CisgICAgfQorCisgICAgaWYgKGN0eC0+a2VybmVsX3ZlcnQpIHsKKyAgICAgICAgY2xlID0gY2xSZWxlYXNlS2VybmVsKGN0eC0+a2VybmVsX3ZlcnQpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlICIKKyAgICAgICAgICAgICAgICAgICAia2VybmVsOiAlZC5cbiIsIGNsZSk7CisgICAgfQorCisgICAgaWYgKGN0eC0+Y29tbWFuZF9xdWV1ZSkgeworICAgICAgICBjbGUgPSBjbFJlbGVhc2VDb21tYW5kUXVldWUoY3R4LT5jb21tYW5kX3F1ZXVlKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVsZWFzZSAiCisgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgcXVldWU6ICVkLlxuIiwgY2xlKTsKKyAgICB9CisKKyAgICBmZl9vcGVuY2xfZmlsdGVyX3VuaW5pdChhdmN0eCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEF2ZXJhZ2VCbHVyT3BlbkNMQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGF2Z2JsdXJfb3BlbmNsX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzaXplWCIsICAic2V0IGhvcml6b250YWwgc2l6ZSIsICBPRkZTRVQocmFkaXVzKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MX0sICAgMSwgMTAyNCwgRkxBR1MgfSwKKyAgICB7ICJwbGFuZXMiLCAic2V0IHBsYW5lcyB0byBmaWx0ZXIiLCBPRkZTRVQocGxhbmVzKSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MHhGfSwgMCwgIDB4RiwgRkxBR1MgfSwKKyAgICB7ICJzaXplWSIsICAic2V0IHZlcnRpY2FsIHNpemUiLCAgICBPRkZTRVQocmFkaXVzViksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sICAgMCwgMTAyNCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGF2Z2JsdXJfb3BlbmNsKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2Z2JsdXJfb3BlbmNsX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9ICZhdmdibHVyX29wZW5jbF9maWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSAmZmZfb3BlbmNsX2ZpbHRlcl9jb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2Z2JsdXJfb3BlbmNsX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSAmZmZfb3BlbmNsX2ZpbHRlcl9jb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2F2Z2JsdXJfb3BlbmNsID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJhdmdibHVyX29wZW5jbCIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IGF2ZXJhZ2UgYmx1ciBmaWx0ZXIiKSwKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoQXZlcmFnZUJsdXJPcGVuQ0xDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmYXZnYmx1cl9vcGVuY2xfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gJmZmX29wZW5jbF9maWx0ZXJfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSAmYXZnYmx1cl9vcGVuY2xfdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzICA9ICZmZl9vcGVuY2xfZmlsdGVyX3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgID0gYXZnYmx1cl9vcGVuY2xfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICA9IGF2Z2JsdXJfb3BlbmNsX291dHB1dHMsCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9iYm94LmMgYi9saWJhdmZpbHRlci92Zl9iYm94LmMKaW5kZXggZTkyYzNiNC4uNGFjMjk4MCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfYmJveC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2Jib3guYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgImJib3guaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBCQm94Q29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IG1pbl92YWw7CiB9IEJCb3hDb250ZXh0OwpAQCAtODAsMTEgKzgwLDExIEBACiAgICAgaCA9IGJveC55MiAtIGJveC55MSArIDE7CiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywKLSAgICAgICAgICAgIm46JSJQUklkNjQiIHB0czolcyBwdHNfdGltZTolcyIsIGlubGluay0+ZnJhbWVfY291bnQsCisgICAgICAgICAgICJuOiUiUFJJZDY0IiBwdHM6JXMgcHRzX3RpbWU6JXMiLCBpbmxpbmstPmZyYW1lX2NvdW50X291dCwKICAgICAgICAgICAgYXZfdHMyc3RyKGZyYW1lLT5wdHMpLCBhdl90czJ0aW1lc3RyKGZyYW1lLT5wdHMsICZpbmxpbmstPnRpbWVfYmFzZSkpOwogCiAgICAgaWYgKGhhc19iYm94KSB7Ci0gICAgICAgIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhID0gYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoZnJhbWUpOworICAgICAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSA9ICZmcmFtZS0+bWV0YWRhdGE7CiAKICAgICAgICAgU0VUX01FVEEoImxhdmZpLmJib3gueDEiLCBib3gueDEpCiAgICAgICAgIFNFVF9NRVRBKCJsYXZmaS5iYm94LngyIiwgYm94LngyKQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfYml0cGxhbmVub2lzZS5jIGIvbGliYXZmaWx0ZXIvdmZfYml0cGxhbmVub2lzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNjg2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9iaXRwbGFuZW5vaXNlLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBCUE5Db250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludCBiaXRwbGFuZTsKKyAgICBpbnQgZmlsdGVyOworCisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07CisgICAgaW50IHBsYW5ld2lkdGhbNF07CisgICAgaW50IGRlcHRoOworfSBCUE5Db250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihCUE5Db250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBiaXRwbGFuZW5vaXNlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJiaXRwbGFuZSIsICJzZXQgYml0IHBsYW5lIHRvIHVzZSBmb3IgbWVhc3VyaW5nIG5vaXNlIiwgIE9GRlNFVChiaXRwbGFuZSksIEFWX09QVF9UWVBFX0lOVCwgIHsuaTY0PTF9LCAxLCAxNiwgRkxBR1N9LAorICAgIHsgImZpbHRlciIsICAgInNob3cgbm9pc3kgcGl4ZWxzIiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZpbHRlciksICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsICAxLCBGTEFHU30sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhiaXRwbGFuZW5vaXNlKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4Zm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0MjBQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQyMFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsIEFWX1BJWF9GTVRfWVVWNDIwUDE0LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTYsIEFWX1BJWF9GTVRfWVVWNDIwUDE2LAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSUDksIEFWX1BJWF9GTVRfR0JSUDEwLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAxMiwgQVZfUElYX0ZNVF9HQlJQMTQsIEFWX1BJWF9GTVRfR0JSUDE2LAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX0dSQVk5LCBBVl9QSVhfRk1UX0dSQVkxMCwgQVZfUElYX0ZNVF9HUkFZMTIsIEFWX1BJWF9GTVRfR1JBWTE2LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhmbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEJQTkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5uYl9wbGFuZXMgPSBkZXNjLT5uYl9jb21wb25lbnRzOworCisgICAgcy0+cGxhbmVoZWlnaHRbMV0gPSBzLT5wbGFuZWhlaWdodFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgcy0+cGxhbmVoZWlnaHRbMF0gPSBzLT5wbGFuZWhlaWdodFszXSA9IGlubGluay0+aDsKKyAgICBzLT5wbGFuZXdpZHRoWzFdICA9IHMtPnBsYW5ld2lkdGhbMl0gID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBkZXNjLT5sb2cyX2Nocm9tYV93KTsKKyAgICBzLT5wbGFuZXdpZHRoWzBdICA9IHMtPnBsYW5ld2lkdGhbM10gID0gaW5saW5rLT53OworCisgICAgcy0+ZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfQklUKHgsIGEsIGIsIGMpIHsgXAorICAgIGJpdCA9ICgoKHZhbFsoeCldICYgbWFzaykgPT0gKHZhbFsoeCkgKyAoYSldICYgbWFzaykpICsgXAorICAgICAgICAgICAoKHZhbFsoeCldICYgbWFzaykgPT0gKHZhbFsoeCkgKyAoYildICYgbWFzaykpICsgXAorICAgICAgICAgICAoKHZhbFsoeCldICYgbWFzaykgPT0gKHZhbFsoeCkgKyAoYyldICYgbWFzaykpKSA+IDE7IFwKKyAgICBpZiAoZHN0KSBcCisgICAgICAgIGRzdFsoeCldID0gZmFjdG9yICogYml0OyBcCisgICAgc3RhdHNbcGxhbmVdICs9IGJpdDsgfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgQlBOQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IChzLT5iaXRwbGFuZSAtIDEpKTsKKyAgICBjb25zdCBpbnQgZmFjdG9yID0gKDEgPDwgcy0+ZGVwdGgpIC0gMTsKKyAgICBmbG9hdCBzdGF0c1s0XSA9IHsgMCB9OworICAgIGNoYXIgbWV0YWJ1ZlsxMjhdOworICAgIGludCBwbGFuZSwgeSwgeCwgYml0OworICAgIEFWRnJhbWUgKm91dCA9IHMtPmZpbHRlciA/IE5VTEwgOiBpbjsKKworICAgIGlmICghb3V0KSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgaWYgKHMtPmRlcHRoIDw9IDgpIHsKKyAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbGluZXNpemUgPSBpbi0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgY29uc3QgaW50IGRsaW5lc2l6ZSA9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgdWludDhfdCAqdmFsID0gaW4tPmRhdGFbcGxhbmVdOworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gcy0+ZmlsdGVyID8gb3V0LT5kYXRhW3BsYW5lXTogTlVMTDsKKworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPnBsYW5laGVpZ2h0W3BsYW5lXSAtIDE7IHkrKykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVCgwLCAxLCAxICsgbGluZXNpemUsIGxpbmVzaXplKQorCisgICAgICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IHMtPnBsYW5ld2lkdGhbcGxhbmVdIC0gMTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVCh4LCAtMSwgMSwgbGluZXNpemUpCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUKHgsIC0xLCAtMSArIGxpbmVzaXplLCBsaW5lc2l6ZSkKKworICAgICAgICAgICAgICAgIHZhbCArPSBsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoZHN0KQorICAgICAgICAgICAgICAgICAgICBkc3QgKz0gZGxpbmVzaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDS19CSVQoMCwgMSwgMSAtIGxpbmVzaXplLCAtbGluZXNpemUpCisKKyAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCBzLT5wbGFuZXdpZHRoW3BsYW5lXSAtIDE7IHgrKykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVCh4LCAtMSwgMSwgLWxpbmVzaXplKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDS19CSVQoeCwgLTEsIC0xIC0gbGluZXNpemUsIC1saW5lc2l6ZSkKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPm5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICAgICAgY29uc3QgaW50IGxpbmVzaXplID0gaW4tPmxpbmVzaXplW3BsYW5lXSAvIDI7CisgICAgICAgICAgICBjb25zdCBpbnQgZGxpbmVzaXplID0gb3V0LT5saW5lc2l6ZVtwbGFuZV0gLyAyOworICAgICAgICAgICAgdWludDE2X3QgKnZhbCA9ICh1aW50MTZfdCAqKWluLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgPSBzLT5maWx0ZXIgPyAodWludDE2X3QgKilvdXQtPmRhdGFbcGxhbmVdIDogTlVMTDsKKworICAgICAgICAgICAgdmFsID0gKHVpbnQxNl90ICopaW4tPmRhdGFbcGxhbmVdOworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPnBsYW5laGVpZ2h0W3BsYW5lXSAtIDE7IHkrKykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVCgwLCAxLCAxICsgbGluZXNpemUsIGxpbmVzaXplKQorCisgICAgICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IHMtPnBsYW5ld2lkdGhbcGxhbmVdIC0gMTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVCh4LCAtMSwgMSwgbGluZXNpemUpCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUKHgsIC0xLCAtMSArIGxpbmVzaXplLCBsaW5lc2l6ZSkKKworICAgICAgICAgICAgICAgIHZhbCArPSBsaW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoZHN0KQorICAgICAgICAgICAgICAgICAgICBkc3QgKz0gZGxpbmVzaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDS19CSVQoMCwgMSwgMSAtIGxpbmVzaXplLCAtbGluZXNpemUpCisKKyAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCBzLT5wbGFuZXdpZHRoW3BsYW5lXSAtIDE7IHgrKykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVCh4LCAtMSwgMSwgLWxpbmVzaXplKQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDSEVDS19CSVQoeCwgLTEsIC0xIC1saW5lc2l6ZSwgLWxpbmVzaXplKQorICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIGNoYXIga2V5WzMyXTsKKworICAgICAgICBzdGF0c1twbGFuZV0gLz0gcy0+cGxhbmV3aWR0aFtwbGFuZV0gKiBzLT5wbGFuZWhlaWdodFtwbGFuZV07CisgICAgICAgIHNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICJsYXZmaS5iaXRwbGFuZW5vaXNlLiVkLiVkIiwgcGxhbmUsIHMtPmJpdHBsYW5lKTsKKyAgICAgICAgc25wcmludGYobWV0YWJ1Ziwgc2l6ZW9mKG1ldGFidWYpLCAiJWYiLCAxLiAtIDIuKiBmYWJzKChzdGF0c1twbGFuZV0gLSAwLjUpKSk7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZvdXQtPm1ldGFkYXRhLCBrZXksIG1ldGFidWYsIDApOworICAgIH0KKworICAgIGlmIChvdXQgIT0gaW4pCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfYml0cGxhbmVub2lzZSA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYml0cGxhbmVub2lzZSIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1lYXN1cmUgYml0IHBsYW5lIG5vaXNlLiIpLAorICAgIC5wcml2X3NpemUgICAgICA9IHNpemVvZihCUE5Db250ZXh0KSwKKyAgICAucXVlcnlfZm9ybWF0cyAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgICA9IGlucHV0cywKKyAgICAub3V0cHV0cyAgICAgICAgPSBvdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZiaXRwbGFuZW5vaXNlX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2JsYWNrZGV0ZWN0LmMgYi9saWJhdmZpbHRlci92Zl9ibGFja2RldGVjdC5jCmluZGV4IGZiZTNkMTAuLjA2ZWY5OTggMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2JsYWNrZGV0ZWN0LmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfYmxhY2tkZXRlY3QuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQmxhY2tEZXRlY3RDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBkb3VibGUgIGJsYWNrX21pbl9kdXJhdGlvbl90aW1lOyAvLy88IG1pbmltdW0gZHVyYXRpb24gb2YgZGV0ZWN0ZWQgYmxhY2ssIGluIHNlY29uZHMKICAgICBpbnQ2NF90IGJsYWNrX21pbl9kdXJhdGlvbjsgICAgICAvLy88IG1pbmltdW0gZHVyYXRpb24gb2YgZGV0ZWN0ZWQgYmxhY2ssIGV4cHJlc3NlZCBpbiB0aW1lYmFzZSB1bml0cwpAQCAtMTU1LDcgKzE1NSw3IEBACiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsCiAgICAgICAgICAgICJmcmFtZTolIlBSSWQ2NCIgcGljdHVyZV9ibGFja19yYXRpbzolZiBwdHM6JXMgdDolcyB0eXBlOiVjXG4iLAotICAgICAgICAgICBpbmxpbmstPmZyYW1lX2NvdW50LCBwaWN0dXJlX2JsYWNrX3JhdGlvLAorICAgICAgICAgICBpbmxpbmstPmZyYW1lX2NvdW50X291dCwgcGljdHVyZV9ibGFja19yYXRpbywKICAgICAgICAgICAgYXZfdHMyc3RyKHBpY3JlZi0+cHRzKSwgYXZfdHMydGltZXN0cihwaWNyZWYtPnB0cywgJmlubGluay0+dGltZV9iYXNlKSwKICAgICAgICAgICAgYXZfZ2V0X3BpY3R1cmVfdHlwZV9jaGFyKHBpY3JlZi0+cGljdF90eXBlKSk7CiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgICAgICAgICAgLyogYmxhY2sgc3RhcnRzIGhlcmUgKi8KICAgICAgICAgICAgIGJsYWNrZGV0ZWN0LT5ibGFja19zdGFydGVkID0gMTsKICAgICAgICAgICAgIGJsYWNrZGV0ZWN0LT5ibGFja19zdGFydCA9IHBpY3JlZi0+cHRzOwotICAgICAgICAgICAgYXZfZGljdF9zZXQoYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAocGljcmVmKSwgImxhdmZpLmJsYWNrX3N0YXJ0IiwKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZwaWNyZWYtPm1ldGFkYXRhLCAibGF2ZmkuYmxhY2tfc3RhcnQiLAogICAgICAgICAgICAgICAgIGF2X3RzMnRpbWVzdHIoYmxhY2tkZXRlY3QtPmJsYWNrX3N0YXJ0LCAmaW5saW5rLT50aW1lX2Jhc2UpLCAwKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoYmxhY2tkZXRlY3QtPmJsYWNrX3N0YXJ0ZWQpIHsKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgICAgICBibGFja2RldGVjdC0+YmxhY2tfc3RhcnRlZCA9IDA7CiAgICAgICAgIGJsYWNrZGV0ZWN0LT5ibGFja19lbmQgPSBwaWNyZWYtPnB0czsKICAgICAgICAgY2hlY2tfYmxhY2tfZW5kKGN0eCk7Ci0gICAgICAgIGF2X2RpY3Rfc2V0KGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKHBpY3JlZiksICJsYXZmaS5ibGFja19lbmQiLAorICAgICAgICBhdl9kaWN0X3NldCgmcGljcmVmLT5tZXRhZGF0YSwgImxhdmZpLmJsYWNrX2VuZCIsCiAgICAgICAgICAgICBhdl90czJ0aW1lc3RyKGJsYWNrZGV0ZWN0LT5ibGFja19lbmQsICZpbmxpbmstPnRpbWVfYmFzZSksIDApOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfYmxhY2tmcmFtZS5jIGIvbGliYXZmaWx0ZXIvdmZfYmxhY2tmcmFtZS5jCmluZGV4IGFkNmQ0ODguLjgwNDk2NWMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2JsYWNrZnJhbWUuYworKysgYi9saWJhdmZpbHRlci92Zl9ibGFja2ZyYW1lLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAogICAgIHBibGFjayA9IHMtPm5ibGFjayAqIDEwMCAvIChpbmxpbmstPncgKiBpbmxpbmstPmgpOwogICAgIGlmIChwYmxhY2sgPj0gcy0+YmFtb3VudCkgewotICAgICAgICBtZXRhZGF0YSA9IGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGZyYW1lKTsKKyAgICAgICAgbWV0YWRhdGEgPSAmZnJhbWUtPm1ldGFkYXRhOwogCiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiZnJhbWU6JXUgcGJsYWNrOiV1IHB0czolIlBSSWQ2NCIgdDolZiAiCiAgICAgICAgICAgICAgICAidHlwZTolYyBsYXN0X2tleWZyYW1lOiVkXG4iLApAQCAtMTA0LDggKzEwNCw4IEBACiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihCbGFja0ZyYW1lQ29udGV4dCwgeCkKICNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gYmxhY2tmcmFtZV9vcHRpb25zW10gPSB7Ci0gICAgeyAiYW1vdW50IiwgIlBlcmNlbnRhZ2Ugb2YgdGhlIHBpeGVscyB0aGF0IGhhdmUgdG8gYmUgYmVsb3cgdGhlIHRocmVzaG9sZCAiCi0gICAgICAgICJmb3IgdGhlIGZyYW1lIHRvIGJlIGNvbnNpZGVyZWQgYmxhY2suIiwgT0ZGU0VUKGJhbW91bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDk4IH0sIDAsIDEwMCwgICAgIEZMQUdTIH0sCisgICAgeyAiYW1vdW50IiwgInBlcmNlbnRhZ2Ugb2YgdGhlIHBpeGVscyB0aGF0IGhhdmUgdG8gYmUgYmVsb3cgdGhlIHRocmVzaG9sZCAiCisgICAgICAgICJmb3IgdGhlIGZyYW1lIHRvIGJlIGNvbnNpZGVyZWQgYmxhY2siLCAgT0ZGU0VUKGJhbW91bnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDk4IH0sIDAsIDEwMCwgICAgIEZMQUdTIH0sCiAgICAgeyAidGhyZXNob2xkIiwgInRocmVzaG9sZCBiZWxvdyB3aGljaCBhIHBpeGVsIHZhbHVlIGlzIGNvbnNpZGVyZWQgYmxhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChidGhyZXNoKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAzMiB9LCAwLCAyNTUsICAgICBGTEFHUyB9LAogICAgIHsgInRocmVzaCIsICJ0aHJlc2hvbGQgYmVsb3cgd2hpY2ggYSBwaXhlbCB2YWx1ZSBpcyBjb25zaWRlcmVkIGJsYWNrIiwKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2JsZW5kLmMgYi9saWJhdmZpbHRlci92Zl9ibGVuZC5jCmluZGV4IGVhNjNhMjAuLjcwYzM3YzcgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2JsZW5kLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfYmxlbmQuYwpAQCAtMjUsOCArMjUsOCBAQAogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiYnVmZmVycXVldWUuaCIKICNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiZnJhbWVzeW5jLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJkdWFsaW5wdXQuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogI2luY2x1ZGUgImJsZW5kLmgiCiAKQEAgLTM1LDcgKzM1LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgQmxlbmRDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKLSAgICBGRkR1YWxJbnB1dENvbnRleHQgZGlucHV0OworICAgIEZGRnJhbWVTeW5jIGZzOwogICAgIGludCBoc3ViLCB2c3ViOyAgICAgICAgICAgICAvLy88IGNocm9tYSBzdWJzYW1wbGluZyB2YWx1ZXMKICAgICBpbnQgbmJfcGxhbmVzOwogICAgIGNoYXIgKmFsbF9leHByOwpAQCAtNjYsMTkgKzY2LDI0IEBACiAgICAgeyAiYzNfbW9kZSIsICJzZXQgY29tcG9uZW50ICMzIGJsZW5kIG1vZGUiLCBPRkZTRVQocGFyYW1zWzNdLm1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBCTEVORF9OQi0xLCBGTEFHUywgIm1vZGUifSxcCiAgICAgeyAiYWxsX21vZGUiLCAic2V0IGJsZW5kIG1vZGUgZm9yIGFsbCBjb21wb25lbnRzIiwgT0ZGU0VUKGFsbF9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0tMX0sLTEsIEJMRU5EX05CLTEsIEZMQUdTLCAibW9kZSJ9LFwKICAgICB7ICJhZGRpdGlvbiIsICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9BRERJVElPTn0sICAgMCwgMCwgRkxBR1MsICJtb2RlIiB9LFwKLSAgICB7ICJhZGRpdGlvbjEyOCIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QkxFTkRfQURESVRJT04xMjh9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAorICAgIHsgImFkZGl0aW9uMTI4IiwiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0dSQUlOTUVSR0V9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAorICAgIHsgImdyYWlubWVyZ2UiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0dSQUlOTUVSR0V9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImFuZCIsICAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0FORH0sICAgICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImF2ZXJhZ2UiLCAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0FWRVJBR0V9LCAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImJ1cm4iLCAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0JVUk59LCAgICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImRhcmtlbiIsICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0RBUktFTn0sICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImRpZmZlcmVuY2UiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0RJRkZFUkVOQ0V9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAotICAgIHsgImRpZmZlcmVuY2UxMjgiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0RJRkZFUkVOQ0UxMjh9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAorICAgIHsgImRpZmZlcmVuY2UxMjgiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0dSQUlORVhUUkFDVH0sIDAsIDAsIEZMQUdTLCAibW9kZSIgfSxcCisgICAgeyAiZ3JhaW5leHRyYWN0IiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1CTEVORF9HUkFJTkVYVFJBQ1R9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImRpdmlkZSIsICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0RJVklERX0sICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImRvZGdlIiwgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0RPREdFfSwgICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImV4Y2x1c2lvbiIsICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0VYQ0xVU0lPTn0sICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAorICAgIHsgImV4dHJlbWl0eSIsICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0VYVFJFTUlUWX0sICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAorICAgIHsgImZyZWV6ZSIsICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0ZSRUVaRX0sICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImdsb3ciLCAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0dMT1d9LCAgICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImhhcmRsaWdodCIsICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0hBUkRMSUdIVH0sICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImhhcmRtaXgiLCAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0hBUkRNSVh9LCAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAorICAgIHsgImhlYXQiLCAgICAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0hFQVR9LCAgICAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImxpZ2h0ZW4iLCAgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0xJR0hURU59LCAgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgImxpbmVhcmxpZ2h0IiwiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX0xJTkVBUkxJR0hUfSwwLCAwLCBGTEFHUywgIm1vZGUiIH0sXAogICAgIHsgIm11bHRpcGx5IiwgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUJMRU5EX01VTFRJUExZfSwgICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sXApAQCAtMTExLDE5ICsxMTYsMTcgQEAKIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGJsZW5kX29wdGlvbnNbXSA9IHsKICAgICBDT01NT05fT1BUSU9OUywKLSAgICB7ICJzaG9ydGVzdCIsICAgICJmb3JjZSB0ZXJtaW5hdGlvbiB3aGVuIHRoZSBzaG9ydGVzdCBpbnB1dCB0ZXJtaW5hdGVzIiwgT0ZGU0VUKGRpbnB1dC5zaG9ydGVzdCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAotICAgIHsgInJlcGVhdGxhc3QiLCAgInJlcGVhdCBsYXN0IGJvdHRvbSBmcmFtZSIsIE9GRlNFVChkaW5wdXQucmVwZWF0bGFzdCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTF9LCAwLCAxLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCi1BVkZJTFRFUl9ERUZJTkVfQ0xBU1MoYmxlbmQpOworRlJBTUVTWU5DX0RFRklORV9DTEFTUyhibGVuZCwgQmxlbmRDb250ZXh0LCBmcyk7CiAKICNkZWZpbmUgQ09QWShzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIHZvaWQgYmxlbmRfY29weSAjIyBzcmMoY29uc3QgdWludDhfdCAqdG9wLCBwdHJkaWZmX3QgdG9wX2xpbmVzaXplLCAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYm90dG9tLCBwdHJkaWZmX3QgYm90dG9tX2xpbmVzaXplLFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUsICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB3aWR0aCwgcHRyZGlmZl90IGhlaWdodCwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyUGFyYW1zICpwYXJhbSwgZG91YmxlICp2YWx1ZXMpICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcywgaW50IHN0YXJ0eSkgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3QsIGRzdF9saW5lc2l6ZSwgc3JjLCBzcmMgIyMgX2xpbmVzaXplLCAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEzOCw3ICsxNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYm90dG9tLCBwdHJkaWZmX3QgYm90dG9tX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLCBwdHJkaWZmX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyUGFyYW1zICpwYXJhbSwgZG91YmxlICp2YWx1ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcywgaW50IHN0YXJ0eSkKIHsKICAgICBjb25zdCBkb3VibGUgb3BhY2l0eSA9IHBhcmFtLT5vcGFjaXR5OwogICAgIGludCBpLCBqOwpAQCAtMTU3LDcgKzE2MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqX2JvdHRvbSwgcHRyZGlmZl90IGJvdHRvbV9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB3aWR0aCwgcHRyZGlmZl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcywgaW50IHN0YXJ0eSkKIHsKICAgICBjb25zdCB1aW50MTZfdCAqdG9wID0gKHVpbnQxNl90KilfdG9wOwogICAgIGNvbnN0IHVpbnQxNl90ICpib3R0b20gPSAodWludDE2X3QqKV9ib3R0b207CkBAIC0xODMsNyArMTg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJvdHRvbSwgcHRyZGlmZl90IGJvdHRvbV9saW5lc2l6ZSwgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUsICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLCBwdHJkaWZmX3QgaGVpZ2h0LCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcykgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyUGFyYW1zICpwYXJhbSwgZG91YmxlICp2YWx1ZXMsIGludCBzdGFydHkpIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG91YmxlIG9wYWNpdHkgPSBwYXJhbS0+b3BhY2l0eTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIwMyw3ICsyMDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKl9ib3R0b20sIHB0cmRpZmZfdCBib3R0b21fbGluZXNpemUsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpfZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLCAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLCBwdHJkaWZmX3QgaGVpZ2h0LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclBhcmFtcyAqcGFyYW0sIGRvdWJsZSAqdmFsdWVzKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcywgaW50IHN0YXJ0eSkgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGNvbnN0IHVpbnQxNl90ICp0b3AgPSAodWludDE2X3QqKV90b3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjb25zdCB1aW50MTZfdCAqYm90dG9tID0gKHVpbnQxNl90KilfYm90dG9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMzMsMTggKzIzNiwyMSBAQAogI2RlZmluZSBET0RHRShhLCBiKSAgICAgICAoKChhKSA9PSAyNTUpID8gKGEpIDogRkZNSU4oMjU1LCAoKChiKSA8PCA4KSAvICgyNTUgLSAoYSkpKSkpCiAKIERFRklORV9CTEVORDgoYWRkaXRpb24sICAgRkZNSU4oMjU1LCBBICsgQikpCi1ERUZJTkVfQkxFTkQ4KGFkZGl0aW9uMTI4LCBhdl9jbGlwX3VpbnQ4KEEgKyBCIC0gMTI4KSkKK0RFRklORV9CTEVORDgoZ3JhaW5tZXJnZSwgYXZfY2xpcF91aW50OChBICsgQiAtIDEyOCkpCiBERUZJTkVfQkxFTkQ4KGF2ZXJhZ2UsICAgIChBICsgQikgLyAyKQogREVGSU5FX0JMRU5EOChzdWJ0cmFjdCwgICBGRk1BWCgwLCBBIC0gQikpCiBERUZJTkVfQkxFTkQ4KG11bHRpcGx5LCAgIE1VTFRJUExZKDEsIEEsIEIpKQogREVGSU5FX0JMRU5EOChtdWx0aXBseTEyOCxhdl9jbGlwX3VpbnQ4KChBIC0gMTI4KSAqIEIgLyAzMi4gKyAxMjgpKQogREVGSU5FX0JMRU5EOChuZWdhdGlvbiwgICAyNTUgLSBGRkFCUygyNTUgLSBBIC0gQikpCitERUZJTkVfQkxFTkQ4KGV4dHJlbWl0eSwgIEZGQUJTKDI1NSAtIEEgLSBCKSkKIERFRklORV9CTEVORDgoZGlmZmVyZW5jZSwgRkZBQlMoQSAtIEIpKQotREVGSU5FX0JMRU5EOChkaWZmZXJlbmNlMTI4LCBhdl9jbGlwX3VpbnQ4KDEyOCArIEEgLSBCKSkKK0RFRklORV9CTEVORDgoZ3JhaW5leHRyYWN0LCBhdl9jbGlwX3VpbnQ4KDEyOCArIEEgLSBCKSkKIERFRklORV9CTEVORDgoc2NyZWVuLCAgICAgU0NSRUVOKDEsIEEsIEIpKQogREVGSU5FX0JMRU5EOChvdmVybGF5LCAgICAoQSA8IDEyOCkgPyBNVUxUSVBMWSgyLCBBLCBCKSA6IFNDUkVFTigyLCBBLCBCKSkKIERFRklORV9CTEVORDgoaGFyZGxpZ2h0LCAgKEIgPCAxMjgpID8gTVVMVElQTFkoMiwgQiwgQSkgOiBTQ1JFRU4oMiwgQiwgQSkpCiBERUZJTkVfQkxFTkQ4KGhhcmRtaXgsICAgIChBIDwgKDI1NSAtIEIpKSA/IDA6IDI1NSkKK0RFRklORV9CTEVORDgoaGVhdCwgICAgICAgKEEgPT0gMCkgPyAwIDogMjU1IC0gRkZNSU4oKCgyNTUgLSBCKSAqICgyNTUgLSBCKSkgLyBBLCAyNTUpKQorREVGSU5FX0JMRU5EOChmcmVlemUsICAgICAoQiA9PSAwKSA/IDAgOiAyNTUgLSBGRk1JTigoKDI1NSAtIEEpICogKDI1NSAtIEEpKSAvIEIsIDI1NSkpCiBERUZJTkVfQkxFTkQ4KGRhcmtlbiwgICAgIEZGTUlOKEEsIEIpKQogREVGSU5FX0JMRU5EOChsaWdodGVuLCAgICBGRk1BWChBLCBCKSkKIERFRklORV9CTEVORDgoZGl2aWRlLCAgICAgYXZfY2xpcF91aW50OChCID09IDAgPyAyNTUgOiAyNTUgKiBBIC8gQikpCkBAIC0yNzMsMTggKzI3OSwyMSBAQAogI2RlZmluZSBET0RHRShhLCBiKSAgICAgICAoKChhKSA9PSA2NTUzNSkgPyAoYSkgOiBGRk1JTig2NTUzNSwgKCgoYikgPDwgMTYpIC8gKDY1NTM1IC0gKGEpKSkpKQogCiBERUZJTkVfQkxFTkQxNihhZGRpdGlvbiwgICBGRk1JTig2NTUzNSwgQSArIEIpKQotREVGSU5FX0JMRU5EMTYoYWRkaXRpb24xMjgsIGF2X2NsaXBfdWludDE2KEEgKyBCIC0gMzI3NjgpKQorREVGSU5FX0JMRU5EMTYoZ3JhaW5tZXJnZSwgYXZfY2xpcF91aW50MTYoQSArIEIgLSAzMjc2OCkpCiBERUZJTkVfQkxFTkQxNihhdmVyYWdlLCAgICAoQSArIEIpIC8gMikKIERFRklORV9CTEVORDE2KHN1YnRyYWN0LCAgIEZGTUFYKDAsIEEgLSBCKSkKIERFRklORV9CTEVORDE2KG11bHRpcGx5LCAgIE1VTFRJUExZKDEsIEEsIEIpKQogREVGSU5FX0JMRU5EMTYobXVsdGlwbHkxMjgsIGF2X2NsaXBfdWludDE2KChBIC0gMzI3NjgpICogQiAvIDgxOTIuICsgMzI3NjgpKQogREVGSU5FX0JMRU5EMTYobmVnYXRpb24sICAgNjU1MzUgLSBGRkFCUyg2NTUzNSAtIEEgLSBCKSkKK0RFRklORV9CTEVORDE2KGV4dHJlbWl0eSwgIEZGQUJTKDY1NTM1IC0gQSAtIEIpKQogREVGSU5FX0JMRU5EMTYoZGlmZmVyZW5jZSwgRkZBQlMoQSAtIEIpKQotREVGSU5FX0JMRU5EMTYoZGlmZmVyZW5jZTEyOCwgYXZfY2xpcF91aW50MTYoMzI3NjggKyBBIC0gQikpCitERUZJTkVfQkxFTkQxNihncmFpbmV4dHJhY3QsIGF2X2NsaXBfdWludDE2KDMyNzY4ICsgQSAtIEIpKQogREVGSU5FX0JMRU5EMTYoc2NyZWVuLCAgICAgU0NSRUVOKDEsIEEsIEIpKQogREVGSU5FX0JMRU5EMTYob3ZlcmxheSwgICAgKEEgPCAzMjc2OCkgPyBNVUxUSVBMWSgyLCBBLCBCKSA6IFNDUkVFTigyLCBBLCBCKSkKIERFRklORV9CTEVORDE2KGhhcmRsaWdodCwgIChCIDwgMzI3NjgpID8gTVVMVElQTFkoMiwgQiwgQSkgOiBTQ1JFRU4oMiwgQiwgQSkpCiBERUZJTkVfQkxFTkQxNihoYXJkbWl4LCAgICAoQSA8ICg2NTUzNSAtIEIpKSA/IDA6IDY1NTM1KQorREVGSU5FX0JMRU5EMTYoaGVhdCwgICAgICAgKEEgPT0gMCkgPyAwIDogNjU1MzUgLSBGRk1JTigoKDY1NTM1IC0gQikgKiAoNjU1MzUgLSBCKSkgLyBBLCA2NTUzNSkpCitERUZJTkVfQkxFTkQxNihmcmVlemUsICAgICAoQiA9PSAwKSA/IDAgOiA2NTUzNSAtIEZGTUlOKCgoNjU1MzUgLSBBKSAqICg2NTUzNSAtIEEpKSAvIEIsIDY1NTM1KSkKIERFRklORV9CTEVORDE2KGRhcmtlbiwgICAgIEZGTUlOKEEsIEIpKQogREVGSU5FX0JMRU5EMTYobGlnaHRlbiwgICAgRkZNQVgoQSwgQikpCiBERUZJTkVfQkxFTkQxNihkaXZpZGUsICAgICBhdl9jbGlwX3VpbnQxNihCID09IDAgPyA2NTUzNSA6IDY1NTM1ICogQSAvIEIpKQpAQCAtMzA3LDcgKzMxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqX2JvdHRvbSwgcHRyZGlmZl90IGJvdHRvbV9saW5lc2l6ZSwgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKl9kc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUsICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgd2lkdGgsIHB0cmRpZmZfdCBoZWlnaHQsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyUGFyYW1zICpwYXJhbSwgZG91YmxlICp2YWx1ZXMpICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlclBhcmFtcyAqcGFyYW0sIGRvdWJsZSAqdmFsdWVzLCBpbnQgc3RhcnR5KSBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGNvbnN0IHR5cGUgKnRvcCA9ICh0eXBlKilfdG9wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjb25zdCB0eXBlICpib3R0b20gPSAodHlwZSopX2JvdHRvbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMTksNyArMzI4LDcgQEAKICAgICBib3R0b21fbGluZXNpemUgLz0gZGl2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdmFsdWVzW1ZBUl9ZXSA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbHVlc1tWQVJfWV0gPSB5ICsgc3RhcnR5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHZhbHVlc1tWQVJfWF0gICAgICA9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICB2YWx1ZXNbVkFSX1RPUF0gICAgPSB2YWx1ZXNbVkFSX0FdID0gdG9wW3hdOyAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzQ2LDcgKzM1NSw3IEBACiAgICAgdWludDhfdCAqZHN0ICAgID0gdGQtPmRzdC0+ZGF0YVt0ZC0+cGxhbmVdOwogICAgIGRvdWJsZSB2YWx1ZXNbVkFSX1ZBUlNfTkJdOwogCi0gICAgdmFsdWVzW1ZBUl9OXSAgPSB0ZC0+aW5saW5rLT5mcmFtZV9jb3VudDsKKyAgICB2YWx1ZXNbVkFSX05dICA9IHRkLT5pbmxpbmstPmZyYW1lX2NvdW50X291dDsKICAgICB2YWx1ZXNbVkFSX1RdICA9IHRkLT5kc3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/IE5BTiA6IHRkLT5kc3QtPnB0cyAqIGF2X3EyZCh0ZC0+aW5saW5rLT50aW1lX2Jhc2UpOwogICAgIHZhbHVlc1tWQVJfV10gID0gdGQtPnc7CiAgICAgdmFsdWVzW1ZBUl9IXSAgPSB0ZC0+aDsKQEAgLTM1OSw3ICszNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgdGQtPmJvdHRvbS0+bGluZXNpemVbdGQtPnBsYW5lXSwKICAgICAgICAgICAgICAgICAgICAgIGRzdCArIHNsaWNlX3N0YXJ0ICogdGQtPmRzdC0+bGluZXNpemVbdGQtPnBsYW5lXSwKICAgICAgICAgICAgICAgICAgICAgIHRkLT5kc3QtPmxpbmVzaXplW3RkLT5wbGFuZV0sCi0gICAgICAgICAgICAgICAgICAgICB0ZC0+dywgaGVpZ2h0LCB0ZC0+cGFyYW0sICZ2YWx1ZXNbMF0pOworICAgICAgICAgICAgICAgICAgICAgdGQtPncsIGhlaWdodCwgdGQtPnBhcmFtLCAmdmFsdWVzWzBdLCBzbGljZV9zdGFydCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM4Nyw3ICszOTYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAudyA9IG91dHcsIC5oID0gb3V0aCwgLnBhcmFtID0gcGFyYW0sIC5wbGFuZSA9IHBsYW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5saW5rID0gaW5saW5rIH07CiAKLSAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihvdXRoLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgRkZNSU4ob3V0aCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKICAgICB9CiAKICAgICBpZiAoIXMtPnRibGVuZCkKQEAgLTM5NiwxMyArNDA1LDI4IEBACiAgICAgcmV0dXJuIGRzdF9idWY7CiB9CiAKK3N0YXRpYyBpbnQgYmxlbmRfZnJhbWVfZm9yX2R1YWxpbnB1dChGRkZyYW1lU3luYyAqZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OworICAgIEFWRnJhbWUgKnRvcF9idWYsICpib3R0b21fYnVmLCAqZHN0X2J1ZjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfZnJhbWVzeW5jX2R1YWxpbnB1dF9nZXQoZnMsICZ0b3BfYnVmLCAmYm90dG9tX2J1Zik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKCFib3R0b21fYnVmKQorICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgdG9wX2J1Zik7CisgICAgZHN0X2J1ZiA9IGJsZW5kX2ZyYW1lKGN0eCwgdG9wX2J1ZiwgYm90dG9tX2J1Zik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIGRzdF9idWYpOworfQorCiBzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBCbGVuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAKICAgICBzLT50YmxlbmQgPSAhc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAidGJsZW5kIik7CiAKLSAgICBzLT5kaW5wdXQucHJvY2VzcyA9IGJsZW5kX2ZyYW1lOworICAgIHMtPmZzLm9uX2V2ZW50ID0gYmxlbmRfZnJhbWVfZm9yX2R1YWxpbnB1dDsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDE1LDcgKzQzOSw3IEBACiAgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HUkFZOCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKLSAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTYsIEFWX1BJWF9GTVRfR1JBWTE2LAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAxNiwgQVZfUElYX0ZNVF9HQlJBUDE2LCBBVl9QSVhfRk1UX0dSQVkxNiwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKIApAQCAtNDMwLDcgKzQ1NCw3IEBACiAgICAgQmxlbmRDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIGludCBpOwogCi0gICAgZmZfZHVhbGlucHV0X3VuaW5pdCgmcy0+ZGlucHV0KTsKKyAgICBmZl9mcmFtZXN5bmNfdW5pbml0KCZzLT5mcyk7CiAgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldl9mcmFtZSk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+cGFyYW1zKTsgaSsrKQpAQCAtNDQxLDE5ICs0NjUsMjIgQEAKIHsKICAgICBzd2l0Y2ggKHBhcmFtLT5tb2RlKSB7CiAgICAgY2FzZSBCTEVORF9BRERJVElPTjogICBwYXJhbS0+YmxlbmQgPSBpc18xNmJpdCA/IGJsZW5kX2FkZGl0aW9uXzE2Yml0ICAgOiBibGVuZF9hZGRpdGlvbl84Yml0OyAgIGJyZWFrOwotICAgIGNhc2UgQkxFTkRfQURESVRJT04xMjg6IHBhcmFtLT5ibGVuZCA9IGlzXzE2Yml0ID8gYmxlbmRfYWRkaXRpb24xMjhfMTZiaXQgOiBibGVuZF9hZGRpdGlvbjEyOF84Yml0OyBicmVhazsKKyAgICBjYXNlIEJMRU5EX0dSQUlOTUVSR0U6IHBhcmFtLT5ibGVuZCA9IGlzXzE2Yml0ID8gYmxlbmRfZ3JhaW5tZXJnZV8xNmJpdCA6IGJsZW5kX2dyYWlubWVyZ2VfOGJpdDsgYnJlYWs7CiAgICAgY2FzZSBCTEVORF9BTkQ6ICAgICAgICBwYXJhbS0+YmxlbmQgPSBpc18xNmJpdCA/IGJsZW5kX2FuZF8xNmJpdCAgICAgICAgOiBibGVuZF9hbmRfOGJpdDsgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQkxFTkRfQVZFUkFHRTogICAgcGFyYW0tPmJsZW5kID0gaXNfMTZiaXQgPyBibGVuZF9hdmVyYWdlXzE2Yml0ICAgIDogYmxlbmRfYXZlcmFnZV84Yml0OyAgICBicmVhazsKICAgICBjYXNlIEJMRU5EX0JVUk46ICAgICAgIHBhcmFtLT5ibGVuZCA9IGlzXzE2Yml0ID8gYmxlbmRfYnVybl8xNmJpdCAgICAgICA6IGJsZW5kX2J1cm5fOGJpdDsgICAgICAgYnJlYWs7CiAgICAgY2FzZSBCTEVORF9EQVJLRU46ICAgICBwYXJhbS0+YmxlbmQgPSBpc18xNmJpdCA/IGJsZW5kX2Rhcmtlbl8xNmJpdCAgICAgOiBibGVuZF9kYXJrZW5fOGJpdDsgICAgIGJyZWFrOwogICAgIGNhc2UgQkxFTkRfRElGRkVSRU5DRTogcGFyYW0tPmJsZW5kID0gaXNfMTZiaXQgPyBibGVuZF9kaWZmZXJlbmNlXzE2Yml0IDogYmxlbmRfZGlmZmVyZW5jZV84Yml0OyBicmVhazsKLSAgICBjYXNlIEJMRU5EX0RJRkZFUkVOQ0UxMjg6IHBhcmFtLT5ibGVuZCA9IGlzXzE2Yml0ID8gYmxlbmRfZGlmZmVyZW5jZTEyOF8xNmJpdDogYmxlbmRfZGlmZmVyZW5jZTEyOF84Yml0OyBicmVhazsKKyAgICBjYXNlIEJMRU5EX0dSQUlORVhUUkFDVDogcGFyYW0tPmJsZW5kID0gaXNfMTZiaXQgPyBibGVuZF9ncmFpbmV4dHJhY3RfMTZiaXQ6IGJsZW5kX2dyYWluZXh0cmFjdF84Yml0OyBicmVhazsKICAgICBjYXNlIEJMRU5EX0RJVklERTogICAgIHBhcmFtLT5ibGVuZCA9IGlzXzE2Yml0ID8gYmxlbmRfZGl2aWRlXzE2Yml0ICAgICA6IGJsZW5kX2RpdmlkZV84Yml0OyAgICAgYnJlYWs7CiAgICAgY2FzZSBCTEVORF9ET0RHRTogICAgICBwYXJhbS0+YmxlbmQgPSBpc18xNmJpdCA/IGJsZW5kX2RvZGdlXzE2Yml0ICAgICAgOiBibGVuZF9kb2RnZV84Yml0OyAgICAgIGJyZWFrOwogICAgIGNhc2UgQkxFTkRfRVhDTFVTSU9OOiAgcGFyYW0tPmJsZW5kID0gaXNfMTZiaXQgPyBibGVuZF9leGNsdXNpb25fMTZiaXQgIDogYmxlbmRfZXhjbHVzaW9uXzhiaXQ7ICBicmVhazsKKyAgICBjYXNlIEJMRU5EX0VYVFJFTUlUWTogIHBhcmFtLT5ibGVuZCA9IGlzXzE2Yml0ID8gYmxlbmRfZXh0cmVtaXR5XzE2Yml0ICA6IGJsZW5kX2V4dHJlbWl0eV84Yml0OyAgYnJlYWs7CisgICAgY2FzZSBCTEVORF9GUkVFWkU6ICAgICBwYXJhbS0+YmxlbmQgPSBpc18xNmJpdCA/IGJsZW5kX2ZyZWV6ZV8xNmJpdCAgICAgOiBibGVuZF9mcmVlemVfOGJpdDsgICAgIGJyZWFrOwogICAgIGNhc2UgQkxFTkRfR0xPVzogICAgICAgcGFyYW0tPmJsZW5kID0gaXNfMTZiaXQgPyBibGVuZF9nbG93XzE2Yml0ICAgICAgIDogYmxlbmRfZ2xvd184Yml0OyAgICAgICBicmVhazsKICAgICBjYXNlIEJMRU5EX0hBUkRMSUdIVDogIHBhcmFtLT5ibGVuZCA9IGlzXzE2Yml0ID8gYmxlbmRfaGFyZGxpZ2h0XzE2Yml0ICA6IGJsZW5kX2hhcmRsaWdodF84Yml0OyAgYnJlYWs7CiAgICAgY2FzZSBCTEVORF9IQVJETUlYOiAgICBwYXJhbS0+YmxlbmQgPSBpc18xNmJpdCA/IGJsZW5kX2hhcmRtaXhfMTZiaXQgICAgOiBibGVuZF9oYXJkbWl4XzhiaXQ7ICAgIGJyZWFrOworICAgIGNhc2UgQkxFTkRfSEVBVDogICAgICAgcGFyYW0tPmJsZW5kID0gaXNfMTZiaXQgPyBibGVuZF9oZWF0XzE2Yml0ICAgICAgIDogYmxlbmRfaGVhdF84Yml0OyAgICAgICBicmVhazsKICAgICBjYXNlIEJMRU5EX0xJR0hURU46ICAgIHBhcmFtLT5ibGVuZCA9IGlzXzE2Yml0ID8gYmxlbmRfbGlnaHRlbl8xNmJpdCAgICA6IGJsZW5kX2xpZ2h0ZW5fOGJpdDsgICAgYnJlYWs7CiAgICAgY2FzZSBCTEVORF9MSU5FQVJMSUdIVDpwYXJhbS0+YmxlbmQgPSBpc18xNmJpdCA/IGJsZW5kX2xpbmVhcmxpZ2h0XzE2Yml0OiBibGVuZF9saW5lYXJsaWdodF84Yml0O2JyZWFrOwogICAgIGNhc2UgQkxFTkRfTVVMVElQTFk6ICAgcGFyYW0tPmJsZW5kID0gaXNfMTZiaXQgPyBibGVuZF9tdWx0aXBseV8xNmJpdCAgIDogYmxlbmRfbXVsdGlwbHlfOGJpdDsgICBicmVhazsKQEAgLTQ5NywxOSArNTI0LDEyIEBACiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dHMgbXVzdCBiZSBvZiBzYW1lIHBpeGVsIGZvcm1hdFxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9Ci0gICAgICAgIGlmICh0b3BsaW5rLT53ICAgICAgICAgICAgICAgICAgICAgICAhPSBib3R0b21saW5rLT53IHx8Ci0gICAgICAgICAgICB0b3BsaW5rLT5oICAgICAgICAgICAgICAgICAgICAgICAhPSBib3R0b21saW5rLT5oIHx8Ci0gICAgICAgICAgICB0b3BsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSBib3R0b21saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSB8fAotICAgICAgICAgICAgdG9wbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gIT0gYm90dG9tbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pIHsKKyAgICAgICAgaWYgKHRvcGxpbmstPncgIT0gYm90dG9tbGluay0+dyB8fCB0b3BsaW5rLT5oICE9IGJvdHRvbWxpbmstPmgpIHsKICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZpcnN0IGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAiCi0gICAgICAgICAgICAgICAgICAgIihzaXplICVkeCVkLCBTQVIgJWQ6JWQpIGRvIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyAiCi0gICAgICAgICAgICAgICAgICAgInNlY29uZCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgKCVkeCVkLCBTQVIgJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICIoc2l6ZSAlZHglZCkgZG8gbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nICIKKyAgICAgICAgICAgICAgICAgICAic2Vjb25kIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAoc2l6ZSAlZHglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzW1RPUF0ubmFtZSwgdG9wbGluay0+dywgdG9wbGluay0+aCwKLSAgICAgICAgICAgICAgICAgICB0b3BsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgICAgICB0b3BsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKLSAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbQk9UVE9NXS5uYW1lLCBib3R0b21saW5rLT53LCBib3R0b21saW5rLT5oLAotICAgICAgICAgICAgICAgICAgIGJvdHRvbWxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAotICAgICAgICAgICAgICAgICAgIGJvdHRvbWxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbQk9UVE9NXS5uYW1lLCBib3R0b21saW5rLT53LCBib3R0b21saW5rLT5oKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KICAgICB9CkBAIC01MjcsNyArNTQ3LDcgQEAKICAgICBzLT5uYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyh0b3BsaW5rLT5mb3JtYXQpOwogCiAgICAgaWYgKCFzLT50YmxlbmQpCi0gICAgICAgIGlmICgocmV0ID0gZmZfZHVhbGlucHV0X2luaXQoY3R4LCAmcy0+ZGlucHV0KSkgPCAwKQorICAgICAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19pbml0X2R1YWxpbnB1dCgmcy0+ZnMsIGN0eCkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBGRl9BUlJBWV9FTEVNUyhzLT5wYXJhbXMpOyBwbGFuZSsrKSB7CkBAIC01NTQsMzIgKzU3NCwyNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHMtPnRibGVuZCA/IDAgOiBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZzLT5mcyk7CiB9CiAKICNpZiBDT05GSUdfQkxFTkRfRklMVEVSCiAKLXN0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewotICAgIEJsZW5kQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKLSAgICByZXR1cm4gZmZfZHVhbGlucHV0X3JlcXVlc3RfZnJhbWUoJnMtPmRpbnB1dCwgb3V0bGluayk7Ci19Ci0KLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCi17Ci0gICAgQmxlbmRDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7Ci0gICAgcmV0dXJuIGZmX2R1YWxpbnB1dF9maWx0ZXJfZnJhbWUoJnMtPmRpbnB1dCwgaW5saW5rLCBidWYpOworICAgIEJsZW5kQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7CiB9CiAKIHN0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBibGVuZF9pbnB1dHNbXSA9IHsKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgID0gInRvcCIsCiAgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAuZmlsdGVyX2ZyYW1lICA9IGZpbHRlcl9mcmFtZSwKICAgICB9LHsKICAgICAgICAgLm5hbWUgICAgICAgICAgPSAiYm90dG9tIiwKICAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgID0gZmlsdGVyX2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC01ODksNyArNjAxLDYgQEAKICAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCi0gICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtNTk3LDEwICs2MDgsMTIgQEAKIEFWRmlsdGVyIGZmX3ZmX2JsZW5kID0gewogICAgIC5uYW1lICAgICAgICAgID0gImJsZW5kIiwKICAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJCbGVuZCB0d28gdmlkZW8gZnJhbWVzIGludG8gZWFjaCBvdGhlci4iKSwKKyAgICAucHJlaW5pdCAgICAgICA9IGJsZW5kX2ZyYW1lc3luY19wcmVpbml0LAogICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKICAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKICAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihCbGVuZENvbnRleHQpLAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAogICAgIC5pbnB1dHMgICAgICAgID0gYmxlbmRfaW5wdXRzLAogICAgIC5vdXRwdXRzICAgICAgID0gYmxlbmRfb3V0cHV0cywKICAgICAucHJpdl9jbGFzcyAgICA9ICZibGVuZF9jbGFzcywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2J3ZGlmLmMgYi9saWJhdmZpbHRlci92Zl9id2RpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OTE5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9id2RpZi5jCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogQm9iV2VhdmVyIERlaW50ZXJsYWNpbmcgRmlsdGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhvbWFzIE11bmR0IDxsb3VkbWF4QHlhaG9vLmRlPgorICoKKyAqIEJhc2VkIG9uIFlBRElGIChZZXQgQW5vdGhlciBEZWludGVybGFjaW5nIEZpbHRlcikKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKiAgICAgICAgICAgICAgIDIwMTAgICAgICBKYW1lcyBEYXJubGV5IDxqYW1lcy5kYXJubGV5QGdtYWlsLmNvbT4KKyAqCisgKiBXaXRoIHVzZSBvZiBXZXN0b24gMyBGaWVsZCBEZWludGVybGFjaW5nIEZpbHRlciBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMjAxMiBCcml0aXNoIEJyb2FkY2FzdGluZyBDb3Jwb3JhdGlvbiwgQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogQXV0aG9yIG9mIGRlLWludGVybGFjZSBhbGdvcml0aG06IEppbSBFYXN0ZXJicm9vayBmb3IgQkJDIFImRAorICogQmFzZWQgb24gdGhlIHByb2Nlc3MgZGVzY3JpYmVkIGJ5IE1hcnRpbiBXZXN0b24gZm9yIEJCQyBSJkQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiYndkaWYuaCIKKworLyoKKyAqIEZpbHRlciBjb2VmZmljaWVudHMgY29lZl9sZiBhbmQgY29lZl9oZiB0YWtlbiBmcm9tIEJCQyBQSC0yMDcxIChXZXN0b24gMyBGaWVsZCBEZWludGVybGFjZXIpLgorICogVXNlZCB3aGVuIHRoZXJlIGlzIHNwYXRpYWwgYW5kIHRlbXBvcmFsIGludGVycG9sYXRpb24uCisgKiBGaWx0ZXIgY29lZmZpY2llbnRzIGNvZWZfc3AgYXJlIHVzZWQgd2hlbiB0aGVyZSBpcyBzcGF0aWFsIGludGVycG9sYXRpb24gb25seS4KKyAqIEFkanVzdGVkIGZvciBtYXRjaGluZyB2aXN1YWwgc2hhcnBuZXNzIGltcHJlc3Npb24gb2Ygc3BhdGlhbCBhbmQgdGVtcG9yYWwgaW50ZXJwb2xhdGlvbi4KKyAqLworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNvZWZfbGZbMl0gPSB7IDQzMDksIDIxMyB9Oworc3RhdGljIGNvbnN0IHVpbnQxNl90IGNvZWZfaGZbM10gPSB7IDU1NzAsIDM4MDEsIDEwMTYgfTsKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBjb2VmX3NwWzJdID0geyA1MDc3LCA5ODEgfTsKKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgQVZGcmFtZSAqZnJhbWU7CisgICAgaW50IHBsYW5lOworICAgIGludCB3LCBoOworICAgIGludCBwYXJpdHk7CisgICAgaW50IHRmZjsKK30gVGhyZWFkRGF0YTsKKworI2RlZmluZSBGSUxURVJfSU5UUkEoKSBcCisgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeyBcCisgICAgICAgIGludGVycG9sID0gKGNvZWZfc3BbMF0gKiAoY3VyW21yZWZzXSArIGN1cltwcmVmc10pIC0gY29lZl9zcFsxXSAqIChjdXJbbXJlZnMzXSArIGN1cltwcmVmczNdKSkgPj4gMTM7IFwKKyAgICAgICAgZHN0WzBdID0gYXZfY2xpcChpbnRlcnBvbCwgMCwgY2xpcF9tYXgpOyBcCisgXAorICAgICAgICBkc3QrKzsgXAorICAgICAgICBjdXIrKzsgXAorICAgIH0KKworI2RlZmluZSBGSUxURVIxKCkgXAorICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsgXAorICAgICAgICBpbnQgYyA9IGN1clttcmVmc107IFwKKyAgICAgICAgaW50IGQgPSAocHJldjJbMF0gKyBuZXh0MlswXSkgPj4gMTsgXAorICAgICAgICBpbnQgZSA9IGN1cltwcmVmc107IFwKKyAgICAgICAgaW50IHRlbXBvcmFsX2RpZmYwID0gRkZBQlMocHJldjJbMF0gLSBuZXh0MlswXSk7IFwKKyAgICAgICAgaW50IHRlbXBvcmFsX2RpZmYxID0oRkZBQlMocHJldlttcmVmc10gLSBjKSArIEZGQUJTKHByZXZbcHJlZnNdIC0gZSkpID4+IDE7IFwKKyAgICAgICAgaW50IHRlbXBvcmFsX2RpZmYyID0oRkZBQlMobmV4dFttcmVmc10gLSBjKSArIEZGQUJTKG5leHRbcHJlZnNdIC0gZSkpID4+IDE7IFwKKyAgICAgICAgaW50IGRpZmYgPSBGRk1BWDModGVtcG9yYWxfZGlmZjAgPj4gMSwgdGVtcG9yYWxfZGlmZjEsIHRlbXBvcmFsX2RpZmYyKTsgXAorIFwKKyAgICAgICAgaWYgKCFkaWZmKSB7IFwKKyAgICAgICAgICAgIGRzdFswXSA9IGQ7IFwKKyAgICAgICAgfSBlbHNlIHsKKworI2RlZmluZSBTUEFUX0NIRUNLKCkgXAorICAgICAgICAgICAgaW50IGIgPSAoKHByZXYyW21yZWZzMl0gKyBuZXh0MlttcmVmczJdKSA+PiAxKSAtIGM7IFwKKyAgICAgICAgICAgIGludCBmID0gKChwcmV2MltwcmVmczJdICsgbmV4dDJbcHJlZnMyXSkgPj4gMSkgLSBlOyBcCisgICAgICAgICAgICBpbnQgZGMgPSBkIC0gYzsgXAorICAgICAgICAgICAgaW50IGRlID0gZCAtIGU7IFwKKyAgICAgICAgICAgIGludCBtYXggPSBGRk1BWDMoZGUsIGRjLCBGRk1JTihiLCBmKSk7IFwKKyAgICAgICAgICAgIGludCBtaW4gPSBGRk1JTjMoZGUsIGRjLCBGRk1BWChiLCBmKSk7IFwKKyAgICAgICAgICAgIGRpZmYgPSBGRk1BWDMoZGlmZiwgbWluLCAtbWF4KTsKKworI2RlZmluZSBGSUxURVJfTElORSgpIFwKKyAgICAgICAgICAgIFNQQVRfQ0hFQ0soKSBcCisgICAgICAgICAgICBpZiAoRkZBQlMoYyAtIGUpID4gdGVtcG9yYWxfZGlmZjApIHsgXAorICAgICAgICAgICAgICAgIGludGVycG9sID0gKCgoY29lZl9oZlswXSAqIChwcmV2MlswXSArIG5leHQyWzBdKSBcCisgICAgICAgICAgICAgICAgICAgIC0gY29lZl9oZlsxXSAqIChwcmV2MlttcmVmczJdICsgbmV4dDJbbXJlZnMyXSArIHByZXYyW3ByZWZzMl0gKyBuZXh0MltwcmVmczJdKSBcCisgICAgICAgICAgICAgICAgICAgICsgY29lZl9oZlsyXSAqIChwcmV2MlttcmVmczRdICsgbmV4dDJbbXJlZnM0XSArIHByZXYyW3ByZWZzNF0gKyBuZXh0MltwcmVmczRdKSkgPj4gMikgXAorICAgICAgICAgICAgICAgICAgICArIGNvZWZfbGZbMF0gKiAoYyArIGUpIC0gY29lZl9sZlsxXSAqIChjdXJbbXJlZnMzXSArIGN1cltwcmVmczNdKSkgPj4gMTM7IFwKKyAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBpbnRlcnBvbCA9IChjb2VmX3NwWzBdICogKGMgKyBlKSAtIGNvZWZfc3BbMV0gKiAoY3VyW21yZWZzM10gKyBjdXJbcHJlZnMzXSkpID4+IDEzOyBcCisgICAgICAgICAgICB9CisKKyNkZWZpbmUgRklMVEVSX0VER0UoKSBcCisgICAgICAgICAgICBpZiAoc3BhdCkgeyBcCisgICAgICAgICAgICAgICAgU1BBVF9DSEVDSygpIFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgaW50ZXJwb2wgPSAoYyArIGUpID4+IDE7CisKKyNkZWZpbmUgRklMVEVSMigpIFwKKyAgICAgICAgICAgIGlmIChpbnRlcnBvbCA+IGQgKyBkaWZmKSBcCisgICAgICAgICAgICAgICAgaW50ZXJwb2wgPSBkICsgZGlmZjsgXAorICAgICAgICAgICAgZWxzZSBpZiAoaW50ZXJwb2wgPCBkIC0gZGlmZikgXAorICAgICAgICAgICAgICAgIGludGVycG9sID0gZCAtIGRpZmY7IFwKKyBcCisgICAgICAgICAgICBkc3RbMF0gPSBhdl9jbGlwKGludGVycG9sLCAwLCBjbGlwX21heCk7IFwKKyAgICAgICAgfSBcCisgXAorICAgICAgICBkc3QrKzsgXAorICAgICAgICBjdXIrKzsgXAorICAgICAgICBwcmV2Kys7IFwKKyAgICAgICAgbmV4dCsrOyBcCisgICAgICAgIHByZXYyKys7IFwKKyAgICAgICAgbmV4dDIrKzsgXAorICAgIH0KKworc3RhdGljIHZvaWQgZmlsdGVyX2ludHJhKHZvaWQgKmRzdDEsIHZvaWQgKmN1cjEsIGludCB3LCBpbnQgcHJlZnMsIGludCBtcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJlZnMzLCBpbnQgbXJlZnMzLCBpbnQgcGFyaXR5LCBpbnQgY2xpcF9tYXgpCit7CisgICAgdWludDhfdCAqZHN0ID0gZHN0MTsKKyAgICB1aW50OF90ICpjdXIgPSBjdXIxOworICAgIGludCBpbnRlcnBvbCwgeDsKKworICAgIEZJTFRFUl9JTlRSQSgpCit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9saW5lX2Modm9pZCAqZHN0MSwgdm9pZCAqcHJldjEsIHZvaWQgKmN1cjEsIHZvaWQgKm5leHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsIGludCBwcmVmczIsIGludCBtcmVmczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVmczMsIGludCBtcmVmczMsIGludCBwcmVmczQsIGludCBtcmVmczQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJpdHksIGludCBjbGlwX21heCkKK3sKKyAgICB1aW50OF90ICpkc3QgICA9IGRzdDE7CisgICAgdWludDhfdCAqcHJldiAgPSBwcmV2MTsKKyAgICB1aW50OF90ICpjdXIgICA9IGN1cjE7CisgICAgdWludDhfdCAqbmV4dCAgPSBuZXh0MTsKKyAgICB1aW50OF90ICpwcmV2MiA9IHBhcml0eSA/IHByZXYgOiBjdXIgOworICAgIHVpbnQ4X3QgKm5leHQyID0gcGFyaXR5ID8gY3VyICA6IG5leHQ7CisgICAgaW50IGludGVycG9sLCB4OworCisgICAgRklMVEVSMSgpCisgICAgRklMVEVSX0xJTkUoKQorICAgIEZJTFRFUjIoKQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXJfZWRnZSh2b2lkICpkc3QxLCB2b2lkICpwcmV2MSwgdm9pZCAqY3VyMSwgdm9pZCAqbmV4dDEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsIGludCBwcmVmczIsIGludCBtcmVmczIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyaXR5LCBpbnQgY2xpcF9tYXgsIGludCBzcGF0KQoreworICAgIHVpbnQ4X3QgKmRzdCAgID0gZHN0MTsKKyAgICB1aW50OF90ICpwcmV2ICA9IHByZXYxOworICAgIHVpbnQ4X3QgKmN1ciAgID0gY3VyMTsKKyAgICB1aW50OF90ICpuZXh0ICA9IG5leHQxOworICAgIHVpbnQ4X3QgKnByZXYyID0gcGFyaXR5ID8gcHJldiA6IGN1ciA7CisgICAgdWludDhfdCAqbmV4dDIgPSBwYXJpdHkgPyBjdXIgIDogbmV4dDsKKyAgICBpbnQgaW50ZXJwb2wsIHg7CisKKyAgICBGSUxURVIxKCkKKyAgICBGSUxURVJfRURHRSgpCisgICAgRklMVEVSMigpCit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9pbnRyYV8xNmJpdCh2b2lkICpkc3QxLCB2b2lkICpjdXIxLCBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWZzMywgaW50IG1yZWZzMywgaW50IHBhcml0eSwgaW50IGNsaXBfbWF4KQoreworICAgIHVpbnQxNl90ICpkc3QgPSBkc3QxOworICAgIHVpbnQxNl90ICpjdXIgPSBjdXIxOworICAgIGludCBpbnRlcnBvbCwgeDsKKworICAgIEZJTFRFUl9JTlRSQSgpCit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9saW5lX2NfMTZiaXQodm9pZCAqZHN0MSwgdm9pZCAqcHJldjEsIHZvaWQgKmN1cjEsIHZvaWQgKm5leHQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsIGludCBwcmVmczIsIGludCBtcmVmczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVmczMsIGludCBtcmVmczMsIGludCBwcmVmczQsIGludCBtcmVmczQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJpdHksIGludCBjbGlwX21heCkKK3sKKyAgICB1aW50MTZfdCAqZHN0ICAgPSBkc3QxOworICAgIHVpbnQxNl90ICpwcmV2ICA9IHByZXYxOworICAgIHVpbnQxNl90ICpjdXIgICA9IGN1cjE7CisgICAgdWludDE2X3QgKm5leHQgID0gbmV4dDE7CisgICAgdWludDE2X3QgKnByZXYyID0gcGFyaXR5ID8gcHJldiA6IGN1ciA7CisgICAgdWludDE2X3QgKm5leHQyID0gcGFyaXR5ID8gY3VyICA6IG5leHQ7CisgICAgaW50IGludGVycG9sLCB4OworCisgICAgRklMVEVSMSgpCisgICAgRklMVEVSX0xJTkUoKQorICAgIEZJTFRFUjIoKQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXJfZWRnZV8xNmJpdCh2b2lkICpkc3QxLCB2b2lkICpwcmV2MSwgdm9pZCAqY3VyMSwgdm9pZCAqbmV4dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsIGludCBwcmVmczIsIGludCBtcmVmczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyaXR5LCBpbnQgY2xpcF9tYXgsIGludCBzcGF0KQoreworICAgIHVpbnQxNl90ICpkc3QgICA9IGRzdDE7CisgICAgdWludDE2X3QgKnByZXYgID0gcHJldjE7CisgICAgdWludDE2X3QgKmN1ciAgID0gY3VyMTsKKyAgICB1aW50MTZfdCAqbmV4dCAgPSBuZXh0MTsKKyAgICB1aW50MTZfdCAqcHJldjIgPSBwYXJpdHkgPyBwcmV2IDogY3VyIDsKKyAgICB1aW50MTZfdCAqbmV4dDIgPSBwYXJpdHkgPyBjdXIgIDogbmV4dDsKKyAgICBpbnQgaW50ZXJwb2wsIHg7CisKKyAgICBGSUxURVIxKCkKKyAgICBGSUxURVJfRURHRSgpCisgICAgRklMVEVSMigpCit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3NsaWNlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgQldESUZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFRocmVhZERhdGEgKnRkICA9IGFyZzsKKyAgICBpbnQgbGluZXNpemUgPSBzLT5jdXItPmxpbmVzaXplW3RkLT5wbGFuZV07CisgICAgaW50IGNsaXBfbWF4ID0gKDEgPDwgKHMtPmNzcC0+Y29tcFt0ZC0+cGxhbmVdLmRlcHRoKSkgLSAxOworICAgIGludCBkZiA9IChzLT5jc3AtPmNvbXBbdGQtPnBsYW5lXS5kZXB0aCArIDcpIC8gODsKKyAgICBpbnQgcmVmcyA9IGxpbmVzaXplIC8gZGY7CisgICAgaW50IHNsaWNlX3N0YXJ0ID0gKHRkLT5oICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgaW50IHNsaWNlX2VuZCAgID0gKHRkLT5oICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSBzbGljZV9zdGFydDsgeSA8IHNsaWNlX2VuZDsgeSsrKSB7CisgICAgICAgIGlmICgoeSBeIHRkLT5wYXJpdHkpICYgMSkgeworICAgICAgICAgICAgdWludDhfdCAqcHJldiA9ICZzLT5wcmV2LT5kYXRhW3RkLT5wbGFuZV1beSAqIGxpbmVzaXplXTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmN1ciAgPSAmcy0+Y3VyIC0+ZGF0YVt0ZC0+cGxhbmVdW3kgKiBsaW5lc2l6ZV07CisgICAgICAgICAgICB1aW50OF90ICpuZXh0ID0gJnMtPm5leHQtPmRhdGFbdGQtPnBsYW5lXVt5ICogbGluZXNpemVdOworICAgICAgICAgICAgdWludDhfdCAqZHN0ICA9ICZ0ZC0+ZnJhbWUtPmRhdGFbdGQtPnBsYW5lXVt5ICogdGQtPmZyYW1lLT5saW5lc2l6ZVt0ZC0+cGxhbmVdXTsKKyAgICAgICAgICAgIGlmICghcy0+aW50ZXJfZmllbGQpIHsKKyAgICAgICAgICAgICAgICBzLT5maWx0ZXJfaW50cmEoZHN0LCBjdXIsIHRkLT53LCAoeSArIGRmKSA8IHRkLT5oID8gcmVmcyA6IC1yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID4gKGRmIC0gMSkgPyAtcmVmcyA6IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5ICsgMypkZikgPCB0ZC0+aCA/IDMgKiByZWZzIDogLXJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPiAoMypkZiAtIDEpID8gLTMgKiByZWZzIDogcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnBhcml0eSBeIHRkLT50ZmYsIGNsaXBfbWF4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHkgPCA0KSB8fCAoKHkgKyA1KSA+IHRkLT5oKSkgeworICAgICAgICAgICAgICAgIHMtPmZpbHRlcl9lZGdlKGRzdCwgcHJldiwgY3VyLCBuZXh0LCB0ZC0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeSArIGRmKSA8IHRkLT5oID8gcmVmcyA6IC1yZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPiAoZGYgLSAxKSA/IC1yZWZzIDogcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZzIDw8IDEsIC0ocmVmcyA8PCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+cGFyaXR5IF4gdGQtPnRmZiwgY2xpcF9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgPCAyKSB8fCAoKHkgKyAzKSA+IHRkLT5oKSA/IDAgOiAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcy0+ZmlsdGVyX2xpbmUoZHN0LCBwcmV2LCBjdXIsIG5leHQsIHRkLT53LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnMsIC1yZWZzLCByZWZzIDw8IDEsIC0ocmVmcyA8PCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICogcmVmcywgLTMgKiByZWZzLCByZWZzIDw8IDIsIC0ocmVmcyA8PCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+cGFyaXR5IF4gdGQtPnRmZiwgY2xpcF9tYXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KCZ0ZC0+ZnJhbWUtPmRhdGFbdGQtPnBsYW5lXVt5ICogdGQtPmZyYW1lLT5saW5lc2l6ZVt0ZC0+cGxhbmVdXSwKKyAgICAgICAgICAgICAgICAgICAmcy0+Y3VyLT5kYXRhW3RkLT5wbGFuZV1beSAqIGxpbmVzaXplXSwgdGQtPncgKiBkZik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0cGljLAorICAgICAgICAgICAgICAgICAgIGludCBwYXJpdHksIGludCB0ZmYpCit7CisgICAgQldESUZDb250ZXh0ICpid2RpZiA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhIHRkID0geyAuZnJhbWUgPSBkc3RwaWMsIC5wYXJpdHkgPSBwYXJpdHksIC50ZmYgPSB0ZmYgfTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBid2RpZi0+Y3NwLT5uYl9jb21wb25lbnRzOyBpKyspIHsKKyAgICAgICAgaW50IHcgPSBkc3RwaWMtPndpZHRoOworICAgICAgICBpbnQgaCA9IGRzdHBpYy0+aGVpZ2h0OworCisgICAgICAgIGlmIChpID09IDEgfHwgaSA9PSAyKSB7CisgICAgICAgICAgICB3ID0gQVZfQ0VJTF9SU0hJRlQodywgYndkaWYtPmNzcC0+bG9nMl9jaHJvbWFfdyk7CisgICAgICAgICAgICBoID0gQVZfQ0VJTF9SU0hJRlQoaCwgYndkaWYtPmNzcC0+bG9nMl9jaHJvbWFfaCk7CisgICAgICAgIH0KKworICAgICAgICB0ZC53ICAgICA9IHc7CisgICAgICAgIHRkLmggICAgID0gaDsKKyAgICAgICAgdGQucGxhbmUgPSBpOworCisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgRkZNSU4oaCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKKyAgICB9CisgICAgaWYgKCFid2RpZi0+aW50ZXJfZmllbGQpIHsKKyAgICAgICAgYndkaWYtPmludGVyX2ZpZWxkID0gMTsKKyAgICB9CisKKyAgICBlbW1zX2MoKTsKK30KKworc3RhdGljIGludCByZXR1cm5fZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGludCBpc19zZWNvbmQpCit7CisgICAgQldESUZDb250ZXh0ICpid2RpZiA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmxpbmsgID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGludCB0ZmYsIHJldDsKKworICAgIGlmIChid2RpZi0+cGFyaXR5ID09IC0xKSB7CisgICAgICAgIHRmZiA9IGJ3ZGlmLT5jdXItPmludGVybGFjZWRfZnJhbWUgPworICAgICAgICAgICAgICBid2RpZi0+Y3VyLT50b3BfZmllbGRfZmlyc3QgOiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHRmZiA9IGJ3ZGlmLT5wYXJpdHkgXiAxOworICAgIH0KKworICAgIGlmIChpc19zZWNvbmQpIHsKKyAgICAgICAgYndkaWYtPm91dCA9IGZmX2dldF92aWRlb19idWZmZXIobGluaywgbGluay0+dywgbGluay0+aCk7CisgICAgICAgIGlmICghYndkaWYtPm91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhid2RpZi0+b3V0LCBid2RpZi0+Y3VyKTsKKyAgICAgICAgYndkaWYtPm91dC0+aW50ZXJsYWNlZF9mcmFtZSA9IDA7CisgICAgICAgIGlmIChid2RpZi0+aW50ZXJfZmllbGQgPCAwKQorICAgICAgICAgICAgYndkaWYtPmludGVyX2ZpZWxkID0gMDsKKyAgICB9CisKKyAgICBmaWx0ZXIoY3R4LCBid2RpZi0+b3V0LCB0ZmYgXiAhaXNfc2Vjb25kLCB0ZmYpOworCisgICAgaWYgKGlzX3NlY29uZCkgeworICAgICAgICBpbnQ2NF90IGN1cl9wdHMgID0gYndkaWYtPmN1ci0+cHRzOworICAgICAgICBpbnQ2NF90IG5leHRfcHRzID0gYndkaWYtPm5leHQtPnB0czsKKworICAgICAgICBpZiAobmV4dF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgY3VyX3B0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgYndkaWYtPm91dC0+cHRzID0gY3VyX3B0cyArIG5leHRfcHRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYndkaWYtPm91dC0+cHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgYndkaWYtPm91dCk7CisKKyAgICBid2RpZi0+ZnJhbWVfcGVuZGluZyA9IChid2RpZi0+bW9kZSYxKSAmJiAhaXNfc2Vjb25kOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tzdHJpZGUoQldESUZDb250ZXh0ICpid2RpZiwgY29uc3QgQVZGcmFtZSAqYSwgY29uc3QgQVZGcmFtZSAqYikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYndkaWYtPmNzcC0+bmJfY29tcG9uZW50czsgaSsrKQorICAgICAgICBpZiAoYS0+bGluZXNpemVbaV0gIT0gYi0+bGluZXNpemVbaV0pCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZml4c3RyaWRlKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZikKK3sKKyAgICBBVkZyYW1lICpkc3QgPSBmZl9kZWZhdWx0X2dldF92aWRlb19idWZmZXIobGluaywgZi0+d2lkdGgsIGYtPmhlaWdodCk7CisgICAgaWYoIWRzdCkKKyAgICAgICAgcmV0dXJuOworICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMoZHN0LCBmKTsKKyAgICBhdl9pbWFnZV9jb3B5KGRzdC0+ZGF0YSwgZHN0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKWYtPmRhdGEsIGYtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgZHN0LT5mb3JtYXQsIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKKyAgICBhdl9mcmFtZV91bnJlZihmKTsKKyAgICBhdl9mcmFtZV9tb3ZlX3JlZihmLCBkc3QpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmRzdCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5kc3Q7CisgICAgQldESUZDb250ZXh0ICpid2RpZiA9IGN0eC0+cHJpdjsKKworICAgIGF2X2Fzc2VydDAoZnJhbWUpOworCisgICAgaWYgKGJ3ZGlmLT5mcmFtZV9wZW5kaW5nKQorICAgICAgICByZXR1cm5fZnJhbWUoY3R4LCAxKTsKKworICAgIGlmIChid2RpZi0+cHJldikKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYndkaWYtPnByZXYpOworICAgIGJ3ZGlmLT5wcmV2ID0gYndkaWYtPmN1cjsKKyAgICBid2RpZi0+Y3VyICA9IGJ3ZGlmLT5uZXh0OworICAgIGJ3ZGlmLT5uZXh0ID0gZnJhbWU7CisKKyAgICBpZiAoIWJ3ZGlmLT5jdXIpIHsKKyAgICAgICAgYndkaWYtPmN1ciA9IGF2X2ZyYW1lX2Nsb25lKGJ3ZGlmLT5uZXh0KTsKKyAgICAgICAgaWYgKCFid2RpZi0+Y3VyKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYndkaWYtPmludGVyX2ZpZWxkID0gMDsKKyAgICB9CisKKyAgICBpZiAoY2hlY2tzdHJpZGUoYndkaWYsIGJ3ZGlmLT5uZXh0LCBid2RpZi0+Y3VyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlJlYWxsb2NhdGluZyBmcmFtZSBkdWUgdG8gZGlmZmVyaW5nIHN0cmlkZVxuIik7CisgICAgICAgIGZpeHN0cmlkZShsaW5rLCBid2RpZi0+bmV4dCk7CisgICAgfQorICAgIGlmIChjaGVja3N0cmlkZShid2RpZiwgYndkaWYtPm5leHQsIGJ3ZGlmLT5jdXIpKQorICAgICAgICBmaXhzdHJpZGUobGluaywgYndkaWYtPmN1cik7CisgICAgaWYgKGJ3ZGlmLT5wcmV2ICYmIGNoZWNrc3RyaWRlKGJ3ZGlmLCBid2RpZi0+bmV4dCwgYndkaWYtPnByZXYpKQorICAgICAgICBmaXhzdHJpZGUobGluaywgYndkaWYtPnByZXYpOworICAgIGlmIChjaGVja3N0cmlkZShid2RpZiwgYndkaWYtPm5leHQsIGJ3ZGlmLT5jdXIpIHx8IChid2RpZi0+cHJldiAmJiBjaGVja3N0cmlkZShid2RpZiwgYndkaWYtPm5leHQsIGJ3ZGlmLT5wcmV2KSkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlYWxsb2NhdGUgZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKCFid2RpZi0+cHJldikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoKGJ3ZGlmLT5kZWludCAmJiAhYndkaWYtPmN1ci0+aW50ZXJsYWNlZF9mcmFtZSkgfHwKKyAgICAgICAgY3R4LT5pc19kaXNhYmxlZCB8fAorICAgICAgICAoYndkaWYtPmRlaW50ICYmICFid2RpZi0+cHJldi0+aW50ZXJsYWNlZF9mcmFtZSAmJiBid2RpZi0+cHJldi0+cmVwZWF0X3BpY3QpIHx8CisgICAgICAgIChid2RpZi0+ZGVpbnQgJiYgIWJ3ZGlmLT5uZXh0LT5pbnRlcmxhY2VkX2ZyYW1lICYmIGJ3ZGlmLT5uZXh0LT5yZXBlYXRfcGljdCkKKyAgICApIHsKKyAgICAgICAgYndkaWYtPm91dCAgPSBhdl9mcmFtZV9jbG9uZShid2RpZi0+Y3VyKTsKKyAgICAgICAgaWYgKCFid2RpZi0+b3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZid2RpZi0+cHJldik7CisgICAgICAgIGlmIChid2RpZi0+b3V0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBid2RpZi0+b3V0LT5wdHMgKj0gMjsKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIGJ3ZGlmLT5vdXQpOworICAgIH0KKworICAgIGJ3ZGlmLT5vdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGN0eC0+b3V0cHV0c1swXSwgbGluay0+dywgbGluay0+aCk7CisgICAgaWYgKCFid2RpZi0+b3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhid2RpZi0+b3V0LCBid2RpZi0+Y3VyKTsKKyAgICBid2RpZi0+b3V0LT5pbnRlcmxhY2VkX2ZyYW1lID0gMDsKKworICAgIGlmIChid2RpZi0+b3V0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIGJ3ZGlmLT5vdXQtPnB0cyAqPSAyOworCisgICAgcmV0dXJuIHJldHVybl9mcmFtZShjdHgsIDApOworfQorCitzdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+c3JjOworICAgIEJXRElGQ29udGV4dCAqYndkaWYgPSBjdHgtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGlmIChid2RpZi0+ZnJhbWVfcGVuZGluZykgeworICAgICAgICByZXR1cm5fZnJhbWUoY3R4LCAxKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGJ3ZGlmLT5lb2YpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHJldCAgPSBmZl9yZXF1ZXN0X2ZyYW1lKGxpbmstPnNyYy0+aW5wdXRzWzBdKTsKKworICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgYndkaWYtPmN1cikgeworICAgICAgICBBVkZyYW1lICpuZXh0ID0gYXZfZnJhbWVfY2xvbmUoYndkaWYtPm5leHQpOworCisgICAgICAgIGlmICghbmV4dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgYndkaWYtPmludGVyX2ZpZWxkID0gLTE7CisgICAgICAgIG5leHQtPnB0cyA9IGJ3ZGlmLT5uZXh0LT5wdHMgKiAyIC0gYndkaWYtPmN1ci0+cHRzOworCisgICAgICAgIGZpbHRlcl9mcmFtZShsaW5rLT5zcmMtPmlucHV0c1swXSwgbmV4dCk7CisgICAgICAgIGJ3ZGlmLT5lb2YgPSAxOworICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBCV0RJRkNvbnRleHQgKmJ3ZGlmID0gY3R4LT5wcml2OworCisgICAgYXZfZnJhbWVfZnJlZSgmYndkaWYtPnByZXYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmJ3ZGlmLT5jdXIgKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZid2RpZi0+bmV4dCk7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLCBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDksIEFWX1BJWF9GTVRfWVVWNDIyUDksIEFWX1BJWF9GTVRfWVVWNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LCBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFA5LCBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUlAxNCwgQVZfUElYX0ZNVF9HQlJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRfR0JSQVAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZMTYsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHNfbGlzdCA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOworICAgIGlmICghZm10c19saXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZtdHNfbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqbGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPnNyYzsKKyAgICBCV0RJRkNvbnRleHQgKnMgPSBsaW5rLT5zcmMtPnByaXY7CisKKyAgICBsaW5rLT50aW1lX2Jhc2UubnVtID0gbGluay0+c3JjLT5pbnB1dHNbMF0tPnRpbWVfYmFzZS5udW07CisgICAgbGluay0+dGltZV9iYXNlLmRlbiA9IGxpbmstPnNyYy0+aW5wdXRzWzBdLT50aW1lX2Jhc2UuZGVuICogMjsKKyAgICBsaW5rLT53ICAgICAgICAgICAgID0gbGluay0+c3JjLT5pbnB1dHNbMF0tPnc7CisgICAgbGluay0+aCAgICAgICAgICAgICA9IGxpbmstPnNyYy0+aW5wdXRzWzBdLT5oOworCisgICAgaWYocy0+bW9kZSYxKQorICAgICAgICBsaW5rLT5mcmFtZV9yYXRlID0gYXZfbXVsX3EobGluay0+c3JjLT5pbnB1dHNbMF0tPmZyYW1lX3JhdGUsIChBVlJhdGlvbmFsKXsyLDF9KTsKKworICAgIGlmIChsaW5rLT53IDwgMyB8fCBsaW5rLT5oIDwgMykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJWaWRlbyBvZiBsZXNzIHRoYW4gMyBjb2x1bW5zIG9yIGxpbmVzIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmNzcCA9IGF2X3BpeF9mbXRfZGVzY19nZXQobGluay0+Zm9ybWF0KTsKKyAgICBpZiAocy0+Y3NwLT5jb21wWzBdLmRlcHRoID4gOCkgeworICAgICAgICBzLT5maWx0ZXJfaW50cmEgPSBmaWx0ZXJfaW50cmFfMTZiaXQ7CisgICAgICAgIHMtPmZpbHRlcl9saW5lICA9IGZpbHRlcl9saW5lX2NfMTZiaXQ7CisgICAgICAgIHMtPmZpbHRlcl9lZGdlICA9IGZpbHRlcl9lZGdlXzE2Yml0OworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmZpbHRlcl9pbnRyYSA9IGZpbHRlcl9pbnRyYTsKKyAgICAgICAgcy0+ZmlsdGVyX2xpbmUgID0gZmlsdGVyX2xpbmVfYzsKKyAgICAgICAgcy0+ZmlsdGVyX2VkZ2UgID0gZmlsdGVyX2VkZ2U7CisgICAgfQorCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9id2RpZl9pbml0X3g4NihzKTsKKworICAgIHJldHVybiAwOworfQorCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEJXRElGQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKKyNkZWZpbmUgQ09OU1QobmFtZSwgaGVscCwgdmFsLCB1bml0KSB7IG5hbWUsIGhlbHAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND12YWx9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgdW5pdCB9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBid2RpZl9vcHRpb25zW10gPSB7CisgICAgeyAibW9kZSIsICAgInNwZWNpZnkgdGhlIGludGVybGFjaW5nIG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9QldESUZfTU9ERV9TRU5EX0ZJRUxEfSwgMCwgMSwgRkxBR1MsICJtb2RlIn0sCisgICAgQ09OU1QoInNlbmRfZnJhbWUiLCAic2VuZCBvbmUgZnJhbWUgZm9yIGVhY2ggZnJhbWUiLCBCV0RJRl9NT0RFX1NFTkRfRlJBTUUsICJtb2RlIiksCisgICAgQ09OU1QoInNlbmRfZmllbGQiLCAic2VuZCBvbmUgZnJhbWUgZm9yIGVhY2ggZmllbGQiLCBCV0RJRl9NT0RFX1NFTkRfRklFTEQsICJtb2RlIiksCisKKyAgICB7ICJwYXJpdHkiLCAic3BlY2lmeSB0aGUgYXNzdW1lZCBwaWN0dXJlIGZpZWxkIHBhcml0eSIsIE9GRlNFVChwYXJpdHkpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUJXRElGX1BBUklUWV9BVVRPfSwgLTEsIDEsIEZMQUdTLCAicGFyaXR5IiB9LAorICAgIENPTlNUKCJ0ZmYiLCAgImFzc3VtZSB0b3AgZmllbGQgZmlyc3QiLCAgICBCV0RJRl9QQVJJVFlfVEZGLCAgInBhcml0eSIpLAorICAgIENPTlNUKCJiZmYiLCAgImFzc3VtZSBib3R0b20gZmllbGQgZmlyc3QiLCBCV0RJRl9QQVJJVFlfQkZGLCAgInBhcml0eSIpLAorICAgIENPTlNUKCJhdXRvIiwgImF1dG8gZGV0ZWN0IHBhcml0eSIsICAgICAgICBCV0RJRl9QQVJJVFlfQVVUTywgInBhcml0eSIpLAorCisgICAgeyAiZGVpbnQiLCAic3BlY2lmeSB3aGljaCBmcmFtZXMgdG8gZGVpbnRlcmxhY2UiLCBPRkZTRVQoZGVpbnQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PUJXRElGX0RFSU5UX0FMTH0sIDAsIDEsIEZMQUdTLCAiZGVpbnQiIH0sCisgICAgQ09OU1QoImFsbCIsICAgICAgICAiZGVpbnRlcmxhY2UgYWxsIGZyYW1lcyIsICAgICAgICAgICAgICAgICAgICAgICBCV0RJRl9ERUlOVF9BTEwsICAgICAgICAiZGVpbnQiKSwKKyAgICBDT05TVCgiaW50ZXJsYWNlZCIsICJvbmx5IGRlaW50ZXJsYWNlIGZyYW1lcyBtYXJrZWQgYXMgaW50ZXJsYWNlZCIsIEJXRElGX0RFSU5UX0lOVEVSTEFDRUQsICJkZWludCIpLAorCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhid2RpZik7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92Zl9id2RpZl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX2J3ZGlmX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9id2RpZiA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJid2RpZiIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRGVpbnRlcmxhY2UgdGhlIGlucHV0IGltYWdlLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEJXRElGQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmYndkaWZfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gYXZmaWx0ZXJfdmZfYndkaWZfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdmZfYndkaWZfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9JTlRFUk5BTCB8IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jaHJvbWFrZXkuYyBiL2xpYmF2ZmlsdGVyL3ZmX2Nocm9tYWtleS5jCmluZGV4IDMzMDk3NDguLjg4NDE0NzggMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2Nocm9tYWtleS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2Nocm9tYWtleS5jCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICBBVkZpbHRlckNvbnRleHQgKmF2Y3R4ID0gbGluay0+ZHN0OwogICAgIGludCByZXM7CiAKLSAgICBpZiAocmVzID0gYXZjdHgtPmludGVybmFsLT5leGVjdXRlKGF2Y3R4LCBkb19jaHJvbWFrZXlfc2xpY2UsIGZyYW1lLCBOVUxMLCBGRk1JTihmcmFtZS0+aGVpZ2h0LCBhdmN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKSkKKyAgICBpZiAocmVzID0gYXZjdHgtPmludGVybmFsLT5leGVjdXRlKGF2Y3R4LCBkb19jaHJvbWFrZXlfc2xpY2UsIGZyYW1lLCBOVUxMLCBGRk1JTihmcmFtZS0+aGVpZ2h0LCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoYXZjdHgpKSkpCiAgICAgICAgIHJldHVybiByZXM7CiAKICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGF2Y3R4LT5vdXRwdXRzWzBdLCBmcmFtZSk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jaWVzY29wZS5jIGIvbGliYXZmaWx0ZXIvdmZfY2llc2NvcGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBjZmVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfY2llc2NvcGUuYwpAQCAtMCwwICsxLDE1MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgSm9obiBXYWxrZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworZW51bSBDaWVTeXN0ZW0geworICAgIFhZWSwKKyAgICBVQ1MsCisgICAgTFVWLAorICAgIE5CX0NJRQorfTsKKworZW51bSBDb2xvcnNTeXN0ZW1zIHsKKyAgICBOVFNDc3lzdGVtLAorICAgIEVCVXN5c3RlbSwKKyAgICBTTVBURXN5c3RlbSwKKyAgICBTTVBURTI0ME1zeXN0ZW0sCisgICAgQVBQTEVzeXN0ZW0sCisgICAgd1JHQnN5c3RlbSwKKyAgICBDSUUxOTMxc3lzdGVtLAorICAgIFJlYzcwOXN5c3RlbSwKKyAgICBSZWMyMDIwc3lzdGVtLAorICAgIE5CX0NTCit9OworCit0eXBlZGVmIHN0cnVjdCBDaWVzY29wZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBjb2xvcl9zeXN0ZW07CisgICAgdW5zaWduZWQgZ2FtdXRzOworICAgIGludCBzaXplOworICAgIGludCBzaG93X3doaXRlOworICAgIGludCBjb3JyZWN0X2dhbW1hOworICAgIGludCBjaWU7CisgICAgZmxvYXQgaW50ZW5zaXR5OworICAgIGZsb2F0IGNvbnRyYXN0OworICAgIGludCBiYWNrZ3JvdW5kOworCisgICAgZG91YmxlIGxvZzJsaW5bNjU1MzZdOworICAgIGRvdWJsZSBpZ2FtbWE7CisgICAgZG91YmxlIGlbM11bM107CisgICAgZG91YmxlIG1bM11bM107CisgICAgQVZGcmFtZSAqZjsKKyAgICB2b2lkICgqZmlsdGVyKShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqaW4sIGRvdWJsZSAqY3gsIGRvdWJsZSAqY3ksIGludCB4LCBpbnQgeSk7Cit9IENpZXNjb3BlQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ2llc2NvcGVDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNpZXNjb3BlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzeXN0ZW0iLCAgICAgInNldCBjb2xvciBzeXN0ZW0iLCBPRkZTRVQoY29sb3Jfc3lzdGVtKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1SZWM3MDlzeXN0ZW19LCAwLCBOQl9DUy0xLCBGTEFHUywgInN5c3RlbSIgfSwKKyAgICB7ICAgIm50c2MiLCAgICAgICAiTlRTQyAxOTUzIFknSSdPJyAoSVRVLVIgQlQuNDcwIFN5c3RlbSBNKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1OVFNDc3lzdGVtfSwgICAgIDAsIDAsIEZMQUdTLCAic3lzdGVtIiB9LAorICAgIHsgICAiNDcwbSIsICAgICAgICJOVFNDIDE5NTMgWSdJJ08nIChJVFUtUiBCVC40NzAgU3lzdGVtIE0pIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU5UU0NzeXN0ZW19LCAgICAgMCwgMCwgRkxBR1MsICJzeXN0ZW0iIH0sCisgICAgeyAgICJlYnUiLCAgICAgICAgIkVCVSBZJ1UnVicgKFBBTC9TRUNBTSkgKElUVS1SIEJULjQ3MCBTeXN0ZW0gQiwgRykiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RUJVc3lzdGVtfSwgICAgICAwLCAwLCBGTEFHUywgInN5c3RlbSIgfSwKKyAgICB7ICAgIjQ3MGJnIiwgICAgICAiRUJVIFknVSdWJyAoUEFML1NFQ0FNKSAoSVRVLVIgQlQuNDcwIFN5c3RlbSBCLCBHKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1FQlVzeXN0ZW19LCAgICAgIDAsIDAsIEZMQUdTLCAic3lzdGVtIiB9LAorICAgIHsgICAic21wdGUiLCAgICAgICJTTVBURS1DIFJHQiIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNNUFRFc3lzdGVtfSwgICAgMCwgMCwgRkxBR1MsICJzeXN0ZW0iIH0sCisgICAgeyAgICIyNDBtIiwgICAgICAgIlNNUFRFLTI0ME0gWSdQYlByIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U01QVEUyNDBNc3lzdGVtfSwwLCAwLCBGTEFHUywgInN5c3RlbSIgfSwKKyAgICB7ICAgImFwcGxlIiwgICAgICAiQXBwbGUgUkdCIiwgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BUFBMRXN5c3RlbX0sICAgIDAsIDAsIEZMQUdTLCAic3lzdGVtIiB9LAorICAgIHsgICAid2lkZXJnYiIsICAgICJBZG9iZSBXaWRlIEdhbXV0IFJHQiIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PXdSR0JzeXN0ZW19LCAgICAgMCwgMCwgRkxBR1MsICJzeXN0ZW0iIH0sCisgICAgeyAgICJjaWUxOTMxIiwgICAgIkNJRSAxOTMxIFJHQiIsICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q0lFMTkzMXN5c3RlbX0sICAwLCAwLCBGTEFHUywgInN5c3RlbSIgfSwKKyAgICB7ICAgImhkdHYiLCAgICAgICAiSVRVLkJULTcwOSBZJ0NiQ3IiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1SZWM3MDlzeXN0ZW19LCAgIDAsIDAsIEZMQUdTLCAic3lzdGVtIiB9LAorICAgIHsgICAicmVjNzA5IiwgICAgICJJVFUuQlQtNzA5IFknQ2JDciIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVJlYzcwOXN5c3RlbX0sICAgMCwgMCwgRkxBR1MsICJzeXN0ZW0iIH0sCisgICAgeyAgICJ1aGR0diIsICAgICAgIklUVS1SLkJULTIwMjAiLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UmVjMjAyMHN5c3RlbX0sICAwLCAwLCBGTEFHUywgInN5c3RlbSIgfSwKKyAgICB7ICAgInJlYzIwMjAiLCAgICAiSVRVLVIuQlQtMjAyMCIsICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1SZWMyMDIwc3lzdGVtfSwgIDAsIDAsIEZMQUdTLCAic3lzdGVtIiB9LAorICAgIHsgImNpZSIsICAgICAgICAic2V0IGNpZSBzeXN0ZW0iLCBPRkZTRVQoY2llKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PVhZWX0sIDAsIE5CX0NJRS0xLCBGTEFHUywgImNpZSIgfSwKKyAgICB7ICAgInh5eSIsICAgICAgIkNJRSAxOTMxIHh5WSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1YWVl9LCAwLCAwLCBGTEFHUywgImNpZSIgfSwKKyAgICB7ICAgInVjcyIsICAgICAgIkNJRSAxOTYwIFVDUyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1VQ1N9LCAwLCAwLCBGTEFHUywgImNpZSIgfSwKKyAgICB7ICAgImx1diIsICAgICAgIkNJRSAxOTc2IEx1diIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1MVVZ9LCAwLCAwLCBGTEFHUywgImNpZSIgfSwKKyAgICB7ICJnYW11dHMiLCAgICAgInNldCB3aGF0IGdhbXV0cyB0byBkcmF3IiwgT0ZGU0VUKGdhbXV0cyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2ND0wfSwgMCwgMHhGRkYsIEZMQUdTLCAiZ2FtdXRzIiB9LAorICAgIHsgICAibnRzYyIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTw8TlRTQ3N5c3RlbX0sICAgICAgMCwgMCwgRkxBR1MsICJnYW11dHMiIH0sCisgICAgeyAgICI0NzBtIiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xPDxOVFNDc3lzdGVtfSwgICAgICAwLCAwLCBGTEFHUywgImdhbXV0cyIgfSwKKyAgICB7ICAgImVidSIsICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTE8PEVCVXN5c3RlbX0sICAgICAgIDAsIDAsIEZMQUdTLCAiZ2FtdXRzIiB9LAorICAgIHsgICAiNDcwYmciLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTw8RUJVc3lzdGVtfSwgICAgICAgMCwgMCwgRkxBR1MsICJnYW11dHMiIH0sCisgICAgeyAgICJzbXB0ZSIsICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xPDxTTVBURXN5c3RlbX0sICAgICAwLCAwLCBGTEFHUywgImdhbXV0cyIgfSwKKyAgICB7ICAgIjI0MG0iLCAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTE8PFNNUFRFMjQwTXN5c3RlbX0sIDAsIDAsIEZMQUdTLCAiZ2FtdXRzIiB9LAorICAgIHsgICAiYXBwbGUiLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTw8QVBQTEVzeXN0ZW19LCAgICAgMCwgMCwgRkxBR1MsICJnYW11dHMiIH0sCisgICAgeyAgICJ3aWRlcmdiIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xPDx3UkdCc3lzdGVtfSwgICAgICAwLCAwLCBGTEFHUywgImdhbXV0cyIgfSwKKyAgICB7ICAgImNpZTE5MzEiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTE8PENJRTE5MzFzeXN0ZW19LCAgIDAsIDAsIEZMQUdTLCAiZ2FtdXRzIiB9LAorICAgIHsgICAiaGR0diIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTw8UmVjNzA5c3lzdGVtfSwgICAgMCwgMCwgRkxBR1MsICJnYW11dHMiIH0sCisgICAgeyAgICJyZWM3MDkiLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xPDxSZWM3MDlzeXN0ZW19LCAgICAwLCAwLCBGTEFHUywgImdhbXV0cyIgfSwKKyAgICB7ICAgInVoZHR2IiwgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTE8PFJlYzIwMjBzeXN0ZW19LCAgIDAsIDAsIEZMQUdTLCAiZ2FtdXRzIiB9LAorICAgIHsgICAicmVjMjAyMCIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MTw8UmVjMjAyMHN5c3RlbX0sICAgMCwgMCwgRkxBR1MsICJnYW11dHMiIH0sCisgICAgeyAic2l6ZSIsICAgICAgICJzZXQgY2llc2NvcGUgc2l6ZSIsIE9GRlNFVChzaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND01MTJ9LCAyNTYsIDgxOTIsIEZMQUdTIH0sCisgICAgeyAicyIsICAgICAgICAgICJzZXQgY2llc2NvcGUgc2l6ZSIsIE9GRlNFVChzaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND01MTJ9LCAyNTYsIDgxOTIsIEZMQUdTIH0sCisgICAgeyAiaW50ZW5zaXR5IiwgICJzZXQgY2llc2NvcGUgaW50ZW5zaXR5IiwgT0ZGU0VUKGludGVuc2l0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjAwMX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiaSIsICAgICAgICAgICJzZXQgY2llc2NvcGUgaW50ZW5zaXR5IiwgT0ZGU0VUKGludGVuc2l0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjAwMX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiY29udHJhc3QiLCAgIE5VTEwsIE9GRlNFVChjb250cmFzdCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjc1fSwgIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiY29ycmdhbW1hIiwgIE5VTEwsIE9GRlNFVChjb3JyZWN0X2dhbW1hKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAic2hvd3doaXRlIiwgIE5VTEwsIE9GRlNFVChzaG93X3doaXRlKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiZ2FtbWEiLCAgICAgIE5VTEwsIE9GRlNFVChpZ2FtbWEpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTIuNn0sIDAuMSwgNiwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNpZXNjb3BlKTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBpbl9waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfUkdCMjQsCisgICAgQVZfUElYX0ZNVF9SR0JBLAorICAgIEFWX1BJWF9GTVRfUkdCNDgsCisgICAgQVZfUElYX0ZNVF9SR0JBNjQsCisgICAgQVZfUElYX0ZNVF9YWVoxMiwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0X3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9SR0JBNjQsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChpbl9waXhfZm10cyksICZjdHgtPmlucHV0c1swXS0+b3V0X2Zvcm1hdHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2Zvcm1hdHNfcmVmKGZmX21ha2VfZm9ybWF0X2xpc3Qob3V0X3BpeF9mbXRzKSwgJmN0eC0+b3V0cHV0c1swXS0+aW5fZm9ybWF0cykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIENpZXNjb3BlQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKworICAgIG91dGxpbmstPmggPSBvdXRsaW5rLT53ID0gcy0+c2l6ZTsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CisKKyAgICByZXR1cm4gMDsKK30KKworLyogQSAgY29sb3IgIHN5c3RlbSBpcyBkZWZpbmVkIGJ5IHRoZSBDSUUgeCBhbmQgeSAgY29vcmRpbmF0ZXMgb2YgaXRzCisgICB0aHJlZSBwcmltYXJ5IGlsbHVtaW5hbnRzIGFuZCB0aGUgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgIHdoaXRlCisgICBwb2ludC4gKi8KKworc3RydWN0IENvbG9yU3lzdGVtIHsKKyAgICBkb3VibGUgeFJlZCwgeVJlZCwgICAgICAgICAgICAgICAgLyogUmVkIHByaW1hcnkgaWxsdW1pbmFudCAqLworICAgICAgICAgICB4R3JlZW4sIHlHcmVlbiwgICAgICAgICAgICAvKiBHcmVlbiBwcmltYXJ5IGlsbHVtaW5hbnQgKi8KKyAgICAgICAgICAgeEJsdWUsIHlCbHVlLCAgICAgICAgICAgICAgLyogQmx1ZSBwcmltYXJ5IGlsbHVtaW5hbnQgKi8KKyAgICAgICAgICAgeFdoaXRlLCB5V2hpdGUsICAgICAgICAgICAgLyogV2hpdGUgcG9pbnQgKi8KKyAgICAgICAgICAgZ2FtbWE7ICAgICAgICAgICAgIC8qIGdhbW1hIG9mIG5vbmxpbmVhciBjb3JyZWN0aW9uICovCit9OworCitzdGF0aWMgZmxvYXQgY29uc3Qgc3BlY3RyYWxfY2hyb21hdGljaXR5W11bM10gPSB7CisgICAgeyAwLjE3NTU2MCwgMC4wMDUyOTQsIDAuODE5MTQ2IH0sCisgICAgeyAwLjE3NTQ4MywgMC4wMDUyODYsIDAuODE5MjMxIH0sCisgICAgeyAwLjE3NTQwMCwgMC4wMDUyNzksIDAuODE5MzIxIH0sCisgICAgeyAwLjE3NTMxNywgMC4wMDUyNzEsIDAuODE5NDEyIH0sCisgICAgeyAwLjE3NTIzNywgMC4wMDUyNjMsIDAuODE5NTAwIH0sCisgICAgeyAwLjE3NTE2MSwgMC4wMDUyNTYsIDAuODE5NTgyIH0sCisgICAgeyAwLjE3NTA4OCwgMC4wMDUyNDcsIDAuODE5NjY1IH0sCisgICAgeyAwLjE3NTAxNSwgMC4wMDUyMzYsIDAuODE5NzQ5IH0sCisgICAgeyAwLjE3NDk0NSwgMC4wMDUyMjYsIDAuODE5ODI5IH0sCisgICAgeyAwLjE3NDg4MCwgMC4wMDUyMjEsIDAuODE5ODk5IH0sCisgICAgeyAwLjE3NDgyMSwgMC4wMDUyMjEsIDAuODE5OTU5IH0sCisgICAgeyAwLjE3NDc3MCwgMC4wMDUyMjksIDAuODIwMDAxIH0sCisgICAgeyAwLjE3NDcyMiwgMC4wMDUyMzgsIDAuODIwMDQwIH0sCisgICAgeyAwLjE3NDY2NSwgMC4wMDUyMzYsIDAuODIwMDk4IH0sCisgICAgeyAwLjE3NDU5NSwgMC4wMDUyMTgsIDAuODIwMTg3IH0sCisgICAgeyAwLjE3NDUxMCwgMC4wMDUxODIsIDAuODIwMzA5IH0sCisgICAgeyAwLjE3NDQwOSwgMC4wMDUxMjcsIDAuODIwNDY0IH0sCisgICAgeyAwLjE3NDMwOCwgMC4wMDUwNjgsIDAuODIwNjI0IH0sCisgICAgeyAwLjE3NDIyMiwgMC4wMDUwMTcsIDAuODIwNzYxIH0sCisgICAgeyAwLjE3NDE1NiwgMC4wMDQ5ODEsIDAuODIwODYzIH0sCisgICAgeyAwLjE3NDExMiwgMC4wMDQ5NjQsIDAuODIwOTI0IH0sCisgICAgeyAwLjE3NDA4OCwgMC4wMDQ5NjQsIDAuODIwOTQ4IH0sCisgICAgeyAwLjE3NDA3MywgMC4wMDQ5NzMsIDAuODIwOTU1IH0sCisgICAgeyAwLjE3NDA1NywgMC4wMDQ5ODIsIDAuODIwOTYxIH0sCisgICAgeyAwLjE3NDAzNiwgMC4wMDQ5ODYsIDAuODIwOTc4IH0sCisgICAgeyAwLjE3NDAwOCwgMC4wMDQ5ODEsIDAuODIxMDEyIH0sCisgICAgeyAwLjE3Mzk3MiwgMC4wMDQ5NjQsIDAuODIxMDY0IH0sCisgICAgeyAwLjE3MzkzMiwgMC4wMDQ5NDMsIDAuODIxMTI1IH0sCisgICAgeyAwLjE3Mzg4OSwgMC4wMDQ5MjYsIDAuODIxMTg1IH0sCisgICAgeyAwLjE3Mzg0NSwgMC4wMDQ5MTYsIDAuODIxMjM5IH0sCisgICAgeyAwLjE3MzgwMSwgMC4wMDQ5MTUsIDAuODIxMjg0IH0sCisgICAgeyAwLjE3Mzc1NCwgMC4wMDQ5MjUsIDAuODIxMzIxIH0sCisgICAgeyAwLjE3MzcwNSwgMC4wMDQ5MzcsIDAuODIxMzU4IH0sCisgICAgeyAwLjE3MzY1NSwgMC4wMDQ5NDQsIDAuODIxNDAxIH0sCisgICAgeyAwLjE3MzYwNiwgMC4wMDQ5NDAsIDAuODIxNDU0IH0sCisgICAgeyAwLjE3MzU2MCwgMC4wMDQ5MjMsIDAuODIxNTE3IH0sCisgICAgeyAwLjE3MzUxNCwgMC4wMDQ4OTUsIDAuODIxNTkwIH0sCisgICAgeyAwLjE3MzQ2OCwgMC4wMDQ4NjUsIDAuODIxNjY3IH0sCisgICAgeyAwLjE3MzQyNCwgMC4wMDQ4MzYsIDAuODIxNzQwIH0sCisgICAgeyAwLjE3MzM4MCwgMC4wMDQ4MTMsIDAuODIxODA3IH0sCisgICAgeyAwLjE3MzMzNywgMC4wMDQ3OTcsIDAuODIxODY2IH0sCisgICAgeyAwLjE3MzI5MSwgMC4wMDQ3ODYsIDAuODIxOTIzIH0sCisgICAgeyAwLjE3MzIzOCwgMC4wMDQ3NzksIDAuODIxOTgzIH0sCisgICAgeyAwLjE3MzE3NCwgMC4wMDQ3NzUsIDAuODIyMDUxIH0sCisgICAgeyAwLjE3MzEwMSwgMC4wMDQ3NzQsIDAuODIyMTI1IH0sCisgICAgeyAwLjE3MzAyMSwgMC4wMDQ3NzUsIDAuODIyMjA0IH0sCisgICAgeyAwLjE3MjkzNCwgMC4wMDQ3ODEsIDAuODIyMjg1IH0sCisgICAgeyAwLjE3Mjg0MywgMC4wMDQ3OTEsIDAuODIyMzY2IH0sCisgICAgeyAwLjE3Mjc1MSwgMC4wMDQ3OTksIDAuODIyNDUwIH0sCisgICAgeyAwLjE3MjY2MiwgMC4wMDQ4MDIsIDAuODIyNTM2IH0sCisgICAgeyAwLjE3MjU3NywgMC4wMDQ3OTksIDAuODIyNjI0IH0sCisgICAgeyAwLjE3MjQ4OSwgMC4wMDQ3OTUsIDAuODIyNzE1IH0sCisgICAgeyAwLjE3MjM5NiwgMC4wMDQ3OTYsIDAuODIyODA4IH0sCisgICAgeyAwLjE3MjI5NiwgMC4wMDQ4MDMsIDAuODIyOTAxIH0sCisgICAgeyAwLjE3MjE5MiwgMC4wMDQ4MTUsIDAuODIyOTkzIH0sCisgICAgeyAwLjE3MjA4NywgMC4wMDQ4MzMsIDAuODIzMDgxIH0sCisgICAgeyAwLjE3MTk4MiwgMC4wMDQ4NTUsIDAuODIzMTYzIH0sCisgICAgeyAwLjE3MTg3MSwgMC4wMDQ4ODksIDAuODIzMjQwIH0sCisgICAgeyAwLjE3MTc0MSwgMC4wMDQ5MzksIDAuODIzMzE5IH0sCisgICAgeyAwLjE3MTU4NywgMC4wMDUwMTAsIDAuODIzNDAyIH0sCisgICAgeyAwLjE3MTQwNywgMC4wMDUxMDIsIDAuODIzNDkwIH0sCisgICAgeyAwLjE3MTIwNiwgMC4wMDUyMTEsIDAuODIzNTgzIH0sCisgICAgeyAwLjE3MDk5MywgMC4wMDUzMzQsIDAuODIzNjc0IH0sCisgICAgeyAwLjE3MDc3MSwgMC4wMDU0NzAsIDAuODIzNzU5IH0sCisgICAgeyAwLjE3MDU0MSwgMC4wMDU2MjEsIDAuODIzODM4IH0sCisgICAgeyAwLjE3MDMwMSwgMC4wMDU3ODksIDAuODIzOTExIH0sCisgICAgeyAwLjE3MDA1MCwgMC4wMDU5NzQsIDAuODIzOTc2IH0sCisgICAgeyAwLjE2OTc4NiwgMC4wMDYxNzcsIDAuODI0MDM3IH0sCisgICAgeyAwLjE2OTUwNSwgMC4wMDYzOTgsIDAuODI0MDk3IH0sCisgICAgeyAwLjE2OTIwMywgMC4wMDY2MzksIDAuODI0MTU4IH0sCisgICAgeyAwLjE2ODg3OCwgMC4wMDY5MDAsIDAuODI0MjIyIH0sCisgICAgeyAwLjE2ODUyNSwgMC4wMDcxODQsIDAuODI0MjkxIH0sCisgICAgeyAwLjE2ODE0NiwgMC4wMDc0OTEsIDAuODI0MzYzIH0sCisgICAgeyAwLjE2Nzc0NiwgMC4wMDc4MjEsIDAuODI0NDMzIH0sCisgICAgeyAwLjE2NzMyOCwgMC4wMDgxNzUsIDAuODI0NDk2IH0sCisgICAgeyAwLjE2Njg5NSwgMC4wMDg1NTYsIDAuODI0NTQ5IH0sCisgICAgeyAwLjE2NjQ0NiwgMC4wMDg5NjQsIDAuODI0NTg5IH0sCisgICAgeyAwLjE2NTk3NywgMC4wMDk0MDIsIDAuODI0NjIyIH0sCisgICAgeyAwLjE2NTQ4MywgMC4wMDk4NjUsIDAuODI0NjUyIH0sCisgICAgeyAwLjE2NDk2MywgMC4wMTAzNTEsIDAuODI0Njg3IH0sCisgICAgeyAwLjE2NDQxMiwgMC4wMTA4NTgsIDAuODI0NzMxIH0sCisgICAgeyAwLjE2MzgyOCwgMC4wMTEzODUsIDAuODI0Nzg3IH0sCisgICAgeyAwLjE2MzIxMCwgMC4wMTE5MzcsIDAuODI0ODUzIH0sCisgICAgeyAwLjE2MjU1MiwgMC4wMTI1MjAsIDAuODI0OTI4IH0sCisgICAgeyAwLjE2MTg1MSwgMC4wMTMxMzcsIDAuODI1MDExIH0sCisgICAgeyAwLjE2MTEwNSwgMC4wMTM3OTMsIDAuODI1MTAyIH0sCisgICAgeyAwLjE2MDMxMCwgMC4wMTQ0OTEsIDAuODI1MTk5IH0sCisgICAgeyAwLjE1OTQ2NiwgMC4wMTUyMzIsIDAuODI1MzAyIH0sCisgICAgeyAwLjE1ODU3MywgMC4wMTYwMTUsIDAuODI1NDEyIH0sCisgICAgeyAwLjE1NzYzMSwgMC4wMTY4NDAsIDAuODI1NTI5IH0sCisgICAgeyAwLjE1NjY0MSwgMC4wMTc3MDUsIDAuODI1NjU0IH0sCisgICAgeyAwLjE1NTYwNSwgMC4wMTg2MDksIDAuODI1Nzg2IH0sCisgICAgeyAwLjE1NDUyNSwgMC4wMTk1NTYsIDAuODI1OTIwIH0sCisgICAgeyAwLjE1MzM5NywgMC4wMjA1NTQsIDAuODI2MDQ5IH0sCisgICAgeyAwLjE1MjIxOSwgMC4wMjE2MTIsIDAuODI2MTY5IH0sCisgICAgeyAwLjE1MDk4NSwgMC4wMjI3NDAsIDAuODI2Mjc0IH0sCisgICAgeyAwLjE0OTY5MSwgMC4wMjM5NTAsIDAuODI2MzU5IH0sCisgICAgeyAwLjE0ODMzNywgMC4wMjUyNDcsIDAuODI2NDE2IH0sCisgICAgeyAwLjE0NjkyOCwgMC4wMjY2MzUsIDAuODI2NDM3IH0sCisgICAgeyAwLjE0NTQ2OCwgMC4wMjgxMTgsIDAuODI2NDEzIH0sCisgICAgeyAwLjE0Mzk2MCwgMC4wMjk3MDMsIDAuODI2MzM3IH0sCisgICAgeyAwLjE0MjQwNSwgMC4wMzEzOTQsIDAuODI2MjAxIH0sCisgICAgeyAwLjE0MDc5NiwgMC4wMzMyMTMsIDAuODI1OTkxIH0sCisgICAgeyAwLjEzOTEyMSwgMC4wMzUyMDEsIDAuODI1Njc5IH0sCisgICAgeyAwLjEzNzM2NCwgMC4wMzc0MDMsIDAuODI1MjMzIH0sCisgICAgeyAwLjEzNTUwMywgMC4wMzk4NzksIDAuODI0NjE4IH0sCisgICAgeyAwLjEzMzUwOSwgMC4wNDI2OTIsIDAuODIzNzk4IH0sCisgICAgeyAwLjEzMTM3MSwgMC4wNDU4NzYsIDAuODIyNzUzIH0sCisgICAgeyAwLjEyOTA4NiwgMC4wNDk0NTAsIDAuODIxNDY0IH0sCisgICAgeyAwLjEyNjY2MiwgMC4wNTM0MjYsIDAuODE5OTEyIH0sCisgICAgeyAwLjEyNDExOCwgMC4wNTc4MDMsIDAuODE4MDc5IH0sCisgICAgeyAwLjEyMTQ2OSwgMC4wNjI1ODgsIDAuODE1OTQ0IH0sCisgICAgeyAwLjExODcwMSwgMC4wNjc4MzAsIDAuODEzNDY4IH0sCisgICAgeyAwLjExNTgwNywgMC4wNzM1ODEsIDAuODEwNjEyIH0sCisgICAgeyAwLjExMjc3NiwgMC4wNzk4OTYsIDAuODA3MzI4IH0sCisgICAgeyAwLjEwOTU5NCwgMC4wODY4NDMsIDAuODAzNTYzIH0sCisgICAgeyAwLjEwNjI2MSwgMC4wOTQ0ODYsIDAuNzk5MjUzIH0sCisgICAgeyAwLjEwMjc3NiwgMC4xMDI4NjQsIDAuNzk0MzYwIH0sCisgICAgeyAwLjA5OTEyOCwgMC4xMTIwMDcsIDAuNzg4ODY1IH0sCisgICAgeyAwLjA5NTMwNCwgMC4xMjE5NDUsIDAuNzgyNzUxIH0sCisgICAgeyAwLjA5MTI5NCwgMC4xMzI3MDIsIDAuNzc2MDA0IH0sCisgICAgeyAwLjA4NzA4MiwgMC4xNDQzMTcsIDAuNzY4NjAxIH0sCisgICAgeyAwLjA4MjY4MCwgMC4xNTY4NjYsIDAuNzYwNDU1IH0sCisgICAgeyAwLjA3ODExNiwgMC4xNzA0MjAsIDAuNzUxNDY0IH0sCisgICAgeyAwLjA3MzQzNywgMC4xODUwMzIsIDAuNzQxNTMxIH0sCisgICAgeyAwLjA2ODcwNiwgMC4yMDA3MjMsIDAuNzMwNTcxIH0sCisgICAgeyAwLjA2Mzk5MywgMC4yMTc0NjgsIDAuNzE4NTM5IH0sCisgICAgeyAwLjA1OTMxNiwgMC4yMzUyNTQsIDAuNzA1NDMwIH0sCisgICAgeyAwLjA1NDY2NywgMC4yNTQwOTYsIDAuNjkxMjM4IH0sCisgICAgeyAwLjA1MDAzMSwgMC4yNzQwMDIsIDAuNjc1OTY3IH0sCisgICAgeyAwLjA0NTM5MSwgMC4yOTQ5NzYsIDAuNjU5NjMzIH0sCisgICAgeyAwLjA0MDc1NywgMC4zMTY5ODEsIDAuNjQyMjYyIH0sCisgICAgeyAwLjAzNjE5NSwgMC4zMzk5MDAsIDAuNjIzOTA1IH0sCisgICAgeyAwLjAzMTc1NiwgMC4zNjM1OTgsIDAuNjA0NjQ2IH0sCisgICAgeyAwLjAyNzQ5NCwgMC4zODc5MjEsIDAuNTg0NTg0IH0sCisgICAgeyAwLjAyMzQ2MCwgMC40MTI3MDMsIDAuNTYzODM3IH0sCisgICAgeyAwLjAxOTcwNSwgMC40Mzc3NTYsIDAuNTQyNTM5IH0sCisgICAgeyAwLjAxNjI2OCwgMC40NjI5NTUsIDAuNTIwNzc3IH0sCisgICAgeyAwLjAxMzE4MywgMC40ODgyMDcsIDAuNDk4NjEwIH0sCisgICAgeyAwLjAxMDQ3NiwgMC41MTM0MDQsIDAuNDc2MTIwIH0sCisgICAgeyAwLjAwODE2OCwgMC41Mzg0MjMsIDAuNDUzNDA5IH0sCisgICAgeyAwLjAwNjI4NSwgMC41NjMwNjgsIDAuNDMwNjQ3IH0sCisgICAgeyAwLjAwNDg3NSwgMC41ODcxMTYsIDAuNDA4MDA4IH0sCisgICAgeyAwLjAwMzk4MiwgMC42MTA0NDcsIDAuMzg1NTcwIH0sCisgICAgeyAwLjAwMzYzNiwgMC42MzMwMTEsIDAuMzYzMzUyIH0sCisgICAgeyAwLjAwMzg1OSwgMC42NTQ4MjMsIDAuMzQxMzE4IH0sCisgICAgeyAwLjAwNDY0NiwgMC42NzU4OTgsIDAuMzE5NDU2IH0sCisgICAgeyAwLjAwNjAxMSwgMC42OTYxMjAsIDAuMjk3ODY5IH0sCisgICAgeyAwLjAwNzk4OCwgMC43MTUzNDIsIDAuMjc2NjcwIH0sCisgICAgeyAwLjAxMDYwMywgMC43MzM0MTMsIDAuMjU1OTg0IH0sCisgICAgeyAwLjAxMzg3MCwgMC43NTAxODYsIDAuMjM1OTQzIH0sCisgICAgeyAwLjAxNzc2NiwgMC43NjU2MTIsIDAuMjE2NjIyIH0sCisgICAgeyAwLjAyMjI0NCwgMC43Nzk2MzAsIDAuMTk4MTI2IH0sCisgICAgeyAwLjAyNzI3MywgMC43OTIxMDQsIDAuMTgwNjIzIH0sCisgICAgeyAwLjAzMjgyMCwgMC44MDI5MjYsIDAuMTY0MjU0IH0sCisgICAgeyAwLjAzODg1MiwgMC44MTIwMTYsIDAuMTQ5MTMyIH0sCisgICAgeyAwLjA0NTMyOCwgMC44MTkzOTEsIDAuMTM1MjgxIH0sCisgICAgeyAwLjA1MjE3NywgMC44MjUxNjQsIDAuMTIyNjYwIH0sCisgICAgeyAwLjA1OTMyNiwgMC44Mjk0MjYsIDAuMTExMjQ5IH0sCisgICAgeyAwLjA2NjcxNiwgMC44MzIyNzQsIDAuMTAxMDEwIH0sCisgICAgeyAwLjA3NDMwMiwgMC44MzM4MDMsIDAuMDkxODk0IH0sCisgICAgeyAwLjA4MjA1MywgMC44MzQwOTAsIDAuMDgzODU2IH0sCisgICAgeyAwLjA4OTk0MiwgMC44MzMyODksIDAuMDc2NzY5IH0sCisgICAgeyAwLjA5Nzk0MCwgMC44MzE1OTMsIDAuMDcwNDY4IH0sCisgICAgeyAwLjEwNjAyMSwgMC44MjkxNzgsIDAuMDY0ODAxIH0sCisgICAgeyAwLjExNDE2MSwgMC44MjYyMDcsIDAuMDU5NjMyIH0sCisgICAgeyAwLjEyMjM0NywgMC44MjI3NzAsIDAuMDU0ODgyIH0sCisgICAgeyAwLjEzMDU0NiwgMC44MTg5MjgsIDAuMDUwNTI2IH0sCisgICAgeyAwLjEzODcwMiwgMC44MTQ3NzQsIDAuMDQ2NTIzIH0sCisgICAgeyAwLjE0Njc3MywgMC44MTAzOTUsIDAuMDQyODMyIH0sCisgICAgeyAwLjE1NDcyMiwgMC44MDU4NjQsIDAuMDM5NDE0IH0sCisgICAgeyAwLjE2MjUzNSwgMC44MDEyMzgsIDAuMDM2MjI2IH0sCisgICAgeyAwLjE3MDIzNywgMC43OTY1MTksIDAuMDMzMjQ0IH0sCisgICAgeyAwLjE3Nzg1MCwgMC43OTE2ODcsIDAuMDMwNDY0IH0sCisgICAgeyAwLjE4NTM5MSwgMC43ODY3MjgsIDAuMDI3ODgxIH0sCisgICAgeyAwLjE5Mjg3NiwgMC43ODE2MjksIDAuMDI1NDk1IH0sCisgICAgeyAwLjIwMDMwOSwgMC43NzYzOTksIDAuMDIzMjkyIH0sCisgICAgeyAwLjIwNzY5MCwgMC43NzEwNTUsIDAuMDIxMjU1IH0sCisgICAgeyAwLjIxNTAzMCwgMC43NjU1OTUsIDAuMDE5Mzc1IH0sCisgICAgeyAwLjIyMjMzNywgMC43NjAwMjAsIDAuMDE3NjQzIH0sCisgICAgeyAwLjIyOTYyMCwgMC43NTQzMjksIDAuMDE2MDUxIH0sCisgICAgeyAwLjIzNjg4NSwgMC43NDg1MjQsIDAuMDE0NTkxIH0sCisgICAgeyAwLjI0NDEzMywgMC43NDI2MTQsIDAuMDEzMjUzIH0sCisgICAgeyAwLjI1MTM2MywgMC43MzY2MDYsIDAuMDEyMDMxIH0sCisgICAgeyAwLjI1ODU3OCwgMC43MzA1MDcsIDAuMDEwOTE2IH0sCisgICAgeyAwLjI2NTc3NSwgMC43MjQzMjQsIDAuMDA5OTAxIH0sCisgICAgeyAwLjI3Mjk1OCwgMC43MTgwNjIsIDAuMDA4OTgwIH0sCisgICAgeyAwLjI4MDEyOSwgMC43MTE3MjUsIDAuMDA4MTQ2IH0sCisgICAgeyAwLjI4NzI5MiwgMC43MDUzMTYsIDAuMDA3MzkxIH0sCisgICAgeyAwLjI5NDQ1MCwgMC42OTg4NDIsIDAuMDA2NzA4IH0sCisgICAgeyAwLjMwMTYwNCwgMC42OTIzMDgsIDAuMDA2MDg4IH0sCisgICAgeyAwLjMwODc2MCwgMC42ODU3MTIsIDAuMDA1NTI4IH0sCisgICAgeyAwLjMxNTkxNCwgMC42NzkwNjMsIDAuMDA1MDIyIH0sCisgICAgeyAwLjMyMzA2NiwgMC42NzIzNjcsIDAuMDA0NTY2IH0sCisgICAgeyAwLjMzMDIxNiwgMC42NjU2MjgsIDAuMDA0MTU2IH0sCisgICAgeyAwLjMzNzM2MywgMC42NTg4NDgsIDAuMDAzNzg4IH0sCisgICAgeyAwLjM0NDUxMywgMC42NTIwMjgsIDAuMDAzNDU5IH0sCisgICAgeyAwLjM1MTY2NCwgMC42NDUxNzIsIDAuMDAzMTYzIH0sCisgICAgeyAwLjM1ODgxNCwgMC42MzgyODcsIDAuMDAyODk5IH0sCisgICAgeyAwLjM2NTk1OSwgMC42MzEzNzksIDAuMDAyNjYyIH0sCisgICAgeyAwLjM3MzEwMiwgMC42MjQ0NTEsIDAuMDAyNDQ4IH0sCisgICAgeyAwLjM4MDI0NCwgMC42MTc1MDIsIDAuMDAyMjU0IH0sCisgICAgeyAwLjM4NzM3OSwgMC42MTA1NDIsIDAuMDAyMDc5IH0sCisgICAgeyAwLjM5NDUwNywgMC42MDM1NzEsIDAuMDAxOTIyIH0sCisgICAgeyAwLjQwMTYyNiwgMC41OTY1OTIsIDAuMDAxNzgyIH0sCisgICAgeyAwLjQwODczNiwgMC41ODk2MDcsIDAuMDAxNjU3IH0sCisgICAgeyAwLjQxNTgzNiwgMC41ODI2MTgsIDAuMDAxNTQ2IH0sCisgICAgeyAwLjQyMjkyMSwgMC41NzU2MzEsIDAuMDAxNDQ4IH0sCisgICAgeyAwLjQyOTk4OSwgMC41Njg2NDksIDAuMDAxMzYyIH0sCisgICAgeyAwLjQzNzAzNiwgMC41NjE2NzYsIDAuMDAxMjg4IH0sCisgICAgeyAwLjQ0NDA2MiwgMC41NTQ3MTQsIDAuMDAxMjI0IH0sCisgICAgeyAwLjQ1MTA2NSwgMC41NDc3NjYsIDAuMDAxMTY5IH0sCisgICAgeyAwLjQ1ODA0MSwgMC41NDA4MzcsIDAuMDAxMTIzIH0sCisgICAgeyAwLjQ2NDk4NiwgMC41MzM5MzAsIDAuMDAxMDg0IH0sCisgICAgeyAwLjQ3MTg5OSwgMC41MjcwNTEsIDAuMDAxMDUxIH0sCisgICAgeyAwLjQ3ODc3NSwgMC41MjAyMDIsIDAuMDAxMDIzIH0sCisgICAgeyAwLjQ4NTYxMiwgMC41MTMzODksIDAuMDAxMDAwIH0sCisgICAgeyAwLjQ5MjQwNSwgMC41MDY2MTUsIDAuMDAwOTgwIH0sCisgICAgeyAwLjQ5OTE1MSwgMC40OTk4ODcsIDAuMDAwOTYyIH0sCisgICAgeyAwLjUwNTg0NSwgMC40OTMyMTEsIDAuMDAwOTQ0IH0sCisgICAgeyAwLjUxMjQ4NiwgMC40ODY1OTEsIDAuMDAwOTIzIH0sCisgICAgeyAwLjUxOTA3MywgMC40ODAwMjksIDAuMDAwODk5IH0sCisgICAgeyAwLjUyNTYwMCwgMC40NzM1MjcsIDAuMDAwODcyIH0sCisgICAgeyAwLjUzMjA2NiwgMC40NjcwOTEsIDAuMDAwODQzIH0sCisgICAgeyAwLjUzODQ2MywgMC40NjA3MjUsIDAuMDAwODEyIH0sCisgICAgeyAwLjU0NDc4NywgMC40NTQ0MzQsIDAuMDAwNzc5IH0sCisgICAgeyAwLjU1MTAzMSwgMC40NDgyMjUsIDAuMDAwNzQ0IH0sCisgICAgeyAwLjU1NzE5MywgMC40NDIwOTksIDAuMDAwNzA4IH0sCisgICAgeyAwLjU2MzI2OSwgMC40MzYwNTgsIDAuMDAwNjczIH0sCisgICAgeyAwLjU2OTI1NywgMC40MzAxMDIsIDAuMDAwNjQxIH0sCisgICAgeyAwLjU3NTE1MSwgMC40MjQyMzIsIDAuMDAwNjE2IH0sCisgICAgeyAwLjU4MDk1MywgMC40MTg0NDcsIDAuMDAwNjAxIH0sCisgICAgeyAwLjU4NjY1MCwgMC40MTI3NTgsIDAuMDAwNTkxIH0sCisgICAgeyAwLjU5MjIyNSwgMC40MDcxOTAsIDAuMDAwNTg2IH0sCisgICAgeyAwLjU5NzY1OCwgMC40MDE3NjIsIDAuMDAwNTgwIH0sCisgICAgeyAwLjYwMjkzMywgMC4zOTY0OTcsIDAuMDAwNTcxIH0sCisgICAgeyAwLjYwODAzNSwgMC4zOTE0MDksIDAuMDAwNTU2IH0sCisgICAgeyAwLjYxMjk3NywgMC4zODY0ODYsIDAuMDAwNTM3IH0sCisgICAgeyAwLjYxNzc3OSwgMC4zODE3MDYsIDAuMDAwNTE2IH0sCisgICAgeyAwLjYyMjQ1OSwgMC4zNzcwNDcsIDAuMDAwNDkzIH0sCisgICAgeyAwLjYyNzAzNywgMC4zNzI0OTEsIDAuMDAwNDcyIH0sCisgICAgeyAwLjYzMTUyMSwgMC4zNjgwMjYsIDAuMDAwNDUzIH0sCisgICAgeyAwLjYzNTkwMCwgMC4zNjM2NjUsIDAuMDAwNDM1IH0sCisgICAgeyAwLjY0MDE1NiwgMC4zNTk0MjgsIDAuMDAwNDE2IH0sCisgICAgeyAwLjY0NDI3MywgMC4zNTUzMzEsIDAuMDAwMzk2IH0sCisgICAgeyAwLjY0ODIzMywgMC4zNTEzOTUsIDAuMDAwMzcyIH0sCisgICAgeyAwLjY1MjAyOCwgMC4zNDc2MjgsIDAuMDAwMzQ0IH0sCisgICAgeyAwLjY1NTY2OSwgMC4zNDQwMTgsIDAuMDAwMzEzIH0sCisgICAgeyAwLjY1OTE2NiwgMC4zNDA1NTMsIDAuMDAwMjgxIH0sCisgICAgeyAwLjY2MjUyOCwgMC4zMzcyMjEsIDAuMDAwMjUxIH0sCisgICAgeyAwLjY2NTc2NCwgMC4zMzQwMTEsIDAuMDAwMjI2IH0sCisgICAgeyAwLjY2ODg3NCwgMC4zMzA5MTksIDAuMDAwMjA3IH0sCisgICAgeyAwLjY3MTg1OSwgMC4zMjc5NDcsIDAuMDAwMTk0IH0sCisgICAgeyAwLjY3NDcyMCwgMC4zMjUwOTUsIDAuMDAwMTg1IH0sCisgICAgeyAwLjY3NzQ1OSwgMC4zMjIzNjIsIDAuMDAwMTc5IH0sCisgICAgeyAwLjY4MDA3OSwgMC4zMTk3NDcsIDAuMDAwMTc0IH0sCisgICAgeyAwLjY4MjU4MiwgMC4zMTcyNDksIDAuMDAwMTcwIH0sCisgICAgeyAwLjY4NDk3MSwgMC4zMTQ4NjMsIDAuMDAwMTY3IH0sCisgICAgeyAwLjY4NzI1MCwgMC4zMTI1ODYsIDAuMDAwMTY0IH0sCisgICAgeyAwLjY4OTQyNiwgMC4zMTA0MTQsIDAuMDAwMTYwIH0sCisgICAgeyAwLjY5MTUwNCwgMC4zMDgzNDIsIDAuMDAwMTU0IH0sCisgICAgeyAwLjY5MzQ5MCwgMC4zMDYzNjYsIDAuMDAwMTQ1IH0sCisgICAgeyAwLjY5NTM4OSwgMC4zMDQ0NzksIDAuMDAwMTMzIH0sCisgICAgeyAwLjY5NzIwNiwgMC4zMDI2NzUsIDAuMDAwMTE5IH0sCisgICAgeyAwLjY5ODk0NCwgMC4zMDA5NTAsIDAuMDAwMTA2IH0sCisgICAgeyAwLjcwMDYwNiwgMC4yOTkzMDEsIDAuMDAwMDkzIH0sCisgICAgeyAwLjcwMjE5MywgMC4yOTc3MjUsIDAuMDAwMDgzIH0sCisgICAgeyAwLjcwMzcwOSwgMC4yOTYyMTcsIDAuMDAwMDc0IH0sCisgICAgeyAwLjcwNTE2MywgMC4yOTQ3NzAsIDAuMDAwMDY3IH0sCisgICAgeyAwLjcwNjU2MywgMC4yOTMzNzYsIDAuMDAwMDYxIH0sCisgICAgeyAwLjcwNzkxOCwgMC4yOTIwMjcsIDAuMDAwMDU1IH0sCisgICAgeyAwLjcwOTIzMSwgMC4yOTA3MTksIDAuMDAwMDUwIH0sCisgICAgeyAwLjcxMDUwMCwgMC4yODk0NTMsIDAuMDAwMDQ3IH0sCisgICAgeyAwLjcxMTcyNCwgMC4yODgyMzIsIDAuMDAwMDQ0IH0sCisgICAgeyAwLjcxMjkwMSwgMC4yODcwNTcsIDAuMDAwMDQxIH0sCisgICAgeyAwLjcxNDAzMiwgMC4yODU5MjksIDAuMDAwMDQwIH0sCisgICAgeyAwLjcxNTExNywgMC4yODQ4NDUsIDAuMDAwMDM4IH0sCisgICAgeyAwLjcxNjE1OSwgMC4yODM4MDQsIDAuMDAwMDM2IH0sCisgICAgeyAwLjcxNzE1OSwgMC4yODI4MDYsIDAuMDAwMDM1IH0sCisgICAgeyAwLjcxODExNiwgMC4yODE4NTAsIDAuMDAwMDM0IH0sCisgICAgeyAwLjcxOTAzMywgMC4yODA5MzUsIDAuMDAwMDMyIH0sCisgICAgeyAwLjcxOTkxMiwgMC4yODAwNTgsIDAuMDAwMDMwIH0sCisgICAgeyAwLjcyMDc1MywgMC4yNzkyMTksIDAuMDAwMDI4IH0sCisgICAgeyAwLjcyMTU1NSwgMC4yNzg0MjAsIDAuMDAwMDI2IH0sCisgICAgeyAwLjcyMjMxNSwgMC4yNzc2NjIsIDAuMDAwMDIzIH0sCisgICAgeyAwLjcyMzAzMiwgMC4yNzY5NDgsIDAuMDAwMDIwIH0sCisgICAgeyAwLjcyMzcwMiwgMC4yNzYyODIsIDAuMDAwMDE2IH0sCisgICAgeyAwLjcyNDMyOCwgMC4yNzU2NjAsIDAuMDAwMDEyIH0sCisgICAgeyAwLjcyNDkxNCwgMC4yNzUwNzgsIDAuMDAwMDA3IH0sCisgICAgeyAwLjcyNTQ2NywgMC4yNzQ1MzAsIDAuMDAwMDAzIH0sCisgICAgeyAwLjcyNTk5MiwgMC4yNzQwMDgsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyNjQ5NSwgMC4yNzM1MDUsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyNjk3NSwgMC4yNzMwMjUsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyNzQzMiwgMC4yNzI1NjgsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyNzg2NCwgMC4yNzIxMzYsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyODI3MiwgMC4yNzE3MjgsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyODY1NiwgMC4yNzEzNDQsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyOTAyMCwgMC4yNzA5ODAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyOTM2MSwgMC4yNzA2MzksIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyOTY3OCwgMC4yNzAzMjIsIDAuMDAwMDAwIH0sCisgICAgeyAwLjcyOTk2OSwgMC4yNzAwMzEsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMDIzNCwgMC4yNjk3NjYsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMDQ3NCwgMC4yNjk1MjYsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMDY5MywgMC4yNjkzMDcsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMDg5NiwgMC4yNjkxMDQsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMTA4OSwgMC4yNjg5MTEsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMTI4MCwgMC4yNjg3MjAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMTQ2NywgMC4yNjg1MzMsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMTY1MCwgMC4yNjgzNTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMTgyNiwgMC4yNjgxNzQsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMTk5MywgMC4yNjgwMDcsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMjE1MCwgMC4yNjc4NTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMjMwMCwgMC4yNjc3MDAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMjQ0MywgMC4yNjc1NTcsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMjU4MSwgMC4yNjc0MTksIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMjcxOSwgMC4yNjcyODEsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMjg1OSwgMC4yNjcxNDEsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMzAwMCwgMC4yNjcwMDAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMzE0MiwgMC4yNjY4NTgsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMzI4MSwgMC4yNjY3MTksIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMzQxNywgMC4yNjY1ODMsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMzU1MSwgMC4yNjY0NDksIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMzY4MywgMC4yNjYzMTcsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMzgxMywgMC4yNjYxODcsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczMzkzNiwgMC4yNjYwNjQsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDA0NywgMC4yNjU5NTMsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDE0MywgMC4yNjU4NTcsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDIyMSwgMC4yNjU3NzksIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDI4NiwgMC4yNjU3MTQsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDM0MSwgMC4yNjU2NTksIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDM5MCwgMC4yNjU2MTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDQzOCwgMC4yNjU1NjIsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDQ4MiwgMC4yNjU1MTgsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDUyMywgMC4yNjU0NzcsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDU2MCwgMC4yNjU0NDAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDU5MiwgMC4yNjU0MDgsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDYyMSwgMC4yNjUzNzksIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY0OSwgMC4yNjUzNTEsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY3MywgMC4yNjUzMjcsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCisgICAgeyAwLjczNDY5MCwgMC4yNjUzMTAsIDAuMDAwMDAwIH0sCit9OworCisKKy8qIFN0YW5kYXJkIHdoaXRlIHBvaW50IGNocm9tYXRpY2l0aWVzLiAqLworCisjZGVmaW5lIEMgICAgIDAuMzEwMDYzLCAwLjMxNjE1OAorI2RlZmluZSBFICAgICAxLjAvMy4wLCAxLjAvMy4wCisjZGVmaW5lIEQ1MCAgIDAuMzQ1NzAsIDAuMzU4NQorI2RlZmluZSBENjUgICAwLjMxMjcxMywgMC4zMjkwMTYKKworLyogR2FtbWEgb2Ygbm9ubGluZWFyIGNvcnJlY3Rpb24uCisgICBTZWUgQ2hhcmxlcyBQb3ludG9uJ3MgQ29sb3JGQVEgSXRlbSA0NSBhbmQgR2FtbWFGQVEgSXRlbSA2IGF0CisgICBodHRwOi8vd3d3LmluZm9yYW1wLm5ldC9+cG95bnRvbi9Db2xvckZBUS5odG1sCisgICBodHRwOi8vd3d3LmluZm9yYW1wLm5ldC9+cG95bnRvbi9HYW1tYUZBUS5odG1sCisqLworCisjZGVmaW5lIEdBTU1BX1JFQzcwOSAgICAwLiAgICAgIC8qIFJlYy4gNzA5ICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgQ29sb3JTeXN0ZW0gY29sb3Jfc3lzdGVtc1tdID0geworICAgIFtOVFNDc3lzdGVtXSA9IHsKKyAgICAgICAgMC42NywgIDAuMzMsICAwLjIxLCAgMC43MSwgIDAuMTQsICAwLjA4LAorICAgICAgICBDLCBHQU1NQV9SRUM3MDkKKyAgICB9LAorICAgIFtFQlVzeXN0ZW1dID0geworICAgICAgICAwLjY0LCAgMC4zMywgIDAuMjksICAwLjYwLCAgMC4xNSwgIDAuMDYsCisgICAgICAgIEQ2NSwgR0FNTUFfUkVDNzA5CisgICAgfSwKKyAgICBbU01QVEVzeXN0ZW1dID0geworICAgICAgICAwLjYzMCwgMC4zNDAsIDAuMzEwLCAwLjU5NSwgMC4xNTUsIDAuMDcwLAorICAgICAgICBENjUsIEdBTU1BX1JFQzcwOQorICAgIH0sCisgICAgW1NNUFRFMjQwTXN5c3RlbV0gPSB7CisgICAgICAgIDAuNjcwLCAwLjMzMCwgMC4yMTAsIDAuNzEwLCAwLjE1MCwgMC4wNjAsCisgICAgICAgIEQ2NSwgR0FNTUFfUkVDNzA5CisgICAgfSwKKyAgICBbQVBQTEVzeXN0ZW1dID0geworICAgICAgICAwLjYyNSwgMC4zNDAsIDAuMjgwLCAwLjU5NSwgMC4xMTUsIDAuMDcwLAorICAgICAgICBENjUsIEdBTU1BX1JFQzcwOQorICAgIH0sCisgICAgW3dSR0JzeXN0ZW1dID0geworICAgICAgICAwLjczNDcsIDAuMjY1MywgMC4xMTUyLCAwLjgyNjQsIDAuMTU2NiwgMC4wMTc3LAorICAgICAgICBENTAsIEdBTU1BX1JFQzcwOQorICAgIH0sCisgICAgW0NJRTE5MzFzeXN0ZW1dID0geworICAgICAgICAwLjczNDcsIDAuMjY1MywgMC4yNzM4LCAwLjcxNzQsIDAuMTY2NiwgMC4wMDg5LAorICAgICAgICBFLCBHQU1NQV9SRUM3MDkKKyAgICB9LAorICAgIFtSZWM3MDlzeXN0ZW1dID0geworICAgICAgICAwLjY0LCAgMC4zMywgIDAuMzAsICAwLjYwLCAgMC4xNSwgIDAuMDYsCisgICAgICAgIEQ2NSwgR0FNTUFfUkVDNzA5CisgICAgfSwKKyAgICBbUmVjMjAyMHN5c3RlbV0gPSB7CisgICAgICAgIDAuNzA4LCAgMC4yOTIsICAwLjE3MCwgIDAuNzk3LCAgMC4xMzEsICAwLjA0NiwKKyAgICAgICAgRDY1LCBHQU1NQV9SRUM3MDkKKyAgICB9LAorfTsKKworLyoKK3N0YXRpYyBzdHJ1Y3QgQ29sb3JTeXN0ZW0gQ3VzdG9tU3lzdGVtID0geworICAgICJDdXN0b20iLAorICAgIDAuNjQsICAwLjMzLCAgMC4zMCwgIDAuNjAsICAwLjE1LCAgMC4wNiwKKyAgICBENjUsIEdBTU1BX1JFQzcwOQorfTsKKyovCisKK3N0YXRpYyB2b2lkCit1dl90b194eShkb3VibGUgICBjb25zdCB1LAorICAgICAgICAgZG91YmxlICAgY29uc3QgdiwKKyAgICAgICAgIGRvdWJsZSAqIGNvbnN0IHhjLAorICAgICAgICAgZG91YmxlICogY29uc3QgeWMpCit7CisvKgorICAgIEdpdmVuIDE5NzAgY29vcmRpbmF0ZXMgdSwgdiwgZGV0ZXJtaW5lIDE5MzEgY2hyb21hdGljaXRpZXMgeCwgeQorKi8KKyAgICAqeGMgPSAzKnUgLyAoMip1IC0gOCp2ICsgNCk7CisgICAgKnljID0gMip2IC8gKDIqdSAtIDgqdiArIDQpOworfQorCitzdGF0aWMgdm9pZAordXB2cF90b194eShkb3VibGUgICBjb25zdCB1cCwKKyAgICAgICAgICAgZG91YmxlICAgY29uc3QgdnAsCisgICAgICAgICAgIGRvdWJsZSAqIGNvbnN0IHhjLAorICAgICAgICAgICBkb3VibGUgKiBjb25zdCB5YykKK3sKKy8qCisgICAgR2l2ZW4gMTk3NiBjb29yZGluYXRlcyB1JywgdicsIGRldGVybWluZSAxOTMxIGNocm9tYXRpY2l0aWVzIHgsIHkKKyovCisgICAgKnhjID0gOSp1cCAvICg2KnVwIC0gMTYqdnAgKyAxMik7CisgICAgKnljID0gNCp2cCAvICg2KnVwIC0gMTYqdnAgKyAxMik7Cit9CisKK3N0YXRpYyB2b2lkCit4eV90b191cHZwKGRvdWJsZSB4YywKKyAgICAgICAgICAgZG91YmxlIHljLAorICAgICAgICAgICBkb3VibGUgKiBjb25zdCB1cCwKKyAgICAgICAgICAgZG91YmxlICogY29uc3QgdnApCit7CisvKgorICAgIEdpdmVuIDE5MzEgY2hyb21hdGljaXRpZXMgeCwgeSwgZGV0ZXJtaW5lIDE5NzYgY29vcmRpbmF0ZXMgdScsIHYnCisqLworICAgICp1cCA9IDQqeGMgLyAoLSAyKnhjICsgMTIqeWMgKyAzKTsKKyAgICAqdnAgPSA5KnljIC8gKC0gMip4YyArIDEyKnljICsgMyk7Cit9CisKK3N0YXRpYyB2b2lkCit4eV90b191dihkb3VibGUgeGMsCisgICAgICAgICBkb3VibGUgeWMsCisgICAgICAgICBkb3VibGUgKiBjb25zdCB1LAorICAgICAgICAgZG91YmxlICogY29uc3QgdikKK3sKKy8qCisgICAgR2l2ZW4gMTkzMSBjaHJvbWF0aWNpdGllcyB4LCB5LCBkZXRlcm1pbmUgMTk2MCBjb29yZGluYXRlcyB1LCB2CisqLworICAgICp1ID0gNCp4YyAvICgtIDIqeGMgKyAxMip5YyArIDMpOworICAgICp2ID0gNip5YyAvICgtIDIqeGMgKyAxMip5YyArIDMpOworfQorCitzdGF0aWMgdm9pZAoreHl6X3RvX3JnYihjb25zdCBkb3VibGUgbVszXVszXSwKKyAgICAgICAgICAgZG91YmxlIHhjLCBkb3VibGUgeWMsIGRvdWJsZSB6YywKKyAgICAgICAgICAgZG91YmxlICogY29uc3QgciwgZG91YmxlICogY29uc3QgZywgZG91YmxlICogY29uc3QgYikKK3sKKyAgICAqciA9IG1bMF1bMF0qeGMgKyBtWzBdWzFdKnljICsgbVswXVsyXSp6YzsKKyAgICAqZyA9IG1bMV1bMF0qeGMgKyBtWzFdWzFdKnljICsgbVsxXVsyXSp6YzsKKyAgICAqYiA9IG1bMl1bMF0qeGMgKyBtWzJdWzFdKnljICsgbVsyXVsyXSp6YzsKK30KKworc3RhdGljIHZvaWQgaW52ZXJ0X21hdHJpeDN4Myhkb3VibGUgaW5bM11bM10sIGRvdWJsZSBvdXRbM11bM10pCit7CisgICAgZG91YmxlIG0wMCA9IGluWzBdWzBdLCBtMDEgPSBpblswXVsxXSwgbTAyID0gaW5bMF1bMl0sCisgICAgICAgICAgIG0xMCA9IGluWzFdWzBdLCBtMTEgPSBpblsxXVsxXSwgbTEyID0gaW5bMV1bMl0sCisgICAgICAgICAgIG0yMCA9IGluWzJdWzBdLCBtMjEgPSBpblsyXVsxXSwgbTIyID0gaW5bMl1bMl07CisgICAgaW50IGksIGo7CisgICAgZG91YmxlIGRldDsKKworICAgIG91dFswXVswXSA9ICAobTExICogbTIyIC0gbTIxICogbTEyKTsKKyAgICBvdXRbMF1bMV0gPSAtKG0wMSAqIG0yMiAtIG0yMSAqIG0wMik7CisgICAgb3V0WzBdWzJdID0gIChtMDEgKiBtMTIgLSBtMTEgKiBtMDIpOworICAgIG91dFsxXVswXSA9IC0obTEwICogbTIyIC0gbTIwICogbTEyKTsKKyAgICBvdXRbMV1bMV0gPSAgKG0wMCAqIG0yMiAtIG0yMCAqIG0wMik7CisgICAgb3V0WzFdWzJdID0gLShtMDAgKiBtMTIgLSBtMTAgKiBtMDIpOworICAgIG91dFsyXVswXSA9ICAobTEwICogbTIxIC0gbTIwICogbTExKTsKKyAgICBvdXRbMl1bMV0gPSAtKG0wMCAqIG0yMSAtIG0yMCAqIG0wMSk7CisgICAgb3V0WzJdWzJdID0gIChtMDAgKiBtMTEgLSBtMTAgKiBtMDEpOworCisgICAgZGV0ID0gbTAwICogb3V0WzBdWzBdICsgbTEwICogb3V0WzBdWzFdICsgbTIwICogb3V0WzBdWzJdOworICAgIGRldCA9IDEuMCAvIGRldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIG91dFtpXVtqXSAqPSBkZXQ7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZXRfcmdiMnh5el9tYXRyaXgoc3RydWN0IENvbG9yU3lzdGVtIHN5c3RlbSwgZG91YmxlIG1bM11bM10pCit7CisgICAgZG91YmxlIFNbM10sIFhbNF0sIFpbNF07CisgICAgaW50IGk7CisKKyAgICBYWzBdID0gc3lzdGVtLnhSZWQgICAvIHN5c3RlbS55UmVkOworICAgIFhbMV0gPSBzeXN0ZW0ueEdyZWVuIC8gc3lzdGVtLnlHcmVlbjsKKyAgICBYWzJdID0gc3lzdGVtLnhCbHVlICAvIHN5c3RlbS55Qmx1ZTsKKyAgICBYWzNdID0gc3lzdGVtLnhXaGl0ZSAvIHN5c3RlbS55V2hpdGU7CisKKyAgICBaWzBdID0gKDEgLSBzeXN0ZW0ueFJlZCAgIC0gc3lzdGVtLnlSZWQpICAgLyBzeXN0ZW0ueVJlZDsKKyAgICBaWzFdID0gKDEgLSBzeXN0ZW0ueEdyZWVuIC0gc3lzdGVtLnlHcmVlbikgLyBzeXN0ZW0ueUdyZWVuOworICAgIFpbMl0gPSAoMSAtIHN5c3RlbS54Qmx1ZSAgLSBzeXN0ZW0ueUJsdWUpICAvIHN5c3RlbS55Qmx1ZTsKKyAgICBaWzNdID0gKDEgLSBzeXN0ZW0ueFdoaXRlIC0gc3lzdGVtLnlXaGl0ZSkgLyBzeXN0ZW0ueVdoaXRlOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBtWzBdW2ldID0gWFtpXTsKKyAgICAgICAgbVsxXVtpXSA9IDE7CisgICAgICAgIG1bMl1baV0gPSBaW2ldOworICAgIH0KKworICAgIGludmVydF9tYXRyaXgzeDMobSwgbSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBTW2ldID0gbVtpXVswXSAqIFhbM10gKyBtW2ldWzFdICogMSArIG1baV1bMl0gKiBaWzNdOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBtWzBdW2ldID0gU1tpXSAqIFhbaV07CisgICAgICAgIG1bMV1baV0gPSBTW2ldICogMTsKKyAgICAgICAgbVsyXVtpXSA9IFNbaV0gKiBaW2ldOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK3JnYl90b194eShkb3VibGUgcmMsCisgICAgICAgICAgZG91YmxlIGdjLAorICAgICAgICAgIGRvdWJsZSBiYywKKyAgICAgICAgICBkb3VibGUgKiBjb25zdCB4LAorICAgICAgICAgIGRvdWJsZSAqIGNvbnN0IHksCisgICAgICAgICAgZG91YmxlICogY29uc3QgeiwKKyAgICAgICAgICBjb25zdCBkb3VibGUgbVszXVszXSkKK3sKKyAgICBkb3VibGUgc3VtOworCisgICAgKnggPSBtWzBdWzBdICogcmMgKyBtWzBdWzFdICogZ2MgKyBtWzBdWzJdICogYmM7CisgICAgKnkgPSBtWzFdWzBdICogcmMgKyBtWzFdWzFdICogZ2MgKyBtWzFdWzJdICogYmM7CisgICAgKnogPSBtWzJdWzBdICogcmMgKyBtWzJdWzFdICogZ2MgKyBtWzJdWzJdICogYmM7CisKKyAgICBzdW0gPSAqeCArICp5ICsgKno7CisKKyAgICAqeCA9ICp4IC8gc3VtOworICAgICp5ID0gKnkgLyBzdW07Cit9CisKK3N0YXRpYyBpbnQKK2NvbnN0cmFpbl9yZ2IoZG91YmxlICogY29uc3QgciwKKyAgICAgICAgICAgICAgZG91YmxlICogY29uc3QgZywKKyAgICAgICAgICAgICAgZG91YmxlICogY29uc3QgYikKK3sKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIElmICB0aGUgIHJlcXVlc3RlZCBSR0Igc2hhZGUgY29udGFpbnMgYSBuZWdhdGl2ZSB3ZWlnaHQgZm9yIG9uZSBvZgorICAgIHRoZSBwcmltYXJpZXMsIGl0IGxpZXMgb3V0c2lkZSB0aGUgY29sb3IgIGdhbXV0ICBhY2Nlc3NpYmxlICBmcm9tCisgICAgdGhlICBnaXZlbiAgdHJpcGxlICBvZiAgcHJpbWFyaWVzLiAgRGVzYXR1cmF0ZSBpdCBieSBhZGRpbmcgd2hpdGUsCisgICAgZXF1YWwgcXVhbnRpdGllcyBvZiBSLCBHLCBhbmQgQiwgZW5vdWdoIHRvIG1ha2UgUkdCIGFsbCBwb3NpdGl2ZS4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICBkb3VibGUgdzsKKworICAgIC8qIEFtb3VudCBvZiB3aGl0ZSBuZWVkZWQgaXMgdyA9IC0gbWluKDAsICpyLCAqZywgKmIpICovCisgICAgdyA9ICgwIDwgKnIpID8gMCA6ICpyOworICAgIHcgPSAodyA8ICpnKSA/IHcgOiAqZzsKKyAgICB3ID0gKHcgPCAqYikgPyB3IDogKmI7CisgICAgdyA9IC0gdzsKKworICAgIC8qIEFkZCBqdXN0IGVub3VnaCB3aGl0ZSB0byBtYWtlIHIsIGcsIGIgYWxsIHBvc2l0aXZlLiAqLworICAgIGlmICh3ID4gMCkgeworICAgICAgICAqciArPSB3OyAgKmcgKz0gdzsgKmIgKz0gdzsKKworICAgICAgICByZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAvKiBDb2xvciBtb2RpZmllZCB0byBmaXQgUkdCIGdhbXV0ICovCisgICAgfQorCisgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yIHdpdGhpbiBSR0IgZ2FtdXQgKi8KK30KKworc3RhdGljIHZvaWQKK2dhbW1hX2NvcnJlY3QoY29uc3Qgc3RydWN0IENvbG9yU3lzdGVtICogY29uc3QgY3MsCisgICAgICAgICAgICAgIGRvdWJsZSAqICAgICAgICAgICAgICAgICAgIGNvbnN0IGMpCit7CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUcmFuc2Zvcm0gbGluZWFyIFJHQiB2YWx1ZXMgdG8gbm9ubGluZWFyIFJHQiB2YWx1ZXMuCisKKyAgICBSZWMuIDcwOSBpcyBJVFUtUiBSZWNvbW1lbmRhdGlvbiBCVC4gNzA5ICgxOTkwKQorICAgIGBgQmFzaWMgUGFyYW1ldGVyIFZhbHVlcyBmb3IgdGhlIEhEVFYgU3RhbmRhcmQgZm9yIHRoZSBTdHVkaW8gYW5kIGZvcgorICAgIEludGVybmF0aW9uYWwgUHJvZ3JhbW1lIEV4Y2hhbmdlJycsIGZvcm1lcmx5IENDSVIgUmVjLiA3MDkuCisKKyAgICBGb3IgZGV0YWlscyBzZWUKKyAgICAgICBodHRwOi8vd3d3LmluZm9yYW1wLm5ldC9+cG95bnRvbi9Db2xvckZBUS5odG1sCisgICAgICAgaHR0cDovL3d3dy5pbmZvcmFtcC5uZXQvfnBveW50b24vR2FtbWFGQVEuaHRtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIGRvdWJsZSBnYW1tYTsKKyAgICBkb3VibGUgY2M7CisKKyAgICBnYW1tYSA9IGNzLT5nYW1tYTsKKworICAgIGlmIChnYW1tYSA9PSAwLikgeworICAgICAgICAvKiBSZWMuIDcwOSBnYW1tYSBjb3JyZWN0aW9uLiAqLworICAgICAgICBjYyA9IDAuMDE4OworICAgICAgICBpZiAoKmMgPCBjYykgeworICAgICAgICAgICAgKmMgKj0gKDEuMDk5ICogcG93KGNjLCAwLjQ1KSAtIDAuMDk5KSAvIGNjOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmMgPSAxLjA5OSAqIHBvdygqYywgMC40NSkgLSAwLjA5OTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgLyogTm9ubGluZWFyIGNvbG9yID0gKExpbmVhciBjb2xvcileKDEvZ2FtbWEpICovCisgICAgICAgICpjID0gcG93KCpjLCAxLi9nYW1tYSk7CisgICAgfQorfQorCisKKworc3RhdGljIHZvaWQKK2dhbW1hX2NvcnJlY3RfcmdiKGNvbnN0IHN0cnVjdCBDb2xvclN5c3RlbSAqIGNvbnN0IGNzLAorICAgICAgICAgICAgICAgICAgZG91YmxlICogY29uc3QgciwKKyAgICAgICAgICAgICAgICAgIGRvdWJsZSAqIGNvbnN0IGcsCisgICAgICAgICAgICAgICAgICBkb3VibGUgKiBjb25zdCBiKQoreworICAgIGdhbW1hX2NvcnJlY3QoY3MsIHIpOworICAgIGdhbW1hX2NvcnJlY3QoY3MsIGcpOworICAgIGdhbW1hX2NvcnJlY3QoY3MsIGIpOworfQorCisvKiBTeihYKSBpcyB0aGUgZGlzcGxhY2VtZW50IGluIHBpeGVscyBvZiBhIGRpc3BsYWNlbWVudCBvZiBYIG5vcm1hbGl6ZWQKKyAgIGRpc3RhbmNlIHVuaXRzLiAgKEEgbm9ybWFsaXplZCBkaXN0YW5jZSB1bml0IGlzIDEvNTEyIG9mIHRoZSBzbWFsbGVyCisgICBkaW1lbnNpb24gb2YgdGhlIGNhbnZhcykKKyovCisjZGVmaW5lIFN6KHgpICgoKHgpICogKGludClGRk1JTih3LCBoKSkgLyA1MTIpCisKK3N0YXRpYyB2b2lkCittb25vY2hyb21lX2NvbG9yX2xvY2F0aW9uKGRvdWJsZSB3YXZlTGVuZ3RoLCBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaWUsIGludCAqeFAsIGludCAqeVApCit7CisgICAgY29uc3QgaW50IGl4ID0gd2F2ZUxlbmd0aCAtIDM2MDsKKyAgICBjb25zdCBkb3VibGUgcFggPSBzcGVjdHJhbF9jaHJvbWF0aWNpdHlbaXhdWzBdOworICAgIGNvbnN0IGRvdWJsZSBwWSA9IHNwZWN0cmFsX2Nocm9tYXRpY2l0eVtpeF1bMV07CisgICAgY29uc3QgZG91YmxlIHBaID0gc3BlY3RyYWxfY2hyb21hdGljaXR5W2l4XVsyXTsKKyAgICBjb25zdCBkb3VibGUgcHggPSBwWCAvIChwWCArIHBZICsgcFopOworICAgIGNvbnN0IGRvdWJsZSBweSA9IHBZIC8gKHBYICsgcFkgKyBwWik7CisKKyAgICBpZiAoY2llID09IExVVikgeworICAgICAgICBkb3VibGUgdXAsIHZwOworCisgICAgICAgIHh5X3RvX3VwdnAocHgsIHB5LCAmdXAsICZ2cCk7CisgICAgICAgICp4UCA9IHVwICogKHcgLSAxKTsKKyAgICAgICAgKnlQID0gKGggLSAxKSAtIHZwICogKGggLSAxKTsKKyAgICB9IGVsc2UgaWYgKGNpZSA9PSBVQ1MpIHsKKyAgICAgICAgZG91YmxlIHUsIHY7CisKKyAgICAgICAgeHlfdG9fdXYocHgsIHB5LCAmdSwgJnYpOworICAgICAgICAqeFAgPSB1ICogKHcgLSAxKTsKKyAgICAgICAgKnlQID0gKGggLSAxKSAtIHYgKiAoaCAtIDEpOworICAgIH0gZWxzZSBpZiAoY2llID09IFhZWSkgeworICAgICAgICAqeFAgPSBweCAqICh3IC0gMSk7CisgICAgICAgICp5UCA9IChoIC0gMSkgLSBweSAqIChoIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitmaW5kX3Rvbmd1ZSh1aW50MTZfdCogY29uc3QgcGl4ZWxzLAorICAgICAgICAgICAgaW50ICAgICAgIGNvbnN0IHcsCisgICAgICAgICAgICBpbnQgICAgICAgY29uc3QgbGluZXNpemUsCisgICAgICAgICAgICBpbnQgICAgICAgY29uc3Qgcm93LAorICAgICAgICAgICAgaW50ICogICAgIGNvbnN0IHByZXNlbnRQLAorICAgICAgICAgICAgaW50ICogICAgIGNvbnN0IGxlZnRFZGdlUCwKKyAgICAgICAgICAgIGludCAqICAgICBjb25zdCByaWdodEVkZ2VQKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHcgJiYgcGl4ZWxzW3JvdyAqIGxpbmVzaXplICsgaSAqIDQgKyAwXSA9PSAwOyBpKyspCisgICAgICAgIDsKKworICAgIGlmIChpID49IHcpIHsKKyAgICAgICAgKnByZXNlbnRQID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgajsKKyAgICAgICAgaW50IGNvbnN0IGxlZnRFZGdlID0gaTsKKworICAgICAgICAqcHJlc2VudFAgPSAxOworCisgICAgICAgIGZvciAoaiA9IHcgLSAxOyBqID49IGxlZnRFZGdlICYmIHBpeGVsc1tyb3cgKiBsaW5lc2l6ZSArIGogKiA0ICsgMF0gPT0gMDsgai0tKQorICAgICAgICAgICAgOworCisgICAgICAgICpyaWdodEVkZ2VQID0gajsKKyAgICAgICAgKmxlZnRFZGdlUCA9IGxlZnRFZGdlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHJhd19saW5lKHVpbnQxNl90ICpjb25zdCBwaXhlbHMsIGludCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgeDAsIGludCB5MCwgaW50IHgxLCBpbnQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpjb25zdCByZ2Jjb2xvcikKK3sKKyAgICBpbnQgZHggID0gRkZBQlMoeDEgLSB4MCksIHN4ID0geDAgPCB4MSA/IDEgOiAtMTsKKyAgICBpbnQgZHkgID0gRkZBQlMoeTEgLSB5MCksIHN5ID0geTAgPCB5MSA/IDEgOiAtMTsKKyAgICBpbnQgZXJyID0gKGR4ID4gZHkgPyBkeCA6IC1keSkgLyAyLCBlMjsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgcGl4ZWxzW3kwICogbGluZXNpemUgKyB4MCAqIDQgKyAwXSA9IHJnYmNvbG9yWzBdOworICAgICAgICBwaXhlbHNbeTAgKiBsaW5lc2l6ZSArIHgwICogNCArIDFdID0gcmdiY29sb3JbMV07CisgICAgICAgIHBpeGVsc1t5MCAqIGxpbmVzaXplICsgeDAgKiA0ICsgMl0gPSByZ2Jjb2xvclsyXTsKKyAgICAgICAgcGl4ZWxzW3kwICogbGluZXNpemUgKyB4MCAqIDQgKyAzXSA9IHJnYmNvbG9yWzNdOworCisgICAgICAgIGlmICh4MCA9PSB4MSAmJiB5MCA9PSB5MSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGUyID0gZXJyOworCisgICAgICAgIGlmIChlMiA+LWR4KSB7CisgICAgICAgICAgICBlcnIgLT0gZHk7CisgICAgICAgICAgICB4MCArPSBzeDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlMiA8IGR5KSB7CisgICAgICAgICAgICBlcnIgKz0gZHg7CisgICAgICAgICAgICB5MCArPSBzeTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZHJhd19ybGluZSh1aW50MTZfdCAqY29uc3QgcGl4ZWxzLCBpbnQgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB4MCwgaW50IHkwLCBpbnQgeDEsIGludCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIGludCBkeCAgPSBGRkFCUyh4MSAtIHgwKSwgc3ggPSB4MCA8IHgxID8gMSA6IC0xOworICAgIGludCBkeSAgPSBGRkFCUyh5MSAtIHkwKSwgc3kgPSB5MCA8IHkxID8gMSA6IC0xOworICAgIGludCBlcnIgPSAoZHggPiBkeSA/IGR4IDogLWR5KSAvIDIsIGUyOworCisgICAgZm9yICg7OykgeworICAgICAgICBwaXhlbHNbeTAgKiBsaW5lc2l6ZSArIHgwICogNCArIDBdID0gNjU1MzUgLSBwaXhlbHNbeTAgKiBsaW5lc2l6ZSArIHgwICogNCArIDBdOworICAgICAgICBwaXhlbHNbeTAgKiBsaW5lc2l6ZSArIHgwICogNCArIDFdID0gNjU1MzUgLSBwaXhlbHNbeTAgKiBsaW5lc2l6ZSArIHgwICogNCArIDFdOworICAgICAgICBwaXhlbHNbeTAgKiBsaW5lc2l6ZSArIHgwICogNCArIDJdID0gNjU1MzUgLSBwaXhlbHNbeTAgKiBsaW5lc2l6ZSArIHgwICogNCArIDJdOworICAgICAgICBwaXhlbHNbeTAgKiBsaW5lc2l6ZSArIHgwICogNCArIDNdID0gNjU1MzU7CisKKyAgICAgICAgaWYgKHgwID09IHgxICYmIHkwID09IHkxKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZTIgPSBlcnI7CisKKyAgICAgICAgaWYgKGUyID4tZHgpIHsKKyAgICAgICAgICAgIGVyciAtPSBkeTsKKyAgICAgICAgICAgIHgwICs9IHN4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGUyIDwgZHkpIHsKKyAgICAgICAgICAgIGVyciArPSBkeDsKKyAgICAgICAgICAgIHkwICs9IHN5OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAordG9uZ3VlX291dGxpbmUodWludDE2X3QqIGNvbnN0IHBpeGVscywKKyAgICAgICAgICAgICAgIGludCAgICAgICBjb25zdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICBjb25zdCB3LAorICAgICAgICAgICAgICAgaW50ICAgICAgIGNvbnN0IGgsCisgICAgICAgICAgICAgICB1aW50MTZfdCAgY29uc3QgbWF4dmFsLAorICAgICAgICAgICAgICAgaW50ICAgICAgIGNvbnN0IGNpZSkKK3sKKyAgICBjb25zdCB1aW50MTZfdCByZ2Jjb2xvcls0XSA9IHsgbWF4dmFsLCBtYXh2YWwsIG1heHZhbCwgbWF4dmFsIH07CisgICAgaW50IHdhdmVsZW5ndGg7CisgICAgaW50IGx4LCBseTsKKyAgICBpbnQgZngsIGZ5OworCisgICAgZm9yICh3YXZlbGVuZ3RoID0gMzYwOyB3YXZlbGVuZ3RoIDw9IDgzMDsgd2F2ZWxlbmd0aCsrKSB7CisgICAgICAgIGludCBpY3gsIGljeTsKKworICAgICAgICBtb25vY2hyb21lX2NvbG9yX2xvY2F0aW9uKHdhdmVsZW5ndGgsIHcsIGgsIGNpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWN4LCAmaWN5KTsKKworICAgICAgICBpZiAod2F2ZWxlbmd0aCA+IDM2MCkKKyAgICAgICAgICAgIGRyYXdfbGluZShwaXhlbHMsIGxpbmVzaXplLCBseCwgbHksIGljeCwgaWN5LCB3LCBoLCByZ2Jjb2xvcik7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgZnggPSBpY3g7CisgICAgICAgICAgICBmeSA9IGljeTsKKyAgICAgICAgfQorICAgICAgICBseCA9IGljeDsKKyAgICAgICAgbHkgPSBpY3k7CisgICAgfQorICAgIGRyYXdfbGluZShwaXhlbHMsIGxpbmVzaXplLCBseCwgbHksIGZ4LCBmeSwgdywgaCwgcmdiY29sb3IpOworfQorCitzdGF0aWMgdm9pZAorZmlsbF9pbl90b25ndWUodWludDE2X3QqICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWxzLAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXNpemUsCisgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3LAorICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaCwKKyAgICAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heHZhbCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBDb2xvclN5c3RlbSAqIGNvbnN0IGNzLAorICAgICAgICAgICAgICAgZG91YmxlICAgICAgICAgICAgICAgICAgICAgY29uc3QgbVszXVszXSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNpZSwKKyAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvcnJlY3RfZ2FtbWEsCisgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cmFzdCkKK3sKKyAgICBpbnQgeTsKKworICAgIC8qIFNjYW4gdGhlIGltYWdlIGxpbmUgYnkgbGluZSBhbmQgIGZpbGwgIHRoZSAgdG9uZ3VlICBvdXRsaW5lCisgICAgICAgd2l0aCB0aGUgUkdCIHZhbHVlcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb2xvciBzeXN0ZW0gZm9yIHRoZSB4LXkKKyAgICAgICBjby1vcmRpbmF0ZXMgd2l0aGluIHRoZSB0b25ndWUuCisgICAgKi8KKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICAgICAgaW50ICBwcmVzZW50OyAgLyogVGhlcmUgaXMgc29tZSB0b25ndWUgb24gdGhpcyBsaW5lICovCisgICAgICAgIGludCBsZWZ0RWRnZTsgLyogeCBwb3NpdGlvbiBvZiBsZWZ0bW9zdCBwaXhlbCBpbiB0b25ndWUgb24gdGhpcyBsaW5lICovCisgICAgICAgIGludCByaWdodEVkZ2U7IC8qIHNhbWUsIGJ1dCByaWdodG1vc3QgKi8KKworICAgICAgICBmaW5kX3Rvbmd1ZShwaXhlbHMsIHcsIGxpbmVzaXplLCB5LCAmcHJlc2VudCwgJmxlZnRFZGdlLCAmcmlnaHRFZGdlKTsKKworICAgICAgICBpZiAocHJlc2VudCkgeworICAgICAgICAgICAgaW50IHg7CisKKyAgICAgICAgICAgIGZvciAoeCA9IGxlZnRFZGdlOyB4IDw9IHJpZ2h0RWRnZTsgKyt4KSB7CisgICAgICAgICAgICAgICAgZG91YmxlIGN4LCBjeSwgY3osIGpyLCBqZywgamIsIGptYXg7CisgICAgICAgICAgICAgICAgaW50IHIsIGcsIGIsIG14ID0gbWF4dmFsOworCisgICAgICAgICAgICAgICAgaWYgKGNpZSA9PSBMVVYpIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHVwLCB2cDsKKyAgICAgICAgICAgICAgICAgICAgdXAgPSAoKGRvdWJsZSkgeCkgLyAodyAtIDEpOworICAgICAgICAgICAgICAgICAgICB2cCA9IDEuMCAtICgoZG91YmxlKSB5KSAvIChoIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHVwdnBfdG9feHkodXAsIHZwLCAmY3gsICZjeSk7CisgICAgICAgICAgICAgICAgICAgIGN6ID0gMS4wIC0gKGN4ICsgY3kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2llID09IFVDUykgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdSwgdjsKKyAgICAgICAgICAgICAgICAgICAgdSA9ICgoZG91YmxlKSB4KSAvICh3IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIHYgPSAxLjAgLSAoKGRvdWJsZSkgeSkgLyAoaCAtIDEpOworICAgICAgICAgICAgICAgICAgICB1dl90b194eSh1LCB2LCAmY3gsICZjeSk7CisgICAgICAgICAgICAgICAgICAgIGN6ID0gMS4wIC0gKGN4ICsgY3kpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2llID09IFhZWSkgeworICAgICAgICAgICAgICAgICAgICBjeCA9ICgoZG91YmxlKSB4KSAvICh3IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIGN5ID0gMS4wIC0gKChkb3VibGUpIHkpIC8gKGggLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgY3ogPSAxLjAgLSAoY3ggKyBjeSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB4eXpfdG9fcmdiKG0sIGN4LCBjeSwgY3osICZqciwgJmpnLCAmamIpOworCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgd2hldGhlciB0aGUgcmVxdWVzdGVkIGNvbG9yICBpcyAgd2l0aGluICB0aGUKKyAgICAgICAgICAgICAgICAgICBnYW11dCAgYWNoaWV2YWJsZSB3aXRoIHRoZSBnaXZlbiBjb2xvciBzeXN0ZW0uICBJZgorICAgICAgICAgICAgICAgICAgIG5vdCwgZHJhdyBpdCBpbiBhIHJlZHVjZWQgIGludGVuc2l0eSwgIGludGVycG9sYXRlZAorICAgICAgICAgICAgICAgICAgIGJ5IGRlc2F0dXJhdGlvbiB0byB0aGUgY2xvc2VzdCB3aXRoaW4tZ2FtdXQgY29sb3IuICovCisKKyAgICAgICAgICAgICAgICBpZiAoY29uc3RyYWluX3JnYigmanIsICZqZywgJmpiKSkKKyAgICAgICAgICAgICAgICAgICAgbXggKj0gY29udHJhc3Q7CisKKyAgICAgICAgICAgICAgICBqbWF4ID0gRkZNQVgzKGpyLCBqZywgamIpOworICAgICAgICAgICAgICAgIGlmIChqbWF4ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBqciA9IGpyIC8gam1heDsKKyAgICAgICAgICAgICAgICAgICAgamcgPSBqZyAvIGptYXg7CisgICAgICAgICAgICAgICAgICAgIGpiID0gamIgLyBqbWF4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBnYW1tYSBjb3JyZWN0IGZyb20gbGluZWFyIHJnYiB0byBub25saW5lYXIgcmdiLiAqLworICAgICAgICAgICAgICAgIGlmIChjb3JyZWN0X2dhbW1hKQorICAgICAgICAgICAgICAgICAgICBnYW1tYV9jb3JyZWN0X3JnYihjcywgJmpyLCAmamcsICZqYik7CisgICAgICAgICAgICAgICAgciA9IG14ICoganI7CisgICAgICAgICAgICAgICAgZyA9IG14ICogamc7CisgICAgICAgICAgICAgICAgYiA9IG14ICogamI7CisgICAgICAgICAgICAgICAgcGl4ZWxzW3kgKiBsaW5lc2l6ZSArIHggKiA0ICsgMF0gPSByOworICAgICAgICAgICAgICAgIHBpeGVsc1t5ICogbGluZXNpemUgKyB4ICogNCArIDFdID0gZzsKKyAgICAgICAgICAgICAgICBwaXhlbHNbeSAqIGxpbmVzaXplICsgeCAqIDQgKyAyXSA9IGI7CisgICAgICAgICAgICAgICAgcGl4ZWxzW3kgKiBsaW5lc2l6ZSArIHggKiA0ICsgM10gPSA2NTUzNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQKK3Bsb3Rfd2hpdGVfcG9pbnQodWludDE2X3QqICAgICAgcGl4ZWxzLAorICAgICAgICAgICAgICAgICBpbnQgICAgICBjb25zdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgY29uc3QgdywKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgY29uc3QgaCwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgY29uc3QgbWF4dmFsLAorICAgICAgICAgICAgICAgICBpbnQgICAgICBjb25zdCBjb2xvcl9zeXN0ZW0sCisgICAgICAgICAgICAgICAgIGludCAgICAgIGNvbnN0IGNpZSkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgQ29sb3JTeXN0ZW0gKmNzID0gJmNvbG9yX3N5c3RlbXNbY29sb3Jfc3lzdGVtXTsKKyAgICBpbnQgd3gsIHd5OworCisgICAgaWYgKGNpZSA9PSBMVVYpIHsKKyAgICAgICAgZG91YmxlIHd1cCwgd3ZwOworICAgICAgICB4eV90b191cHZwKGNzLT54V2hpdGUsIGNzLT55V2hpdGUsICZ3dXAsICZ3dnApOworICAgICAgICB3eCA9IHd1cDsKKyAgICAgICAgd3kgPSB3dnA7CisgICAgICAgIHd4ID0gKHcgLSAxKSAqIHd1cDsKKyAgICAgICAgd3kgPSAoaCAtIDEpIC0gKChpbnQpICgoaCAtIDEpICogd3ZwKSk7CisgICAgfSBlbHNlIGlmIChjaWUgPT0gVUNTKSB7CisgICAgICAgIGRvdWJsZSB3dSwgd3Y7CisgICAgICAgIHh5X3RvX3V2KGNzLT54V2hpdGUsIGNzLT55V2hpdGUsICZ3dSwgJnd2KTsKKyAgICAgICAgd3ggPSB3dTsKKyAgICAgICAgd3kgPSB3djsKKyAgICAgICAgd3ggPSAodyAtIDEpICogd3U7CisgICAgICAgIHd5ID0gKGggLSAxKSAtICgoaW50KSAoKGggLSAxKSAqIHd2KSk7CisgICAgfSBlbHNlIGlmIChjaWUgPT0gWFlZKSB7CisgICAgICAgIHd4ID0gKHcgLSAxKSAqIGNzLT54V2hpdGU7CisgICAgICAgIHd5ID0gKGggLSAxKSAtICgoaW50KSAoKGggLSAxKSAqIGNzLT55V2hpdGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIGRyYXdfcmxpbmUocGl4ZWxzLCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgIHd4ICsgU3ooMyksIHd5LCB3eCArIFN6KDEwKSwgd3ksCisgICAgICAgICAgICAgICB3LCBoKTsKKyAgICBkcmF3X3JsaW5lKHBpeGVscywgbGluZXNpemUsCisgICAgICAgICAgICAgICB3eCAtIFN6KDMpLCB3eSwgd3ggLSBTeigxMCksIHd5LAorICAgICAgICAgICAgICAgdywgaCk7CisgICAgZHJhd19ybGluZShwaXhlbHMsIGxpbmVzaXplLAorICAgICAgICAgICAgICAgd3gsIHd5ICsgU3ooMyksIHd4LCB3eSArIFN6KDEwKSwKKyAgICAgICAgICAgICAgIHcsIGgpOworICAgIGRyYXdfcmxpbmUocGl4ZWxzLCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgIHd4LCB3eSAtIFN6KDMpLCB3eCwgd3kgLSBTeigxMCksCisgICAgICAgICAgICAgICB3LCBoKTsKK30KKworc3RhdGljIGludCBkcmF3X2JhY2tncm91bmQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQ2llc2NvcGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IHN0cnVjdCBDb2xvclN5c3RlbSAqY3MgPSAmY29sb3Jfc3lzdGVtc1tzLT5jb2xvcl9zeXN0ZW1dOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgdyA9IHMtPnNpemU7CisgICAgaW50IGggPSBzLT5zaXplOworICAgIHVpbnQxNl90ICpwaXhlbHM7CisKKyAgICBpZiAoKHMtPmYgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHBpeGVscyA9ICh1aW50MTZfdCAqKXMtPmYtPmRhdGFbMF07CisKKyAgICB0b25ndWVfb3V0bGluZShwaXhlbHMsIHMtPmYtPmxpbmVzaXplWzBdIC8gMiwgdywgaCwgNjU1MzUsIHMtPmNpZSk7CisKKyAgICBmaWxsX2luX3Rvbmd1ZShwaXhlbHMsIHMtPmYtPmxpbmVzaXplWzBdIC8gMiwgdywgaCwgNjU1MzUsIGNzLCAoY29uc3QgZG91YmxlICgqKVszXSlzLT5pLCBzLT5jaWUsCisgICAgICAgICAgICAgICAgICAgcy0+Y29ycmVjdF9nYW1tYSwgcy0+Y29udHJhc3QpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9yZ2I0OChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqaW4sIGRvdWJsZSAqY3gsIGRvdWJsZSAqY3ksIGludCB4LCBpbnQgeSkKK3sKKyAgICBDaWVzY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgdWludDE2X3QqIHNyYyA9IChjb25zdCB1aW50MTZfdCopKGluLT5kYXRhWzBdICsgaW4tPmxpbmVzaXplWzBdICogeSArIHggKiA2KTsKKyAgICBkb3VibGUgciA9IHNyY1swXSAvIDY1NTM1LjsKKyAgICBkb3VibGUgZyA9IHNyY1sxXSAvIDY1NTM1LjsKKyAgICBkb3VibGUgYiA9IHNyY1syXSAvIDY1NTM1LjsKKyAgICBkb3VibGUgY3o7CisKKyAgICByZ2JfdG9feHkociwgZywgYiwgY3gsIGN5LCAmY3osIChjb25zdCBkb3VibGUgKCopWzNdKXMtPm0pOworfQorCitzdGF0aWMgdm9pZCBmaWx0ZXJfcmdiYTY0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbiwgZG91YmxlICpjeCwgZG91YmxlICpjeSwgaW50IHgsIGludCB5KQoreworICAgIENpZXNjb3BlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCB1aW50MTZfdCogc3JjID0gKGNvbnN0IHVpbnQxNl90KikoaW4tPmRhdGFbMF0gKyBpbi0+bGluZXNpemVbMF0gKiB5ICsgeCAqIDgpOworICAgIGRvdWJsZSByID0gc3JjWzBdIC8gNjU1MzUuOworICAgIGRvdWJsZSBnID0gc3JjWzFdIC8gNjU1MzUuOworICAgIGRvdWJsZSBiID0gc3JjWzJdIC8gNjU1MzUuOworICAgIGRvdWJsZSBjejsKKworICAgIHJnYl90b194eShyLCBnLCBiLCBjeCwgY3ksICZjeiwgKGNvbnN0IGRvdWJsZSAoKilbM10pcy0+bSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl9yZ2IyNChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqaW4sIGRvdWJsZSAqY3gsIGRvdWJsZSAqY3ksIGludCB4LCBpbnQgeSkKK3sKKyAgICBDaWVzY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgdWludDhfdCogc3JjID0gaW4tPmRhdGFbMF0gKyBpbi0+bGluZXNpemVbMF0gKiB5ICsgeCAqIDM7CisgICAgZG91YmxlIHIgPSBzcmNbMF0gLyAyNTUuOworICAgIGRvdWJsZSBnID0gc3JjWzFdIC8gMjU1LjsKKyAgICBkb3VibGUgYiA9IHNyY1syXSAvIDI1NS47CisgICAgZG91YmxlIGN6OworCisgICAgcmdiX3RvX3h5KHIsIGcsIGIsIGN4LCBjeSwgJmN6LCAoY29uc3QgZG91YmxlICgqKVszXSlzLT5tKTsKK30KKworc3RhdGljIHZvaWQgZmlsdGVyX3JnYmEoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluLCBkb3VibGUgKmN4LCBkb3VibGUgKmN5LCBpbnQgeCwgaW50IHkpCit7CisgICAgQ2llc2NvcGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IGluLT5kYXRhWzBdICsgaW4tPmxpbmVzaXplWzBdICogeSArIHggKiA0OworICAgIGRvdWJsZSByID0gc3JjWzBdIC8gMjU1LjsKKyAgICBkb3VibGUgZyA9IHNyY1sxXSAvIDI1NS47CisgICAgZG91YmxlIGIgPSBzcmNbMl0gLyAyNTUuOworICAgIGRvdWJsZSBjejsKKworICAgIHJnYl90b194eShyLCBnLCBiLCBjeCwgY3ksICZjeiwgKGNvbnN0IGRvdWJsZSAoKilbM10pcy0+bSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbHRlcl94eXooQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluLCBkb3VibGUgKmN4LCBkb3VibGUgKmN5LCBpbnQgeCwgaW50IHkpCit7CisgICAgQ2llc2NvcGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IHVpbnQxNl90KiBzcmMgPSAodWludDE2X3QgKikoaW4tPmRhdGFbMF0gKyBpbi0+bGluZXNpemVbMF0gKiB5ICsgeCAqIDYpOworICAgIGRvdWJsZSBseCA9IHMtPmxvZzJsaW5bc3JjWzBdXTsKKyAgICBkb3VibGUgbHkgPSBzLT5sb2cybGluW3NyY1sxXV07CisgICAgZG91YmxlIGx6ID0gcy0+bG9nMmxpbltzcmNbMl1dOworICAgIGRvdWJsZSBzdW0gPSBseCArIGx5ICsgbHo7CisKKyAgICBpZiAoc3VtID09IDApCisgICAgICAgIHN1bSA9IDE7CisgICAgKmN4ID0gbHggLyBzdW07CisgICAgKmN5ID0gbHkgLyBzdW07Cit9CisKK3N0YXRpYyB2b2lkIHBsb3RfZ2FtdXRzKHVpbnQxNl90ICpwaXhlbHMsIGludCBsaW5lc2l6ZSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNpZSwgaW50IGdhbXV0cykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQl9DUzsgaSsrKSB7CisgICAgICAgIGNvbnN0IHN0cnVjdCBDb2xvclN5c3RlbSAqY3MgPSAmY29sb3Jfc3lzdGVtc1tpXTsKKyAgICAgICAgaW50IHJ4LCByeSwgZ3gsIGd5LCBieCwgYnk7CisKKyAgICAgICAgaWYgKCEoKDEgPDwgaSkgJiBnYW11dHMpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChjaWUgPT0gTFVWKSB7CisgICAgICAgICAgICBkb3VibGUgd3VwLCB3dnA7CisgICAgICAgICAgICB4eV90b191cHZwKGNzLT54UmVkLCBjcy0+eVJlZCwgJnd1cCwgJnd2cCk7CisgICAgICAgICAgICByeCA9ICh3IC0gMSkgKiB3dXA7CisgICAgICAgICAgICByeSA9IChoIC0gMSkgLSAoKGludCkgKChoIC0gMSkgKiB3dnApKTsKKyAgICAgICAgICAgIHh5X3RvX3VwdnAoY3MtPnhHcmVlbiwgY3MtPnlHcmVlbiwgJnd1cCwgJnd2cCk7CisgICAgICAgICAgICBneCA9ICh3IC0gMSkgKiB3dXA7CisgICAgICAgICAgICBneSA9IChoIC0gMSkgLSAoKGludCkgKChoIC0gMSkgKiB3dnApKTsKKyAgICAgICAgICAgIHh5X3RvX3VwdnAoY3MtPnhCbHVlLCBjcy0+eUJsdWUsICZ3dXAsICZ3dnApOworICAgICAgICAgICAgYnggPSAodyAtIDEpICogd3VwOworICAgICAgICAgICAgYnkgPSAoaCAtIDEpIC0gKChpbnQpICgoaCAtIDEpICogd3ZwKSk7CisgICAgICAgIH0gZWxzZSBpZiAoY2llID09IFVDUykgeworICAgICAgICAgICAgZG91YmxlIHd1LCB3djsKKyAgICAgICAgICAgIHh5X3RvX3V2KGNzLT54UmVkLCBjcy0+eVJlZCwgJnd1LCAmd3YpOworICAgICAgICAgICAgcnggPSAodyAtIDEpICogd3U7CisgICAgICAgICAgICByeSA9IChoIC0gMSkgLSAoKGludCkgKChoIC0gMSkgKiB3dikpOworICAgICAgICAgICAgeHlfdG9fdXYoY3MtPnhHcmVlbiwgY3MtPnlHcmVlbiwgJnd1LCAmd3YpOworICAgICAgICAgICAgZ3ggPSAodyAtIDEpICogd3U7CisgICAgICAgICAgICBneSA9IChoIC0gMSkgLSAoKGludCkgKChoIC0gMSkgKiB3dikpOworICAgICAgICAgICAgeHlfdG9fdXYoY3MtPnhCbHVlLCBjcy0+eUJsdWUsICZ3dSwgJnd2KTsKKyAgICAgICAgICAgIGJ4ID0gKHcgLSAxKSAqIHd1OworICAgICAgICAgICAgYnkgPSAoaCAtIDEpIC0gKChpbnQpICgoaCAtIDEpICogd3YpKTsKKyAgICAgICAgfSBlbHNlIGlmIChjaWUgPT0gWFlZKSB7CisgICAgICAgICAgICByeCA9ICh3IC0gMSkgKiBjcy0+eFJlZDsKKyAgICAgICAgICAgIHJ5ID0gKGggLSAxKSAtICgoaW50KSAoKGggLSAxKSAqIGNzLT55UmVkKSk7CisgICAgICAgICAgICBneCA9ICh3IC0gMSkgKiBjcy0+eEdyZWVuOworICAgICAgICAgICAgZ3kgPSAoaCAtIDEpIC0gKChpbnQpICgoaCAtIDEpICogY3MtPnlHcmVlbikpOworICAgICAgICAgICAgYnggPSAodyAtIDEpICogY3MtPnhCbHVlOworICAgICAgICAgICAgYnkgPSAoaCAtIDEpIC0gKChpbnQpICgoaCAtIDEpICogY3MtPnlCbHVlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9hc3NlcnQwKDApOworICAgICAgICB9CisKKyAgICAgICAgZHJhd19ybGluZShwaXhlbHMsIGxpbmVzaXplLCByeCwgcnksIGd4LCBneSwgdywgaCk7CisgICAgICAgIGRyYXdfcmxpbmUocGl4ZWxzLCBsaW5lc2l6ZSwgZ3gsIGd5LCBieCwgYnksIHcsIGgpOworICAgICAgICBkcmF3X3JsaW5lKHBpeGVscywgbGluZXNpemUsIGJ4LCBieSwgcngsIHJ5LCB3LCBoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCAgPSBpbmxpbmstPmRzdDsKKyAgICBDaWVzY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGludCBpID0gcy0+aW50ZW5zaXR5ICogNjU1MzU7CisgICAgaW50IHcgPSBvdXRsaW5rLT53OworICAgIGludCBoID0gb3V0bGluay0+aDsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IHJldCwgeCwgeTsKKworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBvdXQtPnB0cyA9IGluLT5wdHM7CisKKyAgICBpZiAoIXMtPmJhY2tncm91bmQpIHsKKyAgICAgICAgcmV0ID0gZHJhd19iYWNrZ3JvdW5kKGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBzLT5iYWNrZ3JvdW5kID0gMTsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgeSA8IG91dGxpbmstPmg7IHkrKykgeworICAgICAgICBtZW1zZXQob3V0LT5kYXRhWzBdICsgeSAqIG91dC0+bGluZXNpemVbMF0sIDAsIG91dGxpbmstPncgKiA4KTsKKyAgICB9CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaW4tPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBpbi0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgZG91YmxlIGN4LCBjeTsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3Q7CisgICAgICAgICAgICBpbnQgd3gsIHd5OworCisgICAgICAgICAgICBzLT5maWx0ZXIoY3R4LCBpbiwgJmN4LCAmY3ksIHgsIHkpOworCisgICAgICAgICAgICBpZiAocy0+Y2llID09IExVVikgeworICAgICAgICAgICAgICAgIGRvdWJsZSB1cCwgdnA7CisgICAgICAgICAgICAgICAgeHlfdG9fdXB2cChjeCwgY3ksICZ1cCwgJnZwKTsKKyAgICAgICAgICAgICAgICBjeCA9IHVwOworICAgICAgICAgICAgICAgIGN5ID0gdnA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMtPmNpZSA9PSBVQ1MpIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdSwgdjsKKyAgICAgICAgICAgICAgICB4eV90b191dihjeCwgY3ksICZ1LCAmdik7CisgICAgICAgICAgICAgICAgY3ggPSB1OworICAgICAgICAgICAgICAgIGN5ID0gdjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd3ggPSAodyAtIDEpICogY3g7CisgICAgICAgICAgICB3eSA9IChoIC0gMSkgLSAoKGggLSAxKSAqIGN5KTsKKworICAgICAgICAgICAgaWYgKHd4IDwgMCB8fCB3eCA+PSB3IHx8CisgICAgICAgICAgICAgICAgd3kgPCAwIHx8IHd5ID49IGgpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGRzdCA9ICh1aW50MTZfdCAqKShvdXQtPmRhdGFbMF0gKyB3eSAqIG91dC0+bGluZXNpemVbMF0gKyB3eCAqIDggKyAwKTsKKyAgICAgICAgICAgIGRzdFswXSA9IEZGTUlOKGRzdFswXSArIGksIDY1NTM1KTsKKyAgICAgICAgICAgIGRzdFsxXSA9IEZGTUlOKGRzdFsxXSArIGksIDY1NTM1KTsKKyAgICAgICAgICAgIGRzdFsyXSA9IEZGTUlOKGRzdFsyXSArIGksIDY1NTM1KTsKKyAgICAgICAgICAgIGRzdFszXSA9IDY1NTM1OworICAgICAgICB9CisgICAgfQorCisgICAgZm9yICh5ID0gMDsgeSA8IG91dGxpbmstPmg7IHkrKykgeworICAgICAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopKG91dC0+ZGF0YVswXSArIHkgKiBvdXQtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKShzLT5mLT5kYXRhWzBdICsgeSAqIHMtPmYtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dGxpbmstPnc7IHgrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHh4ID0geCAqIDQ7CisgICAgICAgICAgICBpZiAoZHN0W3h4ICsgM10gPT0gMCkgeworICAgICAgICAgICAgICAgIGRzdFt4eCArIDBdID0gc3JjW3h4ICsgMF07CisgICAgICAgICAgICAgICAgZHN0W3h4ICsgMV0gPSBzcmNbeHggKyAxXTsKKyAgICAgICAgICAgICAgICBkc3RbeHggKyAyXSA9IHNyY1t4eCArIDJdOworICAgICAgICAgICAgICAgIGRzdFt4eCArIDNdID0gc3JjW3h4ICsgM107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+c2hvd193aGl0ZSkKKyAgICAgICAgcGxvdF93aGl0ZV9wb2ludCgodWludDE2X3QgKilvdXQtPmRhdGFbMF0sIG91dC0+bGluZXNpemVbMF0gLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPncsIG91dGxpbmstPmgsIDY1NTM1LAorICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbG9yX3N5c3RlbSwgcy0+Y2llKTsKKworICAgIHBsb3RfZ2FtdXRzKCh1aW50MTZfdCAqKW91dC0+ZGF0YVswXSwgb3V0LT5saW5lc2l6ZVswXSAvIDIsCisgICAgICAgICAgICAgICAgb3V0bGluay0+dywgb3V0bGluay0+aCwKKyAgICAgICAgICAgICAgICBzLT5jaWUsIHMtPmdhbXV0cyk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgdm9pZCBhdl9jb2xkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDaWVzY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mKTsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQ2llc2NvcGVDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBnZXRfcmdiMnh5el9tYXRyaXgoY29sb3Jfc3lzdGVtc1tzLT5jb2xvcl9zeXN0ZW1dLCBzLT5tKTsKKyAgICBpbnZlcnRfbWF0cml4M3gzKHMtPm0sIHMtPmkpOworCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0IyNDoKKyAgICAgICAgcy0+ZmlsdGVyID0gZmlsdGVyX3JnYjI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICAgICAgcy0+ZmlsdGVyID0gZmlsdGVyX3JnYmE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0ODoKKyAgICAgICAgcy0+ZmlsdGVyID0gZmlsdGVyX3JnYjQ4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQTY0OgorICAgICAgICBzLT5maWx0ZXIgPSBmaWx0ZXJfcmdiYTY0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWFlaMTI6CisgICAgICAgIHMtPmZpbHRlciA9IGZpbHRlcl94eXo7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2NTUzNjsgaSsrKQorICAgICAgICAgICAgcy0+bG9nMmxpbltpXSA9IHBvdyhpIC8gNjU1MzUuLCBzLT5pZ2FtbWEpICogNjU1MzUuOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9jaWVzY29wZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJjaWVzY29wZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVmlkZW8gQ0lFIHNjb3BlLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKENpZXNjb3BlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmY2llc2NvcGVfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jb2RlY3ZpZXcuYyBiL2xpYmF2ZmlsdGVyL3ZmX2NvZGVjdmlldy5jCmluZGV4IGU3MGIzOTcuLjMzMWJmYmEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2NvZGVjdmlldy5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2NvZGVjdmlldy5jCkBAIC0zOCwyMiArMzgsNDAgQEAKICNkZWZpbmUgTVZfUF9GT1IgICgxPDwwKQogI2RlZmluZSBNVl9CX0ZPUiAgKDE8PDEpCiAjZGVmaW5lIE1WX0JfQkFDSyAoMTw8MikKKyNkZWZpbmUgTVZfVFlQRV9GT1IgICgxPDwwKQorI2RlZmluZSBNVl9UWVBFX0JBQ0sgKDE8PDEpCisjZGVmaW5lIEZSQU1FX1RZUEVfSSAoMTw8MCkKKyNkZWZpbmUgRlJBTUVfVFlQRV9QICgxPDwxKQorI2RlZmluZSBGUkFNRV9UWVBFX0IgKDE8PDIpCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IENvZGVjVmlld0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIHVuc2lnbmVkIG12OworICAgIHVuc2lnbmVkIGZyYW1lX3R5cGU7CisgICAgdW5zaWduZWQgbXZfdHlwZTsKICAgICBpbnQgaHN1YiwgdnN1YjsKICAgICBpbnQgcXA7CiB9IENvZGVjVmlld0NvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENvZGVjVmlld0NvbnRleHQsIHgpCiAjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorI2RlZmluZSBDT05TVChuYW1lLCBoZWxwLCB2YWwsIHVuaXQpIHsgbmFtZSwgaGVscCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PXZhbH0sIDAsIDAsIEZMQUdTLCB1bml0IH0KKwogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNvZGVjdmlld19vcHRpb25zW10gPSB7CiAgICAgeyAibXYiLCAic2V0IG1vdGlvbiB2ZWN0b3JzIHRvIHZpc3VhbGl6ZSIsIE9GRlNFVChtdiksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2ND0wfSwgMCwgSU5UX01BWCwgRkxBR1MsICJtdiIgfSwKLSAgICAgICAgeyJwZiIsICJmb3J3YXJkIHByZWRpY3RlZCBNVnMgb2YgUC1mcmFtZXMiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTVZfUF9GT1IgfSwgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibXYifSwKLSAgICAgICAgeyJiZiIsICJmb3J3YXJkIHByZWRpY3RlZCBNVnMgb2YgQi1mcmFtZXMiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTVZfQl9GT1IgfSwgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibXYifSwKLSAgICAgICAgeyJiYiIsICJiYWNrd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEItZnJhbWVzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gTVZfQl9CQUNLIH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibXYifSwKKyAgICAgICAgQ09OU1QoInBmIiwgImZvcndhcmQgcHJlZGljdGVkIE1WcyBvZiBQLWZyYW1lcyIsICBNVl9QX0ZPUiwgICJtdiIpLAorICAgICAgICBDT05TVCgiYmYiLCAiZm9yd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEItZnJhbWVzIiwgIE1WX0JfRk9SLCAgIm12IiksCisgICAgICAgIENPTlNUKCJiYiIsICJiYWNrd2FyZCBwcmVkaWN0ZWQgTVZzIG9mIEItZnJhbWVzIiwgTVZfQl9CQUNLLCAibXYiKSwKICAgICB7ICJxcCIsIE5VTEwsIE9GRlNFVChxcCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgIm12X3R5cGUiLCAic2V0IG1vdGlvbiB2ZWN0b3JzIHR5cGUiLCBPRkZTRVQobXZfdHlwZSksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2ND0wfSwgMCwgSU5UX01BWCwgRkxBR1MsICJtdl90eXBlIiB9LAorICAgIHsgIm12dCIsICAgICAic2V0IG1vdGlvbiB2ZWN0b3JzIHR5cGUiLCBPRkZTRVQobXZfdHlwZSksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2ND0wfSwgMCwgSU5UX01BWCwgRkxBR1MsICJtdl90eXBlIiB9LAorICAgICAgICBDT05TVCgiZnAiLCAiZm9yd2FyZCBwcmVkaWN0ZWQgTVZzIiwgIE1WX1RZUEVfRk9SLCAgIm12X3R5cGUiKSwKKyAgICAgICAgQ09OU1QoImJwIiwgImJhY2t3YXJkIHByZWRpY3RlZCBNVnMiLCBNVl9UWVBFX0JBQ0ssICJtdl90eXBlIiksCisgICAgeyAiZnJhbWVfdHlwZSIsICJzZXQgZnJhbWUgdHlwZXMgdG8gdmlzdWFsaXplIG1vdGlvbiB2ZWN0b3JzIG9mIiwgT0ZGU0VUKGZyYW1lX3R5cGUpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQ9MH0sIDAsIElOVF9NQVgsIEZMQUdTLCAiZnJhbWVfdHlwZSIgfSwKKyAgICB7ICJmdCIsICAgICAgICAgInNldCBmcmFtZSB0eXBlcyB0byB2aXN1YWxpemUgbW90aW9uIHZlY3RvcnMgb2YiLCBPRkZTRVQoZnJhbWVfdHlwZSksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2ND0wfSwgMCwgSU5UX01BWCwgRkxBR1MsICJmcmFtZV90eXBlIiB9LAorICAgICAgICBDT05TVCgiaWYiLCAiSS1mcmFtZXMiLCBGUkFNRV9UWVBFX0ksICJmcmFtZV90eXBlIiksCisgICAgICAgIENPTlNUKCJwZiIsICJQLWZyYW1lcyIsIEZSQU1FX1RZUEVfUCwgImZyYW1lX3R5cGUiKSwKKyAgICAgICAgQ09OU1QoImJmIiwgIkItZnJhbWVzIiwgRlJBTUVfVFlQRV9CLCAiZnJhbWVfdHlwZSIpLAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC0yMjQsMjAgKzI0MiwzNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHMtPm12KSB7CisgICAgaWYgKHMtPm12IHx8IHMtPm12X3R5cGUpIHsKICAgICAgICAgQVZGcmFtZVNpZGVEYXRhICpzZCA9IGF2X2ZyYW1lX2dldF9zaWRlX2RhdGEoZnJhbWUsIEFWX0ZSQU1FX0RBVEFfTU9USU9OX1ZFQ1RPUlMpOwogICAgICAgICBpZiAoc2QpIHsKICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgY29uc3QgQVZNb3Rpb25WZWN0b3IgKm12cyA9IChjb25zdCBBVk1vdGlvblZlY3RvciAqKXNkLT5kYXRhOworICAgICAgICAgICAgY29uc3QgaW50IGlzX2lmcmFtZSA9IChzLT5mcmFtZV90eXBlICYgRlJBTUVfVFlQRV9JKSAmJiBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgICAgICAgICAgY29uc3QgaW50IGlzX3BmcmFtZSA9IChzLT5mcmFtZV90eXBlICYgRlJBTUVfVFlQRV9QKSAmJiBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QOworICAgICAgICAgICAgY29uc3QgaW50IGlzX2JmcmFtZSA9IChzLT5mcmFtZV90eXBlICYgRlJBTUVfVFlQRV9CKSAmJiBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9COworCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2QtPnNpemUgLyBzaXplb2YoKm12cyk7IGkrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IEFWTW90aW9uVmVjdG9yICptdiA9ICZtdnNbaV07CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IGRpcmVjdGlvbiA9IG12LT5zb3VyY2UgPiAwOwotICAgICAgICAgICAgICAgIGlmICgoZGlyZWN0aW9uID09IDAgJiYgKHMtPm12ICYgTVZfUF9GT1IpICAmJiBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB8fAotICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09IDAgJiYgKHMtPm12ICYgTVZfQl9GT1IpICAmJiBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB8fAotICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09IDEgJiYgKHMtPm12ICYgTVZfQl9CQUNLKSAmJiBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSkKLSAgICAgICAgICAgICAgICAgICAgZHJhd19hcnJvdyhmcmFtZS0+ZGF0YVswXSwgbXYtPmRzdF94LCBtdi0+ZHN0X3ksIG12LT5zcmNfeCwgbXYtPnNyY195LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgZnJhbWUtPmxpbmVzaXplWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMCwgMCwgbXYtPnNvdXJjZSA+IDApOworCisgICAgICAgICAgICAgICAgaWYgKHMtPm12X3R5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGlzX2ZwID0gZGlyZWN0aW9uID09IDAgJiYgKHMtPm12X3R5cGUgJiBNVl9UWVBFX0ZPUik7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpc19icCA9IGRpcmVjdGlvbiA9PSAxICYmIChzLT5tdl90eXBlICYgTVZfVFlQRV9CQUNLKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKCFzLT5mcmFtZV90eXBlICYmIChpc19mcCB8fCBpc19icCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpc19pZnJhbWUgJiYgaXNfZnAgfHwgaXNfaWZyYW1lICYmIGlzX2JwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBpc19wZnJhbWUgJiYgaXNfZnAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2JmcmFtZSAmJiBpc19mcCB8fCBpc19iZnJhbWUgJiYgaXNfYnApCisgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2Fycm93KGZyYW1lLT5kYXRhWzBdLCBtdi0+ZHN0X3gsIG12LT5kc3RfeSwgbXYtPnNyY194LCBtdi0+c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIDAsIGRpcmVjdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5tdikKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkaXJlY3Rpb24gPT0gMCAmJiAocy0+bXYgJiBNVl9QX0ZPUikgICYmIGZyYW1lLT5waWN0X3R5cGUgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aW9uID09IDAgJiYgKHMtPm12ICYgTVZfQl9GT1IpICAmJiBmcmFtZS0+cGljdF90eXBlID09IEFWX1BJQ1RVUkVfVFlQRV9CKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGlvbiA9PSAxICYmIChzLT5tdiAmIE1WX0JfQkFDSykgJiYgZnJhbWUtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQikpCisgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2Fycm93KGZyYW1lLT5kYXRhWzBdLCBtdi0+ZHN0X3gsIG12LT5kc3RfeSwgbXYtPnNyY194LCBtdi0+c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwgZnJhbWUtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIDAsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jb2xvcmJhbGFuY2UuYyBiL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yYmFsYW5jZS5jCmluZGV4IGUzN2YxOTkuLmY5OTY1MjQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yYmFsYW5jZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yYmFsYW5jZS5jCkBAIC0zMSwxMyArMzEsMTMgQEAKICNkZWZpbmUgQiAyCiAjZGVmaW5lIEEgMwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBSYW5nZSB7CiAgICAgZG91YmxlIHNoYWRvd3M7CiAgICAgZG91YmxlIG1pZHRvbmVzOwogICAgIGRvdWJsZSBoaWdobGlnaHRzOwogfSBSYW5nZTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQ29sb3JCYWxhbmNlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgUmFuZ2UgY3lhbl9yZWQ7CiAgICAgUmFuZ2UgbWFnZW50YV9ncmVlbjsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yY2hhbm5lbG1peGVyLmMgYi9saWJhdmZpbHRlci92Zl9jb2xvcmNoYW5uZWxtaXhlci5jCmluZGV4IGNkYTk3MmQuLjJlMDY4ZmEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yY2hhbm5lbG1peGVyLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfY29sb3JjaGFubmVsbWl4ZXIuYwpAQCAtMzAsNyArMzAsNyBAQAogI2RlZmluZSBCIDIKICNkZWZpbmUgQSAzCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IENvbG9yQ2hhbm5lbE1peGVyQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgZG91YmxlIHJyLCByZywgcmIsIHJhOwogICAgIGRvdWJsZSBnciwgZ2csIGdiLCBnYTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2NvbG9ya2V5LmMgYi9saWJhdmZpbHRlci92Zl9jb2xvcmtleS5jCmluZGV4IDJmNjcwZDkuLjNkNjVlNTkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2NvbG9ya2V5LmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfY29sb3JrZXkuYwpAQCAtODUsNyArODUsNyBAQAogICAgIGlmIChyZXMgPSBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKGZyYW1lKSkKICAgICAgICAgcmV0dXJuIHJlczsKIAotICAgIGlmIChyZXMgPSBhdmN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoYXZjdHgsIGRvX2NvbG9ya2V5X3NsaWNlLCBmcmFtZSwgTlVMTCwgRkZNSU4oZnJhbWUtPmhlaWdodCwgYXZjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSkpCisgICAgaWYgKHJlcyA9IGF2Y3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShhdmN0eCwgZG9fY29sb3JrZXlfc2xpY2UsIGZyYW1lLCBOVUxMLCBGRk1JTihmcmFtZS0+aGVpZ2h0LCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoYXZjdHgpKSkpCiAgICAgICAgIHJldHVybiByZXM7CiAKICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGF2Y3R4LT5vdXRwdXRzWzBdLCBmcmFtZSk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jb2xvcmxldmVscy5jIGIvbGliYXZmaWx0ZXIvdmZfY29sb3JsZXZlbHMuYwppbmRleCBkZWRiZTMwLi41Mzg1YTVlIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9jb2xvcmxldmVscy5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2NvbG9ybGV2ZWxzLmMKQEAgLTMyLDEyICszMiwxMiBAQAogI2RlZmluZSBCIDIKICNkZWZpbmUgQSAzCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFJhbmdlIHsKICAgICBkb3VibGUgaW5fbWluLCBpbl9tYXg7CiAgICAgZG91YmxlIG91dF9taW4sIG91dF9tYXg7CiB9IFJhbmdlOwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBDb2xvckxldmVsc0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIFJhbmdlIHJhbmdlWzRdOwogICAgIGludCBuYl9jb21wOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfY29sb3JtYXRyaXguYyBiL2xpYmF2ZmlsdGVyL3ZmX2NvbG9ybWF0cml4LmMKaW5kZXggNGE1N2ZlMC4uM2EwMmUyYiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfY29sb3JtYXRyaXguYworKysgYi9saWJhdmZpbHRlci92Zl9jb2xvcm1hdHJpeC5jCkBAIC00MCwxOSArNDAsMTIgQEAKICNkZWZpbmUgTlMobikgKChuKSA8IDAgPyAoaW50KSgobikqNjU1MzYuMC0wLjUrREJMX0VQU0lMT04pIDogKGludCkoKG4pKjY1NTM2LjArMC41KSkKICNkZWZpbmUgQ0IobikgYXZfY2xpcF91aW50OChuKQogCi1zdGF0aWMgY29uc3QgZG91YmxlIHl1dl9jb2VmZls0XVszXVszXSA9IHsKLSAgICB7IHsgKzAuNzE1MiwgKzAuMDcyMiwgKzAuMjEyNiB9LCAvLyBSZWMuNzA5ICgwKQotICAgICAgeyAtMC4zODUwLCArMC41MDAwLCAtMC4xMTUwIH0sCi0gICAgICB7IC0wLjQ1NDAsIC0wLjA0NjAsICswLjUwMDAgfSB9LAotICAgIHsgeyArMC41OTAwLCArMC4xMTAwLCArMC4zMDAwIH0sIC8vIEZDQyAoMSkKLSAgICAgIHsgLTAuMzMxMCwgKzAuNTAwMCwgLTAuMTY5MCB9LAotICAgICAgeyAtMC40MjEwLCAtMC4wNzkwLCArMC41MDAwIH0gfSwKLSAgICB7IHsgKzAuNTg3MCwgKzAuMTE0MCwgKzAuMjk5MCB9LCAvLyBSZWMuNjAxIChJVFUtUiBCVC40NzAtMi9TTVBURSAxNzBNKSAoMikKLSAgICAgIHsgLTAuMzMxMywgKzAuNTAwMCwgLTAuMTY4NyB9LAotICAgICAgeyAtMC40MTg3LCAtMC4wODEzLCArMC41MDAwIH0gfSwKLSAgICB7IHsgKzAuNzAxMCwgKzAuMDg3MCwgKzAuMjEyMCB9LCAvLyBTTVBURSAyNDBNICgzKQotICAgICAgeyAtMC4zODQwLCArMC41MDAwLCAtMC4xMTYwIH0sCi0gICAgICB7IC0wLjQ0NTAsIC0wLjA1NTAsICswLjUwMDAgfSB9LAorc3RhdGljIGNvbnN0IGRvdWJsZSB5dXZfY29lZmZfbHVtYVs1XVszXSA9IHsKKyAgICB7ICswLjcxNTIsICswLjA3MjIsICswLjIxMjYgfSwgLy8gUmVjLjcwOSAoMCkKKyAgICB7ICswLjU5MDAsICswLjExMDAsICswLjMwMDAgfSwgLy8gRkNDICgxKQorICAgIHsgKzAuNTg3MCwgKzAuMTE0MCwgKzAuMjk5MCB9LCAvLyBSZWMuNjAxIChJVFUtUiBCVC40NzAtMi9TTVBURSAxNzBNKSAoMikKKyAgICB7ICswLjcwMTAsICswLjA4NzAsICswLjIxMjAgfSwgLy8gU01QVEUgMjQwTSAoMykKKyAgICB7ICswLjY3ODAsICswLjA1OTMsICswLjI2MjcgfSwgLy8gUmVjLjIwMjAgKDQpCiB9OwogCiBlbnVtIENvbG9yTW9kZSB7CkBAIC02MSwxMiArNTQsMTMgQEAKICAgICBDT0xPUl9NT0RFX0ZDQywKICAgICBDT0xPUl9NT0RFX0JUNjAxLAogICAgIENPTE9SX01PREVfU01QVEUyNDBNLAorICAgIENPTE9SX01PREVfQlQyMDIwLAogICAgIENPTE9SX01PREVfQ09VTlQKIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IENvbG9yTWF0cml4Q29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Ci0gICAgaW50IHl1dl9jb252ZXJ0WzE2XVszXVszXTsKKyAgICBpbnQgeXV2X2NvbnZlcnRbMjVdWzNdWzNdOwogICAgIGludCBpbnRlcmxhY2VkOwogICAgIGludCBzb3VyY2UsIGRlc3Q7ICAgICAgICAvLy88IENvbG9yTW9kZQogICAgIGludCBtb2RlOwpAQCAtOTcsNiArOTEsNyBAQAogICAgIHsgImJ0NDcwYmciLCAgICJzZXQgQlQuNDcwIGNvbG9yc3BhY2UiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DT0xPUl9NT0RFX0JUNjAxfSwgICAgICAgLmZsYWdzPUZMQUdTLCAudW5pdD0iY29sb3JfbW9kZSIgfSwKICAgICB7ICJzbXB0ZTE3MG0iLCAic2V0IFNNVFBFLTE3ME0gY29sb3JzcGFjZSIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q09MT1JfTU9ERV9CVDYwMX0sICAgICAgIC5mbGFncz1GTEFHUywgLnVuaXQ9ImNvbG9yX21vZGUiIH0sCiAgICAgeyAic21wdGUyNDBtIiwgInNldCBTTVBURS0yNDBNIGNvbG9yc3BhY2UiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTE9SX01PREVfU01QVEUyNDBNfSwgICAuZmxhZ3M9RkxBR1MsIC51bml0PSJjb2xvcl9tb2RlIiB9LAorICAgIHsgImJ0MjAyMCIsICAgICJzZXQgQlQuMjAyMCBjb2xvcnNwYWNlIiwgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DT0xPUl9NT0RFX0JUMjAyMH0sICAgICAgLmZsYWdzPUZMQUdTLCAudW5pdD0iY29sb3JfbW9kZSIgfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtMTIyLDcgKzExNyw3IEBACiAjZGVmaW5lIGltaCBpbVsyXVsxXQogI2RlZmluZSBpbWkgaW1bMl1bMl0KIAotc3RhdGljIHZvaWQgaW52ZXJzZTN4Myhkb3VibGUgaW1bM11bM10sIGNvbnN0IGRvdWJsZSBtWzNdWzNdKQorc3RhdGljIHZvaWQgaW52ZXJzZTN4Myhkb3VibGUgaW1bM11bM10sIGRvdWJsZSBtWzNdWzNdKQogewogICAgIGRvdWJsZSBkZXQgPSBtYSAqIChtZSAqIG1pIC0gbWYgKiBtaCkgLSBtYiAqIChtZCAqIG1pIC0gbWYgKiBtZykgKyBtYyAqIChtZCAqIG1oIC0gbWUgKiBtZyk7CiAgICAgZGV0ID0gMS4wIC8gZGV0OwpAQCAtMTM3LDcgKzEzMiw3IEBACiAgICAgaW1pID0gZGV0ICogKG1hICogbWUgLSBtYiAqIG1kKTsKIH0KIAotc3RhdGljIHZvaWQgc29sdmVfY29lZmZpY2llbnRzKGRvdWJsZSBjbVszXVszXSwgZG91YmxlIHJnYlszXVszXSwgY29uc3QgZG91YmxlIHl1dlszXVszXSkKK3N0YXRpYyB2b2lkIHNvbHZlX2NvZWZmaWNpZW50cyhkb3VibGUgY21bM11bM10sIGRvdWJsZSByZ2JbM11bM10sIGRvdWJsZSB5dXZbM11bM10pCiB7CiAgICAgaW50IGksIGo7CiAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKQEAgLTE0OCwxNSArMTQzLDI5IEBACiBzdGF0aWMgdm9pZCBjYWxjX2NvZWZmaWNpZW50cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBDb2xvck1hdHJpeENvbnRleHQgKmNvbG9yID0gY3R4LT5wcml2OwotICAgIGRvdWJsZSByZ2JfY29lZmZkWzRdWzNdWzNdOwotICAgIGRvdWJsZSB5dXZfY29udmVydGRbMTZdWzNdWzNdOworICAgIGRvdWJsZSB5dXZfY29lZmZbNV1bM11bM107CisgICAgZG91YmxlIHJnYl9jb2VmZmRbNV1bM11bM107CisgICAgZG91YmxlIHl1dl9jb252ZXJ0ZFsyNV1bM11bM107CisgICAgZG91YmxlIGJzY2FsZSwgcnNjYWxlOwogICAgIGludCB2ID0gMDsKICAgICBpbnQgaSwgaiwgazsKLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICB5dXZfY29lZmZbaV1bMF1bMF0gPSB5dXZfY29lZmZfbHVtYVtpXVswXTsKKyAgICAgICAgeXV2X2NvZWZmW2ldWzBdWzFdID0geXV2X2NvZWZmX2x1bWFbaV1bMV07CisgICAgICAgIHl1dl9jb2VmZltpXVswXVsyXSA9IHl1dl9jb2VmZl9sdW1hW2ldWzJdOworICAgICAgICBic2NhbGUgPSAwLjUgLyAoeXV2X2NvZWZmW2ldWzBdWzFdIC0gMS4wKTsKKyAgICAgICAgcnNjYWxlID0gMC41IC8gKHl1dl9jb2VmZltpXVswXVsyXSAtIDEuMCk7CisgICAgICAgIHl1dl9jb2VmZltpXVsxXVswXSA9IGJzY2FsZSAqIHl1dl9jb2VmZltpXVswXVswXTsKKyAgICAgICAgeXV2X2NvZWZmW2ldWzFdWzFdID0gMC41OworICAgICAgICB5dXZfY29lZmZbaV1bMV1bMl0gPSBic2NhbGUgKiB5dXZfY29lZmZbaV1bMF1bMl07CisgICAgICAgIHl1dl9jb2VmZltpXVsyXVswXSA9IHJzY2FsZSAqIHl1dl9jb2VmZltpXVswXVswXTsKKyAgICAgICAgeXV2X2NvZWZmW2ldWzJdWzFdID0gcnNjYWxlICogeXV2X2NvZWZmW2ldWzBdWzFdOworICAgICAgICB5dXZfY29lZmZbaV1bMl1bMl0gPSAwLjU7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspCiAgICAgICAgIGludmVyc2UzeDMocmdiX2NvZWZmZFtpXSwgeXV2X2NvZWZmW2ldKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCA0OyBqKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKICAgICAgICAgICAgIHNvbHZlX2NvZWZmaWNpZW50cyh5dXZfY29udmVydGRbdl0sIHJnYl9jb2VmZmRbaV0sIHl1dl9jb2VmZltqXSk7CiAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7CiAgICAgICAgICAgICAgICAgY29sb3ItPnl1dl9jb252ZXJ0W3ZdW2tdWzBdID0gTlMoeXV2X2NvbnZlcnRkW3ZdW2tdWzBdKTsKQEAgLTE3Miw3ICsxODEsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2xvcl9tb2Rlc1tdID0geyJidDcwOSIsICJmY2MiLCAiYnQ2MDEiLCAic21wdGUyNDBtIn07CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbG9yX21vZGVzW10gPSB7ImJ0NzA5IiwgImZjYyIsICJidDYwMSIsICJzbXB0ZTI0MG0iLCAiYnQyMDIwIn07CiAKIHN0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewpAQCAtNDI2LDcgKzQzNSw3IEBACiAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKIAogICAgIGlmIChjb2xvci0+c291cmNlID09IENPTE9SX01PREVfTk9ORSkgewotICAgICAgICBlbnVtIEFWQ29sb3JTcGFjZSBjcyA9IGF2X2ZyYW1lX2dldF9jb2xvcnNwYWNlKGluKTsKKyAgICAgICAgZW51bSBBVkNvbG9yU3BhY2UgY3MgPSBpbi0+Y29sb3JzcGFjZTsKICAgICAgICAgZW51bSBDb2xvck1vZGUgc291cmNlOwogCiAgICAgICAgIHN3aXRjaChjcykgewpAQCAtNDM1LDIwICs0NDQsMjMgQEAKICAgICAgICAgY2FzZSBBVkNPTF9TUENfU01QVEUyNDBNIDogc291cmNlID0gQ09MT1JfTU9ERV9TTVBURTI0ME0gOyBicmVhazsKICAgICAgICAgY2FzZSBBVkNPTF9TUENfQlQ0NzBCRyAgIDogc291cmNlID0gQ09MT1JfTU9ERV9CVDYwMSAgICAgOyBicmVhazsKICAgICAgICAgY2FzZSBBVkNPTF9TUENfU01QVEUxNzBNIDogc291cmNlID0gQ09MT1JfTU9ERV9CVDYwMSAgICAgOyBicmVhazsKKyAgICAgICAgY2FzZSBBVkNPTF9TUENfQlQyMDIwX05DTDogc291cmNlID0gQ09MT1JfTU9ERV9CVDIwMjAgICAgOyBicmVhazsKKyAgICAgICAgY2FzZSBBVkNPTF9TUENfQlQyMDIwX0NMIDogc291cmNlID0gQ09MT1JfTU9ERV9CVDIwMjAgICAgOyBicmVhazsKICAgICAgICAgZGVmYXVsdCA6CiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dCBmcmFtZSBkb2VzIG5vdCBzcGVjaWZ5IGEgc3VwcG9ydGVkIGNvbG9yc3BhY2UsIGFuZCBub25lIGhhcyBiZWVuIHNwZWNpZmllZCBhcyBzb3VyY2UgZWl0aGVyXG4iKTsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9Ci0gICAgICAgIGNvbG9yLT5tb2RlID0gc291cmNlICogNCArIGNvbG9yLT5kZXN0OworICAgICAgICBjb2xvci0+bW9kZSA9IHNvdXJjZSAqIDUgKyBjb2xvci0+ZGVzdDsKICAgICB9IGVsc2UKLSAgICAgICAgY29sb3ItPm1vZGUgPSBjb2xvci0+c291cmNlICogNCArIGNvbG9yLT5kZXN0OworICAgICAgICBjb2xvci0+bW9kZSA9IGNvbG9yLT5zb3VyY2UgKiA1ICsgY29sb3ItPmRlc3Q7CiAKICAgICBzd2l0Y2goY29sb3ItPmRlc3QpIHsKLSAgICBjYXNlIENPTE9SX01PREVfQlQ3MDkgICAgOiBhdl9mcmFtZV9zZXRfY29sb3JzcGFjZShvdXQsIEFWQ09MX1NQQ19CVDcwOSkgICAgOyBicmVhazsKLSAgICBjYXNlIENPTE9SX01PREVfRkNDICAgICAgOiBhdl9mcmFtZV9zZXRfY29sb3JzcGFjZShvdXQsIEFWQ09MX1NQQ19GQ0MpICAgICAgOyBicmVhazsKLSAgICBjYXNlIENPTE9SX01PREVfU01QVEUyNDBNOiBhdl9mcmFtZV9zZXRfY29sb3JzcGFjZShvdXQsIEFWQ09MX1NQQ19TTVBURTI0ME0pOyBicmVhazsKLSAgICBjYXNlIENPTE9SX01PREVfQlQ2MDEgICAgOiBhdl9mcmFtZV9zZXRfY29sb3JzcGFjZShvdXQsIEFWQ09MX1NQQ19CVDQ3MEJHKSAgOyBicmVhazsKKyAgICBjYXNlIENPTE9SX01PREVfQlQ3MDkgICAgOiBvdXQtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDkgICAgIDsgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9NT0RFX0ZDQyAgICAgIDogb3V0LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0ZDQyAgICAgICA7IGJyZWFrOworICAgIGNhc2UgQ09MT1JfTU9ERV9TTVBURTI0ME06IG91dC0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19TTVBURTI0ME0gOyBicmVhazsKKyAgICBjYXNlIENPTE9SX01PREVfQlQ2MDEgICAgOiBvdXQtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ0NzBCRyAgIDsgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9NT0RFX0JUMjAyMCAgIDogb3V0LT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUMjAyMF9OQ0w7IGJyZWFrOwogICAgIH0KIAogICAgIHRkLnNyYyA9IGluOwpAQCAtNDYyLDE2ICs0NzQsMTYgQEAKIAogICAgIGlmIChpbi0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDQ0UCkKICAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHByb2Nlc3Nfc2xpY2VfeXV2NDQ0cCwgJnRkLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGluLT5oZWlnaHQsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihpbi0+aGVpZ2h0LCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOwogICAgIGVsc2UgaWYgKGluLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQKQogICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgcHJvY2Vzc19zbGljZV95dXY0MjJwLCAmdGQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oaW4tPmhlaWdodCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGluLT5oZWlnaHQsIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAgICAgZWxzZSBpZiAoaW4tPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApCiAgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBwcm9jZXNzX3NsaWNlX3l1djQyMHAsICZ0ZCwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihpbi0+aGVpZ2h0IC8gMiwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGluLT5oZWlnaHQgLyAyLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOwogICAgIGVsc2UKICAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHByb2Nlc3Nfc2xpY2VfdXl2eTQyMiwgJnRkLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGluLT5oZWlnaHQsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihpbi0+aGVpZ2h0LCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOwogCiAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yc3BhY2UuYyBiL2xpYmF2ZmlsdGVyL3ZmX2NvbG9yc3BhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWVhMDhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfY29sb3JzcGFjZS5jCkBAIC0wLDAgKzEsMTIxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qCisgKiBAZmlsZQorICogQ29udmVydCBiZXR3ZWVuIGNvbG9yc3BhY2VzLgorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4Zm10LmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImNvbG9yc3BhY2Vkc3AuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitlbnVtIERpdGhlck1vZGUgeworICAgIERJVEhFUl9OT05FLAorICAgIERJVEhFUl9GU0IsCisgICAgRElUSEVSX05CLAorfTsKKworZW51bSBDb2xvcnNwYWNlIHsKKyAgICBDU19VTlNQRUNJRklFRCwKKyAgICBDU19CVDQ3ME0sCisgICAgQ1NfQlQ0NzBCRywKKyAgICBDU19CVDYwMV82XzUyNSwKKyAgICBDU19CVDYwMV82XzYyNSwKKyAgICBDU19CVDcwOSwKKyAgICBDU19TTVBURTE3ME0sCisgICAgQ1NfU01QVEUyNDBNLAorICAgIENTX0JUMjAyMCwKKyAgICBDU19OQiwKK307CisKK2VudW0gV2hpdGVwb2ludCB7CisgICAgV1BfRDY1LAorICAgIFdQX0MsCisgICAgV1BfRENJLAorICAgIFdQX0UsCisgICAgV1BfTkIsCit9OworCitlbnVtIFdoaXRlcG9pbnRBZGFwdGF0aW9uIHsKKyAgICBXUF9BREFQVF9CUkFERk9SRCwKKyAgICBXUF9BREFQVF9WT05fS1JJRVMsCisgICAgTkJfV1BfQURBUFRfTk9OX0lERU5USVRZLAorICAgIFdQX0FEQVBUX0lERU5USVRZID0gTkJfV1BfQURBUFRfTk9OX0lERU5USVRZLAorICAgIE5CX1dQX0FEQVBULAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgZGVmYXVsdF90cmNbQ1NfTkIgKyAxXSA9IHsKKyAgICBbQ1NfVU5TUEVDSUZJRURdID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVELAorICAgIFtDU19CVDQ3ME1dICAgICAgPSBBVkNPTF9UUkNfR0FNTUEyMiwKKyAgICBbQ1NfQlQ0NzBCR10gICAgID0gQVZDT0xfVFJDX0dBTU1BMjgsCisgICAgW0NTX0JUNjAxXzZfNTI1XSA9IEFWQ09MX1RSQ19TTVBURTE3ME0sCisgICAgW0NTX0JUNjAxXzZfNjI1XSA9IEFWQ09MX1RSQ19TTVBURTE3ME0sCisgICAgW0NTX0JUNzA5XSAgICAgICA9IEFWQ09MX1RSQ19CVDcwOSwKKyAgICBbQ1NfU01QVEUxNzBNXSAgID0gQVZDT0xfVFJDX1NNUFRFMTcwTSwKKyAgICBbQ1NfU01QVEUyNDBNXSAgID0gQVZDT0xfVFJDX1NNUFRFMjQwTSwKKyAgICBbQ1NfQlQyMDIwXSAgICAgID0gQVZDT0xfVFJDX0JUMjAyMF8xMCwKKyAgICBbQ1NfTkJdICAgICAgICAgID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVELAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZDb2xvclByaW1hcmllcyBkZWZhdWx0X3BybVtDU19OQiArIDFdID0geworICAgIFtDU19VTlNQRUNJRklFRF0gPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQsCisgICAgW0NTX0JUNDcwTV0gICAgICA9IEFWQ09MX1BSSV9CVDQ3ME0sCisgICAgW0NTX0JUNDcwQkddICAgICA9IEFWQ09MX1BSSV9CVDQ3MEJHLAorICAgIFtDU19CVDYwMV82XzUyNV0gPSBBVkNPTF9QUklfU01QVEUxNzBNLAorICAgIFtDU19CVDYwMV82XzYyNV0gPSBBVkNPTF9QUklfQlQ0NzBCRywKKyAgICBbQ1NfQlQ3MDldICAgICAgID0gQVZDT0xfUFJJX0JUNzA5LAorICAgIFtDU19TTVBURTE3ME1dICAgPSBBVkNPTF9QUklfU01QVEUxNzBNLAorICAgIFtDU19TTVBURTI0ME1dICAgPSBBVkNPTF9QUklfU01QVEUyNDBNLAorICAgIFtDU19CVDIwMjBdICAgICAgPSBBVkNPTF9QUklfQlQyMDIwLAorICAgIFtDU19OQl0gICAgICAgICAgPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQsCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVkNvbG9yU3BhY2UgZGVmYXVsdF9jc3BbQ1NfTkIgKyAxXSA9IHsKKyAgICBbQ1NfVU5TUEVDSUZJRURdID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVELAorICAgIFtDU19CVDQ3ME1dICAgICAgPSBBVkNPTF9TUENfU01QVEUxNzBNLAorICAgIFtDU19CVDQ3MEJHXSAgICAgPSBBVkNPTF9TUENfQlQ0NzBCRywKKyAgICBbQ1NfQlQ2MDFfNl81MjVdID0gQVZDT0xfU1BDX1NNUFRFMTcwTSwKKyAgICBbQ1NfQlQ2MDFfNl82MjVdID0gQVZDT0xfU1BDX0JUNDcwQkcsCisgICAgW0NTX0JUNzA5XSAgICAgICA9IEFWQ09MX1NQQ19CVDcwOSwKKyAgICBbQ1NfU01QVEUxNzBNXSAgID0gQVZDT0xfU1BDX1NNUFRFMTcwTSwKKyAgICBbQ1NfU01QVEUyNDBNXSAgID0gQVZDT0xfU1BDX1NNUFRFMjQwTSwKKyAgICBbQ1NfQlQyMDIwXSAgICAgID0gQVZDT0xfU1BDX0JUMjAyMF9OQ0wsCisgICAgW0NTX05CXSAgICAgICAgICA9IEFWQ09MX1NQQ19VTlNQRUNJRklFRCwKK307CisKK3N0cnVjdCBDb2xvclByaW1hcmllcyB7CisgICAgZW51bSBXaGl0ZXBvaW50IHdwOworICAgIGRvdWJsZSB4ciwgeXIsIHhnLCB5ZywgeGIsIHliOworfTsKKworc3RydWN0IFRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzIHsKKyAgICBkb3VibGUgYWxwaGEsIGJldGEsIGdhbW1hLCBkZWx0YTsKK307CisKK3N0cnVjdCBMdW1hQ29lZmZpY2llbnRzIHsKKyAgICBkb3VibGUgY3IsIGNnLCBjYjsKK307CisKK3N0cnVjdCBXaGl0ZXBvaW50Q29lZmZpY2llbnRzIHsKKyAgICBkb3VibGUgeHcsIHl3OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgQ29sb3JTcGFjZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQ29sb3JTcGFjZURTUENvbnRleHQgZHNwOworCisgICAgZW51bSBDb2xvcnNwYWNlIHVzZXJfYWxsLCB1c2VyX2lhbGw7CisgICAgZW51bSBBVkNvbG9yU3BhY2UgaW5fY3NwLCBvdXRfY3NwLCB1c2VyX2NzcCwgdXNlcl9pY3NwOworICAgIGVudW0gQVZDb2xvclJhbmdlIGluX3JuZywgb3V0X3JuZywgdXNlcl9ybmcsIHVzZXJfaXJuZzsKKyAgICBlbnVtIEFWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljIGluX3RyYywgb3V0X3RyYywgdXNlcl90cmMsIHVzZXJfaXRyYzsKKyAgICBlbnVtIEFWQ29sb3JQcmltYXJpZXMgaW5fcHJtLCBvdXRfcHJtLCB1c2VyX3BybSwgdXNlcl9pcHJtOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBpbl9mb3JtYXQsIHVzZXJfZm9ybWF0OworICAgIGludCBmYXN0X21vZGU7CisgICAgZW51bSBEaXRoZXJNb2RlIGRpdGhlcjsKKyAgICBlbnVtIFdoaXRlcG9pbnRBZGFwdGF0aW9uIHdwX2FkYXB0OworCisgICAgaW50MTZfdCAqcmdiWzNdOworICAgIHB0cmRpZmZfdCByZ2Jfc3RyaWRlOworICAgIHVuc2lnbmVkIHJnYl9zejsKKyAgICBpbnQgKmRpdGhlcl9zY3JhdGNoWzNdWzJdLCAqZGl0aGVyX3NjcmF0Y2hfYmFzZVszXVsyXTsKKworICAgIGNvbnN0IHN0cnVjdCBDb2xvclByaW1hcmllcyAqaW5fcHJpbWFyaWVzLCAqb3V0X3ByaW1hcmllczsKKyAgICBpbnQgbHJnYjJscmdiX3Bhc3N0aHJvdWdoOworICAgIERFQ0xBUkVfQUxJR05FRCgxNiwgaW50MTZfdCwgbHJnYjJscmdiX2NvZWZmcylbM11bM11bOF07CisKKyAgICBjb25zdCBzdHJ1Y3QgVHJhbnNmZXJDaGFyYWN0ZXJpc3RpY3MgKmluX3R4Y2hyLCAqb3V0X3R4Y2hyOworICAgIGludCByZ2IycmdiX3Bhc3N0aHJvdWdoOworICAgIGludDE2X3QgKmxpbl9sdXQsICpkZWxpbl9sdXQ7CisKKyAgICBjb25zdCBzdHJ1Y3QgTHVtYUNvZWZmaWNpZW50cyAqaW5fbHVtYWNvZWYsICpvdXRfbHVtYWNvZWY7CisgICAgaW50IHl1djJ5dXZfcGFzc3Rocm91Z2gsIHl1djJ5dXZfZmFzdG1vZGU7CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCB5dXYycmdiX2NvZWZmcylbM11bM11bOF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCByZ2IyeXV2X2NvZWZmcylbM11bM11bOF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCB5dXYyeXV2X2NvZWZmcylbM11bM11bOF07CisgICAgREVDTEFSRV9BTElHTkVEKDE2LCBpbnQxNl90LCB5dXZfb2Zmc2V0KVsyIC8qIGluLCBvdXQgKi9dWzhdOworICAgIHl1djJyZ2JfZm4geXV2MnJnYjsKKyAgICByZ2IyeXV2X2ZuIHJnYjJ5dXY7CisgICAgcmdiMnl1dl9mc2JfZm4gcmdiMnl1dl9mc2I7CisgICAgeXV2Mnl1dl9mbiB5dXYyeXV2OworICAgIGRvdWJsZSB5dXYycmdiX2RibF9jb2VmZnNbM11bM10sIHJnYjJ5dXZfZGJsX2NvZWZmc1szXVszXTsKKyAgICBpbnQgaW5feV9ybmcsIGluX3V2X3JuZywgb3V0X3lfcm5nLCBvdXRfdXZfcm5nOworCisgICAgaW50IGRpZF93YXJuX3JhbmdlOworfSBDb2xvclNwYWNlQ29udGV4dDsKKworLy8gRklYTUUgZGVhbCB3aXRoIG9kZCB3aWR0aC9oZWlnaHRzCisvLyBGSVhNRSBmYXN0ZXIgbGluZWFyaXplL2RlbGluZWFyaXplIGltcGxlbWVudGF0aW9uIChpbnRlZ2VyIHBvdykKKy8vIEZJWE1FIGJ0MjAyMGNsIHN1cHBvcnQgKGxpbmVhcml6YXRpb24gYmV0d2VlbiB5dXYvcmdiIHN0ZXAgaW5zdGVhZCBvZiBiZXR3ZWVuIHJnYi94eXopCisvLyBGSVhNRSB0ZXN0IHRoYXQgdGhlIHZhbHVlcyBpbiAoZGUpbGluX2x1dCBkb24ndCBleGNlZWQgdGhlaXIgY29udGFpbmVyIHN0b3JhZ2UKKy8vIHR5cGUgc2l6ZSAob25seSB1c2VmdWwgaWYgd2Uga2VlcCB0aGUgTFVUIGFuZCBkb24ndCBtb3ZlIHRvIGZhc3QgaW50ZWdlciBwb3cpCisvLyBGSVhNRSBkaXRoZXJpbmcgaWYgYml0ZGVwdGggZ29lcyBkb3duPworLy8gRklYTUUgYml0ZXhhY3QgZm9yIGZhdGUgaW50ZWdyYXRpb24/CisKK3N0YXRpYyBjb25zdCBkb3VibGUgeWNnY29fbWF0cml4WzNdWzNdID0KK3sKKyAgICB7ICAwLjI1LCAwLjUsICAwLjI1IH0sCisgICAgeyAtMC4yNSwgMC41LCAtMC4yNSB9LAorICAgIHsgIDAuNSwgIDAsICAgLTAuNSAgfSwKK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgZ2JyX21hdHJpeFszXVszXSA9Cit7CisgICAgeyAwLCAgICAxLCAgIDAgICB9LAorICAgIHsgMCwgICAtMC41LCAwLjUgfSwKKyAgICB7IDAuNSwgLTAuNSwgMCAgIH0sCit9OworCisvKgorICogQWxsIGNvbnN0YW50cyBleHBsYWluZWQgaW4gZS5nLiBodHRwczovL2xpbnV4dHYub3JnL2Rvd25sb2Fkcy92NGwtZHZiLWFwaXMvY2gwMnMwNi5odG1sCisgKiBUaGUgb2xkZXIgb25lcyAoYnQ0NzBiZy9tKSBhcmUgYWxzbyBleHBsYWluZWQgaW4gdGhlaXIgcmVzcGVjdGl2ZSBJVFUgZG9jcworICogKGUuZy4gaHR0cHM6Ly93d3cuaXR1LmludC9kbXNfcHVicmVjL2l0dS1yL3JlYy9idC9SLVJFQy1CVC40NzAtNS0xOTk4MDItUyEhUERGLUUucGRmKQorICogd2hlcmVhcyB0aGUgbmV3ZXIgb25lcyBjYW4gdHlwaWNhbGx5IGJlIGNvcGllZCBkaXJlY3RseSBmcm9tIHdpa2lwZWRpYSA6KQorICovCitzdGF0aWMgY29uc3Qgc3RydWN0IEx1bWFDb2VmZmljaWVudHMgbHVtYV9jb2VmZmljaWVudHNbQVZDT0xfU1BDX05CXSA9IHsKKyAgICBbQVZDT0xfU1BDX0ZDQ10gICAgICAgID0geyAwLjMwLCAgIDAuNTksICAgMC4xMSAgIH0sCisgICAgW0FWQ09MX1NQQ19CVDQ3MEJHXSAgICA9IHsgMC4yOTksICAwLjU4NywgIDAuMTE0ICB9LAorICAgIFtBVkNPTF9TUENfU01QVEUxNzBNXSAgPSB7IDAuMjk5LCAgMC41ODcsICAwLjExNCAgfSwKKyAgICBbQVZDT0xfU1BDX0JUNzA5XSAgICAgID0geyAwLjIxMjYsIDAuNzE1MiwgMC4wNzIyIH0sCisgICAgW0FWQ09MX1NQQ19TTVBURTI0ME1dICA9IHsgMC4yMTIsICAwLjcwMSwgIDAuMDg3ICB9LAorICAgIFtBVkNPTF9TUENfWUNPQ0ddICAgICAgPSB7IDAuMjUsICAgMC41LCAgICAwLjI1ICAgfSwKKyAgICBbQVZDT0xfU1BDX1JHQl0gICAgICAgID0geyAxLCAgICAgIDEsICAgICAgMSAgICAgIH0sCisgICAgW0FWQ09MX1NQQ19CVDIwMjBfTkNMXSA9IHsgMC4yNjI3LCAwLjY3ODAsIDAuMDU5MyB9LAorICAgIFtBVkNPTF9TUENfQlQyMDIwX0NMXSAgPSB7IDAuMjYyNywgMC42NzgwLCAwLjA1OTMgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTHVtYUNvZWZmaWNpZW50cyAqZ2V0X2x1bWFfY29lZmZpY2llbnRzKGVudW0gQVZDb2xvclNwYWNlIGNzcCkKK3sKKyAgICBjb25zdCBzdHJ1Y3QgTHVtYUNvZWZmaWNpZW50cyAqY29lZmZzOworCisgICAgaWYgKGNzcCA+PSBBVkNPTF9TUENfTkIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNvZWZmcyA9ICZsdW1hX2NvZWZmaWNpZW50c1tjc3BdOworICAgIGlmICghY29lZmZzLT5jcikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY29lZmZzOworfQorCitzdGF0aWMgdm9pZCBmaWxsX3JnYjJ5dXZfdGFibGUoY29uc3Qgc3RydWN0IEx1bWFDb2VmZmljaWVudHMgKmNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmdiMnl1dlszXVszXSkKK3sKKyAgICBkb3VibGUgYnNjYWxlLCByc2NhbGU7CisKKyAgICAvLyBzcGVjaWFsIHljZ2NvIG1hdHJpeAorICAgIGlmIChjb2VmZnMtPmNyID09IDAuMjUgJiYgY29lZmZzLT5jZyA9PSAwLjUgJiYgY29lZmZzLT5jYiA9PSAwLjI1KSB7CisgICAgICAgIG1lbWNweShyZ2IyeXV2LCB5Y2djb19tYXRyaXgsIHNpemVvZihkb3VibGUpICogOSk7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgaWYgKGNvZWZmcy0+Y3IgPT0gMSAmJiBjb2VmZnMtPmNnID09IDEgJiYgY29lZmZzLT5jYiA9PSAxKSB7CisgICAgICAgIG1lbWNweShyZ2IyeXV2LCBnYnJfbWF0cml4LCBzaXplb2YoZG91YmxlKSAqIDkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcmdiMnl1dlswXVswXSA9IGNvZWZmcy0+Y3I7CisgICAgcmdiMnl1dlswXVsxXSA9IGNvZWZmcy0+Y2c7CisgICAgcmdiMnl1dlswXVsyXSA9IGNvZWZmcy0+Y2I7CisgICAgYnNjYWxlID0gMC41IC8gKGNvZWZmcy0+Y2IgLSAxLjApOworICAgIHJzY2FsZSA9IDAuNSAvIChjb2VmZnMtPmNyIC0gMS4wKTsKKyAgICByZ2IyeXV2WzFdWzBdID0gYnNjYWxlICogY29lZmZzLT5jcjsKKyAgICByZ2IyeXV2WzFdWzFdID0gYnNjYWxlICogY29lZmZzLT5jZzsKKyAgICByZ2IyeXV2WzFdWzJdID0gMC41OworICAgIHJnYjJ5dXZbMl1bMF0gPSAwLjU7CisgICAgcmdiMnl1dlsyXVsxXSA9IHJzY2FsZSAqIGNvZWZmcy0+Y2c7CisgICAgcmdiMnl1dlsyXVsyXSA9IHJzY2FsZSAqIGNvZWZmcy0+Y2I7Cit9CisKKy8vIEZJWE1FIEknbSBwcmV0dHkgc3VyZSBnYW1tYTIyLzI4IGFsc28gaGF2ZSBhIGxpbmVhciB0b2Ugc2xvcGUsIGJ1dCBJIGNhbid0CisvLyBmaW5kIGFueSBhY3R1YWwgdGFibGVzIHRoYXQgZG9jdW1lbnQgdGhlaXIgcmVhbCB2YWx1ZXMuLi4KKy8vIFNlZSBodHRwOi8vd3d3LjEzdGhtb25rZXkub3JnL35ib3Jpcy9nYW1tYWNvcnJlY3Rpb24vIGZpcnN0IGdyYXBoIHdoeSBpdCBtYXR0ZXJzCitzdGF0aWMgY29uc3Qgc3RydWN0IFRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzIHRyYW5zZmVyX2NoYXJhY3RlcmlzdGljc1tBVkNPTF9UUkNfTkJdID0geworICAgIFtBVkNPTF9UUkNfQlQ3MDldICAgICA9IHsgMS4wOTksICAwLjAxOCwgIDAuNDUsIDQuNSB9LAorICAgIFtBVkNPTF9UUkNfR0FNTUEyMl0gICA9IHsgMS4wLCAgICAwLjAsICAgIDEuMCAvIDIuMiwgMC4wIH0sCisgICAgW0FWQ09MX1RSQ19HQU1NQTI4XSAgID0geyAxLjAsICAgIDAuMCwgICAgMS4wIC8gMi44LCAwLjAgfSwKKyAgICBbQVZDT0xfVFJDX1NNUFRFMTcwTV0gPSB7IDEuMDk5LCAgMC4wMTgsICAwLjQ1LCA0LjUgfSwKKyAgICBbQVZDT0xfVFJDX1NNUFRFMjQwTV0gPSB7IDEuMTExNSwgMC4wMjI4LCAwLjQ1LCA0LjAgfSwKKyAgICBbQVZDT0xfVFJDX0lFQzYxOTY2XzJfMV0gPSB7IDEuMDU1LCAwLjAwMzEzMDgsIDEuMCAvIDIuNCwgMTIuOTIgfSwKKyAgICBbQVZDT0xfVFJDX0lFQzYxOTY2XzJfNF0gPSB7IDEuMDk5LCAwLjAxOCwgMC40NSwgNC41IH0sCisgICAgW0FWQ09MX1RSQ19CVDIwMjBfMTBdID0geyAxLjA5OSwgIDAuMDE4LCAgMC40NSwgNC41IH0sCisgICAgW0FWQ09MX1RSQ19CVDIwMjBfMTJdID0geyAxLjA5OTMsIDAuMDE4MSwgMC40NSwgNC41IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IFRyYW5zZmVyQ2hhcmFjdGVyaXN0aWNzICoKKyAgICBnZXRfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzKGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgdHJjKQoreworICAgIGNvbnN0IHN0cnVjdCBUcmFuc2ZlckNoYXJhY3RlcmlzdGljcyAqY29lZmZzOworCisgICAgaWYgKHRyYyA+PSBBVkNPTF9UUkNfTkIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNvZWZmcyA9ICZ0cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3NbdHJjXTsKKyAgICBpZiAoIWNvZWZmcy0+YWxwaGEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGNvZWZmczsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBXaGl0ZXBvaW50Q29lZmZpY2llbnRzIHdoaXRlcG9pbnRfY29lZmZpY2llbnRzW1dQX05CXSA9IHsKKyAgICBbV1BfRDY1XSA9IHsgMC4zMTI3LCAwLjMyOTAgfSwKKyAgICBbV1BfQ10gICA9IHsgMC4zMTAwLCAwLjMxNjAgfSwKKyAgICBbV1BfRENJXSA9IHsgMC4zMTQwLCAwLjM1MTAgfSwKKyAgICBbV1BfRV0gICA9IHsgMS8zLjBmLCAxLzMuMGYgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgQ29sb3JQcmltYXJpZXMgY29sb3JfcHJpbWFyaWVzW0FWQ09MX1BSSV9OQl0gPSB7CisgICAgW0FWQ09MX1BSSV9CVDcwOV0gICAgID0geyBXUF9ENjUsIDAuNjQwLCAwLjMzMCwgMC4zMDAsIDAuNjAwLCAwLjE1MCwgMC4wNjAgfSwKKyAgICBbQVZDT0xfUFJJX0JUNDcwTV0gICAgPSB7IFdQX0MsICAgMC42NzAsIDAuMzMwLCAwLjIxMCwgMC43MTAsIDAuMTQwLCAwLjA4MCB9LAorICAgIFtBVkNPTF9QUklfQlQ0NzBCR10gICA9IHsgV1BfRDY1LCAwLjY0MCwgMC4zMzAsIDAuMjkwLCAwLjYwMCwgMC4xNTAsIDAuMDYwLH0sCisgICAgW0FWQ09MX1BSSV9TTVBURTE3ME1dID0geyBXUF9ENjUsIDAuNjMwLCAwLjM0MCwgMC4zMTAsIDAuNTk1LCAwLjE1NSwgMC4wNzAgfSwKKyAgICBbQVZDT0xfUFJJX1NNUFRFMjQwTV0gPSB7IFdQX0Q2NSwgMC42MzAsIDAuMzQwLCAwLjMxMCwgMC41OTUsIDAuMTU1LCAwLjA3MCB9LAorICAgIFtBVkNPTF9QUklfU01QVEU0MjhdICA9IHsgV1BfRSwgICAwLjczNSwgMC4yNjUsIDAuMjc0LCAwLjcxOCwgMC4xNjcsIDAuMDA5IH0sCisgICAgW0FWQ09MX1BSSV9TTVBURTQzMV0gID0geyBXUF9EQ0ksIDAuNjgwLCAwLjMyMCwgMC4yNjUsIDAuNjkwLCAwLjE1MCwgMC4wNjAgfSwKKyAgICBbQVZDT0xfUFJJX1NNUFRFNDMyXSAgPSB7IFdQX0Q2NSwgMC42ODAsIDAuMzIwLCAwLjI2NSwgMC42OTAsIDAuMTUwLCAwLjA2MCB9LAorICAgIFtBVkNPTF9QUklfRklMTV0gICAgICA9IHsgV1BfQywgICAwLjY4MSwgMC4zMTksIDAuMjQzLCAwLjY5MiwgMC4xNDUsIDAuMDQ5IH0sCisgICAgW0FWQ09MX1BSSV9CVDIwMjBdICAgID0geyBXUF9ENjUsIDAuNzA4LCAwLjI5MiwgMC4xNzAsIDAuNzk3LCAwLjEzMSwgMC4wNDYgfSwKKyAgICBbQVZDT0xfUFJJX0pFREVDX1AyMl0gPSB7IFdQX0Q2NSwgMC42MzAsIDAuMzQwLCAwLjI5NSwgMC42MDUsIDAuMTU1LCAwLjA3NyB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBDb2xvclByaW1hcmllcyAqZ2V0X2NvbG9yX3ByaW1hcmllcyhlbnVtIEFWQ29sb3JQcmltYXJpZXMgcHJtKQoreworICAgIGNvbnN0IHN0cnVjdCBDb2xvclByaW1hcmllcyAqY29lZmZzOworCisgICAgaWYgKHBybSA+PSBBVkNPTF9QUklfTkIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNvZWZmcyA9ICZjb2xvcl9wcmltYXJpZXNbcHJtXTsKKyAgICBpZiAoIWNvZWZmcy0+eHIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGNvZWZmczsKK30KKworc3RhdGljIHZvaWQgaW52ZXJ0X21hdHJpeDN4Myhjb25zdCBkb3VibGUgaW5bM11bM10sIGRvdWJsZSBvdXRbM11bM10pCit7CisgICAgZG91YmxlIG0wMCA9IGluWzBdWzBdLCBtMDEgPSBpblswXVsxXSwgbTAyID0gaW5bMF1bMl0sCisgICAgICAgICAgIG0xMCA9IGluWzFdWzBdLCBtMTEgPSBpblsxXVsxXSwgbTEyID0gaW5bMV1bMl0sCisgICAgICAgICAgIG0yMCA9IGluWzJdWzBdLCBtMjEgPSBpblsyXVsxXSwgbTIyID0gaW5bMl1bMl07CisgICAgaW50IGksIGo7CisgICAgZG91YmxlIGRldDsKKworICAgIG91dFswXVswXSA9ICAobTExICogbTIyIC0gbTIxICogbTEyKTsKKyAgICBvdXRbMF1bMV0gPSAtKG0wMSAqIG0yMiAtIG0yMSAqIG0wMik7CisgICAgb3V0WzBdWzJdID0gIChtMDEgKiBtMTIgLSBtMTEgKiBtMDIpOworICAgIG91dFsxXVswXSA9IC0obTEwICogbTIyIC0gbTIwICogbTEyKTsKKyAgICBvdXRbMV1bMV0gPSAgKG0wMCAqIG0yMiAtIG0yMCAqIG0wMik7CisgICAgb3V0WzFdWzJdID0gLShtMDAgKiBtMTIgLSBtMTAgKiBtMDIpOworICAgIG91dFsyXVswXSA9ICAobTEwICogbTIxIC0gbTIwICogbTExKTsKKyAgICBvdXRbMl1bMV0gPSAtKG0wMCAqIG0yMSAtIG0yMCAqIG0wMSk7CisgICAgb3V0WzJdWzJdID0gIChtMDAgKiBtMTEgLSBtMTAgKiBtMDEpOworCisgICAgZGV0ID0gbTAwICogb3V0WzBdWzBdICsgbTEwICogb3V0WzBdWzFdICsgbTIwICogb3V0WzBdWzJdOworICAgIGRldCA9IDEuMCAvIGRldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIG91dFtpXVtqXSAqPSBkZXQ7CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbGxfZ2FtbWFfdGFibGUoQ29sb3JTcGFjZUNvbnRleHQgKnMpCit7CisgICAgaW50IG47CisgICAgZG91YmxlIGluX2FscGhhID0gcy0+aW5fdHhjaHItPmFscGhhLCBpbl9iZXRhID0gcy0+aW5fdHhjaHItPmJldGE7CisgICAgZG91YmxlIGluX2dhbW1hID0gcy0+aW5fdHhjaHItPmdhbW1hLCBpbl9kZWx0YSA9IHMtPmluX3R4Y2hyLT5kZWx0YTsKKyAgICBkb3VibGUgaW5faWFscGhhID0gMS4wIC8gaW5fYWxwaGEsIGluX2lnYW1tYSA9IDEuMCAvIGluX2dhbW1hLCBpbl9pZGVsdGEgPSAxLjAgLyBpbl9kZWx0YTsKKyAgICBkb3VibGUgb3V0X2FscGhhID0gcy0+b3V0X3R4Y2hyLT5hbHBoYSwgb3V0X2JldGEgPSBzLT5vdXRfdHhjaHItPmJldGE7CisgICAgZG91YmxlIG91dF9nYW1tYSA9IHMtPm91dF90eGNoci0+Z2FtbWEsIG91dF9kZWx0YSA9IHMtPm91dF90eGNoci0+ZGVsdGE7CisKKyAgICBzLT5saW5fbHV0ID0gYXZfbWFsbG9jKHNpemVvZigqcy0+bGluX2x1dCkgKiAzMjc2OCAqIDIpOworICAgIGlmICghcy0+bGluX2x1dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzLT5kZWxpbl9sdXQgPSAmcy0+bGluX2x1dFszMjc2OF07CisgICAgZm9yIChuID0gMDsgbiA8IDMyNzY4OyBuKyspIHsKKyAgICAgICAgZG91YmxlIHYgPSAobiAtIDIwNDguMCkgLyAyODY3Mi4wLCBkLCBsOworCisgICAgICAgIC8vIGRlbGluZWFyaXplCisgICAgICAgIGlmICh2IDw9IC1vdXRfYmV0YSkgeworICAgICAgICAgICAgZCA9IC1vdXRfYWxwaGEgKiBwb3coLXYsIG91dF9nYW1tYSkgKyAob3V0X2FscGhhIC0gMS4wKTsKKyAgICAgICAgfSBlbHNlIGlmICh2IDwgb3V0X2JldGEpIHsKKyAgICAgICAgICAgIGQgPSBvdXRfZGVsdGEgKiB2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZCA9IG91dF9hbHBoYSAqIHBvdyh2LCBvdXRfZ2FtbWEpIC0gKG91dF9hbHBoYSAtIDEuMCk7CisgICAgICAgIH0KKyAgICAgICAgcy0+ZGVsaW5fbHV0W25dID0gYXZfY2xpcF9pbnQxNihscmludChkICogMjg2NzIuMCkpOworCisgICAgICAgIC8vIGxpbmVhcml6ZQorICAgICAgICBpZiAodiA8PSAtaW5fYmV0YSkgeworICAgICAgICAgICAgbCA9IC1wb3coKDEuMCAtIGluX2FscGhhIC0gdikgKiBpbl9pYWxwaGEsIGluX2lnYW1tYSk7CisgICAgICAgIH0gZWxzZSBpZiAodiA8IGluX2JldGEpIHsKKyAgICAgICAgICAgIGwgPSB2ICogaW5faWRlbHRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbCA9IHBvdygodiArIGluX2FscGhhIC0gMS4wKSAqIGluX2lhbHBoYSwgaW5faWdhbW1hKTsKKyAgICAgICAgfQorICAgICAgICBzLT5saW5fbHV0W25dID0gYXZfY2xpcF9pbnQxNihscmludChsICogMjg2NzIuMCkpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisvKgorICogc2VlIGUuZy4gaHR0cDovL3d3dy5icnVjZWxpbmRibG9vbS5jb20vaW5kZXguaHRtbD9FcW5fUkdCX1hZWl9NYXRyaXguaHRtbAorICovCitzdGF0aWMgdm9pZCBmaWxsX3JnYjJ4eXpfdGFibGUoY29uc3Qgc3RydWN0IENvbG9yUHJpbWFyaWVzICpjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJnYjJ4eXpbM11bM10pCit7CisgICAgY29uc3Qgc3RydWN0IFdoaXRlcG9pbnRDb2VmZmljaWVudHMgKndwID0gJndoaXRlcG9pbnRfY29lZmZpY2llbnRzW2NvZWZmcy0+d3BdOworICAgIGRvdWJsZSBpWzNdWzNdLCBzciwgc2csIHNiLCB6dzsKKworICAgIHJnYjJ4eXpbMF1bMF0gPSBjb2VmZnMtPnhyIC8gY29lZmZzLT55cjsKKyAgICByZ2IyeHl6WzBdWzFdID0gY29lZmZzLT54ZyAvIGNvZWZmcy0+eWc7CisgICAgcmdiMnh5elswXVsyXSA9IGNvZWZmcy0+eGIgLyBjb2VmZnMtPnliOworICAgIHJnYjJ4eXpbMV1bMF0gPSByZ2IyeHl6WzFdWzFdID0gcmdiMnh5elsxXVsyXSA9IDEuMDsKKyAgICByZ2IyeHl6WzJdWzBdID0gKDEuMCAtIGNvZWZmcy0+eHIgLSBjb2VmZnMtPnlyKSAvIGNvZWZmcy0+eXI7CisgICAgcmdiMnh5elsyXVsxXSA9ICgxLjAgLSBjb2VmZnMtPnhnIC0gY29lZmZzLT55ZykgLyBjb2VmZnMtPnlnOworICAgIHJnYjJ4eXpbMl1bMl0gPSAoMS4wIC0gY29lZmZzLT54YiAtIGNvZWZmcy0+eWIpIC8gY29lZmZzLT55YjsKKyAgICBpbnZlcnRfbWF0cml4M3gzKHJnYjJ4eXosIGkpOworICAgIHp3ID0gMS4wIC0gd3AtPnh3IC0gd3AtPnl3OworICAgIHNyID0gaVswXVswXSAqIHdwLT54dyArIGlbMF1bMV0gKiB3cC0+eXcgKyBpWzBdWzJdICogenc7CisgICAgc2cgPSBpWzFdWzBdICogd3AtPnh3ICsgaVsxXVsxXSAqIHdwLT55dyArIGlbMV1bMl0gKiB6dzsKKyAgICBzYiA9IGlbMl1bMF0gKiB3cC0+eHcgKyBpWzJdWzFdICogd3AtPnl3ICsgaVsyXVsyXSAqIHp3OworICAgIHJnYjJ4eXpbMF1bMF0gKj0gc3I7CisgICAgcmdiMnh5elswXVsxXSAqPSBzZzsKKyAgICByZ2IyeHl6WzBdWzJdICo9IHNiOworICAgIHJnYjJ4eXpbMV1bMF0gKj0gc3I7CisgICAgcmdiMnh5elsxXVsxXSAqPSBzZzsKKyAgICByZ2IyeHl6WzFdWzJdICo9IHNiOworICAgIHJnYjJ4eXpbMl1bMF0gKj0gc3I7CisgICAgcmdiMnh5elsyXVsxXSAqPSBzZzsKKyAgICByZ2IyeHl6WzJdWzJdICo9IHNiOworfQorCitzdGF0aWMgdm9pZCBtdWwzeDMoZG91YmxlIGRzdFszXVszXSwgY29uc3QgZG91YmxlIHNyYzFbM11bM10sIGNvbnN0IGRvdWJsZSBzcmMyWzNdWzNdKQoreworICAgIGludCBtLCBuOworCisgICAgZm9yIChtID0gMDsgbSA8IDM7IG0rKykKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IDM7IG4rKykKKyAgICAgICAgICAgIGRzdFttXVtuXSA9IHNyYzJbbV1bMF0gKiBzcmMxWzBdW25dICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYzJbbV1bMV0gKiBzcmMxWzFdW25dICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYzJbbV1bMl0gKiBzcmMxWzJdW25dOworfQorCisvKgorICogU2VlIGh0dHA6Ly93d3cuYnJ1Y2VsaW5kYmxvb20uY29tL2luZGV4Lmh0bWw/RXFuX0Nocm9tQWRhcHQuaHRtbAorICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBCcmFkZm9yZCBtZWNoYW5pc20uCisgKi8KK3N0YXRpYyB2b2lkIGZpbGxfd2hpdGVwb2ludF9jb252X3RhYmxlKGRvdWJsZSBvdXRbM11bM10sIGVudW0gV2hpdGVwb2ludEFkYXB0YXRpb24gd3BfYWRhcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIFdoaXRlcG9pbnQgc3JjLCBlbnVtIFdoaXRlcG9pbnQgZHN0KQoreworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgbWFfdGJsW05CX1dQX0FEQVBUX05PTl9JREVOVElUWV1bM11bM10gPSB7CisgICAgICAgIFtXUF9BREFQVF9CUkFERk9SRF0gPSB7CisgICAgICAgICAgICB7ICAwLjg5NTEsICAwLjI2NjQsIC0wLjE2MTQgfSwKKyAgICAgICAgICAgIHsgLTAuNzUwMiwgIDEuNzEzNSwgIDAuMDM2NyB9LAorICAgICAgICAgICAgeyAgMC4wMzg5LCAtMC4wNjg1LCAgMS4wMjk2IH0sCisgICAgICAgIH0sIFtXUF9BREFQVF9WT05fS1JJRVNdID0geworICAgICAgICAgICAgeyAgMC40MDAyNCwgIDAuNzA3NjAsIC0wLjA4MDgxIH0sCisgICAgICAgICAgICB7IC0wLjIyNjMwLCAgMS4xNjUzMiwgIDAuMDQ1NzAgfSwKKyAgICAgICAgICAgIHsgIDAuMDAwMDAsICAwLjAwMDAwLCAgMC45MTgyMiB9LAorICAgICAgICB9LAorICAgIH07CisgICAgY29uc3QgZG91YmxlICgqbWEpWzNdID0gbWFfdGJsW3dwX2FkYXB0XTsKKyAgICBjb25zdCBzdHJ1Y3QgV2hpdGVwb2ludENvZWZmaWNpZW50cyAqd3Bfc3JjID0gJndoaXRlcG9pbnRfY29lZmZpY2llbnRzW3NyY107CisgICAgZG91YmxlIHp3X3NyYyA9IDEuMCAtIHdwX3NyYy0+eHcgLSB3cF9zcmMtPnl3OworICAgIGNvbnN0IHN0cnVjdCBXaGl0ZXBvaW50Q29lZmZpY2llbnRzICp3cF9kc3QgPSAmd2hpdGVwb2ludF9jb2VmZmljaWVudHNbZHN0XTsKKyAgICBkb3VibGUgendfZHN0ID0gMS4wIC0gd3BfZHN0LT54dyAtIHdwX2RzdC0+eXc7CisgICAgZG91YmxlIG1haVszXVszXSwgZmFjWzNdWzNdLCB0bXBbM11bM107CisgICAgZG91YmxlIHJzLCBncywgYnMsIHJkLCBnZCwgYmQ7CisKKyAgICBpbnZlcnRfbWF0cml4M3gzKG1hLCBtYWkpOworICAgIHJzID0gbWFbMF1bMF0gKiB3cF9zcmMtPnh3ICsgbWFbMF1bMV0gKiB3cF9zcmMtPnl3ICsgbWFbMF1bMl0gKiB6d19zcmM7CisgICAgZ3MgPSBtYVsxXVswXSAqIHdwX3NyYy0+eHcgKyBtYVsxXVsxXSAqIHdwX3NyYy0+eXcgKyBtYVsxXVsyXSAqIHp3X3NyYzsKKyAgICBicyA9IG1hWzJdWzBdICogd3Bfc3JjLT54dyArIG1hWzJdWzFdICogd3Bfc3JjLT55dyArIG1hWzJdWzJdICogendfc3JjOworICAgIHJkID0gbWFbMF1bMF0gKiB3cF9kc3QtPnh3ICsgbWFbMF1bMV0gKiB3cF9kc3QtPnl3ICsgbWFbMF1bMl0gKiB6d19kc3Q7CisgICAgZ2QgPSBtYVsxXVswXSAqIHdwX2RzdC0+eHcgKyBtYVsxXVsxXSAqIHdwX2RzdC0+eXcgKyBtYVsxXVsyXSAqIHp3X2RzdDsKKyAgICBiZCA9IG1hWzJdWzBdICogd3BfZHN0LT54dyArIG1hWzJdWzFdICogd3BfZHN0LT55dyArIG1hWzJdWzJdICogendfZHN0OworICAgIGZhY1swXVswXSA9IHJkIC8gcnM7CisgICAgZmFjWzFdWzFdID0gZ2QgLyBnczsKKyAgICBmYWNbMl1bMl0gPSBiZCAvIGJzOworICAgIGZhY1swXVsxXSA9IGZhY1swXVsyXSA9IGZhY1sxXVswXSA9IGZhY1sxXVsyXSA9IGZhY1syXVswXSA9IGZhY1syXVsxXSA9IDAuMDsKKyAgICBtdWwzeDModG1wLCBtYSwgZmFjKTsKKyAgICBtdWwzeDMob3V0LCB0bXAsIG1haSk7Cit9CisKK3N0YXRpYyB2b2lkIGFwcGx5X2x1dChpbnQxNl90ICpidWZbM10sIHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBjb25zdCBpbnQxNl90ICpsdXQpCit7CisgICAgaW50IHksIHgsIG47CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgMzsgbisrKSB7CisgICAgICAgIGludDE2X3QgKmRhdGEgPSBidWZbbl07CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgICAgICBkYXRhW3hdID0gbHV0W2F2X2NsaXBfdWludHAyKDIwNDggKyBkYXRhW3hdLCAxNSldOworCisgICAgICAgICAgICBkYXRhICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RydWN0IFRocmVhZERhdGEgeworICAgIEFWRnJhbWUgKmluLCAqb3V0OworICAgIHB0cmRpZmZfdCBpbl9saW5lc2l6ZVszXSwgb3V0X2xpbmVzaXplWzNdOworICAgIGludCBpbl9zc19oLCBvdXRfc3NfaDsKK307CisKK3N0YXRpYyBpbnQgY29udmVydChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqZGF0YSwgaW50IGpvYl9uciwgaW50IG5fam9icykKK3sKKyAgICBzdHJ1Y3QgVGhyZWFkRGF0YSAqdGQgPSBkYXRhOworICAgIENvbG9yU3BhY2VDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHVpbnQ4X3QgKmluX2RhdGFbM10sICpvdXRfZGF0YVszXTsKKyAgICBpbnQxNl90ICpyZ2JbM107CisgICAgaW50IGhfaW4gPSAodGQtPmluLT5oZWlnaHQgKyAxKSA+PiAxOworICAgIGludCBoMSA9IDIgKiAoam9iX25yICogaF9pbiAvIG5fam9icyksIGgyID0gMiAqICgoam9iX25yICsgMSkgKiBoX2luIC8gbl9qb2JzKTsKKyAgICBpbnQgdyA9IHRkLT5pbi0+d2lkdGgsIGggPSBoMiAtIGgxOworCisgICAgaW5fZGF0YVswXSAgPSB0ZC0+aW4tPmRhdGFbMF0gICsgdGQtPmluX2xpbmVzaXplWzBdICAqICBoMTsKKyAgICBpbl9kYXRhWzFdICA9IHRkLT5pbi0+ZGF0YVsxXSAgKyB0ZC0+aW5fbGluZXNpemVbMV0gICogKGgxID4+IHRkLT5pbl9zc19oKTsKKyAgICBpbl9kYXRhWzJdICA9IHRkLT5pbi0+ZGF0YVsyXSAgKyB0ZC0+aW5fbGluZXNpemVbMl0gICogKGgxID4+IHRkLT5pbl9zc19oKTsKKyAgICBvdXRfZGF0YVswXSA9IHRkLT5vdXQtPmRhdGFbMF0gKyB0ZC0+b3V0X2xpbmVzaXplWzBdICogIGgxOworICAgIG91dF9kYXRhWzFdID0gdGQtPm91dC0+ZGF0YVsxXSArIHRkLT5vdXRfbGluZXNpemVbMV0gKiAoaDEgPj4gdGQtPm91dF9zc19oKTsKKyAgICBvdXRfZGF0YVsyXSA9IHRkLT5vdXQtPmRhdGFbMl0gKyB0ZC0+b3V0X2xpbmVzaXplWzJdICogKGgxID4+IHRkLT5vdXRfc3NfaCk7CisgICAgcmdiWzBdICAgICAgPSBzLT5yZ2JbMF0gICAgICAgICsgcy0+cmdiX3N0cmlkZSAgICAgICAqICBoMTsKKyAgICByZ2JbMV0gICAgICA9IHMtPnJnYlsxXSAgICAgICAgKyBzLT5yZ2Jfc3RyaWRlICAgICAgICogIGgxOworICAgIHJnYlsyXSAgICAgID0gcy0+cmdiWzJdICAgICAgICArIHMtPnJnYl9zdHJpZGUgICAgICAgKiAgaDE7CisKKyAgICAvLyBGSVhNRSBmb3Igc2ltZCwgYWxzbyBtYWtlIHN1cmUgd2UgZG8gcGljdHVyZXMgd2l0aCBuZWdhdGl2ZSBzdHJpZGUKKyAgICAvLyB0b3AtZG93biBzbyB3ZSBkb24ndCBvdmVyd3JpdGUgbGluZXMgd2l0aCBwYWRkaW5nIG9mIGRhdGEgYmVmb3JlIGl0CisgICAgLy8gaW4gdGhlIHNhbWUgYnVmZmVyIChzYW1lIGFzIHN3c2NhbGUpCisKKyAgICBpZiAocy0+eXV2Mnl1dl9mYXN0bW9kZSkgeworICAgICAgICAvLyBGSVhNRSBwb3NzaWJseSB1c2UgYSBmYXN0IG1vZGUgaW4gY2FzZSBvbmx5IHRoZSB5IHJhbmdlIGNoYW5nZXM/CisgICAgICAgIC8vIHNpbmNlIGluIHRoYXQgY2FzZSwgb25seSB0aGUgZGlhZ29uYWwgZW50cmllcyBpbiB5dXYyeXV2X2NvZWZmc1tdCisgICAgICAgIC8vIGFyZSBub24temVybworICAgICAgICBzLT55dXYyeXV2KG91dF9kYXRhLCB0ZC0+b3V0X2xpbmVzaXplLCBpbl9kYXRhLCB0ZC0+aW5fbGluZXNpemUsIHcsIGgsCisgICAgICAgICAgICAgICAgICAgcy0+eXV2Mnl1dl9jb2VmZnMsIHMtPnl1dl9vZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZJWE1FIG1heWJlIChmb3IgY2FjaGluZyBlZmZjaWVuY3kpIGRvIHBpcGVsaW5lIHBlci1saW5lIGluc3RlYWQgb2YKKyAgICAgICAgLy8gZnVsbCBidWZmZXIgcGVyIGZ1bmN0aW9uPyAoT3IsIHNpbmNlIHl1djJyZ2IgcmVxdWlyZXMgMiBsaW5lczogcGVyCisgICAgICAgIC8vIDIgbGluZXMsIGZvciB5dXY0MjAuKQorICAgICAgICAvKgorICAgICAgICAgKiBHZW5lcmFsIGRlc2lnbjoKKyAgICAgICAgICogLSB5dXYycmdiIGNvbnZlcnRzIGZyb20gd2hhdGV2ZXIgcmFuZ2UgdGhlIGlucHV0IHdhcyAoWzE2LTIzNS8yNDBdIG9yCisgICAgICAgICAqICAgWzAsMjU1XSBvciB0aGUgMTAvMTJicHAgZXF1aXZhbGVudHMgdGhlcmVvZikgdG8gYW4gaW50ZWdlciB2ZXJzaW9uCisgICAgICAgICAqICAgb2YgUkdCIGluIHBzdWVkby1yZXN0cmljdGVkIDE1K3NpZ24gYml0cy4gVGhhdCBtZWFucyB0aGF0IHRoZSBmbG9hdAorICAgICAgICAgKiAgIHJhbmdlIFswLjAsMS4wXSBpcyBpbiBbMCwyODc2Ml0sIGFuZCB0aGUgcmVtYWluZGVyIG9mIHRoZSBpbnQxNl90CisgICAgICAgICAqICAgcmFuZ2UgaXMgdXNlZCBmb3Igb3ZlcmZsb3cvdW5kZXJmbG93IG91dHNpZGUgdGhlIHJlcHJlc2VudGFibGUKKyAgICAgICAgICogICByYW5nZSBvZiB0aGlzIFJHQiB0eXBlLiByZ2IyeXV2IGlzIHRoZSBleGFjdCBvcHBvc2l0ZS4KKyAgICAgICAgICogLSBnYW1tYSBjb3JyZWN0aW9uIGlzIGRvbmUgdXNpbmcgYSBMVVQgc2luY2UgdGhhdCBhcHBlYXJzIHRvIHdvcmsKKyAgICAgICAgICogICBmYWlybHkgZmFzdC4KKyAgICAgICAgICogLSBJZiB0aGUgaW5wdXQgaXMgY2hyb21hLXN1YnNhbXBsZWQgKDQyMC80MjIpLCB0aGUgeXV2MnJnYiBjb252ZXJzaW9uCisgICAgICAgICAqICAgKG9yIHJnYjJ5dXYgY29udmVyc2lvbikgdXNlcyBuZWFyZXN0LW5laWdoYm91ciBzYW1wbGluZyB0byByZWFkCisgICAgICAgICAqICAgcmVhZCBjaHJvbWEgcGl4ZWxzIGF0IGx1bWEgcmVzb2x1dGlvbi4gSWYgeW91IHdhbnQgc29tZSBtb3JlIGZhbmN5CisgICAgICAgICAqICAgZmlsdGVyLCB5b3UgY2FuIHVzZSBzd3NjYWxlIHRvIGNvbnZlcnQgdG8geXV2NDQ0cC4KKyAgICAgICAgICogLSBhbGwgY29lZmZpY2llbnRzIGFyZSAxNGJpdCAoc28gaW4gdGhlIFstMi4wLDIuMF0gcmFuZ2UpLgorICAgICAgICAgKi8KKyAgICAgICAgcy0+eXV2MnJnYihyZ2IsIHMtPnJnYl9zdHJpZGUsIGluX2RhdGEsIHRkLT5pbl9saW5lc2l6ZSwgdywgaCwKKyAgICAgICAgICAgICAgICAgICBzLT55dXYycmdiX2NvZWZmcywgcy0+eXV2X29mZnNldFswXSk7CisgICAgICAgIGlmICghcy0+cmdiMnJnYl9wYXNzdGhyb3VnaCkgeworICAgICAgICAgICAgYXBwbHlfbHV0KHJnYiwgcy0+cmdiX3N0cmlkZSwgdywgaCwgcy0+bGluX2x1dCk7CisgICAgICAgICAgICBpZiAoIXMtPmxyZ2IybHJnYl9wYXNzdGhyb3VnaCkKKyAgICAgICAgICAgICAgICBzLT5kc3AubXVsdGlwbHkzeDMocmdiLCBzLT5yZ2Jfc3RyaWRlLCB3LCBoLCBzLT5scmdiMmxyZ2JfY29lZmZzKTsKKyAgICAgICAgICAgIGFwcGx5X2x1dChyZ2IsIHMtPnJnYl9zdHJpZGUsIHcsIGgsIHMtPmRlbGluX2x1dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmRpdGhlciA9PSBESVRIRVJfRlNCKSB7CisgICAgICAgICAgICBzLT5yZ2IyeXV2X2ZzYihvdXRfZGF0YSwgdGQtPm91dF9saW5lc2l6ZSwgcmdiLCBzLT5yZ2Jfc3RyaWRlLCB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmdiMnl1dl9jb2VmZnMsIHMtPnl1dl9vZmZzZXRbMV0sIHMtPmRpdGhlcl9zY3JhdGNoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnJnYjJ5dXYob3V0X2RhdGEsIHRkLT5vdXRfbGluZXNpemUsIHJnYiwgcy0+cmdiX3N0cmlkZSwgdywgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+cmdiMnl1dl9jb2VmZnMsIHMtPnl1dl9vZmZzZXRbMV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3JhbmdlX29mZihBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50ICpvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp5X3JuZywgaW50ICp1dl9ybmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkNvbG9yUmFuZ2Ugcm5nLCBpbnQgZGVwdGgpCit7CisgICAgc3dpdGNoIChybmcpIHsKKyAgICBjYXNlIEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEOiB7CisgICAgICAgIENvbG9yU3BhY2VDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgICAgIGlmICghcy0+ZGlkX3dhcm5fcmFuZ2UpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW5wdXQgcmFuZ2Ugbm90IHNldCwgYXNzdW1pbmcgdHYvbXBlZ1xuIik7CisgICAgICAgICAgICBzLT5kaWRfd2Fybl9yYW5nZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgIGNhc2UgQVZDT0xfUkFOR0VfTVBFRzoKKyAgICAgICAgKm9mZiA9IDE2IDw8IChkZXB0aCAtIDgpOworICAgICAgICAqeV9ybmcgPSAyMTkgPDwgKGRlcHRoIC0gOCk7CisgICAgICAgICp1dl9ybmcgPSAyMjQgPDwgKGRlcHRoIC0gOCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZDT0xfUkFOR0VfSlBFRzoKKyAgICAgICAgKm9mZiA9IDA7CisgICAgICAgICp5X3JuZyA9ICp1dl9ybmcgPSAoMjU2IDw8IChkZXB0aCAtIDgpKSAtIDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2ZpbHRlcmdyYXBoKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqaW4sIGNvbnN0IEFWRnJhbWUgKm91dCkKK3sKKyAgICBDb2xvclNwYWNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmluX2Rlc2MgID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbi0+Zm9ybWF0KTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKm91dF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdXQtPmZvcm1hdCk7CisgICAgaW50IGVtbXMgPSAwLCBtLCBuLCBvLCByZXMsIGZtdF9pZGVudGljYWwsIHJlZG9feXV2MnJnYiA9IDAsIHJlZG9fcmdiMnl1diA9IDA7CisKKyNkZWZpbmUgc3VwcG9ydGVkX2RlcHRoKGQpICgoZCkgPT0gOCB8fCAoZCkgPT0gMTAgfHwgKGQpID09IDEyKQorI2RlZmluZSBzdXBwb3J0ZWRfc3Vic2FtcGxpbmcobGN3LCBsY2gpIFwKKyAgICAoKChsY3cpID09IDAgJiYgKGxjaCkgPT0gMCkgfHwgKChsY3cpID09IDEgJiYgKGxjaCkgPT0gMCkgfHwgKChsY3cpID09IDEgJiYgKGxjaCkgPT0gMSkpCisjZGVmaW5lIHN1cHBvcnRlZF9mb3JtYXQoZCkgXAorICAgICgoZCkgIT0gTlVMTCAmJiAoZCktPm5iX2NvbXBvbmVudHMgPT0gMyAmJiBcCisgICAgICEoKGQpLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpICYmIFwKKyAgICAgc3VwcG9ydGVkX2RlcHRoKChkKS0+Y29tcFswXS5kZXB0aCkgJiYgXAorICAgICBzdXBwb3J0ZWRfc3Vic2FtcGxpbmcoKGQpLT5sb2cyX2Nocm9tYV93LCAoZCktPmxvZzJfY2hyb21hX2gpKQorCisgICAgaWYgKCFzdXBwb3J0ZWRfZm9ybWF0KGluX2Rlc2MpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBpbnB1dCBmb3JtYXQgJWQgKCVzKSBvciBiaXRkZXB0aCAoJWQpXG4iLAorICAgICAgICAgICAgICAgaW4tPmZvcm1hdCwgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbi0+Zm9ybWF0KSwKKyAgICAgICAgICAgICAgIGluX2Rlc2MgPyBpbl9kZXNjLT5jb21wWzBdLmRlcHRoIDogLTEpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoIXN1cHBvcnRlZF9mb3JtYXQob3V0X2Rlc2MpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0ICVkICglcykgb3IgYml0ZGVwdGggKCVkKVxuIiwKKyAgICAgICAgICAgICAgIG91dC0+Zm9ybWF0LCBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dC0+Zm9ybWF0KSwKKyAgICAgICAgICAgICAgIG91dF9kZXNjID8gb3V0X2Rlc2MtPmNvbXBbMF0uZGVwdGggOiAtMSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKGluLT5jb2xvcl9wcmltYXJpZXMgICE9IHMtPmluX3BybSkgIHMtPmluX3ByaW1hcmllcyAgPSBOVUxMOworICAgIGlmIChvdXQtPmNvbG9yX3ByaW1hcmllcyAhPSBzLT5vdXRfcHJtKSBzLT5vdXRfcHJpbWFyaWVzID0gTlVMTDsKKyAgICBpZiAoaW4tPmNvbG9yX3RyYyAgICAgICAgIT0gcy0+aW5fdHJjKSAgcy0+aW5fdHhjaHIgICAgICA9IE5VTEw7CisgICAgaWYgKG91dC0+Y29sb3JfdHJjICAgICAgICE9IHMtPm91dF90cmMpIHMtPm91dF90eGNociAgICAgPSBOVUxMOworICAgIGlmIChpbi0+Y29sb3JzcGFjZSAgICAgICAhPSBzLT5pbl9jc3AgfHwKKyAgICAgICAgaW4tPmNvbG9yX3JhbmdlICAgICAgIT0gcy0+aW5fcm5nKSAgcy0+aW5fbHVtYWNvZWYgICA9IE5VTEw7CisgICAgaWYgKG91dC0+Y29sb3JzcGFjZSAgICAgICE9IHMtPm91dF9jc3AgfHwKKyAgICAgICAgb3V0LT5jb2xvcl9yYW5nZSAgICAgIT0gcy0+b3V0X3JuZykgcy0+b3V0X2x1bWFjb2VmICA9IE5VTEw7CisKKyAgICBpZiAoIXMtPm91dF9wcmltYXJpZXMgfHwgIXMtPmluX3ByaW1hcmllcykgeworICAgICAgICBzLT5pbl9wcm0gPSBpbi0+Y29sb3JfcHJpbWFyaWVzOworICAgICAgICBpZiAocy0+dXNlcl9pYWxsICE9IENTX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgcy0+aW5fcHJtID0gZGVmYXVsdF9wcm1bRkZNSU4ocy0+dXNlcl9pYWxsLCBDU19OQildOworICAgICAgICBpZiAocy0+dXNlcl9pcHJtICE9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCkKKyAgICAgICAgICAgIHMtPmluX3BybSA9IHMtPnVzZXJfaXBybTsKKyAgICAgICAgcy0+aW5fcHJpbWFyaWVzID0gZ2V0X2NvbG9yX3ByaW1hcmllcyhzLT5pbl9wcm0pOworICAgICAgICBpZiAoIXMtPmluX3ByaW1hcmllcykgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBpbnB1dCBwcmltYXJpZXMgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5pbl9wcm0sIGF2X2NvbG9yX3ByaW1hcmllc19uYW1lKHMtPmluX3BybSkpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBzLT5vdXRfcHJtID0gb3V0LT5jb2xvcl9wcmltYXJpZXM7CisgICAgICAgIHMtPm91dF9wcmltYXJpZXMgPSBnZXRfY29sb3JfcHJpbWFyaWVzKHMtPm91dF9wcm0pOworICAgICAgICBpZiAoIXMtPm91dF9wcmltYXJpZXMpIHsKKyAgICAgICAgICAgIGlmIChzLT5vdXRfcHJtID09IEFWQ09MX1BSSV9VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgICAgIGlmIChzLT51c2VyX2FsbCA9PSBDU19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJQbGVhc2Ugc3BlY2lmeSBvdXRwdXQgcHJpbWFyaWVzXG4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb3V0cHV0IGNvbG9yIHByb3BlcnR5ICVkXG4iLCBzLT51c2VyX2FsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBvdXRwdXQgcHJpbWFyaWVzICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dF9wcm0sIGF2X2NvbG9yX3ByaW1hcmllc19uYW1lKHMtPm91dF9wcm0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgcy0+bHJnYjJscmdiX3Bhc3N0aHJvdWdoID0gIW1lbWNtcChzLT5pbl9wcmltYXJpZXMsIHMtPm91dF9wcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5pbl9wcmltYXJpZXMpKTsKKyAgICAgICAgaWYgKCFzLT5scmdiMmxyZ2JfcGFzc3Rocm91Z2gpIHsKKyAgICAgICAgICAgIGRvdWJsZSByZ2IyeHl6WzNdWzNdLCB4eXoycmdiWzNdWzNdLCByZ2IycmdiWzNdWzNdOworCisgICAgICAgICAgICBmaWxsX3JnYjJ4eXpfdGFibGUocy0+b3V0X3ByaW1hcmllcywgcmdiMnh5eik7CisgICAgICAgICAgICBpbnZlcnRfbWF0cml4M3gzKHJnYjJ4eXosIHh5ejJyZ2IpOworICAgICAgICAgICAgZmlsbF9yZ2IyeHl6X3RhYmxlKHMtPmluX3ByaW1hcmllcywgcmdiMnh5eik7CisgICAgICAgICAgICBpZiAocy0+b3V0X3ByaW1hcmllcy0+d3AgIT0gcy0+aW5fcHJpbWFyaWVzLT53cCAmJgorICAgICAgICAgICAgICAgIHMtPndwX2FkYXB0ICE9IFdQX0FEQVBUX0lERU5USVRZKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIHdwY29udlszXVszXSwgdG1wWzNdWzNdOworCisgICAgICAgICAgICAgICAgZmlsbF93aGl0ZXBvaW50X2NvbnZfdGFibGUod3Bjb252LCBzLT53cF9hZGFwdCwgcy0+aW5fcHJpbWFyaWVzLT53cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXRfcHJpbWFyaWVzLT53cCk7CisgICAgICAgICAgICAgICAgbXVsM3gzKHRtcCwgcmdiMnh5eiwgd3Bjb252KTsKKyAgICAgICAgICAgICAgICBtdWwzeDMocmdiMnJnYiwgdG1wLCB4eXoycmdiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXVsM3gzKHJnYjJyZ2IsIHJnYjJ4eXosIHh5ejJyZ2IpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDM7IG0rKykKKyAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMzsgbisrKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPmxyZ2IybHJnYl9jb2VmZnNbbV1bbl1bMF0gPSBscmludCgxNjM4NC4wICogcmdiMnJnYlttXVtuXSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAobyA9IDE7IG8gPCA4OyBvKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5scmdiMmxyZ2JfY29lZmZzW21dW25dW29dID0gcy0+bHJnYjJscmdiX2NvZWZmc1ttXVtuXVswXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVtbXMgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzLT5pbl90eGNocikgeworICAgICAgICBhdl9mcmVlcCgmcy0+bGluX2x1dCk7CisgICAgICAgIHMtPmluX3RyYyA9IGluLT5jb2xvcl90cmM7CisgICAgICAgIGlmIChzLT51c2VyX2lhbGwgIT0gQ1NfVU5TUEVDSUZJRUQpCisgICAgICAgICAgICBzLT5pbl90cmMgPSBkZWZhdWx0X3RyY1tGRk1JTihzLT51c2VyX2lhbGwsIENTX05CKV07CisgICAgICAgIGlmIChzLT51c2VyX2l0cmMgIT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgcy0+aW5fdHJjID0gcy0+dXNlcl9pdHJjOworICAgICAgICBzLT5pbl90eGNociA9IGdldF90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3Mocy0+aW5fdHJjKTsKKyAgICAgICAgaWYgKCFzLT5pbl90eGNocikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBpbnB1dCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5pbl90cmMsIGF2X2NvbG9yX3RyYW5zZmVyX25hbWUocy0+aW5fdHJjKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFzLT5vdXRfdHhjaHIpIHsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmxpbl9sdXQpOworICAgICAgICBzLT5vdXRfdHJjID0gb3V0LT5jb2xvcl90cmM7CisgICAgICAgIHMtPm91dF90eGNociA9IGdldF90cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3Mocy0+b3V0X3RyYyk7CisgICAgICAgIGlmICghcy0+b3V0X3R4Y2hyKSB7CisgICAgICAgICAgICBpZiAocy0+b3V0X3RyYyA9PSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgICAgICBpZiAocy0+dXNlcl9hbGwgPT0gQ1NfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBzcGVjaWZ5IG91dHB1dCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3NcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBvdXRwdXQgY29sb3IgcHJvcGVydHkgJWRcbiIsIHMtPnVzZXJfYWxsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG91dHB1dCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+b3V0X3RyYywgYXZfY29sb3JfdHJhbnNmZXJfbmFtZShzLT5vdXRfdHJjKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+cmdiMnJnYl9wYXNzdGhyb3VnaCA9IHMtPmZhc3RfbW9kZSB8fCAocy0+bHJnYjJscmdiX3Bhc3N0aHJvdWdoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtZW1jbXAocy0+aW5fdHhjaHIsIHMtPm91dF90eGNociwgc2l6ZW9mKCpzLT5pbl90eGNocikpKTsKKyAgICBpZiAoIXMtPnJnYjJyZ2JfcGFzc3Rocm91Z2ggJiYgIXMtPmxpbl9sdXQpIHsKKyAgICAgICAgcmVzID0gZmlsbF9nYW1tYV90YWJsZShzKTsKKyAgICAgICAgaWYgKHJlcyA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBlbW1zID0gMTsKKyAgICB9CisKKyAgICBpZiAoIXMtPmluX2x1bWFjb2VmKSB7CisgICAgICAgIHMtPmluX2NzcCA9IGluLT5jb2xvcnNwYWNlOworICAgICAgICBpZiAocy0+dXNlcl9pYWxsICE9IENTX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgcy0+aW5fY3NwID0gZGVmYXVsdF9jc3BbRkZNSU4ocy0+dXNlcl9pYWxsLCBDU19OQildOworICAgICAgICBpZiAocy0+dXNlcl9pY3NwICE9IEFWQ09MX1NQQ19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgIHMtPmluX2NzcCA9IHMtPnVzZXJfaWNzcDsKKyAgICAgICAgcy0+aW5fcm5nID0gaW4tPmNvbG9yX3JhbmdlOworICAgICAgICBpZiAocy0+dXNlcl9pcm5nICE9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgcy0+aW5fcm5nID0gcy0+dXNlcl9pcm5nOworICAgICAgICBzLT5pbl9sdW1hY29lZiA9IGdldF9sdW1hX2NvZWZmaWNpZW50cyhzLT5pbl9jc3ApOworICAgICAgICBpZiAoIXMtPmluX2x1bWFjb2VmKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGlucHV0IGNvbG9yc3BhY2UgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5pbl9jc3AsIGF2X2NvbG9yX3NwYWNlX25hbWUocy0+aW5fY3NwKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIHJlZG9feXV2MnJnYiA9IDE7CisgICAgfQorCisgICAgaWYgKCFzLT5vdXRfbHVtYWNvZWYpIHsKKyAgICAgICAgcy0+b3V0X2NzcCA9IG91dC0+Y29sb3JzcGFjZTsKKyAgICAgICAgcy0+b3V0X3JuZyA9IG91dC0+Y29sb3JfcmFuZ2U7CisgICAgICAgIHMtPm91dF9sdW1hY29lZiA9IGdldF9sdW1hX2NvZWZmaWNpZW50cyhzLT5vdXRfY3NwKTsKKyAgICAgICAgaWYgKCFzLT5vdXRfbHVtYWNvZWYpIHsKKyAgICAgICAgICAgIGlmIChzLT5vdXRfY3NwID09IEFWQ09MX1NQQ19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgICAgIGlmIChzLT51c2VyX2FsbCA9PSBDU19VTlNQRUNJRklFRCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHNwZWNpZnkgb3V0cHV0IHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljc1xuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIG91dHB1dCBjb2xvciBwcm9wZXJ0eSAlZFxuIiwgcy0+dXNlcl9hbGwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb3V0cHV0IHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcyAlZCAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5vdXRfY3NwLCBhdl9jb2xvcl9zcGFjZV9uYW1lKHMtPm91dF9jc3ApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgcmVkb19yZ2IyeXV2ID0gMTsKKyAgICB9CisKKyAgICBmbXRfaWRlbnRpY2FsID0gaW5fZGVzYy0+bG9nMl9jaHJvbWFfaCA9PSBvdXRfZGVzYy0+bG9nMl9jaHJvbWFfaCAmJgorICAgICAgICAgICAgICAgICAgICBpbl9kZXNjLT5sb2cyX2Nocm9tYV93ID09IG91dF9kZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHMtPnl1djJ5dXZfZmFzdG1vZGUgPSBzLT5yZ2IycmdiX3Bhc3N0aHJvdWdoICYmIGZtdF9pZGVudGljYWw7CisgICAgcy0+eXV2Mnl1dl9wYXNzdGhyb3VnaCA9IHMtPnl1djJ5dXZfZmFzdG1vZGUgJiYgcy0+aW5fcm5nID09IHMtPm91dF9ybmcgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1lbWNtcChzLT5pbl9sdW1hY29lZiwgcy0+b3V0X2x1bWFjb2VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+aW5fbHVtYWNvZWYpKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9kZXNjLT5jb21wWzBdLmRlcHRoID09IG91dF9kZXNjLT5jb21wWzBdLmRlcHRoOworICAgIGlmICghcy0+eXV2Mnl1dl9wYXNzdGhyb3VnaCkgeworICAgICAgICBpZiAocmVkb195dXYycmdiKSB7CisgICAgICAgICAgICBkb3VibGUgcmdiMnl1dlszXVszXSwgKCp5dXYycmdiKVszXSA9IHMtPnl1djJyZ2JfZGJsX2NvZWZmczsKKyAgICAgICAgICAgIGludCBvZmYsIGJpdHMsIGluX3JuZzsKKworICAgICAgICAgICAgcmVzID0gZ2V0X3JhbmdlX29mZihjdHgsICZvZmYsICZzLT5pbl95X3JuZywgJnMtPmluX3V2X3JuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5fcm5nLCBpbl9kZXNjLT5jb21wWzBdLmRlcHRoKTsKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgaW5wdXQgY29sb3IgcmFuZ2UgJWQgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+aW5fcm5nLCBhdl9jb2xvcl9yYW5nZV9uYW1lKHMtPmluX3JuZykpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgODsgbisrKQorICAgICAgICAgICAgICAgIHMtPnl1dl9vZmZzZXRbMF1bbl0gPSBvZmY7CisgICAgICAgICAgICBmaWxsX3JnYjJ5dXZfdGFibGUocy0+aW5fbHVtYWNvZWYsIHJnYjJ5dXYpOworICAgICAgICAgICAgaW52ZXJ0X21hdHJpeDN4MyhyZ2IyeXV2LCB5dXYycmdiKTsKKyAgICAgICAgICAgIGJpdHMgPSAxIDw8IChpbl9kZXNjLT5jb21wWzBdLmRlcHRoIC0gMSk7CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMzsgbisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbl9ybmcgPSBzLT5pbl95X3JuZywgbSA9IDA7IG0gPCAzOyBtKyssIGluX3JuZyA9IHMtPmluX3V2X3JuZykgeworICAgICAgICAgICAgICAgICAgICBzLT55dXYycmdiX2NvZWZmc1tuXVttXVswXSA9IGxyaW50KDI4NjcyICogYml0cyAqIHl1djJyZ2Jbbl1bbV0gLyBpbl9ybmcpOworICAgICAgICAgICAgICAgICAgICBmb3IgKG8gPSAxOyBvIDwgODsgbysrKQorICAgICAgICAgICAgICAgICAgICAgICAgcy0+eXV2MnJnYl9jb2VmZnNbbl1bbV1bb10gPSBzLT55dXYycmdiX2NvZWZmc1tuXVttXVswXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9hc3NlcnQyKHMtPnl1djJyZ2JfY29lZmZzWzBdWzFdWzBdID09IDApOworICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT55dXYycmdiX2NvZWZmc1syXVsyXVswXSA9PSAwKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDIocy0+eXV2MnJnYl9jb2VmZnNbMF1bMF1bMF0gPT0gcy0+eXV2MnJnYl9jb2VmZnNbMV1bMF1bMF0pOworICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT55dXYycmdiX2NvZWZmc1swXVswXVswXSA9PSBzLT55dXYycmdiX2NvZWZmc1syXVswXVswXSk7CisgICAgICAgICAgICBzLT55dXYycmdiID0gcy0+ZHNwLnl1djJyZ2JbKGluX2Rlc2MtPmNvbXBbMF0uZGVwdGggLSA4KSA+PiAxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luX2Rlc2MtPmxvZzJfY2hyb21hX2ggKyBpbl9kZXNjLT5sb2cyX2Nocm9tYV93XTsKKyAgICAgICAgICAgIGVtbXMgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlZG9fcmdiMnl1dikgeworICAgICAgICAgICAgZG91YmxlICgqcmdiMnl1dilbM10gPSBzLT5yZ2IyeXV2X2RibF9jb2VmZnM7CisgICAgICAgICAgICBpbnQgb2ZmLCBvdXRfcm5nLCBiaXRzOworCisgICAgICAgICAgICByZXMgPSBnZXRfcmFuZ2Vfb2ZmKGN0eCwgJm9mZiwgJnMtPm91dF95X3JuZywgJnMtPm91dF91dl9ybmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dF9ybmcsIG91dF9kZXNjLT5jb21wWzBdLmRlcHRoKTsKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgb3V0cHV0IGNvbG9yIHJhbmdlICVkICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm91dF9ybmcsIGF2X2NvbG9yX3JhbmdlX25hbWUocy0+b3V0X3JuZykpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgODsgbisrKQorICAgICAgICAgICAgICAgIHMtPnl1dl9vZmZzZXRbMV1bbl0gPSBvZmY7CisgICAgICAgICAgICBmaWxsX3JnYjJ5dXZfdGFibGUocy0+b3V0X2x1bWFjb2VmLCByZ2IyeXV2KTsKKyAgICAgICAgICAgIGJpdHMgPSAxIDw8ICgyOSAtIG91dF9kZXNjLT5jb21wWzBdLmRlcHRoKTsKKyAgICAgICAgICAgIGZvciAob3V0X3JuZyA9IHMtPm91dF95X3JuZywgbiA9IDA7IG4gPCAzOyBuKyssIG91dF9ybmcgPSBzLT5vdXRfdXZfcm5nKSB7CisgICAgICAgICAgICAgICAgZm9yIChtID0gMDsgbSA8IDM7IG0rKykgeworICAgICAgICAgICAgICAgICAgICBzLT5yZ2IyeXV2X2NvZWZmc1tuXVttXVswXSA9IGxyaW50KGJpdHMgKiBvdXRfcm5nICogcmdiMnl1dltuXVttXSAvIDI4NjcyKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChvID0gMTsgbyA8IDg7IG8rKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJnYjJ5dXZfY29lZmZzW25dW21dW29dID0gcy0+cmdiMnl1dl9jb2VmZnNbbl1bbV1bMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZfYXNzZXJ0MihzLT5yZ2IyeXV2X2NvZWZmc1sxXVsyXVswXSA9PSBzLT5yZ2IyeXV2X2NvZWZmc1syXVswXVswXSk7CisgICAgICAgICAgICBzLT5yZ2IyeXV2ID0gcy0+ZHNwLnJnYjJ5dXZbKG91dF9kZXNjLT5jb21wWzBdLmRlcHRoIC0gOCkgPj4gMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRfZGVzYy0+bG9nMl9jaHJvbWFfaCArIG91dF9kZXNjLT5sb2cyX2Nocm9tYV93XTsKKyAgICAgICAgICAgIHMtPnJnYjJ5dXZfZnNiID0gcy0+ZHNwLnJnYjJ5dXZfZnNiWyhvdXRfZGVzYy0+Y29tcFswXS5kZXB0aCAtIDgpID4+IDFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3V0X2Rlc2MtPmxvZzJfY2hyb21hX2ggKyBvdXRfZGVzYy0+bG9nMl9jaHJvbWFfd107CisgICAgICAgICAgICBlbW1zID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT55dXYyeXV2X2Zhc3Rtb2RlICYmIChyZWRvX3l1djJyZ2IgfHwgcmVkb19yZ2IyeXV2KSkgeworICAgICAgICAgICAgaW50IGlkZXB0aCA9IGluX2Rlc2MtPmNvbXBbMF0uZGVwdGgsIG9kZXB0aCA9IG91dF9kZXNjLT5jb21wWzBdLmRlcHRoOworICAgICAgICAgICAgZG91YmxlICgqcmdiMnl1dilbM10gPSBzLT5yZ2IyeXV2X2RibF9jb2VmZnM7CisgICAgICAgICAgICBkb3VibGUgKCp5dXYycmdiKVszXSA9IHMtPnl1djJyZ2JfZGJsX2NvZWZmczsKKyAgICAgICAgICAgIGRvdWJsZSB5dXYyeXV2WzNdWzNdOworICAgICAgICAgICAgaW50IGluX3JuZywgb3V0X3JuZzsKKworICAgICAgICAgICAgbXVsM3gzKHl1djJ5dXYsIHl1djJyZ2IsIHJnYjJ5dXYpOworICAgICAgICAgICAgZm9yIChvdXRfcm5nID0gcy0+b3V0X3lfcm5nLCBtID0gMDsgbSA8IDM7IG0rKywgb3V0X3JuZyA9IHMtPm91dF91dl9ybmcpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGluX3JuZyA9IHMtPmluX3lfcm5nLCBuID0gMDsgbiA8IDM7IG4rKywgaW5fcm5nID0gcy0+aW5fdXZfcm5nKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnl1djJ5dXZfY29lZmZzW21dW25dWzBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxyaW50KDE2Mzg0ICogeXV2Mnl1dlttXVtuXSAqIG91dF9ybmcgKiAoMSA8PCBpZGVwdGgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbl9ybmcgKiAoMSA8PCBvZGVwdGgpKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAobyA9IDE7IG8gPCA4OyBvKyspCisgICAgICAgICAgICAgICAgICAgICAgICBzLT55dXYyeXV2X2NvZWZmc1ttXVtuXVtvXSA9IHMtPnl1djJ5dXZfY29lZmZzW21dW25dWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2Fzc2VydDIocy0+eXV2Mnl1dl9jb2VmZnNbMV1bMF1bMF0gPT0gMCk7CisgICAgICAgICAgICBhdl9hc3NlcnQyKHMtPnl1djJ5dXZfY29lZmZzWzJdWzBdWzBdID09IDApOworICAgICAgICAgICAgcy0+eXV2Mnl1diA9IHMtPmRzcC55dXYyeXV2WyhpZGVwdGggLSA4KSA+PiAxXVsob2RlcHRoIC0gOCkgPj4gMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbl9kZXNjLT5sb2cyX2Nocm9tYV9oICsgaW5fZGVzYy0+bG9nMl9jaHJvbWFfd107CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW1tcykKKyAgICAgICAgZW1tc19jKCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENvbG9yU3BhY2VDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgZmZfY29sb3JzcGFjZWRzcF9pbml0KCZzLT5kc3ApOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDb2xvclNwYWNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzLT5yZ2JbMF0pOworICAgIGF2X2ZyZWVwKCZzLT5yZ2JbMV0pOworICAgIGF2X2ZyZWVwKCZzLT5yZ2JbMl0pOworICAgIHMtPnJnYl9zeiA9IDA7CisgICAgYXZfZnJlZXAoJnMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMF1bMF0pOworICAgIGF2X2ZyZWVwKCZzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzBdWzFdKTsKKyAgICBhdl9mcmVlcCgmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsxXVswXSk7CisgICAgYXZfZnJlZXAoJnMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMV1bMV0pOworICAgIGF2X2ZyZWVwKCZzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzJdWzBdKTsKKyAgICBhdl9mcmVlcCgmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsyXVsxXSk7CisKKyAgICBhdl9mcmVlcCgmcy0+bGluX2x1dCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIENvbG9yU3BhY2VDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIC8vIEZJWE1FIGlmIHl1djJ5dXZfcGFzc3Rocm91Z2gsIGRvbid0IGdldCBhIG5ldyBidWZmZXIgYnV0IHVzZSB0aGUKKyAgICAvLyBpbnB1dCBvbmUgaWYgaXQgaXMgd3JpdGFibGUgKk9SKiB0aGUgYWN0dWFsIGxpdGVyYWwgdmFsdWVzIG9mIGluXyoKKyAgICAvLyBhbmQgb3V0XyogYXJlIGlkZW50aWNhbCAobm90IGp1c3QgdGhlaXIgcmVzcGVjdGl2ZSBwcm9wZXJ0aWVzKQorICAgIEFWRnJhbWUgKm91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaW50IHJlczsKKyAgICBwdHJkaWZmX3QgcmdiX3N0cmlkZSA9IEZGQUxJR04oaW4tPndpZHRoICogc2l6ZW9mKGludDE2X3QpLCAzMik7CisgICAgdW5zaWduZWQgcmdiX3N6ID0gcmdiX3N0cmlkZSAqIGluLT5oZWlnaHQ7CisgICAgc3RydWN0IFRocmVhZERhdGEgdGQ7CisKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJlcyA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG91dC0+Y29sb3JfcHJpbWFyaWVzID0gcy0+dXNlcl9wcm0gPT0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJtW0ZGTUlOKHMtPnVzZXJfYWxsLCBDU19OQildIDogcy0+dXNlcl9wcm07CisgICAgaWYgKHMtPnVzZXJfdHJjID09IEFWQ09MX1RSQ19VTlNQRUNJRklFRCkgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dC0+Zm9ybWF0KTsKKworICAgICAgICBvdXQtPmNvbG9yX3RyYyAgID0gZGVmYXVsdF90cmNbRkZNSU4ocy0+dXNlcl9hbGwsIENTX05CKV07CisgICAgICAgIGlmIChvdXQtPmNvbG9yX3RyYyA9PSBBVkNPTF9UUkNfQlQyMDIwXzEwICYmIGRlc2MgJiYgZGVzYy0+Y29tcFswXS5kZXB0aCA+PSAxMikKKyAgICAgICAgICAgIG91dC0+Y29sb3JfdHJjID0gQVZDT0xfVFJDX0JUMjAyMF8xMjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQtPmNvbG9yX3RyYyAgID0gcy0+dXNlcl90cmM7CisgICAgfQorICAgIG91dC0+Y29sb3JzcGFjZSAgICAgID0gcy0+dXNlcl9jc3AgPT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfY3NwW0ZGTUlOKHMtPnVzZXJfYWxsLCBDU19OQildIDogcy0+dXNlcl9jc3A7CisgICAgb3V0LT5jb2xvcl9yYW5nZSAgICAgPSBzLT51c2VyX3JuZyA9PSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+Y29sb3JfcmFuZ2UgOiBzLT51c2VyX3JuZzsKKyAgICBpZiAocmdiX3N6ICE9IHMtPnJnYl9zeikgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dC0+Zm9ybWF0KTsKKyAgICAgICAgaW50IHV2dyA9IGluLT53aWR0aCA+PiBkZXNjLT5sb2cyX2Nocm9tYV93OworCisgICAgICAgIGF2X2ZyZWVwKCZzLT5yZ2JbMF0pOworICAgICAgICBhdl9mcmVlcCgmcy0+cmdiWzFdKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPnJnYlsyXSk7CisgICAgICAgIHMtPnJnYl9zeiA9IDA7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzBdWzBdKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMF1bMV0pOworICAgICAgICBhdl9mcmVlcCgmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsxXVswXSk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzFdWzFdKTsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMl1bMF0pOworICAgICAgICBhdl9mcmVlcCgmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsyXVsxXSk7CisKKyAgICAgICAgcy0+cmdiWzBdID0gYXZfbWFsbG9jKHJnYl9zeik7CisgICAgICAgIHMtPnJnYlsxXSA9IGF2X21hbGxvYyhyZ2Jfc3opOworICAgICAgICBzLT5yZ2JbMl0gPSBhdl9tYWxsb2MocmdiX3N6KTsKKyAgICAgICAgcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVswXVswXSA9CisgICAgICAgICAgICBhdl9tYWxsb2Moc2l6ZW9mKCpzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzBdWzBdKSAqIChpbi0+d2lkdGggKyA0KSk7CisgICAgICAgIHMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMF1bMV0gPQorICAgICAgICAgICAgYXZfbWFsbG9jKHNpemVvZigqcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVswXVsxXSkgKiAoaW4tPndpZHRoICsgNCkpOworICAgICAgICBzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzFdWzBdID0KKyAgICAgICAgICAgIGF2X21hbGxvYyhzaXplb2YoKnMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMV1bMF0pICogKHV2dyArIDQpKTsKKyAgICAgICAgcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsxXVsxXSA9CisgICAgICAgICAgICBhdl9tYWxsb2Moc2l6ZW9mKCpzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzFdWzFdKSAqICh1dncgKyA0KSk7CisgICAgICAgIHMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMl1bMF0gPQorICAgICAgICAgICAgYXZfbWFsbG9jKHNpemVvZigqcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsyXVswXSkgKiAodXZ3ICsgNCkpOworICAgICAgICBzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzJdWzFdID0KKyAgICAgICAgICAgIGF2X21hbGxvYyhzaXplb2YoKnMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMl1bMV0pICogKHV2dyArIDQpKTsKKyAgICAgICAgcy0+ZGl0aGVyX3NjcmF0Y2hbMF1bMF0gPSAmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVswXVswXVsxXTsKKyAgICAgICAgcy0+ZGl0aGVyX3NjcmF0Y2hbMF1bMV0gPSAmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVswXVsxXVsxXTsKKyAgICAgICAgcy0+ZGl0aGVyX3NjcmF0Y2hbMV1bMF0gPSAmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsxXVswXVsxXTsKKyAgICAgICAgcy0+ZGl0aGVyX3NjcmF0Y2hbMV1bMV0gPSAmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsxXVsxXVsxXTsKKyAgICAgICAgcy0+ZGl0aGVyX3NjcmF0Y2hbMl1bMF0gPSAmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsyXVswXVsxXTsKKyAgICAgICAgcy0+ZGl0aGVyX3NjcmF0Y2hbMl1bMV0gPSAmcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVsyXVsxXVsxXTsKKyAgICAgICAgaWYgKCFzLT5yZ2JbMF0gfHwgIXMtPnJnYlsxXSB8fCAhcy0+cmdiWzJdIHx8CisgICAgICAgICAgICAhcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVswXVswXSB8fCAhcy0+ZGl0aGVyX3NjcmF0Y2hfYmFzZVswXVsxXSB8fAorICAgICAgICAgICAgIXMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMV1bMF0gfHwgIXMtPmRpdGhlcl9zY3JhdGNoX2Jhc2VbMV1bMV0gfHwKKyAgICAgICAgICAgICFzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzJdWzBdIHx8ICFzLT5kaXRoZXJfc2NyYXRjaF9iYXNlWzJdWzFdKSB7CisgICAgICAgICAgICB1bmluaXQoY3R4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgcy0+cmdiX3N6ID0gcmdiX3N6OworICAgIH0KKyAgICByZXMgPSBjcmVhdGVfZmlsdGVyZ3JhcGgoY3R4LCBpbiwgb3V0KTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBzLT5yZ2Jfc3RyaWRlID0gcmdiX3N0cmlkZSAvIHNpemVvZihpbnQxNl90KTsKKyAgICB0ZC5pbiA9IGluOworICAgIHRkLm91dCA9IG91dDsKKyAgICB0ZC5pbl9saW5lc2l6ZVswXSA9IGluLT5saW5lc2l6ZVswXTsKKyAgICB0ZC5pbl9saW5lc2l6ZVsxXSA9IGluLT5saW5lc2l6ZVsxXTsKKyAgICB0ZC5pbl9saW5lc2l6ZVsyXSA9IGluLT5saW5lc2l6ZVsyXTsKKyAgICB0ZC5vdXRfbGluZXNpemVbMF0gPSBvdXQtPmxpbmVzaXplWzBdOworICAgIHRkLm91dF9saW5lc2l6ZVsxXSA9IG91dC0+bGluZXNpemVbMV07CisgICAgdGQub3V0X2xpbmVzaXplWzJdID0gb3V0LT5saW5lc2l6ZVsyXTsKKyAgICB0ZC5pbl9zc19oID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbi0+Zm9ybWF0KS0+bG9nMl9jaHJvbWFfaDsKKyAgICB0ZC5vdXRfc3NfaCA9IGF2X3BpeF9mbXRfZGVzY19nZXQob3V0LT5mb3JtYXQpLT5sb2cyX2Nocm9tYV9oOworICAgIGlmIChzLT55dXYyeXV2X3Bhc3N0aHJvdWdoKSB7CisgICAgICAgIHJlcyA9IGF2X2ZyYW1lX2NvcHkob3V0LCBpbik7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgY29udmVydCwgJnRkLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKChpbi0+aGVpZ2h0ICsgMSkgPj4gMSwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKKyAgICB9CisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgIEFWX1BJWF9GTVRfWVVWSjQyMlAsICBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIGludCByZXM7CisgICAgQ29sb3JTcGFjZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKHMtPnVzZXJfZm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworICAgIHJlcyA9IGZmX2Zvcm1hdHNfcmVmKGZvcm1hdHMsICZjdHgtPmlucHV0c1swXS0+b3V0X2Zvcm1hdHMpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworICAgIGZvcm1hdHMgPSBOVUxMOworICAgIHJlcyA9IGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIHMtPnVzZXJfZm9ybWF0KTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIHJldHVybiBmZl9mb3JtYXRzX3JlZihmb3JtYXRzLCAmY3R4LT5vdXRwdXRzWzBdLT5pbl9mb3JtYXRzKTsKK30KKworc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisKKyAgICBpZiAoaW5saW5rLT53ICUgMiB8fCBpbmxpbmstPmggJSAyKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgb2RkIHNpemUgKCVkeCVkKVxuIiwKKyAgICAgICAgICAgICAgIGlubGluay0+dywgaW5saW5rLT5oKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKworICAgIG91dGxpbmstPncgPSBpbmxpbmstPnc7CisgICAgb3V0bGluay0+aCA9IGlubGluay0+aDsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENvbG9yU3BhY2VDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19WSURFT19QQVJBTQorI2RlZmluZSBFTlVNKHgsIHksIHopIHsgeCwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSB5IH0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCB6IH0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNvbG9yc3BhY2Vfb3B0aW9uc1tdID0geworICAgIHsgImFsbCIsICAgICAgICAiU2V0IGFsbCBjb2xvciBwcm9wZXJ0aWVzIHRvZ2V0aGVyIiwKKyAgICAgIE9GRlNFVCh1c2VyX2FsbCksICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBDU19VTlNQRUNJRklFRCB9LAorICAgICAgQ1NfVU5TUEVDSUZJRUQsIENTX05CIC0gMSwgRkxBR1MsICJhbGwiIH0sCisgICAgRU5VTSgiYnQ0NzBtIiwgICAgICBDU19CVDQ3ME0sICAgICAgICAgICAgICJhbGwiKSwKKyAgICBFTlVNKCJidDQ3MGJnIiwgICAgIENTX0JUNDcwQkcsICAgICAgICAgICAgImFsbCIpLAorICAgIEVOVU0oImJ0NjAxLTYtNTI1IiwgQ1NfQlQ2MDFfNl81MjUsICAgICAgICAiYWxsIiksCisgICAgRU5VTSgiYnQ2MDEtNi02MjUiLCBDU19CVDYwMV82XzYyNSwgICAgICAgICJhbGwiKSwKKyAgICBFTlVNKCJidDcwOSIsICAgICAgIENTX0JUNzA5LCAgICAgICAgICAgICAgImFsbCIpLAorICAgIEVOVU0oInNtcHRlMTcwbSIsICAgQ1NfU01QVEUxNzBNLCAgICAgICAgICAiYWxsIiksCisgICAgRU5VTSgic21wdGUyNDBtIiwgICBDU19TTVBURTI0ME0sICAgICAgICAgICJhbGwiKSwKKyAgICBFTlVNKCJidDIwMjAiLCAgICAgIENTX0JUMjAyMCwgICAgICAgICAgICAgImFsbCIpLAorCisgICAgeyAic3BhY2UiLCAgICAgICJPdXRwdXQgY29sb3JzcGFjZSIsCisgICAgICBPRkZTRVQodXNlcl9jc3ApLCAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEIH0sCisgICAgICBBVkNPTF9TUENfUkdCLCBBVkNPTF9TUENfTkIgLSAxLCBGTEFHUywgICJjc3AifSwKKyAgICBFTlVNKCJidDcwOSIsICAgICAgIEFWQ09MX1NQQ19CVDcwOSwgICAgICAgImNzcCIpLAorICAgIEVOVU0oImZjYyIsICAgICAgICAgQVZDT0xfU1BDX0ZDQywgICAgICAgICAiY3NwIiksCisgICAgRU5VTSgiYnQ0NzBiZyIsICAgICBBVkNPTF9TUENfQlQ0NzBCRywgICAgICJjc3AiKSwKKyAgICBFTlVNKCJzbXB0ZTE3MG0iLCAgIEFWQ09MX1NQQ19TTVBURTE3ME0sICAgImNzcCIpLAorICAgIEVOVU0oInNtcHRlMjQwbSIsICAgQVZDT0xfU1BDX1NNUFRFMjQwTSwgICAiY3NwIiksCisgICAgRU5VTSgieWNnY28iLCAgICAgICBBVkNPTF9TUENfWUNHQ08sICAgICAgICJjc3AiKSwKKyAgICBFTlVNKCJnYnIiLCAgICAgICAgIEFWQ09MX1NQQ19SR0IsICAgICAgICAgImNzcCIpLAorICAgIEVOVU0oImJ0MjAyMG5jIiwgICAgQVZDT0xfU1BDX0JUMjAyMF9OQ0wsICAiY3NwIiksCisgICAgRU5VTSgiYnQyMDIwbmNsIiwgICBBVkNPTF9TUENfQlQyMDIwX05DTCwgICJjc3AiKSwKKworICAgIHsgInJhbmdlIiwgICAgICAiT3V0cHV0IGNvbG9yIHJhbmdlIiwKKyAgICAgIE9GRlNFVCh1c2VyX3JuZyksICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCB9LAorICAgICAgQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQsIEFWQ09MX1JBTkdFX05CIC0gMSwgRkxBR1MsICJybmciIH0sCisgICAgRU5VTSgidHYiLCAgICAgICAgICBBVkNPTF9SQU5HRV9NUEVHLCAgICAgICJybmciKSwKKyAgICBFTlVNKCJtcGVnIiwgICAgICAgIEFWQ09MX1JBTkdFX01QRUcsICAgICAgInJuZyIpLAorICAgIEVOVU0oInBjIiwgICAgICAgICAgQVZDT0xfUkFOR0VfSlBFRywgICAgICAicm5nIiksCisgICAgRU5VTSgianBlZyIsICAgICAgICBBVkNPTF9SQU5HRV9KUEVHLCAgICAgICJybmciKSwKKworICAgIHsgInByaW1hcmllcyIsICAiT3V0cHV0IGNvbG9yIHByaW1hcmllcyIsCisgICAgICBPRkZTRVQodXNlcl9wcm0pLCAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEIH0sCisgICAgICBBVkNPTF9QUklfUkVTRVJWRUQwLCBBVkNPTF9QUklfTkIgLSAxLCBGTEFHUywgInBybSIgfSwKKyAgICBFTlVNKCJidDcwOSIsICAgICAgICBBVkNPTF9QUklfQlQ3MDksICAgICAgInBybSIpLAorICAgIEVOVU0oImJ0NDcwbSIsICAgICAgIEFWQ09MX1BSSV9CVDQ3ME0sICAgICAicHJtIiksCisgICAgRU5VTSgiYnQ0NzBiZyIsICAgICAgQVZDT0xfUFJJX0JUNDcwQkcsICAgICJwcm0iKSwKKyAgICBFTlVNKCJzbXB0ZTE3MG0iLCAgICBBVkNPTF9QUklfU01QVEUxNzBNLCAgInBybSIpLAorICAgIEVOVU0oInNtcHRlMjQwbSIsICAgIEFWQ09MX1BSSV9TTVBURTI0ME0sICAicHJtIiksCisgICAgRU5VTSgic21wdGU0MjgiLCAgICAgQVZDT0xfUFJJX1NNUFRFNDI4LCAgICJwcm0iKSwKKyAgICBFTlVNKCJmaWxtIiwgICAgICAgICBBVkNPTF9QUklfRklMTSwgICAgICAgInBybSIpLAorICAgIEVOVU0oInNtcHRlNDMxIiwgICAgIEFWQ09MX1BSSV9TTVBURTQzMSwgICAicHJtIiksCisgICAgRU5VTSgic21wdGU0MzIiLCAgICAgQVZDT0xfUFJJX1NNUFRFNDMyLCAgICJwcm0iKSwKKyAgICBFTlVNKCJidDIwMjAiLCAgICAgICBBVkNPTF9QUklfQlQyMDIwLCAgICAgInBybSIpLAorICAgIEVOVU0oImplZGVjLXAyMiIsICAgIEFWQ09MX1BSSV9KRURFQ19QMjIsICAicHJtIiksCisKKyAgICB7ICJ0cmMiLCAgICAgICAgIk91dHB1dCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MiLAorICAgICAgT0ZGU0VUKHVzZXJfdHJjKSwgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEFWQ09MX1RSQ19VTlNQRUNJRklFRCB9LAorICAgICAgQVZDT0xfVFJDX1JFU0VSVkVEMCwgQVZDT0xfVFJDX05CIC0gMSwgRkxBR1MsICJ0cmMiIH0sCisgICAgRU5VTSgiYnQ3MDkiLCAgICAgICAgQVZDT0xfVFJDX0JUNzA5LCAgICAgICAgInRyYyIpLAorICAgIEVOVU0oImJ0NDcwbSIsICAgICAgIEFWQ09MX1RSQ19HQU1NQTIyLCAgICAgICJ0cmMiKSwKKyAgICBFTlVNKCJnYW1tYTIyIiwgICAgICBBVkNPTF9UUkNfR0FNTUEyMiwgICAgICAidHJjIiksCisgICAgRU5VTSgiYnQ0NzBiZyIsICAgICAgQVZDT0xfVFJDX0dBTU1BMjgsICAgICAgInRyYyIpLAorICAgIEVOVU0oImdhbW1hMjgiLCAgICAgIEFWQ09MX1RSQ19HQU1NQTI4LCAgICAgICJ0cmMiKSwKKyAgICBFTlVNKCJzbXB0ZTE3MG0iLCAgICBBVkNPTF9UUkNfU01QVEUxNzBNLCAgICAidHJjIiksCisgICAgRU5VTSgic21wdGUyNDBtIiwgICAgQVZDT0xfVFJDX1NNUFRFMjQwTSwgICAgInRyYyIpLAorICAgIEVOVU0oInNyZ2IiLCAgICAgICAgIEFWQ09MX1RSQ19JRUM2MTk2Nl8yXzEsICJ0cmMiKSwKKyAgICBFTlVNKCJpZWM2MTk2Ni0yLTEiLCBBVkNPTF9UUkNfSUVDNjE5NjZfMl8xLCAidHJjIiksCisgICAgRU5VTSgieHZ5Y2MiLCAgICAgICAgQVZDT0xfVFJDX0lFQzYxOTY2XzJfNCwgInRyYyIpLAorICAgIEVOVU0oImllYzYxOTY2LTItNCIsIEFWQ09MX1RSQ19JRUM2MTk2Nl8yXzQsICJ0cmMiKSwKKyAgICBFTlVNKCJidDIwMjAtMTAiLCAgICBBVkNPTF9UUkNfQlQyMDIwXzEwLCAgICAidHJjIiksCisgICAgRU5VTSgiYnQyMDIwLTEyIiwgICAgQVZDT0xfVFJDX0JUMjAyMF8xMiwgICAgInRyYyIpLAorCisgICAgeyAiZm9ybWF0IiwgICAiT3V0cHV0IHBpeGVsIGZvcm1hdCIsCisgICAgICBPRkZTRVQodXNlcl9mb3JtYXQpLCBBVl9PUFRfVFlQRV9JTlQsICB7IC5pNjQgPSBBVl9QSVhfRk1UX05PTkUgfSwKKyAgICAgIEFWX1BJWF9GTVRfTk9ORSwgQVZfUElYX0ZNVF9HQlJBUDEyTEUsIEZMQUdTLCAiZm10IiB9LAorICAgIEVOVU0oInl1djQyMHAiLCAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgICAiZm10IiksCisgICAgRU5VTSgieXV2NDIwcDEwIiwgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsICJmbXQiKSwKKyAgICBFTlVNKCJ5dXY0MjBwMTIiLCBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgImZtdCIpLAorICAgIEVOVU0oInl1djQyMnAiLCAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgICAiZm10IiksCisgICAgRU5VTSgieXV2NDIycDEwIiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsICJmbXQiKSwKKyAgICBFTlVNKCJ5dXY0MjJwMTIiLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgImZtdCIpLAorICAgIEVOVU0oInl1djQ0NHAiLCAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgICAiZm10IiksCisgICAgRU5VTSgieXV2NDQ0cDEwIiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsICJmbXQiKSwKKyAgICBFTlVNKCJ5dXY0NDRwMTIiLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgImZtdCIpLAorCisgICAgeyAiZmFzdCIsICAgICAiSWdub3JlIHByaW1hcnkgY2hyb21hdGljaXR5IGFuZCBnYW1tYSBjb3JyZWN0aW9uIiwKKyAgICAgIE9GRlNFVChmYXN0X21vZGUpLCBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCAgICB9LAorICAgICAgMCwgMSwgRkxBR1MgfSwKKworICAgIHsgImRpdGhlciIsICAgIkRpdGhlcmluZyBtb2RlIiwKKyAgICAgIE9GRlNFVChkaXRoZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IERJVEhFUl9OT05FIH0sCisgICAgICBESVRIRVJfTk9ORSwgRElUSEVSX05CIC0gMSwgRkxBR1MsICJkaXRoZXIiIH0sCisgICAgRU5VTSgibm9uZSIsIERJVEhFUl9OT05FLCAiZGl0aGVyIiksCisgICAgRU5VTSgiZnNiIiwgIERJVEhFUl9GU0IsICAiZGl0aGVyIiksCisKKyAgICB7ICJ3cGFkYXB0IiwgIldoaXRlcG9pbnQgYWRhcHRhdGlvbiBtZXRob2QiLAorICAgICAgT0ZGU0VUKHdwX2FkYXB0KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBXUF9BREFQVF9CUkFERk9SRCB9LAorICAgICAgV1BfQURBUFRfQlJBREZPUkQsIE5CX1dQX0FEQVBUIC0gMSwgRkxBR1MsICJ3cGFkYXB0IiB9LAorICAgIEVOVU0oImJyYWRmb3JkIiwgV1BfQURBUFRfQlJBREZPUkQsICJ3cGFkYXB0IiksCisgICAgRU5VTSgidm9ua3JpZXMiLCBXUF9BREFQVF9WT05fS1JJRVMsICJ3cGFkYXB0IiksCisgICAgRU5VTSgiaWRlbnRpdHkiLCBXUF9BREFQVF9JREVOVElUWSwgIndwYWRhcHQiKSwKKworICAgIHsgImlhbGwiLCAgICAgICAiU2V0IGFsbCBpbnB1dCBjb2xvciBwcm9wZXJ0aWVzIHRvZ2V0aGVyIiwKKyAgICAgIE9GRlNFVCh1c2VyX2lhbGwpLCAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gQ1NfVU5TUEVDSUZJRUQgfSwKKyAgICAgIENTX1VOU1BFQ0lGSUVELCBDU19OQiAtIDEsIEZMQUdTLCAiYWxsIiB9LAorICAgIHsgImlzcGFjZSIsICAgICAiSW5wdXQgY29sb3JzcGFjZSIsCisgICAgICBPRkZTRVQodXNlcl9pY3NwKSwgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEIH0sCisgICAgICBBVkNPTF9QUklfUkVTRVJWRUQwLCBBVkNPTF9QUklfTkIgLSAxLCBGTEFHUywgImNzcCIgfSwKKyAgICB7ICJpcmFuZ2UiLCAgICAgIklucHV0IGNvbG9yIHJhbmdlIiwKKyAgICAgIE9GRlNFVCh1c2VyX2lybmcpLCAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCB9LAorICAgICAgQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQsIEFWQ09MX1JBTkdFX05CIC0gMSwgRkxBR1MsICJybmciIH0sCisgICAgeyAiaXByaW1hcmllcyIsICJJbnB1dCBjb2xvciBwcmltYXJpZXMiLAorICAgICAgT0ZGU0VUKHVzZXJfaXBybSksICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB9LAorICAgICAgQVZDT0xfUFJJX1JFU0VSVkVEMCwgQVZDT0xfUFJJX05CIC0gMSwgRkxBR1MsICJwcm0iIH0sCisgICAgeyAiaXRyYyIsICAgICAgICJJbnB1dCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MiLAorICAgICAgT0ZGU0VUKHVzZXJfaXRyYyksICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEFWQ09MX1RSQ19VTlNQRUNJRklFRCB9LAorICAgICAgQVZDT0xfVFJDX1JFU0VSVkVEMCwgQVZDT0xfVFJDX05CIC0gMSwgRkxBR1MsICJ0cmMiIH0sCisKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGNvbG9yc3BhY2UpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2NvbG9yc3BhY2UgPSB7CisgICAgLm5hbWUgICAgICAgICAgICA9ICJjb2xvcnNwYWNlIiwKKyAgICAuZGVzY3JpcHRpb24gICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbnZlcnQgYmV0d2VlbiBjb2xvcnNwYWNlcy4iKSwKKyAgICAuaW5pdCAgICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzICAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgICAgPSBzaXplb2YoQ29sb3JTcGFjZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICAgPSAmY29sb3JzcGFjZV9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgICAgPSBvdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQyB8IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jb252b2x1dGlvbi5jIGIvbGliYXZmaWx0ZXIvdmZfY29udm9sdXRpb24uYwppbmRleCAyMzgwY2RjLi5jZTA5ZTMzIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9jb252b2x1dGlvbi5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2NvbnZvbHV0aW9uLmMKQEAgLTM0LDE3ICszNCwyNSBAQAogICAgIGNoYXIgKm1hdHJpeF9zdHJbNF07CiAgICAgZmxvYXQgcmRpdls0XTsKICAgICBmbG9hdCBiaWFzWzRdOworICAgIGZsb2F0IHNjYWxlOworICAgIGZsb2F0IGRlbHRhOworICAgIGludCBwbGFuZXM7CiAKKyAgICBpbnQgc2l6ZVs0XTsKKyAgICBpbnQgZGVwdGg7CisgICAgaW50IGJwYzsKICAgICBpbnQgYnN0cmlkZTsKICAgICB1aW50OF90ICpidWZmZXI7CisgICAgdWludDhfdCAqKmJwdHJzOwogICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IG5iX3RocmVhZHM7CiAgICAgaW50IHBsYW5ld2lkdGhbNF07CiAgICAgaW50IHBsYW5laGVpZ2h0WzRdOwotICAgIGludCBtYXRyaXhbNF1bMjVdOworICAgIGludCBtYXRyaXhbNF1bNDldOwogICAgIGludCBtYXRyaXhfbGVuZ3RoWzRdOwogICAgIGludCBjb3B5WzRdOwogCi0gICAgdm9pZCAoKmZpbHRlcls0XSkoc3RydWN0IENvbnZvbHV0aW9uQ29udGV4dCAqcywgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwgaW50IHBsYW5lKTsKKyAgICBpbnQgKCpmaWx0ZXJbNF0pKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpOwogfSBDb252b2x1dGlvbkNvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENvbnZvbHV0aW9uQ29udGV4dCwgeCkKQEAgLTc4LDQ0ICs4Niw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwfTsKIAorc3RhdGljIGNvbnN0IGludCBzYW1lN3g3WzQ5XSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAxLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKKwogc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewogICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKLSAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQyMlAsCi0gICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWNDQwUCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQwUCwKLSAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDExUCwKLSAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCBBVl9QSVhfRk1UX1lVVjQ0MFAsCi0gICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwKLSAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTIsIEFWX1BJWF9GTVRfR0JSQVAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKIAogICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7CiB9CiAKLXN0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQotewotICAgIENvbnZvbHV0aW9uQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OwotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOwotICAgIGludCByZXQ7Ci0KLSAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKHMtPnBsYW5ld2lkdGgsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBzLT5wbGFuZWhlaWdodFsxXSA9IHMtPnBsYW5laGVpZ2h0WzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKLSAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOwotCi0gICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOwotCi0gICAgcy0+YnN0cmlkZSA9IHMtPnBsYW5ld2lkdGhbMF0gKyAzMjsKLSAgICBzLT5idWZmZXIgPSBhdl9tYWxsb2MoNSAqIHMtPmJzdHJpZGUpOwotICAgIGlmICghcy0+YnVmZmVyKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBsaW5lX2NvcHk4KHVpbnQ4X3QgKmxpbmUsIGNvbnN0IHVpbnQ4X3QgKnNyY3AsIGludCB3aWR0aCwgaW50IG1lcmdpbikKIHsKICAgICBpbnQgaTsKQEAgLTEyOCwxNSArMTMyLDU1OCBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZmlsdGVyXzN4MyhDb252b2x1dGlvbkNvbnRleHQgKnMsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsIGludCBwbGFuZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaW5lX2NvcHkxNih1aW50MTZfdCAqbGluZSwgY29uc3QgdWludDE2X3QgKnNyY3AsIGludCB3aWR0aCwgaW50IG1lcmdpbikKIHsKLSAgICBjb25zdCB1aW50OF90ICpzcmMgPSBpbi0+ZGF0YVtwbGFuZV07Ci0gICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhW3BsYW5lXTsKKyAgICBpbnQgaTsKKworICAgIG1lbWNweShsaW5lLCBzcmNwLCB3aWR0aCAqIDIpOworCisgICAgZm9yIChpID0gbWVyZ2luOyBpID4gMDsgaS0tKSB7CisgICAgICAgIGxpbmVbLWldID0gbGluZVtpXTsKKyAgICAgICAgbGluZVt3aWR0aCAtIDEgKyBpXSA9IGxpbmVbd2lkdGggLSAxIC0gaV07CisgICAgfQorfQorCit0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKKyAgICBBVkZyYW1lICppbiwgKm91dDsKKyAgICBpbnQgcGxhbmU7Cit9IFRocmVhZERhdGE7CisKK3N0YXRpYyBpbnQgZmlsdGVyMTZfcHJld2l0dChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIENvbnZvbHV0aW9uQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCBwbGFuZSA9IHRkLT5wbGFuZTsKKyAgICBjb25zdCBpbnQgcGVhayA9ICgxIDw8IHMtPmRlcHRoKSAtIDE7CisgICAgY29uc3QgaW50IHN0cmlkZSA9IGluLT5saW5lc2l6ZVtwbGFuZV0gLyAyOworICAgIGNvbnN0IGludCBic3RyaWRlID0gcy0+YnN0cmlkZTsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcy0+cGxhbmVoZWlnaHRbcGxhbmVdOworICAgIGNvbnN0IGludCB3aWR0aCAgPSBzLT5wbGFuZXdpZHRoW3BsYW5lXTsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaGVpZ2h0ICogam9ibnIpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kID0gKGhlaWdodCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKilpbi0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIHN0cmlkZTsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW3BsYW5lXSArIHNsaWNlX3N0YXJ0ICogKG91dC0+bGluZXNpemVbcGxhbmVdIC8gMik7CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSBzLT5zY2FsZTsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IHMtPmRlbHRhOworICAgIHVpbnQxNl90ICpwMCA9ICh1aW50MTZfdCAqKXMtPmJwdHJzW2pvYm5yXSArIDE2OworICAgIHVpbnQxNl90ICpwMSA9IHAwICsgYnN0cmlkZTsKKyAgICB1aW50MTZfdCAqcDIgPSBwMSArIGJzdHJpZGU7CisgICAgdWludDE2X3QgKm9yaWcgPSBwMCwgKmVuZCA9IHAyOworICAgIGludCB5LCB4OworCisgICAgbGluZV9jb3B5MTYocDAsIHNyYyArIHN0cmlkZSAqIChzbGljZV9zdGFydCA9PSAwID8gMSA6IC0xKSwgd2lkdGgsIDEpOworICAgIGxpbmVfY29weTE2KHAxLCBzcmMsIHdpZHRoLCAxKTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgc3JjICs9IHN0cmlkZSAqICh5IDwgaGVpZ2h0IC0gMSA/IDEgOiAtMSk7CisgICAgICAgIGxpbmVfY29weTE2KHAyLCBzcmMsIHdpZHRoLCAxKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHN1bWEgPSBwMFt4IC0gMV0gKiAtMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAwW3hdICogICAgIC0xICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDBbeCArIDFdICogLTEgKworICAgICAgICAgICAgICAgICAgICAgICBwMlt4IC0gMV0gKiAgMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAyW3hdICogICAgICAxICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDJbeCArIDFdICogIDE7CisgICAgICAgICAgICBpbnQgc3VtYiA9IHAwW3ggLSAxXSAqIC0xICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDBbeCArIDFdICogIDEgKworICAgICAgICAgICAgICAgICAgICAgICBwMVt4IC0gMV0gKiAtMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAxW3ggKyAxXSAqICAxICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDJbeCAtIDFdICogLTEgKworICAgICAgICAgICAgICAgICAgICAgICBwMlt4ICsgMV0gKiAgMTsKKworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcChzcXJ0KHN1bWEqc3VtYSArIHN1bWIqc3VtYikgKiBzY2FsZSArIGRlbHRhLCAwLCBwZWFrKTsKKyAgICAgICAgfQorCisgICAgICAgIHAwID0gcDE7CisgICAgICAgIHAxID0gcDI7CisgICAgICAgIHAyID0gKHAyID09IGVuZCkgPyBvcmlnOiBwMiArIGJzdHJpZGU7CisgICAgICAgIGRzdCArPSBvdXQtPmxpbmVzaXplW3BsYW5lXSAvIDI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyMTZfcm9iZXJ0cyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIENvbnZvbHV0aW9uQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCBwbGFuZSA9IHRkLT5wbGFuZTsKKyAgICBjb25zdCBpbnQgcGVhayA9ICgxIDw8IHMtPmRlcHRoKSAtIDE7CisgICAgY29uc3QgaW50IHN0cmlkZSA9IGluLT5saW5lc2l6ZVtwbGFuZV0gLyAyOworICAgIGNvbnN0IGludCBic3RyaWRlID0gcy0+YnN0cmlkZTsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcy0+cGxhbmVoZWlnaHRbcGxhbmVdOworICAgIGNvbnN0IGludCB3aWR0aCAgPSBzLT5wbGFuZXdpZHRoW3BsYW5lXTsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaGVpZ2h0ICogam9ibnIpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kID0gKGhlaWdodCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKilpbi0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIHN0cmlkZTsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW3BsYW5lXSArIHNsaWNlX3N0YXJ0ICogKG91dC0+bGluZXNpemVbcGxhbmVdIC8gMik7CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSBzLT5zY2FsZTsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IHMtPmRlbHRhOworICAgIHVpbnQxNl90ICpwMCA9ICh1aW50MTZfdCAqKXMtPmJwdHJzW2pvYm5yXSArIDE2OworICAgIHVpbnQxNl90ICpwMSA9IHAwICsgYnN0cmlkZTsKKyAgICB1aW50MTZfdCAqcDIgPSBwMSArIGJzdHJpZGU7CisgICAgdWludDE2X3QgKm9yaWcgPSBwMCwgKmVuZCA9IHAyOworICAgIGludCB5LCB4OworCisgICAgbGluZV9jb3B5MTYocDAsIHNyYyArIHN0cmlkZSAqIChzbGljZV9zdGFydCA9PSAwID8gMSA6IC0xKSwgd2lkdGgsIDEpOworICAgIGxpbmVfY29weTE2KHAxLCBzcmMsIHdpZHRoLCAxKTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgc3JjICs9IHN0cmlkZSAqICh5IDwgaGVpZ2h0IC0gMSA/IDEgOiAtMSk7CisgICAgICAgIGxpbmVfY29weTE2KHAyLCBzcmMsIHdpZHRoLCAxKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHN1bWEgPSBwMFt4IC0gMV0gKiAgMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAxW3ggICAgXSAqIC0xOworICAgICAgICAgICAgaW50IHN1bWIgPSBwMFt4ICAgIF0gKiAgMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAxW3ggLSAxXSAqIC0xOworCisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwKHNxcnQoc3VtYSpzdW1hICsgc3VtYipzdW1iKSAqIHNjYWxlICsgZGVsdGEsIDAsIHBlYWspOworICAgICAgICB9CisKKyAgICAgICAgcDAgPSBwMTsKKyAgICAgICAgcDEgPSBwMjsKKyAgICAgICAgcDIgPSAocDIgPT0gZW5kKSA/IG9yaWc6IHAyICsgYnN0cmlkZTsKKyAgICAgICAgZHN0ICs9IG91dC0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXIxNl9zb2JlbChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIENvbnZvbHV0aW9uQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCBwbGFuZSA9IHRkLT5wbGFuZTsKKyAgICBjb25zdCBpbnQgcGVhayA9ICgxIDw8IHMtPmRlcHRoKSAtIDE7CisgICAgY29uc3QgaW50IHN0cmlkZSA9IGluLT5saW5lc2l6ZVtwbGFuZV0gLyAyOworICAgIGNvbnN0IGludCBic3RyaWRlID0gcy0+YnN0cmlkZTsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcy0+cGxhbmVoZWlnaHRbcGxhbmVdOworICAgIGNvbnN0IGludCB3aWR0aCAgPSBzLT5wbGFuZXdpZHRoW3BsYW5lXTsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaGVpZ2h0ICogam9ibnIpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kID0gKGhlaWdodCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKilpbi0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIHN0cmlkZTsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW3BsYW5lXSArIHNsaWNlX3N0YXJ0ICogKG91dC0+bGluZXNpemVbcGxhbmVdIC8gMik7CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSBzLT5zY2FsZTsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IHMtPmRlbHRhOworICAgIHVpbnQxNl90ICpwMCA9ICh1aW50MTZfdCAqKXMtPmJwdHJzW2pvYm5yXSArIDE2OworICAgIHVpbnQxNl90ICpwMSA9IHAwICsgYnN0cmlkZTsKKyAgICB1aW50MTZfdCAqcDIgPSBwMSArIGJzdHJpZGU7CisgICAgdWludDE2X3QgKm9yaWcgPSBwMCwgKmVuZCA9IHAyOworICAgIGludCB5LCB4OworCisgICAgbGluZV9jb3B5MTYocDAsIHNyYyArIHN0cmlkZSAqIChzbGljZV9zdGFydCA9PSAwID8gMSA6IC0xKSwgd2lkdGgsIDEpOworICAgIGxpbmVfY29weTE2KHAxLCBzcmMsIHdpZHRoLCAxKTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgc3JjICs9IHN0cmlkZSAqICh5IDwgaGVpZ2h0IC0gMSA/IDEgOiAtMSk7CisgICAgICAgIGxpbmVfY29weTE2KHAyLCBzcmMsIHdpZHRoLCAxKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHN1bWEgPSBwMFt4IC0gMV0gKiAtMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAwW3hdICogICAgIC0yICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDBbeCArIDFdICogLTEgKworICAgICAgICAgICAgICAgICAgICAgICBwMlt4IC0gMV0gKiAgMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAyW3hdICogICAgICAyICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDJbeCArIDFdICogIDE7CisgICAgICAgICAgICBpbnQgc3VtYiA9IHAwW3ggLSAxXSAqIC0xICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDBbeCArIDFdICogIDEgKworICAgICAgICAgICAgICAgICAgICAgICBwMVt4IC0gMV0gKiAtMiArCisgICAgICAgICAgICAgICAgICAgICAgIHAxW3ggKyAxXSAqICAyICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDJbeCAtIDFdICogLTEgKworICAgICAgICAgICAgICAgICAgICAgICBwMlt4ICsgMV0gKiAgMTsKKworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcChzcXJ0KHN1bWEqc3VtYSArIHN1bWIqc3VtYikgKiBzY2FsZSArIGRlbHRhLCAwLCBwZWFrKTsKKyAgICAgICAgfQorCisgICAgICAgIHAwID0gcDE7CisgICAgICAgIHAxID0gcDI7CisgICAgICAgIHAyID0gKHAyID09IGVuZCkgPyBvcmlnOiBwMiArIGJzdHJpZGU7CisgICAgICAgIGRzdCArPSBvdXQtPmxpbmVzaXplW3BsYW5lXSAvIDI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3ByZXdpdHQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CiAgICAgY29uc3QgaW50IHN0cmlkZSA9IGluLT5saW5lc2l6ZVtwbGFuZV07CiAgICAgY29uc3QgaW50IGJzdHJpZGUgPSBzLT5ic3RyaWRlOwogICAgIGNvbnN0IGludCBoZWlnaHQgPSBzLT5wbGFuZWhlaWdodFtwbGFuZV07CiAgICAgY29uc3QgaW50IHdpZHRoICA9IHMtPnBsYW5ld2lkdGhbcGxhbmVdOwotICAgIHVpbnQ4X3QgKnAwID0gcy0+YnVmZmVyICsgMTY7CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKGhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBpbi0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIHN0cmlkZTsKKyAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGFbcGxhbmVdICsgc2xpY2Vfc3RhcnQgKiBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICBjb25zdCBmbG9hdCBzY2FsZSA9IHMtPnNjYWxlOworICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gcy0+ZGVsdGE7CisgICAgdWludDhfdCAqcDAgPSBzLT5icHRyc1tqb2Jucl0gKyAxNjsKKyAgICB1aW50OF90ICpwMSA9IHAwICsgYnN0cmlkZTsKKyAgICB1aW50OF90ICpwMiA9IHAxICsgYnN0cmlkZTsKKyAgICB1aW50OF90ICpvcmlnID0gcDAsICplbmQgPSBwMjsKKyAgICBpbnQgeSwgeDsKKworICAgIGxpbmVfY29weTgocDAsIHNyYyArIHN0cmlkZSAqIChzbGljZV9zdGFydCA9PSAwID8gMSA6IC0xKSwgd2lkdGgsIDEpOworICAgIGxpbmVfY29weTgocDEsIHNyYywgd2lkdGgsIDEpOworCisgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworICAgICAgICBzcmMgKz0gc3RyaWRlICogKHkgPCBoZWlnaHQgLSAxID8gMSA6IC0xKTsKKyAgICAgICAgbGluZV9jb3B5OChwMiwgc3JjLCB3aWR0aCwgMSk7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCBzdW1hID0gcDBbeCAtIDFdICogLTEgKworICAgICAgICAgICAgICAgICAgICAgICBwMFt4XSAqICAgICAtMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAwW3ggKyAxXSAqIC0xICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDJbeCAtIDFdICogIDEgKworICAgICAgICAgICAgICAgICAgICAgICBwMlt4XSAqICAgICAgMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAyW3ggKyAxXSAqICAxOworICAgICAgICAgICAgaW50IHN1bWIgPSBwMFt4IC0gMV0gKiAtMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAwW3ggKyAxXSAqICAxICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDFbeCAtIDFdICogLTEgKworICAgICAgICAgICAgICAgICAgICAgICBwMVt4ICsgMV0gKiAgMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAyW3ggLSAxXSAqIC0xICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDJbeCArIDFdICogIDE7CisKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfdWludDgoc3FydChzdW1hKnN1bWEgKyBzdW1iKnN1bWIpICogc2NhbGUgKyBkZWx0YSk7CisgICAgICAgIH0KKworICAgICAgICBwMCA9IHAxOworICAgICAgICBwMSA9IHAyOworICAgICAgICBwMiA9IChwMiA9PSBlbmQpID8gb3JpZzogcDIgKyBic3RyaWRlOworICAgICAgICBkc3QgKz0gb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3JvYmVydHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CisgICAgY29uc3QgaW50IHN0cmlkZSA9IGluLT5saW5lc2l6ZVtwbGFuZV07CisgICAgY29uc3QgaW50IGJzdHJpZGUgPSBzLT5ic3RyaWRlOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBzLT5wbGFuZWhlaWdodFtwbGFuZV07CisgICAgY29uc3QgaW50IHdpZHRoICA9IHMtPnBsYW5ld2lkdGhbcGxhbmVdOworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChoZWlnaHQgKiBqb2JucikgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBzbGljZV9lbmQgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgY29uc3QgdWludDhfdCAqc3JjID0gaW4tPmRhdGFbcGxhbmVdICsgc2xpY2Vfc3RhcnQgKiBzdHJpZGU7CisgICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhW3BsYW5lXSArIHNsaWNlX3N0YXJ0ICogb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSBzLT5zY2FsZTsKKyAgICBjb25zdCBmbG9hdCBkZWx0YSA9IHMtPmRlbHRhOworICAgIHVpbnQ4X3QgKnAwID0gcy0+YnB0cnNbam9ibnJdICsgMTY7CisgICAgdWludDhfdCAqcDEgPSBwMCArIGJzdHJpZGU7CisgICAgdWludDhfdCAqcDIgPSBwMSArIGJzdHJpZGU7CisgICAgdWludDhfdCAqb3JpZyA9IHAwLCAqZW5kID0gcDI7CisgICAgaW50IHksIHg7CisKKyAgICBsaW5lX2NvcHk4KHAwLCBzcmMgKyBzdHJpZGUgKiAoc2xpY2Vfc3RhcnQgPT0gMCA/IDEgOiAtMSksIHdpZHRoLCAxKTsKKyAgICBsaW5lX2NvcHk4KHAxLCBzcmMsIHdpZHRoLCAxKTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgc3JjICs9IHN0cmlkZSAqICh5IDwgaGVpZ2h0IC0gMSA/IDEgOiAtMSk7CisgICAgICAgIGxpbmVfY29weTgocDIsIHNyYywgd2lkdGgsIDEpOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgc3VtYSA9IHAwW3ggLSAxXSAqICAxICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDFbeCAgICBdICogLTE7CisgICAgICAgICAgICBpbnQgc3VtYiA9IHAwW3ggICAgXSAqICAxICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDFbeCAtIDFdICogLTE7CisKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfdWludDgoc3FydChzdW1hKnN1bWEgKyBzdW1iKnN1bWIpICogc2NhbGUgKyBkZWx0YSk7CisgICAgICAgIH0KKworICAgICAgICBwMCA9IHAxOworICAgICAgICBwMSA9IHAyOworICAgICAgICBwMiA9IChwMiA9PSBlbmQpID8gb3JpZzogcDIgKyBic3RyaWRlOworICAgICAgICBkc3QgKz0gb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX3NvYmVsKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgQ29udm9sdXRpb25Db250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIEFWRnJhbWUgKmluID0gdGQtPmluOworICAgIEFWRnJhbWUgKm91dCA9IHRkLT5vdXQ7CisgICAgY29uc3QgaW50IHBsYW5lID0gdGQtPnBsYW5lOworICAgIGNvbnN0IGludCBzdHJpZGUgPSBpbi0+bGluZXNpemVbcGxhbmVdOworICAgIGNvbnN0IGludCBic3RyaWRlID0gcy0+YnN0cmlkZTsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcy0+cGxhbmVoZWlnaHRbcGxhbmVdOworICAgIGNvbnN0IGludCB3aWR0aCAgPSBzLT5wbGFuZXdpZHRoW3BsYW5lXTsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaGVpZ2h0ICogam9ibnIpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kID0gKGhlaWdodCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGluLT5kYXRhW3BsYW5lXSArIHNsaWNlX3N0YXJ0ICogc3RyaWRlOworICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIG91dC0+bGluZXNpemVbcGxhbmVdOworICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gcy0+c2NhbGU7CisgICAgY29uc3QgZmxvYXQgZGVsdGEgPSBzLT5kZWx0YTsKKyAgICB1aW50OF90ICpwMCA9IHMtPmJwdHJzW2pvYm5yXSArIDE2OworICAgIHVpbnQ4X3QgKnAxID0gcDAgKyBic3RyaWRlOworICAgIHVpbnQ4X3QgKnAyID0gcDEgKyBic3RyaWRlOworICAgIHVpbnQ4X3QgKm9yaWcgPSBwMCwgKmVuZCA9IHAyOworICAgIGludCB5LCB4OworCisgICAgbGluZV9jb3B5OChwMCwgc3JjICsgc3RyaWRlICogKHNsaWNlX3N0YXJ0ID09IDAgPyAxIDogLTEpLCB3aWR0aCwgMSk7CisgICAgbGluZV9jb3B5OChwMSwgc3JjLCB3aWR0aCwgMSk7CisKKyAgICBmb3IgKHkgPSBzbGljZV9zdGFydDsgeSA8IHNsaWNlX2VuZDsgeSsrKSB7CisgICAgICAgIHNyYyArPSBzdHJpZGUgKiAoeSA8IGhlaWdodCAtIDEgPyAxIDogLTEpOworICAgICAgICBsaW5lX2NvcHk4KHAyLCBzcmMsIHdpZHRoLCAxKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHN1bWEgPSBwMFt4IC0gMV0gKiAtMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAwW3hdICogICAgIC0yICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDBbeCArIDFdICogLTEgKworICAgICAgICAgICAgICAgICAgICAgICBwMlt4IC0gMV0gKiAgMSArCisgICAgICAgICAgICAgICAgICAgICAgIHAyW3hdICogICAgICAyICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDJbeCArIDFdICogIDE7CisgICAgICAgICAgICBpbnQgc3VtYiA9IHAwW3ggLSAxXSAqIC0xICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDBbeCArIDFdICogIDEgKworICAgICAgICAgICAgICAgICAgICAgICBwMVt4IC0gMV0gKiAtMiArCisgICAgICAgICAgICAgICAgICAgICAgIHAxW3ggKyAxXSAqICAyICsKKyAgICAgICAgICAgICAgICAgICAgICAgcDJbeCAtIDFdICogLTEgKworICAgICAgICAgICAgICAgICAgICAgICBwMlt4ICsgMV0gKiAgMTsKKworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF91aW50OChzcXJ0KHN1bWEqc3VtYSArIHN1bWIqc3VtYikgKiBzY2FsZSArIGRlbHRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHAwID0gcDE7CisgICAgICAgIHAxID0gcDI7CisgICAgICAgIHAyID0gKHAyID09IGVuZCkgPyBvcmlnOiBwMiArIGJzdHJpZGU7CisgICAgICAgIGRzdCArPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXIxNl8zeDMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CisgICAgY29uc3QgaW50IHBlYWsgPSAoMSA8PCBzLT5kZXB0aCkgLSAxOworICAgIGNvbnN0IGludCBzdHJpZGUgPSBpbi0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICBjb25zdCBpbnQgYnN0cmlkZSA9IHMtPmJzdHJpZGU7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHMtPnBsYW5laGVpZ2h0W3BsYW5lXTsKKyAgICBjb25zdCBpbnQgd2lkdGggID0gcy0+cGxhbmV3aWR0aFtwbGFuZV07CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKGhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbcGxhbmVdICsgc2xpY2Vfc3RhcnQgKiBzdHJpZGU7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIChvdXQtPmxpbmVzaXplW3BsYW5lXSAvIDIpOworICAgIHVpbnQxNl90ICpwMCA9ICh1aW50MTZfdCAqKXMtPmJwdHJzW2pvYm5yXSArIDE2OworICAgIHVpbnQxNl90ICpwMSA9IHAwICsgYnN0cmlkZTsKKyAgICB1aW50MTZfdCAqcDIgPSBwMSArIGJzdHJpZGU7CisgICAgdWludDE2X3QgKm9yaWcgPSBwMCwgKmVuZCA9IHAyOworICAgIGNvbnN0IGludCAqbWF0cml4ID0gcy0+bWF0cml4W3BsYW5lXTsKKyAgICBjb25zdCBmbG9hdCByZGl2ID0gcy0+cmRpdltwbGFuZV07CisgICAgY29uc3QgZmxvYXQgYmlhcyA9IHMtPmJpYXNbcGxhbmVdOworICAgIGludCB5LCB4OworCisgICAgbGluZV9jb3B5MTYocDAsIHNyYyArIHN0cmlkZSAqIChzbGljZV9zdGFydCA9PSAwID8gMSA6IC0xKSwgd2lkdGgsIDEpOworICAgIGxpbmVfY29weTE2KHAxLCBzcmMsIHdpZHRoLCAxKTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgc3JjICs9IHN0cmlkZSAqICh5IDwgaGVpZ2h0IC0gMSA/IDEgOiAtMSk7CisgICAgICAgIGxpbmVfY29weTE2KHAyLCBzcmMsIHdpZHRoLCAxKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHN1bSA9IHAwW3ggLSAxXSAqIG1hdHJpeFswXSArCisgICAgICAgICAgICAgICAgICAgICAgcDBbeF0gKiAgICAgbWF0cml4WzFdICsKKyAgICAgICAgICAgICAgICAgICAgICBwMFt4ICsgMV0gKiBtYXRyaXhbMl0gKworICAgICAgICAgICAgICAgICAgICAgIHAxW3ggLSAxXSAqIG1hdHJpeFszXSArCisgICAgICAgICAgICAgICAgICAgICAgcDFbeF0gKiAgICAgbWF0cml4WzRdICsKKyAgICAgICAgICAgICAgICAgICAgICBwMVt4ICsgMV0gKiBtYXRyaXhbNV0gKworICAgICAgICAgICAgICAgICAgICAgIHAyW3ggLSAxXSAqIG1hdHJpeFs2XSArCisgICAgICAgICAgICAgICAgICAgICAgcDJbeF0gKiAgICAgbWF0cml4WzddICsKKyAgICAgICAgICAgICAgICAgICAgICBwMlt4ICsgMV0gKiBtYXRyaXhbOF07CisgICAgICAgICAgICBzdW0gPSAoaW50KShzdW0gKiByZGl2ICsgYmlhcyArIDAuNWYpOworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcChzdW0sIDAsIHBlYWspOworICAgICAgICB9CisKKyAgICAgICAgcDAgPSBwMTsKKyAgICAgICAgcDEgPSBwMjsKKyAgICAgICAgcDIgPSAocDIgPT0gZW5kKSA/IG9yaWc6IHAyICsgYnN0cmlkZTsKKyAgICAgICAgZHN0ICs9IG91dC0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXIxNl81eDUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CisgICAgY29uc3QgaW50IHBlYWsgPSAoMSA8PCBzLT5kZXB0aCkgLSAxOworICAgIGNvbnN0IGludCBzdHJpZGUgPSBpbi0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICBjb25zdCBpbnQgYnN0cmlkZSA9IHMtPmJzdHJpZGU7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHMtPnBsYW5laGVpZ2h0W3BsYW5lXTsKKyAgICBjb25zdCBpbnQgd2lkdGggID0gcy0+cGxhbmV3aWR0aFtwbGFuZV07CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKGhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbcGxhbmVdICsgc2xpY2Vfc3RhcnQgKiBzdHJpZGU7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIChvdXQtPmxpbmVzaXplW3BsYW5lXSAvIDIpOworICAgIHVpbnQxNl90ICpwMCA9ICh1aW50MTZfdCAqKXMtPmJwdHJzW2pvYm5yXSArIDE2OworICAgIHVpbnQxNl90ICpwMSA9IHAwICsgYnN0cmlkZTsKKyAgICB1aW50MTZfdCAqcDIgPSBwMSArIGJzdHJpZGU7CisgICAgdWludDE2X3QgKnAzID0gcDIgKyBic3RyaWRlOworICAgIHVpbnQxNl90ICpwNCA9IHAzICsgYnN0cmlkZTsKKyAgICB1aW50MTZfdCAqb3JpZyA9IHAwLCAqZW5kID0gcDQ7CisgICAgY29uc3QgaW50ICptYXRyaXggPSBzLT5tYXRyaXhbcGxhbmVdOworICAgIGZsb2F0IHJkaXYgPSBzLT5yZGl2W3BsYW5lXTsKKyAgICBmbG9hdCBiaWFzID0gcy0+Ymlhc1twbGFuZV07CisgICAgaW50IHksIHgsIGk7CisKKyAgICBsaW5lX2NvcHkxNihwMCwgc3JjICsgMiAqIHN0cmlkZSAqIChzbGljZV9zdGFydCA8IDIgPyAxIDogLTEpLCB3aWR0aCwgMik7CisgICAgbGluZV9jb3B5MTYocDEsIHNyYyArIHN0cmlkZSAqIChzbGljZV9zdGFydCA9PSAwID8gMSA6IC0xKSwgd2lkdGgsIDIpOworICAgIGxpbmVfY29weTE2KHAyLCBzcmMsIHdpZHRoLCAyKTsKKyAgICBzcmMgKz0gc3RyaWRlOworICAgIGxpbmVfY29weTE2KHAzLCBzcmMsIHdpZHRoLCAyKTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgdWludDE2X3QgKmFycmF5W10gPSB7CisgICAgICAgICAgICBwMCAtIDIsIHAwIC0gMSwgcDAsIHAwICsgMSwgcDAgKyAyLAorICAgICAgICAgICAgcDEgLSAyLCBwMSAtIDEsIHAxLCBwMSArIDEsIHAxICsgMiwKKyAgICAgICAgICAgIHAyIC0gMiwgcDIgLSAxLCBwMiwgcDIgKyAxLCBwMiArIDIsCisgICAgICAgICAgICBwMyAtIDIsIHAzIC0gMSwgcDMsIHAzICsgMSwgcDMgKyAyLAorICAgICAgICAgICAgcDQgLSAyLCBwNCAtIDEsIHA0LCBwNCArIDEsIHA0ICsgMgorICAgICAgICB9OworCisgICAgICAgIHNyYyArPSBzdHJpZGUgKiAoeSA8IGhlaWdodCAtIDIgPyAxIDogLTEpOworICAgICAgICBsaW5lX2NvcHkxNihwNCwgc3JjLCB3aWR0aCwgMik7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU7IGkrKykgeworICAgICAgICAgICAgICAgIHN1bSArPSAqKGFycmF5W2ldICsgeCkgKiBtYXRyaXhbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdW0gPSAoaW50KShzdW0gKiByZGl2ICsgYmlhcyArIDAuNWYpOworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcChzdW0sIDAsIHBlYWspOworICAgICAgICB9CisKKyAgICAgICAgcDAgPSBwMTsKKyAgICAgICAgcDEgPSBwMjsKKyAgICAgICAgcDIgPSBwMzsKKyAgICAgICAgcDMgPSBwNDsKKyAgICAgICAgcDQgPSAocDQgPT0gZW5kKSA/IG9yaWc6IHA0ICsgYnN0cmlkZTsKKyAgICAgICAgZHN0ICs9IG91dC0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXIxNl83eDcoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CisgICAgY29uc3QgaW50IHBlYWsgPSAoMSA8PCBzLT5kZXB0aCkgLSAxOworICAgIGNvbnN0IGludCBzdHJpZGUgPSBpbi0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICBjb25zdCBpbnQgYnN0cmlkZSA9IHMtPmJzdHJpZGU7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHMtPnBsYW5laGVpZ2h0W3BsYW5lXTsKKyAgICBjb25zdCBpbnQgd2lkdGggID0gcy0+cGxhbmV3aWR0aFtwbGFuZV07CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKGhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbcGxhbmVdICsgc2xpY2Vfc3RhcnQgKiBzdHJpZGU7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIChvdXQtPmxpbmVzaXplW3BsYW5lXSAvIDIpOworICAgIHVpbnQxNl90ICpwMCA9ICh1aW50MTZfdCAqKXMtPmJwdHJzW2pvYm5yXSArIDMyOworICAgIHVpbnQxNl90ICpwMSA9IHAwICsgYnN0cmlkZTsKKyAgICB1aW50MTZfdCAqcDIgPSBwMSArIGJzdHJpZGU7CisgICAgdWludDE2X3QgKnAzID0gcDIgKyBic3RyaWRlOworICAgIHVpbnQxNl90ICpwNCA9IHAzICsgYnN0cmlkZTsKKyAgICB1aW50MTZfdCAqcDUgPSBwNCArIGJzdHJpZGU7CisgICAgdWludDE2X3QgKnA2ID0gcDUgKyBic3RyaWRlOworICAgIHVpbnQxNl90ICpvcmlnID0gcDAsICplbmQgPSBwNjsKKyAgICBjb25zdCBpbnQgKm1hdHJpeCA9IHMtPm1hdHJpeFtwbGFuZV07CisgICAgZmxvYXQgcmRpdiA9IHMtPnJkaXZbcGxhbmVdOworICAgIGZsb2F0IGJpYXMgPSBzLT5iaWFzW3BsYW5lXTsKKyAgICBpbnQgeSwgeCwgaTsKKworICAgIGxpbmVfY29weTE2KHAwLCBzcmMgKyAzICogc3RyaWRlICogKHNsaWNlX3N0YXJ0IDwgMyA/IDEgOiAtMSksIHdpZHRoLCAzKTsKKyAgICBsaW5lX2NvcHkxNihwMSwgc3JjICsgMiAqIHN0cmlkZSAqIChzbGljZV9zdGFydCA8IDIgPyAxIDogLTEpLCB3aWR0aCwgMyk7CisgICAgbGluZV9jb3B5MTYocDIsIHNyYyArIHN0cmlkZSAqIChzbGljZV9zdGFydCA9PSAwID8gMSA6IC0xKSwgd2lkdGgsIDMpOworICAgIGxpbmVfY29weTE2KHAzLCBzcmMsIHdpZHRoLCAzKTsKKyAgICBzcmMgKz0gc3RyaWRlOworICAgIGxpbmVfY29weTE2KHA0LCBzcmMsIHdpZHRoLCAzKTsKKyAgICBzcmMgKz0gc3RyaWRlOworICAgIGxpbmVfY29weTE2KHA1LCBzcmMsIHdpZHRoLCAzKTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgdWludDE2X3QgKmFycmF5W10gPSB7CisgICAgICAgICAgICBwMCAtIDMsIHAwIC0gMiwgcDAgLSAxLCBwMCwgcDAgKyAxLCBwMCArIDIsIHAwICsgMywKKyAgICAgICAgICAgIHAxIC0gMywgcDEgLSAyLCBwMSAtIDEsIHAxLCBwMSArIDEsIHAxICsgMiwgcDEgKyAzLAorICAgICAgICAgICAgcDIgLSAzLCBwMiAtIDIsIHAyIC0gMSwgcDIsIHAyICsgMSwgcDIgKyAyLCBwMiArIDMsCisgICAgICAgICAgICBwMyAtIDMsIHAzIC0gMiwgcDMgLSAxLCBwMywgcDMgKyAxLCBwMyArIDIsIHAzICsgMywKKyAgICAgICAgICAgIHA0IC0gMywgcDQgLSAyLCBwNCAtIDEsIHA0LCBwNCArIDEsIHA0ICsgMiwgcDQgKyAzLAorICAgICAgICAgICAgcDUgLSAzLCBwNSAtIDIsIHA1IC0gMSwgcDUsIHA1ICsgMSwgcDUgKyAyLCBwNSArIDMsCisgICAgICAgICAgICBwNiAtIDMsIHA2IC0gMiwgcDYgLSAxLCBwNiwgcDYgKyAxLCBwNiArIDIsIHA2ICsgMywKKyAgICAgICAgfTsKKworICAgICAgICBzcmMgKz0gc3RyaWRlICogKHkgPCBoZWlnaHQgLSAzID8gMSA6IC0xKTsKKyAgICAgICAgbGluZV9jb3B5MTYocDYsIHNyYywgd2lkdGgsIDMpOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1OyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gKihhcnJheVtpXSArIHgpICogbWF0cml4W2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3VtID0gKGludCkoc3VtICogcmRpdiArIGJpYXMgKyAwLjVmKTsKKyAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXAoc3VtLCAwLCBwZWFrKTsKKyAgICAgICAgfQorCisgICAgICAgIHAwID0gcDE7CisgICAgICAgIHAxID0gcDI7CisgICAgICAgIHAyID0gcDM7CisgICAgICAgIHAzID0gcDQ7CisgICAgICAgIHA0ID0gcDU7CisgICAgICAgIHA1ID0gcDY7CisgICAgICAgIHA2ID0gKHA2ID09IGVuZCkgPyBvcmlnOiBwNiArIGJzdHJpZGU7CisgICAgICAgIGRzdCArPSBvdXQtPmxpbmVzaXplW3BsYW5lXSAvIDI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyXzN4MyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIENvbnZvbHV0aW9uQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCBwbGFuZSA9IHRkLT5wbGFuZTsKKyAgICBjb25zdCBpbnQgc3RyaWRlID0gaW4tPmxpbmVzaXplW3BsYW5lXTsKKyAgICBjb25zdCBpbnQgYnN0cmlkZSA9IHMtPmJzdHJpZGU7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHMtPnBsYW5laGVpZ2h0W3BsYW5lXTsKKyAgICBjb25zdCBpbnQgd2lkdGggID0gcy0+cGxhbmV3aWR0aFtwbGFuZV07CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKGhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBpbi0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIHN0cmlkZTsKKyAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGFbcGxhbmVdICsgc2xpY2Vfc3RhcnQgKiBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICB1aW50OF90ICpwMCA9IHMtPmJwdHJzW2pvYm5yXSArIDE2OwogICAgIHVpbnQ4X3QgKnAxID0gcDAgKyBic3RyaWRlOwogICAgIHVpbnQ4X3QgKnAyID0gcDEgKyBic3RyaWRlOwogICAgIHVpbnQ4X3QgKm9yaWcgPSBwMCwgKmVuZCA9IHAyOwpAQCAtMTQ1LDEwICs2OTIsMTAgQEAKICAgICBjb25zdCBmbG9hdCBiaWFzID0gcy0+Ymlhc1twbGFuZV07CiAgICAgaW50IHksIHg7CiAKLSAgICBsaW5lX2NvcHk4KHAwLCBzcmMgKyBzdHJpZGUsIHdpZHRoLCAxKTsKKyAgICBsaW5lX2NvcHk4KHAwLCBzcmMgKyBzdHJpZGUgKiAoc2xpY2Vfc3RhcnQgPT0gMCA/IDEgOiAtMSksIHdpZHRoLCAxKTsKICAgICBsaW5lX2NvcHk4KHAxLCBzcmMsIHdpZHRoLCAxKTsKIAotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKICAgICAgICAgc3JjICs9IHN0cmlkZSAqICh5IDwgaGVpZ2h0IC0gMSA/IDEgOiAtMSk7CiAgICAgICAgIGxpbmVfY29weTgocDIsIHNyYywgd2lkdGgsIDEpOwogCkBAIC0xNzEsMTcgKzcxOCwyNiBAQAogICAgICAgICBwMiA9IChwMiA9PSBlbmQpID8gb3JpZzogcDIgKyBic3RyaWRlOwogICAgICAgICBkc3QgKz0gb3V0LT5saW5lc2l6ZVtwbGFuZV07CiAgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGZpbHRlcl81eDUoQ29udm9sdXRpb25Db250ZXh0ICpzLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0LCBpbnQgcGxhbmUpCitzdGF0aWMgaW50IGZpbHRlcl81eDUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKIHsKLSAgICBjb25zdCB1aW50OF90ICpzcmMgPSBpbi0+ZGF0YVtwbGFuZV07Ci0gICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhW3BsYW5lXTsKKyAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CiAgICAgY29uc3QgaW50IHN0cmlkZSA9IGluLT5saW5lc2l6ZVtwbGFuZV07CiAgICAgY29uc3QgaW50IGJzdHJpZGUgPSBzLT5ic3RyaWRlOwogICAgIGNvbnN0IGludCBoZWlnaHQgPSBzLT5wbGFuZWhlaWdodFtwbGFuZV07CiAgICAgY29uc3QgaW50IHdpZHRoICA9IHMtPnBsYW5ld2lkdGhbcGxhbmVdOwotICAgIHVpbnQ4X3QgKnAwID0gcy0+YnVmZmVyICsgMTY7CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKGhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSBpbi0+ZGF0YVtwbGFuZV0gKyBzbGljZV9zdGFydCAqIHN0cmlkZTsKKyAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGFbcGxhbmVdICsgc2xpY2Vfc3RhcnQgKiBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICB1aW50OF90ICpwMCA9IHMtPmJwdHJzW2pvYm5yXSArIDE2OwogICAgIHVpbnQ4X3QgKnAxID0gcDAgKyBic3RyaWRlOwogICAgIHVpbnQ4X3QgKnAyID0gcDEgKyBic3RyaWRlOwogICAgIHVpbnQ4X3QgKnAzID0gcDIgKyBic3RyaWRlOwpAQCAtMTkyLDE0ICs3NDgsMTQgQEAKICAgICBmbG9hdCBiaWFzID0gcy0+Ymlhc1twbGFuZV07CiAgICAgaW50IHksIHgsIGk7CiAKLSAgICBsaW5lX2NvcHk4KHAwLCBzcmMgKyAyICogc3RyaWRlLCB3aWR0aCwgMik7Ci0gICAgbGluZV9jb3B5OChwMSwgc3JjICsgc3RyaWRlLCB3aWR0aCwgMik7CisgICAgbGluZV9jb3B5OChwMCwgc3JjICsgMiAqIHN0cmlkZSAqIChzbGljZV9zdGFydCA8IDIgPyAxIDogLTEpLCB3aWR0aCwgMik7CisgICAgbGluZV9jb3B5OChwMSwgc3JjICsgc3RyaWRlICogKHNsaWNlX3N0YXJ0ID09IDAgPyAxIDogLTEpLCB3aWR0aCwgMik7CiAgICAgbGluZV9jb3B5OChwMiwgc3JjLCB3aWR0aCwgMik7CiAgICAgc3JjICs9IHN0cmlkZTsKICAgICBsaW5lX2NvcHk4KHAzLCBzcmMsIHdpZHRoLCAyKTsKIAogCi0gICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgewogICAgICAgICB1aW50OF90ICphcnJheVtdID0gewogICAgICAgICAgICAgcDAgLSAyLCBwMCAtIDEsIHAwLCBwMCArIDEsIHAwICsgMiwKICAgICAgICAgICAgIHAxIC0gMiwgcDEgLSAxLCBwMSwgcDEgKyAxLCBwMSArIDIsCkBAIC0yMjgsMTIgKzc4NCwxNDcgQEAKICAgICAgICAgcDQgPSAocDQgPT0gZW5kKSA/IG9yaWc6IHA0ICsgYnN0cmlkZTsKICAgICAgICAgZHN0ICs9IG91dC0+bGluZXNpemVbcGxhbmVdOwogICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl83eDcoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CisgICAgY29uc3QgaW50IHN0cmlkZSA9IGluLT5saW5lc2l6ZVtwbGFuZV07CisgICAgY29uc3QgaW50IGJzdHJpZGUgPSBzLT5ic3RyaWRlOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBzLT5wbGFuZWhlaWdodFtwbGFuZV07CisgICAgY29uc3QgaW50IHdpZHRoICA9IHMtPnBsYW5ld2lkdGhbcGxhbmVdOworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChoZWlnaHQgKiBqb2JucikgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBzbGljZV9lbmQgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgY29uc3QgdWludDhfdCAqc3JjID0gaW4tPmRhdGFbcGxhbmVdICsgc2xpY2Vfc3RhcnQgKiBzdHJpZGU7CisgICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhW3BsYW5lXSArIHNsaWNlX3N0YXJ0ICogb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgdWludDhfdCAqcDAgPSBzLT5icHRyc1tqb2Jucl0gKyAzMjsKKyAgICB1aW50OF90ICpwMSA9IHAwICsgYnN0cmlkZTsKKyAgICB1aW50OF90ICpwMiA9IHAxICsgYnN0cmlkZTsKKyAgICB1aW50OF90ICpwMyA9IHAyICsgYnN0cmlkZTsKKyAgICB1aW50OF90ICpwNCA9IHAzICsgYnN0cmlkZTsKKyAgICB1aW50OF90ICpwNSA9IHA0ICsgYnN0cmlkZTsKKyAgICB1aW50OF90ICpwNiA9IHA1ICsgYnN0cmlkZTsKKyAgICB1aW50OF90ICpvcmlnID0gcDAsICplbmQgPSBwNjsKKyAgICBjb25zdCBpbnQgKm1hdHJpeCA9IHMtPm1hdHJpeFtwbGFuZV07CisgICAgZmxvYXQgcmRpdiA9IHMtPnJkaXZbcGxhbmVdOworICAgIGZsb2F0IGJpYXMgPSBzLT5iaWFzW3BsYW5lXTsKKyAgICBpbnQgeSwgeCwgaTsKKworICAgIGxpbmVfY29weTgocDAsIHNyYyArIDMgKiBzdHJpZGUgKiAoc2xpY2Vfc3RhcnQgPCAzID8gMSA6IC0xKSwgd2lkdGgsIDMpOworICAgIGxpbmVfY29weTgocDEsIHNyYyArIDIgKiBzdHJpZGUgKiAoc2xpY2Vfc3RhcnQgPCAyID8gMSA6IC0xKSwgd2lkdGgsIDMpOworICAgIGxpbmVfY29weTgocDIsIHNyYyArIHN0cmlkZSAqIChzbGljZV9zdGFydCA9PSAwID8gMSA6IC0xKSwgd2lkdGgsIDMpOworICAgIGxpbmVfY29weTgocDMsIHNyYywgd2lkdGgsIDMpOworICAgIHNyYyArPSBzdHJpZGU7CisgICAgbGluZV9jb3B5OChwNCwgc3JjLCB3aWR0aCwgMyk7CisgICAgc3JjICs9IHN0cmlkZTsKKyAgICBsaW5lX2NvcHk4KHA1LCBzcmMsIHdpZHRoLCAzKTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgdWludDhfdCAqYXJyYXlbXSA9IHsKKyAgICAgICAgICAgIHAwIC0gMywgcDAgLSAyLCBwMCAtIDEsIHAwLCBwMCArIDEsIHAwICsgMiwgcDAgKyAzLAorICAgICAgICAgICAgcDEgLSAzLCBwMSAtIDIsIHAxIC0gMSwgcDEsIHAxICsgMSwgcDEgKyAyLCBwMSArIDMsCisgICAgICAgICAgICBwMiAtIDMsIHAyIC0gMiwgcDIgLSAxLCBwMiwgcDIgKyAxLCBwMiArIDIsIHAyICsgMywKKyAgICAgICAgICAgIHAzIC0gMywgcDMgLSAyLCBwMyAtIDEsIHAzLCBwMyArIDEsIHAzICsgMiwgcDMgKyAzLAorICAgICAgICAgICAgcDQgLSAzLCBwNCAtIDIsIHA0IC0gMSwgcDQsIHA0ICsgMSwgcDQgKyAyLCBwNCArIDMsCisgICAgICAgICAgICBwNSAtIDMsIHA1IC0gMiwgcDUgLSAxLCBwNSwgcDUgKyAxLCBwNSArIDIsIHA1ICsgMywKKyAgICAgICAgICAgIHA2IC0gMywgcDYgLSAyLCBwNiAtIDEsIHA2LCBwNiArIDEsIHA2ICsgMiwgcDYgKyAzLAorICAgICAgICB9OworCisgICAgICAgIHNyYyArPSBzdHJpZGUgKiAoeSA8IGhlaWdodCAtIDMgPyAxIDogLTEpOworICAgICAgICBsaW5lX2NvcHk4KHA2LCBzcmMsIHdpZHRoLCAzKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3VtICs9ICooYXJyYXlbaV0gKyB4KSAqIG1hdHJpeFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1bSA9IChpbnQpKHN1bSAqIHJkaXYgKyBiaWFzICsgMC41Zik7CisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3VpbnQ4KHN1bSk7CisgICAgICAgIH0KKworICAgICAgICBwMCA9IHAxOworICAgICAgICBwMSA9IHAyOworICAgICAgICBwMiA9IHAzOworICAgICAgICBwMyA9IHA0OworICAgICAgICBwNCA9IHA1OworICAgICAgICBwNSA9IHA2OworICAgICAgICBwNiA9IChwNiA9PSBlbmQpID8gb3JpZzogcDYgKyBic3RyaWRlOworICAgICAgICBkc3QgKz0gb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQ29udm9sdXRpb25Db250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCBwOworCisgICAgcy0+ZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOworCisgICAgcy0+cGxhbmV3aWR0aFsxXSA9IHMtPnBsYW5ld2lkdGhbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIHMtPnBsYW5ld2lkdGhbMF0gPSBzLT5wbGFuZXdpZHRoWzNdID0gaW5saW5rLT53OworICAgIHMtPnBsYW5laGVpZ2h0WzFdID0gcy0+cGxhbmVoZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIHMtPnBsYW5laGVpZ2h0WzBdID0gcy0+cGxhbmVoZWlnaHRbM10gPSBpbmxpbmstPmg7CisKKyAgICBzLT5uYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhpbmxpbmstPmZvcm1hdCk7CisgICAgcy0+bmJfdGhyZWFkcyA9IGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpOworICAgIHMtPmJwdHJzID0gYXZfY2FsbG9jKHMtPm5iX3RocmVhZHMsIHNpemVvZigqcy0+YnB0cnMpKTsKKyAgICBpZiAoIXMtPmJwdHJzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcy0+YnN0cmlkZSA9IHMtPnBsYW5ld2lkdGhbMF0gKyA2NDsKKyAgICBzLT5icGMgPSAocy0+ZGVwdGggKyA3KSAvIDg7CisgICAgcy0+YnVmZmVyID0gYXZfbWFsbG9jX2FycmF5KDcgKiBzLT5ic3RyaWRlICogcy0+bmJfdGhyZWFkcywgcy0+YnBjKTsKKyAgICBpZiAoIXMtPmJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl90aHJlYWRzOyBwKyspIHsKKyAgICAgICAgcy0+YnB0cnNbcF0gPSBzLT5idWZmZXIgKyA3ICogcy0+YnN0cmlkZSAqIHMtPmJwYyAqIHA7CisgICAgfQorCisgICAgaWYgKCFzdHJjbXAoY3R4LT5maWx0ZXItPm5hbWUsICJjb252b2x1dGlvbiIpKSB7CisgICAgICAgIGlmIChzLT5kZXB0aCA+IDgpIHsKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICAgICAgICAgIGlmIChzLT5zaXplW3BdID09IDMpCisgICAgICAgICAgICAgICAgICAgIHMtPmZpbHRlcltwXSA9IGZpbHRlcjE2XzN4MzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzLT5zaXplW3BdID09IDUpCisgICAgICAgICAgICAgICAgICAgIHMtPmZpbHRlcltwXSA9IGZpbHRlcjE2XzV4NTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzLT5zaXplW3BdID09IDcpCisgICAgICAgICAgICAgICAgICAgIHMtPmZpbHRlcltwXSA9IGZpbHRlcjE2Xzd4NzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgInByZXdpdHQiKSkgeworICAgICAgICBpZiAocy0+ZGVwdGggPiA4KQorICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKQorICAgICAgICAgICAgICAgIHMtPmZpbHRlcltwXSA9IGZpbHRlcjE2X3ByZXdpdHQ7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAicm9iZXJ0cyIpKSB7CisgICAgICAgIGlmIChzLT5kZXB0aCA+IDgpCisgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfcGxhbmVzOyBwKyspCisgICAgICAgICAgICAgICAgcy0+ZmlsdGVyW3BdID0gZmlsdGVyMTZfcm9iZXJ0czsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5maWx0ZXItPm5hbWUsICJzb2JlbCIpKSB7CisgICAgICAgIGlmIChzLT5kZXB0aCA+IDgpCisgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfcGxhbmVzOyBwKyspCisgICAgICAgICAgICAgICAgcy0+ZmlsdGVyW3BdID0gZmlsdGVyMTZfc29iZWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKIHsKLSAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIENvbnZvbHV0aW9uQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CiAgICAgQVZGcmFtZSAqb3V0OwogICAgIGludCBwbGFuZTsKIApAQCAtMjQ1LDE1ICs5MzYsMjAgQEAKICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOwogCiAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIFRocmVhZERhdGEgdGQ7CisKICAgICAgICAgaWYgKHMtPmNvcHlbcGxhbmVdKSB7CiAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVtwbGFuZV0sIG91dC0+bGluZXNpemVbcGxhbmVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVtwbGFuZV0sIGluLT5saW5lc2l6ZVtwbGFuZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBsYW5ld2lkdGhbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZXdpZHRoW3BsYW5lXSAqIHMtPmJwYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVoZWlnaHRbcGxhbmVdKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgcy0+ZmlsdGVyW3BsYW5lXShzLCBpbiwgb3V0LCBwbGFuZSk7CisgICAgICAgIHRkLmluID0gaW47CisgICAgICAgIHRkLm91dCA9IG91dDsKKyAgICAgICAgdGQucGxhbmUgPSBwbGFuZTsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHMtPmZpbHRlcltwbGFuZV0sICZ0ZCwgTlVMTCwgRkZNSU4ocy0+cGxhbmVoZWlnaHRbcGxhbmVdLCBzLT5uYl90aHJlYWRzKSk7CiAgICAgfQogCiAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwpAQCAtMjY1LDMyICs5NjEsNjYgQEAKICAgICBDb252b2x1dGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgaW50IGk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICAgIGludCAqbWF0cml4ID0gKGludCAqKXMtPm1hdHJpeFtpXTsKLSAgICAgICAgY2hhciAqcCwgKmFyZywgKnNhdmVwdHIgPSBOVUxMOworICAgIGlmICghc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiY29udm9sdXRpb24iKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgKm1hdHJpeCA9IChpbnQgKilzLT5tYXRyaXhbaV07CisgICAgICAgICAgICBjaGFyICpwLCAqYXJnLCAqc2F2ZXB0ciA9IE5VTEw7CiAKLSAgICAgICAgcCA9IHMtPm1hdHJpeF9zdHJbaV07Ci0gICAgICAgIHdoaWxlIChzLT5tYXRyaXhfbGVuZ3RoW2ldIDwgMjUpIHsKLSAgICAgICAgICAgIGlmICghKGFyZyA9IGF2X3N0cnRvayhwLCAiICIsICZzYXZlcHRyKSkpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwID0gcy0+bWF0cml4X3N0cltpXTsKKyAgICAgICAgICAgIHdoaWxlIChzLT5tYXRyaXhfbGVuZ3RoW2ldIDwgNDkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIShhcmcgPSBhdl9zdHJ0b2socCwgIiAiLCAmc2F2ZXB0cikpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgcCA9IE5VTEw7Ci0gICAgICAgICAgICBzc2NhbmYoYXJnLCAiJWQiLCAmbWF0cml4W3MtPm1hdHJpeF9sZW5ndGhbaV1dKTsKLSAgICAgICAgICAgIHMtPm1hdHJpeF9sZW5ndGhbaV0rKzsKKyAgICAgICAgICAgICAgICBwID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzc2NhbmYoYXJnLCAiJWQiLCAmbWF0cml4W3MtPm1hdHJpeF9sZW5ndGhbaV1dKTsKKyAgICAgICAgICAgICAgICBzLT5tYXRyaXhfbGVuZ3RoW2ldKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5tYXRyaXhfbGVuZ3RoW2ldID09IDkpIHsKKyAgICAgICAgICAgICAgICBzLT5zaXplW2ldID0gMzsKKyAgICAgICAgICAgICAgICBpZiAoIW1lbWNtcChtYXRyaXgsIHNhbWUzeDMsIHNpemVvZihzYW1lM3gzKSkpCisgICAgICAgICAgICAgICAgICAgIHMtPmNvcHlbaV0gPSAxOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcy0+ZmlsdGVyW2ldID0gZmlsdGVyXzN4MzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+bWF0cml4X2xlbmd0aFtpXSA9PSAyNSkgeworICAgICAgICAgICAgICAgIHMtPnNpemVbaV0gPSA1OworICAgICAgICAgICAgICAgIGlmICghbWVtY21wKG1hdHJpeCwgc2FtZTV4NSwgc2l6ZW9mKHNhbWU1eDUpKSkKKyAgICAgICAgICAgICAgICAgICAgcy0+Y29weVtpXSA9IDE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzLT5maWx0ZXJbaV0gPSBmaWx0ZXJfNXg1OworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5tYXRyaXhfbGVuZ3RoW2ldID09IDQ5KSB7CisgICAgICAgICAgICAgICAgcy0+c2l6ZVtpXSA9IDc7CisgICAgICAgICAgICAgICAgaWYgKCFtZW1jbXAobWF0cml4LCBzYW1lN3g3LCBzaXplb2Yoc2FtZTd4NykpKQorICAgICAgICAgICAgICAgICAgICBzLT5jb3B5W2ldID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMtPmZpbHRlcltpXSA9IGZpbHRlcl83eDc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzLT5jb3B5W2ldICYmIChzLT5yZGl2W2ldICE9IDEuIHx8IHMtPmJpYXNbaV0gIT0gMC4pKQorICAgICAgICAgICAgICAgIHMtPmNvcHlbaV0gPSAwOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHMtPm1hdHJpeF9sZW5ndGhbaV0gPT0gOSkgewotICAgICAgICAgICAgaWYgKCFtZW1jbXAobWF0cml4LCBzYW1lM3gzLCBzaXplb2Yoc2FtZTN4MykpKQotICAgICAgICAgICAgICAgIHMtPmNvcHlbaV0gPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgInByZXdpdHQiKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKDEgPDwgaSkgJiBzLT5wbGFuZXMpCisgICAgICAgICAgICAgICAgcy0+ZmlsdGVyW2ldID0gZmlsdGVyX3ByZXdpdHQ7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcy0+ZmlsdGVyW2ldID0gZmlsdGVyXzN4MzsKLSAgICAgICAgfSBlbHNlIGlmIChzLT5tYXRyaXhfbGVuZ3RoW2ldID09IDI1KSB7Ci0gICAgICAgICAgICBpZiAoIW1lbWNtcChtYXRyaXgsIHNhbWU1eDUsIHNpemVvZihzYW1lNXg1KSkpCiAgICAgICAgICAgICAgICAgcy0+Y29weVtpXSA9IDE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY3R4LT5maWx0ZXItPm5hbWUsICJyb2JlcnRzIikpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgaWYgKCgxIDw8IGkpICYgcy0+cGxhbmVzKQorICAgICAgICAgICAgICAgIHMtPmZpbHRlcltpXSA9IGZpbHRlcl9yb2JlcnRzOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHMtPmZpbHRlcltpXSA9IGZpbHRlcl81eDU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIHMtPmNvcHlbaV0gPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAic29iZWwiKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKDEgPDwgaSkgJiBzLT5wbGFuZXMpCisgICAgICAgICAgICAgICAgcy0+ZmlsdGVyW2ldID0gZmlsdGVyX3NvYmVsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPmNvcHlbaV0gPSAxOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMDEsNiArMTAzMSw3IEBACiB7CiAgICAgQ29udm9sdXRpb25Db250ZXh0ICpzID0gY3R4LT5wcml2OwogCisgICAgYXZfZnJlZXAoJnMtPmJwdHJzKTsKICAgICBhdl9mcmVlcCgmcy0+YnVmZmVyKTsKIH0KIApAQCAtMzIyLDYgKzEwNTMsOCBAQAogICAgIHsgTlVMTCB9CiB9OwogCisjaWYgQ09ORklHX0NPTlZPTFVUSU9OX0ZJTFRFUgorCiBBVkZpbHRlciBmZl92Zl9jb252b2x1dGlvbiA9IHsKICAgICAubmFtZSAgICAgICAgICA9ICJjb252b2x1dGlvbiIsCiAgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgY29udm9sdXRpb24gZmlsdGVyLiIpLApAQCAtMzMyLDUgKzEwNjUsODUgQEAKICAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCiAgICAgLmlucHV0cyAgICAgICAgPSBjb252b2x1dGlvbl9pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBjb252b2x1dGlvbl9vdXRwdXRzLAotICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQyB8IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKIH07CisKKyNlbmRpZiAvKiBDT05GSUdfQ09OVk9MVVRJT05fRklMVEVSICovCisKKyNpZiBDT05GSUdfUFJFV0lUVF9GSUxURVIKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHByZXdpdHRfb3B0aW9uc1tdID0geworICAgIHsgInBsYW5lcyIsICJzZXQgcGxhbmVzIHRvIGZpbHRlciIsIE9GRlNFVChwbGFuZXMpLCBBVl9PUFRfVFlQRV9JTlQsICB7Lmk2ND0xNX0sIDAsIDE1LCBGTEFHU30sCisgICAgeyAic2NhbGUiLCAgInNldCBzY2FsZSIsICAgICAgICAgICAgT0ZGU0VUKHNjYWxlKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIDAuMCwgIDY1NTM1LCBGTEFHU30sCisgICAgeyAiZGVsdGEiLCAgInNldCBkZWx0YSIsICAgICAgICAgICAgT0ZGU0VUKGRlbHRhKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTB9LCAtNjU1MzUsIDY1NTM1LCBGTEFHU30sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhwcmV3aXR0KTsKKworQVZGaWx0ZXIgZmZfdmZfcHJld2l0dCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJwcmV3aXR0IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSBwcmV3aXR0IG9wZXJhdG9yLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKENvbnZvbHV0aW9uQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmcHJld2l0dF9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gY29udm9sdXRpb25faW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gY29udm9sdXRpb25fb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19QUkVXSVRUX0ZJTFRFUiAqLworCisjaWYgQ09ORklHX1NPQkVMX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gc29iZWxfb3B0aW9uc1tdID0geworICAgIHsgInBsYW5lcyIsICJzZXQgcGxhbmVzIHRvIGZpbHRlciIsIE9GRlNFVChwbGFuZXMpLCBBVl9PUFRfVFlQRV9JTlQsICB7Lmk2ND0xNX0sIDAsIDE1LCBGTEFHU30sCisgICAgeyAic2NhbGUiLCAgInNldCBzY2FsZSIsICAgICAgICAgICAgT0ZGU0VUKHNjYWxlKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIDAuMCwgIDY1NTM1LCBGTEFHU30sCisgICAgeyAiZGVsdGEiLCAgInNldCBkZWx0YSIsICAgICAgICAgICAgT0ZGU0VUKGRlbHRhKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTB9LCAtNjU1MzUsIDY1NTM1LCBGTEFHU30sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzb2JlbCk7CisKK0FWRmlsdGVyIGZmX3ZmX3NvYmVsID0geworICAgIC5uYW1lICAgICAgICAgID0gInNvYmVsIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSBzb2JlbCBvcGVyYXRvci4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDb252b2x1dGlvbkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNvYmVsX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBjb252b2x1dGlvbl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBjb252b2x1dGlvbl9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMgfCBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCit9OworCisjZW5kaWYgLyogQ09ORklHX1NPQkVMX0ZJTFRFUiAqLworCisjaWYgQ09ORklHX1JPQkVSVFNfRklMVEVSCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiByb2JlcnRzX29wdGlvbnNbXSA9IHsKKyAgICB7ICJwbGFuZXMiLCAic2V0IHBsYW5lcyB0byBmaWx0ZXIiLCBPRkZTRVQocGxhbmVzKSwgQVZfT1BUX1RZUEVfSU5ULCAgey5pNjQ9MTV9LCAwLCAxNSwgRkxBR1N9LAorICAgIHsgInNjYWxlIiwgICJzZXQgc2NhbGUiLCAgICAgICAgICAgIE9GRlNFVChzY2FsZSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xLjB9LCAwLjAsICA2NTUzNSwgRkxBR1N9LAorICAgIHsgImRlbHRhIiwgICJzZXQgZGVsdGEiLCAgICAgICAgICAgIE9GRlNFVChkZWx0YSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wfSwgLTY1NTM1LCA2NTUzNSwgRkxBR1N9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Mocm9iZXJ0cyk7CisKK0FWRmlsdGVyIGZmX3ZmX3JvYmVydHMgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAicm9iZXJ0cyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgcm9iZXJ0cyBjcm9zcyBvcGVyYXRvci4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDb252b2x1dGlvbkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnJvYmVydHNfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGNvbnZvbHV0aW9uX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGNvbnZvbHV0aW9uX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQyB8IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKK307CisKKyNlbmRpZiAvKiBDT05GSUdfUk9CRVJUU19GSUxURVIgKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2NvbnZvbHV0aW9uX29wZW5jbC5jIGIvbGliYXZmaWx0ZXIvdmZfY29udm9sdXRpb25fb3BlbmNsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRmNTFlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2NvbnZvbHV0aW9uX29wZW5jbC5jCkBAIC0wLDAgKzEsMzY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE4IERhbmlsIElhc2hjaGVua28KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJvcGVuY2wuaCIKKyNpbmNsdWRlICJvcGVuY2xfc291cmNlLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ29udm9sdXRpb25PcGVuQ0xDb250ZXh0IHsKKyAgICBPcGVuQ0xGaWx0ZXJDb250ZXh0IG9jZjsKKworICAgIGludCAgICAgICAgICAgICAgaW5pdGlhbGlzZWQ7CisgICAgY2xfa2VybmVsICAgICAgICBrZXJuZWw7CisgICAgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlOworCisgICAgY2hhciAqbWF0cml4X3N0cls0XTsKKworICAgIGNsX21lbSBtYXRyaXhbNF07CisgICAgY2xfaW50IG1hdHJpeF9zaXplc1s0XTsKKyAgICBjbF9pbnQgZGltc1s0XTsKKyAgICBjbF9mbG9hdCByZGl2c1s0XTsKKyAgICBjbF9mbG9hdCBiaWFzZXNbNF07CisKK30gQ29udm9sdXRpb25PcGVuQ0xDb250ZXh0OworCisKK3N0YXRpYyBpbnQgY29udm9sdXRpb25fb3BlbmNsX2luaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDb252b2x1dGlvbk9wZW5DTENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIGNsX2ludCBjbGU7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX29wZW5jbF9maWx0ZXJfbG9hZF9wcm9ncmFtKGF2Y3R4LCAmZmZfb3BlbmNsX3NvdXJjZV9jb252b2x1dGlvbiwgMSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGN0eC0+Y29tbWFuZF9xdWV1ZSA9IGNsQ3JlYXRlQ29tbWFuZFF1ZXVlKGN0eC0+b2NmLmh3Y3R4LT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2NmLmh3Y3R4LT5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmNsZSk7CisgICAgaWYgKCFjdHgtPmNvbW1hbmRfcXVldWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIE9wZW5DTCAiCisgICAgICAgICAgICAgICAiY29tbWFuZCBxdWV1ZTogJWQuXG4iLCBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdHgtPmtlcm5lbCA9IGNsQ3JlYXRlS2VybmVsKGN0eC0+b2NmLnByb2dyYW0sICJjb252b2x1dGlvbl9nbG9iYWwiLCAmY2xlKTsKKyAgICBpZiAoIWN0eC0+a2VybmVsKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBrZXJuZWw6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY3R4LT5pbml0aWFsaXNlZCA9IDE7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaWYgKGN0eC0+Y29tbWFuZF9xdWV1ZSkKKyAgICAgICAgY2xSZWxlYXNlQ29tbWFuZFF1ZXVlKGN0eC0+Y29tbWFuZF9xdWV1ZSk7CisgICAgaWYgKGN0eC0+a2VybmVsKQorICAgICAgICBjbFJlbGVhc2VLZXJuZWwoY3R4LT5rZXJuZWwpOworICAgIHJldHVybiBlcnI7Cit9CisKKworCitzdGF0aWMgaW50IGNvbnZvbHV0aW9uX29wZW5jbF9tYWtlX2ZpbHRlcl9wYXJhbXMoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBDb252b2x1dGlvbk9wZW5DTENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIGZsb2F0ICptYXRyaXggPSBOVUxMOworICAgIHNpemVfdCBtYXRyaXhfYnl0ZXM7CisgICAgY2xfbWVtIGJ1ZmZlcjsKKyAgICBjbF9pbnQgY2xlOworICAgIGludCBpLCBqOworICAgIGludCBzc2NhbmZfZXJyOworICAgIGNoYXIgKnAsICphcmcsICpzYXZlcHRyID0gTlVMTDsKKyAgICBmbG9hdCBpbnB1dF9tYXRyaXhbNF1bNDldOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBjdHgtPmJpYXNlc1tpXSA9IGN0eC0+Ymlhc2VzW2ldIC8gMjU1LjA7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBwID0gY3R4LT5tYXRyaXhfc3RyW2ldOworICAgICAgICB3aGlsZSAoY3R4LT5tYXRyaXhfc2l6ZXNbaV0gPCA0OSkgeworICAgICAgICAgICAgYXJnID0gYXZfc3RydG9rKHAsICIgIiwgJnNhdmVwdHIpOworICAgICAgICAgICAgaWYgKCFhcmcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAgPSBOVUxMOworICAgICAgICAgICAgc3NjYW5mX2VyciA9IHNzY2FuZihhcmcsICIlZiIsICZpbnB1dF9tYXRyaXhbaV1bY3R4LT5tYXRyaXhfc2l6ZXNbaV1dKTsKKyAgICAgICAgICAgIGlmIChzc2NhbmZfZXJyICE9IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJNYXRyaXggaXMgc2VxdWVuY2Ugb2YgOSwgMjUgb3IgNDkgc2lnbmVkIG51bWJlcnNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdHgtPm1hdHJpeF9zaXplc1tpXSsrOworICAgICAgICB9CisgICAgICAgIGlmIChjdHgtPm1hdHJpeF9zaXplc1tpXSA9PSA5KSB7CisgICAgICAgICAgICBjdHgtPmRpbXNbaV0gPSAzOworICAgICAgICB9IGVsc2UgaWYgKGN0eC0+bWF0cml4X3NpemVzW2ldID09IDI1KSB7CisgICAgICAgICAgICBjdHgtPmRpbXNbaV0gPSA1OworICAgICAgICB9IGVsc2UgaWYgKGN0eC0+bWF0cml4X3NpemVzW2ldID09IDQ5KSB7CisgICAgICAgICAgICBjdHgtPmRpbXNbaV0gPSA3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBtYXRyaXggc2l6ZTolZFxuIiwgY3R4LT5tYXRyaXhfc2l6ZXNbaV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgICBtYXRyaXhfYnl0ZXMgPSBzaXplb2YoZmxvYXQpKmN0eC0+bWF0cml4X3NpemVzW2pdOworICAgICAgICBtYXRyaXggPSBhdl9tYWxsb2MobWF0cml4X2J5dGVzKTsKKyAgICAgICAgaWYgKCFtYXRyaXgpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZtYXRyaXgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm1hdHJpeF9zaXplc1tqXTsgaSsrKQorICAgICAgICAgICAgbWF0cml4W2ldID0gaW5wdXRfbWF0cml4W2pdW2ldOworCisgICAgICAgIGJ1ZmZlciA9IGNsQ3JlYXRlQnVmZmVyKGN0eC0+b2NmLmh3Y3R4LT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9NRU1fUkVBRF9PTkxZIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfTUVNX0NPUFlfSE9TVF9QVFIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9NRU1fSE9TVF9OT19BQ0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9ieXRlcywgbWF0cml4LCAmY2xlKTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBtYXRyaXggYnVmZmVyOiAiCisgICAgICAgICAgICAgICAgICAgIiVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZtYXRyaXgpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgICAgICBjdHgtPm1hdHJpeFtqXSA9IGJ1ZmZlcjsKKyAgICAgICAgYXZfZnJlZXAoJm1hdHJpeCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29udm9sdXRpb25fb3BlbmNsX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5wdXQpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICphdmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGF2Y3R4LT5vdXRwdXRzWzBdOworICAgIENvbnZvbHV0aW9uT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0cHV0ID0gTlVMTDsKKyAgICBjbF9pbnQgY2xlOworICAgIHNpemVfdCBnbG9iYWxfd29ya1syXTsKKyAgICBjbF9tZW0gc3JjLCBkc3Q7CisgICAgaW50IGVyciwgcDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkZpbHRlciBpbnB1dDogJXMsICV1eCV1ICglIlBSSWQ2NCIpLlxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbnB1dC0+Zm9ybWF0KSwKKyAgICAgICAgICAgaW5wdXQtPndpZHRoLCBpbnB1dC0+aGVpZ2h0LCBpbnB1dC0+cHRzKTsKKworICAgIGlmICghaW5wdXQtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoIWN0eC0+aW5pdGlhbGlzZWQpIHsKKyAgICAgICAgZXJyID0gY29udm9sdXRpb25fb3BlbmNsX2luaXQoYXZjdHgpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBlcnIgPSBjb252b2x1dGlvbl9vcGVuY2xfbWFrZV9maWx0ZXJfcGFyYW1zKGF2Y3R4KTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb3V0cHV0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dHB1dCkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgRkZfQVJSQVlfRUxFTVMob3V0cHV0LT5kYXRhKTsgcCsrKSB7CisgICAgICAgIHNyYyA9IChjbF9tZW0pIGlucHV0LT5kYXRhW3BdOworICAgICAgICBkc3QgPSAoY2xfbWVtKW91dHB1dC0+ZGF0YVtwXTsKKworICAgICAgICBpZiAoIWRzdCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsLCAwLCBzaXplb2YoY2xfbWVtKSwgJmRzdCk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgImRlc3RpbmF0aW9uIGltYWdlIGFyZ3VtZW50OiAlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWwsIDEsIHNpemVvZihjbF9tZW0pLCAmc3JjKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQga2VybmVsICIKKyAgICAgICAgICAgICAgICAgICAic291cmNlIGltYWdlIGFyZ3VtZW50OiAlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWwsIDIsIHNpemVvZihjbF9pbnQpLCAmY3R4LT5kaW1zW3BdKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQga2VybmVsICIKKyAgICAgICAgICAgICAgICAgICAibWF0cml4IHNpemUgYXJndW1lbnQ6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwgMywgc2l6ZW9mKGNsX21lbSksICZjdHgtPm1hdHJpeFtwXSk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgIm1hdHJpeCBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsLCA0LCBzaXplb2YoY2xfZmxvYXQpLCAmY3R4LT5yZGl2c1twXSk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgInJkaXYgYXJndW1lbnQ6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwgNSwgc2l6ZW9mKGNsX2Zsb2F0KSwgJmN0eC0+Ymlhc2VzW3BdKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQga2VybmVsICIKKyAgICAgICAgICAgICAgICAgICAiYmlhcyBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKworICAgICAgICBlcnIgPSBmZl9vcGVuY2xfZmlsdGVyX3dvcmtfc2l6ZV9mcm9tX2ltYWdlKGF2Y3R4LCBnbG9iYWxfd29yaywgb3V0cHV0LCBwLCAwKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJSdW4ga2VybmVsIG9uIHBsYW5lICVkICIKKyAgICAgICAgICAgICAgICIoJSJTSVpFX1NQRUNJRklFUiJ4JSJTSVpFX1NQRUNJRklFUiIpLlxuIiwKKyAgICAgICAgICAgICAgIHAsIGdsb2JhbF93b3JrWzBdLCBnbG9iYWxfd29ya1sxXSk7CisKKyAgICAgICAgY2xlID0gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbChjdHgtPmNvbW1hbmRfcXVldWUsIGN0eC0+a2VybmVsLCAyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF93b3JrLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVucXVldWUga2VybmVsOiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgY2xlKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsZSA9IGNsRmluaXNoKGN0eC0+Y29tbWFuZF9xdWV1ZSk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmlzaCBjb21tYW5kIHF1ZXVlOiAlZC5cbiIsCisgICAgICAgICAgICAgICBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHB1dCwgaW5wdXQpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dCk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgb3V0cHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dHB1dC0+Zm9ybWF0KSwKKyAgICAgICAgICAgb3V0cHV0LT53aWR0aCwgb3V0cHV0LT5oZWlnaHQsIG91dHB1dC0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cHV0KTsKKworZmFpbDoKKyAgICBjbEZpbmlzaChjdHgtPmNvbW1hbmRfcXVldWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmlucHV0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXQpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgY29udm9sdXRpb25fb3BlbmNsX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIENvbnZvbHV0aW9uT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgY2xfaW50IGNsZTsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgY2xSZWxlYXNlTWVtT2JqZWN0KGN0eC0+bWF0cml4W2ldKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5rZXJuZWwpIHsKKyAgICAgICAgY2xlID0gY2xSZWxlYXNlS2VybmVsKGN0eC0+a2VybmVsKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVsZWFzZSAiCisgICAgICAgICAgICAgICAgICAgImtlcm5lbDogJWQuXG4iLCBjbGUpOworICAgIH0KKworICAgIGlmIChjdHgtPmNvbW1hbmRfcXVldWUpIHsKKyAgICAgICAgY2xlID0gY2xSZWxlYXNlQ29tbWFuZFF1ZXVlKGN0eC0+Y29tbWFuZF9xdWV1ZSk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2UgIgorICAgICAgICAgICAgICAgICAgICJjb21tYW5kIHF1ZXVlOiAlZC5cbiIsIGNsZSk7CisgICAgfQorCisgICAgZmZfb3BlbmNsX2ZpbHRlcl91bmluaXQoYXZjdHgpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDb252b2x1dGlvbk9wZW5DTENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjb252b2x1dGlvbl9vcGVuY2xfb3B0aW9uc1tdID0geworICAgIHsgIjBtIiwgInNldCBtYXRyaXggZm9yIDJuZCBwbGFuZSIsIE9GRlNFVChtYXRyaXhfc3RyWzBdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMCAwIDAgMCAxIDAgMCAwIDAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICIxbSIsICJzZXQgbWF0cml4IGZvciAybmQgcGxhbmUiLCBPRkZTRVQobWF0cml4X3N0clsxXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjAgMCAwIDAgMSAwIDAgMCAwIn0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAiMm0iLCAic2V0IG1hdHJpeCBmb3IgM3JkIHBsYW5lIiwgT0ZGU0VUKG1hdHJpeF9zdHJbMl0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIwIDAgMCAwIDEgMCAwIDAgMCJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgIjNtIiwgInNldCBtYXRyaXggZm9yIDR0aCBwbGFuZSIsIE9GRlNFVChtYXRyaXhfc3RyWzNdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMCAwIDAgMCAxIDAgMCAwIDAifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICIwcmRpdiIsICJzZXQgcmRpdiBmb3IgMW5kIHBsYW5lIiwgT0ZGU0VUKHJkaXZzWzBdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIDAuMCwgSU5UX01BWCwgRkxBR1N9LAorICAgIHsgIjFyZGl2IiwgInNldCByZGl2IGZvciAybmQgcGxhbmUiLCBPRkZTRVQocmRpdnNbMV0pLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MS4wfSwgMC4wLCBJTlRfTUFYLCBGTEFHU30sCisgICAgeyAiMnJkaXYiLCAic2V0IHJkaXYgZm9yIDNyZCBwbGFuZSIsIE9GRlNFVChyZGl2c1syXSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xLjB9LCAwLjAsIElOVF9NQVgsIEZMQUdTfSwKKyAgICB7ICIzcmRpdiIsICJzZXQgcmRpdiBmb3IgNHRoIHBsYW5lIiwgT0ZGU0VUKHJkaXZzWzNdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIDAuMCwgSU5UX01BWCwgRkxBR1N9LAorICAgIHsgIjBiaWFzIiwgInNldCBiaWFzIGZvciAxc3QgcGxhbmUiLCBPRkZTRVQoYmlhc2VzWzBdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMH0sIDAuMCwgSU5UX01BWCwgRkxBR1N9LAorICAgIHsgIjFiaWFzIiwgInNldCBiaWFzIGZvciAybmQgcGxhbmUiLCBPRkZTRVQoYmlhc2VzWzFdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMH0sIDAuMCwgSU5UX01BWCwgRkxBR1N9LAorICAgIHsgIjJiaWFzIiwgInNldCBiaWFzIGZvciAzcmQgcGxhbmUiLCBPRkZTRVQoYmlhc2VzWzJdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMH0sIDAuMCwgSU5UX01BWCwgRkxBR1N9LAorICAgIHsgIjNiaWFzIiwgInNldCBiaWFzIGZvciA0dGggcGxhbmUiLCBPRkZTRVQoYmlhc2VzWzNdKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMH0sIDAuMCwgSU5UX01BWCwgRkxBR1N9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoY29udm9sdXRpb25fb3BlbmNsKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGNvbnZvbHV0aW9uX29wZW5jbF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSAmY29udm9sdXRpb25fb3BlbmNsX2ZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9ICZmZl9vcGVuY2xfZmlsdGVyX2NvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgY29udm9sdXRpb25fb3BlbmNsX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSAmZmZfb3BlbmNsX2ZpbHRlcl9jb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2NvbnZvbHV0aW9uX29wZW5jbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY29udm9sdXRpb25fb3BlbmNsIiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgY29udm9sdXRpb24gbWFzayB0byBpbnB1dCB2aWRlbyIpLAorICAgIC5wcml2X3NpemUgICAgICA9IHNpemVvZihDb252b2x1dGlvbk9wZW5DTENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZjb252b2x1dGlvbl9vcGVuY2xfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgID0gJmZmX29wZW5jbF9maWx0ZXJfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSAmY29udm9sdXRpb25fb3BlbmNsX3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyAgPSAmZmZfb3BlbmNsX2ZpbHRlcl9xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgICA9IGNvbnZvbHV0aW9uX29wZW5jbF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gY29udm9sdXRpb25fb3BlbmNsX291dHB1dHMsCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jb252b2x2ZS5jIGIvbGliYXZmaWx0ZXIvdmZfY29udm9sdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJlZGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfY29udm9sdmUuYwpAQCAtMCwwICsxLDY3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2ZmZ0LmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKyNkZWZpbmUgTUFYX1RIUkVBRFMgMTYKKwordHlwZWRlZiBzdHJ1Y3QgQ29udm9sdmVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBGRkZyYW1lU3luYyBmczsKKworICAgIEZGVENvbnRleHQgKmZmdFs0XVtNQVhfVEhSRUFEU107CisgICAgRkZUQ29udGV4dCAqaWZmdFs0XVtNQVhfVEhSRUFEU107CisKKyAgICBpbnQgZmZ0X2JpdHNbNF07CisgICAgaW50IGZmdF9sZW5bNF07CisgICAgaW50IHBsYW5ld2lkdGhbNF07CisgICAgaW50IHBsYW5laGVpZ2h0WzRdOworCisgICAgRkZUQ29tcGxleCAqZmZ0X2hkYXRhWzRdOworICAgIEZGVENvbXBsZXggKmZmdF92ZGF0YVs0XTsKKyAgICBGRlRDb21wbGV4ICpmZnRfaGRhdGFfaW1wdWxzZVs0XTsKKyAgICBGRlRDb21wbGV4ICpmZnRfdmRhdGFfaW1wdWxzZVs0XTsKKworICAgIGludCBkZXB0aDsKKyAgICBpbnQgcGxhbmVzOworICAgIGludCBpbXB1bHNlOworICAgIGZsb2F0IG5vaXNlOworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IGdvdF9pbXB1bHNlWzRdOworCisgICAgaW50ICgqZmlsdGVyKShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKTsKK30gQ29udm9sdmVDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDb252b2x2ZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY29udm9sdmVfb3B0aW9uc1tdID0geworICAgIHsgInBsYW5lcyIsICAic2V0IHBsYW5lcyB0byBjb252b2x2ZSIsICAgICAgICAgICAgICAgICAgT0ZGU0VUKHBsYW5lcyksICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTd9LCAwLCAxNSwgRkxBR1MgfSwKKyAgICB7ICJpbXB1bHNlIiwgIndoZW4gdG8gcHJvY2VzcyBpbXB1bHNlcyIsICAgICAgICAgICAgICAgIE9GRlNFVChpbXB1bHNlKSwgIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND0xfSwgMCwgIDEsIEZMQUdTLCAiaW1wdWxzZSIgfSwKKyAgICB7ICAgImZpcnN0IiwgInByb2Nlc3Mgb25seSBmaXJzdCBpbXB1bHNlLCBpZ25vcmUgcmVzdCIsIDAsICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgIDAsIEZMQUdTLCAiaW1wdWxzZSIgfSwKKyAgICB7ICAgImFsbCIsICAgInByb2Nlc3MgYWxsIGltcHVsc2VzIiwgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgIDAsIEZMQUdTLCAiaW1wdWxzZSIgfSwKKyAgICB7ICJub2lzZSIsICAgInNldCBub2lzZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChub2lzZSksICAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjAwMDAwMDF9LCAwLCAgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2ZtdHNfZmZ0ZmlsdFtdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTIsIEFWX1BJWF9GTVRfR0JSQVAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhlbF9mbXRzX2ZmdGZpbHQpOworICAgIGlmICghZm10c19saXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmbXRzX2xpc3QpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dF9tYWluKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIENvbnZvbHZlQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCBmZnRfYml0cywgaTsKKworICAgIHMtPnBsYW5ld2lkdGhbMV0gPSBzLT5wbGFuZXdpZHRoWzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBkZXNjLT5sb2cyX2Nocm9tYV93KTsKKyAgICBzLT5wbGFuZXdpZHRoWzBdID0gcy0+cGxhbmV3aWR0aFszXSA9IGlubGluay0+dzsKKyAgICBzLT5wbGFuZWhlaWdodFsxXSA9IHMtPnBsYW5laGVpZ2h0WzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOworCisgICAgcy0+bmJfcGxhbmVzID0gZGVzYy0+bmJfY29tcG9uZW50czsKKyAgICBzLT5kZXB0aCA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgaW50IHcgPSBzLT5wbGFuZXdpZHRoW2ldOworICAgICAgICBpbnQgaCA9IHMtPnBsYW5laGVpZ2h0W2ldOworICAgICAgICBpbnQgbiA9IEZGTUFYKHcsIGgpOworCisgICAgICAgIGZvciAoZmZ0X2JpdHMgPSAxOyAxIDw8IGZmdF9iaXRzIDwgbjsgZmZ0X2JpdHMrKyk7CisKKyAgICAgICAgcy0+ZmZ0X2JpdHNbaV0gPSBmZnRfYml0czsKKyAgICAgICAgcy0+ZmZ0X2xlbltpXSA9IDEgPDwgcy0+ZmZ0X2JpdHNbaV07CisKKyAgICAgICAgaWYgKCEocy0+ZmZ0X2hkYXRhW2ldID0gYXZfY2FsbG9jKHMtPmZmdF9sZW5baV0sIHMtPmZmdF9sZW5baV0gKiBzaXplb2YoRkZUQ29tcGxleCkpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaWYgKCEocy0+ZmZ0X3ZkYXRhW2ldID0gYXZfY2FsbG9jKHMtPmZmdF9sZW5baV0sIHMtPmZmdF9sZW5baV0gKiBzaXplb2YoRkZUQ29tcGxleCkpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaWYgKCEocy0+ZmZ0X2hkYXRhX2ltcHVsc2VbaV0gPSBhdl9jYWxsb2Mocy0+ZmZ0X2xlbltpXSwgcy0+ZmZ0X2xlbltpXSAqIHNpemVvZihGRlRDb21wbGV4KSkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBpZiAoIShzLT5mZnRfdmRhdGFfaW1wdWxzZVtpXSA9IGF2X2NhbGxvYyhzLT5mZnRfbGVuW2ldLCBzLT5mZnRfbGVuW2ldICogc2l6ZW9mKEZGVENvbXBsZXgpKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dF9pbXB1bHNlKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OworCisgICAgaWYgKGN0eC0+aW5wdXRzWzBdLT53ICE9IGN0eC0+aW5wdXRzWzFdLT53IHx8CisgICAgICAgIGN0eC0+aW5wdXRzWzBdLT5oICE9IGN0eC0+aW5wdXRzWzFdLT5oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIldpZHRoIGFuZCBoZWlnaHQgb2YgaW5wdXQgdmlkZW9zIG11c3QgYmUgc2FtZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoY3R4LT5pbnB1dHNbMF0tPmZvcm1hdCAhPSBjdHgtPmlucHV0c1sxXS0+Zm9ybWF0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIklucHV0cyBtdXN0IGJlIG9mIHNhbWUgcGl4ZWwgZm9ybWF0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIEZGVENvbXBsZXggKmhkYXRhLCAqdmRhdGE7CisgICAgaW50IHBsYW5lLCBuOworfSBUaHJlYWREYXRhOworCitzdGF0aWMgaW50IGZmdF9ob3Jpem9udGFsKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgQ29udm9sdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIEZGVENvbXBsZXggKmhkYXRhID0gdGQtPmhkYXRhOworICAgIGNvbnN0IGludCBwbGFuZSA9IHRkLT5wbGFuZTsKKyAgICBjb25zdCBpbnQgbiA9IHRkLT5uOworICAgIGludCBzdGFydCA9IChuICogam9ibnIpIC8gbmJfam9iczsKKyAgICBpbnQgZW5kID0gKG4gKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyspIHsKKyAgICAgICAgYXZfZmZ0X3Blcm11dGUocy0+ZmZ0W3BsYW5lXVtqb2Jucl0sIGhkYXRhICsgeSAqIG4pOworICAgICAgICBhdl9mZnRfY2FsYyhzLT5mZnRbcGxhbmVdW2pvYm5yXSwgaGRhdGEgKyB5ICogbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9pbnB1dChDb252b2x2ZUNvbnRleHQgKnMsIEZGVENvbXBsZXggKmZmdF9oZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICppbiwgaW50IHcsIGludCBoLCBpbnQgbiwgaW50IHBsYW5lLCBmbG9hdCBzY2FsZSkKK3sKKyAgICBjb25zdCBpbnQgaXcgPSAobiAtIHcpIC8gMiwgaWggPSAobiAtIGgpIC8gMjsKKyAgICBpbnQgeSwgeDsKKworICAgIGlmIChzLT5kZXB0aCA9PSA4KSB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGluLT5kYXRhW3BsYW5lXSArIGluLT5saW5lc2l6ZVtwbGFuZV0gKiB5OworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhWyh5ICsgaWgpICogbiArIGl3ICsgeF0ucmUgPSBzcmNbeF0gKiBzY2FsZTsKKyAgICAgICAgICAgICAgICBmZnRfaGRhdGFbKHkgKyBpaCkgKiBuICsgaXcgKyB4XS5pbSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhWyh5ICsgaWgpICogbiArIHhdLnJlID0gZmZ0X2hkYXRhWyh5ICsgaWgpICogbiArIGl3XS5yZTsKKyAgICAgICAgICAgICAgICBmZnRfaGRhdGFbKHkgKyBpaCkgKiBuICsgeF0uaW0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHggPSBuIC0gaXc7IHggPCBuOyB4KyspIHsKKyAgICAgICAgICAgICAgICBmZnRfaGRhdGFbKHkgKyBpaCkgKiBuICsgeF0ucmUgPSBmZnRfaGRhdGFbKHkgKyBpaCkgKiBuICsgbiAtIGl3IC0gMV0ucmU7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhWyh5ICsgaWgpICogbiArIHhdLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBpaDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhW3kgKiBuICsgeF0ucmUgPSBmZnRfaGRhdGFbaWggKiBuICsgeF0ucmU7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhW3kgKiBuICsgeF0uaW0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gbiAtIGloOyB5IDwgbjsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhW3kgKiBuICsgeF0ucmUgPSBmZnRfaGRhdGFbKG4gLSBpaCAtIDEpICogbiArIHhdLnJlOworICAgICAgICAgICAgICAgIGZmdF9oZGF0YVt5ICogbiArIHhdLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKikoaW4tPmRhdGFbcGxhbmVdICsgaW4tPmxpbmVzaXplW3BsYW5lXSAqIHkpOworCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhWyh5ICsgaWgpICogbiArIGl3ICsgeF0ucmUgPSBzcmNbeF0gKiBzY2FsZTsKKyAgICAgICAgICAgICAgICBmZnRfaGRhdGFbKHkgKyBpaCkgKiBuICsgaXcgKyB4XS5pbSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBpdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhWyh5ICsgaWgpICogbiArIHhdLnJlID0gZmZ0X2hkYXRhWyh5ICsgaWgpICogbiArIGl3XS5yZTsKKyAgICAgICAgICAgICAgICBmZnRfaGRhdGFbKHkgKyBpaCkgKiBuICsgeF0uaW0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHggPSBuIC0gaXc7IHggPCBuOyB4KyspIHsKKyAgICAgICAgICAgICAgICBmZnRfaGRhdGFbKHkgKyBpaCkgKiBuICsgeF0ucmUgPSBmZnRfaGRhdGFbKHkgKyBpaCkgKiBuICsgbiAtIGl3IC0gMV0ucmU7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhWyh5ICsgaWgpICogbiArIHhdLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBpaDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhW3kgKiBuICsgeF0ucmUgPSBmZnRfaGRhdGFbaWggKiBuICsgeF0ucmU7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhW3kgKiBuICsgeF0uaW0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gbiAtIGloOyB5IDwgbjsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbjsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmZ0X2hkYXRhW3kgKiBuICsgeF0ucmUgPSBmZnRfaGRhdGFbKG4gLSBpaCAtIDEpICogbiArIHhdLnJlOworICAgICAgICAgICAgICAgIGZmdF9oZGF0YVt5ICogbiArIHhdLmltID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBmZnRfdmVydGljYWwoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBDb252b2x2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgRkZUQ29tcGxleCAqaGRhdGEgPSB0ZC0+aGRhdGE7CisgICAgRkZUQ29tcGxleCAqdmRhdGEgPSB0ZC0+dmRhdGE7CisgICAgY29uc3QgaW50IHBsYW5lID0gdGQtPnBsYW5lOworICAgIGNvbnN0IGludCBuID0gdGQtPm47CisgICAgaW50IHN0YXJ0ID0gKG4gKiBqb2JucikgLyBuYl9qb2JzOworICAgIGludCBlbmQgPSAobiAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgIGludCB5LCB4OworCisgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgbjsgeCsrKSB7CisgICAgICAgICAgICB2ZGF0YVt5ICogbiArIHhdLnJlID0gaGRhdGFbeCAqIG4gKyB5XS5yZTsKKyAgICAgICAgICAgIHZkYXRhW3kgKiBuICsgeF0uaW0gPSBoZGF0YVt4ICogbiArIHldLmltOworICAgICAgICB9CisKKyAgICAgICAgYXZfZmZ0X3Blcm11dGUocy0+ZmZ0W3BsYW5lXVtqb2Jucl0sIHZkYXRhICsgeSAqIG4pOworICAgICAgICBhdl9mZnRfY2FsYyhzLT5mZnRbcGxhbmVdW2pvYm5yXSwgdmRhdGEgKyB5ICogbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWZmdF92ZXJ0aWNhbChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIENvbnZvbHZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBGRlRDb21wbGV4ICpoZGF0YSA9IHRkLT5oZGF0YTsKKyAgICBGRlRDb21wbGV4ICp2ZGF0YSA9IHRkLT52ZGF0YTsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CisgICAgY29uc3QgaW50IG4gPSB0ZC0+bjsKKyAgICBpbnQgc3RhcnQgPSAobiAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgaW50IGVuZCA9IChuICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHksIHg7CisKKyAgICBmb3IgKHkgPSBzdGFydDsgeSA8IGVuZDsgeSsrKSB7CisgICAgICAgIGF2X2ZmdF9wZXJtdXRlKHMtPmlmZnRbcGxhbmVdW2pvYm5yXSwgdmRhdGEgKyB5ICogbik7CisgICAgICAgIGF2X2ZmdF9jYWxjKHMtPmlmZnRbcGxhbmVdW2pvYm5yXSwgdmRhdGEgKyB5ICogbik7CisKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IG47IHgrKykgeworICAgICAgICAgICAgaGRhdGFbeCAqIG4gKyB5XS5yZSA9IHZkYXRhW3kgKiBuICsgeF0ucmU7CisgICAgICAgICAgICBoZGF0YVt4ICogbiArIHldLmltID0gdmRhdGFbeSAqIG4gKyB4XS5pbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlmZnRfaG9yaXpvbnRhbChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIENvbnZvbHZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBGRlRDb21wbGV4ICpoZGF0YSA9IHRkLT5oZGF0YTsKKyAgICBjb25zdCBpbnQgcGxhbmUgPSB0ZC0+cGxhbmU7CisgICAgY29uc3QgaW50IG4gPSB0ZC0+bjsKKyAgICBpbnQgc3RhcnQgPSAobiAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgaW50IGVuZCA9IChuICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSBzdGFydDsgeSA8IGVuZDsgeSsrKSB7CisgICAgICAgIGF2X2ZmdF9wZXJtdXRlKHMtPmlmZnRbcGxhbmVdW2pvYm5yXSwgaGRhdGEgKyB5ICogbik7CisgICAgICAgIGF2X2ZmdF9jYWxjKHMtPmlmZnRbcGxhbmVdW2pvYm5yXSwgaGRhdGEgKyB5ICogbik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9vdXRwdXQoQ29udm9sdmVDb250ZXh0ICpzLCBGRlRDb21wbGV4ICppbnB1dCwgQVZGcmFtZSAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBuLCBpbnQgcGxhbmUsIGZsb2F0IHNjYWxlKQoreworICAgIGNvbnN0IGludCBtYXggPSAoMSA8PCBzLT5kZXB0aCkgLSAxOworICAgIGNvbnN0IGludCBoaCA9IGggLyAyOworICAgIGNvbnN0IGludCBodyA9IHcgLyAyOworICAgIGludCB5LCB4OworCisgICAgaWYgKHMtPmRlcHRoID09IDgpIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhoOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YVtwbGFuZV0gKyAoeSArIGhoKSAqIG91dC0+bGluZXNpemVbcGxhbmVdICsgaHc7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaHc7IHgrKykKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3VpbnQ4KGlucHV0W3kgKiBuICsgeF0ucmUgKiBzY2FsZSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhoOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YVtwbGFuZV0gKyAoeSArIGhoKSAqIG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGh3OyB4KyspCisgICAgICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF91aW50OChpbnB1dFt5ICogbiArIG4gLSBodyArIHhdLnJlICogc2NhbGUpOworICAgICAgICB9CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoaDsgeSsrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGFbcGxhbmVdICsgeSAqIG91dC0+bGluZXNpemVbcGxhbmVdICsgaHc7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaHc7IHgrKykKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwX3VpbnQ4KGlucHV0WyhuIC0gaGggKyB5KSAqIG4gKyB4XS5yZSAqIHNjYWxlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGg7IHkrKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhW3BsYW5lXSArIHkgKiBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBodzsgeCsrKQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGF2X2NsaXBfdWludDgoaW5wdXRbKG4gLSBoaCArIHkpICogbiArIG4gLSBodyArIHhdLnJlICogc2NhbGUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhoOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKikob3V0LT5kYXRhW3BsYW5lXSArICh5ICsgaGgpICogb3V0LT5saW5lc2l6ZVtwbGFuZV0gKyBodyAqIDIpOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGh3OyB4KyspCisgICAgICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcChpbnB1dFt5ICogbiArIHhdLnJlICogc2NhbGUsIDAsIG1heCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhoOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKikob3V0LT5kYXRhW3BsYW5lXSArICh5ICsgaGgpICogb3V0LT5saW5lc2l6ZVtwbGFuZV0pOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGh3OyB4KyspCisgICAgICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcChpbnB1dFt5ICogbiArIG4gLSBodyArIHhdLnJlICogc2NhbGUsIDAsIG1heCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhoOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKikob3V0LT5kYXRhW3BsYW5lXSArIHkgKiBvdXQtPmxpbmVzaXplW3BsYW5lXSArIGh3ICogMik7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgaHc7IHgrKykKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwKGlucHV0WyhuIC0gaGggKyB5KSAqIG4gKyB4XS5yZSAqIHNjYWxlLCAwLCBtYXgpOworICAgICAgICB9CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoaDsgeSsrKSB7CisgICAgICAgICAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopKG91dC0+ZGF0YVtwbGFuZV0gKyB5ICogb3V0LT5saW5lc2l6ZVtwbGFuZV0pOworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGh3OyB4KyspCisgICAgICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcChpbnB1dFsobiAtIGhoICsgeSkgKiBuICsgbiAtIGh3ICsgeF0ucmUgKiBzY2FsZSwgMCwgbWF4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBjb21wbGV4X211bHRpcGx5KEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgQ29udm9sdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIEZGVENvbXBsZXggKmlucHV0ID0gdGQtPmhkYXRhOworICAgIEZGVENvbXBsZXggKmZpbHRlciA9IHRkLT52ZGF0YTsKKyAgICBjb25zdCBmbG9hdCBub2lzZSA9IHMtPm5vaXNlOworICAgIGNvbnN0IGludCBuID0gdGQtPm47CisgICAgaW50IHN0YXJ0ID0gKG4gKiBqb2JucikgLyBuYl9qb2JzOworICAgIGludCBlbmQgPSAobiAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgIGludCB5LCB4OworCisgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKykgeworICAgICAgICBpbnQgeW4gPSB5ICogbjsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgbjsgeCsrKSB7CisgICAgICAgICAgICBGRlRTYW1wbGUgcmUsIGltLCBpcmUsIGlpbTsKKworICAgICAgICAgICAgcmUgPSBpbnB1dFt5biArIHhdLnJlOworICAgICAgICAgICAgaW0gPSBpbnB1dFt5biArIHhdLmltOworICAgICAgICAgICAgaXJlID0gZmlsdGVyW3luICsgeF0ucmUgKyBub2lzZTsKKyAgICAgICAgICAgIGlpbSA9IGZpbHRlclt5biArIHhdLmltOworCisgICAgICAgICAgICBpbnB1dFt5biArIHhdLnJlID0gaXJlICogcmUgLSBpaW0gKiBpbTsKKyAgICAgICAgICAgIGlucHV0W3luICsgeF0uaW0gPSBpaW0gKiByZSArIGlyZSAqIGltOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGxleF9kaXZpZGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBDb252b2x2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgRkZUQ29tcGxleCAqaW5wdXQgPSB0ZC0+aGRhdGE7CisgICAgRkZUQ29tcGxleCAqZmlsdGVyID0gdGQtPnZkYXRhOworICAgIGNvbnN0IGZsb2F0IG5vaXNlID0gcy0+bm9pc2U7CisgICAgY29uc3QgaW50IG4gPSB0ZC0+bjsKKyAgICBpbnQgc3RhcnQgPSAobiAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgaW50IGVuZCA9IChuICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHksIHg7CisKKyAgICBmb3IgKHkgPSBzdGFydDsgeSA8IGVuZDsgeSsrKSB7CisgICAgICAgIGludCB5biA9IHkgKiBuOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBuOyB4KyspIHsKKyAgICAgICAgICAgIEZGVFNhbXBsZSByZSwgaW0sIGlyZSwgaWltLCBkaXY7CisKKyAgICAgICAgICAgIHJlID0gaW5wdXRbeW4gKyB4XS5yZTsKKyAgICAgICAgICAgIGltID0gaW5wdXRbeW4gKyB4XS5pbTsKKyAgICAgICAgICAgIGlyZSA9IGZpbHRlclt5biArIHhdLnJlOworICAgICAgICAgICAgaWltID0gZmlsdGVyW3luICsgeF0uaW07CisgICAgICAgICAgICBkaXYgPSBpcmUgKiBpcmUgKyBpaW0gKiBpaW0gKyBub2lzZTsKKworICAgICAgICAgICAgaW5wdXRbeW4gKyB4XS5yZSA9IChpcmUgKiByZSArIGlpbSAqIGltKSAvIGRpdjsKKyAgICAgICAgICAgIGlucHV0W3luICsgeF0uaW0gPSAoaXJlICogaW0gLSBpaW0gKiByZSkgLyBkaXY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19jb252b2x2ZShGRkZyYW1lU3luYyAqZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBDb252b2x2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqbWFpbnBpYyA9IE5VTEwsICppbXB1bHNlcGljID0gTlVMTDsKKyAgICBpbnQgcmV0LCB5LCB4LCBwbGFuZTsKKworICAgIHJldCA9IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRfZ2V0KGZzLCAmbWFpbnBpYywgJmltcHVsc2VwaWMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICghaW1wdWxzZXBpYykKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBtYWlucGljKTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPm5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICBGRlRDb21wbGV4ICpmaWx0ZXIgPSBzLT5mZnRfdmRhdGFfaW1wdWxzZVtwbGFuZV07CisgICAgICAgIEZGVENvbXBsZXggKmlucHV0ID0gcy0+ZmZ0X3ZkYXRhW3BsYW5lXTsKKyAgICAgICAgY29uc3QgaW50IG4gPSBzLT5mZnRfbGVuW3BsYW5lXTsKKyAgICAgICAgY29uc3QgaW50IHcgPSBzLT5wbGFuZXdpZHRoW3BsYW5lXTsKKyAgICAgICAgY29uc3QgaW50IGggPSBzLT5wbGFuZWhlaWdodFtwbGFuZV07CisgICAgICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAgICAgVGhyZWFkRGF0YSB0ZDsKKworICAgICAgICBpZiAoIShzLT5wbGFuZXMgJiAoMSA8PCBwbGFuZSkpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHRkLnBsYW5lID0gcGxhbmUsIHRkLm4gPSBuOworICAgICAgICBnZXRfaW5wdXQocywgcy0+ZmZ0X2hkYXRhW3BsYW5lXSwgbWFpbnBpYywgdywgaCwgbiwgcGxhbmUsIDEuZik7CisKKyAgICAgICAgdGQuaGRhdGEgPSBzLT5mZnRfaGRhdGFbcGxhbmVdOworICAgICAgICB0ZC52ZGF0YSA9IHMtPmZmdF92ZGF0YVtwbGFuZV07CisKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZmdF9ob3Jpem9udGFsLCAmdGQsIE5VTEwsIEZGTUlOMyhNQVhfVEhSRUFEUywgbiwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZmdF92ZXJ0aWNhbCwgJnRkLCBOVUxMLCBGRk1JTjMoTUFYX1RIUkVBRFMsIG4sIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CisKKyAgICAgICAgaWYgKCghcy0+aW1wdWxzZSAmJiAhcy0+Z290X2ltcHVsc2VbcGxhbmVdKSB8fCBzLT5pbXB1bHNlKSB7CisgICAgICAgICAgICBpZiAocy0+ZGVwdGggPT0gOCkgeworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0gKGNvbnN0IHVpbnQ4X3QgKikoaW1wdWxzZXBpYy0+ZGF0YVtwbGFuZV0gKyB5ICogaW1wdWxzZXBpYy0+bGluZXNpemVbcGxhbmVdKSA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHNyY1t4XTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopKGltcHVsc2VwaWMtPmRhdGFbcGxhbmVdICsgeSAqIGltcHVsc2VwaWMtPmxpbmVzaXplW3BsYW5lXSkgOworICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBzcmNbeF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbCA9IEZGTUFYKDEsIHRvdGFsKTsKKworICAgICAgICAgICAgZ2V0X2lucHV0KHMsIHMtPmZmdF9oZGF0YV9pbXB1bHNlW3BsYW5lXSwgaW1wdWxzZXBpYywgdywgaCwgbiwgcGxhbmUsIDEuZiAvIHRvdGFsKTsKKworICAgICAgICAgICAgdGQuaGRhdGEgPSBzLT5mZnRfaGRhdGFfaW1wdWxzZVtwbGFuZV07CisgICAgICAgICAgICB0ZC52ZGF0YSA9IHMtPmZmdF92ZGF0YV9pbXB1bHNlW3BsYW5lXTsKKworICAgICAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZmdF9ob3Jpem9udGFsLCAmdGQsIE5VTEwsIEZGTUlOMyhNQVhfVEhSRUFEUywgbiwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKKyAgICAgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmZnRfdmVydGljYWwsICZ0ZCwgTlVMTCwgRkZNSU4zKE1BWF9USFJFQURTLCBuLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOworCisgICAgICAgICAgICBzLT5nb3RfaW1wdWxzZVtwbGFuZV0gPSAxOworICAgICAgICB9CisKKyAgICAgICAgdGQuaGRhdGEgPSBpbnB1dDsKKyAgICAgICAgdGQudmRhdGEgPSBmaWx0ZXI7CisKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHMtPmZpbHRlciwgJnRkLCBOVUxMLCBGRk1JTjMoTUFYX1RIUkVBRFMsIG4sIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CisKKyAgICAgICAgdGQuaGRhdGEgPSBzLT5mZnRfaGRhdGFbcGxhbmVdOworICAgICAgICB0ZC52ZGF0YSA9IHMtPmZmdF92ZGF0YVtwbGFuZV07CisKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGlmZnRfdmVydGljYWwsICZ0ZCwgTlVMTCwgRkZNSU4zKE1BWF9USFJFQURTLCBuLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOworICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgaWZmdF9ob3Jpem9udGFsLCAmdGQsIE5VTEwsIEZGTUlOMyhNQVhfVEhSRUFEUywgbiwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKKworICAgICAgICBnZXRfb3V0cHV0KHMsIHMtPmZmdF9oZGF0YVtwbGFuZV0sIG1haW5waWMsIHcsIGgsIG4sIHBsYW5lLCAxLmYgLyAobiAqIG4pKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG1haW5waWMpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIENvbnZvbHZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm1haW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgaW50IHJldCwgaSwgajsKKworICAgIHMtPmZzLm9uX2V2ZW50ID0gZG9fY29udm9sdmU7CisgICAgcmV0ID0gZmZfZnJhbWVzeW5jX2luaXRfZHVhbGlucHV0KCZzLT5mcywgY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBvdXRsaW5rLT53ID0gbWFpbmxpbmstPnc7CisgICAgb3V0bGluay0+aCA9IG1haW5saW5rLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IG1haW5saW5rLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IG1haW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBtYWlubGluay0+ZnJhbWVfcmF0ZTsKKworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2NvbmZpZ3VyZSgmcy0+ZnMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IE1BWF9USFJFQURTOyBqKyspIHsKKyAgICAgICAgICAgIHMtPmZmdFtpXVtqXSAgPSBhdl9mZnRfaW5pdChzLT5mZnRfYml0c1tpXSwgMCk7CisgICAgICAgICAgICBzLT5pZmZ0W2ldW2pdID0gYXZfZmZ0X2luaXQocy0+ZmZ0X2JpdHNbaV0sIDEpOworICAgICAgICAgICAgaWYgKCFzLT5mZnRbaV1bal0gfHwgIXMtPmlmZnRbaV1bal0pCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENvbnZvbHZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENvbnZvbHZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmICghc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAiY29udm9sdmUiKSkgeworICAgICAgICBzLT5maWx0ZXIgPSBjb21wbGV4X211bHRpcGx5OworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImRlY29udm9sdmUiKSkgeworICAgICAgICBzLT5maWx0ZXIgPSBjb21wbGV4X2RpdmlkZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENvbnZvbHZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJnMtPmZmdF9oZGF0YVtpXSk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5mZnRfdmRhdGFbaV0pOworICAgICAgICBhdl9mcmVlcCgmcy0+ZmZ0X2hkYXRhX2ltcHVsc2VbaV0pOworICAgICAgICBhdl9mcmVlcCgmcy0+ZmZ0X3ZkYXRhX2ltcHVsc2VbaV0pOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBNQVhfVEhSRUFEUzsgaisrKSB7CisgICAgICAgICAgICBhdl9mZnRfZW5kKHMtPmZmdFtpXVtqXSk7CisgICAgICAgICAgICBhdl9mZnRfZW5kKHMtPmlmZnRbaV1bal0pOworICAgICAgICB9CisgICAgfQorCisgICAgZmZfZnJhbWVzeW5jX3VuaW5pdCgmcy0+ZnMpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgY29udm9sdmVfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJtYWluIiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX2lucHV0X21haW4sCisgICAgfSx7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImltcHVsc2UiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfaW5wdXRfaW1wdWxzZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgY29udm9sdmVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworI2lmIENPTkZJR19DT05WT0xWRV9GSUxURVIKKworRlJBTUVTWU5DX0RFRklORV9DTEFTUyhjb252b2x2ZSwgQ29udm9sdmVDb250ZXh0LCBmcyk7CisKK0FWRmlsdGVyIGZmX3ZmX2NvbnZvbHZlID0geworICAgIC5uYW1lICAgICAgICAgID0gImNvbnZvbHZlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDb252b2x2ZSBmaXJzdCB2aWRlbyBzdHJlYW0gd2l0aCBzZWNvbmQgdmlkZW8gc3RyZWFtLiIpLAorICAgIC5wcmVpbml0ICAgICAgID0gY29udm9sdmVfZnJhbWVzeW5jX3ByZWluaXQsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKENvbnZvbHZlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmY29udm9sdmVfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgPSBjb252b2x2ZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBjb252b2x2ZV9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19DT05WT0xWRV9GSUxURVIgKi8KKworI2lmIENPTkZJR19ERUNPTlZPTFZFX0ZJTFRFUgorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZGVjb252b2x2ZV9vcHRpb25zW10gPSB7CisgICAgeyAicGxhbmVzIiwgICJzZXQgcGxhbmVzIHRvIGRlY29udm9sdmUiLCAgICAgICAgICAgICAgICBPRkZTRVQocGxhbmVzKSwgICBBVl9PUFRfVFlQRV9JTlQsICAgey5pNjQ9N30sIDAsIDE1LCBGTEFHUyB9LAorICAgIHsgImltcHVsc2UiLCAid2hlbiB0byBwcm9jZXNzIGltcHVsc2VzIiwgICAgICAgICAgICAgICAgT0ZGU0VUKGltcHVsc2UpLCAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTF9LCAwLCAgMSwgRkxBR1MsICJpbXB1bHNlIiB9LAorICAgIHsgICAiZmlyc3QiLCAicHJvY2VzcyBvbmx5IGZpcnN0IGltcHVsc2UsIGlnbm9yZSByZXN0IiwgMCwgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAgMCwgRkxBR1MsICJpbXB1bHNlIiB9LAorICAgIHsgICAiYWxsIiwgICAicHJvY2VzcyBhbGwgaW1wdWxzZXMiLCAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAgMCwgRkxBR1MsICJpbXB1bHNlIiB9LAorICAgIHsgIm5vaXNlIiwgICAic2V0IG5vaXNlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKG5vaXNlKSwgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMDAwMDAwMX0sIDAsICAxLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworRlJBTUVTWU5DX0RFRklORV9DTEFTUyhkZWNvbnZvbHZlLCBDb252b2x2ZUNvbnRleHQsIGZzKTsKKworQVZGaWx0ZXIgZmZfdmZfZGVjb252b2x2ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJkZWNvbnZvbHZlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZWNvbnZvbHZlIGZpcnN0IHZpZGVvIHN0cmVhbSB3aXRoIHNlY29uZCB2aWRlbyBzdHJlYW0uIiksCisgICAgLnByZWluaXQgICAgICAgPSBkZWNvbnZvbHZlX2ZyYW1lc3luY19wcmVpbml0LAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmFjdGl2YXRlICAgICAgPSBhY3RpdmF0ZSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDb252b2x2ZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmRlY29udm9sdmVfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgPSBjb252b2x2ZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBjb252b2x2ZV9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKKworI2VuZGlmIC8qIENPTkZJR19ERUNPTlZPTFZFX0ZJTFRFUiAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfY29weS5jIGIvbGliYXZmaWx0ZXIvdmZfY29weS5jCmluZGV4IGZiOWE5MDYuLmIwMTU5Y2YgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2NvcHkuYworKysgYi9saWJhdmZpbHRlci92Zl9jb3B5LmMKQEAgLTI3LDYgKzI3LDIzIEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKyAgICBpbnQgZm10OworCisgICAgZm9yIChmbXQgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7IGZtdCsrKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9hZGRfZm9ybWF0KCZmb3JtYXRzLCBmbXQpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKK30KKwogc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQogewogICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOwpAQCAtNjQsNCArODEsNSBAQAogICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDb3B5IHRoZSBpbnB1dCB2aWRlbyB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dC4iKSwKICAgICAuaW5wdXRzICAgICAgPSBhdmZpbHRlcl92Zl9jb3B5X2lucHV0cywKICAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl92Zl9jb3B5X291dHB1dHMsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2NvcmVpbWFnZS5tIGIvbGliYXZmaWx0ZXIvdmZfY29yZWltYWdlLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzYTI4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2NvcmVpbWFnZS5tCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFRoaWxvIEJvcmdtYW5uCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFZpZGVvIHByb2Nlc3NpbmcgYmFzZWQgb24gQXBwbGUncyBDb3JlSW1hZ2UgQVBJCisgKi8KKworI2ltcG9ydCA8Q29yZUltYWdlL0NvcmVJbWFnZS5oPgorI2ltcG9ydCA8QXBwS2l0L0FwcEtpdC5oPgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCit0eXBlZGVmIHN0cnVjdCBDb3JlSW1hZ2VDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICAgKmNsYXNzOworCisgICAgaW50ICAgICAgICAgICAgIGlzX3ZpZGVvX3NvdXJjZTsgICAgLy8vPCBmaWx0ZXIgaXMgdXNlZCBhcyB2aWRlbyBzb3VyY2UKKworICAgIGludCAgICAgICAgICAgICB3LCBoOyAgICAgICAgICAgICAgIC8vLzwgdmlkZW8gc2l6ZQorICAgIEFWUmF0aW9uYWwgICAgICBzYXI7ICAgICAgICAgICAgICAgIC8vLzwgc2FtcGxlIGFzcGVjdCByYXRpbworICAgIEFWUmF0aW9uYWwgICAgICBmcmFtZV9yYXRlOyAgICAgICAgIC8vLzwgdmlkZW8gZnJhbWUgcmF0ZQorICAgIEFWUmF0aW9uYWwgICAgICB0aW1lX2Jhc2U7ICAgICAgICAgIC8vLzwgc3RyZWFtIHRpbWUgYmFzZQorICAgIGludDY0X3QgICAgICAgICBkdXJhdGlvbjsgICAgICAgICAgIC8vLzwgZHVyYXRpb24gZXhwcmVzc2VkIGluIG1pY3Jvc2Vjb25kcworICAgIGludDY0X3QgICAgICAgICBwdHM7ICAgICAgICAgICAgICAgIC8vLzwgaW5jcmVhc2luZyBwcmVzZW50YXRpb24gdGltZSBzdGFtcAorICAgIEFWRnJhbWUgICAgICAgICAqcGljcmVmOyAgICAgICAgICAgIC8vLzwgY2FjaGVkIHJlZmVyZW5jZSBjb250YWluaW5nIHRoZSBwYWludGVkIHBpY3R1cmUKKworICAgIENGVHlwZVJlZiAgICAgICBnbGN0eDsgICAgICAgICAgICAgIC8vLzwgT3BlbkdMIGNvbnRleHQKKyAgICBDR0NvbnRleHRSZWYgICAgY2djdHg7ICAgICAgICAgICAgICAvLy88IEJpdG1hcCBjb250ZXh0IGZvciBpbWFnZSBjb3B5CisgICAgQ0ZUeXBlUmVmICAgICAgIGlucHV0X2ltYWdlOyAgICAgICAgLy8vPCBJbnB1dCBpbWFnZSBjb250YWluZXIgZm9yIHBhc3NpbmcgaW50byBDb3JlIEltYWdlIEFQSQorICAgIENHQ29sb3JTcGFjZVJlZiBjb2xvcl9zcGFjZTsgICAgICAgIC8vLzwgQ29tbW9uIGNvbG9yIHNwYWNlIGZvciBpbnB1dCBpbWFnZSBhbmQgY2djb250ZXh0CisgICAgaW50ICAgICAgICAgICAgIGJpdHNfcGVyX2NvbXBvbmVudDsgLy8vPCBTaGFyZWQgYnBjIGZvciBpbnB1dC1vdXRwdXQgb3BlcmF0aW9uCisKKyAgICBjaGFyICAgICAgICAgICAgKmZpbHRlcl9zdHJpbmc7ICAgICAvLy88IFRoZSBjb21wbGV0ZSB1c2VyIHByb3ZpZGVkIGZpbHRlciBkZWZpbml0aW9uCisgICAgQ0ZUeXBlUmVmICAgICAgICpmaWx0ZXJzOyAgICAgICAgICAgLy8vPCBDSUZpbHRlciBvYmplY3QgZm9yIGFsbCByZXF1ZXN0ZWQgZmlsdGVycworICAgIGludCAgICAgICAgICAgICBudW1fZmlsdGVyczsgICAgICAgIC8vLzwgQW1vdW50IG9mIGZpbHRlcnMgaW4gKmZpbHRlcnMKKworICAgIGNoYXIgICAgICAgICAgICAqb3V0cHV0X3JlY3Q7ICAgICAgIC8vLzwgUmVjdGFuZ2xlIHRvIGJlIGZpbGxlZCB3aXRoIGZpbHRlciBpbnRwdXQKKyAgICBpbnQgICAgICAgICAgICAgbGlzdF9maWx0ZXJzOyAgICAgICAvLy88IE9wdGlvbiB1c2VkIHRvIGxpc3QgYWxsIGF2YWlsYWJsZSBmaWx0ZXJzIGluY2x1ZGluZyBnZW5lcmF0b3JzCisgICAgaW50ICAgICAgICAgICAgIGxpc3RfZ2VuZXJhdG9yczsgICAgLy8vPCBPcHRpb24gdXNlZCB0byBsaXN0IGFsbCBhdmFpbGFibGUgZ2VuZXJhdG9ycworfSBDb3JlSW1hZ2VDb250ZXh0OworCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIENvcmVJbWFnZUNvbnRleHQgKmN0eCA9IGxpbmstPnNyYy0+cHJpdjsKKworICAgIGxpbmstPncgICAgICAgICAgICAgICAgICAgPSBjdHgtPnc7CisgICAgbGluay0+aCAgICAgICAgICAgICAgICAgICA9IGN0eC0+aDsKKyAgICBsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gY3R4LT5zYXI7CisgICAgbGluay0+ZnJhbWVfcmF0ZSAgICAgICAgICA9IGN0eC0+ZnJhbWVfcmF0ZTsKKyAgICBsaW5rLT50aW1lX2Jhc2UgICAgICAgICAgID0gY3R4LT50aW1lX2Jhc2U7CisKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGxpbmstPmZvcm1hdCk7CisgICAgY3R4LT5iaXRzX3Blcl9jb21wb25lbnQgICAgICAgID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpIC8gZGVzYy0+bmJfY29tcG9uZW50czsKKworICAgIHJldHVybiAwOworfQorCisvKiogRGV0ZXJtaW5lIGltYWdlIHByb3BlcnRpZXMgZnJvbSBpbnB1dCBsaW5rIG9mIGZpbHRlciBjaGFpbi4KKyAqLworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICpsaW5rKQoreworICAgIENvcmVJbWFnZUNvbnRleHQgKmN0eCAgICAgICAgICA9IGxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGxpbmstPmZvcm1hdCk7CisgICAgY3R4LT5iaXRzX3Blcl9jb21wb25lbnQgICAgICAgID0gYXZfZ2V0X2JpdHNfcGVyX3BpeGVsKGRlc2MpIC8gZGVzYy0+bmJfY29tcG9uZW50czsKKworICAgIHJldHVybiAwOworfQorCisvKiogUHJpbnQgYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgZmlsdGVycyBpbmNsdWRpbmcgb3B0aW9ucyBhbmQgcmVzcGVjdGl2ZSB2YWx1ZSByYW5nZXMgYW5kIGRlZmF1bHRzLgorICovCitzdGF0aWMgdm9pZCBsaXN0X2ZpbHRlcnMoQ29yZUltYWdlQ29udGV4dCAqY3R4KQoreworICAgIC8vIHF1ZXJ5aW5nIGZpbHRlcnMgYW5kIGF0dHJpYnV0ZXMKKyAgICBOU0FycmF5ICpmaWx0ZXJfY2F0ZWdvcmllcyA9IG5pbDsKKworICAgIGlmIChjdHgtPmxpc3RfZ2VuZXJhdG9ycyAmJiAhY3R4LT5saXN0X2ZpbHRlcnMpIHsKKyAgICAgICAgZmlsdGVyX2NhdGVnb3JpZXMgPSBbTlNBcnJheSBhcnJheVdpdGhPYmplY3RzOmtDSUNhdGVnb3J5R2VuZXJhdG9yLCBuaWxdOworICAgIH0KKworICAgIE5TQXJyYXkgKmZpbHRlcl9uYW1lcyA9IFtDSUZpbHRlciBmaWx0ZXJOYW1lc0luQ2F0ZWdvcmllczpmaWx0ZXJfY2F0ZWdvcmllc107CisgICAgTlNFbnVtZXJhdG9yICpmaWx0ZXJzID0gW2ZpbHRlcl9uYW1lcyBvYmplY3RFbnVtZXJhdG9yXTsKKworICAgIE5TU3RyaW5nICpmaWx0ZXJfbmFtZTsKKyAgICB3aGlsZSAoZmlsdGVyX25hbWUgPSBbZmlsdGVycyBuZXh0T2JqZWN0XSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkZpbHRlcjogJXNcbiIsIFtmaWx0ZXJfbmFtZSBVVEY4U3RyaW5nXSk7CisgICAgICAgIE5TU3RyaW5nICppbnB1dDsKKworICAgICAgICBDSUZpbHRlciAqZmlsdGVyICAgICAgICAgICAgID0gW0NJRmlsdGVyIGZpbHRlcldpdGhOYW1lOmZpbHRlcl9uYW1lXTsKKyAgICAgICAgTlNEaWN0aW9uYXJ5ICpmaWx0ZXJfYXR0cmlicyA9IFtmaWx0ZXIgYXR0cmlidXRlc107IC8vIDxuc3N0cmluZywgaWQ+CisgICAgICAgIE5TQXJyYXkgICAgICAqZmlsdGVyX2lucHV0cyAgPSBbZmlsdGVyIGlucHV0S2V5c107ICAvLyA8bnNzdHJpbmc+CisKKyAgICAgICAgZm9yIChpbnB1dCBpbiBmaWx0ZXJfaW5wdXRzKSB7CisgICAgICAgICAgICBOU0RpY3Rpb25hcnkgKmlucHV0X2F0dHJpYnMgPSBbZmlsdGVyX2F0dHJpYnMgdmFsdWVGb3JLZXk6aW5wdXRdOworICAgICAgICAgICAgTlNTdHJpbmcgKmlucHV0X2NsYXNzICAgICAgID0gW2lucHV0X2F0dHJpYnMgdmFsdWVGb3JLZXk6a0NJQXR0cmlidXRlQ2xhc3NdOworICAgICAgICAgICAgaWYgKFtpbnB1dF9jbGFzcyBpc0VxdWFsVG9TdHJpbmc6QCJOU051bWJlciJdKSB7CisgICAgICAgICAgICAgICAgTlNOdW1iZXIgKnZhbHVlX2RlZmF1bHQgPSBbaW5wdXRfYXR0cmlicyB2YWx1ZUZvcktleTprQ0lBdHRyaWJ1dGVEZWZhdWx0XTsKKyAgICAgICAgICAgICAgICBOU051bWJlciAqdmFsdWVfbWluICAgICA9IFtpbnB1dF9hdHRyaWJzIHZhbHVlRm9yS2V5OmtDSUF0dHJpYnV0ZVNsaWRlck1pbl07CisgICAgICAgICAgICAgICAgTlNOdW1iZXIgKnZhbHVlX21heCAgICAgPSBbaW5wdXRfYXR0cmlicyB2YWx1ZUZvcktleTprQ0lBdHRyaWJ1dGVTbGlkZXJNYXhdOworCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJcdE9wdGlvbjogJXNcdFslc11cdFslcyAlc11bJXNdXG4iLAorICAgICAgICAgICAgICAgICAgICBbaW5wdXQgVVRGOFN0cmluZ10sCisgICAgICAgICAgICAgICAgICAgIFtpbnB1dF9jbGFzcyBVVEY4U3RyaW5nXSwKKyAgICAgICAgICAgICAgICAgICAgW1t2YWx1ZV9taW4gc3RyaW5nVmFsdWVdIFVURjhTdHJpbmddLAorICAgICAgICAgICAgICAgICAgICBbW3ZhbHVlX21heCBzdHJpbmdWYWx1ZV0gVVRGOFN0cmluZ10sCisgICAgICAgICAgICAgICAgICAgIFtbdmFsdWVfZGVmYXVsdCBzdHJpbmdWYWx1ZV0gVVRGOFN0cmluZ10pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIlx0T3B0aW9uOiAlc1x0WyVzXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgW2lucHV0IFVURjhTdHJpbmddLAorICAgICAgICAgICAgICAgICAgICBbaW5wdXRfY2xhc3MgVVRGOFN0cmluZ10pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpmY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgaW5vdXRfZm10c19yZ2JbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9BUkdCLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgQVZGaWx0ZXJGb3JtYXRzICppbm91dF9mb3JtYXRzOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIShpbm91dF9mb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChpbm91dF9mbXRzX3JnYikpKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihpbm91dF9mb3JtYXRzLCAmZmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cykpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfZm9ybWF0c19yZWYoaW5vdXRfZm9ybWF0cywgJmZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzX3NyYyhBVkZpbHRlckNvbnRleHQgKmZjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBpbm91dF9mbXRzX3JnYltdID0geworICAgICAgICBBVl9QSVhfRk1UX0FSR0IsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICBBVkZpbHRlckZvcm1hdHMgKmlub3V0X2Zvcm1hdHM7CisgICAgaW50IHJldDsKKworICAgIGlmICghKGlub3V0X2Zvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KGlub3V0X2ZtdHNfcmdiKSkpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGZmX2Zvcm1hdHNfcmVmKGlub3V0X2Zvcm1hdHMsICZmY3R4LT5vdXRwdXRzWzBdLT5pbl9mb3JtYXRzKSkgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfZmlsdGVyKENvcmVJbWFnZUNvbnRleHQgKmN0eCwgQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIC8vIChyZS0paW5pdGlhbGl6ZSBpbnB1dCBpbWFnZQorICAgIGNvbnN0IENHU2l6ZSBmcmFtZV9zaXplID0geworICAgICAgICBmcmFtZS0+d2lkdGgsCisgICAgICAgIGZyYW1lLT5oZWlnaHQKKyAgICB9OworCisgICAgTlNEYXRhICpkYXRhID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzTm9Db3B5OmZyYW1lLT5kYXRhWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6ZnJhbWUtPmhlaWdodCpmcmFtZS0+bGluZXNpemVbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVXaGVuRG9uZTpOT107CisKKyAgICBDSUltYWdlICpyZXQgPSBbKF9fYnJpZGdlIENJSW1hZ2UqKWN0eC0+aW5wdXRfaW1hZ2UgaW5pdFdpdGhCaXRtYXBEYXRhOmRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNQZXJSb3c6ZnJhbWUtPmxpbmVzaXplWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6ZnJhbWVfc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6a0NJRm9ybWF0QVJHQjgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZTpjdHgtPmNvbG9yX3NwYWNlXTsgLy9rQ0dDb2xvclNwYWNlR2VuZXJpY1JHQgorICAgIGlmICghcmV0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIklucHV0IGltYWdlIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICBDSUZpbHRlciAqZmlsdGVyICAgICAgID0gTlVMTDsKKyAgICBDSUltYWdlICpmaWx0ZXJfaW5wdXQgID0gKF9fYnJpZGdlIENJSW1hZ2UqKWN0eC0+aW5wdXRfaW1hZ2U7CisgICAgQ0lJbWFnZSAqZmlsdGVyX291dHB1dCA9IE5VTEw7CisKKyAgICAvLyBzdWNjZXNzaXZlbHkgYXBwbHkgYWxsIGZpbHRlcnMKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5udW1fZmlsdGVyczsgaSsrKSB7CisgICAgICAgIGlmIChpKSB7CisgICAgICAgICAgICAvLyBzZXQgZmlsdGVyIGlucHV0IHRvIHByZXZpb3VzIGZpbHRlciBvdXRwdXQKKyAgICAgICAgICAgIGZpbHRlcl9pbnB1dCAgICA9IFsoX19icmlkZ2UgQ0lJbWFnZSopY3R4LT5maWx0ZXJzW2ktMV0gdmFsdWVGb3JLZXk6a0NJT3V0cHV0SW1hZ2VLZXldOworICAgICAgICAgICAgQ0dSZWN0IG91dF9yZWN0ID0gW2ZpbHRlcl9pbnB1dCBleHRlbnRdOworICAgICAgICAgICAgaWYgKG91dF9yZWN0LnNpemUud2lkdGggPiBmcmFtZS0+d2lkdGggfHwgb3V0X3JlY3Quc2l6ZS5oZWlnaHQgPiBmcmFtZS0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgLy8gZG8gbm90IGtlZXAgcGFkZGVkIGltYWdlIHJlZ2lvbnMgYWZ0ZXIgZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgb3V0X3JlY3Qub3JpZ2luLnggICAgPSAwLjBmOworICAgICAgICAgICAgICAgIG91dF9yZWN0Lm9yaWdpbi55ICAgID0gMC4wZjsKKyAgICAgICAgICAgICAgICBvdXRfcmVjdC5zaXplLndpZHRoICA9IGZyYW1lLT53aWR0aDsKKyAgICAgICAgICAgICAgICBvdXRfcmVjdC5zaXplLmhlaWdodCA9IGZyYW1lLT5oZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWx0ZXJfaW5wdXQgPSBbZmlsdGVyX2lucHV0IGltYWdlQnlDcm9wcGluZ1RvUmVjdDpvdXRfcmVjdF07CisgICAgICAgIH0KKworICAgICAgICBmaWx0ZXIgPSAoX19icmlkZ2UgQ0lGaWx0ZXIqKWN0eC0+ZmlsdGVyc1tpXTsKKworICAgICAgICAvLyBkbyBub3Qgc2V0IGlucHV0IGltYWdlIGZvciB0aGUgZmlyc3QgZmlsdGVyIGlmIHVzZWQgYXMgdmlkZW8gc291cmNlCisgICAgICAgIGlmICghY3R4LT5pc192aWRlb19zb3VyY2UgfHwgaSkgeworICAgICAgICAgICAgQHRyeSB7CisgICAgICAgICAgICAgICAgW2ZpbHRlciBzZXRWYWx1ZTpmaWx0ZXJfaW5wdXQgZm9yS2V5OmtDSUlucHV0SW1hZ2VLZXldOworICAgICAgICAgICAgfSBAY2F0Y2ggKE5TRXhjZXB0aW9uICpleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBpZiAoIVtbZXhjZXB0aW9uIG5hbWVdIGlzRXF1YWxUb1N0cmluZzpOU1VuZGVmaW5lZEtleUV4Y2VwdGlvbl0pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQW4gZXJyb3Igb2NjdXJyZWQ6ICVzLiIsIFtleGNlcHRpb24ucmVhc29uIFVURjhTdHJpbmddKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJTZWxlY3RlZCBmaWx0ZXIgZG9lcyBub3QgYWNjZXB0IGFuIGlucHV0IGltYWdlLlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZ2V0IG91dHB1dCBvZiBsYXN0IGZpbHRlcgorICAgIGZpbHRlcl9vdXRwdXQgPSBbZmlsdGVyIHZhbHVlRm9yS2V5OmtDSU91dHB1dEltYWdlS2V5XTsKKworICAgIGlmICghZmlsdGVyX291dHB1dCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGaWx0ZXIgb3V0cHV0IG5vdCBhdmFpbGFibGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgLy8gZG8gbm90IGtlZXAgcGFkZGVkIGltYWdlIHJlZ2lvbnMgYWZ0ZXIgZmlsdGVyaW5nCisgICAgQ0dSZWN0IG91dF9yZWN0ID0gW2ZpbHRlcl9vdXRwdXQgZXh0ZW50XTsKKyAgICBpZiAob3V0X3JlY3Quc2l6ZS53aWR0aCA+IGZyYW1lLT53aWR0aCB8fCBvdXRfcmVjdC5zaXplLmhlaWdodCA+IGZyYW1lLT5oZWlnaHQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiQ3JvcHBpbmcgb3V0cHV0IGltYWdlLlxuIik7CisgICAgICAgIG91dF9yZWN0Lm9yaWdpbi54ICAgID0gMC4wZjsKKyAgICAgICAgb3V0X3JlY3Qub3JpZ2luLnkgICAgPSAwLjBmOworICAgICAgICBvdXRfcmVjdC5zaXplLndpZHRoICA9IGZyYW1lLT53aWR0aDsKKyAgICAgICAgb3V0X3JlY3Quc2l6ZS5oZWlnaHQgPSBmcmFtZS0+aGVpZ2h0OworICAgIH0KKworICAgIENHSW1hZ2VSZWYgb3V0ID0gWyhfX2JyaWRnZSBDSUNvbnRleHQqKWN0eC0+Z2xjdHggY3JlYXRlQ0dJbWFnZTpmaWx0ZXJfb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tUmVjdDpvdXRfcmVjdF07CisKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgY3JlYXRlIHZhbGlkIG91dHB1dCBpbWFnZS5cbiIpOworICAgIH0KKworICAgIC8vIGNyZWF0ZSBiaXRtYXAgY29udGV4dCBvbiB0aGUgZmx5IGZvciByZW5kZXJpbmcgaW50byBjdXJyZW50IGZyYW1lLT5kYXRhW10KKyAgICBpZiAoY3R4LT5jZ2N0eCkgeworICAgICAgICBDR0NvbnRleHRSZWxlYXNlKGN0eC0+Y2djdHgpOworICAgICAgICBjdHgtPmNnY3R4ID0gTlVMTDsKKyAgICB9CisgICAgc2l6ZV90IG91dF93aWR0aCAgPSBDR0ltYWdlR2V0V2lkdGgob3V0KTsKKyAgICBzaXplX3Qgb3V0X2hlaWdodCA9IENHSW1hZ2VHZXRIZWlnaHQob3V0KTsKKworICAgIGlmIChvdXRfd2lkdGggPiBmcmFtZS0+d2lkdGggfHwgb3V0X2hlaWdodCA+IGZyYW1lLT5oZWlnaHQpIHsgLy8gdGhpcyBtaWdodCByZXN1bHQgaW4gc2VnZmF1bHQKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJPdXRwdXQgaW1hZ2UgaGFzIHVuZXhwZWN0ZWQgc2l6ZTogJWx1eCVsdSAoZXhwZWN0ZWQ6ICVpeCVpKS4gVGhpcyBtYXkgY3Jhc2guLi5cbiIsCisgICAgICAgICAgICAgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCk7CisgICAgfQorICAgIGN0eC0+Y2djdHggPSBDR0JpdG1hcENvbnRleHRDcmVhdGUoZnJhbWUtPmRhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5iaXRzX3Blcl9jb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmNvbG9yX3NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWtDR0ltYWdlQWxwaGFQcmVtdWx0aXBsaWVkRmlyc3QpOyAvLyBBUkdCCisgICAgaWYgKCFjdHgtPmNnY3R4KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNHQml0bWFwIGNvbnRleHQgY2Fubm90IGJlIGNyZWF0ZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQorCisgICAgLy8gY29weSAoImRyYXciKSB0aGUgb3V0cHV0IGltYWdlIGludG8gdGhlIGZyYW1lIGRhdGEKKyAgICBDR1JlY3QgcmVjdCA9IHt7MCwwfSx7ZnJhbWUtPndpZHRoLCBmcmFtZS0+aGVpZ2h0fX07CisgICAgaWYgKGN0eC0+b3V0cHV0X3JlY3QpIHsKKyAgICAgICAgQHRyeSB7CisgICAgICAgICAgICBOU1N0cmluZyAqdG1wX3N0cmluZyA9IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzpjdHgtPm91dHB1dF9yZWN0XTsKKyAgICAgICAgICAgIE5TUmVjdCB0bXAgICAgICAgICAgID0gTlNSZWN0RnJvbVN0cmluZyh0bXBfc3RyaW5nKTsKKyAgICAgICAgICAgIHJlY3QgICAgICAgICAgICAgICAgID0gTlNSZWN0VG9DR1JlY3QodG1wKTsKKyAgICAgICAgfSBAY2F0Y2ggKE5TRXhjZXB0aW9uICpleGNlcHRpb24pIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkFuIGVycm9yIG9jY3VycmVkOiAlcy4iLCBbZXhjZXB0aW9uLnJlYXNvbiBVVEY4U3RyaW5nXSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVjdC5zaXplLndpZHRoID09IDAuMGYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiV2lkdGggb2Ygb3V0cHV0IHJlY3QgaXMgemVyby5cbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChyZWN0LnNpemUuaGVpZ2h0ID09IDAuMGYpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiSGVpZ2h0IG9mIG91dHB1dCByZWN0IGlzIHplcm8uXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENHQ29udGV4dERyYXdJbWFnZShjdHgtPmNnY3R4LCByZWN0LCBvdXQpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShsaW5rLCBmcmFtZSk7Cit9CisKKy8qKiBBcHBseSBhbGwgdmFsaWQgZmlsdGVycyBzdWNjZXNzaXZlbHkgdG8gdGhlIGlucHV0IGltYWdlLgorICogIFRoZSBmaW5hbCBvdXRwdXQgaW1hZ2UgaXMgY29waWVkIGZyb20gdGhlIEdQVSBieSAiZHJhd2luZyIgdXNpbmcgYSBiaXRtYXAgY29udGV4dC4KKyAqLworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICByZXR1cm4gYXBwbHlfZmlsdGVyKGxpbmstPmRzdC0+cHJpdiwgbGluay0+ZHN0LT5vdXRwdXRzWzBdLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgQ29yZUltYWdlQ29udGV4dCAqY3R4ID0gbGluay0+c3JjLT5wcml2OworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgaWYgKGN0eC0+ZHVyYXRpb24gPj0gMCAmJgorICAgICAgICBhdl9yZXNjYWxlX3EoY3R4LT5wdHMsIGN0eC0+dGltZV9iYXNlLCBBVl9USU1FX0JBU0VfUSkgPj0gY3R4LT5kdXJhdGlvbikgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgaWYgKCFjdHgtPnBpY3JlZikgeworICAgICAgICBjdHgtPnBpY3JlZiA9IGZmX2dldF92aWRlb19idWZmZXIobGluaywgY3R4LT53LCBjdHgtPmgpOworICAgICAgICBpZiAoIWN0eC0+cGljcmVmKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgfQorCisgICAgZnJhbWUgPSBhdl9mcmFtZV9jbG9uZShjdHgtPnBpY3JlZik7CisgICAgaWYgKCFmcmFtZSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZyYW1lLT5wdHMgICAgICAgICAgICAgICAgID0gY3R4LT5wdHM7CisgICAgZnJhbWUtPmtleV9mcmFtZSAgICAgICAgICAgPSAxOworICAgIGZyYW1lLT5pbnRlcmxhY2VkX2ZyYW1lICAgID0gMDsKKyAgICBmcmFtZS0+cGljdF90eXBlICAgICAgICAgICA9IEFWX1BJQ1RVUkVfVFlQRV9JOworICAgIGZyYW1lLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gY3R4LT5zYXI7CisKKyAgICBjdHgtPnB0cysrOworCisgICAgcmV0dXJuIGFwcGx5X2ZpbHRlcihjdHgsIGxpbmssIGZyYW1lKTsKK30KKworLyoqIFNldCBhbiBvcHRpb24gb2YgdGhlIGdpdmVuIGZpbHRlciB0byB0aGUgcHJvdmlkZWQga2V5LXZhbHVlIHBhaXIuCisgKi8KK3N0YXRpYyB2b2lkIHNldF9vcHRpb24oQ29yZUltYWdlQ29udGV4dCAqY3R4LCBDSUZpbHRlciAqZmlsdGVyLCBjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgICAgICBOU1N0cmluZyAqaW5wdXRfa2V5ID0gW05TU3RyaW5nIHN0cmluZ1dpdGhVVEY4U3RyaW5nOmtleV07CisgICAgICAgIE5TU3RyaW5nICppbnB1dF92YWwgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6dmFsdWVdOworCisgICAgICAgIE5TRGljdGlvbmFyeSAqZmlsdGVyX2F0dHJpYnMgPSBbZmlsdGVyIGF0dHJpYnV0ZXNdOyAvLyA8bnNzdHJpbmcsIGlkPgorICAgICAgICBOU0RpY3Rpb25hcnkgKmlucHV0X2F0dHJpYnMgID0gW2ZpbHRlcl9hdHRyaWJzIHZhbHVlRm9yS2V5OmlucHV0X2tleV07CisKKyAgICAgICAgTlNTdHJpbmcgKmlucHV0X2NsYXNzID0gW2lucHV0X2F0dHJpYnMgdmFsdWVGb3JLZXk6a0NJQXR0cmlidXRlQ2xhc3NdOworICAgICAgICBOU1N0cmluZyAqaW5wdXRfdHlwZSAgPSBbaW5wdXRfYXR0cmlicyB2YWx1ZUZvcktleTprQ0lBdHRyaWJ1dGVUeXBlXTsKKworICAgICAgICBpZiAoIWlucHV0X2F0dHJpYnMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiU2tpcHBpbmcgdW5rbm93biBvcHRpb246IFwiJXNcIi5cbiIsCisgICAgICAgICAgICAgICAgICAgW2lucHV0X2tleSBVVEY4U3RyaW5nXSk7IC8vIFtbZmlsdGVyIG5hbWVdIFVURjhTdHJpbmddKSBub3QgY3VycmVudGx5IGRlZmluZWQuLi4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgImtleTogJXMsIHZhbDogJXMsICNhdHRyaWJzOiAlbHUsIGNsYXNzOiAlcywgdHlwZTogJXNcbiIsCisgICAgICAgICAgICAgICBbaW5wdXRfa2V5IFVURjhTdHJpbmddLAorICAgICAgICAgICAgICAgW2lucHV0X3ZhbCBVVEY4U3RyaW5nXSwKKyAgICAgICAgICAgICAgIGlucHV0X2F0dHJpYnMgPyAodW5zaWduZWQgbG9uZylbaW5wdXRfYXR0cmlicyBjb3VudF0gOiAtMSwKKyAgICAgICAgICAgICAgIFtpbnB1dF9jbGFzcyBVVEY4U3RyaW5nXSwKKyAgICAgICAgICAgICAgIFtpbnB1dF90eXBlIFVURjhTdHJpbmddKTsKKworICAgICAgICBpZiAoW2lucHV0X2NsYXNzIGlzRXF1YWxUb1N0cmluZzpAIk5TTnVtYmVyIl0pIHsKKyAgICAgICAgICAgIGZsb2F0IGlucHV0ICAgICAgICAgID0gaW5wdXRfdmFsLmZsb2F0VmFsdWU7CisgICAgICAgICAgICBOU051bWJlciAqbWF4X3ZhbHVlICA9IFtpbnB1dF9hdHRyaWJzIHZhbHVlRm9yS2V5OmtDSUF0dHJpYnV0ZVNsaWRlck1heF07CisgICAgICAgICAgICBOU051bWJlciAqbWluX3ZhbHVlICA9IFtpbnB1dF9hdHRyaWJzIHZhbHVlRm9yS2V5OmtDSUF0dHJpYnV0ZVNsaWRlck1pbl07CisgICAgICAgICAgICBOU051bWJlciAqdXNlZF92YWx1ZSA9IG5pbDsKKworI2RlZmluZSBDTEFNUF9XQVJOSU5HIGRvIHsgICAgIFwKK2F2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiVmFsdWUgb2YgXCIlZlwiIGZvciBvcHRpb24gXCIlc1wiIGlzIG91dCBvZiByYW5nZSBbJWYgJWZdLCBjbGFtcGluZyB0byBcIiVmXCIuXG4iLCBcCisgICAgICAgaW5wdXQsICAgICAgICAgICAgICAgICAgXAorICAgICAgIFtpbnB1dF9rZXkgVVRGOFN0cmluZ10sIFwKKyAgICAgICBtaW5fdmFsdWUuZmxvYXRWYWx1ZSwgICBcCisgICAgICAgbWF4X3ZhbHVlLmZsb2F0VmFsdWUsICAgXAorICAgICAgIHVzZWRfdmFsdWUuZmxvYXRWYWx1ZSk7IFwKK30gd2hpbGUoMCkKKyAgICAgICAgICAgIGlmIChpbnB1dCA+IG1heF92YWx1ZS5mbG9hdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgdXNlZF92YWx1ZSA9IG1heF92YWx1ZTsKKyAgICAgICAgICAgICAgICBDTEFNUF9XQVJOSU5HOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA8IG1pbl92YWx1ZS5mbG9hdFZhbHVlKSB7CisgICAgICAgICAgICAgICAgdXNlZF92YWx1ZSA9IG1pbl92YWx1ZTsKKyAgICAgICAgICAgICAgICBDTEFNUF9XQVJOSU5HOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1c2VkX3ZhbHVlID0gW05TTnVtYmVyIG51bWJlcldpdGhGbG9hdDppbnB1dF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFtmaWx0ZXIgc2V0VmFsdWU6dXNlZF92YWx1ZSBmb3JLZXk6aW5wdXRfa2V5XTsKKyAgICAgICAgfSBlbHNlIGlmIChbaW5wdXRfY2xhc3MgaXNFcXVhbFRvU3RyaW5nOkAiQ0lWZWN0b3IiXSkgeworICAgICAgICAgICAgQ0lWZWN0b3IgKmlucHV0ID0gW0NJVmVjdG9yIHZlY3RvcldpdGhTdHJpbmc6aW5wdXRfdmFsXTsKKworICAgICAgICAgICAgaWYgKCFpbnB1dCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiU2tpcHBpbmcgaW52YWxpZCBDSVZjdG9yIGRlc2NyaXB0aW9uOiBcIiVzXCIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRfdmFsIFVURjhTdHJpbmddKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFtmaWx0ZXIgc2V0VmFsdWU6aW5wdXQgZm9yS2V5OmlucHV0X2tleV07CisgICAgICAgIH0gZWxzZSBpZiAoW2lucHV0X2NsYXNzIGlzRXF1YWxUb1N0cmluZzpAIkNJQ29sb3IiXSkgeworICAgICAgICAgICAgQ0lDb2xvciAqaW5wdXQgPSBbQ0lDb2xvciBjb2xvcldpdGhTdHJpbmc6aW5wdXRfdmFsXTsKKworICAgICAgICAgICAgaWYgKCFpbnB1dCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiU2tpcHBpbmcgaW52YWxpZCBDSUNvbG9yIGRlc2NyaXB0aW9uOiBcIiVzXCIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBbaW5wdXRfdmFsIFVURjhTdHJpbmddKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFtmaWx0ZXIgc2V0VmFsdWU6aW5wdXQgZm9yS2V5OmlucHV0X2tleV07CisgICAgICAgIH0gZWxzZSBpZiAoW2lucHV0X2NsYXNzIGlzRXF1YWxUb1N0cmluZzpAIk5TU3RyaW5nIl0pIHsgLy8gc2V0IGRpc3BsYXkgbmFtZSBhcyBzdHJpbmcgd2l0aCBsYXRpbjEgZW5jb2RpbmcKKyAgICAgICAgICAgIFtmaWx0ZXIgc2V0VmFsdWU6aW5wdXRfdmFsIGZvcktleTppbnB1dF9rZXldOworICAgICAgICB9IGVsc2UgaWYgKFtpbnB1dF9jbGFzcyBpc0VxdWFsVG9TdHJpbmc6QCJOU0RhdGEiXSkgeyAvLyBzZXQgZGlzcGxheSBuYW1lIGFzIHN0cmluZyB3aXRoIGxhdGluMSBlbmNvZGluZworICAgICAgICAgICAgTlNEYXRhICppbnB1dCA9IFtOU0RhdGEgZGF0YVdpdGhCeXRlczooY29uc3Qgdm9pZCopW2lucHV0X3ZhbCBjU3RyaW5nVXNpbmdFbmNvZGluZzpOU0lTT0xhdGluMVN0cmluZ0VuY29kaW5nXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOltpbnB1dF92YWwgbGVuZ3RoT2ZCeXRlc1VzaW5nRW5jb2Rpbmc6TlNJU09MYXRpbjFTdHJpbmdFbmNvZGluZ11dOworCisgICAgICAgICAgICBpZiAoIWlucHV0KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJTa2lwcGluZyBpbnZhbGlkIE5TRGF0YSBkZXNjcmlwdGlvbjogXCIlc1wiLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0X3ZhbCBVVEY4U3RyaW5nXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBbZmlsdGVyIHNldFZhbHVlOmlucHV0IGZvcktleTppbnB1dF9rZXldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJTa2lwcGluZyB1bnN1cHBvcnRlZCBvcHRpb24gY2xhc3M6IFwiJXNcIi5cbiIsCisgICAgICAgICAgICAgICAgICAgW2lucHV0X2NsYXNzIFVURjhTdHJpbmddKTsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGN0eCwgIkhhbmRsaW5nIG9mIHNvbWUgb3B0aW9uIGNsYXNzZXMiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorfQorCisvKiogQ3JlYXRlIGEgZmlsdGVyIG9iamVjdCBieSBhIGdpdmVuIG5hbWUgYW5kIHNldCBhbGwgb3B0aW9ucyB0byBkZWZhdWx0cy4KKyAqICBPdmVyd3JpdGUgYW55IG9wdGlvbiBnaXZlbiBieSB0aGUgdXNlciB0byB0aGUgcHJvdmlkZWQgdmFsdWUgaW4gZmlsdGVyX29wdGlvbnMuCisgKi8KK3N0YXRpYyBDSUZpbHRlciogY3JlYXRlX2ZpbHRlcihDb3JlSW1hZ2VDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmZpbHRlcl9uYW1lLCBBVkRpY3Rpb25hcnkgKmZpbHRlcl9vcHRpb25zKQoreworICAgIC8vIGNyZWF0ZSBmaWx0ZXIgb2JqZWN0CisgICAgQ0lGaWx0ZXIgKmZpbHRlciA9IFtDSUZpbHRlciBmaWx0ZXJXaXRoTmFtZTpbTlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6ZmlsdGVyX25hbWVdXTsKKworICAgIC8vIHNldCBkZWZhdWx0IG9wdGlvbnMKKyAgICBbZmlsdGVyIHNldERlZmF1bHRzXTsKKworICAgIC8vIHNldCB1c2VyIG9wdGlvbnMKKyAgICBpZiAoZmlsdGVyX29wdGlvbnMpIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKm8gPSBOVUxMOworICAgICAgICB3aGlsZSAoKG8gPSBhdl9kaWN0X2dldChmaWx0ZXJfb3B0aW9ucywgIiIsIG8sIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7CisgICAgICAgICAgICBzZXRfb3B0aW9uKGN0eCwgZmlsdGVyLCBvLT5rZXksIG8tPnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmaWx0ZXI7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqZmN0eCkKK3sKKyAgICBDb3JlSW1hZ2VDb250ZXh0ICpjdHggICAgID0gZmN0eC0+cHJpdjsKKyAgICBBVkRpY3Rpb25hcnkgKmZpbHRlcl9kaWN0ID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZiAgICAgID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqbyAgICAgID0gTlVMTDsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworCisgICAgaWYgKGN0eC0+bGlzdF9maWx0ZXJzIHx8IGN0eC0+bGlzdF9nZW5lcmF0b3JzKSB7CisgICAgICAgIGxpc3RfZmlsdGVycyhjdHgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgIH0KKworICAgIGlmIChjdHgtPmZpbHRlcl9zdHJpbmcpIHsKKyAgICAgICAgLy8gcGFyc2UgZmlsdGVyIHN0cmluZyAoZmlsdGVyPW5hbWVAb3B0PXZhbEBvcHQyPXZhbDIjbmFtZTJAb3B0Mz12YWwzKSBmb3IgZmlsdGVycyBzZXBhcmF0ZWQgYnkgIworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXJfc3RyaW5nOiAlc1xuIiwgY3R4LT5maWx0ZXJfc3RyaW5nKTsKKyAgICAgICAgcmV0ID0gYXZfZGljdF9wYXJzZV9zdHJpbmcoJmZpbHRlcl9kaWN0LCBjdHgtPmZpbHRlcl9zdHJpbmcsICJAIiwgIiMiLCBBVl9ESUNUX01VTFRJS0VZKTsgLy8gcGFyc2UgZmlsdGVyX25hbWU6YWxsX2ZpbHRlcl9vcHRpb25zCisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlBhcnNpbmcgb2YgZmlsdGVycyBmYWlsZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5udW1fZmlsdGVycyA9IGF2X2RpY3RfY291bnQoZmlsdGVyX2RpY3QpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgY291bnQ6ICVpXG4iLCBjdHgtPm51bV9maWx0ZXJzKTsKKworICAgICAgICAvLyBhbGxvY2F0ZSBDSUZpbHRlciBhcnJheQorICAgICAgICBjdHgtPmZpbHRlcnMgPSBhdl9tYWxsb2N6X2FycmF5KGN0eC0+bnVtX2ZpbHRlcnMsIHNpemVvZihDSUZpbHRlciopKTsKKyAgICAgICAgaWYgKCFjdHgtPmZpbHRlcnMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBmaWx0ZXIgYXJyYXkuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwYXJzZSBmaWx0ZXJzIGZvciBvcHRpb24ga2V5LXZhbHVlIHBhaXJzIChvcHQ9dmFsQG9wdDI9dmFsMikgc2VwYXJhdGVkIGJ5IEAKKyAgICAgICAgaSA9IDA7CisgICAgICAgIHdoaWxlICgoZiA9IGF2X2RpY3RfZ2V0KGZpbHRlcl9kaWN0LCAiIiwgZiwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqZmlsdGVyX29wdGlvbnMgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoc3RybmNtcChmLT52YWx1ZSwgImRlZmF1bHQiLCA3KSkgeyAvLyBub3QgZGVmYXVsdAorICAgICAgICAgICAgICAgIHJldCA9IGF2X2RpY3RfcGFyc2Vfc3RyaW5nKCZmaWx0ZXJfb3B0aW9ucywgZi0+dmFsdWUsICI9IiwgIkAiLCAwKTsgLy8gcGFyc2Ugb3B0aW9uX25hbWU6b3B0aW9uX3ZhbHVlCisgICAgICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJQYXJzaW5nIG9mIGZpbHRlciBvcHRpb25zIGZvciBcIiVzXCIgZmFpbGVkLlxuIiwgZi0+a2V5KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX0RFQlVHKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiQ3JlYXRpbmcgZmlsdGVyICVpOiBcIiVzXCI6XG4iLCBpLCBmLT5rZXkpOworICAgICAgICAgICAgICAgIGlmICghZmlsdGVyX29wdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiXHR1c2luZyBkZWZhdWx0IG9wdGlvbnNcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobyA9IGF2X2RpY3RfZ2V0KGZpbHRlcl9vcHRpb25zLCAiIiwgbywgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlx0JXM6ICVzXG4iLCBvLT5rZXksIG8tPnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3R4LT5maWx0ZXJzW2ldID0gQ0ZCcmlkZ2luZ1JldGFpbihjcmVhdGVfZmlsdGVyKGN0eCwgZi0+a2V5LCBmaWx0ZXJfb3B0aW9ucykpOworICAgICAgICAgICAgaWYgKCFjdHgtPmZpbHRlcnNbaV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIGZpbHRlciBcIiVzXCIuXG4iLCBmLT5rZXkpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGZpbHRlcnMgc3BlY2lmaWVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8gY3JlYXRlIEdQVSBjb250ZXh0IG9uIE9TWAorICAgIGNvbnN0IE5TT3BlbkdMUGl4ZWxGb3JtYXRBdHRyaWJ1dGUgYXR0cltdID0geworICAgICAgICBOU09wZW5HTFBGQUFjY2VsZXJhdGVkLAorICAgICAgICBOU09wZW5HTFBGQU5vUmVjb3ZlcnksCisgICAgICAgIE5TT3BlbkdMUEZBQ29sb3JTaXplLCAzMiwKKyAgICAgICAgMAorICAgIH07CisKKyAgICBOU09wZW5HTFBpeGVsRm9ybWF0ICpwaXhlbF9mb3JtYXQgPSBbW05TT3BlbkdMUGl4ZWxGb3JtYXQgYWxsb2NdIGluaXRXaXRoQXR0cmlidXRlczoodm9pZCAqKSZhdHRyXTsKKyAgICBjdHgtPmNvbG9yX3NwYWNlICAgICAgICAgICAgICAgICAgPSBDR0NvbG9yU3BhY2VDcmVhdGVXaXRoTmFtZShrQ0dDb2xvclNwYWNlR2VuZXJpY1JHQik7CisgICAgY3R4LT5nbGN0eCAgICAgICAgICAgICAgICAgICAgICAgID0gQ0ZCcmlkZ2luZ1JldGFpbihbQ0lDb250ZXh0IGNvbnRleHRXaXRoQ0dMQ29udGV4dDpDR0xHZXRDdXJyZW50Q29udGV4dCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbEZvcm1hdDpbcGl4ZWxfZm9ybWF0IENHTFBpeGVsRm9ybWF0T2JqXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZTpjdHgtPmNvbG9yX3NwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOm5pbF0pOworCisgICAgaWYgKCFjdHgtPmdsY3R4KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNJQ29udGV4dCBub3QgY3JlYXRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGluZyBhbiBlbXB0eSBpbnB1dCBpbWFnZSBhcyBpbnB1dCBjb250YWluZXIgZm9yIHRoZSBjb250ZXh0CisgICAgY3R4LT5pbnB1dF9pbWFnZSA9IENGQnJpZGdpbmdSZXRhaW4oW0NJSW1hZ2UgZW1wdHlJbWFnZV0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X3NyYyhBVkZpbHRlckNvbnRleHQgKmZjdHgpCit7CisgICAgQ29yZUltYWdlQ29udGV4dCAqY3R4ID0gZmN0eC0+cHJpdjsKKworICAgIGN0eC0+aXNfdmlkZW9fc291cmNlID0gMTsKKyAgICBjdHgtPnRpbWVfYmFzZSAgICAgICA9IGF2X2ludl9xKGN0eC0+ZnJhbWVfcmF0ZSk7CisgICAgY3R4LT5wdHMgICAgICAgICAgICAgPSAwOworCisgICAgcmV0dXJuIGluaXQoZmN0eCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqZmN0eCkKK3sKKyNkZWZpbmUgU2FmZUNGUmVsZWFzZShwdHIpIGRvIHsgXAorICAgIGlmIChwdHIpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENGUmVsZWFzZShwdHIpOyAgICAgICAgIFwKKyAgICAgICAgcHRyID0gTlVMTDsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgQ29yZUltYWdlQ29udGV4dCAqY3R4ID0gZmN0eC0+cHJpdjsKKworICAgIFNhZmVDRlJlbGVhc2UoY3R4LT5nbGN0eCk7CisgICAgU2FmZUNGUmVsZWFzZShjdHgtPmNnY3R4KTsKKyAgICBTYWZlQ0ZSZWxlYXNlKGN0eC0+Y29sb3Jfc3BhY2UpOworICAgIFNhZmVDRlJlbGVhc2UoY3R4LT5pbnB1dF9pbWFnZSk7CisKKyAgICBpZiAoY3R4LT5maWx0ZXJzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3R4LT5udW1fZmlsdGVyczsgaSsrKSB7CisgICAgICAgICAgICBTYWZlQ0ZSZWxlYXNlKGN0eC0+ZmlsdGVyc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+ZmlsdGVycyk7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmY3R4LT5waWNyZWYpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdmZfY29yZWltYWdlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdmZfY29yZWltYWdlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdnNyY19jb3JlaW1hZ2VzcmNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihDb3JlSW1hZ2VDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworI2RlZmluZSBHRU5FUkFUT1JfT1BUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7InNpemUiLCAgICAgInNldCB2aWRlbyBzaXplIiwgICAgICAgICAgICAgICAgT0ZGU0VUKHcpLCAgICAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9ICIzMjB4MjQwIn0sIDAsIDAsICAgICAgICAgRkxBR1N9LCBcCisgICAgeyJzIiwgICAgICAgICJzZXQgdmlkZW8gc2l6ZSIsICAgICAgICAgICAgICAgIE9GRlNFVCh3KSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSAiMzIweDI0MCJ9LCAwLCAwLCAgICAgICAgIEZMQUdTfSwgXAorICAgIHsicmF0ZSIsICAgICAic2V0IHZpZGVvIHJhdGUiLCAgICAgICAgICAgICAgICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sICAgICAgMCwgSU5UX01BWCwgICAgICAgICBGTEFHU30sIFwKKyAgICB7InIiLCAgICAgICAgInNldCB2aWRlbyByYXRlIiwgICAgICAgICAgICAgICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAgICAgIDAsIElOVF9NQVgsICAgICAgICAgRkxBR1N9LCBcCisgICAgeyJkdXJhdGlvbiIsICJzZXQgdmlkZW8gZHVyYXRpb24iLCAgICAgICAgICAgIE9GRlNFVChkdXJhdGlvbiksICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sICAgey5pNjQgPSAtMX0sICAgICAgIC0xLCBJTlQ2NF9NQVgsIEZMQUdTfSwgXAorICAgIHsiZCIsICAgICAgICAic2V0IHZpZGVvIGR1cmF0aW9uIiwgICAgICAgICAgICBPRkZTRVQoZHVyYXRpb24pLCAgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCAgIHsuaTY0ID0gLTF9LCAgICAgICAtMSwgSU5UNjRfTUFYLCBGTEFHU30sIFwKKyAgICB7InNhciIsICAgICAgInNldCB2aWRlbyBzYW1wbGUgYXNwZWN0IHJhdGlvIiwgT0ZGU0VUKHNhciksICAgICAgICBBVl9PUFRfVFlQRV9SQVRJT05BTCwgICB7LmRibCA9IDF9LCAgICAgICAgIDAsIElOVF9NQVgsICAgRkxBR1N9LAorCisjZGVmaW5lIEZJTFRFUl9PUFRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsibGlzdF9maWx0ZXJzIiwgICAgImxpc3QgYXZhaWxhYmxlIGZpbHRlcnMiLCAgICAgICAgICAgICAgICBPRkZTRVQobGlzdF9maWx0ZXJzKSwgICAgQVZfT1BUX1RZUEVfQk9PTCwgICB7Lmk2NCA9IDB9LCAwLCAxLCAuZmxhZ3MgPSBGTEFHU30sIFwKKyAgICB7Imxpc3RfZ2VuZXJhdG9ycyIsICJsaXN0IGF2YWlsYWJsZSBnZW5lcmF0b3JzIiwgICAgICAgICAgICAgT0ZGU0VUKGxpc3RfZ2VuZXJhdG9ycyksIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQgPSAwfSwgMCwgMSwgLmZsYWdzID0gRkxBR1N9LCBcCisgICAgeyJmaWx0ZXIiLCAgICAgICAgICAibmFtZXMgYW5kIG9wdGlvbnMgb2YgZmlsdGVycyB0byBhcHBseSIsIE9GRlNFVChmaWx0ZXJfc3RyaW5nKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAgIC5mbGFncyA9IEZMQUdTfSwgXAorICAgIHsib3V0cHV0X3JlY3QiLCAgICAgIm91dHB1dCByZWN0YW5nbGUgd2l0aGluIG91dHB1dCBpbWFnZSIsICBPRkZTRVQob3V0cHV0X3JlY3QpLCAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAgICAuZmxhZ3MgPSBGTEFHU30sCisKKworLy8gZGVmaW5pdGlvbnMgZm9yIGNvcmVpbWFnZSB2aWRlbyBmaWx0ZXIKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjb3JlaW1hZ2Vfb3B0aW9uc1tdID0geworICAgIEZJTFRFUl9PUFRJT05TCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhjb3JlaW1hZ2UpOworCitBVkZpbHRlciBmZl92Zl9jb3JlaW1hZ2UgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiY29yZWltYWdlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWaWRlbyBmaWx0ZXJpbmcgdXNpbmcgQ29yZUltYWdlIEFQSS4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQ29yZUltYWdlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmY29yZWltYWdlX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICAgID0gdmZfY29yZWltYWdlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHZmX2NvcmVpbWFnZV9vdXRwdXRzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKK307CisKKy8vIGRlZmluaXRpb25zIGZvciBjb3JlaW1hZ2VzcmMgdmlkZW8gc291cmNlCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY29yZWltYWdlc3JjX29wdGlvbnNbXSA9IHsKKyAgICBHRU5FUkFUT1JfT1BUSU9OUworICAgIEZJTFRFUl9PUFRJT05TCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhjb3JlaW1hZ2VzcmMpOworCitBVkZpbHRlciBmZl92c3JjX2NvcmVpbWFnZXNyYyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJjb3JlaW1hZ2VzcmMiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZpZGVvIHNvdXJjZSB1c2luZyBpbWFnZSBnZW5lcmF0b3JzIG9mIENvcmVJbWFnZSBBUEkuIiksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0X3NyYywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihDb3JlSW1hZ2VDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZjb3JlaW1hZ2VzcmNfY2xhc3MsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gdnNyY19jb3JlaW1hZ2VzcmNfb3V0cHV0cywKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHNfc3JjLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2Nyb3AuYyBiL2xpYmF2ZmlsdGVyL3ZmX2Nyb3AuYwppbmRleCAwMTc3M2ZhLi44NGJlNGM3IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9jcm9wLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfY3JvcC5jCkBAIC04Miw2ICs4Miw3IEBACiAKICAgICBBVlJhdGlvbmFsIG91dF9zYXI7IC8vLzwgb3V0cHV0IHNhbXBsZSBhc3BlY3QgcmF0aW8KICAgICBpbnQga2VlcF9hc3BlY3Q7ICAgIC8vLzwga2VlcCBkaXNwbGF5IGFzcGVjdCByYXRpbyB3aGVuIGNyb3BwaW5nCisgICAgaW50IGV4YWN0OyAgICAgICAgICAvLy88IGV4YWN0IGNyb3BwaW5nLCBmb3Igc3Vic2FtcGxlZCBmb3JtYXRzCiAKICAgICBpbnQgbWF4X3N0ZXBbNF07ICAgIC8vLzwgbWF4IHBpeGVsIHN0ZXAgZm9yIGVhY2ggcGxhbmUsIGV4cHJlc3NlZCBhcyBhIG51bWJlciBvZiBieXRlcwogICAgIGludCBoc3ViLCB2c3ViOyAgICAgLy8vPCBjaHJvbWEgc3Vic2FtcGxpbmcKQEAgLTE4NCw4ICsxODUsMTEgQEAKICAgICAgICAgICAgICAgIHMtPndfZXhwciwgcy0+aF9leHByKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9Ci0gICAgcy0+dyAmPSB+KCgxIDw8IHMtPmhzdWIpIC0gMSk7Ci0gICAgcy0+aCAmPSB+KCgxIDw8IHMtPnZzdWIpIC0gMSk7CisKKyAgICBpZiAoIXMtPmV4YWN0KSB7CisgICAgICAgIHMtPncgJj0gfigoMSA8PCBzLT5oc3ViKSAtIDEpOworICAgICAgICBzLT5oICY9IH4oKDEgPDwgcy0+dnN1YikgLSAxKTsKKyAgICB9CiAKICAgICBhdl9leHByX2ZyZWUocy0+eF9wZXhwcik7CiAgICAgYXZfZXhwcl9mcmVlKHMtPnlfcGV4cHIpOwpAQCAtMjE5LDggKzIyMywxMCBAQAogICAgIC8qIHNldCBkZWZhdWx0LCByZXF1aXJlZCBpbiB0aGUgY2FzZSB0aGUgZmlyc3QgY29tcHV0ZWQgdmFsdWUgZm9yIHgveSBpcyBOQU4gKi8KICAgICBzLT54ID0gKGxpbmstPncgLSBzLT53KSAvIDI7CiAgICAgcy0+eSA9IChsaW5rLT5oIC0gcy0+aCkgLyAyOwotICAgIHMtPnggJj0gfigoMSA8PCBzLT5oc3ViKSAtIDEpOwotICAgIHMtPnkgJj0gfigoMSA8PCBzLT52c3ViKSAtIDEpOworICAgIGlmICghcy0+ZXhhY3QpIHsKKyAgICAgICAgcy0+eCAmPSB+KCgxIDw8IHMtPmhzdWIpIC0gMSk7CisgICAgICAgIHMtPnkgJj0gfigoMSA8PCBzLT52c3ViKSAtIDEpOworICAgIH0KICAgICByZXR1cm4gMDsKIAogZmFpbF9leHByOgpAQCAtMjQ5LDEzICsyNTUsMTQgQEAKICAgICBmcmFtZS0+d2lkdGggID0gcy0+dzsKICAgICBmcmFtZS0+aGVpZ2h0ID0gcy0+aDsKIAotICAgIHMtPnZhcl92YWx1ZXNbVkFSX05dID0gbGluay0+ZnJhbWVfY291bnQ7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfTl0gPSBsaW5rLT5mcmFtZV9jb3VudF9vdXQ7CiAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVF0gPSBmcmFtZS0+cHRzID09IEFWX05PUFRTX1ZBTFVFID8KICAgICAgICAgTkFOIDogZnJhbWUtPnB0cyAqIGF2X3EyZChsaW5rLT50aW1lX2Jhc2UpOwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX1BPU10gPSBhdl9mcmFtZV9nZXRfcGt0X3BvcyhmcmFtZSkgPT0gLTEgPwotICAgICAgICBOQU4gOiBhdl9mcmFtZV9nZXRfcGt0X3BvcyhmcmFtZSk7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfUE9TXSA9IGZyYW1lLT5wa3RfcG9zID09IC0xID8KKyAgICAgICAgTkFOIDogZnJhbWUtPnBrdF9wb3M7CiAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfWF0gPSBhdl9leHByX2V2YWwocy0+eF9wZXhwciwgcy0+dmFyX3ZhbHVlcywgTlVMTCk7CiAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfWV0gPSBhdl9leHByX2V2YWwocy0+eV9wZXhwciwgcy0+dmFyX3ZhbHVlcywgTlVMTCk7CisgICAgLyogSXQgaXMgbmVjZXNzYXJ5IGlmIHggaXMgZXhwcmVzc2VkIGZyb20geSAgKi8KICAgICBzLT52YXJfdmFsdWVzW1ZBUl9YXSA9IGF2X2V4cHJfZXZhbChzLT54X3BleHByLCBzLT52YXJfdmFsdWVzLCBOVUxMKTsKIAogICAgIG5vcm1hbGl6ZV9kb3VibGUoJnMtPngsIHMtPnZhcl92YWx1ZXNbVkFSX1hdKTsKQEAgLTI2OSw4ICsyNzYsMTAgQEAKICAgICAgICAgcy0+eCA9IGxpbmstPncgLSBzLT53OwogICAgIGlmICgodW5zaWduZWQpcy0+eSArICh1bnNpZ25lZClzLT5oID4gbGluay0+aCkKICAgICAgICAgcy0+eSA9IGxpbmstPmggLSBzLT5oOwotICAgIHMtPnggJj0gfigoMSA8PCBzLT5oc3ViKSAtIDEpOwotICAgIHMtPnkgJj0gfigoMSA8PCBzLT52c3ViKSAtIDEpOworICAgIGlmICghcy0+ZXhhY3QpIHsKKyAgICAgICAgcy0+eCAmPSB+KCgxIDw8IHMtPmhzdWIpIC0gMSk7CisgICAgICAgIHMtPnkgJj0gfigoMSA8PCBzLT52c3ViKSAtIDEpOworICAgIH0KIAogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19UUkFDRSwgIm46JWQgdDolZiBwb3M6JWYgeDolZCB5OiVkIHgrdzolZCB5K2g6JWRcbiIsCiAgICAgICAgICAgICAoaW50KXMtPnZhcl92YWx1ZXNbVkFSX05dLCBzLT52YXJfdmFsdWVzW1ZBUl9UXSwgcy0+dmFyX3ZhbHVlc1tWQVJfUE9TXSwKQEAgLTI3OSw3ICsyODgsNyBAQAogICAgIGZyYW1lLT5kYXRhWzBdICs9IHMtPnkgKiBmcmFtZS0+bGluZXNpemVbMF07CiAgICAgZnJhbWUtPmRhdGFbMF0gKz0gcy0+eCAqIHMtPm1heF9zdGVwWzBdOwogCi0gICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkpIHsKKyAgICBpZiAoIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwgZGVzYy0+ZmxhZ3MgJiBGRl9QU0VVRE9QQUwpKSB7CiAgICAgICAgIGZvciAoaSA9IDE7IGkgPCAzOyBpICsrKSB7CiAgICAgICAgICAgICBpZiAoZnJhbWUtPmRhdGFbaV0pIHsKICAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YVtpXSArPSAocy0+eSA+PiBzLT52c3ViKSAqIGZyYW1lLT5saW5lc2l6ZVtpXTsKQEAgLTM0NCw2ICszNTMsNyBAQAogICAgIHsgIngiLCAgICAgICAgICAgInNldCB0aGUgeCBjcm9wIGFyZWEgZXhwcmVzc2lvbiIsICAgICAgIE9GRlNFVCh4X2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIihpbl93LW91dF93KS8yIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJ5IiwgICAgICAgICAgICJzZXQgdGhlIHkgY3JvcCBhcmVhIGV4cHJlc3Npb24iLCAgICAgICBPRkZTRVQoeV9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIoaW5faC1vdXRfaCkvMiJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCiAgICAgeyAia2VlcF9hc3BlY3QiLCAia2VlcCBhc3BlY3QgcmF0aW8iLCAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGtlZXBfYXNwZWN0KSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiZXhhY3QiLCAgICAgICAiZG8gZXhhY3QgY3JvcHBpbmciLCAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGV4YWN0KSwgIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jcm9wZGV0ZWN0LmMgYi9saWJhdmZpbHRlci92Zl9jcm9wZGV0ZWN0LmMKaW5kZXggNGE4OTg3NS4uN2M3ZDBiOSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfY3JvcGRldGVjdC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2Nyb3BkZXRlY3QuYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAKICAgICAvLyBpZ25vcmUgZmlyc3QgMiBmcmFtZXMgLSB0aGV5IG1heSBiZSBlbXB0eQogICAgIGlmICgrK3MtPmZyYW1lX25iID4gMCkgewotICAgICAgICBtZXRhZGF0YSA9IGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGZyYW1lKTsKKyAgICAgICAgbWV0YWRhdGEgPSAmZnJhbWUtPm1ldGFkYXRhOwogCiAgICAgICAgIC8vIFJlc2V0IHRoZSBjcm9wIGFyZWEgZXZlcnkgcmVzZXRfY291bnQgZnJhbWVzLCBpZiByZXNldF9jb3VudCBpcyA+IDAKICAgICAgICAgaWYgKHMtPnJlc2V0X2NvdW50ID4gMCAmJiBzLT5mcmFtZV9uYiA+IHMtPnJlc2V0X2NvdW50KSB7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9jdXJ2ZXMuYyBiL2xpYmF2ZmlsdGVyL3ZmX2N1cnZlcy5jCmluZGV4IDFjNTFjMWIuLjE5YWI3ODkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2N1cnZlcy5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2N1cnZlcy5jCkBAIC01OCwxNSArNTgsMTggQEAKICAgICBOQl9QUkVTRVRTLAogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQ3VydmVzQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IHByZXNldDsKICAgICBjaGFyICpjb21wX3BvaW50c19zdHJbTkJfQ09NUCArIDFdOwogICAgIGNoYXIgKmNvbXBfcG9pbnRzX3N0cl9hbGw7Ci0gICAgdWludDhfdCBncmFwaFtOQl9DT01QICsgMV1bMjU2XTsKKyAgICB1aW50MTZfdCAqZ3JhcGhbTkJfQ09NUCArIDFdOworICAgIGludCBsdXRfc2l6ZTsKICAgICBjaGFyICpwc2ZpbGU7CiAgICAgdWludDhfdCByZ2JhX21hcFs0XTsKICAgICBpbnQgc3RlcDsKKyAgICBjaGFyICpwbG90X2ZpbGVuYW1lOworICAgIGludCBpc18xNmJpdDsKIH0gQ3VydmVzQ29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CkBAIC05OCw2ICsxMDEsNyBAQAogICAgIHsgImIiLCAgICAgInNldCBibHVlIHBvaW50cyBjb29yZGluYXRlcyIsICBPRkZTRVQoY29tcF9wb2ludHNfc3RyWzJdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKICAgICB7ICJhbGwiLCAgICJzZXQgcG9pbnRzIGNvb3JkaW5hdGVzIGZvciBhbGwgY29tcG9uZW50cyIsIE9GRlNFVChjb21wX3BvaW50c19zdHJfYWxsKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgLmZsYWdzID0gRkxBR1MgfSwKICAgICB7ICJwc2ZpbGUiLCAic2V0IFBob3Rvc2hvcCBjdXJ2ZXMgZmlsZSBuYW1lIiwgT0ZGU0VUKHBzZmlsZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAicGxvdCIsICJzYXZlIEdudXBsb3Qgc2NyaXB0IG9mIHRoZSBjdXJ2ZXMgaW4gc3BlY2lmaWVkIGZpbGUiLCBPRkZTRVQocGxvdF9maWxlbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTExMCwyNSArMTE0LDI1IEBACiAgICAgY29uc3QgY2hhciAqbWFzdGVyOwogfSBjdXJ2ZXNfcHJlc2V0c1tdID0gewogICAgIFtQUkVTRVRfQ09MT1JfTkVHQVRJVkVdID0gewotICAgICAgICAiMC8xIDAuMTI5LzEgMC40NjYvMC40OTggMC43MjUvMCAxLzAiLAotICAgICAgICAiMC8xIDAuMTA5LzEgMC4zMDEvMC40OTggMC41MTcvMCAxLzAiLAotICAgICAgICAiMC8xIDAuMDk4LzEgMC4yMzUvMC40OTggMC40MjMvMCAxLzAiLAorICAgICAgICAiMC4xMjkvMSAwLjQ2Ni8wLjQ5OCAwLjcyNS8wIiwKKyAgICAgICAgIjAuMTA5LzEgMC4zMDEvMC40OTggMC41MTcvMCIsCisgICAgICAgICIwLjA5OC8xIDAuMjM1LzAuNDk4IDAuNDIzLzAiLAogICAgIH0sCiAgICAgW1BSRVNFVF9DUk9TU19QUk9DRVNTXSA9IHsKLSAgICAgICAgIjAuMjUvMC4xNTYgMC41MDEvMC41MDEgMC42ODYvMC43NDUiLAotICAgICAgICAiMC4yNS8wLjE4OCAwLjM4LzAuNTAxIDAuNzQ1LzAuODE1IDEvMC44MTUiLAotICAgICAgICAiMC4yMzEvMC4wOTQgMC43MDkvMC44NzQiLAorICAgICAgICAiMC8wIDAuMjUvMC4xNTYgMC41MDEvMC41MDEgMC42ODYvMC43NDUgMS8xIiwKKyAgICAgICAgIjAvMCAwLjI1LzAuMTg4IDAuMzgvMC41MDEgMC43NDUvMC44MTUgMS8wLjgxNSIsCisgICAgICAgICIwLzAgMC4yMzEvMC4wOTQgMC43MDkvMC44NzQgMS8xIiwKICAgICB9LAotICAgIFtQUkVTRVRfREFSS0VSXSAgICAgICAgICAgICA9IHsgLm1hc3RlciA9ICIwLjUvMC40IiB9LAotICAgIFtQUkVTRVRfSU5DUkVBU0VfQ09OVFJBU1RdICA9IHsgLm1hc3RlciA9ICIwLjE0OS8wLjA2NiAwLjgzMS8wLjkwNSAwLjkwNS8wLjk4IiB9LAotICAgIFtQUkVTRVRfTElHSFRFUl0gICAgICAgICAgICA9IHsgLm1hc3RlciA9ICIwLjQvMC41IiB9LAotICAgIFtQUkVTRVRfTElORUFSX0NPTlRSQVNUXSAgICA9IHsgLm1hc3RlciA9ICIwLjMwNS8wLjI4NiAwLjY5NC8wLjcxMyIgfSwKLSAgICBbUFJFU0VUX01FRElVTV9DT05UUkFTVF0gICAgPSB7IC5tYXN0ZXIgPSAiMC4yODYvMC4yMTkgMC42MzkvMC42NDMiIH0sCisgICAgW1BSRVNFVF9EQVJLRVJdICAgICAgICAgICAgID0geyAubWFzdGVyID0gIjAvMCAwLjUvMC40IDEvMSIgfSwKKyAgICBbUFJFU0VUX0lOQ1JFQVNFX0NPTlRSQVNUXSAgPSB7IC5tYXN0ZXIgPSAiMC8wIDAuMTQ5LzAuMDY2IDAuODMxLzAuOTA1IDAuOTA1LzAuOTggMS8xIiB9LAorICAgIFtQUkVTRVRfTElHSFRFUl0gICAgICAgICAgICA9IHsgLm1hc3RlciA9ICIwLzAgMC40LzAuNSAxLzEiIH0sCisgICAgW1BSRVNFVF9MSU5FQVJfQ09OVFJBU1RdICAgID0geyAubWFzdGVyID0gIjAvMCAwLjMwNS8wLjI4NiAwLjY5NC8wLjcxMyAxLzEiIH0sCisgICAgW1BSRVNFVF9NRURJVU1fQ09OVFJBU1RdICAgID0geyAubWFzdGVyID0gIjAvMCAwLjI4Ni8wLjIxOSAwLjYzOS8wLjY0MyAxLzEiIH0sCiAgICAgW1BSRVNFVF9ORUdBVElWRV0gICAgICAgICAgID0geyAubWFzdGVyID0gIjAvMSAxLzAiIH0sCi0gICAgW1BSRVNFVF9TVFJPTkdfQ09OVFJBU1RdICAgID0geyAubWFzdGVyID0gIjAuMzAxLzAuMTk2IDAuNTkyLzAuNiAwLjY4Ni8wLjczNyIgfSwKKyAgICBbUFJFU0VUX1NUUk9OR19DT05UUkFTVF0gICAgPSB7IC5tYXN0ZXIgPSAiMC8wIDAuMzAxLzAuMTk2IDAuNTkyLzAuNiAwLjY4Ni8wLjczNyAxLzEiIH0sCiAgICAgW1BSRVNFVF9WSU5UQUdFXSA9IHsKICAgICAgICAgIjAvMC4xMSAwLjQyLzAuNTEgMS8wLjk1IiwKLSAgICAgICAgIjAuNTAvMC40OCIsCisgICAgICAgICIwLzAgMC41MC8wLjQ4IDEvMSIsCiAgICAgICAgICIwLzAuMjIgMC40OS8wLjQ0IDEvMC44IiwKICAgICB9CiB9OwpAQCAtMTQ1LDEwICsxNDksMTIgQEAKICAgICByZXR1cm4gcG9pbnQ7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2VfcG9pbnRzX3N0cihBVkZpbHRlckNvbnRleHQgKmN0eCwgc3RydWN0IGtleXBvaW50ICoqcG9pbnRzLCBjb25zdCBjaGFyICpzKQorc3RhdGljIGludCBwYXJzZV9wb2ludHNfc3RyKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBzdHJ1Y3Qga2V5cG9pbnQgKipwb2ludHMsIGNvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1dF9zaXplKQogewogICAgIGNoYXIgKnAgPSAoY2hhciAqKXM7IC8vIHN0cnRvZCB3b24ndCBhbHRlciB0aGUgc3RyaW5nCiAgICAgc3RydWN0IGtleXBvaW50ICpsYXN0ID0gTlVMTDsKKyAgICBjb25zdCBpbnQgc2NhbGUgPSBsdXRfc2l6ZSAtIDE7CiAKICAgICAvKiBjb25zdHJ1Y3QgYSBsaW5rZWQgbGlzdCBiYXNlZCBvbiB0aGUga2V5IHBvaW50cyBzdHJpbmcgKi8KICAgICB3aGlsZSAocCAmJiAqcCkgewpAQCAtMTY1LDcgKzE3MSw3IEBACiAgICAgICAgIGlmICghKnBvaW50cykKICAgICAgICAgICAgICpwb2ludHMgPSBwb2ludDsKICAgICAgICAgaWYgKGxhc3QpIHsKLSAgICAgICAgICAgIGlmICgoaW50KShsYXN0LT54ICogMjU1KSA+PSAoaW50KShwb2ludC0+eCAqIDI1NSkpIHsKKyAgICAgICAgICAgIGlmICgoaW50KShsYXN0LT54ICogc2NhbGUpID49IChpbnQpKHBvaW50LT54ICogc2NhbGUpKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiS2V5IHBvaW50IGNvb3JkaW5hdGVzICglZjslZikgIgogICAgICAgICAgICAgICAgICAgICAgICAiYW5kICglZjslZikgYXJlIHRvbyBjbG9zZSBmcm9tIGVhY2ggb3RoZXIgb3Igbm90ICIKICAgICAgICAgICAgICAgICAgICAgICAgInN0cmljdGx5IGluY3JlYXNpbmcgb24gdGhlIHgtYXhpc1xuIiwKQEAgLTE3NywyOCArMTgzLDExIEBACiAgICAgICAgIGxhc3QgPSBwb2ludDsKICAgICB9CiAKLSAgICAvKiBhdXRvIGluc2VydCBmaXJzdCBrZXkgcG9pbnQgaWYgbWlzc2luZyBhdCB4PTAgKi8KLSAgICBpZiAoISpwb2ludHMpIHsKLSAgICAgICAgbGFzdCA9IG1ha2VfcG9pbnQoMCwgMCwgTlVMTCk7Ci0gICAgICAgIGlmICghbGFzdCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGxhc3QtPnggPSBsYXN0LT55ID0gMDsKLSAgICAgICAgKnBvaW50cyA9IGxhc3Q7Ci0gICAgfSBlbHNlIGlmICgoKnBvaW50cyktPnggIT0gMC4pIHsKLSAgICAgICAgc3RydWN0IGtleXBvaW50ICpuZXdmaXJzdCA9IG1ha2VfcG9pbnQoMCwgMCwgKnBvaW50cyk7Ci0gICAgICAgIGlmICghbmV3Zmlyc3QpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAqcG9pbnRzID0gbmV3Zmlyc3Q7Ci0gICAgfQotCi0gICAgYXZfYXNzZXJ0MChsYXN0KTsKLQotICAgIC8qIGF1dG8gaW5zZXJ0IGxhc3Qga2V5IHBvaW50IGlmIG1pc3NpbmcgYXQgeD0xICovCi0gICAgaWYgKGxhc3QtPnggIT0gMS4pIHsKLSAgICAgICAgc3RydWN0IGtleXBvaW50ICpwb2ludCA9IG1ha2VfcG9pbnQoMSwgMSwgTlVMTCk7Ci0gICAgICAgIGlmICghcG9pbnQpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBsYXN0LT5uZXh0ID0gcG9pbnQ7CisgICAgaWYgKCpwb2ludHMgJiYgISgqcG9pbnRzKS0+bmV4dCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgIk9ubHkgb25lIHBvaW50IChhdCAoJWY7JWYpKSBpcyBkZWZpbmVkLCAiCisgICAgICAgICAgICAgICAidGhpcyBpcyB1bmxpa2VseSB0byBiZWhhdmUgYXMgeW91IGV4cGVjdC4gWW91IHByb2JhYmx5IHdhbnQiCisgICAgICAgICAgICAgICAiYXQgbGVhc3QgMiBwb2ludHMuIiwKKyAgICAgICAgICAgICAgICgqcG9pbnRzKS0+eCwgKCpwb2ludHMpLT55KTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTIxOSwxNyArMjA4LDM3IEBACiAgKiBGaW5kaW5nIGN1cnZlcyB1c2luZyBDdWJpYyBTcGxpbmVzIG5vdGVzIGJ5IFN0ZXZlbiBSYXVjaCBhbmQgSm9obiBTdG9ja2llLgogICogQHNlZSBodHRwOi8vcGVvcGxlLm1hdGguc2Z1LmNhL35zdG9ja2llL3RlYWNoaW5nL21hY20zMTYvbm90ZXMvc3BsaW5lcy5wZGYKICAqLwotc3RhdGljIGludCBpbnRlcnBvbGF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdWludDhfdCAqeSwgY29uc3Qgc3RydWN0IGtleXBvaW50ICpwb2ludHMpCisKKyNkZWZpbmUgQ0xJUCh2KSAobmJpdHMgPT0gOCA/IGF2X2NsaXBfdWludDgodikgOiBhdl9jbGlwX3VpbnQxNih2KSkKKworc3RhdGljIGlubGluZSBpbnQgaW50ZXJwb2xhdGUodm9pZCAqbG9nX2N0eCwgdWludDE2X3QgKnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qga2V5cG9pbnQgKnBvaW50cywgaW50IG5iaXRzKQogewogICAgIGludCBpLCByZXQgPSAwOwotICAgIGNvbnN0IHN0cnVjdCBrZXlwb2ludCAqcG9pbnQ7CisgICAgY29uc3Qgc3RydWN0IGtleXBvaW50ICpwb2ludCA9IHBvaW50czsKICAgICBkb3VibGUgeHByZXYgPSAwOworICAgIGNvbnN0IGludCBsdXRfc2l6ZSA9IDE8PG5iaXRzOworICAgIGNvbnN0IGludCBzY2FsZSA9IGx1dF9zaXplIC0gMTsKIAotICAgIGludCBuID0gZ2V0X25iX3BvaW50cyhwb2ludHMpOyAvLyBudW1iZXIgb2Ygc3BsaW5lcworICAgIGRvdWJsZSAoKm1hdHJpeClbM107CisgICAgZG91YmxlICpoLCAqcjsKKyAgICBjb25zdCBpbnQgbiA9IGdldF9uYl9wb2ludHMocG9pbnRzKTsgLy8gbnVtYmVyIG9mIHNwbGluZXMKIAotICAgIGRvdWJsZSAoKm1hdHJpeClbM10gPSBhdl9jYWxsb2Mobiwgc2l6ZW9mKCptYXRyaXgpKTsKLSAgICBkb3VibGUgKmggPSBhdl9tYWxsb2MoKG4gLSAxKSAqIHNpemVvZigqaCkpOwotICAgIGRvdWJsZSAqciA9IGF2X2NhbGxvYyhuLCBzaXplb2YoKnIpKTsKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsdXRfc2l6ZTsgaSsrKQorICAgICAgICAgICAgeVtpXSA9IGk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChuID09IDEpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGx1dF9zaXplOyBpKyspCisgICAgICAgICAgICB5W2ldID0gQ0xJUChwb2ludC0+eSAqIHNjYWxlKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgbWF0cml4ID0gYXZfY2FsbG9jKG4sIHNpemVvZigqbWF0cml4KSk7CisgICAgaCA9IGF2X21hbGxvYygobiAtIDEpICogc2l6ZW9mKCpoKSk7CisgICAgciA9IGF2X2NhbGxvYyhuLCBzaXplb2YoKnIpKTsKIAogICAgIGlmICghbWF0cml4IHx8ICFoIHx8ICFyKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKQEAgLTI0OCw5ICsyNTcsOSBAQAogICAgIC8qIHJpZ2h0LXNpZGUgb2YgdGhlIHBvbHlub21pYWxzLCB3aWxsIGJlIG1vZGlmaWVkIHRvIGNvbnRhaW5zIHRoZSBzb2x1dGlvbiAqLwogICAgIHBvaW50ID0gcG9pbnRzOwogICAgIGZvciAoaSA9IDE7IGkgPCBuIC0gMTsgaSsrKSB7Ci0gICAgICAgIGRvdWJsZSB5cCA9IHBvaW50LT55LAotICAgICAgICAgICAgICAgeWMgPSBwb2ludC0+bmV4dC0+eSwKLSAgICAgICAgICAgICAgIHluID0gcG9pbnQtPm5leHQtPm5leHQtPnk7CisgICAgICAgIGNvbnN0IGRvdWJsZSB5cCA9IHBvaW50LT55OworICAgICAgICBjb25zdCBkb3VibGUgeWMgPSBwb2ludC0+bmV4dC0+eTsKKyAgICAgICAgY29uc3QgZG91YmxlIHluID0gcG9pbnQtPm5leHQtPm5leHQtPnk7CiAgICAgICAgIHJbaV0gPSA2ICogKCh5bi15YykvaFtpXSAtICh5Yy15cCkvaFtpLTFdKTsKICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKICAgICB9CkBAIC0yNjksNDUgKzI3OCw1NCBAQAogCiAgICAgLyogdHJpZGlhZ29uYWwgc29sdmluZyBvZiB0aGUgbGluZWFyIHN5c3RlbSAqLwogICAgIGZvciAoaSA9IDE7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgZG91YmxlIGRlbiA9IG1hdHJpeFtpXVtNRF0gLSBtYXRyaXhbaV1bQkRdICogbWF0cml4W2ktMV1bQURdOwotICAgICAgICBkb3VibGUgayA9IGRlbiA/IDEuL2RlbiA6IDEuOworICAgICAgICBjb25zdCBkb3VibGUgZGVuID0gbWF0cml4W2ldW01EXSAtIG1hdHJpeFtpXVtCRF0gKiBtYXRyaXhbaS0xXVtBRF07CisgICAgICAgIGNvbnN0IGRvdWJsZSBrID0gZGVuID8gMS4vZGVuIDogMS47CiAgICAgICAgIG1hdHJpeFtpXVtBRF0gKj0gazsKICAgICAgICAgcltpXSA9IChyW2ldIC0gbWF0cml4W2ldW0JEXSAqIHJbaSAtIDFdKSAqIGs7CiAgICAgfQogICAgIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IGktLSkKICAgICAgICAgcltpXSA9IHJbaV0gLSBtYXRyaXhbaV1bQURdICogcltpICsgMV07CiAKLSAgICAvKiBjb21wdXRlIHRoZSBncmFwaCB3aXRoIHg9WzAuLjI1NV0gKi8KLSAgICBpID0gMDsKICAgICBwb2ludCA9IHBvaW50czsKKworICAgIC8qIGxlZnQgcGFkZGluZyAqLworICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KShwb2ludC0+eCAqIHNjYWxlKTsgaSsrKQorICAgICAgICB5W2ldID0gQ0xJUChwb2ludC0+eSAqIHNjYWxlKTsKKworICAgIC8qIGNvbXB1dGUgdGhlIGdyYXBoIHdpdGggeD1beDAuLnhOXSAqLworICAgIGkgPSAwOwogICAgIGF2X2Fzc2VydDAocG9pbnQtPm5leHQpOyAvLyBhbHdheXMgYXQgbGVhc3QgMiBrZXkgcG9pbnRzCiAgICAgd2hpbGUgKHBvaW50LT5uZXh0KSB7Ci0gICAgICAgIGRvdWJsZSB5YyA9IHBvaW50LT55OwotICAgICAgICBkb3VibGUgeW4gPSBwb2ludC0+bmV4dC0+eTsKKyAgICAgICAgY29uc3QgZG91YmxlIHljID0gcG9pbnQtPnk7CisgICAgICAgIGNvbnN0IGRvdWJsZSB5biA9IHBvaW50LT5uZXh0LT55OwogCi0gICAgICAgIGRvdWJsZSBhID0geWM7Ci0gICAgICAgIGRvdWJsZSBiID0gKHluLXljKS9oW2ldIC0gaFtpXSpyW2ldLzIuIC0gaFtpXSoocltpKzFdLXJbaV0pLzYuOwotICAgICAgICBkb3VibGUgYyA9IHJbaV0gLyAyLjsKLSAgICAgICAgZG91YmxlIGQgPSAocltpKzFdIC0gcltpXSkgLyAoNi4qaFtpXSk7CisgICAgICAgIGNvbnN0IGRvdWJsZSBhID0geWM7CisgICAgICAgIGNvbnN0IGRvdWJsZSBiID0gKHluLXljKS9oW2ldIC0gaFtpXSpyW2ldLzIuIC0gaFtpXSoocltpKzFdLXJbaV0pLzYuOworICAgICAgICBjb25zdCBkb3VibGUgYyA9IHJbaV0gLyAyLjsKKyAgICAgICAgY29uc3QgZG91YmxlIGQgPSAocltpKzFdIC0gcltpXSkgLyAoNi4qaFtpXSk7CiAKICAgICAgICAgaW50IHg7Ci0gICAgICAgIGludCB4X3N0YXJ0ID0gcG9pbnQtPnggICAgICAgKiAyNTU7Ci0gICAgICAgIGludCB4X2VuZCAgID0gcG9pbnQtPm5leHQtPnggKiAyNTU7CisgICAgICAgIGNvbnN0IGludCB4X3N0YXJ0ID0gcG9pbnQtPnggICAgICAgKiBzY2FsZTsKKyAgICAgICAgY29uc3QgaW50IHhfZW5kICAgPSBwb2ludC0+bmV4dC0+eCAqIHNjYWxlOwogCi0gICAgICAgIGF2X2Fzc2VydDAoeF9zdGFydCA+PSAwICYmIHhfc3RhcnQgPD0gMjU1ICYmCi0gICAgICAgICAgICAgICAgICAgeF9lbmQgICA+PSAwICYmIHhfZW5kICAgPD0gMjU1KTsKKyAgICAgICAgYXZfYXNzZXJ0MCh4X3N0YXJ0ID49IDAgJiYgeF9zdGFydCA8IGx1dF9zaXplICYmCisgICAgICAgICAgICAgICAgICAgeF9lbmQgICA+PSAwICYmIHhfZW5kICAgPCBsdXRfc2l6ZSk7CiAKICAgICAgICAgZm9yICh4ID0geF9zdGFydDsgeCA8PSB4X2VuZDsgeCsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgeHggPSAoeCAtIHhfc3RhcnQpICogMS8yNTUuOwotICAgICAgICAgICAgZG91YmxlIHl5ID0gYSArIGIqeHggKyBjKnh4Knh4ICsgZCp4eCp4eCp4eDsKLSAgICAgICAgICAgIHlbeF0gPSBhdl9jbGlwZih5eSwgMCwgMSkgKiAyNTU7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJmKCVmKT0lZiAtPiB5WyVkXT0lZFxuIiwgeHgsIHl5LCB4LCB5W3hdKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB4eCA9ICh4IC0geF9zdGFydCkgKiAxLi9zY2FsZTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB5eSA9IGEgKyBiKnh4ICsgYyp4eCp4eCArIGQqeHgqeHgqeHg7CisgICAgICAgICAgICB5W3hdID0gQ0xJUCh5eSAqIHNjYWxlKTsKKyAgICAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfREVCVUcsICJmKCVmKT0lZiAtPiB5WyVkXT0lZFxuIiwgeHgsIHl5LCB4LCB5W3hdKTsKICAgICAgICAgfQogCiAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7CiAgICAgICAgIGkrKzsKICAgICB9CiAKKyAgICAvKiByaWdodCBwYWRkaW5nICovCisgICAgZm9yIChpID0gKGludCkocG9pbnQtPnggKiBzY2FsZSk7IGkgPCBsdXRfc2l6ZTsgaSsrKQorICAgICAgICB5W2ldID0gQ0xJUChwb2ludC0+eSAqIHNjYWxlKTsKKwogZW5kOgogICAgIGF2X2ZyZWUobWF0cml4KTsKICAgICBhdl9mcmVlKGgpOwpAQCAtMzE1LDYgKzMzMywxNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKKyNkZWZpbmUgREVDTEFSRV9JTlRFUlBPTEFURV9GVU5DKG5iaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGludGVycG9sYXRlIyNuYml0cyh2b2lkICpsb2dfY3R4LCB1aW50MTZfdCAqeSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGtleXBvaW50ICpwb2ludHMpICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGludGVycG9sYXRlKGxvZ19jdHgsIHksIHBvaW50cywgbmJpdHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitERUNMQVJFX0lOVEVSUE9MQVRFX0ZVTkMoOCkKK0RFQ0xBUkVfSU5URVJQT0xBVEVfRlVOQygxNikKKwogc3RhdGljIGludCBwYXJzZV9wc2ZpbGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmZuYW1lKQogewogICAgIEN1cnZlc0NvbnRleHQgKmN1cnZlcyA9IGN0eC0+cHJpdjsKQEAgLTM3MSwxMSArMzk5LDcxIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCitzdGF0aWMgaW50IGR1bXBfY3VydmVzKGNvbnN0IGNoYXIgKmZuYW1lLCB1aW50MTZfdCAqZ3JhcGhbTkJfQ09NUCArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qga2V5cG9pbnQgKmNvbXBfcG9pbnRzW05CX0NPTVAgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGx1dF9zaXplKQogewotICAgIGludCBpLCBqLCByZXQ7CisgICAgaW50IGk7CisgICAgQVZCUHJpbnQgYnVmOworICAgIGNvbnN0IGRvdWJsZSBzY2FsZSA9IDEuIC8gKGx1dF9zaXplIC0gMSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2xvcnNbXSA9IHsgInJlZCIsICJncmVlbiIsICJibHVlIiwgIiM0MDQwNDAiLCB9OworICAgIEZJTEUgKmYgPSBhdl9mb3Blbl91dGY4KGZuYW1lLCAidyIpOworCisgICAgYXZfYXNzZXJ0MChGRl9BUlJBWV9FTEVNUyhjb2xvcnMpID09IE5CX0NPTVAgKyAxKTsKKworICAgIGlmICghZikgeworICAgICAgICBpbnQgcmV0ID0gQVZFUlJPUihlcnJubyk7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW5ub3Qgb3BlbiBmaWxlICclcycgZm9yIHdyaXRpbmc6ICVzXG4iLAorICAgICAgICAgICAgICAgZm5hbWUsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIGF2X2JwcmludGYoJmJ1ZiwgInNldCB4dGljcyAwLjFcbiIpOworICAgIGF2X2JwcmludGYoJmJ1ZiwgInNldCB5dGljcyAwLjFcbiIpOworICAgIGF2X2JwcmludGYoJmJ1ZiwgInNldCBzaXplIHNxdWFyZVxuIik7CisgICAgYXZfYnByaW50ZigmYnVmLCAic2V0IGdyaWRcbiIpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNvbG9ycyk7IGkrKykgeworICAgICAgICBhdl9icHJpbnRmKCZidWYsICIlcyctJyB1c2luZyAxOjIgd2l0aCBsaW5lcyBsYyAnJXMnIHRpdGxlICcnIiwKKyAgICAgICAgICAgICAgICAgICBpID8gIiwgIiA6ICJwbG90ICIsIGNvbG9yc1tpXSk7CisgICAgICAgIGlmIChjb21wX3BvaW50c1tpXSkKKyAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgIiwgJy0nIHVzaW5nIDE6MiB3aXRoIHBvaW50cyBwb2ludHR5cGUgMyBsYyAnJXMnIHRpdGxlICcnIiwKKyAgICAgICAgICAgICAgICAgICAgY29sb3JzW2ldKTsKKyAgICB9CisgICAgYXZfYnByaW50ZigmYnVmLCAiXG4iKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjb2xvcnMpOyBpKyspIHsKKyAgICAgICAgaW50IHg7CisKKyAgICAgICAgLyogcGxvdCBnZW5lcmF0ZWQgdmFsdWVzICovCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBsdXRfc2l6ZTsgeCsrKQorICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiJWYgJWZcbiIsIHggKiBzY2FsZSwgZ3JhcGhbaV1beF0gKiBzY2FsZSk7CisgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgImVcbiIpOworCisgICAgICAgIC8qIHBsb3QgdXNlciBrbm90cyAqLworICAgICAgICBpZiAoY29tcF9wb2ludHNbaV0pIHsKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBrZXlwb2ludCAqcG9pbnQgPSBjb21wX3BvaW50c1tpXTsKKworICAgICAgICAgICAgd2hpbGUgKHBvaW50KSB7CisgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmYnVmLCAiJWYgJWZcbiIsIHBvaW50LT54LCBwb2ludC0+eSk7CisgICAgICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgImVcbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgZndyaXRlKGJ1Zi5zdHIsIDEsIGJ1Zi5sZW4sIGYpOworICAgIGZjbG9zZShmKTsKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjdXJ2ZXNfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgaSwgcmV0OwogICAgIEN1cnZlc0NvbnRleHQgKmN1cnZlcyA9IGN0eC0+cHJpdjsKLSAgICBzdHJ1Y3Qga2V5cG9pbnQgKmNvbXBfcG9pbnRzW05CX0NPTVAgKyAxXSA9IHswfTsKICAgICBjaGFyICoqcHRzID0gY3VydmVzLT5jb21wX3BvaW50c19zdHI7CiAgICAgY29uc3QgY2hhciAqYWxscCA9IGN1cnZlcy0+Y29tcF9wb2ludHNfc3RyX2FsbDsKIApAQCAtNDExLDQ2ICs0OTksNiBAQAogICAgICAgICBTRVRfQ09NUF9JRl9OT1RfU0VUKDMsIG1hc3Rlcik7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IE5CX0NPTVAgKyAxOyBpKyspIHsKLSAgICAgICAgcmV0ID0gcGFyc2VfcG9pbnRzX3N0cihjdHgsIGNvbXBfcG9pbnRzICsgaSwgY3VydmVzLT5jb21wX3BvaW50c19zdHJbaV0pOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIHJldCA9IGludGVycG9sYXRlKGN0eCwgY3VydmVzLT5ncmFwaFtpXSwgY29tcF9wb2ludHNbaV0pOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgaWYgKHB0c1tOQl9DT01QXSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfQ09NUDsgaSsrKQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKQotICAgICAgICAgICAgICAgIGN1cnZlcy0+Z3JhcGhbaV1bal0gPSBjdXJ2ZXMtPmdyYXBoW05CX0NPTVBdW2N1cnZlcy0+Z3JhcGhbaV1bal1dOwotICAgIH0KLQotICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX1ZFUkJPU0UpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE5CX0NPTVA7IGkrKykgewotICAgICAgICAgICAgc3RydWN0IGtleXBvaW50ICpwb2ludCA9IGNvbXBfcG9pbnRzW2ldOwotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIjJWQgcG9pbnRzOiIsIGkpOwotICAgICAgICAgICAgd2hpbGUgKHBvaW50KSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIgKCVmOyVmKSIsIHBvaW50LT54LCBwb2ludC0+eSk7Ci0gICAgICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiXG4iKTsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiIyVkIHZhbHVlczoiLCBpKTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykKLSAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIiAlMDJYIiwgY3VydmVzLT5ncmFwaFtpXVtqXSk7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTkJfQ09NUCArIDE7IGkrKykgewotICAgICAgICBzdHJ1Y3Qga2V5cG9pbnQgKnBvaW50ID0gY29tcF9wb2ludHNbaV07Ci0gICAgICAgIHdoaWxlIChwb2ludCkgewotICAgICAgICAgICAgc3RydWN0IGtleXBvaW50ICpuZXh0ID0gcG9pbnQtPm5leHQ7Ci0gICAgICAgICAgICBhdl9mcmVlKHBvaW50KTsKLSAgICAgICAgICAgIHBvaW50ID0gbmV4dDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIHJldHVybiAwOwogfQogCkBAIC00NjIsNiArNTEwLDggQEAKICAgICAgICAgQVZfUElYX0ZNVF9BUkdCLCAgIEFWX1BJWF9GTVRfQUJHUiwKICAgICAgICAgQVZfUElYX0ZNVF8wUkdCLCAgIEFWX1BJWF9GTVRfMEJHUiwKICAgICAgICAgQVZfUElYX0ZNVF9SR0IwLCAgIEFWX1BJWF9GTVRfQkdSMCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0I0OCwgIEFWX1BJWF9GTVRfQkdSNDgsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQTY0LCBBVl9QSVhfRk1UX0JHUkE2NCwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKICAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHNfbGlzdCA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOwpAQCAtNDcyLDExICs1MjIsNTkgQEAKIAogc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCiB7Ci0gICAgQ3VydmVzQ29udGV4dCAqY3VydmVzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgaW50IGksIGosIHJldDsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEN1cnZlc0NvbnRleHQgKmN1cnZlcyA9IGN0eC0+cHJpdjsKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBjaGFyICoqcHRzID0gY3VydmVzLT5jb21wX3BvaW50c19zdHI7CisgICAgc3RydWN0IGtleXBvaW50ICpjb21wX3BvaW50c1tOQl9DT01QICsgMV0gPSB7MH07CiAKICAgICBmZl9maWxsX3JnYmFfbWFwKGN1cnZlcy0+cmdiYV9tYXAsIGlubGluay0+Zm9ybWF0KTsKLSAgICBjdXJ2ZXMtPnN0ZXAgPSBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MpID4+IDM7CisgICAgY3VydmVzLT5pc18xNmJpdCA9IGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4OworICAgIGN1cnZlcy0+bHV0X3NpemUgPSBjdXJ2ZXMtPmlzXzE2Yml0ID8gMTw8MTYgOiAxPDw4OworICAgIGN1cnZlcy0+c3RlcCA9IGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYykgPj4gKDMgKyBjdXJ2ZXMtPmlzXzE2Yml0KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQl9DT01QICsgMTsgaSsrKSB7CisgICAgICAgIGN1cnZlcy0+Z3JhcGhbaV0gPSBhdl9tYWxsb2N6X2FycmF5KGN1cnZlcy0+bHV0X3NpemUsIHNpemVvZigqY3VydmVzLT5ncmFwaFswXSkpOworICAgICAgICBpZiAoIWN1cnZlcy0+Z3JhcGhbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByZXQgPSBwYXJzZV9wb2ludHNfc3RyKGN0eCwgY29tcF9wb2ludHMgKyBpLCBjdXJ2ZXMtPmNvbXBfcG9pbnRzX3N0cltpXSwgY3VydmVzLT5sdXRfc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKGN1cnZlcy0+aXNfMTZiaXQpIHJldCA9IGludGVycG9sYXRlMTYoY3R4LCBjdXJ2ZXMtPmdyYXBoW2ldLCBjb21wX3BvaW50c1tpXSk7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICByZXQgPSBpbnRlcnBvbGF0ZTgoY3R4LCBjdXJ2ZXMtPmdyYXBoW2ldLCBjb21wX3BvaW50c1tpXSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocHRzW05CX0NPTVBdKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOQl9DT01QOyBpKyspCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY3VydmVzLT5sdXRfc2l6ZTsgaisrKQorICAgICAgICAgICAgICAgIGN1cnZlcy0+Z3JhcGhbaV1bal0gPSBjdXJ2ZXMtPmdyYXBoW05CX0NPTVBdW2N1cnZlcy0+Z3JhcGhbaV1bal1dOworICAgIH0KKworICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPj0gQVZfTE9HX1ZFUkJPU0UpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE5CX0NPTVA7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3RydWN0IGtleXBvaW50ICpwb2ludCA9IGNvbXBfcG9pbnRzW2ldOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIjJWQgcG9pbnRzOiIsIGkpOworICAgICAgICAgICAgd2hpbGUgKHBvaW50KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIgKCVmOyVmKSIsIHBvaW50LT54LCBwb2ludC0+eSk7CisgICAgICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjdXJ2ZXMtPnBsb3RfZmlsZW5hbWUpCisgICAgICAgIGR1bXBfY3VydmVzKGN1cnZlcy0+cGxvdF9maWxlbmFtZSwgY3VydmVzLT5ncmFwaCwgY29tcF9wb2ludHMsIGN1cnZlcy0+bHV0X3NpemUpOworCisgICAgZm9yIChpID0gMDsgaSA8IE5CX0NPTVAgKyAxOyBpKyspIHsKKyAgICAgICAgc3RydWN0IGtleXBvaW50ICpwb2ludCA9IGNvbXBfcG9pbnRzW2ldOworICAgICAgICB3aGlsZSAocG9pbnQpIHsKKyAgICAgICAgICAgIHN0cnVjdCBrZXlwb2ludCAqbmV4dCA9IHBvaW50LT5uZXh0OworICAgICAgICAgICAgYXZfZnJlZShwb2ludCk7CisgICAgICAgICAgICBwb2ludCA9IG5leHQ7CisgICAgICAgIH0KKyAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTQ5NiwxOSArNTk0LDM1IEBACiAgICAgY29uc3QgdWludDhfdCBhID0gY3VydmVzLT5yZ2JhX21hcFtBXTsKICAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaW4tPmhlaWdodCAqICBqb2JuciAgICkgLyBuYl9qb2JzOwogICAgIGNvbnN0IGludCBzbGljZV9lbmQgICA9IChpbi0+aGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7Ci0gICAgdWludDhfdCAgICAgICAqZHN0ID0gb3V0LT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBvdXQtPmxpbmVzaXplWzBdOwotICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9ICBpbi0+ZGF0YVswXSArIHNsaWNlX3N0YXJ0ICogIGluLT5saW5lc2l6ZVswXTsKIAotICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGluLT53aWR0aCAqIHN0ZXA7IHggKz0gc3RlcCkgewotICAgICAgICAgICAgZHN0W3ggKyByXSA9IGN1cnZlcy0+Z3JhcGhbUl1bc3JjW3ggKyByXV07Ci0gICAgICAgICAgICBkc3RbeCArIGddID0gY3VydmVzLT5ncmFwaFtHXVtzcmNbeCArIGddXTsKLSAgICAgICAgICAgIGRzdFt4ICsgYl0gPSBjdXJ2ZXMtPmdyYXBoW0JdW3NyY1t4ICsgYl1dOwotICAgICAgICAgICAgaWYgKCFkaXJlY3QgJiYgc3RlcCA9PSA0KQotICAgICAgICAgICAgICAgIGRzdFt4ICsgYV0gPSBzcmNbeCArIGFdOworICAgIGlmIChjdXJ2ZXMtPmlzXzE2Yml0KSB7CisgICAgICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICAgICAgICpkc3RwID0gKCAgICAgIHVpbnQxNl90ICopKG91dC0+ZGF0YVswXSArIHkgKiBvdXQtPmxpbmVzaXplWzBdKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNwID0gKGNvbnN0IHVpbnQxNl90ICopKGluIC0+ZGF0YVswXSArIHkgKiAgaW4tPmxpbmVzaXplWzBdKTsKKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGluLT53aWR0aCAqIHN0ZXA7IHggKz0gc3RlcCkgeworICAgICAgICAgICAgICAgIGRzdHBbeCArIHJdID0gY3VydmVzLT5ncmFwaFtSXVtzcmNwW3ggKyByXV07CisgICAgICAgICAgICAgICAgZHN0cFt4ICsgZ10gPSBjdXJ2ZXMtPmdyYXBoW0ddW3NyY3BbeCArIGddXTsKKyAgICAgICAgICAgICAgICBkc3RwW3ggKyBiXSA9IGN1cnZlcy0+Z3JhcGhbQl1bc3JjcFt4ICsgYl1dOworICAgICAgICAgICAgICAgIGlmICghZGlyZWN0ICYmIHN0ZXAgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgZHN0cFt4ICsgYV0gPSBzcmNwW3ggKyBhXTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBkc3QgKz0gb3V0LT5saW5lc2l6ZVswXTsKLSAgICAgICAgc3JjICs9IGluIC0+bGluZXNpemVbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCAgICAgICAqZHN0ID0gb3V0LT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBvdXQtPmxpbmVzaXplWzBdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPSAgaW4tPmRhdGFbMF0gKyBzbGljZV9zdGFydCAqICBpbi0+bGluZXNpemVbMF07CisKKyAgICAgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGluLT53aWR0aCAqIHN0ZXA7IHggKz0gc3RlcCkgeworICAgICAgICAgICAgICAgIGRzdFt4ICsgcl0gPSBjdXJ2ZXMtPmdyYXBoW1JdW3NyY1t4ICsgcl1dOworICAgICAgICAgICAgICAgIGRzdFt4ICsgZ10gPSBjdXJ2ZXMtPmdyYXBoW0ddW3NyY1t4ICsgZ11dOworICAgICAgICAgICAgICAgIGRzdFt4ICsgYl0gPSBjdXJ2ZXMtPmdyYXBoW0JdW3NyY1t4ICsgYl1dOworICAgICAgICAgICAgICAgIGlmICghZGlyZWN0ICYmIHN0ZXAgPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyBhXSA9IHNyY1t4ICsgYV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QgKz0gb3V0LT5saW5lc2l6ZVswXTsKKyAgICAgICAgICAgIHNyYyArPSBpbiAtPmxpbmVzaXplWzBdOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtNTMzLDcgKzY0Nyw3IEBACiAKICAgICB0ZC5pbiAgPSBpbjsKICAgICB0ZC5vdXQgPSBvdXQ7Ci0gICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihvdXRsaW5rLT5oLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihvdXRsaW5rLT5oLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOwogCiAgICAgaWYgKG91dCAhPSBpbikKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwpAQCAtNTQxLDYgKzY1NSwxNSBAQAogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKIH0KIAorc3RhdGljIGF2X2NvbGQgdm9pZCBjdXJ2ZXNfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIEN1cnZlc0NvbnRleHQgKmN1cnZlcyA9IGN0eC0+cHJpdjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQl9DT01QICsgMTsgaSsrKQorICAgICAgICBhdl9mcmVlcCgmY3VydmVzLT5ncmFwaFtpXSk7Cit9CisKIHN0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBjdXJ2ZXNfaW5wdXRzW10gPSB7CiAgICAgewogICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLApAQCAtNTYzLDcgKzY4Niw4IEBACiAgICAgLm5hbWUgICAgICAgICAgPSAiY3VydmVzIiwKICAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBZGp1c3QgY29tcG9uZW50cyBjdXJ2ZXMuIiksCiAgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoQ3VydmVzQ29udGV4dCksCi0gICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC5pbml0ICAgICAgICAgID0gY3VydmVzX2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSBjdXJ2ZXNfdW5pbml0LAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKICAgICAuaW5wdXRzICAgICAgICA9IGN1cnZlc19pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBjdXJ2ZXNfb3V0cHV0cywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2RhdGFzY29wZS5jIGIvbGliYXZmaWx0ZXIvdmZfZGF0YXNjb3BlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3NjYzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2RhdGFzY29wZS5jCkBAIC0wLDAgKzEsMTA1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94Z2FfZm9udF9kYXRhLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJkcmF3dXRpbHMuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBEYXRhc2NvcGVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgb3csIG9oOworICAgIGludCB4LCB5OworICAgIGludCBtb2RlOworICAgIGludCBheGlzOworICAgIGZsb2F0IG9wYWNpdHk7CisKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBuYl9jb21wczsKKyAgICBpbnQgY2hhcnM7CisgICAgRkZEcmF3Q29udGV4dCBkcmF3OworICAgIEZGRHJhd0NvbG9yIHllbGxvdzsKKyAgICBGRkRyYXdDb2xvciB3aGl0ZTsKKyAgICBGRkRyYXdDb2xvciBibGFjazsKKyAgICBGRkRyYXdDb2xvciBncmF5OworCisgICAgdm9pZCAoKnBpY2tfY29sb3IpKEZGRHJhd0NvbnRleHQgKmRyYXcsIEZGRHJhd0NvbG9yICpjb2xvciwgQVZGcmFtZSAqaW4sIGludCB4LCBpbnQgeSwgaW50ICp2YWx1ZSk7CisgICAgdm9pZCAoKnJldmVyc2VfY29sb3IpKEZGRHJhd0NvbnRleHQgKmRyYXcsIEZGRHJhd0NvbG9yICpjb2xvciwgRkZEcmF3Q29sb3IgKnJldmVyc2UpOworICAgIGludCAoKmZpbHRlcikoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icyk7Cit9IERhdGFzY29wZUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERhdGFzY29wZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gZGF0YXNjb3BlX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzaXplIiwgInNldCBvdXRwdXQgc2l6ZSIsIE9GRlNFVChvdyksICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHI9ImhkNzIwIn0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAicyIsICAgICJzZXQgb3V0cHV0IHNpemUiLCBPRkZTRVQob3cpLCAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyPSJoZDcyMCJ9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgIngiLCAgICAic2V0IHggb2Zmc2V0IiwgT0ZGU0VUKHgpLCAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInkiLCAgICAic2V0IHkgb2Zmc2V0IiwgT0ZGU0VUKHkpLCAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm1vZGUiLCAic2V0IHNjb3BlIG1vZGUiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDIsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICAgIm1vbm8iLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgICAiY29sb3IiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAgICJjb2xvcjIiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Mn0sIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJheGlzIiwgICAgImRyYXcgY29sdW1uL3JvdyBudW1iZXJzIiwgT0ZGU0VUKGF4aXMpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJvcGFjaXR5IiwgInNldCBiYWNrZ3JvdW5kIG9wYWNpdHkiLCBPRkZTRVQob3BhY2l0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjc1fSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGRhdGFzY29wZSk7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfZHJhd19zdXBwb3J0ZWRfcGl4ZWxfZm9ybWF0cygwKSk7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfdGV4dChGRkRyYXdDb250ZXh0ICpkcmF3LCBBVkZyYW1lICpmcmFtZSwgRkZEcmF3Q29sb3IgKmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgIGludCB4MCwgaW50IHkwLCBjb25zdCB1aW50OF90ICp0ZXh0LCBpbnQgdmVydGljYWwpCit7CisgICAgaW50IHggPSB4MDsKKworICAgIGZvciAoOyAqdGV4dDsgdGV4dCsrKSB7CisgICAgICAgIGlmICgqdGV4dCA9PSAnXG4nKSB7CisgICAgICAgICAgICB4ID0geDA7CisgICAgICAgICAgICB5MCArPSA4OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZmZfYmxlbmRfbWFzayhkcmF3LCBjb2xvciwgZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X2NnYV9mb250ICsgKnRleHQgKiA4LCAxLCA4LCA4LCAwLCAwLCB4LCB5MCk7CisgICAgICAgIGlmICh2ZXJ0aWNhbCkgeworICAgICAgICAgICAgeCA9IHgwOworICAgICAgICAgICAgeTAgKz0gODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHggKz0gODsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcGlja19jb2xvcjgoRkZEcmF3Q29udGV4dCAqZHJhdywgRkZEcmF3Q29sb3IgKmNvbG9yLCBBVkZyYW1lICppbiwgaW50IHgsIGludCB5LCBpbnQgKnZhbHVlKQoreworICAgIGludCBwLCBpOworCisgICAgY29sb3ItPnJnYmFbM10gPSAyNTU7CisgICAgZm9yIChwID0gMDsgcCA8IGRyYXctPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIGlmIChkcmF3LT5uYl9wbGFuZXMgPT0gMSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgICAgIHZhbHVlW2ldID0gaW4tPmRhdGFbMF1beSAqIGluLT5saW5lc2l6ZVswXSArIHggKiBkcmF3LT5waXhlbHN0ZXBbMF0gKyBpXTsKKyAgICAgICAgICAgICAgICBjb2xvci0+Y29tcFswXS51OFtpXSA9IHZhbHVlW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsdWVbcF0gPSBpbi0+ZGF0YVtwXVsoeSA+PiBkcmF3LT52c3ViW3BdKSAqIGluLT5saW5lc2l6ZVtwXSArICh4ID4+IGRyYXctPmhzdWJbcF0pXTsKKyAgICAgICAgICAgIGNvbG9yLT5jb21wW3BdLnU4WzBdID0gdmFsdWVbcF07CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBpY2tfY29sb3IxNihGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsIEFWRnJhbWUgKmluLCBpbnQgeCwgaW50IHksIGludCAqdmFsdWUpCit7CisgICAgaW50IHAsIGk7CisKKyAgICBjb2xvci0+cmdiYVszXSA9IDI1NTsKKyAgICBmb3IgKHAgPSAwOyBwIDwgZHJhdy0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgaWYgKGRyYXctPm5iX3BsYW5lcyA9PSAxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdmFsdWVbaV0gPSBBVl9STDE2KGluLT5kYXRhWzBdICsgeSAqIGluLT5saW5lc2l6ZVswXSArIHggKiBkcmF3LT5waXhlbHN0ZXBbMF0gKyBpICogMik7CisgICAgICAgICAgICAgICAgY29sb3ItPmNvbXBbMF0udTE2W2ldID0gdmFsdWVbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZVtwXSA9IEFWX1JMMTYoaW4tPmRhdGFbcF0gKyAoeSA+PiBkcmF3LT52c3ViW3BdKSAqIGluLT5saW5lc2l6ZVtwXSArICh4ID4+IGRyYXctPmhzdWJbcF0pICogMik7CisgICAgICAgICAgICBjb2xvci0+Y29tcFtwXS51MTZbMF0gPSB2YWx1ZVtwXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgcmV2ZXJzZV9jb2xvcjgoRkZEcmF3Q29udGV4dCAqZHJhdywgRkZEcmF3Q29sb3IgKmNvbG9yLCBGRkRyYXdDb2xvciAqcmV2ZXJzZSkKK3sKKyAgICBpbnQgcDsKKworICAgIHJldmVyc2UtPnJnYmFbM10gPSAyNTU7CisgICAgZm9yIChwID0gMDsgcCA8IGRyYXctPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIHJldmVyc2UtPmNvbXBbcF0udThbMF0gPSBjb2xvci0+Y29tcFtwXS51OFswXSA+IDEyNyA/IDAgOiAyNTU7CisgICAgICAgIHJldmVyc2UtPmNvbXBbcF0udThbMV0gPSBjb2xvci0+Y29tcFtwXS51OFsxXSA+IDEyNyA/IDAgOiAyNTU7CisgICAgICAgIHJldmVyc2UtPmNvbXBbcF0udThbMl0gPSBjb2xvci0+Y29tcFtwXS51OFsyXSA+IDEyNyA/IDAgOiAyNTU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZXZlcnNlX2NvbG9yMTYoRkZEcmF3Q29udGV4dCAqZHJhdywgRkZEcmF3Q29sb3IgKmNvbG9yLCBGRkRyYXdDb2xvciAqcmV2ZXJzZSkKK3sKKyAgICBpbnQgcDsKKworICAgIHJldmVyc2UtPnJnYmFbM10gPSAyNTU7CisgICAgZm9yIChwID0gMDsgcCA8IGRyYXctPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG1heCA9ICgxIDw8IGRyYXctPmRlc2MtPmNvbXBbcF0uZGVwdGgpIC0gMTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgbWlkID0gKG1heCArIDEpIC8gMjsKKworICAgICAgICByZXZlcnNlLT5jb21wW3BdLnUxNlswXSA9IGNvbG9yLT5jb21wW3BdLnUxNlswXSA+IG1pZCA/IDAgOiBtYXg7CisgICAgICAgIHJldmVyc2UtPmNvbXBbcF0udTE2WzFdID0gY29sb3ItPmNvbXBbcF0udTE2WzFdID4gbWlkID8gMCA6IG1heDsKKyAgICAgICAgcmV2ZXJzZS0+Y29tcFtwXS51MTZbMl0gPSBjb2xvci0+Y29tcFtwXS51MTZbMl0gPiBtaWQgPyAwIDogbWF4OworICAgIH0KK30KKwordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgQVZGcmFtZSAqaW4sICpvdXQ7CisgICAgaW50IHhvZmYsIHlvZmY7Cit9IFRocmVhZERhdGE7CisKK3N0YXRpYyBpbnQgZmlsdGVyX2NvbG9yMihBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIERhdGFzY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgeG9mZiA9IHRkLT54b2ZmOworICAgIGNvbnN0IGludCB5b2ZmID0gdGQtPnlvZmY7CisgICAgY29uc3QgaW50IFAgPSBGRk1BWChzLT5uYl9wbGFuZXMsIHMtPm5iX2NvbXBzKTsKKyAgICBjb25zdCBpbnQgQyA9IHMtPmNoYXJzOworICAgIGNvbnN0IGludCBXID0gKG91dGxpbmstPncgLSB4b2ZmKSAvIChDICogMTApOworICAgIGNvbnN0IGludCBIID0gKG91dGxpbmstPmggLSB5b2ZmKSAvIChQICogMTIpOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdFsyXSA9IHsiJTAyWFxuIiwgIiUwNFhcbiJ9OworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChXICogam9ibnIpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kID0gKFcgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBpbnQgeCwgeSwgcDsKKworICAgIGZvciAoeSA9IDA7IHkgPCBIICYmICh5ICsgcy0+eSA8IGlubGluay0+aCk7IHkrKykgeworICAgICAgICBmb3IgKHggPSBzbGljZV9zdGFydDsgeCA8IHNsaWNlX2VuZCAmJiAoeCArIHMtPnggPCBpbmxpbmstPncpOyB4KyspIHsKKyAgICAgICAgICAgIEZGRHJhd0NvbG9yIGNvbG9yID0geyB7IDAgfSB9OworICAgICAgICAgICAgRkZEcmF3Q29sb3IgcmV2ZXJzZSA9IHsgeyAwIH0gfTsKKyAgICAgICAgICAgIGludCB2YWx1ZVs0XSA9IHsgMCB9OworCisgICAgICAgICAgICBzLT5waWNrX2NvbG9yKCZzLT5kcmF3LCAmY29sb3IsIGluLCB4ICsgcy0+eCwgeSArIHMtPnksIHZhbHVlKTsKKyAgICAgICAgICAgIHMtPnJldmVyc2VfY29sb3IoJnMtPmRyYXcsICZjb2xvciwgJnJldmVyc2UpOworICAgICAgICAgICAgZmZfZmlsbF9yZWN0YW5nbGUoJnMtPmRyYXcsICZjb2xvciwgb3V0LT5kYXRhLCBvdXQtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG9mZiArIHggKiBDICogMTAsIHlvZmYgKyB5ICogUCAqIDEyLCBDICogMTAsIFAgKiAxMik7CisKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBQOyBwKyspIHsKKyAgICAgICAgICAgICAgICBjaGFyIHRleHRbMjU2XTsKKworICAgICAgICAgICAgICAgIHNucHJpbnRmKHRleHQsIHNpemVvZih0ZXh0KSwgZm9ybWF0W0M+PjJdLCB2YWx1ZVtwXSk7CisgICAgICAgICAgICAgICAgZHJhd190ZXh0KCZzLT5kcmF3LCBvdXQsICZyZXZlcnNlLCB4b2ZmICsgeCAqIEMgKiAxMCArIDIsIHlvZmYgKyB5ICogUCAqIDEyICsgcCAqIDEwICsgMiwgdGV4dCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfY29sb3IoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBEYXRhc2NvcGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIEFWRnJhbWUgKmluID0gdGQtPmluOworICAgIEFWRnJhbWUgKm91dCA9IHRkLT5vdXQ7CisgICAgY29uc3QgaW50IHhvZmYgPSB0ZC0+eG9mZjsKKyAgICBjb25zdCBpbnQgeW9mZiA9IHRkLT55b2ZmOworICAgIGNvbnN0IGludCBQID0gRkZNQVgocy0+bmJfcGxhbmVzLCBzLT5uYl9jb21wcyk7CisgICAgY29uc3QgaW50IEMgPSBzLT5jaGFyczsKKyAgICBjb25zdCBpbnQgVyA9IChvdXRsaW5rLT53IC0geG9mZikgLyAoQyAqIDEwKTsKKyAgICBjb25zdCBpbnQgSCA9IChvdXRsaW5rLT5oIC0geW9mZikgLyAoUCAqIDEyKTsKKyAgICBjb25zdCBjaGFyICpmb3JtYXRbMl0gPSB7IiUwMlhcbiIsICIlMDRYXG4ifTsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoVyAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChXICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHgsIHksIHA7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgSCAmJiAoeSArIHMtPnkgPCBpbmxpbmstPmgpOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gc2xpY2Vfc3RhcnQ7IHggPCBzbGljZV9lbmQgJiYgKHggKyBzLT54IDwgaW5saW5rLT53KTsgeCsrKSB7CisgICAgICAgICAgICBGRkRyYXdDb2xvciBjb2xvciA9IHsgeyAwIH0gfTsKKyAgICAgICAgICAgIGludCB2YWx1ZVs0XSA9IHsgMCB9OworCisgICAgICAgICAgICBzLT5waWNrX2NvbG9yKCZzLT5kcmF3LCAmY29sb3IsIGluLCB4ICsgcy0+eCwgeSArIHMtPnksIHZhbHVlKTsKKworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IFA7IHArKykgeworICAgICAgICAgICAgICAgIGNoYXIgdGV4dFsyNTZdOworCisgICAgICAgICAgICAgICAgc25wcmludGYodGV4dCwgc2l6ZW9mKHRleHQpLCBmb3JtYXRbQz4+Ml0sIHZhbHVlW3BdKTsKKyAgICAgICAgICAgICAgICBkcmF3X3RleHQoJnMtPmRyYXcsIG91dCwgJmNvbG9yLCB4b2ZmICsgeCAqIEMgKiAxMCArIDIsIHlvZmYgKyB5ICogUCAqIDEyICsgcCAqIDEwICsgMiwgdGV4dCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfbW9ubyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIERhdGFzY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgeG9mZiA9IHRkLT54b2ZmOworICAgIGNvbnN0IGludCB5b2ZmID0gdGQtPnlvZmY7CisgICAgY29uc3QgaW50IFAgPSBGRk1BWChzLT5uYl9wbGFuZXMsIHMtPm5iX2NvbXBzKTsKKyAgICBjb25zdCBpbnQgQyA9IHMtPmNoYXJzOworICAgIGNvbnN0IGludCBXID0gKG91dGxpbmstPncgLSB4b2ZmKSAvIChDICogMTApOworICAgIGNvbnN0IGludCBIID0gKG91dGxpbmstPmggLSB5b2ZmKSAvIChQICogMTIpOworICAgIGNvbnN0IGNoYXIgKmZvcm1hdFsyXSA9IHsiJTAyWFxuIiwgIiUwNFhcbiJ9OworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChXICogam9ibnIpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kID0gKFcgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBpbnQgeCwgeSwgcDsKKworICAgIGZvciAoeSA9IDA7IHkgPCBIICYmICh5ICsgcy0+eSA8IGlubGluay0+aCk7IHkrKykgeworICAgICAgICBmb3IgKHggPSBzbGljZV9zdGFydDsgeCA8IHNsaWNlX2VuZCAmJiAoeCArIHMtPnggPCBpbmxpbmstPncpOyB4KyspIHsKKyAgICAgICAgICAgIEZGRHJhd0NvbG9yIGNvbG9yID0geyB7IDAgfSB9OworICAgICAgICAgICAgaW50IHZhbHVlWzRdID0geyAwIH07CisKKyAgICAgICAgICAgIHMtPnBpY2tfY29sb3IoJnMtPmRyYXcsICZjb2xvciwgaW4sIHggKyBzLT54LCB5ICsgcy0+eSwgdmFsdWUpOworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IFA7IHArKykgeworICAgICAgICAgICAgICAgIGNoYXIgdGV4dFsyNTZdOworCisgICAgICAgICAgICAgICAgc25wcmludGYodGV4dCwgc2l6ZW9mKHRleHQpLCBmb3JtYXRbQz4+Ml0sIHZhbHVlW3BdKTsKKyAgICAgICAgICAgICAgICBkcmF3X3RleHQoJnMtPmRyYXcsIG91dCwgJnMtPndoaXRlLCB4b2ZmICsgeCAqIEMgKiAxMCArIDIsIHlvZmYgKyB5ICogUCAqIDEyICsgcCAqIDEwICsgMiwgdGV4dCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OworICAgIERhdGFzY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIFRocmVhZERhdGEgdGQgPSB7IDAgfTsKKyAgICBpbnQgeW1heGxlbiA9IDA7CisgICAgaW50IHhtYXhsZW4gPSAwOworICAgIEFWRnJhbWUgKm91dDsKKworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBvdXQtPnB0cyA9IGluLT5wdHM7CisKKyAgICBmZl9maWxsX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmJsYWNrLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisKKyAgICBpZiAocy0+YXhpcykgeworICAgICAgICBjb25zdCBpbnQgUCA9IEZGTUFYKHMtPm5iX3BsYW5lcywgcy0+bmJfY29tcHMpOworICAgICAgICBjb25zdCBpbnQgQyA9IHMtPmNoYXJzOworICAgICAgICBpbnQgWSA9IG91dGxpbmstPmggLyAoUCAqIDEyKTsKKyAgICAgICAgaW50IFggPSBvdXRsaW5rLT53IC8gKEMgKiAxMCk7CisgICAgICAgIGNoYXIgdGV4dFsyNTZdID0geyAwIH07CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIHNucHJpbnRmKHRleHQsIHNpemVvZih0ZXh0KSwgIiVkIiwgcy0+eSArIFkpOworICAgICAgICB5bWF4bGVuID0gc3RybGVuKHRleHQpOworICAgICAgICB5bWF4bGVuICo9IDEwOworICAgICAgICBzbnByaW50Zih0ZXh0LCBzaXplb2YodGV4dCksICIlZCIsIHMtPnggKyBYKTsKKyAgICAgICAgeG1heGxlbiA9IHN0cmxlbih0ZXh0KTsKKyAgICAgICAgeG1heGxlbiAqPSAxMDsKKworICAgICAgICBZID0gKG91dGxpbmstPmggLSB4bWF4bGVuKSAvIChQICogMTIpOworICAgICAgICBYID0gKG91dGxpbmstPncgLSB5bWF4bGVuKSAvIChDICogMTApOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBZOyB5KyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHRleHQsIHNpemVvZih0ZXh0KSwgIiVkIiwgcy0+eSArIHkpOworCisgICAgICAgICAgICBmZl9maWxsX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmdyYXksIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHhtYXhsZW4gKyB5ICogUCAqIDEyICsgKFAgKyAxKSAqIFAgLSAyLCB5bWF4bGVuLCAxMCk7CisKKyAgICAgICAgICAgIGRyYXdfdGV4dCgmcy0+ZHJhdywgb3V0LCAmcy0+eWVsbG93LCAyLCB4bWF4bGVuICsgeSAqIFAgKiAxMiArIChQICsgMSkgKiBQLCB0ZXh0LCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBYOyB4KyspIHsKKyAgICAgICAgICAgIHNucHJpbnRmKHRleHQsIHNpemVvZih0ZXh0KSwgIiVkIiwgcy0+eCArIHgpOworCisgICAgICAgICAgICBmZl9maWxsX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmdyYXksIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXhsZW4gKyB4ICogQyAqIDEwICsgMiAqIEMgLSAyLCAwLCAxMCwgeG1heGxlbik7CisKKyAgICAgICAgICAgIGRyYXdfdGV4dCgmcy0+ZHJhdywgb3V0LCAmcy0+eWVsbG93LCB5bWF4bGVuICsgeCAqIEMgKiAxMCArIDIgKiBDLCAyLCB0ZXh0LCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRkLmluID0gaW47IHRkLm91dCA9IG91dCwgdGQueW9mZiA9IHhtYXhsZW4sIHRkLnhvZmYgPSB5bWF4bGVuOworICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBzLT5maWx0ZXIsICZ0ZCwgTlVMTCwgRkZNSU4oZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCksIEZGTUFYKG91dGxpbmstPncgLyAyMCwgMSkpKTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIERhdGFzY29wZUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICB1aW50OF90IGFscGhhID0gcy0+b3BhY2l0eSAqIDI1NTsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKyAgICBmZl9kcmF3X2luaXQoJnMtPmRyYXcsIGlubGluay0+Zm9ybWF0LCAwKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZzLT5kcmF3LCAmcy0+d2hpdGUsICAodWludDhfdFtdKXsgMjU1LCAyNTUsIDI1NSwgMjU1fSApOworICAgIGZmX2RyYXdfY29sb3IoJnMtPmRyYXcsICZzLT5ibGFjaywgICh1aW50OF90W10peyAwLCAwLCAwLCBhbHBoYX0gKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZzLT5kcmF3LCAmcy0+eWVsbG93LCAodWludDhfdFtdKXsgMjU1LCAyNTUsIDAsIDI1NX0gKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZzLT5kcmF3LCAmcy0+Z3JheSwgICAodWludDhfdFtdKXsgNzcsIDc3LCA3NywgMjU1fSApOworICAgIHMtPmNoYXJzID0gKHMtPmRyYXcuZGVzYy0+Y29tcFswXS5kZXB0aCArIDcpIC8gOCAqIDI7CisgICAgcy0+bmJfY29tcHMgPSBzLT5kcmF3LmRlc2MtPm5iX2NvbXBvbmVudHM7CisKKyAgICBzd2l0Y2ggKHMtPm1vZGUpIHsKKyAgICBjYXNlIDA6IHMtPmZpbHRlciA9IGZpbHRlcl9tb25vOyAgIGJyZWFrOworICAgIGNhc2UgMTogcy0+ZmlsdGVyID0gZmlsdGVyX2NvbG9yOyAgYnJlYWs7CisgICAgY2FzZSAyOiBzLT5maWx0ZXIgPSBmaWx0ZXJfY29sb3IyOyBicmVhazsKKyAgICB9CisKKyAgICBpZiAocy0+ZHJhdy5kZXNjLT5jb21wWzBdLmRlcHRoIDw9IDgpIHsKKyAgICAgICAgcy0+cGlja19jb2xvciA9IHBpY2tfY29sb3I4OworICAgICAgICBzLT5yZXZlcnNlX2NvbG9yID0gcmV2ZXJzZV9jb2xvcjg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+cGlja19jb2xvciA9IHBpY2tfY29sb3IxNjsKKyAgICAgICAgcy0+cmV2ZXJzZV9jb2xvciA9IHJldmVyc2VfY29sb3IxNjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBEYXRhc2NvcGVDb250ZXh0ICpzID0gb3V0bGluay0+c3JjLT5wcml2OworCisgICAgb3V0bGluay0+aCA9IHMtPm9oOworICAgIG91dGxpbmstPncgPSBzLT5vdzsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpezEsMX07CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZGF0YXNjb3BlID0geworICAgIC5uYW1lICAgICAgICAgID0gImRhdGFzY29wZSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVmlkZW8gZGF0YSBhbmFseXNpcy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihEYXRhc2NvcGVDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZkYXRhc2NvcGVfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKK307CisKK3R5cGVkZWYgc3RydWN0IFBpeHNjb3BlQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBmbG9hdCB4cG9zLCB5cG9zOworICAgIGZsb2F0IHd4LCB3eTsKKyAgICBpbnQgdywgaDsKKyAgICBmbG9hdCBvOworCisgICAgaW50IHgsIHk7CisgICAgaW50IHd3LCB3aDsKKworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IG5iX2NvbXBzOworICAgIGludCBpc19yZ2I7CisgICAgdWludDhfdCByZ2JhX21hcFs0XTsKKyAgICBGRkRyYXdDb250ZXh0IGRyYXc7CisgICAgRkZEcmF3Q29sb3IgICBkYXJrOworICAgIEZGRHJhd0NvbG9yICAgYmxhY2s7CisgICAgRkZEcmF3Q29sb3IgICB3aGl0ZTsKKyAgICBGRkRyYXdDb2xvciAgIGdyZWVuOworICAgIEZGRHJhd0NvbG9yICAgYmx1ZTsKKyAgICBGRkRyYXdDb2xvciAgIHJlZDsKKyAgICBGRkRyYXdDb2xvciAgKmNvbG9yc1s0XTsKKworICAgIHZvaWQgKCpwaWNrX2NvbG9yKShGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsIEFWRnJhbWUgKmluLCBpbnQgeCwgaW50IHksIGludCAqdmFsdWUpOworfSBQaXhzY29wZUNvbnRleHQ7CisKKyNkZWZpbmUgUE9GRlNFVCh4KSBvZmZzZXRvZihQaXhzY29wZUNvbnRleHQsIHgpCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBwaXhzY29wZV9vcHRpb25zW10gPSB7CisgICAgeyAieCIsICAic2V0IHNjb3BlIHggb2Zmc2V0IiwgIFBPRkZTRVQoeHBvcyksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjV9LCAwLCAgMSwgRkxBR1MgfSwKKyAgICB7ICJ5IiwgICJzZXQgc2NvcGUgeSBvZmZzZXQiLCAgUE9GRlNFVCh5cG9zKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuNX0sIDAsICAxLCBGTEFHUyB9LAorICAgIHsgInciLCAgInNldCBzY29wZSB3aWR0aCIsICAgICBQT0ZGU0VUKHcpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgey5pNjQ9N30sICAgMSwgODAsIEZMQUdTIH0sCisgICAgeyAiaCIsICAic2V0IHNjb3BlIGhlaWdodCIsICAgIFBPRkZTRVQoaCksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND03fSwgICAxLCA4MCwgRkxBR1MgfSwKKyAgICB7ICJvIiwgICJzZXQgd2luZG93IG9wYWNpdHkiLCAgUE9GRlNFVChvKSwgICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuNX0sIDAsICAxLCBGTEFHUyB9LAorICAgIHsgInd4IiwgInNldCB3aW5kb3cgeCBvZmZzZXQiLCBQT0ZGU0VUKHd4KSwgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9LTF9LCAtMSwgIDEsIEZMQUdTIH0sCisgICAgeyAid3kiLCAic2V0IHdpbmRvdyB5IG9mZnNldCIsIFBPRkZTRVQod3kpLCAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0tMX0sIC0xLCAgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHBpeHNjb3BlKTsKKworc3RhdGljIGludCBwaXhzY29wZV9jb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgUGl4c2NvcGVDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisKKyAgICBzLT5uYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhpbmxpbmstPmZvcm1hdCk7CisgICAgZmZfZHJhd19pbml0KCZzLT5kcmF3LCBpbmxpbmstPmZvcm1hdCwgMCk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPmRhcmssICAodWludDhfdFtdKXsgMCwgMCwgMCwgcy0+byAqIDI1NX0gKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZzLT5kcmF3LCAmcy0+YmxhY2ssICh1aW50OF90W10peyAwLCAwLCAwLCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPndoaXRlLCAodWludDhfdFtdKXsgMjU1LCAyNTUsIDI1NSwgMjU1fSApOworICAgIGZmX2RyYXdfY29sb3IoJnMtPmRyYXcsICZzLT5ncmVlbiwgKHVpbnQ4X3RbXSl7ICAgMCwgMjU1LCAgIDAsIDI1NX0gKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZzLT5kcmF3LCAmcy0+Ymx1ZSwgICh1aW50OF90W10peyAgIDAsICAgMCwgMjU1LCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPnJlZCwgICAodWludDhfdFtdKXsgMjU1LCAgIDAsICAgMCwgMjU1fSApOworICAgIHMtPm5iX2NvbXBzID0gcy0+ZHJhdy5kZXNjLT5uYl9jb21wb25lbnRzOworICAgIHMtPmlzX3JnYiAgID0gcy0+ZHJhdy5kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0I7CisKKyAgICBpZiAocy0+aXNfcmdiKSB7CisgICAgICAgIHMtPmNvbG9yc1swXSA9ICZzLT5yZWQ7CisgICAgICAgIHMtPmNvbG9yc1sxXSA9ICZzLT5ncmVlbjsKKyAgICAgICAgcy0+Y29sb3JzWzJdID0gJnMtPmJsdWU7CisgICAgICAgIHMtPmNvbG9yc1szXSA9ICZzLT53aGl0ZTsKKyAgICAgICAgZmZfZmlsbF9yZ2JhX21hcChzLT5yZ2JhX21hcCwgaW5saW5rLT5mb3JtYXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmNvbG9yc1swXSA9ICZzLT53aGl0ZTsKKyAgICAgICAgcy0+Y29sb3JzWzFdID0gJnMtPmJsdWU7CisgICAgICAgIHMtPmNvbG9yc1syXSA9ICZzLT5yZWQ7CisgICAgICAgIHMtPmNvbG9yc1szXSA9ICZzLT53aGl0ZTsKKyAgICAgICAgcy0+cmdiYV9tYXBbMF0gPSAwOworICAgICAgICBzLT5yZ2JhX21hcFsxXSA9IDE7CisgICAgICAgIHMtPnJnYmFfbWFwWzJdID0gMjsKKyAgICAgICAgcy0+cmdiYV9tYXBbM10gPSAzOworICAgIH0KKworICAgIGlmIChzLT5kcmF3LmRlc2MtPmNvbXBbMF0uZGVwdGggPD0gOCkgeworICAgICAgICBzLT5waWNrX2NvbG9yID0gcGlja19jb2xvcjg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+cGlja19jb2xvciA9IHBpY2tfY29sb3IxNjsKKyAgICB9CisKKyAgICBpZiAoaW5saW5rLT53IDwgNjQwIHx8IGlubGluay0+aCA8IDQ4MCkgeworICAgICAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19FUlJPUiwgIm1pbiBzdXBwb3J0ZWQgcmVzb2x1dGlvbiBpcyA2NDB4NDgwXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT53dyA9IDMwMDsKKyAgICBzLT53aCA9IDMwMCAqIDEuNjE4MDsKKyAgICBzLT54ID0gcy0+eHBvcyAqIChpbmxpbmstPncgLSAxKTsKKyAgICBzLT55ID0gcy0+eXBvcyAqIChpbmxpbmstPmggLSAxKTsKKyAgICBpZiAocy0+eCArIHMtPncgPj0gaW5saW5rLT53IHx8IHMtPnkgKyBzLT5oID49IGlubGluay0+aCkgeworICAgICAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19XQVJOSU5HLCAic2NvcGUgcG9zaXRpb24gaXMgb3V0IG9mIHJhbmdlLCBjbGlwcGluZ1xuIik7CisgICAgICAgIHMtPnggPSBGRk1JTihzLT54LCBpbmxpbmstPncgLSBzLT53KTsKKyAgICAgICAgcy0+eSA9IEZGTUlOKHMtPnksIGlubGluay0+aCAtIHMtPmgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBpeHNjb3BlX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gaW5saW5rLT5kc3Q7CisgICAgUGl4c2NvcGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIGluLT53aWR0aCwgaW4tPmhlaWdodCk7CisgICAgaW50IG1heFs0XSA9IHsgMCB9LCBtaW5bNF0gPSB7IElOVF9NQVgsIElOVF9NQVgsIElOVF9NQVgsIElOVF9NQVggfTsKKyAgICBmbG9hdCBhdmVyYWdlWzRdID0geyAwIH07CisgICAgZG91YmxlIHJtc1s0XSA9IHsgMCB9OworICAgIGNvbnN0IGNoYXIgcmdiYVs0XSA9IHsgJ1InLCAnRycsICdCJywgJ0EnIH07CisgICAgY29uc3QgY2hhciB5dXZhWzRdID0geyAnWScsICdVJywgJ1YnLCAnQScgfTsKKyAgICBpbnQgeCwgeSwgWCwgWSwgaSwgdywgaDsKKyAgICBjaGFyIHRleHRbMTI4XTsKKworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBhdl9mcmFtZV9jb3B5KG91dCwgaW4pOworCisgICAgdyA9IHMtPnd3IC8gcy0+dzsKKyAgICBoID0gcy0+d3cgLyBzLT5oOworCisgICAgaWYgKHMtPnd4ID49IDApIHsKKyAgICAgICAgWCA9IChpbi0+d2lkdGggLSBzLT53dykgKiBzLT53eDsKKyAgICB9IGVsc2UgeworICAgICAgICBYID0gKGluLT53aWR0aCAtIHMtPnd3KSAqIC1zLT53eDsKKyAgICB9CisgICAgaWYgKHMtPnd5ID49IDApIHsKKyAgICAgICAgWSA9IChpbi0+aGVpZ2h0IC0gcy0+d2gpICogcy0+d3k7CisgICAgfSBlbHNlIHsKKyAgICAgICAgWSA9IChpbi0+aGVpZ2h0IC0gcy0+d2gpICogLXMtPnd5OworICAgIH0KKworICAgIGlmIChzLT53eCA8IDApIHsKKyAgICAgICAgaWYgKHMtPnggKyBzLT53ID49IFggJiYgKHMtPnggKyBzLT53IDw9IFggKyBzLT53dykgJiYKKyAgICAgICAgICAgIHMtPnkgKyBzLT5oID49IFkgJiYgKHMtPnkgKyBzLT5oIDw9IFkgKyBzLT53aCkpIHsKKyAgICAgICAgICAgIFggPSAoaW4tPndpZHRoIC0gcy0+d3cpICogKDEgKyBzLT53eCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocy0+d3kgPCAwKSB7CisgICAgICAgIGlmIChzLT54ICsgcy0+dyA+PSBYICYmIChzLT54ICsgcy0+dyA8PSBYICsgcy0+d3cpICYmCisgICAgICAgICAgICBzLT55ICsgcy0+aCA+PSBZICYmIChzLT55ICsgcy0+aCA8PSBZICsgcy0+d2gpKSB7CisgICAgICAgICAgICBZID0gKGluLT5oZWlnaHQgLSBzLT53aCkgKiAoMSArIHMtPnd5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX2JsZW5kX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmRhcmssIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgb3V0LT53aWR0aCwgb3V0LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIFgsCisgICAgICAgICAgICAgICAgICAgICAgIFksCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnd3LAorICAgICAgICAgICAgICAgICAgICAgICBzLT53aCk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+aDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT53OyB4KyspIHsKKyAgICAgICAgICAgIEZGRHJhd0NvbG9yIGNvbG9yID0geyB7IDAgfSB9OworICAgICAgICAgICAgaW50IHZhbHVlWzRdID0geyAwIH07CisKKyAgICAgICAgICAgIHMtPnBpY2tfY29sb3IoJnMtPmRyYXcsICZjb2xvciwgaW4sIHggKyBzLT54LCB5ICsgcy0+eSwgdmFsdWUpOworICAgICAgICAgICAgZmZfZmlsbF9yZWN0YW5nbGUoJnMtPmRyYXcsICZjb2xvciwgb3V0LT5kYXRhLCBvdXQtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAqIHcgKyAocy0+d3cgLSA0IC0gKHMtPncgKiB3KSkgLyAyICsgWCwgeSAqIGggKyAyICsgWSwgdywgaCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcm1zW2ldICAgICArPSAoZG91YmxlKXZhbHVlW2ldICogKGRvdWJsZSl2YWx1ZVtpXTsKKyAgICAgICAgICAgICAgICBhdmVyYWdlW2ldICs9IHZhbHVlW2ldOworICAgICAgICAgICAgICAgIG1pbltpXSAgICAgID0gRkZNSU4obWluW2ldLCB2YWx1ZVtpXSk7CisgICAgICAgICAgICAgICAgbWF4W2ldICAgICAgPSBGRk1BWChtYXhbaV0sIHZhbHVlW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZmX2JsZW5kX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmJsYWNrLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIG91dC0+d2lkdGgsIG91dC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBzLT54IC0gMiwgcy0+eSAtIDIsIHMtPncgKyA0LCAxKTsKKworICAgIGZmX2JsZW5kX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPndoaXRlLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIG91dC0+d2lkdGgsIG91dC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBzLT54IC0gMSwgcy0+eSAtIDEsIHMtPncgKyAyLCAxKTsKKworICAgIGZmX2JsZW5kX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPndoaXRlLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIG91dC0+d2lkdGgsIG91dC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBzLT54IC0gMSwgcy0+eSAtIDEsIDEsIHMtPmggKyAyKTsKKworICAgIGZmX2JsZW5kX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmJsYWNrLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIG91dC0+d2lkdGgsIG91dC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBzLT54IC0gMiwgcy0+eSAtIDIsIDEsIHMtPmggKyA0KTsKKworICAgIGZmX2JsZW5kX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPndoaXRlLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIG91dC0+d2lkdGgsIG91dC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBzLT54IC0gMSwgcy0+eSArIDEgKyBzLT5oLCBzLT53ICsgMywgMSk7CisKKyAgICBmZl9ibGVuZF9yZWN0YW5nbGUoJnMtPmRyYXcsICZzLT5ibGFjaywgb3V0LT5kYXRhLCBvdXQtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBvdXQtPndpZHRoLCBvdXQtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+eCAtIDIsIHMtPnkgKyAyICsgcy0+aCwgcy0+dyArIDQsIDEpOworCisgICAgZmZfYmxlbmRfcmVjdGFuZ2xlKCZzLT5kcmF3LCAmcy0+d2hpdGUsIG91dC0+ZGF0YSwgb3V0LT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgb3V0LT53aWR0aCwgb3V0LT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnggKyAxICsgcy0+dywgcy0+eSAtIDEsIDEsIHMtPmggKyAyKTsKKworICAgIGZmX2JsZW5kX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmJsYWNrLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIG91dC0+d2lkdGgsIG91dC0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBzLT54ICsgMiArIHMtPncsIHMtPnkgLSAyLCAxLCBzLT5oICsgNSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHJtc1tpXSAvPSBzLT53ICogcy0+aDsKKyAgICAgICAgcm1zW2ldICA9IHNxcnQocm1zW2ldKTsKKyAgICAgICAgYXZlcmFnZVtpXSAvPSBzLT53ICogcy0+aDsKKyAgICB9CisKKyAgICBzbnByaW50Zih0ZXh0LCBzaXplb2YodGV4dCksICJDSCAgIEFWRyAgICBNSU4gICAgTUFYICAgIFJNU1xuIik7CisgICAgZHJhd190ZXh0KCZzLT5kcmF3LCBvdXQsICZzLT53aGl0ZSwgICAgICAgIFggKyAyOCwgWSArIHMtPnd3ICsgMjAsICAgICAgICAgICB0ZXh0LCAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY29tcHM7IGkrKykgeworICAgICAgICBpbnQgYyA9IHMtPnJnYmFfbWFwW2ldOworCisgICAgICAgIHNucHJpbnRmKHRleHQsIHNpemVvZih0ZXh0KSwgIiVjICAlMDcuMWYgJTA1ZCAlMDVkICUwNy4xZlxuIiwgcy0+aXNfcmdiID8gcmdiYVtpXSA6IHl1dmFbaV0sIGF2ZXJhZ2VbY10sIG1pbltjXSwgbWF4W2NdLCBybXNbY10pOworICAgICAgICBkcmF3X3RleHQoJnMtPmRyYXcsIG91dCwgcy0+Y29sb3JzW2ldLCBYICsgMjgsIFkgKyBzLT53dyArIDIwICogKGkgKyAyKSwgdGV4dCwgMCk7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHBpeHNjb3BlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IHBpeHNjb3BlX2ZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgID0gcGl4c2NvcGVfY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBwaXhzY29wZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3BpeHNjb3BlID0geworICAgIC5uYW1lICAgICAgICAgID0gInBpeHNjb3BlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQaXhlbCBkYXRhIGFuYWx5c2lzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFBpeHNjb3BlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmcGl4c2NvcGVfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gcGl4c2NvcGVfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gcGl4c2NvcGVfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUGl4ZWxWYWx1ZXMgeworICAgIHVpbnQxNl90IHBbNF07Cit9IFBpeGVsVmFsdWVzOworCit0eXBlZGVmIHN0cnVjdCBPc2NpbGxvc2NvcGVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGZsb2F0IHhwb3MsIHlwb3M7CisgICAgZmxvYXQgdHgsIHR5OworICAgIGZsb2F0IHNpemU7CisgICAgZmxvYXQgdGlsdDsKKyAgICBmbG9hdCB0aGVpZ2h0LCB0d2lkdGg7CisgICAgZmxvYXQgbzsKKyAgICBpbnQgY29tcG9uZW50czsKKyAgICBpbnQgZ3JpZDsKKyAgICBpbnQgc3RhdGlzdGljczsKKyAgICBpbnQgc2NvcGU7CisKKyAgICBpbnQgeDEsIHkxLCB4MiwgeTI7CisgICAgaW50IG94LCBveTsKKyAgICBpbnQgaGVpZ2h0LCB3aWR0aDsKKworICAgIGludCBtYXg7CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgbmJfY29tcHM7CisgICAgaW50IGlzX3JnYjsKKyAgICB1aW50OF90IHJnYmFfbWFwWzRdOworICAgIEZGRHJhd0NvbnRleHQgZHJhdzsKKyAgICBGRkRyYXdDb2xvciAgIGRhcms7CisgICAgRkZEcmF3Q29sb3IgICBibGFjazsKKyAgICBGRkRyYXdDb2xvciAgIHdoaXRlOworICAgIEZGRHJhd0NvbG9yICAgZ3JlZW47CisgICAgRkZEcmF3Q29sb3IgICBibHVlOworICAgIEZGRHJhd0NvbG9yICAgcmVkOworICAgIEZGRHJhd0NvbG9yICAgY3lhbjsKKyAgICBGRkRyYXdDb2xvciAgIG1hZ2VudGE7CisgICAgRkZEcmF3Q29sb3IgICBncmF5OworICAgIEZGRHJhd0NvbG9yICAqY29sb3JzWzRdOworCisgICAgaW50IG5iX3ZhbHVlczsKKyAgICBQaXhlbFZhbHVlcyAgKnZhbHVlczsKKworICAgIHZvaWQgKCpwaWNrX2NvbG9yKShGRkRyYXdDb250ZXh0ICpkcmF3LCBGRkRyYXdDb2xvciAqY29sb3IsIEFWRnJhbWUgKmluLCBpbnQgeCwgaW50IHksIGludCAqdmFsdWUpOworICAgIHZvaWQgKCpkcmF3X3RyYWNlKShzdHJ1Y3QgT3NjaWxsb3Njb3BlQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpOworfSBPc2NpbGxvc2NvcGVDb250ZXh0OworCisjZGVmaW5lIE9PRkZTRVQoeCkgb2Zmc2V0b2YoT3NjaWxsb3Njb3BlQ29udGV4dCwgeCkKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9zY2lsbG9zY29wZV9vcHRpb25zW10gPSB7CisgICAgeyAieCIsICAic2V0IHNjb3BlIHggcG9zaXRpb24iLCAgICBPT0ZGU0VUKHhwb3MpLCAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC41fSwgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAieSIsICAic2V0IHNjb3BlIHkgcG9zaXRpb24iLCAgICBPT0ZGU0VUKHlwb3MpLCAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC41fSwgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAicyIsICAic2V0IHNjb3BlIHNpemUiLCAgICAgICAgICBPT0ZGU0VUKHNpemUpLCAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC44fSwgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAidCIsICAic2V0IHNjb3BlIHRpbHQiLCAgICAgICAgICBPT0ZGU0VUKHRpbHQpLCAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC41fSwgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAibyIsICAic2V0IHRyYWNlIG9wYWNpdHkiLCAgICAgICBPT0ZGU0VUKG8pLCAgICAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC44fSwgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAidHgiLCAic2V0IHRyYWNlIHggcG9zaXRpb24iLCAgICBPT0ZGU0VUKHR4KSwgICAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC41fSwgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAidHkiLCAic2V0IHRyYWNlIHkgcG9zaXRpb24iLCAgICBPT0ZGU0VUKHR5KSwgICAgICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC45fSwgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAidHciLCAic2V0IHRyYWNlIHdpZHRoIiwgICAgICAgICBPT0ZGU0VUKHR3aWR0aCksICAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC44fSwuMSwgMSwgIEZMQUdTIH0sCisgICAgeyAidGgiLCAic2V0IHRyYWNlIGhlaWdodCIsICAgICAgICBPT0ZGU0VUKHRoZWlnaHQpLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC4zfSwuMSwgMSwgIEZMQUdTIH0sCisgICAgeyAiYyIsICAic2V0IGNvbXBvbmVudHMgdG8gdHJhY2UiLCBPT0ZGU0VUKGNvbXBvbmVudHMpLCBBVl9PUFRfVFlQRV9JTlQsICAgey5pNjQ9N30sICAgMCwgMTUsIEZMQUdTIH0sCisgICAgeyAiZyIsICAiZHJhdyB0cmFjZSBncmlkIiwgICAgICAgICBPT0ZGU0VUKGdyaWQpLCAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgey5pNjQ9MX0sICAgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAic3QiLCAiZHJhdyBzdGF0aXN0aWNzIiwgICAgICAgICBPT0ZGU0VUKHN0YXRpc3RpY3MpLCBBVl9PUFRfVFlQRV9CT09MLCAgey5pNjQ9MX0sICAgMCwgMSwgIEZMQUdTIH0sCisgICAgeyAic2MiLCAiZHJhdyBzY29wZSIsICAgICAgICAgICAgICBPT0ZGU0VUKHNjb3BlKSwgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgey5pNjQ9MX0sICAgMCwgMSwgIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhvc2NpbGxvc2NvcGUpOworCitzdGF0aWMgdm9pZCBvc2NpbGxvc2NvcGVfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE9zY2lsbG9zY29wZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmcy0+dmFsdWVzKTsKK30KKworc3RhdGljIHZvaWQgZHJhd19saW5lKEZGRHJhd0NvbnRleHQgKmRyYXcsIGludCB4MCwgaW50IHkwLCBpbnQgeDEsIGludCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQsIEZGRHJhd0NvbG9yICpjb2xvcikKK3sKKyAgICBpbnQgZHggPSBGRkFCUyh4MSAtIHgwKSwgc3ggPSB4MCA8IHgxID8gMSA6IC0xOworICAgIGludCBkeSA9IEZGQUJTKHkxIC0geTApLCBzeSA9IHkwIDwgeTEgPyAxIDogLTE7CisgICAgaW50IGVyciA9IChkeCA+IGR5ID8gZHggOiAtZHkpIC8gMiwgZTI7CisgICAgaW50IHAsIGk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICh4MCA+PSAwICYmIHkwID49IDAgJiYgeDAgPCBvdXQtPndpZHRoICYmIHkwIDwgb3V0LT5oZWlnaHQpIHsKKyAgICAgICAgICAgIGZvciAocCA9IDA7IHAgPCBkcmF3LT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICAgICAgICAgIGlmIChkcmF3LT5kZXNjLT5jb21wW3BdLmRlcHRoID09IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXctPm5iX3BsYW5lcyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzBdW3kwICogb3V0LT5saW5lc2l6ZVswXSArIHgwICogZHJhdy0+cGl4ZWxzdGVwWzBdICsgaV0gPSBjb2xvci0+Y29tcFswXS51OFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtwXVtvdXQtPmxpbmVzaXplW3BdICogKHkwID4+IGRyYXctPnZzdWJbcF0pICsgKHgwID4+IGRyYXctPmhzdWJbcF0pXSA9IGNvbG9yLT5jb21wW3BdLnU4WzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXctPm5iX3BsYW5lcyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfV04xNihvdXQtPmRhdGFbMF0gKyB5MCAqIG91dC0+bGluZXNpemVbMF0gKyAyICogKHgwICogZHJhdy0+cGl4ZWxzdGVwWzBdICsgaSksIGNvbG9yLT5jb21wWzBdLnUxNltpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjE2KG91dC0+ZGF0YVtwXSArIG91dC0+bGluZXNpemVbcF0gKiAoeTAgPj4gZHJhdy0+dnN1YltwXSkgKyAoeDAgPj4gZHJhdy0+aHN1YltwXSkgKiAyLCBjb2xvci0+Y29tcFtwXS51MTZbMF0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHgwID09IHgxICYmIHkwID09IHkxKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZTIgPSBlcnI7CisKKyAgICAgICAgaWYgKGUyID4tZHgpIHsKKyAgICAgICAgICAgIGVyciAtPSBkeTsKKyAgICAgICAgICAgIHgwICs9IHN4OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGUyIDwgZHkpIHsKKyAgICAgICAgICAgIGVyciArPSBkeDsKKyAgICAgICAgICAgIHkwICs9IHN5OworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X3RyYWNlOChPc2NpbGxvc2NvcGVDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgaSwgYzsKKworICAgIGZvciAoaSA9IDE7IGkgPCBzLT5uYl92YWx1ZXM7IGkrKykgeworICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY29tcHM7IGMrKykgeworICAgICAgICAgICAgaWYgKCgxIDw8IGMpICYgcy0+Y29tcG9uZW50cykgeworICAgICAgICAgICAgICAgIGludCB4ID0gaSAqIHMtPndpZHRoIC8gcy0+bmJfdmFsdWVzOworICAgICAgICAgICAgICAgIGludCBweCA9IChpIC0gMSkgKiBzLT53aWR0aCAvIHMtPm5iX3ZhbHVlczsKKyAgICAgICAgICAgICAgICBpbnQgcHkgPSBzLT5oZWlnaHQgLSBzLT52YWx1ZXNbaS0xXS5wW2NdICogcy0+aGVpZ2h0IC8gMjU2OworICAgICAgICAgICAgICAgIGludCB5ID0gcy0+aGVpZ2h0IC0gcy0+dmFsdWVzW2ldLnBbY10gKiBzLT5oZWlnaHQgLyAyNTY7CisKKyAgICAgICAgICAgICAgICBkcmF3X2xpbmUoJnMtPmRyYXcsIHMtPm94ICsgeCwgcy0+b3kgKyB5LCBzLT5veCArIHB4LCBzLT5veSArIHB5LCBmcmFtZSwgcy0+Y29sb3JzW2NdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBkcmF3X3RyYWNlMTYoT3NjaWxsb3Njb3BlQ29udGV4dCAqcywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGksIGM7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcy0+bmJfdmFsdWVzOyBpKyspIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IHMtPm5iX2NvbXBzOyBjKyspIHsKKyAgICAgICAgICAgIGlmICgoMSA8PCBjKSAmIHMtPmNvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IGkgKiBzLT53aWR0aCAvIHMtPm5iX3ZhbHVlczsKKyAgICAgICAgICAgICAgICBpbnQgcHggPSAoaSAtIDEpICogcy0+d2lkdGggLyBzLT5uYl92YWx1ZXM7CisgICAgICAgICAgICAgICAgaW50IHB5ID0gcy0+aGVpZ2h0IC0gcy0+dmFsdWVzW2ktMV0ucFtjXSAqIHMtPmhlaWdodCAvIHMtPm1heDsKKyAgICAgICAgICAgICAgICBpbnQgeSA9IHMtPmhlaWdodCAtIHMtPnZhbHVlc1tpXS5wW2NdICogcy0+aGVpZ2h0IC8gcy0+bWF4OworCisgICAgICAgICAgICAgICAgZHJhd19saW5lKCZzLT5kcmF3LCBzLT5veCArIHgsIHMtPm95ICsgeSwgcy0+b3ggKyBweCwgcy0+b3kgKyBweSwgZnJhbWUsIHMtPmNvbG9yc1tjXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgb3NjaWxsb3Njb3BlX2NvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBPc2NpbGxvc2NvcGVDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgaW50IGN4LCBjeSwgc2l6ZTsKKyAgICBkb3VibGUgdGlsdDsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKyAgICBmZl9kcmF3X2luaXQoJnMtPmRyYXcsIGlubGluay0+Zm9ybWF0LCAwKTsKKyAgICBmZl9kcmF3X2NvbG9yKCZzLT5kcmF3LCAmcy0+ZGFyaywgICAgKHVpbnQ4X3RbXSl7ICAgMCwgICAwLCAgIDAsIHMtPm8gKiAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPmJsYWNrLCAgICh1aW50OF90W10peyAgIDAsICAgMCwgICAwLCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPndoaXRlLCAgICh1aW50OF90W10peyAyNTUsIDI1NSwgMjU1LCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPmdyZWVuLCAgICh1aW50OF90W10peyAgIDAsIDI1NSwgICAwLCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPmJsdWUsICAgICh1aW50OF90W10peyAgIDAsICAgMCwgMjU1LCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPnJlZCwgICAgICh1aW50OF90W10peyAyNTUsICAgMCwgICAwLCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPmN5YW4sICAgICh1aW50OF90W10peyAgIDAsIDI1NSwgMjU1LCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPm1hZ2VudGEsICh1aW50OF90W10peyAyNTUsICAgMCwgMjU1LCAyNTV9ICk7CisgICAgZmZfZHJhd19jb2xvcigmcy0+ZHJhdywgJnMtPmdyYXksICAgICh1aW50OF90W10peyAxMjgsIDEyOCwgMTI4LCAyNTV9ICk7CisgICAgcy0+bmJfY29tcHMgPSBzLT5kcmF3LmRlc2MtPm5iX2NvbXBvbmVudHM7CisgICAgcy0+aXNfcmdiICAgPSBzLT5kcmF3LmRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQjsKKworICAgIGlmIChzLT5pc19yZ2IpIHsKKyAgICAgICAgcy0+Y29sb3JzWzBdID0gJnMtPnJlZDsKKyAgICAgICAgcy0+Y29sb3JzWzFdID0gJnMtPmdyZWVuOworICAgICAgICBzLT5jb2xvcnNbMl0gPSAmcy0+Ymx1ZTsKKyAgICAgICAgcy0+Y29sb3JzWzNdID0gJnMtPndoaXRlOworICAgICAgICBmZl9maWxsX3JnYmFfbWFwKHMtPnJnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+Y29sb3JzWzBdID0gJnMtPndoaXRlOworICAgICAgICBzLT5jb2xvcnNbMV0gPSAmcy0+Y3lhbjsKKyAgICAgICAgcy0+Y29sb3JzWzJdID0gJnMtPm1hZ2VudGE7CisgICAgICAgIHMtPmNvbG9yc1szXSA9ICZzLT53aGl0ZTsKKyAgICAgICAgcy0+cmdiYV9tYXBbMF0gPSAwOworICAgICAgICBzLT5yZ2JhX21hcFsxXSA9IDE7CisgICAgICAgIHMtPnJnYmFfbWFwWzJdID0gMjsKKyAgICAgICAgcy0+cmdiYV9tYXBbM10gPSAzOworICAgIH0KKworICAgIGlmIChzLT5kcmF3LmRlc2MtPmNvbXBbMF0uZGVwdGggPD0gOCkgeworICAgICAgICBzLT5waWNrX2NvbG9yID0gcGlja19jb2xvcjg7CisgICAgICAgIHMtPmRyYXdfdHJhY2UgPSBkcmF3X3RyYWNlODsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5waWNrX2NvbG9yID0gcGlja19jb2xvcjE2OworICAgICAgICBzLT5kcmF3X3RyYWNlID0gZHJhd190cmFjZTE2OworICAgIH0KKworICAgIHMtPm1heCA9ICgxIDw8IHMtPmRyYXcuZGVzYy0+Y29tcFswXS5kZXB0aCk7CisgICAgY3ggPSBzLT54cG9zICogKGlubGluay0+dyAtIDEpOworICAgIGN5ID0gcy0+eXBvcyAqIChpbmxpbmstPmggLSAxKTsKKyAgICBzLT5oZWlnaHQgPSBzLT50aGVpZ2h0ICogaW5saW5rLT5oOworICAgIHMtPndpZHRoID0gcy0+dHdpZHRoICogaW5saW5rLT53OworICAgIHNpemUgPSBoeXBvdChpbmxpbmstPncsIGlubGluay0+aCk7CisKKyAgICBzLT52YWx1ZXMgPSBhdl9jYWxsb2Moc2l6ZSwgc2l6ZW9mKCpzLT52YWx1ZXMpKTsKKyAgICBpZiAoIXMtPnZhbHVlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHNpemUgKj0gcy0+c2l6ZTsKKyAgICB0aWx0ICA9IChzLT50aWx0IC0gMC41KSAqIE1fUEk7CisgICAgcy0+eDEgPSBjeCAtIHNpemUgLyAyLjAgKiBjb3ModGlsdCk7CisgICAgcy0+eDIgPSBjeCArIHNpemUgLyAyLjAgKiBjb3ModGlsdCk7CisgICAgcy0+eTEgPSBjeSAtIHNpemUgLyAyLjAgKiBzaW4odGlsdCk7CisgICAgcy0+eTIgPSBjeSArIHNpemUgLyAyLjAgKiBzaW4odGlsdCk7CisgICAgcy0+b3ggPSAoaW5saW5rLT53IC0gcy0+d2lkdGgpICogcy0+dHg7CisgICAgcy0+b3kgPSAoaW5saW5rLT5oIC0gcy0+aGVpZ2h0KSAqIHMtPnR5OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfc2NvcGUoT3NjaWxsb3Njb3BlQ29udGV4dCAqcywgaW50IHgwLCBpbnQgeTAsIGludCB4MSwgaW50IHkxLAorICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQsIFBpeGVsVmFsdWVzICpwLCBpbnQgc3RhdGUpCit7CisgICAgaW50IGR4ID0gRkZBQlMoeDEgLSB4MCksIHN4ID0geDAgPCB4MSA/IDEgOiAtMTsKKyAgICBpbnQgZHkgPSBGRkFCUyh5MSAtIHkwKSwgc3kgPSB5MCA8IHkxID8gMSA6IC0xOworICAgIGludCBlcnIgPSAoZHggPiBkeSA/IGR4IDogLWR5KSAvIDIsIGUyOworCisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoeDAgPj0gMCAmJiB5MCA+PSAwICYmIHgwIDwgb3V0LT53aWR0aCAmJiB5MCA8IG91dC0+aGVpZ2h0KSB7CisgICAgICAgICAgICBGRkRyYXdDb2xvciBjb2xvciA9IHsgeyAwIH0gfTsKKyAgICAgICAgICAgIGludCB2YWx1ZVs0XSA9IHsgMCB9OworCisgICAgICAgICAgICBzLT5waWNrX2NvbG9yKCZzLT5kcmF3LCAmY29sb3IsIG91dCwgeDAsIHkwLCB2YWx1ZSk7CisgICAgICAgICAgICBzLT52YWx1ZXNbcy0+bmJfdmFsdWVzXS5wWzBdID0gdmFsdWVbMF07CisgICAgICAgICAgICBzLT52YWx1ZXNbcy0+bmJfdmFsdWVzXS5wWzFdID0gdmFsdWVbMV07CisgICAgICAgICAgICBzLT52YWx1ZXNbcy0+bmJfdmFsdWVzXS5wWzJdID0gdmFsdWVbMl07CisgICAgICAgICAgICBzLT52YWx1ZXNbcy0+bmJfdmFsdWVzXS5wWzNdID0gdmFsdWVbM107CisgICAgICAgICAgICBzLT5uYl92YWx1ZXMrKzsKKworICAgICAgICAgICAgaWYgKHMtPnNjb3BlKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmRyYXcuZGVzYy0+Y29tcFswXS5kZXB0aCA9PSA4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5kcmF3Lm5iX3BsYW5lcyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmRyYXcucGl4ZWxzdGVwWzBdOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzBdW291dC0+bGluZXNpemVbMF0gKiB5MCArIHgwICogcy0+ZHJhdy5waXhlbHN0ZXBbMF0gKyBpXSA9IDI1NSAqICgocy0+bmJfdmFsdWVzICsgc3RhdGUpICYgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbMF1bb3V0LT5saW5lc2l6ZVswXSAqIHkwICsgeDBdID0gMjU1ICogKChzLT5uYl92YWx1ZXMgKyBzdGF0ZSkgJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzLT5kcmF3Lm5iX3BsYW5lcyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmRyYXcucGl4ZWxzdGVwWzBdOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfV04xNihvdXQtPmRhdGFbMF0gKyBvdXQtPmxpbmVzaXplWzBdICogeTAgKyAyICogeDAgKiAocy0+ZHJhdy5waXhlbHN0ZXBbMF0gKyBpKSwgKHMtPm1heCAtIDEpICogKChzLT5uYl92YWx1ZXMgKyBzdGF0ZSkgJiAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjE2KG91dC0+ZGF0YVswXSArIG91dC0+bGluZXNpemVbMF0gKiB5MCArIDIgKiB4MCwgKHMtPm1heCAtIDEpICogKChzLT5uYl92YWx1ZXMgKyBzdGF0ZSkgJiAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoeDAgPT0geDEgJiYgeTAgPT0geTEpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBlMiA9IGVycjsKKworICAgICAgICBpZiAoZTIgPi1keCkgeworICAgICAgICAgICAgZXJyIC09IGR5OworICAgICAgICAgICAgeDAgKz0gc3g7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZTIgPCBkeSkgeworICAgICAgICAgICAgZXJyICs9IGR4OworICAgICAgICAgICAgeTAgKz0gc3k7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgb3NjaWxsb3Njb3BlX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gaW5saW5rLT5kc3Q7CisgICAgT3NjaWxsb3Njb3BlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgZmxvYXQgYXZlcmFnZVs0XSA9IHsgMCB9OworICAgIGludCBtYXhbNF0gPSB7IDAgfTsKKyAgICBpbnQgbWluWzRdID0geyBJTlRfTUFYLCBJTlRfTUFYLCBJTlRfTUFYLCBJTlRfTUFYIH07CisgICAgaW50IGksIGM7CisKKyAgICBzLT5uYl92YWx1ZXMgPSAwOworICAgIGRyYXdfc2NvcGUocywgcy0+eDEsIHMtPnkxLCBzLT54Miwgcy0+eTIsIGZyYW1lLCBzLT52YWx1ZXMsIGlubGluay0+ZnJhbWVfY291bnRfaW4gJiAxKTsKKyAgICBmZl9ibGVuZF9yZWN0YW5nbGUoJnMtPmRyYXcsICZzLT5kYXJrLCBmcmFtZS0+ZGF0YSwgZnJhbWUtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm94LCBzLT5veSwgcy0+d2lkdGgsIHMtPmhlaWdodCArIDIwICogcy0+c3RhdGlzdGljcyk7CisKKyAgICBpZiAocy0+Z3JpZCkgeworICAgICAgICBmZl9maWxsX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmdyYXksIGZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm94LCBzLT5veSwgcy0+d2lkdGggLSAxLCAxKTsKKworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBmZl9maWxsX3JlY3RhbmdsZSgmcy0+ZHJhdywgJnMtPmdyYXksIGZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5veCwgcy0+b3kgKyBpICogKHMtPmhlaWdodCAtIDEpIC8gNCwgcy0+d2lkdGgsIDEpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIGZmX2ZpbGxfcmVjdGFuZ2xlKCZzLT5kcmF3LCAmcy0+Z3JheSwgZnJhbWUtPmRhdGEsIGZyYW1lLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm94ICsgaSAqIChzLT53aWR0aCAtIDEpIC8gMTAsIHMtPm95LCAxLCBzLT5oZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgZmZfZmlsbF9yZWN0YW5nbGUoJnMtPmRyYXcsICZzLT5ncmF5LCBmcmFtZS0+ZGF0YSwgZnJhbWUtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5veCArIHMtPndpZHRoIC0gMSwgcy0+b3ksIDEsIHMtPmhlaWdodCk7CisgICAgfQorCisgICAgcy0+ZHJhd190cmFjZShzLCBmcmFtZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfdmFsdWVzOyBpKyspIHsKKyAgICAgICAgZm9yIChjID0gMDsgYyA8IHMtPm5iX2NvbXBzOyBjKyspIHsKKyAgICAgICAgICAgIGlmICgoMSA8PCBjKSAmIHMtPmNvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBtYXhbY10gPSBGRk1BWChtYXhbY10sIHMtPnZhbHVlc1tpXS5wW2NdKTsKKyAgICAgICAgICAgICAgICBtaW5bY10gPSBGRk1JTihtaW5bY10sIHMtPnZhbHVlc1tpXS5wW2NdKTsKKyAgICAgICAgICAgICAgICBhdmVyYWdlW2NdICs9IHMtPnZhbHVlc1tpXS5wW2NdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoYyA9IDA7IGMgPCBzLT5uYl9jb21wczsgYysrKSB7CisgICAgICAgIGF2ZXJhZ2VbY10gLz0gcy0+bmJfdmFsdWVzOworICAgIH0KKworICAgIGlmIChzLT5zdGF0aXN0aWNzICYmIHMtPmhlaWdodCA+IDEwICYmIHMtPndpZHRoID4gMjgwICogYXZfcG9wY291bnQocy0+Y29tcG9uZW50cykpIHsKKyAgICAgICAgZm9yIChjID0gMCwgaSA9IDA7IGMgPCBzLT5uYl9jb21wczsgYysrKSB7CisgICAgICAgICAgICBpZiAoKDEgPDwgYykgJiBzLT5jb21wb25lbnRzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciByZ2JhWzRdID0geyAnUicsICdHJywgJ0InLCAnQScgfTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyIHl1dmFbNF0gPSB7ICdZJywgJ1UnLCAnVicsICdBJyB9OworICAgICAgICAgICAgICAgIGNoYXIgdGV4dFsxMjhdOworCisgICAgICAgICAgICAgICAgc25wcmludGYodGV4dCwgc2l6ZW9mKHRleHQpLCAiJWMgYXZnOiUuMWYgbWluOiVkIG1heDolZFxuIiwgcy0+aXNfcmdiID8gcmdiYVtjXSA6IHl1dmFbY10sIGF2ZXJhZ2Vbcy0+cmdiYV9tYXBbY11dLCBtaW5bcy0+cmdiYV9tYXBbY11dLCBtYXhbcy0+cmdiYV9tYXBbY11dKTsKKyAgICAgICAgICAgICAgICBkcmF3X3RleHQoJnMtPmRyYXcsIGZyYW1lLCAmcy0+d2hpdGUsIHMtPm94ICsgIDIgKyAyODAgKiBpKyssIHMtPm95ICsgcy0+aGVpZ2h0ICsgNCwgdGV4dCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGZyYW1lKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG9zY2lsbG9zY29wZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgPSBvc2NpbGxvc2NvcGVfZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzICAgPSBvc2NpbGxvc2NvcGVfY29uZmlnX2lucHV0LAorICAgICAgICAubmVlZHNfd3JpdGFibGUgPSAxLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvc2NpbGxvc2NvcGVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9vc2NpbGxvc2NvcGUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAib3NjaWxsb3Njb3BlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCIyRCBWaWRlbyBPc2NpbGxvc2NvcGUuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoT3NjaWxsb3Njb3BlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmb3NjaWxsb3Njb3BlX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAudW5pbml0ICAgICAgICA9IG9zY2lsbG9zY29wZV91bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSBvc2NpbGxvc2NvcGVfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3NjaWxsb3Njb3BlX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9kY3Rkbm9pei5jIGIvbGliYXZmaWx0ZXIvdmZfZGN0ZG5vaXouYwppbmRleCA2OTU3ZjE5Li5jZGJlNWY4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9kY3Rkbm9pei5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2RjdGRub2l6LmMKQEAgLTYzLDkgKzYzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVhZF9pZCk7CiAgICAgdm9pZCAoKmNvbG9yX2RlY29ycmVsYXRpb24pKGZsb2F0ICoqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKipzcmMsIGludCBzcmNfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCk7Ci0gICAgdm9pZCAoKmNvbG9yX2NvcnJlbGF0aW9uKSh1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgdm9pZCAoKmNvbG9yX2NvcnJlbGF0aW9uKSh1aW50OF90ICoqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKipzcmMsIGludCBzcmNfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOwogfSBEQ1Rkbm9pekNvbnRleHQ7CkBAIC00MDgsNyArNDA4LDcgQEAKICNkZWZpbmUgRENUM1gzXzJfMiAgMC40MDgyNDgyOTA0NjM4NjMxZiAvKiAgMS9zcXJ0KDYpICovCiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgY29sb3JfZGVjb3JyZWxhdGlvbihmbG9hdCAqKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGludCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnNyYywgaW50IHNyY19saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIsIGludCBnLCBpbnQgYikKIHsKQEAgLTQxNiwyNCArNDE2LDIzIEBACiAgICAgZmxvYXQgKmRzdHBfciA9IGRzdFswXTsKICAgICBmbG9hdCAqZHN0cF9nID0gZHN0WzFdOwogICAgIGZsb2F0ICpkc3RwX2IgPSBkc3RbMl07CisgICAgY29uc3QgdWludDhfdCAqc3JjcCA9IHNyY1swXTsKIAogICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCA9IHNyYzsKLQogICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CiAgICAgICAgICAgICBkc3RwX3JbeF0gPSBzcmNwW3JdICogRENUM1gzXzBfMCArIHNyY3BbZ10gKiBEQ1QzWDNfMF8xICsgc3JjcFtiXSAqIERDVDNYM18wXzI7CiAgICAgICAgICAgICBkc3RwX2dbeF0gPSBzcmNwW3JdICogRENUM1gzXzFfMCArICAgICAgICAgICAgICAgICAgICAgICAgc3JjcFtiXSAqIERDVDNYM18xXzI7CiAgICAgICAgICAgICBkc3RwX2JbeF0gPSBzcmNwW3JdICogRENUM1gzXzJfMCArIHNyY3BbZ10gKiBEQ1QzWDNfMl8xICsgc3JjcFtiXSAqIERDVDNYM18yXzI7CiAgICAgICAgICAgICBzcmNwICs9IDM7CiAgICAgICAgIH0KLSAgICAgICAgc3JjICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjcCAgICs9IHNyY19saW5lc2l6ZSAtIHcgKiAzOwogICAgICAgICBkc3RwX3IgKz0gZHN0X2xpbmVzaXplOwogICAgICAgICBkc3RwX2cgKz0gZHN0X2xpbmVzaXplOwogICAgICAgICBkc3RwX2IgKz0gZHN0X2xpbmVzaXplOwogICAgIH0KIH0KIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjb2xvcl9jb3JyZWxhdGlvbih1aW50OF90ICpkc3QsIGludCBkc3RfbGluZXNpemUsCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGNvbG9yX2NvcnJlbGF0aW9uKHVpbnQ4X3QgKipkc3QsIGludCBkc3RfbGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqc3JjLCBpbnQgc3JjX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByLCBpbnQgZywgaW50IGIpCkBAIC00NDIsMTcgKzQ0MSwxNiBAQAogICAgIGNvbnN0IGZsb2F0ICpzcmNfciA9IHNyY1swXTsKICAgICBjb25zdCBmbG9hdCAqc3JjX2cgPSBzcmNbMV07CiAgICAgY29uc3QgZmxvYXQgKnNyY19iID0gc3JjWzJdOworICAgIHVpbnQ4X3QgKmRzdHAgPSBkc3RbMF07CiAKICAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgKmRzdHAgPSBkc3Q7Ci0KICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgewogICAgICAgICAgICAgZHN0cFtyXSA9IGF2X2NsaXBfdWludDgoc3JjX3JbeF0gKiBEQ1QzWDNfMF8wICsgc3JjX2dbeF0gKiBEQ1QzWDNfMV8wICsgc3JjX2JbeF0gKiBEQ1QzWDNfMl8wKTsKICAgICAgICAgICAgIGRzdHBbZ10gPSBhdl9jbGlwX3VpbnQ4KHNyY19yW3hdICogRENUM1gzXzBfMSArICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19iW3hdICogRENUM1gzXzJfMSk7CiAgICAgICAgICAgICBkc3RwW2JdID0gYXZfY2xpcF91aW50OChzcmNfclt4XSAqIERDVDNYM18wXzIgKyBzcmNfZ1t4XSAqIERDVDNYM18xXzIgKyBzcmNfYlt4XSAqIERDVDNYM18yXzIpOwogICAgICAgICAgICAgZHN0cCArPSAzOwogICAgICAgICB9Ci0gICAgICAgIGRzdCArPSBkc3RfbGluZXNpemU7CisgICAgICAgIGRzdHAgICs9IGRzdF9saW5lc2l6ZSAtIHcgKiAzOwogICAgICAgICBzcmNfciArPSBzcmNfbGluZXNpemU7CiAgICAgICAgIHNyY19nICs9IHNyY19saW5lc2l6ZTsKICAgICAgICAgc3JjX2IgKz0gc3JjX2xpbmVzaXplOwpAQCAtNDYxLDEzICs0NTksMTMgQEAKIAogI2RlZmluZSBERUNMQVJFX0NPTE9SX0ZVTkNTKG5hbWUsIHIsIGcsIGIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIHZvaWQgY29sb3JfZGVjb3JyZWxhdGlvbl8jI25hbWUoZmxvYXQgKipkc3QsIGludCBkc3RfbGluZXNpemUsICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqKnNyYywgaW50IHNyY19saW5lc2l6ZSwgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGNvbG9yX2RlY29ycmVsYXRpb24oZHN0LCBkc3RfbGluZXNpemUsIHNyYywgc3JjX2xpbmVzaXplLCB3LCBoLCByLCBnLCBiKTsgICAgICAgXAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgY29sb3JfY29ycmVsYXRpb25fIyNuYW1lKHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZSwgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgY29sb3JfY29ycmVsYXRpb25fIyNuYW1lKHVpbnQ4X3QgKipkc3QsIGludCBkc3RfbGluZXNpemUsICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNDc3LDYgKzQ3NSw2MCBAQAogREVDTEFSRV9DT0xPUl9GVU5DUyhyZ2IsIDAsIDEsIDIpCiBERUNMQVJFX0NPTE9SX0ZVTkNTKGJnciwgMiwgMSwgMCkKIAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjb2xvcl9kZWNvcnJlbGF0aW9uX2dicnAoZmxvYXQgKipkc3QsIGludCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICoqc3JjLCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIGludCB4LCB5OworICAgIGZsb2F0ICpkc3RwX3IgPSBkc3RbMF07CisgICAgZmxvYXQgKmRzdHBfZyA9IGRzdFsxXTsKKyAgICBmbG9hdCAqZHN0cF9iID0gZHN0WzJdOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfciA9IHNyY1syXTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNwX2cgPSBzcmNbMF07CisgICAgY29uc3QgdWludDhfdCAqc3JjcF9iID0gc3JjWzFdOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBkc3RwX3JbeF0gPSBzcmNwX3JbeF0gKiBEQ1QzWDNfMF8wICsgc3JjcF9nW3hdICogRENUM1gzXzBfMSArIHNyY3BfYlt4XSAqIERDVDNYM18wXzI7CisgICAgICAgICAgICBkc3RwX2dbeF0gPSBzcmNwX3JbeF0gKiBEQ1QzWDNfMV8wICsgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3BfYlt4XSAqIERDVDNYM18xXzI7CisgICAgICAgICAgICBkc3RwX2JbeF0gPSBzcmNwX3JbeF0gKiBEQ1QzWDNfMl8wICsgc3JjcF9nW3hdICogRENUM1gzXzJfMSArIHNyY3BfYlt4XSAqIERDVDNYM18yXzI7CisgICAgICAgIH0KKyAgICAgICAgc3JjcF9yICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjcF9nICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjcF9iICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgZHN0cF9yICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgZHN0cF9nICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgZHN0cF9iICs9IGRzdF9saW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgY29sb3JfY29ycmVsYXRpb25fZ2JycCh1aW50OF90ICoqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqc3JjLCBpbnQgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBjb25zdCBmbG9hdCAqc3JjX3IgPSBzcmNbMF07CisgICAgY29uc3QgZmxvYXQgKnNyY19nID0gc3JjWzFdOworICAgIGNvbnN0IGZsb2F0ICpzcmNfYiA9IHNyY1syXTsKKyAgICB1aW50OF90ICpkc3RwX3IgPSBkc3RbMl07CisgICAgdWludDhfdCAqZHN0cF9nID0gZHN0WzBdOworICAgIHVpbnQ4X3QgKmRzdHBfYiA9IGRzdFsxXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgZHN0cF9yW3hdID0gYXZfY2xpcF91aW50OChzcmNfclt4XSAqIERDVDNYM18wXzAgKyBzcmNfZ1t4XSAqIERDVDNYM18xXzAgKyBzcmNfYlt4XSAqIERDVDNYM18yXzApOworICAgICAgICAgICAgZHN0cF9nW3hdID0gYXZfY2xpcF91aW50OChzcmNfclt4XSAqIERDVDNYM18wXzEgKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYlt4XSAqIERDVDNYM18yXzEpOworICAgICAgICAgICAgZHN0cF9iW3hdID0gYXZfY2xpcF91aW50OChzcmNfclt4XSAqIERDVDNYM18wXzIgKyBzcmNfZ1t4XSAqIERDVDNYM18xXzIgKyBzcmNfYlt4XSAqIERDVDNYM18yXzIpOworICAgICAgICB9CisgICAgICAgIGRzdHBfciArPSBkc3RfbGluZXNpemU7CisgICAgICAgIGRzdHBfZyArPSBkc3RfbGluZXNpemU7CisgICAgICAgIGRzdHBfYiArPSBkc3RfbGluZXNpemU7CisgICAgICAgIHNyY19yICs9IHNyY19saW5lc2l6ZTsKKyAgICAgICAgc3JjX2cgKz0gc3JjX2xpbmVzaXplOworICAgICAgICBzcmNfYiArPSBzcmNfbGluZXNpemU7CisgICAgfQorfQorCiBzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwpAQCAtNDkzLDYgKzU0NSwxMCBAQAogICAgICAgICBzLT5jb2xvcl9kZWNvcnJlbGF0aW9uID0gY29sb3JfZGVjb3JyZWxhdGlvbl9yZ2I7CiAgICAgICAgIHMtPmNvbG9yX2NvcnJlbGF0aW9uICAgPSBjb2xvcl9jb3JyZWxhdGlvbl9yZ2I7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOgorICAgICAgICBzLT5jb2xvcl9kZWNvcnJlbGF0aW9uID0gY29sb3JfZGVjb3JyZWxhdGlvbl9nYnJwOworICAgICAgICBzLT5jb2xvcl9jb3JyZWxhdGlvbiAgID0gY29sb3JfY29ycmVsYXRpb25fZ2JycDsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKICAgICB9CkBAIC01MDcsOSArNTYzLDkgQEAKICAgICAgICAgICAgICAgIGlubGluay0+aCAtIHMtPnByX2hlaWdodCk7CiAKICAgICBtYXhfc2xpY2VfaCA9IHMtPnByX2hlaWdodCAvICgocy0+YnNpemUgLSAxKSAqIDIpOwotICAgIHMtPm5iX3RocmVhZHMgPSBGRk1JTjMoTUFYX1RIUkVBRFMsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMsIG1heF9zbGljZV9oKTsKKyAgICBzLT5uYl90aHJlYWRzID0gRkZNSU4zKE1BWF9USFJFQURTLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSwgbWF4X3NsaWNlX2gpOwogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgInRocmVhZHM6IFttYXg9JWQgaG1heD0lZCB1c2VyPSVkXSA9PiAlZFxuIiwKLSAgICAgICAgICAgTUFYX1RIUkVBRFMsIG1heF9zbGljZV9oLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzLCBzLT5uYl90aHJlYWRzKTsKKyAgICAgICAgICAgTUFYX1RIUkVBRFMsIG1heF9zbGljZV9oLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSwgcy0+bmJfdGhyZWFkcyk7CiAKICAgICBzLT5wX2xpbmVzaXplID0gbGluZXNpemUgPSBGRkFMSUdOKHMtPnByX3dpZHRoLCAzMik7CiAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewpAQCAtNTk4LDYgKzY1NCw3IEBACiB7CiAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0gewogICAgICAgICBBVl9QSVhfRk1UX0JHUjI0LCBBVl9QSVhfRk1UX1JHQjI0LAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAsCiAgICAgICAgIEFWX1BJWF9GTVRfTk9ORQogICAgIH07CiAgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzX2xpc3QgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKQEAgLTY4MCw3ICs3MzcsNyBAQAogICAgIH0KIAogICAgIHMtPmNvbG9yX2RlY29ycmVsYXRpb24ocy0+Y2J1ZlswXSwgcy0+cF9saW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhWzBdLCBpbi0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKilpbi0+ZGF0YSwgaW4tPmxpbmVzaXplWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJfd2lkdGgsIHMtPnByX2hlaWdodCk7CiAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgMzsgcGxhbmUrKykgewogICAgICAgICBUaHJlYWREYXRhIHRkID0gewpAQCAtNjg5LDcgKzc0Niw3IEBACiAgICAgICAgIH07CiAgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgcy0+bmJfdGhyZWFkcyk7CiAgICAgfQotICAgIHMtPmNvbG9yX2NvcnJlbGF0aW9uKG91dC0+ZGF0YVswXSwgb3V0LT5saW5lc2l6ZVswXSwKKyAgICBzLT5jb2xvcl9jb3JyZWxhdGlvbihvdXQtPmRhdGEsIG91dC0+bGluZXNpemVbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2J1ZlsxXSwgcy0+cF9saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcl93aWR0aCwgcy0+cHJfaGVpZ2h0KTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZGViYW5kLmMgYi9saWJhdmZpbHRlci92Zl9kZWJhbmQuYwppbmRleCAwMTcyOGIxLi43MTNlODBiIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9kZWJhbmQuYworKysgYi9saWJhdmZpbHRlci92Zl9kZWJhbmQuYwpAQCAtMzAsNiArMzAsNyBAQAogdHlwZWRlZiBzdHJ1Y3QgRGViYW5kQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAKKyAgICBpbnQgY291cGxpbmc7CiAgICAgZmxvYXQgdGhyZXNob2xkWzRdOwogICAgIGludCByYW5nZTsKICAgICBpbnQgYmx1cjsKQEAgLTM4LDYgKzM5LDcgQEAKICAgICBpbnQgbmJfY29tcG9uZW50czsKICAgICBpbnQgcGxhbmV3aWR0aFs0XTsKICAgICBpbnQgcGxhbmVoZWlnaHRbNF07CisgICAgaW50IHNoaWZ0WzJdOwogICAgIGludCB0aHJbNF07CiAKICAgICBpbnQgKnhfcG9zOwpAQCAtNTksNiArNjEsOSBAQAogICAgIHsgImRpcmVjdGlvbiIsICJzZXQgZGlyZWN0aW9uIiwgICAgICAgICAgIE9GRlNFVChkaXJlY3Rpb24pLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MipNX1BJfSwtMipNX1BJLCAgMipNX1BJLCBGTEFHUyB9LAogICAgIHsgImQiLCAgICAgICAgICJzZXQgZGlyZWN0aW9uIiwgICAgICAgICAgIE9GRlNFVChkaXJlY3Rpb24pLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MipNX1BJfSwtMipNX1BJLCAgMipNX1BJLCBGTEFHUyB9LAogICAgIHsgImJsdXIiLCAgICAgICJzZXQgYmx1ciIsICAgICAgICAgICAgICAgIE9GRlNFVChibHVyKSwgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgey5pNjQ9MX0sICAgICAgICAgICAwLCAgICAgICAxLCBGTEFHUyB9LAorICAgIHsgImIiLCAgICAgICAgICJzZXQgYmx1ciIsICAgICAgICAgICAgICAgIE9GRlNFVChibHVyKSwgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgey5pNjQ9MX0sICAgICAgICAgICAwLCAgICAgICAxLCBGTEFHUyB9LAorICAgIHsgImNvdXBsaW5nIiwgICJzZXQgcGxhbmUgY291cGxpbmciLCAgICAgIE9GRlNFVChjb3VwbGluZyksICAgICBBVl9PUFRfVFlQRV9CT09MLCAgey5pNjQ9MH0sICAgICAgICAgICAwLCAgICAgICAxLCBGTEFHUyB9LAorICAgIHsgImMiLCAgICAgICAgICJzZXQgcGxhbmUgY291cGxpbmciLCAgICAgIE9GRlNFVChjb3VwbGluZyksICAgICBBVl9PUFRfVFlQRV9CT09MLCAgey5pNjQ9MH0sICAgICAgICAgICAwLCAgICAgICAxLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC02Niw2ICs3MSw4IEBACiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKKyAgICBEZWJhbmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworCiAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0gewogICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX0dSQVkxNiwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgQVZfUElYX0ZNVF9ZVVY0MjBQLApAQCAtODYsNyArOTMsMjEgQEAKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKLSAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHNfbGlzdCA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOworCisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBjcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUlAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTYsIEFWX1BJWF9GTVRfR0JSQVAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChzLT5jb3VwbGluZyA/IGNwaXhfZm10cyA6IHBpeF9mbXRzKTsKICAgICBpZiAoIWZtdHNfbGlzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIApAQCAtMTI5LDcgKzE1MCw3IEBACiAgICAgICAgIGNvbnN0IGludCBoID0gcy0+cGxhbmVoZWlnaHRbcF0gLSAxOwogCiAgICAgICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyspIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBwb3MgPSB5ICogcy0+cGxhbmVoZWlnaHRbMF07CisgICAgICAgICAgICBjb25zdCBpbnQgcG9zID0geSAqIHMtPnBsYW5ld2lkdGhbMF07CiAKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5wbGFuZXdpZHRoW3BdOyB4KyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeF9wb3MgPSBzLT54X3Bvc1twb3MgKyB4XTsKQEAgLTE1OCw2ICsxNzksMTM4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZGViYW5kXzhfY291cGxpbmdfYyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIERlYmFuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsKKyAgICBjb25zdCBpbnQgc3RhcnQgPSAocy0+cGxhbmVoZWlnaHRbMF0gKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgZW5kICAgPSAocy0+cGxhbmVoZWlnaHRbMF0gKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBpbnQgeCwgeSwgcDsKKworICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyspIHsKKyAgICAgICAgY29uc3QgaW50IHBvcyA9IHkgKiBzLT5wbGFuZXdpZHRoWzBdOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5wbGFuZXdpZHRoWzBdOyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB4X3BvcyA9IHMtPnhfcG9zW3BvcyArIHhdOworICAgICAgICAgICAgY29uc3QgaW50IHlfcG9zID0gcy0+eV9wb3NbcG9zICsgeF07CisgICAgICAgICAgICBpbnQgYXZnWzRdLCBjbXBbNF0gPSB7IDAgfSwgc3JjWzRdOworCisgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfY29tcG9uZW50czsgcCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3B0ciA9IChjb25zdCB1aW50OF90ICopaW4tPmRhdGFbcF07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHNyY19saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVtwXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgdGhyID0gcy0+dGhyW3BdOworICAgICAgICAgICAgICAgIGNvbnN0IGludCB3ID0gcy0+cGxhbmV3aWR0aFtwXSAtIDE7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGggPSBzLT5wbGFuZWhlaWdodFtwXSAtIDE7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJlZjAgPSBzcmNfcHRyW2F2X2NsaXAoeSArICB5X3BvcywgMCwgaCkgKiBzcmNfbGluZXNpemUgKyBhdl9jbGlwKHggKyAgeF9wb3MsIDAsIHcpXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmVmMSA9IHNyY19wdHJbYXZfY2xpcCh5ICsgLXlfcG9zLCAwLCBoKSAqIHNyY19saW5lc2l6ZSArIGF2X2NsaXAoeCArICB4X3BvcywgMCwgdyldOworICAgICAgICAgICAgICAgIGNvbnN0IGludCByZWYyID0gc3JjX3B0clthdl9jbGlwKHkgKyAteV9wb3MsIDAsIGgpICogc3JjX2xpbmVzaXplICsgYXZfY2xpcCh4ICsgLXhfcG9zLCAwLCB3KV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJlZjMgPSBzcmNfcHRyW2F2X2NsaXAoeSArICB5X3BvcywgMCwgaCkgKiBzcmNfbGluZXNpemUgKyBhdl9jbGlwKHggKyAteF9wb3MsIDAsIHcpXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3JjMCA9IHNyY19wdHJbeSAqIHNyY19saW5lc2l6ZSArIHhdOworCisgICAgICAgICAgICAgICAgc3JjW3BdID0gc3JjMDsKKyAgICAgICAgICAgICAgICBhdmdbcF0gPSBnZXRfYXZnKHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMpOworCisgICAgICAgICAgICAgICAgaWYgKHMtPmJsdXIpIHsKKyAgICAgICAgICAgICAgICAgICAgY21wW3BdID0gRkZBQlMoc3JjMCAtIGF2Z1twXSkgPCB0aHI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY21wW3BdID0gKEZGQUJTKHNyYzAgLSByZWYwKSA8IHRocikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZGQUJTKHNyYzAgLSByZWYxKSA8IHRocikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZGQUJTKHNyYzAgLSByZWYyKSA8IHRocikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZGQUJTKHNyYzAgLSByZWYzKSA8IHRocik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfY29tcG9uZW50czsgcCsrKQorICAgICAgICAgICAgICAgIGlmICghY21wW3BdKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmIChwID09IHMtPm5iX2NvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfY29tcG9uZW50czsgcCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3RfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BdOworCisgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtwXVt5ICogZHN0X2xpbmVzaXplICsgeF0gPSBhdmdbcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfY29tcG9uZW50czsgcCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3RfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BdOworCisgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtwXVt5ICogZHN0X2xpbmVzaXplICsgeF0gPSBzcmNbcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGViYW5kXzE2X2NvdXBsaW5nX2MoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBEZWJhbmRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIEFWRnJhbWUgKmluID0gdGQtPmluOworICAgIEFWRnJhbWUgKm91dCA9IHRkLT5vdXQ7CisgICAgY29uc3QgaW50IHN0YXJ0ID0gKHMtPnBsYW5laGVpZ2h0WzBdICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IGVuZCAgID0gKHMtPnBsYW5laGVpZ2h0WzBdICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHgsIHksIHAsIHo7CisKKyAgICBmb3IgKHkgPSBzdGFydDsgeSA8IGVuZDsgeSsrKSB7CisgICAgICAgIGNvbnN0IGludCBwb3MgPSB5ICogcy0+cGxhbmV3aWR0aFswXTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+cGxhbmV3aWR0aFswXTsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgeF9wb3MgPSBzLT54X3Bvc1twb3MgKyB4XTsKKyAgICAgICAgICAgIGNvbnN0IGludCB5X3BvcyA9IHMtPnlfcG9zW3BvcyArIHhdOworICAgICAgICAgICAgaW50IGF2Z1s0XSwgY21wWzRdID0geyAwIH0sIHNyY1s0XTsKKworICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX2NvbXBvbmVudHM7IHArKykgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfcHRyID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbcF07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHNyY19saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVtwXSAvIDI7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHRociA9IHMtPnRocltwXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgdyA9IHMtPnBsYW5ld2lkdGhbcF0gLSAxOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBoID0gcy0+cGxhbmVoZWlnaHRbcF0gLSAxOworICAgICAgICAgICAgICAgIGNvbnN0IGludCByZWYwID0gc3JjX3B0clthdl9jbGlwKHkgKyAgeV9wb3MsIDAsIGgpICogc3JjX2xpbmVzaXplICsgYXZfY2xpcCh4ICsgIHhfcG9zLCAwLCB3KV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHJlZjEgPSBzcmNfcHRyW2F2X2NsaXAoeSArIC15X3BvcywgMCwgaCkgKiBzcmNfbGluZXNpemUgKyBhdl9jbGlwKHggKyAgeF9wb3MsIDAsIHcpXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcmVmMiA9IHNyY19wdHJbYXZfY2xpcCh5ICsgLXlfcG9zLCAwLCBoKSAqIHNyY19saW5lc2l6ZSArIGF2X2NsaXAoeCArIC14X3BvcywgMCwgdyldOworICAgICAgICAgICAgICAgIGNvbnN0IGludCByZWYzID0gc3JjX3B0clthdl9jbGlwKHkgKyAgeV9wb3MsIDAsIGgpICogc3JjX2xpbmVzaXplICsgYXZfY2xpcCh4ICsgLXhfcG9zLCAwLCB3KV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHNyYzAgPSBzcmNfcHRyW3kgKiBzcmNfbGluZXNpemUgKyB4XTsKKworICAgICAgICAgICAgICAgIHNyY1twXSA9IHNyYzA7CisgICAgICAgICAgICAgICAgYXZnW3BdID0gZ2V0X2F2ZyhyZWYwLCByZWYxLCByZWYyLCByZWYzKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5ibHVyKSB7CisgICAgICAgICAgICAgICAgICAgIGNtcFtwXSA9IEZGQUJTKHNyYzAgLSBhdmdbcF0pIDwgdGhyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNtcFtwXSA9IChGRkFCUyhzcmMwIC0gcmVmMCkgPCB0aHIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGRkFCUyhzcmMwIC0gcmVmMSkgPCB0aHIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGRkFCUyhzcmMwIC0gcmVmMikgPCB0aHIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGRkFCUyhzcmMwIC0gcmVmMykgPCB0aHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh6ID0gMDsgeiA8IHMtPm5iX2NvbXBvbmVudHM7IHorKykKKyAgICAgICAgICAgICAgICBpZiAoIWNtcFt6XSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoeiA9PSBzLT5uYl9jb21wb25lbnRzKSB7CisgICAgICAgICAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX2NvbXBvbmVudHM7IHArKykgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZHN0X2xpbmVzaXplID0gb3V0LT5saW5lc2l6ZVtwXSAvIDI7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilvdXQtPmRhdGFbcF0gKyB5ICogZHN0X2xpbmVzaXplICsgeDsKKworICAgICAgICAgICAgICAgICAgICBkc3RbMF0gPSBhdmdbcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfY29tcG9uZW50czsgcCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkc3RfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BdIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwXSArIHkgKiBkc3RfbGluZXNpemUgKyB4OworCisgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IHNyY1twXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBkZWJhbmRfMTZfYyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQogewogICAgIERlYmFuZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CkBAIC0xNzgsNyArMzMxLDcgQEAKICAgICAgICAgY29uc3QgaW50IGggPSBzLT5wbGFuZWhlaWdodFtwXSAtIDE7CiAKICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKykgewotICAgICAgICAgICAgY29uc3QgaW50IHBvcyA9IHkgKiBzLT5wbGFuZWhlaWdodFswXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBwb3MgPSB5ICogcy0+cGxhbmV3aWR0aFswXTsKIAogICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPnBsYW5ld2lkdGhbcF07IHgrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCB4X3BvcyA9IHMtPnhfcG9zW3BvcyArIHhdOwpAQCAtMjIyLDggKzM3NSwxMyBAQAogICAgIHMtPnBsYW5laGVpZ2h0WzBdID0gcy0+cGxhbmVoZWlnaHRbM10gPSBpbmxpbmstPmg7CiAgICAgcy0+cGxhbmV3aWR0aFsxXSAgPSBzLT5wbGFuZXdpZHRoWzJdICA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CiAgICAgcy0+cGxhbmV3aWR0aFswXSAgPSBzLT5wbGFuZXdpZHRoWzNdICA9IGlubGluay0+dzsKKyAgICBzLT5zaGlmdFswXSA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+c2hpZnRbMV0gPSBkZXNjLT5sb2cyX2Nocm9tYV9oOwogCi0gICAgcy0+ZGViYW5kID0gZGVzYy0+Y29tcFswXS5kZXB0aCA+IDggPyBkZWJhbmRfMTZfYyA6IGRlYmFuZF84X2M7CisgICAgaWYgKHMtPmNvdXBsaW5nKQorICAgICAgICBzLT5kZWJhbmQgPSBkZXNjLT5jb21wWzBdLmRlcHRoID4gOCA/IGRlYmFuZF8xNl9jb3VwbGluZ19jIDogZGViYW5kXzhfY291cGxpbmdfYzsKKyAgICBlbHNlCisgICAgICAgIHMtPmRlYmFuZCA9IGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4ID8gZGViYW5kXzE2X2MgOiBkZWJhbmRfOF9jOwogCiAgICAgcy0+dGhyWzBdID0gKCgxIDw8IGRlc2MtPmNvbXBbMF0uZGVwdGgpIC0gMSkgKiBzLT50aHJlc2hvbGRbMF07CiAgICAgcy0+dGhyWzFdID0gKCgxIDw8IGRlc2MtPmNvbXBbMV0uZGVwdGgpIC0gMSkgKiBzLT50aHJlc2hvbGRbMV07CkBAIC0yNDEsOCArMzk5LDggQEAKICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGRpciA9IGRpcmVjdGlvbiA8IDAgPyAtZGlyZWN0aW9uIDogciAqIGRpcmVjdGlvbjsKICAgICAgICAgICAgIGNvbnN0IGludCBkaXN0ID0gcmFuZ2UgPCAwID8gLXJhbmdlIDogciAqIHJhbmdlOwogCi0gICAgICAgICAgICBzLT54X3Bvc1t5ICogcy0+cGxhbmVoZWlnaHRbMF0gKyB4XSA9IGNvc2YoZGlyKSAqIGRpc3Q7Ci0gICAgICAgICAgICBzLT55X3Bvc1t5ICogcy0+cGxhbmVoZWlnaHRbMF0gKyB4XSA9IHNpbmYoZGlyKSAqIGRpc3Q7CisgICAgICAgICAgICBzLT54X3Bvc1t5ICogcy0+cGxhbmV3aWR0aFswXSArIHhdID0gY29zZihkaXIpICogZGlzdDsKKyAgICAgICAgICAgIHMtPnlfcG9zW3kgKiBzLT5wbGFuZXdpZHRoWzBdICsgeF0gPSBzaW5mKGRpcikgKiBkaXN0OwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNjcsNyArNDI1LDcgQEAKICAgICB0ZC5pbiA9IGluOyB0ZC5vdXQgPSBvdXQ7CiAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHMtPmRlYmFuZCwgJnRkLCBOVUxMLCBGRk1JTjMocy0+cGxhbmVoZWlnaHRbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVoZWlnaHRbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAKICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZGVjaW1hdGUuYyBiL2xpYmF2ZmlsdGVyL3ZmX2RlY2ltYXRlLmMKaW5kZXggZTJjMGEzMi4uNTMzNDdjNyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZGVjaW1hdGUuYworKysgYi9saWJhdmZpbHRlci92Zl9kZWNpbWF0ZS5jCkBAIC0zNCw3ICszNCw3IEBACiAgICAgaW50NjRfdCB0b3RkaWZmOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRGVjaW1hdGVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBzdHJ1Y3QgcWl0ZW0gKnF1ZXVlOyAgICAvLy88IHdpbmRvdyBvZiBjeWNsZSBmcmFtZXMgYW5kIHRoZSBhc3NvY2lhdGVkIGRhdGEgZGlmZgogICAgIGludCBmaWQ7ICAgICAgICAgICAgICAgIC8vLzwgY3VycmVudCBmcmFtZSBpZCBpbiB0aGUgcXVldWUKQEAgLTE2NCw5ICsxNjQsMTIgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgZG0tPmdvdF9mcmFtZVtJTlBVVF9NQUlOXSA9IGRtLT5nb3RfZnJhbWVbSU5QVVRfQ0xFQU5TUkNdID0gMDsKIAorICAgIGlmIChkbS0+cHBzcmMpCisgICAgICAgIGluID0gZG0tPmNsZWFuX3NyY1tkbS0+ZmlkXTsKKwogICAgIGlmIChpbikgewogICAgICAgICAvKiB1cGRhdGUgZnJhbWUgbWV0cmljcyAqLwotICAgICAgICBwcnYgPSBkbS0+ZmlkID8gZG0tPnF1ZXVlW2RtLT5maWQgLSAxXS5mcmFtZSA6IGRtLT5sYXN0OworICAgICAgICBwcnYgPSBkbS0+ZmlkID8gKGRtLT5wcHNyYyA/IGRtLT5jbGVhbl9zcmNbZG0tPmZpZCAtIDFdIDogZG0tPnF1ZXVlW2RtLT5maWQgLSAxXS5mcmFtZSkgOiBkbS0+bGFzdDsKICAgICAgICAgaWYgKCFwcnYpIHsKICAgICAgICAgICAgIGRtLT5xdWV1ZVtkbS0+ZmlkXS5tYXhiZGlmZiA9IElOVDY0X01BWDsKICAgICAgICAgICAgIGRtLT5xdWV1ZVtkbS0+ZmlkXS50b3RkaWZmICA9IElOVDY0X01BWDsKQEAgLTIyMCw3ICsyMjMsNyBAQAogICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKICAgICAgICAgICAgICAgICBmcmFtZSA9IGRtLT5jbGVhbl9zcmNbaV07CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9xKG91dGxpbmstPmZyYW1lX2NvdW50LCBkbS0+dHNfdW5pdCwgKEFWUmF0aW9uYWwpezEsMX0pICsKKyAgICAgICAgICAgIGZyYW1lLT5wdHMgPSBhdl9yZXNjYWxlX3Eob3V0bGluay0+ZnJhbWVfY291bnRfaW4sIGRtLT50c191bml0LCAoQVZSYXRpb25hbCl7MSwxfSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgIChkbS0+c3RhcnRfcHRzID09IEFWX05PUFRTX1ZBTFVFID8gMCA6IGRtLT5zdGFydF9wdHMpOwogICAgICAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGZyYW1lKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtMjczLDE3ICsyNzYsMjQgQEAKICAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKICAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKICAgICB9OworICAgIGludCByZXQ7CiAKICAgICBpZiAoIXBhZC5uYW1lKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIGZmX2luc2VydF9pbnBhZChjdHgsIElOUFVUX01BSU4sICZwYWQpOworICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X2lucGFkKGN0eCwgSU5QVVRfTUFJTiwgJnBhZCkpIDwgMCkgeworICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KIAogICAgIGlmIChkbS0+cHBzcmMpIHsKICAgICAgICAgcGFkLm5hbWUgPSBhdl9zdHJkdXAoImNsZWFuX3NyYyIpOwogICAgICAgICBwYWQuY29uZmlnX3Byb3BzID0gTlVMTDsKICAgICAgICAgaWYgKCFwYWQubmFtZSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGZmX2luc2VydF9pbnBhZChjdHgsIElOUFVUX0NMRUFOU1JDLCAmcGFkKTsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9pbnNlcnRfaW5wYWQoY3R4LCBJTlBVVF9DTEVBTlNSQywgJnBhZCkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnBhZC5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoKGRtLT5ibG9ja3ggJiAoZG0tPmJsb2NreCAtIDEpKSB8fApAQCAtMzY1LDggKzM3NSw2IEBACiAgICAgRGVjaW1hdGVDb250ZXh0ICpkbSA9IGN0eC0+cHJpdjsKICAgICBjb25zdCBBVkZpbHRlckxpbmsgKmlubGluayA9CiAgICAgICAgIGN0eC0+aW5wdXRzW2RtLT5wcHNyYyA/IElOUFVUX0NMRUFOU1JDIDogSU5QVVRfTUFJTl07Ci0gICAgY29uc3QgQVZGaWx0ZXJMaW5rICppbmxpbmtfbWFpbiA9Ci0gICAgICAgIGN0eC0+aW5wdXRzW0lOUFVUX01BSU5dOwogICAgIEFWUmF0aW9uYWwgZnBzID0gaW5saW5rLT5mcmFtZV9yYXRlOwogCiAgICAgaWYgKCFmcHMubnVtIHx8ICFmcHMuZGVuKSB7CkBAIC0zNzQsMTMgKzM4Miw2IEBACiAgICAgICAgICAgICAgICAiY3VycmVudCByYXRlIG9mICVkLyVkIGlzIGludmFsaWRcbiIsIGZwcy5udW0sIGZwcy5kZW4pOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KLQotICAgIGlmIChpbmxpbmstPncgIT0gaW5saW5rX21haW4tPncgfHwKLSAgICAgICAgaW5saW5rLT5oICE9IGlubGlua19tYWluLT5oIHx8Ci0gICAgICAgIGlubGluay0+Zm9ybWF0ICE9IGlubGlua19tYWluLT5mb3JtYXQpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiZnJhbWUgcGFyYW1ldGVycyBkaWZmZXIgYmV0d2VlbiBpbnB1dHNcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7Ci0gICAgfQogICAgIGZwcyA9IGF2X211bF9xKGZwcywgKEFWUmF0aW9uYWwpe2RtLT5jeWNsZSAtIDEsIGRtLT5jeWNsZX0pOwogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiRlBTOiAlZC8lZCAtPiAlZC8lZFxuIiwKICAgICAgICAgICAgaW5saW5rLT5mcmFtZV9yYXRlLm51bSwgaW5saW5rLT5mcmFtZV9yYXRlLmRlbiwgZnBzLm51bSwgZnBzLmRlbik7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9kZWZsaWNrZXIuYyBiL2xpYmF2ZmlsdGVyL3ZmX2RlZmxpY2tlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2M2EzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9kZWZsaWNrZXIuYwpAQCAtMCwwICsxLDQ3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9xc29ydC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisKKyNkZWZpbmUgRkZfQlVGUVVFVUVfU0laRSAxMjkKKyNpbmNsdWRlICJidWZmZXJxdWV1ZS5oIgorCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2RlZmluZSBTSVpFIEZGX0JVRlFVRVVFX1NJWkUKKworZW51bSBzbW9vdGhfbW9kZSB7CisgICAgQVJJVEhNRVRJQ19NRUFOLAorICAgIEdFT01FVFJJQ19NRUFOLAorICAgIEhBUk1PTklDX01FQU4sCisgICAgUVVBRFJBVElDX01FQU4sCisgICAgQ1VCSUNfTUVBTiwKKyAgICBQT1dFUl9NRUFOLAorICAgIE1FRElBTiwKKyAgICBOQl9TTU9PVEhfTU9ERSwKK307CisKK3R5cGVkZWYgc3RydWN0IERlZmxpY2tlckNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgaW50IHNpemU7CisgICAgaW50IG1vZGU7CisgICAgaW50IGJ5cGFzczsKKworICAgIGludCBlb2Y7CisgICAgaW50IGRlcHRoOworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IHBsYW5ld2lkdGhbNF07CisgICAgaW50IHBsYW5laGVpZ2h0WzRdOworCisgICAgdWludDY0X3QgKmhpc3RvZ3JhbTsKKyAgICBmbG9hdCBsdW1pbmFuY2VbU0laRV07CisgICAgZmxvYXQgc29ydGVkW1NJWkVdOworCisgICAgc3RydWN0IEZGQnVmUXVldWUgcTsKKyAgICBpbnQgYXZhaWxhYmxlOworCisgICAgdm9pZCAoKmdldF9mYWN0b3IpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBmbG9hdCAqZik7CisgICAgZmxvYXQgKCpjYWxjX2F2Z3kpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbik7CisgICAgaW50ICgqZGVmbGlja2VyKShBVkZpbHRlckNvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLCBpbnQgdywgaW50IGgsIGZsb2F0IGYpOworfSBEZWZsaWNrZXJDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihEZWZsaWNrZXJDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGRlZmxpY2tlcl9vcHRpb25zW10gPSB7CisgICAgeyAic2l6ZSIsICAic2V0IGhvdyBtYW55IGZyYW1lcyB0byB1c2UiLCAgT0ZGU0VUKHNpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTV9LCAyLCBTSVpFLCBGTEFHUyB9LAorICAgIHsgInMiLCAgICAgInNldCBob3cgbWFueSBmcmFtZXMgdG8gdXNlIiwgIE9GRlNFVChzaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND01fSwgMiwgU0laRSwgRkxBR1MgfSwKKyAgICB7ICJtb2RlIiwgICJzZXQgaG93IHRvIHNtb290aCBsdW1pbmFuY2UiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIE5CX1NNT09USF9NT0RFLTEsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJtIiwgICAgICJzZXQgaG93IHRvIHNtb290aCBsdW1pbmFuY2UiLCBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIE5CX1NNT09USF9NT0RFLTEsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAiYW0iLCAgICAgICJhcml0aG1ldGljIG1lYW4iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QVJJVEhNRVRJQ19NRUFOfSwgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAiZ20iLCAgICAgICJnZW9tZXRyaWMgbWVhbiIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9R0VPTUVUUklDX01FQU59LCAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAiaG0iLCAgICAgICJoYXJtb25pYyBtZWFuIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9SEFSTU9OSUNfTUVBTn0sICAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAicW0iLCAgICAgICJxdWFkcmF0aWMgbWVhbiIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UVVBRFJBVElDX01FQU59LCAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAiY20iLCAgICAgICJjdWJpYyBtZWFuIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q1VCSUNfTUVBTn0sICAgICAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAicG0iLCAgICAgICJwb3dlciBtZWFuIiwgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UE9XRVJfTUVBTn0sICAgICAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAibWVkaWFuIiwgICJtZWRpYW4iLCAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9TUVESUFOfSwgICAgICAgICAgIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJieXBhc3MiLCAibGVhdmUgZnJhbWVzIHVuY2hhbmdlZCIsICBPRkZTRVQoYnlwYXNzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhkZWZsaWNrZXIpOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhlbF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTksIEFWX1BJWF9GTVRfR1JBWTEwLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxMiwgQVZfUElYX0ZNVF9HUkFZMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDksIEFWX1BJWF9GTVRfWVVWNDIyUDksIEFWX1BJWF9GTVRfWVVWNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDIwUDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQyMFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeGVsX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7Cit9CisKK3N0YXRpYyBpbnQgZGVmbGlja2VyOChBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgZmxvYXQgZikKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF91aW50OChzcmNbeF0gKiBmKTsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCArPSBkc3RfbGluZXNpemU7CisgICAgICAgIHNyYyArPSBzcmNfbGluZXNpemU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVmbGlja2VyMTYoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNzcmMsIHB0cmRpZmZfdCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgZmxvYXQgZikKK3sKKyAgICBEZWZsaWNrZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKilzc3JjOworICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilkZHN0OworICAgIGNvbnN0IGludCBtYXggPSAoMSA8PCBzLT5kZXB0aCkgLSAxOworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwKHNyY1t4XSAqIGYsIDAsIG1heCk7CisgICAgICAgIH0KKworICAgICAgICBkc3QgKz0gZHN0X2xpbmVzaXplIC8gMjsKKyAgICAgICAgc3JjICs9IHNyY19saW5lc2l6ZSAvIDI7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBmbG9hdCBjYWxjX2F2Z3k4KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbikKK3sKKyAgICBEZWZsaWNrZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IGluLT5kYXRhWzBdOworICAgIGludDY0X3Qgc3VtID0gMDsKKyAgICBpbnQgeSwgeDsKKworICAgIG1lbXNldChzLT5oaXN0b2dyYW0sIDAsICgxIDw8IHMtPmRlcHRoKSAqIHNpemVvZigqcy0+aGlzdG9ncmFtKSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+cGxhbmVoZWlnaHRbMF07IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+cGxhbmV3aWR0aFswXTsgeCsrKSB7CisgICAgICAgICAgICBzLT5oaXN0b2dyYW1bc3JjW3hdXSsrOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBpbi0+bGluZXNpemVbMF07CisgICAgfQorCisgICAgZm9yICh5ID0gMDsgeSA8IDEgPDwgcy0+ZGVwdGg7IHkrKykgeworICAgICAgICBzdW0gKz0gcy0+aGlzdG9ncmFtW3ldICogeTsKKyAgICB9CisKKyAgICByZXR1cm4gMS4wZiAqIHN1bSAvIChzLT5wbGFuZWhlaWdodFswXSAqIHMtPnBsYW5ld2lkdGhbMF0pOworfQorCitzdGF0aWMgZmxvYXQgY2FsY19hdmd5MTYoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmluKQoreworICAgIERlZmxpY2tlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgdWludDE2X3QgKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKWluLT5kYXRhWzBdOworICAgIGludDY0X3Qgc3VtID0gMDsKKyAgICBpbnQgeSwgeDsKKworICAgIG1lbXNldChzLT5oaXN0b2dyYW0sIDAsICgxIDw8IHMtPmRlcHRoKSAqIHNpemVvZigqcy0+aGlzdG9ncmFtKSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+cGxhbmVoZWlnaHRbMF07IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+cGxhbmV3aWR0aFswXTsgeCsrKSB7CisgICAgICAgICAgICBzLT5oaXN0b2dyYW1bc3JjW3hdXSsrOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBpbi0+bGluZXNpemVbMF0gLyAyOworICAgIH0KKworICAgIGZvciAoeSA9IDA7IHkgPCAxIDw8IHMtPmRlcHRoOyB5KyspIHsKKyAgICAgICAgc3VtICs9IHMtPmhpc3RvZ3JhbVt5XSAqIHk7CisgICAgfQorCisgICAgcmV0dXJuIDEuMGYgKiBzdW0gLyAocy0+cGxhbmVoZWlnaHRbMF0gKiBzLT5wbGFuZXdpZHRoWzBdKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2FtX2ZhY3RvcihBVkZpbHRlckNvbnRleHQgKmN0eCwgZmxvYXQgKmYpCit7CisgICAgRGVmbGlja2VyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgeTsKKworICAgICpmID0gMC4wZjsKKworICAgIGZvciAoeSA9IDA7IHkgPCBzLT5zaXplOyB5KyspIHsKKyAgICAgICAgKmYgKz0gcy0+bHVtaW5hbmNlW3ldOworICAgIH0KKworICAgICpmIC89IHMtPnNpemU7CisgICAgKmYgLz0gcy0+bHVtaW5hbmNlWzBdOworfQorCitzdGF0aWMgdm9pZCBnZXRfZ21fZmFjdG9yKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBmbG9hdCAqZikKK3sKKyAgICBEZWZsaWNrZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCB5OworCisgICAgKmYgPSAxOworCisgICAgZm9yICh5ID0gMDsgeSA8IHMtPnNpemU7IHkrKykgeworICAgICAgICAqZiAqPSBzLT5sdW1pbmFuY2VbeV07CisgICAgfQorCisgICAgKmYgPSBwb3coKmYsIDEuMGYgLyBzLT5zaXplKTsKKyAgICAqZiAvPSBzLT5sdW1pbmFuY2VbMF07Cit9CisKK3N0YXRpYyB2b2lkIGdldF9obV9mYWN0b3IoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGZsb2F0ICpmKQoreworICAgIERlZmxpY2tlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHk7CisKKyAgICAqZiA9IDAuMGY7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgcy0+c2l6ZTsgeSsrKSB7CisgICAgICAgICpmICs9IDEuMGYgLyBzLT5sdW1pbmFuY2VbeV07CisgICAgfQorCisgICAgKmYgPSBzLT5zaXplIC8gKmY7CisgICAgKmYgLz0gcy0+bHVtaW5hbmNlWzBdOworfQorCitzdGF0aWMgdm9pZCBnZXRfcW1fZmFjdG9yKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBmbG9hdCAqZikKK3sKKyAgICBEZWZsaWNrZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCB5OworCisgICAgKmYgPSAwLjBmOworCisgICAgZm9yICh5ID0gMDsgeSA8IHMtPnNpemU7IHkrKykgeworICAgICAgICAqZiArPSBzLT5sdW1pbmFuY2VbeV0gKiBzLT5sdW1pbmFuY2VbeV07CisgICAgfQorCisgICAgKmYgLz0gcy0+c2l6ZTsKKyAgICAqZiAgPSBzcXJ0ZigqZik7CisgICAgKmYgLz0gcy0+bHVtaW5hbmNlWzBdOworfQorCitzdGF0aWMgdm9pZCBnZXRfY21fZmFjdG9yKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBmbG9hdCAqZikKK3sKKyAgICBEZWZsaWNrZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCB5OworCisgICAgKmYgPSAwLjBmOworCisgICAgZm9yICh5ID0gMDsgeSA8IHMtPnNpemU7IHkrKykgeworICAgICAgICAqZiArPSBzLT5sdW1pbmFuY2VbeV0gKiBzLT5sdW1pbmFuY2VbeV0gKiBzLT5sdW1pbmFuY2VbeV07CisgICAgfQorCisgICAgKmYgLz0gcy0+c2l6ZTsKKyAgICAqZiAgPSBjYnJ0ZigqZik7CisgICAgKmYgLz0gcy0+bHVtaW5hbmNlWzBdOworfQorCitzdGF0aWMgdm9pZCBnZXRfcG1fZmFjdG9yKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBmbG9hdCAqZikKK3sKKyAgICBEZWZsaWNrZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCB5OworCisgICAgKmYgPSAwLjBmOworCisgICAgZm9yICh5ID0gMDsgeSA8IHMtPnNpemU7IHkrKykgeworICAgICAgICAqZiArPSBwb3dmKHMtPmx1bWluYW5jZVt5XSwgcy0+c2l6ZSk7CisgICAgfQorCisgICAgKmYgLz0gcy0+c2l6ZTsKKyAgICAqZiAgPSBwb3dmKCpmLCAxLjBmIC8gcy0+c2l6ZSk7CisgICAgKmYgLz0gcy0+bHVtaW5hbmNlWzBdOworfQorCitzdGF0aWMgaW50IGNvbXBhcmVmKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgZmxvYXQgKmFhID0gYSwgKmJiID0gYjsKKyAgICByZXR1cm4gcm91bmQoYWEgLSBiYik7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9tZWRpYW5fZmFjdG9yKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBmbG9hdCAqZikKK3sKKyAgICBEZWZsaWNrZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgbWVtY3B5KHMtPnNvcnRlZCwgcy0+bHVtaW5hbmNlLCBzaXplb2Yocy0+c29ydGVkKSk7CisgICAgQVZfUVNPUlQocy0+c29ydGVkLCBzLT5zaXplLCBmbG9hdCwgY29tcGFyZWYpOworCisgICAgKmYgPSBzLT5zb3J0ZWRbcy0+c2l6ZSA+PiAxXSAvIHMtPmx1bWluYW5jZVswXTsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBEZWZsaWNrZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcy0+bmJfcGxhbmVzID0gZGVzYy0+bmJfY29tcG9uZW50czsKKworICAgIHMtPnBsYW5laGVpZ2h0WzFdID0gcy0+cGxhbmVoZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIHMtPnBsYW5laGVpZ2h0WzBdID0gcy0+cGxhbmVoZWlnaHRbM10gPSBpbmxpbmstPmg7CisgICAgcy0+cGxhbmV3aWR0aFsxXSAgPSBzLT5wbGFuZXdpZHRoWzJdICA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgcy0+cGxhbmV3aWR0aFswXSAgPSBzLT5wbGFuZXdpZHRoWzNdICA9IGlubGluay0+dzsKKworICAgIHMtPmRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBpZiAocy0+ZGVwdGggPT0gOCkgeworICAgICAgICBzLT5kZWZsaWNrZXIgPSBkZWZsaWNrZXI4OworICAgICAgICBzLT5jYWxjX2F2Z3kgPSBjYWxjX2F2Z3k4OworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmRlZmxpY2tlciA9IGRlZmxpY2tlcjE2OworICAgICAgICBzLT5jYWxjX2F2Z3kgPSBjYWxjX2F2Z3kxNjsKKyAgICB9CisKKyAgICBzLT5oaXN0b2dyYW0gPSBhdl9jYWxsb2MoMSA8PCBzLT5kZXB0aCwgc2l6ZW9mKCpzLT5oaXN0b2dyYW0pKTsKKyAgICBpZiAoIXMtPmhpc3RvZ3JhbSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN3aXRjaCAocy0+bW9kZSkgeworICAgIGNhc2UgTUVESUFOOiAgICAgICAgICBzLT5nZXRfZmFjdG9yID0gZ2V0X21lZGlhbl9mYWN0b3I7IGJyZWFrOworICAgIGNhc2UgQVJJVEhNRVRJQ19NRUFOOiBzLT5nZXRfZmFjdG9yID0gZ2V0X2FtX2ZhY3RvcjsgICAgIGJyZWFrOworICAgIGNhc2UgR0VPTUVUUklDX01FQU46ICBzLT5nZXRfZmFjdG9yID0gZ2V0X2dtX2ZhY3RvcjsgICAgIGJyZWFrOworICAgIGNhc2UgSEFSTU9OSUNfTUVBTjogICBzLT5nZXRfZmFjdG9yID0gZ2V0X2htX2ZhY3RvcjsgICAgIGJyZWFrOworICAgIGNhc2UgUVVBRFJBVElDX01FQU46ICBzLT5nZXRfZmFjdG9yID0gZ2V0X3FtX2ZhY3RvcjsgICAgIGJyZWFrOworICAgIGNhc2UgQ1VCSUNfTUVBTjogICAgICBzLT5nZXRfZmFjdG9yID0gZ2V0X2NtX2ZhY3RvcjsgICAgIGJyZWFrOworICAgIGNhc2UgUE9XRVJfTUVBTjogICAgICBzLT5nZXRfZmFjdG9yID0gZ2V0X3BtX2ZhY3RvcjsgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqYnVmKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIERlZmxpY2tlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGE7CisgICAgQVZGcmFtZSAqb3V0LCAqaW47CisgICAgZmxvYXQgZjsKKyAgICBpbnQgeTsKKworICAgIGlmIChzLT5xLmF2YWlsYWJsZSA8IHMtPnNpemUgJiYgIXMtPmVvZikgeworICAgICAgICBzLT5sdW1pbmFuY2Vbcy0+YXZhaWxhYmxlXSA9IHMtPmNhbGNfYXZneShjdHgsIGJ1Zik7CisgICAgICAgIGZmX2J1ZnF1ZXVlX2FkZChjdHgsICZzLT5xLCBidWYpOworICAgICAgICBzLT5hdmFpbGFibGUrKzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaW4gPSBmZl9idWZxdWV1ZV9wZWVrKCZzLT5xLCAwKTsKKworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzLT5nZXRfZmFjdG9yKGN0eCwgJmYpOworICAgIGlmICghcy0+YnlwYXNzKQorICAgICAgICBzLT5kZWZsaWNrZXIoY3R4LCBpbi0+ZGF0YVswXSwgaW4tPmxpbmVzaXplWzBdLCBvdXQtPmRhdGFbMF0sIG91dC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT53LCBvdXRsaW5rLT5oLCBmKTsKKyAgICBmb3IgKHkgPSAxIC0gcy0+YnlwYXNzOyB5IDwgcy0+bmJfcGxhbmVzOyB5KyspIHsKKyAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbeV0sIG91dC0+bGluZXNpemVbeV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbeV0sIGluLT5saW5lc2l6ZVt5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZXdpZHRoW3ldICogKDEgKyAocy0+ZGVwdGggPiA4KSksIHMtPnBsYW5laGVpZ2h0W3ldKTsKKyAgICB9CisKKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIG1ldGFkYXRhID0gJm91dC0+bWV0YWRhdGE7CisgICAgaWYgKG1ldGFkYXRhKSB7CisgICAgICAgIHVpbnQ4X3QgdmFsdWVbMTI4XTsKKworICAgICAgICBzbnByaW50Zih2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwgIiVmIiwgcy0+bHVtaW5hbmNlWzBdKTsKKyAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsICJsYXZmaS5kZWZsaWNrZXIubHVtaW5hbmNlIiwgdmFsdWUsIDApOworCisgICAgICAgIHNucHJpbnRmKHZhbHVlLCBzaXplb2YodmFsdWUpLCAiJWYiLCBzLT5sdW1pbmFuY2VbMF0gKiBmKTsKKyAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsICJsYXZmaS5kZWZsaWNrZXIubmV3X2x1bWluYW5jZSIsIHZhbHVlLCAwKTsKKworICAgICAgICBzbnByaW50Zih2YWx1ZSwgc2l6ZW9mKHZhbHVlKSwgIiVmIiwgZiAtIDEuMGYpOworICAgICAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwgImxhdmZpLmRlZmxpY2tlci5yZWxhdGl2ZV9jaGFuZ2UiLCB2YWx1ZSwgMCk7CisgICAgfQorCisgICAgaW4gPSBmZl9idWZxdWV1ZV9nZXQoJnMtPnEpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICBtZW1tb3ZlKCZzLT5sdW1pbmFuY2VbMF0sICZzLT5sdW1pbmFuY2VbMV0sIHNpemVvZigqcy0+bHVtaW5hbmNlKSAqIChzLT5zaXplIC0gMSkpOworICAgIHMtPmx1bWluYW5jZVtzLT5hdmFpbGFibGUgLSAxXSA9IHMtPmNhbGNfYXZneShjdHgsIGJ1Zik7CisgICAgZmZfYnVmcXVldWVfYWRkKGN0eCwgJnMtPnEsIGJ1Zik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgRGVmbGlja2VyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBzLT5hdmFpbGFibGUgPiAwKSB7CisgICAgICAgIEFWRnJhbWUgKmJ1ZiA9IGF2X2ZyYW1lX2Nsb25lKGZmX2J1ZnF1ZXVlX3BlZWsoJnMtPnEsIHMtPnNpemUgLSAxKSk7CisgICAgICAgIGlmICghYnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBzLT5lb2YgPSAxOworICAgICAgICByZXQgPSBmaWx0ZXJfZnJhbWUoY3R4LT5pbnB1dHNbMF0sIGJ1Zik7CisgICAgICAgIHMtPmF2YWlsYWJsZS0tOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERlZmxpY2tlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBmZl9idWZxdWV1ZV9kaXNjYXJkX2FsbCgmcy0+cSk7CisgICAgYXZfZnJlZXAoJnMtPmhpc3RvZ3JhbSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2RlZmxpY2tlciA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJkZWZsaWNrZXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlbW92ZSB0ZW1wb3JhbCBmcmFtZSBsdW1pbmFuY2UgdmFyaWF0aW9ucy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihEZWZsaWNrZXJDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZkZWZsaWNrZXJfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9kZWludGVybGFjZV9xc3YuYyBiL2xpYmF2ZmlsdGVyL3ZmX2RlaW50ZXJsYWNlX3Fzdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTc2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9kZWludGVybGFjZV9xc3YuYwpAQCAtMCwwICsxLDU5NiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBkZWludGVybGFjZSB2aWRlbyBmaWx0ZXIgLSBRU1YKKyAqLworCisjaW5jbHVkZSA8bWZ4L21meHZpZGVvLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X3Fzdi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvcXN2dnBwLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK2VudW0geworICAgIFFTVkRFSU5UX01PUkVfT1VUUFVUID0gMSwKKyAgICBRU1ZERUlOVF9NT1JFX0lOUFVULAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUVNWRnJhbWUgeworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIG1meEZyYW1lU3VyZmFjZTEgc3VyZmFjZTsKKyAgICBpbnQgdXNlZDsKKworICAgIHN0cnVjdCBRU1ZGcmFtZSAqbmV4dDsKK30gUVNWRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IFFTVkRlaW50Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eDsKKyAgICAvKiBhIGNsb25lIG9mIHRoZSBtYWluIHNlc3Npb24sIHVzZWQgaW50ZXJuYWxseSBmb3IgZGVpbnRlcmxhY2luZyAqLworICAgIG1meFNlc3Npb24gICBzZXNzaW9uOworCisgICAgbWZ4TWVtSWQgKm1lbV9pZHM7CisgICAgaW50ICAgIG5iX21lbV9pZHM7CisKKyAgICBtZnhGcmFtZVN1cmZhY2UxICoqc3VyZmFjZV9wdHJzOworICAgIGludCAgICAgICAgICAgICBuYl9zdXJmYWNlX3B0cnM7CisKKyAgICBtZnhFeHRPcGFxdWVTdXJmYWNlQWxsb2Mgb3BhcXVlX2FsbG9jOworICAgIG1meEV4dFZQUERlaW50ZXJsYWNpbmcgICBkZWludF9jb25mOworICAgIG1meEV4dEJ1ZmZlciAgICAgICAgICAgICpleHRfYnVmZmVyc1syXTsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgbnVtX2V4dF9idWZmZXJzOworCisgICAgUVNWRnJhbWUgKndvcmtfZnJhbWVzOworCisgICAgaW50NjRfdCBsYXN0X3B0czsKKworICAgIGludCBlb2Y7CisKKyAgICAvKiBvcHRpb24gZm9yIERlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIHRvIGJlIHVzZWQgKi8KKyAgICBpbnQgbW9kZTsKK30gUVNWRGVpbnRDb250ZXh0OworCitzdGF0aWMgdm9pZCBxc3ZkZWludF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUVNWRGVpbnRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFFTVkZyYW1lICpjdXI7CisKKyAgICBpZiAocy0+c2Vzc2lvbikgeworICAgICAgICBNRlhDbG9zZShzLT5zZXNzaW9uKTsKKyAgICAgICAgcy0+c2Vzc2lvbiA9IE5VTEw7CisgICAgfQorICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+aHdfZnJhbWVzX2N0eCk7CisKKyAgICBjdXIgPSBzLT53b3JrX2ZyYW1lczsKKyAgICB3aGlsZSAoY3VyKSB7CisgICAgICAgIHMtPndvcmtfZnJhbWVzID0gY3VyLT5uZXh0OworICAgICAgICBhdl9mcmFtZV9mcmVlKCZjdXItPmZyYW1lKTsKKyAgICAgICAgYXZfZnJlZXAoJmN1cik7CisgICAgICAgIGN1ciA9IHMtPndvcmtfZnJhbWVzOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZzLT5tZW1faWRzKTsKKyAgICBzLT5uYl9tZW1faWRzID0gMDsKKworICAgIGF2X2ZyZWVwKCZzLT5zdXJmYWNlX3B0cnMpOworICAgIHMtPm5iX3N1cmZhY2VfcHRycyA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcXN2ZGVpbnRfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9RU1YsIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9OworICAgIEFWRmlsdGVyRm9ybWF0cyAqcGl4X2ZtdHMgID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhlbF9mb3JtYXRzKTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX2FsbG9jKG1meEhETCBwdGhpcywgbWZ4RnJhbWVBbGxvY1JlcXVlc3QgKnJlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWZ4RnJhbWVBbGxvY1Jlc3BvbnNlICpyZXNwKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gcHRoaXM7CisgICAgUVNWRGVpbnRDb250ZXh0ICAgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoIShyZXEtPlR5cGUgJiBNRlhfTUVNVFlQRV9WSURFT19NRU1PUllfUFJPQ0VTU09SX1RBUkdFVCkgfHwKKyAgICAgICAgIShyZXEtPlR5cGUgJiAoTUZYX01FTVRZUEVfRlJPTV9WUFBJTiB8IE1GWF9NRU1UWVBFX0ZST01fVlBQT1VUKSkgfHwKKyAgICAgICAgIShyZXEtPlR5cGUgJiBNRlhfTUVNVFlQRV9FWFRFUk5BTF9GUkFNRSkpCisgICAgICAgIHJldHVybiBNRlhfRVJSX1VOU1VQUE9SVEVEOworCisgICAgcmVzcC0+bWlkcyAgICAgICAgICAgPSBzLT5tZW1faWRzOworICAgIHJlc3AtPk51bUZyYW1lQWN0dWFsID0gcy0+bmJfbWVtX2lkczsKKworICAgIHJldHVybiBNRlhfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBtZnhTdGF0dXMgZnJhbWVfZnJlZShtZnhIREwgcHRoaXMsIG1meEZyYW1lQWxsb2NSZXNwb25zZSAqcmVzcCkKK3sKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX2xvY2sobWZ4SERMIHB0aGlzLCBtZnhNZW1JZCBtaWQsIG1meEZyYW1lRGF0YSAqcHRyKQoreworICAgIHJldHVybiBNRlhfRVJSX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX3VubG9jayhtZnhIREwgcHRoaXMsIG1meE1lbUlkIG1pZCwgbWZ4RnJhbWVEYXRhICpwdHIpCit7CisgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBtZnhTdGF0dXMgZnJhbWVfZ2V0X2hkbChtZnhIREwgcHRoaXMsIG1meE1lbUlkIG1pZCwgbWZ4SERMICpoZGwpCit7CisgICAgKmhkbCA9IG1pZDsKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworfQorCitzdGF0aWMgY29uc3QgbWZ4SGFuZGxlVHlwZSBoYW5kbGVfdHlwZXNbXSA9IHsKKyAgICBNRlhfSEFORExFX1ZBX0RJU1BMQVksCisgICAgTUZYX0hBTkRMRV9EM0Q5X0RFVklDRV9NQU5BR0VSLAorICAgIE1GWF9IQU5ETEVfRDNEMTFfREVWSUNFLAorfTsKKworc3RhdGljIGludCBpbml0X291dF9zZXNzaW9uKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworCisgICAgUVNWRGVpbnRDb250ZXh0ICAgICAgICAgICAgICAgICAgKnMgPSBjdHgtPnByaXY7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAgKmh3X2ZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKXMtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICpod19mcmFtZXNfaHdjdHggPSBod19mcmFtZXNfY3R4LT5od2N0eDsKKyAgICBBVlFTVkRldmljZUNvbnRleHQgICAgKmRldmljZV9od2N0eCA9IGh3X2ZyYW1lc19jdHgtPmRldmljZV9jdHgtPmh3Y3R4OworCisgICAgaW50IG9wYXF1ZSA9ICEhKGh3X2ZyYW1lc19od2N0eC0+ZnJhbWVfdHlwZSAmIE1GWF9NRU1UWVBFX09QQVFVRV9GUkFNRSk7CisKKyAgICBtZnhIREwgaGFuZGxlID0gTlVMTDsKKyAgICBtZnhIYW5kbGVUeXBlIGhhbmRsZV90eXBlOworICAgIG1meFZlcnNpb24gdmVyOworICAgIG1meElNUEwgaW1wbDsKKyAgICBtZnhWaWRlb1BhcmFtIHBhcjsKKyAgICBtZnhTdGF0dXMgZXJyOworICAgIGludCBpOworCisgICAgLyogZXh0cmFjdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgIm1hc3RlciIgc2Vzc2lvbiBnaXZlbiB0byB1cyAqLworICAgIGVyciA9IE1GWFF1ZXJ5SU1QTChkZXZpY2VfaHdjdHgtPnNlc3Npb24sICZpbXBsKTsKKyAgICBpZiAoZXJyID09IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgZXJyID0gTUZYUXVlcnlWZXJzaW9uKGRldmljZV9od2N0eC0+c2Vzc2lvbiwgJnZlcik7CisgICAgaWYgKGVyciAhPSBNRlhfRVJSX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcXVlcnlpbmcgdGhlIHNlc3Npb24gYXR0cmlidXRlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGhhbmRsZV90eXBlcyk7IGkrKykgeworICAgICAgICBlcnIgPSBNRlhWaWRlb0NPUkVfR2V0SGFuZGxlKGRldmljZV9od2N0eC0+c2Vzc2lvbiwgaGFuZGxlX3R5cGVzW2ldLCAmaGFuZGxlKTsKKyAgICAgICAgaWYgKGVyciA9PSBNRlhfRVJSX05PTkUpIHsKKyAgICAgICAgICAgIGhhbmRsZV90eXBlID0gaGFuZGxlX3R5cGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjcmVhdGUgYSAic2xhdmUiIHNlc3Npb24gd2l0aCB0aG9zZSBzYW1lIHByb3BlcnRpZXMsIHRvIGJlIHVzZWQgZm9yCisgICAgICogYWN0dWFsIGRlaW50ZXJsYWNpbmcgKi8KKyAgICBlcnIgPSBNRlhJbml0KGltcGwsICZ2ZXIsICZzLT5zZXNzaW9uKTsKKyAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgYSBzZXNzaW9uIGZvciBkZWludGVybGFjaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgIGVyciA9IE1GWFZpZGVvQ09SRV9TZXRIYW5kbGUocy0+c2Vzc2lvbiwgaGFuZGxlX3R5cGUsIGhhbmRsZSk7CisgICAgICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoUVNWX1JVTlRJTUVfVkVSU0lPTl9BVExFQVNUKHZlciwgMSwgMjUpKSB7CisgICAgICAgIGVyciA9IE1GWEpvaW5TZXNzaW9uKGRldmljZV9od2N0eC0+c2Vzc2lvbiwgcy0+c2Vzc2lvbik7CisgICAgICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBtZW1zZXQoJnBhciwgMCwgc2l6ZW9mKHBhcikpOworCisgICAgcy0+ZGVpbnRfY29uZi5IZWFkZXIuQnVmZmVySWQgPSBNRlhfRVhUQlVGRl9WUFBfREVJTlRFUkxBQ0lORzsKKyAgICBzLT5kZWludF9jb25mLkhlYWRlci5CdWZmZXJTeiA9IHNpemVvZihzLT5kZWludF9jb25mKTsKKyAgICBzLT5kZWludF9jb25mLk1vZGUgPSBzLT5tb2RlOworCisgICAgcy0+ZXh0X2J1ZmZlcnNbcy0+bnVtX2V4dF9idWZmZXJzKytdID0gKG1meEV4dEJ1ZmZlciAqKSZzLT5kZWludF9jb25mOworCisgICAgaWYgKG9wYXF1ZSkgeworICAgICAgICBzLT5zdXJmYWNlX3B0cnMgPSBhdl9tYWxsb2N6X2FycmF5KGh3X2ZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5zdXJmYWNlX3B0cnMpKTsKKyAgICAgICAgaWYgKCFzLT5zdXJmYWNlX3B0cnMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaHdfZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlczsgaSsrKQorICAgICAgICAgICAgcy0+c3VyZmFjZV9wdHJzW2ldID0gaHdfZnJhbWVzX2h3Y3R4LT5zdXJmYWNlcyArIGk7CisgICAgICAgIHMtPm5iX3N1cmZhY2VfcHRycyA9IGh3X2ZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7CisKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLkluLlN1cmZhY2VzICAgPSBzLT5zdXJmYWNlX3B0cnM7CisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5Jbi5OdW1TdXJmYWNlID0gcy0+bmJfc3VyZmFjZV9wdHJzOworICAgICAgICBzLT5vcGFxdWVfYWxsb2MuSW4uVHlwZSAgICAgICA9IGh3X2ZyYW1lc19od2N0eC0+ZnJhbWVfdHlwZTsKKworICAgICAgICBzLT5vcGFxdWVfYWxsb2MuT3V0ID0gcy0+b3BhcXVlX2FsbG9jLkluOworCisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5IZWFkZXIuQnVmZmVySWQgPSBNRlhfRVhUQlVGRl9PUEFRVUVfU1VSRkFDRV9BTExPQ0FUSU9OOworICAgICAgICBzLT5vcGFxdWVfYWxsb2MuSGVhZGVyLkJ1ZmZlclN6ID0gc2l6ZW9mKHMtPm9wYXF1ZV9hbGxvYyk7CisKKyAgICAgICAgcy0+ZXh0X2J1ZmZlcnNbcy0+bnVtX2V4dF9idWZmZXJzKytdID0gKG1meEV4dEJ1ZmZlciAqKSZzLT5vcGFxdWVfYWxsb2M7CisKKyAgICAgICAgcGFyLklPUGF0dGVybiA9IE1GWF9JT1BBVFRFUk5fSU5fT1BBUVVFX01FTU9SWSB8IE1GWF9JT1BBVFRFUk5fT1VUX09QQVFVRV9NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWZ4RnJhbWVBbGxvY2F0b3IgZnJhbWVfYWxsb2NhdG9yID0geworICAgICAgICAgICAgLnB0aGlzICA9IGN0eCwKKyAgICAgICAgICAgIC5BbGxvYyAgPSBmcmFtZV9hbGxvYywKKyAgICAgICAgICAgIC5Mb2NrICAgPSBmcmFtZV9sb2NrLAorICAgICAgICAgICAgLlVubG9jayA9IGZyYW1lX3VubG9jaywKKyAgICAgICAgICAgIC5HZXRIREwgPSBmcmFtZV9nZXRfaGRsLAorICAgICAgICAgICAgLkZyZWUgICA9IGZyYW1lX2ZyZWUsCisgICAgICAgIH07CisKKyAgICAgICAgcy0+bWVtX2lkcyA9IGF2X21hbGxvY3pfYXJyYXkoaHdfZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5tZW1faWRzKSk7CisgICAgICAgIGlmICghcy0+bWVtX2lkcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBod19mcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzOyBpKyspCisgICAgICAgICAgICBzLT5tZW1faWRzW2ldID0gaHdfZnJhbWVzX2h3Y3R4LT5zdXJmYWNlc1tpXS5EYXRhLk1lbUlkOworICAgICAgICBzLT5uYl9tZW1faWRzID0gaHdfZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlczsKKworICAgICAgICBlcnIgPSBNRlhWaWRlb0NPUkVfU2V0RnJhbWVBbGxvY2F0b3Iocy0+c2Vzc2lvbiwgJmZyYW1lX2FsbG9jYXRvcik7CisgICAgICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKworICAgICAgICBwYXIuSU9QYXR0ZXJuID0gTUZYX0lPUEFUVEVSTl9JTl9WSURFT19NRU1PUlkgfCBNRlhfSU9QQVRURVJOX09VVF9WSURFT19NRU1PUlk7CisgICAgfQorCisgICAgcGFyLkV4dFBhcmFtICAgID0gcy0+ZXh0X2J1ZmZlcnM7CisgICAgcGFyLk51bUV4dFBhcmFtID0gcy0+bnVtX2V4dF9idWZmZXJzOworCisgICAgcGFyLkFzeW5jRGVwdGggPSAxOyAgICAvLyBUT0RPIGFzeW5jCisKKyAgICBwYXIudnBwLkluID0gaHdfZnJhbWVzX2h3Y3R4LT5zdXJmYWNlc1swXS5JbmZvOworCisgICAgcGFyLnZwcC5Jbi5Dcm9wVyA9IGN0eC0+aW5wdXRzWzBdLT53OworICAgIHBhci52cHAuSW4uQ3JvcEggPSBjdHgtPmlucHV0c1swXS0+aDsKKworICAgIGlmIChjdHgtPmlucHV0c1swXS0+ZnJhbWVfcmF0ZS5udW0pIHsKKyAgICAgICAgcGFyLnZwcC5Jbi5GcmFtZVJhdGVFeHROID0gY3R4LT5pbnB1dHNbMF0tPmZyYW1lX3JhdGUubnVtOworICAgICAgICBwYXIudnBwLkluLkZyYW1lUmF0ZUV4dEQgPSBjdHgtPmlucHV0c1swXS0+ZnJhbWVfcmF0ZS5kZW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyLnZwcC5Jbi5GcmFtZVJhdGVFeHROID0gY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZS5udW07CisgICAgICAgIHBhci52cHAuSW4uRnJhbWVSYXRlRXh0RCA9IGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2UuZGVuOworICAgIH0KKworICAgIHBhci52cHAuT3V0ID0gcGFyLnZwcC5JbjsKKworICAgIGlmIChjdHgtPm91dHB1dHNbMF0tPmZyYW1lX3JhdGUubnVtKSB7CisgICAgICAgIHBhci52cHAuT3V0LkZyYW1lUmF0ZUV4dE4gPSBjdHgtPm91dHB1dHNbMF0tPmZyYW1lX3JhdGUubnVtOworICAgICAgICBwYXIudnBwLk91dC5GcmFtZVJhdGVFeHREID0gY3R4LT5vdXRwdXRzWzBdLT5mcmFtZV9yYXRlLmRlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXIudnBwLk91dC5GcmFtZVJhdGVFeHROID0gY3R4LT5vdXRwdXRzWzBdLT50aW1lX2Jhc2UubnVtOworICAgICAgICBwYXIudnBwLk91dC5GcmFtZVJhdGVFeHREID0gY3R4LT5vdXRwdXRzWzBdLT50aW1lX2Jhc2UuZGVuOworICAgIH0KKworICAgIGVyciA9IE1GWFZpZGVvVlBQX0luaXQocy0+c2Vzc2lvbiwgJnBhcik7CisgICAgaWYgKGVyciAhPSBNRlhfRVJSX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igb3BlbmluZyB0aGUgVlBQIGZvciBkZWludGVybGFjaW5nOiAlZFxuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3ZkZWludF9jb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgUVNWRGVpbnRDb250ZXh0ICAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgcXN2ZGVpbnRfdW5pbml0KGN0eCk7CisKKyAgICBzLT5sYXN0X3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBhdl9tdWxfcShpbmxpbmstPmZyYW1lX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMiwgMSB9KTsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgID0gYXZfbXVsX3EoaW5saW5rLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgMiB9KTsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UgaGF2ZSBhIGh3IGNvbnRleHQgKi8KKyAgICBpZiAoIWlubGluay0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBodyBjb250ZXh0IHByb3ZpZGVkIG9uIGlucHV0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihpbmxpbmstPmh3X2ZyYW1lc19jdHgpOworICAgIGlmICghcy0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmb3V0bGluay0+aHdfZnJhbWVzX2N0eCk7CisgICAgb3V0bGluay0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoaW5saW5rLT5od19mcmFtZXNfY3R4KTsKKyAgICBpZiAoIW91dGxpbmstPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgcXN2ZGVpbnRfdW5pbml0KGN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0ID0gaW5pdF9vdXRfc2Vzc2lvbihjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfdW51c2VkX2ZyYW1lcyhRU1ZEZWludENvbnRleHQgKnMpCit7CisgICAgUVNWRnJhbWUgKmN1ciA9IHMtPndvcmtfZnJhbWVzOworICAgIHdoaWxlIChjdXIpIHsKKyAgICAgICAgaWYgKCFjdXItPnN1cmZhY2UuRGF0YS5Mb2NrZWQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmN1ci0+ZnJhbWUpOworICAgICAgICAgICAgY3VyLT51c2VkID0gMDsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPm5leHQ7CisgICAgfQorfQorCitzdGF0aWMgaW50IGdldF9mcmVlX2ZyYW1lKFFTVkRlaW50Q29udGV4dCAqcywgUVNWRnJhbWUgKipmKQoreworICAgIFFTVkZyYW1lICpmcmFtZSwgKipsYXN0OworCisgICAgY2xlYXJfdW51c2VkX2ZyYW1lcyhzKTsKKworICAgIGZyYW1lID0gcy0+d29ya19mcmFtZXM7CisgICAgbGFzdCAgPSAmcy0+d29ya19mcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lKSB7CisgICAgICAgIGlmICghZnJhbWUtPnVzZWQpIHsKKyAgICAgICAgICAgICpmID0gZnJhbWU7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIGxhc3QgID0gJmZyYW1lLT5uZXh0OworICAgICAgICBmcmFtZSA9IGZyYW1lLT5uZXh0OworICAgIH0KKworICAgIGZyYW1lID0gYXZfbWFsbG9jeihzaXplb2YoKmZyYW1lKSk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAqbGFzdCA9IGZyYW1lOworICAgICpmICAgID0gZnJhbWU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdWJtaXRfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgbWZ4RnJhbWVTdXJmYWNlMSAqKnN1cmZhY2UpCit7CisgICAgUVNWRGVpbnRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFFTVkZyYW1lICpxZjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZ2V0X2ZyZWVfZnJhbWUocywgJnFmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHFmLT5mcmFtZSA9IGZyYW1lOworCisgICAgcWYtPnN1cmZhY2UgPSAqKG1meEZyYW1lU3VyZmFjZTEqKXFmLT5mcmFtZS0+ZGF0YVszXTsKKworICAgIHFmLT5zdXJmYWNlLkRhdGEuTG9ja2VkID0gMDsKKyAgICBxZi0+c3VyZmFjZS5JbmZvLkNyb3BXICA9IHFmLT5mcmFtZS0+d2lkdGg7CisgICAgcWYtPnN1cmZhY2UuSW5mby5Dcm9wSCAgPSBxZi0+ZnJhbWUtPmhlaWdodDsKKworICAgIHFmLT5zdXJmYWNlLkluZm8uUGljU3RydWN0ID0gIXFmLT5mcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSA/IE1GWF9QSUNTVFJVQ1RfUFJPR1JFU1NJVkUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHFmLT5mcmFtZS0+dG9wX2ZpZWxkX2ZpcnN0ID8gTUZYX1BJQ1NUUlVDVF9GSUVMRF9URkYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRlhfUElDU1RSVUNUX0ZJRUxEX0JGRik7CisgICAgaWYgKHFmLT5mcmFtZS0+cmVwZWF0X3BpY3QgPT0gMSkKKyAgICAgICAgcWYtPnN1cmZhY2UuSW5mby5QaWNTdHJ1Y3QgfD0gTUZYX1BJQ1NUUlVDVF9GSUVMRF9SRVBFQVRFRDsKKyAgICBlbHNlIGlmIChxZi0+ZnJhbWUtPnJlcGVhdF9waWN0ID09IDIpCisgICAgICAgIHFmLT5zdXJmYWNlLkluZm8uUGljU3RydWN0IHw9IE1GWF9QSUNTVFJVQ1RfRlJBTUVfRE9VQkxJTkc7CisgICAgZWxzZSBpZiAocWYtPmZyYW1lLT5yZXBlYXRfcGljdCA9PSA0KQorICAgICAgICBxZi0+c3VyZmFjZS5JbmZvLlBpY1N0cnVjdCB8PSBNRlhfUElDU1RSVUNUX0ZSQU1FX1RSSVBMSU5HOworCisgICAgaWYgKGN0eC0+aW5wdXRzWzBdLT5mcmFtZV9yYXRlLm51bSkgeworICAgICAgICBxZi0+c3VyZmFjZS5JbmZvLkZyYW1lUmF0ZUV4dE4gPSBjdHgtPmlucHV0c1swXS0+ZnJhbWVfcmF0ZS5udW07CisgICAgICAgIHFmLT5zdXJmYWNlLkluZm8uRnJhbWVSYXRlRXh0RCA9IGN0eC0+aW5wdXRzWzBdLT5mcmFtZV9yYXRlLmRlbjsKKyAgICB9IGVsc2UgeworICAgICAgICBxZi0+c3VyZmFjZS5JbmZvLkZyYW1lUmF0ZUV4dE4gPSBjdHgtPmlucHV0c1swXS0+dGltZV9iYXNlLm51bTsKKyAgICAgICAgcWYtPnN1cmZhY2UuSW5mby5GcmFtZVJhdGVFeHREID0gY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZS5kZW47CisgICAgfQorCisgICAgcWYtPnN1cmZhY2UuRGF0YS5UaW1lU3RhbXAgPSBhdl9yZXNjYWxlX3EocWYtPmZyYW1lLT5wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgOTAwMDB9KTsKKworICAgICpzdXJmYWNlID0gJnFmLT5zdXJmYWNlOworICAgIHFmLT51c2VkID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZnJhbWUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGNvbnN0IEFWRnJhbWUgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1meEZyYW1lU3VyZmFjZTEgKnN1cmZfaW4pCit7CisgICAgUVNWRGVpbnRDb250ZXh0ICAgICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgIEFWRnJhbWUgKm91dDsKKyAgICBtZnhGcmFtZVN1cmZhY2UxICpzdXJmX291dDsKKyAgICBtZnhTeW5jUG9pbnQgc3luYyA9IE5VTEw7CisgICAgbWZ4U3RhdHVzIGVycjsKKyAgICBpbnQgcmV0LCBhZ2FpbiA9IDA7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHN1cmZfb3V0ID0gKG1meEZyYW1lU3VyZmFjZTEqKW91dC0+ZGF0YVszXTsKKyAgICBzdXJmX291dC0+SW5mby5Dcm9wVyAgICAgPSBvdXRsaW5rLT53OworICAgIHN1cmZfb3V0LT5JbmZvLkNyb3BIICAgICA9IG91dGxpbmstPmg7CisgICAgc3VyZl9vdXQtPkluZm8uUGljU3RydWN0ID0gTUZYX1BJQ1NUUlVDVF9QUk9HUkVTU0lWRTsKKworICAgIGRvIHsKKyAgICAgICAgZXJyID0gTUZYVmlkZW9WUFBfUnVuRnJhbWVWUFBBc3luYyhzLT5zZXNzaW9uLCBzdXJmX2luLCBzdXJmX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAmc3luYyk7CisgICAgICAgIGlmIChlcnIgPT0gTUZYX1dSTl9ERVZJQ0VfQlVTWSkKKyAgICAgICAgICAgIGF2X3VzbGVlcCgxKTsKKyAgICB9IHdoaWxlIChlcnIgPT0gTUZYX1dSTl9ERVZJQ0VfQlVTWSk7CisKKyAgICBpZiAoZXJyID09IE1GWF9FUlJfTU9SRV9EQVRBKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CisgICAgICAgIHJldHVybiBRU1ZERUlOVF9NT1JFX0lOUFVUOworICAgIH0KKworICAgIGlmICgoZXJyIDwgMCAmJiBlcnIgIT0gTUZYX0VSUl9NT1JFX1NVUkZBQ0UpIHx8ICFzeW5jKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGR1cmluZyBkZWludGVybGFjaW5nOiAlZFxuIiwgZXJyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChlcnIgPT0gTUZYX0VSUl9NT1JFX1NVUkZBQ0UpCisgICAgICAgIGFnYWluID0gMTsKKworICAgIGRvIHsKKyAgICAgICAgZXJyID0gTUZYVmlkZW9DT1JFX1N5bmNPcGVyYXRpb24ocy0+c2Vzc2lvbiwgc3luYywgMTAwMCk7CisgICAgfSB3aGlsZSAoZXJyID09IE1GWF9XUk5fSU5fRVhFQ1VUSU9OKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzeW5jaHJvbml6aW5nIHRoZSBvcGVyYXRpb246ICVkXG4iLCBlcnIpOworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBvdXQtPndpZHRoICAgICAgICAgICAgPSBvdXRsaW5rLT53OworICAgIG91dC0+aGVpZ2h0ICAgICAgICAgICA9IG91dGxpbmstPmg7CisgICAgb3V0LT5pbnRlcmxhY2VkX2ZyYW1lID0gMDsKKworICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKG91dC0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSwgb3V0bGluay0+dGltZV9iYXNlKTsKKyAgICBpZiAob3V0LT5wdHMgPT0gcy0+bGFzdF9wdHMpCisgICAgICAgIG91dC0+cHRzKys7CisgICAgcy0+bGFzdF9wdHMgPSBvdXQtPnB0czsKKworICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIGFnYWluID8gUVNWREVJTlRfTU9SRV9PVVRQVVQgOiAwOworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcXN2ZGVpbnRfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5kc3Q7CisKKyAgICBtZnhGcmFtZVN1cmZhY2UxICpzdXJmX2luOworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBzdWJtaXRfZnJhbWUoY3R4LCBpbiwgJnN1cmZfaW4pOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IHByb2Nlc3NfZnJhbWUoY3R4LCBpbiwgc3VyZl9pbik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IHdoaWxlIChyZXQgPT0gUVNWREVJTlRfTU9SRV9PVVRQVVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXN2ZGVpbnRfcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisKKyAgICByZXR1cm4gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFFTVkRlaW50Q29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgIm1vZGUiLCAic2V0IGRlaW50ZXJsYWNlIG1vZGUiLCBPRkZTRVQobW9kZSksICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IE1GWF9ERUlOVEVSTEFDSU5HX0FEVkFOQ0VEfSwgTUZYX0RFSU5URVJMQUNJTkdfQk9CLCBNRlhfREVJTlRFUkxBQ0lOR19BRFZBTkNFRCwgRkxBR1MsICJtb2RlIn0sCisgICAgeyAiYm9iIiwgICAiYm9iIGFsZ29yaXRobSIsICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICAgICAgey5pNjQgPSBNRlhfREVJTlRFUkxBQ0lOR19CT0J9LCBNRlhfREVJTlRFUkxBQ0lOR19CT0IsIE1GWF9ERUlOVEVSTEFDSU5HX0FEVkFOQ0VELCBGTEFHUywgIm1vZGUifSwKKyAgICB7ICJhZHZhbmNlZCIsICJNb3Rpb24gYWRhcHRpdmUgYWxnb3JpdGhtIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBNRlhfREVJTlRFUkxBQ0lOR19BRFZBTkNFRH0sIE1GWF9ERUlOVEVSTEFDSU5HX0JPQiwgTUZYX0RFSU5URVJMQUNJTkdfQURWQU5DRUQsIEZMQUdTLCAibW9kZSJ9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgcXN2ZGVpbnRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZGVpbnRlcmxhY2VfcXN2IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBxc3ZkZWludF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBxc3ZkZWludF9maWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHFzdmRlaW50X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBxc3ZkZWludF9jb25maWdfcHJvcHMsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcXN2ZGVpbnRfcmVxdWVzdF9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9kZWludGVybGFjZV9xc3YgPSB7CisgICAgLm5hbWUgICAgICA9ICJkZWludGVybGFjZV9xc3YiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJRdWlja1N5bmMgdmlkZW8gZGVpbnRlcmxhY2luZyIpLAorCisgICAgLnVuaW5pdCAgICAgICAgPSBxc3ZkZWludF91bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxc3ZkZWludF9xdWVyeV9mb3JtYXRzLAorCisgICAgLnByaXZfc2l6ZSA9IHNpemVvZihRU1ZEZWludENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzID0gJnFzdmRlaW50X2NsYXNzLAorCisgICAgLmlucHV0cyAgICA9IHFzdmRlaW50X2lucHV0cywKKyAgICAub3V0cHV0cyAgID0gcXN2ZGVpbnRfb3V0cHV0cywKKworICAgIC5mbGFnc19pbnRlcm5hbCA9IEZGX0ZJTFRFUl9GTEFHX0hXRlJBTUVfQVdBUkUsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZGVpbnRlcmxhY2VfdmFhcGkuYyBiL2xpYmF2ZmlsdGVyL3ZmX2RlaW50ZXJsYWNlX3ZhYXBpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhMjYyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2RlaW50ZXJsYWNlX3ZhYXBpLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJ2YWFwaV92cHAuaCIKKworI2RlZmluZSBNQVhfUkVGRVJFTkNFUyA4CisKK3R5cGVkZWYgc3RydWN0IERlaW50VkFBUElDb250ZXh0IHsKKyAgICBWQUFQSVZQUENvbnRleHQgdnBwX2N0eDsgLy8gbXVzdCBiZSB0aGUgZmlyc3QgZmllbGQKKworICAgIGludCAgICAgICAgICAgICAgICBtb2RlOworICAgIGludCAgICAgICAgICAgICAgICBmaWVsZF9yYXRlOworICAgIGludCAgICAgICAgICAgICAgICBhdXRvX2VuYWJsZTsKKworICAgIFZBUHJvY0ZpbHRlckNhcERlaW50ZXJsYWNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgZGVpbnRfY2Fwc1tWQVByb2NEZWludGVybGFjaW5nQ291bnRdOworICAgIGludCAgICAgICAgICAgICBuYl9kZWludF9jYXBzOworICAgIFZBUHJvY1BpcGVsaW5lQ2FwcyBwaXBlbGluZV9jYXBzOworCisgICAgaW50ICAgICAgICAgICAgICAgIHF1ZXVlX2RlcHRoOworICAgIGludCAgICAgICAgICAgICAgICBxdWV1ZV9jb3VudDsKKyAgICBBVkZyYW1lICAgICAgICAgICAqZnJhbWVfcXVldWVbTUFYX1JFRkVSRU5DRVNdOworICAgIGludCAgICAgICAgICAgICAgICBleHRyYV9kZWxheV9mb3JfdGltZXN0YW1wczsKK30gRGVpbnRWQUFQSUNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZWludF92YWFwaV9tb2RlX25hbWUoaW50IG1vZGUpCit7CisgICAgc3dpdGNoIChtb2RlKSB7CisjZGVmaW5lIEQobmFtZSkgY2FzZSBWQVByb2NEZWludGVybGFjaW5nICMjIG5hbWU6IHJldHVybiAjbmFtZQorICAgICAgICBEKEJvYik7CisgICAgICAgIEQoV2VhdmUpOworICAgICAgICBEKE1vdGlvbkFkYXB0aXZlKTsKKyAgICAgICAgRChNb3Rpb25Db21wZW5zYXRlZCk7CisjdW5kZWYgRAorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAiSW52YWxpZCI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZWludF92YWFwaV9waXBlbGluZV91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBEZWludFZBQVBJQ29udGV4dCAqY3R4ICAgPSBhdmN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPnF1ZXVlX2NvdW50OyBpKyspCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmN0eC0+ZnJhbWVfcXVldWVbaV0pOworICAgIGN0eC0+cXVldWVfY291bnQgPSAwOworCisgICAgZmZfdmFhcGlfdnBwX3BpcGVsaW5lX3VuaW5pdChhdmN0eCk7Cit9CisKK3N0YXRpYyBpbnQgZGVpbnRfdmFhcGlfYnVpbGRfZmlsdGVyX3BhcmFtcyhBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJVlBQQ29udGV4dCAqdnBwX2N0eCA9IGF2Y3R4LT5wcml2OworICAgIERlaW50VkFBUElDb250ZXh0ICpjdHggICA9IGF2Y3R4LT5wcml2OworICAgIFZBU3RhdHVzIHZhczsKKyAgICBWQVByb2NGaWx0ZXJQYXJhbWV0ZXJCdWZmZXJEZWludGVybGFjaW5nIHBhcmFtczsKKyAgICBpbnQgaTsKKworICAgIGN0eC0+bmJfZGVpbnRfY2FwcyA9IFZBUHJvY0RlaW50ZXJsYWNpbmdDb3VudDsKKyAgICB2YXMgPSB2YVF1ZXJ5VmlkZW9Qcm9jRmlsdGVyQ2Fwcyh2cHBfY3R4LT5od2N0eC0+ZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cHBfY3R4LT52YV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUHJvY0ZpbHRlckRlaW50ZXJsYWNpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0eC0+ZGVpbnRfY2FwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5uYl9kZWludF9jYXBzKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IGRlaW50ZXJsYWNpbmcgIgorICAgICAgICAgICAgICAgImNhcHM6ICVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgaWYgKGN0eC0+bW9kZSA9PSBWQVByb2NEZWludGVybGFjaW5nTm9uZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9kZWludF9jYXBzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdHgtPmRlaW50X2NhcHNbaV0udHlwZSA+IGN0eC0+bW9kZSkKKyAgICAgICAgICAgICAgICBjdHgtPm1vZGUgPSBjdHgtPmRlaW50X2NhcHNbaV0udHlwZTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19WRVJCT1NFLCAiUGlja2luZyAlZCAoJXMpIGFzIGRlZmF1bHQgIgorICAgICAgICAgICAgICAgImRlaW50ZXJsYWNpbmcgbW9kZS5cbiIsIGN0eC0+bW9kZSwKKyAgICAgICAgICAgICAgIGRlaW50X3ZhYXBpX21vZGVfbmFtZShjdHgtPm1vZGUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9kZWludF9jYXBzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChjdHgtPmRlaW50X2NhcHNbaV0udHlwZSA9PSBjdHgtPm1vZGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPj0gY3R4LT5uYl9kZWludF9jYXBzKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkRlaW50ZXJsYWNpbmcgbW9kZSAlZCAoJXMpIGlzICIKKyAgICAgICAgICAgICAgICAgICAibm90IHN1cHBvcnRlZC5cbiIsIGN0eC0+bW9kZSwKKyAgICAgICAgICAgICAgICAgICBkZWludF92YWFwaV9tb2RlX25hbWUoY3R4LT5tb2RlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXJhbXMudHlwZSAgICAgID0gVkFQcm9jRmlsdGVyRGVpbnRlcmxhY2luZzsKKyAgICBwYXJhbXMuYWxnb3JpdGhtID0gY3R4LT5tb2RlOworICAgIHBhcmFtcy5mbGFncyAgICAgPSAwOworCisgICAgdmFzID0gZmZfdmFhcGlfdnBwX21ha2VfcGFyYW1fYnVmZmVycyhhdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUHJvY0ZpbHRlclBhcmFtZXRlckJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBhcmFtcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICBpZiAodmFzKQorICAgICAgICByZXR1cm4gdmFzOworCisgICAgdmFzID0gdmFRdWVyeVZpZGVvUHJvY1BpcGVsaW5lQ2Fwcyh2cHBfY3R4LT5od2N0eC0+ZGlzcGxheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwcF9jdHgtPnZhX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdnBwX2N0eC0+ZmlsdGVyX2J1ZmZlcnNbMF0sIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R4LT5waXBlbGluZV9jYXBzKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IHBpcGVsaW5lICIKKyAgICAgICAgICAgICAgICJjYXBzOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGN0eC0+ZXh0cmFfZGVsYXlfZm9yX3RpbWVzdGFtcHMgPSBjdHgtPmZpZWxkX3JhdGUgPT0gMiAmJgorICAgICAgICBjdHgtPnBpcGVsaW5lX2NhcHMubnVtX2JhY2t3YXJkX3JlZmVyZW5jZXMgPT0gMDsKKworICAgIGN0eC0+cXVldWVfZGVwdGggPSBjdHgtPnBpcGVsaW5lX2NhcHMubnVtX2JhY2t3YXJkX3JlZmVyZW5jZXMgKworICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBpcGVsaW5lX2NhcHMubnVtX2ZvcndhcmRfcmVmZXJlbmNlcyArCisgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+ZXh0cmFfZGVsYXlfZm9yX3RpbWVzdGFtcHMgKyAxOworICAgIGlmIChjdHgtPnF1ZXVlX2RlcHRoID4gTUFYX1JFRkVSRU5DRVMpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJQaXBlbGluZSByZXF1aXJlcyB0b28gbWFueSAiCisgICAgICAgICAgICAgICAicmVmZXJlbmNlcyAoJXUgZm9yd2FyZCwgJXUgYmFjaykuXG4iLAorICAgICAgICAgICAgICAgY3R4LT5waXBlbGluZV9jYXBzLm51bV9mb3J3YXJkX3JlZmVyZW5jZXMsCisgICAgICAgICAgICAgICBjdHgtPnBpcGVsaW5lX2NhcHMubnVtX2JhY2t3YXJkX3JlZmVyZW5jZXMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlaW50X3ZhYXBpX2NvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJDb250ZXh0ICphdmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBEZWludFZBQVBJQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX3ZhYXBpX3ZwcF9jb25maWdfb3V0cHV0KG91dGxpbmspOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworICAgIG91dGxpbmstPnRpbWVfYmFzZSAgPSBhdl9tdWxfcShpbmxpbmstPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgMSwgY3R4LT5maWVsZF9yYXRlIH0pOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBhdl9tdWxfcShpbmxpbmstPmZyYW1lX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKSB7IGN0eC0+ZmllbGRfcmF0ZSwgMSB9KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlaW50X3ZhYXBpX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5wdXRfZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgKmF2Y3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICAgICpvdXRsaW5rID0gYXZjdHgtPm91dHB1dHNbMF07CisgICAgVkFBUElWUFBDb250ZXh0ICp2cHBfY3R4ID0gYXZjdHgtPnByaXY7CisgICAgRGVpbnRWQUFQSUNvbnRleHQgKmN0eCAgID0gYXZjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0cHV0X2ZyYW1lICAgID0gTlVMTDsKKyAgICBWQVN1cmZhY2VJRCBpbnB1dF9zdXJmYWNlLCBvdXRwdXRfc3VyZmFjZTsKKyAgICBWQVN1cmZhY2VJRCBiYWNrd2FyZF9yZWZlcmVuY2VzW01BWF9SRUZFUkVOQ0VTXTsKKyAgICBWQVN1cmZhY2VJRCBmb3J3YXJkX3JlZmVyZW5jZXNbTUFYX1JFRkVSRU5DRVNdOworICAgIFZBUHJvY1BpcGVsaW5lUGFyYW1ldGVyQnVmZmVyIHBhcmFtczsKKyAgICBWQVByb2NGaWx0ZXJQYXJhbWV0ZXJCdWZmZXJEZWludGVybGFjaW5nICpmaWx0ZXJfcGFyYW1zOworICAgIFZBUmVjdGFuZ2xlIGlucHV0X3JlZ2lvbjsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgdm9pZCAqZmlsdGVyX3BhcmFtc19hZGRyID0gTlVMTDsKKyAgICBpbnQgZXJyLCBpLCBmaWVsZCwgY3VycmVudF9mcmFtZV9pbmRleDsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRmlsdGVyIGlucHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGlucHV0X2ZyYW1lLT5mb3JtYXQpLAorICAgICAgICAgICBpbnB1dF9mcmFtZS0+d2lkdGgsIGlucHV0X2ZyYW1lLT5oZWlnaHQsIGlucHV0X2ZyYW1lLT5wdHMpOworCisgICAgaWYgKGN0eC0+cXVldWVfY291bnQgPCBjdHgtPnF1ZXVlX2RlcHRoKSB7CisgICAgICAgIGN0eC0+ZnJhbWVfcXVldWVbY3R4LT5xdWV1ZV9jb3VudCsrXSA9IGlucHV0X2ZyYW1lOworICAgICAgICBpZiAoY3R4LT5xdWV1ZV9jb3VudCA8IGN0eC0+cXVldWVfZGVwdGgpIHsKKyAgICAgICAgICAgIC8vIE5lZWQgbW9yZSByZWZlcmVuY2Ugc3VyZmFjZXMgYmVmb3JlIHdlIGNhbiBjb250aW51ZS4KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmY3R4LT5mcmFtZV9xdWV1ZVswXSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgY3R4LT5xdWV1ZV9jb3VudDsgaSsrKQorICAgICAgICAgICAgY3R4LT5mcmFtZV9xdWV1ZVtpXSA9IGN0eC0+ZnJhbWVfcXVldWVbaSArIDFdOworICAgICAgICBjdHgtPmZyYW1lX3F1ZXVlW2ldID0gaW5wdXRfZnJhbWU7CisgICAgfQorCisgICAgY3VycmVudF9mcmFtZV9pbmRleCA9IGN0eC0+cGlwZWxpbmVfY2Fwcy5udW1fZm9yd2FyZF9yZWZlcmVuY2VzOworCisgICAgaW5wdXRfZnJhbWUgPSBjdHgtPmZyYW1lX3F1ZXVlW2N1cnJlbnRfZnJhbWVfaW5kZXhdOworICAgIGlucHV0X3N1cmZhY2UgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClpbnB1dF9mcmFtZS0+ZGF0YVszXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5waXBlbGluZV9jYXBzLm51bV9mb3J3YXJkX3JlZmVyZW5jZXM7IGkrKykKKyAgICAgICAgZm9yd2FyZF9yZWZlcmVuY2VzW2ldID0gKFZBU3VyZmFjZUlEKSh1aW50cHRyX3QpCisgICAgICAgICAgICBjdHgtPmZyYW1lX3F1ZXVlW2N1cnJlbnRfZnJhbWVfaW5kZXggLSBpIC0gMV0tPmRhdGFbM107CisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+cGlwZWxpbmVfY2Fwcy5udW1fYmFja3dhcmRfcmVmZXJlbmNlczsgaSsrKQorICAgICAgICBiYWNrd2FyZF9yZWZlcmVuY2VzW2ldID0gKFZBU3VyZmFjZUlEKSh1aW50cHRyX3QpCisgICAgICAgICAgICBjdHgtPmZyYW1lX3F1ZXVlW2N1cnJlbnRfZnJhbWVfaW5kZXggKyBpICsgMV0tPmRhdGFbM107CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlVzaW5nIHN1cmZhY2UgJSN4IGZvciAiCisgICAgICAgICAgICJkZWludGVybGFjZSBpbnB1dC5cbiIsIGlucHV0X3N1cmZhY2UpOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiQmFja3dhcmQgcmVmZXJlbmNlczoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5waXBlbGluZV9jYXBzLm51bV9iYWNrd2FyZF9yZWZlcmVuY2VzOyBpKyspCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiICUjeCIsIGJhY2t3YXJkX3JlZmVyZW5jZXNbaV0pOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiXG4iKTsKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkZvcndhcmQgIHJlZmVyZW5jZXM6Iik7CisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+cGlwZWxpbmVfY2Fwcy5udW1fZm9yd2FyZF9yZWZlcmVuY2VzOyBpKyspCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiICUjeCIsIGZvcndhcmRfcmVmZXJlbmNlc1tpXSk7CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworCisgICAgZm9yIChmaWVsZCA9IDA7IGZpZWxkIDwgY3R4LT5maWVsZF9yYXRlOyBmaWVsZCsrKSB7CisgICAgICAgIG91dHB1dF9mcmFtZSA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgdnBwX2N0eC0+b3V0cHV0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZwcF9jdHgtPm91dHB1dF9oZWlnaHQpOworICAgICAgICBpZiAoIW91dHB1dF9mcmFtZSkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgb3V0cHV0X3N1cmZhY2UgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClvdXRwdXRfZnJhbWUtPmRhdGFbM107CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVXNpbmcgc3VyZmFjZSAlI3ggZm9yICIKKyAgICAgICAgICAgICAgICJkZWludGVybGFjZSBvdXRwdXQuXG4iLCBvdXRwdXRfc3VyZmFjZSk7CisKKyAgICAgICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKworICAgICAgICBpbnB1dF9yZWdpb24gPSAoVkFSZWN0YW5nbGUpIHsKKyAgICAgICAgICAgIC54ICAgICAgPSAwLAorICAgICAgICAgICAgLnkgICAgICA9IDAsCisgICAgICAgICAgICAud2lkdGggID0gaW5wdXRfZnJhbWUtPndpZHRoLAorICAgICAgICAgICAgLmhlaWdodCA9IGlucHV0X2ZyYW1lLT5oZWlnaHQsCisgICAgICAgIH07CisKKyAgICAgICAgcGFyYW1zLnN1cmZhY2UgPSBpbnB1dF9zdXJmYWNlOworICAgICAgICBwYXJhbXMuc3VyZmFjZV9yZWdpb24gPSAmaW5wdXRfcmVnaW9uOworICAgICAgICBwYXJhbXMuc3VyZmFjZV9jb2xvcl9zdGFuZGFyZCA9CisgICAgICAgICAgICBmZl92YWFwaV92cHBfY29sb3VyX3N0YW5kYXJkKGlucHV0X2ZyYW1lLT5jb2xvcnNwYWNlKTsKKworICAgICAgICBwYXJhbXMub3V0cHV0X3JlZ2lvbiA9IE5VTEw7CisgICAgICAgIHBhcmFtcy5vdXRwdXRfYmFja2dyb3VuZF9jb2xvciA9IDB4ZmYwMDAwMDA7CisgICAgICAgIHBhcmFtcy5vdXRwdXRfY29sb3Jfc3RhbmRhcmQgPSBwYXJhbXMuc3VyZmFjZV9jb2xvcl9zdGFuZGFyZDsKKworICAgICAgICBwYXJhbXMucGlwZWxpbmVfZmxhZ3MgPSAwOworICAgICAgICBwYXJhbXMuZmlsdGVyX2ZsYWdzICAgPSBWQV9GUkFNRV9QSUNUVVJFOworCisgICAgICAgIGlmICghY3R4LT5hdXRvX2VuYWJsZSB8fCBpbnB1dF9mcmFtZS0+aW50ZXJsYWNlZF9mcmFtZSkgeworICAgICAgICAgICAgdmFzID0gdmFNYXBCdWZmZXIodnBwX2N0eC0+aHdjdHgtPmRpc3BsYXksIHZwcF9jdHgtPmZpbHRlcl9idWZmZXJzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbHRlcl9wYXJhbXNfYWRkcik7CisgICAgICAgICAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbWFwIGZpbHRlciBwYXJhbWV0ZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWx0ZXJfcGFyYW1zID0gZmlsdGVyX3BhcmFtc19hZGRyOworICAgICAgICAgICAgZmlsdGVyX3BhcmFtcy0+ZmxhZ3MgPSAwOworICAgICAgICAgICAgaWYgKGlucHV0X2ZyYW1lLT50b3BfZmllbGRfZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJfcGFyYW1zLT5mbGFncyB8PSBmaWVsZCA/IFZBX0RFSU5URVJMQUNJTkdfQk9UVE9NX0ZJRUxEIDogMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlsdGVyX3BhcmFtcy0+ZmxhZ3MgfD0gVkFfREVJTlRFUkxBQ0lOR19CT1RUT01fRklFTERfRklSU1Q7CisgICAgICAgICAgICAgICAgZmlsdGVyX3BhcmFtcy0+ZmxhZ3MgfD0gZmllbGQgPyAwIDogVkFfREVJTlRFUkxBQ0lOR19CT1RUT01fRklFTEQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWx0ZXJfcGFyYW1zX2FkZHIgPSBOVUxMOworICAgICAgICAgICAgdmFzID0gdmFVbm1hcEJ1ZmZlcih2cHBfY3R4LT5od2N0eC0+ZGlzcGxheSwgdnBwX2N0eC0+ZmlsdGVyX2J1ZmZlcnNbMF0pOworICAgICAgICAgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byB1bm1hcCBmaWx0ZXIgcGFyYW1ldGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcjogJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKworICAgICAgICAgICAgcGFyYW1zLmZpbHRlcnMgICAgID0gJnZwcF9jdHgtPmZpbHRlcl9idWZmZXJzWzBdOworICAgICAgICAgICAgcGFyYW1zLm51bV9maWx0ZXJzID0gMTsKKworICAgICAgICAgICAgcGFyYW1zLmZvcndhcmRfcmVmZXJlbmNlcyA9IGZvcndhcmRfcmVmZXJlbmNlczsKKyAgICAgICAgICAgIHBhcmFtcy5udW1fZm9yd2FyZF9yZWZlcmVuY2VzID0KKyAgICAgICAgICAgICAgICBjdHgtPnBpcGVsaW5lX2NhcHMubnVtX2ZvcndhcmRfcmVmZXJlbmNlczsKKyAgICAgICAgICAgIHBhcmFtcy5iYWNrd2FyZF9yZWZlcmVuY2VzID0gYmFja3dhcmRfcmVmZXJlbmNlczsKKyAgICAgICAgICAgIHBhcmFtcy5udW1fYmFja3dhcmRfcmVmZXJlbmNlcyA9CisgICAgICAgICAgICAgICAgY3R4LT5waXBlbGluZV9jYXBzLm51bV9iYWNrd2FyZF9yZWZlcmVuY2VzOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXJhbXMuZmlsdGVycyAgICAgPSBOVUxMOworICAgICAgICAgICAgcGFyYW1zLm51bV9maWx0ZXJzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGZmX3ZhYXBpX3ZwcF9yZW5kZXJfcGljdHVyZShhdmN0eCwgJnBhcmFtcywgb3V0cHV0X3N1cmZhY2UpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHB1dF9mcmFtZSwgaW5wdXRfZnJhbWUpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAoY3R4LT5maWVsZF9yYXRlID09IDIpIHsKKyAgICAgICAgICAgIGlmIChmaWVsZCA9PSAwKQorICAgICAgICAgICAgICAgIG91dHB1dF9mcmFtZS0+cHRzID0gMiAqIGlucHV0X2ZyYW1lLT5wdHM7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgb3V0cHV0X2ZyYW1lLT5wdHMgPSBpbnB1dF9mcmFtZS0+cHRzICsKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5mcmFtZV9xdWV1ZVtjdXJyZW50X2ZyYW1lX2luZGV4ICsgMV0tPnB0czsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRfZnJhbWUtPmludGVybGFjZWRfZnJhbWUgPSAwOworCisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiRmlsdGVyIG91dHB1dDogJXMsICV1eCV1ICglIlBSSWQ2NCIpLlxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUob3V0cHV0X2ZyYW1lLT5mb3JtYXQpLAorICAgICAgICAgICAgICAgb3V0cHV0X2ZyYW1lLT53aWR0aCwgb3V0cHV0X2ZyYW1lLT5oZWlnaHQsIG91dHB1dF9mcmFtZS0+cHRzKTsKKworICAgICAgICBlcnIgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cHV0X2ZyYW1lKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZXJyOworCitmYWlsOgorICAgIGlmIChmaWx0ZXJfcGFyYW1zX2FkZHIpCisgICAgICAgIHZhVW5tYXBCdWZmZXIodnBwX2N0eC0+aHdjdHgtPmRpc3BsYXksIHZwcF9jdHgtPmZpbHRlcl9idWZmZXJzWzBdKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXRfZnJhbWUpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBkZWludF92YWFwaV9pbml0KEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElWUFBDb250ZXh0ICp2cHBfY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBmZl92YWFwaV92cHBfY3R4X2luaXQoYXZjdHgpOworICAgIHZwcF9jdHgtPnBpcGVsaW5lX3VuaW5pdCAgICAgPSBkZWludF92YWFwaV9waXBlbGluZV91bmluaXQ7CisgICAgdnBwX2N0eC0+YnVpbGRfZmlsdGVyX3BhcmFtcyA9IGRlaW50X3ZhYXBpX2J1aWxkX2ZpbHRlcl9wYXJhbXM7CisgICAgdnBwX2N0eC0+b3V0cHV0X2Zvcm1hdCAgICAgICA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihEZWludFZBQVBJQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkZWludF92YWFwaV9vcHRpb25zW10gPSB7CisgICAgeyAibW9kZSIsICJEZWludGVybGFjaW5nIG1vZGUiLAorICAgICAgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IFZBUHJvY0RlaW50ZXJsYWNpbmdOb25lIH0sCisgICAgICBWQVByb2NEZWludGVybGFjaW5nTm9uZSwgVkFQcm9jRGVpbnRlcmxhY2luZ0NvdW50IC0gMSwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgImRlZmF1bHQiLCAiVXNlIHRoZSBoaWdoZXN0LW51bWJlcmVkIChhbmQgdGhlcmVmb3JlIHBvc3NpYmx5IG1vc3QgYWR2YW5jZWQpIGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBWQVByb2NEZWludGVybGFjaW5nTm9uZSB9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAiYm9iIiwgIlVzZSB0aGUgYm9iIGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBWQVByb2NEZWludGVybGFjaW5nQm9iIH0sIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJ3ZWF2ZSIsICJVc2UgdGhlIHdlYXZlIGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBWQVByb2NEZWludGVybGFjaW5nV2VhdmUgfSwgMCwgMCwgRkxBR1MsICAibW9kZSIgfSwKKyAgICB7ICJtb3Rpb25fYWRhcHRpdmUiLCAiVXNlIHRoZSBtb3Rpb24gYWRhcHRpdmUgZGVpbnRlcmxhY2luZyBhbGdvcml0aG0iLAorICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFZBUHJvY0RlaW50ZXJsYWNpbmdNb3Rpb25BZGFwdGl2ZSB9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAibW90aW9uX2NvbXBlbnNhdGVkIiwgIlVzZSB0aGUgbW90aW9uIGNvbXBlbnNhdGVkIGRlaW50ZXJsYWNpbmcgYWxnb3JpdGhtIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBWQVByb2NEZWludGVybGFjaW5nTW90aW9uQ29tcGVuc2F0ZWQgfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorCisgICAgeyAicmF0ZSIsICJHZW5lcmF0ZSBvdXRwdXQgYXQgZnJhbWUgcmF0ZSBvciBmaWVsZCByYXRlIiwKKyAgICAgIE9GRlNFVChmaWVsZF9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxIH0sIDEsIDIsIEZMQUdTLCAicmF0ZSIgfSwKKyAgICB7ICJmcmFtZSIsICJPdXRwdXQgYXQgZnJhbWUgcmF0ZSAob25lIGZyYW1lIG9mIG91dHB1dCBmb3IgZWFjaCBmaWVsZC1wYWlyKSIsCisgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gMSB9LCAwLCAwLCBGTEFHUywgInJhdGUiIH0sCisgICAgeyAiZmllbGQiLCAiT3V0cHV0IGF0IGZpZWxkIHJhdGUgKG9uZSBmcmFtZSBvZiBvdXRwdXQgZm9yIGVhY2ggZmllbGQpIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSAyIH0sIDAsIDAsIEZMQUdTLCAicmF0ZSIgfSwKKworICAgIHsgImF1dG8iLCAiT25seSBkZWludGVybGFjZSBmaWVsZHMsIHBhc3NpbmcgZnJhbWVzIHRocm91Z2ggdW5jaGFuZ2VkIiwKKyAgICAgIE9GRlNFVChhdXRvX2VuYWJsZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBGTEFHUyB9LAorCisgICAgeyBOVUxMIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBkZWludF92YWFwaV9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJkZWludGVybGFjZV92YWFwaSIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IGRlaW50X3ZhYXBpX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZGVpbnRfdmFhcGlfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gJmRlaW50X3ZhYXBpX2ZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9ICZmZl92YWFwaV92cHBfY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBkZWludF92YWFwaV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSAmZGVpbnRfdmFhcGlfY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9kZWludGVybGFjZV92YWFwaSA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZGVpbnRlcmxhY2VfdmFhcGkiLAorICAgIC5kZXNjcmlwdGlvbiAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEZWludGVybGFjaW5nIG9mIFZBQVBJIHN1cmZhY2VzIiksCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKERlaW50VkFBUElDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSAmZGVpbnRfdmFhcGlfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICAgPSAmZmZfdmFhcGlfdnBwX2N0eF91bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gJmZmX3ZhYXBpX3ZwcF9xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgICA9IGRlaW50X3ZhYXBpX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICAgPSBkZWludF92YWFwaV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZkZWludF92YWFwaV9jbGFzcywKKyAgICAuZmxhZ3NfaW50ZXJuYWwgPSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2RlanVkZGVyLmMgYi9saWJhdmZpbHRlci92Zl9kZWp1ZGRlci5jCmluZGV4IGM0ZDdiNmIuLjQ3MDVjYjYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2RlanVkZGVyLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfZGVqdWRkZXIuYwpAQCAtNTUsNyArNTUsNyBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAidmlkZW8uaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRGVqdWRkZXJDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQ2NF90ICpyaW5nYnVmZjsKICAgICBpbnQgaTEsIGkyLCBpMywgaTQ7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9kZWxvZ28uYyBiL2xpYmF2ZmlsdGVyL3ZmX2RlbG9nby5jCmluZGV4IDYzYzM1MzkuLjA2NWQwOTMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2RlbG9nby5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2RlbG9nby5jCkBAIC0yMjYsNiArMjI2LDIwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIERlbG9nb0NvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKworICAgIC8qIENoZWNrIHdoZXRoZXIgdGhlIGxvZ28gYXJlYSBmaXRzIGluIHRoZSBmcmFtZSAqLworICAgIGlmIChzLT54ICsgKHMtPmJhbmQgLSAxKSA8IDAgfHwgcy0+eCArIHMtPncgLSAocy0+YmFuZCoyIC0gMikgPiBpbmxpbmstPncgfHwKKyAgICAgICAgcy0+eSArIChzLT5iYW5kIC0gMSkgPCAwIHx8IHMtPnkgKyBzLT5oIC0gKHMtPmJhbmQqMiAtIDIpID4gaW5saW5rLT5oKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJMb2dvIGFyZWEgaXMgb3V0c2lkZSBvZiB0aGUgZnJhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQogewogICAgIERlbG9nb0NvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKQEAgLTI4NCw2ICsyOTgsNyBAQAogICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9kZXNoYWtlLmMgYi9saWJhdmZpbHRlci92Zl9kZXNoYWtlLmMKaW5kZXggNGVhZTk4OC4uNTVjZTVlMSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZGVzaGFrZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2Rlc2hha2UuYwpAQCAtNjAsNyArNjAsNiBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9xc29ydC5oIgogCiAjaW5jbHVkZSAiZGVzaGFrZS5oIgotI2luY2x1ZGUgImRlc2hha2Vfb3BlbmNsLmgiCiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERlc2hha2VDb250ZXh0LCB4KQogI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KQEAgLTgzLDcgKzgyLDcgQEAKICAgICAgICAgeyAiZXhoYXVzdGl2ZSIsICJleGhhdXN0aXZlIHNlYXJjaCIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVYSEFVU1RJVkV9LCAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgInNtb2RlIiB9LAogICAgICAgICB7ICJsZXNzIiwgICAgICAgImxlc3MgZXhoYXVzdGl2ZSBzZWFyY2giLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U01BUlRfRVhIQVVTVElWRX0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAic21vZGUiIH0sCiAgICAgeyAiZmlsZW5hbWUiLCAic2V0IG1vdGlvbiBzZWFyY2ggZGV0YWlsZWQgbG9nIGZpbGUgbmFtZSIsIE9GRlNFVChmaWxlbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIC5mbGFncyA9IEZMQUdTIH0sCi0gICAgeyAib3BlbmNsIiwgInVzZSBPcGVuQ0wgZmlsdGVyaW5nIGNhcGFiaWxpdGllcyIsIE9GRlNFVChvcGVuY2wpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJvcGVuY2wiLCAiaWdub3JlZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKG9wZW5jbCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxLCAuZmxhZ3MgPSBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC0zNDEsMTMgKzM0MCw4IEBACiAKIHN0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewotICAgIGludCByZXQ7CiAgICAgRGVzaGFrZUNvbnRleHQgKmRlc2hha2UgPSBjdHgtPnByaXY7CiAKLSAgICBkZXNoYWtlLT5zYWQgPSBhdl9waXhlbHV0aWxzX2dldF9zYWRfZm4oNCwgNCwgMSwgZGVzaGFrZSk7IC8vIDE2eDE2LCAybmQgc291cmNlIHVuYWxpZ25lZAotICAgIGlmICghZGVzaGFrZS0+c2FkKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotCiAgICAgZGVzaGFrZS0+cmVmY291bnQgPSAyMDsgLy8gWFhYOiBhZGQgdG8gb3B0aW9ucz8KICAgICBkZXNoYWtlLT5ibG9ja3NpemUgLz0gMjsKICAgICBkZXNoYWtlLT5ibG9ja3NpemUgPSBhdl9jbGlwKGRlc2hha2UtPmJsb2Nrc2l6ZSwgNCwgMTI4KTsKQEAgLTM2OSwxNyArMzYzLDcgQEAKICAgICAgICAgZGVzaGFrZS0+Y3ggJj0gfjE1OwogICAgIH0KICAgICBkZXNoYWtlLT50cmFuc2Zvcm0gPSBkZXNoYWtlX3RyYW5zZm9ybV9jOwotICAgIGlmICghQ09ORklHX09QRU5DTCAmJiBkZXNoYWtlLT5vcGVuY2wpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIHN1cHBvcnQgd2FzIG5vdCBlbmFibGVkIGluIHRoaXMgYnVpbGQsIGNhbm5vdCBiZSBzZWxlY3RlZFxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQogCi0gICAgaWYgKENPTkZJR19PUEVOQ0wgJiYgZGVzaGFrZS0+b3BlbmNsKSB7Ci0gICAgICAgIGRlc2hha2UtPnRyYW5zZm9ybSA9IGZmX29wZW5jbF90cmFuc2Zvcm07Ci0gICAgICAgIHJldCA9IGZmX29wZW5jbF9kZXNoYWtlX2luaXQoY3R4KTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgImN4OiAlZCwgY3k6ICVkLCBjdzogJWQsIGNoOiAlZCwgcng6ICVkLCByeTogJWQsIGVkZ2U6ICVkIGJsb2Nrc2l6ZTogJWQgY29udHJhc3Q6ICVkIHNlYXJjaDogJWRcbiIsCiAgICAgICAgICAgIGRlc2hha2UtPmN4LCBkZXNoYWtlLT5jeSwgZGVzaGFrZS0+Y3csIGRlc2hha2UtPmNoLAogICAgICAgICAgICBkZXNoYWtlLT5yeCwgZGVzaGFrZS0+cnksIGRlc2hha2UtPmVkZ2UsIGRlc2hha2UtPmJsb2Nrc2l6ZSAqIDIsIGRlc2hha2UtPmNvbnRyYXN0LCBkZXNoYWtlLT5zZWFyY2gpOwpAQCAtNDE2LDkgKzQwMCw2IEBACiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBEZXNoYWtlQ29udGV4dCAqZGVzaGFrZSA9IGN0eC0+cHJpdjsKLSAgICBpZiAoQ09ORklHX09QRU5DTCAmJiBkZXNoYWtlLT5vcGVuY2wpIHsKLSAgICAgICAgZmZfb3BlbmNsX2Rlc2hha2VfdW5pbml0KGN0eCk7Ci0gICAgfQogICAgIGF2X2ZyYW1lX2ZyZWUoJmRlc2hha2UtPnJlZik7CiAgICAgYXZfZnJlZXAoJmRlc2hha2UtPmFuZ2xlcyk7CiAgICAgZGVzaGFrZS0+YW5nbGVzX3NpemUgPSAwOwpAQCAtNDM5LDYgKzQyMCw3IEBACiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChsaW5rLT5mb3JtYXQpOwogICAgIGNvbnN0IGludCBjaHJvbWFfd2lkdGggID0gQVZfQ0VJTF9SU0hJRlQobGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CiAgICAgY29uc3QgaW50IGNocm9tYV9oZWlnaHQgPSBBVl9DRUlMX1JTSElGVChsaW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBpbnQgYWxpZ25lZDsKIAogICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CiAgICAgaWYgKCFvdXQpIHsKQEAgLTQ0NywxMSArNDI5LDEwIEBACiAgICAgfQogICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CiAKLSAgICBpZiAoQ09ORklHX09QRU5DTCAmJiBkZXNoYWtlLT5vcGVuY2wpIHsKLSAgICAgICAgcmV0ID0gZmZfb3BlbmNsX2Rlc2hha2VfcHJvY2Vzc19pbm91dF9idWYobGluay0+ZHN0LGluLCBvdXQpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorICAgIGFsaWduZWQgPSAhKChpbnRwdHJfdClpbi0+ZGF0YVswXSAmIDE1IHwgaW4tPmxpbmVzaXplWzBdICYgMTUpOworICAgIGRlc2hha2UtPnNhZCA9IGF2X3BpeGVsdXRpbHNfZ2V0X3NhZF9mbig0LCA0LCBhbGlnbmVkLCBkZXNoYWtlKTsgLy8gMTZ4MTYsIDJuZCBzb3VyY2UgdW5hbGlnbmVkCisgICAgaWYgKCFkZXNoYWtlLT5zYWQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAKICAgICBpZiAoZGVzaGFrZS0+Y3ggPCAwIHx8IGRlc2hha2UtPmN5IDwgMCB8fCBkZXNoYWtlLT5jdyA8IDAgfHwgZGVzaGFrZS0+Y2ggPCAwKSB7CiAgICAgICAgIC8vIEZpbmQgdGhlIG1vc3QgbGlrZWx5IGdsb2JhbCBtb3Rpb24gZm9yIHRoZSBjdXJyZW50IGZyYW1lCkBAIC01MzYsMTMgKzUxNywxNiBAQAogICAgIGF2X2ZyYW1lX2ZyZWUoJmRlc2hha2UtPnJlZik7CiAKICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZ290byBmYWlsOwogCiAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgZnJhbWUgYXMgdGhlIHJlZmVyZW5jZSBmcmFtZSBmb3IgY2FsY3VsYXRpbmcgdGhlCiAgICAgLy8gbW90aW9uIG9mIHRoZSBuZXh0IGZyYW1lCiAgICAgZGVzaGFrZS0+cmVmID0gaW47CiAKICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGRlc2hha2VfaW5wdXRzW10gPSB7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9kZXNwaWxsLmMgYi9saWJhdmZpbHRlci92Zl9kZXNwaWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMjdmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2Rlc3BpbGwuYwpAQCAtMCwwICsxLDE4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IERlc3BpbGxDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludCBjb1s0XTsgLyogY29sb3Igb2Zmc2V0cyByZ2JhICovCisKKyAgICBpbnQgYWxwaGE7CisgICAgaW50IHR5cGU7CisgICAgZmxvYXQgc3BpbGxtaXg7CisgICAgZmxvYXQgc3BpbGxleHBhbmQ7CisgICAgZmxvYXQgcmVkc2NhbGU7CisgICAgZmxvYXQgZ3JlZW5zY2FsZTsKKyAgICBmbG9hdCBibHVlc2NhbGU7CisgICAgZmxvYXQgYnJpZ2h0bmVzczsKK30gRGVzcGlsbENvbnRleHQ7CisKK3N0YXRpYyBpbnQgZG9fZGVzcGlsbF9zbGljZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIERlc3BpbGxDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKmZyYW1lID0gYXJnOworICAgIGNvbnN0IGludCBybyA9IHMtPmNvWzBdLCBnbyA9IHMtPmNvWzFdLCBibyA9IHMtPmNvWzJdLCBhbyA9IHMtPmNvWzNdOworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChmcmFtZS0+aGVpZ2h0ICogam9ibnIpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kID0gKGZyYW1lLT5oZWlnaHQgKiAoam9ibnIgKyAxKSkgLyBuYl9qb2JzOworICAgIGNvbnN0IGZsb2F0IGJyaWdodG5lc3MgPSBzLT5icmlnaHRuZXNzOworICAgIGNvbnN0IGZsb2F0IHJlZHNjYWxlID0gcy0+cmVkc2NhbGU7CisgICAgY29uc3QgZmxvYXQgZ3JlZW5zY2FsZSA9IHMtPmdyZWVuc2NhbGU7CisgICAgY29uc3QgZmxvYXQgYmx1ZXNjYWxlID0gcy0+Ymx1ZXNjYWxlOworICAgIGNvbnN0IGZsb2F0IHNwaWxsbWl4ID0gcy0+c3BpbGxtaXg7CisgICAgY29uc3QgZmxvYXQgZmFjdG9yID0gKDEuZiAtIHNwaWxsbWl4KSAqICgxLmYgLSBzLT5zcGlsbGV4cGFuZCk7CisgICAgZmxvYXQgcmVkLCBncmVlbiwgYmx1ZTsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gZnJhbWUtPmRhdGFbMF0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgZmxvYXQgc3BpbGxtYXA7CisKKyAgICAgICAgICAgIHJlZCAgID0gZHN0W3ggKiA0ICsgcm9dIC8gMjU1LmY7CisgICAgICAgICAgICBncmVlbiA9IGRzdFt4ICogNCArIGdvXSAvIDI1NS5mOworICAgICAgICAgICAgYmx1ZSAgPSBkc3RbeCAqIDQgKyBib10gLyAyNTUuZjsKKworICAgICAgICAgICAgaWYgKHMtPnR5cGUpIHsKKyAgICAgICAgICAgICAgICBzcGlsbG1hcCA9IEZGTUFYKGJsdWUgIC0gKHJlZCAqIHNwaWxsbWl4ICsgZ3JlZW4gKiBmYWN0b3IpLCAwLmYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzcGlsbG1hcCA9IEZGTUFYKGdyZWVuIC0gKHJlZCAqIHNwaWxsbWl4ICsgYmx1ZSAgKiBmYWN0b3IpLCAwLmYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWQgICA9IEZGTUFYKHJlZCAgICsgc3BpbGxtYXAgKiByZWRzY2FsZSAgICsgYnJpZ2h0bmVzcyAqIHNwaWxsbWFwLCAwLmYpOworICAgICAgICAgICAgZ3JlZW4gPSBGRk1BWChncmVlbiArIHNwaWxsbWFwICogZ3JlZW5zY2FsZSArIGJyaWdodG5lc3MgKiBzcGlsbG1hcCwgMC5mKTsKKyAgICAgICAgICAgIGJsdWUgID0gRkZNQVgoYmx1ZSAgKyBzcGlsbG1hcCAqIGJsdWVzY2FsZSAgKyBicmlnaHRuZXNzICogc3BpbGxtYXAsIDAuZik7CisKKyAgICAgICAgICAgIGRzdFt4ICogNCArIHJvXSA9IGF2X2NsaXBfdWludDgocmVkICAgKiAyNTUpOworICAgICAgICAgICAgZHN0W3ggKiA0ICsgZ29dID0gYXZfY2xpcF91aW50OChncmVlbiAqIDI1NSk7CisgICAgICAgICAgICBkc3RbeCAqIDQgKyBib10gPSBhdl9jbGlwX3VpbnQ4KGJsdWUgICogMjU1KTsKKyAgICAgICAgICAgIGlmIChzLT5hbHBoYSkgeworICAgICAgICAgICAgICAgIHNwaWxsbWFwID0gMS5mIC0gc3BpbGxtYXA7CisgICAgICAgICAgICAgICAgZHN0W3ggKiA0ICsgYW9dID0gYXZfY2xpcF91aW50OChzcGlsbG1hcCAqIDI1NSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPmRzdDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHJldCA9IGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUoZnJhbWUpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHJldCA9IGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBkb19kZXNwaWxsX3NsaWNlLCBmcmFtZSwgTlVMTCwgRkZNSU4oZnJhbWUtPmhlaWdodCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBEZXNwaWxsQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorICAgICAgICBzLT5jb1tpXSA9IGRlc2MtPmNvbXBbaV0ub2Zmc2V0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4ZWxfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX0FSR0IsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQSwKKyAgICAgICAgQVZfUElYX0ZNVF9BQkdSLAorICAgICAgICBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzID0gTlVMTDsKKworICAgIGZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeGVsX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGRlc3BpbGxfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBkZXNwaWxsX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKERlc3BpbGxDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGRlc3BpbGxfb3B0aW9uc1tdID0geworICAgIHsgInR5cGUiLCAgICAgICAic2V0IHRoZSBzY3JlZW4gdHlwZSIsICAgICBPRkZTRVQodHlwZSksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICB7Lmk2ND0wfSwgICAgIDAsICAgMSwgRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgICAiZ3JlZW4iLCAgICAiZ3JlZW5zY3JlZW4iLCAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICB7Lmk2ND0wfSwgICAgIDAsICAgMCwgRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgICAiYmx1ZSIsICAgICAiYmx1ZXNjcmVlbiIsICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICB7Lmk2ND0xfSwgICAgIDAsICAgMCwgRkxBR1MsICJ0eXBlIiB9LAorICAgIHsgIm1peCIsICAgICAgICAic2V0IHRoZSBzcGlsbG1hcCBtaXgiLCAgICBPRkZTRVQoc3BpbGxtaXgpLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgICB7LmRibD0wLjV9LCAgIDAsICAgMSwgRkxBR1MgfSwKKyAgICB7ICJleHBhbmQiLCAgICAgInNldCB0aGUgc3BpbGxtYXAgZXhwYW5kIiwgT0ZGU0VUKHNwaWxsZXhwYW5kKSwgQVZfT1BUX1RZUEVfRkxPQVQsICAgey5kYmw9MH0sICAgICAwLCAgIDEsIEZMQUdTIH0sCisgICAgeyAicmVkIiwgICAgICAgICJzZXQgcmVkIHNjYWxlIiwgICAgICAgICAgIE9GRlNFVChyZWRzY2FsZSksICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgIHsuZGJsPTB9LCAgLTEwMCwgMTAwLCBGTEFHUyB9LAorICAgIHsgImdyZWVuIiwgICAgICAic2V0IGdyZWVuIHNjYWxlIiwgICAgICAgICBPRkZTRVQoZ3JlZW5zY2FsZSksICBBVl9PUFRfVFlQRV9GTE9BVCwgICB7LmRibD0tMX0sIC0xMDAsIDEwMCwgRkxBR1MgfSwKKyAgICB7ICJibHVlIiwgICAgICAgInNldCBibHVlIHNjYWxlIiwgICAgICAgICAgT0ZGU0VUKGJsdWVzY2FsZSksICAgQVZfT1BUX1RZUEVfRkxPQVQsICAgey5kYmw9MH0sICAtMTAwLCAxMDAsIEZMQUdTIH0sCisgICAgeyAiYnJpZ2h0bmVzcyIsICJzZXQgYnJpZ2h0bmVzcyIsICAgICAgICAgIE9GRlNFVChicmlnaHRuZXNzKSwgIEFWX09QVF9UWVBFX0ZMT0FULCAgIHsuZGJsPTB9LCAgIC0xMCwgIDEwLCBGTEFHUyB9LAorICAgIHsgImFscGhhIiwgICAgICAiY2hhbmdlIGFscGhhIGNvbXBvbmVudCIsICBPRkZTRVQoYWxwaGEpLCAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgICB7Lmk2ND0wfSwgICAgIDAsICAgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGRlc3BpbGwpOworCitBVkZpbHRlciBmZl92Zl9kZXNwaWxsID0geworICAgIC5uYW1lICAgICAgICAgID0gImRlc3BpbGwiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRlc3BpbGwgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRGVzcGlsbENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmRlc3BpbGxfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gZGVzcGlsbF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBkZXNwaWxsX291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQyB8IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9kZXRlbGVjaW5lLmMgYi9saWJhdmZpbHRlci92Zl9kZXRlbGVjaW5lLmMKaW5kZXggNmZkOWFhZC4uMGQxZTJmMiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZGV0ZWxlY2luZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2RldGVsZWNpbmUuYwpAQCAtMzIsMTEgKzMyLDEyIEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBEZXRlbGVjaW5lQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IGZpcnN0X2ZpZWxkOwogICAgIGNoYXIgKnBhdHRlcm47CiAgICAgaW50IHN0YXJ0X2ZyYW1lOworICAgIGludCBpbml0X2xlbjsKICAgICB1bnNpZ25lZCBpbnQgcGF0dGVybl9wb3M7CiAgICAgdW5zaWduZWQgaW50IG5za2lwX2ZpZWxkczsKICAgICBpbnQ2NF90IHN0YXJ0X3RpbWU7CkBAIC00OSw3ICs1MCw3IEBACiAgICAgaW50IHBsYW5laGVpZ2h0WzRdOwogICAgIGludCBzdHJpZGVbNF07CiAKLSAgICBBVkZyYW1lICpmcmFtZTsKKyAgICBBVkZyYW1lICpmcmFtZVsyXTsKICAgICBBVkZyYW1lICp0ZW1wOwogfSBEZXRlbGVjaW5lQ29udGV4dDsKIApAQCAtNzQsNiArNzUsNyBAQAogICAgIERldGVsZWNpbmVDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIGNvbnN0IGNoYXIgKnA7CiAgICAgaW50IG1heCA9IDA7CisgICAgaW50IHN1bSA9IDA7CiAKICAgICBpZiAoIXN0cmxlbihzLT5wYXR0ZXJuKSkgewogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBwYXR0ZXJuIHByb3ZpZGVkLlxuIik7CkBAIC04NiwxNCArODgsMjEgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAKKyAgICAgICAgc3VtICs9ICpwIC0gJzAnOwogICAgICAgICBtYXggPSBGRk1BWCgqcCAtICcwJywgbWF4KTsKICAgICAgICAgcy0+cHRzLm51bSArPSAqcCAtICcwJzsKICAgICAgICAgcy0+cHRzLmRlbiArPSAyOwogICAgIH0KIAorICAgIGlmIChzLT5zdGFydF9mcmFtZSA+PSBzdW0pIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUHJvdmlkZWQgc3RhcnRfZnJhbWUgaXMgdG9vIGJpZy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKICAgICBzLT5uc2tpcF9maWVsZHMgPSAwOwogICAgIHMtPnBhdHRlcm5fcG9zID0gMDsKICAgICBzLT5zdGFydF90aW1lID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcy0+aW5pdF9sZW4gPSAwOwogCiAgICAgaWYgKHMtPnN0YXJ0X2ZyYW1lICE9IDApIHsKICAgICAgICAgaW50IG5maWVsZHMgPSAwOwpAQCAtMTAxLDcgKzExMCw3IEBACiAgICAgICAgICAgICBuZmllbGRzICs9ICpwIC0gJzAnOwogICAgICAgICAgICAgcy0+cGF0dGVybl9wb3MrKzsKICAgICAgICAgICAgIGlmIChuZmllbGRzID49IDIqcy0+c3RhcnRfZnJhbWUpIHsKLSAgICAgICAgICAgICAgICBzLT5uc2tpcF9maWVsZHMgPSBuZmllbGRzIC0gMipzLT5zdGFydF9mcmFtZTsKKyAgICAgICAgICAgICAgICBzLT5pbml0X2xlbiA9IG5maWVsZHMgLSAyKnMtPnN0YXJ0X2ZyYW1lOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDAsOCArMTQ5LDEyIEBACiAgICAgaWYgKCFzLT50ZW1wKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgcy0+ZnJhbWUgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGlubGluaywgaW5saW5rLT53LCBpbmxpbmstPmgpOwotICAgIGlmICghcy0+ZnJhbWUpCisgICAgcy0+ZnJhbWVbMF0gPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGlubGluaywgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgIGlmICghcy0+ZnJhbWVbMF0pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT5mcmFtZVsxXSA9IGZmX2dldF92aWRlb19idWZmZXIoaW5saW5rLCBpbmxpbmstPncsIGlubGluay0+aCk7CisgICAgaWYgKCFzLT5mcmFtZVsxXSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMocy0+c3RyaWRlLCBpbmxpbmstPmZvcm1hdCwgaW5saW5rLT53KSkgPCAwKQpAQCAtMTk1LDI0ICsyMDgsMjAgQEAKICAgICAgICAgcy0+bnNraXBfZmllbGRzIC09IDI7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0gZWxzZSBpZiAocy0+bnNraXBfZmllbGRzID49IDEpIHsKLSAgICAgICAgaWYgKHMtPm9jY3VwaWVkKSB7Ci0gICAgICAgICAgICBzLT5vY2N1cGllZCA9IDA7Ci0gICAgICAgICAgICBzLT5uc2tpcF9maWVsZHMtLTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKSB7CisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKHMtPnRlbXAtPmRhdGFbaV0sIHMtPnRlbXAtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpY3JlZi0+ZGF0YVtpXSwgaW5waWNyZWYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJpZGVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBsYW5laGVpZ2h0W2ldKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9wbGFuZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUocy0+dGVtcC0+ZGF0YVtpXSwgcy0+dGVtcC0+bGluZXNpemVbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpY3JlZi0+ZGF0YVtpXSwgaW5waWNyZWYtPmxpbmVzaXplW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyaWRlW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVoZWlnaHRbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+b2NjdXBpZWQgPSAxOwotICAgICAgICAgICAgcy0+bnNraXBfZmllbGRzLS07Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQorICAgICAgICBzLT5vY2N1cGllZCA9IDE7CisgICAgICAgIHMtPm5za2lwX2ZpZWxkcy0tOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBpZiAocy0+bnNraXBfZmllbGRzID09IDApIHsKKyAgICAgICAgbGVuID0gcy0+aW5pdF9sZW47CisgICAgICAgIHMtPmluaXRfbGVuID0gMDsKICAgICAgICAgd2hpbGUoIWxlbiAmJiBzLT5wYXR0ZXJuW3MtPnBhdHRlcm5fcG9zXSkgewogICAgICAgICAgICAgbGVuID0gcy0+cGF0dGVybltzLT5wYXR0ZXJuX3Bvc10gLSAnMCc7CiAgICAgICAgICAgICBzLT5wYXR0ZXJuX3BvcysrOwpAQCAtMjI2LDU4ICsyMzUsODUgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGxlbiA9PSAxICYmIHMtPm9jY3VwaWVkKSB7CisgICAgICAgICAgICBzLT5vY2N1cGllZCA9IDA7CisgICAgICAgICAgICAvLyBvdXRwdXQgVEhJUyBpbWFnZSBhcy1pcworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKQorICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUocy0+ZnJhbWVbb3V0XS0+ZGF0YVtpXSwgcy0+ZnJhbWVbb3V0XS0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50ZW1wLT5kYXRhW2ldLCBzLT50ZW1wLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmlkZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBsYW5laGVpZ2h0W2ldKTsKKyAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICB3aGlsZSghbGVuICYmIHMtPnBhdHRlcm5bcy0+cGF0dGVybl9wb3NdKSB7CisgICAgICAgICAgICAgICAgbGVuID0gcy0+cGF0dGVybltzLT5wYXR0ZXJuX3Bvc10gLSAnMCc7CisgICAgICAgICAgICAgICAgcy0+cGF0dGVybl9wb3MrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzLT5wYXR0ZXJuW3MtPnBhdHRlcm5fcG9zXSkKKyAgICAgICAgICAgICAgICBzLT5wYXR0ZXJuX3BvcyA9IDA7CisKKyAgICAgICAgICAgIHMtPm9jY3VwaWVkID0gMDsKKyAgICAgICAgICAgICsrb3V0OworICAgICAgICB9CisKICAgICAgICAgaWYgKHMtPm9jY3VwaWVkKSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKICAgICAgICAgICAgICAgICAvLyBmaWxsIGluIHRoZSBFQVJMSUVSIGZpZWxkIGZyb20gdGhlIG5ldyBwaWMKLSAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKHMtPmZyYW1lLT5kYXRhW2ldICsgcy0+ZnJhbWUtPmxpbmVzaXplW2ldICogcy0+Zmlyc3RfZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZS0+bGluZXNpemVbaV0gKiAyLAorICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUocy0+ZnJhbWVbb3V0XS0+ZGF0YVtpXSArIHMtPmZyYW1lW291dF0tPmxpbmVzaXplW2ldICogcy0+Zmlyc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mcmFtZVtvdXRdLT5saW5lc2l6ZVtpXSAqIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpY3JlZi0+ZGF0YVtpXSArIGlucGljcmVmLT5saW5lc2l6ZVtpXSAqIHMtPmZpcnN0X2ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5waWNyZWYtPmxpbmVzaXplW2ldICogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmlkZVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5wbGFuZWhlaWdodFtpXSAtIHMtPmZpcnN0X2ZpZWxkICsgMSkgLyAyKTsKICAgICAgICAgICAgICAgICAvLyBmaWxsIGluIHRoZSBMQVRFUiBmaWVsZCBmcm9tIHRoZSBidWZmZXJlZCBwaWMKLSAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKHMtPmZyYW1lLT5kYXRhW2ldICsgcy0+ZnJhbWUtPmxpbmVzaXplW2ldICogIXMtPmZpcnN0X2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZnJhbWUtPmxpbmVzaXplW2ldICogMiwKKyAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKHMtPmZyYW1lW291dF0tPmRhdGFbaV0gKyBzLT5mcmFtZVtvdXRdLT5saW5lc2l6ZVtpXSAqICFzLT5maXJzdF9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lW291dF0tPmxpbmVzaXplW2ldICogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRlbXAtPmRhdGFbaV0gKyBzLT50ZW1wLT5saW5lc2l6ZVtpXSAqICFzLT5maXJzdF9maWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnRlbXAtPmxpbmVzaXplW2ldICogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmlkZVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5wbGFuZWhlaWdodFtpXSAtICFzLT5maXJzdF9maWVsZCArIDEpIC8gMik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZW4gLT0gMjsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9wbGFuZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUocy0+dGVtcC0+ZGF0YVtpXSwgcy0+dGVtcC0+bGluZXNpemVbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpY3JlZi0+ZGF0YVtpXSwgaW5waWNyZWYtPmxpbmVzaXplW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyaWRlW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVoZWlnaHRbaV0pOworCisgICAgICAgICAgICBzLT5vY2N1cGllZCA9IDA7CisgICAgICAgICAgICBpZiAobGVuIDw9IDIpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShzLT50ZW1wLT5kYXRhW2ldLCBzLT50ZW1wLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpY3JlZi0+ZGF0YVtpXSwgaW5waWNyZWYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmlkZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZWhlaWdodFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPm9jY3VwaWVkID0gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPm9jY3VwaWVkID0gMTsKLSAgICAgICAgICAgIG91dCA9IDE7CisgICAgICAgICAgICArK291dDsKKyAgICAgICAgICAgIGxlbiA9IChsZW4gPj0gMykgPyBsZW4gLSAzIDogMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChsZW4gPj0gMikgewogICAgICAgICAgICAgICAgIC8vIG91dHB1dCBUSElTIGltYWdlIGFzLWlzCiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKQotICAgICAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKHMtPmZyYW1lLT5kYXRhW2ldLCBzLT5mcmFtZS0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUocy0+ZnJhbWVbb3V0XS0+ZGF0YVtpXSwgcy0+ZnJhbWVbb3V0XS0+bGluZXNpemVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5waWNyZWYtPmRhdGFbaV0sIGlucGljcmVmLT5saW5lc2l6ZVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJpZGVbaV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmVoZWlnaHRbaV0pOwogICAgICAgICAgICAgICAgIGxlbiAtPSAyOwotICAgICAgICAgICAgICAgIG91dCA9IDE7CisgICAgICAgICAgICAgICAgKytvdXQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy8gZmlsbCBpbiB0aGUgRUFSTElFUiBmaWVsZCBmcm9tIHRoZSBuZXcgcGljCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUocy0+ZnJhbWUtPmRhdGFbaV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lLT5saW5lc2l6ZVtpXSAqIHMtPmZpcnN0X2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZyYW1lLT5saW5lc2l6ZVtpXSAqIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5waWNyZWYtPmRhdGFbaV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucGljcmVmLT5saW5lc2l6ZVtpXSAqIHMtPmZpcnN0X2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucGljcmVmLT5saW5lc2l6ZVtpXSAqIDIsIHMtPnN0cmlkZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+cGxhbmVoZWlnaHRbaV0gLSBzLT5maXJzdF9maWVsZCArIDEpIC8gMik7Ci0gICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBvdXRwdXQgVEhJUyBpbWFnZSBhcy1pcworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9wbGFuZXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShzLT5mcmFtZVtvdXRdLT5kYXRhW2ldLCBzLT5mcmFtZVtvdXRdLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpY3JlZi0+ZGF0YVtpXSwgaW5waWNyZWYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmlkZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZWhlaWdodFtpXSk7CiAKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBub3Qgc3VyZSBhYm91dCB0aGUgb3RoZXIgZmllbGQKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShzLT50ZW1wLT5kYXRhW2ldLCBzLT50ZW1wLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpY3JlZi0+ZGF0YVtpXSwgaW5waWNyZWYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmlkZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZWhlaWdodFtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPm9jY3VwaWVkID0gMTsKIAogICAgICAgICAgICAgICAgIGxlbi0tOwotICAgICAgICAgICAgICAgIG91dCA9IDE7CisgICAgICAgICAgICAgICAgKytvdXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMjg5LDggKzMyNSw4IEBACiAgICAgfQogICAgIHMtPm5za2lwX2ZpZWxkcyA9IGxlbjsKIAotICAgIGlmIChvdXQpIHsKLSAgICAgICAgQVZGcmFtZSAqZnJhbWUgPSBhdl9mcmFtZV9jbG9uZShzLT5mcmFtZSk7CisgICAgZm9yIChpID0gMDsgaSA8IG91dDsgKytpKSB7CisgICAgICAgIEFWRnJhbWUgKmZyYW1lID0gYXZfZnJhbWVfY2xvbmUocy0+ZnJhbWVbaV0pOwogCiAgICAgICAgIGlmICghZnJhbWUpIHsKICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmlucGljcmVmKTsKQEAgLTI5OSw3ICszMzUsNyBAQAogCiAgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMoZnJhbWUsIGlucGljcmVmKTsKICAgICAgICAgZnJhbWUtPnB0cyA9ICgocy0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgPyAwIDogcy0+c3RhcnRfdGltZSkgKwotICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZShvdXRsaW5rLT5mcmFtZV9jb3VudCwgcy0+dHNfdW5pdC5udW0sCisgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKG91dGxpbmstPmZyYW1lX2NvdW50X2luLCBzLT50c191bml0Lm51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dHNfdW5pdC5kZW4pOwogICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZnJhbWUpOwogICAgIH0KQEAgLTMxNCw3ICszNTAsOCBAQAogICAgIERldGVsZWNpbmVDb250ZXh0ICpzID0gY3R4LT5wcml2OwogCiAgICAgYXZfZnJhbWVfZnJlZSgmcy0+dGVtcCk7Ci0gICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lWzBdKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZVsxXSk7CiB9CiAKIHN0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBkZXRlbGVjaW5lX2lucHV0c1tdID0gewpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZGlzcGxhY2UuYyBiL2xpYmF2ZmlsdGVyL3ZmX2Rpc3BsYWNlLmMKaW5kZXggOWRhYTBjOS4uNzY4YWY2ZCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZGlzcGxhY2UuYworKysgYi9saWJhdmZpbHRlci92Zl9kaXNwbGFjZS5jCkBAIC0zMSw2ICszMSw3IEBACiAgICAgRURHRV9CTEFOSywKICAgICBFREdFX1NNRUFSLAogICAgIEVER0VfV1JBUCwKKyAgICBFREdFX01JUlJPUiwKICAgICBFREdFX05CCiB9OwogCkBAIC01Myw5ICs1NCwxMCBAQAogCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gZGlzcGxhY2Vfb3B0aW9uc1tdID0gewogICAgIHsgImVkZ2UiLCAic2V0IGVkZ2UgbW9kZSIsIE9GRlNFVChlZGdlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1FREdFX1NNRUFSfSwgMCwgRURHRV9OQi0xLCBGTEFHUywgImVkZ2UiIH0sCi0gICAgeyAgICJibGFuayIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RURHRV9CTEFOS30sIDAsIDAsIEZMQUdTLCAiZWRnZSIgfSwKLSAgICB7ICAgInNtZWFyIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1FREdFX1NNRUFSfSwgMCwgMCwgRkxBR1MsICJlZGdlIiB9LAotICAgIHsgICAid3JhcCIgLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVER0VfV1JBUH0sICAwLCAwLCBGTEFHUywgImVkZ2UiIH0sCisgICAgeyAgICJibGFuayIsICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1FREdFX0JMQU5LfSwgIDAsIDAsIEZMQUdTLCAiZWRnZSIgfSwKKyAgICB7ICAgInNtZWFyIiwgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVER0VfU01FQVJ9LCAgMCwgMCwgRkxBR1MsICJlZGdlIiB9LAorICAgIHsgICAid3JhcCIgLCAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RURHRV9XUkFQfSwgICAwLCAwLCBGTEFHUywgImVkZ2UiIH0sCisgICAgeyAgICJtaXJyb3IiICwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1FREdFX01JUlJPUn0sIDAsIDAsIEZMQUdTLCAiZWRnZSIgfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtMTMwLDYgKzEzMiwyMiBAQAogICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbWSAqIHNsaW5lc2l6ZSArIFhdOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgRURHRV9NSVJST1I6CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgWSA9IHkgKyB5c3JjW3hdIC0gMTI4OworICAgICAgICAgICAgICAgICAgICBpbnQgWCA9IHggKyB4c3JjW3hdIC0gMTI4OworCisgICAgICAgICAgICAgICAgICAgIGlmIChZIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFkgPSAoLVkpICUgaDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgWCA9ICgtWCkgJSB3OworICAgICAgICAgICAgICAgICAgICBpZiAoWSA+PSBoKQorICAgICAgICAgICAgICAgICAgICAgICAgWSA9IGggLSAoWSAlIGgpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFggPj0gdykKKyAgICAgICAgICAgICAgICAgICAgICAgIFggPSB3IC0gKFggJSB3KSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IHNyY1tZICogc2xpbmVzaXplICsgWF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB5c3JjICs9IHlsaW5lc2l6ZTsKQEAgLTE5Niw2ICsyMTQsMjQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFREdFX01JUlJPUjoKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmJfY29tcG9uZW50czsgYysrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBZID0geSArIHlzcmNbeCAqIHN0ZXAgKyBjXSAtIDEyODsKKyAgICAgICAgICAgICAgICAgICAgaW50IFggPSB4ICsgeHNyY1t4ICogc3RlcCArIGNdIC0gMTI4OworCisgICAgICAgICAgICAgICAgICAgIGlmIChZIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFkgPSAoLVkpICUgaDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFggPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgWCA9ICgtWCkgJSB3OworICAgICAgICAgICAgICAgICAgICBpZiAoWSA+PSBoKQorICAgICAgICAgICAgICAgICAgICAgICAgWSA9IGggLSAoWSAlIGgpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFggPj0gdykKKyAgICAgICAgICAgICAgICAgICAgICAgIFggPSB3IC0gKFggJSB3KSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICogc3RlcCArIGNdID0gc3JjW1kgKiBzbGluZXNpemUgKyBYICogc3RlcCArIGNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgeXNyYyArPSB5bGluZXNpemU7CkBAIC0yODAsMjcgKzMxNiwxNyBAQAogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dHMgbXVzdCBiZSBvZiBzYW1lIHBpeGVsIGZvcm1hdFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQotICAgIGlmIChzcmNsaW5rLT53ICAgICAgICAgICAgICAgICAgICAgICAhPSB4bGluay0+dyB8fAotICAgICAgICBzcmNsaW5rLT5oICAgICAgICAgICAgICAgICAgICAgICAhPSB4bGluay0+aCB8fAotICAgICAgICBzcmNsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSB4bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gfHwKLSAgICAgICAgc3JjbGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gIT0geGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIHx8Ci0gICAgICAgIHNyY2xpbmstPncgICAgICAgICAgICAgICAgICAgICAgICE9IHlsaW5rLT53IHx8Ci0gICAgICAgIHNyY2xpbmstPmggICAgICAgICAgICAgICAgICAgICAgICE9IHlsaW5rLT5oIHx8Ci0gICAgICAgIHNyY2xpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICE9IHlsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSB8fAotICAgICAgICBzcmNsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSB5bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pIHsKKyAgICBpZiAoc3JjbGluay0+dyAhPSB4bGluay0+dyB8fAorICAgICAgICBzcmNsaW5rLT5oICE9IHhsaW5rLT5oIHx8CisgICAgICAgIHNyY2xpbmstPncgIT0geWxpbmstPncgfHwKKyAgICAgICAgc3JjbGluay0+aCAhPSB5bGluay0+aCkgewogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGaXJzdCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgIgotICAgICAgICAgICAgICAgIihzaXplICVkeCVkLCBTQVIgJWQ6JWQpIGRvIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyAiCi0gICAgICAgICAgICAgICAic2Vjb25kIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAoJWR4JWQsIFNBUiAlZDolZCkgIgotICAgICAgICAgICAgICAgImFuZC9vciB0aGlyZCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgKCVkeCVkLCBTQVIgJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgIihzaXplICVkeCVkKSBkbyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgIgorICAgICAgICAgICAgICAgInNlY29uZCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgKCVkeCVkKSAiCisgICAgICAgICAgICAgICAiYW5kL29yIHRoaXJkIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAoJWR4JWQpXG4iLAogICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzBdLm5hbWUsIHNyY2xpbmstPncsIHNyY2xpbmstPmgsCi0gICAgICAgICAgICAgICBzcmNsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgIHNyY2xpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAogICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzFdLm5hbWUsIHhsaW5rLT53LCB4bGluay0+aCwKLSAgICAgICAgICAgICAgIHhsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgIHhsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKLSAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1syXS5uYW1lLCB5bGluay0+dywgeWxpbmstPmgsCi0gICAgICAgICAgICAgICB5bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCi0gICAgICAgICAgICAgICB5bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzJdLm5hbWUsIHlsaW5rLT53LCB5bGluay0+aCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCkBAIC0zMzMsMTYgKzM1OSwxMCBAQAogICAgIHJldHVybiBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZzLT5mcyk7CiB9CiAKLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewotICAgIERpc3BsYWNlQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OwotICAgIHJldHVybiBmZl9mcmFtZXN5bmNfZmlsdGVyX2ZyYW1lKCZzLT5mcywgaW5saW5rLCBidWYpOwotfQotCi1zdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQotewotICAgIERpc3BsYWNlQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKLSAgICByZXR1cm4gZmZfZnJhbWVzeW5jX3JlcXVlc3RfZnJhbWUoJnMtPmZzLCBvdXRsaW5rKTsKKyAgICBEaXNwbGFjZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19hY3RpdmF0ZSgmcy0+ZnMpOwogfQogCiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKQEAgLTM1NiwxOCArMzc2LDE1IEBACiAgICAgewogICAgICAgICAubmFtZSAgICAgICAgID0gInNvdXJjZSIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCiAgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCiAgICAgfSwKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAieG1hcCIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCiAgICAgfSwKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAieW1hcCIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTM3Nyw3ICszOTQsNiBAQAogICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKICAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKLSAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0zODgsNiArNDA0LDcgQEAKICAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihEaXNwbGFjZUNvbnRleHQpLAogICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAogICAgIC5pbnB1dHMgICAgICAgID0gZGlzcGxhY2VfaW5wdXRzLAogICAgIC5vdXRwdXRzICAgICAgID0gZGlzcGxhY2Vfb3V0cHV0cywKICAgICAucHJpdl9jbGFzcyAgICA9ICZkaXNwbGFjZV9jbGFzcywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2RyYXdib3guYyBiL2xpYmF2ZmlsdGVyL3ZmX2RyYXdib3guYwppbmRleCAzNWEwOGU4Li5jOWNiNjNkIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9kcmF3Ym94LmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfZHJhd2JveC5jCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgImgiLCAgICAgICAgICAgICAgLy8vPCBoZWlnaHQgb2YgdGhlIHJlbmRlcmVkIGJveAogICAgICJ3IiwgICAgICAgICAgICAgIC8vLzwgd2lkdGggIG9mIHRoZSByZW5kZXJlZCBib3gKICAgICAidCIsCi0gICAgIm1heCIsCisgICAgImZpbGwiLAogICAgIE5VTEwKIH07CiAKQEAgLTc5LDYgKzc5LDggQEAKICAgICBjaGFyICp4X2V4cHIsICp5X2V4cHI7IC8vLzwgZXhwcmVzc2lvbiBmb3IgeCBhbmQgeQogICAgIGNoYXIgKndfZXhwciwgKmhfZXhwcjsgLy8vPCBleHByZXNzaW9uIGZvciB3aWR0aCBhbmQgaGVpZ2h0CiAgICAgY2hhciAqdF9leHByOyAgICAgICAgICAvLy88IGV4cHJlc3Npb24gZm9yIHRoaWNrbmVzcworICAgIGludCBoYXZlX2FscGhhOworICAgIGludCByZXBsYWNlOwogfSBEcmF3Qm94Q29udGV4dDsKIAogc3RhdGljIGNvbnN0IGludCBOVU1fRVhQUl9FVkFMUyA9IDU7CkBAIC0xMTAsNiArMTEyLDcgQEAKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLCAgQVZfUElYX0ZNVF9ZVVY0MTBQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsICBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLAogICAgICAgICBBVl9QSVhfRk1UX05PTkUKICAgICB9OwogICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CkBAIC0xMzAsNiArMTMzLDcgQEAKIAogICAgIHMtPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OwogICAgIHMtPnZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIHMtPmhhdmVfYWxwaGEgPSBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQTsKIAogICAgIHZhcl92YWx1ZXNbVkFSX0lOX0hdID0gdmFyX3ZhbHVlc1tWQVJfSUhdID0gaW5saW5rLT5oOwogICAgIHZhcl92YWx1ZXNbVkFSX0lOX1ddID0gdmFyX3ZhbHVlc1tWQVJfSVddID0gaW5saW5rLT53OwpAQCAtMjEwLDI3ICsyMTQsNTUgQEAKICAgICBpbnQgcGxhbmUsIHgsIHksIHhiID0gcy0+eCwgeWIgPSBzLT55OwogICAgIHVuc2lnbmVkIGNoYXIgKnJvd1s0XTsKIAotICAgIGZvciAoeSA9IEZGTUFYKHliLCAwKTsgeSA8IGZyYW1lLT5oZWlnaHQgJiYgeSA8ICh5YiArIHMtPmgpOyB5KyspIHsKLSAgICAgICAgcm93WzBdID0gZnJhbWUtPmRhdGFbMF0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGlmIChzLT5oYXZlX2FscGhhICYmIHMtPnJlcGxhY2UpIHsKKyAgICAgICAgZm9yICh5ID0gRkZNQVgoeWIsIDApOyB5IDwgZnJhbWUtPmhlaWdodCAmJiB5IDwgKHliICsgcy0+aCk7IHkrKykgeworICAgICAgICAgICAgcm93WzBdID0gZnJhbWUtPmRhdGFbMF0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdOworICAgICAgICAgICAgcm93WzNdID0gZnJhbWUtPmRhdGFbM10gKyB5ICogZnJhbWUtPmxpbmVzaXplWzNdOwogCi0gICAgICAgIGZvciAocGxhbmUgPSAxOyBwbGFuZSA8IDM7IHBsYW5lKyspCi0gICAgICAgICAgICByb3dbcGxhbmVdID0gZnJhbWUtPmRhdGFbcGxhbmVdICsKLSAgICAgICAgICAgICAgICAgZnJhbWUtPmxpbmVzaXplW3BsYW5lXSAqICh5ID4+IHMtPnZzdWIpOworICAgICAgICAgICAgZm9yIChwbGFuZSA9IDE7IHBsYW5lIDwgMzsgcGxhbmUrKykKKyAgICAgICAgICAgICAgICByb3dbcGxhbmVdID0gZnJhbWUtPmRhdGFbcGxhbmVdICsKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKiAoeSA+PiBzLT52c3ViKTsKIAotICAgICAgICBpZiAocy0+aW52ZXJ0X2NvbG9yKSB7Ci0gICAgICAgICAgICBmb3IgKHggPSBGRk1BWCh4YiwgMCk7IHggPCB4YiArIHMtPncgJiYgeCA8IGZyYW1lLT53aWR0aDsgeCsrKQotICAgICAgICAgICAgICAgIGlmICgoeSAtIHliIDwgcy0+dGhpY2tuZXNzKSB8fCAoeWIgKyBzLT5oIC0gMSAtIHkgPCBzLT50aGlja25lc3MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICh4IC0geGIgPCBzLT50aGlja25lc3MpIHx8ICh4YiArIHMtPncgLSAxIC0geCA8IHMtPnRoaWNrbmVzcykpCi0gICAgICAgICAgICAgICAgICAgIHJvd1swXVt4XSA9IDB4ZmYgLSByb3dbMF1beF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKHggPSBGRk1BWCh4YiwgMCk7IHggPCB4YiArIHMtPncgJiYgeCA8IGZyYW1lLT53aWR0aDsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGFscGhhID0gKGRvdWJsZSlzLT55dXZfY29sb3JbQV0gLyAyNTU7CisgICAgICAgICAgICBpZiAocy0+aW52ZXJ0X2NvbG9yKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gRkZNQVgoeGIsIDApOyB4IDwgeGIgKyBzLT53ICYmIHggPCBmcmFtZS0+d2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5IC0geWIgPCBzLT50aGlja25lc3MpIHx8ICh5YiArIHMtPmggLSAxIC0geSA8IHMtPnRoaWNrbmVzcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICh4IC0geGIgPCBzLT50aGlja25lc3MpIHx8ICh4YiArIHMtPncgLSAxIC0geCA8IHMtPnRoaWNrbmVzcykpCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMF1beF0gPSAweGZmIC0gcm93WzBdW3hdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSBGRk1BWCh4YiwgMCk7IHggPCB4YiArIHMtPncgJiYgeCA8IGZyYW1lLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoeSAtIHliIDwgcy0+dGhpY2tuZXNzKSB8fCAoeWIgKyBzLT5oIC0gMSAtIHkgPCBzLT50aGlja25lc3MpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoeCAtIHhiIDwgcy0+dGhpY2tuZXNzKSB8fCAoeGIgKyBzLT53IC0gMSAtIHggPCBzLT50aGlja25lc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMF1beCAgICAgICAgICAgXSA9IHMtPnl1dl9jb2xvcltZXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1sxXVt4ID4+IHMtPmhzdWJdID0gcy0+eXV2X2NvbG9yW1VdOworICAgICAgICAgICAgICAgICAgICAgICAgcm93WzJdW3ggPj4gcy0+aHN1Yl0gPSBzLT55dXZfY29sb3JbVl07CisgICAgICAgICAgICAgICAgICAgICAgICByb3dbM11beCAgICAgICAgICAgXSA9IHMtPnl1dl9jb2xvcltBXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoeSA9IEZGTUFYKHliLCAwKTsgeSA8IGZyYW1lLT5oZWlnaHQgJiYgeSA8ICh5YiArIHMtPmgpOyB5KyspIHsKKyAgICAgICAgICAgIHJvd1swXSA9IGZyYW1lLT5kYXRhWzBdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVswXTsKIAotICAgICAgICAgICAgICAgIGlmICgoeSAtIHliIDwgcy0+dGhpY2tuZXNzKSB8fCAoeWIgKyBzLT5oIC0gMSAtIHkgPCBzLT50aGlja25lc3MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICh4IC0geGIgPCBzLT50aGlja25lc3MpIHx8ICh4YiArIHMtPncgLSAxIC0geCA8IHMtPnRoaWNrbmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgcm93WzBdW3ggICAgICAgICAgICAgICAgIF0gPSAoMSAtIGFscGhhKSAqIHJvd1swXVt4ICAgICAgICAgICAgICAgICBdICsgYWxwaGEgKiBzLT55dXZfY29sb3JbWV07Ci0gICAgICAgICAgICAgICAgICAgIHJvd1sxXVt4ID4+IHMtPmhzdWJdID0gKDEgLSBhbHBoYSkgKiByb3dbMV1beCA+PiBzLT5oc3ViXSArIGFscGhhICogcy0+eXV2X2NvbG9yW1VdOwotICAgICAgICAgICAgICAgICAgICByb3dbMl1beCA+PiBzLT5oc3ViXSA9ICgxIC0gYWxwaGEpICogcm93WzJdW3ggPj4gcy0+aHN1Yl0gKyBhbHBoYSAqIHMtPnl1dl9jb2xvcltWXTsKKyAgICAgICAgICAgIGZvciAocGxhbmUgPSAxOyBwbGFuZSA8IDM7IHBsYW5lKyspCisgICAgICAgICAgICAgICAgcm93W3BsYW5lXSA9IGZyYW1lLT5kYXRhW3BsYW5lXSArCisgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbcGxhbmVdICogKHkgPj4gcy0+dnN1Yik7CisKKyAgICAgICAgICAgIGlmIChzLT5pbnZlcnRfY29sb3IpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSBGRk1BWCh4YiwgMCk7IHggPCB4YiArIHMtPncgJiYgeCA8IGZyYW1lLT53aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoKHkgLSB5YiA8IHMtPnRoaWNrbmVzcykgfHwgKHliICsgcy0+aCAtIDEgLSB5IDwgcy0+dGhpY2tuZXNzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHggLSB4YiA8IHMtPnRoaWNrbmVzcykgfHwgKHhiICsgcy0+dyAtIDEgLSB4IDwgcy0+dGhpY2tuZXNzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1swXVt4XSA9IDB4ZmYgLSByb3dbMF1beF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IEZGTUFYKHhiLCAwKTsgeCA8IHhiICsgcy0+dyAmJiB4IDwgZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhID0gKGRvdWJsZSlzLT55dXZfY29sb3JbQV0gLyAyNTU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh5IC0geWIgPCBzLT50aGlja25lc3MpIHx8ICh5YiArIHMtPmggLSAxIC0geSA8IHMtPnRoaWNrbmVzcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICh4IC0geGIgPCBzLT50aGlja25lc3MpIHx8ICh4YiArIHMtPncgLSAxIC0geCA8IHMtPnRoaWNrbmVzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1swXVt4ICAgICAgICAgICAgICAgICBdID0gKDEgLSBhbHBoYSkgKiByb3dbMF1beCAgICAgICAgICAgICAgICAgXSArIGFscGhhICogcy0+eXV2X2NvbG9yW1ldOworICAgICAgICAgICAgICAgICAgICAgICAgcm93WzFdW3ggPj4gcy0+aHN1Yl0gPSAoMSAtIGFscGhhKSAqIHJvd1sxXVt4ID4+IHMtPmhzdWJdICsgYWxwaGEgKiBzLT55dXZfY29sb3JbVV07CisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMl1beCA+PiBzLT5oc3ViXSA9ICgxIC0gYWxwaGEpICogcm93WzJdW3ggPj4gcy0+aHN1Yl0gKyBhbHBoYSAqIHMtPnl1dl9jb2xvcltWXTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjU1LDYgKzI4Nyw3IEBACiAgICAgeyAiYyIsICAgICAgICAgInNldCBjb2xvciBvZiB0aGUgYm94IiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGNvbG9yX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImJsYWNrIiB9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCiAgICAgeyAidGhpY2tuZXNzIiwgInNldCB0aGUgYm94IHRoaWNrbmVzcyIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHRfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIzIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCiAgICAgeyAidCIsICAgICAgICAgInNldCB0aGUgYm94IHRoaWNrbmVzcyIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHRfZXhwciksICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIzIiB9LCAgICAgICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAicmVwbGFjZSIsICAgInJlcGxhY2UgY29sb3IgJiBhbHBoYSIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHJlcGxhY2UpLCAgIEFWX09QVF9UWVBFX0JPT0wsICAgeyAuaTY0PTAgfSwgICAgICAgICAwLCAgICAgICAgMSwgICAgICAgIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTMyMywyNSArMzU2LDUxIEBACiAgICAgaW50IHBsYW5lLCB4LCB5OwogICAgIHVpbnQ4X3QgKnJvd1s0XTsKIAotICAgIGZvciAoeSA9IDA7IHkgPCBmcmFtZS0+aGVpZ2h0OyB5KyspIHsKLSAgICAgICAgcm93WzBdID0gZnJhbWUtPmRhdGFbMF0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGlmIChkcmF3Z3JpZC0+aGF2ZV9hbHBoYSAmJiBkcmF3Z3JpZC0+cmVwbGFjZSkgeworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZnJhbWUtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICByb3dbMF0gPSBmcmFtZS0+ZGF0YVswXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgICAgICByb3dbM10gPSBmcmFtZS0+ZGF0YVszXSArIHkgKiBmcmFtZS0+bGluZXNpemVbM107CiAKLSAgICAgICAgZm9yIChwbGFuZSA9IDE7IHBsYW5lIDwgMzsgcGxhbmUrKykKLSAgICAgICAgICAgIHJvd1twbGFuZV0gPSBmcmFtZS0+ZGF0YVtwbGFuZV0gKwotICAgICAgICAgICAgICAgICBmcmFtZS0+bGluZXNpemVbcGxhbmVdICogKHkgPj4gZHJhd2dyaWQtPnZzdWIpOworICAgICAgICAgICAgZm9yIChwbGFuZSA9IDE7IHBsYW5lIDwgMzsgcGxhbmUrKykKKyAgICAgICAgICAgICAgICByb3dbcGxhbmVdID0gZnJhbWUtPmRhdGFbcGxhbmVdICsKKyAgICAgICAgICAgICAgICAgICAgIGZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKiAoeSA+PiBkcmF3Z3JpZC0+dnN1Yik7CiAKLSAgICAgICAgaWYgKGRyYXdncmlkLT5pbnZlcnRfY29sb3IpIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGg7IHgrKykKLSAgICAgICAgICAgICAgICBpZiAocGl4ZWxfYmVsb25nc190b19ncmlkKGRyYXdncmlkLCB4LCB5KSkKLSAgICAgICAgICAgICAgICAgICAgcm93WzBdW3hdID0gMHhmZiAtIHJvd1swXVt4XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGg7IHgrKykgewotICAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IChkb3VibGUpZHJhd2dyaWQtPnl1dl9jb2xvcltBXSAvIDI1NTsKKyAgICAgICAgICAgIGlmIChkcmF3Z3JpZC0+aW52ZXJ0X2NvbG9yKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGZyYW1lLT53aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfYmVsb25nc190b19ncmlkKGRyYXdncmlkLCB4LCB5KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1swXVt4XSA9IDB4ZmYgLSByb3dbMF1beF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfYmVsb25nc190b19ncmlkKGRyYXdncmlkLCB4LCB5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm93WzBdW3ggICAgICAgICAgICAgICAgICBdID0gZHJhd2dyaWQtPnl1dl9jb2xvcltZXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1sxXVt4ID4+IGRyYXdncmlkLT5oc3ViXSA9IGRyYXdncmlkLT55dXZfY29sb3JbVV07CisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMl1beCA+PiBkcmF3Z3JpZC0+aHN1Yl0gPSBkcmF3Z3JpZC0+eXV2X2NvbG9yW1ZdOworICAgICAgICAgICAgICAgICAgICAgICAgcm93WzNdW3ggICAgICAgICAgICAgICAgICBdID0gZHJhd2dyaWQtPnl1dl9jb2xvcltBXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBmcmFtZS0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIHJvd1swXSA9IGZyYW1lLT5kYXRhWzBdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVswXTsKIAotICAgICAgICAgICAgICAgIGlmIChwaXhlbF9iZWxvbmdzX3RvX2dyaWQoZHJhd2dyaWQsIHgsIHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvd1swXVt4ICAgICAgICAgICAgICAgICAgXSA9ICgxIC0gYWxwaGEpICogcm93WzBdW3ggICAgICAgICAgICAgICAgICBdICsgYWxwaGEgKiBkcmF3Z3JpZC0+eXV2X2NvbG9yW1ldOwotICAgICAgICAgICAgICAgICAgICByb3dbMV1beCA+PiBkcmF3Z3JpZC0+aHN1Yl0gPSAoMSAtIGFscGhhKSAqIHJvd1sxXVt4ID4+IGRyYXdncmlkLT5oc3ViXSArIGFscGhhICogZHJhd2dyaWQtPnl1dl9jb2xvcltVXTsKLSAgICAgICAgICAgICAgICAgICAgcm93WzJdW3ggPj4gZHJhd2dyaWQtPmhzdWJdID0gKDEgLSBhbHBoYSkgKiByb3dbMl1beCA+PiBkcmF3Z3JpZC0+aHN1Yl0gKyBhbHBoYSAqIGRyYXdncmlkLT55dXZfY29sb3JbVl07CisgICAgICAgICAgICBmb3IgKHBsYW5lID0gMTsgcGxhbmUgPCAzOyBwbGFuZSsrKQorICAgICAgICAgICAgICAgIHJvd1twbGFuZV0gPSBmcmFtZS0+ZGF0YVtwbGFuZV0gKworICAgICAgICAgICAgICAgICAgICAgZnJhbWUtPmxpbmVzaXplW3BsYW5lXSAqICh5ID4+IGRyYXdncmlkLT52c3ViKTsKKworICAgICAgICAgICAgaWYgKGRyYXdncmlkLT5pbnZlcnRfY29sb3IpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZnJhbWUtPndpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgICAgIGlmIChwaXhlbF9iZWxvbmdzX3RvX2dyaWQoZHJhd2dyaWQsIHgsIHkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcm93WzBdW3hdID0gMHhmZiAtIHJvd1swXVt4XTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGZyYW1lLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IChkb3VibGUpZHJhd2dyaWQtPnl1dl9jb2xvcltBXSAvIDI1NTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocGl4ZWxfYmVsb25nc190b19ncmlkKGRyYXdncmlkLCB4LCB5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcm93WzBdW3ggICAgICAgICAgICAgICAgICBdID0gKDEgLSBhbHBoYSkgKiByb3dbMF1beCAgICAgICAgICAgICAgICAgIF0gKyBhbHBoYSAqIGRyYXdncmlkLT55dXZfY29sb3JbWV07CisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMV1beCA+PiBkcmF3Z3JpZC0+aHN1Yl0gPSAoMSAtIGFscGhhKSAqIHJvd1sxXVt4ID4+IGRyYXdncmlkLT5oc3ViXSArIGFscGhhICogZHJhd2dyaWQtPnl1dl9jb2xvcltVXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1syXVt4ID4+IGRyYXdncmlkLT5oc3ViXSA9ICgxIC0gYWxwaGEpICogcm93WzJdW3ggPj4gZHJhd2dyaWQtPmhzdWJdICsgYWxwaGEgKiBkcmF3Z3JpZC0+eXV2X2NvbG9yW1ZdOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNjEsNiArNDIwLDcgQEAKICAgICB7ICJjIiwgICAgICAgICAic2V0IGNvbG9yIG9mIHRoZSBncmlkIiwgICBPRkZTRVQoY29sb3Jfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiYmxhY2siIH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJ0aGlja25lc3MiLCAic2V0IGdyaWQgbGluZSB0aGlja25lc3MiLCBPRkZTRVQodF9leHByKSwgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMSJ9LCAgICAgICAgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJ0IiwgICAgICAgICAic2V0IGdyaWQgbGluZSB0aGlja25lc3MiLCBPRkZTRVQodF9leHByKSwgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMSJ9LCAgICAgICAgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJyZXBsYWNlIiwgICAicmVwbGFjZSBjb2xvciAmIGFscGhhIiwgICBPRkZTRVQocmVwbGFjZSksICAgQVZfT1BUX1RZUEVfQk9PTCwgICB7IC5pNjQ9MCB9LCAgICAgICAgIDAsICAgICAgICAxLCAgICAgICAgRkxBR1MgfSwKICAgICB7IE5VTEwgfQogfTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZHJhd3RleHQuYyBiL2xpYmF2ZmlsdGVyL3ZmX2RyYXd0ZXh0LmMKaW5kZXggMWVmM2VjYi4uZTg5MDVhNCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZHJhd3RleHQuYworKysgYi9saWJhdmZpbHRlci92Zl9kcmF3dGV4dC5jCkBAIC0xNTYsOCArMTU2LDEyIEBACiAgICAgaW50IG1heF9nbHlwaF9oOyAgICAgICAgICAgICAgICAvLy88IG1heCBnbHlwaCBoZWlnaHQKICAgICBpbnQgc2hhZG93eCwgc2hhZG93eTsKICAgICBpbnQgYm9yZGVydzsgICAgICAgICAgICAgICAgICAgIC8vLzwgYm9yZGVyIHdpZHRoCisgICAgY2hhciAqZm9udHNpemVfZXhwcjsgICAgICAgICAgICAvLy88IGV4cHJlc3Npb24gZm9yIGZvbnRzaXplCisgICAgQVZFeHByICpmb250c2l6ZV9wZXhwcjsgICAgICAgICAvLy88IHBhcnNlZCBleHByZXNzaW9ucyBmb3IgZm9udHNpemUKICAgICB1bnNpZ25lZCBpbnQgZm9udHNpemU7ICAgICAgICAgIC8vLzwgZm9udCBzaXplIHRvIHVzZQorICAgIHVuc2lnbmVkIGludCBkZWZhdWx0X2ZvbnRzaXplOyAgLy8vPCBkZWZhdWx0IGZvbnQgc2l6ZSB0byB1c2UKIAorICAgIGludCBsaW5lX3NwYWNpbmc7ICAgICAgICAgICAgICAgLy8vPCBsaW5lcyBzcGFjaW5nIGluIHBpeGVscwogICAgIHNob3J0IGludCBkcmF3X2JveDsgICAgICAgICAgICAgLy8vPCBkcmF3IGJveCBhcm91bmQgdGV4dCAtIHRydWUgb3IgZmFsc2UKICAgICBpbnQgYm94Ym9yZGVydzsgICAgICAgICAgICAgICAgIC8vLzwgYm94IGJvcmRlciB3aWR0aAogICAgIGludCB1c2Vfa2VybmluZzsgICAgICAgICAgICAgICAgLy8vPCBmb250IGtlcm5pbmcgaXMgdXNlZCAtIHRydWUvZmFsc2UKQEAgLTIwOSw3ICsyMTMsOCBAQAogICAgIHsic2hhZG93Y29sb3IiLCAic2V0IHNoYWRvdyBjb2xvciIsICAgICBPRkZTRVQoc2hhZG93Y29sb3IucmdiYSksICAgQVZfT1BUX1RZUEVfQ09MT1IsICB7LnN0cj0iYmxhY2sifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHU30sCiAgICAgeyJib3giLCAgICAgICAgICJzZXQgYm94IiwgICAgICAgICAgICAgIE9GRlNFVChkcmF3X2JveCksICAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgIHsuaTY0PTB9LCAgICAgMCwgICAgICAgIDEgICAgICAgLCBGTEFHU30sCiAgICAgeyJib3hib3JkZXJ3IiwgICJzZXQgYm94IGJvcmRlciB3aWR0aCIsIE9GRlNFVChib3hib3JkZXJ3KSwgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTB9LCAgICAgSU5UX01JTiwgIElOVF9NQVggLCBGTEFHU30sCi0gICAgeyJmb250c2l6ZSIsICAgICJzZXQgZm9udCBzaXplIiwgICAgICAgIE9GRlNFVChmb250c2l6ZSksICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTB9LCAgICAgMCwgICAgICAgIElOVF9NQVggLCBGTEFHU30sCisgICAgeyJsaW5lX3NwYWNpbmciLCAgInNldCBsaW5lIHNwYWNpbmcgaW4gcGl4ZWxzIiwgT0ZGU0VUKGxpbmVfc3BhY2luZyksICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND0wfSwgICAgIElOVF9NSU4sICBJTlRfTUFYLEZMQUdTfSwKKyAgICB7ImZvbnRzaXplIiwgICAgInNldCBmb250IHNpemUiLCAgICAgICAgT0ZGU0VUKGZvbnRzaXplX2V4cHIpLCAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sICBDSEFSX01JTiwgQ0hBUl9NQVggLCBGTEFHU30sCiAgICAgeyJ4IiwgICAgICAgICAgICJzZXQgeCBleHByZXNzaW9uIiwgICAgIE9GRlNFVCh4X2V4cHIpLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIwIn0sICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHU30sCiAgICAgeyJ5IiwgICAgICAgICAgICJzZXQgeSBleHByZXNzaW9uIiwgICAgIE9GRlNFVCh5X2V4cHIpLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIwIn0sICAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHU30sCiAgICAgeyJzaGFkb3d4IiwgICAgICJzZXQgc2hhZG93IHggb2Zmc2V0IiwgIE9GRlNFVChzaGFkb3d4KSwgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTB9LCAgICAgSU5UX01JTiwgIElOVF9NQVggLCBGTEFHU30sCkBAIC0yMzMsNyArMjM4LDcgQEAKICAgICB7InJhdGUiLCAgICAgICAgICAgICJzZXQgcmF0ZSAodGltZWNvZGUgb25seSkiLCAgICAgICAgIE9GRlNFVCh0Y19yYXRlKSwgICAgICAgQVZfT1BUX1RZUEVfUkFUSU9OQUwsIHsuZGJsPTB9LCAgICAgICAgICAgMCwgIElOVF9NQVgsIEZMQUdTfSwKICAgICB7InJlbG9hZCIsICAgICAicmVsb2FkIHRleHQgZmlsZSBmb3IgZWFjaCBmcmFtZSIsICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocmVsb2FkKSwgICAgIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCiAgICAgeyAiYWxwaGEiLCAgICAgICAiYXBwbHkgYWxwaGEgd2hpbGUgcmVuZGVyaW5nIiwgT0ZGU0VUKGFfZXhwciksICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiMSIgICAgIH0sICAgICAgICAgIC5mbGFncyA9IEZMQUdTIH0sCi0gICAgeyJmaXhfYm91bmRzIiwgImNoZWNrIGFuZCBmaXggdGV4dCBjb29yZHMgdG8gYXZvaWQgY2xpcHBpbmciLCBPRkZTRVQoZml4X2JvdW5kcyksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTF9LCAwLCAxLCBGTEFHU30sCisgICAgeyJmaXhfYm91bmRzIiwgImNoZWNrIGFuZCBmaXggdGV4dCBjb29yZHMgdG8gYXZvaWQgY2xpcHBpbmciLCBPRkZTRVQoZml4X2JvdW5kcyksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCiAgICAgeyJzdGFydF9udW1iZXIiLCAic3RhcnQgZnJhbWUgbnVtYmVyIGZvciBuL2ZyYW1lX251bSB2YXJpYWJsZSIsIE9GRlNFVChzdGFydF9udW1iZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBJTlRfTUFYLCBGTEFHU30sCiAKICNpZiBDT05GSUdfTElCRlJJQklESQpAQCAtMjY3LDggKzI3Miw3IEBACiAjZGVmaW5lIEZUX0VSUk9SREVGKGUsIHYsIHMpIHsgKGUpLCAocykgfSwKICNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgeyAwLCBOVUxMIH0gfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBmdF9lcnJvcgoteworc3RhdGljIGNvbnN0IHN0cnVjdCBmdF9lcnJvciB7CiAgICAgaW50IGVycjsKICAgICBjb25zdCBjaGFyICplcnJfbXNnOwogfSBmdF9lcnJvcnNbXSA9CkBAIC0yODAsNiArMjg0LDcgQEAKICAgICBGVF9HbHlwaCBnbHlwaDsKICAgICBGVF9HbHlwaCBib3JkZXJfZ2x5cGg7CiAgICAgdWludDMyX3QgY29kZTsKKyAgICB1bnNpZ25lZCBpbnQgZm9udHNpemU7CiAgICAgRlRfQml0bWFwIGJpdG1hcDsgLy8vPCBhcnJheSBob2xkaW5nIGJpdG1hcHMgb2YgZm9udAogICAgIEZUX0JpdG1hcCBib3JkZXJfYml0bWFwOyAvLy88IGFycmF5IGhvbGRpbmcgYml0bWFwcyBvZiBmb250IGJvcmRlcgogICAgIEZUX0JCb3ggYmJveDsKQEAgLTI5Miw3ICsyOTcsMTEgQEAKIHsKICAgICBjb25zdCBHbHlwaCAqYSA9IGtleSwgKmJiID0gYjsKICAgICBpbnQ2NF90IGRpZmYgPSAoaW50NjRfdClhLT5jb2RlIC0gKGludDY0X3QpYmItPmNvZGU7Ci0gICAgcmV0dXJuIGRpZmYgPiAwID8gMSA6IGRpZmYgPCAwID8gLTEgOiAwOworCisgICAgaWYgKGRpZmYgIT0gMCkKKyAgICAgICAgIHJldHVybiBkaWZmID4gMCA/IDEgOiAtMTsKKyAgICBlbHNlCisgICAgICAgICByZXR1cm4gRkZESUZGU0lHTigoaW50NjRfdClhLT5mb250c2l6ZSwgKGludDY0X3QpYmItPmZvbnRzaXplKTsKIH0KIAogLyoqCkBAIC0zMTYsNiArMzI1LDcgQEAKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAgICAgZ2x5cGgtPmNvZGUgID0gY29kZTsKKyAgICBnbHlwaC0+Zm9udHNpemUgPSBzLT5mb250c2l6ZTsKIAogICAgIGlmIChGVF9HZXRfR2x5cGgocy0+ZmFjZS0+Z2x5cGgsICZnbHlwaC0+Z2x5cGgpKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKQEAgLTM2NSw2ICszNzUsNzYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0aWMgYXZfY29sZCBpbnQgc2V0X2ZvbnRzaXplKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB1bnNpZ25lZCBpbnQgZm9udHNpemUpCit7CisgICAgaW50IGVycjsKKyAgICBEcmF3VGV4dENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoKGVyciA9IEZUX1NldF9QaXhlbF9TaXplcyhzLT5mYWNlLCAwLCBmb250c2l6ZSkpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzZXQgZm9udCBzaXplIHRvICVkIHBpeGVsczogJXNcbiIsCisgICAgICAgICAgICAgICBmb250c2l6ZSwgRlRfRVJSTVNHKGVycikpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmZvbnRzaXplID0gZm9udHNpemU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHBhcnNlX2ZvbnRzaXplKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKHMtPmZvbnRzaXplX3BleHByKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChzLT5mb250c2l6ZV9leHByID09IE5VTEwpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoKGVyciA9IGF2X2V4cHJfcGFyc2UoJnMtPmZvbnRzaXplX3BleHByLCBzLT5mb250c2l6ZV9leHByLCB2YXJfbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIGZ1bjJfbmFtZXMsIGZ1bjIsIDAsIGN0eCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgdXBkYXRlX2ZvbnRzaXplKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICB1bnNpZ25lZCBpbnQgZm9udHNpemUgPSBzLT5kZWZhdWx0X2ZvbnRzaXplOworICAgIGludCBlcnI7CisgICAgZG91YmxlIHNpemUsIHJvdW5kZWRzaXplOworCisgICAgLy8gaWYgbm8gZm9udHNpemUgc3BlY2lmaWVkIHVzZSB0aGUgZGVmYXVsdAorICAgIGlmIChzLT5mb250c2l6ZV9leHByICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKChlcnIgPSBwYXJzZV9mb250c2l6ZShjdHgpKSA8IDApCisgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICAgICAgc2l6ZSA9IGF2X2V4cHJfZXZhbChzLT5mb250c2l6ZV9wZXhwciwgcy0+dmFyX3ZhbHVlcywgJnMtPnBybmcpOworCisgICAgICAgIGlmICghaXNuYW4oc2l6ZSkpIHsKKyAgICAgICAgICAgIHJvdW5kZWRzaXplID0gcm91bmQoc2l6ZSk7CisgICAgICAgICAgICAvLyB0ZXN0IGZvciBvdmVyZmxvdyBiZWZvcmUgY2FzdAorICAgICAgICAgICAgaWYgKCEocm91bmRlZHNpemUgPiBJTlRfTUlOICYmIHJvdW5kZWRzaXplIDwgSU5UX01BWCkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJmb250c2l6ZSBvdmVyZmxvd1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9udHNpemUgPSByb3VuZGVkc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmb250c2l6ZSA9PSAwKQorICAgICAgICBmb250c2l6ZSA9IDE7CisKKyAgICAvLyBubyBjaGFuZ2UKKyAgICBpZiAoZm9udHNpemUgPT0gcy0+Zm9udHNpemUpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIHNldF9mb250c2l6ZShjdHgsIGZvbnRzaXplKTsKK30KKwogc3RhdGljIGludCBsb2FkX2ZvbnRfZmlsZShBVkZpbHRlckNvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqcGF0aCwgaW50IGluZGV4KQogewogICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKQEAgLTM5Miw2ICs0NzIsNyBAQAogICAgIGludCBpbmRleDsKICAgICBkb3VibGUgc2l6ZTsKICAgICBpbnQgZXJyID0gQVZFUlJPUihFTk9FTlQpOworICAgIGludCBwYXJzZV9lcnI7CiAKICAgICBmb250Y29uZmlnID0gRmNJbml0TG9hZENvbmZpZ0FuZEZvbnRzKCk7CiAgICAgaWYgKCFmb250Y29uZmlnKSB7CkBAIC00MDYsOCArNDg3LDE4IEBACiAgICAgfQogCiAgICAgRmNQYXR0ZXJuQWRkU3RyaW5nKHBhdCwgRkNfRkFNSUxZLCBzLT5mb250KTsKLSAgICBpZiAocy0+Zm9udHNpemUpCi0gICAgICAgIEZjUGF0dGVybkFkZERvdWJsZShwYXQsIEZDX1NJWkUsIChkb3VibGUpcy0+Zm9udHNpemUpOworCisgICAgcGFyc2VfZXJyID0gcGFyc2VfZm9udHNpemUoY3R4KTsKKyAgICBpZiAoIXBhcnNlX2VycikgeworICAgICAgICBkb3VibGUgc2l6ZSA9IGF2X2V4cHJfZXZhbChzLT5mb250c2l6ZV9wZXhwciwgcy0+dmFyX3ZhbHVlcywgJnMtPnBybmcpOworCisgICAgICAgIGlmIChpc25hbihzaXplKSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW1wb3NzaWJsZSB0byBmaW5kIGZvbnQgaW5mb3JtYXRpb24iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBGY1BhdHRlcm5BZGREb3VibGUocGF0LCBGQ19TSVpFLCBzaXplKTsKKyAgICB9CiAKICAgICBGY0RlZmF1bHRTdWJzdGl0dXRlKHBhdCk7CiAKQEAgLTQ0MSw4ICs1MzIsOCBAQAogICAgIH0KIAogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiVXNpbmcgXCIlc1wiXG4iLCBmaWxlbmFtZSk7Ci0gICAgaWYgKCFzLT5mb250c2l6ZSkKLSAgICAgICAgcy0+Zm9udHNpemUgPSBzaXplICsgMC41OworICAgIGlmIChwYXJzZV9lcnIpCisgICAgICAgIHMtPmRlZmF1bHRfZm9udHNpemUgPSBzaXplICsgMC41OwogCiAgICAgZXJyID0gbG9hZF9mb250X2ZpbGUoY3R4LCBmaWxlbmFtZSwgaW5kZXgpOwogICAgIGlmIChlcnIpCkBAIC01OTcsNiArNjg4LDEyIEBACiAgICAgRHJhd1RleHRDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIEdseXBoICpnbHlwaDsKIAorICAgIGF2X2V4cHJfZnJlZShzLT5mb250c2l6ZV9wZXhwcik7CisgICAgcy0+Zm9udHNpemVfcGV4cHIgPSBOVUxMOworCisgICAgcy0+Zm9udHNpemUgPSAwOworICAgIHMtPmRlZmF1bHRfZm9udHNpemUgPSAxNjsKKwogICAgIGlmICghcy0+Zm9udGZpbGUgJiYgIUNPTkZJR19MSUJGT05UQ09ORklHKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGZvbnQgZmlsZW5hbWUgcHJvdmlkZWRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwpAQCAtNjQ0LDE2ICs3NDEsMTEgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBlcnIgPSBsb2FkX2ZvbnQoY3R4KTsKLSAgICBpZiAoZXJyKQorICAgIGlmICgoZXJyID0gbG9hZF9mb250KGN0eCkpIDwgMCkKICAgICAgICAgcmV0dXJuIGVycjsKLSAgICBpZiAoIXMtPmZvbnRzaXplKQotICAgICAgICBzLT5mb250c2l6ZSA9IDE2OwotICAgIGlmICgoZXJyID0gRlRfU2V0X1BpeGVsX1NpemVzKHMtPmZhY2UsIDAsIHMtPmZvbnRzaXplKSkpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHNldCBmb250IHNpemUgdG8gJWQgcGl4ZWxzOiAlc1xuIiwKLSAgICAgICAgICAgICAgIHMtPmZvbnRzaXplLCBGVF9FUlJNU0coZXJyKSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQorCisgICAgaWYgKChlcnIgPSB1cGRhdGVfZm9udHNpemUoY3R4KSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOwogCiAgICAgaWYgKHMtPmJvcmRlcncpIHsKICAgICAgICAgaWYgKEZUX1N0cm9rZXJfTmV3KHMtPmxpYnJhcnksICZzLT5zdHJva2VyKSkgewpAQCAtNzA3LDExICs3OTksMTQgQEAKIAogICAgIGF2X2V4cHJfZnJlZShzLT54X3BleHByKTsKICAgICBhdl9leHByX2ZyZWUocy0+eV9wZXhwcik7Ci0gICAgcy0+eF9wZXhwciA9IHMtPnlfcGV4cHIgPSBOVUxMOworICAgIGF2X2V4cHJfZnJlZShzLT5hX3BleHByKTsKKyAgICBhdl9leHByX2ZyZWUocy0+Zm9udHNpemVfcGV4cHIpOworCisgICAgcy0+eF9wZXhwciA9IHMtPnlfcGV4cHIgPSBzLT5hX3BleHByID0gcy0+Zm9udHNpemVfcGV4cHIgPSBOVUxMOworCiAgICAgYXZfZnJlZXAoJnMtPnBvc2l0aW9ucyk7CiAgICAgcy0+bmJfcG9zaXRpb25zID0gMDsKIAotCiAgICAgYXZfdHJlZV9lbnVtZXJhdGUocy0+Z2x5cGhzLCBOVUxMLCBOVUxMLCBnbHlwaF9lbnVfZnJlZSk7CiAgICAgYXZfdHJlZV9kZXN0cm95KHMtPmdseXBocyk7CiAgICAgcy0+Z2x5cGhzID0gTlVMTDsKQEAgLTczMCw3ICs4MjUsNyBAQAogICAgIERyYXdUZXh0Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKICAgICBpbnQgcmV0OwogCi0gICAgZmZfZHJhd19pbml0KCZzLT5kYywgaW5saW5rLT5mb3JtYXQsIDApOworICAgIGZmX2RyYXdfaW5pdCgmcy0+ZGMsIGlubGluay0+Zm9ybWF0LCBGRl9EUkFXX1BST0NFU1NfQUxQSEEpOwogICAgIGZmX2RyYXdfY29sb3IoJnMtPmRjLCAmcy0+Zm9udGNvbG9yLCAgIHMtPmZvbnRjb2xvci5yZ2JhKTsKICAgICBmZl9kcmF3X2NvbG9yKCZzLT5kYywgJnMtPnNoYWRvd2NvbG9yLCBzLT5zaGFkb3djb2xvci5yZ2JhKTsKICAgICBmZl9kcmF3X2NvbG9yKCZzLT5kYywgJnMtPmJvcmRlcmNvbG9yLCBzLT5ib3JkZXJjb2xvci5yZ2JhKTsKQEAgLTc1MCw3ICs4NDUsOCBAQAogCiAgICAgYXZfZXhwcl9mcmVlKHMtPnhfcGV4cHIpOwogICAgIGF2X2V4cHJfZnJlZShzLT55X3BleHByKTsKLSAgICBzLT54X3BleHByID0gcy0+eV9wZXhwciA9IE5VTEw7CisgICAgYXZfZXhwcl9mcmVlKHMtPmFfcGV4cHIpOworICAgIHMtPnhfcGV4cHIgPSBzLT55X3BleHByID0gcy0+YV9wZXhwciA9IE5VTEw7CiAKICAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2UoJnMtPnhfcGV4cHIsIHMtPnhfZXhwciwgdmFyX25hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBmdW4yX25hbWVzLCBmdW4yLCAwLCBjdHgpKSA8IDAgfHwKQEAgLTgwOSw3ICs5MDUsNyBAQAogICAgICAgICBwdHMgKz0gKGRvdWJsZSlkZWx0YSAvIEFWX1RJTUVfQkFTRTsKICAgICB9CiAgICAgaWYgKCFzdHJjbXAoZm10LCAiZmx0IikpIHsKLSAgICAgICAgYXZfYnByaW50ZihicCwgIiUuNmYiLCBzLT52YXJfdmFsdWVzW1ZBUl9UXSk7CisgICAgICAgIGF2X2JwcmludGYoYnAsICIlLjZmIiwgcHRzKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiaG1zIikpIHsKICAgICAgICAgaWYgKGlzbmFuKHB0cykpIHsKICAgICAgICAgICAgIGF2X2JwcmludGYoYnAsICIgPz86Pz86Pz8uPz8/Iik7CkBAIC04NjAsNiArOTU2LDggQEAKIAogICAgIGlmIChlICYmIGUtPnZhbHVlKQogICAgICAgICBhdl9icHJpbnRmKGJwLCAiJXMiLCBlLT52YWx1ZSk7CisgICAgZWxzZSBpZiAoYXJnYyA+PSAyKQorICAgICAgICBhdl9icHJpbnRmKGJwLCAiJXMiLCBhcmd2WzFdKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtOTc1LDcgKzEwNzMsNyBAQAogICAgIHsgImxvY2FsdGltZSIsIDAsIDEsICdMJywgZnVuY19zdHJmdGltZSB9LAogICAgIHsgImZyYW1lX251bSIsIDAsIDAsIDAsICAgZnVuY19mcmFtZV9udW0gfSwKICAgICB7ICJuIiwgICAgICAgICAwLCAwLCAwLCAgIGZ1bmNfZnJhbWVfbnVtIH0sCi0gICAgeyAibWV0YWRhdGEiLCAgMSwgMSwgMCwgICBmdW5jX21ldGFkYXRhIH0sCisgICAgeyAibWV0YWRhdGEiLCAgMSwgMiwgMCwgICBmdW5jX21ldGFkYXRhIH0sCiB9OwogCiBzdGF0aWMgaW50IGV2YWxfZnVuY3Rpb24oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWQlByaW50ICpicCwgY2hhciAqZmN0LApAQCAtMTA4OSw2ICsxMTg3LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIGR1bW15LmNvZGUgPSBjb2RlOworICAgICAgICBkdW1teS5mb250c2l6ZSA9IHMtPmZvbnRzaXplOwogICAgICAgICBnbHlwaCA9IGF2X3RyZWVfZmluZChzLT5nbHlwaHMsICZkdW1teSwgZ2x5cGhfY21wLCBOVUxMKTsKIAogICAgICAgICBiaXRtYXAgPSBib3JkZXJ3ID8gZ2x5cGgtPmJvcmRlcl9iaXRtYXAgOiBnbHlwaC0+Yml0bWFwOwpAQCAtMTE4Miw3ICsxMjgxLDcgQEAKIAogICAgIGlmIChzLT50Y19vcHRfc3RyaW5nKSB7CiAgICAgICAgIGNoYXIgdGNidWZbQVZfVElNRUNPREVfU1RSX1NJWkVdOwotICAgICAgICBhdl90aW1lY29kZV9tYWtlX3N0cmluZygmcy0+dGMsIHRjYnVmLCBpbmxpbmstPmZyYW1lX2NvdW50KTsKKyAgICAgICAgYXZfdGltZWNvZGVfbWFrZV9zdHJpbmcoJnMtPnRjLCB0Y2J1ZiwgaW5saW5rLT5mcmFtZV9jb3VudF9vdXQpOwogICAgICAgICBhdl9icHJpbnRfY2xlYXIoYnApOwogICAgICAgICBhdl9icHJpbnRmKGJwLCAiJXMlcyIsIHMtPnRleHQsIHRjYnVmKTsKICAgICB9CkBAIC0xMjE0LDE1ICsxMzEzLDIxIEBACiAgICAgeCA9IDA7CiAgICAgeSA9IDA7CiAKKyAgICBpZiAoKHJldCA9IHVwZGF0ZV9mb250c2l6ZShjdHgpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKICAgICAvKiBsb2FkIGFuZCBjYWNoZSBnbHlwaHMgKi8KICAgICBmb3IgKGkgPSAwLCBwID0gdGV4dDsgKnA7IGkrKykgewogICAgICAgICBHRVRfVVRGOChjb2RlLCAqcCsrLCBjb250aW51ZTspOwogCiAgICAgICAgIC8qIGdldCBnbHlwaCAqLwogICAgICAgICBkdW1teS5jb2RlID0gY29kZTsKKyAgICAgICAgZHVtbXkuZm9udHNpemUgPSBzLT5mb250c2l6ZTsKICAgICAgICAgZ2x5cGggPSBhdl90cmVlX2ZpbmQocy0+Z2x5cGhzLCAmZHVtbXksIGdseXBoX2NtcCwgTlVMTCk7CiAgICAgICAgIGlmICghZ2x5cGgpIHsKLSAgICAgICAgICAgIGxvYWRfZ2x5cGgoY3R4LCAmZ2x5cGgsIGNvZGUpOworICAgICAgICAgICAgcmV0ID0gbG9hZF9nbHlwaChjdHgsICZnbHlwaCwgY29kZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAKICAgICAgICAgeV9taW4gPSBGRk1JTihnbHlwaC0+YmJveC55TWluLCB5X21pbik7CkBAIC0xMjQ2LDcgKzEzNTEsNyBAQAogICAgICAgICBpZiAoaXNfbmV3bGluZShjb2RlKSkgewogCiAgICAgICAgICAgICBtYXhfdGV4dF9saW5lX3cgPSBGRk1BWChtYXhfdGV4dF9saW5lX3csIHgpOwotICAgICAgICAgICAgeSArPSBzLT5tYXhfZ2x5cGhfaDsKKyAgICAgICAgICAgIHkgKz0gcy0+bWF4X2dseXBoX2ggKyBzLT5saW5lX3NwYWNpbmc7CiAgICAgICAgICAgICB4ID0gMDsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0xMjU0LDYgKzEzNTksNyBAQAogICAgICAgICAvKiBnZXQgZ2x5cGggKi8KICAgICAgICAgcHJldl9nbHlwaCA9IGdseXBoOwogICAgICAgICBkdW1teS5jb2RlID0gY29kZTsKKyAgICAgICAgZHVtbXkuZm9udHNpemUgPSBzLT5mb250c2l6ZTsKICAgICAgICAgZ2x5cGggPSBhdl90cmVlX2ZpbmQocy0+Z2x5cGhzLCAmZHVtbXksIGdseXBoX2NtcCwgTlVMTCk7CiAKICAgICAgICAgLyoga2VybmluZyAqLwpAQCAtMTI4NCw2ICsxMzkwLDcgQEAKIAogICAgIHMtPnggPSBzLT52YXJfdmFsdWVzW1ZBUl9YXSA9IGF2X2V4cHJfZXZhbChzLT54X3BleHByLCBzLT52YXJfdmFsdWVzLCAmcy0+cHJuZyk7CiAgICAgcy0+eSA9IHMtPnZhcl92YWx1ZXNbVkFSX1ldID0gYXZfZXhwcl9ldmFsKHMtPnlfcGV4cHIsIHMtPnZhcl92YWx1ZXMsICZzLT5wcm5nKTsKKyAgICAvKiBJdCBpcyBuZWNlc3NhcnkgaWYgeCBpcyBleHByZXNzZWQgZnJvbSB5ICAqLwogICAgIHMtPnggPSBzLT52YXJfdmFsdWVzW1ZBUl9YXSA9IGF2X2V4cHJfZXZhbChzLT54X3BleHByLCBzLT52YXJfdmFsdWVzLCAmcy0+cHJuZyk7CiAKICAgICB1cGRhdGVfYWxwaGEocyk7CkBAIC0xMjk1LDYgKzE0MDIsMzIgQEAKICAgICBib3hfdyA9IEZGTUlOKHdpZHRoIC0gMSAsIG1heF90ZXh0X2xpbmVfdyk7CiAgICAgYm94X2ggPSBGRk1JTihoZWlnaHQgLSAxLCB5ICsgcy0+bWF4X2dseXBoX2gpOwogCisgICAgaWYgKHMtPmZpeF9ib3VuZHMpIHsKKworICAgICAgICAvKiBjYWxjdWxhdGUgZm9vdHByaW50IG9mIHRleHQgZWZmZWN0cyAqLworICAgICAgICBpbnQgYm94b2Zmc2V0ICAgICA9IHMtPmRyYXdfYm94ID8gRkZNQVgocy0+Ym94Ym9yZGVydywgMCkgOiAwOworICAgICAgICBpbnQgYm9yZGVyb2Zmc2V0ICA9IHMtPmJvcmRlcncgID8gRkZNQVgocy0+Ym9yZGVydywgMCkgOiAwOworCisgICAgICAgIGludCBvZmZzZXRsZWZ0ID0gRkZNQVgzKGJveG9mZnNldCwgYm9yZGVyb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c2hhZG93eCA8IDAgPyBGRkFCUyhzLT5zaGFkb3d4KSA6IDApKTsKKyAgICAgICAgaW50IG9mZnNldHRvcCA9IEZGTUFYMyhib3hvZmZzZXQsIGJvcmRlcm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnNoYWRvd3kgPCAwID8gRkZBQlMocy0+c2hhZG93eSkgOiAwKSk7CisKKyAgICAgICAgaW50IG9mZnNldHJpZ2h0ID0gRkZNQVgzKGJveG9mZnNldCwgYm9yZGVyb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnNoYWRvd3ggPiAwID8gcy0+c2hhZG93eCA6IDApKTsKKyAgICAgICAgaW50IG9mZnNldGJvdHRvbSA9IEZGTUFYMyhib3hvZmZzZXQsIGJvcmRlcm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+c2hhZG93eSA+IDAgPyBzLT5zaGFkb3d5IDogMCkpOworCisKKyAgICAgICAgaWYgKHMtPnggLSBvZmZzZXRsZWZ0IDwgMCkgcy0+eCA9IG9mZnNldGxlZnQ7CisgICAgICAgIGlmIChzLT55IC0gb2Zmc2V0dG9wIDwgMCkgIHMtPnkgPSBvZmZzZXR0b3A7CisKKyAgICAgICAgaWYgKHMtPnggKyBib3hfdyArIG9mZnNldHJpZ2h0ID4gd2lkdGgpCisgICAgICAgICAgICBzLT54ID0gRkZNQVgod2lkdGggLSBib3hfdyAtIG9mZnNldHJpZ2h0LCAwKTsKKyAgICAgICAgaWYgKHMtPnkgKyBib3hfaCArIG9mZnNldGJvdHRvbSA+IGhlaWdodCkKKyAgICAgICAgICAgIHMtPnkgPSBGRk1BWChoZWlnaHQgLSBib3hfaCAtIG9mZnNldGJvdHRvbSwgMCk7CisgICAgfQorCiAgICAgLyogZHJhdyBib3ggKi8KICAgICBpZiAocy0+ZHJhd19ib3gpCiAgICAgICAgIGZmX2JsZW5kX3JlY3RhbmdsZSgmcy0+ZGMsICZib3hjb2xvciwKQEAgLTEzNDEsMTIgKzE0NzQsMTIgQEAKICNlbmRpZgogICAgIH0KIAotICAgIHMtPnZhcl92YWx1ZXNbVkFSX05dID0gaW5saW5rLT5mcmFtZV9jb3VudCtzLT5zdGFydF9udW1iZXI7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfTl0gPSBpbmxpbmstPmZyYW1lX2NvdW50X291dCArIHMtPnN0YXJ0X251bWJlcjsKICAgICBzLT52YXJfdmFsdWVzW1ZBUl9UXSA9IGZyYW1lLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgPwogICAgICAgICBOQU4gOiBmcmFtZS0+cHRzICogYXZfcTJkKGlubGluay0+dGltZV9iYXNlKTsKIAogICAgIHMtPnZhcl92YWx1ZXNbVkFSX1BJQ1RfVFlQRV0gPSBmcmFtZS0+cGljdF90eXBlOwotICAgIHMtPm1ldGFkYXRhID0gYXZfZnJhbWVfZ2V0X21ldGFkYXRhKGZyYW1lKTsKKyAgICBzLT5tZXRhZGF0YSA9IGZyYW1lLT5tZXRhZGF0YTsKIAogICAgIGRyYXdfdGV4dChjdHgsIGZyYW1lLCBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQpOwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9lZGdlZGV0ZWN0LmMgYi9saWJhdmZpbHRlci92Zl9lZGdlZGV0ZWN0LmMKaW5kZXggYWM4OGUwMi4uMTczZjlmZSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZWRnZWRldGVjdC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2VkZ2VkZXRlY3QuYwpAQCAtNDQsNyArNDQsNyBAQAogICAgIGNoYXIgICAgICpkaXJlY3Rpb25zOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRWRnZURldGVjdENvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIHN0cnVjdCBwbGFuZV9pbmZvIHBsYW5lc1szXTsKICAgICBpbnQgbmJfcGxhbmVzOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZWxiZy5jIGIvbGliYXZmaWx0ZXIvdmZfZWxiZy5jCmluZGV4IGIzNDEzNmIuLjM5NmFmODIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2VsYmcuYworKysgYi9saWJhdmZpbHRlci92Zl9lbGJnLmMKQEAgLTE4Niw3ICsxODYsOCBAQAogICAgICAgICBwMCA9ICh1aW50OF90ICopb3V0LT5kYXRhWzBdOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBlbGJnLT5jb2RlYm9va19sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgcGFsW2ldID0gKGVsYmctPmNvZGVib29rW2kqMyAgXSA8PCAxNikgfAorICAgICAgICAgICAgcGFsW2ldID0gIDB4RkZVICAgICAgICAgICAgICAgICA8PCAyNCAgfAorICAgICAgICAgICAgICAgICAgICAgKGVsYmctPmNvZGVib29rW2kqMyAgXSA8PCAxNikgfAogICAgICAgICAgICAgICAgICAgICAgKGVsYmctPmNvZGVib29rW2kqMysxXSA8PCAgOCkgfAogICAgICAgICAgICAgICAgICAgICAgIGVsYmctPmNvZGVib29rW2kqMysyXTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZW50cm9weS5jIGIvbGliYXZmaWx0ZXIvdmZfZW50cm9weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDAyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9lbnRyb3B5LmMKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImRyYXd1dGlscy5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IEVudHJvcHlDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludCBtb2RlOworCisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07CisgICAgaW50IHBsYW5ld2lkdGhbNF07CisgICAgaW50IGRlcHRoOworICAgIGludCBpc19yZ2I7CisgICAgdWludDhfdCByZ2JhX21hcFs0XTsKKyAgICBjaGFyIHBsYW5lbmFtZXNbNF07CisgICAgaW50NjRfdCAqaGlzdG9ncmFtOworfSBFbnRyb3B5Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRW50cm9weUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGVudHJvcHlfb3B0aW9uc1tdID0geworICAgIHsgIm1vZGUiLCAic2V0IGtpbmQgb2YgaGlzdG9ncmFtIGVudHJvcHkgbWVhc3VyZW1lbnQiLCAgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsICAgey5pNjQ9MH0sIDAsIDEsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJub3JtYWwiLCBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAiZGlmZiIsICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZW50cm9weSk7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsIEFWX1BJWF9GTVRfWVVWSjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDksIEFWX1BJWF9GTVRfWVVWNDIyUDksIEFWX1BJWF9GTVRfWVVWNDIwUDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDIwUDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQyMFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQyMFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4Zm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmb3JtYXRzKTsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBFbnRyb3B5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPm5iX3BsYW5lcyA9IGRlc2MtPm5iX2NvbXBvbmVudHM7CisKKyAgICBzLT5wbGFuZWhlaWdodFsxXSA9IHMtPnBsYW5laGVpZ2h0WzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOworICAgIHMtPnBsYW5ld2lkdGhbMV0gID0gcy0+cGxhbmV3aWR0aFsyXSAgPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIHMtPnBsYW5ld2lkdGhbMF0gID0gcy0+cGxhbmV3aWR0aFszXSAgPSBpbmxpbmstPnc7CisKKyAgICBzLT5kZXB0aCA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgcy0+aXNfcmdiID0gZmZfZmlsbF9yZ2JhX21hcChzLT5yZ2JhX21hcCwgaW5saW5rLT5mb3JtYXQpID49IDA7CisKKyAgICBzLT5wbGFuZW5hbWVzWzBdID0gcy0+aXNfcmdiID8gJ1InIDogJ1knOworICAgIHMtPnBsYW5lbmFtZXNbMV0gPSBzLT5pc19yZ2IgPyAnRycgOiAnVSc7CisgICAgcy0+cGxhbmVuYW1lc1syXSA9IHMtPmlzX3JnYiA/ICdCJyA6ICdWJzsKKyAgICBzLT5wbGFuZW5hbWVzWzNdID0gJ0EnOworCisgICAgcy0+aGlzdG9ncmFtID0gYXZfbWFsbG9jX2FycmF5KDEgPDwgcy0+ZGVwdGgsIHNpemVvZigqcy0+aGlzdG9ncmFtKSk7CisgICAgaWYgKCFzLT5oaXN0b2dyYW0pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEVudHJvcHlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBwbGFuZSwgeSwgeDsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPm5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICBpbnQgY2lkeCA9IHMtPmlzX3JnYiA/IHMtPnJnYmFfbWFwW3BsYW5lXSA6IHBsYW5lOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmM4ID0gaW4tPmRhdGFbcGxhbmVdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjMTYgPSAoY29uc3QgdWludDE2X3QgKilpbi0+ZGF0YVtwbGFuZV07CisgICAgICAgIGZsb2F0IHRvdGFsID0gcy0+cGxhbmV3aWR0aFtwbGFuZV0gKiBzLT5wbGFuZWhlaWdodFtwbGFuZV07CisgICAgICAgIGZsb2F0IGVudHJvcHkgPSAwOworICAgICAgICBjaGFyIG1ldGFidWZbMTI4XTsKKyAgICAgICAgY2hhciBrZXlbMTI4XTsKKworICAgICAgICBtZW1zZXQocy0+aGlzdG9ncmFtLCAwLCAoMSA8PCBzLT5kZXB0aCkgKiBzaXplb2YoKnMtPmhpc3RvZ3JhbSkpOworCisgICAgICAgIGlmIChzLT5kZXB0aCA8PSA4KSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+cGxhbmVoZWlnaHRbcGxhbmVdOyB5KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+cGxhbmV3aWR0aFtwbGFuZV07IHgrKykgeworICAgICAgICAgICAgICAgICAgICBzLT5oaXN0b2dyYW1bc3JjOFt4XV0rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcmM4ICs9IGluLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+cGxhbmVoZWlnaHRbcGxhbmVdOyB5KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+cGxhbmV3aWR0aFtwbGFuZV07IHgrKykgeworICAgICAgICAgICAgICAgICAgICBzLT5oaXN0b2dyYW1bc3JjMTZbeF1dKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3JjMTYgKz0gaW4tPmxpbmVzaXplW3BsYW5lXSAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgMSA8PCBzLT5kZXB0aDsgeSsrKSB7CisgICAgICAgICAgICBpZiAocy0+bW9kZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHMtPmhpc3RvZ3JhbVt5XSkgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBwID0gcy0+aGlzdG9ncmFtW3ldIC8gdG90YWw7CisgICAgICAgICAgICAgICAgICAgIGVudHJvcHkgKz0gLWxvZzIocCkgKiBwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+bW9kZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKHkgJiYgKHMtPmhpc3RvZ3JhbVt5XSAtIHMtPmhpc3RvZ3JhbVt5IC0gMV0pICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgcCA9IEZGQUJTKHMtPmhpc3RvZ3JhbVt5XSAtIHMtPmhpc3RvZ3JhbVt5IC0gMV0pIC8gdG90YWw7CisgICAgICAgICAgICAgICAgICAgIGVudHJvcHkgKz0gLWxvZzIocCkgKiBwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICJsYXZmaS5lbnRyb3B5LmVudHJvcHkuJXMuJWMiLCBzLT5tb2RlID8gImRpZmYiIDogIm5vcm1hbCIsIHMtPnBsYW5lbmFtZXNbY2lkeF0pOworICAgICAgICBzbnByaW50ZihtZXRhYnVmLCBzaXplb2YobWV0YWJ1ZiksICIlZiIsIGVudHJvcHkpOworICAgICAgICBhdl9kaWN0X3NldCgmaW4tPm1ldGFkYXRhLCBrZXksIG1ldGFidWYsIDApOworICAgICAgICBzbnByaW50ZihrZXksIHNpemVvZihrZXkpLCAibGF2ZmkuZW50cm9weS5ub3JtYWxpemVkX2VudHJvcHkuJXMuJWMiLCBzLT5tb2RlID8gImRpZmYiIDogIm5vcm1hbCIsIHMtPnBsYW5lbmFtZXNbY2lkeF0pOworICAgICAgICBzbnByaW50ZihtZXRhYnVmLCBzaXplb2YobWV0YWJ1ZiksICIlZiIsIGVudHJvcHkgLyBsb2cyKDEgPDwgcy0+ZGVwdGgpKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJmluLT5tZXRhZGF0YSwga2V5LCBtZXRhYnVmLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGluKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRW50cm9weUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmcy0+aGlzdG9ncmFtKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgICA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZW50cm9weSA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZW50cm9weSIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1lYXN1cmUgdmlkZW8gZnJhbWVzIGVudHJvcHkuIiksCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKEVudHJvcHlDb250ZXh0KSwKKyAgICAudW5pbml0ICAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZW50cm9weV9jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9lcS5jIGIvbGliYXZmaWx0ZXIvdmZfZXEuYwppbmRleCAwYjkyOWYzLi4yYzRjN2U0IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9lcS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2VxLmMKQEAgLTI1NCwxOCArMjU0LDIwIEBACiAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CiAgICAgRVFDb250ZXh0ICplcSA9IGN0eC0+cHJpdjsKICAgICBBVkZyYW1lICpvdXQ7Ci0gICAgaW50NjRfdCBwb3MgPSBhdl9mcmFtZV9nZXRfcGt0X3Bvcyhpbik7CisgICAgaW50NjRfdCBwb3MgPSBpbi0+cGt0X3BvczsKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CiAgICAgaW50IGk7CiAKICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIGlubGluay0+dywgaW5saW5rLT5oKTsKLSAgICBpZiAoIW91dCkKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQogCiAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKICAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CiAKLSAgICBlcS0+dmFyX3ZhbHVlc1tWQVJfTl0gICA9IGlubGluay0+ZnJhbWVfY291bnQ7CisgICAgZXEtPnZhcl92YWx1ZXNbVkFSX05dICAgPSBpbmxpbmstPmZyYW1lX2NvdW50X291dDsKICAgICBlcS0+dmFyX3ZhbHVlc1tWQVJfUE9TXSA9IHBvcyA9PSAtMSA/IE5BTiA6IHBvczsKICAgICBlcS0+dmFyX3ZhbHVlc1tWQVJfVF0gICA9IFRTMlQoaW4tPnB0cywgaW5saW5rLT50aW1lX2Jhc2UpOwogCkBAIC0zODUsNCArMzg3LDUgQEAKICAgICAucXVlcnlfZm9ybWF0cyAgID0gcXVlcnlfZm9ybWF0cywKICAgICAuaW5pdCAgICAgICAgICAgID0gaW5pdGlhbGl6ZSwKICAgICAudW5pbml0ICAgICAgICAgID0gdW5pbml0LAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZXEuaCBiL2xpYmF2ZmlsdGVyL3ZmX2VxLmgKaW5kZXggODUyNTA0OC4uZmE0OWQ0NiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZXEuaAorKysgYi9saWJhdmZpbHRlci92Zl9lcS5oCkBAIC01NSw3ICs1NSw3IEBACiAKIH0gRVFQYXJhbWV0ZXJzOwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBFUUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogCiAgICAgRVFQYXJhbWV0ZXJzIHBhcmFtWzNdOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZXh0cmFjdHBsYW5lcy5jIGIvbGliYXZmaWx0ZXIvdmZfZXh0cmFjdHBsYW5lcy5jCmluZGV4IDA5OWMwMGYuLmZjNjc2YTIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2V4dHJhY3RwbGFuZXMuYworKysgYi9saWJhdmZpbHRlci92Zl9leHRyYWN0cGxhbmVzLmMKQEAgLTIyLDYgKzIyLDEwIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNkZWZpbmUgRkZfSU5URVJOQUxfRklFTERTIDEKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9mcmFtZXF1ZXVlLmgiCisKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImRyYXd1dGlscy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC0zNCw3ICszOCw3IEBACiAjZGVmaW5lIFBMQU5FX1UgMHgyMAogI2RlZmluZSBQTEFORV9WIDB4NDAKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRXh0cmFjdFBsYW5lc0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCByZXF1ZXN0ZWRfcGxhbmVzOwogICAgIGludCBtYXBbNF07CkBAIC02Miw3ICs2Niw3IEBACiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGluX3BpeGZtdHNbXSA9IHsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGluX3BpeGZtdHNfbGVbXSA9IHsKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwKQEAgLTczLDMwICs3Nyw5NyBAQAogICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2TEUsIEFWX1BJWF9GTVRfWVVWQTQyMFAxNkxFLAotICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNkJFLCBBVl9QSVhfRk1UX1lVVkE0MjBQMTZCRSwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTZMRSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2TEUsCi0gICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDE2QkUsIEFWX1BJWF9GTVRfWVVWQTQyMlAxNkJFLAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNkxFLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTZMRSwKLSAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTZCRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2QkUsCiAgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWThBLAotICAgICAgICBBVl9QSVhfRk1UX1lBMTZMRSwgQVZfUElYX0ZNVF9ZQTE2QkUsCi0gICAgICAgIEFWX1BJWF9GTVRfR1JBWTE2TEUsIEFWX1BJWF9GTVRfR1JBWTE2QkUsCisgICAgICAgIEFWX1BJWF9GTVRfWUExNkxFLCBBVl9QSVhfRk1UX0dSQVkxNkxFLAogICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX0JHUjI0LAogICAgICAgICBBVl9QSVhfRk1UX1JHQkEsIEFWX1BJWF9GTVRfQkdSQSwKICAgICAgICAgQVZfUElYX0ZNVF9BUkdCLCBBVl9QSVhfRk1UX0FCR1IsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCMCwgQVZfUElYX0ZNVF9CR1IwLAorICAgICAgICBBVl9QSVhfRk1UXzBSR0IsIEFWX1BJWF9GTVRfMEJHUiwKICAgICAgICAgQVZfUElYX0ZNVF9SR0I0OExFLCBBVl9QSVhfRk1UX0JHUjQ4TEUsCi0gICAgICAgIEFWX1BJWF9GTVRfUkdCNDhCRSwgQVZfUElYX0ZNVF9CR1I0OEJFLAogICAgICAgICBBVl9QSVhfRk1UX1JHQkE2NExFLCBBVl9QSVhfRk1UX0JHUkE2NExFLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSQVAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDE2TEUsIEFWX1BJWF9GTVRfR0JSQVAxNkxFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMExFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMExFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMExFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMExFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQMTBMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwTEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMExFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMkxFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMkxFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMkxFLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAxMExFLCBBVl9QSVhfRk1UX0dCUkFQMTBMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTJMRSwgQVZfUElYX0ZNVF9HQlJBUDEyTEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDlMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQOUxFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5TEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFA5TEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlA5TEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFA5TEUsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDlMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FLAorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBpbl9waXhmbXRzX2JlW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDBQLCBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2QkUsIEFWX1BJWF9GTVRfWVVWQTQyMFAxNkJFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNkJFLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTZCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTZCRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2QkUsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWThBLAorICAgICAgICBBVl9QSVhfRk1UX1lBMTZCRSwgQVZfUElYX0ZNVF9HUkFZMTZCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IyNCwgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF9BQkdSLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjAsIEFWX1BJWF9GTVRfQkdSMCwKKyAgICAgICAgQVZfUElYX0ZNVF8wUkdCLCBBVl9QSVhfRk1UXzBCR1IsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCNDhCRSwgQVZfUElYX0ZNVF9CR1I0OEJFLAogICAgICAgICBBVl9QSVhfRk1UX1JHQkE2NEJFLCBBVl9QSVhfRk1UX0JHUkE2NEJFLAogICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSQVAsCi0gICAgICAgIEFWX1BJWF9GTVRfR0JSUDE2TEUsIEFWX1BJWF9GTVRfR0JSUDE2QkUsCi0gICAgICAgIEFWX1BJWF9GTVRfR0JSQVAxNkxFLCBBVl9QSVhfRk1UX0dCUkFQMTZCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTZCRSwgQVZfUElYX0ZNVF9HQlJBUDE2QkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwQkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEwQkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwQkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwQkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMEJFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjJQMTBCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwQkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyQkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUDEyQkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyQkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEyQkUsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEwQkUsIEFWX1BJWF9GTVRfR0JSQVAxMEJFLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAxMkJFLCBBVl9QSVhfRk1UX0dCUkFQMTJCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOUJFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlA5QkUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDlCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDlCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUDlCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDlCRSwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQOUJFLAogICAgICAgICBBVl9QSVhfRk1UX05PTkUsCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dDhfcGl4Zm10c1tdID0geyBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX05PTkUgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dDlsZV9waXhmbXRzW10gPSB7IEFWX1BJWF9GTVRfR1JBWTlMRSwgQVZfUElYX0ZNVF9OT05FIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXQ5YmVfcGl4Zm10c1tdID0geyBBVl9QSVhfRk1UX0dSQVk5QkUsIEFWX1BJWF9GTVRfTk9ORSB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0MTBsZV9waXhmbXRzW10gPSB7IEFWX1BJWF9GTVRfR1JBWTEwTEUsIEFWX1BJWF9GTVRfTk9ORSB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0MTBiZV9waXhmbXRzW10gPSB7IEFWX1BJWF9GTVRfR1JBWTEwQkUsIEFWX1BJWF9GTVRfTk9ORSB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0MTJsZV9waXhmbXRzW10gPSB7IEFWX1BJWF9GTVRfR1JBWTEyTEUsIEFWX1BJWF9GTVRfTk9ORSB9OworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0MTJiZV9waXhmbXRzW10gPSB7IEFWX1BJWF9GTVRfR1JBWTEyQkUsIEFWX1BJWF9GTVRfTk9ORSB9OwogICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0MTZsZV9waXhmbXRzW10gPSB7IEFWX1BJWF9GTVRfR1JBWTE2TEUsIEFWX1BJWF9GTVRfTk9ORSB9OwogICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0MTZiZV9waXhmbXRzW10gPSB7IEFWX1BJWF9GTVRfR1JBWTE2QkUsIEFWX1BJWF9GTVRfTk9ORSB9OwotICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqb3V0X3BpeGZtdHM7CisgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpvdXRfcGl4Zm10cywgKmluX3BpeGZtdHM7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOwogICAgIEFWRmlsdGVyRm9ybWF0cyAqYXZmZjsKICAgICBpbnQgaSwgcmV0LCBkZXB0aCA9IDAsIGJlID0gMDsKQEAgLTEwNiwxNCArMTc3LDE5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CiAgICAgfQogCi0gICAgaWYgKCFjdHgtPmlucHV0c1swXS0+b3V0X2Zvcm1hdHMpCi0gICAgICAgIGlmICgocmV0ID0gZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChpbl9waXhmbXRzKSwgJmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cykpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KICAgICBhdmZmID0gY3R4LT5pbnB1dHNbMF0tPmluX2Zvcm1hdHM7CiAgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZmZi0+Zm9ybWF0c1swXSk7CiAgICAgZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOwogICAgIGJlID0gZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkU7CisgICAgaWYgKGJlKSB7CisgICAgICAgIGluX3BpeGZtdHMgPSBpbl9waXhmbXRzX2JlOworICAgIH0gZWxzZSB7CisgICAgICAgIGluX3BpeGZtdHMgPSBpbl9waXhmbXRzX2xlOworICAgIH0KKyAgICBpZiAoIWN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cykKKyAgICAgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KGluX3BpeGZtdHMpLCAmY3R4LT5pbnB1dHNbMF0tPm91dF9mb3JtYXRzKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKwogICAgIGZvciAoaSA9IDE7IGkgPCBhdmZmLT5uYl9mb3JtYXRzOyBpKyspIHsKICAgICAgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZmZi0+Zm9ybWF0c1tpXSk7CiAgICAgICAgIGlmIChkZXB0aCAhPSBkZXNjLT5jb21wWzBdLmRlcHRoIHx8CkBAIC0xMjQsNiArMjAwLDE4IEBACiAKICAgICBpZiAoZGVwdGggPT0gOCkKICAgICAgICAgb3V0X3BpeGZtdHMgPSBvdXQ4X3BpeGZtdHM7CisgICAgZWxzZSBpZiAoIWJlICYmIGRlcHRoID09IDkpCisgICAgICAgIG91dF9waXhmbXRzID0gb3V0OWxlX3BpeGZtdHM7CisgICAgZWxzZSBpZiAoYmUgJiYgZGVwdGggPT0gOSkKKyAgICAgICAgb3V0X3BpeGZtdHMgPSBvdXQ5YmVfcGl4Zm10czsKKyAgICBlbHNlIGlmICghYmUgJiYgZGVwdGggPT0gMTApCisgICAgICAgIG91dF9waXhmbXRzID0gb3V0MTBsZV9waXhmbXRzOworICAgIGVsc2UgaWYgKGJlICYmIGRlcHRoID09IDEwKQorICAgICAgICBvdXRfcGl4Zm10cyA9IG91dDEwYmVfcGl4Zm10czsKKyAgICBlbHNlIGlmICghYmUgJiYgZGVwdGggPT0gMTIpCisgICAgICAgIG91dF9waXhmbXRzID0gb3V0MTJsZV9waXhmbXRzOworICAgIGVsc2UgaWYgKGJlICYmIGRlcHRoID09IDEyKQorICAgICAgICBvdXRfcGl4Zm10cyA9IG91dDEyYmVfcGl4Zm10czsKICAgICBlbHNlIGlmIChiZSkKICAgICAgICAgb3V0X3BpeGZtdHMgPSBvdXQxNmJlX3BpeGZtdHM7CiAgICAgZWxzZQpAQCAtMjE5LDcgKzMwNyw3IEBACiAgICAgICAgIGNvbnN0IGludCBpZHggPSBzLT5tYXBbaV07CiAgICAgICAgIEFWRnJhbWUgKm91dDsKIAotICAgICAgICBpZiAob3V0bGluay0+c3RhdHVzKQorICAgICAgICBpZiAob3V0bGluay0+c3RhdHVzX2luKQogICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKQEAgLTI2MCw3ICszNDgsNyBAQAogewogICAgIEV4dHJhY3RQbGFuZXNDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIGludCBwbGFuZXMgPSAocy0+cmVxdWVzdGVkX3BsYW5lcyAmIDB4ZikgfCAocy0+cmVxdWVzdGVkX3BsYW5lcyA+PiA0KTsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgcmV0OwogCiAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICBjaGFyICpuYW1lOwpAQCAtMjc3LDcgKzM2NSwxMCBAQAogICAgICAgICBwYWQudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKICAgICAgICAgcGFkLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19vdXRwdXQ7CiAKLSAgICAgICAgZmZfaW5zZXJ0X291dHBhZChjdHgsIGN0eC0+bmJfb3V0cHV0cywgJnBhZCk7CisgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X291dHBhZChjdHgsIGN0eC0+bmJfb3V0cHV0cywgJnBhZCkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnBhZC5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2ZhZGUuYyBiL2xpYmF2ZmlsdGVyL3ZmX2ZhZGUuYwppbmRleCBmN2IyYjZhLi5jMzBjNDFkIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9mYWRlLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfZmFkZS5jCkBAIC0yNDcsNyArMjQ3LDcgQEAKICAgICBjb25zdCBpbnQgd2lkdGggPSBBVl9DRUlMX1JTSElGVChmcmFtZS0+d2lkdGgsIHMtPmhzdWIpOwogICAgIGNvbnN0IGludCBoZWlnaHQ9IEFWX0NFSUxfUlNISUZUKGZyYW1lLT5oZWlnaHQsIHMtPnZzdWIpOwogICAgIGludCBzbGljZV9zdGFydCA9IChoZWlnaHQgKiAgam9ibnIgICApIC8gbmJfam9iczsKLSAgICBpbnQgc2xpY2VfZW5kICAgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHNsaWNlX2VuZCAgID0gRkZNSU4oKChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9icyksIGZyYW1lLT5oZWlnaHQpOwogCiAgICAgZm9yIChwbGFuZSA9IDE7IHBsYW5lIDwgMzsgcGxhbmUrKykgewogICAgICAgICBmb3IgKGkgPSBzbGljZV9zdGFydDsgaSA8IHNsaWNlX2VuZDsgaSsrKSB7CkBAIC0zMDAsNyArMzAwLDcgQEAKICAgICBpZiAocy0+ZmFkZV9zdGF0ZSA9PSBWRl9GQURFX1dBSVRJTkcpIHsKICAgICAgICAgcy0+ZmFjdG9yPTA7CiAgICAgICAgIGlmIChmcmFtZV90aW1lc3RhbXAgPj0gcy0+c3RhcnRfdGltZS8oZG91YmxlKUFWX1RJTUVfQkFTRQotICAgICAgICAgICAgJiYgaW5saW5rLT5mcmFtZV9jb3VudCA+PSBzLT5zdGFydF9mcmFtZSkgeworICAgICAgICAgICAgJiYgaW5saW5rLT5mcmFtZV9jb3VudF9vdXQgPj0gcy0+c3RhcnRfZnJhbWUpIHsKICAgICAgICAgICAgIC8vIFRpbWUgdG8gc3RhcnQgZmFkaW5nCiAgICAgICAgICAgICBzLT5mYWRlX3N0YXRlID0gVkZfRkFERV9GQURJTkc7CiAKQEAgLTMxMSwxNSArMzExLDE1IEBACiAKICAgICAgICAgICAgIC8vIFNhdmUgc3RhcnQgZnJhbWUgaW4gY2FzZSB3ZSBhcmUgc3RhcnRpbmcgYmFzZWQgb24gdGltZSBhbmQgZmFkaW5nIGJhc2VkIG9uIGZyYW1lcwogICAgICAgICAgICAgaWYgKHMtPnN0YXJ0X3RpbWUgIT0gMCAmJiBzLT5zdGFydF9mcmFtZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcy0+c3RhcnRfZnJhbWUgPSBpbmxpbmstPmZyYW1lX2NvdW50OworICAgICAgICAgICAgICAgIHMtPnN0YXJ0X2ZyYW1lID0gaW5saW5rLT5mcmFtZV9jb3VudF9vdXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHMtPmZhZGVfc3RhdGUgPT0gVkZfRkFERV9GQURJTkcpIHsKICAgICAgICAgaWYgKHMtPmR1cmF0aW9uID09IDApIHsKICAgICAgICAgICAgIC8vIEZhZGluZyBiYXNlZCBvbiBmcmFtZSBjb3VudAotICAgICAgICAgICAgcy0+ZmFjdG9yID0gKGlubGluay0+ZnJhbWVfY291bnQgLSBzLT5zdGFydF9mcmFtZSkgKiBzLT5mYWRlX3Blcl9mcmFtZTsKLSAgICAgICAgICAgIGlmIChpbmxpbmstPmZyYW1lX2NvdW50ID4gcy0+c3RhcnRfZnJhbWUgKyBzLT5uYl9mcmFtZXMpIHsKKyAgICAgICAgICAgIHMtPmZhY3RvciA9IChpbmxpbmstPmZyYW1lX2NvdW50X291dCAtIHMtPnN0YXJ0X2ZyYW1lKSAqIHMtPmZhZGVfcGVyX2ZyYW1lOworICAgICAgICAgICAgaWYgKGlubGluay0+ZnJhbWVfY291bnRfb3V0ID4gcy0+c3RhcnRfZnJhbWUgKyBzLT5uYl9mcmFtZXMpIHsKICAgICAgICAgICAgICAgICBzLT5mYWRlX3N0YXRlID0gVkZfRkFERV9ET05FOwogICAgICAgICAgICAgfQogCkBAIC0zNDcsMTkgKzM0NywxOSBAQAogICAgIGlmIChzLT5mYWN0b3IgPCBVSU5UMTZfTUFYKSB7CiAgICAgICAgIGlmIChzLT5hbHBoYSkgewogICAgICAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZV9hbHBoYSwgZnJhbWUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGZyYW1lLT5oZWlnaHQsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oZnJhbWUtPmhlaWdodCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKICAgICAgICAgfSBlbHNlIGlmIChzLT5pc19wYWNrZWRfcmdiICYmICFzLT5ibGFja19mYWRlKSB7CiAgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlX3JnYiwgZnJhbWUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGZyYW1lLT5oZWlnaHQsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oZnJhbWUtPmhlaWdodCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8qIGx1bWEsIG9yIHJnYiBwbGFuZSBpbiBjYXNlIG9mIGJsYWNrICovCiAgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlX2x1bWEsIGZyYW1lLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihmcmFtZS0+aGVpZ2h0LCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKGZyYW1lLT5oZWlnaHQsIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAKICAgICAgICAgICAgIGlmIChmcmFtZS0+ZGF0YVsxXSAmJiBmcmFtZS0+ZGF0YVsyXSkgewogICAgICAgICAgICAgICAgIC8qIGNocm9tYSBwbGFuZXMgKi8KICAgICAgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlX2Nocm9tYSwgZnJhbWUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihmcmFtZS0+aGVpZ2h0LCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihmcmFtZS0+aGVpZ2h0LCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZmZ0ZmlsdC5jIGIvbGliYXZmaWx0ZXIvdmZfZmZ0ZmlsdC5jCmluZGV4IDMwN2I0MWEuLmFmNDRiMWUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2ZmdGZpbHQuYworKysgYi9saWJhdmZpbHRlci92Zl9mZnRmaWx0LmMKQEAgLTEsNSArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAyMDE1IEFyd2EgQXJpZiA8YXJ3YWFyaWYxOTk0QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMzMsMTAgKzM0LDI1IEBACiAKICNkZWZpbmUgTUFYX1BMQU5FUyA0CiAKLXR5cGVkZWYgc3RydWN0IHsKK2VudW0gRXZhbE1vZGUgeworICAgIEVWQUxfTU9ERV9JTklULAorICAgIEVWQUxfTU9ERV9GUkFNRSwKKyAgICBFVkFMX01PREVfTkIKK307CisKK3R5cGVkZWYgc3RydWN0IEZGVEZJTFRDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKIAotICAgIFJERlRDb250ZXh0ICpyZGZ0OworICAgIGludCBldmFsX21vZGU7CisgICAgaW50IGRlcHRoOworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IHBsYW5ld2lkdGhbTUFYX1BMQU5FU107CisgICAgaW50IHBsYW5laGVpZ2h0W01BWF9QTEFORVNdOworCisgICAgUkRGVENvbnRleHQgKmhyZGZ0W01BWF9QTEFORVNdOworICAgIFJERlRDb250ZXh0ICp2cmRmdFtNQVhfUExBTkVTXTsKKyAgICBSREZUQ29udGV4dCAqaWhyZGZ0W01BWF9QTEFORVNdOworICAgIFJERlRDb250ZXh0ICppdnJkZnRbTUFYX1BMQU5FU107CiAgICAgaW50IHJkZnRfaGJpdHNbTUFYX1BMQU5FU107CiAgICAgaW50IHJkZnRfdmJpdHNbTUFYX1BMQU5FU107CiAgICAgc2l6ZV90IHJkZnRfaGxlbltNQVhfUExBTkVTXTsKQEAgLTQ5LDEwICs2NSwxMiBAQAogICAgIEFWRXhwciAqd2VpZ2h0X2V4cHJbTUFYX1BMQU5FU107CiAgICAgZG91YmxlICp3ZWlnaHRbTUFYX1BMQU5FU107CiAKKyAgICB2b2lkICgqcmRmdF9ob3Jpem9udGFsKShzdHJ1Y3QgRkZURklMVENvbnRleHQgKnMsIEFWRnJhbWUgKmluLCBpbnQgdywgaW50IGgsIGludCBwbGFuZSk7CisgICAgdm9pZCAoKmlyZGZ0X2hvcml6b250YWwpKHN0cnVjdCBGRlRGSUxUQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgdywgaW50IGgsIGludCBwbGFuZSk7CiB9IEZGVEZJTFRDb250ZXh0OwogCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7ICAgIlgiLCAgICJZIiwgICAiVyIsICAgIkgiLCAgICAgTlVMTCAgICB9OwotZW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBWQVJfWCwgVkFSX1ksIFZBUl9XLCBWQVJfSCwgVkFSX1ZBUlNfTkIgfTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsgICAiWCIsICAgIlkiLCAgICJXIiwgICAiSCIsICAgIk4iLCBOVUxMICAgICAgICB9OworZW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBWQVJfWCwgVkFSX1ksIFZBUl9XLCBWQVJfSCwgVkFSX04sIFZBUl9WQVJTX05CIH07CiAKIGVudW0geyBZID0gMCwgVSwgViB9OwogCkBAIC02Niw2ICs4NCw5IEBACiAgICAgeyAid2VpZ2h0X1kiLCAic2V0IGx1bWluYW5jZSBleHByZXNzaW9uIGluIFkgcGxhbmUiLCAgIE9GRlNFVCh3ZWlnaHRfc3RyW1ldKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIxIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJ3ZWlnaHRfVSIsICJzZXQgY2hyb21pbmFuY2UgZXhwcmVzc2lvbiBpbiBVIHBsYW5lIiwgT0ZGU0VUKHdlaWdodF9zdHJbVV0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJ3ZWlnaHRfViIsICJzZXQgY2hyb21pbmFuY2UgZXhwcmVzc2lvbiBpbiBWIHBsYW5lIiwgT0ZGU0VUKHdlaWdodF9zdHJbVl0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJldmFsIiwgInNwZWNpZnkgd2hlbiB0byBldmFsdWF0ZSBleHByZXNzaW9ucyIsIE9GRlNFVChldmFsX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRVZBTF9NT0RFX0lOSVR9LCAwLCBFVkFMX01PREVfTkItMSwgRkxBR1MsICJldmFsIiB9LAorICAgICAgICAgeyAiaW5pdCIsICAiZXZhbCBleHByZXNzaW9ucyBvbmNlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1FVkFMX01PREVfSU5JVH0sICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZXZhbCIgfSwKKyAgICAgICAgIHsgImZyYW1lIiwgImV2YWwgZXhwcmVzc2lvbnMgcGVyLWZyYW1lIiwgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RVZBTF9NT0RFX0ZSQU1FfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImV2YWwiIH0sCiAgICAge05VTEx9LAogfTsKIApAQCAtOTMsMTAgKzExNCw5IEBACiB9CiAKIC8qSG9yaXpvbnRhbCBwYXNzIC0gUkRGVCovCi1zdGF0aWMgdm9pZCByZGZ0X2hvcml6b250YWwoRkZURklMVENvbnRleHQgKnMsIEFWRnJhbWUgKmluLCBpbnQgdywgaW50IGgsIGludCBwbGFuZSkKK3N0YXRpYyB2b2lkIHJkZnRfaG9yaXpvbnRhbDgoRkZURklMVENvbnRleHQgKnMsIEFWRnJhbWUgKmluLCBpbnQgdywgaW50IGgsIGludCBwbGFuZSkKIHsKICAgICBpbnQgaSwgajsKLSAgICBzLT5yZGZ0ID0gYXZfcmRmdF9pbml0KHMtPnJkZnRfaGJpdHNbcGxhbmVdLCBERlRfUjJDKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykKQEAgLTEwNiwxNiArMTI2LDMwIEBACiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKLSAgICAgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnQsIHMtPnJkZnRfaGRhdGFbcGxhbmVdICsgaSAqIHMtPnJkZnRfaGxlbltwbGFuZV0pOworICAgICAgICBhdl9yZGZ0X2NhbGMocy0+aHJkZnRbcGxhbmVdLCBzLT5yZGZ0X2hkYXRhW3BsYW5lXSArIGkgKiBzLT5yZGZ0X2hsZW5bcGxhbmVdKTsKK30KIAotICAgIGF2X3JkZnRfZW5kKHMtPnJkZnQpOworc3RhdGljIHZvaWQgcmRmdF9ob3Jpem9udGFsMTYoRkZURklMVENvbnRleHQgKnMsIEFWRnJhbWUgKmluLCBpbnQgdywgaW50IGgsIGludCBwbGFuZSkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbcGxhbmVdOworICAgIGludCBsaW5lc2l6ZSA9IGluLT5saW5lc2l6ZVtwbGFuZV0gLyAyOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKQorICAgICAgICAgICAgcy0+cmRmdF9oZGF0YVtwbGFuZV1baSAqIHMtPnJkZnRfaGxlbltwbGFuZV0gKyBqXSA9ICooc3JjICsgbGluZXNpemUgKiBpICsgaik7CisKKyAgICAgICAgY29weV9yZXYocy0+cmRmdF9oZGF0YVtwbGFuZV0gKyBpICogcy0+cmRmdF9obGVuW3BsYW5lXSwgdywgcy0+cmRmdF9obGVuW3BsYW5lXSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKKyAgICAgICAgYXZfcmRmdF9jYWxjKHMtPmhyZGZ0W3BsYW5lXSwgcy0+cmRmdF9oZGF0YVtwbGFuZV0gKyBpICogcy0+cmRmdF9obGVuW3BsYW5lXSk7CiB9CiAKIC8qVmVydGljYWwgcGFzcyAtIFJERlQqLwogc3RhdGljIHZvaWQgcmRmdF92ZXJ0aWNhbChGRlRGSUxUQ29udGV4dCAqcywgaW50IGgsIGludCBwbGFuZSkKIHsKICAgICBpbnQgaSwgajsKLSAgICBzLT5yZGZ0ID0gYXZfcmRmdF9pbml0KHMtPnJkZnRfdmJpdHNbcGxhbmVdLCBERlRfUjJDKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5yZGZ0X2hsZW5bcGxhbmVdOyBpKyspIHsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IGg7IGorKykKQEAgLTEyNSwzMyArMTU5LDI5IEBACiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJkZnRfaGxlbltwbGFuZV07IGkrKykKLSAgICAgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnQsIHMtPnJkZnRfdmRhdGFbcGxhbmVdICsgaSAqIHMtPnJkZnRfdmxlbltwbGFuZV0pOwotCi0gICAgYXZfcmRmdF9lbmQocy0+cmRmdCk7CisgICAgICAgIGF2X3JkZnRfY2FsYyhzLT52cmRmdFtwbGFuZV0sIHMtPnJkZnRfdmRhdGFbcGxhbmVdICsgaSAqIHMtPnJkZnRfdmxlbltwbGFuZV0pOwogfQogLypWZXJ0aWNhbCBwYXNzIC0gSVJERlQqLwogc3RhdGljIHZvaWQgaXJkZnRfdmVydGljYWwoRkZURklMVENvbnRleHQgKnMsIGludCBoLCBpbnQgcGxhbmUpCiB7CiAgICAgaW50IGksIGo7Ci0gICAgcy0+cmRmdCA9IGF2X3JkZnRfaW5pdChzLT5yZGZ0X3ZiaXRzW3BsYW5lXSwgSURGVF9DMlIpOworCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJkZnRfaGxlbltwbGFuZV07IGkrKykKLSAgICAgICAgYXZfcmRmdF9jYWxjKHMtPnJkZnQsIHMtPnJkZnRfdmRhdGFbcGxhbmVdICsgaSAqIHMtPnJkZnRfdmxlbltwbGFuZV0pOworICAgICAgICBhdl9yZGZ0X2NhbGMocy0+aXZyZGZ0W3BsYW5lXSwgcy0+cmRmdF92ZGF0YVtwbGFuZV0gKyBpICogcy0+cmRmdF92bGVuW3BsYW5lXSk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cmRmdF9obGVuW3BsYW5lXTsgaSsrKQogICAgICAgICBmb3IgKGogPSAwOyBqIDwgaDsgaisrKQogICAgICAgICAgICAgcy0+cmRmdF9oZGF0YVtwbGFuZV1baiAqIHMtPnJkZnRfaGxlbltwbGFuZV0gKyBpXSA9CiAgICAgICAgICAgICBzLT5yZGZ0X3ZkYXRhW3BsYW5lXVtpICogcy0+cmRmdF92bGVuW3BsYW5lXSArIGpdOwotCi0gICAgYXZfcmRmdF9lbmQocy0+cmRmdCk7CiB9CiAKIC8qSG9yaXpvbnRhbCBwYXNzIC0gSVJERlQqLwotc3RhdGljIHZvaWQgaXJkZnRfaG9yaXpvbnRhbChGRlRGSUxUQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgdywgaW50IGgsIGludCBwbGFuZSkKK3N0YXRpYyB2b2lkIGlyZGZ0X2hvcml6b250YWw4KEZGVEZJTFRDb250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIGludCB3LCBpbnQgaCwgaW50IHBsYW5lKQogewogICAgIGludCBpLCBqOwotICAgIHMtPnJkZnQgPSBhdl9yZGZ0X2luaXQocy0+cmRmdF9oYml0c1twbGFuZV0sIElERlRfQzJSKTsKKwogICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspCi0gICAgICAgIGF2X3JkZnRfY2FsYyhzLT5yZGZ0LCBzLT5yZGZ0X2hkYXRhW3BsYW5lXSArIGkgKiBzLT5yZGZ0X2hsZW5bcGxhbmVdKTsKKyAgICAgICAgYXZfcmRmdF9jYWxjKHMtPmlocmRmdFtwbGFuZV0sIHMtPnJkZnRfaGRhdGFbcGxhbmVdICsgaSAqIHMtPnJkZnRfaGxlbltwbGFuZV0pOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykKICAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykKQEAgLTE1OSw4ICsxODksMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcy0+cmRmdF9obGVuW3BsYW5lXSArIGpdICogNCAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnJkZnRfaGxlbltwbGFuZV0gKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZGZ0X3ZsZW5bcGxhbmVdKSwgMCwgMjU1KTsKK30KIAotICAgIGF2X3JkZnRfZW5kKHMtPnJkZnQpOworc3RhdGljIHZvaWQgaXJkZnRfaG9yaXpvbnRhbDE2KEZGVEZJTFRDb250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIGludCB3LCBpbnQgaCwgaW50IHBsYW5lKQoreworICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilvdXQtPmRhdGFbcGxhbmVdOworICAgIGludCBsaW5lc2l6ZSA9IG91dC0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICBpbnQgbWF4ID0gKDEgPDwgcy0+ZGVwdGgpIC0gMTsKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspCisgICAgICAgIGF2X3JkZnRfY2FsYyhzLT5paHJkZnRbcGxhbmVdLCBzLT5yZGZ0X2hkYXRhW3BsYW5lXSArIGkgKiBzLT5yZGZ0X2hsZW5bcGxhbmVdKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspCisgICAgICAgICAgICAqKGRzdCArIGxpbmVzaXplICogaSArIGopID0gYXZfY2xpcChzLT5yZGZ0X2hkYXRhW3BsYW5lXVtpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcy0+cmRmdF9obGVuW3BsYW5lXSArIGpdICogNCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+cmRmdF9obGVuW3BsYW5lXSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZGZ0X3ZsZW5bcGxhbmVdKSwgMCwgbWF4KTsKIH0KIAogc3RhdGljIGF2X2NvbGQgaW50IGluaXRpYWxpemUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCkBAIC0xOTcsMTcgKzI0Myw0MyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGRvX2V2YWwoRkZURklMVENvbnRleHQgKnMsIEFWRmlsdGVyTGluayAqaW5saW5rLCBpbnQgcGxhbmUpCit7CisgICAgZG91YmxlIHZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgaW50IGksIGo7CisKKyAgICB2YWx1ZXNbVkFSX05dID0gaW5saW5rLT5mcmFtZV9jb3VudF9vdXQ7CisgICAgdmFsdWVzW1ZBUl9XXSA9IHMtPnBsYW5ld2lkdGhbcGxhbmVdOworICAgIHZhbHVlc1tWQVJfSF0gPSBzLT5wbGFuZWhlaWdodFtwbGFuZV07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+cmRmdF9obGVuW3BsYW5lXTsgaSsrKSB7CisgICAgICAgIHZhbHVlc1tWQVJfWF0gPSBpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+cmRmdF92bGVuW3BsYW5lXTsgaisrKSB7CisgICAgICAgICAgICB2YWx1ZXNbVkFSX1ldID0gajsKKyAgICAgICAgICAgIHMtPndlaWdodFtwbGFuZV1baSAqIHMtPnJkZnRfdmxlbltwbGFuZV0gKyBqXSA9CisgICAgICAgICAgICBhdl9leHByX2V2YWwocy0+d2VpZ2h0X2V4cHJbcGxhbmVdLCB2YWx1ZXMsIHMpOworICAgICAgICB9CisgICAgfQorfQorCiBzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKIHsKICAgICBGRlRGSUxUQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OwogICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKLSAgICBpbnQgcmRmdF9oYml0cywgcmRmdF92Yml0cywgaSwgaiwgcGxhbmU7Ci0gICAgZG91YmxlIHZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgaW50IHJkZnRfaGJpdHMsIHJkZnRfdmJpdHMsIGksIHBsYW5lOwogCiAgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIHMtPmRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBzLT5wbGFuZXdpZHRoWzFdID0gcy0+cGxhbmV3aWR0aFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgcy0+cGxhbmV3aWR0aFswXSA9IHMtPnBsYW5ld2lkdGhbM10gPSBpbmxpbmstPnc7CisgICAgcy0+cGxhbmVoZWlnaHRbMV0gPSBzLT5wbGFuZWhlaWdodFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgcy0+cGxhbmVoZWlnaHRbMF0gPSBzLT5wbGFuZWhlaWdodFszXSA9IGlubGluay0+aDsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKwogICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9jb21wb25lbnRzOyBpKyspIHsKLSAgICAgICAgaW50IHcgPSBpbmxpbmstPnc7Ci0gICAgICAgIGludCBoID0gaW5saW5rLT5oOworICAgICAgICBpbnQgdyA9IHMtPnBsYW5ld2lkdGhbaV07CisgICAgICAgIGludCBoID0gcy0+cGxhbmVoZWlnaHRbaV07CiAKICAgICAgICAgLyogUkRGVCAtIEFycmF5IGluaXRpYWxpemF0aW9uIGZvciBIb3Jpem9udGFsIHBhc3MqLwogICAgICAgICBmb3IgKHJkZnRfaGJpdHMgPSAxOyAxIDw8IHJkZnRfaGJpdHMgPCB3KjEwLzk7IHJkZnRfaGJpdHMrKyk7CkBAIC0yMTYsMzEgKzI4OCw0MSBAQAogICAgICAgICBpZiAoIShzLT5yZGZ0X2hkYXRhW2ldID0gYXZfbWFsbG9jX2FycmF5KGgsIHMtPnJkZnRfaGxlbltpXSAqIHNpemVvZihGRlRTYW1wbGUpKSkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCisgICAgICAgIGlmICghKHMtPmhyZGZ0W2ldID0gYXZfcmRmdF9pbml0KHMtPnJkZnRfaGJpdHNbaV0sIERGVF9SMkMpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGlmICghKHMtPmlocmRmdFtpXSA9IGF2X3JkZnRfaW5pdChzLT5yZGZ0X2hiaXRzW2ldLCBJREZUX0MyUikpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKwogICAgICAgICAvKiBSREZUIC0gQXJyYXkgaW5pdGlhbGl6YXRpb24gZm9yIFZlcnRpY2FsIHBhc3MqLwogICAgICAgICBmb3IgKHJkZnRfdmJpdHMgPSAxOyAxIDw8IHJkZnRfdmJpdHMgPCBoKjEwLzk7IHJkZnRfdmJpdHMrKyk7CiAgICAgICAgIHMtPnJkZnRfdmJpdHNbaV0gPSByZGZ0X3ZiaXRzOwogICAgICAgICBzLT5yZGZ0X3ZsZW5baV0gPSAxIDw8IHJkZnRfdmJpdHM7CiAgICAgICAgIGlmICghKHMtPnJkZnRfdmRhdGFbaV0gPSBhdl9tYWxsb2NfYXJyYXkocy0+cmRmdF9obGVuW2ldLCBzLT5yZGZ0X3ZsZW5baV0gKiBzaXplb2YoRkZUU2FtcGxlKSkpKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBpZiAoIShzLT52cmRmdFtpXSA9IGF2X3JkZnRfaW5pdChzLT5yZGZ0X3ZiaXRzW2ldLCBERlRfUjJDKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZiAoIShzLT5pdnJkZnRbaV0gPSBhdl9yZGZ0X2luaXQocy0+cmRmdF92Yml0c1tpXSwgSURGVF9DMlIpKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCiAgICAgLypMdW1pbmFuY2UgdmFsdWUgLSBBcnJheSBpbml0aWFsaXphdGlvbiovCi0gICAgdmFsdWVzW1ZBUl9XXSA9IGlubGluay0+dzsKLSAgICB2YWx1ZXNbVkFSX0hdID0gaW5saW5rLT5oOwotICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDM7IHBsYW5lKyspCi0gICAgeworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDM7IHBsYW5lKyspIHsKICAgICAgICAgaWYoIShzLT53ZWlnaHRbcGxhbmVdID0gYXZfbWFsbG9jX2FycmF5KHMtPnJkZnRfaGxlbltwbGFuZV0sIHMtPnJkZnRfdmxlbltwbGFuZV0gKiBzaXplb2YoZG91YmxlKSkpKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPnJkZnRfaGxlbltwbGFuZV07IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWVzW1ZBUl9YXSA9IGk7Ci0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+cmRmdF92bGVuW3BsYW5lXTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlc1tWQVJfWV0gPSBqOwotICAgICAgICAgICAgICAgIHMtPndlaWdodFtwbGFuZV1baSAqIHMtPnJkZnRfdmxlbltwbGFuZV0gKyBqXSA9Ci0gICAgICAgICAgICAgICAgYXZfZXhwcl9ldmFsKHMtPndlaWdodF9leHByW3BsYW5lXSwgdmFsdWVzLCBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5ldmFsX21vZGUgPT0gRVZBTF9NT0RFX0lOSVQpCisgICAgICAgICAgICBkb19ldmFsKHMsIGlubGluaywgcGxhbmUpOworICAgIH0KKworICAgIGlmIChzLT5kZXB0aCA8PSA4KSB7CisgICAgICAgIHMtPnJkZnRfaG9yaXpvbnRhbCA9IHJkZnRfaG9yaXpvbnRhbDg7CisgICAgICAgIHMtPmlyZGZ0X2hvcml6b250YWwgPSBpcmRmdF9ob3Jpem9udGFsODsKKyAgICB9IGVsc2UgaWYgKHMtPmRlcHRoID4gOCkgeworICAgICAgICBzLT5yZGZ0X2hvcml6b250YWwgPSByZGZ0X2hvcml6b250YWwxNjsKKyAgICAgICAgcy0+aXJkZnRfaG9yaXpvbnRhbCA9IGlyZGZ0X2hvcml6b250YWwxNjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtMjQ5LDI4ICszMzEsMjYgQEAKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwogICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOwotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKICAgICBGRlRGSUxUQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKICAgICBBVkZyYW1lICpvdXQ7CiAgICAgaW50IGksIGosIHBsYW5lOwogCiAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBpbmxpbmstPncsIGlubGluay0+aCk7Ci0gICAgaWYgKCFvdXQpCisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KIAogICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CiAKLSAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7Ci0gICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgZGVzYy0+bmJfY29tcG9uZW50czsgcGxhbmUrKykgewotICAgICAgICBpbnQgdyA9IGlubGluay0+dzsKLSAgICAgICAgaW50IGggPSBpbmxpbmstPmg7CisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIGludCB3ID0gcy0+cGxhbmV3aWR0aFtwbGFuZV07CisgICAgICAgIGludCBoID0gcy0+cGxhbmVoZWlnaHRbcGxhbmVdOwogCi0gICAgICAgIGlmIChwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIpIHsKLSAgICAgICAgICAgIHcgPSBBVl9DRUlMX1JTSElGVCh3LCBkZXNjLT5sb2cyX2Nocm9tYV93KTsKLSAgICAgICAgICAgIGggPSBBVl9DRUlMX1JTSElGVChoLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKLSAgICAgICAgfQorICAgICAgICBpZiAocy0+ZXZhbF9tb2RlID09IEVWQUxfTU9ERV9GUkFNRSkKKyAgICAgICAgICAgIGRvX2V2YWwocywgaW5saW5rLCBwbGFuZSk7CiAKLSAgICAgICAgcmRmdF9ob3Jpem9udGFsKHMsIGluLCB3LCBoLCBwbGFuZSk7CisgICAgICAgIHMtPnJkZnRfaG9yaXpvbnRhbChzLCBpbiwgdywgaCwgcGxhbmUpOwogICAgICAgICByZGZ0X3ZlcnRpY2FsKHMsIGgsIHBsYW5lKTsKIAogICAgICAgICAvKkNoYW5nZSB1c2VyIGRlZmluZWQgcGFyYW1ldGVycyovCkBAIC0yODIsNyArMzYyLDcgQEAKICAgICAgICAgcy0+cmRmdF92ZGF0YVtwbGFuZV1bMF0gKz0gcy0+cmRmdF9obGVuW3BsYW5lXSAqIHMtPnJkZnRfdmxlbltwbGFuZV0gKiBzLT5kY1twbGFuZV07CiAKICAgICAgICAgaXJkZnRfdmVydGljYWwocywgaCwgcGxhbmUpOwotICAgICAgICBpcmRmdF9ob3Jpem9udGFsKHMsIG91dCwgdywgaCwgcGxhbmUpOworICAgICAgICBzLT5pcmRmdF9ob3Jpem9udGFsKHMsIG91dCwgdywgaCwgcGxhbmUpOwogICAgIH0KIAogICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKQEAgLTI5OCw2ICszNzgsMTAgQEAKICAgICAgICAgYXZfZnJlZShzLT5yZGZ0X3ZkYXRhW2ldKTsKICAgICAgICAgYXZfZXhwcl9mcmVlKHMtPndlaWdodF9leHByW2ldKTsKICAgICAgICAgYXZfZnJlZShzLT53ZWlnaHRbaV0pOworICAgICAgICBhdl9yZGZ0X2VuZChzLT5ocmRmdFtpXSk7CisgICAgICAgIGF2X3JkZnRfZW5kKHMtPmlocmRmdFtpXSk7CisgICAgICAgIGF2X3JkZnRfZW5kKHMtPnZyZGZ0W2ldKTsKKyAgICAgICAgYXZfcmRmdF9lbmQocy0+aXZyZGZ0W2ldKTsKICAgICB9CiB9CiAKQEAgLTMwNSw3ICszODksMTggQEAKIHsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2ZtdHNfZmZ0ZmlsdFtdID0gewogICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAotICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDksIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQyMlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCiAgICAgICAgIEFWX1BJWF9GTVRfTk9ORQogICAgIH07CiAKQEAgLTM0Myw0ICs0MzgsNSBAQAogICAgIC5xdWVyeV9mb3JtYXRzICAgPSBxdWVyeV9mb3JtYXRzLAogICAgIC5pbml0ICAgICAgICAgICAgPSBpbml0aWFsaXplLAogICAgIC51bmluaXQgICAgICAgICAgPSB1bmluaXQsCisgICAgLmZsYWdzICAgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2ZpZWxkLmMgYi9saWJhdmZpbHRlci92Zl9maWVsZC5jCmluZGV4IDcyY2FiZGIuLjJmNGViNjcgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2ZpZWxkLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfZmllbGQuYwpAQCAtMzEsNyArMzEsNyBAQAogCiBlbnVtIEZpZWxkVHlwZSB7IEZJRUxEX1RZUEVfVE9QID0gMCwgRklFTERfVFlQRV9CT1RUT00gfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRmllbGRDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAgLy8vPCBGaWVsZFR5cGUKICAgICBpbnQgbmJfcGxhbmVzOyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgcGxhbmVzIG9mIHRoZSBjdXJyZW50IGZvcm1hdApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZmllbGRoaW50LmMgYi9saWJhdmZpbHRlci92Zl9maWVsZGhpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2ZlYjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfZmllbGRoaW50LmMKQEAgLTAsMCArMSwyODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgRmllbGRIaW50Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBjaGFyICpoaW50X2ZpbGVfc3RyOworICAgIEZJTEUgKmhpbnQ7CisgICAgaW50IG1vZGU7CisKKyAgICBBVkZyYW1lICpmcmFtZVszXTsKKworICAgIGludDY0X3QgbGluZTsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBlb2Y7CisgICAgaW50IHBsYW5ld2lkdGhbNF07CisgICAgaW50IHBsYW5laGVpZ2h0WzRdOworfSBGaWVsZEhpbnRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGaWVsZEhpbnRDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZpZWxkaGludF9vcHRpb25zW10gPSB7CisgICAgeyAiaGludCIsICJzZXQgaGludCBmaWxlIiwgT0ZGU0VUKGhpbnRfZmlsZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgIm1vZGUiLCAic2V0IGhpbnQgbW9kZSIsIE9GRlNFVChtb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgICAiYWJzb2x1dGUiLCAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICAgInJlbGF0aXZlIiwgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhmaWVsZGhpbnQpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGaWVsZEhpbnRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXMtPmhpbnRfZmlsZV9zdHIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSGludCBmaWxlIG11c3QgYmUgc2V0LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHMtPmhpbnQgPSBmb3BlbihzLT5oaW50X2ZpbGVfc3RyLCAiciIpOworICAgIGlmICghcy0+aGludCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiJXM6ICVzXG4iLCBzLT5oaW50X2ZpbGVfc3RyLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpwaXhfZm10cyA9IE5VTEw7CisgICAgaW50IGZtdCwgcmV0OworCisgICAgZm9yIChmbXQgPSAwOyBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7IGZtdCsrKSB7CisgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsKKyAgICAgICAgaWYgKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCB8fAorICAgICAgICAgICAgICBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgICAgIHx8CisgICAgICAgICAgICAgIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JJVFNUUkVBTSkgJiYKKyAgICAgICAgICAgIChyZXQgPSBmZl9hZGRfZm9ybWF0KCZwaXhfZm10cywgZm10KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgcGl4X2ZtdHMpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBGaWVsZEhpbnRDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMocy0+cGxhbmV3aWR0aCwgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHMtPnBsYW5laGVpZ2h0WzFdID0gcy0+cGxhbmVoZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIHMtPnBsYW5laGVpZ2h0WzBdID0gcy0+cGxhbmVoZWlnaHRbM10gPSBpbmxpbmstPmg7CisKKyAgICBzLT5uYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhpbmxpbmstPmZvcm1hdCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEZpZWxkSGludENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0LCAqdG9wLCAqYm90dG9tOworICAgIGNoYXIgYnVmWzEwMjRdID0geyAwIH07CisgICAgaW50NjRfdCB0ZiwgYmY7CisgICAgY2hhciBoaW50ID0gJz0nOworICAgIGludCBwOworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVbMF0pOworICAgIHMtPmZyYW1lWzBdID0gcy0+ZnJhbWVbMV07CisgICAgcy0+ZnJhbWVbMV0gPSBzLT5mcmFtZVsyXTsKKyAgICBzLT5mcmFtZVsyXSA9IGluOworICAgIGlmICghcy0+ZnJhbWVbMV0pCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UgaWYgKCFzLT5mcmFtZVswXSkgeworICAgICAgICBzLT5mcmFtZVswXSA9IGF2X2ZyYW1lX2Nsb25lKHMtPmZyYW1lWzFdKTsKKyAgICAgICAgaWYgKCFzLT5mcmFtZVswXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiktMSwgcy0+aGludCkpIHsKKyAgICAgICAgICAgIHMtPmxpbmUrKzsKKyAgICAgICAgICAgIGlmIChidWZbMF0gPT0gJyMnIHx8IGJ1ZlswXSA9PSAnOycpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3NjYW5mKGJ1ZiwgIiUiUFJJZDY0IiwlIlBSSWQ2NCIgJWMiLCAmdGYsICZiZiwgJmhpbnQpID09IDMpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHNzY2FuZihidWYsICIlIlBSSWQ2NCIsJSJQUklkNjQiIiwgJnRmLCAmYmYpID09IDIpIHsKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZW50cnkgYXQgbGluZSAlIlBSSWQ2NCIuXG4iLCBzLT5saW5lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAocy0+bW9kZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlmICh0ZiA+IG91dGxpbmstPmZyYW1lX2NvdW50X2luICsgMSB8fCB0ZiA8IEZGTUFYKDAsIG91dGxpbmstPmZyYW1lX2NvdW50X2luIC0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgYmYgPiBvdXRsaW5rLT5mcmFtZV9jb3VudF9pbiArIDEgfHwgYmYgPCBGRk1BWCgwLCBvdXRsaW5rLT5mcmFtZV9jb3VudF9pbiAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk91dCBvZiByYW5nZSBmcmFtZXMgJSJQUklkNjQiIGFuZC9vciAlIlBSSWQ2NCIgb24gbGluZSAlIlBSSWQ2NCIgZm9yICUiUFJJZDY0Ii4gaW5wdXQgZnJhbWUuXG4iLCB0ZiwgYmYsIHMtPmxpbmUsIGlubGluay0+ZnJhbWVfY291bnRfb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGlmICh0ZiA+IDEgfHwgdGYgPCAtMSB8fAorICAgICAgICAgICAgICAgICAgICBiZiA+IDEgfHwgYmYgPCAtMSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPdXQgb2YgcmFuZ2UgJSJQUklkNjQiIGFuZC9vciAlIlBSSWQ2NCIgb24gbGluZSAlIlBSSWQ2NCIgZm9yICUiUFJJZDY0Ii4gaW5wdXQgZnJhbWUuXG4iLCB0ZiwgYmYsIHMtPmxpbmUsIGlubGluay0+ZnJhbWVfY291bnRfb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBlbnRyeSBmb3IgJSJQUklkNjQiLiBpbnB1dCBmcmFtZS5cbiIsIGlubGluay0+ZnJhbWVfY291bnRfb3V0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfQorCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgcy0+ZnJhbWVbMV0pOworCisgICAgc3dpdGNoIChzLT5tb2RlKSB7CisgICAgY2FzZSAwOgorICAgICAgICB0b3AgICAgPSBzLT5mcmFtZVt0ZiAtIG91dGxpbmstPmZyYW1lX2NvdW50X2luICsgMV07CisgICAgICAgIGJvdHRvbSA9IHMtPmZyYW1lW2JmIC0gb3V0bGluay0+ZnJhbWVfY291bnRfaW4gKyAxXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB0b3AgICAgPSBzLT5mcmFtZVsxICsgdGZdOworICAgICAgICBib3R0b20gPSBzLT5mcmFtZVsxICsgYmZdOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIHN3aXRjaCAoaGludCkgeworICAgIGNhc2UgJysnOgorICAgICAgICBvdXQtPmludGVybGFjZWRfZnJhbWUgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICctJzoKKyAgICAgICAgb3V0LT5pbnRlcmxhY2VkX2ZyYW1lID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnPSc6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgaGludDogJWMuXG4iLCBoaW50KTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5saW5lc2l6ZVtwXSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLT5kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcC0+bGluZXNpemVbcF0gKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBsYW5ld2lkdGhbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnBsYW5laGVpZ2h0W3BdICsgMSkgLyAyKTsKKyAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbcF0gKyBvdXQtPmxpbmVzaXplW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bGluZXNpemVbcF0gKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbS0+ZGF0YVtwXSArIGJvdHRvbS0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tLT5saW5lc2l6ZVtwXSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmV3aWR0aFtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocy0+cGxhbmVoZWlnaHRbcF0gKyAxKSAvIDIpOworICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBGaWVsZEhpbnRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICBpZiAocy0+ZW9mKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIHMtPmZyYW1lWzJdKSB7CisgICAgICAgIEFWRnJhbWUgKm5leHQgPSBhdl9mcmFtZV9jbG9uZShzLT5mcmFtZVsyXSk7CisgICAgICAgIGlmICghbmV4dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJldCA9IGZpbHRlcl9mcmFtZShjdHgtPmlucHV0c1swXSwgbmV4dCk7CisgICAgICAgIHMtPmVvZiA9IDE7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRmllbGRIaW50Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmIChzLT5oaW50KQorICAgICAgICBmY2xvc2Uocy0+aGludCk7CisgICAgcy0+aGludCA9IE5VTEw7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZVswXSk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVbMV0pOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lWzJdKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZmllbGRoaW50ID0geworICAgIC5uYW1lICAgICAgICAgID0gImZpZWxkaGludCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmllbGQgbWF0Y2hpbmcgdXNpbmcgaGludHMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRmllbGRIaW50Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZmllbGRoaW50X2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2ZpZWxkbWF0Y2guYyBiL2xpYmF2ZmlsdGVyL3ZmX2ZpZWxkbWF0Y2guYwppbmRleCBlMTU1NzEyLi4zNjk0ZjI2IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9maWVsZG1hdGNoLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfZmllbGRtYXRjaC5jCkBAIC03Miw3ICs3Miw3IEBACiAgICAgTkJfQ09NQkRCRwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRmllbGRNYXRjaENvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogCiAgICAgQVZGcmFtZSAqcHJ2LCAgKnNyYywgICpueHQ7ICAgICAvLy88IG1haW4gc2xpZGluZyB3aW5kb3cgb2YgMyBmcmFtZXMKQEAgLTc0MCw3ICs3NDAsNyBAQAogCiAgICAgLyogc2NlbmUgY2hhbmdlIGNoZWNrICovCiAgICAgaWYgKGZtLT5jb21ibWF0Y2ggPT0gQ09NQk1BVENIX1NDKSB7Ci0gICAgICAgIGlmIChmbS0+bGFzdG4gPT0gb3V0bGluay0+ZnJhbWVfY291bnQgLSAxKSB7CisgICAgICAgIGlmIChmbS0+bGFzdG4gPT0gb3V0bGluay0+ZnJhbWVfY291bnRfaW4gLSAxKSB7CiAgICAgICAgICAgICBpZiAoZm0tPmxhc3RzY2RpZmYgPiBmbS0+c2N0aHJlc2gpCiAgICAgICAgICAgICAgICAgc2MgPSAxOwogICAgICAgICB9IGVsc2UgaWYgKGx1bWFfYWJzX2RpZmYoZm0tPnBydiwgZm0tPnNyYykgPiBmbS0+c2N0aHJlc2gpIHsKQEAgLTc0OCw3ICs3NDgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFzYykgewotICAgICAgICAgICAgZm0tPmxhc3RuID0gb3V0bGluay0+ZnJhbWVfY291bnQ7CisgICAgICAgICAgICBmbS0+bGFzdG4gPSBvdXRsaW5rLT5mcmFtZV9jb3VudF9pbjsKICAgICAgICAgICAgIGZtLT5sYXN0c2NkaWZmID0gbHVtYV9hYnNfZGlmZihmbS0+c3JjLCBmbS0+bnh0KTsKICAgICAgICAgICAgIHNjID0gZm0tPmxhc3RzY2RpZmYgPiBmbS0+c2N0aHJlc2g7CiAgICAgICAgIH0KQEAgLTgwNyw3ICs4MDcsNyBAQAogICAgIGRzdC0+aW50ZXJsYWNlZF9mcmFtZSA9IGNvbWJzW21hdGNoXSA+PSBmbS0+Y29tYnBlbDsKICAgICBpZiAoZHN0LT5pbnRlcmxhY2VkX2ZyYW1lKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRnJhbWUgIyUiUFJJZDY0IiBhdCAlcyBpcyBzdGlsbCBpbnRlcmxhY2VkXG4iLAotICAgICAgICAgICAgICAgb3V0bGluay0+ZnJhbWVfY291bnQsIGF2X3RzMnRpbWVzdHIoaW4tPnB0cywgJmlubGluay0+dGltZV9iYXNlKSk7CisgICAgICAgICAgICAgICBvdXRsaW5rLT5mcmFtZV9jb3VudF9pbiwgYXZfdHMydGltZXN0cihpbi0+cHRzLCAmaW5saW5rLT50aW1lX2Jhc2UpKTsKICAgICAgICAgZHN0LT50b3BfZmllbGRfZmlyc3QgPSBmaWVsZDsKICAgICB9CiAKQEAgLTkwNCwxNyArOTA0LDI0IEBACiAgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCiAgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCiAgICAgfTsKKyAgICBpbnQgcmV0OwogCiAgICAgaWYgKCFwYWQubmFtZSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBJTlBVVF9NQUlOLCAmcGFkKTsKKyAgICBpZiAoKHJldCA9IGZmX2luc2VydF9pbnBhZChjdHgsIElOUFVUX01BSU4sICZwYWQpKSA8IDApIHsKKyAgICAgICAgYXZfZnJlZXAoJnBhZC5uYW1lKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAKICAgICBpZiAoZm0tPnBwc3JjKSB7CiAgICAgICAgIHBhZC5uYW1lID0gYXZfc3RyZHVwKCJjbGVhbl9zcmMiKTsKICAgICAgICAgcGFkLmNvbmZpZ19wcm9wcyA9IE5VTEw7CiAgICAgICAgIGlmICghcGFkLm5hbWUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBmZl9pbnNlcnRfaW5wYWQoY3R4LCBJTlBVVF9DTEVBTlNSQywgJnBhZCk7CisgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X2lucGFkKGN0eCwgSU5QVVRfQ0xFQU5TUkMsICZwYWQpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwYWQubmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKChmbS0+YmxvY2t4ICYgKGZtLT5ibG9ja3ggLSAxKSkgfHwKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2ZpbGxib3JkZXJzLmMgYi9saWJhdmZpbHRlci92Zl9maWxsYm9yZGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmODgzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9maWxsYm9yZGVycy5jCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbG9yc3BhY2UuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJkcmF3dXRpbHMuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitlbnVtIHsgWSwgVSwgViwgQSB9OworZW51bSB7IFIsIEcsIEIgfTsKKworZW51bSBGaWxsTW9kZSB7IEZNX1NNRUFSLCBGTV9NSVJST1IsIEZNX0ZJWEVELCBGTV9OQl9NT0RFUyB9OworCit0eXBlZGVmIHN0cnVjdCBCb3JkZXJzIHsKKyAgICBpbnQgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tOworfSBCb3JkZXJzOworCit0eXBlZGVmIHN0cnVjdCBGaWxsQm9yZGVyc0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b207CisgICAgaW50IG1vZGU7CisKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBkZXB0aDsKKyAgICBCb3JkZXJzIGJvcmRlcnNbNF07CisgICAgaW50IHBsYW5ld2lkdGhbNF07CisgICAgaW50IHBsYW5laGVpZ2h0WzRdOworICAgIHVpbnQ4X3QgZmlsbFs0XTsKKyAgICB1aW50OF90IHl1dl9jb2xvcls0XTsKKyAgICB1aW50OF90IHJnYmFfY29sb3JbNF07CisKKyAgICB2b2lkICgqZmlsbGJvcmRlcnMpKHN0cnVjdCBGaWxsQm9yZGVyc0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKTsKK30gRmlsbEJvcmRlcnNDb250ZXh0OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTIsIEFWX1BJWF9GTVRfR0JSQVAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHNfbGlzdCA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOworICAgIGlmICghZm10c19saXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmbXRzX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBzbWVhcl9ib3JkZXJzOChGaWxsQm9yZGVyc0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBwLCB5OworCisgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IGZyYW1lLT5kYXRhW3BdOworICAgICAgICBpbnQgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbcF07CisKKyAgICAgICAgZm9yICh5ID0gcy0+Ym9yZGVyc1twXS50b3A7IHkgPCBzLT5wbGFuZWhlaWdodFtwXSAtIHMtPmJvcmRlcnNbcF0uYm90dG9tOyB5KyspIHsKKyAgICAgICAgICAgIG1lbXNldChwdHIgKyB5ICogbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgKihwdHIgKyB5ICogbGluZXNpemUgKyBzLT5ib3JkZXJzW3BdLmxlZnQpLAorICAgICAgICAgICAgICAgICAgIHMtPmJvcmRlcnNbcF0ubGVmdCk7CisgICAgICAgICAgICBtZW1zZXQocHRyICsgeSAqIGxpbmVzaXplICsgcy0+cGxhbmV3aWR0aFtwXSAtIHMtPmJvcmRlcnNbcF0ucmlnaHQsCisgICAgICAgICAgICAgICAgICAgKihwdHIgKyB5ICogbGluZXNpemUgKyBzLT5wbGFuZXdpZHRoW3BdIC0gcy0+Ym9yZGVyc1twXS5yaWdodCAtIDEpLAorICAgICAgICAgICAgICAgICAgIHMtPmJvcmRlcnNbcF0ucmlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmJvcmRlcnNbcF0udG9wOyB5KyspIHsKKyAgICAgICAgICAgIG1lbWNweShwdHIgKyB5ICogbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgcHRyICsgcy0+Ym9yZGVyc1twXS50b3AgKiBsaW5lc2l6ZSwgcy0+cGxhbmV3aWR0aFtwXSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHkgPSBzLT5wbGFuZWhlaWdodFtwXSAtIHMtPmJvcmRlcnNbcF0uYm90dG9tOyB5IDwgcy0+cGxhbmVoZWlnaHRbcF07IHkrKykgeworICAgICAgICAgICAgbWVtY3B5KHB0ciArIHkgKiBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBwdHIgKyAocy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbSAtIDEpICogbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgcy0+cGxhbmV3aWR0aFtwXSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHNtZWFyX2JvcmRlcnMxNihGaWxsQm9yZGVyc0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBwLCB5LCB4OworCisgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIHVpbnQxNl90ICpwdHIgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YVtwXTsKKyAgICAgICAgaW50IGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplW3BdIC8gMjsKKworICAgICAgICBmb3IgKHkgPSBzLT5ib3JkZXJzW3BdLnRvcDsgeSA8IHMtPnBsYW5laGVpZ2h0W3BdIC0gcy0+Ym9yZGVyc1twXS5ib3R0b207IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPmJvcmRlcnNbcF0ubGVmdDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcHRyW3kgKiBsaW5lc2l6ZSArIHhdID0gICoocHRyICsgeSAqIGxpbmVzaXplICsgcy0+Ym9yZGVyc1twXS5sZWZ0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPmJvcmRlcnNbcF0ucmlnaHQ7IHgrKykgeworICAgICAgICAgICAgICAgIHB0clt5ICogbGluZXNpemUgKyBzLT5wbGFuZXdpZHRoW3BdIC0gcy0+Ym9yZGVyc1twXS5yaWdodCArIHhdID0KKyAgICAgICAgICAgICAgICAgICAqKHB0ciArIHkgKiBsaW5lc2l6ZSArIHMtPnBsYW5ld2lkdGhbcF0gLSBzLT5ib3JkZXJzW3BdLnJpZ2h0IC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+Ym9yZGVyc1twXS50b3A7IHkrKykgeworICAgICAgICAgICAgbWVtY3B5KHB0ciArIHkgKiBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBwdHIgKyBzLT5ib3JkZXJzW3BdLnRvcCAqIGxpbmVzaXplLCBzLT5wbGFuZXdpZHRoW3BdICogMik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHkgPSBzLT5wbGFuZWhlaWdodFtwXSAtIHMtPmJvcmRlcnNbcF0uYm90dG9tOyB5IDwgcy0+cGxhbmVoZWlnaHRbcF07IHkrKykgeworICAgICAgICAgICAgbWVtY3B5KHB0ciArIHkgKiBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBwdHIgKyAocy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbSAtIDEpICogbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgcy0+cGxhbmV3aWR0aFtwXSAqIDIpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtaXJyb3JfYm9yZGVyczgoRmlsbEJvcmRlcnNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgcCwgeSwgeDsKKworICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICB1aW50OF90ICpwdHIgPSBmcmFtZS0+ZGF0YVtwXTsKKyAgICAgICAgaW50IGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplW3BdOworCisgICAgICAgIGZvciAoeSA9IHMtPmJvcmRlcnNbcF0udG9wOyB5IDwgcy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbTsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+Ym9yZGVyc1twXS5sZWZ0OyB4KyspIHsKKyAgICAgICAgICAgICAgICBwdHJbeSAqIGxpbmVzaXplICsgeF0gPSBwdHJbeSAqIGxpbmVzaXplICsgcy0+Ym9yZGVyc1twXS5sZWZ0ICogMiAtIDEgLSB4XTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPmJvcmRlcnNbcF0ucmlnaHQ7IHgrKykgeworICAgICAgICAgICAgICAgIHB0clt5ICogbGluZXNpemUgKyBzLT5wbGFuZXdpZHRoW3BdIC0gcy0+Ym9yZGVyc1twXS5yaWdodCArIHhdID0KKyAgICAgICAgICAgICAgICAgICAgcHRyW3kgKiBsaW5lc2l6ZSArIHMtPnBsYW5ld2lkdGhbcF0gLSBzLT5ib3JkZXJzW3BdLnJpZ2h0IC0gMSAtIHhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmJvcmRlcnNbcF0udG9wOyB5KyspIHsKKyAgICAgICAgICAgIG1lbWNweShwdHIgKyB5ICogbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgcHRyICsgKHMtPmJvcmRlcnNbcF0udG9wICogMiAtIDEgLSB5KSAqIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgIHMtPnBsYW5ld2lkdGhbcF0pOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmJvcmRlcnNbcF0uYm90dG9tOyB5KyspIHsKKyAgICAgICAgICAgIG1lbWNweShwdHIgKyAocy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbSArIHkpICogbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgcHRyICsgKHMtPnBsYW5laGVpZ2h0W3BdIC0gcy0+Ym9yZGVyc1twXS5ib3R0b20gLSAxIC0geSkgKiBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzLT5wbGFuZXdpZHRoW3BdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbWlycm9yX2JvcmRlcnMxNihGaWxsQm9yZGVyc0NvbnRleHQgKnMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCBwLCB5LCB4OworCisgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIHVpbnQxNl90ICpwdHIgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YVtwXTsKKyAgICAgICAgaW50IGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplW3BdIC8gMjsKKworICAgICAgICBmb3IgKHkgPSBzLT5ib3JkZXJzW3BdLnRvcDsgeSA8IHMtPnBsYW5laGVpZ2h0W3BdIC0gcy0+Ym9yZGVyc1twXS5ib3R0b207IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHMtPmJvcmRlcnNbcF0ubGVmdDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcHRyW3kgKiBsaW5lc2l6ZSArIHhdID0gcHRyW3kgKiBsaW5lc2l6ZSArIHMtPmJvcmRlcnNbcF0ubGVmdCAqIDIgLSAxIC0geF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5ib3JkZXJzW3BdLnJpZ2h0OyB4KyspIHsKKyAgICAgICAgICAgICAgICBwdHJbeSAqIGxpbmVzaXplICsgcy0+cGxhbmV3aWR0aFtwXSAtIHMtPmJvcmRlcnNbcF0ucmlnaHQgKyB4XSA9CisgICAgICAgICAgICAgICAgICAgIHB0clt5ICogbGluZXNpemUgKyBzLT5wbGFuZXdpZHRoW3BdIC0gcy0+Ym9yZGVyc1twXS5yaWdodCAtIDEgLSB4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzLT5ib3JkZXJzW3BdLnRvcDsgeSsrKSB7CisgICAgICAgICAgICBtZW1jcHkocHRyICsgeSAqIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgIHB0ciArIChzLT5ib3JkZXJzW3BdLnRvcCAqIDIgLSAxIC0geSkgKiBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzLT5wbGFuZXdpZHRoW3BdICogMik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+Ym9yZGVyc1twXS5ib3R0b207IHkrKykgeworICAgICAgICAgICAgbWVtY3B5KHB0ciArIChzLT5wbGFuZWhlaWdodFtwXSAtIHMtPmJvcmRlcnNbcF0uYm90dG9tICsgeSkgKiBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBwdHIgKyAocy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbSAtIDEgLSB5KSAqIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgIHMtPnBsYW5ld2lkdGhbcF0gKiAyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZml4ZWRfYm9yZGVyczgoRmlsbEJvcmRlcnNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgcCwgeTsKKworICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICB1aW50OF90ICpwdHIgPSBmcmFtZS0+ZGF0YVtwXTsKKyAgICAgICAgdWludDhfdCBmaWxsID0gcy0+ZmlsbFtwXTsKKyAgICAgICAgaW50IGxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplW3BdOworCisgICAgICAgIGZvciAoeSA9IHMtPmJvcmRlcnNbcF0udG9wOyB5IDwgcy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbTsgeSsrKSB7CisgICAgICAgICAgICBtZW1zZXQocHRyICsgeSAqIGxpbmVzaXplLCBmaWxsLCBzLT5ib3JkZXJzW3BdLmxlZnQpOworICAgICAgICAgICAgbWVtc2V0KHB0ciArIHkgKiBsaW5lc2l6ZSArIHMtPnBsYW5ld2lkdGhbcF0gLSBzLT5ib3JkZXJzW3BdLnJpZ2h0LCBmaWxsLAorICAgICAgICAgICAgICAgICAgIHMtPmJvcmRlcnNbcF0ucmlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmJvcmRlcnNbcF0udG9wOyB5KyspIHsKKyAgICAgICAgICAgIG1lbXNldChwdHIgKyB5ICogbGluZXNpemUsIGZpbGwsIHMtPnBsYW5ld2lkdGhbcF0pOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gcy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbTsgeSA8IHMtPnBsYW5laGVpZ2h0W3BdOyB5KyspIHsKKyAgICAgICAgICAgIG1lbXNldChwdHIgKyB5ICogbGluZXNpemUsIGZpbGwsIHMtPnBsYW5ld2lkdGhbcF0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaXhlZF9ib3JkZXJzMTYoRmlsbEJvcmRlcnNDb250ZXh0ICpzLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBpbnQgcCwgeSwgeDsKKworICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICB1aW50MTZfdCAqcHRyID0gKHVpbnQxNl90ICopZnJhbWUtPmRhdGFbcF07CisgICAgICAgIHVpbnQxNl90IGZpbGwgPSBzLT5maWxsW3BdIDw8IChzLT5kZXB0aCAtIDgpOworICAgICAgICBpbnQgbGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbcF0gLyAyOworCisgICAgICAgIGZvciAoeSA9IHMtPmJvcmRlcnNbcF0udG9wOyB5IDwgcy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbTsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+Ym9yZGVyc1twXS5sZWZ0OyB4KyspIHsKKyAgICAgICAgICAgICAgICBwdHJbeSAqIGxpbmVzaXplICsgeF0gPSBmaWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+Ym9yZGVyc1twXS5yaWdodDsgeCsrKSB7CisgICAgICAgICAgICAgICAgcHRyW3kgKiBsaW5lc2l6ZSArIHMtPnBsYW5ld2lkdGhbcF0gLSBzLT5ib3JkZXJzW3BdLnJpZ2h0ICsgeF0gPSBmaWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmJvcmRlcnNbcF0udG9wOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5wbGFuZXdpZHRoW3BdOyB4KyspIHsKKyAgICAgICAgICAgICAgICBwdHJbeSAqIGxpbmVzaXplICsgeF0gPSBmaWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gcy0+cGxhbmVoZWlnaHRbcF0gLSBzLT5ib3JkZXJzW3BdLmJvdHRvbTsgeSA8IHMtPnBsYW5laGVpZ2h0W3BdOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5wbGFuZXdpZHRoW3BdOyB4KyspIHsKKyAgICAgICAgICAgICAgICBwdHJbeSAqIGxpbmVzaXplICsgeF0gPSBmaWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgRmlsbEJvcmRlcnNDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisKKyAgICBzLT5maWxsYm9yZGVycyhzLCBmcmFtZSk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGlubGluay0+ZHN0LT5vdXRwdXRzWzBdLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgRmlsbEJvcmRlcnNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworCisgICAgcy0+bmJfcGxhbmVzID0gZGVzYy0+bmJfY29tcG9uZW50czsKKyAgICBzLT5kZXB0aCA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisKKyAgICBzLT5wbGFuZWhlaWdodFsxXSA9IHMtPnBsYW5laGVpZ2h0WzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOworICAgIHMtPnBsYW5ld2lkdGhbMV0gID0gcy0+cGxhbmV3aWR0aFsyXSAgPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIHMtPnBsYW5ld2lkdGhbMF0gID0gcy0+cGxhbmV3aWR0aFszXSAgPSBpbmxpbmstPnc7CisKKyAgICBzLT5ib3JkZXJzWzBdLmxlZnQgICA9IHMtPmJvcmRlcnNbM10ubGVmdCA9IHMtPmxlZnQ7CisgICAgcy0+Ym9yZGVyc1swXS5yaWdodCAgPSBzLT5ib3JkZXJzWzNdLnJpZ2h0ID0gcy0+cmlnaHQ7CisgICAgcy0+Ym9yZGVyc1swXS50b3AgICAgPSBzLT5ib3JkZXJzWzNdLnRvcCA9IHMtPnRvcDsKKyAgICBzLT5ib3JkZXJzWzBdLmJvdHRvbSA9IHMtPmJvcmRlcnNbM10uYm90dG9tID0gcy0+Ym90dG9tOworCisgICAgcy0+Ym9yZGVyc1sxXS5sZWZ0ICAgPSBzLT5sZWZ0ID4+IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+Ym9yZGVyc1sxXS5yaWdodCAgPSBzLT5yaWdodCA+PiBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHMtPmJvcmRlcnNbMV0udG9wICAgID0gcy0+dG9wID4+IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgcy0+Ym9yZGVyc1sxXS5ib3R0b20gPSBzLT5ib3R0b20gPj4gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHMtPmJvcmRlcnNbMl0ubGVmdCAgID0gcy0+bGVmdCA+PiBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHMtPmJvcmRlcnNbMl0ucmlnaHQgID0gcy0+cmlnaHQgPj4gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBzLT5ib3JkZXJzWzJdLnRvcCAgICA9IHMtPnRvcCA+PiBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIHMtPmJvcmRlcnNbMl0uYm90dG9tID0gcy0+Ym90dG9tID4+IGRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICBpZiAoaW5saW5rLT53IDwgcy0+bGVmdCArIHMtPnJpZ2h0IHx8CisgICAgICAgIGlubGluay0+dyA8PSBzLT5sZWZ0IHx8CisgICAgICAgIGlubGluay0+dyA8PSBzLT5yaWdodCB8fAorICAgICAgICBpbmxpbmstPmggPCBzLT50b3AgKyBzLT5ib3R0b20gfHwKKyAgICAgICAgaW5saW5rLT5oIDw9IHMtPnRvcCB8fAorICAgICAgICBpbmxpbmstPmggPD0gcy0+Ym90dG9tIHx8CisgICAgICAgIGlubGluay0+dyA8IHMtPmxlZnQgKiAyIHx8CisgICAgICAgIGlubGluay0+dyA8IHMtPnJpZ2h0ICogMiB8fAorICAgICAgICBpbmxpbmstPmggPCBzLT50b3AgKiAyIHx8CisgICAgICAgIGlubGluay0+aCA8IHMtPmJvdHRvbSAqIDIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQm9yZGVycyBhcmUgYmlnZ2VyIHRoYW4gaW5wdXQgZnJhbWUgc2l6ZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHN3aXRjaCAocy0+bW9kZSkgeworICAgIGNhc2UgRk1fU01FQVI6ICBzLT5maWxsYm9yZGVycyA9IHMtPmRlcHRoIDw9IDggPyBzbWVhcl9ib3JkZXJzOCAgOiBzbWVhcl9ib3JkZXJzMTY7ICBicmVhazsKKyAgICBjYXNlIEZNX01JUlJPUjogcy0+ZmlsbGJvcmRlcnMgPSBzLT5kZXB0aCA8PSA4ID8gbWlycm9yX2JvcmRlcnM4IDogbWlycm9yX2JvcmRlcnMxNjsgYnJlYWs7CisgICAgY2FzZSBGTV9GSVhFRDogIHMtPmZpbGxib3JkZXJzID0gcy0+ZGVwdGggPD0gOCA/IGZpeGVkX2JvcmRlcnM4ICA6IGZpeGVkX2JvcmRlcnMxNjsgIGJyZWFrOworICAgIH0KKworICAgIHMtPnl1dl9jb2xvcltZXSA9IFJHQl9UT19ZX0NDSVIocy0+cmdiYV9jb2xvcltSXSwgcy0+cmdiYV9jb2xvcltHXSwgcy0+cmdiYV9jb2xvcltCXSk7CisgICAgcy0+eXV2X2NvbG9yW1VdID0gUkdCX1RPX1VfQ0NJUihzLT5yZ2JhX2NvbG9yW1JdLCBzLT5yZ2JhX2NvbG9yW0ddLCBzLT5yZ2JhX2NvbG9yW0JdLCAwKTsKKyAgICBzLT55dXZfY29sb3JbVl0gPSBSR0JfVE9fVl9DQ0lSKHMtPnJnYmFfY29sb3JbUl0sIHMtPnJnYmFfY29sb3JbR10sIHMtPnJnYmFfY29sb3JbQl0sIDApOworICAgIHMtPnl1dl9jb2xvcltBXSA9IHMtPnJnYmFfY29sb3JbQV07CisKKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKSB7CisgICAgICAgIHVpbnQ4X3QgcmdiYV9tYXBbNF07CisgICAgICAgIGludCBpOworCisgICAgICAgIGZmX2ZpbGxfcmdiYV9tYXAocmdiYV9tYXAsIGlubGluay0+Zm9ybWF0KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIHMtPmZpbGxbcmdiYV9tYXBbaV1dID0gcy0+cmdiYV9jb2xvcltpXTsKKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkocy0+ZmlsbCwgcy0+eXV2X2NvbG9yLCBzaXplb2Yocy0+eXV2X2NvbG9yKSk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZpbGxCb3JkZXJzQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmaWxsYm9yZGVyc19vcHRpb25zW10gPSB7CisgICAgeyAibGVmdCIsICAgInNldCB0aGUgbGVmdCBmaWxsIGJvcmRlciIsICAgT0ZGU0VUKGxlZnQpLCAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIElOVF9NQVgsICAgIEZMQUdTIH0sCisgICAgeyAicmlnaHQiLCAgInNldCB0aGUgcmlnaHQgZmlsbCBib3JkZXIiLCAgT0ZGU0VUKHJpZ2h0KSwgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIElOVF9NQVgsICAgIEZMQUdTIH0sCisgICAgeyAidG9wIiwgICAgInNldCB0aGUgdG9wIGZpbGwgYm9yZGVyIiwgICAgT0ZGU0VUKHRvcCksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIElOVF9NQVgsICAgIEZMQUdTIH0sCisgICAgeyAiYm90dG9tIiwgInNldCB0aGUgYm90dG9tIGZpbGwgYm9yZGVyIiwgT0ZGU0VUKGJvdHRvbSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIElOVF9NQVgsICAgIEZMQUdTIH0sCisgICAgeyAibW9kZSIsICAgInNldCB0aGUgZmlsbCBib3JkZXJzIG1vZGUiLCAgT0ZGU0VUKG1vZGUpLCAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Rk1fU01FQVJ9LCAwLCBGTV9OQl9NT0RFUy0xLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgInNtZWFyIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GTV9TTUVBUn0sICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgIm1pcnJvciIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GTV9NSVJST1J9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgImZpeGVkIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GTV9GSVhFRH0sICAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAiY29sb3IiLCAgInNldCB0aGUgY29sb3IgZm9yIHRoZSBmaXhlZCBtb2RlIiwgT0ZGU0VUKHJnYmFfY29sb3IpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHIgPSAiYmxhY2sifSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKGZpbGxib3JkZXJzKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGZpbGxib3JkZXJzX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgICA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAubmVlZHNfd3JpdGFibGUgPSAxLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBmaWxsYm9yZGVyc19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZmlsbGJvcmRlcnMgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiZmlsbGJvcmRlcnMiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZpbGwgYm9yZGVycyBvZiB0aGUgaW5wdXQgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRmlsbEJvcmRlcnNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZmaWxsYm9yZGVyc19jbGFzcywKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBmaWxsYm9yZGVyc19pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBmaWxsYm9yZGVyc19vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZmxvb2RmaWxsLmMgYi9saWJhdmZpbHRlci92Zl9mbG9vZGZpbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNkZDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfZmxvb2RmaWxsLmMKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgUG9pbnRzIHsKKyAgICB1aW50MTZfdCB4LCB5OworfSBQb2ludHM7CisKK3R5cGVkZWYgc3RydWN0IEZsb29kZmlsbENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgaW50IHgsIHk7CisgICAgaW50IHMwLCBzMSwgczIsIHMzOworICAgIGludCBkMCwgZDEsIGQyLCBkMzsKKworICAgIGludCBiYWNrLCBmcm9udDsKKyAgICBQb2ludHMgKnBvaW50czsKKworICAgIGludCAoKmlzX3NhbWUpKEFWRnJhbWUgKmZyYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgczAsIHVuc2lnbmVkIHMxLCB1bnNpZ25lZCBzMiwgdW5zaWduZWQgczMpOworICAgIHZvaWQgKCpzZXRfcGl4ZWwpKEFWRnJhbWUgKmZyYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZDAsIHVuc2lnbmVkIGQxLCB1bnNpZ25lZCBkMiwgdW5zaWduZWQgZDMpOworICAgIHZvaWQgKCpwaWNrX3BpeGVsKShBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnMwLCBpbnQgKnMxLCBpbnQgKnMyLCBpbnQgKnMzKTsKK30gRmxvb2RmaWxsQ29udGV4dDsKKworc3RhdGljIGludCBpc19pbnNpZGUoaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCit7CisgICAgaWYgKHggPj0gMCAmJiB4IDwgdyAmJiB5ID49IDAgJiYgeSA8IGgpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX3NhbWU0KEFWRnJhbWUgKmZyYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHMwLCB1bnNpZ25lZCBzMSwgdW5zaWduZWQgczIsIHVuc2lnbmVkIHMzKQoreworICAgIHVuc2lnbmVkIGMwID0gZnJhbWUtPmRhdGFbMF1beSAqIGZyYW1lLT5saW5lc2l6ZVswXSArIHhdOworICAgIHVuc2lnbmVkIGMxID0gZnJhbWUtPmRhdGFbMV1beSAqIGZyYW1lLT5saW5lc2l6ZVsxXSArIHhdOworICAgIHVuc2lnbmVkIGMyID0gZnJhbWUtPmRhdGFbMl1beSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIHhdOworICAgIHVuc2lnbmVkIGMzID0gZnJhbWUtPmRhdGFbM11beSAqIGZyYW1lLT5saW5lc2l6ZVszXSArIHhdOworCisgICAgaWYgKHMwID09IGMwICYmIHMxID09IGMxICYmIHMyID09IGMyICYmIHMzID09IGMzKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19zYW1lNF8xNihBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzMCwgdW5zaWduZWQgczEsIHVuc2lnbmVkIHMyLCB1bnNpZ25lZCBzMykKK3sKKyAgICB1bnNpZ25lZCBjMCA9IEFWX1JOMTYoZnJhbWUtPmRhdGFbMF0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdICsgMiAqIHgpOworICAgIHVuc2lnbmVkIGMxID0gQVZfUk4xNihmcmFtZS0+ZGF0YVsxXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMV0gKyAyICogeCk7CisgICAgdW5zaWduZWQgYzIgPSBBVl9STjE2KGZyYW1lLT5kYXRhWzJdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIDIgKiB4KTsKKyAgICB1bnNpZ25lZCBjMyA9IEFWX1JOMTYoZnJhbWUtPmRhdGFbM10gKyB5ICogZnJhbWUtPmxpbmVzaXplWzNdICsgMiAqIHgpOworCisgICAgaWYgKHMwID09IGMwICYmIHMxID09IGMxICYmIHMyID09IGMyICYmIHMzID09IGMzKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19zYW1lMyhBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzMCwgdW5zaWduZWQgczEsIHVuc2lnbmVkIHMyLCB1bnNpZ25lZCBzMykKK3sKKyAgICB1bnNpZ25lZCBjMCA9IGZyYW1lLT5kYXRhWzBdW3kgKiBmcmFtZS0+bGluZXNpemVbMF0gKyB4XTsKKyAgICB1bnNpZ25lZCBjMSA9IGZyYW1lLT5kYXRhWzFdW3kgKiBmcmFtZS0+bGluZXNpemVbMV0gKyB4XTsKKyAgICB1bnNpZ25lZCBjMiA9IGZyYW1lLT5kYXRhWzJdW3kgKiBmcmFtZS0+bGluZXNpemVbMl0gKyB4XTsKKworICAgIGlmIChzMCA9PSBjMCAmJiBzMSA9PSBjMSAmJiBzMiA9PSBjMikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfc2FtZTNfMTYoQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgczAsIHVuc2lnbmVkIHMxLCB1bnNpZ25lZCBzMiwgdW5zaWduZWQgczMpCit7CisgICAgdW5zaWduZWQgYzAgPSBBVl9STjE2KGZyYW1lLT5kYXRhWzBdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVswXSArIDIgKiB4KTsKKyAgICB1bnNpZ25lZCBjMSA9IEFWX1JOMTYoZnJhbWUtPmRhdGFbMV0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzFdICsgMiAqIHgpOworICAgIHVuc2lnbmVkIGMyID0gQVZfUk4xNihmcmFtZS0+ZGF0YVsyXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMl0gKyAyICogeCk7CisKKyAgICBpZiAoczAgPT0gYzAgJiYgczEgPT0gYzEgJiYgczIgPT0gYzIpCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX3NhbWUxKEFWRnJhbWUgKmZyYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHMwLCB1bnNpZ25lZCBzMSwgdW5zaWduZWQgczIsIHVuc2lnbmVkIHMzKQoreworICAgIHVuc2lnbmVkIGMwID0gZnJhbWUtPmRhdGFbMF1beSAqIGZyYW1lLT5saW5lc2l6ZVswXSArIHhdOworCisgICAgaWYgKHMwID09IGMwKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19zYW1lMV8xNihBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzMCwgdW5zaWduZWQgczEsIHVuc2lnbmVkIHMyLCB1bnNpZ25lZCBzMykKK3sKKyAgICB1bnNpZ25lZCBjMCA9IEFWX1JOMTYoZnJhbWUtPmRhdGFbMF0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdICsgMiAqIHgpOworCisgICAgaWYgKHMwID09IGMwKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3BpeGVsMShBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBkMCwgdW5zaWduZWQgZDEsIHVuc2lnbmVkIGQyLCB1bnNpZ25lZCBkMykKK3sKKyAgICBmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdICsgeF0gPSBkMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3BpeGVsMV8xNihBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBkMCwgdW5zaWduZWQgZDEsIHVuc2lnbmVkIGQyLCB1bnNpZ25lZCBkMykKK3sKKyAgICBBVl9XTjE2KGZyYW1lLT5kYXRhWzBdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVswXSArIDIgKiB4LCBkMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waXhlbDMoQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZDAsIHVuc2lnbmVkIGQxLCB1bnNpZ25lZCBkMiwgdW5zaWduZWQgZDMpCit7CisgICAgZnJhbWUtPmRhdGFbMF1beSAqIGZyYW1lLT5saW5lc2l6ZVswXSArIHhdID0gZDA7CisgICAgZnJhbWUtPmRhdGFbMV1beSAqIGZyYW1lLT5saW5lc2l6ZVsxXSArIHhdID0gZDE7CisgICAgZnJhbWUtPmRhdGFbMl1beSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIHhdID0gZDI7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waXhlbDNfMTYoQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZDAsIHVuc2lnbmVkIGQxLCB1bnNpZ25lZCBkMiwgdW5zaWduZWQgZDMpCit7CisgICAgQVZfV04xNihmcmFtZS0+ZGF0YVswXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMF0gKyAyICogeCwgZDApOworICAgIEFWX1dOMTYoZnJhbWUtPmRhdGFbMV0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzFdICsgMiAqIHgsIGQxKTsKKyAgICBBVl9XTjE2KGZyYW1lLT5kYXRhWzJdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIDIgKiB4LCBkMik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waXhlbDQoQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZDAsIHVuc2lnbmVkIGQxLCB1bnNpZ25lZCBkMiwgdW5zaWduZWQgZDMpCit7CisgICAgZnJhbWUtPmRhdGFbMF1beSAqIGZyYW1lLT5saW5lc2l6ZVswXSArIHhdID0gZDA7CisgICAgZnJhbWUtPmRhdGFbMV1beSAqIGZyYW1lLT5saW5lc2l6ZVsxXSArIHhdID0gZDE7CisgICAgZnJhbWUtPmRhdGFbMl1beSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIHhdID0gZDI7CisgICAgZnJhbWUtPmRhdGFbM11beSAqIGZyYW1lLT5saW5lc2l6ZVszXSArIHhdID0gZDM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9waXhlbDRfMTYoQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZDAsIHVuc2lnbmVkIGQxLCB1bnNpZ25lZCBkMiwgdW5zaWduZWQgZDMpCit7CisgICAgQVZfV04xNihmcmFtZS0+ZGF0YVswXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMF0gKyAyICogeCwgZDApOworICAgIEFWX1dOMTYoZnJhbWUtPmRhdGFbMV0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzFdICsgMiAqIHgsIGQxKTsKKyAgICBBVl9XTjE2KGZyYW1lLT5kYXRhWzJdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIDIgKiB4LCBkMik7CisgICAgQVZfV04xNihmcmFtZS0+ZGF0YVszXSArIHkgKiBmcmFtZS0+bGluZXNpemVbM10gKyAyICogeCwgZDMpOworfQorCitzdGF0aWMgdm9pZCBwaWNrX3BpeGVsMShBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzMCwgaW50ICpzMSwgaW50ICpzMiwgaW50ICpzMykKK3sKKyAgICBpZiAoKnMwIDwgMCkKKyAgICAgICAgKnMwID0gZnJhbWUtPmRhdGFbMF1beSAqIGZyYW1lLT5saW5lc2l6ZVswXSArIHhdOworfQorCitzdGF0aWMgdm9pZCBwaWNrX3BpeGVsMV8xNihBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzMCwgaW50ICpzMSwgaW50ICpzMiwgaW50ICpzMykKK3sKKyAgICBpZiAoKnMwIDwgMCkKKyAgICAgICAgKnMwID0gQVZfUk4xNihmcmFtZS0+ZGF0YVswXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMF0gKyAyICogeCk7Cit9CisKK3N0YXRpYyB2b2lkIHBpY2tfcGl4ZWwzKEFWRnJhbWUgKmZyYW1lLCBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnMwLCBpbnQgKnMxLCBpbnQgKnMyLCBpbnQgKnMzKQoreworICAgIGlmICgqczAgPCAwKQorICAgICAgICAqczAgPSBmcmFtZS0+ZGF0YVswXVt5ICogZnJhbWUtPmxpbmVzaXplWzBdICsgeF07CisgICAgaWYgKCpzMSA8IDApCisgICAgICAgICpzMSA9IGZyYW1lLT5kYXRhWzFdW3kgKiBmcmFtZS0+bGluZXNpemVbMV0gKyB4XTsKKyAgICBpZiAoKnMyIDwgMCkKKyAgICAgICAgKnMyID0gZnJhbWUtPmRhdGFbMl1beSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIHhdOworfQorCitzdGF0aWMgdm9pZCBwaWNrX3BpeGVsM18xNihBVkZyYW1lICpmcmFtZSwgaW50IHgsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzMCwgaW50ICpzMSwgaW50ICpzMiwgaW50ICpzMykKK3sKKyAgICBpZiAoKnMwIDwgMCkKKyAgICAgICAgKnMwID0gQVZfUk4xNihmcmFtZS0+ZGF0YVswXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMF0gKyAyICogeCk7CisgICAgaWYgKCpzMSA8IDApCisgICAgICAgICpzMSA9IEFWX1JOMTYoZnJhbWUtPmRhdGFbMV0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzFdICsgMiAqIHgpOworICAgIGlmICgqczIgPCAwKQorICAgICAgICAqczIgPSBBVl9STjE2KGZyYW1lLT5kYXRhWzJdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIDIgKiB4KTsKK30KKworc3RhdGljIHZvaWQgcGlja19waXhlbDQoQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqczAsIGludCAqczEsIGludCAqczIsIGludCAqczMpCit7CisgICAgaWYgKCpzMCA8IDApCisgICAgICAgICpzMCA9IGZyYW1lLT5kYXRhWzBdW3kgKiBmcmFtZS0+bGluZXNpemVbMF0gKyB4XTsKKyAgICBpZiAoKnMxIDwgMCkKKyAgICAgICAgKnMxID0gZnJhbWUtPmRhdGFbMV1beSAqIGZyYW1lLT5saW5lc2l6ZVsxXSArIHhdOworICAgIGlmICgqczIgPCAwKQorICAgICAgICAqczIgPSBmcmFtZS0+ZGF0YVsyXVt5ICogZnJhbWUtPmxpbmVzaXplWzJdICsgeF07CisgICAgaWYgKCpzMyA8IDApCisgICAgICAgICpzMyA9IGZyYW1lLT5kYXRhWzNdW3kgKiBmcmFtZS0+bGluZXNpemVbM10gKyB4XTsKK30KKworc3RhdGljIHZvaWQgcGlja19waXhlbDRfMTYoQVZGcmFtZSAqZnJhbWUsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqczAsIGludCAqczEsIGludCAqczIsIGludCAqczMpCit7CisgICAgaWYgKCpzMCA8IDApCisgICAgICAgICpzMCA9IEFWX1JOMTYoZnJhbWUtPmRhdGFbMF0gKyB5ICogZnJhbWUtPmxpbmVzaXplWzBdICsgMiAqIHgpOworICAgIGlmICgqczEgPCAwKQorICAgICAgICAqczEgPSBBVl9STjE2KGZyYW1lLT5kYXRhWzFdICsgeSAqIGZyYW1lLT5saW5lc2l6ZVsxXSArIDIgKiB4KTsKKyAgICBpZiAoKnMyIDwgMCkKKyAgICAgICAgKnMyID0gQVZfUk4xNihmcmFtZS0+ZGF0YVsyXSArIHkgKiBmcmFtZS0+bGluZXNpemVbMl0gKyAyICogeCk7CisgICAgaWYgKCpzMyA8IDApCisgICAgICAgICpzMyA9IEFWX1JOMTYoZnJhbWUtPmRhdGFbM10gKyB5ICogZnJhbWUtPmxpbmVzaXplWzNdICsgMiAqIHgpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEZsb29kZmlsbENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IG5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKyAgICBpbnQgZGVwdGg7CisKKyAgICBkZXB0aCA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgaWYgKGRlcHRoID09IDgpIHsKKyAgICAgICAgc3dpdGNoIChuYl9wbGFuZXMpIHsKKyAgICAgICAgY2FzZSAxOiBzLT5zZXRfcGl4ZWwgID0gc2V0X3BpeGVsMTsKKyAgICAgICAgICAgICAgICBzLT5pc19zYW1lICAgID0gaXNfc2FtZTE7CisgICAgICAgICAgICAgICAgcy0+cGlja19waXhlbCA9IHBpY2tfcGl4ZWwxOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBzLT5zZXRfcGl4ZWwgID0gc2V0X3BpeGVsMzsKKyAgICAgICAgICAgICAgICBzLT5pc19zYW1lICAgID0gaXNfc2FtZTM7CisgICAgICAgICAgICAgICAgcy0+cGlja19waXhlbCA9IHBpY2tfcGl4ZWwzOyBicmVhazsKKyAgICAgICAgY2FzZSA0OiBzLT5zZXRfcGl4ZWwgID0gc2V0X3BpeGVsNDsKKyAgICAgICAgICAgICAgICBzLT5pc19zYW1lICAgID0gaXNfc2FtZTQ7CisgICAgICAgICAgICAgICAgcy0+cGlja19waXhlbCA9IHBpY2tfcGl4ZWw0OyBicmVhazsKKyAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChuYl9wbGFuZXMpIHsKKyAgICAgICAgY2FzZSAxOiBzLT5zZXRfcGl4ZWwgID0gc2V0X3BpeGVsMV8xNjsKKyAgICAgICAgICAgICAgICBzLT5pc19zYW1lICAgID0gaXNfc2FtZTFfMTY7CisgICAgICAgICAgICAgICAgcy0+cGlja19waXhlbCA9IHBpY2tfcGl4ZWwxXzE2OyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBzLT5zZXRfcGl4ZWwgID0gc2V0X3BpeGVsM18xNjsKKyAgICAgICAgICAgICAgICBzLT5pc19zYW1lICAgID0gaXNfc2FtZTNfMTY7CisgICAgICAgICAgICAgICAgcy0+cGlja19waXhlbCA9IHBpY2tfcGl4ZWwzXzE2OyBicmVhazsKKyAgICAgICAgY2FzZSA0OiBzLT5zZXRfcGl4ZWwgID0gc2V0X3BpeGVsNF8xNjsKKyAgICAgICAgICAgICAgICBzLT5pc19zYW1lICAgID0gaXNfc2FtZTRfMTY7CisgICAgICAgICAgICAgICAgcy0+cGlja19waXhlbCA9IHBpY2tfcGl4ZWw0XzE2OyBicmVhazsKKyAgICAgICB9CisgICAgfQorCisgICAgcy0+ZnJvbnQgPSBzLT5iYWNrID0gMDsKKyAgICBzLT5wb2ludHMgPSBhdl9jYWxsb2MoaW5saW5rLT53ICogaW5saW5rLT5oLCA0ICogc2l6ZW9mKFBvaW50cykpOworICAgIGlmICghcy0+cG9pbnRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5kc3Q7CisgICAgRmxvb2RmaWxsQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCB1bnNpZ25lZCBkMCA9IHMtPmQwOworICAgIGNvbnN0IHVuc2lnbmVkIGQxID0gcy0+ZDE7CisgICAgY29uc3QgdW5zaWduZWQgZDIgPSBzLT5kMjsKKyAgICBjb25zdCB1bnNpZ25lZCBkMyA9IHMtPmQzOworICAgIGludCBzMCA9IHMtPnMwOworICAgIGludCBzMSA9IHMtPnMxOworICAgIGludCBzMiA9IHMtPnMyOworICAgIGludCBzMyA9IHMtPnMzOworICAgIGNvbnN0IGludCB3ID0gZnJhbWUtPndpZHRoOworICAgIGNvbnN0IGludCBoID0gZnJhbWUtPmhlaWdodDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHJldCA9IGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUoZnJhbWUpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGlzX2luc2lkZShzLT54LCBzLT55LCB3LCBoKSkgeworICAgICAgICBzLT5waWNrX3BpeGVsKGZyYW1lLCBzLT54LCBzLT55LCAmczAsICZzMSwgJnMyLCAmczMpOworCisgICAgICAgIGlmIChzLT5pc19zYW1lKGZyYW1lLCBzLT54LCBzLT55LCBzMCwgczEsIHMyLCBzMykpIHsKKyAgICAgICAgICAgIHMtPnBvaW50c1tzLT5mcm9udF0ueCA9IHMtPng7CisgICAgICAgICAgICBzLT5wb2ludHNbcy0+ZnJvbnRdLnkgPSBzLT55OworICAgICAgICAgICAgcy0+ZnJvbnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChzLT5mcm9udCA+IHMtPmJhY2spIHsKKyAgICAgICAgICAgIGludCB4LCB5OworCisgICAgICAgICAgICBzLT5mcm9udC0tOworICAgICAgICAgICAgeCA9IHMtPnBvaW50c1tzLT5mcm9udF0ueDsKKyAgICAgICAgICAgIHkgPSBzLT5wb2ludHNbcy0+ZnJvbnRdLnk7CisKKyAgICAgICAgICAgIGlmIChzLT5pc19zYW1lKGZyYW1lLCB4LCB5LCBzMCwgczEsIHMyLCBzMykpIHsKKyAgICAgICAgICAgICAgICBzLT5zZXRfcGl4ZWwoZnJhbWUsIHgsIHksIGQwLCBkMSwgZDIsIGQzKTsKKworICAgICAgICAgICAgICAgIGlmIChpc19pbnNpZGUoeCArIDEsIHksIHcsIGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnBvaW50c1tzLT5mcm9udF0gIC54ID0geCArIDE7CisgICAgICAgICAgICAgICAgICAgIHMtPnBvaW50c1tzLT5mcm9udCsrXS55ID0geTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNfaW5zaWRlKHggLSAxLCB5LCB3LCBoKSkgeworICAgICAgICAgICAgICAgICAgICBzLT5wb2ludHNbcy0+ZnJvbnRdICAueCA9IHggLSAxOworICAgICAgICAgICAgICAgICAgICBzLT5wb2ludHNbcy0+ZnJvbnQrK10ueSA9IHk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzX2luc2lkZSh4LCB5ICsgMSwgdywgaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+cG9pbnRzW3MtPmZyb250XSAgLnggPSB4OworICAgICAgICAgICAgICAgICAgICBzLT5wb2ludHNbcy0+ZnJvbnQrK10ueSA9IHkgKyAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc19pbnNpZGUoeCwgeSAtIDEsIHcsIGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHMtPnBvaW50c1tzLT5mcm9udF0gIC54ID0geDsKKyAgICAgICAgICAgICAgICAgICAgcy0+cG9pbnRzW3MtPmZyb250KytdLnkgPSB5IC0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgZnJhbWUpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDksCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEwLAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDE0LAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUDE2LAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE0LAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHM7CisKKyAgICBmb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhlbF9mbXRzKTsKKyAgICBpZiAoIWZvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEZsb29kZmlsbENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmcy0+cG9pbnRzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGZsb29kZmlsbF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGZsb29kZmlsbF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRmxvb2RmaWxsQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBmbG9vZGZpbGxfb3B0aW9uc1tdID0geworICAgIHsgIngiLCAgInNldCBwaXhlbCB4IGNvb3JkaW5hdGUiLCAgICAgICAgICAgICBPRkZTRVQoeCksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInkiLCAgInNldCBwaXhlbCB5IGNvb3JkaW5hdGUiLCAgICAgICAgICAgICBPRkZTRVQoeSksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInMwIiwgInNldCBzb3VyY2UgIzAgY29tcG9uZW50IHZhbHVlIiwgICAgICBPRkZTRVQoczApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LC0xLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInMxIiwgInNldCBzb3VyY2UgIzEgY29tcG9uZW50IHZhbHVlIiwgICAgICBPRkZTRVQoczEpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LC0xLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInMyIiwgInNldCBzb3VyY2UgIzIgY29tcG9uZW50IHZhbHVlIiwgICAgICBPRkZTRVQoczIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LC0xLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInMzIiwgInNldCBzb3VyY2UgIzMgY29tcG9uZW50IHZhbHVlIiwgICAgICBPRkZTRVQoczMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LC0xLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgImQwIiwgInNldCBkZXN0aW5hdGlvbiAjMCBjb21wb25lbnQgdmFsdWUiLCBPRkZTRVQoZDApLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgImQxIiwgInNldCBkZXN0aW5hdGlvbiAjMSBjb21wb25lbnQgdmFsdWUiLCBPRkZTRVQoZDEpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgImQyIiwgInNldCBkZXN0aW5hdGlvbiAjMiBjb21wb25lbnQgdmFsdWUiLCBPRkZTRVQoZDIpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgImQzIiwgInNldCBkZXN0aW5hdGlvbiAjMyBjb21wb25lbnQgdmFsdWUiLCBPRkZTRVQoZDMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZmxvb2RmaWxsKTsKKworQVZGaWx0ZXIgZmZfdmZfZmxvb2RmaWxsID0geworICAgIC5uYW1lICAgICAgICAgID0gImZsb29kZmlsbCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmlsbCBhcmVhIHdpdGggc2FtZSBjb2xvciB3aXRoIGFub3RoZXIgY29sb3IuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoRmxvb2RmaWxsQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZmxvb2RmaWxsX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IGZsb29kZmlsbF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBmbG9vZGZpbGxfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2Zvcm1hdC5jIGIvbGliYXZmaWx0ZXIvdmZfZm9ybWF0LmMKaW5kZXggMWZiMzQ0Mi4uYTU3Yzk5ZCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZm9ybWF0LmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfZm9ybWF0LmMKQEAgLTE0MCw3ICsxNDAsNyBAQAogCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihGb3JtYXRDb250ZXh0LCB4KQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKLSAgICB7ICJwaXhfZm10cyIsICJBICd8Jy1zZXBhcmF0ZWQgbGlzdCBvZiBwaXhlbCBmb3JtYXRzIiwgT0ZGU0VUKHBpeF9mbXRzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB9LAorICAgIHsgInBpeF9mbXRzIiwgIkEgJ3wnLXNlcGFyYXRlZCBsaXN0IG9mIHBpeGVsIGZvcm1hdHMiLCBPRkZTRVQocGl4X2ZtdHMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2Zwcy5jIGIvbGliYXZmaWx0ZXIvdmZfZnBzLmMKaW5kZXggMDUwMGU5Ny4uOTE2N2EwMCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZnBzLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfZnBzLmMKQEAgLTIsNiArMiw3IEBACiAgKiBDb3B5cmlnaHQgMjAwNyBCb2JieSBCaW5naGFtCiAgKiBDb3B5cmlnaHQgMjAxMiBSb2JlcnQgTmFneSA8cm9uYWc4OSBnbWFpbCBjb20+CiAgKiBDb3B5cmlnaHQgMjAxMiBBbnRvbiBLaGlybm92IDxhbnRvbiBraGlybm92IG5ldD4KKyAqIENvcHlyaWdodCAyMDE4IENhbHZpbiBXYWx0b24gPGNhbHZpbi53YWx0b25Aa2Vwc3Rpbi5jYT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMjgsMzAgKzI5LDQzIEBACiAjaW5jbHVkZSA8ZmxvYXQuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAotI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZmlmby5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgotCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmaWx0ZXJzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJ2aWRlby5oIgorCitlbnVtIEVPRkFjdGlvbiB7CisgICAgRU9GX0FDVElPTl9ST1VORCwKKyAgICBFT0ZfQUNUSU9OX1BBU1MsCisgICAgRU9GX0FDVElPTl9OQgorfTsKIAogdHlwZWRlZiBzdHJ1Y3QgRlBTQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAKLSAgICBBVkZpZm9CdWZmZXIgKmZpZm87ICAgICAvLy88IHN0b3JlIGZyYW1lcyB1bnRpbCB3ZSBnZXQgdHdvIHN1Y2Nlc3NpdmUgdGltZXN0YW1wcwotCi0gICAgLyogdGltZXN0YW1wcyBpbiBpbnB1dCB0aW1lYmFzZSAqLwotICAgIGludDY0X3QgZmlyc3RfcHRzOyAgICAgIC8vLzwgcHRzIG9mIHRoZSBmaXJzdCBmcmFtZSB0aGF0IGFycml2ZWQgb24gdGhpcyBmaWx0ZXIKLQogICAgIGRvdWJsZSBzdGFydF90aW1lOyAgICAgIC8vLzwgcHRzLCBpbiBzZWNvbmRzLCBvZiB0aGUgZXhwZWN0ZWQgZmlyc3QgZnJhbWUKIAogICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgIC8vLzwgdGFyZ2V0IGZyYW1lcmF0ZQogICAgIGludCByb3VuZGluZzsgICAgICAgICAgIC8vLzwgQVZSb3VuZGluZyBtZXRob2QgZm9yIHRpbWVzdGFtcHMKKyAgICBpbnQgZW9mX2FjdGlvbjsgICAgICAgICAvLy88IGFjdGlvbiBwZXJmb3JtZWQgZm9yIGxhc3QgZnJhbWUgaW4gRklGTworCisgICAgLyogU2V0IGR1cmluZyBvdXRsaW5rIGNvbmZpZ3VyYXRpb24gKi8KKyAgICBpbnQ2NF90ICBpbl9wdHNfb2ZmOyAgICAvLy88IGlucHV0IGZyYW1lIHB0cyBvZmZzZXQgZm9yIHN0YXJ0X3RpbWUgaGFuZGxpbmcKKyAgICBpbnQ2NF90ICBvdXRfcHRzX29mZjsgICAvLy88IG91dHB1dCBmcmFtZSBwdHMgb2Zmc2V0IGZvciBzdGFydF90aW1lIGhhbmRsaW5nCisKKyAgICAvKiBSdW50aW1lIHN0YXRlICovCisgICAgaW50ICAgICAgc3RhdHVzOyAgICAgICAgLy8vPCBidWZmZXJlZCBpbnB1dCBzdGF0dXMKKyAgICBpbnQ2NF90ICBzdGF0dXNfcHRzOyAgICAvLy88IGJ1ZmZlcmVkIGlucHV0IHN0YXR1cyB0aW1lc3RhbXAKKworICAgIEFWRnJhbWUgKmZyYW1lc1syXTsgICAgIC8vLzwgYnVmZmVyZWQgZnJhbWVzCisgICAgaW50ICAgICAgZnJhbWVzX2NvdW50OyAgLy8vPCBudW1iZXIgb2YgYnVmZmVyZWQgZnJhbWVzCisKKyAgICBpbnQ2NF90ICBuZXh0X3B0czsgICAgICAvLy88IHB0cyBvZiB0aGUgbmV4dCBmcmFtZSB0byBvdXRwdXQKIAogICAgIC8qIHN0YXRpc3RpY3MgKi8KKyAgICBpbnQgY3VyX2ZyYW1lX291dDsgICAgICAgICAvLy88IG51bWJlciBvZiB0aW1lcyBjdXJyZW50IGZyYW1lIGhhcyBiZWVuIG91dHB1dAogICAgIGludCBmcmFtZXNfaW47ICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lcyBvbiBpbnB1dAogICAgIGludCBmcmFtZXNfb3V0OyAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lcyBvbiBvdXRwdXQKICAgICBpbnQgZHVwOyAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBmcmFtZXMgZHVwbGljYXRlZApAQCAtNjIsMTQgKzc2LDE3IEBACiAjZGVmaW5lIFYgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KICNkZWZpbmUgRiBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBmcHNfb3B0aW9uc1tdID0gewotICAgIHsgImZwcyIsICJBIHN0cmluZyBkZXNjcmliaW5nIGRlc2lyZWQgb3V0cHV0IGZyYW1lcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7IC5zdHIgPSAiMjUiIH0sIC5mbGFncyA9IFZ8RiB9LAotICAgIHsgInN0YXJ0X3RpbWUiLCAiQXNzdW1lIHRoZSBmaXJzdCBQVFMgc2hvdWxkIGJlIHRoaXMgdmFsdWUuIiwgT0ZGU0VUKHN0YXJ0X3RpbWUpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IERCTF9NQVh9LCAtREJMX01BWCwgREJMX01BWCwgViB9LAorICAgIHsgImZwcyIsICJBIHN0cmluZyBkZXNjcmliaW5nIGRlc2lyZWQgb3V0cHV0IGZyYW1lcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7IC5zdHIgPSAiMjUiIH0sIDAsIElOVF9NQVgsIFZ8RiB9LAorICAgIHsgInN0YXJ0X3RpbWUiLCAiQXNzdW1lIHRoZSBmaXJzdCBQVFMgc2hvdWxkIGJlIHRoaXMgdmFsdWUuIiwgT0ZGU0VUKHN0YXJ0X3RpbWUpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsgLmRibCA9IERCTF9NQVh9LCAtREJMX01BWCwgREJMX01BWCwgVnxGIH0sCiAgICAgeyAicm91bmQiLCAic2V0IHJvdW5kaW5nIG1ldGhvZCBmb3IgdGltZXN0YW1wcyIsIE9GRlNFVChyb3VuZGluZyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gQVZfUk9VTkRfTkVBUl9JTkYgfSwgMCwgNSwgVnxGLCAicm91bmQiIH0sCi0gICAgeyAiemVybyIsICJyb3VuZCB0b3dhcmRzIDAiLCAgICAgIE9GRlNFVChyb3VuZGluZyksIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ST1VORF9aRVJPICAgICB9LCAwLCA1LCBWfEYsICJyb3VuZCIgfSwKLSAgICB7ICJpbmYiLCAgInJvdW5kIGF3YXkgZnJvbSAwIiwgICAgT0ZGU0VUKHJvdW5kaW5nKSwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX1JPVU5EX0lORiAgICAgIH0sIDAsIDUsIFZ8RiwgInJvdW5kIiB9LAotICAgIHsgImRvd24iLCAicm91bmQgdG93YXJkcyAtaW5mdHkiLCBPRkZTRVQocm91bmRpbmcpLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUk9VTkRfRE9XTiAgICAgfSwgMCwgNSwgVnxGLCAicm91bmQiIH0sCi0gICAgeyAidXAiLCAgICJyb3VuZCB0b3dhcmRzICtpbmZ0eSIsIE9GRlNFVChyb3VuZGluZyksIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ST1VORF9VUCAgICAgICB9LCAwLCA1LCBWfEYsICJyb3VuZCIgfSwKLSAgICB7ICJuZWFyIiwgInJvdW5kIHRvIG5lYXJlc3QiLCAgICAgT0ZGU0VUKHJvdW5kaW5nKSwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX1JPVU5EX05FQVJfSU5GIH0sIDAsIDUsIFZ8RiwgInJvdW5kIiB9LAorICAgICAgICB7ICJ6ZXJvIiwgInJvdW5kIHRvd2FyZHMgMCIsICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUk9VTkRfWkVSTyAgICAgfSwgMCwgMCwgVnxGLCAicm91bmQiIH0sCisgICAgICAgIHsgImluZiIsICAicm91bmQgYXdheSBmcm9tIDAiLCAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ST1VORF9JTkYgICAgICB9LCAwLCAwLCBWfEYsICJyb3VuZCIgfSwKKyAgICAgICAgeyAiZG93biIsICJyb3VuZCB0b3dhcmRzIC1pbmZ0eSIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX1JPVU5EX0RPV04gICAgIH0sIDAsIDAsIFZ8RiwgInJvdW5kIiB9LAorICAgICAgICB7ICJ1cCIsICAgInJvdW5kIHRvd2FyZHMgK2luZnR5IiwgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfUk9VTkRfVVAgICAgICAgfSwgMCwgMCwgVnxGLCAicm91bmQiIH0sCisgICAgICAgIHsgIm5lYXIiLCAicm91bmQgdG8gbmVhcmVzdCIsICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9ST1VORF9ORUFSX0lORiB9LCAwLCAwLCBWfEYsICJyb3VuZCIgfSwKKyAgICB7ICJlb2ZfYWN0aW9uIiwgImFjdGlvbiBwZXJmb3JtZWQgZm9yIGxhc3QgZnJhbWUiLCBPRkZTRVQoZW9mX2FjdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gRU9GX0FDVElPTl9ST1VORCB9LCAwLCBFT0ZfQUNUSU9OX05CLTEsIFZ8RiwgImVvZl9hY3Rpb24iIH0sCisgICAgICAgIHsgInJvdW5kIiwgInJvdW5kIHNpbWlsYXIgdG8gb3RoZXIgZnJhbWVzIiwgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBFT0ZfQUNUSU9OX1JPVU5EIH0sIDAsIDAsIFZ8RiwgImVvZl9hY3Rpb24iIH0sCisgICAgICAgIHsgInBhc3MiLCAgInBhc3MgdGhyb3VnaCBsYXN0IGZyYW1lIiwgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBFT0ZfQUNUSU9OX1BBU1MgIH0sIDAsIDAsIFZ8RiwgImVvZl9hY3Rpb24iIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTc5LDE5NiArOTYsMjM4IEBACiB7CiAgICAgRlBTQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKIAotICAgIGlmICghKHMtPmZpZm8gPSBhdl9maWZvX2FsbG9jX2FycmF5KDIsIHNpemVvZihBVkZyYW1lKikpKSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIHMtPmZpcnN0X3B0cyAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgIHMtPnN0YXR1c19wdHMgICA9IEFWX05PUFRTX1ZBTFVFOworICAgIHMtPm5leHRfcHRzICAgICA9IEFWX05PUFRTX1ZBTFVFOwogCiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJmcHM9JWQvJWRcbiIsIHMtPmZyYW1lcmF0ZS5udW0sIHMtPmZyYW1lcmF0ZS5kZW4pOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBmbHVzaF9maWZvKEFWRmlmb0J1ZmZlciAqZmlmbykKKy8qIFJlbW92ZSB0aGUgZmlyc3QgZnJhbWUgZnJvbSB0aGUgYnVmZmVyLCByZXR1cm5pbmcgaXQgKi8KK3N0YXRpYyBBVkZyYW1lICpzaGlmdF9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgRlBTQ29udGV4dCAqcykKIHsKLSAgICB3aGlsZSAoYXZfZmlmb19zaXplKGZpZm8pKSB7Ci0gICAgICAgIEFWRnJhbWUgKnRtcDsKLSAgICAgICAgYXZfZmlmb19nZW5lcmljX3JlYWQoZmlmbywgJnRtcCwgc2l6ZW9mKHRtcCksIE5VTEwpOwotICAgICAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOworICAgIEFWRnJhbWUgKmZyYW1lOworCisgICAgLyogTXVzdCBvbmx5IGJlIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSBmcmFtZXMgaW4gdGhlIGJ1ZmZlciAqLworICAgIGF2X2Fzc2VydDEocy0+ZnJhbWVzX2NvdW50ID4gMCk7CisKKyAgICBmcmFtZSA9IHMtPmZyYW1lc1swXTsKKyAgICBzLT5mcmFtZXNbMF0gPSBzLT5mcmFtZXNbMV07CisgICAgcy0+ZnJhbWVzWzFdID0gTlVMTDsKKyAgICBzLT5mcmFtZXNfY291bnQtLTsKKworICAgIC8qIFVwZGF0ZSBzdGF0aXN0aWNzIGNvdW50ZXJzICovCisgICAgcy0+ZnJhbWVzX291dCArPSBzLT5jdXJfZnJhbWVfb3V0OworICAgIGlmIChzLT5jdXJfZnJhbWVfb3V0ID4gMSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJEdXBsaWNhdGVkIGZyYW1lIHdpdGggcHRzICUiUFJJZDY0IiAlZCB0aW1lc1xuIiwKKyAgICAgICAgICAgICAgIGZyYW1lLT5wdHMsIHMtPmN1cl9mcmFtZV9vdXQgLSAxKTsKKyAgICAgICAgcy0+ZHVwICs9IHMtPmN1cl9mcmFtZV9vdXQgLSAxOworICAgIH0gZWxzZSBpZiAocy0+Y3VyX2ZyYW1lX291dCA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkRyb3BwaW5nIGZyYW1lIHdpdGggcHRzICUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgICAgIGZyYW1lLT5wdHMpOworICAgICAgICBzLT5kcm9wKys7CiAgICAgfQorICAgIHMtPmN1cl9mcmFtZV9vdXQgPSAwOworCisgICAgcmV0dXJuIGZyYW1lOwogfQogCiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBGUFNDb250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIGlmIChzLT5maWZvKSB7Ci0gICAgICAgIHMtPmRyb3AgKz0gYXZfZmlmb19zaXplKHMtPmZpZm8pIC8gc2l6ZW9mKEFWRnJhbWUqKTsKLSAgICAgICAgZmx1c2hfZmlmbyhzLT5maWZvKTsKLSAgICAgICAgYXZfZmlmb19mcmVlcCgmcy0+Zmlmbyk7CisKKyAgICBBVkZyYW1lICpmcmFtZTsKKworICAgIHdoaWxlIChzLT5mcmFtZXNfY291bnQgPiAwKSB7CisgICAgICAgIGZyYW1lID0gc2hpZnRfZnJhbWUoY3R4LCBzKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwogICAgIH0KIAogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiJWQgZnJhbWVzIGluLCAlZCBmcmFtZXMgb3V0OyAlZCBmcmFtZXMgZHJvcHBlZCwgIgogICAgICAgICAgICAiJWQgZnJhbWVzIGR1cGxpY2F0ZWQuXG4iLCBzLT5mcmFtZXNfaW4sIHMtPmZyYW1lc19vdXQsIHMtPmRyb3AsIHMtPmR1cCk7CiB9CiAKLXN0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayogbGluaykKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayogb3V0bGluaykKIHsKLSAgICBGUFNDb250ZXh0ICAgKnMgPSBsaW5rLT5zcmMtPnByaXY7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggICAgPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICAgICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBGUFNDb250ZXh0ICAgICAgKnMgICAgICA9IGN0eC0+cHJpdjsKIAotICAgIGxpbmstPnRpbWVfYmFzZSA9IGF2X2ludl9xKHMtPmZyYW1lcmF0ZSk7Ci0gICAgbGluay0+ZnJhbWVfcmF0ZT0gcy0+ZnJhbWVyYXRlOwotICAgIGxpbmstPncgICAgICAgICA9IGxpbmstPnNyYy0+aW5wdXRzWzBdLT53OwotICAgIGxpbmstPmggICAgICAgICA9IGxpbmstPnNyYy0+aW5wdXRzWzBdLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSAgPSBhdl9pbnZfcShzLT5mcmFtZXJhdGUpOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBzLT5mcmFtZXJhdGU7CiAKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKLXsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKLSAgICBGUFNDb250ZXh0ICAgICAgICAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgcmV0OwotCi0gICAgcmV0ID0gZmZfcmVxdWVzdF9mcmFtZShjdHgtPmlucHV0c1swXSk7Ci0KLSAgICAvKiBmbHVzaCB0aGUgZmlmbyAqLwotICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgYXZfZmlmb19zaXplKHMtPmZpZm8pKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBhdl9maWZvX3NpemUocy0+Zmlmbyk7IGkrKykgewotICAgICAgICAgICAgQVZGcmFtZSAqYnVmOwotCi0gICAgICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5maWZvLCAmYnVmLCBzaXplb2YoYnVmKSwgTlVMTCk7Ci0gICAgICAgICAgICBidWYtPnB0cyA9IGF2X3Jlc2NhbGVfcShzLT5maXJzdF9wdHMsIGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UpICsgcy0+ZnJhbWVzX291dDsKLQotICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgYnVmKSkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgICAgIHMtPmZyYW1lc19vdXQrKzsKKyAgICAvKiBDYWxjdWxhdGUgdGhlIGlucHV0IGFuZCBvdXRwdXQgcHRzIG9mZnNldHMgZm9yIHN0YXJ0X3RpbWUgKi8KKyAgICBpZiAocy0+c3RhcnRfdGltZSAhPSBEQkxfTUFYICYmIHMtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgZG91YmxlIGZpcnN0X3B0cyA9IHMtPnN0YXJ0X3RpbWUgKiBBVl9USU1FX0JBU0U7CisgICAgICAgIGlmIChmaXJzdF9wdHMgPCBJTlQ2NF9NSU4gfHwgZmlyc3RfcHRzID4gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTdGFydCB0aW1lICVmIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiBpbnRlcm5hbCB0aW1lIGJhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgcy0+c3RhcnRfdGltZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBzLT5pbl9wdHNfb2ZmICA9IGF2X3Jlc2NhbGVfcV9ybmQoZmlyc3RfcHRzLCBBVl9USU1FX0JBU0VfUSwgaW5saW5rLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yb3VuZGluZyB8IEFWX1JPVU5EX1BBU1NfTUlOTUFYKTsKKyAgICAgICAgcy0+b3V0X3B0c19vZmYgPSBhdl9yZXNjYWxlX3Ffcm5kKGZpcnN0X3B0cywgQVZfVElNRV9CQVNFX1EsIG91dGxpbmstPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJvdW5kaW5nIHwgQVZfUk9VTkRfUEFTU19NSU5NQVgpOworICAgICAgICBzLT5uZXh0X3B0cyA9IHMtPm91dF9wdHNfb2ZmOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlNldCBmaXJzdCBwdHMgdG8gKGluOiUiUFJJZDY0IiBvdXQ6JSJQUklkNjQiKSBmcm9tIHN0YXJ0IHRpbWUgJWZcbiIsCisgICAgICAgICAgICAgICBzLT5pbl9wdHNfb2ZmLCBzLT5vdXRfcHRzX29mZiwgcy0+c3RhcnRfdGltZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3cml0ZV90b19maWZvKEFWRmlmb0J1ZmZlciAqZmlmbywgQVZGcmFtZSAqYnVmKQotewotICAgIGludCByZXQ7Ci0KLSAgICBpZiAoIWF2X2ZpZm9fc3BhY2UoZmlmbykgJiYKLSAgICAgICAgKHJldCA9IGF2X2ZpZm9fcmVhbGxvYzIoZmlmbywgMiphdl9maWZvX3NpemUoZmlmbykpKSkgewotICAgICAgICBhdl9mcmFtZV9mcmVlKCZidWYpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIGF2X2ZpZm9fZ2VuZXJpY193cml0ZShmaWZvLCAmYnVmLCBzaXplb2YoYnVmKSwgTlVMTCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCisvKiBSZWFkIGEgZnJhbWUgZnJvbSB0aGUgaW5wdXQgYW5kIHNhdmUgaXQgaW4gdGhlIGJ1ZmZlciAqLworc3RhdGljIGludCByZWFkX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBGUFNDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKmlubGluaywgQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQogewotICAgIEFWRmlsdGVyQ29udGV4dCAgICAqY3R4ID0gaW5saW5rLT5kc3Q7Ci0gICAgRlBTQ29udGV4dCAgICAgICAgICAgKnMgPSBjdHgtPnByaXY7Ci0gICAgQVZGaWx0ZXJMaW5rICAgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07Ci0gICAgaW50NjRfdCBkZWx0YTsKLSAgICBpbnQgaSwgcmV0OworICAgIEFWRnJhbWUgKmZyYW1lOworICAgIGludCByZXQ7CisgICAgaW50NjRfdCBpbl9wdHM7CiAKKyAgICAvKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gd2UgaGF2ZSBidWZmZXIgcm9vbSBhdmFpbGFibGUgKi8KKyAgICBhdl9hc3NlcnQxKHMtPmZyYW1lc19jb3VudCA8IDIpOworCisgICAgcmV0ID0gZmZfaW5saW5rX2NvbnN1bWVfZnJhbWUoaW5saW5rLCAmZnJhbWUpOworICAgIC8qIENhbGxlciBtdXN0IGhhdmUgcnVuIGZmX2lubGlua19jaGVja19hdmFpbGFibGVfZnJhbWUgZmlyc3QgKi8KKyAgICBhdl9hc3NlcnQxKHJldCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBDb252ZXJ0IGZyYW1lIHB0cyB0byBvdXRwdXQgdGltZWJhc2UuCisgICAgICogVGhlIGRhbmNlIHdpdGggb2Zmc2V0cyBpcyByZXF1aXJlZCB0byBtYXRjaCB0aGUgcm91bmRpbmcgYmVoYXZpb3VyIG9mIHRoZQorICAgICAqIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIGZwcyBmaWx0ZXIgd2hlbiB1c2luZyB0aGUgc3RhcnRfdGltZSBvcHRpb24uICovCisgICAgaW5fcHRzID0gZnJhbWUtPnB0czsKKyAgICBmcmFtZS0+cHRzID0gcy0+b3V0X3B0c19vZmYgKyBhdl9yZXNjYWxlX3Ffcm5kKGluX3B0cyAtIHMtPmluX3B0c19vZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnRpbWVfYmFzZSwgb3V0bGluay0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cm91bmRpbmcgfCBBVl9ST1VORF9QQVNTX01JTk1BWCk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJSZWFkIGZyYW1lIHdpdGggaW4gcHRzICUiUFJJZDY0Iiwgb3V0IHB0cyAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgIGluX3B0cywgZnJhbWUtPnB0cyk7CisKKyAgICBzLT5mcmFtZXNbcy0+ZnJhbWVzX2NvdW50KytdID0gZnJhbWU7CiAgICAgcy0+ZnJhbWVzX2luKys7Ci0gICAgLyogZGlzY2FyZCBmcmFtZXMgdW50aWwgd2UgZ2V0IHRoZSBmaXJzdCB0aW1lc3RhbXAgKi8KLSAgICBpZiAocy0+Zmlyc3RfcHRzID09IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgIGlmIChidWYtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICAgICAgcmV0ID0gd3JpdGVfdG9fZmlmbyhzLT5maWZvLCBidWYpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICAgICAgaWYgKHMtPnN0YXJ0X3RpbWUgIT0gREJMX01BWCAmJiBzLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgZG91YmxlIGZpcnN0X3B0cyA9IHMtPnN0YXJ0X3RpbWUgKiBBVl9USU1FX0JBU0U7Ci0gICAgICAgICAgICAgICAgZmlyc3RfcHRzID0gRkZNSU4oRkZNQVgoZmlyc3RfcHRzLCBJTlQ2NF9NSU4pLCBJTlQ2NF9NQVgpOwotICAgICAgICAgICAgICAgIHMtPmZpcnN0X3B0cyA9IGF2X3Jlc2NhbGVfcShmaXJzdF9wdHMsIEFWX1RJTUVfQkFTRV9RLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnRpbWVfYmFzZSk7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJTZXQgZmlyc3QgcHRzIHRvIChpbjolIlBSSWQ2NCIgb3V0OiUiUFJJZDY0IilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHMtPmZpcnN0X3B0cywgYXZfcmVzY2FsZV9xKGZpcnN0X3B0cywgQVZfVElNRV9CQVNFX1EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzLT5maXJzdF9wdHMgPSBidWYtPnB0czsKLSAgICAgICAgICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworLyogV3JpdGUgYSBmcmFtZSB0byB0aGUgb3V0cHV0ICovCitzdGF0aWMgaW50IHdyaXRlX2ZyYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBGUFNDb250ZXh0ICpzLCBBVkZpbHRlckxpbmsgKm91dGxpbmssIGludCAqYWdhaW4pCit7CisgICAgQVZGcmFtZSAqZnJhbWU7CisKKyAgICBhdl9hc3NlcnQxKHMtPmZyYW1lc19jb3VudCA9PSAyIHx8IChzLT5zdGF0dXMgJiYgcy0+ZnJhbWVzX2NvdW50ID09IDEpKTsKKworICAgIC8qIFdlIGhhdmVuJ3QgeWV0IGRldGVybWluZWQgdGhlIHB0cyBvZiB0aGUgZmlyc3QgZnJhbWUgKi8KKyAgICBpZiAocy0+bmV4dF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaWYgKHMtPmZyYW1lc1swXS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBzLT5uZXh0X3B0cyA9IHMtPmZyYW1lc1swXS0+cHRzOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJTZXQgZmlyc3QgcHRzIHRvICUiUFJJZDY0IlxuIiwgcy0+bmV4dF9wdHMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJEaXNjYXJkaW5nIGluaXRpYWwgZnJhbWUocykgd2l0aCBubyAiCiAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcC5cbiIpOwotICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmYnVmKTsKLSAgICAgICAgICAgIHMtPmRyb3ArKzsKKyAgICAgICAgICAgIGZyYW1lID0gc2hpZnRfZnJhbWUoY3R4LCBzKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmZyYW1lKTsKKyAgICAgICAgICAgICphZ2FpbiA9IDE7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoZXJlIGFyZSB0d28gY29uZGl0aW9ucyB3aGVyZSB3ZSB3YW50IHRvIGRyb3AgYSBmcmFtZToKKyAgICAgKiAtIElmIHdlIGhhdmUgdHdvIGJ1ZmZlcmVkIGZyYW1lcyBhbmQgdGhlIHNlY29uZCBmcmFtZSBpcyBhY2NlcHRhYmxlCisgICAgICogICBhcyB0aGUgbmV4dCBvdXRwdXQgZnJhbWUsIHRoZW4gZHJvcCB0aGUgZmlyc3QgYnVmZmVyZWQgZnJhbWUuCisgICAgICogLSBJZiB3ZSBoYXZlIHN0YXR1cyAoRU9GKSBzZXQsIGRyb3AgZnJhbWVzIHdoZW4gd2UgaGl0IHRoZQorICAgICAqICAgc3RhdHVzIHRpbWVzdGFtcC4gKi8KKyAgICBpZiAoKHMtPmZyYW1lc19jb3VudCA9PSAyICYmIHMtPmZyYW1lc1sxXS0+cHRzIDw9IHMtPm5leHRfcHRzKSB8fAorICAgICAgICAocy0+c3RhdHVzICAgICAgICAgICAgJiYgcy0+c3RhdHVzX3B0cyAgICAgPD0gcy0+bmV4dF9wdHMpKSB7CisKKyAgICAgICAgZnJhbWUgPSBzaGlmdF9mcmFtZShjdHgsIHMpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgICAgICphZ2FpbiA9IDE7CiAgICAgICAgIHJldHVybiAwOworCisgICAgLyogT3V0cHV0IGEgY29weSBvZiB0aGUgZmlyc3QgYnVmZmVyZWQgZnJhbWUgKi8KKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZSA9IGF2X2ZyYW1lX2Nsb25lKHMtPmZyYW1lc1swXSk7CisgICAgICAgIGlmICghZnJhbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmcmFtZS0+cHRzID0gcy0+bmV4dF9wdHMrKzsKKworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJXcml0aW5nIGZyYW1lIHdpdGggcHRzICUiUFJJZDY0IiB0byBwdHMgJSJQUklkNjQiXG4iLAorICAgICAgICAgICAgICAgcy0+ZnJhbWVzWzBdLT5wdHMsIGZyYW1lLT5wdHMpOworICAgICAgICBzLT5jdXJfZnJhbWVfb3V0Kys7CisKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CisgICAgfQorfQorCisvKiBDb252ZXJ0IHN0YXR1c19wdHMgdG8gb3V0bGluayB0aW1lYmFzZSAqLworc3RhdGljIHZvaWQgdXBkYXRlX2VvZl9wdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEZQU0NvbnRleHQgKnMsIEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZpbHRlckxpbmsgKm91dGxpbmssIGludDY0X3Qgc3RhdHVzX3B0cykKK3sKKyAgICBpbnQgZW9mX3JvdW5kaW5nID0gKHMtPmVvZl9hY3Rpb24gPT0gRU9GX0FDVElPTl9QQVNTKSA/IEFWX1JPVU5EX1VQIDogcy0+cm91bmRpbmc7CisgICAgcy0+c3RhdHVzX3B0cyA9IGF2X3Jlc2NhbGVfcV9ybmQoc3RhdHVzX3B0cywgaW5saW5rLT50aW1lX2Jhc2UsIG91dGxpbmstPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2Zfcm91bmRpbmcgfCBBVl9ST1VORF9QQVNTX01JTk1BWCk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJFT0YgaXMgYXQgcHRzICUiUFJJZDY0IlxuIiwgcy0+c3RhdHVzX3B0cyk7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgRlBTQ29udGV4dCAgICpzICAgICAgID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rICA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgIGludCByZXQ7CisgICAgaW50IGFnYWluID0gMDsKKyAgICBpbnQ2NF90IHN0YXR1c19wdHM7CisKKyAgICBGRl9GSUxURVJfRk9SV0FSRF9TVEFUVVNfQkFDSyhvdXRsaW5rLCBpbmxpbmspOworCisgICAgLyogTm8gYnVmZmVyZWQgc3RhdHVzOiBub3JtYWwgb3BlcmF0aW9uICovCisgICAgaWYgKCFzLT5zdGF0dXMpIHsKKworICAgICAgICAvKiBSZWFkIGF2YWlsYWJsZSBpbnB1dCBmcmFtZXMgaWYgd2UgaGF2ZSByb29tICovCisgICAgICAgIHdoaWxlIChzLT5mcmFtZXNfY291bnQgPCAyICYmIGZmX2lubGlua19jaGVja19hdmFpbGFibGVfZnJhbWUoaW5saW5rKSkgeworICAgICAgICAgICAgcmV0ID0gcmVhZF9mcmFtZShjdHgsIHMsIGlubGluaywgb3V0bGluayk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLyogV2UgZG8gbm90IHlldCBoYXZlIGVub3VnaCBmcmFtZXMgdG8gcHJvZHVjZSBvdXRwdXQgKi8KKyAgICAgICAgaWYgKHMtPmZyYW1lc19jb3VudCA8IDIpIHsKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHdlJ3ZlIGhpdCBFT0YgKG9yIG90aGVyd2lzZSB0aGF0IGFuIGVycm9yIHN0YXR1cyBpcyBzZXQpICovCisgICAgICAgICAgICByZXQgPSBmZl9pbmxpbmtfYWNrbm93bGVkZ2Vfc3RhdHVzKGlubGluaywgJnMtPnN0YXR1cywgJnN0YXR1c19wdHMpOworICAgICAgICAgICAgaWYgKHJldCA+IDApCisgICAgICAgICAgICAgICAgdXBkYXRlX2VvZl9wdHMoY3R4LCBzLCBpbmxpbmssIG91dGxpbmssIHN0YXR1c19wdHMpOworCisgICAgICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgICAgIC8qIElmIHNvbWVvbmUgd2FudHMgdXMgdG8gb3V0cHV0LCB3ZSdkIGJldHRlciBhc2sgZm9yIG1vcmUgaW5wdXQgKi8KKyAgICAgICAgICAgICAgICBGRl9GSUxURVJfRk9SV0FSRF9XQU5URUQob3V0bGluaywgaW5saW5rKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAotICAgIC8qIG5vdyB3YWl0IGZvciB0aGUgbmV4dCB0aW1lc3RhbXAgKi8KLSAgICBpZiAoYnVmLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgYXZfZmlmb19zaXplKHMtPmZpZm8pIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIHdyaXRlX3RvX2ZpZm8ocy0+ZmlmbywgYnVmKTsKLSAgICB9Ci0KLSAgICAvKiBudW1iZXIgb2Ygb3V0cHV0IGZyYW1lcyAqLwotICAgIGRlbHRhID0gYXZfcmVzY2FsZV9xX3JuZChidWYtPnB0cyAtIHMtPmZpcnN0X3B0cywgaW5saW5rLT50aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSwgcy0+cm91bmRpbmcpIC0gcy0+ZnJhbWVzX291dCA7Ci0KLSAgICBpZiAoZGVsdGEgPCAxKSB7Ci0gICAgICAgIC8qIGRyb3AgZXZlcnl0aGluZyBidWZmZXJlZCBleGNlcHQgdGhlIGxhc3QgKi8KLSAgICAgICAgaW50IGRyb3AgPSBhdl9maWZvX3NpemUocy0+Zmlmbykvc2l6ZW9mKEFWRnJhbWUqKTsKLQotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJEcm9wcGluZyAlZCBmcmFtZShzKS5cbiIsIGRyb3ApOwotICAgICAgICBzLT5kcm9wICs9IGRyb3A7Ci0KLSAgICAgICAgZmx1c2hfZmlmbyhzLT5maWZvKTsKLSAgICAgICAgcmV0ID0gd3JpdGVfdG9fZmlmbyhzLT5maWZvLCBidWYpOwotCisgICAgLyogQnVmZmVyZWQgZnJhbWVzIGFyZSBhdmFpbGFibGUsIHNvIGdlbmVyYXRlIGFuIG91dHB1dCBmcmFtZSAqLworICAgIGlmIChzLT5mcmFtZXNfY291bnQgPiAwKSB7CisgICAgICAgIHJldCA9IHdyaXRlX2ZyYW1lKGN0eCwgcywgb3V0bGluaywgJmFnYWluKTsKKyAgICAgICAgLyogQ291bGRuJ3QgZ2VuZXJhdGUgYSBmcmFtZSwgc28gc2NoZWR1bGUgdXMgdG8gcGVyZm9ybSBhbm90aGVyIHN0ZXAgKi8KKyAgICAgICAgaWYgKGFnYWluKQorICAgICAgICAgICAgZmZfZmlsdGVyX3NldF9yZWFkeShjdHgsIDEwMCk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgLyogY2FuIG91dHB1dCA+PSAxIGZyYW1lcyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7Ci0gICAgICAgIEFWRnJhbWUgKmJ1Zl9vdXQ7Ci0gICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHMtPmZpZm8sICZidWZfb3V0LCBzaXplb2YoYnVmX291dCksIE5VTEwpOwotCi0gICAgICAgIC8qIGR1cGxpY2F0ZSB0aGUgZnJhbWUgaWYgbmVlZGVkICovCi0gICAgICAgIGlmICghYXZfZmlmb19zaXplKHMtPmZpZm8pICYmIGkgPCBkZWx0YSAtIDEpIHsKLSAgICAgICAgICAgIEFWRnJhbWUgKmR1cCA9IGF2X2ZyYW1lX2Nsb25lKGJ1Zl9vdXQpOwotCi0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJEdXBsaWNhdGluZyBmcmFtZS5cbiIpOwotICAgICAgICAgICAgaWYgKGR1cCkKLSAgICAgICAgICAgICAgICByZXQgPSB3cml0ZV90b19maWZvKHMtPmZpZm8sIGR1cCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zl9vdXQpOwotICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcy0+ZHVwKys7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZfb3V0LT5wdHMgPSBhdl9yZXNjYWxlX3Eocy0+Zmlyc3RfcHRzLCBpbmxpbmstPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSkgKyBzLT5mcmFtZXNfb3V0OwotCi0gICAgICAgIGlmICgocmV0ID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGJ1Zl9vdXQpKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmJ1Zik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgcy0+ZnJhbWVzX291dCsrOworICAgIC8qIE5vIGZyYW1lcyBsZWZ0LCBzbyBmb3J3YXJkIHRoZSBzdGF0dXMgKi8KKyAgICBpZiAocy0+c3RhdHVzICYmIHMtPmZyYW1lc19jb3VudCA9PSAwKSB7CisgICAgICAgIGZmX291dGxpbmtfc2V0X3N0YXR1cyhvdXRsaW5rLCBzLT5zdGF0dXMsIHMtPm5leHRfcHRzKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGZsdXNoX2ZpZm8ocy0+Zmlmbyk7CiAKLSAgICByZXQgPSB3cml0ZV90b19maWZvKHMtPmZpZm8sIGJ1Zik7Ci0KLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBGRkVSUk9SX05PVF9SRUFEWTsKIH0KIAogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX2Zwc19pbnB1dHNbXSA9IHsKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTI3Nyw4ICszMzYsNyBAQAogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCi0gICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX3Byb3BzLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0yOTAsNiArMzQ4LDcgQEAKICAgICAudW5pbml0ICAgICAgPSB1bmluaXQsCiAgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKEZQU0NvbnRleHQpLAogICAgIC5wcml2X2NsYXNzICA9ICZmcHNfY2xhc3MsCisgICAgLmFjdGl2YXRlICAgID0gYWN0aXZhdGUsCiAgICAgLmlucHV0cyAgICAgID0gYXZmaWx0ZXJfdmZfZnBzX2lucHV0cywKICAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl92Zl9mcHNfb3V0cHV0cywKIH07CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9mcmFtZXBhY2suYyBiL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lcGFjay5jCmluZGV4IGE1Y2Q5NTQuLjEyYTI5OTYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lcGFjay5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lcGFjay5jCkBAIC0zMjQsNiArMzI0LDggQEAKICAgICAgICAgICAgIGlmICghc3RlcmVvKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBzdGVyZW8tPnR5cGUgPSBzLT5mb3JtYXQ7CisgICAgICAgICAgICBzdGVyZW8tPnZpZXcgPSBpID09IExFRlQgPyBBVl9TVEVSRU8zRF9WSUVXX0xFRlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX1NURVJFTzNEX1ZJRVdfUklHSFQ7CiAKICAgICAgICAgICAgIC8vIGZpbHRlciB0aGUgZnJhbWUgYW5kIGltbWVkaWF0ZWx5IHJlbGlucXVpc2ggaXRzIHBvaW50ZXIKICAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBzLT5pbnB1dF92aWV3c1tpXSk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9mcmFtZXJhdGUuYyBiL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lcmF0ZS5jCmluZGV4IDIzN2E0ODcuLjNlMjYxNWIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lcmF0ZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lcmF0ZS5jCkBAIC0zOCw0NyArMzgsNyBAQAogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2aWRlby5oIgotCi0jZGVmaW5lIE5fU1JDRSAzCi0KLXR5cGVkZWYgc3RydWN0IEZyYW1lUmF0ZUNvbnRleHQgewotICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwotICAgIC8vIHBhcmFtZXRlcnMKLSAgICBBVlJhdGlvbmFsIGRlc3RfZnJhbWVfcmF0ZTsgICAgICAgICAvLy88IG91dHB1dCBmcmFtZXMgcGVyIHNlY29uZAotICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgZmxhZ3MgYWZmZWN0aW5nIGZyYW1lIHJhdGUgY29udmVyc2lvbiBhbGdvcml0aG0KLSAgICBkb3VibGUgc2NlbmVfc2NvcmU7ICAgICAgICAgICAgICAgICAvLy88IHNjb3JlIHRoYXQgZGVub3RlcyBhIHNjZW5lIGNoYW5nZSBoYXMgaGFwcGVuZWQKLSAgICBpbnQgaW50ZXJwX3N0YXJ0OyAgICAgICAgICAgICAgICAgICAvLy88IHN0YXJ0IG9mIHJhbmdlIHRvIGFwcGx5IGxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgaW50IGludGVycF9lbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBlbmQgb2YgcmFuZ2UgdG8gYXBwbHkgbGluZWFyIGludGVycG9sYXRpb24KLQotICAgIGludCBsaW5lX3NpemVbNF07ICAgICAgICAgICAgICAgICAgIC8vLzwgYnl0ZXMgb2YgcGl4ZWwgZGF0YSBwZXIgbGluZSBmb3IgZWFjaCBwbGFuZQotICAgIGludCB2c3ViOwotCi0gICAgaW50IGZyc3QsIG5leHQsIHByZXYsIGNybnQsIGxhc3Q7Ci0gICAgaW50IHBlbmRpbmdfc3JjZV9mcmFtZXM7ICAgICAgICAgICAgLy8vPCBob3cgbWFueSBpbnB1dCBmcmFtZXMgYXJlIHN0aWxsIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkCi0gICAgaW50IGZsdXNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhcmUgd2UgZmx1c2hpbmcgZmluYWwgZnJhbWVzCi0gICAgaW50IHBlbmRpbmdfZW5kX2ZyYW1lOyAgICAgICAgICAgICAgLy8vPCBmbGFnIGluZGljYXRpbmcgd2UgYXJlIHdhaXRpbmcgdG8gY2FsbCBmaWx0ZXJfZnJhbWUoKQotCi0gICAgQVZSYXRpb25hbCBzcmNlX3RpbWVfYmFzZTsgICAgICAgICAgLy8vPCB0aW1lYmFzZSBvZiBzb3VyY2UKLQotICAgIEFWUmF0aW9uYWwgZGVzdF90aW1lX2Jhc2U7ICAgICAgICAgIC8vLzwgdGltZWJhc2Ugb2YgZGVzdGluYXRpb24KLSAgICBpbnQzMl90IGRlc3RfZnJhbWVfbnVtOwotICAgIGludDY0X3QgbGFzdF9kZXN0X2ZyYW1lX3B0czsgICAgICAgIC8vLzwgcHRzIG9mIHRoZSBsYXN0IGZyYW1lIG91dHB1dAotICAgIGludDY0X3QgYXZlcmFnZV9zcmNlX3B0c19kZXN0X2RlbHRhOy8vLzwgYXZlcmFnZSBpbnB1dCBwdHMgZGVsdGEgY29udmVydGVkIGZyb20gaW5wdXQgcmF0ZSB0byBvdXRwdXQgcmF0ZQotICAgIGludDY0X3QgYXZlcmFnZV9kZXN0X3B0c19kZWx0YTsgICAgIC8vLzwgY2FsY3VsYXRlZCBhdmVyYWdlIG91dHB1dCBwdHMgZGVsdGEKLQotICAgIGF2X3BpeGVsdXRpbHNfc2FkX2ZuIHNhZDsgICAgICAgICAgIC8vLzwgU3VtIG9mIHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGZ1bmN0aW9uIChzY2VuZSBkZXRlY3Qgb25seSkKLSAgICBkb3VibGUgcHJldl9tYWZkOyAgICAgICAgICAgICAgICAgICAvLy88IHByZXZpb3VzIE1BRkQgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2NlbmUgZGV0ZWN0IG9ubHkpCi0KLSAgICBBVkZyYW1lICpzcmNlW05fU1JDRV07ICAgICAgICAgICAgICAvLy88IGJ1ZmZlcmVkIHNvdXJjZSBmcmFtZXMKLSAgICBpbnQ2NF90IHNyY2VfcHRzX2Rlc3RbTl9TUkNFXTsgICAgICAvLy88IHB0cyBmb3Igc291cmNlIGZyYW1lcyBzY2FsZWQgdG8gb3V0cHV0IHRpbWViYXNlCi0gICAgaW50NjRfdCBwdHM7ICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBwdHMgb2YgZnJhbWUgd2UgYXJlIHdvcmtpbmcgb24KLQotICAgIGludCAoKmJsZW5kX2ZyYW1lcykoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGZsb2F0IGludGVycG9sYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqY29weV9zcmMxLCBBVkZyYW1lICpjb3B5X3NyYzIpOwotICAgIGludCBtYXg7Ci0gICAgaW50IGJpdGRlcHRoOwotICAgIEFWRnJhbWUgKndvcms7Ci19IEZyYW1lUmF0ZUNvbnRleHQ7CisjaW5jbHVkZSAiZnJhbWVyYXRlLmgiCiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZyYW1lUmF0ZUNvbnRleHQsIHgpCiAjZGVmaW5lIFYgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KQEAgLTkwLDcgKzUwLDcgQEAKIAogICAgIHsiaW50ZXJwX3N0YXJ0IiwgICAgICAgICJwb2ludCB0byBzdGFydCBsaW5lYXIgaW50ZXJwb2xhdGlvbiIsICAgIE9GRlNFVChpbnRlcnBfc3RhcnQpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgey5pNjQ9MTV9LCAgICAgICAgICAgICAgICAgMCwgICAgICAgMjU1LCAgICAgVnxGIH0sCiAgICAgeyJpbnRlcnBfZW5kIiwgICAgICAgICAgInBvaW50IHRvIGVuZCBsaW5lYXIgaW50ZXJwb2xhdGlvbiIsICAgICAgT0ZGU0VUKGludGVycF9lbmQpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2ND0yNDB9LCAgICAgICAgICAgICAgICAwLCAgICAgICAyNTUsICAgICBWfEYgfSwKLSAgICB7InNjZW5lIiwgICAgICAgICAgICAgICAic2NlbmUgY2hhbmdlIGxldmVsIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc2NlbmVfc2NvcmUpLCAgICAgQVZfT1BUX1RZUEVfRE9VQkxFLCAgIHsuZGJsPTcuMH0sICAgICAgICAgICAgICAgIDAsICAgICAgIElOVF9NQVgsIFZ8RiB9LAorICAgIHsic2NlbmUiLCAgICAgICAgICAgICAgICJzY2VuZSBjaGFuZ2UgbGV2ZWwiLCAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChzY2VuZV9zY29yZSksICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICAgey5kYmw9OC4yfSwgICAgICAgICAgICAgICAgMCwgICAgICAgSU5UX01BWCwgVnxGIH0sCiAKICAgICB7ImZsYWdzIiwgICAgICAgICAgICAgICAic2V0IGZsYWdzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZmxhZ3MpLCAgICAgICAgICAgQVZfT1BUX1RZUEVfRkxBR1MsICAgIHsuaTY0PTF9LCAgICAgICAgICAgICAgICAgIDAsICAgICAgIElOVF9NQVgsIFZ8RiwgImZsYWdzIiB9LAogICAgIHsic2NlbmVfY2hhbmdlX2RldGVjdCIsICJlbmFibGUgc2NlbmUgY2hhbmdlIGRldGVjdGlvbiIsICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICAgey5pNjQ9RlJBTUVSQVRFX0ZMQUdfU0NEfSwgSU5UX01JTiwgSU5UX01BWCwgVnxGLCAiZmxhZ3MiIH0sCkBAIC0xMDEsMjUgKzYxLDYgQEAKIAogQVZGSUxURVJfREVGSU5FX0NMQVNTKGZyYW1lcmF0ZSk7CiAKLXN0YXRpYyB2b2lkIG5leHRfc291cmNlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQotewotICAgIEZyYW1lUmF0ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgaW50IGk7Ci0KLSAgICBmZl9kbG9nKGN0eCwgICJuZXh0X3NvdXJjZSgpXG4iKTsKLQotICAgIGlmIChzLT5zcmNlW3MtPmxhc3RdICYmIHMtPnNyY2Vbcy0+bGFzdF0gIT0gcy0+c3JjZVtzLT5sYXN0LTFdKSB7Ci0gICAgICAgIGZmX2Rsb2coY3R4LCAibmV4dF9zb3VyY2UoKSB1bmxpbmsgJWRcbiIsIHMtPmxhc3QpOwotICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5zcmNlW3MtPmxhc3RdKTsKLSAgICB9Ci0gICAgZm9yIChpID0gcy0+bGFzdDsgaSA+IHMtPmZyc3Q7IGktLSkgewotICAgICAgICBmZl9kbG9nKGN0eCwgIm5leHRfc291cmNlKCkgY29weSAlZCB0byAlZFxuIiwgaSAtIDEsIGkpOwotICAgICAgICBzLT5zcmNlW2ldID0gcy0+c3JjZVtpIC0gMV07Ci0gICAgfQotICAgIGZmX2Rsb2coY3R4LCAibmV4dF9zb3VyY2UoKSBtYWtlICVkIG51bGxcbiIsIHMtPmZyc3QpOwotICAgIHMtPnNyY2Vbcy0+ZnJzdF0gPSBOVUxMOwotfQotCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQ2NF90IHNhZF84eDhfMTYoY29uc3QgdWludDE2X3QgKnNyYzEsIHB0cmRpZmZfdCBzdHJpZGUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMyLCBwdHJkaWZmX3Qgc3RyaWRlMikKIHsKQEAgLTEzNSw0MSArNzYsMzUgQEAKICAgICByZXR1cm4gc3VtOwogfQogCi1zdGF0aWMgZG91YmxlIGdldF9zY2VuZV9zY29yZTE2KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpjcm50LCBBVkZyYW1lICpuZXh0KQorc3RhdGljIGludDY0X3Qgc2NlbmVfc2FkMTYoRnJhbWVSYXRlQ29udGV4dCAqcywgY29uc3QgdWludDE2X3QgKnAxLCBpbnQgcDFfbGluZXNpemUsIGNvbnN0IHVpbnQxNl90KiBwMiwgaW50IHAyX2xpbmVzaXplLCBjb25zdCBpbnQgd2lkdGgsIGNvbnN0IGludCBoZWlnaHQpCiB7Ci0gICAgRnJhbWVSYXRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBkb3VibGUgcmV0ID0gMDsKLQotICAgIGZmX2Rsb2coY3R4LCAiZ2V0X3NjZW5lX3Njb3JlMTYoKVxuIik7Ci0KLSAgICBpZiAoY3JudCAmJgotICAgICAgICBjcm50LT5oZWlnaHQgPT0gbmV4dC0+aGVpZ2h0ICYmCi0gICAgICAgIGNybnQtPndpZHRoICA9PSBuZXh0LT53aWR0aCkgewotICAgICAgICBpbnQgeCwgeTsKLSAgICAgICAgaW50NjRfdCBzYWQ7Ci0gICAgICAgIGRvdWJsZSBtYWZkLCBkaWZmOwotICAgICAgICBjb25zdCB1aW50MTZfdCAqcDEgPSAoY29uc3QgdWludDE2X3QgKiljcm50LT5kYXRhWzBdOwotICAgICAgICBjb25zdCB1aW50MTZfdCAqcDIgPSAoY29uc3QgdWludDE2X3QgKiluZXh0LT5kYXRhWzBdOwotICAgICAgICBjb25zdCBpbnQgcDFfbGluZXNpemUgPSBjcm50LT5saW5lc2l6ZVswXSAvIDI7Ci0gICAgICAgIGNvbnN0IGludCBwMl9saW5lc2l6ZSA9IG5leHQtPmxpbmVzaXplWzBdIC8gMjsKLQotICAgICAgICBmZl9kbG9nKGN0eCwgImdldF9zY2VuZV9zY29yZTE2KCkgcHJvY2Vzc1xuIik7Ci0KLSAgICAgICAgZm9yIChzYWQgPSB5ID0gMDsgeSA8IGNybnQtPmhlaWdodDsgeSArPSA4KSB7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcDFfbGluZXNpemU7IHggKz0gOCkgewotICAgICAgICAgICAgICAgIHNhZCArPSBzYWRfOHg4XzE2KHAxICsgeSAqIHAxX2xpbmVzaXplICsgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMV9saW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMiArIHkgKiBwMl9saW5lc2l6ZSArIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDJfbGluZXNpemUpOwotICAgICAgICAgICAgfQorICAgIGludDY0X3Qgc2FkOworICAgIGludCB4LCB5OworICAgIGZvciAoc2FkID0geSA9IDA7IHkgPCBoZWlnaHQgLSA3OyB5ICs9IDgpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoIC0gNzsgeCArPSA4KSB7CisgICAgICAgICAgICBzYWQgKz0gc2FkXzh4OF8xNihwMSArIHkgKiBwMV9saW5lc2l6ZSArIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMV9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyICsgeSAqIHAyX2xpbmVzaXplICsgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyX2xpbmVzaXplKTsKICAgICAgICAgfQotICAgICAgICBtYWZkID0gc2FkIC8gKGNybnQtPmhlaWdodCAqIGNybnQtPndpZHRoICogMyk7Ci0gICAgICAgIGRpZmYgPSBmYWJzKG1hZmQgLSBzLT5wcmV2X21hZmQpOwotICAgICAgICByZXQgID0gYXZfY2xpcGYoRkZNSU4obWFmZCwgZGlmZiksIDAsIDEwMC4wKTsKLSAgICAgICAgcy0+cHJldl9tYWZkID0gbWFmZDsKICAgICB9Ci0gICAgZmZfZGxvZyhjdHgsICJnZXRfc2NlbmVfc2NvcmUxNigpIHJlc3VsdCBpczolZlxuIiwgcmV0KTsKLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBzYWQ7Cit9CisKK3N0YXRpYyBpbnQ2NF90IHNjZW5lX3NhZDgoRnJhbWVSYXRlQ29udGV4dCAqcywgdWludDhfdCAqcDEsIGludCBwMV9saW5lc2l6ZSwgdWludDhfdCogcDIsIGludCBwMl9saW5lc2l6ZSwgY29uc3QgaW50IHdpZHRoLCBjb25zdCBpbnQgaGVpZ2h0KQoreworICAgIGludDY0X3Qgc2FkOworICAgIGludCB4LCB5OworICAgIGZvciAoc2FkID0geSA9IDA7IHkgPCBoZWlnaHQgLSA3OyB5ICs9IDgpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoIC0gNzsgeCArPSA4KSB7CisgICAgICAgICAgICBzYWQgKz0gcy0+c2FkKHAxICsgeSAqIHAxX2xpbmVzaXplICsgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcDFfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHAyICsgeSAqIHAyX2xpbmVzaXplICsgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcDJfbGluZXNpemUpOworICAgICAgICB9CisgICAgfQorICAgIGVtbXNfYygpOworICAgIHJldHVybiBzYWQ7CiB9CiAKIHN0YXRpYyBkb3VibGUgZ2V0X3NjZW5lX3Njb3JlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpjcm50LCBBVkZyYW1lICpuZXh0KQpAQCAtMTc5LDM1OCArMTE0LDE1OSBAQAogCiAgICAgZmZfZGxvZyhjdHgsICJnZXRfc2NlbmVfc2NvcmUoKVxuIik7CiAKLSAgICBpZiAoY3JudCAmJgotICAgICAgICBjcm50LT5oZWlnaHQgPT0gbmV4dC0+aGVpZ2h0ICYmCisgICAgaWYgKGNybnQtPmhlaWdodCA9PSBuZXh0LT5oZWlnaHQgJiYKICAgICAgICAgY3JudC0+d2lkdGggID09IG5leHQtPndpZHRoKSB7Ci0gICAgICAgIGludCB4LCB5OwogICAgICAgICBpbnQ2NF90IHNhZDsKICAgICAgICAgZG91YmxlIG1hZmQsIGRpZmY7Ci0gICAgICAgIHVpbnQ4X3QgKnAxID0gY3JudC0+ZGF0YVswXTsKLSAgICAgICAgdWludDhfdCAqcDIgPSBuZXh0LT5kYXRhWzBdOwotICAgICAgICBjb25zdCBpbnQgcDFfbGluZXNpemUgPSBjcm50LT5saW5lc2l6ZVswXTsKLSAgICAgICAgY29uc3QgaW50IHAyX2xpbmVzaXplID0gbmV4dC0+bGluZXNpemVbMF07CiAKICAgICAgICAgZmZfZGxvZyhjdHgsICJnZXRfc2NlbmVfc2NvcmUoKSBwcm9jZXNzXG4iKTsKKyAgICAgICAgaWYgKHMtPmJpdGRlcHRoID09IDgpCisgICAgICAgICAgICBzYWQgPSBzY2VuZV9zYWQ4KHMsIGNybnQtPmRhdGFbMF0sIGNybnQtPmxpbmVzaXplWzBdLCBuZXh0LT5kYXRhWzBdLCBuZXh0LT5saW5lc2l6ZVswXSwgY3JudC0+d2lkdGgsIGNybnQtPmhlaWdodCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNhZCA9IHNjZW5lX3NhZDE2KHMsIChjb25zdCB1aW50MTZfdCopY3JudC0+ZGF0YVswXSwgY3JudC0+bGluZXNpemVbMF0gLyAyLCAoY29uc3QgdWludDE2X3QqKW5leHQtPmRhdGFbMF0sIG5leHQtPmxpbmVzaXplWzBdIC8gMiwgY3JudC0+d2lkdGgsIGNybnQtPmhlaWdodCk7CiAKLSAgICAgICAgZm9yIChzYWQgPSB5ID0gMDsgeSA8IGNybnQtPmhlaWdodDsgeSArPSA4KSB7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcDFfbGluZXNpemU7IHggKz0gOCkgewotICAgICAgICAgICAgICAgIHNhZCArPSBzLT5zYWQocDEgKyB5ICogcDFfbGluZXNpemUgKyB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDFfbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMiArIHkgKiBwMl9saW5lc2l6ZSArIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMl9saW5lc2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZW1tc19jKCk7Ci0gICAgICAgIG1hZmQgPSBzYWQgLyAoY3JudC0+aGVpZ2h0ICogY3JudC0+d2lkdGggKiAzKTsKKyAgICAgICAgbWFmZCA9IChkb3VibGUpc2FkICogMTAwLjAgLyBGRk1BWCgxLCAoY3JudC0+aGVpZ2h0ICYgfjcpICogKGNybnQtPndpZHRoICYgfjcpKSAvICgxIDw8IHMtPmJpdGRlcHRoKTsKICAgICAgICAgZGlmZiA9IGZhYnMobWFmZCAtIHMtPnByZXZfbWFmZCk7CiAgICAgICAgIHJldCAgPSBhdl9jbGlwZihGRk1JTihtYWZkLCBkaWZmKSwgMCwgMTAwLjApOwogICAgICAgICBzLT5wcmV2X21hZmQgPSBtYWZkOwogICAgIH0KLSAgICAgICAgZmZfZGxvZyhjdHgsICJnZXRfc2NlbmVfc2NvcmUoKSByZXN1bHQgaXM6JWZcbiIsIHJldCk7CisgICAgZmZfZGxvZyhjdHgsICJnZXRfc2NlbmVfc2NvcmUoKSByZXN1bHQgaXM6JWZcbiIsIHJldCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBibGVuZF9mcmFtZXMxNihBVkZpbHRlckNvbnRleHQgKmN0eCwgZmxvYXQgaW50ZXJwb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmNvcHlfc3JjMSwgQVZGcmFtZSAqY29weV9zcmMyKQordHlwZWRlZiBzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgQVZGcmFtZSAqY29weV9zcmMxLCAqY29weV9zcmMyOworICAgIHVpbnQxNl90IHNyYzFfZmFjdG9yLCBzcmMyX2ZhY3RvcjsKK30gVGhyZWFkRGF0YTsKKworc3RhdGljIGludCBmaWx0ZXJfc2xpY2UoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYiwgaW50IG5iX2pvYnMpCit7CisgICAgRnJhbWVSYXRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICB1aW50MTZfdCBzcmMxX2ZhY3RvciA9IHRkLT5zcmMxX2ZhY3RvcjsKKyAgICB1aW50MTZfdCBzcmMyX2ZhY3RvciA9IHRkLT5zcmMyX2ZhY3RvcjsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIHRkLT5jb3B5X3NyYzEtPmRhdGFbcGxhbmVdICYmIHRkLT5jb3B5X3NyYzItPmRhdGFbcGxhbmVdOyBwbGFuZSsrKSB7CisgICAgICAgIGludCBjcHlfbGluZV93aWR0aCA9IHMtPmxpbmVfc2l6ZVtwbGFuZV07CisgICAgICAgIHVpbnQ4X3QgKmNweV9zcmMxX2RhdGEgPSB0ZC0+Y29weV9zcmMxLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgaW50IGNweV9zcmMxX2xpbmVfc2l6ZSA9IHRkLT5jb3B5X3NyYzEtPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgdWludDhfdCAqY3B5X3NyYzJfZGF0YSA9IHRkLT5jb3B5X3NyYzItPmRhdGFbcGxhbmVdOworICAgICAgICBpbnQgY3B5X3NyYzJfbGluZV9zaXplID0gdGQtPmNvcHlfc3JjMi0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBpbnQgY3B5X3NyY19oID0gKHBsYW5lID4gMCAmJiBwbGFuZSA8IDMpID8gKHRkLT5jb3B5X3NyYzEtPmhlaWdodCA+PiBzLT52c3ViKSA6ICh0ZC0+Y29weV9zcmMxLT5oZWlnaHQpOworICAgICAgICB1aW50OF90ICpjcHlfZHN0X2RhdGEgPSBzLT53b3JrLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgaW50IGNweV9kc3RfbGluZV9zaXplID0gcy0+d29yay0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBjb25zdCBpbnQgc3RhcnQgPSAoY3B5X3NyY19oICogIGpvYiAgICkgLyBuYl9qb2JzOworICAgICAgICBjb25zdCBpbnQgZW5kICAgPSAoY3B5X3NyY19oICogKGpvYisxKSkgLyBuYl9qb2JzOworICAgICAgICBjcHlfc3JjMV9kYXRhICs9IHN0YXJ0ICogY3B5X3NyYzFfbGluZV9zaXplOworICAgICAgICBjcHlfc3JjMl9kYXRhICs9IHN0YXJ0ICogY3B5X3NyYzJfbGluZV9zaXplOworICAgICAgICBjcHlfZHN0X2RhdGEgKz0gc3RhcnQgKiBjcHlfZHN0X2xpbmVfc2l6ZTsKKworICAgICAgICBzLT5ibGVuZChjcHlfc3JjMV9kYXRhLCBjcHlfc3JjMV9saW5lX3NpemUsCisgICAgICAgICAgICAgICAgIGNweV9zcmMyX2RhdGEsIGNweV9zcmMyX2xpbmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgY3B5X2RzdF9kYXRhLCAgY3B5X2RzdF9saW5lX3NpemUsCisgICAgICAgICAgICAgICAgIGNweV9saW5lX3dpZHRoLCBlbmQgLSBzdGFydCwKKyAgICAgICAgICAgICAgICAgc3JjMV9mYWN0b3IsIHNyYzJfZmFjdG9yLCBzLT5ibGVuZF9mYWN0b3JfbWF4ID4+IDEpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsZW5kX2ZyYW1lcyhBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IGludGVycG9sYXRlKQogewogICAgIEZyYW1lUmF0ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOwogICAgIGRvdWJsZSBpbnRlcnBvbGF0ZV9zY2VuZV9zY29yZSA9IDA7CiAKLSAgICBpZiAoKHMtPmZsYWdzICYgRlJBTUVSQVRFX0ZMQUdfU0NEKSAmJiBjb3B5X3NyYzIpIHsKLSAgICAgICAgaW50ZXJwb2xhdGVfc2NlbmVfc2NvcmUgPSBnZXRfc2NlbmVfc2NvcmUxNihjdHgsIGNvcHlfc3JjMSwgY29weV9zcmMyKTsKLSAgICAgICAgZmZfZGxvZyhjdHgsICJibGVuZF9mcmFtZXMxNigpIGludGVycG9sYXRlIHNjZW5lIHNjb3JlOiVmXG4iLCBpbnRlcnBvbGF0ZV9zY2VuZV9zY29yZSk7Ci0gICAgfQotICAgIC8vIGRlY2lkZSBpZiB0aGUgc2hvdC1jaGFuZ2UgZGV0ZWN0aW9uIGFsbG93cyB1cyB0byBibGVuZCB0d28gZnJhbWVzCi0gICAgaWYgKGludGVycG9sYXRlX3NjZW5lX3Njb3JlIDwgcy0+c2NlbmVfc2NvcmUgJiYgY29weV9zcmMyKSB7Ci0gICAgICAgIHVpbnQxNl90IHNyYzJfZmFjdG9yID0gZmFic2YoaW50ZXJwb2xhdGUpICogKDEgPDwgKHMtPmJpdGRlcHRoIC0gOCkpOwotICAgICAgICB1aW50MTZfdCBzcmMxX2ZhY3RvciA9IHMtPm1heCAtIHNyYzJfZmFjdG9yOwotICAgICAgICBjb25zdCBpbnQgaGFsZiA9IHMtPm1heCAvIDI7Ci0gICAgICAgIGNvbnN0IGludCB1diA9IChzLT5tYXggKyAxKSAqIGhhbGY7Ci0gICAgICAgIGNvbnN0IGludCBzaGlmdCA9IHMtPmJpdGRlcHRoOwotICAgICAgICBpbnQgcGxhbmUsIGxpbmUsIHBpeGVsOwotCi0gICAgICAgIC8vIGdldCB3b3JrLXNwYWNlIGZvciBvdXRwdXQgZnJhbWUKLSAgICAgICAgcy0+d29yayA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7Ci0gICAgICAgIGlmICghcy0+d29yaykKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhzLT53b3JrLCBzLT5zcmNlW3MtPmNybnRdKTsKLQotICAgICAgICBmZl9kbG9nKGN0eCwgImJsZW5kX2ZyYW1lczE2KCkgSU5URVJQT0xBVEUgdG8gY3JlYXRlIHdvcmsgZnJhbWVcbiIpOwotICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIGNvcHlfc3JjMS0+ZGF0YVtwbGFuZV0gJiYgY29weV9zcmMyLT5kYXRhW3BsYW5lXTsgcGxhbmUrKykgewotICAgICAgICAgICAgaW50IGNweV9saW5lX3dpZHRoID0gcy0+bGluZV9zaXplW3BsYW5lXTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpjcHlfc3JjMV9kYXRhID0gKGNvbnN0IHVpbnQxNl90ICopY29weV9zcmMxLT5kYXRhW3BsYW5lXTsKLSAgICAgICAgICAgIGludCBjcHlfc3JjMV9saW5lX3NpemUgPSBjb3B5X3NyYzEtPmxpbmVzaXplW3BsYW5lXSAvIDI7Ci0gICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqY3B5X3NyYzJfZGF0YSA9IChjb25zdCB1aW50MTZfdCAqKWNvcHlfc3JjMi0+ZGF0YVtwbGFuZV07Ci0gICAgICAgICAgICBpbnQgY3B5X3NyYzJfbGluZV9zaXplID0gY29weV9zcmMyLT5saW5lc2l6ZVtwbGFuZV0gLyAyOwotICAgICAgICAgICAgaW50IGNweV9zcmNfaCA9IChwbGFuZSA+IDAgJiYgcGxhbmUgPCAzKSA/IChjb3B5X3NyYzEtPmhlaWdodCA+PiBzLT52c3ViKSA6IChjb3B5X3NyYzEtPmhlaWdodCk7Ci0gICAgICAgICAgICB1aW50MTZfdCAqY3B5X2RzdF9kYXRhID0gKHVpbnQxNl90ICopcy0+d29yay0+ZGF0YVtwbGFuZV07Ci0gICAgICAgICAgICBpbnQgY3B5X2RzdF9saW5lX3NpemUgPSBzLT53b3JrLT5saW5lc2l6ZVtwbGFuZV0gLyAyOwotCi0gICAgICAgICAgICBpZiAocGxhbmUgPDEgfHwgcGxhbmUgPjIpIHsKLSAgICAgICAgICAgICAgICAvLyBsdW1hIG9yIGFscGhhCi0gICAgICAgICAgICAgICAgZm9yIChsaW5lID0gMDsgbGluZSA8IGNweV9zcmNfaDsgbGluZSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAocGl4ZWwgPSAwOyBwaXhlbCA8IGNweV9saW5lX3dpZHRoOyBwaXhlbCsrKQotICAgICAgICAgICAgICAgICAgICAgICAgY3B5X2RzdF9kYXRhW3BpeGVsXSA9ICgoY3B5X3NyYzFfZGF0YVtwaXhlbF0gKiBzcmMxX2ZhY3RvcikgKyAoY3B5X3NyYzJfZGF0YVtwaXhlbF0gKiBzcmMyX2ZhY3RvcikgKyBoYWxmKSA+PiBzaGlmdDsKLSAgICAgICAgICAgICAgICAgICAgY3B5X3NyYzFfZGF0YSArPSBjcHlfc3JjMV9saW5lX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGNweV9zcmMyX2RhdGEgKz0gY3B5X3NyYzJfbGluZV9zaXplOwotICAgICAgICAgICAgICAgICAgICBjcHlfZHN0X2RhdGEgKz0gY3B5X2RzdF9saW5lX3NpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjaHJvbWEKLSAgICAgICAgICAgICAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgY3B5X3NyY19oOyBsaW5lKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbCA9IDA7IHBpeGVsIDwgY3B5X2xpbmVfd2lkdGg7IHBpeGVsKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNweV9kc3RfZGF0YVtwaXhlbF0gPSAoKChjcHlfc3JjMV9kYXRhW3BpeGVsXSAtIGhhbGYpICogc3JjMV9mYWN0b3IpICsgKChjcHlfc3JjMl9kYXRhW3BpeGVsXSAtIGhhbGYpICogc3JjMl9mYWN0b3IpICsgdXYpID4+IHNoaWZ0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNweV9zcmMxX2RhdGEgKz0gY3B5X3NyYzFfbGluZV9zaXplOwotICAgICAgICAgICAgICAgICAgICBjcHlfc3JjMl9kYXRhICs9IGNweV9zcmMyX2xpbmVfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgY3B5X2RzdF9kYXRhICs9IGNweV9kc3RfbGluZV9zaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgYmxlbmRfZnJhbWVzOChBVkZpbHRlckNvbnRleHQgKmN0eCwgZmxvYXQgaW50ZXJwb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqY29weV9zcmMxLCBBVkZyYW1lICpjb3B5X3NyYzIpCi17Ci0gICAgRnJhbWVSYXRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07Ci0gICAgZG91YmxlIGludGVycG9sYXRlX3NjZW5lX3Njb3JlID0gMDsKLQotICAgIGlmICgocy0+ZmxhZ3MgJiBGUkFNRVJBVEVfRkxBR19TQ0QpICYmIGNvcHlfc3JjMikgewotICAgICAgICBpbnRlcnBvbGF0ZV9zY2VuZV9zY29yZSA9IGdldF9zY2VuZV9zY29yZShjdHgsIGNvcHlfc3JjMSwgY29weV9zcmMyKTsKLSAgICAgICAgZmZfZGxvZyhjdHgsICJibGVuZF9mcmFtZXM4KCkgaW50ZXJwb2xhdGUgc2NlbmUgc2NvcmU6JWZcbiIsIGludGVycG9sYXRlX3NjZW5lX3Njb3JlKTsKLSAgICB9Ci0gICAgLy8gZGVjaWRlIGlmIHRoZSBzaG90LWNoYW5nZSBkZXRlY3Rpb24gYWxsb3dzIHVzIHRvIGJsZW5kIHR3byBmcmFtZXMKLSAgICBpZiAoaW50ZXJwb2xhdGVfc2NlbmVfc2NvcmUgPCBzLT5zY2VuZV9zY29yZSAmJiBjb3B5X3NyYzIpIHsKLSAgICAgICAgdWludDE2X3Qgc3JjMl9mYWN0b3IgPSBmYWJzZihpbnRlcnBvbGF0ZSk7Ci0gICAgICAgIHVpbnQxNl90IHNyYzFfZmFjdG9yID0gMjU2IC0gc3JjMl9mYWN0b3I7Ci0gICAgICAgIGludCBwbGFuZSwgbGluZSwgcGl4ZWw7Ci0KLSAgICAgICAgLy8gZ2V0IHdvcmstc3BhY2UgZm9yIG91dHB1dCBmcmFtZQotICAgICAgICBzLT53b3JrID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKLSAgICAgICAgaWYgKCFzLT53b3JrKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKHMtPndvcmssIHMtPnNyY2Vbcy0+Y3JudF0pOwotCi0gICAgICAgIGZmX2Rsb2coY3R4LCAiYmxlbmRfZnJhbWVzOCgpIElOVEVSUE9MQVRFIHRvIGNyZWF0ZSB3b3JrIGZyYW1lXG4iKTsKLSAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNCAmJiBjb3B5X3NyYzEtPmRhdGFbcGxhbmVdICYmIGNvcHlfc3JjMi0+ZGF0YVtwbGFuZV07IHBsYW5lKyspIHsKLSAgICAgICAgICAgIGludCBjcHlfbGluZV93aWR0aCA9IHMtPmxpbmVfc2l6ZVtwbGFuZV07Ci0gICAgICAgICAgICB1aW50OF90ICpjcHlfc3JjMV9kYXRhID0gY29weV9zcmMxLT5kYXRhW3BsYW5lXTsKLSAgICAgICAgICAgIGludCBjcHlfc3JjMV9saW5lX3NpemUgPSBjb3B5X3NyYzEtPmxpbmVzaXplW3BsYW5lXTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmNweV9zcmMyX2RhdGEgPSBjb3B5X3NyYzItPmRhdGFbcGxhbmVdOwotICAgICAgICAgICAgaW50IGNweV9zcmMyX2xpbmVfc2l6ZSA9IGNvcHlfc3JjMi0+bGluZXNpemVbcGxhbmVdOwotICAgICAgICAgICAgaW50IGNweV9zcmNfaCA9IChwbGFuZSA+IDAgJiYgcGxhbmUgPCAzKSA/IChjb3B5X3NyYzEtPmhlaWdodCA+PiBzLT52c3ViKSA6IChjb3B5X3NyYzEtPmhlaWdodCk7Ci0gICAgICAgICAgICB1aW50OF90ICpjcHlfZHN0X2RhdGEgPSBzLT53b3JrLT5kYXRhW3BsYW5lXTsKLSAgICAgICAgICAgIGludCBjcHlfZHN0X2xpbmVfc2l6ZSA9IHMtPndvcmstPmxpbmVzaXplW3BsYW5lXTsKLSAgICAgICAgICAgIGlmIChwbGFuZSA8MSB8fCBwbGFuZSA+MikgewotICAgICAgICAgICAgICAgIC8vIGx1bWEgb3IgYWxwaGEKLSAgICAgICAgICAgICAgICBmb3IgKGxpbmUgPSAwOyBsaW5lIDwgY3B5X3NyY19oOyBsaW5lKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChwaXhlbCA9IDA7IHBpeGVsIDwgY3B5X2xpbmVfd2lkdGg7IHBpeGVsKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVnZXIgdmVyc2lvbiBvZiAoc3JjMSAqIHNyYzFfZmFjdG9yKSArIChzcmMyICsgc3JjMl9mYWN0b3IpICsgMC41Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyAwLjUgaXMgZm9yIHJvdW5kaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAxMjggaXMgdGhlIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YgMC41IDw8IDgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNweV9kc3RfZGF0YVtwaXhlbF0gPSAoKGNweV9zcmMxX2RhdGFbcGl4ZWxdICogc3JjMV9mYWN0b3IpICsgKGNweV9zcmMyX2RhdGFbcGl4ZWxdICogc3JjMl9mYWN0b3IpICsgMTI4KSA+PiA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNweV9zcmMxX2RhdGEgKz0gY3B5X3NyYzFfbGluZV9zaXplOwotICAgICAgICAgICAgICAgICAgICBjcHlfc3JjMl9kYXRhICs9IGNweV9zcmMyX2xpbmVfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgY3B5X2RzdF9kYXRhICs9IGNweV9kc3RfbGluZV9zaXplOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hyb21hCi0gICAgICAgICAgICAgICAgZm9yIChsaW5lID0gMDsgbGluZSA8IGNweV9zcmNfaDsgbGluZSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAocGl4ZWwgPSAwOyBwaXhlbCA8IGNweV9saW5lX3dpZHRoOyBwaXhlbCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcyBhYm92ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBVIGFuZCBWIGFyZSBiYXNlZCBhcm91bmQgMTI4IHdlIGhhdmUgdG8gc3VidHJhY3QgMTI4IGZyb20gdGhlIGNvbXBvbmVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyAzMjg5NiBpcyB0aGUgaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZiAxMjguNSA8PCA4Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcHlfZHN0X2RhdGFbcGl4ZWxdID0gKCgoY3B5X3NyYzFfZGF0YVtwaXhlbF0gLSAxMjgpICogc3JjMV9mYWN0b3IpICsgKChjcHlfc3JjMl9kYXRhW3BpeGVsXSAtIDEyOCkgKiBzcmMyX2ZhY3RvcikgKyAzMjg5NikgPj4gODsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjcHlfc3JjMV9kYXRhICs9IGNweV9zcmMxX2xpbmVfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgY3B5X3NyYzJfZGF0YSArPSBjcHlfc3JjMl9saW5lX3NpemU7Ci0gICAgICAgICAgICAgICAgICAgIGNweV9kc3RfZGF0YSArPSBjcHlfZHN0X2xpbmVfc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHByb2Nlc3Nfd29ya19mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IHN0b3ApCi17Ci0gICAgRnJhbWVSYXRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQ2NF90IHdvcmtfbmV4dF9wdHM7Ci0gICAgQVZGcmFtZSAqY29weV9zcmMxOwotICAgIGZsb2F0IGludGVycG9sYXRlOwotCi0gICAgZmZfZGxvZyhjdHgsICJwcm9jZXNzX3dvcmtfZnJhbWUoKVxuIik7Ci0KLSAgICBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIHBlbmRpbmdfaW5wdXRfZnJhbWVzICVkXG4iLCBzLT5wZW5kaW5nX3NyY2VfZnJhbWVzKTsKLQotICAgIGlmIChzLT5zcmNlW3MtPnByZXZdKSBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIHNyY2UgcHJldiBwdHM6JSJQUklkNjQiXG4iLCBzLT5zcmNlW3MtPnByZXZdLT5wdHMpOwotICAgIGlmIChzLT5zcmNlW3MtPmNybnRdKSBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIHNyY2UgY3JudCBwdHM6JSJQUklkNjQiXG4iLCBzLT5zcmNlW3MtPmNybnRdLT5wdHMpOwotICAgIGlmIChzLT5zcmNlW3MtPm5leHRdKSBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIHNyY2UgbmV4dCBwdHM6JSJQUklkNjQiXG4iLCBzLT5zcmNlW3MtPm5leHRdLT5wdHMpOwotCi0gICAgaWYgKCFzLT5zcmNlW3MtPmNybnRdKSB7Ci0gICAgICAgIC8vIHRoZSBmaWx0ZXIgY2Fubm90IGRvIGFueXRoaW5nCi0gICAgICAgIGZmX2Rsb2coY3R4LCAicHJvY2Vzc193b3JrX2ZyYW1lKCkgbm8gY3VycmVudCBmcmFtZSBjYWNoZWQ6IG1vdmUgb24gdG8gbmV4dCBmcmFtZSwgZG8gbm90IG91dHB1dCBhIGZyYW1lXG4iKTsKLSAgICAgICAgbmV4dF9zb3VyY2UoY3R4KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgd29ya19uZXh0X3B0cyA9IHMtPnB0cyArIHMtPmF2ZXJhZ2VfZGVzdF9wdHNfZGVsdGE7Ci0KLSAgICBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIHdvcmsgY3JudCBwdHM6JSJQUklkNjQiXG4iLCBzLT5wdHMpOwotICAgIGZmX2Rsb2coY3R4LCAicHJvY2Vzc193b3JrX2ZyYW1lKCkgd29yayBuZXh0IHB0czolIlBSSWQ2NCJcbiIsIHdvcmtfbmV4dF9wdHMpOwotICAgIGlmIChzLT5zcmNlW3MtPnByZXZdKQotICAgICAgICBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIHNyY2UgcHJldiBwdHM6JSJQUklkNjQiIGF0IGRlc3QgdGltZSBiYXNlOiV1LyV1XG4iLAotICAgICAgICAgICAgcy0+c3JjZV9wdHNfZGVzdFtzLT5wcmV2XSwgcy0+ZGVzdF90aW1lX2Jhc2UubnVtLCBzLT5kZXN0X3RpbWVfYmFzZS5kZW4pOwotICAgIGlmIChzLT5zcmNlW3MtPmNybnRdKQotICAgICAgICBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIHNyY2UgY3JudCBwdHM6JSJQUklkNjQiIGF0IGRlc3QgdGltZSBiYXNlOiV1LyV1XG4iLAotICAgICAgICAgICAgcy0+c3JjZV9wdHNfZGVzdFtzLT5jcm50XSwgcy0+ZGVzdF90aW1lX2Jhc2UubnVtLCBzLT5kZXN0X3RpbWVfYmFzZS5kZW4pOwotICAgIGlmIChzLT5zcmNlW3MtPm5leHRdKQotICAgICAgICBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIHNyY2UgbmV4dCBwdHM6JSJQUklkNjQiIGF0IGRlc3QgdGltZSBiYXNlOiV1LyV1XG4iLAotICAgICAgICAgICAgcy0+c3JjZV9wdHNfZGVzdFtzLT5uZXh0XSwgcy0+ZGVzdF90aW1lX2Jhc2UubnVtLCBzLT5kZXN0X3RpbWVfYmFzZS5kZW4pOwotCi0gICAgYXZfYXNzZXJ0MChzLT5zcmNlW3MtPm5leHRdKTsKLQotICAgIC8vIHNob3VsZCBmaWx0ZXIgYmUgc2tpcHBpbmcgaW5wdXQgZnJhbWUgKG91dHB1dCBmcmFtZSByYXRlIGlzIGxvd2VyIHRoYW4gaW5wdXQgZnJhbWUgcmF0ZSkKLSAgICBpZiAoIXMtPmZsdXNoICYmIHMtPnB0cyA+PSBzLT5zcmNlX3B0c19kZXN0W3MtPm5leHRdKSB7Ci0gICAgICAgIGZmX2Rsb2coY3R4LCAicHJvY2Vzc193b3JrX2ZyYW1lKCkgd29yayBjcm50IHB0cyA+PSBzcmNlIG5leHQgcHRzOiBTS0lQIEZSQU1FLCBtb3ZlIG9uIHRvIG5leHQgZnJhbWUsIGRvIG5vdCBvdXRwdXQgYSBmcmFtZVxuIik7Ci0gICAgICAgIG5leHRfc291cmNlKGN0eCk7Ci0gICAgICAgIHMtPnBlbmRpbmdfc3JjZV9mcmFtZXMtLTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gY2FsY3VsYXRlIGludGVycG9sYXRpb24KLSAgICBpbnRlcnBvbGF0ZSA9ICgocy0+cHRzIC0gcy0+c3JjZV9wdHNfZGVzdFtzLT5jcm50XSkgKiAyNTYuMCAvIHMtPmF2ZXJhZ2Vfc3JjZV9wdHNfZGVzdF9kZWx0YSk7Ci0gICAgZmZfZGxvZyhjdHgsICJwcm9jZXNzX3dvcmtfZnJhbWUoKSBpbnRlcnBvbGF0ZTolZi8yNTZcbiIsIGludGVycG9sYXRlKTsKLSAgICBjb3B5X3NyYzEgPSBzLT5zcmNlW3MtPmNybnRdOwotICAgIGlmIChpbnRlcnBvbGF0ZSA+IHMtPmludGVycF9lbmQpIHsKLSAgICAgICAgZmZfZGxvZyhjdHgsICJwcm9jZXNzX3dvcmtfZnJhbWUoKSBzb3VyY2UgaXM6TkVYVFxuIik7Ci0gICAgICAgIGNvcHlfc3JjMSA9IHMtPnNyY2Vbcy0+bmV4dF07Ci0gICAgfQotICAgIGlmIChzLT5zcmNlW3MtPnByZXZdICYmIGludGVycG9sYXRlIDwgLXMtPmludGVycF9lbmQpIHsKLSAgICAgICAgZmZfZGxvZyhjdHgsICJwcm9jZXNzX3dvcmtfZnJhbWUoKSBzb3VyY2UgaXM6UFJFVlxuIik7Ci0gICAgICAgIGNvcHlfc3JjMSA9IHMtPnNyY2Vbcy0+cHJldl07Ci0gICAgfQotCi0gICAgLy8gZGVjaWRlIHdoZXRoZXIgdG8gYmxlbmQgdHdvIGZyYW1lcwotICAgIGlmICgoaW50ZXJwb2xhdGUgPj0gcy0+aW50ZXJwX3N0YXJ0ICYmIGludGVycG9sYXRlIDw9IHMtPmludGVycF9lbmQpIHx8IChpbnRlcnBvbGF0ZSA8PSAtcy0+aW50ZXJwX3N0YXJ0ICYmIGludGVycG9sYXRlID49IC1zLT5pbnRlcnBfZW5kKSkgewotICAgICAgICBBVkZyYW1lICpjb3B5X3NyYzI7Ci0KLSAgICAgICAgaWYgKGludGVycG9sYXRlID4gMCkgewotICAgICAgICAgICAgZmZfZGxvZyhjdHgsICJwcm9jZXNzX3dvcmtfZnJhbWUoKSBpbnRlcnBvbGF0ZSBzb3VyY2UgaXM6TkVYVFxuIik7Ci0gICAgICAgICAgICBjb3B5X3NyYzIgPSBzLT5zcmNlW3MtPm5leHRdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmZfZGxvZyhjdHgsICJwcm9jZXNzX3dvcmtfZnJhbWUoKSBpbnRlcnBvbGF0ZSBzb3VyY2UgaXM6UFJFVlxuIik7Ci0gICAgICAgICAgICBjb3B5X3NyYzIgPSBzLT5zcmNlW3MtPnByZXZdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLT5ibGVuZF9mcmFtZXMoY3R4LCBpbnRlcnBvbGF0ZSwgY29weV9zcmMxLCBjb3B5X3NyYzIpKQotICAgICAgICAgICAgZ290byBjb3B5X2RvbmU7CisgICAgaWYgKChzLT5mbGFncyAmIEZSQU1FUkFURV9GTEFHX1NDRCkpIHsKKyAgICAgICAgaWYgKHMtPnNjb3JlID49IDAuMCkKKyAgICAgICAgICAgIGludGVycG9sYXRlX3NjZW5lX3Njb3JlID0gcy0+c2NvcmU7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZmX2Rsb2coY3R4LCAicHJvY2Vzc193b3JrX2ZyYW1lKCkgQ1VUIC0gRE9OJ1QgSU5URVJQT0xBVEVcbiIpOworICAgICAgICAgICAgaW50ZXJwb2xhdGVfc2NlbmVfc2NvcmUgPSBzLT5zY29yZSA9IGdldF9zY2VuZV9zY29yZShjdHgsIHMtPmYwLCBzLT5mMSk7CisgICAgICAgIGZmX2Rsb2coY3R4LCAiYmxlbmRfZnJhbWVzKCkgaW50ZXJwb2xhdGUgc2NlbmUgc2NvcmU6JWZcbiIsIGludGVycG9sYXRlX3NjZW5lX3Njb3JlKTsKKyAgICB9CisgICAgLy8gZGVjaWRlIGlmIHRoZSBzaG90LWNoYW5nZSBkZXRlY3Rpb24gYWxsb3dzIHVzIHRvIGJsZW5kIHR3byBmcmFtZXMKKyAgICBpZiAoaW50ZXJwb2xhdGVfc2NlbmVfc2NvcmUgPCBzLT5zY2VuZV9zY29yZSkgeworICAgICAgICBUaHJlYWREYXRhIHRkOworICAgICAgICB0ZC5jb3B5X3NyYzEgPSBzLT5mMDsKKyAgICAgICAgdGQuY29weV9zcmMyID0gcy0+ZjE7CisgICAgICAgIHRkLnNyYzJfZmFjdG9yID0gaW50ZXJwb2xhdGU7CisgICAgICAgIHRkLnNyYzFfZmFjdG9yID0gcy0+YmxlbmRfZmFjdG9yX21heCAtIHRkLnNyYzJfZmFjdG9yOworCisgICAgICAgIC8vIGdldCB3b3JrLXNwYWNlIGZvciBvdXRwdXQgZnJhbWUKKyAgICAgICAgcy0+d29yayA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghcy0+d29yaykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhzLT53b3JrLCBzLT5mMCk7CisKKyAgICAgICAgZmZfZGxvZyhjdHgsICJibGVuZF9mcmFtZXMoKSBJTlRFUlBPTEFURSB0byBjcmVhdGUgd29yayBmcmFtZVxuIik7CisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgRkZNSU4oRkZNQVgoMSwgb3V0bGluay0+aCA+PiAyKSwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3Nfd29ya19mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBGcmFtZVJhdGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludDY0X3Qgd29ya19wdHM7CisgICAgaW50NjRfdCBpbnRlcnBvbGF0ZSwgaW50ZXJwb2xhdGU4OworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXMtPmYxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXMtPmYwICYmICFzLT5mbHVzaCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB3b3JrX3B0cyA9IHMtPnN0YXJ0X3B0cyArIGF2X3Jlc2NhbGVfcShzLT5uLCBhdl9pbnZfcShzLT5kZXN0X2ZyYW1lX3JhdGUpLCBzLT5kZXN0X3RpbWVfYmFzZSk7CisKKyAgICBpZiAod29ya19wdHMgPj0gcy0+cHRzMSAmJiAhcy0+Zmx1c2gpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCFzLT5mMCkgeworICAgICAgICBzLT53b3JrID0gYXZfZnJhbWVfY2xvbmUocy0+ZjEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICh3b3JrX3B0cyA+PSBzLT5wdHMxICsgcy0+ZGVsdGEgJiYgcy0+Zmx1c2gpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBpbnRlcnBvbGF0ZSA9IGF2X3Jlc2NhbGUod29ya19wdHMgLSBzLT5wdHMwLCBzLT5ibGVuZF9mYWN0b3JfbWF4LCBzLT5kZWx0YSk7CisgICAgICAgIGludGVycG9sYXRlOCA9IGF2X3Jlc2NhbGUod29ya19wdHMgLSBzLT5wdHMwLCAyNTYsIHMtPmRlbHRhKTsKKyAgICAgICAgZmZfZGxvZyhjdHgsICJwcm9jZXNzX3dvcmtfZnJhbWUoKSBpbnRlcnBvbGF0ZTogJSJQUklkNjQiLzI1NlxuIiwgaW50ZXJwb2xhdGU4KTsKKyAgICAgICAgaWYgKGludGVycG9sYXRlID49IHMtPmJsZW5kX2ZhY3Rvcl9tYXggfHwgaW50ZXJwb2xhdGU4ID4gcy0+aW50ZXJwX2VuZCkgeworICAgICAgICAgICAgcy0+d29yayA9IGF2X2ZyYW1lX2Nsb25lKHMtPmYxKTsKKyAgICAgICAgfSBlbHNlIGlmIChpbnRlcnBvbGF0ZSA8PSAwIHx8IGludGVycG9sYXRlOCA8IHMtPmludGVycF9zdGFydCkgeworICAgICAgICAgICAgcy0+d29yayA9IGF2X2ZyYW1lX2Nsb25lKHMtPmYwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGJsZW5kX2ZyYW1lcyhjdHgsIGludGVycG9sYXRlKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICAgICAgcy0+d29yayA9IGF2X2ZyYW1lX2Nsb25lKGludGVycG9sYXRlID4gKHMtPmJsZW5kX2ZhY3Rvcl9tYXggPj4gMSkgPyBzLT5mMSA6IHMtPmYwKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGZmX2Rsb2coY3R4LCAicHJvY2Vzc193b3JrX2ZyYW1lKCkgQ09QWSB0byB0aGUgd29yayBmcmFtZVxuIik7Ci0gICAgLy8gY29weSB0aGUgZnJhbWUgd2UgZGVjaWRlZCBpcyBvdXIgYmFzZSBzb3VyY2UKLSAgICBzLT53b3JrID0gYXZfZnJhbWVfY2xvbmUoY29weV9zcmMxKTsKICAgICBpZiAoIXMtPndvcmspCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLWNvcHlfZG9uZToKLSAgICBzLT53b3JrLT5wdHMgPSBzLT5wdHM7CisgICAgcy0+d29yay0+cHRzID0gd29ya19wdHM7CisgICAgcy0+bisrOwogCi0gICAgLy8gc2hvdWxkIGZpbHRlciBiZSByZS11c2luZyBpbnB1dCBmcmFtZSAob3V0cHV0IGZyYW1lIHJhdGUgaXMgaGlnaGVyIHRoYW4gaW5wdXQgZnJhbWUgcmF0ZSkKLSAgICBpZiAoIXMtPmZsdXNoICYmICh3b3JrX25leHRfcHRzICsgcy0+YXZlcmFnZV9kZXN0X3B0c19kZWx0YSkgPCAocy0+c3JjZV9wdHNfZGVzdFtzLT5jcm50XSArIHMtPmF2ZXJhZ2Vfc3JjZV9wdHNfZGVzdF9kZWx0YSkpIHsKLSAgICAgICAgZmZfZGxvZyhjdHgsICJwcm9jZXNzX3dvcmtfZnJhbWUoKSBSRVBFQVQgRlJBTUVcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZmX2Rsb2coY3R4LCAicHJvY2Vzc193b3JrX2ZyYW1lKCkgQ09OU1VNRSBGUkFNRSwgbW92ZSB0byBuZXh0IGZyYW1lXG4iKTsKLSAgICAgICAgcy0+cGVuZGluZ19zcmNlX2ZyYW1lcy0tOwotICAgICAgICBuZXh0X3NvdXJjZShjdHgpOwotICAgIH0KLSAgICBmZl9kbG9nKGN0eCwgInByb2Nlc3Nfd29ya19mcmFtZSgpIG91dHB1dCBhIGZyYW1lXG4iKTsKLSAgICBzLT5kZXN0X2ZyYW1lX251bSsrOwotICAgIGlmIChzdG9wKQotICAgICAgICBzLT5wZW5kaW5nX2VuZF9mcmFtZSA9IDA7Ci0gICAgcy0+bGFzdF9kZXN0X2ZyYW1lX3B0cyA9IHMtPndvcmstPnB0czsKLQotICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBzLT53b3JrKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3NyY2VfZnJhbWVfZGVzdF9wdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCi17Ci0gICAgRnJhbWVSYXRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLQotICAgIGZmX2Rsb2coY3R4LCAic2V0X3NyY2VfZnJhbWVfb3V0cHV0X3B0cygpXG4iKTsKLQotICAgIC8vIHNjYWxlIHRoZSBpbnB1dCBwdHMgZnJvbSB0aGUgdGltZWJhc2UgZGlmZmVyZW5jZSBiZXR3ZWVuIGlucHV0IGFuZCBvdXRwdXQKLSAgICBpZiAocy0+c3JjZVtzLT5wcmV2XSkKLSAgICAgICAgcy0+c3JjZV9wdHNfZGVzdFtzLT5wcmV2XSA9IGF2X3Jlc2NhbGVfcShzLT5zcmNlW3MtPnByZXZdLT5wdHMsIHMtPnNyY2VfdGltZV9iYXNlLCBzLT5kZXN0X3RpbWVfYmFzZSk7Ci0gICAgaWYgKHMtPnNyY2Vbcy0+Y3JudF0pCi0gICAgICAgIHMtPnNyY2VfcHRzX2Rlc3Rbcy0+Y3JudF0gPSBhdl9yZXNjYWxlX3Eocy0+c3JjZVtzLT5jcm50XS0+cHRzLCBzLT5zcmNlX3RpbWVfYmFzZSwgcy0+ZGVzdF90aW1lX2Jhc2UpOwotICAgIGlmIChzLT5zcmNlW3MtPm5leHRdKQotICAgICAgICBzLT5zcmNlX3B0c19kZXN0W3MtPm5leHRdID0gYXZfcmVzY2FsZV9xKHMtPnNyY2Vbcy0+bmV4dF0tPnB0cywgcy0+c3JjZV90aW1lX2Jhc2UsIHMtPmRlc3RfdGltZV9iYXNlKTsKLX0KLQotc3RhdGljIHZvaWQgc2V0X3dvcmtfZnJhbWVfcHRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQotewotICAgIEZyYW1lUmF0ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgaW50NjRfdCBwdHMsIGF2ZXJhZ2Vfc3JjZV9wdHNfZGVsdGEgPSAwOwotCi0gICAgZmZfZGxvZyhjdHgsICJzZXRfd29ya19mcmFtZV9wdHMoKVxuIik7Ci0KLSAgICBhdl9hc3NlcnQwKHMtPnNyY2Vbcy0+bmV4dF0pOwotICAgIGF2X2Fzc2VydDAocy0+c3JjZVtzLT5jcm50XSk7Ci0KLSAgICBmZl9kbG9nKGN0eCwgInNldF93b3JrX2ZyYW1lX3B0cygpIHNyY2UgY3JudCBwdHM6JSJQUklkNjQiXG4iLCBzLT5zcmNlW3MtPmNybnRdLT5wdHMpOwotICAgIGZmX2Rsb2coY3R4LCAic2V0X3dvcmtfZnJhbWVfcHRzKCkgc3JjZSBuZXh0IHB0czolIlBSSWQ2NCJcbiIsIHMtPnNyY2Vbcy0+bmV4dF0tPnB0cyk7Ci0gICAgaWYgKHMtPnNyY2Vbcy0+cHJldl0pCi0gICAgICAgIGZmX2Rsb2coY3R4LCAic2V0X3dvcmtfZnJhbWVfcHRzKCkgc3JjZSBwcmV2IHB0czolIlBSSWQ2NCJcbiIsIHMtPnNyY2Vbcy0+cHJldl0tPnB0cyk7Ci0KLSAgICBhdmVyYWdlX3NyY2VfcHRzX2RlbHRhID0gcy0+YXZlcmFnZV9zcmNlX3B0c19kZXN0X2RlbHRhOwotICAgIGZmX2Rsb2coY3R4LCAic2V0X3dvcmtfZnJhbWVfcHRzKCkgaW5pdGlhbCBhdmVyYWdlIHNyY2UgcHRzOiUiUFJJZDY0IlxuIiwgYXZlcmFnZV9zcmNlX3B0c19kZWx0YSk7Ci0KLSAgICBzZXRfc3JjZV9mcmFtZV9kZXN0X3B0cyhjdHgpOwotCi0gICAgLy8gY2FsY3VsYXRlIHRoZSBQVFMgZGVsdGEKLSAgICBpZiAoKHB0cyA9IChzLT5zcmNlX3B0c19kZXN0W3MtPm5leHRdIC0gcy0+c3JjZV9wdHNfZGVzdFtzLT5jcm50XSkpKSB7Ci0gICAgICAgIGF2ZXJhZ2Vfc3JjZV9wdHNfZGVsdGEgPSBhdmVyYWdlX3NyY2VfcHRzX2RlbHRhPygoYXZlcmFnZV9zcmNlX3B0c19kZWx0YStwdHMpPj4xKTpwdHM7Ci0gICAgfSBlbHNlIGlmIChzLT5zcmNlW3MtPnByZXZdICYmIChwdHMgPSAocy0+c3JjZV9wdHNfZGVzdFtzLT5jcm50XSAtIHMtPnNyY2VfcHRzX2Rlc3Rbcy0+cHJldl0pKSkgewotICAgICAgICBhdmVyYWdlX3NyY2VfcHRzX2RlbHRhID0gYXZlcmFnZV9zcmNlX3B0c19kZWx0YT8oKGF2ZXJhZ2Vfc3JjZV9wdHNfZGVsdGErcHRzKT4+MSk6cHRzOwotICAgIH0KLQotICAgIHMtPmF2ZXJhZ2Vfc3JjZV9wdHNfZGVzdF9kZWx0YSA9IGF2ZXJhZ2Vfc3JjZV9wdHNfZGVsdGE7Ci0gICAgZmZfZGxvZyhjdHgsICJzZXRfd29ya19mcmFtZV9wdHMoKSBhdmVyYWdlIHNyY2UgcHRzOiUiUFJJZDY0IlxuIiwgYXZlcmFnZV9zcmNlX3B0c19kZWx0YSk7Ci0gICAgZmZfZGxvZyhjdHgsICJzZXRfd29ya19mcmFtZV9wdHMoKSBhdmVyYWdlIHNyY2UgcHRzOiUiUFJJZDY0IiBhdCBkZXN0IHRpbWUgYmFzZToldS8ldVxuIiwKLSAgICAgICAgICAgIHMtPmF2ZXJhZ2Vfc3JjZV9wdHNfZGVzdF9kZWx0YSwgcy0+ZGVzdF90aW1lX2Jhc2UubnVtLCBzLT5kZXN0X3RpbWVfYmFzZS5kZW4pOwotCi0gICAgaWYgKGN0eC0+aW5wdXRzWzBdICYmICFzLT5hdmVyYWdlX2Rlc3RfcHRzX2RlbHRhKSB7Ci0gICAgICAgIGludDY0X3QgZCA9IGF2X3EyZChhdl9pbnZfcShhdl9tdWxfcShzLT5kZXN0X3RpbWVfYmFzZSwgcy0+ZGVzdF9mcmFtZV9yYXRlKSkpOwotICAgICAgICBzLT5hdmVyYWdlX2Rlc3RfcHRzX2RlbHRhID0gZDsKLSAgICAgICAgZmZfZGxvZyhjdHgsICJzZXRfd29ya19mcmFtZV9wdHMoKSBhdmVyYWdlIGRlc3QgcHRzIGRlbHRhOiUiUFJJZDY0IlxuIiwgcy0+YXZlcmFnZV9kZXN0X3B0c19kZWx0YSk7Ci0gICAgfQotCi0gICAgaWYgKCFzLT5kZXN0X2ZyYW1lX251bSkgewotICAgICAgICBzLT5wdHMgPSBzLT5sYXN0X2Rlc3RfZnJhbWVfcHRzID0gcy0+c3JjZV9wdHNfZGVzdFtzLT5jcm50XTsKLSAgICB9IGVsc2UgewotICAgICAgICBzLT5wdHMgPSBzLT5sYXN0X2Rlc3RfZnJhbWVfcHRzICsgcy0+YXZlcmFnZV9kZXN0X3B0c19kZWx0YTsKLSAgICB9Ci0KLSAgICBmZl9kbG9nKGN0eCwgInNldF93b3JrX2ZyYW1lX3B0cygpIGNhbGN1bGF0ZWQgcHRzOiUiUFJJZDY0IiBhdCBkZXN0IHRpbWUgYmFzZToldS8ldVxuIiwKLSAgICAgICAgICAgIHMtPnB0cywgcy0+ZGVzdF90aW1lX2Jhc2UubnVtLCBzLT5kZXN0X3RpbWVfYmFzZS5kZW4pOworICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBGcmFtZVJhdGVDb250ZXh0ICpzID0gY3R4LT5wcml2OwotCi0gICAgcy0+ZGVzdF9mcmFtZV9udW0gPSAwOwotCi0gICAgcy0+Y3JudCA9IChOX1NSQ0UpPj4xOwotICAgIHMtPmxhc3QgPSBOX1NSQ0UgLSAxOwotCi0gICAgcy0+bmV4dCA9IHMtPmNybnQgLSAxOwotICAgIHMtPnByZXYgPSBzLT5jcm50ICsgMTsKLQorICAgIHMtPnN0YXJ0X3B0cyA9IEFWX05PUFRTX1ZBTFVFOwogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBGcmFtZVJhdGVDb250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gcy0+ZnJzdCArIDE7IGkgPCBzLT5sYXN0OyBpKyspIHsKLSAgICAgICAgaWYgKHMtPnNyY2VbaV0gJiYgKHMtPnNyY2VbaV0gIT0gcy0+c3JjZVtpICsgMV0pKQotICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+c3JjZVtpXSk7Ci0gICAgfQotICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNyY2Vbcy0+bGFzdF0pOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmYwKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mMSk7CiB9CiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKQEAgLTU1NCw2ICsyOTAsNTAgQEAKICAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm10c19saXN0KTsKIH0KIAorc3RhdGljIHZvaWQgYmxlbmRfZnJhbWVzX2MoQkxFTkRfRlVOQ19QQVJBTVMpCit7CisgICAgaW50IGxpbmUsIHBpeGVsOworICAgIGZvciAobGluZSA9IDA7IGxpbmUgPCBoZWlnaHQ7IGxpbmUrKykgeworICAgICAgICBmb3IgKHBpeGVsID0gMDsgcGl4ZWwgPCB3aWR0aDsgcGl4ZWwrKykKKyAgICAgICAgICAgIGRzdFtwaXhlbF0gPSAoKHNyYzFbcGl4ZWxdICogZmFjdG9yMSkgKyAoc3JjMltwaXhlbF0gKiBmYWN0b3IyKSArIGhhbGYpID4+IEJMRU5EX0ZBQ1RPUl9ERVBUSDg7CisgICAgICAgIHNyYzEgKz0gc3JjMV9saW5lc2l6ZTsKKyAgICAgICAgc3JjMiArPSBzcmMyX2xpbmVzaXplOworICAgICAgICBkc3QgICs9IGRzdF9saW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX2ZyYW1lczE2X2MoQkxFTkRfRlVOQ19QQVJBTVMpCit7CisgICAgaW50IGxpbmUsIHBpeGVsOworICAgIHVpbnQxNl90ICpkc3R3ID0gKHVpbnQxNl90ICopZHN0OworICAgIHVpbnQxNl90ICpzcmMxdyA9ICh1aW50MTZfdCAqKXNyYzE7CisgICAgdWludDE2X3QgKnNyYzJ3ID0gKHVpbnQxNl90ICopc3JjMjsKKyAgICB3aWR0aCAvPSAyOworICAgIHNyYzFfbGluZXNpemUgLz0gMjsKKyAgICBzcmMyX2xpbmVzaXplIC89IDI7CisgICAgZHN0X2xpbmVzaXplIC89IDI7CisgICAgZm9yIChsaW5lID0gMDsgbGluZSA8IGhlaWdodDsgbGluZSsrKSB7CisgICAgICAgIGZvciAocGl4ZWwgPSAwOyBwaXhlbCA8IHdpZHRoOyBwaXhlbCsrKQorICAgICAgICAgICAgZHN0d1twaXhlbF0gPSAoKHNyYzF3W3BpeGVsXSAqIGZhY3RvcjEpICsgKHNyYzJ3W3BpeGVsXSAqIGZhY3RvcjIpICsgaGFsZikgPj4gQkxFTkRfRkFDVE9SX0RFUFRIMTY7CisgICAgICAgIHNyYzF3ICs9IHNyYzFfbGluZXNpemU7CisgICAgICAgIHNyYzJ3ICs9IHNyYzJfbGluZXNpemU7CisgICAgICAgIGRzdHcgICs9IGRzdF9saW5lc2l6ZTsKKyAgICB9Cit9CisKK3ZvaWQgZmZfZnJhbWVyYXRlX2luaXQoRnJhbWVSYXRlQ29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+Yml0ZGVwdGggPT0gOCkgeworICAgICAgICBzLT5ibGVuZF9mYWN0b3JfbWF4ID0gMSA8PCBCTEVORF9GQUNUT1JfREVQVEg4OworICAgICAgICBzLT5ibGVuZCA9IGJsZW5kX2ZyYW1lc19jOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmJsZW5kX2ZhY3Rvcl9tYXggPSAxIDw8IEJMRU5EX0ZBQ1RPUl9ERVBUSDE2OworICAgICAgICBzLT5ibGVuZCA9IGJsZW5kX2ZyYW1lczE2X2M7CisgICAgfQorICAgIGlmIChBUkNIX1g4NikKKyAgICAgICAgZmZfZnJhbWVyYXRlX2luaXRfeDg2KHMpOworfQorCiBzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwpAQCAtNTc1LDM4ICszNTUsNTggQEAKIAogICAgIHMtPnNyY2VfdGltZV9iYXNlID0gaW5saW5rLT50aW1lX2Jhc2U7CiAKLSAgICBpZiAocy0+Yml0ZGVwdGggPT0gOCkKLSAgICAgICAgcy0+YmxlbmRfZnJhbWVzID0gYmxlbmRfZnJhbWVzODsKLSAgICBlbHNlCi0gICAgICAgIHMtPmJsZW5kX2ZyYW1lcyA9IGJsZW5kX2ZyYW1lczE2OwotICAgIHMtPm1heCA9IDEgPDwgKHMtPmJpdGRlcHRoKTsKKyAgICBmZl9mcmFtZXJhdGVfaW5pdChzKTsKIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5waWNyZWYpCiB7CisgICAgaW50IHJldDsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwogICAgIEZyYW1lUmF0ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0KLSAgICAvLyB3ZSBoYXZlIG9uZSBuZXcgZnJhbWUKLSAgICBzLT5wZW5kaW5nX3NyY2VfZnJhbWVzKys7CisgICAgaW50NjRfdCBwdHM7CiAKICAgICBpZiAoaW5waWNyZWYtPmludGVybGFjZWRfZnJhbWUpCiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW50ZXJsYWNlZCBmcmFtZSBmb3VuZCAtIHRoZSBvdXRwdXQgd2lsbCBub3QgYmUgY29ycmVjdC5cbiIpOwogCi0gICAgLy8gc3RvcmUgdGhlIHBvaW50ZXIgdG8gdGhlIG5ldyBmcmFtZQotICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNyY2Vbcy0+ZnJzdF0pOwotICAgIHMtPnNyY2Vbcy0+ZnJzdF0gPSBpbnBpY3JlZjsKLQotICAgIGlmICghcy0+cGVuZGluZ19lbmRfZnJhbWUgJiYgcy0+c3JjZVtzLT5jcm50XSkgewotICAgICAgICBzZXRfd29ya19mcmFtZV9wdHMoY3R4KTsKLSAgICAgICAgcy0+cGVuZGluZ19lbmRfZnJhbWUgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNldF9zcmNlX2ZyYW1lX2Rlc3RfcHRzKGN0eCk7CisgICAgaWYgKGlucGljcmVmLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJJZ25vcmluZyBmcmFtZSB3aXRob3V0IFBUUy5cbiIpOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICByZXR1cm4gcHJvY2Vzc193b3JrX2ZyYW1lKGN0eCwgMSk7CisgICAgcHRzID0gYXZfcmVzY2FsZV9xKGlucGljcmVmLT5wdHMsIHMtPnNyY2VfdGltZV9iYXNlLCBzLT5kZXN0X3RpbWVfYmFzZSk7CisgICAgaWYgKHMtPmYxICYmIHB0cyA9PSBzLT5wdHMxKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiSWdub3JpbmcgZnJhbWUgd2l0aCBzYW1lIFBUUy5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5mMCk7CisgICAgcy0+ZjAgPSBzLT5mMTsKKyAgICBzLT5wdHMwID0gcy0+cHRzMTsKKyAgICBzLT5mMSA9IGlucGljcmVmOworICAgIHMtPnB0czEgPSBwdHM7CisgICAgcy0+ZGVsdGEgPSBzLT5wdHMxIC0gcy0+cHRzMDsKKyAgICBzLT5zY29yZSA9IC0xLjA7CisKKyAgICBpZiAocy0+ZGVsdGEgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiUFRTIGRpc2NvbnRpbnVpdHkuXG4iKTsKKyAgICAgICAgcy0+c3RhcnRfcHRzID0gcy0+cHRzMTsKKyAgICAgICAgcy0+biA9IDA7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmYwKTsKKyAgICB9CisKKyAgICBpZiAocy0+c3RhcnRfcHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICBzLT5zdGFydF9wdHMgPSBzLT5wdHMxOworCisgICAgZG8geworICAgICAgICByZXQgPSBwcm9jZXNzX3dvcmtfZnJhbWUoY3R4KTsKKyAgICAgICAgaWYgKHJldCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0ID0gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgcy0+d29yayk7CisgICAgfSB3aGlsZSAocmV0ID49IDApOworCisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKQEAgLTY1OCw0NCArNDU4LDIxIEBACiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CiAgICAgRnJhbWVSYXRlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgdmFsLCBpOworICAgIGludCByZXQ7CiAKICAgICBmZl9kbG9nKGN0eCwgInJlcXVlc3RfZnJhbWUoKVxuIik7CiAKLSAgICAvLyBpZiB0aGVyZSBpcyBubyAibmV4dCIgZnJhbWUgQU5EIHdlIGFyZSBub3QgaW4gZmx1c2ggdGhlbiBnZXQgb25lIGZyb20gb3VyIGlucHV0IGZpbHRlcgotICAgIGlmICghcy0+c3JjZVtzLT5mcnN0XSAmJiAhcy0+Zmx1c2gpIHsKLSAgICAgICAgZmZfZGxvZyhjdHgsICJyZXF1ZXN0X2ZyYW1lKCkgY2FsbCBzb3VyY2UncyByZXF1ZXN0X2ZyYW1lKClcbiIpOwotICAgICAgICB2YWwgPSBmZl9yZXF1ZXN0X2ZyYW1lKG91dGxpbmstPnNyYy0+aW5wdXRzWzBdKTsKLSAgICAgICAgaWYgKHZhbCA8IDAgJiYgKHZhbCAhPSBBVkVSUk9SX0VPRikpIHsKLSAgICAgICAgICAgIGZmX2Rsb2coY3R4LCAicmVxdWVzdF9mcmFtZSgpIHNvdXJjZSdzIHJlcXVlc3RfZnJhbWUoKSByZXR1cm5lZCBlcnJvcjolZFxuIiwgdmFsKTsKLSAgICAgICAgICAgIHJldHVybiB2YWw7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsID09IEFWRVJST1JfRU9GKSB7Ci0gICAgICAgICAgICBzLT5mbHVzaCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZmZfZGxvZyhjdHgsICJyZXF1ZXN0X2ZyYW1lKCkgc291cmNlJ3MgcmVxdWVzdF9mcmFtZSgpIHJldHVybmVkOiVkXG4iLCB2YWwpOwotICAgICAgICByZXR1cm4gMDsKKyAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzWzBdKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIHMtPmYxICYmICFzLT5mbHVzaCkgeworICAgICAgICBzLT5mbHVzaCA9IDE7CisgICAgICAgIHJldCA9IHByb2Nlc3Nfd29ya19mcmFtZShjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IHJldCA/IGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIHMtPndvcmspIDogQVZFUlJPUl9FT0Y7CiAgICAgfQogCi0gICAgZmZfZGxvZyhjdHgsICJyZXF1ZXN0X2ZyYW1lKCkgUkVQRUFUIG9yIEZMVVNIXG4iKTsKLQotICAgIGlmIChzLT5wZW5kaW5nX3NyY2VfZnJhbWVzIDw9IDApIHsKLSAgICAgICAgZmZfZGxvZyhjdHgsICJyZXF1ZXN0X2ZyYW1lKCkgbm90aGluZyBlbHNlIHRvIGRvLCByZXR1cm46RU9GXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwotICAgIH0KLQotICAgIC8vIG90aGVyd2lzZSwgbWFrZSBicmFuZC1uZXcgZnJhbWUgYW5kIHBhc3MgdG8gb3VyIG91dHB1dCBmaWx0ZXIKLSAgICBmZl9kbG9nKGN0eCwgInJlcXVlc3RfZnJhbWUoKSBGTFVTSFxuIik7Ci0KLSAgICAvLyBiYWNrIGZpbGwgYXQgZW5kIG9mIGZpbGUgd2hlbiBzb3VyY2UgaGFzIG5vIG1vcmUgZnJhbWVzCi0gICAgZm9yIChpID0gcy0+bGFzdDsgaSA+IHMtPmZyc3Q7IGktLSkgewotICAgICAgICBpZiAoIXMtPnNyY2VbaSAtIDFdICYmIHMtPnNyY2VbaV0pIHsKLSAgICAgICAgICAgIGZmX2Rsb2coY3R4LCAicmVxdWVzdF9mcmFtZSgpIGNvcHk6JWQgdG86JWRcbiIsIGksIGkgLSAxKTsKLSAgICAgICAgICAgIHMtPnNyY2VbaSAtIDFdID0gcy0+c3JjZVtpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHNldF93b3JrX2ZyYW1lX3B0cyhjdHgpOwotICAgIHJldHVybiBwcm9jZXNzX3dvcmtfZnJhbWUoY3R4LCAwKTsKKyAgICBmZl9kbG9nKGN0eCwgInJlcXVlc3RfZnJhbWUoKSBzb3VyY2UncyByZXF1ZXN0X2ZyYW1lKCkgcmV0dXJuZWQ6JWRcbiIsIHJldCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGZyYW1lcmF0ZV9pbnB1dHNbXSA9IHsKQEAgLTcyOCw0ICs1MDUsNSBAQAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKICAgICAuaW5wdXRzICAgICAgICA9IGZyYW1lcmF0ZV9pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBmcmFtZXJhdGVfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKIH07CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9mcmFtZXN0ZXAuYyBiL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lc3RlcC5jCmluZGV4IDZmMTk4YjguLjgxMDJlN2MgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lc3RlcC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2ZyYW1lc3RlcC5jCkBAIC02Myw3ICs2Myw3IEBACiB7CiAgICAgRnJhbWVTdGVwQ29udGV4dCAqZnJhbWVzdGVwID0gaW5saW5rLT5kc3QtPnByaXY7CiAKLSAgICBpZiAoIShpbmxpbmstPmZyYW1lX2NvdW50ICUgZnJhbWVzdGVwLT5mcmFtZV9zdGVwKSkgeworICAgIGlmICghKGlubGluay0+ZnJhbWVfY291bnRfb3V0ICUgZnJhbWVzdGVwLT5mcmFtZV9zdGVwKSkgewogICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGlubGluay0+ZHN0LT5vdXRwdXRzWzBdLCByZWYpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnJlZik7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9mcmVpMHIuYyBiL2xpYmF2ZmlsdGVyL3ZmX2ZyZWkwci5jCmluZGV4IDlhYTNlZGMuLjhhZWFjMDggMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2ZyZWkwci5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2ZyZWkwci5jCkBAIC0xNjAsNTQgKzE2MCw2IEBACiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9Ci0KLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCi0gICAgICAgICAgICAgICAiaWR4OiVkIG5hbWU6JyVzJyB0eXBlOiVzIGV4cGxhbmF0aW9uOiclcycgIiwKLSAgICAgICAgICAgICAgIGksIGluZm8ubmFtZSwKLSAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fQk9PTCAgICAgPyAiYm9vbCIgICAgIDoKLSAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fRE9VQkxFICAgPyAiZG91YmxlIiAgIDoKLSAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fQ09MT1IgICAgPyAiY29sb3IiICAgIDoKLSAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fUE9TSVRJT04gPyAicG9zaXRpb24iIDoKLSAgICAgICAgICAgICAgIGluZm8udHlwZSA9PSBGMFJfUEFSQU1fU1RSSU5HICAgPyAic3RyaW5nIiAgIDogInVua25vd24iLAotICAgICAgICAgICAgICAgaW5mby5leHBsYW5hdGlvbik7Ci0KLSNpZmRlZiBERUJVRwotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJ2YWx1ZToiKTsKLSAgICAgICAgc3dpdGNoIChpbmZvLnR5cGUpIHsKLSAgICAgICAgICAgIHZvaWQgKnY7Ci0gICAgICAgICAgICBkb3VibGUgZDsKLSAgICAgICAgICAgIGNoYXIgc3RyWzEyOF07Ci0gICAgICAgICAgICBmMHJfcGFyYW1fY29sb3JfdCBjb2w7Ci0gICAgICAgICAgICBmMHJfcGFyYW1fcG9zaXRpb25fdCBwb3M7Ci0KLSAgICAgICAgY2FzZSBGMFJfUEFSQU1fQk9PTDoKLSAgICAgICAgICAgIHYgPSAmZDsKLSAgICAgICAgICAgIHMtPmdldF9wYXJhbV92YWx1ZShzLT5pbnN0YW5jZSwgdiwgaSk7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIlcyIsIGQgPj0gMC41ICYmIGQgPD0gMS4wID8gInkiIDogIm4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEYwUl9QQVJBTV9ET1VCTEU6Ci0gICAgICAgICAgICB2ID0gJmQ7Ci0gICAgICAgICAgICBzLT5nZXRfcGFyYW1fdmFsdWUocy0+aW5zdGFuY2UsIHYsIGkpOwotICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiJWYiLCBkKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEYwUl9QQVJBTV9DT0xPUjoKLSAgICAgICAgICAgIHYgPSAmY29sOwotICAgICAgICAgICAgcy0+Z2V0X3BhcmFtX3ZhbHVlKHMtPmluc3RhbmNlLCB2LCBpKTsKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiVmLyVmLyVmIiwgY29sLnIsIGNvbC5nLCBjb2wuYik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGMFJfUEFSQU1fUE9TSVRJT046Ci0gICAgICAgICAgICB2ID0gJnBvczsKLSAgICAgICAgICAgIHMtPmdldF9wYXJhbV92YWx1ZShzLT5pbnN0YW5jZSwgdiwgaSk7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIlZi8lZiIsIHBvcy54LCBwb3MueSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDogLyogRjBSX1BBUkFNX1NUUklORyAqLwotICAgICAgICAgICAgdiA9IHN0cjsKLSAgICAgICAgICAgIHMtPmdldF9wYXJhbV92YWx1ZShzLT5pbnN0YW5jZSwgdiwgaSk7Ci0gICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICInJXMnIiwgc3RyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICIuXG4iKTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTUxMCw3ICs0NjIsNyBAQAogCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gZnJlaTByX3NyY19vcHRpb25zW10gPSB7CiAgICAgeyAic2l6ZSIsICAgICAgICAgICJEaW1lbnNpb25zIG9mIHRoZSBnZW5lcmF0ZWQgdmlkZW8uIiwgT0ZGU0VUKHcpLCAgICAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsgLnN0ciA9ICIzMjB4MjQwIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAotICAgIHsgImZyYW1lcmF0ZSIsICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7IC5zdHIgPSAiMjUiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsgLnN0ciA9ICIyNSIgfSwgMCwgSU5UX01BWCwgLmZsYWdzID0gRkxBR1MgfSwKICAgICB7ICJmaWx0ZXJfbmFtZSIsICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZGxfbmFtZSksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAgICAgICAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTIH0sCiAgICAgeyAiZmlsdGVyX3BhcmFtcyIsIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHBhcmFtcyksICAgIEFWX09QVF9UWVBFX1NUUklORywgICAgICAgICAgICAgICAgICAuZmxhZ3MgPSBGTEFHUyB9LAogICAgIHsgTlVMTCB9LApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZ2JsdXIuYyBiL2xpYmF2ZmlsdGVyL3ZmX2dibHVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MDFlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2dibHVyLmMKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgUGFzY2FsIEdldHJldWVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGF1bCBCIE1haG9sCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKyAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyAqICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBIT0xERVIgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAqIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgR0JsdXJDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGZsb2F0IHNpZ21hOworICAgIGZsb2F0IHNpZ21hVjsKKyAgICBpbnQgc3RlcHM7CisgICAgaW50IHBsYW5lczsKKworICAgIGludCBkZXB0aDsKKyAgICBpbnQgcGxhbmV3aWR0aFs0XTsKKyAgICBpbnQgcGxhbmVoZWlnaHRbNF07CisgICAgZmxvYXQgKmJ1ZmZlcjsKKyAgICBmbG9hdCBib3VuZGFyeXNjYWxlOworICAgIGZsb2F0IGJvdW5kYXJ5c2NhbGVWOworICAgIGZsb2F0IHBvc3RzY2FsZTsKKyAgICBmbG9hdCBwb3N0c2NhbGVWOworICAgIGZsb2F0IG51OworICAgIGZsb2F0IG51VjsKKyAgICBpbnQgbmJfcGxhbmVzOworfSBHQmx1ckNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEdCbHVyQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBnYmx1cl9vcHRpb25zW10gPSB7CisgICAgeyAic2lnbWEiLCAgInNldCBzaWdtYSIsICAgICAgICAgICAgT0ZGU0VUKHNpZ21hKSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjV9LCAwLjAsIDEwMjQsIEZMQUdTIH0sCisgICAgeyAic3RlcHMiLCAgInNldCBudW1iZXIgb2Ygc3RlcHMiLCAgT0ZGU0VUKHN0ZXBzKSwgIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND0xfSwgICAgIDEsICAgIDYsIEZMQUdTIH0sCisgICAgeyAicGxhbmVzIiwgInNldCBwbGFuZXMgdG8gZmlsdGVyIiwgT0ZGU0VUKHBsYW5lcyksIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND0weEZ9LCAgIDAsICAweEYsIEZMQUdTIH0sCisgICAgeyAic2lnbWFWIiwgInNldCB2ZXJ0aWNhbCBzaWdtYSIsICAgT0ZGU0VUKHNpZ21hViksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0tMX0sICAgLTEsIDEwMjQsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhnYmx1cik7CisKK3R5cGVkZWYgc3RydWN0IFRocmVhZERhdGEgeworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHdpZHRoOworfSBUaHJlYWREYXRhOworCitzdGF0aWMgaW50IGZpbHRlcl9ob3Jpem9udGFsbHkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBHQmx1ckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHRkLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHdpZHRoID0gdGQtPndpZHRoOworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChoZWlnaHQgKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kICAgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgY29uc3QgZmxvYXQgYm91bmRhcnlzY2FsZSA9IHMtPmJvdW5kYXJ5c2NhbGU7CisgICAgY29uc3QgaW50IHN0ZXBzID0gcy0+c3RlcHM7CisgICAgY29uc3QgZmxvYXQgbnUgPSBzLT5udTsKKyAgICBmbG9hdCAqYnVmZmVyID0gcy0+YnVmZmVyOworICAgIGludCB5LCB4LCBzdGVwOworICAgIGZsb2F0ICpwdHI7CisKKyAgICAvKiBGaWx0ZXIgaG9yaXpvbnRhbGx5IGFsb25nIGVhY2ggcm93ICovCisgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworICAgICAgICBmb3IgKHN0ZXAgPSAwOyBzdGVwIDwgc3RlcHM7IHN0ZXArKykgeworICAgICAgICAgICAgcHRyID0gYnVmZmVyICsgd2lkdGggKiB5OworICAgICAgICAgICAgcHRyWzBdICo9IGJvdW5kYXJ5c2NhbGU7CisKKyAgICAgICAgICAgIC8qIEZpbHRlciByaWdodHdhcmRzICovCisgICAgICAgICAgICBmb3IgKHggPSAxOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICBwdHJbeF0gKz0gbnUgKiBwdHJbeCAtIDFdOworCisgICAgICAgICAgICBwdHJbeCA9IHdpZHRoIC0gMV0gKj0gYm91bmRhcnlzY2FsZTsKKworICAgICAgICAgICAgLyogRmlsdGVyIGxlZnR3YXJkcyAqLworICAgICAgICAgICAgZm9yICg7IHggPiAwOyB4LS0pCisgICAgICAgICAgICAgICAgcHRyW3ggLSAxXSArPSBudSAqIHB0clt4XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl92ZXJ0aWNhbGx5KEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgR0JsdXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIGNvbnN0IGludCBoZWlnaHQgPSB0ZC0+aGVpZ2h0OworICAgIGNvbnN0IGludCB3aWR0aCA9IHRkLT53aWR0aDsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAod2lkdGggKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kICAgPSAod2lkdGggKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCBmbG9hdCBib3VuZGFyeXNjYWxlID0gcy0+Ym91bmRhcnlzY2FsZVY7CisgICAgY29uc3QgaW50IG51bXBpeGVscyA9IHdpZHRoICogaGVpZ2h0OworICAgIGNvbnN0IGludCBzdGVwcyA9IHMtPnN0ZXBzOworICAgIGNvbnN0IGZsb2F0IG51ID0gcy0+bnVWOworICAgIGZsb2F0ICpidWZmZXIgPSBzLT5idWZmZXI7CisgICAgaW50IGksIHgsIHN0ZXA7CisgICAgZmxvYXQgKnB0cjsKKworICAgIC8qIEZpbHRlciB2ZXJ0aWNhbGx5IGFsb25nIGVhY2ggY29sdW1uICovCisgICAgZm9yICh4ID0gc2xpY2Vfc3RhcnQ7IHggPCBzbGljZV9lbmQ7IHgrKykgeworICAgICAgICBmb3IgKHN0ZXAgPSAwOyBzdGVwIDwgc3RlcHM7IHN0ZXArKykgeworICAgICAgICAgICAgcHRyID0gYnVmZmVyICsgeDsKKyAgICAgICAgICAgIHB0clswXSAqPSBib3VuZGFyeXNjYWxlOworCisgICAgICAgICAgICAvKiBGaWx0ZXIgZG93bndhcmRzICovCisgICAgICAgICAgICBmb3IgKGkgPSB3aWR0aDsgaSA8IG51bXBpeGVsczsgaSArPSB3aWR0aCkKKyAgICAgICAgICAgICAgICBwdHJbaV0gKz0gbnUgKiBwdHJbaSAtIHdpZHRoXTsKKworICAgICAgICAgICAgcHRyW2kgPSBudW1waXhlbHMgLSB3aWR0aF0gKj0gYm91bmRhcnlzY2FsZTsKKworICAgICAgICAgICAgLyogRmlsdGVyIHVwd2FyZHMgKi8KKyAgICAgICAgICAgIGZvciAoOyBpID4gMDsgaSAtPSB3aWR0aCkKKyAgICAgICAgICAgICAgICBwdHJbaSAtIHdpZHRoXSArPSBudSAqIHB0cltpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZmlsdGVyX3Bvc3RzY2FsZShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIEdCbHVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gdGQtPmhlaWdodDsKKyAgICBjb25zdCBpbnQgd2lkdGggPSB0ZC0+d2lkdGg7CisgICAgY29uc3QgaW50NjRfdCBudW1waXhlbHMgPSB3aWR0aCAqIChpbnQ2NF90KWhlaWdodDsKKyAgICBjb25zdCB1bnNpZ25lZCBzbGljZV9zdGFydCA9IChudW1waXhlbHMgKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBjb25zdCB1bnNpZ25lZCBzbGljZV9lbmQgICA9IChudW1waXhlbHMgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCBmbG9hdCBwb3N0c2NhbGUgPSBzLT5wb3N0c2NhbGUgKiBzLT5wb3N0c2NhbGVWOworICAgIGZsb2F0ICpidWZmZXIgPSBzLT5idWZmZXI7CisgICAgdW5zaWduZWQgaTsKKworICAgIGZvciAoaSA9IHNsaWNlX3N0YXJ0OyBpIDwgc2xpY2VfZW5kOyBpKyspCisgICAgICAgIGJ1ZmZlcltpXSAqPSBwb3N0c2NhbGU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ2F1c3NpYW5paXIyZChBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IHBsYW5lKQoreworICAgIEdCbHVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBzLT5wbGFuZXdpZHRoW3BsYW5lXTsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcy0+cGxhbmVoZWlnaHRbcGxhbmVdOworICAgIGNvbnN0IGludCBuYl90aHJlYWRzID0gZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCk7CisgICAgVGhyZWFkRGF0YSB0ZDsKKworICAgIGlmIChzLT5zaWdtYSA8PSAwIHx8IHMtPnN0ZXBzIDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdGQud2lkdGggPSB3aWR0aDsKKyAgICB0ZC5oZWlnaHQgPSBoZWlnaHQ7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9ob3Jpem9udGFsbHksICZ0ZCwgTlVMTCwgRkZNSU4oaGVpZ2h0LCBuYl90aHJlYWRzKSk7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl92ZXJ0aWNhbGx5LCAmdGQsIE5VTEwsIEZGTUlOKHdpZHRoLCBuYl90aHJlYWRzKSk7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9wb3N0c2NhbGUsICZ0ZCwgTlVMTCwgRkZNSU4od2lkdGggKiBoZWlnaHQsIG5iX3RocmVhZHMpKTsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LCBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFA5LCBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUlAxNCwgQVZfUElYX0ZNVF9HQlJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRfR0JSQVAxMCwgQVZfUElYX0ZNVF9HQlJBUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTksIEFWX1BJWF9GTVRfR1JBWTEwLCBBVl9QSVhfRk1UX0dSQVkxMiwgQVZfUElYX0ZNVF9HUkFZMTYsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBHQmx1ckNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKworICAgIHMtPmRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBzLT5wbGFuZXdpZHRoWzFdID0gcy0+cGxhbmV3aWR0aFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgcy0+cGxhbmV3aWR0aFswXSA9IHMtPnBsYW5ld2lkdGhbM10gPSBpbmxpbmstPnc7CisgICAgcy0+cGxhbmVoZWlnaHRbMV0gPSBzLT5wbGFuZWhlaWdodFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgcy0+cGxhbmVoZWlnaHRbMF0gPSBzLT5wbGFuZWhlaWdodFszXSA9IGlubGluay0+aDsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKworICAgIHMtPmJ1ZmZlciA9IGF2X21hbGxvY19hcnJheShpbmxpbmstPncsIGlubGluay0+aCAqIHNpemVvZigqcy0+YnVmZmVyKSk7CisgICAgaWYgKCFzLT5idWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAocy0+c2lnbWFWIDwgMCkgeworICAgICAgICBzLT5zaWdtYVYgPSBzLT5zaWdtYTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X3BhcmFtcyhmbG9hdCBzaWdtYSwgaW50IHN0ZXBzLCBmbG9hdCAqcG9zdHNjYWxlLCBmbG9hdCAqYm91bmRhcnlzY2FsZSwgZmxvYXQgKm51KQoreworICAgIGRvdWJsZSBkbnUsIGxhbWJkYTsKKworICAgIGxhbWJkYSA9IChzaWdtYSAqIHNpZ21hKSAvICgyLjAgKiBzdGVwcyk7CisgICAgZG51ID0gKDEuMCArIDIuMCAqIGxhbWJkYSAtIHNxcnQoMS4wICsgNC4wICogbGFtYmRhKSkgLyAoMi4wICogbGFtYmRhKTsKKyAgICAqcG9zdHNjYWxlID0gcG93KGRudSAvIGxhbWJkYSwgc3RlcHMpOworICAgICpib3VuZGFyeXNjYWxlID0gMS4wIC8gKDEuMCAtIGRudSk7CisgICAgKm51ID0gKGZsb2F0KWRudTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgR0JsdXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IHBsYW5lOworCisgICAgc2V0X3BhcmFtcyhzLT5zaWdtYSwgIHMtPnN0ZXBzLCAmcy0+cG9zdHNjYWxlLCAgJnMtPmJvdW5kYXJ5c2NhbGUsICAmcy0+bnUpOworICAgIHNldF9wYXJhbXMocy0+c2lnbWFWLCBzLT5zdGVwcywgJnMtPnBvc3RzY2FsZVYsICZzLT5ib3VuZGFyeXNjYWxlViwgJnMtPm51Vik7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIGNvbnN0IGludCBoZWlnaHQgPSBzLT5wbGFuZWhlaWdodFtwbGFuZV07CisgICAgICAgIGNvbnN0IGludCB3aWR0aCA9IHMtPnBsYW5ld2lkdGhbcGxhbmVdOworICAgICAgICBmbG9hdCAqYnB0ciA9IHMtPmJ1ZmZlcjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0gaW4tPmRhdGFbcGxhbmVdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjMTYgPSAoY29uc3QgdWludDE2X3QgKilpbi0+ZGF0YVtwbGFuZV07CisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dC0+ZGF0YVtwbGFuZV07CisgICAgICAgIHVpbnQxNl90ICpkc3QxNiA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV07CisgICAgICAgIGludCB5LCB4OworCisgICAgICAgIGlmICghcy0+c2lnbWEgfHwgIShzLT5wbGFuZXMgJiAoMSA8PCBwbGFuZSkpKSB7CisgICAgICAgICAgICBpZiAob3V0ICE9IGluKQorICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob3V0LT5kYXRhW3BsYW5lXSwgb3V0LT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVtwbGFuZV0sIGluLT5saW5lc2l6ZVtwbGFuZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAqICgocy0+ZGVwdGggKyA3KSAvIDgpLCBoZWlnaHQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZGVwdGggPT0gOCkgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgYnB0clt4XSA9IHNyY1t4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnB0ciArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBzcmMgKz0gaW4tPmxpbmVzaXplW3BsYW5lXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGJwdHJbeF0gPSBzcmMxNlt4XTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnB0ciArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBzcmMxNiArPSBpbi0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdhdXNzaWFuaWlyMmQoY3R4LCBwbGFuZSk7CisKKyAgICAgICAgYnB0ciA9IHMtPmJ1ZmZlcjsKKyAgICAgICAgaWYgKHMtPmRlcHRoID09IDgpIHsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IGJwdHJbeF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJwdHIgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgZHN0ICs9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0MTZbeF0gPSBicHRyW3hdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicHRyICs9IHdpZHRoOworICAgICAgICAgICAgICAgIGRzdDE2ICs9IG91dC0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXQgIT0gaW4pCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEdCbHVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgZ2JsdXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBnYmx1cl9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfZ2JsdXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiZ2JsdXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IEdhdXNzaWFuIEJsdXIgZmlsdGVyLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEdCbHVyQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmZ2JsdXJfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gZ2JsdXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gZ2JsdXJfb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2dlcS5jIGIvbGliYXZmaWx0ZXIvdmZfZ2VxLmMKaW5kZXggODhkM2I3NS4uMmFhMTI1OSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfZ2VxLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfZ2VxLmMKQEAgLTMzLDE0ICszMywyMSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotdHlwZWRlZiBzdHJ1Y3Qgeworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geyAgICJYIiwgICAiWSIsICAgIlciLCAgICJIIiwgICAiTiIsICAgIlNXIiwgICAiU0giLCAgICJUIiwgICAgICAgIE5VTEwgfTsKK2VudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgVkFSX1gsIFZBUl9ZLCBWQVJfVywgVkFSX0gsIFZBUl9OLCBWQVJfU1csIFZBUl9TSCwgVkFSX1QsIFZBUl9WQVJTX05CIH07CisKK3R5cGVkZWYgc3RydWN0IEdFUUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIEFWRXhwciAqZVs0XTsgICAgICAgICAgICAgICAvLy88IGV4cHJlc3Npb25zIGZvciBlYWNoIHBsYW5lCiAgICAgY2hhciAqZXhwcl9zdHJbNCszXTsgICAgICAgIC8vLzwgZXhwcmVzc2lvbiBzdHJpbmdzIGZvciBlYWNoIHBsYW5lCiAgICAgQVZGcmFtZSAqcGljcmVmOyAgICAgICAgICAgIC8vLzwgY3VycmVudCBpbnB1dCBidWZmZXIKKyAgICB1aW50OF90ICpkc3Q7ICAgICAgICAgICAgICAgLy8vPCByZWZlcmVuY2UgcG9pbnRlciB0byB0aGUgOGJpdHMgb3V0cHV0CisgICAgdWludDE2X3QgKmRzdDE2OyAgICAgICAgICAgIC8vLzwgcmVmZXJlbmNlIHBvaW50ZXIgdG8gdGhlIDE2Yml0cyBvdXRwdXQKKyAgICBkb3VibGUgdmFsdWVzW1ZBUl9WQVJTX05CXTsgLy8vPCBleHByZXNzaW9uIHZhbHVlcwogICAgIGludCBoc3ViLCB2c3ViOyAgICAgICAgICAgICAvLy88IGNocm9tYSBzdWJzYW1wbGluZwogICAgIGludCBwbGFuZXM7ICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBwbGFuZXMKICAgICBpbnQgaXNfcmdiOworICAgIGludCBicHM7CiB9IEdFUUNvbnRleHQ7CiAKIGVudW0geyBZID0gMCwgVSwgViwgQSwgRywgQiwgUiB9OwpAQCAtNzQsNyArODEsNyBAQAogICAgIEdFUUNvbnRleHQgKmdlcSA9IHByaXY7CiAgICAgQVZGcmFtZSAqcGljcmVmID0gZ2VxLT5waWNyZWY7CiAgICAgY29uc3QgdWludDhfdCAqc3JjID0gcGljcmVmLT5kYXRhW3BsYW5lXTsKLSAgICBjb25zdCBpbnQgbGluZXNpemUgPSBwaWNyZWYtPmxpbmVzaXplW3BsYW5lXTsKKyAgICBpbnQgbGluZXNpemUgPSBwaWNyZWYtPmxpbmVzaXplW3BsYW5lXTsKICAgICBjb25zdCBpbnQgdyA9IChwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIpID8gQVZfQ0VJTF9SU0hJRlQocGljcmVmLT53aWR0aCwgIGdlcS0+aHN1YikgOiBwaWNyZWYtPndpZHRoOwogICAgIGNvbnN0IGludCBoID0gKHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMikgPyBBVl9DRUlMX1JTSElGVChwaWNyZWYtPmhlaWdodCwgZ2VxLT52c3ViKSA6IHBpY3JlZi0+aGVpZ2h0OwogCkBAIC04Nyw4ICs5NCwxNiBAQAogICAgIHggLT0geGk7CiAgICAgeSAtPSB5aTsKIAotICAgIHJldHVybiAoMS15KSooKDEteCkqc3JjW3hpICsgIHlpICAgICogbGluZXNpemVdICsgeCpzcmNbeGkgKyAxICsgIHlpICAgICogbGluZXNpemVdKQotICAgICAgICAgICsgICB5ICooKDEteCkqc3JjW3hpICsgKHlpKzEpICogbGluZXNpemVdICsgeCpzcmNbeGkgKyAxICsgKHlpKzEpICogbGluZXNpemVdKTsKKyAgICBpZiAoZ2VxLT5icHMgPiA4KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmMxNiA9IChjb25zdCB1aW50MTZfdCopc3JjOworICAgICAgICBsaW5lc2l6ZSAvPSAyOworCisgICAgICAgIHJldHVybiAoMS15KSooKDEteCkqc3JjMTZbeGkgKyAgeWkgICAgKiBsaW5lc2l6ZV0gKyB4KnNyYzE2W3hpICsgMSArICB5aSAgICAqIGxpbmVzaXplXSkKKyAgICAgICAgICAgICAgKyAgIHkgKigoMS14KSpzcmMxNlt4aSArICh5aSsxKSAqIGxpbmVzaXplXSArIHgqc3JjMTZbeGkgKyAxICsgKHlpKzEpICogbGluZXNpemVdKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gKDEteSkqKCgxLXgpKnNyY1t4aSArICB5aSAgICAqIGxpbmVzaXplXSArIHgqc3JjW3hpICsgMSArICB5aSAgICAqIGxpbmVzaXplXSkKKyAgICAgICAgICAgICAgKyAgIHkgKigoMS14KSpzcmNbeGkgKyAoeWkrMSkgKiBsaW5lc2l6ZV0gKyB4KnNyY1t4aSArIDEgKyAoeWkrMSkgKiBsaW5lc2l6ZV0pOworICAgIH0KIH0KIAogLy9UT0RPOiBjdWJpYyBpbnRlcnBvbGF0ZQpAQCAtOTgsOSArMTEzLDYgQEAKIHN0YXRpYyBkb3VibGUgIGNyKHZvaWQgKnByaXYsIGRvdWJsZSB4LCBkb3VibGUgeSkgeyByZXR1cm4gZ2V0cGl4KHByaXYsIHgsIHksIDIpOyB9CiBzdGF0aWMgZG91YmxlIGFscGhhKHZvaWQgKnByaXYsIGRvdWJsZSB4LCBkb3VibGUgeSkgeyByZXR1cm4gZ2V0cGl4KHByaXYsIHgsIHksIDMpOyB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsgICAiWCIsICAgIlkiLCAgICJXIiwgICAiSCIsICAgIk4iLCAgICJTVyIsICAgIlNIIiwgICAiVCIsICAgICAgICBOVUxMIH07Ci1lbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IFZBUl9YLCBWQVJfWSwgVkFSX1csIFZBUl9ILCBWQVJfTiwgVkFSX1NXLCBWQVJfU0gsIFZBUl9ULCBWQVJfVkFSU19OQiB9OwotCiBzdGF0aWMgYXZfY29sZCBpbnQgZ2VxX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgR0VRQ29udGV4dCAqZ2VxID0gY3R4LT5wcml2OwpAQCAtMTI5LDggKzE0MSwxMSBAQAogICAgICAgICBpZiAoIWdlcS0+ZXhwcl9zdHJbVl0pIGdlcS0+ZXhwcl9zdHJbVl0gPSBhdl9zdHJkdXAoZ2VxLT5leHByX3N0cltVXSk7CiAgICAgfQogCi0gICAgaWYgKCFnZXEtPmV4cHJfc3RyW0FdKQotICAgICAgICBnZXEtPmV4cHJfc3RyW0FdID0gYXZfc3RyZHVwKCIyNTUiKTsKKyAgICBpZiAoIWdlcS0+ZXhwcl9zdHJbQV0pIHsKKyAgICAgICAgY2hhciBicHNfc3RyaW5nWzhdOworICAgICAgICBzbnByaW50ZihicHNfc3RyaW5nLCBzaXplb2YoYnBzX3N0cmluZyksICIlZCIsICgxPDxnZXEtPmJwcykgLSAxKTsKKyAgICAgICAgZ2VxLT5leHByX3N0cltBXSA9IGF2X3N0cmR1cChicHNfc3RyaW5nKTsKKyAgICB9CiAgICAgaWYgKCFnZXEtPmV4cHJfc3RyW0ddKQogICAgICAgICBnZXEtPmV4cHJfc3RyW0ddID0gYXZfc3RyZHVwKCJnKFgsWSkiKTsKICAgICBpZiAoIWdlcS0+ZXhwcl9zdHJbQl0pCkBAIC0xNzEsMTAgKzE4NiwyNyBAQAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsICBBVl9QSVhfRk1UX1lVVjQxMFAsICBBVl9QSVhfRk1UX1lVVjQ0MFAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCiAgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDksICBBVl9QSVhfRk1UX1lVVjQyMlA5LCAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0MjBQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsICBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCAgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE0LCAgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsICBBVl9QSVhfRk1UX1lVVjQyMFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsICBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsIEFWX1BJWF9GTVRfWVVWQTQyMlAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNiwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHJnYl9waXhfZm10c1tdID0gewogICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSQVAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDksCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDE0LAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAxNiwgQVZfUElYX0ZNVF9HQlJBUDE2LAogICAgICAgICBBVl9QSVhfRk1UX05PTkUKICAgICB9OwogICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0OwpAQCAtMTk3LDIwICsyMjksNzcgQEAKIAogICAgIGdlcS0+aHN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CiAgICAgZ2VxLT52c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBnZXEtPmJwcyA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CiAgICAgZ2VxLT5wbGFuZXMgPSBkZXNjLT5uYl9jb21wb25lbnRzOwogICAgIHJldHVybiAwOwogfQogCit0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKKyAgICBpbnQgaGVpZ2h0OworICAgIGludCB3aWR0aDsKKyAgICBpbnQgcGxhbmU7CisgICAgaW50IGxpbmVzaXplOworfSBUaHJlYWREYXRhOworCitzdGF0aWMgaW50IHNsaWNlX2dlcV9maWx0ZXIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBHRVFDb250ZXh0ICpnZXEgPSBjdHgtPnByaXY7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHRkLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHdpZHRoID0gdGQtPndpZHRoOworICAgIGNvbnN0IGludCBwbGFuZSA9IHRkLT5wbGFuZTsKKyAgICBjb25zdCBpbnQgbGluZXNpemUgPSB0ZC0+bGluZXNpemU7CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKGhlaWdodCAqICBqb2JucikgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBzbGljZV9lbmQgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgaW50IHgsIHk7CisgICAgdWludDhfdCAqcHRyOworICAgIHVpbnQxNl90ICpwdHIxNjsKKworICAgIGRvdWJsZSB2YWx1ZXNbVkFSX1ZBUlNfTkJdOworICAgIHZhbHVlc1tWQVJfV10gPSBnZXEtPnZhbHVlc1tWQVJfV107CisgICAgdmFsdWVzW1ZBUl9IXSA9IGdlcS0+dmFsdWVzW1ZBUl9IXTsKKyAgICB2YWx1ZXNbVkFSX05dID0gZ2VxLT52YWx1ZXNbVkFSX05dOworICAgIHZhbHVlc1tWQVJfU1ddID0gZ2VxLT52YWx1ZXNbVkFSX1NXXTsKKyAgICB2YWx1ZXNbVkFSX1NIXSA9IGdlcS0+dmFsdWVzW1ZBUl9TSF07CisgICAgdmFsdWVzW1ZBUl9UXSA9IGdlcS0+dmFsdWVzW1ZBUl9UXTsKKworICAgIGlmIChnZXEtPmJwcyA9PSA4KSB7CisgICAgICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgICAgIHB0ciA9IGdlcS0+ZHN0ICsgbGluZXNpemUgKiB5OworICAgICAgICAgICAgdmFsdWVzW1ZBUl9ZXSA9IHk7CisKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgdmFsdWVzW1ZBUl9YXSA9IHg7CisgICAgICAgICAgICAgICAgcHRyW3hdID0gYXZfZXhwcl9ldmFsKGdlcS0+ZVtwbGFuZV0sIHZhbHVlcywgZ2VxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB0ciArPSBsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworICAgICAgICAgICAgcHRyMTYgPSBnZXEtPmRzdDE2ICsgKGxpbmVzaXplLzIpICogeTsKKyAgICAgICAgICAgIHZhbHVlc1tWQVJfWV0gPSB5OworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXNbVkFSX1hdID0geDsKKyAgICAgICAgICAgICAgICBwdHIxNlt4XSA9IGF2X2V4cHJfZXZhbChnZXEtPmVbcGxhbmVdLCB2YWx1ZXMsIGdlcSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBnZXFfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKIHsKICAgICBpbnQgcGxhbmU7Ci0gICAgR0VRQ29udGV4dCAqZ2VxID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBjb25zdCBpbnQgbmJfdGhyZWFkcyA9IGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpOworICAgIEdFUUNvbnRleHQgKmdlcSA9IGN0eC0+cHJpdjsKICAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBpbmxpbmstPmRzdC0+b3V0cHV0c1swXTsKICAgICBBVkZyYW1lICpvdXQ7Ci0gICAgZG91YmxlIHZhbHVlc1tWQVJfVkFSU19OQl0gPSB7Ci0gICAgICAgIFtWQVJfTl0gPSBpbmxpbmstPmZyYW1lX2NvdW50LAotICAgICAgICBbVkFSX1RdID0gaW4tPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/IE5BTiA6IGluLT5wdHMgKiBhdl9xMmQoaW5saW5rLT50aW1lX2Jhc2UpLAotICAgIH07CisKKyAgICBnZXEtPnZhbHVlc1tWQVJfTl0gPSBpbmxpbmstPmZyYW1lX2NvdW50X291dCwKKyAgICBnZXEtPnZhbHVlc1tWQVJfVF0gPSBpbi0+cHRzID09IEFWX05PUFRTX1ZBTFVFID8gTkFOIDogaW4tPnB0cyAqIGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSksCiAKICAgICBnZXEtPnBpY3JlZiA9IGluOwogICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CkBAIC0yMjEsMjUgKzMxMCwyNSBAQAogICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CiAKICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBnZXEtPnBsYW5lcyAmJiBvdXQtPmRhdGFbcGxhbmVdOyBwbGFuZSsrKSB7Ci0gICAgICAgIGludCB4LCB5OwotICAgICAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGFbcGxhbmVdOworICAgICAgICBjb25zdCBpbnQgd2lkdGggPSAocGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyKSA/IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgZ2VxLT5oc3ViKSA6IGlubGluay0+dzsKKyAgICAgICAgY29uc3QgaW50IGhlaWdodCA9IChwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIpID8gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBnZXEtPnZzdWIpIDogaW5saW5rLT5oOwogICAgICAgICBjb25zdCBpbnQgbGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKLSAgICAgICAgY29uc3QgaW50IHcgPSAocGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyKSA/IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgZ2VxLT5oc3ViKSA6IGlubGluay0+dzsKLSAgICAgICAgY29uc3QgaW50IGggPSAocGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyKSA/IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgZ2VxLT52c3ViKSA6IGlubGluay0+aDsKKyAgICAgICAgVGhyZWFkRGF0YSB0ZDsKIAotICAgICAgICB2YWx1ZXNbVkFSX1ddICA9IHc7Ci0gICAgICAgIHZhbHVlc1tWQVJfSF0gID0gaDsKLSAgICAgICAgdmFsdWVzW1ZBUl9TV10gPSB3IC8gKGRvdWJsZSlpbmxpbmstPnc7Ci0gICAgICAgIHZhbHVlc1tWQVJfU0hdID0gaCAvIChkb3VibGUpaW5saW5rLT5oOworICAgICAgICBnZXEtPmRzdCA9IG91dC0+ZGF0YVtwbGFuZV07CisgICAgICAgIGdlcS0+ZHN0MTYgPSAodWludDE2X3QqKW91dC0+ZGF0YVtwbGFuZV07CiAKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgewotICAgICAgICAgICAgdmFsdWVzW1ZBUl9ZXSA9IHk7Ci0gICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWVzW1ZBUl9YXSA9IHg7Ci0gICAgICAgICAgICAgICAgZHN0W3hdID0gYXZfZXhwcl9ldmFsKGdlcS0+ZVtwbGFuZV0sIHZhbHVlcywgZ2VxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdCArPSBsaW5lc2l6ZTsKLSAgICAgICAgfQorICAgICAgICBnZXEtPnZhbHVlc1tWQVJfV10gID0gd2lkdGg7CisgICAgICAgIGdlcS0+dmFsdWVzW1ZBUl9IXSAgPSBoZWlnaHQ7CisgICAgICAgIGdlcS0+dmFsdWVzW1ZBUl9TV10gPSB3aWR0aCAvIChkb3VibGUpaW5saW5rLT53OworICAgICAgICBnZXEtPnZhbHVlc1tWQVJfU0hdID0gaGVpZ2h0IC8gKGRvdWJsZSlpbmxpbmstPmg7CisKKyAgICAgICAgdGQud2lkdGggPSB3aWR0aDsKKyAgICAgICAgdGQuaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICB0ZC5wbGFuZSA9IHBsYW5lOworICAgICAgICB0ZC5saW5lc2l6ZSA9IGxpbmVzaXplOworCisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBzbGljZV9nZXFfZmlsdGVyLCAmdGQsIE5VTEwsIEZGTUlOKGhlaWdodCwgbmJfdGhyZWFkcykpOwogICAgIH0KIAogICAgIGF2X2ZyYW1lX2ZyZWUoJmdlcS0+cGljcmVmKTsKQEAgLTI4Myw1ICszNzIsNSBAQAogICAgIC5pbnB1dHMgICAgICAgID0gZ2VxX2lucHV0cywKICAgICAub3V0cHV0cyAgICAgICA9IGdlcV9vdXRwdXRzLAogICAgIC5wcml2X2NsYXNzICAgID0gJmdlcV9jbGFzcywKLSAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMgfCBBVkZJTFRFUl9GTEFHX1NMSUNFX1RIUkVBRFMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfZ3JhZGZ1bi5jIGIvbGliYXZmaWx0ZXIvdmZfZ3JhZGZ1bi5jCmluZGV4IGU5YWYyNGYuLmY2MzEyOGQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2dyYWRmdW4uYworKysgYi9saWJhdmZpbHRlci92Zl9ncmFkZnVuLmMKQEAgLTI2LDkgKzI2LDkgQEAKICAqCiAgKiBBcHBseSBhIGJveGJsdXIgZGViYW5kaW5nIGFsZ29yaXRobSAoYmFzZWQgb24gdGhlIGdyYWRmdW4yZGIKICAqIEF2aVN5bnRoIGZpbHRlciBieSBwcnVuZWR0cmVlKS4KLSAqIEZvcmVhY2ggcGl4ZWwsIGlmIGl0J3Mgd2l0aGluIHRocmVzaG9sZCBvZiB0aGUgYmx1cnJlZCB2YWx1ZSwgbWFrZSBpdCBjbG9zZXIuCi0gKiBTbyBub3cgd2UgaGF2ZSBhIHNtb290aGVkIGFuZCBoaWdoZXIgYml0ZGVwdGggdmVyc2lvbiBvZiBhbGwgdGhlIHNoYWxsb3cKLSAqIGdyYWRpZW50cywgd2hpbGUgbGVhdmluZyBkZXRhaWxlZCBhcmVhcyB1bnRvdWNoZWQuCisgKiBGb3IgZWFjaCBwaXhlbCwgaWYgaXQgaXMgd2l0aGluIHRoZSB0aHJlc2hvbGQgb2YgdGhlIGJsdXJyZWQgdmFsdWUsIG1ha2UgaXQKKyAqIGNsb3Nlci4gU28gbm93IHdlIGhhdmUgYSBzbW9vdGhlZCBhbmQgaGlnaGVyIGJpdGRlcHRoIHZlcnNpb24gb2YgYWxsIHRoZQorICogc2hhbGxvdyBncmFkaWVudHMsIHdoaWxlIGxlYXZpbmcgZGV0YWlsZWQgYXJlYXMgdW50b3VjaGVkLgogICogRGl0aGVyIGl0IGJhY2sgdG8gOGJpdC4KICAqLwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9oZmxpcC5jIGIvbGliYXZmaWx0ZXIvdmZfaGZsaXAuYwppbmRleCA2ZjkyMjg0Li5iNzdhZmM3IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9oZmxpcC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2hmbGlwLmMKQEAgLTI2LDggKzI2LDEwIEBACiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJoZmxpcC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAidmlkZW8uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgpAQCAtMzUsMTEgKzM3LDExIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogCi10eXBlZGVmIHN0cnVjdCBGbGlwQ29udGV4dCB7Ci0gICAgaW50IG1heF9zdGVwWzRdOyAgICAvLy88IG1heCBwaXhlbCBzdGVwIGZvciBlYWNoIHBsYW5lLCBleHByZXNzZWQgYXMgYSBudW1iZXIgb2YgYnl0ZXMKLSAgICBpbnQgcGxhbmV3aWR0aFs0XTsgIC8vLzwgd2lkdGggb2YgZWFjaCBwbGFuZQotICAgIGludCBwbGFuZWhlaWdodFs0XTsgLy8vPCBoZWlnaHQgb2YgZWFjaCBwbGFuZQotfSBGbGlwQ29udGV4dDsKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBoZmxpcF9vcHRpb25zW10gPSB7CisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhoZmxpcCk7CiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKQEAgLTU5LDEyICs2MSw3NyBAQAogICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cyk7CiB9CiAKK3N0YXRpYyB2b2lkIGhmbGlwX2J5dGVfYyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHcpCit7CisgICAgaW50IGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKQorICAgICAgICBkc3Rbal0gPSBzcmNbLWpdOworfQorCitzdGF0aWMgdm9pZCBoZmxpcF9zaG9ydF9jKGNvbnN0IHVpbnQ4X3QgKnNzcmMsIHVpbnQ4X3QgKmRkc3QsIGludCB3KQoreworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKilzc3JjOworICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilkZHN0OworICAgIGludCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykKKyAgICAgICAgZHN0W2pdID0gc3JjWy1qXTsKK30KKworc3RhdGljIHZvaWQgaGZsaXBfZHdvcmRfYyhjb25zdCB1aW50OF90ICpzc3JjLCB1aW50OF90ICpkZHN0LCBpbnQgdykKK3sKKyAgICBjb25zdCB1aW50MzJfdCAqc3JjID0gKGNvbnN0IHVpbnQzMl90ICopc3NyYzsKKyAgICB1aW50MzJfdCAqZHN0ID0gKHVpbnQzMl90ICopZGRzdDsKKyAgICBpbnQgajsKKworICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspCisgICAgICAgIGRzdFtqXSA9IHNyY1stal07Cit9CisKK3N0YXRpYyB2b2lkIGhmbGlwX2IyNF9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgdykKK3sKKyAgICBjb25zdCB1aW50OF90ICppbiAgPSBzcmM7CisgICAgdWludDhfdCAqb3V0ID0gZHN0OworICAgIGludCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKywgb3V0ICs9IDMsIGluIC09IDMpIHsKKyAgICAgICAgaW50MzJfdCB2ID0gQVZfUkIyNChpbik7CisKKyAgICAgICAgQVZfV0IyNChvdXQsIHYpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaGZsaXBfYjQ4X2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCB3KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmluICA9IHNyYzsKKyAgICB1aW50OF90ICpvdXQgPSBkc3Q7CisgICAgaW50IGo7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrLCBvdXQgKz0gNiwgaW4gLT0gNikgeworICAgICAgICBpbnQ2NF90IHYgPSBBVl9SQjQ4KGluKTsKKworICAgICAgICBBVl9XQjQ4KG91dCwgdik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoZmxpcF9xd29yZF9jKGNvbnN0IHVpbnQ4X3QgKnNzcmMsIHVpbnQ4X3QgKmRkc3QsIGludCB3KQoreworICAgIGNvbnN0IHVpbnQ2NF90ICpzcmMgPSAoY29uc3QgdWludDY0X3QgKilzc3JjOworICAgIHVpbnQ2NF90ICpkc3QgPSAodWludDY0X3QgKilkZHN0OworICAgIGludCBqOworCisgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykKKyAgICAgICAgZHN0W2pdID0gc3JjWy1qXTsKK30KKwogc3RhdGljIGludCBjb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICppbmxpbmspCiB7CiAgICAgRmxpcENvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CiAgICAgY29uc3QgaW50IGhzdWIgPSBwaXhfZGVzYy0+bG9nMl9jaHJvbWFfdzsKICAgICBjb25zdCBpbnQgdnN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIGludCBuYl9wbGFuZXM7CiAKICAgICBhdl9pbWFnZV9maWxsX21heF9waXhzdGVwcyhzLT5tYXhfc3RlcCwgTlVMTCwgcGl4X2Rlc2MpOwogICAgIHMtPnBsYW5ld2lkdGhbMF0gID0gcy0+cGxhbmV3aWR0aFszXSAgPSBpbmxpbmstPnc7CkBAIC03Miw2ICsxMzksMzAgQEAKICAgICBzLT5wbGFuZWhlaWdodFswXSA9IHMtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOwogICAgIHMtPnBsYW5laGVpZ2h0WzFdID0gcy0+cGxhbmVoZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOwogCisgICAgbmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgcmV0dXJuIGZmX2hmbGlwX2luaXQocywgcy0+bWF4X3N0ZXAsIG5iX3BsYW5lcyk7Cit9CisKK2ludCBmZl9oZmxpcF9pbml0KEZsaXBDb250ZXh0ICpzLCBpbnQgc3RlcFs0XSwgaW50IG5iX3BsYW5lcykKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9wbGFuZXM7IGkrKykgeworICAgICAgICBzd2l0Y2ggKHN0ZXBbaV0pIHsKKyAgICAgICAgY2FzZSAxOiBzLT5mbGlwX2xpbmVbaV0gPSBoZmxpcF9ieXRlX2M7ICBicmVhazsKKyAgICAgICAgY2FzZSAyOiBzLT5mbGlwX2xpbmVbaV0gPSBoZmxpcF9zaG9ydF9jOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBzLT5mbGlwX2xpbmVbaV0gPSBoZmxpcF9iMjRfYzsgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiBzLT5mbGlwX2xpbmVbaV0gPSBoZmxpcF9kd29yZF9jOyBicmVhazsKKyAgICAgICAgY2FzZSA2OiBzLT5mbGlwX2xpbmVbaV0gPSBoZmxpcF9iNDhfYzsgICBicmVhazsKKyAgICAgICAgY2FzZSA4OiBzLT5mbGlwX2xpbmVbaV0gPSBoZmxpcF9xd29yZF9jOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX2hmbGlwX2luaXRfeDg2KHMsIHN0ZXAsIG5iX3BsYW5lcyk7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtODYsNyArMTc3LDcgQEAKICAgICBBVkZyYW1lICppbiA9IHRkLT5pbjsKICAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OwogICAgIHVpbnQ4X3QgKmlucm93LCAqb3V0cm93OwotICAgIGludCBpLCBqLCBwbGFuZSwgc3RlcDsKKyAgICBpbnQgaSwgcGxhbmUsIHN0ZXA7CiAKICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIGluLT5kYXRhW3BsYW5lXSAmJiBpbi0+bGluZXNpemVbcGxhbmVdOyBwbGFuZSsrKSB7CiAgICAgICAgIGNvbnN0IGludCB3aWR0aCAgPSBzLT5wbGFuZXdpZHRoW3BsYW5lXTsKQEAgLTk5LDQ1ICsxOTAsNyBAQAogICAgICAgICBvdXRyb3cgPSBvdXQtPmRhdGFbcGxhbmVdICsgc3RhcnQgKiBvdXQtPmxpbmVzaXplW3BsYW5lXTsKICAgICAgICAgaW5yb3cgID0gaW4gLT5kYXRhW3BsYW5lXSArIHN0YXJ0ICogaW4tPmxpbmVzaXplW3BsYW5lXSArICh3aWR0aCAtIDEpICogc3RlcDsKICAgICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewotICAgICAgICAgICAgc3dpdGNoIChzdGVwKSB7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIG91dHJvd1tqXSA9IGlucm93Wy1qXTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdWludDE2X3QgKm91dHJvdzE2ID0gKHVpbnQxNl90ICopb3V0cm93OwotICAgICAgICAgICAgICAgIHVpbnQxNl90ICogaW5yb3cxNiA9ICh1aW50MTZfdCAqKSBpbnJvdzsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgb3V0cm93MTZbal0gPSBpbnJvdzE2Wy1qXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqaW4gID0gIGlucm93OwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm91dCA9IG91dHJvdzsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKywgb3V0ICs9IDMsIGluIC09IDMpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ID0gQVZfUkIyNChpbik7Ci0gICAgICAgICAgICAgICAgICAgIEFWX1dCMjQob3V0LCB2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRyb3czMiA9ICh1aW50MzJfdCAqKW91dHJvdzsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAqIGlucm93MzIgPSAodWludDMyX3QgKikgaW5yb3c7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCi0gICAgICAgICAgICAgICAgICAgIG91dHJvdzMyW2pdID0gaW5yb3czMlstal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG91dHJvdyArIGoqc3RlcCwgaW5yb3cgLSBqKnN0ZXAsIHN0ZXApOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+ZmxpcF9saW5lW3BsYW5lXShpbnJvdywgb3V0cm93LCB3aWR0aCk7CiAKICAgICAgICAgICAgIGlucm93ICArPSBpbiAtPmxpbmVzaXplW3BsYW5lXTsKICAgICAgICAgICAgIG91dHJvdyArPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKQEAgLTE2Niw3ICsyMTksNyBAQAogICAgICAgICBtZW1jcHkob3V0LT5kYXRhWzFdLCBpbi0+ZGF0YVsxXSwgQVZQQUxFVFRFX1NJWkUpOwogCiAgICAgdGQuaW4gPSBpbiwgdGQub3V0ID0gb3V0OwotICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgRkZNSU4ob3V0bGluay0+aCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgRkZNSU4ob3V0bGluay0+aCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKIAogICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CkBAIC0xOTQsOCArMjQ3LDkgQEAKICAgICAubmFtZSAgICAgICAgICA9ICJoZmxpcCIsCiAgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSG9yaXpvbnRhbGx5IGZsaXAgdGhlIGlucHV0IHZpZGVvLiIpLAogICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEZsaXBDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZoZmxpcF9jbGFzcywKICAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCiAgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9oZmxpcF9pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBhdmZpbHRlcl92Zl9oZmxpcF9vdXRwdXRzLAotICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTIHwgQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfaGlzdGVxLmMgYi9saWJhdmZpbHRlci92Zl9oaXN0ZXEuYwppbmRleCBiM2QyNTQ1Li4yNDQ5ZTEwIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9oaXN0ZXEuYworKysgYi9saWJhdmZpbHRlci92Zl9oaXN0ZXEuYwpAQCAtNTQsNyArNTQsNyBAQAogICAgIEhJU1RFUV9BTlRJQkFORElOR19OQiwKIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IEhpc3RlcUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGZsb2F0IHN0cmVuZ3RoOwogICAgIGZsb2F0IGludGVuc2l0eTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2hpc3RvZ3JhbS5jIGIvbGliYXZmaWx0ZXIvdmZfaGlzdG9ncmFtLmMKaW5kZXggM2E0NzI1Yi4uNTE4NTk5MiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfaGlzdG9ncmFtLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfaGlzdG9ncmFtLmMKQEAgLTM1LDE0ICszNSwxNyBAQAogICAgIGludCAgICAgICAgICAgIGhpc3RvZ3JhbV9zaXplOwogICAgIGludCAgICAgICAgICAgIG11bHQ7CiAgICAgaW50ICAgICAgICAgICAgbmNvbXA7Ci0gICAgY29uc3QgdWludDhfdCAgKmJnX2NvbG9yOwotICAgIGNvbnN0IHVpbnQ4X3QgICpmZ19jb2xvcjsKKyAgICBpbnQgICAgICAgICAgICBkbmNvbXA7CisgICAgdWludDhfdCAgICAgICAgYmdfY29sb3JbNF07CisgICAgdWludDhfdCAgICAgICAgZmdfY29sb3JbNF07CiAgICAgaW50ICAgICAgICAgICAgbGV2ZWxfaGVpZ2h0OwogICAgIGludCAgICAgICAgICAgIHNjYWxlX2hlaWdodDsKICAgICBpbnQgICAgICAgICAgICBkaXNwbGF5X21vZGU7CiAgICAgaW50ICAgICAgICAgICAgbGV2ZWxzX21vZGU7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjLCAqb2Rlc2M7CiAgICAgaW50ICAgICAgICAgICAgY29tcG9uZW50czsKKyAgICBmbG9hdCAgICAgICAgICBmZ29wYWNpdHk7CisgICAgZmxvYXQgICAgICAgICAgYmdvcGFjaXR5OwogICAgIGludCAgICAgICAgICAgIHBsYW5ld2lkdGhbNF07CiAgICAgaW50ICAgICAgICAgICAgcGxhbmVoZWlnaHRbNF07CiB9IEhpc3RvZ3JhbUNvbnRleHQ7CkBAIC01MywxMyArNTYsMjEgQEAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBoaXN0b2dyYW1fb3B0aW9uc1tdID0gewogICAgIHsgImxldmVsX2hlaWdodCIsICJzZXQgbGV2ZWwgaGVpZ2h0IiwgT0ZGU0VUKGxldmVsX2hlaWdodCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MjAwfSwgNTAsIDIwNDgsIEZMQUdTfSwKICAgICB7ICJzY2FsZV9oZWlnaHQiLCAic2V0IHNjYWxlIGhlaWdodCIsIE9GRlNFVChzY2FsZV9oZWlnaHQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTEyfSwgMCwgNDAsIEZMQUdTfSwKLSAgICB7ICJkaXNwbGF5X21vZGUiLCAic2V0IGRpc3BsYXkgbW9kZSIsIE9GRlNFVChkaXNwbGF5X21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAxLCBGTEFHUywgImRpc3BsYXlfbW9kZSJ9LAotICAgIHsgInBhcmFkZSIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEZMQUdTLCAiZGlzcGxheV9tb2RlIiB9LAotICAgIHsgIm92ZXJsYXkiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAiZGlzcGxheV9tb2RlIiB9LAorICAgIHsgImRpc3BsYXlfbW9kZSIsICJzZXQgZGlzcGxheSBtb2RlIiwgT0ZGU0VUKGRpc3BsYXlfbW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDAsIDIsIEZMQUdTLCAiZGlzcGxheV9tb2RlIn0sCisgICAgeyAiZCIsICAgICAgICAgICAgInNldCBkaXNwbGF5IG1vZGUiLCBPRkZTRVQoZGlzcGxheV9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0yfSwgMCwgMiwgRkxBR1MsICJkaXNwbGF5X21vZGUifSwKKyAgICAgICAgeyAib3ZlcmxheSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgRkxBR1MsICJkaXNwbGF5X21vZGUiIH0sCisgICAgICAgIHsgInBhcmFkZSIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEZMQUdTLCAiZGlzcGxheV9tb2RlIiB9LAorICAgICAgICB7ICJzdGFjayIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTJ9LCAwLCAwLCBGTEFHUywgImRpc3BsYXlfbW9kZSIgfSwKICAgICB7ICJsZXZlbHNfbW9kZSIsICJzZXQgbGV2ZWxzIG1vZGUiLCBPRkZTRVQobGV2ZWxzX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUywgImxldmVsc19tb2RlIn0sCi0gICAgeyAibGluZWFyIiwgICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAibGV2ZWxzX21vZGUiIH0sCi0gICAgeyAibG9nYXJpdGhtaWMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEZMQUdTLCAibGV2ZWxzX21vZGUiIH0sCisgICAgeyAibSIsICAgICAgICAgICAic2V0IGxldmVscyBtb2RlIiwgT0ZGU0VUKGxldmVsc19tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1MsICJsZXZlbHNfbW9kZSJ9LAorICAgICAgICB7ICJsaW5lYXIiLCAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgRkxBR1MsICJsZXZlbHNfbW9kZSIgfSwKKyAgICAgICAgeyAibG9nYXJpdGhtaWMiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIDAsIDAsIEZMQUdTLCAibGV2ZWxzX21vZGUiIH0sCiAgICAgeyAiY29tcG9uZW50cyIsICJzZXQgY29sb3IgY29tcG9uZW50cyB0byBkaXNwbGF5IiwgT0ZGU0VUKGNvbXBvbmVudHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTd9LCAxLCAxNSwgRkxBR1N9LAorICAgIHsgImMiLCAgICAgICAgICAic2V0IGNvbG9yIGNvbXBvbmVudHMgdG8gZGlzcGxheSIsIE9GRlNFVChjb21wb25lbnRzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND03fSwgMSwgMTUsIEZMQUdTfSwKKyAgICB7ICJmZ29wYWNpdHkiLCAic2V0IGZvcmVncm91bmQgb3BhY2l0eSIsIE9GRlNFVChmZ29wYWNpdHkpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC43fSwgMCwgMSwgRkxBR1N9LAorICAgIHsgImYiLCAgICAgICAgICJzZXQgZm9yZWdyb3VuZCBvcGFjaXR5IiwgT0ZGU0VUKGZnb3BhY2l0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjd9LCAwLCAxLCBGTEFHU30sCisgICAgeyAiYmdvcGFjaXR5IiwgInNldCBiYWNrZ3JvdW5kIG9wYWNpdHkiLCBPRkZTRVQoYmdvcGFjaXR5KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuNX0sIDAsIDEsIEZMQUdTfSwKKyAgICB7ICJiIiwgICAgICAgICAic2V0IGJhY2tncm91bmQgb3BhY2l0eSIsIE9GRlNFVChiZ29wYWNpdHkpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC41fSwgMCwgMSwgRkxBR1N9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC03NSw4ICs4NiwxMCBAQAogICAgIEFWX1BJWF9GTVRfWVVWQTQyMFA5LCBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMlAxMCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDQwUDEyLAogICAgIEFWX1BJWF9GTVRfR0JSQVAsICAgIEFWX1BJWF9GTVRfR0JSUCwKLSAgICBBVl9QSVhfRk1UX0dCUlA5LCAgICBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICBBVl9QSVhfRk1UX0dCUlA5LCAgICBBVl9QSVhfRk1UX0dCUlAxMCwgIEFWX1BJWF9GTVRfR0JSQVAxMCwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMiwgICBBVl9QSVhfRk1UX0dCUkFQMTIsCiAgICAgQVZfUElYX0ZNVF9HUkFZOCwKICAgICBBVl9QSVhfRk1UX05PTkUKIH07CkBAIC05Niw2ICsxMDksMTEgQEAKICAgICBBVl9QSVhfRk1UX05PTkUKIH07CiAKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbGV2ZWxzX291dF95dXYxMl9waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKwogc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBsZXZlbHNfb3V0X3JnYjhfcGl4X2ZtdHNbXSA9IHsKICAgICBBVl9QSVhfRk1UX0dCUkFQLCAgICBBVl9QSVhfRk1UX0dCUlAsCiAgICAgQVZfUElYX0ZNVF9OT05FCkBAIC0xMDcsNyArMTI1LDEyIEBACiB9OwogCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGxldmVsc19vdXRfcmdiMTBfcGl4X2ZtdHNbXSA9IHsKLSAgICBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMCwgQVZfUElYX0ZNVF9HQlJBUDEwLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBsZXZlbHNfb3V0X3JnYjEyX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSQVAxMiwKICAgICBBVl9QSVhfRk1UX05PTkUKIH07CiAKQEAgLTE0NCwxMiArMTY3LDE4IEBACiAgICAgICAgIG91dF9waXhfZm10cyA9IGxldmVsc19vdXRfcmdiOV9waXhfZm10czsKICAgICBlbHNlIGlmIChyZ2IgJiYgYml0cyA9PSAxMCkKICAgICAgICAgb3V0X3BpeF9mbXRzID0gbGV2ZWxzX291dF9yZ2IxMF9waXhfZm10czsKKyAgICBlbHNlIGlmIChyZ2IgJiYgYml0cyA9PSAxMikKKyAgICAgICAgb3V0X3BpeF9mbXRzID0gbGV2ZWxzX291dF9yZ2IxMl9waXhfZm10czsKICAgICBlbHNlIGlmIChiaXRzID09IDgpCiAgICAgICAgIG91dF9waXhfZm10cyA9IGxldmVsc19vdXRfeXV2OF9waXhfZm10czsKICAgICBlbHNlIGlmIChiaXRzID09IDkpCiAgICAgICAgIG91dF9waXhfZm10cyA9IGxldmVsc19vdXRfeXV2OV9waXhfZm10czsKLSAgICBlbHNlIC8vIGlmIChiaXRzID09IDEwKQorICAgIGVsc2UgaWYgKGJpdHMgPT0gMTApCiAgICAgICAgIG91dF9waXhfZm10cyA9IGxldmVsc19vdXRfeXV2MTBfcGl4X2ZtdHM7CisgICAgZWxzZSBpZiAoYml0cyA9PSAxMikKKyAgICAgICAgb3V0X3BpeF9mbXRzID0gbGV2ZWxzX291dF95dXYxMl9waXhfZm10czsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CiAgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KG91dF9waXhfZm10cyksICZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTE3MSwxOCArMjAwLDI0IEBACiAgICAgaC0+bXVsdCA9IGgtPmhpc3RvZ3JhbV9zaXplIC8gMjU2OwogCiAgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTA6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMDoKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDk6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQOgogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOgotICAgICAgICBoLT5iZ19jb2xvciA9IGJsYWNrX2dicnBfY29sb3I7Ci0gICAgICAgIGgtPmZnX2NvbG9yID0gd2hpdGVfZ2JycF9jb2xvcjsKKyAgICAgICAgbWVtY3B5KGgtPmJnX2NvbG9yLCBibGFja19nYnJwX2NvbG9yLCA0KTsKKyAgICAgICAgbWVtY3B5KGgtPmZnX2NvbG9yLCB3aGl0ZV9nYnJwX2NvbG9yLCA0KTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgaC0+YmdfY29sb3IgPSBibGFja195dXZhX2NvbG9yOwotICAgICAgICBoLT5mZ19jb2xvciA9IHdoaXRlX3l1dmFfY29sb3I7CisgICAgICAgIG1lbWNweShoLT5iZ19jb2xvciwgYmxhY2tfeXV2YV9jb2xvciwgNCk7CisgICAgICAgIG1lbWNweShoLT5mZ19jb2xvciwgd2hpdGVfeXV2YV9jb2xvciwgNCk7CiAgICAgfQogCisgICAgaC0+ZmdfY29sb3JbM10gPSBoLT5mZ29wYWNpdHkgKiAyNTU7CisgICAgaC0+YmdfY29sb3JbM10gPSBoLT5iZ29wYWNpdHkgKiAyNTU7CisKICAgICBoLT5wbGFuZWhlaWdodFsxXSA9IGgtPnBsYW5laGVpZ2h0WzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBoLT5kZXNjLT5sb2cyX2Nocm9tYV9oKTsKICAgICBoLT5wbGFuZWhlaWdodFswXSA9IGgtPnBsYW5laGVpZ2h0WzNdID0gaW5saW5rLT5oOwogICAgIGgtPnBsYW5ld2lkdGhbMV0gID0gaC0+cGxhbmV3aWR0aFsyXSAgPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIGgtPmRlc2MtPmxvZzJfY2hyb21hX3cpOwpAQCAtMjAxLDEwICsyMzYsMTEgQEAKICAgICAgICAgaWYgKCgxIDw8IGkpICYgaC0+Y29tcG9uZW50cykKICAgICAgICAgICAgIG5jb21wKys7CiAgICAgfQotICAgIG91dGxpbmstPncgPSBoLT5oaXN0b2dyYW1fc2l6ZTsKLSAgICBvdXRsaW5rLT5oID0gKGgtPmxldmVsX2hlaWdodCArIGgtPnNjYWxlX2hlaWdodCkgKiBGRk1BWChuY29tcCAqIGgtPmRpc3BsYXlfbW9kZSwgMSk7CisgICAgb3V0bGluay0+dyA9IGgtPmhpc3RvZ3JhbV9zaXplICogRkZNQVgobmNvbXAgKiAoaC0+ZGlzcGxheV9tb2RlID09IDEpLCAxKTsKKyAgICBvdXRsaW5rLT5oID0gKGgtPmxldmVsX2hlaWdodCArIGgtPnNjYWxlX2hlaWdodCkgKiBGRk1BWChuY29tcCAqIChoLT5kaXNwbGF5X21vZGUgPT0gMiksIDEpOwogCiAgICAgaC0+b2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgaC0+ZG5jb21wID0gaC0+b2Rlc2MtPm5iX2NvbXBvbmVudHM7CiAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLDF9OwogCiAgICAgcmV0dXJuIDA7CkBAIC0yNTMsMTEgKzI4OSwxMiBAQAogICAgICAgICBjb25zdCBpbnQgd2lkdGggPSBoLT5wbGFuZXdpZHRoW3BdOwogICAgICAgICBkb3VibGUgbWF4X2h2YWxfbG9nOwogICAgICAgICB1bnNpZ25lZCBtYXhfaHZhbCA9IDA7Ci0gICAgICAgIGludCBzdGFydDsKKyAgICAgICAgaW50IHN0YXJ0LCBzdGFydHg7CiAKICAgICAgICAgaWYgKCEoKDEgPDwgaykgJiBoLT5jb21wb25lbnRzKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBzdGFydCA9IG0rKyAqIChoLT5sZXZlbF9oZWlnaHQgKyBoLT5zY2FsZV9oZWlnaHQpICogaC0+ZGlzcGxheV9tb2RlOworICAgICAgICBzdGFydHggPSBtICogaC0+aGlzdG9ncmFtX3NpemUgKiAoaC0+ZGlzcGxheV9tb2RlID09IDEpOworICAgICAgICBzdGFydCA9IG0rKyAqIChoLT5sZXZlbF9oZWlnaHQgKyBoLT5zY2FsZV9oZWlnaHQpICogKGgtPmRpc3BsYXlfbW9kZSA9PSAyKTsKIAogICAgICAgICBpZiAoaC0+aGlzdG9ncmFtX3NpemUgPD0gMjU2KSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKQEAgLTI3Nyw3ICszMTQsNyBAQAogICAgICAgICAgICAgbWF4X2h2YWwgPSBGRk1BWChtYXhfaHZhbCwgaC0+aGlzdG9ncmFtW2ldKTsKICAgICAgICAgbWF4X2h2YWxfbG9nID0gbG9nMihtYXhfaHZhbCArIDEpOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRsaW5rLT53OyBpKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGgtPmhpc3RvZ3JhbV9zaXplOyBpKyspIHsKICAgICAgICAgICAgIGludCBjb2xfaGVpZ2h0OwogCiAgICAgICAgICAgICBpZiAoaC0+bGV2ZWxzX21vZGUpCkBAIC0yODgsMjcgKzMyNSwyNyBAQAogICAgICAgICAgICAgaWYgKGgtPmhpc3RvZ3JhbV9zaXplIDw9IDI1NikgewogICAgICAgICAgICAgICAgIGZvciAoaiA9IGgtPmxldmVsX2hlaWdodCAtIDE7IGogPj0gY29sX2hlaWdodDsgai0tKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChoLT5kaXNwbGF5X21vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBoLT5uY29tcDsgbCsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtsXVsoaiArIHN0YXJ0KSAqIG91dC0+bGluZXNpemVbbF0gKyBpXSA9IGgtPmZnX2NvbG9yW2xdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IGgtPmRuY29tcDsgbCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtsXVsoaiArIHN0YXJ0KSAqIG91dC0+bGluZXNpemVbbF0gKyBzdGFydHggKyBpXSA9IGgtPmZnX2NvbG9yW2xdOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhW3BdWyhqICsgc3RhcnQpICogb3V0LT5saW5lc2l6ZVtwXSArIGldID0gMjU1OworICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhW3BdWyhqICsgc3RhcnQpICogb3V0LT5saW5lc2l6ZVtwXSArIHN0YXJ0eCArIGldID0gMjU1OwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZvciAoaiA9IGgtPmxldmVsX2hlaWdodCArIGgtPnNjYWxlX2hlaWdodCAtIDE7IGogPj0gaC0+bGV2ZWxfaGVpZ2h0OyBqLS0pCi0gICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtwXVsoaiArIHN0YXJ0KSAqIG91dC0+bGluZXNpemVbcF0gKyBpXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtwXVsoaiArIHN0YXJ0KSAqIG91dC0+bGluZXNpemVbcF0gKyBzdGFydHggKyBpXSA9IGk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCBtdWx0ID0gaC0+bXVsdDsKIAogICAgICAgICAgICAgICAgIGZvciAoaiA9IGgtPmxldmVsX2hlaWdodCAtIDE7IGogPj0gY29sX2hlaWdodDsgai0tKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChoLT5kaXNwbGF5X21vZGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBoLT5uY29tcDsgbCsrKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dOMTYob3V0LT5kYXRhW2xdICsgKGogKyBzdGFydCkgKiBvdXQtPmxpbmVzaXplW2xdICsgaSAqIDIsIGgtPmZnX2NvbG9yW2xdICogbXVsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgaC0+ZG5jb21wOyBsKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfV04xNihvdXQtPmRhdGFbbF0gKyAoaiArIHN0YXJ0KSAqIG91dC0+bGluZXNpemVbbF0gKyBzdGFydHggKiAyICsgaSAqIDIsIGgtPmZnX2NvbG9yW2xdICogbXVsdCk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVl9XTjE2KG91dC0+ZGF0YVtwXSArIChqICsgc3RhcnQpICogb3V0LT5saW5lc2l6ZVtwXSArIGkgKiAyLCAyNTUgKiBtdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWX1dOMTYob3V0LT5kYXRhW3BdICsgKGogKyBzdGFydCkgKiBvdXQtPmxpbmVzaXplW3BdICsgc3RhcnR4ICogMiArIGkgKiAyLCAyNTUgKiBtdWx0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGogPSBoLT5sZXZlbF9oZWlnaHQgKyBoLT5zY2FsZV9oZWlnaHQgLSAxOyBqID49IGgtPmxldmVsX2hlaWdodDsgai0tKQotICAgICAgICAgICAgICAgICAgICBBVl9XTjE2KG91dC0+ZGF0YVtwXSArIChqICsgc3RhcnQpICogb3V0LT5saW5lc2l6ZVtwXSArIGkgKiAyLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgQVZfV04xNihvdXQtPmRhdGFbcF0gKyAoaiArIHN0YXJ0KSAqIG91dC0+bGluZXNpemVbcF0gKyBzdGFydHggKiAyICsgaSAqIDIsIGkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2hxZG4zZC5jIGIvbGliYXZmaWx0ZXIvdmZfaHFkbjNkLmMKaW5kZXggM2ZiNjlmYy4uZDZjMTRiYiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfaHFkbjNkLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfaHFkbjNkLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHNzdHJpZGUsIGludCBkc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNwYXRpYWwsIGludDE2X3QgKnRlbXBvcmFsLCBpbnQgZGVwdGgpCiB7Ci0gICAgLy8gRklYTUU6IEZvciAxNmJpdCBkZXB0aCwgZnJhbWVfYW50IGNvdWxkIGJlIGEgcG9pbnRlciB0byB0aGUgcHJldmlvdXMKKyAgICAvLyBGSVhNRTogRm9yIDE2LWJpdCBkZXB0aCwgZnJhbWVfYW50IGNvdWxkIGJlIGEgcG9pbnRlciB0byB0aGUgcHJldmlvdXMKICAgICAvLyBmaWx0ZXJlZCBmcmFtZSByYXRoZXIgdGhhbiBhIHNlcGFyYXRlIGJ1ZmZlci4KICAgICBsb25nIHgsIHk7CiAgICAgdWludDE2X3QgKmZyYW1lX2FudCA9ICpmcmFtZV9hbnRfcHRyOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfaHF4LmMgYi9saWJhdmZpbHRlci92Zl9ocXguYwppbmRleCBkMWUzNjBmLi4xNmExYmU3IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9ocXguYworKysgYi9saWJhdmZpbHRlci92Zl9ocXguYwpAQCAtMzQsNyArMzQsNyBAQAogCiB0eXBlZGVmIGludCAoKmhxeGZ1bmNfdCkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icyk7CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IEhRWENvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCBuOwogICAgIGhxeGZ1bmNfdCBmdW5jOwpAQCAtNTAyLDcgKzUwMiw3IEBACiAgICAgdGQuaW4gPSBpbjsKICAgICB0ZC5vdXQgPSBvdXQ7CiAgICAgdGQucmdidG95dXYgPSBocXgtPnJnYnRveXV2OwotICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBocXgtPmZ1bmMsICZ0ZCwgTlVMTCwgRkZNSU4oaW5saW5rLT5oLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGhxeC0+ZnVuYywgJnRkLCBOVUxMLCBGRk1JTihpbmxpbmstPmgsIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAKICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfaHVlLmMgYi9saWJhdmZpbHRlci92Zl9odWUuYwppbmRleCBiNWQ3MjEzLi40NWE1YTFhIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9odWUuYworKysgYi9saWJhdmZpbHRlci92Zl9odWUuYwpAQCAtNTcsNyArNTcsNyBAQAogICAgIFZBUl9OQgogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgSHVlQ29udGV4dCB7CiAgICAgY29uc3QgICAgQVZDbGFzcyAqY2xhc3M7CiAgICAgZmxvYXQgICAgaHVlX2RlZzsgLyogaHVlIGV4cHJlc3NlZCBpbiBkZWdyZWVzICovCiAgICAgZmxvYXQgICAgaHVlOyAvKiBodWUgZXhwcmVzc2VkIGluIHJhZGlhbnMgKi8KQEAgLTMxOCw3ICszMTgsNyBAQAogICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHBpYywgaW5waWMpOwogICAgIH0KIAotICAgIGh1ZS0+dmFyX3ZhbHVlc1tWQVJfTl0gICA9IGlubGluay0+ZnJhbWVfY291bnQ7CisgICAgaHVlLT52YXJfdmFsdWVzW1ZBUl9OXSAgID0gaW5saW5rLT5mcmFtZV9jb3VudF9vdXQ7CiAgICAgaHVlLT52YXJfdmFsdWVzW1ZBUl9UXSAgID0gVFMyVChpbnBpYy0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSk7CiAgICAgaHVlLT52YXJfdmFsdWVzW1ZBUl9QVFNdID0gVFMyRChpbnBpYy0+cHRzKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfaHdkb3dubG9hZC5jIGIvbGliYXZmaWx0ZXIvdmZfaHdkb3dubG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYWYzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9od2Rvd25sb2FkLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgSFdEb3dubG9hZENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgQVZCdWZmZXJSZWYgICAgICAgKmh3ZnJhbWVzX3JlZjsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqaHdmcmFtZXM7Cit9IEhXRG93bmxvYWRDb250ZXh0OworCitzdGF0aWMgaW50IGh3ZG93bmxvYWRfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAgKmluZm10cyA9IE5VTEw7CisgICAgQVZGaWx0ZXJGb3JtYXRzICpvdXRmbXRzID0gTlVMTDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisgICAgaW50IGVycjsKKworICAgIGZvciAoZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19uZXh0KE5VTEwpOyBkZXNjOworICAgICAgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19uZXh0KGRlc2MpKSB7CisgICAgICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMKQorICAgICAgICAgICAgZXJyID0gZmZfYWRkX2Zvcm1hdCgmaW5mbXRzLCAgYXZfcGl4X2ZtdF9kZXNjX2dldF9pZChkZXNjKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGVyciA9IGZmX2FkZF9mb3JtYXQoJm91dGZtdHMsIGF2X3BpeF9mbXRfZGVzY19nZXRfaWQoZGVzYykpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBmZl9mb3JtYXRzX3VucmVmKCZpbmZtdHMpOworICAgICAgICAgICAgZmZfZm9ybWF0c191bnJlZigmb3V0Zm10cyk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChlcnIgPSBmZl9mb3JtYXRzX3JlZihpbmZtdHMsICAmYXZjdHgtPmlucHV0c1swXS0+b3V0X2Zvcm1hdHMpKSA8IDAgfHwKKyAgICAgICAgKGVyciA9IGZmX2Zvcm1hdHNfcmVmKG91dGZtdHMsICZhdmN0eC0+b3V0cHV0c1swXS0+aW5fZm9ybWF0cykpIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh3ZG93bmxvYWRfY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqYXZjdHggPSBpbmxpbmstPmRzdDsKKyAgICBIV0Rvd25sb2FkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aHdmcmFtZXNfcmVmKTsKKworICAgIGlmICghaW5saW5rLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRoZSBpbnB1dCBtdXN0IGhhdmUgYSBoYXJkd2FyZSBmcmFtZSAiCisgICAgICAgICAgICAgICAicmVmZXJlbmNlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY3R4LT5od2ZyYW1lc19yZWYgPSBhdl9idWZmZXJfcmVmKGlubGluay0+aHdfZnJhbWVzX2N0eCk7CisgICAgaWYgKCFjdHgtPmh3ZnJhbWVzX3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+aHdmcmFtZXMgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWN0eC0+aHdmcmFtZXNfcmVmLT5kYXRhOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHdkb3dubG9hZF9jb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmF2Y3R4ID0gb3V0bGluay0+c3JjOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rICAgPSBhdmN0eC0+aW5wdXRzWzBdOworICAgIEhXRG93bmxvYWRDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZvcm1hdHM7CisgICAgaW50IGVyciwgaSwgZm91bmQ7CisKKyAgICBpZiAoIWN0eC0+aHdmcmFtZXNfcmVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgZXJyID0gYXZfaHdmcmFtZV90cmFuc2Zlcl9nZXRfZm9ybWF0cyhjdHgtPmh3ZnJhbWVzX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0hXRlJBTUVfVFJBTlNGRVJfRElSRUNUSU9OX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0cywgMCk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBmb3VuZCA9IDA7CisgICAgZm9yIChpID0gMDsgZm9ybWF0c1tpXSAhPSBBVl9QSVhfRk1UX05PTkU7IGkrKykgeworICAgICAgICBpZiAoZm9ybWF0c1tpXSA9PSBvdXRsaW5rLT5mb3JtYXQpIHsKKyAgICAgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWVwKCZmb3JtYXRzKTsKKworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBvdXRwdXQgZm9ybWF0ICVzIGZvciBod2ZyYW1lICIKKyAgICAgICAgICAgICAgICJkb3dubG9hZC5cbiIsIGF2X2dldF9waXhfZm10X25hbWUob3V0bGluay0+Zm9ybWF0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgb3V0bGluay0+dyA9IGlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHdkb3dubG9hZF9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbnB1dCkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmF2Y3R4ID0gbGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAgKm91dGxpbmsgPSBhdmN0eC0+b3V0cHV0c1swXTsKKyAgICBIV0Rvd25sb2FkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0cHV0ID0gTlVMTDsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKCFjdHgtPmh3ZnJhbWVzX3JlZiB8fCAhaW5wdXQtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW5wdXQgZnJhbWVzIG11c3QgaGF2ZSBoYXJkd2FyZSBjb250ZXh0LlxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoKHZvaWQqKWN0eC0+aHdmcmFtZXMgIT0gaW5wdXQtPmh3X2ZyYW1lc19jdHgtPmRhdGEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW5wdXQgZnJhbWUgaXMgbm90IHRoZSBpbiB0aGUgY29uZmlndXJlZCAiCisgICAgICAgICAgICAgICAiaHdmcmFtZSBjb250ZXh0LlxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG91dHB1dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgY3R4LT5od2ZyYW1lcy0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmh3ZnJhbWVzLT5oZWlnaHQpOworICAgIGlmICghb3V0cHV0KSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IGF2X2h3ZnJhbWVfdHJhbnNmZXJfZGF0YShvdXRwdXQsIGlucHV0LCAwKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZG93bmxvYWQgZnJhbWU6ICVkLlxuIiwgZXJyKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG91dHB1dC0+d2lkdGggID0gb3V0bGluay0+dzsKKyAgICBvdXRwdXQtPmhlaWdodCA9IG91dGxpbmstPmg7CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHB1dCwgaW5wdXQpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dCk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGF2Y3R4LT5vdXRwdXRzWzBdLCBvdXRwdXQpOworCitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmlucHV0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXQpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgaHdkb3dubG9hZF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIV0Rvd25sb2FkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aHdmcmFtZXNfcmVmKTsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaHdkb3dubG9hZF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJod2Rvd25sb2FkIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gTlVMTCwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBod2Rvd25sb2FkX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGh3ZG93bmxvYWRfY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gaHdkb3dubG9hZF9maWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGh3ZG93bmxvYWRfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGh3ZG93bmxvYWRfY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9od2Rvd25sb2FkID0geworICAgIC5uYW1lICAgICAgICAgID0gImh3ZG93bmxvYWQiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkRvd25sb2FkIGEgaGFyZHdhcmUgZnJhbWUgdG8gYSBub3JtYWwgZnJhbWUiKSwKKyAgICAudW5pbml0ICAgICAgICA9IGh3ZG93bmxvYWRfdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gaHdkb3dubG9hZF9xdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKEhXRG93bmxvYWRDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZod2Rvd25sb2FkX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICAgID0gaHdkb3dubG9hZF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBod2Rvd25sb2FkX291dHB1dHMsCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9od21hcC5jIGIvbGliYXZmaWx0ZXIvdmZfaHdtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTA1NTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfaHdtYXAuYwpAQCAtMCwwICsxLDQzMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2J1ZmZlci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IEhXTWFwQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBBVkJ1ZmZlclJlZiAgICpod2ZyYW1lc19yZWY7CisKKyAgICBpbnQgICAgICAgICAgICBtb2RlOworICAgIGNoYXIgICAgICAgICAgKmRlcml2ZV9kZXZpY2VfdHlwZTsKKyAgICBpbnQgICAgICAgICAgICByZXZlcnNlOworfSBIV01hcENvbnRleHQ7CisKK3N0YXRpYyBpbnQgaHdtYXBfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX2Zvcm1hdHNfcmVmKGZmX2FsbF9mb3JtYXRzKEFWTUVESUFfVFlQRV9WSURFTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZjdHgtPmlucHV0c1swXS0+b3V0X2Zvcm1hdHMpKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX2Zvcm1hdHNfcmVmKGZmX2FsbF9mb3JtYXRzKEFWTUVESUFfVFlQRV9WSURFTyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBod21hcF9jb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmF2Y3R4ID0gb3V0bGluay0+c3JjOworICAgIEhXTWFwQ29udGV4dCAgICAgICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgICAqaW5saW5rID0gYXZjdHgtPmlucHV0c1swXTsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqaHdmYzsKKyAgICBBVkJ1ZmZlclJlZiAqZGV2aWNlOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBpbnQgZXJyLCBkZXZpY2VfaXNfZGVyaXZlZDsKKworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiQ29uZmlndXJlIGh3bWFwICVzIC0+ICVzLlxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbmxpbmstPmZvcm1hdCksCisgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUob3V0bGluay0+Zm9ybWF0KSk7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aHdmcmFtZXNfcmVmKTsKKworICAgIGRldmljZSA9IGF2Y3R4LT5od19kZXZpY2VfY3R4OworICAgIGRldmljZV9pc19kZXJpdmVkID0gMDsKKworICAgIGlmIChpbmxpbmstPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgaHdmYyA9IChBVkhXRnJhbWVzQ29udGV4dCopaW5saW5rLT5od19mcmFtZXNfY3R4LT5kYXRhOworCisgICAgICAgIGlmIChjdHgtPmRlcml2ZV9kZXZpY2VfdHlwZSkgeworICAgICAgICAgICAgZW51bSBBVkhXRGV2aWNlVHlwZSB0eXBlOworCisgICAgICAgICAgICB0eXBlID0gYXZfaHdkZXZpY2VfZmluZF90eXBlX2J5X25hbWUoY3R4LT5kZXJpdmVfZGV2aWNlX3R5cGUpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gQVZfSFdERVZJQ0VfVFlQRV9OT05FKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGRldmljZSB0eXBlLlxuIik7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXJyID0gYXZfaHdkZXZpY2VfY3R4X2NyZWF0ZV9kZXJpdmVkKCZkZXZpY2UsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdmYy0+ZGV2aWNlX3JlZiwgMCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZWQgZGVyaXZlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJkZXZpY2UgY29udGV4dDogJWQuXG4iLCBlcnIpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZV9pc19kZXJpdmVkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgICAgIGlmICghZGVzYykgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlubGluay0+Zm9ybWF0ID09IGh3ZmMtPmZvcm1hdCAmJgorICAgICAgICAgICAgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpICYmCisgICAgICAgICAgICAhY3R4LT5yZXZlcnNlKSB7CisgICAgICAgICAgICAvLyBNYXAgYmV0d2VlbiB0d28gaGFyZHdhcmUgZm9ybWF0cyAoaW5jbHVkaW5nIHRoZSBjYXNlIG9mCisgICAgICAgICAgICAvLyB1bmRvaW5nIGFuIGV4aXN0aW5nIG1hcHBpbmcpLgorCisgICAgICAgICAgICBpZiAoIWRldmljZSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiQSBkZXZpY2UgcmVmZXJlbmNlIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIHRvIG1hcCB0byBhIGhhcmR3YXJlIGZvcm1hdC5cbiIpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVyciA9IGF2X2h3ZnJhbWVfY3R4X2NyZWF0ZV9kZXJpdmVkKCZjdHgtPmh3ZnJhbWVzX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+aHdfZnJhbWVzX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bW9kZSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXJpdmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZyYW1lcyBjb250ZXh0OiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoaW5saW5rLT5mb3JtYXQgPT0gaHdmYy0+Zm9ybWF0ICYmCisgICAgICAgICAgICAgICAgICAgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpICYmCisgICAgICAgICAgICAgICAgICAgY3R4LT5yZXZlcnNlKSB7CisgICAgICAgICAgICAvLyBNYXAgYmV0d2VlbiB0d28gaGFyZHdhcmUgZm9ybWF0cywgYnV0IGRvIGl0IGluIHJldmVyc2UuCisgICAgICAgICAgICAvLyBNYWtlIGEgbmV3IGh3ZnJhbWUgY29udGV4dCBmb3IgdGhlIHRhcmdldCB0eXBlLCBhbmQgdGhlbgorICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSBpbnB1dCBod2ZyYW1lIGNvbnRleHQgd2l0aCBhIGRlcml2ZWQgY29udGV4dAorICAgICAgICAgICAgLy8gbWFwcGVkIGZyb20gdGhhdCBiYWNrIHRvIHRoZSBzb3VyY2UgdHlwZS4KKyAgICAgICAgICAgIEFWQnVmZmVyUmVmICpzb3VyY2U7CisgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAqZnJhbWVzOworCisgICAgICAgICAgICBjdHgtPmh3ZnJhbWVzX3JlZiA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGRldmljZSk7CisgICAgICAgICAgICBpZiAoIWN0eC0+aHdmcmFtZXNfcmVmKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lcyA9IChBVkhXRnJhbWVzQ29udGV4dCopY3R4LT5od2ZyYW1lc19yZWYtPmRhdGE7CisKKyAgICAgICAgICAgIGZyYW1lcy0+Zm9ybWF0ICAgID0gb3V0bGluay0+Zm9ybWF0OworICAgICAgICAgICAgZnJhbWVzLT5zd19mb3JtYXQgPSBod2ZjLT5zd19mb3JtYXQ7CisgICAgICAgICAgICBmcmFtZXMtPndpZHRoICAgICA9IGh3ZmMtPndpZHRoOworICAgICAgICAgICAgZnJhbWVzLT5oZWlnaHQgICAgPSBod2ZjLT5oZWlnaHQ7CisKKyAgICAgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFfaHdfZnJhbWVzID49IDApCisgICAgICAgICAgICAgICAgZnJhbWVzLT5pbml0aWFsX3Bvb2xfc2l6ZSA9IDIgKyBhdmN0eC0+ZXh0cmFfaHdfZnJhbWVzOworCisgICAgICAgICAgICBlcnIgPSBhdl9od2ZyYW1lX2N0eF9pbml0KGN0eC0+aHdmcmFtZXNfcmVmKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdGlhbGlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQgZnJhbWVzIGNvbnRleHQ6ICVkLlxuIiwgZXJyKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVyciA9IGF2X2h3ZnJhbWVfY3R4X2NyZWF0ZV9kZXJpdmVkKCZzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3ZmMtPmRldmljZV9yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmh3ZnJhbWVzX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+bW9kZSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJkZXJpdmVkIHNvdXJjZSBmcmFtZXMgY29udGV4dDogJWQuXG4iLCBlcnIpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSGVyZSBpcyB0aGUgbmF1Z2h0eSBiaXQuICBUaGlzIG92ZXJ3cml0aW5nIGNoYW5nZXMgd2hhdAorICAgICAgICAgICAgLy8gZmZfZ2V0X3ZpZGVvX2J1ZmZlcigpIGluIHRoZSBwcmV2aW91cyBmaWx0ZXIgcmV0dXJucyAtCisgICAgICAgICAgICAvLyBpdCB3aWxsIG5vdyBnaXZlIGEgZnJhbWUgYWxsb2NhdGVkIGhlcmUgbWFwcGVkIGJhY2sgdG8KKyAgICAgICAgICAgIC8vIHRoZSBmb3JtYXQgaXQgZXhwZWN0cy4gIElmIHRoZXJlIHdlcmUgYW55IGFkZGl0aW9uYWwKKyAgICAgICAgICAgIC8vIGNvbnN0cmFpbnRzIG9uIHRoZSBvdXRwdXQgZnJhbWVzIHRoZXJlIHRoZW4gdGhpcyBtYXkKKyAgICAgICAgICAgIC8vIGJyZWFrIG5hc3RpbHkuCisgICAgICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmlubGluay0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICBpbmxpbmstPmh3X2ZyYW1lc19jdHggPSBzb3VyY2U7CisKKyAgICAgICAgfSBlbHNlIGlmICgob3V0bGluay0+Zm9ybWF0ID09IGh3ZmMtPmZvcm1hdCAmJgorICAgICAgICAgICAgICAgICAgICBpbmxpbmstPmZvcm1hdCAgPT0gaHdmYy0+c3dfZm9ybWF0KSB8fAorICAgICAgICAgICAgICAgICAgIGlubGluay0+Zm9ybWF0ID09IGh3ZmMtPmZvcm1hdCkgeworICAgICAgICAgICAgLy8gTWFwIGZyb20gYSBoYXJkd2FyZSBmb3JtYXQgdG8gYSBzb2Z0d2FyZSBmb3JtYXQsIG9yCisgICAgICAgICAgICAvLyB1bmRvIGFuIGV4aXN0aW5nIHN1Y2ggbWFwcGluZy4KKworICAgICAgICAgICAgY3R4LT5od2ZyYW1lc19yZWYgPSBhdl9idWZmZXJfcmVmKGlubGluay0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgICAgICBpZiAoIWN0eC0+aHdmcmFtZXNfcmVmKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm9uLW1hdGNoaW5nIGZvcm1hdHMgLSBub3Qgc3VwcG9ydGVkLgorCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGZvcm1hdHMgZm9yICIKKyAgICAgICAgICAgICAgICAgICAiaHdtYXA6IGZyb20gJXMgKCVzKSB0byAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbmxpbmstPmZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShod2ZjLT5mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUob3V0bGluay0+Zm9ybWF0KSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGF2Y3R4LT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgIC8vIE1hcCBmcm9tIGEgc29mdHdhcmUgZm9ybWF0IHRvIGEgaGFyZHdhcmUgZm9ybWF0LiAgVGhpcworICAgICAgICAvLyBjcmVhdGVzIGEgbmV3IGh3ZnJhbWUgY29udGV4dCBsaWtlIGh3dXBsb2FkLCBidXQgdGhlbgorICAgICAgICAvLyByZXR1cm5zIGZyYW1lcyBtYXBwZWQgZnJvbSB0aGF0IHRvIHRoZSBwcmV2aW91cyBsaW5rIGluCisgICAgICAgIC8vIG9yZGVyIHRvIGZpbGwgdGhlbSB3aXRob3V0IGFuIGFkZGl0aW9uYWwgY29weS4KKworICAgICAgICBpZiAoIWRldmljZSkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJBIGRldmljZSByZWZlcmVuY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCB0byBjcmVhdGUgbmV3IGZyYW1lcyB3aXRoIHJldmVyc2UgIgorICAgICAgICAgICAgICAgICAgICJtYXBwaW5nLlxuIik7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBjdHgtPnJldmVyc2UgPSAxOworCisgICAgICAgIGN0eC0+aHdmcmFtZXNfcmVmID0gYXZfaHdmcmFtZV9jdHhfYWxsb2MoZGV2aWNlKTsKKyAgICAgICAgaWYgKCFjdHgtPmh3ZnJhbWVzX3JlZikgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGh3ZmMgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWN0eC0+aHdmcmFtZXNfcmVmLT5kYXRhOworCisgICAgICAgIGh3ZmMtPmZvcm1hdCAgICA9IG91dGxpbmstPmZvcm1hdDsKKyAgICAgICAgaHdmYy0+c3dfZm9ybWF0ID0gaW5saW5rLT5mb3JtYXQ7CisgICAgICAgIGh3ZmMtPndpZHRoICAgICA9IGlubGluay0+dzsKKyAgICAgICAgaHdmYy0+aGVpZ2h0ICAgID0gaW5saW5rLT5oOworCisgICAgICAgIGlmIChhdmN0eC0+ZXh0cmFfaHdfZnJhbWVzID49IDApCisgICAgICAgICAgICBod2ZjLT5pbml0aWFsX3Bvb2xfc2l6ZSA9IDIgKyBhdmN0eC0+ZXh0cmFfaHdfZnJhbWVzOworCisgICAgICAgIGVyciA9IGF2X2h3ZnJhbWVfY3R4X2luaXQoY3R4LT5od2ZyYW1lc19yZWYpOworICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGZyYW1lICIKKyAgICAgICAgICAgICAgICAgICAiY29udGV4dCBmb3IgcmV2ZXJzZSBtYXBwaW5nOiAlZC5cbiIsIGVycik7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTWFwcGluZyByZXF1aXJlcyBhIGhhcmR3YXJlICIKKyAgICAgICAgICAgICAgICJjb250ZXh0IChhIGRldmljZSwgb3IgZnJhbWVzIG9uIGlucHV0KS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG91dGxpbmstPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKGN0eC0+aHdmcmFtZXNfcmVmKTsKKyAgICBpZiAoIW91dGxpbmstPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb3V0bGluay0+dyA9IGlubGluay0+dzsKKyAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oOworCisgICAgaWYgKGRldmljZV9pc19kZXJpdmVkKQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmRldmljZSk7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaWYgKGRldmljZV9pc19kZXJpdmVkKQorICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmRldmljZSk7CisgICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPmh3ZnJhbWVzX3JlZik7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIEFWRnJhbWUgKmh3bWFwX2dldF9idWZmZXIoQVZGaWx0ZXJMaW5rICppbmxpbmssIGludCB3LCBpbnQgaCkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmF2Y3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICAqb3V0bGluayA9IGF2Y3R4LT5vdXRwdXRzWzBdOworICAgIEhXTWFwQ29udGV4dCAgICAgICpjdHggPSBhdmN0eC0+cHJpdjsKKworICAgIGlmIChjdHgtPnJldmVyc2UgJiYgIWlubGluay0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBBVkZyYW1lICpzcmMsICpkc3Q7CisgICAgICAgIGludCBlcnI7CisKKyAgICAgICAgc3JjID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCB3LCBoKTsKKyAgICAgICAgaWYgKCFzcmMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNvdXJjZSAiCisgICAgICAgICAgICAgICAgICAgImZyYW1lIGZvciBzb2Z0d2FyZSBtYXBwaW5nLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghZHN0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZzcmMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBhdl9od2ZyYW1lX21hcChkc3QsIHNyYywgY3R4LT5tb2RlKTsKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbWFwIGZyYW1lIHRvICIKKyAgICAgICAgICAgICAgICAgICAic29mdHdhcmU6ICVkLlxuIiwgZXJyKTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnNyYyk7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZkc3QpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzcmMpOworICAgICAgICByZXR1cm4gZHN0OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmZl9kZWZhdWx0X2dldF92aWRlb19idWZmZXIoaW5saW5rLCB3LCBoKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgaHdtYXBfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqaW5wdXQpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICphdmN0eCA9IGxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgICpvdXRsaW5rID0gYXZjdHgtPm91dHB1dHNbMF07CisgICAgSFdNYXBDb250ZXh0ICAgICAgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIEFWRnJhbWUgKm1hcCA9IE5VTEw7CisgICAgaW50IGVycjsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkZpbHRlciBpbnB1dDogJXMsICV1eCV1ICglIlBSSWQ2NCIpLlxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbnB1dC0+Zm9ybWF0KSwKKyAgICAgICAgICAgaW5wdXQtPndpZHRoLCBpbnB1dC0+aGVpZ2h0LCBpbnB1dC0+cHRzKTsKKworICAgIG1hcCA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFtYXApIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgbWFwLT5mb3JtYXQgPSBvdXRsaW5rLT5mb3JtYXQ7CisgICAgbWFwLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihjdHgtPmh3ZnJhbWVzX3JlZik7CisgICAgaWYgKCFtYXAtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGN0eC0+cmV2ZXJzZSAmJiAhaW5wdXQtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgLy8gSWYgd2UgbWFwcGVkIGJhY2t3YXJkcyBmcm9tIGhhcmR3YXJlIHRvIHNvZnR3YXJlLCB3ZSBuZWVkCisgICAgICAgIC8vIHRvIGF0dGFjaCB0aGUgaGFyZHdhcmUgZnJhbWUgY29udGV4dCB0byB0aGUgaW5wdXQgZnJhbWUgdG8KKyAgICAgICAgLy8gbWFrZSB0aGUgbWFwcGluZyB2aXNpYmxlIHRvIGF2X2h3ZnJhbWVfbWFwKCkuCisgICAgICAgIGlucHV0LT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihjdHgtPmh3ZnJhbWVzX3JlZik7CisgICAgICAgIGlmICghaW5wdXQtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVyciA9IGF2X2h3ZnJhbWVfbWFwKG1hcCwgaW5wdXQsIGN0eC0+bW9kZSk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbWFwIGZyYW1lOiAlZC5cbiIsIGVycik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG1hcCwgaW5wdXQpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dCk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgb3V0cHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG1hcC0+Zm9ybWF0KSwKKyAgICAgICAgICAgbWFwLT53aWR0aCwgbWFwLT5oZWlnaHQsIG1hcC0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgbWFwKTsKKworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dCk7CisgICAgYXZfZnJhbWVfZnJlZSgmbWFwKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGh3bWFwX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIEhXTWFwQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aHdmcmFtZXNfcmVmKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSFdNYXBDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGh3bWFwX29wdGlvbnNbXSA9IHsKKyAgICB7ICJtb2RlIiwgIkZyYW1lIG1hcHBpbmcgbW9kZSIsCisgICAgICBPRkZTRVQobW9kZSksIEFWX09QVF9UWVBFX0ZMQUdTLAorICAgICAgeyAuaTY0ID0gQVZfSFdGUkFNRV9NQVBfUkVBRCB8IEFWX0hXRlJBTUVfTUFQX1dSSVRFIH0sCisgICAgICAwLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisKKyAgICB7ICJyZWFkIiwgIk1hcHBpbmcgc2hvdWxkIGJlIHJlYWRhYmxlIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9IV0ZSQU1FX01BUF9SRUFEIH0sCisgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAid3JpdGUiLCAiTWFwcGluZyBzaG91bGQgYmUgd3JpdGVhYmxlIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9IV0ZSQU1FX01BUF9XUklURSB9LAorICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAorICAgIHsgIm92ZXJ3cml0ZSIsICJNYXBwaW5nIHdpbGwgYWx3YXlzIG92ZXJ3cml0ZSB0aGUgZW50aXJlIGZyYW1lIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9IV0ZSQU1FX01BUF9PVkVSV1JJVEUgfSwKKyAgICAgIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJkaXJlY3QiLCAiTWFwcGluZyBzaG91bGQgbm90IGludm9sdmUgYW55IGNvcHlpbmciLAorICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0hXRlJBTUVfTUFQX0RJUkVDVCB9LAorICAgICAgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAorCisgICAgeyAiZGVyaXZlX2RldmljZSIsICJEZXJpdmUgYSBuZXcgZGV2aWNlIG9mIHRoaXMgdHlwZSIsCisgICAgICBPRkZTRVQoZGVyaXZlX2RldmljZV90eXBlKSwgQVZfT1BUX1RZUEVfU1RSSU5HLAorICAgICAgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsgInJldmVyc2UiLCAiTWFwIGluIHJldmVyc2UgKGNyZWF0ZSBhbmQgYWxsb2NhdGUgaW4gdGhlIHNpbmspIiwKKyAgICAgIE9GRlNFVChyZXZlcnNlKSwgQVZfT1BUX1RZUEVfSU5ULAorICAgICAgeyAuaTY0ID0gMCB9LCAwLCAxLCBGTEFHUyB9LAorCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhod21hcCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBod21hcF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmdldF92aWRlb19idWZmZXIgPSBod21hcF9nZXRfYnVmZmVyLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICAgICA9IGh3bWFwX2ZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaHdtYXBfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGh3bWFwX2NvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfaHdtYXAgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImh3bWFwIiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWFwIGhhcmR3YXJlIGZyYW1lcyIpLAorICAgIC51bmluaXQgICAgICAgICA9IGh3bWFwX3VuaW5pdCwKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoSFdNYXBDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmaHdtYXBfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gaHdtYXBfcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICAgPSBod21hcF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gaHdtYXBfb3V0cHV0cywKKyAgICAuZmxhZ3NfaW50ZXJuYWwgPSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2h3dXBsb2FkLmMgYi9saWJhdmZpbHRlci92Zl9od3VwbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYmM3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9od3VwbG9hZC5jCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IEhXVXBsb2FkQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBBVkJ1ZmZlclJlZiAgICAgICAqaHdkZXZpY2VfcmVmOworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpod2RldmljZTsKKworICAgIEFWQnVmZmVyUmVmICAgICAgICpod2ZyYW1lc19yZWY7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZnJhbWVzOworfSBIV1VwbG9hZENvbnRleHQ7CisKK3N0YXRpYyBpbnQgaHd1cGxvYWRfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIEhXVXBsb2FkQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgQVZIV0ZyYW1lc0NvbnN0cmFpbnRzICpjb25zdHJhaW50cyA9IE5VTEw7CisgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICppbnB1dF9waXhfZm10cywgKm91dHB1dF9waXhfZm10czsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmlucHV0X2Zvcm1hdHMgPSBOVUxMOworICAgIGludCBlcnIsIGk7CisKKyAgICBpZiAoIWF2Y3R4LT5od19kZXZpY2VfY3R4KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkEgaGFyZHdhcmUgZGV2aWNlIHJlZmVyZW5jZSBpcyByZXF1aXJlZCAiCisgICAgICAgICAgICAgICAidG8gdXBsb2FkIGZyYW1lcyB0by5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGN0eC0+aHdkZXZpY2VfcmVmID0gYXZfYnVmZmVyX3JlZihhdmN0eC0+aHdfZGV2aWNlX2N0eCk7CisgICAgaWYgKCFjdHgtPmh3ZGV2aWNlX3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjdHgtPmh3ZGV2aWNlID0gKEFWSFdEZXZpY2VDb250ZXh0KiljdHgtPmh3ZGV2aWNlX3JlZi0+ZGF0YTsKKworICAgIGNvbnN0cmFpbnRzID0gYXZfaHdkZXZpY2VfZ2V0X2h3ZnJhbWVfY29uc3RyYWludHMoY3R4LT5od2RldmljZV9yZWYsIE5VTEwpOworICAgIGlmICghY29uc3RyYWludHMpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaW5wdXRfcGl4X2ZtdHMgID0gY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHM7CisgICAgb3V0cHV0X3BpeF9mbXRzID0gY29uc3RyYWludHMtPnZhbGlkX2h3X2Zvcm1hdHM7CisKKyAgICBpbnB1dF9mb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChvdXRwdXRfcGl4X2ZtdHMpOworICAgIGlmICghaW5wdXRfZm9ybWF0cykgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKGlucHV0X3BpeF9mbXRzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGlucHV0X3BpeF9mbXRzW2ldICE9IEFWX1BJWF9GTVRfTk9ORTsgaSsrKSB7CisgICAgICAgICAgICBlcnIgPSBmZl9hZGRfZm9ybWF0KCZpbnB1dF9mb3JtYXRzLCBpbnB1dF9waXhfZm10c1tpXSk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGVyciA9IGZmX2Zvcm1hdHNfcmVmKGlucHV0X2Zvcm1hdHMsICZhdmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cykpIDwgMCB8fAorICAgICAgICAoZXJyID0gZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChvdXRwdXRfcGl4X2ZtdHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF2Y3R4LT5vdXRwdXRzWzBdLT5pbl9mb3JtYXRzKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9od2ZyYW1lX2NvbnN0cmFpbnRzX2ZyZWUoJmNvbnN0cmFpbnRzKTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aHdkZXZpY2VfcmVmKTsKKyAgICBhdl9od2ZyYW1lX2NvbnN0cmFpbnRzX2ZyZWUoJmNvbnN0cmFpbnRzKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGh3dXBsb2FkX2NvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqYXZjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICAgKmlubGluayA9IGF2Y3R4LT5pbnB1dHNbMF07CisgICAgSFdVcGxvYWRDb250ZXh0ICAgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIGludCBlcnI7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aHdmcmFtZXNfcmVmKTsKKworICAgIGlmIChpbmxpbmstPmZvcm1hdCA9PSBvdXRsaW5rLT5mb3JtYXQpIHsKKyAgICAgICAgLy8gVGhlIGlucHV0IGlzIGFscmVhZHkgYSBoYXJkd2FyZSBmb3JtYXQsIHNvIHdlIGp1c3Qgd2FudCB0bworICAgICAgICAvLyBwYXNzIHRocm91Z2ggdGhlIGlucHV0IGZyYW1lcyBpbiB0aGVpciBvd24gaGFyZHdhcmUgY29udGV4dC4KKyAgICAgICAgaWYgKCFpbmxpbmstPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGlucHV0IGh3ZnJhbWUgY29udGV4dC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dGxpbmstPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKGlubGluay0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgIGlmICghb3V0bGluay0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY3R4LT5od2ZyYW1lc19yZWYgPSBhdl9od2ZyYW1lX2N0eF9hbGxvYyhjdHgtPmh3ZGV2aWNlX3JlZik7CisgICAgaWYgKCFjdHgtPmh3ZnJhbWVzX3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+aHdmcmFtZXMgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWN0eC0+aHdmcmFtZXNfcmVmLT5kYXRhOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiU3VyZmFjZSBmb3JtYXQgaXMgJXMuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGlubGluay0+Zm9ybWF0KSk7CisKKyAgICBjdHgtPmh3ZnJhbWVzLT5mb3JtYXQgICAgPSBvdXRsaW5rLT5mb3JtYXQ7CisgICAgY3R4LT5od2ZyYW1lcy0+c3dfZm9ybWF0ID0gaW5saW5rLT5mb3JtYXQ7CisgICAgY3R4LT5od2ZyYW1lcy0+d2lkdGggICAgID0gaW5saW5rLT53OworICAgIGN0eC0+aHdmcmFtZXMtPmhlaWdodCAgICA9IGlubGluay0+aDsKKworICAgIGlmIChhdmN0eC0+ZXh0cmFfaHdfZnJhbWVzID49IDApCisgICAgICAgIGN0eC0+aHdmcmFtZXMtPmluaXRpYWxfcG9vbF9zaXplID0gMiArIGF2Y3R4LT5leHRyYV9od19mcmFtZXM7CisKKyAgICBlcnIgPSBhdl9od2ZyYW1lX2N0eF9pbml0KGN0eC0+aHdmcmFtZXNfcmVmKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgb3V0bGluay0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoY3R4LT5od2ZyYW1lc19yZWYpOworICAgIGlmICghb3V0bGluay0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aHdmcmFtZXNfcmVmKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGh3dXBsb2FkX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmlucHV0KQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqYXZjdHggPSBsaW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICAqb3V0bGluayA9IGF2Y3R4LT5vdXRwdXRzWzBdOworICAgIEhXVXBsb2FkQ29udGV4dCAgICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpvdXRwdXQgPSBOVUxMOworICAgIGludCBlcnI7CisKKyAgICBpZiAoaW5wdXQtPmZvcm1hdCA9PSBvdXRsaW5rLT5mb3JtYXQpCisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW5wdXQpOworCisgICAgb3V0cHV0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dHB1dCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgdG8gdXBsb2FkIHRvLlxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG91dHB1dC0+d2lkdGggID0gaW5wdXQtPndpZHRoOworICAgIG91dHB1dC0+aGVpZ2h0ID0gaW5wdXQtPmhlaWdodDsKKworICAgIGVyciA9IGF2X2h3ZnJhbWVfdHJhbnNmZXJfZGF0YShvdXRwdXQsIGlucHV0LCAwKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gdXBsb2FkIGZyYW1lOiAlZC5cbiIsIGVycik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHB1dCwgaW5wdXQpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dCk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHB1dCk7CisKK2ZhaWw6CisgICAgYXZfZnJhbWVfZnJlZSgmaW5wdXQpOworICAgIGF2X2ZyYW1lX2ZyZWUoJm91dHB1dCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBod3VwbG9hZF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBIV1VwbG9hZENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworCisgICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPmh3ZnJhbWVzX3JlZik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPmh3ZGV2aWNlX3JlZik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGh3dXBsb2FkX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImh3dXBsb2FkIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gTlVMTCwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBod3VwbG9hZF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBod3VwbG9hZF9maWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGh3dXBsb2FkX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBod3VwbG9hZF9jb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2h3dXBsb2FkID0geworICAgIC5uYW1lICAgICAgICAgID0gImh3dXBsb2FkIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJVcGxvYWQgYSBub3JtYWwgZnJhbWUgdG8gYSBoYXJkd2FyZSBmcmFtZSIpLAorICAgIC51bmluaXQgICAgICAgID0gaHd1cGxvYWRfdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gaHd1cGxvYWRfcXVlcnlfZm9ybWF0cywKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihIV1VwbG9hZENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmh3dXBsb2FkX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICAgID0gaHd1cGxvYWRfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gaHd1cGxvYWRfb3V0cHV0cywKKyAgICAuZmxhZ3NfaW50ZXJuYWwgPSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2h3dXBsb2FkX2N1ZGEuYyBiL2xpYmF2ZmlsdGVyL3ZmX2h3dXBsb2FkX2N1ZGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjNmMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfaHd1cGxvYWRfY3VkYS5jCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnVmZmVyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IEN1ZGFVcGxvYWRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZGV2aWNlX2lkeDsKKworICAgIEFWQnVmZmVyUmVmICpod2RldmljZTsKKyAgICBBVkJ1ZmZlclJlZiAqaHdmcmFtZTsKK30gQ3VkYVVwbG9hZENvbnRleHQ7CisKK3N0YXRpYyBhdl9jb2xkIGludCBjdWRhdXBsb2FkX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgQ3VkYVVwbG9hZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY2hhciBidWZbNjRdID0geyAwIH07CisKKyAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCBzLT5kZXZpY2VfaWR4KTsKKworICAgIHJldHVybiBhdl9od2RldmljZV9jdHhfY3JlYXRlKCZzLT5od2RldmljZSwgQVZfSFdERVZJQ0VfVFlQRV9DVURBLCBidWYsIE5VTEwsIDApOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIGN1ZGF1cGxvYWRfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEN1ZGFVcGxvYWRDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5od2ZyYW1lKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJnMtPmh3ZGV2aWNlKTsKK30KKworc3RhdGljIGludCBjdWRhdXBsb2FkX3F1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgaW50IHJldDsKKworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgaW5wdXRfcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9OVjEyLCBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9QMDEwLCBBVl9QSVhfRk1UX1AwMTYsIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dHB1dF9waXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX0NVREEsIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9OworICAgIEFWRmlsdGVyRm9ybWF0cyAqaW5fZm10cyAgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KGlucHV0X3BpeF9mbXRzKTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKm91dF9mbXRzOworCisgICAgcmV0ID0gZmZfZm9ybWF0c19yZWYoaW5fZm10cywgJmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBvdXRfZm10cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qob3V0cHV0X3BpeF9mbXRzKTsKKworICAgIHJldCA9IGZmX2Zvcm1hdHNfcmVmKG91dF9mbXRzLCAmY3R4LT5vdXRwdXRzWzBdLT5pbl9mb3JtYXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN1ZGF1cGxvYWRfY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBDdWRhVXBsb2FkQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpod2ZyYW1lX2N0eDsKKyAgICBpbnQgcmV0OworCisgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5od2ZyYW1lKTsKKyAgICBzLT5od2ZyYW1lID0gYXZfaHdmcmFtZV9jdHhfYWxsb2Mocy0+aHdkZXZpY2UpOworICAgIGlmICghcy0+aHdmcmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGh3ZnJhbWVfY3R4ICAgICAgICAgICAgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKXMtPmh3ZnJhbWUtPmRhdGE7CisgICAgaHdmcmFtZV9jdHgtPmZvcm1hdCAgICA9IEFWX1BJWF9GTVRfQ1VEQTsKKyAgICBod2ZyYW1lX2N0eC0+c3dfZm9ybWF0ID0gaW5saW5rLT5mb3JtYXQ7CisgICAgaHdmcmFtZV9jdHgtPndpZHRoICAgICA9IGlubGluay0+dzsKKyAgICBod2ZyYW1lX2N0eC0+aGVpZ2h0ICAgID0gaW5saW5rLT5oOworCisgICAgcmV0ID0gYXZfaHdmcmFtZV9jdHhfaW5pdChzLT5od2ZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG91dGxpbmstPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKHMtPmh3ZnJhbWUpOworICAgIGlmICghb3V0bGluay0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN1ZGF1cGxvYWRfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgKmN0eCA9IGxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworCisgICAgQVZGcmFtZSAqb3V0ID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBvdXQtPndpZHRoICA9IGluLT53aWR0aDsKKyAgICBvdXQtPmhlaWdodCA9IGluLT5oZWlnaHQ7CisKKyAgICByZXQgPSBhdl9od2ZyYW1lX3RyYW5zZmVyX2RhdGEob3V0LCBpbiwgMCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgdHJhbnNmZXJyaW5nIGRhdGEgdG8gdGhlIEdQVVxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgb3V0KTsKK2ZhaWw6CisgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ3VkYVVwbG9hZENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjdWRhdXBsb2FkX29wdGlvbnNbXSA9IHsKKyAgICB7ICJkZXZpY2UiLCAiTnVtYmVyIG9mIHRoZSBkZXZpY2UgdG8gdXNlIiwgT0ZGU0VUKGRldmljZV9pZHgpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhjdWRhdXBsb2FkKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGN1ZGF1cGxvYWRfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gY3VkYXVwbG9hZF9maWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGN1ZGF1cGxvYWRfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGN1ZGF1cGxvYWRfY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9od3VwbG9hZF9jdWRhID0geworICAgIC5uYW1lICAgICAgICA9ICJod3VwbG9hZF9jdWRhIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVXBsb2FkIGEgc3lzdGVtIG1lbW9yeSBmcmFtZSB0byBhIENVREEgZGV2aWNlLiIpLAorCisgICAgLmluaXQgICAgICA9IGN1ZGF1cGxvYWRfaW5pdCwKKyAgICAudW5pbml0ICAgID0gY3VkYXVwbG9hZF91bmluaXQsCisKKyAgICAucXVlcnlfZm9ybWF0cyA9IGN1ZGF1cGxvYWRfcXVlcnlfZm9ybWF0cywKKworICAgIC5wcml2X3NpemUgID0gc2l6ZW9mKEN1ZGFVcGxvYWRDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyA9ICZjdWRhdXBsb2FkX2NsYXNzLAorCisgICAgLmlucHV0cyAgICA9IGN1ZGF1cGxvYWRfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgPSBjdWRhdXBsb2FkX291dHB1dHMsCisKKyAgICAuZmxhZ3NfaW50ZXJuYWwgPSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2h5c3RlcmVzaXMuYyBiL2xpYmF2ZmlsdGVyL3ZmX2h5c3RlcmVzaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTFiMzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfaHlzdGVyZXNpcy5jCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIE9rYSBNb3RvZnVtaSAoY2hpa3V6ZW4ubW8gYXQgZ21haWwgZG90IGNvbSkKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoSHlzdGVyZXNpc0NvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCit0eXBlZGVmIHN0cnVjdCBIeXN0ZXJlc2lzQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgRkZGcmFtZVN5bmMgZnM7CisKKyAgICBpbnQgcGxhbmVzOworICAgIGludCB0aHJlc2hvbGQ7CisKKyAgICBpbnQgd2lkdGhbNF0sIGhlaWdodFs0XTsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBkZXB0aDsKKworICAgIHVpbnQ4X3QgKm1hcDsKKyAgICB1aW50MzJfdCAqeHk7CisgICAgaW50IGluZGV4OworCisgICAgdm9pZCAoKmh5c3RlcmVzaXMpKHN0cnVjdCBIeXN0ZXJlc2lzQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqYnNyYywgY29uc3QgdWludDhfdCAqb3NyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYmxpbmVzaXplLCBwdHJkaWZmX3Qgb2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZGVzdGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOworfSBIeXN0ZXJlc2lzQ29udGV4dDsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGh5c3RlcmVzaXNfb3B0aW9uc1tdID0geworICAgIHsgInBsYW5lcyIsICAgICJzZXQgcGxhbmVzIiwgICAgT0ZGU0VUKHBsYW5lcyksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MHhGfSwgMCwgMHhGLCBGTEFHUyB9LAorICAgIHsgInRocmVzaG9sZCIsICJzZXQgdGhyZXNob2xkIiwgT0ZGU0VUKHRocmVzaG9sZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sICAgMCwgVUlOVDE2X01BWCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LCBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFA5LCBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUlAxNCwgQVZfUElYX0ZNVF9HQlJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRfR0JSQVAxMCwgQVZfUElYX0ZNVF9HQlJBUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTksIEFWX1BJWF9GTVRfR1JBWTEwLCBBVl9QSVhfRk1UX0dSQVkxMiwgQVZfUElYX0ZNVF9HUkFZMTYsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZnJhbWUoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gZnMtPnBhcmVudDsKKyAgICBIeXN0ZXJlc2lzQ29udGV4dCAqcyA9IGZzLT5vcGFxdWU7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dCwgKmJhc2UsICphbHQ7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2dldF9mcmFtZSgmcy0+ZnMsIDAsICZiYXNlLCAwKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMSwgJmFsdCwgIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoY3R4LT5pc19kaXNhYmxlZCkgeworICAgICAgICBvdXQgPSBhdl9mcmFtZV9jbG9uZShiYXNlKTsKKyAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwOworCisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGJhc2UpOworCisgICAgICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICAgICAgaWYgKCEoKDEgPDwgcCkgJiBzLT5wbGFuZXMpKSB7CisgICAgICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbcF0sIG91dC0+bGluZXNpemVbcF0sIGJhc2UtPmRhdGFbcF0sIGJhc2UtPmxpbmVzaXplW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+d2lkdGhbcF0sIHMtPmhlaWdodFtwXSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCB5OworCisgICAgICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmhlaWdodFtwXTsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldChvdXQtPmRhdGFbcF0gKyB5ICogb3V0LT5saW5lc2l6ZVtwXSwgMCwgcy0+d2lkdGhbcF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcy0+aW5kZXggPSAtMTsKKyAgICAgICAgICAgIG1lbXNldChzLT5tYXAsIDAsIHMtPndpZHRoWzBdICogcy0+aGVpZ2h0WzBdKTsKKyAgICAgICAgICAgIG1lbXNldChzLT54eSwgMCwgcy0+d2lkdGhbMF0gKiBzLT5oZWlnaHRbMF0gKiA0KTsKKworICAgICAgICAgICAgcy0+aHlzdGVyZXNpcyhzLCBiYXNlLT5kYXRhW3BdLCBhbHQtPmRhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+bGluZXNpemVbcF0sIGFsdC0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoW3BdLCBzLT5oZWlnaHRbcF0pOworICAgICAgICB9CisgICAgfQorICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKHMtPmZzLnB0cywgcy0+ZnMudGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IHBhc3NlZChIeXN0ZXJlc2lzQ29udGV4dCAqcywgaW50IHgsIGludCB5LCBpbnQgdykKK3sKKyAgICByZXR1cm4gcy0+bWFwW3ggKyB5ICogd107Cit9CisKK3N0YXRpYyB2b2lkIHB1c2goSHlzdGVyZXNpc0NvbnRleHQgKnMsIGludCB4LCBpbnQgeSwgaW50IHcpCit7CisgICAgcy0+bWFwW3ggKyB5ICogd10gPSAweGZmOworICAgIHMtPnh5Wysrcy0+aW5kZXhdID0gKHVpbnQxNl90KSh4KSA8PCAxNiB8ICh1aW50MTZfdCl5OworfQorCitzdGF0aWMgdm9pZCBwb3AoSHlzdGVyZXNpc0NvbnRleHQgKnMsIGludCAqeCwgaW50ICp5KQoreworICAgIHVpbnQzMl90IHZhbCA9IHMtPnh5W3MtPmluZGV4LS1dOworCisgICAgKnggPSB2YWwgPj4gMTY7CisgICAgKnkgPSB2YWwgJiAweDAwMDBGRkZGOworfQorCitzdGF0aWMgaW50IGlzX2VtcHR5KEh5c3RlcmVzaXNDb250ZXh0ICpzKQoreworICAgIHJldHVybiBzLT5pbmRleCA8IDA7Cit9CisKK3N0YXRpYyB2b2lkIGh5c3RlcmVzaXM4KEh5c3RlcmVzaXNDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpic3JjLCBjb25zdCB1aW50OF90ICphc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGJsaW5lc2l6ZSwgcHRyZGlmZl90IGFsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCit7CisgICAgY29uc3QgaW50IHQgPSBzLT50aHJlc2hvbGQ7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGlmICgoYnNyY1t4ICsgeSAqIGJsaW5lc2l6ZV0gPiB0KSAmJiAoYXNyY1t4ICsgeSAqIGFsaW5lc2l6ZV0gPiB0KSAmJiAhcGFzc2VkKHMsIHgsIHksIHcpKSB7CisgICAgICAgICAgICAgICAgaW50IHBvc3gsIHBvc3k7CisKKyAgICAgICAgICAgICAgICBkc3RbeCArIHkgKiBkbGluZXNpemVdID0gYXNyY1t4ICsgeSAqIGFsaW5lc2l6ZV07CisKKyAgICAgICAgICAgICAgICBwdXNoKHMsIHgsIHksIHcpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCFpc19lbXB0eShzKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgeF9taW4sIHhfbWF4LCB5X21pbiwgeV9tYXgsIHl5LCB4eDsKKworICAgICAgICAgICAgICAgICAgICBwb3AocywgJnBvc3gsICZwb3N5KTsKKworICAgICAgICAgICAgICAgICAgICB4X21pbiA9IHBvc3ggPiAwID8gcG9zeCAtIDEgOiAwOworICAgICAgICAgICAgICAgICAgICB4X21heCA9IHBvc3ggPCB3IC0gMSA/IHBvc3ggKyAxIDogcG9zeDsKKyAgICAgICAgICAgICAgICAgICAgeV9taW4gPSBwb3N5ID4gMCA/IHBvc3kgLSAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgeV9tYXggPSBwb3N5IDwgaCAtIDEgPyBwb3N5ICsgMSA6IHBvc3k7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yICh5eSA9IHlfbWluOyB5eSA8PSB5X21heDsgeXkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh4eCA9IHhfbWluOyB4eCA8PSB4X21heDsgeHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYXNyY1t4eCArIHl5ICogYWxpbmVzaXplXSA+IHQpICYmICFwYXNzZWQocywgeHgsIHl5LCB3KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeHggKyB5eSAqIGRsaW5lc2l6ZV0gPSBhc3JjW3h4ICsgeXkgKiBhbGluZXNpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHMsIHh4LCB5eSwgdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoeXN0ZXJlc2lzMTYoSHlzdGVyZXNpc0NvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJic3JjLCBjb25zdCB1aW50OF90ICphYXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYmxpbmVzaXplLCBwdHJkaWZmX3QgYWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqYnNyYyA9IChjb25zdCB1aW50MTZfdCAqKWJic3JjOworICAgIGNvbnN0IHVpbnQxNl90ICphc3JjID0gKGNvbnN0IHVpbnQxNl90ICopYWFzcmM7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKWRkc3Q7CisgICAgY29uc3QgaW50IHQgPSBzLT50aHJlc2hvbGQ7CisgICAgaW50IHgsIHk7CisKKyAgICBibGluZXNpemUgLz0gMjsKKyAgICBhbGluZXNpemUgLz0gMjsKKyAgICBkbGluZXNpemUgLz0gMjsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaWYgKChic3JjW3ggKyB5ICogYmxpbmVzaXplXSA+IHQpICYmIChhc3JjW3ggKyB5ICogYWxpbmVzaXplXSA+IHQpICYmICFwYXNzZWQocywgeCwgeSwgdykpIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zeCwgcG9zeTsKKworICAgICAgICAgICAgICAgIGRzdFt4ICsgeSAqIGRsaW5lc2l6ZV0gPSBhc3JjW3ggKyB5ICogYWxpbmVzaXplXTsKKworICAgICAgICAgICAgICAgIHB1c2gocywgeCwgeSwgdyk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWlzX2VtcHR5KHMpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB4X21pbiwgeF9tYXgsIHlfbWluLCB5X21heCwgeXksIHh4OworCisgICAgICAgICAgICAgICAgICAgIHBvcChzLCAmcG9zeCwgJnBvc3kpOworCisgICAgICAgICAgICAgICAgICAgIHhfbWluID0gcG9zeCA+IDAgPyBwb3N4IC0gMSA6IDA7CisgICAgICAgICAgICAgICAgICAgIHhfbWF4ID0gcG9zeCA8IHcgLSAxID8gcG9zeCArIDEgOiBwb3N4OworICAgICAgICAgICAgICAgICAgICB5X21pbiA9IHBvc3kgPiAwID8gcG9zeSAtIDEgOiAwOworICAgICAgICAgICAgICAgICAgICB5X21heCA9IHBvc3kgPCBoIC0gMSA/IHBvc3kgKyAxIDogcG9zeTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKHl5ID0geV9taW47IHl5IDw9IHlfbWF4OyB5eSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHh4ID0geF9taW47IHh4IDw9IHhfbWF4OyB4eCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhc3JjW3h4ICsgeXkgKiBhbGluZXNpemVdID4gdCkgJiYgIXBhc3NlZChzLCB4eCwgeXksIHcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4eCArIHl5ICogZGxpbmVzaXplXSA9IGFzcmNbeHggKyB5eSAqIGFsaW5lc2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2gocywgeHgsIHl5LCB3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgSHlzdGVyZXNpc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IHZzdWIsIGhzdWI7CisKKyAgICBzLT5uYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhpbmxpbmstPmZvcm1hdCk7CisKKyAgICBoc3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICB2c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBzLT5oZWlnaHRbMV0gPSBzLT5oZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOworICAgIHMtPmhlaWdodFswXSA9IHMtPmhlaWdodFszXSA9IGlubGluay0+aDsKKyAgICBzLT53aWR0aFsxXSAgPSBzLT53aWR0aFsyXSAgPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIGhzdWIpOworICAgIHMtPndpZHRoWzBdICA9IHMtPndpZHRoWzNdICA9IGlubGluay0+dzsKKworICAgIHMtPmRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKworICAgIGlmIChkZXNjLT5jb21wWzBdLmRlcHRoID09IDgpCisgICAgICAgIHMtPmh5c3RlcmVzaXMgPSBoeXN0ZXJlc2lzODsKKyAgICBlbHNlCisgICAgICAgIHMtPmh5c3RlcmVzaXMgPSBoeXN0ZXJlc2lzMTY7CisKKyAgICBzLT5tYXAgPSBhdl9jYWxsb2MoaW5saW5rLT53LCBpbmxpbmstPmggKiBzaXplb2YgKCpzLT5tYXApKTsKKyAgICBpZiAoIXMtPm1hcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPnh5ID0gYXZfY2FsbG9jKGlubGluay0+dywgaW5saW5rLT5oICogc2l6ZW9mKCpzLT54eSkpOworICAgIGlmICghcy0+eHkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBIeXN0ZXJlc2lzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmJhc2UgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgKmFsdCA9IGN0eC0+aW5wdXRzWzFdOworICAgIEZGRnJhbWVTeW5jSW4gKmluOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYmFzZS0+Zm9ybWF0ICE9IGFsdC0+Zm9ybWF0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0cyBtdXN0IGJlIG9mIHNhbWUgcGl4ZWwgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKGJhc2UtPncgIT0gYWx0LT53IHx8IGJhc2UtPmggIT0gYWx0LT5oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZpcnN0IGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAiCisgICAgICAgICAgICAgICAiKHNpemUgJWR4JWQpIGRvIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyAiCisgICAgICAgICAgICAgICAic2Vjb25kIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAoc2l6ZSAlZHglZClcbiIsCisgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbMF0ubmFtZSwgYmFzZS0+dywgYmFzZS0+aCwKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1sxXS5uYW1lLAorICAgICAgICAgICAgICAgYWx0LT53LCBhbHQtPmgpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG91dGxpbmstPncgPSBiYXNlLT53OworICAgIG91dGxpbmstPmggPSBiYXNlLT5oOworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGJhc2UtPnRpbWVfYmFzZTsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYmFzZS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gYmFzZS0+ZnJhbWVfcmF0ZTsKKworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2luaXQoJnMtPmZzLCBjdHgsIDIpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpbiA9IHMtPmZzLmluOworICAgIGluWzBdLnRpbWVfYmFzZSA9IGJhc2UtPnRpbWVfYmFzZTsKKyAgICBpblsxXS50aW1lX2Jhc2UgPSBhbHQtPnRpbWVfYmFzZTsKKyAgICBpblswXS5zeW5jICAgPSAxOworICAgIGluWzBdLmJlZm9yZSA9IEVYVF9TVE9QOworICAgIGluWzBdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBpblsxXS5zeW5jICAgPSAxOworICAgIGluWzFdLmJlZm9yZSA9IEVYVF9TVE9QOworICAgIGluWzFdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBzLT5mcy5vcGFxdWUgICA9IHM7CisgICAgcy0+ZnMub25fZXZlbnQgPSBwcm9jZXNzX2ZyYW1lOworCisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKTsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBIeXN0ZXJlc2lzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEh5c3RlcmVzaXNDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgZmZfZnJhbWVzeW5jX3VuaW5pdCgmcy0+ZnMpOworICAgIGF2X2ZyZWVwKCZzLT5tYXApOworICAgIGF2X2ZyZWVwKCZzLT54eSk7Cit9CisKK0ZSQU1FU1lOQ19ERUZJTkVfQ0xBU1MoaHlzdGVyZXNpcywgSHlzdGVyZXNpc0NvbnRleHQsIGZzKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGh5c3RlcmVzaXNfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImJhc2UiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImFsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGh5c3RlcmVzaXNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfaHlzdGVyZXNpcyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJoeXN0ZXJlc2lzIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHcm93IGZpcnN0IHN0cmVhbSBpbnRvIHNlY29uZCBzdHJlYW0gYnkgY29ubmVjdGluZyBjb21wb25lbnRzLiIpLAorICAgIC5wcmVpbml0ICAgICAgID0gaHlzdGVyZXNpc19mcmFtZXN5bmNfcHJlaW5pdCwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihIeXN0ZXJlc2lzQ29udGV4dCksCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgID0gYWN0aXZhdGUsCisgICAgLmlucHV0cyAgICAgICAgPSBoeXN0ZXJlc2lzX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IGh5c3RlcmVzaXNfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICA9ICZoeXN0ZXJlc2lzX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2lkZXQuYyBiL2xpYmF2ZmlsdGVyL3ZmX2lkZXQuYwppbmRleCA4N2Q0MTQ0Li4wMmFlMmVkIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9pZGV0LmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfaWRldC5jCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICBUeXBlIHR5cGUsIGJlc3RfdHlwZTsKICAgICBSZXBlYXRlZEZpZWxkIHJlcGVhdDsKICAgICBpbnQgbWF0Y2ggPSAwOwotICAgIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhID0gYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoaWRldC0+Y3VyKTsKKyAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSA9ICZpZGV0LT5jdXItPm1ldGFkYXRhOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGlkZXQtPmNzcC0+bmJfY29tcG9uZW50czsgaSsrKSB7CiAgICAgICAgIGludCB3ID0gaWRldC0+Y3VyLT53aWR0aDsKQEAgLTM5Miw2ICszOTIsOCBAQAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNiwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCiAgICAgICAgIEFWX1BJWF9GTVRfTk9ORQogICAgIH07CiAgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzX2xpc3QgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2lkZXQuaCBiL2xpYmF2ZmlsdGVyL3ZmX2lkZXQuaAppbmRleCA0N2UzZDljLi5hZmQ4OTQ3IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9pZGV0LmgKKysrIGIvbGliYXZmaWx0ZXIvdmZfaWRldC5oCkBAIC0zOSw3ICszOSw3IEBACiAgICAgUkVQRUFUX0JPVFRPTSwKIH0gUmVwZWF0ZWRGaWVsZDsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgSURFVENvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGZsb2F0IGludGVybGFjZV90aHJlc2hvbGQ7CiAgICAgZmxvYXQgcHJvZ3Jlc3NpdmVfdGhyZXNob2xkOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfaWwuYyBiL2xpYmF2ZmlsdGVyL3ZmX2lsLmMKaW5kZXggZTBiZjhkNS4uYWUwY2MxOSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfaWwuYworKysgYi9saWJhdmZpbHRlci92Zl9pbC5jCkBAIC0zNiw3ICszNiw3IEBACiAgICAgTU9ERV9ERUlOVEVSTEVBVkUKIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IElsQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IGx1bWFfbW9kZSwgY2hyb21hX21vZGUsIGFscGhhX21vZGU7IC8vLzxGaWx0ZXJNb2RlCiAgICAgaW50IGx1bWFfc3dhcCwgY2hyb21hX3N3YXAsIGFscGhhX3N3YXA7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9pbnRlcmxhY2UuYyBiL2xpYmF2ZmlsdGVyL3ZmX2ludGVybGFjZS5jCmluZGV4IGVmYTMxMjguLjI0YzQyMmQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2ludGVybGFjZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2ludGVybGFjZS5jCkBAIC0zLDYgKzMsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDEwIEJhcHRpc3RlIENvdWR1cmllcgogICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKICAqIENvcHlyaWdodCAoYykgMjAxMyBWaXR0b3JpbyBHaW92YXJhIDx2aXR0b3Jpby5naW92YXJhQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNyBUaG9tYXMgTXVuZHQgPHRtdW5kdDc1QGdtYWlsLmNvbT4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtNDcsMTcgKzQ4LDI0IEBACiAgICAgeyAiYmZmIiwgImJvdHRvbSBmaWVsZCBmaXJzdCIsIDAsCiAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1PREVfQkZGIH0sIElOVF9NSU4sIElOVF9NQVgsIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJzY2FuIiB9LAogICAgIHsgImxvd3Bhc3MiLCAic2V0IHZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlciIsIE9GRlNFVChsb3dwYXNzKSwKLSAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgIHsuaTY0ID0gMSB9LCAgICAgICAgMCwgMSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0ID0gVkxQRl9MSU4gfSwgMCwgMiwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImxvd3Bhc3MiIH0sCisgICAgeyAib2ZmIiwgICAgICJkaXNhYmxlIHZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlciIsIDAsCisgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFZMUEZfT0ZGIH0sIElOVF9NSU4sIElOVF9NQVgsIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJsb3dwYXNzIiB9LAorICAgIHsgImxpbmVhciIsICAibGluZWFyIHZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlciIsICAwLAorICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBWTFBGX0xJTiB9LCBJTlRfTUlOLCBJTlRfTUFYLCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAibG93cGFzcyIgfSwKKyAgICB7ICJjb21wbGV4IiwgImNvbXBsZXggdmVydGljYWwgbG93LXBhc3MgZmlsdGVyIiwgMCwKKyAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVkxQRl9DTVAgfSwgSU5UX01JTiwgSU5UX01BWCwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImxvd3Bhc3MiIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKIEFWRklMVEVSX0RFRklORV9DTEFTUyhpbnRlcmxhY2UpOwogCiBzdGF0aWMgdm9pZCBsb3dwYXNzX2xpbmVfYyh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLCBwdHJkaWZmX3QgbXJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwcmVmLCBpbnQgY2xpcF9tYXgpCiB7CisgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSA9IHNyY3AgKyBtcmVmOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cgPSBzcmNwICsgcHJlZjsKICAgICBpbnQgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXNpemU7IGkrKykgewogICAgICAgICAvLyB0aGlzIGNhbGN1bGF0aW9uIGlzIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YKQEAgLTY3LDExICs3NSw5OCBAQAogICAgIH0KIH0KIAorc3RhdGljIHZvaWQgbG93cGFzc19saW5lX2NfMTYodWludDhfdCAqZHN0OCwgcHRyZGlmZl90IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjOCwgcHRyZGlmZl90IG1yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KQoreworICAgIHVpbnQxNl90ICpkc3RwID0gKHVpbnQxNl90ICopZHN0ODsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjcCA9IChjb25zdCB1aW50MTZfdCAqKXNyYzg7CisgICAgY29uc3QgdWludDE2X3QgKnNyY3BfYWJvdmUgPSBzcmNwICsgbXJlZiAvIDI7CisgICAgY29uc3QgdWludDE2X3QgKnNyY3BfYmVsb3cgPSBzcmNwICsgcHJlZiAvIDI7CisgICAgaW50IGksIHNyY194OworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lc2l6ZTsgaSsrKSB7CisgICAgICAgIC8vIHRoaXMgY2FsY3VsYXRpb24gaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZgorICAgICAgICAvLyAnMC41ICogY3VycmVudCArIDAuMjUgKiBhYm92ZSArIDAuMjUgKiBiZWxvdycKKyAgICAgICAgLy8gJzEgKycgaXMgZm9yIHJvdW5kaW5nLgorICAgICAgICBzcmNfeCAgID0gYXZfbGUybmUxNihzcmNwW2ldKSA8PCAxOworICAgICAgICBkc3RwW2ldID0gYXZfbGUybmUxNigoMSArIHNyY194ICsgYXZfbGUybmUxNihzcmNwX2Fib3ZlW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGF2X2xlMm5lMTYoc3JjcF9iZWxvd1tpXSkpID4+IDIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbG93cGFzc19saW5lX2NvbXBsZXhfYyh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsIHB0cmRpZmZfdCBtcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KQoreworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUgPSBzcmNwICsgbXJlZjsKKyAgICBjb25zdCB1aW50OF90ICpzcmNwX2JlbG93ID0gc3JjcCArIHByZWY7CisgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZTIgPSBzcmNwICsgbXJlZiAqIDI7CisgICAgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdzIgPSBzcmNwICsgcHJlZiAqIDI7CisgICAgaW50IGksIHNyY194LCBzcmNfYWI7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbmVzaXplOyBpKyspIHsKKyAgICAgICAgLy8gdGhpcyBjYWxjdWxhdGlvbiBpcyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mCisgICAgICAgIC8vICcwLjc1ICogY3VycmVudCArIDAuMjUgKiBhYm92ZSArIDAuMjUgKiBiZWxvdyAtIDAuMTI1ICogYWJvdmUyIC0gMC4xMjUgKiBiZWxvdzInCisgICAgICAgIC8vICc0ICsnIGlzIGZvciByb3VuZGluZy4KKyAgICAgICAgc3JjX3ggICA9IHNyY3BbaV0gPDwgMTsKKyAgICAgICAgc3JjX2FiICA9IHNyY3BfYWJvdmVbaV0gKyBzcmNwX2JlbG93W2ldOworICAgICAgICBkc3RwW2ldID0gYXZfY2xpcF91aW50OCgoNCArICgoc3JjcFtpXSArIHNyY194ICsgc3JjX2FiKSA8PCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNyY3BfYWJvdmUyW2ldIC0gc3JjcF9iZWxvdzJbaV0pID4+IDMpOworICAgICAgICAvLyBQcmV2ZW50IG92ZXItc2hhcnBlbmluZzoKKyAgICAgICAgLy8gZHN0IG11c3Qgbm90IGV4Y2VlZCBzcmMgd2hlbiB0aGUgYXZlcmFnZSBvZiBhYm92ZSBhbmQgYmVsb3cKKyAgICAgICAgLy8gaXMgbGVzcyB0aGFuIHNyYy4gQW5kIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICAgICAgICBpZiAoc3JjX2FiID4gc3JjX3gpIHsKKyAgICAgICAgICAgIGlmIChkc3RwW2ldIDwgc3JjcFtpXSkKKyAgICAgICAgICAgICAgICBkc3RwW2ldID0gc3JjcFtpXTsKKyAgICAgICAgfSBlbHNlIGlmIChkc3RwW2ldID4gc3JjcFtpXSkKKyAgICAgICAgICAgIGRzdHBbaV0gPSBzcmNwW2ldOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbG93cGFzc19saW5lX2NvbXBsZXhfY18xNih1aW50OF90ICpkc3Q4LCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzgsIHB0cmRpZmZfdCBtcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KQoreworICAgIHVpbnQxNl90ICpkc3RwID0gKHVpbnQxNl90ICopZHN0ODsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjcCA9IChjb25zdCB1aW50MTZfdCAqKXNyYzg7CisgICAgY29uc3QgdWludDE2X3QgKnNyY3BfYWJvdmUgPSBzcmNwICsgbXJlZiAvIDI7CisgICAgY29uc3QgdWludDE2X3QgKnNyY3BfYmVsb3cgPSBzcmNwICsgcHJlZiAvIDI7CisgICAgY29uc3QgdWludDE2X3QgKnNyY3BfYWJvdmUyID0gc3JjcCArIG1yZWY7CisgICAgY29uc3QgdWludDE2X3QgKnNyY3BfYmVsb3cyID0gc3JjcCArIHByZWY7CisgICAgaW50IGksIGRzdF9sZSwgc3JjX2xlLCBzcmNfeCwgc3JjX2FiOworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lc2l6ZTsgaSsrKSB7CisgICAgICAgIC8vIHRoaXMgY2FsY3VsYXRpb24gaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZgorICAgICAgICAvLyAnMC43NSAqIGN1cnJlbnQgKyAwLjI1ICogYWJvdmUgKyAwLjI1ICogYmVsb3cgLSAwLjEyNSAqIGFib3ZlMiAtIDAuMTI1ICogYmVsb3cyJworICAgICAgICAvLyAnNCArJyBpcyBmb3Igcm91bmRpbmcuCisgICAgICAgIHNyY19sZSA9IGF2X2xlMm5lMTYoc3JjcFtpXSk7CisgICAgICAgIHNyY194ICA9IHNyY19sZSA8PCAxOworICAgICAgICBzcmNfYWIgPSBhdl9sZTJuZTE2KHNyY3BfYWJvdmVbaV0pICsgYXZfbGUybmUxNihzcmNwX2JlbG93W2ldKTsKKyAgICAgICAgZHN0X2xlID0gYXZfY2xpcCgoNCArICgoc3JjX2xlICsgc3JjX3ggKyBzcmNfYWIpIDw8IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgLSBhdl9sZTJuZTE2KHNyY3BfYWJvdmUyW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gYXZfbGUybmUxNihzcmNwX2JlbG93MltpXSkpID4+IDMsIDAsIGNsaXBfbWF4KTsKKyAgICAgICAgLy8gUHJldmVudCBvdmVyLXNoYXJwZW5pbmc6CisgICAgICAgIC8vIGRzdCBtdXN0IG5vdCBleGNlZWQgc3JjIHdoZW4gdGhlIGF2ZXJhZ2Ugb2YgYWJvdmUgYW5kIGJlbG93CisgICAgICAgIC8vIGlzIGxlc3MgdGhhbiBzcmMuIEFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAgICAgICAgaWYgKHNyY19hYiA+IHNyY194KSB7CisgICAgICAgICAgICBpZiAoZHN0X2xlIDwgc3JjX2xlKQorICAgICAgICAgICAgICAgIGRzdHBbaV0gPSBhdl9sZTJuZTE2KHNyY19sZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZHN0cFtpXSA9IGF2X2xlMm5lMTYoZHN0X2xlKTsKKyAgICAgICAgfSBlbHNlIGlmIChkc3RfbGUgPiBzcmNfbGUpIHsKKyAgICAgICAgICAgIGRzdHBbaV0gPSBhdl9sZTJuZTE2KHNyY19sZSk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgZHN0cFtpXSA9IGF2X2xlMm5lMTYoZHN0X2xlKTsKKyAgICB9Cit9CisKIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0c19zdXBwb3J0ZWRbXSA9IHsKLSAgICBBVl9QSVhfRk1UX1lVVjQyMFAsICBBVl9QSVhfRk1UX1lVVjQyMlAsICBBVl9QSVhfRk1UX1lVVjQ0NFAsCi0gICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVY0MTBQLCAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKLSAgICBBVl9QSVhfRk1UX0dSQVk4LCAgICBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVko0MjJQLAotICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJWF9GTVRfTk9ORQorICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgICAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRSwgIEFWX1BJWF9GTVRfWVVWNDIyUDEwTEUsICBBVl9QSVhfRk1UX1lVVjQ0NFAxMExFLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEUsICBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFLCAgQVZfUElYX0ZNVF9ZVVY0NDRQMTJMRSwKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwTEUsIEFWX1BJWF9GTVRfWVVWQTQyMlAxMExFLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTBMRSwKKyAgICBBVl9QSVhfRk1UX0dSQVk4LCAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsCisgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsICAgICBBVl9QSVhfRk1UX05PTkUKIH07CiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKQEAgLTkwLDYgKzE4NSwyNSBAQAogICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm5leHQpOwogfQogCit2b2lkIGZmX2ludGVybGFjZV9pbml0KEludGVybGFjZUNvbnRleHQgKnMsIGludCBkZXB0aCkKK3sKKyAgICBpZiAocy0+bG93cGFzcykgeworICAgICAgICBpZiAocy0+bG93cGFzcyA9PSBWTFBGX0xJTikgeworICAgICAgICAgICAgaWYgKGRlcHRoID4gOCkKKyAgICAgICAgICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBsb3dwYXNzX2xpbmVfY18xNjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBsb3dwYXNzX2xpbmVfYzsKKyAgICAgICAgfSBlbHNlIGlmIChzLT5sb3dwYXNzID09IFZMUEZfQ01QKSB7CisgICAgICAgICAgICBpZiAoZGVwdGggPiA4KQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGxvd3Bhc3NfbGluZV9jb21wbGV4X2NfMTY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+bG93cGFzc19saW5lID0gbG93cGFzc19saW5lX2NvbXBsZXhfYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoQVJDSF9YODYpCisgICAgICAgICAgICBmZl9pbnRlcmxhY2VfaW5pdF94ODYocywgZGVwdGgpOworICAgIH0KK30KKwogc3RhdGljIGludCBjb25maWdfb3V0X3Byb3BzKEFWRmlsdGVyTGluayAqb3V0bGluaykKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKQEAgLTExNCwxMiArMjI4LDggQEAKICAgICBvdXRsaW5rLT50aW1lX2Jhc2UubnVtICo9IDI7CiAgICAgb3V0bGluay0+ZnJhbWVfcmF0ZS5kZW4gKj0gMjsKIAotCi0gICAgaWYgKHMtPmxvd3Bhc3MpIHsKLSAgICAgICAgcy0+bG93cGFzc19saW5lID0gbG93cGFzc19saW5lX2M7Ci0gICAgICAgIGlmIChBUkNIX1g4NikKLSAgICAgICAgICAgIGZmX2ludGVybGFjZV9pbml0X3g4NihzKTsKLSAgICB9CisgICAgcy0+Y3NwID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdXRsaW5rLT5mb3JtYXQpOworICAgIGZmX2ludGVybGFjZV9pbml0KHMsIHMtPmNzcC0+Y29tcFswXS5kZXB0aCk7CiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIiVzIGludGVybGFjaW5nICVzIGxvd3Bhc3MgZmlsdGVyXG4iLAogICAgICAgICAgICBzLT5zY2FuID09IE1PREVfVEZGID8gInRmZiIgOiAiYmZmIiwgKHMtPmxvd3Bhc3MpID8gIndpdGgiIDogIndpdGhvdXQiKTsKQEAgLTE0Miw2ICsyNTIsOSBAQAogICAgICAgICBpbnQgbGluZXMgPSAocGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyKSA/IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgdnN1YikgOiBpbmxpbmstPmg7CiAgICAgICAgIHVpbnQ4X3QgKmRzdHAgPSBkc3RfZnJhbWUtPmRhdGFbcGxhbmVdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwID0gc3JjX2ZyYW1lLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgaW50IHNyY3BfbGluZXNpemUgPSBzcmNfZnJhbWUtPmxpbmVzaXplW3BsYW5lXSAqIDI7CisgICAgICAgIGludCBkc3RwX2xpbmVzaXplID0gZHN0X2ZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKiAyOworICAgICAgICBpbnQgY2xpcF9tYXggPSAoMSA8PCBzLT5jc3AtPmNvbXBbcGxhbmVdLmRlcHRoKSAtIDE7CiAKICAgICAgICAgYXZfYXNzZXJ0MChjb2xzID49IDAgfHwgbGluZXMgPj0gMCk7CiAKQEAgLTE1MSwyMyArMjY0LDI0IEBACiAgICAgICAgICAgICBkc3RwICs9IGRzdF9mcmFtZS0+bGluZXNpemVbcGxhbmVdOwogICAgICAgICB9CiAgICAgICAgIGlmIChsb3dwYXNzKSB7Ci0gICAgICAgICAgICBpbnQgc3JjcF9saW5lc2l6ZSA9IHNyY19mcmFtZS0+bGluZXNpemVbcGxhbmVdICogMjsKLSAgICAgICAgICAgIGludCBkc3RwX2xpbmVzaXplID0gZHN0X2ZyYW1lLT5saW5lc2l6ZVtwbGFuZV0gKiAyOworICAgICAgICAgICAgaW50IHggPSAwOworICAgICAgICAgICAgaWYgKGxvd3Bhc3MgPT0gVkxQRl9DTVApCisgICAgICAgICAgICAgICAgeCA9IDE7CiAgICAgICAgICAgICBmb3IgKGogPSBsaW5lczsgaiA+IDA7IGotLSkgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUgPSBzcmNwIC0gc3JjX2ZyYW1lLT5saW5lc2l6ZVtwbGFuZV07Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdyA9IHNyY3AgKyBzcmNfZnJhbWUtPmxpbmVzaXplW3BsYW5lXTsKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSBsaW5lcykKLSAgICAgICAgICAgICAgICAgICAgc3JjcF9hYm92ZSA9IHNyY3A7IC8vIHRoZXJlIGlzIG5vIGxpbmUgYWJvdmUKLSAgICAgICAgICAgICAgICBpZiAoaiA9PSAxKQotICAgICAgICAgICAgICAgICAgICBzcmNwX2JlbG93ID0gc3JjcDsgLy8gdGhlcmUgaXMgbm8gbGluZSBiZWxvdwotICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZShkc3RwLCBjb2xzLCBzcmNwLCBzcmNwX2Fib3ZlLCBzcmNwX2JlbG93KTsKKyAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiA9IHNyY19mcmFtZS0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBtcmVmID0gLXByZWY7CisgICAgICAgICAgICAgICAgaWYgKGogPj0gKGxpbmVzIC0geCkpCisgICAgICAgICAgICAgICAgICAgIG1yZWYgPSAwOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGogPD0gKDEgKyB4KSkKKyAgICAgICAgICAgICAgICAgICAgcHJlZiA9IDA7CisgICAgICAgICAgICAgICAgcy0+bG93cGFzc19saW5lKGRzdHAsIGNvbHMsIHNyY3AsIG1yZWYsIHByZWYsIGNsaXBfbWF4KTsKICAgICAgICAgICAgICAgICBkc3RwICs9IGRzdHBfbGluZXNpemU7CiAgICAgICAgICAgICAgICAgc3JjcCArPSBzcmNwX2xpbmVzaXplOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3RwLCBkc3RfZnJhbWUtPmxpbmVzaXplW3BsYW5lXSAqIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3AsIHNyY19mcmFtZS0+bGluZXNpemVbcGxhbmVdICogMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scywgbGluZXMpOworICAgICAgICAgICAgaWYgKHMtPmNzcC0+Y29tcFtwbGFuZV0uZGVwdGggPiA4KQorICAgICAgICAgICAgICAgIGNvbHMgKj0gMjsKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZHN0cCwgZHN0cF9saW5lc2l6ZSwgc3JjcCwgc3JjcF9saW5lc2l6ZSwgY29scywgbGluZXMpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfa2VybmRlaW50LmMgYi9saWJhdmZpbHRlci92Zl9rZXJuZGVpbnQuYwppbmRleCA0ODI1ZWQ1Li4wNTdkMTVmIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9rZXJuZGVpbnQuYworKysgYi9saWJhdmZpbHRlci92Zl9rZXJuZGVpbnQuYwpAQCAtMzUsNyArMzUsNyBAQAogI2luY2x1ZGUgImZvcm1hdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBLZXJuZGVpbnRDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgICAgICAgICAgIGZyYW1lOyAvLy88IGZyYW1lIGNvdW50LCBzdGFydGluZyBmcm9tIDAKICAgICBpbnQgICAgICAgICAgIHRocmVzaCwgbWFwLCBvcmRlciwgc2hhcnAsIHR3b3dheTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2xlbnNjb3JyZWN0aW9uLmMgYi9saWJhdmZpbHRlci92Zl9sZW5zY29ycmVjdGlvbi5jCmluZGV4IDlkYjQ4M2QuLjIzOWZlMTkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2xlbnNjb3JyZWN0aW9uLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfbGVuc2NvcnJlY3Rpb24uYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgICAgIH0KIAogICAgICAgICB0ZC5jb3JyZWN0aW9uID0gcmVjdC0+Y29ycmVjdGlvbltwbGFuZV07Ci0gICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgRkZNSU4oaCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKGgsIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAgICAgfQogCiAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfbGlib3BlbmN2LmMgYi9saWJhdmZpbHRlci92Zl9saWJvcGVuY3YuYwppbmRleCBmOGFlOWQ1Li44MTI4MDMwIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9saWJvcGVuY3YuYworKysgYi9saWJhdmZpbHRlci92Zl9saWJvcGVuY3YuYwpAQCAtMTU3LDcgKzE1Nyw4IEBACiAgICAgICAgIGlmIChidWZbaV0gPT0gJ1xuJykgewogICAgICAgICAgICAgaWYgKCpyb3dzID09IElOVF9NQVgpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiT3ZlcmZsb3cgb24gdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBmaWxlXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgKysoKnJvd3MpOwogICAgICAgICAgICAgKmNvbHMgPSBGRk1BWCgqY29scywgdyk7CkBAIC0xNzEsMTAgKzE3MiwxMyBAQAogICAgIGlmICgqcm93cyA+IChTSVpFX01BWCAvIHNpemVvZihpbnQpIC8gKmNvbHMpKSB7CiAgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBBVl9MT0dfRVJST1IsICJGaWxlIHdpdGggc2l6ZSAlZHglZCBpcyB0b28gYmlnXG4iLAogICAgICAgICAgICAgICAgKnJvd3MsICpjb2xzKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZW5kOwogICAgIH0KLSAgICBpZiAoISgqdmFsdWVzID0gYXZfbWFsbG9jel9hcnJheShzaXplb2YoaW50KSAqICpyb3dzLCAqY29scykpKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGlmICghKCp2YWx1ZXMgPSBhdl9tYWxsb2N6X2FycmF5KHNpemVvZihpbnQpICogKnJvd3MsICpjb2xzKSkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CiAKICAgICAvKiBmaWxsICp2YWx1ZXMgKi8KICAgICBwICAgID0gYnVmOwpAQCAtMTg4LDYgKzE5Miw4IEBACiAgICAgICAgICAgICAgICAgKCp2YWx1ZXMpWypjb2xzKmkgKyBqXSA9ICEhYXZfaXNncmFwaCgqKHArKykpOwogICAgICAgICB9CiAgICAgfQorCitlbmQ6CiAgICAgYXZfZmlsZV91bm1hcChidWYsIHNpemUpOwogCiAjaWZkZWYgREVCVUcKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX2xpYnZtYWYuYyBiL2xpYmF2ZmlsdGVyL3ZmX2xpYnZtYWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmM2YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfbGlidm1hZi5jCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNyBBc2hpc2ggUHJhdGFwIFNpbmdoIDxhc2hrNDM3MTJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDYWxjdWxhdGUgdGhlIFZNQUYgYmV0d2VlbiB0d28gaW5wdXQgdmlkZW9zLgorICovCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8bGlidm1hZi5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImZyYW1lc3luYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgTElCVk1BRkNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIEZGRnJhbWVTeW5jIGZzOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBkb3VibGUgdm1hZl9zY29yZTsKKyAgICBwdGhyZWFkX3Qgdm1hZl90aHJlYWQ7CisgICAgcHRocmVhZF9tdXRleF90IGxvY2s7CisgICAgcHRocmVhZF9jb25kX3QgY29uZDsKKyAgICBpbnQgZW9mOworICAgIEFWRnJhbWUgKmdtYWluOworICAgIEFWRnJhbWUgKmdyZWY7CisgICAgaW50IGZyYW1lX3NldDsKKyAgICBjaGFyICptb2RlbF9wYXRoOworICAgIGNoYXIgKmxvZ19wYXRoOworICAgIGNoYXIgKmxvZ19mbXQ7CisgICAgaW50IGRpc2FibGVfY2xpcDsKKyAgICBpbnQgZGlzYWJsZV9hdng7CisgICAgaW50IGVuYWJsZV90cmFuc2Zvcm07CisgICAgaW50IHBob25lX21vZGVsOworICAgIGludCBwc25yOworICAgIGludCBzc2ltOworICAgIGludCBtc19zc2ltOworICAgIGNoYXIgKnBvb2w7CisgICAgaW50IGVycm9yOworfSBMSUJWTUFGQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTElCVk1BRkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbGlidm1hZl9vcHRpb25zW10gPSB7CisgICAgeyJtb2RlbF9wYXRoIiwgICJTZXQgdGhlIG1vZGVsIHRvIGJlIHVzZWQgZm9yIGNvbXB1dGluZyB2bWFmLiIsICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKG1vZGVsX3BhdGgpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIvdXNyL2xvY2FsL3NoYXJlL21vZGVsL3ZtYWZfdjAuNi4xLnBrbCJ9LCAwLCAxLCBGTEFHU30sCisgICAgeyJsb2dfcGF0aCIsICAiU2V0IHRoZSBmaWxlIHBhdGggdG8gYmUgdXNlZCB0byBzdG9yZSBsb2dzLiIsICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGxvZ19wYXRoKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMSwgRkxBR1N9LAorICAgIHsibG9nX2ZtdCIsICAiU2V0IHRoZSBmb3JtYXQgb2YgdGhlIGxvZyAoeG1sIG9yIGpzb24pLiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChsb2dfZm10KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMSwgRkxBR1N9LAorICAgIHsiZW5hYmxlX3RyYW5zZm9ybSIsICAiRW5hYmxlcyB0cmFuc2Zvcm0gZm9yIGNvbXB1dGluZyB2bWFmLiIsICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChlbmFibGVfdHJhbnNmb3JtKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTfSwKKyAgICB7InBob25lX21vZGVsIiwgICJJbnZva2VzIHRoZSBwaG9uZSBtb2RlbCB0aGF0IHdpbGwgZ2VuZXJhdGUgaGlnaGVyIFZNQUYgc2NvcmVzLiIsICBPRkZTRVQocGhvbmVfbW9kZWwpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1N9LAorICAgIHsicHNuciIsICAiRW5hYmxlcyBjb21wdXRpbmcgcHNuciBhbG9uZyB3aXRoIHZtYWYuIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChwc25yKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTfSwKKyAgICB7InNzaW0iLCAgIkVuYWJsZXMgY29tcHV0aW5nIHNzaW0gYWxvbmcgd2l0aCB2bWFmLiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc3NpbSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxLCBGTEFHU30sCisgICAgeyJtc19zc2ltIiwgICJFbmFibGVzIGNvbXB1dGluZyBtcy1zc2ltIGFsb25nIHdpdGggdm1hZi4iLCAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKG1zX3NzaW0pLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0wfSwgMCwgMSwgRkxBR1N9LAorICAgIHsicG9vbCIsICAiU2V0IHRoZSBwb29sIG1ldGhvZCB0byBiZSB1c2VkIGZvciBjb21wdXRpbmcgdm1hZi4iLCAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChwb29sKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMSwgRkxBR1N9LAorICAgIHsgTlVMTCB9Cit9OworCitGUkFNRVNZTkNfREVGSU5FX0NMQVNTKGxpYnZtYWYsIExJQlZNQUZDb250ZXh0LCBmcyk7CisKKyNkZWZpbmUgcmVhZF9mcmFtZV9mbih0eXBlLCBiaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbnQgcmVhZF9mcmFtZV8jI2JpdHMjI2JpdChmbG9hdCAqcmVmX2RhdGEsIGZsb2F0ICptYWluX2RhdGEsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICp0ZW1wX2RhdGEsIGludCBzdHJpZGUsIHZvaWQgKmN0eCkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExJQlZNQUZDb250ZXh0ICpzID0gKExJQlZNQUZDb250ZXh0ICopIGN0eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBcCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5sb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBcCisgICAgd2hpbGUgKCFzLT5mcmFtZV9zZXQgJiYgIXMtPmVvZikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnMtPmNvbmQsICZzLT5sb2NrKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgXAorICAgIGlmIChzLT5mcmFtZV9zZXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCByZWZfc3RyaWRlID0gcy0+Z3JlZi0+bGluZXNpemVbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IG1haW5fc3RyaWRlID0gcy0+Z21haW4tPmxpbmVzaXplWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBcCisgICAgICAgIGNvbnN0IHR5cGUgKnJlZl9wdHIgPSAoY29uc3QgdHlwZSAqKSBzLT5ncmVmLT5kYXRhWzBdOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdHlwZSAqbWFpbl9wdHIgPSAoY29uc3QgdHlwZSAqKSBzLT5nbWFpbi0+ZGF0YVswXTsgICAgICAgICAgICAgICAgXAorICAgICAgICBcCisgICAgICAgIGZsb2F0ICpwdHIgPSByZWZfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXAorICAgICAgICBpbnQgaCA9IHMtPmhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB3ID0gcy0+d2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXAorICAgICAgICBpbnQgaSxqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCB3OyBqKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHRyW2pdID0gKGZsb2F0KXJlZl9wdHJbal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmVmX3B0ciArPSByZWZfc3RyaWRlIC8gc2l6ZW9mKCpyZWZfcHRyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwdHIgKz0gc3RyaWRlIC8gc2l6ZW9mKCpwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBcCisgICAgICAgIHB0ciA9IG1haW5fZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwdHJbal0gPSAoZmxvYXQpbWFpbl9wdHJbal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtYWluX3B0ciArPSBtYWluX3N0cmlkZSAvIHNpemVvZigqbWFpbl9wdHIpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHB0ciArPSBzdHJpZGUgLyBzaXplb2YoKnB0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBcCisgICAgcmV0ID0gIXMtPmZyYW1lX3NldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBcCisgICAgYXZfZnJhbWVfdW5yZWYocy0+Z3JlZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhdl9mcmFtZV91bnJlZihzLT5nbWFpbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHMtPmZyYW1lX3NldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgXAorICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnMtPmNvbmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPmxvY2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBcCisgICAgaWYgKHJldCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK3JlYWRfZnJhbWVfZm4odWludDhfdCwgOCk7CityZWFkX2ZyYW1lX2ZuKHVpbnQxNl90LCAxMCk7CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfdm1hZl9zY29yZShMSUJWTUFGQ29udGV4dCAqcykKK3sKKyAgICBpbnQgKCpyZWFkX2ZyYW1lKShmbG9hdCAqcmVmX2RhdGEsIGZsb2F0ICptYWluX2RhdGEsIGZsb2F0ICp0ZW1wX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdm9pZCAqY3R4KTsKKyAgICBjaGFyICpmb3JtYXQ7CisKKyAgICBpZiAocy0+ZGVzYy0+Y29tcFswXS5kZXB0aCA8PSA4KSB7CisgICAgICAgIHJlYWRfZnJhbWUgPSByZWFkX2ZyYW1lXzhiaXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVhZF9mcmFtZSA9IHJlYWRfZnJhbWVfMTBiaXQ7CisgICAgfQorCisgICAgZm9ybWF0ID0gKGNoYXIgKikgcy0+ZGVzYy0+bmFtZTsKKworICAgIHMtPmVycm9yID0gY29tcHV0ZV92bWFmKCZzLT52bWFmX3Njb3JlLCBmb3JtYXQsIHMtPndpZHRoLCBzLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9mcmFtZSwgcywgcy0+bW9kZWxfcGF0aCwgcy0+bG9nX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bG9nX2ZtdCwgMCwgMCwgcy0+ZW5hYmxlX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5waG9uZV9tb2RlbCwgcy0+cHNuciwgcy0+c3NpbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tc19zc2ltLCBzLT5wb29sKTsKK30KKworc3RhdGljIHZvaWQgKmNhbGxfdm1hZih2b2lkICpjdHgpCit7CisgICAgTElCVk1BRkNvbnRleHQgKnMgPSAoTElCVk1BRkNvbnRleHQgKikgY3R4OworICAgIGNvbXB1dGVfdm1hZl9zY29yZShzKTsKKyAgICBpZiAoIXMtPmVycm9yKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiVk1BRiBzY29yZTogJWZcbiIscy0+dm1hZl9zY29yZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5sb2NrKTsKKyAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcy0+Y29uZCk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5sb2NrKTsKKyAgICB9CisgICAgcHRocmVhZF9leGl0KE5VTEwpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGRvX3ZtYWYoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gZnMtPnBhcmVudDsKKyAgICBMSUJWTUFGQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICptYXN0ZXIsICpyZWY7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRfZ2V0KGZzLCAmbWFzdGVyLCAmcmVmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIXJlZikKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG1hc3Rlcik7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnMtPmxvY2spOworCisgICAgd2hpbGUgKHMtPmZyYW1lX3NldCAmJiAhcy0+ZXJyb3IpIHsKKyAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnMtPmNvbmQsICZzLT5sb2NrKTsKKyAgICB9CisKKyAgICBpZiAocy0+ZXJyb3IpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgImxpYnZtYWYgZW5jb3VudGVyZWQgYW4gZXJyb3IsIGNoZWNrIGxvZyBmb3IgZGV0YWlsc1xuIik7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5sb2NrKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9mcmFtZV9yZWYocy0+Z3JlZiwgcmVmKTsKKyAgICBhdl9mcmFtZV9yZWYocy0+Z21haW4sIG1hc3Rlcik7CisKKyAgICBzLT5mcmFtZV9zZXQgPSAxOworCisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcy0+Y29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPmxvY2spOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG1hc3Rlcik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExJQlZNQUZDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcy0+Z3JlZiA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgcy0+Z21haW4gPSBhdl9mcmFtZV9hbGxvYygpOworICAgIHMtPmVycm9yID0gMDsKKworICAgIHB0aHJlYWRfbXV0ZXhfaW5pdCgmcy0+bG9jaywgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQgKCZzLT5jb25kLCBOVUxMKTsKKworICAgIHMtPmZzLm9uX2V2ZW50ID0gZG9fdm1hZjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTBMRSwgQVZfUElYX0ZNVF9ZVVY0MjJQMTBMRSwgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisgICAgaWYgKCFmbXRzX2xpc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZtdHNfbGlzdCk7Cit9CisKKworc3RhdGljIGludCBjb25maWdfaW5wdXRfcmVmKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OworICAgIExJQlZNQUZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCB0aDsKKworICAgIGlmIChjdHgtPmlucHV0c1swXS0+dyAhPSBjdHgtPmlucHV0c1sxXS0+dyB8fAorICAgICAgICBjdHgtPmlucHV0c1swXS0+aCAhPSBjdHgtPmlucHV0c1sxXS0+aCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJXaWR0aCBhbmQgaGVpZ2h0IG9mIGlucHV0IHZpZGVvcyBtdXN0IGJlIHNhbWUuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKGN0eC0+aW5wdXRzWzBdLT5mb3JtYXQgIT0gY3R4LT5pbnB1dHNbMV0tPmZvcm1hdCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dHMgbXVzdCBiZSBvZiBzYW1lIHBpeGVsIGZvcm1hdC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBzLT53aWR0aCA9IGN0eC0+aW5wdXRzWzBdLT53OworICAgIHMtPmhlaWdodCA9IGN0eC0+aW5wdXRzWzBdLT5oOworCisgICAgdGggPSBwdGhyZWFkX2NyZWF0ZSgmcy0+dm1hZl90aHJlYWQsIE5VTEwsIGNhbGxfdm1hZiwgKHZvaWQgKikgcyk7CisgICAgaWYgKHRoKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRocmVhZCBjcmVhdGlvbiBmYWlsZWQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBMSUJWTUFGQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm1haW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX2ZyYW1lc3luY19pbml0X2R1YWxpbnB1dCgmcy0+ZnMsIGN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgb3V0bGluay0+dyA9IG1haW5saW5rLT53OworICAgIG91dGxpbmstPmggPSBtYWlubGluay0+aDsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBtYWlubGluay0+dGltZV9iYXNlOworICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBtYWlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gbWFpbmxpbmstPmZyYW1lX3JhdGU7CisgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZzLT5mcykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExJQlZNQUZDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoJnMtPmZzKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTElCVk1BRkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBmZl9mcmFtZXN5bmNfdW5pbml0KCZzLT5mcyk7CisKKyAgICBwdGhyZWFkX211dGV4X2xvY2soJnMtPmxvY2spOworICAgIHMtPmVvZiA9IDE7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcy0+Y29uZCk7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPmxvY2spOworCisgICAgcHRocmVhZF9qb2luKHMtPnZtYWZfdGhyZWFkLCBOVUxMKTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmdyZWYpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmdtYWluKTsKKworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmcy0+bG9jayk7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnMtPmNvbmQpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbGlidm1hZl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAibWFpbiIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSx7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAicmVmZXJlbmNlIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dF9yZWYsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGxpYnZtYWZfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfbGlidm1hZiA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJsaWJ2bWFmIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDYWxjdWxhdGUgdGhlIFZNQUYgYmV0d2VlbiB0d28gdmlkZW8gc3RyZWFtcy4iKSwKKyAgICAucHJlaW5pdCAgICAgICA9IGxpYnZtYWZfZnJhbWVzeW5jX3ByZWluaXQsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKExJQlZNQUZDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZsaWJ2bWFmX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICAgID0gbGlidm1hZl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBsaWJ2bWFmX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfbGltaXRlci5jIGIvbGliYXZmaWx0ZXIvdmZfbGltaXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNjJiMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9saW1pdGVyLmMKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaW1pdGVyLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgTGltaXRlckNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBtaW47CisgICAgaW50IG1heDsKKyAgICBpbnQgcGxhbmVzOworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IGxpbmVzaXplWzRdOworICAgIGludCB3aWR0aFs0XTsKKyAgICBpbnQgaGVpZ2h0WzRdOworCisgICAgTGltaXRlckRTUENvbnRleHQgZHNwOworfSBMaW1pdGVyQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTGltaXRlckNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbGltaXRlcl9vcHRpb25zW10gPSB7CisgICAgeyAibWluIiwgICAgInNldCBtaW4gdmFsdWUiLCBPRkZTRVQobWluKSwgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgICAgIDAsIDY1NTM1LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgIm1heCIsICAgICJzZXQgbWF4IHZhbHVlIiwgT0ZGU0VUKG1heCksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9NjU1MzV9LCAwLCA2NTUzNSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJwbGFuZXMiLCAic2V0IHBsYW5lcyIsICAgIE9GRlNFVChwbGFuZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTE1fSwgICAgMCwgICAgMTUsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhsaW1pdGVyKTsKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTGltaXRlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+bWluID4gcy0+bWF4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVY0MTBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTIsIEFWX1BJWF9GTVRfR0JSQVAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisgICAgaWYgKCFmbXRzX2xpc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZtdHNfbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGxpbWl0ZXI4KGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNsaW5lc2l6ZSwgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG1pbiwgaW50IG1heCkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcChzcmNbeF0sIG1pbiwgbWF4KTsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCArPSBkbGluZXNpemU7CisgICAgICAgIHNyYyArPSBzbGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBsaW1pdGVyMTYoY29uc3QgdWludDhfdCAqc3NyYywgdWludDhfdCAqZGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc2xpbmVzaXplLCBwdHJkaWZmX3QgZGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG1pbiwgaW50IG1heCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopc3NyYzsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopZGRzdDsKKyAgICBpbnQgeCwgeTsKKworICAgIGRsaW5lc2l6ZSAvPSAyOworICAgIHNsaW5lc2l6ZSAvPSAyOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBkc3RbeF0gPSBhdl9jbGlwKHNyY1t4XSwgbWluLCBtYXgpOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICs9IGRsaW5lc2l6ZTsKKyAgICAgICAgc3JjICs9IHNsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTGltaXRlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IHZzdWIsIGhzdWIsIHJldDsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMocy0+bGluZXNpemUsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBoc3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICB2c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBzLT5oZWlnaHRbMV0gPSBzLT5oZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOworICAgIHMtPmhlaWdodFswXSA9IHMtPmhlaWdodFszXSA9IGlubGluay0+aDsKKyAgICBzLT53aWR0aFsxXSAgPSBzLT53aWR0aFsyXSAgPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIGhzdWIpOworICAgIHMtPndpZHRoWzBdICA9IHMtPndpZHRoWzNdICA9IGlubGluay0+dzsKKworICAgIGlmIChkZXNjLT5jb21wWzBdLmRlcHRoID09IDgpIHsKKyAgICAgICAgcy0+ZHNwLmxpbWl0ZXIgPSBsaW1pdGVyODsKKyAgICAgICAgcy0+bWF4ID0gRkZNSU4ocy0+bWF4LCAyNTUpOworICAgICAgICBzLT5taW4gPSBGRk1JTihzLT5taW4sIDI1NSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZHNwLmxpbWl0ZXIgPSBsaW1pdGVyMTY7CisgICAgfQorCisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICBmZl9saW1pdGVyX2luaXRfeDg2KCZzLT5kc3AsIGRlc2MtPmNvbXBbMF0uZGVwdGgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIExpbWl0ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IHA7CisKKyAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CisgICAgICAgIG91dCA9IGluOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIGlmICghKCgxIDw8IHApICYgcy0+cGxhbmVzKSkgeworICAgICAgICAgICAgaWYgKG91dCAhPSBpbikKKyAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVtwXSwgb3V0LT5saW5lc2l6ZVtwXSwgaW4tPmRhdGFbcF0sIGluLT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplW3BdLCBzLT5oZWlnaHRbcF0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzLT5kc3AubGltaXRlcihpbi0+ZGF0YVtwXSwgb3V0LT5kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICBpbi0+bGluZXNpemVbcF0sIG91dC0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoW3BdLCBzLT5oZWlnaHRbcF0sCisgICAgICAgICAgICAgICAgICAgICAgIHMtPm1pbiwgcy0+bWF4KTsKKyAgICB9CisKKyAgICBpZiAob3V0ICE9IGluKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9saW1pdGVyID0geworICAgIC5uYW1lICAgICAgICAgID0gImxpbWl0ZXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkxpbWl0IHBpeGVscyBjb21wb25lbnRzIHRvIHRoZSBzcGVjaWZpZWQgcmFuZ2UuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTGltaXRlckNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmxpbWl0ZXJfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGlucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IG91dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9sdW1ha2V5LmMgYi9saWJhdmZpbHRlci92Zl9sdW1ha2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE4NTM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2x1bWFrZXkuYwpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IEx1bWFrZXlDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludCB0aHJlc2hvbGQ7CisgICAgaW50IHRvbGVyYW5jZTsKKyAgICBpbnQgc29mdG5lc3M7CisKKyAgICBpbnQgd2hpdGU7CisgICAgaW50IGJsYWNrOworICAgIGludCBtYXg7CisKKyAgICBpbnQgKCpkb19sdW1ha2V5X3NsaWNlKShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKTsKK30gTHVtYWtleUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgZG9fbHVtYWtleV9zbGljZTgoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBMdW1ha2V5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGFyZzsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoZnJhbWUtPmhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChmcmFtZS0+aGVpZ2h0ICogKGpvYm5yICsgMSkpIC8gbmJfam9iczsKKyAgICB1aW50OF90ICphbHBoYSA9IGZyYW1lLT5kYXRhWzNdICsgc2xpY2Vfc3RhcnQgKiBmcmFtZS0+bGluZXNpemVbM107CisgICAgY29uc3QgdWludDhfdCAqbHVtYSA9IGZyYW1lLT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBmcmFtZS0+bGluZXNpemVbMF07CisgICAgY29uc3QgaW50IHNvID0gcy0+c29mdG5lc3M7CisgICAgY29uc3QgaW50IHcgPSBzLT53aGl0ZTsKKyAgICBjb25zdCBpbnQgYiA9IHMtPmJsYWNrOworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGlmIChsdW1hW3hdID49IGIgJiYgbHVtYVt4XSA8PSB3KSB7CisgICAgICAgICAgICAgICAgYWxwaGFbeF0gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChsdW1hW3hdID4gYiAtIHNvICYmIGx1bWFbeF0gPCB3ICsgc28pIHsKKyAgICAgICAgICAgICAgICBpZiAobHVtYVt4XSA8IGIpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGFbeF0gPSAyNTUgLSAobHVtYVt4XSAtIGIgKyBzbykgKiAyNTUgLyBzbzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbHBoYVt4XSA9IChsdW1hW3hdIC0gdykgKiAyNTUgLyBzbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbHVtYSArPSBmcmFtZS0+bGluZXNpemVbMF07CisgICAgICAgIGFscGhhICs9IGZyYW1lLT5saW5lc2l6ZVszXTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19sdW1ha2V5X3NsaWNlMTYoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3sKKyAgICBMdW1ha2V5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpmcmFtZSA9IGFyZzsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoZnJhbWUtPmhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCA9IChmcmFtZS0+aGVpZ2h0ICogKGpvYm5yICsgMSkpIC8gbmJfam9iczsKKyAgICB1aW50MTZfdCAqYWxwaGEgPSAodWludDE2X3QgKikoZnJhbWUtPmRhdGFbM10gKyBzbGljZV9zdGFydCAqIGZyYW1lLT5saW5lc2l6ZVszXSk7CisgICAgY29uc3QgdWludDE2X3QgKmx1bWEgPSAoY29uc3QgdWludDE2X3QgKikoZnJhbWUtPmRhdGFbMF0gKyBzbGljZV9zdGFydCAqIGZyYW1lLT5saW5lc2l6ZVswXSk7CisgICAgY29uc3QgaW50IHNvID0gcy0+c29mdG5lc3M7CisgICAgY29uc3QgaW50IHcgPSBzLT53aGl0ZTsKKyAgICBjb25zdCBpbnQgYiA9IHMtPmJsYWNrOworICAgIGNvbnN0IGludCBtID0gcy0+bWF4OworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gc2xpY2Vfc3RhcnQ7IHkgPCBzbGljZV9lbmQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGlmIChsdW1hW3hdID49IGIgJiYgbHVtYVt4XSA8PSB3KSB7CisgICAgICAgICAgICAgICAgYWxwaGFbeF0gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChsdW1hW3hdID4gYiAtIHNvICYmIGx1bWFbeF0gPCB3ICsgc28pIHsKKyAgICAgICAgICAgICAgICBpZiAobHVtYVt4XSA8IGIpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGFbeF0gPSBtIC0gKGx1bWFbeF0gLSBiICsgc28pICogbSAvIHNvOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFscGhhW3hdID0gKGx1bWFbeF0gLSB3KSAqIG0gLyBzbzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbHVtYSArPSBmcmFtZS0+bGluZXNpemVbMF0gLyAyOworICAgICAgICBhbHBoYSArPSBmcmFtZS0+bGluZXNpemVbM10gLyAyOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEx1bWFrZXlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBkZXB0aDsKKworICAgIGRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBpZiAoZGVwdGggPT0gOCkgeworICAgICAgICBzLT53aGl0ZSA9IGF2X2NsaXBfdWludDgocy0+dGhyZXNob2xkICsgcy0+dG9sZXJhbmNlKTsKKyAgICAgICAgcy0+YmxhY2sgPSBhdl9jbGlwX3VpbnQ4KHMtPnRocmVzaG9sZCAtIHMtPnRvbGVyYW5jZSk7CisgICAgICAgIHMtPmRvX2x1bWFrZXlfc2xpY2UgPSBkb19sdW1ha2V5X3NsaWNlODsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5tYXggPSAoMSA8PCBkZXB0aCkgLSAxOworICAgICAgICBzLT53aGl0ZSA9IGF2X2NsaXAocy0+dGhyZXNob2xkICsgcy0+dG9sZXJhbmNlLCAwLCBzLT5tYXgpOworICAgICAgICBzLT5ibGFjayA9IGF2X2NsaXAocy0+dGhyZXNob2xkIC0gcy0+dG9sZXJhbmNlLCAwLCBzLT5tYXgpOworICAgICAgICBzLT5kb19sdW1ha2V5X3NsaWNlID0gZG9fbHVtYWtleV9zbGljZTE2OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gbGluay0+ZHN0OworICAgIEx1bWFrZXlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CisKKyAgICBpZiAocmV0ID0gYXZfZnJhbWVfbWFrZV93cml0YWJsZShmcmFtZSkpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocmV0ID0gY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHMtPmRvX2x1bWFrZXlfc2xpY2UsIGZyYW1lLCBOVUxMLCBGRk1JTihmcmFtZS0+aGVpZ2h0LCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIGZyYW1lKTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhlbF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFA5LCBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjBQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjBQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmb3JtYXRzOworCisgICAgZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4ZWxfZm10cyk7CisgICAgaWYgKCFmb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZvcm1hdHMpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbHVtYWtleV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGx1bWFrZXlfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEx1bWFrZXlDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGx1bWFrZXlfb3B0aW9uc1tdID0geworICAgIHsgInRocmVzaG9sZCIsICJzZXQgdGhlIHRocmVzaG9sZCB2YWx1ZSIsIE9GRlNFVCh0aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInRvbGVyYW5jZSIsICJzZXQgdGhlIHRvbGVyYW5jZSB2YWx1ZSIsIE9GRlNFVCh0b2xlcmFuY2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInNvZnRuZXNzIiwgICJzZXQgdGhlIHNvZnRuZXNzIHZhbHVlIiwgIE9GRlNFVChzb2Z0bmVzcyksICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MobHVtYWtleSk7CisKK0FWRmlsdGVyIGZmX3ZmX2x1bWFrZXkgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAibHVtYWtleSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVHVybnMgYSBjZXJ0YWluIGx1bWEgaW50byB0cmFuc3BhcmVuY3kuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTHVtYWtleUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmx1bWFrZXlfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gbHVtYWtleV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBsdW1ha2V5X291dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfR0VORVJJQyB8IEFWRklMVEVSX0ZMQUdfU0xJQ0VfVEhSRUFEUywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9sdXQuYyBiL2xpYmF2ZmlsdGVyL3ZmX2x1dC5jCmluZGV4IDUxNDg2NjMuLjI2ZjI5NDUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX2x1dC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2x1dC5jCkBAIC02Niw2ICs2Niw3IEBACiAgICAgaW50IGhzdWIsIHZzdWI7CiAgICAgZG91YmxlIHZhcl92YWx1ZXNbVkFSX1ZBUlNfTkJdOwogICAgIGludCBpc19yZ2IsIGlzX3l1djsKKyAgICBpbnQgaXNfcGxhbmFyOwogICAgIGludCBpc18xNmJpdDsKICAgICBpbnQgc3RlcDsKICAgICBpbnQgbmVnYXRlX2FscGhhOyAvKiBvbmx5IHVzZWQgYnkgbmVnYXRlICovCkBAIC04MywxNyArODQsMTcgQEAKICNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCiAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7Ci0gICAgeyAiYzAiLCAic2V0IGNvbXBvbmVudCAjMCBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbMF0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAidmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAotICAgIHsgImMxIiwgInNldCBjb21wb25lbnQgIzEgZXhwcmVzc2lvbiIsIE9GRlNFVChjb21wX2V4cHJfc3RyWzFdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKLSAgICB7ICJjMiIsICJzZXQgY29tcG9uZW50ICMyIGV4cHJlc3Npb24iLCBPRkZTRVQoY29tcF9leHByX3N0clsyXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJ2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCi0gICAgeyAiYzMiLCAic2V0IGNvbXBvbmVudCAjMyBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbM10pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAidmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAotICAgIHsgInkiLCAgInNldCBZIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW1ldKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKLSAgICB7ICJ1IiwgICJzZXQgVSBleHByZXNzaW9uIiwgICAgICAgICAgICBPRkZTRVQoY29tcF9leHByX3N0cltVXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJ2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCi0gICAgeyAidiIsICAic2V0IFYgZXhwcmVzc2lvbiIsICAgICAgICAgICAgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbVl0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAidmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAotICAgIHsgInIiLCAgInNldCBSIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW1JdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKLSAgICB7ICJnIiwgICJzZXQgRyBleHByZXNzaW9uIiwgICAgICAgICAgICBPRkZTRVQoY29tcF9leHByX3N0cltHXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJ2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCi0gICAgeyAiYiIsICAic2V0IEIgZXhwcmVzc2lvbiIsICAgICAgICAgICAgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbQl0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAidmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAotICAgIHsgImEiLCAgInNldCBBIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW0FdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjMCIsICJzZXQgY29tcG9uZW50ICMwIGV4cHJlc3Npb24iLCBPRkZTRVQoY29tcF9leHByX3N0clswXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJjbGlwdmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImMxIiwgInNldCBjb21wb25lbnQgIzEgZXhwcmVzc2lvbiIsIE9GRlNFVChjb21wX2V4cHJfc3RyWzFdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImNsaXB2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYzIiLCAic2V0IGNvbXBvbmVudCAjMiBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbMl0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiY2xpcHZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjMyIsICJzZXQgY29tcG9uZW50ICMzIGV4cHJlc3Npb24iLCBPRkZTRVQoY29tcF9leHByX3N0clszXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJjbGlwdmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInkiLCAgInNldCBZIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW1ldKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImNsaXB2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAidSIsICAic2V0IFUgZXhwcmVzc2lvbiIsICAgICAgICAgICAgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbVV0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiY2xpcHZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJ2IiwgICJzZXQgViBleHByZXNzaW9uIiwgICAgICAgICAgICBPRkZTRVQoY29tcF9leHByX3N0cltWXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJjbGlwdmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInIiLCAgInNldCBSIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW1JdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImNsaXB2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZyIsICAic2V0IEcgZXhwcmVzc2lvbiIsICAgICAgICAgICAgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbR10pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiY2xpcHZhbCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJiIiwgICJzZXQgQiBleHByZXNzaW9uIiwgICAgICAgICAgICBPRkZTRVQoY29tcF9leHByX3N0cltCXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJjbGlwdmFsIiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImEiLCAgInNldCBBIGV4cHJlc3Npb24iLCAgICAgICAgICAgIE9GRlNFVChjb21wX2V4cHJfc3RyW0FdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImNsaXB2YWwiIH0sIC5mbGFncyA9IEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTEyNiwxMSArMTI3LDIxIEBACiAgICAgQVZfUElYX0ZNVF9BUkdCLCAgICAgICAgIEFWX1BJWF9GTVRfUkdCQSwgICAgICAgICBcCiAgICAgQVZfUElYX0ZNVF9BQkdSLCAgICAgICAgIEFWX1BJWF9GTVRfQkdSQSwgICAgICAgICBcCiAgICAgQVZfUElYX0ZNVF9SR0IyNCwgICAgICAgIEFWX1BJWF9GTVRfQkdSMjQsICAgICAgICBcCi0gICAgQVZfUElYX0ZNVF9SR0I0OExFLCAgICAgIEFWX1BJWF9GTVRfUkdCQTY0TEUKKyAgICBBVl9QSVhfRk1UX1JHQjQ4TEUsICAgICAgQVZfUElYX0ZNVF9SR0JBNjRMRSwgICAgIFwKKyAgICBBVl9QSVhfRk1UX0dCUlAsICAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgICAgICAgIFwKKyAgICBBVl9QSVhfRk1UX0dCUlA5TEUsICAgICAgQVZfUElYX0ZNVF9HQlJQMTBMRSwgICAgIFwKKyAgICBBVl9QSVhfRk1UX0dCUkFQMTBMRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMkxFLCAgICAgQVZfUElYX0ZNVF9HQlJQMTRMRSwgICAgIFwKKyAgICBBVl9QSVhfRk1UX0dCUlAxNkxFLCAgICAgQVZfUElYX0ZNVF9HQlJBUDEyTEUsICAgIFwKKyAgICBBVl9QSVhfRk1UX0dCUkFQMTZMRQorCisjZGVmaW5lIEdSQVlfRk9STUFUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOUxFLCBBVl9QSVhfRk1UX0dSQVkxMExFLCBcCisgICAgQVZfUElYX0ZNVF9HUkFZMTJMRSwgQVZfUElYX0ZNVF9HUkFZMTZMRQogCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHl1dl9waXhfZm10c1tdID0geyBZVVZfRk9STUFUUywgQVZfUElYX0ZNVF9OT05FIH07CiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHJnYl9waXhfZm10c1tdID0geyBSR0JfRk9STUFUUywgQVZfUElYX0ZNVF9OT05FIH07Ci1zdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGFsbF9waXhfZm10c1tdID0geyBSR0JfRk9STUFUUywgWVVWX0ZPUk1BVFMsIEFWX1BJWF9GTVRfTk9ORSB9Oworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBhbGxfcGl4X2ZtdHNbXSA9IHsgUkdCX0ZPUk1BVFMsIFlVVl9GT1JNQVRTLCBHUkFZX0ZPUk1BVFMsIEFWX1BJWF9GTVRfTk9ORSB9OwogCiBzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CkBAIC0yNTksNyArMjcwLDcgQEAKICAgICAgICAgbWF4W1ldID0gMjM1ICogKDEgPDwgKGRlc2MtPmNvbXBbMF0uZGVwdGggLSA4KSk7CiAgICAgICAgIG1heFtVXSA9IDI0MCAqICgxIDw8IChkZXNjLT5jb21wWzFdLmRlcHRoIC0gOCkpOwogICAgICAgICBtYXhbVl0gPSAyNDAgKiAoMSA8PCAoZGVzYy0+Y29tcFsyXS5kZXB0aCAtIDgpKTsKLSAgICAgICAgbWF4W0FdID0gKDEgPDwgZGVzYy0+Y29tcFszXS5kZXB0aCkgLSAxOworICAgICAgICBtYXhbQV0gPSAoMSA8PCBkZXNjLT5jb21wWzBdLmRlcHRoKSAtIDE7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OExFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRMRToKQEAgLTI2OCwxMCArMjc5LDExIEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIG1pblswXSA9IG1pblsxXSA9IG1pblsyXSA9IG1pblszXSA9IDA7Ci0gICAgICAgIG1heFswXSA9IG1heFsxXSA9IG1heFsyXSA9IG1heFszXSA9IDI1NTsKKyAgICAgICAgbWF4WzBdID0gbWF4WzFdID0gbWF4WzJdID0gbWF4WzNdID0gMjU1ICogKDEgPDwgKGRlc2MtPmNvbXBbMF0uZGVwdGggLSA4KSk7CiAgICAgfQogCiAgICAgcy0+aXNfeXV2ID0gcy0+aXNfcmdiID0gMDsKKyAgICBzLT5pc19wbGFuYXIgPSBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVI7CiAgICAgaWYgICAgICAoZmZfZm10X2lzX2luKGlubGluay0+Zm9ybWF0LCB5dXZfcGl4X2ZtdHMpKSBzLT5pc195dXYgPSAxOwogICAgIGVsc2UgaWYgKGZmX2ZtdF9pc19pbihpbmxpbmstPmZvcm1hdCwgcmdiX3BpeF9mbXRzKSkgcy0+aXNfcmdiID0gMTsKIApAQCAtMzAzLDcgKzMxNSw3IEBACiAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX01BWFZBTF0gPSBtYXhbY29sb3JdOwogICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9NSU5WQUxdID0gbWluW2NvbG9yXTsKIAotICAgICAgICBmb3IgKHZhbCA9IDA7IHZhbCA8ICgxIDw8IGRlc2MtPmNvbXBbMF0uZGVwdGgpOyB2YWwrKykgeworICAgICAgICBmb3IgKHZhbCA9IDA7IHZhbCA8IEZGX0FSUkFZX0VMRU1TKHMtPmx1dFtjb21wXSk7IHZhbCsrKSB7CiAgICAgICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9WQUxdID0gdmFsOwogICAgICAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfQ0xJUFZBTF0gPSBhdl9jbGlwKHZhbCwgbWluW2NvbG9yXSwgbWF4W2NvbG9yXSk7CiAgICAgICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9ORUdWQUxdID0KQEAgLTMxNyw3ICszMjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBzLT5jb21wX2V4cHJfc3RyW2NvbG9yXSwgdmFsLCBjb21wKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+bHV0W2NvbXBdW3ZhbF0gPSBhdl9jbGlwKChpbnQpcmVzLCBtaW5bY29sb3JdLCBtYXhbY29sb3JdKTsKKyAgICAgICAgICAgIHMtPmx1dFtjb21wXVt2YWxdID0gYXZfY2xpcCgoaW50KXJlcywgMCwgbWF4W0FdKTsKICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgInZhbFslZF1bJWRdID0gJWRcbiIsIGNvbXAsIHZhbCwgcy0+bHV0W2NvbXBdW3ZhbF0pOwogICAgICAgICB9CiAgICAgfQpAQCAtMzQ1LDcgKzM1Nyw3IEBACiAgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CiAgICAgfQogCi0gICAgaWYgKHMtPmlzX3JnYiAmJiBzLT5pc18xNmJpdCkgeworICAgIGlmIChzLT5pc19yZ2IgJiYgcy0+aXNfMTZiaXQgJiYgIXMtPmlzX3BsYW5hcikgewogICAgICAgICAvKiBwYWNrZWQsIDE2LWJpdCAqLwogICAgICAgICB1aW50MTZfdCAqaW5yb3csICpvdXRyb3csICppbnJvdzAsICpvdXRyb3cwOwogICAgICAgICBjb25zdCBpbnQgdyA9IGlubGluay0+dzsKQEAgLTM4Miw3ICszOTQsNyBAQAogICAgICAgICAgICAgaW5yb3cwICArPSBpbl9saW5lc2l6ZTsKICAgICAgICAgICAgIG91dHJvdzAgKz0gb3V0X2xpbmVzaXplOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzLT5pc19yZ2IpIHsKKyAgICB9IGVsc2UgaWYgKHMtPmlzX3JnYiAmJiAhcy0+aXNfcGxhbmFyKSB7CiAgICAgICAgIC8qIHBhY2tlZCAqLwogICAgICAgICB1aW50OF90ICppbnJvdywgKm91dHJvdywgKmlucm93MCwgKm91dHJvdzA7CiAgICAgICAgIGNvbnN0IGludCB3ID0gaW5saW5rLT53OwpAQCAtNDEyLDcgKzQyNCw3IEBACiAgICAgICAgICAgICBvdXRyb3cwICs9IG91dF9saW5lc2l6ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAocy0+aXNfMTZiaXQpIHsKLSAgICAgICAgLy8gcGxhbmFyIHl1diA+OCBiaXQgZGVwdGgKKyAgICAgICAgLy8gcGxhbmFyID44IGJpdCBkZXB0aAogICAgICAgICB1aW50MTZfdCAqaW5yb3csICpvdXRyb3c7CiAKICAgICAgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNCAmJiBpbi0+ZGF0YVtwbGFuZV0gJiYgaW4tPmxpbmVzaXplW3BsYW5lXTsgcGxhbmUrKykgewpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfbHV0Mi5jIGIvbGliYXZmaWx0ZXIvdmZfbHV0Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODVjYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9sdXQyLmMKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJ3IiwgICAgICAgIC8vLzwgd2lkdGggb2YgdGhlIGlucHV0IHZpZGVvCisgICAgImgiLCAgICAgICAgLy8vPCBoZWlnaHQgb2YgdGhlIGlucHV0IHZpZGVvCisgICAgIngiLCAgICAgICAgLy8vPCBpbnB1dCB2YWx1ZSBmb3IgdGhlIHBpeGVsIGZyb20gaW5wdXQgIzEKKyAgICAieSIsICAgICAgICAvLy88IGlucHV0IHZhbHVlIGZvciB0aGUgcGl4ZWwgZnJvbSBpbnB1dCAjMgorICAgICJiZHgiLCAgICAgIC8vLzwgaW5wdXQgIzEgdmlkZW8gYml0ZGVwdGgKKyAgICAiYmR5IiwgICAgICAvLy88IGlucHV0ICMyIHZpZGVvIGJpdGRlcHRoCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX1csCisgICAgVkFSX0gsCisgICAgVkFSX1gsCisgICAgVkFSX1ksCisgICAgVkFSX0JJVERFUFRIWCwKKyAgICBWQVJfQklUREVQVEhZLAorICAgIFZBUl9WQVJTX05CCit9OworCit0eXBlZGVmIHN0cnVjdCBMVVQyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgRkZGcmFtZVN5bmMgZnM7CisKKyAgICBjaGFyICAgKmNvbXBfZXhwcl9zdHJbNF07CisKKyAgICBBVkV4cHIgKmNvbXBfZXhwcls0XTsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CisgICAgdWludDE2X3QgKmx1dFs0XTsgIC8vLzwgbG9va3VwIHRhYmxlIGZvciBlYWNoIGNvbXBvbmVudAorICAgIGludCB3aWR0aFs0XSwgaGVpZ2h0WzRdOworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IGRlcHRoLCBkZXB0aHgsIGRlcHRoeTsKKyAgICBpbnQgdGx1dDI7CisgICAgQVZGcmFtZSAqcHJldl9mcmFtZTsgICAgICAgIC8qIG9ubHkgdXNlZCB3aXRoIHRsdXQyICovCisKKyAgICB2b2lkICgqbHV0Mikoc3RydWN0IExVVDJDb250ZXh0ICpzLCBBVkZyYW1lICpkc3QsIEFWRnJhbWUgKnNyY3gsIEFWRnJhbWUgKnNyY3kpOworCit9IExVVDJDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihMVVQyQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiYzAiLCAic2V0IGNvbXBvbmVudCAjMCBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbMF0pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAieCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjMSIsICJzZXQgY29tcG9uZW50ICMxIGV4cHJlc3Npb24iLCBPRkZTRVQoY29tcF9leHByX3N0clsxXSksICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJ4IiB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImMyIiwgInNldCBjb21wb25lbnQgIzIgZXhwcmVzc2lvbiIsIE9GRlNFVChjb21wX2V4cHJfc3RyWzJdKSwgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIngiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYzMiLCAic2V0IGNvbXBvbmVudCAjMyBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbM10pLCAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAieCIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTFVUMkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmZl9mcmFtZXN5bmNfdW5pbml0KCZzLT5mcyk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldl9mcmFtZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIGF2X2V4cHJfZnJlZShzLT5jb21wX2V4cHJbaV0pOworICAgICAgICBzLT5jb21wX2V4cHJbaV0gPSBOVUxMOworICAgICAgICBhdl9mcmVlcCgmcy0+Y29tcF9leHByX3N0cltpXSk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5sdXRbaV0pOworICAgIH0KK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFA5LCBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQLCBBVl9QSVhfRk1UX0dCUkFQMTAsIEFWX1BJWF9GTVRfR0JSQVAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKTsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXR4KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTFVUMkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IGhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIGludCB2c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKyAgICBzLT5oZWlnaHRbMV0gPSBzLT5oZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOworICAgIHMtPmhlaWdodFswXSA9IHMtPmhlaWdodFszXSA9IGlubGluay0+aDsKKyAgICBzLT53aWR0aFsxXSAgPSBzLT53aWR0aFsyXSAgPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIGhzdWIpOworICAgIHMtPndpZHRoWzBdICA9IHMtPndpZHRoWzNdICA9IGlubGluay0+dzsKKworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ddID0gaW5saW5rLT53OworICAgIHMtPnZhcl92YWx1ZXNbVkFSX0hdID0gaW5saW5rLT5oOworICAgIHMtPmRlcHRoeCA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfQklUREVQVEhYXSA9IHMtPmRlcHRoeDsKKworICAgIGlmIChzLT50bHV0MikgeworICAgICAgICBzLT5kZXB0aHkgPSBkZXNjLT5jb21wWzBdLmRlcHRoOworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9CSVRERVBUSFldID0gcy0+ZGVwdGh5OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dHkoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBMVVQyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKworICAgIHMtPmRlcHRoeSA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfQklUREVQVEhZXSA9IHMtPmRlcHRoeTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsdXQyXzhiaXQoc3RydWN0IExVVDJDb250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIEFWRnJhbWUgKnNyY3gsIEFWRnJhbWUgKnNyY3kpCit7CisgICAgaW50IHAsIHksIHg7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKmx1dCA9IHMtPmx1dFtwXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjeHgsICpzcmN5eTsKKyAgICAgICAgdWludDhfdCAqZHN0OworCisgICAgICAgIGRzdCAgID0gb3V0LT5kYXRhW3BdOworICAgICAgICBzcmN4eCA9IHNyY3gtPmRhdGFbcF07CisgICAgICAgIHNyY3l5ID0gc3JjeS0+ZGF0YVtwXTsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+aGVpZ2h0W3BdOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT53aWR0aFtwXTsgeCsrKSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gbHV0WyhzcmN5eVt4XSA8PCBzLT5kZXB0aHgpIHwgc3JjeHhbeF1dOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3QgICArPSBvdXQtPmxpbmVzaXplW3BdOworICAgICAgICAgICAgc3JjeHggKz0gc3JjeC0+bGluZXNpemVbcF07CisgICAgICAgICAgICBzcmN5eSArPSBzcmN5LT5saW5lc2l6ZVtwXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgbHV0Ml8xNmJpdChzdHJ1Y3QgTFVUMkNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCwgQVZGcmFtZSAqc3JjeCwgQVZGcmFtZSAqc3JjeSkKK3sKKyAgICBpbnQgcCwgeSwgeDsKKworICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqbHV0ID0gcy0+bHV0W3BdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjeHgsICpzcmN5eTsKKyAgICAgICAgdWludDE2X3QgKmRzdDsKKworICAgICAgICBkc3QgICA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwXTsKKyAgICAgICAgc3JjeHggPSAodWludDE2X3QgKilzcmN4LT5kYXRhW3BdOworICAgICAgICBzcmN5eSA9ICh1aW50MTZfdCAqKXNyY3ktPmRhdGFbcF07CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHMtPmhlaWdodFtwXTsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+d2lkdGhbcF07IHgrKykgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IGx1dFsoc3JjeXlbeF0gPDwgcy0+ZGVwdGh4KSB8IHNyY3h4W3hdXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0ICAgKz0gb3V0LT5saW5lc2l6ZVtwXSAgLyAyOworICAgICAgICAgICAgc3JjeHggKz0gc3JjeC0+bGluZXNpemVbcF0gLyAyOworICAgICAgICAgICAgc3JjeXkgKz0gc3JjeS0+bGluZXNpemVbcF0gLyAyOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZnJhbWUoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gZnMtPnBhcmVudDsKKyAgICBMVVQyQ29udGV4dCAqcyA9IGZzLT5vcGFxdWU7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dCwgKnNyY3ggPSBOVUxMLCAqc3JjeSA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2dldF9mcmFtZSgmcy0+ZnMsIDAsICZzcmN4LCAwKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMSwgJnNyY3ksIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoY3R4LT5pc19kaXNhYmxlZCB8fCAhc3JjeSkgeworICAgICAgICBvdXQgPSBhdl9mcmFtZV9jbG9uZShzcmN4KTsKKyAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIHNyY3gpOworCisgICAgICAgIHMtPmx1dDIocywgb3V0LCBzcmN4LCBzcmN5KTsKKyAgICB9CisKKyAgICBvdXQtPnB0cyA9IGF2X3Jlc2NhbGVfcShzLT5mcy5wdHMsIHMtPmZzLnRpbWVfYmFzZSwgb3V0bGluay0+dGltZV9iYXNlKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBMVVQyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcCwgcmV0OworCisgICAgcy0+ZGVwdGggPSBzLT5kZXB0aHggKyBzLT5kZXB0aHk7CisKKyAgICBzLT5sdXQyID0gcy0+ZGVwdGggPiAxNiA/IGx1dDJfMTZiaXQgOiBsdXQyXzhiaXQ7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgcy0+bHV0W3BdID0gYXZfbWFsbG9jX2FycmF5KDEgPDwgcy0+ZGVwdGgsIHNpemVvZih1aW50MTZfdCkpOworICAgICAgICBpZiAoIXMtPmx1dFtwXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIGRvdWJsZSByZXM7CisgICAgICAgIGludCB4LCB5OworCisgICAgICAgIC8qIGNyZWF0ZSB0aGUgcGFyc2VkIGV4cHJlc3Npb24gKi8KKyAgICAgICAgYXZfZXhwcl9mcmVlKHMtPmNvbXBfZXhwcltwXSk7CisgICAgICAgIHMtPmNvbXBfZXhwcltwXSA9IE5VTEw7CisgICAgICAgIHJldCA9IGF2X2V4cHJfcGFyc2UoJnMtPmNvbXBfZXhwcltwXSwgcy0+Y29tcF9leHByX3N0cltwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoZW4gcGFyc2luZyB0aGUgZXhwcmVzc2lvbiAnJXMnIGZvciB0aGUgY29tcG9uZW50ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5jb21wX2V4cHJfc3RyW3BdLCBwKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb21wdXRlIHRoZSBsdXQgKi8KKyAgICAgICAgZm9yICh5ID0gMDsgeSA8ICgxIDw8IHMtPmRlcHRoeCk7IHkrKykgeworICAgICAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfWV0gPSB5OworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8ICgxIDw8IHMtPmRlcHRoeCk7IHgrKykgeworICAgICAgICAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdID0geDsKKyAgICAgICAgICAgICAgICByZXMgPSBhdl9leHByX2V2YWwocy0+Y29tcF9leHByW3BdLCBzLT52YXJfdmFsdWVzLCBzKTsKKyAgICAgICAgICAgICAgICBpZiAoaXNuYW4ocmVzKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uICclcycgZm9yIHRoZSB2YWx1ZXMgJWQgYW5kICVkIGZvciB0aGUgY29tcG9uZW50ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbXBfZXhwcl9zdHJbcF0sIHgsIHksIHApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHMtPmx1dFtwXVsoeSA8PCBzLT5kZXB0aHgpICsgeF0gPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBsdXQyX2NvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIExVVDJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqc3JjeCA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqc3JjeSA9IGN0eC0+aW5wdXRzWzFdOworICAgIEZGRnJhbWVTeW5jSW4gKmluOworICAgIGludCByZXQ7CisKKyAgICBpZiAoc3JjeC0+Zm9ybWF0ICE9IHNyY3ktPmZvcm1hdCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dHMgbXVzdCBiZSBvZiBzYW1lIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGlmIChzcmN4LT53ICE9IHNyY3ktPncgfHwgc3JjeC0+aCAhPSBzcmN5LT5oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZpcnN0IGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAiCisgICAgICAgICAgICAgICAiKHNpemUgJWR4JWQpIGRvIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyAiCisgICAgICAgICAgICAgICAic2Vjb25kIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAoc2l6ZSAlZHglZClcbiIsCisgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbMF0ubmFtZSwgc3JjeC0+dywgc3JjeC0+aCwKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1sxXS5uYW1lLAorICAgICAgICAgICAgICAgc3JjeS0+dywgc3JjeS0+aCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgb3V0bGluay0+dyA9IHNyY3gtPnc7CisgICAgb3V0bGluay0+aCA9IHNyY3gtPmg7CisgICAgb3V0bGluay0+dGltZV9iYXNlID0gc3JjeC0+dGltZV9iYXNlOworICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzcmN4LT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBzcmN4LT5mcmFtZV9yYXRlOworCisgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfaW5pdCgmcy0+ZnMsIGN0eCwgMikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGluID0gcy0+ZnMuaW47CisgICAgaW5bMF0udGltZV9iYXNlID0gc3JjeC0+dGltZV9iYXNlOworICAgIGluWzFdLnRpbWVfYmFzZSA9IHNyY3ktPnRpbWVfYmFzZTsKKyAgICBpblswXS5zeW5jICAgPSAyOworICAgIGluWzBdLmJlZm9yZSA9IEVYVF9TVE9QOworICAgIGluWzBdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBpblsxXS5zeW5jICAgPSAxOworICAgIGluWzFdLmJlZm9yZSA9IEVYVF9TVE9QOworICAgIGluWzFdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBzLT5mcy5vcGFxdWUgICA9IHM7CisgICAgcy0+ZnMub25fZXZlbnQgPSBwcm9jZXNzX2ZyYW1lOworCisgICAgaWYgKChyZXQgPSBjb25maWdfb3V0cHV0KG91dGxpbmspKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2NvbmZpZ3VyZSgmcy0+ZnMpOworfQorCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIExVVDJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoJnMtPmZzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJzcmN4IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dHgsCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAic3JjeSIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXR5LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gbHV0Ml9jb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNkZWZpbmUgbHV0Ml9vcHRpb25zIG9wdGlvbnMKKworRlJBTUVTWU5DX0RFRklORV9DTEFTUyhsdXQyLCBMVVQyQ29udGV4dCwgZnMpOworCitBVkZpbHRlciBmZl92Zl9sdXQyID0geworICAgIC5uYW1lICAgICAgICAgID0gImx1dDIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbXB1dGUgYW5kIGFwcGx5IGEgbG9va3VwIHRhYmxlIGZyb20gdHdvIHZpZGVvIGlucHV0cy4iKSwKKyAgICAucHJlaW5pdCAgICAgICA9IGx1dDJfZnJhbWVzeW5jX3ByZWluaXQsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTFVUMkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmx1dDJfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgID0gYWN0aXZhdGUsCisgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMLAorfTsKKworI2lmIENPTkZJR19UTFVUMl9GSUxURVIKKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTFVUMkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT50bHV0MiA9ICFzdHJjbXAoY3R4LT5maWx0ZXItPm5hbWUsICJ0bHV0MiIpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGx1dDJfZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBMVVQyQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOworCisgICAgaWYgKHMtPnByZXZfZnJhbWUpIHsKKyAgICAgICAgQVZGcmFtZSAqb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnByZXZfZnJhbWUpOworICAgICAgICAgICAgcy0+cHJldl9mcmFtZSA9IGZyYW1lOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgZnJhbWUpOworICAgICAgICBzLT5sdXQyKHMsIG91dCwgZnJhbWUsIHMtPnByZXZfZnJhbWUpOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2X2ZyYW1lKTsKKyAgICAgICAgcy0+cHJldl9mcmFtZSA9IGZyYW1lOworICAgICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CisgICAgfQorICAgIHMtPnByZXZfZnJhbWUgPSBmcmFtZTsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSB0bHV0Ml9vcHRpb25zIG9wdGlvbnMKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHRsdXQyKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHRsdXQyX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICA9IHRsdXQyX2ZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfaW5wdXR4LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0bHV0Ml9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl90bHV0MiA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJ0bHV0MiIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ29tcHV0ZSBhbmQgYXBwbHkgYSBsb29rdXAgdGFibGUgZnJvbSB0d28gc3VjY2Vzc2l2ZSBmcmFtZXMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTFVUMkNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnRsdXQyX2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSB0bHV0Ml9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSB0bHV0Ml9vdXRwdXRzLAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9sdXQzZC5jIGIvbGliYXZmaWx0ZXIvdmZfbHV0M2QuYwppbmRleCAyYjhlMDI3Li5jOWI3MjI0IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9sdXQzZC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX2x1dDNkLmMKQEAgLTMxLDggKzMxLDggQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImRyYXd1dGlscy5oIgotI2luY2x1ZGUgImR1YWxpbnB1dC5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAKQEAgLTcwLDcgKzcwLDcgQEAKICAgICBpbnQgY2x1dF9zdGVwOwogICAgIGludCBjbHV0X2lzMTZiaXQ7CiAgICAgaW50IGNsdXRfd2lkdGg7Ci0gICAgRkZEdWFsSW5wdXRDb250ZXh0IGRpbnB1dDsKKyAgICBGRkZyYW1lU3luYyBmczsKICNlbmRpZgogfSBMVVQzRENvbnRleHQ7CiAKQEAgLTMyMCw2ICszMjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJnYnZlYyAqdmVjID0gJmx1dDNkLT5sdXRbaV1bal1ba107CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKK3RyeV9hZ2FpbjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVhUX0xJTkUoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGxpbmUsICJET01BSU5fIiwgNykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnZhbHMgPSBOVUxMOwpAQCAtMzMwLDcgKzMzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzY2FuZihsaW5lICsgMTEsICIlZiAlZiAlZiIsIHZhbHMsIHZhbHMgKyAxLCB2YWxzICsgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIm1pbjogJWYgJWYgJWYgfCBtYXg6ICVmICVmICVmXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluWzBdLCBtaW5bMV0sIG1pblsyXSwgbWF4WzBdLCBtYXhbMV0sIG1heFsyXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHRyeV9hZ2FpbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChza2lwX2xpbmUobGluZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiJWYgJWYgJWYiLCAmdmVjLT5yLCAmdmVjLT5nLCAmdmVjLT5iKSAhPSAzKQpAQCAtNTMxLDcgKzUzMiw3IEBACiAKICAgICB0ZC5pbiAgPSBpbjsKICAgICB0ZC5vdXQgPSBvdXQ7Ci0gICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGx1dDNkLT5pbnRlcnAsICZ0ZCwgTlVMTCwgRkZNSU4ob3V0bGluay0+aCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBsdXQzZC0+aW50ZXJwLCAmdGQsIE5VTEwsIEZGTUlOKG91dGxpbmstPmgsIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAKICAgICBpZiAob3V0ICE9IGluKQogICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CkBAIC02ODAsMjQgKzY4MSwyMSBAQAogICAgIExVVDNEQ29udGV4dCAqbHV0M2QgPSBjdHgtPnByaXY7CiAgICAgaW50IHJldDsKIAorICAgIHJldCA9IGZmX2ZyYW1lc3luY19pbml0X2R1YWxpbnB1dCgmbHV0M2QtPmZzLCBjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogICAgIG91dGxpbmstPncgPSBjdHgtPmlucHV0c1swXS0+dzsKICAgICBvdXRsaW5rLT5oID0gY3R4LT5pbnB1dHNbMF0tPmg7CiAgICAgb3V0bGluay0+dGltZV9iYXNlID0gY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZTsKLSAgICBpZiAoKHJldCA9IGZmX2R1YWxpbnB1dF9pbml0KGN0eCwgJmx1dDNkLT5kaW5wdXQpKSA8IDApCisgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZsdXQzZC0+ZnMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lX2hhbGQoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQorc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBMVVQzRENvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICByZXR1cm4gZmZfZHVhbGlucHV0X2ZpbHRlcl9mcmFtZSgmcy0+ZGlucHV0LCBpbmxpbmssIGlucGljcmVmKTsKLX0KLQotc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKLXsKLSAgICBMVVQzRENvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7Ci0gICAgcmV0dXJuIGZmX2R1YWxpbnB1dF9yZXF1ZXN0X2ZyYW1lKCZzLT5kaW5wdXQsIG91dGxpbmspOworICAgIExVVDNEQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7CiB9CiAKIHN0YXRpYyBpbnQgY29uZmlnX2NsdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCkBAIC03NTAsNDUgKzc0OCw1MCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgQVZGcmFtZSAqdXBkYXRlX2FwcGx5X2NsdXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKm1haW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc2Vjb25kKQorc3RhdGljIGludCB1cGRhdGVfYXBwbHlfY2x1dChGRkZyYW1lU3luYyAqZnMpCiB7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OwogICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGcmFtZSAqbWFzdGVyLCAqc2Vjb25kLCAqb3V0OworICAgIGludCByZXQ7CisKKyAgICByZXQgPSBmZl9mcmFtZXN5bmNfZHVhbGlucHV0X2dldChmcywgJm1hc3RlciwgJnNlY29uZCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKCFzZWNvbmQpCisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBtYXN0ZXIpOwogICAgIHVwZGF0ZV9jbHV0KGN0eC0+cHJpdiwgc2Vjb25kKTsKLSAgICByZXR1cm4gYXBwbHlfbHV0KGlubGluaywgbWFpbik7CisgICAgb3V0ID0gYXBwbHlfbHV0KGlubGluaywgbWFzdGVyKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgb3V0KTsKIH0KIAogc3RhdGljIGF2X2NvbGQgaW50IGhhbGRjbHV0X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKLSAgICBsdXQzZC0+ZGlucHV0LnByb2Nlc3MgPSB1cGRhdGVfYXBwbHlfY2x1dDsKKyAgICBsdXQzZC0+ZnMub25fZXZlbnQgPSB1cGRhdGVfYXBwbHlfY2x1dDsKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGF2X2NvbGQgdm9pZCBoYWxkY2x1dF91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgTFVUM0RDb250ZXh0ICpsdXQzZCA9IGN0eC0+cHJpdjsKLSAgICBmZl9kdWFsaW5wdXRfdW5pbml0KCZsdXQzZC0+ZGlucHV0KTsKKyAgICBmZl9mcmFtZXN5bmNfdW5pbml0KCZsdXQzZC0+ZnMpOwogfQogCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gaGFsZGNsdXRfb3B0aW9uc1tdID0gewotICAgIHsgInNob3J0ZXN0IiwgICAiZm9yY2UgdGVybWluYXRpb24gd2hlbiB0aGUgc2hvcnRlc3QgaW5wdXQgdGVybWluYXRlcyIsIE9GRlNFVChkaW5wdXQuc2hvcnRlc3QpLCAgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRkxBR1MgfSwKLSAgICB7ICJyZXBlYXRsYXN0IiwgImNvbnRpbnVlIGFwcGx5aW5nIHRoZSBsYXN0IGNsdXQgYWZ0ZXIgZW9zIiwgICAgICAgICAgICBPRkZTRVQoZGlucHV0LnJlcGVhdGxhc3QpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAxIH0sIDAsIDEsIEZMQUdTIH0sCiAgICAgQ09NTU9OX09QVElPTlMKIH07CiAKLUFWRklMVEVSX0RFRklORV9DTEFTUyhoYWxkY2x1dCk7CitGUkFNRVNZTkNfREVGSU5FX0NMQVNTKGhhbGRjbHV0LCBMVVQzRENvbnRleHQsIGZzKTsKIAogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGhhbGRjbHV0X2lucHV0c1tdID0gewogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICA9ICJtYWluIiwKICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZV9oYWxkLAogICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAogICAgIH0sewogICAgICAgICAubmFtZSAgICAgICAgID0gImNsdXQiLAogICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAotICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lX2hhbGQsCiAgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfY2x1dCwKICAgICB9LAogICAgIHsgTlVMTCB9CkBAIC03OTgsNyArODAxLDYgQEAKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAogICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCiAgICAgfSwKICAgICB7IE5VTEwgfQpAQCAtODA4LDkgKzgxMCwxMSBAQAogICAgIC5uYW1lICAgICAgICAgID0gImhhbGRjbHV0IiwKICAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBZGp1c3QgY29sb3JzIHVzaW5nIGEgSGFsZCBDTFVULiIpLAogICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKExVVDNEQ29udGV4dCksCisgICAgLnByZWluaXQgICAgICAgPSBoYWxkY2x1dF9mcmFtZXN5bmNfcHJlaW5pdCwKICAgICAuaW5pdCAgICAgICAgICA9IGhhbGRjbHV0X2luaXQsCiAgICAgLnVuaW5pdCAgICAgICAgPSBoYWxkY2x1dF91bmluaXQsCiAgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgID0gYWN0aXZhdGUsCiAgICAgLmlucHV0cyAgICAgICAgPSBoYWxkY2x1dF9pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBoYWxkY2x1dF9vdXRwdXRzLAogICAgIC5wcml2X2NsYXNzICAgID0gJmhhbGRjbHV0X2NsYXNzLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfbWFza2VkY2xhbXAuYyBiL2xpYmF2ZmlsdGVyL3ZmX21hc2tlZGNsYW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgxMmUwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX21hc2tlZGNsYW1wLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAiZnJhbWVzeW5jLmgiCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1hc2tlZENsYW1wQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3R5cGVkZWYgc3RydWN0IE1hc2tlZENsYW1wQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBpbnQgcGxhbmVzOworICAgIGludCB1bmRlcnNob290OworICAgIGludCBvdmVyc2hvb3Q7CisKKyAgICBpbnQgbGluZXNpemVbNF07CisgICAgaW50IHdpZHRoWzRdLCBoZWlnaHRbNF07CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgZGVwdGg7CisgICAgRkZGcmFtZVN5bmMgZnM7CisKKyAgICB2b2lkICgqbWFza2VkY2xhbXApKGNvbnN0IHVpbnQ4X3QgKmJzcmMsIGNvbnN0IHVpbnQ4X3QgKm9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYmxpbmVzaXplLCBwdHJkaWZmX3QgZGFya2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGJyaWdodGxpbmVzaXplLCBwdHJkaWZmX3QgZGVzdGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgdW5kZXJzaG9vdCwgaW50IG92ZXJzaG9vdCk7Cit9IE1hc2tlZENsYW1wQ29udGV4dDsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1hc2tlZGNsYW1wX29wdGlvbnNbXSA9IHsKKyAgICB7ICJ1bmRlcnNob290IiwgInNldCB1bmRlcnNob290IiwgT0ZGU0VUKHVuZGVyc2hvb3QpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAgIDAsIFVJTlQxNl9NQVgsIEZMQUdTIH0sCisgICAgeyAib3ZlcnNob290IiwgICJzZXQgb3ZlcnNob290IiwgIE9GRlNFVChvdmVyc2hvb3QpLCAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgICAwLCBVSU5UMTZfTUFYLCBGTEFHUyB9LAorICAgIHsgInBsYW5lcyIsICAgICAic2V0IHBsYW5lcyIsICAgICBPRkZTRVQocGxhbmVzKSwgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MHhGfSwgMCwgMHhGLCAgICAgICAgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG1hc2tlZGNsYW1wKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LCBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFA5LCBBVl9QSVhfRk1UX1lVVkE0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUlAxNCwgQVZfUElYX0ZNVF9HQlJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRfR0JSQVAxMCwgQVZfUElYX0ZNVF9HQlJBUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTksIEFWX1BJWF9GTVRfR1JBWTEwLCBBVl9QSVhfRk1UX0dSQVkxMiwgQVZfUElYX0ZNVF9HUkFZMTYsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZnJhbWUoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gZnMtPnBhcmVudDsKKyAgICBNYXNrZWRDbGFtcENvbnRleHQgKnMgPSBmcy0+b3BhcXVlOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQsICpiYXNlLCAqZGFyaywgKmJyaWdodDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMCwgJmJhc2UsICAgMCkpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfZnJhbWVzeW5jX2dldF9mcmFtZSgmcy0+ZnMsIDEsICZkYXJrLCAgIDApKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoJnMtPmZzLCAyLCAmYnJpZ2h0LCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGN0eC0+aXNfZGlzYWJsZWQpIHsKKyAgICAgICAgb3V0ID0gYXZfZnJhbWVfY2xvbmUoYmFzZSk7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcDsKKworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBiYXNlKTsKKworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgICAgIGlmICghKCgxIDw8IHApICYgcy0+cGxhbmVzKSkgeworICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob3V0LT5kYXRhW3BdLCBvdXQtPmxpbmVzaXplW3BdLCBiYXNlLT5kYXRhW3BdLCBiYXNlLT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplW3BdLCBzLT5oZWlnaHRbcF0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5tYXNrZWRjbGFtcChiYXNlLT5kYXRhW3BdLCBkYXJrLT5kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0LT5kYXRhW3BdLCBvdXQtPmRhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5saW5lc2l6ZVtwXSwgZGFyay0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlnaHQtPmxpbmVzaXplW3BdLCBvdXQtPmxpbmVzaXplW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+d2lkdGhbcF0sIHMtPmhlaWdodFtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnVuZGVyc2hvb3QsIHMtPm92ZXJzaG9vdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3V0LT5wdHMgPSBhdl9yZXNjYWxlX3Eocy0+ZnMucHRzLCBzLT5mcy50aW1lX2Jhc2UsIG91dGxpbmstPnRpbWVfYmFzZSk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2tlZGNsYW1wOChjb25zdCB1aW50OF90ICpic3JjLCBjb25zdCB1aW50OF90ICpkYXJrc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJyaWdodHNyYywgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBibGluZXNpemUsIHB0cmRpZmZfdCBkYXJrbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGJyaWdodGxpbmVzaXplLCBwdHJkaWZmX3QgZGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW5kZXJzaG9vdCwgaW50IG92ZXJzaG9vdCkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaWYgKGJzcmNbeF0gPCBkYXJrc3JjW3hdIC0gdW5kZXJzaG9vdCkKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBkYXJrc3JjW3hdIC0gdW5kZXJzaG9vdDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJzcmNbeF0gPiBicmlnaHRzcmNbeF0gKyBvdmVyc2hvb3QpCisgICAgICAgICAgICAgICAgZHN0W3hdID0gYnJpZ2h0c3JjW3hdICsgb3ZlcnNob290OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGJzcmNbeF07CisgICAgICAgIH0KKworICAgICAgICBkc3QgICs9IGRsaW5lc2l6ZTsKKyAgICAgICAgYnNyYyArPSBibGluZXNpemU7CisgICAgICAgIGRhcmtzcmMgKz0gZGFya2xpbmVzaXplOworICAgICAgICBicmlnaHRzcmMgKz0gYnJpZ2h0bGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtYXNrZWRjbGFtcDE2KGNvbnN0IHVpbnQ4X3QgKmJic3JjLCBjb25zdCB1aW50OF90ICpvb3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbW1zcmMsIHVpbnQ4X3QgKmRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBibGluZXNpemUsIHB0cmRpZmZfdCBkYXJrbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBicmlnaHRsaW5lc2l6ZSwgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW5kZXJzaG9vdCwgaW50IG92ZXJzaG9vdCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqYnNyYyA9IChjb25zdCB1aW50MTZfdCAqKWJic3JjOworICAgIGNvbnN0IHVpbnQxNl90ICpkYXJrc3JjID0gKGNvbnN0IHVpbnQxNl90ICopb29zcmM7CisgICAgY29uc3QgdWludDE2X3QgKmJyaWdodHNyYyA9IChjb25zdCB1aW50MTZfdCAqKW1tc3JjOworICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilkZHN0OworICAgIGludCB4LCB5OworCisgICAgZGxpbmVzaXplIC89IDI7CisgICAgYmxpbmVzaXplIC89IDI7CisgICAgZGFya2xpbmVzaXplIC89IDI7CisgICAgYnJpZ2h0bGluZXNpemUgLz0gMjsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaWYgKGJzcmNbeF0gPCBkYXJrc3JjW3hdIC0gdW5kZXJzaG9vdCkKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBkYXJrc3JjW3hdIC0gdW5kZXJzaG9vdDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJzcmNbeF0gPiBicmlnaHRzcmNbeF0gKyBvdmVyc2hvb3QpCisgICAgICAgICAgICAgICAgZHN0W3hdID0gYnJpZ2h0c3JjW3hdICsgb3ZlcnNob290OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGJzcmNbeF07CisgICAgICAgIH0KKworICAgICAgICBkc3QgICs9IGRsaW5lc2l6ZTsKKyAgICAgICAgYnNyYyArPSBibGluZXNpemU7CisgICAgICAgIGRhcmtzcmMgKz0gZGFya2xpbmVzaXplOworICAgICAgICBicmlnaHRzcmMgKz0gYnJpZ2h0bGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIE1hc2tlZENsYW1wQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBpbnQgdnN1YiwgaHN1YiwgcmV0OworCisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhzLT5saW5lc2l6ZSwgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIHMtPmhlaWdodFsxXSA9IHMtPmhlaWdodFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgdnN1Yik7CisgICAgcy0+aGVpZ2h0WzBdID0gcy0+aGVpZ2h0WzNdID0gaW5saW5rLT5oOworICAgIHMtPndpZHRoWzFdICA9IHMtPndpZHRoWzJdICA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgaHN1Yik7CisgICAgcy0+d2lkdGhbMF0gID0gcy0+d2lkdGhbM10gID0gaW5saW5rLT53OworCisgICAgcy0+ZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOworCisgICAgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGggPT0gOCkKKyAgICAgICAgcy0+bWFza2VkY2xhbXAgPSBtYXNrZWRjbGFtcDg7CisgICAgZWxzZQorICAgICAgICBzLT5tYXNrZWRjbGFtcCA9IG1hc2tlZGNsYW1wMTY7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBNYXNrZWRDbGFtcENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpiYXNlID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJMaW5rICpkYXJrID0gY3R4LT5pbnB1dHNbMV07CisgICAgQVZGaWx0ZXJMaW5rICpicmlnaHQgPSBjdHgtPmlucHV0c1syXTsKKyAgICBGRkZyYW1lU3luY0luICppbjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGJhc2UtPmZvcm1hdCAhPSBkYXJrLT5mb3JtYXQgfHwKKyAgICAgICAgYmFzZS0+Zm9ybWF0ICE9IGJyaWdodC0+Zm9ybWF0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0cyBtdXN0IGJlIG9mIHNhbWUgcGl4ZWwgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKGJhc2UtPncgIT0gZGFyay0+dyAgIHx8IGJhc2UtPmggIT0gZGFyay0+aCB8fAorICAgICAgICBiYXNlLT53ICE9IGJyaWdodC0+dyB8fCBiYXNlLT5oICE9IGJyaWdodC0+aCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGaXJzdCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgIgorICAgICAgICAgICAgICAgIihzaXplICVkeCVkKSBkbyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgIgorICAgICAgICAgICAgICAgInNlY29uZCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgKCVkeCVkKSAiCisgICAgICAgICAgICAgICAiYW5kL29yIHRoaXJkIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAoc2l6ZSAlZHglZClcbiIsCisgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbMF0ubmFtZSwgYmFzZS0+dywgYmFzZS0+aCwKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1sxXS5uYW1lLCBkYXJrLT53LCBkYXJrLT5oLAorICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzJdLm5hbWUsIGJyaWdodC0+dywgYnJpZ2h0LT5oKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBvdXRsaW5rLT53ID0gYmFzZS0+dzsKKyAgICBvdXRsaW5rLT5oID0gYmFzZS0+aDsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBiYXNlLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGJhc2UtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGJhc2UtPmZyYW1lX3JhdGU7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19pbml0KCZzLT5mcywgY3R4LCAzKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW4gPSBzLT5mcy5pbjsKKyAgICBpblswXS50aW1lX2Jhc2UgPSBiYXNlLT50aW1lX2Jhc2U7CisgICAgaW5bMV0udGltZV9iYXNlID0gZGFyay0+dGltZV9iYXNlOworICAgIGluWzJdLnRpbWVfYmFzZSA9IGJyaWdodC0+dGltZV9iYXNlOworICAgIGluWzBdLnN5bmMgICA9IDE7CisgICAgaW5bMF0uYmVmb3JlID0gRVhUX1NUT1A7CisgICAgaW5bMF0uYWZ0ZXIgID0gRVhUX0lORklOSVRZOworICAgIGluWzFdLnN5bmMgICA9IDE7CisgICAgaW5bMV0uYmVmb3JlID0gRVhUX1NUT1A7CisgICAgaW5bMV0uYWZ0ZXIgID0gRVhUX0lORklOSVRZOworICAgIGluWzJdLnN5bmMgICA9IDE7CisgICAgaW5bMl0uYmVmb3JlID0gRVhUX1NUT1A7CisgICAgaW5bMl0uYWZ0ZXIgID0gRVhUX0lORklOSVRZOworICAgIHMtPmZzLm9wYXF1ZSAgID0gczsKKyAgICBzLT5mcy5vbl9ldmVudCA9IHByb2Nlc3NfZnJhbWU7CisKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2NvbmZpZ3VyZSgmcy0+ZnMpOworfQorCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE1hc2tlZENsYW1wQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE1hc2tlZENsYW1wQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG1hc2tlZGNsYW1wX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJiYXNlIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkYXJrIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJicmlnaHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBtYXNrZWRjbGFtcF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9tYXNrZWRjbGFtcCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJtYXNrZWRjbGFtcCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2xhbXAgZmlyc3Qgc3RyZWFtIHdpdGggc2Vjb25kIHN0cmVhbSBhbmQgdGhpcmQgc3RyZWFtLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE1hc2tlZENsYW1wQ29udGV4dCksCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLmFjdGl2YXRlICAgICAgPSBhY3RpdmF0ZSwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBtYXNrZWRjbGFtcF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBtYXNrZWRjbGFtcF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJm1hc2tlZGNsYW1wX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX21hc2tlZG1lcmdlLmMgYi9saWJhdmZpbHRlci92Zl9tYXNrZWRtZXJnZS5jCmluZGV4IDY2ZjhmYTUuLjg2NTU5YWIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX21hc2tlZG1lcmdlLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfbWFza2VkbWVyZ2UuYwpAQCAtNDcsMTQgKzQ3LDE2IEBACiAgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWNDExUCwgQVZfUElYX0ZNVF9ZVVY0MTBQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsIEFWX1BJWF9GTVRfWVVWNDIyUDE0LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKICAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKICAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKLSAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDE2LAotICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTIsIEFWX1BJWF9GTVRfR0JSQVAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKIApAQCAtODksNyArOTEsNyBAQAogICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfcGxhbmVzOyBwKyspIHsKICAgICAgICAgICAgIGlmICghKCgxIDw8IHApICYgcy0+cGxhbmVzKSkgewogICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob3V0LT5kYXRhW3BdLCBvdXQtPmxpbmVzaXplW3BdLCBiYXNlLT5kYXRhW3BdLCBiYXNlLT5saW5lc2l6ZVtwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoW3BdLCBzLT5oZWlnaHRbcF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemVbcF0sIHMtPmhlaWdodFtwXSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKQEAgLTE5NywyNyArMTk5LDE1IEBACiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0cyBtdXN0IGJlIG9mIHNhbWUgcGl4ZWwgZm9ybWF0XG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9Ci0gICAgaWYgKGJhc2UtPncgICAgICAgICAgICAgICAgICAgICAgICE9IG92ZXJsYXktPncgfHwKLSAgICAgICAgYmFzZS0+aCAgICAgICAgICAgICAgICAgICAgICAgIT0gb3ZlcmxheS0+aCB8fAotICAgICAgICBiYXNlLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSBvdmVybGF5LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSB8fAotICAgICAgICBiYXNlLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSBvdmVybGF5LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiB8fAotICAgICAgICBiYXNlLT53ICAgICAgICAgICAgICAgICAgICAgICAhPSBtYXNrLT53IHx8Ci0gICAgICAgIGJhc2UtPmggICAgICAgICAgICAgICAgICAgICAgICE9IG1hc2stPmggfHwKLSAgICAgICAgYmFzZS0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gIT0gbWFzay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gfHwKLSAgICAgICAgYmFzZS0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gIT0gbWFzay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pIHsKKyAgICBpZiAoYmFzZS0+dyAhPSBvdmVybGF5LT53IHx8IGJhc2UtPmggIT0gb3ZlcmxheS0+aCB8fAorICAgICAgICBiYXNlLT53ICE9IG1hc2stPncgICAgfHwgYmFzZS0+aCAhPSBtYXNrLT5oKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZpcnN0IGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAiCi0gICAgICAgICAgICAgICAiKHNpemUgJWR4JWQsIFNBUiAlZDolZCkgZG8gbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nICIKLSAgICAgICAgICAgICAgICJzZWNvbmQgaW5wdXQgbGluayAlcyBwYXJhbWV0ZXJzICglZHglZCwgU0FSICVkOiVkKSAiCi0gICAgICAgICAgICAgICAiYW5kL29yIHRoaXJkIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAoJWR4JWQsIFNBUiAlZDolZClcbiIsCisgICAgICAgICAgICAgICAiKHNpemUgJWR4JWQpIGRvIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyAiCisgICAgICAgICAgICAgICAic2Vjb25kIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAoc2l6ZSAlZHglZCkgIgorICAgICAgICAgICAgICAgImFuZC9vciB0aGlyZCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgKHNpemUgJWR4JWQpXG4iLAogICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzBdLm5hbWUsIGJhc2UtPncsIGJhc2UtPmgsCi0gICAgICAgICAgICAgICBiYXNlLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgIGJhc2UtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAogICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzFdLm5hbWUsIG92ZXJsYXktPncsIG92ZXJsYXktPmgsCi0gICAgICAgICAgICAgICBvdmVybGF5LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgIG92ZXJsYXktPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAotICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzJdLm5hbWUsIG1hc2stPncsIG1hc2stPmgsCi0gICAgICAgICAgICAgICBtYXNrLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgIG1hc2stPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1syXS5uYW1lLCBtYXNrLT53LCBtYXNrLT5oKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKQEAgLTIyNyw2ICsyMTcsOSBAQAogICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBiYXNlLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwogICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBiYXNlLT5mcmFtZV9yYXRlOwogCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhzLT5saW5lc2l6ZSwgb3V0bGluay0+Zm9ybWF0LCBvdXRsaW5rLT53KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCiAgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfaW5pdCgmcy0+ZnMsIGN0eCwgMykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtMjQ5LDE2ICsyNDIsMTAgQEAKICAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2NvbmZpZ3VyZSgmcy0+ZnMpOwogfQogCi1zdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqYnVmKQorc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBNYXNrZWRNZXJnZUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2ZpbHRlcl9mcmFtZSgmcy0+ZnMsIGlubGluaywgYnVmKTsKLX0KLQotc3RhdGljIGludCByZXF1ZXN0X2ZyYW1lKEFWRmlsdGVyTGluayAqb3V0bGluaykKLXsKLSAgICBNYXNrZWRNZXJnZUNvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7Ci0gICAgcmV0dXJuIGZmX2ZyYW1lc3luY19yZXF1ZXN0X2ZyYW1lKCZzLT5mcywgb3V0bGluayk7CisgICAgTWFza2VkTWVyZ2VDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoJnMtPmZzKTsKIH0KIAogc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCkBAIC0yNzIsMTggKzI1OSwxNSBAQAogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICA9ICJiYXNlIiwKICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKICAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKICAgICB9LAogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICA9ICJvdmVybGF5IiwKICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKICAgICB9LAogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICA9ICJtYXNrIiwKICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtMjkzLDcgKzI3Nyw2IEBACiAgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAotICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTMwNCw2ICsyODcsNyBAQAogICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE1hc2tlZE1lcmdlQ29udGV4dCksCiAgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCiAgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgID0gYWN0aXZhdGUsCiAgICAgLmlucHV0cyAgICAgICAgPSBtYXNrZWRtZXJnZV9pbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBtYXNrZWRtZXJnZV9vdXRwdXRzLAogICAgIC5wcml2X2NsYXNzICAgID0gJm1hc2tlZG1lcmdlX2NsYXNzLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfbWNkZWludC5jIGIvbGliYXZmaWx0ZXIvdmZfbWNkZWludC5jCmluZGV4IGVhMzJhMjQuLjljZGVjNjMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX21jZGVpbnQuYworKysgYi9saWJhdmZpbHRlci92Zl9tY2RlaW50LmMKQEAgLTM4LDcgKzM4LDcgQEAKICAqCiAgKiBPbmx5IHBhc3QgZnJhbWVzIGFyZSB1c2VkLCB3ZSBzaG91bGQgaWRlYWxseSB1c2UgZnV0dXJlIGZyYW1lcyB0b28sCiAgKiBzb21ldGhpbmcgbGlrZSBmaWx0ZXJpbmcgdGhlIHdob2xlIG1vdmllIGluIGZvcndhcmQgYW5kIHRoZW4KLSAqIGJhY2t3YXJkIGRpcmVjdGlvbiBzZWVtcyBsaWtlIGEgaW50ZXJlc3RpbmcgaWRlYSBidXQgdGhlIGN1cnJlbnQKKyAqIGJhY2t3YXJkIGRpcmVjdGlvbiBzZWVtcyBsaWtlIGFuIGludGVyZXN0aW5nIGlkZWEgYnV0IHRoZSBjdXJyZW50CiAgKiBmaWx0ZXIgZnJhbWV3b3JrIGlzIEZBUiBmcm9tIHN1cHBvcnRpbmcgc3VjaCB0aGluZ3MuCiAgKgogICogQ29tYmluaW5nIHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQgaW1hZ2Ugd2l0aCB0aGUgaW5wdXQgaW1hZ2UgYWxzbyBpcwpAQCAtNjksNyArNjksNyBAQAogICAgIFBBUklUWV9CRkYgID0gIDEsIC8vLzwgYm90dG9tIGZpZWxkIGZpcnN0CiB9OwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBNQ0RlaW50Q29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IG1vZGU7ICAgICAgICAgICAvLy88IE1DRGVpbnRNb2RlCiAgICAgaW50IHBhcml0eTsgICAgICAgICAvLy88IE1DRGVpbnRQYXJpdHkKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgIGVuY19jdHgtPmdvcF9zaXplID0gSU5UX01BWDsKICAgICBlbmNfY3R4LT5tYXhfYl9mcmFtZXMgPSAwOwogICAgIGVuY19jdHgtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7Ci0gICAgZW5jX2N0eC0+ZmxhZ3MgPSBBVl9DT0RFQ19GTEFHX1FTQ0FMRSB8IENPREVDX0ZMQUdfTE9XX0RFTEFZOworICAgIGVuY19jdHgtPmZsYWdzID0gQVZfQ09ERUNfRkxBR19RU0NBTEUgfCBBVl9DT0RFQ19GTEFHX0xPV19ERUxBWTsKICAgICBlbmNfY3R4LT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPSBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTDsKICAgICBlbmNfY3R4LT5nbG9iYWxfcXVhbGl0eSA9IDE7CiAgICAgZW5jX2N0eC0+bWVfY21wID0gZW5jX2N0eC0+bWVfc3ViX2NtcCA9IEZGX0NNUF9TQUQ7CkBAIC0xMzQsNyArMTM0LDcgQEAKICAgICBjYXNlIE1PREVfRVhUUkFfU0xPVzoKICAgICAgICAgZW5jX2N0eC0+cmVmcyA9IDM7CiAgICAgY2FzZSBNT0RFX1NMT1c6Ci0gICAgICAgIGVuY19jdHgtPm1lX21ldGhvZCA9IE1FX0lURVI7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW90aW9uX2VzdCIsICJpdGVyIiwgMCk7CiAgICAgY2FzZSBNT0RFX01FRElVTToKICAgICAgICAgZW5jX2N0eC0+ZmxhZ3MgfD0gQVZfQ09ERUNfRkxBR180TVY7CiAgICAgICAgIGVuY19jdHgtPmRpYV9zaXplID0gMjsKQEAgLTE1NCwxMCArMTU0LDcgQEAKIHsKICAgICBNQ0RlaW50Q29udGV4dCAqbWNkZWludCA9IGN0eC0+cHJpdjsKIAotICAgIGlmIChtY2RlaW50LT5lbmNfY3R4KSB7Ci0gICAgICAgIGF2Y29kZWNfY2xvc2UobWNkZWludC0+ZW5jX2N0eCk7Ci0gICAgICAgIGF2X2ZyZWVwKCZtY2RlaW50LT5lbmNfY3R4KTsKLSAgICB9CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJm1jZGVpbnQtPmVuY19jdHgpOwogfQogCiBzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9tZXJnZXBsYW5lcy5jIGIvbGliYXZmaWx0ZXIvdmZfbWVyZ2VwbGFuZXMuYwppbmRleCA4MTI4ZjMzLi40YjRmOTFiIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9tZXJnZXBsYW5lcy5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX21lcmdlcGxhbmVzLmMKQEAgLTU4LDEyICs1OCw2IEBACiAKIEFWRklMVEVSX0RFRklORV9DTEFTUyhtZXJnZXBsYW5lcyk7CiAKLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKLXsKLSAgICBNZXJnZVBsYW5lc0NvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2ZpbHRlcl9mcmFtZSgmcy0+ZnMsIGlubGluaywgaW4pOwotfQotCiBzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBNZXJnZVBsYW5lc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CkBAIC0xMDEsNyArOTUsNiBAQAogICAgICAgICBwYWQubmFtZSA9IGF2X2FzcHJpbnRmKCJpbiVkIiwgaSk7CiAgICAgICAgIGlmICghcGFkLm5hbWUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBwYWQuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lOwogCiAgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X2lucGFkKGN0eCwgaSwgJnBhZCkpIDwgMCl7CiAgICAgICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOwpAQCAtMTIyLDYgKzExNSw3IEBACiAgICAgZm9yIChpID0gMDsgYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaSk7CiAgICAgICAgIGlmIChkZXNjLT5jb21wWzBdLmRlcHRoID09IHMtPm91dGRlc2MtPmNvbXBbMF0uZGVwdGggJiYKKyAgICAgICAgICAgIChkZXNjLT5jb21wWzBdLmRlcHRoIDw9IDggfHwgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSA9PSAocy0+b3V0ZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkUpKSAmJgogICAgICAgICAgICAgYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaSkgPT0gZGVzYy0+bmJfY29tcG9uZW50cyAmJgogICAgICAgICAgICAgKHJldCA9IGZmX2FkZF9mb3JtYXQoJmZvcm1hdHMsIGkpKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE5Miw5ICsxODYsOSBAQAogICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBjdHgtPmlucHV0c1swXS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKIAogICAgIHMtPnBsYW5ld2lkdGhbMV0gID0KLSAgICBzLT5wbGFuZXdpZHRoWzJdICA9IEFWX0NFSUxfUlNISUZUKG91dGxpbmstPncsIHMtPm91dGRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgIHMtPnBsYW5ld2lkdGhbMl0gID0gQVZfQ0VJTF9SU0hJRlQoKChzLT5vdXRkZXNjLT5jb21wWzFdLmRlcHRoID4gOCkgKyAxKSAqIG91dGxpbmstPncsIHMtPm91dGRlc2MtPmxvZzJfY2hyb21hX3cpOwogICAgIHMtPnBsYW5ld2lkdGhbMF0gID0KLSAgICBzLT5wbGFuZXdpZHRoWzNdICA9IG91dGxpbmstPnc7CisgICAgcy0+cGxhbmV3aWR0aFszXSAgPSAoKHMtPm91dGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4KSArIDEpICogb3V0bGluay0+dzsKICAgICBzLT5wbGFuZWhlaWdodFsxXSA9CiAgICAgcy0+cGxhbmVoZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChvdXRsaW5rLT5oLCBzLT5vdXRkZXNjLT5sb2cyX2Nocm9tYV9oKTsKICAgICBzLT5wbGFuZWhlaWdodFswXSA9CkBAIC0yMjAsOSArMjE0LDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlucHV0cC0+cGxhbmV3aWR0aFsxXSAgPQotICAgICAgICBpbnB1dHAtPnBsYW5ld2lkdGhbMl0gID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBpbmRlc2MtPmxvZzJfY2hyb21hX3cpOworICAgICAgICBpbnB1dHAtPnBsYW5ld2lkdGhbMl0gID0gQVZfQ0VJTF9SU0hJRlQoKChpbmRlc2MtPmNvbXBbMV0uZGVwdGggPiA4KSArIDEpICogaW5saW5rLT53LCBpbmRlc2MtPmxvZzJfY2hyb21hX3cpOwogICAgICAgICBpbnB1dHAtPnBsYW5ld2lkdGhbMF0gID0KLSAgICAgICAgaW5wdXRwLT5wbGFuZXdpZHRoWzNdICA9IGlubGluay0+dzsKKyAgICAgICAgaW5wdXRwLT5wbGFuZXdpZHRoWzNdICA9ICgoaW5kZXNjLT5jb21wWzBdLmRlcHRoID4gOCkgKyAxKSAqIGlubGluay0+dzsKICAgICAgICAgaW5wdXRwLT5wbGFuZWhlaWdodFsxXSA9CiAgICAgICAgIGlucHV0cC0+cGxhbmVoZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGluZGVzYy0+bG9nMl9jaHJvbWFfaCk7CiAgICAgICAgIGlucHV0cC0+cGxhbmVoZWlnaHRbMF0gPQpAQCAtMjc2LDEwICsyNzAsMTAgQEAKICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogfQogCi1zdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQorc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBNZXJnZVBsYW5lc0NvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7Ci0gICAgcmV0dXJuIGZmX2ZyYW1lc3luY19yZXF1ZXN0X2ZyYW1lKCZzLT5mcywgb3V0bGluayk7CisgICAgTWVyZ2VQbGFuZXNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoJnMtPmZzKTsKIH0KIAogc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCkBAIC0yOTgsNyArMjkyLDYgQEAKICAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCi0gICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtMzExLDYgKzMwNCw3IEBACiAgICAgLmluaXQgICAgICAgICAgPSBpbml0LAogICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAogICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKICAgICAub3V0cHV0cyAgICAgICA9IG1lcmdlcGxhbmVzX291dHB1dHMsCiAgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfbWVzdGltYXRlLmMgYi9saWJhdmZpbHRlci92Zl9tZXN0aW1hdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNmZTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfbWVzdGltYXRlLmMKQEAgLTAsMCArMSwzNzcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE2IERhdmluZGVyIFNpbmdoIChEU01fKSA8ZHMubXVkaGFyPEBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJtb3Rpb25fZXN0aW1hdGlvbi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbW90aW9uX3ZlY3Rvci5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgTUVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBBVk1vdGlvbkVzdENvbnRleHQgbWVfY3R4OworICAgIGludCBtZXRob2Q7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbW90aW9uIGVzdGltYXRpb24gbWV0aG9kCisKKyAgICBpbnQgbWJfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLy88IG1hY3JvYmxvY2sgc2l6ZQorICAgIGludCBzZWFyY2hfcGFyYW07ICAgICAgICAgICAgICAgICAgIC8vLzwgc2VhcmNoIHBhcmFtZXRlcgorICAgIGludCBiX3dpZHRoLCBiX2hlaWdodCwgYl9jb3VudDsKKyAgICBpbnQgbG9nMl9tYl9zaXplOworCisgICAgQVZGcmFtZSAqcHJldiwgKmN1ciwgKm5leHQ7CisKKyAgICBpbnQgKCptdl90YWJsZVszXSlbMl1bMl07ICAgICAgICAgICAvLy88IG1vdGlvbiB2ZWN0b3JzIG9mIGN1cnJlbnQgJiBwcmV2IDIgZnJhbWVzCit9IE1FQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTUVDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKyNkZWZpbmUgQ09OU1QobmFtZSwgaGVscCwgdmFsLCB1bml0KSB7IG5hbWUsIGhlbHAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND12YWx9LCAwLCAwLCBGTEFHUywgdW5pdCB9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBtZXN0aW1hdGVfb3B0aW9uc1tdID0geworICAgIHsgIm1ldGhvZCIsICJtb3Rpb24gZXN0aW1hdGlvbiBtZXRob2QiLCBPRkZTRVQobWV0aG9kKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWX01FX01FVEhPRF9FU0F9LCBBVl9NRV9NRVRIT0RfRVNBLCBBVl9NRV9NRVRIT0RfVU1ILCBGTEFHUywgIm1ldGhvZCIgfSwKKyAgICAgICAgQ09OU1QoImVzYSIsICAgImV4aGF1c3RpdmUgc2VhcmNoIiwgICAgICAgICAgICAgICAgICBBVl9NRV9NRVRIT0RfRVNBLCAgICAgICJtZXRob2QiKSwKKyAgICAgICAgQ09OU1QoInRzcyIsICAgInRocmVlIHN0ZXAgc2VhcmNoIiwgICAgICAgICAgICAgICAgICBBVl9NRV9NRVRIT0RfVFNTLCAgICAgICJtZXRob2QiKSwKKyAgICAgICAgQ09OU1QoInRkbHMiLCAgInR3byBkaW1lbnNpb25hbCBsb2dhcml0aG1pYyBzZWFyY2giLCBBVl9NRV9NRVRIT0RfVERMUywgICAgICJtZXRob2QiKSwKKyAgICAgICAgQ09OU1QoIm50c3MiLCAgIm5ldyB0aHJlZSBzdGVwIHNlYXJjaCIsICAgICAgICAgICAgICBBVl9NRV9NRVRIT0RfTlRTUywgICAgICJtZXRob2QiKSwKKyAgICAgICAgQ09OU1QoImZzcyIsICAgImZvdXIgc3RlcCBzZWFyY2giLCAgICAgICAgICAgICAgICAgICBBVl9NRV9NRVRIT0RfRlNTLCAgICAgICJtZXRob2QiKSwKKyAgICAgICAgQ09OU1QoImRzIiwgICAgImRpYW1vbmQgc2VhcmNoIiwgICAgICAgICAgICAgICAgICAgICBBVl9NRV9NRVRIT0RfRFMsICAgICAgICJtZXRob2QiKSwKKyAgICAgICAgQ09OU1QoImhleGJzIiwgImhleGFnb24tYmFzZWQgc2VhcmNoIiwgICAgICAgICAgICAgICBBVl9NRV9NRVRIT0RfSEVYQlMsICAgICJtZXRob2QiKSwKKyAgICAgICAgQ09OU1QoImVwenMiLCAgImVuaGFuY2VkIHByZWRpY3RpdmUgem9uYWwgc2VhcmNoIiwgICBBVl9NRV9NRVRIT0RfRVBaUywgICAgICJtZXRob2QiKSwKKyAgICAgICAgQ09OU1QoInVtaCIsICAgInVuZXZlbiBtdWx0aS1oZXhhZ29uIHNlYXJjaCIsICAgICAgICBBVl9NRV9NRVRIT0RfVU1ILCAgICAgICJtZXRob2QiKSwKKyAgICB7ICJtYl9zaXplIiwgIm1hY3JvYmxvY2sgc2l6ZSIsIE9GRlNFVChtYl9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDE2fSwgOCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJzZWFyY2hfcGFyYW0iLCAic2VhcmNoIHBhcmFtZXRlciIsIE9GRlNFVChzZWFyY2hfcGFyYW0pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gN30sIDQsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhtZXN0aW1hdGUpOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzX2xpc3QgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKKyAgICBpZiAoIWZtdHNfbGlzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm10c19saXN0KTsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgTUVDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBzLT5sb2cyX21iX3NpemUgPSBhdl9jZWlsX2xvZzJfYyhzLT5tYl9zaXplKTsKKyAgICBzLT5tYl9zaXplID0gMSA8PCBzLT5sb2cyX21iX3NpemU7CisKKyAgICBzLT5iX3dpZHRoICA9IGlubGluay0+dyA+PiBzLT5sb2cyX21iX3NpemU7CisgICAgcy0+Yl9oZWlnaHQgPSBpbmxpbmstPmggPj4gcy0+bG9nMl9tYl9zaXplOworICAgIHMtPmJfY291bnQgPSBzLT5iX3dpZHRoICogcy0+Yl9oZWlnaHQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIHMtPm12X3RhYmxlW2ldID0gYXZfbWFsbG9jel9hcnJheShzLT5iX2NvdW50LCBzaXplb2YoKnMtPm12X3RhYmxlWzBdKSk7CisgICAgICAgIGlmICghcy0+bXZfdGFibGVbaV0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGZmX21lX2luaXRfY29udGV4dCgmcy0+bWVfY3R4LCBzLT5tYl9zaXplLCBzLT5zZWFyY2hfcGFyYW0sIGlubGluay0+dywgaW5saW5rLT5oLCAwLCAocy0+Yl93aWR0aCAtIDEpIDw8IHMtPmxvZzJfbWJfc2l6ZSwgMCwgKHMtPmJfaGVpZ2h0IC0gMSkgPDwgcy0+bG9nMl9tYl9zaXplKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZGRfbXZfZGF0YShBVk1vdGlvblZlY3RvciAqbXYsIGludCBtYl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgeF9tdiwgaW50IHlfbXYsIGludCBkaXIpCit7CisgICAgbXYtPncgPSBtYl9zaXplOworICAgIG12LT5oID0gbWJfc2l6ZTsKKyAgICBtdi0+ZHN0X3ggPSB4ICsgKG1iX3NpemUgPj4gMSk7CisgICAgbXYtPmRzdF95ID0geSArIChtYl9zaXplID4+IDEpOworICAgIG12LT5zcmNfeCA9IHhfbXYgKyAobWJfc2l6ZSA+PiAxKTsKKyAgICBtdi0+c3JjX3kgPSB5X212ICsgKG1iX3NpemUgPj4gMSk7CisgICAgbXYtPnNvdXJjZSA9IGRpciA/IDEgOiAtMTsKKyAgICBtdi0+ZmxhZ3MgPSAwOworfQorCisjZGVmaW5lIFNFQVJDSF9NVihtZXRob2QpXAorICAgIGRvIHtcCisgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBzLT5iX2hlaWdodDsgbWJfeSsrKVwKKyAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5iX3dpZHRoOyBtYl94KyspIHtcCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHhfbWIgPSBtYl94IDw8IHMtPmxvZzJfbWJfc2l6ZTtcCisgICAgICAgICAgICAgICAgY29uc3QgaW50IHlfbWIgPSBtYl95IDw8IHMtPmxvZzJfbWJfc2l6ZTtcCisgICAgICAgICAgICAgICAgaW50IG12WzJdID0ge3hfbWIsIHlfbWJ9O1wKKyAgICAgICAgICAgICAgICBmZl9tZV9zZWFyY2hfIyNtZXRob2QobWVfY3R4LCB4X21iLCB5X21iLCBtdik7XAorICAgICAgICAgICAgICAgIGFkZF9tdl9kYXRhKCgoQVZNb3Rpb25WZWN0b3IgKikgc2QtPmRhdGEpICsgbXZfY291bnQrKywgbWVfY3R4LT5tYl9zaXplLCB4X21iLCB5X21iLCBtdlswXSwgbXZbMV0sIGRpcik7XAorICAgICAgICAgICAgfVwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIEFERF9QUkVEKHByZWRzLCBweCwgcHkpXAorICAgIGRvIHtcCisgICAgICAgIHByZWRzLm12c1twcmVkcy5uYl1bMF0gPSBweDtcCisgICAgICAgIHByZWRzLm12c1twcmVkcy5uYl1bMV0gPSBweTtcCisgICAgICAgIHByZWRzLm5iKys7XAorICAgIH0gd2hpbGUoMCkKKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTUVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4ID0gJnMtPm1lX2N0eDsKKyAgICBBVkZyYW1lU2lkZURhdGEgKnNkOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgbWJfeCwgbWJfeSwgZGlyOworICAgIGludDMyX3QgbXZfY291bnQgPSAwOworICAgIGludCByZXQ7CisKKyAgICBpZiAoZnJhbWUtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBmcmFtZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldik7CisgICAgcy0+cHJldiA9IHMtPmN1cjsKKyAgICBzLT5jdXIgID0gcy0+bmV4dDsKKyAgICBzLT5uZXh0ID0gZnJhbWU7CisKKyAgICBzLT5tdl90YWJsZVsyXSA9IG1lbWNweShzLT5tdl90YWJsZVsyXSwgcy0+bXZfdGFibGVbMV0sIHNpemVvZigqcy0+bXZfdGFibGVbMV0pICogcy0+Yl9jb3VudCk7CisgICAgcy0+bXZfdGFibGVbMV0gPSBtZW1jcHkocy0+bXZfdGFibGVbMV0sIHMtPm12X3RhYmxlWzBdLCBzaXplb2YoKnMtPm12X3RhYmxlWzBdKSAqIHMtPmJfY291bnQpOworCisgICAgaWYgKCFzLT5jdXIpIHsKKyAgICAgICAgcy0+Y3VyID0gYXZfZnJhbWVfY2xvbmUoZnJhbWUpOworICAgICAgICBpZiAoIXMtPmN1cikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKCFzLT5wcmV2KQorICAgICAgICByZXR1cm4gMDsKKworICAgIG91dCA9IGF2X2ZyYW1lX2Nsb25lKHMtPmN1cik7CisgICAgaWYgKCFvdXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzZCA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEob3V0LCBBVl9GUkFNRV9EQVRBX01PVElPTl9WRUNUT1JTLCAyICogcy0+Yl9jb3VudCAqIHNpemVvZihBVk1vdGlvblZlY3RvcikpOworICAgIGlmICghc2QpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBtZV9jdHgtPmRhdGFfY3VyID0gcy0+Y3VyLT5kYXRhWzBdOworICAgIG1lX2N0eC0+bGluZXNpemUgPSBzLT5jdXItPmxpbmVzaXplWzBdOworCisgICAgZm9yIChkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKykgeworICAgICAgICBtZV9jdHgtPmRhdGFfcmVmID0gKGRpciA/IHMtPm5leHQgOiBzLT5wcmV2KS0+ZGF0YVswXTsKKworICAgICAgICBpZiAocy0+bWV0aG9kID09IEFWX01FX01FVEhPRF9EUykKKyAgICAgICAgICAgIFNFQVJDSF9NVihkcyk7CisgICAgICAgIGVsc2UgaWYgKHMtPm1ldGhvZCA9PSBBVl9NRV9NRVRIT0RfRVNBKQorICAgICAgICAgICAgU0VBUkNIX01WKGVzYSk7CisgICAgICAgIGVsc2UgaWYgKHMtPm1ldGhvZCA9PSBBVl9NRV9NRVRIT0RfRlNTKQorICAgICAgICAgICAgU0VBUkNIX01WKGZzcyk7CisgICAgICAgIGVsc2UgaWYgKHMtPm1ldGhvZCA9PSBBVl9NRV9NRVRIT0RfTlRTUykKKyAgICAgICAgICAgIFNFQVJDSF9NVihudHNzKTsKKyAgICAgICAgZWxzZSBpZiAocy0+bWV0aG9kID09IEFWX01FX01FVEhPRF9URExTKQorICAgICAgICAgICAgU0VBUkNIX01WKHRkbHMpOworICAgICAgICBlbHNlIGlmIChzLT5tZXRob2QgPT0gQVZfTUVfTUVUSE9EX1RTUykKKyAgICAgICAgICAgIFNFQVJDSF9NVih0c3MpOworICAgICAgICBlbHNlIGlmIChzLT5tZXRob2QgPT0gQVZfTUVfTUVUSE9EX0hFWEJTKQorICAgICAgICAgICAgU0VBUkNIX01WKGhleGJzKTsKKyAgICAgICAgZWxzZSBpZiAocy0+bWV0aG9kID09IEFWX01FX01FVEhPRF9VTUgpIHsKKyAgICAgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBzLT5iX2hlaWdodDsgbWJfeSsrKQorICAgICAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBzLT5iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG1iX2kgPSBtYl94ICsgbWJfeSAqIHMtPmJfd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB4X21iID0gbWJfeCA8PCBzLT5sb2cyX21iX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB5X21iID0gbWJfeSA8PCBzLT5sb2cyX21iX3NpemU7CisgICAgICAgICAgICAgICAgICAgIGludCBtdlsyXSA9IHt4X21iLCB5X21ifTsKKworICAgICAgICAgICAgICAgICAgICBBVk1vdGlvbkVzdFByZWRpY3RvciAqcHJlZHMgPSBtZV9jdHgtPnByZWRzOworICAgICAgICAgICAgICAgICAgICBwcmVkc1swXS5uYiA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIDAsIDApOworCisgICAgICAgICAgICAgICAgICAgIC8vbGVmdCBtYiBpbiBjdXJyZW50IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIGlmIChtYl94ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzBdLCBzLT5tdl90YWJsZVswXVttYl9pIC0gMV1bZGlyXVswXSwgcy0+bXZfdGFibGVbMF1bbWJfaSAtIDFdW2Rpcl1bMV0pOworCisgICAgICAgICAgICAgICAgICAgIGlmIChtYl95ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy90b3AgbWIgaW4gY3VycmVudCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIHMtPm12X3RhYmxlWzBdW21iX2kgLSBzLT5iX3dpZHRoXVtkaXJdWzBdLCBzLT5tdl90YWJsZVswXVttYl9pIC0gcy0+Yl93aWR0aF1bZGlyXVsxXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdG9wLXJpZ2h0IG1iIGluIGN1cnJlbnQgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYl94ICsgMSA8IHMtPmJfd2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIHMtPm12X3RhYmxlWzBdW21iX2kgLSBzLT5iX3dpZHRoICsgMV1bZGlyXVswXSwgcy0+bXZfdGFibGVbMF1bbWJfaSAtIHMtPmJfd2lkdGggKyAxXVtkaXJdWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vdG9wLWxlZnQgbWIgaW4gY3VycmVudCBmcmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWJfeCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIHMtPm12X3RhYmxlWzBdW21iX2kgLSBzLT5iX3dpZHRoIC0gMV1bZGlyXVswXSwgcy0+bXZfdGFibGVbMF1bbWJfaSAtIHMtPmJfd2lkdGggLSAxXVtkaXJdWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vbWVkaWFuIHByZWRpY3RvcgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlZHNbMF0ubmIgPT0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3ggPSBtaWRfcHJlZChwcmVkc1swXS5tdnNbMV1bMF0sIHByZWRzWzBdLm12c1syXVswXSwgcHJlZHNbMF0ubXZzWzNdWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF95ID0gbWlkX3ByZWQocHJlZHNbMF0ubXZzWzFdWzFdLCBwcmVkc1swXS5tdnNbMl1bMV0sIHByZWRzWzBdLm12c1szXVsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlZHNbMF0ubmIgPT0gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3ggPSBtaWRfcHJlZCgwLCBwcmVkc1swXS5tdnNbMV1bMF0sIHByZWRzWzBdLm12c1syXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeSA9IG1pZF9wcmVkKDAsIHByZWRzWzBdLm12c1sxXVsxXSwgcHJlZHNbMF0ubXZzWzJdWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVkc1swXS5uYiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeCA9IHByZWRzWzBdLm12c1sxXVswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF95ID0gcHJlZHNbMF0ubXZzWzFdWzFdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3ggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3kgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmZfbWVfc2VhcmNoX3VtaChtZV9jdHgsIHhfbWIsIHlfbWIsIG12KTsKKworICAgICAgICAgICAgICAgICAgICBzLT5tdl90YWJsZVswXVttYl9pXVtkaXJdWzBdID0gbXZbMF0gLSB4X21iOworICAgICAgICAgICAgICAgICAgICBzLT5tdl90YWJsZVswXVttYl9pXVtkaXJdWzFdID0gbXZbMV0gLSB5X21iOworICAgICAgICAgICAgICAgICAgICBhZGRfbXZfZGF0YSgoKEFWTW90aW9uVmVjdG9yICopIHNkLT5kYXRhKSArIG12X2NvdW50KyssIG1lX2N0eC0+bWJfc2l6ZSwgeF9tYiwgeV9tYiwgbXZbMF0sIG12WzFdLCBkaXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgaWYgKHMtPm1ldGhvZCA9PSBBVl9NRV9NRVRIT0RfRVBaUykgeworCisgICAgICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgcy0+Yl9oZWlnaHQ7IG1iX3krKykKKyAgICAgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgcy0+Yl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYl9pID0gbWJfeCArIG1iX3kgKiBzLT5iX3dpZHRoOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeF9tYiA9IG1iX3ggPDwgcy0+bG9nMl9tYl9zaXplOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeV9tYiA9IG1iX3kgPDwgcy0+bG9nMl9tYl9zaXplOworICAgICAgICAgICAgICAgICAgICBpbnQgbXZbMl0gPSB7eF9tYiwgeV9tYn07CisKKyAgICAgICAgICAgICAgICAgICAgQVZNb3Rpb25Fc3RQcmVkaWN0b3IgKnByZWRzID0gbWVfY3R4LT5wcmVkczsKKyAgICAgICAgICAgICAgICAgICAgcHJlZHNbMF0ubmIgPSAwOworICAgICAgICAgICAgICAgICAgICBwcmVkc1sxXS5uYiA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIDAsIDApOworCisgICAgICAgICAgICAgICAgICAgIC8vbGVmdCBtYiBpbiBjdXJyZW50IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIGlmIChtYl94ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzBdLCBzLT5tdl90YWJsZVswXVttYl9pIC0gMV1bZGlyXVswXSwgcy0+bXZfdGFibGVbMF1bbWJfaSAtIDFdW2Rpcl1bMV0pOworCisgICAgICAgICAgICAgICAgICAgIC8vdG9wIG1iIGluIGN1cnJlbnQgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1iX3kgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIHMtPm12X3RhYmxlWzBdW21iX2kgLSBzLT5iX3dpZHRoXVtkaXJdWzBdLCBzLT5tdl90YWJsZVswXVttYl9pIC0gcy0+Yl93aWR0aF1bZGlyXVsxXSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy90b3AtcmlnaHQgbWIgaW4gY3VycmVudCBmcmFtZQorICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSA+IDAgJiYgbWJfeCArIDEgPCBzLT5iX3dpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIHMtPm12X3RhYmxlWzBdW21iX2kgLSBzLT5iX3dpZHRoICsgMV1bZGlyXVswXSwgcy0+bXZfdGFibGVbMF1bbWJfaSAtIHMtPmJfd2lkdGggKyAxXVtkaXJdWzFdKTsKKworICAgICAgICAgICAgICAgICAgICAvL21lZGlhbiBwcmVkaWN0b3IKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWRzWzBdLm5iID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF94ID0gbWlkX3ByZWQocHJlZHNbMF0ubXZzWzFdWzBdLCBwcmVkc1swXS5tdnNbMl1bMF0sIHByZWRzWzBdLm12c1szXVswXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeSA9IG1pZF9wcmVkKHByZWRzWzBdLm12c1sxXVsxXSwgcHJlZHNbMF0ubXZzWzJdWzFdLCBwcmVkc1swXS5tdnNbM11bMV0pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWRzWzBdLm5iID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF94ID0gbWlkX3ByZWQoMCwgcHJlZHNbMF0ubXZzWzFdWzBdLCBwcmVkc1swXS5tdnNbMl1bMF0pOworICAgICAgICAgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3kgPSBtaWRfcHJlZCgwLCBwcmVkc1swXS5tdnNbMV1bMV0sIHByZWRzWzBdLm12c1syXVsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlZHNbMF0ubmIgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3ggPSBwcmVkc1swXS5tdnNbMV1bMF07CisgICAgICAgICAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeSA9IHByZWRzWzBdLm12c1sxXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF94ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF95ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vY29sbG9jYXRlZCBtYiBpbiBwcmV2IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzBdLCBzLT5tdl90YWJsZVsxXVttYl9pXVtkaXJdWzBdLCBzLT5tdl90YWJsZVsxXVttYl9pXVtkaXJdWzFdKTsKKworICAgICAgICAgICAgICAgICAgICAvL2FjY2VsZXJhdG9yIG1vdGlvbiB2ZWN0b3Igb2YgY29sbG9jYXRlZCBibG9jayBpbiBwcmV2IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzFdLCBzLT5tdl90YWJsZVsxXVttYl9pXVtkaXJdWzBdICsgKHMtPm12X3RhYmxlWzFdW21iX2ldW2Rpcl1bMF0gLSBzLT5tdl90YWJsZVsyXVttYl9pXVtkaXJdWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm12X3RhYmxlWzFdW21iX2ldW2Rpcl1bMV0gKyAocy0+bXZfdGFibGVbMV1bbWJfaV1bZGlyXVsxXSAtIHMtPm12X3RhYmxlWzJdW21iX2ldW2Rpcl1bMV0pKTsKKworICAgICAgICAgICAgICAgICAgICAvL2xlZnQgbWIgaW4gcHJldiBmcmFtZQorICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBBRERfUFJFRChwcmVkc1sxXSwgcy0+bXZfdGFibGVbMV1bbWJfaSAtIDFdW2Rpcl1bMF0sIHMtPm12X3RhYmxlWzFdW21iX2kgLSAxXVtkaXJdWzFdKTsKKworICAgICAgICAgICAgICAgICAgICAvL3RvcCBtYiBpbiBwcmV2IGZyYW1lCisgICAgICAgICAgICAgICAgICAgIGlmIChtYl95ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzFdLCBzLT5tdl90YWJsZVsxXVttYl9pIC0gcy0+Yl93aWR0aF1bZGlyXVswXSwgcy0+bXZfdGFibGVbMV1bbWJfaSAtIHMtPmJfd2lkdGhdW2Rpcl1bMV0pOworCisgICAgICAgICAgICAgICAgICAgIC8vcmlnaHQgbWIgaW4gcHJldiBmcmFtZQorICAgICAgICAgICAgICAgICAgICBpZiAobWJfeCArIDEgPCBzLT5iX3dpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMV0sIHMtPm12X3RhYmxlWzFdW21iX2kgKyAxXVtkaXJdWzBdLCBzLT5tdl90YWJsZVsxXVttYl9pICsgMV1bZGlyXVsxXSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9ib3R0b20gbWIgaW4gcHJldiBmcmFtZQorICAgICAgICAgICAgICAgICAgICBpZiAobWJfeSArIDEgPCBzLT5iX2hlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzFdLCBzLT5tdl90YWJsZVsxXVttYl9pICsgcy0+Yl93aWR0aF1bZGlyXVswXSwgcy0+bXZfdGFibGVbMV1bbWJfaSArIHMtPmJfd2lkdGhdW2Rpcl1bMV0pOworCisgICAgICAgICAgICAgICAgICAgIGZmX21lX3NlYXJjaF9lcHpzKG1lX2N0eCwgeF9tYiwgeV9tYiwgbXYpOworCisgICAgICAgICAgICAgICAgICAgIHMtPm12X3RhYmxlWzBdW21iX2ldW2Rpcl1bMF0gPSBtdlswXSAtIHhfbWI7CisgICAgICAgICAgICAgICAgICAgIHMtPm12X3RhYmxlWzBdW21iX2ldW2Rpcl1bMV0gPSBtdlsxXSAtIHlfbWI7CisgICAgICAgICAgICAgICAgICAgIGFkZF9tdl9kYXRhKCgoQVZNb3Rpb25WZWN0b3IgKikgc2QtPmRhdGEpICsgbXZfY291bnQrKywgcy0+bWJfc2l6ZSwgeF9tYiwgeV9tYiwgbXZbMF0sIG12WzFdLCBkaXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXQpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNRUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZzLT5jdXIpOworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPm5leHQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJnMtPm12X3RhYmxlW2ldKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG1lc3RpbWF0ZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBtZXN0aW1hdGVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX21lc3RpbWF0ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJtZXN0aW1hdGUiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdlbmVyYXRlIG1vdGlvbiB2ZWN0b3JzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE1FQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmbWVzdGltYXRlX2NsYXNzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IG1lc3RpbWF0ZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBtZXN0aW1hdGVfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9taWRlcXVhbGl6ZXIuYyBiL2xpYmF2ZmlsdGVyL3ZmX21pZGVxdWFsaXplci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMzgxNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9taWRlcXVhbGl6ZXIuYwpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTWlkRXF1YWxpemVyQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHdpZHRoWzJdWzRdLCBoZWlnaHRbMl1bNF07CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgcGxhbmVzOworICAgIGludCBoaXN0b2dyYW1fc2l6ZTsKKyAgICBmbG9hdCAqaGlzdG9ncmFtWzJdOworICAgIHVuc2lnbmVkICpjY2hhbmdlOworICAgIEZGRnJhbWVTeW5jIGZzOworCisgICAgdm9pZCAoKm1pZGVxdWFsaXplcikoY29uc3QgdWludDhfdCAqaW4wLCBjb25zdCB1aW50OF90ICppbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZTEsIHB0cmRpZmZfdCBsaW5lc2l6ZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdzAsIGludCBoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdzEsIGludCBoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqaGlzdG9ncmFtMSwgZmxvYXQgKmhpc3RvZ3JhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmNjaGFuZ2UsIHNpemVfdCBoc2l6ZSk7Cit9IE1pZEVxdWFsaXplckNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE1pZEVxdWFsaXplckNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbWlkZXF1YWxpemVyX29wdGlvbnNbXSA9IHsKKyAgICB7ICJwbGFuZXMiLCAic2V0IHBsYW5lcyIsIE9GRlNFVChwbGFuZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB4Rn0sIDAsIDB4RiwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKG1pZGVxdWFsaXplcik7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVjQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDExUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMFAsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsIEFWX1BJWF9GTVRfWVVWNDQ0UDE0LAorICAgICAgICBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQOSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDksIEFWX1BJWF9GTVRfWVVWQTQ0NFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMlAxMCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQMTAsIEFWX1BJWF9GTVRfR0JSQVAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19mcmFtZShGRkZyYW1lU3luYyAqZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OworICAgIE1pZEVxdWFsaXplckNvbnRleHQgKnMgPSBmcy0+b3BhcXVlOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQsICppbjAsICppbjE7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2dldF9mcmFtZSgmcy0+ZnMsIDAsICZpbjAsIDApKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoJnMtPmZzLCAxLCAmaW4xLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKGN0eC0+aXNfZGlzYWJsZWQpIHsKKyAgICAgICAgb3V0ID0gYXZfZnJhbWVfY2xvbmUoaW4wKTsKKyAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwOworCisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluMCk7CisKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgICAgICBpZiAoISgoMSA8PCBwKSAmIHMtPnBsYW5lcykpIHsKKyAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVtwXSwgb3V0LT5saW5lc2l6ZVtwXSwgaW4wLT5kYXRhW3BdLCBpbjAtPmxpbmVzaXplW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+d2lkdGhbMF1bcF0gKiAoMSArIChzLT5oaXN0b2dyYW1fc2l6ZSA+IDI1NikpLCBzLT5oZWlnaHRbMF1bcF0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5taWRlcXVhbGl6ZXIoaW4wLT5kYXRhW3BdLCBpbjEtPmRhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluMC0+bGluZXNpemVbcF0sIGluMS0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aWR0aFswXVtwXSwgcy0+aGVpZ2h0WzBdW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoWzFdW3BdLCBzLT5oZWlnaHRbMV1bcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+aGlzdG9ncmFtWzBdLCBzLT5oaXN0b2dyYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2NoYW5nZSwgcy0+aGlzdG9ncmFtX3NpemUpOworICAgICAgICB9CisgICAgfQorICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKGluMC0+cHRzLCBzLT5mcy50aW1lX2Jhc2UsIG91dGxpbmstPnRpbWVfYmFzZSk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfaGlzdG9ncmFtOChjb25zdCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGZsb2F0ICpoaXN0b2dyYW0sIHNpemVfdCBoc2l6ZSkKK3sKKyAgICBpbnQgeSwgeDsKKworICAgIG1lbXNldChoaXN0b2dyYW0sIDAsIGhzaXplICogc2l6ZW9mKCpoaXN0b2dyYW0pKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaGlzdG9ncmFtW3NyY1t4XV0gKz0gMTsKKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gbGluZXNpemU7CisgICAgfQorCisgICAgZm9yICh4ID0gMDsgeCA8IGhzaXplIC0gMTsgeCsrKSB7CisgICAgICAgIGhpc3RvZ3JhbVt4ICsgMV0gKz0gaGlzdG9ncmFtW3hdOworICAgICAgICBoaXN0b2dyYW1beF0gLz0gaHNpemU7CisgICAgfQorICAgIGhpc3RvZ3JhbVt4XSAvPSBoc2l6ZTsKK30KKworc3RhdGljIHZvaWQgY29tcHV0ZV9oaXN0b2dyYW0xNihjb25zdCB1aW50MTZfdCAqc3JjLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgZmxvYXQgKmhpc3RvZ3JhbSwgc2l6ZV90IGhzaXplKQoreworICAgIGludCB5LCB4OworCisgICAgbWVtc2V0KGhpc3RvZ3JhbSwgMCwgaHNpemUgKiBzaXplb2YoKmhpc3RvZ3JhbSkpOworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBoaXN0b2dyYW1bc3JjW3hdXSArPSAxOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBsaW5lc2l6ZTsKKyAgICB9CisKKyAgICBmb3IgKHggPSAwOyB4IDwgaHNpemUgLSAxOyB4KyspIHsKKyAgICAgICAgaGlzdG9ncmFtW3ggKyAxXSArPSBoaXN0b2dyYW1beF07CisgICAgICAgIGhpc3RvZ3JhbVt4XSAvPSBoc2l6ZTsKKyAgICB9CisgICAgaGlzdG9ncmFtW3hdIC89IGhzaXplOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX2NvbnRyYXN0X2NoYW5nZShmbG9hdCAqaGlzdG9ncmFtMSwgZmxvYXQgKmhpc3RvZ3JhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqY2NoYW5nZSwgc2l6ZV90IGhzaXplKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGhzaXplOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGhzaXplICYmIGhpc3RvZ3JhbTJbal0gPCBoaXN0b2dyYW0xW2ldOyBqKyspOworCisgICAgICAgIGNjaGFuZ2VbaV0gPSAoaSArIGopIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1pZGVxdWFsaXplcjgoY29uc3QgdWludDhfdCAqaW4wLCBjb25zdCB1aW50OF90ICppbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGxpbmVzaXplMSwgcHRyZGlmZl90IGxpbmVzaXplMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcwLCBpbnQgaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3MSwgaW50IGgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqaGlzdG9ncmFtMSwgZmxvYXQgKmhpc3RvZ3JhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpjY2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaHNpemUpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBjb21wdXRlX2hpc3RvZ3JhbTgoaW4wLCBsaW5lc2l6ZTEsIHcwLCBoMCwgaGlzdG9ncmFtMSwgaHNpemUpOworICAgIGNvbXB1dGVfaGlzdG9ncmFtOChpbjEsIGxpbmVzaXplMiwgdzEsIGgxLCBoaXN0b2dyYW0yLCBoc2l6ZSk7CisKKyAgICBjb21wdXRlX2NvbnRyYXN0X2NoYW5nZShoaXN0b2dyYW0xLCBoaXN0b2dyYW0yLCBjY2hhbmdlLCBoc2l6ZSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDA7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzA7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gYXZfY2xpcF91aW50OChjY2hhbmdlW2luMFt4XV0pOworICAgICAgICB9CisgICAgICAgIGRzdCArPSBkbGluZXNpemU7CisgICAgICAgIGluMCArPSBsaW5lc2l6ZTE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtaWRlcXVhbGl6ZXIxNihjb25zdCB1aW50OF90ICppbjAsIGNvbnN0IHVpbnQ4X3QgKmluMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBsaW5lc2l6ZTEsIHB0cmRpZmZfdCBsaW5lc2l6ZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcwLCBpbnQgaDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdzEsIGludCBoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpoaXN0b2dyYW0xLCBmbG9hdCAqaGlzdG9ncmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpjY2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGhzaXplKQoreworICAgIGNvbnN0IHVpbnQxNl90ICppID0gKGNvbnN0IHVpbnQxNl90ICopaW4wOworICAgIHVpbnQxNl90ICpkID0gKHVpbnQxNl90ICopZHN0OworICAgIGludCB4LCB5OworCisgICAgY29tcHV0ZV9oaXN0b2dyYW0xNihpLCBsaW5lc2l6ZTEgLyAyLCB3MCwgaDAsIGhpc3RvZ3JhbTEsIGhzaXplKTsKKyAgICBjb21wdXRlX2hpc3RvZ3JhbTE2KChjb25zdCB1aW50MTZfdCAqKWluMSwgbGluZXNpemUyIC8gMiwgdzEsIGgxLCBoaXN0b2dyYW0yLCBoc2l6ZSk7CisKKyAgICBjb21wdXRlX2NvbnRyYXN0X2NoYW5nZShoaXN0b2dyYW0xLCBoaXN0b2dyYW0yLCBjY2hhbmdlLCBoc2l6ZSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDA7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzA7IHgrKykgeworICAgICAgICAgICAgZFt4XSA9IGNjaGFuZ2VbaVt4XV07CisgICAgICAgIH0KKyAgICAgICAgZCArPSBkbGluZXNpemUgLyAyOworICAgICAgICBpICs9IGxpbmVzaXplMSAvIDI7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dDAoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBNaWRFcXVhbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCB2c3ViLCBoc3ViOworCisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgaHN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgdnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICBzLT5oZWlnaHRbMF1bMF0gPSBzLT5oZWlnaHRbMF1bM10gPSBpbmxpbmstPmg7CisgICAgcy0+d2lkdGhbMF1bMF0gID0gcy0+d2lkdGhbMF1bM10gID0gaW5saW5rLT53OworICAgIHMtPmhlaWdodFswXVsxXSA9IHMtPmhlaWdodFswXVsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgdnN1Yik7CisgICAgcy0+d2lkdGhbMF1bMV0gID0gcy0+d2lkdGhbMF1bMl0gID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBoc3ViKTsKKworICAgIHMtPmhpc3RvZ3JhbV9zaXplID0gMSA8PCBkZXNjLT5jb21wWzBdLmRlcHRoOworCisgICAgcy0+aGlzdG9ncmFtWzBdID0gYXZfY2FsbG9jKHMtPmhpc3RvZ3JhbV9zaXplLCBzaXplb2YoZmxvYXQpKTsKKyAgICBzLT5oaXN0b2dyYW1bMV0gPSBhdl9jYWxsb2Mocy0+aGlzdG9ncmFtX3NpemUsIHNpemVvZihmbG9hdCkpOworICAgIHMtPmNjaGFuZ2UgICAgICA9IGF2X2NhbGxvYyhzLT5oaXN0b2dyYW1fc2l6ZSwgc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgaWYgKCFzLT5oaXN0b2dyYW1bMF0gfHwgIXMtPmhpc3RvZ3JhbVsxXSB8fCAhcy0+Y2NoYW5nZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChzLT5oaXN0b2dyYW1fc2l6ZSA9PSAyNTYpIHsKKyAgICAgICAgcy0+bWlkZXF1YWxpemVyID0gbWlkZXF1YWxpemVyODsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5taWRlcXVhbGl6ZXIgPSBtaWRlcXVhbGl6ZXIxNjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQxKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTWlkRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBpbnQgdnN1YiwgaHN1YjsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKworICAgIGhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgcy0+aGVpZ2h0WzFdWzBdID0gcy0+aGVpZ2h0WzFdWzNdID0gaW5saW5rLT5oOworICAgIHMtPndpZHRoWzFdWzBdICA9IHMtPndpZHRoWzFdWzNdICA9IGlubGluay0+dzsKKyAgICBzLT5oZWlnaHRbMV1bMV0gPSBzLT5oZWlnaHRbMV1bMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOworICAgIHMtPndpZHRoWzFdWzFdICA9IHMtPndpZHRoWzFdWzJdICA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgaHN1Yik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBNaWRFcXVhbGl6ZXJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW4wID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJMaW5rICppbjEgPSBjdHgtPmlucHV0c1sxXTsKKyAgICBGRkZyYW1lU3luY0luICppbjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGluMC0+Zm9ybWF0ICE9IGluMS0+Zm9ybWF0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImlucHV0cyBtdXN0IGJlIG9mIHNhbWUgcGl4ZWwgZm9ybWF0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBvdXRsaW5rLT53ID0gaW4wLT53OworICAgIG91dGxpbmstPmggPSBpbjAtPmg7CisgICAgb3V0bGluay0+dGltZV9iYXNlID0gaW4wLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGluMC0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gaW4wLT5mcmFtZV9yYXRlOworCisgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfaW5pdCgmcy0+ZnMsIGN0eCwgMikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGluID0gcy0+ZnMuaW47CisgICAgaW5bMF0udGltZV9iYXNlID0gaW4wLT50aW1lX2Jhc2U7CisgICAgaW5bMV0udGltZV9iYXNlID0gaW4xLT50aW1lX2Jhc2U7CisgICAgaW5bMF0uc3luYyAgID0gMTsKKyAgICBpblswXS5iZWZvcmUgPSBFWFRfU1RPUDsKKyAgICBpblswXS5hZnRlciAgPSBFWFRfSU5GSU5JVFk7CisgICAgaW5bMV0uc3luYyAgID0gMTsKKyAgICBpblsxXS5iZWZvcmUgPSBFWFRfU1RPUDsKKyAgICBpblsxXS5hZnRlciAgPSBFWFRfSU5GSU5JVFk7CisgICAgcy0+ZnMub3BhcXVlICAgPSBzOworICAgIHMtPmZzLm9uX2V2ZW50ID0gcHJvY2Vzc19mcmFtZTsKKworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZzLT5mcyk7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTWlkRXF1YWxpemVyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE1pZEVxdWFsaXplckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBmZl9mcmFtZXN5bmNfdW5pbml0KCZzLT5mcyk7CisgICAgYXZfZnJlZXAoJnMtPmhpc3RvZ3JhbVswXSk7CisgICAgYXZfZnJlZXAoJnMtPmhpc3RvZ3JhbVsxXSk7CisgICAgYXZfZnJlZXAoJnMtPmNjaGFuZ2UpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbWlkZXF1YWxpemVyX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJpbjAiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0MCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJpbjEiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0MSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbWlkZXF1YWxpemVyX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX21pZGVxdWFsaXplciA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJtaWRlcXVhbGl6ZXIiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkFwcGx5IE1pZHdheSBFcXVhbGl6YXRpb24uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTWlkRXF1YWxpemVyQ29udGV4dCksCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgID0gYWN0aXZhdGUsCisgICAgLmlucHV0cyAgICAgICAgPSBtaWRlcXVhbGl6ZXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gbWlkZXF1YWxpemVyX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmbWlkZXF1YWxpemVyX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0lOVEVSTkFMLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX21pbnRlcnBvbGF0ZS5jIGIvbGliYXZmaWx0ZXIvdmZfbWludGVycG9sYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNDMxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX21pbnRlcnBvbGF0ZS5jCkBAIC0wLDAgKzEsMTI3MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxNSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChjKSAyMDE2IERhdmluZGVyIFNpbmdoIChEU01fKSA8ZHMubXVkaGFyPEBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJtb3Rpb25fZXN0aW1hdGlvbi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbW90aW9uX3ZlY3Rvci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhlbHV0aWxzLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCisjZGVmaW5lIE1FX01PREVfQklESVIgMAorI2RlZmluZSBNRV9NT0RFX0JJTEFUIDEKKworI2RlZmluZSBNQ19NT0RFX09CTUMgMAorI2RlZmluZSBNQ19NT0RFX0FPQk1DIDEKKworI2RlZmluZSBTQ0RfTUVUSE9EX05PTkUgMAorI2RlZmluZSBTQ0RfTUVUSE9EX0ZESUZGIDEKKworI2RlZmluZSBOQl9GUkFNRVMgNAorI2RlZmluZSBOQl9QSVhFTF9NVlMgMzIKKyNkZWZpbmUgTkJfQ0xVU1RFUlMgMTI4CisKKyNkZWZpbmUgQUxQSEFfTUFYIDEwMjQKKyNkZWZpbmUgQ0xVU1RFUl9USFJFU0hPTEQgNAorI2RlZmluZSBQWF9XRUlHSFRfTUFYIDI1NQorI2RlZmluZSBDT1NUX1BSRURfU0NBTEUgNjQKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2JtY19saW5lYXIzMlsxMDI0XSA9IHsKKyAgMCwgIDAsICAwLCAgMCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDAsICAwLCAgMCwgIDAsCisgIDAsICA0LCAgNCwgIDQsICA4LCAgOCwgIDgsIDEyLCAxMiwgMTYsIDE2LCAxNiwgMjAsIDIwLCAyMCwgMjQsIDI0LCAyMCwgMjAsIDIwLCAxNiwgMTYsIDE2LCAxMiwgMTIsICA4LCAgOCwgIDgsICA0LCAgNCwgIDQsICAwLAorICAwLCAgNCwgIDgsICA4LCAxMiwgMTIsIDE2LCAyMCwgMjAsIDI0LCAyOCwgMjgsIDMyLCAzMiwgMzYsIDQwLCA0MCwgMzYsIDMyLCAzMiwgMjgsIDI4LCAyNCwgMjAsIDIwLCAxNiwgMTIsIDEyLCAgOCwgIDgsICA0LCAgMCwKKyAgMCwgIDQsICA4LCAxMiwgMTYsIDIwLCAyNCwgMjgsIDI4LCAzMiwgMzYsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNTYsIDUyLCA0OCwgNDQsIDQwLCAzNiwgMzIsIDI4LCAyOCwgMjQsIDIwLCAxNiwgMTIsICA4LCAgNCwgIDAsCisgIDQsICA4LCAxMiwgMTYsIDIwLCAyNCwgMjgsIDMyLCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDYwLCA2NCwgNjgsIDY4LCA2NCwgNjAsIDU2LCA1MiwgNDgsIDQ0LCA0MCwgMzIsIDI4LCAyNCwgMjAsIDE2LCAxMiwgIDgsICA0LAorICA0LCAgOCwgMTIsIDIwLCAyNCwgMzIsIDM2LCA0MCwgNDgsIDUyLCA1NiwgNjQsIDY4LCA3NiwgODAsIDg0LCA4NCwgODAsIDc2LCA2OCwgNjQsIDU2LCA1MiwgNDgsIDQwLCAzNiwgMzIsIDI0LCAyMCwgMTIsICA4LCAgNCwKKyAgNCwgIDgsIDE2LCAyNCwgMjgsIDM2LCA0NCwgNDgsIDU2LCA2MCwgNjgsIDc2LCA4MCwgODgsIDk2LDEwMCwxMDAsIDk2LCA4OCwgODAsIDc2LCA2OCwgNjAsIDU2LCA0OCwgNDQsIDM2LCAyOCwgMjQsIDE2LCAgOCwgIDQsCisgIDQsIDEyLCAyMCwgMjgsIDMyLCA0MCwgNDgsIDU2LCA2NCwgNzIsIDgwLCA4OCwgOTIsMTAwLDEwOCwxMTYsMTE2LDEwOCwxMDAsIDkyLCA4OCwgODAsIDcyLCA2NCwgNTYsIDQ4LCA0MCwgMzIsIDI4LCAyMCwgMTIsICA0LAorICA0LCAxMiwgMjAsIDI4LCA0MCwgNDgsIDU2LCA2NCwgNzIsIDgwLCA4OCwgOTYsMTA4LDExNiwxMjQsMTMyLDEzMiwxMjQsMTE2LDEwOCwgOTYsIDg4LCA4MCwgNzIsIDY0LCA1NiwgNDgsIDQwLCAyOCwgMjAsIDEyLCAgNCwKKyAgNCwgMTYsIDI0LCAzMiwgNDQsIDUyLCA2MCwgNzIsIDgwLCA5MiwxMDAsMTA4LDEyMCwxMjgsMTM2LDE0OCwxNDgsMTM2LDEyOCwxMjAsMTA4LDEwMCwgOTIsIDgwLCA3MiwgNjAsIDUyLCA0NCwgMzIsIDI0LCAxNiwgIDQsCisgIDQsIDE2LCAyOCwgMzYsIDQ4LCA1NiwgNjgsIDgwLCA4OCwxMDAsMTEyLDEyMCwxMzIsMTQwLDE1MiwxNjQsMTY0LDE1MiwxNDAsMTMyLDEyMCwxMTIsMTAwLCA4OCwgODAsIDY4LCA1NiwgNDgsIDM2LCAyOCwgMTYsICA0LAorICA0LCAxNiwgMjgsIDQwLCA1MiwgNjQsIDc2LCA4OCwgOTYsMTA4LDEyMCwxMzIsMTQ0LDE1NiwxNjgsMTgwLDE4MCwxNjgsMTU2LDE0NCwxMzIsMTIwLDEwOCwgOTYsIDg4LCA3NiwgNjQsIDUyLCA0MCwgMjgsIDE2LCAgNCwKKyAgOCwgMjAsIDMyLCA0NCwgNTYsIDY4LCA4MCwgOTIsMTA4LDEyMCwxMzIsMTQ0LDE1NiwxNjgsMTgwLDE5MiwxOTIsMTgwLDE2OCwxNTYsMTQ0LDEzMiwxMjAsMTA4LCA5MiwgODAsIDY4LCA1NiwgNDQsIDMyLCAyMCwgIDgsCisgIDgsIDIwLCAzMiwgNDgsIDYwLCA3NiwgODgsMTAwLDExNiwxMjgsMTQwLDE1NiwxNjgsMTg0LDE5NiwyMDgsMjA4LDE5NiwxODQsMTY4LDE1NiwxNDAsMTI4LDExNiwxMDAsIDg4LCA3NiwgNjAsIDQ4LCAzMiwgMjAsICA4LAorICA4LCAyMCwgMzYsIDUyLCA2NCwgODAsIDk2LDEwOCwxMjQsMTM2LDE1MiwxNjgsMTgwLDE5NiwyMTIsMjI0LDIyNCwyMTIsMTk2LDE4MCwxNjgsMTUyLDEzNiwxMjQsMTA4LCA5NiwgODAsIDY0LCA1MiwgMzYsIDIwLCAgOCwKKyAgOCwgMjQsIDQwLCA1NiwgNjgsIDg0LDEwMCwxMTYsMTMyLDE0OCwxNjQsMTgwLDE5MiwyMDgsMjI0LDI0MCwyNDAsMjI0LDIwOCwxOTIsMTgwLDE2NCwxNDgsMTMyLDExNiwxMDAsIDg0LCA2OCwgNTYsIDQwLCAyNCwgIDgsCisgIDgsIDI0LCA0MCwgNTYsIDY4LCA4NCwxMDAsMTE2LDEzMiwxNDgsMTY0LDE4MCwxOTIsMjA4LDIyNCwyNDAsMjQwLDIyNCwyMDgsMTkyLDE4MCwxNjQsMTQ4LDEzMiwxMTYsMTAwLCA4NCwgNjgsIDU2LCA0MCwgMjQsICA4LAorICA4LCAyMCwgMzYsIDUyLCA2NCwgODAsIDk2LDEwOCwxMjQsMTM2LDE1MiwxNjgsMTgwLDE5NiwyMTIsMjI0LDIyNCwyMTIsMTk2LDE4MCwxNjgsMTUyLDEzNiwxMjQsMTA4LCA5NiwgODAsIDY0LCA1MiwgMzYsIDIwLCAgOCwKKyAgOCwgMjAsIDMyLCA0OCwgNjAsIDc2LCA4OCwxMDAsMTE2LDEyOCwxNDAsMTU2LDE2OCwxODQsMTk2LDIwOCwyMDgsMTk2LDE4NCwxNjgsMTU2LDE0MCwxMjgsMTE2LDEwMCwgODgsIDc2LCA2MCwgNDgsIDMyLCAyMCwgIDgsCisgIDgsIDIwLCAzMiwgNDQsIDU2LCA2OCwgODAsIDkyLDEwOCwxMjAsMTMyLDE0NCwxNTYsMTY4LDE4MCwxOTIsMTkyLDE4MCwxNjgsMTU2LDE0NCwxMzIsMTIwLDEwOCwgOTIsIDgwLCA2OCwgNTYsIDQ0LCAzMiwgMjAsICA4LAorICA0LCAxNiwgMjgsIDQwLCA1MiwgNjQsIDc2LCA4OCwgOTYsMTA4LDEyMCwxMzIsMTQ0LDE1NiwxNjgsMTgwLDE4MCwxNjgsMTU2LDE0NCwxMzIsMTIwLDEwOCwgOTYsIDg4LCA3NiwgNjQsIDUyLCA0MCwgMjgsIDE2LCAgNCwKKyAgNCwgMTYsIDI4LCAzNiwgNDgsIDU2LCA2OCwgODAsIDg4LDEwMCwxMTIsMTIwLDEzMiwxNDAsMTUyLDE2NCwxNjQsMTUyLDE0MCwxMzIsMTIwLDExMiwxMDAsIDg4LCA4MCwgNjgsIDU2LCA0OCwgMzYsIDI4LCAxNiwgIDQsCisgIDQsIDE2LCAyNCwgMzIsIDQ0LCA1MiwgNjAsIDcyLCA4MCwgOTIsMTAwLDEwOCwxMjAsMTI4LDEzNiwxNDgsMTQ4LDEzNiwxMjgsMTIwLDEwOCwxMDAsIDkyLCA4MCwgNzIsIDYwLCA1MiwgNDQsIDMyLCAyNCwgMTYsICA0LAorICA0LCAxMiwgMjAsIDI4LCA0MCwgNDgsIDU2LCA2NCwgNzIsIDgwLCA4OCwgOTYsMTA4LDExNiwxMjQsMTMyLDEzMiwxMjQsMTE2LDEwOCwgOTYsIDg4LCA4MCwgNzIsIDY0LCA1NiwgNDgsIDQwLCAyOCwgMjAsIDEyLCAgNCwKKyAgNCwgMTIsIDIwLCAyOCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA3MiwgODAsIDg4LCA5MiwxMDAsMTA4LDExNiwxMTYsMTA4LDEwMCwgOTIsIDg4LCA4MCwgNzIsIDY0LCA1NiwgNDgsIDQwLCAzMiwgMjgsIDIwLCAxMiwgIDQsCisgIDQsICA4LCAxNiwgMjQsIDI4LCAzNiwgNDQsIDQ4LCA1NiwgNjAsIDY4LCA3NiwgODAsIDg4LCA5NiwxMDAsMTAwLCA5NiwgODgsIDgwLCA3NiwgNjgsIDYwLCA1NiwgNDgsIDQ0LCAzNiwgMjgsIDI0LCAxNiwgIDgsICA0LAorICA0LCAgOCwgMTIsIDIwLCAyNCwgMzIsIDM2LCA0MCwgNDgsIDUyLCA1NiwgNjQsIDY4LCA3NiwgODAsIDg0LCA4NCwgODAsIDc2LCA2OCwgNjQsIDU2LCA1MiwgNDgsIDQwLCAzNiwgMzIsIDI0LCAyMCwgMTIsICA4LCAgNCwKKyAgNCwgIDgsIDEyLCAxNiwgMjAsIDI0LCAyOCwgMzIsIDQwLCA0NCwgNDgsIDUyLCA1NiwgNjAsIDY0LCA2OCwgNjgsIDY0LCA2MCwgNTYsIDUyLCA0OCwgNDQsIDQwLCAzMiwgMjgsIDI0LCAyMCwgMTYsIDEyLCAgOCwgIDQsCisgIDAsICA0LCAgOCwgMTIsIDE2LCAyMCwgMjQsIDI4LCAyOCwgMzIsIDM2LCA0MCwgNDQsIDQ4LCA1MiwgNTYsIDU2LCA1MiwgNDgsIDQ0LCA0MCwgMzYsIDMyLCAyOCwgMjgsIDI0LCAyMCwgMTYsIDEyLCAgOCwgIDQsICAwLAorICAwLCAgNCwgIDgsICA4LCAxMiwgMTIsIDE2LCAyMCwgMjAsIDI0LCAyOCwgMjgsIDMyLCAzMiwgMzYsIDQwLCA0MCwgMzYsIDMyLCAzMiwgMjgsIDI4LCAyNCwgMjAsIDIwLCAxNiwgMTIsIDEyLCAgOCwgIDgsICA0LCAgMCwKKyAgMCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgMTIsIDEyLCAxNiwgMTYsIDE2LCAyMCwgMjAsIDIwLCAyNCwgMjQsIDIwLCAyMCwgMjAsIDE2LCAxNiwgMTYsIDEyLCAxMiwgIDgsICA4LCAgOCwgIDQsICA0LCAgNCwgIDAsCisgIDAsICAwLCAgMCwgIDAsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDgsICA4LCAgOCwgIDgsICA4LCAgOCwgIDgsICA4LCAgNCwgIDQsICA0LCAgNCwgIDQsICA0LCAgNCwgIDQsICAwLCAgMCwgIDAsICAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2JtY19saW5lYXIxNlsyNTZdID0geworICAwLCAgNCwgIDQsICA4LCAgOCwgMTIsIDEyLCAxNiwgMTYsIDEyLCAxMiwgIDgsICA4LCAgNCwgIDQsICAwLAorICA0LCAgOCwgMTYsIDIwLCAyOCwgMzIsIDQwLCA0NCwgNDQsIDQwLCAzMiwgMjgsIDIwLCAxNiwgIDgsICA0LAorICA0LCAxNiwgMjQsIDM2LCA0NCwgNTYsIDY0LCA3NiwgNzYsIDY0LCA1NiwgNDQsIDM2LCAyNCwgMTYsICA0LAorICA4LCAyMCwgMzYsIDQ4LCA2NCwgNzYsIDkyLDEwNCwxMDQsIDkyLCA3NiwgNjQsIDQ4LCAzNiwgMjAsICA4LAorICA4LCAyOCwgNDQsIDY0LCA4MCwxMDAsMTE2LDEzNiwxMzYsMTE2LDEwMCwgODAsIDY0LCA0NCwgMjgsICA4LAorIDEyLCAzMiwgNTYsIDc2LDEwMCwxMjAsMTQ0LDE2NCwxNjQsMTQ0LDEyMCwxMDAsIDc2LCA1NiwgMzIsIDEyLAorIDEyLCA0MCwgNjQsIDkyLDExNiwxNDQsMTY4LDE5NiwxOTYsMTY4LDE0NCwxMTYsIDkyLCA2NCwgNDAsIDEyLAorIDE2LCA0NCwgNzYsMTA0LDEzNiwxNjQsMTk2LDIyNCwyMjQsMTk2LDE2NCwxMzYsMTA0LCA3NiwgNDQsIDE2LAorIDE2LCA0NCwgNzYsMTA0LDEzNiwxNjQsMTk2LDIyNCwyMjQsMTk2LDE2NCwxMzYsMTA0LCA3NiwgNDQsIDE2LAorIDEyLCA0MCwgNjQsIDkyLDExNiwxNDQsMTY4LDE5NiwxOTYsMTY4LDE0NCwxMTYsIDkyLCA2NCwgNDAsIDEyLAorIDEyLCAzMiwgNTYsIDc2LDEwMCwxMjAsMTQ0LDE2NCwxNjQsMTQ0LDEyMCwxMDAsIDc2LCA1NiwgMzIsIDEyLAorICA4LCAyOCwgNDQsIDY0LCA4MCwxMDAsMTE2LDEzNiwxMzYsMTE2LDEwMCwgODAsIDY0LCA0NCwgMjgsICA4LAorICA4LCAyMCwgMzYsIDQ4LCA2NCwgNzYsIDkyLDEwNCwxMDQsIDkyLCA3NiwgNjQsIDQ4LCAzNiwgMjAsICA4LAorICA0LCAxNiwgMjQsIDM2LCA0NCwgNTYsIDY0LCA3NiwgNzYsIDY0LCA1NiwgNDQsIDM2LCAyNCwgMTYsICA0LAorICA0LCAgOCwgMTYsIDIwLCAyOCwgMzIsIDQwLCA0NCwgNDQsIDQwLCAzMiwgMjgsIDIwLCAxNiwgIDgsICA0LAorICAwLCAgNCwgIDQsICA4LCAgOCwgMTIsIDEyLCAxNiwgMTYsIDEyLCAxMiwgIDgsICA4LCAgNCwgIDQsICAwLAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2JtY19saW5lYXI4WzY0XSA9IHsKKyAgNCwgMTIsIDIwLCAyOCwgMjgsIDIwLCAxMiwgIDQsCisgMTIsIDM2LCA2MCwgODQsIDg0LCA2MCwgMzYsIDEyLAorIDIwLCA2MCwxMDAsMTQwLDE0MCwxMDAsIDYwLCAyMCwKKyAyOCwgODQsMTQwLDE5NiwxOTYsMTQwLCA4NCwgMjgsCisgMjgsIDg0LDE0MCwxOTYsMTk2LDE0MCwgODQsIDI4LAorIDIwLCA2MCwxMDAsMTQwLDE0MCwxMDAsIDYwLCAyMCwKKyAxMiwgMzYsIDYwLCA4NCwgODQsIDYwLCAzNiwgMTIsCisgIDQsIDEyLCAyMCwgMjgsIDI4LCAyMCwgMTIsICA0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgb2JtY19saW5lYXI0WzE2XSA9IHsKKyAxNiwgNDgsIDQ4LCAxNiwKKyA0OCwxNDQsMTQ0LCA0OCwKKyA0OCwxNDQsMTQ0LCA0OCwKKyAxNiwgNDgsIDQ4LCAxNiwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90ICogY29uc3Qgb2JtY190YWJfbGluZWFyWzRdPSB7CisgICAgb2JtY19saW5lYXIzMiwgb2JtY19saW5lYXIxNiwgb2JtY19saW5lYXI4LCBvYm1jX2xpbmVhcjQKK307CisKK2VudW0gTUlNb2RlIHsKKyAgICBNSV9NT0RFX0RVUCAgICAgICAgID0gMCwKKyAgICBNSV9NT0RFX0JMRU5EICAgICAgID0gMSwKKyAgICBNSV9NT0RFX01DSSAgICAgICAgID0gMiwKK307CisKK3R5cGVkZWYgc3RydWN0IENsdXN0ZXIgeworICAgIGludDY0X3Qgc3VtWzJdOworICAgIGludCBuYjsKK30gQ2x1c3RlcjsKKwordHlwZWRlZiBzdHJ1Y3QgQmxvY2sgeworICAgIGludDE2X3QgbXZzWzJdWzJdOworICAgIGludCBjaWQ7CisgICAgdWludDY0X3Qgc2JhZDsKKyAgICBpbnQgc2I7CisgICAgc3RydWN0IEJsb2NrICpzdWJzOworfSBCbG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgUGl4ZWxNVlMgeworICAgIGludDE2X3QgbXZzW05CX1BJWEVMX01WU11bMl07Cit9IFBpeGVsTVZTOworCit0eXBlZGVmIHN0cnVjdCBQaXhlbFdlaWdodHMgeworICAgIHVpbnQzMl90IHdlaWdodHNbTkJfUElYRUxfTVZTXTsKK30gUGl4ZWxXZWlnaHRzOworCit0eXBlZGVmIHN0cnVjdCBQaXhlbFJlZnMgeworICAgIGludDhfdCByZWZzW05CX1BJWEVMX01WU107CisgICAgaW50IG5iOworfSBQaXhlbFJlZnM7CisKK3R5cGVkZWYgc3RydWN0IEZyYW1lIHsKKyAgICBBVkZyYW1lICphdmY7CisgICAgQmxvY2sgKmJsb2NrczsKK30gRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IE1JQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZNb3Rpb25Fc3RDb250ZXh0IG1lX2N0eDsKKyAgICBBVlJhdGlvbmFsIGZyYW1lX3JhdGU7CisgICAgZW51bSBNSU1vZGUgbWlfbW9kZTsKKyAgICBpbnQgbWNfbW9kZTsKKyAgICBpbnQgbWVfbW9kZTsKKyAgICBpbnQgbWVfbWV0aG9kOworICAgIGludCBtYl9zaXplOworICAgIGludCBzZWFyY2hfcGFyYW07CisgICAgaW50IHZzYm1jOworCisgICAgRnJhbWUgZnJhbWVzW05CX0ZSQU1FU107CisgICAgQ2x1c3RlciBjbHVzdGVyc1tOQl9DTFVTVEVSU107CisgICAgQmxvY2sgKmludF9ibG9ja3M7CisgICAgUGl4ZWxNVlMgKnBpeGVsX212czsKKyAgICBQaXhlbFdlaWdodHMgKnBpeGVsX3dlaWdodHM7CisgICAgUGl4ZWxSZWZzICpwaXhlbF9yZWZzOworICAgIGludCAoKm12X3RhYmxlWzNdKVsyXVsyXTsKKyAgICBpbnQ2NF90IG91dF9wdHM7CisgICAgaW50IGJfd2lkdGgsIGJfaGVpZ2h0LCBiX2NvdW50OworICAgIGludCBsb2cyX21iX3NpemU7CisKKyAgICBpbnQgc2NkX21ldGhvZDsKKyAgICBpbnQgc2NlbmVfY2hhbmdlZDsKKyAgICBhdl9waXhlbHV0aWxzX3NhZF9mbiBzYWQ7CisgICAgZG91YmxlIHByZXZfbWFmZDsKKyAgICBkb3VibGUgc2NkX3RocmVzaG9sZDsKKworICAgIGludCBsb2cyX2Nocm9tYV93OworICAgIGludCBsb2cyX2Nocm9tYV9oOworICAgIGludCBuYl9wbGFuZXM7Cit9IE1JQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTUlDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKyNkZWZpbmUgQ09OU1QobmFtZSwgaGVscCwgdmFsLCB1bml0KSB7IG5hbWUsIGhlbHAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND12YWx9LCAwLCAwLCBGTEFHUywgdW5pdCB9CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBtaW50ZXJwb2xhdGVfb3B0aW9uc1tdID0geworICAgIHsgImZwcyIsICJvdXRwdXQncyBmcmFtZSByYXRlIiwgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICI2MCJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm1pX21vZGUiLCAibW90aW9uIGludGVycG9sYXRpb24gbW9kZSIsIE9GRlNFVChtaV9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IE1JX01PREVfTUNJfSwgTUlfTU9ERV9EVVAsIE1JX01PREVfTUNJLCBGTEFHUywgIm1pX21vZGUiIH0sCisgICAgICAgIENPTlNUKCJkdXAiLCAgICAiZHVwbGljYXRlIGZyYW1lcyIsICAgICAgICAgICAgICAgICAgICAgTUlfTU9ERV9EVVAsICAgICAgICAgICAgIm1pX21vZGUiKSwKKyAgICAgICAgQ09OU1QoImJsZW5kIiwgICJibGVuZCBmcmFtZXMiLCAgICAgICAgICAgICAgICAgICAgICAgICBNSV9NT0RFX0JMRU5ELCAgICAgICAgICAibWlfbW9kZSIpLAorICAgICAgICBDT05TVCgibWNpIiwgICAgIm1vdGlvbiBjb21wZW5zYXRlZCBpbnRlcnBvbGF0aW9uIiwgICAgIE1JX01PREVfTUNJLCAgICAgICAgICAgICJtaV9tb2RlIiksCisgICAgeyAibWNfbW9kZSIsICJtb3Rpb24gY29tcGVuc2F0aW9uIG1vZGUiLCBPRkZTRVQobWNfbW9kZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBNQ19NT0RFX09CTUN9LCBNQ19NT0RFX09CTUMsIE1DX01PREVfQU9CTUMsIEZMQUdTLCAibWNfbW9kZSIgfSwKKyAgICAgICAgQ09OU1QoIm9ibWMiLCAgICJvdmVybGFwcGVkIGJsb2NrIG1vdGlvbiBjb21wZW5zYXRpb24iLCBNQ19NT0RFX09CTUMsICAgICAgICAgICAibWNfbW9kZSIpLAorICAgICAgICBDT05TVCgiYW9ibWMiLCAgImFkYXB0aXZlIG92ZXJsYXBwZWQgYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbiIsIE1DX01PREVfQU9CTUMsICJtY19tb2RlIiksCisgICAgeyAibWVfbW9kZSIsICJtb3Rpb24gZXN0aW1hdGlvbiBtb2RlIiwgT0ZGU0VUKG1lX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gTUVfTU9ERV9CSUxBVH0sIE1FX01PREVfQklESVIsIE1FX01PREVfQklMQVQsIEZMQUdTLCAibWVfbW9kZSIgfSwKKyAgICAgICAgQ09OU1QoImJpZGlyIiwgICJiaWRpcmVjdGlvbmFsIG1vdGlvbiBlc3RpbWF0aW9uIiwgICAgICBNRV9NT0RFX0JJRElSLCAgICAgICAgICAibWVfbW9kZSIpLAorICAgICAgICBDT05TVCgiYmlsYXQiLCAgImJpbGF0ZXJhbCBtb3Rpb24gZXN0aW1hdGlvbiIsICAgICAgICAgIE1FX01PREVfQklMQVQsICAgICAgICAgICJtZV9tb2RlIiksCisgICAgeyAibWUiLCAibW90aW9uIGVzdGltYXRpb24gbWV0aG9kIiwgT0ZGU0VUKG1lX21ldGhvZCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBBVl9NRV9NRVRIT0RfRVBaU30sIEFWX01FX01FVEhPRF9FU0EsIEFWX01FX01FVEhPRF9VTUgsIEZMQUdTLCAibWUiIH0sCisgICAgICAgIENPTlNUKCJlc2EiLCAgICAiZXhoYXVzdGl2ZSBzZWFyY2giLCAgICAgICAgICAgICAgICAgICAgQVZfTUVfTUVUSE9EX0VTQSwgICAgICAgIm1lIiksCisgICAgICAgIENPTlNUKCJ0c3MiLCAgICAidGhyZWUgc3RlcCBzZWFyY2giLCAgICAgICAgICAgICAgICAgICAgQVZfTUVfTUVUSE9EX1RTUywgICAgICAgIm1lIiksCisgICAgICAgIENPTlNUKCJ0ZGxzIiwgICAidHdvIGRpbWVuc2lvbmFsIGxvZ2FyaXRobWljIHNlYXJjaCIsICAgQVZfTUVfTUVUSE9EX1RETFMsICAgICAgIm1lIiksCisgICAgICAgIENPTlNUKCJudHNzIiwgICAibmV3IHRocmVlIHN0ZXAgc2VhcmNoIiwgICAgICAgICAgICAgICAgQVZfTUVfTUVUSE9EX05UU1MsICAgICAgIm1lIiksCisgICAgICAgIENPTlNUKCJmc3MiLCAgICAiZm91ciBzdGVwIHNlYXJjaCIsICAgICAgICAgICAgICAgICAgICAgQVZfTUVfTUVUSE9EX0ZTUywgICAgICAgIm1lIiksCisgICAgICAgIENPTlNUKCJkcyIsICAgICAiZGlhbW9uZCBzZWFyY2giLCAgICAgICAgICAgICAgICAgICAgICAgQVZfTUVfTUVUSE9EX0RTLCAgICAgICAgIm1lIiksCisgICAgICAgIENPTlNUKCJoZXhicyIsICAiaGV4YWdvbi1iYXNlZCBzZWFyY2giLCAgICAgICAgICAgICAgICAgQVZfTUVfTUVUSE9EX0hFWEJTLCAgICAgIm1lIiksCisgICAgICAgIENPTlNUKCJlcHpzIiwgICAiZW5oYW5jZWQgcHJlZGljdGl2ZSB6b25hbCBzZWFyY2giLCAgICAgQVZfTUVfTUVUSE9EX0VQWlMsICAgICAgIm1lIiksCisgICAgICAgIENPTlNUKCJ1bWgiLCAgICAidW5ldmVuIG11bHRpLWhleGFnb24gc2VhcmNoIiwgICAgICAgICAgQVZfTUVfTUVUSE9EX1VNSCwgICAgICAgIm1lIiksCisgICAgeyAibWJfc2l6ZSIsICJtYWNyb2Jsb2NrIHNpemUiLCBPRkZTRVQobWJfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxNn0sIDQsIDE2LCBGTEFHUyB9LAorICAgIHsgInNlYXJjaF9wYXJhbSIsICJzZWFyY2ggcGFyYW1ldGVyIiwgT0ZGU0VUKHNlYXJjaF9wYXJhbSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAzMn0sIDQsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAidnNibWMiLCAidmFyaWFibGUtc2l6ZSBibG9jayBtb3Rpb24gY29tcGVuc2F0aW9uIiwgT0ZGU0VUKHZzYm1jKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgInNjZCIsICJzY2VuZSBjaGFuZ2UgZGV0ZWN0aW9uIG1ldGhvZCIsIE9GRlNFVChzY2RfbWV0aG9kKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFNDRF9NRVRIT0RfRkRJRkZ9LCBTQ0RfTUVUSE9EX05PTkUsIFNDRF9NRVRIT0RfRkRJRkYsIEZMQUdTLCAic2NlbmUiIH0sCisgICAgICAgIENPTlNUKCJub25lIiwgICAiZGlzYWJsZSBkZXRlY3Rpb24iLCAgICAgICAgICAgICAgICAgICAgU0NEX01FVEhPRF9OT05FLCAgICAgICAgInNjZW5lIiksCisgICAgICAgIENPTlNUKCJmZGlmZiIsICAiZnJhbWUgZGlmZmVyZW5jZSIsICAgICAgICAgICAgICAgICAgICAgU0NEX01FVEhPRF9GRElGRiwgICAgICAgInNjZW5lIiksCisgICAgeyAic2NkX3RocmVzaG9sZCIsICJzY2VuZSBjaGFuZ2UgdGhyZXNob2xkIiwgT0ZGU0VUKHNjZF90aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gNS4wfSwgMCwgMTAwLjAsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhtaW50ZXJwb2xhdGUpOworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzX2xpc3QgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKKyAgICBpZiAoIWZtdHNfbGlzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm10c19saXN0KTsKK30KKworc3RhdGljIHVpbnQ2NF90IGdldF9zYmFkKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeCwgaW50IHksIGludCB4X212LCBpbnQgeV9tdikKK3sKKyAgICB1aW50OF90ICpkYXRhX2N1ciA9IG1lX2N0eC0+ZGF0YV9jdXI7CisgICAgdWludDhfdCAqZGF0YV9uZXh0ID0gbWVfY3R4LT5kYXRhX3JlZjsKKyAgICBpbnQgbGluZXNpemUgPSBtZV9jdHgtPmxpbmVzaXplOworICAgIGludCBtdl94MSA9IHhfbXYgLSB4OworICAgIGludCBtdl95MSA9IHlfbXYgLSB5OworICAgIGludCBtdl94LCBtdl95LCBpLCBqOworICAgIHVpbnQ2NF90IHNiYWQgPSAwOworCisgICAgeCA9IGF2X2NsaXAoeCwgbWVfY3R4LT54X21pbiwgbWVfY3R4LT54X21heCk7CisgICAgeSA9IGF2X2NsaXAoeSwgbWVfY3R4LT55X21pbiwgbWVfY3R4LT55X21heCk7CisgICAgbXZfeCA9IGF2X2NsaXAoeF9tdiAtIHgsIC1GRk1JTih4IC0gbWVfY3R4LT54X21pbiwgbWVfY3R4LT54X21heCAtIHgpLCBGRk1JTih4IC0gbWVfY3R4LT54X21pbiwgbWVfY3R4LT54X21heCAtIHgpKTsKKyAgICBtdl95ID0gYXZfY2xpcCh5X212IC0geSwgLUZGTUlOKHkgLSBtZV9jdHgtPnlfbWluLCBtZV9jdHgtPnlfbWF4IC0geSksIEZGTUlOKHkgLSBtZV9jdHgtPnlfbWluLCBtZV9jdHgtPnlfbWF4IC0geSkpOworCisgICAgZGF0YV9jdXIgKz0gKHkgKyBtdl95KSAqIGxpbmVzaXplOworICAgIGRhdGFfbmV4dCArPSAoeSAtIG12X3kpICogbGluZXNpemU7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgbWVfY3R4LT5tYl9zaXplOyBqKyspCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtZV9jdHgtPm1iX3NpemU7IGkrKykKKyAgICAgICAgICAgIHNiYWQgKz0gRkZBQlMoZGF0YV9jdXJbeCArIG12X3ggKyBpICsgaiAqIGxpbmVzaXplXSAtIGRhdGFfbmV4dFt4IC0gbXZfeCArIGkgKyBqICogbGluZXNpemVdKTsKKworICAgIHJldHVybiBzYmFkICsgKEZGQUJTKG12X3gxIC0gbWVfY3R4LT5wcmVkX3gpICsgRkZBQlMobXZfeTEgLSBtZV9jdHgtPnByZWRfeSkpICogQ09TVF9QUkVEX1NDQUxFOworfQorCitzdGF0aWMgdWludDY0X3QgZ2V0X3NiYWRfb2IoQVZNb3Rpb25Fc3RDb250ZXh0ICptZV9jdHgsIGludCB4LCBpbnQgeSwgaW50IHhfbXYsIGludCB5X212KQoreworICAgIHVpbnQ4X3QgKmRhdGFfY3VyID0gbWVfY3R4LT5kYXRhX2N1cjsKKyAgICB1aW50OF90ICpkYXRhX25leHQgPSBtZV9jdHgtPmRhdGFfcmVmOworICAgIGludCBsaW5lc2l6ZSA9IG1lX2N0eC0+bGluZXNpemU7CisgICAgaW50IHhfbWluID0gbWVfY3R4LT54X21pbiArIG1lX2N0eC0+bWJfc2l6ZSAvIDI7CisgICAgaW50IHhfbWF4ID0gbWVfY3R4LT54X21heCAtIG1lX2N0eC0+bWJfc2l6ZSAvIDI7CisgICAgaW50IHlfbWluID0gbWVfY3R4LT55X21pbiArIG1lX2N0eC0+bWJfc2l6ZSAvIDI7CisgICAgaW50IHlfbWF4ID0gbWVfY3R4LT55X21heCAtIG1lX2N0eC0+bWJfc2l6ZSAvIDI7CisgICAgaW50IG12X3gxID0geF9tdiAtIHg7CisgICAgaW50IG12X3kxID0geV9tdiAtIHk7CisgICAgaW50IG12X3gsIG12X3ksIGksIGo7CisgICAgdWludDY0X3Qgc2JhZCA9IDA7CisKKyAgICB4ID0gYXZfY2xpcCh4LCB4X21pbiwgeF9tYXgpOworICAgIHkgPSBhdl9jbGlwKHksIHlfbWluLCB5X21heCk7CisgICAgbXZfeCA9IGF2X2NsaXAoeF9tdiAtIHgsIC1GRk1JTih4IC0geF9taW4sIHhfbWF4IC0geCksIEZGTUlOKHggLSB4X21pbiwgeF9tYXggLSB4KSk7CisgICAgbXZfeSA9IGF2X2NsaXAoeV9tdiAtIHksIC1GRk1JTih5IC0geV9taW4sIHlfbWF4IC0geSksIEZGTUlOKHkgLSB5X21pbiwgeV9tYXggLSB5KSk7CisKKyAgICBmb3IgKGogPSAtbWVfY3R4LT5tYl9zaXplIC8gMjsgaiA8IG1lX2N0eC0+bWJfc2l6ZSAqIDMgLyAyOyBqKyspCisgICAgICAgIGZvciAoaSA9IC1tZV9jdHgtPm1iX3NpemUgLyAyOyBpIDwgbWVfY3R4LT5tYl9zaXplICogMyAvIDI7IGkrKykKKyAgICAgICAgICAgIHNiYWQgKz0gRkZBQlMoZGF0YV9jdXJbeCArIG12X3ggKyBpICsgKHkgKyBtdl95ICsgaikgKiBsaW5lc2l6ZV0gLSBkYXRhX25leHRbeCAtIG12X3ggKyBpICsgKHkgLSBtdl95ICsgaikgKiBsaW5lc2l6ZV0pOworCisgICAgcmV0dXJuIHNiYWQgKyAoRkZBQlMobXZfeDEgLSBtZV9jdHgtPnByZWRfeCkgKyBGRkFCUyhtdl95MSAtIG1lX2N0eC0+cHJlZF95KSkgKiBDT1NUX1BSRURfU0NBTEU7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBnZXRfc2FkX29iKEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4LCBpbnQgeCwgaW50IHksIGludCB4X212LCBpbnQgeV9tdikKK3sKKyAgICB1aW50OF90ICpkYXRhX3JlZiA9IG1lX2N0eC0+ZGF0YV9yZWY7CisgICAgdWludDhfdCAqZGF0YV9jdXIgPSBtZV9jdHgtPmRhdGFfY3VyOworICAgIGludCBsaW5lc2l6ZSA9IG1lX2N0eC0+bGluZXNpemU7CisgICAgaW50IHhfbWluID0gbWVfY3R4LT54X21pbiArIG1lX2N0eC0+bWJfc2l6ZSAvIDI7CisgICAgaW50IHhfbWF4ID0gbWVfY3R4LT54X21heCAtIG1lX2N0eC0+bWJfc2l6ZSAvIDI7CisgICAgaW50IHlfbWluID0gbWVfY3R4LT55X21pbiArIG1lX2N0eC0+bWJfc2l6ZSAvIDI7CisgICAgaW50IHlfbWF4ID0gbWVfY3R4LT55X21heCAtIG1lX2N0eC0+bWJfc2l6ZSAvIDI7CisgICAgaW50IG12X3ggPSB4X212IC0geDsKKyAgICBpbnQgbXZfeSA9IHlfbXYgLSB5OworICAgIGludCBpLCBqOworICAgIHVpbnQ2NF90IHNhZCA9IDA7CisKKyAgICB4ID0gYXZfY2xpcCh4LCB4X21pbiwgeF9tYXgpOworICAgIHkgPSBhdl9jbGlwKHksIHlfbWluLCB5X21heCk7CisgICAgeF9tdiA9IGF2X2NsaXAoeF9tdiwgeF9taW4sIHhfbWF4KTsKKyAgICB5X212ID0gYXZfY2xpcCh5X212LCB5X21pbiwgeV9tYXgpOworCisgICAgZm9yIChqID0gLW1lX2N0eC0+bWJfc2l6ZSAvIDI7IGogPCBtZV9jdHgtPm1iX3NpemUgKiAzIC8gMjsgaisrKQorICAgICAgICBmb3IgKGkgPSAtbWVfY3R4LT5tYl9zaXplIC8gMjsgaSA8IG1lX2N0eC0+bWJfc2l6ZSAqIDMgLyAyOyBpKyspCisgICAgICAgICAgICBzYWQgKz0gRkZBQlMoZGF0YV9yZWZbeF9tdiArIGkgKyAoeV9tdiArIGopICogbGluZXNpemVdIC0gZGF0YV9jdXJbeCArIGkgKyAoeSArIGopICogbGluZXNpemVdKTsKKworICAgIHJldHVybiBzYWQgKyAoRkZBQlMobXZfeCAtIG1lX2N0eC0+cHJlZF94KSArIEZGQUJTKG12X3kgLSBtZV9jdHgtPnByZWRfeSkpICogQ09TVF9QUkVEX1NDQUxFOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBNSUNvbnRleHQgKm1pX2N0eCA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4ID0gJm1pX2N0eC0+bWVfY3R4OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBpbmxpbmstPmg7CisgICAgY29uc3QgaW50IHdpZHRoICA9IGlubGluay0+dzsKKyAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIG1pX2N0eC0+bG9nMl9jaHJvbWFfaCA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgbWlfY3R4LT5sb2cyX2Nocm9tYV93ID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKworICAgIG1pX2N0eC0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgbWlfY3R4LT5sb2cyX21iX3NpemUgPSBhdl9jZWlsX2xvZzJfYyhtaV9jdHgtPm1iX3NpemUpOworICAgIG1pX2N0eC0+bWJfc2l6ZSA9IDEgPDwgbWlfY3R4LT5sb2cyX21iX3NpemU7CisKKyAgICBtaV9jdHgtPmJfd2lkdGggID0gd2lkdGggPj4gbWlfY3R4LT5sb2cyX21iX3NpemU7CisgICAgbWlfY3R4LT5iX2hlaWdodCA9IGhlaWdodCA+PiBtaV9jdHgtPmxvZzJfbWJfc2l6ZTsKKyAgICBtaV9jdHgtPmJfY291bnQgPSBtaV9jdHgtPmJfd2lkdGggKiBtaV9jdHgtPmJfaGVpZ2h0OworCisgICAgZm9yIChpID0gMDsgaSA8IE5CX0ZSQU1FUzsgaSsrKSB7CisgICAgICAgIEZyYW1lICpmcmFtZSA9ICZtaV9jdHgtPmZyYW1lc1tpXTsKKyAgICAgICAgZnJhbWUtPmJsb2NrcyA9IGF2X21hbGxvY3pfYXJyYXkobWlfY3R4LT5iX2NvdW50LCBzaXplb2YoQmxvY2spKTsKKyAgICAgICAgaWYgKCFmcmFtZS0+YmxvY2tzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBpZiAobWlfY3R4LT5taV9tb2RlID09IE1JX01PREVfTUNJKSB7CisgICAgICAgIG1pX2N0eC0+cGl4ZWxfbXZzID0gYXZfbWFsbG9jel9hcnJheSh3aWR0aCAqIGhlaWdodCwgc2l6ZW9mKFBpeGVsTVZTKSk7CisgICAgICAgIG1pX2N0eC0+cGl4ZWxfd2VpZ2h0cyA9IGF2X21hbGxvY3pfYXJyYXkod2lkdGggKiBoZWlnaHQsIHNpemVvZihQaXhlbFdlaWdodHMpKTsKKyAgICAgICAgbWlfY3R4LT5waXhlbF9yZWZzID0gYXZfbWFsbG9jel9hcnJheSh3aWR0aCAqIGhlaWdodCwgc2l6ZW9mKFBpeGVsUmVmcykpOworICAgICAgICBpZiAoIW1pX2N0eC0+cGl4ZWxfbXZzIHx8ICFtaV9jdHgtPnBpeGVsX3dlaWdodHMgfHwgIW1pX2N0eC0+cGl4ZWxfcmVmcykgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1pX2N0eC0+bWVfbW9kZSA9PSBNRV9NT0RFX0JJTEFUKQorICAgICAgICAgICAgaWYgKCEobWlfY3R4LT5pbnRfYmxvY2tzID0gYXZfbWFsbG9jel9hcnJheShtaV9jdHgtPmJfY291bnQsIHNpemVvZihCbG9jaykpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGlmIChtaV9jdHgtPm1lX21ldGhvZCA9PSBBVl9NRV9NRVRIT0RfRVBaUykgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgIG1pX2N0eC0+bXZfdGFibGVbaV0gPSBhdl9tYWxsb2N6X2FycmF5KG1pX2N0eC0+Yl9jb3VudCwgc2l6ZW9mKCptaV9jdHgtPm12X3RhYmxlWzBdKSk7CisgICAgICAgICAgICAgICAgaWYgKCFtaV9jdHgtPm12X3RhYmxlW2ldKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1pX2N0eC0+c2NkX21ldGhvZCA9PSBTQ0RfTUVUSE9EX0ZESUZGKSB7CisgICAgICAgIG1pX2N0eC0+c2FkID0gYXZfcGl4ZWx1dGlsc19nZXRfc2FkX2ZuKDMsIDMsIDIsIG1pX2N0eCk7CisgICAgICAgIGlmICghbWlfY3R4LT5zYWQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZmX21lX2luaXRfY29udGV4dChtZV9jdHgsIG1pX2N0eC0+bWJfc2l6ZSwgbWlfY3R4LT5zZWFyY2hfcGFyYW0sIHdpZHRoLCBoZWlnaHQsIDAsIChtaV9jdHgtPmJfd2lkdGggLSAxKSA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZSwgMCwgKG1pX2N0eC0+Yl9oZWlnaHQgLSAxKSA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZSk7CisKKyAgICBpZiAobWlfY3R4LT5tZV9tb2RlID09IE1FX01PREVfQklESVIpCisgICAgICAgIG1lX2N0eC0+Z2V0X2Nvc3QgPSAmZ2V0X3NhZF9vYjsKKyAgICBlbHNlIGlmIChtaV9jdHgtPm1lX21vZGUgPT0gTUVfTU9ERV9CSUxBVCkKKyAgICAgICAgbWVfY3R4LT5nZXRfY29zdCA9ICZnZXRfc2JhZF9vYjsKKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgTkJfRlJBTUVTOyBpKyspCisgICAgICAgIGF2X2ZyZWVwKCZtaV9jdHgtPmZyYW1lc1tpXS5ibG9ja3MpOworICAgIGF2X2ZyZWVwKCZtaV9jdHgtPnBpeGVsX212cyk7CisgICAgYXZfZnJlZXAoJm1pX2N0eC0+cGl4ZWxfd2VpZ2h0cyk7CisgICAgYXZfZnJlZXAoJm1pX2N0eC0+cGl4ZWxfcmVmcyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBNSUNvbnRleHQgKm1pX2N0eCA9IG91dGxpbmstPnNyYy0+cHJpdjsKKworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBtaV9jdHgtPmZyYW1lX3JhdGU7CisgICAgb3V0bGluay0+dGltZV9iYXNlICA9IGF2X2ludl9xKG1pX2N0eC0+ZnJhbWVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBBRERfUFJFRChwcmVkcywgcHgsIHB5KVwKKyAgICBkbyB7XAorICAgICAgICBwcmVkcy5tdnNbcHJlZHMubmJdWzBdID0gcHg7XAorICAgICAgICBwcmVkcy5tdnNbcHJlZHMubmJdWzFdID0gcHk7XAorICAgICAgICBwcmVkcy5uYisrO1wKKyAgICB9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIHNlYXJjaF9tdihNSUNvbnRleHQgKm1pX2N0eCwgQmxvY2sgKmJsb2NrcywgaW50IG1iX3gsIGludCBtYl95LCBpbnQgZGlyKQoreworICAgIEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4ID0gJm1pX2N0eC0+bWVfY3R4OworICAgIEFWTW90aW9uRXN0UHJlZGljdG9yICpwcmVkcyA9IG1lX2N0eC0+cHJlZHM7CisgICAgQmxvY2sgKmJsb2NrID0gJmJsb2Nrc1ttYl94ICsgbWJfeSAqIG1pX2N0eC0+Yl93aWR0aF07CisKKyAgICBjb25zdCBpbnQgeF9tYiA9IG1iX3ggPDwgbWlfY3R4LT5sb2cyX21iX3NpemU7CisgICAgY29uc3QgaW50IHlfbWIgPSBtYl95IDw8IG1pX2N0eC0+bG9nMl9tYl9zaXplOworICAgIGNvbnN0IGludCBtYl9pID0gbWJfeCArIG1iX3kgKiBtaV9jdHgtPmJfd2lkdGg7CisgICAgaW50IG12WzJdID0ge3hfbWIsIHlfbWJ9OworCisgICAgc3dpdGNoIChtaV9jdHgtPm1lX21ldGhvZCkgeworICAgICAgICBjYXNlIEFWX01FX01FVEhPRF9FU0E6CisgICAgICAgICAgICBmZl9tZV9zZWFyY2hfZXNhKG1lX2N0eCwgeF9tYiwgeV9tYiwgbXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfTUVfTUVUSE9EX1RTUzoKKyAgICAgICAgICAgIGZmX21lX3NlYXJjaF90c3MobWVfY3R4LCB4X21iLCB5X21iLCBtdik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9NRV9NRVRIT0RfVERMUzoKKyAgICAgICAgICAgIGZmX21lX3NlYXJjaF90ZGxzKG1lX2N0eCwgeF9tYiwgeV9tYiwgbXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfTUVfTUVUSE9EX05UU1M6CisgICAgICAgICAgICBmZl9tZV9zZWFyY2hfbnRzcyhtZV9jdHgsIHhfbWIsIHlfbWIsIG12KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX01FX01FVEhPRF9GU1M6CisgICAgICAgICAgICBmZl9tZV9zZWFyY2hfZnNzKG1lX2N0eCwgeF9tYiwgeV9tYiwgbXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfTUVfTUVUSE9EX0RTOgorICAgICAgICAgICAgZmZfbWVfc2VhcmNoX2RzKG1lX2N0eCwgeF9tYiwgeV9tYiwgbXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfTUVfTUVUSE9EX0hFWEJTOgorICAgICAgICAgICAgZmZfbWVfc2VhcmNoX2hleGJzKG1lX2N0eCwgeF9tYiwgeV9tYiwgbXYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfTUVfTUVUSE9EX0VQWlM6CisKKyAgICAgICAgICAgIHByZWRzWzBdLm5iID0gMDsKKyAgICAgICAgICAgIHByZWRzWzFdLm5iID0gMDsKKworICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIDAsIDApOworCisgICAgICAgICAgICAvL2xlZnQgbWIgaW4gY3VycmVudCBmcmFtZQorICAgICAgICAgICAgaWYgKG1iX3ggPiAwKQorICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzBdLCBtaV9jdHgtPm12X3RhYmxlWzBdW21iX2kgLSAxXVtkaXJdWzBdLCBtaV9jdHgtPm12X3RhYmxlWzBdW21iX2kgLSAxXVtkaXJdWzFdKTsKKworICAgICAgICAgICAgLy90b3AgbWIgaW4gY3VycmVudCBmcmFtZQorICAgICAgICAgICAgaWYgKG1iX3kgPiAwKQorICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzBdLCBtaV9jdHgtPm12X3RhYmxlWzBdW21iX2kgLSBtaV9jdHgtPmJfd2lkdGhdW2Rpcl1bMF0sIG1pX2N0eC0+bXZfdGFibGVbMF1bbWJfaSAtIG1pX2N0eC0+Yl93aWR0aF1bZGlyXVsxXSk7CisKKyAgICAgICAgICAgIC8vdG9wLXJpZ2h0IG1iIGluIGN1cnJlbnQgZnJhbWUKKyAgICAgICAgICAgIGlmIChtYl95ID4gMCAmJiBtYl94ICsgMSA8IG1pX2N0eC0+Yl93aWR0aCkKKyAgICAgICAgICAgICAgICBBRERfUFJFRChwcmVkc1swXSwgbWlfY3R4LT5tdl90YWJsZVswXVttYl9pIC0gbWlfY3R4LT5iX3dpZHRoICsgMV1bZGlyXVswXSwgbWlfY3R4LT5tdl90YWJsZVswXVttYl9pIC0gbWlfY3R4LT5iX3dpZHRoICsgMV1bZGlyXVsxXSk7CisKKyAgICAgICAgICAgIC8vbWVkaWFuIHByZWRpY3RvcgorICAgICAgICAgICAgaWYgKHByZWRzWzBdLm5iID09IDQpIHsKKyAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeCA9IG1pZF9wcmVkKHByZWRzWzBdLm12c1sxXVswXSwgcHJlZHNbMF0ubXZzWzJdWzBdLCBwcmVkc1swXS5tdnNbM11bMF0pOworICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF95ID0gbWlkX3ByZWQocHJlZHNbMF0ubXZzWzFdWzFdLCBwcmVkc1swXS5tdnNbMl1bMV0sIHByZWRzWzBdLm12c1szXVsxXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWRzWzBdLm5iID09IDMpIHsKKyAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeCA9IG1pZF9wcmVkKDAsIHByZWRzWzBdLm12c1sxXVswXSwgcHJlZHNbMF0ubXZzWzJdWzBdKTsKKyAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeSA9IG1pZF9wcmVkKDAsIHByZWRzWzBdLm12c1sxXVsxXSwgcHJlZHNbMF0ubXZzWzJdWzFdKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlZHNbMF0ubmIgPT0gMikgeworICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF94ID0gcHJlZHNbMF0ubXZzWzFdWzBdOworICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF95ID0gcHJlZHNbMF0ubXZzWzFdWzFdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeCA9IDA7CisgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3kgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL2NvbGxvY2F0ZWQgbWIgaW4gcHJldiBmcmFtZQorICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIG1pX2N0eC0+bXZfdGFibGVbMV1bbWJfaV1bZGlyXVswXSwgbWlfY3R4LT5tdl90YWJsZVsxXVttYl9pXVtkaXJdWzFdKTsKKworICAgICAgICAgICAgLy9hY2NlbGVyYXRvciBtb3Rpb24gdmVjdG9yIG9mIGNvbGxvY2F0ZWQgYmxvY2sgaW4gcHJldiBmcmFtZQorICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMV0sIG1pX2N0eC0+bXZfdGFibGVbMV1bbWJfaV1bZGlyXVswXSArIChtaV9jdHgtPm12X3RhYmxlWzFdW21iX2ldW2Rpcl1bMF0gLSBtaV9jdHgtPm12X3RhYmxlWzJdW21iX2ldW2Rpcl1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pX2N0eC0+bXZfdGFibGVbMV1bbWJfaV1bZGlyXVsxXSArIChtaV9jdHgtPm12X3RhYmxlWzFdW21iX2ldW2Rpcl1bMV0gLSBtaV9jdHgtPm12X3RhYmxlWzJdW21iX2ldW2Rpcl1bMV0pKTsKKworICAgICAgICAgICAgLy9sZWZ0IG1iIGluIHByZXYgZnJhbWUKKyAgICAgICAgICAgIGlmIChtYl94ID4gMCkKKyAgICAgICAgICAgICAgICBBRERfUFJFRChwcmVkc1sxXSwgbWlfY3R4LT5tdl90YWJsZVsxXVttYl9pIC0gMV1bZGlyXVswXSwgbWlfY3R4LT5tdl90YWJsZVsxXVttYl9pIC0gMV1bZGlyXVsxXSk7CisKKyAgICAgICAgICAgIC8vdG9wIG1iIGluIHByZXYgZnJhbWUKKyAgICAgICAgICAgIGlmIChtYl95ID4gMCkKKyAgICAgICAgICAgICAgICBBRERfUFJFRChwcmVkc1sxXSwgbWlfY3R4LT5tdl90YWJsZVsxXVttYl9pIC0gbWlfY3R4LT5iX3dpZHRoXVtkaXJdWzBdLCBtaV9jdHgtPm12X3RhYmxlWzFdW21iX2kgLSBtaV9jdHgtPmJfd2lkdGhdW2Rpcl1bMV0pOworCisgICAgICAgICAgICAvL3JpZ2h0IG1iIGluIHByZXYgZnJhbWUKKyAgICAgICAgICAgIGlmIChtYl94ICsgMSA8IG1pX2N0eC0+Yl93aWR0aCkKKyAgICAgICAgICAgICAgICBBRERfUFJFRChwcmVkc1sxXSwgbWlfY3R4LT5tdl90YWJsZVsxXVttYl9pICsgMV1bZGlyXVswXSwgbWlfY3R4LT5tdl90YWJsZVsxXVttYl9pICsgMV1bZGlyXVsxXSk7CisKKyAgICAgICAgICAgIC8vYm90dG9tIG1iIGluIHByZXYgZnJhbWUKKyAgICAgICAgICAgIGlmIChtYl95ICsgMSA8IG1pX2N0eC0+Yl9oZWlnaHQpCisgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMV0sIG1pX2N0eC0+bXZfdGFibGVbMV1bbWJfaSArIG1pX2N0eC0+Yl93aWR0aF1bZGlyXVswXSwgbWlfY3R4LT5tdl90YWJsZVsxXVttYl9pICsgbWlfY3R4LT5iX3dpZHRoXVtkaXJdWzFdKTsKKworICAgICAgICAgICAgZmZfbWVfc2VhcmNoX2VwenMobWVfY3R4LCB4X21iLCB5X21iLCBtdik7CisKKyAgICAgICAgICAgIG1pX2N0eC0+bXZfdGFibGVbMF1bbWJfaV1bZGlyXVswXSA9IG12WzBdIC0geF9tYjsKKyAgICAgICAgICAgIG1pX2N0eC0+bXZfdGFibGVbMF1bbWJfaV1bZGlyXVsxXSA9IG12WzFdIC0geV9tYjsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfTUVfTUVUSE9EX1VNSDoKKworICAgICAgICAgICAgcHJlZHNbMF0ubmIgPSAwOworCisgICAgICAgICAgICBBRERfUFJFRChwcmVkc1swXSwgMCwgMCk7CisKKyAgICAgICAgICAgIC8vbGVmdCBtYiBpbiBjdXJyZW50IGZyYW1lCisgICAgICAgICAgICBpZiAobWJfeCA+IDApCisgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIGJsb2Nrc1ttYl9pIC0gMV0ubXZzW2Rpcl1bMF0sIGJsb2Nrc1ttYl9pIC0gMV0ubXZzW2Rpcl1bMV0pOworCisgICAgICAgICAgICBpZiAobWJfeSA+IDApIHsKKyAgICAgICAgICAgICAgICAvL3RvcCBtYiBpbiBjdXJyZW50IGZyYW1lCisgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIGJsb2Nrc1ttYl9pIC0gbWlfY3R4LT5iX3dpZHRoXS5tdnNbZGlyXVswXSwgYmxvY2tzW21iX2kgLSBtaV9jdHgtPmJfd2lkdGhdLm12c1tkaXJdWzFdKTsKKworICAgICAgICAgICAgICAgIC8vdG9wLXJpZ2h0IG1iIGluIGN1cnJlbnQgZnJhbWUKKyAgICAgICAgICAgICAgICBpZiAobWJfeCArIDEgPCBtaV9jdHgtPmJfd2lkdGgpCisgICAgICAgICAgICAgICAgICAgIEFERF9QUkVEKHByZWRzWzBdLCBibG9ja3NbbWJfaSAtIG1pX2N0eC0+Yl93aWR0aCArIDFdLm12c1tkaXJdWzBdLCBibG9ja3NbbWJfaSAtIG1pX2N0eC0+Yl93aWR0aCArIDFdLm12c1tkaXJdWzFdKTsKKyAgICAgICAgICAgICAgICAvL3RvcC1sZWZ0IG1iIGluIGN1cnJlbnQgZnJhbWUKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtYl94ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgQUREX1BSRUQocHJlZHNbMF0sIGJsb2Nrc1ttYl9pIC0gbWlfY3R4LT5iX3dpZHRoIC0gMV0ubXZzW2Rpcl1bMF0sIGJsb2Nrc1ttYl9pIC0gbWlfY3R4LT5iX3dpZHRoIC0gMV0ubXZzW2Rpcl1bMV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL21lZGlhbiBwcmVkaWN0b3IKKyAgICAgICAgICAgIGlmIChwcmVkc1swXS5uYiA9PSA0KSB7CisgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3ggPSBtaWRfcHJlZChwcmVkc1swXS5tdnNbMV1bMF0sIHByZWRzWzBdLm12c1syXVswXSwgcHJlZHNbMF0ubXZzWzNdWzBdKTsKKyAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeSA9IG1pZF9wcmVkKHByZWRzWzBdLm12c1sxXVsxXSwgcHJlZHNbMF0ubXZzWzJdWzFdLCBwcmVkc1swXS5tdnNbM11bMV0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVkc1swXS5uYiA9PSAzKSB7CisgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3ggPSBtaWRfcHJlZCgwLCBwcmVkc1swXS5tdnNbMV1bMF0sIHByZWRzWzBdLm12c1syXVswXSk7CisgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3kgPSBtaWRfcHJlZCgwLCBwcmVkc1swXS5tdnNbMV1bMV0sIHByZWRzWzBdLm12c1syXVsxXSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByZWRzWzBdLm5iID09IDIpIHsKKyAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeCA9IHByZWRzWzBdLm12c1sxXVswXTsKKyAgICAgICAgICAgICAgICBtZV9jdHgtPnByZWRfeSA9IHByZWRzWzBdLm12c1sxXVsxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVfY3R4LT5wcmVkX3ggPSAwOworICAgICAgICAgICAgICAgIG1lX2N0eC0+cHJlZF95ID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmZfbWVfc2VhcmNoX3VtaChtZV9jdHgsIHhfbWIsIHlfbWIsIG12KTsKKworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgYmxvY2stPm12c1tkaXJdWzBdID0gbXZbMF0gLSB4X21iOworICAgIGJsb2NrLT5tdnNbZGlyXVsxXSA9IG12WzFdIC0geV9tYjsKK30KKworc3RhdGljIHZvaWQgYmlsYXRlcmFsX21lKE1JQ29udGV4dCAqbWlfY3R4KQoreworICAgIEJsb2NrICpibG9jazsKKyAgICBpbnQgbWJfeCwgbWJfeTsKKworICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBtaV9jdHgtPmJfaGVpZ2h0OyBtYl95KyspCisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBtaV9jdHgtPmJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgYmxvY2sgPSAmbWlfY3R4LT5pbnRfYmxvY2tzW21iX3ggKyBtYl95ICogbWlfY3R4LT5iX3dpZHRoXTsKKworICAgICAgICAgICAgYmxvY2stPmNpZCA9IDA7CisgICAgICAgICAgICBibG9jay0+c2IgPSAwOworCisgICAgICAgICAgICBibG9jay0+bXZzWzBdWzBdID0gMDsKKyAgICAgICAgICAgIGJsb2NrLT5tdnNbMF1bMV0gPSAwOworICAgICAgICB9CisKKyAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgbWlfY3R4LT5iX2hlaWdodDsgbWJfeSsrKQorICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgbWlfY3R4LT5iX3dpZHRoOyBtYl94KyspCisgICAgICAgICAgICBzZWFyY2hfbXYobWlfY3R4LCBtaV9jdHgtPmludF9ibG9ja3MsIG1iX3gsIG1iX3ksIDApOworfQorCitzdGF0aWMgaW50IHZhcl9zaXplX2JtZShNSUNvbnRleHQgKm1pX2N0eCwgQmxvY2sgKmJsb2NrLCBpbnQgeF9tYiwgaW50IHlfbWIsIGludCBuKQoreworICAgIEFWTW90aW9uRXN0Q29udGV4dCAqbWVfY3R4ID0gJm1pX2N0eC0+bWVfY3R4OworICAgIHVpbnQ2NF90IGNvc3Rfc2IsIGNvc3Rfb2xkOworICAgIGludCBtYl9zaXplID0gbWVfY3R4LT5tYl9zaXplOworICAgIGludCBzZWFyY2hfcGFyYW0gPSBtZV9jdHgtPnNlYXJjaF9wYXJhbTsKKyAgICBpbnQgbXZfeCwgbXZfeTsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgcmV0OworCisgICAgbWVfY3R4LT5tYl9zaXplID0gMSA8PCBuOworICAgIGNvc3Rfb2xkID0gbWVfY3R4LT5nZXRfY29zdChtZV9jdHgsIHhfbWIsIHlfbWIsIHhfbWIgKyBibG9jay0+bXZzWzBdWzBdLCB5X21iICsgYmxvY2stPm12c1swXVsxXSk7CisgICAgbWVfY3R4LT5tYl9zaXplID0gbWJfc2l6ZTsKKworICAgIGlmICghY29zdF9vbGQpIHsKKyAgICAgICAgYmxvY2stPnNiID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFibG9jay0+c3VicykgeworICAgICAgICBibG9jay0+c3VicyA9IGF2X21hbGxvY3pfYXJyYXkoNCwgc2l6ZW9mKEJsb2NrKSk7CisgICAgICAgIGlmICghYmxvY2stPnN1YnMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGJsb2NrLT5zYiA9IDE7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgMjsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7CisgICAgICAgICAgICBCbG9jayAqc2IgPSAmYmxvY2stPnN1YnNbeCArIHkgKiAyXTsKKyAgICAgICAgICAgIGludCBtdlsyXSA9IHt4X21iICsgYmxvY2stPm12c1swXVswXSwgeV9tYiArIGJsb2NrLT5tdnNbMF1bMV19OworCisgICAgICAgICAgICBtZV9jdHgtPm1iX3NpemUgPSAxIDw8IChuIC0gMSk7CisgICAgICAgICAgICBtZV9jdHgtPnNlYXJjaF9wYXJhbSA9IDI7CisgICAgICAgICAgICBtZV9jdHgtPnByZWRfeCA9IGJsb2NrLT5tdnNbMF1bMF07CisgICAgICAgICAgICBtZV9jdHgtPnByZWRfeSA9IGJsb2NrLT5tdnNbMF1bMV07CisKKyAgICAgICAgICAgIGNvc3Rfc2IgPSBmZl9tZV9zZWFyY2hfZHMoJm1pX2N0eC0+bWVfY3R4LCB4X21iICsgYmxvY2stPm12c1swXVswXSwgeV9tYiArIGJsb2NrLT5tdnNbMF1bMV0sIG12KTsKKyAgICAgICAgICAgIG12X3ggPSBtdlswXSAtIHhfbWI7CisgICAgICAgICAgICBtdl95ID0gbXZbMV0gLSB5X21iOworCisgICAgICAgICAgICBtZV9jdHgtPm1iX3NpemUgPSBtYl9zaXplOworICAgICAgICAgICAgbWVfY3R4LT5zZWFyY2hfcGFyYW0gPSBzZWFyY2hfcGFyYW07CisKKyAgICAgICAgICAgIGlmIChjb3N0X3NiIDwgY29zdF9vbGQgLyA0KSB7CisgICAgICAgICAgICAgICAgc2ItPm12c1swXVswXSA9IG12X3g7CisgICAgICAgICAgICAgICAgc2ItPm12c1swXVsxXSA9IG12X3k7CisKKyAgICAgICAgICAgICAgICBpZiAobiA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9IHZhcl9zaXplX2JtZShtaV9jdHgsIHNiLCB4X21iICsgKHggPDwgKG4gLSAxKSksIHlfbWIgKyAoeSA8PCAobiAtIDEpKSwgbiAtIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc2ItPnNiID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmxvY2stPnNiID0gMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2x1c3Rlcl9tdnMoTUlDb250ZXh0ICptaV9jdHgpCit7CisgICAgaW50IGNoYW5nZWQsIGMsIGNfbWF4ID0gMDsKKyAgICBpbnQgbWJfeCwgbWJfeSwgeCwgeTsKKyAgICBpbnQgbXZfeCwgbXZfeSwgYXZnX3gsIGF2Z195LCBkeCwgZHk7CisgICAgaW50IGQsIHJldDsKKyAgICBCbG9jayAqYmxvY2s7CisgICAgQ2x1c3RlciAqY2x1c3RlciwgKmNsdXN0ZXJfbmV3OworCisgICAgZG8geworICAgICAgICBjaGFuZ2VkID0gMDsKKyAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IG1pX2N0eC0+Yl9oZWlnaHQ7IG1iX3krKykKKyAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBtaV9jdHgtPmJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgICAgIGJsb2NrID0gJm1pX2N0eC0+aW50X2Jsb2Nrc1ttYl94ICsgbWJfeSAqIG1pX2N0eC0+Yl93aWR0aF07CisgICAgICAgICAgICAgICAgYyA9IGJsb2NrLT5jaWQ7CisgICAgICAgICAgICAgICAgY2x1c3RlciA9ICZtaV9jdHgtPmNsdXN0ZXJzW2NdOworICAgICAgICAgICAgICAgIG12X3ggPSBibG9jay0+bXZzWzBdWzBdOworICAgICAgICAgICAgICAgIG12X3kgPSBibG9jay0+bXZzWzBdWzFdOworCisgICAgICAgICAgICAgICAgaWYgKGNsdXN0ZXItPm5iIDwgMikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBhdmdfeCA9IGNsdXN0ZXItPnN1bVswXSAvIGNsdXN0ZXItPm5iOworICAgICAgICAgICAgICAgIGF2Z195ID0gY2x1c3Rlci0+c3VtWzFdIC8gY2x1c3Rlci0+bmI7CisgICAgICAgICAgICAgICAgZHggPSBhdmdfeCAtIG12X3g7CisgICAgICAgICAgICAgICAgZHkgPSBhdmdfeSAtIG12X3k7CisKKyAgICAgICAgICAgICAgICBpZiAoRkZBQlMoZHgpID4gQ0xVU1RFUl9USFJFU0hPTEQgfHwgRkZBQlMoZHkpID4gQ0xVU1RFUl9USFJFU0hPTEQpIHsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGQgPSAxOyBkIDwgNTsgZCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh5ID0gRkZNQVgobWJfeSAtIGQsIDApOyB5IDwgRkZNSU4obWJfeSArIGQgKyAxLCBtaV9jdHgtPmJfaGVpZ2h0KTsgeSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IEZGTUFYKG1iX3ggLSBkLCAwKTsgeCA8IEZGTUlOKG1iX3ggKyBkICsgMSwgbWlfY3R4LT5iX3dpZHRoKTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrICpuYiA9ICZtaV9jdHgtPmludF9ibG9ja3NbeCArIHkgKiBtaV9jdHgtPmJfd2lkdGhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmItPmNpZCA+IGJsb2NrLT5jaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYi0+Y2lkIDwgYyB8fCBjID09IGJsb2NrLT5jaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IG5iLT5jaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPT0gYmxvY2stPmNpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBjX21heCArIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgPj0gTkJfQ0xVU1RFUlMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9uZXcgPSAmbWlfY3R4LT5jbHVzdGVyc1tjXTsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9uZXctPnN1bVswXSArPSBtdl94OworICAgICAgICAgICAgICAgICAgICBjbHVzdGVyX25ldy0+c3VtWzFdICs9IG12X3k7CisgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXItPnN1bVswXSAtPSBtdl94OworICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLT5zdW1bMV0gLT0gbXZfeTsKKyAgICAgICAgICAgICAgICAgICAgY2x1c3Rlcl9uZXctPm5iKys7CisgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXItPm5iLS07CisKKyAgICAgICAgICAgICAgICAgICAgY19tYXggPSBGRk1BWChjX21heCwgYyk7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5jaWQgPSBjOworCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICB9IHdoaWxlIChjaGFuZ2VkKTsKKworICAgIC8qIGZpbmQgYm91bmRhcmllcyAqLworICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBtaV9jdHgtPmJfaGVpZ2h0OyBtYl95KyspCisgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBtaV9jdHgtPmJfd2lkdGg7IG1iX3grKykgeworICAgICAgICAgICAgYmxvY2sgPSAmbWlfY3R4LT5pbnRfYmxvY2tzW21iX3ggKyBtYl95ICogbWlfY3R4LT5iX3dpZHRoXTsKKyAgICAgICAgICAgIGZvciAoeSA9IEZGTUFYKG1iX3kgLSAxLCAwKTsgeSA8IEZGTUlOKG1iX3kgKyAyLCBtaV9jdHgtPmJfaGVpZ2h0KTsgeSsrKQorICAgICAgICAgICAgICAgIGZvciAoeCA9IEZGTUFYKG1iX3ggLSAxLCAwKTsgeCA8IEZGTUlOKG1iX3ggKyAyLCBtaV9jdHgtPmJfd2lkdGgpOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZHggPSB4IC0gbWJfeDsKKyAgICAgICAgICAgICAgICAgICAgZHkgPSB5IC0gbWJfeTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKHggLSBtYl94KSAmJiAoeSAtIG1iX3kpIHx8ICFkeCAmJiAhZHkpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIW1iX3ggfHwgIW1iX3kgfHwgbWJfeCA9PSBtaV9jdHgtPmJfd2lkdGggLSAxIHx8IG1iX3kgPT0gbWlfY3R4LT5iX2hlaWdodCAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2stPmNpZCAhPSBtaV9jdHgtPmludF9ibG9ja3NbeCArIHkgKiBtaV9jdHgtPmJfd2lkdGhdLmNpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkeCAmJiBibG9jay0+Y2lkID09IG1pX2N0eC0+aW50X2Jsb2Nrc1t4ICsgKG1iX3kgLSBkeSkgKiBtaV9jdHgtPmJfd2lkdGhdLmNpZCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFkeSAmJiBibG9jay0+Y2lkID09IG1pX2N0eC0+aW50X2Jsb2Nrc1sobWJfeCAtIGR4KSArIHkgKiBtaV9jdHgtPmJfd2lkdGhdLmNpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPSB2YXJfc2l6ZV9ibWUobWlfY3R4LCBibG9jaywgbWJfeCA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZSwgbWJfeSA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZSwgbWlfY3R4LT5sb2cyX21iX3NpemUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbmplY3RfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmF2Zl9pbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIE1JQ29udGV4dCAqbWlfY3R4ID0gY3R4LT5wcml2OworICAgIEZyYW1lIGZyYW1lX3RtcDsKKyAgICBpbnQgbWJfeCwgbWJfeSwgZGlyOworCisgICAgYXZfZnJhbWVfZnJlZSgmbWlfY3R4LT5mcmFtZXNbMF0uYXZmKTsKKyAgICBmcmFtZV90bXAgPSBtaV9jdHgtPmZyYW1lc1swXTsKKyAgICBtZW1tb3ZlKCZtaV9jdHgtPmZyYW1lc1swXSwgJm1pX2N0eC0+ZnJhbWVzWzFdLCBzaXplb2YobWlfY3R4LT5mcmFtZXNbMF0pICogKE5CX0ZSQU1FUyAtIDEpKTsKKyAgICBtaV9jdHgtPmZyYW1lc1tOQl9GUkFNRVMgLSAxXSA9IGZyYW1lX3RtcDsKKyAgICBtaV9jdHgtPmZyYW1lc1tOQl9GUkFNRVMgLSAxXS5hdmYgPSBhdmZfaW47CisKKyAgICBpZiAobWlfY3R4LT5taV9tb2RlID09IE1JX01PREVfTUNJKSB7CisKKyAgICAgICAgaWYgKG1pX2N0eC0+bWVfbWV0aG9kID09IEFWX01FX01FVEhPRF9FUFpTKSB7CisgICAgICAgICAgICBtaV9jdHgtPm12X3RhYmxlWzJdID0gbWVtY3B5KG1pX2N0eC0+bXZfdGFibGVbMl0sIG1pX2N0eC0+bXZfdGFibGVbMV0sIHNpemVvZigqbWlfY3R4LT5tdl90YWJsZVsxXSkgKiBtaV9jdHgtPmJfY291bnQpOworICAgICAgICAgICAgbWlfY3R4LT5tdl90YWJsZVsxXSA9IG1lbWNweShtaV9jdHgtPm12X3RhYmxlWzFdLCBtaV9jdHgtPm12X3RhYmxlWzBdLCBzaXplb2YoKm1pX2N0eC0+bXZfdGFibGVbMF0pICogbWlfY3R4LT5iX2NvdW50KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtaV9jdHgtPm1lX21vZGUgPT0gTUVfTU9ERV9CSURJUikgeworCisgICAgICAgICAgICBpZiAobWlfY3R4LT5mcmFtZXNbMV0uYXZmKSB7CisgICAgICAgICAgICAgICAgZm9yIChkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKykgeworICAgICAgICAgICAgICAgICAgICBtaV9jdHgtPm1lX2N0eC5saW5lc2l6ZSA9IG1pX2N0eC0+ZnJhbWVzWzJdLmF2Zi0+bGluZXNpemVbMF07CisgICAgICAgICAgICAgICAgICAgIG1pX2N0eC0+bWVfY3R4LmRhdGFfY3VyID0gbWlfY3R4LT5mcmFtZXNbMl0uYXZmLT5kYXRhWzBdOworICAgICAgICAgICAgICAgICAgICBtaV9jdHgtPm1lX2N0eC5kYXRhX3JlZiA9IG1pX2N0eC0+ZnJhbWVzW2RpciA/IDMgOiAxXS5hdmYtPmRhdGFbMF07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IG1pX2N0eC0+Yl9oZWlnaHQ7IG1iX3krKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobWJfeCA9IDA7IG1iX3ggPCBtaV9jdHgtPmJfd2lkdGg7IG1iX3grKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hfbXYobWlfY3R4LCBtaV9jdHgtPmZyYW1lc1syXS5ibG9ja3MsIG1iX3gsIG1iX3ksIGRpcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAobWlfY3R4LT5tZV9tb2RlID09IE1FX01PREVfQklMQVQpIHsKKyAgICAgICAgICAgIEJsb2NrICpibG9jazsKKyAgICAgICAgICAgIGludCBpLCByZXQ7CisKKyAgICAgICAgICAgIGlmICghbWlfY3R4LT5mcmFtZXNbMF0uYXZmKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBtaV9jdHgtPm1lX2N0eC5saW5lc2l6ZSA9IG1pX2N0eC0+ZnJhbWVzWzBdLmF2Zi0+bGluZXNpemVbMF07CisgICAgICAgICAgICBtaV9jdHgtPm1lX2N0eC5kYXRhX2N1ciA9IG1pX2N0eC0+ZnJhbWVzWzFdLmF2Zi0+ZGF0YVswXTsKKyAgICAgICAgICAgIG1pX2N0eC0+bWVfY3R4LmRhdGFfcmVmID0gbWlfY3R4LT5mcmFtZXNbMl0uYXZmLT5kYXRhWzBdOworCisgICAgICAgICAgICBiaWxhdGVyYWxfbWUobWlfY3R4KTsKKworICAgICAgICAgICAgaWYgKG1pX2N0eC0+bWNfbW9kZSA9PSBNQ19NT0RFX0FPQk1DKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKG1iX3kgPSAwOyBtYl95IDwgbWlfY3R4LT5iX2hlaWdodDsgbWJfeSsrKQorICAgICAgICAgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgbWlfY3R4LT5iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X21iID0gbWJfeCA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X21iID0gbWJfeSA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gJm1pX2N0eC0+aW50X2Jsb2Nrc1ttYl94ICsgbWJfeSAqIG1pX2N0eC0+Yl93aWR0aF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5zYmFkID0gZ2V0X3NiYWQoJm1pX2N0eC0+bWVfY3R4LCB4X21iLCB5X21iLCB4X21iICsgYmxvY2stPm12c1swXVswXSwgeV9tYiArIGJsb2NrLT5tdnNbMF1bMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtaV9jdHgtPnZzYm1jKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTkJfQ0xVU1RFUlM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBtaV9jdHgtPmNsdXN0ZXJzW2ldLnN1bVswXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1pX2N0eC0+Y2x1c3RlcnNbaV0uc3VtWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbWlfY3R4LT5jbHVzdGVyc1tpXS5uYiA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IG1pX2N0eC0+Yl9oZWlnaHQ7IG1iX3krKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IG1pX2N0eC0+Yl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9ICZtaV9jdHgtPmludF9ibG9ja3NbbWJfeCArIG1iX3kgKiBtaV9jdHgtPmJfd2lkdGhdOworCisgICAgICAgICAgICAgICAgICAgICAgICBtaV9jdHgtPmNsdXN0ZXJzWzBdLnN1bVswXSArPSBibG9jay0+bXZzWzBdWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgbWlfY3R4LT5jbHVzdGVyc1swXS5zdW1bMV0gKz0gYmxvY2stPm12c1swXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWlfY3R4LT5jbHVzdGVyc1swXS5uYiA9IG1pX2N0eC0+Yl9jb3VudDsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPSBjbHVzdGVyX212cyhtaV9jdHgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGV0ZWN0X3NjZW5lX2NoYW5nZShNSUNvbnRleHQgKm1pX2N0eCkKK3sKKyAgICBBVk1vdGlvbkVzdENvbnRleHQgKm1lX2N0eCA9ICZtaV9jdHgtPm1lX2N0eDsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgbGluZXNpemUgPSBtZV9jdHgtPmxpbmVzaXplOworICAgIHVpbnQ4X3QgKnAxID0gbWlfY3R4LT5mcmFtZXNbMV0uYXZmLT5kYXRhWzBdOworICAgIHVpbnQ4X3QgKnAyID0gbWlfY3R4LT5mcmFtZXNbMl0uYXZmLT5kYXRhWzBdOworCisgICAgaWYgKG1pX2N0eC0+c2NkX21ldGhvZCA9PSBTQ0RfTUVUSE9EX0ZESUZGKSB7CisgICAgICAgIGRvdWJsZSByZXQgPSAwLCBtYWZkLCBkaWZmOworICAgICAgICBpbnQ2NF90IHNhZDsKKworICAgICAgICBmb3IgKHNhZCA9IHkgPSAwOyB5IDwgbWVfY3R4LT5oZWlnaHQ7IHkgKz0gOCkKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBsaW5lc2l6ZTsgeCArPSA4KQorICAgICAgICAgICAgICAgIHNhZCArPSBtaV9jdHgtPnNhZChwMSArIHggKyB5ICogbGluZXNpemUsIGxpbmVzaXplLCBwMiArIHggKyB5ICogbGluZXNpemUsIGxpbmVzaXplKTsKKworICAgICAgICBlbW1zX2MoKTsKKyAgICAgICAgbWFmZCA9IChkb3VibGUpIHNhZCAvIChtZV9jdHgtPmhlaWdodCAqIG1lX2N0eC0+d2lkdGggKiAzKTsKKyAgICAgICAgZGlmZiA9IGZhYnMobWFmZCAtIG1pX2N0eC0+cHJldl9tYWZkKTsKKyAgICAgICAgcmV0ICA9IGF2X2NsaXBmKEZGTUlOKG1hZmQsIGRpZmYpLCAwLCAxMDAuMCk7CisgICAgICAgIG1pX2N0eC0+cHJldl9tYWZkID0gbWFmZDsKKworICAgICAgICByZXR1cm4gcmV0ID49IG1pX2N0eC0+c2NkX3RocmVzaG9sZDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBBRERfUElYRUxTKGJfd2VpZ2h0LCBtdl94LCBtdl95KVwKKyAgICBkbyB7XAorICAgICAgICBpZiAoIWJfd2VpZ2h0IHx8IHBpeGVsX3JlZnMtPm5iICsgMSA+PSBOQl9QSVhFTF9NVlMpXAorICAgICAgICAgICAgY29udGludWU7XAorICAgICAgICBwaXhlbF9yZWZzLT5yZWZzW3BpeGVsX3JlZnMtPm5iXSA9IDE7XAorICAgICAgICBwaXhlbF93ZWlnaHRzLT53ZWlnaHRzW3BpeGVsX3JlZnMtPm5iXSA9IGJfd2VpZ2h0ICogKEFMUEhBX01BWCAtIGFscGhhKTtcCisgICAgICAgIHBpeGVsX212cy0+bXZzW3BpeGVsX3JlZnMtPm5iXVswXSA9IGF2X2NsaXAoKG12X3ggKiBhbHBoYSkgLyBBTFBIQV9NQVgsIHhfbWluLCB4X21heCk7XAorICAgICAgICBwaXhlbF9tdnMtPm12c1twaXhlbF9yZWZzLT5uYl1bMV0gPSBhdl9jbGlwKChtdl95ICogYWxwaGEpIC8gQUxQSEFfTUFYLCB5X21pbiwgeV9tYXgpO1wKKyAgICAgICAgcGl4ZWxfcmVmcy0+bmIrKztcCisgICAgICAgIHBpeGVsX3JlZnMtPnJlZnNbcGl4ZWxfcmVmcy0+bmJdID0gMjtcCisgICAgICAgIHBpeGVsX3dlaWdodHMtPndlaWdodHNbcGl4ZWxfcmVmcy0+bmJdID0gYl93ZWlnaHQgKiBhbHBoYTtcCisgICAgICAgIHBpeGVsX212cy0+bXZzW3BpeGVsX3JlZnMtPm5iXVswXSA9IGF2X2NsaXAoLW12X3ggKiAoQUxQSEFfTUFYIC0gYWxwaGEpIC8gQUxQSEFfTUFYLCB4X21pbiwgeF9tYXgpO1wKKyAgICAgICAgcGl4ZWxfbXZzLT5tdnNbcGl4ZWxfcmVmcy0+bmJdWzFdID0gYXZfY2xpcCgtbXZfeSAqIChBTFBIQV9NQVggLSBhbHBoYSkgLyBBTFBIQV9NQVgsIHlfbWluLCB5X21heCk7XAorICAgICAgICBwaXhlbF9yZWZzLT5uYisrO1wKKyAgICB9IHdoaWxlKDApCisKK3N0YXRpYyB2b2lkIGJpZGlyZWN0aW9uYWxfb2JtYyhNSUNvbnRleHQgKm1pX2N0eCwgaW50IGFscGhhKQoreworICAgIGludCB4LCB5OworICAgIGludCB3aWR0aCA9IG1pX2N0eC0+ZnJhbWVzWzBdLmF2Zi0+d2lkdGg7CisgICAgaW50IGhlaWdodCA9IG1pX2N0eC0+ZnJhbWVzWzBdLmF2Zi0+aGVpZ2h0OworICAgIGludCBtYl95LCBtYl94LCBkaXI7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgbWlfY3R4LT5waXhlbF9yZWZzW3ggKyB5ICogd2lkdGhdLm5iID0gMDsKKworICAgIGZvciAoZGlyID0gMDsgZGlyIDwgMjsgZGlyKyspCisgICAgICAgIGZvciAobWJfeSA9IDA7IG1iX3kgPCBtaV9jdHgtPmJfaGVpZ2h0OyBtYl95KyspCisgICAgICAgICAgICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgbWlfY3R4LT5iX3dpZHRoOyBtYl94KyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYSA9IGRpciA/IGFscGhhIDogKEFMUEhBX01BWCAtIGFscGhhKTsKKyAgICAgICAgICAgICAgICBpbnQgbXZfeCA9IG1pX2N0eC0+ZnJhbWVzWzIgLSBkaXJdLmJsb2Nrc1ttYl94ICsgbWJfeSAqIG1pX2N0eC0+Yl93aWR0aF0ubXZzW2Rpcl1bMF07CisgICAgICAgICAgICAgICAgaW50IG12X3kgPSBtaV9jdHgtPmZyYW1lc1syIC0gZGlyXS5ibG9ja3NbbWJfeCArIG1iX3kgKiBtaV9jdHgtPmJfd2lkdGhdLm12c1tkaXJdWzFdOworICAgICAgICAgICAgICAgIGludCBzdGFydF94LCBzdGFydF95OworICAgICAgICAgICAgICAgIGludCBzdGFydGNfeCwgc3RhcnRjX3ksIGVuZGNfeCwgZW5kY195OworCisgICAgICAgICAgICAgICAgc3RhcnRfeCA9IChtYl94IDw8IG1pX2N0eC0+bG9nMl9tYl9zaXplKSAtIG1pX2N0eC0+bWJfc2l6ZSAvIDIgKyBtdl94ICogYSAvIEFMUEhBX01BWDsKKyAgICAgICAgICAgICAgICBzdGFydF95ID0gKG1iX3kgPDwgbWlfY3R4LT5sb2cyX21iX3NpemUpIC0gbWlfY3R4LT5tYl9zaXplIC8gMiArIG12X3kgKiBhIC8gQUxQSEFfTUFYOworCisgICAgICAgICAgICAgICAgc3RhcnRjX3ggPSBhdl9jbGlwKHN0YXJ0X3gsIDAsIHdpZHRoIC0gMSk7CisgICAgICAgICAgICAgICAgc3RhcnRjX3kgPSBhdl9jbGlwKHN0YXJ0X3ksIDAsIGhlaWdodCAtIDEpOworICAgICAgICAgICAgICAgIGVuZGNfeCA9IGF2X2NsaXAoc3RhcnRfeCArICgyIDw8IG1pX2N0eC0+bG9nMl9tYl9zaXplKSwgMCwgd2lkdGggLSAxKTsKKyAgICAgICAgICAgICAgICBlbmRjX3kgPSBhdl9jbGlwKHN0YXJ0X3kgKyAoMiA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZSksIDAsIGhlaWdodCAtIDEpOworCisgICAgICAgICAgICAgICAgaWYgKGRpcikgeworICAgICAgICAgICAgICAgICAgICBtdl94ID0gLW12X3g7CisgICAgICAgICAgICAgICAgICAgIG12X3kgPSAtbXZfeTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSBzdGFydGNfeTsgeSA8IGVuZGNfeTsgeSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB5X21pbiA9IC15OworICAgICAgICAgICAgICAgICAgICBpbnQgeV9tYXggPSBoZWlnaHQgLSB5IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gc3RhcnRjX3g7IHggPCBlbmRjX3g7IHgrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfbWluID0gLXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9tYXggPSB3aWR0aCAtIHggLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9ibWNfd2VpZ2h0ID0gb2JtY190YWJfbGluZWFyWzQgLSBtaV9jdHgtPmxvZzJfbWJfc2l6ZV1bKHggLSBzdGFydF94KSArICgoeSAtIHN0YXJ0X3kpIDw8IChtaV9jdHgtPmxvZzJfbWJfc2l6ZSArIDEpKV07CisgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbE1WUyAqcGl4ZWxfbXZzID0gJm1pX2N0eC0+cGl4ZWxfbXZzW3ggKyB5ICogd2lkdGhdOworICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHRzICpwaXhlbF93ZWlnaHRzID0gJm1pX2N0eC0+cGl4ZWxfd2VpZ2h0c1t4ICsgeSAqIHdpZHRoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsUmVmcyAqcGl4ZWxfcmVmcyA9ICZtaV9jdHgtPnBpeGVsX3JlZnNbeCArIHkgKiB3aWR0aF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFERF9QSVhFTFMob2JtY193ZWlnaHQsIG12X3gsIG12X3kpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfZnJhbWVfZGF0YShNSUNvbnRleHQgKm1pX2N0eCwgaW50IGFscGhhLCBBVkZyYW1lICphdmZfb3V0KQoreworICAgIGludCB4LCB5LCBwbGFuZTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IG1pX2N0eC0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIGludCB3aWR0aCA9IGF2Zl9vdXQtPndpZHRoOworICAgICAgICBpbnQgaGVpZ2h0ID0gYXZmX291dC0+aGVpZ2h0OworICAgICAgICBpbnQgY2hyb21hID0gcGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaW50IHhfbXYsIHlfbXY7CisgICAgICAgICAgICAgICAgaW50IHdlaWdodF9zdW0gPSAwOworICAgICAgICAgICAgICAgIGludCBpLCB2YWwgPSAwOworICAgICAgICAgICAgICAgIFBpeGVsTVZTICpwaXhlbF9tdnMgPSAmbWlfY3R4LT5waXhlbF9tdnNbeCArIHkgKiBhdmZfb3V0LT53aWR0aF07CisgICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHRzICpwaXhlbF93ZWlnaHRzID0gJm1pX2N0eC0+cGl4ZWxfd2VpZ2h0c1t4ICsgeSAqIGF2Zl9vdXQtPndpZHRoXTsKKyAgICAgICAgICAgICAgICBQaXhlbFJlZnMgKnBpeGVsX3JlZnMgPSAmbWlfY3R4LT5waXhlbF9yZWZzW3ggKyB5ICogYXZmX291dC0+d2lkdGhdOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBpeGVsX3JlZnMtPm5iOyBpKyspCisgICAgICAgICAgICAgICAgICAgIHdlaWdodF9zdW0gKz0gcGl4ZWxfd2VpZ2h0cy0+d2VpZ2h0c1tpXTsKKworICAgICAgICAgICAgICAgIGlmICghd2VpZ2h0X3N1bSB8fCAhcGl4ZWxfcmVmcy0+bmIpIHsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy0+d2VpZ2h0c1swXSA9IEFMUEhBX01BWCAtIGFscGhhOworICAgICAgICAgICAgICAgICAgICBwaXhlbF9yZWZzLT5yZWZzWzBdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfbXZzLT5tdnNbMF1bMF0gPSAwOworICAgICAgICAgICAgICAgICAgICBwaXhlbF9tdnMtPm12c1swXVsxXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMtPndlaWdodHNbMV0gPSBhbHBoYTsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfcmVmcy0+cmVmc1sxXSA9IDI7CisgICAgICAgICAgICAgICAgICAgIHBpeGVsX212cy0+bXZzWzFdWzBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcGl4ZWxfbXZzLT5tdnNbMV1bMV0gPSAwOworICAgICAgICAgICAgICAgICAgICBwaXhlbF9yZWZzLT5uYiA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgd2VpZ2h0X3N1bSA9IEFMUEhBX01BWDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGl4ZWxfcmVmcy0+bmI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBGcmFtZSAqZnJhbWUgPSAmbWlfY3R4LT5mcmFtZXNbcGl4ZWxfcmVmcy0+cmVmc1tpXV07CisgICAgICAgICAgICAgICAgICAgIGlmIChjaHJvbWEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhfbXYgPSAoeCA+PiBtaV9jdHgtPmxvZzJfY2hyb21hX3cpICsgcGl4ZWxfbXZzLT5tdnNbaV1bMF0gLyAoMSA8PCBtaV9jdHgtPmxvZzJfY2hyb21hX3cpOworICAgICAgICAgICAgICAgICAgICAgICAgeV9tdiA9ICh5ID4+IG1pX2N0eC0+bG9nMl9jaHJvbWFfaCkgKyBwaXhlbF9tdnMtPm12c1tpXVsxXSAvICgxIDw8IG1pX2N0eC0+bG9nMl9jaHJvbWFfaCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4X212ID0geCArIHBpeGVsX212cy0+bXZzW2ldWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgeV9tdiA9IHkgKyBwaXhlbF9tdnMtPm12c1tpXVsxXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHZhbCArPSBwaXhlbF93ZWlnaHRzLT53ZWlnaHRzW2ldICogZnJhbWUtPmF2Zi0+ZGF0YVtwbGFuZV1beF9tdiArIHlfbXYgKiBmcmFtZS0+YXZmLT5saW5lc2l6ZVtwbGFuZV1dOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhbCA9IFJPVU5ERURfRElWKHZhbCwgd2VpZ2h0X3N1bSk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2hyb21hKQorICAgICAgICAgICAgICAgICAgICBhdmZfb3V0LT5kYXRhW3BsYW5lXVsoeCA+PiBtaV9jdHgtPmxvZzJfY2hyb21hX3cpICsgKHkgPj4gbWlfY3R4LT5sb2cyX2Nocm9tYV9oKSAqIGF2Zl9vdXQtPmxpbmVzaXplW3BsYW5lXV0gPSB2YWw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBhdmZfb3V0LT5kYXRhW3BsYW5lXVt4ICsgeSAqIGF2Zl9vdXQtPmxpbmVzaXplW3BsYW5lXV0gPSB2YWw7CisgICAgICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB2YXJfc2l6ZV9ibWMoTUlDb250ZXh0ICptaV9jdHgsIEJsb2NrICpibG9jaywgaW50IHhfbWIsIGludCB5X21iLCBpbnQgbiwgaW50IGFscGhhKQoreworICAgIGludCBzYl94LCBzYl95OworICAgIGludCB3aWR0aCA9IG1pX2N0eC0+ZnJhbWVzWzBdLmF2Zi0+d2lkdGg7CisgICAgaW50IGhlaWdodCA9IG1pX2N0eC0+ZnJhbWVzWzBdLmF2Zi0+aGVpZ2h0OworCisgICAgZm9yIChzYl95ID0gMDsgc2JfeSA8IDI7IHNiX3krKykKKyAgICAgICAgZm9yIChzYl94ID0gMDsgc2JfeCA8IDI7IHNiX3grKykgeworICAgICAgICAgICAgQmxvY2sgKnNiID0gJmJsb2NrLT5zdWJzW3NiX3ggKyBzYl95ICogMl07CisKKyAgICAgICAgICAgIGlmIChzYi0+c2IpCisgICAgICAgICAgICAgICAgdmFyX3NpemVfYm1jKG1pX2N0eCwgc2IsIHhfbWIgKyAoc2JfeCA8PCAobiAtIDEpKSwgeV9tYiArIChzYl95IDw8IChuIC0gMSkpLCBuIC0gMSwgYWxwaGEpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHgsIHk7CisgICAgICAgICAgICAgICAgaW50IG12X3ggPSBzYi0+bXZzWzBdWzBdICogMjsKKyAgICAgICAgICAgICAgICBpbnQgbXZfeSA9IHNiLT5tdnNbMF1bMV0gKiAyOworCisgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ggPSB4X21iICsgKHNiX3ggPDwgKG4gLSAxKSk7CisgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3kgPSB5X21iICsgKHNiX3kgPDwgKG4gLSAxKSk7CisgICAgICAgICAgICAgICAgaW50IGVuZF94ID0gc3RhcnRfeCArICgxIDw8IChuIC0gMSkpOworICAgICAgICAgICAgICAgIGludCBlbmRfeSA9IHN0YXJ0X3kgKyAoMSA8PCAobiAtIDEpKTsKKworICAgICAgICAgICAgICAgIGZvciAoeSA9IHN0YXJ0X3k7IHkgPCBlbmRfeTsgeSsrKSAgeworICAgICAgICAgICAgICAgICAgICBpbnQgeV9taW4gPSAteTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHlfbWF4ID0gaGVpZ2h0IC0geSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoeCA9IHN0YXJ0X3g7IHggPCBlbmRfeDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9taW4gPSAteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X21heCA9IHdpZHRoIC0geCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBQaXhlbE1WUyAqcGl4ZWxfbXZzID0gJm1pX2N0eC0+cGl4ZWxfbXZzW3ggKyB5ICogd2lkdGhdOworICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxXZWlnaHRzICpwaXhlbF93ZWlnaHRzID0gJm1pX2N0eC0+cGl4ZWxfd2VpZ2h0c1t4ICsgeSAqIHdpZHRoXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsUmVmcyAqcGl4ZWxfcmVmcyA9ICZtaV9jdHgtPnBpeGVsX3JlZnNbeCArIHkgKiB3aWR0aF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFERF9QSVhFTFMoUFhfV0VJR0hUX01BWCwgbXZfeCwgbXZfeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30KKworc3RhdGljIHZvaWQgYmlsYXRlcmFsX29ibWMoTUlDb250ZXh0ICptaV9jdHgsIEJsb2NrICpibG9jaywgaW50IG1iX3gsIGludCBtYl95LCBpbnQgYWxwaGEpCit7CisgICAgaW50IHgsIHk7CisgICAgaW50IHdpZHRoID0gbWlfY3R4LT5mcmFtZXNbMF0uYXZmLT53aWR0aDsKKyAgICBpbnQgaGVpZ2h0ID0gbWlfY3R4LT5mcmFtZXNbMF0uYXZmLT5oZWlnaHQ7CisKKyAgICBCbG9jayAqbmI7CisgICAgaW50IG5iX3gsIG5iX3k7CisgICAgdWludDY0X3Qgc2JhZHNbOV07CisKKyAgICBpbnQgbXZfeCA9IGJsb2NrLT5tdnNbMF1bMF0gKiAyOworICAgIGludCBtdl95ID0gYmxvY2stPm12c1swXVsxXSAqIDI7CisgICAgaW50IHN0YXJ0X3gsIHN0YXJ0X3k7CisgICAgaW50IHN0YXJ0Y194LCBzdGFydGNfeSwgZW5kY194LCBlbmRjX3k7CisKKyAgICBpZiAobWlfY3R4LT5tY19tb2RlID09IE1DX01PREVfQU9CTUMpCisgICAgICAgIGZvciAobmJfeSA9IEZGTUFYKDAsIG1iX3kgLSAxKTsgbmJfeSA8IEZGTUlOKG1iX3kgKyAyLCBtaV9jdHgtPmJfaGVpZ2h0KTsgbmJfeSsrKQorICAgICAgICAgICAgZm9yIChuYl94ID0gRkZNQVgoMCwgbWJfeCAtIDEpOyBuYl94IDwgRkZNSU4obWJfeCArIDIsIG1pX2N0eC0+Yl93aWR0aCk7IG5iX3grKykgeworICAgICAgICAgICAgICAgIGludCB4X25iID0gbmJfeCA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZTsKKyAgICAgICAgICAgICAgICBpbnQgeV9uYiA9IG5iX3kgPDwgbWlfY3R4LT5sb2cyX21iX3NpemU7CisKKyAgICAgICAgICAgICAgICBpZiAobmJfeCAtIG1iX3ggfHwgbmJfeSAtIG1iX3kpCisgICAgICAgICAgICAgICAgICAgIHNiYWRzW25iX3ggLSBtYl94ICsgMSArIChuYl95IC0gbWJfeSArIDEpICogM10gPSBnZXRfc2JhZCgmbWlfY3R4LT5tZV9jdHgsIHhfbmIsIHlfbmIsIHhfbmIgKyBibG9jay0+bXZzWzBdWzBdLCB5X25iICsgYmxvY2stPm12c1swXVsxXSk7CisgICAgICAgICAgICB9CisKKyAgICBzdGFydF94ID0gKG1iX3ggPDwgbWlfY3R4LT5sb2cyX21iX3NpemUpIC0gbWlfY3R4LT5tYl9zaXplIC8gMjsKKyAgICBzdGFydF95ID0gKG1iX3kgPDwgbWlfY3R4LT5sb2cyX21iX3NpemUpIC0gbWlfY3R4LT5tYl9zaXplIC8gMjsKKworICAgIHN0YXJ0Y194ID0gYXZfY2xpcChzdGFydF94LCAwLCB3aWR0aCAtIDEpOworICAgIHN0YXJ0Y195ID0gYXZfY2xpcChzdGFydF95LCAwLCBoZWlnaHQgLSAxKTsKKyAgICBlbmRjX3ggPSBhdl9jbGlwKHN0YXJ0X3ggKyAoMiA8PCBtaV9jdHgtPmxvZzJfbWJfc2l6ZSksIDAsIHdpZHRoIC0gMSk7CisgICAgZW5kY195ID0gYXZfY2xpcChzdGFydF95ICsgKDIgPDwgbWlfY3R4LT5sb2cyX21iX3NpemUpLCAwLCBoZWlnaHQgLSAxKTsKKworICAgIGZvciAoeSA9IHN0YXJ0Y195OyB5IDwgZW5kY195OyB5KyspIHsKKyAgICAgICAgaW50IHlfbWluID0gLXk7CisgICAgICAgIGludCB5X21heCA9IGhlaWdodCAtIHkgLSAxOworICAgICAgICBmb3IgKHggPSBzdGFydGNfeDsgeCA8IGVuZGNfeDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgeF9taW4gPSAteDsKKyAgICAgICAgICAgIGludCB4X21heCA9IHdpZHRoIC0geCAtIDE7CisgICAgICAgICAgICBpbnQgb2JtY193ZWlnaHQgPSBvYm1jX3RhYl9saW5lYXJbNCAtIG1pX2N0eC0+bG9nMl9tYl9zaXplXVsoeCAtIHN0YXJ0X3gpICsgKCh5IC0gc3RhcnRfeSkgPDwgKG1pX2N0eC0+bG9nMl9tYl9zaXplICsgMSkpXTsKKyAgICAgICAgICAgIFBpeGVsTVZTICpwaXhlbF9tdnMgPSAmbWlfY3R4LT5waXhlbF9tdnNbeCArIHkgKiB3aWR0aF07CisgICAgICAgICAgICBQaXhlbFdlaWdodHMgKnBpeGVsX3dlaWdodHMgPSAmbWlfY3R4LT5waXhlbF93ZWlnaHRzW3ggKyB5ICogd2lkdGhdOworICAgICAgICAgICAgUGl4ZWxSZWZzICpwaXhlbF9yZWZzID0gJm1pX2N0eC0+cGl4ZWxfcmVmc1t4ICsgeSAqIHdpZHRoXTsKKworICAgICAgICAgICAgaWYgKG1pX2N0eC0+bWNfbW9kZSA9PSBNQ19NT0RFX0FPQk1DKSB7CisgICAgICAgICAgICAgICAgbmJfeCA9ICgoKHggLSBzdGFydF94KSA+PiAobWlfY3R4LT5sb2cyX21iX3NpemUgLSAxKSkgKiAyIC0gMykgLyAyOworICAgICAgICAgICAgICAgIG5iX3kgPSAoKCh5IC0gc3RhcnRfeSkgPj4gKG1pX2N0eC0+bG9nMl9tYl9zaXplIC0gMSkpICogMiAtIDMpIC8gMjsKKworICAgICAgICAgICAgICAgIGlmIChuYl94IHx8IG5iX3kpIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2JhZCA9IHNiYWRzW25iX3ggKyAxICsgKG5iX3kgKyAxKSAqIDNdOworICAgICAgICAgICAgICAgICAgICBuYiA9ICZtaV9jdHgtPmludF9ibG9ja3NbbWJfeCArIG5iX3ggKyAobWJfeSArIG5iX3kpICogbWlfY3R4LT5iX3dpZHRoXTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc2JhZCAmJiBzYmFkICE9IFVJTlQ2NF9NQVggJiYgbmItPnNiYWQgIT0gVUlOVDY0X01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBoaSA9IGF2X2NsaXAoQUxQSEFfTUFYICogbmItPnNiYWQgLyBzYmFkLCAwLCBBTFBIQV9NQVgpOworICAgICAgICAgICAgICAgICAgICAgICAgb2JtY193ZWlnaHQgPSBvYm1jX3dlaWdodCAqIHBoaSAvIEFMUEhBX01BWDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQUREX1BJWEVMUyhvYm1jX3dlaWdodCwgbXZfeCwgbXZfeSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGludGVycG9sYXRlKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICphdmZfb3V0KQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIE1JQ29udGV4dCAqbWlfY3R4ID0gY3R4LT5wcml2OworICAgIGludCB4LCB5OworICAgIGludCBwbGFuZSwgYWxwaGE7CisgICAgaW50NjRfdCBwdHM7CisKKyAgICBwdHMgPSBhdl9yZXNjYWxlKGF2Zl9vdXQtPnB0cywgKGludDY0X3QpIEFMUEhBX01BWCAqIG91dGxpbmstPnRpbWVfYmFzZS5udW0gKiBpbmxpbmstPnRpbWVfYmFzZS5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KSAgICAgICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UuZGVuICogaW5saW5rLT50aW1lX2Jhc2UubnVtKTsKKworICAgIGFscGhhID0gKHB0cyAtIG1pX2N0eC0+ZnJhbWVzWzFdLmF2Zi0+cHRzICogQUxQSEFfTUFYKSAvIChtaV9jdHgtPmZyYW1lc1syXS5hdmYtPnB0cyAtIG1pX2N0eC0+ZnJhbWVzWzFdLmF2Zi0+cHRzKTsKKyAgICBhbHBoYSA9IGF2X2NsaXAoYWxwaGEsIDAsIEFMUEhBX01BWCk7CisKKyAgICBpZiAoYWxwaGEgPT0gMCB8fCBhbHBoYSA9PSBBTFBIQV9NQVgpIHsKKyAgICAgICAgYXZfZnJhbWVfY29weShhdmZfb3V0LCBhbHBoYSA/IG1pX2N0eC0+ZnJhbWVzWzJdLmF2ZiA6IG1pX2N0eC0+ZnJhbWVzWzFdLmF2Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobWlfY3R4LT5zY2VuZV9jaGFuZ2VkKSB7CisgICAgICAgIC8qIGR1cGxpY2F0ZSBmcmFtZSAqLworICAgICAgICBhdl9mcmFtZV9jb3B5KGF2Zl9vdXQsIGFscGhhID4gQUxQSEFfTUFYIC8gMiA/IG1pX2N0eC0+ZnJhbWVzWzJdLmF2ZiA6IG1pX2N0eC0+ZnJhbWVzWzFdLmF2Zik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2gobWlfY3R4LT5taV9tb2RlKSB7CisgICAgICAgIGNhc2UgTUlfTU9ERV9EVVA6CisgICAgICAgICAgICBhdl9mcmFtZV9jb3B5KGF2Zl9vdXQsIGFscGhhID4gQUxQSEFfTUFYIC8gMiA/IG1pX2N0eC0+ZnJhbWVzWzJdLmF2ZiA6IG1pX2N0eC0+ZnJhbWVzWzFdLmF2Zik7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1JX01PREVfQkxFTkQ6CisgICAgICAgICAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBtaV9jdHgtPm5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICAgICAgICAgIGludCB3aWR0aCA9IGF2Zl9vdXQtPndpZHRoOworICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBhdmZfb3V0LT5oZWlnaHQ7CisKKyAgICAgICAgICAgICAgICBpZiAocGxhbmUgPT0gMSB8fCBwbGFuZSA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gQVZfQ0VJTF9SU0hJRlQod2lkdGgsIG1pX2N0eC0+bG9nMl9jaHJvbWFfdyk7CisgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IEFWX0NFSUxfUlNISUZUKGhlaWdodCwgbWlfY3R4LT5sb2cyX2Nocm9tYV9oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Zl9vdXQtPmRhdGFbcGxhbmVdW3ggKyB5ICogYXZmX291dC0+bGluZXNpemVbcGxhbmVdXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSAgKiBtaV9jdHgtPmZyYW1lc1syXS5hdmYtPmRhdGFbcGxhbmVdW3ggKyB5ICogbWlfY3R4LT5mcmFtZXNbMl0uYXZmLT5saW5lc2l6ZVtwbGFuZV1dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFMUEhBX01BWCAtIGFscGhhKSAqIG1pX2N0eC0+ZnJhbWVzWzFdLmF2Zi0+ZGF0YVtwbGFuZV1beCArIHkgKiBtaV9jdHgtPmZyYW1lc1sxXS5hdmYtPmxpbmVzaXplW3BsYW5lXV0gKyA1MTIpID4+IDEwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNSV9NT0RFX01DSToKKyAgICAgICAgICAgIGlmIChtaV9jdHgtPm1lX21vZGUgPT0gTUVfTU9ERV9CSURJUikgeworICAgICAgICAgICAgICAgIGJpZGlyZWN0aW9uYWxfb2JtYyhtaV9jdHgsIGFscGhhKTsKKyAgICAgICAgICAgICAgICBzZXRfZnJhbWVfZGF0YShtaV9jdHgsIGFscGhhLCBhdmZfb3V0KTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChtaV9jdHgtPm1lX21vZGUgPT0gTUVfTU9ERV9CSUxBVCkgeworICAgICAgICAgICAgICAgIGludCBtYl94LCBtYl95OworICAgICAgICAgICAgICAgIEJsb2NrICpibG9jazsKKworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBtaV9jdHgtPmZyYW1lc1swXS5hdmYtPmhlaWdodDsgeSsrKQorICAgICAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgbWlfY3R4LT5mcmFtZXNbMF0uYXZmLT53aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgbWlfY3R4LT5waXhlbF9yZWZzW3ggKyB5ICogbWlfY3R4LT5mcmFtZXNbMF0uYXZmLT53aWR0aF0ubmIgPSAwOworCisgICAgICAgICAgICAgICAgZm9yIChtYl95ID0gMDsgbWJfeSA8IG1pX2N0eC0+Yl9oZWlnaHQ7IG1iX3krKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChtYl94ID0gMDsgbWJfeCA8IG1pX2N0eC0+Yl93aWR0aDsgbWJfeCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBibG9jayA9ICZtaV9jdHgtPmludF9ibG9ja3NbbWJfeCArIG1iX3kgKiBtaV9jdHgtPmJfd2lkdGhdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmxvY2stPnNiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9zaXplX2JtYyhtaV9jdHgsIGJsb2NrLCBtYl94IDw8IG1pX2N0eC0+bG9nMl9tYl9zaXplLCBtYl95IDw8IG1pX2N0eC0+bG9nMl9tYl9zaXplLCBtaV9jdHgtPmxvZzJfbWJfc2l6ZSwgYWxwaGEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBiaWxhdGVyYWxfb2JtYyhtaV9jdHgsIGJsb2NrLCBtYl94LCBtYl95LCBhbHBoYSk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2V0X2ZyYW1lX2RhdGEobWlfY3R4LCBhbHBoYSwgYXZmX291dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmF2Zl9pbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBNSUNvbnRleHQgKm1pX2N0eCA9IGN0eC0+cHJpdjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGF2Zl9pbi0+cHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIGF2Zl9pbik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKCFtaV9jdHgtPmZyYW1lc1tOQl9GUkFNRVMgLSAxXS5hdmYgfHwgYXZmX2luLT5wdHMgPCBtaV9jdHgtPmZyYW1lc1tOQl9GUkFNRVMgLSAxXS5hdmYtPnB0cykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkluaXRpYWxpemluZyBvdXQgcHRzIGZyb20gaW5wdXQgcHRzICUiUFJJZDY0IlxuIiwgYXZmX2luLT5wdHMpOworICAgICAgICBtaV9jdHgtPm91dF9wdHMgPSBhdl9yZXNjYWxlX3EoYXZmX2luLT5wdHMsIGlubGluay0+dGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworICAgIH0KKworICAgIGlmICghbWlfY3R4LT5mcmFtZXNbTkJfRlJBTUVTIC0gMV0uYXZmKQorICAgICAgICBpZiAocmV0ID0gaW5qZWN0X2ZyYW1lKGlubGluaywgYXZfZnJhbWVfY2xvbmUoYXZmX2luKSkpCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHJldCA9IGluamVjdF9mcmFtZShpbmxpbmssIGF2Zl9pbikpCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIW1pX2N0eC0+ZnJhbWVzWzBdLmF2ZikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBtaV9jdHgtPnNjZW5lX2NoYW5nZWQgPSBkZXRlY3Rfc2NlbmVfY2hhbmdlKG1pX2N0eCk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIEFWRnJhbWUgKmF2Zl9vdXQ7CisKKyAgICAgICAgaWYgKGF2X2NvbXBhcmVfdHMobWlfY3R4LT5vdXRfcHRzLCBvdXRsaW5rLT50aW1lX2Jhc2UsIG1pX2N0eC0+ZnJhbWVzWzJdLmF2Zi0+cHRzLCBpbmxpbmstPnRpbWVfYmFzZSkgPiAwKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKCEoYXZmX291dCA9IGZmX2dldF92aWRlb19idWZmZXIoY3R4LT5vdXRwdXRzWzBdLCBpbmxpbmstPncsIGlubGluay0+aCkpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKGF2Zl9vdXQsIG1pX2N0eC0+ZnJhbWVzW05CX0ZSQU1FUyAtIDFdLmF2Zik7CisgICAgICAgIGF2Zl9vdXQtPnB0cyA9IG1pX2N0eC0+b3V0X3B0cysrOworCisgICAgICAgIGludGVycG9sYXRlKGlubGluaywgYXZmX291dCk7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBhdmZfb3V0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCBmcmVlX2Jsb2NrcyhCbG9jayAqYmxvY2ssIGludCBzYikKK3sKKyAgICBpZiAoYmxvY2stPnN1YnMpCisgICAgICAgIGZyZWVfYmxvY2tzKGJsb2NrLT5zdWJzLCAxKTsKKyAgICBpZiAoc2IpCisgICAgICAgIGF2X2ZyZWVwKCZibG9jayk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE1JQ29udGV4dCAqbWlfY3R4ID0gY3R4LT5wcml2OworICAgIGludCBpLCBtOworCisgICAgYXZfZnJlZXAoJm1pX2N0eC0+cGl4ZWxfbXZzKTsKKyAgICBhdl9mcmVlcCgmbWlfY3R4LT5waXhlbF93ZWlnaHRzKTsKKyAgICBhdl9mcmVlcCgmbWlfY3R4LT5waXhlbF9yZWZzKTsKKyAgICBpZiAobWlfY3R4LT5pbnRfYmxvY2tzKQorICAgICAgICBmb3IgKG0gPSAwOyBtIDwgbWlfY3R4LT5iX2NvdW50OyBtKyspCisgICAgICAgICAgICBmcmVlX2Jsb2NrcygmbWlfY3R4LT5pbnRfYmxvY2tzW21dLCAwKTsKKyAgICBhdl9mcmVlcCgmbWlfY3R4LT5pbnRfYmxvY2tzKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOQl9GUkFNRVM7IGkrKykgeworICAgICAgICBGcmFtZSAqZnJhbWUgPSAmbWlfY3R4LT5mcmFtZXNbaV07CisgICAgICAgIGF2X2ZyZWVwKCZmcmFtZS0+YmxvY2tzKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUtPmF2Zik7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJm1pX2N0eC0+bXZfdGFibGVbaV0pOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbWludGVycG9sYXRlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lICA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG1pbnRlcnBvbGF0ZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9taW50ZXJwb2xhdGUgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAibWludGVycG9sYXRlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGcmFtZSByYXRlIGNvbnZlcnNpb24gdXNpbmcgTW90aW9uIEludGVycG9sYXRpb24uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTUlDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZtaW50ZXJwb2xhdGVfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gbWludGVycG9sYXRlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IG1pbnRlcnBvbGF0ZV9vdXRwdXRzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX21pc2NfdmFhcGkuYyBiL2xpYmF2ZmlsdGVyL3ZmX21pc2NfdmFhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGI4MDhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfbWlzY192YWFwaS5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZhYXBpX3ZwcC5oIgorCisvLyBEZW5vaXNlIG1pbi9tYXgvZGVmYXVsdCBWYWx1ZXMKKyNkZWZpbmUgREVOT0lTRV9NSU4gICAgICAgICAgICAwCisjZGVmaW5lIERFTk9JU0VfTUFYICAgICAgICAgICAgNjQKKyNkZWZpbmUgREVOT0lTRV9ERUZBVUxUICAgICAgICAwCisKKy8vIFNoYXJwbmVzcyBtaW4vbWF4L2RlZmF1bHQgdmFsdWVzCisjZGVmaW5lIFNIQVJQTkVTU19NSU4gICAgICAgICAgMAorI2RlZmluZSBTSEFSUE5FU1NfTUFYICAgICAgICAgIDY0CisjZGVmaW5lIFNIQVJQTkVTU19ERUZBVUxUICAgICAgNDQKKwordHlwZWRlZiBzdHJ1Y3QgRGVub2lzZVZBQVBJQ29udGV4dCB7CisgICAgVkFBUElWUFBDb250ZXh0IHZwcF9jdHg7IC8vIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkCisKKyAgICBpbnQgZGVub2lzZTsgICAgICAgICAvLyBlbmFibGUgZGVub2lzZSBhbGdvLgorfSBEZW5vaXNlVkFBUElDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBTaGFycG5lc3NWQUFQSUNvbnRleHQgeworICAgIFZBQVBJVlBQQ29udGV4dCB2cHBfY3R4OyAvLyBtdXN0IGJlIHRoZSBmaXJzdCBmaWVsZAorCisgICAgaW50IHNoYXJwbmVzczsgICAgICAgLy8gZW5hYmxlIHNoYXJwbmVzcy4KK30gU2hhcnBuZXNzVkFBUElDb250ZXh0OworCitzdGF0aWMgZmxvYXQgbWFwKGludCB4LCBpbnQgaW5fbWluLCBpbnQgaW5fbWF4LCBmbG9hdCBvdXRfbWluLCBmbG9hdCBvdXRfbWF4KQoreworICAgIGRvdWJsZSBzbG9wZSwgb3V0cHV0OworCisgICAgc2xvcGUgPSAxLjAgKiAob3V0X21heCAtIG91dF9taW4pIC8gKGluX21heCAtIGluX21pbik7CisgICAgb3V0cHV0ID0gb3V0X21pbiArIHNsb3BlICogKHggLSBpbl9taW4pOworCisgICAgcmV0dXJuIChmbG9hdClvdXRwdXQ7Cit9CisKK3N0YXRpYyBpbnQgZGVub2lzZV92YWFwaV9idWlsZF9maWx0ZXJfcGFyYW1zKEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElWUFBDb250ZXh0ICp2cHBfY3R4ID0gYXZjdHgtPnByaXY7CisgICAgRGVub2lzZVZBQVBJQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBWQVByb2NGaWx0ZXJDYXAgY2FwczsKKworICAgIFZBU3RhdHVzIHZhczsKKyAgICB1aW50MzJfdCBudW1fY2FwcyA9IDE7CisKKyAgICBWQVByb2NGaWx0ZXJQYXJhbWV0ZXJCdWZmZXIgZGVub2lzZTsKKworICAgIHZhcyA9IHZhUXVlcnlWaWRlb1Byb2NGaWx0ZXJDYXBzKHZwcF9jdHgtPmh3Y3R4LT5kaXNwbGF5LCB2cHBfY3R4LT52YV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUHJvY0ZpbHRlck5vaXNlUmVkdWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYXBzLCAmbnVtX2NhcHMpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgZGVub2lzZSBjYXBzICIKKyAgICAgICAgICAgICAgICJjb250ZXh0OiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGRlbm9pc2UudHlwZSAgPSBWQVByb2NGaWx0ZXJOb2lzZVJlZHVjdGlvbjsKKyAgICBkZW5vaXNlLnZhbHVlID0gIG1hcChjdHgtPmRlbm9pc2UsIERFTk9JU0VfTUlOLCBERU5PSVNFX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLnJhbmdlLm1pbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLnJhbmdlLm1heF92YWx1ZSk7CisgICAgZmZfdmFhcGlfdnBwX21ha2VfcGFyYW1fYnVmZmVycyhhdmN0eCwgVkFQcm9jRmlsdGVyUGFyYW1ldGVyQnVmZmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZW5vaXNlLCBzaXplb2YoZGVub2lzZSksIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hhcnBuZXNzX3ZhYXBpX2J1aWxkX2ZpbHRlcl9wYXJhbXMoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQUFQSVZQUENvbnRleHQgKnZwcF9jdHggICA9IGF2Y3R4LT5wcml2OworICAgIFNoYXJwbmVzc1ZBQVBJQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBWQVByb2NGaWx0ZXJDYXAgY2FwczsKKworICAgIFZBU3RhdHVzIHZhczsKKyAgICB1aW50MzJfdCBudW1fY2FwcyA9IDE7CisKKyAgICBWQVByb2NGaWx0ZXJQYXJhbWV0ZXJCdWZmZXIgc2hhcnBuZXNzOworCisgICAgdmFzID0gdmFRdWVyeVZpZGVvUHJvY0ZpbHRlckNhcHModnBwX2N0eC0+aHdjdHgtPmRpc3BsYXksIHZwcF9jdHgtPnZhX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFQcm9jRmlsdGVyU2hhcnBlbmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FwcywgJm51bV9jYXBzKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IHNoYXJwbmVzcyBjYXBzICIKKyAgICAgICAgICAgICAgICJjb250ZXh0OiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIHNoYXJwbmVzcy50eXBlICA9IFZBUHJvY0ZpbHRlclNoYXJwZW5pbmc7CisgICAgc2hhcnBuZXNzLnZhbHVlID0gbWFwKGN0eC0+c2hhcnBuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTSEFSUE5FU1NfTUlOLCBTSEFSUE5FU1NfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLnJhbmdlLm1pbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy5yYW5nZS5tYXhfdmFsdWUpOworICAgIGZmX3ZhYXBpX3ZwcF9tYWtlX3BhcmFtX2J1ZmZlcnMoYXZjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVByb2NGaWx0ZXJQYXJhbWV0ZXJCdWZmZXJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNoYXJwbmVzcywgc2l6ZW9mKHNoYXJwbmVzcyksIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWlzY192YWFwaV9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucHV0X2ZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqYXZjdHggICA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayAgICA9IGF2Y3R4LT5vdXRwdXRzWzBdOworICAgIFZBQVBJVlBQQ29udGV4dCAqdnBwX2N0eCA9IGF2Y3R4LT5wcml2OworICAgIEFWRnJhbWUgKm91dHB1dF9mcmFtZSAgICA9IE5VTEw7CisgICAgVkFTdXJmYWNlSUQgaW5wdXRfc3VyZmFjZSwgb3V0cHV0X3N1cmZhY2U7CisgICAgVkFSZWN0YW5nbGUgaW5wdXRfcmVnaW9uOworCisgICAgVkFQcm9jUGlwZWxpbmVQYXJhbWV0ZXJCdWZmZXIgcGFyYW1zOworICAgIGludCBlcnI7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkZpbHRlciBpbnB1dDogJXMsICV1eCV1ICglIlBSSWQ2NCIpLlxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbnB1dF9mcmFtZS0+Zm9ybWF0KSwKKyAgICAgICAgICAgaW5wdXRfZnJhbWUtPndpZHRoLCBpbnB1dF9mcmFtZS0+aGVpZ2h0LCBpbnB1dF9mcmFtZS0+cHRzKTsKKworICAgIGlmICh2cHBfY3R4LT52YV9jb250ZXh0ID09IFZBX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpbnB1dF9zdXJmYWNlID0gKFZBU3VyZmFjZUlEKSh1aW50cHRyX3QpaW5wdXRfZnJhbWUtPmRhdGFbM107CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyBzdXJmYWNlICUjeCBmb3IgbWlzYyB2cHAgaW5wdXQuXG4iLAorICAgICAgICAgICBpbnB1dF9zdXJmYWNlKTsKKworICAgIG91dHB1dF9mcmFtZSA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgdnBwX2N0eC0+b3V0cHV0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnBwX2N0eC0+b3V0cHV0X2hlaWdodCk7CisgICAgaWYgKCFvdXRwdXRfZnJhbWUpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb3V0cHV0X3N1cmZhY2UgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClvdXRwdXRfZnJhbWUtPmRhdGFbM107CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyBzdXJmYWNlICUjeCBmb3IgbWlzYyB2cHAgb3V0cHV0LlxuIiwKKyAgICAgICAgICAgb3V0cHV0X3N1cmZhY2UpOworICAgIG1lbXNldCgmcGFyYW1zLCAwLCBzaXplb2YocGFyYW1zKSk7CisgICAgaW5wdXRfcmVnaW9uID0gKFZBUmVjdGFuZ2xlKSB7CisgICAgICAgIC54ICAgICAgPSAwLAorICAgICAgICAueSAgICAgID0gMCwKKyAgICAgICAgLndpZHRoICA9IGlucHV0X2ZyYW1lLT53aWR0aCwKKyAgICAgICAgLmhlaWdodCA9IGlucHV0X2ZyYW1lLT5oZWlnaHQsCisgICAgfTsKKworICAgIGlmICh2cHBfY3R4LT5uYl9maWx0ZXJfYnVmZmVycykgeworICAgICAgICBwYXJhbXMuZmlsdGVycyAgICAgPSAmdnBwX2N0eC0+ZmlsdGVyX2J1ZmZlcnNbMF07CisgICAgICAgIHBhcmFtcy5udW1fZmlsdGVycyA9IHZwcF9jdHgtPm5iX2ZpbHRlcl9idWZmZXJzOworICAgIH0KKyAgICBwYXJhbXMuc3VyZmFjZSA9IGlucHV0X3N1cmZhY2U7CisgICAgcGFyYW1zLnN1cmZhY2VfcmVnaW9uID0gJmlucHV0X3JlZ2lvbjsKKyAgICBwYXJhbXMuc3VyZmFjZV9jb2xvcl9zdGFuZGFyZCA9CisgICAgICAgIGZmX3ZhYXBpX3ZwcF9jb2xvdXJfc3RhbmRhcmQoaW5wdXRfZnJhbWUtPmNvbG9yc3BhY2UpOworCisgICAgcGFyYW1zLm91dHB1dF9yZWdpb24gPSBOVUxMOworICAgIHBhcmFtcy5vdXRwdXRfYmFja2dyb3VuZF9jb2xvciA9IDB4ZmYwMDAwMDA7CisgICAgcGFyYW1zLm91dHB1dF9jb2xvcl9zdGFuZGFyZCA9IHBhcmFtcy5zdXJmYWNlX2NvbG9yX3N0YW5kYXJkOworCisgICAgcGFyYW1zLnBpcGVsaW5lX2ZsYWdzID0gMDsKKyAgICBwYXJhbXMuZmlsdGVyX2ZsYWdzID0gVkFfRlJBTUVfUElDVFVSRTsKKworICAgIGVyciA9IGZmX3ZhYXBpX3ZwcF9yZW5kZXJfcGljdHVyZShhdmN0eCwgJnBhcmFtcywgb3V0cHV0X3N1cmZhY2UpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHB1dF9mcmFtZSwgaW5wdXRfZnJhbWUpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYXZfZnJhbWVfZnJlZSgmaW5wdXRfZnJhbWUpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgb3V0cHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dHB1dF9mcmFtZS0+Zm9ybWF0KSwKKyAgICAgICAgICAgb3V0cHV0X2ZyYW1lLT53aWR0aCwgb3V0cHV0X2ZyYW1lLT5oZWlnaHQsIG91dHB1dF9mcmFtZS0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cHV0X2ZyYW1lKTsKKworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dF9mcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmb3V0cHV0X2ZyYW1lKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgZGVub2lzZV92YWFwaV9pbml0KEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElWUFBDb250ZXh0ICp2cHBfY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBmZl92YWFwaV92cHBfY3R4X2luaXQoYXZjdHgpOworICAgIHZwcF9jdHgtPnBpcGVsaW5lX3VuaW5pdCAgICAgPSBmZl92YWFwaV92cHBfcGlwZWxpbmVfdW5pbml0OworICAgIHZwcF9jdHgtPmJ1aWxkX2ZpbHRlcl9wYXJhbXMgPSBkZW5vaXNlX3ZhYXBpX2J1aWxkX2ZpbHRlcl9wYXJhbXM7CisgICAgdnBwX2N0eC0+b3V0cHV0X2Zvcm1hdCAgICAgICA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc2hhcnBuZXNzX3ZhYXBpX2luaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQUFQSVZQUENvbnRleHQgKnZwcF9jdHggPSBhdmN0eC0+cHJpdjsKKworICAgIGZmX3ZhYXBpX3ZwcF9jdHhfaW5pdChhdmN0eCk7CisgICAgdnBwX2N0eC0+cGlwZWxpbmVfdW5pbml0ICAgICA9IGZmX3ZhYXBpX3ZwcF9waXBlbGluZV91bmluaXQ7CisgICAgdnBwX2N0eC0+YnVpbGRfZmlsdGVyX3BhcmFtcyA9IHNoYXJwbmVzc192YWFwaV9idWlsZF9maWx0ZXJfcGFyYW1zOworICAgIHZwcF9jdHgtPm91dHB1dF9mb3JtYXQgICAgICAgPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBET0ZGU0VUKHgpIG9mZnNldG9mKERlbm9pc2VWQUFQSUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkZW5vaXNlX3ZhYXBpX29wdGlvbnNbXSA9IHsKKyAgICB7ICJkZW5vaXNlIiwgImRlbm9pc2UgbGV2ZWwiLAorICAgICAgRE9GRlNFVChkZW5vaXNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBERU5PSVNFX0RFRkFVTFQgfSwgREVOT0lTRV9NSU4sIERFTk9JU0VfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworI2RlZmluZSBTT0ZGU0VUKHgpIG9mZnNldG9mKFNoYXJwbmVzc1ZBQVBJQ29udGV4dCwgeCkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzaGFycG5lc3NfdmFhcGlfb3B0aW9uc1tdID0geworICAgIHsgInNoYXJwbmVzcyIsICJzaGFycG5lc3MgbGV2ZWwiLAorICAgICAgU09GRlNFVChzaGFycG5lc3MpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IFNIQVJQTkVTU19ERUZBVUxUIH0sIFNIQVJQTkVTU19NSU4sIFNIQVJQTkVTU19NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoZGVub2lzZV92YWFwaSk7CitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc2hhcnBuZXNzX3ZhYXBpKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG1pc2NfdmFhcGlfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gJm1pc2NfdmFhcGlfZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gJmZmX3ZhYXBpX3ZwcF9jb25maWdfaW5wdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG1pc2NfdmFhcGlfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gJmZmX3ZhYXBpX3ZwcF9jb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX2Rlbm9pc2VfdmFhcGkgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAiZGVub2lzZV92YWFwaSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVkFBUEkgVlBQIGZvciBkZS1ub2lzZSIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKERlbm9pc2VWQUFQSUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gJmRlbm9pc2VfdmFhcGlfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9ICZmZl92YWFwaV92cHBfY3R4X3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9ICZmZl92YWFwaV92cHBfcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IG1pc2NfdmFhcGlfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gbWlzY192YWFwaV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJmRlbm9pc2VfdmFhcGlfY2xhc3MsCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CisKK0FWRmlsdGVyIGZmX3ZmX3NoYXJwbmVzc192YWFwaSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzaGFycG5lc3NfdmFhcGkiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlZBQVBJIFZQUCBmb3Igc2hhcnBuZXNzIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoU2hhcnBuZXNzVkFBUElDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9ICZzaGFycG5lc3NfdmFhcGlfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9ICZmZl92YWFwaV92cHBfY3R4X3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9ICZmZl92YWFwaV92cHBfcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IG1pc2NfdmFhcGlfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gbWlzY192YWFwaV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNoYXJwbmVzc192YWFwaV9jbGFzcywKKyAgICAuZmxhZ3NfaW50ZXJuYWwgPSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX21peC5jIGIvbGliYXZmaWx0ZXIvdmZfbWl4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxYWIwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX21peC5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBNaXhDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisgICAgY2hhciAqd2VpZ2h0c19zdHI7CisgICAgaW50IG5iX2lucHV0czsKKyAgICBpbnQgZHVyYXRpb247CisgICAgZmxvYXQgKndlaWdodHM7CisgICAgZmxvYXQgd2ZhY3RvcjsKKworICAgIGludCBkZXB0aDsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBsaW5lc2l6ZVs0XTsKKyAgICBpbnQgaGVpZ2h0WzRdOworCisgICAgQVZGcmFtZSAqKmZyYW1lczsKKyAgICBGRkZyYW1lU3luYyBmczsKK30gTWl4Q29udGV4dDsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqcGl4X2ZtdHMgPSBOVUxMOworICAgIGludCBmbXQsIHJldDsKKworICAgIGZvciAoZm10ID0gMDsgYXZfcGl4X2ZtdF9kZXNjX2dldChmbXQpOyBmbXQrKykgeworICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZtdCk7CisgICAgICAgIGlmICghKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCB8fAorICAgICAgICAgICAgICBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMIHx8CisgICAgICAgICAgICAgIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JJVFNUUkVBTSkgJiYKKyAgICAgICAgICAgIChyZXQgPSBmZl9hZGRfZm9ybWF0KCZwaXhfZm10cywgZm10KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgcGl4X2ZtdHMpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNaXhDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNoYXIgKnAsICphcmcsICpzYXZlcHRyID0gTlVMTDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgcy0+ZnJhbWVzID0gYXZfY2FsbG9jKHMtPm5iX2lucHV0cywgc2l6ZW9mKCpzLT5mcmFtZXMpKTsKKyAgICBpZiAoIXMtPmZyYW1lcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPndlaWdodHMgPSBhdl9jYWxsb2Mocy0+bmJfaW5wdXRzLCBzaXplb2YoKnMtPndlaWdodHMpKTsKKyAgICBpZiAoIXMtPndlaWdodHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJQYWQgcGFkID0geyAwIH07CisKKyAgICAgICAgcGFkLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIHBhZC5uYW1lID0gYXZfYXNwcmludGYoImlucHV0JWQiLCBpKTsKKyAgICAgICAgaWYgKCFwYWQubmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmcGFkKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHAgPSBzLT53ZWlnaHRzX3N0cjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKCEoYXJnID0gYXZfc3RydG9rKHAsICIgIiwgJnNhdmVwdHIpKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHAgPSBOVUxMOworICAgICAgICBzc2NhbmYoYXJnLCAiJWYiLCAmcy0+d2VpZ2h0c1tpXSk7CisgICAgICAgIHMtPndmYWN0b3IgKz0gcy0+d2VpZ2h0c1tpXTsKKyAgICB9CisgICAgcy0+d2ZhY3RvciA9IDEgLyBzLT53ZmFjdG9yOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19mcmFtZShGRkZyYW1lU3luYyAqZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBNaXhDb250ZXh0ICpzID0gZnMtPm9wYXF1ZTsKKyAgICBBVkZyYW1lICoqaW4gPSBzLT5mcmFtZXM7CisgICAgQVZGcmFtZSAqb3V0OworICAgIGludCBpLCBwLCByZXQsIHgsIHk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgaSwgJmluW2ldLCAwKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKHMtPmZzLnB0cywgcy0+ZnMudGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgaWYgKHMtPmRlcHRoIDw9IDgpIHsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGFbcF07CisKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzLT5oZWlnaHRbcF07IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT5saW5lc2l6ZVtwXTsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCB2YWwgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzcmMgPSBpbltpXS0+ZGF0YVtwXVt5ICogcy0+bGluZXNpemVbcF0gKyB4XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsICs9IHNyYyAqIHMtPndlaWdodHNbaV07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSB2YWwgKiBzLT53ZmFjdG9yOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRzdCArPSBvdXQtPmxpbmVzaXplW3BdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgICAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW3BdOworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgcy0+aGVpZ2h0W3BdOyB5KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgcy0+bGluZXNpemVbcF07IHgrKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgdmFsID0gMDsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNyYyA9IEFWX1JOMTYoaW5baV0tPmRhdGFbcF0gKyB5ICogcy0+bGluZXNpemVbcF0gKyB4ICogMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCArPSBzcmMgKiBzLT53ZWlnaHRzW2ldOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gdmFsICogcy0+d2ZhY3RvcjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkc3QgKz0gb3V0LT5saW5lc2l6ZVtwXSAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgTWl4Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZSA9IGN0eC0+aW5wdXRzWzBdLT50aW1lX2Jhc2U7CisgICAgQVZSYXRpb25hbCBmcmFtZV9yYXRlID0gY3R4LT5pbnB1dHNbMF0tPmZyYW1lX3JhdGU7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBpbnQgaGVpZ2h0ID0gY3R4LT5pbnB1dHNbMF0tPmg7CisgICAgaW50IHdpZHRoID0gY3R4LT5pbnB1dHNbMF0tPnc7CisgICAgRkZGcmFtZVN5bmNJbiAqaW47CisgICAgaW50IGksIHJldDsKKworICAgIGZvciAoaSA9IDE7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBpZiAoY3R4LT5pbnB1dHNbaV0tPmggIT0gaGVpZ2h0IHx8IGN0eC0+aW5wdXRzW2ldLT53ICE9IHdpZHRoKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnB1dCAlZCBzaXplICglZHglZCkgZG9lcyBub3QgbWF0Y2ggaW5wdXQgJWQgc2l6ZSAoJWR4JWQpLlxuIiwgaSwgY3R4LT5pbnB1dHNbaV0tPncsIGN0eC0+aW5wdXRzW2ldLT5oLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzLT5kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdXRsaW5rLT5mb3JtYXQpOworICAgIGlmICghcy0+ZGVzYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKG91dGxpbmstPmZvcm1hdCk7CisgICAgcy0+ZGVwdGggPSBzLT5kZXNjLT5jb21wWzBdLmRlcHRoOworCisgICAgb3V0bGluay0+dyAgICAgICAgICA9IHdpZHRoOworICAgIG91dGxpbmstPmggICAgICAgICAgPSBoZWlnaHQ7CisgICAgb3V0bGluay0+dGltZV9iYXNlICA9IHRpbWVfYmFzZTsKKyAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gZnJhbWVfcmF0ZTsKKworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2luaXQoJnMtPmZzLCBjdHgsIHMtPm5iX2lucHV0cykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGluID0gcy0+ZnMuaW47CisgICAgcy0+ZnMub3BhcXVlID0gczsKKyAgICBzLT5mcy5vbl9ldmVudCA9IHByb2Nlc3NfZnJhbWU7CisKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKHMtPmxpbmVzaXplLCBpbmxpbmstPmZvcm1hdCwgaW5saW5rLT53KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+aGVpZ2h0WzFdID0gcy0+aGVpZ2h0WzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBzLT5kZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICBzLT5oZWlnaHRbMF0gPSBzLT5oZWlnaHRbM10gPSBpbmxpbmstPmg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1tpXTsKKworICAgICAgICBpbltpXS50aW1lX2Jhc2UgPSBpbmxpbmstPnRpbWVfYmFzZTsKKyAgICAgICAgaW5baV0uc3luYyAgID0gMTsKKyAgICAgICAgaW5baV0uYmVmb3JlID0gRVhUX1NUT1A7CisgICAgICAgIGluW2ldLmFmdGVyICA9IChzLT5kdXJhdGlvbiA9PSAxIHx8IChzLT5kdXJhdGlvbiA9PSAyICYmIGkgPT0gMCkpID8gRVhUX1NUT1AgOiBFWFRfSU5GSU5JVFk7CisgICAgfQorCisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTWl4Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsKKyAgICBhdl9mcmVlcCgmcy0+ZnJhbWVzKTsKKyAgICBhdl9mcmVlcCgmcy0+d2VpZ2h0cyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+aW5wdXRfcGFkc1tpXS5uYW1lKTsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBNaXhDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoJnMtPmZzKTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoTWl4Q29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1peF9vcHRpb25zW10gPSB7CisgICAgeyAiaW5wdXRzIiwgInNldCBudW1iZXIgb2YgaW5wdXRzIiwgT0ZGU0VUKG5iX2lucHV0cyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDIsIElOVF9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAid2VpZ2h0cyIsICJzZXQgd2VpZ2h0IGZvciBlYWNoIGlucHV0IiwgT0ZGU0VUKHdlaWdodHNfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0iMSAxIn0sIDAsIDAsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZHVyYXRpb24iLCAiaG93IHRvIGRldGVybWluZSBlbmQgb2Ygc3RyZWFtIiwgT0ZGU0VUKGR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMiwgLmZsYWdzID0gRkxBR1MsICJkdXJhdGlvbiIgfSwKKyAgICAgICAgeyAibG9uZ2VzdCIsICAiRHVyYXRpb24gb2YgbG9uZ2VzdCBpbnB1dCIsICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAiZHVyYXRpb24iIH0sCisgICAgICAgIHsgInNob3J0ZXN0IiwgIkR1cmF0aW9uIG9mIHNob3J0ZXN0IGlucHV0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgImR1cmF0aW9uIiB9LAorICAgICAgICB7ICJmaXJzdCIsICAgICJEdXJhdGlvbiBvZiBmaXJzdCBpbnB1dCIsICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0yfSwgMCwgMCwgRkxBR1MsICJkdXJhdGlvbiIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MobWl4KTsKKworQVZGaWx0ZXIgZmZfdmZfbWl4ID0geworICAgIC5uYW1lICAgICAgICAgID0gIm1peCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTWl4IHZpZGVvIGlucHV0cy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihNaXhDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZtaXhfY2xhc3MsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLmFjdGl2YXRlICAgICAgPSBhY3RpdmF0ZSwKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfRFlOQU1JQ19JTlBVVFMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfbXBkZWNpbWF0ZS5jIGIvbGliYXZmaWx0ZXIvdmZfbXBkZWNpbWF0ZS5jCmluZGV4IGRjMzQ1MTEuLmM5YTljYjMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX21wZGVjaW1hdGUuYworKysgYi9saWJhdmZpbHRlci92Zl9tcGRlY2ltYXRlLmMKQEAgLTMzLDcgKzMzLDcgQEAKICNpbmNsdWRlICJmb3JtYXRzLmgiCiAjaW5jbHVkZSAidmlkZW8uaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRGVjaW1hdGVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgbG8sIGhpOyAgICAgICAgICAgICAgICAgICAgLy8vPCBsb3dlciBhbmQgaGlnaGVyIHRocmVzaG9sZCBudW1iZXIgb2YgZGlmZmVyZW5jZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCB2YWx1ZXMgZm9yIDh4OCBibG9ja3MKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX25sbWVhbnMuYyBiL2xpYmF2ZmlsdGVyL3ZmX25sbWVhbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDk1MmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfbmxtZWFucy5jCkBAIC0wLDAgKzEsNTUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQHRvZG8KKyAqIC0gU0lNRCBmb3IgY29tcHV0ZV9zYWZlX3NzZF9pbnRlZ3JhbF9pbWFnZQorICogLSBTSU1EIGZvciBmaW5hbCB3ZWlnaHRlZCBhdmVyYWdpbmcKKyAqIC0gYmV0dGVyIGF1dG9tYXRpYyBkZWZhdWx0cz8gc2VlICJQYXJhbWV0ZXJzIiBAIGh0dHA6Ly93d3cuaXBvbC5pbS9wdWIvYXJ0LzIwMTEvYmNtX25sbS8KKyAqIC0gdGVtcG9yYWwgc3VwcG9ydCAocHJvYmFibHkgZG9lc24ndCBuZWVkIGFueSBkaXNwbGFjZW1lbnQgYWNjb3JkaW5nIHRvCisgKiAgICJEZW5vaXNpbmcgaW1hZ2Ugc2VxdWVuY2VzIGRvZXMgbm90IHJlcXVpcmUgbW90aW9uIGVzdGltYXRpb24iKQorICogLSBCYXllciBwaXhlbCBmb3JtYXQgc3VwcG9ydCBmb3IgYXQgbGVhc3QgcmF3IHBob3Rvcz8gKERORyBzdXBwb3J0IHdvdWxkIGJlCisgKiAgIGhhbmR5IGhlcmUpCisgKiAtIEZBVEUgdGVzdCAocHJvYmFibHkgbmVlZHMgdmlzdWFsIHRocmVzaG9sZCB0ZXN0IG1lY2hhbmlzbSBkdWUgdG8gdGhlIHVzZQorICogICBvZiBmbG9hdHMpCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworc3RydWN0IHdlaWdodGVkX2F2ZyB7CisgICAgZG91YmxlIHRvdGFsX3dlaWdodDsKKyAgICBkb3VibGUgc3VtOworfTsKKworI2RlZmluZSBXRUlHSFRfTFVUX05CSVRTIDkKKyNkZWZpbmUgV0VJR0hUX0xVVF9TSVpFICAoMTw8V0VJR0hUX0xVVF9OQklUUykKKwordHlwZWRlZiBzdHJ1Y3QgTkxNZWFuc0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBuYl9wbGFuZXM7CisgICAgaW50IGNocm9tYV93LCBjaHJvbWFfaDsKKyAgICBkb3VibGUgcGRpZmZfc2NhbGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludmVydCBvZiB0aGUgZmlsdGVyaW5nIHBhcmFtZXRlciAoc2lnbWEqMTApIHNxdWFyZWQKKyAgICBkb3VibGUgc2lnbWE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbm9pc2luZyBzdHJlbmd0aAorICAgIGludCBwYXRjaF9zaXplLCAgICBwYXRjaF9oc2l6ZTsgICAgICAgICAgICAgLy8gcGF0Y2ggc2l6ZSBhbmQgaGFsZiBzaXplCisgICAgaW50IHBhdGNoX3NpemVfdXYsIHBhdGNoX2hzaXplX3V2OyAgICAgICAgICAvLyBwYXRjaCBzaXplIGFuZCBoYWxmIHNpemUgZm9yIGNocm9tYSBwbGFuZXMKKyAgICBpbnQgcmVzZWFyY2hfc2l6ZSwgICAgcmVzZWFyY2hfaHNpemU7ICAgICAgIC8vIHJlc2VhcmNoIHNpemUgYW5kIGhhbGYgc2l6ZQorICAgIGludCByZXNlYXJjaF9zaXplX3V2LCByZXNlYXJjaF9oc2l6ZV91djsgICAgLy8gcmVzZWFyY2ggc2l6ZSBhbmQgaGFsZiBzaXplIGZvciBjaHJvbWEgcGxhbmVzCisgICAgdWludDMyX3QgKmlpX29yaWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlZ3JhbCBpbWFnZQorICAgIHVpbnQzMl90ICppaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50ZWdyYWwgaW1hZ2Ugc3RhcnRpbmcgYWZ0ZXIgdGhlIDAtbGluZSBhbmQgMC1jb2x1bW4KKyAgICBpbnQgaWlfdywgaWlfaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGludGVncmFsIGltYWdlCisgICAgaW50IGlpX2x6XzMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lc2l6ZSBpbiAzMi1iaXQgdW5pdHMgb2YgdGhlIGludGVncmFsIGltYWdlCisgICAgc3RydWN0IHdlaWdodGVkX2F2ZyAqd2E7ICAgICAgICAgICAgICAgICAgICAvLyB3ZWlnaHRlZCBhdmVyYWdlIG9mIGV2ZXJ5IHBpeGVsCisgICAgaW50IHdhX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lc2l6ZSBmb3Igd2EgaW4gc3RydWN0IHNpemUgdW5pdAorICAgIGRvdWJsZSB3ZWlnaHRfbHV0W1dFSUdIVF9MVVRfU0laRV07ICAgICAgICAgLy8gbG9va3VwIHRhYmxlIG1hcHBpbmcgKHNjYWxlZCkgcGF0Y2ggZGlmZmVyZW5jZXMgdG8gdGhlaXIgYXNzb2NpYXRlZCB3ZWlnaHRzCisgICAgZG91YmxlIHBkaWZmX2x1dF9zY2FsZTsgICAgICAgICAgICAgICAgICAgICAvLyBzY2FsZSBmYWN0b3IgZm9yIHBhdGNoIGRpZmZlcmVuY2VzIGJlZm9yZSBsb29raW5nIGludG8gdGhlIExVVAorICAgIGludCBtYXhfbWVhbmluZ2Z1bF9kaWZmOyAgICAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBkaWZmZXJlbmNlIGNvbnNpZGVyZWQgKGlmIHRoZSBwYXRjaCBkaWZmZXJlbmNlIGlzIHRvbyBoaWdoIHdlIGlnbm9yZSB0aGUgcGl4ZWwpCit9IE5MTWVhbnNDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihOTE1lYW5zQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbmxtZWFuc19vcHRpb25zW10gPSB7CisgICAgeyAicyIsICAiZGVub2lzaW5nIHN0cmVuZ3RoIiwgT0ZGU0VUKHNpZ21hKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSAxLjAgfSwgMS4wLCAzMC4wLCBGTEFHUyB9LAorICAgIHsgInAiLCAgInBhdGNoIHNpemUiLCAgICAgICAgICAgICAgICAgICBPRkZTRVQocGF0Y2hfc2l6ZSksICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMyoyKzEgfSwgMCwgOTksIEZMQUdTIH0sCisgICAgeyAicGMiLCAicGF0Y2ggc2l6ZSBmb3IgY2hyb21hIHBsYW5lcyIsIE9GRlNFVChwYXRjaF9zaXplX3V2KSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sICAgICAwLCA5OSwgRkxBR1MgfSwKKyAgICB7ICJyIiwgICJyZXNlYXJjaCB3aW5kb3ciLCAgICAgICAgICAgICAgICAgICBPRkZTRVQocmVzZWFyY2hfc2l6ZSksICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gNyoyKzEgfSwgMCwgOTksIEZMQUdTIH0sCisgICAgeyAicmMiLCAicmVzZWFyY2ggd2luZG93IGZvciBjaHJvbWEgcGxhbmVzIiwgT0ZGU0VUKHJlc2VhcmNoX3NpemVfdXYpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgICAgIDAsIDk5LCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MobmxtZWFucyk7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR0JSUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisgICAgaWYgKCFmbXRzX2xpc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZtdHNfbGlzdCk7Cit9CisKKy8qCisgKiBNIGlzIGEgZGlzY3JldGUgbWFwIHdoZXJlIGV2ZXJ5IGVudHJ5IGNvbnRhaW5zIHRoZSBzdW0gb2YgYWxsIHRoZSBlbnRyaWVzCisgKiBpbiB0aGUgcmVjdGFuZ2xlIGZyb20gdGhlIHRvcC1sZWZ0IG9yaWdpbiBvZiBNIHRvIGl0cyBjb29yZGluYXRlLiBJbiB0aGUKKyAqIGZvbGxvd2luZyBzY2hlbWEsICJpIiBjb250YWlucyB0aGUgc3VtIG9mIHRoZSB3aG9sZSBtYXA6CisgKgorICogTSA9ICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0rCisgKiAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgIHwKKyAqICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgfAorICogICAgIHwgICAgICAgICBhfCAgICAgICAgICAgICAgICBifCAgIGN8CisgKiAgICAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLSsKKyAqICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgfAorICogICAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICB8CisgKiAgICAgfCAgICAgICAgICB8ICAgICAgICBYICAgICAgICB8ICAgIHwKKyAqICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgfAorICogICAgIHwgICAgICAgICBkfCAgICAgICAgICAgICAgICBlfCAgIGZ8CisgKiAgICAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLSsKKyAqICAgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgfAorICogICAgIHwgICAgICAgICBnfCAgICAgICAgICAgICAgICBofCAgIGl8CisgKiAgICAgKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rLS0tLSsKKyAqCisgKiBUaGUgc3VtIG9mIHRoZSBYIGJveCBjYW4gYmUgY2FsY3VsYXRlZCB3aXRoOgorICogICAgWCA9IGUtZC1iK2EKKyAqCisgKiBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3VtbWVkX2FyZWFfdGFibGUKKyAqCisgKiBUaGUgY29tcHV0ZSpfc3NkIGZ1bmN0aW9ucyBjb21wdXRlIHRoZSBpbnRlZ3JhbCBpbWFnZSBNIHdoZXJlIGV2ZXJ5IGVudHJ5CisgKiBjb250YWlucyB0aGUgc3VtIG9mIHRoZSBzcXVhcmVkIGRpZmZlcmVuY2Ugb2YgZXZlcnkgY29ycmVzcG9uZGluZyBwaXhlbHMgb2YKKyAqIHR3byBpbnB1dCBwbGFuZXMgb2YgdGhlIHNhbWUgc2l6ZSBhcyBNLgorICovCitzdGF0aWMgaW5saW5lIGludCBnZXRfaW50ZWdyYWxfcGF0Y2hfdmFsdWUoY29uc3QgdWludDMyX3QgKmlpLCBpbnQgaWlfbHpfMzIsIGludCB4LCBpbnQgeSwgaW50IHApCit7CisgICAgY29uc3QgaW50IGUgPSBpaVsoeSArIHAgICAgKSAqIGlpX2x6XzMyICsgKHggKyBwICAgICldOworICAgIGNvbnN0IGludCBkID0gaWlbKHkgKyBwICAgICkgKiBpaV9sel8zMiArICh4IC0gcCAtIDEpXTsKKyAgICBjb25zdCBpbnQgYiA9IGlpWyh5IC0gcCAtIDEpICogaWlfbHpfMzIgKyAoeCArIHAgICAgKV07CisgICAgY29uc3QgaW50IGEgPSBpaVsoeSAtIHAgLSAxKSAqIGlpX2x6XzMyICsgKHggLSBwIC0gMSldOworICAgIHJldHVybiBlIC0gZCAtIGIgKyBhOworfQorCisvKioKKyAqIENvbXB1dGUgc3F1YXJlZCBkaWZmZXJlbmNlIG9mIHRoZSBzYWZlIGFyZWEgKHRoZSB6b25lIHdoZXJlIHMxIGFuZCBzMgorICogb3ZlcmxhcCkuIEl0IGlzIGxpa2VseSB0aGUgbGFyZ2VzdCBpbnRlZ3JhbCB6b25lLCBzbyBpdCBpcyBpbnRlcmVzdGluZyB0byBkbworICogYXMgbGl0dGxlIGNoZWNrcyBhcyBwb3NzaWJsZTsgY29udHJhcnkgdG8gdGhlIHVuc2FmZSB2ZXJzaW9uIG9mIHRoaXMKKyAqIGZ1bmN0aW9uLCB3ZSBkbyBub3QgbmVlZCBhbnkgY2xpcHBpbmcgaGVyZS4KKyAqCisgKiBUaGUgbGluZSBhYm92ZSBkc3QgYW5kIHRoZSBjb2x1bW4gdG8gaXRzIGxlZnQgYXJlIGFsd2F5cyByZWFkYWJsZS4KKyAqCisgKiBUaGlzIEMgdmVyc2lvbiBjb21wdXRlcyB0aGUgU1NEIGludGVncmFsIGltYWdlIHVzaW5nIGEgc2NhbGFyIGFjY3VtdWxhdG9yLAorICogd2hpbGUgZm9yIFNJTUQgaW1wbGVtZW50YXRpb24gaXQgaXMgbGlrZWx5IG1vcmUgaW50ZXJlc3RpbmcgdG8gdXNlIHRoZQorICogdHdvLWxvb3BzIGFsZ29yaXRobSB2YXJpYW50LgorICovCitzdGF0aWMgdm9pZCBjb21wdXRlX3NhZmVfc3NkX2ludGVncmFsX2ltYWdlX2ModWludDMyX3QgKmRzdCwgaW50IGRzdF9saW5lc2l6ZV8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzMSwgaW50IGxpbmVzaXplMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzMiwgaW50IGxpbmVzaXplMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIHVpbnQzMl90IGFjYyA9IGRzdFstMV0gLSBkc3RbLWRzdF9saW5lc2l6ZV8zMiAtIDFdOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCBkICA9IHMxW3hdIC0gczJbeF07CisgICAgICAgICAgICBhY2MgKz0gZCAqIGQ7CisgICAgICAgICAgICBkc3RbeF0gPSBkc3RbLWRzdF9saW5lc2l6ZV8zMiArIHhdICsgYWNjOworICAgICAgICB9CisgICAgICAgIHMxICArPSBsaW5lc2l6ZTE7CisgICAgICAgIHMyICArPSBsaW5lc2l6ZTI7CisgICAgICAgIGRzdCArPSBkc3RfbGluZXNpemVfMzI7CisgICAgfQorfQorCisvKioKKyAqIENvbXB1dGUgc3F1YXJlZCBkaWZmZXJlbmNlIG9mIGFuIHVuc2FmZSBhcmVhICh0aGUgem9uZSBub3IgczEgbm9yIHMyIGNvdWxkCisgKiBiZSByZWFkYWJsZSkuCisgKgorICogT24gdGhlIG90aGVyIGhhbmQsIHRoZSBsaW5lIGFib3ZlIGRzdCBhbmQgdGhlIGNvbHVtbiB0byBpdHMgbGVmdCBhcmUgYWx3YXlzCisgKiByZWFkYWJsZS4KKyAqCisgKiBUaGVyZSBpcyBsaXR0bGUgcG9pbnQgaW4gaGF2aW5nIHRoaXMgZnVuY3Rpb24gU0lNRGlmaWVkIGFzIGl0IGlzIGxpa2VseSB0b28KKyAqIGNvbXBsZXggYW5kIG9ubHkgaGFuZGxlIHNtYWxsIHBvcnRpb25zIG9mIHRoZSBpbWFnZS4KKyAqCisgKiBAcGFyYW0gZHN0ICAgICAgICAgICAgICAgaW50ZWdyYWwgaW1hZ2UKKyAqIEBwYXJhbSBkc3RfbGluZXNpemVfMzIgICBpbnRlZ3JhbCBpbWFnZSBsaW5lc2l6ZSAoaW4gMzItYml0IGludGVnZXJzIHVuaXQpCisgKiBAcGFyYW0gc3RhcnR4ICAgICAgICAgICAgaW50ZWdyYWwgc3RhcnRpbmcgeCBwb3NpdGlvbgorICogQHBhcmFtIHN0YXJ0eSAgICAgICAgICAgIGludGVncmFsIHN0YXJ0aW5nIHkgcG9zaXRpb24KKyAqIEBwYXJhbSBzcmMgICAgICAgICAgICAgICBzb3VyY2UgcGxhbmUgYnVmZmVyCisgKiBAcGFyYW0gbGluZXNpemUgICAgICAgICAgc291cmNlIHBsYW5lIGxpbmVzaXplCisgKiBAcGFyYW0gb2ZmeCAgICAgICAgICAgICAgc291cmNlIG9mZnNldHRpbmcgaW4geAorICogQHBhcmFtIG9mZnkgICAgICAgICAgICAgIHNvdXJjZSBvZmZzZXR0aW5nIGluIHkKKyAqIEBwYXJhbiByICAgICAgICAgICAgICAgICBhYnNvbHV0ZSBtYXhpbXVtIHNvdXJjZSBvZmZzZXR0aW5nCisgKiBAcGFyYW0gc3cgICAgICAgICAgICAgICAgc291cmNlIHdpZHRoCisgKiBAcGFyYW0gc2ggICAgICAgICAgICAgICAgc291cmNlIGhlaWdodAorICogQHBhcmFtIHcgICAgICAgICAgICAgICAgIHdpZHRoIHRvIGNvbXB1dGUKKyAqIEBwYXJhbSBoICAgICAgICAgICAgICAgICBoZWlnaHQgdG8gY29tcHV0ZQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY29tcHV0ZV91bnNhZmVfc3NkX2ludGVncmFsX2ltYWdlKHVpbnQzMl90ICpkc3QsIGludCBkc3RfbGluZXNpemVfMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydHgsIGludCBzdGFydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZmeCwgaW50IG9mZnksIGludCByLCBpbnQgc3csIGludCBzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gc3RhcnR5OyB5IDwgc3RhcnR5ICsgaDsgeSsrKSB7CisgICAgICAgIHVpbnQzMl90IGFjYyA9IGRzdFt5KmRzdF9saW5lc2l6ZV8zMiArIHN0YXJ0eCAtIDFdIC0gZHN0Wyh5LTEpKmRzdF9saW5lc2l6ZV8zMiArIHN0YXJ0eCAtIDFdOworICAgICAgICBjb25zdCBpbnQgczF5ID0gYXZfY2xpcCh5IC0gIHIsICAgICAgICAgMCwgc2ggLSAxKTsKKyAgICAgICAgY29uc3QgaW50IHMyeSA9IGF2X2NsaXAoeSAtIChyICsgb2ZmeSksIDAsIHNoIC0gMSk7CisKKyAgICAgICAgZm9yICh4ID0gc3RhcnR4OyB4IDwgc3RhcnR4ICsgdzsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgczF4ID0gYXZfY2xpcCh4IC0gIHIsICAgICAgICAgMCwgc3cgLSAxKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBzMnggPSBhdl9jbGlwKHggLSAociArIG9mZngpLCAwLCBzdyAtIDEpOworICAgICAgICAgICAgY29uc3QgdWludDhfdCB2MSA9IHNyY1tzMXkqbGluZXNpemUgKyBzMXhdOworICAgICAgICAgICAgY29uc3QgdWludDhfdCB2MiA9IHNyY1tzMnkqbGluZXNpemUgKyBzMnhdOworICAgICAgICAgICAgY29uc3QgaW50IGQgPSB2MSAtIHYyOworICAgICAgICAgICAgYWNjICs9IGQgKiBkOworICAgICAgICAgICAgZHN0W3kqZHN0X2xpbmVzaXplXzMyICsgeF0gPSBkc3RbKHktMSkqZHN0X2xpbmVzaXplXzMyICsgeF0gKyBhY2M7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBDb21wdXRlIHRoZSBzdW0gb2Ygc3F1YXJlZCBkaWZmZXJlbmNlIGludGVncmFsIGltYWdlCisgKiBodHRwOi8vd3d3Lmlwb2wuaW0vcHViL2FydC8yMDE0LzU3LworICogSW50ZWdyYWwgSW1hZ2VzIGZvciBCbG9jayBNYXRjaGluZyAtIEdhYnJpZWxlIEZhY2Npb2xvLCBOaWNvbGFzIExpbWFyZSwgRW5yaWMgTWVpbmhhcmR0LUxsb3BpcworICoKKyAqIEBwYXJhbSBpaSAgICAgICAgICAgICAgICBpbnRlZ3JhbCBpbWFnZSBvZiBkaW1lbnNpb24gKHcrZSoyKSB4IChoK2UqMikgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFkZGl0aW9uYWwgemVyb2VkIHRvcCBsaW5lIGFuZCBjb2x1bW4gYWxyZWFkeQorICogICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWVkIiB0byB0aGUgcG9pbnRlciB2YWx1ZQorICogQHBhcmFtIGlpX2xpbmVzaXplXzMyICAgIGludGVncmFsIGltYWdlIGxpbmVzaXplIChpbiAzMi1iaXQgaW50ZWdlcnMgdW5pdCkKKyAqIEBwYXJhbSBzcmMgICAgICAgICAgICAgICBzb3VyY2UgcGxhbmUgYnVmZmVyCisgKiBAcGFyYW0gbGluZXNpemUgICAgICAgICAgc291cmNlIHBsYW5lIGxpbmVzaXplCisgKiBAcGFyYW0gb2ZmeCAgICAgICAgICAgICAgeC1vZmZzZXR0aW5nIHJhbmdpbmcgaW4gWy1lO2VdCisgKiBAcGFyYW0gb2ZmeSAgICAgICAgICAgICAgeS1vZmZzZXR0aW5nIHJhbmdpbmcgaW4gWy1lO2VdCisgKiBAcGFyYW0gdyAgICAgICAgICAgICAgICAgc291cmNlIHdpZHRoCisgKiBAcGFyYW0gaCAgICAgICAgICAgICAgICAgc291cmNlIGhlaWdodAorICogQHBhcmFtIGUgICAgICAgICAgICAgICAgIHJlc2VhcmNoIHBhZGRpbmcgZWRnZQorICovCitzdGF0aWMgdm9pZCBjb21wdXRlX3NzZF9pbnRlZ3JhbF9pbWFnZSh1aW50MzJfdCAqaWksIGludCBpaV9saW5lc2l6ZV8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxpbmVzaXplLCBpbnQgb2ZmeCwgaW50IG9mZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZSwgaW50IHcsIGludCBoKQoreworICAgIC8vIGlpIGhhcyBhIHN1cnJvdW5kaW5nIHBhZGRpbmcgb2YgdGhpY2tuZXNzICJlIgorICAgIGNvbnN0IGludCBpaV93ID0gdyArIGUqMjsKKyAgICBjb25zdCBpbnQgaWlfaCA9IGggKyBlKjI7CisKKyAgICAvLyB3ZSBjZW50ZXIgdGhlIGZpcnN0IHNvdXJjZQorICAgIGNvbnN0IGludCBzMXggPSBlOworICAgIGNvbnN0IGludCBzMXkgPSBlOworCisgICAgLy8gMm5kIHNvdXJjZSBpcyB0aGUgZnJhbWUgd2l0aCBvZmZzZXR0aW5nCisgICAgY29uc3QgaW50IHMyeCA9IGUgKyBvZmZ4OworICAgIGNvbnN0IGludCBzMnkgPSBlICsgb2ZmeTsKKworICAgIC8vIGdldCB0aGUgZGltZW5zaW9uIG9mIHRoZSBvdmVybGFwcGluZyByZWN0YW5nbGUgd2hlcmUgaXQgaXMgYWx3YXlzIHNhZmUKKyAgICAvLyB0byBjb21wYXJlIHRoZSAyIHNvdXJjZXMgcGl4ZWxzCisgICAgY29uc3QgaW50IHN0YXJ0eF9zYWZlID0gRkZNQVgoczF4LCBzMngpOworICAgIGNvbnN0IGludCBzdGFydHlfc2FmZSA9IEZGTUFYKHMxeSwgczJ5KTsKKyAgICBjb25zdCBpbnQgZW5keF9zYWZlICAgPSBGRk1JTihzMXggKyB3LCBzMnggKyB3KTsKKyAgICBjb25zdCBpbnQgZW5keV9zYWZlICAgPSBGRk1JTihzMXkgKyBoLCBzMnkgKyBoKTsKKworICAgIC8vIHRvcCBwYXJ0IHdoZXJlIG9ubHkgb25lIG9mIHMxIGFuZCBzMiBpcyBzdGlsbCByZWFkYWJsZSwgb3Igbm9uZSBhdCBhbGwKKyAgICBjb21wdXRlX3Vuc2FmZV9zc2RfaW50ZWdyYWxfaW1hZ2UoaWksIGlpX2xpbmVzaXplXzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZ4LCBvZmZ5LCBlLCB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaV93LCBzdGFydHlfc2FmZSk7CisKKyAgICAvLyBmaWxsIHRoZSBsZWZ0IGNvbHVtbiBpbnRlZ3JhbCByZXF1aXJlZCB0byBjb21wdXRlIHRoZSBjZW50cmFsCisgICAgLy8gb3ZlcmxhcHBpbmcgb25lCisgICAgY29tcHV0ZV91bnNhZmVfc3NkX2ludGVncmFsX2ltYWdlKGlpLCBpaV9saW5lc2l6ZV8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3RhcnR5X3NhZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZngsIG9mZnksIGUsIHcsIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0eF9zYWZlLCBlbmR5X3NhZmUgLSBzdGFydHlfc2FmZSk7CisKKyAgICAvLyBtYWluIGFuZCBzYWZlIHBhcnQgb2YgdGhlIGludGVncmFsCisgICAgYXZfYXNzZXJ0MShzdGFydHhfc2FmZSAtIHMxeCA+PSAwKTsgYXZfYXNzZXJ0MShzdGFydHhfc2FmZSAtIHMxeCA8IHcpOworICAgIGF2X2Fzc2VydDEoc3RhcnR5X3NhZmUgLSBzMXkgPj0gMCk7IGF2X2Fzc2VydDEoc3RhcnR5X3NhZmUgLSBzMXkgPCBoKTsKKyAgICBhdl9hc3NlcnQxKHN0YXJ0eF9zYWZlIC0gczJ4ID49IDApOyBhdl9hc3NlcnQxKHN0YXJ0eF9zYWZlIC0gczJ4IDwgdyk7CisgICAgYXZfYXNzZXJ0MShzdGFydHlfc2FmZSAtIHMyeSA+PSAwKTsgYXZfYXNzZXJ0MShzdGFydHlfc2FmZSAtIHMyeSA8IGgpOworICAgIGNvbXB1dGVfc2FmZV9zc2RfaW50ZWdyYWxfaW1hZ2VfYyhpaSArIHN0YXJ0eV9zYWZlKmlpX2xpbmVzaXplXzMyICsgc3RhcnR4X3NhZmUsIGlpX2xpbmVzaXplXzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKyAoc3RhcnR5X3NhZmUgLSBzMXkpICogbGluZXNpemUgKyAoc3RhcnR4X3NhZmUgLSBzMXgpLCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgKHN0YXJ0eV9zYWZlIC0gczJ5KSAqIGxpbmVzaXplICsgKHN0YXJ0eF9zYWZlIC0gczJ4KSwgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHhfc2FmZSAtIHN0YXJ0eF9zYWZlLCBlbmR5X3NhZmUgLSBzdGFydHlfc2FmZSk7CisKKyAgICAvLyByaWdodCBwYXJ0IG9mIHRoZSBpbnRlZ3JhbAorICAgIGNvbXB1dGVfdW5zYWZlX3NzZF9pbnRlZ3JhbF9pbWFnZShpaSwgaWlfbGluZXNpemVfMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHhfc2FmZSwgc3RhcnR5X3NhZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZngsIG9mZnksIGUsIHcsIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpX3cgLSBlbmR4X3NhZmUsIGVuZHlfc2FmZSAtIHN0YXJ0eV9zYWZlKTsKKworICAgIC8vIGJvdHRvbSBwYXJ0IHdoZXJlIG9ubHkgb25lIG9mIHMxIGFuZCBzMiBpcyBzdGlsbCByZWFkYWJsZSwgb3Igbm9uZSBhdCBhbGwKKyAgICBjb21wdXRlX3Vuc2FmZV9zc2RfaW50ZWdyYWxfaW1hZ2UoaWksIGlpX2xpbmVzaXplXzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBlbmR5X3NhZmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZngsIG9mZnksIGUsIHcsIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpX3csIGlpX2ggLSBlbmR5X3NhZmUpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIE5MTWVhbnNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGNvbnN0IGludCBlID0gRkZNQVgocy0+cmVzZWFyY2hfaHNpemUsIHMtPnJlc2VhcmNoX2hzaXplX3V2KQorICAgICAgICAgICAgICAgICsgRkZNQVgocy0+cGF0Y2hfaHNpemUsICAgIHMtPnBhdGNoX2hzaXplX3V2KTsKKworICAgIHMtPmNocm9tYV93ID0gRkZfQ0VJTF9SU0hJRlQoaW5saW5rLT53LCBkZXNjLT5sb2cyX2Nocm9tYV93KTsKKyAgICBzLT5jaHJvbWFfaCA9IEZGX0NFSUxfUlNISUZUKGlubGluay0+aCwgZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgLyogQWxsb2NhdGUgdGhlIGludGVncmFsIGltYWdlIHdpdGggZXh0cmEgZWRnZXMgb2YgdGhpY2tuZXNzICJlIgorICAgICAqCisgICAgICogICArXystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAqICAgfDB8MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMHwKKyAgICAgKiAgICsteC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICogICB8MHxcICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICAgfDB8IGlpICB8IGUgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiAgIHwwfCAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogICB8MHwgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgfAorICAgICAqICAgfDB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgICAgKiAgIHwwfDwtPnwgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgICAgICogICB8MHwgZSB8ICAgICAgICAgICAgICAgICAgICAgICB8ICAgfAorICAgICAqICAgfDB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgICAgKiAgIHwwfCAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgICB8CisgICAgICogICB8MHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICAgfDB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgKiAgIHwwfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogICArLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAqLworICAgIHMtPmlpX3cgPSBpbmxpbmstPncgKyBlKjI7CisgICAgcy0+aWlfaCA9IGlubGluay0+aCArIGUqMjsKKworICAgIC8vIGFsaWduIHRvIDQgdGhlIGxpbmVzaXplLCAiKzEiIGlzIGZvciB0aGUgc3BhY2Ugb2YgdGhlIGxlZnQgMC1jb2x1bW4KKyAgICBzLT5paV9sel8zMiA9IEZGQUxJR04ocy0+aWlfdyArIDEsIDQpOworCisgICAgLy8gIisxIiBpcyBmb3IgdGhlIHNwYWNlIG9mIHRoZSB0b3AgMC1saW5lCisgICAgcy0+aWlfb3JpZyA9IGF2X21hbGxvY3pfYXJyYXkocy0+aWlfaCArIDEsIHMtPmlpX2x6XzMyICogc2l6ZW9mKCpzLT5paV9vcmlnKSk7CisgICAgaWYgKCFzLT5paV9vcmlnKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLy8gc2tpcCB0b3AgMC1saW5lIGFuZCBsZWZ0IDAtY29sdW1uCisgICAgcy0+aWkgPSBzLT5paV9vcmlnICsgcy0+aWlfbHpfMzIgKyAxOworCisgICAgLy8gYWxsb2NhdGUgd2VpZ2h0ZWQgYXZlcmFnZSBmb3IgZXZlcnkgcGl4ZWwKKyAgICBzLT53YV9saW5lc2l6ZSA9IGlubGluay0+dzsKKyAgICBzLT53YSA9IGF2X21hbGxvY19hcnJheShzLT53YV9saW5lc2l6ZSwgaW5saW5rLT5oICogc2l6ZW9mKCpzLT53YSkpOworICAgIGlmICghcy0+d2EpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RydWN0IHRocmVhZF9kYXRhIHsKKyAgICBjb25zdCB1aW50OF90ICpzcmM7CisgICAgaW50IHNyY19saW5lc2l6ZTsKKyAgICBpbnQgc3RhcnR4LCBzdGFydHk7CisgICAgaW50IGVuZHgsIGVuZHk7CisgICAgY29uc3QgdWludDMyX3QgKmlpX3N0YXJ0OworICAgIGludCBwOworfTsKKworc3RhdGljIGludCBubG1lYW5zX3NsaWNlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgaW50IHgsIHk7CisgICAgTkxNZWFuc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3Qgc3RydWN0IHRocmVhZF9kYXRhICp0ZCA9IGFyZzsKKyAgICBjb25zdCB1aW50OF90ICpzcmMgPSB0ZC0+c3JjOworICAgIGNvbnN0IGludCBzcmNfbGluZXNpemUgPSB0ZC0+c3JjX2xpbmVzaXplOworICAgIGNvbnN0IGludCBwcm9jZXNzX2ggPSB0ZC0+ZW5keSAtIHRkLT5zdGFydHk7CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKHByb2Nlc3NfaCAqICBqb2JuciAgICkgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBzbGljZV9lbmQgICA9IChwcm9jZXNzX2ggKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc3RhcnR5ID0gdGQtPnN0YXJ0eSArIHNsaWNlX3N0YXJ0OworICAgIGNvbnN0IGludCBlbmR5ICAgPSB0ZC0+c3RhcnR5ICsgc2xpY2VfZW5kOworCisgICAgZm9yICh5ID0gc3RhcnR5OyB5IDwgZW5keTsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IHRkLT5zdGFydHg7IHggPCB0ZC0+ZW5keDsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgcGF0Y2hfZGlmZl9zcSA9IGdldF9pbnRlZ3JhbF9wYXRjaF92YWx1ZSh0ZC0+aWlfc3RhcnQsIHMtPmlpX2x6XzMyLCB4LCB5LCB0ZC0+cCk7CisgICAgICAgICAgICBpZiAocGF0Y2hfZGlmZl9zcSA8IHMtPm1heF9tZWFuaW5nZnVsX2RpZmYpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgd2VpZ2h0ZWRfYXZnICp3YSA9ICZzLT53YVt5KnMtPndhX2xpbmVzaXplICsgeF07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHdlaWdodF9sdXRfaWR4ID0gcGF0Y2hfZGlmZl9zcSAqIHMtPnBkaWZmX2x1dF9zY2FsZTsKKyAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgd2VpZ2h0ID0gcy0+d2VpZ2h0X2x1dFt3ZWlnaHRfbHV0X2lkeF07IC8vIGV4cCgtcGF0Y2hfZGlmZl9zcSAqIHMtPnBkaWZmX3NjYWxlKQorICAgICAgICAgICAgICAgIHdhLT50b3RhbF93ZWlnaHQgKz0gd2VpZ2h0OworICAgICAgICAgICAgICAgIHdhLT5zdW0gKz0gd2VpZ2h0ICogc3JjW3kqc3JjX2xpbmVzaXplICsgeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmxtZWFuc19wbGFuZShBVkZpbHRlckNvbnRleHQgKmN0eCwgaW50IHcsIGludCBoLCBpbnQgcCwgaW50IHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgb2ZmeCwgb2ZmeTsKKyAgICBOTE1lYW5zQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICAvKiBwYXRjaGVzIGNlbnRlciBwb2ludHMgY292ZXIgdGhlIHdob2xlIHJlc2VhcmNoIHdpbmRvdyBzbyB0aGUgcGF0Y2hlcworICAgICAqIHRoZW1zZWx2ZXMgb3ZlcmZsb3cgdGhlIHJlc2VhcmNoIHdpbmRvdyAqLworICAgIGNvbnN0IGludCBlID0gciArIHA7CisgICAgLyogZm9jdXMgYW4gaW50ZWdyYWwgcG9pbnRlciBvbiB0aGUgY2VudGVyZWQgaW1hZ2UgKHMxKSAqLworICAgIGNvbnN0IHVpbnQzMl90ICpjZW50ZXJlZF9paSA9IHMtPmlpICsgZSpzLT5paV9sel8zMiArIGU7CisKKyAgICBtZW1zZXQocy0+d2EsIDAsIHMtPndhX2xpbmVzaXplICogaCAqIHNpemVvZigqcy0+d2EpKTsKKworICAgIGZvciAob2ZmeSA9IC1yOyBvZmZ5IDw9IHI7IG9mZnkrKykgeworICAgICAgICBmb3IgKG9mZnggPSAtcjsgb2ZmeCA8PSByOyBvZmZ4KyspIHsKKyAgICAgICAgICAgIGlmIChvZmZ4IHx8IG9mZnkpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgdGhyZWFkX2RhdGEgdGQgPSB7CisgICAgICAgICAgICAgICAgICAgIC5zcmMgICAgICAgICAgPSBzcmMgKyBvZmZ5KnNyY19saW5lc2l6ZSArIG9mZngsCisgICAgICAgICAgICAgICAgICAgIC5zcmNfbGluZXNpemUgPSBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgIC5zdGFydHggICAgICAgPSBGRk1BWCgwLCAtb2ZmeCksCisgICAgICAgICAgICAgICAgICAgIC5zdGFydHkgICAgICAgPSBGRk1BWCgwLCAtb2ZmeSksCisgICAgICAgICAgICAgICAgICAgIC5lbmR4ICAgICAgICAgPSBGRk1JTih3LCB3IC0gb2ZmeCksCisgICAgICAgICAgICAgICAgICAgIC5lbmR5ICAgICAgICAgPSBGRk1JTihoLCBoIC0gb2ZmeSksCisgICAgICAgICAgICAgICAgICAgIC5paV9zdGFydCAgICAgPSBjZW50ZXJlZF9paSArIG9mZnkqcy0+aWlfbHpfMzIgKyBvZmZ4LAorICAgICAgICAgICAgICAgICAgICAucCAgICAgICAgICAgID0gcCwKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgY29tcHV0ZV9zc2RfaW50ZWdyYWxfaW1hZ2Uocy0+aWksIHMtPmlpX2x6XzMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZngsIG9mZnksIGUsIHcsIGgpOworICAgICAgICAgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBubG1lYW5zX3NsaWNlLCAmdGQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTih0ZC5lbmR5IC0gdGQuc3RhcnR5LCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgc3RydWN0IHdlaWdodGVkX2F2ZyAqd2EgPSAmcy0+d2FbeSpzLT53YV9saW5lc2l6ZSArIHhdOworCisgICAgICAgICAgICAvLyBBbHNvIHdlaWdodCB0aGUgY2VudGVyZWQgcGl4ZWwKKyAgICAgICAgICAgIHdhLT50b3RhbF93ZWlnaHQgKz0gMS4wOworICAgICAgICAgICAgd2EtPnN1bSArPSAxLjAgKiBzcmNbeSpzcmNfbGluZXNpemUgKyB4XTsKKworICAgICAgICAgICAgZHN0W3kqZHN0X2xpbmVzaXplICsgeF0gPSBhdl9jbGlwX3VpbnQ4KHdhLT5zdW0gLyB3YS0+dG90YWxfd2VpZ2h0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIGludCBpOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgTkxNZWFuc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworCisgICAgQVZGcmFtZSAqb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IHcgPSBpID8gcy0+Y2hyb21hX3cgICAgICAgICAgOiBpbmxpbmstPnc7CisgICAgICAgIGNvbnN0IGludCBoID0gaSA/IHMtPmNocm9tYV9oICAgICAgICAgIDogaW5saW5rLT5oOworICAgICAgICBjb25zdCBpbnQgcCA9IGkgPyBzLT5wYXRjaF9oc2l6ZV91diAgICA6IHMtPnBhdGNoX2hzaXplOworICAgICAgICBjb25zdCBpbnQgciA9IGkgPyBzLT5yZXNlYXJjaF9oc2l6ZV91diA6IHMtPnJlc2VhcmNoX2hzaXplOworICAgICAgICBubG1lYW5zX3BsYW5lKGN0eCwgdywgaCwgcCwgciwKKyAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbaV0sIG91dC0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbaV0sICBpbi0+bGluZXNpemVbaV0pOworICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfT0REX0ZJRUxEKGZpZWxkLCBuYW1lKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEocy0+ZmllbGQgJiAxKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzLT5maWVsZCB8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsIG5hbWUgIiBzaXplIG11c3QgYmUgb2RkLCAiICBcCisgICAgICAgICAgICAgICAic2V0dGluZyBpdCB0byAlZFxuIiwgcy0+ZmllbGQpOyAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIE5MTWVhbnNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGRvdWJsZSBoID0gcy0+c2lnbWEgKiAxMC47CisKKyAgICBzLT5wZGlmZl9zY2FsZSA9IDEuIC8gKGggKiBoKTsKKyAgICBzLT5tYXhfbWVhbmluZ2Z1bF9kaWZmID0gLWxvZygxLzI1NS4pIC8gcy0+cGRpZmZfc2NhbGU7CisgICAgcy0+cGRpZmZfbHV0X3NjYWxlID0gMS4vcy0+bWF4X21lYW5pbmdmdWxfZGlmZiAqIFdFSUdIVF9MVVRfU0laRTsKKyAgICBhdl9hc3NlcnQwKChzLT5tYXhfbWVhbmluZ2Z1bF9kaWZmIC0gMSkgKiBzLT5wZGlmZl9sdXRfc2NhbGUgPCBGRl9BUlJBWV9FTEVNUyhzLT53ZWlnaHRfbHV0KSk7CisgICAgZm9yIChpID0gMDsgaSA8IFdFSUdIVF9MVVRfU0laRTsgaSsrKQorICAgICAgICBzLT53ZWlnaHRfbHV0W2ldID0gZXhwKC1pIC8gcy0+cGRpZmZfbHV0X3NjYWxlICogcy0+cGRpZmZfc2NhbGUpOworCisgICAgQ0hFQ0tfT0REX0ZJRUxEKHJlc2VhcmNoX3NpemUsICAgIkx1bWEgcmVzZWFyY2ggd2luZG93Iik7CisgICAgQ0hFQ0tfT0REX0ZJRUxEKHBhdGNoX3NpemUsICAgICAgIkx1bWEgcGF0Y2giKTsKKworICAgIGlmICghcy0+cmVzZWFyY2hfc2l6ZV91dikgcy0+cmVzZWFyY2hfc2l6ZV91diA9IHMtPnJlc2VhcmNoX3NpemU7CisgICAgaWYgKCFzLT5wYXRjaF9zaXplX3V2KSAgICBzLT5wYXRjaF9zaXplX3V2ICAgID0gcy0+cGF0Y2hfc2l6ZTsKKworICAgIENIRUNLX09ERF9GSUVMRChyZXNlYXJjaF9zaXplX3V2LCAiQ2hyb21hIHJlc2VhcmNoIHdpbmRvdyIpOworICAgIENIRUNLX09ERF9GSUVMRChwYXRjaF9zaXplX3V2LCAgICAiQ2hyb21hIHBhdGNoIik7CisKKyAgICBzLT5yZXNlYXJjaF9oc2l6ZSAgICA9IHMtPnJlc2VhcmNoX3NpemUgICAgLyAyOworICAgIHMtPnJlc2VhcmNoX2hzaXplX3V2ID0gcy0+cmVzZWFyY2hfc2l6ZV91diAvIDI7CisgICAgcy0+cGF0Y2hfaHNpemUgICAgICAgPSBzLT5wYXRjaF9zaXplICAgICAgIC8gMjsKKyAgICBzLT5wYXRjaF9oc2l6ZV91diAgICA9IHMtPnBhdGNoX3NpemVfdXYgICAgLyAyOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJSZXNlYXJjaCB3aW5kb3c6ICVkeCVkIC8gJWR4JWQsIHBhdGNoIHNpemU6ICVkeCVkIC8gJWR4JWRcbiIsCisgICAgICAgICAgIHMtPnJlc2VhcmNoX3NpemUsIHMtPnJlc2VhcmNoX3NpemUsIHMtPnJlc2VhcmNoX3NpemVfdXYsIHMtPnJlc2VhcmNoX3NpemVfdXYsCisgICAgICAgICAgIHMtPnBhdGNoX3NpemUsICAgIHMtPnBhdGNoX3NpemUsICAgIHMtPnBhdGNoX3NpemVfdXYsICAgIHMtPnBhdGNoX3NpemVfdXYpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE5MTWVhbnNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGF2X2ZyZWVwKCZzLT5paV9vcmlnKTsKKyAgICBhdl9mcmVlcCgmcy0+d2EpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgbmxtZWFuc19pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG5sbWVhbnNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX25sbWVhbnMgPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAibmxtZWFucyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTm9uLWxvY2FsIG1lYW5zIGRlbm9pc2VyLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE5MTWVhbnNDb250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gbmxtZWFuc19pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBubG1lYW5zX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmbmxtZWFuc19jbGFzcywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDIHwgQVZGSUxURVJfRkxBR19TTElDRV9USFJFQURTLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX25uZWRpLmMgYi9saWJhdmZpbHRlci92Zl9ubmVkaS5jCmluZGV4IDMzMGQzZDYuLmIxNGFhNjQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX25uZWRpLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfbm5lZGkuYwpAQCAtNjAxLDcgKzYwMSw3IEBACiAKICAgICAgICAgY29uc3QgaW50IHlzdGFydCA9IGZyYW1lX2RhdGEtPmZpZWxkW3BsYW5lXTsKICAgICAgICAgY29uc3QgaW50IHlzdG9wID0gaGVpZ2h0IC0gMTI7Ci0gICAgICAgIHVpbnQ4X3QgKnNyY3BwOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwcDsKIAogICAgICAgICBpZiAoIShzLT5wcm9jZXNzX3BsYW5lICYgKDEgPDwgcGxhbmUpKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTE3Myw2ICsxMTczLDcgQEAKIAogICAgIGF2X2ZyZWVwKCZzLT5mcmFtZV9kYXRhLmlucHV0KTsKICAgICBhdl9mcmVlcCgmcy0+ZnJhbWVfZGF0YS50ZW1wKTsKKyAgICBhdl9mcmVlcCgmcy0+ZmRzcCk7CiAgICAgYXZfZnJhbWVfZnJlZSgmcy0+c2Vjb25kKTsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfbm9pc2UuYyBiL2xpYmF2ZmlsdGVyL3ZmX25vaXNlLmMKaW5kZXggZmEzODYzZS4uYWJkZjA0NyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfbm9pc2UuYworKysgYi9saWJhdmZpbHRlci92Zl9ub2lzZS5jCkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICB9CiAKICAgICB0ZC5pbiA9IGlucGljcmVmOyB0ZC5vdXQgPSBvdXQ7Ci0gICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihuLT5oZWlnaHRbMF0sIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKG4tPmhlaWdodFswXSwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKICAgICBlbW1zX2MoKTsKIAogICAgIGlmIChpbnBpY3JlZiAhPSBvdXQpCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9ub2lzZS5oIGIvbGliYXZmaWx0ZXIvdmZfbm9pc2UuaAppbmRleCAyMjA3ZWQ5Li45Mjk5OGU1IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9ub2lzZS5oCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX25vaXNlLmgKQEAgLTM0LDcgKzM0LDcgQEAKICNkZWZpbmUgTk9JU0VfQVZFUkFHRUQgOAogI2RlZmluZSBOT0lTRV9QQVRURVJOICAxNgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBGaWx0ZXJQYXJhbXMgewogICAgIGludCBzdHJlbmd0aDsKICAgICB1bnNpZ25lZCBmbGFnczsKICAgICBBVkxGRyBsZmc7CkBAIC00NSw3ICs0NSw3IEBACiAgICAgaW50IHJhbmRfc2hpZnRfaW5pdDsKIH0gRmlsdGVyUGFyYW1zOwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBOb2lzZUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCBuYl9wbGFuZXM7CiAgICAgaW50IGJ5dGV3aWR0aFs0XTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX25vcm1hbGl6ZS5jIGIvbGliYXZmaWx0ZXIvdmZfbm9ybWFsaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxZmU5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX25vcm1hbGl6ZS5jCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFJpY2hhcmQgTGluZworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKgorICogTm9ybWFsaXplIFJHQiB2aWRlbyAoYWthIGhpc3RvZ3JhbSBzdHJldGNoaW5nLCBjb250cmFzdCBzdHJldGNoaW5nKS4KKyAqIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTm9ybWFsaXphdGlvbl8oaW1hZ2VfcHJvY2Vzc2luZykKKyAqCisgKiBGb3IgZWFjaCBjaGFubmVsIG9mIGVhY2ggZnJhbWUsIHRoZSBmaWx0ZXIgY29tcHV0ZXMgdGhlIGlucHV0IHJhbmdlIGFuZCBtYXBzCisgKiBpdCBsaW5lYXJseSB0byB0aGUgdXNlci1zcGVjaWZpZWQgb3V0cHV0IHJhbmdlLiBUaGUgb3V0cHV0IHJhbmdlIGRlZmF1bHRzCisgKiB0byB0aGUgZnVsbCBkeW5hbWljIHJhbmdlIGZyb20gcHVyZSBibGFjayB0byBwdXJlIHdoaXRlLgorICoKKyAqIE5haXZlbHkgbWF4aW1pc2luZyB0aGUgZHluYW1pYyByYW5nZSBvZiBlYWNoIGZyYW1lIG9mIHZpZGVvIGluIGlzb2xhdGlvbgorICogbWF5IGNhdXNlIGZsaWNrZXJpbmcgKHJhcGlkIGNoYW5nZXMgaW4gYnJpZ2h0bmVzcyBvZiBzdGF0aWMgb2JqZWN0cyBpbiB0aGUKKyAqIHNjZW5lKSB3aGVuIHNtYWxsIGRhcmsgb3IgYnJpZ2h0IG9iamVjdHMgZW50ZXIgb3IgbGVhdmUgdGhlIHNjZW5lLiBUaGlzCisgKiBmaWx0ZXIgY2FuIGFwcGx5IHRlbXBvcmFsIHNtb290aGluZyB0byB0aGUgaW5wdXQgcmFuZ2UgdG8gcmVkdWNlIGZsaWNrZXJpbmcuCisgKiBUZW1wb3JhbCBzbW9vdGhpbmcgaXMgc2ltaWxhciB0byB0aGUgYXV0by1leHBvc3VyZSAoYXV0b21hdGljIGdhaW4gY29udHJvbCkKKyAqIG9uIGEgdmlkZW8gY2FtZXJhLCB3aGljaCBwZXJmb3JtcyB0aGUgc2FtZSBmdW5jdGlvbjsgYW5kLCBsaWtlIGEgdmlkZW8KKyAqIGNhbWVyYSwgaXQgbWF5IGNhdXNlIGEgcGVyaW9kIG9mIG92ZXItIG9yIHVuZGVyLWV4cG9zdXJlIG9mIHRoZSB2aWRlby4KKyAqCisgKiBUaGUgZmlsdGVyIGNhbiBub3JtYWxpemUgdGhlIFIsRyxCIGNoYW5uZWxzIGluZGVwZW5kZW50bHksIHdoaWNoIG1heSBjYXVzZQorICogY29sb3Igc2hpZnRpbmcsIG9yIGxpbmsgdGhlbSB0b2dldGhlciBhcyBhIHNpbmdsZSBjaGFubmVsLCB3aGljaCBwcmV2ZW50cworICogY29sb3Igc2hpZnRpbmcuIE1vcmUgcHJlY2lzZWx5LCBsaW5rZWQgbm9ybWFsaXphdGlvbiBwcmVzZXJ2ZXMgaHVlIChhcyBpdCdzCisgKiBkZWZpbmVkIGluIEhTVi9IU0wgY29sb3Igc3BhY2VzKSB3aGlsZSBpbmRlcGVuZGVudCBub3JtYWxpemF0aW9uIGRvZXMgbm90LgorICogSW5kZXBlbmRlbnQgbm9ybWFsaXphdGlvbiBjYW4gYmUgdXNlZCB0byByZW1vdmUgY29sb3IgY2FzdHMsIHN1Y2ggYXMgdGhlCisgKiBibHVlIGNhc3QgZnJvbSB1bmRlcndhdGVyIHZpZGVvLCByZXN0b3JpbmcgbW9yZSBuYXR1cmFsIGNvbG9ycy4gVGhlIGZpbHRlcgorICogY2FuIGFsc28gY29tYmluZSBpbmRlcGVuZGVudCBhbmQgbGlua2VkIG5vcm1hbGl6YXRpb24gaW4gYW55IHJhdGlvLgorICoKKyAqIEZpbmFsbHkgdGhlIG92ZXJhbGwgc3RyZW5ndGggb2YgdGhlIGZpbHRlciBjYW4gYmUgYWRqdXN0ZWQsIGZyb20gbm8gZWZmZWN0CisgKiB0byBmdWxsIG5vcm1hbGl6YXRpb24uCisgKgorICogVGhlIDUgQVZPcHRpb25zIGFyZToKKyAqICAgYmxhY2twdCwgICBDb2xvcnMgd2hpY2ggZGVmaW5lIHRoZSBvdXRwdXQgcmFuZ2UuIFRoZSBtaW5pbXVtIGlucHV0IHZhbHVlCisgKiAgIHdoaXRlcHQgICAgaXMgbWFwcGVkIHRvIHRoZSBibGFja3B0LiBUaGUgbWF4aW11bSBpbnB1dCB2YWx1ZSBpcyBtYXBwZWQgdG8KKyAqICAgICAgICAgICAgICB0aGUgd2hpdGVwdC4gVGhlIGRlZmF1bHRzIGFyZSBibGFjayBhbmQgd2hpdGUgcmVzcGVjdGl2ZWx5LgorICogICAgICAgICAgICAgIFNwZWNpZnlpbmcgd2hpdGUgZm9yIGJsYWNrcHQgYW5kIGJsYWNrIGZvciB3aGl0ZXB0IHdpbGwgZ2l2ZQorICogICAgICAgICAgICAgIGNvbG9yLWludmVydGVkLCBub3JtYWxpemVkIHZpZGVvLiBTaGFkZXMgb2YgZ3JleSBjYW4gYmUgdXNlZAorICogICAgICAgICAgICAgIHRvIHJlZHVjZSB0aGUgZHluYW1pYyByYW5nZSAoY29udHJhc3QpLiBTcGVjaWZ5aW5nIHNhdHVyYXRlZAorICogICAgICAgICAgICAgIGNvbG9ycyBoZXJlIGNhbiBjcmVhdGUgc29tZSBpbnRlcmVzdGluZyBlZmZlY3RzLgorICoKKyAqICAgc21vb3RoaW5nICBUaGUgYW1vdW50IG9mIHRlbXBvcmFsIHNtb290aGluZywgZXhwcmVzc2VkIGluIGZyYW1lcyAoPj0wKS4KKyAqICAgICAgICAgICAgICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBpbnB1dCB2YWx1ZXMgb2YgZWFjaCBjaGFubmVsIGFyZQorICogICAgICAgICAgICAgIHNtb290aGVkIHVzaW5nIGEgcm9sbGluZyBhdmVyYWdlIG92ZXIgdGhlIGN1cnJlbnQgZnJhbWUgYW5kCisgKiAgICAgICAgICAgICAgdGhhdCBtYW55IHByZXZpb3VzIGZyYW1lcyBvZiB2aWRlby4gIERlZmF1bHRzIHRvIDAgKG5vIHRlbXBvcmFsCisgKiAgICAgICAgICAgICAgc21vb3RoaW5nKS4KKyAqCisgKiAgIGluZGVwZW5kZW5jZQorICogICAgICAgICAgICAgIENvbnRyb2xzIHRoZSByYXRpbyBvZiBpbmRlcGVuZGVudCAoY29sb3Igc2hpZnRpbmcpIGNoYW5uZWwKKyAqICAgICAgICAgICAgICBub3JtYWxpemF0aW9uIHRvIGxpbmtlZCAoY29sb3IgcHJlc2VydmluZykgbm9ybWFsaXphdGlvbi4gMC4wCisgKiAgICAgICAgICAgICAgaXMgZnVsbHkgbGlua2VkLCAxLjAgaXMgZnVsbHkgaW5kZXBlbmRlbnQuIERlZmF1bHRzIHRvIGZ1bGx5CisgKiAgICAgICAgICAgICAgaW5kZXBlbmRlbnQuCisgKgorICogICBzdHJlbmd0aCAgIE92ZXJhbGwgc3RyZW5ndGggb2YgdGhlIGZpbHRlci4gMS4wIGlzIGZ1bGwgc3RyZW5ndGguIDAuMCBpcworICogICAgICAgICAgICAgIGEgcmF0aGVyIGV4cGVuc2l2ZSBuby1vcC4gVmFsdWVzIGluIGJldHdlZW4gY2FuIGdpdmUgYSBnZW50bGUKKyAqICAgICAgICAgICAgICBib29zdCB0byBsb3ctY29udHJhc3QgdmlkZW8gd2l0aG91dCBjcmVhdGluZyBhbiBhcnRpZmljaWFsCisgKiAgICAgICAgICAgICAgb3Zlci1wcm9jZXNzZWQgbG9vay4gVGhlIGRlZmF1bHQgaXMgZnVsbCBzdHJlbmd0aC4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBOb3JtYWxpemVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIC8vIFN0b3JhZ2UgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEFWT3B0aW9ucworICAgIHVpbnQ4X3QgYmxhY2twdFs0XTsKKyAgICB1aW50OF90IHdoaXRlcHRbNF07CisgICAgaW50IHNtb290aGluZzsKKyAgICBmbG9hdCBpbmRlcGVuZGVuY2U7CisgICAgZmxvYXQgc3RyZW5ndGg7CisKKyAgICBpbnQgY29bNF07ICAgICAgICAgIC8vIE9mZnNldHMgdG8gUixHLEIsQSBieXRlcyByZXNwZWN0aXZlbHkgaW4gZWFjaCBwaXhlbAorICAgIGludCBudW1fY29tcG9uZW50czsgLy8gTnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIHBpeGVsIGZvcm1hdAorICAgIGludCBoaXN0b3J5X2xlbjsgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyB0byBhdmVyYWdlOyBiYXNlZCBvbiBzbW9vdGhpbmcgZmFjdG9yCisgICAgaW50IGZyYW1lX251bTsgICAgICAvLyBJbmNyZW1lbnRzIG9uIGVhY2ggZnJhbWUsIHN0YXJ0aW5nIGZyb20gMC4KKworICAgIC8vIFBlci1leHRyZW11bSwgcGVyLWNoYW5uZWwgaGlzdG9yeSwgZm9yIHRlbXBvcmFsIHNtb290aGluZy4KKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50OF90ICpoaXN0b3J5OyAgICAgICAvLyBIaXN0b3J5IGVudHJpZXMuCisgICAgICAgIHVpbnQzMl90IGhpc3Rvcnlfc3VtOyAgIC8vIFN1bSBvZiBoaXN0b3J5IGVudHJpZXMuCisgICAgfSBtaW5bM10sIG1heFszXTsgICAgICAgICAgIC8vIE1pbiBhbmQgbWF4IGZvciBlYWNoIGNoYW5uZWwgaW4ge1IsRyxCfS4KKyAgICB1aW50OF90ICpoaXN0b3J5X21lbTsgICAgICAgLy8gU2luZ2xlIGFsbG9jYXRpb24gZm9yIGFib3ZlIGhpc3RvcnkgZW50cmllcworCit9IE5vcm1hbGl6ZUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE5vcm1hbGl6ZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gbm9ybWFsaXplX29wdGlvbnNbXSA9IHsKKyAgICB7ICJibGFja3B0IiwgICJvdXRwdXQgY29sb3IgdG8gd2hpY2ggZGFya2VzdCBpbnB1dCBjb2xvciBpcyBtYXBwZWQiLCAgT0ZGU0VUKGJsYWNrcHQpLCBBVl9PUFRfVFlQRV9DT0xPUiwgeyAuc3RyID0gImJsYWNrIiB9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAid2hpdGVwdCIsICAib3V0cHV0IGNvbG9yIHRvIHdoaWNoIGJyaWdodGVzdCBpbnB1dCBjb2xvciBpcyBtYXBwZWQiLCAgT0ZGU0VUKHdoaXRlcHQpLCBBVl9PUFRfVFlQRV9DT0xPUiwgeyAuc3RyID0gIndoaXRlIiB9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAic21vb3RoaW5nIiwgICJhbW91bnQgb2YgdGVtcG9yYWwgc21vb3RoaW5nIG9mIHRoZSBpbnB1dCByYW5nZSwgdG8gcmVkdWNlIGZsaWNrZXIiLCBPRkZTRVQoc21vb3RoaW5nKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgSU5UX01BWC84LCBGTEFHUyB9LAorICAgIHsgImluZGVwZW5kZW5jZSIsICJwcm9wb3J0aW9uIG9mIGluZGVwZW5kZW50IHRvIGxpbmtlZCBjaGFubmVsIG5vcm1hbGl6YXRpb24iLCBPRkZTRVQoaW5kZXBlbmRlbmNlKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIDAuMCwgMS4wLCBGTEFHUyB9LAorICAgIHsgInN0cmVuZ3RoIiwgInN0cmVuZ3RoIG9mIGZpbHRlciwgZnJvbSBubyBlZmZlY3QgdG8gZnVsbCBub3JtYWxpemF0aW9uIiwgT0ZGU0VUKHN0cmVuZ3RoKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTEuMH0sIDAuMCwgMS4wLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Mobm9ybWFsaXplKTsKKworLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWFpbiBndXRzIG9mIHRoZSBmaWx0ZXIuIE5vcm1hbGl6ZXMgdGhlIGlucHV0IGZyYW1lCisvLyBpbnRvIHRoZSBvdXRwdXQgZnJhbWUuIFRoZSBmcmFtZXMgYXJlIGtub3duIHRvIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9ucworLy8gYW5kIHBpeGVsIGZvcm1hdC4KK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZShOb3JtYWxpemVDb250ZXh0ICpzLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0KQoreworICAgIC8vIFBlci1leHRyZW11bSwgcGVyLWNoYW5uZWwgbG9jYWwgdmFyaWFibGVzLgorICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ4X3QgaW47ICAgICAvLyBPcmlnaW5hbCBpbnB1dCBieXRlIHZhbHVlIGZvciB0aGlzIGZyYW1lLgorICAgICAgICBmbG9hdCBzbW9vdGhlZDsgLy8gU21vb3RoZWQgaW5wdXQgdmFsdWUgWzAsMjU1XS4KKyAgICAgICAgZmxvYXQgb3V0OyAgICAgIC8vIE91dHB1dCB2YWx1ZSBbMCwyNTVdLgorICAgIH0gbWluWzNdLCBtYXhbM107ICAgLy8gTWluIGFuZCBtYXggZm9yIGVhY2ggY2hhbm5lbCBpbiB7UixHLEJ9LgorCisgICAgZmxvYXQgcmdiX21pbl9zbW9vdGhlZDsgLy8gTWluIGlucHV0IHJhbmdlIGZvciBsaW5rZWQgbm9ybWFsaXphdGlvbgorICAgIGZsb2F0IHJnYl9tYXhfc21vb3RoZWQ7IC8vIE1heCBpbnB1dCByYW5nZSBmb3IgbGlua2VkIG5vcm1hbGl6YXRpb24KKyAgICB1aW50OF90IGx1dFszXVsyNTZdOyAgICAvLyBMb29rdXAgdGFibGUKKyAgICBpbnQgeCwgeSwgYzsKKworICAgIC8vIEZpcnN0LCBzY2FuIHRoZSBpbnB1dCBmcmFtZSB0byBmaW5kLCBmb3IgZWFjaCBjaGFubmVsLCB0aGUgbWluaW11bQorICAgIC8vIChtaW4uaW4pIGFuZCBtYXhpbXVtIChtYXguaW4pIHZhbHVlcyBwcmVzZW50IGluIHRoZSBjaGFubmVsLgorICAgIGZvciAoYyA9IDA7IGMgPCAzOyBjKyspCisgICAgICAgIG1pbltjXS5pbiA9IG1heFtjXS5pbiA9IGluLT5kYXRhWzBdW3MtPmNvW2NdXTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaW4tPmhlaWdodDsgeSsrKSB7CisgICAgICAgIHVpbnQ4X3QgKmlucCA9IGluLT5kYXRhWzBdICsgeSAqIGluLT5saW5lc2l6ZVswXTsKKyAgICAgICAgdWludDhfdCAqb3V0cCA9IG91dC0+ZGF0YVswXSArIHkgKiBvdXQtPmxpbmVzaXplWzBdOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgaW4tPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCAzOyBjKyspIHsKKyAgICAgICAgICAgICAgICBtaW5bY10uaW4gPSBGRk1JTihtaW5bY10uaW4sIGlucFtzLT5jb1tjXV0pOworICAgICAgICAgICAgICAgIG1heFtjXS5pbiA9IEZGTUFYKG1heFtjXS5pbiwgaW5wW3MtPmNvW2NdXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnAgKz0gcy0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgICAgICBvdXRwICs9IHMtPm51bV9jb21wb25lbnRzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gTmV4dCwgZm9yIGVhY2ggY2hhbm5lbCwgcHVzaCBtaW4uaW4gYW5kIG1heC5pbiBpbnRvIHRoZWlyIHJlc3BlY3RpdmUKKyAgICAvLyBoaXN0b3JpZXMsIHRvIGRldGVybWluZSB0aGUgbWluLnNtb290aGVkIGFuZCBtYXguc21vb3RoZWQgZm9yIHRoaXMgZnJhbWUuCisgICAgeworICAgICAgICBpbnQgaGlzdG9yeV9pZHggPSBzLT5mcmFtZV9udW0gJSBzLT5oaXN0b3J5X2xlbjsKKyAgICAgICAgLy8gQXNzdW1lIHRoZSBoaXN0b3J5IGlzIG5vdCB5ZXQgZnVsbDsgbnVtX2hpc3RvcnlfdmFscyBpcyB0aGUgbnVtYmVyCisgICAgICAgIC8vIG9mIGZyYW1lcyByZWNlaXZlZCBzbyBmYXIgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGZyYW1lLgorICAgICAgICBpbnQgbnVtX2hpc3RvcnlfdmFscyA9IHMtPmZyYW1lX251bSArIDE7CisgICAgICAgIGlmIChzLT5mcmFtZV9udW0gPj0gcy0+aGlzdG9yeV9sZW4pIHsKKyAgICAgICAgICAgIC8vVGhlIGhpc3RvcnkgaXMgZnVsbDsgZHJvcCBvbGRlc3QgdmFsdWUgYW5kIGNhcCBudW1faGlzdG9yeV92YWxzLgorICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IDM7IGMrKykgeworICAgICAgICAgICAgICAgIHMtPm1pbltjXS5oaXN0b3J5X3N1bSAtPSBzLT5taW5bY10uaGlzdG9yeVtoaXN0b3J5X2lkeF07CisgICAgICAgICAgICAgICAgcy0+bWF4W2NdLmhpc3Rvcnlfc3VtIC09IHMtPm1heFtjXS5oaXN0b3J5W2hpc3RvcnlfaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bV9oaXN0b3J5X3ZhbHMgPSBzLT5oaXN0b3J5X2xlbjsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3IgZWFjaCBleHRyZW11bSwgdXBkYXRlIGhpc3Rvcnlfc3VtIGFuZCBjYWxjdWxhdGUgc21vb3RoZWQgdmFsdWUKKyAgICAgICAgLy8gYXMgdGhlIHJvbGxpbmcgYXZlcmFnZSBvZiB0aGUgaGlzdG9yeSBlbnRyaWVzLgorICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMzsgYysrKSB7CisgICAgICAgICAgICBzLT5taW5bY10uaGlzdG9yeV9zdW0gKz0gKHMtPm1pbltjXS5oaXN0b3J5W2hpc3RvcnlfaWR4XSA9IG1pbltjXS5pbik7CisgICAgICAgICAgICBtaW5bY10uc21vb3RoZWQgPSBzLT5taW5bY10uaGlzdG9yeV9zdW0gLyAoZmxvYXQpbnVtX2hpc3RvcnlfdmFsczsKKyAgICAgICAgICAgIHMtPm1heFtjXS5oaXN0b3J5X3N1bSArPSAocy0+bWF4W2NdLmhpc3RvcnlbaGlzdG9yeV9pZHhdID0gbWF4W2NdLmluKTsKKyAgICAgICAgICAgIG1heFtjXS5zbW9vdGhlZCA9IHMtPm1heFtjXS5oaXN0b3J5X3N1bSAvIChmbG9hdCludW1faGlzdG9yeV92YWxzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRGV0ZXJtaW5lIHRoZSBpbnB1dCByYW5nZSBmb3IgbGlua2VkIG5vcm1hbGl6YXRpb24uIFRoaXMgaXMgc2ltcGx5IHRoZQorICAgIC8vIG1pbmltdW0gb2YgdGhlIHBlci1jaGFubmVsIG1pbmltdW1zLCBhbmQgdGhlIG1heGltdW0gb2YgdGhlIHBlci1jaGFubmVsCisgICAgLy8gbWF4aW11bXMuCisgICAgcmdiX21pbl9zbW9vdGhlZCA9IEZGTUlOMyhtaW5bMF0uc21vb3RoZWQsIG1pblsxXS5zbW9vdGhlZCwgbWluWzJdLnNtb290aGVkKTsKKyAgICByZ2JfbWF4X3Ntb290aGVkID0gRkZNQVgzKG1heFswXS5zbW9vdGhlZCwgbWF4WzFdLnNtb290aGVkLCBtYXhbMl0uc21vb3RoZWQpOworCisgICAgLy8gTm93LCBwcm9jZXNzIGVhY2ggY2hhbm5lbCB0byBkZXRlcm1pbmUgdGhlIGlucHV0IGFuZCBvdXRwdXQgcmFuZ2UgYW5kCisgICAgLy8gYnVpbGQgdGhlIGxvb2t1cCB0YWJsZXMuCisgICAgZm9yIChjID0gMDsgYyA8IDM7IGMrKykgeworICAgICAgICBpbnQgaW5fdmFsOworICAgICAgICAvLyBBZGp1c3QgdGhlIGlucHV0IHJhbmdlIGZvciB0aGlzIGNoYW5uZWwgW21pbi5zbW9vdGhlZCxtYXguc21vb3RoZWRdCisgICAgICAgIC8vIGJ5IG1peGluZyBpbiB0aGUgY29ycmVjdCBwcm9wb3J0aW9uIG9mIHRoZSBsaW5rZWQgbm9ybWFsaXphdGlvbgorICAgICAgICAvLyBpbnB1dCByYW5nZSBbcmdiX21pbl9zbW9vdGhlZCxyZ2JfbWF4X3Ntb290aGVkXS4KKyAgICAgICAgbWluW2NdLnNtb290aGVkID0gKG1pbltjXS5zbW9vdGhlZCAgKiAgICAgICAgIHMtPmluZGVwZW5kZW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKHJnYl9taW5fc21vb3RoZWQgKiAoMS4wZiAtIHMtPmluZGVwZW5kZW5jZSkpOworICAgICAgICBtYXhbY10uc21vb3RoZWQgPSAobWF4W2NdLnNtb290aGVkICAqICAgICAgICAgcy0+aW5kZXBlbmRlbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAocmdiX21heF9zbW9vdGhlZCAqICgxLjBmIC0gcy0+aW5kZXBlbmRlbmNlKSk7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBvdXRwdXQgcmFuZ2UgW21pbi5vdXQsbWF4Lm91dF0gYXMgYSByYXRpbyBvZiB0aGUgZnVsbC0KKyAgICAgICAgLy8gc3RyZW5ndGggb3V0cHV0IHJhbmdlIFtibGFja3B0LHdoaXRlcHRdIGFuZCB0aGUgb3JpZ2luYWwgaW5wdXQgcmFuZ2UKKyAgICAgICAgLy8gW21pbi5pbixtYXguaW5dLCBiYXNlZCBvbiB0aGUgdXNlci1zcGVjaWZpZWQgZmlsdGVyIHN0cmVuZ3RoLgorICAgICAgICBtaW5bY10ub3V0ID0gKHMtPmJsYWNrcHRbY10gKiAgICAgICAgIHMtPnN0cmVuZ3RoKQorICAgICAgICAgICAgICAgICAgICsgKG1pbltjXS5pbiAgICAgKiAoMS4wZiAtIHMtPnN0cmVuZ3RoKSk7CisgICAgICAgIG1heFtjXS5vdXQgPSAocy0+d2hpdGVwdFtjXSAqICAgICAgICAgcy0+c3RyZW5ndGgpCisgICAgICAgICAgICAgICAgICAgKyAobWF4W2NdLmluICAgICAqICgxLjBmIC0gcy0+c3RyZW5ndGgpKTsKKworICAgICAgICAvLyBOb3csIGJ1aWxkIGEgbG9va3VwIHRhYmxlIHdoaWNoIGxpbmVhcmx5IG1hcHMgdGhlIGFkanVzdGVkIGlucHV0IHJhbmdlCisgICAgICAgIC8vIFttaW4uc21vb3RoZWQsbWF4LnNtb290aGVkXSB0byB0aGUgb3V0cHV0IHJhbmdlIFttaW4ub3V0LG1heC5vdXRdLgorICAgICAgICAvLyBQZXJmb3JtIHRoZSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBmb3IgZWFjaCB4OgorICAgICAgICAvLyAgICAgbHV0W3hdID0gKGludCkoZmxvYXQoeCAtIG1pbi5zbW9vdGhlZCkgKiBzY2FsZSArIG1heC5vdXQgKyAwLjUpCisgICAgICAgIC8vIHdoZXJlIHNjYWxlID0gKG1heC5vdXQgLSBtaW4ub3V0KSAvIChtYXguc21vb3RoZWQgLSBtaW4uc21vb3RoZWQpCisgICAgICAgIGlmIChtaW5bY10uc21vb3RoZWQgPT0gbWF4W2NdLnNtb290aGVkKSB7CisgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBkeW5hbWljIHJhbmdlIHRvIGV4cGFuZC4gTm8gbWFwcGluZyBmb3IgdGhpcyBjaGFubmVsLgorICAgICAgICAgICAgZm9yIChpbl92YWwgPSBtaW5bY10uaW47IGluX3ZhbCA8PSBtYXhbY10uaW47IGluX3ZhbCsrKQorICAgICAgICAgICAgICAgIGx1dFtjXVtpbl92YWxdID0gbWluW2NdLm91dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIG11c3Qgc2V0IGxvb2t1cCB2YWx1ZXMgZm9yIGFsbCB2YWx1ZXMgaW4gdGhlIG9yaWdpbmFsIGlucHV0CisgICAgICAgICAgICAvLyByYW5nZSBbbWluLmluLG1heC5pbl0uIFNpbmNlIHRoZSBvcmlnaW5hbCBpbnB1dCByYW5nZSBtYXkgYmUKKyAgICAgICAgICAgIC8vIGxhcmdlciB0aGFuIFttaW4uc21vb3RoZWQsbWF4LnNtb290aGVkXSwgc29tZSBvdXRwdXQgdmFsdWVzIG1heQorICAgICAgICAgICAgLy8gZmFsbCBvdXRzaWRlIHRoZSBbMCwyNTVdIGR5bmFtaWMgcmFuZ2UuIFdlIG5lZWQgdG8gY2xhbXAgdGhlbS4KKyAgICAgICAgICAgIGZsb2F0IHNjYWxlID0gKG1heFtjXS5vdXQgLSBtaW5bY10ub3V0KSAvIChtYXhbY10uc21vb3RoZWQgLSBtaW5bY10uc21vb3RoZWQpOworICAgICAgICAgICAgZm9yIChpbl92YWwgPSBtaW5bY10uaW47IGluX3ZhbCA8PSBtYXhbY10uaW47IGluX3ZhbCsrKSB7CisgICAgICAgICAgICAgICAgaW50IG91dF92YWwgPSAoaW5fdmFsIC0gbWluW2NdLnNtb290aGVkKSAqIHNjYWxlICsgbWluW2NdLm91dCArIDAuNWY7CisgICAgICAgICAgICAgICAgb3V0X3ZhbCA9IEZGTUFYKG91dF92YWwsIDApOworICAgICAgICAgICAgICAgIG91dF92YWwgPSBGRk1JTihvdXRfdmFsLCAyNTUpOworICAgICAgICAgICAgICAgIGx1dFtjXVtpbl92YWxdID0gb3V0X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZpbmFsbHksIHByb2Nlc3MgdGhlIHBpeGVscyBvZiB0aGUgaW5wdXQgZnJhbWUgdXNpbmcgdGhlIGxvb2t1cCB0YWJsZXMuCisgICAgZm9yICh5ID0gMDsgeSA8IGluLT5oZWlnaHQ7IHkrKykgeworICAgICAgICB1aW50OF90ICppbnAgPSBpbi0+ZGF0YVswXSArIHkgKiBpbi0+bGluZXNpemVbMF07CisgICAgICAgIHVpbnQ4X3QgKm91dHAgPSBvdXQtPmRhdGFbMF0gKyB5ICogb3V0LT5saW5lc2l6ZVswXTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGluLT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMzsgYysrKQorICAgICAgICAgICAgICAgIG91dHBbcy0+Y29bY11dID0gbHV0W2NdW2lucFtzLT5jb1tjXV1dOworICAgICAgICAgICAgaWYgKHMtPm51bV9jb21wb25lbnRzID09IDQpCisgICAgICAgICAgICAgICAgLy8gQ29weSBhbHBoYSBhcy1pcy4KKyAgICAgICAgICAgICAgICBvdXRwW3MtPmNvWzNdXSA9IGlucFtzLT5jb1szXV07CisgICAgICAgICAgICBpbnAgKz0gcy0+bnVtX2NvbXBvbmVudHM7CisgICAgICAgICAgICBvdXRwICs9IHMtPm51bV9jb21wb25lbnRzOworICAgICAgICB9CisgICAgfQorCisgICAgcy0+ZnJhbWVfbnVtKys7Cit9CisKKy8vIE5vdyB3ZSBkZWZpbmUgYWxsIHRoZSBmdW5jdGlvbnMgYWNjZXNzaWJsZSBmcm9tIHRoZSBmZl92Zl9ub3JtYWxpemUgY2xhc3MsCisvLyB3aGljaCBpcyBmZm1wZWcncyBpbnRlcmZhY2UgdG8gb3VyIGZpbHRlci4gIFNlZSBkb2MvZmlsdGVyX2Rlc2lnbi50eHQgYW5kCisvLyBkb2Mvd3JpdGluZ19maWx0ZXJzLnR4dCBmb3IgZGVzY3JpcHRpb25zIG9mIHdoYXQgdGhlc2UgaW50ZXJmYWNlIGZ1bmN0aW9ucworLy8gYXJlIGV4cGVjdGVkIHRvIGRvLgorCisvLyBTZXQgdGhlIHBpeGVsIGZvcm1hdHMgdGhhdCBvdXIgZmlsdGVyIHN1cHBvcnRzLiBXZSBzaG91bGQgYmUgYWJsZSB0byBwcm9jZXNzCisvLyBhbnkgOC1iaXQgUkdCIGZvcm1hdHMuIDE2LWJpdCBzdXBwb3J0IG1pZ2h0IGJlIHVzZWZ1bCBvbmUgZGF5Lgorc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4ZWxfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LAorICAgICAgICBBVl9QSVhfRk1UX0JHUjI0LAorICAgICAgICBBVl9QSVhfRk1UX0FSR0IsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQSwKKyAgICAgICAgQVZfUElYX0ZNVF9BQkdSLAorICAgICAgICBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfMFJHQiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IwLAorICAgICAgICBBVl9QSVhfRk1UXzBCR1IsCisgICAgICAgIEFWX1BJWF9GTVRfQkdSMCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICAvLyBBY2NvcmRpbmcgdG8gZmlsdGVyX2Rlc2lnbi50eHQsIHVzaW5nIGZmX3NldF9jb21tb25fZm9ybWF0cygpIHRoaXMgd2F5CisgICAgLy8gZW5zdXJlcyB0aGUgcGl4ZWwgZm9ybWF0cyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCB3aWxsIGJlIHRoZSBzYW1lLiBUaGF0CisgICAgLy8gc2F2ZXMgYSBiaXQgb2YgZWZmb3J0IHBvc3NpYmx5IG5lZWRpbmcgdG8gaGFuZGxlIGZvcm1hdCBjb252ZXJzaW9ucy4KKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeGVsX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7Cit9CisKKy8vIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGUgcGl4ZWwgZm9ybWF0IHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dC4gIFdlCisvLyBjYW4gYWxzbyBhY2Nlc3MgdGhlIGZyYW1lIHJhdGUgb2YgdGhlIGlucHV0IHZpZGVvIGFuZCBhbGxvY2F0ZSBzb21lIG1lbW9yeQorLy8gYXBwcm9wcmlhdGVseQorc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgTm9ybWFsaXplQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIC8vIFN0b3JlIG9mZnNldHMgdG8gUixHLEIsQSBieXRlcyByZXNwZWN0aXZlbHkgaW4gZWFjaCBwaXhlbAorICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCBjOworCisgICAgZm9yIChjID0gMDsgYyA8IDQ7ICsrYykKKyAgICAgICAgcy0+Y29bY10gPSBkZXNjLT5jb21wW2NdLm9mZnNldDsKKyAgICBzLT5udW1fY29tcG9uZW50cyA9IGRlc2MtPm5iX2NvbXBvbmVudHM7CisgICAgLy8gQ29udmVydCBzbW9vdGhpbmcgdmFsdWUgdG8gaGlzdG9yeV9sZW4gKGEgY291bnQgb2YgZnJhbWVzIHRvIGF2ZXJhZ2UsCisgICAgLy8gbXVzdCBiZSBhdCBsZWFzdCAxKS4gIEN1cnJlbnRseSB0aGlzIGlzIGEgZGlyZWN0IGFzc2lnbm1lbnQsIGJ1dCB0aGUKKyAgICAvLyBzbW9vdGhpbmcgdmFsdWUgd2FzIG9yaWdpbmFsbHkgZW52aXNhZ2VkIGFzIGEgbnVtYmVyIG9mIHNlY29uZHMuICBJbgorICAgIC8vIGZ1dHVyZSBpdCB3b3VsZCBiZSBuaWNlIHRvIHNldCBoaXN0b3J5X2xlbiB1c2luZyBhIG51bWJlciBvZiBzZWNvbmRzLAorICAgIC8vIGJ1dCBWRlIgdmlkZW8gaXMgY3VycmVudGx5IGFuIG9ic3RhY2xlIHRvIGRvaW5nIHNvLgorICAgIHMtPmhpc3RvcnlfbGVuID0gcy0+c21vb3RoaW5nICsgMTsKKyAgICAvLyBBbGxvY2F0ZSB0aGUgaGlzdG9yeSBidWZmZXJzIC0tIHRoZXJlIGFyZSA2IC0tIG9uZSBmb3IgZWFjaCBleHRyZW1hLgorICAgIC8vIHMtPnNtb290aGluZyBpcyBsaW1pdGVkIHRvIElOVF9NQVgvOCwgc28gdGhhdCAocy0+aGlzdG9yeV9sZW4gKiA2KQorICAgIC8vIGNhbid0IG92ZXJmbG93IG9uIDMyYml0IGNhdXNpbmcgYSB0b28tc21hbGwgYWxsb2NhdGlvbi4KKyAgICBzLT5oaXN0b3J5X21lbSA9IGF2X21hbGxvYyhzLT5oaXN0b3J5X2xlbiAqIDYpOworICAgIGlmIChzLT5oaXN0b3J5X21lbSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChjID0gMDsgYyA8IDM7IGMrKykgeworICAgICAgICBzLT5taW5bY10uaGlzdG9yeSA9IHMtPmhpc3RvcnlfbWVtICsgKGMqMikgICAqIHMtPmhpc3RvcnlfbGVuOworICAgICAgICBzLT5tYXhbY10uaGlzdG9yeSA9IHMtPmhpc3RvcnlfbWVtICsgKGMqMisxKSAqIHMtPmhpc3RvcnlfbGVuOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLy8gRnJlZSBhbnkgbWVtb3J5IGFsbG9jYXRpb25zIGhlcmUKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE5vcm1hbGl6ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmcy0+aGlzdG9yeV9tZW0pOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHByZXR0eSBtdWNoIHN0YW5kYXJkIGZyb20gZG9jL3dyaXRpbmdfZmlsdGVycy50eHQuICBJdAorLy8gdHJpZXMgdG8gZG8gaW4tcGxhY2UgZmlsdGVyaW5nIHdoZXJlIHBvc3NpYmxlLCBvbmx5IGFsbG9jYXRpbmcgYSBuZXcgb3V0cHV0CisvLyBmcmFtZSB3aGVuIGFic29sdXRlbHkgbmVjZXNzYXJ5Lgorc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIE5vcm1hbGl6ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0OworICAgIC8vIFNldCAnZGlyZWN0JyBpZiB3ZSBjYW4gbW9kaWZ5IHRoZSBpbnB1dCBmcmFtZSBpbi1wbGFjZS4gIE90aGVyd2lzZSB3ZQorICAgIC8vIG5lZWQgdG8gcmV0cmlldmUgYSBuZXcgZnJhbWUgZnJvbSB0aGUgb3V0cHV0IGxpbmsuCisgICAgaW50IGRpcmVjdCA9IGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSAmJiAhY3R4LT5pc19kaXNhYmxlZDsKKworICAgIGlmIChkaXJlY3QpIHsKKyAgICAgICAgb3V0ID0gaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKKyAgICAgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICB9CisKKyAgICAvLyBOb3cgd2UndmUgZ290IHRoZSBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lcyAod2hpY2ggbWF5IGJlIHRoZSBzYW1lIGZyYW1lKQorICAgIC8vIHBlcmZvcm0gdGhlIGZpbHRlcmluZyB3aXRoIG91ciBjdXN0b20gZnVuY3Rpb24uCisgICAgbm9ybWFsaXplKHMsIGluLCBvdXQpOworCisgICAgaWYgKGN0eC0+aXNfZGlzYWJsZWQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBpbik7CisgICAgfQorCisgICAgaWYgKCFkaXJlY3QpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX25vcm1hbGl6ZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJub3JtYWxpemUiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5vcm1hbGl6ZSBSR0IgdmlkZW8uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoTm9ybWFsaXplQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmbm9ybWFsaXplX2NsYXNzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IGlucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IG91dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfb2NyLmMgYi9saWJhdmZpbHRlci92Zl9vY3IuYwppbmRleCA4NzBkZDY4Li5hYmZmZjQ5IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9vY3IuYworKysgYi9saWJhdmZpbHRlci92Zl9vY3IuYwpAQCAtOTAsMTQgKzkwLDEyIEBACiAgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzX2xpc3QgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKICAgICBpZiAoIWZtdHNfbGlzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmbXRzX2xpc3QpOwotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZtdHNfbGlzdCk7CiB9CiAKIHN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKIHsKLSAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSA9IGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKGluKTsKKyAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSA9ICZpbi0+bWV0YWRhdGE7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKICAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CiAgICAgT0NSQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX292ZXJsYXkuYyBiL2xpYmF2ZmlsdGVyL3ZmX292ZXJsYXkuYwppbmRleCAzN2YxOWVhLi5jNmE2YWM4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9vdmVybGF5LmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfb3ZlcmxheS5jCkBAIC0zNiw4ICszNiw4IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lc3RhbXAuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgImR1YWxpbnB1dC5oIgogI2luY2x1ZGUgImRyYXd1dGlscy5oIgorI2luY2x1ZGUgImZyYW1lc3luYy5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAKIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKQEAgLTcwLDE2ICs3MCw2IEBACiAgICAgVkFSX1ZBUlNfTkIKIH07CiAKLWVudW0gRU9GQWN0aW9uIHsKLSAgICBFT0ZfQUNUSU9OX1JFUEVBVCwKLSAgICBFT0ZfQUNUSU9OX0VOREFMTCwKLSAgICBFT0ZfQUNUSU9OX1BBU1MKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZW9mX2FjdGlvbl9zdHJbXSA9IHsKLSAgICAicmVwZWF0IiwgImVuZGFsbCIsICJwYXNzIgotfTsKLQogI2RlZmluZSBNQUlOICAgIDAKICNkZWZpbmUgT1ZFUkxBWSAxCiAKQEAgLTEwMywxNCArOTMsMTUgQEAKICAgICBPVkVSTEFZX0ZPUk1BVF9ZVVY0MjIsCiAgICAgT1ZFUkxBWV9GT1JNQVRfWVVWNDQ0LAogICAgIE9WRVJMQVlfRk9STUFUX1JHQiwKKyAgICBPVkVSTEFZX0ZPUk1BVF9HQlJQLAorICAgIE9WRVJMQVlfRk9STUFUX0FVVE8sCiAgICAgT1ZFUkxBWV9GT1JNQVRfTkIKIH07CiAKIHR5cGVkZWYgc3RydWN0IE92ZXJsYXlDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKLSAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgICAgLy8vPCBwb3NpdGlvbiBvZiBvdmVybGF5ZWQgcGljdHVyZQorICAgIGludCB4LCB5OyAgICAgICAgICAgICAgICAgICAvLy88IHBvc2l0aW9uIG9mIG92ZXJsYWlkIHBpY3R1cmUKIAotICAgIGludCBhbGxvd19wYWNrZWRfcmdiOwogICAgIHVpbnQ4X3QgbWFpbl9pc19wYWNrZWRfcmdiOwogICAgIHVpbnQ4X3QgbWFpbl9yZ2JhX21hcFs0XTsKICAgICB1aW50OF90IG1haW5faGFzX2FscGhhOwpAQCAtMTE4LDI3ICsxMDksMjkgQEAKICAgICB1aW50OF90IG92ZXJsYXlfcmdiYV9tYXBbNF07CiAgICAgdWludDhfdCBvdmVybGF5X2hhc19hbHBoYTsKICAgICBpbnQgZm9ybWF0OyAgICAgICAgICAgICAgICAgLy8vPCBPdmVybGF5Rm9ybWF0CisgICAgaW50IGFscGhhX2Zvcm1hdDsKICAgICBpbnQgZXZhbF9tb2RlOyAgICAgICAgICAgICAgLy8vPCBFdmFsTW9kZQogCi0gICAgRkZEdWFsSW5wdXRDb250ZXh0IGRpbnB1dDsKKyAgICBGRkZyYW1lU3luYyBmczsKIAogICAgIGludCBtYWluX3BpeF9zdGVwWzRdOyAgICAgICAvLy88IHN0ZXBzIHBlciBwaXhlbCBmb3IgZWFjaCBwbGFuZSBvZiB0aGUgbWFpbiBvdXRwdXQKICAgICBpbnQgb3ZlcmxheV9waXhfc3RlcFs0XTsgICAgLy8vPCBzdGVwcyBwZXIgcGl4ZWwgZm9yIGVhY2ggcGxhbmUgb2YgdGhlIG92ZXJsYXkKICAgICBpbnQgaHN1YiwgdnN1YjsgICAgICAgICAgICAgLy8vPCBjaHJvbWEgc3Vic2FtcGxpbmcgdmFsdWVzCisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICptYWluX2Rlc2M7IC8vLzwgZm9ybWF0IGRlc2NyaXB0b3IgZm9yIG1haW4gaW5wdXQKIAogICAgIGRvdWJsZSB2YXJfdmFsdWVzW1ZBUl9WQVJTX05CXTsKICAgICBjaGFyICp4X2V4cHIsICp5X2V4cHI7CiAKLSAgICBpbnQgZW9mX2FjdGlvbjsgICAgICAgICAgICAgLy8vPCBhY3Rpb24gdG8gdGFrZSBvbiBFT0YgZnJvbSBzb3VyY2UKLQogICAgIEFWRXhwciAqeF9wZXhwciwgKnlfcGV4cHI7CisKKyAgICB2b2lkICgqYmxlbmRfaW1hZ2UpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KTsKIH0gT3ZlcmxheUNvbnRleHQ7CiAKIHN0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewogICAgIE92ZXJsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OwogCi0gICAgZmZfZHVhbGlucHV0X3VuaW5pdCgmcy0+ZGlucHV0KTsKKyAgICBmZl9mcmFtZXN5bmNfdW5pbml0KCZzLT5mcyk7CiAgICAgYXZfZXhwcl9mcmVlKHMtPnhfcGV4cHIpOyBzLT54X3BleHByID0gTlVMTDsKICAgICBhdl9leHByX2ZyZWUocy0+eV9wZXhwcik7IHMtPnlfcGV4cHIgPSBOVUxMOwogfQpAQCAtMTU2LDYgKzE0OSw3IEBACiAKICAgICBzLT52YXJfdmFsdWVzW1ZBUl9YXSA9IGF2X2V4cHJfZXZhbChzLT54X3BleHByLCBzLT52YXJfdmFsdWVzLCBOVUxMKTsKICAgICBzLT52YXJfdmFsdWVzW1ZBUl9ZXSA9IGF2X2V4cHJfZXZhbChzLT55X3BleHByLCBzLT52YXJfdmFsdWVzLCBOVUxMKTsKKyAgICAvKiBJdCBpcyBuZWNlc3NhcnkgaWYgeCBpcyBleHByZXNzZWQgZnJvbSB5ICAqLwogICAgIHMtPnZhcl92YWx1ZXNbVkFSX1hdID0gYXZfZXhwcl9ldmFsKHMtPnhfcGV4cHIsIHMtPnZhcl92YWx1ZXMsIE5VTEwpOwogICAgIHMtPnggPSBub3JtYWxpemVfeHkocy0+dmFyX3ZhbHVlc1tWQVJfWF0sIHMtPmhzdWIpOwogICAgIHMtPnkgPSBub3JtYWxpemVfeHkocy0+dmFyX3ZhbHVlc1tWQVJfWV0sIHMtPnZzdWIpOwpAQCAtMjA3LDMyICsyMDEsNDcgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGFscGhhX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwKKyAgICBBVl9QSVhfRk1UX0FSR0IsIEFWX1BJWF9GTVRfQUJHUiwgQVZfUElYX0ZNVF9SR0JBLAorICAgIEFWX1BJWF9GTVRfQkdSQSwgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9OT05FCit9OworCiBzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAKICAgICAvKiBvdmVybGF5IGZvcm1hdHMgY29udGFpbnMgYWxwaGEsIGZvciBhdm9pZGluZyBjb252ZXJzaW9uIHdpdGggYWxwaGEgaW5mb3JtYXRpb24gbG9zcyAqLwogICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbWFpbl9waXhfZm10c195dXY0MjBbXSA9IHsKLSAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX05PTkUKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05WMTIsIEFWX1BJWF9GTVRfTlYyMSwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG92ZXJsYXlfcGl4X2ZtdHNfeXV2NDIwW10gPSB7CiAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsIEFWX1BJWF9GTVRfTk9ORQogICAgIH07CiAKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG1haW5fcGl4X2ZtdHNfeXV2NDIyW10gPSB7Ci0gICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9OT05FCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIyUCwgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG92ZXJsYXlfcGl4X2ZtdHNfeXV2NDIyW10gPSB7CiAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfTk9ORQogICAgIH07CiAKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG1haW5fcGl4X2ZtdHNfeXV2NDQ0W10gPSB7Ci0gICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9OT05FCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG92ZXJsYXlfcGl4X2ZtdHNfeXV2NDQ0W10gPSB7CiAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfTk9ORQogICAgIH07CiAKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG1haW5fcGl4X2ZtdHNfZ2JycFtdID0geworICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdmVybGF5X3BpeF9mbXRzX2dicnBbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKwogICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbWFpbl9waXhfZm10c19yZ2JbXSA9IHsKICAgICAgICAgQVZfUElYX0ZNVF9BUkdCLCAgQVZfUElYX0ZNVF9SR0JBLAogICAgICAgICBBVl9QSVhfRk1UX0FCR1IsICBBVl9QSVhfRk1UX0JHUkEsCkBAIC0yNzgsMTQgKzI4NywzMyBAQAogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVkVSTEFZX0ZPUk1BVF9HQlJQOgorICAgICAgICBpZiAoIShtYWluX2Zvcm1hdHMgICAgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KG1haW5fcGl4X2ZtdHNfZ2JycCkpIHx8CisgICAgICAgICAgICAhKG92ZXJsYXlfZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3Qob3ZlcmxheV9waXhfZm10c19nYnJwKSkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX0FVVE86CisgICAgICAgIGlmICghKG1haW5fZm9ybWF0cyAgICA9IGZmX21ha2VfZm9ybWF0X2xpc3QoYWxwaGFfcGl4X2ZtdHMpKSkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2Fzc2VydDAoMCk7CiAgICAgfQogCi0gICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihtYWluX2Zvcm1hdHMgICAsICZjdHgtPmlucHV0c1tNQUlOXS0+b3V0X2Zvcm1hdHMgICApKSA8IDAgfHwKLSAgICAgICAgKHJldCA9IGZmX2Zvcm1hdHNfcmVmKG92ZXJsYXlfZm9ybWF0cywgJmN0eC0+aW5wdXRzW09WRVJMQVldLT5vdXRfZm9ybWF0cykpIDwgMCB8fAotICAgICAgICAocmV0ID0gZmZfZm9ybWF0c19yZWYobWFpbl9mb3JtYXRzICAgLCAmY3R4LT5vdXRwdXRzW01BSU5dLT5pbl9mb3JtYXRzICAgKSkgPCAwKQorICAgIGlmIChzLT5mb3JtYXQgPT0gT1ZFUkxBWV9GT1JNQVRfQVVUTykgeworICAgICAgICByZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBtYWluX2Zvcm1hdHMpOworICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoKHJldCA9IGZmX2Zvcm1hdHNfcmVmKG1haW5fZm9ybWF0cyAgICwgJmN0eC0+aW5wdXRzW01BSU5dLT5vdXRfZm9ybWF0cyAgICkpIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGZmX2Zvcm1hdHNfcmVmKG92ZXJsYXlfZm9ybWF0cywgJmN0eC0+aW5wdXRzW09WRVJMQVldLT5vdXRfZm9ybWF0cykpIDwgMCB8fAorICAgICAgICAgICAgKHJldCA9IGZmX2Zvcm1hdHNfcmVmKG1haW5fZm9ybWF0cyAgICwgJmN0eC0+b3V0cHV0c1tNQUlOXS0+aW5fZm9ybWF0cyAgICkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQogCiAgICAgcmV0dXJuIDA7CiBmYWlsOgpAQCAtMjk4LDI4ICszMjYsNiBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgYWxwaGFfcGl4X2ZtdHNbXSA9IHsKLSAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLAotICAgIEFWX1BJWF9GTVRfQVJHQiwgQVZfUElYX0ZNVF9BQkdSLCBBVl9QSVhfRk1UX1JHQkEsCi0gICAgQVZfUElYX0ZNVF9CR1JBLCBBVl9QSVhfRk1UX05PTkUKLX07Ci0KLXN0YXRpYyBpbnQgY29uZmlnX2lucHV0X21haW4oQVZGaWx0ZXJMaW5rICppbmxpbmspCi17Ci0gICAgT3ZlcmxheUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7Ci0KLSAgICBhdl9pbWFnZV9maWxsX21heF9waXhzdGVwcyhzLT5tYWluX3BpeF9zdGVwLCAgICBOVUxMLCBwaXhfZGVzYyk7Ci0KLSAgICBzLT5oc3ViID0gcGl4X2Rlc2MtPmxvZzJfY2hyb21hX3c7Ci0gICAgcy0+dnN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oOwotCi0gICAgcy0+bWFpbl9pc19wYWNrZWRfcmdiID0KLSAgICAgICAgZmZfZmlsbF9yZ2JhX21hcChzLT5tYWluX3JnYmFfbWFwLCBpbmxpbmstPmZvcm1hdCkgPj0gMDsKLSAgICBzLT5tYWluX2hhc19hbHBoYSA9IGZmX2ZtdF9pc19pbihpbmxpbmstPmZvcm1hdCwgYWxwaGFfcGl4X2ZtdHMpOwotICAgIHJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IGNvbmZpZ19pbnB1dF9vdmVybGF5KEFWRmlsdGVyTGluayAqaW5saW5rKQogewogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OwpAQCAtMzU5LDEyICszNjUsMTEgQEAKICAgICB9CiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKLSAgICAgICAgICAgIm1haW4gdzolZCBoOiVkIGZtdDolcyBvdmVybGF5IHc6JWQgaDolZCBmbXQ6JXMgZW9mX2FjdGlvbjolc1xuIiwKKyAgICAgICAgICAgIm1haW4gdzolZCBoOiVkIGZtdDolcyBvdmVybGF5IHc6JWQgaDolZCBmbXQ6JXNcbiIsCiAgICAgICAgICAgIGN0eC0+aW5wdXRzW01BSU5dLT53LCBjdHgtPmlucHV0c1tNQUlOXS0+aCwKICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjdHgtPmlucHV0c1tNQUlOXS0+Zm9ybWF0KSwKICAgICAgICAgICAgY3R4LT5pbnB1dHNbT1ZFUkxBWV0tPncsIGN0eC0+aW5wdXRzW09WRVJMQVldLT5oLAotICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGN0eC0+aW5wdXRzW09WRVJMQVldLT5mb3JtYXQpLAotICAgICAgICAgICBlb2ZfYWN0aW9uX3N0cltzLT5lb2ZfYWN0aW9uXSk7CisgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5pbnB1dHNbT1ZFUkxBWV0tPmZvcm1hdCkpOwogICAgIHJldHVybiAwOwogfQogCkBAIC0zNzQsMTQgKzM3OSwxNCBAQAogICAgIE92ZXJsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIGludCByZXQ7CiAKLSAgICBpZiAoKHJldCA9IGZmX2R1YWxpbnB1dF9pbml0KGN0eCwgJnMtPmRpbnB1dCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19pbml0X2R1YWxpbnB1dCgmcy0+ZnMsIGN0eCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIG91dGxpbmstPncgPSBjdHgtPmlucHV0c1tNQUlOXS0+dzsKICAgICBvdXRsaW5rLT5oID0gY3R4LT5pbnB1dHNbTUFJTl0tPmg7CiAgICAgb3V0bGluay0+dGltZV9iYXNlID0gY3R4LT5pbnB1dHNbTUFJTl0tPnRpbWVfYmFzZTsKIAotICAgIHJldHVybiAwOworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZzLT5mcyk7CiB9CiAKIC8vIGRpdmlkZSBieSAyNTUgYW5kIHJvdW5kIHRvIG5lYXJlc3QKQEAgLTM5NywyMDQgKzQwMiw0OTIgQEAKIC8qKgogICogQmxlbmQgaW1hZ2UgaW4gc3JjIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlciBkc3QgYXQgcG9zaXRpb24gKHgsIHkpLgogICovCi1zdGF0aWMgdm9pZCBibGVuZF9pbWFnZShBVkZpbHRlckNvbnRleHQgKmN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGJsZW5kX2ltYWdlX3BhY2tlZF9yZ2IoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFpbl9oYXNfYWxwaGEsIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3N0cmFpZ2h0KQogewogICAgIE92ZXJsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIGludCBpLCBpbWF4LCBqLCBqbWF4LCBrLCBrbWF4OworICAgIGludCBpLCBpbWF4LCBqLCBqbWF4OworICAgIGNvbnN0IGludCBzcmNfdyA9IHNyYy0+d2lkdGg7CisgICAgY29uc3QgaW50IHNyY19oID0gc3JjLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IGRzdF93ID0gZHN0LT53aWR0aDsKKyAgICBjb25zdCBpbnQgZHN0X2ggPSBkc3QtPmhlaWdodDsKKyAgICB1aW50OF90IGFscGhhOyAgICAgICAgICAvLy88IHRoZSBhbW91bnQgb2Ygb3ZlcmxheSB0byBibGVuZCBvbiB0byBtYWluCisgICAgY29uc3QgaW50IGRyID0gcy0+bWFpbl9yZ2JhX21hcFtSXTsKKyAgICBjb25zdCBpbnQgZGcgPSBzLT5tYWluX3JnYmFfbWFwW0ddOworICAgIGNvbnN0IGludCBkYiA9IHMtPm1haW5fcmdiYV9tYXBbQl07CisgICAgY29uc3QgaW50IGRhID0gcy0+bWFpbl9yZ2JhX21hcFtBXTsKKyAgICBjb25zdCBpbnQgZHN0ZXAgPSBzLT5tYWluX3BpeF9zdGVwWzBdOworICAgIGNvbnN0IGludCBzciA9IHMtPm92ZXJsYXlfcmdiYV9tYXBbUl07CisgICAgY29uc3QgaW50IHNnID0gcy0+b3ZlcmxheV9yZ2JhX21hcFtHXTsKKyAgICBjb25zdCBpbnQgc2IgPSBzLT5vdmVybGF5X3JnYmFfbWFwW0JdOworICAgIGNvbnN0IGludCBzYSA9IHMtPm92ZXJsYXlfcmdiYV9tYXBbQV07CisgICAgY29uc3QgaW50IHNzdGVwID0gcy0+b3ZlcmxheV9waXhfc3RlcFswXTsKKyAgICB1aW50OF90ICpTLCAqc3AsICpkLCAqZHA7CisKKyAgICBpID0gRkZNQVgoLXksIDApOworICAgIHNwID0gc3JjLT5kYXRhWzBdICsgaSAgICAgKiBzcmMtPmxpbmVzaXplWzBdOworICAgIGRwID0gZHN0LT5kYXRhWzBdICsgKHkraSkgKiBkc3QtPmxpbmVzaXplWzBdOworCisgICAgZm9yIChpbWF4ID0gRkZNSU4oLXkgKyBkc3RfaCwgc3JjX2gpOyBpIDwgaW1heDsgaSsrKSB7CisgICAgICAgIGogPSBGRk1BWCgteCwgMCk7CisgICAgICAgIFMgPSBzcCArIGogICAgICogc3N0ZXA7CisgICAgICAgIGQgPSBkcCArICh4K2opICogZHN0ZXA7CisKKyAgICAgICAgZm9yIChqbWF4ID0gRkZNSU4oLXggKyBkc3Rfdywgc3JjX3cpOyBqIDwgam1heDsgaisrKSB7CisgICAgICAgICAgICBhbHBoYSA9IFNbc2FdOworCisgICAgICAgICAgICAvLyBpZiB0aGUgbWFpbiBjaGFubmVsIGhhcyBhbiBhbHBoYSBjaGFubmVsLCBhbHBoYSBoYXMgdG8gYmUgY2FsY3VsYXRlZAorICAgICAgICAgICAgLy8gdG8gY3JlYXRlIGFuIHVuLXByZW11bHRpcGxpZWQgKHN0cmFpZ2h0KSBhbHBoYSB2YWx1ZQorICAgICAgICAgICAgaWYgKG1haW5faGFzX2FscGhhICYmIGFscGhhICE9IDAgJiYgYWxwaGEgIT0gMjU1KSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBhbHBoYV9kID0gZFtkYV07CisgICAgICAgICAgICAgICAgYWxwaGEgPSBVTlBSRU1VTFRJUExZX0FMUEhBKGFscGhhLCBhbHBoYV9kKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHBoYSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNTU6CisgICAgICAgICAgICAgICAgZFtkcl0gPSBTW3NyXTsKKyAgICAgICAgICAgICAgICBkW2RnXSA9IFNbc2ddOworICAgICAgICAgICAgICAgIGRbZGJdID0gU1tzYl07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIG1haW5fdmFsdWUgPSBtYWluX3ZhbHVlICogKDEgLSBhbHBoYSkgKyBvdmVybGF5X3ZhbHVlICogYWxwaGEKKyAgICAgICAgICAgICAgICAvLyBzaW5jZSBhbHBoYSBpcyBpbiB0aGUgcmFuZ2UgMC0yNTUsIHRoZSByZXN1bHQgbXVzdCBkaXZpZGVkIGJ5IDI1NQorICAgICAgICAgICAgICAgIGRbZHJdID0gaXNfc3RyYWlnaHQgPyBGQVNUX0RJVjI1NShkW2RyXSAqICgyNTUgLSBhbHBoYSkgKyBTW3NyXSAqIGFscGhhKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBGRk1JTihGQVNUX0RJVjI1NShkW2RyXSAqICgyNTUgLSBhbHBoYSkpICsgU1tzcl0sIDI1NSk7CisgICAgICAgICAgICAgICAgZFtkZ10gPSBpc19zdHJhaWdodCA/IEZBU1RfRElWMjU1KGRbZGddICogKDI1NSAtIGFscGhhKSArIFNbc2ddICogYWxwaGEpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKEZBU1RfRElWMjU1KGRbZGddICogKDI1NSAtIGFscGhhKSkgKyBTW3NnXSwgMjU1KTsKKyAgICAgICAgICAgICAgICBkW2RiXSA9IGlzX3N0cmFpZ2h0ID8gRkFTVF9ESVYyNTUoZFtkYl0gKiAoMjU1IC0gYWxwaGEpICsgU1tzYl0gKiBhbHBoYSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oRkFTVF9ESVYyNTUoZFtkYl0gKiAoMjU1IC0gYWxwaGEpKSArIFNbc2JdLCAyNTUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1haW5faGFzX2FscGhhKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHBoYSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyNTU6CisgICAgICAgICAgICAgICAgICAgIGRbZGFdID0gU1tzYV07CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IGFscGhhIGNvbXBvc2l0aW5nOiBtYWluX2FscGhhICs9ICgxLW1haW5fYWxwaGEpICogb3ZlcmxheV9hbHBoYQorICAgICAgICAgICAgICAgICAgICBkW2RhXSArPSBGQVNUX0RJVjI1NSgoMjU1IC0gZFtkYV0pICogU1tzYV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGQgKz0gZHN0ZXA7CisgICAgICAgICAgICBTICs9IHNzdGVwOworICAgICAgICB9CisgICAgICAgIGRwICs9IGRzdC0+bGluZXNpemVbMF07CisgICAgICAgIHNwICs9IHNyYy0+bGluZXNpemVbMF07CisgICAgfQorfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGJsZW5kX3BsYW5lKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193LCBpbnQgc3JjX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfdywgaW50IGRzdF9oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGhzdWIsIGludCB2c3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYWluX2hhc19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9wbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmFpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXV2KQoreworICAgIGludCBzcmNfd3AgPSBBVl9DRUlMX1JTSElGVChzcmNfdywgaHN1Yik7CisgICAgaW50IHNyY19ocCA9IEFWX0NFSUxfUlNISUZUKHNyY19oLCB2c3ViKTsKKyAgICBpbnQgZHN0X3dwID0gQVZfQ0VJTF9SU0hJRlQoZHN0X3csIGhzdWIpOworICAgIGludCBkc3RfaHAgPSBBVl9DRUlMX1JTSElGVChkc3RfaCwgdnN1Yik7CisgICAgaW50IHlwID0geT4+dnN1YjsKKyAgICBpbnQgeHAgPSB4Pj5oc3ViOworICAgIHVpbnQ4X3QgKnMsICpzcCwgKmQsICpkcCwgKmRhcCwgKmEsICpkYSwgKmFwOworICAgIGludCBqbWF4LCBqLCBrLCBrbWF4OworCisgICAgaiA9IEZGTUFYKC15cCwgMCk7CisgICAgc3AgPSBzcmMtPmRhdGFbaV0gKyBqICAgICAgICAgKiBzcmMtPmxpbmVzaXplW2ldOworICAgIGRwID0gZHN0LT5kYXRhW2RzdF9wbGFuZV0KKyAgICAgICAgICAgICAgICAgICAgICArICh5cCtqKSAgICAqIGRzdC0+bGluZXNpemVbZHN0X3BsYW5lXQorICAgICAgICAgICAgICAgICAgICAgICsgZHN0X29mZnNldDsKKyAgICBhcCA9IHNyYy0+ZGF0YVszXSArIChqPDx2c3ViKSAqIHNyYy0+bGluZXNpemVbM107CisgICAgZGFwID0gZHN0LT5kYXRhWzNdICsgKCh5cCtqKSA8PCB2c3ViKSAqIGRzdC0+bGluZXNpemVbM107CisKKyAgICBmb3IgKGptYXggPSBGRk1JTigteXAgKyBkc3RfaHAsIHNyY19ocCk7IGogPCBqbWF4OyBqKyspIHsKKyAgICAgICAgayA9IEZGTUFYKC14cCwgMCk7CisgICAgICAgIGQgPSBkcCArICh4cCtrKSAqIGRzdF9zdGVwOworICAgICAgICBzID0gc3AgKyBrOworICAgICAgICBhID0gYXAgKyAoazw8aHN1Yik7CisgICAgICAgIGRhID0gZGFwICsgKCh4cCtrKSA8PCBoc3ViKTsKKworICAgICAgICBmb3IgKGttYXggPSBGRk1JTigteHAgKyBkc3Rfd3AsIHNyY193cCk7IGsgPCBrbWF4OyBrKyspIHsKKyAgICAgICAgICAgIGludCBhbHBoYV92LCBhbHBoYV9oLCBhbHBoYTsKKworICAgICAgICAgICAgLy8gYXZlcmFnZSBhbHBoYSBmb3IgY29sb3IgY29tcG9uZW50cywgaW1wcm92ZSBxdWFsaXR5CisgICAgICAgICAgICBpZiAoaHN1YiAmJiB2c3ViICYmIGorMSA8IHNyY19ocCAmJiBrKzEgPCBzcmNfd3ApIHsKKyAgICAgICAgICAgICAgICBhbHBoYSA9IChhWzBdICsgYVtzcmMtPmxpbmVzaXplWzNdXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgYVsxXSArIGFbc3JjLT5saW5lc2l6ZVszXSsxXSkgPj4gMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaHN1YiB8fCB2c3ViKSB7CisgICAgICAgICAgICAgICAgYWxwaGFfaCA9IGhzdWIgJiYgaysxIDwgc3JjX3dwID8KKyAgICAgICAgICAgICAgICAgICAgKGFbMF0gKyBhWzFdKSA+PiAxIDogYVswXTsKKyAgICAgICAgICAgICAgICBhbHBoYV92ID0gdnN1YiAmJiBqKzEgPCBzcmNfaHAgPworICAgICAgICAgICAgICAgICAgICAoYVswXSArIGFbc3JjLT5saW5lc2l6ZVszXV0pID4+IDEgOiBhWzBdOworICAgICAgICAgICAgICAgIGFscGhhID0gKGFscGhhX3YgKyBhbHBoYV9oKSA+PiAxOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYWxwaGEgPSBhWzBdOworICAgICAgICAgICAgLy8gaWYgdGhlIG1haW4gY2hhbm5lbCBoYXMgYW4gYWxwaGEgY2hhbm5lbCwgYWxwaGEgaGFzIHRvIGJlIGNhbGN1bGF0ZWQKKyAgICAgICAgICAgIC8vIHRvIGNyZWF0ZSBhbiB1bi1wcmVtdWx0aXBsaWVkIChzdHJhaWdodCkgYWxwaGEgdmFsdWUKKyAgICAgICAgICAgIGlmIChtYWluX2hhc19hbHBoYSAmJiBhbHBoYSAhPSAwICYmIGFscGhhICE9IDI1NSkgeworICAgICAgICAgICAgICAgIC8vIGF2ZXJhZ2UgYWxwaGEgZm9yIGNvbG9yIGNvbXBvbmVudHMsIGltcHJvdmUgcXVhbGl0eQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWxwaGFfZDsKKyAgICAgICAgICAgICAgICBpZiAoaHN1YiAmJiB2c3ViICYmIGorMSA8IHNyY19ocCAmJiBrKzEgPCBzcmNfd3ApIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGFfZCA9IChkYVswXSArIGRhW2RzdC0+bGluZXNpemVbM11dICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYVsxXSArIGRhW2RzdC0+bGluZXNpemVbM10rMV0pID4+IDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChoc3ViIHx8IHZzdWIpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGFfaCA9IGhzdWIgJiYgaysxIDwgc3JjX3dwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIChkYVswXSArIGRhWzFdKSA+PiAxIDogZGFbMF07CisgICAgICAgICAgICAgICAgICAgIGFscGhhX3YgPSB2c3ViICYmIGorMSA8IHNyY19ocCA/CisgICAgICAgICAgICAgICAgICAgICAgICAoZGFbMF0gKyBkYVtkc3QtPmxpbmVzaXplWzNdXSkgPj4gMSA6IGRhWzBdOworICAgICAgICAgICAgICAgICAgICBhbHBoYV9kID0gKGFscGhhX3YgKyBhbHBoYV9oKSA+PiAxOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBhbHBoYV9kID0gZGFbMF07CisgICAgICAgICAgICAgICAgYWxwaGEgPSBVTlBSRU1VTFRJUExZX0FMUEhBKGFscGhhLCBhbHBoYV9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdHJhaWdodCkgeworICAgICAgICAgICAgICAgICpkID0gRkFTVF9ESVYyNTUoKmQgKiAoMjU1IC0gYWxwaGEpICsgKnMgKiBhbHBoYSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChpICYmIHl1dikKKyAgICAgICAgICAgICAgICAgICAgKmQgPSBhdl9jbGlwKEZBU1RfRElWMjU1KCgqZCAtIDEyOCkgKiAoMjU1IC0gYWxwaGEpKSArICpzIC0gMTI4LCAtMTI4LCAxMjgpICsgMTI4OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmQgPSBGRk1JTihGQVNUX0RJVjI1NSgqZCAqICgyNTUgLSBhbHBoYSkpICsgKnMsIDI1NSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzKys7CisgICAgICAgICAgICBkICs9IGRzdF9zdGVwOworICAgICAgICAgICAgZGEgKz0gMSA8PCBoc3ViOworICAgICAgICAgICAgYSArPSAxIDw8IGhzdWI7CisgICAgICAgIH0KKyAgICAgICAgZHAgKz0gZHN0LT5saW5lc2l6ZVtkc3RfcGxhbmVdOworICAgICAgICBzcCArPSBzcmMtPmxpbmVzaXplW2ldOworICAgICAgICBhcCArPSAoMSA8PCB2c3ViKSAqIHNyYy0+bGluZXNpemVbM107CisgICAgICAgIGRhcCArPSAoMSA8PCB2c3ViKSAqIGRzdC0+bGluZXNpemVbM107CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWxwaGFfY29tcG9zaXRlKGNvbnN0IEFWRnJhbWUgKnNyYywgY29uc3QgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3csIGludCBzcmNfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93LCBpbnQgZHN0X2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkKK3sKKyAgICB1aW50OF90IGFscGhhOyAgICAgICAgICAvLy88IHRoZSBhbW91bnQgb2Ygb3ZlcmxheSB0byBibGVuZCBvbiB0byBtYWluCisgICAgdWludDhfdCAqcywgKnNhLCAqZCwgKmRhOworICAgIGludCBpLCBpbWF4LCBqLCBqbWF4OworCisgICAgaSA9IEZGTUFYKC15LCAwKTsKKyAgICBzYSA9IHNyYy0+ZGF0YVszXSArIGkgICAgICogc3JjLT5saW5lc2l6ZVszXTsKKyAgICBkYSA9IGRzdC0+ZGF0YVszXSArICh5K2kpICogZHN0LT5saW5lc2l6ZVszXTsKKworICAgIGZvciAoaW1heCA9IEZGTUlOKC15ICsgZHN0X2gsIHNyY19oKTsgaSA8IGltYXg7IGkrKykgeworICAgICAgICBqID0gRkZNQVgoLXgsIDApOworICAgICAgICBzID0gc2EgKyBqOworICAgICAgICBkID0gZGEgKyB4K2o7CisKKyAgICAgICAgZm9yIChqbWF4ID0gRkZNSU4oLXggKyBkc3Rfdywgc3JjX3cpOyBqIDwgam1heDsgaisrKSB7CisgICAgICAgICAgICBhbHBoYSA9ICpzOworICAgICAgICAgICAgaWYgKGFscGhhICE9IDAgJiYgYWxwaGEgIT0gMjU1KSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBhbHBoYV9kID0gKmQ7CisgICAgICAgICAgICAgICAgYWxwaGEgPSBVTlBSRU1VTFRJUExZX0FMUEhBKGFscGhhLCBhbHBoYV9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWxwaGEpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjU1OgorICAgICAgICAgICAgICAgICpkID0gKnM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGFwcGx5IGFscGhhIGNvbXBvc2l0aW5nOiBtYWluX2FscGhhICs9ICgxLW1haW5fYWxwaGEpICogb3ZlcmxheV9hbHBoYQorICAgICAgICAgICAgICAgICpkICs9IEZBU1RfRElWMjU1KCgyNTUgLSAqZCkgKiAqcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkICs9IDE7CisgICAgICAgICAgICBzICs9IDE7CisgICAgICAgIH0KKyAgICAgICAgZGEgKz0gZHN0LT5saW5lc2l6ZVszXTsKKyAgICAgICAgc2EgKz0gc3JjLT5saW5lc2l6ZVszXTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgYmxlbmRfaW1hZ2VfeXV2KEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN1YiwgaW50IHZzdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFpbl9oYXNfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfc3RyYWlnaHQpCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgY29uc3QgaW50IHNyY193ID0gc3JjLT53aWR0aDsKICAgICBjb25zdCBpbnQgc3JjX2ggPSBzcmMtPmhlaWdodDsKICAgICBjb25zdCBpbnQgZHN0X3cgPSBkc3QtPndpZHRoOwogICAgIGNvbnN0IGludCBkc3RfaCA9IGRzdC0+aGVpZ2h0OwogCi0gICAgaWYgKHggPj0gZHN0X3cgfHwgeCtzcmNfdyA8IDAgfHwKLSAgICAgICAgeSA+PSBkc3RfaCB8fCB5K3NyY19oIDwgMCkKLSAgICAgICAgcmV0dXJuOyAvKiBubyBpbnRlcnNlY3Rpb24gKi8KKyAgICBibGVuZF9wbGFuZShjdHgsIGRzdCwgc3JjLCBzcmNfdywgc3JjX2gsIGRzdF93LCBkc3RfaCwgMCwgMCwgICAgICAgMCwgeCwgeSwgbWFpbl9oYXNfYWxwaGEsCisgICAgICAgICAgICAgICAgcy0+bWFpbl9kZXNjLT5jb21wWzBdLnBsYW5lLCBzLT5tYWluX2Rlc2MtPmNvbXBbMF0ub2Zmc2V0LCBzLT5tYWluX2Rlc2MtPmNvbXBbMF0uc3RlcCwgaXNfc3RyYWlnaHQsIDEpOworICAgIGJsZW5kX3BsYW5lKGN0eCwgZHN0LCBzcmMsIHNyY193LCBzcmNfaCwgZHN0X3csIGRzdF9oLCAxLCBoc3ViLCB2c3ViLCB4LCB5LCBtYWluX2hhc19hbHBoYSwKKyAgICAgICAgICAgICAgICBzLT5tYWluX2Rlc2MtPmNvbXBbMV0ucGxhbmUsIHMtPm1haW5fZGVzYy0+Y29tcFsxXS5vZmZzZXQsIHMtPm1haW5fZGVzYy0+Y29tcFsxXS5zdGVwLCBpc19zdHJhaWdodCwgMSk7CisgICAgYmxlbmRfcGxhbmUoY3R4LCBkc3QsIHNyYywgc3JjX3csIHNyY19oLCBkc3RfdywgZHN0X2gsIDIsIGhzdWIsIHZzdWIsIHgsIHksIG1haW5faGFzX2FscGhhLAorICAgICAgICAgICAgICAgIHMtPm1haW5fZGVzYy0+Y29tcFsyXS5wbGFuZSwgcy0+bWFpbl9kZXNjLT5jb21wWzJdLm9mZnNldCwgcy0+bWFpbl9kZXNjLT5jb21wWzJdLnN0ZXAsIGlzX3N0cmFpZ2h0LCAxKTsKIAotICAgIGlmIChzLT5tYWluX2lzX3BhY2tlZF9yZ2IpIHsKLSAgICAgICAgdWludDhfdCBhbHBoYTsgICAgICAgICAgLy8vPCB0aGUgYW1vdW50IG9mIG92ZXJsYXkgdG8gYmxlbmQgb24gdG8gbWFpbgotICAgICAgICBjb25zdCBpbnQgZHIgPSBzLT5tYWluX3JnYmFfbWFwW1JdOwotICAgICAgICBjb25zdCBpbnQgZGcgPSBzLT5tYWluX3JnYmFfbWFwW0ddOwotICAgICAgICBjb25zdCBpbnQgZGIgPSBzLT5tYWluX3JnYmFfbWFwW0JdOwotICAgICAgICBjb25zdCBpbnQgZGEgPSBzLT5tYWluX3JnYmFfbWFwW0FdOwotICAgICAgICBjb25zdCBpbnQgZHN0ZXAgPSBzLT5tYWluX3BpeF9zdGVwWzBdOwotICAgICAgICBjb25zdCBpbnQgc3IgPSBzLT5vdmVybGF5X3JnYmFfbWFwW1JdOwotICAgICAgICBjb25zdCBpbnQgc2cgPSBzLT5vdmVybGF5X3JnYmFfbWFwW0ddOwotICAgICAgICBjb25zdCBpbnQgc2IgPSBzLT5vdmVybGF5X3JnYmFfbWFwW0JdOwotICAgICAgICBjb25zdCBpbnQgc2EgPSBzLT5vdmVybGF5X3JnYmFfbWFwW0FdOwotICAgICAgICBjb25zdCBpbnQgc3N0ZXAgPSBzLT5vdmVybGF5X3BpeF9zdGVwWzBdOwotICAgICAgICBjb25zdCBpbnQgbWFpbl9oYXNfYWxwaGEgPSBzLT5tYWluX2hhc19hbHBoYTsKLSAgICAgICAgdWludDhfdCAqcywgKnNwLCAqZCwgKmRwOwotCi0gICAgICAgIGkgPSBGRk1BWCgteSwgMCk7Ci0gICAgICAgIHNwID0gc3JjLT5kYXRhWzBdICsgaSAgICAgKiBzcmMtPmxpbmVzaXplWzBdOwotICAgICAgICBkcCA9IGRzdC0+ZGF0YVswXSArICh5K2kpICogZHN0LT5saW5lc2l6ZVswXTsKLQotICAgICAgICBmb3IgKGltYXggPSBGRk1JTigteSArIGRzdF9oLCBzcmNfaCk7IGkgPCBpbWF4OyBpKyspIHsKLSAgICAgICAgICAgIGogPSBGRk1BWCgteCwgMCk7Ci0gICAgICAgICAgICBzID0gc3AgKyBqICAgICAqIHNzdGVwOwotICAgICAgICAgICAgZCA9IGRwICsgKHgraikgKiBkc3RlcDsKLQotICAgICAgICAgICAgZm9yIChqbWF4ID0gRkZNSU4oLXggKyBkc3Rfdywgc3JjX3cpOyBqIDwgam1heDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgYWxwaGEgPSBzW3NhXTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBtYWluIGNoYW5uZWwgaGFzIGFuIGFscGhhIGNoYW5uZWwsIGFscGhhIGhhcyB0byBiZSBjYWxjdWxhdGVkCi0gICAgICAgICAgICAgICAgLy8gdG8gY3JlYXRlIGFuIHVuLXByZW11bHRpcGxpZWQgKHN0cmFpZ2h0KSBhbHBoYSB2YWx1ZQotICAgICAgICAgICAgICAgIGlmIChtYWluX2hhc19hbHBoYSAmJiBhbHBoYSAhPSAwICYmIGFscGhhICE9IDI1NSkgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFscGhhX2QgPSBkW2RhXTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGEgPSBVTlBSRU1VTFRJUExZX0FMUEhBKGFscGhhLCBhbHBoYV9kKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGFscGhhKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDI1NToKLSAgICAgICAgICAgICAgICAgICAgZFtkcl0gPSBzW3NyXTsKLSAgICAgICAgICAgICAgICAgICAgZFtkZ10gPSBzW3NnXTsKLSAgICAgICAgICAgICAgICAgICAgZFtkYl0gPSBzW3NiXTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgLy8gbWFpbl92YWx1ZSA9IG1haW5fdmFsdWUgKiAoMSAtIGFscGhhKSArIG92ZXJsYXlfdmFsdWUgKiBhbHBoYQotICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBhbHBoYSBpcyBpbiB0aGUgcmFuZ2UgMC0yNTUsIHRoZSByZXN1bHQgbXVzdCBkaXZpZGVkIGJ5IDI1NQotICAgICAgICAgICAgICAgICAgICBkW2RyXSA9IEZBU1RfRElWMjU1KGRbZHJdICogKDI1NSAtIGFscGhhKSArIHNbc3JdICogYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICBkW2RnXSA9IEZBU1RfRElWMjU1KGRbZGddICogKDI1NSAtIGFscGhhKSArIHNbc2ddICogYWxwaGEpOwotICAgICAgICAgICAgICAgICAgICBkW2RiXSA9IEZBU1RfRElWMjU1KGRbZGJdICogKDI1NSAtIGFscGhhKSArIHNbc2JdICogYWxwaGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobWFpbl9oYXNfYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHBoYSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAyNTU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkW2RhXSA9IHNbc2FdOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBhbHBoYSBjb21wb3NpdGluZzogbWFpbl9hbHBoYSArPSAoMS1tYWluX2FscGhhKSAqIG92ZXJsYXlfYWxwaGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGRbZGFdICs9IEZBU1RfRElWMjU1KCgyNTUgLSBkW2RhXSkgKiBzW3NhXSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZCArPSBkc3RlcDsKLSAgICAgICAgICAgICAgICBzICs9IHNzdGVwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZHAgKz0gZHN0LT5saW5lc2l6ZVswXTsKLSAgICAgICAgICAgIHNwICs9IHNyYy0+bGluZXNpemVbMF07Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBpbnQgbWFpbl9oYXNfYWxwaGEgPSBzLT5tYWluX2hhc19hbHBoYTsKLSAgICAgICAgaWYgKG1haW5faGFzX2FscGhhKSB7Ci0gICAgICAgICAgICB1aW50OF90IGFscGhhOyAgICAgICAgICAvLy88IHRoZSBhbW91bnQgb2Ygb3ZlcmxheSB0byBibGVuZCBvbiB0byBtYWluCi0gICAgICAgICAgICB1aW50OF90ICpzLCAqc2EsICpkLCAqZGE7Ci0KLSAgICAgICAgICAgIGkgPSBGRk1BWCgteSwgMCk7Ci0gICAgICAgICAgICBzYSA9IHNyYy0+ZGF0YVszXSArIGkgICAgICogc3JjLT5saW5lc2l6ZVszXTsKLSAgICAgICAgICAgIGRhID0gZHN0LT5kYXRhWzNdICsgKHkraSkgKiBkc3QtPmxpbmVzaXplWzNdOwotCi0gICAgICAgICAgICBmb3IgKGltYXggPSBGRk1JTigteSArIGRzdF9oLCBzcmNfaCk7IGkgPCBpbWF4OyBpKyspIHsKLSAgICAgICAgICAgICAgICBqID0gRkZNQVgoLXgsIDApOwotICAgICAgICAgICAgICAgIHMgPSBzYSArIGo7Ci0gICAgICAgICAgICAgICAgZCA9IGRhICsgeCtqOwotCi0gICAgICAgICAgICAgICAgZm9yIChqbWF4ID0gRkZNSU4oLXggKyBkc3Rfdywgc3JjX3cpOyBqIDwgam1heDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhID0gKnM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhbHBoYSAhPSAwICYmIGFscGhhICE9IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbHBoYV9kID0gKmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IFVOUFJFTVVMVElQTFlfQUxQSEEoYWxwaGEsIGFscGhhX2QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWxwaGEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMjU1OgotICAgICAgICAgICAgICAgICAgICAgICAgKmQgPSAqczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgYWxwaGEgY29tcG9zaXRpbmc6IG1haW5fYWxwaGEgKz0gKDEtbWFpbl9hbHBoYSkgKiBvdmVybGF5X2FscGhhCi0gICAgICAgICAgICAgICAgICAgICAgICAqZCArPSBGQVNUX0RJVjI1NSgoMjU1IC0gKmQpICogKnMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGQgKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgcyArPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkYSArPSBkc3QtPmxpbmVzaXplWzNdOwotICAgICAgICAgICAgICAgIHNhICs9IHNyYy0+bGluZXNpemVbM107Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgaW50IGhzdWIgPSBpID8gcy0+aHN1YiA6IDA7Ci0gICAgICAgICAgICBpbnQgdnN1YiA9IGkgPyBzLT52c3ViIDogMDsKLSAgICAgICAgICAgIGludCBzcmNfd3AgPSBBVl9DRUlMX1JTSElGVChzcmNfdywgaHN1Yik7Ci0gICAgICAgICAgICBpbnQgc3JjX2hwID0gQVZfQ0VJTF9SU0hJRlQoc3JjX2gsIHZzdWIpOwotICAgICAgICAgICAgaW50IGRzdF93cCA9IEFWX0NFSUxfUlNISUZUKGRzdF93LCBoc3ViKTsKLSAgICAgICAgICAgIGludCBkc3RfaHAgPSBBVl9DRUlMX1JTSElGVChkc3RfaCwgdnN1Yik7Ci0gICAgICAgICAgICBpbnQgeXAgPSB5Pj52c3ViOwotICAgICAgICAgICAgaW50IHhwID0geD4+aHN1YjsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnMsICpzcCwgKmQsICpkcCwgKmEsICphcDsKLQotICAgICAgICAgICAgaiA9IEZGTUFYKC15cCwgMCk7Ci0gICAgICAgICAgICBzcCA9IHNyYy0+ZGF0YVtpXSArIGogICAgICAgICAqIHNyYy0+bGluZXNpemVbaV07Ci0gICAgICAgICAgICBkcCA9IGRzdC0+ZGF0YVtpXSArICh5cCtqKSAgICAqIGRzdC0+bGluZXNpemVbaV07Ci0gICAgICAgICAgICBhcCA9IHNyYy0+ZGF0YVszXSArIChqPDx2c3ViKSAqIHNyYy0+bGluZXNpemVbM107Ci0KLSAgICAgICAgICAgIGZvciAoam1heCA9IEZGTUlOKC15cCArIGRzdF9ocCwgc3JjX2hwKTsgaiA8IGptYXg7IGorKykgewotICAgICAgICAgICAgICAgIGsgPSBGRk1BWCgteHAsIDApOwotICAgICAgICAgICAgICAgIGQgPSBkcCArIHhwK2s7Ci0gICAgICAgICAgICAgICAgcyA9IHNwICsgazsKLSAgICAgICAgICAgICAgICBhID0gYXAgKyAoazw8aHN1Yik7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGttYXggPSBGRk1JTigteHAgKyBkc3Rfd3AsIHNyY193cCk7IGsgPCBrbWF4OyBrKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX3YsIGFscGhhX2gsIGFscGhhOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGF2ZXJhZ2UgYWxwaGEgZm9yIGNvbG9yIGNvbXBvbmVudHMsIGltcHJvdmUgcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICBpZiAoaHN1YiAmJiB2c3ViICYmIGorMSA8IHNyY19ocCAmJiBrKzEgPCBzcmNfd3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gKGFbMF0gKyBhW3NyYy0+bGluZXNpemVbM11dICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbMV0gKyBhW3NyYy0+bGluZXNpemVbM10rMV0pID4+IDI7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHN1YiB8fCB2c3ViKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9oID0gaHN1YiAmJiBrKzEgPCBzcmNfd3AgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhWzBdICsgYVsxXSkgPj4gMSA6IGFbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV92ID0gdnN1YiAmJiBqKzEgPCBzcmNfaHAgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhWzBdICsgYVtzcmMtPmxpbmVzaXplWzNdXSkgPj4gMSA6IGFbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IChhbHBoYV92ICsgYWxwaGFfaCkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSA9IGFbMF07Ci0gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBtYWluIGNoYW5uZWwgaGFzIGFuIGFscGhhIGNoYW5uZWwsIGFscGhhIGhhcyB0byBiZSBjYWxjdWxhdGVkCi0gICAgICAgICAgICAgICAgICAgIC8vIHRvIGNyZWF0ZSBhbiB1bi1wcmVtdWx0aXBsaWVkIChzdHJhaWdodCkgYWxwaGEgdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1haW5faGFzX2FscGhhICYmIGFscGhhICE9IDAgJiYgYWxwaGEgIT0gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBhdmVyYWdlIGFscGhhIGZvciBjb2xvciBjb21wb25lbnRzLCBpbXByb3ZlIHF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWxwaGFfZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoc3ViICYmIHZzdWIgJiYgaisxIDwgc3JjX2hwICYmIGsrMSA8IHNyY193cCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2QgPSAoZFswXSArIGRbc3JjLT5saW5lc2l6ZVszXV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFsxXSArIGRbc3JjLT5saW5lc2l6ZVszXSsxXSkgPj4gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHN1YiB8fCB2c3ViKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFfaCA9IGhzdWIgJiYgaysxIDwgc3JjX3dwID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRbMF0gKyBkWzFdKSA+PiAxIDogZFswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV92ID0gdnN1YiAmJiBqKzEgPCBzcmNfaHAgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZFswXSArIGRbc3JjLT5saW5lc2l6ZVszXV0pID4+IDEgOiBkWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2QgPSAoYWxwaGFfdiArIGFscGhhX2gpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9kID0gZFswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhID0gVU5QUkVNVUxUSVBMWV9BTFBIQShhbHBoYSwgYWxwaGFfZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgKmQgPSBGQVNUX0RJVjI1NSgqZCAqICgyNTUgLSBhbHBoYSkgKyAqcyAqIGFscGhhKTsKLSAgICAgICAgICAgICAgICAgICAgcysrOwotICAgICAgICAgICAgICAgICAgICBkKys7Ci0gICAgICAgICAgICAgICAgICAgIGEgKz0gMSA8PCBoc3ViOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcCArPSBkc3QtPmxpbmVzaXplW2ldOwotICAgICAgICAgICAgICAgIHNwICs9IHNyYy0+bGluZXNpemVbaV07Ci0gICAgICAgICAgICAgICAgYXAgKz0gKDEgPDwgdnN1YikgKiBzcmMtPmxpbmVzaXplWzNdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQorICAgIGlmIChtYWluX2hhc19hbHBoYSkKKyAgICAgICAgYWxwaGFfY29tcG9zaXRlKHNyYywgZHN0LCBzcmNfdywgc3JjX2gsIGRzdF93LCBkc3RfaCwgeCwgeSk7CiB9CiAKLXN0YXRpYyBBVkZyYW1lICpkb19ibGVuZChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqbWFpbnBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzZWNvbmQpCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGJsZW5kX2ltYWdlX3BsYW5hcl9yZ2IoQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdWIsIGludCB2c3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYWluX2hhc19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3N0cmFpZ2h0KQogewogICAgIE92ZXJsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IGludCBzcmNfdyA9IHNyYy0+d2lkdGg7CisgICAgY29uc3QgaW50IHNyY19oID0gc3JjLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IGRzdF93ID0gZHN0LT53aWR0aDsKKyAgICBjb25zdCBpbnQgZHN0X2ggPSBkc3QtPmhlaWdodDsKKworICAgIGJsZW5kX3BsYW5lKGN0eCwgZHN0LCBzcmMsIHNyY193LCBzcmNfaCwgZHN0X3csIGRzdF9oLCAwLCAwLCAgICAgICAwLCB4LCB5LCBtYWluX2hhc19hbHBoYSwKKyAgICAgICAgICAgICAgICBzLT5tYWluX2Rlc2MtPmNvbXBbMV0ucGxhbmUsIHMtPm1haW5fZGVzYy0+Y29tcFsxXS5vZmZzZXQsIHMtPm1haW5fZGVzYy0+Y29tcFsxXS5zdGVwLCBpc19zdHJhaWdodCwgMCk7CisgICAgYmxlbmRfcGxhbmUoY3R4LCBkc3QsIHNyYywgc3JjX3csIHNyY19oLCBkc3RfdywgZHN0X2gsIDEsIGhzdWIsIHZzdWIsIHgsIHksIG1haW5faGFzX2FscGhhLAorICAgICAgICAgICAgICAgIHMtPm1haW5fZGVzYy0+Y29tcFsyXS5wbGFuZSwgcy0+bWFpbl9kZXNjLT5jb21wWzJdLm9mZnNldCwgcy0+bWFpbl9kZXNjLT5jb21wWzJdLnN0ZXAsIGlzX3N0cmFpZ2h0LCAwKTsKKyAgICBibGVuZF9wbGFuZShjdHgsIGRzdCwgc3JjLCBzcmNfdywgc3JjX2gsIGRzdF93LCBkc3RfaCwgMiwgaHN1YiwgdnN1YiwgeCwgeSwgbWFpbl9oYXNfYWxwaGEsCisgICAgICAgICAgICAgICAgcy0+bWFpbl9kZXNjLT5jb21wWzBdLnBsYW5lLCBzLT5tYWluX2Rlc2MtPmNvbXBbMF0ub2Zmc2V0LCBzLT5tYWluX2Rlc2MtPmNvbXBbMF0uc3RlcCwgaXNfc3RyYWlnaHQsIDApOworCisgICAgaWYgKG1haW5faGFzX2FscGhhKQorICAgICAgICBhbHBoYV9jb21wb3NpdGUoc3JjLCBkc3QsIHNyY193LCBzcmNfaCwgZHN0X3csIGRzdF9oLCB4LCB5KTsKK30KKworc3RhdGljIHZvaWQgYmxlbmRfaW1hZ2VfeXV2NDIwKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIGJsZW5kX2ltYWdlX3l1dihjdHgsIGRzdCwgc3JjLCAxLCAxLCAwLCB4LCB5LCAxKTsKK30KKworc3RhdGljIHZvaWQgYmxlbmRfaW1hZ2VfeXV2YTQyMChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBibGVuZF9pbWFnZV95dXYoY3R4LCBkc3QsIHNyYywgMSwgMSwgMSwgeCwgeSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX2ltYWdlX3l1djQyMihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBibGVuZF9pbWFnZV95dXYoY3R4LCBkc3QsIHNyYywgMSwgMCwgMCwgeCwgeSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX2ltYWdlX3l1dmE0MjIoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgeCwgaW50IHkpCit7CisgICAgYmxlbmRfaW1hZ2VfeXV2KGN0eCwgZHN0LCBzcmMsIDEsIDAsIDEsIHgsIHksIDEpOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9pbWFnZV95dXY0NDQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgeCwgaW50IHkpCit7CisgICAgYmxlbmRfaW1hZ2VfeXV2KGN0eCwgZHN0LCBzcmMsIDAsIDAsIDAsIHgsIHksIDEpOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9pbWFnZV95dXZhNDQ0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIGJsZW5kX2ltYWdlX3l1dihjdHgsIGRzdCwgc3JjLCAwLCAwLCAxLCB4LCB5LCAxKTsKK30KKworc3RhdGljIHZvaWQgYmxlbmRfaW1hZ2VfZ2JycChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBibGVuZF9pbWFnZV9wbGFuYXJfcmdiKGN0eCwgZHN0LCBzcmMsIDAsIDAsIDAsIHgsIHksIDEpOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9pbWFnZV9nYnJhcChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBibGVuZF9pbWFnZV9wbGFuYXJfcmdiKGN0eCwgZHN0LCBzcmMsIDAsIDAsIDEsIHgsIHksIDEpOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9pbWFnZV95dXY0MjBfcG0oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgeCwgaW50IHkpCit7CisgICAgYmxlbmRfaW1hZ2VfeXV2KGN0eCwgZHN0LCBzcmMsIDEsIDEsIDAsIHgsIHksIDApOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9pbWFnZV95dXZhNDIwX3BtKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIGJsZW5kX2ltYWdlX3l1dihjdHgsIGRzdCwgc3JjLCAxLCAxLCAxLCB4LCB5LCAwKTsKK30KKworc3RhdGljIHZvaWQgYmxlbmRfaW1hZ2VfeXV2NDIyX3BtKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIGJsZW5kX2ltYWdlX3l1dihjdHgsIGRzdCwgc3JjLCAxLCAwLCAwLCB4LCB5LCAwKTsKK30KKworc3RhdGljIHZvaWQgYmxlbmRfaW1hZ2VfeXV2YTQyMl9wbShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBibGVuZF9pbWFnZV95dXYoY3R4LCBkc3QsIHNyYywgMSwgMCwgMSwgeCwgeSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX2ltYWdlX3l1djQ0NF9wbShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBibGVuZF9pbWFnZV95dXYoY3R4LCBkc3QsIHNyYywgMCwgMCwgMCwgeCwgeSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX2ltYWdlX3l1dmE0NDRfcG0oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgeCwgaW50IHkpCit7CisgICAgYmxlbmRfaW1hZ2VfeXV2KGN0eCwgZHN0LCBzcmMsIDAsIDAsIDEsIHgsIHksIDApOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9pbWFnZV9nYnJwX3BtKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIGJsZW5kX2ltYWdlX3BsYW5hcl9yZ2IoY3R4LCBkc3QsIHNyYywgMCwgMCwgMCwgeCwgeSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX2ltYWdlX2dicmFwX3BtKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIGJsZW5kX2ltYWdlX3BsYW5hcl9yZ2IoY3R4LCBkc3QsIHNyYywgMCwgMCwgMSwgeCwgeSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX2ltYWdlX3JnYihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBibGVuZF9pbWFnZV9wYWNrZWRfcmdiKGN0eCwgZHN0LCBzcmMsIDAsIHgsIHksIDEpOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9pbWFnZV9yZ2JhKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIGJsZW5kX2ltYWdlX3BhY2tlZF9yZ2IoY3R4LCBkc3QsIHNyYywgMSwgeCwgeSwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX2ltYWdlX3JnYl9wbShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCB4LCBpbnQgeSkKK3sKKyAgICBibGVuZF9pbWFnZV9wYWNrZWRfcmdiKGN0eCwgZHN0LCBzcmMsIDAsIHgsIHksIDApOworfQorCitzdGF0aWMgdm9pZCBibGVuZF9pbWFnZV9yZ2JhX3BtKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IHgsIGludCB5KQoreworICAgIGJsZW5kX2ltYWdlX3BhY2tlZF9yZ2IoY3R4LCBkc3QsIHNyYywgMSwgeCwgeSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0X21haW4oQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisKKyAgICBhdl9pbWFnZV9maWxsX21heF9waXhzdGVwcyhzLT5tYWluX3BpeF9zdGVwLCAgICBOVUxMLCBwaXhfZGVzYyk7CisKKyAgICBzLT5oc3ViID0gcGl4X2Rlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+dnN1YiA9IHBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgcy0+bWFpbl9kZXNjID0gcGl4X2Rlc2M7CisKKyAgICBzLT5tYWluX2lzX3BhY2tlZF9yZ2IgPQorICAgICAgICBmZl9maWxsX3JnYmFfbWFwKHMtPm1haW5fcmdiYV9tYXAsIGlubGluay0+Zm9ybWF0KSA+PSAwOworICAgIHMtPm1haW5faGFzX2FscGhhID0gZmZfZm10X2lzX2luKGlubGluay0+Zm9ybWF0LCBhbHBoYV9waXhfZm10cyk7CisgICAgc3dpdGNoIChzLT5mb3JtYXQpIHsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQyMDoKKyAgICAgICAgcy0+YmxlbmRfaW1hZ2UgPSBzLT5tYWluX2hhc19hbHBoYSA/IGJsZW5kX2ltYWdlX3l1dmE0MjAgOiBibGVuZF9pbWFnZV95dXY0MjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1ZFUkxBWV9GT1JNQVRfWVVWNDIyOgorICAgICAgICBzLT5ibGVuZF9pbWFnZSA9IHMtPm1haW5faGFzX2FscGhhID8gYmxlbmRfaW1hZ2VfeXV2YTQyMiA6IGJsZW5kX2ltYWdlX3l1djQyMjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVkVSTEFZX0ZPUk1BVF9ZVVY0NDQ6CisgICAgICAgIHMtPmJsZW5kX2ltYWdlID0gcy0+bWFpbl9oYXNfYWxwaGEgPyBibGVuZF9pbWFnZV95dXZhNDQ0IDogYmxlbmRfaW1hZ2VfeXV2NDQ0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX1JHQjoKKyAgICAgICAgcy0+YmxlbmRfaW1hZ2UgPSBzLT5tYWluX2hhc19hbHBoYSA/IGJsZW5kX2ltYWdlX3JnYmEgOiBibGVuZF9pbWFnZV9yZ2I7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1ZFUkxBWV9GT1JNQVRfR0JSUDoKKyAgICAgICAgcy0+YmxlbmRfaW1hZ2UgPSBzLT5tYWluX2hhc19hbHBoYSA/IGJsZW5kX2ltYWdlX2dicmFwIDogYmxlbmRfaW1hZ2VfZ2JycDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVkVSTEFZX0ZPUk1BVF9BVVRPOgorICAgICAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDoKKyAgICAgICAgICAgIHMtPmJsZW5kX2ltYWdlID0gYmxlbmRfaW1hZ2VfeXV2YTQyMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA6CisgICAgICAgICAgICBzLT5ibGVuZF9pbWFnZSA9IGJsZW5kX2ltYWdlX3l1dmE0MjI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOgorICAgICAgICAgICAgcy0+YmxlbmRfaW1hZ2UgPSBibGVuZF9pbWFnZV95dXZhNDQ0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9BUkdCOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9BQkdSOgorICAgICAgICAgICAgcy0+YmxlbmRfaW1hZ2UgPSBibGVuZF9pbWFnZV9yZ2JhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDoKKyAgICAgICAgICAgIHMtPmJsZW5kX2ltYWdlID0gYmxlbmRfaW1hZ2VfZ2JyYXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIXMtPmFscGhhX2Zvcm1hdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzd2l0Y2ggKHMtPmZvcm1hdCkgeworICAgIGNhc2UgT1ZFUkxBWV9GT1JNQVRfWVVWNDIwOgorICAgICAgICBzLT5ibGVuZF9pbWFnZSA9IHMtPm1haW5faGFzX2FscGhhID8gYmxlbmRfaW1hZ2VfeXV2YTQyMF9wbSA6IGJsZW5kX2ltYWdlX3l1djQyMF9wbTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVkVSTEFZX0ZPUk1BVF9ZVVY0MjI6CisgICAgICAgIHMtPmJsZW5kX2ltYWdlID0gcy0+bWFpbl9oYXNfYWxwaGEgPyBibGVuZF9pbWFnZV95dXZhNDIyX3BtIDogYmxlbmRfaW1hZ2VfeXV2NDIyX3BtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX1lVVjQ0NDoKKyAgICAgICAgcy0+YmxlbmRfaW1hZ2UgPSBzLT5tYWluX2hhc19hbHBoYSA/IGJsZW5kX2ltYWdlX3l1dmE0NDRfcG0gOiBibGVuZF9pbWFnZV95dXY0NDRfcG07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT1ZFUkxBWV9GT1JNQVRfUkdCOgorICAgICAgICBzLT5ibGVuZF9pbWFnZSA9IHMtPm1haW5faGFzX2FscGhhID8gYmxlbmRfaW1hZ2VfcmdiYV9wbSA6IGJsZW5kX2ltYWdlX3JnYl9wbTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPVkVSTEFZX0ZPUk1BVF9HQlJQOgorICAgICAgICBzLT5ibGVuZF9pbWFnZSA9IHMtPm1haW5faGFzX2FscGhhID8gYmxlbmRfaW1hZ2VfZ2JyYXBfcG0gOiBibGVuZF9pbWFnZV9nYnJwX3BtOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9WRVJMQVlfRk9STUFUX0FVVE86CisgICAgICAgIHN3aXRjaCAoaW5saW5rLT5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOgorICAgICAgICAgICAgcy0+YmxlbmRfaW1hZ2UgPSBibGVuZF9pbWFnZV95dXZhNDIwX3BtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDoKKyAgICAgICAgICAgIHMtPmJsZW5kX2ltYWdlID0gYmxlbmRfaW1hZ2VfeXV2YTQyMl9wbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA6CisgICAgICAgICAgICBzLT5ibGVuZF9pbWFnZSA9IGJsZW5kX2ltYWdlX3l1dmE0NDRfcG07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0FSR0I6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0FCR1I6CisgICAgICAgICAgICBzLT5ibGVuZF9pbWFnZSA9IGJsZW5kX2ltYWdlX3JnYmFfcG07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQOgorICAgICAgICAgICAgcy0+YmxlbmRfaW1hZ2UgPSBibGVuZF9pbWFnZV9nYnJhcF9wbTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19ibGVuZChGRkZyYW1lU3luYyAqZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OworICAgIEFWRnJhbWUgKm1haW5waWMsICpzZWNvbmQ7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gZmZfZnJhbWVzeW5jX2R1YWxpbnB1dF9nZXRfd3JpdGFibGUoZnMsICZtYWlucGljLCAmc2Vjb25kKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIXNlY29uZCkKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG1haW5waWMpOwogCiAgICAgaWYgKHMtPmV2YWxfbW9kZSA9PSBFVkFMX01PREVfRlJBTUUpIHsKLSAgICAgICAgaW50NjRfdCBwb3MgPSBhdl9mcmFtZV9nZXRfcGt0X3BvcyhtYWlucGljKTsKKyAgICAgICAgaW50NjRfdCBwb3MgPSBtYWlucGljLT5wa3RfcG9zOwogCi0gICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX05dID0gaW5saW5rLT5mcmFtZV9jb3VudDsKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfTl0gPSBpbmxpbmstPmZyYW1lX2NvdW50X291dDsKICAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVF0gPSBtYWlucGljLT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgPwogICAgICAgICAgICAgTkFOIDogbWFpbnBpYy0+cHRzICogYXZfcTJkKGlubGluay0+dGltZV9iYXNlKTsKICAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfUE9TXSA9IHBvcyA9PSAtMSA/IE5BTiA6IHBvczsKQEAgLTYxMSw0NSArOTA0LDI2IEBACiAgICAgICAgICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9ZXSwgcy0+eSk7CiAgICAgfQogCi0gICAgYmxlbmRfaW1hZ2UoY3R4LCBtYWlucGljLCBzZWNvbmQsIHMtPngsIHMtPnkpOwotICAgIHJldHVybiBtYWlucGljOwotfQotCi1zdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5waWNyZWYpCi17Ci0gICAgT3ZlcmxheUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19ERUJVRywgIkluY29taW5nIGZyYW1lICh0aW1lOiVzKSBmcm9tIGxpbmsgIyVkXG4iLCBhdl90czJ0aW1lc3RyKGlucGljcmVmLT5wdHMsICZpbmxpbmstPnRpbWVfYmFzZSksIEZGX0lOTElOS19JRFgoaW5saW5rKSk7Ci0gICAgcmV0dXJuIGZmX2R1YWxpbnB1dF9maWx0ZXJfZnJhbWUoJnMtPmRpbnB1dCwgaW5saW5rLCBpbnBpY3JlZik7Ci19Ci0KLXN0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCi17Ci0gICAgT3ZlcmxheUNvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7Ci0gICAgcmV0dXJuIGZmX2R1YWxpbnB1dF9yZXF1ZXN0X2ZyYW1lKCZzLT5kaW5wdXQsIG91dGxpbmspOworICAgIGlmIChzLT54IDwgbWFpbnBpYy0+d2lkdGggICYmIHMtPnggKyBzZWNvbmQtPndpZHRoICA+PSAwIHx8CisgICAgICAgIHMtPnkgPCBtYWlucGljLT5oZWlnaHQgJiYgcy0+eSArIHNlY29uZC0+aGVpZ2h0ID49IDApCisgICAgICAgIHMtPmJsZW5kX2ltYWdlKGN0eCwgbWFpbnBpYywgc2Vjb25kLCBzLT54LCBzLT55KTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgbWFpbnBpYyk7CiB9CiAKIHN0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewogICAgIE92ZXJsYXlDb250ZXh0ICpzID0gY3R4LT5wcml2OwogCi0gICAgaWYgKHMtPmFsbG93X3BhY2tlZF9yZ2IpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAiVGhlIHJnYiBvcHRpb24gaXMgZGVwcmVjYXRlZCBhbmQgaXMgb3ZlcnJpZGluZyB0aGUgZm9ybWF0IG9wdGlvbiwgdXNlIGZvcm1hdCBpbnN0ZWFkXG4iKTsKLSAgICAgICAgcy0+Zm9ybWF0ID0gT1ZFUkxBWV9GT1JNQVRfUkdCOwotICAgIH0KLSAgICBpZiAoIXMtPmRpbnB1dC5yZXBlYXRsYXN0IHx8IHMtPmVvZl9hY3Rpb24gPT0gRU9GX0FDVElPTl9QQVNTKSB7Ci0gICAgICAgIHMtPmRpbnB1dC5yZXBlYXRsYXN0ID0gMDsKLSAgICAgICAgcy0+ZW9mX2FjdGlvbiA9IEVPRl9BQ1RJT05fUEFTUzsKLSAgICB9Ci0gICAgaWYgKHMtPmRpbnB1dC5zaG9ydGVzdCB8fCBzLT5lb2ZfYWN0aW9uID09IEVPRl9BQ1RJT05fRU5EQUxMKSB7Ci0gICAgICAgIHMtPmRpbnB1dC5zaG9ydGVzdCA9IDE7Ci0gICAgICAgIHMtPmVvZl9hY3Rpb24gPSBFT0ZfQUNUSU9OX0VOREFMTDsKLSAgICB9Ci0KLSAgICBzLT5kaW5wdXQucHJvY2VzcyA9IGRvX2JsZW5kOworICAgIHMtPmZzLm9uX2V2ZW50ID0gZG9fYmxlbmQ7CiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYWN0aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19hY3RpdmF0ZSgmcy0+ZnMpOworfQorCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihPdmVybGF5Q29udGV4dCwgeCkKICNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCiAKQEAgLTY1Nyw3ICs5MzEsNyBAQAogICAgIHsgIngiLCAic2V0IHRoZSB4IGV4cHJlc3Npb24iLCBPRkZTRVQoeF9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIwIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJ5IiwgInNldCB0aGUgeSBleHByZXNzaW9uIiwgT0ZGU0VUKHlfZXhwciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiMCJ9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCiAgICAgeyAiZW9mX2FjdGlvbiIsICJBY3Rpb24gdG8gdGFrZSB3aGVuIGVuY291bnRlcmluZyBFT0YgZnJvbSBzZWNvbmRhcnkgaW5wdXQgIiwKLSAgICAgICAgT0ZGU0VUKGVvZl9hY3Rpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEVPRl9BQ1RJT05fUkVQRUFUIH0sCisgICAgICAgIE9GRlNFVChmcy5vcHRfZW9mX2FjdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gRU9GX0FDVElPTl9SRVBFQVQgfSwKICAgICAgICAgRU9GX0FDVElPTl9SRVBFQVQsIEVPRl9BQ1RJT05fUEFTUywgLmZsYWdzID0gRkxBR1MsICJlb2ZfYWN0aW9uIiB9LAogICAgICAgICB7ICJyZXBlYXQiLCAiUmVwZWF0IHRoZSBwcmV2aW91cyBmcmFtZS4iLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBFT0ZfQUNUSU9OX1JFUEVBVCB9LCAuZmxhZ3MgPSBGTEFHUywgImVvZl9hY3Rpb24iIH0sCiAgICAgICAgIHsgImVuZGFsbCIsICJFbmQgYm90aCBzdHJlYW1zLiIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEVPRl9BQ1RJT05fRU5EQUxMIH0sIC5mbGFncyA9IEZMQUdTLCAiZW9mX2FjdGlvbiIgfSwKQEAgLTY2NSwzMiArOTM5LDMzIEBACiAgICAgeyAiZXZhbCIsICJzcGVjaWZ5IHdoZW4gdG8gZXZhbHVhdGUgZXhwcmVzc2lvbnMiLCBPRkZTRVQoZXZhbF9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEVWQUxfTU9ERV9GUkFNRX0sIDAsIEVWQUxfTU9ERV9OQi0xLCBGTEFHUywgImV2YWwiIH0sCiAgICAgICAgICB7ICJpbml0IiwgICJldmFsIGV4cHJlc3Npb25zIG9uY2UgZHVyaW5nIGluaXRpYWxpemF0aW9uIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVWQUxfTU9ERV9JTklUfSwgIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJldmFsIiB9LAogICAgICAgICAgeyAiZnJhbWUiLCAiZXZhbCBleHByZXNzaW9ucyBwZXItZnJhbWUiLCAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1FVkFMX01PREVfRlJBTUV9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZXZhbCIgfSwKLSAgICB7ICJyZ2IiLCAiZm9yY2UgcGFja2VkIFJHQiBpbiBpbnB1dCBhbmQgb3V0cHV0IChkZXByZWNhdGVkKSIsIE9GRlNFVChhbGxvd19wYWNrZWRfcmdiKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTIH0sCi0gICAgeyAic2hvcnRlc3QiLCAiZm9yY2UgdGVybWluYXRpb24gd2hlbiB0aGUgc2hvcnRlc3QgaW5wdXQgdGVybWluYXRlcyIsIE9GRlNFVChkaW5wdXQuc2hvcnRlc3QpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAic2hvcnRlc3QiLCAiZm9yY2UgdGVybWluYXRpb24gd2hlbiB0aGUgc2hvcnRlc3QgaW5wdXQgdGVybWluYXRlcyIsIE9GRlNFVChmcy5vcHRfc2hvcnRlc3QpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIEZMQUdTIH0sCiAgICAgeyAiZm9ybWF0IiwgInNldCBvdXRwdXQgZm9ybWF0IiwgT0ZGU0VUKGZvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9T1ZFUkxBWV9GT1JNQVRfWVVWNDIwfSwgMCwgT1ZFUkxBWV9GT1JNQVRfTkItMSwgRkxBR1MsICJmb3JtYXQiIH0sCiAgICAgICAgIHsgInl1djQyMCIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T1ZFUkxBWV9GT1JNQVRfWVVWNDIwfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZvcm1hdCIgfSwKICAgICAgICAgeyAieXV2NDIyIiwgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1PVkVSTEFZX0ZPUk1BVF9ZVVY0MjJ9LCAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZm9ybWF0IiB9LAogICAgICAgICB7ICJ5dXY0NDQiLCAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9WRVJMQVlfRk9STUFUX1lVVjQ0NH0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmb3JtYXQiIH0sCiAgICAgICAgIHsgInJnYiIsICAgICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T1ZFUkxBWV9GT1JNQVRfUkdCfSwgICAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImZvcm1hdCIgfSwKLSAgICB7ICJyZXBlYXRsYXN0IiwgInJlcGVhdCBvdmVybGF5IG9mIHRoZSBsYXN0IG92ZXJsYXkgZnJhbWUiLCBPRkZTRVQoZGlucHV0LnJlcGVhdGxhc3QpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0xfSwgMCwgMSwgRkxBR1MgfSwKKyAgICAgICAgeyAiZ2JycCIsICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1PVkVSTEFZX0ZPUk1BVF9HQlJQfSwgICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZm9ybWF0IiB9LAorICAgICAgICB7ICJhdXRvIiwgICAiIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PU9WRVJMQVlfRk9STUFUX0FVVE99LCAgIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJmb3JtYXQiIH0sCisgICAgeyAicmVwZWF0bGFzdCIsICJyZXBlYXQgb3ZlcmxheSBvZiB0aGUgbGFzdCBvdmVybGF5IGZyYW1lIiwgT0ZGU0VUKGZzLm9wdF9yZXBlYXRsYXN0KSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiYWxwaGEiLCAiYWxwaGEgZm9ybWF0IiwgT0ZGU0VUKGFscGhhX2Zvcm1hdCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTLCAiYWxwaGFfZm9ybWF0IiB9LAorICAgICAgICB7ICJzdHJhaWdodCIsICAgICAgIiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImFscGhhX2Zvcm1hdCIgfSwKKyAgICAgICAgeyAicHJlbXVsdGlwbGllZCIsICIiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MX0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJhbHBoYV9mb3JtYXQiIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKLUFWRklMVEVSX0RFRklORV9DTEFTUyhvdmVybGF5KTsKK0ZSQU1FU1lOQ19ERUZJTkVfQ0xBU1Mob3ZlcmxheSwgT3ZlcmxheUNvbnRleHQsIGZzKTsKIAogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGF2ZmlsdGVyX3ZmX292ZXJsYXlfaW5wdXRzW10gPSB7CiAgICAgewogICAgICAgICAubmFtZSAgICAgICAgID0gIm1haW4iLAogICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0X21haW4sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCi0gICAgICAgIC5uZWVkc193cml0YWJsZSA9IDEsCiAgICAgfSwKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAib3ZlcmxheSIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXRfb3ZlcmxheSwKLSAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKICAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtNzAwLDcgKzk3NSw2IEBACiAgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAotICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTcwOCwxMSArOTgyLDEzIEBACiBBVkZpbHRlciBmZl92Zl9vdmVybGF5ID0gewogICAgIC5uYW1lICAgICAgICAgID0gIm92ZXJsYXkiLAogICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk92ZXJsYXkgYSB2aWRlbyBzb3VyY2Ugb24gdG9wIG9mIHRoZSBpbnB1dC4iKSwKKyAgICAucHJlaW5pdCAgICAgICA9IG92ZXJsYXlfZnJhbWVzeW5jX3ByZWluaXQsCiAgICAgLmluaXQgICAgICAgICAgPSBpbml0LAogICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAogICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKE92ZXJsYXlDb250ZXh0KSwKICAgICAucHJpdl9jbGFzcyAgICA9ICZvdmVybGF5X2NsYXNzLAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAogICAgIC5wcm9jZXNzX2NvbW1hbmQgPSBwcm9jZXNzX2NvbW1hbmQsCiAgICAgLmlucHV0cyAgICAgICAgPSBhdmZpbHRlcl92Zl9vdmVybGF5X2lucHV0cywKICAgICAub3V0cHV0cyAgICAgICA9IGF2ZmlsdGVyX3ZmX292ZXJsYXlfb3V0cHV0cywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX292ZXJsYXlfb3BlbmNsLmMgYi9saWJhdmZpbHRlci92Zl9vdmVybGF5X29wZW5jbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzA1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9vdmVybGF5X29wZW5jbC5jCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9wZW5jbC5oIgorI2luY2x1ZGUgIm9wZW5jbF9zb3VyY2UuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCit0eXBlZGVmIHN0cnVjdCBPdmVybGF5T3BlbkNMQ29udGV4dCB7CisgICAgT3BlbkNMRmlsdGVyQ29udGV4dCBvY2Y7CisKKyAgICBpbnQgICAgICAgICAgICAgIGluaXRpYWxpc2VkOworICAgIGNsX2tlcm5lbCAgICAgICAga2VybmVsOworICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZTsKKworICAgIEZGRnJhbWVTeW5jICAgICAgZnM7CisKKyAgICBpbnQgICAgICAgICAgICAgIG5iX3BsYW5lczsKKyAgICBpbnQgICAgICAgICAgICAgIHhfc3Vic2FtcGxlOworICAgIGludCAgICAgICAgICAgICAgeV9zdWJzYW1wbGU7CisgICAgaW50ICAgICAgICAgICAgICBhbHBoYV9zZXBhcmF0ZTsKKworICAgIGludCAgICAgICAgICAgICAgeF9wb3NpdGlvbjsKKyAgICBpbnQgICAgICAgICAgICAgIHlfcG9zaXRpb247Cit9IE92ZXJsYXlPcGVuQ0xDb250ZXh0OworCitzdGF0aWMgaW50IG92ZXJsYXlfb3BlbmNsX2xvYWQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgbWFpbl9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IG92ZXJsYXlfZm9ybWF0KQoreworICAgIE92ZXJsYXlPcGVuQ0xDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBjbF9pbnQgY2xlOworICAgIGNvbnN0IGNoYXIgKnNvdXJjZSA9IGZmX29wZW5jbF9zb3VyY2Vfb3ZlcmxheTsKKyAgICBjb25zdCBjaGFyICprZXJuZWw7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICptYWluX2Rlc2MsICpvdmVybGF5X2Rlc2M7CisgICAgaW50IGVyciwgaSwgbWFpbl9wbGFuZXMsIG92ZXJsYXlfcGxhbmVzOworCisgICAgbWFpbl9kZXNjICAgID0gYXZfcGl4X2ZtdF9kZXNjX2dldChtYWluX2Zvcm1hdCk7CisgICAgb3ZlcmxheV9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdmVybGF5X2Zvcm1hdCk7CisKKyAgICBtYWluX3BsYW5lcyA9IG92ZXJsYXlfcGxhbmVzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWFpbl9kZXNjLT5uYl9jb21wb25lbnRzOyBpKyspCisgICAgICAgIG1haW5fcGxhbmVzID0gRkZNQVgobWFpbl9wbGFuZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbl9kZXNjLT5jb21wW2ldLnBsYW5lICsgMSk7CisgICAgZm9yIChpID0gMDsgaSA8IG92ZXJsYXlfZGVzYy0+bmJfY29tcG9uZW50czsgaSsrKQorICAgICAgICBvdmVybGF5X3BsYW5lcyA9IEZGTUFYKG92ZXJsYXlfcGxhbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfZGVzYy0+Y29tcFtpXS5wbGFuZSArIDEpOworCisgICAgY3R4LT5uYl9wbGFuZXMgPSBtYWluX3BsYW5lczsKKyAgICBjdHgtPnhfc3Vic2FtcGxlID0gMSA8PCBtYWluX2Rlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgY3R4LT55X3N1YnNhbXBsZSA9IDEgPDwgbWFpbl9kZXNjLT5sb2cyX2Nocm9tYV9oOworCisgICAgaWYgKGN0eC0+eF9wb3NpdGlvbiAlIGN0eC0+eF9zdWJzYW1wbGUgfHwKKyAgICAgICAgY3R4LT55X3Bvc2l0aW9uICUgY3R4LT55X3N1YnNhbXBsZSkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19XQVJOSU5HLCAiV2FybmluZzogb3ZlcmxheSBwb3NpdGlvbiAoJWQsICVkKSAiCisgICAgICAgICAgICAgICAiZG9lcyBub3QgbWF0Y2ggc3Vic2FtcGxpbmcgKCVkLCAlZCkuXG4iLAorICAgICAgICAgICAgICAgY3R4LT54X3Bvc2l0aW9uLCBjdHgtPnlfcG9zaXRpb24sCisgICAgICAgICAgICAgICBjdHgtPnhfc3Vic2FtcGxlLCBjdHgtPnlfc3Vic2FtcGxlKTsKKyAgICB9CisKKyAgICBpZiAobWFpbl9wbGFuZXMgPT0gb3ZlcmxheV9wbGFuZXMpIHsKKyAgICAgICAgaWYgKG1haW5fZGVzYy0+bmJfY29tcG9uZW50cyA9PSBvdmVybGF5X2Rlc2MtPm5iX2NvbXBvbmVudHMpCisgICAgICAgICAgICBrZXJuZWwgPSAib3ZlcmxheV9ub19hbHBoYSI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGtlcm5lbCA9ICJvdmVybGF5X2ludGVybmFsX2FscGhhIjsKKyAgICAgICAgY3R4LT5hbHBoYV9zZXBhcmF0ZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAga2VybmVsID0gIm92ZXJsYXlfZXh0ZXJuYWxfYWxwaGEiOworICAgICAgICBjdHgtPmFscGhhX3NlcGFyYXRlID0gMTsKKyAgICB9CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIlVzaW5nIGtlcm5lbCAlcy5cbiIsIGtlcm5lbCk7CisKKyAgICBlcnIgPSBmZl9vcGVuY2xfZmlsdGVyX2xvYWRfcHJvZ3JhbShhdmN0eCwgJnNvdXJjZSwgMSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGN0eC0+Y29tbWFuZF9xdWV1ZSA9IGNsQ3JlYXRlQ29tbWFuZFF1ZXVlKGN0eC0+b2NmLmh3Y3R4LT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2NmLmh3Y3R4LT5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmNsZSk7CisgICAgaWYgKCFjdHgtPmNvbW1hbmRfcXVldWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIE9wZW5DTCAiCisgICAgICAgICAgICAgICAiY29tbWFuZCBxdWV1ZTogJWQuXG4iLCBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdHgtPmtlcm5lbCA9IGNsQ3JlYXRlS2VybmVsKGN0eC0+b2NmLnByb2dyYW0sIGtlcm5lbCwgJmNsZSk7CisgICAgaWYgKCFjdHgtPmtlcm5lbCkgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUga2VybmVsOiAlZC5cbiIsIGNsZSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGN0eC0+aW5pdGlhbGlzZWQgPSAxOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGlmIChjdHgtPmNvbW1hbmRfcXVldWUpCisgICAgICAgIGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShjdHgtPmNvbW1hbmRfcXVldWUpOworICAgIGlmIChjdHgtPmtlcm5lbCkKKyAgICAgICAgY2xSZWxlYXNlS2VybmVsKGN0eC0+a2VybmVsKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG92ZXJsYXlfb3BlbmNsX2JsZW5kKEZGRnJhbWVTeW5jICpmcykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgKmF2Y3R4ID0gZnMtPnBhcmVudDsKKyAgICBBVkZpbHRlckxpbmsgICAgICpvdXRsaW5rID0gYXZjdHgtPm91dHB1dHNbMF07CisgICAgT3ZlcmxheU9wZW5DTENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIEFWRnJhbWUgKmlucHV0X21haW4sICppbnB1dF9vdmVybGF5OworICAgIEFWRnJhbWUgKm91dHB1dDsKKyAgICBjbF9tZW0gbWVtOworICAgIGNsX2ludCBjbGUsIHgsIHk7CisgICAgc2l6ZV90IGdsb2JhbF93b3JrWzJdOworICAgIGludCBrZXJuZWxfYXJnID0gMDsKKyAgICBpbnQgZXJyLCBwbGFuZTsKKworICAgIGVyciA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoZnMsIDAsICZpbnB1dF9tYWluLCAwKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICBlcnIgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKGZzLCAxLCAmaW5wdXRfb3ZlcmxheSwgMCk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAoIWN0eC0+aW5pdGlhbGlzZWQpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKm1haW5fZmMgPQorICAgICAgICAgICAgKEFWSFdGcmFtZXNDb250ZXh0KilpbnB1dF9tYWluLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAqb3ZlcmxheV9mYyA9CisgICAgICAgICAgICAoQVZIV0ZyYW1lc0NvbnRleHQqKWlucHV0X292ZXJsYXktPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICAgICAgZXJyID0gb3ZlcmxheV9vcGVuY2xfbG9hZChhdmN0eCwgbWFpbl9mYy0+c3dfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfZmMtPnN3X2Zvcm1hdCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBvdXRwdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0cHV0KSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IGN0eC0+bmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIGtlcm5lbF9hcmcgPSAwOworCisgICAgICAgIG1lbSA9IChjbF9tZW0pb3V0cHV0LT5kYXRhW3BsYW5lXTsKKyAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWwsIGtlcm5lbF9hcmcrKywgc2l6ZW9mKGNsX21lbSksICZtZW0pOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICBnb3RvIGZhaWxfa2VybmVsX2FyZzsKKworICAgICAgICBtZW0gPSAoY2xfbWVtKWlucHV0X21haW4tPmRhdGFbcGxhbmVdOworICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwga2VybmVsX2FyZysrLCBzaXplb2YoY2xfbWVtKSwgJm1lbSk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykKKyAgICAgICAgICAgIGdvdG8gZmFpbF9rZXJuZWxfYXJnOworCisgICAgICAgIG1lbSA9IChjbF9tZW0paW5wdXRfb3ZlcmxheS0+ZGF0YVtwbGFuZV07CisgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsLCBrZXJuZWxfYXJnKyssIHNpemVvZihjbF9tZW0pLCAmbWVtKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKQorICAgICAgICAgICAgZ290byBmYWlsX2tlcm5lbF9hcmc7CisKKyAgICAgICAgaWYgKGN0eC0+YWxwaGFfc2VwYXJhdGUpIHsKKyAgICAgICAgICAgIG1lbSA9IChjbF9tZW0paW5wdXRfb3ZlcmxheS0+ZGF0YVtjdHgtPm5iX3BsYW5lc107CisgICAgICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwga2VybmVsX2FyZysrLCBzaXplb2YoY2xfbWVtKSwgJm1lbSk7CisgICAgICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgZ290byBmYWlsX2tlcm5lbF9hcmc7CisgICAgICAgIH0KKworICAgICAgICB4ID0gY3R4LT54X3Bvc2l0aW9uIC8gKHBsYW5lID09IDAgPyAxIDogY3R4LT54X3N1YnNhbXBsZSk7CisgICAgICAgIHkgPSBjdHgtPnlfcG9zaXRpb24gLyAocGxhbmUgPT0gMCA/IDEgOiBjdHgtPnlfc3Vic2FtcGxlKTsKKworICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwga2VybmVsX2FyZysrLCBzaXplb2YoY2xfaW50KSwgJngpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICBnb3RvIGZhaWxfa2VybmVsX2FyZzsKKyAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWwsIGtlcm5lbF9hcmcrKywgc2l6ZW9mKGNsX2ludCksICZ5KTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKQorICAgICAgICAgICAgZ290byBmYWlsX2tlcm5lbF9hcmc7CisKKyAgICAgICAgaWYgKGN0eC0+YWxwaGFfc2VwYXJhdGUpIHsKKyAgICAgICAgICAgIGNsX2ludCBhbHBoYV9hZGpfeCA9IHBsYW5lID09IDAgPyAxIDogY3R4LT54X3N1YnNhbXBsZTsKKyAgICAgICAgICAgIGNsX2ludCBhbHBoYV9hZGpfeSA9IHBsYW5lID09IDAgPyAxIDogY3R4LT55X3N1YnNhbXBsZTsKKworICAgICAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWwsIGtlcm5lbF9hcmcrKywgc2l6ZW9mKGNsX2ludCksICZhbHBoYV9hZGpfeCk7CisgICAgICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICAgICAgZ290byBmYWlsX2tlcm5lbF9hcmc7CisgICAgICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwga2VybmVsX2FyZysrLCBzaXplb2YoY2xfaW50KSwgJmFscGhhX2Fkal95KTsKKyAgICAgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxfa2VybmVsX2FyZzsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGZmX29wZW5jbF9maWx0ZXJfd29ya19zaXplX2Zyb21faW1hZ2UoYXZjdHgsIGdsb2JhbF93b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgcGxhbmUsIDApOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBjbGUgPSBjbEVucXVldWVORFJhbmdlS2VybmVsKGN0eC0+Y29tbWFuZF9xdWV1ZSwgY3R4LT5rZXJuZWwsIDIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3dvcmssIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVucXVldWUgIgorICAgICAgICAgICAgICAgICAgICJvdmVybGF5IGtlcm5lbCBmb3IgcGxhbmUgJWQ6ICVkLlxuIiwgY2xlLCBwbGFuZSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGUgPSBjbEZpbmlzaChjdHgtPmNvbW1hbmRfcXVldWUpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBmaW5pc2ggIgorICAgICAgICAgICAgICAgImNvbW1hbmQgcXVldWU6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZXJyID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXRwdXQsIGlucHV0X21haW4pOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgb3V0cHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dHB1dC0+Zm9ybWF0KSwKKyAgICAgICAgICAgb3V0cHV0LT53aWR0aCwgb3V0cHV0LT5oZWlnaHQsIG91dHB1dC0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cHV0KTsKKworZmFpbF9rZXJuZWxfYXJnOgorICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBrZXJuZWwgYXJnICVkOiAlZC5cbiIsCisgICAgICAgICAgIGtlcm5lbF9hcmcsIGNsZSk7CisgICAgZXJyID0gQVZFUlJPUihFSU8pOworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXQpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3ZlcmxheV9vcGVuY2xfY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICphdmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBPdmVybGF5T3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGZmX29wZW5jbF9maWx0ZXJfY29uZmlnX291dHB1dChvdXRsaW5rKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGZmX2ZyYW1lc3luY19pbml0X2R1YWxpbnB1dCgmY3R4LT5mcywgYXZjdHgpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19jb25maWd1cmUoJmN0eC0+ZnMpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgb3ZlcmxheV9vcGVuY2xfaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIE92ZXJsYXlPcGVuQ0xDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKworICAgIGN0eC0+ZnMub25fZXZlbnQgPSAmb3ZlcmxheV9vcGVuY2xfYmxlbmQ7CisKKyAgICByZXR1cm4gZmZfb3BlbmNsX2ZpbHRlcl9pbml0KGF2Y3R4KTsKK30KKworc3RhdGljIGludCBvdmVybGF5X29wZW5jbF9hY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIE92ZXJsYXlPcGVuQ0xDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoJmN0eC0+ZnMpOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIG92ZXJsYXlfb3BlbmNsX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIE92ZXJsYXlPcGVuQ0xDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBjbF9pbnQgY2xlOworCisgICAgaWYgKGN0eC0+a2VybmVsKSB7CisgICAgICAgIGNsZSA9IGNsUmVsZWFzZUtlcm5lbChjdHgtPmtlcm5lbCk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2UgIgorICAgICAgICAgICAgICAgICAgICJrZXJuZWw6ICVkLlxuIiwgY2xlKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5jb21tYW5kX3F1ZXVlKSB7CisgICAgICAgIGNsZSA9IGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShjdHgtPmNvbW1hbmRfcXVldWUpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlICIKKyAgICAgICAgICAgICAgICAgICAiY29tbWFuZCBxdWV1ZTogJWQuXG4iLCBjbGUpOworICAgIH0KKworICAgIGZmX29wZW5jbF9maWx0ZXJfdW5pbml0KGF2Y3R4KTsKKworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJmN0eC0+ZnMpOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihPdmVybGF5T3BlbkNMQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG92ZXJsYXlfb3BlbmNsX29wdGlvbnNbXSA9IHsKKyAgICB7ICJ4IiwgIk92ZXJsYXkgeCBwb3NpdGlvbiIsCisgICAgICBPRkZTRVQoeF9wb3NpdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCBJTlRfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInkiLCAiT3ZlcmxheSB5IHBvc2l0aW9uIiwKKyAgICAgIE9GRlNFVCh5X3Bvc2l0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Mob3ZlcmxheV9vcGVuY2wpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3ZlcmxheV9vcGVuY2xfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gIm1haW4iLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gJmZmX29wZW5jbF9maWx0ZXJfY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gIm92ZXJsYXkiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gJmZmX29wZW5jbF9maWx0ZXJfY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdmVybGF5X29wZW5jbF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gJm92ZXJsYXlfb3BlbmNsX2NvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfb3ZlcmxheV9vcGVuY2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICA9ICJvdmVybGF5X29wZW5jbCIsCisgICAgLmRlc2NyaXB0aW9uICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPdmVybGF5IG9uZSB2aWRlbyBvbiB0b3Agb2YgYW5vdGhlciIpLAorICAgIC5wcml2X3NpemUgICAgICAgPSBzaXplb2YoT3ZlcmxheU9wZW5DTENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICAgPSAmb3ZlcmxheV9vcGVuY2xfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgICA9ICZvdmVybGF5X29wZW5jbF9pbml0LAorICAgIC51bmluaXQgICAgICAgICAgPSAmb3ZlcmxheV9vcGVuY2xfdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzICAgPSAmZmZfb3BlbmNsX2ZpbHRlcl9xdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgICAgPSAmb3ZlcmxheV9vcGVuY2xfYWN0aXZhdGUsCisgICAgLmlucHV0cyAgICAgICAgICA9IG92ZXJsYXlfb3BlbmNsX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICAgID0gb3ZlcmxheV9vcGVuY2xfb3V0cHV0cywKKyAgICAuZmxhZ3NfaW50ZXJuYWwgID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9vdmVybGF5X3Fzdi5jIGIvbGliYXZmaWx0ZXIvdmZfb3ZlcmxheV9xc3YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDg3MTc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfb3ZlcmxheV9xc3YuYwpAQCAtMCwwICsxLDQzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBBIGhhcmR3YXJlIGFjY2VsZXJhdGVkIG92ZXJsYXkgZmlsdGVyIGJhc2VkIG9uIEludGVsIFF1aWNrIFN5bmMgVmlkZW8gVlBQCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKworI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2luY2x1ZGUgImZyYW1lc3luYy5oIgorI2luY2x1ZGUgInFzdnZwcC5oIgorCisjZGVmaW5lIE1BSU4gICAgMAorI2RlZmluZSBPVkVSTEFZIDEKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUVNWT3ZlcmxheUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSkKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX01BSU5faVcsICAgICBWQVJfTVcsCisgICAgVkFSX01BSU5faUgsICAgICBWQVJfTUgsCisgICAgVkFSX09WRVJMQVlfaVcsCisgICAgVkFSX09WRVJMQVlfaUgsCisgICAgVkFSX09WRVJMQVlfWCwgIFZBUl9PWCwKKyAgICBWQVJfT1ZFUkxBWV9ZLCAgVkFSX09ZLAorICAgIFZBUl9PVkVSTEFZX1csICBWQVJfT1csCisgICAgVkFSX09WRVJMQVlfSCwgIFZBUl9PSCwKKyAgICBWQVJfVkFSU19OQgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUVNWT3ZlcmxheUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgICAgICAqY2xhc3M7CisKKyAgICBGRkZyYW1lU3luYyBmczsKKyAgICBRU1ZWUFBDb250ZXh0ICAgICAgKnFzdjsKKyAgICBRU1ZWUFBQYXJhbSAgICAgICAgcXN2X3BhcmFtOworICAgIG1meEV4dFZQUENvbXBvc2l0ZSBjb21wX2NvbmY7CisgICAgZG91YmxlICAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX1ZBUlNfTkJdOworCisgICAgY2hhciAgICAgKm92ZXJsYXlfb3gsICpvdmVybGF5X295LCAqb3ZlcmxheV9vdywgKm92ZXJsYXlfb2g7CisgICAgdWludDE2X3QgIG92ZXJsYXlfYWxwaGEsIG92ZXJsYXlfcGl4ZWxfYWxwaGE7CisKK30gUVNWT3ZlcmxheUNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKKyAgICAibWFpbl93IiwgICAgICJXIiwgICAvKiBpbnB1dCB3aWR0aCBvZiB0aGUgbWFpbiBsYXllciAqLworICAgICJtYWluX2giLCAgICAgIkgiLCAgIC8qIGlucHV0IGhlaWdodCBvZiB0aGUgbWFpbiBsYXllciAqLworICAgICJvdmVybGF5X2l3IiwgICAgICAgIC8qIGlucHV0IHdpZHRoIG9mIHRoZSBvdmVybGF5IGxheWVyICovCisgICAgIm92ZXJsYXlfaWgiLCAgICAgICAgLyogaW5wdXQgaGVpZ2h0IG9mIHRoZSBvdmVybGF5IGxheWVyICovCisgICAgIm92ZXJsYXlfeCIsICAieCIsICAgLyogeCBwb3NpdGlvbiBvZiB0aGUgb3ZlcmxheSBsYXllciBpbnNpZGUgb2YgbWFpbiAqLworICAgICJvdmVybGF5X3kiLCAgInkiLCAgIC8qIHkgcG9zaXRpb24gb2YgdGhlIG92ZXJsYXkgbGF5ZXIgaW5zaWRlIG9mIG1haW4gKi8KKyAgICAib3ZlcmxheV93IiwgICJ3IiwgICAvKiBvdXRwdXQgd2lkdGggb2Ygb3ZlcmxheSBsYXllciAqLworICAgICJvdmVybGF5X2giLCAgImgiLCAgIC8qIG91dHB1dCBoZWlnaHQgb2Ygb3ZlcmxheSBsYXllciAqLworICAgIE5VTEwKK307CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvdmVybGF5X3Fzdl9vcHRpb25zW10gPSB7CisgICAgeyAieCIsICJPdmVybGF5IHggcG9zaXRpb24iLCBPRkZTRVQob3ZlcmxheV9veCksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSIwIn0sIDAsIDI1NSwgLmZsYWdzID0gRkxBR1N9LAorICAgIHsgInkiLCAiT3ZlcmxheSB5IHBvc2l0aW9uIiwgT0ZGU0VUKG92ZXJsYXlfb3kpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0iMCJ9LCAwLCAyNTUsIC5mbGFncyA9IEZMQUdTfSwKKyAgICB7ICJ3IiwgIk92ZXJsYXkgd2lkdGgiLCAgICAgIE9GRlNFVChvdmVybGF5X293KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHI9Im92ZXJsYXlfaXcifSwgMCwgMjU1LCAuZmxhZ3MgPSBGTEFHU30sCisgICAgeyAiaCIsICJPdmVybGF5IGhlaWdodCIsICAgICBPRkZTRVQob3ZlcmxheV9vaCksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSJvdmVybGF5X2loKncvb3ZlcmxheV9pdyJ9LCAwLCAyNTUsIC5mbGFncyA9IEZMQUdTfSwKKyAgICB7ICJhbHBoYSIsICJPdmVybGF5IGdsb2JhbCBhbHBoYSIsIE9GRlNFVChvdmVybGF5X2FscGhhKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAyNTV9LCAwLCAyNTUsIC5mbGFncyA9IEZMQUdTfSwKKyAgICB7ICJlb2ZfYWN0aW9uIiwgIkFjdGlvbiB0byB0YWtlIHdoZW4gZW5jb3VudGVyaW5nIEVPRiBmcm9tIHNlY29uZGFyeSBpbnB1dCAiLAorICAgICAgICBPRkZTRVQoZnMub3B0X2VvZl9hY3Rpb24pLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IEVPRl9BQ1RJT05fUkVQRUFUIH0sCisgICAgICAgIEVPRl9BQ1RJT05fUkVQRUFULCBFT0ZfQUNUSU9OX1BBU1MsIC5mbGFncyA9IEZMQUdTLCAiZW9mX2FjdGlvbiIgfSwKKyAgICAgICAgeyAicmVwZWF0IiwgIlJlcGVhdCB0aGUgcHJldmlvdXMgZnJhbWUuIiwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gRU9GX0FDVElPTl9SRVBFQVQgfSwgLmZsYWdzID0gRkxBR1MsICJlb2ZfYWN0aW9uIiB9LAorICAgICAgICB7ICJlbmRhbGwiLCAiRW5kIGJvdGggc3RyZWFtcy4iLCAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBFT0ZfQUNUSU9OX0VOREFMTCB9LCAuZmxhZ3MgPSBGTEFHUywgImVvZl9hY3Rpb24iIH0sCisgICAgICAgIHsgInBhc3MiLCAgICJQYXNzIHRocm91Z2ggdGhlIG1haW4gaW5wdXQuIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEVPRl9BQ1RJT05fUEFTUyB9LCAgIC5mbGFncyA9IEZMQUdTLCAiZW9mX2FjdGlvbiIgfSwKKyAgICB7ICJzaG9ydGVzdCIsICJmb3JjZSB0ZXJtaW5hdGlvbiB3aGVuIHRoZSBzaG9ydGVzdCBpbnB1dCB0ZXJtaW5hdGVzIiwgT0ZGU0VUKGZzLm9wdF9zaG9ydGVzdCksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJyZXBlYXRsYXN0IiwgInJlcGVhdCBvdmVybGF5IG9mIHRoZSBsYXN0IG92ZXJsYXkgZnJhbWUiLCBPRkZTRVQoZnMub3B0X3JlcGVhdGxhc3QpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2ND0xfSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworRlJBTUVTWU5DX0RFRklORV9DTEFTUyhvdmVybGF5X3FzdiwgUVNWT3ZlcmxheUNvbnRleHQsIGZzKTsKKworc3RhdGljIGludCBldmFsX2V4cHIoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUVNWT3ZlcmxheUNvbnRleHQgKnZwcCA9IGN0eC0+cHJpdjsKKyAgICBkb3VibGUgICAgICp2YXJfdmFsdWVzID0gdnBwLT52YXJfdmFsdWVzOworICAgIGludCAgICAgICAgICAgICAgICByZXQgPSAwOworICAgIEFWRXhwciAqb3hfZXhwciA9IE5VTEwsICpveV9leHByID0gTlVMTDsKKyAgICBBVkV4cHIgKm93X2V4cHIgPSBOVUxMLCAqb2hfZXhwciA9IE5VTEw7CisKKyNkZWZpbmUgUEFTU19FWFBSKGUsIHMpIHtcCisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgmZSwgcywgdmFyX25hbWVzLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOyBcCisgICAgaWYgKHJldCA8IDApIHtcCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHdoZW4gcGFzc2luZyAnJXMnLlxuIiwgcyk7XAorICAgICAgICBnb3RvIHJlbGVhc2U7XAorICAgIH1cCit9CisgICAgUEFTU19FWFBSKG94X2V4cHIsIHZwcC0+b3ZlcmxheV9veCk7CisgICAgUEFTU19FWFBSKG95X2V4cHIsIHZwcC0+b3ZlcmxheV9veSk7CisgICAgUEFTU19FWFBSKG93X2V4cHIsIHZwcC0+b3ZlcmxheV9vdyk7CisgICAgUEFTU19FWFBSKG9oX2V4cHIsIHZwcC0+b3ZlcmxheV9vaCk7CisjdW5kZWYgUEFTU19FWFBSCisKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVkVSTEFZX1ddID0KKyAgICB2YXJfdmFsdWVzW1ZBUl9PV10gICAgICAgID0gYXZfZXhwcl9ldmFsKG93X2V4cHIsIHZhcl92YWx1ZXMsIE5VTEwpOworICAgIHZhcl92YWx1ZXNbVkFSX09WRVJMQVlfSF0gPQorICAgIHZhcl92YWx1ZXNbVkFSX09IXSAgICAgICAgPSBhdl9leHByX2V2YWwob2hfZXhwciwgdmFyX3ZhbHVlcywgTlVMTCk7CisKKyAgICAvKiBjYWxjIGFnYWluIGluIGNhc2Ugb3cgaXMgcmVsYXRpdmUgdG8gb2ggKi8KKyAgICB2YXJfdmFsdWVzW1ZBUl9PVkVSTEFZX1ddID0KKyAgICB2YXJfdmFsdWVzW1ZBUl9PV10gICAgICAgID0gYXZfZXhwcl9ldmFsKG93X2V4cHIsIHZhcl92YWx1ZXMsIE5VTEwpOworCisgICAgdmFyX3ZhbHVlc1tWQVJfT1ZFUkxBWV9YXSA9CisgICAgdmFyX3ZhbHVlc1tWQVJfT1hdICAgICAgICA9IGF2X2V4cHJfZXZhbChveF9leHByLCB2YXJfdmFsdWVzLCBOVUxMKTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVkVSTEFZX1ldID0KKyAgICB2YXJfdmFsdWVzW1ZBUl9PWV0gICAgICAgID0gYXZfZXhwcl9ldmFsKG95X2V4cHIsIHZhcl92YWx1ZXMsIE5VTEwpOworCisgICAgLyogY2FsYyBhZ2FpbiBpbiBjYXNlIG94IGlzIHJlbGF0aXZlIHRvIG95ICovCisgICAgdmFyX3ZhbHVlc1tWQVJfT1ZFUkxBWV9YXSA9CisgICAgdmFyX3ZhbHVlc1tWQVJfT1hdICAgICAgICA9IGF2X2V4cHJfZXZhbChveF9leHByLCB2YXJfdmFsdWVzLCBOVUxMKTsKKworICAgIC8qIGNhbGMgb3ZlcmxheV93IGFuZCBvdmVybGF5X2ggYWdhaW4gaW5jYXNlIHJlbGF0aXZlIHRvIG94LG95ICovCisgICAgdmFyX3ZhbHVlc1tWQVJfT1ZFUkxBWV9XXSA9CisgICAgdmFyX3ZhbHVlc1tWQVJfT1ddICAgICAgICA9IGF2X2V4cHJfZXZhbChvd19leHByLCB2YXJfdmFsdWVzLCBOVUxMKTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PVkVSTEFZX0hdID0KKyAgICB2YXJfdmFsdWVzW1ZBUl9PSF0gICAgICAgID0gYXZfZXhwcl9ldmFsKG9oX2V4cHIsIHZhcl92YWx1ZXMsIE5VTEwpOworICAgIHZhcl92YWx1ZXNbVkFSX09WRVJMQVlfV10gPQorICAgIHZhcl92YWx1ZXNbVkFSX09XXSAgICAgICAgPSBhdl9leHByX2V2YWwob3dfZXhwciwgdmFyX3ZhbHVlcywgTlVMTCk7CisKK3JlbGVhc2U6CisgICAgYXZfZXhwcl9mcmVlKG94X2V4cHIpOworICAgIGF2X2V4cHJfZnJlZShveV9leHByKTsKKyAgICBhdl9leHByX2ZyZWUob3dfZXhwcik7CisgICAgYXZfZXhwcl9mcmVlKG9oX2V4cHIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoYXZlX2FscGhhX3BsYW5hcihBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpmY3R4OworCisgICAgaWYgKGxpbmstPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1FTVikgeworICAgICAgICBmY3R4ICAgID0gKEFWSFdGcmFtZXNDb250ZXh0ICopbGluay0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICAgICAgcGl4X2ZtdCA9IGZjdHgtPnN3X2Zvcm1hdDsKKyAgICB9CisKKyAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuICEhKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBKTsKK30KKworc3RhdGljIGludCBjb25maWdfbWFpbl9pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgICAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgUVNWT3ZlcmxheUNvbnRleHQgICAgKnZwcCA9IGN0eC0+cHJpdjsKKyAgICBtZnhWUFBDb21wSW5wdXRTdHJlYW0gKnN0ID0gJnZwcC0+Y29tcF9jb25mLklucHV0U3RyZWFtWzBdOworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiSW5wdXRbJWRdIGlzIG9mICVzLlxuIiwgRkZfSU5MSU5LX0lEWChpbmxpbmspLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGlubGluay0+Zm9ybWF0KSk7CisKKyAgICB2cHAtPnZhcl92YWx1ZXNbVkFSX01BSU5faVddID0KKyAgICB2cHAtPnZhcl92YWx1ZXNbVkFSX01XXSAgICAgID0gaW5saW5rLT53OworICAgIHZwcC0+dmFyX3ZhbHVlc1tWQVJfTUFJTl9pSF0gPQorICAgIHZwcC0+dmFyX3ZhbHVlc1tWQVJfTUhdICAgICAgPSBpbmxpbmstPmg7CisKKyAgICBzdC0+RHN0WCAgICAgICAgICAgICAgPSAwOworICAgIHN0LT5Ec3RZICAgICAgICAgICAgICA9IDA7CisgICAgc3QtPkRzdFcgICAgICAgICAgICAgID0gaW5saW5rLT53OworICAgIHN0LT5Ec3RIICAgICAgICAgICAgICA9IGlubGluay0+aDsKKyAgICBzdC0+R2xvYmFsQWxwaGFFbmFibGUgPSAwOworICAgIHN0LT5QaXhlbEFscGhhRW5hYmxlICA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3ZlcmxheV9pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgICAgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFFTVk92ZXJsYXlDb250ZXh0ICAgICAqdnBwID0gY3R4LT5wcml2OworICAgIG1meFZQUENvbXBJbnB1dFN0cmVhbSAqc3QgID0gJnZwcC0+Y29tcF9jb25mLklucHV0U3RyZWFtWzFdOworICAgIGludCAgICAgICAgICAgICAgICAgICAgcmV0ID0gMDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIklucHV0WyVkXSBpcyBvZiAlcy5cbiIsIEZGX0lOTElOS19JRFgoaW5saW5rKSwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbmxpbmstPmZvcm1hdCkpOworCisgICAgdnBwLT52YXJfdmFsdWVzW1ZBUl9PVkVSTEFZX2lXXSA9IGlubGluay0+dzsKKyAgICB2cHAtPnZhcl92YWx1ZXNbVkFSX09WRVJMQVlfaUhdID0gaW5saW5rLT5oOworCisgICAgcmV0ID0gZXZhbF9leHByKGN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzdC0+RHN0WCAgICAgICAgICAgICAgPSB2cHAtPnZhcl92YWx1ZXNbVkFSX09YXTsKKyAgICBzdC0+RHN0WSAgICAgICAgICAgICAgPSB2cHAtPnZhcl92YWx1ZXNbVkFSX09ZXTsKKyAgICBzdC0+RHN0VyAgICAgICAgICAgICAgPSB2cHAtPnZhcl92YWx1ZXNbVkFSX09XXTsKKyAgICBzdC0+RHN0SCAgICAgICAgICAgICAgPSB2cHAtPnZhcl92YWx1ZXNbVkFSX09IXTsKKyAgICBzdC0+R2xvYmFsQWxwaGEgICAgICAgPSB2cHAtPm92ZXJsYXlfYWxwaGE7CisgICAgc3QtPkdsb2JhbEFscGhhRW5hYmxlID0gKHN0LT5HbG9iYWxBbHBoYSA8IDI1NSk7CisgICAgc3QtPlBpeGVsQWxwaGFFbmFibGUgID0gaGF2ZV9hbHBoYV9wbGFuYXIoaW5saW5rKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZnJhbWUoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAgKmN0eCA9IGZzLT5wYXJlbnQ7CisgICAgUVNWT3ZlcmxheUNvbnRleHQgICpzID0gZnMtPm9wYXF1ZTsKKyAgICBBVkZyYW1lICAgICAgICAqZnJhbWUgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgIHJldCA9IDAsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICByZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKGZzLCBpLCAmZnJhbWUsIDApOworICAgICAgICBpZiAocmV0ID09IDApCisgICAgICAgICAgICByZXQgPSBmZl9xc3Z2cHBfZmlsdGVyX2ZyYW1lKHMtPnFzdiwgY3R4LT5pbnB1dHNbaV0sIGZyYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9mcmFtZXN5bmMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUVNWT3ZlcmxheUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCwgaTsKKworICAgIHMtPmZzLm9uX2V2ZW50ID0gcHJvY2Vzc19mcmFtZTsKKyAgICBzLT5mcy5vcGFxdWUgICA9IHM7CisgICAgcmV0ID0gZmZfZnJhbWVzeW5jX2luaXQoJnMtPmZzLCBjdHgsIGN0eC0+bmJfaW5wdXRzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIEZGRnJhbWVTeW5jSW4gKmluID0gJnMtPmZzLmluW2ldOworICAgICAgICBpbi0+YmVmb3JlICAgID0gRVhUX1NUT1A7CisgICAgICAgIGluLT5hZnRlciAgICAgPSBFWFRfSU5GSU5JVFk7CisgICAgICAgIGluLT5zeW5jICAgICAgPSBpID8gMSA6IDI7CisgICAgICAgIGluLT50aW1lX2Jhc2UgPSBjdHgtPmlucHV0c1tpXS0+dGltZV9iYXNlOworICAgIH0KKworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZzLT5mcyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBRU1ZPdmVybGF5Q29udGV4dCAqdnBwID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAgICAgICppbjAgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgICAgICAqaW4xID0gY3R4LT5pbnB1dHNbMV07CisgICAgaW50IHJldDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIk91dHB1dCBpcyBvZiAlcy5cbiIsIGF2X2dldF9waXhfZm10X25hbWUob3V0bGluay0+Zm9ybWF0KSk7CisgICAgaWYgKChpbjAtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1FTViAmJiBpbjEtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX1FTVikgfHwKKyAgICAgICAgKGluMC0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfUVNWICYmIGluMS0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfUVNWKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJNaXhpbmcgaGFyZHdhcmUgYW5kIHNvZnR3YXJlIHBpeGVsIGZvcm1hdHMgaXMgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0gZWxzZSBpZiAoaW4wLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9RU1YpIHsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmh3X2ZyYW1lMCA9IChBVkhXRnJhbWVzQ29udGV4dCAqKWluMC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmh3X2ZyYW1lMSA9IChBVkhXRnJhbWVzQ29udGV4dCAqKWluMS0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKworICAgICAgICBpZiAoaHdfZnJhbWUwLT5kZXZpY2VfY3R4ICE9IGh3X2ZyYW1lMS0+ZGV2aWNlX2N0eCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW5wdXRzIHdpdGggZGlmZmVyZW50IHVuZGVybHlpbmcgUVNWIGRldmljZXMgYXJlIGZvcmJpZGRlbi5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dGxpbmstPncgICAgICAgICAgPSB2cHAtPnZhcl92YWx1ZXNbVkFSX01XXTsKKyAgICBvdXRsaW5rLT5oICAgICAgICAgID0gdnBwLT52YXJfdmFsdWVzW1ZBUl9NSF07CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGluMC0+ZnJhbWVfcmF0ZTsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgID0gYXZfaW52X3Eob3V0bGluay0+ZnJhbWVfcmF0ZSk7CisKKyAgICByZXQgPSBpbml0X2ZyYW1lc3luYyhjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIGZmX3FzdnZwcF9jcmVhdGUoY3R4LCAmdnBwLT5xc3YsICZ2cHAtPnFzdl9wYXJhbSk7Cit9CisKKy8qCisgKiBDYWxsYmFjayBmb3IgcXN2dnBwCisgKiBATm90ZTogcXN2dnBwIGNvbXBvc2l0aW9uIGRvZXMgbm90IGdlbmVyYXRlIFBUUyBmb3IgcmVzdWx0IGZyYW1lLgorICogICAgICAgIHNvIHdlIGFzc2lnbiB0aGUgUFRTIGZyb20gZnJhbWVzeW5jIHRvIHRoZSBvdXRwdXQgZnJhbWUuCisgKi8KKworc3RhdGljIGludCBmaWx0ZXJfY2FsbGJhY2soQVZGaWx0ZXJMaW5rICpvdXRsaW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBRU1ZPdmVybGF5Q29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKKyAgICBmcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9xKHMtPmZzLnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZzLnRpbWVfYmFzZSwgb3V0bGluay0+dGltZV9iYXNlKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGZyYW1lKTsKK30KKworCitzdGF0aWMgaW50IG92ZXJsYXlfcXN2X2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUVNWT3ZlcmxheUNvbnRleHQgKnZwcCA9IGN0eC0+cHJpdjsKKworICAgIC8qIGZpbGwgY29tcG9zaXRlIGNvbmZpZyAqLworICAgIHZwcC0+Y29tcF9jb25mLkhlYWRlci5CdWZmZXJJZCA9IE1GWF9FWFRCVUZGX1ZQUF9DT01QT1NJVEU7CisgICAgdnBwLT5jb21wX2NvbmYuSGVhZGVyLkJ1ZmZlclN6ID0gc2l6ZW9mKHZwcC0+Y29tcF9jb25mKTsKKyAgICB2cHAtPmNvbXBfY29uZi5OdW1JbnB1dFN0cmVhbSAgPSBjdHgtPm5iX2lucHV0czsKKyAgICB2cHAtPmNvbXBfY29uZi5JbnB1dFN0cmVhbSAgICAgPSBhdl9tYWxsb2N6X2FycmF5KGN0eC0+bmJfaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCp2cHAtPmNvbXBfY29uZi5JbnB1dFN0cmVhbSkpOworICAgIGlmICghdnBwLT5jb21wX2NvbmYuSW5wdXRTdHJlYW0pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBpbml0aWFsaXplIFFTVlZQUCBwYXJhbXMgKi8KKyAgICB2cHAtPnFzdl9wYXJhbS5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfY2FsbGJhY2s7CisgICAgdnBwLT5xc3ZfcGFyYW0uZXh0X2J1ZiAgICAgID0gYXZfbWFsbG9jeihzaXplb2YoKnZwcC0+cXN2X3BhcmFtLmV4dF9idWYpKTsKKyAgICBpZiAoIXZwcC0+cXN2X3BhcmFtLmV4dF9idWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB2cHAtPnFzdl9wYXJhbS5leHRfYnVmWzBdICAgID0gKG1meEV4dEJ1ZmZlciAqKSZ2cHAtPmNvbXBfY29uZjsKKyAgICB2cHAtPnFzdl9wYXJhbS5udW1fZXh0X2J1ZiAgID0gMTsKKyAgICB2cHAtPnFzdl9wYXJhbS5vdXRfc3dfZm9ybWF0ID0gQVZfUElYX0ZNVF9OVjEyOworICAgIHZwcC0+cXN2X3BhcmFtLm51bV9jcm9wICAgICAgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG92ZXJsYXlfcXN2X3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBRU1ZPdmVybGF5Q29udGV4dCAqdnBwID0gY3R4LT5wcml2OworCisgICAgZmZfcXN2dnBwX2ZyZWUoJnZwcC0+cXN2KTsKKyAgICBmZl9mcmFtZXN5bmNfdW5pbml0KCZ2cHAtPmZzKTsKKyAgICBhdl9mcmVlcCgmdnBwLT5jb21wX2NvbmYuSW5wdXRTdHJlYW0pOworICAgIGF2X2ZyZWVwKCZ2cHAtPnFzdl9wYXJhbS5leHRfYnVmKTsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBRU1ZPdmVybGF5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7Cit9CisKK3N0YXRpYyBpbnQgb3ZlcmxheV9xc3ZfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0OworCisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBtYWluX2luX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05WMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVZVjQyMiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IzMiwKKyAgICAgICAgQVZfUElYX0ZNVF9RU1YsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9OVjEyLAorICAgICAgICBBVl9QSVhfRk1UX1FTViwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIHJldCA9IGZmX2Zvcm1hdHNfcmVmKGZmX21ha2VfZm9ybWF0X2xpc3QobWFpbl9pbl9mbXRzKSwgJmN0eC0+aW5wdXRzW2ldLT5vdXRfZm9ybWF0cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KG91dF9waXhfZm10cyksICZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdmVybGF5X3Fzdl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gIm1haW4iLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfbWFpbl9pbnB1dCwKKyAgICAgICAgLm5lZWRzX2ZpZm8gICAgPSAxLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJvdmVybGF5IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX292ZXJsYXlfaW5wdXQsCisgICAgICAgIC5uZWVkc19maWZvICAgID0gMSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3ZlcmxheV9xc3Zfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfb3ZlcmxheV9xc3YgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm92ZXJsYXlfcXN2IiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUXVpY2sgU3luYyBWaWRlbyBvdmVybGF5LiIpLAorICAgIC5wcml2X3NpemUgICAgICA9IHNpemVvZihRU1ZPdmVybGF5Q29udGV4dCksCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gb3ZlcmxheV9xc3ZfcXVlcnlfZm9ybWF0cywKKyAgICAucHJlaW5pdCAgICAgICAgPSBvdmVybGF5X3Fzdl9mcmFtZXN5bmNfcHJlaW5pdCwKKyAgICAuaW5pdCAgICAgICAgICAgPSBvdmVybGF5X3Fzdl9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9IG92ZXJsYXlfcXN2X3VuaW5pdCwKKyAgICAuYWN0aXZhdGUgICAgICAgPSBhY3RpdmF0ZSwKKyAgICAuaW5wdXRzICAgICAgICAgPSBvdmVybGF5X3Fzdl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gb3ZlcmxheV9xc3Zfb3V0cHV0cywKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmb3ZlcmxheV9xc3ZfY2xhc3MsCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9vd2Rlbm9pc2UuYyBiL2xpYmF2ZmlsdGVyL3ZmX293ZGVub2lzZS5jCmluZGV4IDNhNzdmODkuLjZkNmMyYTMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX293ZGVub2lzZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX293ZGVub2lzZS5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBPV0Rlbm9pc2VDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBkb3VibGUgbHVtYV9zdHJlbmd0aDsKICAgICBkb3VibGUgY2hyb21hX3N0cmVuZ3RoOwpAQCAtNDIsNiArNDIsNyBAQAogICAgIGZsb2F0ICpwbGFuZVsxNisxXVs0XTsKICAgICBpbnQgbGluZXNpemU7CiAgICAgaW50IGhzdWIsIHZzdWI7CisgICAgaW50IHBpeGVsX2RlcHRoOwogfSBPV0Rlbm9pc2VDb250ZXh0OwogCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihPV0Rlbm9pc2VDb250ZXh0LCB4KQpAQCAtMTg4LDkgKzE4OSwxOCBAQAogICAgIHdoaWxlICgxPDxkZXB0aCA+IHdpZHRoIHx8IDE8PGRlcHRoID4gaGVpZ2h0KQogICAgICAgICBkZXB0aC0tOwogCi0gICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQotICAgICAgICBmb3IoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQotICAgICAgICAgICAgcy0+cGxhbmVbMF1bMF1beSpzLT5saW5lc2l6ZSArIHhdID0gc3JjW3kqc3JjX2xpbmVzaXplICsgeF07CisgICAgaWYgKHMtPnBpeGVsX2RlcHRoIDw9IDgpIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQorICAgICAgICAgICAgZm9yKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICBzLT5wbGFuZVswXVswXVt5KnMtPmxpbmVzaXplICsgeF0gPSBzcmNbeSpzcmNfbGluZXNpemUgKyB4XTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjMTYgPSAoY29uc3QgdWludDE2X3QgKilzcmM7CisKKyAgICAgICAgc3JjX2xpbmVzaXplIC89IDI7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKyAgICAgICAgICAgIGZvcih4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgcy0+cGxhbmVbMF1bMF1beSpzLT5saW5lc2l6ZSArIHhdID0gc3JjMTZbeSpzcmNfbGluZXNpemUgKyB4XTsKKyAgICB9CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgZGVwdGg7IGkrKykKICAgICAgICAgZGVjb21wb3NlMkQyKHMtPnBsYW5lW2kgKyAxXSwgcy0+cGxhbmVbaV1bMF0sIHMtPnBsYW5lWzBdICsgMSwgcy0+bGluZXNpemUsIDE8PGksIHdpZHRoLCBoZWlnaHQpOwpAQCAtMjExLDE4ICsyMjEsMjkgQEAKICAgICBmb3IgKGkgPSBkZXB0aC0xOyBpID49IDA7IGktLSkKICAgICAgICAgY29tcG9zZTJEMihzLT5wbGFuZVtpXVswXSwgcy0+cGxhbmVbaSArIDFdLCBzLT5wbGFuZVswXSArIDEsIHMtPmxpbmVzaXplLCAxPDxpLCB3aWR0aCwgaGVpZ2h0KTsKIAotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotICAgICAgICAgICAgaSA9IHMtPnBsYW5lWzBdWzBdW3kqcy0+bGluZXNpemUgKyB4XSArIGRpdGhlclt4JjddW3kmN10qKDEuMC82NCkgKyAxLjAvMTI4OyAvLyB5ZXMgdGhlIHJvdW5kaW5nIGlzIGluc2FuZSBidXQgb3B0aW1hbCA6KQotICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClpID4gMjU1VSkgaSA9IH4oaSA+PiAzMSk7Ci0gICAgICAgICAgICBkc3RbeSpkc3RfbGluZXNpemUgKyB4XSA9IGk7CisgICAgaWYgKHMtPnBpeGVsX2RlcHRoIDw9IDgpIHsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgICAgIGkgPSBzLT5wbGFuZVswXVswXVt5KnMtPmxpbmVzaXplICsgeF0gKyBkaXRoZXJbeCY3XVt5JjddKigxLjAvNjQpICsgMS4wLzEyODsgLy8geWVzIHRoZSByb3VuZGluZyBpcyBpbnNhbmUgYnV0IG9wdGltYWwgOikKKyAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKWkgPiAyNTVVKSBpID0gfihpID4+IDMxKTsKKyAgICAgICAgICAgICAgICBkc3RbeSpkc3RfbGluZXNpemUgKyB4XSA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MTZfdCAqZHN0MTYgPSAodWludDE2X3QgKilkc3Q7CisKKyAgICAgICAgZHN0X2xpbmVzaXplIC89IDI7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpID0gcy0+cGxhbmVbMF1bMF1beSpzLT5saW5lc2l6ZSArIHhdOworICAgICAgICAgICAgICAgIGRzdDE2W3kqZHN0X2xpbmVzaXplICsgeF0gPSBpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiBzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCiB7Ci0gICAgaW50IGRpcmVjdCA9IDA7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKICAgICBPV0Rlbm9pc2VDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKQEAgLTIzMSw4ICsyNTIsMTQgQEAKICAgICBjb25zdCBpbnQgY2ggPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHMtPnZzdWIpOwogCiAgICAgaWYgKGF2X2ZyYW1lX2lzX3dyaXRhYmxlKGluKSkgewotICAgICAgICBkaXJlY3QgPSAxOwogICAgICAgICBvdXQgPSBpbjsKKworICAgICAgICBpZiAocy0+bHVtYV9zdHJlbmd0aCA+IDApCisgICAgICAgICAgICBmaWx0ZXIocywgb3V0LT5kYXRhWzBdLCBvdXQtPmxpbmVzaXplWzBdLCBpbi0+ZGF0YVswXSwgaW4tPmxpbmVzaXplWzBdLCBpbmxpbmstPncsIGlubGluay0+aCwgcy0+bHVtYV9zdHJlbmd0aCk7CisgICAgICAgIGlmIChzLT5jaHJvbWFfc3RyZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmaWx0ZXIocywgb3V0LT5kYXRhWzFdLCBvdXQtPmxpbmVzaXplWzFdLCBpbi0+ZGF0YVsxXSwgaW4tPmxpbmVzaXplWzFdLCBjdywgICAgICAgIGNoLCAgICAgICAgcy0+Y2hyb21hX3N0cmVuZ3RoKTsKKyAgICAgICAgICAgIGZpbHRlcihzLCBvdXQtPmRhdGFbMl0sIG91dC0+bGluZXNpemVbMl0sIGluLT5kYXRhWzJdLCBpbi0+bGluZXNpemVbMl0sIGN3LCAgICAgICAgY2gsICAgICAgICBzLT5jaHJvbWFfc3RyZW5ndGgpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgb3V0ID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKICAgICAgICAgaWYgKCFvdXQpIHsKQEAgLTI0MCwxMyArMjY3LDIwIEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CiAgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7Ci0gICAgfQogCi0gICAgZmlsdGVyKHMsIG91dC0+ZGF0YVswXSwgb3V0LT5saW5lc2l6ZVswXSwgaW4tPmRhdGFbMF0sIGluLT5saW5lc2l6ZVswXSwgaW5saW5rLT53LCBpbmxpbmstPmgsIHMtPmx1bWFfc3RyZW5ndGgpOwotICAgIGZpbHRlcihzLCBvdXQtPmRhdGFbMV0sIG91dC0+bGluZXNpemVbMV0sIGluLT5kYXRhWzFdLCBpbi0+bGluZXNpemVbMV0sIGN3LCAgICAgICAgY2gsICAgICAgICBzLT5jaHJvbWFfc3RyZW5ndGgpOwotICAgIGZpbHRlcihzLCBvdXQtPmRhdGFbMl0sIG91dC0+bGluZXNpemVbMl0sIGluLT5kYXRhWzJdLCBpbi0+bGluZXNpemVbMl0sIGN3LCAgICAgICAgY2gsICAgICAgICBzLT5jaHJvbWFfc3RyZW5ndGgpOworICAgICAgICBpZiAocy0+bHVtYV9zdHJlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZpbHRlcihzLCBvdXQtPmRhdGFbMF0sIG91dC0+bGluZXNpemVbMF0sIGluLT5kYXRhWzBdLCBpbi0+bGluZXNpemVbMF0sIGlubGluay0+dywgaW5saW5rLT5oLCBzLT5sdW1hX3N0cmVuZ3RoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUob3V0LT5kYXRhWzBdLCBvdXQtPmxpbmVzaXplWzBdLCBpbiAtPmRhdGFbMF0sIGluIC0+bGluZXNpemVbMF0sIGlubGluay0+dywgaW5saW5rLT5oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+Y2hyb21hX3N0cmVuZ3RoID4gMCkgeworICAgICAgICAgICAgZmlsdGVyKHMsIG91dC0+ZGF0YVsxXSwgb3V0LT5saW5lc2l6ZVsxXSwgaW4tPmRhdGFbMV0sIGluLT5saW5lc2l6ZVsxXSwgY3csIGNoLCBzLT5jaHJvbWFfc3RyZW5ndGgpOworICAgICAgICAgICAgZmlsdGVyKHMsIG91dC0+ZGF0YVsyXSwgb3V0LT5saW5lc2l6ZVsyXSwgaW4tPmRhdGFbMl0sIGluLT5saW5lc2l6ZVsyXSwgY3csIGNoLCBzLT5jaHJvbWFfc3RyZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbMV0sIG91dC0+bGluZXNpemVbMV0sIGluIC0+ZGF0YVsxXSwgaW4gLT5saW5lc2l6ZVsxXSwgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbMl0sIG91dC0+bGluZXNpemVbMl0sIGluIC0+ZGF0YVsyXSwgaW4gLT5saW5lc2l6ZVsyXSwgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgICAgICB9CiAKLSAgICBpZiAoIWRpcmVjdCkgewogICAgICAgICBpZiAoaW4tPmRhdGFbM10pCiAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVszXSwgb3V0LT5saW5lc2l6ZVszXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gLT5kYXRhWzNdLCBpbiAtPmxpbmVzaXplWzNdLApAQCAtMjY1LDYgKzI5OSwxMyBAQAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCAgICAgQVZfUElYX0ZNVF9ZVVZBNDIyUCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsIEFWX1BJWF9GTVRfWVVWNDIwUDE0LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTYsIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LAogICAgICAgICBBVl9QSVhfRk1UX05PTkUKICAgICB9OwogICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CkBAIC0yODIsNiArMzIzLDcgQEAKIAogICAgIHMtPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OwogICAgIHMtPnZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIHMtPnBpeGVsX2RlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKIAogICAgIHMtPmxpbmVzaXplID0gRkZBTElHTihpbmxpbmstPncsIDE2KTsKICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9wYWQuYyBiL2xpYmF2ZmlsdGVyL3ZmX3BhZC5jCmluZGV4IDM1Zjk1NWQuLmVkMTU1NTcgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3BhZC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3BhZC5jCkBAIC0yNCw2ICsyNCw4IEBACiAgKiB2aWRlbyBwYWRkaW5nIGZpbHRlcgogICovCiAKKyNpbmNsdWRlIDxmbG9hdC5oPiAgLyogREJMX01BWCAqLworCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKICNpbmNsdWRlICJmb3JtYXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTMzLDcgKzM1LDYgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbG9yc3BhY2UuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgpAQCAtNzYsMTEgKzc3LDE5IEBACiAgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX2RyYXdfc3VwcG9ydGVkX3BpeGVsX2Zvcm1hdHMoMCkpOwogfQogCitlbnVtIEV2YWxNb2RlIHsKKyAgICBFVkFMX01PREVfSU5JVCwKKyAgICBFVkFMX01PREVfRlJBTUUsCisgICAgRVZBTF9NT0RFX05CCit9OworCiB0eXBlZGVmIHN0cnVjdCBQYWRDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgdywgaDsgICAgICAgICAgICAgICAvLy88IG91dHB1dCBkaW1lbnNpb25zLCBhIHZhbHVlIG9mIDAgd2lsbCByZXN1bHQgaW4gdGhlIGlucHV0IHNpemUKICAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAvLy88IG9mZnNldHMgb2YgdGhlIGlucHV0IGFyZWEgd2l0aCByZXNwZWN0IHRvIHRoZSBwYWRkZWQgYXJlYQogICAgIGludCBpbl93LCBpbl9oOyAgICAgICAgIC8vLzwgd2lkdGggYW5kIGhlaWdodCBmb3IgdGhlIHBhZGRlZCBpbnB1dCB2aWRlbywgd2hpY2ggaGFzIHRvIGJlIGFsaWduZWQgdG8gdGhlIGNocm9tYSB2YWx1ZXMgaW4gb3JkZXIgdG8gYXZvaWQgY2hyb21hIGlzc3VlcworICAgIGludCBpbmxpbmtfdywgaW5saW5rX2g7CisgICAgQVZSYXRpb25hbCBhc3BlY3Q7CiAKICAgICBjaGFyICp3X2V4cHI7ICAgICAgICAgICAvLy88IHdpZHRoICBleHByZXNzaW9uIHN0cmluZwogICAgIGNoYXIgKmhfZXhwcjsgICAgICAgICAgIC8vLzwgaGVpZ2h0IGV4cHJlc3Npb24gc3RyaW5nCkBAIC04OSwxMiArOTgsMTUgQEAKICAgICB1aW50OF90IHJnYmFfY29sb3JbNF07ICAvLy88IGNvbG9yIGZvciB0aGUgcGFkZGluZyBhcmVhCiAgICAgRkZEcmF3Q29udGV4dCBkcmF3OwogICAgIEZGRHJhd0NvbG9yIGNvbG9yOworCisgICAgaW50IGV2YWxfbW9kZTsgICAgICAgICAgLy8vPCBleHByZXNzaW9uIGV2YWx1YXRpb24gbW9kZQogfSBQYWRDb250ZXh0OwogCiBzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwogICAgIFBhZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZSYXRpb25hbCBhZGp1c3RlZF9hc3BlY3QgPSBzLT5hc3BlY3Q7CiAgICAgaW50IHJldDsKICAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJTX05CXSwgcmVzOwogICAgIGNoYXIgKmV4cHI7CkBAIC0xMzUsNiArMTQ3LDE1IEBACiAgICAgaWYgKCFzLT53KQogICAgICAgICB2YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSB2YXJfdmFsdWVzW1ZBUl9PV10gPSBzLT53ID0gaW5saW5rLT53OwogCisgICAgaWYgKGFkanVzdGVkX2FzcGVjdC5udW0gJiYgYWRqdXN0ZWRfYXNwZWN0LmRlbikgeworICAgICAgICBhZGp1c3RlZF9hc3BlY3QgPSBhdl9kaXZfcShhZGp1c3RlZF9hc3BlY3QsIGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyk7CisgICAgICAgIGlmIChzLT5oIDwgYXZfcmVzY2FsZShzLT53LCBhZGp1c3RlZF9hc3BlY3QuZGVuLCBhZGp1c3RlZF9hc3BlY3QubnVtKSkgeworICAgICAgICAgICAgcy0+aCA9IHZhcl92YWx1ZXNbVkFSX09VVF9IXSA9IHZhcl92YWx1ZXNbVkFSX09IXSA9IGF2X3Jlc2NhbGUocy0+dywgYWRqdXN0ZWRfYXNwZWN0LmRlbiwgYWRqdXN0ZWRfYXNwZWN0Lm51bSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT53ID0gdmFyX3ZhbHVlc1tWQVJfT1VUX1ddID0gdmFyX3ZhbHVlc1tWQVJfT1ddID0gYXZfcmVzY2FsZShzLT5oLCBhZGp1c3RlZF9hc3BlY3QubnVtLCBhZGp1c3RlZF9hc3BlY3QuZGVuKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qIGV2YWx1YXRlIHggYW5kIHkgKi8KICAgICBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gcy0+eF9leHByKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKQEAgLTE1Miw4ICsxNzMsMTMgQEAKICAgICAgICAgZ290byBldmFsX2ZhaWw7CiAgICAgcy0+eCA9IHZhcl92YWx1ZXNbVkFSX1hdID0gcmVzOwogCisgICAgaWYgKHMtPnggPCAwIHx8IHMtPnggKyBpbmxpbmstPncgPiBzLT53KQorICAgICAgICBzLT54ID0gdmFyX3ZhbHVlc1tWQVJfWF0gPSAocy0+dyAtIGlubGluay0+dykgLyAyOworICAgIGlmIChzLT55IDwgMCB8fCBzLT55ICsgaW5saW5rLT5oID4gcy0+aCkKKyAgICAgICAgcy0+eSA9IHZhcl92YWx1ZXNbVkFSX1ldID0gKHMtPmggLSBpbmxpbmstPmgpIC8gMjsKKwogICAgIC8qIHNhbml0eSBjaGVjayBwYXJhbXMgKi8KLSAgICBpZiAocy0+dyA8IDAgfHwgcy0+aCA8IDAgfHwgcy0+eCA8IDAgfHwgcy0+eSA8IDApIHsKKyAgICBpZiAocy0+dyA8IDAgfHwgcy0+aCA8IDApIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTmVnYXRpdmUgdmFsdWVzIGFyZSBub3QgYWNjZXB0YWJsZS5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KQEAgLTE2NCw2ICsxOTAsOCBAQAogICAgIHMtPnkgICAgPSBmZl9kcmF3X3JvdW5kX3RvX3N1Yigmcy0+ZHJhdywgMSwgLTEsIHMtPnkpOwogICAgIHMtPmluX3cgPSBmZl9kcmF3X3JvdW5kX3RvX3N1Yigmcy0+ZHJhdywgMCwgLTEsIGlubGluay0+dyk7CiAgICAgcy0+aW5faCA9IGZmX2RyYXdfcm91bmRfdG9fc3ViKCZzLT5kcmF3LCAxLCAtMSwgaW5saW5rLT5oKTsKKyAgICBzLT5pbmxpbmtfdyA9IGlubGluay0+dzsKKyAgICBzLT5pbmxpbmtfaCA9IGlubGluay0+aDsKIAogICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAidzolZCBoOiVkIC0+IHc6JWQgaDolZCB4OiVkIHk6JWQgY29sb3I6MHglMDJYJTAyWCUwMlglMDJYXG4iLAogICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgcy0+dywgcy0+aCwgcy0+eCwgcy0+eSwKQEAgLTIwMCwxMiArMjI4LDE2IEBACiBzdGF0aWMgQVZGcmFtZSAqZ2V0X3ZpZGVvX2J1ZmZlcihBVkZpbHRlckxpbmsgKmlubGluaywgaW50IHcsIGludCBoKQogewogICAgIFBhZENvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLQotICAgIEFWRnJhbWUgKmZyYW1lID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArIChzLT53IC0gcy0+aW5fdyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggKyAocy0+aCAtIHMtPmluX2gpICsgKHMtPnggPiAwKSk7CisgICAgQVZGcmFtZSAqZnJhbWU7CiAgICAgaW50IHBsYW5lOwogCisgICAgaWYgKHMtPmlubGlua193IDw9IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZnJhbWUgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKGlubGluay0+ZHN0LT5vdXRwdXRzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICsgKHMtPncgLSBzLT5pbl93KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCArIChzLT5oIC0gcy0+aW5faCkgKyAocy0+eCA+IDApKTsKKwogICAgIGlmICghZnJhbWUpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0yOTEsOCArMzIzLDM1IEBACiBzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCiB7CiAgICAgUGFkQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGlubGluay0+ZHN0LT5vdXRwdXRzWzBdOwogICAgIEFWRnJhbWUgKm91dDsKLSAgICBpbnQgbmVlZHNfY29weSA9IGZyYW1lX25lZWRzX2NvcHkocywgaW4pOworICAgIGludCBuZWVkc19jb3B5OworICAgIGlmKHMtPmV2YWxfbW9kZSA9PSBFVkFMX01PREVfRlJBTUUgJiYgKAorICAgICAgICAgICBpbi0+d2lkdGggICE9IHMtPmlubGlua193CisgICAgICAgIHx8IGluLT5oZWlnaHQgIT0gcy0+aW5saW5rX2gKKyAgICAgICAgfHwgaW4tPmZvcm1hdCAhPSBvdXRsaW5rLT5mb3JtYXQKKyAgICAgICAgfHwgaW4tPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuICE9IG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIHx8IGluLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkpIHsKKyAgICAgICAgaW50IHJldDsKKworICAgICAgICBpbmxpbmstPmRzdC0+aW5wdXRzWzBdLT5mb3JtYXQgPSBpbi0+Zm9ybWF0OworICAgICAgICBpbmxpbmstPmRzdC0+aW5wdXRzWzBdLT53ICAgICAgPSBpbi0+d2lkdGg7CisgICAgICAgIGlubGluay0+ZHN0LT5pbnB1dHNbMF0tPmggICAgICA9IGluLT5oZWlnaHQ7CisKKyAgICAgICAgaW5saW5rLT5kc3QtPmlucHV0c1swXS0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPSBpbi0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW47CisgICAgICAgIGlubGluay0+ZHN0LT5pbnB1dHNbMF0tPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gaW4tPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtOworCisKKyAgICAgICAgaWYgKChyZXQgPSBjb25maWdfaW5wdXQoaW5saW5rKSkgPCAwKSB7CisgICAgICAgICAgICBzLT5pbmxpbmtfdyA9IC0xOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGNvbmZpZ19vdXRwdXQob3V0bGluaykpIDwgMCkgeworICAgICAgICAgICAgcy0+aW5saW5rX3cgPSAtMTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuZWVkc19jb3B5ID0gZnJhbWVfbmVlZHNfY29weShzLCBpbik7CiAKICAgICBpZiAobmVlZHNfY29weSkgewogICAgICAgICBhdl9sb2coaW5saW5rLT5kc3QsIEFWX0xPR19ERUJVRywgIkRpcmVjdCBwYWRkaW5nIGltcG9zc2libGUgYWxsb2NhdGluZyBuZXcgZnJhbWVcbiIpOwpAQCAtMzY1LDYgKzQyNCwxMCBAQAogICAgIHsgIngiLCAgICAgICJzZXQgdGhlIHggb2Zmc2V0IGV4cHJlc3Npb24gZm9yIHRoZSBpbnB1dCBpbWFnZSBwb3NpdGlvbiIsIE9GRlNFVCh4X2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIjAifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAogICAgIHsgInkiLCAgICAgICJzZXQgdGhlIHkgb2Zmc2V0IGV4cHJlc3Npb24gZm9yIHRoZSBpbnB1dCBpbWFnZSBwb3NpdGlvbiIsIE9GRlNFVCh5X2V4cHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gIjAifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAogICAgIHsgImNvbG9yIiwgICJzZXQgdGhlIGNvbG9yIG9mIHRoZSBwYWRkZWQgYXJlYSBib3JkZXIiLCBPRkZTRVQocmdiYV9jb2xvciksIEFWX09QVF9UWVBFX0NPTE9SLCB7LnN0ciA9ICJibGFjayJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImV2YWwiLCAgICJzcGVjaWZ5IHdoZW4gdG8gZXZhbHVhdGUgZXhwcmVzc2lvbnMiLCAgICBPRkZTRVQoZXZhbF9tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEVWQUxfTU9ERV9JTklUfSwgMCwgRVZBTF9NT0RFX05CLTEsIEZMQUdTLCAiZXZhbCIgfSwKKyAgICAgICAgIHsgImluaXQiLCAgImV2YWwgZXhwcmVzc2lvbnMgb25jZSBkdXJpbmcgaW5pdGlhbGl6YXRpb24iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RVZBTF9NT0RFX0lOSVR9LCAgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImV2YWwiIH0sCisgICAgICAgICB7ICJmcmFtZSIsICJldmFsIGV4cHJlc3Npb25zIGR1cmluZyBpbml0aWFsaXphdGlvbiBhbmQgcGVyLWZyYW1lIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUVWQUxfTU9ERV9GUkFNRX0sIC5mbGFncyA9IEZMQUdTLCAudW5pdCA9ICJldmFsIiB9LAorICAgIHsgImFzcGVjdCIsICAicGFkIHRvIGZpdCBhbiBhc3BlY3QgaW5zdGVhZCBvZiBhIHJlc29sdXRpb24iLCBPRkZTRVQoYXNwZWN0KSwgQVZfT1BUX1RZUEVfUkFUSU9OQUwsIHsuZGJsID0gMH0sIDAsIERCTF9NQVgsIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3BhbGV0dGVnZW4uYyBiL2xpYmF2ZmlsdGVyL3ZmX3BhbGV0dGVnZW4uYwppbmRleCBmY2NjNWNhLi41ZmY3M2U2IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9wYWxldHRlZ2VuLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfcGFsZXR0ZWdlbi5jCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9xc29ydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTUzLDEzICs1NCwxNCBAQAogZW51bSB7CiAgICAgU1RBVFNfTU9ERV9BTExfRlJBTUVTLAogICAgIFNUQVRTX01PREVfRElGRl9GUkFNRVMsCisgICAgU1RBVFNfTU9ERV9TSU5HTEVfRlJBTUVTLAogICAgIE5CX1NUQVRTX01PREUKIH07CiAKICNkZWZpbmUgTkJJVFMgNQogI2RlZmluZSBISVNUX1NJWkUgKDE8PCgzKk5CSVRTKSkKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgUGFsZXR0ZUdlbkNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogCiAgICAgaW50IG1heF9jb2xvcnM7CkBAIC03Myw2ICs3NSw3IEBACiAgICAgc3RydWN0IHJhbmdlX2JveCBib3hlc1syNTZdOyAgICAgICAgICAgIC8vIGRlZmluZSB0aGUgc2VnbWVudGF0aW9uIG9mIHRoZSBjb2xvcnNwYWNlICh0aGUgZmluYWwgcGFsZXR0ZSkKICAgICBpbnQgbmJfYm94ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGJveGVzIChpbmNyZWFzZSB3aWxsIHNlZ21lbnRpbmcgdGhlbSkKICAgICBpbnQgcGFsZXR0ZV9wdXNoZWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHBhbGV0dGUgZnJhbWUgaXMgcHVzaGVkIGludG8gdGhlIG91dGxpbmsgb3Igbm90CisgICAgdWludDhfdCB0cmFuc3BhcmVuY3lfY29sb3JbNF07ICAgICAgICAgIC8vIGJhY2tncm91bmQgY29sb3IgZm9yIHRyYW5zcGFyZW5jeQogfSBQYWxldHRlR2VuQ29udGV4dDsKIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUGFsZXR0ZUdlbkNvbnRleHQsIHgpCkBAIC04MCw5ICs4MywxMSBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHBhbGV0dGVnZW5fb3B0aW9uc1tdID0gewogICAgIHsgIm1heF9jb2xvcnMiLCAic2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2xvcnMgdG8gdXNlIGluIHRoZSBwYWxldHRlIiwgT0ZGU0VUKG1heF9jb2xvcnMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTI1Nn0sIDQsIDI1NiwgRkxBR1MgfSwKICAgICB7ICJyZXNlcnZlX3RyYW5zcGFyZW50IiwgInJlc2VydmUgYSBwYWxldHRlIGVudHJ5IGZvciB0cmFuc3BhcmVuY3kiLCBPRkZTRVQocmVzZXJ2ZV90cmFuc3BhcmVudCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTF9LCAwLCAxLCBGTEFHUyB9LAotICAgIHsgInN0YXRzX21vZGUiLCAic2V0IHN0YXRpc3RpY3MgbW9kZSIsIE9GRlNFVChzdGF0c19tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1TVEFUU19NT0RFX0FMTF9GUkFNRVN9LCAwLCBOQl9TVEFUU19NT0RFLCBGTEFHUywgIm1vZGUiIH0sCisgICAgeyAidHJhbnNwYXJlbmN5X2NvbG9yIiwgInNldCBhIGJhY2tncm91bmQgY29sb3IgZm9yIHRyYW5zcGFyZW5jeSIsIE9GRlNFVCh0cmFuc3BhcmVuY3lfY29sb3IpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHI9ImxpbWUifSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgInN0YXRzX21vZGUiLCAic2V0IHN0YXRpc3RpY3MgbW9kZSIsIE9GRlNFVChzdGF0c19tb2RlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1TVEFUU19NT0RFX0FMTF9GUkFNRVN9LCAwLCBOQl9TVEFUU19NT0RFLTEsIEZMQUdTLCAibW9kZSIgfSwKICAgICAgICAgeyAiZnVsbCIsICJjb21wdXRlIGZ1bGwgZnJhbWUgaGlzdG9ncmFtcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TVEFUU19NT0RFX0FMTF9GUkFNRVN9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCiAgICAgICAgIHsgImRpZmYiLCAiY29tcHV0ZSBoaXN0b2dyYW1zIG9ubHkgZm9yIHRoZSBwYXJ0IHRoYXQgZGlmZmVycyBmcm9tIHByZXZpb3VzIGZyYW1lIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVNUQVRTX01PREVfRElGRl9GUkFNRVN9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgIm1vZGUiIH0sCisgICAgICAgIHsgInNpbmdsZSIsICJjb21wdXRlIG5ldyBoaXN0b2dyYW0gZm9yIGVhY2ggZnJhbWUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U1RBVFNfTU9ERV9TSU5HTEVfRlJBTUVTfSwgSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJtb2RlIiB9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC05MywxNSArOTgsMTAgQEAKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGluX2ZtdHNbXSAgPSB7QVZfUElYX0ZNVF9SR0IzMiwgQVZfUElYX0ZNVF9OT05FfTsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9mbXRzW10gPSB7QVZfUElYX0ZNVF9SR0IzMiwgQVZfUElYX0ZNVF9OT05FfTsKICAgICBpbnQgcmV0OwotICAgIEFWRmlsdGVyRm9ybWF0cyAqaW4gID0gZmZfbWFrZV9mb3JtYXRfbGlzdChpbl9mbXRzKTsKLSAgICBBVkZpbHRlckZvcm1hdHMgKm91dCA9IGZmX21ha2VfZm9ybWF0X2xpc3Qob3V0X2ZtdHMpOwotICAgIGlmICghaW4gfHwgIW91dCkgewotICAgICAgICBhdl9mcmVlcCgmaW4pOwotICAgICAgICBhdl9mcmVlcCgmb3V0KTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0gICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihpbiAsICZjdHgtPmlucHV0c1swXS0+b3V0X2Zvcm1hdHMpKSA8IDAgfHwKLSAgICAgICAgKHJldCA9IGZmX2Zvcm1hdHNfcmVmKG91dCwgJmN0eC0+b3V0cHV0c1swXS0+aW5fZm9ybWF0cykpIDwgMCkKKworICAgIGlmICgocmV0ID0gZmZfZm9ybWF0c19yZWYoZmZfbWFrZV9mb3JtYXRfbGlzdChpbl9mbXRzKSAsICZjdHgtPmlucHV0c1swXS0+b3V0X2Zvcm1hdHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KG91dF9mbXRzKSwgJmN0eC0+b3V0cHV0c1swXS0+aW5fZm9ybWF0cykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKICAgICByZXR1cm4gMDsKIH0KQEAgLTI0Miw3ICsyNDIsNyBAQAogICAgICAgICAgICAgaWYgKGJveF9pZCA8IHMtPm5iX2JveGVzKSB7CiAgICAgICAgICAgICAgICAgcGFsW3hdID0gcy0+Ym94ZXNbYm94X2lkKytdLmNvbG9yOwogICAgICAgICAgICAgICAgIGlmICgoeCB8fCB5KSAmJiBwYWxbeF0gPT0gbGFzdF9jb2xvcikKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJEdXBwZWQgY29sb3I6ICUwOFhcbiIsIHBhbFt4XSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRHVwcGVkIGNvbG9yOiAlMDgiUFJJWDMyIlxuIiwgcGFsW3hdKTsKICAgICAgICAgICAgICAgICBsYXN0X2NvbG9yID0gcGFsW3hdOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBwYWxbeF0gPSAweGZmMDAwMDAwOyAvLyBwYWQgd2l0aCBibGFjawpAQCAtMjUzLDcgKzI1Myw3IEBACiAKICAgICBpZiAocy0+cmVzZXJ2ZV90cmFuc3BhcmVudCkgewogICAgICAgICBhdl9hc3NlcnQwKHMtPm5iX2JveGVzIDwgMjU2KTsKLSAgICAgICAgcGFsW291dC0+d2lkdGggLSBwYWxfbGluZXNpemUgLSAxXSA9IDB4MDAwMGZmMDA7IC8vIGFkZCBhIGdyZWVuIHRyYW5zcGFyZW50IGNvbG9yCisgICAgICAgIHBhbFtvdXQtPndpZHRoIC0gcGFsX2xpbmVzaXplIC0gMV0gPSBBVl9SQjMyKCZzLT50cmFuc3BhcmVuY3lfY29sb3IpID4+IDg7CiAgICAgfQogfQogCkBAIC00ODAsOCArNDgwLDggQEAKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwogICAgIFBhbGV0dGVHZW5Db250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIGNvbnN0IGludCByZXQgPSBzLT5wcmV2X2ZyYW1lID8gdXBkYXRlX2hpc3RvZ3JhbV9kaWZmKHMtPmhpc3RvZ3JhbSwgcy0+cHJldl9mcmFtZSwgaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1cGRhdGVfaGlzdG9ncmFtX2ZyYW1lKHMtPmhpc3RvZ3JhbSwgaW4pOworICAgIGludCByZXQgPSBzLT5wcmV2X2ZyYW1lID8gdXBkYXRlX2hpc3RvZ3JhbV9kaWZmKHMtPmhpc3RvZ3JhbSwgcy0+cHJldl9mcmFtZSwgaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1cGRhdGVfaGlzdG9ncmFtX2ZyYW1lKHMtPmhpc3RvZ3JhbSwgaW4pOwogCiAgICAgaWYgKHJldCA+IDApCiAgICAgICAgIHMtPm5iX3JlZnMgKz0gcmV0OwpAQCAtNDg5LDYgKzQ4OSwyMSBAQAogICAgIGlmIChzLT5zdGF0c19tb2RlID09IFNUQVRTX01PREVfRElGRl9GUkFNRVMpIHsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldl9mcmFtZSk7CiAgICAgICAgIHMtPnByZXZfZnJhbWUgPSBpbjsKKyAgICB9IGVsc2UgaWYgKHMtPnN0YXRzX21vZGUgPT0gU1RBVFNfTU9ERV9TSU5HTEVfRlJBTUVTKSB7CisgICAgICAgIEFWRnJhbWUgKm91dDsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgb3V0ID0gZ2V0X3BhbGV0dGVfZnJhbWUoY3R4KTsKKyAgICAgICAgb3V0LT5wdHMgPSBpbi0+cHRzOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBISVNUX1NJWkU7IGkrKykKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5oaXN0b2dyYW1baV0uZW50cmllcyk7CisgICAgICAgIGF2X2ZyZWVwKCZzLT5yZWZzKTsKKyAgICAgICAgcy0+bmJfcmVmcyA9IDA7CisgICAgICAgIHMtPm5iX2JveGVzID0gMDsKKyAgICAgICAgbWVtc2V0KHMtPmJveGVzLCAwLCBzaXplb2Yocy0+Ym94ZXMpKTsKKyAgICAgICAgbWVtc2V0KHMtPmhpc3RvZ3JhbSwgMCwgc2l6ZW9mKHMtPmhpc3RvZ3JhbSkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICB9CkBAIC01MDcsNyArNTIyLDcgQEAKICAgICBpbnQgcjsKIAogICAgIHIgPSBmZl9yZXF1ZXN0X2ZyYW1lKGlubGluayk7Ci0gICAgaWYgKHIgPT0gQVZFUlJPUl9FT0YgJiYgIXMtPnBhbGV0dGVfcHVzaGVkICYmIHMtPm5iX3JlZnMpIHsKKyAgICBpZiAociA9PSBBVkVSUk9SX0VPRiAmJiAhcy0+cGFsZXR0ZV9wdXNoZWQgJiYgcy0+bmJfcmVmcyAmJiBzLT5zdGF0c19tb2RlICE9IFNUQVRTX01PREVfU0lOR0xFX0ZSQU1FUykgewogICAgICAgICByID0gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGdldF9wYWxldHRlX2ZyYW1lKGN0eCkpOwogICAgICAgICBzLT5wYWxldHRlX3B1c2hlZCA9IDE7CiAgICAgICAgIHJldHVybiByOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfcGFsZXR0ZXVzZS5jIGIvbGliYXZmaWx0ZXIvdmZfcGFsZXR0ZXVzZS5jCmluZGV4IDEyMjVhNjYuLjYwNGE4YWYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3BhbGV0dGV1c2UuYworKysgYi9saWJhdmZpbHRlci92Zl9wYWxldHRldXNlLmMKQEAgLTI3LDggKzI3LDEwIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9xc29ydC5oIgotI2luY2x1ZGUgImR1YWxpbnB1dC5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZmlsdGVycy5oIgorI2luY2x1ZGUgImZyYW1lc3luYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKIGVudW0gZGl0aGVyaW5nX21vZGUgewogICAgIERJVEhFUklOR19OT05FLApAQCAtNTQsNyArNTYsNyBAQAogfTsKIAogc3RydWN0IGNvbG9yX25vZGUgewotICAgIHVpbnQ4X3QgdmFsWzNdOworICAgIHVpbnQ4X3QgdmFsWzRdOwogICAgIHVpbnQ4X3QgcGFsZXR0ZV9pZDsKICAgICBpbnQgc3BsaXQ7CiAgICAgaW50IGxlZnRfaWQsIHJpZ2h0X2lkOwpAQCAtODAsMTIgKzgyLDE1IEBACiAKIHR5cGVkZWYgc3RydWN0IFBhbGV0dGVVc2VDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKLSAgICBGRkR1YWxJbnB1dENvbnRleHQgZGlucHV0OworICAgIEZGRnJhbWVTeW5jIGZzOwogICAgIHN0cnVjdCBjYWNoZV9ub2RlIGNhY2hlW0NBQ0hFX1NJWkVdOyAgICAvKiBsb29rdXAgY2FjaGUgKi8KICAgICBzdHJ1Y3QgY29sb3Jfbm9kZSBtYXBbQVZQQUxFVFRFX0NPVU5UXTsgLyogM0QtVHJlZSAoS0QtVHJlZSB3aXRoIEs9MykgZm9yIHJldmVyc2UgY29sb3JtYXAgKi8KICAgICB1aW50MzJfdCBwYWxldHRlW0FWUEFMRVRURV9DT1VOVF07CisgICAgaW50IHRyYW5zcGFyZW5jeV9pbmRleDsgLyogaW5kZXggaW4gdGhlIHBhbGV0dGUgb2YgdHJhbnNwYXJlbmN5LiAtMSBpZiB0aGVyZSBpcyBubyB0cmFuc3BhcmVuY3kgaW4gdGhlIHBhbGV0dGUuICovCisgICAgaW50IHRyYW5zX3RocmVzaDsKICAgICBpbnQgcGFsZXR0ZV9sb2FkZWQ7CiAgICAgaW50IGRpdGhlcjsKKyAgICBpbnQgbmV3OwogICAgIHNldF9mcmFtZV9mdW5jIHNldF9mcmFtZTsKICAgICBpbnQgYmF5ZXJfc2NhbGU7CiAgICAgaW50IG9yZGVyZWRfZGl0aGVyWzgqOF07CkBAIC0xMTMsNiArMTE4LDggQEAKICAgICB7ICJiYXllcl9zY2FsZSIsICJzZXQgc2NhbGUgZm9yIGJheWVyIGRpdGhlcmluZyIsIE9GRlNFVChiYXllcl9zY2FsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDAsIDUsIEZMQUdTIH0sCiAgICAgeyAiZGlmZl9tb2RlIiwgICAic2V0IGZyYW1lIGRpZmZlcmVuY2UgbW9kZSIsICAgICBPRkZTRVQoZGlmZl9tb2RlKSwgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PURJRkZfTU9ERV9OT05FfSwgMCwgTkJfRElGRl9NT0RFLTEsIEZMQUdTLCAiZGlmZl9tb2RlIiB9LAogICAgICAgICB7ICJyZWN0YW5nbGUiLCAicHJvY2VzcyBzbWFsbGVzdCBkaWZmZXJlbnQgcmVjdGFuZ2xlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PURJRkZfTU9ERV9SRUNUQU5HTEV9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImRpZmZfbW9kZSIgfSwKKyAgICB7ICJuZXciLCAidGFrZSBuZXcgcGFsZXR0ZSBmb3IgZWFjaCBvdXRwdXQgZnJhbWUiLCBPRkZTRVQobmV3KSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiYWxwaGFfdGhyZXNob2xkIiwgInNldCB0aGUgYWxwaGEgdGhyZXNob2xkIGZvciB0cmFuc3BhcmVuY3kiLCBPRkZTRVQodHJhbnNfdGhyZXNoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMjh9LCAwLCAyNTUgfSwKIAogICAgIC8qIGZvbGxvd2luZyBhcmUgdGhlIGRlYnVnIG9wdGlvbnMsIG5vdCBwYXJ0IG9mIHRoZSBvZmZpY2lhbCBBUEkgKi8KICAgICB7ICJkZWJ1Z19rZHRyZWUiLCAic2F2ZSBHcmFwaHZpeiBncmFwaCBvZiB0aGUga2R0cmVlIGluIHNwZWNpZmllZCBmaWxlIiwgT0ZGU0VUKGRvdF9maWxlbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9TlVMTH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKQEAgLTEyNyw2ICsxMzQsOCBAQAogCiBBVkZJTFRFUl9ERUZJTkVfQ0xBU1MocGFsZXR0ZXVzZSk7CiAKK3N0YXRpYyBpbnQgbG9hZF9hcHBseV9wYWxldHRlKEZGRnJhbWVTeW5jICpmcyk7CisKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGluX2ZtdHNbXSAgICA9IHtBVl9QSVhfRk1UX1JHQjMyLCBBVl9QSVhfRk1UX05PTkV9OwpAQCAtMTUxLDM0ICsxNjAsNDMgQEAKIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGRpdGhlcl9jb2xvcih1aW50MzJfdCBweCwgaW50IGVyLCBpbnQgZWcsIGludCBlYiwgaW50IHNjYWxlLCBpbnQgc2hpZnQpCiB7Ci0gICAgcmV0dXJuIGF2X2NsaXBfdWludDgoKHB4ID4+IDE2ICYgMHhmZikgKyAoKGVyICogc2NhbGUpIC8gKDE8PHNoaWZ0KSkpIDw8IDE2CisgICAgcmV0dXJuIGF2X2NsaXBfdWludDgoIHB4ID4+IDI0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDw8IDI0CisgICAgICAgICB8IGF2X2NsaXBfdWludDgoKHB4ID4+IDE2ICYgMHhmZikgKyAoKGVyICogc2NhbGUpIC8gKDE8PHNoaWZ0KSkpIDw8IDE2CiAgICAgICAgICB8IGF2X2NsaXBfdWludDgoKHB4ID4+ICA4ICYgMHhmZikgKyAoKGVnICogc2NhbGUpIC8gKDE8PHNoaWZ0KSkpIDw8ICA4CiAgICAgICAgICB8IGF2X2NsaXBfdWludDgoKHB4ICAgICAgICYgMHhmZikgKyAoKGViICogc2NhbGUpIC8gKDE8PHNoaWZ0KSkpOwogfQogCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGlmZihjb25zdCB1aW50OF90ICpjMSwgY29uc3QgdWludDhfdCAqYzIpCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZGlmZihjb25zdCB1aW50OF90ICpjMSwgY29uc3QgdWludDhfdCAqYzIsIGNvbnN0IGludCB0cmFuc190aHJlc2gpCiB7CiAgICAgLy8gWFhYOiB0cnkgTCphKmIgd2l0aCBDSUU3NiAoZEwqZEwgKyBkYSpkYSArIGRiKmRiKQotICAgIGNvbnN0IGludCBkciA9IGMxWzBdIC0gYzJbMF07Ci0gICAgY29uc3QgaW50IGRnID0gYzFbMV0gLSBjMlsxXTsKLSAgICBjb25zdCBpbnQgZGIgPSBjMVsyXSAtIGMyWzJdOwotICAgIHJldHVybiBkcipkciArIGRnKmRnICsgZGIqZGI7CisgICAgY29uc3QgaW50IGRyID0gYzFbMV0gLSBjMlsxXTsKKyAgICBjb25zdCBpbnQgZGcgPSBjMVsyXSAtIGMyWzJdOworICAgIGNvbnN0IGludCBkYiA9IGMxWzNdIC0gYzJbM107CisKKyAgICBpZiAoYzFbMF0gPCB0cmFuc190aHJlc2ggJiYgYzJbMF0gPCB0cmFuc190aHJlc2gpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChjMVswXSA+PSB0cmFuc190aHJlc2ggJiYgYzJbMF0gPj0gdHJhbnNfdGhyZXNoKSB7CisgICAgICAgIHJldHVybiBkcipkciArIGRnKmRnICsgZGIqZGI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDI1NSoyNTUgKyAyNTUqMjU1ICsgMjU1KjI1NTsKKyAgICB9CiB9CiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ4X3QgY29sb3JtYXBfbmVhcmVzdF9icnV0ZWZvcmNlKGNvbnN0IHVpbnQzMl90ICpwYWxldHRlLCBjb25zdCB1aW50OF90ICpyZ2IpCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50OF90IGNvbG9ybWFwX25lYXJlc3RfYnJ1dGVmb3JjZShjb25zdCB1aW50MzJfdCAqcGFsZXR0ZSwgY29uc3QgdWludDhfdCAqYXJnYiwgY29uc3QgaW50IHRyYW5zX3RocmVzaCkKIHsKICAgICBpbnQgaSwgcGFsX2lkID0gLTEsIG1pbl9kaXN0ID0gSU5UX01BWDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBBVlBBTEVUVEVfQ09VTlQ7IGkrKykgewogICAgICAgICBjb25zdCB1aW50MzJfdCBjID0gcGFsZXR0ZVtpXTsKIAotICAgICAgICBpZiAoKGMgJiAweGZmMDAwMDAwKSA9PSAweGZmMDAwMDAwKSB7IC8vIGlnbm9yZSB0cmFuc3BhcmVudCBlbnRyeQotICAgICAgICAgICAgY29uc3QgdWludDhfdCBwYWxyZ2JbXSA9IHsKKyAgICAgICAgaWYgKGMgPj4gMjQgPj0gdHJhbnNfdGhyZXNoKSB7IC8vIGlnbm9yZSB0cmFuc3BhcmVudCBlbnRyeQorICAgICAgICAgICAgY29uc3QgdWludDhfdCBwYWxhcmdiW10gPSB7CisgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXT4+MjQgJiAweGZmLAogICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0+PjE2ICYgMHhmZiwKICAgICAgICAgICAgICAgICBwYWxldHRlW2ldPj4gOCAmIDB4ZmYsCiAgICAgICAgICAgICAgICAgcGFsZXR0ZVtpXSAgICAgJiAweGZmLAogICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGNvbnN0IGludCBkID0gZGlmZihwYWxyZ2IsIHJnYik7CisgICAgICAgICAgICBjb25zdCBpbnQgZCA9IGRpZmYocGFsYXJnYiwgYXJnYiwgdHJhbnNfdGhyZXNoKTsKICAgICAgICAgICAgIGlmIChkIDwgbWluX2Rpc3QpIHsKICAgICAgICAgICAgICAgICBwYWxfaWQgPSBpOwogICAgICAgICAgICAgICAgIG1pbl9kaXN0ID0gZDsKQEAgLTE5NywxMyArMjE1LDE0IEBACiBzdGF0aWMgdm9pZCBjb2xvcm1hcF9uZWFyZXN0X25vZGUoY29uc3Qgc3RydWN0IGNvbG9yX25vZGUgKm1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbm9kZV9wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB0cmFuc190aHJlc2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG5lYXJlc3RfY29sb3IgKm5lYXJlc3QpCiB7CiAgICAgY29uc3Qgc3RydWN0IGNvbG9yX25vZGUgKmtkID0gbWFwICsgbm9kZV9wb3M7CiAgICAgY29uc3QgaW50IHMgPSBrZC0+c3BsaXQ7CiAgICAgaW50IGR4LCBuZWFyZXJfa2RfaWQsIGZ1cnRoZXJfa2RfaWQ7CiAgICAgY29uc3QgdWludDhfdCAqY3VycmVudCA9IGtkLT52YWw7Ci0gICAgY29uc3QgaW50IGN1cnJlbnRfdG9fdGFyZ2V0ID0gZGlmZih0YXJnZXQsIGN1cnJlbnQpOworICAgIGNvbnN0IGludCBjdXJyZW50X3RvX3RhcmdldCA9IGRpZmYodGFyZ2V0LCBjdXJyZW50LCB0cmFuc190aHJlc2gpOwogCiAgICAgaWYgKGN1cnJlbnRfdG9fdGFyZ2V0IDwgbmVhcmVzdC0+ZGlzdF9zcWQpIHsKICAgICAgICAgbmVhcmVzdC0+bm9kZV9wb3MgPSBub2RlX3BvczsKQEAgLTIxNywxNyArMjM2LDE3IEBACiAgICAgICAgIGVsc2UgICAgICAgICBuZWFyZXJfa2RfaWQgPSBrZC0+cmlnaHRfaWQsIGZ1cnRoZXJfa2RfaWQgPSBrZC0+bGVmdF9pZDsKIAogICAgICAgICBpZiAobmVhcmVyX2tkX2lkICE9IC0xKQotICAgICAgICAgICAgY29sb3JtYXBfbmVhcmVzdF9ub2RlKG1hcCwgbmVhcmVyX2tkX2lkLCB0YXJnZXQsIG5lYXJlc3QpOworICAgICAgICAgICAgY29sb3JtYXBfbmVhcmVzdF9ub2RlKG1hcCwgbmVhcmVyX2tkX2lkLCB0YXJnZXQsIHRyYW5zX3RocmVzaCwgbmVhcmVzdCk7CiAKICAgICAgICAgaWYgKGZ1cnRoZXJfa2RfaWQgIT0gLTEgJiYgZHgqZHggPCBuZWFyZXN0LT5kaXN0X3NxZCkKLSAgICAgICAgICAgIGNvbG9ybWFwX25lYXJlc3Rfbm9kZShtYXAsIGZ1cnRoZXJfa2RfaWQsIHRhcmdldCwgbmVhcmVzdCk7CisgICAgICAgICAgICBjb2xvcm1hcF9uZWFyZXN0X25vZGUobWFwLCBmdXJ0aGVyX2tkX2lkLCB0YXJnZXQsIHRyYW5zX3RocmVzaCwgbmVhcmVzdCk7CiAgICAgfQogfQogCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50OF90IGNvbG9ybWFwX25lYXJlc3RfcmVjdXJzaXZlKGNvbnN0IHN0cnVjdCBjb2xvcl9ub2RlICpub2RlLCBjb25zdCB1aW50OF90ICpyZ2IpCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB1aW50OF90IGNvbG9ybWFwX25lYXJlc3RfcmVjdXJzaXZlKGNvbnN0IHN0cnVjdCBjb2xvcl9ub2RlICpub2RlLCBjb25zdCB1aW50OF90ICpyZ2IsIGNvbnN0IGludCB0cmFuc190aHJlc2gpCiB7CiAgICAgc3RydWN0IG5lYXJlc3RfY29sb3IgcmVzID0gey5kaXN0X3NxZCA9IElOVF9NQVgsIC5ub2RlX3BvcyA9IC0xfTsKLSAgICBjb2xvcm1hcF9uZWFyZXN0X25vZGUobm9kZSwgMCwgcmdiLCAmcmVzKTsKKyAgICBjb2xvcm1hcF9uZWFyZXN0X25vZGUobm9kZSwgMCwgcmdiLCB0cmFuc190aHJlc2gsICZyZXMpOwogICAgIHJldHVybiBub2RlW3Jlcy5ub2RlX3Bvc10ucGFsZXR0ZV9pZDsKIH0KIApAQCAtMjM2LDcgKzI1NSw3IEBACiAgICAgaW50IGR4MjsKIH07CiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ4X3QgY29sb3JtYXBfbmVhcmVzdF9pdGVyYXRpdmUoY29uc3Qgc3RydWN0IGNvbG9yX25vZGUgKnJvb3QsIGNvbnN0IHVpbnQ4X3QgKnRhcmdldCkKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHVpbnQ4X3QgY29sb3JtYXBfbmVhcmVzdF9pdGVyYXRpdmUoY29uc3Qgc3RydWN0IGNvbG9yX25vZGUgKnJvb3QsIGNvbnN0IHVpbnQ4X3QgKnRhcmdldCwgY29uc3QgaW50IHRyYW5zX3RocmVzaCkKIHsKICAgICBpbnQgcG9zID0gMCwgYmVzdF9ub2RlX2lkID0gLTEsIGJlc3RfZGlzdCA9IElOVF9NQVgsIGN1cl9jb2xvcl9pZCA9IDA7CiAgICAgc3RydWN0IHN0YWNrX25vZGUgbm9kZXNbMTZdOwpAQCAtMjQ2LDcgKzI2NSw3IEBACiAKICAgICAgICAgY29uc3Qgc3RydWN0IGNvbG9yX25vZGUgKmtkID0gJnJvb3RbY3VyX2NvbG9yX2lkXTsKICAgICAgICAgY29uc3QgdWludDhfdCAqY3VycmVudCA9IGtkLT52YWw7Ci0gICAgICAgIGNvbnN0IGludCBjdXJyZW50X3RvX3RhcmdldCA9IGRpZmYodGFyZ2V0LCBjdXJyZW50KTsKKyAgICAgICAgY29uc3QgaW50IGN1cnJlbnRfdG9fdGFyZ2V0ID0gZGlmZih0YXJnZXQsIGN1cnJlbnQsIHRyYW5zX3RocmVzaCk7CiAKICAgICAgICAgLyogQ29tcGFyZSBjdXJyZW50IGNvbG9yIG5vZGUgdG8gdGhlIHRhcmdldCBhbmQgdXBkYXRlIG91ciBiZXN0IG5vZGUgaWYKICAgICAgICAgICogaXQncyBhY3R1YWxseSBiZXR0ZXIuICovCkBAIC0zMDgsMzIgKzMyNywzNSBAQAogICAgIHJldHVybiByb290W2Jlc3Rfbm9kZV9pZF0ucGFsZXR0ZV9pZDsKIH0KIAotI2RlZmluZSBDT0xPUk1BUF9ORUFSRVNUKHNlYXJjaCwgcGFsZXR0ZSwgcm9vdCwgdGFyZ2V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzZWFyY2ggPT0gQ09MT1JfU0VBUkNIX05OU19JVEVSQVRJVkUgPyBjb2xvcm1hcF9uZWFyZXN0X2l0ZXJhdGl2ZShyb290LCB0YXJnZXQpIDogICAgICBcCi0gICAgc2VhcmNoID09IENPTE9SX1NFQVJDSF9OTlNfUkVDVVJTSVZFID8gY29sb3JtYXBfbmVhcmVzdF9yZWN1cnNpdmUocm9vdCwgdGFyZ2V0KSA6ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ybWFwX25lYXJlc3RfYnJ1dGVmb3JjZShwYWxldHRlLCB0YXJnZXQpCisjZGVmaW5lIENPTE9STUFQX05FQVJFU1Qoc2VhcmNoLCBwYWxldHRlLCByb290LCB0YXJnZXQsIHRyYW5zX3RocmVzaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2VhcmNoID09IENPTE9SX1NFQVJDSF9OTlNfSVRFUkFUSVZFID8gY29sb3JtYXBfbmVhcmVzdF9pdGVyYXRpdmUocm9vdCwgdGFyZ2V0LCB0cmFuc190aHJlc2gpIDogICAgICBcCisgICAgc2VhcmNoID09IENPTE9SX1NFQVJDSF9OTlNfUkVDVVJTSVZFID8gY29sb3JtYXBfbmVhcmVzdF9yZWN1cnNpdmUocm9vdCwgdGFyZ2V0LCB0cmFuc190aHJlc2gpIDogICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JtYXBfbmVhcmVzdF9icnV0ZWZvcmNlKHBhbGV0dGUsIHRhcmdldCwgdHJhbnNfdGhyZXNoKQogCiAvKioKICAqIENoZWNrIGlmIHRoZSByZXF1ZXN0ZWQgY29sb3IgaXMgaW4gdGhlIGNhY2hlIGFscmVhZHkuIElmIG5vdCwgZmluZCBpdCBpbiB0aGUKICAqIGNvbG9yIHRyZWUgYW5kIGNhY2hlIGl0LgotICogTm90ZTogciwgZywgYW5kIGIgYXJlIHRoZSBjb21wb25lbnQgb2YgYyBidXQgYXJlIHBhc3NlZCBhcyB3ZWxsIHRvIGF2b2lkCisgKiBOb3RlOiBhLCByLCBnLCBhbmQgYiBhcmUgdGhlIGNvbXBvbmVudHMgb2YgY29sb3IsIGJ1dCBhcmUgcGFzc2VkIGFzIHdlbGwgdG8gYXZvaWQKICAqIHJlY29tcHV0aW5nIHRoZW0gKHRoZXkgYXJlIGdlbmVyYWxseSBjb21wdXRlZCBieSB0aGUgY2FsbGVyIGZvciBvdGhlciB1c2VzKS4KICAqLwotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGNvbG9yX2dldChzdHJ1Y3QgY2FjaGVfbm9kZSAqY2FjaGUsIHVpbnQzMl90IGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHIsIHVpbnQ4X3QgZywgdWludDhfdCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgY29sb3Jfbm9kZSAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcGFsZXR0ZSwKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBjb2xvcl9nZXQoUGFsZXR0ZVVzZUNvbnRleHQgKnMsIHVpbnQzMl90IGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGEsIHVpbnQ4X3QgciwgdWludDhfdCBnLCB1aW50OF90IGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW0gY29sb3Jfc2VhcmNoX21ldGhvZCBzZWFyY2hfbWV0aG9kKQogewogICAgIGludCBpOwotICAgIGNvbnN0IHVpbnQ4X3QgcmdiW10gPSB7ciwgZywgYn07CisgICAgY29uc3QgdWludDhfdCBhcmdiX2VsdHNbXSA9IHthLCByLCBnLCBifTsKICAgICBjb25zdCB1aW50OF90IHJoYXNoID0gciAmICgoMTw8TkJJVFMpLTEpOwogICAgIGNvbnN0IHVpbnQ4X3QgZ2hhc2ggPSBnICYgKCgxPDxOQklUUyktMSk7CiAgICAgY29uc3QgdWludDhfdCBiaGFzaCA9IGIgJiAoKDE8PE5CSVRTKS0xKTsKICAgICBjb25zdCB1bnNpZ25lZCBoYXNoID0gcmhhc2g8PChOQklUUyoyKSB8IGdoYXNoPDxOQklUUyB8IGJoYXNoOwotICAgIHN0cnVjdCBjYWNoZV9ub2RlICpub2RlID0gJmNhY2hlW2hhc2hdOworICAgIHN0cnVjdCBjYWNoZV9ub2RlICpub2RlID0gJnMtPmNhY2hlW2hhc2hdOwogICAgIHN0cnVjdCBjYWNoZWRfY29sb3IgKmU7CiAKKyAgICAvLyBmaXJzdCwgY2hlY2sgZm9yIHRyYW5zcGFyZW5jeQorICAgIGlmIChhIDwgcy0+dHJhbnNfdGhyZXNoICYmIHMtPnRyYW5zcGFyZW5jeV9pbmRleCA+PSAwKSB7CisgICAgICAgIHJldHVybiBzLT50cmFuc3BhcmVuY3lfaW5kZXg7CisgICAgfQorCiAgICAgZm9yIChpID0gMDsgaSA8IG5vZGUtPm5iX2VudHJpZXM7IGkrKykgewogICAgICAgICBlID0gJm5vZGUtPmVudHJpZXNbaV07CiAgICAgICAgIGlmIChlLT5jb2xvciA9PSBjb2xvcikKQEAgLTM0NSwyMSArMzY3LDI0IEBACiAgICAgaWYgKCFlKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIGUtPmNvbG9yID0gY29sb3I7Ci0gICAgZS0+cGFsX2VudHJ5ID0gQ09MT1JNQVBfTkVBUkVTVChzZWFyY2hfbWV0aG9kLCBwYWxldHRlLCBtYXAsIHJnYik7CisgICAgZS0+cGFsX2VudHJ5ID0gQ09MT1JNQVBfTkVBUkVTVChzZWFyY2hfbWV0aG9kLCBzLT5wYWxldHRlLCBzLT5tYXAsIGFyZ2JfZWx0cywgcy0+dHJhbnNfdGhyZXNoKTsKKwogICAgIHJldHVybiBlLT5wYWxfZW50cnk7CiB9CiAKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBnZXRfZHN0X2NvbG9yX2VycihzdHJ1Y3QgY2FjaGVfbm9kZSAqY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYywgY29uc3Qgc3RydWN0IGNvbG9yX25vZGUgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqcGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmVyLCBpbnQgKmVnLCBpbnQgKmViLAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGdldF9kc3RfY29sb3JfZXJyKFBhbGV0dGVVc2VDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMsIGludCAqZXIsIGludCAqZWcsIGludCAqZWIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBjb2xvcl9zZWFyY2hfbWV0aG9kIHNlYXJjaF9tZXRob2QpCiB7CisgICAgY29uc3QgdWludDhfdCBhID0gYyA+PiAyNCAmIDB4ZmY7CiAgICAgY29uc3QgdWludDhfdCByID0gYyA+PiAxNiAmIDB4ZmY7CiAgICAgY29uc3QgdWludDhfdCBnID0gYyA+PiAgOCAmIDB4ZmY7CiAgICAgY29uc3QgdWludDhfdCBiID0gYyAgICAgICAmIDB4ZmY7Ci0gICAgY29uc3QgaW50IGRzdHggPSBjb2xvcl9nZXQoY2FjaGUsIGMsIHIsIGcsIGIsIG1hcCwgcGFsZXR0ZSwgc2VhcmNoX21ldGhvZCk7Ci0gICAgY29uc3QgdWludDMyX3QgZHN0YyA9IHBhbGV0dGVbZHN0eF07CisgICAgdWludDMyX3QgZHN0YzsKKyAgICBjb25zdCBpbnQgZHN0eCA9IGNvbG9yX2dldChzLCBjLCBhLCByLCBnLCBiLCBzZWFyY2hfbWV0aG9kKTsKKyAgICBpZiAoZHN0eCA8IDApCisgICAgICAgIHJldHVybiBkc3R4OworICAgIGRzdGMgPSBzLT5wYWxldHRlW2RzdHhdOwogICAgICplciA9IHIgLSAoZHN0YyA+PiAxNiAmIDB4ZmYpOwogICAgICplZyA9IGcgLSAoZHN0YyA+PiAgOCAmIDB4ZmYpOwogICAgICplYiA9IGIgLSAoZHN0YyAgICAgICAmIDB4ZmYpOwpAQCAtMzcyLDkgKzM5Nyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW0gY29sb3Jfc2VhcmNoX21ldGhvZCBzZWFyY2hfbWV0aG9kKQogewogICAgIGludCB4LCB5OwotICAgIGNvbnN0IHN0cnVjdCBjb2xvcl9ub2RlICptYXAgPSBzLT5tYXA7Ci0gICAgc3RydWN0IGNhY2hlX25vZGUgKmNhY2hlID0gcy0+Y2FjaGU7Ci0gICAgY29uc3QgdWludDMyX3QgKnBhbGV0dGUgPSBzLT5wYWxldHRlOwogICAgIGNvbnN0IGludCBzcmNfbGluZXNpemUgPSBpbiAtPmxpbmVzaXplWzBdID4+IDI7CiAgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbMF07CiAgICAgdWludDMyX3QgKnNyYyA9ICgodWludDMyX3QgKilpbiAtPmRhdGFbMF0pICsgeV9zdGFydCpzcmNfbGluZXNpemU7CkBAIC0zODksMTQgKzQxMSwxNCBAQAogCiAgICAgICAgICAgICBpZiAoZGl0aGVyID09IERJVEhFUklOR19CQVlFUikgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCBkID0gcy0+b3JkZXJlZF9kaXRoZXJbKHkgJiA3KTw8MyB8ICh4ICYgNyldOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYTggPSBzcmNbeF0gPj4gMjQgJiAweGZmOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgcjggPSBzcmNbeF0gPj4gMTYgJiAweGZmOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgZzggPSBzcmNbeF0gPj4gIDggJiAweGZmOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYjggPSBzcmNbeF0gICAgICAgJiAweGZmOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgciA9IGF2X2NsaXBfdWludDgocjggKyBkKTsKICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IGcgPSBhdl9jbGlwX3VpbnQ4KGc4ICsgZCk7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBiID0gYXZfY2xpcF91aW50OChiOCArIGQpOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGMgPSByPDwxNiB8IGc8PDggfCBiOwotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2xvciA9IGNvbG9yX2dldChjYWNoZSwgYywgciwgZywgYiwgbWFwLCBwYWxldHRlLCBzZWFyY2hfbWV0aG9kKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29sb3IgPSBjb2xvcl9nZXQocywgc3JjW3hdLCBhOCwgciwgZywgYiwgc2VhcmNoX21ldGhvZCk7CiAKICAgICAgICAgICAgICAgICBpZiAoY29sb3IgPCAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7CkBAIC00MDQsNyArNDI2LDcgQEAKIAogICAgICAgICAgICAgfSBlbHNlIGlmIChkaXRoZXIgPT0gRElUSEVSSU5HX0hFQ0tCRVJUKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IHJpZ2h0ID0geCA8IHcgLSAxLCBkb3duID0geSA8IGggLSAxOwotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2xvciA9IGdldF9kc3RfY29sb3JfZXJyKGNhY2hlLCBzcmNbeF0sIG1hcCwgcGFsZXR0ZSwgJmVyLCAmZWcsICZlYiwgc2VhcmNoX21ldGhvZCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvbG9yID0gZ2V0X2RzdF9jb2xvcl9lcnIocywgc3JjW3hdLCAmZXIsICZlZywgJmViLCBzZWFyY2hfbWV0aG9kKTsKIAogICAgICAgICAgICAgICAgIGlmIChjb2xvciA8IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKQEAgLTQxNiw3ICs0MzgsNyBAQAogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpdGhlciA9PSBESVRIRVJJTkdfRkxPWURfU1RFSU5CRVJHKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IHJpZ2h0ID0geCA8IHcgLSAxLCBkb3duID0geSA8IGggLSAxLCBsZWZ0ID0geCA+IHhfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGNvbG9yID0gZ2V0X2RzdF9jb2xvcl9lcnIoY2FjaGUsIHNyY1t4XSwgbWFwLCBwYWxldHRlLCAmZXIsICZlZywgJmViLCBzZWFyY2hfbWV0aG9kKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29sb3IgPSBnZXRfZHN0X2NvbG9yX2VycihzLCBzcmNbeF0sICZlciwgJmVnLCAmZWIsIHNlYXJjaF9tZXRob2QpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNvbG9yIDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOwpAQCAtNDMwLDcgKzQ1Miw3IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpdGhlciA9PSBESVRIRVJJTkdfU0lFUlJBMikgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCByaWdodCAgPSB4IDwgdyAtIDEsIGRvd24gID0geSA8IGggLSAxLCBsZWZ0ICA9IHggPiB4X3N0YXJ0OwogICAgICAgICAgICAgICAgIGNvbnN0IGludCByaWdodDIgPSB4IDwgdyAtIDIsICAgICAgICAgICAgICAgICAgICBsZWZ0MiA9IHggPiB4X3N0YXJ0ICsgMTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29sb3IgPSBnZXRfZHN0X2NvbG9yX2VycihjYWNoZSwgc3JjW3hdLCBtYXAsIHBhbGV0dGUsICZlciwgJmVnLCAmZWIsIHNlYXJjaF9tZXRob2QpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2xvciA9IGdldF9kc3RfY29sb3JfZXJyKHMsIHNyY1t4XSwgJmVyLCAmZWcsICZlYiwgc2VhcmNoX21ldGhvZCk7CiAKICAgICAgICAgICAgICAgICBpZiAoY29sb3IgPCAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7CkBAIC00NDIsMTQgKzQ2NCwxNCBAQAogICAgICAgICAgICAgICAgIGlmIChkb3duKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0MikgICAgICBzcmNbICBzcmNfbGluZXNpemUgKyB4IC0gMl0gPSBkaXRoZXJfY29sb3Ioc3JjWyAgc3JjX2xpbmVzaXplICsgeCAtIDJdLCBlciwgZWcsIGViLCAxLCA0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQpICAgICAgIHNyY1sgIHNyY19saW5lc2l6ZSArIHggLSAxXSA9IGRpdGhlcl9jb2xvcihzcmNbICBzcmNfbGluZXNpemUgKyB4IC0gMV0sIGVyLCBlZywgZWIsIDIsIDQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWyAgc3JjX2xpbmVzaXplICsgeCAgICBdID0gZGl0aGVyX2NvbG9yKHNyY1sgIHNyY19saW5lc2l6ZSArIHggICAgXSwgZXIsIGVnLCBlYiwgMywgNCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgxKSAgICAgICAgICBzcmNbICBzcmNfbGluZXNpemUgKyB4ICAgIF0gPSBkaXRoZXJfY29sb3Ioc3JjWyAgc3JjX2xpbmVzaXplICsgeCAgICBdLCBlciwgZWcsIGViLCAzLCA0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJpZ2h0KSAgICAgIHNyY1sgIHNyY19saW5lc2l6ZSArIHggKyAxXSA9IGRpdGhlcl9jb2xvcihzcmNbICBzcmNfbGluZXNpemUgKyB4ICsgMV0sIGVyLCBlZywgZWIsIDIsIDQpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmlnaHQyKSAgICAgc3JjWyAgc3JjX2xpbmVzaXplICsgeCArIDJdID0gZGl0aGVyX2NvbG9yKHNyY1sgIHNyY19saW5lc2l6ZSArIHggKyAyXSwgZXIsIGVnLCBlYiwgMSwgNCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpdGhlciA9PSBESVRIRVJJTkdfU0lFUlJBMl80QSkgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCByaWdodCA9IHggPCB3IC0gMSwgZG93biA9IHkgPCBoIC0gMSwgbGVmdCA9IHggPiB4X3N0YXJ0OwotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2xvciA9IGdldF9kc3RfY29sb3JfZXJyKGNhY2hlLCBzcmNbeF0sIG1hcCwgcGFsZXR0ZSwgJmVyLCAmZWcsICZlYiwgc2VhcmNoX21ldGhvZCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvbG9yID0gZ2V0X2RzdF9jb2xvcl9lcnIocywgc3JjW3hdLCAmZXIsICZlZywgJmViLCBzZWFyY2hfbWV0aG9kKTsKIAogICAgICAgICAgICAgICAgIGlmIChjb2xvciA8IDApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKQEAgLTQ2MCwxMCArNDgyLDExIEBACiAgICAgICAgICAgICAgICAgaWYgKCAgICAgICAgIGRvd24pIHNyY1tzcmNfbGluZXNpemUgKyB4ICAgIF0gPSBkaXRoZXJfY29sb3Ioc3JjW3NyY19saW5lc2l6ZSArIHggICAgXSwgZXIsIGVnLCBlYiwgMSwgMik7CiAKICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBhID0gc3JjW3hdID4+IDI0ICYgMHhmZjsKICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHIgPSBzcmNbeF0gPj4gMTYgJiAweGZmOwogICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgZyA9IHNyY1t4XSA+PiAgOCAmIDB4ZmY7CiAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBiID0gc3JjW3hdICAgICAgICYgMHhmZjsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29sb3IgPSBjb2xvcl9nZXQoY2FjaGUsIHNyY1t4XSAmIDB4ZmZmZmZmLCByLCBnLCBiLCBtYXAsIHBhbGV0dGUsIHNlYXJjaF9tZXRob2QpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2xvciA9IGNvbG9yX2dldChzLCBzcmNbeF0sIGEsIHIsIGcsIGIsIHNlYXJjaF9tZXRob2QpOwogCiAgICAgICAgICAgICAgICAgaWYgKGNvbG9yIDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yOwpAQCAtNDgzLDE5ICs1MDYsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgpCiB7CiAgICAgY29uc3Qgc3RydWN0IGNvbG9yX25vZGUgKm5vZGUgPSAmbWFwW25vZGVfaWRdOwotICAgIGNvbnN0IHVpbnQzMl90IGZvbnRjb2xvciA9IG5vZGUtPnZhbFswXSA+IDB4NTAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT52YWxbMV0gPiAweDUwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+dmFsWzJdID4gMHg1MCA/IDAgOiAweGZmZmZmZjsKKyAgICBjb25zdCB1aW50MzJfdCBmb250Y29sb3IgPSBub2RlLT52YWxbMV0gPiAweDUwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+dmFsWzJdID4gMHg1MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPnZhbFszXSA+IDB4NTAgPyAwIDogMHhmZmZmZmY7CisgICAgY29uc3QgaW50IHJnYl9jb21wID0gbm9kZS0+c3BsaXQgLSAxOwogICAgIGF2X2JwcmludGYoYnVmLCAiJSpjbm9kZSVkIFsiCiAgICAgICAgICAgICAgICAibGFiZWw9XCIlYyUwMlglYyUwMlglYyUwMlglY1wiICIKICAgICAgICAgICAgICAgICJmaWxsY29sb3I9XCIjJTAyeCUwMnglMDJ4XCIgIgotICAgICAgICAgICAgICAgImZvbnRjb2xvcj1cIiMlMDZYXCJdXG4iLAorICAgICAgICAgICAgICAgImZvbnRjb2xvcj1cIiMlMDYiUFJJWDMyIlwiXVxuIiwKICAgICAgICAgICAgICAgIGRlcHRoKklOREVOVCwgJyAnLCBub2RlLT5wYWxldHRlX2lkLAotICAgICAgICAgICAgICAgIlsgICJbbm9kZS0+c3BsaXRdLCBub2RlLT52YWxbMF0sCi0gICAgICAgICAgICAgICAiXVsgIltub2RlLT5zcGxpdF0sIG5vZGUtPnZhbFsxXSwKLSAgICAgICAgICAgICAgICIgXVsiW25vZGUtPnNwbGl0XSwgbm9kZS0+dmFsWzJdLAotICAgICAgICAgICAgICAgIiAgXSJbbm9kZS0+c3BsaXRdLAotICAgICAgICAgICAgICAgbm9kZS0+dmFsWzBdLCBub2RlLT52YWxbMV0sIG5vZGUtPnZhbFsyXSwKKyAgICAgICAgICAgICAgICJbICAiW3JnYl9jb21wXSwgbm9kZS0+dmFsWzFdLAorICAgICAgICAgICAgICAgIl1bICJbcmdiX2NvbXBdLCBub2RlLT52YWxbMl0sCisgICAgICAgICAgICAgICAiIF1bIltyZ2JfY29tcF0sIG5vZGUtPnZhbFszXSwKKyAgICAgICAgICAgICAgICIgIF0iW3JnYl9jb21wXSwKKyAgICAgICAgICAgICAgIG5vZGUtPnZhbFsxXSwgbm9kZS0+dmFsWzJdLCBub2RlLT52YWxbM10sCiAgICAgICAgICAgICAgICBmb250Y29sb3IpOwogICAgIGlmIChwYXJlbnRfaWQgIT0gLTEpCiAgICAgICAgIGF2X2JwcmludGYoYnVmLCAiJSpjbm9kZSVkIC0+IG5vZGUlZFxuIiwgZGVwdGgqSU5ERU5ULCAnICcsCkBAIC01MzAsNyArNTU0LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkZWJ1Z19hY2N1cmFjeShjb25zdCBzdHJ1Y3QgY29sb3Jfbm9kZSAqbm9kZSwgY29uc3QgdWludDMyX3QgKnBhbGV0dGUsCitzdGF0aWMgaW50IGRlYnVnX2FjY3VyYWN5KGNvbnN0IHN0cnVjdCBjb2xvcl9ub2RlICpub2RlLCBjb25zdCB1aW50MzJfdCAqcGFsZXR0ZSwgY29uc3QgaW50IHRyYW5zX3RocmVzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bSBjb2xvcl9zZWFyY2hfbWV0aG9kIHNlYXJjaF9tZXRob2QpCiB7CiAgICAgaW50IHIsIGcsIGIsIHJldCA9IDA7CkBAIC01MzgsMTkgKzU2MiwxOSBAQAogICAgIGZvciAociA9IDA7IHIgPCAyNTY7IHIrKykgewogICAgICAgICBmb3IgKGcgPSAwOyBnIDwgMjU2OyBnKyspIHsKICAgICAgICAgICAgIGZvciAoYiA9IDA7IGIgPCAyNTY7IGIrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgcmdiW10gPSB7ciwgZywgYn07Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IHIxID0gQ09MT1JNQVBfTkVBUkVTVChzZWFyY2hfbWV0aG9kLCBwYWxldHRlLCBub2RlLCByZ2IpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludCByMiA9IGNvbG9ybWFwX25lYXJlc3RfYnJ1dGVmb3JjZShwYWxldHRlLCByZ2IpOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYXJnYltdID0gezB4ZmYsIHIsIGcsIGJ9OworICAgICAgICAgICAgICAgIGNvbnN0IGludCByMSA9IENPTE9STUFQX05FQVJFU1Qoc2VhcmNoX21ldGhvZCwgcGFsZXR0ZSwgbm9kZSwgYXJnYiwgdHJhbnNfdGhyZXNoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgcjIgPSBjb2xvcm1hcF9uZWFyZXN0X2JydXRlZm9yY2UocGFsZXR0ZSwgYXJnYiwgdHJhbnNfdGhyZXNoKTsKICAgICAgICAgICAgICAgICBpZiAocjEgIT0gcjIpIHsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYzEgPSBwYWxldHRlW3IxXTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYzIgPSBwYWxldHRlW3IyXTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBwYWxyZ2IxW10gPSB7IGMxPj4xNiAmIDB4ZmYsIGMxPj4gOCAmIDB4ZmYsIGMxICYgMHhmZiB9OwotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHBhbHJnYjJbXSA9IHsgYzI+PjE2ICYgMHhmZiwgYzI+PiA4ICYgMHhmZiwgYzIgJiAweGZmIH07Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBkMSA9IGRpZmYocGFscmdiMSwgcmdiKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGQyID0gZGlmZihwYWxyZ2IyLCByZ2IpOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHBhbGFyZ2IxW10gPSB7IDB4ZmYsIGMxPj4xNiAmIDB4ZmYsIGMxPj4gOCAmIDB4ZmYsIGMxICYgMHhmZiB9OworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHBhbGFyZ2IyW10gPSB7IDB4ZmYsIGMyPj4xNiAmIDB4ZmYsIGMyPj4gOCAmIDB4ZmYsIGMyICYgMHhmZiB9OworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZDEgPSBkaWZmKHBhbGFyZ2IxLCBhcmdiLCB0cmFuc190aHJlc2gpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZDIgPSBkaWZmKHBhbGFyZ2IyLCBhcmdiLCB0cmFuc190aHJlc2gpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZDEgIT0gZDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8hXFwgJTAyWCUwMlglMDJYOiAlZCAhICVkICglMDZYICEgJTA2WCkgLyBkaXN0OiAlZCAhICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIVxcICUwMlglMDJYJTAyWDogJWQgISAlZCAoJTA2IlBSSVgzMiIgISAlMDYiUFJJWDMyIikgLyBkaXN0OiAlZCAhICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIsIHIxLCByMiwgYzEgJiAweGZmZmZmZiwgYzIgJiAweGZmZmZmZiwgZDEsIGQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDE7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTU3OCwxNyArNjAyLDE5IEBACiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBjb25zdCBzdHJ1Y3QgY29sb3IgKmEgPSBwYTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGNvbnN0IHN0cnVjdCBjb2xvciAqYiA9IHBiOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuICAgKGEtPnZhbHVlID4+ICg4ICogKDIgLSAocG9zKSkpICYgMHhmZikgICAgIFwKLSAgICAgICAgICAgLSAoYi0+dmFsdWUgPj4gKDggKiAoMiAtIChwb3MpKSkgJiAweGZmKTsgICAgXAorICAgIHJldHVybiAgIChhLT52YWx1ZSA+PiAoOCAqICgzIC0gKHBvcykpKSAmIDB4ZmYpICAgICBcCisgICAgICAgICAgIC0gKGItPnZhbHVlID4+ICg4ICogKDMgLSAocG9zKSkpICYgMHhmZik7ICAgIFwKIH0KIAotREVDTEFSRV9DTVBfRlVOQyhyLCAwKQotREVDTEFSRV9DTVBfRlVOQyhnLCAxKQotREVDTEFSRV9DTVBfRlVOQyhiLCAyKQorREVDTEFSRV9DTVBfRlVOQyhhLCAwKQorREVDTEFSRV9DTVBfRlVOQyhyLCAxKQorREVDTEFSRV9DTVBfRlVOQyhnLCAyKQorREVDTEFSRV9DTVBfRlVOQyhiLCAzKQogCi1zdGF0aWMgY29uc3QgY21wX2Z1bmMgY21wX2Z1bmNzW10gPSB7Y21wX3IsIGNtcF9nLCBjbXBfYn07CitzdGF0aWMgY29uc3QgY21wX2Z1bmMgY21wX2Z1bmNzW10gPSB7Y21wX2EsIGNtcF9yLCBjbXBfZywgY21wX2J9OwogCiBzdGF0aWMgaW50IGdldF9uZXh0X2NvbG9yKGNvbnN0IHVpbnQ4X3QgKmNvbG9yX3VzZWQsIGNvbnN0IHVpbnQzMl90ICpwYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdHJhbnNfdGhyZXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmNvbXBvbmVudCwgY29uc3Qgc3RydWN0IGNvbG9yX3JlY3QgKmJveCkKIHsKICAgICBpbnQgd3IsIHdnLCB3YjsKQEAgLTYwMywxMSArNjI5LDE2IEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgQVZQQUxFVFRFX0NPVU5UOyBpKyspIHsKICAgICAgICAgY29uc3QgdWludDMyX3QgYyA9IHBhbGV0dGVbaV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgYSA9IGMgPj4gMjQgJiAweGZmOwogICAgICAgICBjb25zdCB1aW50OF90IHIgPSBjID4+IDE2ICYgMHhmZjsKICAgICAgICAgY29uc3QgdWludDhfdCBnID0gYyA+PiAgOCAmIDB4ZmY7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgYiA9IGMgICAgICAgJiAweGZmOwogCi0gICAgICAgIGlmIChjb2xvcl91c2VkW2ldIHx8CisgICAgICAgIGlmIChhIDwgdHJhbnNfdGhyZXNoKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb2xvcl91c2VkW2ldIHx8IChhICE9IDB4ZmYpIHx8CiAgICAgICAgICAgICByIDwgYm94LT5taW5bMF0gfHwgZyA8IGJveC0+bWluWzFdIHx8IGIgPCBib3gtPm1pblsyXSB8fAogICAgICAgICAgICAgciA+IGJveC0+bWF4WzBdIHx8IGcgPiBib3gtPm1heFsxXSB8fCBiID4gYm94LT5tYXhbMl0pCiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTYzMyw5ICs2NjQsOSBAQAogICAgIHdyID0gcmFuZ2VzLm1heFswXSAtIHJhbmdlcy5taW5bMF07CiAgICAgd2cgPSByYW5nZXMubWF4WzFdIC0gcmFuZ2VzLm1pblsxXTsKICAgICB3YiA9IHJhbmdlcy5tYXhbMl0gLSByYW5nZXMubWluWzJdOwotICAgIGlmICh3ciA+PSB3ZyAmJiB3ciA+PSB3YikgbG9uZ2VzdCA9IDA7Ci0gICAgaWYgKHdnID49IHdyICYmIHdnID49IHdiKSBsb25nZXN0ID0gMTsKLSAgICBpZiAod2IgPj0gd3IgJiYgd2IgPj0gd2cpIGxvbmdlc3QgPSAyOworICAgIGlmICh3ciA+PSB3ZyAmJiB3ciA+PSB3YikgbG9uZ2VzdCA9IDE7CisgICAgaWYgKHdnID49IHdyICYmIHdnID49IHdiKSBsb25nZXN0ID0gMjsKKyAgICBpZiAod2IgPj0gd3IgJiYgd2IgPj0gd2cpIGxvbmdlc3QgPSAzOwogICAgIGNtcGYgPSBjbXBfZnVuY3NbbG9uZ2VzdF07CiAgICAgKmNvbXBvbmVudCA9IGxvbmdlc3Q7CiAKQEAgLTY0OSw2ICs2ODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqY29sb3JfdXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbmJfdXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90ICpwYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRyYW5zX3RocmVzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBjb2xvcl9yZWN0ICpib3gpCiB7CiAgICAgdWludDMyX3QgYzsKQEAgLTY1Niw3ICs2ODgsNyBAQAogICAgIGludCBub2RlX2xlZnRfaWQgPSAtMSwgbm9kZV9yaWdodF9pZCA9IC0xOwogICAgIHN0cnVjdCBjb2xvcl9ub2RlICpub2RlOwogICAgIHN0cnVjdCBjb2xvcl9yZWN0IGJveDEsIGJveDI7Ci0gICAgY29uc3QgaW50IHBhbF9pZCA9IGdldF9uZXh0X2NvbG9yKGNvbG9yX3VzZWQsIHBhbGV0dGUsICZjb21wb25lbnQsIGJveCk7CisgICAgY29uc3QgaW50IHBhbF9pZCA9IGdldF9uZXh0X2NvbG9yKGNvbG9yX3VzZWQsIHBhbGV0dGUsIHRyYW5zX3RocmVzaCwgJmNvbXBvbmVudCwgYm94KTsKIAogICAgIGlmIChwYWxfaWQgPCAwKQogICAgICAgICByZXR1cm4gLTE7CkBAIC02NjcsMjEgKzY5OSwyMiBAQAogICAgIG5vZGUgPSAmbWFwW2N1cl9pZF07CiAgICAgbm9kZS0+c3BsaXQgPSBjb21wb25lbnQ7CiAgICAgbm9kZS0+cGFsZXR0ZV9pZCA9IHBhbF9pZDsKLSAgICBub2RlLT52YWxbMF0gPSBjPj4xNiAmIDB4ZmY7Ci0gICAgbm9kZS0+dmFsWzFdID0gYz4+IDggJiAweGZmOwotICAgIG5vZGUtPnZhbFsyXSA9IGMgICAgICYgMHhmZjsKKyAgICBub2RlLT52YWxbMF0gPSBjPj4yNCAmIDB4ZmY7CisgICAgbm9kZS0+dmFsWzFdID0gYz4+MTYgJiAweGZmOworICAgIG5vZGUtPnZhbFsyXSA9IGM+PiA4ICYgMHhmZjsKKyAgICBub2RlLT52YWxbM10gPSBjICAgICAmIDB4ZmY7CiAKICAgICBjb2xvcl91c2VkW3BhbF9pZF0gPSAxOwogCiAgICAgLyogZ2V0IHRoZSB0d28gYm94ZXMgdGhpcyBub2RlIGNyZWF0ZXMgKi8KICAgICBib3gxID0gYm94MiA9ICpib3g7Ci0gICAgYm94MS5tYXhbY29tcG9uZW50XSA9IG5vZGUtPnZhbFtjb21wb25lbnRdOwotICAgIGJveDIubWluW2NvbXBvbmVudF0gPSBub2RlLT52YWxbY29tcG9uZW50XSArIDE7CisgICAgYm94MS5tYXhbY29tcG9uZW50LTFdID0gbm9kZS0+dmFsW2NvbXBvbmVudF07CisgICAgYm94Mi5taW5bY29tcG9uZW50LTFdID0gbm9kZS0+dmFsW2NvbXBvbmVudF0gKyAxOwogCi0gICAgbm9kZV9sZWZ0X2lkID0gY29sb3JtYXBfaW5zZXJ0KG1hcCwgY29sb3JfdXNlZCwgbmJfdXNlZCwgcGFsZXR0ZSwgJmJveDEpOworICAgIG5vZGVfbGVmdF9pZCA9IGNvbG9ybWFwX2luc2VydChtYXAsIGNvbG9yX3VzZWQsIG5iX3VzZWQsIHBhbGV0dGUsIHRyYW5zX3RocmVzaCwgJmJveDEpOwogCi0gICAgaWYgKGJveDIubWluW2NvbXBvbmVudF0gPD0gYm94Mi5tYXhbY29tcG9uZW50XSkKLSAgICAgICAgbm9kZV9yaWdodF9pZCA9IGNvbG9ybWFwX2luc2VydChtYXAsIGNvbG9yX3VzZWQsIG5iX3VzZWQsIHBhbGV0dGUsICZib3gyKTsKKyAgICBpZiAoYm94Mi5taW5bY29tcG9uZW50LTFdIDw9IGJveDIubWF4W2NvbXBvbmVudC0xXSkKKyAgICAgICAgbm9kZV9yaWdodF9pZCA9IGNvbG9ybWFwX2luc2VydChtYXAsIGNvbG9yX3VzZWQsIG5iX3VzZWQsIHBhbGV0dGUsIHRyYW5zX3RocmVzaCwgJmJveDIpOwogCiAgICAgbm9kZS0+bGVmdF9pZCAgPSBub2RlX2xlZnRfaWQ7CiAgICAgbm9kZS0+cmlnaHRfaWQgPSBub2RlX3JpZ2h0X2lkOwpAQCAtNzA1LDYgKzczOCwxNiBAQAogCiAgICAgLyogZGlzYWJsZSB0cmFuc3BhcmVudCBjb2xvcnMgYW5kIGR1cHMgKi8KICAgICBxc29ydChzLT5wYWxldHRlLCBBVlBBTEVUVEVfQ09VTlQsIHNpemVvZigqcy0+cGFsZXR0ZSksIGNtcF9wYWxfZW50cnkpOworICAgIC8vIHVwZGF0ZSB0cmFuc3BhcmVuY3kgaW5kZXg6CisgICAgaWYgKHMtPnRyYW5zcGFyZW5jeV9pbmRleCA+PSAwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBVlBBTEVUVEVfQ09VTlQ7IGkrKykgeworICAgICAgICAgICAgaWYgKChzLT5wYWxldHRlW2ldPj4yNCAmIDB4ZmYpID09IDApIHsKKyAgICAgICAgICAgICAgICBzLT50cmFuc3BhcmVuY3lfaW5kZXggPSBpOyAvLyB3ZSBhcmUgYXNzdW1pbmcgYXQgbW9zdCBvbmUgdHJhbnNwYXJlbnQgY29sb3IgaW4gcGFsZXR0ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgZm9yIChpID0gMDsgaSA8IEFWUEFMRVRURV9DT1VOVDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGMgPSBzLT5wYWxldHRlW2ldOwogICAgICAgICBpZiAoaSAhPSAwICYmIGMgPT0gbGFzdF9jb2xvcikgewpAQCAtNzEyLDcgKzc1NSw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogICAgICAgICBsYXN0X2NvbG9yID0gYzsKLSAgICAgICAgaWYgKChjICYgMHhmZjAwMDAwMCkgIT0gMHhmZjAwMDAwMCkgeworICAgICAgICBpZiAoYyA+PiAyNCA8IHMtPnRyYW5zX3RocmVzaCkgewogICAgICAgICAgICAgY29sb3JfdXNlZFtpXSA9IDE7IC8vIGlnbm9yZSB0cmFuc3BhcmVudCBjb2xvcihzKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTcyMSwxMyArNzY0LDEzIEBACiAgICAgYm94Lm1pblswXSA9IGJveC5taW5bMV0gPSBib3gubWluWzJdID0gMHgwMDsKICAgICBib3gubWF4WzBdID0gYm94Lm1heFsxXSA9IGJveC5tYXhbMl0gPSAweGZmOwogCi0gICAgY29sb3JtYXBfaW5zZXJ0KHMtPm1hcCwgY29sb3JfdXNlZCwgJm5iX3VzZWQsIHMtPnBhbGV0dGUsICZib3gpOworICAgIGNvbG9ybWFwX2luc2VydChzLT5tYXAsIGNvbG9yX3VzZWQsICZuYl91c2VkLCBzLT5wYWxldHRlLCBzLT50cmFuc190aHJlc2gsICZib3gpOwogCiAgICAgaWYgKHMtPmRvdF9maWxlbmFtZSkKICAgICAgICAgZGlzcF90cmVlKHMtPm1hcCwgcy0+ZG90X2ZpbGVuYW1lKTsKIAogICAgIGlmIChzLT5kZWJ1Z19hY2N1cmFjeSkgewotICAgICAgICBpZiAoIWRlYnVnX2FjY3VyYWN5KHMtPm1hcCwgcy0+cGFsZXR0ZSwgcy0+Y29sb3Jfc2VhcmNoX21ldGhvZCkpCisgICAgICAgIGlmICghZGVidWdfYWNjdXJhY3kocy0+bWFwLCBzLT5wYWxldHRlLCBzLT50cmFuc190aHJlc2gsIHMtPmNvbG9yX3NlYXJjaF9tZXRob2QpKQogICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiQWNjdXJhY3kgY2hlY2sgcGFzc2VkXG4iKTsKICAgICB9CiB9CkBAIC03NDgsOSArNzkxLDkgQEAKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGluMS0+d2lkdGg7IHgrKykgewogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYzEgPSBzcmMxW3hdOwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYzIgPSBwYWxldHRlW3NyYzJbeF1dOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCByZ2IxW10gPSB7YzEgPj4gMTYgJiAweGZmLCBjMSA+PiA4ICYgMHhmZiwgYzEgJiAweGZmfTsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgcmdiMltdID0ge2MyID4+IDE2ICYgMHhmZiwgYzIgPj4gOCAmIDB4ZmYsIGMyICYgMHhmZn07Ci0gICAgICAgICAgICBtZWFuX2VyciArPSBkaWZmKHJnYjEsIHJnYjIpOworICAgICAgICAgICAgY29uc3QgdWludDhfdCBhcmdiMVtdID0gezB4ZmYsIGMxID4+IDE2ICYgMHhmZiwgYzEgPj4gOCAmIDB4ZmYsIGMxICYgMHhmZn07CisgICAgICAgICAgICBjb25zdCB1aW50OF90IGFyZ2IyW10gPSB7MHhmZiwgYzIgPj4gMTYgJiAweGZmLCBjMiA+PiA4ICYgMHhmZiwgYzIgJiAweGZmfTsKKyAgICAgICAgICAgIG1lYW5fZXJyICs9IGRpZmYoYXJnYjEsIGFyZ2IyLCBzLT50cmFuc190aHJlc2gpOwogICAgICAgICB9CiAgICAgICAgIHNyYzEgKz0gc3JjMV9saW5lc2l6ZTsKICAgICAgICAgc3JjMiArPSBzcmMyX2xpbmVzaXplOwpAQCAtODUxLDkgKzg5NCw5IEBACiAgICAgKmhwID0gaGVpZ2h0OwogfQogCi1zdGF0aWMgQVZGcmFtZSAqYXBwbHlfcGFsZXR0ZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCitzdGF0aWMgaW50IGFwcGx5X3BhbGV0dGUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluLCBBVkZyYW1lICoqb3V0ZikKIHsKLSAgICBpbnQgeCwgeSwgdywgaDsKKyAgICBpbnQgeCwgeSwgdywgaCwgcmV0OwogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CiAgICAgUGFsZXR0ZVVzZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gaW5saW5rLT5kc3QtPm91dHB1dHNbMF07CkBAIC04NjEsNyArOTA0LDggQEAKICAgICBBVkZyYW1lICpvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOwogICAgIGlmICghb3V0KSB7CiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICpvdXRmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKIApAQCAtODc1LDIxICs5MTksMjUgQEAKICAgICAgICAgYXZfZnJhbWVfbWFrZV93cml0YWJsZShzLT5sYXN0X2luKSA8IDApIHsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwogICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgKm91dGYgPSBOVUxMOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KIAogICAgIGZmX2Rsb2coY3R4LCAiJWR4JWQgcmVjdDogKCVkOyVkKSAtPiAoJWQsJWQpIFthcmVhOiVkeCVkXVxuIiwKICAgICAgICAgICAgIHcsIGgsIHgsIHksIHgrdywgeStoLCBpbi0+d2lkdGgsIGluLT5oZWlnaHQpOwogCi0gICAgaWYgKHMtPnNldF9mcmFtZShzLCBvdXQsIGluLCB4LCB5LCB3LCBoKSA8IDApIHsKKyAgICByZXQgPSBzLT5zZXRfZnJhbWUocywgb3V0LCBpbiwgeCwgeSwgdywgaCk7CisgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICpvdXRmID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgbWVtY3B5KG91dC0+ZGF0YVsxXSwgcy0+cGFsZXR0ZSwgQVZQQUxFVFRFX1NJWkUpOwogICAgIGlmIChzLT5jYWxjX21lYW5fZXJyKQotICAgICAgICBkZWJ1Z19tZWFuX2Vycm9yKHMsIGluLCBvdXQsIGlubGluay0+ZnJhbWVfY291bnQpOworICAgICAgICBkZWJ1Z19tZWFuX2Vycm9yKHMsIGluLCBvdXQsIGlubGluay0+ZnJhbWVfY291bnRfb3V0KTsKICAgICBhdl9mcmFtZV9mcmVlKCZpbik7Ci0gICAgcmV0dXJuIG91dDsKKyAgICAqb3V0ZiA9IG91dDsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKQEAgLTg5OCwxMSArOTQ2LDE4IEBACiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CiAgICAgUGFsZXR0ZVVzZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAKKyAgICByZXQgPSBmZl9mcmFtZXN5bmNfaW5pdF9kdWFsaW5wdXQoJnMtPmZzLCBjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHMtPmZzLm9wdF9yZXBlYXRsYXN0ID0gMTsgLy8gb25seSAxIGZyYW1lIGluIHRoZSBwYWxldHRlCisgICAgcy0+ZnMuaW5bMV0uYmVmb3JlID0gcy0+ZnMuaW5bMV0uYWZ0ZXIgPSBFWFRfSU5GSU5JVFk7CisgICAgcy0+ZnMub25fZXZlbnQgPSBsb2FkX2FwcGx5X3BhbGV0dGU7CisKICAgICBvdXRsaW5rLT53ID0gY3R4LT5pbnB1dHNbMF0tPnc7CiAgICAgb3V0bGluay0+aCA9IGN0eC0+aW5wdXRzWzBdLT5oOwogCiAgICAgb3V0bGluay0+dGltZV9iYXNlID0gY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZTsKLSAgICBpZiAoKHJldCA9IGZmX2R1YWxpbnB1dF9pbml0KGN0eCwgJnMtPmRpbnB1dCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIHJldHVybiAwOwogfQpAQCAtOTI4LDMzICs5ODMsNjEgQEAKICAgICBjb25zdCB1aW50MzJfdCAqcCA9IChjb25zdCB1aW50MzJfdCAqKXBhbGV0dGVfZnJhbWUtPmRhdGFbMF07CiAgICAgY29uc3QgaW50IHBfbGluZXNpemUgPSBwYWxldHRlX2ZyYW1lLT5saW5lc2l6ZVswXSA+PiAyOwogCisgICAgcy0+dHJhbnNwYXJlbmN5X2luZGV4ID0gLTE7CisKKyAgICBpZiAocy0+bmV3KSB7CisgICAgICAgIG1lbXNldChzLT5wYWxldHRlLCAwLCBzaXplb2Yocy0+cGFsZXR0ZSkpOworICAgICAgICBtZW1zZXQocy0+bWFwLCAwLCBzaXplb2Yocy0+bWFwKSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBDQUNIRV9TSVpFOyBpKyspCisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+Y2FjaGVbaV0uZW50cmllcyk7CisgICAgICAgIG1lbXNldChzLT5jYWNoZSwgMCwgc2l6ZW9mKHMtPmNhY2hlKSk7CisgICAgfQorCiAgICAgaSA9IDA7CiAgICAgZm9yICh5ID0gMDsgeSA8IHBhbGV0dGVfZnJhbWUtPmhlaWdodDsgeSsrKSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBwYWxldHRlX2ZyYW1lLT53aWR0aDsgeCsrKQotICAgICAgICAgICAgcy0+cGFsZXR0ZVtpKytdID0gcFt4XTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBhbGV0dGVfZnJhbWUtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIHMtPnBhbGV0dGVbaV0gPSBwW3hdOworICAgICAgICAgICAgaWYgKHBbeF0+PjI0IDwgcy0+dHJhbnNfdGhyZXNoKSB7CisgICAgICAgICAgICAgICAgcy0+dHJhbnNwYXJlbmN5X2luZGV4ID0gaTsgLy8gd2UgYXJlIGFzc3VtaW5nIGF0IG1vc3Qgb25lIHRyYW5zcGFyZW50IGNvbG9yIGluIHBhbGV0dGUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQogICAgICAgICBwICs9IHBfbGluZXNpemU7CiAgICAgfQogCiAgICAgbG9hZF9jb2xvcm1hcChzKTsKIAotICAgIHMtPnBhbGV0dGVfbG9hZGVkID0gMTsKKyAgICBpZiAoIXMtPm5ldykKKyAgICAgICAgcy0+cGFsZXR0ZV9sb2FkZWQgPSAxOwogfQogCi1zdGF0aWMgQVZGcmFtZSAqbG9hZF9hcHBseV9wYWxldHRlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICptYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzZWNvbmQpCitzdGF0aWMgaW50IGxvYWRfYXBwbHlfcGFsZXR0ZShGRkZyYW1lU3luYyAqZnMpCiB7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OwogICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CiAgICAgUGFsZXR0ZVVzZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqbWFzdGVyLCAqc2Vjb25kLCAqb3V0ID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgLy8gd3JpdGFibGUgZm9yIGVycm9yIGRpZmZ1c2FsIGRpdGhlcmluZworICAgIHJldCA9IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRfZ2V0X3dyaXRhYmxlKGZzLCAmbWFzdGVyLCAmc2Vjb25kKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIW1hc3RlciB8fCAhc2Vjb25kKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfQlVHOworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KICAgICBpZiAoIXMtPnBhbGV0dGVfbG9hZGVkKSB7CiAgICAgICAgIGxvYWRfcGFsZXR0ZShzLCBzZWNvbmQpOwogICAgIH0KLSAgICByZXR1cm4gYXBwbHlfcGFsZXR0ZShpbmxpbmssIG1haW4pOwotfQorICAgIHJldCA9IGFwcGx5X3BhbGV0dGUoaW5saW5rLCBtYXN0ZXIsICZvdXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXQpOwogCi1zdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCi17Ci0gICAgUGFsZXR0ZVVzZUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICByZXR1cm4gZmZfZHVhbGlucHV0X2ZpbHRlcl9mcmFtZSgmcy0+ZGlucHV0LCBpbmxpbmssIGluKTsKK2Vycm9yOgorICAgIGF2X2ZyYW1lX2ZyZWUoJm1hc3Rlcik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogI2RlZmluZSBERUZJTkVfU0VUX0ZSQU1FKGNvbG9yX3NlYXJjaCwgbmFtZSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMDAyLDggKzEwODUsNiBAQAogc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgUGFsZXR0ZVVzZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgcy0+ZGlucHV0LnJlcGVhdGxhc3QgPSAxOyAvLyBvbmx5IDEgZnJhbWUgaW4gdGhlIHBhbGV0dGUKLSAgICBzLT5kaW5wdXQucHJvY2VzcyAgICA9IGxvYWRfYXBwbHlfcGFsZXR0ZTsKIAogICAgIHMtPnNldF9mcmFtZSA9IHNldF9mcmFtZV9sdXRbcy0+Y29sb3Jfc2VhcmNoX21ldGhvZF1bcy0+ZGl0aGVyXTsKIApAQCAtMTAxOCwxMCArMTA5OSwxMCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQorc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBQYWxldHRlVXNlQ29udGV4dCAqcyA9IG91dGxpbmstPnNyYy0+cHJpdjsKLSAgICByZXR1cm4gZmZfZHVhbGlucHV0X3JlcXVlc3RfZnJhbWUoJnMtPmRpbnB1dCwgb3V0bGluayk7CisgICAgUGFsZXR0ZVVzZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19hY3RpdmF0ZSgmcy0+ZnMpOwogfQogCiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKQEAgLTEwMjksNyArMTExMCw3IEBACiAgICAgaW50IGk7CiAgICAgUGFsZXR0ZVVzZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAKLSAgICBmZl9kdWFsaW5wdXRfdW5pbml0KCZzLT5kaW5wdXQpOworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgQ0FDSEVfU0laRTsgaSsrKQogICAgICAgICBhdl9mcmVlcCgmcy0+Y2FjaGVbaV0uZW50cmllcyk7CiAgICAgYXZfZnJhbWVfZnJlZSgmcy0+bGFzdF9pbik7CkBAIC0xMDQwLDEzICsxMTIxLDEwIEBACiAgICAgewogICAgICAgICAubmFtZSAgICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gZmlsdGVyX2ZyYW1lLAotICAgICAgICAubmVlZHNfd3JpdGFibGUgPSAxLCAvLyBmb3IgZXJyb3IgZGlmZnVzYWwgZGl0aGVyaW5nCiAgICAgfSx7CiAgICAgICAgIC5uYW1lICAgICAgICAgICA9ICJwYWxldHRlIiwKICAgICAgICAgLnR5cGUgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAuY29uZmlnX3Byb3BzICAgPSBjb25maWdfaW5wdXRfcGFsZXR0ZSwKLSAgICAgICAgLmZpbHRlcl9mcmFtZSAgID0gZmlsdGVyX2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0xMDU2LDcgKzExMzQsNiBAQAogICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKICAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKLSAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0xMDY4LDYgKzExNDUsNyBAQAogICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKICAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCiAgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLmFjdGl2YXRlICAgICAgPSBhY3RpdmF0ZSwKICAgICAuaW5wdXRzICAgICAgICA9IHBhbGV0dGV1c2VfaW5wdXRzLAogICAgIC5vdXRwdXRzICAgICAgID0gcGFsZXR0ZXVzZV9vdXRwdXRzLAogICAgIC5wcml2X2NsYXNzICAgID0gJnBhbGV0dGV1c2VfY2xhc3MsCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9wZXJzcGVjdGl2ZS5jIGIvbGliYXZmaWx0ZXIvdmZfcGVyc3BlY3RpdmUuYwppbmRleCA0OTQ5ZWU4Li45MjQ5NTA5IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9wZXJzcGVjdGl2ZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3BlcnNwZWN0aXZlLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICAgICBpbnQgaHN1YiwgdnN1YjsKICAgICBpbnQgbmJfcGxhbmVzOwogICAgIGludCBzZW5zZTsKKyAgICBpbnQgZXZhbF9tb2RlOwogCiAgICAgaW50ICgqcGVyc3BlY3RpdmUpKEFWRmlsdGVyQ29udGV4dCAqY3R4LAogICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcmcsIGludCBqb2IsIGludCBuYl9qb2JzKTsKQEAgLTYxLDYgKzYyLDEyIEBACiAgICAgUEVSU1BFQ1RJVkVfU0VOU0VfREVTVElOQVRJT04gPSAxLCAvLy88IGNvb3JkaW5hdGVzIGdpdmUgbG9jYXRpb25zIGluIGRlc3RpbmF0aW9uIG9mIGNvcm5lcnMgb2Ygc291cmNlLgogfTsKIAorZW51bSBFdmFsTW9kZSB7CisgICAgRVZBTF9NT0RFX0lOSVQsCisgICAgRVZBTF9NT0RFX0ZSQU1FLAorICAgIEVWQUxfTU9ERV9OQgorfTsKKwogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHBlcnNwZWN0aXZlX29wdGlvbnNbXSA9IHsKICAgICB7ICJ4MCIsICJzZXQgdG9wIGxlZnQgeCBjb29yZGluYXRlIiwgICAgIE9GRlNFVChleHByX3N0clswXVswXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjAifSwgMCwgMCwgRkxBR1MgfSwKICAgICB7ICJ5MCIsICJzZXQgdG9wIGxlZnQgeSBjb29yZGluYXRlIiwgICAgIE9GRlNFVChleHByX3N0clswXVsxXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9IjAifSwgMCwgMCwgRkxBR1MgfSwKQEAgLTc4LDYgKzg1LDkgQEAKICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9UEVSU1BFQ1RJVkVfU0VOU0VfU09VUkNFfSwgMCwgMCwgRkxBR1MsICJzZW5zZSJ9LAogICAgIHsgICAgICAgImRlc3RpbmF0aW9uIiwgInNwZWNpZnkgbG9jYXRpb25zIGluIGRlc3RpbmF0aW9uIHRvIHNlbmQgY29ybmVycyBvZiBzb3VyY2UiLAogICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1QRVJTUEVDVElWRV9TRU5TRV9ERVNUSU5BVElPTn0sIDAsIDAsIEZMQUdTLCAic2Vuc2UifSwKKyAgICB7ICJldmFsIiwgInNwZWNpZnkgd2hlbiB0byBldmFsdWF0ZSBleHByZXNzaW9ucyIsIE9GRlNFVChldmFsX21vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRVZBTF9NT0RFX0lOSVR9LCAwLCBFVkFMX01PREVfTkItMSwgRkxBR1MsICJldmFsIiB9LAorICAgICAgICAgeyAiaW5pdCIsICAiZXZhbCBleHByZXNzaW9ucyBvbmNlIGR1cmluZyBpbml0aWFsaXphdGlvbiIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1FVkFMX01PREVfSU5JVH0sICAuZmxhZ3MgPSBGTEFHUywgLnVuaXQgPSAiZXZhbCIgfSwKKyAgICAgICAgIHsgImZyYW1lIiwgImV2YWwgZXhwcmVzc2lvbnMgcGVyLWZyYW1lIiwgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9RVZBTF9NT0RFX0ZSQU1FfSwgLmZsYWdzID0gRkxBR1MsIC51bml0ID0gImV2YWwiIH0sCiAKICAgICB7IE5VTEwgfQogfTsKQEAgLTExNSwyMCArMTI1LDIyIEBACiAgICAgcmV0dXJuIGNvZWZmOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7ICAgIlciLCAgICJIIiwgICAgICAgIE5VTEwgfTsKLWVudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgVkFSX1csIFZBUl9ILCBWQVJfVkFSU19OQiB9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geyAgICJXIiwgICAiSCIsICAgImluIiwgICAib24iLCAgICAgICAgTlVMTCB9OworZW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBWQVJfVywgVkFSX0gsIFZBUl9JTiwgVkFSX09OLCBWQVJfVkFSU19OQiB9OwogCi1zdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3N0YXRpYyBpbnQgY2FsY19wZXJzcF9sdXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZpbHRlckxpbmsgKmlubGluaykKIHsKKyAgICBQZXJzcGVjdGl2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIGRvdWJsZSAoKnJlZilbMl0gICAgICA9IHMtPnJlZjsKKworICAgIGRvdWJsZSB2YWx1ZXNbVkFSX1ZBUlNfTkJdID0geyBbVkFSX1ddID0gaW5saW5rLT53LCBbVkFSX0hdID0gaW5saW5rLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVkFSX0lOXSA9IGlubGluay0+ZnJhbWVfY291bnRfb3V0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1ZBUl9PTl0gPSBvdXRsaW5rLT5mcmFtZV9jb3VudF9pbiArIDEgfTsKKyAgICBjb25zdCBpbnQgaCA9IHZhbHVlc1tWQVJfSF07CisgICAgY29uc3QgaW50IHcgPSB2YWx1ZXNbVkFSX1ddOwogICAgIGRvdWJsZSB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4LCBxOwogICAgIGRvdWJsZSB0MCwgdDEsIHQyLCB0MzsKLSAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwotICAgIFBlcnNwZWN0aXZlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBkb3VibGUgKCpyZWYpWzJdID0gcy0+cmVmOwotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOwotICAgIGRvdWJsZSB2YWx1ZXNbVkFSX1ZBUlNfTkJdID0geyBbVkFSX1ddID0gaW5saW5rLT53LCBbVkFSX0hdID0gaW5saW5rLT5oIH07Ci0gICAgaW50IGggPSBpbmxpbmstPmg7Ci0gICAgaW50IHcgPSBpbmxpbmstPnc7CiAgICAgaW50IHgsIHksIGksIGosIHJldDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKQEAgLTE0NCwxOSArMTU2LDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHMtPmhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OwotICAgIHMtPnZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOwotICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKLSAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKHMtPmxpbmVzaXplLCBpbmxpbmstPmZvcm1hdCwgaW5saW5rLT53KSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgcy0+aGVpZ2h0WzFdID0gcy0+aGVpZ2h0WzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKLSAgICBzLT5oZWlnaHRbMF0gPSBzLT5oZWlnaHRbM10gPSBpbmxpbmstPmg7Ci0KLSAgICBzLT5wdiA9IGF2X3JlYWxsb2NfZihzLT5wdiwgdyAqIGgsIDIgKiBzaXplb2YoKnMtPnB2KSk7Ci0gICAgaWYgKCFzLT5wdikKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQogICAgIHN3aXRjaCAocy0+c2Vuc2UpIHsKICAgICBjYXNlIFBFUlNQRUNUSVZFX1NFTlNFX1NPVVJDRToKICAgICAgICAgeDYgPSAoKHJlZlswXVswXSAtIHJlZlsxXVswXSAtIHJlZlsyXVswXSArIHJlZlszXVswXSkgKgpAQCAtMjIzLDYgKzIyMiwzNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgUGVyc3BlY3RpdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIGludCBoID0gaW5saW5rLT5oOworICAgIGludCB3ID0gaW5saW5rLT53OworICAgIGludCBpLCBqLCByZXQ7CisgICAgcy0+aHN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CisgICAgcy0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMocy0+bGluZXNpemUsIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzLT5oZWlnaHRbMV0gPSBzLT5oZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIHMtPmhlaWdodFswXSA9IHMtPmhlaWdodFszXSA9IGlubGluay0+aDsKKworICAgIHMtPnB2ID0gYXZfcmVhbGxvY19mKHMtPnB2LCB3ICogaCwgMiAqIHNpemVvZigqcy0+cHYpKTsKKyAgICBpZiAoIXMtPnB2KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKHMtPmV2YWxfbW9kZSA9PSBFVkFMX01PREVfSU5JVCkgeworICAgICAgICBpZiAoKHJldCA9IGNhbGNfcGVyc3BfbHV0cyhjdHgsIGlubGluaykpIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGZvciAoaSA9IDA7IGkgPCBTVUJfUElYRUxTOyBpKyspewogICAgICAgICBkb3VibGUgZCA9IGkgLyAoZG91YmxlKVNVQl9QSVhFTFM7CiAgICAgICAgIGRvdWJsZSB0ZW1wWzRdOwpAQCAtNDIzLDYgKzQ1Miw3IEBACiAgICAgUGVyc3BlY3RpdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIEFWRnJhbWUgKm91dDsKICAgICBpbnQgcGxhbmU7CisgICAgaW50IHJldDsKIAogICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CiAgICAgaWYgKCFvdXQpIHsKQEAgLTQzMSw2ICs0NjEsMTMgQEAKICAgICB9CiAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGZyYW1lKTsKIAorICAgIGlmIChzLT5ldmFsX21vZGUgPT0gRVZBTF9NT0RFX0ZSQU1FKSB7CisgICAgICAgIGlmICgocmV0ID0gY2FsY19wZXJzcF9sdXRzKGN0eCwgaW5saW5rKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPm5iX3BsYW5lczsgcGxhbmUrKykgewogICAgICAgICBpbnQgaHN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHMtPmhzdWIgOiAwOwogICAgICAgICBpbnQgdnN1YiA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IHMtPnZzdWIgOiAwOwpAQCAtNDQyLDcgKzQ3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgLmggPSBzLT5oZWlnaHRbcGxhbmVdLAogICAgICAgICAgICAgICAgICAgICAgICAgIC5oc3ViID0gaHN1YiwKICAgICAgICAgICAgICAgICAgICAgICAgICAudnN1YiA9IHZzdWIgfTsKLSAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHMtPnBlcnNwZWN0aXZlLCAmdGQsIE5VTEwsIEZGTUlOKHRkLmgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIHMtPnBlcnNwZWN0aXZlLCAmdGQsIE5VTEwsIEZGTUlOKHRkLmgsIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAgICAgfQogCiAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfcGl4ZGVzY3Rlc3QuYyBiL2xpYmF2ZmlsdGVyL3ZmX3BpeGRlc2N0ZXN0LmMKaW5kZXggZDY0MjNhYy4uMmQwNzQ5ZSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfcGl4ZGVzY3Rlc3QuYworKysgYi9saWJhdmZpbHRlci92Zl9waXhkZXNjdGVzdC5jCkBAIC04MSw3ICs4MSw3IEBACiAKICAgICAvKiBjb3B5IHBhbGV0dGUgKi8KICAgICBpZiAocHJpdi0+cGl4X2Rlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCB8fAotICAgICAgICBwcml2LT5waXhfZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKQorICAgICAgICAoKHByaXYtPnBpeF9kZXNjLT5mbGFncyAmIEZGX1BTRVVET1BBTCkgJiYgb3V0LT5kYXRhWzFdICYmIGluLT5kYXRhWzFdKSkKICAgICAgICAgbWVtY3B5KG91dC0+ZGF0YVsxXSwgaW4tPmRhdGFbMV0sIEFWUEFMRVRURV9TSVpFKTsKIAogICAgIGZvciAoYyA9IDA7IGMgPCBwcml2LT5waXhfZGVzYy0+bmJfY29tcG9uZW50czsgYysrKSB7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9wcC5jIGIvbGliYXZmaWx0ZXIvdmZfcHAuYwppbmRleCBiYWMxZDUzLi41MjRlZjFiIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9wcC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3BwLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2luY2x1ZGUgImxpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzLmgiCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFBQRmlsdGVyQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgY2hhciAqc3ViZmlsdGVyczsKICAgICBpbnQgbW9kZV9pZDsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3ByZW11bHRpcGx5LmMgYi9saWJhdmZpbHRlci92Zl9wcmVtdWx0aXBseS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9wcmVtdWx0aXBseS5jCkBAIC0wLDAgKzEsNzIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmaWx0ZXJzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImZyYW1lc3luYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgUHJlTXVsdGlwbHlDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgd2lkdGhbNF0sIGhlaWdodFs0XTsKKyAgICBpbnQgbGluZXNpemVbNF07CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgcGxhbmVzOworICAgIGludCBpbnZlcnNlOworICAgIGludCBpbnBsYWNlOworICAgIGludCBoYWxmLCBkZXB0aCwgb2Zmc2V0LCBtYXg7CisgICAgRkZGcmFtZVN5bmMgZnM7CisKKyAgICB2b2lkICgqcHJlbXVsdGlwbHlbNF0pKGNvbnN0IHVpbnQ4X3QgKm1zcmMsIGNvbnN0IHVpbnQ4X3QgKmFzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbWxpbmVzaXplLCBwdHJkaWZmX3QgYWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYWxmLCBpbnQgc2hpZnQsIGludCBvZmZzZXQpOworfSBQcmVNdWx0aXBseUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFByZU11bHRpcGx5Q29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAicGxhbmVzIiwgInNldCBwbGFuZXMiLCBPRkZTRVQocGxhbmVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0weEZ9LCAwLCAweEYsIEZMQUdTIH0sCisgICAgeyAiaW5wbGFjZSIsImVuYWJsZSBpbnBsYWNlIG1vZGUiLCBPRkZTRVQoaW5wbGFjZSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0PTB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCisjZGVmaW5lIHByZW11bHRpcGx5X29wdGlvbnMgb3B0aW9ucworQVZGSUxURVJfREVGSU5FX0NMQVNTKHByZW11bHRpcGx5KTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFByZU11bHRpcGx5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgbm9fYWxwaGFfcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5LCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDE0LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgYWxwaGFfcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2LAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQLAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQMTAsIEFWX1BJWF9GTVRfR0JSQVAxMiwgQVZfUElYX0ZNVF9HQlJBUDE2LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZmX21ha2VfZm9ybWF0X2xpc3Qocy0+aW5wbGFjZSA/IGFscGhhX3BpeF9mbXRzIDogbm9fYWxwaGFfcGl4X2ZtdHMpKTsKK30KKworc3RhdGljIHZvaWQgcHJlbXVsdGlwbHk4KGNvbnN0IHVpbnQ4X3QgKm1zcmMsIGNvbnN0IHVpbnQ4X3QgKmFzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBtbGluZXNpemUsIHB0cmRpZmZfdCBhbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbGYsIGludCBzaGlmdCwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gKChtc3JjW3hdICogKCgoYXNyY1t4XSA+PiAxKSAmIDEpICsgYXNyY1t4XSkpICsgMTI4KSA+PiA4OworICAgICAgICB9CisKKyAgICAgICAgZHN0ICArPSBkbGluZXNpemU7CisgICAgICAgIG1zcmMgKz0gbWxpbmVzaXplOworICAgICAgICBhc3JjICs9IGFsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHByZW11bHRpcGx5OHl1dihjb25zdCB1aW50OF90ICptc3JjLCBjb25zdCB1aW50OF90ICphc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbWxpbmVzaXplLCBwdHJkaWZmX3QgYWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYWxmLCBpbnQgc2hpZnQsIGludCBvZmZzZXQpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGRzdFt4XSA9ICgoKChtc3JjW3hdIC0gMTI4KSAqICgoKGFzcmNbeF0gPj4gMSkgJiAxKSArIGFzcmNbeF0pKSkgPj4gOCkgKyAxMjg7CisgICAgICAgIH0KKworICAgICAgICBkc3QgICs9IGRsaW5lc2l6ZTsKKyAgICAgICAgbXNyYyArPSBtbGluZXNpemU7CisgICAgICAgIGFzcmMgKz0gYWxpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJlbXVsdGlwbHk4b2Zmc2V0KGNvbnN0IHVpbnQ4X3QgKm1zcmMsIGNvbnN0IHVpbnQ4X3QgKmFzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBtbGluZXNpemUsIHB0cmRpZmZfdCBhbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbGYsIGludCBzaGlmdCwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gKCgoKG1zcmNbeF0gLSBvZmZzZXQpICogKCgoYXNyY1t4XSA+PiAxKSAmIDEpICsgYXNyY1t4XSkpICsgMTI4KSA+PiA4KSArIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCAgKz0gZGxpbmVzaXplOworICAgICAgICBtc3JjICs9IG1saW5lc2l6ZTsKKyAgICAgICAgYXNyYyArPSBhbGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwcmVtdWx0aXBseTE2KGNvbnN0IHVpbnQ4X3QgKm1tc3JjLCBjb25zdCB1aW50OF90ICphYXNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1saW5lc2l6ZSwgcHRyZGlmZl90IGFsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFsZiwgaW50IHNoaWZ0LCBpbnQgb2Zmc2V0KQoreworICAgIGNvbnN0IHVpbnQxNl90ICptc3JjID0gKGNvbnN0IHVpbnQxNl90ICopbW1zcmM7CisgICAgY29uc3QgdWludDE2X3QgKmFzcmMgPSAoY29uc3QgdWludDE2X3QgKilhYXNyYzsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopZGRzdDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgZHN0W3hdID0gKChtc3JjW3hdICogKCgoYXNyY1t4XSA+PiAxKSAmIDEpICsgYXNyY1t4XSkpICsgaGFsZikgPj4gc2hpZnQ7CisgICAgICAgIH0KKworICAgICAgICBkc3QgICs9IGRsaW5lc2l6ZSAvIDI7CisgICAgICAgIG1zcmMgKz0gbWxpbmVzaXplIC8gMjsKKyAgICAgICAgYXNyYyArPSBhbGluZXNpemUgLyAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJlbXVsdGlwbHkxNnl1dihjb25zdCB1aW50OF90ICptbXNyYywgY29uc3QgdWludDhfdCAqYWFzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBtbGluZXNpemUsIHB0cmRpZmZfdCBhbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbGYsIGludCBzaGlmdCwgaW50IG9mZnNldCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqbXNyYyA9IChjb25zdCB1aW50MTZfdCAqKW1tc3JjOworICAgIGNvbnN0IHVpbnQxNl90ICphc3JjID0gKGNvbnN0IHVpbnQxNl90ICopYWFzcmM7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKWRkc3Q7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGRzdFt4XSA9ICgoKChtc3JjW3hdIC0gaGFsZikgKiAoKChhc3JjW3hdID4+IDEpICYgMSkgKyBhc3JjW3hdKSkpID4+IHNoaWZ0KSArIGhhbGY7CisgICAgICAgIH0KKworICAgICAgICBkc3QgICs9IGRsaW5lc2l6ZSAvIDI7CisgICAgICAgIG1zcmMgKz0gbWxpbmVzaXplIC8gMjsKKyAgICAgICAgYXNyYyArPSBhbGluZXNpemUgLyAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHJlbXVsdGlwbHkxNm9mZnNldChjb25zdCB1aW50OF90ICptbXNyYywgY29uc3QgdWludDhfdCAqYWFzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBtbGluZXNpemUsIHB0cmRpZmZfdCBhbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbGYsIGludCBzaGlmdCwgaW50IG9mZnNldCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqbXNyYyA9IChjb25zdCB1aW50MTZfdCAqKW1tc3JjOworICAgIGNvbnN0IHVpbnQxNl90ICphc3JjID0gKGNvbnN0IHVpbnQxNl90ICopYWFzcmM7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKWRkc3Q7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGRzdFt4XSA9ICgoKChtc3JjW3hdIC0gb2Zmc2V0KSAqICgoKGFzcmNbeF0gPj4gMSkgJiAxKSArIGFzcmNbeF0pKSArIGhhbGYpID4+IHNoaWZ0KSArIG9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCAgKz0gZGxpbmVzaXplIC8gMjsKKyAgICAgICAgbXNyYyArPSBtbGluZXNpemUgLyAyOworICAgICAgICBhc3JjICs9IGFsaW5lc2l6ZSAvIDI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1bnByZW11bHRpcGx5OChjb25zdCB1aW50OF90ICptc3JjLCBjb25zdCB1aW50OF90ICphc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1saW5lc2l6ZSwgcHRyZGlmZl90IGFsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFsZiwgaW50IG1heCwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaWYgKGFzcmNbeF0gPiAwICYmIGFzcmNbeF0gPCAyNTUpCisgICAgICAgICAgICAgICAgZHN0W3hdID0gRkZNSU4obXNyY1t4XSAqIDI1NSAvIGFzcmNbeF0sIDI1NSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZHN0W3hdID0gbXNyY1t4XTsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCAgKz0gZGxpbmVzaXplOworICAgICAgICBtc3JjICs9IG1saW5lc2l6ZTsKKyAgICAgICAgYXNyYyArPSBhbGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1bnByZW11bHRpcGx5OHl1dihjb25zdCB1aW50OF90ICptc3JjLCBjb25zdCB1aW50OF90ICphc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1saW5lc2l6ZSwgcHRyZGlmZl90IGFsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFsZiwgaW50IG1heCwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaWYgKGFzcmNbeF0gPiAwICYmIGFzcmNbeF0gPCAyNTUpCisgICAgICAgICAgICAgICAgZHN0W3hdID0gRkZNSU4oKG1zcmNbeF0gLSAxMjgpICogMjU1IC8gYXNyY1t4XSArIDEyOCwgMjU1KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBtc3JjW3hdOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICArPSBkbGluZXNpemU7CisgICAgICAgIG1zcmMgKz0gbWxpbmVzaXplOworICAgICAgICBhc3JjICs9IGFsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVucHJlbXVsdGlwbHk4b2Zmc2V0KGNvbnN0IHVpbnQ4X3QgKm1zcmMsIGNvbnN0IHVpbnQ4X3QgKmFzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbWxpbmVzaXplLCBwdHJkaWZmX3QgYWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYWxmLCBpbnQgbWF4LCBpbnQgb2Zmc2V0KQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBpZiAoYXNyY1t4XSA+IDAgJiYgYXNyY1t4XSA8IDI1NSkKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBGRk1JTihGRk1BWChtc3JjW3hdIC0gb2Zmc2V0LCAwKSAqIDI1NSAvIGFzcmNbeF0gKyBvZmZzZXQsIDI1NSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZHN0W3hdID0gbXNyY1t4XTsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCAgKz0gZGxpbmVzaXplOworICAgICAgICBtc3JjICs9IG1saW5lc2l6ZTsKKyAgICAgICAgYXNyYyArPSBhbGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB1bnByZW11bHRpcGx5MTYoY29uc3QgdWludDhfdCAqbW1zcmMsIGNvbnN0IHVpbnQ4X3QgKmFhc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1saW5lc2l6ZSwgcHRyZGlmZl90IGFsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFsZiwgaW50IG1heCwgaW50IG9mZnNldCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqbXNyYyA9IChjb25zdCB1aW50MTZfdCAqKW1tc3JjOworICAgIGNvbnN0IHVpbnQxNl90ICphc3JjID0gKGNvbnN0IHVpbnQxNl90ICopYWFzcmM7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKWRkc3Q7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGlmIChhc3JjW3hdID4gMCAmJiBhc3JjW3hdIDwgbWF4KQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IEZGTUlOKG1zcmNbeF0gKiAodW5zaWduZWQpbWF4IC8gYXNyY1t4XSwgbWF4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBtc3JjW3hdOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICArPSBkbGluZXNpemUgLyAyOworICAgICAgICBtc3JjICs9IG1saW5lc2l6ZSAvIDI7CisgICAgICAgIGFzcmMgKz0gYWxpbmVzaXplIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVucHJlbXVsdGlwbHkxNnl1dihjb25zdCB1aW50OF90ICptbXNyYywgY29uc3QgdWludDhfdCAqYWFzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbWxpbmVzaXplLCBwdHJkaWZmX3QgYWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYWxmLCBpbnQgbWF4LCBpbnQgb2Zmc2V0KQoreworICAgIGNvbnN0IHVpbnQxNl90ICptc3JjID0gKGNvbnN0IHVpbnQxNl90ICopbW1zcmM7CisgICAgY29uc3QgdWludDE2X3QgKmFzcmMgPSAoY29uc3QgdWludDE2X3QgKilhYXNyYzsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopZGRzdDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaWYgKGFzcmNbeF0gPiAwICYmIGFzcmNbeF0gPCBtYXgpCisgICAgICAgICAgICAgICAgZHN0W3hdID0gRkZNQVgoRkZNSU4oKG1zcmNbeF0gLSBoYWxmKSAqIG1heCAvIGFzcmNbeF0sIGhhbGYgLSAxKSwgLWhhbGYpICsgaGFsZjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBtc3JjW3hdOworICAgICAgICB9CisKKyAgICAgICAgZHN0ICArPSBkbGluZXNpemUgLyAyOworICAgICAgICBtc3JjICs9IG1saW5lc2l6ZSAvIDI7CisgICAgICAgIGFzcmMgKz0gYWxpbmVzaXplIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHVucHJlbXVsdGlwbHkxNm9mZnNldChjb25zdCB1aW50OF90ICptbXNyYywgY29uc3QgdWludDhfdCAqYWFzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbWxpbmVzaXplLCBwdHJkaWZmX3QgYWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYWxmLCBpbnQgbWF4LCBpbnQgb2Zmc2V0KQoreworICAgIGNvbnN0IHVpbnQxNl90ICptc3JjID0gKGNvbnN0IHVpbnQxNl90ICopbW1zcmM7CisgICAgY29uc3QgdWludDE2X3QgKmFzcmMgPSAoY29uc3QgdWludDE2X3QgKilhYXNyYzsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopZGRzdDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaWYgKGFzcmNbeF0gPiAwICYmIGFzcmNbeF0gPCBtYXgpCisgICAgICAgICAgICAgICAgZHN0W3hdID0gRkZNQVgoRkZNSU4oRkZNQVgobXNyY1t4XSAtIG9mZnNldCwgMCkgKiAodW5zaWduZWQpbWF4IC8gYXNyY1t4XSArIG9mZnNldCwgbWF4KSwgMCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZHN0W3hdID0gbXNyY1t4XTsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCAgKz0gZGxpbmVzaXplIC8gMjsKKyAgICAgICAgbXNyYyArPSBtbGluZXNpemUgLyAyOworICAgICAgICBhc3JjICs9IGFsaW5lc2l6ZSAvIDI7CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKipvdXQsIEFWRnJhbWUgKmJhc2UsIEFWRnJhbWUgKmFscGhhKQoreworICAgIFByZU11bHRpcGx5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisKKyAgICBpZiAoY3R4LT5pc19kaXNhYmxlZCkgeworICAgICAgICAqb3V0ID0gYXZfZnJhbWVfY2xvbmUoYmFzZSk7CisgICAgICAgIGlmICghKm91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IHAsIGZ1bGwsIGxpbWl0ZWQ7CisKKyAgICAgICAgKm91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghKm91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMoKm91dCwgYmFzZSk7CisKKyAgICAgICAgZnVsbCA9IGJhc2UtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIGxpbWl0ZWQgPSBiYXNlLT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9NUEVHOworCisgICAgICAgIGlmIChzLT5pbnZlcnNlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG91dGxpbmstPmZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA6CisgICAgICAgICAgICAgICAgcy0+cHJlbXVsdGlwbHlbMF0gPSBmdWxsID8gdW5wcmVtdWx0aXBseTggOiB1bnByZW11bHRpcGx5OG9mZnNldDsKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVsxXSA9IHMtPnByZW11bHRpcGx5WzJdID0gdW5wcmVtdWx0aXBseTh5dXY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWSjQ0NFA6CisgICAgICAgICAgICAgICAgcy0+cHJlbXVsdGlwbHlbMF0gPSB1bnByZW11bHRpcGx5ODsKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVsxXSA9IHMtPnByZW11bHRpcGx5WzJdID0gdW5wcmVtdWx0aXBseTh5dXY7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDoKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVswXSA9IHMtPnByZW11bHRpcGx5WzFdID0gcy0+cHJlbXVsdGlwbHlbMl0gPSBsaW1pdGVkID8gdW5wcmVtdWx0aXBseThvZmZzZXQgOiB1bnByZW11bHRpcGx5ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOToKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDk6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwOgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTA6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyOgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNDoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTY6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNjoKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVswXSA9IGZ1bGwgPyB1bnByZW11bHRpcGx5MTYgOiB1bnByZW11bHRpcGx5MTZvZmZzZXQ7CisgICAgICAgICAgICAgICAgcy0+cHJlbXVsdGlwbHlbMV0gPSBzLT5wcmVtdWx0aXBseVsyXSA9IHVucHJlbXVsdGlwbHkxNnl1djsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOToKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTA6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxMDoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTI6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxMjoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTQ6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE2OgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTY6CisgICAgICAgICAgICAgICAgcy0+cHJlbXVsdGlwbHlbMF0gPSBzLT5wcmVtdWx0aXBseVsxXSA9IHMtPnByZW11bHRpcGx5WzJdID0gbGltaXRlZCA/IHVucHJlbXVsdGlwbHkxNm9mZnNldCA6IHVucHJlbXVsdGlwbHkxNjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVswXSA9IGxpbWl0ZWQgPyB1bnByZW11bHRpcGx5OG9mZnNldCA6IHVucHJlbXVsdGlwbHk4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk5OgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxMDoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTI6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgorICAgICAgICAgICAgICAgIHMtPnByZW11bHRpcGx5WzBdID0gbGltaXRlZCA/IHVucHJlbXVsdGlwbHkxNm9mZnNldCA6IHVucHJlbXVsdGlwbHkxNjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAob3V0bGluay0+Zm9ybWF0KSB7CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDoKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVswXSA9IGZ1bGwgPyBwcmVtdWx0aXBseTggOiBwcmVtdWx0aXBseThvZmZzZXQ7CisgICAgICAgICAgICAgICAgcy0+cHJlbXVsdGlwbHlbMV0gPSBzLT5wcmVtdWx0aXBseVsyXSA9IHByZW11bHRpcGx5OHl1djsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZKNDQ0UDoKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVswXSA9IHByZW11bHRpcGx5ODsKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVsxXSA9IHMtPnByZW11bHRpcGx5WzJdID0gcHJlbXVsdGlwbHk4eXV2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CisgICAgICAgICAgICAgICAgcy0+cHJlbXVsdGlwbHlbMF0gPSBzLT5wcmVtdWx0aXBseVsxXSA9IHMtPnByZW11bHRpcGx5WzJdID0gbGltaXRlZCA/IHByZW11bHRpcGx5OG9mZnNldCA6IHByZW11bHRpcGx5ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOToKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDk6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwOgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTA6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyOgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNDoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTY6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNjoKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVswXSA9IGZ1bGwgPyBwcmVtdWx0aXBseTE2IDogcHJlbXVsdGlwbHkxNm9mZnNldDsKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVsxXSA9IHMtPnByZW11bHRpcGx5WzJdID0gcHJlbXVsdGlwbHkxNnl1djsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOToKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTA6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxMDoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTI6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxMjoKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTQ6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE2OgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTY6CisgICAgICAgICAgICAgICAgcy0+cHJlbXVsdGlwbHlbMF0gPSBzLT5wcmVtdWx0aXBseVsxXSA9IHMtPnByZW11bHRpcGx5WzJdID0gbGltaXRlZCA/IHByZW11bHRpcGx5MTZvZmZzZXQgOiBwcmVtdWx0aXBseTE2OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICAgICAgICAgIHMtPnByZW11bHRpcGx5WzBdID0gbGltaXRlZCA/IHByZW11bHRpcGx5OG9mZnNldCA6IHByZW11bHRpcGx5ODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZOToKKyAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTA6CisgICAgICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTEyOgorICAgICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNjoKKyAgICAgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVswXSA9IGxpbWl0ZWQgPyBwcmVtdWx0aXBseTE2b2Zmc2V0IDogcHJlbXVsdGlwbHkxNjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAocCA9IDA7IHAgPCBzLT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICAgICAgaWYgKCEoKDEgPDwgcCkgJiBzLT5wbGFuZXMpIHx8IHAgPT0gMykgeworICAgICAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoKCpvdXQpLT5kYXRhW3BdLCAoKm91dCktPmxpbmVzaXplW3BdLCBiYXNlLT5kYXRhW3BdLCBiYXNlLT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplW3BdLCBzLT5oZWlnaHRbcF0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzLT5wcmVtdWx0aXBseVtwXShiYXNlLT5kYXRhW3BdLCBzLT5pbnBsYWNlID8gYWxwaGEtPmRhdGFbM10gOiBhbHBoYS0+ZGF0YVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqb3V0KS0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmxpbmVzaXplW3BdLCBzLT5pbnBsYWNlID8gYWxwaGEtPmxpbmVzaXplWzNdIDogYWxwaGEtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpvdXQpLT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoW3BdLCBzLT5oZWlnaHRbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5oYWxmLCBzLT5pbnZlcnNlID8gcy0+bWF4IDogcy0+ZGVwdGgsIHMtPm9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2ZyYW1lKEZGRnJhbWVTeW5jICpmcykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGZzLT5wYXJlbnQ7CisgICAgUHJlTXVsdGlwbHlDb250ZXh0ICpzID0gZnMtPm9wYXF1ZTsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0ID0gTlVMTCwgKmJhc2UsICphbHBoYTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMCwgJmJhc2UsICAwKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMSwgJmFscGhhLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKChyZXQgPSBmaWx0ZXJfZnJhbWUoY3R4LCAmb3V0LCBiYXNlLCBhbHBoYSkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKGJhc2UtPnB0cywgcy0+ZnMudGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFByZU11bHRpcGx5Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBpbnQgdnN1YiwgaHN1YiwgcmV0OworCisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhzLT5saW5lc2l6ZSwgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIHMtPmhlaWdodFsxXSA9IHMtPmhlaWdodFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgdnN1Yik7CisgICAgcy0+aGVpZ2h0WzBdID0gcy0+aGVpZ2h0WzNdID0gaW5saW5rLT5oOworICAgIHMtPndpZHRoWzFdICA9IHMtPndpZHRoWzJdICA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgaHN1Yik7CisgICAgcy0+d2lkdGhbMF0gID0gcy0+d2lkdGhbM10gID0gaW5saW5rLT53OworCisgICAgcy0+ZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOworICAgIHMtPm1heCA9ICgxIDw8IHMtPmRlcHRoKSAtIDE7CisgICAgcy0+aGFsZiA9ICgxIDw8IHMtPmRlcHRoKSAvIDI7CisgICAgcy0+b2Zmc2V0ID0gMTYgPDwgKHMtPmRlcHRoIC0gOCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBQcmVNdWx0aXBseUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpiYXNlID0gY3R4LT5pbnB1dHNbMF07CisgICAgQVZGaWx0ZXJMaW5rICphbHBoYTsKKyAgICBGRkZyYW1lU3luY0luICppbjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFzLT5pbnBsYWNlKSB7CisgICAgICAgIGFscGhhID0gY3R4LT5pbnB1dHNbMV07CisKKyAgICAgICAgaWYgKGJhc2UtPmZvcm1hdCAhPSBhbHBoYS0+Zm9ybWF0KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbnB1dHMgbXVzdCBiZSBvZiBzYW1lIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGlmIChiYXNlLT53ICAgICAgICAgICAgICAgICAgICAgICAhPSBhbHBoYS0+dyB8fAorICAgICAgICAgICAgYmFzZS0+aCAgICAgICAgICAgICAgICAgICAgICAgIT0gYWxwaGEtPmgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZpcnN0IGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAiCisgICAgICAgICAgICAgICAgICAgIihzaXplICVkeCVkKSBkbyBub3QgbWF0Y2ggdGhlIGNvcnJlc3BvbmRpbmcgIgorICAgICAgICAgICAgICAgICAgICJzZWNvbmQgaW5wdXQgbGluayAlcyBwYXJhbWV0ZXJzICglZHglZCkgIiwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbMF0ubmFtZSwgYmFzZS0+dywgYmFzZS0+aCwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbMV0ubmFtZSwgYWxwaGEtPncsIGFscGhhLT5oKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvdXRsaW5rLT53ID0gYmFzZS0+dzsKKyAgICBvdXRsaW5rLT5oID0gYmFzZS0+aDsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBiYXNlLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGJhc2UtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGJhc2UtPmZyYW1lX3JhdGU7CisKKyAgICBpZiAocy0+aW5wbGFjZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19pbml0KCZzLT5mcywgY3R4LCAyKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW4gPSBzLT5mcy5pbjsKKyAgICBpblswXS50aW1lX2Jhc2UgPSBiYXNlLT50aW1lX2Jhc2U7CisgICAgaW5bMV0udGltZV9iYXNlID0gYWxwaGEtPnRpbWVfYmFzZTsKKyAgICBpblswXS5zeW5jICAgPSAxOworICAgIGluWzBdLmJlZm9yZSA9IEVYVF9TVE9QOworICAgIGluWzBdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBpblsxXS5zeW5jICAgPSAxOworICAgIGluWzFdLmJlZm9yZSA9IEVYVF9TVE9QOworICAgIGluWzFdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBzLT5mcy5vcGFxdWUgICA9IHM7CisgICAgcy0+ZnMub25fZXZlbnQgPSBwcm9jZXNzX2ZyYW1lOworCisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKTsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBQcmVNdWx0aXBseUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+aW5wbGFjZSkgeworICAgICAgICBBVkZyYW1lICpmcmFtZSA9IE5VTEw7CisgICAgICAgIEFWRnJhbWUgKm91dCA9IE5VTEw7CisgICAgICAgIGludCByZXQsIHN0YXR1czsKKyAgICAgICAgaW50NjRfdCBwdHM7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9pbmxpbmtfY29uc3VtZV9mcmFtZShjdHgtPmlucHV0c1swXSwgJmZyYW1lKSkgPiAwKSB7CisgICAgICAgICAgICByZXQgPSBmaWx0ZXJfZnJhbWUoY3R4LCAmb3V0LCBmcmFtZSwgZnJhbWUpOworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoZmZfaW5saW5rX2Fja25vd2xlZGdlX3N0YXR1cyhjdHgtPmlucHV0c1swXSwgJnN0YXR1cywgJnB0cykpIHsKKyAgICAgICAgICAgIGZmX291dGxpbmtfc2V0X3N0YXR1cyhjdHgtPm91dHB1dHNbMF0sIHN0YXR1cywgcHRzKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGZmX291dGxpbmtfZnJhbWVfd2FudGVkKGN0eC0+b3V0cHV0c1swXSkpCisgICAgICAgICAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7CisgICAgfQorfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBQcmVNdWx0aXBseUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJQYWQgcGFkID0geyAwIH07CisgICAgaW50IHJldDsKKworICAgIGlmICghc3RyY21wKGN0eC0+ZmlsdGVyLT5uYW1lLCAidW5wcmVtdWx0aXBseSIpKQorICAgICAgICBzLT5pbnZlcnNlID0gMTsKKworICAgIHBhZC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgcGFkLm5hbWUgICAgICAgICA9IGF2X3N0cmR1cCgibWFpbiIpOworICAgIHBhZC5jb25maWdfcHJvcHMgPSBjb25maWdfaW5wdXQ7CisgICAgaWYgKCFwYWQubmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X2lucGFkKGN0eCwgMCwgJnBhZCkpIDwgMCkgeworICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghcy0+aW5wbGFjZSkgeworICAgICAgICBwYWQudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBwYWQubmFtZSAgICAgICAgID0gYXZfc3RyZHVwKCJhbHBoYSIpOworICAgICAgICBwYWQuY29uZmlnX3Byb3BzID0gTlVMTDsKKyAgICAgICAgaWYgKCFwYWQubmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgaWYgKChyZXQgPSBmZl9pbnNlcnRfaW5wYWQoY3R4LCAxLCAmcGFkKSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBQcmVNdWx0aXBseUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoIXMtPmlucGxhY2UpCisgICAgICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHByZW11bHRpcGx5X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKyNpZiBDT05GSUdfUFJFTVVMVElQTFlfRklMVEVSCisKK0FWRmlsdGVyIGZmX3ZmX3ByZW11bHRpcGx5ID0geworICAgIC5uYW1lICAgICAgICAgID0gInByZW11bHRpcGx5IiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQcmVNdWx0aXBseSBmaXJzdCBzdHJlYW0gd2l0aCBmaXJzdCBwbGFuZSBvZiBzZWNvbmQgc3RyZWFtLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFByZU11bHRpcGx5Q29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAorICAgIC5pbnB1dHMgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICA9IHByZW11bHRpcGx5X291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmcHJlbXVsdGlwbHlfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfSU5URVJOQUwgfAorICAgICAgICAgICAgICAgICAgICAgQVZGSUxURVJfRkxBR19EWU5BTUlDX0lOUFVUUywKK307CisKKyNlbmRpZiAvKiBDT05GSUdfUFJFTVVMVElQTFlfRklMVEVSICovCisKKyNpZiBDT05GSUdfVU5QUkVNVUxUSVBMWV9GSUxURVIKKworI2RlZmluZSB1bnByZW11bHRpcGx5X29wdGlvbnMgb3B0aW9ucworQVZGSUxURVJfREVGSU5FX0NMQVNTKHVucHJlbXVsdGlwbHkpOworCitBVkZpbHRlciBmZl92Zl91bnByZW11bHRpcGx5ID0geworICAgIC5uYW1lICAgICAgICAgID0gInVucHJlbXVsdGlwbHkiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlVuUHJlTXVsdGlwbHkgZmlyc3Qgc3RyZWFtIHdpdGggZmlyc3QgcGxhbmUgb2Ygc2Vjb25kIHN0cmVhbS4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihQcmVNdWx0aXBseUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmFjdGl2YXRlICAgICAgPSBhY3RpdmF0ZSwKKyAgICAuaW5wdXRzICAgICAgICA9IE5VTEwsCisgICAgLm91dHB1dHMgICAgICAgPSBwcmVtdWx0aXBseV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnVucHJlbXVsdGlwbHlfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfSU5URVJOQUwgfAorICAgICAgICAgICAgICAgICAgICAgQVZGSUxURVJfRkxBR19EWU5BTUlDX0lOUFVUUywKK307CisKKyNlbmRpZiAvKiBDT05GSUdfVU5QUkVNVUxUSVBMWV9GSUxURVIgKi8KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3Byb2NhbXBfdmFhcGkuYyBiL2xpYmF2ZmlsdGVyL3ZmX3Byb2NhbXBfdmFhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGVjY2JlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfcHJvY2FtcF92YWFwaS5jCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZhYXBpX3ZwcC5oIgorCisvLyBQcm9jQW1wIE1pbi9NYXgvRGVmYXVsdCBWYWx1ZXMKKyNkZWZpbmUgQlJJR0hUTkVTU19NSU4gICAgIC0xMDAuMEYKKyNkZWZpbmUgQlJJR0hUTkVTU19NQVggICAgICAxMDAuMEYKKyNkZWZpbmUgQlJJR0hUTkVTU19ERUZBVUxUICAgIDAuMEYKKworI2RlZmluZSBDT05UUkFTVF9NSU4gICAgICAgICAgMC4wRgorI2RlZmluZSBDT05UUkFTVF9NQVggICAgICAgICAxMC4wRgorI2RlZmluZSBDT05UUkFTVF9ERUZBVUxUICAgICAgMS4wRgorCisjZGVmaW5lIEhVRV9NSU4gICAgICAgICAgICAtMTgwLjBGCisjZGVmaW5lIEhVRV9NQVggICAgICAgICAgICAgMTgwLjBGCisjZGVmaW5lIEhVRV9ERUZBVUxUICAgICAgICAgICAwLjBGCisKKyNkZWZpbmUgU0FUVVJBVElPTl9NSU4gICAgICAgIDAuMEYKKyNkZWZpbmUgU0FUVVJBVElPTl9NQVggICAgICAgMTAuMEYKKyNkZWZpbmUgU0FUVVJBVElPTl9ERUZBVUxUICAgIDEuMEYKKwordHlwZWRlZiBzdHJ1Y3QgUHJvY2FtcFZBQVBJQ29udGV4dCB7CisgICAgVkFBUElWUFBDb250ZXh0IHZwcF9jdHg7IC8vIG11c3QgYmUgdGhlIGZpcnN0IGZpZWxkCisKKyAgICBmbG9hdCBicmlnaHQ7CisgICAgZmxvYXQgaHVlOworICAgIGZsb2F0IHNhdHVyYXRpb247CisgICAgZmxvYXQgY29udHJhc3Q7Cit9IFByb2NhbXBWQUFQSUNvbnRleHQ7CisKK3N0YXRpYyBmbG9hdCBtYXAoZmxvYXQgeCwgZmxvYXQgaW5fbWluLCBmbG9hdCBpbl9tYXgsIGZsb2F0IG91dF9taW4sIGZsb2F0IG91dF9tYXgpCit7CisgICAgZG91YmxlIHNsb3BlLCBvdXRwdXQ7CisKKyAgICBzbG9wZSA9IDEuMCAqIChvdXRfbWF4IC0gb3V0X21pbikgLyAoaW5fbWF4IC0gaW5fbWluKTsKKyAgICBvdXRwdXQgPSBvdXRfbWluICsgc2xvcGUgKiAoeCAtIGluX21pbik7CisKKyAgICByZXR1cm4gKGZsb2F0KW91dHB1dDsKK30KKworc3RhdGljIGludCBwcm9jYW1wX3ZhYXBpX2J1aWxkX2ZpbHRlcl9wYXJhbXMoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBWQUFQSVZQUENvbnRleHQgKnZwcF9jdHggPSBhdmN0eC0+cHJpdjsKKyAgICBQcm9jYW1wVkFBUElDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgVkFQcm9jRmlsdGVyUGFyYW1ldGVyQnVmZmVyQ29sb3JCYWxhbmNlIHByb2NhbXBfcGFyYW1zWzRdOworICAgIFZBUHJvY0ZpbHRlckNhcENvbG9yQmFsYW5jZSBwcm9jYW1wX2NhcHNbVkFQcm9jQ29sb3JCYWxhbmNlQ291bnRdOworICAgIGludCBudW1fY2FwczsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBtZW1zZXQoJnByb2NhbXBfcGFyYW1zLCAwLCBzaXplb2YocHJvY2FtcF9wYXJhbXMpKTsKKyAgICBtZW1zZXQoJnByb2NhbXBfY2FwcywgMCwgc2l6ZW9mKHByb2NhbXBfY2FwcykpOworCisgICAgbnVtX2NhcHMgPSBWQVByb2NDb2xvckJhbGFuY2VDb3VudDsKKyAgICB2YXMgPSB2YVF1ZXJ5VmlkZW9Qcm9jRmlsdGVyQ2Fwcyh2cHBfY3R4LT5od2N0eC0+ZGlzcGxheSwgdnBwX2N0eC0+dmFfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVByb2NGaWx0ZXJDb2xvckJhbGFuY2UsICZwcm9jYW1wX2NhcHMsICZudW1fY2Fwcyk7CisKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IHByb2NhbXAgIgorICAgICAgICAgICAgICAgImZpbHRlciBjYXBzOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIC8qIGJyaWdodG5lc3MgKi8KKyAgICBwcm9jYW1wX3BhcmFtc1tpXS50eXBlICAgPSBWQVByb2NGaWx0ZXJDb2xvckJhbGFuY2U7CisgICAgcHJvY2FtcF9wYXJhbXNbaV0uYXR0cmliID0gVkFQcm9jQ29sb3JCYWxhbmNlQnJpZ2h0bmVzczsKKyAgICBwcm9jYW1wX3BhcmFtc1tpXS52YWx1ZSAgPSBtYXAoY3R4LT5icmlnaHQsIEJSSUdIVE5FU1NfTUlOLCBCUklHSFRORVNTX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2FtcF9jYXBzW1ZBUHJvY0NvbG9yQmFsYW5jZUJyaWdodG5lc3MtMV0ucmFuZ2UubWluX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jYW1wX2NhcHNbVkFQcm9jQ29sb3JCYWxhbmNlQnJpZ2h0bmVzcy0xXS5yYW5nZS5tYXhfdmFsdWUpOworICAgIGkrKzsKKworICAgIC8qIGNvbnRyYXN0ICovCisgICAgcHJvY2FtcF9wYXJhbXNbaV0udHlwZSAgID0gVkFQcm9jRmlsdGVyQ29sb3JCYWxhbmNlOworICAgIHByb2NhbXBfcGFyYW1zW2ldLmF0dHJpYiA9IFZBUHJvY0NvbG9yQmFsYW5jZUNvbnRyYXN0OworICAgIHByb2NhbXBfcGFyYW1zW2ldLnZhbHVlICA9IG1hcChjdHgtPmNvbnRyYXN0LCBDT05UUkFTVF9NSU4sIENPTlRSQVNUX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2FtcF9jYXBzW1ZBUHJvY0NvbG9yQmFsYW5jZUNvbnRyYXN0LTFdLnJhbmdlLm1pbl92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2FtcF9jYXBzW1ZBUHJvY0NvbG9yQmFsYW5jZUNvbnRyYXN0LTFdLnJhbmdlLm1heF92YWx1ZSk7CisgICAgaSsrOworCisgICAgLyogaHVlICovCisgICAgcHJvY2FtcF9wYXJhbXNbaV0udHlwZSAgID0gVkFQcm9jRmlsdGVyQ29sb3JCYWxhbmNlOworICAgIHByb2NhbXBfcGFyYW1zW2ldLmF0dHJpYiA9IFZBUHJvY0NvbG9yQmFsYW5jZUh1ZTsKKyAgICBwcm9jYW1wX3BhcmFtc1tpXS52YWx1ZSAgPSBtYXAoY3R4LT5odWUsIEhVRV9NSU4sIEhVRV9NQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NhbXBfY2Fwc1tWQVByb2NDb2xvckJhbGFuY2VIdWUtMV0ucmFuZ2UubWluX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jYW1wX2NhcHNbVkFQcm9jQ29sb3JCYWxhbmNlSHVlLTFdLnJhbmdlLm1heF92YWx1ZSk7CisgICAgaSsrOworCisgICAgLyogc2F0dXJhdGlvbiAqLworICAgIHByb2NhbXBfcGFyYW1zW2ldLnR5cGUgICA9IFZBUHJvY0ZpbHRlckNvbG9yQmFsYW5jZTsKKyAgICBwcm9jYW1wX3BhcmFtc1tpXS5hdHRyaWIgPSBWQVByb2NDb2xvckJhbGFuY2VTYXR1cmF0aW9uOworICAgIHByb2NhbXBfcGFyYW1zW2ldLnZhbHVlICA9IG1hcChjdHgtPnNhdHVyYXRpb24sIFNBVFVSQVRJT05fTUlOLCBTQVRVUkFUSU9OX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2FtcF9jYXBzW1ZBUHJvY0NvbG9yQmFsYW5jZVNhdHVyYXRpb24tMV0ucmFuZ2UubWluX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jYW1wX2NhcHNbVkFQcm9jQ29sb3JCYWxhbmNlU2F0dXJhdGlvbi0xXS5yYW5nZS5tYXhfdmFsdWUpOworICAgIGkrKzsKKworICAgIHJldHVybiBmZl92YWFwaV92cHBfbWFrZV9wYXJhbV9idWZmZXJzKGF2Y3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUHJvY0ZpbHRlclBhcmFtZXRlckJ1ZmZlclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByb2NhbXBfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwcm9jYW1wX3BhcmFtc1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2FtcF92YWFwaV9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucHV0X2ZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqYXZjdHggICA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayAgICA9IGF2Y3R4LT5vdXRwdXRzWzBdOworICAgIFZBQVBJVlBQQ29udGV4dCAqdnBwX2N0eCA9IGF2Y3R4LT5wcml2OworICAgIEFWRnJhbWUgKm91dHB1dF9mcmFtZSA9IE5VTEw7CisgICAgVkFTdXJmYWNlSUQgaW5wdXRfc3VyZmFjZSwgb3V0cHV0X3N1cmZhY2U7CisgICAgVkFQcm9jUGlwZWxpbmVQYXJhbWV0ZXJCdWZmZXIgcGFyYW1zOworICAgIFZBUmVjdGFuZ2xlIGlucHV0X3JlZ2lvbjsKKyAgICBpbnQgZXJyOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgaW5wdXQ6ICVzLCAldXgldSAoJSJQUklkNjQiKS5cbiIsCisgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoaW5wdXRfZnJhbWUtPmZvcm1hdCksCisgICAgICAgICAgIGlucHV0X2ZyYW1lLT53aWR0aCwgaW5wdXRfZnJhbWUtPmhlaWdodCwgaW5wdXRfZnJhbWUtPnB0cyk7CisKKyAgICBpZiAodnBwX2N0eC0+dmFfY29udGV4dCA9PSBWQV9JTlZBTElEX0lEKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgaW5wdXRfc3VyZmFjZSA9IChWQVN1cmZhY2VJRCkodWludHB0cl90KWlucHV0X2ZyYW1lLT5kYXRhWzNdOworICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0RFQlVHLCAiVXNpbmcgc3VyZmFjZSAlI3ggZm9yIHByb2NhbXAgaW5wdXQuXG4iLAorICAgICAgICAgICBpbnB1dF9zdXJmYWNlKTsKKworICAgIG91dHB1dF9mcmFtZSA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgdnBwX2N0eC0+b3V0cHV0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnBwX2N0eC0+b3V0cHV0X2hlaWdodCk7CisgICAgaWYgKCFvdXRwdXRfZnJhbWUpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb3V0cHV0X3N1cmZhY2UgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClvdXRwdXRfZnJhbWUtPmRhdGFbM107CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyBzdXJmYWNlICUjeCBmb3IgcHJvY2FtcCBvdXRwdXQuXG4iLAorICAgICAgICAgICBvdXRwdXRfc3VyZmFjZSk7CisgICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKyAgICBpbnB1dF9yZWdpb24gPSAoVkFSZWN0YW5nbGUpIHsKKyAgICAgICAgLnggICAgICA9IDAsCisgICAgICAgIC55ICAgICAgPSAwLAorICAgICAgICAud2lkdGggID0gaW5wdXRfZnJhbWUtPndpZHRoLAorICAgICAgICAuaGVpZ2h0ID0gaW5wdXRfZnJhbWUtPmhlaWdodCwKKyAgICB9OworCisgICAgcGFyYW1zLnN1cmZhY2UgPSBpbnB1dF9zdXJmYWNlOworICAgIHBhcmFtcy5zdXJmYWNlX3JlZ2lvbiA9ICZpbnB1dF9yZWdpb247CisgICAgcGFyYW1zLnN1cmZhY2VfY29sb3Jfc3RhbmRhcmQgPQorICAgICAgICBmZl92YWFwaV92cHBfY29sb3VyX3N0YW5kYXJkKGlucHV0X2ZyYW1lLT5jb2xvcnNwYWNlKTsKKworICAgIHBhcmFtcy5vdXRwdXRfcmVnaW9uID0gTlVMTDsKKyAgICBwYXJhbXMub3V0cHV0X2JhY2tncm91bmRfY29sb3IgPSAweGZmMDAwMDAwOworICAgIHBhcmFtcy5vdXRwdXRfY29sb3Jfc3RhbmRhcmQgPSBwYXJhbXMuc3VyZmFjZV9jb2xvcl9zdGFuZGFyZDsKKworICAgIHBhcmFtcy5waXBlbGluZV9mbGFncyA9IDA7CisgICAgcGFyYW1zLmZpbHRlcl9mbGFncyA9IFZBX0ZSQU1FX1BJQ1RVUkU7CisKKyAgICBwYXJhbXMuZmlsdGVycyAgICAgPSAmdnBwX2N0eC0+ZmlsdGVyX2J1ZmZlcnNbMF07CisgICAgcGFyYW1zLm51bV9maWx0ZXJzID0gMTsKKworICAgIGVyciA9IGZmX3ZhYXBpX3ZwcF9yZW5kZXJfcGljdHVyZShhdmN0eCwgJnBhcmFtcywgb3V0cHV0X3N1cmZhY2UpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHB1dF9mcmFtZSwgaW5wdXRfZnJhbWUpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYXZfZnJhbWVfZnJlZSgmaW5wdXRfZnJhbWUpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgb3V0cHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dHB1dF9mcmFtZS0+Zm9ybWF0KSwKKyAgICAgICAgICAgb3V0cHV0X2ZyYW1lLT53aWR0aCwgb3V0cHV0X2ZyYW1lLT5oZWlnaHQsIG91dHB1dF9mcmFtZS0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cHV0X2ZyYW1lKTsKKworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dF9mcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmb3V0cHV0X2ZyYW1lKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgcHJvY2FtcF92YWFwaV9pbml0KEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgVkFBUElWUFBDb250ZXh0ICp2cHBfY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBmZl92YWFwaV92cHBfY3R4X2luaXQoYXZjdHgpOworICAgIHZwcF9jdHgtPnBpcGVsaW5lX3VuaW5pdCAgICAgPSBmZl92YWFwaV92cHBfcGlwZWxpbmVfdW5pbml0OworICAgIHZwcF9jdHgtPmJ1aWxkX2ZpbHRlcl9wYXJhbXMgPSBwcm9jYW1wX3ZhYXBpX2J1aWxkX2ZpbHRlcl9wYXJhbXM7CisgICAgdnBwX2N0eC0+b3V0cHV0X2Zvcm1hdCAgICAgICA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihQcm9jYW1wVkFBUElDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0gfCBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0pCitzdGF0aWMgY29uc3QgQVZPcHRpb24gcHJvY2FtcF92YWFwaV9vcHRpb25zW10gPSB7CisgICAgeyAiYiIsICJPdXRwdXQgdmlkZW8gYnJpZ2h0bmVzcyIsCisgICAgICBPRkZTRVQoYnJpZ2h0KSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSBCUklHSFRORVNTX0RFRkFVTFQgfSwgQlJJR0hUTkVTU19NSU4sIEJSSUdIVE5FU1NfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImJyaWdodG5lc3MiLCAiT3V0cHV0IHZpZGVvIGJyaWdodG5lc3MiLAorICAgICAgT0ZGU0VUKGJyaWdodCksICBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gQlJJR0hUTkVTU19ERUZBVUxUIH0sIEJSSUdIVE5FU1NfTUlOLCBCUklHSFRORVNTX01BWCwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJzIiwgIk91dHB1dCB2aWRlbyBzYXR1cmF0aW9uIiwKKyAgICAgIE9GRlNFVChzYXR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IFNBVFVSQVRJT05fREVGQVVMVCB9LCBTQVRVUkFUSU9OX01JTiwgU0FUVVJBVElPTl9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAic2F0dXJhdGlvIiwgIk91dHB1dCB2aWRlbyBzYXR1cmF0aW9uIiwKKyAgICAgIE9GRlNFVChzYXR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IFNBVFVSQVRJT05fREVGQVVMVCB9LCBTQVRVUkFUSU9OX01JTiwgU0FUVVJBVElPTl9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYyIsICJPdXRwdXQgdmlkZW8gY29udHJhc3QiLAorICAgICAgT0ZGU0VUKGNvbnRyYXN0KSwgIEFWX09QVF9UWVBFX0ZMT0FULCB7IC5kYmwgPSBDT05UUkFTVF9ERUZBVUxUIH0sIENPTlRSQVNUX01JTiwgQ09OVFJBU1RfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImNvbnRyYXN0IiwgIk91dHB1dCB2aWRlbyBjb250cmFzdCIsCisgICAgICBPRkZTRVQoY29udHJhc3QpLCAgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IENPTlRSQVNUX0RFRkFVTFQgfSwgQ09OVFJBU1RfTUlOLCBDT05UUkFTVF9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiaCIsICJPdXRwdXQgdmlkZW8gaHVlIiwKKyAgICAgIE9GRlNFVChodWUpLCBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gSFVFX0RFRkFVTFQgfSwgSFVFX01JTiwgSFVFX01BWCwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJodWUiLCAiT3V0cHV0IHZpZGVvIGh1ZSIsCisgICAgICBPRkZTRVQoaHVlKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IEhVRV9ERUZBVUxUIH0sIEhVRV9NSU4sIEhVRV9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MocHJvY2FtcF92YWFwaSk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBwcm9jYW1wX3ZhYXBpX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9ICZwcm9jYW1wX3ZhYXBpX2ZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9ICZmZl92YWFwaV92cHBfY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBwcm9jYW1wX3ZhYXBpX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9ICZmZl92YWFwaV92cHBfY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9wcm9jYW1wX3ZhYXBpID0geworICAgIC5uYW1lICAgICAgICAgID0gInByb2NhbXBfdmFhcGkiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlByb2NBbXAgKGNvbG9yIGJhbGFuY2UpIGFkanVzdG1lbnRzIGZvciBodWUsIHNhdHVyYXRpb24sIGJyaWdodG5lc3MsIGNvbnRyYXN0IiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoUHJvY2FtcFZBQVBJQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSAmcHJvY2FtcF92YWFwaV9pbml0LAorICAgIC51bmluaXQgICAgICAgID0gJmZmX3ZhYXBpX3ZwcF9jdHhfdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gJmZmX3ZhYXBpX3ZwcF9xdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gcHJvY2FtcF92YWFwaV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSBwcm9jYW1wX3ZhYXBpX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmcHJvY2FtcF92YWFwaV9jbGFzcywKKyAgICAuZmxhZ3NfaW50ZXJuYWwgPSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3Byb2dyYW1fb3BlbmNsLmMgYi9saWJhdmZpbHRlci92Zl9wcm9ncmFtX29wZW5jbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDI3OTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9wcm9ncmFtX29wZW5jbC5jCkBAIC0wLDAgKzEsNDQwIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9wZW5jbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IFByb2dyYW1PcGVuQ0xDb250ZXh0IHsKKyAgICBPcGVuQ0xGaWx0ZXJDb250ZXh0IG9jZjsKKworICAgIGludCAgICAgICAgICAgICAgICAgbG9hZGVkOworICAgIGNsX3VpbnQgICAgICAgICAgICAgaW5kZXg7CisgICAgY2xfa2VybmVsICAgICAgICAgICBrZXJuZWw7CisgICAgY2xfY29tbWFuZF9xdWV1ZSAgICBjb21tYW5kX3F1ZXVlOworCisgICAgRkZGcmFtZVN5bmMgICAgICAgICBmczsKKyAgICBBVkZyYW1lICAgICAgICAgICAqKmZyYW1lczsKKworICAgIGNvbnN0IGNoYXIgICAgICAgICAqc291cmNlX2ZpbGU7CisgICAgY29uc3QgY2hhciAgICAgICAgICprZXJuZWxfbmFtZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5iX2lucHV0czsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICBzb3VyY2VfZm9ybWF0OworICAgIEFWUmF0aW9uYWwgICAgICAgICAgc291cmNlX3JhdGU7Cit9IFByb2dyYW1PcGVuQ0xDb250ZXh0OworCitzdGF0aWMgaW50IHByb2dyYW1fb3BlbmNsX2xvYWQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQcm9ncmFtT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgY2xfaW50IGNsZTsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gZmZfb3BlbmNsX2ZpbHRlcl9sb2FkX3Byb2dyYW1fZnJvbV9maWxlKGF2Y3R4LCBjdHgtPnNvdXJjZV9maWxlKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGN0eC0+Y29tbWFuZF9xdWV1ZSA9IGNsQ3JlYXRlQ29tbWFuZFF1ZXVlKGN0eC0+b2NmLmh3Y3R4LT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2NmLmh3Y3R4LT5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmNsZSk7CisgICAgaWYgKCFjdHgtPmNvbW1hbmRfcXVldWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIE9wZW5DTCAiCisgICAgICAgICAgICAgICAiY29tbWFuZCBxdWV1ZTogJWQuXG4iLCBjbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGN0eC0+a2VybmVsID0gY2xDcmVhdGVLZXJuZWwoY3R4LT5vY2YucHJvZ3JhbSwgY3R4LT5rZXJuZWxfbmFtZSwgJmNsZSk7CisgICAgaWYgKCFjdHgtPmtlcm5lbCkgeworICAgICAgICBpZiAoY2xlID09IENMX0lOVkFMSURfS0VSTkVMX05BTUUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiS2VybmVsIGZ1bmN0aW9uICclcycgbm90IGZvdW5kIGluICIKKyAgICAgICAgICAgICAgICAgICAicHJvZ3JhbS5cbiIsIGN0eC0+a2VybmVsX25hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGtlcm5lbDogJWQuXG4iLCBjbGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgY3R4LT5sb2FkZWQgPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2dyYW1fb3BlbmNsX3J1bihBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIEFWRmlsdGVyTGluayAgICAgKm91dGxpbmsgPSBhdmN0eC0+b3V0cHV0c1swXTsKKyAgICBQcm9ncmFtT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0cHV0ID0gTlVMTDsKKyAgICBjbF9pbnQgY2xlOworICAgIHNpemVfdCBnbG9iYWxfd29ya1syXTsKKyAgICBjbF9tZW0gc3JjLCBkc3Q7CisgICAgaW50IGVyciwgaW5wdXQsIHBsYW5lOworCisgICAgaWYgKCFjdHgtPmxvYWRlZCkgeworICAgICAgICBlcnIgPSBwcm9ncmFtX29wZW5jbF9sb2FkKGF2Y3R4KTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIG91dHB1dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXRwdXQpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgRkZfQVJSQVlfRUxFTVMob3V0cHV0LT5kYXRhKTsgcGxhbmUrKykgeworICAgICAgICBkc3QgPSAoY2xfbWVtKW91dHB1dC0+ZGF0YVtwbGFuZV07CisgICAgICAgIGlmICghZHN0KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWwsIDAsIHNpemVvZihjbF9tZW0pLCAmZHN0KTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQga2VybmVsICIKKyAgICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gaW1hZ2UgYXJndW1lbnQ6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwgMSwgc2l6ZW9mKGNsX3VpbnQpLCAmY3R4LT5pbmRleCk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgImluZGV4IGFyZ3VtZW50OiAlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlucHV0ID0gMDsgaW5wdXQgPCBjdHgtPm5iX2lucHV0czsgaW5wdXQrKykgeworICAgICAgICAgICAgYXZfYXNzZXJ0MChjdHgtPmZyYW1lc1tpbnB1dF0pOworCisgICAgICAgICAgICBzcmMgPSAoY2xfbWVtKWN0eC0+ZnJhbWVzW2lucHV0XS0+ZGF0YVtwbGFuZV07CisgICAgICAgICAgICBhdl9hc3NlcnQwKHNyYyk7CisKKyAgICAgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsLCAyICsgaW5wdXQsIHNpemVvZihjbF9tZW0pLCAmc3JjKTsKKyAgICAgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBrZXJuZWwgIgorICAgICAgICAgICAgICAgICAgICAgICAic291cmNlIGltYWdlIGFyZ3VtZW50ICVkOiAlZC5cbiIsIGlucHV0LCBjbGUpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBmZl9vcGVuY2xfZmlsdGVyX3dvcmtfc2l6ZV9mcm9tX2ltYWdlKGF2Y3R4LCBnbG9iYWxfd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIHBsYW5lLCAwKTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJSdW4ga2VybmVsIG9uIHBsYW5lICVkICIKKyAgICAgICAgICAgICAgICIoJXp1eCV6dSkuXG4iLCBwbGFuZSwgZ2xvYmFsX3dvcmtbMF0sIGdsb2JhbF93b3JrWzFdKTsKKworICAgICAgICBjbGUgPSBjbEVucXVldWVORFJhbmdlS2VybmVsKGN0eC0+Y29tbWFuZF9xdWV1ZSwgY3R4LT5rZXJuZWwsIDIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3dvcmssIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVucXVldWUga2VybmVsOiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgY2xlKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsZSA9IGNsRmluaXNoKGN0eC0+Y29tbWFuZF9xdWV1ZSk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmlzaCBjb21tYW5kIHF1ZXVlOiAlZC5cbiIsCisgICAgICAgICAgICAgICBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5uYl9pbnB1dHMgPiAwKSB7CisgICAgICAgIGVyciA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0cHV0LCBjdHgtPmZyYW1lc1swXSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dC0+cHRzID0gY3R4LT5pbmRleDsKKyAgICB9CisgICAgKytjdHgtPmluZGV4OworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiRmlsdGVyIG91dHB1dDogJXMsICV1eCV1ICglIlBSSWQ2NCIpLlxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShvdXRwdXQtPmZvcm1hdCksCisgICAgICAgICAgIG91dHB1dC0+d2lkdGgsIG91dHB1dC0+aGVpZ2h0LCBvdXRwdXQtPnB0cyk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHB1dCk7CisKK2ZhaWw6CisgICAgY2xGaW5pc2goY3R4LT5jb21tYW5kX3F1ZXVlKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXQpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ3JhbV9vcGVuY2xfcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICphdmN0eCA9IG91dGxpbmstPnNyYzsKKworICAgIHJldHVybiBwcm9ncmFtX29wZW5jbF9ydW4oYXZjdHgpOworfQorCitzdGF0aWMgaW50IHByb2dyYW1fb3BlbmNsX2ZpbHRlcihGRkZyYW1lU3luYyAqZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgICphdmN0eCA9IGZzLT5wYXJlbnQ7CisgICAgUHJvZ3JhbU9wZW5DTENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIGludCBlcnIsIGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICBlcnIgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZjdHgtPmZzLCBpLCAmY3R4LT5mcmFtZXNbaV0sIDApOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIHByb2dyYW1fb3BlbmNsX3J1bihhdmN0eCk7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ3JhbV9vcGVuY2xfYWN0aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQcm9ncmFtT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisKKyAgICBhdl9hc3NlcnQwKGN0eC0+bmJfaW5wdXRzID4gMCk7CisKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZjdHgtPmZzKTsKK30KKworc3RhdGljIGludCBwcm9ncmFtX29wZW5jbF9jb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgKmF2Y3R4ID0gb3V0bGluay0+c3JjOworICAgIFByb2dyYW1PcGVuQ0xDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBpbnQgZXJyOworCisgICAgZXJyID0gZmZfb3BlbmNsX2ZpbHRlcl9jb25maWdfb3V0cHV0KG91dGxpbmspOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgaWYgKGN0eC0+bmJfaW5wdXRzID4gMCkgeworICAgICAgICBGRkZyYW1lU3luY0luICppbjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZXJyID0gZmZfZnJhbWVzeW5jX2luaXQoJmN0eC0+ZnMsIGF2Y3R4LCBjdHgtPm5iX2lucHV0cyk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICBjdHgtPmZzLm9wYXF1ZSA9IGN0eDsKKyAgICAgICAgY3R4LT5mcy5vbl9ldmVudCA9ICZwcm9ncmFtX29wZW5jbF9maWx0ZXI7CisKKyAgICAgICAgaW4gPSBjdHgtPmZzLmluOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICAgICAgY29uc3QgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBhdmN0eC0+aW5wdXRzW2ldOworCisgICAgICAgICAgICBpbltpXS50aW1lX2Jhc2UgPSBpbmxpbmstPnRpbWVfYmFzZTsKKyAgICAgICAgICAgIGluW2ldLnN5bmMgICAgICA9IDE7CisgICAgICAgICAgICBpbltpXS5iZWZvcmUgICAgPSBFWFRfU1RPUDsKKyAgICAgICAgICAgIGluW2ldLmFmdGVyICAgICA9IEVYVF9JTkZJTklUWTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGZmX2ZyYW1lc3luY19jb25maWd1cmUoJmN0eC0+ZnMpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBhdl9pbnZfcShjdHgtPnNvdXJjZV9yYXRlKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHByb2dyYW1fb3BlbmNsX2luaXQoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBQcm9ncmFtT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgaW50IGVycjsKKworICAgIGZmX29wZW5jbF9maWx0ZXJfaW5pdChhdmN0eCk7CisKKyAgICBjdHgtPm9jZi5vdXRwdXRfd2lkdGggID0gY3R4LT53aWR0aDsKKyAgICBjdHgtPm9jZi5vdXRwdXRfaGVpZ2h0ID0gY3R4LT5oZWlnaHQ7CisKKyAgICBpZiAoIXN0cmNtcChhdmN0eC0+ZmlsdGVyLT5uYW1lLCAib3BlbmNsc3JjIikpIHsKKyAgICAgICAgaWYgKCFjdHgtPm9jZi5vdXRwdXRfd2lkdGggfHwgIWN0eC0+b2NmLm91dHB1dF9oZWlnaHQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiT3BlbkNMIHNvdXJjZSByZXF1aXJlcyBvdXRwdXQgIgorICAgICAgICAgICAgICAgICAgICJkaW1lbnNpb25zIHRvIGJlIHNwZWNpZmllZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGN0eC0+bmJfaW5wdXRzID0gMDsKKyAgICAgICAgY3R4LT5vY2Yub3V0cHV0X2Zvcm1hdCA9IGN0eC0+c291cmNlX2Zvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBjdHgtPmZyYW1lcyA9IGF2X21hbGxvY3pfYXJyYXkoY3R4LT5uYl9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmN0eC0+ZnJhbWVzKSk7CisgICAgICAgIGlmICghY3R4LT5mcmFtZXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgICAgICBBVkZpbHRlclBhZCBpbnB1dDsKKyAgICAgICAgICAgIG1lbXNldCgmaW5wdXQsIDAsIHNpemVvZihpbnB1dCkpOworCisgICAgICAgICAgICBpbnB1dC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgaW5wdXQubmFtZSA9IGF2X2FzcHJpbnRmKCJpbnB1dCVkIiwgaSk7CisgICAgICAgICAgICBpZiAoIWlucHV0Lm5hbWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgaW5wdXQuY29uZmlnX3Byb3BzID0gJmZmX29wZW5jbF9maWx0ZXJfY29uZmlnX2lucHV0OworCisgICAgICAgICAgICBlcnIgPSBmZl9pbnNlcnRfaW5wYWQoYXZjdHgsIGksICZpbnB1dCk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZpbnB1dC5uYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgcHJvZ3JhbV9vcGVuY2xfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgUHJvZ3JhbU9wZW5DTENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIGNsX2ludCBjbGU7CisgICAgaW50IGk7CisKKyAgICBpZiAoY3R4LT5uYl9pbnB1dHMgPiAwKSB7CisgICAgICAgIGZmX2ZyYW1lc3luY191bmluaXQoJmN0eC0+ZnMpOworCisgICAgICAgIGF2X2ZyZWVwKCZjdHgtPmZyYW1lcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmN0eC0+bmJfaW5wdXRzOyBpKyspCisgICAgICAgICAgICBhdl9mcmVlcCgmYXZjdHgtPmlucHV0X3BhZHNbaV0ubmFtZSk7CisgICAgfQorCisgICAgaWYgKGN0eC0+a2VybmVsKSB7CisgICAgICAgIGNsZSA9IGNsUmVsZWFzZUtlcm5lbChjdHgtPmtlcm5lbCk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2UgIgorICAgICAgICAgICAgICAgICAgICJrZXJuZWw6ICVkLlxuIiwgY2xlKTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5jb21tYW5kX3F1ZXVlKSB7CisgICAgICAgIGNsZSA9IGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShjdHgtPmNvbW1hbmRfcXVldWUpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlICIKKyAgICAgICAgICAgICAgICAgICAiY29tbWFuZCBxdWV1ZTogJWQuXG4iLCBjbGUpOworICAgIH0KKworICAgIGZmX29wZW5jbF9maWx0ZXJfdW5pbml0KGF2Y3R4KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUHJvZ3JhbU9wZW5DTENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSkKKworI2lmIENPTkZJR19QUk9HUkFNX09QRU5DTF9GSUxURVIKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHByb2dyYW1fb3BlbmNsX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzb3VyY2UiLCAiT3BlbkNMIHByb2dyYW0gc291cmNlIGZpbGUiLCBPRkZTRVQoc291cmNlX2ZpbGUpLAorICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAia2VybmVsIiwgIktlcm5lbCBuYW1lIGluIHByb2dyYW0iLCAgICAgT0ZGU0VUKGtlcm5lbF9uYW1lKSwKKyAgICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorCisgICAgeyAiaW5wdXRzIiwgIk51bWJlciBvZiBpbnB1dHMiLCBPRkZTRVQobmJfaW5wdXRzKSwKKyAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICAgICAgICAgIHsgLmk2NCA9IDEgfSwgMSwgSU5UX01BWCwgRkxBR1MgfSwKKworICAgIHsgInNpemUiLCAgICJWaWRlbyBzaXplIiwgICAgICAgT0ZGU0VUKHdpZHRoKSwKKyAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsICAgICAgIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJzIiwgICAgICAiVmlkZW8gc2l6ZSIsICAgICAgIE9GRlNFVCh3aWR0aCksCisgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCAgICAgICB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIEZMQUdTIH0sCisKKyAgICB7IE5VTEwgfSwKK307CisKK0ZSQU1FU1lOQ19ERUZJTkVfQ0xBU1MocHJvZ3JhbV9vcGVuY2wsIFByb2dyYW1PcGVuQ0xDb250ZXh0LCBmcyk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBwcm9ncmFtX29wZW5jbF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gJnByb2dyYW1fb3BlbmNsX2NvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfcHJvZ3JhbV9vcGVuY2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInByb2dyYW1fb3BlbmNsIiwKKyAgICAuZGVzY3JpcHRpb24gICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmlsdGVyIHZpZGVvIHVzaW5nIGFuIE9wZW5DTCBwcm9ncmFtIiksCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKFByb2dyYW1PcGVuQ0xDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmcHJvZ3JhbV9vcGVuY2xfY2xhc3MsCisgICAgLnByZWluaXQgICAgICAgID0gJnByb2dyYW1fb3BlbmNsX2ZyYW1lc3luY19wcmVpbml0LAorICAgIC5pbml0ICAgICAgICAgICA9ICZwcm9ncmFtX29wZW5jbF9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9ICZwcm9ncmFtX29wZW5jbF91bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gJmZmX29wZW5jbF9maWx0ZXJfcXVlcnlfZm9ybWF0cywKKyAgICAuYWN0aXZhdGUgICAgICAgPSAmcHJvZ3JhbV9vcGVuY2xfYWN0aXZhdGUsCisgICAgLmlucHV0cyAgICAgICAgID0gTlVMTCwKKyAgICAub3V0cHV0cyAgICAgICAgPSBwcm9ncmFtX29wZW5jbF9vdXRwdXRzLAorICAgIC5mbGFnc19pbnRlcm5hbCA9IEZGX0ZJTFRFUl9GTEFHX0hXRlJBTUVfQVdBUkUsCit9OworCisjZW5kaWYKKworI2lmIENPTkZJR19PUEVOQ0xTUkNfRklMVEVSCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcGVuY2xzcmNfb3B0aW9uc1tdID0geworICAgIHsgInNvdXJjZSIsICJPcGVuQ0wgcHJvZ3JhbSBzb3VyY2UgZmlsZSIsIE9GRlNFVChzb3VyY2VfZmlsZSksCisgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJrZXJuZWwiLCAiS2VybmVsIG5hbWUgaW4gcHJvZ3JhbSIsICAgICBPRkZTRVQoa2VybmVsX25hbWUpLAorICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIC5mbGFncyA9IEZMQUdTIH0sCisKKyAgICB7ICJzaXplIiwgICAiVmlkZW8gc2l6ZSIsICAgICAgIE9GRlNFVCh3aWR0aCksCisgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCAgICAgICB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIEZMQUdTIH0sCisgICAgeyAicyIsICAgICAgIlZpZGVvIHNpemUiLCAgICAgICBPRkZTRVQod2lkdGgpLAorICAgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgICAgICAgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBGTEFHUyB9LAorCisgICAgeyAiZm9ybWF0IiwgIlZpZGVvIGZvcm1hdCIsICAgICBPRkZTRVQoc291cmNlX2Zvcm1hdCksCisgICAgICBBVl9PUFRfVFlQRV9QSVhFTF9GTVQsICAgICAgICB7IC5pNjQgPSBBVl9QSVhfRk1UX05PTkUgfSwgLTEsIElOVF9NQVgsIEZMQUdTIH0sCisKKyAgICB7ICJyYXRlIiwgICAiVmlkZW8gZnJhbWUgcmF0ZSIsIE9GRlNFVChzb3VyY2VfcmF0ZSksCisgICAgICBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCAgICAgICB7IC5zdHIgPSAiMjUiIH0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAiciIsICAgICAgIlZpZGVvIGZyYW1lIHJhdGUiLCBPRkZTRVQoc291cmNlX3JhdGUpLAorICAgICAgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgICAgICAgeyAuc3RyID0gIjI1IiB9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Mob3BlbmNsc3JjKTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG9wZW5jbHNyY19vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gJnByb2dyYW1fb3BlbmNsX2NvbmZpZ19vdXRwdXQsCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gJnByb2dyYW1fb3BlbmNsX3JlcXVlc3RfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdnNyY19vcGVuY2xzcmMgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm9wZW5jbHNyYyIsCisgICAgLmRlc2NyaXB0aW9uICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdlbmVyYXRlIHZpZGVvIHVzaW5nIGFuIE9wZW5DTCBwcm9ncmFtIiksCisgICAgLnByaXZfc2l6ZSAgICAgID0gc2l6ZW9mKFByb2dyYW1PcGVuQ0xDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmb3BlbmNsc3JjX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgICA9ICZwcm9ncmFtX29wZW5jbF9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9ICZwcm9ncmFtX29wZW5jbF91bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gJmZmX29wZW5jbF9maWx0ZXJfcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgICA9IG9wZW5jbHNyY19vdXRwdXRzLAorICAgIC5mbGFnc19pbnRlcm5hbCA9IEZGX0ZJTFRFUl9GTEFHX0hXRlJBTUVfQVdBUkUsCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3BzZXVkb2NvbG9yLmMgYi9saWJhdmZpbHRlci92Zl9wc2V1ZG9jb2xvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlN2EzYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9wc2V1ZG9jb2xvci5jCkBAIC0wLDAgKzEsNjcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2V2YWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKKyAgICAidyIsICAgICAgICAvLy88IHdpZHRoIG9mIHRoZSBpbnB1dCB2aWRlbworICAgICJoIiwgICAgICAgIC8vLzwgaGVpZ2h0IG9mIHRoZSBpbnB1dCB2aWRlbworICAgICJ2YWwiLCAgICAgIC8vLzwgaW5wdXQgdmFsdWUgZm9yIHRoZSBwaXhlbAorICAgICJ5bWluIiwKKyAgICAidW1pbiIsCisgICAgInZtaW4iLAorICAgICJhbWluIiwKKyAgICAieW1heCIsCisgICAgInVtYXgiLAorICAgICJ2bWF4IiwKKyAgICAiYW1heCIsCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX1csCisgICAgVkFSX0gsCisgICAgVkFSX1ZBTCwKKyAgICBWQVJfWU1JTiwKKyAgICBWQVJfVU1JTiwKKyAgICBWQVJfVk1JTiwKKyAgICBWQVJfQU1JTiwKKyAgICBWQVJfWU1BWCwKKyAgICBWQVJfVU1BWCwKKyAgICBWQVJfVk1BWCwKKyAgICBWQVJfQU1BWCwKKyAgICBWQVJfVkFSU19OQgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUHNldWRvQ29sb3JDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbWF4OworICAgIGludCBpbmRleDsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBjb2xvcjsKKyAgICBpbnQgbGluZXNpemVbNF07CisgICAgaW50IHdpZHRoWzRdLCBoZWlnaHRbNF07CisgICAgZG91YmxlIHZhcl92YWx1ZXNbVkFSX1ZBUlNfTkJdOworICAgIGNoYXIgICAqY29tcF9leHByX3N0cls0XTsKKyAgICBBVkV4cHIgKmNvbXBfZXhwcls0XTsKKyAgICBmbG9hdCBsdXRbNF1bMjU2KjI1Nl07CisKKyAgICB2b2lkICgqZmlsdGVyWzRdKShpbnQgbWF4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5kZXgsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGlsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmx1dCk7Cit9IFBzZXVkb0NvbG9yQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUHNldWRvQ29sb3JDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHBzZXVkb2NvbG9yX29wdGlvbnNbXSA9IHsKKyAgICB7ICJjMCIsICJzZXQgY29tcG9uZW50ICMwIGV4cHJlc3Npb24iLCBPRkZTRVQoY29tcF9leHByX3N0clswXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9InZhbCJ9LCAgIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiYzEiLCAic2V0IGNvbXBvbmVudCAjMSBleHByZXNzaW9uIiwgT0ZGU0VUKGNvbXBfZXhwcl9zdHJbMV0pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSJ2YWwifSwgICAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImMyIiwgInNldCBjb21wb25lbnQgIzIgZXhwcmVzc2lvbiIsIE9GRlNFVChjb21wX2V4cHJfc3RyWzJdKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj0idmFsIn0sICAgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJjMyIsICJzZXQgY29tcG9uZW50ICMzIGV4cHJlc3Npb24iLCBPRkZTRVQoY29tcF9leHByX3N0clszXSksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHI9InZhbCJ9LCAgIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiaSIsICAic2V0IGNvbXBvbmVudCBhcyBiYXNlIiwgICAgICAgT0ZGU0VUKGluZGV4KSwgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PTB9LCAwLCAzLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9HQlJQLAorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfR0JSQVAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDksCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDksCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWQTQyMFAxNiwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2LAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTYsCisgICAgQVZfUElYX0ZNVF9HQlJQOSwKKyAgICBBVl9QSVhfRk1UX0dCUlAxMCwgQVZfUElYX0ZNVF9HQlJBUDEwLAorICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTIsCisgICAgQVZfUElYX0ZNVF9HQlJQMTQsCisgICAgQVZfUElYX0ZNVF9HQlJQMTYsIEFWX1BJWF9GTVRfR0JSQVAxNiwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHNfbGlzdCA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOworICAgIGlmICghZm10c19saXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmbXRzX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBwc2V1ZG9jb2xvcl9maWx0ZXIoaW50IG1heCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGlsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmx1dCkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHYgPSBsdXRbaW5kZXhbeF1dOworCisgICAgICAgICAgICBpZiAodiA+PSAwICYmIHYgPD0gbWF4KSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW3hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluZGV4ICs9IGlsaW5lc2l6ZTsKKyAgICAgICAgc3JjICs9IHNsaW5lc2l6ZTsKKyAgICAgICAgZHN0ICs9IGRsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzZXVkb2NvbG9yX2ZpbHRlcl8xMShpbnQgbWF4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgaWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbHV0KQoreworICAgIGludCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgdiA9IGx1dFtpbmRleFsoeSA8PCAxKSAqIGlsaW5lc2l6ZSArICh4IDw8IDEpXV07CisKKyAgICAgICAgICAgIGlmICh2ID49IDAgJiYgdiA8PSBtYXgpIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSB2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHNsaW5lc2l6ZTsKKyAgICAgICAgZHN0ICs9IGRsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzZXVkb2NvbG9yX2ZpbHRlcl8xMWQoaW50IG1heCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsdXQpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCB2ID0gbHV0W2luZGV4Wyh5ID4+IDEpICogaWxpbmVzaXplICsgKHggPj4gMSldXTsKKworICAgICAgICAgICAgaWYgKHYgPj0gMCAmJiB2IDw9IG1heCkgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IHY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IHNyY1t4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gc2xpbmVzaXplOworICAgICAgICBkc3QgKz0gZGxpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHNldWRvY29sb3JfZmlsdGVyXzEwKGludCBtYXgsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsdXQpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCB2ID0gbHV0W2luZGV4W3ggPDwgMV1dOworCisgICAgICAgICAgICBpZiAodiA+PSAwICYmIHYgPD0gbWF4KSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW3hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluZGV4ICs9IGlsaW5lc2l6ZTsKKyAgICAgICAgc3JjICs9IHNsaW5lc2l6ZTsKKyAgICAgICAgZHN0ICs9IGRsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzZXVkb2NvbG9yX2ZpbHRlcl8xMGQoaW50IG1heCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsdXQpCit7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCB2ID0gbHV0W2luZGV4W3ggPj4gMV1dOworCisgICAgICAgICAgICBpZiAodiA+PSAwICYmIHYgPD0gbWF4KSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW3hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluZGV4ICs9IGlsaW5lc2l6ZTsKKyAgICAgICAgc3JjICs9IHNsaW5lc2l6ZTsKKyAgICAgICAgZHN0ICs9IGRsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzZXVkb2NvbG9yX2ZpbHRlcl8xNihpbnQgbWF4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaWluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgaWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbHV0KQoreworICAgIGNvbnN0IHVpbnQxNl90ICppbmRleCA9IChjb25zdCB1aW50MTZfdCAqKWlpbmRleDsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopc3NyYzsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopZGRzdDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHYgPSBsdXRbaW5kZXhbeF1dOworCisgICAgICAgICAgICBpZiAodiA+PSAwICYmIHYgPD0gbWF4KSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW3hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluZGV4ICs9IGlsaW5lc2l6ZSAvIDI7CisgICAgICAgIHNyYyArPSBzbGluZXNpemUgLyAyOworICAgICAgICBkc3QgKz0gZGxpbmVzaXplIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzZXVkb2NvbG9yX2ZpbHRlcl8xNl8xMChpbnQgbWF4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaWluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgaWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbHV0KQoreworICAgIGNvbnN0IHVpbnQxNl90ICppbmRleCA9IChjb25zdCB1aW50MTZfdCAqKWlpbmRleDsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopc3NyYzsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopZGRzdDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaW50IHYgPSBsdXRbaW5kZXhbeCA8PCAxXV07CisKKyAgICAgICAgICAgIGlmICh2ID49IDAgJiYgdiA8PSBtYXgpIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSB2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggKz0gaWxpbmVzaXplIC8gMjsKKyAgICAgICAgc3JjICs9IHNsaW5lc2l6ZSAvIDI7CisgICAgICAgIGRzdCArPSBkbGluZXNpemUgLyAyOworICAgIH0KK30KKworc3RhdGljIHZvaWQgcHNldWRvY29sb3JfZmlsdGVyXzE2XzEwZChpbnQgbWF4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGlsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmx1dCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqaW5kZXggPSAoY29uc3QgdWludDE2X3QgKilpaW5kZXg7CisgICAgY29uc3QgdWludDE2X3QgKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKXNzcmM7CisgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKWRkc3Q7CisgICAgaW50IHgsIHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCB2ID0gbHV0W2luZGV4W3ggPj4gMV1dOworCisgICAgICAgICAgICBpZiAodiA+PSAwICYmIHYgPD0gbWF4KSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW3hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGluZGV4ICs9IGlsaW5lc2l6ZSAvIDI7CisgICAgICAgIHNyYyArPSBzbGluZXNpemUgLyAyOworICAgICAgICBkc3QgKz0gZGxpbmVzaXplIC8gMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzZXVkb2NvbG9yX2ZpbHRlcl8xNl8xMShpbnQgbWF4LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaWluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgaWxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbHV0KQoreworICAgIGNvbnN0IHVpbnQxNl90ICppbmRleCA9IChjb25zdCB1aW50MTZfdCAqKWlpbmRleDsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjID0gKGNvbnN0IHVpbnQxNl90ICopc3NyYzsKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopZGRzdDsKKyAgICBpbnQgeCwgeTsKKworICAgIGlsaW5lc2l6ZSAvPSAyOworICAgIGRsaW5lc2l6ZSAvPSAyOworICAgIHNsaW5lc2l6ZSAvPSAyOworCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICBpbnQgdiA9IGx1dFtpbmRleFsoeSA8PCAxKSAqIGlsaW5lc2l6ZSArICh4IDw8IDEpXV07CisKKyAgICAgICAgICAgIGlmICh2ID49IDAgJiYgdiA8PSBtYXgpIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSB2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjICs9IHNsaW5lc2l6ZTsKKyAgICAgICAgZHN0ICs9IGRsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHBzZXVkb2NvbG9yX2ZpbHRlcl8xNl8xMWQoaW50IG1heCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsdXQpCit7CisgICAgY29uc3QgdWludDE2X3QgKmluZGV4ID0gKGNvbnN0IHVpbnQxNl90ICopaWluZGV4OworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgPSAoY29uc3QgdWludDE2X3QgKilzc3JjOworICAgIHVpbnQxNl90ICpkc3QgPSAodWludDE2X3QgKilkZHN0OworICAgIGludCB4LCB5OworCisgICAgaWxpbmVzaXplIC89IDI7CisgICAgZGxpbmVzaXplIC89IDI7CisgICAgc2xpbmVzaXplIC89IDI7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGludCB2ID0gbHV0W2luZGV4Wyh5ID4+IDEpICogaWxpbmVzaXplICsgKHggPj4gMSldXTsKKworICAgICAgICAgICAgaWYgKHYgPj0gMCAmJiB2IDw9IG1heCkgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IHY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRzdFt4XSA9IHNyY1t4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcmMgKz0gc2xpbmVzaXplOworICAgICAgICBkc3QgKz0gZGxpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXQoQVZGaWx0ZXJMaW5rICppbmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBQc2V1ZG9Db2xvckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IGRlcHRoLCByZXQsIGhzdWIsIHZzdWIsIGNvbG9yOworCisgICAgZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOworICAgIHMtPm1heCA9ICgxIDw8IGRlcHRoKSAtIDE7CisgICAgcy0+bmJfcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoaW5saW5rLT5mb3JtYXQpOworCisgICAgaWYgKHMtPmluZGV4ID49IHMtPm5iX3BsYW5lcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJpbmRleCBvdXQgb2YgYWxsb3dlZCByYW5nZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhzLT5saW5lc2l6ZSwgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGhzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHZzdWIgPSBkZXNjLT5sb2cyX2Nocm9tYV9oOworICAgIHMtPmhlaWdodFsxXSA9IHMtPmhlaWdodFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgdnN1Yik7CisgICAgcy0+aGVpZ2h0WzBdID0gcy0+aGVpZ2h0WzNdID0gaW5saW5rLT5oOworICAgIHMtPndpZHRoWzFdICA9IHMtPndpZHRoWzJdICA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgaHN1Yik7CisgICAgcy0+d2lkdGhbMF0gID0gcy0+d2lkdGhbM10gID0gaW5saW5rLT53OworCisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfV10gPSBpbmxpbmstPnc7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfSF0gPSBpbmxpbmstPmg7CisKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9ZTUlOXSA9IDE2ICogKDEgPDwgKGRlcHRoIC0gOCkpOworICAgIHMtPnZhcl92YWx1ZXNbVkFSX1VNSU5dID0gMTYgKiAoMSA8PCAoZGVwdGggLSA4KSk7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVk1JTl0gPSAxNiAqICgxIDw8IChkZXB0aCAtIDgpKTsKKyAgICBzLT52YXJfdmFsdWVzW1ZBUl9BTUlOXSA9IDA7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfWU1BWF0gPSAyMzUgKiAoMSA8PCAoZGVwdGggLSA4KSk7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVU1BWF0gPSAyNDAgKiAoMSA8PCAoZGVwdGggLSA4KSk7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfVk1BWF0gPSAyNDAgKiAoMSA8PCAoZGVwdGggLSA4KSk7CisgICAgcy0+dmFyX3ZhbHVlc1tWQVJfQU1BWF0gPSBzLT5tYXg7CisKKyAgICBmb3IgKGNvbG9yID0gMDsgY29sb3IgPCBzLT5uYl9wbGFuZXM7IGNvbG9yKyspIHsKKyAgICAgICAgZG91YmxlIHJlczsKKyAgICAgICAgaW50IHZhbDsKKworICAgICAgICAvKiBjcmVhdGUgdGhlIHBhcnNlZCBleHByZXNzaW9uICovCisgICAgICAgIGF2X2V4cHJfZnJlZShzLT5jb21wX2V4cHJbY29sb3JdKTsKKyAgICAgICAgcy0+Y29tcF9leHByW2NvbG9yXSA9IE5VTEw7CisgICAgICAgIHJldCA9IGF2X2V4cHJfcGFyc2UoJnMtPmNvbXBfZXhwcltjb2xvcl0sIHMtPmNvbXBfZXhwcl9zdHJbY29sb3JdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiBwYXJzaW5nIHRoZSBleHByZXNzaW9uICclcycgZm9yIHRoZSBjb21wb25lbnQgJWQgYW5kIGNvbG9yICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICBzLT5jb21wX2V4cHJfc3RyW2NvbG9yXSwgY29sb3IsIGNvbG9yKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBjb21wdXRlIHRoZSBsdXQgKi8KKyAgICAgICAgZm9yICh2YWwgPSAwOyB2YWwgPCBGRl9BUlJBWV9FTEVNUyhzLT5sdXRbY29sb3JdKTsgdmFsKyspIHsKKyAgICAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1ZBTF0gPSB2YWw7CisKKyAgICAgICAgICAgIHJlcyA9IGF2X2V4cHJfZXZhbChzLT5jb21wX2V4cHJbY29sb3JdLCBzLT52YXJfdmFsdWVzLCBzKTsKKyAgICAgICAgICAgIGlmIChpc25hbihyZXMpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hlbiBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9uICclcycgZm9yIHRoZSB2YWx1ZSAlZCBmb3IgdGhlIGNvbXBvbmVudCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPmNvbXBfZXhwcl9zdHJbY29sb3JdLCB2YWwsIGNvbG9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcy0+bHV0W2NvbG9yXVt2YWxdID0gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChpbmxpbmstPmZvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICBzLT5maWx0ZXJbMF0gPSBzLT5maWx0ZXJbMV0gPSBzLT5maWx0ZXJbMl0gPSBzLT5maWx0ZXJbM10gPSBwc2V1ZG9jb2xvcl9maWx0ZXI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDoKKyAgICAgICAgc3dpdGNoIChzLT5pbmRleCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHMtPmZpbHRlclswXSA9IHMtPmZpbHRlclszXSA9IHBzZXVkb2NvbG9yX2ZpbHRlcjsKKyAgICAgICAgICAgIHMtPmZpbHRlclsxXSA9IHMtPmZpbHRlclsyXSA9IHBzZXVkb2NvbG9yX2ZpbHRlcl8xMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHMtPmZpbHRlclswXSA9IHMtPmZpbHRlclszXSA9IHBzZXVkb2NvbG9yX2ZpbHRlcl8xMWQ7CisgICAgICAgICAgICBzLT5maWx0ZXJbMV0gPSBzLT5maWx0ZXJbMl0gPSBwc2V1ZG9jb2xvcl9maWx0ZXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA6CisgICAgICAgIHN3aXRjaCAocy0+aW5kZXgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBzLT5maWx0ZXJbMF0gPSBzLT5maWx0ZXJbM10gPSBwc2V1ZG9jb2xvcl9maWx0ZXI7CisgICAgICAgICAgICBzLT5maWx0ZXJbMV0gPSBzLT5maWx0ZXJbMl0gPSBwc2V1ZG9jb2xvcl9maWx0ZXJfMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBzLT5maWx0ZXJbMF0gPSBzLT5maWx0ZXJbM10gPSBwc2V1ZG9jb2xvcl9maWx0ZXJfMTBkOworICAgICAgICAgICAgcy0+ZmlsdGVyWzFdID0gcy0+ZmlsdGVyWzJdID0gcHNldWRvY29sb3JfZmlsdGVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTk6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTY6CisgICAgICAgIHMtPmZpbHRlclswXSA9IHMtPmZpbHRlclsxXSA9IHMtPmZpbHRlclsyXSA9IHMtPmZpbHRlclszXSA9IHBzZXVkb2NvbG9yX2ZpbHRlcl8xNjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxMDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTQ6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxNjoKKyAgICAgICAgc3dpdGNoIChzLT5pbmRleCkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHMtPmZpbHRlclswXSA9IHMtPmZpbHRlclszXSA9IHBzZXVkb2NvbG9yX2ZpbHRlcl8xNjsKKyAgICAgICAgICAgIHMtPmZpbHRlclsxXSA9IHMtPmZpbHRlclsyXSA9IHBzZXVkb2NvbG9yX2ZpbHRlcl8xNl8xMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHMtPmZpbHRlclswXSA9IHMtPmZpbHRlclszXSA9IHBzZXVkb2NvbG9yX2ZpbHRlcl8xNl8xMGQ7CisgICAgICAgICAgICBzLT5maWx0ZXJbMV0gPSBzLT5maWx0ZXJbMl0gPSBwc2V1ZG9jb2xvcl9maWx0ZXJfMTY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDk6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2OgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2OgorICAgICAgICBzd2l0Y2ggKHMtPmluZGV4KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcy0+ZmlsdGVyWzBdID0gcy0+ZmlsdGVyWzNdID0gcHNldWRvY29sb3JfZmlsdGVyXzE2OworICAgICAgICAgICAgcy0+ZmlsdGVyWzFdID0gcy0+ZmlsdGVyWzJdID0gcHNldWRvY29sb3JfZmlsdGVyXzE2XzExOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcy0+ZmlsdGVyWzBdID0gcy0+ZmlsdGVyWzNdID0gcHNldWRvY29sb3JfZmlsdGVyXzE2XzExZDsKKyAgICAgICAgICAgIHMtPmZpbHRlclsxXSA9IHMtPmZpbHRlclsyXSA9IHBzZXVkb2NvbG9yX2ZpbHRlcl8xNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBQc2V1ZG9Db2xvckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgcGxhbmU7CisKKyAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPm5iX3BsYW5lczsgcGxhbmUrKykgeworICAgICAgICBjb25zdCB1aW50OF90ICppbmRleCA9IGluLT5kYXRhW3MtPmluZGV4XTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0gaW4tPmRhdGFbcGxhbmVdOworICAgICAgICB1aW50OF90ICpkc3QgPSBvdXQtPmRhdGFbcGxhbmVdOworICAgICAgICBwdHJkaWZmX3QgaWxpbmVzaXplID0gaW4tPmxpbmVzaXplW3MtPmluZGV4XTsKKyAgICAgICAgcHRyZGlmZl90IHNsaW5lc2l6ZSA9IGluLT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIHB0cmRpZmZfdCBkbGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKKworICAgICAgICBzLT5maWx0ZXJbcGxhbmVdKHMtPm1heCwgcy0+d2lkdGhbcGxhbmVdLCBzLT5oZWlnaHRbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBzcmMsIGRzdCwgaWxpbmVzaXplLCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGxpbmVzaXplLCBzLT5sdXRbcGxhbmVdKTsKKyAgICB9CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUHNldWRvQ29sb3JDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBhdl9leHByX2ZyZWUocy0+Y29tcF9leHByW2ldKTsKKyAgICAgICAgcy0+Y29tcF9leHByW2ldID0gTlVMTDsKKyAgICB9Cit9CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhwc2V1ZG9jb2xvcik7CisKK0FWRmlsdGVyIGZmX3ZmX3BzZXVkb2NvbG9yID0geworICAgIC5uYW1lICAgICAgICAgID0gInBzZXVkb2NvbG9yIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNYWtlIHBzZXVkb2NvbG9yZWQgdmlkZW8gZnJhbWVzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFBzZXVkb0NvbG9yQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmcHNldWRvY29sb3JfY2xhc3MsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5pbnB1dHMgICAgICAgID0gaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKKyAgICAuZmxhZ3MgICAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3BzbnIuYyBiL2xpYmF2ZmlsdGVyL3ZmX3BzbnIuYwppbmRleCA4OWFjZDNjLi4xNTNkNjk0IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9wc25yLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfcHNuci5jCkBAIC0yOSwyMCArMjksMjMgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgotI2luY2x1ZGUgImR1YWxpbnB1dC5oIgogI2luY2x1ZGUgImRyYXd1dGlscy5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInBzbnIuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCiB0eXBlZGVmIHN0cnVjdCBQU05SQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Ci0gICAgRkZEdWFsSW5wdXRDb250ZXh0IGRpbnB1dDsKKyAgICBGRkZyYW1lU3luYyBmczsKICAgICBkb3VibGUgbXNlLCBtaW5fbXNlLCBtYXhfbXNlLCBtc2VfY29tcFs0XTsKICAgICB1aW50NjRfdCBuYl9mcmFtZXM7CiAgICAgRklMRSAqc3RhdHNfZmlsZTsKICAgICBjaGFyICpzdGF0c19maWxlX3N0cjsKKyAgICBpbnQgc3RhdHNfdmVyc2lvbjsKKyAgICBpbnQgc3RhdHNfaGVhZGVyX3dyaXR0ZW47CisgICAgaW50IHN0YXRzX2FkZF9tYXg7CiAgICAgaW50IG1heFs0XSwgYXZlcmFnZV9tYXg7CiAgICAgaW50IGlzX3JnYjsKICAgICB1aW50OF90IHJnYmFfbWFwWzRdOwpAQCAtNjAsMTkgKzYzLDIxIEBACiBzdGF0aWMgY29uc3QgQVZPcHRpb24gcHNucl9vcHRpb25zW10gPSB7CiAgICAgeyJzdGF0c19maWxlIiwgIlNldCBmaWxlIHdoZXJlIHRvIHN0b3JlIHBlci1mcmFtZSBkaWZmZXJlbmNlIGluZm9ybWF0aW9uIiwgT0ZGU0VUKHN0YXRzX2ZpbGVfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMCwgRkxBR1MgfSwKICAgICB7ImYiLCAgICAgICAgICAiU2V0IGZpbGUgd2hlcmUgdG8gc3RvcmUgcGVyLWZyYW1lIGRpZmZlcmVuY2UgaW5mb3JtYXRpb24iLCBPRkZTRVQoc3RhdHNfZmlsZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPU5VTEx9LCAwLCAwLCBGTEFHUyB9LAorICAgIHsic3RhdHNfdmVyc2lvbiIsICJTZXQgdGhlIGZvcm1hdCB2ZXJzaW9uIGZvciB0aGUgc3RhdHMgZmlsZS4iLCAgICAgICAgICAgICAgIE9GRlNFVChzdGF0c192ZXJzaW9uKSwgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQ9MX0sICAgIDEsIDIsIEZMQUdTIH0sCisgICAgeyJvdXRwdXRfbWF4IiwgICJBZGQgcmF3IHN0YXRzIChtYXggdmFsdWVzKSB0byB0aGUgb3V0cHV0IGxvZy4iLCAgICAgICAgICAgIE9GRlNFVChzdGF0c19hZGRfbWF4KSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MH0sIDAsIDEsIEZMQUdTfSwKICAgICB7IE5VTEwgfQogfTsKIAotQVZGSUxURVJfREVGSU5FX0NMQVNTKHBzbnIpOworRlJBTUVTWU5DX0RFRklORV9DTEFTUyhwc25yLCBQU05SQ29udGV4dCwgZnMpOwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHBvdzIodW5zaWduZWQgYmFzZSkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcG93XzIodW5zaWduZWQgYmFzZSkKIHsKICAgICByZXR1cm4gYmFzZSpiYXNlOwogfQogCiBzdGF0aWMgaW5saW5lIGRvdWJsZSBnZXRfcHNucihkb3VibGUgbXNlLCB1aW50NjRfdCBuYl9mcmFtZXMsIGludCBtYXgpCiB7Ci0gICAgcmV0dXJuIDEwLjAgKiBsb2cxMChwb3cyKG1heCkgLyAobXNlIC8gbmJfZnJhbWVzKSk7CisgICAgcmV0dXJuIDEwLjAgKiBsb2cxMChwb3dfMihtYXgpIC8gKG1zZSAvIG5iX2ZyYW1lcykpOwogfQogCiBzdGF0aWMgdWludDY0X3Qgc3NlX2xpbmVfOGJpdChjb25zdCB1aW50OF90ICptYWluX2xpbmUsICBjb25zdCB1aW50OF90ICpyZWZfbGluZSwgaW50IG91dHcpCkBAIC04MSw3ICs4Niw3IEBACiAgICAgdW5zaWduZWQgbTIgPSAwOwogCiAgICAgZm9yIChqID0gMDsgaiA8IG91dHc7IGorKykKLSAgICAgICAgbTIgKz0gcG93MihtYWluX2xpbmVbal0gLSByZWZfbGluZVtqXSk7CisgICAgICAgIG0yICs9IHBvd18yKG1haW5fbGluZVtqXSAtIHJlZl9saW5lW2pdKTsKIAogICAgIHJldHVybiBtMjsKIH0KQEAgLTk0LDcgKzk5LDcgQEAKICAgICBjb25zdCB1aW50MTZfdCAqcmVmX2xpbmUgPSAoY29uc3QgdWludDE2X3QgKikgX3JlZl9saW5lOwogCiAgICAgZm9yIChqID0gMDsgaiA8IG91dHc7IGorKykKLSAgICAgICAgbTIgKz0gcG93MihtYWluX2xpbmVbal0gLSByZWZfbGluZVtqXSk7CisgICAgICAgIG0yICs9IHBvd18yKG1haW5fbGluZVtqXSAtIHJlZl9saW5lW2pdKTsKIAogICAgIHJldHVybiBtMjsKIH0KQEAgLTEzNywxNyArMTQyLDI1IEBACiAgICAgfQogfQogCi1zdGF0aWMgQVZGcmFtZSAqZG9fcHNucihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqbWFpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnJlZikKK3N0YXRpYyBpbnQgZG9fcHNucihGRkZyYW1lU3luYyAqZnMpCiB7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OwogICAgIFBTTlJDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRnJhbWUgKm1hc3RlciwgKnJlZjsKICAgICBkb3VibGUgY29tcF9tc2VbNF0sIG1zZSA9IDA7Ci0gICAgaW50IGosIGM7Ci0gICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEgPSBhdnByaXZfZnJhbWVfZ2V0X21ldGFkYXRhcChtYWluKTsKKyAgICBpbnQgcmV0LCBqLCBjOworICAgIEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhOwogCi0gICAgY29tcHV0ZV9pbWFnZXNfbXNlKHMsIChjb25zdCB1aW50OF90ICoqKW1haW4tPmRhdGEsIG1haW4tPmxpbmVzaXplLAorICAgIHJldCA9IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRfZ2V0KGZzLCAmbWFzdGVyLCAmcmVmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIXJlZikKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG1hc3Rlcik7CisgICAgbWV0YWRhdGEgPSAmbWFzdGVyLT5tZXRhZGF0YTsKKworICAgIGNvbXB1dGVfaW1hZ2VzX21zZShzLCAoY29uc3QgdWludDhfdCAqKiltYXN0ZXItPmRhdGEsIG1hc3Rlci0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICoqKXJlZi0+ZGF0YSwgcmVmLT5saW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbi0+d2lkdGgsIG1haW4tPmhlaWdodCwgY29tcF9tc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXItPndpZHRoLCBtYXN0ZXItPmhlaWdodCwgY29tcF9tc2UpOwogCiAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX2NvbXBvbmVudHM7IGorKykKICAgICAgICAgbXNlICs9IGNvbXBfbXNlW2pdICogcy0+cGxhbmV3ZWlnaHRbal07CkBAIC0xNjksNiArMTgyLDI1IEBACiAgICAgc2V0X21ldGEobWV0YWRhdGEsICJsYXZmaS5wc25yLnBzbnJfYXZnIiwgMCwgZ2V0X3BzbnIobXNlLCAxLCBzLT5hdmVyYWdlX21heCkpOwogCiAgICAgaWYgKHMtPnN0YXRzX2ZpbGUpIHsKKyAgICAgICAgaWYgKHMtPnN0YXRzX3ZlcnNpb24gPT0gMiAmJiAhcy0+c3RhdHNfaGVhZGVyX3dyaXR0ZW4pIHsKKyAgICAgICAgICAgIGZwcmludGYocy0+c3RhdHNfZmlsZSwgInBzbnJfbG9nX3ZlcnNpb246MiBmaWVsZHM6biIpOworICAgICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAiLG1zZV9hdmciKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9jb21wb25lbnRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHMtPnN0YXRzX2ZpbGUsICIsbXNlXyVjIiwgcy0+Y29tcHNbal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAiLHBzbnJfYXZnIik7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfY29tcG9uZW50czsgaisrKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAiLHBzbnJfJWMiLCBzLT5jb21wc1tqXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocy0+c3RhdHNfYWRkX21heCkgeworICAgICAgICAgICAgICAgIGZwcmludGYocy0+c3RhdHNfZmlsZSwgIixtYXhfYXZnIik7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX2NvbXBvbmVudHM7IGorKykgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHMtPnN0YXRzX2ZpbGUsICIsbWF4XyVjIiwgcy0+Y29tcHNbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwcmludGYocy0+c3RhdHNfZmlsZSwgIlxuIik7CisgICAgICAgICAgICBzLT5zdGF0c19oZWFkZXJfd3JpdHRlbiA9IDE7CisgICAgICAgIH0KICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAibjolIlBSSWQ2NCIgbXNlX2F2ZzolMC4yZiAiLCBzLT5uYl9mcmFtZXMsIG1zZSk7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9jb21wb25lbnRzOyBqKyspIHsKICAgICAgICAgICAgIGMgPSBzLT5pc19yZ2IgPyBzLT5yZ2JhX21hcFtqXSA6IGo7CkBAIC0xODAsMTAgKzIxMiwxNyBAQAogICAgICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAicHNucl8lYzolMC4yZiAiLCBzLT5jb21wc1tqXSwKICAgICAgICAgICAgICAgICAgICAgZ2V0X3BzbnIoY29tcF9tc2VbY10sIDEsIHMtPm1heFtjXSkpOwogICAgICAgICB9CisgICAgICAgIGlmIChzLT5zdGF0c192ZXJzaW9uID09IDIgJiYgcy0+c3RhdHNfYWRkX21heCkgeworICAgICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAibWF4X2F2ZzolZCAiLCBzLT5hdmVyYWdlX21heCk7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfY29tcG9uZW50czsgaisrKSB7CisgICAgICAgICAgICAgICAgYyA9IHMtPmlzX3JnYiA/IHMtPnJnYmFfbWFwW2pdIDogajsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHMtPnN0YXRzX2ZpbGUsICJtYXhfJWM6JWQgIiwgcy0+Y29tcHNbal0sIHMtPm1heFtjXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLCAiXG4iKTsKICAgICB9CiAKLSAgICByZXR1cm4gbWFpbjsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgbWFzdGVyKTsKIH0KIAogc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCkBAIC0xOTQsNiArMjMzLDExIEBACiAgICAgcy0+bWF4X21zZSA9IC1JTkZJTklUWTsKIAogICAgIGlmIChzLT5zdGF0c19maWxlX3N0cikgeworICAgICAgICBpZiAocy0+c3RhdHNfdmVyc2lvbiA8IDIgJiYgcy0+c3RhdHNfYWRkX21heCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJzdGF0c19hZGRfbWF4IHdhcyBzcGVjaWZpZWQgYnV0IHN0YXRzX3ZlcnNpb24gPCAyLlxuIiApOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNtcChzLT5zdGF0c19maWxlX3N0ciwgIi0iKSkgewogICAgICAgICAgICAgcy0+c3RhdHNfZmlsZSA9IHN0ZG91dDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTIwOSwxNCArMjUzLDE0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzLT5kaW5wdXQucHJvY2VzcyA9IGRvX3BzbnI7CisgICAgcy0+ZnMub25fZXZlbnQgPSBkb19wc25yOwogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7CiAgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0gewotICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LCBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLCBBVl9QSVhfRk1UX0dSQVkxNiwKICNkZWZpbmUgUEZfTk9BTFBIQShzdWYpIEFWX1BJWF9GTVRfWVVWNDIwIyNzdWYsICBBVl9QSVhfRk1UX1lVVjQyMiMjc3VmLCAgQVZfUElYX0ZNVF9ZVVY0NDQjI3N1ZgogI2RlZmluZSBQRl9BTFBIQShzdWYpICAgQVZfUElYX0ZNVF9ZVVZBNDIwIyNzdWYsIEFWX1BJWF9GTVRfWVVWQTQyMiMjc3VmLCBBVl9QSVhfRk1UX1lVVkE0NDQjI3N1ZgogI2RlZmluZSBQRihzdWYpICAgICAgICAgUEZfTk9BTFBIQShzdWYpLCBQRl9BTFBIQShzdWYpCkBAIC0yMjYsNyArMjcwLDcgQEAKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKICAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKICAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKLSAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDE2LAorICAgICAgICBBVl9QSVhfRk1UX0dCUkFQLCBBVl9QSVhfRk1UX0dCUkFQMTAsIEFWX1BJWF9GTVRfR0JSQVAxMiwgQVZfUElYX0ZNVF9HQlJBUDE2LAogICAgICAgICBBVl9QSVhfRk1UX05PTkUKICAgICB9OwogCkBAIC0yNDEsNiArMjg1LDcgQEAKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCAgPSBpbmxpbmstPmRzdDsKICAgICBQU05SQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBkb3VibGUgYXZlcmFnZV9tYXg7CiAgICAgdW5zaWduZWQgc3VtOwogICAgIGludCBqOwogCkBAIC0yNzMsMTAgKzMxOCwxMiBAQAogICAgIHN1bSA9IDA7CiAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX2NvbXBvbmVudHM7IGorKykKICAgICAgICAgc3VtICs9IHMtPnBsYW5laGVpZ2h0W2pdICogcy0+cGxhbmV3aWR0aFtqXTsKKyAgICBhdmVyYWdlX21heCA9IDA7CiAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX2NvbXBvbmVudHM7IGorKykgewogICAgICAgICBzLT5wbGFuZXdlaWdodFtqXSA9IChkb3VibGUpIHMtPnBsYW5laGVpZ2h0W2pdICogcy0+cGxhbmV3aWR0aFtqXSAvIHN1bTsKLSAgICAgICAgcy0+YXZlcmFnZV9tYXggKz0gcy0+bWF4W2pdICogcy0+cGxhbmV3ZWlnaHRbal07CisgICAgICAgIGF2ZXJhZ2VfbWF4ICs9IHMtPm1heFtqXSAqIHMtPnBsYW5ld2VpZ2h0W2pdOwogICAgIH0KKyAgICBzLT5hdmVyYWdlX21heCA9IGxyaW50KGF2ZXJhZ2VfbWF4KTsKIAogICAgIHMtPmRzcC5zc2VfbGluZSA9IGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4ID8gc3NlX2xpbmVfMTZiaXQgOiBzc2VfbGluZV84Yml0OwogICAgIGlmIChBUkNIX1g4NikKQEAgLTI5MiwyNyArMzM5LDI0IEBACiAgICAgQVZGaWx0ZXJMaW5rICptYWlubGluayA9IGN0eC0+aW5wdXRzWzBdOwogICAgIGludCByZXQ7CiAKKyAgICByZXQgPSBmZl9mcmFtZXN5bmNfaW5pdF9kdWFsaW5wdXQoJnMtPmZzLCBjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogICAgIG91dGxpbmstPncgPSBtYWlubGluay0+dzsKICAgICBvdXRsaW5rLT5oID0gbWFpbmxpbmstPmg7CiAgICAgb3V0bGluay0+dGltZV9iYXNlID0gbWFpbmxpbmstPnRpbWVfYmFzZTsKICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gbWFpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CiAgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IG1haW5saW5rLT5mcmFtZV9yYXRlOwotICAgIGlmICgocmV0ID0gZmZfZHVhbGlucHV0X2luaXQoY3R4LCAmcy0+ZGlucHV0KSkgPCAwKQorICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2NvbmZpZ3VyZSgmcy0+ZnMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmlucGljcmVmKQorc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBQU05SQ29udGV4dCAqcyA9IGlubGluay0+ZHN0LT5wcml2OwotICAgIHJldHVybiBmZl9kdWFsaW5wdXRfZmlsdGVyX2ZyYW1lKCZzLT5kaW5wdXQsIGlubGluaywgaW5waWNyZWYpOwotfQotCi1zdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQotewotICAgIFBTTlJDb250ZXh0ICpzID0gb3V0bGluay0+c3JjLT5wcml2OwotICAgIHJldHVybiBmZl9kdWFsaW5wdXRfcmVxdWVzdF9mcmFtZSgmcy0+ZGlucHV0LCBvdXRsaW5rKTsKKyAgICBQU05SQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7CiB9CiAKIHN0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQpAQCAtMzM2LDcgKzM4MCw3IEBACiAgICAgICAgICAgICAgICBnZXRfcHNucihzLT5taW5fbXNlLCAxLCBzLT5hdmVyYWdlX21heCkpOwogICAgIH0KIAotICAgIGZmX2R1YWxpbnB1dF91bmluaXQoJnMtPmRpbnB1dCk7CisgICAgZmZfZnJhbWVzeW5jX3VuaW5pdCgmcy0+ZnMpOwogCiAgICAgaWYgKHMtPnN0YXRzX2ZpbGUgJiYgcy0+c3RhdHNfZmlsZSAhPSBzdGRvdXQpCiAgICAgICAgIGZjbG9zZShzLT5zdGF0c19maWxlKTsKQEAgLTM0NiwxMSArMzkwLDkgQEAKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAibWFpbiIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCiAgICAgfSx7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAicmVmZXJlbmNlIiwKICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKICAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dF9yZWYsCiAgICAgfSwKICAgICB7IE5VTEwgfQpAQCAtMzYxLDcgKzQwMyw2IEBACiAgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAotICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTM2OSw5ICs0MTAsMTEgQEAKIEFWRmlsdGVyIGZmX3ZmX3BzbnIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgPSAicHNuciIsCiAgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2FsY3VsYXRlIHRoZSBQU05SIGJldHdlZW4gdHdvIHZpZGVvIHN0cmVhbXMuIiksCisgICAgLnByZWluaXQgICAgICAgPSBwc25yX2ZyYW1lc3luY19wcmVpbml0LAogICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKICAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKICAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmFjdGl2YXRlICAgICAgPSBhY3RpdmF0ZSwKICAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihQU05SQ29udGV4dCksCiAgICAgLnByaXZfY2xhc3MgICAgPSAmcHNucl9jbGFzcywKICAgICAuaW5wdXRzICAgICAgICA9IHBzbnJfaW5wdXRzLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfcmVhZGVpYTYwOC5jIGIvbGliYXZmaWx0ZXIvdmZfcmVhZGVpYTYwOC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjM2FiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9yZWFkZWlhNjA4LmMKQEAgLTAsMCArMSwyNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEZpbHRlciBmb3IgcmVhZGluZyBjbG9zZWQgY2FwdGlvbmluZyBkYXRhIChFSUEtNjA4KS4KKyAqIFNlZSBhbHNvIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VJQS02MDgKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKKyNkZWZpbmUgRkFMTCAwCisjZGVmaW5lIFJJU0UgMQorCit0eXBlZGVmIHN0cnVjdCBSZWFkRUlBNjA4Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IHN0YXJ0LCBlbmQ7CisgICAgaW50IG1pbl9yYW5nZTsKKyAgICBpbnQgbWF4X3BlYWtfZGlmZjsKKyAgICBpbnQgbWF4X3BlcmlvZF9kaWZmOworICAgIGludCBtYXhfc3RhcnRfZGlmZjsKKyAgICBpbnQgbmJfZm91bmQ7CisgICAgaW50IHdoaXRlOworICAgIGludCBibGFjazsKKyAgICBmbG9hdCBtcGQsIG1oZCwgbXNkLCBtYWMsIHNwdywgYmhkLCB3dGgsIGJ0aDsKKyAgICBpbnQgY2hwOworfSBSZWFkRUlBNjA4Q29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUmVhZEVJQTYwOENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gcmVhZGVpYTYwOF9vcHRpb25zW10gPSB7CisgICAgeyAic2Nhbl9taW4iLCAic2V0IGZyb20gd2hpY2ggbGluZSB0byBzY2FuIGZvciBjb2RlcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChzdGFydCksIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND0wfSwgICAgICAgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJzY2FuX21heCIsICJzZXQgdG8gd2hpY2ggbGluZSB0byBzY2FuIGZvciBjb2RlcyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGVuZCksICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTI5fSwgICAgICAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgIm1hYyIsICAgICAgInNldCBtaW5pbWFsIGFjY2VwdGFibGUgYW1wbGl0dWRlIGNoYW5nZSBmb3Igc3luYyBjb2RlcyBkZXRlY3Rpb24iLCBPRkZTRVQobWFjKSwgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9LjJ9LCAgMC4wMDEsICAgICAgIDEsIEZMQUdTIH0sCisgICAgeyAic3B3IiwgICAgICAic2V0IHJhdGlvIG9mIHdpZHRoIHJlc2VydmVkIGZvciBzeW5jIGNvZGUgZGV0ZWN0aW9uIiwgICAgICAgICAgICAgIE9GRlNFVChzcHcpLCAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0uMjd9LCAgIDAuMSwgICAgIDAuNywgRkxBR1MgfSwKKyAgICB7ICJtaGQiLCAgICAgICJzZXQgbWF4IHBlYWtzIGhlaWdodCBkaWZmZXJlbmNlIGZvciBzeW5jIGNvZGUgZGV0ZWN0aW9uIiwgICAgICAgICAgT0ZGU0VUKG1oZCksICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPS4xfSwgICAgICAwLCAgICAgMC41LCBGTEFHUyB9LAorICAgIHsgIm1wZCIsICAgICAgInNldCBtYXggcGVha3MgcGVyaW9kIGRpZmZlcmVuY2UgZm9yIHN5bmMgY29kZSBkZXRlY3Rpb24iLCAgICAgICAgICBPRkZTRVQobXBkKSwgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9LjF9LCAgICAgIDAsICAgICAwLjUsIEZMQUdTIH0sCisgICAgeyAibXNkIiwgICAgICAic2V0IGZpcnN0IHR3byBtYXggc3RhcnQgY29kZSBiaXRzIGRpZmZlcmVuY2VzIiwgICAgICAgICAgICAgICAgICAgIE9GRlNFVChtc2QpLCAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0uMDJ9LCAgICAgMCwgICAgIDAuNSwgRkxBR1MgfSwKKyAgICB7ICJiaGQiLCAgICAgICJzZXQgbWluIHJhdGlvIG9mIGJpdHMgaGVpZ2h0IGNvbXBhcmVkIHRvIDNyZCBzdGFydCBjb2RlIGJpdCIsICAgICAgT0ZGU0VUKGJoZCksICAgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPS43NX0sICAwLjAxLCAgICAgICAxLCBGTEFHUyB9LAorICAgIHsgInRoX3ciLCAgICAgInNldCB3aGl0ZSBjb2xvciB0aHJlc2hvbGQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQod3RoKSwgICBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9LjM1fSwgICAwLjEsICAgICAgIDEsIEZMQUdTIH0sCisgICAgeyAidGhfYiIsICAgICAic2V0IGJsYWNrIGNvbG9yIHRocmVzaG9sZCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChidGgpLCAgIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0uMTV9LCAgICAgMCwgICAgIDAuNSwgRkxBR1MgfSwKKyAgICB7ICJjaHAiLCAgICAgICJjaGVjayBhbmQgYXBwbHkgcGFyaXR5IGJpdCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGNocCksICAgQVZfT1BUX1RZUEVfQk9PTCwgIHsuaTY0PSAwfSwgICAgICAwLCAgICAgICAxLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MocmVhZGVpYTYwOCk7CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKmZvcm1hdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeGVsX2ZtdHMpOworICAgIGlmICghZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm9ybWF0cyk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoaW5saW5rLT5mb3JtYXQpOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgUmVhZEVJQTYwOENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKworICAgIGlmIChzLT5lbmQgPj0gaW5saW5rLT5oKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiTGFzdCBsaW5lIHRvIHNjYW4gdG9vIGxhcmdlLCBjbGlwcGluZy5cbiIpOworICAgICAgICBzLT5lbmQgPSBpbmxpbmstPmggLSAxOworICAgIH0KKworICAgIGlmIChzLT5zdGFydCA+IHMtPmVuZCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHJhbmdlLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcy0+bWluX3JhbmdlID0gcy0+bWFjICogKCgxIDw8IGRlcHRoKSAtIDEpOworICAgIHMtPm1heF9wZWFrX2RpZmYgPSBzLT5taGQgKiAoKDEgPDwgZGVwdGgpIC0gMSk7CisgICAgcy0+bWF4X3BlcmlvZF9kaWZmID0gcy0+bXBkICogKCgxIDw8IGRlcHRoKSAtIDEpOworICAgIHMtPm1heF9zdGFydF9kaWZmID0gcy0+bXNkICogKCgxIDw8IGRlcHRoKSAtIDEpOworICAgIHMtPndoaXRlID0gcy0+d3RoICogKCgxIDw8IGRlcHRoKSAtIDEpOworICAgIHMtPmJsYWNrID0gcy0+YnRoICogKCgxIDw8IGRlcHRoKSAtIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGV4dHJhY3RfbGluZShBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluLCBpbnQgbGluZSkKK3sKKyAgICBSZWFkRUlBNjA4Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgbWF4ID0gMCwgbWluID0gSU5UX01BWDsKKyAgICBpbnQgaSwgY2gsIHJhbmdlID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpzcmM7CisgICAgdWludDE2X3QgY2xvY2tbOF1bMl0gPSB7IHsgMCB9IH07CisgICAgY29uc3QgaW50IHN5bmNfd2lkdGggPSBzLT5zcHcgKiBpbi0+d2lkdGg7CisgICAgaW50IGxhc3QgPSAwLCBwZWFrcyA9IDAsIG1heF9wZWFrX2RpZmYgPSAwLCBkaXIgPSBSSVNFOworICAgIGNvbnN0IGludCB3aWR0aF9wZXJfYml0ID0gKGluLT53aWR0aCAtIHN5bmNfd2lkdGgpIC8gMTk7CisgICAgdWludDhfdCBieXRlWzJdID0geyAwIH07CisgICAgaW50IHMxLCBzMiwgczMsIHBhcml0eTsKKworICAgIHNyYyA9ICZpbi0+ZGF0YVswXVtsaW5lICogaW4tPmxpbmVzaXplWzBdXTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3luY193aWR0aDsgaSsrKSB7CisgICAgICAgIG1heCA9IEZGTUFYKG1heCwgc3JjW2ldKTsKKyAgICAgICAgbWluID0gRkZNSU4obWluLCBzcmNbaV0pOworICAgIH0KKworICAgIHJhbmdlID0gbWF4IC0gbWluOworICAgIGlmIChyYW5nZSA8IHMtPm1pbl9yYW5nZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChpID0gMDsgaSA8IHN5bmNfd2lkdGg7IGkrKykgeworICAgICAgICBpbnQgWSA9IHNyY1tpXTsKKworICAgICAgICBpZiAoZGlyID09IFJJU0UpIHsKKyAgICAgICAgICAgIGlmIChZIDwgbGFzdCkgeworICAgICAgICAgICAgICAgIGRpciA9IEZBTEw7CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgPj0gcy0+d2hpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvY2tbcGVha3NdWzBdID0gbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgY2xvY2tbcGVha3NdWzFdID0gaTsKKyAgICAgICAgICAgICAgICAgICAgcGVha3MrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBlYWtzID4gNykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkaXIgPT0gRkFMTCkgeworICAgICAgICAgICAgaWYgKFkgPiBsYXN0ICYmIGxhc3QgPD0gcy0+YmxhY2spIHsKKyAgICAgICAgICAgICAgICBkaXIgPSBSSVNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxhc3QgPSBZOworICAgIH0KKworICAgIGlmIChwZWFrcyAhPSA3KQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQorICAgICAgICBtYXhfcGVha19kaWZmID0gRkZNQVgobWF4X3BlYWtfZGlmZiwgRkZBQlMoY2xvY2tbaV1bMF0gLSBjbG9ja1tpLTFdWzBdKSk7CisKKyAgICBpZiAobWF4X3BlYWtfZGlmZiA+IHMtPm1heF9wZWFrX2RpZmYpCisgICAgICAgIHJldHVybjsKKworICAgIG1heCA9IDA7IG1pbiA9IElOVF9NQVg7CisgICAgZm9yIChpID0gMTsgaSA8IDc7IGkrKykgeworICAgICAgICBtYXggPSBGRk1BWChtYXgsIEZGQUJTKGNsb2NrW2ldWzFdIC0gY2xvY2tbaS0xXVsxXSkpOworICAgICAgICBtaW4gPSBGRk1JTihtaW4sIEZGQUJTKGNsb2NrW2ldWzFdIC0gY2xvY2tbaS0xXVsxXSkpOworICAgIH0KKworICAgIHJhbmdlID0gbWF4IC0gbWluOworICAgIGlmIChyYW5nZSA+IHMtPm1heF9wZXJpb2RfZGlmZikKKyAgICAgICAgcmV0dXJuOworCisgICAgczEgPSBzcmNbc3luY193aWR0aCArIHdpZHRoX3Blcl9iaXQgKiAwICsgd2lkdGhfcGVyX2JpdCAvIDJdOworICAgIHMyID0gc3JjW3N5bmNfd2lkdGggKyB3aWR0aF9wZXJfYml0ICogMSArIHdpZHRoX3Blcl9iaXQgLyAyXTsKKyAgICBzMyA9IHNyY1tzeW5jX3dpZHRoICsgd2lkdGhfcGVyX2JpdCAqIDIgKyB3aWR0aF9wZXJfYml0IC8gMl07CisKKyAgICBpZiAoRkZBQlMoczEgLSBzMikgPiBzLT5tYXhfc3RhcnRfZGlmZiB8fCBzMSA+IHMtPmJsYWNrIHx8IHMyID4gcy0+YmxhY2sgfHwgczMgPCBzLT53aGl0ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZm9yIChjaCA9IDA7IGNoIDwgMjsgY2grKykgeworICAgICAgICBmb3IgKHBhcml0eSA9IDAsIGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpbnQgYiA9IHNyY1tzeW5jX3dpZHRoICsgd2lkdGhfcGVyX2JpdCAqIChpICsgMyArIDggKiBjaCkgKyB3aWR0aF9wZXJfYml0IC8gMl07CisKKyAgICAgICAgICAgIGlmIChiIC0gczEgPiAoczMgLSBzMSkgKiBzLT5iaGQpIHsKKyAgICAgICAgICAgICAgICBiID0gMTsKKyAgICAgICAgICAgICAgICBwYXJpdHkrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYiA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlW2NoXSB8PSBiIDw8IGk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+Y2hwKSB7CisgICAgICAgICAgICBpZiAoIShwYXJpdHkgJiAxKSkgeworICAgICAgICAgICAgICAgIGJ5dGVbY2hdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDhfdCBrZXlbMTI4XSwgdmFsdWVbMTI4XTsKKworICAgICAgICBzbnByaW50ZihrZXksIHNpemVvZihrZXkpLCAibGF2ZmkucmVhZGVpYTYwOC4lZC5jYyIsIHMtPm5iX2ZvdW5kKTsKKyAgICAgICAgc25wcmludGYodmFsdWUsIHNpemVvZih2YWx1ZSksICIweCUwMlglMDJYIiwgYnl0ZVswXSwgYnl0ZVsxXSk7CisgICAgICAgIGF2X2RpY3Rfc2V0KCZpbi0+bWV0YWRhdGEsIGtleSwgdmFsdWUsIDApOworCisgICAgICAgIHNucHJpbnRmKGtleSwgc2l6ZW9mKGtleSksICJsYXZmaS5yZWFkZWlhNjA4LiVkLmxpbmUiLCBzLT5uYl9mb3VuZCk7CisgICAgICAgIHNucHJpbnRmKHZhbHVlLCBzaXplb2YodmFsdWUpLCAiJWQiLCBsaW5lKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJmluLT5tZXRhZGF0YSwga2V5LCB2YWx1ZSwgMCk7CisgICAgfQorCisgICAgcy0+bmJfZm91bmQrKzsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBSZWFkRUlBNjA4Q29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIHMtPm5iX2ZvdW5kID0gMDsKKyAgICBmb3IgKGkgPSBzLT5zdGFydDsgaSA8PSBzLT5lbmQ7IGkrKykKKyAgICAgICAgZXh0cmFjdF9saW5lKGN0eCwgaW5saW5rLCBpbiwgaSk7CisKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIGluKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHJlYWRlaWE2MDhfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCByZWFkZWlhNjA4X291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9yZWFkZWlhNjA4ID0geworICAgIC5uYW1lICAgICAgICAgID0gInJlYWRlaWE2MDgiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlJlYWQgRUlBLTYwOCBDbG9zZWQgQ2FwdGlvbiBjb2RlcyBmcm9tIGlucHV0IHZpZGVvIGFuZCB3cml0ZSB0aGVtIHRvIGZyYW1lIG1ldGFkYXRhLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFJlYWRFSUE2MDhDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZyZWFkZWlhNjA4X2NsYXNzLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHJlYWRlaWE2MDhfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gcmVhZGVpYTYwOF9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfcmVhZHZpdGMuYyBiL2xpYmF2ZmlsdGVyL3ZmX3JlYWR2aXRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmOGNkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3JlYWR2aXRjLmMKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVG9iaWFzIFJhcHAKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRmlsdGVyIGZvciByZWFkaW5nIHRoZSB2ZXJ0aWNhbCBpbnRlcnZhbCB0aW1lY29kZSAoVklUQykuCisgKiBTZWUgYWxzbyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9WZXJ0aWNhbF9pbnRlcnZhbF90aW1lY29kZQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBMSU5FX0RBVEFfU0laRSA5CisKK3R5cGVkZWYgc3RydWN0IFJlYWRWaXRjQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBpbnQgc2Nhbl9tYXg7CisgICAgZG91YmxlIHRocl9iOworICAgIGRvdWJsZSB0aHJfdzsKKworICAgIGludCB0aHJlc2hvbGRfYmxhY2s7CisgICAgaW50IHRocmVzaG9sZF93aGl0ZTsKKyAgICBpbnQgdGhyZXNob2xkX2dyYXk7CisgICAgaW50IGdycF93aWR0aDsKKyAgICB1aW50OF90IGxpbmVfZGF0YVtMSU5FX0RBVEFfU0laRV07CisgICAgY2hhciB0Y2J1ZltBVl9USU1FQ09ERV9TVFJfU0laRV07Cit9IFJlYWRWaXRjQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUmVhZFZpdGNDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHJlYWR2aXRjX29wdGlvbnNbXSA9IHsKKyAgICB7ICJzY2FuX21heCIsICJtYXhpbXVtIGxpbmUgbnVtYmVycyB0byBzY2FuIGZvciBWSVRDIGRhdGEiLCBPRkZTRVQoc2Nhbl9tYXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNDUgfSwgLTEsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAidGhyX2IiLCAgICAiYmxhY2sgY29sb3IgdGhyZXNob2xkIiwgT0ZGU0VUKHRocl9iKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibCA9IDAuMiB9LCAwLCAxLjAsIEZMQUdTIH0sCisgICAgeyAidGhyX3ciLCAgICAid2hpdGUgY29sb3IgdGhyZXNob2xkIiwgT0ZGU0VUKHRocl93KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibCA9IDAuNiB9LCAwLCAxLjAsIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhyZWFkdml0Yyk7CisKK3N0YXRpYyB1aW50OF90IGdldF92aXRjX2NyYyggdWludDhfdCAqbGluZSApIHsKKyAgICB1aW50OF90IGNyYzsKKworICAgIGNyYyA9IDB4MDEgfCAobGluZVswXSA8PCAyKTsKKyAgICBjcmMgXj0gKGxpbmVbMF0gPj4gNikgfCAweDA0IHwgKGxpbmVbMV0gPDwgNCk7CisgICAgY3JjIF49IChsaW5lWzFdID4+IDQpIHwgMHgxMCB8IChsaW5lWzJdIDw8IDYpOworICAgIGNyYyBePSAobGluZVsyXSA+PiAyKSB8IDB4NDA7CisgICAgY3JjIF49IGxpbmVbM107CisgICAgY3JjIF49IDB4MDEgfCAobGluZVs0XSA8PCAyKTsKKyAgICBjcmMgXj0gKGxpbmVbNF0gPj4gNikgfCAweDA0IHwgKGxpbmVbNV0gPDwgNCk7CisgICAgY3JjIF49IChsaW5lWzVdID4+IDQpIHwgMHgxMCB8IChsaW5lWzZdIDw8IDYpOworICAgIGNyYyBePSAobGluZVs2XSA+PiAyKSB8IDB4NDA7CisgICAgY3JjIF49IGxpbmVbN107CisgICAgY3JjIF49IDB4MDE7CisgICAgY3JjID0gKGNyYyA+PiAyKSB8IChjcmMgPDwgNik7ICAvLyByb3RhdGUgYnl0ZSByaWdodCBieSB0d28gYml0cworICAgIHJldHVybiBjcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDhfdCBnZXRfcGl0X2F2ZzMoIHVpbnQ4X3QgKmxpbmUsIGludCBpICkgeworICAgIHJldHVybiAoKGxpbmVbaS0xXSArIGxpbmVbaV0gKyBsaW5lW2krMV0pIC8gMyk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF92aXRjX2xpbmUoIFJlYWRWaXRjQ29udGV4dCAqY3R4LCB1aW50OF90ICpzcmMsIGludCBsaW5lX3NpemUsIGludCB3aWR0aCwgaW50IGhlaWdodCApCit7CisgICAgdWludDhfdCAqc2Nhbl9saW5lOworICAgIGludCBncnBfaW5kZXgsIHBpdF9pbmRleDsKKyAgICBpbnQgZ3JwX3N0YXJ0X3BvczsKKyAgICB1aW50OF90IHBpdF92YWx1ZTsKKyAgICBpbnQgeCwgeSwgcmVzID0gMDsKKworICAgIGlmIChjdHgtPnNjYW5fbWF4ID49IDApCisgICAgICAgIGhlaWdodCA9IEZGTUlOKGhlaWdodCwgY3R4LT5zY2FuX21heCk7CisKKyAgICAvLyBzY2FuIGxpbmVzIGZvciBWSVRDIGRhdGEsIHN0YXJ0aW5nIGZyb20gdGhlIHRvcAorICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBzY2FuX2xpbmUgPSBzcmM7CisgICAgICAgIG1lbXNldChjdHgtPmxpbmVfZGF0YSwgMCwgTElORV9EQVRBX1NJWkUpOworICAgICAgICBncnBfaW5kZXggPSAwOworICAgICAgICB4ID0gMDsKKyAgICAgICAgd2hpbGUgKCh4IDwgd2lkdGgpICYmIChncnBfaW5kZXggPCA5KSkgeworICAgICAgICAgICAgLy8gc2VhcmNoIG5leHQgc3luYyBwYXR0ZXJuCisgICAgICAgICAgICB3aGlsZSAoKHggPCB3aWR0aCkgJiYgKHNjYW5fbGluZVt4XSA8IGN0eC0+dGhyZXNob2xkX3doaXRlKSkKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICB3aGlsZSAoKHggPCB3aWR0aCkgJiYgKHNjYW5fbGluZVt4XSA+IGN0eC0+dGhyZXNob2xkX2JsYWNrKSkKKyAgICAgICAgICAgICAgICB4Kys7CisgICAgICAgICAgICB4ID0gRkZNQVgoeCAtICgoY3R4LT5ncnBfd2lkdGgrMTApIC8gMjApLCAxKTsgIC8vIHN0ZXAgYmFjayBhIGhhbGYgcGl0CisgICAgICAgICAgICBncnBfc3RhcnRfcG9zID0geDsKKyAgICAgICAgICAgIGlmICgoZ3JwX3N0YXJ0X3BvcyArIGN0eC0+Z3JwX3dpZHRoKSA+IHdpZHRoKQorICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gbm90IGVub3VnaCBwaXhlbHMgZm9yIHJlYWRpbmcgYSB3aG9sZSBwaXQgZ3JvdXAKKyAgICAgICAgICAgIHBpdF92YWx1ZSA9IGdldF9waXRfYXZnMyhzY2FuX2xpbmUsIHgpOworICAgICAgICAgICAgaWYgKHBpdF92YWx1ZSA8IGN0eC0+dGhyZXNob2xkX3doaXRlKQorICAgICAgICAgICAgICAgYnJlYWs7ICAvLyBmaXJzdCBzeW5jIGJpdCBtaXNtYXRjaAorICAgICAgICAgICAgeCA9IGdycF9zdGFydF9wb3MgKyAoKGN0eC0+Z3JwX3dpZHRoKSAvIDEwKTsKKyAgICAgICAgICAgIHBpdF92YWx1ZSA9IGdldF9waXRfYXZnMyhzY2FuX2xpbmUsIHgpOworICAgICAgICAgICAgaWYgKHBpdF92YWx1ZSA+IGN0eC0+dGhyZXNob2xkX2JsYWNrICkKKyAgICAgICAgICAgICAgICBicmVhazsgIC8vIHNlY29uZCBzeW5jIGJpdCBtaXNtYXRjaAorICAgICAgICAgICAgZm9yIChwaXRfaW5kZXggPSAwOyBwaXRfaW5kZXggPD0gNzsgcGl0X2luZGV4KyspIHsKKyAgICAgICAgICAgICAgICB4ID0gZ3JwX3N0YXJ0X3BvcyArICgoKHBpdF9pbmRleCsyKSpjdHgtPmdycF93aWR0aCkgLyAxMCk7CisgICAgICAgICAgICAgICAgcGl0X3ZhbHVlID0gZ2V0X3BpdF9hdmczKHNjYW5fbGluZSwgeCk7CisgICAgICAgICAgICAgICAgaWYgKHBpdF92YWx1ZSA+IGN0eC0+dGhyZXNob2xkX2dyYXkpCisgICAgICAgICAgICAgICAgICAgIGN0eC0+bGluZV9kYXRhW2dycF9pbmRleF0gfD0gKDEgPDwgcGl0X2luZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdycF9pbmRleCsrOworICAgICAgICB9CisgICAgICAgIGlmICgoZ3JwX2luZGV4ID09IDkpICYmIChnZXRfdml0Y19jcmMoY3R4LT5saW5lX2RhdGEpID09IGN0eC0+bGluZV9kYXRhWzhdKSkgeworICAgICAgICAgICAgcmVzID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHNyYyArPSBsaW5lX3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIHVuc2lnbmVkIGJjZDJ1aW50KHVpbnQ4X3QgaGlnaCwgdWludDhfdCBsb3cpCit7CisgICBpZiAoaGlnaCA+IDkgfHwgbG93ID4gOSkKKyAgICAgICByZXR1cm4gMDsKKyAgIHJldHVybiAxMCpoaWdoICsgbG93OworfQorCitzdGF0aWMgY2hhciAqbWFrZV92aXRjX3RjX3N0cmluZyhjaGFyICpidWYsIHVpbnQ4X3QgKmxpbmUpCit7CisgICAgdW5zaWduZWQgaGggICA9IGJjZDJ1aW50KGxpbmVbN10gJiAweDAzLCBsaW5lWzZdICYgMHgwZik7ICAvLyA2LWJpdCBob3VycworICAgIHVuc2lnbmVkIG1tICAgPSBiY2QydWludChsaW5lWzVdICYgMHgwNywgbGluZVs0XSAmIDB4MGYpOyAgLy8gNy1iaXQgbWludXRlcworICAgIHVuc2lnbmVkIHNzICAgPSBiY2QydWludChsaW5lWzNdICYgMHgwNywgbGluZVsyXSAmIDB4MGYpOyAgLy8gNy1iaXQgc2Vjb25kcworICAgIHVuc2lnbmVkIGZmICAgPSBiY2QydWludChsaW5lWzFdICYgMHgwMywgbGluZVswXSAmIDB4MGYpOyAgLy8gNi1iaXQgZnJhbWVzCisgICAgdW5zaWduZWQgZHJvcCA9IChsaW5lWzFdICYgMHgwNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLWJpdCBkcm9wIGZsYWcKKyAgICBzbnByaW50ZihidWYsIEFWX1RJTUVDT0RFX1NUUl9TSVpFLCAiJTAydTolMDJ1OiUwMnUlYyUwMnUiLAorICAgICAgICAgICAgIGhoLCBtbSwgc3MsIGRyb3AgPyAnOycgOiAnOicsIGZmKTsKKyAgICByZXR1cm4gYnVmOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBSZWFkVml0Y0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT50aHJlc2hvbGRfYmxhY2sgPSBzLT50aHJfYiAqIFVJTlQ4X01BWDsKKyAgICBzLT50aHJlc2hvbGRfd2hpdGUgPSBzLT50aHJfdyAqIFVJTlQ4X01BWDsKKyAgICBpZiAocy0+dGhyZXNob2xkX2JsYWNrID4gcy0+dGhyZXNob2xkX3doaXRlKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiQmxhY2sgY29sb3IgdGhyZXNob2xkIGlzIGhpZ2hlciB0aGFuIHdoaXRlIGNvbG9yIHRocmVzaG9sZCAoJWcgPiAlZylcbiIsCisgICAgICAgICAgICAgICAgcy0+dGhyX2IsIHMtPnRocl93KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcy0+dGhyZXNob2xkX2dyYXkgPSBzLT50aHJlc2hvbGRfd2hpdGUgLSAoKHMtPnRocmVzaG9sZF93aGl0ZSAtIHMtPnRocmVzaG9sZF9ibGFjaykgLyAyKTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJ0aHJlc2hvbGRfYmxhY2s6JWQgdGhyZXNob2xkX3doaXRlOiVkIHRocmVzaG9sZF9ncmF5OiVkXG4iLAorICAgICAgICAgICAgcy0+dGhyZXNob2xkX2JsYWNrLCBzLT50aHJlc2hvbGRfd2hpdGUsIHMtPnRocmVzaG9sZF9ncmF5KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFJlYWRWaXRjQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPmdycF93aWR0aCA9IGlubGluay0+dyAqIDUgLyA0ODsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJ3OiVkIGg6JWQgZ3JwX3dpZHRoOiVkIHNjYW5fbWF4OiVkXG4iLAorICAgICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgsIHMtPmdycF93aWR0aCwgcy0+c2Nhbl9tYXgpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhlbF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfTlYxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9OVjE2LAorICAgICAgICBBVl9QSVhfRk1UX05WMjEsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzX2xpc3QgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeGVsX2ZtdHMpOworICAgIGlmICghZm10c19saXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmbXRzX2xpc3QpOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgUmVhZFZpdGNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBmb3VuZDsKKworICAgIGZvdW5kID0gcmVhZF92aXRjX2xpbmUocywgZnJhbWUtPmRhdGFbMF0sIGZyYW1lLT5saW5lc2l6ZVswXSwgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgIGF2X2RpY3Rfc2V0KCZmcmFtZS0+bWV0YWRhdGEsICJsYXZmaS5yZWFkdml0Yy5mb3VuZCIsIChmb3VuZCA/ICIxIiA6ICIwIiksIDApOworICAgIGlmIChmb3VuZCkKKyAgICAgICAgYXZfZGljdF9zZXQoJmZyYW1lLT5tZXRhZGF0YSwgImxhdmZpLnJlYWR2aXRjLnRjX3N0ciIsIG1ha2Vfdml0Y190Y19zdHJpbmcocy0+dGNidWYsIHMtPmxpbmVfZGF0YSksIDApOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBpbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIG91dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9yZWFkdml0YyA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJyZWFkdml0YyIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVhZCB2ZXJ0aWNhbCBpbnRlcnZhbCB0aW1lY29kZSBhbmQgd3JpdGUgaXQgdG8gZnJhbWUgbWV0YWRhdGEuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoUmVhZFZpdGNDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZyZWFkdml0Y19jbGFzcywKKyAgICAuaW5wdXRzICAgICAgICA9IGlucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IG91dHB1dHMsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9yZW1hcC5jIGIvbGliYXZmaWx0ZXIvdmZfcmVtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQyODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfcmVtYXAuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBGbG9yaXMgU2x1aXRlcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBQaXhlbCByZW1hcCBmaWx0ZXIKKyAqIFRoaXMgZmlsdGVyIGNvcGllcyBwaXhlbCBieSBwaXhlbCBhIHNvdXJjZSBmcmFtZSB0byBhIHRhcmdldCBmcmFtZS4KKyAqIEl0IHJlbWFwcyB0aGUgcGl4ZWxzIHRvIGEgbmV3IHgseSBkZXN0aW5hdGlvbiBiYXNlZCBvbiB0d28gZmlsZXMgeW1hcC94bWFwLgorICogTWFwIGZpbGVzIGFyZSBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgYW5kIGFyZSBpbiBQR00gZm9ybWF0IChQMiBvciBQNSksCisgKiB3aGVyZSB0aGUgdmFsdWVzIGFyZSB5KHJvd3MpL3goY29scykgY29vcmRpbmF0ZXMgb2YgdGhlIHNvdXJjZV9mcmFtZS4KKyAqIFRoZSAqdGFyZ2V0KiBmcmFtZSBkaW1lbnNpb24gaXMgYmFzZWQgb24gbWFwZmlsZSBkaW1lbnNpb25zOiBzcGVjaWZpZWQgaW4gdGhlCisgKiBoZWFkZXIgb2YgdGhlIG1hcGZpbGUgYW5kIHJlZmxlY3RlZCBpbiB0aGUgbnVtYmVyIG9mIGRhdGF2YWx1ZXMuCisgKiBEaW1lbnNpb25zIG9mIHltYXAgYW5kIHhtYXAgbXVzdCBiZSBlcXVhbC4gRGF0YXZhbHVlcyBtdXN0IGJlIHBvc2l0aXZlIG9yIHplcm8uCisgKiBBbnkgZGF0YXZhbHVlIGluIHRoZSB5bWFwIG9yIHhtYXAgd2hpY2ggdmFsdWUgaXMgaGlnaGVyCisgKiB0aGVuIHRoZSAqc291cmNlKiBmcmFtZSBoZWlnaHQgb3Igd2lkdGggaXMgc2lsZW50bHkgaWdub3JlZCwgbGVhdmluZyBhCisgKiBibGFuay9jaHJvbWFrZXkgcGl4ZWwuIFRoaXMgY2FuIHNhZmVseSBiZSB1c2VkIGFzIGEgZmVhdHVyZSB0byBjcmVhdGUgb3ZlcmxheXMuCisgKgorICogQWxnb3JpdGhtIGRpZ2VzdDoKKyAqIFRhcmdldF9mcmFtZVt5XVt4XSA9IFNvdXJjZV9mcmFtZVsgeW1hcFt5XVt4XSBdWyBbeG1hcFt5XVt4XSBdOworICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IFJlbWFwQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IG5iX3BsYW5lczsKKyAgICBpbnQgbmJfY29tcG9uZW50czsKKyAgICBpbnQgc3RlcDsKKyAgICBGRkZyYW1lU3luYyBmczsKKworICAgIHZvaWQgKCpyZW1hcCkoc3RydWN0IFJlbWFwQ29udGV4dCAqcywgY29uc3QgQVZGcmFtZSAqaW4sCisgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICp4aW4sIGNvbnN0IEFWRnJhbWUgKnlpbiwKKyAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKm91dCk7Cit9IFJlbWFwQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoUmVtYXBDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHJlbWFwX29wdGlvbnNbXSA9IHsKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHJlbWFwKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCBBVl9QSVhfRk1UX0JHUjI0LAorICAgICAgICBBVl9QSVhfRk1UX0FSR0IsIEFWX1BJWF9GTVRfQUJHUiwgQVZfUElYX0ZNVF9SR0JBLCBBVl9QSVhfRk1UX0JHUkEsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwgQVZfUElYX0ZNVF9HQlJBUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsIEFWX1BJWF9GTVRfR0JSUDEyLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAxNCwgQVZfUElYX0ZNVF9HQlJQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSQVAxMCwgQVZfUElYX0ZNVF9HQlJBUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCNDgsIEFWX1BJWF9GTVRfQkdSNDgsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQTY0LCBBVl9QSVhfRk1UX0JHUkE2NCwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwKKyAgICAgICAgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG1hcF9mbXRzW10gPSB7CisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTE2LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIEFWRmlsdGVyRm9ybWF0cyAqcGl4X2Zvcm1hdHMgPSBOVUxMLCAqbWFwX2Zvcm1hdHMgPSBOVUxMOworICAgIGludCByZXQ7CisKKyAgICBpZiAoIShwaXhfZm9ybWF0cyA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpKSB8fAorICAgICAgICAhKG1hcF9mb3JtYXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChtYXBfZm10cykpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoKHJldCA9IGZmX2Zvcm1hdHNfcmVmKHBpeF9mb3JtYXRzLCAmY3R4LT5pbnB1dHNbMF0tPm91dF9mb3JtYXRzKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9mb3JtYXRzX3JlZihtYXBfZm9ybWF0cywgJmN0eC0+aW5wdXRzWzFdLT5vdXRfZm9ybWF0cykpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfZm9ybWF0c19yZWYobWFwX2Zvcm1hdHMsICZjdHgtPmlucHV0c1syXS0+b3V0X2Zvcm1hdHMpKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX2Zvcm1hdHNfcmVmKHBpeF9mb3JtYXRzLCAmY3R4LT5vdXRwdXRzWzBdLT5pbl9mb3JtYXRzKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGlmIChwaXhfZm9ybWF0cykKKyAgICAgICAgYXZfZnJlZXAoJnBpeF9mb3JtYXRzLT5mb3JtYXRzKTsKKyAgICBhdl9mcmVlcCgmcGl4X2Zvcm1hdHMpOworICAgIGlmIChtYXBfZm9ybWF0cykKKyAgICAgICAgYXZfZnJlZXAoJm1hcF9mb3JtYXRzLT5mb3JtYXRzKTsKKyAgICBhdl9mcmVlcCgmbWFwX2Zvcm1hdHMpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8qKgorICogcmVtYXBfcGxhbmFyIGFsZ29yaXRobSBleHBlY3RzIHBsYW5lcyBvZiBzYW1lIHNpemUKKyAqIHBpeGVscyBhcmUgY29waWVkIGZyb20gc291cmNlIHRvIHRhcmdldCB1c2luZyA6CisgKiBUYXJnZXRfZnJhbWVbeV1beF0gPSBTb3VyY2VfZnJhbWVbIHltYXBbeV1beF0gXVsgW3htYXBbeV1beF0gXTsKKyAqLworc3RhdGljIHZvaWQgcmVtYXBfcGxhbmFyKFJlbWFwQ29udGV4dCAqcywgY29uc3QgQVZGcmFtZSAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqeGluLCBjb25zdCBBVkZyYW1lICp5aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqb3V0KQoreworICAgIGNvbnN0IGludCB4bGluZXNpemUgPSB4aW4tPmxpbmVzaXplWzBdIC8gMjsKKyAgICBjb25zdCBpbnQgeWxpbmVzaXplID0geWluLT5saW5lc2l6ZVswXSAvIDI7CisgICAgaW50IHggLCB5LCBwbGFuZTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IHMtPm5iX3BsYW5lcyA7IHBsYW5lKyspIHsKKyAgICAgICAgdWludDhfdCAqZHN0ICAgICAgICAgPSBvdXQtPmRhdGFbcGxhbmVdOworICAgICAgICBjb25zdCBpbnQgZGxpbmVzaXplICA9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgICA9IGluLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgY29uc3QgaW50IHNsaW5lc2l6ZSAgPSBpbi0+bGluZXNpemVbcGxhbmVdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqeG1hcCA9IChjb25zdCB1aW50MTZfdCAqKXhpbi0+ZGF0YVswXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnltYXAgPSAoY29uc3QgdWludDE2X3QgKil5aW4tPmRhdGFbMF07CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IG91dC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBvdXQtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoeW1hcFt4XSA8IGluLT5oZWlnaHQgJiYgeG1hcFt4XSA8IGluLT53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeW1hcFt4XSAqIHNsaW5lc2l6ZSArIHhtYXBbeF1dOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICArPSBkbGluZXNpemU7CisgICAgICAgICAgICB4bWFwICs9IHhsaW5lc2l6ZTsKKyAgICAgICAgICAgIHltYXAgKz0geWxpbmVzaXplOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCByZW1hcF9wbGFuYXIxNihSZW1hcENvbnRleHQgKnMsIGNvbnN0IEFWRnJhbWUgKmluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqeGluLCBjb25zdCBBVkZyYW1lICp5aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQpCit7CisgICAgY29uc3QgaW50IHhsaW5lc2l6ZSA9IHhpbi0+bGluZXNpemVbMF0gLyAyOworICAgIGNvbnN0IGludCB5bGluZXNpemUgPSB5aW4tPmxpbmVzaXplWzBdIC8gMjsKKyAgICBpbnQgeCAsIHksIHBsYW5lOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgcy0+bmJfcGxhbmVzIDsgcGxhbmUrKykgeworICAgICAgICB1aW50MTZfdCAqZHN0ICAgICAgICA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV07CisgICAgICAgIGNvbnN0IGludCBkbGluZXNpemUgID0gb3V0LT5saW5lc2l6ZVtwbGFuZV0gLyAyOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjICA9IChjb25zdCB1aW50MTZfdCAqKWluLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgY29uc3QgaW50IHNsaW5lc2l6ZSAgPSBpbi0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnhtYXAgPSAoY29uc3QgdWludDE2X3QgKil4aW4tPmRhdGFbMF07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICp5bWFwID0gKGNvbnN0IHVpbnQxNl90ICopeWluLT5kYXRhWzBdOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBvdXQtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgb3V0LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHltYXBbeF0gPCBpbi0+aGVpZ2h0ICYmIHhtYXBbeF0gPCBpbi0+d2lkdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW3ltYXBbeF0gKiBzbGluZXNpemUgKyB4bWFwW3hdXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCAgKz0gZGxpbmVzaXplOworICAgICAgICAgICAgeG1hcCArPSB4bGluZXNpemU7CisgICAgICAgICAgICB5bWFwICs9IHlsaW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgKiByZW1hcF9wYWNrZWQgYWxnb3JpdGhtIGV4cGVjdHMgcGl4ZWxzIHdpdGggYm90aCBwYWRkZWQgYml0cyAoc3RlcCkgYW5kCisgKiBudW1iZXIgb2YgY29tcG9uZW50cyBjb3JyZWN0bHkgc2V0LgorICogcGl4ZWxzIGFyZSBjb3BpZWQgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0IHVzaW5nIDoKKyAqIFRhcmdldF9mcmFtZVt5XVt4XSA9IFNvdXJjZV9mcmFtZVsgeW1hcFt5XVt4XSBdWyBbeG1hcFt5XVt4XSBdOworICovCitzdGF0aWMgdm9pZCByZW1hcF9wYWNrZWQoUmVtYXBDb250ZXh0ICpzLCBjb25zdCBBVkZyYW1lICppbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICp4aW4sIGNvbnN0IEFWRnJhbWUgKnlpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQpCit7CisgICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhWzBdOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyAgPSBpbi0+ZGF0YVswXTsKKyAgICBjb25zdCBpbnQgZGxpbmVzaXplID0gb3V0LT5saW5lc2l6ZVswXTsKKyAgICBjb25zdCBpbnQgc2xpbmVzaXplID0gaW4tPmxpbmVzaXplWzBdOworICAgIGNvbnN0IGludCB4bGluZXNpemUgPSB4aW4tPmxpbmVzaXplWzBdIC8gMjsKKyAgICBjb25zdCBpbnQgeWxpbmVzaXplID0geWluLT5saW5lc2l6ZVswXSAvIDI7CisgICAgY29uc3QgdWludDE2X3QgKnhtYXAgPSAoY29uc3QgdWludDE2X3QgKil4aW4tPmRhdGFbMF07CisgICAgY29uc3QgdWludDE2X3QgKnltYXAgPSAoY29uc3QgdWludDE2X3QgKil5aW4tPmRhdGFbMF07CisgICAgY29uc3QgaW50IHN0ZXAgPSBzLT5zdGVwOworICAgIGludCBjLCB4LCB5OworCisgICAgZm9yICh5ID0gMDsgeSA8IG91dC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dC0+d2lkdGg7IHgrKykgeworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHMtPm5iX2NvbXBvbmVudHM7IGMrKykgeworICAgICAgICAgICAgICAgIGlmICh5bWFwW3hdIDwgaW4tPmhlaWdodCAmJiB4bWFwW3hdIDwgaW4tPndpZHRoKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICogc3RlcCArIGNdID0gc3JjW3ltYXBbeF0gKiBzbGluZXNpemUgKyB4bWFwW3hdICogc3RlcCArIGNdOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICogc3RlcCArIGNdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZHN0ICArPSBkbGluZXNpemU7CisgICAgICAgIHhtYXAgKz0geGxpbmVzaXplOworICAgICAgICB5bWFwICs9IHlsaW5lc2l6ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHJlbWFwX3BhY2tlZDE2KFJlbWFwQ29udGV4dCAqcywgY29uc3QgQVZGcmFtZSAqaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICp4aW4sIGNvbnN0IEFWRnJhbWUgKnlpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKm91dCkKK3sKKyAgICB1aW50MTZfdCAqZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhWzBdOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmMgID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbMF07CisgICAgY29uc3QgaW50IGRsaW5lc2l6ZSA9IG91dC0+bGluZXNpemVbMF0gLyAyOworICAgIGNvbnN0IGludCBzbGluZXNpemUgPSBpbi0+bGluZXNpemVbMF0gLyAyOworICAgIGNvbnN0IGludCB4bGluZXNpemUgPSB4aW4tPmxpbmVzaXplWzBdIC8gMjsKKyAgICBjb25zdCBpbnQgeWxpbmVzaXplID0geWluLT5saW5lc2l6ZVswXSAvIDI7CisgICAgY29uc3QgdWludDE2X3QgKnhtYXAgPSAoY29uc3QgdWludDE2X3QgKil4aW4tPmRhdGFbMF07CisgICAgY29uc3QgdWludDE2X3QgKnltYXAgPSAoY29uc3QgdWludDE2X3QgKil5aW4tPmRhdGFbMF07CisgICAgY29uc3QgaW50IHN0ZXAgPSBzLT5zdGVwIC8gMjsKKyAgICBpbnQgYywgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBvdXQtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBvdXQtPndpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBzLT5uYl9jb21wb25lbnRzOyBjKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoeW1hcFt4XSA8IGluLT5oZWlnaHQgJiYgeG1hcFt4XSA8IGluLT53aWR0aCkgeworICAgICAgICAgICAgICAgICAgICBkc3RbeCAqIHN0ZXAgKyBjXSA9IHNyY1t5bWFwW3hdICogc2xpbmVzaXplICsgeG1hcFt4XSAqIHN0ZXAgKyBjXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkc3RbeCAqIHN0ZXAgKyBjXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRzdCAgKz0gZGxpbmVzaXplOworICAgICAgICB4bWFwICs9IHhsaW5lc2l6ZTsKKyAgICAgICAgeW1hcCArPSB5bGluZXNpemU7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFJlbWFwQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKyAgICBzLT5uYl9jb21wb25lbnRzID0gZGVzYy0+bmJfY29tcG9uZW50czsKKworICAgIGlmIChkZXNjLT5jb21wWzBdLmRlcHRoID09IDgpIHsKKyAgICAgICAgaWYgKHMtPm5iX3BsYW5lcyA+IDEgfHwgcy0+bmJfY29tcG9uZW50cyA9PSAxKSB7CisgICAgICAgICAgICBzLT5yZW1hcCA9IHJlbWFwX3BsYW5hcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnJlbWFwID0gcmVtYXBfcGFja2VkOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHMtPm5iX3BsYW5lcyA+IDEgfHwgcy0+bmJfY29tcG9uZW50cyA9PSAxKSB7CisgICAgICAgICAgICBzLT5yZW1hcCA9IHJlbWFwX3BsYW5hcjE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcy0+cmVtYXAgPSByZW1hcF9wYWNrZWQxNjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPnN0ZXAgPSBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MpID4+IDM7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvY2Vzc19mcmFtZShGRkZyYW1lU3luYyAqZnMpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBmcy0+cGFyZW50OworICAgIFJlbWFwQ29udGV4dCAqcyA9IGZzLT5vcGFxdWU7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dCwgKmluLCAqeHBpYywgKnlwaWM7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2dldF9mcmFtZSgmcy0+ZnMsIDAsICZpbiwgICAwKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMSwgJnhwaWMsIDApKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoJnMtPmZzLCAyLCAmeXBpYywgMCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmIChjdHgtPmlzX2Rpc2FibGVkKSB7CisgICAgICAgIG91dCA9IGF2X2ZyYW1lX2Nsb25lKGluKTsKKyAgICAgICAgaWYgKCFvdXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgICAgICBzLT5yZW1hcChzLCBpbiwgeHBpYywgeXBpYywgb3V0KTsKKyAgICB9CisgICAgb3V0LT5wdHMgPSBhdl9yZXNjYWxlX3EoaW4tPnB0cywgcy0+ZnMudGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFJlbWFwQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKnNyY2xpbmsgPSBjdHgtPmlucHV0c1swXTsKKyAgICBBVkZpbHRlckxpbmsgKnhsaW5rID0gY3R4LT5pbnB1dHNbMV07CisgICAgQVZGaWx0ZXJMaW5rICp5bGluayA9IGN0eC0+aW5wdXRzWzJdOworICAgIEZGRnJhbWVTeW5jSW4gKmluOworICAgIGludCByZXQ7CisKKyAgICBpZiAoeGxpbmstPncgIT0geWxpbmstPncgfHwgeGxpbmstPmggIT0geWxpbmstPmgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiU2Vjb25kIGlucHV0IGxpbmsgJXMgcGFyYW1ldGVycyAiCisgICAgICAgICAgICAgICAiKHNpemUgJWR4JWQpIGRvIG5vdCBtYXRjaCB0aGUgY29ycmVzcG9uZGluZyAiCisgICAgICAgICAgICAgICAidGhpcmQgaW5wdXQgbGluayAlcyBwYXJhbWV0ZXJzICglZHglZClcbiIsCisgICAgICAgICAgICAgICBjdHgtPmlucHV0X3BhZHNbMV0ubmFtZSwgeGxpbmstPncsIHhsaW5rLT5oLAorICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzJdLm5hbWUsIHlsaW5rLT53LCB5bGluay0+aCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgb3V0bGluay0+dyA9IHhsaW5rLT53OworICAgIG91dGxpbmstPmggPSB4bGluay0+aDsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBzcmNsaW5rLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHNyY2xpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IHNyY2xpbmstPmZyYW1lX3JhdGU7CisKKyAgICByZXQgPSBmZl9mcmFtZXN5bmNfaW5pdCgmcy0+ZnMsIGN0eCwgMyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpbiA9IHMtPmZzLmluOworICAgIGluWzBdLnRpbWVfYmFzZSA9IHNyY2xpbmstPnRpbWVfYmFzZTsKKyAgICBpblsxXS50aW1lX2Jhc2UgPSB4bGluay0+dGltZV9iYXNlOworICAgIGluWzJdLnRpbWVfYmFzZSA9IHlsaW5rLT50aW1lX2Jhc2U7CisgICAgaW5bMF0uc3luYyAgID0gMjsKKyAgICBpblswXS5iZWZvcmUgPSBFWFRfU1RPUDsKKyAgICBpblswXS5hZnRlciAgPSBFWFRfU1RPUDsKKyAgICBpblsxXS5zeW5jICAgPSAxOworICAgIGluWzFdLmJlZm9yZSA9IEVYVF9OVUxMOworICAgIGluWzFdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBpblsyXS5zeW5jICAgPSAxOworICAgIGluWzJdLmJlZm9yZSA9IEVYVF9OVUxMOworICAgIGluWzJdLmFmdGVyICA9IEVYVF9JTkZJTklUWTsKKyAgICBzLT5mcy5vcGFxdWUgICA9IHM7CisgICAgcy0+ZnMub25fZXZlbnQgPSBwcm9jZXNzX2ZyYW1lOworCisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKTsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBSZW1hcENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19hY3RpdmF0ZSgmcy0+ZnMpOworfQorCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFJlbWFwQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHJlbWFwX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJzb3VyY2UiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gInhtYXAiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gInltYXAiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCByZW1hcF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9yZW1hcCA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJyZW1hcCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUmVtYXAgcGl4ZWxzLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFJlbWFwQ29udGV4dCksCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgID0gYWN0aXZhdGUsCisgICAgLmlucHV0cyAgICAgICAgPSByZW1hcF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSByZW1hcF9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnJlbWFwX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfcmVtb3ZlZ3JhaW4uYyBiL2xpYmF2ZmlsdGVyL3ZmX3JlbW92ZWdyYWluLmMKaW5kZXggOGVmMDk3NC4uYmM0NTA3NiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfcmVtb3ZlZ3JhaW4uYworKysgYi9saWJhdmZpbHRlci92Zl9yZW1vdmVncmFpbi5jCkBAIC02MTksNyArNjE5LDcgQEAKIAogICAgICAgICB0ZC5pbiA9IGluOyB0ZC5vdXQgPSBvdXQ7IHRkLnBsYW5lID0gaTsKICAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKHMtPnBsYW5laGVpZ2h0W2ldLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4ocy0+cGxhbmVoZWlnaHRbaV0sIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAKICAgICAgICAgc3JjID0gaW4tPmRhdGFbaV0gKyAocy0+cGxhbmVoZWlnaHRbaV0gLSAxKSAqIGluLT5saW5lc2l6ZVtpXTsKICAgICAgICAgZHN0ID0gb3V0LT5kYXRhW2ldICsgKHMtPnBsYW5laGVpZ2h0W2ldIC0gMSkgKiBvdXQtPmxpbmVzaXplW2ldOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfcmVtb3ZlbG9nby5jIGIvbGliYXZmaWx0ZXIvdmZfcmVtb3ZlbG9nby5jCmluZGV4IDk0YjkyYTUuLmFmZjJkMTIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3JlbW92ZWxvZ28uYworKysgYi9saWJhdmZpbHRlci92Zl9yZW1vdmVsb2dvLmMKQEAgLTc5LDcgKzc5LDcgQEAKICNpbmNsdWRlICJsYXZmdXRpbHMuaCIKICNpbmNsdWRlICJsc3dzdXRpbHMuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgUmVtb3ZlbG9nb0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGNoYXIgKmZpbGVuYW1lOwogICAgIC8qIFN0b3JlcyBvdXIgY29sbGVjdGlvbiBvZiBtYXNrcy4gVGhlIGZpcnN0IGlzIGZvciBhbiBhcnJheSBvZgpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfcm90YXRlLmMgYi9saWJhdmZpbHRlci92Zl9yb3RhdGUuYwppbmRleCA0N2RjMDFlLi4zNzFmZjdmIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9yb3RhdGUuYworKysgYi9saWJhdmZpbHRlci92Zl9yb3RhdGUuYwpAQCAtNjAsNyArNjAsNyBAQAogICAgIFZBUl9WQVJTX05CCiB9OwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBSb3RDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBkb3VibGUgYW5nbGU7CiAgICAgY2hhciAqYW5nbGVfZXhwcl9zdHI7ICAgLy8vPCBleHByZXNzaW9uIGZvciB0aGUgYW5nbGUKQEAgLTc3LDYgKzc3LDkgQEAKICAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJfVkFSU19OQl07CiAgICAgRkZEcmF3Q29udGV4dCBkcmF3OwogICAgIEZGRHJhd0NvbG9yIGNvbG9yOworICAgIHVpbnQ4X3QgKigqaW50ZXJwb2xhdGVfYmlsaW5lYXIpKHVpbnQ4X3QgKmRzdF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSwgaW50IHNyY19saW5lc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IG1heF94LCBpbnQgbWF4X3kpOwogfSBSb3RDb250ZXh0OwogCiB0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKQEAgLTE0Miw2ICsxNDUsMTQgQEAKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwTEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwTEUsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMExFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxMkxFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMkxFLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNkxFLCBBVl9QSVhfRk1UX1lVVkE0NDRQMTZMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTZMRSwgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2TEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDlMRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDlMRSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOUxFLCBBVl9QSVhfRk1UX1lVVkE0MjBQOUxFLAogICAgICAgICBBVl9QSVhfRk1UX05PTkUKICAgICB9OwogCkBAIC0xODcsNiArMTk4LDkzIEBACiAgICAgTlVMTAogfTsKIAorI2RlZmluZSBGSVhQICgxPDwxNikKKyNkZWZpbmUgRklYUDIgKDE8PDIwKQorI2RlZmluZSBJTlRfUEkgMzI5NDE5OSAvLyhNX1BJICogRklYUDIpCisKKy8qKgorICogQ29tcHV0ZSB0aGUgc2luIG9mIGEgdXNpbmcgaW50ZWdlciB2YWx1ZXMuCisgKiBJbnB1dCBpcyBzY2FsZWQgYnkgRklYUDIgYW5kIG91dHB1dCB2YWx1ZXMgYXJlIHNjYWxlZCBieSBGSVhQLgorICovCitzdGF0aWMgaW50NjRfdCBpbnRfc2luKGludDY0X3QgYSkKK3sKKyAgICBpbnQ2NF90IGEyLCByZXMgPSAwOworICAgIGludCBpOworICAgIGlmIChhIDwgMCkgYSA9IElOVF9QSS1hOyAvLyAwLi5pbmYKKyAgICBhICU9IDIgKiBJTlRfUEk7ICAgICAgICAgLy8gMC4uMlBJCisKKyAgICBpZiAoYSA+PSBJTlRfUEkqMy8yKSBhIC09IDIqSU5UX1BJOyAgLy8gLVBJLzIgLi4gM1BJLzIKKyAgICBpZiAoYSA+PSBJTlRfUEkvMiAgKSBhID0gSU5UX1BJIC0gYTsgLy8gLVBJLzIgLi4gIFBJLzIKKworICAgIC8qIGNvbXB1dGUgc2luIHVzaW5nIFRheWxvciBzZXJpZXMgYXBwcm94aW1hdGVkIHRvIHRoZSBmaWZ0aCB0ZXJtICovCisgICAgYTIgPSAoYSphKS8oRklYUDIpOworICAgIGZvciAoaSA9IDI7IGkgPCAxMTsgaSArPSAyKSB7CisgICAgICAgIHJlcyArPSBhOworICAgICAgICBhID0gLWEqYTIgLyAoRklYUDIqaSooaSsxKSk7CisgICAgfQorICAgIHJldHVybiAocmVzICsgOCk+PjQ7Cit9CisKKy8qKgorICogSW50ZXJwb2xhdGUgdGhlIGNvbG9yIGluIHNyYyBhdCBwb3NpdGlvbiB4IGFuZCB5IHVzaW5nIGJpbGluZWFyCisgKiBpbnRlcnBvbGF0aW9uLgorICovCitzdGF0aWMgdWludDhfdCAqaW50ZXJwb2xhdGVfYmlsaW5lYXI4KHVpbnQ4X3QgKmRzdF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCBpbnQgc3JjX2xpbmVzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCBtYXhfeCwgaW50IG1heF95KQoreworICAgIGludCBpbnRfeCA9IGF2X2NsaXAoeD4+MTYsIDAsIG1heF94KTsKKyAgICBpbnQgaW50X3kgPSBhdl9jbGlwKHk+PjE2LCAwLCBtYXhfeSk7CisgICAgaW50IGZyYWNfeCA9IHgmMHhGRkZGOworICAgIGludCBmcmFjX3kgPSB5JjB4RkZGRjsKKyAgICBpbnQgaTsKKyAgICBpbnQgaW50X3gxID0gRkZNSU4oaW50X3grMSwgbWF4X3gpOworICAgIGludCBpbnRfeTEgPSBGRk1JTihpbnRfeSsxLCBtYXhfeSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2xpbmVzdGVwOyBpKyspIHsKKyAgICAgICAgaW50IHMwMCA9IHNyY1tzcmNfbGluZXN0ZXAgKiBpbnRfeCAgKyBpICsgc3JjX2xpbmVzaXplICogaW50X3kgXTsKKyAgICAgICAgaW50IHMwMSA9IHNyY1tzcmNfbGluZXN0ZXAgKiBpbnRfeDEgKyBpICsgc3JjX2xpbmVzaXplICogaW50X3kgXTsKKyAgICAgICAgaW50IHMxMCA9IHNyY1tzcmNfbGluZXN0ZXAgKiBpbnRfeCAgKyBpICsgc3JjX2xpbmVzaXplICogaW50X3kxXTsKKyAgICAgICAgaW50IHMxMSA9IHNyY1tzcmNfbGluZXN0ZXAgKiBpbnRfeDEgKyBpICsgc3JjX2xpbmVzaXplICogaW50X3kxXTsKKyAgICAgICAgaW50IHMwID0gKCgoMTw8MTYpIC0gZnJhY194KSpzMDAgKyBmcmFjX3gqczAxKTsKKyAgICAgICAgaW50IHMxID0gKCgoMTw8MTYpIC0gZnJhY194KSpzMTAgKyBmcmFjX3gqczExKTsKKworICAgICAgICBkc3RfY29sb3JbaV0gPSAoKGludDY0X3QpKCgxPDwxNikgLSBmcmFjX3kpKnMwICsgKGludDY0X3QpZnJhY195KnMxKSA+PiAzMjsKKyAgICB9CisKKyAgICByZXR1cm4gZHN0X2NvbG9yOworfQorCisvKioKKyAqIEludGVycG9sYXRlIHRoZSBjb2xvciBpbiBzcmMgYXQgcG9zaXRpb24geCBhbmQgeSB1c2luZyBiaWxpbmVhcgorICogaW50ZXJwb2xhdGlvbi4KKyAqLworc3RhdGljIHVpbnQ4X3QgKmludGVycG9sYXRlX2JpbGluZWFyMTYodWludDhfdCAqZHN0X2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCBpbnQgc3JjX2xpbmVzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgbWF4X3gsIGludCBtYXhfeSkKK3sKKyAgICBpbnQgaW50X3ggPSBhdl9jbGlwKHg+PjE2LCAwLCBtYXhfeCk7CisgICAgaW50IGludF95ID0gYXZfY2xpcCh5Pj4xNiwgMCwgbWF4X3kpOworICAgIGludCBmcmFjX3ggPSB4JjB4RkZGRjsKKyAgICBpbnQgZnJhY195ID0geSYweEZGRkY7CisgICAgaW50IGk7CisgICAgaW50IGludF94MSA9IEZGTUlOKGludF94KzEsIG1heF94KTsKKyAgICBpbnQgaW50X3kxID0gRkZNSU4oaW50X3krMSwgbWF4X3kpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNyY19saW5lc3RlcDsgaSs9MikgeworICAgICAgICBpbnQgczAwID0gQVZfUkwxNigmc3JjW3NyY19saW5lc3RlcCAqIGludF94ICArIGkgKyBzcmNfbGluZXNpemUgKiBpbnRfeSBdKTsKKyAgICAgICAgaW50IHMwMSA9IEFWX1JMMTYoJnNyY1tzcmNfbGluZXN0ZXAgKiBpbnRfeDEgKyBpICsgc3JjX2xpbmVzaXplICogaW50X3kgXSk7CisgICAgICAgIGludCBzMTAgPSBBVl9STDE2KCZzcmNbc3JjX2xpbmVzdGVwICogaW50X3ggICsgaSArIHNyY19saW5lc2l6ZSAqIGludF95MV0pOworICAgICAgICBpbnQgczExID0gQVZfUkwxNigmc3JjW3NyY19saW5lc3RlcCAqIGludF94MSArIGkgKyBzcmNfbGluZXNpemUgKiBpbnRfeTFdKTsKKyAgICAgICAgaW50IHMwID0gKCgoMTw8MTYpIC0gZnJhY194KSpzMDAgKyBmcmFjX3gqczAxKTsKKyAgICAgICAgaW50IHMxID0gKCgoMTw8MTYpIC0gZnJhY194KSpzMTAgKyBmcmFjX3gqczExKTsKKworICAgICAgICBBVl9XTDE2KCZkc3RfY29sb3JbaV0sICgoaW50NjRfdCkoKDE8PDE2KSAtIGZyYWNfeSkqczAgKyAoaW50NjRfdClmcmFjX3kqczEpID4+IDMyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZHN0X2NvbG9yOworfQorCiBzdGF0aWMgaW50IGNvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CkBAIC0yMDMsNiArMzAxLDExIEBACiAgICAgcm90LT5oc3ViID0gcGl4ZGVzYy0+bG9nMl9jaHJvbWFfdzsKICAgICByb3QtPnZzdWIgPSBwaXhkZXNjLT5sb2cyX2Nocm9tYV9oOwogCisgICAgaWYgKHBpeGRlc2MtPmNvbXBbMF0uZGVwdGggPT0gOCkKKyAgICAgICAgcm90LT5pbnRlcnBvbGF0ZV9iaWxpbmVhciA9IGludGVycG9sYXRlX2JpbGluZWFyODsKKyAgICBlbHNlCisgICAgICAgIHJvdC0+aW50ZXJwb2xhdGVfYmlsaW5lYXIgPSBpbnRlcnBvbGF0ZV9iaWxpbmVhcjE2OworCiAgICAgcm90LT52YXJfdmFsdWVzW1ZBUl9JTl9XXSA9IHJvdC0+dmFyX3ZhbHVlc1tWQVJfSVddID0gaW5saW5rLT53OwogICAgIHJvdC0+dmFyX3ZhbHVlc1tWQVJfSU5fSF0gPSByb3QtPnZhcl92YWx1ZXNbVkFSX0lIXSA9IGlubGluay0+aDsKICAgICByb3QtPnZhcl92YWx1ZXNbVkFSX0hTVUJdID0gMTw8cm90LT5oc3ViOwpAQCAtMjU1LDYzICszNTgsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0jZGVmaW5lIEZJWFAgKDE8PDE2KQotI2RlZmluZSBGSVhQMiAoMTw8MjApCi0jZGVmaW5lIElOVF9QSSAzMjk0MTk5IC8vKE1fUEkgKiBGSVhQMikKLQotLyoqCi0gKiBDb21wdXRlIHRoZSBzaW4gb2YgYSB1c2luZyBpbnRlZ2VyIHZhbHVlcy4KLSAqIElucHV0IGlzIHNjYWxlZCBieSBGSVhQMiBhbmQgb3V0cHV0IHZhbHVlcyBhcmUgc2NhbGVkIGJ5IEZJWFAuCi0gKi8KLXN0YXRpYyBpbnQ2NF90IGludF9zaW4oaW50NjRfdCBhKQotewotICAgIGludDY0X3QgYTIsIHJlcyA9IDA7Ci0gICAgaW50IGk7Ci0gICAgaWYgKGEgPCAwKSBhID0gSU5UX1BJLWE7IC8vIDAuLmluZgotICAgIGEgJT0gMiAqIElOVF9QSTsgICAgICAgICAvLyAwLi4yUEkKLQotICAgIGlmIChhID49IElOVF9QSSozLzIpIGEgLT0gMipJTlRfUEk7ICAvLyAtUEkvMiAuLiAzUEkvMgotICAgIGlmIChhID49IElOVF9QSS8yICApIGEgPSBJTlRfUEkgLSBhOyAvLyAtUEkvMiAuLiAgUEkvMgotCi0gICAgLyogY29tcHV0ZSBzaW4gdXNpbmcgVGF5bG9yIHNlcmllcyBhcHByb3hpbWF0ZWQgdG8gdGhlIGZpZnRoIHRlcm0gKi8KLSAgICBhMiA9IChhKmEpLyhGSVhQMik7Ci0gICAgZm9yIChpID0gMjsgaSA8IDExOyBpICs9IDIpIHsKLSAgICAgICAgcmVzICs9IGE7Ci0gICAgICAgIGEgPSAtYSphMiAvIChGSVhQMippKihpKzEpKTsKLSAgICB9Ci0gICAgcmV0dXJuIChyZXMgKyA4KT4+NDsKLX0KLQotLyoqCi0gKiBJbnRlcnBvbGF0ZSB0aGUgY29sb3IgaW4gc3JjIGF0IHBvc2l0aW9uIHggYW5kIHkgdXNpbmcgYmlsaW5lYXIKLSAqIGludGVycG9sYXRpb24uCi0gKi8KLXN0YXRpYyB1aW50OF90ICppbnRlcnBvbGF0ZV9iaWxpbmVhcih1aW50OF90ICpkc3RfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLCBpbnQgc3JjX2xpbmVzdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IG1heF94LCBpbnQgbWF4X3kpCi17Ci0gICAgaW50IGludF94ID0gYXZfY2xpcCh4Pj4xNiwgMCwgbWF4X3gpOwotICAgIGludCBpbnRfeSA9IGF2X2NsaXAoeT4+MTYsIDAsIG1heF95KTsKLSAgICBpbnQgZnJhY194ID0geCYweEZGRkY7Ci0gICAgaW50IGZyYWNfeSA9IHkmMHhGRkZGOwotICAgIGludCBpOwotICAgIGludCBpbnRfeDEgPSBGRk1JTihpbnRfeCsxLCBtYXhfeCk7Ci0gICAgaW50IGludF95MSA9IEZGTUlOKGludF95KzEsIG1heF95KTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfbGluZXN0ZXA7IGkrKykgewotICAgICAgICBpbnQgczAwID0gc3JjW3NyY19saW5lc3RlcCAqIGludF94ICArIGkgKyBzcmNfbGluZXNpemUgKiBpbnRfeSBdOwotICAgICAgICBpbnQgczAxID0gc3JjW3NyY19saW5lc3RlcCAqIGludF94MSArIGkgKyBzcmNfbGluZXNpemUgKiBpbnRfeSBdOwotICAgICAgICBpbnQgczEwID0gc3JjW3NyY19saW5lc3RlcCAqIGludF94ICArIGkgKyBzcmNfbGluZXNpemUgKiBpbnRfeTFdOwotICAgICAgICBpbnQgczExID0gc3JjW3NyY19saW5lc3RlcCAqIGludF94MSArIGkgKyBzcmNfbGluZXNpemUgKiBpbnRfeTFdOwotICAgICAgICBpbnQgczAgPSAoKCgxPDwxNikgLSBmcmFjX3gpKnMwMCArIGZyYWNfeCpzMDEpOwotICAgICAgICBpbnQgczEgPSAoKCgxPDwxNikgLSBmcmFjX3gpKnMxMCArIGZyYWNfeCpzMTEpOwotCi0gICAgICAgIGRzdF9jb2xvcltpXSA9ICgoaW50NjRfdCkoKDE8PDE2KSAtIGZyYWNfeSkqczAgKyAoaW50NjRfdClmcmFjX3kqczEpID4+IDMyOwotICAgIH0KLQotICAgIHJldHVybiBkc3RfY29sb3I7Ci19Ci0KIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgY29weV9lbGVtKHVpbnQ4X3QgKnBvdXQsIGNvbnN0IHVpbnQ4X3QgKnBpbiwgaW50IGVsZW1fc2l6ZSkKIHsKICAgICBpbnQgdjsKQEAgLTQyMSw5ICs0NjcsOSBAQAogICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5wX2ludls0XTsgLyogaW50ZXJwb2xhdGVkIGlucHV0IHZhbHVlICovCiAgICAgICAgICAgICAgICAgcG91dCA9IG91dC0+ZGF0YVtwbGFuZV0gKyBqICogb3V0LT5saW5lc2l6ZVtwbGFuZV0gKyBpICogcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV07CiAgICAgICAgICAgICAgICAgaWYgKHJvdC0+dXNlX2JpbGluZWFyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBpbiA9IGludGVycG9sYXRlX2JpbGluZWFyKGlucF9pbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhW3BsYW5lXSwgaW4tPmxpbmVzaXplW3BsYW5lXSwgcm90LT5kcmF3LnBpeGVsc3RlcFtwbGFuZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGludy0xLCBpbmgtMSk7CisgICAgICAgICAgICAgICAgICAgIHBpbiA9IHJvdC0+aW50ZXJwb2xhdGVfYmlsaW5lYXIoaW5wX2ludiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVtwbGFuZV0sIGluLT5saW5lc2l6ZVtwbGFuZV0sIHJvdC0+ZHJhdy5waXhlbHN0ZXBbcGxhbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGludy0xLCBpbmgtMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaW50IHgyID0gYXZfY2xpcCh4MSwgMCwgaW53LTEpOwogICAgICAgICAgICAgICAgICAgICBpbnQgeTIgPSBhdl9jbGlwKHkxLCAwLCBpbmgtMSk7CkBAIC00MzQsNyArNDgwLDggQEAKICAgICAgICAgICAgICAgICAgICAgKnBvdXQgPSAqcGluOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICooKHVpbnQxNl90ICopcG91dCkgPSAqKCh1aW50MTZfdCAqKXBpbik7CisgICAgICAgICAgICAgICAgICAgIHYgPSBBVl9STDE2KHBpbik7CisgICAgICAgICAgICAgICAgICAgIEFWX1dMMTYocG91dCwgdik7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgdiA9IEFWX1JCMjQocGluKTsKQEAgLTQ3NSw3ICs1MjIsNyBAQAogICAgIH0KICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOwogCi0gICAgcm90LT52YXJfdmFsdWVzW1ZBUl9OXSA9IGlubGluay0+ZnJhbWVfY291bnQ7CisgICAgcm90LT52YXJfdmFsdWVzW1ZBUl9OXSA9IGlubGluay0+ZnJhbWVfY291bnRfb3V0OwogICAgIHJvdC0+dmFyX3ZhbHVlc1tWQVJfVF0gPSBUUzJUKGluLT5wdHMsIGlubGluay0+dGltZV9iYXNlKTsKICAgICByb3QtPmFuZ2xlID0gcmVzID0gYXZfZXhwcl9ldmFsKHJvdC0+YW5nbGVfZXhwciwgcm90LT52YXJfdmFsdWVzLCByb3QpOwogCkBAIC01MDYsNyArNTUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBsYW5lID0gcGxhbmUsIC5jID0gYywgLnMgPSBzIH07CiAKIAotICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKG91dGgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihvdXRoLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOwogICAgIH0KIAogICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NhYi5jIGIvbGliYXZmaWx0ZXIvdmZfc2FiLmMKaW5kZXggM2YwOTUxZi4uNmY2MzY1NCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfc2FiLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2FiLmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlICJmb3JtYXRzLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRmlsdGVyUGFyYW0gewogICAgIGZsb2F0IHJhZGl1czsKICAgICBmbG9hdCBwcmVfZmlsdGVyX3JhZGl1czsKICAgICBmbG9hdCBzdHJlbmd0aDsKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICBpbnQgY29sb3JfZGlmZl9jb2VmZltDT0xPUl9ESUZGX0NPRUZGX1NJWkVdOwogfSBGaWx0ZXJQYXJhbTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgU2FiQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgRmlsdGVyUGFyYW0gIGx1bWE7CiAgICAgRmlsdGVyUGFyYW0gIGNocm9tYTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlLmMgYi9saWJhdmZpbHRlci92Zl9zY2FsZS5jCmluZGV4IGFjOWQ0YzMuLmY3NDE0MTkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2NhbGUuYwpAQCAtMjksOSArMjksOSBAQAogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2NhbGUuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgpAQCAtNDEsNDMgKzQxLDEyIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlLmgiCiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB2YXJfbmFtZXNbXSA9IHsKLSAgICAiaW5fdyIsICAgIml3IiwKLSAgICAiaW5faCIsICAgImloIiwKLSAgICAib3V0X3ciLCAgIm93IiwKLSAgICAib3V0X2giLCAgIm9oIiwKLSAgICAiYSIsCi0gICAgInNhciIsCi0gICAgImRhciIsCi0gICAgImhzdWIiLAotICAgICJ2c3ViIiwKLSAgICAib2hzdWIiLAotICAgICJvdnN1YiIsCi0gICAgTlVMTAotfTsKLQotZW51bSB2YXJfbmFtZSB7Ci0gICAgVkFSX0lOX1csICAgVkFSX0lXLAotICAgIFZBUl9JTl9ILCAgIFZBUl9JSCwKLSAgICBWQVJfT1VUX1csICBWQVJfT1csCi0gICAgVkFSX09VVF9ILCAgVkFSX09ILAotICAgIFZBUl9BLAotICAgIFZBUl9TQVIsCi0gICAgVkFSX0RBUiwKLSAgICBWQVJfSFNVQiwKLSAgICBWQVJfVlNVQiwKLSAgICBWQVJfT0hTVUIsCi0gICAgVkFSX09WU1VCLAotICAgIFZBUlNfTkIKLX07Ci0KIGVudW0gRXZhbE1vZGUgewogICAgIEVWQUxfTU9ERV9JTklULAogICAgIEVWQUxfTU9ERV9GUkFNRSwKICAgICBFVkFMX01PREVfTkIKIH07CiAKLQogdHlwZWRlZiBzdHJ1Y3QgU2NhbGVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqc3dzOyAgICAgLy8vPCBzb2Z0d2FyZSBzY2FsZXIgY29udGV4dApAQCAtMjM3LDkgKzIwNiwxMSBAQAogICAgICAgICBjb2xvcnNwYWNlID0gQVZDT0xfU1BDX1NNUFRFMjQwTTsKICAgICB9IGVsc2UgaWYgKHMgJiYgKHN0cnN0cihzLCAiYnQ2MDEiKSB8fCBzdHJzdHIocywgImJ0NDcwIikgfHwgc3Ryc3RyKHMsICJzbXB0ZTE3MG0iKSkpIHsKICAgICAgICAgY29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOworICAgIH0gZWxzZSBpZiAocyAmJiBzdHJzdHIocywgImJ0MjAyMCIpKSB7CisgICAgICAgIGNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQyMDIwX05DTDsKICAgICB9CiAKLSAgICBpZiAoY29sb3JzcGFjZSA8IDEgfHwgY29sb3JzcGFjZSA+IDcpIHsKKyAgICBpZiAoY29sb3JzcGFjZSA8IDEgfHwgY29sb3JzcGFjZSA+IDEwIHx8IGNvbG9yc3BhY2UgPT0gOCkgewogICAgICAgICBjb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNDcwQkc7CiAgICAgfQogCkBAIC0yNTQsNzQgKzIyNSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmstPnNyYy0+aW5wdXRzWzFdIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0Zm10ID0gb3V0bGluay0+Zm9ybWF0OwotICAgIFNjYWxlQ29udGV4dCAqc2NhbGUgPSBjdHgtPnByaXY7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7Ci0gICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpvdXRfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQob3V0bGluay0+Zm9ybWF0KTsKLSAgICBpbnQ2NF90IHcsIGg7Ci0gICAgZG91YmxlIHZhcl92YWx1ZXNbVkFSU19OQl0sIHJlczsKLSAgICBjaGFyICpleHByOworICAgIFNjYWxlQ29udGV4dCAqc2NhbGUgPSBjdHgtPnByaXY7CisgICAgaW50IHcsIGg7CiAgICAgaW50IHJldDsKLSAgICBpbnQgZmFjdG9yX3csIGZhY3Rvcl9oOwogCi0gICAgdmFyX3ZhbHVlc1tWQVJfSU5fV10gID0gdmFyX3ZhbHVlc1tWQVJfSVddID0gaW5saW5rLT53OwotICAgIHZhcl92YWx1ZXNbVkFSX0lOX0hdICA9IHZhcl92YWx1ZXNbVkFSX0lIXSA9IGlubGluay0+aDsKLSAgICB2YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSB2YXJfdmFsdWVzW1ZBUl9PV10gPSBOQU47Ci0gICAgdmFyX3ZhbHVlc1tWQVJfT1VUX0hdID0gdmFyX3ZhbHVlc1tWQVJfT0hdID0gTkFOOwotICAgIHZhcl92YWx1ZXNbVkFSX0FdICAgICA9IChkb3VibGUpIGlubGluay0+dyAvIGlubGluay0+aDsKLSAgICB2YXJfdmFsdWVzW1ZBUl9TQVJdICAgPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8KLSAgICAgICAgKGRvdWJsZSkgaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAvIGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gOiAxOwotICAgIHZhcl92YWx1ZXNbVkFSX0RBUl0gICA9IHZhcl92YWx1ZXNbVkFSX0FdICogdmFyX3ZhbHVlc1tWQVJfU0FSXTsKLSAgICB2YXJfdmFsdWVzW1ZBUl9IU1VCXSAgPSAxIDw8IGRlc2MtPmxvZzJfY2hyb21hX3c7Ci0gICAgdmFyX3ZhbHVlc1tWQVJfVlNVQl0gID0gMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV9oOwotICAgIHZhcl92YWx1ZXNbVkFSX09IU1VCXSA9IDEgPDwgb3V0X2Rlc2MtPmxvZzJfY2hyb21hX3c7Ci0gICAgdmFyX3ZhbHVlc1tWQVJfT1ZTVUJdID0gMSA8PCBvdXRfZGVzYy0+bG9nMl9jaHJvbWFfaDsKLQotICAgIC8qIGV2YWx1YXRlIHdpZHRoIGFuZCBoZWlnaHQgKi8KLSAgICBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gc2NhbGUtPndfZXhwciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOwotICAgIHNjYWxlLT53ID0gdmFyX3ZhbHVlc1tWQVJfT1VUX1ddID0gdmFyX3ZhbHVlc1tWQVJfT1ddID0gcmVzOwotICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCAoZXhwciA9IHNjYWxlLT5oX2V4cHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX3NjYWxlX2V2YWxfZGltZW5zaW9ucyhjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUtPndfZXhwciwgc2NhbGUtPmhfZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmssIG91dGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJncsICZoKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7Ci0gICAgc2NhbGUtPmggPSB2YXJfdmFsdWVzW1ZBUl9PVVRfSF0gPSB2YXJfdmFsdWVzW1ZBUl9PSF0gPSByZXM7Ci0gICAgLyogZXZhbHVhdGUgYWdhaW4gdGhlIHdpZHRoLCBhcyBpdCBtYXkgZGVwZW5kIG9uIHRoZSBvdXRwdXQgaGVpZ2h0ICovCi0gICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gc2NhbGUtPndfZXhwciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgc2NhbGUtPncgPSByZXM7Ci0KLSAgICB3ID0gc2NhbGUtPnc7Ci0gICAgaCA9IHNjYWxlLT5oOwotCi0gICAgLyogQ2hlY2sgaWYgaXQgaXMgcmVxdWVzdGVkIHRoYXQgdGhlIHJlc3VsdCBoYXMgdG8gYmUgZGl2aXNpYmxlIGJ5IGEgc29tZQotICAgICAqIGZhY3RvciAodyBvciBoID0gLW4gd2l0aCBuIGJlaW5nIHRoZSBmYWN0b3IpLiAqLwotICAgIGZhY3Rvcl93ID0gMTsKLSAgICBmYWN0b3JfaCA9IDE7Ci0gICAgaWYgKHcgPCAtMSkgewotICAgICAgICBmYWN0b3JfdyA9IC13OwotICAgIH0KLSAgICBpZiAoaCA8IC0xKSB7Ci0gICAgICAgIGZhY3Rvcl9oID0gLWg7Ci0gICAgfQotCi0gICAgaWYgKHcgPCAwICYmIGggPCAwKQotICAgICAgICBzY2FsZS0+dyA9IHNjYWxlLT5oID0gMDsKLQotICAgIGlmICghKHcgPSBzY2FsZS0+dykpCi0gICAgICAgIHcgPSBpbmxpbmstPnc7Ci0gICAgaWYgKCEoaCA9IHNjYWxlLT5oKSkKLSAgICAgICAgaCA9IGlubGluay0+aDsKLQotICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXN1bHQgaXMgZGl2aXNpYmxlIGJ5IHRoZSBmYWN0b3Igd2UgZGV0ZXJtaW5lZAotICAgICAqIGVhcmxpZXIuIElmIG5vIGZhY3RvciB3YXMgc2V0LCBpdCBpcyBub3RoaW5nIHdpbGwgaGFwcGVuIGFzIHRoZSBkZWZhdWx0Ci0gICAgICogZmFjdG9yIGlzIDEgKi8KLSAgICBpZiAodyA8IDApCi0gICAgICAgIHcgPSBhdl9yZXNjYWxlKGgsIGlubGluay0+dywgaW5saW5rLT5oICogZmFjdG9yX3cpICogZmFjdG9yX3c7Ci0gICAgaWYgKGggPCAwKQotICAgICAgICBoID0gYXZfcmVzY2FsZSh3LCBpbmxpbmstPmgsIGlubGluay0+dyAqIGZhY3Rvcl9oKSAqIGZhY3Rvcl9oOwogCiAgICAgLyogTm90ZSB0aGF0IGZvcmNlX29yaWdpbmFsX2FzcGVjdF9yYXRpbyBtYXkgb3ZlcndyaXRlIHRoZSBwcmV2aW91cyBzZXQKICAgICAgKiBkaW1lbnNpb25zIHNvIHRoYXQgaXQgaXMgbm90IGRpdmlzaWJsZSBieSB0aGUgc2V0IGZhY3RvcnMgYW55bW9yZS4gKi8KQEAgLTM0OCwxMSArMjYxLDEwIEBACiAKICAgICAvKiBUT0RPOiBtYWtlIGFsZ29yaXRobSBjb25maWd1cmFibGUgKi8KIAotICAgIHNjYWxlLT5pbnB1dF9pc19wYWwgPSBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMOworICAgIHNjYWxlLT5pbnB1dF9pc19wYWwgPSBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUw7CiAgICAgaWYgKG91dGZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIG91dGZtdCA9IEFWX1BJWF9GTVRfQkdSODsKICAgICBzY2FsZS0+b3V0cHV0X2lzX3BhbCA9IGF2X3BpeF9mbXRfZGVzY19nZXQob3V0Zm10KS0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGZtdCktPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3BpeF9mbXRfZGVzY19nZXQob3V0Zm10KS0+ZmxhZ3MgJiBGRl9QU0VVRE9QQUw7CiAKICAgICBpZiAoc2NhbGUtPnN3cykKICAgICAgICAgc3dzX2ZyZWVDb250ZXh0KHNjYWxlLT5zd3MpOwpAQCAtMzcyLDYgKzI4NCw3IEBACiAgICAgICAgIGludCBpOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIGludCBpbl92X2Nocl9wb3MgPSBzY2FsZS0+aW5fdl9jaHJfcG9zLCBvdXRfdl9jaHJfcG9zID0gc2NhbGUtPm91dF92X2Nocl9wb3M7CiAgICAgICAgICAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqKnMgPSBzd3Njc1tpXTsKICAgICAgICAgICAgICpzID0gc3dzX2FsbG9jX2NvbnRleHQoKTsKICAgICAgICAgICAgIGlmICghKnMpCkBAIC00MDQsMTcgKzMxNywxNyBAQAogICAgICAgICAgICAgICogTVBFRy0yIGNocm9tYSBwb3NpdGlvbnMgYXJlIHVzZWQgYnkgY29udmVudGlvbgogICAgICAgICAgICAgICogWFhYOiBzdXBwb3J0IG90aGVyIDQ6MjowIHBpeGVsIGZvcm1hdHMgKi8KICAgICAgICAgICAgIGlmIChpbmxpbmswLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQICYmIHNjYWxlLT5pbl92X2Nocl9wb3MgPT0gLTUxMykgewotICAgICAgICAgICAgICAgIHNjYWxlLT5pbl92X2Nocl9wb3MgPSAoaSA9PSAwKSA/IDEyOCA6IChpID09IDEpID8gNjQgOiAxOTI7CisgICAgICAgICAgICAgICAgaW5fdl9jaHJfcG9zID0gKGkgPT0gMCkgPyAxMjggOiAoaSA9PSAxKSA/IDY0IDogMTkyOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAob3V0bGluay0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCAmJiBzY2FsZS0+b3V0X3ZfY2hyX3BvcyA9PSAtNTEzKSB7Ci0gICAgICAgICAgICAgICAgc2NhbGUtPm91dF92X2Nocl9wb3MgPSAoaSA9PSAwKSA/IDEyOCA6IChpID09IDEpID8gNjQgOiAxOTI7CisgICAgICAgICAgICAgICAgb3V0X3ZfY2hyX3BvcyA9IChpID09IDApID8gMTI4IDogKGkgPT0gMSkgPyA2NCA6IDE5MjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQoKnMsICJzcmNfaF9jaHJfcG9zIiwgc2NhbGUtPmluX2hfY2hyX3BvcywgMCk7Ci0gICAgICAgICAgICBhdl9vcHRfc2V0X2ludCgqcywgInNyY192X2Nocl9wb3MiLCBzY2FsZS0+aW5fdl9jaHJfcG9zLCAwKTsKKyAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KCpzLCAic3JjX3ZfY2hyX3BvcyIsIGluX3ZfY2hyX3BvcywgMCk7CiAgICAgICAgICAgICBhdl9vcHRfc2V0X2ludCgqcywgImRzdF9oX2Nocl9wb3MiLCBzY2FsZS0+b3V0X2hfY2hyX3BvcywgMCk7Ci0gICAgICAgICAgICBhdl9vcHRfc2V0X2ludCgqcywgImRzdF92X2Nocl9wb3MiLCBzY2FsZS0+b3V0X3ZfY2hyX3BvcywgMCk7CisgICAgICAgICAgICBhdl9vcHRfc2V0X2ludCgqcywgImRzdF92X2Nocl9wb3MiLCBvdXRfdl9jaHJfcG9zLCAwKTsKIAogICAgICAgICAgICAgaWYgKChyZXQgPSBzd3NfaW5pdF9jb250ZXh0KCpzLCBOVUxMLCBOVUxMKSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC00MjMsMTAgKzMzNiwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pewotICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfbXVsX3EoKEFWUmF0aW9uYWwpe291dGxpbmstPmggKiBpbmxpbmstPncsIG91dGxpbmstPncgKiBpbmxpbmstPmh9LCBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgIGlmIChpbmxpbmswLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSl7CisgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9tdWxfcSgoQVZSYXRpb25hbCl7b3V0bGluay0+aCAqIGlubGluazAtPncsIG91dGxpbmstPncgKiBpbmxpbmswLT5ofSwgaW5saW5rMC0+c2FtcGxlX2FzcGVjdF9yYXRpbyk7CiAgICAgfSBlbHNlCi0gICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmswLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwogCiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ3OiVkIGg6JWQgZm10OiVzIHNhcjolZC8lZCAtPiB3OiVkIGg6JWQgZm10OiVzIHNhcjolZC8lZCBmbGFnczoweCUweFxuIiwKICAgICAgICAgICAgaW5saW5rIC0+dywgaW5saW5rIC0+aCwgYXZfZ2V0X3BpeF9mbXRfbmFtZSggaW5saW5rLT5mb3JtYXQpLApAQCAtNDM3LDEwICszNTAsNiBAQAogICAgIHJldHVybiAwOwogCiBmYWlsOgotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICJFcnJvciB3aGVuIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gJyVzJy5cbiIKLSAgICAgICAgICAgIk1heWJlIHRoZSBleHByZXNzaW9uIGZvciBvdXRfdzonJXMnIG9yIGZvciBvdXRfaDonJXMnIGlzIHNlbGYtcmVmZXJlbmNpbmcuXG4iLAotICAgICAgICAgICBleHByLCBzY2FsZS0+d19leHByLCBzY2FsZS0+aF9leHByKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC00NTIsNiArMzYxLDcgQEAKICAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oOwogICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CiAgICAgb3V0bGluay0+dGltZV9iYXNlID0gaW5saW5rLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGlubGluay0+ZnJhbWVfcmF0ZTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNDk5LDcgKzQwOSw3IEBACiAgICAgY2hhciBidWZbMzJdOwogICAgIGludCBpbl9yYW5nZTsKIAotICAgIGlmIChhdl9mcmFtZV9nZXRfY29sb3JzcGFjZShpbikgPT0gQVZDT0xfU1BDX1lDR0NPKQorICAgIGlmIChpbi0+Y29sb3JzcGFjZSA9PSBBVkNPTF9TUENfWUNHQ08pCiAgICAgICAgIGF2X2xvZyhsaW5rLT5kc3QsIEFWX0xPR19XQVJOSU5HLCAiRGV0ZWN0ZWQgdW5zdXBwb3J0ZWQgWUNnQ28gY29sb3JzcGFjZS5cbiIpOwogCiAgICAgaWYoICAgaW4tPndpZHRoICAhPSBsaW5rLT53CkBAIC01NDYsNyArNDU2LDcgQEAKICAgICBpZihzY2FsZS0+b3V0cHV0X2lzX3BhbCkKICAgICAgICAgYXZwcml2X3NldF9zeXN0ZW1hdGljX3BhbDIoKHVpbnQzMl90KilvdXQtPmRhdGFbMV0sIG91dGxpbmstPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1BBTDggPyBBVl9QSVhfRk1UX0JHUjggOiBvdXRsaW5rLT5mb3JtYXQpOwogCi0gICAgaW5fcmFuZ2UgPSBhdl9mcmFtZV9nZXRfY29sb3JfcmFuZ2UoaW4pOworICAgIGluX3JhbmdlID0gaW4tPmNvbG9yX3JhbmdlOwogCiAgICAgaWYgKCAgIHNjYWxlLT5pbl9jb2xvcl9tYXRyaXgKICAgICAgICAgfHwgc2NhbGUtPm91dF9jb2xvcl9tYXRyaXgKQEAgLTU2MSw3ICs0NzEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJyaWdodG5lc3MsICZjb250cmFzdCwgJnNhdHVyYXRpb24pOwogCiAgICAgICAgIGlmIChzY2FsZS0+aW5fY29sb3JfbWF0cml4KQotICAgICAgICAgICAgaW52X3RhYmxlID0gcGFyc2VfeXV2X3R5cGUoc2NhbGUtPmluX2NvbG9yX21hdHJpeCwgYXZfZnJhbWVfZ2V0X2NvbG9yc3BhY2UoaW4pKTsKKyAgICAgICAgICAgIGludl90YWJsZSA9IHBhcnNlX3l1dl90eXBlKHNjYWxlLT5pbl9jb2xvcl9tYXRyaXgsIGluLT5jb2xvcnNwYWNlKTsKICAgICAgICAgaWYgKHNjYWxlLT5vdXRfY29sb3JfbWF0cml4KQogICAgICAgICAgICAgdGFibGUgICAgID0gcGFyc2VfeXV2X3R5cGUoc2NhbGUtPm91dF9jb2xvcl9tYXRyaXgsIEFWQ09MX1NQQ19VTlNQRUNJRklFRCk7CiAgICAgICAgIGVsc2UgaWYgKHNjYWxlLT5pbl9jb2xvcl9tYXRyaXgpCkBAIC01ODYsNyArNDk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwgb3V0X2Z1bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcywgY29udHJhc3QsIHNhdHVyYXRpb24pOwogCi0gICAgICAgIGF2X2ZyYW1lX3NldF9jb2xvcl9yYW5nZShvdXQsIG91dF9mdWxsID8gQVZDT0xfUkFOR0VfSlBFRyA6IEFWQ09MX1JBTkdFX01QRUcpOworICAgICAgICBvdXQtPmNvbG9yX3JhbmdlID0gb3V0X2Z1bGwgPyBBVkNPTF9SQU5HRV9KUEVHIDogQVZDT0xfUkFOR0VfTVBFRzsKICAgICB9CiAKICAgICBhdl9yZWR1Y2UoJm91dC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICZvdXQtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLApAQCAtNjY3LDcgKzU3Nyw5IEBACiAgICAgeyAgImluX3JhbmdlIiwgInNldCBpbnB1dCBjb2xvciByYW5nZSIsICBPRkZTRVQoIGluX3JhbmdlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0sIDAsIDIsIEZMQUdTLCAicmFuZ2UiIH0sCiAgICAgeyAib3V0X3JhbmdlIiwgInNldCBvdXRwdXQgY29sb3IgcmFuZ2UiLCBPRkZTRVQob3V0X3JhbmdlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0sIDAsIDIsIEZMQUdTLCAicmFuZ2UiIH0sCiAgICAgeyAiYXV0byIsICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQgfSwgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKKyAgICB7ICJ1bmtub3duIiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQgfSwgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKICAgICB7ICJmdWxsIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9SQU5HRV9KUEVHfSwgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKKyAgICB7ICJsaW1pdGVkIixOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9SQU5HRV9NUEVHfSwgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKICAgICB7ICJqcGVnIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9SQU5HRV9KUEVHfSwgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKICAgICB7ICJtcGVnIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9SQU5HRV9NUEVHfSwgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKICAgICB7ICJ0diIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkNPTF9SQU5HRV9NUEVHfSwgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlX2N1ZGEuYyBiL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlX2N1ZGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2FjMjdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2NhbGVfY3VkYS5jCkBAIC0wLDAgKzEsNTU2IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqCisqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorKgorKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2luY2x1ZGUgPGN1ZGEuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X2N1ZGFfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2NhbGUuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHN1cHBvcnRlZF9mb3JtYXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfTlYxMiwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgQVZfUElYX0ZNVF9QMDEwLAorICAgIEFWX1BJWF9GTVRfUDAxNgorfTsKKworI2RlZmluZSBESVZfVVAoYSwgYikgKCAoKGEpICsgKGIpIC0gMSkgLyAoYikgKQorI2RlZmluZSBBTElHTl9VUChhLCBiKSAoKChhKSArIChiKSAtIDEpICYgfigoYikgLSAxKSkKKyNkZWZpbmUgTlVNX0JVRkZFUlMgMgorI2RlZmluZSBCTE9DS1ggMzIKKyNkZWZpbmUgQkxPQ0tZIDE2CisKK3R5cGVkZWYgc3RydWN0IENVREFTY2FsZUNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBpbl9mbXQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9mbXQ7CisKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIGludCBoZWlnaHQ7CisgICAgfSBwbGFuZXNfaW5bM10sIHBsYW5lc19vdXRbM107CisKKyAgICBBVkJ1ZmZlclJlZiAqZnJhbWVzX2N0eDsKKyAgICBBVkZyYW1lICAgICAqZnJhbWU7CisKKyAgICBBVkZyYW1lICp0bXBfZnJhbWU7CisgICAgaW50IHBhc3N0aHJvdWdoOworCisgICAgLyoqCisgICAgICogT3V0cHV0IHN3IGZvcm1hdC4gQVZfUElYX0ZNVF9OT05FIGZvciBubyBjb252ZXJzaW9uLgorICAgICAqLworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQ7CisKKyAgICBjaGFyICp3X2V4cHI7ICAgICAgICAgICAgICAgLy8vPCB3aWR0aCAgZXhwcmVzc2lvbiBzdHJpbmcKKyAgICBjaGFyICpoX2V4cHI7ICAgICAgICAgICAgICAgLy8vPCBoZWlnaHQgZXhwcmVzc2lvbiBzdHJpbmcKKworICAgIENVY29udGV4dCAgIGN1X2N0eDsKKyAgICBDVWV2ZW50ICAgICBjdV9ldmVudDsKKyAgICBDVW1vZHVsZSAgICBjdV9tb2R1bGU7CisgICAgQ1VmdW5jdGlvbiAgY3VfZnVuY191Y2hhcjsKKyAgICBDVWZ1bmN0aW9uICBjdV9mdW5jX3VjaGFyMjsKKyAgICBDVWZ1bmN0aW9uICBjdV9mdW5jX3VjaGFyNDsKKyAgICBDVWZ1bmN0aW9uICBjdV9mdW5jX3VzaG9ydDsKKyAgICBDVWZ1bmN0aW9uICBjdV9mdW5jX3VzaG9ydDI7CisgICAgQ1VmdW5jdGlvbiAgY3VfZnVuY191c2hvcnQ0OworICAgIENVdGV4cmVmICAgIGN1X3RleF91Y2hhcjsKKyAgICBDVXRleHJlZiAgICBjdV90ZXhfdWNoYXIyOworICAgIENVdGV4cmVmICAgIGN1X3RleF91Y2hhcjQ7CisgICAgQ1V0ZXhyZWYgICAgY3VfdGV4X3VzaG9ydDsKKyAgICBDVXRleHJlZiAgICBjdV90ZXhfdXNob3J0MjsKKyAgICBDVXRleHJlZiAgICBjdV90ZXhfdXNob3J0NDsKKworICAgIENVZGV2aWNlcHRyIHNyY0J1ZmZlcjsKKyAgICBDVWRldmljZXB0ciBkc3RCdWZmZXI7CisgICAgaW50ICAgICAgICAgdGV4X2FsaWdubWVudDsKK30gQ1VEQVNjYWxlQ29udGV4dDsKKworc3RhdGljIGF2X2NvbGQgaW50IGN1ZGFzY2FsZV9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIENVREFTY2FsZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5mb3JtYXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgcy0+ZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+ZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT50bXBfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghcy0+dG1wX2ZyYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgY3VkYXNjYWxlX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBDVURBU2NhbGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWUpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+ZnJhbWVzX2N0eCk7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+dG1wX2ZyYW1lKTsKK30KKworc3RhdGljIGludCBjdWRhc2NhbGVfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9DVURBLCBBVl9QSVhfRk1UX05PTkUsCisgICAgfTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKnBpeF9mbXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhlbF9mb3JtYXRzKTsKKworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cyk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0X3N0YWdlKENVREFTY2FsZUNvbnRleHQgKnMsIEFWQnVmZmVyUmVmICpkZXZpY2VfY3R4KQoreworICAgIEFWQnVmZmVyUmVmICpvdXRfcmVmID0gTlVMTDsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqb3V0X2N0eDsKKyAgICBpbnQgaW5fc3csIGluX3NoLCBvdXRfc3csIG91dF9zaDsKKyAgICBpbnQgcmV0LCBpOworCisgICAgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUocy0+aW5fZm10LCAgJmluX3N3LCAgJmluX3NoKTsKKyAgICBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShzLT5vdXRfZm10LCAmb3V0X3N3LCAmb3V0X3NoKTsKKyAgICBpZiAoIXMtPnBsYW5lc19vdXRbMF0ud2lkdGgpIHsKKyAgICAgICAgcy0+cGxhbmVzX291dFswXS53aWR0aCAgPSBzLT5wbGFuZXNfaW5bMF0ud2lkdGg7CisgICAgICAgIHMtPnBsYW5lc19vdXRbMF0uaGVpZ2h0ID0gcy0+cGxhbmVzX2luWzBdLmhlaWdodDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+cGxhbmVzX2luKTsgaSsrKSB7CisgICAgICAgIHMtPnBsYW5lc19pbltpXS53aWR0aCAgID0gcy0+cGxhbmVzX2luWzBdLndpZHRoICAgPj4gaW5fc3c7CisgICAgICAgIHMtPnBsYW5lc19pbltpXS5oZWlnaHQgID0gcy0+cGxhbmVzX2luWzBdLmhlaWdodCAgPj4gaW5fc2g7CisgICAgICAgIHMtPnBsYW5lc19vdXRbaV0ud2lkdGggID0gcy0+cGxhbmVzX291dFswXS53aWR0aCAgPj4gb3V0X3N3OworICAgICAgICBzLT5wbGFuZXNfb3V0W2ldLmhlaWdodCA9IHMtPnBsYW5lc19vdXRbMF0uaGVpZ2h0ID4+IG91dF9zaDsKKyAgICB9CisKKyAgICBvdXRfcmVmID0gYXZfaHdmcmFtZV9jdHhfYWxsb2MoZGV2aWNlX2N0eCk7CisgICAgaWYgKCFvdXRfcmVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG91dF9jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKW91dF9yZWYtPmRhdGE7CisKKyAgICBvdXRfY3R4LT5mb3JtYXQgICAgPSBBVl9QSVhfRk1UX0NVREE7CisgICAgb3V0X2N0eC0+c3dfZm9ybWF0ID0gcy0+b3V0X2ZtdDsKKyAgICBvdXRfY3R4LT53aWR0aCAgICAgPSBGRkFMSUdOKHMtPnBsYW5lc19vdXRbMF0ud2lkdGgsICAzMik7CisgICAgb3V0X2N0eC0+aGVpZ2h0ICAgID0gRkZBTElHTihzLT5wbGFuZXNfb3V0WzBdLmhlaWdodCwgMzIpOworCisgICAgcmV0ID0gYXZfaHdmcmFtZV9jdHhfaW5pdChvdXRfcmVmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYXZfZnJhbWVfdW5yZWYocy0+ZnJhbWUpOworICAgIHJldCA9IGF2X2h3ZnJhbWVfZ2V0X2J1ZmZlcihvdXRfcmVmLCBzLT5mcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHMtPmZyYW1lLT53aWR0aCAgPSBzLT5wbGFuZXNfb3V0WzBdLndpZHRoOworICAgIHMtPmZyYW1lLT5oZWlnaHQgPSBzLT5wbGFuZXNfb3V0WzBdLmhlaWdodDsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+ZnJhbWVzX2N0eCk7CisgICAgcy0+ZnJhbWVzX2N0eCA9IG91dF9yZWY7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfYnVmZmVyX3VucmVmKCZvdXRfcmVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZvcm1hdF9pc19zdXBwb3J0ZWQoZW51bSBBVlBpeGVsRm9ybWF0IGZtdCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfZm9ybWF0cyk7IGkrKykKKyAgICAgICAgaWYgKHN1cHBvcnRlZF9mb3JtYXRzW2ldID09IGZtdCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdF9wcm9jZXNzaW5nX2NoYWluKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfd2lkdGgsIGludCBvdXRfaGVpZ2h0KQoreworICAgIENVREFTY2FsZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqaW5fZnJhbWVzX2N0eDsKKworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBpbl9mb3JtYXQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9mb3JtYXQ7CisgICAgaW50IHJldDsKKworICAgIC8qIGNoZWNrIHRoYXQgd2UgaGF2ZSBhIGh3IGNvbnRleHQgKi8KKyAgICBpZiAoIWN0eC0+aW5wdXRzWzBdLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk5vIGh3IGNvbnRleHQgcHJvdmlkZWQgb24gaW5wdXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpbl9mcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KiljdHgtPmlucHV0c1swXS0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICBpbl9mb3JtYXQgICAgID0gaW5fZnJhbWVzX2N0eC0+c3dfZm9ybWF0OworICAgIG91dF9mb3JtYXQgICAgPSAocy0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgPyBpbl9mb3JtYXQgOiBzLT5mb3JtYXQ7CisKKyAgICBpZiAoIWZvcm1hdF9pc19zdXBwb3J0ZWQoaW5fZm9ybWF0KSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBpbnB1dCBmb3JtYXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbl9mb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisgICAgaWYgKCFmb3JtYXRfaXNfc3VwcG9ydGVkKG91dF9mb3JtYXQpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIG91dHB1dCBmb3JtYXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShvdXRfZm9ybWF0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgaWYgKGluX3dpZHRoID09IG91dF93aWR0aCAmJiBpbl9oZWlnaHQgPT0gb3V0X2hlaWdodCkKKyAgICAgICAgcy0+cGFzc3Rocm91Z2ggPSAxOworCisgICAgcy0+aW5fZm10ID0gaW5fZm9ybWF0OworICAgIHMtPm91dF9mbXQgPSBvdXRfZm9ybWF0OworCisgICAgcy0+cGxhbmVzX2luWzBdLndpZHRoICAgPSBpbl93aWR0aDsKKyAgICBzLT5wbGFuZXNfaW5bMF0uaGVpZ2h0ICA9IGluX2hlaWdodDsKKyAgICBzLT5wbGFuZXNfb3V0WzBdLndpZHRoICA9IG91dF93aWR0aDsKKyAgICBzLT5wbGFuZXNfb3V0WzBdLmhlaWdodCA9IG91dF9oZWlnaHQ7CisKKyAgICByZXQgPSBpbml0X3N0YWdlKHMsIGluX2ZyYW1lc19jdHgtPmRldmljZV9yZWYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgY3R4LT5vdXRwdXRzWzBdLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihzLT5mcmFtZXNfY3R4KTsKKyAgICBpZiAoIWN0eC0+b3V0cHV0c1swXS0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgY3VkYXNjYWxlX2NvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKKyAgICBDVURBU2NhbGVDb250ZXh0ICpzICA9IGN0eC0+cHJpdjsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWlubGluay0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICBBVkNVREFEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBmcmFtZXNfY3R4LT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBDVWNvbnRleHQgZHVtbXksIGN1ZGFfY3R4ID0gZGV2aWNlX2h3Y3R4LT5jdWRhX2N0eDsKKyAgICBDVXJlc3VsdCBlcnI7CisgICAgaW50IHcsIGg7CisgICAgaW50IHJldDsKKworICAgIGV4dGVybiBjaGFyIHZmX3NjYWxlX2N1ZGFfcHR4W107CisKKyAgICBlcnIgPSBjdUN0eFB1c2hDdXJyZW50KGN1ZGFfY3R4KTsKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwdXNoaW5nIGN1ZGEgY29udGV4dFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IGN1TW9kdWxlTG9hZERhdGEoJnMtPmN1X21vZHVsZSwgdmZfc2NhbGVfY3VkYV9wdHgpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGxvYWRpbmcgbW9kdWxlIGRhdGFcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdU1vZHVsZUdldEZ1bmN0aW9uKCZzLT5jdV9mdW5jX3VjaGFyLCBzLT5jdV9tb2R1bGUsICJTdWJzYW1wbGVfQmlsaW5lYXJfdWNoYXIiKTsKKyAgICBjdU1vZHVsZUdldEZ1bmN0aW9uKCZzLT5jdV9mdW5jX3VjaGFyMiwgcy0+Y3VfbW9kdWxlLCAiU3Vic2FtcGxlX0JpbGluZWFyX3VjaGFyMiIpOworICAgIGN1TW9kdWxlR2V0RnVuY3Rpb24oJnMtPmN1X2Z1bmNfdWNoYXI0LCBzLT5jdV9tb2R1bGUsICJTdWJzYW1wbGVfQmlsaW5lYXJfdWNoYXI0Iik7CisgICAgY3VNb2R1bGVHZXRGdW5jdGlvbigmcy0+Y3VfZnVuY191c2hvcnQsIHMtPmN1X21vZHVsZSwgIlN1YnNhbXBsZV9CaWxpbmVhcl91c2hvcnQiKTsKKyAgICBjdU1vZHVsZUdldEZ1bmN0aW9uKCZzLT5jdV9mdW5jX3VzaG9ydDIsIHMtPmN1X21vZHVsZSwgIlN1YnNhbXBsZV9CaWxpbmVhcl91c2hvcnQyIik7CisgICAgY3VNb2R1bGVHZXRGdW5jdGlvbigmcy0+Y3VfZnVuY191c2hvcnQ0LCBzLT5jdV9tb2R1bGUsICJTdWJzYW1wbGVfQmlsaW5lYXJfdXNob3J0NCIpOworCisgICAgY3VNb2R1bGVHZXRUZXhSZWYoJnMtPmN1X3RleF91Y2hhciwgcy0+Y3VfbW9kdWxlLCAidWNoYXJfdGV4Iik7CisgICAgY3VNb2R1bGVHZXRUZXhSZWYoJnMtPmN1X3RleF91Y2hhcjIsIHMtPmN1X21vZHVsZSwgInVjaGFyMl90ZXgiKTsKKyAgICBjdU1vZHVsZUdldFRleFJlZigmcy0+Y3VfdGV4X3VjaGFyNCwgcy0+Y3VfbW9kdWxlLCAidWNoYXI0X3RleCIpOworICAgIGN1TW9kdWxlR2V0VGV4UmVmKCZzLT5jdV90ZXhfdXNob3J0LCBzLT5jdV9tb2R1bGUsICJ1c2hvcnRfdGV4Iik7CisgICAgY3VNb2R1bGVHZXRUZXhSZWYoJnMtPmN1X3RleF91c2hvcnQyLCBzLT5jdV9tb2R1bGUsICJ1c2hvcnQyX3RleCIpOworICAgIGN1TW9kdWxlR2V0VGV4UmVmKCZzLT5jdV90ZXhfdXNob3J0NCwgcy0+Y3VfbW9kdWxlLCAidXNob3J0NF90ZXgiKTsKKworICAgIGN1VGV4UmVmU2V0RmxhZ3Mocy0+Y3VfdGV4X3VjaGFyLCBDVV9UUlNGX1JFQURfQVNfSU5URUdFUik7CisgICAgY3VUZXhSZWZTZXRGbGFncyhzLT5jdV90ZXhfdWNoYXIyLCBDVV9UUlNGX1JFQURfQVNfSU5URUdFUik7CisgICAgY3VUZXhSZWZTZXRGbGFncyhzLT5jdV90ZXhfdWNoYXI0LCBDVV9UUlNGX1JFQURfQVNfSU5URUdFUik7CisgICAgY3VUZXhSZWZTZXRGbGFncyhzLT5jdV90ZXhfdXNob3J0LCBDVV9UUlNGX1JFQURfQVNfSU5URUdFUik7CisgICAgY3VUZXhSZWZTZXRGbGFncyhzLT5jdV90ZXhfdXNob3J0MiwgQ1VfVFJTRl9SRUFEX0FTX0lOVEVHRVIpOworICAgIGN1VGV4UmVmU2V0RmxhZ3Mocy0+Y3VfdGV4X3VzaG9ydDQsIENVX1RSU0ZfUkVBRF9BU19JTlRFR0VSKTsKKworICAgIGN1VGV4UmVmU2V0RmlsdGVyTW9kZShzLT5jdV90ZXhfdWNoYXIsIENVX1RSX0ZJTFRFUl9NT0RFX0xJTkVBUik7CisgICAgY3VUZXhSZWZTZXRGaWx0ZXJNb2RlKHMtPmN1X3RleF91Y2hhcjIsIENVX1RSX0ZJTFRFUl9NT0RFX0xJTkVBUik7CisgICAgY3VUZXhSZWZTZXRGaWx0ZXJNb2RlKHMtPmN1X3RleF91Y2hhcjQsIENVX1RSX0ZJTFRFUl9NT0RFX0xJTkVBUik7CisgICAgY3VUZXhSZWZTZXRGaWx0ZXJNb2RlKHMtPmN1X3RleF91c2hvcnQsIENVX1RSX0ZJTFRFUl9NT0RFX0xJTkVBUik7CisgICAgY3VUZXhSZWZTZXRGaWx0ZXJNb2RlKHMtPmN1X3RleF91c2hvcnQyLCBDVV9UUl9GSUxURVJfTU9ERV9MSU5FQVIpOworICAgIGN1VGV4UmVmU2V0RmlsdGVyTW9kZShzLT5jdV90ZXhfdXNob3J0NCwgQ1VfVFJfRklMVEVSX01PREVfTElORUFSKTsKKworICAgIGN1Q3R4UG9wQ3VycmVudCgmZHVtbXkpOworCisgICAgaWYgKChyZXQgPSBmZl9zY2FsZV9ldmFsX2RpbWVuc2lvbnMocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53X2V4cHIsIHMtPmhfZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmssIG91dGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJncsICZoKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoKChpbnQ2NF90KWggKiBpbmxpbmstPncpID4gSU5UX01BWCAgfHwKKyAgICAgICAgKChpbnQ2NF90KXcgKiBpbmxpbmstPmgpID4gSU5UX01BWCkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUmVzY2FsZWQgdmFsdWUgZm9yIHdpZHRoIG9yIGhlaWdodCBpcyB0b28gYmlnLlxuIik7CisKKyAgICBvdXRsaW5rLT53ID0gdzsKKyAgICBvdXRsaW5rLT5oID0gaDsKKworICAgIHJldCA9IGluaXRfcHJvY2Vzc2luZ19jaGFpbihjdHgsIGlubGluay0+dywgaW5saW5rLT5oLCB3LCBoKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAidzolZCBoOiVkIC0+IHc6JWQgaDolZFxuIiwKKyAgICAgICAgICAgaW5saW5rLT53LCBpbmxpbmstPmgsIG91dGxpbmstPncsIG91dGxpbmstPmgpOworCisgICAgaWYgKGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pIHsKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2X211bF9xKChBVlJhdGlvbmFsKXtvdXRsaW5rLT5oKmlubGluay0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT53KmlubGluay0+aH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBjYWxsX3Jlc2l6ZV9rZXJuZWwoQ1VEQVNjYWxlQ29udGV4dCAqcywgQ1VmdW5jdGlvbiBmdW5jLCBDVXRleHJlZiB0ZXgsIGludCBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY19kcHRyLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwgaW50IHNyY19waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdF9kcHRyLCBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9zaXplKQoreworICAgIENVZGV2aWNlcHRyIHNyY19kZXZwdHIgPSAoQ1VkZXZpY2VwdHIpc3JjX2RwdHI7CisgICAgQ1VkZXZpY2VwdHIgZHN0X2RldnB0ciA9IChDVWRldmljZXB0cilkc3RfZHB0cjsKKyAgICB2b2lkICphcmdzX3VjaGFyW10gPSB7ICZkc3RfZGV2cHRyLCAmZHN0X3dpZHRoLCAmZHN0X2hlaWdodCwgJmRzdF9waXRjaCwgJnNyY193aWR0aCwgJnNyY19oZWlnaHQgfTsKKyAgICBDVURBX0FSUkFZX0RFU0NSSVBUT1IgZGVzYzsKKworICAgIGRlc2MuV2lkdGggID0gc3JjX3dpZHRoOworICAgIGRlc2MuSGVpZ2h0ID0gc3JjX2hlaWdodDsKKyAgICBkZXNjLk51bUNoYW5uZWxzID0gY2hhbm5lbHM7CisgICAgaWYgKHBpeGVsX3NpemUgPT0gMSkgeworICAgICAgICBkZXNjLkZvcm1hdCA9IENVX0FEX0ZPUk1BVF9VTlNJR05FRF9JTlQ4OworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MuRm9ybWF0ID0gQ1VfQURfRk9STUFUX1VOU0lHTkVEX0lOVDE2OworICAgIH0KKworICAgIGN1VGV4UmVmU2V0QWRkcmVzczJEX3YzKHRleCwgJmRlc2MsIHNyY19kZXZwdHIsIHNyY19waXRjaCAqIHBpeGVsX3NpemUpOworICAgIGN1TGF1bmNoS2VybmVsKGZ1bmMsIERJVl9VUChkc3Rfd2lkdGgsIEJMT0NLWCksIERJVl9VUChkc3RfaGVpZ2h0LCBCTE9DS1kpLCAxLCBCTE9DS1gsIEJMT0NLWSwgMSwgMCwgMCwgYXJnc191Y2hhciwgTlVMTCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FsZWN1ZGFfcmVzaXplKEFWRmlsdGVyQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKm91dCwgQVZGcmFtZSAqaW4pCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmluX2ZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWluLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgIENVREFTY2FsZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzd2l0Y2ggKGluX2ZyYW1lc19jdHgtPnN3X2Zvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICBjYWxsX3Jlc2l6ZV9rZXJuZWwocywgcy0+Y3VfZnVuY191Y2hhciwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbMF0sIGluLT53aWR0aCwgaW4tPmhlaWdodCwgaW4tPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzBdLCBvdXQtPndpZHRoLCBvdXQtPmhlaWdodCwgb3V0LT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBjYWxsX3Jlc2l6ZV9rZXJuZWwocywgcy0+Y3VfZnVuY191Y2hhciwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbMF0raW4tPmxpbmVzaXplWzBdKmluLT5oZWlnaHQsIGluLT53aWR0aC8yLCBpbi0+aGVpZ2h0LzIsIGluLT5saW5lc2l6ZVswXS8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzBdK291dC0+bGluZXNpemVbMF0qb3V0LT5oZWlnaHQsIG91dC0+d2lkdGgvMiwgb3V0LT5oZWlnaHQvMiwgb3V0LT5saW5lc2l6ZVswXS8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisgICAgICAgIGNhbGxfcmVzaXplX2tlcm5lbChzLCBzLT5jdV9mdW5jX3VjaGFyLCBzLT5jdV90ZXhfdWNoYXIsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVswXSsgQUxJR05fVVAoKGluLT5saW5lc2l6ZVswXSppbi0+aGVpZ2h0KjUpLzQsIHMtPnRleF9hbGlnbm1lbnQpLCBpbi0+d2lkdGgvMiwgaW4tPmhlaWdodC8yLCBpbi0+bGluZXNpemVbMF0vMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVswXSsob3V0LT5saW5lc2l6ZVswXSpvdXQtPmhlaWdodCo1KS80LCBvdXQtPndpZHRoLzIsIG91dC0+aGVpZ2h0LzIsIG91dC0+bGluZXNpemVbMF0vMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICAgICAgY2FsbF9yZXNpemVfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdWNoYXIsIHMtPmN1X3RleF91Y2hhciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhWzBdLCBpbi0+d2lkdGgsIGluLT5oZWlnaHQsIGluLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVswXSwgb3V0LT53aWR0aCwgb3V0LT5oZWlnaHQsIG91dC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgY2FsbF9yZXNpemVfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdWNoYXIsIHMtPmN1X3RleF91Y2hhciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhWzBdK2luLT5saW5lc2l6ZVswXSppbi0+aGVpZ2h0LCBpbi0+d2lkdGgsIGluLT5oZWlnaHQsIGluLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVswXStvdXQtPmxpbmVzaXplWzBdKm91dC0+aGVpZ2h0LCBvdXQtPndpZHRoLCBvdXQtPmhlaWdodCwgb3V0LT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBjYWxsX3Jlc2l6ZV9rZXJuZWwocywgcy0+Y3VfZnVuY191Y2hhciwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbMF0raW4tPmxpbmVzaXplWzBdKmluLT5oZWlnaHQqMiwgaW4tPndpZHRoLCBpbi0+aGVpZ2h0LCBpbi0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbMF0rb3V0LT5saW5lc2l6ZVswXSpvdXQtPmhlaWdodCoyLCBvdXQtPndpZHRoLCBvdXQtPmhlaWdodCwgb3V0LT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTlYxMjoKKyAgICAgICAgY2FsbF9yZXNpemVfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdWNoYXIsIHMtPmN1X3RleF91Y2hhciwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhWzBdLCBpbi0+d2lkdGgsIGluLT5oZWlnaHQsIGluLT5saW5lc2l6ZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVswXSwgb3V0LT53aWR0aCwgb3V0LT5oZWlnaHQsIG91dC0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgY2FsbF9yZXNpemVfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdWNoYXIyLCBzLT5jdV90ZXhfdWNoYXIyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbMV0sIGluLT53aWR0aC8yLCBpbi0+aGVpZ2h0LzIsIGluLT5saW5lc2l6ZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVswXSArIG91dC0+bGluZXNpemVbMF0gKiAoKG91dC0+aGVpZ2h0ICsgMzEpICYgfjB4MWYpLCBvdXQtPndpZHRoLzIsIG91dC0+aGVpZ2h0LzIsIG91dC0+bGluZXNpemVbMV0vMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUDAxMExFOgorICAgICAgICBjYWxsX3Jlc2l6ZV9rZXJuZWwocywgcy0+Y3VfZnVuY191c2hvcnQsIHMtPmN1X3RleF91c2hvcnQsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVswXSwgaW4tPndpZHRoLCBpbi0+aGVpZ2h0LCBpbi0+bGluZXNpemVbMF0vMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVswXSwgb3V0LT53aWR0aCwgb3V0LT5oZWlnaHQsIG91dC0+bGluZXNpemVbMF0vMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworICAgICAgICBjYWxsX3Jlc2l6ZV9rZXJuZWwocywgcy0+Y3VfZnVuY191c2hvcnQyLCBzLT5jdV90ZXhfdXNob3J0MiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhWzFdLCBpbi0+d2lkdGggLyAyLCBpbi0+aGVpZ2h0IC8gMiwgaW4tPmxpbmVzaXplWzFdLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbMF0gKyBvdXQtPmxpbmVzaXplWzBdICogKChvdXQtPmhlaWdodCArIDMxKSAmIH4weDFmKSwgb3V0LT53aWR0aCAvIDIsIG91dC0+aGVpZ2h0IC8gMiwgb3V0LT5saW5lc2l6ZVsxXSAvIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1AwMTZMRToKKyAgICAgICAgY2FsbF9yZXNpemVfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdXNob3J0LCBzLT5jdV90ZXhfdXNob3J0LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbMF0sIGluLT53aWR0aCwgaW4tPmhlaWdodCwgaW4tPmxpbmVzaXplWzBdIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVswXSwgb3V0LT53aWR0aCwgb3V0LT5oZWlnaHQsIG91dC0+bGluZXNpemVbMF0gLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisgICAgICAgIGNhbGxfcmVzaXplX2tlcm5lbChzLCBzLT5jdV9mdW5jX3VzaG9ydDIsIHMtPmN1X3RleF91c2hvcnQyLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmRhdGFbMV0sIGluLT53aWR0aCAvIDIsIGluLT5oZWlnaHQgLyAyLCBpbi0+bGluZXNpemVbMV0gLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzBdICsgb3V0LT5saW5lc2l6ZVswXSAqICgob3V0LT5oZWlnaHQgKyAzMSkgJiB+MHgxZiksIG91dC0+d2lkdGggLyAyLCBvdXQtPmhlaWdodCAvIDIsIG91dC0+bGluZXNpemVbMV0gLyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdWRhc2NhbGVfc2NhbGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKm91dCwgQVZGcmFtZSAqaW4pCit7CisgICAgQ1VEQVNjYWxlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpzcmMgPSBpbjsKKyAgICBpbnQgcmV0OworCisgICAgcmV0ID0gc2NhbGVjdWRhX3Jlc2l6ZShjdHgsIHMtPmZyYW1lLCBzcmMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc3JjID0gcy0+ZnJhbWU7CisgICAgcmV0ID0gYXZfaHdmcmFtZV9nZXRfYnVmZmVyKHNyYy0+aHdfZnJhbWVzX2N0eCwgcy0+dG1wX2ZyYW1lLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGF2X2ZyYW1lX21vdmVfcmVmKG91dCwgcy0+ZnJhbWUpOworICAgIGF2X2ZyYW1lX21vdmVfcmVmKHMtPmZyYW1lLCBzLT50bXBfZnJhbWUpOworCisgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN1ZGFzY2FsZV9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgICAgICAgICAgICpjdHggPSBsaW5rLT5kc3Q7CisgICAgQ1VEQVNjYWxlQ29udGV4dCAgICAgICAgICAgICAgICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAgICAgICAgICAgICAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKXMtPmZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZDVURBRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4ID0gZnJhbWVzX2N0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisKKyAgICBBVkZyYW1lICpvdXQgPSBOVUxMOworICAgIENVcmVzdWx0IGVycjsKKyAgICBDVWNvbnRleHQgZHVtbXk7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBvdXQgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghb3V0KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IGN1Q3R4UHVzaEN1cnJlbnQoZGV2aWNlX2h3Y3R4LT5jdWRhX2N0eCk7CisgICAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gY3VkYXNjYWxlX3NjYWxlKGN0eCwgb3V0LCBpbik7CisKKyAgICBjdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYXZfcmVkdWNlKCZvdXQtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCAmb3V0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgKGludDY0X3QpaW4tPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICogb3V0bGluay0+aCAqIGxpbmstPncsCisgICAgICAgICAgICAgIChpbnQ2NF90KWluLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAqIG91dGxpbmstPncgKiBsaW5rLT5oLAorICAgICAgICAgICAgICBJTlRfTUFYKTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKENVREFTY2FsZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIChBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0pCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInciLCAgICAgICJPdXRwdXQgdmlkZW8gd2lkdGgiLCAgT0ZGU0VUKHdfZXhwciksICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJpdyIgICB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImgiLCAgICAgICJPdXRwdXQgdmlkZW8gaGVpZ2h0IiwgT0ZGU0VUKGhfZXhwciksICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICJpaCIgICB9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY3VkYXNjYWxlX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImN1ZGFzY2FsZSIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgY3VkYXNjYWxlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBjdWRhc2NhbGVfZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBjdWRhc2NhbGVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGN1ZGFzY2FsZV9jb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfc2NhbGVfY3VkYSA9IHsKKyAgICAubmFtZSAgICAgID0gInNjYWxlX2N1ZGEiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHUFUgYWNjZWxlcmF0ZWQgdmlkZW8gcmVzaXplciIpLAorCisgICAgLmluaXQgICAgICAgICAgPSBjdWRhc2NhbGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IGN1ZGFzY2FsZV91bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBjdWRhc2NhbGVfcXVlcnlfZm9ybWF0cywKKworICAgIC5wcml2X3NpemUgPSBzaXplb2YoQ1VEQVNjYWxlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgPSAmY3VkYXNjYWxlX2NsYXNzLAorCisgICAgLmlucHV0cyAgICA9IGN1ZGFzY2FsZV9pbnB1dHMsCisgICAgLm91dHB1dHMgICA9IGN1ZGFzY2FsZV9vdXRwdXRzLAorCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9zY2FsZV9jdWRhLmN1IGIvbGliYXZmaWx0ZXIvdmZfc2NhbGVfY3VkYS5jdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjVlYzgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2NhbGVfY3VkYS5jdQpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgTlZJRElBIENPUlBPUkFUSU9OLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworZXh0ZXJuICJDIiB7CisKK3RleHR1cmU8dW5zaWduZWQgY2hhciwgMj4gdWNoYXJfdGV4OwordGV4dHVyZTx1Y2hhcjIsIDI+ICB1Y2hhcjJfdGV4OwordGV4dHVyZTx1Y2hhcjQsIDI+ICB1Y2hhcjRfdGV4OwordGV4dHVyZTx1bnNpZ25lZCBzaG9ydCwgMj4gdXNob3J0X3RleDsKK3RleHR1cmU8dXNob3J0MiwgMj4gIHVzaG9ydDJfdGV4OwordGV4dHVyZTx1c2hvcnQ0LCAyPiAgdXNob3J0NF90ZXg7CisKK19fZ2xvYmFsX18gdm9pZCBTdWJzYW1wbGVfQmlsaW5lYXJfdWNoYXIodW5zaWduZWQgY2hhciAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCkKK3sKKyAgICBpbnQgeG8gPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54OworICAgIGludCB5byA9IGJsb2NrSWR4LnkgKiBibG9ja0RpbS55ICsgdGhyZWFkSWR4Lnk7CisKKyAgICBpZiAoeW8gPCBkc3RfaGVpZ2h0ICYmIHhvIDwgZHN0X3dpZHRoKQorICAgIHsKKyAgICAgICAgZmxvYXQgaHNjYWxlID0gKGZsb2F0KXNyY193aWR0aCAvIChmbG9hdClkc3Rfd2lkdGg7CisgICAgICAgIGZsb2F0IHZzY2FsZSA9IChmbG9hdClzcmNfaGVpZ2h0IC8gKGZsb2F0KWRzdF9oZWlnaHQ7CisgICAgICAgIGZsb2F0IHhpID0gKHhvICsgMC41ZikgKiBoc2NhbGU7CisgICAgICAgIGZsb2F0IHlpID0gKHlvICsgMC41ZikgKiB2c2NhbGU7CisgICAgICAgIC8vIDMtdGFwIGZpbHRlciB3ZWlnaHRzIGFyZSB7d2gsMS4wLHdofSBhbmQge3d2LDEuMCx3dn0KKyAgICAgICAgZmxvYXQgd2ggPSBtaW4obWF4KDAuNWYgKiAoaHNjYWxlIC0gMS4wZiksIDAuMGYpLCAxLjBmKTsKKyAgICAgICAgZmxvYXQgd3YgPSBtaW4obWF4KDAuNWYgKiAodnNjYWxlIC0gMS4wZiksIDAuMGYpLCAxLjBmKTsKKyAgICAgICAgLy8gQ29udmVydCB3ZWlnaHRzIHRvIHR3byBiaWxpbmVhciB3ZWlnaHRzIC0+IHt3aCwxLjAsd2h9IC0+IHt3aCwwLjUsMH0gKyB7MCwwLjUsd2h9CisgICAgICAgIGZsb2F0IGR4ID0gd2ggLyAoMC41ZiArIHdoKTsKKyAgICAgICAgZmxvYXQgZHkgPSB3diAvICgwLjVmICsgd3YpOworICAgICAgICBpbnQgeTAgPSB0ZXgyRCh1Y2hhcl90ZXgsIHhpLWR4LCB5aS1keSk7CisgICAgICAgIGludCB5MSA9IHRleDJEKHVjaGFyX3RleCwgeGkrZHgsIHlpLWR5KTsKKyAgICAgICAgaW50IHkyID0gdGV4MkQodWNoYXJfdGV4LCB4aS1keCwgeWkrZHkpOworICAgICAgICBpbnQgeTMgPSB0ZXgyRCh1Y2hhcl90ZXgsIHhpK2R4LCB5aStkeSk7CisgICAgICAgIGRzdFt5bypkc3RfcGl0Y2greG9dID0gKHVuc2lnbmVkIGNoYXIpKCh5MCt5MSt5Mit5MysyKSA+PiAyKTsKKyAgICB9Cit9CisKK19fZ2xvYmFsX18gdm9pZCBTdWJzYW1wbGVfQmlsaW5lYXJfdWNoYXIyKHVjaGFyMiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3RfcGl0Y2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQpCit7CisgICAgaW50IHhvID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKKyAgICBpbnQgeW8gPSBibG9ja0lkeC55ICogYmxvY2tEaW0ueSArIHRocmVhZElkeC55OworCisgICAgaWYgKHlvIDwgZHN0X2hlaWdodCAmJiB4byA8IGRzdF93aWR0aCkKKyAgICB7CisgICAgICAgIGZsb2F0IGhzY2FsZSA9IChmbG9hdClzcmNfd2lkdGggLyAoZmxvYXQpZHN0X3dpZHRoOworICAgICAgICBmbG9hdCB2c2NhbGUgPSAoZmxvYXQpc3JjX2hlaWdodCAvIChmbG9hdClkc3RfaGVpZ2h0OworICAgICAgICBmbG9hdCB4aSA9ICh4byArIDAuNWYpICogaHNjYWxlOworICAgICAgICBmbG9hdCB5aSA9ICh5byArIDAuNWYpICogdnNjYWxlOworICAgICAgICAvLyAzLXRhcCBmaWx0ZXIgd2VpZ2h0cyBhcmUge3doLDEuMCx3aH0gYW5kIHt3diwxLjAsd3Z9CisgICAgICAgIGZsb2F0IHdoID0gbWluKG1heCgwLjVmICogKGhzY2FsZSAtIDEuMGYpLCAwLjBmKSwgMS4wZik7CisgICAgICAgIGZsb2F0IHd2ID0gbWluKG1heCgwLjVmICogKHZzY2FsZSAtIDEuMGYpLCAwLjBmKSwgMS4wZik7CisgICAgICAgIC8vIENvbnZlcnQgd2VpZ2h0cyB0byB0d28gYmlsaW5lYXIgd2VpZ2h0cyAtPiB7d2gsMS4wLHdofSAtPiB7d2gsMC41LDB9ICsgezAsMC41LHdofQorICAgICAgICBmbG9hdCBkeCA9IHdoIC8gKDAuNWYgKyB3aCk7CisgICAgICAgIGZsb2F0IGR5ID0gd3YgLyAoMC41ZiArIHd2KTsKKyAgICAgICAgdWNoYXIyIGMwID0gdGV4MkQodWNoYXIyX3RleCwgeGktZHgsIHlpLWR5KTsKKyAgICAgICAgdWNoYXIyIGMxID0gdGV4MkQodWNoYXIyX3RleCwgeGkrZHgsIHlpLWR5KTsKKyAgICAgICAgdWNoYXIyIGMyID0gdGV4MkQodWNoYXIyX3RleCwgeGktZHgsIHlpK2R5KTsKKyAgICAgICAgdWNoYXIyIGMzID0gdGV4MkQodWNoYXIyX3RleCwgeGkrZHgsIHlpK2R5KTsKKyAgICAgICAgaW50MiB1djsKKyAgICAgICAgdXYueCA9ICgoaW50KWMwLngrKGludCljMS54KyhpbnQpYzIueCsoaW50KWMzLngrMikgPj4gMjsKKyAgICAgICAgdXYueSA9ICgoaW50KWMwLnkrKGludCljMS55KyhpbnQpYzIueSsoaW50KWMzLnkrMikgPj4gMjsKKyAgICAgICAgZHN0W3lvKmRzdF9waXRjaDIreG9dID0gbWFrZV91Y2hhcjIoKHVuc2lnbmVkIGNoYXIpdXYueCwgKHVuc2lnbmVkIGNoYXIpdXYueSk7CisgICAgfQorfQorCitfX2dsb2JhbF9fIHZvaWQgU3Vic2FtcGxlX0JpbGluZWFyX3VjaGFyNCh1Y2hhcjQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LCBpbnQgZHN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQpCit7CisgICAgaW50IHhvID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKKyAgICBpbnQgeW8gPSBibG9ja0lkeC55ICogYmxvY2tEaW0ueSArIHRocmVhZElkeC55OworCisgICAgaWYgKHlvIDwgZHN0X2hlaWdodCAmJiB4byA8IGRzdF93aWR0aCkKKyAgICB7CisgICAgICAgIGZsb2F0IGhzY2FsZSA9IChmbG9hdClzcmNfd2lkdGggLyAoZmxvYXQpZHN0X3dpZHRoOworICAgICAgICBmbG9hdCB2c2NhbGUgPSAoZmxvYXQpc3JjX2hlaWdodCAvIChmbG9hdClkc3RfaGVpZ2h0OworICAgICAgICBmbG9hdCB4aSA9ICh4byArIDAuNWYpICogaHNjYWxlOworICAgICAgICBmbG9hdCB5aSA9ICh5byArIDAuNWYpICogdnNjYWxlOworICAgICAgICAvLyAzLXRhcCBmaWx0ZXIgd2VpZ2h0cyBhcmUge3doLDEuMCx3aH0gYW5kIHt3diwxLjAsd3Z9CisgICAgICAgIGZsb2F0IHdoID0gbWluKG1heCgwLjVmICogKGhzY2FsZSAtIDEuMGYpLCAwLjBmKSwgMS4wZik7CisgICAgICAgIGZsb2F0IHd2ID0gbWluKG1heCgwLjVmICogKHZzY2FsZSAtIDEuMGYpLCAwLjBmKSwgMS4wZik7CisgICAgICAgIC8vIENvbnZlcnQgd2VpZ2h0cyB0byB0d28gYmlsaW5lYXIgd2VpZ2h0cyAtPiB7d2gsMS4wLHdofSAtPiB7d2gsMC41LDB9ICsgezAsMC41LHdofQorICAgICAgICBmbG9hdCBkeCA9IHdoIC8gKDAuNWYgKyB3aCk7CisgICAgICAgIGZsb2F0IGR5ID0gd3YgLyAoMC41ZiArIHd2KTsKKyAgICAgICAgdWNoYXI0IGMwID0gdGV4MkQodWNoYXI0X3RleCwgeGktZHgsIHlpLWR5KTsKKyAgICAgICAgdWNoYXI0IGMxID0gdGV4MkQodWNoYXI0X3RleCwgeGkrZHgsIHlpLWR5KTsKKyAgICAgICAgdWNoYXI0IGMyID0gdGV4MkQodWNoYXI0X3RleCwgeGktZHgsIHlpK2R5KTsKKyAgICAgICAgdWNoYXI0IGMzID0gdGV4MkQodWNoYXI0X3RleCwgeGkrZHgsIHlpK2R5KTsKKyAgICAgICAgaW50NCByZXM7CisgICAgICAgIHJlcy54ID0gICgoaW50KWMwLngrKGludCljMS54KyhpbnQpYzIueCsoaW50KWMzLngrMikgPj4gMjsKKyAgICAgICAgcmVzLnkgPSAgKChpbnQpYzAueSsoaW50KWMxLnkrKGludCljMi55KyhpbnQpYzMueSsyKSA+PiAyOworICAgICAgICByZXMueiA9ICAoKGludCljMC56KyhpbnQpYzEueisoaW50KWMyLnorKGludCljMy56KzIpID4+IDI7CisgICAgICAgIHJlcy53ID0gICgoaW50KWMwLncrKGludCljMS53KyhpbnQpYzIudysoaW50KWMzLncrMikgPj4gMjsKKyAgICAgICAgZHN0W3lvKmRzdF9waXRjaCt4b10gPSBtYWtlX3VjaGFyNCgKKyAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKXJlcy54LCAodW5zaWduZWQgY2hhcilyZXMueSwgKHVuc2lnbmVkIGNoYXIpcmVzLnosICh1bnNpZ25lZCBjaGFyKXJlcy53KTsKKyAgICB9Cit9CisKK19fZ2xvYmFsX18gdm9pZCBTdWJzYW1wbGVfQmlsaW5lYXJfdXNob3J0KHVuc2lnbmVkIHNob3J0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0KQoreworICAgIGludCB4byA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CisgICAgaW50IHlvID0gYmxvY2tJZHgueSAqIGJsb2NrRGltLnkgKyB0aHJlYWRJZHgueTsKKworICAgIGlmICh5byA8IGRzdF9oZWlnaHQgJiYgeG8gPCBkc3Rfd2lkdGgpCisgICAgeworICAgICAgICBmbG9hdCBoc2NhbGUgPSAoZmxvYXQpc3JjX3dpZHRoIC8gKGZsb2F0KWRzdF93aWR0aDsKKyAgICAgICAgZmxvYXQgdnNjYWxlID0gKGZsb2F0KXNyY19oZWlnaHQgLyAoZmxvYXQpZHN0X2hlaWdodDsKKyAgICAgICAgZmxvYXQgeGkgPSAoeG8gKyAwLjVmKSAqIGhzY2FsZTsKKyAgICAgICAgZmxvYXQgeWkgPSAoeW8gKyAwLjVmKSAqIHZzY2FsZTsKKyAgICAgICAgLy8gMy10YXAgZmlsdGVyIHdlaWdodHMgYXJlIHt3aCwxLjAsd2h9IGFuZCB7d3YsMS4wLHd2fQorICAgICAgICBmbG9hdCB3aCA9IG1pbihtYXgoMC41ZiAqIChoc2NhbGUgLSAxLjBmKSwgMC4wZiksIDEuMGYpOworICAgICAgICBmbG9hdCB3diA9IG1pbihtYXgoMC41ZiAqICh2c2NhbGUgLSAxLjBmKSwgMC4wZiksIDEuMGYpOworICAgICAgICAvLyBDb252ZXJ0IHdlaWdodHMgdG8gdHdvIGJpbGluZWFyIHdlaWdodHMgLT4ge3doLDEuMCx3aH0gLT4ge3doLDAuNSwwfSArIHswLDAuNSx3aH0KKyAgICAgICAgZmxvYXQgZHggPSB3aCAvICgwLjVmICsgd2gpOworICAgICAgICBmbG9hdCBkeSA9IHd2IC8gKDAuNWYgKyB3dik7CisgICAgICAgIGludCB5MCA9IHRleDJEKHVzaG9ydF90ZXgsIHhpLWR4LCB5aS1keSk7CisgICAgICAgIGludCB5MSA9IHRleDJEKHVzaG9ydF90ZXgsIHhpK2R4LCB5aS1keSk7CisgICAgICAgIGludCB5MiA9IHRleDJEKHVzaG9ydF90ZXgsIHhpLWR4LCB5aStkeSk7CisgICAgICAgIGludCB5MyA9IHRleDJEKHVzaG9ydF90ZXgsIHhpK2R4LCB5aStkeSk7CisgICAgICAgIGRzdFt5bypkc3RfcGl0Y2greG9dID0gKHVuc2lnbmVkIHNob3J0KSgoeTAreTEreTIreTMrMikgPj4gMik7CisgICAgfQorfQorCitfX2dsb2JhbF9fIHZvaWQgU3Vic2FtcGxlX0JpbGluZWFyX3VzaG9ydDIodXNob3J0MiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3RfcGl0Y2gyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQpCit7CisgICAgaW50IHhvID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKKyAgICBpbnQgeW8gPSBibG9ja0lkeC55ICogYmxvY2tEaW0ueSArIHRocmVhZElkeC55OworCisgICAgaWYgKHlvIDwgZHN0X2hlaWdodCAmJiB4byA8IGRzdF93aWR0aCkKKyAgICB7CisgICAgICAgIGZsb2F0IGhzY2FsZSA9IChmbG9hdClzcmNfd2lkdGggLyAoZmxvYXQpZHN0X3dpZHRoOworICAgICAgICBmbG9hdCB2c2NhbGUgPSAoZmxvYXQpc3JjX2hlaWdodCAvIChmbG9hdClkc3RfaGVpZ2h0OworICAgICAgICBmbG9hdCB4aSA9ICh4byArIDAuNWYpICogaHNjYWxlOworICAgICAgICBmbG9hdCB5aSA9ICh5byArIDAuNWYpICogdnNjYWxlOworICAgICAgICAvLyAzLXRhcCBmaWx0ZXIgd2VpZ2h0cyBhcmUge3doLDEuMCx3aH0gYW5kIHt3diwxLjAsd3Z9CisgICAgICAgIGZsb2F0IHdoID0gbWluKG1heCgwLjVmICogKGhzY2FsZSAtIDEuMGYpLCAwLjBmKSwgMS4wZik7CisgICAgICAgIGZsb2F0IHd2ID0gbWluKG1heCgwLjVmICogKHZzY2FsZSAtIDEuMGYpLCAwLjBmKSwgMS4wZik7CisgICAgICAgIC8vIENvbnZlcnQgd2VpZ2h0cyB0byB0d28gYmlsaW5lYXIgd2VpZ2h0cyAtPiB7d2gsMS4wLHdofSAtPiB7d2gsMC41LDB9ICsgezAsMC41LHdofQorICAgICAgICBmbG9hdCBkeCA9IHdoIC8gKDAuNWYgKyB3aCk7CisgICAgICAgIGZsb2F0IGR5ID0gd3YgLyAoMC41ZiArIHd2KTsKKyAgICAgICAgdXNob3J0MiBjMCA9IHRleDJEKHVzaG9ydDJfdGV4LCB4aS1keCwgeWktZHkpOworICAgICAgICB1c2hvcnQyIGMxID0gdGV4MkQodXNob3J0Ml90ZXgsIHhpK2R4LCB5aS1keSk7CisgICAgICAgIHVzaG9ydDIgYzIgPSB0ZXgyRCh1c2hvcnQyX3RleCwgeGktZHgsIHlpK2R5KTsKKyAgICAgICAgdXNob3J0MiBjMyA9IHRleDJEKHVzaG9ydDJfdGV4LCB4aStkeCwgeWkrZHkpOworICAgICAgICBpbnQyIHV2OworICAgICAgICB1di54ID0gKChpbnQpYzAueCsoaW50KWMxLngrKGludCljMi54KyhpbnQpYzMueCsyKSA+PiAyOworICAgICAgICB1di55ID0gKChpbnQpYzAueSsoaW50KWMxLnkrKGludCljMi55KyhpbnQpYzMueSsyKSA+PiAyOworICAgICAgICBkc3RbeW8qZHN0X3BpdGNoMit4b10gPSBtYWtlX3VzaG9ydDIoKHVuc2lnbmVkIHNob3J0KXV2LngsICh1bnNpZ25lZCBzaG9ydCl1di55KTsKKyAgICB9Cit9CisKK19fZ2xvYmFsX18gdm9pZCBTdWJzYW1wbGVfQmlsaW5lYXJfdXNob3J0NCh1c2hvcnQ0ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0KQoreworICAgIGludCB4byA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CisgICAgaW50IHlvID0gYmxvY2tJZHgueSAqIGJsb2NrRGltLnkgKyB0aHJlYWRJZHgueTsKKworICAgIGlmICh5byA8IGRzdF9oZWlnaHQgJiYgeG8gPCBkc3Rfd2lkdGgpCisgICAgeworICAgICAgICBmbG9hdCBoc2NhbGUgPSAoZmxvYXQpc3JjX3dpZHRoIC8gKGZsb2F0KWRzdF93aWR0aDsKKyAgICAgICAgZmxvYXQgdnNjYWxlID0gKGZsb2F0KXNyY19oZWlnaHQgLyAoZmxvYXQpZHN0X2hlaWdodDsKKyAgICAgICAgZmxvYXQgeGkgPSAoeG8gKyAwLjVmKSAqIGhzY2FsZTsKKyAgICAgICAgZmxvYXQgeWkgPSAoeW8gKyAwLjVmKSAqIHZzY2FsZTsKKyAgICAgICAgLy8gMy10YXAgZmlsdGVyIHdlaWdodHMgYXJlIHt3aCwxLjAsd2h9IGFuZCB7d3YsMS4wLHd2fQorICAgICAgICBmbG9hdCB3aCA9IG1pbihtYXgoMC41ZiAqIChoc2NhbGUgLSAxLjBmKSwgMC4wZiksIDEuMGYpOworICAgICAgICBmbG9hdCB3diA9IG1pbihtYXgoMC41ZiAqICh2c2NhbGUgLSAxLjBmKSwgMC4wZiksIDEuMGYpOworICAgICAgICAvLyBDb252ZXJ0IHdlaWdodHMgdG8gdHdvIGJpbGluZWFyIHdlaWdodHMgLT4ge3doLDEuMCx3aH0gLT4ge3doLDAuNSwwfSArIHswLDAuNSx3aH0KKyAgICAgICAgZmxvYXQgZHggPSB3aCAvICgwLjVmICsgd2gpOworICAgICAgICBmbG9hdCBkeSA9IHd2IC8gKDAuNWYgKyB3dik7CisgICAgICAgIHVzaG9ydDQgYzAgPSB0ZXgyRCh1c2hvcnQ0X3RleCwgeGktZHgsIHlpLWR5KTsKKyAgICAgICAgdXNob3J0NCBjMSA9IHRleDJEKHVzaG9ydDRfdGV4LCB4aStkeCwgeWktZHkpOworICAgICAgICB1c2hvcnQ0IGMyID0gdGV4MkQodXNob3J0NF90ZXgsIHhpLWR4LCB5aStkeSk7CisgICAgICAgIHVzaG9ydDQgYzMgPSB0ZXgyRCh1c2hvcnQ0X3RleCwgeGkrZHgsIHlpK2R5KTsKKyAgICAgICAgaW50NCByZXM7CisgICAgICAgIHJlcy54ID0gICgoaW50KWMwLngrKGludCljMS54KyhpbnQpYzIueCsoaW50KWMzLngrMikgPj4gMjsKKyAgICAgICAgcmVzLnkgPSAgKChpbnQpYzAueSsoaW50KWMxLnkrKGludCljMi55KyhpbnQpYzMueSsyKSA+PiAyOworICAgICAgICByZXMueiA9ICAoKGludCljMC56KyhpbnQpYzEueisoaW50KWMyLnorKGludCljMy56KzIpID4+IDI7CisgICAgICAgIHJlcy53ID0gICgoaW50KWMwLncrKGludCljMS53KyhpbnQpYzIudysoaW50KWMzLncrMikgPj4gMjsKKyAgICAgICAgZHN0W3lvKmRzdF9waXRjaCt4b10gPSBtYWtlX3VzaG9ydDQoCisgICAgICAgICAgICAodW5zaWduZWQgc2hvcnQpcmVzLngsICh1bnNpZ25lZCBzaG9ydClyZXMueSwgKHVuc2lnbmVkIHNob3J0KXJlcy56LCAodW5zaWduZWQgc2hvcnQpcmVzLncpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfc2NhbGVfbnBwLmMgYi9saWJhdmZpbHRlci92Zl9zY2FsZV9ucHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTI3N2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2NhbGVfbnBwLmMKQEAgLTAsMCArMSw1OTkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogc2NhbGUgdmlkZW8gZmlsdGVyCisgKi8KKworI2luY2x1ZGUgPG5wcGkuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X2N1ZGFfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic2NhbGUuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHN1cHBvcnRlZF9mb3JtYXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfTlYxMiwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGRlaW50ZXJsZWF2ZWRfZm9ybWF0c1tdWzJdID0geworICAgIHsgQVZfUElYX0ZNVF9OVjEyLCBBVl9QSVhfRk1UX1lVVjQyMFAgfSwKK307CisKK2VudW0gU2NhbGVTdGFnZSB7CisgICAgU1RBR0VfREVJTlRFUkxFQVZFLAorICAgIFNUQUdFX1JFU0laRSwKKyAgICBTVEFHRV9JTlRFUkxFQVZFLAorICAgIFNUQUdFX05CLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgTlBQU2NhbGVTdGFnZUNvbnRleHQgeworICAgIGludCBzdGFnZV9uZWVkZWQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGluX2ZtdDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0X2ZtdDsKKworICAgIHN0cnVjdCB7CisgICAgICAgIGludCB3aWR0aDsKKyAgICAgICAgaW50IGhlaWdodDsKKyAgICB9IHBsYW5lc19pblszXSwgcGxhbmVzX291dFszXTsKKworICAgIEFWQnVmZmVyUmVmICpmcmFtZXNfY3R4OworICAgIEFWRnJhbWUgICAgICpmcmFtZTsKK30gTlBQU2NhbGVTdGFnZUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IE5QUFNjYWxlQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisKKyAgICBOUFBTY2FsZVN0YWdlQ29udGV4dCBzdGFnZXNbU1RBR0VfTkJdOworICAgIEFWRnJhbWUgKnRtcF9mcmFtZTsKKyAgICBpbnQgcGFzc3Rocm91Z2g7CisKKyAgICBpbnQgc2hpZnRfd2lkdGgsIHNoaWZ0X2hlaWdodDsKKworICAgIC8qKgorICAgICAqIE5ldyBkaW1lbnNpb25zLiBTcGVjaWFsIHZhbHVlcyBhcmU6CisgICAgICogICAwID0gb3JpZ2luYWwgd2lkdGgvaGVpZ2h0CisgICAgICogIC0xID0ga2VlcCBvcmlnaW5hbCBhc3BlY3QKKyAgICAgKi8KKyAgICBpbnQgdywgaDsKKworICAgIC8qKgorICAgICAqIE91dHB1dCBzdyBmb3JtYXQuIEFWX1BJWF9GTVRfTk9ORSBmb3Igbm8gY29udmVyc2lvbi4KKyAgICAgKi8KKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0OworCisgICAgY2hhciAqd19leHByOyAgICAgICAgICAgICAgIC8vLzwgd2lkdGggIGV4cHJlc3Npb24gc3RyaW5nCisgICAgY2hhciAqaF9leHByOyAgICAgICAgICAgICAgIC8vLzwgaGVpZ2h0IGV4cHJlc3Npb24gc3RyaW5nCisgICAgY2hhciAqZm9ybWF0X3N0cjsKKworICAgIGludCBpbnRlcnBfYWxnbzsKK30gTlBQU2NhbGVDb250ZXh0OworCitzdGF0aWMgaW50IG5wcHNjYWxlX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgTlBQU2NhbGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCBpOworCisgICAgaWYgKCFzdHJjbXAocy0+Zm9ybWF0X3N0ciwgInNhbWUiKSkgeworICAgICAgICBzLT5mb3JtYXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+Zm9ybWF0ID0gYXZfZ2V0X3BpeF9mbXQocy0+Zm9ybWF0X3N0cik7CisgICAgICAgIGlmIChzLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnJlY29nbml6ZWQgcGl4ZWwgZm9ybWF0OiAlc1xuIiwgcy0+Zm9ybWF0X3N0cik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHMtPnN0YWdlcyk7IGkrKykgeworICAgICAgICBzLT5zdGFnZXNbaV0uZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIXMtPnN0YWdlc1tpXS5mcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHMtPnRtcF9mcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFzLT50bXBfZnJhbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbnBwc2NhbGVfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIE5QUFNjYWxlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzLT5zdGFnZXMpOyBpKyspIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+c3RhZ2VzW2ldLmZyYW1lKTsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZzLT5zdGFnZXNbaV0uZnJhbWVzX2N0eCk7CisgICAgfQorICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnRtcF9mcmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgbnBwc2NhbGVfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9DVURBLCBBVl9QSVhfRk1UX05PTkUsCisgICAgfTsKKyAgICBBVkZpbHRlckZvcm1hdHMgKnBpeF9mbXRzID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhlbF9mb3JtYXRzKTsKKworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cyk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zdGFnZShOUFBTY2FsZVN0YWdlQ29udGV4dCAqc3RhZ2UsIEFWQnVmZmVyUmVmICpkZXZpY2VfY3R4KQoreworICAgIEFWQnVmZmVyUmVmICpvdXRfcmVmID0gTlVMTDsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqb3V0X2N0eDsKKyAgICBpbnQgaW5fc3csIGluX3NoLCBvdXRfc3csIG91dF9zaDsKKyAgICBpbnQgcmV0LCBpOworCisgICAgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoc3RhZ2UtPmluX2ZtdCwgICZpbl9zdywgICZpbl9zaCk7CisgICAgYXZfcGl4X2ZtdF9nZXRfY2hyb21hX3N1Yl9zYW1wbGUoc3RhZ2UtPm91dF9mbXQsICZvdXRfc3csICZvdXRfc2gpOworICAgIGlmICghc3RhZ2UtPnBsYW5lc19vdXRbMF0ud2lkdGgpIHsKKyAgICAgICAgc3RhZ2UtPnBsYW5lc19vdXRbMF0ud2lkdGggID0gc3RhZ2UtPnBsYW5lc19pblswXS53aWR0aDsKKyAgICAgICAgc3RhZ2UtPnBsYW5lc19vdXRbMF0uaGVpZ2h0ID0gc3RhZ2UtPnBsYW5lc19pblswXS5oZWlnaHQ7CisgICAgfQorCisgICAgZm9yIChpID0gMTsgaSA8IEZGX0FSUkFZX0VMRU1TKHN0YWdlLT5wbGFuZXNfaW4pOyBpKyspIHsKKyAgICAgICAgc3RhZ2UtPnBsYW5lc19pbltpXS53aWR0aCAgID0gc3RhZ2UtPnBsYW5lc19pblswXS53aWR0aCAgID4+IGluX3N3OworICAgICAgICBzdGFnZS0+cGxhbmVzX2luW2ldLmhlaWdodCAgPSBzdGFnZS0+cGxhbmVzX2luWzBdLmhlaWdodCAgPj4gaW5fc2g7CisgICAgICAgIHN0YWdlLT5wbGFuZXNfb3V0W2ldLndpZHRoICA9IHN0YWdlLT5wbGFuZXNfb3V0WzBdLndpZHRoICA+PiBvdXRfc3c7CisgICAgICAgIHN0YWdlLT5wbGFuZXNfb3V0W2ldLmhlaWdodCA9IHN0YWdlLT5wbGFuZXNfb3V0WzBdLmhlaWdodCA+PiBvdXRfc2g7CisgICAgfQorCisgICAgb3V0X3JlZiA9IGF2X2h3ZnJhbWVfY3R4X2FsbG9jKGRldmljZV9jdHgpOworICAgIGlmICghb3V0X3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBvdXRfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilvdXRfcmVmLT5kYXRhOworCisgICAgb3V0X2N0eC0+Zm9ybWF0ICAgID0gQVZfUElYX0ZNVF9DVURBOworICAgIG91dF9jdHgtPnN3X2Zvcm1hdCA9IHN0YWdlLT5vdXRfZm10OworICAgIG91dF9jdHgtPndpZHRoICAgICA9IEZGQUxJR04oc3RhZ2UtPnBsYW5lc19vdXRbMF0ud2lkdGgsICAzMik7CisgICAgb3V0X2N0eC0+aGVpZ2h0ICAgID0gRkZBTElHTihzdGFnZS0+cGxhbmVzX291dFswXS5oZWlnaHQsIDMyKTsKKworICAgIHJldCA9IGF2X2h3ZnJhbWVfY3R4X2luaXQob3V0X3JlZik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGF2X2ZyYW1lX3VucmVmKHN0YWdlLT5mcmFtZSk7CisgICAgcmV0ID0gYXZfaHdmcmFtZV9nZXRfYnVmZmVyKG91dF9yZWYsIHN0YWdlLT5mcmFtZSwgMCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHN0YWdlLT5mcmFtZS0+d2lkdGggID0gc3RhZ2UtPnBsYW5lc19vdXRbMF0ud2lkdGg7CisgICAgc3RhZ2UtPmZyYW1lLT5oZWlnaHQgPSBzdGFnZS0+cGxhbmVzX291dFswXS5oZWlnaHQ7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJnN0YWdlLT5mcmFtZXNfY3R4KTsKKyAgICBzdGFnZS0+ZnJhbWVzX2N0eCA9IG91dF9yZWY7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfYnVmZmVyX3VucmVmKCZvdXRfcmVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZvcm1hdF9pc19zdXBwb3J0ZWQoZW51bSBBVlBpeGVsRm9ybWF0IGZtdCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfZm9ybWF0cyk7IGkrKykKKyAgICAgICAgaWYgKHN1cHBvcnRlZF9mb3JtYXRzW2ldID09IGZtdCkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGdldF9kZWludGVybGVhdmVkX2Zvcm1hdChlbnVtIEFWUGl4ZWxGb3JtYXQgZm10KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZm10KTsKKyAgICBpbnQgaSwgcGxhbmVzOworCisgICAgcGxhbmVzID0gYXZfcGl4X2ZtdF9jb3VudF9wbGFuZXMoZm10KTsKKyAgICBpZiAocGxhbmVzID09IGRlc2MtPm5iX2NvbXBvbmVudHMpCisgICAgICAgIHJldHVybiBmbXQ7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGRlaW50ZXJsZWF2ZWRfZm9ybWF0cyk7IGkrKykKKyAgICAgICAgaWYgKGRlaW50ZXJsZWF2ZWRfZm9ybWF0c1tpXVswXSA9PSBmbXQpCisgICAgICAgICAgICByZXR1cm4gZGVpbnRlcmxlYXZlZF9mb3JtYXRzW2ldWzFdOworICAgIHJldHVybiBBVl9QSVhfRk1UX05PTkU7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9wcm9jZXNzaW5nX2NoYWluKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCkKK3sKKyAgICBOUFBTY2FsZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqaW5fZnJhbWVzX2N0eDsKKworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBpbl9mb3JtYXQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9mb3JtYXQ7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGluX2RlaW50ZXJsZWF2ZWRfZm9ybWF0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfZGVpbnRlcmxlYXZlZF9mb3JtYXQ7CisKKyAgICBpbnQgaSwgcmV0LCBsYXN0X3N0YWdlID0gLTE7CisKKyAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYSBodyBjb250ZXh0ICovCisgICAgaWYgKCFjdHgtPmlucHV0c1swXS0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBodyBjb250ZXh0IHByb3ZpZGVkIG9uIGlucHV0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaW5fZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopY3R4LT5pbnB1dHNbMF0tPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgaW5fZm9ybWF0ICAgICA9IGluX2ZyYW1lc19jdHgtPnN3X2Zvcm1hdDsKKyAgICBvdXRfZm9ybWF0ICAgID0gKHMtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUpID8gaW5fZm9ybWF0IDogcy0+Zm9ybWF0OworCisgICAgaWYgKCFmb3JtYXRfaXNfc3VwcG9ydGVkKGluX2Zvcm1hdCkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgaW5wdXQgZm9ybWF0OiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoaW5fZm9ybWF0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorICAgIGlmICghZm9ybWF0X2lzX3N1cHBvcnRlZChvdXRfZm9ybWF0KSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0OiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUob3V0X2Zvcm1hdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGluX2RlaW50ZXJsZWF2ZWRfZm9ybWF0ICA9IGdldF9kZWludGVybGVhdmVkX2Zvcm1hdChpbl9mb3JtYXQpOworICAgIG91dF9kZWludGVybGVhdmVkX2Zvcm1hdCA9IGdldF9kZWludGVybGVhdmVkX2Zvcm1hdChvdXRfZm9ybWF0KTsKKyAgICBpZiAoaW5fZGVpbnRlcmxlYXZlZF9mb3JtYXQgID09IEFWX1BJWF9GTVRfTk9ORSB8fAorICAgICAgICBvdXRfZGVpbnRlcmxlYXZlZF9mb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisKKyAgICAvKiBmaWd1cmUgb3V0IHdoaWNoIHN0YWdlcyBuZWVkIHRvIGJlIGRvbmUgKi8KKyAgICBpZiAoaW5fd2lkdGggIT0gb3V0X3dpZHRoIHx8IGluX2hlaWdodCAhPSBvdXRfaGVpZ2h0IHx8CisgICAgICAgIGluX2RlaW50ZXJsZWF2ZWRfZm9ybWF0ICE9IG91dF9kZWludGVybGVhdmVkX2Zvcm1hdCkgeworICAgICAgICBzLT5zdGFnZXNbU1RBR0VfUkVTSVpFXS5zdGFnZV9uZWVkZWQgPSAxOworCisgICAgICAgIGlmIChzLT5pbnRlcnBfYWxnbyA9PSBOUFBJX0lOVEVSX1NVUEVSICYmCisgICAgICAgICAgICAob3V0X3dpZHRoID4gaW5fd2lkdGggJiYgb3V0X2hlaWdodCA+IGluX2hlaWdodCkpIHsKKyAgICAgICAgICAgIHMtPmludGVycF9hbGdvID0gTlBQSV9JTlRFUl9MQU5DWk9TOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJzdXBlci1zYW1wbGluZyBub3Qgc3VwcG9ydGVkIGZvciBvdXRwdXQgZGltZW5zaW9ucywgdXNpbmcgbGFuY3pvcyBpbnN0ZWFkLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmludGVycF9hbGdvID09IE5QUElfSU5URVJfU1VQRVIgJiYKKyAgICAgICAgICAgICEob3V0X3dpZHRoIDwgaW5fd2lkdGggJiYgb3V0X2hlaWdodCA8IGluX2hlaWdodCkpIHsKKyAgICAgICAgICAgIHMtPmludGVycF9hbGdvID0gTlBQSV9JTlRFUl9DVUJJQzsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAic3VwZXItc2FtcGxpbmcgbm90IHN1cHBvcnRlZCBmb3Igb3V0cHV0IGRpbWVuc2lvbnMsIHVzaW5nIGN1YmljIGluc3RlYWQuXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcy0+c3RhZ2VzW1NUQUdFX1JFU0laRV0uc3RhZ2VfbmVlZGVkICYmIGluX2Zvcm1hdCA9PSBvdXRfZm9ybWF0KQorICAgICAgICBzLT5wYXNzdGhyb3VnaCA9IDE7CisKKyAgICBpZiAoIXMtPnBhc3N0aHJvdWdoKSB7CisgICAgICAgIGlmIChpbl9mb3JtYXQgIT0gaW5fZGVpbnRlcmxlYXZlZF9mb3JtYXQpCisgICAgICAgICAgICBzLT5zdGFnZXNbU1RBR0VfREVJTlRFUkxFQVZFXS5zdGFnZV9uZWVkZWQgPSAxOworICAgICAgICBpZiAob3V0X2Zvcm1hdCAhPSBvdXRfZGVpbnRlcmxlYXZlZF9mb3JtYXQpCisgICAgICAgICAgICBzLT5zdGFnZXNbU1RBR0VfSU5URVJMRUFWRV0uc3RhZ2VfbmVlZGVkID0gMTsKKyAgICB9CisKKyAgICBzLT5zdGFnZXNbU1RBR0VfREVJTlRFUkxFQVZFXS5pbl9mbXQgICAgICAgICAgICAgID0gaW5fZm9ybWF0OworICAgIHMtPnN0YWdlc1tTVEFHRV9ERUlOVEVSTEVBVkVdLm91dF9mbXQgICAgICAgICAgICAgPSBpbl9kZWludGVybGVhdmVkX2Zvcm1hdDsKKyAgICBzLT5zdGFnZXNbU1RBR0VfREVJTlRFUkxFQVZFXS5wbGFuZXNfaW5bMF0ud2lkdGggID0gaW5fd2lkdGg7CisgICAgcy0+c3RhZ2VzW1NUQUdFX0RFSU5URVJMRUFWRV0ucGxhbmVzX2luWzBdLmhlaWdodCA9IGluX2hlaWdodDsKKworICAgIHMtPnN0YWdlc1tTVEFHRV9SRVNJWkVdLmluX2ZtdCAgICAgICAgICAgICAgID0gaW5fZGVpbnRlcmxlYXZlZF9mb3JtYXQ7CisgICAgcy0+c3RhZ2VzW1NUQUdFX1JFU0laRV0ub3V0X2ZtdCAgICAgICAgICAgICAgPSBvdXRfZGVpbnRlcmxlYXZlZF9mb3JtYXQ7CisgICAgcy0+c3RhZ2VzW1NUQUdFX1JFU0laRV0ucGxhbmVzX2luWzBdLndpZHRoICAgPSBpbl93aWR0aDsKKyAgICBzLT5zdGFnZXNbU1RBR0VfUkVTSVpFXS5wbGFuZXNfaW5bMF0uaGVpZ2h0ICA9IGluX2hlaWdodDsKKyAgICBzLT5zdGFnZXNbU1RBR0VfUkVTSVpFXS5wbGFuZXNfb3V0WzBdLndpZHRoICA9IG91dF93aWR0aDsKKyAgICBzLT5zdGFnZXNbU1RBR0VfUkVTSVpFXS5wbGFuZXNfb3V0WzBdLmhlaWdodCA9IG91dF9oZWlnaHQ7CisKKyAgICBzLT5zdGFnZXNbU1RBR0VfSU5URVJMRUFWRV0uaW5fZm10ICAgICAgICAgICAgICA9IG91dF9kZWludGVybGVhdmVkX2Zvcm1hdDsKKyAgICBzLT5zdGFnZXNbU1RBR0VfSU5URVJMRUFWRV0ub3V0X2ZtdCAgICAgICAgICAgICA9IG91dF9mb3JtYXQ7CisgICAgcy0+c3RhZ2VzW1NUQUdFX0lOVEVSTEVBVkVdLnBsYW5lc19pblswXS53aWR0aCAgPSBvdXRfd2lkdGg7CisgICAgcy0+c3RhZ2VzW1NUQUdFX0lOVEVSTEVBVkVdLnBsYW5lc19pblswXS5oZWlnaHQgPSBvdXRfaGVpZ2h0OworCisgICAgLyogaW5pdCB0aGUgaGFyZHdhcmUgY29udGV4dHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+c3RhZ2VzKTsgaSsrKSB7CisgICAgICAgIGlmICghcy0+c3RhZ2VzW2ldLnN0YWdlX25lZWRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHJldCA9IGluaXRfc3RhZ2UoJnMtPnN0YWdlc1tpXSwgaW5fZnJhbWVzX2N0eC0+ZGV2aWNlX3JlZik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBsYXN0X3N0YWdlID0gaTsKKyAgICB9CisKKyAgICBpZiAobGFzdF9zdGFnZSA+PSAwKQorICAgICAgICBjdHgtPm91dHB1dHNbMF0tPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKHMtPnN0YWdlc1tsYXN0X3N0YWdlXS5mcmFtZXNfY3R4KTsKKyAgICBlbHNlCisgICAgICAgIGN0eC0+b3V0cHV0c1swXS0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoY3R4LT5pbnB1dHNbMF0tPmh3X2ZyYW1lc19jdHgpOworCisgICAgaWYgKCFjdHgtPm91dHB1dHNbMF0tPmh3X2ZyYW1lc19jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBucHBzY2FsZV9jb25maWdfcHJvcHMoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gb3V0bGluay0+c3JjLT5pbnB1dHNbMF07CisgICAgTlBQU2NhbGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCB3LCBoOworICAgIGludCByZXQ7CisKKyAgICBpZiAoKHJldCA9IGZmX3NjYWxlX2V2YWxfZGltZW5zaW9ucyhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndfZXhwciwgcy0+aF9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluaywgb3V0bGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdywgJmgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmICgoKGludDY0X3QpaCAqIGlubGluay0+dykgPiBJTlRfTUFYICB8fAorICAgICAgICAoKGludDY0X3QpdyAqIGlubGluay0+aCkgPiBJTlRfTUFYKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJSZXNjYWxlZCB2YWx1ZSBmb3Igd2lkdGggb3IgaGVpZ2h0IGlzIHRvbyBiaWcuXG4iKTsKKworICAgIG91dGxpbmstPncgPSB3OworICAgIG91dGxpbmstPmggPSBoOworCisgICAgcmV0ID0gaW5pdF9wcm9jZXNzaW5nX2NoYWluKGN0eCwgaW5saW5rLT53LCBpbmxpbmstPmgsIHcsIGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ3OiVkIGg6JWQgLT4gdzolZCBoOiVkXG4iLAorICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisKKyAgICBpZiAoaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2X211bF9xKChBVlJhdGlvbmFsKXtvdXRsaW5rLT5oKmlubGluay0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT53KmlubGluay0+aH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgIGVsc2UKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbnBwc2NhbGVfZGVpbnRlcmxlYXZlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBOUFBTY2FsZVN0YWdlQ29udGV4dCAqc3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQsIEFWRnJhbWUgKmluKQoreworICAgIEFWSFdGcmFtZXNDb250ZXh0ICppbl9mcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0Kilpbi0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICBOcHBTdGF0dXMgZXJyOworCisgICAgc3dpdGNoIChpbl9mcmFtZXNfY3R4LT5zd19mb3JtYXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfTlYxMjoKKyAgICAgICAgZXJyID0gbnBwaVlDYkNyNDIwXzh1X1AyUDNSKGluLT5kYXRhWzBdLCBpbi0+bGluZXNpemVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVsxXSwgaW4tPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhLCBvdXQtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5wcGlTaXplKXsgaW4tPndpZHRoLCBpbi0+aGVpZ2h0IH0pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgfQorICAgIGlmIChlcnIgIT0gTlBQX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTlBQIGRlaW50ZXJsZWF2ZSBlcnJvcjogJWRcbiIsIGVycik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnBwc2NhbGVfcmVzaXplKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBOUFBTY2FsZVN0YWdlQ29udGV4dCAqc3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQsIEFWRnJhbWUgKmluKQoreworICAgIE5QUFNjYWxlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBOcHBTdGF0dXMgZXJyOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHN0YWdlLT5wbGFuZXNfaW4pICYmIGkgPCBGRl9BUlJBWV9FTEVNUyhpbi0+ZGF0YSkgJiYgaW4tPmRhdGFbaV07IGkrKykgeworICAgICAgICBpbnQgaXcgPSBzdGFnZS0+cGxhbmVzX2luW2ldLndpZHRoOworICAgICAgICBpbnQgaWggPSBzdGFnZS0+cGxhbmVzX2luW2ldLmhlaWdodDsKKyAgICAgICAgaW50IG93ID0gc3RhZ2UtPnBsYW5lc19vdXRbaV0ud2lkdGg7CisgICAgICAgIGludCBvaCA9IHN0YWdlLT5wbGFuZXNfb3V0W2ldLmhlaWdodDsKKworICAgICAgICBlcnIgPSBucHBpUmVzaXplU3FyUGl4ZWxfOHVfQzFSKGluLT5kYXRhW2ldLCAoTnBwaVNpemUpeyBpdywgaWggfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+bGluZXNpemVbaV0sIChOcHBpUmVjdCl7IDAsIDAsIGl3LCBpaCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+ZGF0YVtpXSwgb3V0LT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTnBwaVJlY3QpeyAwLCAwLCBvdywgb2ggfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKW93IC8gaXcsIChkb3VibGUpb2ggLyBpaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuMCwgcy0+aW50ZXJwX2FsZ28pOworICAgICAgICBpZiAoZXJyICE9IE5QUF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJOUFAgcmVzaXplIGVycm9yOiAlZFxuIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBucHBzY2FsZV9pbnRlcmxlYXZlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBOUFBTY2FsZVN0YWdlQ29udGV4dCAqc3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqb3V0LCBBVkZyYW1lICppbikKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqb3V0X2ZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKW91dC0+aHdfZnJhbWVzX2N0eC0+ZGF0YTsKKyAgICBOcHBTdGF0dXMgZXJyOworCisgICAgc3dpdGNoIChvdXRfZnJhbWVzX2N0eC0+c3dfZm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6CisgICAgICAgIGVyciA9IG5wcGlZQ2JDcjQyMF84dV9QM1AyUigoY29uc3QgdWludDhfdCoqKWluLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzBdLCBvdXQtPmxpbmVzaXplWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5kYXRhWzFdLCBvdXQtPmxpbmVzaXplWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5wcGlTaXplKXsgaW4tPndpZHRoLCBpbi0+aGVpZ2h0IH0pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgfQorICAgIGlmIChlcnIgIT0gTlBQX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTlBQIGRlaW50ZXJsZWF2ZSBlcnJvcjogJWRcbiIsIGVycik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgKCpjb25zdCBucHBzY2FsZV9wcm9jZXNzW10pKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBOUFBTY2FsZVN0YWdlQ29udGV4dCAqc3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXQsIEFWRnJhbWUgKmluKSA9IHsKKyAgICBbU1RBR0VfREVJTlRFUkxFQVZFXSA9IG5wcHNjYWxlX2RlaW50ZXJsZWF2ZSwKKyAgICBbU1RBR0VfUkVTSVpFXSAgICAgICA9IG5wcHNjYWxlX3Jlc2l6ZSwKKyAgICBbU1RBR0VfSU5URVJMRUFWRV0gICA9IG5wcHNjYWxlX2ludGVybGVhdmUsCit9OworCitzdGF0aWMgaW50IG5wcHNjYWxlX3NjYWxlKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICpvdXQsIEFWRnJhbWUgKmluKQoreworICAgIE5QUFNjYWxlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICpzcmMgPSBpbjsKKyAgICBpbnQgaSwgcmV0LCBsYXN0X3N0YWdlID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+c3RhZ2VzKTsgaSsrKSB7CisgICAgICAgIGlmICghcy0+c3RhZ2VzW2ldLnN0YWdlX25lZWRlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHJldCA9IG5wcHNjYWxlX3Byb2Nlc3NbaV0oY3R4LCAmcy0+c3RhZ2VzW2ldLCBzLT5zdGFnZXNbaV0uZnJhbWUsIHNyYyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBzcmMgICAgICAgID0gcy0+c3RhZ2VzW2ldLmZyYW1lOworICAgICAgICBsYXN0X3N0YWdlID0gaTsKKyAgICB9CisKKyAgICBpZiAobGFzdF9zdGFnZSA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICByZXQgPSBhdl9od2ZyYW1lX2dldF9idWZmZXIoc3JjLT5od19mcmFtZXNfY3R4LCBzLT50bXBfZnJhbWUsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfZnJhbWVfbW92ZV9yZWYob3V0LCBzcmMpOworICAgIGF2X2ZyYW1lX21vdmVfcmVmKHNyYywgcy0+dG1wX2ZyYW1lKTsKKworICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBucHBzY2FsZV9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgICAgICAgICAgICpjdHggPSBsaW5rLT5kc3Q7CisgICAgTlBQU2NhbGVDb250ZXh0ICAgICAgICAgICAgICAgICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAgICAgICAgICAgICAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAgKmZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKW91dGxpbmstPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZDVURBRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4ID0gZnJhbWVzX2N0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisKKyAgICBBVkZyYW1lICpvdXQgPSBOVUxMOworICAgIENVcmVzdWx0IGVycjsKKyAgICBDVWNvbnRleHQgZHVtbXk7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAocy0+cGFzc3Rocm91Z2gpCisgICAgICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgaW4pOworCisgICAgb3V0ID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIW91dCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBkZXZpY2VfaHdjdHgtPmludGVybmFsLT5jdWRhX2RsLT5jdUN0eFB1c2hDdXJyZW50KGRldmljZV9od2N0eC0+Y3VkYV9jdHgpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IG5wcHNjYWxlX3NjYWxlKGN0eCwgb3V0LCBpbik7CisKKyAgICBkZXZpY2VfaHdjdHgtPmludGVybmFsLT5jdWRhX2RsLT5jdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYXZfcmVkdWNlKCZvdXQtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCAmb3V0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgKGludDY0X3QpaW4tPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICogb3V0bGluay0+aCAqIGxpbmstPncsCisgICAgICAgICAgICAgIChpbnQ2NF90KWluLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAqIG91dGxpbmstPncgKiBsaW5rLT5oLAorICAgICAgICAgICAgICBJTlRfTUFYKTsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgIHJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKE5QUFNjYWxlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTSkKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAidyIsICAgICAgIk91dHB1dCB2aWRlbyB3aWR0aCIsICBPRkZTRVQod19leHByKSwgICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gIml3IiAgIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiaCIsICAgICAgIk91dHB1dCB2aWRlbyBoZWlnaHQiLCBPRkZTRVQoaF9leHByKSwgICAgIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImloIiAgIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZm9ybWF0IiwgIk91dHB1dCBwaXhlbCBmb3JtYXQiLCBPRkZTRVQoZm9ybWF0X3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gInNhbWUiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisKKyAgICB7ICJpbnRlcnBfYWxnbyIsICJJbnRlcnBvbGF0aW9uIGFsZ29yaXRobSB1c2VkIGZvciByZXNpemluZyIsIE9GRlNFVChpbnRlcnBfYWxnbyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gTlBQSV9JTlRFUl9DVUJJQyB9LCAwLCBJTlRfTUFYLCBGTEFHUywgImludGVycF9hbGdvIiB9LAorICAgICAgICB7ICJubiIsICAgICAgICAgICAgICAgICAibmVhcmVzdCBuZWlnaGJvdXIiLCAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5QUElfSU5URVJfTk4gICAgICAgICAgICAgICAgIH0sIDAsIDAsIEZMQUdTLCAiaW50ZXJwX2FsZ28iIH0sCisgICAgICAgIHsgImxpbmVhciIsICAgICAgICAgICAgICJsaW5lYXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlBQSV9JTlRFUl9MSU5FQVIgICAgICAgICAgICAgfSwgMCwgMCwgRkxBR1MsICJpbnRlcnBfYWxnbyIgfSwKKyAgICAgICAgeyAiY3ViaWMiLCAgICAgICAgICAgICAgImN1YmljIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOUFBJX0lOVEVSX0NVQklDICAgICAgICAgICAgICB9LCAwLCAwLCBGTEFHUywgImludGVycF9hbGdvIiB9LAorICAgICAgICB7ICJjdWJpYzJwX2JzcGxpbmUiLCAgICAiMi1wYXJhbWV0ZXIgY3ViaWMgKEI9MSwgQz0wKSIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5QUElfSU5URVJfQ1VCSUMyUF9CU1BMSU5FICAgIH0sIDAsIDAsIEZMQUdTLCAiaW50ZXJwX2FsZ28iIH0sCisgICAgICAgIHsgImN1YmljMnBfY2F0bXVsbHJvbSIsICIyLXBhcmFtZXRlciBjdWJpYyAoQj0wLCBDPTEvMikiLCAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlBQSV9JTlRFUl9DVUJJQzJQX0NBVE1VTExST00gfSwgMCwgMCwgRkxBR1MsICJpbnRlcnBfYWxnbyIgfSwKKyAgICAgICAgeyAiY3ViaWMycF9iMDVjMDMiLCAgICAgIjItcGFyYW1ldGVyIGN1YmljIChCPTEvMiwgQz0zLzEwKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBOUFBJX0lOVEVSX0NVQklDMlBfQjA1QzAzICAgICB9LCAwLCAwLCBGTEFHUywgImludGVycF9hbGdvIiB9LAorICAgICAgICB7ICJzdXBlciIsICAgICAgICAgICAgICAic3VwZXJzYW1wbGluZyIsICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE5QUElfSU5URVJfU1VQRVIgICAgICAgICAgICAgIH0sIDAsIDAsIEZMQUdTLCAiaW50ZXJwX2FsZ28iIH0sCisgICAgICAgIHsgImxhbmN6b3MiLCAgICAgICAgICAgICJMYW5jem9zIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTlBQSV9JTlRFUl9MQU5DWk9TICAgICAgICAgICAgfSwgMCwgMCwgRkxBR1MsICJpbnRlcnBfYWxnbyIgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIG5wcHNjYWxlX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIm5wcHNjYWxlIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gb3B0aW9ucywKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBucHBzY2FsZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gbnBwc2NhbGVfZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBucHBzY2FsZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gbnBwc2NhbGVfY29uZmlnX3Byb3BzLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3NjYWxlX25wcCA9IHsKKyAgICAubmFtZSAgICAgID0gInNjYWxlX25wcCIsCisgICAgLmRlc2NyaXB0aW9uID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5WSURJQSBQZXJmb3JtYW5jZSBQcmltaXRpdmVzIHZpZGVvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2NhbGluZyBhbmQgZm9ybWF0IGNvbnZlcnNpb24iKSwKKworICAgIC5pbml0ICAgICAgICAgID0gbnBwc2NhbGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IG5wcHNjYWxlX3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IG5wcHNjYWxlX3F1ZXJ5X2Zvcm1hdHMsCisKKyAgICAucHJpdl9zaXplID0gc2l6ZW9mKE5QUFNjYWxlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgPSAmbnBwc2NhbGVfY2xhc3MsCisKKyAgICAuaW5wdXRzICAgID0gbnBwc2NhbGVfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgPSBucHBzY2FsZV9vdXRwdXRzLAorCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9zY2FsZV9xc3YuYyBiL2xpYmF2ZmlsdGVyL3ZmX3NjYWxlX3Fzdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTg5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl9zY2FsZV9xc3YuYwpAQCAtMCwwICsxLDYzNiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBzY2FsZSB2aWRlbyBmaWx0ZXIgLSBRU1YKKyAqLworCisjaW5jbHVkZSA8bWZ4L21meHZpZGVvLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2h3Y29udGV4dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHRfcXN2LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9xc3Z2cHAuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHZhcl9uYW1lc1tdID0geworICAgICJQSSIsCisgICAgIlBISSIsCisgICAgIkUiLAorICAgICJpbl93IiwgICAiaXciLAorICAgICJpbl9oIiwgICAiaWgiLAorICAgICJvdXRfdyIsICAib3ciLAorICAgICJvdXRfaCIsICAib2giLAorICAgICJhIiwgImRhciIsCisgICAgInNhciIsCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX1BJLAorICAgIFZBUl9QSEksCisgICAgVkFSX0UsCisgICAgVkFSX0lOX1csICAgVkFSX0lXLAorICAgIFZBUl9JTl9ILCAgIFZBUl9JSCwKKyAgICBWQVJfT1VUX1csICBWQVJfT1csCisgICAgVkFSX09VVF9ILCAgVkFSX09ILAorICAgIFZBUl9BLCBWQVJfREFSLAorICAgIFZBUl9TQVIsCisgICAgVkFSU19OQgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgUVNWU2NhbGVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIC8qIGEgY2xvbmUgb2YgdGhlIG1haW4gc2Vzc2lvbiwgdXNlZCBpbnRlcm5hbGx5IGZvciBzY2FsaW5nICovCisgICAgbWZ4U2Vzc2lvbiAgIHNlc3Npb247CisKKyAgICBtZnhNZW1JZCAqbWVtX2lkc19pbjsKKyAgICBpbnQgbmJfbWVtX2lkc19pbjsKKworICAgIG1meE1lbUlkICptZW1faWRzX291dDsKKyAgICBpbnQgbmJfbWVtX2lkc19vdXQ7CisKKyAgICBtZnhGcmFtZVN1cmZhY2UxICoqc3VyZmFjZV9wdHJzX2luOworICAgIGludCAgICAgICAgICAgICBuYl9zdXJmYWNlX3B0cnNfaW47CisKKyAgICBtZnhGcmFtZVN1cmZhY2UxICoqc3VyZmFjZV9wdHJzX291dDsKKyAgICBpbnQgICAgICAgICAgICAgbmJfc3VyZmFjZV9wdHJzX291dDsKKworICAgIG1meEV4dE9wYXF1ZVN1cmZhY2VBbGxvYyBvcGFxdWVfYWxsb2M7CisgICAgbWZ4RXh0QnVmZmVyICAgICAgICAgICAgKmV4dF9idWZmZXJzWzFdOworCisgICAgaW50IHNoaWZ0X3dpZHRoLCBzaGlmdF9oZWlnaHQ7CisKKyAgICAvKioKKyAgICAgKiBOZXcgZGltZW5zaW9ucy4gU3BlY2lhbCB2YWx1ZXMgYXJlOgorICAgICAqICAgMCA9IG9yaWdpbmFsIHdpZHRoL2hlaWdodAorICAgICAqICAtMSA9IGtlZXAgb3JpZ2luYWwgYXNwZWN0CisgICAgICovCisgICAgaW50IHcsIGg7CisKKyAgICAvKioKKyAgICAgKiBPdXRwdXQgc3cgZm9ybWF0LiBBVl9QSVhfRk1UX05PTkUgZm9yIG5vIGNvbnZlcnNpb24uCisgICAgICovCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdDsKKworICAgIGNoYXIgKndfZXhwcjsgICAgICAgICAgICAgICAvLy88IHdpZHRoICBleHByZXNzaW9uIHN0cmluZworICAgIGNoYXIgKmhfZXhwcjsgICAgICAgICAgICAgICAvLy88IGhlaWdodCBleHByZXNzaW9uIHN0cmluZworICAgIGNoYXIgKmZvcm1hdF9zdHI7Cit9IFFTVlNjYWxlQ29udGV4dDsKKworc3RhdGljIGludCBxc3ZzY2FsZV9pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFFTVlNjYWxlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmICghc3RyY21wKHMtPmZvcm1hdF9zdHIsICJzYW1lIikpIHsKKyAgICAgICAgcy0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9OT05FOworICAgIH0gZWxzZSB7CisgICAgICAgIHMtPmZvcm1hdCA9IGF2X2dldF9waXhfZm10KHMtPmZvcm1hdF9zdHIpOworICAgICAgICBpZiAocy0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5yZWNvZ25pemVkIHBpeGVsIGZvcm1hdDogJXNcbiIsIHMtPmZvcm1hdF9zdHIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBxc3ZzY2FsZV91bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgUVNWU2NhbGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKHMtPnNlc3Npb24pIHsKKyAgICAgICAgTUZYQ2xvc2Uocy0+c2Vzc2lvbik7CisgICAgICAgIHMtPnNlc3Npb24gPSBOVUxMOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZzLT5tZW1faWRzX2luKTsKKyAgICBhdl9mcmVlcCgmcy0+bWVtX2lkc19vdXQpOworICAgIHMtPm5iX21lbV9pZHNfaW4gID0gMDsKKyAgICBzLT5uYl9tZW1faWRzX291dCA9IDA7CisKKyAgICBhdl9mcmVlcCgmcy0+c3VyZmFjZV9wdHJzX2luKTsKKyAgICBhdl9mcmVlcCgmcy0+c3VyZmFjZV9wdHJzX291dCk7CisgICAgcy0+bmJfc3VyZmFjZV9wdHJzX2luICA9IDA7CisgICAgcy0+bmJfc3VyZmFjZV9wdHJzX291dCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcXN2c2NhbGVfcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9RU1YsIEFWX1BJWF9GTVRfTk9ORSwKKyAgICB9OworICAgIEFWRmlsdGVyRm9ybWF0cyAqcGl4X2ZtdHMgID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhlbF9mb3JtYXRzKTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXRfb3V0X3Bvb2woQVZGaWx0ZXJDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dF93aWR0aCwgaW50IG91dF9oZWlnaHQpCit7CisgICAgUVNWU2NhbGVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgIEFWSFdGcmFtZXNDb250ZXh0ICppbl9mcmFtZXNfY3R4OworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpvdXRfZnJhbWVzX2N0eDsKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmluX2ZyYW1lc19od2N0eDsKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgKm91dF9mcmFtZXNfaHdjdHg7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGluX2Zvcm1hdDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0X2Zvcm1hdDsKKyAgICBpbnQgaSwgcmV0OworCisgICAgLyogY2hlY2sgdGhhdCB3ZSBoYXZlIGEgaHcgY29udGV4dCAqLworICAgIGlmICghY3R4LT5pbnB1dHNbMF0tPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gaHcgY29udGV4dCBwcm92aWRlZCBvbiBpbnB1dFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGluX2ZyYW1lc19jdHggICA9IChBVkhXRnJhbWVzQ29udGV4dCopY3R4LT5pbnB1dHNbMF0tPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgaW5fZnJhbWVzX2h3Y3R4ID0gaW5fZnJhbWVzX2N0eC0+aHdjdHg7CisKKyAgICBpbl9mb3JtYXQgICAgID0gaW5fZnJhbWVzX2N0eC0+c3dfZm9ybWF0OworICAgIG91dF9mb3JtYXQgICAgPSAocy0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSkgPyBpbl9mb3JtYXQgOiBzLT5mb3JtYXQ7CisKKyAgICBvdXRsaW5rLT5od19mcmFtZXNfY3R4ID0gYXZfaHdmcmFtZV9jdHhfYWxsb2MoaW5fZnJhbWVzX2N0eC0+ZGV2aWNlX3JlZik7CisgICAgaWYgKCFvdXRsaW5rLT5od19mcmFtZXNfY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG91dF9mcmFtZXNfY3R4ICAgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKW91dGxpbmstPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgb3V0X2ZyYW1lc19od2N0eCA9IG91dF9mcmFtZXNfY3R4LT5od2N0eDsKKworICAgIG91dF9mcmFtZXNfY3R4LT5mb3JtYXQgICAgICAgICAgICA9IEFWX1BJWF9GTVRfUVNWOworICAgIG91dF9mcmFtZXNfY3R4LT53aWR0aCAgICAgICAgICAgICA9IEZGQUxJR04ob3V0X3dpZHRoLCAgMzIpOworICAgIG91dF9mcmFtZXNfY3R4LT5oZWlnaHQgICAgICAgICAgICA9IEZGQUxJR04ob3V0X2hlaWdodCwgMzIpOworICAgIG91dF9mcmFtZXNfY3R4LT5zd19mb3JtYXQgICAgICAgICA9IG91dF9mb3JtYXQ7CisgICAgb3V0X2ZyYW1lc19jdHgtPmluaXRpYWxfcG9vbF9zaXplID0gNDsKKworICAgIG91dF9mcmFtZXNfaHdjdHgtPmZyYW1lX3R5cGUgPSBpbl9mcmFtZXNfaHdjdHgtPmZyYW1lX3R5cGU7CisKKyAgICByZXQgPSBmZl9maWx0ZXJfaW5pdF9od19mcmFtZXMoY3R4LCBvdXRsaW5rLCAzMik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBhdl9od2ZyYW1lX2N0eF9pbml0KG91dGxpbmstPmh3X2ZyYW1lc19jdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgZm9yIChpID0gMDsgaSA8IG91dF9mcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzOyBpKyspIHsKKyAgICAgICAgbWZ4RnJhbWVJbmZvICppbmZvID0gJm91dF9mcmFtZXNfaHdjdHgtPnN1cmZhY2VzW2ldLkluZm87CisgICAgICAgIGluZm8tPkNyb3BXID0gb3V0X3dpZHRoOworICAgICAgICBpbmZvLT5Dcm9wSCA9IG91dF9oZWlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBtZnhTdGF0dXMgZnJhbWVfYWxsb2MobWZ4SERMIHB0aGlzLCBtZnhGcmFtZUFsbG9jUmVxdWVzdCAqcmVxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZnhGcmFtZUFsbG9jUmVzcG9uc2UgKnJlc3ApCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBwdGhpczsKKyAgICBRU1ZTY2FsZUNvbnRleHQgICAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmICghKHJlcS0+VHlwZSAmIE1GWF9NRU1UWVBFX1ZJREVPX01FTU9SWV9QUk9DRVNTT1JfVEFSR0VUKSB8fAorICAgICAgICAhKHJlcS0+VHlwZSAmIChNRlhfTUVNVFlQRV9GUk9NX1ZQUElOIHwgTUZYX01FTVRZUEVfRlJPTV9WUFBPVVQpKSB8fAorICAgICAgICAhKHJlcS0+VHlwZSAmIE1GWF9NRU1UWVBFX0VYVEVSTkFMX0ZSQU1FKSkKKyAgICAgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7CisKKyAgICBpZiAocmVxLT5UeXBlICYgTUZYX01FTVRZUEVfRlJPTV9WUFBJTikgeworICAgICAgICByZXNwLT5taWRzICAgICAgICAgICA9IHMtPm1lbV9pZHNfaW47CisgICAgICAgIHJlc3AtPk51bUZyYW1lQWN0dWFsID0gcy0+bmJfbWVtX2lkc19pbjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXNwLT5taWRzICAgICAgICAgICA9IHMtPm1lbV9pZHNfb3V0OworICAgICAgICByZXNwLT5OdW1GcmFtZUFjdHVhbCA9IHMtPm5iX21lbV9pZHNfb3V0OworICAgIH0KKworICAgIHJldHVybiBNRlhfRVJSX05PTkU7Cit9CisKK3N0YXRpYyBtZnhTdGF0dXMgZnJhbWVfZnJlZShtZnhIREwgcHRoaXMsIG1meEZyYW1lQWxsb2NSZXNwb25zZSAqcmVzcCkKK3sKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX2xvY2sobWZ4SERMIHB0aGlzLCBtZnhNZW1JZCBtaWQsIG1meEZyYW1lRGF0YSAqcHRyKQoreworICAgIHJldHVybiBNRlhfRVJSX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX3VubG9jayhtZnhIREwgcHRoaXMsIG1meE1lbUlkIG1pZCwgbWZ4RnJhbWVEYXRhICpwdHIpCit7CisgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXRpYyBtZnhTdGF0dXMgZnJhbWVfZ2V0X2hkbChtZnhIREwgcHRoaXMsIG1meE1lbUlkIG1pZCwgbWZ4SERMICpoZGwpCit7CisgICAgKmhkbCA9IG1pZDsKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworfQorCitzdGF0aWMgY29uc3QgbWZ4SGFuZGxlVHlwZSBoYW5kbGVfdHlwZXNbXSA9IHsKKyAgICBNRlhfSEFORExFX1ZBX0RJU1BMQVksCisgICAgTUZYX0hBTkRMRV9EM0Q5X0RFVklDRV9NQU5BR0VSLAorICAgIE1GWF9IQU5ETEVfRDNEMTFfREVWSUNFLAorfTsKKworc3RhdGljIGludCBpbml0X291dF9zZXNzaW9uKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworCisgICAgUVNWU2NhbGVDb250ZXh0ICAgICAgICAgICAgICAgICAgICpzID0gY3R4LT5wcml2OworICAgIEFWSFdGcmFtZXNDb250ZXh0ICAgICAqaW5fZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopY3R4LT5pbnB1dHNbMF0tPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAgKm91dF9mcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KiljdHgtPm91dHB1dHNbMF0tPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICAqaW5fZnJhbWVzX2h3Y3R4ID0gaW5fZnJhbWVzX2N0eC0+aHdjdHg7CisgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICpvdXRfZnJhbWVzX2h3Y3R4ID0gb3V0X2ZyYW1lc19jdHgtPmh3Y3R4OworICAgIEFWUVNWRGV2aWNlQ29udGV4dCAgICAgKmRldmljZV9od2N0eCA9IGluX2ZyYW1lc19jdHgtPmRldmljZV9jdHgtPmh3Y3R4OworCisgICAgaW50IG9wYXF1ZSA9ICEhKGluX2ZyYW1lc19od2N0eC0+ZnJhbWVfdHlwZSAmIE1GWF9NRU1UWVBFX09QQVFVRV9GUkFNRSk7CisKKyAgICBtZnhIREwgaGFuZGxlID0gTlVMTDsKKyAgICBtZnhIYW5kbGVUeXBlIGhhbmRsZV90eXBlOworICAgIG1meFZlcnNpb24gdmVyOworICAgIG1meElNUEwgaW1wbDsKKyAgICBtZnhWaWRlb1BhcmFtIHBhcjsKKyAgICBtZnhTdGF0dXMgZXJyOworICAgIGludCBpOworCisgICAgLyogZXh0cmFjdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgIm1hc3RlciIgc2Vzc2lvbiBnaXZlbiB0byB1cyAqLworICAgIGVyciA9IE1GWFF1ZXJ5SU1QTChkZXZpY2VfaHdjdHgtPnNlc3Npb24sICZpbXBsKTsKKyAgICBpZiAoZXJyID09IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgZXJyID0gTUZYUXVlcnlWZXJzaW9uKGRldmljZV9od2N0eC0+c2Vzc2lvbiwgJnZlcik7CisgICAgaWYgKGVyciAhPSBNRlhfRVJSX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcXVlcnlpbmcgdGhlIHNlc3Npb24gYXR0cmlidXRlc1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGhhbmRsZV90eXBlcyk7IGkrKykgeworICAgICAgICBlcnIgPSBNRlhWaWRlb0NPUkVfR2V0SGFuZGxlKGRldmljZV9od2N0eC0+c2Vzc2lvbiwgaGFuZGxlX3R5cGVzW2ldLCAmaGFuZGxlKTsKKyAgICAgICAgaWYgKGVyciA9PSBNRlhfRVJSX05PTkUpIHsKKyAgICAgICAgICAgIGhhbmRsZV90eXBlID0gaGFuZGxlX3R5cGVzW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjcmVhdGUgYSAic2xhdmUiIHNlc3Npb24gd2l0aCB0aG9zZSBzYW1lIHByb3BlcnRpZXMsIHRvIGJlIHVzZWQgZm9yCisgICAgICogYWN0dWFsIHNjYWxpbmcgKi8KKyAgICBlcnIgPSBNRlhJbml0KGltcGwsICZ2ZXIsICZzLT5zZXNzaW9uKTsKKyAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgYSBzZXNzaW9uIGZvciBzY2FsaW5nXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgIGVyciA9IE1GWFZpZGVvQ09SRV9TZXRIYW5kbGUocy0+c2Vzc2lvbiwgaGFuZGxlX3R5cGUsIGhhbmRsZSk7CisgICAgICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoUVNWX1JVTlRJTUVfVkVSU0lPTl9BVExFQVNUKHZlciwgMSwgMjUpKSB7CisgICAgICAgIGVyciA9IE1GWEpvaW5TZXNzaW9uKGRldmljZV9od2N0eC0+c2Vzc2lvbiwgcy0+c2Vzc2lvbik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIG1lbXNldCgmcGFyLCAwLCBzaXplb2YocGFyKSk7CisKKyAgICBpZiAob3BhcXVlKSB7CisgICAgICAgIHMtPnN1cmZhY2VfcHRyc19pbiA9IGF2X21hbGxvY3pfYXJyYXkoaW5fZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPnN1cmZhY2VfcHRyc19pbikpOworICAgICAgICBpZiAoIXMtPnN1cmZhY2VfcHRyc19pbikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbl9mcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzOyBpKyspCisgICAgICAgICAgICBzLT5zdXJmYWNlX3B0cnNfaW5baV0gPSBpbl9mcmFtZXNfaHdjdHgtPnN1cmZhY2VzICsgaTsKKyAgICAgICAgcy0+bmJfc3VyZmFjZV9wdHJzX2luID0gaW5fZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlczsKKworICAgICAgICBzLT5zdXJmYWNlX3B0cnNfb3V0ID0gYXZfbWFsbG9jel9hcnJheShvdXRfZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5zdXJmYWNlX3B0cnNfb3V0KSk7CisgICAgICAgIGlmICghcy0+c3VyZmFjZV9wdHJzX291dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXRfZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlczsgaSsrKQorICAgICAgICAgICAgcy0+c3VyZmFjZV9wdHJzX291dFtpXSA9IG91dF9mcmFtZXNfaHdjdHgtPnN1cmZhY2VzICsgaTsKKyAgICAgICAgcy0+bmJfc3VyZmFjZV9wdHJzX291dCA9IG91dF9mcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzOworCisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5Jbi5TdXJmYWNlcyAgID0gcy0+c3VyZmFjZV9wdHJzX2luOworICAgICAgICBzLT5vcGFxdWVfYWxsb2MuSW4uTnVtU3VyZmFjZSA9IHMtPm5iX3N1cmZhY2VfcHRyc19pbjsKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLkluLlR5cGUgICAgICAgPSBpbl9mcmFtZXNfaHdjdHgtPmZyYW1lX3R5cGU7CisKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLk91dC5TdXJmYWNlcyAgID0gcy0+c3VyZmFjZV9wdHJzX291dDsKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLk91dC5OdW1TdXJmYWNlID0gcy0+bmJfc3VyZmFjZV9wdHJzX291dDsKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLk91dC5UeXBlICAgICAgID0gb3V0X2ZyYW1lc19od2N0eC0+ZnJhbWVfdHlwZTsKKworICAgICAgICBzLT5vcGFxdWVfYWxsb2MuSGVhZGVyLkJ1ZmZlcklkID0gTUZYX0VYVEJVRkZfT1BBUVVFX1NVUkZBQ0VfQUxMT0NBVElPTjsKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLkhlYWRlci5CdWZmZXJTeiA9IHNpemVvZihzLT5vcGFxdWVfYWxsb2MpOworCisgICAgICAgIHMtPmV4dF9idWZmZXJzWzBdID0gKG1meEV4dEJ1ZmZlciopJnMtPm9wYXF1ZV9hbGxvYzsKKworICAgICAgICBwYXIuRXh0UGFyYW0gICAgPSBzLT5leHRfYnVmZmVyczsKKyAgICAgICAgcGFyLk51bUV4dFBhcmFtID0gRkZfQVJSQVlfRUxFTVMocy0+ZXh0X2J1ZmZlcnMpOworCisgICAgICAgIHBhci5JT1BhdHRlcm4gPSBNRlhfSU9QQVRURVJOX0lOX09QQVFVRV9NRU1PUlkgfCBNRlhfSU9QQVRURVJOX09VVF9PUEFRVUVfTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICAgIG1meEZyYW1lQWxsb2NhdG9yIGZyYW1lX2FsbG9jYXRvciA9IHsKKyAgICAgICAgICAgIC5wdGhpcyAgPSBjdHgsCisgICAgICAgICAgICAuQWxsb2MgID0gZnJhbWVfYWxsb2MsCisgICAgICAgICAgICAuTG9jayAgID0gZnJhbWVfbG9jaywKKyAgICAgICAgICAgIC5VbmxvY2sgPSBmcmFtZV91bmxvY2ssCisgICAgICAgICAgICAuR2V0SERMID0gZnJhbWVfZ2V0X2hkbCwKKyAgICAgICAgICAgIC5GcmVlICAgPSBmcmFtZV9mcmVlLAorICAgICAgICB9OworCisgICAgICAgIHMtPm1lbV9pZHNfaW4gPSBhdl9tYWxsb2N6X2FycmF5KGluX2ZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+bWVtX2lkc19pbikpOworICAgICAgICBpZiAoIXMtPm1lbV9pZHNfaW4pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5fZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlczsgaSsrKQorICAgICAgICAgICAgcy0+bWVtX2lkc19pbltpXSA9IGluX2ZyYW1lc19od2N0eC0+c3VyZmFjZXNbaV0uRGF0YS5NZW1JZDsKKyAgICAgICAgcy0+bmJfbWVtX2lkc19pbiA9IGluX2ZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7CisKKyAgICAgICAgcy0+bWVtX2lkc19vdXQgPSBhdl9tYWxsb2N6X2FycmF5KG91dF9mcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5tZW1faWRzX291dCkpOworICAgICAgICBpZiAoIXMtPm1lbV9pZHNfb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dF9mcmFtZXNfaHdjdHgtPm5iX3N1cmZhY2VzOyBpKyspCisgICAgICAgICAgICBzLT5tZW1faWRzX291dFtpXSA9IG91dF9mcmFtZXNfaHdjdHgtPnN1cmZhY2VzW2ldLkRhdGEuTWVtSWQ7CisgICAgICAgIHMtPm5iX21lbV9pZHNfb3V0ID0gb3V0X2ZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7CisKKyAgICAgICAgZXJyID0gTUZYVmlkZW9DT1JFX1NldEZyYW1lQWxsb2NhdG9yKHMtPnNlc3Npb24sICZmcmFtZV9hbGxvY2F0b3IpOworICAgICAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisKKyAgICAgICAgcGFyLklPUGF0dGVybiA9IE1GWF9JT1BBVFRFUk5fSU5fVklERU9fTUVNT1JZIHwgTUZYX0lPUEFUVEVSTl9PVVRfVklERU9fTUVNT1JZOworICAgIH0KKworICAgIHBhci5Bc3luY0RlcHRoID0gMTsgICAgLy8gVE9ETyBhc3luYworCisgICAgcGFyLnZwcC5JbiAgPSBpbl9mcmFtZXNfaHdjdHgtPnN1cmZhY2VzWzBdLkluZm87CisgICAgcGFyLnZwcC5PdXQgPSBvdXRfZnJhbWVzX2h3Y3R4LT5zdXJmYWNlc1swXS5JbmZvOworCisgICAgLyogQXBwYXJlbnRseSBWUFAgcmVxdWlyZXMgdGhlIGZyYW1lIHJhdGUgdG8gYmUgc2V0IHRvIHNvbWUgdmFsdWUsIG90aGVyd2lzZQorICAgICAqIGluaXQgd2lsbCBmYWlsIChwcm9iYWJseSBmb3IgdGhlIGZyYW1lcmF0ZSBjb252ZXJzaW9uIGZpbHRlcikuIFNpbmNlIHdlCisgICAgICogYXJlIG9ubHkgZG9pbmcgc2NhbGluZyBoZXJlLCB3ZSBqdXN0IGludmVudCBhbiBhcmJpdHJhcnkKKyAgICAgKiB2YWx1ZSAqLworICAgIHBhci52cHAuSW4uRnJhbWVSYXRlRXh0TiAgPSAyNTsKKyAgICBwYXIudnBwLkluLkZyYW1lUmF0ZUV4dEQgID0gMTsKKyAgICBwYXIudnBwLk91dC5GcmFtZVJhdGVFeHROID0gMjU7CisgICAgcGFyLnZwcC5PdXQuRnJhbWVSYXRlRXh0RCA9IDE7CisKKyAgICBlcnIgPSBNRlhWaWRlb1ZQUF9Jbml0KHMtPnNlc3Npb24sICZwYXIpOworICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIG9wZW5pbmcgdGhlIFZQUCBmb3Igc2NhbGluZ1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zY2FsZV9zZXNzaW9uKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBpbnQgaW5fd2lkdGgsIGludCBpbl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X3dpZHRoLCBpbnQgb3V0X2hlaWdodCkKK3sKKyAgICBpbnQgcmV0OworCisgICAgcXN2c2NhbGVfdW5pbml0KGN0eCk7CisKKyAgICByZXQgPSBpbml0X291dF9wb29sKGN0eCwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGluaXRfb3V0X3Nlc3Npb24oY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzdnNjYWxlX2NvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBvdXRsaW5rLT5zcmMtPmlucHV0c1swXTsKKyAgICBRU1ZTY2FsZUNvbnRleHQgICpzID0gY3R4LT5wcml2OworICAgIGludDY0X3QgdywgaDsKKyAgICBkb3VibGUgdmFyX3ZhbHVlc1tWQVJTX05CXSwgcmVzOworICAgIGNoYXIgKmV4cHI7CisgICAgaW50IHJldDsKKworICAgIHZhcl92YWx1ZXNbVkFSX1BJXSAgICA9IE1fUEk7CisgICAgdmFyX3ZhbHVlc1tWQVJfUEhJXSAgID0gTV9QSEk7CisgICAgdmFyX3ZhbHVlc1tWQVJfRV0gICAgID0gTV9FOworICAgIHZhcl92YWx1ZXNbVkFSX0lOX1ddICA9IHZhcl92YWx1ZXNbVkFSX0lXXSA9IGlubGluay0+dzsKKyAgICB2YXJfdmFsdWVzW1ZBUl9JTl9IXSAgPSB2YXJfdmFsdWVzW1ZBUl9JSF0gPSBpbmxpbmstPmg7CisgICAgdmFyX3ZhbHVlc1tWQVJfT1VUX1ddID0gdmFyX3ZhbHVlc1tWQVJfT1ddID0gTkFOOworICAgIHZhcl92YWx1ZXNbVkFSX09VVF9IXSA9IHZhcl92YWx1ZXNbVkFSX09IXSA9IE5BTjsKKyAgICB2YXJfdmFsdWVzW1ZBUl9BXSAgICAgPSAoZG91YmxlKSBpbmxpbmstPncgLyBpbmxpbmstPmg7CisgICAgdmFyX3ZhbHVlc1tWQVJfU0FSXSAgID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA/CisgICAgICAgIChkb3VibGUpIGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gLyBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIDogMTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9EQVJdICAgPSB2YXJfdmFsdWVzW1ZBUl9BXSAqIHZhcl92YWx1ZXNbVkFSX1NBUl07CisKKyAgICAvKiBldmFsdWF0ZSB3aWR0aCBhbmQgaGVpZ2h0ICovCisgICAgYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCAoZXhwciA9IHMtPndfZXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOworICAgIHMtPncgPSB2YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSB2YXJfdmFsdWVzW1ZBUl9PV10gPSByZXM7CisgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZyZXMsIChleHByID0gcy0+aF9leHByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBzLT5oID0gdmFyX3ZhbHVlc1tWQVJfT1VUX0hdID0gdmFyX3ZhbHVlc1tWQVJfT0hdID0gcmVzOworICAgIC8qIGV2YWx1YXRlIGFnYWluIHRoZSB3aWR0aCwgYXMgaXQgbWF5IGRlcGVuZCBvbiB0aGUgb3V0cHV0IGhlaWdodCAqLworICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmcmVzLCAoZXhwciA9IHMtPndfZXhwciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgdmFyX3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcy0+dyA9IHJlczsKKworICAgIHcgPSBzLT53OworICAgIGggPSBzLT5oOworCisgICAgLyogc2FuaXR5IGNoZWNrIHBhcmFtcyAqLworICAgIGlmICh3IDwgIC0xIHx8IGggPCAgLTEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiU2l6ZSB2YWx1ZXMgbGVzcyB0aGFuIC0xIGFyZSBub3QgYWNjZXB0YWJsZS5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAodyA9PSAtMSAmJiBoID09IC0xKQorICAgICAgICBzLT53ID0gcy0+aCA9IDA7CisKKyAgICBpZiAoISh3ID0gcy0+dykpCisgICAgICAgIHcgPSBpbmxpbmstPnc7CisgICAgaWYgKCEoaCA9IHMtPmgpKQorICAgICAgICBoID0gaW5saW5rLT5oOworICAgIGlmICh3ID09IC0xKQorICAgICAgICB3ID0gYXZfcmVzY2FsZShoLCBpbmxpbmstPncsIGlubGluay0+aCk7CisgICAgaWYgKGggPT0gLTEpCisgICAgICAgIGggPSBhdl9yZXNjYWxlKHcsIGlubGluay0+aCwgaW5saW5rLT53KTsKKworICAgIGlmICh3ID4gSU5UX01BWCB8fCBoID4gSU5UX01BWCB8fAorICAgICAgICAoaCAqIGlubGluay0+dykgPiBJTlRfTUFYICB8fAorICAgICAgICAodyAqIGlubGluay0+aCkgPiBJTlRfTUFYKQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJSZXNjYWxlZCB2YWx1ZSBmb3Igd2lkdGggb3IgaGVpZ2h0IGlzIHRvbyBiaWcuXG4iKTsKKworICAgIG91dGxpbmstPncgPSB3OworICAgIG91dGxpbmstPmggPSBoOworCisgICAgcmV0ID0gaW5pdF9zY2FsZV9zZXNzaW9uKGN0eCwgaW5saW5rLT53LCBpbmxpbmstPmgsIHcsIGgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJ3OiVkIGg6JWQgLT4gdzolZCBoOiVkXG4iLAorICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisKKyAgICBpZiAoaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2X211bF9xKChBVlJhdGlvbmFsKXtvdXRsaW5rLT5oKmlubGluay0+dywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT53KmlubGluay0+aH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgIGVsc2UKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICJFcnJvciB3aGVuIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24gJyVzJ1xuIiwgZXhwcik7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxc3ZzY2FsZV9maWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgICAgICAgICAgICAgKmN0eCA9IGxpbmstPmRzdDsKKyAgICBRU1ZTY2FsZUNvbnRleHQgICAgICAgICAgICAgICAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgICAgICAgICAgICAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKworICAgIG1meFN5bmNQb2ludCBzeW5jID0gTlVMTDsKKyAgICBtZnhTdGF0dXMgZXJyOworCisgICAgQVZGcmFtZSAqb3V0ID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZG8geworICAgICAgICBlcnIgPSBNRlhWaWRlb1ZQUF9SdW5GcmFtZVZQUEFzeW5jKHMtPnNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1meEZyYW1lU3VyZmFjZTEqKWluLT5kYXRhWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZnhGcmFtZVN1cmZhY2UxKilvdXQtPmRhdGFbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnN5bmMpOworICAgICAgICBpZiAoZXJyID09IE1GWF9XUk5fREVWSUNFX0JVU1kpCisgICAgICAgICAgICBhdl91c2xlZXAoMSk7CisgICAgfSB3aGlsZSAoZXJyID09IE1GWF9XUk5fREVWSUNFX0JVU1kpOworCisgICAgaWYgKGVyciA8IDAgfHwgIXN5bmMpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgZHVyaW5nIHNjYWxpbmdcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX1VOS05PV047CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGVyciA9IE1GWFZpZGVvQ09SRV9TeW5jT3BlcmF0aW9uKHMtPnNlc3Npb24sIHN5bmMsIDEwMDApOworICAgIH0gd2hpbGUgKGVyciA9PSBNRlhfV1JOX0lOX0VYRUNVVElPTik7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc3luY2hyb25pemluZyB0aGUgb3BlcmF0aW9uOiAlZFxuIiwgZXJyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgb3V0LT53aWR0aCAgPSBvdXRsaW5rLT53OworICAgIG91dC0+aGVpZ2h0ID0gb3V0bGluay0+aDsKKworICAgIGF2X3JlZHVjZSgmb3V0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgJm91dC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgIChpbnQ2NF90KWluLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAqIG91dGxpbmstPmggKiBsaW5rLT53LAorICAgICAgICAgICAgICAoaW50NjRfdClpbi0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gKiBvdXRsaW5rLT53ICogbGluay0+aCwKKyAgICAgICAgICAgICAgSU5UX01BWCk7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgYXZfZnJhbWVfZnJlZSgmb3V0KTsKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihRU1ZTY2FsZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJ3IiwgICAgICAiT3V0cHV0IHZpZGVvIHdpZHRoIiwgIE9GRlNFVCh3X2V4cHIpLCAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiaXciICAgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJoIiwgICAgICAiT3V0cHV0IHZpZGVvIGhlaWdodCIsIE9GRlNFVChoX2V4cHIpLCAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiaWgiICAgfSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJmb3JtYXQiLCAiT3V0cHV0IHBpeGVsIGZvcm1hdCIsIE9GRlNFVChmb3JtYXRfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAic2FtZSIgfSwgLmZsYWdzID0gRkxBR1MgfSwKKworICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgcXN2c2NhbGVfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAicXN2c2NhbGUiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHFzdnNjYWxlX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IHFzdnNjYWxlX2ZpbHRlcl9mcmFtZSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgcXN2c2NhbGVfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IHFzdnNjYWxlX2NvbmZpZ19wcm9wcywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zY2FsZV9xc3YgPSB7CisgICAgLm5hbWUgICAgICA9ICJzY2FsZV9xc3YiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJRdWlja1N5bmMgdmlkZW8gc2NhbGluZyBhbmQgZm9ybWF0IGNvbnZlcnNpb24iKSwKKworICAgIC5pbml0ICAgICAgICAgID0gcXN2c2NhbGVfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHFzdnNjYWxlX3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHFzdnNjYWxlX3F1ZXJ5X2Zvcm1hdHMsCisKKyAgICAucHJpdl9zaXplID0gc2l6ZW9mKFFTVlNjYWxlQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgPSAmcXN2c2NhbGVfY2xhc3MsCisKKyAgICAuaW5wdXRzICAgID0gcXN2c2NhbGVfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgPSBxc3ZzY2FsZV9vdXRwdXRzLAorCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9zY2FsZV92YWFwaS5jIGIvbGliYXZmaWx0ZXIvdmZfc2NhbGVfdmFhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjUyOWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2NhbGVfdmFhcGkuYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImZvcm1hdHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInNjYWxlLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKyNpbmNsdWRlICJ2YWFwaV92cHAuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU2NhbGVWQUFQSUNvbnRleHQgeworICAgIFZBQVBJVlBQQ29udGV4dCB2cHBfY3R4OyAvLyBtdXN0IGJlIHRoZSBmaXJzdCBmaWVsZAorCisgICAgY2hhciAqb3V0cHV0X2Zvcm1hdF9zdHJpbmc7CisKKyAgICBjaGFyICp3X2V4cHI7ICAgICAgLy8gd2lkdGggZXhwcmVzc2lvbiBzdHJpbmcKKyAgICBjaGFyICpoX2V4cHI7ICAgICAgLy8gaGVpZ2h0IGV4cHJlc3Npb24gc3RyaW5nCit9IFNjYWxlVkFBUElDb250ZXh0OworCitzdGF0aWMgaW50IHNjYWxlX3ZhYXBpX2NvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyTGluayAqaW5saW5rICAgICA9IG91dGxpbmstPnNyYy0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyQ29udGV4dCAqYXZjdHggICA9IG91dGxpbmstPnNyYzsKKyAgICBWQUFQSVZQUENvbnRleHQgKnZwcF9jdHggPSBhdmN0eC0+cHJpdjsKKyAgICBTY2FsZVZBQVBJQ29udGV4dCAqY3R4ICAgPSBhdmN0eC0+cHJpdjsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKChlcnIgPSBmZl9zY2FsZV9ldmFsX2RpbWVuc2lvbnMoY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+d19leHByLCBjdHgtPmhfZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmssIG91dGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZwcF9jdHgtPm91dHB1dF93aWR0aCwgJnZwcF9jdHgtPm91dHB1dF9oZWlnaHQpKSA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBmZl92YWFwaV92cHBfY29uZmlnX291dHB1dChvdXRsaW5rKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGlmIChpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKQorICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfbXVsX3EoKEFWUmF0aW9uYWwpe291dGxpbmstPmggKiBpbmxpbmstPncsIG91dGxpbmstPncgKiBpbmxpbmstPmh9LCBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8pOworICAgIGVsc2UKKyAgICAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYWxlX3ZhYXBpX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5wdXRfZnJhbWUpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICphdmN0eCAgID0gaW5saW5rLT5kc3Q7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rICAgID0gYXZjdHgtPm91dHB1dHNbMF07CisgICAgVkFBUElWUFBDb250ZXh0ICp2cHBfY3R4ID0gYXZjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0cHV0X2ZyYW1lICAgID0gTlVMTDsKKyAgICBWQVN1cmZhY2VJRCBpbnB1dF9zdXJmYWNlLCBvdXRwdXRfc3VyZmFjZTsKKyAgICBWQVByb2NQaXBlbGluZVBhcmFtZXRlckJ1ZmZlciBwYXJhbXM7CisgICAgVkFSZWN0YW5nbGUgaW5wdXRfcmVnaW9uOworICAgIGludCBlcnI7CisKKyAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkZpbHRlciBpbnB1dDogJXMsICV1eCV1ICglIlBSSWQ2NCIpLlxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbnB1dF9mcmFtZS0+Zm9ybWF0KSwKKyAgICAgICAgICAgaW5wdXRfZnJhbWUtPndpZHRoLCBpbnB1dF9mcmFtZS0+aGVpZ2h0LCBpbnB1dF9mcmFtZS0+cHRzKTsKKworICAgIGlmICh2cHBfY3R4LT52YV9jb250ZXh0ID09IFZBX0lOVkFMSURfSUQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpbnB1dF9zdXJmYWNlID0gKFZBU3VyZmFjZUlEKSh1aW50cHRyX3QpaW5wdXRfZnJhbWUtPmRhdGFbM107CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyBzdXJmYWNlICUjeCBmb3Igc2NhbGUgaW5wdXQuXG4iLAorICAgICAgICAgICBpbnB1dF9zdXJmYWNlKTsKKworICAgIG91dHB1dF9mcmFtZSA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgdnBwX2N0eC0+b3V0cHV0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnBwX2N0eC0+b3V0cHV0X2hlaWdodCk7CisgICAgaWYgKCFvdXRwdXRfZnJhbWUpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgb3V0cHV0X3N1cmZhY2UgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClvdXRwdXRfZnJhbWUtPmRhdGFbM107CisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJVc2luZyBzdXJmYWNlICUjeCBmb3Igc2NhbGUgb3V0cHV0LlxuIiwKKyAgICAgICAgICAgb3V0cHV0X3N1cmZhY2UpOworCisgICAgbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKworICAgIGlucHV0X3JlZ2lvbiA9IChWQVJlY3RhbmdsZSkgeworICAgICAgICAueCAgICAgID0gaW5wdXRfZnJhbWUtPmNyb3BfbGVmdCwKKyAgICAgICAgLnkgICAgICA9IGlucHV0X2ZyYW1lLT5jcm9wX3RvcCwKKyAgICAgICAgLndpZHRoICA9IGlucHV0X2ZyYW1lLT53aWR0aCAtCisgICAgICAgICAgICAgICAgIChpbnB1dF9mcmFtZS0+Y3JvcF9sZWZ0ICsgaW5wdXRfZnJhbWUtPmNyb3BfcmlnaHQpLAorICAgICAgICAuaGVpZ2h0ID0gaW5wdXRfZnJhbWUtPmhlaWdodCAtCisgICAgICAgICAgICAgICAgIChpbnB1dF9mcmFtZS0+Y3JvcF90b3AgKyBpbnB1dF9mcmFtZS0+Y3JvcF9ib3R0b20pLAorICAgIH07CisKKyAgICBwYXJhbXMuc3VyZmFjZSA9IGlucHV0X3N1cmZhY2U7CisgICAgcGFyYW1zLnN1cmZhY2VfcmVnaW9uID0gJmlucHV0X3JlZ2lvbjsKKyAgICBwYXJhbXMuc3VyZmFjZV9jb2xvcl9zdGFuZGFyZCA9CisgICAgICAgIGZmX3ZhYXBpX3ZwcF9jb2xvdXJfc3RhbmRhcmQoaW5wdXRfZnJhbWUtPmNvbG9yc3BhY2UpOworCisgICAgcGFyYW1zLm91dHB1dF9yZWdpb24gPSAwOworICAgIHBhcmFtcy5vdXRwdXRfYmFja2dyb3VuZF9jb2xvciA9IDB4ZmYwMDAwMDA7CisgICAgcGFyYW1zLm91dHB1dF9jb2xvcl9zdGFuZGFyZCA9IHBhcmFtcy5zdXJmYWNlX2NvbG9yX3N0YW5kYXJkOworCisgICAgcGFyYW1zLnBpcGVsaW5lX2ZsYWdzID0gMDsKKyAgICBwYXJhbXMuZmlsdGVyX2ZsYWdzID0gVkFfRklMVEVSX1NDQUxJTkdfSFE7CisKKyAgICBlcnIgPSBmZl92YWFwaV92cHBfcmVuZGVyX3BpY3R1cmUoYXZjdHgsICZwYXJhbXMsIG91dHB1dF9zdXJmYWNlKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXJyID0gYXZfZnJhbWVfY29weV9wcm9wcyhvdXRwdXRfZnJhbWUsIGlucHV0X2ZyYW1lKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgYXZfZnJhbWVfZnJlZSgmaW5wdXRfZnJhbWUpOworCisgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgb3V0cHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dHB1dF9mcmFtZS0+Zm9ybWF0KSwKKyAgICAgICAgICAgb3V0cHV0X2ZyYW1lLT53aWR0aCwgb3V0cHV0X2ZyYW1lLT5oZWlnaHQsIG91dHB1dF9mcmFtZS0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cHV0X2ZyYW1lKTsKKworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dF9mcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmb3V0cHV0X2ZyYW1lKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgc2NhbGVfdmFhcGlfaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIFZBQVBJVlBQQ29udGV4dCAqdnBwX2N0eCA9IGF2Y3R4LT5wcml2OworICAgIFNjYWxlVkFBUElDb250ZXh0ICpjdHggICA9IGF2Y3R4LT5wcml2OworCisgICAgZmZfdmFhcGlfdnBwX2N0eF9pbml0KGF2Y3R4KTsKKyAgICB2cHBfY3R4LT5waXBlbGluZV91bmluaXQgPSBmZl92YWFwaV92cHBfcGlwZWxpbmVfdW5pbml0OworCisgICAgaWYgKGN0eC0+b3V0cHV0X2Zvcm1hdF9zdHJpbmcpIHsKKyAgICAgICAgdnBwX2N0eC0+b3V0cHV0X2Zvcm1hdCA9IGF2X2dldF9waXhfZm10KGN0eC0+b3V0cHV0X2Zvcm1hdF9zdHJpbmcpOworICAgICAgICBpZiAodnBwX2N0eC0+b3V0cHV0X2Zvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBvdXRwdXQgZm9ybWF0LlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIHRoZSBpbnB1dCBmb3JtYXQgb25jZSB0aGF0IGlzIGNvbmZpZ3VyZWQuCisgICAgICAgIHZwcF9jdHgtPm91dHB1dF9mb3JtYXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNjYWxlVkFBUElDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNKQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIHNjYWxlX3ZhYXBpX29wdGlvbnNbXSA9IHsKKyAgICB7ICJ3IiwgIk91dHB1dCB2aWRlbyB3aWR0aCIsCisgICAgICBPRkZTRVQod19leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpdyJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImgiLCAiT3V0cHV0IHZpZGVvIGhlaWdodCIsCisgICAgICBPRkZTRVQoaF9leHByKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJpaCJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImZvcm1hdCIsICJPdXRwdXQgdmlkZW8gZm9ybWF0IChzb2Z0d2FyZSBmb3JtYXQgb2YgaGFyZHdhcmUgZnJhbWVzKSIsCisgICAgICBPRkZTRVQob3V0cHV0X2Zvcm1hdF9zdHJpbmcpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyBOVUxMIH0sCit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc2NhbGVfdmFhcGkpOworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgc2NhbGVfdmFhcGlfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gJnNjYWxlX3ZhYXBpX2ZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9ICZmZl92YWFwaV92cHBfY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzY2FsZV92YWFwaV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSAmc2NhbGVfdmFhcGlfY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl9zY2FsZV92YWFwaSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzY2FsZV92YWFwaSIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2NhbGUgdG8vZnJvbSBWQUFQSSBzdXJmYWNlcy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTY2FsZVZBQVBJQ29udGV4dCksCisgICAgLmluaXQgICAgICAgICAgPSAmc2NhbGVfdmFhcGlfaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9ICZmZl92YWFwaV92cHBfY3R4X3VuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9ICZmZl92YWFwaV92cHBfcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHNjYWxlX3ZhYXBpX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHNjYWxlX3ZhYXBpX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmc2NhbGVfdmFhcGlfY2xhc3MsCisgICAgLmZsYWdzX2ludGVybmFsID0gRkZfRklMVEVSX0ZMQUdfSFdGUkFNRV9BV0FSRSwKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9zZWxlY3RpdmVjb2xvci5jIGIvbGliYXZmaWx0ZXIvdmZfc2VsZWN0aXZlY29sb3IuYwppbmRleCBlNTkwMDk0Li5jNGQ1MWJiIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9zZWxlY3RpdmVjb2xvci5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3NlbGVjdGl2ZWNvbG9yLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChjKSAyMDE1IENsw6ltZW50IELFk3NjaCA8dSBwa2ggbWU+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxNiBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0xOSwyMCArMTksMjggQEAKICAqLwogCiAvKioKKyAqIEBzZWUgaHR0cDovL2Jsb2cucGtoLm1lL3AvMjItdW5kZXJzdGFuZGluZy1zZWxlY3RpdmUtY29sb3JpbmctaW4tYWRvYmUtcGhvdG9zaG9wLmh0bWwKICAqIEB0b2RvCiAgKiAtIHVzZSBpbnRlZ2VycyBzbyBpdCBjYW4gYmUgbWFkZSBiaXRleGFjdCBhbmQgYSBGQVRFIHRlc3QgY2FuIGJlIGFkZGVkCi0gKiAtID44IGJpdCBzdXBwb3J0CiAgKi8KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIiAvLyBmb3IgbWlkX3ByZWQoKSwgd2hpY2ggaXMgYSBtYWNybyBzbyBubyBsaW5rIGRlcGVuZGVuY3kKICNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImRyYXd1dGlscy5oIgogI2luY2x1ZGUgImZvcm1hdHMuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAKKyNkZWZpbmUgUiAwCisjZGVmaW5lIEcgMQorI2RlZmluZSBCIDIKKyNkZWZpbmUgQSAzCisKIGVudW0gY29sb3JfcmFuZ2UgewogICAgIC8vIFdBUk5JTkc6IGRvIE5PVCByZW9yZGVyIChzZWUgcGFyc2VfcHNmaWxlKCkpCiAgICAgUkFOR0VfUkVEUywKQEAgLTU3LDE5ICs2NSwxOSBAQAogICAgICJyZWQiLCAieWVsbG93IiwgImdyZWVuIiwgImN5YW4iLCAiYmx1ZSIsICJtYWdlbnRhIiwgIndoaXRlIiwgIm5ldXRyYWwiLCAiYmxhY2siCiB9OwogCi10eXBlZGVmIGludCAoKmdldF9hZGp1c3RfcmFuZ2VfZnVuYykoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IG1pbl92YWwsIGludCBtYXhfdmFsKTsKK3R5cGVkZWYgaW50ICgqZ2V0X3JhbmdlX3NjYWxlX2Z1bmMpKGludCByLCBpbnQgZywgaW50IGIsIGludCBtaW5fdmFsLCBpbnQgbWF4X3ZhbCk7CiAKIHN0cnVjdCBwcm9jZXNzX3JhbmdlIHsKICAgICBpbnQgcmFuZ2VfaWQ7CiAgICAgdWludDMyX3QgbWFzazsKLSAgICBnZXRfYWRqdXN0X3JhbmdlX2Z1bmMgZ2V0X2FkanVzdF9yYW5nZTsKKyAgICBnZXRfcmFuZ2Vfc2NhbGVfZnVuYyBnZXRfc2NhbGU7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCBUaHJlYWREYXRhIHsKICAgICBBVkZyYW1lICppbiwgKm91dDsKIH0gVGhyZWFkRGF0YTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgU2VsZWN0aXZlQ29sb3JDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgY29ycmVjdGlvbl9tZXRob2Q7CiAgICAgY2hhciAqb3B0X2NteWtfYWRqdXN0W05CX1JBTkdFU107CkBAIC03Nyw2ICs4NSw5IEBACiAgICAgc3RydWN0IHByb2Nlc3NfcmFuZ2UgcHJvY2Vzc19yYW5nZXNbTkJfUkFOR0VTXTsgLy8gY29sb3IgcmFuZ2VzIHRvIHByb2Nlc3MKICAgICBpbnQgbmJfcHJvY2Vzc19yYW5nZXM7CiAgICAgY2hhciAqcHNmaWxlOworICAgIHVpbnQ4X3QgcmdiYV9tYXBbNF07CisgICAgaW50IGlzXzE2Yml0OworICAgIGludCBzdGVwOwogfSBTZWxlY3RpdmVDb2xvckNvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNlbGVjdGl2ZUNvbG9yQ29udGV4dCwgeCkKQEAgLTEwMyw2MSArMTE0LDM4IEBACiAKIEFWRklMVEVSX0RFRklORV9DTEFTUyhzZWxlY3RpdmVjb2xvcik7CiAKLXN0YXRpYyBpbmxpbmUgaW50IGdldF9taWRfdmFsKGludCByLCBpbnQgZywgaW50IGIpCitzdGF0aWMgaW50IGdldF9yZ2Jfc2NhbGUoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IG1pbl92YWwsIGludCBtYXhfdmFsKQogewotICAgIGlmICgociA8IGcgJiYgciA+IGIpIHx8IChyIDwgYiAmJiByID4gZykpIHJldHVybiByOwotICAgIGlmICgoZyA8IHIgJiYgZyA+IGIpIHx8IChnIDwgYiAmJiBnID4gcikpIHJldHVybiBnOwotICAgIGlmICgoYiA8IHIgJiYgYiA+IGcpIHx8IChiIDwgZyAmJiBiID4gcikpIHJldHVybiBiOwotICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gbWF4X3ZhbCAtIG1pZF9wcmVkKHIsIGcsIGIpOwogfQogCi1zdGF0aWMgaW50IGdldF9yZ2JfYWRqdXN0X3JhbmdlKGludCByLCBpbnQgZywgaW50IGIsIGludCBtaW5fdmFsLCBpbnQgbWF4X3ZhbCkKK3N0YXRpYyBpbnQgZ2V0X2NteV9zY2FsZShpbnQgciwgaW50IGcsIGludCBiLCBpbnQgbWluX3ZhbCwgaW50IG1heF92YWwpCiB7Ci0gICAgLy8gbWF4IC0gbWlkCi0gICAgY29uc3QgaW50IG1pZF92YWwgPSBnZXRfbWlkX3ZhbChyLCBnLCBiKTsKLSAgICBpZiAobWlkX3ZhbCA9PSAtMSkgewotICAgICAgICAvLyBYWFg6IGNhbiBiZSBzaW1wbGlmaWVkCi0gICAgICAgIGlmICgociAhPSBtaW5fdmFsICYmIGcgPT0gbWluX3ZhbCAmJiBiID09IG1pbl92YWwpIHx8Ci0gICAgICAgICAgICAociA9PSBtaW5fdmFsICYmIGcgIT0gbWluX3ZhbCAmJiBiID09IG1pbl92YWwpIHx8Ci0gICAgICAgICAgICAociA9PSBtaW5fdmFsICYmIGcgPT0gbWluX3ZhbCAmJiBiICE9IG1pbl92YWwpKQotICAgICAgICAgICAgcmV0dXJuIG1heF92YWwgLSBtaW5fdmFsOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG1heF92YWwgLSBtaWRfdmFsOworICAgIHJldHVybiBtaWRfcHJlZChyLCBnLCBiKSAtIG1pbl92YWw7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2NteV9hZGp1c3RfcmFuZ2UoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IG1pbl92YWwsIGludCBtYXhfdmFsKQotewotICAgIC8vIG1pZCAtIG1pbgotICAgIGNvbnN0IGludCBtaWRfdmFsID0gZ2V0X21pZF92YWwociwgZywgYik7Ci0gICAgaWYgKG1pZF92YWwgPT0gLTEpIHsKLSAgICAgICAgLy8gWFhYOiByZWZhY3RvciB3aXRoIHJnYgotICAgICAgICBpZiAoKHIgIT0gbWF4X3ZhbCAmJiBnID09IG1heF92YWwgJiYgYiA9PSBtYXhfdmFsKSB8fAotICAgICAgICAgICAgKHIgPT0gbWF4X3ZhbCAmJiBnICE9IG1heF92YWwgJiYgYiA9PSBtYXhfdmFsKSB8fAotICAgICAgICAgICAgKHIgPT0gbWF4X3ZhbCAmJiBnID09IG1heF92YWwgJiYgYiAhPSBtYXhfdmFsKSkKLSAgICAgICAgICAgIHJldHVybiBtYXhfdmFsIC0gbWluX3ZhbDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtaWRfdmFsIC0gbWluX3ZhbDsKLX0KKyNkZWZpbmUgREVDTEFSRV9SQU5HRV9TQ0FMRV9GVU5DUyhuYml0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBnZXRfbmV1dHJhbHNfc2NhbGUjI25iaXRzKGludCByLCBpbnQgZywgaW50IGIsIGludCBtaW5fdmFsLCBpbnQgbWF4X3ZhbCkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiAxIC0gKHxtYXgtMC41fCArIHxtaW4tMC41fCkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAoKCgxPDxuYml0cyktMSkqMiAtICggIGFicygobWF4X3ZhbDw8MSkgLSAoKDE8PG5iaXRzKS0xKSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYWJzKChtaW5fdmFsPDwxKSAtICgoMTw8bmJpdHMpLTEpKSkgKyAxKSA+PiAxOyAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGdldF93aGl0ZXNfc2NhbGUjI25iaXRzKGludCByLCBpbnQgZywgaW50IGIsIGludCBtaW5fdmFsLCBpbnQgbWF4X3ZhbCkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIChtaW4gLSAwLjUpICogMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIChtaW5fdmFsPDwxKSAtICgoMTw8bmJpdHMpLTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGdldF9ibGFja3Nfc2NhbGUjI25iaXRzKGludCByLCBpbnQgZywgaW50IGIsIGludCBtaW5fdmFsLCBpbnQgbWF4X3ZhbCkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qICgwLjUgLSBtYXgpICogMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICgoMTw8bmJpdHMpLTEpIC0gKG1heF92YWw8PDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCi1zdGF0aWMgaW50IGdldF9uZXV0cmFsc19hZGp1c3RfcmFuZ2UoaW50IHIsIGludCBnLCBpbnQgYiwgaW50IG1pbl92YWwsIGludCBtYXhfdmFsKQotewotICAgIC8vIDEgLSAofG1heC0wLjV8ICsgfG1pbi0wLjV8KQotICAgIHJldHVybiAoMjU1KjIgLSAoYWJzKChtYXhfdmFsPDwxKSAtIDI1NSkgKyBhYnMoKG1pbl92YWw8PDEpIC0gMjU1KSkgKyAxKSA+PiAxOwotfQotCi1zdGF0aWMgaW50IGdldF93aGl0ZXNfYWRqdXN0X3JhbmdlKGludCByLCBpbnQgZywgaW50IGIsIGludCBtaW5fdmFsLCBpbnQgbWF4X3ZhbCkKLXsKLSAgICAvLyAobWluIC0gMC41KSAqIDIKLSAgICByZXR1cm4gKG1pbl92YWw8PDEpIC0gMjU1OwotfQotCi1zdGF0aWMgaW50IGdldF9ibGFja3NfYWRqdXN0X3JhbmdlKGludCByLCBpbnQgZywgaW50IGIsIGludCBtaW5fdmFsLCBpbnQgbWF4X3ZhbCkKLXsKLSAgICAvLyAoMC41IC0gbWF4KSAqIDIKLSAgICByZXR1cm4gMjU1IC0gKG1heF92YWw8PDEpOwotfQorREVDTEFSRV9SQU5HRV9TQ0FMRV9GVU5DUyg4KQorREVDTEFSRV9SQU5HRV9TQ0FMRV9GVU5DUygxNikKIAogc3RhdGljIGludCByZWdpc3Rlcl9yYW5nZShTZWxlY3RpdmVDb2xvckNvbnRleHQgKnMsIGludCByYW5nZV9pZCkKIHsKQEAgLTE4MCwxMSArMTY4LDE0IEBACiAKICAgICAgICAgcHItPnJhbmdlX2lkID0gcmFuZ2VfaWQ7CiAgICAgICAgIHByLT5tYXNrID0gMSA8PCByYW5nZV9pZDsKLSAgICAgICAgaWYgICAgICAocHItPm1hc2sgJiAoMTw8UkFOR0VfUkVEUyAgfCAxPDxSQU5HRV9HUkVFTlMgICB8IDE8PFJBTkdFX0JMVUVTKSkgICBwci0+Z2V0X2FkanVzdF9yYW5nZSA9IGdldF9yZ2JfYWRqdXN0X3JhbmdlOwotICAgICAgICBlbHNlIGlmIChwci0+bWFzayAmICgxPDxSQU5HRV9DWUFOUyB8IDE8PFJBTkdFX01BR0VOVEFTIHwgMTw8UkFOR0VfWUVMTE9XUykpIHByLT5nZXRfYWRqdXN0X3JhbmdlID0gZ2V0X2NteV9hZGp1c3RfcmFuZ2U7Ci0gICAgICAgIGVsc2UgaWYgKHByLT5tYXNrICYgMTw8UkFOR0VfV0hJVEVTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPmdldF9hZGp1c3RfcmFuZ2UgPSBnZXRfd2hpdGVzX2FkanVzdF9yYW5nZTsKLSAgICAgICAgZWxzZSBpZiAocHItPm1hc2sgJiAxPDxSQU5HRV9ORVVUUkFMUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+Z2V0X2FkanVzdF9yYW5nZSA9IGdldF9uZXV0cmFsc19hZGp1c3RfcmFuZ2U7Ci0gICAgICAgIGVsc2UgaWYgKHByLT5tYXNrICYgMTw8UkFOR0VfQkxBQ0tTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPmdldF9hZGp1c3RfcmFuZ2UgPSBnZXRfYmxhY2tzX2FkanVzdF9yYW5nZTsKKyAgICAgICAgaWYgICAgICAocHItPm1hc2sgJiAoMTw8UkFOR0VfUkVEUyAgfCAxPDxSQU5HRV9HUkVFTlMgICB8IDE8PFJBTkdFX0JMVUVTKSkgICBwci0+Z2V0X3NjYWxlID0gZ2V0X3JnYl9zY2FsZTsKKyAgICAgICAgZWxzZSBpZiAocHItPm1hc2sgJiAoMTw8UkFOR0VfQ1lBTlMgfCAxPDxSQU5HRV9NQUdFTlRBUyB8IDE8PFJBTkdFX1lFTExPV1MpKSBwci0+Z2V0X3NjYWxlID0gZ2V0X2NteV9zY2FsZTsKKyAgICAgICAgZWxzZSBpZiAoIXMtPmlzXzE2Yml0ICYmIChwci0+bWFzayAmIDE8PFJBTkdFX1dISVRFUykpICAgICAgICAgICAgICAgICAgICAgICBwci0+Z2V0X3NjYWxlID0gZ2V0X3doaXRlc19zY2FsZTg7CisgICAgICAgIGVsc2UgaWYgKCFzLT5pc18xNmJpdCAmJiAocHItPm1hc2sgJiAxPDxSQU5HRV9ORVVUUkFMUykpICAgICAgICAgICAgICAgICAgICAgcHItPmdldF9zY2FsZSA9IGdldF9uZXV0cmFsc19zY2FsZTg7CisgICAgICAgIGVsc2UgaWYgKCFzLT5pc18xNmJpdCAmJiAocHItPm1hc2sgJiAxPDxSQU5HRV9CTEFDS1MpKSAgICAgICAgICAgICAgICAgICAgICAgcHItPmdldF9zY2FsZSA9IGdldF9ibGFja3Nfc2NhbGU4OworICAgICAgICBlbHNlIGlmICggcy0+aXNfMTZiaXQgJiYgKHByLT5tYXNrICYgMTw8UkFOR0VfV0hJVEVTKSkgICAgICAgICAgICAgICAgICAgICAgIHByLT5nZXRfc2NhbGUgPSBnZXRfd2hpdGVzX3NjYWxlMTY7CisgICAgICAgIGVsc2UgaWYgKCBzLT5pc18xNmJpdCAmJiAocHItPm1hc2sgJiAxPDxSQU5HRV9ORVVUUkFMUykpICAgICAgICAgICAgICAgICAgICAgcHItPmdldF9zY2FsZSA9IGdldF9uZXV0cmFsc19zY2FsZTE2OworICAgICAgICBlbHNlIGlmICggcy0+aXNfMTZiaXQgJiYgKHByLT5tYXNrICYgMTw8UkFOR0VfQkxBQ0tTKSkgICAgICAgICAgICAgICAgICAgICAgIHByLT5nZXRfc2NhbGUgPSBnZXRfYmxhY2tzX3NjYWxlMTY7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CiAgICAgfQpAQCAtMjQ0LDEwICsyMzUsMTkgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQogewogICAgIGludCBpLCByZXQ7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKICAgICBTZWxlY3RpdmVDb2xvckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisKKyAgICBzLT5pc18xNmJpdCA9IGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4OworICAgIHMtPnN0ZXAgPSBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MpID4+ICgzICsgcy0+aXNfMTZiaXQpOworCisgICAgcmV0ID0gZmZfZmlsbF9yZ2JhX21hcChzLT5yZ2JhX21hcCwgaW5saW5rLT5mb3JtYXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgLyogSWYgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBub3QgbWV0LCBpdCB3aWxsIGNhdXNlIHRyb3VibGUgd2hpbGUKICAgICAgKiBwYXJzaW5nIHRoZSBQUyBmaWxlICovCkBAIC0yODcsMTA4ICsyODcsMTI3IEBACiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7QVZfUElYX0ZNVF9SR0IzMiwgQVZfUElYX0ZNVF8wUkdCMzIsIEFWX1BJWF9GTVRfTk9ORX07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1JHQjI0LCAgQVZfUElYX0ZNVF9CR1IyNCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0JBLCAgIEFWX1BJWF9GTVRfQkdSQSwKKyAgICAgICAgQVZfUElYX0ZNVF9BUkdCLCAgIEFWX1BJWF9GTVRfQUJHUiwKKyAgICAgICAgQVZfUElYX0ZNVF8wUkdCLCAgIEFWX1BJWF9GTVRfMEJHUiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IwLCAgIEFWX1BJWF9GTVRfQkdSMCwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0I0OCwgIEFWX1BJWF9GTVRfQkdSNDgsCisgICAgICAgIEFWX1BJWF9GTVRfUkdCQTY0LCBBVl9QSVhfRk1UX0JHUkE2NCwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKICAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHNfbGlzdCA9IGZmX21ha2VfZm9ybWF0X2xpc3QocGl4X2ZtdHMpOwogICAgIGlmICghZm10c19saXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmbXRzX2xpc3QpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBjb21wX2FkanVzdChpbnQgYWRqdXN0X3JhbmdlLCBmbG9hdCB2YWx1ZSwgZmxvYXQgYWRqdXN0LCBmbG9hdCBrLCBpbnQgY29ycmVjdGlvbl9tZXRob2QpCitzdGF0aWMgaW5saW5lIGludCBjb21wX2FkanVzdChpbnQgc2NhbGUsIGZsb2F0IHZhbHVlLCBmbG9hdCBhZGp1c3QsIGZsb2F0IGssIGludCBjb3JyZWN0aW9uX21ldGhvZCkKIHsKICAgICBjb25zdCBmbG9hdCBtaW4gPSAtdmFsdWU7CiAgICAgY29uc3QgZmxvYXQgbWF4ID0gMS4gLSB2YWx1ZTsKICAgICBmbG9hdCByZXMgPSAoLTEuIC0gYWRqdXN0KSAqIGsgLSBhZGp1c3Q7CiAgICAgaWYgKGNvcnJlY3Rpb25fbWV0aG9kID09IENPUlJFQ1RJT05fTUVUSE9EX1JFTEFUSVZFKQogICAgICAgICByZXMgKj0gbWF4OwotICAgIHJldHVybiBscmludChhdl9jbGlwZihyZXMsIG1pbiwgbWF4KSAqIGFkanVzdF9yYW5nZSk7CisgICAgcmV0dXJuIGxyaW50KGF2X2NsaXBmKHJlcywgbWluLCBtYXgpICogc2NhbGUpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBzZWxlY3RpdmVfY29sb3IoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIFRocmVhZERhdGEgKnRkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqb2JuciwgaW50IG5iX2pvYnMsIGludCBkaXJlY3QsIGludCBjb3JyZWN0aW9uX21ldGhvZCkKLXsKLSAgICBpbnQgaSwgeCwgeTsKLSAgICBjb25zdCBBVkZyYW1lICppbiA9IHRkLT5pbjsKLSAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OwotICAgIGNvbnN0IFNlbGVjdGl2ZUNvbG9yQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBjb25zdCBpbnQgaGVpZ2h0ID0gaW4tPmhlaWdodDsKLSAgICBjb25zdCBpbnQgd2lkdGggID0gaW4tPndpZHRoOwotICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChoZWlnaHQgKiAgam9ibnIgICApIC8gbmJfam9iczsKLSAgICBjb25zdCBpbnQgc2xpY2VfZW5kICAgPSAoaGVpZ2h0ICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7Ci0gICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbMF07Ci0gICAgY29uc3QgaW50IHNyY19saW5lc2l6ZSA9ICBpbi0+bGluZXNpemVbMF07Ci0gICAgdWludDhfdCAgICAgICAqZHN0ID0gb3V0LT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBkc3RfbGluZXNpemU7Ci0gICAgY29uc3QgdWludDhfdCAqc3JjID0gIGluLT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBzcmNfbGluZXNpemU7Ci0KLSAgICBmb3IgKHkgPSBzbGljZV9zdGFydDsgeSA8IHNsaWNlX2VuZDsgeSsrKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90ICpzcmMzMiA9IChjb25zdCB1aW50MzJfdCAqKXNyYzsKLSAgICAgICAgdWludDMyX3QgICAgICAgKmRzdDMyID0gKHVpbnQzMl90ICopZHN0OwotCi0gICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjb2xvciA9ICpzcmMzMisrOwotICAgICAgICAgICAgY29uc3QgaW50IHIgPSBjb2xvciA+PiAxNiAmIDB4ZmY7Ci0gICAgICAgICAgICBjb25zdCBpbnQgZyA9IGNvbG9yID4+ICA4ICYgMHhmZjsKLSAgICAgICAgICAgIGNvbnN0IGludCBiID0gY29sb3IgICAgICAgJiAweGZmOwotICAgICAgICAgICAgY29uc3QgaW50IG1pbl9jb2xvciA9IEZGTUlOMyhyLCBnLCBiKTsKLSAgICAgICAgICAgIGNvbnN0IGludCBtYXhfY29sb3IgPSBGRk1BWDMociwgZywgYik7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCByYW5nZV9mbGFnID0gKHIgPT0gbWF4X2NvbG9yKSA8PCBSQU5HRV9SRURTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHIgPT0gbWluX2NvbG9yKSA8PCBSQU5HRV9DWUFOUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChnID09IG1heF9jb2xvcikgPDwgUkFOR0VfR1JFRU5TCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGcgPT0gbWluX2NvbG9yKSA8PCBSQU5HRV9NQUdFTlRBUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChiID09IG1heF9jb2xvcikgPDwgUkFOR0VfQkxVRVMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoYiA9PSBtaW5fY29sb3IpIDw8IFJBTkdFX1lFTExPV1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAociA+IDEyOCAmJiBnID4gMTI4ICYmIGIgPiAxMjgpIDw8IFJBTkdFX1dISVRFUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChjb2xvciAmJiAoY29sb3IgJiAweGZmZmZmZikgIT0gMHhmZmZmZmYpIDw8IFJBTkdFX05FVVRSQUxTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKHIgPCAxMjggJiYgZyA8IDEyOCAmJiBiIDwgMTI4KSA8PCBSQU5HRV9CTEFDS1M7Ci0KLSAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJub3JtID0gciAvIDI1NS47Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCBnbm9ybSA9IGcgLyAyNTUuOwotICAgICAgICAgICAgY29uc3QgZmxvYXQgYm5vcm0gPSBiIC8gMjU1LjsKLSAgICAgICAgICAgIGludCBhZGp1c3RfciA9IDAsIGFkanVzdF9nID0gMCwgYWRqdXN0X2IgPSAwOwotCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcHJvY2Vzc19yYW5nZXM7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBwcm9jZXNzX3JhbmdlICpwciA9ICZzLT5wcm9jZXNzX3Jhbmdlc1tpXTsKLQotICAgICAgICAgICAgICAgIGlmIChyYW5nZV9mbGFnICYgcHItPm1hc2spIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGFkanVzdF9yYW5nZSA9IHByLT5nZXRfYWRqdXN0X3JhbmdlKHIsIGcsIGIsIG1pbl9jb2xvciwgbWF4X2NvbG9yKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoYWRqdXN0X3JhbmdlID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKmNteWtfYWRqdXN0ID0gcy0+Y215a19hZGp1c3RbcHItPnJhbmdlX2lkXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGFkal9jID0gY215a19hZGp1c3RbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBhZGpfbSA9IGNteWtfYWRqdXN0WzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYWRqX3kgPSBjbXlrX2FkanVzdFsyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGsgPSBjbXlrX2FkanVzdFszXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0X3IgKz0gY29tcF9hZGp1c3QoYWRqdXN0X3JhbmdlLCBybm9ybSwgYWRqX2MsIGssIGNvcnJlY3Rpb25fbWV0aG9kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdF9nICs9IGNvbXBfYWRqdXN0KGFkanVzdF9yYW5nZSwgZ25vcm0sIGFkal9tLCBrLCBjb3JyZWN0aW9uX21ldGhvZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RfYiArPSBjb21wX2FkanVzdChhZGp1c3RfcmFuZ2UsIGJub3JtLCBhZGpfeSwgaywgY29ycmVjdGlvbl9tZXRob2QpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWRpcmVjdCB8fCBhZGp1c3RfciB8fCBhZGp1c3RfZyB8fCBhZGp1c3RfYikKLSAgICAgICAgICAgICAgICAqZHN0MzIgPSAoY29sb3IgJiAweGZmMDAwMDAwKQotICAgICAgICAgICAgICAgICAgICAgICB8IGF2X2NsaXBfdWludDgociArIGFkanVzdF9yKSA8PCAxNgotICAgICAgICAgICAgICAgICAgICAgICB8IGF2X2NsaXBfdWludDgoZyArIGFkanVzdF9nKSA8PCAgOAotICAgICAgICAgICAgICAgICAgICAgICB8IGF2X2NsaXBfdWludDgoYiArIGFkanVzdF9iKTsKLSAgICAgICAgICAgIGRzdDMyKys7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjICs9IHNyY19saW5lc2l6ZTsKLSAgICAgICAgZHN0ICs9IGRzdF9saW5lc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisjZGVmaW5lIERFQ0xBUkVfU0VMRUNUSVZFX0NPTE9SX0ZVTkMobmJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbmxpbmUgaW50IHNlbGVjdGl2ZV9jb2xvcl8jI25iaXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBUaHJlYWREYXRhICp0ZCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGpvYm5yLCBpbnQgbmJfam9icywgaW50IGRpcmVjdCwgaW50IGNvcnJlY3Rpb25fbWV0aG9kKSAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IEFWRnJhbWUgKmluID0gdGQtPmluOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVZGcmFtZSAqb3V0ID0gdGQtPm91dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBTZWxlY3RpdmVDb2xvckNvbnRleHQgKnMgPSBjdHgtPnByaXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBoZWlnaHQgPSBpbi0+aGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHdpZHRoICA9IGluLT53aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaGVpZ2h0ICogIGpvYm5yICAgKSAvIG5iX2pvYnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBzbGljZV9lbmQgICA9IChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgc3JjX2xpbmVzaXplID0gIGluLT5saW5lc2l6ZVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3Qgcm9mZnNldCA9IHMtPnJnYmFfbWFwW1JdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCBnb2Zmc2V0ID0gcy0+cmdiYV9tYXBbR107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90IGJvZmZzZXQgPSBzLT5yZ2JhX21hcFtCXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QgYW9mZnNldCA9IHMtPnJnYmFfbWFwW0FdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSBzbGljZV9zdGFydDsgeSA8IHNsaWNlX2VuZDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50IyNuYml0cyMjX3QgICAgICAgKmRzdCA9ICggICAgICB1aW50IyNuYml0cyMjX3QgKikob3V0LT5kYXRhWzBdICsgeSAqIGRzdF9saW5lc2l6ZSk7ICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQjI25iaXRzIyNfdCAqc3JjID0gKGNvbnN0IHVpbnQjI25iaXRzIyNfdCAqKSggaW4tPmRhdGFbMF0gKyB5ICogc3JjX2xpbmVzaXplKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGggKiBzLT5zdGVwOyB4ICs9IHMtPnN0ZXApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBpbnQgciA9IHNyY1t4ICsgcm9mZnNldF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGludCBnID0gc3JjW3ggKyBnb2Zmc2V0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgaW50IGIgPSBzcmNbeCArIGJvZmZzZXRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBpbnQgbWluX2NvbG9yID0gRkZNSU4zKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGludCBtYXhfY29sb3IgPSBGRk1BWDMociwgZywgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgaW50IGlzX3doaXRlICAgPSAociA+IDE8PChuYml0cy0xKSAmJiBnID4gMTw8KG5iaXRzLTEpICYmIGIgPiAxPDwobmJpdHMtMSkpOyAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBpbnQgaXNfbmV1dHJhbCA9IChyIHx8IGcgfHwgYikgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAhPSAoMTw8bmJpdHMpLTEgJiYgZyAhPSAoMTw8bmJpdHMpLTEgJiYgYiAhPSAoMTw8bmJpdHMpLTE7ICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgaW50IGlzX2JsYWNrICAgPSAociA8IDE8PChuYml0cy0xKSAmJiBnIDwgMTw8KG5iaXRzLTEpICYmIGIgPCAxPDwobmJpdHMtMSkpOyAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCByYW5nZV9mbGFnID0gKHIgPT0gbWF4X2NvbG9yKSA8PCBSQU5HRV9SRURTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAociA9PSBtaW5fY29sb3IpIDw8IFJBTkdFX0NZQU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChnID09IG1heF9jb2xvcikgPDwgUkFOR0VfR1JFRU5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKGcgPT0gbWluX2NvbG9yKSA8PCBSQU5HRV9NQUdFTlRBUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoYiA9PSBtYXhfY29sb3IpIDw8IFJBTkdFX0JMVUVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChiID09IG1pbl9jb2xvcikgPDwgUkFOR0VfWUVMTE9XUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaXNfd2hpdGUgICAgICAgICA8PCBSQU5HRV9XSElURVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpc19uZXV0cmFsICAgICAgIDw8IFJBTkdFX05FVVRSQUxTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlzX2JsYWNrICAgICAgICAgPDwgUkFOR0VfQkxBQ0tTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHJub3JtID0gciAqICgxLmYgLyAoKDE8PG5iaXRzKS0xKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgZmxvYXQgZ25vcm0gPSBnICogKDEuZiAvICgoMTw8bmJpdHMpLTEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBmbG9hdCBibm9ybSA9IGIgKiAoMS5mIC8gKCgxPDxuYml0cyktMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBhZGp1c3RfciA9IDAsIGFkanVzdF9nID0gMCwgYWRqdXN0X2IgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcHJvY2Vzc19yYW5nZXM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgcHJvY2Vzc19yYW5nZSAqcHIgPSAmcy0+cHJvY2Vzc19yYW5nZXNbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKHJhbmdlX2ZsYWcgJiBwci0+bWFzaykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHNjYWxlID0gcHItPmdldF9zY2FsZShyLCBnLCBiLCBtaW5fY29sb3IsIG1heF9jb2xvcik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmIChzY2FsZSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpjbXlrX2FkanVzdCA9IHMtPmNteWtfYWRqdXN0W3ByLT5yYW5nZV9pZF07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYWRqX2MgPSBjbXlrX2FkanVzdFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBhZGpfbSA9IGNteWtfYWRqdXN0WzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGFkal95ID0gY215a19hZGp1c3RbMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgayA9IGNteWtfYWRqdXN0WzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkanVzdF9yICs9IGNvbXBfYWRqdXN0KHNjYWxlLCBybm9ybSwgYWRqX2MsIGssIGNvcnJlY3Rpb25fbWV0aG9kKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0X2cgKz0gY29tcF9hZGp1c3Qoc2NhbGUsIGdub3JtLCBhZGpfbSwgaywgY29ycmVjdGlvbl9tZXRob2QpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RfYiArPSBjb21wX2FkanVzdChzY2FsZSwgYm5vcm0sIGFkal95LCBrLCBjb3JyZWN0aW9uX21ldGhvZCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCFkaXJlY3QgfHwgYWRqdXN0X3IgfHwgYWRqdXN0X2cgfHwgYWRqdXN0X2IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3ggKyByb2Zmc2V0XSA9IGF2X2NsaXBfdWludCMjbmJpdHMociArIGFkanVzdF9yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbeCArIGdvZmZzZXRdID0gYXZfY2xpcF91aW50IyNuYml0cyhnICsgYWRqdXN0X2cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4ICsgYm9mZnNldF0gPSBhdl9jbGlwX3VpbnQjI25iaXRzKGIgKyBhZGp1c3RfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCFkaXJlY3QgJiYgcy0+c3RlcCA9PSA0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyBhb2Zmc2V0XSA9IHNyY1t4ICsgYW9mZnNldF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLSNkZWZpbmUgREVGX1NFTEVDVElWRV9DT0xPUl9GVU5DKG5hbWUsIGRpcmVjdCwgY29ycmVjdGlvbl9tZXRob2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGludCBzZWxlY3RpdmVfY29sb3JfIyNuYW1lKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gc2VsZWN0aXZlX2NvbG9yKGN0eCwgYXJnLCBqb2JuciwgbmJfam9icywgZGlyZWN0LCBjb3JyZWN0aW9uX21ldGhvZCk7ICAgICAgICAgICAgXAorI2RlZmluZSBERUZfU0VMRUNUSVZFX0NPTE9SX0ZVTkMobmFtZSwgZGlyZWN0LCBjb3JyZWN0aW9uX21ldGhvZCwgbmJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IHNlbGVjdGl2ZV9jb2xvcl8jI25hbWUjI18jI25iaXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzZWxlY3RpdmVfY29sb3JfIyNuYml0cyhjdHgsIGFyZywgam9ibnIsIG5iX2pvYnMsIGRpcmVjdCwgY29ycmVjdGlvbl9tZXRob2QpOyAgICAgICAgICAgICAgICBcCiB9CiAKLURFRl9TRUxFQ1RJVkVfQ09MT1JfRlVOQyhpbmRpcmVjdF9hYnNvbHV0ZSwgMCwgQ09SUkVDVElPTl9NRVRIT0RfQUJTT0xVVEUpCi1ERUZfU0VMRUNUSVZFX0NPTE9SX0ZVTkMoaW5kaXJlY3RfcmVsYXRpdmUsIDAsIENPUlJFQ1RJT05fTUVUSE9EX1JFTEFUSVZFKQotREVGX1NFTEVDVElWRV9DT0xPUl9GVU5DKCAgZGlyZWN0X2Fic29sdXRlLCAxLCBDT1JSRUNUSU9OX01FVEhPRF9BQlNPTFVURSkKLURFRl9TRUxFQ1RJVkVfQ09MT1JfRlVOQyggIGRpcmVjdF9yZWxhdGl2ZSwgMSwgQ09SUkVDVElPTl9NRVRIT0RfUkVMQVRJVkUpCisjZGVmaW5lIERFRl9TRUxFQ1RJVkVfQ09MT1JfRlVOQ1MobmJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFQ0xBUkVfU0VMRUNUSVZFX0NPTE9SX0ZVTkMobmJpdHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVGX1NFTEVDVElWRV9DT0xPUl9GVU5DKGluZGlyZWN0X2Fic29sdXRlLCAwLCBDT1JSRUNUSU9OX01FVEhPRF9BQlNPTFVURSwgbmJpdHMpICAgICAgICAgICAgICAgICAgICAgICBcCitERUZfU0VMRUNUSVZFX0NPTE9SX0ZVTkMoaW5kaXJlY3RfcmVsYXRpdmUsIDAsIENPUlJFQ1RJT05fTUVUSE9EX1JFTEFUSVZFLCBuYml0cykgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFRl9TRUxFQ1RJVkVfQ09MT1JfRlVOQyggIGRpcmVjdF9hYnNvbHV0ZSwgMSwgQ09SUkVDVElPTl9NRVRIT0RfQUJTT0xVVEUsIG5iaXRzKSAgICAgICAgICAgICAgICAgICAgICAgXAorREVGX1NFTEVDVElWRV9DT0xPUl9GVU5DKCAgZGlyZWN0X3JlbGF0aXZlLCAxLCBDT1JSRUNUSU9OX01FVEhPRF9SRUxBVElWRSwgbmJpdHMpCisKK0RFRl9TRUxFQ1RJVkVfQ09MT1JfRlVOQ1MoOCkKK0RFRl9TRUxFQ1RJVkVfQ09MT1JfRlVOQ1MoMTYpCiAKIHR5cGVkZWYgaW50ICgqc2VsZWN0aXZlX2NvbG9yX2Z1bmNfdHlwZSkoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKnRkLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKTsKIApAQCAtNDAwLDkgKzQxOSwxNCBAQAogICAgIEFWRnJhbWUgKm91dDsKICAgICBUaHJlYWREYXRhIHRkOwogICAgIGNvbnN0IFNlbGVjdGl2ZUNvbG9yQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBzdGF0aWMgY29uc3Qgc2VsZWN0aXZlX2NvbG9yX2Z1bmNfdHlwZSBmdW5jc1syXVsyXSA9IHsKLSAgICAgICAge3NlbGVjdGl2ZV9jb2xvcl9pbmRpcmVjdF9hYnNvbHV0ZSwgc2VsZWN0aXZlX2NvbG9yX2luZGlyZWN0X3JlbGF0aXZlfSwKLSAgICAgICAge3NlbGVjdGl2ZV9jb2xvcl9kaXJlY3RfYWJzb2x1dGUsICAgc2VsZWN0aXZlX2NvbG9yX2RpcmVjdF9yZWxhdGl2ZX0sCisgICAgc3RhdGljIGNvbnN0IHNlbGVjdGl2ZV9jb2xvcl9mdW5jX3R5cGUgZnVuY3NbMl1bMl1bMl0gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHtzZWxlY3RpdmVfY29sb3JfaW5kaXJlY3RfYWJzb2x1dGVfOCwgc2VsZWN0aXZlX2NvbG9yX2luZGlyZWN0X3JlbGF0aXZlXzh9LAorICAgICAgICAgICAge3NlbGVjdGl2ZV9jb2xvcl9kaXJlY3RfYWJzb2x1dGVfOCwgICBzZWxlY3RpdmVfY29sb3JfZGlyZWN0X3JlbGF0aXZlXzh9LAorICAgICAgICB9LHsKKyAgICAgICAgICAgIHtzZWxlY3RpdmVfY29sb3JfaW5kaXJlY3RfYWJzb2x1dGVfMTYsIHNlbGVjdGl2ZV9jb2xvcl9pbmRpcmVjdF9yZWxhdGl2ZV8xNn0sCisgICAgICAgICAgICB7c2VsZWN0aXZlX2NvbG9yX2RpcmVjdF9hYnNvbHV0ZV8xNiwgICBzZWxlY3RpdmVfY29sb3JfZGlyZWN0X3JlbGF0aXZlXzE2fSwKKyAgICAgICAgfQogICAgIH07CiAKICAgICBpZiAoYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pKSB7CkBAIC00MjAsOCArNDQ0LDggQEAKIAogICAgIHRkLmluID0gaW47CiAgICAgdGQub3V0ID0gb3V0OwotICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmdW5jc1tkaXJlY3RdW3MtPmNvcnJlY3Rpb25fbWV0aG9kXSwgJnRkLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4oaW5saW5rLT5oLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZ1bmNzW3MtPmlzXzE2Yml0XVtkaXJlY3RdW3MtPmNvcnJlY3Rpb25fbWV0aG9kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZCwgTlVMTCwgRkZNSU4oaW5saW5rLT5oLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOwogCiAgICAgaWYgKCFkaXJlY3QpCiAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKQEAgLTQzMyw2ICs0NTcsNyBAQAogICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC00NDksNyArNDc0LDYgQEAKICAgICAubmFtZSAgICAgICAgICA9ICJzZWxlY3RpdmVjb2xvciIsCiAgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQXBwbHkgQ01ZSyBhZGp1c3RtZW50cyB0byBzcGVjaWZpYyBjb2xvciByYW5nZXMuIiksCiAgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoU2VsZWN0aXZlQ29sb3JDb250ZXh0KSwKLSAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCiAgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAogICAgIC5pbnB1dHMgICAgICAgID0gc2VsZWN0aXZlY29sb3JfaW5wdXRzLAogICAgIC5vdXRwdXRzICAgICAgID0gc2VsZWN0aXZlY29sb3Jfb3V0cHV0cywKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NlcGFyYXRlZmllbGRzLmMgYi9saWJhdmZpbHRlci92Zl9zZXBhcmF0ZWZpZWxkcy5jCmluZGV4IDNlYTVlYjYuLjNlZDIyMmYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3NlcGFyYXRlZmllbGRzLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2VwYXJhdGVmaWVsZHMuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgU2VwYXJhdGVGaWVsZHNDb250ZXh0IHsKICAgICBpbnQgbmJfcGxhbmVzOwogICAgIEFWRnJhbWUgKnNlY29uZDsKIH0gU2VwYXJhdGVGaWVsZHNDb250ZXh0OwpAQCAtMTE4LDYgKzExOCwxMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFNlcGFyYXRlRmllbGRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPnNlY29uZCk7Cit9CisKIHN0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBzZXBhcmF0ZWZpZWxkc19pbnB1dHNbXSA9IHsKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCkBAIC0xNDEsNiArMTQ4LDcgQEAKICAgICAubmFtZSAgICAgICAgPSAic2VwYXJhdGVmaWVsZHMiLAogICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTcGxpdCBpbnB1dCB2aWRlbyBmcmFtZXMgaW50byBmaWVsZHMuIiksCiAgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFNlcGFyYXRlRmllbGRzQ29udGV4dCksCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAogICAgIC5pbnB1dHMgICAgICA9IHNlcGFyYXRlZmllbGRzX2lucHV0cywKICAgICAub3V0cHV0cyAgICAgPSBzZXBhcmF0ZWZpZWxkc19vdXRwdXRzLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NldGZpZWxkLmMgYi9saWJhdmZpbHRlci92Zl9zZXRmaWVsZC5jCmluZGV4IDk2ZTlkMTguLmY0ZGMzM2QgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3NldGZpZWxkLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2V0ZmllbGQuYwpAQCAtMzUsNyArMzUsNyBAQAogICAgIE1PREVfUFJPRywKIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFNldEZpZWxkQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IG1vZGU7ICAgICAgICAgICAgICAgICAgIC8vLzwgU2V0RmllbGRNb2RlCiB9IFNldEZpZWxkQ29udGV4dDsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NldHBhcmFtcy5jIGIvbGliYXZmaWx0ZXIvdmZfc2V0cGFyYW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQyN2Y5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3NldHBhcmFtcy5jCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisKK3R5cGVkZWYgc3RydWN0IFNldFBhcmFtc0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBjb2xvcl9yYW5nZTsKK30gU2V0UGFyYW1zQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2V0UGFyYW1zQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzZXRyYW5nZV9vcHRpb25zW10gPSB7CisgICAgeyJyYW5nZSIsICJzZWxlY3QgY29sb3IgcmFuZ2UiLCBPRkZTRVQoY29sb3JfcmFuZ2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PS0xfSwtMSwgQVZDT0xfUkFOR0VfTkItMSwgRkxBR1MsICJyYW5nZSJ9LAorICAgIHsiYXV0byIsICAia2VlcCB0aGUgc2FtZSBjb2xvciByYW5nZSIsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PS0xfSwgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEZMQUdTLCAicmFuZ2UifSwKKyAgICB7InVuc3BlY2lmaWVkIiwgICAgICAgICAgICAgICAgICBOVUxMLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BVkNPTF9SQU5HRV9VTlNQRUNJRklFRH0sICAwLCAwLCBGTEFHUywgInJhbmdlIn0sCisgICAgeyJ1bmtub3duIiwgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QVZDT0xfUkFOR0VfVU5TUEVDSUZJRUR9LCAgMCwgMCwgRkxBR1MsICJyYW5nZSJ9LAorICAgIHsibGltaXRlZCIsICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUFWQ09MX1JBTkdFX01QRUd9LCAgICAgICAgIDAsIDAsIEZMQUdTLCAicmFuZ2UifSwKKyAgICB7InR2IiwgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BVkNPTF9SQU5HRV9NUEVHfSwgICAgICAgICAwLCAwLCBGTEFHUywgInJhbmdlIn0sCisgICAgeyJtcGVnIiwgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QVZDT0xfUkFOR0VfTVBFR30sICAgICAgICAgMCwgMCwgRkxBR1MsICJyYW5nZSJ9LAorICAgIHsiZnVsbCIsICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUFWQ09MX1JBTkdFX0pQRUd9LCAgICAgICAgIDAsIDAsIEZMQUdTLCAicmFuZ2UifSwKKyAgICB7InBjIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BVkNPTF9SQU5HRV9KUEVHfSwgICAgICAgICAwLCAwLCBGTEFHUywgInJhbmdlIn0sCisgICAgeyJqcGVnIiwgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QVZDT0xfUkFOR0VfSlBFR30sICAgICAgICAgMCwgMCwgRkxBR1MsICJyYW5nZSJ9LAorICAgIHtOVUxMfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHNldHJhbmdlKTsKKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKmZyYW1lKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgU2V0UGFyYW1zQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmIChzLT5jb2xvcl9yYW5nZSA+PSAwKQorICAgICAgICBmcmFtZS0+Y29sb3JfcmFuZ2UgPSBzLT5jb2xvcl9yYW5nZTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKGN0eC0+b3V0cHV0c1swXSwgZnJhbWUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBvdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfc2V0cmFuZ2UgPSB7CisgICAgLm5hbWUgICAgICAgID0gInNldHJhbmdlIiwKKyAgICAuZGVzY3JpcHRpb24gPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRm9yY2UgY29sb3IgcmFuZ2UgZm9yIHRoZSBvdXRwdXQgdmlkZW8gZnJhbWUuIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFNldFBhcmFtc0NvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICA9ICZzZXRyYW5nZV9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgPSBpbnB1dHMsCisgICAgLm91dHB1dHMgICAgID0gb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9zaG93aW5mby5jIGIvbGliYXZmaWx0ZXIvdmZfc2hvd2luZm8uYwppbmRleCA1MTQ2OTk1Li5kMWQxNDE1IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9zaG93aW5mby5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3Nob3dpbmZvLmMKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zcGhlcmljYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvc3RlcmVvM2QuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCiAKQEAgLTM2LDYgKzM3LDQ1IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCitzdGF0aWMgdm9pZCBkdW1wX3NwaGVyaWNhbChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUsIEFWRnJhbWVTaWRlRGF0YSAqc2QpCit7CisgICAgQVZTcGhlcmljYWxNYXBwaW5nICpzcGhlcmljYWwgPSAoQVZTcGhlcmljYWxNYXBwaW5nICopc2QtPmRhdGE7CisgICAgZG91YmxlIHlhdywgcGl0Y2gsIHJvbGw7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInNwaGVyaWNhbCBpbmZvcm1hdGlvbjogIik7CisgICAgaWYgKHNkLT5zaXplIDwgc2l6ZW9mKCpzcGhlcmljYWwpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaW52YWxpZCBkYXRhIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoc3BoZXJpY2FsLT5wcm9qZWN0aW9uID09IEFWX1NQSEVSSUNBTF9FUVVJUkVDVEFOR1VMQVIpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiZXF1aXJlY3Rhbmd1bGFyICIpOworICAgIGVsc2UgaWYgKHNwaGVyaWNhbC0+cHJvamVjdGlvbiA9PSBBVl9TUEhFUklDQUxfQ1VCRU1BUCkKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJjdWJlbWFwICIpOworICAgIGVsc2UgaWYgKHNwaGVyaWNhbC0+cHJvamVjdGlvbiA9PSBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSX1RJTEUpCisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAidGlsZWQgZXF1aXJlY3Rhbmd1bGFyICIpOworICAgIGVsc2UgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgInVua25vd24iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHlhdyA9ICgoZG91YmxlKXNwaGVyaWNhbC0+eWF3KSAvICgxIDw8IDE2KTsKKyAgICBwaXRjaCA9ICgoZG91YmxlKXNwaGVyaWNhbC0+cGl0Y2gpIC8gKDEgPDwgMTYpOworICAgIHJvbGwgPSAoKGRvdWJsZSlzcGhlcmljYWwtPnJvbGwpIC8gKDEgPDwgMTYpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiKCVmLyVmLyVmKSAiLCB5YXcsIHBpdGNoLCByb2xsKTsKKworICAgIGlmIChzcGhlcmljYWwtPnByb2plY3Rpb24gPT0gQVZfU1BIRVJJQ0FMX0VRVUlSRUNUQU5HVUxBUl9USUxFKSB7CisgICAgICAgIHNpemVfdCBsLCB0LCByLCBiOworICAgICAgICBhdl9zcGhlcmljYWxfdGlsZV9ib3VuZHMoc3BoZXJpY2FsLCBmcmFtZS0+d2lkdGgsIGZyYW1lLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbCwgJnQsICZyLCAmYik7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgIlslIlNJWkVfU1BFQ0lGSUVSIiwgJSJTSVpFX1NQRUNJRklFUiIsICUiU0laRV9TUEVDSUZJRVIiLCAlIlNJWkVfU1BFQ0lGSUVSIl0gIiwKKyAgICAgICAgICAgICAgIGwsIHQsIHIsIGIpOworICAgIH0gZWxzZSBpZiAoc3BoZXJpY2FsLT5wcm9qZWN0aW9uID09IEFWX1NQSEVSSUNBTF9DVUJFTUFQKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiW3BhZCAlIlBSSXUzMiJdICIsIHNwaGVyaWNhbC0+cGFkZGluZyk7CisgICAgfQorfQorCiBzdGF0aWMgdm9pZCBkdW1wX3N0ZXJlbzNkKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lU2lkZURhdGEgKnNkKQogewogICAgIEFWU3RlcmVvM0QgKnN0ZXJlbzsKQEAgLTQ4LDE5ICs4OCw3IEBACiAKICAgICBzdGVyZW8gPSAoQVZTdGVyZW8zRCAqKXNkLT5kYXRhOwogCi0gICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJ0eXBlIC0gIik7Ci0gICAgc3dpdGNoIChzdGVyZW8tPnR5cGUpIHsKLSAgICBjYXNlIEFWX1NURVJFTzNEXzJEOiAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiMkQiKTsgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1NURVJFTzNEX1NJREVCWVNJREU6ICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAic2lkZSBieSBzaWRlIik7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1NURVJFTzNEX1RPUEJPVFRPTTogICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAidG9wIGFuZCBib3R0b20iKTsgICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1NURVJFTzNEX0ZSQU1FU0VRVUVOQ0U6ICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiZnJhbWUgYWx0ZXJuYXRlIik7ICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1NURVJFTzNEX0NIRUNLRVJCT0FSRDogICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiY2hlY2tlcmJvYXJkIik7ICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1NURVJFTzNEX0xJTkVTOiAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaW50ZXJsZWF2ZWQgbGluZXMiKTsgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1NURVJFTzNEX0NPTFVNTlM6ICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaW50ZXJsZWF2ZWQgY29sdW1ucyIpOyAgICBicmVhazsKLSAgICBjYXNlIEFWX1NURVJFTzNEX1NJREVCWVNJREVfUVVJTkNVTlg6IGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAic2lkZSBieSBzaWRlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHF1aW5jdW54IHN1YnNhbXBsaW5nKSIpOyBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAidW5rbm93biIpOyAgICAgICAgICAgICBicmVhazsKLSAgICB9CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJ0eXBlIC0gJXMiLCBhdl9zdGVyZW8zZF90eXBlX25hbWUoc3RlcmVvLT50eXBlKSk7CiAKICAgICBpZiAoc3RlcmVvLT5mbGFncyAmIEFWX1NURVJFTzNEX0ZMQUdfSU5WRVJUKQogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIiAoaW52ZXJ0ZWQpIik7CkBAIC0xMDcsOCArMTM1LDggQEAKICAgICAgICAgICAgIm46JTQiUFJJZDY0IiBwdHM6JTdzIHB0c190aW1lOiUtN3MgcG9zOiU5IlBSSWQ2NCIgIgogICAgICAgICAgICAiZm10OiVzIHNhcjolZC8lZCBzOiVkeCVkIGk6JWMgaXNrZXk6JWQgdHlwZTolYyAiCiAgICAgICAgICAgICJjaGVja3N1bTolMDgiUFJJWDMyIiBwbGFuZV9jaGVja3N1bTpbJTA4IlBSSVgzMiwKLSAgICAgICAgICAgaW5saW5rLT5mcmFtZV9jb3VudCwKLSAgICAgICAgICAgYXZfdHMyc3RyKGZyYW1lLT5wdHMpLCBhdl90czJ0aW1lc3RyKGZyYW1lLT5wdHMsICZpbmxpbmstPnRpbWVfYmFzZSksIGF2X2ZyYW1lX2dldF9wa3RfcG9zKGZyYW1lKSwKKyAgICAgICAgICAgaW5saW5rLT5mcmFtZV9jb3VudF9vdXQsCisgICAgICAgICAgIGF2X3RzMnN0cihmcmFtZS0+cHRzKSwgYXZfdHMydGltZXN0cihmcmFtZS0+cHRzLCAmaW5saW5rLT50aW1lX2Jhc2UpLCBmcmFtZS0+cGt0X3BvcywKICAgICAgICAgICAgZGVzYy0+bmFtZSwKICAgICAgICAgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCiAgICAgICAgICAgIGZyYW1lLT53aWR0aCwgZnJhbWUtPmhlaWdodCwKQEAgLTE0MCw2ICsxNjgsOSBAQAogICAgICAgICBjYXNlIEFWX0ZSQU1FX0RBVEFfQTUzX0NDOgogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJBLzUzIGNsb3NlZCBjYXB0aW9ucyAoJWQgYnl0ZXMpIiwgc2QtPnNpemUpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfRlJBTUVfREFUQV9TUEhFUklDQUw6CisgICAgICAgICAgICBkdW1wX3NwaGVyaWNhbChjdHgsIGZyYW1lLCBzZCk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9GUkFNRV9EQVRBX1NURVJFTzNEOgogICAgICAgICAgICAgZHVtcF9zdGVyZW8zZChjdHgsIHNkKTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfc2hvd3BhbGV0dGUuYyBiL2xpYmF2ZmlsdGVyL3ZmX3Nob3dwYWxldHRlLmMKaW5kZXggZjE2MjdiYS4uZDg4NmFiOCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfc2hvd3BhbGV0dGUuYworKysgYi9saWJhdmZpbHRlci92Zl9zaG93cGFsZXR0ZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBTaG93UGFsZXR0ZUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCBzaXplOwogfSBTaG93UGFsZXR0ZUNvbnRleHQ7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9zaHVmZmxlZnJhbWVzLmMgYi9saWJhdmZpbHRlci92Zl9zaHVmZmxlZnJhbWVzLmMKaW5kZXggZjQ5YzljNi4uOGU1OTUxMSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfc2h1ZmZsZWZyYW1lcy5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3NodWZmbGVmcmFtZXMuYwpAQCAtNjgsNyArNjgsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzLT5tYXBbbl0gPCAwIHx8IHMtPm1hcFtuXSA+PSBuYl9pdGVtcykgeworICAgICAgICBpZiAocy0+bWFwW25dIDwgLTEgfHwgcy0+bWFwW25dID49IG5iX2l0ZW1zKSB7CiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbmRleCBvdXQgb2YgcmFuZ2UuXG4iKTsKICAgICAgICAgICAgIGF2X2ZyZWUobWFwcGluZyk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwpAQCAtODQsMzIgKzg0LDM0IEBACiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICAgICpjdHggPSBpbmxpbmstPmRzdDsKICAgICBTaHVmZmxlRnJhbWVzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBpbnQgcmV0OworICAgIGludCByZXQgPSAwOwogCiAgICAgaWYgKHMtPmluX2ZyYW1lcyA8IHMtPm5iX2ZyYW1lcykgewogICAgICAgICBzLT5mcmFtZXNbcy0+aW5fZnJhbWVzXSA9IGZyYW1lOwogICAgICAgICBzLT5wdHNbcy0+aW5fZnJhbWVzXSA9IGZyYW1lLT5wdHM7CiAgICAgICAgIHMtPmluX2ZyYW1lcysrOwotICAgICAgICByZXQgPSAwOwotICAgIH0gZWxzZSBpZiAocy0+aW5fZnJhbWVzID09IHMtPm5iX2ZyYW1lcykgeworICAgIH0KKworICAgIGlmIChzLT5pbl9mcmFtZXMgPT0gcy0+bmJfZnJhbWVzKSB7CiAgICAgICAgIGludCBuLCB4OwogCiAgICAgICAgIGZvciAobiA9IDA7IG4gPCBzLT5uYl9mcmFtZXM7IG4rKykgewogICAgICAgICAgICAgQVZGcmFtZSAqb3V0OwogCiAgICAgICAgICAgICB4ID0gcy0+bWFwW25dOwotICAgICAgICAgICAgb3V0ID0gYXZfZnJhbWVfY2xvbmUocy0+ZnJhbWVzW3hdKTsKLSAgICAgICAgICAgIGlmICghb3V0KQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBvdXQtPnB0cyA9IHMtPnB0c1tuXTsKLSAgICAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG91dCk7CisgICAgICAgICAgICBpZiAoeCA+PSAwKSB7CisgICAgICAgICAgICAgICAgb3V0ID0gYXZfZnJhbWVfY2xvbmUocy0+ZnJhbWVzW3hdKTsKKyAgICAgICAgICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBvdXQtPnB0cyA9IHMtPnB0c1tuXTsKKyAgICAgICAgICAgICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBvdXQpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcy0+aW5fZnJhbWVzLS07CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bmJfZnJhbWVzOyBuKyspCiAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5mcmFtZXNbbl0pOwotICAgIH0gZWxzZQotICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KIAogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xMTgsNiArMTIwLDExIEBACiB7CiAgICAgU2h1ZmZsZUZyYW1lc0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAKKyAgICB3aGlsZSAocy0+aW5fZnJhbWVzID4gMCkgeworICAgICAgICBzLT5pbl9mcmFtZXMtLTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVzW3MtPmluX2ZyYW1lc10pOworICAgIH0KKwogICAgIGF2X2ZyZWVwKCZzLT5mcmFtZXMpOwogICAgIGF2X2ZyZWVwKCZzLT5tYXApOwogICAgIGF2X2ZyZWVwKCZzLT5wdHMpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfc2h1ZmZsZXBsYW5lcy5jIGIvbGliYXZmaWx0ZXIvdmZfc2h1ZmZsZXBsYW5lcy5jCmluZGV4IDRiYzdiNzkuLjMyZDJkNTggMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3NodWZmbGVwbGFuZXMuYworKysgYi9saWJhdmZpbHRlci92Zl9zaHVmZmxlcGxhbmVzLmMKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8Ci0gICAgICAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSAmJgorICAgICAgICAgICAgIGRlc2MtPmZsYWdzICYgRkZfUFNFVURPUEFMKSAmJgogICAgICAgICAgICAgKGkgPT0gMSkgIT0gKHMtPm1hcFtpXSA9PSAxKSkgewogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJDYW5ub3QgbWFwIGJldHdlZW4gYSBwYWxldHRlIHBsYW5lIGFuZCBhIGRhdGEgcGxhbmUuXG4iKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NpZ25hbHN0YXRzLmMgYi9saWJhdmZpbHRlci92Zl9zaWduYWxzdGF0cy5jCmluZGV4IGMzNDBkNmIuLjI5ODg4MWIgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3NpZ25hbHN0YXRzLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2lnbmFsc3RhdHMuYwpAQCAtMjAsNiArMjAsNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTMyLDEyICszMywxMyBAQAogICAgIEZJTFRfTlVNQgogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgU2lnbmFsc3RhdHNDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgY2hyb21haDsgICAgLy8gaGVpZ2h0IG9mIGNocm9tYSBwbGFuZQogICAgIGludCBjaHJvbWF3OyAgICAvLyB3aWR0aCBvZiBjaHJvbWEgcGxhbmUKICAgICBpbnQgaHN1YjsgICAgICAgLy8gaG9yaXpvbnRhbCBzdWJzYW1wbGluZwogICAgIGludCB2c3ViOyAgICAgICAvLyB2ZXJ0aWNhbCBzdWJzYW1wbGluZworICAgIGludCBkZXB0aDsgICAgICAvLyBwaXhlbCBkZXB0aAogICAgIGludCBmczsgICAgICAgICAvLyBwaXhlbCBjb3VudCBwZXIgZnJhbWUKICAgICBpbnQgY2ZzOyAgICAgICAgLy8gcGl4ZWwgY291bnQgcGVyIGZyYW1lIG9mIGNocm9tYSBwbGFuZXMKICAgICBpbnQgb3V0ZmlsdGVyOyAgLy8gRmlsdGVyTW9kZQpAQCAtNDgsNiArNTAsOCBAQAogICAgIGludCBuYl9qb2JzOwogICAgIGludCAqam9ic19yZXRzOwogCisgICAgaW50ICpoaXN0eSwgKmhpc3R1LCAqaGlzdHYsICpoaXN0c2F0OworCiAgICAgQVZGcmFtZSAqZnJhbWVfc2F0OwogICAgIEFWRnJhbWUgKmZyYW1lX2h1ZTsKIH0gU2lnbmFsc3RhdHNDb250ZXh0OwpAQCAtMTA1LDYgKzEwOSwxMCBAQAogICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lX3NhdCk7CiAgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVfaHVlKTsKICAgICBhdl9mcmVlcCgmcy0+am9ic19yZXRzKTsKKyAgICBhdl9mcmVlcCgmcy0+aGlzdHkpOworICAgIGF2X2ZyZWVwKCZzLT5oaXN0dSk7CisgICAgYXZfZnJlZXAoJnMtPmhpc3R2KTsKKyAgICBhdl9mcmVlcCgmcy0+aGlzdHNhdCk7CiB9CiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKQEAgLTExNSw2ICsxMjMsMTMgQEAKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX1lVVko0MjBQLCBBVl9QSVhfRk1UX1lVVko0MTFQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQyMFA5LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQyMFAxMiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNCwgQVZfUElYX0ZNVF9ZVVY0MjBQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LCBBVl9QSVhfRk1UX1lVVjQyMlAxNiwgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsCiAgICAgICAgIEFWX1BJWF9GTVRfTk9ORQogICAgIH07CiAKQEAgLTE1MCw2ICsxNjUsMTYgQEAKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CiAgICAgcy0+aHN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX3c7CiAgICAgcy0+dnN1YiA9IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgcy0+ZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOworICAgIGlmIChzLT5kZXB0aCA+IDgpIHsKKyAgICAgICAgcy0+aGlzdHkgPSBhdl9tYWxsb2NfYXJyYXkoMSA8PCBzLT5kZXB0aCwgc2l6ZW9mKCpzLT5oaXN0eSkpOworICAgICAgICBzLT5oaXN0dSA9IGF2X21hbGxvY19hcnJheSgxIDw8IHMtPmRlcHRoLCBzaXplb2YoKnMtPmhpc3R1KSk7CisgICAgICAgIHMtPmhpc3R2ID0gYXZfbWFsbG9jX2FycmF5KDEgPDwgcy0+ZGVwdGgsIHNpemVvZigqcy0+aGlzdHYpKTsKKyAgICAgICAgcy0+aGlzdHNhdCA9IGF2X21hbGxvY19hcnJheSgxIDw8IHMtPmRlcHRoLCBzaXplb2YoKnMtPmhpc3RzYXQpKTsKKworICAgICAgICBpZiAoIXMtPmhpc3R5IHx8ICFzLT5oaXN0dSB8fCAhcy0+aGlzdHYgfHwgIXMtPmhpc3RzYXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KIAogICAgIG91dGxpbmstPncgPSBpbmxpbmstPnc7CiAgICAgb3V0bGluay0+aCA9IGlubGluay0+aDsKQEAgLTE2MCwxMiArMTg1LDEyIEBACiAgICAgcy0+ZnMgPSBpbmxpbmstPncgKiBpbmxpbmstPmg7CiAgICAgcy0+Y2ZzID0gcy0+Y2hyb21hdyAqIHMtPmNocm9tYWg7CiAKLSAgICBzLT5uYl9qb2JzICAgPSBGRk1BWCgxLCBGRk1JTihpbmxpbmstPmgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICBzLT5uYl9qb2JzICAgPSBGRk1BWCgxLCBGRk1JTihpbmxpbmstPmgsIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAgICAgcy0+am9ic19yZXRzID0gYXZfbWFsbG9jX2FycmF5KHMtPm5iX2pvYnMsIHNpemVvZigqcy0+am9ic19yZXRzKSk7CiAgICAgaWYgKCFzLT5qb2JzX3JldHMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzLT5mcmFtZV9zYXQgPSBhbGxvY19mcmFtZShBVl9QSVhfRk1UX0dSQVk4LCAgaW5saW5rLT53LCBpbmxpbmstPmgpOworICAgIHMtPmZyYW1lX3NhdCA9IGFsbG9jX2ZyYW1lKHMtPmRlcHRoID4gOCA/IEFWX1BJWF9GTVRfR1JBWTE2IDogQVZfUElYX0ZNVF9HUkFZOCwgIGlubGluay0+dywgaW5saW5rLT5oKTsKICAgICBzLT5mcmFtZV9odWUgPSBhbGxvY19mcmFtZShBVl9QSVhfRk1UX0dSQVkxNiwgaW5saW5rLT53LCBpbmxpbmstPmgpOwogICAgIGlmICghcy0+ZnJhbWVfc2F0IHx8ICFzLT5mcmFtZV9odWUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0xNzMsNyArMTk4LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYnVybl9mcmFtZShjb25zdCBTaWduYWxzdGF0c0NvbnRleHQgKnMsIEFWRnJhbWUgKmYsIGludCB4LCBpbnQgeSkKK3N0YXRpYyB2b2lkIGJ1cm5fZnJhbWU4KGNvbnN0IFNpZ25hbHN0YXRzQ29udGV4dCAqcywgQVZGcmFtZSAqZiwgaW50IHgsIGludCB5KQogewogICAgIGNvbnN0IGludCBjaHJvbWF4ID0geCA+PiBzLT5oc3ViOwogICAgIGNvbnN0IGludCBjaHJvbWF5ID0geSA+PiBzLT52c3ViOwpAQCAtMTgyLDcgKzIwNywxNyBAQAogICAgIGYtPmRhdGFbMl1bY2hyb21heSAqIGYtPmxpbmVzaXplWzJdICsgY2hyb21heF0gPSBzLT55dXZfY29sb3JbMl07CiB9CiAKLXN0YXRpYyBpbnQgZmlsdGVyX2JybmcoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3N0YXRpYyB2b2lkIGJ1cm5fZnJhbWUxNihjb25zdCBTaWduYWxzdGF0c0NvbnRleHQgKnMsIEFWRnJhbWUgKmYsIGludCB4LCBpbnQgeSkKK3sKKyAgICBjb25zdCBpbnQgY2hyb21heCA9IHggPj4gcy0+aHN1YjsKKyAgICBjb25zdCBpbnQgY2hyb21heSA9IHkgPj4gcy0+dnN1YjsKKyAgICBjb25zdCBpbnQgbXVsdCA9IDEgPDwgKHMtPmRlcHRoIC0gOCk7CisgICAgQVZfV04xNihmLT5kYXRhWzBdICsgeSAgICAgICAqIGYtPmxpbmVzaXplWzBdICsgICAgICAgeCAqIDIsIHMtPnl1dl9jb2xvclswXSAqIG11bHQpOworICAgIEFWX1dOMTYoZi0+ZGF0YVsxXSArIGNocm9tYXkgKiBmLT5saW5lc2l6ZVsxXSArIGNocm9tYXggKiAyLCBzLT55dXZfY29sb3JbMV0gKiBtdWx0KTsKKyAgICBBVl9XTjE2KGYtPmRhdGFbMl0gKyBjaHJvbWF5ICogZi0+bGluZXNpemVbMl0gKyBjaHJvbWF4ICogMiwgcy0+eXV2X2NvbG9yWzJdICogbXVsdCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyOF9icm5nKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCiB7CiAgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CiAgICAgY29uc3QgU2lnbmFsc3RhdHNDb250ZXh0ICpzID0gY3R4LT5wcml2OwpAQCAtMjEwLDcgKzI0NSw0MiBAQAogICAgICAgICAgICAgICAgIGNocm9tYXYgPCAxNiB8fCBjaHJvbWF2ID4gMjQwOwogICAgICAgICAgICAgc2NvcmUgKz0gZmlsdDsKICAgICAgICAgICAgIGlmIChvdXQgJiYgZmlsdCkKLSAgICAgICAgICAgICAgICBidXJuX2ZyYW1lKHMsIG91dCwgeCwgeSk7CisgICAgICAgICAgICAgICAgYnVybl9mcmFtZTgocywgb3V0LCB4LCB5KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyMTZfYnJuZyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIGNvbnN0IFNpZ25hbHN0YXRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCBtdWx0ID0gMSA8PCAocy0+ZGVwdGggLSA4KTsKKyAgICBjb25zdCBpbnQgdyA9IGluLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaCA9IGluLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKGggKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kICAgPSAoaCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworICAgIGludCB4LCB5LCBzY29yZSA9IDA7CisKKyAgICBmb3IgKHkgPSBzbGljZV9zdGFydDsgeSA8IHNsaWNlX2VuZDsgeSsrKSB7CisgICAgICAgIGNvbnN0IGludCB5YyA9IHkgPj4gcy0+dnN1YjsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnBsdW1hICAgID0gKHVpbnQxNl90ICopJmluLT5kYXRhWzBdW3kgICogaW4tPmxpbmVzaXplWzBdXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnBjaHJvbWF1ID0gKHVpbnQxNl90ICopJmluLT5kYXRhWzFdW3ljICogaW4tPmxpbmVzaXplWzFdXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnBjaHJvbWF2ID0gKHVpbnQxNl90ICopJmluLT5kYXRhWzJdW3ljICogaW4tPmxpbmVzaXplWzJdXTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgeGMgPSB4ID4+IHMtPmhzdWI7CisgICAgICAgICAgICBjb25zdCBpbnQgbHVtYSAgICA9IHBsdW1hW3hdOworICAgICAgICAgICAgY29uc3QgaW50IGNocm9tYXUgPSBwY2hyb21hdVt4Y107CisgICAgICAgICAgICBjb25zdCBpbnQgY2hyb21hdiA9IHBjaHJvbWF2W3hjXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBmaWx0ID0gbHVtYSAgICA8IDE2ICogbXVsdCB8fCBsdW1hICAgID4gMjM1ICogbXVsdCB8fAorICAgICAgICAgICAgICAgIGNocm9tYXUgPCAxNiAqIG11bHQgfHwgY2hyb21hdSA+IDI0MCAqIG11bHQgfHwKKyAgICAgICAgICAgICAgICBjaHJvbWF2IDwgMTYgKiBtdWx0IHx8IGNocm9tYXYgPiAyNDAgKiBtdWx0OworICAgICAgICAgICAgc2NvcmUgKz0gZmlsdDsKKyAgICAgICAgICAgIGlmIChvdXQgJiYgZmlsdCkKKyAgICAgICAgICAgICAgICBidXJuX2ZyYW1lMTYocywgb3V0LCB4LCB5KTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc2NvcmU7CkBAIC0yMjEsNyArMjkxLDcgQEAKICAgICByZXR1cm4gKChhYnMoeCAtIHkpICsgYWJzICh6IC0geSkpIC8gMikgLSBhYnMoeiAtIHgpID4gNDsgLy8gbWFrZSA0IGNvbmZpZ3VyYWJsZT8KIH0KIAotc3RhdGljIGludCBmaWx0ZXJfdG91dChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQorc3RhdGljIGludCBmaWx0ZXI4X3RvdXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKIHsKICAgICBUaHJlYWREYXRhICp0ZCA9IGFyZzsKICAgICBjb25zdCBTaWduYWxzdGF0c0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CkBAIC0yNTUsMTQgKzMyNSw1NSBAQAogICAgICAgICAgICAgICAgIGZpbHQgPSBGSUxURVIzKDIpICYmIEZJTFRFUjMoMSk7CiAgICAgICAgICAgICAgICAgc2NvcmUgKz0gZmlsdDsKICAgICAgICAgICAgICAgICBpZiAoZmlsdCAmJiBvdXQpCi0gICAgICAgICAgICAgICAgICAgIGJ1cm5fZnJhbWUocywgb3V0LCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgYnVybl9mcmFtZTgocywgb3V0LCB4LCB5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCB3IC0gMTsgeCsrKSB7CiAgICAgICAgICAgICAgICAgZmlsdCA9IEZJTFRFUjMoMSk7CiAgICAgICAgICAgICAgICAgc2NvcmUgKz0gZmlsdDsKICAgICAgICAgICAgICAgICBpZiAoZmlsdCAmJiBvdXQpCi0gICAgICAgICAgICAgICAgICAgIGJ1cm5fZnJhbWUocywgb3V0LCB4LCB5KTsKKyAgICAgICAgICAgICAgICAgICAgYnVybl9mcmFtZTgocywgb3V0LCB4LCB5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyMTZfdG91dChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIFRocmVhZERhdGEgKnRkID0gYXJnOworICAgIGNvbnN0IFNpZ25hbHN0YXRzQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBjb25zdCBBVkZyYW1lICppbiA9IHRkLT5pbjsKKyAgICBBVkZyYW1lICpvdXQgPSB0ZC0+b3V0OworICAgIGNvbnN0IGludCB3ID0gaW4tPndpZHRoOworICAgIGNvbnN0IGludCBoID0gaW4tPmhlaWdodDsKKyAgICBjb25zdCBpbnQgc2xpY2Vfc3RhcnQgPSAoaCAqICBqb2JuciAgICkgLyBuYl9qb2JzOworICAgIGNvbnN0IGludCBzbGljZV9lbmQgICA9IChoICogKGpvYm5yKzEpKSAvIG5iX2pvYnM7CisgICAgY29uc3QgdWludDE2X3QgKnAgPSAodWludDE2X3QgKilpbi0+ZGF0YVswXTsKKyAgICBpbnQgbHcgPSBpbi0+bGluZXNpemVbMF0gLyAyOworICAgIGludCB4LCB5LCBzY29yZSA9IDAsIGZpbHQ7CisKKyAgICBmb3IgKHkgPSBzbGljZV9zdGFydDsgeSA8IHNsaWNlX2VuZDsgeSsrKSB7CisKKyAgICAgICAgaWYgKHkgLSAxIDwgMCB8fCB5ICsgMSA+PSBoKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gZGV0ZWN0IHR3byBwaXhlbHMgYWJvdmUgYW5kIGJlbG93ICh0byBlbGltaW5hdGUgaW50ZXJsYWNlIGFydGVmYWN0cykKKyAgICAgICAgLy8gc2hvdWxkIGNoZWNrIHRoYXQgdmlkZW8gZm9ybWF0IGlzIGluZmFjdCBpbnRlcmxhY2VkLgorCisgICAgICAgIGlmICh5IC0gMiA+PSAwICYmIHkgKyAyIDwgaCkgeworICAgICAgICAgICAgZm9yICh4ID0gMTsgeCA8IHcgLSAxOyB4KyspIHsKKyAgICAgICAgICAgICAgICBmaWx0ID0gRklMVEVSMygyKSAmJiBGSUxURVIzKDEpOworICAgICAgICAgICAgICAgIHNjb3JlICs9IGZpbHQ7CisgICAgICAgICAgICAgICAgaWYgKGZpbHQgJiYgb3V0KQorICAgICAgICAgICAgICAgICAgICBidXJuX2ZyYW1lMTYocywgb3V0LCB4LCB5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDE7IHggPCB3IC0gMTsgeCsrKSB7CisgICAgICAgICAgICAgICAgZmlsdCA9IEZJTFRFUjMoMSk7CisgICAgICAgICAgICAgICAgc2NvcmUgKz0gZmlsdDsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdCAmJiBvdXQpCisgICAgICAgICAgICAgICAgICAgIGJ1cm5fZnJhbWUxNihzLCBvdXQsIHgsIHkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjcxLDcgKzM4Miw3IEBACiAKICNkZWZpbmUgVlJFUF9TVEFSVCA0CiAKLXN0YXRpYyBpbnQgZmlsdGVyX3ZyZXAoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icykKK3N0YXRpYyBpbnQgZmlsdGVyOF92cmVwKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCiB7CiAgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CiAgICAgY29uc3QgU2lnbmFsc3RhdHNDb250ZXh0ICpzID0gY3R4LT5wcml2OwpAQCAtMzAwLDI0ICs0MTEsNjAgQEAKICAgICAgICAgc2NvcmUgKz0gZmlsdDsKICAgICAgICAgaWYgKGZpbHQgJiYgb3V0KQogICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKLSAgICAgICAgICAgICAgICBidXJuX2ZyYW1lKHMsIG91dCwgeCwgeSk7CisgICAgICAgICAgICAgICAgYnVybl9mcmFtZTgocywgb3V0LCB4LCB5KTsKKyAgICB9CisgICAgcmV0dXJuIHNjb3JlICogdzsKK30KKworc3RhdGljIGludCBmaWx0ZXIxNl92cmVwKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCit7CisgICAgVGhyZWFkRGF0YSAqdGQgPSBhcmc7CisgICAgY29uc3QgU2lnbmFsc3RhdHNDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGNvbnN0IEFWRnJhbWUgKmluID0gdGQtPmluOworICAgIEFWRnJhbWUgKm91dCA9IHRkLT5vdXQ7CisgICAgY29uc3QgaW50IHcgPSBpbi0+d2lkdGg7CisgICAgY29uc3QgaW50IGggPSBpbi0+aGVpZ2h0OworICAgIGNvbnN0IGludCBzbGljZV9zdGFydCA9IChoICogIGpvYm5yICAgKSAvIG5iX2pvYnM7CisgICAgY29uc3QgaW50IHNsaWNlX2VuZCAgID0gKGggKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCB1aW50MTZfdCAqcCA9ICh1aW50MTZfdCAqKWluLT5kYXRhWzBdOworICAgIGNvbnN0IGludCBsdyA9IGluLT5saW5lc2l6ZVswXSAvIDI7CisgICAgaW50IHgsIHksIHNjb3JlID0gMDsKKworICAgIGZvciAoeSA9IHNsaWNlX3N0YXJ0OyB5IDwgc2xpY2VfZW5kOyB5KyspIHsKKyAgICAgICAgY29uc3QgaW50IHkybHcgPSAoeSAtIFZSRVBfU1RBUlQpICogbHc7CisgICAgICAgIGNvbnN0IGludCB5bHcgID0gIHkgICAgICAgICAgICAgICAqIGx3OworICAgICAgICBpbnQ2NF90IHRvdGRpZmYgPSAwOworICAgICAgICBpbnQgZmlsdDsKKworICAgICAgICBpZiAoeSA8IFZSRVBfU1RBUlQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgdG90ZGlmZiArPSBhYnMocFt5Mmx3ICsgeF0gLSBwW3lsdyArIHhdKTsKKyAgICAgICAgZmlsdCA9IHRvdGRpZmYgPCB3OworCisgICAgICAgIHNjb3JlICs9IGZpbHQ7CisgICAgICAgIGlmIChmaWx0ICYmIG91dCkKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICAgICAgYnVybl9mcmFtZTE2KHMsIG91dCwgeCwgeSk7CiAgICAgfQogICAgIHJldHVybiBzY29yZSAqIHc7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgaW50ICgqcHJvY2VzcykoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icyk7CisgICAgaW50ICgqcHJvY2VzczgpKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpOworICAgIGludCAoKnByb2Nlc3MxNikoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIHZvaWQgKmFyZywgaW50IGpvYm5yLCBpbnQgbmJfam9icyk7CiB9IGZpbHRlcnNfZGVmW10gPSB7Ci0gICAgeyJUT1VUIiwgZmlsdGVyX3RvdXR9LAotICAgIHsiVlJFUCIsIGZpbHRlcl92cmVwfSwKLSAgICB7IkJSTkciLCBmaWx0ZXJfYnJuZ30sCisgICAgeyJUT1VUIiwgZmlsdGVyOF90b3V0LCBmaWx0ZXIxNl90b3V0fSwKKyAgICB7IlZSRVAiLCBmaWx0ZXI4X3ZyZXAsIGZpbHRlcjE2X3ZyZXB9LAorICAgIHsiQlJORyIsIGZpbHRlcjhfYnJuZywgZmlsdGVyMTZfYnJuZ30sCiAgICAge05VTEx9CiB9OwogCiAjZGVmaW5lIERFUFRIIDI1NgogCi1zdGF0aWMgaW50IGNvbXB1dGVfc2F0X2h1ZV9tZXRyaWNzKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB2b2lkICphcmcsIGludCBqb2JuciwgaW50IG5iX2pvYnMpCitzdGF0aWMgaW50IGNvbXB1dGVfc2F0X2h1ZV9tZXRyaWNzOChBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQogewogICAgIGludCBpLCBqOwogICAgIFRocmVhZERhdGFIdWVTYXRNZXRyaWNzICp0ZCA9IGFyZzsKQEAgLTM1NSw3ICs1MDIsNTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbikKK3N0YXRpYyBpbnQgY29tcHV0ZV9zYXRfaHVlX21ldHJpY3MxNihBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKQoreworICAgIGludCBpLCBqOworICAgIFRocmVhZERhdGFIdWVTYXRNZXRyaWNzICp0ZCA9IGFyZzsKKyAgICBjb25zdCBTaWduYWxzdGF0c0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZGcmFtZSAqc3JjID0gdGQtPnNyYzsKKyAgICBBVkZyYW1lICpkc3Rfc2F0ID0gdGQtPmRzdF9zYXQ7CisgICAgQVZGcmFtZSAqZHN0X2h1ZSA9IHRkLT5kc3RfaHVlOworICAgIGNvbnN0IGludCBtaWQgPSAxIDw8IChzLT5kZXB0aCAtIDEpOworCisgICAgY29uc3QgaW50IHNsaWNlX3N0YXJ0ID0gKHMtPmNocm9tYWggKiAgam9ibnIgICApIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgc2xpY2VfZW5kICAgPSAocy0+Y2hyb21haCAqIChqb2JucisxKSkgLyBuYl9qb2JzOworCisgICAgY29uc3QgaW50IGxzel91ID0gc3JjLT5saW5lc2l6ZVsxXSAvIDI7CisgICAgY29uc3QgaW50IGxzel92ID0gc3JjLT5saW5lc2l6ZVsyXSAvIDI7CisgICAgY29uc3QgdWludDE2X3QgKnBfdSA9ICh1aW50MTZfdCopc3JjLT5kYXRhWzFdICsgc2xpY2Vfc3RhcnQgKiBsc3pfdTsKKyAgICBjb25zdCB1aW50MTZfdCAqcF92ID0gKHVpbnQxNl90KilzcmMtPmRhdGFbMl0gKyBzbGljZV9zdGFydCAqIGxzel92OworCisgICAgY29uc3QgaW50IGxzel9zYXQgPSBkc3Rfc2F0LT5saW5lc2l6ZVswXSAvIDI7CisgICAgY29uc3QgaW50IGxzel9odWUgPSBkc3RfaHVlLT5saW5lc2l6ZVswXSAvIDI7CisgICAgdWludDE2X3QgKnBfc2F0ID0gKHVpbnQxNl90Kilkc3Rfc2F0LT5kYXRhWzBdICsgc2xpY2Vfc3RhcnQgKiBsc3pfc2F0OworICAgIHVpbnQxNl90ICpwX2h1ZSA9ICh1aW50MTZfdCopZHN0X2h1ZS0+ZGF0YVswXSArIHNsaWNlX3N0YXJ0ICogbHN6X2h1ZTsKKworICAgIGZvciAoaiA9IHNsaWNlX3N0YXJ0OyBqIDwgc2xpY2VfZW5kOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmNocm9tYXc7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHl1dnUgPSBwX3VbaV07CisgICAgICAgICAgICBjb25zdCBpbnQgeXV2diA9IHBfdltpXTsKKyAgICAgICAgICAgIHBfc2F0W2ldID0gaHlwb3QoeXV2dSAtIG1pZCwgeXV2diAtIG1pZCk7IC8vIGludCBvciByb3VuZD8KKyAgICAgICAgICAgICgoaW50MTZfdCopcF9odWUpW2ldID0gZmxvb3IoKDE4MCAvIE1fUEkpICogYXRhbjJmKHl1dnUtbWlkLCB5dXZ2LW1pZCkgKyAxODApOworICAgICAgICB9CisgICAgICAgIHBfdSAgICs9IGxzel91OworICAgICAgICBwX3YgICArPSBsc3pfdjsKKyAgICAgICAgcF9zYXQgKz0gbHN6X3NhdDsKKyAgICAgICAgcF9odWUgKz0gbHN6X2h1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNvbXB1dGVfYml0X2RlcHRoKHVpbnQxNl90IG1hc2spCit7CisgICAgcmV0dXJuIGF2X3BvcGNvdW50KG1hc2spOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZTgoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbikKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPmRzdDsKICAgICBTaWduYWxzdGF0c0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CkBAIC0zODMsNiArNTc0LDcgQEAKICAgICBpbnQgdG90eSA9IDAsIHRvdHUgPSAwLCB0b3R2ID0gMCwgdG90c2F0PTA7CiAgICAgaW50IHRvdGh1ZSA9IDA7CiAgICAgaW50IGRpZnkgPSAwLCBkaWZ1ID0gMCwgZGlmdiA9IDA7CisgICAgdWludDE2X3QgbWFza3kgPSAwLCBtYXNrdSA9IDAsIG1hc2t2ID0gMDsKIAogICAgIGludCBmaWx0b3RbRklMVF9OVU1CXSA9IHswfTsKICAgICBBVkZyYW1lICpwcmV2OwpAQCAtNDA5LDEzICs2MDEsMTUgQEAKICAgICAgICAgYXZfZnJhbWVfbWFrZV93cml0YWJsZShvdXQpOwogICAgIH0KIAotICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBjb21wdXRlX3NhdF9odWVfbWV0cmljcywgJnRkX2h1ZXNhdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIEZGTUlOKHMtPmNocm9tYWgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgY29tcHV0ZV9zYXRfaHVlX21ldHJpY3M4LCAmdGRfaHVlc2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgRkZNSU4ocy0+Y2hyb21haCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKIAogICAgIC8vIENhbGN1bGF0ZSBsdW1hIGhpc3RvZ3JhbSBhbmQgZGlmZmVyZW5jZSB3aXRoIHByZXZpb3VzIGZyYW1lIG9yIGZpZWxkLgogICAgIGZvciAoaiA9IDA7IGogPCBsaW5rLT5oOyBqKyspIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxpbmstPnc7IGkrKykgewogICAgICAgICAgICAgY29uc3QgaW50IHl1diA9IGluLT5kYXRhWzBdW3cgKyBpXTsKKworICAgICAgICAgICAgbWFza3kgfD0geXV2OwogICAgICAgICAgICAgaGlzdHlbeXV2XSsrOwogICAgICAgICAgICAgZGlmeSArPSBhYnMoeXV2IC0gcHJldi0+ZGF0YVswXVtwdyArIGldKTsKICAgICAgICAgfQpAQCAtNDI4LDYgKzYyMiw5IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5jaHJvbWF3OyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IGludCB5dXZ1ID0gaW4tPmRhdGFbMV1bY3craV07CiAgICAgICAgICAgICBjb25zdCBpbnQgeXV2diA9IGluLT5kYXRhWzJdW2N3K2ldOworCisgICAgICAgICAgICBtYXNrdSB8PSB5dXZ1OworICAgICAgICAgICAgbWFza3YgfD0geXV2djsKICAgICAgICAgICAgIGhpc3R1W3l1dnVdKys7CiAgICAgICAgICAgICBkaWZ1ICs9IGFicyh5dXZ1IC0gcHJldi0+ZGF0YVsxXVtjcHcraV0pOwogICAgICAgICAgICAgaGlzdHZbeXV2dl0rKzsKQEAgLTQ0OSw3ICs2NDYsNyBAQAogICAgICAgICAgICAgICAgIC5vdXQgPSBvdXQgIT0gaW4gJiYgcy0+b3V0ZmlsdGVyID09IGZpbCA/IG91dCA6IE5VTEwsCiAgICAgICAgICAgICB9OwogICAgICAgICAgICAgbWVtc2V0KHMtPmpvYnNfcmV0cywgMCwgcy0+bmJfam9icyAqIHNpemVvZigqcy0+am9ic19yZXRzKSk7Ci0gICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyc19kZWZbZmlsXS5wcm9jZXNzLAorICAgICAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcnNfZGVmW2ZpbF0ucHJvY2VzczgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZCwgcy0+am9ic19yZXRzLCBzLT5uYl9qb2JzKTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9qb2JzOyBpKyspCiAgICAgICAgICAgICAgICAgZmlsdG90W2ZpbF0gKz0gcy0+am9ic19yZXRzW2ldOwpAQCAtNTQ5LDYgKzc0NiwxMCBAQAogICAgIFNFVF9NRVRBKCJVRElGIiwgICAgIiVnIiwgMS4wICogZGlmdSAvIHMtPmNmcyk7CiAgICAgU0VUX01FVEEoIlZESUYiLCAgICAiJWciLCAxLjAgKiBkaWZ2IC8gcy0+Y2ZzKTsKIAorICAgIFNFVF9NRVRBKCJZQklUREVQVEgiLCAiJWQiLCBjb21wdXRlX2JpdF9kZXB0aChtYXNreSkpOworICAgIFNFVF9NRVRBKCJVQklUREVQVEgiLCAiJWQiLCBjb21wdXRlX2JpdF9kZXB0aChtYXNrdSkpOworICAgIFNFVF9NRVRBKCJWQklUREVQVEgiLCAiJWQiLCBjb21wdXRlX2JpdF9kZXB0aChtYXNrdikpOworCiAgICAgZm9yIChmaWwgPSAwOyBmaWwgPCBGSUxUX05VTUI7IGZpbCArKykgewogICAgICAgICBpZiAocy0+ZmlsdGVycyAmIDE8PGZpbCkgewogICAgICAgICAgICAgY2hhciBtZXRhbmFtZVsxMjhdOwpAQCAtNTYzLDYgKzc2NCwyMzQgQEAKICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CiB9CiAKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lMTYoQVZGaWx0ZXJMaW5rICpsaW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGxpbmstPmRzdDsKKyAgICBTaWduYWxzdGF0c0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dCA9IGluOworICAgIGludCBpLCBqOworICAgIGludCAgdyA9IDAsICBjdyA9IDAsIC8vIGluCisgICAgICAgIHB3ID0gMCwgY3B3ID0gMDsgLy8gcHJldgorICAgIGludCBmaWw7CisgICAgY2hhciBtZXRhYnVmWzEyOF07CisgICAgdW5zaWduZWQgaW50ICpoaXN0eSA9IHMtPmhpc3R5LAorICAgICAgICAgICAgICAgICAqaGlzdHUgPSBzLT5oaXN0dSwKKyAgICAgICAgICAgICAgICAgKmhpc3R2ID0gcy0+aGlzdHYsCisgICAgICAgICAgICAgICAgIGhpc3RodWVbMzYwXSA9IHswfSwKKyAgICAgICAgICAgICAgICAgKmhpc3RzYXQgPSBzLT5oaXN0c2F0OworICAgIGludCBtaW55ICA9IC0xLCBtaW51ICA9IC0xLCBtaW52ICA9IC0xOworICAgIGludCBtYXh5ICA9IC0xLCBtYXh1ICA9IC0xLCBtYXh2ICA9IC0xOworICAgIGludCBsb3d5ICA9IC0xLCBsb3d1ICA9IC0xLCBsb3d2ICA9IC0xOworICAgIGludCBoaWdoeSA9IC0xLCBoaWdodSA9IC0xLCBoaWdodiA9IC0xOworICAgIGludCBtaW5zYXQgPSAtMSwgbWF4c2F0ID0gLTEsIGxvd3NhdCA9IC0xLCBoaWdoc2F0ID0gLTE7CisgICAgaW50IGxvd3AsIGhpZ2hwLCBjbG93cCwgY2hpZ2hwOworICAgIGludCBhY2N5LCBhY2N1LCBhY2N2OworICAgIGludCBhY2NzYXQsIGFjY2h1ZSA9IDA7CisgICAgaW50IG1lZGh1ZSwgbWF4aHVlOworICAgIGludDY0X3QgdG90eSA9IDAsIHRvdHUgPSAwLCB0b3R2ID0gMCwgdG90c2F0PTA7CisgICAgaW50NjRfdCB0b3RodWUgPSAwOworICAgIGludDY0X3QgZGlmeSA9IDAsIGRpZnUgPSAwLCBkaWZ2ID0gMDsKKyAgICB1aW50MTZfdCBtYXNreSA9IDAsIG1hc2t1ID0gMCwgbWFza3YgPSAwOworCisgICAgaW50IGZpbHRvdFtGSUxUX05VTUJdID0gezB9OworICAgIEFWRnJhbWUgKnByZXY7CisKKyAgICBBVkZyYW1lICpzYXQgPSBzLT5mcmFtZV9zYXQ7CisgICAgQVZGcmFtZSAqaHVlID0gcy0+ZnJhbWVfaHVlOworICAgIGNvbnN0IHVpbnQxNl90ICpwX3NhdCA9ICh1aW50MTZfdCAqKXNhdC0+ZGF0YVswXTsKKyAgICBjb25zdCB1aW50MTZfdCAqcF9odWUgPSAodWludDE2X3QgKilodWUtPmRhdGFbMF07CisgICAgY29uc3QgaW50IGxzel9zYXQgPSBzYXQtPmxpbmVzaXplWzBdIC8gMjsKKyAgICBjb25zdCBpbnQgbHN6X2h1ZSA9IGh1ZS0+bGluZXNpemVbMF0gLyAyOworICAgIFRocmVhZERhdGFIdWVTYXRNZXRyaWNzIHRkX2h1ZXNhdCA9IHsKKyAgICAgICAgLnNyYyAgICAgPSBpbiwKKyAgICAgICAgLmRzdF9zYXQgPSBzYXQsCisgICAgICAgIC5kc3RfaHVlID0gaHVlLAorICAgIH07CisKKyAgICBpZiAoIXMtPmZyYW1lX3ByZXYpCisgICAgICAgIHMtPmZyYW1lX3ByZXYgPSBhdl9mcmFtZV9jbG9uZShpbik7CisKKyAgICBwcmV2ID0gcy0+ZnJhbWVfcHJldjsKKworICAgIGlmIChzLT5vdXRmaWx0ZXIgIT0gRklMVEVSX05PTkUpIHsKKyAgICAgICAgb3V0ID0gYXZfZnJhbWVfY2xvbmUoaW4pOworICAgICAgICBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKG91dCk7CisgICAgfQorCisgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGNvbXB1dGVfc2F0X2h1ZV9tZXRyaWNzMTYsICZ0ZF9odWVzYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBGRk1JTihzLT5jaHJvbWFoLCBmZl9maWx0ZXJfZ2V0X25iX3RocmVhZHMoY3R4KSkpOworCisgICAgLy8gQ2FsY3VsYXRlIGx1bWEgaGlzdG9ncmFtIGFuZCBkaWZmZXJlbmNlIHdpdGggcHJldmlvdXMgZnJhbWUgb3IgZmllbGQuCisgICAgbWVtc2V0KHMtPmhpc3R5LCAwLCAoMSA8PCBzLT5kZXB0aCkgKiBzaXplb2YoKnMtPmhpc3R5KSk7CisgICAgZm9yIChqID0gMDsgaiA8IGxpbmstPmg7IGorKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGluay0+dzsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgeXV2ID0gQVZfUk4xNihpbi0+ZGF0YVswXSArIHcgKyBpICogMik7CisKKyAgICAgICAgICAgIG1hc2t5IHw9IHl1djsKKyAgICAgICAgICAgIGhpc3R5W3l1dl0rKzsKKyAgICAgICAgICAgIGRpZnkgKz0gYWJzKHl1diAtIEFWX1JOMTYocHJldi0+ZGF0YVswXSArIHB3ICsgaSAqIDIpKTsKKyAgICAgICAgfQorICAgICAgICB3ICArPSBpbi0+bGluZXNpemVbMF07CisgICAgICAgIHB3ICs9IHByZXYtPmxpbmVzaXplWzBdOworICAgIH0KKworICAgIC8vIENhbGN1bGF0ZSBjaHJvbWEgaGlzdG9ncmFtIGFuZCBkaWZmZXJlbmNlIHdpdGggcHJldmlvdXMgZnJhbWUgb3IgZmllbGQuCisgICAgbWVtc2V0KHMtPmhpc3R1LCAwLCAoMSA8PCBzLT5kZXB0aCkgKiBzaXplb2YoKnMtPmhpc3R1KSk7CisgICAgbWVtc2V0KHMtPmhpc3R2LCAwLCAoMSA8PCBzLT5kZXB0aCkgKiBzaXplb2YoKnMtPmhpc3R2KSk7CisgICAgbWVtc2V0KHMtPmhpc3RzYXQsIDAsICgxIDw8IHMtPmRlcHRoKSAqIHNpemVvZigqcy0+aGlzdHNhdCkpOworICAgIGZvciAoaiA9IDA7IGogPCBzLT5jaHJvbWFoOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPmNocm9tYXc7IGkrKykgeworICAgICAgICAgICAgY29uc3QgaW50IHl1dnUgPSBBVl9STjE2KGluLT5kYXRhWzFdICsgY3cgKyBpICogMik7CisgICAgICAgICAgICBjb25zdCBpbnQgeXV2diA9IEFWX1JOMTYoaW4tPmRhdGFbMl0gKyBjdyArIGkgKiAyKTsKKworICAgICAgICAgICAgbWFza3UgfD0geXV2dTsKKyAgICAgICAgICAgIG1hc2t2IHw9IHl1dnY7CisgICAgICAgICAgICBoaXN0dVt5dXZ1XSsrOworICAgICAgICAgICAgZGlmdSArPSBhYnMoeXV2dSAtIEFWX1JOMTYocHJldi0+ZGF0YVsxXSArIGNwdyArIGkgKiAyKSk7CisgICAgICAgICAgICBoaXN0dlt5dXZ2XSsrOworICAgICAgICAgICAgZGlmdiArPSBhYnMoeXV2diAtIEFWX1JOMTYocHJldi0+ZGF0YVsyXSArIGNwdyArIGkgKiAyKSk7CisKKyAgICAgICAgICAgIGhpc3RzYXRbcF9zYXRbaV1dKys7CisgICAgICAgICAgICBoaXN0aHVlWygoaW50MTZfdCopcF9odWUpW2ldXSsrOworICAgICAgICB9CisgICAgICAgIGN3ICArPSBpbi0+bGluZXNpemVbMV07CisgICAgICAgIGNwdyArPSBwcmV2LT5saW5lc2l6ZVsxXTsKKyAgICAgICAgcF9zYXQgKz0gbHN6X3NhdDsKKyAgICAgICAgcF9odWUgKz0gbHN6X2h1ZTsKKyAgICB9CisKKyAgICBmb3IgKGZpbCA9IDA7IGZpbCA8IEZJTFRfTlVNQjsgZmlsICsrKSB7CisgICAgICAgIGlmIChzLT5maWx0ZXJzICYgMTw8ZmlsKSB7CisgICAgICAgICAgICBUaHJlYWREYXRhIHRkID0geworICAgICAgICAgICAgICAgIC5pbiA9IGluLAorICAgICAgICAgICAgICAgIC5vdXQgPSBvdXQgIT0gaW4gJiYgcy0+b3V0ZmlsdGVyID09IGZpbCA/IG91dCA6IE5VTEwsCisgICAgICAgICAgICB9OworICAgICAgICAgICAgbWVtc2V0KHMtPmpvYnNfcmV0cywgMCwgcy0+bmJfam9icyAqIHNpemVvZigqcy0+am9ic19yZXRzKSk7CisgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyc19kZWZbZmlsXS5wcm9jZXNzMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZCwgcy0+am9ic19yZXRzLCBzLT5uYl9qb2JzKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9qb2JzOyBpKyspCisgICAgICAgICAgICAgICAgZmlsdG90W2ZpbF0gKz0gcy0+am9ic19yZXRzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZmluZCBsb3cgLyBoaWdoIGJhc2VkIG9uIGhpc3RvZ3JhbSBwZXJjZW50aWxlCisgICAgLy8gdGhlc2Ugb25seSBuZWVkIHRvIGJlIGNhbGN1bGF0ZWQgb25jZS4KKworICAgIGxvd3AgICA9IGxyaW50KHMtPmZzICAqIDEwIC8gMTAwLik7CisgICAgaGlnaHAgID0gbHJpbnQocy0+ZnMgICogOTAgLyAxMDAuKTsKKyAgICBjbG93cCAgPSBscmludChzLT5jZnMgKiAxMCAvIDEwMC4pOworICAgIGNoaWdocCA9IGxyaW50KHMtPmNmcyAqIDkwIC8gMTAwLik7CisKKyAgICBhY2N5ID0gYWNjdSA9IGFjY3YgPSBhY2NzYXQgPSAwOworICAgIGZvciAoZmlsID0gMDsgZmlsIDwgMSA8PCBzLT5kZXB0aDsgZmlsKyspIHsKKyAgICAgICAgaWYgKG1pbnkgICA8IDAgJiYgaGlzdHlbZmlsXSkgICBtaW55ID0gZmlsOworICAgICAgICBpZiAobWludSAgIDwgMCAmJiBoaXN0dVtmaWxdKSAgIG1pbnUgPSBmaWw7CisgICAgICAgIGlmIChtaW52ICAgPCAwICYmIGhpc3R2W2ZpbF0pICAgbWludiA9IGZpbDsKKyAgICAgICAgaWYgKG1pbnNhdCA8IDAgJiYgaGlzdHNhdFtmaWxdKSBtaW5zYXQgPSBmaWw7CisKKyAgICAgICAgaWYgKGhpc3R5W2ZpbF0pICAgbWF4eSAgID0gZmlsOworICAgICAgICBpZiAoaGlzdHVbZmlsXSkgICBtYXh1ICAgPSBmaWw7CisgICAgICAgIGlmIChoaXN0dltmaWxdKSAgIG1heHYgICA9IGZpbDsKKyAgICAgICAgaWYgKGhpc3RzYXRbZmlsXSkgbWF4c2F0ID0gZmlsOworCisgICAgICAgIHRvdHkgICArPSBoaXN0eVtmaWxdICAgKiBmaWw7CisgICAgICAgIHRvdHUgICArPSBoaXN0dVtmaWxdICAgKiBmaWw7CisgICAgICAgIHRvdHYgICArPSBoaXN0dltmaWxdICAgKiBmaWw7CisgICAgICAgIHRvdHNhdCArPSBoaXN0c2F0W2ZpbF0gKiBmaWw7CisKKyAgICAgICAgYWNjeSAgICs9IGhpc3R5W2ZpbF07CisgICAgICAgIGFjY3UgICArPSBoaXN0dVtmaWxdOworICAgICAgICBhY2N2ICAgKz0gaGlzdHZbZmlsXTsKKyAgICAgICAgYWNjc2F0ICs9IGhpc3RzYXRbZmlsXTsKKworICAgICAgICBpZiAobG93eSAgID09IC0xICYmIGFjY3kgICA+PSAgbG93cCkgbG93eSAgID0gZmlsOworICAgICAgICBpZiAobG93dSAgID09IC0xICYmIGFjY3UgICA+PSBjbG93cCkgbG93dSAgID0gZmlsOworICAgICAgICBpZiAobG93diAgID09IC0xICYmIGFjY3YgICA+PSBjbG93cCkgbG93diAgID0gZmlsOworICAgICAgICBpZiAobG93c2F0ID09IC0xICYmIGFjY3NhdCA+PSBjbG93cCkgbG93c2F0ID0gZmlsOworCisgICAgICAgIGlmIChoaWdoeSAgID09IC0xICYmIGFjY3kgICA+PSAgaGlnaHApIGhpZ2h5ICAgPSBmaWw7CisgICAgICAgIGlmIChoaWdodSAgID09IC0xICYmIGFjY3UgICA+PSBjaGlnaHApIGhpZ2h1ICAgPSBmaWw7CisgICAgICAgIGlmIChoaWdodiAgID09IC0xICYmIGFjY3YgICA+PSBjaGlnaHApIGhpZ2h2ICAgPSBmaWw7CisgICAgICAgIGlmIChoaWdoc2F0ID09IC0xICYmIGFjY3NhdCA+PSBjaGlnaHApIGhpZ2hzYXQgPSBmaWw7CisgICAgfQorCisgICAgbWF4aHVlID0gaGlzdGh1ZVswXTsKKyAgICBtZWRodWUgPSAtMTsKKyAgICBmb3IgKGZpbCA9IDA7IGZpbCA8IDM2MDsgZmlsKyspIHsKKyAgICAgICAgdG90aHVlICs9IGhpc3RodWVbZmlsXSAqIGZpbDsKKyAgICAgICAgYWNjaHVlICs9IGhpc3RodWVbZmlsXTsKKworICAgICAgICBpZiAobWVkaHVlID09IC0xICYmIGFjY2h1ZSA+IHMtPmNmcyAvIDIpCisgICAgICAgICAgICBtZWRodWUgPSBmaWw7CisgICAgICAgIGlmIChoaXN0aHVlW2ZpbF0gPiBtYXhodWUpIHsKKyAgICAgICAgICAgIG1heGh1ZSA9IGhpc3RodWVbZmlsXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJnMtPmZyYW1lX3ByZXYpOworICAgIHMtPmZyYW1lX3ByZXYgPSBhdl9mcmFtZV9jbG9uZShpbik7CisKKyAgICBTRVRfTUVUQSgiWU1JTiIsICAgICIlZCIsIG1pbnkpOworICAgIFNFVF9NRVRBKCJZTE9XIiwgICAgIiVkIiwgbG93eSk7CisgICAgU0VUX01FVEEoIllBVkciLCAgICAiJWciLCAxLjAgKiB0b3R5IC8gcy0+ZnMpOworICAgIFNFVF9NRVRBKCJZSElHSCIsICAgIiVkIiwgaGlnaHkpOworICAgIFNFVF9NRVRBKCJZTUFYIiwgICAgIiVkIiwgbWF4eSk7CisKKyAgICBTRVRfTUVUQSgiVU1JTiIsICAgICIlZCIsIG1pbnUpOworICAgIFNFVF9NRVRBKCJVTE9XIiwgICAgIiVkIiwgbG93dSk7CisgICAgU0VUX01FVEEoIlVBVkciLCAgICAiJWciLCAxLjAgKiB0b3R1IC8gcy0+Y2ZzKTsKKyAgICBTRVRfTUVUQSgiVUhJR0giLCAgICIlZCIsIGhpZ2h1KTsKKyAgICBTRVRfTUVUQSgiVU1BWCIsICAgICIlZCIsIG1heHUpOworCisgICAgU0VUX01FVEEoIlZNSU4iLCAgICAiJWQiLCBtaW52KTsKKyAgICBTRVRfTUVUQSgiVkxPVyIsICAgICIlZCIsIGxvd3YpOworICAgIFNFVF9NRVRBKCJWQVZHIiwgICAgIiVnIiwgMS4wICogdG90diAvIHMtPmNmcyk7CisgICAgU0VUX01FVEEoIlZISUdIIiwgICAiJWQiLCBoaWdodik7CisgICAgU0VUX01FVEEoIlZNQVgiLCAgICAiJWQiLCBtYXh2KTsKKworICAgIFNFVF9NRVRBKCJTQVRNSU4iLCAgIiVkIiwgbWluc2F0KTsKKyAgICBTRVRfTUVUQSgiU0FUTE9XIiwgICIlZCIsIGxvd3NhdCk7CisgICAgU0VUX01FVEEoIlNBVEFWRyIsICAiJWciLCAxLjAgKiB0b3RzYXQgLyBzLT5jZnMpOworICAgIFNFVF9NRVRBKCJTQVRISUdIIiwgIiVkIiwgaGlnaHNhdCk7CisgICAgU0VUX01FVEEoIlNBVE1BWCIsICAiJWQiLCBtYXhzYXQpOworCisgICAgU0VUX01FVEEoIkhVRU1FRCIsICAiJWQiLCBtZWRodWUpOworICAgIFNFVF9NRVRBKCJIVUVBVkciLCAgIiVnIiwgMS4wICogdG90aHVlIC8gcy0+Y2ZzKTsKKworICAgIFNFVF9NRVRBKCJZRElGIiwgICAgIiVnIiwgMS4wICogZGlmeSAvIHMtPmZzKTsKKyAgICBTRVRfTUVUQSgiVURJRiIsICAgICIlZyIsIDEuMCAqIGRpZnUgLyBzLT5jZnMpOworICAgIFNFVF9NRVRBKCJWRElGIiwgICAgIiVnIiwgMS4wICogZGlmdiAvIHMtPmNmcyk7CisKKyAgICBTRVRfTUVUQSgiWUJJVERFUFRIIiwgIiVkIiwgY29tcHV0ZV9iaXRfZGVwdGgobWFza3kpKTsKKyAgICBTRVRfTUVUQSgiVUJJVERFUFRIIiwgIiVkIiwgY29tcHV0ZV9iaXRfZGVwdGgobWFza3UpKTsKKyAgICBTRVRfTUVUQSgiVkJJVERFUFRIIiwgIiVkIiwgY29tcHV0ZV9iaXRfZGVwdGgobWFza3YpKTsKKworICAgIGZvciAoZmlsID0gMDsgZmlsIDwgRklMVF9OVU1COyBmaWwgKyspIHsKKyAgICAgICAgaWYgKHMtPmZpbHRlcnMgJiAxPDxmaWwpIHsKKyAgICAgICAgICAgIGNoYXIgbWV0YW5hbWVbMTI4XTsKKyAgICAgICAgICAgIHNucHJpbnRmKG1ldGFidWYsICBzaXplb2YobWV0YWJ1ZiksICAiJWciLCAxLjAgKiBmaWx0b3RbZmlsXSAvIHMtPmZzKTsKKyAgICAgICAgICAgIHNucHJpbnRmKG1ldGFuYW1lLCBzaXplb2YobWV0YW5hbWUpLCAibGF2Zmkuc2lnbmFsc3RhdHMuJXMiLCBmaWx0ZXJzX2RlZltmaWxdLm5hbWUpOworICAgICAgICAgICAgYXZfZGljdF9zZXQoJm91dC0+bWV0YWRhdGEsIG1ldGFuYW1lLCBtZXRhYnVmLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbiAhPSBvdXQpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5kc3Q7CisgICAgU2lnbmFsc3RhdHNDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKHMtPmRlcHRoID4gOCkKKyAgICAgICAgcmV0dXJuIGZpbHRlcl9mcmFtZTE2KGxpbmssIGluKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBmaWx0ZXJfZnJhbWU4KGxpbmssIGluKTsKK30KKwogc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNpZ25hbHN0YXRzX2lucHV0c1tdID0gewogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICAgID0gImRlZmF1bHQiLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfc2lnbmF0dXJlLmMgYi9saWJhdmZpbHRlci92Zl9zaWduYXR1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDdiMjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfc2lnbmF0dXJlLmMKQEAgLTAsMCArMSw3NzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgR2VyaW9uIEVudHJ1cAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKy8qKgorICogQGZpbGUKKyAqIE1QRUctNyB2aWRlbyBzaWduYXR1cmUgY2FsY3VsYXRpb24gYW5kIGxvb2t1cCBmaWx0ZXIKKyAqIEBzZWUgaHR0cDovL2VwdWJzLnN1cnJleS5hYy51ay81MzE1OTAvMS9NUEVHLTclMjBWaWRlbyUyMFNpZ25hdHVyZSUyMEF1dGhvciUyN3MlMjBDb3B5LnBkZgorICovCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgImxpYmF2Y29kZWMvcHV0X2JpdHMuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC9hdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzaWduYXR1cmUuaCIKKyNpbmNsdWRlICJzaWduYXR1cmVfbG9va3VwLmMiCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFNpZ25hdHVyZUNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTSB8IEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisjZGVmaW5lIEJMT0NLX0xDTSAoaW50NjRfdCkgNDc2OTg1NjAwCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBzaWduYXR1cmVfb3B0aW9uc1tdID0geworICAgIHsgImRldGVjdG1vZGUiLCAic2V0IHRoZSBkZXRlY3Rtb2RlIiwKKyAgICAgICAgT0ZGU0VUKG1vZGUpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSBNT0RFX09GRn0sIDAsIE5CX0xPT0tVUF9NT0RFLTEsIEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAib2ZmIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1PREVfT0ZGfSwgIDAsIDAsIC5mbGFncyA9IEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAiZnVsbCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1PREVfRlVMTH0sIDAsIDAsIC5mbGFncyA9IEZMQUdTLCAibW9kZSIgfSwKKyAgICAgICAgeyAiZmFzdCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IE1PREVfRkFTVH0sIDAsIDAsIC5mbGFncyA9IEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICJuYl9pbnB1dHMiLCAgIm51bWJlciBvZiBpbnB1dHMiLAorICAgICAgICBPRkZTRVQobmJfaW5wdXRzKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDF9LCAgICAgICAgMSwgSU5UX01BWCwgICAgICAgICAgRkxBR1MgfSwKKyAgICB7ICJmaWxlbmFtZSIsICAgImZpbGVuYW1lIGZvciBvdXRwdXQgZmlsZXMiLAorICAgICAgICBPRkZTRVQoZmlsZW5hbWUpLCAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICIifSwgICAgICAgMCwgTkJfRk9STUFUUy0xLCAgICAgRkxBR1MgfSwKKyAgICB7ICJmb3JtYXQiLCAgICAgInNldCBvdXRwdXQgZm9ybWF0IiwKKyAgICAgICAgT0ZGU0VUKGZvcm1hdCksICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSBGT1JNQVRfQklOQVJZfSwgMCwgMSwgICAgICAgICAgIEZMQUdTICwgImZvcm1hdCIgfSwKKyAgICAgICAgeyAiYmluYXJ5IiwgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZPUk1BVF9CSU5BUll9LCAwLCAwLCBGTEFHUywgImZvcm1hdCIgfSwKKyAgICAgICAgeyAieG1sIiwgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUZPUk1BVF9YTUx9LCAgICAwLCAwLCBGTEFHUywgImZvcm1hdCIgfSwKKyAgICB7ICJ0aF9kIiwgICAgICAgInRocmVzaG9sZCB0byBkZXRlY3Qgb25lIHdvcmQgYXMgc2ltaWxhciIsCisgICAgICAgIE9GRlNFVCh0aHdvcmRkaXN0KSwgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gOTAwMH0sICAgICAxLCBJTlRfTUFYLCAgICAgICAgICBGTEFHUyB9LAorICAgIHsgInRoX2RjIiwgICAgICAidGhyZXNob2xkIHRvIGRldGVjdCBhbGwgd29yZHMgYXMgc2ltaWxhciIsCisgICAgICAgIE9GRlNFVCh0aGNvbXBvc2Rpc3QpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gNjAwMDB9LCAgICAxLCBJTlRfTUFYLCAgICAgICAgICBGTEFHUyB9LAorICAgIHsgInRoX3hoIiwgICAgICAidGhyZXNob2xkIHRvIGRldGVjdCBmcmFtZXMgYXMgc2ltaWxhciIsCisgICAgICAgIE9GRlNFVCh0aGwxKSwgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0ID0gMTE2fSwgICAgICAxLCBJTlRfTUFYLCAgICAgICAgICBGTEFHUyB9LAorICAgIHsgInRoX2RpIiwgICAgICAibWluaW11bSBsZW5ndGggb2YgbWF0Y2hpbmcgc2VxdWVuY2UgaW4gZnJhbWVzIiwKKyAgICAgICAgT0ZGU0VUKHRoZGkpLCAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwfSwgICAgICAgIDAsIElOVF9NQVgsICAgICAgICAgIEZMQUdTIH0sCisgICAgeyAidGhfaXQiLCAgICAgICJ0aHJlc2hvbGQgZm9yIHJlbGF0aW9uIG9mIGdvb2QgdG8gYWxsIGZyYW1lcyIsCisgICAgICAgIE9GRlNFVCh0aGl0KSwgICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gMC41fSwgICAgMC4wLCAxLjAsICAgICAgICAgICAgICBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1Moc2lnbmF0dXJlKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIC8qIGFsbCBmb3JtYXRzIHdpdGggYSBzZXBhcmF0ZSBncmF5IHZhbHVlICovCisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQxMFAsIEFWX1BJWF9GTVRfWVVWNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLCBBVl9QSVhfRk1UX1lVVjQyMlAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0NDBQLAorICAgICAgICBBVl9QSVhfRk1UX05WMTIsIEFWX1BJWF9GTVRfTlYyMSwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgU2lnbmF0dXJlQ29udGV4dCAqc2ljID0gY3R4LT5wcml2OworICAgIFN0cmVhbUNvbnRleHQgKnNjID0gJihzaWMtPnN0cmVhbWNvbnRleHRzW0ZGX0lOTElOS19JRFgoaW5saW5rKV0pOworCisgICAgc2MtPnRpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworICAgIC8qIHRlc3QgZm9yIG92ZXJmbG93ICovCisgICAgc2MtPmRpdmlkZSA9ICgoKHVpbnQ2NF90KSBpbmxpbmstPncvMzIpICogKGlubGluay0+dy8zMiArIDEpICogKGlubGluay0+aC8zMiAqIGlubGluay0+aC8zMiArIDEpID4gSU5UNjRfTUFYIC8gKEJMT0NLX0xDTSAqIDI1NSkpOworICAgIGlmIChzYy0+ZGl2aWRlKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiSW5wdXQgZGltZW5zaW9uIHRvbyBoaWdoIGZvciBwcmVjaXNlIGNhbGN1bGF0aW9uLCBudW1iZXJzIHdpbGwgYmUgcm91bmRlZC5cbiIpOworICAgIH0KKyAgICBzYy0+dyA9IGlubGluay0+dzsKKyAgICBzYy0+aCA9IGlubGluay0+aDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYmxvY2tfc2l6ZShjb25zdCBCbG9jayAqYikKK3sKKyAgICByZXR1cm4gKGItPnRvLnkgLSBiLT51cC55ICsgMSkgKiAoYi0+dG8ueCAtIGItPnVwLnggKyAxKTsKK30KKworc3RhdGljIHVpbnQ2NF90IGdldF9ibG9ja19zdW0oU3RyZWFtQ29udGV4dCAqc2MsIHVpbnQ2NF90IGludHBpY1szMl1bMzJdLCBjb25zdCBCbG9jayAqYikKK3sKKyAgICB1aW50NjRfdCBzdW0gPSAwOworCisgICAgaW50IHgwLCB5MCwgeDEsIHkxOworCisgICAgeDAgPSBiLT51cC54OworICAgIHkwID0gYi0+dXAueTsKKyAgICB4MSA9IGItPnRvLng7CisgICAgeTEgPSBiLT50by55OworCisgICAgaWYgKHgwLTEgPj0gMCAmJiB5MC0xID49IDApIHsKKyAgICAgICAgc3VtID0gaW50cGljW3kxXVt4MV0gKyBpbnRwaWNbeTAtMV1beDAtMV0gLSBpbnRwaWNbeTFdW3gwLTFdIC0gaW50cGljW3kwLTFdW3gxXTsKKyAgICB9IGVsc2UgaWYgKHgwLTEgPj0gMCkgeworICAgICAgICBzdW0gPSBpbnRwaWNbeTFdW3gxXSAtIGludHBpY1t5MV1beDAtMV07CisgICAgfSBlbHNlIGlmICh5MC0xID49IDApIHsKKyAgICAgICAgc3VtID0gaW50cGljW3kxXVt4MV0gLSBpbnRwaWNbeTAtMV1beDFdOworICAgIH0gZWxzZSB7CisgICAgICAgIHN1bSA9IGludHBpY1t5MV1beDFdOworICAgIH0KKyAgICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IGNtcChjb25zdCB1aW50NjRfdCAqYSwgY29uc3QgdWludDY0X3QgKmIpCit7CisgICAgcmV0dXJuICphIDwgKmIgPyAtMSA6ICggKmEgPiAqYiA/IDEgOiAwICk7Cit9CisKKy8qKgorICogc2V0cyB0aGUgYml0IGF0IHBvc2l0aW9uIHBvcyB0byAxIGluIGRhdGEKKyAqLworc3RhdGljIHZvaWQgc2V0X2JpdCh1aW50OF90KiBkYXRhLCBzaXplX3QgcG9zKQoreworICAgIHVpbnQ4X3QgbWFzayA9IDEgPDwgNy0ocG9zJTgpOworICAgIGRhdGFbcG9zLzhdIHw9IG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpwaWNyZWYpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBTaWduYXR1cmVDb250ZXh0ICpzaWMgPSBjdHgtPnByaXY7CisgICAgU3RyZWFtQ29udGV4dCAqc2MgPSAmKHNpYy0+c3RyZWFtY29udGV4dHNbRkZfSU5MSU5LX0lEWChpbmxpbmspXSk7CisgICAgRmluZVNpZ25hdHVyZSogZnM7CisKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBwb3QzWzVdID0geyAzKjMqMyozLCAzKjMqMywgMyozLCAzLCAxIH07CisgICAgLyogaW5kZXhlcyBvZiB3b3JkcyA6IDIxMCwyMTcsMjE5LDI3NCwzMzQgIDQ0LDE3NSwyMzMsMjcwLDI3MyAgNTcsNzAsMTAzLDIzNywyNjkgIDEwMCwyODUsMjk1LDMzNywzNTQgIDEwMSwxMDIsMTExLDI3NSwyOTYKKyAgICBzMnVzdyA9IHNvcnRlZCB0byB1bnNvcnRlZCB3b3JkdmVjOiA0NCBpcyBhdCBpbmRleCA1LCA1NyBhdCBpbmRleCAxMC4uLgorICAgICovCisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB3b3JkdmVjWzI1XSA9IHs0NCw1Nyw3MCwxMDAsMTAxLDEwMiwxMDMsMTExLDE3NSwyMTAsMjE3LDIxOSwyMzMsMjM3LDI2OSwyNzAsMjczLDI3NCwyNzUsMjg1LDI5NSwyOTYsMzM0LDMzNywzNTR9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICAgICAgczJ1c3dbMjVdICAgPSB7IDUsMTAsMTEsIDE1LCAyMCwgMjEsIDEyLCAyMiwgIDYsICAwLCAgMSwgIDIsICA3LCAxMywgMTQsICA4LCAgOSwgIDMsIDIzLCAxNiwgMTcsIDI0LCAgNCwgMTgsIDE5fTsKKworICAgIHVpbnQ4X3Qgd29yZHQyYls1XSA9IHsgMCwgMCwgMCwgMCwgMCB9OyAvKiB3b3JkIHRlcm5hcnkgdG8gYmluYXJ5ICovCisgICAgdWludDY0X3QgaW50cGljWzMyXVszMl07CisgICAgdWludDY0X3Qgcm93Y291bnQ7CisgICAgdWludDhfdCAqcCA9IHBpY3JlZi0+ZGF0YVswXTsKKyAgICBpbnQgaW50aSwgaW50ajsKKyAgICBpbnQgKmludGpsdXQ7CisKKyAgICB1aW50NjRfdCBjb25mbGlzdFtESUZGRUxFTV9TSVpFXTsKKyAgICBpbnQgZiA9IDAsIGcgPSAwLCB3ID0gMDsKKyAgICBpbnQzMl90IGRoMSA9IDEsIGRoMiA9IDEsIGR3MSA9IDEsIGR3MiA9IDEsIGEsIGI7CisgICAgaW50NjRfdCBkZW5vbTsKKyAgICBpbnQgaSwgaiwgaywgdGVybmFyeTsKKyAgICB1aW50NjRfdCBibG9ja3N1bTsKKyAgICBpbnQgYmxvY2tzaXplOworICAgIGludDY0X3QgdGg7IC8qIHRocmVzaG9sZCAqLworICAgIGludDY0X3Qgc3VtOworCisgICAgaW50NjRfdCBwcmVjZmFjdG9yID0gKHNjLT5kaXZpZGUpID8gNjU1MzYgOiBCTE9DS19MQ007CisKKyAgICAvKiBpbml0aWFsaXplIGZzICovCisgICAgaWYgKHNjLT5jdXJmaW5lc2lnKSB7CisgICAgICAgIGZzID0gYXZfbWFsbG9jeihzaXplb2YoRmluZVNpZ25hdHVyZSkpOworICAgICAgICBpZiAoIWZzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgc2MtPmN1cmZpbmVzaWctPm5leHQgPSBmczsKKyAgICAgICAgZnMtPnByZXYgPSBzYy0+Y3VyZmluZXNpZzsKKyAgICAgICAgc2MtPmN1cmZpbmVzaWcgPSBmczsKKyAgICB9IGVsc2UgeworICAgICAgICBmcyA9IHNjLT5jdXJmaW5lc2lnID0gc2MtPmZpbmVzaWdsaXN0OworICAgICAgICBzYy0+Y3VyY29hcnNlc2lnMS0+Zmlyc3QgPSBmczsKKyAgICB9CisKKyAgICBmcy0+cHRzID0gcGljcmVmLT5wdHM7CisgICAgZnMtPmluZGV4ID0gc2MtPmxhc3RpbmRleCsrOworCisgICAgbWVtc2V0KGludHBpYywgMCwgc2l6ZW9mKHVpbnQ2NF90KSozMiozMik7CisgICAgaW50amx1dCA9IGF2X21hbGxvY19hcnJheShpbmxpbmstPncsIHNpemVvZihpbnQpKTsKKyAgICBpZiAoIWludGpsdXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZm9yIChpID0gMDsgaSA8IGlubGluay0+dzsgaSsrKSB7CisgICAgICAgIGludGpsdXRbaV0gPSAoaSozMikvaW5saW5rLT53OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBpbmxpbmstPmg7IGkrKykgeworICAgICAgICBpbnRpID0gKGkqMzIpL2lubGluay0+aDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGlubGluay0+dzsgaisrKSB7CisgICAgICAgICAgICBpbnRqID0gaW50amx1dFtqXTsKKyAgICAgICAgICAgIGludHBpY1tpbnRpXVtpbnRqXSArPSBwW2pdOworICAgICAgICB9CisgICAgICAgIHAgKz0gcGljcmVmLT5saW5lc2l6ZVswXTsKKyAgICB9CisgICAgYXZfZnJlZXAoJmludGpsdXQpOworCisgICAgLyogVGhlIGZvbGxvd2luZyBjYWxjdWxhdGVzIGEgc3VtbWVkIGFyZWEgdGFibGUgKGludHBpYykgYW5kIGJyaW5ncyB0aGUgbnVtYmVycworICAgICAqIGluIGludHBpYyB0byB0aGUgc2FtZSBkZW5vbWluYXRvci4KKyAgICAgKiBTbyB5b3Ugb25seSBoYXZlIHRvIGhhbmRsZSB0aGUgbnVtaW5hdG9yIGluIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMuCisgICAgICovCisgICAgZGgxID0gaW5saW5rLT5oIC8gMzI7CisgICAgaWYgKGlubGluay0+aCAlIDMyKQorICAgICAgICBkaDIgPSBkaDEgKyAxOworICAgIGR3MSA9IGlubGluay0+dyAvIDMyOworICAgIGlmIChpbmxpbmstPncgJSAzMikKKyAgICAgICAgZHcyID0gZHcxICsgMTsKKyAgICBkZW5vbSA9IChzYy0+ZGl2aWRlKSA/IGRoMSAqIGRoMiAqIGR3MSAqIGR3MiA6IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICByb3djb3VudCA9IDA7CisgICAgICAgIGEgPSAxOworICAgICAgICBpZiAoZGgyID4gMSkgeworICAgICAgICAgICAgYSA9ICgoaW5saW5rLT5oKihpKzEpKSUzMiA9PSAwKSA/IChpbmxpbmstPmgqKGkrMSkpLzMyIC0gMSA6IChpbmxpbmstPmgqKGkrMSkpLzMyOworICAgICAgICAgICAgYSAtPSAoKGlubGluay0+aCppKSUzMiA9PSAwKSA/IChpbmxpbmstPmgqaSkvMzIgLSAxIDogKGlubGluay0+aCppKS8zMjsKKyAgICAgICAgICAgIGEgPSAoYSA9PSBkaDEpPyBkaDIgOiBkaDE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKKyAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgaWYgKGR3MiA+IDEpIHsKKyAgICAgICAgICAgICAgICBiID0gKChpbmxpbmstPncqKGorMSkpJTMyID09IDApID8gKGlubGluay0+dyooaisxKSkvMzIgLSAxIDogKGlubGluay0+dyooaisxKSkvMzI7CisgICAgICAgICAgICAgICAgYiAtPSAoKGlubGluay0+dypqKSUzMiA9PSAwKSA/IChpbmxpbmstPncqaikvMzIgLSAxIDogKGlubGluay0+dypqKS8zMjsKKyAgICAgICAgICAgICAgICBiID0gKGIgPT0gZHcxKT8gZHcyIDogZHcxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93Y291bnQgKz0gaW50cGljW2ldW2pdICogYSAqIGIgKiBwcmVjZmFjdG9yIC8gZGVub207CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnRwaWNbaV1bal0gPSBpbnRwaWNbaS0xXVtqXSArIHJvd2NvdW50OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnRwaWNbaV1bal0gPSByb3djb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRlbm9tID0gKHNjLT5kaXZpZGUpID8gMSA6IGRoMSAqIGRoMiAqIGR3MSAqIGR3MjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBFTEVNRU5UX0NPVU5UOyBpKyspIHsKKyAgICAgICAgY29uc3QgRWxlbUNhdCogZWxlbWNhdCA9IGVsZW1lbnRzW2ldOworICAgICAgICBpbnQ2NF90KiBlbGVtc2lnbmF0dXJlOworICAgICAgICB1aW50NjRfdCogc29ydHNpZ25hdHVyZTsKKworICAgICAgICBlbGVtc2lnbmF0dXJlID0gYXZfbWFsbG9jX2FycmF5KGVsZW1jYXQtPmVsZW1fY291bnQsIHNpemVvZihpbnQ2NF90KSk7CisgICAgICAgIGlmICghZWxlbXNpZ25hdHVyZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHNvcnRzaWduYXR1cmUgPSBhdl9tYWxsb2NfYXJyYXkoZWxlbWNhdC0+ZWxlbV9jb3VudCwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgaWYgKCFzb3J0c2lnbmF0dXJlKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmZWxlbXNpZ25hdHVyZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGVsZW1jYXQtPmVsZW1fY291bnQ7IGorKykgeworICAgICAgICAgICAgYmxvY2tzdW0gPSAwOworICAgICAgICAgICAgYmxvY2tzaXplID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBlbGVtY2F0LT5sZWZ0X2NvdW50OyBrKyspIHsKKyAgICAgICAgICAgICAgICBibG9ja3N1bSArPSBnZXRfYmxvY2tfc3VtKHNjLCBpbnRwaWMsICZlbGVtY2F0LT5ibG9ja3NbaiplbGVtY2F0LT5ibG9ja19jb3VudCtrXSk7CisgICAgICAgICAgICAgICAgYmxvY2tzaXplICs9IGdldF9ibG9ja19zaXplKCZlbGVtY2F0LT5ibG9ja3NbaiplbGVtY2F0LT5ibG9ja19jb3VudCtrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdW0gPSBibG9ja3N1bSAvIGJsb2Nrc2l6ZTsKKyAgICAgICAgICAgIGlmIChlbGVtY2F0LT5hdl9lbGVtKSB7CisgICAgICAgICAgICAgICAgc3VtIC09IDEyOCAqIHByZWNmYWN0b3IgKiBkZW5vbTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmxvY2tzdW0gPSAwOworICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yICg7IGsgPCBlbGVtY2F0LT5ibG9ja19jb3VudDsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsb2Nrc3VtICs9IGdldF9ibG9ja19zdW0oc2MsIGludHBpYywgJmVsZW1jYXQtPmJsb2Nrc1tqKmVsZW1jYXQtPmJsb2NrX2NvdW50K2tdKTsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplICs9IGdldF9ibG9ja19zaXplKCZlbGVtY2F0LT5ibG9ja3NbaiplbGVtY2F0LT5ibG9ja19jb3VudCtrXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1bSAtPSBibG9ja3N1bSAvIGJsb2Nrc2l6ZTsKKyAgICAgICAgICAgICAgICBjb25mbGlzdFtnKytdID0gRkZBQlMoc3VtICogOCAvIChwcmVjZmFjdG9yICogZGVub20pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZWxlbXNpZ25hdHVyZVtqXSA9IHN1bTsKKyAgICAgICAgICAgIHNvcnRzaWduYXR1cmVbal0gPSBGRkFCUyhzdW0pOworICAgICAgICB9CisKKyAgICAgICAgLyogZ2V0IHRocmVzaG9sZCAqLworICAgICAgICBxc29ydChzb3J0c2lnbmF0dXJlLCBlbGVtY2F0LT5lbGVtX2NvdW50LCBzaXplb2YodWludDY0X3QpLCAodm9pZCopIGNtcCk7CisgICAgICAgIHRoID0gc29ydHNpZ25hdHVyZVsoaW50KSAoZWxlbWNhdC0+ZWxlbV9jb3VudCowLjMzMyldOworCisgICAgICAgIC8qIHRlcm5hcml6ZSAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgZWxlbWNhdC0+ZWxlbV9jb3VudDsgaisrKSB7CisgICAgICAgICAgICBpZiAoZWxlbXNpZ25hdHVyZVtqXSA8IC10aCkgeworICAgICAgICAgICAgICAgIHRlcm5hcnkgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtc2lnbmF0dXJlW2pdIDw9IHRoKSB7CisgICAgICAgICAgICAgICAgdGVybmFyeSA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlcm5hcnkgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnMtPmZyYW1lc2lnW2YvNV0gKz0gdGVybmFyeSAqIHBvdDNbZiU1XTsKKworICAgICAgICAgICAgaWYgKGYgPT0gd29yZHZlY1t3XSkgeworICAgICAgICAgICAgICAgIGZzLT53b3Jkc1tzMnVzd1t3XS81XSArPSB0ZXJuYXJ5ICogcG90M1t3b3JkdDJiW3MydXN3W3ddLzVdKytdOworICAgICAgICAgICAgICAgIGlmICh3IDwgMjQpCisgICAgICAgICAgICAgICAgICAgIHcrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGYrKzsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmZWxlbXNpZ25hdHVyZSk7CisgICAgICAgIGF2X2ZyZWVwKCZzb3J0c2lnbmF0dXJlKTsKKyAgICB9CisKKyAgICAvKiBjb25maWRlbmNlICovCisgICAgcXNvcnQoY29uZmxpc3QsIERJRkZFTEVNX1NJWkUsIHNpemVvZih1aW50NjRfdCksICh2b2lkKikgY21wKTsKKyAgICBmcy0+Y29uZmlkZW5jZSA9IEZGTUlOKGNvbmZsaXN0W0RJRkZFTEVNX1NJWkUvMl0sIDI1NSk7CisKKyAgICAvKiBjb2Fyc2VzaWduYXR1cmUgKi8KKyAgICBpZiAoc2MtPmNvYXJzZWNvdW50ID09IDApIHsKKyAgICAgICAgaWYgKHNjLT5jdXJjb2Fyc2VzaWcyKSB7CisgICAgICAgICAgICBzYy0+Y3VyY29hcnNlc2lnMSA9IGF2X21hbGxvY3ooc2l6ZW9mKENvYXJzZVNpZ25hdHVyZSkpOworICAgICAgICAgICAgaWYgKCFzYy0+Y3VyY29hcnNlc2lnMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgc2MtPmN1cmNvYXJzZXNpZzEtPmZpcnN0ID0gZnM7CisgICAgICAgICAgICBzYy0+Y3VyY29hcnNlc2lnMi0+bmV4dCA9IHNjLT5jdXJjb2Fyc2VzaWcxOworICAgICAgICAgICAgc2MtPmNvYXJzZWVuZCA9IHNjLT5jdXJjb2Fyc2VzaWcxOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzYy0+Y29hcnNlY291bnQgPT0gNDUpIHsKKyAgICAgICAgc2MtPm1pZGNvYXJzZSA9IDE7CisgICAgICAgIHNjLT5jdXJjb2Fyc2VzaWcyID0gYXZfbWFsbG9jeihzaXplb2YoQ29hcnNlU2lnbmF0dXJlKSk7CisgICAgICAgIGlmICghc2MtPmN1cmNvYXJzZXNpZzIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzYy0+Y3VyY29hcnNlc2lnMi0+Zmlyc3QgPSBmczsKKyAgICAgICAgc2MtPmN1cmNvYXJzZXNpZzEtPm5leHQgPSBzYy0+Y3VyY29hcnNlc2lnMjsKKyAgICAgICAgc2MtPmNvYXJzZWVuZCA9IHNjLT5jdXJjb2Fyc2VzaWcyOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIHNldF9iaXQoc2MtPmN1cmNvYXJzZXNpZzEtPmRhdGFbaV0sIGZzLT53b3Jkc1tpXSk7CisgICAgfQorICAgIC8qIGFzc3VtaW5nIHRoZSBhY3R1YWwgZnJhbWUgaXMgdGhlIGxhc3QgKi8KKyAgICBzYy0+Y3VyY29hcnNlc2lnMS0+bGFzdCA9IGZzOworICAgIGlmIChzYy0+bWlkY29hcnNlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIHNldF9iaXQoc2MtPmN1cmNvYXJzZXNpZzItPmRhdGFbaV0sIGZzLT53b3Jkc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgc2MtPmN1cmNvYXJzZXNpZzItPmxhc3QgPSBmczsKKyAgICB9CisKKyAgICBzYy0+Y29hcnNlY291bnQgPSAoc2MtPmNvYXJzZWNvdW50KzEpJTkwOworCisgICAgLyogZGVidWcgcHJpbnRpbmcgZmluZXNpZ25hdHVyZSAqLworICAgIGlmIChhdl9sb2dfZ2V0X2xldmVsKCkgPT0gQVZfTE9HX0RFQlVHKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgImlucHV0ICVkLCBjb25maWRlbmNlOiAlZFxuIiwgRkZfSU5MSU5LX0lEWChpbmxpbmspLCBmcy0+Y29uZmlkZW5jZSk7CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAid29yZHM6Iik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiAlZDoiLCBmcy0+d29yZHNbaV0gKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiAlZCIsIGZzLT53b3Jkc1tpXSAvIHBvdDNbMF0gKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCA1OyBqKyspCisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiLCVkIiwgZnMtPndvcmRzW2ldICUgcG90M1tqLTFdIC8gcG90M1tqXSApOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiOyIpOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlxuIik7CisKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0RFQlVHLCAiZnJhbWVzaWduYXR1cmU6Iik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTSUdFTEVNX1NJWkUvNTsgaSsrKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICIgJWQiLCBmcy0+ZnJhbWVzaWdbaV0gLyBwb3QzWzBdICk7CisgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDwgNTsgaisrKQorICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIiwlZCIsIGZzLT5mcmFtZXNpZ1tpXSAlIHBvdDNbai0xXSAvIHBvdDNbal0gKTsKKyAgICAgICAgfQorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgIH0KKworICAgIGlmIChGRl9JTkxJTktfSURYKGlubGluaykgPT0gMCkKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShpbmxpbmstPmRzdC0+b3V0cHV0c1swXSwgcGljcmVmKTsKKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB4bWxfZXhwb3J0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBTdHJlYW1Db250ZXh0ICpzYywgY29uc3QgY2hhciogZmlsZW5hbWUpCit7CisgICAgRmluZVNpZ25hdHVyZSogZnM7CisgICAgQ29hcnNlU2lnbmF0dXJlKiBjczsKKyAgICBpbnQgaSwgajsKKyAgICBGSUxFKiBmOworICAgIHVuc2lnbmVkIGludCBwb3QzWzVdID0geyAzKjMqMyozLCAzKjMqMywgMyozLCAzLCAxIH07CisKKyAgICBmID0gZm9wZW4oZmlsZW5hbWUsICJ3Iik7CisgICAgaWYgKCFmKSB7CisgICAgICAgIGludCBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgIGF2X3N0cmVycm9yKGVyciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBvcGVuIHhtbCBmaWxlICVzOiAlc1xuIiwgZmlsZW5hbWUsIGJ1Zik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLyogaGVhZGVyICovCisgICAgZnByaW50ZihmLCAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nQVNDSUknID8+XG4iKTsKKyAgICBmcHJpbnRmKGYsICI8TXBlZzcgeG1sbnM9XCJ1cm46bXBlZzptcGVnNzpzY2hlbWE6MjAwMVwiIHhtbG5zOnhzaT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlXCIgeHNpOnNjaGVtYUxvY2F0aW9uPVwidXJuOm1wZWc6bXBlZzc6c2NoZW1hOjIwMDEgc2NoZW1hL01wZWc3LTIwMDEueHNkXCI+XG4iKTsKKyAgICBmcHJpbnRmKGYsICIgIDxEZXNjcmlwdGlvblVuaXQgeHNpOnR5cGU9XCJEZXNjcmlwdG9yQ29sbGVjdGlvblR5cGVcIj5cbiIpOworICAgIGZwcmludGYoZiwgIiAgICA8RGVzY3JpcHRvciB4c2k6dHlwZT1cIlZpZGVvU2lnbmF0dXJlVHlwZVwiPlxuIik7CisgICAgZnByaW50ZihmLCAiICAgICAgPFZpZGVvU2lnbmF0dXJlUmVnaW9uPlxuIik7CisgICAgZnByaW50ZihmLCAiICAgICAgICA8VmlkZW9TaWduYXR1cmVTcGF0aWFsUmVnaW9uPlxuIik7CisgICAgZnByaW50ZihmLCAiICAgICAgICAgIDxQaXhlbD4wIDAgPC9QaXhlbD5cbiIpOworICAgIGZwcmludGYoZiwgIiAgICAgICAgICA8UGl4ZWw+JWQgJWQgPC9QaXhlbD5cbiIsIHNjLT53IC0gMSwgc2MtPmggLSAxKTsKKyAgICBmcHJpbnRmKGYsICIgICAgICAgIDwvVmlkZW9TaWduYXR1cmVTcGF0aWFsUmVnaW9uPlxuIik7CisgICAgZnByaW50ZihmLCAiICAgICAgICA8U3RhcnRGcmFtZU9mU3BhdGlhbFJlZ2lvbj4wPC9TdGFydEZyYW1lT2ZTcGF0aWFsUmVnaW9uPlxuIik7CisgICAgLyogaG9waW5nIG51bSBpcyAxLCBvdGhlciB2YWx1ZXMgYXJlIHZhZ3VlICovCisgICAgZnByaW50ZihmLCAiICAgICAgICA8TWVkaWFUaW1lVW5pdD4lZDwvTWVkaWFUaW1lVW5pdD5cbiIsIHNjLT50aW1lX2Jhc2UuZGVuIC8gc2MtPnRpbWVfYmFzZS5udW0pOworICAgIGZwcmludGYoZiwgIiAgICAgICAgPE1lZGlhVGltZU9mU3BhdGlhbFJlZ2lvbj5cbiIpOworICAgIGZwcmludGYoZiwgIiAgICAgICAgICA8U3RhcnRNZWRpYVRpbWVPZlNwYXRpYWxSZWdpb24+MDwvU3RhcnRNZWRpYVRpbWVPZlNwYXRpYWxSZWdpb24+XG4iKTsKKyAgICBmcHJpbnRmKGYsICIgICAgICAgICAgPEVuZE1lZGlhVGltZU9mU3BhdGlhbFJlZ2lvbj4lIiBQUkl1NjQgIjwvRW5kTWVkaWFUaW1lT2ZTcGF0aWFsUmVnaW9uPlxuIiwgc2MtPmNvYXJzZWVuZC0+bGFzdC0+cHRzKTsKKyAgICBmcHJpbnRmKGYsICIgICAgICAgIDwvTWVkaWFUaW1lT2ZTcGF0aWFsUmVnaW9uPlxuIik7CisKKyAgICAvKiBjb2Fyc2VzaWduYXR1cmVzICovCisgICAgZm9yIChjcyA9IHNjLT5jb2Fyc2VzaWdsaXN0OyBjczsgY3MgPSBjcy0+bmV4dCkgeworICAgICAgICBmcHJpbnRmKGYsICIgICAgICAgIDxWU1ZpZGVvU2VnbWVudD5cbiIpOworICAgICAgICBmcHJpbnRmKGYsICIgICAgICAgICAgPFN0YXJ0RnJhbWVPZlNlZ21lbnQ+JSIgUFJJdTMyICI8L1N0YXJ0RnJhbWVPZlNlZ21lbnQ+XG4iLCBjcy0+Zmlyc3QtPmluZGV4KTsKKyAgICAgICAgZnByaW50ZihmLCAiICAgICAgICAgIDxFbmRGcmFtZU9mU2VnbWVudD4lIiBQUkl1MzIgIjwvRW5kRnJhbWVPZlNlZ21lbnQ+XG4iLCBjcy0+bGFzdC0+aW5kZXgpOworICAgICAgICBmcHJpbnRmKGYsICIgICAgICAgICAgPE1lZGlhVGltZU9mU2VnbWVudD5cbiIpOworICAgICAgICBmcHJpbnRmKGYsICIgICAgICAgICAgICA8U3RhcnRNZWRpYVRpbWVPZlNlZ21lbnQ+JSIgUFJJdTY0ICI8L1N0YXJ0TWVkaWFUaW1lT2ZTZWdtZW50PlxuIiwgY3MtPmZpcnN0LT5wdHMpOworICAgICAgICBmcHJpbnRmKGYsICIgICAgICAgICAgICA8RW5kTWVkaWFUaW1lT2ZTZWdtZW50PiUiIFBSSXU2NCAiPC9FbmRNZWRpYVRpbWVPZlNlZ21lbnQ+XG4iLCBjcy0+bGFzdC0+cHRzKTsKKyAgICAgICAgZnByaW50ZihmLCAiICAgICAgICAgIDwvTWVkaWFUaW1lT2ZTZWdtZW50PlxuIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIGZwcmludGYoZiwgIiAgICAgICAgICA8QmFnT2ZXb3Jkcz4iKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMTsgaisrKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBuID0gY3MtPmRhdGFbaV1bal07CisgICAgICAgICAgICAgICAgaWYgKGogPCAzMCkgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlZCAgJWQgICVkICAlZCAgJWQgICVkICAlZCAgJWQgICIsIChuICYgMHg4MCkgPj4gNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiAmIDB4NDApID4+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gJiAweDIwKSA+PiA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuICYgMHgxMCkgPj4gNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiAmIDB4MDgpID4+IDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gJiAweDA0KSA+PiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuICYgMHgwMikgPj4gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiAmIDB4MDEpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBwcmludCBvbmx5IDMgYml0IGluIGxhc3QgYnl0ZSAqLworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlZCAgJWQgICVkICIsIChuICYgMHg4MCkgPj4gNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobiAmIDB4NDApID4+IDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG4gJiAweDIwKSA+PiA1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcHJpbnRmKGYsICI8L0JhZ09mV29yZHM+XG4iKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGYsICIgICAgICAgIDwvVlNWaWRlb1NlZ21lbnQ+XG4iKTsKKyAgICB9CisKKyAgICAvKiBmaW5lc2lnbmF0dXJlcyAqLworICAgIGZvciAoZnMgPSBzYy0+ZmluZXNpZ2xpc3Q7IGZzOyBmcyA9IGZzLT5uZXh0KSB7CisgICAgICAgIGZwcmludGYoZiwgIiAgICAgICAgPFZpZGVvRnJhbWU+XG4iKTsKKyAgICAgICAgZnByaW50ZihmLCAiICAgICAgICAgIDxNZWRpYVRpbWVPZkZyYW1lPiUiIFBSSXU2NCAiPC9NZWRpYVRpbWVPZkZyYW1lPlxuIiwgZnMtPnB0cyk7CisgICAgICAgIC8qIGNvbmZpZGVuY2UgKi8KKyAgICAgICAgZnByaW50ZihmLCAiICAgICAgICAgIDxGcmFtZUNvbmZpZGVuY2U+JWQ8L0ZyYW1lQ29uZmlkZW5jZT5cbiIsIGZzLT5jb25maWRlbmNlKTsKKyAgICAgICAgLyogd29yZHMgKi8KKyAgICAgICAgZnByaW50ZihmLCAiICAgICAgICAgIDxXb3JkPiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBmcHJpbnRmKGYsICIlZCAiLCBmcy0+d29yZHNbaV0pOworICAgICAgICAgICAgaWYgKGkgPCA0KSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZwcmludGYoZiwgIjwvV29yZD5cbiIpOworICAgICAgICAvKiBmcmFtZXNpZ25hdHVyZSAqLworICAgICAgICBmcHJpbnRmKGYsICIgICAgICAgICAgPEZyYW1lU2lnbmF0dXJlPiIpOworICAgICAgICBmb3IgKGkgPSAwOyBpPCBTSUdFTEVNX1NJWkUvNTsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcHJpbnRmKGYsICIlZCAiLCBmcy0+ZnJhbWVzaWdbaV0gLyBwb3QzWzBdKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPCA1OyBqKyspCisgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiICVkICIsIGZzLT5mcmFtZXNpZ1tpXSAlIHBvdDNbai0xXSAvIHBvdDNbal0gKTsKKyAgICAgICAgfQorICAgICAgICBmcHJpbnRmKGYsICI8L0ZyYW1lU2lnbmF0dXJlPlxuIik7CisgICAgICAgIGZwcmludGYoZiwgIiAgICAgICAgPC9WaWRlb0ZyYW1lPlxuIik7CisgICAgfQorICAgIGZwcmludGYoZiwgIiAgICAgIDwvVmlkZW9TaWduYXR1cmVSZWdpb24+XG4iKTsKKyAgICBmcHJpbnRmKGYsICIgICAgPC9EZXNjcmlwdG9yPlxuIik7CisgICAgZnByaW50ZihmLCAiICA8L0Rlc2NyaXB0aW9uVW5pdD5cbiIpOworICAgIGZwcmludGYoZiwgIjwvTXBlZzc+XG4iKTsKKworICAgIGZjbG9zZShmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBiaW5hcnlfZXhwb3J0KEFWRmlsdGVyQ29udGV4dCAqY3R4LCBTdHJlYW1Db250ZXh0ICpzYywgY29uc3QgY2hhciogZmlsZW5hbWUpCit7CisgICAgRklMRSogZjsKKyAgICBGaW5lU2lnbmF0dXJlKiBmczsKKyAgICBDb2Fyc2VTaWduYXR1cmUqIGNzOworICAgIHVpbnQzMl90IG51bW9mc2VnbWVudHMgPSAoc2MtPmxhc3RpbmRleCArIDQ0KS80NTsKKyAgICBpbnQgaSwgajsKKyAgICBQdXRCaXRDb250ZXh0IGJ1ZjsKKyAgICAvKiBidWZmZXIgKyBoZWFkZXIgKyBjb2Fyc2VzaWduYXR1cmVzICsgZmluZXNpZ25hdHVyZSAqLworICAgIGludCBsZW4gPSAoNTEyICsgNiAqIDMyICsgMyoxNiArIDIgKworICAgICAgICBudW1vZnNlZ21lbnRzICogKDQqMzIgKyAxICsgNSoyNDMpICsKKyAgICAgICAgc2MtPmxhc3RpbmRleCAqICgyICsgMzIgKyA2KjggKyA2MDgpKSAvIDg7CisgICAgdWludDhfdCogYnVmZmVyID0gYXZfbWFsbG9jX2FycmF5KGxlbiwgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGYgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgICAgaWYgKCFmKSB7CisgICAgICAgIGludCBlcnIgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGNoYXIgYnVmWzEyOF07CisgICAgICAgIGF2X3N0cmVycm9yKGVyciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImNhbm5vdCBvcGVuIGZpbGUgJXM6ICVzXG4iLCBmaWxlbmFtZSwgYnVmKTsKKyAgICAgICAgYXZfZnJlZXAoJmJ1ZmZlcik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGluaXRfcHV0X2JpdHMoJmJ1ZiwgYnVmZmVyLCBsZW4pOworCisgICAgcHV0X2JpdHMzMigmYnVmLCAxKTsgLyogTnVtT2ZTcGF0aWFsIFJlZ2lvbnMsIG9ubHkgMSBzdXBwb3J0ZWQgKi8KKyAgICBwdXRfYml0cygmYnVmLCAxLCAxKTsgLyogU3BhdGlhbExvY2F0aW9uRmxhZywgYWx3YXlzIHRoZSB3aG9sZSBpbWFnZSAqLworICAgIHB1dF9iaXRzMzIoJmJ1ZiwgMCk7IC8qIFBpeGVsWCwxIFBpeGVsWSwxLCAwLDAgKi8KKyAgICBwdXRfYml0cygmYnVmLCAxNiwgc2MtPnctMSAmIDB4RkZGRik7IC8qIFBpeGVsWCwyICovCisgICAgcHV0X2JpdHMoJmJ1ZiwgMTYsIHNjLT5oLTEgJiAweEZGRkYpOyAvKiBQaXhlbFksMiAqLworICAgIHB1dF9iaXRzMzIoJmJ1ZiwgMCk7IC8qIFN0YXJ0RnJhbWVPZlNwYXRpYWxSZWdpb24gKi8KKyAgICBwdXRfYml0czMyKCZidWYsIHNjLT5sYXN0aW5kZXgpOyAvKiBOdW1PZkZyYW1lcyAqLworICAgIC8qIGhvcGluZyBudW0gaXMgMSwgb3RoZXIgdmFsdWVzIGFyZSB2YWd1ZSAqLworICAgIC8qIGRlbi9udW0gbWlnaHQgYmUgZ3JlYXRlciB0aGFuIDE2IGJpdCwgc28gY3V0dGluZyBpdCAqLworICAgIHB1dF9iaXRzKCZidWYsIDE2LCAweEZGRkYgJiAoc2MtPnRpbWVfYmFzZS5kZW4gLyBzYy0+dGltZV9iYXNlLm51bSkpOyAvKiBNZWRpYVRpbWVVbml0ICovCisgICAgcHV0X2JpdHMoJmJ1ZiwgMSwgMSk7IC8qIE1lZGlhVGltZUZsYWdPZlNwYXRpYWxSZWdpb24gKi8KKyAgICBwdXRfYml0czMyKCZidWYsIDApOyAvKiBTdGFydE1lZGlhVGltZU9mU3BhdGlhbFJlZ2lvbiAqLworICAgIHB1dF9iaXRzMzIoJmJ1ZiwgMHhGRkZGRkZGRiAmIHNjLT5jb2Fyc2VlbmQtPmxhc3QtPnB0cyk7IC8qIEVuZE1lZGlhVGltZU9mU3BhdGlhbFJlZ2lvbiAqLworICAgIHB1dF9iaXRzMzIoJmJ1ZiwgbnVtb2ZzZWdtZW50cyk7IC8qIE51bU9mU2VnbWVudHMgKi8KKyAgICAvKiBjb2Fyc2VzaWduYXR1cmVzICovCisgICAgZm9yIChjcyA9IHNjLT5jb2Fyc2VzaWdsaXN0OyBjczsgY3MgPSBjcy0+bmV4dCkgeworICAgICAgICBwdXRfYml0czMyKCZidWYsIGNzLT5maXJzdC0+aW5kZXgpOyAvKiBTdGFydEZyYW1lT2ZTZWdtZW50ICovCisgICAgICAgIHB1dF9iaXRzMzIoJmJ1ZiwgY3MtPmxhc3QtPmluZGV4KTsgLyogRW5kRnJhbWVPZlNlZ21lbnQgKi8KKyAgICAgICAgcHV0X2JpdHMoJmJ1ZiwgMSwgMSk7IC8qIE1lZGlhVGltZUZsYWdPZlNlZ21lbnQgKi8KKyAgICAgICAgcHV0X2JpdHMzMigmYnVmLCAweEZGRkZGRkZGICYgY3MtPmZpcnN0LT5wdHMpOyAvKiBTdGFydE1lZGlhVGltZU9mU2VnbWVudCAqLworICAgICAgICBwdXRfYml0czMyKCZidWYsIDB4RkZGRkZGRkYgJiBjcy0+bGFzdC0+cHRzKTsgLyogRW5kTWVkaWFUaW1lT2ZTZWdtZW50ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIC8qIHB1dCAyNDMgYml0cyAoID0gNyAqIDMyICsgMTkgPSA4ICogMjggKyAxOSkgaW50byBidWZmZXIgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAzMDsgaisrKSB7CisgICAgICAgICAgICAgICAgcHV0X2JpdHMoJmJ1ZiwgOCwgY3MtPmRhdGFbaV1bal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHV0X2JpdHMoJmJ1ZiwgMywgY3MtPmRhdGFbaV1bMzBdID4+IDUpOworICAgICAgICB9CisgICAgfQorICAgIC8qIGZpbmVzaWduYXR1cmVzICovCisgICAgcHV0X2JpdHMoJmJ1ZiwgMSwgMCk7IC8qIENvbXByZXNzaW9uRmxhZywgb25seSAwIHN1cHBvcnRlZCAqLworICAgIGZvciAoZnMgPSBzYy0+ZmluZXNpZ2xpc3Q7IGZzOyBmcyA9IGZzLT5uZXh0KSB7CisgICAgICAgIHB1dF9iaXRzKCZidWYsIDEsIDEpOyAvKiBNZWRpYVRpbWVGbGFnT2ZGcmFtZSAqLworICAgICAgICBwdXRfYml0czMyKCZidWYsIDB4RkZGRkZGRkYgJiBmcy0+cHRzKTsgLyogTWVkaWFUaW1lT2ZGcmFtZSAqLworICAgICAgICBwdXRfYml0cygmYnVmLCA4LCBmcy0+Y29uZmlkZW5jZSk7IC8qIEZyYW1lQ29uZmlkZW5jZSAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBwdXRfYml0cygmYnVmLCA4LCBmcy0+d29yZHNbaV0pOyAvKiBXb3JkcyAqLworICAgICAgICB9CisgICAgICAgIC8qIGZyYW1lc2lnbmF0dXJlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBTSUdFTEVNX1NJWkUvNTsgaSsrKSB7CisgICAgICAgICAgICBwdXRfYml0cygmYnVmLCA4LCBmcy0+ZnJhbWVzaWdbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgYXZwcml2X2FsaWduX3B1dF9iaXRzKCZidWYpOworICAgIGZsdXNoX3B1dF9iaXRzKCZidWYpOworICAgIGZ3cml0ZShidWZmZXIsIDEsIHB1dF9iaXRzX2NvdW50KCZidWYpLzgsIGYpOworICAgIGZjbG9zZShmKTsKKyAgICBhdl9mcmVlcCgmYnVmZmVyKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBleHBvcnQoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIFN0cmVhbUNvbnRleHQgKnNjLCBpbnQgaW5wdXQpCit7CisgICAgU2lnbmF0dXJlQ29udGV4dCogc2ljID0gY3R4LT5wcml2OworICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07CisKKyAgICBpZiAoc2ljLT5uYl9pbnB1dHMgPiAxKSB7CisgICAgICAgIC8qIGVycm9yIGFscmVhZHkgaGFuZGxlZCAqLworICAgICAgICBhdl9hc3NlcnQwKGF2X2dldF9mcmFtZV9maWxlbmFtZShmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgc2ljLT5maWxlbmFtZSwgaW5wdXQpID09IDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhdl9zdHJsY3B5KGZpbGVuYW1lLCBzaWMtPmZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpKSA+PSBzaXplb2YoZmlsZW5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKHNpYy0+Zm9ybWF0ID09IEZPUk1BVF9YTUwpIHsKKyAgICAgICAgcmV0dXJuIHhtbF9leHBvcnQoY3R4LCBzYywgZmlsZW5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBiaW5hcnlfZXhwb3J0KGN0eCwgc2MsIGZpbGVuYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgU2lnbmF0dXJlQ29udGV4dCAqc2ljID0gY3R4LT5wcml2OworICAgIFN0cmVhbUNvbnRleHQgKnNjLCAqc2MyOworICAgIE1hdGNoaW5nSW5mbyBtYXRjaDsKKyAgICBpbnQgaSwgaiwgcmV0OworICAgIGludCBsb29rdXAgPSAxOyAvKiBpbmRpY2F0ZXMgd2hlYXRoZXIgRU9GIG9mIGFsbCBmaWxlcyBpcyByZWFjaGVkICovCisKKyAgICAvKiBwcm9jZXNzIGFsbCBpbnB1dHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2ljLT5uYl9pbnB1dHM7IGkrKyl7CisgICAgICAgIHNjID0gJihzaWMtPnN0cmVhbWNvbnRleHRzW2ldKTsKKworICAgICAgICByZXQgPSBmZl9yZXF1ZXN0X2ZyYW1lKGN0eC0+aW5wdXRzW2ldKTsKKworICAgICAgICAvKiByZXR1cm4gaWYgdW5leHBlY3RlZCBlcnJvciBvY2N1cnMgaW4gaW5wdXQgc3RyZWFtICovCisgICAgICAgIGlmIChyZXQgPCAwICYmIHJldCAhPSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgLyogZXhwb3J0IHNpZ25hdHVyZSBhdCBFT0YgKi8KKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiAhc2MtPmV4cG9ydGVkKSB7CisgICAgICAgICAgICAvKiBleHBvcnQgaWYgd2FudGVkICovCisgICAgICAgICAgICBpZiAoc3RybGVuKHNpYy0+ZmlsZW5hbWUpID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChleHBvcnQoY3R4LCBzYywgaSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2MtPmV4cG9ydGVkID0gMTsKKyAgICAgICAgfQorICAgICAgICBsb29rdXAgJj0gc2MtPmV4cG9ydGVkOworICAgIH0KKworICAgIC8qIHNpZ25hdHVyZSBsb29rdXAgKi8KKyAgICBpZiAobG9va3VwICYmIHNpYy0+bW9kZSAhPSBNT0RFX09GRikgeworICAgICAgICAvKiBpdGVyYXRlIG92ZXIgZXZlcnkgcGFpciAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2ljLT5uYl9pbnB1dHM7IGkrKykgeworICAgICAgICAgICAgc2MgPSAmKHNpYy0+c3RyZWFtY29udGV4dHNbaV0pOworICAgICAgICAgICAgZm9yIChqID0gaSsxOyBqIDwgc2ljLT5uYl9pbnB1dHM7IGorKykgeworICAgICAgICAgICAgICAgIHNjMiA9ICYoc2ljLT5zdHJlYW1jb250ZXh0c1tqXSk7CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBsb29rdXBfc2lnbmF0dXJlcyhjdHgsIHNpYywgc2MsIHNjMiwgc2ljLT5tb2RlKTsKKyAgICAgICAgICAgICAgICBpZiAobWF0Y2guc2NvcmUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIm1hdGNoaW5nIG9mIHZpZGVvICVkIGF0ICVmIGFuZCAlZCBhdCAlZiwgJWQgZnJhbWVzIG1hdGNoaW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksICgoZG91YmxlKSBtYXRjaC5maXJzdC0+cHRzICogc2MtPnRpbWVfYmFzZS5udW0pIC8gc2MtPnRpbWVfYmFzZS5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgKChkb3VibGUpIG1hdGNoLnNlY29uZC0+cHRzICogc2MyLT50aW1lX2Jhc2UubnVtKSAvIHNjMi0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaC5tYXRjaGZyYW1lcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC53aG9sZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAid2hvbGUgdmlkZW8gbWF0Y2hpbmdcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAibm8gbWF0Y2hpbmcgb2YgdmlkZW8gJWQgYW5kICVkXG4iLCBpLCBqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKworICAgIFNpZ25hdHVyZUNvbnRleHQgKnNpYyA9IGN0eC0+cHJpdjsKKyAgICBTdHJlYW1Db250ZXh0ICpzYzsKKyAgICBpbnQgaSwgcmV0OworICAgIGNoYXIgdG1wWzEwMjRdOworCisgICAgc2ljLT5zdHJlYW1jb250ZXh0cyA9IGF2X21hbGxvY3ooc2ljLT5uYl9pbnB1dHMgKiBzaXplb2YoU3RyZWFtQ29udGV4dCkpOworICAgIGlmICghc2ljLT5zdHJlYW1jb250ZXh0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzaWMtPm5iX2lucHV0czsgaSsrKSB7CisgICAgICAgIEFWRmlsdGVyUGFkIHBhZCA9IHsKKyAgICAgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAgICAgLm5hbWUgPSBhdl9hc3ByaW50ZigiaW4lZCIsIGkpLAorICAgICAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgICAgIH07CisKKyAgICAgICAgaWYgKCFwYWQubmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgc2MgPSAmKHNpYy0+c3RyZWFtY29udGV4dHNbaV0pOworCisgICAgICAgIHNjLT5sYXN0aW5kZXggPSAwOworICAgICAgICBzYy0+ZmluZXNpZ2xpc3QgPSBhdl9tYWxsb2N6KHNpemVvZihGaW5lU2lnbmF0dXJlKSk7CisgICAgICAgIGlmICghc2MtPmZpbmVzaWdsaXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgc2MtPmN1cmZpbmVzaWcgPSBOVUxMOworCisgICAgICAgIHNjLT5jb2Fyc2VzaWdsaXN0ID0gYXZfbWFsbG9jeihzaXplb2YoQ29hcnNlU2lnbmF0dXJlKSk7CisgICAgICAgIGlmICghc2MtPmNvYXJzZXNpZ2xpc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBzYy0+Y3VyY29hcnNlc2lnMSA9IHNjLT5jb2Fyc2VzaWdsaXN0OworICAgICAgICBzYy0+Y29hcnNlZW5kID0gc2MtPmNvYXJzZXNpZ2xpc3Q7CisgICAgICAgIHNjLT5jb2Fyc2Vjb3VudCA9IDA7CisgICAgICAgIHNjLT5taWRjb2Fyc2UgPSAwOworCisgICAgICAgIGlmICgocmV0ID0gZmZfaW5zZXJ0X2lucGFkKGN0eCwgaSwgJnBhZCkpIDwgMCkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnBhZC5uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjaGVjayBmaWxlbmFtZSAqLworICAgIGlmIChzaWMtPm5iX2lucHV0cyA+IDEgJiYgc3RybGVuKHNpYy0+ZmlsZW5hbWUpID4gMCAmJiBhdl9nZXRfZnJhbWVfZmlsZW5hbWUodG1wLCBzaXplb2YodG1wKSwgc2ljLT5maWxlbmFtZSwgMCkgPT0gLTEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVGhlIGZpbGVuYW1lIG11c3QgY29udGFpbiAlJWQgb3IgJSUwbmQsIGlmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgaW5wdXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFNpZ25hdHVyZUNvbnRleHQgKnNpYyA9IGN0eC0+cHJpdjsKKyAgICBTdHJlYW1Db250ZXh0ICpzYzsKKyAgICB2b2lkKiB0bXA7CisgICAgRmluZVNpZ25hdHVyZSogZmluc2lnOworICAgIENvYXJzZVNpZ25hdHVyZSogY291c2lnOworICAgIGludCBpOworCisKKyAgICAvKiBmcmVlIHRoZSBsaXN0cyAqLworICAgIGlmIChzaWMtPnN0cmVhbWNvbnRleHRzICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpYy0+bmJfaW5wdXRzOyBpKyspIHsKKyAgICAgICAgICAgIHNjID0gJihzaWMtPnN0cmVhbWNvbnRleHRzW2ldKTsKKyAgICAgICAgICAgIGZpbnNpZyA9IHNjLT5maW5lc2lnbGlzdDsKKyAgICAgICAgICAgIGNvdXNpZyA9IHNjLT5jb2Fyc2VzaWdsaXN0OworCisgICAgICAgICAgICB3aGlsZSAoZmluc2lnKSB7CisgICAgICAgICAgICAgICAgdG1wID0gZmluc2lnOworICAgICAgICAgICAgICAgIGZpbnNpZyA9IGZpbnNpZy0+bmV4dDsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdG1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjLT5maW5lc2lnbGlzdCA9IE5VTEw7CisKKyAgICAgICAgICAgIHdoaWxlIChjb3VzaWcpIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBjb3VzaWc7CisgICAgICAgICAgICAgICAgY291c2lnID0gY291c2lnLT5uZXh0OworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ0bXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2MtPmNvYXJzZXNpZ2xpc3QgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZzaWMtPnN0cmVhbWNvbnRleHRzKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKworICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBpbmxpbmstPmZyYW1lX3JhdGU7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyAgICBvdXRsaW5rLT53ID0gaW5saW5rLT53OworICAgIG91dGxpbmstPmggPSBpbmxpbmstPmg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHNpZ25hdHVyZV9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5yZXF1ZXN0X2ZyYW1lID0gcmVxdWVzdF9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3NpZ25hdHVyZSA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJzaWduYXR1cmUiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNhbGN1bGF0ZSB0aGUgTVBFRy03IHZpZGVvIHNpZ25hdHVyZSIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFNpZ25hdHVyZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnNpZ25hdHVyZV9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gc2lnbmF0dXJlX291dHB1dHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX0lOUFVUUywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9zbWFydGJsdXIuYyBiL2xpYmF2ZmlsdGVyL3ZmX3NtYXJ0Ymx1ci5jCmluZGV4IDExN2UwZWMuLjE5NTVhYzQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3NtYXJ0Ymx1ci5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3NtYXJ0Ymx1ci5jCkBAIC00Miw3ICs0Miw3IEBACiAjZGVmaW5lIFRIUkVTSE9MRF9NSU4gLTMwCiAjZGVmaW5lIFRIUkVTSE9MRF9NQVggMzAKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgRmlsdGVyUGFyYW0gewogICAgIGZsb2F0ICAgICAgICAgICAgICByYWRpdXM7CiAgICAgZmxvYXQgICAgICAgICAgICAgIHN0cmVuZ3RoOwogICAgIGludCAgICAgICAgICAgICAgICB0aHJlc2hvbGQ7CkBAIC01MCw3ICs1MCw3IEBACiAgICAgc3RydWN0IFN3c0NvbnRleHQgKmZpbHRlcl9jb250ZXh0OwogfSBGaWx0ZXJQYXJhbTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgU21hcnRibHVyQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgRmlsdGVyUGFyYW0gIGx1bWE7CiAgICAgRmlsdGVyUGFyYW0gIGNocm9tYTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3NwcC5oIGIvbGliYXZmaWx0ZXIvdmZfc3BwLmgKaW5kZXggNmI3MGE5MS4uYzAzMDczYSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfc3BwLmgKKysrIGIvbGliYXZmaWx0ZXIvdmZfc3BwLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogI2RlZmluZSBNQVhfTEVWRUwgNiAvKiBxdWFsaXR5IGxldmVscyAqLwogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBTUFBDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKIAogICAgIGludCBsb2cyX2NvdW50OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfc3NpbS5jIGIvbGliYXZmaWx0ZXIvdmZfc3NpbS5jCmluZGV4IGRkOGYyNjQuLjRkY2RjMDUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3NzaW0uYworKysgYi9saWJhdmZpbHRlci92Zl9zc2ltLmMKQEAgLTM4LDE5ICszOCwyMCBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCi0jaW5jbHVkZSAiZHVhbGlucHV0LmgiCiAjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImZyYW1lc3luYy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAic3NpbS5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAKIHR5cGVkZWYgc3RydWN0IFNTSU1Db250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKLSAgICBGRkR1YWxJbnB1dENvbnRleHQgZGlucHV0OworICAgIEZGRnJhbWVTeW5jIGZzOwogICAgIEZJTEUgKnN0YXRzX2ZpbGU7CiAgICAgY2hhciAqc3RhdHNfZmlsZV9zdHI7CiAgICAgaW50IG5iX2NvbXBvbmVudHM7CisgICAgaW50IG1heDsKICAgICB1aW50NjRfdCBuYl9mcmFtZXM7CiAgICAgZG91YmxlIHNzaW1bNF0sIHNzaW1fdG90YWw7CiAgICAgY2hhciBjb21wc1s0XTsKQEAgLTYwLDYgKzYxLDExIEBACiAgICAgaW50IHBsYW5laGVpZ2h0WzRdOwogICAgIGludCAqdGVtcDsKICAgICBpbnQgaXNfcmdiOworICAgIGZsb2F0ICgqc3NpbV9wbGFuZSkoU1NJTURTUENvbnRleHQgKmRzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm1haW4sIGludCBtYWluX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnJlZiwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHZvaWQgKnRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4KTsKICAgICBTU0lNRFNQQ29udGV4dCBkc3A7CiB9IFNTSU1Db250ZXh0OwogCkBAIC03Miw3ICs3OCw3IEBACiAgICAgeyBOVUxMIH0KIH07CiAKLUFWRklMVEVSX0RFRklORV9DTEFTUyhzc2ltKTsKK0ZSQU1FU1lOQ19ERUZJTkVfQ0xBU1Moc3NpbSwgU1NJTUNvbnRleHQsIGZzKTsKIAogc3RhdGljIHZvaWQgc2V0X21ldGEoQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsIGNvbnN0IGNoYXIgKmtleSwgY2hhciBjb21wLCBmbG9hdCBkKQogewpAQCAtODcsOSArOTMsNDUgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHNzaW1fNHg0eG4oY29uc3QgdWludDhfdCAqbWFpbiwgcHRyZGlmZl90IG1haW5fc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIHB0cmRpZmZfdCByZWZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpzdW1zKVs0XSwgaW50IHdpZHRoKQorc3RhdGljIHZvaWQgc3NpbV80eDR4bl8xNmJpdChjb25zdCB1aW50OF90ICptYWluOCwgcHRyZGlmZl90IG1haW5fc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWY4LCBwdHJkaWZmX3QgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKnN1bXMpWzRdLCBpbnQgd2lkdGgpCit7CisgICAgY29uc3QgdWludDE2X3QgKm1haW4xNiA9IChjb25zdCB1aW50MTZfdCAqKW1haW44OworICAgIGNvbnN0IHVpbnQxNl90ICpyZWYxNiAgPSAoY29uc3QgdWludDE2X3QgKilyZWY4OworICAgIGludCB4LCB5LCB6OworCisgICAgbWFpbl9zdHJpZGUgPj49IDE7CisgICAgcmVmX3N0cmlkZSA+Pj0gMTsKKworICAgIGZvciAoeiA9IDA7IHogPCB3aWR0aDsgeisrKSB7CisgICAgICAgIHVpbnQ2NF90IHMxID0gMCwgczIgPSAwLCBzcyA9IDAsIHMxMiA9IDA7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IDQ7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGEgPSBtYWluMTZbeCArIHkgKiBtYWluX3N0cmlkZV07CisgICAgICAgICAgICAgICAgdW5zaWduZWQgYiA9IHJlZjE2W3ggKyB5ICogcmVmX3N0cmlkZV07CisKKyAgICAgICAgICAgICAgICBzMSAgKz0gYTsKKyAgICAgICAgICAgICAgICBzMiAgKz0gYjsKKyAgICAgICAgICAgICAgICBzcyAgKz0gYSphOworICAgICAgICAgICAgICAgIHNzICArPSBiKmI7CisgICAgICAgICAgICAgICAgczEyICs9IGEqYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN1bXNbel1bMF0gPSBzMTsKKyAgICAgICAgc3Vtc1t6XVsxXSA9IHMyOworICAgICAgICBzdW1zW3pdWzJdID0gc3M7CisgICAgICAgIHN1bXNbel1bM10gPSBzMTI7CisgICAgICAgIG1haW4xNiArPSA0OworICAgICAgICByZWYxNiArPSA0OworICAgIH0KK30KKworc3RhdGljIHZvaWQgc3NpbV80eDR4bl84Yml0KGNvbnN0IHVpbnQ4X3QgKm1haW4sIHB0cmRpZmZfdCBtYWluX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIHB0cmRpZmZfdCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKnN1bXMpWzRdLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50IHgsIHksIHo7CiAKQEAgLTExOCw2ICsxNjAsMjIgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBmbG9hdCBzc2ltX2VuZDF4KGludDY0X3QgczEsIGludDY0X3QgczIsIGludDY0X3Qgc3MsIGludDY0X3QgczEyLCBpbnQgbWF4KQoreworICAgIGludDY0X3Qgc3NpbV9jMSA9IChpbnQ2NF90KSguMDEqLjAxKm1heCptYXgqNjQgKyAuNSk7CisgICAgaW50NjRfdCBzc2ltX2MyID0gKGludDY0X3QpKC4wMyouMDMqbWF4Km1heCo2NCo2MyArIC41KTsKKworICAgIGludDY0X3QgZnMxID0gczE7CisgICAgaW50NjRfdCBmczIgPSBzMjsKKyAgICBpbnQ2NF90IGZzcyA9IHNzOworICAgIGludDY0X3QgZnMxMiA9IHMxMjsKKyAgICBpbnQ2NF90IHZhcnMgPSBmc3MgKiA2NCAtIGZzMSAqIGZzMSAtIGZzMiAqIGZzMjsKKyAgICBpbnQ2NF90IGNvdmFyID0gZnMxMiAqIDY0IC0gZnMxICogZnMyOworCisgICAgcmV0dXJuIChmbG9hdCkoMiAqIGZzMSAqIGZzMiArIHNzaW1fYzEpICogKGZsb2F0KSgyICogY292YXIgKyBzc2ltX2MyKQorICAgICAgICAgLyAoKGZsb2F0KShmczEgKiBmczEgKyBmczIgKiBmczIgKyBzc2ltX2MxKSAqIChmbG9hdCkodmFycyArIHNzaW1fYzIpKTsKK30KKwogc3RhdGljIGZsb2F0IHNzaW1fZW5kMShpbnQgczEsIGludCBzMiwgaW50IHNzLCBpbnQgczEyKQogewogICAgIHN0YXRpYyBjb25zdCBpbnQgc3NpbV9jMSA9IChpbnQpKC4wMSouMDEqMjU1KjI1NSo2NCArIC41KTsKQEAgLTEzNCw3ICsxOTIsMjEgQEAKICAgICAgICAgIC8gKChmbG9hdCkoZnMxICogZnMxICsgZnMyICogZnMyICsgc3NpbV9jMSkgKiAoZmxvYXQpKHZhcnMgKyBzc2ltX2MyKSk7CiB9CiAKLXN0YXRpYyBmbG9hdCBzc2ltX2VuZG4oY29uc3QgaW50ICgqc3VtMClbNF0sIGNvbnN0IGludCAoKnN1bTEpWzRdLCBpbnQgd2lkdGgpCitzdGF0aWMgZmxvYXQgc3NpbV9lbmRuXzE2Yml0KGNvbnN0IGludDY0X3QgKCpzdW0wKVs0XSwgY29uc3QgaW50NjRfdCAoKnN1bTEpWzRdLCBpbnQgd2lkdGgsIGludCBtYXgpCit7CisgICAgZmxvYXQgc3NpbSA9IDAuMDsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorICAgICAgICBzc2ltICs9IHNzaW1fZW5kMXgoc3VtMFtpXVswXSArIHN1bTBbaSArIDFdWzBdICsgc3VtMVtpXVswXSArIHN1bTFbaSArIDFdWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtMFtpXVsxXSArIHN1bTBbaSArIDFdWzFdICsgc3VtMVtpXVsxXSArIHN1bTFbaSArIDFdWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtMFtpXVsyXSArIHN1bTBbaSArIDFdWzJdICsgc3VtMVtpXVsyXSArIHN1bTFbaSArIDFdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtMFtpXVszXSArIHN1bTBbaSArIDFdWzNdICsgc3VtMVtpXVszXSArIHN1bTFbaSArIDFdWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4KTsKKyAgICByZXR1cm4gc3NpbTsKK30KKworc3RhdGljIGZsb2F0IHNzaW1fZW5kbl84Yml0KGNvbnN0IGludCAoKnN1bTApWzRdLCBjb25zdCBpbnQgKCpzdW0xKVs0XSwgaW50IHdpZHRoKQogewogICAgIGZsb2F0IHNzaW0gPSAwLjA7CiAgICAgaW50IGk7CkBAIC0xNDcsMTUgKzIxOSw0NiBAQAogICAgIHJldHVybiBzc2ltOwogfQogCisjZGVmaW5lIFNVTV9MRU4odykgKCgodykgPj4gMikgKyAzKQorCitzdGF0aWMgZmxvYXQgc3NpbV9wbGFuZV8xNmJpdChTU0lNRFNQQ29udGV4dCAqZHNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbWFpbiwgaW50IG1haW5fc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcmVmLCBpbnQgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgdm9pZCAqdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXgpCit7CisgICAgaW50IHogPSAwLCB5OworICAgIGZsb2F0IHNzaW0gPSAwLjA7CisgICAgaW50NjRfdCAoKnN1bTApWzRdID0gdGVtcDsKKyAgICBpbnQ2NF90ICgqc3VtMSlbNF0gPSBzdW0wICsgU1VNX0xFTih3aWR0aCk7CisKKyAgICB3aWR0aCA+Pj0gMjsKKyAgICBoZWlnaHQgPj49IDI7CisKKyAgICBmb3IgKHkgPSAxOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICg7IHogPD0geTsgeisrKSB7CisgICAgICAgICAgICBGRlNXQVAodm9pZCosIHN1bTAsIHN1bTEpOworICAgICAgICAgICAgc3NpbV80eDR4bl8xNmJpdCgmbWFpbls0ICogeiAqIG1haW5fc3RyaWRlXSwgbWFpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWZbNCAqIHogKiByZWZfc3RyaWRlXSwgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtMCwgd2lkdGgpOworICAgICAgICB9CisKKyAgICAgICAgc3NpbSArPSBzc2ltX2VuZG5fMTZiaXQoKGNvbnN0IGludDY0X3QgKCopWzRdKXN1bTAsIChjb25zdCBpbnQ2NF90ICgqKVs0XSlzdW0xLCB3aWR0aCAtIDEsIG1heCk7CisgICAgfQorCisgICAgcmV0dXJuIHNzaW0gLyAoKGhlaWdodCAtIDEpICogKHdpZHRoIC0gMSkpOworfQorCiBzdGF0aWMgZmxvYXQgc3NpbV9wbGFuZShTU0lNRFNQQ29udGV4dCAqZHNwLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqbWFpbiwgaW50IG1haW5fc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqcmVmLCBpbnQgcmVmX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgdm9pZCAqdGVtcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgdm9pZCAqdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXgpCiB7CiAgICAgaW50IHogPSAwLCB5OwogICAgIGZsb2F0IHNzaW0gPSAwLjA7CiAgICAgaW50ICgqc3VtMClbNF0gPSB0ZW1wOwotICAgIGludCAoKnN1bTEpWzRdID0gc3VtMCArICh3aWR0aCA+PiAyKSArIDM7CisgICAgaW50ICgqc3VtMSlbNF0gPSBzdW0wICsgU1VNX0xFTih3aWR0aCk7CiAKICAgICB3aWR0aCA+Pj0gMjsKICAgICBoZWlnaHQgPj49IDI7CkBAIC0xNzksMjAgKzI4MiwyOSBAQAogICAgIHJldHVybiAxMCAqIGxvZzEwKHdlaWdodCAvICh3ZWlnaHQgLSBzc2ltKSk7CiB9CiAKLXN0YXRpYyBBVkZyYW1lICpkb19zc2ltKEFWRmlsdGVyQ29udGV4dCAqY3R4LCBBVkZyYW1lICptYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqcmVmKQorc3RhdGljIGludCBkb19zc2ltKEZGRnJhbWVTeW5jICpmcykKIHsKLSAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSA9IGF2cHJpdl9mcmFtZV9nZXRfbWV0YWRhdGFwKG1haW4pOworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gZnMtPnBhcmVudDsKICAgICBTU0lNQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZyYW1lICptYXN0ZXIsICpyZWY7CisgICAgQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGE7CiAgICAgZmxvYXQgY1s0XSwgc3NpbXYgPSAwLjA7Ci0gICAgaW50IGk7CisgICAgaW50IHJldCwgaTsKKworICAgIHJldCA9IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRfZ2V0KGZzLCAmbWFzdGVyLCAmcmVmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIXJlZikKKyAgICAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG1hc3Rlcik7CisgICAgbWV0YWRhdGEgPSAmbWFzdGVyLT5tZXRhZGF0YTsKIAogICAgIHMtPm5iX2ZyYW1lcysrOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX2NvbXBvbmVudHM7IGkrKykgewotICAgICAgICBjW2ldID0gc3NpbV9wbGFuZSgmcy0+ZHNwLCBtYWluLT5kYXRhW2ldLCBtYWluLT5saW5lc2l6ZVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT5kYXRhW2ldLCByZWYtPmxpbmVzaXplW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZXdpZHRoW2ldLCBzLT5wbGFuZWhlaWdodFtpXSwgcy0+dGVtcCk7CisgICAgICAgIGNbaV0gPSBzLT5zc2ltX3BsYW5lKCZzLT5kc3AsIG1hc3Rlci0+ZGF0YVtpXSwgbWFzdGVyLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT5kYXRhW2ldLCByZWYtPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wbGFuZXdpZHRoW2ldLCBzLT5wbGFuZWhlaWdodFtpXSwgcy0+dGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF4KTsKICAgICAgICAgc3NpbXYgKz0gcy0+Y29lZnNbaV0gKiBjW2ldOwogICAgICAgICBzLT5zc2ltW2ldICs9IGNbaV07CiAgICAgfQpAQCAtMjE2LDcgKzMyOCw3IEBACiAgICAgICAgIGZwcmludGYocy0+c3RhdHNfZmlsZSwgIkFsbDolZiAoJWYpXG4iLCBzc2ltdiwgc3NpbV9kYihzc2ltdiwgMS4wKSk7CiAgICAgfQogCi0gICAgcmV0dXJuIG1haW47CisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShjdHgtPm91dHB1dHNbMF0sIG1hc3Rlcik7CiB9CiAKIHN0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQpAQCAtMjM5LDIxICszNTEsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHMtPmRpbnB1dC5wcm9jZXNzID0gZG9fc3NpbTsKLSAgICBzLT5kaW5wdXQuc2hvcnRlc3QgPSAxOwotICAgIHMtPmRpbnB1dC5yZXBlYXRsYXN0ID0gMDsKKyAgICBzLT5mcy5vbl9ldmVudCA9IGRvX3NzaW07CiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7Ci0gICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTksIEFWX1BJWF9GTVRfR1JBWTEwLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxMiwgQVZfUElYX0ZNVF9HUkFZMTYsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMFAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsIEFWX1BJWF9GTVRfWVVWSjQyMlAsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCiAgICAgICAgIEFWX1BJWF9GTVRfR0JSUCwKKyNkZWZpbmUgUEYoc3VmKSBBVl9QSVhfRk1UX1lVVjQyMCMjc3VmLCAgQVZfUElYX0ZNVF9ZVVY0MjIjI3N1ZiwgIEFWX1BJWF9GTVRfWVVWNDQ0IyNzdWYsIEFWX1BJWF9GTVRfR0JSIyNzdWYKKyAgICAgICAgUEYoUDkpLCBQRihQMTApLCBQRihQMTIpLCBQRihQMTQpLCBQRihQMTYpLAogICAgICAgICBBVl9QSVhfRk1UX05PTkUKICAgICB9OwogCkBAIC0yOTcsMTIgKzQxMCwxNCBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jb21wb25lbnRzOyBpKyspCiAgICAgICAgIHMtPmNvZWZzW2ldID0gKGRvdWJsZSkgcy0+cGxhbmVoZWlnaHRbaV0gKiBzLT5wbGFuZXdpZHRoW2ldIC8gc3VtOwogCi0gICAgcy0+dGVtcCA9IGF2X21hbGxvYygoMiAqIGlubGluay0+dyArIDEyKSAqIHNpemVvZigqcy0+dGVtcCkpOworICAgIHMtPnRlbXAgPSBhdl9tYWxsb2N6X2FycmF5KDIgKiBTVU1fTEVOKGlubGluay0+dyksIChkZXNjLT5jb21wWzBdLmRlcHRoID4gOCkgPyBzaXplb2YoaW50NjRfdFs0XSkgOiBzaXplb2YoaW50WzRdKSk7CiAgICAgaWYgKCFzLT50ZW1wKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHMtPm1heCA9ICgxIDw8IGRlc2MtPmNvbXBbMF0uZGVwdGgpIC0gMTsKIAotICAgIHMtPmRzcC5zc2ltXzR4NF9saW5lID0gc3NpbV80eDR4bjsKLSAgICBzLT5kc3Auc3NpbV9lbmRfbGluZSA9IHNzaW1fZW5kbjsKKyAgICBzLT5zc2ltX3BsYW5lID0gZGVzYy0+Y29tcFswXS5kZXB0aCA+IDggPyBzc2ltX3BsYW5lXzE2Yml0IDogc3NpbV9wbGFuZTsKKyAgICBzLT5kc3Auc3NpbV80eDRfbGluZSA9IHNzaW1fNHg0eG5fOGJpdDsKKyAgICBzLT5kc3Auc3NpbV9lbmRfbGluZSA9IHNzaW1fZW5kbl84Yml0OwogICAgIGlmIChBUkNIX1g4NikKICAgICAgICAgZmZfc3NpbV9pbml0X3g4Nigmcy0+ZHNwKTsKIApAQCAtMzE2LDI4ICs0MzEsMjUgQEAKICAgICBBVkZpbHRlckxpbmsgKm1haW5saW5rID0gY3R4LT5pbnB1dHNbMF07CiAgICAgaW50IHJldDsKIAorICAgIHJldCA9IGZmX2ZyYW1lc3luY19pbml0X2R1YWxpbnB1dCgmcy0+ZnMsIGN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAgICAgb3V0bGluay0+dyA9IG1haW5saW5rLT53OwogICAgIG91dGxpbmstPmggPSBtYWlubGluay0+aDsKICAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBtYWlubGluay0+dGltZV9iYXNlOwogICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBtYWlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKICAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gbWFpbmxpbmstPmZyYW1lX3JhdGU7CiAKLSAgICBpZiAoKHJldCA9IGZmX2R1YWxpbnB1dF9pbml0KGN0eCwgJnMtPmRpbnB1dCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpidWYpCitzdGF0aWMgaW50IGFjdGl2YXRlKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewotICAgIFNTSU1Db250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7Ci0gICAgcmV0dXJuIGZmX2R1YWxpbnB1dF9maWx0ZXJfZnJhbWUoJnMtPmRpbnB1dCwgaW5saW5rLCBidWYpOwotfQotCi1zdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQotewotICAgIFNTSU1Db250ZXh0ICpzID0gb3V0bGluay0+c3JjLT5wcml2OwotICAgIHJldHVybiBmZl9kdWFsaW5wdXRfcmVxdWVzdF9mcmFtZSgmcy0+ZGlucHV0LCBvdXRsaW5rKTsKKyAgICBTU0lNQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2FjdGl2YXRlKCZzLT5mcyk7CiB9CiAKIHN0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQpAQCAtMzU3LDcgKzQ2OSw3IEBACiAgICAgICAgICAgICAgICBzLT5zc2ltX3RvdGFsIC8gcy0+bmJfZnJhbWVzLCBzc2ltX2RiKHMtPnNzaW1fdG90YWwsIHMtPm5iX2ZyYW1lcykpOwogICAgIH0KIAotICAgIGZmX2R1YWxpbnB1dF91bmluaXQoJnMtPmRpbnB1dCk7CisgICAgZmZfZnJhbWVzeW5jX3VuaW5pdCgmcy0+ZnMpOwogCiAgICAgaWYgKHMtPnN0YXRzX2ZpbGUgJiYgcy0+c3RhdHNfZmlsZSAhPSBzdGRvdXQpCiAgICAgICAgIGZjbG9zZShzLT5zdGF0c19maWxlKTsKQEAgLTM2OSwxMSArNDgxLDkgQEAKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAibWFpbiIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCiAgICAgfSx7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAicmVmZXJlbmNlIiwKICAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKLSAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKICAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dF9yZWYsCiAgICAgfSwKICAgICB7IE5VTEwgfQpAQCAtMzg0LDcgKzQ5NCw2IEBACiAgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAogICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfb3V0cHV0LAotICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCiAgICAgfSwKICAgICB7IE5VTEwgfQogfTsKQEAgLTM5Miw5ICs1MDEsMTEgQEAKIEFWRmlsdGVyIGZmX3ZmX3NzaW0gPSB7CiAgICAgLm5hbWUgICAgICAgICAgPSAic3NpbSIsCiAgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2FsY3VsYXRlIHRoZSBTU0lNIGJldHdlZW4gdHdvIHZpZGVvIHN0cmVhbXMuIiksCisgICAgLnByZWluaXQgICAgICAgPSBzc2ltX2ZyYW1lc3luY19wcmVpbml0LAogICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKICAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKICAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmFjdGl2YXRlICAgICAgPSBhY3RpdmF0ZSwKICAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihTU0lNQ29udGV4dCksCiAgICAgLnByaXZfY2xhc3MgICAgPSAmc3NpbV9jbGFzcywKICAgICAuaW5wdXRzICAgICAgICA9IHNzaW1faW5wdXRzLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfc3RhY2suYyBiL2xpYmF2ZmlsdGVyL3ZmX3N0YWNrLmMKaW5kZXggMDM2NDNiNi4uYjJiOGM2OCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfc3RhY2suYworKysgYi9saWJhdmZpbHRlci92Zl9zdGFjay5jCkBAIC01OCwxMiArNTgsNiBAQAogICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBwaXhfZm10cyk7CiB9CiAKLXN0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKLXsKLSAgICBTdGFja0NvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKLSAgICByZXR1cm4gZmZfZnJhbWVzeW5jX2ZpbHRlcl9mcmFtZSgmcy0+ZnMsIGlubGluaywgaW4pOwotfQotCiBzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBTdGFja0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CkBAIC04Myw3ICs3Nyw2IEBACiAgICAgICAgIHBhZC5uYW1lID0gYXZfYXNwcmludGYoImlucHV0JWQiLCBpKTsKICAgICAgICAgaWYgKCFwYWQubmFtZSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIHBhZC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWU7CiAKICAgICAgICAgaWYgKChyZXQgPSBmZl9pbnNlcnRfaW5wYWQoY3R4LCBpLCAmcGFkKSkgPCAwKSB7CiAgICAgICAgICAgICBhdl9mcmVlcCgmcGFkLm5hbWUpOwpAQCAtMTEyLDYgKzEwNSw3IEBACiAgICAgaWYgKCFvdXQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgb3V0LT5wdHMgPSBhdl9yZXNjYWxlX3Eocy0+ZnMucHRzLCBzLT5mcy50aW1lX2Jhc2UsIG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgb3V0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9pbnB1dHM7IGkrKykgewogICAgICAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzW2ldOwpAQCAtMTU0LDYgKzE0OCw3IEBACiAgICAgU3RhY2tDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlID0gY3R4LT5pbnB1dHNbMF0tPnRpbWVfYmFzZTsKICAgICBBVlJhdGlvbmFsIGZyYW1lX3JhdGUgPSBjdHgtPmlucHV0c1swXS0+ZnJhbWVfcmF0ZTsKKyAgICBBVlJhdGlvbmFsIHNhciA9IGN0eC0+aW5wdXRzWzBdLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwogICAgIGludCBoZWlnaHQgPSBjdHgtPmlucHV0c1swXS0+aDsKICAgICBpbnQgd2lkdGggPSBjdHgtPmlucHV0c1swXS0+dzsKICAgICBGRkZyYW1lU3luY0luICppbjsKQEAgLTE4Niw2ICsxODEsNyBAQAogICAgIG91dGxpbmstPmggICAgICAgICAgPSBoZWlnaHQ7CiAgICAgb3V0bGluay0+dGltZV9iYXNlICA9IHRpbWVfYmFzZTsKICAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gZnJhbWVfcmF0ZTsKKyAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gc2FyOwogCiAgICAgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNfaW5pdCgmcy0+ZnMsIGN0eCwgcy0+bmJfaW5wdXRzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMjA2LDEyICsyMDIsNiBAQAogICAgIHJldHVybiBmZl9mcmFtZXN5bmNfY29uZmlndXJlKCZzLT5mcyk7CiB9CiAKLXN0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKm91dGxpbmspCi17Ci0gICAgU3RhY2tDb250ZXh0ICpzID0gb3V0bGluay0+c3JjLT5wcml2OwotICAgIHJldHVybiBmZl9mcmFtZXN5bmNfcmVxdWVzdF9mcmFtZSgmcy0+ZnMsIG91dGxpbmspOwotfQotCiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBTdGFja0NvbnRleHQgKnMgPSBjdHgtPnByaXY7CkBAIC0yMjQsNiArMjE0LDEyIEBACiAgICAgICAgIGF2X2ZyZWVwKCZjdHgtPmlucHV0X3BhZHNbaV0ubmFtZSk7CiB9CiAKK3N0YXRpYyBpbnQgYWN0aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgU3RhY2tDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoJnMtPmZzKTsKK30KKwogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU3RhY2tDb250ZXh0LCB4KQogI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHN0YWNrX29wdGlvbnNbXSA9IHsKQEAgLTIzNyw3ICsyMzMsNiBAQAogICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKICAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKLSAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0yNTYsNiArMjUxLDcgQEAKICAgICAub3V0cHV0cyAgICAgICA9IG91dHB1dHMsCiAgICAgLmluaXQgICAgICAgICAgPSBpbml0LAogICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5hY3RpdmF0ZSAgICAgID0gYWN0aXZhdGUsCiAgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX0RZTkFNSUNfSU5QVVRTLAogfTsKIApAQCAtMjc1LDYgKzI3MSw3IEBACiAgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLAogICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKICAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuYWN0aXZhdGUgICAgICA9IGFjdGl2YXRlLAogICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19EWU5BTUlDX0lOUFVUUywKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3N0ZXJlbzNkLmMgYi9saWJhdmZpbHRlci92Zl9zdGVyZW8zZC5jCmluZGV4IDIwMzZjOTQuLjhiMjJmODggMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3N0ZXJlbzNkLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfc3RlcmVvM2QuYwpAQCAtMTUwLDYgKzE1MCw3IEBACiAgICAgQVZGcmFtZSAqcHJldjsKICAgICBpbnQgYmxhbmtzOwogICAgIGludCBpbl9vZmZfbGVmdFs0XSwgaW5fb2ZmX3JpZ2h0WzRdOworICAgIEFWUmF0aW9uYWwgYXNwZWN0OwogICAgIFN0ZXJlbzNERFNQQ29udGV4dCBkc3A7CiB9IFN0ZXJlbzNEQ29udGV4dDsKIApAQCAtMzU5LDExICszNjAsMTEgQEAKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKICAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOwogICAgIFN0ZXJlbzNEQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBBVlJhdGlvbmFsIGFzcGVjdCA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKICAgICBBVlJhdGlvbmFsIGZwcyA9IGlubGluay0+ZnJhbWVfcmF0ZTsKICAgICBBVlJhdGlvbmFsIHRiID0gaW5saW5rLT50aW1lX2Jhc2U7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdXRsaW5rLT5mb3JtYXQpOwogICAgIGludCByZXQ7CisgICAgcy0+YXNwZWN0ID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwogCiAgICAgc3dpdGNoIChzLT5pbi5mb3JtYXQpIHsKICAgICBjYXNlIElOVEVSTEVBVkVfQ09MU19MUjoKQEAgLTQwNCwyNSArNDA1LDI1IEBACiAKICAgICBzd2l0Y2ggKHMtPmluLmZvcm1hdCkgewogICAgIGNhc2UgU0lERV9CWV9TSURFXzJfTFI6Ci0gICAgICAgIGFzcGVjdC5udW0gICAgICo9IDI7CisgICAgICAgIHMtPmFzcGVjdC5udW0gICo9IDI7CiAgICAgY2FzZSBTSURFX0JZX1NJREVfTFI6CiAgICAgICAgIHMtPndpZHRoICAgICAgICA9IGlubGluay0+dyAvIDI7CiAgICAgICAgIHMtPmluLm9mZl9yaWdodCA9IHMtPndpZHRoOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFNJREVfQllfU0lERV8yX1JMOgotICAgICAgICBhc3BlY3QubnVtICAgICAqPSAyOworICAgICAgICBzLT5hc3BlY3QubnVtICAqPSAyOwogICAgIGNhc2UgU0lERV9CWV9TSURFX1JMOgogICAgICAgICBzLT53aWR0aCAgICAgICAgPSBpbmxpbmstPncgLyAyOwogICAgICAgICBzLT5pbi5vZmZfbGVmdCAgPSBzLT53aWR0aDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQk9WRV9CRUxPV18yX0xSOgotICAgICAgICBhc3BlY3QuZGVuICAgICAqPSAyOworICAgICAgICBzLT5hc3BlY3QuZGVuICAqPSAyOwogICAgIGNhc2UgQUJPVkVfQkVMT1dfTFI6CiAgICAgICAgIHMtPmluLnJvd19yaWdodCA9CiAgICAgICAgIHMtPmhlaWdodCAgICAgICA9IGlubGluay0+aCAvIDI7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQUJPVkVfQkVMT1dfMl9STDoKLSAgICAgICAgYXNwZWN0LmRlbiAgICAgKj0gMjsKKyAgICAgICAgcy0+YXNwZWN0LmRlbiAgKj0gMjsKICAgICBjYXNlIEFCT1ZFX0JFTE9XX1JMOgogICAgICAgICBzLT5pbi5yb3dfbGVmdCAgPQogICAgICAgICBzLT5oZWlnaHQgICAgICAgPSBpbmxpbmstPmggLyAyOwpAQCAtNDg2LDE5ICs0ODcsMTkgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgU0lERV9CWV9TSURFXzJfTFI6Ci0gICAgICAgIGFzcGVjdC5kZW4gICAgICAqPSAyOworICAgICAgICBzLT5hc3BlY3QuZGVuICAgKj0gMjsKICAgICBjYXNlIFNJREVfQllfU0lERV9MUjoKICAgICAgICAgcy0+b3V0LndpZHRoICAgICA9IHMtPndpZHRoICogMjsKICAgICAgICAgcy0+b3V0Lm9mZl9yaWdodCA9IHMtPndpZHRoOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFNJREVfQllfU0lERV8yX1JMOgotICAgICAgICBhc3BlY3QuZGVuICAgICAgKj0gMjsKKyAgICAgICAgcy0+YXNwZWN0LmRlbiAgICo9IDI7CiAgICAgY2FzZSBTSURFX0JZX1NJREVfUkw6CiAgICAgICAgIHMtPm91dC53aWR0aCAgICAgPSBzLT53aWR0aCAqIDI7CiAgICAgICAgIHMtPm91dC5vZmZfbGVmdCAgPSBzLT53aWR0aDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQk9WRV9CRUxPV18yX0xSOgotICAgICAgICBhc3BlY3QubnVtICAgICAgKj0gMjsKKyAgICAgICAgcy0+YXNwZWN0Lm51bSAgICo9IDI7CiAgICAgY2FzZSBBQk9WRV9CRUxPV19MUjoKICAgICAgICAgcy0+b3V0LmhlaWdodCAgICA9IHMtPmhlaWdodCAqIDI7CiAgICAgICAgIHMtPm91dC5yb3dfcmlnaHQgPSBzLT5oZWlnaHQ7CkBAIC01MTQsNyArNTE1LDcgQEAKICAgICAgICAgcy0+b3V0LnJvd19yaWdodCA9IHMtPmhlaWdodCArIHMtPmJsYW5rczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQk9WRV9CRUxPV18yX1JMOgotICAgICAgICBhc3BlY3QubnVtICAgICAgKj0gMjsKKyAgICAgICAgcy0+YXNwZWN0Lm51bSAgICo9IDI7CiAgICAgY2FzZSBBQk9WRV9CRUxPV19STDoKICAgICAgICAgcy0+b3V0LmhlaWdodCAgICA9IHMtPmhlaWdodCAqIDI7CiAgICAgICAgIHMtPm91dC5yb3dfbGVmdCAgPSBzLT5oZWlnaHQ7CkBAIC01NzYsNyArNTc3LDcgQEAKICAgICBvdXRsaW5rLT5oID0gcy0+b3V0LmhlaWdodDsKICAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gZnBzOwogICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IHRiOwotICAgIG91dGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhc3BlY3Q7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHMtPmFzcGVjdDsKIAogICAgIGlmICgocmV0ID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMocy0+bGluZXNpemUsIG91dGxpbmstPmZvcm1hdCwgcy0+d2lkdGgpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC05MzUsNyArOTM2LDcgQEAKIAogICAgICAgICAgICAgdGQuaWxlZnQgPSBpbGVmdDsgdGQuaXJpZ2h0ID0gaXJpZ2h0OyB0ZC5vdXQgPSBvdXQ7CiAgICAgICAgICAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUlOKHMtPm91dC5oZWlnaHQsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZNSU4ocy0+b3V0LmhlaWdodCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CkBAIC0xMDc1LDYgKzEwNzYsNyBAQAogICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2KTsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW5waWNyZWYpOwogICAgIH0KKyAgICBvdXQtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzLT5hc3BlY3Q7CiAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl9zdWJ0aXRsZXMuYyBiL2xpYmF2ZmlsdGVyL3ZmX3N1YnRpdGxlcy5jCmluZGV4IDYzYjIyYzMuLmE3YjAyNDYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3N1YnRpdGxlcy5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3N1YnRpdGxlcy5jCkBAIC00NCw3ICs0NCw3IEBACiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IEFzc0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIEFTU19MaWJyYXJ5ICAqbGlicmFyeTsKICAgICBBU1NfUmVuZGVyZXIgKnJlbmRlcmVyOwpAQCAtNTQsNiArNTQsNyBAQAogICAgIGNoYXIgKmNoYXJlbmM7CiAgICAgY2hhciAqZm9yY2Vfc3R5bGU7CiAgICAgaW50IHN0cmVhbV9pbmRleDsKKyAgICBpbnQgYWxwaGE7CiAgICAgdWludDhfdCByZ2JhX21hcFs0XTsKICAgICBpbnQgICAgIHBpeF9zdGVwWzRdOyAgICAgICAvLy88IHN0ZXBzIHBlciBwaXhlbCBmb3IgZWFjaCBwbGFuZSBvZiB0aGUgbWFpbiBvdXRwdXQKICAgICBpbnQgb3JpZ2luYWxfdywgb3JpZ2luYWxfaDsKQEAgLTY5LDYgKzcwLDcgQEAKICAgICB7ImYiLCAgICAgICAgICAgICAgInNldCB0aGUgZmlsZW5hbWUgb2YgZmlsZSB0byByZWFkIiwgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZpbGVuYW1lKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICB7LnN0ciA9IE5VTEx9LCAgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LCBcCiAgICAgeyJvcmlnaW5hbF9zaXplIiwgICJzZXQgdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIHZpZGVvICh1c2VkIHRvIHNjYWxlIGZvbnRzKSIsIE9GRlNFVChvcmlnaW5hbF93KSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwgXAogICAgIHsiZm9udHNkaXIiLCAgICAgICAic2V0IHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udHMgdG8gcmVhZCIsICAgICAgICAgICBPRkZTRVQoZm9udHNkaXIpLCAgIEFWX09QVF9UWVBFX1NUUklORywgICAgIHsuc3RyID0gTlVMTH0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sIFwKKyAgICB7ImFscGhhIiwgICAgICAgICAgImVuYWJsZSBwcm9jZXNzaW5nIG9mIGFscGhhIGNoYW5uZWwiLCAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGFscGhhKSwgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgICAgICB7Lmk2NCA9IDAgICB9LCAgICAgICAgIDAsICAgICAgICAxLCBGTEFHUyB9LCBcCiAKIC8qIGxpYmFzcyBzdXBwb3J0cyBhIGxvZyBsZXZlbCByYW5naW5nIGZyb20gMCB0byA3ICovCiBzdGF0aWMgY29uc3QgaW50IGFzc19saWJhdmZpbHRlcl9sb2dfbGV2ZWxfbWFwW10gPSB7CkBAIC0xNDAsNyArMTQyLDcgQEAKIHsKICAgICBBc3NDb250ZXh0ICphc3MgPSBpbmxpbmstPmRzdC0+cHJpdjsKIAotICAgIGZmX2RyYXdfaW5pdCgmYXNzLT5kcmF3LCBpbmxpbmstPmZvcm1hdCwgMCk7CisgICAgZmZfZHJhd19pbml0KCZhc3MtPmRyYXcsIGlubGluay0+Zm9ybWF0LCBhc3MtPmFscGhhID8gRkZfRFJBV19QUk9DRVNTX0FMUEhBIDogMCk7CiAKICAgICBhc3Nfc2V0X2ZyYW1lX3NpemUgIChhc3MtPnJlbmRlcmVyLCBpbmxpbmstPncsIGlubGluay0+aCk7CiAgICAgaWYgKGFzcy0+b3JpZ2luYWxfdyAmJiBhc3MtPm9yaWdpbmFsX2gpCkBAIC0zMzMsNyArMzM1LDcgQEAKICAgICAgICAgcmV0ID0gLTE7CiAgICAgICAgIGlmIChhc3MtPnN0cmVhbV9pbmRleCA8IGZtdC0+bmJfc3RyZWFtcykgewogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGZtdC0+bmJfc3RyZWFtczsgaisrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZtdC0+c3RyZWFtc1tqXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgICAgICAgaWYgKGZtdC0+c3RyZWFtc1tqXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChhc3MtPnN0cmVhbV9pbmRleCA9PSBrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zNTUsNyArMzU3LDcgQEAKICAgICAvKiBMb2FkIGF0dGFjaGVkIGZvbnRzICovCiAgICAgZm9yIChqID0gMDsgaiA8IGZtdC0+bmJfc3RyZWFtczsgaisrKSB7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IGZtdC0+c3RyZWFtc1tqXTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCAmJgorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UICYmCiAgICAgICAgICAgICBhdHRhY2htZW50X2lzX2ZvbnQoc3QpKSB7CiAgICAgICAgICAgICBjb25zdCBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gTlVMTDsKICAgICAgICAgICAgIHRhZyA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgImZpbGVuYW1lIiwgTlVMTCwKQEAgLTM2NSw4ICszNjcsOCBAQAogICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkxvYWRpbmcgYXR0YWNoZWQgZm9udDogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy0+dmFsdWUpOwogICAgICAgICAgICAgICAgIGFzc19hZGRfZm9udChhc3MtPmxpYnJhcnksIHRhZy0+dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgIkZvbnQgYXR0YWNobWVudCBoYXMgbm8gZmlsZW5hbWUsIGlnbm9yZWQuXG4iKTsKQEAgLTM3OCwxNCArMzgwLDEzIEBACiAgICAgYXNzX3NldF9mb250cyhhc3MtPnJlbmRlcmVyLCBOVUxMLCBOVUxMLCAxLCBOVUxMLCAxKTsKIAogICAgIC8qIE9wZW4gZGVjb2RlciAqLwotICAgIGRlY19jdHggPSBzdC0+Y29kZWM7Ci0gICAgZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIoZGVjX2N0eC0+Y29kZWNfaWQpOworICAgIGRlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogICAgIGlmICghZGVjKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBmaW5kIHN1YnRpdGxlIGNvZGVjICVzXG4iLAotICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShkZWNfY3R4LT5jb2RlY19pZCkpOworICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQotICAgIGRlY19kZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChkZWNfY3R4LT5jb2RlY19pZCk7CisgICAgZGVjX2Rlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogICAgIGlmIChkZWNfZGVzYyAmJiAhKGRlY19kZXNjLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfVEVYVF9TVUIpKSB7CiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJPbmx5IHRleHQgYmFzZWQgc3VidGl0bGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkXG4iKTsKQEAgLTM5Myw3ICszOTQsMjggQEAKICAgICB9CiAgICAgaWYgKGFzcy0+Y2hhcmVuYykKICAgICAgICAgYXZfZGljdF9zZXQoJmNvZGVjX29wdHMsICJzdWJfY2hhcmVuYyIsIGFzcy0+Y2hhcmVuYywgMCk7Ci0gICAgcmV0ID0gYXZjb2RlY19vcGVuMihkZWNfY3R4LCBkZWMsICZjb2RlY19vcHRzKTsKKyAgICBpZiAoTElCQVZDT0RFQ19WRVJTSU9OX0lOVCA+PSBBVl9WRVJTSU9OX0lOVCg1NywyNiwxMDApKQorICAgICAgICBhdl9kaWN0X3NldCgmY29kZWNfb3B0cywgInN1Yl90ZXh0X2Zvcm1hdCIsICJhc3MiLCAwKTsKKworICAgIGRlY19jdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKGRlYyk7CisgICAgaWYgKCFkZWNfY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoZGVjX2N0eCwgc3QtPmNvZGVjcGFyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICAvKgorICAgICAqIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlIGRlY29kaW5nIHByb2Nlc3MgaW4gb3JkZXIgdG8gcmVzY2FsZSB0aGUKKyAgICAgKiB0aW1lc3RhbXBzOiBpbiB0aGUgY3VycmVudCBBUEkgdGhlIGRlY29kZWQgc3VidGl0bGVzIGhhdmUgdGhlaXIgcHRzCisgICAgICogZXhwcmVzc2VkIGluIEFWX1RJTUVfQkFTRSwgYW5kIHRodXMgdGhlIGxhdmMgaW50ZXJuYWxzIG5lZWQgdG8ga25vdyB0aGUKKyAgICAgKiBzdHJlYW0gdGltZSBiYXNlIGluIG9yZGVyIHRvIGFjaGlldmUgdGhlIHJlc2NhbGluZy4KKyAgICAgKgorICAgICAqIFRoYXQgQVBJIGlzIG9sZCBhbmQgbmVlZHMgdG8gYmUgcmV3b3JrZWQgdG8gbWF0Y2ggYmVoYXZpb3VyIHdpdGggQS9WLgorICAgICAqLworICAgIGRlY19jdHgtPnBrdF90aW1lYmFzZSA9IHN0LT50aW1lX2Jhc2U7CisKKyAgICByZXQgPSBhdmNvZGVjX29wZW4yKGRlY19jdHgsIE5VTEwsICZjb2RlY19vcHRzKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgZ290byBlbmQ7CiAKQEAgLTQzNiwxMSArNDU4LDE3IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJFcnJvciBkZWNvZGluZzogJXMgKGlnbm9yZWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChnb3Rfc3VidGl0bGUpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0X3RpbWUgPSBhdl9yZXNjYWxlX3Eoc3ViLnB0cywgQVZfVElNRV9CQVNFX1EsIGF2X21ha2VfcSgxLCAxMDAwKSk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkdXJhdGlvbiAgID0gc3ViLmVuZF9kaXNwbGF5X3RpbWU7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHN1Yi5udW1fcmVjdHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBjaGFyICphc3NfbGluZSA9IHN1Yi5yZWN0c1tpXS0+YXNzOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWFzc19saW5lKQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGFzc19wcm9jZXNzX2RhdGEoYXNzLT50cmFjaywgYXNzX2xpbmUsIHN0cmxlbihhc3NfbGluZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoTElCQVZDT0RFQ19WRVJTSU9OX0lOVCA8IEFWX1ZFUlNJT05fSU5UKDU3LDI1LDEwMCkpCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NfcHJvY2Vzc19kYXRhKGFzcy0+dHJhY2ssIGFzc19saW5lLCBzdHJsZW4oYXNzX2xpbmUpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzX3Byb2Nlc3NfY2h1bmsoYXNzLT50cmFjaywgYXNzX2xpbmUsIHN0cmxlbihhc3NfbGluZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF90aW1lLCBkdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NTAsMTAgKzQ3OCw5IEBACiAKIGVuZDoKICAgICBhdl9kaWN0X2ZyZWUoJmNvZGVjX29wdHMpOwotICAgIGlmIChkZWNfY3R4KQotICAgICAgICBhdmNvZGVjX2Nsb3NlKGRlY19jdHgpOwotICAgIGlmIChmbXQpCi0gICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZmbXQpOworICAgIGF2Y29kZWNfY2xvc2UoZGVjX2N0eCk7CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmRlY19jdHgpOworICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZmbXQpOwogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3N1cGVyMnhzYWkuYyBiL2xpYmF2ZmlsdGVyL3ZmX3N1cGVyMnhzYWkuYwppbmRleCBjYmIzZjYyLi44N2VlYzA0IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl9zdXBlcjJ4c2FpLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfc3VwZXIyeHNhaS5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBTdXBlcjJ4U2FJQ29udGV4dCB7CiAgICAgLyogbWFza3MgdXNlZCBmb3IgdHdvIHBpeGVscyBpbnRlcnBvbGF0aW9uICovCiAgICAgdWludDMyX3QgaGlfcGl4ZWxfbWFzazsKICAgICB1aW50MzJfdCBsb19waXhlbF9tYXNrOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfc3dhcHJlY3QuYyBiL2xpYmF2ZmlsdGVyL3ZmX3N3YXByZWN0LmMKaW5kZXggYTQ2NzYyNy4uZjk2Zjg5NyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfc3dhcHJlY3QuYworKysgYi9saWJhdmZpbHRlci92Zl9zd2FwcmVjdC5jCkBAIC05Nyw5ICs5Nyw5IEBACiAgICAgdmFyX3ZhbHVlc1tWQVJfQV0gICA9IChmbG9hdCkgaW5saW5rLT53IC8gaW5saW5rLT5oOwogICAgIHZhcl92YWx1ZXNbVkFSX1NBUl0gPSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID8gYXZfcTJkKGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbykgOiAxOwogICAgIHZhcl92YWx1ZXNbVkFSX0RBUl0gPSB2YXJfdmFsdWVzW1ZBUl9BXSAqIHZhcl92YWx1ZXNbVkFSX1NBUl07Ci0gICAgdmFyX3ZhbHVlc1tWQVJfTl0gICA9IGlubGluay0+ZnJhbWVfY291bnQ7CisgICAgdmFyX3ZhbHVlc1tWQVJfTl0gICA9IGlubGluay0+ZnJhbWVfY291bnRfb3V0OwogICAgIHZhcl92YWx1ZXNbVkFSX1RdICAgPSBpbi0+cHRzID09IEFWX05PUFRTX1ZBTFVFID8gTkFOIDogaW4tPnB0cyAqIGF2X3EyZChpbmxpbmstPnRpbWVfYmFzZSk7Ci0gICAgdmFyX3ZhbHVlc1tWQVJfUE9TXSA9IGF2X2ZyYW1lX2dldF9wa3RfcG9zKGluKSA9PSAtMSA/IE5BTiA6IGF2X2ZyYW1lX2dldF9wa3RfcG9zKGluKTsKKyAgICB2YXJfdmFsdWVzW1ZBUl9QT1NdID0gaW4tPnBrdF9wb3MgPyBOQU4gOiBpbi0+cGt0X3BvczsKIAogICAgIHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJmR3LCBzLT53LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCAmdmFyX3ZhbHVlc1swXSwKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3N3YXB1di5jIGIvbGliYXZmaWx0ZXIvdmZfc3dhcHV2LmMKaW5kZXggMWE4MmVmMy4uOGQ2MmM0OCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfc3dhcHV2LmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfc3dhcHV2LmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqIHN3YXAgVVYgZmlsdGVyCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC92ZXJzaW9uLmgiCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKQEAgLTMwLDYgKzMxLDE2IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCit0eXBlZGVmIHN0cnVjdCBTd2FwVVZDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKK30gU3dhcFVWQ29udGV4dDsKKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHN3YXB1dl9vcHRpb25zW10gPSB7CisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyhzd2FwdXYpOworCiBzdGF0aWMgdm9pZCBkb19zd2FwKEFWRnJhbWUgKmZyYW1lKQogewogICAgIEZGU1dBUCh1aW50OF90KiwgICAgIGZyYW1lLT5kYXRhWzFdLCAgICAgZnJhbWUtPmRhdGFbMl0pOwpAQCAtMTEwLDYgKzEyMSw5IEBACiAgICAgLm5hbWUgICAgICAgICAgPSAic3dhcHV2IiwKICAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTd2FwIFUgYW5kIFYgY29tcG9uZW50cy4iKSwKICAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoU3dhcFVWQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgPSAmc3dhcHV2X2NsYXNzLAogICAgIC5pbnB1dHMgICAgICAgID0gc3dhcHV2X2lucHV0cywKICAgICAub3V0cHV0cyAgICAgICA9IHN3YXB1dl9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdGVsZWNpbmUuYyBiL2xpYmF2ZmlsdGVyL3ZmX3RlbGVjaW5lLmMKaW5kZXggMTgyYzY3MC4uNjI1OTlhNyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfdGVsZWNpbmUuYworKysgYi9saWJhdmZpbHRlci92Zl90ZWxlY2luZS5jCkBAIC0zMyw3ICszMyw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2aWRlby5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBUZWxlY2luZUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCBmaXJzdF9maWVsZDsKICAgICBjaGFyICpwYXR0ZXJuOwpAQCAtMTkwLDYgKzE5MCw3IEBACiAgICAgfQogCiAgICAgaWYgKHMtPm9jY3VwaWVkKSB7CisgICAgICAgIGF2X2ZyYW1lX21ha2Vfd3JpdGFibGUocy0+ZnJhbWVbbm91dF0pOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcGxhbmVzOyBpKyspIHsKICAgICAgICAgICAgIC8vIGZpbGwgaW4gdGhlIEVBUkxJRVIgZmllbGQgZnJvbSB0aGUgYnVmZmVyZWQgcGljCiAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKHMtPmZyYW1lW25vdXRdLT5kYXRhW2ldICsgcy0+ZnJhbWVbbm91dF0tPmxpbmVzaXplW2ldICogcy0+Zmlyc3RfZmllbGQsCkBAIC0yMTMsNiArMjE0LDcgQEAKIAogICAgIHdoaWxlIChsZW4gPj0gMikgewogICAgICAgICAvLyBvdXRwdXQgVEhJUyBpbWFnZSBhcy1pcworICAgICAgICBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKHMtPmZyYW1lW25vdXRdKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3BsYW5lczsgaSsrKQogICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShzLT5mcmFtZVtub3V0XS0+ZGF0YVtpXSwgcy0+ZnJhbWVbbm91dF0tPmxpbmVzaXplW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnBpY3JlZi0+ZGF0YVtpXSwgaW5waWNyZWYtPmxpbmVzaXplW2ldLApAQCAtMjQyLDcgKzI0NCw3IEBACiAKICAgICAgICAgYXZfZnJhbWVfY29weV9wcm9wcyhmcmFtZSwgaW5waWNyZWYpOwogICAgICAgICBmcmFtZS0+cHRzID0gKChzLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSA/IDAgOiBzLT5zdGFydF90aW1lKSArCi0gICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKG91dGxpbmstPmZyYW1lX2NvdW50LCBzLT50c191bml0Lm51bSwKKyAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGUob3V0bGluay0+ZnJhbWVfY291bnRfaW4sIHMtPnRzX3VuaXQubnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT50c191bml0LmRlbik7CiAgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBmcmFtZSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdGhyZXNob2xkLmMgYi9saWJhdmZpbHRlci92Zl90aHJlc2hvbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGI1ZDE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfdGhyZXNob2xkLmMKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIHRocmVzaG9sZCB2aWRlbyBmaWx0ZXIKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmcmFtZXN5bmMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInZpZGVvLmgiCisjaW5jbHVkZSAidGhyZXNob2xkLmgiCisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRocmVzaG9sZENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNfEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdGhyZXNob2xkX29wdGlvbnNbXSA9IHsKKyAgICB7ICJwbGFuZXMiLCAic2V0IHBsYW5lcyB0byBmaWx0ZXIiLCBPRkZTRVQocGxhbmVzKSwgQVZfT1BUX1RZUEVfSU5ULCAgey5pNjQ9MTV9LCAwLCAxNSwgRkxBR1N9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1ModGhyZXNob2xkKTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0MFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWNDIyUCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVko0MTFQLCBBVl9QSVhfRk1UX1lVVjQxMVAsIEFWX1BJWF9GTVRfWVVWNDEwUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTYsIEFWX1BJWF9GTVRfWVVWNDIyUDE2LCBBVl9QSVhfRk1UX1lVVjQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2LCBBVl9QSVhfRk1UX1lVVkE0MjJQMTYsIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQLCBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSUDE0LCBBVl9QSVhfRk1UX0dCUlAxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJBUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTIgLCBBVl9QSVhfRk1UX0dCUkFQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEFWX1BJWF9GTVRfR1JBWTksIEFWX1BJWF9GTVRfR1JBWTEwLAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxMiwgQVZfUElYX0ZNVF9HUkFZMTYsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cykpOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZnJhbWUoRkZGcmFtZVN5bmMgKmZzKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gZnMtPnBhcmVudDsKKyAgICBUaHJlc2hvbGRDb250ZXh0ICpzID0gZnMtPm9wYXF1ZTsKKyAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07CisgICAgQVZGcmFtZSAqb3V0LCAqaW4sICp0aHJlc2hvbGQsICptaW4sICptYXg7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gZmZfZnJhbWVzeW5jX2dldF9mcmFtZSgmcy0+ZnMsIDAsICZpbiwgICAgICAgIDApKSA8IDAgfHwKKyAgICAgICAgKHJldCA9IGZmX2ZyYW1lc3luY19nZXRfZnJhbWUoJnMtPmZzLCAxLCAmdGhyZXNob2xkLCAwKSkgPCAwIHx8CisgICAgICAgIChyZXQgPSBmZl9mcmFtZXN5bmNfZ2V0X2ZyYW1lKCZzLT5mcywgMiwgJm1pbiwgICAgICAgMCkpIDwgMCB8fAorICAgICAgICAocmV0ID0gZmZfZnJhbWVzeW5jX2dldF9mcmFtZSgmcy0+ZnMsIDMsICZtYXgsICAgICAgIDApKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoY3R4LT5pc19kaXNhYmxlZCkgeworICAgICAgICBvdXQgPSBhdl9mcmFtZV9jbG9uZShpbik7CisgICAgICAgIGlmICghb3V0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQgcDsKKworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgICAgICBpZiAoIShzLT5wbGFuZXMgJiAoMSA8PCBwKSkpIHsKKyAgICAgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVtwXSwgb3V0LT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluLT5kYXRhW3BdLCBpbi0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aWR0aFtwXSAqIHMtPmJwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmhlaWdodFtwXSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzLT50aHJlc2hvbGQoaW4tPmRhdGFbcF0sIHRocmVzaG9sZC0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtaW4tPmRhdGFbcF0sIG1heC0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmRhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW4tPmxpbmVzaXplW3BdLCB0aHJlc2hvbGQtPmxpbmVzaXplW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1pbi0+bGluZXNpemVbcF0sIG1heC0+bGluZXNpemVbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aWR0aFtwXSwgcy0+aGVpZ2h0W3BdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dC0+cHRzID0gYXZfcmVzY2FsZV9xKHMtPmZzLnB0cywgcy0+ZnMudGltZV9iYXNlLCBvdXRsaW5rLT50aW1lX2Jhc2UpOworCisgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOworfQorCitzdGF0aWMgdm9pZCB0aHJlc2hvbGQ4KGNvbnN0IHVpbnQ4X3QgKmluLCBjb25zdCB1aW50OF90ICp0aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1pbiwgY29uc3QgdWludDhfdCAqbWF4LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbGluZXNpemUsIHB0cmRpZmZfdCB0bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBmbGluZXNpemUsIHB0cmRpZmZfdCBzbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBvbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgb3V0W3hdID0gaW5beF0gPCB0aHJlc2hvbGRbeF0gPyBtaW5beF0gOiBtYXhbeF07CisgICAgICAgIH0KKworICAgICAgICBpbiAgICAgICAgKz0gaWxpbmVzaXplOworICAgICAgICB0aHJlc2hvbGQgKz0gdGxpbmVzaXplOworICAgICAgICBtaW4gICAgICAgKz0gZmxpbmVzaXplOworICAgICAgICBtYXggICAgICAgKz0gc2xpbmVzaXplOworICAgICAgICBvdXQgICAgICAgKz0gb2xpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGhyZXNob2xkMTYoY29uc3QgdWludDhfdCAqaWluLCBjb25zdCB1aW50OF90ICp0dGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZmZpcnN0LCBjb25zdCB1aW50OF90ICpzc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBpbGluZXNpemUsIHB0cmRpZmZfdCB0bGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZmxpbmVzaXplLCBwdHJkaWZmX3Qgc2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBjb25zdCB1aW50MTZfdCAqaW4gPSAoY29uc3QgdWludDE2X3QgKilpaW47CisgICAgY29uc3QgdWludDE2X3QgKnRocmVzaG9sZCA9IChjb25zdCB1aW50MTZfdCAqKXR0aHJlc2hvbGQ7CisgICAgY29uc3QgdWludDE2X3QgKm1pbiA9IChjb25zdCB1aW50MTZfdCAqKWZmaXJzdDsKKyAgICBjb25zdCB1aW50MTZfdCAqbWF4ID0gKGNvbnN0IHVpbnQxNl90ICopc3NlY29uZDsKKyAgICB1aW50MTZfdCAqb3V0ID0gKHVpbnQxNl90ICopb291dDsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgb3V0W3hdID0gaW5beF0gPCB0aHJlc2hvbGRbeF0gPyBtaW5beF0gOiBtYXhbeF07CisgICAgICAgIH0KKworICAgICAgICBpbiAgICAgICAgKz0gaWxpbmVzaXplIC8gMjsKKyAgICAgICAgdGhyZXNob2xkICs9IHRsaW5lc2l6ZSAvIDI7CisgICAgICAgIG1pbiAgICAgICArPSBmbGluZXNpemUgLyAyOworICAgICAgICBtYXggICAgICAgKz0gc2xpbmVzaXplIC8gMjsKKyAgICAgICAgb3V0ICAgICAgICs9IG9saW5lc2l6ZSAvIDI7CisgICAgfQorfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFRocmVzaG9sZENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IHZzdWIsIGhzdWI7CisKKyAgICBzLT5uYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhpbmxpbmstPmZvcm1hdCk7CisKKyAgICBoc3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICB2c3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBzLT5oZWlnaHRbMV0gPSBzLT5oZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIHZzdWIpOworICAgIHMtPmhlaWdodFswXSA9IHMtPmhlaWdodFszXSA9IGlubGluay0+aDsKKyAgICBzLT53aWR0aFsxXSAgPSBzLT53aWR0aFsyXSAgPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIGhzdWIpOworICAgIHMtPndpZHRoWzBdICA9IHMtPndpZHRoWzNdICA9IGlubGluay0+dzsKKyAgICBzLT5kZXB0aCA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisKKyAgICBmZl90aHJlc2hvbGRfaW5pdChzKTsKKworICAgIHJldHVybiAwOworfQorCit2b2lkIGZmX3RocmVzaG9sZF9pbml0KFRocmVzaG9sZENvbnRleHQgKnMpCit7CisgICAgaWYgKHMtPmRlcHRoID09IDgpIHsKKyAgICAgICAgcy0+dGhyZXNob2xkID0gdGhyZXNob2xkODsKKyAgICAgICAgcy0+YnBjID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT50aHJlc2hvbGQgPSB0aHJlc2hvbGQxNjsKKyAgICAgICAgcy0+YnBjID0gMjsKKyAgICB9CisKKyAgICBpZiAoQVJDSF9YODYpCisgICAgICAgIGZmX3RocmVzaG9sZF9pbml0X3g4NihzKTsKK30KKworc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKKyAgICBUaHJlc2hvbGRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqYmFzZSA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqdGhyZXNob2xkID0gY3R4LT5pbnB1dHNbMV07CisgICAgQVZGaWx0ZXJMaW5rICptaW4gPSBjdHgtPmlucHV0c1syXTsKKyAgICBBVkZpbHRlckxpbmsgKm1heCA9IGN0eC0+aW5wdXRzWzNdOworICAgIEZGRnJhbWVTeW5jSW4gKmluOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYmFzZS0+Zm9ybWF0ICE9IHRocmVzaG9sZC0+Zm9ybWF0IHx8CisgICAgICAgIGJhc2UtPmZvcm1hdCAhPSBtaW4tPmZvcm1hdCB8fAorICAgICAgICBiYXNlLT5mb3JtYXQgIT0gbWF4LT5mb3JtYXQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiaW5wdXRzIG11c3QgYmUgb2Ygc2FtZSBwaXhlbCBmb3JtYXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoYmFzZS0+dyAgICAgICAgICAgICAgICAgICAgICAgIT0gdGhyZXNob2xkLT53IHx8CisgICAgICAgIGJhc2UtPmggICAgICAgICAgICAgICAgICAgICAgICE9IHRocmVzaG9sZC0+aCB8fAorICAgICAgICBiYXNlLT53ICAgICAgICAgICAgICAgICAgICAgICAhPSBtaW4tPncgfHwKKyAgICAgICAgYmFzZS0+aCAgICAgICAgICAgICAgICAgICAgICAgIT0gbWluLT5oIHx8CisgICAgICAgIGJhc2UtPncgICAgICAgICAgICAgICAgICAgICAgICE9IG1heC0+dyB8fAorICAgICAgICBiYXNlLT5oICAgICAgICAgICAgICAgICAgICAgICAhPSBtYXgtPmgpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmlyc3QgaW5wdXQgbGluayAlcyBwYXJhbWV0ZXJzICIKKyAgICAgICAgICAgICAgICIoc2l6ZSAlZHglZCkgZG8gbm90IG1hdGNoIHRoZSBjb3JyZXNwb25kaW5nICIKKyAgICAgICAgICAgICAgICJzZWNvbmQgaW5wdXQgbGluayAlcyBwYXJhbWV0ZXJzICglZHglZCkgIgorICAgICAgICAgICAgICAgImFuZC9vciB0aGlyZCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgKCVkeCVkKSAiCisgICAgICAgICAgICAgICAiYW5kL29yIGZvdXJ0aCBpbnB1dCBsaW5rICVzIHBhcmFtZXRlcnMgKCVkeCVkKVxuIiwKKyAgICAgICAgICAgICAgIGN0eC0+aW5wdXRfcGFkc1swXS5uYW1lLCBiYXNlLT53LCBiYXNlLT5oLAorICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzFdLm5hbWUsIHRocmVzaG9sZC0+dywgdGhyZXNob2xkLT5oLAorICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzJdLm5hbWUsIG1pbi0+dywgbWluLT5oLAorICAgICAgICAgICAgICAgY3R4LT5pbnB1dF9wYWRzWzNdLm5hbWUsIG1heC0+dywgbWF4LT5oKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBvdXRsaW5rLT53ID0gYmFzZS0+dzsKKyAgICBvdXRsaW5rLT5oID0gYmFzZS0+aDsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBiYXNlLT50aW1lX2Jhc2U7CisgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGJhc2UtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgb3V0bGluay0+ZnJhbWVfcmF0ZSA9IGJhc2UtPmZyYW1lX3JhdGU7CisKKyAgICBpZiAoKHJldCA9IGZmX2ZyYW1lc3luY19pbml0KCZzLT5mcywgY3R4LCA0KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW4gPSBzLT5mcy5pbjsKKyAgICBpblswXS50aW1lX2Jhc2UgPSBiYXNlLT50aW1lX2Jhc2U7CisgICAgaW5bMV0udGltZV9iYXNlID0gdGhyZXNob2xkLT50aW1lX2Jhc2U7CisgICAgaW5bMl0udGltZV9iYXNlID0gbWluLT50aW1lX2Jhc2U7CisgICAgaW5bM10udGltZV9iYXNlID0gbWF4LT50aW1lX2Jhc2U7CisgICAgaW5bMF0uc3luYyAgID0gMTsKKyAgICBpblswXS5iZWZvcmUgPSBFWFRfU1RPUDsKKyAgICBpblswXS5hZnRlciAgPSBFWFRfU1RPUDsKKyAgICBpblsxXS5zeW5jICAgPSAxOworICAgIGluWzFdLmJlZm9yZSA9IEVYVF9TVE9QOworICAgIGluWzFdLmFmdGVyICA9IEVYVF9TVE9QOworICAgIGluWzJdLnN5bmMgICA9IDE7CisgICAgaW5bMl0uYmVmb3JlID0gRVhUX1NUT1A7CisgICAgaW5bMl0uYWZ0ZXIgID0gRVhUX1NUT1A7CisgICAgaW5bM10uc3luYyAgID0gMTsKKyAgICBpblszXS5iZWZvcmUgPSBFWFRfU1RPUDsKKyAgICBpblszXS5hZnRlciAgPSBFWFRfU1RPUDsKKyAgICBzLT5mcy5vcGFxdWUgICA9IHM7CisgICAgcy0+ZnMub25fZXZlbnQgPSBwcm9jZXNzX2ZyYW1lOworCisgICAgcmV0dXJuIGZmX2ZyYW1lc3luY19jb25maWd1cmUoJnMtPmZzKTsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUaHJlc2hvbGRDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIHJldHVybiBmZl9mcmFtZXN5bmNfYWN0aXZhdGUoJnMtPmZzKTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVGhyZXNob2xkQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGZmX2ZyYW1lc3luY191bmluaXQoJnMtPmZzKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIGlucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dCwKKyAgICB9LAorICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJ0aHJlc2hvbGQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gIm1pbiIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAibWF4IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfdGhyZXNob2xkID0geworICAgIC5uYW1lICAgICAgICAgID0gInRocmVzaG9sZCIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiVGhyZXNob2xkIGZpcnN0IHZpZGVvIHN0cmVhbSB1c2luZyBvdGhlciB2aWRlbyBzdHJlYW1zLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFRocmVzaG9sZENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnRocmVzaG9sZF9jbGFzcywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmFjdGl2YXRlICAgICAgPSBhY3RpdmF0ZSwKKyAgICAuaW5wdXRzICAgICAgICA9IGlucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IG91dHB1dHMsCisgICAgLmZsYWdzICAgICAgICAgPSBBVkZJTFRFUl9GTEFHX1NVUFBPUlRfVElNRUxJTkVfSU5URVJOQUwsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdGh1bWJuYWlsLmMgYi9saWJhdmZpbHRlci92Zl90aHVtYm5haWwuYwppbmRleCA0MTdjY2Q1Li4wZWZmZGM5IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl90aHVtYm5haWwuYworKysgYi9saWJhdmZpbHRlci92Zl90aHVtYm5haWwuYwpAQCAtMzgsNyArMzgsNyBAQAogICAgIGludCBoaXN0b2dyYW1bSElTVF9TSVpFXTsgICAvLy88IFJHQiBjb2xvciBkaXN0cmlidXRpb24gaGlzdG9ncmFtIG9mIHRoZSBmcmFtZQogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgVGh1bWJDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGZyYW1lCiAgICAgaW50IG5fZnJhbWVzOyAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lcyBmb3IgYW5hbHlzaXMKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3RodW1ibmFpbF9jdWRhLmMgYi9saWJhdmZpbHRlci92Zl90aHVtYm5haWxfY3VkYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Mzc3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl90aHVtYm5haWxfY3VkYS5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorKiBDb3B5cmlnaHQgKGMpIDIwMTcsIE5WSURJQSBDT1JQT1JBVElPTi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisqCisqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorKgorKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorKi8KKworI2luY2x1ZGUgPGN1ZGEuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9od2NvbnRleHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0X2N1ZGFfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBISVNUX1NJWkUgKDMqMjU2KQorI2RlZmluZSBESVZfVVAoYSwgYikgKCAoKGEpICsgKGIpIC0gMSkgLyAoYikgKQorI2RlZmluZSBCTE9DS1ggMzIKKyNkZWZpbmUgQkxPQ0tZIDE2CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgc3VwcG9ydGVkX2Zvcm1hdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX05WMTIsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICBBVl9QSVhfRk1UX1AwMTAsCisgICAgQVZfUElYX0ZNVF9QMDE2LAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LAorfTsKKworc3RydWN0IHRodW1iX2ZyYW1lIHsKKyAgICBBVkZyYW1lICpidWY7ICAgICAgICAgICAgICAgLy8vPCBjYWNoZWQgZnJhbWUKKyAgICBpbnQgaGlzdG9ncmFtW0hJU1RfU0laRV07ICAgLy8vPCBSR0IgY29sb3IgZGlzdHJpYnV0aW9uIGhpc3RvZ3JhbSBvZiB0aGUgZnJhbWUKK307CisKK3R5cGVkZWYgc3RydWN0IFRodW1ibmFpbEN1ZGFDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBjdXJyZW50IGZyYW1lCisgICAgaW50IG5fZnJhbWVzOyAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGZyYW1lcyBmb3IgYW5hbHlzaXMKKyAgICBzdHJ1Y3QgdGh1bWJfZnJhbWUgKmZyYW1lczsgLy8vPCB0aGUgbl9mcmFtZXMgZnJhbWVzCisgICAgQVZSYXRpb25hbCB0YjsgICAgICAgICAgICAgIC8vLzwgY29weSBvZiB0aGUgaW5wdXQgdGltZWJhc2UgdG8gZWFzZSBhY2Nlc3MKKworICAgIEFWQnVmZmVyUmVmICpod19mcmFtZXNfY3R4OworCisgICAgQ1Vtb2R1bGUgICAgY3VfbW9kdWxlOworCisgICAgQ1VmdW5jdGlvbiAgY3VfZnVuY191Y2hhcjsKKyAgICBDVWZ1bmN0aW9uICBjdV9mdW5jX3VjaGFyMjsKKyAgICBDVWZ1bmN0aW9uICBjdV9mdW5jX3VzaG9ydDsKKyAgICBDVWZ1bmN0aW9uICBjdV9mdW5jX3VzaG9ydDI7CisgICAgQ1V0ZXhyZWYgICAgY3VfdGV4X3VjaGFyOworICAgIENVdGV4cmVmICAgIGN1X3RleF91Y2hhcjI7CisgICAgQ1V0ZXhyZWYgICAgY3VfdGV4X3VzaG9ydDsKKyAgICBDVXRleHJlZiAgICBjdV90ZXhfdXNob3J0MjsKKworICAgIENVZGV2aWNlcHRyIGRhdGE7Cit9IFRodW1ibmFpbEN1ZGFDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihUaHVtYm5haWxDdWRhQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU18QVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB0aHVtYm5haWxfY3VkYV9vcHRpb25zW10gPSB7CisgICAgeyAibiIsICJzZXQgdGhlIGZyYW1lcyBiYXRjaCBzaXplIiwgT0ZGU0VUKG5fZnJhbWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xMDB9LCAyLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1ModGh1bWJuYWlsX2N1ZGEpOworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUaHVtYm5haWxDdWRhQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIHMtPmZyYW1lcyA9IGF2X2NhbGxvYyhzLT5uX2ZyYW1lcywgc2l6ZW9mKCpzLT5mcmFtZXMpKTsKKyAgICBpZiAoIXMtPmZyYW1lcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQWxsb2NhdGlvbiBmYWlsdXJlLCB0cnkgdG8gbG93ZXIgdGhlIG51bWJlciBvZiBmcmFtZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgImJhdGNoIHNpemU6ICVkIGZyYW1lc1xuIiwgcy0+bl9mcmFtZXMpOworICAgIHJldHVybiAwOworfQorCisvKioKKyAqIEBicmllZiAgICAgICAgQ29tcHV0ZSBTdW0tc3F1YXJlIGRldmlhdGlvbiB0byBlc3RpbWF0ZSAiY2xvc2VuZXNzIi4KKyAqIEBwYXJhbSBoaXN0ICAgY29sb3IgZGlzdHJpYnV0aW9uIGhpc3RvZ3JhbQorICogQHBhcmFtIG1lZGlhbiBhdmVyYWdlIGNvbG9yIGRpc3RyaWJ1dGlvbiBoaXN0b2dyYW0KKyAqIEByZXR1cm4gICAgICAgc3VtIG9mIHNxdWFyZWQgZXJyb3JzCisgKi8KK3N0YXRpYyBkb3VibGUgZnJhbWVfc3VtX3NxdWFyZV9lcnIoY29uc3QgaW50ICpoaXN0LCBjb25zdCBkb3VibGUgKm1lZGlhbikKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgZXJyLCBzdW1fc3FfZXJyID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBISVNUX1NJWkU7IGkrKykgeworICAgICAgICBlcnIgPSBtZWRpYW5baV0gLSAoZG91YmxlKWhpc3RbaV07CisgICAgICAgIHN1bV9zcV9lcnIgKz0gZXJyKmVycjsKKyAgICB9CisgICAgcmV0dXJuIHN1bV9zcV9lcnI7Cit9CisKK3N0YXRpYyBBVkZyYW1lICpnZXRfYmVzdF9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkZyYW1lICpwaWNyZWY7CisgICAgVGh1bWJuYWlsQ3VkYUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IGksIGosIGJlc3RfZnJhbWVfaWR4ID0gMDsKKyAgICBpbnQgbmJfZnJhbWVzID0gcy0+bjsKKyAgICBkb3VibGUgYXZnX2hpc3RbSElTVF9TSVpFXSA9IHswfSwgc3FfZXJyLCBtaW5fc3FfZXJyID0gLTE7CisKKyAgICAvLyBhdmVyYWdlIGhpc3RvZ3JhbSBvZiB0aGUgTiBmcmFtZXMKKyAgICBmb3IgKGogPSAwOyBqIDwgRkZfQVJSQVlfRUxFTVMoYXZnX2hpc3QpOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2ZyYW1lczsgaSsrKQorICAgICAgICAgICAgYXZnX2hpc3Rbal0gKz0gKGRvdWJsZSlzLT5mcmFtZXNbaV0uaGlzdG9ncmFtW2pdOworICAgICAgICBhdmdfaGlzdFtqXSAvPSBuYl9mcmFtZXM7CisgICAgfQorCisgICAgLy8gZmluZCB0aGUgZnJhbWUgY2xvc2VyIHRvIHRoZSBhdmVyYWdlIHVzaW5nIHRoZSBzdW0gb2Ygc3F1YXJlZCBlcnJvcnMKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgc3FfZXJyID0gZnJhbWVfc3VtX3NxdWFyZV9lcnIocy0+ZnJhbWVzW2ldLmhpc3RvZ3JhbSwgYXZnX2hpc3QpOworICAgICAgICBpZiAoaSA9PSAwIHx8IHNxX2VyciA8IG1pbl9zcV9lcnIpCisgICAgICAgICAgICBiZXN0X2ZyYW1lX2lkeCA9IGksIG1pbl9zcV9lcnIgPSBzcV9lcnI7CisgICAgfQorCisgICAgLy8gZnJlZSBhbmQgcmVzZXQgZXZlcnl0aGluZyAoZXhjZXB0IHRoZSBiZXN0IGZyYW1lIGJ1ZmZlcikKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgbWVtc2V0KHMtPmZyYW1lc1tpXS5oaXN0b2dyYW0sIDAsIHNpemVvZihzLT5mcmFtZXNbaV0uaGlzdG9ncmFtKSk7CisgICAgICAgIGlmIChpICE9IGJlc3RfZnJhbWVfaWR4KQorICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVzW2ldLmJ1Zik7CisgICAgfQorICAgIHMtPm4gPSAwOworCisgICAgLy8gcmFpc2UgdGhlIGNob3NlbiBvbmUKKyAgICBwaWNyZWYgPSBzLT5mcmFtZXNbYmVzdF9mcmFtZV9pZHhdLmJ1ZjsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgImZyYW1lIGlkICMlZCAocHRzX3RpbWU9JWYpIHNlbGVjdGVkICIKKyAgICAgICAgICAgImZyb20gYSBzZXQgb2YgJWQgaW1hZ2VzXG4iLCBiZXN0X2ZyYW1lX2lkeCwKKyAgICAgICAgICAgcGljcmVmLT5wdHMgKiBhdl9xMmQocy0+dGIpLCBuYl9mcmFtZXMpOworICAgIHMtPmZyYW1lc1tiZXN0X2ZyYW1lX2lkeF0uYnVmID0gTlVMTDsKKworICAgIHJldHVybiBwaWNyZWY7Cit9CisKK3N0YXRpYyBpbnQgdGh1bWJuYWlsX2tlcm5lbChUaHVtYm5haWxDdWRhQ29udGV4dCAqcywgQ1VmdW5jdGlvbiBmdW5jLCBDVXRleHJlZiB0ZXgsIGludCBjaGFubmVscywKKyAgICBpbnQgKmhpc3RvZ3JhbSwgdWludDhfdCAqc3JjX2RwdHIsIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LCBpbnQgc3JjX3BpdGNoLCBpbnQgcGl4ZWxfc2l6ZSkKK3sKKyAgICBDVWRldmljZXB0ciBzcmNfZGV2cHRyID0gKENVZGV2aWNlcHRyKXNyY19kcHRyOworICAgIHZvaWQgKmFyZ3NbXSA9IHsgJmhpc3RvZ3JhbSwgJnNyY193aWR0aCwgJnNyY19oZWlnaHQgfTsKKyAgICBDVURBX0FSUkFZX0RFU0NSSVBUT1IgZGVzYzsKKworICAgIGRlc2MuV2lkdGggPSBzcmNfd2lkdGg7CisgICAgZGVzYy5IZWlnaHQgPSBzcmNfaGVpZ2h0OworICAgIGRlc2MuTnVtQ2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBpZiAocGl4ZWxfc2l6ZSA9PSAxKSB7CisgICAgICAgIGRlc2MuRm9ybWF0ID0gQ1VfQURfRk9STUFUX1VOU0lHTkVEX0lOVDg7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkZXNjLkZvcm1hdCA9IENVX0FEX0ZPUk1BVF9VTlNJR05FRF9JTlQxNjsKKyAgICB9CisKKyAgICBjdVRleFJlZlNldEFkZHJlc3MyRF92Myh0ZXgsICZkZXNjLCBzcmNfZGV2cHRyLCBzcmNfcGl0Y2gpOworICAgIGN1TGF1bmNoS2VybmVsKGZ1bmMsIERJVl9VUChzcmNfd2lkdGgsIEJMT0NLWCksIERJVl9VUChzcmNfaGVpZ2h0LCBCTE9DS1kpLCAxLCBCTE9DS1gsIEJMT0NLWSwgMSwgMCwgMCwgYXJncywgTlVMTCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0aHVtYm5haWwoQVZGaWx0ZXJDb250ZXh0ICpjdHgsIGludCAqaGlzdG9ncmFtLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqaW5fZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopaW4tPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgVGh1bWJuYWlsQ3VkYUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzd2l0Y2ggKGluX2ZyYW1lc19jdHgtPnN3X2Zvcm1hdCkgeworICAgIGNhc2UgQVZfUElYX0ZNVF9OVjEyOgorICAgICAgICB0aHVtYm5haWxfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdWNoYXIsIHMtPmN1X3RleF91Y2hhciwgMSwKKyAgICAgICAgICAgIGhpc3RvZ3JhbSwgaW4tPmRhdGFbMF0sIGluLT53aWR0aCwgaW4tPmhlaWdodCwgaW4tPmxpbmVzaXplWzBdLCAxKTsKKyAgICAgICAgdGh1bWJuYWlsX2tlcm5lbChzLCBzLT5jdV9mdW5jX3VjaGFyMiwgcy0+Y3VfdGV4X3VjaGFyMiwgMiwKKyAgICAgICAgICAgIGhpc3RvZ3JhbSArIDI1NiwgaW4tPmRhdGFbMV0sIGluLT53aWR0aCAvIDIsIGluLT5oZWlnaHQgLyAyLCBpbi0+bGluZXNpemVbMV0sIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICAgICAgdGh1bWJuYWlsX2tlcm5lbChzLCBzLT5jdV9mdW5jX3VjaGFyLCBzLT5jdV90ZXhfdWNoYXIsIDEsCisgICAgICAgICAgICBoaXN0b2dyYW0sIGluLT5kYXRhWzBdLCBpbi0+d2lkdGgsIGluLT5oZWlnaHQsIGluLT5saW5lc2l6ZVswXSwgMSk7CisgICAgICAgIHRodW1ibmFpbF9rZXJuZWwocywgcy0+Y3VfZnVuY191Y2hhciwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgaGlzdG9ncmFtICsgMjU2LCBpbi0+ZGF0YVsxXSwgaW4tPndpZHRoIC8gMiwgaW4tPmhlaWdodCAvIDIsIGluLT5saW5lc2l6ZVsxXSwgMSk7CisgICAgICAgIHRodW1ibmFpbF9rZXJuZWwocywgcy0+Y3VfZnVuY191Y2hhciwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgaGlzdG9ncmFtICsgNTEyLCBpbi0+ZGF0YVsyXSwgaW4tPndpZHRoIC8gMiwgaW4tPmhlaWdodCAvIDIsIGluLT5saW5lc2l6ZVsyXSwgMSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgICAgICB0aHVtYm5haWxfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdWNoYXIsIHMtPmN1X3RleF91Y2hhciwgMSwKKyAgICAgICAgICAgIGhpc3RvZ3JhbSwgaW4tPmRhdGFbMF0sIGluLT53aWR0aCwgaW4tPmhlaWdodCwgaW4tPmxpbmVzaXplWzBdLCAxKTsKKyAgICAgICAgdGh1bWJuYWlsX2tlcm5lbChzLCBzLT5jdV9mdW5jX3VjaGFyLCBzLT5jdV90ZXhfdWNoYXIsIDEsCisgICAgICAgICAgICBoaXN0b2dyYW0gKyAyNTYsIGluLT5kYXRhWzFdLCBpbi0+d2lkdGgsIGluLT5oZWlnaHQsIGluLT5saW5lc2l6ZVsxXSwgMSk7CisgICAgICAgIHRodW1ibmFpbF9rZXJuZWwocywgcy0+Y3VfZnVuY191Y2hhciwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgaGlzdG9ncmFtICsgNTEyLCBpbi0+ZGF0YVsyXSwgaW4tPndpZHRoLCBpbi0+aGVpZ2h0LCBpbi0+bGluZXNpemVbMl0sIDEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUDAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9QMDE2TEU6CisgICAgICAgIHRodW1ibmFpbF9rZXJuZWwocywgcy0+Y3VfZnVuY191c2hvcnQsIHMtPmN1X3RleF91c2hvcnQsIDEsCisgICAgICAgICAgICBoaXN0b2dyYW0sIGluLT5kYXRhWzBdLCBpbi0+d2lkdGgsIGluLT5oZWlnaHQsIGluLT5saW5lc2l6ZVswXSwgMik7CisgICAgICAgIHRodW1ibmFpbF9rZXJuZWwocywgcy0+Y3VfZnVuY191c2hvcnQyLCBzLT5jdV90ZXhfdXNob3J0MiwgMiwKKyAgICAgICAgICAgIGhpc3RvZ3JhbSArIDI1NiwgaW4tPmRhdGFbMV0sIGluLT53aWR0aCAvIDIsIGluLT5oZWlnaHQgLyAyLCBpbi0+bGluZXNpemVbMV0sIDIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2OgorICAgICAgICB0aHVtYm5haWxfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdXNob3J0Miwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgaGlzdG9ncmFtLCBpbi0+ZGF0YVswXSwgaW4tPndpZHRoLCBpbi0+aGVpZ2h0LCBpbi0+bGluZXNpemVbMF0sIDIpOworICAgICAgICB0aHVtYm5haWxfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdXNob3J0Miwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgaGlzdG9ncmFtICsgMjU2LCBpbi0+ZGF0YVsxXSwgaW4tPndpZHRoLCBpbi0+aGVpZ2h0LCBpbi0+bGluZXNpemVbMV0sIDIpOworICAgICAgICB0aHVtYm5haWxfa2VybmVsKHMsIHMtPmN1X2Z1bmNfdXNob3J0Miwgcy0+Y3VfdGV4X3VjaGFyLCAxLAorICAgICAgICAgICAgaGlzdG9ncmFtICsgNTEyLCBpbi0+ZGF0YVsyXSwgaW4tPndpZHRoLCBpbi0+aGVpZ2h0LCBpbi0+bGluZXNpemVbMl0sIDIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCAgPSBpbmxpbmstPmRzdDsKKyAgICBUaHVtYm5haWxDdWRhQ29udGV4dCAqcyAgID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgKmhpc3QgPSBzLT5mcmFtZXNbcy0+bl0uaGlzdG9ncmFtOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpod19mcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilzLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgIEFWQ1VEQURldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGh3X2ZyYW1lc19jdHgtPmRldmljZV9jdHgtPmh3Y3R4OworICAgIENVcmVzdWx0IGVycjsKKyAgICBDVWNvbnRleHQgZHVtbXk7CisgICAgQ1VEQV9NRU1DUFkyRCBjcHkgPSB7IDAgfTsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIC8vIGtlZXAgYSByZWZlcmVuY2Ugb2YgZWFjaCBmcmFtZQorICAgIHMtPmZyYW1lc1tzLT5uXS5idWYgPSBmcmFtZTsKKworICAgIGVyciA9IGN1Q3R4UHVzaEN1cnJlbnQoZGV2aWNlX2h3Y3R4LT5jdWRhX2N0eCk7CisgICAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisKKyAgICBjdU1lbXNldEQ4KHMtPmRhdGEsIDAsIEhJU1RfU0laRSAqIHNpemVvZihpbnQpKTsKKworICAgIHRodW1ibmFpbChjdHgsIChpbnQqKXMtPmRhdGEsIGZyYW1lKTsKKworICAgIGNweS5zcmNNZW1vcnlUeXBlID0gQ1VfTUVNT1JZVFlQRV9ERVZJQ0U7CisgICAgY3B5LmRzdE1lbW9yeVR5cGUgPSBDVV9NRU1PUllUWVBFX0hPU1Q7CisgICAgY3B5LnNyY0RldmljZSA9IHMtPmRhdGE7CisgICAgY3B5LmRzdEhvc3QgPSBoaXN0OworICAgIGNweS5zcmNQaXRjaCA9IEhJU1RfU0laRSAqIHNpemVvZihpbnQpOworICAgIGNweS5kc3RQaXRjaCA9IEhJU1RfU0laRSAqIHNpemVvZihpbnQpOworICAgIGNweS5XaWR0aEluQnl0ZXMgPSBISVNUX1NJWkUgKiBzaXplb2YoaW50KTsKKyAgICBjcHkuSGVpZ2h0ID0gMTsKKworICAgIGVyciA9IGN1TWVtY3B5MkQoJmNweSk7CisgICAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgdHJhbnNmZXJyaW5nIHRoZSBkYXRhIGZyb20gdGhlIENVREEgZnJhbWVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChod19mcmFtZXNfY3R4LT5zd19mb3JtYXQgPT0gQVZfUElYX0ZNVF9OVjEyIHx8IGh3X2ZyYW1lc19jdHgtPnN3X2Zvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAgfHwKKyAgICAgICAgaHdfZnJhbWVzX2N0eC0+c3dfZm9ybWF0ID09IEFWX1BJWF9GTVRfUDAxMExFIHx8IGh3X2ZyYW1lc19jdHgtPnN3X2Zvcm1hdCA9PSBBVl9QSVhfRk1UX1AwMTZMRSkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAyNTY7IGkgPCBISVNUX1NJWkU7IGkrKykKKyAgICAgICAgICAgIGhpc3RbaV0gPSA0ICogaGlzdFtpXTsKKyAgICB9CisKKyAgICBjdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIC8vIG5vIHNlbGVjdGlvbiB1bnRpbCB0aGUgYnVmZmVyIG9mIE4gZnJhbWVzIGlzIGZpbGxlZCB1cAorICAgIHMtPm4rKzsKKyAgICBpZiAocy0+biA8IHMtPm5fZnJhbWVzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgZ2V0X2Jlc3RfZnJhbWUoY3R4KSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIGludCBpOworICAgIFRodW1ibmFpbEN1ZGFDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgaWYgKHMtPmRhdGEpIHsKKyAgICAgICAgY3VNZW1GcmVlKHMtPmRhdGEpOworICAgICAgICBzLT5kYXRhID0gMDsKKyAgICB9CisKKyAgICBpZiAocy0+Y3VfbW9kdWxlKSB7CisgICAgICAgIGN1TW9kdWxlVW5sb2FkKHMtPmN1X21vZHVsZSk7CisgICAgICAgIHMtPmN1X21vZHVsZSA9IE5VTEw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5fZnJhbWVzICYmIHMtPmZyYW1lc1tpXS5idWY7IGkrKykKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+ZnJhbWVzW2ldLmJ1Zik7CisgICAgYXZfZnJlZXAoJnMtPmZyYW1lcyk7Cit9CisKK3N0YXRpYyBpbnQgcmVxdWVzdF9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBsaW5rLT5zcmM7CisgICAgVGh1bWJuYWlsQ3VkYUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgaW50IHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOworCisgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VPRiAmJiBzLT5uKSB7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShsaW5rLCBnZXRfYmVzdF9mcmFtZShjdHgpKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXQgPSBBVkVSUk9SX0VPRjsKKyAgICB9CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZm9ybWF0X2lzX3N1cHBvcnRlZChlbnVtIEFWUGl4ZWxGb3JtYXQgZm10KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHN1cHBvcnRlZF9mb3JtYXRzKTsgaSsrKQorICAgICAgICBpZiAoc3VwcG9ydGVkX2Zvcm1hdHNbaV0gPT0gZm10KQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CisgICAgVGh1bWJuYWlsQ3VkYUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAgICpod19mcmFtZXNfY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilpbmxpbmstPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZDVURBRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4ID0gaHdfZnJhbWVzX2N0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgQ1Vjb250ZXh0IGR1bW15LCBjdWRhX2N0eCA9IGRldmljZV9od2N0eC0+Y3VkYV9jdHg7CisgICAgQ1VyZXN1bHQgZXJyOworCisgICAgZXh0ZXJuIGNoYXIgdmZfdGh1bWJuYWlsX2N1ZGFfcHR4W107CisKKyAgICBlcnIgPSBjdUN0eFB1c2hDdXJyZW50KGN1ZGFfY3R4KTsKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBwdXNoaW5nIGN1ZGEgY29udGV4dFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgZXJyID0gY3VNb2R1bGVMb2FkRGF0YSgmcy0+Y3VfbW9kdWxlLCB2Zl90aHVtYm5haWxfY3VkYV9wdHgpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGxvYWRpbmcgbW9kdWxlIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGN1TW9kdWxlR2V0RnVuY3Rpb24oJnMtPmN1X2Z1bmNfdWNoYXIsIHMtPmN1X21vZHVsZSwgIlRodW1ibmFpbF91Y2hhciIpOworICAgIGN1TW9kdWxlR2V0RnVuY3Rpb24oJnMtPmN1X2Z1bmNfdWNoYXIyLCBzLT5jdV9tb2R1bGUsICJUaHVtYm5haWxfdWNoYXIyIik7CisgICAgY3VNb2R1bGVHZXRGdW5jdGlvbigmcy0+Y3VfZnVuY191c2hvcnQsIHMtPmN1X21vZHVsZSwgIlRodW1ibmFpbF91c2hvcnQiKTsKKyAgICBjdU1vZHVsZUdldEZ1bmN0aW9uKCZzLT5jdV9mdW5jX3VzaG9ydDIsIHMtPmN1X21vZHVsZSwgIlRodW1ibmFpbF91c2hvcnQyIik7CisKKyAgICBjdU1vZHVsZUdldFRleFJlZigmcy0+Y3VfdGV4X3VjaGFyLCBzLT5jdV9tb2R1bGUsICJ1Y2hhcl90ZXgiKTsKKyAgICBjdU1vZHVsZUdldFRleFJlZigmcy0+Y3VfdGV4X3VjaGFyMiwgcy0+Y3VfbW9kdWxlLCAidWNoYXIyX3RleCIpOworICAgIGN1TW9kdWxlR2V0VGV4UmVmKCZzLT5jdV90ZXhfdXNob3J0LCBzLT5jdV9tb2R1bGUsICJ1c2hvcnRfdGV4Iik7CisgICAgY3VNb2R1bGVHZXRUZXhSZWYoJnMtPmN1X3RleF91c2hvcnQyLCBzLT5jdV9tb2R1bGUsICJ1c2hvcnQyX3RleCIpOworCisgICAgY3VUZXhSZWZTZXRGbGFncyhzLT5jdV90ZXhfdWNoYXIsIENVX1RSU0ZfUkVBRF9BU19JTlRFR0VSKTsKKyAgICBjdVRleFJlZlNldEZsYWdzKHMtPmN1X3RleF91Y2hhcjIsIENVX1RSU0ZfUkVBRF9BU19JTlRFR0VSKTsKKyAgICBjdVRleFJlZlNldEZsYWdzKHMtPmN1X3RleF91c2hvcnQsIENVX1RSU0ZfUkVBRF9BU19JTlRFR0VSKTsKKyAgICBjdVRleFJlZlNldEZsYWdzKHMtPmN1X3RleF91c2hvcnQyLCBDVV9UUlNGX1JFQURfQVNfSU5URUdFUik7CisKKyAgICBjdVRleFJlZlNldEZpbHRlck1vZGUocy0+Y3VfdGV4X3VjaGFyLCBDVV9UUl9GSUxURVJfTU9ERV9MSU5FQVIpOworICAgIGN1VGV4UmVmU2V0RmlsdGVyTW9kZShzLT5jdV90ZXhfdWNoYXIyLCBDVV9UUl9GSUxURVJfTU9ERV9MSU5FQVIpOworICAgIGN1VGV4UmVmU2V0RmlsdGVyTW9kZShzLT5jdV90ZXhfdXNob3J0LCBDVV9UUl9GSUxURVJfTU9ERV9MSU5FQVIpOworICAgIGN1VGV4UmVmU2V0RmlsdGVyTW9kZShzLT5jdV90ZXhfdXNob3J0MiwgQ1VfVFJfRklMVEVSX01PREVfTElORUFSKTsKKworICAgIGVyciA9IGN1TWVtQWxsb2MoJnMtPmRhdGEsIEhJU1RfU0laRSAqIHNpemVvZihpbnQpKTsKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIGN1ZGEgbWVtb3J5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBjdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKKworICAgIHMtPmh3X2ZyYW1lc19jdHggPSBjdHgtPmlucHV0c1swXS0+aHdfZnJhbWVzX2N0eDsKKworICAgIGN0eC0+b3V0cHV0c1swXS0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYocy0+aHdfZnJhbWVzX2N0eCk7CisgICAgaWYgKCFjdHgtPm91dHB1dHNbMF0tPmh3X2ZyYW1lc19jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT50YiA9IGlubGluay0+dGltZV9iYXNlOworCisgICAgaWYgKCFmb3JtYXRfaXNfc3VwcG9ydGVkKGh3X2ZyYW1lc19jdHgtPnN3X2Zvcm1hdCkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgaW5wdXQgZm9ybWF0OiAlc1xuIiwgYXZfZ2V0X3BpeF9mbXRfbmFtZShod19mcmFtZXNfY3R4LT5zd19mb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9DVURBLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisgICAgaWYgKCFmbXRzX2xpc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZtdHNfbGlzdCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0aHVtYm5haWxfY3VkYV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgPSBjb25maWdfcHJvcHMsCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHRodW1ibmFpbF9jdWRhX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3RodW1ibmFpbF9jdWRhID0geworICAgIC5uYW1lICAgICAgICAgID0gInRodW1ibmFpbF9jdWRhIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTZWxlY3QgdGhlIG1vc3QgcmVwcmVzZW50YXRpdmUgZnJhbWUgaW4gYSBnaXZlbiBzZXF1ZW5jZSBvZiBjb25zZWN1dGl2ZSBmcmFtZXMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVGh1bWJuYWlsQ3VkYUNvbnRleHQpLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAucXVlcnlfZm9ybWF0cyA9IHF1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSB0aHVtYm5haWxfY3VkYV9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSB0aHVtYm5haWxfY3VkYV9vdXRwdXRzLAorICAgIC5wcml2X2NsYXNzICAgID0gJnRodW1ibmFpbF9jdWRhX2NsYXNzLAorICAgIC5mbGFnc19pbnRlcm5hbCA9IEZGX0ZJTFRFUl9GTEFHX0hXRlJBTUVfQVdBUkUsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdGh1bWJuYWlsX2N1ZGEuY3UgYi9saWJhdmZpbHRlci92Zl90aHVtYm5haWxfY3VkYS5jdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGZhZDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfdGh1bWJuYWlsX2N1ZGEuY3UKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgTlZJRElBIENPUlBPUkFUSU9OLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworZXh0ZXJuICJDIiB7CisKK3RleHR1cmU8dW5zaWduZWQgY2hhciwgMj4gdWNoYXJfdGV4OwordGV4dHVyZTx1Y2hhcjIsIDI+ICB1Y2hhcjJfdGV4OwordGV4dHVyZTx1bnNpZ25lZCBzaG9ydCwgMj4gdXNob3J0X3RleDsKK3RleHR1cmU8dXNob3J0MiwgMj4gIHVzaG9ydDJfdGV4OworCitfX2dsb2JhbF9fIHZvaWQgVGh1bWJuYWlsX3VjaGFyKGludCAqaGlzdG9ncmFtLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCkKK3sKKyAgICBpbnQgeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CisgICAgaW50IHkgPSBibG9ja0lkeC55ICogYmxvY2tEaW0ueSArIHRocmVhZElkeC55OworICAgIGlmICh5IDwgc3JjX2hlaWdodCAmJiB4IDwgc3JjX3dpZHRoKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBwaXhlbCA9IHRleDJEKHVjaGFyX3RleCwgeCwgeSk7CisgICAgICAgIGF0b21pY0FkZCgmaGlzdG9ncmFtW3BpeGVsXSwgMSk7CisgICAgfQorfQorCitfX2dsb2JhbF9fIHZvaWQgVGh1bWJuYWlsX3VjaGFyMihpbnQgKmhpc3RvZ3JhbSwgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQpCit7CisgICAgaW50IHggPSBibG9ja0lkeC54ICogYmxvY2tEaW0ueCArIHRocmVhZElkeC54OworICAgIGludCB5ID0gYmxvY2tJZHgueSAqIGJsb2NrRGltLnkgKyB0aHJlYWRJZHgueTsKKworICAgIGlmICh5IDwgc3JjX2hlaWdodCAmJiB4IDwgc3JjX3dpZHRoKQorICAgIHsKKyAgICAgICAgdWNoYXIyIHBpeGVsID0gdGV4MkQodWNoYXIyX3RleCwgeCwgeSk7CisgICAgICAgIGF0b21pY0FkZCgmaGlzdG9ncmFtW3BpeGVsLnhdLCAxKTsKKyAgICAgICAgYXRvbWljQWRkKCZoaXN0b2dyYW1bMjU2ICsgcGl4ZWwueV0sIDEpOworICAgIH0KK30KKworX19nbG9iYWxfXyB2b2lkIFRodW1ibmFpbF91c2hvcnQoaW50ICpoaXN0b2dyYW0sIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0KQoreworICAgIGludCB4ID0gYmxvY2tJZHgueCAqIGJsb2NrRGltLnggKyB0aHJlYWRJZHgueDsKKyAgICBpbnQgeSA9IGJsb2NrSWR4LnkgKiBibG9ja0RpbS55ICsgdGhyZWFkSWR4Lnk7CisKKyAgICBpZiAoeSA8IHNyY19oZWlnaHQgJiYgeCA8IHNyY193aWR0aCkKKyAgICB7CisgICAgICAgIHVuc2lnbmVkIHNob3J0IHBpeGVsID0gKHRleDJEKHVzaG9ydF90ZXgsIHgsIHkpICsgMTI4KSA+PiA4OworICAgICAgICBhdG9taWNBZGQoJmhpc3RvZ3JhbVtwaXhlbF0sIDEpOworICAgIH0KK30KKworX19nbG9iYWxfXyB2b2lkIFRodW1ibmFpbF91c2hvcnQyKGludCAqaGlzdG9ncmFtLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCkKK3sKKyAgICBpbnQgeCA9IGJsb2NrSWR4LnggKiBibG9ja0RpbS54ICsgdGhyZWFkSWR4Lng7CisgICAgaW50IHkgPSBibG9ja0lkeC55ICogYmxvY2tEaW0ueSArIHRocmVhZElkeC55OworCisgICAgaWYgKHkgPCBzcmNfaGVpZ2h0ICYmIHggPCBzcmNfd2lkdGgpCisgICAgeworICAgICAgICB1c2hvcnQyIHBpeGVsID0gdGV4MkQodXNob3J0Ml90ZXgsIHgsIHkpOworICAgICAgICBhdG9taWNBZGQoJmhpc3RvZ3JhbVsocGl4ZWwueCArIDEyOCkgPj4gOF0sIDEpOworICAgICAgICBhdG9taWNBZGQoJmhpc3RvZ3JhbVsyNTYgKyAocGl4ZWwueSArIDEyOCkgPj4gOF0sIDEpOworICAgIH0KK30KKworfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdGlsZS5jIGIvbGliYXZmaWx0ZXIvdmZfdGlsZS5jCmluZGV4IDlhZjAwYmQuLjQzOTY4OWEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3RpbGUuYworKysgYi9saWJhdmZpbHRlci92Zl90aWxlLmMKQEAgLTIzLDYgKzIzLDcgQEAKICAqIHRpbGUgdmlkZW8gZmlsdGVyCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCkBAIC0zMSwyMSArMzIsMjIgQEAKICNpbmNsdWRlICJ2aWRlby5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFRpbGVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICB1bnNpZ25lZCB3LCBoOwogICAgIHVuc2lnbmVkIG1hcmdpbjsKICAgICB1bnNpZ25lZCBwYWRkaW5nOworICAgIHVuc2lnbmVkIG92ZXJsYXA7CisgICAgdW5zaWduZWQgaW5pdF9wYWRkaW5nOwogICAgIHVuc2lnbmVkIGN1cnJlbnQ7CiAgICAgdW5zaWduZWQgbmJfZnJhbWVzOwogICAgIEZGRHJhd0NvbnRleHQgZHJhdzsKICAgICBGRkRyYXdDb2xvciBibGFuazsKICAgICBBVkZyYW1lICpvdXRfcmVmOworICAgIEFWRnJhbWUgKnByZXZfb3V0X3JlZjsKICAgICB1aW50OF90IHJnYmFfY29sb3JbNF07CiB9IFRpbGVDb250ZXh0OwogCi0jZGVmaW5lIFJFQVNPTkFCTEVfU0laRSAxMDI0Ci0KICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRpbGVDb250ZXh0LCB4KQogI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19WSURFT19QQVJBTXxBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0KIApAQCAtNTksNiArNjEsMTAgQEAKICAgICB7ICJwYWRkaW5nIiwgInNldCBpbm5lciBib3JkZXIgdGhpY2tuZXNzIGluIHBpeGVscyIsIE9GRlNFVChwYWRkaW5nKSwKICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCAxMDI0LCBGTEFHUyB9LAogICAgIHsgImNvbG9yIiwgICAic2V0IHRoZSBjb2xvciBvZiB0aGUgdW51c2VkIGFyZWEiLCBPRkZTRVQocmdiYV9jb2xvciksIEFWX09QVF9UWVBFX0NPTE9SLCB7LnN0ciA9ICJibGFjayJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgIm92ZXJsYXAiLCAic2V0IGhvdyBtYW55IGZyYW1lcyB0byBvdmVybGFwIGZvciBlYWNoIHJlbmRlciIsIE9GRlNFVChvdmVybGFwKSwKKyAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgImluaXRfcGFkZGluZyIsICIgc2V0IGhvdyBtYW55IGZyYW1lcyB0byBpbml0aWFsbHkgcGFkIiwgT0ZGU0VUKGluaXRfcGFkZGluZyksCisgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtNjgsMTIgKzc0LDIxIEBACiB7CiAgICAgVGlsZUNvbnRleHQgKnRpbGUgPSBjdHgtPnByaXY7CiAKLSAgICBpZiAodGlsZS0+dyA+IFJFQVNPTkFCTEVfU0laRSB8fCB0aWxlLT5oID4gUkVBU09OQUJMRV9TSVpFKSB7CisgICAgaWYgKHRpbGUtPncgPiBVSU5UX01BWCAvIHRpbGUtPmgpIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVGlsZSBzaXplICV1eCV1IGlzIGluc2FuZS5cbiIsCiAgICAgICAgICAgICAgICB0aWxlLT53LCB0aWxlLT5oKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKKyAgICBpZiAodGlsZS0+cGFkZGluZykgeworICAgICAgICBpZiAoKHRpbGUtPncgLSAxID4gKFVJTlQzMl9NQVggLSAyICogdGlsZS0+bWFyZ2luKSAvIHRpbGUtPnBhZGRpbmcpIHx8CisgICAgICAgICAgICAodGlsZS0+aCAtIDEgPiAoVUlOVDMyX01BWCAtIDIgKiB0aWxlLT5tYXJnaW4pIC8gdGlsZS0+cGFkZGluZykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvbWJpbmF0aW9uIG9mIFRpbGUgc2l6ZSAldXgldSwgcGFkZGluZyAlZCBhbmQgbWFyZ2luICVkIG92ZXJmbG93cy5cbiIsCisgICAgICAgICAgICAgICAgICAgdGlsZS0+dywgdGlsZS0+aCwgdGlsZS0+cGFkZGluZywgdGlsZS0+bWFyZ2luKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAodGlsZS0+bmJfZnJhbWVzID09IDApIHsKICAgICAgICAgdGlsZS0+bmJfZnJhbWVzID0gdGlsZS0+dyAqIHRpbGUtPmg7CiAgICAgfSBlbHNlIGlmICh0aWxlLT5uYl9mcmFtZXMgPiB0aWxlLT53ICogdGlsZS0+aCkgewpAQCAtODIsNiArOTcsMTcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKKyAgICBpZiAodGlsZS0+b3ZlcmxhcCA+PSB0aWxlLT5uYl9mcmFtZXMpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJvdmVybGFwIG11c3QgYmUgbGVzcyB0aGFuICVkXG4iLCB0aWxlLT5uYl9mcmFtZXMpOworICAgICAgICB0aWxlLT5vdmVybGFwID0gdGlsZS0+bmJfZnJhbWVzIC0gMTsKKyAgICB9CisKKyAgICBpZiAodGlsZS0+aW5pdF9wYWRkaW5nID49IHRpbGUtPm5iX2ZyYW1lcykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgImluaXRfcGFkZGluZyBtdXN0IGJlIGxlc3MgdGhhbiAlZFxuIiwgdGlsZS0+bmJfZnJhbWVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aWxlLT5jdXJyZW50ID0gdGlsZS0+aW5pdF9wYWRkaW5nOworICAgIH0KKwogICAgIHJldHVybiAwOwogfQogCkBAIC0xMTIsMTkgKzEzOCwxOSBAQAogICAgIG91dGxpbmstPmggPSB0aWxlLT5oICogaW5saW5rLT5oICsgdG90YWxfbWFyZ2luX2g7CiAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKICAgICBvdXRsaW5rLT5mcmFtZV9yYXRlID0gYXZfbXVsX3EoaW5saW5rLT5mcmFtZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9tYWtlX3EoMSwgdGlsZS0+bmJfZnJhbWVzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X21ha2VfcSgxLCB0aWxlLT5uYl9mcmFtZXMgLSB0aWxlLT5vdmVybGFwKSk7CiAgICAgZmZfZHJhd19pbml0KCZ0aWxlLT5kcmF3LCBpbmxpbmstPmZvcm1hdCwgMCk7CiAgICAgZmZfZHJhd19jb2xvcigmdGlsZS0+ZHJhdywgJnRpbGUtPmJsYW5rLCB0aWxlLT5yZ2JhX2NvbG9yKTsKIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBnZXRfY3VycmVudF90aWxlX3BvcyhBVkZpbHRlckNvbnRleHQgKmN0eCwgdW5zaWduZWQgKngsIHVuc2lnbmVkICp5KQorc3RhdGljIHZvaWQgZ2V0X3RpbGVfcG9zKEFWRmlsdGVyQ29udGV4dCAqY3R4LCB1bnNpZ25lZCAqeCwgdW5zaWduZWQgKnksIHVuc2lnbmVkIGN1cnJlbnQpCiB7CiAgICAgVGlsZUNvbnRleHQgKnRpbGUgICAgPSBjdHgtPnByaXY7CiAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKLSAgICBjb25zdCB1bnNpZ25lZCB0eCA9IHRpbGUtPmN1cnJlbnQgJSB0aWxlLT53OwotICAgIGNvbnN0IHVuc2lnbmVkIHR5ID0gdGlsZS0+Y3VycmVudCAvIHRpbGUtPnc7CisgICAgY29uc3QgdW5zaWduZWQgdHggPSBjdXJyZW50ICUgdGlsZS0+dzsKKyAgICBjb25zdCB1bnNpZ25lZCB0eSA9IGN1cnJlbnQgLyB0aWxlLT53OwogCiAgICAgKnggPSB0aWxlLT5tYXJnaW4gKyAoaW5saW5rLT53ICsgdGlsZS0+cGFkZGluZykgKiB0eDsKICAgICAqeSA9IHRpbGUtPm1hcmdpbiArIChpbmxpbmstPmggKyB0aWxlLT5wYWRkaW5nKSAqIHR5OwpAQCAtMTM2LDEyICsxNjIsMTMgQEAKICAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOwogICAgIHVuc2lnbmVkIHgwLCB5MDsKIAotICAgIGdldF9jdXJyZW50X3RpbGVfcG9zKGN0eCwgJngwLCAmeTApOworICAgIGdldF90aWxlX3BvcyhjdHgsICZ4MCwgJnkwLCB0aWxlLT5jdXJyZW50KTsKICAgICBmZl9maWxsX3JlY3RhbmdsZSgmdGlsZS0+ZHJhdywgJnRpbGUtPmJsYW5rLAogICAgICAgICAgICAgICAgICAgICAgIG91dF9idWYtPmRhdGEsIG91dF9idWYtPmxpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgIHgwLCB5MCwgaW5saW5rLT53LCBpbmxpbmstPmgpOwogICAgIHRpbGUtPmN1cnJlbnQrKzsKIH0KKwogc3RhdGljIGludCBlbmRfbGFzdF9mcmFtZShBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBUaWxlQ29udGV4dCAqdGlsZSAgICAgPSBjdHgtPnByaXY7CkBAIC0xNTEsOCArMTc4LDEzIEBACiAKICAgICB3aGlsZSAodGlsZS0+Y3VycmVudCA8IHRpbGUtPm5iX2ZyYW1lcykKICAgICAgICAgZHJhd19ibGFua19mcmFtZShjdHgsIG91dF9idWYpOworICAgIHRpbGUtPmN1cnJlbnQgPSB0aWxlLT5vdmVybGFwOworICAgIGlmICh0aWxlLT5jdXJyZW50KSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnRpbGUtPnByZXZfb3V0X3JlZik7CisgICAgICAgIHRpbGUtPnByZXZfb3V0X3JlZiA9IGF2X2ZyYW1lX2Nsb25lKG91dF9idWYpOworICAgIH0KICAgICByZXQgPSBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0X2J1Zik7Ci0gICAgdGlsZS0+Y3VycmVudCA9IDA7CisgICAgdGlsZS0+b3V0X3JlZiA9IE5VTEw7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTY3LDcgKzE5OSw3IEBACiAgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOwogICAgIHVuc2lnbmVkIHgwLCB5MDsKIAotICAgIGlmICghdGlsZS0+Y3VycmVudCkgeworICAgIGlmICghdGlsZS0+b3V0X3JlZikgewogICAgICAgICB0aWxlLT5vdXRfcmVmID0gZmZfZ2V0X3ZpZGVvX2J1ZmZlcihvdXRsaW5rLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oKTsKICAgICAgICAgaWYgKCF0aWxlLT5vdXRfcmVmKSB7CiAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZwaWNyZWYpOwpAQCAtMTc4LDE0ICsyMTAsMjkgQEAKICAgICAgICAgdGlsZS0+b3V0X3JlZi0+aGVpZ2h0ID0gb3V0bGluay0+aDsKIAogICAgICAgICAvKiBmaWxsIHN1cmZhY2Ugb25jZSBmb3IgbWFyZ2luL3BhZGRpbmcgKi8KLSAgICAgICAgaWYgKHRpbGUtPm1hcmdpbiB8fCB0aWxlLT5wYWRkaW5nKQorICAgICAgICBpZiAodGlsZS0+bWFyZ2luIHx8IHRpbGUtPnBhZGRpbmcgfHwgdGlsZS0+aW5pdF9wYWRkaW5nKQogICAgICAgICAgICAgZmZfZmlsbF9yZWN0YW5nbGUoJnRpbGUtPmRyYXcsICZ0aWxlLT5ibGFuaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUtPm91dF9yZWYtPmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlLT5vdXRfcmVmLT5saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICB0aWxlLT5pbml0X3BhZGRpbmcgPSAwOwogICAgIH0KIAotICAgIGdldF9jdXJyZW50X3RpbGVfcG9zKGN0eCwgJngwLCAmeTApOworICAgIGlmICh0aWxlLT5wcmV2X291dF9yZWYpIHsKKyAgICAgICAgdW5zaWduZWQgeDEsIHkxLCBpOworCisgICAgICAgIGZvciAoaSA9IHRpbGUtPm5iX2ZyYW1lcyAtIHRpbGUtPm92ZXJsYXA7IGkgPCB0aWxlLT5uYl9mcmFtZXM7IGkrKykgeworICAgICAgICAgICAgZ2V0X3RpbGVfcG9zKGN0eCwgJngxLCAmeTEsIGkpOworICAgICAgICAgICAgZ2V0X3RpbGVfcG9zKGN0eCwgJngwLCAmeTAsIGkgLSAodGlsZS0+bmJfZnJhbWVzIC0gdGlsZS0+b3ZlcmxhcCkpOworICAgICAgICAgICAgZmZfY29weV9yZWN0YW5nbGUyKCZ0aWxlLT5kcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUtPm91dF9yZWYtPmRhdGEsIHRpbGUtPm91dF9yZWYtPmxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUtPnByZXZfb3V0X3JlZi0+ZGF0YSwgdGlsZS0+cHJldl9vdXRfcmVmLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MCwgeTAsIHgxLCB5MSwgaW5saW5rLT53LCBpbmxpbmstPmgpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBnZXRfdGlsZV9wb3MoY3R4LCAmeDAsICZ5MCwgdGlsZS0+Y3VycmVudCk7CiAgICAgZmZfY29weV9yZWN0YW5nbGUyKCZ0aWxlLT5kcmF3LAogICAgICAgICAgICAgICAgICAgICAgICB0aWxlLT5vdXRfcmVmLT5kYXRhLCB0aWxlLT5vdXRfcmVmLT5saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgcGljcmVmLT5kYXRhLCBwaWNyZWYtPmxpbmVzaXplLApAQCAtMjA2LDExICsyNTMsMTggQEAKICAgICBpbnQgcjsKIAogICAgIHIgPSBmZl9yZXF1ZXN0X2ZyYW1lKGlubGluayk7Ci0gICAgaWYgKHIgPT0gQVZFUlJPUl9FT0YgJiYgdGlsZS0+Y3VycmVudCkKKyAgICBpZiAociA9PSBBVkVSUk9SX0VPRiAmJiB0aWxlLT5jdXJyZW50ICYmIHRpbGUtPm91dF9yZWYpCiAgICAgICAgIHIgPSBlbmRfbGFzdF9mcmFtZShjdHgpOwogICAgIHJldHVybiByOwogfQogCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUaWxlQ29udGV4dCAqdGlsZSA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyYW1lX2ZyZWUoJnRpbGUtPnByZXZfb3V0X3JlZik7Cit9CisKIHN0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB0aWxlX2lucHV0c1tdID0gewogICAgIHsKICAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKQEAgLTIzNCw2ICsyODgsNyBAQAogICAgIC5uYW1lICAgICAgICAgID0gInRpbGUiLAogICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRpbGUgc2V2ZXJhbCBzdWNjZXNzaXZlIGZyYW1lcyB0b2dldGhlci4iKSwKICAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCiAgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAogICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFRpbGVDb250ZXh0KSwKICAgICAuaW5wdXRzICAgICAgICA9IHRpbGVfaW5wdXRzLApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdGludGVybGFjZS5jIGIvbGliYXZmaWx0ZXIvdmZfdGludGVybGFjZS5jCmluZGV4IDhhNzk2Y2UuLmYxMzc5MWQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3RpbnRlcmxhY2UuYworKysgYi9saWJhdmZpbHRlci92Zl90aW50ZXJsYWNlLmMKQEAgLTEsNCArMSw1IEBACiAvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFRob21hcyBNdW5kdCA8dG11bmR0NzVAZ21haWwuY29tPgogICogQ29weXJpZ2h0IChjKSAyMDExIFN0ZWZhbm8gU2FiYXRpbmkKICAqIENvcHlyaWdodCAoYykgMjAxMCBCYXB0aXN0ZSBDb3VkdXJpZXIKICAqIENvcHlyaWdodCAoYykgMjAwMyBNaWNoYWVsIFp1Y2NoaSA8bm90emVkQHhpbWlhbi5jb20+CkBAIC0zNCw4ICszNSw2IEBACiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRJbnRlcmxhY2VDb250ZXh0LCB4KQogI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KLSNkZWZpbmUgVElOVEVSTEFDRV9GTEFHX1ZMUEYgMDEKLSNkZWZpbmUgVElOVEVSTEFDRV9GTEFHX0VYQUNUX1RCIDIKIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHRpbnRlcmxhY2Vfb3B0aW9uc1tdID0gewogICAgIHsibW9kZSIsICAgICAgICAgICAgICAic2VsZWN0IGludGVybGFjZSBtb2RlIiwgT0ZGU0VUKG1vZGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PU1PREVfTUVSR0V9LCAwLCBNT0RFX05CLTEsIEZMQUdTLCAibW9kZSJ9LApAQCAtNTEsNiArNTAsOCBAQAogICAgIHsiZmxhZ3MiLCAgICAgICAgICAgICAic2V0IGZsYWdzIiwgT0ZGU0VUKGZsYWdzKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIDAsICJmbGFncyIgfSwKICAgICB7Imxvd19wYXNzX2ZpbHRlciIsICAgImVuYWJsZSB2ZXJ0aWNhbCBsb3ctcGFzcyBmaWx0ZXIiLCAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVElOVEVSTEFDRV9GTEFHX1ZMUEZ9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImZsYWdzIiB9LAogICAgIHsidmxwZiIsICAgICAgICAgICAgICAiZW5hYmxlIHZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlciIsICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBUSU5URVJMQUNFX0ZMQUdfVkxQRn0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiZmxhZ3MiIH0sCisgICAgeyJjb21wbGV4X2ZpbHRlciIsICAgICJlbmFibGUgY29tcGxleCB2ZXJ0aWNhbCBsb3ctcGFzcyBmaWx0ZXIiLCAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFRJTlRFUkxBQ0VfRkxBR19DVkxQRn0sSU5UX01JTiwgSU5UX01BWCwgRkxBR1MsICJmbGFncyIgfSwKKyAgICB7ImN2bHBmIiwgICAgICAgICAgICAgImVuYWJsZSBjb21wbGV4IHZlcnRpY2FsIGxvdy1wYXNzIGZpbHRlciIsICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVElOVEVSTEFDRV9GTEFHX0NWTFBGfSxJTlRfTUlOLCBJTlRfTUFYLCBGTEFHUywgImZsYWdzIiB9LAogICAgIHsiZXhhY3RfdGIiLCAgICAgICAgICAiZm9yY2UgYSB0aW1lYmFzZSB3aGljaCBjYW4gcmVwcmVzZW50IHRpbWVzdGFtcHMgZXhhY3RseSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFRJTlRFUkxBQ0VfRkxBR19FWEFDVF9UQn0sIElOVF9NSU4sIElOVF9NQVgsIEZMQUdTLCAiZmxhZ3MiIH0sCiAKICAgICB7TlVMTH0KQEAgLTc3LDcgKzc4LDEyIEBACiAgICAgICAgIEFWX1BJWF9GTVRfWVVWNDEwUCwgQVZfUElYX0ZNVF9ZVVY0MTFQLAogICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAsIEFWX1BJWF9GTVRfWVVWNDIyUCwKICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQLCBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwTEUsIEFWX1BJWF9GTVRfWVVWNDIyUDEwTEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwTEUsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwTEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEUsIEFWX1BJWF9GTVRfWVVWNDIyUDEyTEUsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEyTEUsIEFWX1BJWF9GTVRfWVVWNDQ0UDEyTEUsCiAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAxMExFLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTBMRSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwTEUsCiAgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsIEZVTExfU0NBTEVfWVVWSl9GT1JNQVRTLAogICAgICAgICBBVl9QSVhfRk1UX05PTkUKICAgICB9OwpAQCAtODksOCArOTUsMTAgQEAKIH0KIAogc3RhdGljIHZvaWQgbG93cGFzc19saW5lX2ModWludDhfdCAqZHN0cCwgcHRyZGlmZl90IHdpZHRoLCBjb25zdCB1aW50OF90ICpzcmNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSwgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBtcmVmLCBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KQogeworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUgPSBzcmNwICsgbXJlZjsKKyAgICBjb25zdCB1aW50OF90ICpzcmNwX2JlbG93ID0gc3JjcCArIHByZWY7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKICAgICAgICAgLy8gdGhpcyBjYWxjdWxhdGlvbiBpcyBhbiBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIG9mCkBAIC0xMDAsNiArMTA4LDg2IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBsb3dwYXNzX2xpbmVfY18xNih1aW50OF90ICpkc3Q4LCBwdHJkaWZmX3Qgd2lkdGgsIGNvbnN0IHVpbnQ4X3QgKnNyYzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbXJlZiwgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCkKK3sKKyAgICB1aW50MTZfdCAqZHN0cCA9ICh1aW50MTZfdCAqKWRzdDg7CisgICAgY29uc3QgdWludDE2X3QgKnNyY3AgPSAoY29uc3QgdWludDE2X3QgKilzcmM4OworICAgIGNvbnN0IHVpbnQxNl90ICpzcmNwX2Fib3ZlID0gc3JjcCArIG1yZWYgLyAyOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmNwX2JlbG93ID0gc3JjcCArIHByZWYgLyAyOworICAgIGludCBpLCBzcmNfeDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAvLyB0aGlzIGNhbGN1bGF0aW9uIGlzIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgICAgLy8gJzAuNSAqIGN1cnJlbnQgKyAwLjI1ICogYWJvdmUgKyAwLjI1ICogYmVsb3cnCisgICAgICAgIC8vICcxICsnIGlzIGZvciByb3VuZGluZy4KKyAgICAgICAgc3JjX3ggICA9IGF2X2xlMm5lMTYoc3JjcFtpXSkgPDwgMTsKKyAgICAgICAgZHN0cFtpXSA9IGF2X2xlMm5lMTYoKDEgKyBzcmNfeCArIGF2X2xlMm5lMTYoc3JjcF9hYm92ZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhdl9sZTJuZTE2KHNyY3BfYmVsb3dbaV0pKSA+PiAyKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxvd3Bhc3NfbGluZV9jb21wbGV4X2ModWludDhfdCAqZHN0cCwgcHRyZGlmZl90IHdpZHRoLCBjb25zdCB1aW50OF90ICpzcmNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbXJlZiwgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpzcmNwX2Fib3ZlID0gc3JjcCArIG1yZWY7CisgICAgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdyA9IHNyY3AgKyBwcmVmOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUyID0gc3JjcCArIG1yZWYgKiAyOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cyID0gc3JjcCArIHByZWYgKiAyOworICAgIGludCBpLCBzcmNfeCwgc3JjX2FiOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIC8vIHRoaXMgY2FsY3VsYXRpb24gaXMgYW4gaW50ZWdlciByZXByZXNlbnRhdGlvbiBvZgorICAgICAgICAvLyAnMC43NSAqIGN1cnJlbnQgKyAwLjI1ICogYWJvdmUgKyAwLjI1ICogYmVsb3cgLSAwLjEyNSAqIGFib3ZlMiAtIDAuMTI1ICogYmVsb3cyJworICAgICAgICAvLyAnNCArJyBpcyBmb3Igcm91bmRpbmcuCisgICAgICAgIHNyY194ICAgPSBzcmNwW2ldIDw8IDE7CisgICAgICAgIHNyY19hYiAgPSBzcmNwX2Fib3ZlW2ldICsgc3JjcF9iZWxvd1tpXTsKKyAgICAgICAgZHN0cFtpXSA9IGF2X2NsaXBfdWludDgoKDQgKyAoKHNyY3BbaV0gKyBzcmNfeCArIHNyY19hYikgPDwgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBzcmNwX2Fib3ZlMltpXSAtIHNyY3BfYmVsb3cyW2ldKSA+PiAzKTsKKyAgICAgICAgLy8gUHJldmVudCBvdmVyLXNoYXJwZW5pbmc6CisgICAgICAgIC8vIGRzdCBtdXN0IG5vdCBleGNlZWQgc3JjIHdoZW4gdGhlIGF2ZXJhZ2Ugb2YgYWJvdmUgYW5kIGJlbG93CisgICAgICAgIC8vIGlzIGxlc3MgdGhhbiBzcmMuIEFuZCB0aGUgb3RoZXIgd2F5IGFyb3VuZC4KKyAgICAgICAgaWYgKHNyY19hYiA+IHNyY194KSB7CisgICAgICAgICAgICBpZiAoZHN0cFtpXSA8IHNyY3BbaV0pCisgICAgICAgICAgICAgICAgZHN0cFtpXSA9IHNyY3BbaV07CisgICAgICAgIH0gZWxzZSBpZiAoZHN0cFtpXSA+IHNyY3BbaV0pCisgICAgICAgICAgICBkc3RwW2ldID0gc3JjcFtpXTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGxvd3Bhc3NfbGluZV9jb21wbGV4X2NfMTYodWludDhfdCAqZHN0OCwgcHRyZGlmZl90IHdpZHRoLCBjb25zdCB1aW50OF90ICpzcmM4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbXJlZiwgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCkKK3sKKyAgICB1aW50MTZfdCAqZHN0cCA9ICh1aW50MTZfdCAqKWRzdDg7CisgICAgY29uc3QgdWludDE2X3QgKnNyY3AgPSAoY29uc3QgdWludDE2X3QgKilzcmM4OworICAgIGNvbnN0IHVpbnQxNl90ICpzcmNwX2Fib3ZlID0gc3JjcCArIG1yZWYgLyAyOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmNwX2JlbG93ID0gc3JjcCArIHByZWYgLyAyOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmNwX2Fib3ZlMiA9IHNyY3AgKyBtcmVmOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmNwX2JlbG93MiA9IHNyY3AgKyBwcmVmOworICAgIGludCBpLCBkc3RfbGUsIHNyY19sZSwgc3JjX3gsIHNyY19hYjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworICAgICAgICAvLyB0aGlzIGNhbGN1bGF0aW9uIGlzIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24gb2YKKyAgICAgICAgLy8gJzAuNzUgKiBjdXJyZW50ICsgMC4yNSAqIGFib3ZlICsgMC4yNSAqIGJlbG93IC0gMC4xMjUgKiBhYm92ZTIgLSAwLjEyNSAqIGJlbG93MicKKyAgICAgICAgLy8gJzQgKycgaXMgZm9yIHJvdW5kaW5nLgorICAgICAgICBzcmNfbGUgPSBhdl9sZTJuZTE2KHNyY3BbaV0pOworICAgICAgICBzcmNfeCAgPSBzcmNfbGUgPDwgMTsKKyAgICAgICAgc3JjX2FiID0gYXZfbGUybmUxNihzcmNwX2Fib3ZlW2ldKSArIGF2X2xlMm5lMTYoc3JjcF9iZWxvd1tpXSk7CisgICAgICAgIGRzdF9sZSA9IGF2X2NsaXAoKDQgKyAoKHNyY19sZSArIHNyY194ICsgc3JjX2FiKSA8PCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgIC0gYXZfbGUybmUxNihzcmNwX2Fib3ZlMltpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIGF2X2xlMm5lMTYoc3JjcF9iZWxvdzJbaV0pKSA+PiAzLCAwLCBjbGlwX21heCk7CisgICAgICAgIC8vIFByZXZlbnQgb3Zlci1zaGFycGVuaW5nOgorICAgICAgICAvLyBkc3QgbXVzdCBub3QgZXhjZWVkIHNyYyB3aGVuIHRoZSBhdmVyYWdlIG9mIGFib3ZlIGFuZCBiZWxvdworICAgICAgICAvLyBpcyBsZXNzIHRoYW4gc3JjLiBBbmQgdGhlIG90aGVyIHdheSBhcm91bmQuCisgICAgICAgIGlmIChzcmNfYWIgPiBzcmNfeCkgeworICAgICAgICAgICAgaWYgKGRzdF9sZSA8IHNyY19sZSkKKyAgICAgICAgICAgICAgICBkc3RwW2ldID0gYXZfbGUybmUxNihzcmNfbGUpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRzdHBbaV0gPSBhdl9sZTJuZTE2KGRzdF9sZSk7CisgICAgICAgIH0gZWxzZSBpZiAoZHN0X2xlID4gc3JjX2xlKSB7CisgICAgICAgICAgICBkc3RwW2ldID0gYXZfbGUybmUxNihzcmNfbGUpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGRzdHBbaV0gPSBhdl9sZTJuZTE2KGRzdF9sZSk7CisgICAgfQorfQorCiBzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKICAgICBUSW50ZXJsYWNlQ29udGV4dCAqdGludGVybGFjZSA9IGN0eC0+cHJpdjsKQEAgLTEyNiwyOCArMjE0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9tYWtlX3EoMiwgMSkpOwogCiAgICAgaWYgKHRpbnRlcmxhY2UtPm1vZGUgPT0gTU9ERV9QQUQpIHsKLSAgICAgICAgdWludDhfdCBibGFja1s0XSA9IHsgMTYsIDEyOCwgMTI4LCAxNiB9OwotICAgICAgICBpbnQgaSwgcmV0OworICAgICAgICB1aW50OF90IGJsYWNrWzRdID0geyAwLCAwLCAwLCAxNiB9OworICAgICAgICBpbnQgcmV0OworICAgICAgICBmZl9kcmF3X2luaXQoJnRpbnRlcmxhY2UtPmRyYXcsIG91dGxpbmstPmZvcm1hdCwgMCk7CisgICAgICAgIGZmX2RyYXdfY29sb3IoJnRpbnRlcmxhY2UtPmRyYXcsICZ0aW50ZXJsYWNlLT5jb2xvciwgYmxhY2spOwogICAgICAgICBpZiAoZmZfZm10X2lzX2luKG91dGxpbmstPmZvcm1hdCwgZnVsbF9zY2FsZV95dXZqX3BpeF9mbXRzKSkKLSAgICAgICAgICAgIGJsYWNrWzBdID0gYmxhY2tbM10gPSAwOworICAgICAgICAgICAgdGludGVybGFjZS0+Y29sb3IuY29tcFswXS51OFswXSA9IDA7CiAgICAgICAgIHJldCA9IGF2X2ltYWdlX2FsbG9jKHRpbnRlcmxhY2UtPmJsYWNrX2RhdGEsIHRpbnRlcmxhY2UtPmJsYWNrX2xpbmVzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5rLT53LCBvdXRsaW5rLT5oLCBvdXRsaW5rLT5mb3JtYXQsIDE2KTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgIC8qIGZpbGwgYmxhY2sgcGljdHVyZSB3aXRoIGJsYWNrICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIHRpbnRlcmxhY2UtPmJsYWNrX2RhdGFbaV07IGkrKykgewotICAgICAgICAgICAgaW50IGggPSBpID09IDEgfHwgaSA9PSAyID8gQVZfQ0VJTF9SU0hJRlQob3V0bGluay0+aCwgZGVzYy0+bG9nMl9jaHJvbWFfaCkgOiBvdXRsaW5rLT5oOwotICAgICAgICAgICAgbWVtc2V0KHRpbnRlcmxhY2UtPmJsYWNrX2RhdGFbaV0sIGJsYWNrW2ldLAotICAgICAgICAgICAgICAgICAgIHRpbnRlcmxhY2UtPmJsYWNrX2xpbmVzaXplW2ldICogaCk7Ci0gICAgICAgIH0KKyAgICAgICAgZmZfZmlsbF9yZWN0YW5nbGUoJnRpbnRlcmxhY2UtPmRyYXcsICZ0aW50ZXJsYWNlLT5jb2xvciwgdGludGVybGFjZS0+YmxhY2tfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGludGVybGFjZS0+YmxhY2tfbGluZXNpemUsIDAsIDAsIG91dGxpbmstPncsIG91dGxpbmstPmgpOwogICAgIH0KLSAgICBpZiAoKHRpbnRlcmxhY2UtPmZsYWdzICYgVElOVEVSTEFDRV9GTEFHX1ZMUEYpCisgICAgaWYgKHRpbnRlcmxhY2UtPmZsYWdzICYgKFRJTlRFUkxBQ0VfRkxBR19WTFBGIHwgVElOVEVSTEFDRV9GTEFHX0NWTFBGKQogICAgICAgICAgICAgJiYgISh0aW50ZXJsYWNlLT5tb2RlID09IE1PREVfSU5URVJMRUFWRV9UT1AKICAgICAgICAgICAgICAgfHwgdGludGVybGFjZS0+bW9kZSA9PSBNT0RFX0lOVEVSTEVBVkVfQk9UVE9NKSkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgImxvd19wYXNzX2ZpbHRlciBmbGFnIGlnbm9yZWQgd2l0aCBtb2RlICVkXG4iLAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywgImxvd19wYXNzX2ZpbHRlciBmbGFncyBpZ25vcmVkIHdpdGggbW9kZSAlZFxuIiwKICAgICAgICAgICAgICAgICB0aW50ZXJsYWNlLT5tb2RlKTsKLSAgICAgICAgdGludGVybGFjZS0+ZmxhZ3MgJj0gflRJTlRFUkxBQ0VfRkxBR19WTFBGOworICAgICAgICB0aW50ZXJsYWNlLT5mbGFncyAmPSB+KFRJTlRFUkxBQ0VfRkxBR19WTFBGIHwgVElOVEVSTEFDRV9GTEFHX0NWTFBGKTsKICAgICB9CiAgICAgdGludGVybGFjZS0+cHJlb3V0X3RpbWVfYmFzZSA9IGlubGluay0+dGltZV9iYXNlOwogICAgIGlmICh0aW50ZXJsYWNlLT5tb2RlID09IE1PREVfSU5URVJMQUNFWDIpIHsKQEAgLTE3MCwxNCArMjU2LDI2IEBACiAgICAgICAgICh0aW50ZXJsYWNlLT5mbGFncyAmIFRJTlRFUkxBQ0VfRkxBR19FWEFDVF9UQikpCiAgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZSA9IHRpbnRlcmxhY2UtPnByZW91dF90aW1lX2Jhc2U7CiAKLSAgICBpZiAodGludGVybGFjZS0+ZmxhZ3MgJiBUSU5URVJMQUNFX0ZMQUdfVkxQRikgewotICAgICAgICB0aW50ZXJsYWNlLT5sb3dwYXNzX2xpbmUgPSBsb3dwYXNzX2xpbmVfYzsKKyAgICB0aW50ZXJsYWNlLT5jc3AgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgaWYgKHRpbnRlcmxhY2UtPmZsYWdzICYgVElOVEVSTEFDRV9GTEFHX0NWTFBGKSB7CisgICAgICAgIGlmICh0aW50ZXJsYWNlLT5jc3AtPmNvbXBbMF0uZGVwdGggPiA4KQorICAgICAgICAgICAgdGludGVybGFjZS0+bG93cGFzc19saW5lID0gbG93cGFzc19saW5lX2NvbXBsZXhfY18xNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGludGVybGFjZS0+bG93cGFzc19saW5lID0gbG93cGFzc19saW5lX2NvbXBsZXhfYzsKKyAgICAgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICAgICAgZmZfdGludGVybGFjZV9pbml0X3g4Nih0aW50ZXJsYWNlKTsKKyAgICB9IGVsc2UgaWYgKHRpbnRlcmxhY2UtPmZsYWdzICYgVElOVEVSTEFDRV9GTEFHX1ZMUEYpIHsKKyAgICAgICAgaWYgKHRpbnRlcmxhY2UtPmNzcC0+Y29tcFswXS5kZXB0aCA+IDgpCisgICAgICAgICAgICB0aW50ZXJsYWNlLT5sb3dwYXNzX2xpbmUgPSBsb3dwYXNzX2xpbmVfY18xNjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGludGVybGFjZS0+bG93cGFzc19saW5lID0gbG93cGFzc19saW5lX2M7CiAgICAgICAgIGlmIChBUkNIX1g4NikKICAgICAgICAgICAgIGZmX3RpbnRlcmxhY2VfaW5pdF94ODYodGludGVybGFjZSk7CiAgICAgfQogCi0gICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJtb2RlOiVkIGZpbHRlcjolcyBoOiVkIC0+IGg6JWRcbiIsCi0gICAgICAgICAgIHRpbnRlcmxhY2UtPm1vZGUsICh0aW50ZXJsYWNlLT5mbGFncyAmIFRJTlRFUkxBQ0VfRkxBR19WTFBGKSA/ICJvbiIgOiAib2ZmIiwKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIm1vZGU6JWQgZmlsdGVyOiVzIGg6JWQgLT4gaDolZFxuIiwgdGludGVybGFjZS0+bW9kZSwKKyAgICAgICAgICAgKHRpbnRlcmxhY2UtPmZsYWdzICYgVElOVEVSTEFDRV9GTEFHX0NWTFBGKSA/ICJjb21wbGV4IiA6CisgICAgICAgICAgICh0aW50ZXJsYWNlLT5mbGFncyAmIFRJTlRFUkxBQ0VfRkxBR19WTFBGKSA/ICJsaW5lYXIiIDogIm9mZiIsCiAgICAgICAgICAgIGlubGluay0+aCwgb3V0bGluay0+aCk7CiAKICAgICByZXR1cm4gMDsKQEAgLTIxNSwzMSArMzEzLDM0IEBACiAgICAgICAgIGludCBjb2xzICA9IHBsYW5lID09IDEgfHwgcGxhbmUgPT0gMiA/IEFWX0NFSUxfUlNISUZUKCAgICB3LCBoc3ViKSA6IHc7CiAgICAgICAgIHVpbnQ4X3QgKmRzdHAgPSBkc3RbcGxhbmVdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwID0gc3JjW3BsYW5lXTsKKyAgICAgICAgaW50IHNyY3BfbGluZXNpemUgPSBzcmNfbGluZXNpemVbcGxhbmVdICogazsKKyAgICAgICAgaW50IGRzdHBfbGluZXNpemUgPSBkc3RfbGluZXNpemVbcGxhbmVdICogKGludGVybGVhdmUgPyAyIDogMSk7CisgICAgICAgIGludCBjbGlwX21heCA9ICgxIDw8IHRpbnRlcmxhY2UtPmNzcC0+Y29tcFtwbGFuZV0uZGVwdGgpIC0gMTsKIAogICAgICAgICBsaW5lcyA9IChsaW5lcyArIChzcmNfZmllbGQgPT0gRklFTERfVVBQRVIpKSAvIGs7CiAgICAgICAgIGlmIChzcmNfZmllbGQgPT0gRklFTERfTE9XRVIpCiAgICAgICAgICAgICBzcmNwICs9IHNyY19saW5lc2l6ZVtwbGFuZV07CiAgICAgICAgIGlmIChpbnRlcmxlYXZlICYmIGRzdF9maWVsZCA9PSBGSUVMRF9MT1dFUikKICAgICAgICAgICAgIGRzdHAgKz0gZHN0X2xpbmVzaXplW3BsYW5lXTsKLSAgICAgICAgaWYgKGZsYWdzICYgVElOVEVSTEFDRV9GTEFHX1ZMUEYpIHsKLSAgICAgICAgICAgIC8vIExvdy1wYXNzIGZpbHRlcmluZyBpcyByZXF1aXJlZCB3aGVuIGNyZWF0aW5nIGFuIGludGVybGFjZWQgZGVzdGluYXRpb24gZnJvbQotICAgICAgICAgICAgLy8gYSBwcm9ncmVzc2l2ZSBzb3VyY2Ugd2hpY2ggY29udGFpbnMgaGlnaC1mcmVxdWVuY3kgdmVydGljYWwgZGV0YWlsLgotICAgICAgICAgICAgLy8gRmlsdGVyaW5nIHdpbGwgcmVkdWNlIGludGVybGFjZSAndHdpdHRlcicgYW5kIE1vaXJlIHBhdHRlcm5pbmcuCi0gICAgICAgICAgICBpbnQgc3JjcF9saW5lc2l6ZSA9IHNyY19saW5lc2l6ZVtwbGFuZV0gKiBrOwotICAgICAgICAgICAgaW50IGRzdHBfbGluZXNpemUgPSBkc3RfbGluZXNpemVbcGxhbmVdICogKGludGVybGVhdmUgPyAyIDogMSk7CisgICAgICAgIC8vIExvdy1wYXNzIGZpbHRlcmluZyBpcyByZXF1aXJlZCB3aGVuIGNyZWF0aW5nIGFuIGludGVybGFjZWQgZGVzdGluYXRpb24gZnJvbQorICAgICAgICAvLyBhIHByb2dyZXNzaXZlIHNvdXJjZSB3aGljaCBjb250YWlucyBoaWdoLWZyZXF1ZW5jeSB2ZXJ0aWNhbCBkZXRhaWwuCisgICAgICAgIC8vIEZpbHRlcmluZyB3aWxsIHJlZHVjZSBpbnRlcmxhY2UgJ3R3aXR0ZXInIGFuZCBNb2lyZSBwYXR0ZXJuaW5nLgorICAgICAgICBpZiAoZmxhZ3MgJiAoVElOVEVSTEFDRV9GTEFHX1ZMUEYgfCBUSU5URVJMQUNFX0ZMQUdfQ1ZMUEYpKSB7CisgICAgICAgICAgICBpbnQgeCA9ICEhKGZsYWdzICYgVElOVEVSTEFDRV9GTEFHX0NWTFBGKTsKICAgICAgICAgICAgIGZvciAoaCA9IGxpbmVzOyBoID4gMDsgaC0tKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSA9IHNyY3AgLSBzcmNfbGluZXNpemVbcGxhbmVdOwotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cgPSBzcmNwICsgc3JjX2xpbmVzaXplW3BsYW5lXTsKLSAgICAgICAgICAgICAgICBpZiAoaCA9PSBsaW5lcykgc3JjcF9hYm92ZSA9IHNyY3A7IC8vIHRoZXJlIGlzIG5vIGxpbmUgYWJvdmUKLSAgICAgICAgICAgICAgICBpZiAoaCA9PSAxKSBzcmNwX2JlbG93ID0gc3JjcDsgICAgIC8vIHRoZXJlIGlzIG5vIGxpbmUgYmVsb3cKKyAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiA9IHNyY19saW5lc2l6ZVtwbGFuZV07CisgICAgICAgICAgICAgICAgcHRyZGlmZl90IG1yZWYgPSAtcHJlZjsKKyAgICAgICAgICAgICAgICBpZiAoaCA+PSAobGluZXMgLSB4KSkgIG1yZWYgPSAwOyAvLyB0aGVyZSBpcyBubyBsaW5lIGFib3ZlCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaCA8PSAoMSArIHgpKSBwcmVmID0gMDsgLy8gdGhlcmUgaXMgbm8gbGluZSBiZWxvdwogCi0gICAgICAgICAgICAgICAgdGludGVybGFjZS0+bG93cGFzc19saW5lKGRzdHAsIGNvbHMsIHNyY3AsIHNyY3BfYWJvdmUsIHNyY3BfYmVsb3cpOworICAgICAgICAgICAgICAgIHRpbnRlcmxhY2UtPmxvd3Bhc3NfbGluZShkc3RwLCBjb2xzLCBzcmNwLCBtcmVmLCBwcmVmLCBjbGlwX21heCk7CiAgICAgICAgICAgICAgICAgZHN0cCArPSBkc3RwX2xpbmVzaXplOwogICAgICAgICAgICAgICAgIHNyY3AgKz0gc3JjcF9saW5lc2l6ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2X2ltYWdlX2NvcHlfcGxhbmUoZHN0cCwgZHN0X2xpbmVzaXplW3BsYW5lXSAqIChpbnRlcmxlYXZlID8gMiA6IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNwLCBzcmNfbGluZXNpemVbcGxhbmVdKmssIGNvbHMsIGxpbmVzKTsKKyAgICAgICAgICAgIGlmICh0aW50ZXJsYWNlLT5jc3AtPmNvbXBbcGxhbmVdLmRlcHRoID4gOCkKKyAgICAgICAgICAgICAgICBjb2xzICo9IDI7CisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKGRzdHAsIGRzdHBfbGluZXNpemUsIHNyY3AsIHNyY3BfbGluZXNpemUsIGNvbHMsIGxpbmVzKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI4MCwxMiArMzgxLDEyIEBACiAgICAgICAgIGNvcHlfcGljdHVyZV9maWVsZCh0aW50ZXJsYWNlLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKiljdXItPmRhdGEsIGN1ci0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmstPmZvcm1hdCwgaW5saW5rLT53LCBpbmxpbmstPmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGSUVMRF9VUFBFUl9BTkRfTE9XRVIsIDEsIHRpbnRlcmxhY2UtPm1vZGUgPT0gTU9ERV9NRVJHRVgyID8gaW5saW5rLT5mcmFtZV9jb3VudCAmIDEgPyBGSUVMRF9MT1dFUiA6IEZJRUxEX1VQUEVSIDogRklFTERfVVBQRVIsIHRpbnRlcmxhY2UtPmZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX1VQUEVSX0FORF9MT1dFUiwgMSwgdGludGVybGFjZS0+bW9kZSA9PSBNT0RFX01FUkdFWDIgPyBpbmxpbmstPmZyYW1lX2NvdW50X291dCAmIDEgPyBGSUVMRF9MT1dFUiA6IEZJRUxEX1VQUEVSIDogRklFTERfVVBQRVIsIHRpbnRlcmxhY2UtPmZsYWdzKTsKICAgICAgICAgLyogd3JpdGUgZXZlbiBmcmFtZSBsaW5lcyBpbnRvIHRoZSBsb3dlciBmaWVsZCBvZiB0aGUgbmV3IGZyYW1lICovCiAgICAgICAgIGNvcHlfcGljdHVyZV9maWVsZCh0aW50ZXJsYWNlLCBvdXQtPmRhdGEsIG91dC0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKiluZXh0LT5kYXRhLCBuZXh0LT5saW5lc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubGluay0+Zm9ybWF0LCBpbmxpbmstPncsIGlubGluay0+aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJRUxEX1VQUEVSX0FORF9MT1dFUiwgMSwgdGludGVybGFjZS0+bW9kZSA9PSBNT0RFX01FUkdFWDIgPyBpbmxpbmstPmZyYW1lX2NvdW50ICYgMSA/IEZJRUxEX1VQUEVSIDogRklFTERfTE9XRVIgOiBGSUVMRF9MT1dFUiwgdGludGVybGFjZS0+ZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgRklFTERfVVBQRVJfQU5EX0xPV0VSLCAxLCB0aW50ZXJsYWNlLT5tb2RlID09IE1PREVfTUVSR0VYMiA/IGlubGluay0+ZnJhbWVfY291bnRfb3V0ICYgMSA/IEZJRUxEX1VQUEVSIDogRklFTERfTE9XRVIgOiBGSUVMRF9MT1dFUiwgdGludGVybGFjZS0+ZmxhZ3MpOwogICAgICAgICBpZiAodGludGVybGFjZS0+bW9kZSAhPSBNT0RFX01FUkdFWDIpCiAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZ0aW50ZXJsYWNlLT5uZXh0KTsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl90b25lbWFwLmMgYi9saWJhdmZpbHRlci92Zl90b25lbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzMDhiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3RvbmVtYXAuYwpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBWaXR0b3JpbyBHaW92YXJhIDx2aXR0b3Jpby5naW92YXJhQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogdG9uZW1hcCBhbGdvcml0aG1zCisgKi8KKworI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWFzdGVyaW5nX2Rpc3BsYXlfbWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKworI2RlZmluZSBSRUZFUkVOQ0VfV0hJVEUgMTAwLjBmCisKK2VudW0gVG9uZW1hcEFsZ29yaXRobSB7CisgICAgVE9ORU1BUF9OT05FLAorICAgIFRPTkVNQVBfTElORUFSLAorICAgIFRPTkVNQVBfR0FNTUEsCisgICAgVE9ORU1BUF9DTElQLAorICAgIFRPTkVNQVBfUkVJTkhBUkQsCisgICAgVE9ORU1BUF9IQUJMRSwKKyAgICBUT05FTUFQX01PQklVUywKKyAgICBUT05FTUFQX01BWCwKK307CisKK3R5cGVkZWYgc3RydWN0IEx1bWFDb2VmZmljaWVudHMgeworICAgIGRvdWJsZSBjciwgY2csIGNiOworfSBMdW1hQ29lZmZpY2llbnRzOworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgTHVtYUNvZWZmaWNpZW50cyBsdW1hX2NvZWZmaWNpZW50c1tBVkNPTF9TUENfTkJdID0geworICAgIFtBVkNPTF9TUENfRkNDXSAgICAgICAgPSB7IDAuMzAsICAgMC41OSwgICAwLjExICAgfSwKKyAgICBbQVZDT0xfU1BDX0JUNDcwQkddICAgID0geyAwLjI5OSwgIDAuNTg3LCAgMC4xMTQgIH0sCisgICAgW0FWQ09MX1NQQ19TTVBURTE3ME1dICA9IHsgMC4yOTksICAwLjU4NywgIDAuMTE0ICB9LAorICAgIFtBVkNPTF9TUENfQlQ3MDldICAgICAgPSB7IDAuMjEyNiwgMC43MTUyLCAwLjA3MjIgfSwKKyAgICBbQVZDT0xfU1BDX1NNUFRFMjQwTV0gID0geyAwLjIxMiwgIDAuNzAxLCAgMC4wODcgIH0sCisgICAgW0FWQ09MX1NQQ19CVDIwMjBfTkNMXSA9IHsgMC4yNjI3LCAwLjY3ODAsIDAuMDU5MyB9LAorICAgIFtBVkNPTF9TUENfQlQyMDIwX0NMXSAgPSB7IDAuMjYyNywgMC42NzgwLCAwLjA1OTMgfSwKK307CisKK3R5cGVkZWYgc3RydWN0IFRvbmVtYXBDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGVudW0gVG9uZW1hcEFsZ29yaXRobSB0b25lbWFwOworICAgIGRvdWJsZSBwYXJhbTsKKyAgICBkb3VibGUgZGVzYXQ7CisgICAgZG91YmxlIHBlYWs7CisKKyAgICBjb25zdCBMdW1hQ29lZmZpY2llbnRzICpjb2VmZnM7Cit9IFRvbmVtYXBDb250ZXh0OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9HQlJQRjMyLAorICAgIEFWX1BJWF9GTVRfR0JSQVBGMzIsCisgICAgQVZfUElYX0ZNVF9OT05FLAorfTsKKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIHJldHVybiBmZl9zZXRfY29tbW9uX2Zvcm1hdHMoY3R4LCBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKSk7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFRvbmVtYXBDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgc3dpdGNoKHMtPnRvbmVtYXApIHsKKyAgICBjYXNlIFRPTkVNQVBfR0FNTUE6CisgICAgICAgIGlmIChpc25hbihzLT5wYXJhbSkpCisgICAgICAgICAgICBzLT5wYXJhbSA9IDEuOGY7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVE9ORU1BUF9SRUlOSEFSRDoKKyAgICAgICAgaWYgKCFpc25hbihzLT5wYXJhbSkpCisgICAgICAgICAgICBzLT5wYXJhbSA9ICgxLjBmIC0gcy0+cGFyYW0pIC8gcy0+cGFyYW07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVE9ORU1BUF9NT0JJVVM6CisgICAgICAgIGlmIChpc25hbihzLT5wYXJhbSkpCisgICAgICAgICAgICBzLT5wYXJhbSA9IDAuM2Y7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChpc25hbihzLT5wYXJhbSkpCisgICAgICAgIHMtPnBhcmFtID0gMS4wZjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgZG91YmxlIGRldGVybWluZV9zaWduYWxfcGVhayhBVkZyYW1lICppbikKK3sKKyAgICBBVkZyYW1lU2lkZURhdGEgKnNkID0gYXZfZnJhbWVfZ2V0X3NpZGVfZGF0YShpbiwgQVZfRlJBTUVfREFUQV9DT05URU5UX0xJR0hUX0xFVkVMKTsKKyAgICBkb3VibGUgcGVhayA9IDA7CisKKyAgICBpZiAoc2QpIHsKKyAgICAgICAgQVZDb250ZW50TGlnaHRNZXRhZGF0YSAqY2xtID0gKEFWQ29udGVudExpZ2h0TWV0YWRhdGEgKilzZC0+ZGF0YTsKKyAgICAgICAgcGVhayA9IGNsbS0+TWF4Q0xMIC8gUkVGRVJFTkNFX1dISVRFOworICAgIH0KKworICAgIHNkID0gYXZfZnJhbWVfZ2V0X3NpZGVfZGF0YShpbiwgQVZfRlJBTUVfREFUQV9NQVNURVJJTkdfRElTUExBWV9NRVRBREFUQSk7CisgICAgaWYgKCFwZWFrICYmIHNkKSB7CisgICAgICAgIEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhICptZXRhZGF0YSA9IChBVk1hc3RlcmluZ0Rpc3BsYXlNZXRhZGF0YSAqKXNkLT5kYXRhOworICAgICAgICBpZiAobWV0YWRhdGEtPmhhc19sdW1pbmFuY2UpCisgICAgICAgICAgICBwZWFrID0gYXZfcTJkKG1ldGFkYXRhLT5tYXhfbHVtaW5hbmNlKSAvIFJFRkVSRU5DRV9XSElURTsKKyAgICB9CisKKyAgICAvKiBzbXB0ZTIwODQgbmVlZHMgdGhlIHNpZGUgZGF0YSBhYm92ZSB0byB3b3JrIGNvcnJlY3RseQorICAgICAqIGlmIG1pc3NpbmcsIGFzc3VtZSB0aGF0IHRoZSBvcmlnaW5hbCB0cmFuc2ZlciB3YXMgYXJpYi1zdGQtYjY3ICovCisgICAgaWYgKCFwZWFrKQorICAgICAgICBwZWFrID0gMTI7CisKKyAgICByZXR1cm4gcGVhazsKK30KKworc3RhdGljIGZsb2F0IGhhYmxlKGZsb2F0IGluKQoreworICAgIGZsb2F0IGEgPSAwLjE1ZiwgYiA9IDAuNTBmLCBjID0gMC4xMGYsIGQgPSAwLjIwZiwgZSA9IDAuMDJmLCBmID0gMC4zMGY7CisgICAgcmV0dXJuIChpbiAqIChpbiAqIGEgKyBiICogYykgKyBkICogZSkgLyAoaW4gKiAoaW4gKiBhICsgYikgKyBkICogZikgLSBlIC8gZjsKK30KKworc3RhdGljIGZsb2F0IG1vYml1cyhmbG9hdCBpbiwgZmxvYXQgaiwgZG91YmxlIHBlYWspCit7CisgICAgZmxvYXQgYSwgYjsKKworICAgIGlmIChpbiA8PSBqKQorICAgICAgICByZXR1cm4gaW47CisKKyAgICBhID0gLWogKiBqICogKHBlYWsgLSAxLjBmKSAvIChqICogaiAtIDIuMGYgKiBqICsgcGVhayk7CisgICAgYiA9IChqICogaiAtIDIuMGYgKiBqICogcGVhayArIHBlYWspIC8gRkZNQVgocGVhayAtIDEuMGYsIDFlLTYpOworCisgICAgcmV0dXJuIChiICogYiArIDIuMGYgKiBiICogaiArIGogKiBqKSAvIChiIC0gYSkgKiAoaW4gKyBhKSAvIChpbiArIGIpOworfQorCisjZGVmaW5lIE1JWCh4LHksYSkgKHgpICogKDEgLSAoYSkpICsgKHkpICogKGEpCitzdGF0aWMgdm9pZCB0b25lbWFwKFRvbmVtYXBDb250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIGNvbnN0IEFWRnJhbWUgKmluLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MsIGludCB4LCBpbnQgeSwgZG91YmxlIHBlYWspCit7CisgICAgY29uc3QgZmxvYXQgKnJfaW4gPSAoY29uc3QgZmxvYXQgKikoaW4tPmRhdGFbMF0gKyB4ICogZGVzYy0+Y29tcFswXS5zdGVwICsgeSAqIGluLT5saW5lc2l6ZVswXSk7CisgICAgY29uc3QgZmxvYXQgKmJfaW4gPSAoY29uc3QgZmxvYXQgKikoaW4tPmRhdGFbMV0gKyB4ICogZGVzYy0+Y29tcFsxXS5zdGVwICsgeSAqIGluLT5saW5lc2l6ZVsxXSk7CisgICAgY29uc3QgZmxvYXQgKmdfaW4gPSAoY29uc3QgZmxvYXQgKikoaW4tPmRhdGFbMl0gKyB4ICogZGVzYy0+Y29tcFsyXS5zdGVwICsgeSAqIGluLT5saW5lc2l6ZVsyXSk7CisgICAgZmxvYXQgKnJfb3V0ID0gKGZsb2F0ICopKG91dC0+ZGF0YVswXSArIHggKiBkZXNjLT5jb21wWzBdLnN0ZXAgKyB5ICogb3V0LT5saW5lc2l6ZVswXSk7CisgICAgZmxvYXQgKmJfb3V0ID0gKGZsb2F0ICopKG91dC0+ZGF0YVsxXSArIHggKiBkZXNjLT5jb21wWzFdLnN0ZXAgKyB5ICogb3V0LT5saW5lc2l6ZVsxXSk7CisgICAgZmxvYXQgKmdfb3V0ID0gKGZsb2F0ICopKG91dC0+ZGF0YVsyXSArIHggKiBkZXNjLT5jb21wWzJdLnN0ZXAgKyB5ICogb3V0LT5saW5lc2l6ZVsyXSk7CisgICAgZmxvYXQgc2lnLCBzaWdfb3JpZzsKKworICAgIC8qIGxvYWQgdmFsdWVzICovCisgICAgKnJfb3V0ID0gKnJfaW47CisgICAgKmJfb3V0ID0gKmJfaW47CisgICAgKmdfb3V0ID0gKmdfaW47CisKKyAgICAvKiBkZXNhdHVyYXRlIHRvIHByZXZlbnQgdW5uYXR1cmFsIGNvbG9ycyAqLworICAgIGlmIChzLT5kZXNhdCA+IDApIHsKKyAgICAgICAgZmxvYXQgbHVtYSA9IHMtPmNvZWZmcy0+Y3IgKiAqcl9pbiArIHMtPmNvZWZmcy0+Y2cgKiAqZ19pbiArIHMtPmNvZWZmcy0+Y2IgKiAqYl9pbjsKKyAgICAgICAgZmxvYXQgb3ZlcmJyaWdodCA9IEZGTUFYKGx1bWEgLSBzLT5kZXNhdCwgMWUtNikgLyBGRk1BWChsdW1hLCAxZS02KTsKKyAgICAgICAgKnJfb3V0ID0gTUlYKCpyX2luLCBsdW1hLCBvdmVyYnJpZ2h0KTsKKyAgICAgICAgKmdfb3V0ID0gTUlYKCpnX2luLCBsdW1hLCBvdmVyYnJpZ2h0KTsKKyAgICAgICAgKmJfb3V0ID0gTUlYKCpiX2luLCBsdW1hLCBvdmVyYnJpZ2h0KTsKKyAgICB9CisKKyAgICAvKiBwaWNrIHRoZSBicmlnaHRlc3QgY29tcG9uZW50LCByZWR1Y2luZyB0aGUgdmFsdWUgcmFuZ2UgYXMgbmVjZXNzYXJ5CisgICAgICogdG8ga2VlcCB0aGUgZW50aXJlIHNpZ25hbCBpbiByYW5nZSBhbmQgcHJldmVudGluZyBkaXNjb2xvcmF0aW9uIGR1ZSB0bworICAgICAqIG91dC1vZi1ib3VuZHMgY2xpcHBpbmcgKi8KKyAgICBzaWcgPSBGRk1BWChGRk1BWDMoKnJfb3V0LCAqZ19vdXQsICpiX291dCksIDFlLTYpOworICAgIHNpZ19vcmlnID0gc2lnOworCisgICAgc3dpdGNoKHMtPnRvbmVtYXApIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgVE9ORU1BUF9OT05FOgorICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVE9ORU1BUF9MSU5FQVI6CisgICAgICAgIHNpZyA9IHNpZyAqIHMtPnBhcmFtIC8gcGVhazsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUT05FTUFQX0dBTU1BOgorICAgICAgICBzaWcgPSBzaWcgPiAwLjA1ZiA/IHBvdyhzaWcgLyBwZWFrLCAxLjBmIC8gcy0+cGFyYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2lnICogcG93KDAuMDVmIC8gcGVhaywgMS4wZiAvIHMtPnBhcmFtKSAvIDAuMDVmOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRPTkVNQVBfQ0xJUDoKKyAgICAgICAgc2lnID0gYXZfY2xpcGYoc2lnICogcy0+cGFyYW0sIDAsIDEuMGYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRPTkVNQVBfSEFCTEU6CisgICAgICAgIHNpZyA9IGhhYmxlKHNpZykgLyBoYWJsZShwZWFrKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUT05FTUFQX1JFSU5IQVJEOgorICAgICAgICBzaWcgPSBzaWcgLyAoc2lnICsgcy0+cGFyYW0pICogKHBlYWsgKyBzLT5wYXJhbSkgLyBwZWFrOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFRPTkVNQVBfTU9CSVVTOgorICAgICAgICBzaWcgPSBtb2JpdXMoc2lnLCBzLT5wYXJhbSwgcGVhayk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIGFwcGx5IHRoZSBjb21wdXRlZCBzY2FsZSBmYWN0b3IgdG8gdGhlIGNvbG9yLAorICAgICAqIGxpbmVhcmx5IHRvIHByZXZlbnQgZGlzY29sb3JhdGlvbiAqLworICAgICpyX291dCAqPSBzaWcgLyBzaWdfb3JpZzsKKyAgICAqZ19vdXQgKj0gc2lnIC8gc2lnX29yaWc7CisgICAgKmJfb3V0ICo9IHNpZyAvIHNpZ19vcmlnOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmluKQoreworICAgIFRvbmVtYXBDb250ZXh0ICpzID0gbGluay0+ZHN0LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGxpbmstPmRzdC0+b3V0cHV0c1swXTsKKyAgICBBVkZyYW1lICpvdXQ7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChsaW5rLT5mb3JtYXQpOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqb2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgaW50IHJldCwgeCwgeTsKKyAgICBkb3VibGUgcGVhayA9IHMtPnBlYWs7CisKKyAgICBpZiAoIWRlc2MgfHwgIW9kZXNjKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIH0KKworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldCA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZvdXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qIGlucHV0IGFuZCBvdXRwdXQgdHJhbnNmZXIgd2lsbCBiZSBsaW5lYXIgKi8KKyAgICBpZiAoaW4tPmNvbG9yX3RyYyA9PSBBVkNPTF9UUkNfVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW50YWdnZWQgdHJhbnNmZXIsIGFzc3VtaW5nIGxpbmVhciBsaWdodFxuIik7CisgICAgICAgIG91dC0+Y29sb3JfdHJjID0gQVZDT0xfVFJDX0xJTkVBUjsKKyAgICB9IGVsc2UgaWYgKGluLT5jb2xvcl90cmMgIT0gQVZDT0xfVFJDX0xJTkVBUikKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVG9uZW1hcHBpbmcgd29ya3Mgb24gbGluZWFyIGxpZ2h0IG9ubHlcbiIpOworCisgICAgLyogcmVhZCBwZWFrIGZyb20gc2lkZSBkYXRhIGlmIG5vdCBwYXNzZWQgaW4gKi8KKyAgICBpZiAoIXBlYWspIHsKKyAgICAgICAgcGVhayA9IGRldGVybWluZV9zaWduYWxfcGVhayhpbik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJDb21wdXRlZCBzaWduYWwgcGVhazogJWZcbiIsIHBlYWspOworICAgIH0KKworICAgIC8qIGxvYWQgb3JpZ2luYWwgY29sb3Igc3BhY2UgZXZlbiBpZiBwaXhlbCBmb3JtYXQgaXMgUkdCIHRvIGNvbXB1dGUgb3ZlcmJyaWdodHMgKi8KKyAgICBzLT5jb2VmZnMgPSAmbHVtYV9jb2VmZmljaWVudHNbaW4tPmNvbG9yc3BhY2VdOworICAgIGlmIChzLT5kZXNhdCA+IDAgJiYgKGluLT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19VTlNQRUNJRklFRCB8fCAhcy0+Y29lZmZzKSkgeworICAgICAgICBpZiAoaW4tPmNvbG9yc3BhY2UgPT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiTWlzc2luZyBjb2xvciBzcGFjZSBpbmZvcm1hdGlvbiwgIik7CisgICAgICAgIGVsc2UgaWYgKCFzLT5jb2VmZnMpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbnN1cHBvcnRlZCBjb2xvciBzcGFjZSAnJXMnLCAiLAorICAgICAgICAgICAgICAgICAgIGF2X2NvbG9yX3NwYWNlX25hbWUoaW4tPmNvbG9yc3BhY2UpKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiZGVzYXR1cmF0aW9uIGlzIGRpc2FibGVkXG4iKTsKKyAgICAgICAgcy0+ZGVzYXQgPSAwOworICAgIH0KKworICAgIC8qIGRvIHRoZSB0b25lIG1hcCAqLworICAgIGZvciAoeSA9IDA7IHkgPCBvdXQtPmhlaWdodDsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgb3V0LT53aWR0aDsgeCsrKQorICAgICAgICAgICAgdG9uZW1hcChzLCBvdXQsIGluLCBkZXNjLCB4LCB5LCBwZWFrKTsKKworICAgIC8qIGNvcHkvZ2VuZXJhdGUgYWxwaGEgaWYgbmVlZGVkICovCisgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBICYmIG9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkgeworICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVszXSwgb3V0LT5saW5lc2l6ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVszXSwgaW4tPmxpbmVzaXplWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bGluZXNpemVbM10sIG91dGxpbmstPmgpOworICAgIH0gZWxzZSBpZiAob2Rlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBKSB7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBvdXQtPmhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgb3V0LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgQVZfV04zMihvdXQtPmRhdGFbM10gKyB4ICogb2Rlc2MtPmNvbXBbM10uc3RlcCArIHkgKiBvdXQtPmxpbmVzaXplWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgYXZfZmxvYXQyaW50KDEuMGYpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVG9uZW1hcENvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdG9uZW1hcF9vcHRpb25zW10gPSB7CisgICAgeyAidG9uZW1hcCIsICAgICAgInRvbmVtYXAgYWxnb3JpdGhtIHNlbGVjdGlvbiIsIE9GRlNFVCh0b25lbWFwKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFRPTkVNQVBfTk9ORX0sIFRPTkVNQVBfTk9ORSwgVE9ORU1BUF9NQVggLSAxLCBGTEFHUywgInRvbmVtYXAiIH0sCisgICAgeyAgICAgIm5vbmUiLCAgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVE9ORU1BUF9OT05FfSwgICAgICAgICAgICAgIDAsIDAsIEZMQUdTLCAidG9uZW1hcCIgfSwKKyAgICB7ICAgICAibGluZWFyIiwgICAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBUT05FTUFQX0xJTkVBUn0sICAgICAgICAgICAgMCwgMCwgRkxBR1MsICJ0b25lbWFwIiB9LAorICAgIHsgICAgICJnYW1tYSIsICAgIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFRPTkVNQVBfR0FNTUF9LCAgICAgICAgICAgICAwLCAwLCBGTEFHUywgInRvbmVtYXAiIH0sCisgICAgeyAgICAgImNsaXAiLCAgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVE9ORU1BUF9DTElQfSwgICAgICAgICAgICAgIDAsIDAsIEZMQUdTLCAidG9uZW1hcCIgfSwKKyAgICB7ICAgICAicmVpbmhhcmQiLCAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBUT05FTUFQX1JFSU5IQVJEfSwgICAgICAgICAgMCwgMCwgRkxBR1MsICJ0b25lbWFwIiB9LAorICAgIHsgICAgICJoYWJsZSIsICAgIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFRPTkVNQVBfSEFCTEV9LCAgICAgICAgICAgICAwLCAwLCBGTEFHUywgInRvbmVtYXAiIH0sCisgICAgeyAgICAgIm1vYml1cyIsICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gVE9ORU1BUF9NT0JJVVN9LCAgICAgICAgICAgIDAsIDAsIEZMQUdTLCAidG9uZW1hcCIgfSwKKyAgICB7ICJwYXJhbSIsICAgICAgICAidG9uZW1hcCBwYXJhbWV0ZXIiLCBPRkZTRVQocGFyYW0pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gTkFOfSwgREJMX01JTiwgREJMX01BWCwgRkxBR1MgfSwKKyAgICB7ICJkZXNhdCIsICAgICAgICAiZGVzYXR1cmF0aW9uIHN0cmVuZ3RoIiwgT0ZGU0VUKGRlc2F0KSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibCA9IDJ9LCAwLCBEQkxfTUFYLCBGTEFHUyB9LAorICAgIHsgInBlYWsiLCAgICAgICAgICJzaWduYWwgcGVhayBvdmVycmlkZSIsIE9GRlNFVChwZWFrKSwgQVZfT1BUX1RZUEVfRE9VQkxFLCB7LmRibCA9IDB9LCAwLCBEQkxfTUFYLCBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB0b25lbWFwX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lICAgICAgID0gInRvbmVtYXAiLAorICAgIC5pdGVtX25hbWUgICAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgICAgPSB0b25lbWFwX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgICAgICAgPSBBVl9DTEFTU19DQVRFR09SWV9GSUxURVIsCit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdG9uZW1hcF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHRvbmVtYXBfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl90b25lbWFwID0geworICAgIC5uYW1lICAgICAgICAgICAgPSAidG9uZW1hcCIsCisgICAgLmRlc2NyaXB0aW9uICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJDb252ZXJzaW9uIHRvL2Zyb20gZGlmZmVyZW50IGR5bmFtaWMgcmFuZ2VzLiIpLAorICAgIC5pbml0ICAgICAgICAgICAgPSBpbml0LAorICAgIC5xdWVyeV9mb3JtYXRzICAgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgICAgPSBzaXplb2YoVG9uZW1hcENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICAgPSAmdG9uZW1hcF9jbGFzcywKKyAgICAuaW5wdXRzICAgICAgICAgID0gdG9uZW1hcF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgICA9IHRvbmVtYXBfb3V0cHV0cywKK307CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl90cmFuc3Bvc2UuYyBiL2xpYmF2ZmlsdGVyL3ZmX3RyYW5zcG9zZS5jCmluZGV4IDk1NTVmZjIuLjc0YTRiYmMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3RyYW5zcG9zZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3RyYW5zcG9zZS5jCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgpAQCAtNTEsMTMgKzUyLDI0IEBACiAgICAgVFJBTlNQT1NFX0NMT0NLX0ZMSVAsCiB9OwogCit0eXBlZGVmIHN0cnVjdCBUcmFuc1Z0YWJsZSB7CisgICAgdm9pZCAoKnRyYW5zcG9zZV84eDgpKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplKTsKKyAgICB2b2lkICgqdHJhbnNwb3NlX2Jsb2NrKSh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCk7Cit9IFRyYW5zVnRhYmxlOworCiB0eXBlZGVmIHN0cnVjdCBUcmFuc0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCBoc3ViLCB2c3ViOworICAgIGludCBwbGFuZXM7CiAgICAgaW50IHBpeHN0ZXBzWzRdOwogCiAgICAgaW50IHBhc3N0aHJvdWdoOyAgICAvLy88IFBhc3N0aHJvdWdoVHlwZSwgbGFuZHNjYXBlIHBhc3N0aHJvdWdoIG1vZGUgZW5hYmxlZAogICAgIGludCBkaXI7ICAgICAgICAgICAgLy8vPCBUcmFuc3Bvc2VEaXIKKworICAgIFRyYW5zVnRhYmxlIHZ0YWJsZXNbNF07CiB9IFRyYW5zQ29udGV4dDsKIAogc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQpAQCAtNzksNiArOTEsMTA5IEBACiAgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIHBpeF9mbXRzKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZV9ibG9ja184X2ModWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIGludCB4LCB5OworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyssIGRzdCArPSBkc3RfbGluZXNpemUsIHNyYysrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgZHN0W3hdID0gc3JjW3gqc3JjX2xpbmVzaXplXTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNwb3NlXzh4OF84X2ModWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplKQoreworICAgIHRyYW5zcG9zZV9ibG9ja184X2Moc3JjLCBzcmNfbGluZXNpemUsIGRzdCwgZHN0X2xpbmVzaXplLCA4LCA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZV9ibG9ja18xNl9jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIGludCB4LCB5OworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyssIGRzdCArPSBkc3RfbGluZXNpemUsIHNyYyArPSAyKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgKigodWludDE2X3QgKikoZHN0ICsgMip4KSkgPSAqKCh1aW50MTZfdCAqKShzcmMgKyB4KnNyY19saW5lc2l6ZSkpOworfQorCitzdGF0aWMgdm9pZCB0cmFuc3Bvc2VfOHg4XzE2X2ModWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9saW5lc2l6ZSkKK3sKKyAgICB0cmFuc3Bvc2VfYmxvY2tfMTZfYyhzcmMsIHNyY19saW5lc2l6ZSwgZHN0LCBkc3RfbGluZXNpemUsIDgsIDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlX2Jsb2NrXzI0X2ModWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHgsIHk7CisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKywgZHN0ICs9IGRzdF9saW5lc2l6ZSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgICAgICBpbnQzMl90IHYgPSBBVl9SQjI0KHNyYyArIHgqc3JjX2xpbmVzaXplICsgeSozKTsKKyAgICAgICAgICAgIEFWX1dCMjQoZHN0ICsgMyp4LCB2KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgdHJhbnNwb3NlXzh4OF8yNF9jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUpCit7CisgICAgdHJhbnNwb3NlX2Jsb2NrXzI0X2Moc3JjLCBzcmNfbGluZXNpemUsIGRzdCwgZHN0X2xpbmVzaXplLCA4LCA4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYW5zcG9zZV9ibG9ja18zMl9jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKQoreworICAgIGludCB4LCB5OworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyssIGRzdCArPSBkc3RfbGluZXNpemUsIHNyYyArPSA0KSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICAqKCh1aW50MzJfdCAqKShkc3QgKyA0KngpKSA9ICooKHVpbnQzMl90ICopKHNyYyArIHgqc3JjX2xpbmVzaXplKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0cmFuc3Bvc2VfOHg4XzMyX2ModWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9saW5lc2l6ZSkKK3sKKyAgICB0cmFuc3Bvc2VfYmxvY2tfMzJfYyhzcmMsIHNyY19saW5lc2l6ZSwgZHN0LCBkc3RfbGluZXNpemUsIDgsIDgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHJhbnNwb3NlX2Jsb2NrXzQ4X2ModWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpCit7CisgICAgaW50IHgsIHk7CisgICAgZm9yICh5ID0gMDsgeSA8IGg7IHkrKywgZHN0ICs9IGRzdF9saW5lc2l6ZSwgc3JjICs9IDYpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaW50NjRfdCB2ID0gQVZfUkI0OChzcmMgKyB4KnNyY19saW5lc2l6ZSk7CisgICAgICAgICAgICBBVl9XQjQ4KGRzdCArIDYqeCwgdik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRyYW5zcG9zZV84eDhfNDhfYyh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplKQoreworICAgIHRyYW5zcG9zZV9ibG9ja180OF9jKHNyYywgc3JjX2xpbmVzaXplLCBkc3QsIGRzdF9saW5lc2l6ZSwgOCwgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0cmFuc3Bvc2VfYmxvY2tfNjRfYyh1aW50OF90ICpzcmMsIHB0cmRpZmZfdCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkKK3sKKyAgICBpbnQgeCwgeTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrLCBkc3QgKz0gZHN0X2xpbmVzaXplLCBzcmMgKz0gOCkKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykKKyAgICAgICAgICAgICooKHVpbnQ2NF90ICopKGRzdCArIDgqeCkpID0gKigodWludDY0X3QgKikoc3JjICsgeCpzcmNfbGluZXNpemUpKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNwb3NlXzh4OF82NF9jKHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUpCit7CisgICAgdHJhbnNwb3NlX2Jsb2NrXzY0X2Moc3JjLCBzcmNfbGluZXNpemUsIGRzdCwgZHN0X2xpbmVzaXplLCA4LCA4KTsKK30KKwogc3RhdGljIGludCBjb25maWdfcHJvcHNfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IG91dGxpbmstPnNyYzsKQEAgLTEwNiw2ICsyMjEsMTAgQEAKIAogICAgIHMtPmhzdWIgPSBkZXNjX2luLT5sb2cyX2Nocm9tYV93OwogICAgIHMtPnZzdWIgPSBkZXNjX2luLT5sb2cyX2Nocm9tYV9oOworICAgIHMtPnBsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKG91dGxpbmstPmZvcm1hdCk7CisKKyAgICBhdl9hc3NlcnQwKGRlc2NfaW4tPm5iX2NvbXBvbmVudHMgPT0gZGVzY19vdXQtPm5iX2NvbXBvbmVudHMpOworCiAKICAgICBhdl9pbWFnZV9maWxsX21heF9waXhzdGVwcyhzLT5waXhzdGVwcywgTlVMTCwgZGVzY19vdXQpOwogCkBAIC0xMTgsNiArMjM3LDI0IEBACiAgICAgZWxzZQogICAgICAgICBvdXRsaW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwogCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgVHJhbnNWdGFibGUgKnYgPSAmcy0+dnRhYmxlc1tpXTsKKyAgICAgICAgc3dpdGNoIChzLT5waXhzdGVwc1tpXSkgeworICAgICAgICBjYXNlIDE6IHYtPnRyYW5zcG9zZV9ibG9jayA9IHRyYW5zcG9zZV9ibG9ja184X2M7CisgICAgICAgICAgICAgICAgdi0+dHJhbnNwb3NlXzh4OCAgID0gdHJhbnNwb3NlXzh4OF84X2M7ICBicmVhazsKKyAgICAgICAgY2FzZSAyOiB2LT50cmFuc3Bvc2VfYmxvY2sgPSB0cmFuc3Bvc2VfYmxvY2tfMTZfYzsKKyAgICAgICAgICAgICAgICB2LT50cmFuc3Bvc2VfOHg4ICAgPSB0cmFuc3Bvc2VfOHg4XzE2X2M7IGJyZWFrOworICAgICAgICBjYXNlIDM6IHYtPnRyYW5zcG9zZV9ibG9jayA9IHRyYW5zcG9zZV9ibG9ja18yNF9jOworICAgICAgICAgICAgICAgIHYtPnRyYW5zcG9zZV84eDggICA9IHRyYW5zcG9zZV84eDhfMjRfYzsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogdi0+dHJhbnNwb3NlX2Jsb2NrID0gdHJhbnNwb3NlX2Jsb2NrXzMyX2M7CisgICAgICAgICAgICAgICAgdi0+dHJhbnNwb3NlXzh4OCAgID0gdHJhbnNwb3NlXzh4OF8zMl9jOyBicmVhazsKKyAgICAgICAgY2FzZSA2OiB2LT50cmFuc3Bvc2VfYmxvY2sgPSB0cmFuc3Bvc2VfYmxvY2tfNDhfYzsKKyAgICAgICAgICAgICAgICB2LT50cmFuc3Bvc2VfOHg4ICAgPSB0cmFuc3Bvc2VfOHg4XzQ4X2M7IGJyZWFrOworICAgICAgICBjYXNlIDg6IHYtPnRyYW5zcG9zZV9ibG9jayA9IHRyYW5zcG9zZV9ibG9ja182NF9jOworICAgICAgICAgICAgICAgIHYtPnRyYW5zcG9zZV84eDggICA9IHRyYW5zcG9zZV84eDhfNjRfYzsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKICAgICAgICAgICAgInc6JWQgaDolZCBkaXI6JWQgLT4gdzolZCBoOiVkIHJvdGF0aW9uOiVzIHZmbGlwOiVkXG4iLAogICAgICAgICAgICBpbmxpbmstPncsIGlubGluay0+aCwgcy0+ZGlyLCBvdXRsaW5rLT53LCBvdXRsaW5rLT5oLApAQCAtMTQ4LDcgKzI4NSw3IEBACiAgICAgQVZGcmFtZSAqaW4gPSB0ZC0+aW47CiAgICAgaW50IHBsYW5lOwogCi0gICAgZm9yIChwbGFuZSA9IDA7IG91dC0+ZGF0YVtwbGFuZV07IHBsYW5lKyspIHsKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCBzLT5wbGFuZXM7IHBsYW5lKyspIHsKICAgICAgICAgaW50IGhzdWIgICAgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyBzLT5oc3ViIDogMDsKICAgICAgICAgaW50IHZzdWIgICAgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyBzLT52c3ViIDogMDsKICAgICAgICAgaW50IHBpeHN0ZXAgPSBzLT5waXhzdGVwc1twbGFuZV07CkBAIC0xNjAsNiArMjk3LDcgQEAKICAgICAgICAgdWludDhfdCAqZHN0LCAqc3JjOwogICAgICAgICBpbnQgZHN0bGluZXNpemUsIHNyY2xpbmVzaXplOwogICAgICAgICBpbnQgeCwgeTsKKyAgICAgICAgVHJhbnNWdGFibGUgKnYgPSAmcy0+dnRhYmxlc1twbGFuZV07CiAKICAgICAgICAgZHN0bGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKICAgICAgICAgZHN0ICAgICAgICAgPSBvdXQtPmRhdGFbcGxhbmVdICsgc3RhcnQgKiBkc3RsaW5lc2l6ZTsKQEAgLTE3Niw0OSArMzE0LDI1IEBACiAgICAgICAgICAgICBkc3RsaW5lc2l6ZSAqPSAtMTsKICAgICAgICAgfQogCi0gICAgICAgIHN3aXRjaCAocGl4c3RlcCkgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBmb3IgKHkgPSBzdGFydDsgeSA8IGVuZDsgeSsrLCBkc3QgKz0gZHN0bGluZXNpemUpCi0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dHc7IHgrKykKLSAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gc3JjW3ggKiBzcmNsaW5lc2l6ZSArIHldOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyssIGRzdCArPSBkc3RsaW5lc2l6ZSkgewotICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBvdXR3OyB4KyspCi0gICAgICAgICAgICAgICAgICAgICooKHVpbnQxNl90ICopKGRzdCArIDIgKiB4KSkgPQotICAgICAgICAgICAgICAgICAgICAgICAgKigodWludDE2X3QgKikoc3JjICsgeCAqIHNyY2xpbmVzaXplICsgeSAqIDIpKTsKKyAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQgLSA3OyB5ICs9IDgpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBvdXR3IC0gNzsgeCArPSA4KSB7CisgICAgICAgICAgICAgICAgdi0+dHJhbnNwb3NlXzh4OChzcmMgKyB4ICogc3JjbGluZXNpemUgKyB5ICogcGl4c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgKHkgLSBzdGFydCkgKiBkc3RsaW5lc2l6ZSArIHggKiBwaXhzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0bGluZXNpemUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyssIGRzdCArPSBkc3RsaW5lc2l6ZSkgewotICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBvdXR3OyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ID0gQVZfUkIyNChzcmMgKyB4ICogc3JjbGluZXNpemUgKyB5ICogMyk7Ci0gICAgICAgICAgICAgICAgICAgIEFWX1dCMjQoZHN0ICsgMyAqIHgsIHYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBmb3IgKHkgPSBzdGFydDsgeSA8IGVuZDsgeSsrLCBkc3QgKz0gZHN0bGluZXNpemUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgb3V0dzsgeCsrKQotICAgICAgICAgICAgICAgICAgICAqKCh1aW50MzJfdCAqKShkc3QgKyA0ICogeCkpID0KLSAgICAgICAgICAgICAgICAgICAgICAgICooKHVpbnQzMl90ICopKHNyYyArIHggKiBzcmNsaW5lc2l6ZSArIHkgKiA0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKywgZHN0ICs9IGRzdGxpbmVzaXplKSB7Ci0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dHc7IHgrKykgewotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHYgPSBBVl9SQjQ4KHNyYyArIHggKiBzcmNsaW5lc2l6ZSArIHkqNik7Ci0gICAgICAgICAgICAgICAgICAgIEFWX1dCNDgoZHN0ICsgNip4LCB2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKywgZHN0ICs9IGRzdGxpbmVzaXplKSB7Ci0gICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IG91dHc7IHgrKykKLSAgICAgICAgICAgICAgICAgICAgKigodWludDY0X3QgKikoZHN0ICsgOCp4KSkgPSAqKCh1aW50NjRfdCAqKShzcmMgKyB4ICogc3JjbGluZXNpemUgKyB5KjgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKG91dHcgLSB4ID4gMCAmJiBlbmQgLSB5ID4gMCkKKyAgICAgICAgICAgICAgICB2LT50cmFuc3Bvc2VfYmxvY2soc3JjICsgeCAqIHNyY2xpbmVzaXplICsgeSAqIHBpeHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKyAoeSAtIHN0YXJ0KSAqIGRzdGxpbmVzaXplICsgeCAqIHBpeHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGxpbmVzaXplLCBvdXR3IC0geCwgZW5kIC0geSk7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoZW5kIC0geSA+IDApCisgICAgICAgICAgICB2LT50cmFuc3Bvc2VfYmxvY2soc3JjICsgMCAqIHNyY2xpbmVzaXplICsgeSAqIHBpeHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICsgKHkgLSBzdGFydCkgKiBkc3RsaW5lc2l6ZSArIDAgKiBwaXhzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdGxpbmVzaXplLCBvdXR3LCBlbmQgLSB5KTsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTI1MCw3ICszNjQsNyBAQAogICAgIH0KIAogICAgIHRkLmluID0gaW4sIHRkLm91dCA9IG91dDsKLSAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKG91dGxpbmstPmgsIGN0eC0+Z3JhcGgtPm5iX3RocmVhZHMpKTsKKyAgICBjdHgtPmludGVybmFsLT5leGVjdXRlKGN0eCwgZmlsdGVyX3NsaWNlLCAmdGQsIE5VTEwsIEZGTUlOKG91dGxpbmstPmgsIGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpKSk7CiAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKIH0KQEAgLTI2MCwxMCArMzc0LDEwIEBACiAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiB0cmFuc3Bvc2Vfb3B0aW9uc1tdID0gewogICAgIHsgImRpciIsICJzZXQgdHJhbnNwb3NlIGRpcmVjdGlvbiIsIE9GRlNFVChkaXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IFRSQU5TUE9TRV9DQ0xPQ0tfRkxJUCB9LCAwLCA3LCBGTEFHUywgImRpciIgfSwKLSAgICAgICAgeyAiY2Nsb2NrX2ZsaXAiLCAicm90YXRlIGNvdW50ZXItY2xvY2t3aXNlIHdpdGggdmVydGljYWwgZmxpcCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUUkFOU1BPU0VfQ0NMT0NLX0ZMSVAgfSwgLnVuaXQgPSAiZGlyIiB9LAotICAgICAgICB7ICJjbG9jayIsICAgICAgICJyb3RhdGUgY2xvY2t3aXNlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFRSQU5TUE9TRV9DTE9DSyAgICAgICB9LCAudW5pdCA9ICJkaXIiIH0sCi0gICAgICAgIHsgImNjbG9jayIsICAgICAgInJvdGF0ZSBjb3VudGVyLWNsb2Nrd2lzZSIsICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVFJBTlNQT1NFX0NDTE9DSyAgICAgIH0sIC51bml0ID0gImRpciIgfSwKLSAgICAgICAgeyAiY2xvY2tfZmxpcCIsICAicm90YXRlIGNsb2Nrd2lzZSB3aXRoIHZlcnRpY2FsIGZsaXAiLCAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUUkFOU1BPU0VfQ0xPQ0tfRkxJUCAgfSwgLnVuaXQgPSAiZGlyIiB9LAorICAgICAgICB7ICJjY2xvY2tfZmxpcCIsICJyb3RhdGUgY291bnRlci1jbG9ja3dpc2Ugd2l0aCB2ZXJ0aWNhbCBmbGlwIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFRSQU5TUE9TRV9DQ0xPQ0tfRkxJUCB9LCAuZmxhZ3M9RkxBR1MsIC51bml0ID0gImRpciIgfSwKKyAgICAgICAgeyAiY2xvY2siLCAgICAgICAicm90YXRlIGNsb2Nrd2lzZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBUUkFOU1BPU0VfQ0xPQ0sgICAgICAgfSwgLmZsYWdzPUZMQUdTLCAudW5pdCA9ICJkaXIiIH0sCisgICAgICAgIHsgImNjbG9jayIsICAgICAgInJvdGF0ZSBjb3VudGVyLWNsb2Nrd2lzZSIsICAgICAgICAgICAgICAgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gVFJBTlNQT1NFX0NDTE9DSyAgICAgIH0sIC5mbGFncz1GTEFHUywgLnVuaXQgPSAiZGlyIiB9LAorICAgICAgICB7ICJjbG9ja19mbGlwIiwgICJyb3RhdGUgY2xvY2t3aXNlIHdpdGggdmVydGljYWwgZmxpcCIsICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IFRSQU5TUE9TRV9DTE9DS19GTElQICB9LCAuZmxhZ3M9RkxBR1MsIC51bml0ID0gImRpciIgfSwKIAogICAgIHsgInBhc3N0aHJvdWdoIiwgImRvIG5vdCBhcHBseSB0cmFuc3Bvc2l0aW9uIGlmIHRoZSBpbnB1dCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgZ2VvbWV0cnkiLAogICAgICAgT0ZGU0VUKHBhc3N0aHJvdWdoKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1UUkFOU1BPU0VfUFRfVFlQRV9OT05FfSwgIDAsIElOVF9NQVgsIEZMQUdTLCAicGFzc3Rocm91Z2giIH0sCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl91bnNoYXJwLmMgYi9saWJhdmZpbHRlci92Zl91bnNoYXJwLmMKaW5kZXggZDI2NGUyNC4uNDFjY2M1NiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfdW5zaGFycC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3Vuc2hhcnAuYwpAQCAtNDYsNyArNDYsNiBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgogI2luY2x1ZGUgInVuc2hhcnAuaCIKLSNpbmNsdWRlICJ1bnNoYXJwX29wZW5jbC5oIgogCiBzdGF0aWMgdm9pZCBhcHBseV91bnNoYXJwKCAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zdHJpZGUsCkBAIC0xMzQsMjQgKzEzMywxNiBAQAogCiBzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKIHsKLSAgICBpbnQgcmV0ID0gMDsKICAgICBVbnNoYXJwQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKIAotCiAgICAgc2V0X2ZpbHRlcl9wYXJhbSgmcy0+bHVtYSwgICBzLT5sbXNpemVfeCwgcy0+bG1zaXplX3ksIHMtPmxhbW91bnQpOwogICAgIHNldF9maWx0ZXJfcGFyYW0oJnMtPmNocm9tYSwgcy0+Y21zaXplX3gsIHMtPmNtc2l6ZV95LCBzLT5jYW1vdW50KTsKIAotICAgIHMtPmFwcGx5X3Vuc2hhcnAgPSBhcHBseV91bnNoYXJwX2M7Ci0gICAgaWYgKCFDT05GSUdfT1BFTkNMICYmIHMtPm9wZW5jbCkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJPcGVuQ0wgc3VwcG9ydCB3YXMgbm90IGVuYWJsZWQgaW4gdGhpcyBidWlsZCwgY2Fubm90IGJlIHNlbGVjdGVkXG4iKTsKKyAgICBpZiAocy0+bHVtYS5zY2FsZWJpdHMgPj0gMjYgfHwgcy0+Y2hyb21hLnNjYWxlYml0cyA+PSAyNikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJsdW1hIG9yIGNocm9tYSBtYXRyaXggc2l6ZSB0b28gYmlnXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9Ci0gICAgaWYgKENPTkZJR19PUEVOQ0wgJiYgcy0+b3BlbmNsKSB7Ci0gICAgICAgIHMtPmFwcGx5X3Vuc2hhcnAgPSBmZl9vcGVuY2xfYXBwbHlfdW5zaGFycDsKLSAgICAgICAgcmV0ID0gZmZfb3BlbmNsX3Vuc2hhcnBfaW5pdChjdHgpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorICAgIHMtPmFwcGx5X3Vuc2hhcnAgPSBhcHBseV91bnNoYXJwX2M7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTIyMywxMCArMjE0LDYgQEAKIHsKICAgICBVbnNoYXJwQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKIAotICAgIGlmIChDT05GSUdfT1BFTkNMICYmIHMtPm9wZW5jbCkgewotICAgICAgICBmZl9vcGVuY2xfdW5zaGFycF91bmluaXQoY3R4KTsKLSAgICB9Ci0KICAgICBmcmVlX2ZpbHRlcl9wYXJhbSgmcy0+bHVtYSk7CiAgICAgZnJlZV9maWx0ZXJfcGFyYW0oJnMtPmNocm9tYSk7CiB9CkBAIC0yNDQsMjUgKzIzMSwyMiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KICAgICBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dCwgaW4pOwotICAgIGlmIChDT05GSUdfT1BFTkNMICYmIHMtPm9wZW5jbCkgewotICAgICAgICByZXQgPSBmZl9vcGVuY2xfdW5zaGFycF9wcm9jZXNzX2lub3V0X2J1ZihsaW5rLT5kc3QsIGluLCBvdXQpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgIH0KIAogICAgIHJldCA9IHMtPmFwcGx5X3Vuc2hhcnAobGluay0+ZHN0LCBpbiwgb3V0KTsKLWVuZDoKKwogICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKIAotICAgIGlmIChyZXQgPCAwKQorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CiAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKIH0KIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVW5zaGFycENvbnRleHQsIHgpCiAjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQogI2RlZmluZSBNSU5fU0laRSAzCi0jZGVmaW5lIE1BWF9TSVpFIDYzCisjZGVmaW5lIE1BWF9TSVpFIDIzCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gdW5zaGFycF9vcHRpb25zW10gPSB7CiAgICAgeyAibHVtYV9tc2l6ZV94IiwgICAic2V0IGx1bWEgbWF0cml4IGhvcml6b250YWwgc2l6ZSIsICAgT0ZGU0VUKGxtc2l6ZV94KSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsgLmk2NCA9IDUgfSwgTUlOX1NJWkUsIE1BWF9TSVpFLCBGTEFHUyB9LAogICAgIHsgImx4IiwgICAgICAgICAgICAgInNldCBsdW1hIG1hdHJpeCBob3Jpem9udGFsIHNpemUiLCAgIE9GRlNFVChsbXNpemVfeCksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSA1IH0sIE1JTl9TSVpFLCBNQVhfU0laRSwgRkxBR1MgfSwKQEAgLTI3Niw3ICsyNjAsNyBAQAogICAgIHsgImN5IiwgICAgICAgICAgICAgInNldCBjaHJvbWEgbWF0cml4IHZlcnRpY2FsIHNpemUiLCAgIE9GRlNFVChjbXNpemVfeSksIEFWX09QVF9UWVBFX0lOVCwgICB7IC5pNjQgPSA1IH0sIE1JTl9TSVpFLCBNQVhfU0laRSwgRkxBR1MgfSwKICAgICB7ICJjaHJvbWFfYW1vdW50IiwgICJzZXQgY2hyb21hIGVmZmVjdCBzdHJlbmd0aCIsICAgICAgICBPRkZTRVQoY2Ftb3VudCksICBBVl9PUFRfVFlQRV9GTE9BVCwgeyAuZGJsID0gMCB9LCAgICAgICAtMiwgICAgICAgIDUsIEZMQUdTIH0sCiAgICAgeyAiY2EiLCAgICAgICAgICAgICAic2V0IGNocm9tYSBlZmZlY3Qgc3RyZW5ndGgiLCAgICAgICAgT0ZGU0VUKGNhbW91bnQpLCAgQVZfT1BUX1RZUEVfRkxPQVQsIHsgLmRibCA9IDAgfSwgICAgICAgLTIsICAgICAgICA1LCBGTEFHUyB9LAotICAgIHsgIm9wZW5jbCIsICAgICAgICAgInVzZSBPcGVuQ0wgZmlsdGVyaW5nIGNhcGFiaWxpdGllcyIsIE9GRlNFVChvcGVuY2wpLCAgIEFWX09QVF9UWVBFX0JPT0wsICB7IC5pNjQgPSAwIH0sICAgICAgICAwLCAgICAgICAgMSwgRkxBR1MgfSwKKyAgICB7ICJvcGVuY2wiLCAgICAgICAgICJpZ25vcmVkIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQob3BlbmNsKSwgICBBVl9PUFRfVFlQRV9CT09MLCAgeyAuaTY0ID0gMCB9LCAgICAgICAgMCwgICAgICAgIDEsIEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3Vuc2hhcnBfb3BlbmNsLmMgYi9saWJhdmZpbHRlci92Zl91bnNoYXJwX29wZW5jbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzkxODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl91bnNoYXJwX29wZW5jbC5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCisjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9wZW5jbC5oIgorI2luY2x1ZGUgIm9wZW5jbF9zb3VyY2UuaCIKKyNpbmNsdWRlICJ2aWRlby5oIgorCisjZGVmaW5lIE1BWF9ESUFNRVRFUiAyMworCit0eXBlZGVmIHN0cnVjdCBVbnNoYXJwT3BlbkNMQ29udGV4dCB7CisgICAgT3BlbkNMRmlsdGVyQ29udGV4dCBvY2Y7CisKKyAgICBpbnQgICAgICAgICAgICAgIGluaXRpYWxpc2VkOworICAgIGNsX2tlcm5lbCAgICAgICAga2VybmVsOworICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZTsKKworICAgIGZsb2F0IGx1bWFfc2l6ZV94OworICAgIGZsb2F0IGx1bWFfc2l6ZV95OworICAgIGZsb2F0IGx1bWFfYW1vdW50OworICAgIGZsb2F0IGNocm9tYV9zaXplX3g7CisgICAgZmxvYXQgY2hyb21hX3NpemVfeTsKKyAgICBmbG9hdCBjaHJvbWFfYW1vdW50OworCisgICAgaW50IGdsb2JhbDsKKworICAgIGludCBuYl9wbGFuZXM7CisgICAgc3RydWN0IHsKKyAgICAgICAgZmxvYXQgYmx1cl94W01BWF9ESUFNRVRFUl07CisgICAgICAgIGZsb2F0IGJsdXJfeVtNQVhfRElBTUVURVJdOworCisgICAgICAgIGNsX21lbSAgIG1hdHJpeDsKKyAgICAgICAgY2xfbWVtICAgY29lZl94OworICAgICAgICBjbF9tZW0gICBjb2VmX3k7CisKKyAgICAgICAgY2xfaW50ICAgc2l6ZV94OworICAgICAgICBjbF9pbnQgICBzaXplX3k7CisgICAgICAgIGNsX2Zsb2F0IGFtb3VudDsKKyAgICAgICAgY2xfZmxvYXQgdGhyZXNob2xkOworICAgIH0gcGxhbmVbNF07Cit9IFVuc2hhcnBPcGVuQ0xDb250ZXh0OworCisKK3N0YXRpYyBpbnQgdW5zaGFycF9vcGVuY2xfaW5pdChBVkZpbHRlckNvbnRleHQgKmF2Y3R4KQoreworICAgIFVuc2hhcnBPcGVuQ0xDb250ZXh0ICpjdHggPSBhdmN0eC0+cHJpdjsKKyAgICBjbF9pbnQgY2xlOworICAgIGludCBlcnI7CisKKyAgICBlcnIgPSBmZl9vcGVuY2xfZmlsdGVyX2xvYWRfcHJvZ3JhbShhdmN0eCwgJmZmX29wZW5jbF9zb3VyY2VfdW5zaGFycCwgMSk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGN0eC0+Y29tbWFuZF9xdWV1ZSA9IGNsQ3JlYXRlQ29tbWFuZFF1ZXVlKGN0eC0+b2NmLmh3Y3R4LT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+b2NmLmh3Y3R4LT5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmNsZSk7CisgICAgaWYgKCFjdHgtPmNvbW1hbmRfcXVldWUpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIE9wZW5DTCAiCisgICAgICAgICAgICAgICAiY29tbWFuZCBxdWV1ZTogJWQuXG4iLCBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvLyBVc2UgZ2xvYmFsIGtlcm5lbCBpZiBtYXNrIHNpemUgd2lsbCBiZSB0b28gYmlnIGZvciB0aGUgbG9jYWwgc3RvcmUuLgorICAgIGN0eC0+Z2xvYmFsID0gKGN0eC0+bHVtYV9zaXplX3ggICA+IDE3LjBmIHx8CisgICAgICAgICAgICAgICAgICAgY3R4LT5sdW1hX3NpemVfeSAgID4gMTcuMGYgfHwKKyAgICAgICAgICAgICAgICAgICBjdHgtPmNocm9tYV9zaXplX3ggPiAxNy4wZiB8fAorICAgICAgICAgICAgICAgICAgIGN0eC0+Y2hyb21hX3NpemVfeSA+IDE3LjBmKTsKKworICAgIGN0eC0+a2VybmVsID0gY2xDcmVhdGVLZXJuZWwoY3R4LT5vY2YucHJvZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Z2xvYmFsID8gInVuc2hhcnBfZ2xvYmFsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAidW5zaGFycF9sb2NhbCIsICZjbGUpOworICAgIGlmICghY3R4LT5rZXJuZWwpIHsKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGtlcm5lbDogJWQuXG4iLCBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdHgtPmluaXRpYWxpc2VkID0gMTsKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBpZiAoY3R4LT5jb21tYW5kX3F1ZXVlKQorICAgICAgICBjbFJlbGVhc2VDb21tYW5kUXVldWUoY3R4LT5jb21tYW5kX3F1ZXVlKTsKKyAgICBpZiAoY3R4LT5rZXJuZWwpCisgICAgICAgIGNsUmVsZWFzZUtlcm5lbChjdHgtPmtlcm5lbCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB1bnNoYXJwX29wZW5jbF9tYWtlX2ZpbHRlcl9wYXJhbXMoQVZGaWx0ZXJDb250ZXh0ICphdmN0eCkKK3sKKyAgICBVbnNoYXJwT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIGZsb2F0ICptYXRyaXg7CisgICAgZG91YmxlIHZhbCwgc3VtOworICAgIGNsX2ludCBjbGU7CisgICAgY2xfbWVtIGJ1ZmZlcjsKKyAgICBzaXplX3QgbWF0cml4X2J5dGVzOworICAgIGZsb2F0IGRpYW1feCwgZGlhbV95LCBhbW91bnQ7CisgICAgaW50IGVyciwgcCwgeCwgeSwgc2l6ZV94LCBzaXplX3k7CisKKyAgICBkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChjdHgtPm9jZi5vdXRwdXRfZm9ybWF0KTsKKworICAgIGN0eC0+bmJfcGxhbmVzID0gMDsKKyAgICBmb3IgKHAgPSAwOyBwIDwgZGVzYy0+bmJfY29tcG9uZW50czsgcCsrKQorICAgICAgICBjdHgtPm5iX3BsYW5lcyA9IEZGTUFYKGN0eC0+bmJfcGxhbmVzLCBkZXNjLT5jb21wW3BdLnBsYW5lICsgMSk7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgY3R4LT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICBpZiAocCA9PSAwIHx8IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpKSB7CisgICAgICAgICAgICBkaWFtX3ggPSBjdHgtPmx1bWFfc2l6ZV94OworICAgICAgICAgICAgZGlhbV95ID0gY3R4LT5sdW1hX3NpemVfeTsKKyAgICAgICAgICAgIGFtb3VudCA9IGN0eC0+bHVtYV9hbW91bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaWFtX3ggPSBjdHgtPmNocm9tYV9zaXplX3g7CisgICAgICAgICAgICBkaWFtX3kgPSBjdHgtPmNocm9tYV9zaXplX3k7CisgICAgICAgICAgICBhbW91bnQgPSBjdHgtPmNocm9tYV9hbW91bnQ7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZV94ID0gKGludCljZWlsKGRpYW1feCkgfCAxOworICAgICAgICBzaXplX3kgPSAoaW50KWNlaWwoZGlhbV95KSB8IDE7CisgICAgICAgIG1hdHJpeF9ieXRlcyA9IHNpemVfeCAqIHNpemVfeSAqIHNpemVvZihmbG9hdCk7CisKKyAgICAgICAgbWF0cml4ID0gYXZfbWFsbG9jKG1hdHJpeF9ieXRlcyk7CisgICAgICAgIGlmICghbWF0cml4KSB7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBzdW0gPSAwLjA7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCBzaXplX3g7IHgrKykgeworICAgICAgICAgICAgZG91YmxlIGR4ID0gKGRvdWJsZSkoeCAtIHNpemVfeCAvIDIpIC8gZGlhbV94OworICAgICAgICAgICAgc3VtICs9IGN0eC0+cGxhbmVbcF0uYmx1cl94W3hdID0gZXhwKC0xNi4wICogKGR4ICogZHgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZV94OyB4KyspCisgICAgICAgICAgICBjdHgtPnBsYW5lW3BdLmJsdXJfeFt4XSAvPSBzdW07CisKKyAgICAgICAgc3VtID0gMC4wOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc2l6ZV95OyB5KyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBkeSA9IChkb3VibGUpKHkgLSBzaXplX3kgLyAyKSAvIGRpYW1feTsKKyAgICAgICAgICAgIHN1bSArPSBjdHgtPnBsYW5lW3BdLmJsdXJfeVt5XSA9IGV4cCgtMTYuMCAqIChkeSAqIGR5KSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNpemVfeTsgeSsrKQorICAgICAgICAgICAgY3R4LT5wbGFuZVtwXS5ibHVyX3lbeV0gLz0gc3VtOworCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzaXplX3k7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNpemVfeDsgeCsrKSB7CisgICAgICAgICAgICAgICAgdmFsID0gY3R4LT5wbGFuZVtwXS5ibHVyX3hbeF0gKiBjdHgtPnBsYW5lW3BdLmJsdXJfeVt5XTsKKyAgICAgICAgICAgICAgICBtYXRyaXhbeSAqIHNpemVfeCArIHhdID0gdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGN0eC0+Z2xvYmFsKSB7CisgICAgICAgICAgICBidWZmZXIgPSBjbENyZWF0ZUJ1ZmZlcihjdHgtPm9jZi5od2N0eC0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX09OTFkgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9DT1BZX0hPU1RfUFRSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9IT1NUX05PX0FDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeF9ieXRlcywgbWF0cml4LCAmY2xlKTsKKyAgICAgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIG1hdHJpeCBidWZmZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3R4LT5wbGFuZVtwXS5tYXRyaXggPSBidWZmZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmZXIgPSBjbENyZWF0ZUJ1ZmZlcihjdHgtPm9jZi5od2N0eC0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX09OTFkgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9DT1BZX0hPU1RfUFRSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9IT1NUX05PX0FDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjdHgtPnBsYW5lW3BdLmJsdXJfeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBsYW5lW3BdLmJsdXJfeCwgJmNsZSk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB4LWNvZWYgYnVmZmVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICIlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0eC0+cGxhbmVbcF0uY29lZl94ID0gYnVmZmVyOworCisgICAgICAgICAgICBidWZmZXIgPSBjbENyZWF0ZUJ1ZmZlcihjdHgtPm9jZi5od2N0eC0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX09OTFkgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9DT1BZX0hPU1RfUFRSIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9IT1NUX05PX0FDQ0VTUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjdHgtPnBsYW5lW3BdLmJsdXJfeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBsYW5lW3BdLmJsdXJfeSwgJmNsZSk7CisgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB5LWNvZWYgYnVmZmVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICIlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0eC0+cGxhbmVbcF0uY29lZl95ID0gYnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgYXZfZnJlZXAoJm1hdHJpeCk7CisKKyAgICAgICAgY3R4LT5wbGFuZVtwXS5zaXplX3ggPSBzaXplX3g7CisgICAgICAgIGN0eC0+cGxhbmVbcF0uc2l6ZV95ID0gc2l6ZV95OworICAgICAgICBjdHgtPnBsYW5lW3BdLmFtb3VudCA9IGFtb3VudDsKKyAgICB9CisKKyAgICBlcnIgPSAwOworZmFpbDoKKyAgICBhdl9mcmVlcCgmbWF0cml4KTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVuc2hhcnBfb3BlbmNsX2ZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW5wdXQpCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICAgICphdmN0eCA9IGlubGluay0+ZHN0OworICAgIEFWRmlsdGVyTGluayAgICAgKm91dGxpbmsgPSBhdmN0eC0+b3V0cHV0c1swXTsKKyAgICBVbnNoYXJwT3BlbkNMQ29udGV4dCAqY3R4ID0gYXZjdHgtPnByaXY7CisgICAgQVZGcmFtZSAqb3V0cHV0ID0gTlVMTDsKKyAgICBjbF9pbnQgY2xlOworICAgIHNpemVfdCBnbG9iYWxfd29ya1syXTsKKyAgICBzaXplX3QgbG9jYWxfd29ya1syXTsKKyAgICBjbF9tZW0gc3JjLCBkc3Q7CisgICAgaW50IGVyciwgcDsKKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIkZpbHRlciBpbnB1dDogJXMsICV1eCV1ICglIlBSSWQ2NCIpLlxuIiwKKyAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbnB1dC0+Zm9ybWF0KSwKKyAgICAgICAgICAgaW5wdXQtPndpZHRoLCBpbnB1dC0+aGVpZ2h0LCBpbnB1dC0+cHRzKTsKKworICAgIGlmICghaW5wdXQtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoIWN0eC0+aW5pdGlhbGlzZWQpIHsKKyAgICAgICAgZXJyID0gdW5zaGFycF9vcGVuY2xfaW5pdChhdmN0eCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGVyciA9IHVuc2hhcnBfb3BlbmNsX21ha2VfZmlsdGVyX3BhcmFtcyhhdmN0eCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIG91dHB1dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXRwdXQpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZm9yIChwID0gMDsgcCA8IEZGX0FSUkFZX0VMRU1TKG91dHB1dC0+ZGF0YSk7IHArKykgeworICAgICAgICBzcmMgPSAoY2xfbWVtKSBpbnB1dC0+ZGF0YVtwXTsKKyAgICAgICAgZHN0ID0gKGNsX21lbSlvdXRwdXQtPmRhdGFbcF07CisKKyAgICAgICAgaWYgKCFkc3QpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwgMCwgc2l6ZW9mKGNsX21lbSksICZkc3QpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBrZXJuZWwgIgorICAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBpbWFnZSBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsLCAxLCBzaXplb2YoY2xfbWVtKSwgJnNyYyk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgInNvdXJjZSBpbWFnZSBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsLCAyLCBzaXplb2YoY2xfaW50KSwgJmN0eC0+cGxhbmVbcF0uc2l6ZV94KTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQga2VybmVsICIKKyAgICAgICAgICAgICAgICAgICAibWF0cml4IHNpemUgYXJndW1lbnQ6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwgMywgc2l6ZW9mKGNsX2ludCksICZjdHgtPnBsYW5lW3BdLnNpemVfeSk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgIm1hdHJpeCBzaXplIGFyZ3VtZW50OiAlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWwsIDQsIHNpemVvZihjbF9mbG9hdCksICZjdHgtPnBsYW5lW3BdLmFtb3VudCk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgImFtb3VudCBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGlmIChjdHgtPmdsb2JhbCkgeworICAgICAgICAgICAgY2xlID0gY2xTZXRLZXJuZWxBcmcoY3R4LT5rZXJuZWwsIDUsIHNpemVvZihjbF9tZW0pLCAmY3R4LT5wbGFuZVtwXS5tYXRyaXgpOworICAgICAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGtlcm5lbCAiCisgICAgICAgICAgICAgICAgICAgICAgICJtYXRyaXggYXJndW1lbnQ6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjbGUgPSBjbFNldEtlcm5lbEFyZyhjdHgtPmtlcm5lbCwgNSwgc2l6ZW9mKGNsX21lbSksICZjdHgtPnBsYW5lW3BdLmNvZWZfeCk7CisgICAgICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzZXQga2VybmVsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIngtY29lZiBhcmd1bWVudDogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsZSA9IGNsU2V0S2VybmVsQXJnKGN0eC0+a2VybmVsLCA2LCBzaXplb2YoY2xfbWVtKSwgJmN0eC0+cGxhbmVbcF0uY29lZl95KTsKKyAgICAgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHNldCBrZXJuZWwgIgorICAgICAgICAgICAgICAgICAgICAgICAieS1jb2VmIGFyZ3VtZW50OiAlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXJyID0gZmZfb3BlbmNsX2ZpbHRlcl93b3JrX3NpemVfZnJvbV9pbWFnZShhdmN0eCwgZ2xvYmFsX3dvcmssIG91dHB1dCwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmdsb2JhbCA/IDAgOiAxNik7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGxvY2FsX3dvcmtbMF0gID0gMTY7CisgICAgICAgIGxvY2FsX3dvcmtbMV0gID0gMTY7CisKKyAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJSdW4ga2VybmVsIG9uIHBsYW5lICVkICIKKyAgICAgICAgICAgICAgICIoJSJTSVpFX1NQRUNJRklFUiJ4JSJTSVpFX1NQRUNJRklFUiIpLlxuIiwKKyAgICAgICAgICAgICAgIHAsIGdsb2JhbF93b3JrWzBdLCBnbG9iYWxfd29ya1sxXSk7CisKKyAgICAgICAgY2xlID0gY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbChjdHgtPmNvbW1hbmRfcXVldWUsIGN0eC0+a2VybmVsLCAyLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF93b3JrLCBjdHgtPmdsb2JhbCA/IE5VTEwgOiBsb2NhbF93b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVucXVldWUga2VybmVsOiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgY2xlKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsZSA9IGNsRmluaXNoKGN0eC0+Y29tbWFuZF9xdWV1ZSk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmlzaCBjb21tYW5kIHF1ZXVlOiAlZC5cbiIsCisgICAgICAgICAgICAgICBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKG91dHB1dCwgaW5wdXQpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZpbnB1dCk7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJGaWx0ZXIgb3V0cHV0OiAlcywgJXV4JXUgKCUiUFJJZDY0IikuXG4iLAorICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKG91dHB1dC0+Zm9ybWF0KSwKKyAgICAgICAgICAgb3V0cHV0LT53aWR0aCwgb3V0cHV0LT5oZWlnaHQsIG91dHB1dC0+cHRzKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0cHV0KTsKKworZmFpbDoKKyAgICBjbEZpbmlzaChjdHgtPmNvbW1hbmRfcXVldWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmlucHV0KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZvdXRwdXQpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5zaGFycF9vcGVuY2xfdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqYXZjdHgpCit7CisgICAgVW5zaGFycE9wZW5DTENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworICAgIGNsX2ludCBjbGU7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5uYl9wbGFuZXM7IGkrKykgeworICAgICAgICBpZiAoY3R4LT5wbGFuZVtpXS5tYXRyaXgpCisgICAgICAgICAgICBjbFJlbGVhc2VNZW1PYmplY3QoY3R4LT5wbGFuZVtpXS5tYXRyaXgpOworICAgICAgICBpZiAoY3R4LT5wbGFuZVtpXS5jb2VmX3gpCisgICAgICAgICAgICBjbFJlbGVhc2VNZW1PYmplY3QoY3R4LT5wbGFuZVtpXS5jb2VmX3gpOworICAgICAgICBpZiAoY3R4LT5wbGFuZVtpXS5jb2VmX3kpCisgICAgICAgICAgICBjbFJlbGVhc2VNZW1PYmplY3QoY3R4LT5wbGFuZVtpXS5jb2VmX3kpOworICAgIH0KKworICAgIGlmIChjdHgtPmtlcm5lbCkgeworICAgICAgICBjbGUgPSBjbFJlbGVhc2VLZXJuZWwoY3R4LT5rZXJuZWwpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlICIKKyAgICAgICAgICAgICAgICAgICAia2VybmVsOiAlZC5cbiIsIGNsZSk7CisgICAgfQorCisgICAgaWYgKGN0eC0+Y29tbWFuZF9xdWV1ZSkgeworICAgICAgICBjbGUgPSBjbFJlbGVhc2VDb21tYW5kUXVldWUoY3R4LT5jb21tYW5kX3F1ZXVlKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKQorICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVsZWFzZSAiCisgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgcXVldWU6ICVkLlxuIiwgY2xlKTsKKyAgICB9CisKKyAgICBmZl9vcGVuY2xfZmlsdGVyX3VuaW5pdChhdmN0eCk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFVuc2hhcnBPcGVuQ0xDb250ZXh0LCB4KQorI2RlZmluZSBGTEFHUyAoQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0pCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdW5zaGFycF9vcGVuY2xfb3B0aW9uc1tdID0geworICAgIHsgImx1bWFfbXNpemVfeCIsICAgICAiU2V0IGx1bWEgbWFzayBob3Jpem9udGFsIGRpYW1ldGVyIChwaXhlbHMpIiwKKyAgICAgIE9GRlNFVChsdW1hX3NpemVfeCksICAgICBBVl9PUFRfVFlQRV9GTE9BVCwKKyAgICAgIHsgLmRibCA9IDUuMCB9LCAgIDEsIE1BWF9ESUFNRVRFUiwgRkxBR1MgfSwKKyAgICB7ICJseCIsICAgICAgICAgICAgICAgIlNldCBsdW1hIG1hc2sgaG9yaXpvbnRhbCBkaWFtZXRlciAocGl4ZWxzKSIsCisgICAgICBPRkZTRVQobHVtYV9zaXplX3gpLCAgICAgQVZfT1BUX1RZUEVfRkxPQVQsCisgICAgICB7IC5kYmwgPSA1LjAgfSwgICAxLCBNQVhfRElBTUVURVIsIEZMQUdTIH0sCisgICAgeyAibHVtYV9tc2l6ZV95IiwgICAgICJTZXQgbHVtYSBtYXNrIHZlcnRpY2FsIGRpYW1ldGVyIChwaXhlbHMpIiwKKyAgICAgIE9GRlNFVChsdW1hX3NpemVfeSksICAgICBBVl9PUFRfVFlQRV9GTE9BVCwKKyAgICAgIHsgLmRibCA9IDUuMCB9LCAgIDEsIE1BWF9ESUFNRVRFUiwgRkxBR1MgfSwKKyAgICB7ICJseSIsICAgICAgICAgICAgICAgIlNldCBsdW1hIG1hc2sgdmVydGljYWwgZGlhbWV0ZXIgKHBpeGVscykiLAorICAgICAgT0ZGU0VUKGx1bWFfc2l6ZV95KSwgICAgIEFWX09QVF9UWVBFX0ZMT0FULAorICAgICAgeyAuZGJsID0gNS4wIH0sICAgMSwgTUFYX0RJQU1FVEVSLCBGTEFHUyB9LAorICAgIHsgImx1bWFfYW1vdW50IiwgICAgICAiU2V0IGx1bWEgYW1vdW50IChtdWx0aXBsaWVyKSIsCisgICAgICBPRkZTRVQobHVtYV9hbW91bnQpLCAgICAgQVZfT1BUX1RZUEVfRkxPQVQsCisgICAgICB7IC5kYmwgPSAxLjAgfSwgLTEwLCAxMCwgRkxBR1MgfSwKKyAgICB7ICJsYSIsICAgICAgICAgICAgICAgIlNldCBsdW1hIGFtb3VudCAobXVsdGlwbGllcikiLAorICAgICAgT0ZGU0VUKGx1bWFfYW1vdW50KSwgICAgIEFWX09QVF9UWVBFX0ZMT0FULAorICAgICAgeyAuZGJsID0gMS4wIH0sIC0xMCwgMTAsIEZMQUdTIH0sCisKKyAgICB7ICJjaHJvbWFfbXNpemVfeCIsICAgIlNldCBjaHJvbWEgbWFzayBob3Jpem9udGFsIGRpYW1ldGVyIChwaXhlbHMgYWZ0ZXIgc3Vic2FtcGxpbmcpIiwKKyAgICAgIE9GRlNFVChjaHJvbWFfc2l6ZV94KSwgICBBVl9PUFRfVFlQRV9GTE9BVCwKKyAgICAgIHsgLmRibCA9IDUuMCB9LCAgIDEsIE1BWF9ESUFNRVRFUiwgRkxBR1MgfSwKKyAgICB7ICJjeCIsICAgICAgICAgICAgICAgIlNldCBjaHJvbWEgbWFzayBob3Jpem9udGFsIGRpYW1ldGVyIChwaXhlbHMgYWZ0ZXIgc3Vic2FtcGxpbmcpIiwKKyAgICAgIE9GRlNFVChjaHJvbWFfc2l6ZV94KSwgICBBVl9PUFRfVFlQRV9GTE9BVCwKKyAgICAgIHsgLmRibCA9IDUuMCB9LCAgIDEsIE1BWF9ESUFNRVRFUiwgRkxBR1MgfSwKKyAgICB7ICJjaHJvbWFfbXNpemVfeSIsICAgIlNldCBjaHJvbWEgbWFzayB2ZXJ0aWNhbCBkaWFtZXRlciAocGl4ZWxzIGFmdGVyIHN1YnNhbXBsaW5nKSIsCisgICAgICBPRkZTRVQoY2hyb21hX3NpemVfeSksICAgQVZfT1BUX1RZUEVfRkxPQVQsCisgICAgICB7IC5kYmwgPSA1LjAgfSwgICAxLCBNQVhfRElBTUVURVIsIEZMQUdTIH0sCisgICAgeyAiY3kiLCAgICAgICAgICAgICAgICJTZXQgY2hyb21hIG1hc2sgdmVydGljYWwgZGlhbWV0ZXIgKHBpeGVscyBhZnRlciBzdWJzYW1wbGluZykiLAorICAgICAgT0ZGU0VUKGNocm9tYV9zaXplX3kpLCAgIEFWX09QVF9UWVBFX0ZMT0FULAorICAgICAgeyAuZGJsID0gNS4wIH0sICAgMSwgTUFYX0RJQU1FVEVSLCBGTEFHUyB9LAorICAgIHsgImNocm9tYV9hbW91bnQiLCAgICAiU2V0IGNocm9tYSBhbW91bnQgKG11bHRpcGxpZXIpIiwKKyAgICAgIE9GRlNFVChjaHJvbWFfYW1vdW50KSwgICBBVl9PUFRfVFlQRV9GTE9BVCwKKyAgICAgIHsgLmRibCA9IDAuMCB9LCAtMTAsIDEwLCBGTEFHUyB9LAorICAgIHsgImNhIiwgICAgICAgICAgICAgICAiU2V0IGNocm9tYSBhbW91bnQgKG11bHRpcGxpZXIpIiwKKyAgICAgIE9GRlNFVChjaHJvbWFfYW1vdW50KSwgICBBVl9PUFRfVFlQRV9GTE9BVCwKKyAgICAgIHsgLmRibCA9IDAuMCB9LCAtMTAsIDEwLCBGTEFHUyB9LAorCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyh1bnNoYXJwX29wZW5jbCk7CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB1bnNoYXJwX29wZW5jbF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSAmdW5zaGFycF9vcGVuY2xfZmlsdGVyX2ZyYW1lLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gJmZmX29wZW5jbF9maWx0ZXJfY29uZmlnX2lucHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB1bnNoYXJwX29wZW5jbF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gJmZmX29wZW5jbF9maWx0ZXJfY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl91bnNoYXJwX29wZW5jbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidW5zaGFycF9vcGVuY2wiLAorICAgIC5kZXNjcmlwdGlvbiAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSB1bnNoYXJwIG1hc2sgdG8gaW5wdXQgdmlkZW8iKSwKKyAgICAucHJpdl9zaXplICAgICAgPSBzaXplb2YoVW5zaGFycE9wZW5DTENvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZ1bnNoYXJwX29wZW5jbF9jbGFzcywKKyAgICAuaW5pdCAgICAgICAgICAgPSAmZmZfb3BlbmNsX2ZpbHRlcl9pbml0LAorICAgIC51bmluaXQgICAgICAgICA9ICZ1bnNoYXJwX29wZW5jbF91bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgID0gJmZmX29wZW5jbF9maWx0ZXJfcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICAgPSB1bnNoYXJwX29wZW5jbF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgID0gdW5zaGFycF9vcGVuY2xfb3V0cHV0cywKKyAgICAuZmxhZ3NfaW50ZXJuYWwgPSBGRl9GSUxURVJfRkxBR19IV0ZSQU1FX0FXQVJFLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3VzcHAuYyBiL2xpYmF2ZmlsdGVyL3ZmX3VzcHAuYwppbmRleCBmOTYzMjU0Li5kYTQwMjlmIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl91c3BwLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfdXNwcC5jCkBAIC0zNyw3ICszNyw3IEBACiAjZGVmaW5lIE1BWF9MRVZFTCA4IC8qIHF1YWxpdHkgbGV2ZWxzICovCiAjZGVmaW5lIEJMT0NLIDE2CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFVTUFBDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKICAgICBpbnQgbG9nMl9jb3VudDsKICAgICBpbnQgaHN1YiwgdnN1YjsKQEAgLTE4Niw2ICsxODYsNyBAQAogewogICAgIGludCB4LCB5LCBpLCBqOwogICAgIGNvbnN0IGludCBjb3VudCA9IDE8PHAtPmxvZzJfY291bnQ7CisgICAgaW50IHJldDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgaW50IGlzX2Nocm9tYSA9ICEhaTsKQEAgLTIyNyw4ICsyMjgsOCBAQAogICAgICAgICBwLT5mcmFtZS0+cXVhbGl0eSA9IGZmX25vcm1fcXNjYWxlKChxcHN1bSArIHFwY291bnQvMikgLyBxcGNvdW50LCBwLT5xc2NhbGVfdHlwZSkgKiBGRl9RUDJMQU1CREE7CiAgICAgfQogLy8gICAgaW5pdCBwZXIgTUIgcXNjYWxlIHN0dWZmIEZJWE1FCi0gICAgcC0+ZnJhbWUtPmhlaWdodCA9IGhlaWdodDsKLSAgICBwLT5mcmFtZS0+d2lkdGggID0gd2lkdGg7CisgICAgcC0+ZnJhbWUtPmhlaWdodCA9IGhlaWdodCArIEJMT0NLOworICAgIHAtPmZyYW1lLT53aWR0aCAgPSB3aWR0aCArIEJMT0NLOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgY29uc3QgaW50IHgxID0gb2Zmc2V0W2krY291bnQtMV1bMF07CkBAIC0yNDksNyArMjUwLDEyIEBACiAgICAgICAgIHAtPmZyYW1lLT5kYXRhWzJdID0gcC0+c3JjWzJdICsgeDFjICArIHkxYyAgKiBwLT5mcmFtZS0+bGluZXNpemVbMl07CiAgICAgICAgIHAtPmZyYW1lLT5mb3JtYXQgID0gcC0+YXZjdHhfZW5jW2ldLT5waXhfZm10OwogCi0gICAgICAgIGF2Y29kZWNfZW5jb2RlX3ZpZGVvMihwLT5hdmN0eF9lbmNbaV0sICZwa3QsIHAtPmZyYW1lLCAmZ290X3BrdF9wdHIpOworICAgICAgICByZXQgPSBhdmNvZGVjX2VuY29kZV92aWRlbzIocC0+YXZjdHhfZW5jW2ldLCAmcGt0LCBwLT5mcmFtZSwgJmdvdF9wa3RfcHRyKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhwLT5hdmN0eF9lbmNbaV0sIEFWX0xPR19FUlJPUiwgIkVuY29kaW5nIGZhaWxlZFxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCiAgICAgICAgIHAtPmZyYW1lX2RlYyA9IHAtPmF2Y3R4X2VuY1tpXS0+Y29kZWRfZnJhbWU7CiAKICAgICAgICAgb2Zmc2V0ID0gKEJMT0NLLXgxKSArIChCTE9DSy15MSkgKiBwLT5mcmFtZV9kZWMtPmxpbmVzaXplWzBdOwpAQCAtMzUxLDcgKzM1Nyw3IEBACiAgICAgICAgIGF2Y3R4X2VuYy0+Z29wX3NpemUgPSBJTlRfTUFYOwogICAgICAgICBhdmN0eF9lbmMtPm1heF9iX2ZyYW1lcyA9IDA7CiAgICAgICAgIGF2Y3R4X2VuYy0+cGl4X2ZtdCA9IGlubGluay0+Zm9ybWF0OwotICAgICAgICBhdmN0eF9lbmMtPmZsYWdzID0gQVZfQ09ERUNfRkxBR19RU0NBTEUgfCBDT0RFQ19GTEFHX0xPV19ERUxBWTsKKyAgICAgICAgYXZjdHhfZW5jLT5mbGFncyA9IEFWX0NPREVDX0ZMQUdfUVNDQUxFIHwgQVZfQ09ERUNfRkxBR19MT1dfREVMQVk7CiAgICAgICAgIGF2Y3R4X2VuYy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID0gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUw7CiAgICAgICAgIGF2Y3R4X2VuYy0+Z2xvYmFsX3F1YWxpdHkgPSAxMjM7CiAgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibm9fYml0c3RyZWFtIiwgIjEiLCAwKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3ZhZ3VlZGVub2lzZXIuYyBiL2xpYmF2ZmlsdGVyL3ZmX3ZhZ3VlZGVub2lzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzIzY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfdmFndWVkZW5vaXNlci5jCkBAIC0wLDAgKzEsNTg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAzIExlRnVuR3VzLCBsZWZ1bmd1c0BhbHRlcm4ub3JnCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKworI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgVmFndWVEZW5vaXNlckNvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworCisgICAgZmxvYXQgdGhyZXNob2xkOworICAgIGZsb2F0IHBlcmNlbnQ7CisgICAgaW50IG1ldGhvZDsKKyAgICBpbnQgbnN0ZXBzOworICAgIGludCBwbGFuZXM7CisKKyAgICBpbnQgZGVwdGg7CisgICAgaW50IGJwYzsKKyAgICBpbnQgcGVhazsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBwbGFuZWhlaWdodFs0XTsKKyAgICBpbnQgcGxhbmV3aWR0aFs0XTsKKworICAgIGZsb2F0ICpibG9jazsKKyAgICBmbG9hdCAqaW47CisgICAgZmxvYXQgKm91dDsKKyAgICBmbG9hdCAqdG1wOworCisgICAgaW50IGhsb3dzaXplWzRdWzMyXTsKKyAgICBpbnQgaGhpZ2hzaXplWzRdWzMyXTsKKyAgICBpbnQgdmxvd3NpemVbNF1bMzJdOworICAgIGludCB2aGlnaHNpemVbNF1bMzJdOworCisgICAgdm9pZCAoKnRocmVzaG9sZGluZykoZmxvYXQgKmJsb2NrLCBjb25zdCBpbnQgd2lkdGgsIGNvbnN0IGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZSwgY29uc3QgZmxvYXQgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBlcmNlbnQsIGNvbnN0IGludCBuc3RlcHMpOworfSBWYWd1ZURlbm9pc2VyQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVmFndWVEZW5vaXNlckNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdmFndWVkZW5vaXNlcl9vcHRpb25zW10gPSB7CisgICAgeyAidGhyZXNob2xkIiwgInNldCBmaWx0ZXJpbmcgc3RyZW5ndGgiLCAgIE9GRlNFVCh0aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9Mi59LCAgMCxEQkxfTUFYLCBGTEFHUyB9LAorICAgIHsgIm1ldGhvZCIsICAgICJzZXQgZmlsdGVyaW5nIG1ldGhvZCIsICAgICBPRkZTRVQobWV0aG9kKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTIgfSwgIDAsIDIsICAgICAgRkxBR1MsICJtZXRob2QiIH0sCisgICAgICAgIHsgImhhcmQiLCAgICJoYXJkIHRocmVzaG9sZGluZyIsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sICAgMCwgMCwgICAgICBGTEFHUywgIm1ldGhvZCIgfSwKKyAgICAgICAgeyAic29mdCIsICAgInNvZnQgdGhyZXNob2xkaW5nIiwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgICAwLCAwLCAgICAgIEZMQUdTLCAibWV0aG9kIiB9LAorICAgICAgICB7ICJnYXJyb3RlIiwgImdhcm90dGUgdGhyZXNob2xkaW5nIiwgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTJ9LCAgIDAsIDAsICAgICAgRkxBR1MsICJtZXRob2QiIH0sCisgICAgeyAibnN0ZXBzIiwgICAgInNldCBudW1iZXIgb2Ygc3RlcHMiLCAgICAgIE9GRlNFVChuc3RlcHMpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgey5pNjQ9NiB9LCAgMSwgMzIsICAgICBGTEFHUyB9LAorICAgIHsgInBlcmNlbnQiLCAic2V0IHBlcmNlbnQgb2YgZnVsbCBkZW5vaXNpbmciLCBPRkZTRVQocGVyY2VudCksQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTg1fSwgIDAsMTAwLCAgICAgRkxBR1MgfSwKKyAgICB7ICJwbGFuZXMiLCAgICAic2V0IHBsYW5lcyB0byBmaWx0ZXIiLCAgICAgT0ZGU0VUKHBsYW5lcyksICAgIEFWX09QVF9UWVBFX0lOVCwgICB7Lmk2ND0xNSB9LCAwLCAxNSwgICAgIEZMQUdTIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyh2YWd1ZWRlbm9pc2VyKTsKKworI2RlZmluZSBOUEFEIDEwCisKK3N0YXRpYyBjb25zdCBmbG9hdCBhbmFseXNpc19sb3dbOV0gPSB7CisgICAgMC4wMzc4Mjg0NTU1MDY5OTVmLCAtMC4wMjM4NDk0NjUwMTkzODBmLCAtMC4xMTA2MjQ0MDQ0MTg0MjNmLCAwLjM3NzQwMjg1NTYxMjY1NGYsCisgICAgMC44NTI2OTg2NzkwMDk0MDNmLCAwLjM3NzQwMjg1NTYxMjY1NGYsIC0wLjExMDYyNDQwNDQxODQyM2YsIC0wLjAyMzg0OTQ2NTAxOTM4MGYsIDAuMDM3ODI4NDU1NTA2OTk1ZgorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IGFuYWx5c2lzX2hpZ2hbN10gPSB7CisgICAgLTAuMDY0NTM4ODgyNjI4OTM4ZiwgMC4wNDA2ODk0MTc2MDk1NThmLCAwLjQxODA5MjI3MzIyMjIxMmYsIC0wLjc4ODQ4NTYxNjQwNTY2NGYsCisgICAgMC40MTgwOTIyNzMyMjIyMTJmLCAwLjA0MDY4OTQxNzYwOTU1OGYsIC0wLjA2NDUzODg4MjYyODkzOGYKK307CisKK3N0YXRpYyBjb25zdCBmbG9hdCBzeW50aGVzaXNfbG93WzddID0geworICAgIC0wLjA2NDUzODg4MjYyODkzOGYsIC0wLjA0MDY4OTQxNzYwOTU1OGYsIDAuNDE4MDkyMjczMjIyMjEyZiwgMC43ODg0ODU2MTY0MDU2NjRmLAorICAgIDAuNDE4MDkyMjczMjIyMjEyZiwgLTAuMDQwNjg5NDE3NjA5NTU4ZiwgLTAuMDY0NTM4ODgyNjI4OTM4ZgorfTsKKworc3RhdGljIGNvbnN0IGZsb2F0IHN5bnRoZXNpc19oaWdoWzldID0geworICAgIC0wLjAzNzgyODQ1NTUwNjk5NWYsIC0wLjAyMzg0OTQ2NTAxOTM4MGYsIDAuMTEwNjI0NDA0NDE4NDIzZiwgMC4zNzc0MDI4NTU2MTI2NTRmLAorICAgIC0wLjg1MjY5ODY3OTAwOTQwM2YsIDAuMzc3NDAyODU1NjEyNjU0ZiwgMC4xMTA2MjQ0MDQ0MTg0MjNmLCAtMC4wMjM4NDk0NjUwMTkzODBmLCAtMC4wMzc4Mjg0NTU1MDY5OTVmCit9OworCitzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX0dSQVk4LAorICAgICAgICBBVl9QSVhfRk1UX0dSQVkxNiwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MTBQLCBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUCwgQVZfUElYX0ZNVF9ZVVY0MjJQLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDIwUCwgQVZfUElYX0ZNVF9ZVVZKNDIyUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVZKNDExUCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0NDRQOSwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsIEFWX1BJWF9GTVRfWVVWNDIyUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgQVZfUElYX0ZNVF9ZVVY0MjBQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEyLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxNCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTQsIEFWX1BJWF9GTVRfWVVWNDIwUDE0LAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTYsIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSUDksIEFWX1BJWF9GTVRfR0JSUDEwLAorICAgICAgICBBVl9QSVhfRk1UX0dCUlAxMiwgQVZfUElYX0ZNVF9HQlJQMTQsIEFWX1BJWF9GTVRfR0JSUDE2LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gZmZfbWFrZV9mb3JtYXRfbGlzdChwaXhfZm10cyk7CisgICAgaWYgKCFmbXRzX2xpc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmV0dXJuIGZmX3NldF9jb21tb25fZm9ybWF0cyhjdHgsIGZtdHNfbGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIFZhZ3VlRGVub2lzZXJDb250ZXh0ICpzID0gaW5saW5rLT5kc3QtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IHAsIGksIG5zdGVwc193aWR0aCwgbnN0ZXBzX2hlaWdodCwgbnN0ZXBzX21heDsKKworICAgIHMtPmRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBzLT5icGMgPSAocy0+ZGVwdGggKyA3KSAvIDg7CisgICAgcy0+bmJfcGxhbmVzID0gZGVzYy0+bmJfY29tcG9uZW50czsKKworICAgIHMtPnBsYW5laGVpZ2h0WzFdID0gcy0+cGxhbmVoZWlnaHRbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPmgsIGRlc2MtPmxvZzJfY2hyb21hX2gpOworICAgIHMtPnBsYW5laGVpZ2h0WzBdID0gcy0+cGxhbmVoZWlnaHRbM10gPSBpbmxpbmstPmg7CisgICAgcy0+cGxhbmV3aWR0aFsxXSAgPSBzLT5wbGFuZXdpZHRoWzJdICA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+dywgZGVzYy0+bG9nMl9jaHJvbWFfdyk7CisgICAgcy0+cGxhbmV3aWR0aFswXSAgPSBzLT5wbGFuZXdpZHRoWzNdICA9IGlubGluay0+dzsKKworICAgIHMtPmJsb2NrID0gYXZfbWFsbG9jX2FycmF5KGlubGluay0+dyAqIGlubGluay0+aCwgc2l6ZW9mKCpzLT5ibG9jaykpOworICAgIHMtPmluICAgID0gYXZfbWFsbG9jX2FycmF5KDMyICsgRkZNQVgoaW5saW5rLT53LCBpbmxpbmstPmgpLCBzaXplb2YoKnMtPmluKSk7CisgICAgcy0+b3V0ICAgPSBhdl9tYWxsb2NfYXJyYXkoMzIgKyBGRk1BWChpbmxpbmstPncsIGlubGluay0+aCksIHNpemVvZigqcy0+b3V0KSk7CisgICAgcy0+dG1wICAgPSBhdl9tYWxsb2NfYXJyYXkoMzIgKyBGRk1BWChpbmxpbmstPncsIGlubGluay0+aCksIHNpemVvZigqcy0+dG1wKSk7CisKKyAgICBpZiAoIXMtPmJsb2NrIHx8ICFzLT5pbiB8fCAhcy0+b3V0IHx8ICFzLT50bXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzLT50aHJlc2hvbGQgKj0gMSA8PCAocy0+ZGVwdGggLSA4KTsKKyAgICBzLT5wZWFrID0gKDEgPDwgcy0+ZGVwdGgpIC0gMTsKKworICAgIG5zdGVwc193aWR0aCAgPSAoKHMtPnBsYW5lcyAmIDIgfHwgcy0+cGxhbmVzICYgNCkgJiYgcy0+bmJfcGxhbmVzID4gMSkgPyBzLT5wbGFuZXdpZHRoWzFdIDogcy0+cGxhbmV3aWR0aFswXTsKKyAgICBuc3RlcHNfaGVpZ2h0ID0gKChzLT5wbGFuZXMgJiAyIHx8IHMtPnBsYW5lcyAmIDQpICYmIHMtPm5iX3BsYW5lcyA+IDEpID8gcy0+cGxhbmVoZWlnaHRbMV0gOiBzLT5wbGFuZWhlaWdodFswXTsKKworICAgIGZvciAobnN0ZXBzX21heCA9IDE7IG5zdGVwc19tYXggPCAxNTsgbnN0ZXBzX21heCsrKSB7CisgICAgICAgIGlmIChwb3coMiwgbnN0ZXBzX21heCkgPj0gbnN0ZXBzX3dpZHRoIHx8IHBvdygyLCBuc3RlcHNfbWF4KSA+PSBuc3RlcHNfaGVpZ2h0KQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcy0+bnN0ZXBzID0gRkZNSU4ocy0+bnN0ZXBzLCBuc3RlcHNfbWF4IC0gMik7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgNDsgcCsrKSB7CisgICAgICAgIHMtPmhsb3dzaXplW3BdWzBdICA9IChzLT5wbGFuZXdpZHRoW3BdICsgMSkgPj4gMTsKKyAgICAgICAgcy0+aGhpZ2hzaXplW3BdWzBdID0gIHMtPnBsYW5ld2lkdGhbcF0gPj4gMTsKKyAgICAgICAgcy0+dmxvd3NpemVbcF1bMF0gID0gKHMtPnBsYW5laGVpZ2h0W3BdICsgMSkgPj4gMTsKKyAgICAgICAgcy0+dmhpZ2hzaXplW3BdWzBdID0gIHMtPnBsYW5laGVpZ2h0W3BdID4+IDE7CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IHMtPm5zdGVwczsgaSsrKSB7CisgICAgICAgICAgICBzLT5obG93c2l6ZVtwXVtpXSAgPSAocy0+aGxvd3NpemVbcF1baSAtIDFdICsgMSkgPj4gMTsKKyAgICAgICAgICAgIHMtPmhoaWdoc2l6ZVtwXVtpXSA9ICBzLT5obG93c2l6ZVtwXVtpIC0gMV0gPj4gMTsKKyAgICAgICAgICAgIHMtPnZsb3dzaXplW3BdW2ldICA9IChzLT52bG93c2l6ZVtwXVtpIC0gMV0gKyAxKSA+PiAxOworICAgICAgICAgICAgcy0+dmhpZ2hzaXplW3BdW2ldID0gIHMtPnZsb3dzaXplW3BdW2kgLSAxXSA+PiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjb3B5KGNvbnN0IGZsb2F0ICpwMSwgZmxvYXQgKnAyLCBjb25zdCBpbnQgbGVuZ3RoKQoreworICAgIG1lbWNweShwMiwgcDEsIGxlbmd0aCAqIHNpemVvZihmbG9hdCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weXYoY29uc3QgZmxvYXQgKnAxLCBjb25zdCBpbnQgc3RyaWRlMSwgZmxvYXQgKnAyLCBjb25zdCBpbnQgbGVuZ3RoKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHAyW2ldID0gKnAxOworICAgICAgICBwMSArPSBzdHJpZGUxOworICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvcHloKGNvbnN0IGZsb2F0ICpwMSwgZmxvYXQgKnAyLCBjb25zdCBpbnQgc3RyaWRlMiwgY29uc3QgaW50IGxlbmd0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAqcDIgPSBwMVtpXTsKKyAgICAgICAgcDIgKz0gc3RyaWRlMjsKKyAgICB9Cit9CisKKy8vIERvIHN5bW1ldHJpYyBleHRlbnNpb24gb2YgZGF0YSB1c2luZyBwcmVzY3JpYmVkIHN5bW1ldHJpZXMKKy8vIE9yaWdpbmFsIHZhbHVlcyBhcmUgaW4gb3V0cHV0W25wYWRdIHRocm91Z2ggb3V0cHV0W25wYWQrc2l6ZS0xXQorLy8gTmV3IHZhbHVlcyB3aWxsIGJlIHBsYWNlZCBpbiBvdXRwdXRbMF0gdGhyb3VnaCBvdXRwdXRbbnBhZF0gYW5kIGluIG91dHB1dFtucGFkK3NpemVdIHRocm91Z2ggb3V0cHV0WzIqbnBhZCtzaXplLTFdIChub3RlOiBlbmQgdmFsdWVzIG1heSBub3QgYmUgZmlsbGVkIGluKQorLy8gZXh0ZW5zaW9uIGF0IGxlZnQgYmRyeSBpcyAuLi4gMyAyIDEgMCB8IDAgMSAyIDMgLi4uCisvLyBzYW1lIGZvciByaWdodCBib3VuZGFyeQorLy8gaWYgcmlnaHRfZXh0PTEgdGhlbiAuLi4gMyAyIDEgMCB8IDEgMiAzCitzdGF0aWMgdm9pZCBzeW1tZXRyaWNfZXh0ZW5zaW9uKGZsb2F0ICpvdXRwdXQsIGNvbnN0IGludCBzaXplLCBjb25zdCBpbnQgbGVmdF9leHQsIGNvbnN0IGludCByaWdodF9leHQpCit7CisgICAgaW50IGZpcnN0ID0gTlBBRDsKKyAgICBpbnQgbGFzdCA9IE5QQUQgLSAxICsgc2l6ZTsKKyAgICBjb25zdCBpbnQgb3JpZ2luYWxMYXN0ID0gbGFzdDsKKyAgICBpbnQgaSwgbmV4dGVuZCwgaWR4OworCisgICAgaWYgKGxlZnRfZXh0ID09IDIpCisgICAgICAgIG91dHB1dFstLWZpcnN0XSA9IG91dHB1dFtOUEFEXTsKKyAgICBpZiAocmlnaHRfZXh0ID09IDIpCisgICAgICAgIG91dHB1dFsrK2xhc3RdID0gb3V0cHV0W29yaWdpbmFsTGFzdF07CisKKyAgICAvLyBleHRlbmQgbGVmdCBlbmQKKyAgICBuZXh0ZW5kID0gZmlyc3Q7CisgICAgZm9yIChpID0gMDsgaSA8IG5leHRlbmQ7IGkrKykKKyAgICAgICAgb3V0cHV0Wy0tZmlyc3RdID0gb3V0cHV0W05QQUQgKyAxICsgaV07CisKKyAgICBpZHggPSBOUEFEICsgTlBBRCAtIDEgKyBzaXplOworCisgICAgLy8gZXh0ZW5kIHJpZ2h0IGVuZAorICAgIG5leHRlbmQgPSBpZHggLSBsYXN0OworICAgIGZvciAoaSA9IDA7IGkgPCBuZXh0ZW5kOyBpKyspCisgICAgICAgIG91dHB1dFsrK2xhc3RdID0gb3V0cHV0W29yaWdpbmFsTGFzdCAtIDEgLSBpXTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtX3N0ZXAoZmxvYXQgKmlucHV0LCBmbG9hdCAqb3V0cHV0LCBjb25zdCBpbnQgc2l6ZSwgY29uc3QgaW50IGxvd19zaXplLCBWYWd1ZURlbm9pc2VyQ29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIHN5bW1ldHJpY19leHRlbnNpb24oaW5wdXQsIHNpemUsIDEsIDEpOworCisgICAgZm9yIChpID0gTlBBRDsgaSA8IE5QQUQgKyBsb3dfc2l6ZTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IGEgPSBpbnB1dFsyICogaSAtIDE0XSAqIGFuYWx5c2lzX2xvd1swXTsKKyAgICAgICAgY29uc3QgZmxvYXQgYiA9IGlucHV0WzIgKiBpIC0gMTNdICogYW5hbHlzaXNfbG93WzFdOworICAgICAgICBjb25zdCBmbG9hdCBjID0gaW5wdXRbMiAqIGkgLSAxMl0gKiBhbmFseXNpc19sb3dbMl07CisgICAgICAgIGNvbnN0IGZsb2F0IGQgPSBpbnB1dFsyICogaSAtIDExXSAqIGFuYWx5c2lzX2xvd1szXTsKKyAgICAgICAgY29uc3QgZmxvYXQgZSA9IGlucHV0WzIgKiBpIC0gMTBdICogYW5hbHlzaXNfbG93WzRdOworICAgICAgICBjb25zdCBmbG9hdCBmID0gaW5wdXRbMiAqIGkgLSAgOV0gKiBhbmFseXNpc19sb3dbM107CisgICAgICAgIGNvbnN0IGZsb2F0IGcgPSBpbnB1dFsyICogaSAtICA4XSAqIGFuYWx5c2lzX2xvd1syXTsKKyAgICAgICAgY29uc3QgZmxvYXQgaCA9IGlucHV0WzIgKiBpIC0gIDddICogYW5hbHlzaXNfbG93WzFdOworICAgICAgICBjb25zdCBmbG9hdCBrID0gaW5wdXRbMiAqIGkgLSAgNl0gKiBhbmFseXNpc19sb3dbMF07CisKKyAgICAgICAgb3V0cHV0W2ldID0gYSArIGIgKyBjICsgZCArIGUgKyBmICsgZyArIGggKyBrOworICAgIH0KKworICAgIGZvciAoaSA9IE5QQUQ7IGkgPCBOUEFEICsgbG93X3NpemU7IGkrKykgeworICAgICAgICBjb25zdCBmbG9hdCBhID0gaW5wdXRbMiAqIGkgLSAxMl0gKiBhbmFseXNpc19oaWdoWzBdOworICAgICAgICBjb25zdCBmbG9hdCBiID0gaW5wdXRbMiAqIGkgLSAxMV0gKiBhbmFseXNpc19oaWdoWzFdOworICAgICAgICBjb25zdCBmbG9hdCBjID0gaW5wdXRbMiAqIGkgLSAxMF0gKiBhbmFseXNpc19oaWdoWzJdOworICAgICAgICBjb25zdCBmbG9hdCBkID0gaW5wdXRbMiAqIGkgLSAgOV0gKiBhbmFseXNpc19oaWdoWzNdOworICAgICAgICBjb25zdCBmbG9hdCBlID0gaW5wdXRbMiAqIGkgLSAgOF0gKiBhbmFseXNpc19oaWdoWzJdOworICAgICAgICBjb25zdCBmbG9hdCBmID0gaW5wdXRbMiAqIGkgLSAgN10gKiBhbmFseXNpc19oaWdoWzFdOworICAgICAgICBjb25zdCBmbG9hdCBnID0gaW5wdXRbMiAqIGkgLSAgNl0gKiBhbmFseXNpc19oaWdoWzBdOworCisgICAgICAgIG91dHB1dFtpICsgbG93X3NpemVdID0gYSArIGIgKyBjICsgZCArIGUgKyBmICsgZzsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGludmVydF9zdGVwKGNvbnN0IGZsb2F0ICppbnB1dCwgZmxvYXQgKm91dHB1dCwgZmxvYXQgKnRlbXAsIGNvbnN0IGludCBzaXplLCBWYWd1ZURlbm9pc2VyQ29udGV4dCAqcykKK3sKKyAgICBjb25zdCBpbnQgbG93X3NpemUgPSAoc2l6ZSArIDEpID4+IDE7CisgICAgY29uc3QgaW50IGhpZ2hfc2l6ZSA9IHNpemUgPj4gMTsKKyAgICBpbnQgbGVmdF9leHQgPSAxLCByaWdodF9leHQsIGk7CisgICAgaW50IGZpbmRleDsKKworICAgIG1lbWNweSh0ZW1wICsgTlBBRCwgaW5wdXQgKyBOUEFELCBsb3dfc2l6ZSAqIHNpemVvZihmbG9hdCkpOworCisgICAgcmlnaHRfZXh0ID0gKHNpemUgJSAyID09IDApID8gMiA6IDE7CisgICAgc3ltbWV0cmljX2V4dGVuc2lvbih0ZW1wLCBsb3dfc2l6ZSwgbGVmdF9leHQsIHJpZ2h0X2V4dCk7CisKKyAgICBtZW1zZXQob3V0cHV0LCAwLCAoTlBBRCArIE5QQUQgKyBzaXplKSAqIHNpemVvZihmbG9hdCkpOworICAgIGZpbmRleCA9IChzaXplICsgMikgPj4gMTsKKworICAgIGZvciAoaSA9IDk7IGkgPCBmaW5kZXggKyAxMTsgaSsrKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IGEgPSB0ZW1wW2ldICogc3ludGhlc2lzX2xvd1swXTsKKyAgICAgICAgY29uc3QgZmxvYXQgYiA9IHRlbXBbaV0gKiBzeW50aGVzaXNfbG93WzFdOworICAgICAgICBjb25zdCBmbG9hdCBjID0gdGVtcFtpXSAqIHN5bnRoZXNpc19sb3dbMl07CisgICAgICAgIGNvbnN0IGZsb2F0IGQgPSB0ZW1wW2ldICogc3ludGhlc2lzX2xvd1szXTsKKworICAgICAgICBvdXRwdXRbMiAqIGkgLSAxM10gKz0gYTsKKyAgICAgICAgb3V0cHV0WzIgKiBpIC0gMTJdICs9IGI7CisgICAgICAgIG91dHB1dFsyICogaSAtIDExXSArPSBjOworICAgICAgICBvdXRwdXRbMiAqIGkgLSAxMF0gKz0gZDsKKyAgICAgICAgb3V0cHV0WzIgKiBpIC0gIDldICs9IGM7CisgICAgICAgIG91dHB1dFsyICogaSAtICA4XSArPSBiOworICAgICAgICBvdXRwdXRbMiAqIGkgLSAgN10gKz0gYTsKKyAgICB9CisKKyAgICBtZW1jcHkodGVtcCArIE5QQUQsIGlucHV0ICsgTlBBRCArIGxvd19zaXplLCBoaWdoX3NpemUgKiBzaXplb2YoZmxvYXQpKTsKKworICAgIGxlZnRfZXh0ID0gMjsKKyAgICByaWdodF9leHQgPSAoc2l6ZSAlIDIgPT0gMCkgPyAxIDogMjsKKyAgICBzeW1tZXRyaWNfZXh0ZW5zaW9uKHRlbXAsIGhpZ2hfc2l6ZSwgbGVmdF9leHQsIHJpZ2h0X2V4dCk7CisKKyAgICBmb3IgKGkgPSA4OyBpIDwgZmluZGV4ICsgMTE7IGkrKykgeworICAgICAgICBjb25zdCBmbG9hdCBhID0gdGVtcFtpXSAqIHN5bnRoZXNpc19oaWdoWzBdOworICAgICAgICBjb25zdCBmbG9hdCBiID0gdGVtcFtpXSAqIHN5bnRoZXNpc19oaWdoWzFdOworICAgICAgICBjb25zdCBmbG9hdCBjID0gdGVtcFtpXSAqIHN5bnRoZXNpc19oaWdoWzJdOworICAgICAgICBjb25zdCBmbG9hdCBkID0gdGVtcFtpXSAqIHN5bnRoZXNpc19oaWdoWzNdOworICAgICAgICBjb25zdCBmbG9hdCBlID0gdGVtcFtpXSAqIHN5bnRoZXNpc19oaWdoWzRdOworCisgICAgICAgIG91dHB1dFsyICogaSAtIDEzXSArPSBhOworICAgICAgICBvdXRwdXRbMiAqIGkgLSAxMl0gKz0gYjsKKyAgICAgICAgb3V0cHV0WzIgKiBpIC0gMTFdICs9IGM7CisgICAgICAgIG91dHB1dFsyICogaSAtIDEwXSArPSBkOworICAgICAgICBvdXRwdXRbMiAqIGkgLSAgOV0gKz0gZTsKKyAgICAgICAgb3V0cHV0WzIgKiBpIC0gIDhdICs9IGQ7CisgICAgICAgIG91dHB1dFsyICogaSAtICA3XSArPSBjOworICAgICAgICBvdXRwdXRbMiAqIGkgLSAgNl0gKz0gYjsKKyAgICAgICAgb3V0cHV0WzIgKiBpIC0gIDVdICs9IGE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBoYXJkX3RocmVzaG9sZGluZyhmbG9hdCAqYmxvY2ssIGNvbnN0IGludCB3aWR0aCwgY29uc3QgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdHJpZGUsIGNvbnN0IGZsb2F0IHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHBlcmNlbnQsIGNvbnN0IGludCB1bnVzZWQpCit7CisgICAgY29uc3QgZmxvYXQgZnJhYyA9IDEuZiAtIHBlcmNlbnQgKiAwLjAxZjsKKyAgICBpbnQgeSwgeDsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykgeworICAgICAgICAgICAgaWYgKEZGQUJTKGJsb2NrW3hdKSA8PSB0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgYmxvY2tbeF0gKj0gZnJhYzsKKyAgICAgICAgfQorICAgICAgICBibG9jayArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzb2Z0X3RocmVzaG9sZGluZyhmbG9hdCAqYmxvY2ssIGNvbnN0IGludCB3aWR0aCwgY29uc3QgaW50IGhlaWdodCwgY29uc3QgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHRocmVzaG9sZCwgY29uc3QgZmxvYXQgcGVyY2VudCwgY29uc3QgaW50IG5zdGVwcykKK3sKKyAgICBjb25zdCBmbG9hdCBmcmFjID0gMS5mIC0gcGVyY2VudCAqIDAuMDFmOworICAgIGNvbnN0IGZsb2F0IHNoaWZ0ID0gdGhyZXNob2xkICogMC4wMWYgKiBwZXJjZW50OworICAgIGludCB3ID0gd2lkdGg7CisgICAgaW50IGggPSBoZWlnaHQ7CisgICAgaW50IHksIHgsIGw7CisKKyAgICBmb3IgKGwgPSAwOyBsIDwgbnN0ZXBzOyBsKyspIHsKKyAgICAgICAgdyA9ICh3ICsgMSkgPj4gMTsKKyAgICAgICAgaCA9IChoICsgMSkgPj4gMTsKKyAgICB9CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgY29uc3QgaW50IHgwID0gKHkgPCBoKSA/IHcgOiAwOworICAgICAgICBmb3IgKHggPSB4MDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHRlbXAgPSBGRkFCUyhibG9ja1t4XSk7CisgICAgICAgICAgICBpZiAodGVtcCA8PSB0aHJlc2hvbGQpCisgICAgICAgICAgICAgICAgYmxvY2tbeF0gKj0gZnJhYzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBibG9ja1t4XSA9IChibG9ja1t4XSA8IDAuZiA/IC0xLmYgOiAoYmxvY2tbeF0gPiAwLmYgPyAxLmYgOiAwLmYpKSAqICh0ZW1wIC0gc2hpZnQpOworICAgICAgICB9CisgICAgICAgIGJsb2NrICs9IHN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHFpYW5fdGhyZXNob2xkaW5nKGZsb2F0ICpibG9jaywgY29uc3QgaW50IHdpZHRoLCBjb25zdCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHN0cmlkZSwgY29uc3QgZmxvYXQgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgcGVyY2VudCwgY29uc3QgaW50IHVudXNlZCkKK3sKKyAgICBjb25zdCBmbG9hdCBwZXJjZW50MDEgPSBwZXJjZW50ICogMC4wMWY7CisgICAgY29uc3QgZmxvYXQgdHIyID0gdGhyZXNob2xkICogdGhyZXNob2xkICogcGVyY2VudDAxOworICAgIGNvbnN0IGZsb2F0IGZyYWMgPSAxLmYgLSBwZXJjZW50MDE7CisgICAgaW50IHksIHg7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHRlbXAgPSBGRkFCUyhibG9ja1t4XSk7CisgICAgICAgICAgICBpZiAodGVtcCA8PSB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBibG9ja1t4XSAqPSBmcmFjOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB0cDIgPSB0ZW1wICogdGVtcDsKKyAgICAgICAgICAgICAgICBibG9ja1t4XSAqPSAodHAyIC0gdHIyKSAvIHRwMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBibG9jayArPSBzdHJpZGU7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXIoVmFndWVEZW5vaXNlckNvbnRleHQgKnMsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQpCit7CisgICAgaW50IHAsIHksIHgsIGksIGo7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgY29uc3QgaW50IGhlaWdodCA9IHMtPnBsYW5laGVpZ2h0W3BdOworICAgICAgICBjb25zdCBpbnQgd2lkdGggPSBzLT5wbGFuZXdpZHRoW3BdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwOCA9IGluLT5kYXRhW3BdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjcDE2ID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbcF07CisgICAgICAgIHVpbnQ4X3QgKmRzdHA4ID0gb3V0LT5kYXRhW3BdOworICAgICAgICB1aW50MTZfdCAqZHN0cDE2ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW3BdOworICAgICAgICBmbG9hdCAqb3V0cHV0ID0gcy0+YmxvY2s7CisgICAgICAgIGludCBoX2xvd19zaXplMCA9IHdpZHRoOworICAgICAgICBpbnQgdl9sb3dfc2l6ZTAgPSBoZWlnaHQ7CisgICAgICAgIGludCBuc3RlcHNfdHJhbnNmb3JtID0gcy0+bnN0ZXBzOworICAgICAgICBpbnQgbnN0ZXBzX2ludmVydCA9IHMtPm5zdGVwczsKKyAgICAgICAgY29uc3QgZmxvYXQgKmlucHV0ID0gcy0+YmxvY2s7CisKKyAgICAgICAgaWYgKCEoKDEgPDwgcCkgJiBzLT5wbGFuZXMpKSB7CisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVtwXSwgb3V0LT5saW5lc2l6ZVtwXSwgaW4tPmRhdGFbcF0sIGluLT5saW5lc2l6ZVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGxhbmV3aWR0aFtwXSAqIHMtPmJwYywgcy0+cGxhbmVoZWlnaHRbcF0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZGVwdGggPD0gOCkgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFt4XSA9IHNyY3A4W3hdOworICAgICAgICAgICAgICAgIHNyY3A4ICs9IGluLT5saW5lc2l6ZVtwXTsKKyAgICAgICAgICAgICAgICBvdXRwdXQgKz0gd2lkdGg7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W3hdID0gc3JjcDE2W3hdOworICAgICAgICAgICAgICAgIHNyY3AxNiArPSBpbi0+bGluZXNpemVbcF0gLyAyOworICAgICAgICAgICAgICAgIG91dHB1dCArPSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChuc3RlcHNfdHJhbnNmb3JtLS0pIHsKKyAgICAgICAgICAgIGludCBsb3dfc2l6ZSA9IChoX2xvd19zaXplMCArIDEpID4+IDE7CisgICAgICAgICAgICBmbG9hdCAqaW5wdXQgPSBzLT5ibG9jazsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB2X2xvd19zaXplMDsgaisrKSB7CisgICAgICAgICAgICAgICAgY29weShpbnB1dCwgcy0+aW4gKyBOUEFELCBoX2xvd19zaXplMCk7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3N0ZXAocy0+aW4sIHMtPm91dCwgaF9sb3dfc2l6ZTAsIGxvd19zaXplLCBzKTsKKyAgICAgICAgICAgICAgICBjb3B5KHMtPm91dCArIE5QQUQsIGlucHV0LCBoX2xvd19zaXplMCk7CisgICAgICAgICAgICAgICAgaW5wdXQgKz0gd2lkdGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxvd19zaXplID0gKHZfbG93X3NpemUwICsgMSkgPj4gMTsKKyAgICAgICAgICAgIGlucHV0ID0gcy0+YmxvY2s7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaF9sb3dfc2l6ZTA7IGorKykgeworICAgICAgICAgICAgICAgIGNvcHl2KGlucHV0LCB3aWR0aCwgcy0+aW4gKyBOUEFELCB2X2xvd19zaXplMCk7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3N0ZXAocy0+aW4sIHMtPm91dCwgdl9sb3dfc2l6ZTAsIGxvd19zaXplLCBzKTsKKyAgICAgICAgICAgICAgICBjb3B5aChzLT5vdXQgKyBOUEFELCBpbnB1dCwgd2lkdGgsIHZfbG93X3NpemUwKTsKKyAgICAgICAgICAgICAgICBpbnB1dCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoX2xvd19zaXplMCA9IChoX2xvd19zaXplMCArIDEpID4+IDE7CisgICAgICAgICAgICB2X2xvd19zaXplMCA9ICh2X2xvd19zaXplMCArIDEpID4+IDE7CisgICAgICAgIH0KKworICAgICAgICBzLT50aHJlc2hvbGRpbmcocy0+YmxvY2ssIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCBzLT50aHJlc2hvbGQsIHMtPnBlcmNlbnQsIHMtPm5zdGVwcyk7CisKKyAgICAgICAgd2hpbGUgKG5zdGVwc19pbnZlcnQtLSkgeworICAgICAgICAgICAgY29uc3QgaW50IGlkeCA9IHMtPnZsb3dzaXplW3BdW25zdGVwc19pbnZlcnRdICArIHMtPnZoaWdoc2l6ZVtwXVtuc3RlcHNfaW52ZXJ0XTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpZHgyID0gcy0+aGxvd3NpemVbcF1bbnN0ZXBzX2ludmVydF0gKyBzLT5oaGlnaHNpemVbcF1bbnN0ZXBzX2ludmVydF07CisgICAgICAgICAgICBmbG9hdCAqIGlkeDMgPSBzLT5ibG9jazsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpZHgyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjb3B5dihpZHgzLCB3aWR0aCwgcy0+aW4gKyBOUEFELCBpZHgpOworICAgICAgICAgICAgICAgIGludmVydF9zdGVwKHMtPmluLCBzLT5vdXQsIHMtPnRtcCwgaWR4LCBzKTsKKyAgICAgICAgICAgICAgICBjb3B5aChzLT5vdXQgKyBOUEFELCBpZHgzLCB3aWR0aCwgaWR4KTsKKyAgICAgICAgICAgICAgICBpZHgzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlkeDMgPSBzLT5ibG9jazsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpZHg7IGkrKykgeworICAgICAgICAgICAgICAgIGNvcHkoaWR4Mywgcy0+aW4gKyBOUEFELCBpZHgyKTsKKyAgICAgICAgICAgICAgICBpbnZlcnRfc3RlcChzLT5pbiwgcy0+b3V0LCBzLT50bXAsIGlkeDIsIHMpOworICAgICAgICAgICAgICAgIGNvcHkocy0+b3V0ICsgTlBBRCwgaWR4MywgaWR4Mik7CisgICAgICAgICAgICAgICAgaWR4MyArPSB3aWR0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5kZXB0aCA8PSA4KSB7CisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHgrKykKKyAgICAgICAgICAgICAgICAgICAgZHN0cDhbeF0gPSBhdl9jbGlwX3VpbnQ4KGlucHV0W3hdICsgMC41Zik7CisgICAgICAgICAgICAgICAgaW5wdXQgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgZHN0cDggKz0gb3V0LT5saW5lc2l6ZVtwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgeCsrKQorICAgICAgICAgICAgICAgICAgICBkc3RwMTZbeF0gPSBhdl9jbGlwKGlucHV0W3hdICsgMC41ZiwgMCwgcy0+cGVhayk7CisgICAgICAgICAgICAgICAgaW5wdXQgKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgZHN0cDE2ICs9IG91dC0+bGluZXNpemVbcF0gLyAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggID0gaW5saW5rLT5kc3Q7CisgICAgVmFndWVEZW5vaXNlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgZGlyZWN0ID0gYXZfZnJhbWVfaXNfd3JpdGFibGUoaW4pOworCisgICAgaWYgKGRpcmVjdCkgeworICAgICAgICBvdXQgPSBpbjsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVyKG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworICAgICAgICBpZiAoIW91dCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyYW1lX2NvcHlfcHJvcHMob3V0LCBpbik7CisgICAgfQorCisgICAgZmlsdGVyKHMsIGluLCBvdXQpOworCisgICAgaWYgKCFkaXJlY3QpCisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IGluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVmFndWVEZW5vaXNlckNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzd2l0Y2ggKHMtPm1ldGhvZCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgcy0+dGhyZXNob2xkaW5nID0gaGFyZF90aHJlc2hvbGRpbmc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgcy0+dGhyZXNob2xkaW5nID0gc29mdF90aHJlc2hvbGRpbmc7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgcy0+dGhyZXNob2xkaW5nID0gcWlhbl90aHJlc2hvbGRpbmc7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBWYWd1ZURlbm9pc2VyQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzLT5ibG9jayk7CisgICAgYXZfZnJlZXAoJnMtPmluKTsKKyAgICBhdl9mcmVlcCgmcy0+b3V0KTsKKyAgICBhdl9mcmVlcCgmcy0+dG1wKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHZhZ3VlZGVub2lzZXJfaW5wdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzID0gY29uZmlnX2lucHV0LAorICAgICAgICAuZmlsdGVyX2ZyYW1lID0gZmlsdGVyX2ZyYW1lLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHZhZ3VlZGVub2lzZXJfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfdmFndWVkZW5vaXNlciA9IHsKKyAgICAubmFtZSAgICAgICAgICA9ICJ2YWd1ZWRlbm9pc2VyIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBseSBhIFdhdmVsZXQgYmFzZWQgRGVub2lzZXIuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVmFndWVEZW5vaXNlckNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnZhZ3VlZGVub2lzZXJfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSBpbml0LAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAuaW5wdXRzICAgICAgICA9IHZhZ3VlZGVub2lzZXJfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gdmFndWVkZW5vaXNlcl9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdmVjdG9yc2NvcGUuYyBiL2xpYmF2ZmlsdGVyL3ZmX3ZlY3RvcnNjb3BlLmMKaW5kZXggMjExMmI4MC4uZTNlMDA3OSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdmZfdmVjdG9yc2NvcGUuYworKysgYi9saWJhdmZpbHRlci92Zl92ZWN0b3JzY29wZS5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC0zNCw2ICszNSw3IEBACiAgICAgQ09MT1IyLAogICAgIENPTE9SMywKICAgICBDT0xPUjQsCisgICAgQ09MT1I1LAogICAgIE1PREVfTkIKIH07CiAKQEAgLTQyLDE5ICs0NCwzMyBAQAogICAgIGludCBtb2RlOwogICAgIGludCBpbnRlbnNpdHk7CiAgICAgZmxvYXQgZmludGVuc2l0eTsKLSAgICBjb25zdCB1aW50OF90ICpiZ19jb2xvcjsKKyAgICB1aW50MTZfdCBiZ19jb2xvcls0XTsKICAgICBpbnQgcGxhbmV3aWR0aFs0XTsKICAgICBpbnQgcGxhbmVoZWlnaHRbNF07CiAgICAgaW50IGhzdWIsIHZzdWI7CiAgICAgaW50IHgsIHksIHBkOwogICAgIGludCBpc195dXY7CiAgICAgaW50IHNpemU7CisgICAgaW50IGRlcHRoOwogICAgIGludCBtdWx0OwogICAgIGludCBlbnZlbG9wZTsKLSAgICB1aW50OF90IHBlYWtbMTAyNF1bMTAyNF07CisgICAgaW50IGdyYXRpY3VsZTsKKyAgICBmbG9hdCBvcGFjaXR5OworICAgIGZsb2F0IGJnb3BhY2l0eTsKKyAgICBmbG9hdCBsdGhyZXNob2xkOworICAgIGZsb2F0IGh0aHJlc2hvbGQ7CisgICAgaW50IHRtaW47CisgICAgaW50IHRtYXg7CisgICAgaW50IGZsYWdzOworICAgIGludCBjb2xvcnNwYWNlOworICAgIGludCBjczsKKyAgICB1aW50OF90ICpwZWFrX21lbW9yeTsKKyAgICB1aW50OF90ICoqcGVhazsKIAogICAgIHZvaWQgKCp2ZWN0b3JzY29wZSkoc3RydWN0IFZlY3RvcnNjb3BlQ29udGV4dCAqcywKICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsIGludCBwZCk7CisgICAgdm9pZCAoKmdyYXRpY3VsZWYpKHN0cnVjdCBWZWN0b3JzY29wZUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IFgsIGludCBZLCBpbnQgRCwgaW50IFApOwogfSBWZWN0b3JzY29wZUNvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFZlY3RvcnNjb3BlQ29udGV4dCwgeCkKQEAgLTY4LDYgKzg0LDcgQEAKICAgICB7ICAgImNvbG9yMiIsIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DT0xPUjJ9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCiAgICAgeyAgICJjb2xvcjMiLCAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q09MT1IzfSwgMCwgMCwgRkxBR1MsICJtb2RlIiB9LAogICAgIHsgICAiY29sb3I0IiwgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNPTE9SNH0sIDAsIDAsIEZMQUdTLCAibW9kZSIgfSwKKyAgICB7ICAgImNvbG9yNSIsIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1DT0xPUjV9LCAwLCAwLCBGTEFHUywgIm1vZGUiIH0sCiAgICAgeyAieCIsICJzZXQgY29sb3IgY29tcG9uZW50IG9uIFggYXhpcyIsIE9GRlNFVCh4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMCwgMiwgRkxBR1N9LAogICAgIHsgInkiLCAic2V0IGNvbG9yIGNvbXBvbmVudCBvbiBZIGF4aXMiLCBPRkZTRVQoeSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9Mn0sIDAsIDIsIEZMQUdTfSwKICAgICB7ICJpbnRlbnNpdHkiLCAic2V0IGludGVuc2l0eSIsIE9GRlNFVChmaW50ZW5zaXR5KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuMDA0fSwgMCwgMSwgRkxBR1N9LApAQCAtNzgsNiArOTUsMjkgQEAKICAgICB7ICAgImluc3RhbnQiLCAgICAgIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgRkxBR1MsICJlbnZlbG9wZSIgfSwKICAgICB7ICAgInBlYWsiLCAgICAgICAgIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0yfSwgMCwgMCwgRkxBR1MsICJlbnZlbG9wZSIgfSwKICAgICB7ICAgInBlYWsraW5zdGFudCIsIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0zfSwgMCwgMCwgRkxBR1MsICJlbnZlbG9wZSIgfSwKKyAgICB7ICJncmF0aWN1bGUiLCAic2V0IGdyYXRpY3VsZSIsIE9GRlNFVChncmF0aWN1bGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAyLCBGTEFHUywgImdyYXRpY3VsZSJ9LAorICAgIHsgImciLCAgICAgICAgICJzZXQgZ3JhdGljdWxlIiwgT0ZGU0VUKGdyYXRpY3VsZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9MH0sIDAsIDIsIEZMQUdTLCAiZ3JhdGljdWxlIn0sCisgICAgeyAgICJub25lIiwgICAgICAgICAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAiZ3JhdGljdWxlIiB9LAorICAgIHsgICAiZ3JlZW4iLCAgICAgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgImdyYXRpY3VsZSIgfSwKKyAgICB7ICAgImNvbG9yIiwgICAgICAgIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0yfSwgMCwgMCwgRkxBR1MsICJncmF0aWN1bGUiIH0sCisgICAgeyAib3BhY2l0eSIsICJzZXQgZ3JhdGljdWxlIG9wYWNpdHkiLCBPRkZTRVQob3BhY2l0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjc1fSwgMCwgMSwgRkxBR1N9LAorICAgIHsgIm8iLCAgICAgICAic2V0IGdyYXRpY3VsZSBvcGFjaXR5IiwgT0ZGU0VUKG9wYWNpdHkpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC43NX0sIDAsIDEsIEZMQUdTfSwKKyAgICB7ICJmbGFncyIsICJzZXQgZ3JhdGljdWxlIGZsYWdzIiwgT0ZGU0VUKGZsYWdzKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0PTR9LCAwLCA3LCBGTEFHUywgImZsYWdzIn0sCisgICAgeyAiZiIsICAgICAic2V0IGdyYXRpY3VsZSBmbGFncyIsIE9GRlNFVChmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2ND00fSwgMCwgNywgRkxBR1MsICJmbGFncyJ9LAorICAgIHsgICAid2hpdGUiLCAiZHJhdyB3aGl0ZSBwb2ludCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgRkxBR1MsICJmbGFncyIgfSwKKyAgICB7ICAgImJsYWNrIiwgImRyYXcgYmxhY2sgcG9pbnQiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Mn0sIDAsIDAsIEZMQUdTLCAiZmxhZ3MiIH0sCisgICAgeyAgICJuYW1lIiwgICJkcmF3IHBvaW50IG5hbWUiLCAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTR9LCAwLCAwLCBGTEFHUywgImZsYWdzIiB9LAorICAgIHsgImJnb3BhY2l0eSIsICJzZXQgYmFja2dyb3VuZCBvcGFjaXR5IiwgT0ZGU0VUKGJnb3BhY2l0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjN9LCAwLCAxLCBGTEFHU30sCisgICAgeyAiYiIsICAgICAgICAgInNldCBiYWNrZ3JvdW5kIG9wYWNpdHkiLCBPRkZTRVQoYmdvcGFjaXR5KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuM30sIDAsIDEsIEZMQUdTfSwKKyAgICB7ICJsdGhyZXNob2xkIiwgInNldCBsb3cgdGhyZXNob2xkIiwgIE9GRlNFVChsdGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTB9LCAwLCAxLCBGTEFHU30sCisgICAgeyAibCIsICAgICAgICAgICJzZXQgbG93IHRocmVzaG9sZCIsICBPRkZTRVQobHRocmVzaG9sZCksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wfSwgMCwgMSwgRkxBR1N9LAorICAgIHsgImh0aHJlc2hvbGQiLCAic2V0IGhpZ2ggdGhyZXNob2xkIiwgT0ZGU0VUKGh0aHJlc2hvbGQpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MX0sIDAsIDEsIEZMQUdTfSwKKyAgICB7ICJoIiwgICAgICAgICAgInNldCBoaWdoIHRocmVzaG9sZCIsIE9GRlNFVChodGhyZXNob2xkKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTF9LCAwLCAxLCBGTEFHU30sCisgICAgeyAiY29sb3JzcGFjZSIsICJzZXQgY29sb3JzcGFjZSIsIE9GRlNFVChjb2xvcnNwYWNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMiwgRkxBR1MsICJjb2xvcnNwYWNlIn0sCisgICAgeyAiYyIsICAgICAgICAgICJzZXQgY29sb3JzcGFjZSIsIE9GRlNFVChjb2xvcnNwYWNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMiwgRkxBR1MsICJjb2xvcnNwYWNlIn0sCisgICAgeyAgICJhdXRvIiwgICAgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBGTEFHUywgImNvbG9yc3BhY2UiIH0sCisgICAgeyAgICI2MDEiLCAgICAgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgImNvbG9yc3BhY2UiIH0sCisgICAgeyAgICI3MDkiLCAgICAgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTJ9LCAwLCAwLCBGTEFHUywgImNvbG9yc3BhY2UiIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTg5LDEyICsxMjksMTcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0X3l1djlfcGl4X2ZtdHNbXSA9IHsKLSAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5LAorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKIAogc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfeXV2MTBfcGl4X2ZtdHNbXSA9IHsKLSAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQMTAsIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfeXV2MTJfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwKICAgICBBVl9QSVhfRk1UX05PTkUKIH07CiAKQEAgLTEwOSwxNSArMTU0LDIzIEBACiB9OwogCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9yZ2IxMF9waXhfZm10c1tdID0gewotICAgIEFWX1BJWF9GTVRfR0JSUDEwLAorICAgIEFWX1BJWF9GTVRfR0JSUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9yZ2IxMl9waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTIsCiAgICAgQVZfUElYX0ZNVF9OT05FCiB9OwogCiBzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGluMV9waXhfZm10c1tdID0gewogICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfWVVWNDQ0UCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKICAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5LCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQOSwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAogICAgIEFWX1BJWF9GTVRfR0JSQVAsIEFWX1BJWF9GTVRfR0JSUCwKLSAgICBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwKKyAgICBBVl9QSVhfRk1UX0dCUlA5LCBBVl9QSVhfRk1UX0dCUlAxMCwgQVZfUElYX0ZNVF9HQlJBUDEwLAorICAgIEFWX1BJWF9GTVRfR0JSUDEyLCBBVl9QSVhfRk1UX0dCUkFQMTIsCiAgICAgQVZfUElYX0ZNVF9OT05FCiB9OwogCkBAIC0xMjgsOSArMTgxLDEzIEBACiAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLCAgQVZfUElYX0ZNVF9ZVVZKNDExUCwKICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAsICBBVl9QSVhfRk1UX1lVVjQxMFAsCiAgICAgQVZfUElYX0ZNVF9HQlJBUCwgQVZfUElYX0ZNVF9HQlJQLAotICAgIEFWX1BJWF9GTVRfR0JSUDksIEFWX1BJWF9GTVRfR0JSUDEwLAorICAgIEFWX1BJWF9GTVRfR0JSUDksIEFWX1BJWF9GTVRfR0JSUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTAsCisgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSQVAxMiwKICAgICBBVl9QSVhfRk1UX1lVVjQyMFA5LCBBVl9QSVhfRk1UX1lVVjQyMlA5LCBBVl9QSVhfRk1UX1lVVjQ0NFA5LAogICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVZBNDIwUDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICBBVl9QSVhfRk1UX1lVVkE0MjBQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMlAxMCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDQwUDEyLAogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKIApAQCAtMTc1LDI4ICsyMzIsNDQgQEAKICAgICAgICAgb3V0X3BpeF9mbXRzID0gb3V0X3JnYjlfcGl4X2ZtdHM7CiAgICAgZWxzZSBpZiAocmdiICYmIGRlcHRoID09IDEwKQogICAgICAgICBvdXRfcGl4X2ZtdHMgPSBvdXRfcmdiMTBfcGl4X2ZtdHM7CisgICAgZWxzZSBpZiAocmdiICYmIGRlcHRoID09IDEyKQorICAgICAgICBvdXRfcGl4X2ZtdHMgPSBvdXRfcmdiMTJfcGl4X2ZtdHM7CisgICAgZWxzZSBpZiAoZGVwdGggPT0gOCkKKyAgICAgICAgb3V0X3BpeF9mbXRzID0gb3V0X3l1djhfcGl4X2ZtdHM7CiAgICAgZWxzZSBpZiAoZGVwdGggPT0gOSkKICAgICAgICAgb3V0X3BpeF9mbXRzID0gb3V0X3l1djlfcGl4X2ZtdHM7CiAgICAgZWxzZSBpZiAoZGVwdGggPT0gMTApCiAgICAgICAgIG91dF9waXhfZm10cyA9IG91dF95dXYxMF9waXhfZm10czsKKyAgICBlbHNlIGlmIChkZXB0aCA9PSAxMikKKyAgICAgICAgb3V0X3BpeF9mbXRzID0gb3V0X3l1djEyX3BpeF9mbXRzOwogICAgIGVsc2UKLSAgICAgICAgb3V0X3BpeF9mbXRzID0gb3V0X3l1djhfcGl4X2ZtdHM7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CiAgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KG91dF9waXhfZm10cyksICZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHVpbnQ4X3QgYmxhY2tfeXV2YV9jb2xvcls0XSA9IHsgMCwgMTI3LCAxMjcsIDAgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGJsYWNrX2dicnBfY29sb3JbNF0gPSB7IDAsIDAsIDAsIDAgfTsKLQogc3RhdGljIGludCBjb25maWdfb3V0cHV0KEFWRmlsdGVyTGluayAqb3V0bGluaykKIHsKICAgICBWZWN0b3JzY29wZUNvbnRleHQgKnMgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgaW50IGk7CiAKICAgICBzLT5pbnRlbnNpdHkgPSBzLT5maW50ZW5zaXR5ICogKHMtPnNpemUgLSAxKTsKICAgICBvdXRsaW5rLT5oID0gb3V0bGluay0+dyA9IHMtPnNpemU7CiAgICAgb3V0bGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsxLDF9OworCisgICAgcy0+cGVha19tZW1vcnkgPSBhdl9jYWxsb2Mocy0+c2l6ZSwgcy0+c2l6ZSk7CisgICAgaWYgKCFzLT5wZWFrX21lbW9yeSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHMtPnBlYWsgPSBhdl9jYWxsb2Mocy0+c2l6ZSwgc2l6ZW9mKCpzLT5wZWFrKSk7CisgICAgaWYgKCFzLT5wZWFrKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPnNpemU7IGkrKykKKyAgICAgICAgcy0+cGVha1tpXSA9IHMtPnBlYWtfbWVtb3J5ICsgcy0+c2l6ZSAqIGk7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzQ2LDQ4ICs0MTksNTUgQEAKICAgICB1aW50MTZfdCAqZHBkID0gZHN0W3BkXTsKICAgICBjb25zdCBpbnQgbWF4ID0gcy0+c2l6ZSAtIDE7CiAgICAgY29uc3QgaW50IG1pZCA9IHMtPnNpemUgLyAyOworICAgIGNvbnN0IGludCB0bWluID0gcy0+dG1pbjsKKyAgICBjb25zdCBpbnQgdG1heCA9IHMtPnRtYXg7CiAgICAgaW50IGksIGosIGs7CiAKICAgICBmb3IgKGsgPSAwOyBrIDwgNCAmJiBkc3Rba107IGsrKykgewotICAgICAgICBjb25zdCBpbnQgbXVsdCA9IHMtPm11bHQ7Ci0KICAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dC0+aGVpZ2h0IDsgaSsrKQogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dC0+d2lkdGg7IGorKykKICAgICAgICAgICAgICAgICBBVl9XTjE2KG91dC0+ZGF0YVtrXSArIGkgKiBvdXQtPmxpbmVzaXplW2tdICsgaiAqIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzLT5tb2RlID09IENPTE9SICYmIGsgPT0gcy0+cGQgPyAwIDogcy0+YmdfY29sb3Jba10gKiBtdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIChzLT5tb2RlID09IENPTE9SIHx8IHMtPm1vZGUgPT0gQ09MT1I1KSAmJiBrID09IHMtPnBkID8gMCA6IHMtPmJnX2NvbG9yW2tdKTsKICAgICB9CiAKICAgICBzd2l0Y2ggKHMtPm1vZGUpIHsKICAgICBjYXNlIENPTE9SOgorICAgIGNhc2UgQ09MT1I1OgogICAgIGNhc2UgR1JBWToKICAgICAgICAgaWYgKHMtPmlzX3l1dikgewogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCBpd3ggPSBpICogc2xpbmVzaXpleDsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXd5ID0gaSAqIHNsaW5lc2l6ZXk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGl3ZCA9IGkgKiBzbGluZXNpemVkOwogICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHggPSBGRk1JTihzcHhbaXd4ICsgal0sIG1heCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB5ID0gRkZNSU4oc3B5W2l3eSArIGpdLCBtYXgpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeiA9IHNwZFtpd2QgKyBqXTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBvcyA9IHkgKiBkbGluZXNpemUgKyB4OwogCisgICAgICAgICAgICAgICAgICAgIGlmICh6IDwgdG1pbiB8fCB6ID4gdG1heCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICAgICAgICAgIGRwZFtwb3NdID0gRkZNSU4oZHBkW3Bvc10gKyBpbnRlbnNpdHksIG1heCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkc3RbM10pCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RbM11bcG9zXSA9IG1heDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IGl3eCA9IGkgKiBzbGluZXNpemV4OwogICAgICAgICAgICAgICAgIGNvbnN0IGludCBpd3kgPSBpICogc2xpbmVzaXpleTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXdkID0gaSAqIHNsaW5lc2l6ZWQ7CiAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeCA9IEZGTUlOKHNweFtpd3ggKyBqXSwgbWF4KTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHkgPSBGRk1JTihzcHlbaXd5ICsgal0sIG1heCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB6ID0gc3BkW2l3ZCArIGpdOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcG9zID0geSAqIGRsaW5lc2l6ZSArIHg7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHogPCB0bWluIHx8IHogPiB0bWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgICAgICAgICAgZHN0WzBdW3Bvc10gPSBGRk1JTihkc3RbMF1bcG9zXSArIGludGVuc2l0eSwgbWF4KTsKICAgICAgICAgICAgICAgICAgICAgZHN0WzFdW3Bvc10gPSBGRk1JTihkc3RbMV1bcG9zXSArIGludGVuc2l0eSwgbWF4KTsKICAgICAgICAgICAgICAgICAgICAgZHN0WzJdW3Bvc10gPSBGRk1JTihkc3RbMl1bcG9zXSArIGludGVuc2l0eSwgbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRzdFszXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFszXVtwb3NdID0gbWF4OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzk3LDM0ICs0NzcsNDAgQEAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXcxID0gaSAqIHNsaW5lc2l6ZXg7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IGl3MiA9IGkgKiBzbGluZXNpemV5OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpd2QgPSBpICogc2xpbmVzaXplZDsKICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB4ID0gRkZNSU4oc3B4W2l3MSArIGpdLCBtYXgpOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeSA9IEZGTUlOKHNweVtpdzIgKyBqXSwgbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHogPSBzcGRbaXdkICsgal07CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwb3MgPSB5ICogZGxpbmVzaXplICsgeDsKIAorICAgICAgICAgICAgICAgICAgICBpZiAoeiA8IHRtaW4gfHwgeiA+IHRtYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRwZFtwb3NdKQogICAgICAgICAgICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRkFCUyhtaWQgLSB4KSArIEZGQUJTKG1pZCAtIHkpOwogICAgICAgICAgICAgICAgICAgICBkcHhbcG9zXSA9IHg7CiAgICAgICAgICAgICAgICAgICAgIGRweVtwb3NdID0geTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRzdFszXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFszXVtwb3NdID0gbWF4OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXcxID0gaSAqIHNsaW5lc2l6ZXg7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IGl3MiA9IGkgKiBzbGluZXNpemV5OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpd2QgPSBpICogc2xpbmVzaXplZDsKICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB4ID0gRkZNSU4oc3B4W2l3MSArIGpdLCBtYXgpOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeSA9IEZGTUlOKHNweVtpdzIgKyBqXSwgbWF4KTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHogPSBzcGRbaXdkICsgal07CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwb3MgPSB5ICogZGxpbmVzaXplICsgeDsKIAorICAgICAgICAgICAgICAgICAgICBpZiAoeiA8IHRtaW4gfHwgeiA+IHRtYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRwZFtwb3NdKQogICAgICAgICAgICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRk1JTih4ICsgeSwgbWF4KTsKICAgICAgICAgICAgICAgICAgICAgZHB4W3Bvc10gPSB4OwogICAgICAgICAgICAgICAgICAgICBkcHlbcG9zXSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkc3RbM10pCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RbM11bcG9zXSA9IG1heDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQzMywxNiArNTE5LDE5IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IGludCBpdzEgPSBpICogc2xpbmVzaXpleDsKICAgICAgICAgICAgIGNvbnN0IGludCBpdzIgPSBpICogc2xpbmVzaXpleTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpd2QgPSBpICogc2xpbmVzaXplZDsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeCA9IEZGTUlOKHNweFtpdzEgKyBqXSwgbWF4KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeSA9IEZGTUlOKHNweVtpdzIgKyBqXSwgbWF4KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeiA9IHNwZFtpd2QgKyBqXTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcG9zID0geSAqIGRsaW5lc2l6ZSArIHg7CiAKKyAgICAgICAgICAgICAgICBpZiAoeiA8IHRtaW4gfHwgeiA+IHRtYXgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRk1JTihtYXgsIGRwZFtwb3NdICsgaW50ZW5zaXR5KTsKICAgICAgICAgICAgICAgICBkcHhbcG9zXSA9IHg7CiAgICAgICAgICAgICAgICAgZHB5W3Bvc10gPSB5OwotICAgICAgICAgICAgICAgIGlmIChkc3RbM10pCi0gICAgICAgICAgICAgICAgICAgIGRzdFszXVtwb3NdID0gbWF4OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtNDU0LDEzICs1NDMsMTUgQEAKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbi0+d2lkdGg7IGorKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCB4ID0gRkZNSU4oc3B4W2l3eCArIChqID4+IGhzdWIpXSwgbWF4KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeSA9IEZGTUlOKHNweVtpd3kgKyAoaiA+PiBoc3ViKV0sIG1heCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHogPSBzcGRbaXdkICsgal07CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBvcyA9IHkgKiBkbGluZXNpemUgKyB4OwogCi0gICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRk1BWChzcGRbaXdkICsgal0sIGRwZFtwb3NdKTsKKyAgICAgICAgICAgICAgICBpZiAoeiA8IHRtaW4gfHwgeiA+IHRtYXgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRk1BWCh6LCBkcGRbcG9zXSk7CiAgICAgICAgICAgICAgICAgZHB4W3Bvc10gPSB4OwogICAgICAgICAgICAgICAgIGRweVtwb3NdID0geTsKLSAgICAgICAgICAgICAgICBpZiAoZHN0WzNdKQotICAgICAgICAgICAgICAgICAgICBkc3RbM11bcG9zXSA9IG1heDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTQ3MCw2ICs1NjEsMTcgQEAKIAogICAgIGVudmVsb3BlMTYocywgb3V0KTsKIAorICAgIGlmIChkc3RbM10pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXQtPndpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zID0gaSAqIGRsaW5lc2l6ZSArIGo7CisKKyAgICAgICAgICAgICAgICBpZiAoZHBkW3Bvc10pCisgICAgICAgICAgICAgICAgICAgIGRzdFszXVtwb3NdID0gbWF4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKHMtPm1vZGUgPT0gQ09MT1IpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dC0+aGVpZ2h0OyBpKyspIHsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXQtPndpZHRoOyBqKyspIHsKQEAgLTQ4MCw2ICs1ODIsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHMtPm1vZGUgPT0gQ09MT1I1KSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXQtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0LT53aWR0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkcGRbaSAqIGRsaW5lc2l6ZSArIGpdKSB7CisgICAgICAgICAgICAgICAgICAgIGRweFtpICogZGxpbmVzaXplICsgal0gPSBqOworICAgICAgICAgICAgICAgICAgICBkcHlbaSAqIGRsaW5lc2l6ZSArIGpdID0gaTsKKyAgICAgICAgICAgICAgICAgICAgZHBkW2kgKiBkbGluZXNpemUgKyBqXSA9IG1pZCAqIE1fU1FSVDIgLSBoeXBvdChpIC0gbWlkLCBqIC0gbWlkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTUwMyw0NCArNjE1LDUzIEBACiAgICAgdWludDhfdCAqZHB4ID0gZHN0W3B4XTsKICAgICB1aW50OF90ICpkcHkgPSBkc3RbcHldOwogICAgIHVpbnQ4X3QgKmRwZCA9IGRzdFtwZF07CisgICAgY29uc3QgaW50IHRtaW4gPSBzLT50bWluOworICAgIGNvbnN0IGludCB0bWF4ID0gcy0+dG1heDsKICAgICBpbnQgaSwgaiwgazsKIAogICAgIGZvciAoayA9IDA7IGsgPCA0ICYmIGRzdFtrXTsgaysrKQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0LT5oZWlnaHQgOyBpKyspCiAgICAgICAgICAgICBtZW1zZXQoZHN0W2tdICsgaSAqIG91dC0+bGluZXNpemVba10sCi0gICAgICAgICAgICAgICAgICAgcy0+bW9kZSA9PSBDT0xPUiAmJiBrID09IHMtPnBkID8gMCA6IHMtPmJnX2NvbG9yW2tdLCBvdXQtPndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAocy0+bW9kZSA9PSBDT0xPUiB8fCBzLT5tb2RlID09IENPTE9SNSkgJiYgayA9PSBzLT5wZCA/IDAgOiBzLT5iZ19jb2xvcltrXSwgb3V0LT53aWR0aCk7CiAKICAgICBzd2l0Y2ggKHMtPm1vZGUpIHsKKyAgICBjYXNlIENPTE9SNToKICAgICBjYXNlIENPTE9SOgogICAgIGNhc2UgR1JBWToKICAgICAgICAgaWYgKHMtPmlzX3l1dikgewogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCBpd3ggPSBpICogc2xpbmVzaXpleDsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXd5ID0gaSAqIHNsaW5lc2l6ZXk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGl3ZCA9IGkgKiBzbGluZXNpemVkOwogICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHggPSBzcHhbaXd4ICsgal07CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB5ID0gc3B5W2l3eSArIGpdOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeiA9IHNwZFtpd2QgKyBqXTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBvcyA9IHkgKiBkbGluZXNpemUgKyB4OwogCisgICAgICAgICAgICAgICAgICAgIGlmICh6IDwgdG1pbiB8fCB6ID4gdG1heCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICAgICAgICAgIGRwZFtwb3NdID0gRkZNSU4oZHBkW3Bvc10gKyBpbnRlbnNpdHksIDI1NSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkc3RbM10pCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RbM11bcG9zXSA9IDI1NTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IGl3eCA9IGkgKiBzbGluZXNpemV4OwogICAgICAgICAgICAgICAgIGNvbnN0IGludCBpd3kgPSBpICogc2xpbmVzaXpleTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXdkID0gaSAqIHNsaW5lc2l6ZWQ7CiAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykgewogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeCA9IHNweFtpd3ggKyBqXTsKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHkgPSBzcHlbaXd5ICsgal07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB6ID0gc3BkW2l3ZCArIGpdOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcG9zID0geSAqIGRsaW5lc2l6ZSArIHg7CiAKKyAgICAgICAgICAgICAgICAgICAgaWYgKHogPCB0bWluIHx8IHogPiB0bWF4KQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgICAgICAgICAgICAgZHN0WzBdW3Bvc10gPSBGRk1JTihkc3RbMF1bcG9zXSArIGludGVuc2l0eSwgMjU1KTsKICAgICAgICAgICAgICAgICAgICAgZHN0WzFdW3Bvc10gPSBGRk1JTihkc3RbMV1bcG9zXSArIGludGVuc2l0eSwgMjU1KTsKICAgICAgICAgICAgICAgICAgICAgZHN0WzJdW3Bvc10gPSBGRk1JTihkc3RbMl1bcG9zXSArIGludGVuc2l0eSwgMjU1KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRzdFszXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFszXVtwb3NdID0gMjU1OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTUwLDM0ICs2NzEsNDAgQEAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXcxID0gaSAqIHNsaW5lc2l6ZXg7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IGl3MiA9IGkgKiBzbGluZXNpemV5OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpd2QgPSBpICogc2xpbmVzaXplZDsKICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB4ID0gc3B4W2l3MSArIGpdOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeSA9IHNweVtpdzIgKyBqXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHogPSBzcGRbaXdkICsgal07CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwb3MgPSB5ICogZGxpbmVzaXplICsgeDsKIAorICAgICAgICAgICAgICAgICAgICBpZiAoeiA8IHRtaW4gfHwgeiA+IHRtYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRwZFtwb3NdKQogICAgICAgICAgICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRkFCUygxMjggLSB4KSArIEZGQUJTKDEyOCAtIHkpOwogICAgICAgICAgICAgICAgICAgICBkcHhbcG9zXSA9IHg7CiAgICAgICAgICAgICAgICAgICAgIGRweVtwb3NdID0geTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRzdFszXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdFszXVtwb3NdID0gMjU1OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgaXcxID0gaSAqIHNsaW5lc2l6ZXg7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IGl3MiA9IGkgKiBzbGluZXNpemV5OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBpd2QgPSBpICogc2xpbmVzaXplZDsKICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB4ID0gc3B4W2l3MSArIGpdOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeSA9IHNweVtpdzIgKyBqXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHogPSBzcGRbaXdkICsgal07CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBwb3MgPSB5ICogZGxpbmVzaXplICsgeDsKIAorICAgICAgICAgICAgICAgICAgICBpZiAoeiA8IHRtaW4gfHwgeiA+IHRtYXgpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKwogICAgICAgICAgICAgICAgICAgICBpZiAoIWRwZFtwb3NdKQogICAgICAgICAgICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRk1JTih4ICsgeSwgMjU1KTsKICAgICAgICAgICAgICAgICAgICAgZHB4W3Bvc10gPSB4OwogICAgICAgICAgICAgICAgICAgICBkcHlbcG9zXSA9IHk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkc3RbM10pCi0gICAgICAgICAgICAgICAgICAgICAgICBkc3RbM11bcG9zXSA9IDI1NTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTU4NiwxNiArNzEzLDE5IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKICAgICAgICAgICAgIGNvbnN0IGludCBpdzEgPSBpICogc2xpbmVzaXpleDsKICAgICAgICAgICAgIGNvbnN0IGludCBpdzIgPSBpICogc2xpbmVzaXpleTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpd2QgPSBpICogc2xpbmVzaXplZDsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeCA9IHNweFtpdzEgKyBqXTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeSA9IHNweVtpdzIgKyBqXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgeiA9IHNwZFtpd2QgKyBqXTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcG9zID0geSAqIGRsaW5lc2l6ZSArIHg7CiAKKyAgICAgICAgICAgICAgICBpZiAoeiA8IHRtaW4gfHwgeiA+IHRtYXgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRk1JTigyNTUsIGRwZFtwb3NdICsgaW50ZW5zaXR5KTsKICAgICAgICAgICAgICAgICBkcHhbcG9zXSA9IHg7CiAgICAgICAgICAgICAgICAgZHB5W3Bvc10gPSB5OwotICAgICAgICAgICAgICAgIGlmIChkc3RbM10pCi0gICAgICAgICAgICAgICAgICAgIGRzdFszXVtwb3NdID0gMjU1OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtNjA3LDEzICs3MzcsMTUgQEAKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBpbi0+d2lkdGg7IGorKykgewogICAgICAgICAgICAgICAgIGNvbnN0IGludCB4ID0gc3B4W2l3eCArIChqID4+IGhzdWIpXTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQgeSA9IHNweVtpd3kgKyAoaiA+PiBoc3ViKV07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IHogPSBzcGRbaXdkICsgal07CiAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBvcyA9IHkgKiBkbGluZXNpemUgKyB4OwogCi0gICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRk1BWChzcGRbaXdkICsgal0sIGRwZFtwb3NdKTsKKyAgICAgICAgICAgICAgICBpZiAoeiA8IHRtaW4gfHwgeiA+IHRtYXgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgZHBkW3Bvc10gPSBGRk1BWCh6LCBkcGRbcG9zXSk7CiAgICAgICAgICAgICAgICAgZHB4W3Bvc10gPSB4OwogICAgICAgICAgICAgICAgIGRweVtwb3NdID0geTsKLSAgICAgICAgICAgICAgICBpZiAoZHN0WzNdKQotICAgICAgICAgICAgICAgICAgICBkc3RbM11bcG9zXSA9IDI1NTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTYyMyw2ICs3NTUsMTcgQEAKIAogICAgIGVudmVsb3BlKHMsIG91dCk7CiAKKyAgICBpZiAoZHN0WzNdKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXQtPmhlaWdodDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0LT53aWR0aDsgaisrKSB7CisgICAgICAgICAgICAgICAgaW50IHBvcyA9IGkgKiBkbGluZXNpemUgKyBqOworCisgICAgICAgICAgICAgICAgaWYgKGRwZFtwb3NdKQorICAgICAgICAgICAgICAgICAgICBkc3RbM11bcG9zXSA9IDI1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGlmIChzLT5tb2RlID09IENPTE9SKSB7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvdXQtPmhlaWdodDsgaSsrKSB7CiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0LT53aWR0aDsgaisrKSB7CkBAIC02MzMsNiArNzc2LDQyOCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+bW9kZSA9PSBDT0xPUjUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dC0+aGVpZ2h0OyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBvdXQtPndpZHRoOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWRwZFtpICogb3V0LT5saW5lc2l6ZVtwZF0gKyBqXSkgeworICAgICAgICAgICAgICAgICAgICBkcHhbaSAqIG91dC0+bGluZXNpemVbcHhdICsgal0gPSBqOworICAgICAgICAgICAgICAgICAgICBkcHlbaSAqIG91dC0+bGluZXNpemVbcHldICsgal0gPSBpOworICAgICAgICAgICAgICAgICAgICBkcGRbaSAqIG91dC0+bGluZXNpemVbcGRdICsgal0gPSAxMjggKiBNX1NRUlQyIC0gaHlwb3QoaSAtIDEyOCwgaiAtIDEyOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitjb25zdCBzdGF0aWMgY2hhciAqcG9zaXRpb25zX25hbWVbXSA9IHsKKyAgICAiUiIsICJCIiwgIkN5IiwgIllsIiwgIkciLCAiTWciLAorfTsKKworY29uc3Qgc3RhdGljIHVpbnQxNl90IHBvc2l0aW9uc1tdWzE0XVszXSA9IHsKKyAgeworICAgIHsgIDgxLCAgOTAsIDI0MCB9LCB7ICA0MSwgMjQwLCAxMTAgfSwgeyAxNzAsIDE2NiwgIDE2IH0sCisgICAgeyAyMTAsICAxNiwgMTQ2IH0sIHsgMTQ1LCAgNTQsICAzNCB9LCB7IDEwNiwgMjAyLCAyMjIgfSwKKyAgICB7IDE2MiwgIDQ0LCAxNDIgfSwgeyAxMzEsIDE1NiwgIDQ0IH0sIHsgMTEyLCAgNzIsICA1OCB9LAorICAgIHsgIDg0LCAxODQsIDE5OCB9LCB7ICA2NSwgMTAwLCAyMTIgfSwgeyAgMzUsIDIxMiwgMTE0IH0sCisgICAgeyAyMzUsIDEyOCwgMTI4IH0sIHsgMTYsIDEyOCwgMTI4IH0gfSwKKyAgeyB7ICA2MywgMTAyLCAyNDAgfSwgeyAgMzIsIDI0MCwgMTE4IH0sIHsgMTg4LCAxNTQsICAxNiB9LAorICAgIHsgMjE5LCAgMTYsIDEzOCB9LCB7IDE3MywgIDQyLCAgMjYgfSwgeyAgNzgsIDIxNCwgMjMwIH0sCisgICAgeyAgMjgsIDIxMiwgMTIwIH0sIHsgIDUxLCAxMDksIDIxMiB9LCB7ICA2MywgMTkzLCAyMDQgfSwKKyAgICB7IDEzMywgIDYzLCAgNTIgfSwgeyAxNDUsIDE0NywgIDQ0IH0sIHsgMTY4LCAgNDQsIDEzNiB9LAorICAgIHsgMjM1LCAxMjgsIDEyOCB9LCB7IDE2LCAxMjgsIDEyOCB9IH0sCisgIHsgeyAgODEqMiwgIDkwKjIsIDI0MCoyIH0sIHsgIDQxKjIsIDI0MCoyLCAxMTAqMiB9LCB7IDE3MCoyLCAxNjYqMiwgIDE2KjIgfSwKKyAgICB7IDIxMCoyLCAgMTYqMiwgMTQ2KjIgfSwgeyAxNDUqMiwgIDU0KjIsICAzNCoyIH0sIHsgMTA2KjIsIDIwMioyLCAyMjIqMiB9LAorICAgIHsgMTYyKjIsICA0NCoyLCAxNDIqMiB9LCB7IDEzMSoyLCAxNTYqMiwgIDQ0KjIgfSwgeyAxMTIqMiwgIDcyKjIsICA1OCoyIH0sCisgICAgeyAgODQqMiwgMTg0KjIsIDE5OCoyIH0sIHsgIDY1KjIsIDEwMCoyLCAyMTIqMiB9LCB7ICAzNSoyLCAyMTIqMiwgMTE0KjIgfSwKKyAgICB7IDQ3MCwgMjU2LCAyNTYgfSwgeyAzMiwgMjU2LCAyNTYgfSB9LAorICB7IHsgIDYzKjIsIDEwMioyLCAyNDAqMiB9LCB7ICAzMioyLCAyNDAqMiwgMTE4KjIgfSwgeyAxODgqMiwgMTU0KjIsICAxNioyIH0sCisgICAgeyAyMTkqMiwgIDE2KjIsIDEzOCoyIH0sIHsgMTczKjIsICA0MioyLCAgMjYqMiB9LCB7ICA3OCoyLCAyMTQqMiwgMjMwKjIgfSwKKyAgICB7ICAyOCoyLCAyMTIqMiwgMTIwKjIgfSwgeyAgNTEqMiwgMTA5KjIsIDIxMioyIH0sIHsgIDYzKjIsIDE5MyoyLCAyMDQqMiB9LAorICAgIHsgMTMzKjIsICA2MyoyLCAgNTIqMiB9LCB7IDE0NSoyLCAxNDcqMiwgIDQ0KjIgfSwgeyAxNjgqMiwgIDQ0KjIsIDEzNioyIH0sCisgICAgeyA0NzAsIDI1NiwgMjU2IH0sIHsgMzIsIDI1NiwgMjU2IH0gfSwKKyAgeyB7ICA4MSo0LCAgOTAqNCwgMjQwKjQgfSwgeyAgNDEqNCwgMjQwKjQsIDExMCo0IH0sIHsgMTcwKjQsIDE2Nio0LCAgMTYqNCB9LAorICAgIHsgMjEwKjQsICAxNio0LCAxNDYqNCB9LCB7IDE0NSo0LCAgNTQqNCwgIDM0KjQgfSwgeyAxMDYqNCwgMjAyKjQsIDIyMio0IH0sCisgICAgeyAxNjIqNCwgIDQ0KjQsIDE0Mio0IH0sIHsgMTMxKjQsIDE1Nio0LCAgNDQqNCB9LCB7IDExMio0LCAgNzIqNCwgIDU4KjQgfSwKKyAgICB7ICA4NCo0LCAxODQqNCwgMTk4KjQgfSwgeyAgNjUqNCwgMTAwKjQsIDIxMio0IH0sIHsgIDM1KjQsIDIxMio0LCAxMTQqNCB9LAorICAgIHsgOTQwLCA1MTIsIDUxMiB9LCB7IDY0LCA1MTIsIDUxMiB9IH0sCisgIHsgeyAgNjMqNCwgMTAyKjQsIDI0MCo0IH0sIHsgIDMyKjQsIDI0MCo0LCAxMTgqNCB9LCB7IDE4OCo0LCAxNTQqNCwgIDE2KjQgfSwKKyAgICB7IDIxOSo0LCAgMTYqNCwgMTM4KjQgfSwgeyAxNzMqNCwgIDQyKjQsICAyNio0IH0sIHsgIDc4KjQsIDIxNCo0LCAyMzAqNCB9LAorICAgIHsgIDI4KjQsIDIxMio0LCAxMjAqNCB9LCB7ICA1MSo0LCAxMDkqNCwgMjEyKjQgfSwgeyAgNjMqNCwgMTkzKjQsIDIwNCo0IH0sCisgICAgeyAxMzMqNCwgIDYzKjQsICA1Mio0IH0sIHsgMTQ1KjQsIDE0Nyo0LCAgNDQqNCB9LCB7IDE2OCo0LCAgNDQqNCwgMTM2KjQgfSwKKyAgICB7IDk0MCwgNTEyLCA1MTIgfSwgeyA2NCwgNTEyLCA1MTIgfSB9LAorICB7IHsgIDgxKjgsICA5MCo0LCAyNDAqOCB9LCB7ICA0MSo4LCAyNDAqOCwgMTEwKjggfSwgeyAxNzAqOCwgMTY2KjgsICAxNio4IH0sCisgICAgeyAyMTAqOCwgIDE2KjQsIDE0Nio4IH0sIHsgMTQ1KjgsICA1NCo4LCAgMzQqOCB9LCB7IDEwNio4LCAyMDIqOCwgMjIyKjggfSwKKyAgICB7IDE2Mio4LCAgNDQqNCwgMTQyKjggfSwgeyAxMzEqOCwgMTU2KjgsICA0NCo4IH0sIHsgMTEyKjgsICA3Mio4LCAgNTgqOCB9LAorICAgIHsgIDg0KjgsIDE4NCo0LCAxOTgqOCB9LCB7ICA2NSo4LCAxMDAqOCwgMjEyKjggfSwgeyAgMzUqOCwgMjEyKjgsIDExNCo4IH0sCisgICAgeyAxODgwLCAxMDI0LCAxMDI0IH0sIHsgMTI4LCAxMDI0LCAxMDI0IH0gfSwKKyAgeyB7ICA2Myo4LCAxMDIqOCwgMjQwKjggfSwgeyAgMzIqOCwgMjQwKjgsIDExOCo4IH0sIHsgMTg4KjgsIDE1NCo4LCAgMTYqOCB9LAorICAgIHsgMjE5KjgsICAxNio4LCAxMzgqOCB9LCB7IDE3Myo4LCAgNDIqOCwgIDI2KjggfSwgeyAgNzgqOCwgMjE0KjgsIDIzMCo4IH0sCisgICAgeyAgMjgqOCwgMjEyKjgsIDEyMCo4IH0sIHsgIDUxKjgsIDEwOSo4LCAyMTIqOCB9LCB7ICA2Myo4LCAxOTMqOCwgMjA0KjggfSwKKyAgICB7IDEzMyo4LCAgNjMqOCwgIDUyKjggfSwgeyAxNDUqOCwgMTQ3KjgsICA0NCo4IH0sIHsgMTY4KjgsICA0NCo4LCAxMzYqOCB9LAorICAgIHsgMTg4MCwgMTAyNCwgMTAyNCB9LCB7IDEyOCwgMTAyNCwgMTAyNCB9IH0sCisgIHsgeyAgODEqMTYsICA5MCoxNiwgMjQwKjE2IH0sIHsgIDQxKjE2LCAyNDAqMTYsIDExMCoxNiB9LCB7IDE3MCoxNiwgMTY2KjE2LCAgMTYqMTYgfSwKKyAgICB7IDIxMCoxNiwgIDE2KjE2LCAxNDYqMTYgfSwgeyAxNDUqMTYsICA1NCoxNiwgIDM0KjE2IH0sIHsgMTA2KjE2LCAyMDIqMTYsIDIyMioxNiB9LAorICAgIHsgMTYyKjE2LCAgNDQqMTYsIDE0MioxNiB9LCB7IDEzMSoxNiwgMTU2KjE2LCAgNDQqMTYgfSwgeyAxMTIqMTYsICA3MioxNiwgIDU4KjE2IH0sCisgICAgeyAgODQqMTYsIDE4NCoxNiwgMTk4KjE2IH0sIHsgIDY1KjE2LCAxMDAqMTYsIDIxMioxNiB9LCB7ICAzNSoxNiwgMjEyKjE2LCAxMTQqMTYgfSwKKyAgICB7IDM3NjAsIDIwNDgsIDIwNDggfSwgeyAyNTYsIDIwNDgsIDIwNDggfSB9LAorICB7IHsgIDYzKjE2LCAxMDIqMTYsIDI0MCoxNiB9LCB7ICAzMioxNiwgMjQwKjE2LCAxMTgqMTYgfSwgeyAxODgqMTYsIDE1NCoxNiwgIDE2KjE2IH0sCisgICAgeyAyMTkqMTYsICAxNioxNiwgMTM4KjE2IH0sIHsgMTczKjE2LCAgNDIqMTYsICAyNioxNiB9LCB7ICA3OCoxNiwgMjE0KjE2LCAyMzAqMTYgfSwKKyAgICB7ICAyOCoxNiwgMjEyKjE2LCAxMjAqMTYgfSwgeyAgNTEqMTYsIDEwOSoxNiwgMjEyKjE2IH0sIHsgIDYzKjE2LCAxOTMqMTYsIDIwNCoxNiB9LAorICAgIHsgMTMzKjE2LCAgNjMqMTYsICA1MioxNiB9LCB7IDE0NSoxNiwgMTQ3KjE2LCAgNDQqMTYgfSwgeyAxNjgqMTYsICA0NCoxNiwgMTM2KjE2IH0sCisgICAgeyAzNzYwLCAyMDQ4LCAyMDQ4IH0sIHsgMjU2LCAyMDQ4LCAyMDQ4IH0gfSwKK307CisKK3N0YXRpYyB2b2lkIGRyYXdfZG90cyh1aW50OF90ICpkc3QsIGludCBMLCBpbnQgdiwgZmxvYXQgbykKK3sKKyAgICBjb25zdCBmbG9hdCBmID0gMS4gLSBvOworICAgIGNvbnN0IGZsb2F0IFYgPSBvICogdjsKKyAgICBpbnQgbCA9IEwgKiAyOworCisgICAgZHN0WyBsIC0gM10gPSBkc3RbIGwgLSAzXSAqIGYgKyBWOworICAgIGRzdFsgbCArIDNdID0gZHN0WyBsICsgM10gKiBmICsgVjsKKyAgICBkc3RbLWwgLSAzXSA9IGRzdFstbCAtIDNdICogZiArIFY7CisgICAgZHN0Wy1sICsgM10gPSBkc3RbLWwgKyAzXSAqIGYgKyBWOworCisgICAgbCArPSBMOworCisgICAgZHN0WyBsIC0gM10gPSBkc3RbIGwgLSAzXSAqIGYgKyBWOworICAgIGRzdFsgbCArIDNdID0gZHN0WyBsICsgM10gKiBmICsgVjsKKyAgICBkc3RbIGwgLSAyXSA9IGRzdFsgbCAtIDJdICogZiArIFY7CisgICAgZHN0WyBsICsgMl0gPSBkc3RbIGwgKyAyXSAqIGYgKyBWOworICAgIGRzdFstbCAtIDNdID0gZHN0Wy1sIC0gM10gKiBmICsgVjsKKyAgICBkc3RbLWwgKyAzXSA9IGRzdFstbCArIDNdICogZiArIFY7CisgICAgZHN0Wy1sIC0gMl0gPSBkc3RbLWwgLSAyXSAqIGYgKyBWOworICAgIGRzdFstbCArIDJdID0gZHN0Wy1sICsgMl0gKiBmICsgVjsKK30KKworc3RhdGljIHZvaWQgZHJhd19kb3RzMTYodWludDE2X3QgKmRzdCwgaW50IEwsIGludCB2LCBmbG9hdCBvKQoreworICAgIGNvbnN0IGZsb2F0IGYgPSAxLiAtIG87CisgICAgY29uc3QgZmxvYXQgViA9IG8gKiB2OworICAgIGludCBsID0gTCAqIDI7CisKKyAgICBkc3RbIGwgLSAzXSA9IGRzdFsgbCAtIDNdICogZiArIFY7CisgICAgZHN0WyBsICsgM10gPSBkc3RbIGwgKyAzXSAqIGYgKyBWOworICAgIGRzdFstbCAtIDNdID0gZHN0Wy1sIC0gM10gKiBmICsgVjsKKyAgICBkc3RbLWwgKyAzXSA9IGRzdFstbCArIDNdICogZiArIFY7CisKKyAgICBsICs9IEw7CisKKyAgICBkc3RbIGwgLSAzXSA9IGRzdFsgbCAtIDNdICogZiArIFY7CisgICAgZHN0WyBsICsgM10gPSBkc3RbIGwgKyAzXSAqIGYgKyBWOworICAgIGRzdFsgbCAtIDJdID0gZHN0WyBsIC0gMl0gKiBmICsgVjsKKyAgICBkc3RbIGwgKyAyXSA9IGRzdFsgbCArIDJdICogZiArIFY7CisgICAgZHN0Wy1sIC0gM10gPSBkc3RbLWwgLSAzXSAqIGYgKyBWOworICAgIGRzdFstbCArIDNdID0gZHN0Wy1sICsgM10gKiBmICsgVjsKKyAgICBkc3RbLWwgLSAyXSA9IGRzdFstbCAtIDJdICogZiArIFY7CisgICAgZHN0Wy1sICsgMl0gPSBkc3RbLWwgKyAyXSAqIGYgKyBWOworfQorCitzdGF0aWMgdm9pZCBub25lX2dyYXRpY3VsZShWZWN0b3JzY29wZUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCwgaW50IFgsIGludCBZLCBpbnQgRCwgaW50IFApCit7Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfaHRleHQoQVZGcmFtZSAqb3V0LCBpbnQgeCwgaW50IHksIGZsb2F0IG8xLCBmbG9hdCBvMiwgY29uc3QgY2hhciAqdHh0LCBjb25zdCB1aW50OF90IGNvbG9yWzRdKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmZvbnQ7CisgICAgaW50IGZvbnRfaGVpZ2h0OworICAgIGludCBpLCBwbGFuZTsKKworICAgIGZvbnQgPSBhdnByaXZfY2dhX2ZvbnQsICAgZm9udF9oZWlnaHQgPSAgODsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgb3V0LT5kYXRhW3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBmb3IgKGkgPSAwOyB0eHRbaV07IGkrKykgeworICAgICAgICAgICAgaW50IGNoYXJfeSwgbWFzazsKKyAgICAgICAgICAgIGludCB2ID0gY29sb3JbcGxhbmVdOworCisgICAgICAgICAgICB1aW50OF90ICpwID0gb3V0LT5kYXRhW3BsYW5lXSArIHkgKiBvdXQtPmxpbmVzaXplW3BsYW5lXSArICh4ICsgaSAqIDgpOworICAgICAgICAgICAgZm9yIChjaGFyX3kgPSBmb250X2hlaWdodCAtIDE7IGNoYXJfeSA+PSAwOyBjaGFyX3ktLSkgeworICAgICAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRbdHh0W2ldICogZm9udF9oZWlnaHQgKyBjaGFyX3ldICYgbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBbMF0gPSBwWzBdICogbzIgKyB2ICogbzE7CisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcCArPSBvdXQtPmxpbmVzaXplW3BsYW5lXSAtIDg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfaHRleHQxNihBVkZyYW1lICpvdXQsIGludCB4LCBpbnQgeSwgZmxvYXQgbzEsIGZsb2F0IG8yLCBjb25zdCBjaGFyICp0eHQsIGNvbnN0IHVpbnQxNl90IGNvbG9yWzRdKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmZvbnQ7CisgICAgaW50IGZvbnRfaGVpZ2h0OworICAgIGludCBpLCBwbGFuZTsKKworICAgIGZvbnQgPSBhdnByaXZfY2dhX2ZvbnQsICAgZm9udF9oZWlnaHQgPSAgODsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgb3V0LT5kYXRhW3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBmb3IgKGkgPSAwOyB0eHRbaV07IGkrKykgeworICAgICAgICAgICAgaW50IGNoYXJfeSwgbWFzazsKKyAgICAgICAgICAgIGludCB2ID0gY29sb3JbcGxhbmVdOworCisgICAgICAgICAgICB1aW50MTZfdCAqcCA9ICh1aW50MTZfdCAqKShvdXQtPmRhdGFbcGxhbmVdICsgeSAqIG91dC0+bGluZXNpemVbcGxhbmVdKSArICh4ICsgaSAqIDgpOworICAgICAgICAgICAgZm9yIChjaGFyX3kgPSBmb250X2hlaWdodCAtIDE7IGNoYXJfeSA+PSAwOyBjaGFyX3ktLSkgeworICAgICAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRbdHh0W2ldICogZm9udF9oZWlnaHQgKyBjaGFyX3ldICYgbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBbMF0gPSBwWzBdICogbzIgKyB2ICogbzE7CisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcCArPSBvdXQtPmxpbmVzaXplW3BsYW5lXSAvIDIgLSA4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb2xvcl9ncmF0aWN1bGUxNihWZWN0b3JzY29wZUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCwgaW50IFgsIGludCBZLCBpbnQgRCwgaW50IFApCit7CisgICAgY29uc3QgaW50IG1heCA9IHMtPnNpemUgLSAxOworICAgIGNvbnN0IGZsb2F0IG8gPSBzLT5vcGFjaXR5OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgaW50IHggPSBwb3NpdGlvbnNbUF1baV1bWF07CisgICAgICAgIGludCB5ID0gcG9zaXRpb25zW1BdW2ldW1ldOworICAgICAgICBpbnQgZCA9IHBvc2l0aW9uc1tQXVtpXVtEXTsKKworICAgICAgICBkcmF3X2RvdHMxNigodWludDE2X3QgKikob3V0LT5kYXRhW0RdICsgeSAqIG91dC0+bGluZXNpemVbRF0gKyB4ICogMiksIG91dC0+bGluZXNpemVbRF0gLyAyLCBkLCBvKTsKKyAgICAgICAgZHJhd19kb3RzMTYoKHVpbnQxNl90ICopKG91dC0+ZGF0YVtYXSArIHkgKiBvdXQtPmxpbmVzaXplW1hdICsgeCAqIDIpLCBvdXQtPmxpbmVzaXplW1hdIC8gMiwgeCwgbyk7CisgICAgICAgIGRyYXdfZG90czE2KCh1aW50MTZfdCAqKShvdXQtPmRhdGFbWV0gKyB5ICogb3V0LT5saW5lc2l6ZVtZXSArIHggKiAyKSwgb3V0LT5saW5lc2l6ZVtZXSAvIDIsIHksIG8pOworICAgICAgICBpZiAob3V0LT5kYXRhWzNdKQorICAgICAgICAgICAgZHJhd19kb3RzMTYoKHVpbnQxNl90ICopKG91dC0+ZGF0YVszXSArIHkgKiBvdXQtPmxpbmVzaXplWzNdICsgeCAqIDIpLCBvdXQtPmxpbmVzaXplWzNdIC8gMiwgbWF4LCBvKTsKKyAgICB9CisKKyAgICBpZiAocy0+ZmxhZ3MgJiAxKSB7CisgICAgICAgIGludCB4ID0gcG9zaXRpb25zW1BdWzEyXVtYXTsKKyAgICAgICAgaW50IHkgPSBwb3NpdGlvbnNbUF1bMTJdW1ldOworICAgICAgICBpbnQgZCA9IHBvc2l0aW9uc1tQXVsxMl1bRF07CisKKyAgICAgICAgZHJhd19kb3RzMTYoKHVpbnQxNl90ICopKG91dC0+ZGF0YVtEXSArIHkgKiBvdXQtPmxpbmVzaXplW0RdICsgeCAqIDIpLCBvdXQtPmxpbmVzaXplW0RdIC8gMiwgZCwgbyk7CisgICAgICAgIGRyYXdfZG90czE2KCh1aW50MTZfdCAqKShvdXQtPmRhdGFbWF0gKyB5ICogb3V0LT5saW5lc2l6ZVtYXSArIHggKiAyKSwgb3V0LT5saW5lc2l6ZVtYXSAvIDIsIHgsIG8pOworICAgICAgICBkcmF3X2RvdHMxNigodWludDE2X3QgKikob3V0LT5kYXRhW1ldICsgeSAqIG91dC0+bGluZXNpemVbWV0gKyB4ICogMiksIG91dC0+bGluZXNpemVbWV0gLyAyLCB5LCBvKTsKKyAgICAgICAgaWYgKG91dC0+ZGF0YVszXSkKKyAgICAgICAgICAgIGRyYXdfZG90czE2KCh1aW50MTZfdCAqKShvdXQtPmRhdGFbM10gKyB5ICogb3V0LT5saW5lc2l6ZVszXSArIHggKiAyKSwgb3V0LT5saW5lc2l6ZVszXSAvIDIsIG1heCwgbyk7CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgMikgeworICAgICAgICBpbnQgeCA9IHBvc2l0aW9uc1tQXVsxM11bWF07CisgICAgICAgIGludCB5ID0gcG9zaXRpb25zW1BdWzEzXVtZXTsKKyAgICAgICAgaW50IGQgPSBwb3NpdGlvbnNbUF1bMTNdW0RdOworCisgICAgICAgIGRyYXdfZG90czE2KCh1aW50MTZfdCAqKShvdXQtPmRhdGFbRF0gKyB5ICogb3V0LT5saW5lc2l6ZVtEXSArIHggKiAyKSwgb3V0LT5saW5lc2l6ZVtEXSAvIDIsIGQsIG8pOworICAgICAgICBkcmF3X2RvdHMxNigodWludDE2X3QgKikob3V0LT5kYXRhW1hdICsgeSAqIG91dC0+bGluZXNpemVbWF0gKyB4ICogMiksIG91dC0+bGluZXNpemVbWF0gLyAyLCB4LCBvKTsKKyAgICAgICAgZHJhd19kb3RzMTYoKHVpbnQxNl90ICopKG91dC0+ZGF0YVtZXSArIHkgKiBvdXQtPmxpbmVzaXplW1ldICsgeCAqIDIpLCBvdXQtPmxpbmVzaXplW1ldIC8gMiwgeSwgbyk7CisgICAgICAgIGlmIChvdXQtPmRhdGFbM10pCisgICAgICAgICAgICBkcmF3X2RvdHMxNigodWludDE2X3QgKikob3V0LT5kYXRhWzNdICsgeSAqIG91dC0+bGluZXNpemVbM10gKyB4ICogMiksIG91dC0+bGluZXNpemVbM10gLyAyLCBtYXgsIG8pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA2ICYmIHMtPmZsYWdzICYgNDsgaSsrKSB7CisgICAgICAgIHVpbnQxNl90IGNvbG9yWzRdID0geyAwLCAwLCAwLCAwIH07CisgICAgICAgIGludCB4ID0gcG9zaXRpb25zW1BdW2ldW1hdOworICAgICAgICBpbnQgeSA9IHBvc2l0aW9uc1tQXVtpXVtZXTsKKyAgICAgICAgaW50IGQgPSBwb3NpdGlvbnNbUF1baV1bRF07CisKKyAgICAgICAgY29sb3JbRF0gPSBkOworICAgICAgICBjb2xvcltYXSA9IHg7CisgICAgICAgIGNvbG9yW1ldID0geTsKKyAgICAgICAgY29sb3JbM10gPSBtYXg7CisKKyAgICAgICAgaWYgKHggPiBtYXggLyAyKQorICAgICAgICAgICAgeCArPSA4OworICAgICAgICBlbHNlCisgICAgICAgICAgICB4IC09IDE0OworICAgICAgICBpZiAoeSA+IG1heCAvIDIpCisgICAgICAgICAgICB5ICs9IDg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHkgLT0gMTQ7CisKKyAgICAgICAgeCA9IGF2X2NsaXAoeCwgMCwgb3V0LT53aWR0aCAtIDkpOworICAgICAgICB5ID0gYXZfY2xpcCh5LCAwLCBvdXQtPmhlaWdodCAtIDkpOworICAgICAgICBkcmF3X2h0ZXh0MTYob3V0LCB4LCB5LCBvLCAxLiAtIG8sIHBvc2l0aW9uc19uYW1lW2ldLCBjb2xvcik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb2xvcl9ncmF0aWN1bGUoVmVjdG9yc2NvcGVDb250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIGludCBYLCBpbnQgWSwgaW50IEQsIGludCBQKQoreworICAgIGNvbnN0IGZsb2F0IG8gPSBzLT5vcGFjaXR5OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgaW50IHggPSBwb3NpdGlvbnNbUF1baV1bWF07CisgICAgICAgIGludCB5ID0gcG9zaXRpb25zW1BdW2ldW1ldOworICAgICAgICBpbnQgZCA9IHBvc2l0aW9uc1tQXVtpXVtEXTsKKworICAgICAgICBkcmF3X2RvdHMob3V0LT5kYXRhW0RdICsgeSAqIG91dC0+bGluZXNpemVbRF0gKyB4LCBvdXQtPmxpbmVzaXplW0RdLCBkLCBvKTsKKyAgICAgICAgZHJhd19kb3RzKG91dC0+ZGF0YVtYXSArIHkgKiBvdXQtPmxpbmVzaXplW1hdICsgeCwgb3V0LT5saW5lc2l6ZVtYXSwgeCwgbyk7CisgICAgICAgIGRyYXdfZG90cyhvdXQtPmRhdGFbWV0gKyB5ICogb3V0LT5saW5lc2l6ZVtZXSArIHgsIG91dC0+bGluZXNpemVbWV0sIHksIG8pOworICAgICAgICBpZiAob3V0LT5kYXRhWzNdKQorICAgICAgICAgICAgZHJhd19kb3RzKG91dC0+ZGF0YVszXSArIHkgKiBvdXQtPmxpbmVzaXplWzNdICsgeCwgb3V0LT5saW5lc2l6ZVszXSwgMjU1LCBvKTsKKyAgICB9CisKKyAgICBpZiAocy0+ZmxhZ3MgJiAxKSB7CisgICAgICAgIGludCB4ID0gcG9zaXRpb25zW1BdWzEyXVtYXTsKKyAgICAgICAgaW50IHkgPSBwb3NpdGlvbnNbUF1bMTJdW1ldOworICAgICAgICBpbnQgZCA9IHBvc2l0aW9uc1tQXVsxMl1bRF07CisKKyAgICAgICAgZHJhd19kb3RzKG91dC0+ZGF0YVtEXSArIHkgKiBvdXQtPmxpbmVzaXplW0RdICsgeCwgb3V0LT5saW5lc2l6ZVtEXSwgZCwgbyk7CisgICAgICAgIGRyYXdfZG90cyhvdXQtPmRhdGFbWF0gKyB5ICogb3V0LT5saW5lc2l6ZVtYXSArIHgsIG91dC0+bGluZXNpemVbWF0sIHgsIG8pOworICAgICAgICBkcmF3X2RvdHMob3V0LT5kYXRhW1ldICsgeSAqIG91dC0+bGluZXNpemVbWV0gKyB4LCBvdXQtPmxpbmVzaXplW1ldLCB5LCBvKTsKKyAgICAgICAgaWYgKG91dC0+ZGF0YVszXSkKKyAgICAgICAgICAgIGRyYXdfZG90cyhvdXQtPmRhdGFbM10gKyB5ICogb3V0LT5saW5lc2l6ZVszXSArIHgsIG91dC0+bGluZXNpemVbM10sIDI1NSwgbyk7CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgMikgeworICAgICAgICBpbnQgeCA9IHBvc2l0aW9uc1tQXVsxM11bWF07CisgICAgICAgIGludCB5ID0gcG9zaXRpb25zW1BdWzEzXVtZXTsKKyAgICAgICAgaW50IGQgPSBwb3NpdGlvbnNbUF1bMTJdW0RdOworCisgICAgICAgIGRyYXdfZG90cyhvdXQtPmRhdGFbRF0gKyB5ICogb3V0LT5saW5lc2l6ZVtEXSArIHgsIG91dC0+bGluZXNpemVbRF0sIGQsIG8pOworICAgICAgICBkcmF3X2RvdHMob3V0LT5kYXRhW1hdICsgeSAqIG91dC0+bGluZXNpemVbWF0gKyB4LCBvdXQtPmxpbmVzaXplW1hdLCB4LCBvKTsKKyAgICAgICAgZHJhd19kb3RzKG91dC0+ZGF0YVtZXSArIHkgKiBvdXQtPmxpbmVzaXplW1ldICsgeCwgb3V0LT5saW5lc2l6ZVtZXSwgeSwgbyk7CisgICAgICAgIGlmIChvdXQtPmRhdGFbM10pCisgICAgICAgICAgICBkcmF3X2RvdHMob3V0LT5kYXRhWzNdICsgeSAqIG91dC0+bGluZXNpemVbM10gKyB4LCBvdXQtPmxpbmVzaXplWzNdLCAyNTUsIG8pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA2ICYmIHMtPmZsYWdzICYgNDsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgY29sb3JbNF0gPSB7IDAsIDAsIDAsIDI1NSB9OworICAgICAgICBpbnQgeCA9IHBvc2l0aW9uc1tQXVtpXVtYXTsKKyAgICAgICAgaW50IHkgPSBwb3NpdGlvbnNbUF1baV1bWV07CisgICAgICAgIGludCBkID0gcG9zaXRpb25zW1BdW2ldW0RdOworCisgICAgICAgIGNvbG9yW0RdID0gZDsKKyAgICAgICAgY29sb3JbWF0gPSB4OworICAgICAgICBjb2xvcltZXSA9IHk7CisKKyAgICAgICAgaWYgKHggPiAxMjgpCisgICAgICAgICAgICB4ICs9IDg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggLT0gMTQ7CisgICAgICAgIGlmICh5ID4gMTI4KQorICAgICAgICAgICAgeSArPSA4OworICAgICAgICBlbHNlCisgICAgICAgICAgICB5IC09IDE0OworCisgICAgICAgIHggPSBhdl9jbGlwKHgsIDAsIG91dC0+d2lkdGggLSA5KTsKKyAgICAgICAgeSA9IGF2X2NsaXAoeSwgMCwgb3V0LT5oZWlnaHQgLSA5KTsKKyAgICAgICAgZHJhd19odGV4dChvdXQsIHgsIHksIG8sIDEuIC0gbywgcG9zaXRpb25zX25hbWVbaV0sIGNvbG9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdyZWVuX2dyYXRpY3VsZTE2KFZlY3RvcnNjb3BlQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgWCwgaW50IFksIGludCBELCBpbnQgUCkKK3sKKyAgICBjb25zdCBpbnQgbWF4ID0gcy0+c2l6ZSAtIDE7CisgICAgY29uc3QgZmxvYXQgbyA9IHMtPm9wYWNpdHk7CisgICAgY29uc3QgaW50IG0gPSBzLT5tdWx0OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgaW50IHggPSBwb3NpdGlvbnNbUF1baV1bWF07CisgICAgICAgIGludCB5ID0gcG9zaXRpb25zW1BdW2ldW1ldOworCisgICAgICAgIGRyYXdfZG90czE2KCh1aW50MTZfdCAqKShvdXQtPmRhdGFbMF0gKyB5ICogb3V0LT5saW5lc2l6ZVswXSArIHggKiAyKSwgb3V0LT5saW5lc2l6ZVswXSAvIDIsIDEyOCAqIG0sIG8pOworICAgICAgICBkcmF3X2RvdHMxNigodWludDE2X3QgKikob3V0LT5kYXRhWzFdICsgeSAqIG91dC0+bGluZXNpemVbMV0gKyB4ICogMiksIG91dC0+bGluZXNpemVbMV0gLyAyLCAwLCBvKTsKKyAgICAgICAgZHJhd19kb3RzMTYoKHVpbnQxNl90ICopKG91dC0+ZGF0YVsyXSArIHkgKiBvdXQtPmxpbmVzaXplWzJdICsgeCAqIDIpLCBvdXQtPmxpbmVzaXplWzJdIC8gMiwgMCwgbyk7CisgICAgICAgIGlmIChvdXQtPmRhdGFbM10pCisgICAgICAgICAgICBkcmF3X2RvdHMxNigodWludDE2X3QgKikob3V0LT5kYXRhWzNdICsgeSAqIG91dC0+bGluZXNpemVbM10gKyB4ICogMiksIG91dC0+bGluZXNpemVbM10gLyAyLCBtYXgsIG8pOworICAgIH0KKworICAgIGlmIChzLT5mbGFncyAmIDEpIHsKKyAgICAgICAgaW50IHggPSBwb3NpdGlvbnNbUF1bMTJdW1hdOworICAgICAgICBpbnQgeSA9IHBvc2l0aW9uc1tQXVsxMl1bWV07CisKKyAgICAgICAgZHJhd19kb3RzMTYoKHVpbnQxNl90ICopKG91dC0+ZGF0YVswXSArIHkgKiBvdXQtPmxpbmVzaXplWzBdICsgeCAqIDIpLCBvdXQtPmxpbmVzaXplWzBdIC8gMiwgMTI4ICogbSwgbyk7CisgICAgICAgIGRyYXdfZG90czE2KCh1aW50MTZfdCAqKShvdXQtPmRhdGFbMV0gKyB5ICogb3V0LT5saW5lc2l6ZVsxXSArIHggKiAyKSwgb3V0LT5saW5lc2l6ZVsxXSAvIDIsIDAsIG8pOworICAgICAgICBkcmF3X2RvdHMxNigodWludDE2X3QgKikob3V0LT5kYXRhWzJdICsgeSAqIG91dC0+bGluZXNpemVbMl0gKyB4ICogMiksIG91dC0+bGluZXNpemVbMl0gLyAyLCAwLCBvKTsKKyAgICAgICAgaWYgKG91dC0+ZGF0YVszXSkKKyAgICAgICAgICAgIGRyYXdfZG90czE2KCh1aW50MTZfdCAqKShvdXQtPmRhdGFbM10gKyB5ICogb3V0LT5saW5lc2l6ZVszXSArIHggKiAyKSwgb3V0LT5saW5lc2l6ZVszXSAvIDIsIG1heCwgbyk7CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgMikgeworICAgICAgICBpbnQgeCA9IHBvc2l0aW9uc1tQXVsxM11bWF07CisgICAgICAgIGludCB5ID0gcG9zaXRpb25zW1BdWzEzXVtZXTsKKworICAgICAgICBkcmF3X2RvdHMxNigodWludDE2X3QgKikob3V0LT5kYXRhWzBdICsgeSAqIG91dC0+bGluZXNpemVbMF0gKyB4ICogMiksIG91dC0+bGluZXNpemVbMF0gLyAyLCAxMjggKiBtLCBvKTsKKyAgICAgICAgZHJhd19kb3RzMTYoKHVpbnQxNl90ICopKG91dC0+ZGF0YVsxXSArIHkgKiBvdXQtPmxpbmVzaXplWzFdICsgeCAqIDIpLCBvdXQtPmxpbmVzaXplWzFdIC8gMiwgMCwgbyk7CisgICAgICAgIGRyYXdfZG90czE2KCh1aW50MTZfdCAqKShvdXQtPmRhdGFbMl0gKyB5ICogb3V0LT5saW5lc2l6ZVsyXSArIHggKiAyKSwgb3V0LT5saW5lc2l6ZVsyXSAvIDIsIDAsIG8pOworICAgICAgICBpZiAob3V0LT5kYXRhWzNdKQorICAgICAgICAgICAgZHJhd19kb3RzMTYoKHVpbnQxNl90ICopKG91dC0+ZGF0YVszXSArIHkgKiBvdXQtPmxpbmVzaXplWzNdICsgeCAqIDIpLCBvdXQtPmxpbmVzaXplWzNdIC8gMiwgbWF4LCBvKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNiAmJiBzLT5mbGFncyAmIDQ7IGkrKykgeworICAgICAgICBjb25zdCB1aW50MTZfdCBjb2xvcls0XSA9IHsgMTI4ICogbSwgMCwgMCwgbWF4IH07CisgICAgICAgIGludCB4ID0gcG9zaXRpb25zW1BdW2ldW1hdOworICAgICAgICBpbnQgeSA9IHBvc2l0aW9uc1tQXVtpXVtZXTsKKworICAgICAgICBpZiAoeCA+IG1heCAvIDIpCisgICAgICAgICAgICB4ICs9IDg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHggLT0gMTQ7CisgICAgICAgIGlmICh5ID4gbWF4IC8gMikKKyAgICAgICAgICAgIHkgKz0gODsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeSAtPSAxNDsKKworICAgICAgICB4ID0gYXZfY2xpcCh4LCAwLCBvdXQtPndpZHRoIC0gOSk7CisgICAgICAgIHkgPSBhdl9jbGlwKHksIDAsIG91dC0+aGVpZ2h0IC0gOSk7CisgICAgICAgIGRyYXdfaHRleHQxNihvdXQsIHgsIHksIG8sIDEuIC0gbywgcG9zaXRpb25zX25hbWVbaV0sIGNvbG9yKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdyZWVuX2dyYXRpY3VsZShWZWN0b3JzY29wZUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCwgaW50IFgsIGludCBZLCBpbnQgRCwgaW50IFApCit7CisgICAgY29uc3QgZmxvYXQgbyA9IHMtPm9wYWNpdHk7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgICAgICBpbnQgeCA9IHBvc2l0aW9uc1tQXVtpXVtYXTsKKyAgICAgICAgaW50IHkgPSBwb3NpdGlvbnNbUF1baV1bWV07CisKKyAgICAgICAgZHJhd19kb3RzKG91dC0+ZGF0YVswXSArIHkgKiBvdXQtPmxpbmVzaXplWzBdICsgeCwgb3V0LT5saW5lc2l6ZVswXSwgMTI4LCBvKTsKKyAgICAgICAgZHJhd19kb3RzKG91dC0+ZGF0YVsxXSArIHkgKiBvdXQtPmxpbmVzaXplWzFdICsgeCwgb3V0LT5saW5lc2l6ZVsxXSwgMCwgbyk7CisgICAgICAgIGRyYXdfZG90cyhvdXQtPmRhdGFbMl0gKyB5ICogb3V0LT5saW5lc2l6ZVsyXSArIHgsIG91dC0+bGluZXNpemVbMl0sIDAsIG8pOworICAgICAgICBpZiAob3V0LT5kYXRhWzNdKQorICAgICAgICAgICAgZHJhd19kb3RzKG91dC0+ZGF0YVszXSArIHkgKiBvdXQtPmxpbmVzaXplWzNdICsgeCwgb3V0LT5saW5lc2l6ZVszXSwgMjU1LCBvKTsKKyAgICB9CisKKyAgICBpZiAocy0+ZmxhZ3MgJiAxKSB7CisgICAgICAgIGludCB4ID0gcG9zaXRpb25zW1BdWzEyXVtYXTsKKyAgICAgICAgaW50IHkgPSBwb3NpdGlvbnNbUF1bMTJdW1ldOworCisgICAgICAgIGRyYXdfZG90cyhvdXQtPmRhdGFbMF0gKyB5ICogb3V0LT5saW5lc2l6ZVswXSArIHgsIG91dC0+bGluZXNpemVbMF0sIDEyOCwgbyk7CisgICAgICAgIGRyYXdfZG90cyhvdXQtPmRhdGFbMV0gKyB5ICogb3V0LT5saW5lc2l6ZVsxXSArIHgsIG91dC0+bGluZXNpemVbMV0sIDAsIG8pOworICAgICAgICBkcmF3X2RvdHMob3V0LT5kYXRhWzJdICsgeSAqIG91dC0+bGluZXNpemVbMl0gKyB4LCBvdXQtPmxpbmVzaXplWzJdLCAwLCBvKTsKKyAgICAgICAgaWYgKG91dC0+ZGF0YVszXSkKKyAgICAgICAgICAgIGRyYXdfZG90cyhvdXQtPmRhdGFbM10gKyB5ICogb3V0LT5saW5lc2l6ZVszXSArIHgsIG91dC0+bGluZXNpemVbM10sIDI1NSwgbyk7CisgICAgfQorCisgICAgaWYgKHMtPmZsYWdzICYgMikgeworICAgICAgICBpbnQgeCA9IHBvc2l0aW9uc1tQXVsxM11bWF07CisgICAgICAgIGludCB5ID0gcG9zaXRpb25zW1BdWzEzXVtZXTsKKworICAgICAgICBkcmF3X2RvdHMob3V0LT5kYXRhWzBdICsgeSAqIG91dC0+bGluZXNpemVbMF0gKyB4LCBvdXQtPmxpbmVzaXplWzBdLCAxMjgsIG8pOworICAgICAgICBkcmF3X2RvdHMob3V0LT5kYXRhWzFdICsgeSAqIG91dC0+bGluZXNpemVbMV0gKyB4LCBvdXQtPmxpbmVzaXplWzFdLCAwLCBvKTsKKyAgICAgICAgZHJhd19kb3RzKG91dC0+ZGF0YVsyXSArIHkgKiBvdXQtPmxpbmVzaXplWzJdICsgeCwgb3V0LT5saW5lc2l6ZVsyXSwgMCwgbyk7CisgICAgICAgIGlmIChvdXQtPmRhdGFbM10pCisgICAgICAgICAgICBkcmF3X2RvdHMob3V0LT5kYXRhWzNdICsgeSAqIG91dC0+bGluZXNpemVbM10gKyB4LCBvdXQtPmxpbmVzaXplWzNdLCAyNTUsIG8pOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCA2ICYmIHMtPmZsYWdzICYgNDsgaSsrKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgY29sb3JbNF0gPSB7IDEyOCwgMCwgMCwgMjU1IH07CisgICAgICAgIGludCB4ID0gcG9zaXRpb25zW1BdW2ldW1hdOworICAgICAgICBpbnQgeSA9IHBvc2l0aW9uc1tQXVtpXVtZXTsKKworICAgICAgICBpZiAoeCA+IDEyOCkKKyAgICAgICAgICAgIHggKz0gODsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeCAtPSAxNDsKKyAgICAgICAgaWYgKHkgPiAxMjgpCisgICAgICAgICAgICB5ICs9IDg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHkgLT0gMTQ7CisKKyAgICAgICAgeCA9IGF2X2NsaXAoeCwgMCwgb3V0LT53aWR0aCAtIDkpOworICAgICAgICB5ID0gYXZfY2xpcCh5LCAwLCBvdXQtPmhlaWdodCAtIDkpOworICAgICAgICBkcmF3X2h0ZXh0KG91dCwgeCwgeSwgbywgMS4gLSBvLCBwb3NpdGlvbnNfbmFtZVtpXSwgY29sb3IpOwogICAgIH0KIH0KIApAQCAtNjQyLDE1ICsxMjA3LDM4IEBACiAgICAgVmVjdG9yc2NvcGVDb250ZXh0ICpzID0gY3R4LT5wcml2OwogICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKICAgICBBVkZyYW1lICpvdXQ7CisgICAgaW50IHBsYW5lOworCisgICAgaWYgKHMtPmNvbG9yc3BhY2UpIHsKKyAgICAgICAgcy0+Y3MgPSAocy0+ZGVwdGggLSA4KSAqIDIgKyBzLT5jb2xvcnNwYWNlIC0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBzd2l0Y2ggKGluLT5jb2xvcnNwYWNlKSB7CisgICAgICAgIGNhc2UgQVZDT0xfU1BDX1NNUFRFMTcwTToKKyAgICAgICAgY2FzZSBBVkNPTF9TUENfQlQ0NzBCRzoKKyAgICAgICAgICAgIHMtPmNzID0gKHMtPmRlcHRoIC0gOCkgKiAyICsgMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWQ09MX1NQQ19CVDcwOToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHMtPmNzID0gKHMtPmRlcHRoIC0gOCkgKiAyICsgMTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CiAgICAgaWYgKCFvdXQpIHsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KLSAgICBvdXQtPnB0cyA9IGluLT5wdHM7CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKIAogICAgIHMtPnZlY3RvcnNjb3BlKHMsIGluLCBvdXQsIHMtPnBkKTsKKyAgICBzLT5ncmF0aWN1bGVmKHMsIG91dCwgcy0+eCwgcy0+eSwgcy0+cGQsIHMtPmNzKTsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQ7IHBsYW5lKyspIHsKKyAgICAgICAgaWYgKG91dC0+ZGF0YVtwbGFuZV0pIHsKKyAgICAgICAgICAgIG91dC0+ZGF0YVtwbGFuZV0gICAgKz0gKHMtPnNpemUgLSAxKSAqIG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgb3V0LT5saW5lc2l6ZVtwbGFuZV0gPSAtb3V0LT5saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIH0KKyAgICB9CiAKICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CiAgICAgcmV0dXJuIGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBvdXQpOwpAQCAtNjU5LDExICsxMjQ3LDIwIEBACiBzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKIHsKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKLSAgICBWZWN0b3JzY29wZUNvbnRleHQgKnMgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFZlY3RvcnNjb3BlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKIAogICAgIHMtPmlzX3l1diA9ICEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKTsKICAgICBzLT5zaXplID0gMSA8PCBkZXNjLT5jb21wWzBdLmRlcHRoOwogICAgIHMtPm11bHQgPSBzLT5zaXplIC8gMjU2OworICAgIHMtPmRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBzLT50bWluID0gcy0+bHRocmVzaG9sZCAqIChzLT5zaXplIC0gMSk7CisgICAgcy0+dG1heCA9IHMtPmh0aHJlc2hvbGQgKiAocy0+c2l6ZSAtIDEpOworCisgICAgaWYgKHMtPnRtaW4gPiBzLT50bWF4KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgImxvdyB0aHJlc2hvbGQgc2hvdWxkIGJlIGxlc3MgdGhhbiBoaWdoIHRocmVzaG9sZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQogCiAgICAgaWYgKHMtPm1vZGUgPT0gR1JBWSAmJiBzLT5pc195dXYpCiAgICAgICAgIHMtPnBkID0gMDsKQEAgLTY4MSwxNSArMTI3OCwzNiBAQAogICAgIGVsc2UKICAgICAgICAgcy0+dmVjdG9yc2NvcGUgPSB2ZWN0b3JzY29wZTE2OwogCisgICAgcy0+Z3JhdGljdWxlZiA9IG5vbmVfZ3JhdGljdWxlOworCisgICAgaWYgKHMtPmlzX3l1diAmJiBzLT5zaXplID09IDI1NikgeworICAgICAgICBpZiAocy0+Z3JhdGljdWxlID09IDEpCisgICAgICAgICAgICBzLT5ncmF0aWN1bGVmID0gZ3JlZW5fZ3JhdGljdWxlOworICAgICAgICBlbHNlIGlmIChzLT5ncmF0aWN1bGUgPT0gMikKKyAgICAgICAgICAgIHMtPmdyYXRpY3VsZWYgPSBjb2xvcl9ncmF0aWN1bGU7CisgICAgfSBlbHNlIGlmIChzLT5pc195dXYpIHsKKyAgICAgICAgaWYgKHMtPmdyYXRpY3VsZSA9PSAxKQorICAgICAgICAgICAgcy0+Z3JhdGljdWxlZiA9IGdyZWVuX2dyYXRpY3VsZTE2OworICAgICAgICBlbHNlIGlmIChzLT5ncmF0aWN1bGUgPT0gMikKKyAgICAgICAgICAgIHMtPmdyYXRpY3VsZWYgPSBjb2xvcl9ncmF0aWN1bGUxNjsKKyAgICB9CisKKyAgICBzLT5iZ19jb2xvclszXSA9IHMtPmJnb3BhY2l0eSAqIChzLT5zaXplIC0gMSk7CisKICAgICBzd2l0Y2ggKGlubGluay0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMjoKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwOgogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOToKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6Ci0gICAgICAgIHMtPmJnX2NvbG9yID0gYmxhY2tfZ2JycF9jb2xvcjsKKyAgICAgICAgcy0+YmdfY29sb3JbMF0gPSAwOworICAgICAgICBzLT5iZ19jb2xvclsxXSA9IDA7CisgICAgICAgIHMtPmJnX2NvbG9yWzJdID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgcy0+YmdfY29sb3IgPSBibGFja195dXZhX2NvbG9yOworICAgICAgICBzLT5iZ19jb2xvclswXSA9IDA7CisgICAgICAgIHMtPmJnX2NvbG9yWzFdID0gcy0+c2l6ZSAvIDIgLSAxOworICAgICAgICBzLT5iZ19jb2xvclsyXSA9IHMtPnNpemUgLyAyIC0gMTsKICAgICB9CiAKICAgICBzLT5oc3ViID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKQEAgLTcwMiw2ICsxMzIwLDE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdW5pbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFZlY3RvcnNjb3BlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGF2X2ZyZWVwKCZzLT5wZWFrKTsKKyAgICBhdl9mcmVlcCgmcy0+cGVha19tZW1vcnkpOworfQorCiBzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgaW5wdXRzW10gPSB7CiAgICAgewogICAgICAgICAubmFtZSAgICAgICAgID0gImRlZmF1bHQiLApAQCAtNzI3LDYgKzEzNTMsNyBAQAogICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFZlY3RvcnNjb3BlQ29udGV4dCksCiAgICAgLnByaXZfY2xhc3MgICAgPSAmdmVjdG9yc2NvcGVfY2xhc3MsCiAgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC51bmluaXQgICAgICAgID0gdW5pbml0LAogICAgIC5pbnB1dHMgICAgICAgID0gaW5wdXRzLAogICAgIC5vdXRwdXRzICAgICAgID0gb3V0cHV0cywKIH07CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl92ZmxpcC5jIGIvbGliYXZmaWx0ZXIvdmZfdmZsaXAuYwppbmRleCBjYjA4NWU4Li5jN2MzOWQzIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl92ZmxpcC5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3ZmbGlwLmMKQEAgLTI0LDE1ICsyNCwyMyBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKICNpbmNsdWRlICJhdmZpbHRlci5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAidmlkZW8uaCIKIAogdHlwZWRlZiBzdHJ1Y3QgRmxpcENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCB2c3ViOyAgIC8vLzwgdmVydGljYWwgY2hyb21hIHN1YnNhbXBsaW5nCiB9IEZsaXBDb250ZXh0OwogCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdmZsaXBfb3B0aW9uc1tdID0geworICAgIHsgTlVMTCB9Cit9OworCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1ModmZsaXApOworCiBzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmxpbmspCiB7CiAgICAgRmxpcENvbnRleHQgKmZsaXAgPSBsaW5rLT5kc3QtPnByaXY7CkBAIC0xMDYsNiArMTE0LDggQEAKICAgICAubmFtZSAgICAgICAgPSAidmZsaXAiLAogICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJGbGlwIHRoZSBpbnB1dCB2aWRlbyB2ZXJ0aWNhbGx5LiIpLAogICAgIC5wcml2X3NpemUgICA9IHNpemVvZihGbGlwQ29udGV4dCksCisgICAgLnByaXZfY2xhc3MgID0gJnZmbGlwX2NsYXNzLAogICAgIC5pbnB1dHMgICAgICA9IGF2ZmlsdGVyX3ZmX3ZmbGlwX2lucHV0cywKICAgICAub3V0cHV0cyAgICAgPSBhdmZpbHRlcl92Zl92ZmxpcF9vdXRwdXRzLAorICAgIC5mbGFncyAgICAgICA9IEFWRklMVEVSX0ZMQUdfU1VQUE9SVF9USU1FTElORV9HRU5FUklDLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3ZmcmRldC5jIGIvbGliYXZmaWx0ZXIvdmZfdmZyZGV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FjOTZlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3ZmcmRldC5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBWRlJERVRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIGludDY0X3QgcHJldl9wdHM7CisgICAgaW50NjRfdCBkZWx0YTsKKyAgICBpbnQ2NF90IG1pbl9kZWx0YTsKKyAgICBpbnQ2NF90IG1heF9kZWx0YTsKKworICAgIHVpbnQ2NF90IHZmcjsKKyAgICB1aW50NjRfdCBjZnI7Cit9IFZGUkRFVENvbnRleHQ7CisKK3N0YXRpYyBpbnQgZmlsdGVyX2ZyYW1lKEFWRmlsdGVyTGluayAqaW5saW5rLCBBVkZyYW1lICppbikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFZGUkRFVENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAocy0+cHJldl9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaW50NjRfdCBkZWx0YSA9IGluLT5wdHMgLSBzLT5wcmV2X3B0czsKKworICAgICAgICBpZiAocy0+ZGVsdGEgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIHMtPmRlbHRhID0gZGVsdGE7CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+ZGVsdGEgIT0gZGVsdGEpIHsKKyAgICAgICAgICAgIHMtPnZmcisrOworICAgICAgICAgICAgcy0+ZGVsdGEgPSBkZWx0YTsKKyAgICAgICAgICAgIHMtPm1pbl9kZWx0YSA9IEZGTUlOKGRlbHRhLCBzLT5taW5fZGVsdGEpOworICAgICAgICAgICAgcy0+bWF4X2RlbHRhID0gRkZNQVgoZGVsdGEsIHMtPm1heF9kZWx0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5jZnIrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHMtPnByZXZfcHRzID0gaW4tPnB0czsKKworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCBpbik7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBpbml0KEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIFZGUkRFVENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBzLT5wcmV2X3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIHMtPmRlbHRhICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcy0+bWluX2RlbHRhID0gSU5UNjRfTUFYOworICAgIHMtPm1heF9kZWx0YSA9IElOVDY0X01JTjsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgYXZfY29sZCB2b2lkIHVuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBWRlJERVRDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJWRlI6JWYgKCUiUFJJdTY0Ii8lIlBSSXU2NCIpIiwgcy0+dmZyIC8gKGZsb2F0KShzLT52ZnIgKyBzLT5jZnIpLCBzLT52ZnIsIHMtPmNmcik7CisgICAgaWYgKHMtPnZmcikKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgbWluOiAlIlBSSWQ2NCIgbWF4OiAlIlBSSWQ2NCIpIiwgcy0+bWluX2RlbHRhLCBzLT5tYXhfZGVsdGEpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKK30KKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHZmcmRldF9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHZmcmRldF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdmZfdmZyZGV0ID0geworICAgIC5uYW1lICAgICAgICA9ICJ2ZnJkZXQiLAorICAgIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJWYXJpYWJsZSBmcmFtZSByYXRlIGRldGVjdCBmaWx0ZXIuIiksCisgICAgLnByaXZfc2l6ZSAgID0gc2l6ZW9mKFZGUkRFVENvbnRleHQpLAorICAgIC5pbml0ICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgID0gdW5pbml0LAorICAgIC5pbnB1dHMgICAgICA9IHZmcmRldF9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgID0gdmZyZGV0X291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdmlkc3RhYmRldGVjdC5jIGIvbGliYXZmaWx0ZXIvdmZfdmlkc3RhYmRldGVjdC5jCmluZGV4IDQ3NDI5NDkuLmZkN2ZmM2IgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3ZpZHN0YWJkZXRlY3QuYworKysgYi9saWJhdmZpbHRlci92Zl92aWRzdGFiZGV0ZWN0LmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2luY2x1ZGUgInZpZHN0YWJ1dGlscy5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBTdGFiRGF0YSB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAKICAgICBWU01vdGlvbkRldGVjdCBtZDsKQEAgLTEwNywxMCArMTA3LDExIEBACiAgICAgVlNNb3Rpb25EZXRlY3QqIG1kID0gJihzLT5tZCk7CiAgICAgVlNGcmFtZUluZm8gZmk7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IGlzX3BsYW5hciA9IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BMQU5BUjsKIAogICAgIHZzRnJhbWVJbmZvSW5pdCgmZmksIGlubGluay0+dywgaW5saW5rLT5oLAogICAgICAgICAgICAgICAgICAgICBmZl9hdjJ2c19waXhmbXQoY3R4LCBpbmxpbmstPmZvcm1hdCkpOwotICAgIGlmIChmaS5ieXRlc1BlclBpeGVsICE9IGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKS84KSB7CisgICAgaWYgKCFpc19wbGFuYXIgJiYgZmkuYnl0ZXNQZXJQaXhlbCAhPSBhdl9nZXRfYml0c19wZXJfcGl4ZWwoZGVzYykvOCkgewogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbC1mb3JtYXQgZXJyb3I6IHdyb25nIGJpdHMvcGVyL3BpeGVsLCBwbGVhc2UgcmVwb3J0IGEgQlVHIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdmlkc3RhYnRyYW5zZm9ybS5jIGIvbGliYXZmaWx0ZXIvdmZfdmlkc3RhYnRyYW5zZm9ybS5jCmluZGV4IGRhYzBhMmQuLmQxZWMxMzkgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3ZpZHN0YWJ0cmFuc2Zvcm0uYworKysgYi9saWJhdmZpbHRlci92Zl92aWRzdGFidHJhbnNmb3JtLmMKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2luY2x1ZGUgInZpZHN0YWJ1dGlscy5oIgogCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBUcmFuc2Zvcm1Db250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKIAogICAgIFZTVHJhbnNmb3JtRGF0YSB0ZDsKQEAgLTE0Niw2ICsxNDYsNyBAQAogICAgIEZJTEUgKmY7CiAKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKKyAgICBpbnQgaXNfcGxhbmFyID0gZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSOwogCiAgICAgVlNUcmFuc2Zvcm1EYXRhICp0ZCA9ICYodGMtPnRkKTsKIApAQCAtMTYxLDcgKzE2Miw3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgaWYgKGZpX3NyYy5ieXRlc1BlclBpeGVsICE9IGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKS84IHx8CisgICAgaWYgKCghaXNfcGxhbmFyICYmIGZpX3NyYy5ieXRlc1BlclBpeGVsICE9IGF2X2dldF9iaXRzX3Blcl9waXhlbChkZXNjKS84KSB8fAogICAgICAgICBmaV9zcmMubG9nMkNocm9tYVcgIT0gZGVzYy0+bG9nMl9jaHJvbWFfdyB8fAogICAgICAgICBmaV9zcmMubG9nMkNocm9tYUggIT0gZGVzYy0+bG9nMl9jaHJvbWFfaCkgewogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJwaXhlbC1mb3JtYXQgZXJyb3I6IGJwcCAlaTw+JWkgICIsCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl92aWduZXR0ZS5jIGIvbGliYXZmaWx0ZXIvdmZfdmlnbmV0dGUuYwppbmRleCAxZDY2YzUwLi40N2I1OWU1IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl92aWduZXR0ZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3ZpZ25ldHRlLmMKQEAgLTU3LDcgKzU3LDcgQEAKICAgICBFVkFMX01PREVfTkIKIH07CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFZpZ25ldHRlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOwogICAgIGludCBiYWNrd2FyZDsKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgIGludCBkc3RfbGluZXNpemUgPSBzLT5mbWFwX2xpbmVzaXplOwogCiAgICAgaWYgKGZyYW1lKSB7Ci0gICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX05dICAgPSBpbmxpbmstPmZyYW1lX2NvdW50OworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9OXSAgID0gaW5saW5rLT5mcmFtZV9jb3VudF9vdXQ7CiAgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1RdICAgPSBUUzJUKGZyYW1lLT5wdHMsIGlubGluay0+dGltZV9iYXNlKTsKICAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfUFRTXSA9IFRTMkQoZnJhbWUtPnB0cyk7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3ZtYWZtb3Rpb24uYyBiL2xpYmF2ZmlsdGVyL3ZmX3ZtYWZtb3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmNjNGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfdm1hZm1vdGlvbi5jCkBAIC0wLDAgKzEsMzY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNyBBc2hpc2ggUHJhdGFwIFNpbmdoIDxhc2hrNDM3MTJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBDYWxjdWxhdGUgVk1BRiBNb3Rpb24gc2NvcmUuCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiZHJhd3V0aWxzLmgiCisjaW5jbHVkZSAiZm9ybWF0cy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidm1hZl9tb3Rpb24uaCIKKworI2RlZmluZSBCSVRfU0hJRlQgMTUKKworc3RhdGljIGNvbnN0IGZsb2F0IEZJTFRFUl81WzVdID0geworICAgIDAuMDU0NDg4Njg1LAorICAgIDAuMjQ0MjAxMzQyLAorICAgIDAuNDAyNjE5OTQ3LAorICAgIDAuMjQ0MjAxMzQyLAorICAgIDAuMDU0NDg4Njg1Cit9OworCit0eXBlZGVmIHN0cnVjdCBWTUFGTW90aW9uQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgVk1BRk1vdGlvbkRhdGEgZGF0YTsKKyAgICBGSUxFICpzdGF0c19maWxlOworICAgIGNoYXIgKnN0YXRzX2ZpbGVfc3RyOworfSBWTUFGTW90aW9uQ29udGV4dDsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVk1BRk1vdGlvbkNvbnRleHQsIHgpCisjZGVmaW5lIEZMQUdTIEFWX09QVF9GTEFHX0ZJTFRFUklOR19QQVJBTXxBVl9PUFRfRkxBR19WSURFT19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gdm1hZm1vdGlvbl9vcHRpb25zW10gPSB7CisgICAgeyJzdGF0c19maWxlIiwgIlNldCBmaWxlIHdoZXJlIHRvIHN0b3JlIHBlci1mcmFtZSBkaWZmZXJlbmNlIGluZm9ybWF0aW9uIiwgT0ZGU0VUKHN0YXRzX2ZpbGVfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0cj1OVUxMfSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGSUxURVJfREVGSU5FX0NMQVNTKHZtYWZtb3Rpb24pOworCitzdGF0aWMgdWludDY0X3QgaW1hZ2Vfc2FkKGNvbnN0IHVpbnQxNl90ICppbWcxLCBjb25zdCB1aW50MTZfdCAqaW1nMiwgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoLCBwdHJkaWZmX3QgX2ltZzFfc3RyaWRlLCBwdHJkaWZmX3QgX2ltZzJfc3RyaWRlKQoreworICAgIHB0cmRpZmZfdCBpbWcxX3N0cmlkZSA9IF9pbWcxX3N0cmlkZSAvIHNpemVvZigqaW1nMSk7CisgICAgcHRyZGlmZl90IGltZzJfc3RyaWRlID0gX2ltZzJfc3RyaWRlIC8gc2l6ZW9mKCppbWcyKTsKKyAgICB1aW50NjRfdCBzdW0gPSAwOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGg7IGkrKykgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdzsgaisrKSB7CisgICAgICAgICAgICBzdW0gKz0gYWJzKGltZzFbal0gLSBpbWcyW2pdKTsKKyAgICAgICAgfQorICAgICAgICBpbWcxICs9IGltZzFfc3RyaWRlOworICAgICAgICBpbWcyICs9IGltZzJfc3RyaWRlOworICAgIH0KKworICAgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZvbHV0aW9uX3goY29uc3QgdWludDE2X3QgKmZpbHRlciwgaW50IGZpbHRfdywgY29uc3QgdWludDE2X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdCwgaW50IHcsIGludCBoLCBwdHJkaWZmX3QgX3NyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfZHN0X3N0cmlkZSkKK3sKKyAgICBwdHJkaWZmX3Qgc3JjX3N0cmlkZSA9IF9zcmNfc3RyaWRlIC8gc2l6ZW9mKCpzcmMpOworICAgIHB0cmRpZmZfdCBkc3Rfc3RyaWRlID0gX2RzdF9zdHJpZGUgLyBzaXplb2YoKmRzdCk7CisgICAgaW50IHJhZGl1cyA9IGZpbHRfdyAvIDI7CisgICAgaW50IGJvcmRlcnNfbGVmdCA9IHJhZGl1czsKKyAgICBpbnQgYm9yZGVyc19yaWdodCA9IHcgLSAoZmlsdF93IC0gcmFkaXVzKTsKKyAgICBpbnQgaSwgaiwgazsKKyAgICBpbnQgc3VtID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBoOyBpKyspIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGJvcmRlcnNfbGVmdDsgaisrKSB7CisgICAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGZpbHRfdzsgaysrKSB7CisgICAgICAgICAgICAgICAgaW50IGpfdGFwID0gRkZBQlMoaiAtIHJhZGl1cyArIGspOworICAgICAgICAgICAgICAgIGlmIChqX3RhcCA+PSB3KSB7CisgICAgICAgICAgICAgICAgICAgIGpfdGFwID0gdyAtIChqX3RhcCAtIHcgKyAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VtICs9IGZpbHRlcltrXSAqIHNyY1tpICogc3JjX3N0cmlkZSArIGpfdGFwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFtpICogZHN0X3N0cmlkZSArIGpdID0gc3VtID4+IEJJVF9TSElGVDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaiA9IGJvcmRlcnNfbGVmdDsgaiA8IGJvcmRlcnNfcmlnaHQ7IGorKykgeworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZmlsdF93OyBrKyspIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gZmlsdGVyW2tdICogc3JjW2kgKiBzcmNfc3RyaWRlICsgaiAtIHJhZGl1cyArIGtdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0W2kgKiBkc3Rfc3RyaWRlICsgal0gPSBzdW0gPj4gQklUX1NISUZUOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gYm9yZGVyc19yaWdodDsgaiA8IHc7IGorKykgeworICAgICAgICAgICAgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBmaWx0X3c7IGsrKykgeworICAgICAgICAgICAgICAgIGludCBqX3RhcCA9IEZGQUJTKGogLSByYWRpdXMgKyBrKTsKKyAgICAgICAgICAgICAgICBpZiAoal90YXAgPj0gdykgeworICAgICAgICAgICAgICAgICAgICBqX3RhcCA9IHcgLSAoal90YXAgLSB3ICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1bSArPSBmaWx0ZXJba10gKiBzcmNbaSAqIHNyY19zdHJpZGUgKyBqX3RhcF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RbaSAqIGRzdF9zdHJpZGUgKyBqXSA9IHN1bSA+PiBCSVRfU0hJRlQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgY29udl95X2ZuKHR5cGUsIGJpdHMpIFwKK3N0YXRpYyB2b2lkIGNvbnZvbHV0aW9uX3lfIyNiaXRzIyNiaXQoY29uc3QgdWludDE2X3QgKmZpbHRlciwgaW50IGZpbHRfdywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfc3JjLCB1aW50MTZfdCAqZHN0LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgcHRyZGlmZl90IF9zcmNfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBfZHN0X3N0cmlkZSkgXAoreyBcCisgICAgY29uc3QgdHlwZSAqc3JjID0gKGNvbnN0IHR5cGUgKikgX3NyYzsgXAorICAgIHB0cmRpZmZfdCBzcmNfc3RyaWRlID0gX3NyY19zdHJpZGUgLyBzaXplb2YoKnNyYyk7IFwKKyAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSA9IF9kc3Rfc3RyaWRlIC8gc2l6ZW9mKCpkc3QpOyBcCisgICAgaW50IHJhZGl1cyA9IGZpbHRfdyAvIDI7IFwKKyAgICBpbnQgYm9yZGVyc190b3AgPSByYWRpdXM7IFwKKyAgICBpbnQgYm9yZGVyc19ib3R0b20gPSBoIC0gKGZpbHRfdyAtIHJhZGl1cyk7IFwKKyAgICBpbnQgaSwgaiwgazsgXAorICAgIGludCBzdW0gPSAwOyBcCisgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBib3JkZXJzX3RvcDsgaSsrKSB7IFwKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHc7IGorKykgeyBcCisgICAgICAgICAgICBzdW0gPSAwOyBcCisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZmlsdF93OyBrKyspIHsgXAorICAgICAgICAgICAgICAgIGludCBpX3RhcCA9IEZGQUJTKGkgLSByYWRpdXMgKyBrKTsgXAorICAgICAgICAgICAgICAgIGlmIChpX3RhcCA+PSBoKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgaV90YXAgPSBoIC0gKGlfdGFwIC0gaCArIDEpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgc3VtICs9IGZpbHRlcltrXSAqIHNyY1tpX3RhcCAqIHNyY19zdHJpZGUgKyBqXTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBkc3RbaSAqIGRzdF9zdHJpZGUgKyBqXSA9IHN1bSA+PiBiaXRzOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorICAgIGZvciAoaSA9IGJvcmRlcnNfdG9wOyBpIDwgYm9yZGVyc19ib3R0b207IGkrKykgeyBcCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsgXAorICAgICAgICAgICAgc3VtID0gMDsgXAorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGZpbHRfdzsgaysrKSB7IFwKKyAgICAgICAgICAgICAgICBzdW0gKz0gZmlsdGVyW2tdICogc3JjWyhpIC0gcmFkaXVzICsgaykgKiBzcmNfc3RyaWRlICsgal07IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZHN0W2kgKiBkc3Rfc3RyaWRlICsgal0gPSBzdW0gPj4gYml0czsgXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICBmb3IgKGkgPSBib3JkZXJzX2JvdHRvbTsgaSA8IGg7IGkrKykgeyBcCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB3OyBqKyspIHsgXAorICAgICAgICAgICAgc3VtID0gMDsgXAorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGZpbHRfdzsgaysrKSB7IFwKKyAgICAgICAgICAgICAgICBpbnQgaV90YXAgPSBGRkFCUyhpIC0gcmFkaXVzICsgayk7IFwKKyAgICAgICAgICAgICAgICBpZiAoaV90YXAgPj0gaCkgeyBcCisgICAgICAgICAgICAgICAgICAgIGlfdGFwID0gaCAtIChpX3RhcCAtIGggKyAxKTsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgICAgIHN1bSArPSBmaWx0ZXJba10gKiBzcmNbaV90YXAgKiBzcmNfc3RyaWRlICsgal07IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgZHN0W2kgKiBkc3Rfc3RyaWRlICsgal0gPSBzdW0gPj4gYml0czsgXAorICAgICAgICB9IFwKKyAgICB9IFwKK30KKworY29udl95X2ZuKHVpbnQ4X3QsIDgpOworY29udl95X2ZuKHVpbnQxNl90LCAxMCk7CisKK3N0YXRpYyB2b2lkIHZtYWZtb3Rpb25kc3BfaW5pdChWTUFGTW90aW9uRFNQQ29udGV4dCAqZHNwLCBpbnQgYnBwKSB7CisgICAgZHNwLT5jb252b2x1dGlvbl94ID0gY29udm9sdXRpb25feDsKKyAgICBkc3AtPmNvbnZvbHV0aW9uX3kgPSBicHAgPT0gMTAgPyBjb252b2x1dGlvbl95XzEwYml0IDogY29udm9sdXRpb25feV84Yml0OworICAgIGRzcC0+c2FkID0gaW1hZ2Vfc2FkOworfQorCitkb3VibGUgZmZfdm1hZm1vdGlvbl9wcm9jZXNzKFZNQUZNb3Rpb25EYXRhICpzLCBBVkZyYW1lICpyZWYpCit7CisgICAgZG91YmxlIHNjb3JlOworCisgICAgcy0+dm1hZmRzcC5jb252b2x1dGlvbl95KHMtPmZpbHRlciwgNSwgcmVmLT5kYXRhWzBdLCBzLT50ZW1wX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoLCBzLT5oZWlnaHQsIHJlZi0+bGluZXNpemVbMF0sIHMtPnN0cmlkZSk7CisgICAgcy0+dm1hZmRzcC5jb252b2x1dGlvbl94KHMtPmZpbHRlciwgNSwgcy0+dGVtcF9kYXRhLCBzLT5ibHVyX2RhdGFbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPndpZHRoLCBzLT5oZWlnaHQsIHMtPnN0cmlkZSwgcy0+c3RyaWRlKTsKKworICAgIGlmICghcy0+bmJfZnJhbWVzKSB7CisgICAgICAgIHNjb3JlID0gMC4wOworICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQ2NF90IHNhZCA9IHMtPnZtYWZkc3Auc2FkKHMtPmJsdXJfZGF0YVsxXSwgcy0+Ymx1cl9kYXRhWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT53aWR0aCwgcy0+aGVpZ2h0LCBzLT5zdHJpZGUsIHMtPnN0cmlkZSk7CisgICAgICAgIC8vIHRoZSBvdXRwdXQgc2NvcmUgaXMgYWx3YXlzIG5vcm1hbGl6ZWQgdG8gOCBiaXRzCisgICAgICAgIHNjb3JlID0gKGRvdWJsZSkgKHNhZCAqIDEuMCAvIChzLT53aWR0aCAqIHMtPmhlaWdodCA8PCAoQklUX1NISUZUIC0gOCkpKTsKKyAgICB9CisKKyAgICBGRlNXQVAodWludDE2X3QgKiwgcy0+Ymx1cl9kYXRhWzBdLCBzLT5ibHVyX2RhdGFbMV0pOworICAgIHMtPm5iX2ZyYW1lcysrOworICAgIHMtPm1vdGlvbl9zdW0gKz0gc2NvcmU7CisKKyAgICByZXR1cm4gc2NvcmU7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9tZXRhKEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhLCBjb25zdCBjaGFyICprZXksIGZsb2F0IGQpCit7CisgICAgY2hhciB2YWx1ZVsxMjhdOworICAgIHNucHJpbnRmKHZhbHVlLCBzaXplb2YodmFsdWUpLCAiJTAuMmYiLCBkKTsKKyAgICBhdl9kaWN0X3NldChtZXRhZGF0YSwga2V5LCB2YWx1ZSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3ZtYWZtb3Rpb24oQVZGaWx0ZXJDb250ZXh0ICpjdHgsIEFWRnJhbWUgKnJlZikKK3sKKyAgICBWTUFGTW90aW9uQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBkb3VibGUgc2NvcmU7CisKKyAgICBzY29yZSA9IGZmX3ZtYWZtb3Rpb25fcHJvY2Vzcygmcy0+ZGF0YSwgcmVmKTsKKyAgICBzZXRfbWV0YSgmcmVmLT5tZXRhZGF0YSwgImxhdmZpLnZtYWZtb3Rpb24uc2NvcmUiLCBzY29yZSk7CisgICAgaWYgKHMtPnN0YXRzX2ZpbGUpIHsKKyAgICAgICAgZnByaW50ZihzLT5zdGF0c19maWxlLAorICAgICAgICAgICAgICAgICJuOiUiUFJJZDY0IiBtb3Rpb246JTAuMmxmXG4iLCBzLT5kYXRhLm5iX2ZyYW1lcywgc2NvcmUpOworICAgIH0KK30KKworCitpbnQgZmZfdm1hZm1vdGlvbl9pbml0KFZNQUZNb3Rpb25EYXRhICpzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGVudW0gQVZQaXhlbEZvcm1hdCBmbXQpCit7CisgICAgc2l6ZV90IGRhdGFfc3o7CisgICAgaW50IGk7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmbXQpOworCisgICAgcy0+d2lkdGggPSB3OworICAgIHMtPmhlaWdodCA9IGg7CisgICAgcy0+c3RyaWRlID0gRkZBTElHTih3ICogc2l6ZW9mKHVpbnQxNl90KSwgMzIpOworCisgICAgZGF0YV9zeiA9IChzaXplX3QpIHMtPnN0cmlkZSAqIGg7CisgICAgaWYgKCEocy0+Ymx1cl9kYXRhWzBdID0gYXZfbWFsbG9jKGRhdGFfc3opKSB8fAorICAgICAgICAhKHMtPmJsdXJfZGF0YVsxXSA9IGF2X21hbGxvYyhkYXRhX3N6KSkgfHwKKyAgICAgICAgIShzLT50ZW1wX2RhdGEgICAgPSBhdl9tYWxsb2MoZGF0YV9zeikpKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICBzLT5maWx0ZXJbaV0gPSBscmludChGSUxURVJfNVtpXSAqICgxIDw8IEJJVF9TSElGVCkpOworICAgIH0KKworICAgIHZtYWZtb3Rpb25kc3BfaW5pdCgmcy0+dm1hZmRzcCwgZGVzYy0+Y29tcFswXS5kZXB0aCk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworICAgIEFWRmlsdGVyRm9ybWF0cyAqZm10c19saXN0ID0gTlVMTDsKKyAgICBpbnQgZm9ybWF0LCByZXQ7CisKKyAgICBmb3IgKGZvcm1hdCA9IDA7IGF2X3BpeF9mbXRfZGVzY19nZXQoZm9ybWF0KTsgZm9ybWF0KyspIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChmb3JtYXQpOworICAgICAgICBpZiAoIShkZXNjLT5mbGFncyAmIChBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwgfCBBVl9QSVhfRk1UX0ZMQUdfQklUU1RSRUFNIHwgQVZfUElYX0ZNVF9GTEFHX1BBTCkpICYmCisgICAgICAgICAgICAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHx8IGRlc2MtPm5iX2NvbXBvbmVudHMgPT0gMSkgJiYKKyAgICAgICAgICAgICghKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKSA9PSAhSEFWRV9CSUdFTkRJQU4gfHwgZGVzYy0+Y29tcFswXS5kZXB0aCA9PSA4KSAmJgorICAgICAgICAgICAgKGRlc2MtPmNvbXBbMF0uZGVwdGggPT0gOCB8fCBkZXNjLT5jb21wWzBdLmRlcHRoID09IDEwKSAmJgorICAgICAgICAgICAgKHJldCA9IGZmX2FkZF9mb3JtYXQoJmZtdHNfbGlzdCwgZm9ybWF0KSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm10c19saXN0KTsKK30KKworc3RhdGljIGludCBjb25maWdfaW5wdXRfcmVmKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ICA9IGlubGluay0+ZHN0OworICAgIFZNQUZNb3Rpb25Db250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgcmV0dXJuIGZmX3ZtYWZtb3Rpb25faW5pdCgmcy0+ZGF0YSwgY3R4LT5pbnB1dHNbMF0tPncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmlucHV0c1swXS0+aCwgY3R4LT5pbnB1dHNbMF0tPmZvcm1hdCk7Cit9CisKK2RvdWJsZSBmZl92bWFmbW90aW9uX3VuaW5pdChWTUFGTW90aW9uRGF0YSAqcykKK3sKKyAgICBhdl9mcmVlKHMtPmJsdXJfZGF0YVswXSk7CisgICAgYXZfZnJlZShzLT5ibHVyX2RhdGFbMV0pOworICAgIGF2X2ZyZWUocy0+dGVtcF9kYXRhKTsKKworICAgIHJldHVybiBzLT5uYl9mcmFtZXMgPiAwID8gcy0+bW90aW9uX3N1bSAvIHMtPm5iX2ZyYW1lcyA6IDAuMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfZnJhbWUoQVZGaWx0ZXJMaW5rICppbmxpbmssIEFWRnJhbWUgKnJlZikKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIGRvX3ZtYWZtb3Rpb24oY3R4LCByZWYpOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUoY3R4LT5vdXRwdXRzWzBdLCByZWYpOworfQorCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBWTUFGTW90aW9uQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworICAgIGlmIChzLT5zdGF0c19maWxlX3N0cikgeworICAgICAgICBpZiAoIXN0cmNtcChzLT5zdGF0c19maWxlX3N0ciwgIi0iKSkgeworICAgICAgICAgICAgcy0+c3RhdHNfZmlsZSA9IHN0ZG91dDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPnN0YXRzX2ZpbGUgPSBmb3BlbihzLT5zdGF0c19maWxlX3N0ciwgInciKTsKKyAgICAgICAgICAgIGlmICghcy0+c3RhdHNfZmlsZSkgeworICAgICAgICAgICAgICAgIGludCBlcnIgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMjhdOworICAgICAgICAgICAgICAgIGF2X3N0cmVycm9yKGVyciwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IG9wZW4gc3RhdHMgZmlsZSAlczogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRzX2ZpbGVfc3RyLCBidWYpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgVk1BRk1vdGlvbkNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgZG91YmxlIGF2Z19tb3Rpb24gPSBmZl92bWFmbW90aW9uX3VuaW5pdCgmcy0+ZGF0YSk7CisKKyAgICBpZiAocy0+ZGF0YS5uYl9mcmFtZXMgPiAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiVk1BRiBNb3Rpb24gYXZnOiAlLjNmXG4iLCBhdmdfbW90aW9uKTsKKyAgICB9CisKKyAgICBpZiAocy0+c3RhdHNfZmlsZSAmJiBzLT5zdGF0c19maWxlICE9IHN0ZG91dCkKKyAgICAgICAgZmNsb3NlKHMtPnN0YXRzX2ZpbGUpOworfQorCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdm1hZm1vdGlvbl9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgPSAicmVmZXJlbmNlIiwKKyAgICAgICAgLnR5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSA9IGZpbHRlcl9mcmFtZSwKKyAgICAgICAgLmNvbmZpZ19wcm9wcyA9IGNvbmZpZ19pbnB1dF9yZWYsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHZtYWZtb3Rpb25fb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3ZtYWZtb3Rpb24gPSB7CisgICAgLm5hbWUgICAgICAgICAgPSAidm1hZm1vdGlvbiIsCisgICAgLmRlc2NyaXB0aW9uICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiQ2FsY3VsYXRlIHRoZSBWTUFGIE1vdGlvbiBzY29yZS4iKSwKKyAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFZNQUZNb3Rpb25Db250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZ2bWFmbW90aW9uX2NsYXNzLAorICAgIC5pbnB1dHMgICAgICAgID0gdm1hZm1vdGlvbl9pbnB1dHMsCisgICAgLm91dHB1dHMgICAgICAgPSB2bWFmbW90aW9uX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdnBwX3Fzdi5jIGIvbGliYXZmaWx0ZXIvdmZfdnBwX3Fzdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTlmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci92Zl92cHBfcXN2LmMKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiogQGZpbGUKKyAqKiBIYXJkd2FyZSBhY2NlbGVyYXRlZCBjb21tb24gZmlsdGVycyBiYXNlZCBvbiBJbnRlbCBRdWljayBTeW5jIFZpZGVvIFZQUAorICoqLworCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisKKyNpbmNsdWRlICJmb3JtYXRzLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisKKyNpbmNsdWRlICJxc3Z2cHAuaCIKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVlBQQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgKEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNIHwgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNKQorCisvKiBudW1iZXIgb2YgdmlkZW8gZW5oYW5jZW1lbnQgZmlsdGVycyAqLworI2RlZmluZSBFTkhfRklMVEVSU19DT1VOVCAoNSkKKwordHlwZWRlZiBzdHJ1Y3QgVlBQQ29udGV4dHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKworICAgIFFTVlZQUENvbnRleHQgKnFzdjsKKworICAgIC8qIFZpZGVvIEVuaGFuY2VtZW50IEFsZ29yaXRobXMgKi8KKyAgICBtZnhFeHRWUFBEZWludGVybGFjaW5nICBkZWludGVybGFjZV9jb25mOworICAgIG1meEV4dFZQUEZyYW1lUmF0ZUNvbnZlcnNpb24gZnJjX2NvbmY7CisgICAgbWZ4RXh0VlBQRGVub2lzZSBkZW5vaXNlX2NvbmY7CisgICAgbWZ4RXh0VlBQRGV0YWlsIGRldGFpbF9jb25mOworICAgIG1meEV4dFZQUFByb2NBbXAgcHJvY2FtcF9jb25mOworCisgICAgaW50IG91dF93aWR0aDsKKyAgICBpbnQgb3V0X2hlaWdodDsKKworICAgIEFWUmF0aW9uYWwgZnJhbWVyYXRlOyAgICAgICAvKiB0YXJnZXQgZnJhbWVyYXRlICovCisgICAgaW50IHVzZV9mcmM7ICAgICAgICAgICAgICAgIC8qIHVzZSBmcmFtZXJhdGUgY29udmVyc2lvbiAqLworICAgIGludCBkZWludGVybGFjZTsgICAgICAgICAgICAvKiBkZWludGVybGFjZSBtb2RlIDogMD1vZmYsIDE9Ym9iLCAyPWFkdmFuY2VkICovCisgICAgaW50IGRlbm9pc2U7ICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBEZW5vaXNlIGFsZ29yaXRobS4gVmFsdWUgWzAsIDEwMF0gKi8KKyAgICBpbnQgZGV0YWlsOyAgICAgICAgICAgICAgICAgLyogRW5hYmxlIERldGFpbCBFbmhhbmNlbWVudCBhbGdvcml0aG0uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExldmVsIGlzIHRoZSBvcHRpb25hbCwgdmFsdWUgWzAsIDEwMF0gKi8KKyAgICBpbnQgdXNlX2Nyb3A7ICAgICAgICAgICAgICAgLyogMSA9IHVzZSBjcm9wOyAwPW5vbmUgKi8KKyAgICBpbnQgY3JvcF93OworICAgIGludCBjcm9wX2g7CisgICAgaW50IGNyb3BfeDsKKyAgICBpbnQgY3JvcF95OworCisgICAgLyogcGFyYW0gZm9yIHRoZSBwcm9jYW1wICovCisgICAgaW50ICAgIHByb2NhbXA7ICAgICAgICAgICAgLyogZW5hYmxlIHByb2NhbXAgKi8KKyAgICBmbG9hdCAgaHVlOworICAgIGZsb2F0ICBzYXR1cmF0aW9uOworICAgIGZsb2F0ICBjb250cmFzdDsKKyAgICBmbG9hdCAgYnJpZ2h0bmVzczsKKworICAgIGNoYXIgKmN4LCAqY3ksICpjdywgKmNoOworICAgIGNoYXIgKm93LCAqb2g7Cit9IFZQUENvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiZGVpbnRlcmxhY2UiLCAiZGVpbnRlcmxhY2UgbW9kZTogMD1vZmYsIDE9Ym9iLCAyPWFkdmFuY2VkIiwgT0ZGU0VUKGRlaW50ZXJsYWNlKSwgQVZfT1BUX1RZUEVfSU5ULCAgICAgIHsgLmk2NCA9IDAgfSwgMCwgTUZYX0RFSU5URVJMQUNJTkdfQURWQU5DRUQsIC5mbGFncyA9IEZMQUdTLCAiZGVpbnRlcmxhY2UiIH0sCisgICAgeyAiYm9iIiwgICAgICAgICAiQm9iIGRlaW50ZXJsYWNlIG1vZGUuIiwgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgIHsgLmk2NCA9IE1GWF9ERUlOVEVSTEFDSU5HX0JPQiB9LCAgICAgICAgICAgIC5mbGFncyA9IEZMQUdTLCAiZGVpbnRlcmxhY2UiIH0sCisgICAgeyAiYWR2YW5jZWQiLCAgICAiQWR2YW5jZWQgZGVpbnRlcmxhY2UgbW9kZS4gIiwgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgIHsgLmk2NCA9IE1GWF9ERUlOVEVSTEFDSU5HX0FEVkFOQ0VEIH0sICAgICAgIC5mbGFncyA9IEZMQUdTLCAiZGVpbnRlcmxhY2UiIH0sCisKKyAgICB7ICJkZW5vaXNlIiwgICAgICJkZW5vaXNlIGxldmVsIFswLCAxMDBdIiwgICAgICAgT0ZGU0VUKGRlbm9pc2UpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgIHsgLmk2NCA9IDAgfSwgMCwgMTAwLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgImRldGFpbCIsICAgICAgImVuaGFuY2VtZW50IGxldmVsIFswLCAxMDBdIiwgICBPRkZTRVQoZGV0YWlsKSwgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCAxMDAsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgICAib3V0cHV0IGZyYW1lcmF0ZSIsICAgICAgICAgICAgIE9GRlNFVChmcmFtZXJhdGUpLCAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7IC5kYmwgPSAwLjAgfSwwLCBEQkxfTUFYLCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgInByb2NhbXAiLCAgICAgIkVuYWJsZSBQcm9jQW1wIiwgICAgICAgICAgICAgICBPRkZTRVQocHJvY2FtcCksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gMCB9LCAwLCAxLCAuZmxhZ3MgPSBGTEFHU30sCisgICAgeyAiaHVlIiwgICAgICAgICAiUHJvY0FtcCBodWUiLCAgICAgICAgICAgICAgICAgIE9GRlNFVChodWUpLCAgICAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgICB7IC5kYmwgPSAwLjAgfSwgLTE4MC4wLCAxODAuMCwgLmZsYWdzID0gRkxBR1N9LAorICAgIHsgInNhdHVyYXRpb24iLCAgIlByb2NBbXAgc2F0dXJhdGlvbiIsICAgICAgICAgICBPRkZTRVQoc2F0dXJhdGlvbiksICBBVl9PUFRfVFlQRV9GTE9BVCwgICAgeyAuZGJsID0gMS4wIH0sIDAuMCwgMTAuMCwgLmZsYWdzID0gRkxBR1N9LAorICAgIHsgImNvbnRyYXN0IiwgICAgIlByb2NBbXAgY29udHJhc3QiLCAgICAgICAgICAgICBPRkZTRVQoY29udHJhc3QpLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgICAgeyAuZGJsID0gMS4wIH0sIDAuMCwgMTAuMCwgLmZsYWdzID0gRkxBR1N9LAorICAgIHsgImJyaWdodG5lc3MiLCAgIlByb2NBbXAgYnJpZ2h0bmVzcyIsICAgICAgICAgICBPRkZTRVQoYnJpZ2h0bmVzcyksICBBVl9PUFRfVFlQRV9GTE9BVCwgICAgeyAuZGJsID0gMC4wIH0sIC0xMDAuMCwgMTAwLjAsIC5mbGFncyA9IEZMQUdTfSwKKworICAgIHsgImN3IiwgICAic2V0IHRoZSB3aWR0aCBjcm9wIGFyZWEgZXhwcmVzc2lvbiIsICAgT0ZGU0VUKGN3KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiaXciIH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKyAgICB7ICJjaCIsICAgInNldCB0aGUgaGVpZ2h0IGNyb3AgYXJlYSBleHByZXNzaW9uIiwgIE9GRlNFVChjaCksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gImloIiB9LCBDSEFSX01JTiwgQ0hBUl9NQVgsIEZMQUdTIH0sCisgICAgeyAiY3giLCAgICJzZXQgdGhlIHggY3JvcCBhcmVhIGV4cHJlc3Npb24iLCAgICAgICBPRkZTRVQoY3gpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9ICIoaW5fdy1vdXRfdykvMiIgfSwgQ0hBUl9NSU4sIENIQVJfTUFYLCBGTEFHUyB9LAorICAgIHsgImN5IiwgICAic2V0IHRoZSB5IGNyb3AgYXJlYSBleHByZXNzaW9uIiwgICAgICAgT0ZGU0VUKGN5KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSAiKGluX2gtb3V0X2gpLzIiIH0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKKworICAgIHsgInciLCAgICAgICJPdXRwdXQgdmlkZW8gd2lkdGgiLCAgT0ZGU0VUKG93KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHI9ImN3IiB9LCAwLCAyNTUsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAid2lkdGgiLCAgIk91dHB1dCB2aWRlbyB3aWR0aCIsICBPRkZTRVQob3cpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0iY3ciIH0sIDAsIDI1NSwgLmZsYWdzID0gRkxBR1MgfSwKKyAgICB7ICJoIiwgICAgICAiT3V0cHV0IHZpZGVvIGhlaWdodCIsIE9GRlNFVChvaCksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyPSJ3KmNoL2N3IiB9LCAwLCAyNTUsIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiaGVpZ2h0IiwgIk91dHB1dCB2aWRlbyBoZWlnaHQiLCBPRkZTRVQob2gpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0cj0idypjaC9jdyIgfSwgMCwgMjU1LCAuZmxhZ3MgPSBGTEFHUyB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFyX25hbWVzW10gPSB7CisgICAgIml3IiwgImluX3ciLAorICAgICJpaCIsICJpbl9oIiwKKyAgICAib3ciLCAib3V0X3ciLCAidyIsCisgICAgIm9oIiwgIm91dF9oIiwgImgiLAorICAgICJjdyIsCisgICAgImNoIiwKKyAgICAiY3giLAorICAgICJjeSIsCisgICAgTlVMTAorfTsKKworZW51bSB2YXJfbmFtZSB7CisgICAgVkFSX2lXLCBWQVJfSU5fVywKKyAgICBWQVJfaUgsIFZBUl9JTl9ILAorICAgIFZBUl9vVywgVkFSX09VVF9XLCBWQVJfVywKKyAgICBWQVJfb0gsIFZBUl9PVVRfSCwgVkFSX0gsCisgICAgQ1csCisgICAgQ0gsCisgICAgQ1gsCisgICAgQ1ksCisgICAgVkFSX1ZBUlNfTkIKK307CisKK3N0YXRpYyBpbnQgZXZhbF9leHByKEFWRmlsdGVyQ29udGV4dCAqY3R4KQoreworI2RlZmluZSBQQVNTX0VYUFIoZSwgcykge1wKKyAgICByZXQgPSBhdl9leHByX3BhcnNlKCZlLCBzLCB2YXJfbmFtZXMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCk7IFwKKyAgICBpZiAocmV0IDwgMCkge1wKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hlbiBwYXNzaW5nICclcycuXG4iLCBzKTtcCisgICAgICAgIGdvdG8gcmVsZWFzZTtcCisgICAgfVwKK30KKyNkZWZpbmUgQ0FMQ19FWFBSKGUsIHYsIGkpIHtcCisgICAgaSA9IHYgPSBhdl9leHByX2V2YWwoZSwgdmFyX3ZhbHVlcywgTlVMTCk7IFwKK30KKyAgICBWUFBDb250ZXh0ICp2cHAgPSBjdHgtPnByaXY7CisgICAgZG91YmxlICB2YXJfdmFsdWVzW1ZBUl9WQVJTX05CXSA9IHsgTkFOIH07CisgICAgQVZFeHByICp3X2V4cHIgID0gTlVMTCwgKmhfZXhwciAgPSBOVUxMOworICAgIEFWRXhwciAqY3dfZXhwciA9IE5VTEwsICpjaF9leHByID0gTlVMTDsKKyAgICBBVkV4cHIgKmN4X2V4cHIgPSBOVUxMLCAqY3lfZXhwciA9IE5VTEw7CisgICAgaW50ICAgICByZXQgPSAwOworCisgICAgUEFTU19FWFBSKGN3X2V4cHIsIHZwcC0+Y3cpOworICAgIFBBU1NfRVhQUihjaF9leHByLCB2cHAtPmNoKTsKKworICAgIFBBU1NfRVhQUih3X2V4cHIsIHZwcC0+b3cpOworICAgIFBBU1NfRVhQUihoX2V4cHIsIHZwcC0+b2gpOworCisgICAgUEFTU19FWFBSKGN4X2V4cHIsIHZwcC0+Y3gpOworICAgIFBBU1NfRVhQUihjeV9leHByLCB2cHAtPmN5KTsKKworICAgIHZhcl92YWx1ZXNbVkFSX2lXXSA9CisgICAgdmFyX3ZhbHVlc1tWQVJfSU5fV10gPSBjdHgtPmlucHV0c1swXS0+dzsKKworICAgIHZhcl92YWx1ZXNbVkFSX2lIXSA9CisgICAgdmFyX3ZhbHVlc1tWQVJfSU5fSF0gPSBjdHgtPmlucHV0c1swXS0+aDsKKworICAgIC8qIGNyb3AgcGFyYW1zICovCisgICAgQ0FMQ19FWFBSKGN3X2V4cHIsIHZhcl92YWx1ZXNbQ1ddLCB2cHAtPmNyb3Bfdyk7CisgICAgQ0FMQ19FWFBSKGNoX2V4cHIsIHZhcl92YWx1ZXNbQ0hdLCB2cHAtPmNyb3BfaCk7CisKKyAgICAvKiBjYWxjIGFnYWluIGluIGNhc2UgY3cgaXMgcmVsYXRpdmUgdG8gY2ggKi8KKyAgICBDQUxDX0VYUFIoY3dfZXhwciwgdmFyX3ZhbHVlc1tDV10sIHZwcC0+Y3JvcF93KTsKKworICAgIENBTENfRVhQUih3X2V4cHIsCisgICAgICAgICAgICB2YXJfdmFsdWVzW1ZBUl9PVVRfV10gPSB2YXJfdmFsdWVzW1ZBUl9vV10gPSB2YXJfdmFsdWVzW1ZBUl9XXSwKKyAgICAgICAgICAgIHZwcC0+b3V0X3dpZHRoKTsKKyAgICBDQUxDX0VYUFIoaF9leHByLAorICAgICAgICAgICAgdmFyX3ZhbHVlc1tWQVJfT1VUX0hdID0gdmFyX3ZhbHVlc1tWQVJfb0hdID0gdmFyX3ZhbHVlc1tWQVJfSF0sCisgICAgICAgICAgICB2cHAtPm91dF9oZWlnaHQpOworCisgICAgLyogY2FsYyBhZ2FpbiBpbiBjYXNlIG93IGlzIHJlbGF0aXZlIHRvIG9oICovCisgICAgQ0FMQ19FWFBSKHdfZXhwciwKKyAgICAgICAgICAgIHZhcl92YWx1ZXNbVkFSX09VVF9XXSA9IHZhcl92YWx1ZXNbVkFSX29XXSA9IHZhcl92YWx1ZXNbVkFSX1ddLAorICAgICAgICAgICAgdnBwLT5vdXRfd2lkdGgpOworCisKKyAgICBDQUxDX0VYUFIoY3hfZXhwciwgdmFyX3ZhbHVlc1tDWF0sIHZwcC0+Y3JvcF94KTsKKyAgICBDQUxDX0VYUFIoY3lfZXhwciwgdmFyX3ZhbHVlc1tDWV0sIHZwcC0+Y3JvcF95KTsKKworICAgIC8qIGNhbGMgYWdhaW4gaW4gY2FzZSBjeCBpcyByZWxhdGl2ZSB0byBjeSAqLworICAgIENBTENfRVhQUihjeF9leHByLCB2YXJfdmFsdWVzW0NYXSwgdnBwLT5jcm9wX3gpOworCisgICAgaWYgKCh2cHAtPmNyb3BfdyAhPSB2YXJfdmFsdWVzW1ZBUl9pV10pIHx8ICh2cHAtPmNyb3BfaCAhPSB2YXJfdmFsdWVzW1ZBUl9pSF0pKQorICAgICAgICB2cHAtPnVzZV9jcm9wID0gMTsKKworcmVsZWFzZToKKyAgICBhdl9leHByX2ZyZWUod19leHByKTsKKyAgICBhdl9leHByX2ZyZWUoaF9leHByKTsKKyAgICBhdl9leHByX2ZyZWUoY3dfZXhwcik7CisgICAgYXZfZXhwcl9mcmVlKGNoX2V4cHIpOworICAgIGF2X2V4cHJfZnJlZShjeF9leHByKTsKKyAgICBhdl9leHByX2ZyZWUoY3lfZXhwcik7CisjdW5kZWYgUEFTU19FWFBSCisjdW5kZWYgQ0FMQ19FWFBSCisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKK3sKKyAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OworICAgIFZQUENvbnRleHQgICAgICAqdnBwID0gY3R4LT5wcml2OworICAgIGludCAgICAgICAgICAgICAgcmV0OworCisgICAgaWYgKHZwcC0+ZnJhbWVyYXRlLmRlbiA9PSAwIHx8IHZwcC0+ZnJhbWVyYXRlLm51bSA9PSAwKQorICAgICAgICB2cHAtPmZyYW1lcmF0ZSA9IGlubGluay0+ZnJhbWVfcmF0ZTsKKworICAgIGlmIChhdl9jbXBfcSh2cHAtPmZyYW1lcmF0ZSwgaW5saW5rLT5mcmFtZV9yYXRlKSkKKyAgICAgICAgdnBwLT51c2VfZnJjID0gMTsKKworICAgIHJldCA9IGV2YWxfZXhwcihjdHgpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsIHRvIGV2YWwgZXhwci5cbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICh2cHAtPm91dF9oZWlnaHQgPT0gMCB8fCB2cHAtPm91dF93aWR0aCA9PSAwKSB7CisgICAgICAgIHZwcC0+b3V0X3dpZHRoICA9IGlubGluay0+dzsKKyAgICAgICAgdnBwLT5vdXRfaGVpZ2h0ID0gaW5saW5rLT5oOworICAgIH0KKworICAgIGlmICh2cHAtPnVzZV9jcm9wKSB7CisgICAgICAgIHZwcC0+Y3JvcF94ID0gRkZNQVgodnBwLT5jcm9wX3gsIDApOworICAgICAgICB2cHAtPmNyb3BfeSA9IEZGTUFYKHZwcC0+Y3JvcF95LCAwKTsKKworICAgICAgICBpZih2cHAtPmNyb3BfdyArIHZwcC0+Y3JvcF94ID4gaW5saW5rLT53KQorICAgICAgICAgICB2cHAtPmNyb3BfeCA9IGlubGluay0+dyAtIHZwcC0+Y3JvcF93OworICAgICAgICBpZih2cHAtPmNyb3BfaCArIHZwcC0+Y3JvcF95ID4gaW5saW5rLT5oKQorICAgICAgICAgICB2cHAtPmNyb3BfeSA9IGlubGluay0+aCAtIHZwcC0+Y3JvcF9oOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbmZpZ19vdXRwdXQoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQoreworICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOworICAgIFZQUENvbnRleHQgICAgICAqdnBwID0gY3R4LT5wcml2OworICAgIFFTVlZQUFBhcmFtICAgICBwYXJhbSA9IHsgTlVMTCB9OworICAgIFFTVlZQUENyb3AgICAgICBjcm9wICA9IHsgMCB9OworICAgIG1meEV4dEJ1ZmZlciAgICAqZXh0X2J1ZltFTkhfRklMVEVSU19DT1VOVF07CisgICAgQVZGaWx0ZXJMaW5rICAgICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKKworICAgIG91dGxpbmstPncgICAgICAgICAgPSB2cHAtPm91dF93aWR0aDsKKyAgICBvdXRsaW5rLT5oICAgICAgICAgID0gdnBwLT5vdXRfaGVpZ2h0OworICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSB2cHAtPmZyYW1lcmF0ZTsKKyAgICBvdXRsaW5rLT50aW1lX2Jhc2UgID0gYXZfaW52X3EodnBwLT5mcmFtZXJhdGUpOworCisgICAgcGFyYW0uZmlsdGVyX2ZyYW1lICA9IE5VTEw7CisgICAgcGFyYW0ub3V0X3N3X2Zvcm1hdCA9IEFWX1BJWF9GTVRfTlYxMjsKKyAgICBwYXJhbS5udW1fZXh0X2J1ZiAgID0gMDsKKyAgICBwYXJhbS5leHRfYnVmICAgICAgID0gZXh0X2J1ZjsKKworICAgIGlmICh2cHAtPnVzZV9jcm9wKSB7CisgICAgICAgIGNyb3AuaW5faWR4ID0gMDsKKyAgICAgICAgY3JvcC54ID0gdnBwLT5jcm9wX3g7CisgICAgICAgIGNyb3AueSA9IHZwcC0+Y3JvcF95OworICAgICAgICBjcm9wLncgPSB2cHAtPmNyb3BfdzsKKyAgICAgICAgY3JvcC5oID0gdnBwLT5jcm9wX2g7CisKKyAgICAgICAgcGFyYW0ubnVtX2Nyb3AgPSAxOworICAgICAgICBwYXJhbS5jcm9wICAgICA9ICZjcm9wOworICAgIH0KKworICAgIGlmICh2cHAtPmRlaW50ZXJsYWNlKSB7CisgICAgICAgIG1lbXNldCgmdnBwLT5kZWludGVybGFjZV9jb25mLCAwLCBzaXplb2YobWZ4RXh0VlBQRGVpbnRlcmxhY2luZykpOworICAgICAgICB2cHAtPmRlaW50ZXJsYWNlX2NvbmYuSGVhZGVyLkJ1ZmZlcklkID0gTUZYX0VYVEJVRkZfVlBQX0RFSU5URVJMQUNJTkc7CisgICAgICAgIHZwcC0+ZGVpbnRlcmxhY2VfY29uZi5IZWFkZXIuQnVmZmVyU3ogPSBzaXplb2YobWZ4RXh0VlBQRGVpbnRlcmxhY2luZyk7CisgICAgICAgIHZwcC0+ZGVpbnRlcmxhY2VfY29uZi5Nb2RlID0gdnBwLT5kZWludGVybGFjZSA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRlhfREVJTlRFUkxBQ0lOR19CT0IgOiBNRlhfREVJTlRFUkxBQ0lOR19BRFZBTkNFRDsKKworICAgICAgICBwYXJhbS5leHRfYnVmW3BhcmFtLm51bV9leHRfYnVmKytdID0gKG1meEV4dEJ1ZmZlciopJnZwcC0+ZGVpbnRlcmxhY2VfY29uZjsKKyAgICB9CisKKyAgICBpZiAodnBwLT51c2VfZnJjKSB7CisgICAgICAgIG1lbXNldCgmdnBwLT5mcmNfY29uZiwgMCwgc2l6ZW9mKG1meEV4dFZQUEZyYW1lUmF0ZUNvbnZlcnNpb24pKTsKKyAgICAgICAgdnBwLT5mcmNfY29uZi5IZWFkZXIuQnVmZmVySWQgPSBNRlhfRVhUQlVGRl9WUFBfRlJBTUVfUkFURV9DT05WRVJTSU9OOworICAgICAgICB2cHAtPmZyY19jb25mLkhlYWRlci5CdWZmZXJTeiA9IHNpemVvZihtZnhFeHRWUFBGcmFtZVJhdGVDb252ZXJzaW9uKTsKKyAgICAgICAgdnBwLT5mcmNfY29uZi5BbGdvcml0aG0gPSBNRlhfRlJDQUxHTV9ESVNUUklCVVRFRF9USU1FU1RBTVA7CisKKyAgICAgICAgcGFyYW0uZXh0X2J1ZltwYXJhbS5udW1fZXh0X2J1ZisrXSA9IChtZnhFeHRCdWZmZXIqKSZ2cHAtPmZyY19jb25mOworICAgIH0KKworICAgIGlmICh2cHAtPmRlbm9pc2UpIHsKKyAgICAgICAgbWVtc2V0KCZ2cHAtPmRlbm9pc2VfY29uZiwgMCwgc2l6ZW9mKG1meEV4dFZQUERlbm9pc2UpKTsKKyAgICAgICAgdnBwLT5kZW5vaXNlX2NvbmYuSGVhZGVyLkJ1ZmZlcklkID0gTUZYX0VYVEJVRkZfVlBQX0RFTk9JU0U7CisgICAgICAgIHZwcC0+ZGVub2lzZV9jb25mLkhlYWRlci5CdWZmZXJTeiA9IHNpemVvZihtZnhFeHRWUFBEZW5vaXNlKTsKKyAgICAgICAgdnBwLT5kZW5vaXNlX2NvbmYuRGVub2lzZUZhY3RvciAgID0gdnBwLT5kZW5vaXNlOworCisgICAgICAgIHBhcmFtLmV4dF9idWZbcGFyYW0ubnVtX2V4dF9idWYrK10gPSAobWZ4RXh0QnVmZmVyKikmdnBwLT5kZW5vaXNlX2NvbmY7CisgICAgfQorCisgICAgaWYgKHZwcC0+ZGV0YWlsKSB7CisgICAgICAgIG1lbXNldCgmdnBwLT5kZXRhaWxfY29uZiwgMCwgc2l6ZW9mKG1meEV4dFZQUERldGFpbCkpOworICAgICAgICB2cHAtPmRldGFpbF9jb25mLkhlYWRlci5CdWZmZXJJZCAgPSBNRlhfRVhUQlVGRl9WUFBfREVUQUlMOworICAgICAgICB2cHAtPmRldGFpbF9jb25mLkhlYWRlci5CdWZmZXJTeiAgPSBzaXplb2YobWZ4RXh0VlBQRGV0YWlsKTsKKyAgICAgICAgdnBwLT5kZXRhaWxfY29uZi5EZXRhaWxGYWN0b3IgPSB2cHAtPmRldGFpbDsKKworICAgICAgICBwYXJhbS5leHRfYnVmW3BhcmFtLm51bV9leHRfYnVmKytdID0gKG1meEV4dEJ1ZmZlciopJnZwcC0+ZGV0YWlsX2NvbmY7CisgICAgfQorCisgICAgaWYgKHZwcC0+cHJvY2FtcCkgeworICAgICAgICBtZW1zZXQoJnZwcC0+cHJvY2FtcF9jb25mLCAwLCBzaXplb2YobWZ4RXh0VlBQUHJvY0FtcCkpOworICAgICAgICB2cHAtPnByb2NhbXBfY29uZi5IZWFkZXIuQnVmZmVySWQgID0gTUZYX0VYVEJVRkZfVlBQX1BST0NBTVA7CisgICAgICAgIHZwcC0+cHJvY2FtcF9jb25mLkhlYWRlci5CdWZmZXJTeiAgPSBzaXplb2YobWZ4RXh0VlBQUHJvY0FtcCk7CisgICAgICAgIHZwcC0+cHJvY2FtcF9jb25mLkh1ZSAgICAgICAgICAgICAgPSB2cHAtPmh1ZTsKKyAgICAgICAgdnBwLT5wcm9jYW1wX2NvbmYuU2F0dXJhdGlvbiAgICAgICA9IHZwcC0+c2F0dXJhdGlvbjsKKyAgICAgICAgdnBwLT5wcm9jYW1wX2NvbmYuQ29udHJhc3QgICAgICAgICA9IHZwcC0+Y29udHJhc3Q7CisgICAgICAgIHZwcC0+cHJvY2FtcF9jb25mLkJyaWdodG5lc3MgICAgICAgPSB2cHAtPmJyaWdodG5lc3M7CisKKyAgICAgICAgcGFyYW0uZXh0X2J1ZltwYXJhbS5udW1fZXh0X2J1ZisrXSA9IChtZnhFeHRCdWZmZXIqKSZ2cHAtPnByb2NhbXBfY29uZjsKKyAgICB9CisKKyAgICBpZiAodnBwLT51c2VfZnJjIHx8IHZwcC0+dXNlX2Nyb3AgfHwgdnBwLT5kZWludGVybGFjZSB8fCB2cHAtPmRlbm9pc2UgfHwKKyAgICAgICAgdnBwLT5kZXRhaWwgfHwgdnBwLT5wcm9jYW1wIHx8IGlubGluay0+dyAhPSBvdXRsaW5rLT53IHx8IGlubGluay0+aCAhPSBvdXRsaW5rLT5oKQorICAgICAgICByZXR1cm4gZmZfcXN2dnBwX2NyZWF0ZShjdHgsICZ2cHAtPnFzdiwgJnBhcmFtKTsKKyAgICBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsICJxc3YgdnBwIHBhc3MgdGhyb3VnaCBtb2RlLlxuIik7CisgICAgICAgIGlmIChpbmxpbmstPmh3X2ZyYW1lc19jdHgpCisgICAgICAgICAgICBvdXRsaW5rLT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihpbmxpbmstPmh3X2ZyYW1lc19jdHgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqcGljcmVmKQoreworICAgIGludCAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICBBVkZpbHRlckNvbnRleHQgICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBWUFBDb250ZXh0ICAgICAgICp2cHAgPSBpbmxpbmstPmRzdC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgICAgICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworCisgICAgaWYgKHZwcC0+cXN2KSB7CisgICAgICAgIHJldCA9IGZmX3FzdnZwcF9maWx0ZXJfZnJhbWUodnBwLT5xc3YsIGlubGluaywgcGljcmVmKTsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmcGljcmVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocGljcmVmLT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBwaWNyZWYtPnB0cyA9IGF2X3Jlc2NhbGVfcShwaWNyZWYtPnB0cywgaW5saW5rLT50aW1lX2Jhc2UsIG91dGxpbmstPnRpbWVfYmFzZSk7CisgICAgICAgIHJldCA9IGZmX2ZpbHRlcl9mcmFtZShvdXRsaW5rLCBwaWNyZWYpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcXVlcnlfZm9ybWF0cyhBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBpbnQgcmV0OworICAgIEFWRmlsdGVyRm9ybWF0cyAqaW5fZm10cywgKm91dF9mbXRzOworICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgaW5fcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgICAgICBBVl9QSVhfRk1UX05WMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVZVjQyMiwKKyAgICAgICAgQVZfUElYX0ZNVF9SR0IzMiwKKyAgICAgICAgQVZfUElYX0ZNVF9RU1YsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfcGl4X2ZtdHNbXSA9IHsKKyAgICAgICAgQVZfUElYX0ZNVF9OVjEyLAorICAgICAgICBBVl9QSVhfRk1UX1FTViwKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfTsKKworICAgIGluX2ZtdHMgID0gZmZfbWFrZV9mb3JtYXRfbGlzdChpbl9waXhfZm10cyk7CisgICAgb3V0X2ZtdHMgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KG91dF9waXhfZm10cyk7CisgICAgcmV0ID0gZmZfZm9ybWF0c19yZWYoaW5fZm10cywgJmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgcmV0ID0gZmZfZm9ybWF0c19yZWYob3V0X2ZtdHMsICZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIHZvaWQgdnBwX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBWUFBDb250ZXh0ICp2cHAgPSBjdHgtPnByaXY7CisKKyAgICBmZl9xc3Z2cHBfZnJlZSgmdnBwLT5xc3YpOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyB2cHBfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAidnBwX3FzdiIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQgdnBwX2lucHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19pbnB1dCwKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHZwcF9vdXRwdXRzW10gPSB7CisgICAgeworICAgICAgICAubmFtZSAgICAgICAgICA9ICJkZWZhdWx0IiwKKyAgICAgICAgLnR5cGUgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgICAgIC5jb25maWdfcHJvcHMgID0gY29uZmlnX291dHB1dCwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitBVkZpbHRlciBmZl92Zl92cHBfcXN2ID0geworICAgIC5uYW1lICAgICAgICAgID0gInZwcF9xc3YiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlF1aWNrIFN5bmMgVmlkZW8gVlBQLiIpLAorICAgIC5wcml2X3NpemUgICAgID0gc2l6ZW9mKFZQUENvbnRleHQpLAorICAgIC5xdWVyeV9mb3JtYXRzID0gcXVlcnlfZm9ybWF0cywKKyAgICAudW5pbml0ICAgICAgICA9IHZwcF91bmluaXQsCisgICAgLmlucHV0cyAgICAgICAgPSB2cHBfaW5wdXRzLAorICAgIC5vdXRwdXRzICAgICAgID0gdnBwX291dHB1dHMsCisgICAgLnByaXZfY2xhc3MgICAgPSAmdnBwX2NsYXNzLAorICAgIC5mbGFnc19pbnRlcm5hbCA9IEZGX0ZJTFRFUl9GTEFHX0hXRlJBTUVfQVdBUkUsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfdzNmZGlmLmMgYi9saWJhdmZpbHRlci92Zl93M2ZkaWYuYwppbmRleCBlNmY2NjI4Li5jNmE2NTUwIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl93M2ZkaWYuYworKysgYi9saWJhdmZpbHRlci92Zl93M2ZkaWYuYwpAQCAtNDMsNiArNDMsNyBAQAogICAgIEFWRnJhbWUgKnByZXYsICpjdXIsICpuZXh0OyAgLy8vPCBwcmV2aW91cywgY3VycmVudCwgbmV4dCBmcmFtZXMKICAgICBpbnQzMl90ICoqd29ya19saW5lOyAgLy8vPCBsaW5lcyB3ZSBhcmUgY2FsY3VsYXRpbmcKICAgICBpbnQgbmJfdGhyZWFkczsKKyAgICBpbnQgbWF4OwogCiAgICAgVzNGRElGRFNQQ29udGV4dCBkc3A7CiB9IFczRkRJRkNvbnRleHQ7CkBAIC03NSw2ICs3NiwxMSBAQAogICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0NDRQLAogICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSQVAsCiAgICAgICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDksIEFWX1BJWF9GTVRfWVVWNDIyUDksIEFWX1BJWF9GTVRfWVVWNDQ0UDksCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEyLCBBVl9QSVhfRk1UX1lVVjQyMlAxMiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE0LCBBVl9QSVhfRk1UX1lVVjQyMlAxNCwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUDksIEFWX1BJWF9GTVRfR0JSUDEwLCBBVl9QSVhfRk1UX0dCUlAxMiwgQVZfUElYX0ZNVF9HQlJQMTQsCiAgICAgICAgIEFWX1BJWF9GTVRfTk9ORQogICAgIH07CiAKQEAgLTE0OCw3ICsxNTQsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZmlsdGVyX3NjYWxlKHVpbnQ4X3QgKm91dF9waXhlbCwgY29uc3QgaW50MzJfdCAqd29ya19waXhlbCwgaW50IGxpbmVzaXplKQorc3RhdGljIHZvaWQgZmlsdGVyX3NjYWxlKHVpbnQ4X3QgKm91dF9waXhlbCwgY29uc3QgaW50MzJfdCAqd29ya19waXhlbCwgaW50IGxpbmVzaXplLCBpbnQgbWF4KQogewogICAgIGludCBqOwogCkBAIC0xNTYsMTIgKzE2MiwxMTEgQEAKICAgICAgICAgKm91dF9waXhlbCA9IGF2X2NsaXAoKndvcmtfcGl4ZWwsIDAsIDI1NSAqIDI1NiAqIDEyOCkgPj4gMTU7CiB9CiAKK3N0YXRpYyB2b2lkIGZpbHRlcjE2X3NpbXBsZV9sb3coaW50MzJfdCAqd29ya19saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbl9saW5lc19jdXI4WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpjb2VmLCBpbnQgbGluZXNpemUpCit7CisgICAgdWludDE2X3QgKmluX2xpbmVzX2N1clsyXSA9IHsgKHVpbnQxNl90ICopaW5fbGluZXNfY3VyOFswXSwgKHVpbnQxNl90ICopaW5fbGluZXNfY3VyOFsxXSB9OworICAgIGludCBpOworCisgICAgbGluZXNpemUgLz0gMjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGluZXNpemU7IGkrKykgeworICAgICAgICAqd29ya19saW5lICAgID0gKmluX2xpbmVzX2N1clswXSsrICogY29lZlswXTsKKyAgICAgICAgKndvcmtfbGluZSsrICs9ICppbl9saW5lc19jdXJbMV0rKyAqIGNvZWZbMV07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXIxNl9jb21wbGV4X2xvdyhpbnQzMl90ICp3b3JrX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbl9saW5lc19jdXI4WzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY29lZiwgaW50IGxpbmVzaXplKQoreworICAgIHVpbnQxNl90ICppbl9saW5lc19jdXJbNF0gPSB7ICh1aW50MTZfdCAqKWluX2xpbmVzX2N1cjhbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopaW5fbGluZXNfY3VyOFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QgKilpbl9saW5lc19jdXI4WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCAqKWluX2xpbmVzX2N1cjhbM10gfTsKKyAgICBpbnQgaTsKKworICAgIGxpbmVzaXplIC89IDI7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbmVzaXplOyBpKyspIHsKKyAgICAgICAgKndvcmtfbGluZSAgICA9ICppbl9saW5lc19jdXJbMF0rKyAqIGNvZWZbMF07CisgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzFdKysgKiBjb2VmWzFdOworICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2N1clsyXSsrICogY29lZlsyXTsKKyAgICAgICAgKndvcmtfbGluZSsrICs9ICppbl9saW5lc19jdXJbM10rKyAqIGNvZWZbM107CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXIxNl9zaW1wbGVfaGlnaChpbnQzMl90ICp3b3JrX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbl9saW5lc19jdXI4WzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW5fbGluZXNfYWRqOFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmNvZWYsIGludCBsaW5lc2l6ZSkKK3sKKyAgICB1aW50MTZfdCAqaW5fbGluZXNfY3VyWzNdID0geyAodWludDE2X3QgKilpbl9saW5lc19jdXI4WzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCAqKWluX2xpbmVzX2N1cjhbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopaW5fbGluZXNfY3VyOFsyXSB9OworICAgIHVpbnQxNl90ICppbl9saW5lc19hZGpbM10gPSB7ICh1aW50MTZfdCAqKWluX2xpbmVzX2FkajhbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopaW5fbGluZXNfYWRqOFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QgKilpbl9saW5lc19hZGo4WzJdIH07CisgICAgaW50IGk7CisKKyAgICBsaW5lc2l6ZSAvPSAyOworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lc2l6ZTsgaSsrKSB7CisgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzBdKysgKiBjb2VmWzBdOworICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2FkalswXSsrICogY29lZlswXTsKKyAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19jdXJbMV0rKyAqIGNvZWZbMV07CisgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfYWRqWzFdKysgKiBjb2VmWzFdOworICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2N1clsyXSsrICogY29lZlsyXTsKKyAgICAgICAgKndvcmtfbGluZSsrICs9ICppbl9saW5lc19hZGpbMl0rKyAqIGNvZWZbMl07CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmaWx0ZXIxNl9jb21wbGV4X2hpZ2goaW50MzJfdCAqd29ya19saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmluX2xpbmVzX2N1cjhbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW5fbGluZXNfYWRqOFs1XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpjb2VmLCBpbnQgbGluZXNpemUpCit7CisgICAgdWludDE2X3QgKmluX2xpbmVzX2N1cls1XSA9IHsgKHVpbnQxNl90ICopaW5fbGluZXNfY3VyOFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QgKilpbl9saW5lc19jdXI4WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCAqKWluX2xpbmVzX2N1cjhbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopaW5fbGluZXNfY3VyOFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QgKilpbl9saW5lc19jdXI4WzRdIH07CisgICAgdWludDE2X3QgKmluX2xpbmVzX2Fkals1XSA9IHsgKHVpbnQxNl90ICopaW5fbGluZXNfYWRqOFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QgKilpbl9saW5lc19hZGo4WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MTZfdCAqKWluX2xpbmVzX2FkajhbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQxNl90ICopaW5fbGluZXNfYWRqOFszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDE2X3QgKilpbl9saW5lc19hZGo4WzRdIH07CisgICAgaW50IGk7CisKKyAgICBsaW5lc2l6ZSAvPSAyOworICAgIGZvciAoaSA9IDA7IGkgPCBsaW5lc2l6ZTsgaSsrKSB7CisgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzBdKysgKiBjb2VmWzBdOworICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2FkalswXSsrICogY29lZlswXTsKKyAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19jdXJbMV0rKyAqIGNvZWZbMV07CisgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfYWRqWzFdKysgKiBjb2VmWzFdOworICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2N1clsyXSsrICogY29lZlsyXTsKKyAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19hZGpbMl0rKyAqIGNvZWZbMl07CisgICAgICAgICp3b3JrX2xpbmUgICArPSAqaW5fbGluZXNfY3VyWzNdKysgKiBjb2VmWzNdOworICAgICAgICAqd29ya19saW5lICAgKz0gKmluX2xpbmVzX2FkalszXSsrICogY29lZlszXTsKKyAgICAgICAgKndvcmtfbGluZSAgICs9ICppbl9saW5lc19jdXJbNF0rKyAqIGNvZWZbNF07CisgICAgICAgICp3b3JrX2xpbmUrKyArPSAqaW5fbGluZXNfYWRqWzRdKysgKiBjb2VmWzRdOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsdGVyMTZfc2NhbGUodWludDhfdCAqb3V0X3BpeGVsOCwgY29uc3QgaW50MzJfdCAqd29ya19waXhlbCwgaW50IGxpbmVzaXplLCBpbnQgbWF4KQoreworICAgIHVpbnQxNl90ICpvdXRfcGl4ZWwgPSAodWludDE2X3QgKilvdXRfcGl4ZWw4OworICAgIGludCBqOworCisgICAgbGluZXNpemUgLz0gMjsKKyAgICBmb3IgKGogPSAwOyBqIDwgbGluZXNpemU7IGorKywgb3V0X3BpeGVsKyssIHdvcmtfcGl4ZWwrKykKKyAgICAgICAgKm91dF9waXhlbCA9IGF2X2NsaXAoKndvcmtfcGl4ZWwsIDAsIG1heCkgPj4gMTU7Cit9CisKIHN0YXRpYyBpbnQgY29uZmlnX2lucHV0KEFWRmlsdGVyTGluayAqaW5saW5rKQogewogICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gaW5saW5rLT5kc3Q7CiAgICAgVzNGRElGQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGlubGluay0+Zm9ybWF0KTsKLSAgICBpbnQgcmV0LCBpOworICAgIGludCByZXQsIGksIGRlcHRoOwogCiAgICAgaWYgKChyZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhzLT5saW5lc2l6ZSwgaW5saW5rLT5mb3JtYXQsIGlubGluay0+dykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE3MCw3ICsyNzUsNyBAQAogICAgIHMtPnBsYW5laGVpZ2h0WzBdID0gcy0+cGxhbmVoZWlnaHRbM10gPSBpbmxpbmstPmg7CiAKICAgICBzLT5uYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhpbmxpbmstPmZvcm1hdCk7Ci0gICAgcy0+bmJfdGhyZWFkcyA9IGN0eC0+Z3JhcGgtPm5iX3RocmVhZHM7CisgICAgcy0+bmJfdGhyZWFkcyA9IGZmX2ZpbHRlcl9nZXRfbmJfdGhyZWFkcyhjdHgpOwogICAgIHMtPndvcmtfbGluZSA9IGF2X2NhbGxvYyhzLT5uYl90aHJlYWRzLCBzaXplb2YoKnMtPndvcmtfbGluZSkpOwogICAgIGlmICghcy0+d29ya19saW5lKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpAQCAtMTgxLDE0ICsyODYsMjQgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCi0gICAgcy0+ZHNwLmZpbHRlcl9zaW1wbGVfbG93ICAgPSBmaWx0ZXJfc2ltcGxlX2xvdzsKLSAgICBzLT5kc3AuZmlsdGVyX2NvbXBsZXhfbG93ICA9IGZpbHRlcl9jb21wbGV4X2xvdzsKLSAgICBzLT5kc3AuZmlsdGVyX3NpbXBsZV9oaWdoICA9IGZpbHRlcl9zaW1wbGVfaGlnaDsKLSAgICBzLT5kc3AuZmlsdGVyX2NvbXBsZXhfaGlnaCA9IGZpbHRlcl9jb21wbGV4X2hpZ2g7Ci0gICAgcy0+ZHNwLmZpbHRlcl9zY2FsZSAgICAgICAgPSBmaWx0ZXJfc2NhbGU7CisgICAgZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOworICAgIHMtPm1heCA9ICgoMSA8PCBkZXB0aCkgLSAxKSAqIDI1NiAqIDEyODsKKyAgICBpZiAoZGVwdGggPD0gOCkgeworICAgICAgICBzLT5kc3AuZmlsdGVyX3NpbXBsZV9sb3cgICA9IGZpbHRlcl9zaW1wbGVfbG93OworICAgICAgICBzLT5kc3AuZmlsdGVyX2NvbXBsZXhfbG93ICA9IGZpbHRlcl9jb21wbGV4X2xvdzsKKyAgICAgICAgcy0+ZHNwLmZpbHRlcl9zaW1wbGVfaGlnaCAgPSBmaWx0ZXJfc2ltcGxlX2hpZ2g7CisgICAgICAgIHMtPmRzcC5maWx0ZXJfY29tcGxleF9oaWdoID0gZmlsdGVyX2NvbXBsZXhfaGlnaDsKKyAgICAgICAgcy0+ZHNwLmZpbHRlcl9zY2FsZSAgICAgICAgPSBmaWx0ZXJfc2NhbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+ZHNwLmZpbHRlcl9zaW1wbGVfbG93ICAgPSBmaWx0ZXIxNl9zaW1wbGVfbG93OworICAgICAgICBzLT5kc3AuZmlsdGVyX2NvbXBsZXhfbG93ICA9IGZpbHRlcjE2X2NvbXBsZXhfbG93OworICAgICAgICBzLT5kc3AuZmlsdGVyX3NpbXBsZV9oaWdoICA9IGZpbHRlcjE2X3NpbXBsZV9oaWdoOworICAgICAgICBzLT5kc3AuZmlsdGVyX2NvbXBsZXhfaGlnaCA9IGZpbHRlcjE2X2NvbXBsZXhfaGlnaDsKKyAgICAgICAgcy0+ZHNwLmZpbHRlcl9zY2FsZSAgICAgICAgPSBmaWx0ZXIxNl9zY2FsZTsKKyAgICB9CiAKICAgICBpZiAoQVJDSF9YODYpCi0gICAgICAgIGZmX3czZmRpZl9pbml0X3g4Nigmcy0+ZHNwKTsKKyAgICAgICAgZmZfdzNmZGlmX2luaXRfeDg2KCZzLT5kc3AsIGRlcHRoKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjQ3LDEwICszNjIsMTEgQEAKICAgICBjb25zdCBpbnQgZHN0X2xpbmVfc3RyaWRlID0gb3V0LT5saW5lc2l6ZVtwbGFuZV07CiAgICAgY29uc3QgaW50IHN0YXJ0ID0gKGhlaWdodCAqIGpvYm5yKSAvIG5iX2pvYnM7CiAgICAgY29uc3QgaW50IGVuZCA9IChoZWlnaHQgKiAoam9ibnIrMSkpIC8gbmJfam9iczsKKyAgICBjb25zdCBpbnQgbWF4ID0gcy0+bWF4OwogICAgIGludCBqLCB5X2luLCB5X291dDsKIAogICAgIC8qIGNvcHkgdW5jaGFuZ2VkIHRoZSBsaW5lcyBvZiB0aGUgZmllbGQgKi8KLSAgICB5X291dCA9IHN0YXJ0ICsgKHMtPmZpZWxkID09IGN1ci0+dG9wX2ZpZWxkX2ZpcnN0KSAtIChzdGFydCAmIDEpOworICAgIHlfb3V0ID0gc3RhcnQgKyAoKHMtPmZpZWxkID09IGN1ci0+dG9wX2ZpZWxkX2ZpcnN0KSBeIChzdGFydCAmIDEpKTsKIAogICAgIGluX2xpbmUgID0gY3VyX2RhdGEgKyAoeV9vdXQgKiBjdXJfbGluZV9zdHJpZGUpOwogICAgIG91dF9saW5lID0gZHN0X2RhdGEgKyAoeV9vdXQgKiBkc3RfbGluZV9zdHJpZGUpOwpAQCAtMjYzLDcgKzM3OSw3IEBACiAgICAgfQogCiAgICAgLyogaW50ZXJwb2xhdGUgb3RoZXIgbGluZXMgb2YgdGhlIGZpZWxkICovCi0gICAgeV9vdXQgPSBzdGFydCArIChzLT5maWVsZCAhPSBjdXItPnRvcF9maWVsZF9maXJzdCkgLSAoc3RhcnQgJiAxKTsKKyAgICB5X291dCA9IHN0YXJ0ICsgKChzLT5maWVsZCAhPSBjdXItPnRvcF9maWVsZF9maXJzdCkgXiAoc3RhcnQgJiAxKSk7CiAKICAgICBvdXRfbGluZSA9IGRzdF9kYXRhICsgKHlfb3V0ICogZHN0X2xpbmVfc3RyaWRlKTsKIApAQCAtMzE5LDcgKzQzNSw3IEBACiAgICAgICAgIHdvcmtfcGl4ZWwgPSBzLT53b3JrX2xpbmVbam9ibnJdOwogICAgICAgICBvdXRfcGl4ZWwgPSBvdXRfbGluZTsKIAotICAgICAgICBzLT5kc3AuZmlsdGVyX3NjYWxlKG91dF9waXhlbCwgd29ya19waXhlbCwgbGluZXNpemUpOworICAgICAgICBzLT5kc3AuZmlsdGVyX3NjYWxlKG91dF9waXhlbCwgd29ya19waXhlbCwgbGluZXNpemUsIG1heCk7CiAKICAgICAgICAgLyogbW92ZSBvbiB0byBuZXh0IGxpbmUgKi8KICAgICAgICAgeV9vdXQgKz0gMjsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3dhdmVmb3JtLmMgYi9saWJhdmZpbHRlci92Zl93YXZlZm9ybS5jCmluZGV4IDRmYjc4YmQuLjQyODE0N2MgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZmX3dhdmVmb3JtLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfd2F2ZWZvcm0uYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTItMjAxNSBQYXVsIEIgTWFob2wKKyAqIENvcHlyaWdodCAoYykgMjAxMi0yMDE2IFBhdWwgQiBNYWhvbAogICogQ29weXJpZ2h0IChjKSAyMDEzIE1hcnRvbiBCYWxpbnQKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5oIgogI2luY2x1ZGUgImF2ZmlsdGVyLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC0zMywzNCArMzQsNzQgQEAKICAgICBGTEFULAogICAgIEFGTEFULAogICAgIENIUk9NQSwKLSAgICBBQ0hST01BLAogICAgIENPTE9SLAorICAgIEFDT0xPUiwKKyAgICBYRkxBVCwKICAgICBOQl9GSUxURVJTCiB9OwogCitlbnVtIERpc3BsYXlUeXBlIHsKKyAgICBPVkVSTEFZLAorICAgIFNUQUNLLAorICAgIFBBUkFERSwKKyAgICBOQl9ESVNQTEFZUworfTsKKworZW51bSBTY2FsZVR5cGUgeworICAgIERJR0lUQUwsCisgICAgTUlMTElWT0xUUywKKyAgICBJUkUsCisgICAgTkJfU0NBTEVTCit9OworCit0eXBlZGVmIHN0cnVjdCBHcmF0aWN1bGVMaW5lIHsKKyAgICBjb25zdCBjaGFyICpuYW1lOworICAgIHVpbnQxNl90IHBvczsKK30gR3JhdGljdWxlTGluZTsKKwordHlwZWRlZiBzdHJ1Y3QgR3JhdGljdWxlTGluZXMgeworICAgIHN0cnVjdCBHcmF0aWN1bGVMaW5lIGxpbmVbNF07Cit9IEdyYXRpY3VsZUxpbmVzOworCiB0eXBlZGVmIHN0cnVjdCBXYXZlZm9ybUNvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICAgIGludCAgICAgICAgICAgIG1vZGU7CisgICAgaW50ICAgICAgICAgICAgYWNvbXA7CisgICAgaW50ICAgICAgICAgICAgZGNvbXA7CiAgICAgaW50ICAgICAgICAgICAgbmNvbXA7CiAgICAgaW50ICAgICAgICAgICAgcGNvbXA7Ci0gICAgY29uc3QgdWludDhfdCAgKmJnX2NvbG9yOworICAgIHVpbnQ4X3QgICAgICAgIGJnX2NvbG9yWzRdOwogICAgIGZsb2F0ICAgICAgICAgIGZpbnRlbnNpdHk7CiAgICAgaW50ICAgICAgICAgICAgaW50ZW5zaXR5OwogICAgIGludCAgICAgICAgICAgIG1pcnJvcjsKICAgICBpbnQgICAgICAgICAgICBkaXNwbGF5OwogICAgIGludCAgICAgICAgICAgIGVudmVsb3BlOworICAgIGludCAgICAgICAgICAgIGdyYXRpY3VsZTsKKyAgICBmbG9hdCAgICAgICAgICBvcGFjaXR5OworICAgIGZsb2F0ICAgICAgICAgIGJnb3BhY2l0eTsKICAgICBpbnQgICAgICAgICAgICBlc3RhcnRbNF07CiAgICAgaW50ICAgICAgICAgICAgZWVuZFs0XTsKICAgICBpbnQgICAgICAgICAgICAqZW1heFs0XVs0XTsKICAgICBpbnQgICAgICAgICAgICAqZW1pbls0XVs0XTsKICAgICBpbnQgICAgICAgICAgICAqcGVhazsKICAgICBpbnQgICAgICAgICAgICBmaWx0ZXI7CisgICAgaW50ICAgICAgICAgICAgZmxhZ3M7CiAgICAgaW50ICAgICAgICAgICAgYml0czsKICAgICBpbnQgICAgICAgICAgICBtYXg7CiAgICAgaW50ICAgICAgICAgICAgc2l6ZTsKLSAgICB2b2lkICgqd2F2ZWZvcm0pKHN0cnVjdCBXYXZlZm9ybUNvbnRleHQgKnMsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgaW50ZW5zaXR5LCBpbnQgb2Zmc2V0LCBpbnQgY29sdW1uKTsKKyAgICBpbnQgICAgICAgICAgICBzY2FsZTsKKyAgICB1aW50OF90ICAgICAgICBncmF0X3l1dmFfY29sb3JbNF07CisgICAgaW50ICAgICAgICAgICAgc2hpZnRfd1s0XSwgc2hpZnRfaFs0XTsKKyAgICBHcmF0aWN1bGVMaW5lcyAqZ2xpbmVzOworICAgIGludCAgICAgICAgICAgIG5iX2dsaW5lczsKKyAgICB2b2lkICgqd2F2ZWZvcm0pKHN0cnVjdCBXYXZlZm9ybUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCwgaW50IGludGVuc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbiwgaW50IG1pcnJvcik7CisgICAgdm9pZCAoKmdyYXRpY3VsZWYpKHN0cnVjdCBXYXZlZm9ybUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCk7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqb2Rlc2M7CiB9IFdhdmVmb3JtQ29udGV4dDsKIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoV2F2ZWZvcm1Db250ZXh0LCB4KQpAQCAtNzUsMTAgKzExNiwxMSBAQAogICAgIHsgImkiLCAgICAgICAgICJzZXQgaW50ZW5zaXR5IiwgT0ZGU0VUKGZpbnRlbnNpdHkpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC4wNH0sIDAsIDEsIEZMQUdTIH0sCiAgICAgeyAibWlycm9yIiwgInNldCBtaXJyb3JpbmciLCBPRkZTRVQobWlycm9yKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MX0sIDAsIDEsIEZMQUdTIH0sCiAgICAgeyAiciIsICAgICAgInNldCBtaXJyb3JpbmciLCBPRkZTRVQobWlycm9yKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQ9MX0sIDAsIDEsIEZMQUdTIH0sCi0gICAgeyAiZGlzcGxheSIsICJzZXQgZGlzcGxheSBtb2RlIiwgT0ZGU0VUKGRpc3BsYXkpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAxLCBGTEFHUywgImRpc3BsYXkiIH0sCi0gICAgeyAiZCIsICAgICAgICJzZXQgZGlzcGxheSBtb2RlIiwgT0ZGU0VUKGRpc3BsYXkpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTF9LCAwLCAxLCBGTEFHUywgImRpc3BsYXkiIH0sCi0gICAgICAgIHsgIm92ZXJsYXkiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9MH0sIDAsIDAsIEZMQUdTLCAiZGlzcGxheSIgfSwKLSAgICAgICAgeyAicGFyYWRlIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgRkxBR1MsICJkaXNwbGF5IiB9LAorICAgIHsgImRpc3BsYXkiLCAic2V0IGRpc3BsYXkgbW9kZSIsIE9GRlNFVChkaXNwbGF5KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND1TVEFDS30sIDAsIE5CX0RJU1BMQVlTLTEsIEZMQUdTLCAiZGlzcGxheSIgfSwKKyAgICB7ICJkIiwgICAgICAgInNldCBkaXNwbGF5IG1vZGUiLCBPRkZTRVQoZGlzcGxheSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQ9U1RBQ0t9LCAwLCBOQl9ESVNQTEFZUy0xLCBGTEFHUywgImRpc3BsYXkiIH0sCisgICAgICAgIHsgIm92ZXJsYXkiLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9T1ZFUkxBWX0sIDAsIDAsIEZMQUdTLCAiZGlzcGxheSIgfSwKKyAgICAgICAgeyAic3RhY2siLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1TVEFDS30sICAgMCwgMCwgRkxBR1MsICJkaXNwbGF5IiB9LAorICAgICAgICB7ICJwYXJhZGUiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PVBBUkFERX0sICAwLCAwLCBGTEFHUywgImRpc3BsYXkiIH0sCiAgICAgeyAiY29tcG9uZW50cyIsICJzZXQgY29tcG9uZW50cyB0byBkaXNwbGF5IiwgT0ZGU0VUKHBjb21wKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMSwgMTUsIEZMQUdTIH0sCiAgICAgeyAiYyIsICAgICAgICAgICJzZXQgY29tcG9uZW50cyB0byBkaXNwbGF5IiwgT0ZGU0VUKHBjb21wKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0xfSwgMSwgMTUsIEZMQUdTIH0sCiAgICAgeyAiZW52ZWxvcGUiLCAic2V0IGVudmVsb3BlIHRvIGRpc3BsYXkiLCBPRkZTRVQoZW52ZWxvcGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCAzLCBGTEFHUywgImVudmVsb3BlIiB9LApAQCAtOTMsODAgKzEzNSwyMzcgQEAKICAgICAgICAgeyAiZmxhdCIgICAsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1GTEFUfSwgICAgMCwgMCwgRkxBR1MsICJmaWx0ZXIiIH0sCiAgICAgICAgIHsgImFmbGF0IiAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9QUZMQVR9LCAgIDAsIDAsIEZMQUdTLCAiZmlsdGVyIiB9LAogICAgICAgICB7ICJjaHJvbWEiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUNIUk9NQX0sICAwLCAwLCBGTEFHUywgImZpbHRlciIgfSwKLSAgICAgICAgeyAiYWNocm9tYSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1BQ0hST01BfSwgMCwgMCwgRkxBR1MsICJmaWx0ZXIiIH0sCiAgICAgICAgIHsgImNvbG9yIiwgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9Q09MT1J9LCAgIDAsIDAsIEZMQUdTLCAiZmlsdGVyIiB9LAorICAgICAgICB7ICJhY29sb3IiLCAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PUFDT0xPUn0sICAwLCAwLCBGTEFHUywgImZpbHRlciIgfSwKKyAgICAgICAgeyAieGZsYXQiLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1YRkxBVH0sICAgMCwgMCwgRkxBR1MsICJmaWx0ZXIiIH0sCisgICAgeyAiZ3JhdGljdWxlIiwgInNldCBncmF0aWN1bGUiLCBPRkZTRVQoZ3JhdGljdWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMiwgRkxBR1MsICJncmF0aWN1bGUiIH0sCisgICAgeyAiZyIsICAgICAgICAgInNldCBncmF0aWN1bGUiLCBPRkZTRVQoZ3JhdGljdWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2ND0wfSwgMCwgMiwgRkxBR1MsICJncmF0aWN1bGUiIH0sCisgICAgICAgIHsgIm5vbmUiLCAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0wfSwgMCwgMCwgRkxBR1MsICJncmF0aWN1bGUiIH0sCisgICAgICAgIHsgImdyZWVuIiwgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0xfSwgMCwgMCwgRkxBR1MsICJncmF0aWN1bGUiIH0sCisgICAgICAgIHsgIm9yYW5nZSIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0yfSwgMCwgMCwgRkxBR1MsICJncmF0aWN1bGUiIH0sCisgICAgeyAib3BhY2l0eSIsICJzZXQgZ3JhdGljdWxlIG9wYWNpdHkiLCBPRkZTRVQob3BhY2l0eSksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0wLjc1fSwgMCwgMSwgRkxBR1MgfSwKKyAgICB7ICJvIiwgICAgICAgInNldCBncmF0aWN1bGUgb3BhY2l0eSIsIE9GRlNFVChvcGFjaXR5KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuNzV9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgImZsYWdzIiwgInNldCBncmF0aWN1bGUgZmxhZ3MiLCBPRkZTRVQoZmxhZ3MpLCBBVl9PUFRfVFlQRV9GTEFHUywgey5pNjQ9MX0sIDAsIDMsIEZMQUdTLCAiZmxhZ3MiIH0sCisgICAgeyAiZmwiLCAgICAic2V0IGdyYXRpY3VsZSBmbGFncyIsIE9GRlNFVChmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2ND0xfSwgMCwgMywgRkxBR1MsICJmbGFncyIgfSwKKyAgICAgICAgeyAibnVtYmVycyIsICAiZHJhdyBudW1iZXJzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgImZsYWdzIiB9LAorICAgICAgICB7ICJkb3RzIiwgICAgICJkcmF3IGRvdHMgaW5zdGVhZCBvZiBsaW5lcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND0yfSwgMCwgMCwgRkxBR1MsICJmbGFncyIgfSwKKyAgICB7ICJzY2FsZSIsICJzZXQgc2NhbGUiLCBPRkZTRVQoc2NhbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBOQl9TQ0FMRVMtMSwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICB7ICJzIiwgICAgICJzZXQgc2NhbGUiLCBPRkZTRVQoc2NhbGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTB9LCAwLCBOQl9TQ0FMRVMtMSwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAiZGlnaXRhbCIsICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1ESUdJVEFMfSwgICAgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAibWlsbGl2b2x0cyIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1NSUxMSVZPTFRTfSwgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICAgICAgeyAiaXJlIiwgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2ND1JUkV9LCAgICAgICAgMCwgMCwgRkxBR1MsICJzY2FsZSIgfSwKKyAgICB7ICJiZ29wYWNpdHkiLCAic2V0IGJhY2tncm91bmQgb3BhY2l0eSIsIE9GRlNFVChiZ29wYWNpdHkpLCBBVl9PUFRfVFlQRV9GTE9BVCwgey5kYmw9MC43NX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyAiYiIsICAgICAgICAgInNldCBiYWNrZ3JvdW5kIG9wYWNpdHkiLCBPRkZTRVQoYmdvcGFjaXR5KSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsPTAuNzV9LCAwLCAxLCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCiBBVkZJTFRFUl9ERUZJTkVfQ0xBU1Mod2F2ZWZvcm0pOwogCi1zdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGxvd3Bhc3NfcGl4X2ZtdHNbXSA9IHsKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgaW5fbG93cGFzc19waXhfZm10c1tdID0gewogICAgIEFWX1BJWF9GTVRfR0JSUCwgICAgIEFWX1BJWF9GTVRfR0JSQVAsCi0gICAgQVZfUElYX0ZNVF9HQlJQOSwgICAgQVZfUElYX0ZNVF9HQlJQMTAsCisgICAgQVZfUElYX0ZNVF9HQlJQOSwgICAgQVZfUElYX0ZNVF9HQlJQMTAsIEFWX1BJWF9GTVRfR0JSUDEyLAogICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgIEFWX1BJWF9GTVRfWVVWNDIwUCwKICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQ0MFAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLCAgQVZfUElYX0ZNVF9ZVVY0MTBQLAogICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCiAgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKICAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLAotICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgQVZfUElYX0ZNVF9HUkFZOCwgQVZfUElYX0ZNVF9HUkFZOSwgQVZfUElYX0ZNVF9HUkFZMTAsIEFWX1BJWF9GTVRfR1JBWTEyLAogICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDksIEFWX1BJWF9GTVRfWVVWNDIyUDksIEFWX1BJWF9GTVRfWVVWNDIwUDksCiAgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0MjBQOSwKICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAogICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjBQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGluX2NvbG9yX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9HQlJQLCAgICAgQVZfUElYX0ZNVF9HQlJBUCwKKyAgICBBVl9QSVhfRk1UX0dCUlA5LCAgICBBVl9QSVhfRk1UX0dCUlAxMCwgQVZfUElYX0ZNVF9HQlJQMTIsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjJQLCAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgIEFWX1BJWF9GTVRfWVVWNDQwUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQxMVAsCisgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgQVZfUElYX0ZNVF9ZVVZKNDExUCwgQVZfUElYX0ZNVF9ZVVZKNDIwUCwKKyAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCBBVl9QSVhfRk1UX1lVVko0NDRQLAorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQyMlAsIEFWX1BJWF9GTVRfWVVWQTQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQOSwgQVZfUElYX0ZNVF9ZVVY0MjJQOSwgQVZfUElYX0ZNVF9ZVVY0MjBQOSwKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQOSwgQVZfUElYX0ZNVF9ZVVZBNDIyUDksIEFWX1BJWF9GTVRfWVVWQTQyMFA5LAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLCBBVl9QSVhfRk1UX1lVVjQyMlAxMCwgQVZfUElYX0ZNVF9ZVVY0MjBQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLCBBVl9QSVhfRk1UX1lVVkE0MjJQMTAsIEFWX1BJWF9GTVRfWVVWQTQyMFAxMCwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQMTIsIEFWX1BJWF9GTVRfWVVWNDIwUDEyLCBBVl9QSVhfRk1UX1lVVjQ0MFAxMiwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgaW5fZmxhdF9waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwgIEFWX1BJWF9GTVRfWVVWNDIwUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsICBBVl9QSVhfRk1UX1lVVjQ0MFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0MTFQLAorICAgIEFWX1BJWF9GTVRfWVVWSjQ0MFAsIEFWX1BJWF9GTVRfWVVWSjQxMVAsIEFWX1BJWF9GTVRfWVVWSjQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVZKNDIyUCwgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwKKyAgICBBVl9QSVhfRk1UX1lVVkE0NDRQLCBBVl9QSVhfRk1UX1lVVkE0MjJQLCBBVl9QSVhfRk1UX1lVVkE0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDksIEFWX1BJWF9GTVRfWVVWNDIyUDksIEFWX1BJWF9GTVRfWVVWNDIwUDksCisgICAgQVZfUElYX0ZNVF9ZVVZBNDQ0UDksIEFWX1BJWF9GTVRfWVVWQTQyMlA5LCBBVl9QSVhfRk1UX1lVVkE0MjBQOSwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVY0MjJQMTAsIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAorICAgIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwLCBBVl9QSVhfRk1UX1lVVkE0MjBQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDIyUDEyLCBBVl9QSVhfRk1UX1lVVjQyMFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDBQMTIsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9yZ2I4X2xvd3Bhc3NfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSQVAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9yZ2I5X2xvd3Bhc3NfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX0dCUlA5LAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfcmdiMTBfbG93cGFzc19waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfR0JSUDEwLCBBVl9QSVhfRk1UX0dCUkFQMTAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9yZ2IxMl9sb3dwYXNzX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9HQlJQMTIsIEFWX1BJWF9GTVRfR0JSQVAxMiwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0X3l1djhfbG93cGFzc19waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDQ0UCwgIEFWX1BJWF9GTVRfWVVWSjQ0NFAsIEFWX1BJWF9GTVRfWVVWQTQ0NFAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF95dXY5X2xvd3Bhc3NfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFA5LCBBVl9QSVhfRk1UX1lVVkE0NDRQOSwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0X3l1djEwX2xvd3Bhc3NfcGl4X2ZtdHNbXSA9IHsKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMCwgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfeXV2MTJfbG93cGFzc19waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAorICAgIEFWX1BJWF9GTVRfTk9ORQorfTsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBvdXRfZ3JheThfbG93cGFzc19waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9ncmF5OV9sb3dwYXNzX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9HUkFZOSwKKyAgICBBVl9QSVhfRk1UX05PTkUKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0X2dyYXkxMF9sb3dwYXNzX3BpeF9mbXRzW10gPSB7CisgICAgQVZfUElYX0ZNVF9HUkFZMTAsCisgICAgQVZfUElYX0ZNVF9OT05FCit9OworCitzdGF0aWMgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IG91dF9ncmF5MTJfbG93cGFzc19waXhfZm10c1tdID0geworICAgIEFWX1BJWF9GTVRfR1JBWTEyLAogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKIAogc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBmbGF0X3BpeF9mbXRzW10gPSB7Ci0gICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDRQLCBBVl9QSVhfRk1UX05PTkUKLX07Ci0KLXN0YXRpYyBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgY29sb3JfcGl4X2ZtdHNbXSA9IHsKLSAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSQVAsCi0gICAgQVZfUElYX0ZNVF9HQlJQOSwgQVZfUElYX0ZNVF9HQlJQMTAsCiAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLCBBVl9QSVhfRk1UX1lVVko0NDRQLAogICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDksIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEyLAogICAgIEFWX1BJWF9GTVRfTk9ORQogfTsKIAogc3RhdGljIGludCBxdWVyeV9mb3JtYXRzKEFWRmlsdGVyQ29udGV4dCAqY3R4KQogewogICAgIFdhdmVmb3JtQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBBVkZpbHRlckZvcm1hdHMgKmZtdHNfbGlzdDsKLSAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeF9mbXRzOworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqb3V0X3BpeF9mbXRzOworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqaW5fcGl4X2ZtdHM7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIEFWRmlsdGVyRm9ybWF0cyAqYXZmZjsKKyAgICBpbnQgZGVwdGgsIHJnYiwgaSwgcmV0LCBuY29tcDsKIAotICAgIHN3aXRjaCAocy0+ZmlsdGVyKSB7Ci0gICAgY2FzZSBMT1dQQVNTOiBwaXhfZm10cyA9IGxvd3Bhc3NfcGl4X2ZtdHM7IGJyZWFrOwotICAgIGNhc2UgRkxBVDoKLSAgICBjYXNlIEFGTEFUOgotICAgIGNhc2UgQ0hST01BOgotICAgIGNhc2UgQUNIUk9NQTogcGl4X2ZtdHMgPSBmbGF0X3BpeF9mbXRzOyAgICBicmVhazsKLSAgICBjYXNlIENPTE9SOiAgIHBpeF9mbXRzID0gY29sb3JfcGl4X2ZtdHM7ICAgYnJlYWs7CisgICAgaWYgKCFjdHgtPmlucHV0c1swXS0+aW5fZm9ybWF0cyB8fAorICAgICAgICAhY3R4LT5pbnB1dHNbMF0tPmluX2Zvcm1hdHMtPm5iX2Zvcm1hdHMpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKICAgICB9CiAKLSAgICBmbXRzX2xpc3QgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKLSAgICBpZiAoIWZtdHNfbGlzdCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm10c19saXN0KTsKKyAgICBzd2l0Y2ggKHMtPmZpbHRlcikgeworICAgIGNhc2UgTE9XUEFTUzogaW5fcGl4X2ZtdHMgPSBpbl9sb3dwYXNzX3BpeF9mbXRzOyBicmVhazsKKyAgICBjYXNlIENIUk9NQToKKyAgICBjYXNlIFhGTEFUOgorICAgIGNhc2UgQUZMQVQ6CisgICAgY2FzZSBGTEFUOiAgICBpbl9waXhfZm10cyA9IGluX2ZsYXRfcGl4X2ZtdHM7ICAgIGJyZWFrOworICAgIGNhc2UgQUNPTE9SOgorICAgIGNhc2UgQ09MT1I6ICAgaW5fcGl4X2ZtdHMgPSBpbl9jb2xvcl9waXhfZm10czsgICBicmVhazsKKyAgICBkZWZhdWx0OiByZXR1cm4gQVZFUlJPUl9CVUc7CisgICAgfQorCisgICAgaWYgKCFjdHgtPmlucHV0c1swXS0+b3V0X2Zvcm1hdHMpIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KGluX3BpeF9mbXRzKSwgJmN0eC0+aW5wdXRzWzBdLT5vdXRfZm9ybWF0cykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZmZiA9IGN0eC0+aW5wdXRzWzBdLT5pbl9mb3JtYXRzOworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2ZmYtPmZvcm1hdHNbMF0pOworICAgIG5jb21wID0gZGVzYy0+bmJfY29tcG9uZW50czsKKyAgICByZ2IgPSBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0I7CisgICAgZGVwdGggPSBkZXNjLT5jb21wWzBdLmRlcHRoOworICAgIGZvciAoaSA9IDE7IGkgPCBhdmZmLT5uYl9mb3JtYXRzOyBpKyspIHsKKyAgICAgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYXZmZi0+Zm9ybWF0c1tpXSk7CisgICAgICAgIGlmIChyZ2IgIT0gKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgfHwKKyAgICAgICAgICAgIGRlcHRoICE9IGRlc2MtPmNvbXBbMF0uZGVwdGgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIH0KKworICAgIGlmIChzLT5maWx0ZXIgPT0gTE9XUEFTUyAmJiBuY29tcCA9PSAxICYmIGRlcHRoID09IDgpCisgICAgICAgIG91dF9waXhfZm10cyA9IG91dF9ncmF5OF9sb3dwYXNzX3BpeF9mbXRzOworICAgIGVsc2UgaWYgKHMtPmZpbHRlciA9PSBMT1dQQVNTICYmIG5jb21wID09IDEgJiYgZGVwdGggPT0gOSkKKyAgICAgICAgb3V0X3BpeF9mbXRzID0gb3V0X2dyYXk5X2xvd3Bhc3NfcGl4X2ZtdHM7CisgICAgZWxzZSBpZiAocy0+ZmlsdGVyID09IExPV1BBU1MgJiYgbmNvbXAgPT0gMSAmJiBkZXB0aCA9PSAxMCkKKyAgICAgICAgb3V0X3BpeF9mbXRzID0gb3V0X2dyYXkxMF9sb3dwYXNzX3BpeF9mbXRzOworICAgIGVsc2UgaWYgKHMtPmZpbHRlciA9PSBMT1dQQVNTICYmIG5jb21wID09IDEgJiYgZGVwdGggPT0gMTIpCisgICAgICAgIG91dF9waXhfZm10cyA9IG91dF9ncmF5MTJfbG93cGFzc19waXhfZm10czsKKyAgICBlbHNlIGlmIChyZ2IgJiYgZGVwdGggPT0gOCAmJiBuY29tcCA+IDIpCisgICAgICAgIG91dF9waXhfZm10cyA9IG91dF9yZ2I4X2xvd3Bhc3NfcGl4X2ZtdHM7CisgICAgZWxzZSBpZiAocmdiICYmIGRlcHRoID09IDkgJiYgbmNvbXAgPiAyKQorICAgICAgICBvdXRfcGl4X2ZtdHMgPSBvdXRfcmdiOV9sb3dwYXNzX3BpeF9mbXRzOworICAgIGVsc2UgaWYgKHJnYiAmJiBkZXB0aCA9PSAxMCAmJiBuY29tcCA+IDIpCisgICAgICAgIG91dF9waXhfZm10cyA9IG91dF9yZ2IxMF9sb3dwYXNzX3BpeF9mbXRzOworICAgIGVsc2UgaWYgKHJnYiAmJiBkZXB0aCA9PSAxMiAmJiBuY29tcCA+IDIpCisgICAgICAgIG91dF9waXhfZm10cyA9IG91dF9yZ2IxMl9sb3dwYXNzX3BpeF9mbXRzOworICAgIGVsc2UgaWYgKGRlcHRoID09IDggJiYgbmNvbXAgPiAyKQorICAgICAgICBvdXRfcGl4X2ZtdHMgPSBvdXRfeXV2OF9sb3dwYXNzX3BpeF9mbXRzOworICAgIGVsc2UgaWYgKGRlcHRoID09IDkgJiYgbmNvbXAgPiAyKQorICAgICAgICBvdXRfcGl4X2ZtdHMgPSBvdXRfeXV2OV9sb3dwYXNzX3BpeF9mbXRzOworICAgIGVsc2UgaWYgKGRlcHRoID09IDEwICYmIG5jb21wID4gMikKKyAgICAgICAgb3V0X3BpeF9mbXRzID0gb3V0X3l1djEwX2xvd3Bhc3NfcGl4X2ZtdHM7CisgICAgZWxzZSBpZiAoZGVwdGggPT0gMTIgJiYgbmNvbXAgPiAyKQorICAgICAgICBvdXRfcGl4X2ZtdHMgPSBvdXRfeXV2MTJfbG93cGFzc19waXhfZm10czsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgaWYgKChyZXQgPSBmZl9mb3JtYXRzX3JlZihmZl9tYWtlX2Zvcm1hdF9saXN0KG91dF9waXhfZm10cyksICZjdHgtPm91dHB1dHNbMF0tPmluX2Zvcm1hdHMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZW52ZWxvcGVfaW5zdGFudDE2KFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgcGxhbmUsIGludCBjb21wb25lbnQpCitzdGF0aWMgdm9pZCBlbnZlbG9wZV9pbnN0YW50MTYoV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIGludCBwbGFuZSwgaW50IGNvbXBvbmVudCwgaW50IG9mZnNldCkKIHsKICAgICBjb25zdCBpbnQgZHN0X2xpbmVzaXplID0gb3V0LT5saW5lc2l6ZVtjb21wb25lbnRdIC8gMjsKICAgICBjb25zdCBpbnQgYmcgPSBzLT5iZ19jb2xvcltjb21wb25lbnRdICogKHMtPm1heCAvIDI1Nik7CiAgICAgY29uc3QgaW50IGxpbWl0ID0gcy0+bWF4IC0gMTsKLSAgICBjb25zdCBpbnQgaXNfY2hyb21hID0gKGNvbXBvbmVudCA9PSAxIHx8IGNvbXBvbmVudCA9PSAyKTsKLSAgICBjb25zdCBpbnQgc2hpZnRfdyA9IChpc19jaHJvbWEgPyBzLT5kZXNjLT5sb2cyX2Nocm9tYV93IDogMCk7Ci0gICAgY29uc3QgaW50IHNoaWZ0X2ggPSAoaXNfY2hyb21hID8gcy0+ZGVzYy0+bG9nMl9jaHJvbWFfaCA6IDApOwotICAgIGNvbnN0IGludCBkc3RfaCA9IEFWX0NFSUxfUlNISUZUKG91dC0+aGVpZ2h0LCBzaGlmdF9oKTsKLSAgICBjb25zdCBpbnQgZHN0X3cgPSBBVl9DRUlMX1JTSElGVChvdXQtPndpZHRoLCBzaGlmdF93KTsKKyAgICBjb25zdCBpbnQgZHN0X2ggPSBzLT5kaXNwbGF5ID09IFBBUkFERSA/IG91dC0+aGVpZ2h0IC8gcy0+YWNvbXAgOiBvdXQtPmhlaWdodDsKKyAgICBjb25zdCBpbnQgZHN0X3cgPSBzLT5kaXNwbGF5ID09IFBBUkFERSA/IG91dC0+d2lkdGggLyBzLT5hY29tcCA6IG91dC0+d2lkdGg7CiAgICAgY29uc3QgaW50IHN0YXJ0ID0gcy0+ZXN0YXJ0W3BsYW5lXTsKICAgICBjb25zdCBpbnQgZW5kID0gcy0+ZWVuZFtwbGFuZV07CiAgICAgdWludDE2X3QgKmRzdDsKICAgICBpbnQgeCwgeTsKIAogICAgIGlmIChzLT5tb2RlKSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCBkc3RfdzsgeCsrKSB7CisgICAgICAgIGZvciAoeCA9IG9mZnNldDsgeCA8IG9mZnNldCArIGRzdF93OyB4KyspIHsKICAgICAgICAgICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kOyB5KyspIHsKICAgICAgICAgICAgICAgICBkc3QgPSAodWludDE2X3QgKilvdXQtPmRhdGFbY29tcG9uZW50XSArIHkgKiBkc3RfbGluZXNpemUgKyB4OwogICAgICAgICAgICAgICAgIGlmIChkc3RbMF0gIT0gYmcpIHsKQEAgLTE4Myw3ICszODIsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yICh5ID0gMDsgeSA8IGRzdF9oOyB5KyspIHsKKyAgICAgICAgZm9yICh5ID0gb2Zmc2V0OyB5IDwgb2Zmc2V0ICsgZHN0X2g7IHkrKykgewogICAgICAgICAgICAgZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW2NvbXBvbmVudF0gKyB5ICogZHN0X2xpbmVzaXplOwogICAgICAgICAgICAgZm9yICh4ID0gc3RhcnQ7IHggPCBlbmQ7IHgrKykgewogICAgICAgICAgICAgICAgIGlmIChkc3RbeF0gIT0gYmcpIHsKQEAgLTIwMSwyMiArNDAwLDE5IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBlbnZlbG9wZV9pbnN0YW50KFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgcGxhbmUsIGludCBjb21wb25lbnQpCitzdGF0aWMgdm9pZCBlbnZlbG9wZV9pbnN0YW50KFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgcGxhbmUsIGludCBjb21wb25lbnQsIGludCBvZmZzZXQpCiB7CiAgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbY29tcG9uZW50XTsKICAgICBjb25zdCB1aW50OF90IGJnID0gcy0+YmdfY29sb3JbY29tcG9uZW50XTsKLSAgICBjb25zdCBpbnQgaXNfY2hyb21hID0gKGNvbXBvbmVudCA9PSAxIHx8IGNvbXBvbmVudCA9PSAyKTsKLSAgICBjb25zdCBpbnQgc2hpZnRfdyA9IChpc19jaHJvbWEgPyBzLT5kZXNjLT5sb2cyX2Nocm9tYV93IDogMCk7Ci0gICAgY29uc3QgaW50IHNoaWZ0X2ggPSAoaXNfY2hyb21hID8gcy0+ZGVzYy0+bG9nMl9jaHJvbWFfaCA6IDApOwotICAgIGNvbnN0IGludCBkc3RfaCA9IEFWX0NFSUxfUlNISUZUKG91dC0+aGVpZ2h0LCBzaGlmdF9oKTsKLSAgICBjb25zdCBpbnQgZHN0X3cgPSBBVl9DRUlMX1JTSElGVChvdXQtPndpZHRoLCBzaGlmdF93KTsKKyAgICBjb25zdCBpbnQgZHN0X2ggPSBzLT5kaXNwbGF5ID09IFBBUkFERSA/IG91dC0+aGVpZ2h0IC8gcy0+YWNvbXAgOiBvdXQtPmhlaWdodDsKKyAgICBjb25zdCBpbnQgZHN0X3cgPSBzLT5kaXNwbGF5ID09IFBBUkFERSA/IG91dC0+d2lkdGggLyBzLT5hY29tcCA6IG91dC0+d2lkdGg7CiAgICAgY29uc3QgaW50IHN0YXJ0ID0gcy0+ZXN0YXJ0W3BsYW5lXTsKICAgICBjb25zdCBpbnQgZW5kID0gcy0+ZWVuZFtwbGFuZV07CiAgICAgdWludDhfdCAqZHN0OwogICAgIGludCB4LCB5OwogCiAgICAgaWYgKHMtPm1vZGUpIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRzdF93OyB4KyspIHsKKyAgICAgICAgZm9yICh4ID0gb2Zmc2V0OyB4IDwgb2Zmc2V0ICsgZHN0X3c7IHgrKykgewogICAgICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQ7IHkrKykgewogICAgICAgICAgICAgICAgIGRzdCA9IG91dC0+ZGF0YVtjb21wb25lbnRdICsgeSAqIGRzdF9saW5lc2l6ZSArIHg7CiAgICAgICAgICAgICAgICAgaWYgKGRzdFswXSAhPSBiZykgewpAQCAtMjMzLDcgKzQyOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZHN0X2g7IHkrKykgeworICAgICAgICBmb3IgKHkgPSBvZmZzZXQ7IHkgPCBvZmZzZXQgKyBkc3RfaDsgeSsrKSB7CiAgICAgICAgICAgICBkc3QgPSBvdXQtPmRhdGFbY29tcG9uZW50XSArIHkgKiBkc3RfbGluZXNpemU7CiAgICAgICAgICAgICBmb3IgKHggPSBzdGFydDsgeCA8IGVuZDsgeCsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRzdFt4XSAhPSBiZykgewpAQCAtMjUxLDE2ICs0NDcsMTMgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGVudmVsb3BlX3BlYWsxNihXYXZlZm9ybUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCwgaW50IHBsYW5lLCBpbnQgY29tcG9uZW50KQorc3RhdGljIHZvaWQgZW52ZWxvcGVfcGVhazE2KFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgcGxhbmUsIGludCBjb21wb25lbnQsIGludCBvZmZzZXQpCiB7CiAgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbY29tcG9uZW50XSAvIDI7CiAgICAgY29uc3QgaW50IGJnID0gcy0+YmdfY29sb3JbY29tcG9uZW50XSAqIChzLT5tYXggLyAyNTYpOwogICAgIGNvbnN0IGludCBsaW1pdCA9IHMtPm1heCAtIDE7Ci0gICAgY29uc3QgaW50IGlzX2Nocm9tYSA9IChjb21wb25lbnQgPT0gMSB8fCBjb21wb25lbnQgPT0gMik7Ci0gICAgY29uc3QgaW50IHNoaWZ0X3cgPSAoaXNfY2hyb21hID8gcy0+ZGVzYy0+bG9nMl9jaHJvbWFfdyA6IDApOwotICAgIGNvbnN0IGludCBzaGlmdF9oID0gKGlzX2Nocm9tYSA/IHMtPmRlc2MtPmxvZzJfY2hyb21hX2ggOiAwKTsKLSAgICBjb25zdCBpbnQgZHN0X2ggPSBBVl9DRUlMX1JTSElGVChvdXQtPmhlaWdodCwgc2hpZnRfaCk7Ci0gICAgY29uc3QgaW50IGRzdF93ID0gQVZfQ0VJTF9SU0hJRlQob3V0LT53aWR0aCwgc2hpZnRfdyk7CisgICAgY29uc3QgaW50IGRzdF9oID0gcy0+ZGlzcGxheSA9PSBQQVJBREUgPyBvdXQtPmhlaWdodCAvIHMtPmFjb21wIDogb3V0LT5oZWlnaHQ7CisgICAgY29uc3QgaW50IGRzdF93ID0gcy0+ZGlzcGxheSA9PSBQQVJBREUgPyBvdXQtPndpZHRoIC8gcy0+YWNvbXAgOiBvdXQtPndpZHRoOwogICAgIGNvbnN0IGludCBzdGFydCA9IHMtPmVzdGFydFtwbGFuZV07CiAgICAgY29uc3QgaW50IGVuZCA9IHMtPmVlbmRbcGxhbmVdOwogICAgIGludCAqZW1heCA9IHMtPmVtYXhbcGxhbmVdW2NvbXBvbmVudF07CkBAIC0yNjksNzAgKzQ2Miw2NyBAQAogICAgIGludCB4LCB5OwogCiAgICAgaWYgKHMtPm1vZGUpIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRzdF93OyB4KyspIHsKLSAgICAgICAgICAgIGZvciAoeSA9IHN0YXJ0OyB5IDwgZW5kICYmIHkgPCBlbWluW3hdOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gb2Zmc2V0OyB4IDwgb2Zmc2V0ICsgZHN0X3c7IHgrKykgeworICAgICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQgJiYgeSA8IGVtaW5beCAtIG9mZnNldF07IHkrKykgewogICAgICAgICAgICAgICAgIGRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtjb21wb25lbnRdICsgeSAqIGRzdF9saW5lc2l6ZSArIHg7CiAgICAgICAgICAgICAgICAgaWYgKGRzdFswXSAhPSBiZykgewotICAgICAgICAgICAgICAgICAgICBlbWluW3hdID0geTsKKyAgICAgICAgICAgICAgICAgICAgZW1pblt4IC0gb2Zmc2V0XSA9IHk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoeSA9IGVuZCAtIDE7IHkgPj0gc3RhcnQgJiYgeSA+PSBlbWF4W3hdOyB5LS0pIHsKKyAgICAgICAgICAgIGZvciAoeSA9IGVuZCAtIDE7IHkgPj0gc3RhcnQgJiYgeSA+PSBlbWF4W3ggLSBvZmZzZXRdOyB5LS0pIHsKICAgICAgICAgICAgICAgICBkc3QgPSAodWludDE2X3QgKilvdXQtPmRhdGFbY29tcG9uZW50XSArIHkgKiBkc3RfbGluZXNpemUgKyB4OwogICAgICAgICAgICAgICAgIGlmIChkc3RbMF0gIT0gYmcpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1heFt4XSA9IHk7CisgICAgICAgICAgICAgICAgICAgIGVtYXhbeCAtIG9mZnNldF0gPSB5OwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocy0+ZW52ZWxvcGUgPT0gMykKLSAgICAgICAgICAgIGVudmVsb3BlX2luc3RhbnQxNihzLCBvdXQsIHBsYW5lLCBjb21wb25lbnQpOworICAgICAgICAgICAgZW52ZWxvcGVfaW5zdGFudDE2KHMsIG91dCwgcGxhbmUsIGNvbXBvbmVudCwgb2Zmc2V0KTsKIAotICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHN0X3c7IHgrKykgewotICAgICAgICAgICAgZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW2NvbXBvbmVudF0gKyBlbWluW3hdICogZHN0X2xpbmVzaXplICsgeDsKKyAgICAgICAgZm9yICh4ID0gb2Zmc2V0OyB4IDwgb2Zmc2V0ICsgZHN0X3c7IHgrKykgeworICAgICAgICAgICAgZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW2NvbXBvbmVudF0gKyBlbWluW3ggLSBvZmZzZXRdICogZHN0X2xpbmVzaXplICsgeDsKICAgICAgICAgICAgIGRzdFswXSA9IGxpbWl0OwotICAgICAgICAgICAgZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW2NvbXBvbmVudF0gKyBlbWF4W3hdICogZHN0X2xpbmVzaXplICsgeDsKKyAgICAgICAgICAgIGRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtjb21wb25lbnRdICsgZW1heFt4IC0gb2Zmc2V0XSAqIGRzdF9saW5lc2l6ZSArIHg7CiAgICAgICAgICAgICBkc3RbMF0gPSBsaW1pdDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBkc3RfaDsgeSsrKSB7CisgICAgICAgIGZvciAoeSA9IG9mZnNldDsgeSA8IG9mZnNldCArIGRzdF9oOyB5KyspIHsKICAgICAgICAgICAgIGRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtjb21wb25lbnRdICsgeSAqIGRzdF9saW5lc2l6ZTsKLSAgICAgICAgICAgIGZvciAoeCA9IHN0YXJ0OyB4IDwgZW5kICYmIHggPCBlbWluW3ldOyB4KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IHN0YXJ0OyB4IDwgZW5kICYmIHggPCBlbWluW3kgLSBvZmZzZXRdOyB4KyspIHsKICAgICAgICAgICAgICAgICBpZiAoZHN0W3hdICE9IGJnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaW5beV0gPSB4OworICAgICAgICAgICAgICAgICAgICBlbWluW3kgLSBvZmZzZXRdID0geDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh4ID0gZW5kIC0gMTsgeCA+PSBzdGFydCAmJiB4ID49IGVtYXhbeV07IHgtLSkgeworICAgICAgICAgICAgZm9yICh4ID0gZW5kIC0gMTsgeCA+PSBzdGFydCAmJiB4ID49IGVtYXhbeSAtIG9mZnNldF07IHgtLSkgewogICAgICAgICAgICAgICAgIGlmIChkc3RbeF0gIT0gYmcpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1heFt5XSA9IHg7CisgICAgICAgICAgICAgICAgICAgIGVtYXhbeSAtIG9mZnNldF0gPSB4OwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocy0+ZW52ZWxvcGUgPT0gMykKLSAgICAgICAgICAgIGVudmVsb3BlX2luc3RhbnQxNihzLCBvdXQsIHBsYW5lLCBjb21wb25lbnQpOworICAgICAgICAgICAgZW52ZWxvcGVfaW5zdGFudDE2KHMsIG91dCwgcGxhbmUsIGNvbXBvbmVudCwgb2Zmc2V0KTsKIAotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgZHN0X2g7IHkrKykgewotICAgICAgICAgICAgZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW2NvbXBvbmVudF0gKyB5ICogZHN0X2xpbmVzaXplICsgZW1pblt5XTsKKyAgICAgICAgZm9yICh5ID0gb2Zmc2V0OyB5IDwgb2Zmc2V0ICsgZHN0X2g7IHkrKykgeworICAgICAgICAgICAgZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW2NvbXBvbmVudF0gKyB5ICogZHN0X2xpbmVzaXplICsgZW1pblt5IC0gb2Zmc2V0XTsKICAgICAgICAgICAgIGRzdFswXSA9IGxpbWl0OwotICAgICAgICAgICAgZHN0ID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW2NvbXBvbmVudF0gKyB5ICogZHN0X2xpbmVzaXplICsgZW1heFt5XTsKKyAgICAgICAgICAgIGRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtjb21wb25lbnRdICsgeSAqIGRzdF9saW5lc2l6ZSArIGVtYXhbeSAtIG9mZnNldF07CiAgICAgICAgICAgICBkc3RbMF0gPSBsaW1pdDsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZW52ZWxvcGVfcGVhayhXYXZlZm9ybUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCwgaW50IHBsYW5lLCBpbnQgY29tcG9uZW50KQorc3RhdGljIHZvaWQgZW52ZWxvcGVfcGVhayhXYXZlZm9ybUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCwgaW50IHBsYW5lLCBpbnQgY29tcG9uZW50LCBpbnQgb2Zmc2V0KQogewogICAgIGNvbnN0IGludCBkc3RfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplW2NvbXBvbmVudF07CiAgICAgY29uc3QgaW50IGJnID0gcy0+YmdfY29sb3JbY29tcG9uZW50XTsKLSAgICBjb25zdCBpbnQgaXNfY2hyb21hID0gKGNvbXBvbmVudCA9PSAxIHx8IGNvbXBvbmVudCA9PSAyKTsKLSAgICBjb25zdCBpbnQgc2hpZnRfdyA9IChpc19jaHJvbWEgPyBzLT5kZXNjLT5sb2cyX2Nocm9tYV93IDogMCk7Ci0gICAgY29uc3QgaW50IHNoaWZ0X2ggPSAoaXNfY2hyb21hID8gcy0+ZGVzYy0+bG9nMl9jaHJvbWFfaCA6IDApOwotICAgIGNvbnN0IGludCBkc3RfaCA9IEFWX0NFSUxfUlNISUZUKG91dC0+aGVpZ2h0LCBzaGlmdF9oKTsKLSAgICBjb25zdCBpbnQgZHN0X3cgPSBBVl9DRUlMX1JTSElGVChvdXQtPndpZHRoLCBzaGlmdF93KTsKKyAgICBjb25zdCBpbnQgZHN0X2ggPSBzLT5kaXNwbGF5ID09IFBBUkFERSA/IG91dC0+aGVpZ2h0IC8gcy0+YWNvbXAgOiBvdXQtPmhlaWdodDsKKyAgICBjb25zdCBpbnQgZHN0X3cgPSBzLT5kaXNwbGF5ID09IFBBUkFERSA/IG91dC0+d2lkdGggLyBzLT5hY29tcCA6IG91dC0+d2lkdGg7CiAgICAgY29uc3QgaW50IHN0YXJ0ID0gcy0+ZXN0YXJ0W3BsYW5lXTsKICAgICBjb25zdCBpbnQgZW5kID0gcy0+ZWVuZFtwbGFuZV07CiAgICAgaW50ICplbWF4ID0gcy0+ZW1heFtwbGFuZV1bY29tcG9uZW50XTsKQEAgLTM0MSw4MCArNTMxLDgwIEBACiAgICAgaW50IHgsIHk7CiAKICAgICBpZiAocy0+bW9kZSkgewotICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHN0X3c7IHgrKykgewotICAgICAgICAgICAgZm9yICh5ID0gc3RhcnQ7IHkgPCBlbmQgJiYgeSA8IGVtaW5beF07IHkrKykgeworICAgICAgICBmb3IgKHggPSBvZmZzZXQ7IHggPCBvZmZzZXQgKyBkc3RfdzsgeCsrKSB7CisgICAgICAgICAgICBmb3IgKHkgPSBzdGFydDsgeSA8IGVuZCAmJiB5IDwgZW1pblt4IC0gb2Zmc2V0XTsgeSsrKSB7CiAgICAgICAgICAgICAgICAgZHN0ID0gb3V0LT5kYXRhW2NvbXBvbmVudF0gKyB5ICogZHN0X2xpbmVzaXplICsgeDsKICAgICAgICAgICAgICAgICBpZiAoZHN0WzBdICE9IGJnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaW5beF0gPSB5OworICAgICAgICAgICAgICAgICAgICBlbWluW3ggLSBvZmZzZXRdID0geTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh5ID0gZW5kIC0gMTsgeSA+PSBzdGFydCAmJiB5ID49IGVtYXhbeF07IHktLSkgeworICAgICAgICAgICAgZm9yICh5ID0gZW5kIC0gMTsgeSA+PSBzdGFydCAmJiB5ID49IGVtYXhbeCAtIG9mZnNldF07IHktLSkgewogICAgICAgICAgICAgICAgIGRzdCA9IG91dC0+ZGF0YVtjb21wb25lbnRdICsgeSAqIGRzdF9saW5lc2l6ZSArIHg7CiAgICAgICAgICAgICAgICAgaWYgKGRzdFswXSAhPSBiZykgewotICAgICAgICAgICAgICAgICAgICBlbWF4W3hdID0geTsKKyAgICAgICAgICAgICAgICAgICAgZW1heFt4IC0gb2Zmc2V0XSA9IHk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChzLT5lbnZlbG9wZSA9PSAzKQotICAgICAgICAgICAgZW52ZWxvcGVfaW5zdGFudChzLCBvdXQsIHBsYW5lLCBjb21wb25lbnQpOworICAgICAgICAgICAgZW52ZWxvcGVfaW5zdGFudChzLCBvdXQsIHBsYW5lLCBjb21wb25lbnQsIG9mZnNldCk7CiAKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IGRzdF93OyB4KyspIHsKLSAgICAgICAgICAgIGRzdCA9IG91dC0+ZGF0YVtjb21wb25lbnRdICsgZW1pblt4XSAqIGRzdF9saW5lc2l6ZSArIHg7CisgICAgICAgIGZvciAoeCA9IG9mZnNldDsgeCA8IG9mZnNldCArIGRzdF93OyB4KyspIHsKKyAgICAgICAgICAgIGRzdCA9IG91dC0+ZGF0YVtjb21wb25lbnRdICsgZW1pblt4IC0gb2Zmc2V0XSAqIGRzdF9saW5lc2l6ZSArIHg7CiAgICAgICAgICAgICBkc3RbMF0gPSAyNTU7Ci0gICAgICAgICAgICBkc3QgPSBvdXQtPmRhdGFbY29tcG9uZW50XSArIGVtYXhbeF0gKiBkc3RfbGluZXNpemUgKyB4OworICAgICAgICAgICAgZHN0ID0gb3V0LT5kYXRhW2NvbXBvbmVudF0gKyBlbWF4W3ggLSBvZmZzZXRdICogZHN0X2xpbmVzaXplICsgeDsKICAgICAgICAgICAgIGRzdFswXSA9IDI1NTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBkc3RfaDsgeSsrKSB7CisgICAgICAgIGZvciAoeSA9IG9mZnNldDsgeSA8IG9mZnNldCArIGRzdF9oOyB5KyspIHsKICAgICAgICAgICAgIGRzdCA9IG91dC0+ZGF0YVtjb21wb25lbnRdICsgeSAqIGRzdF9saW5lc2l6ZTsKLSAgICAgICAgICAgIGZvciAoeCA9IHN0YXJ0OyB4IDwgZW5kICYmIHggPCBlbWluW3ldOyB4KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IHN0YXJ0OyB4IDwgZW5kICYmIHggPCBlbWluW3kgLSBvZmZzZXRdOyB4KyspIHsKICAgICAgICAgICAgICAgICBpZiAoZHN0W3hdICE9IGJnKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVtaW5beV0gPSB4OworICAgICAgICAgICAgICAgICAgICBlbWluW3kgLSBvZmZzZXRdID0geDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh4ID0gZW5kIC0gMTsgeCA+PSBzdGFydCAmJiB4ID49IGVtYXhbeV07IHgtLSkgeworICAgICAgICAgICAgZm9yICh4ID0gZW5kIC0gMTsgeCA+PSBzdGFydCAmJiB4ID49IGVtYXhbeSAtIG9mZnNldF07IHgtLSkgewogICAgICAgICAgICAgICAgIGlmIChkc3RbeF0gIT0gYmcpIHsKLSAgICAgICAgICAgICAgICAgICAgZW1heFt5XSA9IHg7CisgICAgICAgICAgICAgICAgICAgIGVtYXhbeSAtIG9mZnNldF0gPSB4OwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocy0+ZW52ZWxvcGUgPT0gMykKLSAgICAgICAgICAgIGVudmVsb3BlX2luc3RhbnQocywgb3V0LCBwbGFuZSwgY29tcG9uZW50KTsKKyAgICAgICAgICAgIGVudmVsb3BlX2luc3RhbnQocywgb3V0LCBwbGFuZSwgY29tcG9uZW50LCBvZmZzZXQpOwogCi0gICAgICAgIGZvciAoeSA9IDA7IHkgPCBkc3RfaDsgeSsrKSB7Ci0gICAgICAgICAgICBkc3QgPSBvdXQtPmRhdGFbY29tcG9uZW50XSArIHkgKiBkc3RfbGluZXNpemUgKyBlbWluW3ldOworICAgICAgICBmb3IgKHkgPSBvZmZzZXQ7IHkgPCBvZmZzZXQgKyBkc3RfaDsgeSsrKSB7CisgICAgICAgICAgICBkc3QgPSBvdXQtPmRhdGFbY29tcG9uZW50XSArIHkgKiBkc3RfbGluZXNpemUgKyBlbWluW3kgLSBvZmZzZXRdOwogICAgICAgICAgICAgZHN0WzBdID0gMjU1OwotICAgICAgICAgICAgZHN0ID0gb3V0LT5kYXRhW2NvbXBvbmVudF0gKyB5ICogZHN0X2xpbmVzaXplICsgZW1heFt5XTsKKyAgICAgICAgICAgIGRzdCA9IG91dC0+ZGF0YVtjb21wb25lbnRdICsgeSAqIGRzdF9saW5lc2l6ZSArIGVtYXhbeSAtIG9mZnNldF07CiAgICAgICAgICAgICBkc3RbMF0gPSAyNTU7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGVudmVsb3BlMTYoV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIGludCBwbGFuZSwgaW50IGNvbXBvbmVudCkKK3N0YXRpYyB2b2lkIGVudmVsb3BlMTYoV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIGludCBwbGFuZSwgaW50IGNvbXBvbmVudCwgaW50IG9mZnNldCkKIHsKICAgICBpZiAocy0+ZW52ZWxvcGUgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIGlmIChzLT5lbnZlbG9wZSA9PSAxKSB7Ci0gICAgICAgIGVudmVsb3BlX2luc3RhbnQxNihzLCBvdXQsIHBsYW5lLCBjb21wb25lbnQpOworICAgICAgICBlbnZlbG9wZV9pbnN0YW50MTYocywgb3V0LCBwbGFuZSwgY29tcG9uZW50LCBvZmZzZXQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudmVsb3BlX3BlYWsxNihzLCBvdXQsIHBsYW5lLCBjb21wb25lbnQpOworICAgICAgICBlbnZlbG9wZV9wZWFrMTYocywgb3V0LCBwbGFuZSwgY29tcG9uZW50LCBvZmZzZXQpOwogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgZW52ZWxvcGUoV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICpvdXQsIGludCBwbGFuZSwgaW50IGNvbXBvbmVudCkKK3N0YXRpYyB2b2lkIGVudmVsb3BlKFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0LCBpbnQgcGxhbmUsIGludCBjb21wb25lbnQsIGludCBvZmZzZXQpCiB7CiAgICAgaWYgKHMtPmVudmVsb3BlID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAocy0+ZW52ZWxvcGUgPT0gMSkgewotICAgICAgICBlbnZlbG9wZV9pbnN0YW50KHMsIG91dCwgcGxhbmUsIGNvbXBvbmVudCk7CisgICAgICAgIGVudmVsb3BlX2luc3RhbnQocywgb3V0LCBwbGFuZSwgY29tcG9uZW50LCBvZmZzZXQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGVudmVsb3BlX3BlYWsocywgb3V0LCBwbGFuZSwgY29tcG9uZW50KTsKKyAgICAgICAgZW52ZWxvcGVfcGVhayhzLCBvdXQsIHBsYW5lLCBjb21wb25lbnQsIG9mZnNldCk7CiAgICAgfQogfQogCkBAIC00MzQsMTQgKzYyNCwzMSBAQAogICAgICAgICAqdGFyZ2V0ID0gMjU1OwogfQogCi1zdGF0aWMgdm9pZCBsb3dwYXNzMTYoV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksIGludCBvZmZzZXQsIGludCBjb2x1bW4pCitzdGF0aWMgdm9pZCB1cGRhdGVfY3IodWludDhfdCAqdGFyZ2V0LCBpbnQgdW51c2VkLCBpbnQgaW50ZW5zaXR5KQoreworICAgIGlmICgqdGFyZ2V0IC0gaW50ZW5zaXR5ID4gMCkKKyAgICAgICAgKnRhcmdldCAtPSBpbnRlbnNpdHk7CisgICAgZWxzZQorICAgICAgICAqdGFyZ2V0ID0gMDsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlMTZfY3IodWludDE2X3QgKnRhcmdldCwgaW50IHVudXNlZCwgaW50IGludGVuc2l0eSwgaW50IGxpbWl0KQoreworICAgIGlmICgqdGFyZ2V0IC0gaW50ZW5zaXR5ID4gMCkKKyAgICAgICAgKnRhcmdldCAtPSBpbnRlbnNpdHk7CisgICAgZWxzZQorICAgICAgICAqdGFyZ2V0ID0gMDsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBsb3dwYXNzMTYoV2F2ZWZvcm1Db250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0X3ksIGludCBvZmZzZXRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW4sIGludCBtaXJyb3IpCiB7CiAgICAgY29uc3QgaW50IHBsYW5lID0gcy0+ZGVzYy0+Y29tcFtjb21wb25lbnRdLnBsYW5lOwotICAgIGNvbnN0IGludCBtaXJyb3IgPSBzLT5taXJyb3I7Ci0gICAgY29uc3QgaW50IGlzX2Nocm9tYSA9IChjb21wb25lbnQgPT0gMSB8fCBjb21wb25lbnQgPT0gMik7Ci0gICAgY29uc3QgaW50IHNoaWZ0X3cgPSAoaXNfY2hyb21hID8gcy0+ZGVzYy0+bG9nMl9jaHJvbWFfdyA6IDApOwotICAgIGNvbnN0IGludCBzaGlmdF9oID0gKGlzX2Nocm9tYSA/IHMtPmRlc2MtPmxvZzJfY2hyb21hX2ggOiAwKTsKKyAgICBjb25zdCBpbnQgc2hpZnRfdyA9IHMtPnNoaWZ0X3dbY29tcG9uZW50XTsKKyAgICBjb25zdCBpbnQgc2hpZnRfaCA9IHMtPnNoaWZ0X2hbY29tcG9uZW50XTsKICAgICBjb25zdCBpbnQgc3JjX2xpbmVzaXplID0gaW4tPmxpbmVzaXplW3BsYW5lXSAvIDI7CiAgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbcGxhbmVdIC8gMjsKICAgICBjb25zdCBpbnQgZHN0X3NpZ25lZF9saW5lc2l6ZSA9IGRzdF9saW5lc2l6ZSAqIChtaXJyb3IgPT0gMSA/IC0xIDogMSk7CkBAIC00NTAsMTQgKzY1NywxNSBAQAogICAgIGNvbnN0IGludCBzcmNfaCA9IEFWX0NFSUxfUlNISUZUKGluLT5oZWlnaHQsIHNoaWZ0X2gpOwogICAgIGNvbnN0IGludCBzcmNfdyA9IEFWX0NFSUxfUlNISUZUKGluLT53aWR0aCwgc2hpZnRfdyk7CiAgICAgY29uc3QgdWludDE2X3QgKnNyY19kYXRhID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbcGxhbmVdOwotICAgIHVpbnQxNl90ICpkc3RfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV0gKyAoY29sdW1uID8gKG9mZnNldCA+PiBzaGlmdF9oKSAqIGRzdF9saW5lc2l6ZSA6IG9mZnNldCA+PiBzaGlmdF93KTsKLSAgICB1aW50MTZfdCAqIGNvbnN0IGRzdF9ib3R0b21fbGluZSA9IGRzdF9kYXRhICsgZHN0X2xpbmVzaXplICogKChzLT5zaXplID4+IHNoaWZ0X2gpIC0gMSk7CisgICAgdWludDE2X3QgKmRzdF9kYXRhID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldF95ICogZHN0X2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgdWludDE2X3QgKiBjb25zdCBkc3RfYm90dG9tX2xpbmUgPSBkc3RfZGF0YSArIGRzdF9saW5lc2l6ZSAqIChzLT5zaXplIC0gMSk7CiAgICAgdWludDE2X3QgKiBjb25zdCBkc3RfbGluZSA9IChtaXJyb3IgPyBkc3RfYm90dG9tX2xpbmUgOiBkc3RfZGF0YSk7CisgICAgY29uc3QgaW50IHN0ZXAgPSBjb2x1bW4gPyAxIDw8IHNoaWZ0X3cgOiAxIDw8IHNoaWZ0X2g7CiAgICAgY29uc3QgdWludDE2X3QgKnA7CiAgICAgaW50IHk7CiAKICAgICBpZiAoIWNvbHVtbiAmJiBtaXJyb3IpCi0gICAgICAgIGRzdF9kYXRhICs9IHMtPnNpemUgPj4gc2hpZnRfdzsKKyAgICAgICAgZHN0X2RhdGEgKz0gcy0+c2l6ZTsKIAogICAgIGZvciAoeSA9IDA7IHkgPCBzcmNfaDsgeSsrKSB7CiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfZGF0YV9lbmQgPSBzcmNfZGF0YSArIHNyY193OwpAQCAtNDY1LDMzICs2NzMsNTcgQEAKIAogICAgICAgICBmb3IgKHAgPSBzcmNfZGF0YTsgcCA8IHNyY19kYXRhX2VuZDsgcCsrKSB7CiAgICAgICAgICAgICB1aW50MTZfdCAqdGFyZ2V0OwotICAgICAgICAgICAgaW50IHYgPSBGRk1JTigqcCwgbGltaXQpOworICAgICAgICAgICAgaW50IGkgPSAwLCB2ID0gRkZNSU4oKnAsIGxpbWl0KTsKIAogICAgICAgICAgICAgaWYgKGNvbHVtbikgewotICAgICAgICAgICAgICAgIHRhcmdldCA9IGRzdCsrICsgZHN0X3NpZ25lZF9saW5lc2l6ZSAqICh2ID4+IHNoaWZ0X2gpOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHN0KysgKyBkc3Rfc2lnbmVkX2xpbmVzaXplICogdjsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlMTYodGFyZ2V0LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKCsraSA8IHN0ZXApOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobWlycm9yKQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkc3RfZGF0YSAtICh2ID4+IHNoaWZ0X3cpIC0gMTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGRzdF9kYXRhICsgKHYgPj4gc2hpZnRfdyk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKnJvdyA9IGRzdF9kYXRhOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1pcnJvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IHJvdyAtIHYgLSAxOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSByb3cgKyB2OworICAgICAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIHJvdyArPSBkc3RfbGluZXNpemU7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAoKytpIDwgc3RlcCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7CiAgICAgICAgIH0KICAgICAgICAgc3JjX2RhdGEgKz0gc3JjX2xpbmVzaXplOwotICAgICAgICBkc3RfZGF0YSArPSBkc3RfbGluZXNpemU7CisgICAgICAgIGRzdF9kYXRhICs9IGRzdF9saW5lc2l6ZSAqIHN0ZXA7CiAgICAgfQogCi0gICAgZW52ZWxvcGUxNihzLCBvdXQsIHBsYW5lLCBwbGFuZSk7CisgICAgZW52ZWxvcGUxNihzLCBvdXQsIHBsYW5lLCBwbGFuZSwgY29sdW1uID8gb2Zmc2V0X3ggOiBvZmZzZXRfeSk7CiB9CiAKLXN0YXRpYyB2b2lkIGxvd3Bhc3MoV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0LAotICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgaW50ZW5zaXR5LCBpbnQgb2Zmc2V0LCBpbnQgY29sdW1uKQorI2RlZmluZSBMT1dQQVNTMTZfRlVOQyhuYW1lLCBjb2x1bW4sIG1pcnJvcikgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBsb3dwYXNzMTZfIyNuYW1lKFdhdmVmb3JtQ29udGV4dCAqcywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgaW50ZW5zaXR5LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVudXNlZDEsIGludCB1bnVzZWQyKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbG93cGFzczE2KHMsIGluLCBvdXQsIGNvbXBvbmVudCwgaW50ZW5zaXR5LCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgb2Zmc2V0X3ksIG9mZnNldF94LCBjb2x1bW4sIG1pcnJvcik7ICAgICAgICAgXAorfQorCitMT1dQQVNTMTZfRlVOQyhjb2x1bW5fbWlycm9yLCAxLCAxKQorTE9XUEFTUzE2X0ZVTkMoY29sdW1uLCAgICAgICAgMSwgMCkKK0xPV1BBU1MxNl9GVU5DKHJvd19taXJyb3IsICAgIDAsIDEpCitMT1dQQVNTMTZfRlVOQyhyb3csICAgICAgICAgICAwLCAwKQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGxvd3Bhc3MoV2F2ZWZvcm1Db250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCwgaW50IGludGVuc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0X3ksIGludCBvZmZzZXRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uLCBpbnQgbWlycm9yKQogewogICAgIGNvbnN0IGludCBwbGFuZSA9IHMtPmRlc2MtPmNvbXBbY29tcG9uZW50XS5wbGFuZTsKLSAgICBjb25zdCBpbnQgbWlycm9yID0gcy0+bWlycm9yOwotICAgIGNvbnN0IGludCBpc19jaHJvbWEgPSAoY29tcG9uZW50ID09IDEgfHwgY29tcG9uZW50ID09IDIpOwotICAgIGNvbnN0IGludCBzaGlmdF93ID0gKGlzX2Nocm9tYSA/IHMtPmRlc2MtPmxvZzJfY2hyb21hX3cgOiAwKTsKLSAgICBjb25zdCBpbnQgc2hpZnRfaCA9IChpc19jaHJvbWEgPyBzLT5kZXNjLT5sb2cyX2Nocm9tYV9oIDogMCk7CisgICAgY29uc3QgaW50IHNoaWZ0X3cgPSBzLT5zaGlmdF93W2NvbXBvbmVudF07CisgICAgY29uc3QgaW50IHNoaWZ0X2ggPSBzLT5zaGlmdF9oW2NvbXBvbmVudF07CiAgICAgY29uc3QgaW50IHNyY19saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVtwbGFuZV07CiAgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbcGxhbmVdOwogICAgIGNvbnN0IGludCBkc3Rfc2lnbmVkX2xpbmVzaXplID0gZHN0X2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKQEAgLTQ5OSwxNCArNzMxLDE1IEBACiAgICAgY29uc3QgaW50IHNyY19oID0gQVZfQ0VJTF9SU0hJRlQoaW4tPmhlaWdodCwgc2hpZnRfaCk7CiAgICAgY29uc3QgaW50IHNyY193ID0gQVZfQ0VJTF9SU0hJRlQoaW4tPndpZHRoLCBzaGlmdF93KTsKICAgICBjb25zdCB1aW50OF90ICpzcmNfZGF0YSA9IGluLT5kYXRhW3BsYW5lXTsKLSAgICB1aW50OF90ICpkc3RfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyAoY29sdW1uID8gKG9mZnNldCA+PiBzaGlmdF9oKSAqIGRzdF9saW5lc2l6ZSA6IG9mZnNldCA+PiBzaGlmdF93KTsKLSAgICB1aW50OF90ICogY29uc3QgZHN0X2JvdHRvbV9saW5lID0gZHN0X2RhdGEgKyBkc3RfbGluZXNpemUgKiAoKHMtPnNpemUgPj4gc2hpZnRfaCkgLSAxKTsKKyAgICB1aW50OF90ICpkc3RfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXRfeSAqIGRzdF9saW5lc2l6ZSArIG9mZnNldF94OworICAgIHVpbnQ4X3QgKiBjb25zdCBkc3RfYm90dG9tX2xpbmUgPSBkc3RfZGF0YSArIGRzdF9saW5lc2l6ZSAqIChzLT5zaXplIC0gMSk7CiAgICAgdWludDhfdCAqIGNvbnN0IGRzdF9saW5lID0gKG1pcnJvciA/IGRzdF9ib3R0b21fbGluZSA6IGRzdF9kYXRhKTsKKyAgICBjb25zdCBpbnQgc3RlcCA9IGNvbHVtbiA/IDEgPDwgc2hpZnRfdyA6IDEgPDwgc2hpZnRfaDsKICAgICBjb25zdCB1aW50OF90ICpwOwogICAgIGludCB5OwogCiAgICAgaWYgKCFjb2x1bW4gJiYgbWlycm9yKQotICAgICAgICBkc3RfZGF0YSArPSBzLT5zaXplID4+IHNoaWZ0X3c7CisgICAgICAgIGRzdF9kYXRhICs9IHMtPnNpemU7CiAKICAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2g7IHkrKykgewogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfZGF0YV9lbmQgPSBzcmNfZGF0YSArIHNyY193OwpAQCAtNTE1LDMwICs3NDgsMTk5IEBACiAgICAgICAgIGZvciAocCA9IHNyY19kYXRhOyBwIDwgc3JjX2RhdGFfZW5kOyBwKyspIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKnRhcmdldDsKICAgICAgICAgICAgIGlmIChjb2x1bW4pIHsKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBkc3QrKyArIGRzdF9zaWduZWRfbGluZXNpemUgKiAoKnAgPj4gc2hpZnRfaCk7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHN0ICsgZHN0X3NpZ25lZF9saW5lc2l6ZSAqICpwOworICAgICAgICAgICAgICAgIGRzdCArPSBzdGVwOworICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsKICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcm93ID0gZHN0X2RhdGE7CiAgICAgICAgICAgICAgICAgaWYgKG1pcnJvcikKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHN0X2RhdGEgLSAoKnAgPj4gc2hpZnRfdykgLSAxOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSByb3cgLSAqcCAtIDE7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkc3RfZGF0YSArICgqcCA+PiBzaGlmdF93KTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gcm93ICsgKnA7CisgICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCBpbnRlbnNpdHkpOworICAgICAgICAgICAgICAgIHJvdyArPSBkc3RfbGluZXNpemU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7CiAgICAgICAgIH0KICAgICAgICAgc3JjX2RhdGEgKz0gc3JjX2xpbmVzaXplOwotICAgICAgICBkc3RfZGF0YSArPSBkc3RfbGluZXNpemU7CisgICAgICAgIGRzdF9kYXRhICs9IGRzdF9saW5lc2l6ZSAqIHN0ZXA7CiAgICAgfQogCi0gICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgcGxhbmUpOworICAgIGlmIChjb2x1bW4gJiYgc3RlcCA+IDEpIHsKKyAgICAgICAgY29uc3QgaW50IGRzdF93ID0gcy0+ZGlzcGxheSA9PSBQQVJBREUgPyBvdXQtPndpZHRoIC8gcy0+YWNvbXAgOiBvdXQtPndpZHRoOworICAgICAgICBjb25zdCBpbnQgZHN0X2ggPSAyNTY7CisgICAgICAgIHVpbnQ4X3QgKmRzdDsKKyAgICAgICAgaW50IHgsIHo7CisKKyAgICAgICAgZHN0ID0gb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldF95ICogZHN0X2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBkc3RfaDsgeSsrKSB7CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZHN0X3c7IHgrPXN0ZXApIHsKKyAgICAgICAgICAgICAgICBmb3IgKHogPSAxOyB6IDwgc3RlcDsgeisrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgel0gPSBkc3RbeF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IGRzdF9saW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3RlcCA+IDEpIHsKKyAgICAgICAgY29uc3QgaW50IGRzdF9oID0gcy0+ZGlzcGxheSA9PSBQQVJBREUgPyBvdXQtPmhlaWdodCAvIHMtPmFjb21wIDogb3V0LT5oZWlnaHQ7CisgICAgICAgIGNvbnN0IGludCBkc3RfdyA9IDI1NjsKKyAgICAgICAgdWludDhfdCAqZHN0OworICAgICAgICBpbnQgejsKKworICAgICAgICBkc3QgPSBvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0X3kgKiBkc3RfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IGRzdF9oOyB5Kz1zdGVwKSB7CisgICAgICAgICAgICBmb3IgKHogPSAxOyB6IDwgc3RlcDsgeisrKQorICAgICAgICAgICAgICAgIG1lbWNweShkc3QgKyBkc3RfbGluZXNpemUgKiB6LCBkc3QsIGRzdF93KTsKKyAgICAgICAgICAgIGRzdCArPSBkc3RfbGluZXNpemUgKiBzdGVwOworICAgICAgICB9CisgICAgfQorCisgICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgcGxhbmUsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOwogfQogCi1zdGF0aWMgdm9pZCBmbGF0KFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwKLSAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCwgaW50IGludGVuc2l0eSwgaW50IG9mZnNldCwgaW50IGNvbHVtbikKKyNkZWZpbmUgTE9XUEFTU19GVU5DKG5hbWUsIGNvbHVtbiwgbWlycm9yKSAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGxvd3Bhc3NfIyNuYW1lKFdhdmVmb3JtQ29udGV4dCAqcywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bnVzZWQxLCBpbnQgdW51c2VkMikgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBsb3dwYXNzKHMsIGluLCBvdXQsIGNvbXBvbmVudCwgaW50ZW5zaXR5LCAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9mZnNldF95LCBvZmZzZXRfeCwgY29sdW1uLCBtaXJyb3IpOyAgICAgICAgIFwKK30KKworTE9XUEFTU19GVU5DKGNvbHVtbl9taXJyb3IsIDEsIDEpCitMT1dQQVNTX0ZVTkMoY29sdW1uLCAgICAgICAgMSwgMCkKK0xPV1BBU1NfRlVOQyhyb3dfbWlycm9yLCAgICAwLCAxKQorTE9XUEFTU19GVU5DKHJvdywgICAgICAgICAgIDAsIDApCisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmxhdDE2KFdhdmVmb3JtQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgaW50ZW5zaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldF95LCBpbnQgb2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uLCBpbnQgbWlycm9yKQogewogICAgIGNvbnN0IGludCBwbGFuZSA9IHMtPmRlc2MtPmNvbXBbY29tcG9uZW50XS5wbGFuZTsKLSAgICBjb25zdCBpbnQgbWlycm9yID0gcy0+bWlycm9yOworICAgIGNvbnN0IGludCBjMF9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsgcGxhbmUgKyAwIF0gLyAyOworICAgIGNvbnN0IGludCBjMV9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSAvIDI7CisgICAgY29uc3QgaW50IGMyX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdIC8gMjsKKyAgICBjb25zdCBpbnQgYzBfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbIGNvbXBvbmVudCArIDAgXTsKKyAgICBjb25zdCBpbnQgYzFfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbKGNvbXBvbmVudCArIDEpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBjMl9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMwX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyBjb21wb25lbnQgKyAwIF07CisgICAgY29uc3QgaW50IGMxX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzJfc2hpZnRfaCA9IHMtPnNoaWZ0X2hbKGNvbXBvbmVudCArIDIpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBkMF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbIHBsYW5lICsgMCBdIC8gMjsKKyAgICBjb25zdCBpbnQgZDFfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdIC8gMjsKKyAgICBjb25zdCBpbnQgbGltaXQgPSBzLT5tYXggLSAxOworICAgIGNvbnN0IGludCBtYXggPSBsaW1pdCAtIGludGVuc2l0eTsKKyAgICBjb25zdCBpbnQgbWlkID0gcy0+bWF4IC8gMjsKKyAgICBjb25zdCBpbnQgc3JjX2ggPSBpbi0+aGVpZ2h0OworICAgIGNvbnN0IGludCBzcmNfdyA9IGluLT53aWR0aDsKKyAgICBpbnQgeCwgeTsKKworICAgIGlmIChjb2x1bW4pIHsKKyAgICAgICAgY29uc3QgaW50IGQwX3NpZ25lZF9saW5lc2l6ZSA9IGQwX2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKKyAgICAgICAgY29uc3QgaW50IGQxX3NpZ25lZF9saW5lc2l6ZSA9IGQxX2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3JjX3c7IHgrKykgeworICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKmMwX2RhdGEgPSAodWludDE2X3QgKilpbi0+ZGF0YVtwbGFuZSArIDBdOworICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKmMxX2RhdGEgPSAodWludDE2X3QgKilpbi0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpjMl9kYXRhID0gKHVpbnQxNl90ICopaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07CisgICAgICAgICAgICB1aW50MTZfdCAqZDBfZGF0YSA9ICh1aW50MTZfdCAqKShvdXQtPmRhdGFbcGxhbmVdKSArIG9mZnNldF95ICogZDBfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgICAgIHVpbnQxNl90ICpkMV9kYXRhID0gKHVpbnQxNl90ICopKG91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSkgKyBvZmZzZXRfeSAqIGQxX2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgICAgICAgICB1aW50MTZfdCAqIGNvbnN0IGQwX2JvdHRvbV9saW5lID0gZDBfZGF0YSArIGQwX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsKKyAgICAgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDAgPSAobWlycm9yID8gZDBfYm90dG9tX2xpbmUgOiBkMF9kYXRhKTsKKyAgICAgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDFfYm90dG9tX2xpbmUgPSBkMV9kYXRhICsgZDFfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOworICAgICAgICAgICAgdWludDE2X3QgKiBjb25zdCBkMSA9IChtaXJyb3IgPyBkMV9ib3R0b21fbGluZSA6IGQxX2RhdGEpOworCisgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2g7IHkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IEZGTUlOKGMwX2RhdGFbeCA+PiBjMF9zaGlmdF93XSwgbGltaXQpICsgcy0+bWF4OworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IEZGTUlOKEZGQUJTKGMxX2RhdGFbeCA+PiBjMV9zaGlmdF93XSAtIG1pZCkgKyBGRkFCUyhjMl9kYXRhW3ggPj4gYzJfc2hpZnRfd10gLSBtaWQpLCBsaW1pdCk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKnRhcmdldDsKKworICAgICAgICAgICAgICAgIHRhcmdldCA9IGQwICsgeCArIGQwX3NpZ25lZF9saW5lc2l6ZSAqIGMwOworICAgICAgICAgICAgICAgIHVwZGF0ZTE2KHRhcmdldCwgbWF4LCBpbnRlbnNpdHksIGxpbWl0KTsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMSArIHggKyBkMV9zaWduZWRfbGluZXNpemUgKiAoYzAgLSBjMSk7CisgICAgICAgICAgICAgICAgdXBkYXRlMTYodGFyZ2V0LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOworICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxICsgeCArIGQxX3NpZ25lZF9saW5lc2l6ZSAqIChjMCArIGMxKTsKKyAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIWMwX3NoaWZ0X2ggfHwgKHkgJiBjMF9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoIWMxX3NoaWZ0X2ggfHwgKHkgJiBjMV9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoIWMyX3NoaWZ0X2ggfHwgKHkgJiBjMl9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICAgICAgYzJfZGF0YSArPSBjMl9saW5lc2l6ZTsKKyAgICAgICAgICAgICAgICBkMF9kYXRhICs9IGQwX2xpbmVzaXplOworICAgICAgICAgICAgICAgIGQxX2RhdGEgKz0gZDFfbGluZXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqYzBfZGF0YSA9ICh1aW50MTZfdCAqKWluLT5kYXRhW3BsYW5lXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKmMxX2RhdGEgPSAodWludDE2X3QgKilpbi0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKmMyX2RhdGEgPSAodWludDE2X3QgKilpbi0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXTsKKyAgICAgICAgdWludDE2X3QgKmQwX2RhdGEgPSAodWludDE2X3QgKikob3V0LT5kYXRhW3BsYW5lXSkgKyBvZmZzZXRfeSAqIGQwX2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgICAgIHVpbnQxNl90ICpkMV9kYXRhID0gKHVpbnQxNl90ICopKG91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSkgKyBvZmZzZXRfeSAqIGQxX2xpbmVzaXplICsgb2Zmc2V0X3g7CisKKyAgICAgICAgaWYgKG1pcnJvcikgeworICAgICAgICAgICAgZDBfZGF0YSArPSBzLT5zaXplIC0gMTsKKyAgICAgICAgICAgIGQxX2RhdGEgKz0gcy0+c2l6ZSAtIDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2g7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNyY193OyB4KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzAgPSBGRk1JTihjMF9kYXRhW3ggPj4gYzBfc2hpZnRfd10sIGxpbWl0KSArIHMtPm1heDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBGRk1JTihGRkFCUyhjMV9kYXRhW3ggPj4gYzFfc2hpZnRfd10gLSBtaWQpICsgRkZBQlMoYzJfZGF0YVt4ID4+IGMyX3NoaWZ0X3ddIC0gbWlkKSwgbGltaXQpOworICAgICAgICAgICAgICAgIHVpbnQxNl90ICp0YXJnZXQ7CisKKyAgICAgICAgICAgICAgICBpZiAobWlycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQwX2RhdGEgLSBjMDsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlMTYodGFyZ2V0LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMV9kYXRhIC0gKGMwIC0gYzEpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxX2RhdGEgLSAoYzAgKyBjMSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZTE2KHRhcmdldCwgbWF4LCBpbnRlbnNpdHksIGxpbWl0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMF9kYXRhICsgYzA7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZTE2KHRhcmdldCwgbWF4LCBpbnRlbnNpdHksIGxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZDFfZGF0YSArIChjMCAtIGMxKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlMTYodGFyZ2V0LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOworICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMV9kYXRhICsgKGMwICsgYzEpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWMwX3NoaWZ0X2ggfHwgKHkgJiBjMF9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOworICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzJfc2hpZnRfaCB8fCAoeSAmIGMyX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7CisgICAgICAgICAgICBkMF9kYXRhICs9IGQwX2xpbmVzaXplOworICAgICAgICAgICAgZDFfZGF0YSArPSBkMV9saW5lc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVudmVsb3BlMTYocywgb3V0LCBwbGFuZSwgcGxhbmUsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOworICAgIGVudmVsb3BlMTYocywgb3V0LCBwbGFuZSwgKHBsYW5lICsgMSkgJSBzLT5uY29tcCwgY29sdW1uID8gb2Zmc2V0X3ggOiBvZmZzZXRfeSk7Cit9CisKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZmxhdChXYXZlZm9ybUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgaW50ZW5zaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW4sIGludCBtaXJyb3IpCit7CisgICAgY29uc3QgaW50IHBsYW5lID0gcy0+ZGVzYy0+Y29tcFtjb21wb25lbnRdLnBsYW5lOwogICAgIGNvbnN0IGludCBjMF9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsgcGxhbmUgKyAwIF07CiAgICAgY29uc3QgaW50IGMxX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwogICAgIGNvbnN0IGludCBjMl9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzBfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbIGNvbXBvbmVudCArIDAgXTsKKyAgICBjb25zdCBpbnQgYzFfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbKGNvbXBvbmVudCArIDEpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBjMl9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMwX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyBjb21wb25lbnQgKyAwIF07CisgICAgY29uc3QgaW50IGMxX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzJfc2hpZnRfaCA9IHMtPnNoaWZ0X2hbKGNvbXBvbmVudCArIDIpICUgcy0+bmNvbXBdOwogICAgIGNvbnN0IGludCBkMF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbIHBsYW5lICsgMCBdOwogICAgIGNvbnN0IGludCBkMV9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07CiAgICAgY29uc3QgaW50IG1heCA9IDI1NSAtIGludGVuc2l0eTsKQEAgLTU1NCwyOCArOTU2LDMxIEBACiAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjMF9kYXRhID0gaW4tPmRhdGFbcGxhbmUgKyAwXTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMxX2RhdGEgPSBpbi0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMyX2RhdGEgPSBpbi0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmQwX2RhdGEgPSBvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0ICogZDBfbGluZXNpemU7Ci0gICAgICAgICAgICB1aW50OF90ICpkMV9kYXRhID0gb3V0LT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdICsgb2Zmc2V0ICogZDFfbGluZXNpemU7CisgICAgICAgICAgICB1aW50OF90ICpkMF9kYXRhID0gb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldF95ICogZDBfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmQxX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXRfeSAqIGQxX2xpbmVzaXplICsgb2Zmc2V0X3g7CiAgICAgICAgICAgICB1aW50OF90ICogY29uc3QgZDBfYm90dG9tX2xpbmUgPSBkMF9kYXRhICsgZDBfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOwogICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQwID0gKG1pcnJvciA/IGQwX2JvdHRvbV9saW5lIDogZDBfZGF0YSk7CiAgICAgICAgICAgICB1aW50OF90ICogY29uc3QgZDFfYm90dG9tX2xpbmUgPSBkMV9kYXRhICsgZDFfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOwogICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQxID0gKG1pcnJvciA/IGQxX2JvdHRvbV9saW5lIDogZDFfZGF0YSk7CiAKICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzcmNfaDsgeSsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGMwID0gYzBfZGF0YVt4XSArIDI1NjsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBGRkFCUyhjMV9kYXRhW3hdIC0gMTI4KSArIEZGQUJTKGMyX2RhdGFbeF0gLSAxMjgpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IGMwX2RhdGFbeCA+PiBjMF9zaGlmdF93XSArIDI1NjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBGRkFCUyhjMV9kYXRhW3ggPj4gYzFfc2hpZnRfd10gLSAxMjgpICsgRkZBQlMoYzJfZGF0YVt4ID4+IGMyX3NoaWZ0X3ddIC0gMTI4KTsKICAgICAgICAgICAgICAgICB1aW50OF90ICp0YXJnZXQ7CiAKICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMCArIHggKyBkMF9zaWduZWRfbGluZXNpemUgKiBjMDsKICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7CiAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZDEgKyB4ICsgZDFfc2lnbmVkX2xpbmVzaXplICogKGMwIC0gYzEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgMSk7CisgICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCBpbnRlbnNpdHkpOwogICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxICsgeCArIGQxX3NpZ25lZF9saW5lc2l6ZSAqIChjMCArIGMxKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIDEpOworICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsKIAotICAgICAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7Ci0gICAgICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKLSAgICAgICAgICAgICAgICBjMl9kYXRhICs9IGMyX2xpbmVzaXplOworICAgICAgICAgICAgICAgIGlmICghYzBfc2hpZnRfaCB8fCAoeSAmIGMwX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOworICAgICAgICAgICAgICAgIGlmICghYzFfc2hpZnRfaCB8fCAoeSAmIGMxX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOworICAgICAgICAgICAgICAgIGlmICghYzJfc2hpZnRfaCB8fCAoeSAmIGMyX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgICAgICBjMl9kYXRhICs9IGMyX2xpbmVzaXplOwogICAgICAgICAgICAgICAgIGQwX2RhdGEgKz0gZDBfbGluZXNpemU7CiAgICAgICAgICAgICAgICAgZDFfZGF0YSArPSBkMV9saW5lc2l6ZTsKICAgICAgICAgICAgIH0KQEAgLTU4NCw4ICs5ODksOCBAQAogICAgICAgICBjb25zdCB1aW50OF90ICpjMF9kYXRhID0gaW4tPmRhdGFbcGxhbmVdOwogICAgICAgICBjb25zdCB1aW50OF90ICpjMV9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMyX2RhdGEgPSBpbi0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXTsKLSAgICAgICAgdWludDhfdCAqZDBfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXQ7Ci0gICAgICAgIHVpbnQ4X3QgKmQxX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXQ7CisgICAgICAgIHVpbnQ4X3QgKmQwX2RhdGEgPSBvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0X3kgKiBkMF9saW5lc2l6ZSArIG9mZnNldF94OworICAgICAgICB1aW50OF90ICpkMV9kYXRhID0gb3V0LT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdICsgb2Zmc2V0X3kgKiBkMV9saW5lc2l6ZSArIG9mZnNldF94OwogCiAgICAgICAgIGlmIChtaXJyb3IpIHsKICAgICAgICAgICAgIGQwX2RhdGEgKz0gcy0+c2l6ZSAtIDE7CkBAIC01OTQsMTU4ICs5OTksNDA1IEBACiAKICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzcmNfdzsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgaW50IGMwID0gYzBfZGF0YVt4XSArIDI1NjsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBGRkFCUyhjMV9kYXRhW3hdIC0gMTI4KSArIEZGQUJTKGMyX2RhdGFbeF0gLSAxMjgpOworICAgICAgICAgICAgICAgIGludCBjMCA9IGMwX2RhdGFbeCA+PiBjMF9zaGlmdF93XSArIDI1NjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBGRkFCUyhjMV9kYXRhW3ggPj4gYzFfc2hpZnRfd10gLSAxMjgpICsgRkZBQlMoYzJfZGF0YVt4ID4+IGMyX3NoaWZ0X3ddIC0gMTI4KTsKICAgICAgICAgICAgICAgICB1aW50OF90ICp0YXJnZXQ7CiAKICAgICAgICAgICAgICAgICBpZiAobWlycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQwX2RhdGEgLSBjMDsKICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCBpbnRlbnNpdHkpOwogICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMV9kYXRhIC0gKGMwIC0gYzEpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIDEpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7CiAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxX2RhdGEgLSAoYzAgKyBjMSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgMSk7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMF9kYXRhICsgYzA7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsKICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZDFfZGF0YSArIChjMCAtIGMxKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCBpbnRlbnNpdHkpOwogICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMV9kYXRhICsgKGMwICsgYzEpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIDEpOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOwotICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKLSAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMwX3NoaWZ0X2ggfHwgKHkgJiBjMF9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOworICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzJfc2hpZnRfaCB8fCAoeSAmIGMyX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7CiAgICAgICAgICAgICBkMF9kYXRhICs9IGQwX2xpbmVzaXplOwogICAgICAgICAgICAgZDFfZGF0YSArPSBkMV9saW5lc2l6ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGVudmVsb3BlKHMsIG91dCwgcGxhbmUsIHBsYW5lKTsKLSAgICBlbnZlbG9wZShzLCBvdXQsIHBsYW5lLCAocGxhbmUgKyAxKSAlIHMtPm5jb21wKTsKKyAgICBlbnZlbG9wZShzLCBvdXQsIHBsYW5lLCBwbGFuZSwgY29sdW1uID8gb2Zmc2V0X3ggOiBvZmZzZXRfeSk7CisgICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgKHBsYW5lICsgMSkgJSBzLT5uY29tcCwgY29sdW1uID8gb2Zmc2V0X3ggOiBvZmZzZXRfeSk7CiB9CiAKLXN0YXRpYyB2b2lkIGFmbGF0KFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwKLSAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksIGludCBvZmZzZXQsIGludCBjb2x1bW4pCisjZGVmaW5lIEFGTEFUMTYobmFtZSwgdXBkYXRlX2NyLCBjb2x1bW4sIG1pcnJvcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBuYW1lIChXYXZlZm9ybUNvbnRleHQgKnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCwgaW50IGludGVuc2l0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW51c2VkMSwgaW50IHVudXNlZDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBwbGFuZSA9IHMtPmRlc2MtPmNvbXBbY29tcG9uZW50XS5wbGFuZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYzBfbGluZXNpemUgPSBpbi0+bGluZXNpemVbIHBsYW5lICsgMCBdIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGMxX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMl9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYzBfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbIGNvbXBvbmVudCArIDAgXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGMxX3NoaWZ0X3cgPSBzLT5zaGlmdF93Wyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMl9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYzBfc2hpZnRfaCA9IHMtPnNoaWZ0X2hbIGNvbXBvbmVudCArIDAgXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGMxX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMl9zaGlmdF9oID0gcy0+c2hpZnRfaFsoY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgZDBfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyBwbGFuZSArIDAgXSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGQxX2xpbmVzaXplID0gb3V0LT5saW5lc2l6ZVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSAvIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBkMl9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gLyAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgbGltaXQgPSBzLT5tYXggLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IG1heCA9IGxpbWl0IC0gaW50ZW5zaXR5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBtaWQgPSBzLT5tYXggLyAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgc3JjX2ggPSBpbi0+aGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHNyY193ID0gaW4tPndpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4LCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNvbHVtbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgZDBfc2lnbmVkX2xpbmVzaXplID0gZDBfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IGQxX3NpZ25lZF9saW5lc2l6ZSA9IGQxX2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBkMl9zaWduZWRfbGluZXNpemUgPSBkMl9saW5lc2l6ZSAqIChtaXJyb3IgPT0gMSA/IC0xIDogMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNyY193OyB4KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqYzBfZGF0YSA9ICh1aW50MTZfdCAqKWluLT5kYXRhW3BsYW5lICsgMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKmMxX2RhdGEgPSAodWludDE2X3QgKilpbi0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpjMl9kYXRhID0gKHVpbnQxNl90ICopaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MTZfdCAqZDBfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXRfeSAqIGQwX2xpbmVzaXplICsgb2Zmc2V0X3g7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDE2X3QgKmQxX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXRfeSAqIGQxX2xpbmVzaXplICsgb2Zmc2V0X3g7IFwKKyAgICAgICAgICAgIHVpbnQxNl90ICpkMl9kYXRhID0gKHVpbnQxNl90ICopb3V0LT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdICsgb2Zmc2V0X3kgKiBkMl9saW5lc2l6ZSArIG9mZnNldF94OyBcCisgICAgICAgICAgICB1aW50MTZfdCAqIGNvbnN0IGQwX2JvdHRvbV9saW5lID0gZDBfZGF0YSArIGQwX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDE2X3QgKiBjb25zdCBkMCA9IChtaXJyb3IgPyBkMF9ib3R0b21fbGluZSA6IGQwX2RhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDFfYm90dG9tX2xpbmUgPSBkMV9kYXRhICsgZDFfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MTZfdCAqIGNvbnN0IGQxID0gKG1pcnJvciA/IGQxX2JvdHRvbV9saW5lIDogZDFfZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDE2X3QgKiBjb25zdCBkMl9ib3R0b21fbGluZSA9IGQyX2RhdGEgKyBkMl9saW5lc2l6ZSAqIChzLT5zaXplIC0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDIgPSAobWlycm9yID8gZDJfYm90dG9tX2xpbmUgOiBkMl9kYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzAgPSBGRk1JTihjMF9kYXRhW3ggPj4gYzBfc2hpZnRfd10sIGxpbWl0KSArIG1pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMxID0gRkZNSU4oYzFfZGF0YVt4ID4+IGMxX3NoaWZ0X3ddLCBsaW1pdCkgLSBtaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IEZGTUlOKGMyX2RhdGFbeCA+PiBjMl9zaGlmdF93XSwgbGltaXQpIC0gbWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqdGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRhcmdldCA9IGQwICsgeCArIGQwX3NpZ25lZF9saW5lc2l6ZSAqIGMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxICsgeCArIGQxX3NpZ25lZF9saW5lc2l6ZSAqIChjMCArIGMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRhcmdldCA9IGQyICsgeCArIGQyX3NpZ25lZF9saW5lc2l6ZSAqIChjMCArIGMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfY3IodGFyZ2V0LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICghYzBfc2hpZnRfaCB8fCAoeSAmIGMwX3NoaWZ0X2gpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiAoIWMyX3NoaWZ0X2ggfHwgKHkgJiBjMl9zaGlmdF9oKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQwX2RhdGEgKz0gZDBfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkMV9kYXRhICs9IGQxX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZDJfZGF0YSArPSBkMl9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50MTZfdCAqYzBfZGF0YSA9ICh1aW50MTZfdCAqKWluLT5kYXRhW3BsYW5lXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKmMxX2RhdGEgPSAodWludDE2X3QgKilpbi0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpjMl9kYXRhID0gKHVpbnQxNl90ICopaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MTZfdCAqZDBfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXRfeSAqIGQwX2xpbmVzaXplICsgb2Zmc2V0X3g7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDE2X3QgKmQxX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXRfeSAqIGQxX2xpbmVzaXplICsgb2Zmc2V0X3g7ICAgICBcCisgICAgICAgIHVpbnQxNl90ICpkMl9kYXRhID0gKHVpbnQxNl90ICopb3V0LT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdICsgb2Zmc2V0X3kgKiBkMl9saW5lc2l6ZSArIG9mZnNldF94OyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG1pcnJvcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkMF9kYXRhICs9IHMtPnNpemUgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZDFfZGF0YSArPSBzLT5zaXplIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGQyX2RhdGEgKz0gcy0+c2l6ZSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3JjX3c7IHgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IEZGTUlOKGMwX2RhdGFbeCA+PiBjMF9zaGlmdF93XSwgbGltaXQpICsgbWlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBGRk1JTihjMV9kYXRhW3ggPj4gYzFfc2hpZnRfd10sIGxpbWl0KSAtIG1pZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMyID0gRkZNSU4oYzJfZGF0YVt4ID4+IGMyX3NoaWZ0X3ddLCBsaW1pdCkgLSBtaWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVpbnQxNl90ICp0YXJnZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKG1pcnJvcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMF9kYXRhIC0gYzA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlMTYodGFyZ2V0LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxX2RhdGEgLSAoYzAgKyBjMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZDJfZGF0YSAtIChjMCArIGMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9jcih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZDBfZGF0YSArIGMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZTE2KHRhcmdldCwgbWF4LCBpbnRlbnNpdHksIGxpbWl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMV9kYXRhICsgKGMwICsgYzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlMTYodGFyZ2V0LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQyX2RhdGEgKyAoYzAgKyBjMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY3IodGFyZ2V0LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICghYzBfc2hpZnRfaCB8fCAoeSAmIGMwX3NoaWZ0X2gpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIWMyX3NoaWZ0X2ggfHwgKHkgJiBjMl9zaGlmdF9oKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGQwX2RhdGEgKz0gZDBfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkMV9kYXRhICs9IGQxX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZDJfZGF0YSArPSBkMl9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnZlbG9wZTE2KHMsIG91dCwgcGxhbmUsIChwbGFuZSArIDApICUgcy0+bmNvbXAsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZW52ZWxvcGUxNihzLCBvdXQsIHBsYW5lLCAocGxhbmUgKyAxKSAlIHMtPm5jb21wLCBjb2x1bW4gPyBvZmZzZXRfeCA6IG9mZnNldF95KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudmVsb3BlMTYocywgb3V0LCBwbGFuZSwgKHBsYW5lICsgMikgJSBzLT5uY29tcCwgY29sdW1uID8gb2Zmc2V0X3ggOiBvZmZzZXRfeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBBRkxBVChuYW1lLCB1cGRhdGVfY3IsIGNvbHVtbiwgbWlycm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBuYW1lKFdhdmVmb3JtQ29udGV4dCAqcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bnVzZWQxLCBpbnQgdW51c2VkMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBwbGFuZSA9IHMtPmRlc2MtPmNvbXBbY29tcG9uZW50XS5wbGFuZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMF9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsgcGxhbmUgKyAwIF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMV9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMl9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMF9zaGlmdF93ID0gcy0+c2hpZnRfd1sgY29tcG9uZW50ICsgMCBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMV9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMSkgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMl9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMF9zaGlmdF9oID0gcy0+c2hpZnRfaFsgY29tcG9uZW50ICsgMCBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMV9zaGlmdF9oID0gcy0+c2hpZnRfaFsoY29tcG9uZW50ICsgMSkgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjMl9zaGlmdF9oID0gcy0+c2hpZnRfaFsoY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBkMF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbIHBsYW5lICsgMCBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBkMV9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBkMl9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbKHBsYW5lICsgMikgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBtYXggPSAyNTUgLSBpbnRlbnNpdHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBzcmNfaCA9IGluLT5oZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBzcmNfdyA9IGluLT53aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4LCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChjb2x1bW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgZDBfc2lnbmVkX2xpbmVzaXplID0gZDBfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgZDFfc2lnbmVkX2xpbmVzaXplID0gZDFfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgZDJfc2lnbmVkX2xpbmVzaXplID0gZDJfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3JjX3c7IHgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYzBfZGF0YSA9IGluLT5kYXRhW3BsYW5lICsgMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYzFfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYzJfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDhfdCAqZDBfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXRfeSAqIGQwX2xpbmVzaXplICsgb2Zmc2V0X3g7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDhfdCAqZDFfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDFfbGluZXNpemUgKyBvZmZzZXRfeDsgXAorICAgICAgICAgICAgdWludDhfdCAqZDJfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDJfbGluZXNpemUgKyBvZmZzZXRfeDsgXAorICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQwX2JvdHRvbV9saW5lID0gZDBfZGF0YSArIGQwX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQwID0gKG1pcnJvciA/IGQwX2JvdHRvbV9saW5lIDogZDBfZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQxX2JvdHRvbV9saW5lID0gZDFfZGF0YSArIGQxX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQxID0gKG1pcnJvciA/IGQxX2JvdHRvbV9saW5lIDogZDFfZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQyX2JvdHRvbV9saW5lID0gZDJfZGF0YSArIGQyX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQyID0gKG1pcnJvciA/IGQyX2JvdHRvbV9saW5lIDogZDJfZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IGMwX2RhdGFbeCA+PiBjMF9zaGlmdF93XSArIDEyODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IGMxX2RhdGFbeCA+PiBjMV9zaGlmdF93XSAtIDEyODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeCA+PiBjMl9zaGlmdF93XSAtIDEyODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRhcmdldCA9IGQwICsgeCArIGQwX3NpZ25lZF9saW5lc2l6ZSAqIGMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxICsgeCArIGQxX3NpZ25lZF9saW5lc2l6ZSAqIChjMCArIGMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRhcmdldCA9IGQyICsgeCArIGQyX3NpZ25lZF9saW5lc2l6ZSAqIChjMCArIGMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVwZGF0ZV9jcih0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICghYzBfc2hpZnRfaCB8fCAoeSAmIGMwX3NoaWZ0X2gpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICghYzFfc2hpZnRfaCB8fCAoeSAmIGMxX3NoaWZ0X2gpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICghYzFfc2hpZnRfaCB8fCAoeSAmIGMxX3NoaWZ0X2gpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjMl9kYXRhICs9IGMxX2xpbmVzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQwX2RhdGEgKz0gZDBfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQxX2RhdGEgKz0gZDFfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGQyX2RhdGEgKz0gZDJfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OF90ICpjMF9kYXRhID0gaW4tPmRhdGFbcGxhbmVdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OF90ICpjMV9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OF90ICpjMl9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50OF90ICpkMF9kYXRhID0gb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldF95ICogZDBfbGluZXNpemUgKyBvZmZzZXRfeDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50OF90ICpkMV9kYXRhID0gb3V0LT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdICsgb2Zmc2V0X3kgKiBkMV9saW5lc2l6ZSArIG9mZnNldF94OyAgICAgXAorICAgICAgICB1aW50OF90ICpkMl9kYXRhID0gb3V0LT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdICsgb2Zmc2V0X3kgKiBkMl9saW5lc2l6ZSArIG9mZnNldF94OyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobWlycm9yKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZDBfZGF0YSArPSBzLT5zaXplIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZDFfZGF0YSArPSBzLT5zaXplIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZDJfZGF0YSArPSBzLT5zaXplIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2g7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNyY193OyB4KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IGMwX2RhdGFbeCA+PiBjMF9zaGlmdF93XSArIDEyODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IGMxX2RhdGFbeCA+PiBjMV9zaGlmdF93XSAtIDEyODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeCA+PiBjMl9zaGlmdF93XSAtIDEyODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRhcmdldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmIChtaXJyb3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMF9kYXRhIC0gYzA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMV9kYXRhIC0gKGMwICsgYzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMl9kYXRhIC0gKGMwICsgYzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY3IodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMF9kYXRhICsgYzA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMV9kYXRhICsgKGMwICsgYzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMl9kYXRhICsgKGMwICsgYzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB1cGRhdGVfY3IodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCFjMF9zaGlmdF9oIHx8ICh5ICYgYzBfc2hpZnRfaCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCFjMl9zaGlmdF9oIHx8ICh5ICYgYzJfc2hpZnRfaCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZDBfZGF0YSArPSBkMF9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZDFfZGF0YSArPSBkMV9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZDJfZGF0YSArPSBkMl9saW5lc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudmVsb3BlKHMsIG91dCwgcGxhbmUsIChwbGFuZSArIDApICUgcy0+bmNvbXAsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudmVsb3BlKHMsIG91dCwgcGxhbmUsIChwbGFuZSArIDEpICUgcy0+bmNvbXAsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudmVsb3BlKHMsIG91dCwgcGxhbmUsIChwbGFuZSArIDIpICUgcy0+bmNvbXAsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOyAgICAgICAgICAgICAgICAgICAgXAorfQorCitBRkxBVDE2KGFmbGF0MTZfcm93LCAgICAgICAgICAgdXBkYXRlMTYsICAgIDAsIDApCitBRkxBVDE2KGFmbGF0MTZfcm93X21pcnJvciwgICAgdXBkYXRlMTYsICAgIDAsIDEpCitBRkxBVDE2KGFmbGF0MTZfY29sdW1uLCAgICAgICAgdXBkYXRlMTYsICAgIDEsIDApCitBRkxBVDE2KGFmbGF0MTZfY29sdW1uX21pcnJvciwgdXBkYXRlMTYsICAgIDEsIDEpCitBRkxBVDE2KHhmbGF0MTZfcm93LCAgICAgICAgICAgdXBkYXRlMTZfY3IsIDAsIDApCitBRkxBVDE2KHhmbGF0MTZfcm93X21pcnJvciwgICAgdXBkYXRlMTZfY3IsIDAsIDEpCitBRkxBVDE2KHhmbGF0MTZfY29sdW1uLCAgICAgICAgdXBkYXRlMTZfY3IsIDEsIDApCitBRkxBVDE2KHhmbGF0MTZfY29sdW1uX21pcnJvciwgdXBkYXRlMTZfY3IsIDEsIDEpCisKK0FGTEFUKGFmbGF0X3JvdywgICAgICAgICAgIHVwZGF0ZSwgICAgMCwgMCkKK0FGTEFUKGFmbGF0X3Jvd19taXJyb3IsICAgIHVwZGF0ZSwgICAgMCwgMSkKK0FGTEFUKGFmbGF0X2NvbHVtbiwgICAgICAgIHVwZGF0ZSwgICAgMSwgMCkKK0FGTEFUKGFmbGF0X2NvbHVtbl9taXJyb3IsIHVwZGF0ZSwgICAgMSwgMSkKK0FGTEFUKHhmbGF0X3JvdywgICAgICAgICAgIHVwZGF0ZV9jciwgMCwgMCkKK0FGTEFUKHhmbGF0X3Jvd19taXJyb3IsICAgIHVwZGF0ZV9jciwgMCwgMSkKK0FGTEFUKHhmbGF0X2NvbHVtbiwgICAgICAgIHVwZGF0ZV9jciwgMSwgMCkKK0FGTEFUKHhmbGF0X2NvbHVtbl9taXJyb3IsIHVwZGF0ZV9jciwgMSwgMSkKKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjaHJvbWExNihXYXZlZm9ybUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uLCBpbnQgbWlycm9yKQogewogICAgIGNvbnN0IGludCBwbGFuZSA9IHMtPmRlc2MtPmNvbXBbY29tcG9uZW50XS5wbGFuZTsKLSAgICBjb25zdCBpbnQgbWlycm9yID0gcy0+bWlycm9yOwotICAgIGNvbnN0IGludCBjMF9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsgcGxhbmUgKyAwIF07Ci0gICAgY29uc3QgaW50IGMxX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwotICAgIGNvbnN0IGludCBjMl9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXTsKLSAgICBjb25zdCBpbnQgZDBfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyBwbGFuZSArIDAgXTsKLSAgICBjb25zdCBpbnQgZDFfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwotICAgIGNvbnN0IGludCBkMl9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbKHBsYW5lICsgMikgJSBzLT5uY29tcF07Ci0gICAgY29uc3QgaW50IG1heCA9IDI1NSAtIGludGVuc2l0eTsKKyAgICBjb25zdCBpbnQgYzBfbGluZXNpemUgPSBpbi0+bGluZXNpemVbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gLyAyOworICAgIGNvbnN0IGludCBjMV9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSAvIDI7CisgICAgY29uc3QgaW50IGRzdF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICBjb25zdCBpbnQgbGltaXQgPSBzLT5tYXggLSAxOworICAgIGNvbnN0IGludCBtYXggPSBsaW1pdCAtIGludGVuc2l0eTsKKyAgICBjb25zdCBpbnQgbWlkID0gcy0+bWF4IC8gMjsKKyAgICBjb25zdCBpbnQgYzBfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbKGNvbXBvbmVudCArIDEpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBjMV9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMwX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzFfc2hpZnRfaCA9IHMtPnNoaWZ0X2hbKGNvbXBvbmVudCArIDIpICUgcy0+bmNvbXBdOwogICAgIGNvbnN0IGludCBzcmNfaCA9IGluLT5oZWlnaHQ7CiAgICAgY29uc3QgaW50IHNyY193ID0gaW4tPndpZHRoOwogICAgIGludCB4LCB5OwogCiAgICAgaWYgKGNvbHVtbikgewotICAgICAgICBjb25zdCBpbnQgZDBfc2lnbmVkX2xpbmVzaXplID0gZDBfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOwotICAgICAgICBjb25zdCBpbnQgZDFfc2lnbmVkX2xpbmVzaXplID0gZDFfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOwotICAgICAgICBjb25zdCBpbnQgZDJfc2lnbmVkX2xpbmVzaXplID0gZDJfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOworICAgICAgICBjb25zdCBpbnQgZHN0X3NpZ25lZF9saW5lc2l6ZSA9IGRzdF9saW5lc2l6ZSAqIChtaXJyb3IgPT0gMSA/IC0xIDogMSk7CiAKICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNyY193OyB4KyspIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMwX2RhdGEgPSBpbi0+ZGF0YVtwbGFuZSArIDBdOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYzFfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYzJfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdOwotICAgICAgICAgICAgdWludDhfdCAqZDBfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXQgKiBkMF9saW5lc2l6ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmQxX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXQgKiBkMV9saW5lc2l6ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmQyX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gKyBvZmZzZXQgKiBkMl9saW5lc2l6ZTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkMF9ib3R0b21fbGluZSA9IGQwX2RhdGEgKyBkMF9saW5lc2l6ZSAqIChzLT5zaXplIC0gMSk7Ci0gICAgICAgICAgICB1aW50OF90ICogY29uc3QgZDAgPSAobWlycm9yID8gZDBfYm90dG9tX2xpbmUgOiBkMF9kYXRhKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkMV9ib3R0b21fbGluZSA9IGQxX2RhdGEgKyBkMV9saW5lc2l6ZSAqIChzLT5zaXplIC0gMSk7Ci0gICAgICAgICAgICB1aW50OF90ICogY29uc3QgZDEgPSAobWlycm9yID8gZDFfYm90dG9tX2xpbmUgOiBkMV9kYXRhKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkMl9ib3R0b21fbGluZSA9IGQyX2RhdGEgKyBkMl9saW5lc2l6ZSAqIChzLT5zaXplIC0gMSk7Ci0gICAgICAgICAgICB1aW50OF90ICogY29uc3QgZDIgPSAobWlycm9yID8gZDJfYm90dG9tX2xpbmUgOiBkMl9kYXRhKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpjMF9kYXRhID0gKHVpbnQxNl90ICopaW4tPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07CisgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqYzFfZGF0YSA9ICh1aW50MTZfdCAqKWluLT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdOworICAgICAgICAgICAgdWludDE2X3QgKmRzdF9kYXRhID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldF95ICogZHN0X2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgICAgICAgICB1aW50MTZfdCAqIGNvbnN0IGRzdF9ib3R0b21fbGluZSA9IGRzdF9kYXRhICsgZHN0X2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsKKyAgICAgICAgICAgIHVpbnQxNl90ICogY29uc3QgZHN0X2xpbmUgPSAobWlycm9yID8gZHN0X2JvdHRvbV9saW5lIDogZHN0X2RhdGEpOworICAgICAgICAgICAgdWludDE2X3QgKmRzdCA9IGRzdF9saW5lOwogCiAgICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2g7IHkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IGMwX2RhdGFbeF0gKyAxMjg7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGMxID0gYzFfZGF0YVt4XSAtIDEyODsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzIgPSBjMl9kYXRhW3hdIC0gMTI4OwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRhcmdldDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3VtID0gRkZNSU4oRkZBQlMoYzBfZGF0YVt4ID4+IGMwX3NoaWZ0X3ddIC0gbWlkKSArIEZGQUJTKGMxX2RhdGFbeCA+PiBjMV9zaGlmdF93XSAtIG1pZCAtIDEpLCBsaW1pdCk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKnRhcmdldDsKIAotICAgICAgICAgICAgICAgIHRhcmdldCA9IGQwICsgeCArIGQwX3NpZ25lZF9saW5lc2l6ZSAqIGMwOwotICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBkc3QgKyB4ICsgZHN0X3NpZ25lZF9saW5lc2l6ZSAqIHN1bTsKKyAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7CiAKLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMSArIHggKyBkMV9zaWduZWRfbGluZXNpemUgKiAoYzAgKyBjMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCAxKTsKLQotICAgICAgICAgICAgICAgIHRhcmdldCA9IGQyICsgeCArIGQyX3NpZ25lZF9saW5lc2l6ZSAqIChjMCArIGMyKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIDEpOwotCi0gICAgICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsKLSAgICAgICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOwotICAgICAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7Ci0gICAgICAgICAgICAgICAgZDBfZGF0YSArPSBkMF9saW5lc2l6ZTsKLSAgICAgICAgICAgICAgICBkMV9kYXRhICs9IGQxX2xpbmVzaXplOwotICAgICAgICAgICAgICAgIGQyX2RhdGEgKz0gZDJfbGluZXNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFjMF9zaGlmdF9oIHx8ICh5ICYgYzBfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7CisgICAgICAgICAgICAgICAgZHN0X2RhdGEgKz0gZHN0X2xpbmVzaXplOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqYzBfZGF0YSA9IGluLT5kYXRhW3BsYW5lXTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqYzFfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwotICAgICAgICBjb25zdCB1aW50OF90ICpjMl9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07Ci0gICAgICAgIHVpbnQ4X3QgKmQwX2RhdGEgPSBvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0OwotICAgICAgICB1aW50OF90ICpkMV9kYXRhID0gb3V0LT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdICsgb2Zmc2V0OwotICAgICAgICB1aW50OF90ICpkMl9kYXRhID0gb3V0LT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdICsgb2Zmc2V0OworICAgICAgICBjb25zdCB1aW50MTZfdCAqYzBfZGF0YSA9ICh1aW50MTZfdCAqKWluLT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOworICAgICAgICBjb25zdCB1aW50MTZfdCAqYzFfZGF0YSA9ICh1aW50MTZfdCAqKWluLT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdOworICAgICAgICB1aW50MTZfdCAqZHN0X2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0X3kgKiBkc3RfbGluZXNpemUgKyBvZmZzZXRfeDsKIAotICAgICAgICBpZiAobWlycm9yKSB7Ci0gICAgICAgICAgICBkMF9kYXRhICs9IHMtPnNpemUgLSAxOwotICAgICAgICAgICAgZDFfZGF0YSArPSBzLT5zaXplIC0gMTsKLSAgICAgICAgICAgIGQyX2RhdGEgKz0gcy0+c2l6ZSAtIDE7Ci0gICAgICAgIH0KLQorICAgICAgICBpZiAobWlycm9yKQorICAgICAgICAgICAgZHN0X2RhdGEgKz0gcy0+c2l6ZSAtIDE7CiAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzcmNfaDsgeSsrKSB7CiAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3JjX3c7IHgrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IGMwX2RhdGFbeF0gKyAxMjg7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGMxID0gYzFfZGF0YVt4XSAtIDEyODsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzIgPSBjMl9kYXRhW3hdIC0gMTI4OwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRhcmdldDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3VtID0gRkZNSU4oRkZBQlMoYzBfZGF0YVt4ID4+IGMwX3NoaWZ0X3ddIC0gbWlkKSArIEZGQUJTKGMxX2RhdGFbeCA+PiBjMV9zaGlmdF93XSAtIG1pZCAtIDEpLCBsaW1pdCk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKnRhcmdldDsKIAogICAgICAgICAgICAgICAgIGlmIChtaXJyb3IpIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZDBfZGF0YSAtIGMwOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxX2RhdGEgLSAoYzAgKyBjMSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQyX2RhdGEgLSAoYzAgKyBjMik7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgMSk7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGRzdF9kYXRhIC0gc3VtOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZDBfZGF0YSArIGMwOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxX2RhdGEgKyAoYzAgKyBjMSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQyX2RhdGEgKyAoYzAgKyBjMik7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgMSk7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGRzdF9kYXRhICsgc3VtOworICAgICAgICAgICAgICAgICAgICB1cGRhdGUxNih0YXJnZXQsIG1heCwgaW50ZW5zaXR5LCBsaW1pdCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOwotICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKLSAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7Ci0gICAgICAgICAgICBkMF9kYXRhICs9IGQwX2xpbmVzaXplOwotICAgICAgICAgICAgZDFfZGF0YSArPSBkMV9saW5lc2l6ZTsKLSAgICAgICAgICAgIGQyX2RhdGEgKz0gZDJfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMwX3NoaWZ0X2ggfHwgKHkgJiBjMF9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOworICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKKyAgICAgICAgICAgIGRzdF9kYXRhICs9IGRzdF9saW5lc2l6ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGVudmVsb3BlKHMsIG91dCwgcGxhbmUsIChwbGFuZSArIDApICUgcy0+bmNvbXApOwotICAgIGVudmVsb3BlKHMsIG91dCwgcGxhbmUsIChwbGFuZSArIDEpICUgcy0+bmNvbXApOwotICAgIGVudmVsb3BlKHMsIG91dCwgcGxhbmUsIChwbGFuZSArIDIpICUgcy0+bmNvbXApOworICAgIGVudmVsb3BlMTYocywgb3V0LCBwbGFuZSwgcGxhbmUsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOwogfQogCi1zdGF0aWMgdm9pZCBjaHJvbWEoV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0LAotICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksIGludCBvZmZzZXQsIGludCBjb2x1bW4pCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGNocm9tYShXYXZlZm9ybUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCwgaW50IGludGVuc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbiwgaW50IG1pcnJvcikKIHsKICAgICBjb25zdCBpbnQgcGxhbmUgPSBzLT5kZXNjLT5jb21wW2NvbXBvbmVudF0ucGxhbmU7Ci0gICAgY29uc3QgaW50IG1pcnJvciA9IHMtPm1pcnJvcjsKICAgICBjb25zdCBpbnQgYzBfbGluZXNpemUgPSBpbi0+bGluZXNpemVbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07CiAgICAgY29uc3QgaW50IGMxX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdOwogICAgIGNvbnN0IGludCBkc3RfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplW3BsYW5lXTsKICAgICBjb25zdCBpbnQgbWF4ID0gMjU1IC0gaW50ZW5zaXR5OworICAgIGNvbnN0IGludCBjMF9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMSkgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMxX3NoaWZ0X3cgPSBzLT5zaGlmdF93Wyhjb21wb25lbnQgKyAyKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzBfc2hpZnRfaCA9IHMtPnNoaWZ0X2hbKGNvbXBvbmVudCArIDEpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBjMV9zaGlmdF9oID0gcy0+c2hpZnRfaFsoY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07CiAgICAgY29uc3QgaW50IHNyY19oID0gaW4tPmhlaWdodDsKICAgICBjb25zdCBpbnQgc3JjX3cgPSBpbi0+d2lkdGg7CiAgICAgaW50IHgsIHk7CkBAIC03NTYsMTUyICsxNDA4LDY0IEBACiAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzcmNfdzsgeCsrKSB7CiAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjMF9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07CiAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpjMV9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07Ci0gICAgICAgICAgICB1aW50OF90ICpkc3RfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXQgKiBkc3RfbGluZXNpemU7CisgICAgICAgICAgICB1aW50OF90ICpkc3RfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXRfeSAqIGRzdF9saW5lc2l6ZSArIG9mZnNldF94OwogICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGRzdF9ib3R0b21fbGluZSA9IGRzdF9kYXRhICsgZHN0X2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsKICAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkc3RfbGluZSA9IChtaXJyb3IgPyBkc3RfYm90dG9tX2xpbmUgOiBkc3RfZGF0YSk7CiAgICAgICAgICAgICB1aW50OF90ICpkc3QgPSBkc3RfbGluZTsKIAogICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3VtID0gRkZBQlMoYzBfZGF0YVt4XSAtIDEyOCkgKyBGRkFCUyhjMV9kYXRhW3hdIC0gMTI4KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgc3VtID0gRkZBQlMoYzBfZGF0YVt4ID4+IGMwX3NoaWZ0X3ddIC0gMTI4KSArIEZGQUJTKGMxX2RhdGFbeCA+PiBjMV9zaGlmdF93XSAtIDEyNyk7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqdGFyZ2V0OwogCi0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHN0ICsgeCArIGRzdF9zaWduZWRfbGluZXNpemUgKiAoMjU2IC0gc3VtKTsKLSAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHN0ICsgeCArIGRzdF9zaWduZWRfbGluZXNpemUgKiAoMjU1ICsgc3VtKTsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBkc3QgKyB4ICsgZHN0X3NpZ25lZF9saW5lc2l6ZSAqIHN1bTsKICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7CiAKLSAgICAgICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOwotICAgICAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFjMF9zaGlmdF9oIHx8ICh5ICYgYzBfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7CisgICAgICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7CiAgICAgICAgICAgICAgICAgZHN0X2RhdGEgKz0gZHN0X2xpbmVzaXplOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqYzBfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwogICAgICAgICBjb25zdCB1aW50OF90ICpjMV9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07Ci0gICAgICAgIHVpbnQ4X3QgKmRzdF9kYXRhID0gb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldDsKKyAgICAgICAgdWludDhfdCAqZHN0X2RhdGEgPSBvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0X3kgKiBkc3RfbGluZXNpemUgKyBvZmZzZXRfeDsKIAogICAgICAgICBpZiAobWlycm9yKQogICAgICAgICAgICAgZHN0X2RhdGEgKz0gcy0+c2l6ZSAtIDE7CiAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzcmNfaDsgeSsrKSB7CiAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3JjX3c7IHgrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdW0gPSBGRkFCUyhjMF9kYXRhW3hdIC0gMTI4KSArIEZGQUJTKGMxX2RhdGFbeF0gLSAxMjgpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBzdW0gPSBGRkFCUyhjMF9kYXRhW3ggPj4gYzBfc2hpZnRfd10gLSAxMjgpICsgRkZBQlMoYzFfZGF0YVt4ID4+IGMxX3NoaWZ0X3ddIC0gMTI3KTsKICAgICAgICAgICAgICAgICB1aW50OF90ICp0YXJnZXQ7CiAKICAgICAgICAgICAgICAgICBpZiAobWlycm9yKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGRzdF9kYXRhIC0gKDI1NiAtIHN1bSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHN0X2RhdGEgLSAoMjU1ICsgc3VtKTsKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gZHN0X2RhdGEgLSBzdW07CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkc3RfZGF0YSArICgyNTYgLSBzdW0pOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGRzdF9kYXRhICsgKDI1NSArIHN1bSk7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGRzdF9kYXRhICsgc3VtOwogICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOwotICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzBfc2hpZnRfaCB8fCAoeSAmIGMwX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMxX3NoaWZ0X2ggfHwgKHkgJiBjMV9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOwogICAgICAgICAgICAgZHN0X2RhdGEgKz0gZHN0X2xpbmVzaXplOwogICAgICAgICB9CiAgICAgfQogCi0gICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgKHBsYW5lICsgMCkgJSBzLT5uY29tcCk7CisgICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgcGxhbmUsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOwogfQogCi1zdGF0aWMgdm9pZCBhY2hyb21hKFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCwgaW50IGludGVuc2l0eSwgaW50IG9mZnNldCwgaW50IGNvbHVtbikKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgY29sb3IxNihXYXZlZm9ybUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgaW50ZW5zaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW4sIGludCBtaXJyb3IpCiB7CiAgICAgY29uc3QgaW50IHBsYW5lID0gcy0+ZGVzYy0+Y29tcFtjb21wb25lbnRdLnBsYW5lOwotICAgIGNvbnN0IGludCBtaXJyb3IgPSBzLT5taXJyb3I7Ci0gICAgY29uc3QgaW50IGMxX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwotICAgIGNvbnN0IGludCBjMl9saW5lc2l6ZSA9IGluLT5saW5lc2l6ZVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXTsKLSAgICBjb25zdCBpbnQgZDFfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwotICAgIGNvbnN0IGludCBkMl9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbKHBsYW5lICsgMikgJSBzLT5uY29tcF07Ci0gICAgY29uc3QgaW50IG1heCA9IDI1NSAtIGludGVuc2l0eTsKLSAgICBjb25zdCBpbnQgc3JjX2ggPSBpbi0+aGVpZ2h0OwotICAgIGNvbnN0IGludCBzcmNfdyA9IGluLT53aWR0aDsKLSAgICBpbnQgeCwgeTsKLQotICAgIGlmIChjb2x1bW4pIHsKLSAgICAgICAgY29uc3QgaW50IGQxX3NpZ25lZF9saW5lc2l6ZSA9IGQxX2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKLSAgICAgICAgY29uc3QgaW50IGQyX3NpZ25lZF9saW5lc2l6ZSA9IGQyX2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKLQotICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3JjX3c7IHgrKykgewotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYzFfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYzJfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdOwotICAgICAgICAgICAgdWludDhfdCAqZDFfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSArIG9mZnNldCAqIGQxX2xpbmVzaXplOwotICAgICAgICAgICAgdWludDhfdCAqZDJfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSArIG9mZnNldCAqIGQyX2xpbmVzaXplOwotICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQxX2JvdHRvbV9saW5lID0gZDFfZGF0YSArIGQxX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkMSA9IChtaXJyb3IgPyBkMV9ib3R0b21fbGluZSA6IGQxX2RhdGEpOwotICAgICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQyX2JvdHRvbV9saW5lID0gZDJfZGF0YSArIGQyX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsKLSAgICAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkMiA9IChtaXJyb3IgPyBkMl9ib3R0b21fbGluZSA6IGQyX2RhdGEpOwotCi0gICAgICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2g7IHkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IGMxX2RhdGFbeF0gLSAxMjg7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGMyID0gYzJfZGF0YVt4XSAtIDEyODsKLSAgICAgICAgICAgICAgICB1aW50OF90ICp0YXJnZXQ7Ci0KLSAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMSArIHggKyBkMV9zaWduZWRfbGluZXNpemUgKiAoMTI4ICsgYzEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZSh0YXJnZXQsIG1heCwgaW50ZW5zaXR5KTsKLQotICAgICAgICAgICAgICAgIHRhcmdldCA9IGQyICsgeCArIGQyX3NpZ25lZF9saW5lc2l6ZSAqICgxMjggKyBjMik7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCBpbnRlbnNpdHkpOwotCi0gICAgICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKLSAgICAgICAgICAgICAgICBjMl9kYXRhICs9IGMyX2xpbmVzaXplOwotICAgICAgICAgICAgICAgIGQxX2RhdGEgKz0gZDFfbGluZXNpemU7Ci0gICAgICAgICAgICAgICAgZDJfZGF0YSArPSBkMl9saW5lc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmMxX2RhdGEgPSBpbi0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqYzJfZGF0YSA9IGluLT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdOwotICAgICAgICB1aW50OF90ICpkMF9kYXRhID0gb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldDsKLSAgICAgICAgdWludDhfdCAqZDFfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSArIG9mZnNldDsKLSAgICAgICAgdWludDhfdCAqZDJfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSArIG9mZnNldDsKLQotICAgICAgICBpZiAobWlycm9yKSB7Ci0gICAgICAgICAgICBkMF9kYXRhICs9IHMtPnNpemUgLSAxOwotICAgICAgICAgICAgZDFfZGF0YSArPSBzLT5zaXplIC0gMTsKLSAgICAgICAgICAgIGQyX2RhdGEgKz0gcy0+c2l6ZSAtIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2g7IHkrKykgewotICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNyY193OyB4KyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBjMV9kYXRhW3hdIC0gMTI4OwotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeF0gLSAxMjg7Ci0gICAgICAgICAgICAgICAgdWludDhfdCAqdGFyZ2V0OwotCi0gICAgICAgICAgICAgICAgaWYgKG1pcnJvcikgewotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMV9kYXRhIC0gKDEyOCArIGMxKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCBpbnRlbnNpdHkpOwotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBkMl9kYXRhIC0gKDEyOCArIGMyKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlKHRhcmdldCwgbWF4LCBpbnRlbnNpdHkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQxX2RhdGEgKyAoMTI4ICsgYzEpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGQyX2RhdGEgKyAoMTI4ICsgYzIpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGUodGFyZ2V0LCBtYXgsIGludGVuc2l0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOwotICAgICAgICAgICAgYzJfZGF0YSArPSBjMl9saW5lc2l6ZTsKLSAgICAgICAgICAgIGQxX2RhdGEgKz0gZDFfbGluZXNpemU7Ci0gICAgICAgICAgICBkMl9kYXRhICs9IGQyX2xpbmVzaXplOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgKHBsYW5lICsgMSkgJSBzLT5uY29tcCk7Ci0gICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgKHBsYW5lICsgMikgJSBzLT5uY29tcCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbG9yMTYoV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICppbiwgQVZGcmFtZSAqb3V0LAotICAgICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgaW50ZW5zaXR5LCBpbnQgb2Zmc2V0LCBpbnQgY29sdW1uKQotewotICAgIGNvbnN0IGludCBwbGFuZSA9IHMtPmRlc2MtPmNvbXBbY29tcG9uZW50XS5wbGFuZTsKLSAgICBjb25zdCBpbnQgbWlycm9yID0gcy0+bWlycm9yOwogICAgIGNvbnN0IGludCBsaW1pdCA9IHMtPm1heCAtIDE7CiAgICAgY29uc3QgdWludDE2X3QgKmMwX2RhdGEgPSAoY29uc3QgdWludDE2X3QgKilpbi0+ZGF0YVtwbGFuZSArIDBdOwogICAgIGNvbnN0IHVpbnQxNl90ICpjMV9kYXRhID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07CkBAIC05MTIsMTcgKzE0NzYsMjMgQEAKICAgICBjb25zdCBpbnQgZDBfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyBwbGFuZSArIDAgXSAvIDI7CiAgICAgY29uc3QgaW50IGQxX2xpbmVzaXplID0gb3V0LT5saW5lc2l6ZVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSAvIDI7CiAgICAgY29uc3QgaW50IGQyX2xpbmVzaXplID0gb3V0LT5saW5lc2l6ZVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSAvIDI7CisgICAgY29uc3QgaW50IGMwX3NoaWZ0X3cgPSBzLT5zaGlmdF93WyBjb21wb25lbnQgKyAwIF07CisgICAgY29uc3QgaW50IGMxX3NoaWZ0X3cgPSBzLT5zaGlmdF93Wyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzJfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbKGNvbXBvbmVudCArIDIpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBjMF9zaGlmdF9oID0gcy0+c2hpZnRfaFsgY29tcG9uZW50ICsgMCBdOworICAgIGNvbnN0IGludCBjMV9zaGlmdF9oID0gcy0+c2hpZnRfaFsoY29tcG9uZW50ICsgMSkgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMyX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyhjb21wb25lbnQgKyAyKSAlIHMtPm5jb21wXTsKICAgICBjb25zdCBpbnQgc3JjX2ggPSBpbi0+aGVpZ2h0OwogICAgIGNvbnN0IGludCBzcmNfdyA9IGluLT53aWR0aDsKICAgICBpbnQgeCwgeTsKIAotICAgIGlmIChzLT5tb2RlKSB7CisgICAgaWYgKGNvbHVtbikgewogICAgICAgICBjb25zdCBpbnQgZDBfc2lnbmVkX2xpbmVzaXplID0gZDBfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOwogICAgICAgICBjb25zdCBpbnQgZDFfc2lnbmVkX2xpbmVzaXplID0gZDFfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOwogICAgICAgICBjb25zdCBpbnQgZDJfc2lnbmVkX2xpbmVzaXplID0gZDJfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOwotICAgICAgICB1aW50MTZfdCAqZDBfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXQgKiBkMF9saW5lc2l6ZTsKLSAgICAgICAgdWludDE2X3QgKmQxX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXQgKiBkMV9saW5lc2l6ZTsKLSAgICAgICAgdWludDE2X3QgKmQyX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gKyBvZmZzZXQgKiBkMl9saW5lc2l6ZTsKKyAgICAgICAgdWludDE2X3QgKmQwX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0X3kgKiBkMF9saW5lc2l6ZSArIG9mZnNldF94OworICAgICAgICB1aW50MTZfdCAqZDFfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDFfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgdWludDE2X3QgKmQyX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gKyBvZmZzZXRfeSAqIGQyX2xpbmVzaXplICsgb2Zmc2V0X3g7CiAgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDBfYm90dG9tX2xpbmUgPSBkMF9kYXRhICsgZDBfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOwogICAgICAgICB1aW50MTZfdCAqIGNvbnN0IGQwID0gKG1pcnJvciA/IGQwX2JvdHRvbV9saW5lIDogZDBfZGF0YSk7CiAgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDFfYm90dG9tX2xpbmUgPSBkMV9kYXRhICsgZDFfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOwpAQCAtOTMyLDI2ICsxNTAyLDI5IEBACiAKICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzcmNfdzsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGMwID0gRkZNSU4oYzBfZGF0YVt4XSwgbGltaXQpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IGMxX2RhdGFbeF07Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGMyID0gYzJfZGF0YVt4XTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzAgPSBGRk1JTihjMF9kYXRhW3ggPj4gYzBfc2hpZnRfd10sIGxpbWl0KTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBjMV9kYXRhW3ggPj4gYzFfc2hpZnRfd107CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMyID0gYzJfZGF0YVt4ID4+IGMyX3NoaWZ0X3ddOwogCiAgICAgICAgICAgICAgICAgKihkMCArIGQwX3NpZ25lZF9saW5lc2l6ZSAqIGMwICsgeCkgPSBjMDsKICAgICAgICAgICAgICAgICAqKGQxICsgZDFfc2lnbmVkX2xpbmVzaXplICogYzAgKyB4KSA9IGMxOwogICAgICAgICAgICAgICAgICooZDIgKyBkMl9zaWduZWRfbGluZXNpemUgKiBjMCArIHgpID0gYzI7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7Ci0gICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOwotICAgICAgICAgICAgYzJfZGF0YSArPSBjMl9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzBfc2hpZnRfaCB8fCAoeSAmIGMwX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMxX3NoaWZ0X2ggfHwgKHkgJiBjMV9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOworICAgICAgICAgICAgaWYgKCFjMl9zaGlmdF9oIHx8ICh5ICYgYzJfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzJfZGF0YSArPSBjMl9saW5lc2l6ZTsKICAgICAgICAgICAgIGQwX2RhdGEgKz0gZDBfbGluZXNpemU7CiAgICAgICAgICAgICBkMV9kYXRhICs9IGQxX2xpbmVzaXplOwogICAgICAgICAgICAgZDJfZGF0YSArPSBkMl9saW5lc2l6ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQxNl90ICpkMF9kYXRhID0gKHVpbnQxNl90ICopb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldDsKLSAgICAgICAgdWludDE2X3QgKmQxX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXQ7Ci0gICAgICAgIHVpbnQxNl90ICpkMl9kYXRhID0gKHVpbnQxNl90ICopb3V0LT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdICsgb2Zmc2V0OworICAgICAgICB1aW50MTZfdCAqZDBfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXRfeSAqIGQwX2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgICAgIHVpbnQxNl90ICpkMV9kYXRhID0gKHVpbnQxNl90ICopb3V0LT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdICsgb2Zmc2V0X3kgKiBkMV9saW5lc2l6ZSArIG9mZnNldF94OworICAgICAgICB1aW50MTZfdCAqZDJfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDJfbGluZXNpemUgKyBvZmZzZXRfeDsKIAogICAgICAgICBpZiAobWlycm9yKSB7CiAgICAgICAgICAgICBkMF9kYXRhICs9IHMtPnNpemUgLSAxOwpAQCAtOTYxLDkgKzE1MzQsOSBAQAogCiAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzcmNfaDsgeSsrKSB7CiAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3JjX3c7IHgrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IEZGTUlOKGMwX2RhdGFbeF0sIGxpbWl0KTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBjMV9kYXRhW3hdOwotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeF07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMwID0gRkZNSU4oYzBfZGF0YVt4ID4+IGMwX3NoaWZ0X3ddLCBsaW1pdCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMxID0gYzFfZGF0YVt4ID4+IGMxX3NoaWZ0X3ddOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeCA+PiBjMl9zaGlmdF93XTsKIAogICAgICAgICAgICAgICAgIGlmIChtaXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgKihkMF9kYXRhIC0gYzApID0gYzA7CkBAIC05NzYsMjMgKzE1NDksMjggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7Ci0gICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOwotICAgICAgICAgICAgYzJfZGF0YSArPSBjMl9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzBfc2hpZnRfaCB8fCAoeSAmIGMwX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMwX2RhdGEgKz0gYzBfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMxX3NoaWZ0X2ggfHwgKHkgJiBjMV9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMV9kYXRhICs9IGMxX2xpbmVzaXplOworICAgICAgICAgICAgaWYgKCFjMl9zaGlmdF9oIHx8ICh5ICYgYzJfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzJfZGF0YSArPSBjMl9saW5lc2l6ZTsKICAgICAgICAgICAgIGQwX2RhdGEgKz0gZDBfbGluZXNpemU7CiAgICAgICAgICAgICBkMV9kYXRhICs9IGQxX2xpbmVzaXplOwogICAgICAgICAgICAgZDJfZGF0YSArPSBkMl9saW5lc2l6ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGVudmVsb3BlMTYocywgb3V0LCBwbGFuZSwgcGxhbmUpOworICAgIGVudmVsb3BlMTYocywgb3V0LCBwbGFuZSwgcGxhbmUsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOwogfQogCi1zdGF0aWMgdm9pZCBjb2xvcihXYXZlZm9ybUNvbnRleHQgKnMsIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsCi0gICAgICAgICAgICAgICAgICBpbnQgY29tcG9uZW50LCBpbnQgaW50ZW5zaXR5LCBpbnQgb2Zmc2V0LCBpbnQgY29sdW1uKQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBjb2xvcihXYXZlZm9ybUNvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmluLCBBVkZyYW1lICpvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfeSwgaW50IG9mZnNldF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sdW1uLCBpbnQgbWlycm9yKQogewogICAgIGNvbnN0IGludCBwbGFuZSA9IHMtPmRlc2MtPmNvbXBbY29tcG9uZW50XS5wbGFuZTsKLSAgICBjb25zdCBpbnQgbWlycm9yID0gcy0+bWlycm9yOwogICAgIGNvbnN0IHVpbnQ4X3QgKmMwX2RhdGEgPSBpbi0+ZGF0YVtwbGFuZSArIDBdOwogICAgIGNvbnN0IHVpbnQ4X3QgKmMxX2RhdGEgPSBpbi0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsKICAgICBjb25zdCB1aW50OF90ICpjMl9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07CkBAIC0xMDAyLDYgKzE1ODAsMTIgQEAKICAgICBjb25zdCBpbnQgZDBfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyBwbGFuZSArIDAgXTsKICAgICBjb25zdCBpbnQgZDFfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOwogICAgIGNvbnN0IGludCBkMl9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbKHBsYW5lICsgMikgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMwX3NoaWZ0X3cgPSBzLT5zaGlmdF93WyBjb21wb25lbnQgKyAwIF07CisgICAgY29uc3QgaW50IGMxX3NoaWZ0X3cgPSBzLT5zaGlmdF93Wyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzJfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbKGNvbXBvbmVudCArIDIpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBjMF9zaGlmdF9oID0gcy0+c2hpZnRfaFsgY29tcG9uZW50ICsgMCBdOworICAgIGNvbnN0IGludCBjMV9zaGlmdF9oID0gcy0+c2hpZnRfaFsoY29tcG9uZW50ICsgMSkgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMyX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyhjb21wb25lbnQgKyAyKSAlIHMtPm5jb21wXTsKICAgICBjb25zdCBpbnQgc3JjX2ggPSBpbi0+aGVpZ2h0OwogICAgIGNvbnN0IGludCBzcmNfdyA9IGluLT53aWR0aDsKICAgICBpbnQgeCwgeTsKQEAgLTEwMTAsOSArMTU5NCw5IEBACiAgICAgICAgIGNvbnN0IGludCBkMF9zaWduZWRfbGluZXNpemUgPSBkMF9saW5lc2l6ZSAqIChtaXJyb3IgPT0gMSA/IC0xIDogMSk7CiAgICAgICAgIGNvbnN0IGludCBkMV9zaWduZWRfbGluZXNpemUgPSBkMV9saW5lc2l6ZSAqIChtaXJyb3IgPT0gMSA/IC0xIDogMSk7CiAgICAgICAgIGNvbnN0IGludCBkMl9zaWduZWRfbGluZXNpemUgPSBkMl9saW5lc2l6ZSAqIChtaXJyb3IgPT0gMSA/IC0xIDogMSk7Ci0gICAgICAgIHVpbnQ4X3QgKmQwX2RhdGEgPSBvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0ICogZDBfbGluZXNpemU7Ci0gICAgICAgIHVpbnQ4X3QgKmQxX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXQgKiBkMV9saW5lc2l6ZTsKLSAgICAgICAgdWludDhfdCAqZDJfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSArIG9mZnNldCAqIGQyX2xpbmVzaXplOworICAgICAgICB1aW50OF90ICpkMF9kYXRhID0gb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldF95ICogZDBfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgdWludDhfdCAqZDFfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDFfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgdWludDhfdCAqZDJfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDJfbGluZXNpemUgKyBvZmZzZXRfeDsKICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQwX2JvdHRvbV9saW5lID0gZDBfZGF0YSArIGQwX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsKICAgICAgICAgdWludDhfdCAqIGNvbnN0IGQwID0gKG1pcnJvciA/IGQwX2JvdHRvbV9saW5lIDogZDBfZGF0YSk7CiAgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkMV9ib3R0b21fbGluZSA9IGQxX2RhdGEgKyBkMV9saW5lc2l6ZSAqIChzLT5zaXplIC0gMSk7CkBAIC0xMDIyLDI2ICsxNjA2LDI5IEBACiAKICAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzcmNfdzsgeCsrKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGMwID0gYzBfZGF0YVt4XTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBjMV9kYXRhW3hdOwotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeF07CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMwID0gYzBfZGF0YVt4ID4+IGMwX3NoaWZ0X3ddOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IGMxX2RhdGFbeCA+PiBjMV9zaGlmdF93XTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzIgPSBjMl9kYXRhW3ggPj4gYzJfc2hpZnRfd107CiAKICAgICAgICAgICAgICAgICAqKGQwICsgZDBfc2lnbmVkX2xpbmVzaXplICogYzAgKyB4KSA9IGMwOwogICAgICAgICAgICAgICAgICooZDEgKyBkMV9zaWduZWRfbGluZXNpemUgKiBjMCArIHgpID0gYzE7CiAgICAgICAgICAgICAgICAgKihkMiArIGQyX3NpZ25lZF9saW5lc2l6ZSAqIGMwICsgeCkgPSBjMjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsKLSAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7Ci0gICAgICAgICAgICBjMl9kYXRhICs9IGMyX2xpbmVzaXplOworICAgICAgICAgICAgaWYgKCFjMF9zaGlmdF9oIHx8ICh5ICYgYzBfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzFfc2hpZnRfaCB8fCAoeSAmIGMxX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMyX3NoaWZ0X2ggfHwgKHkgJiBjMl9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMl9kYXRhICs9IGMyX2xpbmVzaXplOwogICAgICAgICAgICAgZDBfZGF0YSArPSBkMF9saW5lc2l6ZTsKICAgICAgICAgICAgIGQxX2RhdGEgKz0gZDFfbGluZXNpemU7CiAgICAgICAgICAgICBkMl9kYXRhICs9IGQyX2xpbmVzaXplOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCAqZDBfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXQ7Ci0gICAgICAgIHVpbnQ4X3QgKmQxX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXQ7Ci0gICAgICAgIHVpbnQ4X3QgKmQyX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gKyBvZmZzZXQ7CisgICAgICAgIHVpbnQ4X3QgKmQwX2RhdGEgPSBvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0X3kgKiBkMF9saW5lc2l6ZSArIG9mZnNldF94OworICAgICAgICB1aW50OF90ICpkMV9kYXRhID0gb3V0LT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdICsgb2Zmc2V0X3kgKiBkMV9saW5lc2l6ZSArIG9mZnNldF94OworICAgICAgICB1aW50OF90ICpkMl9kYXRhID0gb3V0LT5kYXRhWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdICsgb2Zmc2V0X3kgKiBkMl9saW5lc2l6ZSArIG9mZnNldF94OwogCiAgICAgICAgIGlmIChtaXJyb3IpIHsKICAgICAgICAgICAgIGQwX2RhdGEgKz0gcy0+c2l6ZSAtIDE7CkBAIC0xMDUxLDkgKzE2MzgsOSBAQAogCiAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzcmNfaDsgeSsrKSB7CiAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgc3JjX3c7IHgrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IGMwX2RhdGFbeF07Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50IGMxID0gYzFfZGF0YVt4XTsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzIgPSBjMl9kYXRhW3hdOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMCA9IGMwX2RhdGFbeCA+PiBjMF9zaGlmdF93XTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzEgPSBjMV9kYXRhW3ggPj4gYzFfc2hpZnRfd107CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMyID0gYzJfZGF0YVt4ID4+IGMyX3NoaWZ0X3ddOwogCiAgICAgICAgICAgICAgICAgaWYgKG1pcnJvcikgewogICAgICAgICAgICAgICAgICAgICAqKGQwX2RhdGEgLSBjMCkgPSBjMDsKQEAgLTEwNjYsMjEgKzE2NTMsODU1IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOwotICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKLSAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMwX3NoaWZ0X2ggfHwgKHkgJiBjMF9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOworICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzJfc2hpZnRfaCB8fCAoeSAmIGMyX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7CiAgICAgICAgICAgICBkMF9kYXRhICs9IGQwX2xpbmVzaXplOwogICAgICAgICAgICAgZDFfZGF0YSArPSBkMV9saW5lc2l6ZTsKICAgICAgICAgICAgIGQyX2RhdGEgKz0gZDJfbGluZXNpemU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBlbnZlbG9wZShzLCBvdXQsIHBsYW5lLCBwbGFuZSk7CisgICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgcGxhbmUsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGFjb2xvcjE2KFdhdmVmb3JtQ29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBvbmVudCwgaW50IGludGVuc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldF95LCBpbnQgb2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW4sIGludCBtaXJyb3IpCit7CisgICAgY29uc3QgaW50IHBsYW5lID0gcy0+ZGVzYy0+Y29tcFtjb21wb25lbnRdLnBsYW5lOworICAgIGNvbnN0IGludCBsaW1pdCA9IHMtPm1heCAtIDE7CisgICAgY29uc3QgaW50IG1heCA9IGxpbWl0IC0gaW50ZW5zaXR5OworICAgIGNvbnN0IHVpbnQxNl90ICpjMF9kYXRhID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbcGxhbmUgKyAwXTsKKyAgICBjb25zdCB1aW50MTZfdCAqYzFfZGF0YSA9IChjb25zdCB1aW50MTZfdCAqKWluLT5kYXRhWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IHVpbnQxNl90ICpjMl9kYXRhID0gKGNvbnN0IHVpbnQxNl90ICopaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMwX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyBwbGFuZSArIDAgXSAvIDI7CisgICAgY29uc3QgaW50IGMxX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdIC8gMjsKKyAgICBjb25zdCBpbnQgYzJfbGluZXNpemUgPSBpbi0+bGluZXNpemVbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gLyAyOworICAgIGNvbnN0IGludCBkMF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbIHBsYW5lICsgMCBdIC8gMjsKKyAgICBjb25zdCBpbnQgZDFfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyhwbGFuZSArIDEpICUgcy0+bmNvbXBdIC8gMjsKKyAgICBjb25zdCBpbnQgZDJfbGluZXNpemUgPSBvdXQtPmxpbmVzaXplWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdIC8gMjsKKyAgICBjb25zdCBpbnQgYzBfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbIGNvbXBvbmVudCArIDAgXTsKKyAgICBjb25zdCBpbnQgYzFfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbKGNvbXBvbmVudCArIDEpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBjMl9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMwX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyBjb21wb25lbnQgKyAwIF07CisgICAgY29uc3QgaW50IGMxX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzJfc2hpZnRfaCA9IHMtPnNoaWZ0X2hbKGNvbXBvbmVudCArIDIpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBzcmNfaCA9IGluLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHNyY193ID0gaW4tPndpZHRoOworICAgIGludCB4LCB5OworCisgICAgaWYgKHMtPm1vZGUpIHsKKyAgICAgICAgY29uc3QgaW50IGQwX3NpZ25lZF9saW5lc2l6ZSA9IGQwX2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKKyAgICAgICAgY29uc3QgaW50IGQxX3NpZ25lZF9saW5lc2l6ZSA9IGQxX2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKKyAgICAgICAgY29uc3QgaW50IGQyX3NpZ25lZF9saW5lc2l6ZSA9IGQyX2xpbmVzaXplICogKG1pcnJvciA9PSAxID8gLTEgOiAxKTsKKyAgICAgICAgdWludDE2X3QgKmQwX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0X3kgKiBkMF9saW5lc2l6ZSArIG9mZnNldF94OworICAgICAgICB1aW50MTZfdCAqZDFfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDFfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgdWludDE2X3QgKmQyX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gKyBvZmZzZXRfeSAqIGQyX2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDBfYm90dG9tX2xpbmUgPSBkMF9kYXRhICsgZDBfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOworICAgICAgICB1aW50MTZfdCAqIGNvbnN0IGQwID0gKG1pcnJvciA/IGQwX2JvdHRvbV9saW5lIDogZDBfZGF0YSk7CisgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDFfYm90dG9tX2xpbmUgPSBkMV9kYXRhICsgZDFfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOworICAgICAgICB1aW50MTZfdCAqIGNvbnN0IGQxID0gKG1pcnJvciA/IGQxX2JvdHRvbV9saW5lIDogZDFfZGF0YSk7CisgICAgICAgIHVpbnQxNl90ICogY29uc3QgZDJfYm90dG9tX2xpbmUgPSBkMl9kYXRhICsgZDJfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOworICAgICAgICB1aW50MTZfdCAqIGNvbnN0IGQyID0gKG1pcnJvciA/IGQyX2JvdHRvbV9saW5lIDogZDJfZGF0YSk7CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzcmNfdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMwID0gRkZNSU4oYzBfZGF0YVt4ID4+IGMwX3NoaWZ0X3ddLCBsaW1pdCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMxID0gYzFfZGF0YVt4ID4+IGMxX3NoaWZ0X3ddOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeCA+PiBjMl9zaGlmdF93XTsKKworICAgICAgICAgICAgICAgIHVwZGF0ZTE2KGQwICsgZDBfc2lnbmVkX2xpbmVzaXplICogYzAgKyB4LCBtYXgsIGludGVuc2l0eSwgbGltaXQpOworICAgICAgICAgICAgICAgICooZDEgKyBkMV9zaWduZWRfbGluZXNpemUgKiBjMCArIHgpID0gYzE7CisgICAgICAgICAgICAgICAgKihkMiArIGQyX3NpZ25lZF9saW5lc2l6ZSAqIGMwICsgeCkgPSBjMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjMF9zaGlmdF9oIHx8ICh5ICYgYzBfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzFfc2hpZnRfaCB8fCAoeSAmIGMxX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMyX3NoaWZ0X2ggfHwgKHkgJiBjMl9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMl9kYXRhICs9IGMyX2xpbmVzaXplOworICAgICAgICAgICAgZDBfZGF0YSArPSBkMF9saW5lc2l6ZTsKKyAgICAgICAgICAgIGQxX2RhdGEgKz0gZDFfbGluZXNpemU7CisgICAgICAgICAgICBkMl9kYXRhICs9IGQyX2xpbmVzaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDE2X3QgKmQwX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbcGxhbmVdICsgb2Zmc2V0X3kgKiBkMF9saW5lc2l6ZSArIG9mZnNldF94OworICAgICAgICB1aW50MTZfdCAqZDFfZGF0YSA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDFfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgdWludDE2X3QgKmQyX2RhdGEgPSAodWludDE2X3QgKilvdXQtPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gKyBvZmZzZXRfeSAqIGQyX2xpbmVzaXplICsgb2Zmc2V0X3g7CisKKyAgICAgICAgaWYgKG1pcnJvcikgeworICAgICAgICAgICAgZDBfZGF0YSArPSBzLT5zaXplIC0gMTsKKyAgICAgICAgICAgIGQxX2RhdGEgKz0gcy0+c2l6ZSAtIDE7CisgICAgICAgICAgICBkMl9kYXRhICs9IHMtPnNpemUgLSAxOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzcmNfdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMwID0gRkZNSU4oYzBfZGF0YVt4ID4+IGMwX3NoaWZ0X3ddLCBsaW1pdCk7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMxID0gYzFfZGF0YVt4ID4+IGMxX3NoaWZ0X3ddOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeCA+PiBjMl9zaGlmdF93XTsKKworICAgICAgICAgICAgICAgIGlmIChtaXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlMTYoZDBfZGF0YSAtIGMwLCBtYXgsIGludGVuc2l0eSwgbGltaXQpOworICAgICAgICAgICAgICAgICAgICAqKGQxX2RhdGEgLSBjMCkgPSBjMTsKKyAgICAgICAgICAgICAgICAgICAgKihkMl9kYXRhIC0gYzApID0gYzI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlMTYoZDBfZGF0YSArIGMwLCBtYXgsIGludGVuc2l0eSwgbGltaXQpOworICAgICAgICAgICAgICAgICAgICAqKGQxX2RhdGEgKyBjMCkgPSBjMTsKKyAgICAgICAgICAgICAgICAgICAgKihkMl9kYXRhICsgYzApID0gYzI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWMwX3NoaWZ0X2ggfHwgKHkgJiBjMF9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMF9kYXRhICs9IGMwX2xpbmVzaXplOworICAgICAgICAgICAgaWYgKCFjMV9zaGlmdF9oIHx8ICh5ICYgYzFfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzFfZGF0YSArPSBjMV9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzJfc2hpZnRfaCB8fCAoeSAmIGMyX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMyX2RhdGEgKz0gYzJfbGluZXNpemU7CisgICAgICAgICAgICBkMF9kYXRhICs9IGQwX2xpbmVzaXplOworICAgICAgICAgICAgZDFfZGF0YSArPSBkMV9saW5lc2l6ZTsKKyAgICAgICAgICAgIGQyX2RhdGEgKz0gZDJfbGluZXNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnZlbG9wZTE2KHMsIG91dCwgcGxhbmUsIHBsYW5lLCBjb2x1bW4gPyBvZmZzZXRfeCA6IG9mZnNldF95KTsKK30KKworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBhY29sb3IoV2F2ZWZvcm1Db250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqaW4sIEFWRnJhbWUgKm91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQsIGludCBpbnRlbnNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0X3ksIGludCBvZmZzZXRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2x1bW4sIGludCBtaXJyb3IpCit7CisgICAgY29uc3QgaW50IHBsYW5lID0gcy0+ZGVzYy0+Y29tcFtjb21wb25lbnRdLnBsYW5lOworICAgIGNvbnN0IHVpbnQ4X3QgKmMwX2RhdGEgPSBpbi0+ZGF0YVtwbGFuZSArIDBdOworICAgIGNvbnN0IHVpbnQ4X3QgKmMxX2RhdGEgPSBpbi0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCB1aW50OF90ICpjMl9kYXRhID0gaW4tPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMwX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyBwbGFuZSArIDAgXTsKKyAgICBjb25zdCBpbnQgYzFfbGluZXNpemUgPSBpbi0+bGluZXNpemVbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMyX2xpbmVzaXplID0gaW4tPmxpbmVzaXplWyhwbGFuZSArIDIpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBkMF9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbIHBsYW5lICsgMCBdOworICAgIGNvbnN0IGludCBkMV9saW5lc2l6ZSA9IG91dC0+bGluZXNpemVbKHBsYW5lICsgMSkgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGQyX2xpbmVzaXplID0gb3V0LT5saW5lc2l6ZVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzBfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbIGNvbXBvbmVudCArIDAgXTsKKyAgICBjb25zdCBpbnQgYzFfc2hpZnRfdyA9IHMtPnNoaWZ0X3dbKGNvbXBvbmVudCArIDEpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBjMl9zaGlmdF93ID0gcy0+c2hpZnRfd1soY29tcG9uZW50ICsgMikgJSBzLT5uY29tcF07CisgICAgY29uc3QgaW50IGMwX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyBjb21wb25lbnQgKyAwIF07CisgICAgY29uc3QgaW50IGMxX3NoaWZ0X2ggPSBzLT5zaGlmdF9oWyhjb21wb25lbnQgKyAxKSAlIHMtPm5jb21wXTsKKyAgICBjb25zdCBpbnQgYzJfc2hpZnRfaCA9IHMtPnNoaWZ0X2hbKGNvbXBvbmVudCArIDIpICUgcy0+bmNvbXBdOworICAgIGNvbnN0IGludCBtYXggPSAyNTUgLSBpbnRlbnNpdHk7CisgICAgY29uc3QgaW50IHNyY19oID0gaW4tPmhlaWdodDsKKyAgICBjb25zdCBpbnQgc3JjX3cgPSBpbi0+d2lkdGg7CisgICAgaW50IHgsIHk7CisKKyAgICBpZiAocy0+bW9kZSkgeworICAgICAgICBjb25zdCBpbnQgZDBfc2lnbmVkX2xpbmVzaXplID0gZDBfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOworICAgICAgICBjb25zdCBpbnQgZDFfc2lnbmVkX2xpbmVzaXplID0gZDFfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOworICAgICAgICBjb25zdCBpbnQgZDJfc2lnbmVkX2xpbmVzaXplID0gZDJfbGluZXNpemUgKiAobWlycm9yID09IDEgPyAtMSA6IDEpOworICAgICAgICB1aW50OF90ICpkMF9kYXRhID0gb3V0LT5kYXRhW3BsYW5lXSArIG9mZnNldF95ICogZDBfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgdWludDhfdCAqZDFfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAxKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDFfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgdWludDhfdCAqZDJfZGF0YSA9IG91dC0+ZGF0YVsocGxhbmUgKyAyKSAlIHMtPm5jb21wXSArIG9mZnNldF95ICogZDJfbGluZXNpemUgKyBvZmZzZXRfeDsKKyAgICAgICAgdWludDhfdCAqIGNvbnN0IGQwX2JvdHRvbV9saW5lID0gZDBfZGF0YSArIGQwX2xpbmVzaXplICogKHMtPnNpemUgLSAxKTsKKyAgICAgICAgdWludDhfdCAqIGNvbnN0IGQwID0gKG1pcnJvciA/IGQwX2JvdHRvbV9saW5lIDogZDBfZGF0YSk7CisgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkMV9ib3R0b21fbGluZSA9IGQxX2RhdGEgKyBkMV9saW5lc2l6ZSAqIChzLT5zaXplIC0gMSk7CisgICAgICAgIHVpbnQ4X3QgKiBjb25zdCBkMSA9IChtaXJyb3IgPyBkMV9ib3R0b21fbGluZSA6IGQxX2RhdGEpOworICAgICAgICB1aW50OF90ICogY29uc3QgZDJfYm90dG9tX2xpbmUgPSBkMl9kYXRhICsgZDJfbGluZXNpemUgKiAocy0+c2l6ZSAtIDEpOworICAgICAgICB1aW50OF90ICogY29uc3QgZDIgPSAobWlycm9yID8gZDJfYm90dG9tX2xpbmUgOiBkMl9kYXRhKTsKKworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgc3JjX2g7IHkrKykgeworICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHNyY193OyB4KyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzAgPSBjMF9kYXRhW3ggPj4gYzBfc2hpZnRfd107CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMxID0gYzFfZGF0YVt4ID4+IGMxX3NoaWZ0X3ddOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMiA9IGMyX2RhdGFbeCA+PiBjMl9zaGlmdF93XTsKKworICAgICAgICAgICAgICAgIHVwZGF0ZShkMCArIGQwX3NpZ25lZF9saW5lc2l6ZSAqIGMwICsgeCwgbWF4LCBpbnRlbnNpdHkpOworICAgICAgICAgICAgICAgICooZDEgKyBkMV9zaWduZWRfbGluZXNpemUgKiBjMCArIHgpID0gYzE7CisgICAgICAgICAgICAgICAgKihkMiArIGQyX3NpZ25lZF9saW5lc2l6ZSAqIGMwICsgeCkgPSBjMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjMF9zaGlmdF9oIHx8ICh5ICYgYzBfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzFfc2hpZnRfaCB8fCAoeSAmIGMxX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMyX3NoaWZ0X2ggfHwgKHkgJiBjMl9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMl9kYXRhICs9IGMyX2xpbmVzaXplOworICAgICAgICAgICAgZDBfZGF0YSArPSBkMF9saW5lc2l6ZTsKKyAgICAgICAgICAgIGQxX2RhdGEgKz0gZDFfbGluZXNpemU7CisgICAgICAgICAgICBkMl9kYXRhICs9IGQyX2xpbmVzaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCAqZDBfZGF0YSA9IG91dC0+ZGF0YVtwbGFuZV0gKyBvZmZzZXRfeSAqIGQwX2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgICAgIHVpbnQ4X3QgKmQxX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMSkgJSBzLT5uY29tcF0gKyBvZmZzZXRfeSAqIGQxX2xpbmVzaXplICsgb2Zmc2V0X3g7CisgICAgICAgIHVpbnQ4X3QgKmQyX2RhdGEgPSBvdXQtPmRhdGFbKHBsYW5lICsgMikgJSBzLT5uY29tcF0gKyBvZmZzZXRfeSAqIGQyX2xpbmVzaXplICsgb2Zmc2V0X3g7CisKKyAgICAgICAgaWYgKG1pcnJvcikgeworICAgICAgICAgICAgZDBfZGF0YSArPSBzLT5zaXplIC0gMTsKKyAgICAgICAgICAgIGQxX2RhdGEgKz0gcy0+c2l6ZSAtIDE7CisgICAgICAgICAgICBkMl9kYXRhICs9IHMtPnNpemUgLSAxOworICAgICAgICB9CisKKyAgICAgICAgZm9yICh5ID0gMDsgeSA8IHNyY19oOyB5KyspIHsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzcmNfdzsgeCsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50IGMwID0gYzBfZGF0YVt4ID4+IGMwX3NoaWZ0X3ddOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjMSA9IGMxX2RhdGFbeCA+PiBjMV9zaGlmdF93XTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgYzIgPSBjMl9kYXRhW3ggPj4gYzJfc2hpZnRfd107CisKKyAgICAgICAgICAgICAgICBpZiAobWlycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShkMF9kYXRhIC0gYzAsIG1heCwgaW50ZW5zaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgKihkMV9kYXRhIC0gYzApID0gYzE7CisgICAgICAgICAgICAgICAgICAgICooZDJfZGF0YSAtIGMwKSA9IGMyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZShkMF9kYXRhICsgYzAsIG1heCwgaW50ZW5zaXR5KTsKKyAgICAgICAgICAgICAgICAgICAgKihkMV9kYXRhICsgYzApID0gYzE7CisgICAgICAgICAgICAgICAgICAgICooZDJfZGF0YSArIGMwKSA9IGMyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjMF9zaGlmdF9oIHx8ICh5ICYgYzBfc2hpZnRfaCkpCisgICAgICAgICAgICAgICAgYzBfZGF0YSArPSBjMF9saW5lc2l6ZTsKKyAgICAgICAgICAgIGlmICghYzFfc2hpZnRfaCB8fCAoeSAmIGMxX3NoaWZ0X2gpKQorICAgICAgICAgICAgICAgIGMxX2RhdGEgKz0gYzFfbGluZXNpemU7CisgICAgICAgICAgICBpZiAoIWMyX3NoaWZ0X2ggfHwgKHkgJiBjMl9zaGlmdF9oKSkKKyAgICAgICAgICAgICAgICBjMl9kYXRhICs9IGMyX2xpbmVzaXplOworICAgICAgICAgICAgZDBfZGF0YSArPSBkMF9saW5lc2l6ZTsKKyAgICAgICAgICAgIGQxX2RhdGEgKz0gZDFfbGluZXNpemU7CisgICAgICAgICAgICBkMl9kYXRhICs9IGQyX2xpbmVzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgZW52ZWxvcGUocywgb3V0LCBwbGFuZSwgcGxhbmUsIGNvbHVtbiA/IG9mZnNldF94IDogb2Zmc2V0X3kpOwogfQogCiBzdGF0aWMgY29uc3QgdWludDhfdCBibGFja195dXZhX2NvbG9yWzRdID0geyAwLCAxMjcsIDEyNywgMjU1IH07CiBzdGF0aWMgY29uc3QgdWludDhfdCBibGFja19nYnJwX2NvbG9yWzRdID0geyAwLCAwLCAwLCAyNTUgfTsKIAorc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGFmbGF0X2RpZ2l0YWw4W10gPSB7CisgICAgeyB7IHsgICIxNiIsICAxNisxMjggfSwgeyAgIjE2IiwgIDE2KzEyOCB9LCB7ICAiMTYiLCAgMTYrMTI4IH0sIHsgICAiMCIsICAgMCsxMjggfSB9IH0sCisgICAgeyB7IHsgIjEyOCIsIDEyOCsxMjggfSwgeyAiMTI4IiwgMTI4KzEyOCB9LCB7ICIxMjgiLCAxMjgrMTI4IH0sIHsgIjEyOCIsIDEyOCsxMjggfSB9IH0sCisgICAgeyB7IHsgIjIzNSIsIDIzNSsxMjggfSwgeyAiMjQwIiwgMjQwKzEyOCB9LCB7ICIyNDAiLCAyNDArMTI4IH0sIHsgIjI1NSIsIDI1NSsxMjggfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgYWZsYXRfZGlnaXRhbDlbXSA9IHsKKyAgICB7IHsgeyAgIjMyIiwgIDMyKzI1NiB9LCB7ICAiMzIiLCAgMzIrMjU2IH0sIHsgICIzMiIsICAzMisyNTYgfSwgeyAgICIwIiwgICAwKzI1NiB9IH0gfSwKKyAgICB7IHsgeyAiMjU2IiwgMjU2KzI1NiB9LCB7ICIyNTYiLCAyNTYrMjU2IH0sIHsgIjI1NiIsIDI1NisyNTYgfSwgeyAiMjU2IiwgMjU2KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAiNDcwIiwgNDcwKzI1NiB9LCB7ICI0ODAiLCA0ODArMjU2IH0sIHsgIjQ4MCIsIDQ4MCsyNTYgfSwgeyAiNTExIiwgNTExKzI1NiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBhZmxhdF9kaWdpdGFsMTBbXSA9IHsKKyAgICB7IHsgeyAgIjY0IiwgIDY0KzUxMiB9LCB7ICAiNjQiLCAgNjQrNTEyIH0sIHsgICI2NCIsICA2NCs1MTIgfSwgeyAgICAiMCIsICAgIDArNTEyIH0gfSB9LAorICAgIHsgeyB7ICI1MTIiLCA1MTIrNTEyIH0sIHsgIjUxMiIsIDUxMis1MTIgfSwgeyAiNTEyIiwgNTEyKzUxMiB9LCB7ICAiNTEyIiwgIDUxMis1MTIgfSB9IH0sCisgICAgeyB7IHsgIjk0MCIsIDk0MCs1MTIgfSwgeyAiOTYwIiwgOTYwKzUxMiB9LCB7ICI5NjAiLCA5NjArNTEyIH0sIHsgIjEwMjMiLCAxMDIzKzUxMiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBhZmxhdF9kaWdpdGFsMTJbXSA9IHsKKyAgICB7IHsgeyAgIjI1NiIsICAyNTYrMjA0OCB9LCB7ICAiMjU2IiwgIDI1NisyMDQ4IH0sIHsgICIyNTYiLCAgMjU2KzIwNDggfSwgeyAgICAiMCIsICAgIDArMjA0OCB9IH0gfSwKKyAgICB7IHsgeyAiMjA0OCIsIDIwNDgrMjA0OCB9LCB7ICIyMDQ4IiwgMjA0OCsyMDQ4IH0sIHsgIjIwNDgiLCAyMDQ4KzIwNDggfSwgeyAiMjA0OCIsIDIwNDgrMjA0OCB9IH0gfSwKKyAgICB7IHsgeyAiMzc2MCIsIDM3NjArMjA0OCB9LCB7ICIzODQwIiwgMzg0MCsyMDQ4IH0sIHsgIjM4NDAiLCAzODQwKzIwNDggfSwgeyAiNDA5NSIsIDQwOTUrMjA0OCB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBhZmxhdF9taWxsaXZvbHRzOFtdID0geworICAgIHsgeyB7ICAgIjAiLCAgMTYrMTI4IH0sIHsgICAiMCIsICAxNisxMjggfSwgeyAgICIwIiwgIDE2KzEyOCB9LCB7ICAgIjAiLCAgIDArMTI4IH0gfSB9LAorICAgIHsgeyB7ICIxNzUiLCAgNzErMTI4IH0sIHsgIjE3NSIsICA3MisxMjggfSwgeyAiMTc1IiwgIDcyKzEyOCB9LCB7ICIxNzUiLCAgNjQrMTI4IH0gfSB9LAorICAgIHsgeyB7ICIzNTAiLCAxMjYrMTI4IH0sIHsgIjM1MCIsIDEyOCsxMjggfSwgeyAiMzUwIiwgMTI4KzEyOCB9LCB7ICIzNTAiLCAxMjgrMTI4IH0gfSB9LAorICAgIHsgeyB7ICI1MjUiLCAxODArMTI4IH0sIHsgIjUyNSIsIDE4NCsxMjggfSwgeyAiNTI1IiwgMTg0KzEyOCB9LCB7ICI1MjUiLCAxOTIrMTI4IH0gfSB9LAorICAgIHsgeyB7ICI3MDAiLCAyMzUrMTI4IH0sIHsgIjcwMCIsIDI0MCsxMjggfSwgeyAiNzAwIiwgMjQwKzEyOCB9LCB7ICI3MDAiLCAyNTUrMTI4IH0gfSB9LAorfTsKKworc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGFmbGF0X21pbGxpdm9sdHM5W10gPSB7CisgICAgeyB7IHsgICAiMCIsICAzMisyNTYgfSwgeyAgICIwIiwgIDMyKzI1NiB9LCB7ICAgIjAiLCAgMzIrMjU2IH0sIHsgICAiMCIsICAgMCsyNTYgfSB9IH0sCisgICAgeyB7IHsgIjE3NSIsIDE0MisyNTYgfSwgeyAiMTc1IiwgMTQ0KzI1NiB9LCB7ICIxNzUiLCAxNDQrMjU2IH0sIHsgIjE3NSIsIDEyOCsyNTYgfSB9IH0sCisgICAgeyB7IHsgIjM1MCIsIDI1MSsyNTYgfSwgeyAiMzUwIiwgMjU2KzI1NiB9LCB7ICIzNTAiLCAyNTYrMjU2IH0sIHsgIjM1MCIsIDI1NisyNTYgfSB9IH0sCisgICAgeyB7IHsgIjUyNSIsIDM2MSsyNTYgfSwgeyAiNTI1IiwgMzY4KzI1NiB9LCB7ICI1MjUiLCAzNjgrMjU2IH0sIHsgIjUyNSIsIDM4NCsyNTYgfSB9IH0sCisgICAgeyB7IHsgIjcwMCIsIDQ3MCsyNTYgfSwgeyAiNzAwIiwgNDgwKzI1NiB9LCB7ICI3MDAiLCA0ODArMjU2IH0sIHsgIjcwMCIsIDUxMSsyNTYgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgYWZsYXRfbWlsbGl2b2x0czEwW10gPSB7CisgICAgeyB7IHsgICAiMCIsICA2NCs1MTIgfSwgeyAgICIwIiwgIDY0KzUxMiB9LCB7ICAgIjAiLCAgNjQrNTEyIH0sIHsgICAiMCIsICAgIDArNTEyIH0gfSB9LAorICAgIHsgeyB7ICIxNzUiLCAyODMrNTEyIH0sIHsgIjE3NSIsIDI4OCs1MTIgfSwgeyAiMTc1IiwgMjg4KzUxMiB9LCB7ICIxNzUiLCAgMjU2KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiMzUwIiwgNTAyKzUxMiB9LCB7ICIzNTAiLCA1MTIrNTEyIH0sIHsgIjM1MCIsIDUxMis1MTIgfSwgeyAiMzUwIiwgIDUxMis1MTIgfSB9IH0sCisgICAgeyB7IHsgIjUyNSIsIDcyMSs1MTIgfSwgeyAiNTI1IiwgNzM2KzUxMiB9LCB7ICI1MjUiLCA3MzYrNTEyIH0sIHsgIjUyNSIsICA3NjgrNTEyIH0gfSB9LAorICAgIHsgeyB7ICI3MDAiLCA5NDArNTEyIH0sIHsgIjcwMCIsIDk2MCs1MTIgfSwgeyAiNzAwIiwgOTYwKzUxMiB9LCB7ICI3MDAiLCAxMDIzKzUxMiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBhZmxhdF9taWxsaXZvbHRzMTJbXSA9IHsKKyAgICB7IHsgeyAgICIwIiwgIDI1NisyMDQ4IH0sIHsgICAiMCIsICAyNTYrMjA0OCB9LCB7ICAgIjAiLCAgMjU2KzIwNDggfSwgeyAgICIwIiwgICAgMCsyMDQ4IH0gfSB9LAorICAgIHsgeyB7ICIxNzUiLCAxMTMyKzIwNDggfSwgeyAiMTc1IiwgMTE1MisyMDQ4IH0sIHsgIjE3NSIsIDExNTIrMjA0OCB9LCB7ICIxNzUiLCAxMDI0KzIwNDggfSB9IH0sCisgICAgeyB7IHsgIjM1MCIsIDIwMDgrMjA0OCB9LCB7ICIzNTAiLCAyMDQ4KzIwNDggfSwgeyAiMzUwIiwgMjA0OCsyMDQ4IH0sIHsgIjM1MCIsIDIwNDgrMjA0OCB9IH0gfSwKKyAgICB7IHsgeyAiNTI1IiwgMjg4NCsyMDQ4IH0sIHsgIjUyNSIsIDI5NDQrMjA0OCB9LCB7ICI1MjUiLCAyOTQ0KzIwNDggfSwgeyAiNTI1IiwgMzA3MisyMDQ4IH0gfSB9LAorICAgIHsgeyB7ICI3MDAiLCAzNzYwKzIwNDggfSwgeyAiNzAwIiwgMzg0MCsyMDQ4IH0sIHsgIjcwMCIsIDM4NDArMjA0OCB9LCB7ICI3MDAiLCA0MDk1KzIwNDggfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgYWZsYXRfaXJlOFtdID0geworICAgIHsgeyB7ICItMjUiLCAtMzkrMTI4IH0sIHsgIi0yNSIsIC00MCsxMjggfSwgeyAiLTI1IiwgLTQwKzEyOCB9LCB7ICItMjUiLCAtNjQrMTI4IH0gfSB9LAorICAgIHsgeyB7ICAgIjAiLCAgMTYrMTI4IH0sIHsgICAiMCIsICAxNisxMjggfSwgeyAgICIwIiwgIDE2KzEyOCB9LCB7ICAgIjAiLCAgIDArMTI4IH0gfSB9LAorICAgIHsgeyB7ICAiMjUiLCAgNzErMTI4IH0sIHsgICIyNSIsICA3MisxMjggfSwgeyAgIjI1IiwgIDcyKzEyOCB9LCB7ICAiMjUiLCAgNjQrMTI4IH0gfSB9LAorICAgIHsgeyB7ICAiNTAiLCAxMjYrMTI4IH0sIHsgICI1MCIsIDEyOCsxMjggfSwgeyAgIjUwIiwgMTI4KzEyOCB9LCB7ICAiNTAiLCAxMjgrMTI4IH0gfSB9LAorICAgIHsgeyB7ICAiNzUiLCAxODArMTI4IH0sIHsgICI3NSIsIDE4NCsxMjggfSwgeyAgIjc1IiwgMTg0KzEyOCB9LCB7ICAiNzUiLCAxOTIrMTI4IH0gfSB9LAorICAgIHsgeyB7ICIxMDAiLCAyMzUrMTI4IH0sIHsgIjEwMCIsIDI0MCsxMjggfSwgeyAiMTAwIiwgMjQwKzEyOCB9LCB7ICIxMDAiLCAyNTYrMTI4IH0gfSB9LAorICAgIHsgeyB7ICIxMjUiLCAyOTArMTI4IH0sIHsgIjEyNSIsIDI5NisxMjggfSwgeyAiMTI1IiwgMjk2KzEyOCB9LCB7ICIxMjUiLCAzMjArMTI4IH0gfSB9LAorfTsKKworc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGFmbGF0X2lyZTlbXSA9IHsKKyAgICB7IHsgeyAiLTI1IiwgLTc4KzI1NiB9LCB7ICItMjUiLCAtODArMjU2IH0sIHsgIi0yNSIsIC04MCsyNTYgfSwgeyAiLTI1IiwtMTI4KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAgICIwIiwgIDMyKzI1NiB9LCB7ICAgIjAiLCAgMzIrMjU2IH0sIHsgICAiMCIsICAzMisyNTYgfSwgeyAgICIwIiwgICAwKzI1NiB9IH0gfSwKKyAgICB7IHsgeyAgIjI1IiwgMTQyKzI1NiB9LCB7ICAiMjUiLCAxNDQrMjU2IH0sIHsgICIyNSIsIDE0NCsyNTYgfSwgeyAgIjI1IiwgMTI4KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAgIjUwIiwgMjUxKzI1NiB9LCB7ICAiNTAiLCAyNTYrMjU2IH0sIHsgICI1MCIsIDI1NisyNTYgfSwgeyAgIjUwIiwgMjU2KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAgIjc1IiwgMzYxKzI1NiB9LCB7ICAiNzUiLCAzNjgrMjU2IH0sIHsgICI3NSIsIDM2OCsyNTYgfSwgeyAgIjc1IiwgMzg0KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAiMTAwIiwgNDcwKzI1NiB9LCB7ICIxMDAiLCA0ODArMjU2IH0sIHsgIjEwMCIsIDQ4MCsyNTYgfSwgeyAiMTAwIiwgNTEyKzI1NiB9IH0gfSwKKyAgICB7IHsgeyAiMTI1IiwgNTgwKzI1NiB9LCB7ICIxMjUiLCA1OTIrMjU2IH0sIHsgIjEyNSIsIDU5MisyNTYgfSwgeyAiMTI1IiwgNjQwKzI1NiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBhZmxhdF9pcmUxMFtdID0geworICAgIHsgeyB7ICItMjUiLC0xNTYrNTEyIH0sIHsgIi0yNSIsLTE2MCs1MTIgfSwgeyAiLTI1IiwtMTYwKzUxMiB9LCB7ICItMjUiLCAtMjU2KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAgICIwIiwgIDY0KzUxMiB9LCB7ICAgIjAiLCAgNjQrNTEyIH0sIHsgICIwIiwgICA2NCs1MTIgfSwgeyAgICIwIiwgICAgMCs1MTIgfSB9IH0sCisgICAgeyB7IHsgICIyNSIsIDI4Mys1MTIgfSwgeyAgIjI1IiwgMjg4KzUxMiB9LCB7ICAiMjUiLCAyODgrNTEyIH0sIHsgICIyNSIsICAyNTYrNTEyIH0gfSB9LAorICAgIHsgeyB7ICAiNTAiLCA1MDIrNTEyIH0sIHsgICI1MCIsIDUxMis1MTIgfSwgeyAgIjUwIiwgNTEyKzUxMiB9LCB7ICAiNTAiLCAgNTEyKzUxMiB9IH0gfSwKKyAgICB7IHsgeyAgIjc1IiwgNzIxKzUxMiB9LCB7ICAiNzUiLCA3MzYrNTEyIH0sIHsgICI3NSIsIDczNis1MTIgfSwgeyAgIjc1IiwgIDc2OCs1MTIgfSB9IH0sCisgICAgeyB7IHsgIjEwMCIsIDk0MCs1MTIgfSwgeyAiMTAwIiwgOTYwKzUxMiB9LCB7ICIxMDAiLCA5NjArNTEyIH0sIHsgIjEwMCIsIDEwMjQrNTEyIH0gfSB9LAorICAgIHsgeyB7ICIxMjUiLDExNjArNTEyIH0sIHsgIjEyNSIsMTE4NCs1MTIgfSwgeyAiMTI1IiwxMTg0KzUxMiB9LCB7ICIxMjUiLCAxMjgwKzUxMiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBhZmxhdF9pcmUxMltdID0geworICAgIHsgeyB7ICItMjUiLCAtNjI0KzIwNDggfSwgeyAiLTI1IiwgLTY0MCsyMDQ4IH0sIHsgIi0yNSIsIC02NDArMjA0OCB9LCB7ICItMjUiLC0xMDI0KzIwNDggfSB9IH0sCisgICAgeyB7IHsgICAiMCIsICAyNTYrMjA0OCB9LCB7ICAgIjAiLCAgMjU2KzIwNDggfSwgeyAgICIwIiwgIDI1NisyMDQ4IH0sIHsgICAiMCIsICAgIDArMjA0OCB9IH0gfSwKKyAgICB7IHsgeyAgIjI1IiwgMTEzMisyMDQ4IH0sIHsgICIyNSIsIDExNTIrMjA0OCB9LCB7ICAiMjUiLCAxMTUyKzIwNDggfSwgeyAgIjI1IiwgMTAyNCsyMDQ4IH0gfSB9LAorICAgIHsgeyB7ICAiNTAiLCAyMDA4KzIwNDggfSwgeyAgIjUwIiwgMjA0OCsyMDQ4IH0sIHsgICI1MCIsIDIwNDgrMjA0OCB9LCB7ICAiNTAiLCAyMDQ4KzIwNDggfSB9IH0sCisgICAgeyB7IHsgICI3NSIsIDI4ODQrMjA0OCB9LCB7ICAiNzUiLCAyOTQ0KzIwNDggfSwgeyAgIjc1IiwgMjk0NCsyMDQ4IH0sIHsgICI3NSIsIDMwNzIrMjA0OCB9IH0gfSwKKyAgICB7IHsgeyAiMTAwIiwgMzc2MCsyMDQ4IH0sIHsgIjEwMCIsIDM4NDArMjA0OCB9LCB7ICIxMDAiLCAzODQwKzIwNDggfSwgeyAiMTAwIiwgNDA5NisyMDQ4IH0gfSB9LAorICAgIHsgeyB7ICIxMjUiLCA0NjQwKzIwNDggfSwgeyAiMTI1IiwgNDczNisyMDQ4IH0sIHsgIjEyNSIsIDQ3MzYrMjA0OCB9LCB7ICIxMjUiLCA1MTIwKzIwNDggfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgZmxhdF9kaWdpdGFsOFtdID0geworICAgIHsgeyB7ICAiMTYiLCAgMTYrMjU2IH0sIHsgICIxNiIsICAxNisyNTYgfSwgeyAgIjE2IiwgIDE2KzI1NiB9LCB7ICAgIjAiLCAgIDArMjU2IH0gfSB9LAorICAgIHsgeyB7ICIxMjgiLCAxMjgrMjU2IH0sIHsgIjEyOCIsIDEyOCsyNTYgfSwgeyAiMTI4IiwgMTI4KzI1NiB9LCB7ICIxMjgiLCAxMjgrMjU2IH0gfSB9LAorICAgIHsgeyB7ICIyMzUiLCAyMzUrMjU2IH0sIHsgIjI0MCIsIDI0MCsyNTYgfSwgeyAiMjQwIiwgMjQwKzI1NiB9LCB7ICIyNTUiLCAyNTUrMjU2IH0gfSB9LAorfTsKKworc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGZsYXRfZGlnaXRhbDlbXSA9IHsKKyAgICB7IHsgeyAgIjMyIiwgIDMyKzUxMiB9LCB7ICAiMzIiLCAgMzIrNTEyIH0sIHsgICIzMiIsICAzMis1MTIgfSwgeyAgICIwIiwgICAwKzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiMjU2IiwgMjU2KzUxMiB9LCB7ICIyNTYiLCAyNTYrNTEyIH0sIHsgIjI1NiIsIDI1Nis1MTIgfSwgeyAiMjU2IiwgMjU2KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiNDcwIiwgNDcwKzUxMiB9LCB7ICI0ODAiLCA0ODArNTEyIH0sIHsgIjQ4MCIsIDQ4MCs1MTIgfSwgeyAiNTExIiwgNTExKzUxMiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBmbGF0X2RpZ2l0YWwxMFtdID0geworICAgIHsgeyB7ICAiNjQiLCAgNjQrMTAyNCB9LCB7ICAiNjQiLCAgNjQrMTAyNCB9LCB7ICAiNjQiLCAgNjQrMTAyNCB9LCB7ICAgICIwIiwgICAgMCsxMDI0IH0gfSB9LAorICAgIHsgeyB7ICI1MTIiLCA1MTIrMTAyNCB9LCB7ICI1MTIiLCA1MTIrMTAyNCB9LCB7ICI1MTIiLCA1MTIrMTAyNCB9LCB7ICAiNTEyIiwgIDUxMisxMDI0IH0gfSB9LAorICAgIHsgeyB7ICI5NDAiLCA5NDArMTAyNCB9LCB7ICI5NjAiLCA5NjArMTAyNCB9LCB7ICI5NjAiLCA5NjArMTAyNCB9LCB7ICIxMDIzIiwgMTAyMysxMDI0IH0gfSB9LAorfTsKKworc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGZsYXRfZGlnaXRhbDEyW10gPSB7CisgICAgeyB7IHsgICIyNTYiLCAgMjU2KzQwOTYgfSwgeyAgIjI1NiIsICAyNTYrNDA5NiB9LCB7ICAiMjU2IiwgIDI1Nis0MDk2IH0sIHsgICAgIjAiLCAgICAwKzQwOTYgfSB9IH0sCisgICAgeyB7IHsgIjIwNDgiLCAyMDQ4KzQwOTYgfSwgeyAiMjA0OCIsIDIwNDgrNDA5NiB9LCB7ICIyMDQ4IiwgMjA0OCs0MDk2IH0sIHsgIjIwNDgiLCAyMDQ4KzQwOTYgfSB9IH0sCisgICAgeyB7IHsgIjM3NjAiLCAzNzYwKzQwOTYgfSwgeyAiMzg0MCIsIDM4NDArNDA5NiB9LCB7ICIzODQwIiwgMzg0MCs0MDk2IH0sIHsgIjQwOTUiLCA0MDk1KzQwOTYgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgZmxhdF9taWxsaXZvbHRzOFtdID0geworICAgIHsgeyB7ICAgIjAiLCAgMTYrMjU2IH0sIHsgICAiMCIsICAxNisyNTYgfSwgeyAgICIwIiwgIDE2KzI1NiB9LCB7ICAgIjAiLCAgIDArMjU2IH0gfSB9LAorICAgIHsgeyB7ICIxNzUiLCAgNzErMjU2IH0sIHsgIjE3NSIsICA3MisyNTYgfSwgeyAiMTc1IiwgIDcyKzI1NiB9LCB7ICIxNzUiLCAgNjQrMjU2IH0gfSB9LAorICAgIHsgeyB7ICIzNTAiLCAxMjYrMjU2IH0sIHsgIjM1MCIsIDEyOCsyNTYgfSwgeyAiMzUwIiwgMTI4KzI1NiB9LCB7ICIzNTAiLCAxMjgrMjU2IH0gfSB9LAorICAgIHsgeyB7ICI1MjUiLCAxODArMjU2IH0sIHsgIjUyNSIsIDE4NCsyNTYgfSwgeyAiNTI1IiwgMTg0KzI1NiB9LCB7ICI1MjUiLCAxOTIrMjU2IH0gfSB9LAorICAgIHsgeyB7ICI3MDAiLCAyMzUrMjU2IH0sIHsgIjcwMCIsIDI0MCsyNTYgfSwgeyAiNzAwIiwgMjQwKzI1NiB9LCB7ICI3MDAiLCAyNTUrMjU2IH0gfSB9LAorfTsKKworc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGZsYXRfbWlsbGl2b2x0czlbXSA9IHsKKyAgICB7IHsgeyAgICIwIiwgIDMyKzUxMiB9LCB7ICAgIjAiLCAgMzIrNTEyIH0sIHsgICAiMCIsICAzMis1MTIgfSwgeyAgICIwIiwgICAwKzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiMTc1IiwgMTQyKzUxMiB9LCB7ICIxNzUiLCAxNDQrNTEyIH0sIHsgIjE3NSIsIDE0NCs1MTIgfSwgeyAiMTc1IiwgMTI4KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiMzUwIiwgMjUxKzUxMiB9LCB7ICIzNTAiLCAyNTYrNTEyIH0sIHsgIjM1MCIsIDI1Nis1MTIgfSwgeyAiMzUwIiwgMjU2KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiNTI1IiwgMzYxKzUxMiB9LCB7ICI1MjUiLCAzNjgrNTEyIH0sIHsgIjUyNSIsIDM2OCs1MTIgfSwgeyAiNTI1IiwgMzg0KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiNzAwIiwgNDcwKzUxMiB9LCB7ICI3MDAiLCA0ODArNTEyIH0sIHsgIjcwMCIsIDQ4MCs1MTIgfSwgeyAiNzAwIiwgNTExKzUxMiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBmbGF0X21pbGxpdm9sdHMxMFtdID0geworICAgIHsgeyB7ICAgIjAiLCAgNjQrMTAyNCB9LCB7ICAgIjAiLCAgNjQrMTAyNCB9LCB7ICAgIjAiLCAgNjQrMTAyNCB9LCB7ICAgIjAiLCAgICAwKzEwMjQgfSB9IH0sCisgICAgeyB7IHsgIjE3NSIsIDI4MysxMDI0IH0sIHsgIjE3NSIsIDI4OCsxMDI0IH0sIHsgIjE3NSIsIDI4OCsxMDI0IH0sIHsgIjE3NSIsICAyNTYrMTAyNCB9IH0gfSwKKyAgICB7IHsgeyAiMzUwIiwgNTAyKzEwMjQgfSwgeyAiMzUwIiwgNTEyKzEwMjQgfSwgeyAiMzUwIiwgNTEyKzEwMjQgfSwgeyAiMzUwIiwgIDUxMisxMDI0IH0gfSB9LAorICAgIHsgeyB7ICI1MjUiLCA3MjErMTAyNCB9LCB7ICI1MjUiLCA3MzYrMTAyNCB9LCB7ICI1MjUiLCA3MzYrMTAyNCB9LCB7ICI1MjUiLCAgNzY4KzEwMjQgfSB9IH0sCisgICAgeyB7IHsgIjcwMCIsIDk0MCsxMDI0IH0sIHsgIjcwMCIsIDk2MCsxMDI0IH0sIHsgIjcwMCIsIDk2MCsxMDI0IH0sIHsgIjcwMCIsIDEwMjMrMTAyNCB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBmbGF0X21pbGxpdm9sdHMxMltdID0geworICAgIHsgeyB7ICAgIjAiLCAgMjU2KzQwOTYgfSwgeyAgICIwIiwgIDI1Nis0MDk2IH0sIHsgICAiMCIsICAyNTYrNDA5NiB9LCB7ICAgIjAiLCAgICAwKzQwOTYgfSB9IH0sCisgICAgeyB7IHsgIjE3NSIsIDExMzIrNDA5NiB9LCB7ICIxNzUiLCAxMTUyKzQwOTYgfSwgeyAiMTc1IiwgMTE1Mis0MDk2IH0sIHsgIjE3NSIsIDEwMjQrNDA5NiB9IH0gfSwKKyAgICB7IHsgeyAiMzUwIiwgMjAwOCs0MDk2IH0sIHsgIjM1MCIsIDIwNDgrNDA5NiB9LCB7ICIzNTAiLCAyMDQ4KzQwOTYgfSwgeyAiMzUwIiwgMjA0OCs0MDk2IH0gfSB9LAorICAgIHsgeyB7ICI1MjUiLCAyODg0KzQwOTYgfSwgeyAiNTI1IiwgMjk0NCs0MDk2IH0sIHsgIjUyNSIsIDI5NDQrNDA5NiB9LCB7ICI1MjUiLCAzMDcyKzQwOTYgfSB9IH0sCisgICAgeyB7IHsgIjcwMCIsIDM3NjArNDA5NiB9LCB7ICI3MDAiLCAzODQwKzQwOTYgfSwgeyAiNzAwIiwgMzg0MCs0MDk2IH0sIHsgIjcwMCIsIDQwOTUrNDA5NiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBmbGF0X2lyZThbXSA9IHsKKyAgICB7IHsgeyAiLTI1IiwgLTM5KzI1NiB9LCB7ICItMjUiLCAtNDArMjU2IH0sIHsgIi0yNSIsIC00MCsyNTYgfSwgeyAiLTI1IiwgLTY0KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAgICIwIiwgIDE2KzI1NiB9LCB7ICAgIjAiLCAgMTYrMjU2IH0sIHsgICAiMCIsICAxNisyNTYgfSwgeyAgICIwIiwgICAwKzI1NiB9IH0gfSwKKyAgICB7IHsgeyAgIjI1IiwgIDcxKzI1NiB9LCB7ICAiMjUiLCAgNzIrMjU2IH0sIHsgICIyNSIsICA3MisyNTYgfSwgeyAgIjI1IiwgIDY0KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAgIjUwIiwgMTI2KzI1NiB9LCB7ICAiNTAiLCAxMjgrMjU2IH0sIHsgICI1MCIsIDEyOCsyNTYgfSwgeyAgIjUwIiwgMTI4KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAgIjc1IiwgMTgwKzI1NiB9LCB7ICAiNzUiLCAxODQrMjU2IH0sIHsgICI3NSIsIDE4NCsyNTYgfSwgeyAgIjc1IiwgMTkyKzI1NiB9IH0gfSwKKyAgICB7IHsgeyAiMTAwIiwgMjM1KzI1NiB9LCB7ICIxMDAiLCAyNDArMjU2IH0sIHsgIjEwMCIsIDI0MCsyNTYgfSwgeyAiMTAwIiwgMjU2KzI1NiB9IH0gfSwKKyAgICB7IHsgeyAiMTI1IiwgMjkwKzI1NiB9LCB7ICIxMjUiLCAyOTYrMjU2IH0sIHsgIjEyNSIsIDI5NisyNTYgfSwgeyAiMTI1IiwgMzIwKzI1NiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBmbGF0X2lyZTlbXSA9IHsKKyAgICB7IHsgeyAiLTI1IiwgLTc4KzUxMiB9LCB7ICItMjUiLCAtODArNTEyIH0sIHsgIi0yNSIsIC04MCs1MTIgfSwgeyAiLTI1IiwtMTI4KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAgICIwIiwgIDMyKzUxMiB9LCB7ICAgIjAiLCAgMzIrNTEyIH0sIHsgICAiMCIsICAzMis1MTIgfSwgeyAgICIwIiwgICAwKzUxMiB9IH0gfSwKKyAgICB7IHsgeyAgIjI1IiwgMTQyKzUxMiB9LCB7ICAiMjUiLCAxNDQrNTEyIH0sIHsgICIyNSIsIDE0NCs1MTIgfSwgeyAgIjI1IiwgMTI4KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAgIjUwIiwgMjUxKzUxMiB9LCB7ICAiNTAiLCAyNTYrNTEyIH0sIHsgICI1MCIsIDI1Nis1MTIgfSwgeyAgIjUwIiwgMjU2KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAgIjc1IiwgMzYxKzUxMiB9LCB7ICAiNzUiLCAzNjgrNTEyIH0sIHsgICI3NSIsIDM2OCs1MTIgfSwgeyAgIjc1IiwgMzg0KzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiMTAwIiwgNDcwKzUxMiB9LCB7ICIxMDAiLCA0ODArNTEyIH0sIHsgIjEwMCIsIDQ4MCs1MTIgfSwgeyAiMTAwIiwgNTEyKzUxMiB9IH0gfSwKKyAgICB7IHsgeyAiMTI1IiwgNTgwKzUxMiB9LCB7ICIxMjUiLCA1OTIrNTEyIH0sIHsgIjEyNSIsIDU5Mis1MTIgfSwgeyAiMTI1IiwgNjQwKzUxMiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBmbGF0X2lyZTEwW10gPSB7CisgICAgeyB7IHsgIi0yNSIsLTE1NisxMDI0IH0sIHsgIi0yNSIsLTE2MCsxMDI0IH0sIHsgIi0yNSIsLTE2MCsxMDI0IH0sIHsgIi0yNSIsIC0yNTYrMTAyNCB9IH0gfSwKKyAgICB7IHsgeyAgICIwIiwgIDY0KzEwMjQgfSwgeyAgICIwIiwgIDY0KzEwMjQgfSwgeyAgIjAiLCAgIDY0KzEwMjQgfSwgeyAgICIwIiwgICAgMCsxMDI0IH0gfSB9LAorICAgIHsgeyB7ICAiMjUiLCAyODMrMTAyNCB9LCB7ICAiMjUiLCAyODgrMTAyNCB9LCB7ICAiMjUiLCAyODgrMTAyNCB9LCB7ICAiMjUiLCAgMjU2KzEwMjQgfSB9IH0sCisgICAgeyB7IHsgICI1MCIsIDUwMisxMDI0IH0sIHsgICI1MCIsIDUxMisxMDI0IH0sIHsgICI1MCIsIDUxMisxMDI0IH0sIHsgICI1MCIsICA1MTIrMTAyNCB9IH0gfSwKKyAgICB7IHsgeyAgIjc1IiwgNzIxKzEwMjQgfSwgeyAgIjc1IiwgNzM2KzEwMjQgfSwgeyAgIjc1IiwgNzM2KzEwMjQgfSwgeyAgIjc1IiwgIDc2OCsxMDI0IH0gfSB9LAorICAgIHsgeyB7ICIxMDAiLCA5NDArMTAyNCB9LCB7ICIxMDAiLCA5NjArMTAyNCB9LCB7ICIxMDAiLCA5NjArMTAyNCB9LCB7ICIxMDAiLCAxMDI0KzEwMjQgfSB9IH0sCisgICAgeyB7IHsgIjEyNSIsMTE2MCsxMDI0IH0sIHsgIjEyNSIsMTE4NCsxMDI0IH0sIHsgIjEyNSIsMTE4NCsxMDI0IH0sIHsgIjEyNSIsIDEyODArMTAyNCB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBmbGF0X2lyZTEyW10gPSB7CisgICAgeyB7IHsgIi0yNSIsIC02MjQrNDA5NiB9LCB7ICItMjUiLCAtNjQwKzQwOTYgfSwgeyAiLTI1IiwgLTY0MCs0MDk2IH0sIHsgIi0yNSIsLTEwMjQrNDA5NiB9IH0gfSwKKyAgICB7IHsgeyAgICIwIiwgIDI1Nis0MDk2IH0sIHsgICAiMCIsICAyNTYrNDA5NiB9LCB7ICAgIjAiLCAgMjU2KzQwOTYgfSwgeyAgICIwIiwgICAgMCs0MDk2IH0gfSB9LAorICAgIHsgeyB7ICAiMjUiLCAxMTMyKzQwOTYgfSwgeyAgIjI1IiwgMTE1Mis0MDk2IH0sIHsgICIyNSIsIDExNTIrNDA5NiB9LCB7ICAiMjUiLCAxMDI0KzQwOTYgfSB9IH0sCisgICAgeyB7IHsgICI1MCIsIDIwMDgrNDA5NiB9LCB7ICAiNTAiLCAyMDQ4KzQwOTYgfSwgeyAgIjUwIiwgMjA0OCs0MDk2IH0sIHsgICI1MCIsIDIwNDgrNDA5NiB9IH0gfSwKKyAgICB7IHsgeyAgIjc1IiwgMjg4NCs0MDk2IH0sIHsgICI3NSIsIDI5NDQrNDA5NiB9LCB7ICAiNzUiLCAyOTQ0KzQwOTYgfSwgeyAgIjc1IiwgMzA3Mis0MDk2IH0gfSB9LAorICAgIHsgeyB7ICIxMDAiLCAzNzYwKzQwOTYgfSwgeyAiMTAwIiwgMzg0MCs0MDk2IH0sIHsgIjEwMCIsIDM4NDArNDA5NiB9LCB7ICIxMDAiLCA0MDk2KzQwOTYgfSB9IH0sCisgICAgeyB7IHsgIjEyNSIsIDQ2NDArNDA5NiB9LCB7ICIxMjUiLCA0NzM2KzQwOTYgfSwgeyAiMTI1IiwgNDczNis0MDk2IH0sIHsgIjEyNSIsIDUxMjArNDA5NiB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBkaWdpdGFsOFtdID0geworICAgIHsgeyB7ICAiMTYiLCAgMTYgfSwgeyAgIjE2IiwgIDE2IH0sIHsgICIxNiIsICAxNiB9LCB7ICAgIjAiLCAgIDAgfSB9IH0sCisgICAgeyB7IHsgIjEyOCIsIDEyOCB9LCB7ICIxMjgiLCAxMjggfSwgeyAiMTI4IiwgMTI4IH0sIHsgIjEyOCIsIDEyOCB9IH0gfSwKKyAgICB7IHsgeyAiMjM1IiwgMjM1IH0sIHsgIjI0MCIsIDI0MCB9LCB7ICIyNDAiLCAyNDAgfSwgeyAiMjU1IiwgMjU1IH0gfSB9LAorfTsKKworc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGRpZ2l0YWw5W10gPSB7CisgICAgeyB7IHsgICIzMiIsICAzMiB9LCB7ICAiMzIiLCAgMzIgfSwgeyAgIjMyIiwgIDMyIH0sIHsgICAiMCIsICAgMCB9IH0gfSwKKyAgICB7IHsgeyAiMjU2IiwgMjU2IH0sIHsgIjI1NiIsIDI1NiB9LCB7ICIyNTYiLCAyNTYgfSwgeyAiMjU2IiwgMjU2IH0gfSB9LAorICAgIHsgeyB7ICI0NzAiLCA0NzAgfSwgeyAiNDgwIiwgNDgwIH0sIHsgIjQ4MCIsIDQ4MCB9LCB7ICI1MTEiLCA1MTEgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgZGlnaXRhbDEwW10gPSB7CisgICAgeyB7IHsgICI2NCIsICA2NCB9LCB7ICAiNjQiLCAgNjQgfSwgeyAgIjY0IiwgIDY0IH0sIHsgICAgIjAiLCAgICAwIH0gfSB9LAorICAgIHsgeyB7ICI1MTIiLCA1MTIgfSwgeyAiNTEyIiwgNTEyIH0sIHsgIjUxMiIsIDUxMiB9LCB7ICAiNTEyIiwgIDUxMiB9IH0gfSwKKyAgICB7IHsgeyAiOTQwIiwgOTQwIH0sIHsgIjk2MCIsIDk2MCB9LCB7ICI5NjAiLCA5NjAgfSwgeyAiMTAyMyIsIDEwMjMgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgZGlnaXRhbDEyW10gPSB7CisgICAgeyB7IHsgICIyNTYiLCAgMjU2IH0sIHsgICIyNTYiLCAgMjU2IH0sIHsgICIyNTYiLCAgMjU2IH0sIHsgICAgIjAiLCAgICAwIH0gfSB9LAorICAgIHsgeyB7ICIyMDQ4IiwgMjA0OCB9LCB7ICIyMDQ4IiwgMjA0OCB9LCB7ICIyMDQ4IiwgMjA0OCB9LCB7ICIyMDQ4IiwgMjA0OCB9IH0gfSwKKyAgICB7IHsgeyAiMzc2MCIsIDM3NjAgfSwgeyAiMzg0MCIsIDM4NDAgfSwgeyAiMzg0MCIsIDM4NDAgfSwgeyAiNDA5NSIsIDQwOTUgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgbWlsbGl2b2x0czhbXSA9IHsKKyAgICB7IHsgeyAgICIwIiwgIDE2IH0sIHsgICAiMCIsICAxNiB9LCB7ICAgIjAiLCAgMTYgfSwgeyAgICIwIiwgICAwIH0gfSB9LAorICAgIHsgeyB7ICIxNzUiLCAgNzEgfSwgeyAiMTc1IiwgIDcyIH0sIHsgIjE3NSIsICA3MiB9LCB7ICIxNzUiLCAgNjQgfSB9IH0sCisgICAgeyB7IHsgIjM1MCIsIDEyNiB9LCB7ICIzNTAiLCAxMjggfSwgeyAiMzUwIiwgMTI4IH0sIHsgIjM1MCIsIDEyOCB9IH0gfSwKKyAgICB7IHsgeyAiNTI1IiwgMTgwIH0sIHsgIjUyNSIsIDE4NCB9LCB7ICI1MjUiLCAxODQgfSwgeyAiNTI1IiwgMTkyIH0gfSB9LAorICAgIHsgeyB7ICI3MDAiLCAyMzUgfSwgeyAiNzAwIiwgMjQwIH0sIHsgIjcwMCIsIDI0MCB9LCB7ICI3MDAiLCAyNTUgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgbWlsbGl2b2x0czlbXSA9IHsKKyAgICB7IHsgeyAgICIwIiwgIDMyIH0sIHsgICAiMCIsICAzMiB9LCB7ICAgIjAiLCAgMzIgfSwgeyAgICIwIiwgICAwIH0gfSB9LAorICAgIHsgeyB7ICIxNzUiLCAxNDIgfSwgeyAiMTc1IiwgMTQ0IH0sIHsgIjE3NSIsIDE0NCB9LCB7ICIxNzUiLCAxMjggfSB9IH0sCisgICAgeyB7IHsgIjM1MCIsIDI1MSB9LCB7ICIzNTAiLCAyNTYgfSwgeyAiMzUwIiwgMjU2IH0sIHsgIjM1MCIsIDI1NiB9IH0gfSwKKyAgICB7IHsgeyAiNTI1IiwgMzYxIH0sIHsgIjUyNSIsIDM2OCB9LCB7ICI1MjUiLCAzNjggfSwgeyAiNTI1IiwgMzg0IH0gfSB9LAorICAgIHsgeyB7ICI3MDAiLCA0NzAgfSwgeyAiNzAwIiwgNDgwIH0sIHsgIjcwMCIsIDQ4MCB9LCB7ICI3MDAiLCA1MTEgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgbWlsbGl2b2x0czEwW10gPSB7CisgICAgeyB7IHsgICAiMCIsICA2NCB9LCB7ICAgIjAiLCAgNjQgfSwgeyAgICIwIiwgIDY0IH0sIHsgICAiMCIsICAgIDAgfSB9IH0sCisgICAgeyB7IHsgIjE3NSIsIDI4MyB9LCB7ICIxNzUiLCAyODggfSwgeyAiMTc1IiwgMjg4IH0sIHsgIjE3NSIsICAyNTYgfSB9IH0sCisgICAgeyB7IHsgIjM1MCIsIDUwMiB9LCB7ICIzNTAiLCA1MTIgfSwgeyAiMzUwIiwgNTEyIH0sIHsgIjM1MCIsICA1MTIgfSB9IH0sCisgICAgeyB7IHsgIjUyNSIsIDcyMSB9LCB7ICI1MjUiLCA3MzYgfSwgeyAiNTI1IiwgNzM2IH0sIHsgIjUyNSIsICA3NjggfSB9IH0sCisgICAgeyB7IHsgIjcwMCIsIDk0MCB9LCB7ICI3MDAiLCA5NjAgfSwgeyAiNzAwIiwgOTYwIH0sIHsgIjcwMCIsIDEwMjMgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgbWlsbGl2b2x0czEyW10gPSB7CisgICAgeyB7IHsgICAiMCIsICAyNTYgfSwgeyAgICIwIiwgIDI1NiB9LCB7ICAgIjAiLCAgMjU2IH0sIHsgICAiMCIsICAgIDAgfSB9IH0sCisgICAgeyB7IHsgIjE3NSIsIDExMzIgfSwgeyAiMTc1IiwgMTE1MiB9LCB7ICIxNzUiLCAxMTUyIH0sIHsgIjE3NSIsIDEwMjQgfSB9IH0sCisgICAgeyB7IHsgIjM1MCIsIDIwMDggfSwgeyAiMzUwIiwgMjA0OCB9LCB7ICIzNTAiLCAyMDQ4IH0sIHsgIjM1MCIsIDIwNDggfSB9IH0sCisgICAgeyB7IHsgIjUyNSIsIDI4ODQgfSwgeyAiNTI1IiwgMjk0NCB9LCB7ICI1MjUiLCAyOTQ0IH0sIHsgIjUyNSIsIDMwNzIgfSB9IH0sCisgICAgeyB7IHsgIjcwMCIsIDM3NjAgfSwgeyAiNzAwIiwgMzg0MCB9LCB7ICI3MDAiLCAzODQwIH0sIHsgIjcwMCIsIDQwOTUgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgaXJlOFtdID0geworICAgIHsgeyB7ICAgIjAiLCAgMTYgfSwgeyAgICIwIiwgIDE2IH0sIHsgICAiMCIsICAxNiB9LCB7ICAgIjAiLCAgIDAgfSB9IH0sCisgICAgeyB7IHsgICIyNSIsICA3MSB9LCB7ICAiMjUiLCAgNzIgfSwgeyAgIjI1IiwgIDcyIH0sIHsgICIyNSIsICA2NCB9IH0gfSwKKyAgICB7IHsgeyAgIjUwIiwgMTI2IH0sIHsgICI1MCIsIDEyOCB9LCB7ICAiNTAiLCAxMjggfSwgeyAgIjUwIiwgMTI4IH0gfSB9LAorICAgIHsgeyB7ICAiNzUiLCAxODAgfSwgeyAgIjc1IiwgMTg0IH0sIHsgICI3NSIsIDE4NCB9LCB7ICAiNzUiLCAxOTIgfSB9IH0sCisgICAgeyB7IHsgIjEwMCIsIDIzNSB9LCB7ICIxMDAiLCAyNDAgfSwgeyAiMTAwIiwgMjQwIH0sIHsgIjEwMCIsIDI1NSB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBpcmU5W10gPSB7CisgICAgeyB7IHsgICAiMCIsICAzMiB9LCB7ICAgIjAiLCAgMzIgfSwgeyAgICIwIiwgIDMyIH0sIHsgICAiMCIsICAgMCB9IH0gfSwKKyAgICB7IHsgeyAgIjI1IiwgMTQyIH0sIHsgICIyNSIsIDE0NCB9LCB7ICAiMjUiLCAxNDQgfSwgeyAgIjI1IiwgMTI4IH0gfSB9LAorICAgIHsgeyB7ICAiNTAiLCAyNTEgfSwgeyAgIjUwIiwgMjU2IH0sIHsgICI1MCIsIDI1NiB9LCB7ICAiNTAiLCAyNTYgfSB9IH0sCisgICAgeyB7IHsgICI3NSIsIDM2MSB9LCB7ICAiNzUiLCAzNjggfSwgeyAgIjc1IiwgMzY4IH0sIHsgICI3NSIsIDM4NCB9IH0gfSwKKyAgICB7IHsgeyAiMTAwIiwgNDcwIH0sIHsgIjEwMCIsIDQ4MCB9LCB7ICIxMDAiLCA0ODAgfSwgeyAiMTAwIiwgNTExIH0gfSB9LAorfTsKKworc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGlyZTEwW10gPSB7CisgICAgeyB7IHsgICAiMCIsICA2NCB9LCB7ICAgIjAiLCAgNjQgfSwgeyAgIjAiLCAgIDY0IH0sIHsgICAiMCIsICAgIDAgfSB9IH0sCisgICAgeyB7IHsgICIyNSIsIDI4MyB9LCB7ICAiMjUiLCAyODggfSwgeyAgIjI1IiwgMjg4IH0sIHsgICIyNSIsICAyNTYgfSB9IH0sCisgICAgeyB7IHsgICI1MCIsIDUwMiB9LCB7ICAiNTAiLCA1MTIgfSwgeyAgIjUwIiwgNTEyIH0sIHsgICI1MCIsICA1MTIgfSB9IH0sCisgICAgeyB7IHsgICI3NSIsIDcyMSB9LCB7ICAiNzUiLCA3MzYgfSwgeyAgIjc1IiwgNzM2IH0sIHsgICI3NSIsICA3NjggfSB9IH0sCisgICAgeyB7IHsgIjEwMCIsIDk0MCB9LCB7ICIxMDAiLCA5NjAgfSwgeyAiMTAwIiwgOTYwIH0sIHsgIjEwMCIsIDEwMjMgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgaXJlMTJbXSA9IHsKKyAgICB7IHsgeyAgICIwIiwgIDI1NiB9LCB7ICAgIjAiLCAgMjU2IH0sIHsgICAiMCIsICAyNTYgfSwgeyAgICIwIiwgICAgMCB9IH0gfSwKKyAgICB7IHsgeyAgIjI1IiwgMTEzMiB9LCB7ICAiMjUiLCAxMTUyIH0sIHsgICIyNSIsIDExNTIgfSwgeyAgIjI1IiwgMTAyNCB9IH0gfSwKKyAgICB7IHsgeyAgIjUwIiwgMjAwOCB9LCB7ICAiNTAiLCAyMDQ4IH0sIHsgICI1MCIsIDIwNDggfSwgeyAgIjUwIiwgMjA0OCB9IH0gfSwKKyAgICB7IHsgeyAgIjc1IiwgMjg4NCB9LCB7ICAiNzUiLCAyOTQ0IH0sIHsgICI3NSIsIDI5NDQgfSwgeyAgIjc1IiwgMzA3MiB9IH0gfSwKKyAgICB7IHsgeyAiMTAwIiwgMzc2MCB9LCB7ICIxMDAiLCAzODQwIH0sIHsgIjEwMCIsIDM4NDAgfSwgeyAiMTAwIiwgNDA5NSB9IH0gfSwKK307CisKK3N0YXRpYyBjb25zdCBHcmF0aWN1bGVMaW5lcyBjaHJvbWFfZGlnaXRhbDhbXSA9IHsKKyAgICB7IHsgeyAgIjUwIiwgIDUwIH0sIHsgICI1MCIsICA1MCB9LCB7ICAiNTAiLCAgNTAgfSwgeyAgIjUwIiwgIDUwIH0gfSB9LAorICAgIHsgeyB7ICIxMDAiLCAxMDAgfSwgeyAiMTAwIiwgMTAwIH0sIHsgIjEwMCIsIDEwMCB9LCB7ICIxMDAiLCAxMDAgfSB9IH0sCisgICAgeyB7IHsgIjE1MCIsIDE1MCB9LCB7ICIxNTAiLCAxNTAgfSwgeyAiMTUwIiwgMTUwIH0sIHsgIjE1MCIsIDE1MCB9IH0gfSwKKyAgICB7IHsgeyAiMjAwIiwgMjAwIH0sIHsgIjIwMCIsIDIwMCB9LCB7ICIyMDAiLCAyMDAgfSwgeyAiMjAwIiwgMjAwIH0gfSB9LAorICAgIHsgeyB7ICIyNTUiLCAyNTUgfSwgeyAiMjU1IiwgMjU1IH0sIHsgIjI1NSIsIDI1NSB9LCB7ICIyNTUiLCAyNTUgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgY2hyb21hX2RpZ2l0YWw5W10gPSB7CisgICAgeyB7IHsgIjEwMCIsIDEwMCB9LCB7ICIxMDAiLCAxMDAgfSwgeyAiMTAwIiwgMTAwIH0sIHsgIjEwMCIsIDEwMCB9IH0gfSwKKyAgICB7IHsgeyAiMjAwIiwgMjAwIH0sIHsgIjIwMCIsIDIwMCB9LCB7ICIyMDAiLCAyMDAgfSwgeyAiMjAwIiwgMjAwIH0gfSB9LAorICAgIHsgeyB7ICIzMDAiLCAzMDAgfSwgeyAiMzAwIiwgMzAwIH0sIHsgIjMwMCIsIDMwMCB9LCB7ICIzMDAiLCAzMDAgfSB9IH0sCisgICAgeyB7IHsgIjQwMCIsIDQwMCB9LCB7ICI0MDAiLCA0MDAgfSwgeyAiNDAwIiwgNDAwIH0sIHsgIjQwMCIsIDQwMCB9IH0gfSwKKyAgICB7IHsgeyAiNTAwIiwgNTAwIH0sIHsgIjUwMCIsIDUwMCB9LCB7ICI1MDAiLCA1MDAgfSwgeyAiNTAwIiwgNTAwIH0gfSB9LAorfTsKKworc3RhdGljIGNvbnN0IEdyYXRpY3VsZUxpbmVzIGNocm9tYV9kaWdpdGFsMTBbXSA9IHsKKyAgICB7IHsgeyAiMjAwIiwgMjAwIH0sIHsgIjIwMCIsIDIwMCB9LCB7ICIyMDAiLCAyMDAgfSwgeyAiMjAwIiwgMjAwIH0gfSB9LAorICAgIHsgeyB7ICI0MDAiLCA0MDAgfSwgeyAiNDAwIiwgNDAwIH0sIHsgIjQwMCIsIDQwMCB9LCB7ICI0MDAiLCA0MDAgfSB9IH0sCisgICAgeyB7IHsgIjYwMCIsIDYwMCB9LCB7ICI2MDAiLCA2MDAgfSwgeyAiNjAwIiwgNjAwIH0sIHsgIjYwMCIsIDYwMCB9IH0gfSwKKyAgICB7IHsgeyAiODAwIiwgODAwIH0sIHsgIjgwMCIsIDgwMCB9LCB7ICI4MDAiLCA4MDAgfSwgeyAiODAwIiwgODAwIH0gfSB9LAorICAgIHsgeyB7IjEwMDAiLDEwMDAgfSwgeyIxMDAwIiwxMDAwIH0sIHsiMTAwMCIsMTAwMCB9LCB7IjEwMDAiLDEwMDAgfSB9IH0sCit9OworCitzdGF0aWMgY29uc3QgR3JhdGljdWxlTGluZXMgY2hyb21hX2RpZ2l0YWwxMltdID0geworICAgIHsgeyB7ICAiODAwIiwgIDgwMCB9LCB7ICAiODAwIiwgIDgwMCB9LCB7ICAiODAwIiwgIDgwMCB9LCB7ICAiODAwIiwgIDgwMCB9IH0gfSwKKyAgICB7IHsgeyAiMTYwMCIsIDE2MDAgfSwgeyAiMTYwMCIsIDE2MDAgfSwgeyAiMTYwMCIsIDE2MDAgfSwgeyAiMTYwMCIsIDE2MDAgfSB9IH0sCisgICAgeyB7IHsgIjI0MDAiLCAyNDAwIH0sIHsgIjI0MDAiLCAyNDAwIH0sIHsgIjI0MDAiLCAyNDAwIH0sIHsgIjI0MDAiLCAyNDAwIH0gfSB9LAorICAgIHsgeyB7ICIzMjAwIiwgMzIwMCB9LCB7ICIzMjAwIiwgMzIwMCB9LCB7ICIzMjAwIiwgMzIwMCB9LCB7ICIzMjAwIiwgMzIwMCB9IH0gfSwKKyAgICB7IHsgeyAiNDAwMCIsIDQwMDAgfSwgeyAiNDAwMCIsIDQwMDAgfSwgeyAiNDAwMCIsIDQwMDAgfSwgeyAiNDAwMCIsIDQwMDAgfSB9IH0sCit9OworCitzdGF0aWMgdm9pZCBibGVuZF92bGluZSh1aW50OF90ICpkc3QsIGludCBoZWlnaHQsIGludCBsaW5lc2l6ZSwgZmxvYXQgbzEsIGZsb2F0IG8yLCBpbnQgdiwgaW50IHN0ZXApCit7CisgICAgaW50IHk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHN0ZXApIHsKKyAgICAgICAgZHN0WzBdID0gdiAqIG8xICsgZHN0WzBdICogbzI7CisKKyAgICAgICAgZHN0ICs9IGxpbmVzaXplICogc3RlcDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJsZW5kX3ZsaW5lMTYodWludDE2X3QgKmRzdCwgaW50IGhlaWdodCwgaW50IGxpbmVzaXplLCBmbG9hdCBvMSwgZmxvYXQgbzIsIGludCB2LCBpbnQgc3RlcCkKK3sKKyAgICBpbnQgeTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gc3RlcCkgeworICAgICAgICBkc3RbMF0gPSB2ICogbzEgKyBkc3RbMF0gKiBvMjsKKworICAgICAgICBkc3QgKz0gKGxpbmVzaXplIC8gMikgKiBzdGVwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYmxlbmRfaGxpbmUodWludDhfdCAqZHN0LCBpbnQgd2lkdGgsIGZsb2F0IG8xLCBmbG9hdCBvMiwgaW50IHYsIGludCBzdGVwKQoreworICAgIGludCB4OworCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IHN0ZXApIHsKKyAgICAgICAgZHN0W3hdID0gdiAqIG8xICsgZHN0W3hdICogbzI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBibGVuZF9obGluZTE2KHVpbnQxNl90ICpkc3QsIGludCB3aWR0aCwgZmxvYXQgbzEsIGZsb2F0IG8yLCBpbnQgdiwgaW50IHN0ZXApCit7CisgICAgaW50IHg7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7IHggKz0gc3RlcCkgeworICAgICAgICBkc3RbeF0gPSB2ICogbzEgKyBkc3RbeF0gKiBvMjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdfaHRleHQoQVZGcmFtZSAqb3V0LCBpbnQgeCwgaW50IHksIGZsb2F0IG8xLCBmbG9hdCBvMiwgY29uc3QgY2hhciAqdHh0LCBjb25zdCB1aW50OF90IGNvbG9yWzRdKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmZvbnQ7CisgICAgaW50IGZvbnRfaGVpZ2h0OworICAgIGludCBpLCBwbGFuZTsKKworICAgIGZvbnQgPSBhdnByaXZfY2dhX2ZvbnQsICAgZm9udF9oZWlnaHQgPSAgODsKKworICAgIGZvciAocGxhbmUgPSAwOyBwbGFuZSA8IDQgJiYgb3V0LT5kYXRhW3BsYW5lXTsgcGxhbmUrKykgeworICAgICAgICBmb3IgKGkgPSAwOyB0eHRbaV07IGkrKykgeworICAgICAgICAgICAgaW50IGNoYXJfeSwgbWFzazsKKyAgICAgICAgICAgIGludCB2ID0gY29sb3JbcGxhbmVdOworCisgICAgICAgICAgICB1aW50OF90ICpwID0gb3V0LT5kYXRhW3BsYW5lXSArIHkgKiBvdXQtPmxpbmVzaXplW3BsYW5lXSArICh4ICsgaSAqIDgpOworICAgICAgICAgICAgZm9yIChjaGFyX3kgPSAwOyBjaGFyX3kgPCBmb250X2hlaWdodDsgY2hhcl95KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKG1hc2sgPSAweDgwOyBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb250W3R4dFtpXSAqIGZvbnRfaGVpZ2h0ICsgY2hhcl95XSAmIG1hc2spCisgICAgICAgICAgICAgICAgICAgICAgICBwWzBdID0gcFswXSAqIG8yICsgdiAqIG8xOworICAgICAgICAgICAgICAgICAgICBwKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAgKz0gb3V0LT5saW5lc2l6ZVtwbGFuZV0gLSA4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X2h0ZXh0MTYoQVZGcmFtZSAqb3V0LCBpbnQgeCwgaW50IHksIGludCBtdWx0LCBmbG9hdCBvMSwgZmxvYXQgbzIsIGNvbnN0IGNoYXIgKnR4dCwgY29uc3QgdWludDhfdCBjb2xvcls0XSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpmb250OworICAgIGludCBmb250X2hlaWdodDsKKyAgICBpbnQgaSwgcGxhbmU7CisKKyAgICBmb250ID0gYXZwcml2X2NnYV9mb250LCAgIGZvbnRfaGVpZ2h0ID0gIDg7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIG91dC0+ZGF0YVtwbGFuZV07IHBsYW5lKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgdHh0W2ldOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjaGFyX3ksIG1hc2s7CisgICAgICAgICAgICBpbnQgdiA9IGNvbG9yW3BsYW5lXSAqIG11bHQ7CisKKyAgICAgICAgICAgIHVpbnQxNl90ICpwID0gKHVpbnQxNl90ICopKG91dC0+ZGF0YVtwbGFuZV0gKyB5ICogb3V0LT5saW5lc2l6ZVtwbGFuZV0pICsgKHggKyBpICogOCk7CisgICAgICAgICAgICBmb3IgKGNoYXJfeSA9IDA7IGNoYXJfeSA8IGZvbnRfaGVpZ2h0OyBjaGFyX3krKykgeworICAgICAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRbdHh0W2ldICogZm9udF9oZWlnaHQgKyBjaGFyX3ldICYgbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBbMF0gPSBwWzBdICogbzIgKyB2ICogbzE7CisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcCArPSBvdXQtPmxpbmVzaXplW3BsYW5lXSAvIDIgLSA4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkcmF3X3Z0ZXh0KEFWRnJhbWUgKm91dCwgaW50IHgsIGludCB5LCBmbG9hdCBvMSwgZmxvYXQgbzIsIGNvbnN0IGNoYXIgKnR4dCwgY29uc3QgdWludDhfdCBjb2xvcls0XSkKK3sKKyAgICBjb25zdCB1aW50OF90ICpmb250OworICAgIGludCBmb250X2hlaWdodDsKKyAgICBpbnQgaSwgcGxhbmU7CisKKyAgICBmb250ID0gYXZwcml2X2NnYV9mb250LCAgIGZvbnRfaGVpZ2h0ID0gIDg7CisKKyAgICBmb3IgKHBsYW5lID0gMDsgcGxhbmUgPCA0ICYmIG91dC0+ZGF0YVtwbGFuZV07IHBsYW5lKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgdHh0W2ldOyBpKyspIHsKKyAgICAgICAgICAgIGludCBjaGFyX3ksIG1hc2s7CisgICAgICAgICAgICBpbnQgdiA9IGNvbG9yW3BsYW5lXTsKKworICAgICAgICAgICAgZm9yIChjaGFyX3kgPSBmb250X2hlaWdodCAtIDE7IGNoYXJfeSA+PSAwOyBjaGFyX3ktLSkgeworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnAgPSBvdXQtPmRhdGFbcGxhbmVdICsgKHkgKyBpICogMTApICogb3V0LT5saW5lc2l6ZVtwbGFuZV0gKyB4OworICAgICAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRbdHh0W2ldICogZm9udF9oZWlnaHQgKyBmb250X2hlaWdodCAtIDEgLSBjaGFyX3ldICYgbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBbY2hhcl95XSA9IHBbY2hhcl95XSAqIG8yICsgdiAqIG8xOworICAgICAgICAgICAgICAgICAgICBwICs9IG91dC0+bGluZXNpemVbcGxhbmVdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgZHJhd192dGV4dDE2KEFWRnJhbWUgKm91dCwgaW50IHgsIGludCB5LCBpbnQgbXVsdCwgZmxvYXQgbzEsIGZsb2F0IG8yLCBjb25zdCBjaGFyICp0eHQsIGNvbnN0IHVpbnQ4X3QgY29sb3JbNF0pCit7CisgICAgY29uc3QgdWludDhfdCAqZm9udDsKKyAgICBpbnQgZm9udF9oZWlnaHQ7CisgICAgaW50IGksIHBsYW5lOworCisgICAgZm9udCA9IGF2cHJpdl9jZ2FfZm9udCwgICBmb250X2hlaWdodCA9ICA4OworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgNCAmJiBvdXQtPmRhdGFbcGxhbmVdOyBwbGFuZSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IHR4dFtpXTsgaSsrKSB7CisgICAgICAgICAgICBpbnQgY2hhcl95LCBtYXNrOworICAgICAgICAgICAgaW50IHYgPSBjb2xvcltwbGFuZV0gKiBtdWx0OworCisgICAgICAgICAgICBmb3IgKGNoYXJfeSA9IDA7IGNoYXJfeSA8IGZvbnRfaGVpZ2h0OyBjaGFyX3krKykgeworICAgICAgICAgICAgICAgIHVpbnQxNl90ICpwID0gKHVpbnQxNl90ICopKG91dC0+ZGF0YVtwbGFuZV0gKyAoeSArIGkgKiAxMCkgKiBvdXQtPmxpbmVzaXplW3BsYW5lXSkgKyB4OworICAgICAgICAgICAgICAgIGZvciAobWFzayA9IDB4ODA7IG1hc2s7IG1hc2sgPj49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRbdHh0W2ldICogZm9udF9oZWlnaHQgKyBmb250X2hlaWdodCAtIDEgLSBjaGFyX3ldICYgbWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgIHBbY2hhcl95XSA9IHBbY2hhcl95XSAqIG8yICsgdiAqIG8xOworICAgICAgICAgICAgICAgICAgICBwICs9IG91dC0+bGluZXNpemVbcGxhbmVdIC8gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdyYXRpY3VsZV9ub25lKFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0KQoreworfQorCitzdGF0aWMgdm9pZCBncmF0aWN1bGVfcm93KFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0KQoreworICAgIGNvbnN0IGludCBzdGVwID0gKHMtPmZsYWdzICYgMikgKyAxOworICAgIGNvbnN0IGZsb2F0IG8xID0gcy0+b3BhY2l0eTsKKyAgICBjb25zdCBmbG9hdCBvMiA9IDEuIC0gbzE7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHMtPmRpc3BsYXkgPT0gUEFSQURFID8gb3V0LT5oZWlnaHQgLyBzLT5hY29tcCA6IG91dC0+aGVpZ2h0OworICAgIGludCBrID0gMCwgYywgcCwgbCwgb2Zmc2V0X3ggPSAwLCBvZmZzZXRfeSA9IDA7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmNvbXA7IGMrKykgeworICAgICAgICBpZiAoISgoMSA8PCBjKSAmIHMtPnBjb21wKSB8fCAoIXMtPmRpc3BsYXkgJiYgayA+IDApKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaysrOworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgcy0+bmNvbXA7IHArKykgeworICAgICAgICAgICAgY29uc3QgaW50IHYgPSBzLT5ncmF0X3l1dmFfY29sb3JbcF07CisgICAgICAgICAgICBmb3IgKGwgPSAwOyBsIDwgcy0+bmJfZ2xpbmVzOyBsKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBwb3MgPSBzLT5nbGluZXNbbF0ubGluZVtjXS5wb3M7CisgICAgICAgICAgICAgICAgaW50IHggPSBvZmZzZXRfeCArIChzLT5taXJyb3IgPyBzLT5zaXplIC0gMSAtIHBvcyA6IHBvcyk7CisgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhW3BdICsgb2Zmc2V0X3kgKiBvdXQtPmxpbmVzaXplW3BdICsgeDsKKworICAgICAgICAgICAgICAgIGJsZW5kX3ZsaW5lKGRzdCwgaGVpZ2h0LCBvdXQtPmxpbmVzaXplW3BdLCBvMSwgbzIsIHYsIHN0ZXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChsID0gMDsgbCA8IHMtPm5iX2dsaW5lcyAmJiAocy0+ZmxhZ3MgJiAxKTsgbCsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gcy0+Z2xpbmVzW2xdLmxpbmVbY10ubmFtZTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90IHBvcyA9IHMtPmdsaW5lc1tsXS5saW5lW2NdLnBvczsKKyAgICAgICAgICAgIGludCB4ID0gb2Zmc2V0X3ggKyAocy0+bWlycm9yID8gcy0+c2l6ZSAtIDEgLSBwb3MgOiBwb3MpIC0gMTA7CisKKyAgICAgICAgICAgIGlmICh4IDwgMCkKKyAgICAgICAgICAgICAgICB4ID0gNDsKKworICAgICAgICAgICAgZHJhd192dGV4dChvdXQsIHgsIG9mZnNldF95ICsgMiwgbzEsIG8yLCBuYW1lLCBzLT5ncmF0X3l1dmFfY29sb3IpOworICAgICAgICB9CisKKyAgICAgICAgb2Zmc2V0X3ggKz0gcy0+c2l6ZSAqIChzLT5kaXNwbGF5ID09IFNUQUNLKTsKKyAgICAgICAgb2Zmc2V0X3kgKz0gaGVpZ2h0ICogKHMtPmRpc3BsYXkgPT0gUEFSQURFKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGdyYXRpY3VsZTE2X3JvdyhXYXZlZm9ybUNvbnRleHQgKnMsIEFWRnJhbWUgKm91dCkKK3sKKyAgICBjb25zdCBpbnQgc3RlcCA9IChzLT5mbGFncyAmIDIpICsgMTsKKyAgICBjb25zdCBmbG9hdCBvMSA9IHMtPm9wYWNpdHk7CisgICAgY29uc3QgZmxvYXQgbzIgPSAxLiAtIG8xOworICAgIGNvbnN0IGludCBtdWx0ID0gcy0+bWF4IC8gMjU2OworICAgIGNvbnN0IGludCBoZWlnaHQgPSBzLT5kaXNwbGF5ID09IFBBUkFERSA/IG91dC0+aGVpZ2h0IC8gcy0+YWNvbXAgOiBvdXQtPmhlaWdodDsKKyAgICBpbnQgayA9IDAsIGMsIHAsIGwsIG9mZnNldF94ID0gMCwgb2Zmc2V0X3kgPSAwOworCisgICAgZm9yIChjID0gMDsgYyA8IHMtPm5jb21wOyBjKyspIHsKKyAgICAgICAgaWYgKCEoKDEgPDwgYykgJiBzLT5wY29tcCkgfHwgKCFzLT5kaXNwbGF5ICYmIGsgPiAwKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGsrKzsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5jb21wOyBwKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB2ID0gcy0+Z3JhdF95dXZhX2NvbG9yW3BdICogbXVsdDsKKyAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBzLT5uYl9nbGluZXMgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBwb3MgPSBzLT5nbGluZXNbbF0ubGluZVtjXS5wb3M7CisgICAgICAgICAgICAgICAgaW50IHggPSBvZmZzZXRfeCArIChzLT5taXJyb3IgPyBzLT5zaXplIC0gMSAtIHBvcyA6IHBvcyk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKShvdXQtPmRhdGFbcF0gKyBvZmZzZXRfeSAqIG91dC0+bGluZXNpemVbcF0pICsgeDsKKworICAgICAgICAgICAgICAgIGJsZW5kX3ZsaW5lMTYoZHN0LCBoZWlnaHQsIG91dC0+bGluZXNpemVbcF0sIG8xLCBvMiwgdiwgc3RlcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGwgPSAwOyBsIDwgcy0+bmJfZ2xpbmVzICYmIChzLT5mbGFncyAmIDEpOyBsKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzLT5nbGluZXNbbF0ubGluZVtjXS5uYW1lOworICAgICAgICAgICAgY29uc3QgdWludDE2X3QgcG9zID0gcy0+Z2xpbmVzW2xdLmxpbmVbY10ucG9zOworICAgICAgICAgICAgaW50IHggPSBvZmZzZXRfeCArIChzLT5taXJyb3IgPyBzLT5zaXplIC0gMSAtIHBvcyA6IHBvcykgLSAxMDsKKworICAgICAgICAgICAgaWYgKHggPCAwKQorICAgICAgICAgICAgICAgIHggPSA0OworCisgICAgICAgICAgICBkcmF3X3Z0ZXh0MTYob3V0LCB4LCBvZmZzZXRfeSArIDIsIG11bHQsIG8xLCBvMiwgbmFtZSwgcy0+Z3JhdF95dXZhX2NvbG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldF94ICs9IHMtPnNpemUgKiAocy0+ZGlzcGxheSA9PSBTVEFDSyk7CisgICAgICAgIG9mZnNldF95ICs9IGhlaWdodCAqIChzLT5kaXNwbGF5ID09IFBBUkFERSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBncmF0aWN1bGVfY29sdW1uKFdhdmVmb3JtQ29udGV4dCAqcywgQVZGcmFtZSAqb3V0KQoreworICAgIGNvbnN0IGludCBzdGVwID0gKHMtPmZsYWdzICYgMikgKyAxOworICAgIGNvbnN0IGZsb2F0IG8xID0gcy0+b3BhY2l0eTsKKyAgICBjb25zdCBmbG9hdCBvMiA9IDEuIC0gbzE7CisgICAgY29uc3QgaW50IHdpZHRoID0gcy0+ZGlzcGxheSA9PSBQQVJBREUgPyBvdXQtPndpZHRoIC8gcy0+YWNvbXAgOiBvdXQtPndpZHRoOworICAgIGludCBrID0gMCwgYywgcCwgbCwgb2Zmc2V0X3kgPSAwLCBvZmZzZXRfeCA9IDA7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgcy0+bmNvbXA7IGMrKykgeworICAgICAgICBpZiAoKCEoKDEgPDwgYykgJiBzLT5wY29tcCkgfHwgKCFzLT5kaXNwbGF5ICYmIGsgPiAwKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBrKys7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCBzLT5uY29tcDsgcCsrKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgdiA9IHMtPmdyYXRfeXV2YV9jb2xvcltwXTsKKyAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBzLT5uYl9nbGluZXMgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBwb3MgPSBzLT5nbGluZXNbbF0ubGluZVtjXS5wb3M7CisgICAgICAgICAgICAgICAgaW50IHkgPSBvZmZzZXRfeSArIChzLT5taXJyb3IgPyBzLT5zaXplIC0gMSAtIHBvcyA6IHBvcyk7CisgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gb3V0LT5kYXRhW3BdICsgeSAqIG91dC0+bGluZXNpemVbcF0gKyBvZmZzZXRfeDsKKworICAgICAgICAgICAgICAgIGJsZW5kX2hsaW5lKGRzdCwgd2lkdGgsIG8xLCBvMiwgdiwgc3RlcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGwgPSAwOyBsIDwgcy0+bmJfZ2xpbmVzICYmIChzLT5mbGFncyAmIDEpOyBsKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzLT5nbGluZXNbbF0ubGluZVtjXS5uYW1lOworICAgICAgICAgICAgY29uc3QgdWludDE2X3QgcG9zID0gcy0+Z2xpbmVzW2xdLmxpbmVbY10ucG9zOworICAgICAgICAgICAgaW50IHkgPSBvZmZzZXRfeSArIChzLT5taXJyb3IgPyBzLT5zaXplIC0gMSAtIHBvcyA6IHBvcykgLSAxMDsKKworICAgICAgICAgICAgaWYgKHkgPCAwKQorICAgICAgICAgICAgICAgIHkgPSA0OworCisgICAgICAgICAgICBkcmF3X2h0ZXh0KG91dCwgMiArIG9mZnNldF94LCB5LCBvMSwgbzIsIG5hbWUsIHMtPmdyYXRfeXV2YV9jb2xvcik7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXRfeSArPSBzLT5zaXplICogKHMtPmRpc3BsYXkgPT0gU1RBQ0spOworICAgICAgICBvZmZzZXRfeCArPSB3aWR0aCAqIChzLT5kaXNwbGF5ID09IFBBUkFERSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBncmF0aWN1bGUxNl9jb2x1bW4oV2F2ZWZvcm1Db250ZXh0ICpzLCBBVkZyYW1lICpvdXQpCit7CisgICAgY29uc3QgaW50IHN0ZXAgPSAocy0+ZmxhZ3MgJiAyKSArIDE7CisgICAgY29uc3QgZmxvYXQgbzEgPSBzLT5vcGFjaXR5OworICAgIGNvbnN0IGZsb2F0IG8yID0gMS4gLSBvMTsKKyAgICBjb25zdCBpbnQgbXVsdCA9IHMtPm1heCAvIDI1NjsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBzLT5kaXNwbGF5ID09IFBBUkFERSA/IG91dC0+d2lkdGggLyBzLT5hY29tcCA6IG91dC0+d2lkdGg7CisgICAgaW50IGsgPSAwLCBjLCBwLCBsLCBvZmZzZXRfeCA9IDAsIG9mZnNldF95ID0gMDsKKworICAgIGZvciAoYyA9IDA7IGMgPCBzLT5uY29tcDsgYysrKSB7CisgICAgICAgIGlmICgoISgoMSA8PCBjKSAmIHMtPnBjb21wKSB8fCAoIXMtPmRpc3BsYXkgJiYgayA+IDApKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGsrKzsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IHMtPm5jb21wOyBwKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB2ID0gcy0+Z3JhdF95dXZhX2NvbG9yW3BdICogbXVsdDsKKyAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBzLT5uYl9nbGluZXMgOyBsKyspIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBwb3MgPSBzLT5nbGluZXNbbF0ubGluZVtjXS5wb3M7CisgICAgICAgICAgICAgICAgaW50IHkgPSBvZmZzZXRfeSArIChzLT5taXJyb3IgPyBzLT5zaXplIC0gMSAtIHBvcyA6IHBvcyk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKShvdXQtPmRhdGFbcF0gKyB5ICogb3V0LT5saW5lc2l6ZVtwXSkgKyBvZmZzZXRfeDsKKworICAgICAgICAgICAgICAgIGJsZW5kX2hsaW5lMTYoZHN0LCB3aWR0aCwgbzEsIG8yLCB2LCBzdGVwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAobCA9IDA7IGwgPCBzLT5uYl9nbGluZXMgJiYgKHMtPmZsYWdzICYgMSk7IGwrKykgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHMtPmdsaW5lc1tsXS5saW5lW2NdLm5hbWU7CisgICAgICAgICAgICBjb25zdCB1aW50MTZfdCBwb3MgPSBzLT5nbGluZXNbbF0ubGluZVtjXS5wb3M7CisgICAgICAgICAgICBpbnQgeSA9IG9mZnNldF95ICsgKHMtPm1pcnJvciA/IHMtPnNpemUgLSAxIC0gcG9zOiBwb3MpIC0gMTA7CisKKyAgICAgICAgICAgIGlmICh5IDwgMCkKKyAgICAgICAgICAgICAgICB5ID0gNDsKKworICAgICAgICAgICAgZHJhd19odGV4dDE2KG91dCwgMiArIG9mZnNldF94LCB5LCBtdWx0LCBvMSwgbzIsIG5hbWUsIHMtPmdyYXRfeXV2YV9jb2xvcik7CisgICAgICAgIH0KKworICAgICAgICBvZmZzZXRfeSArPSBzLT5zaXplICogKHMtPmRpc3BsYXkgPT0gU1RBQ0spOworICAgICAgICBvZmZzZXRfeCArPSB3aWR0aCAqIChzLT5kaXNwbGF5ID09IFBBUkFERSk7CisgICAgfQorfQorCiBzdGF0aWMgaW50IGNvbmZpZ19pbnB1dChBVkZpbHRlckxpbmsgKmlubGluaykKIHsKICAgICBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGlubGluay0+ZHN0OwpAQCAtMTA5MiwyNSArMjUxMywyMTUgQEAKICAgICBzLT5tYXggPSAxIDw8IHMtPmJpdHM7CiAgICAgcy0+aW50ZW5zaXR5ID0gcy0+ZmludGVuc2l0eSAqIChzLT5tYXggLSAxKTsKIAorICAgIHMtPnNoaWZ0X3dbMF0gPSBzLT5zaGlmdF93WzNdID0gMDsKKyAgICBzLT5zaGlmdF9oWzBdID0gcy0+c2hpZnRfaFszXSA9IDA7CisgICAgcy0+c2hpZnRfd1sxXSA9IHMtPnNoaWZ0X3dbMl0gPSBzLT5kZXNjLT5sb2cyX2Nocm9tYV93OworICAgIHMtPnNoaWZ0X2hbMV0gPSBzLT5zaGlmdF9oWzJdID0gcy0+ZGVzYy0+bG9nMl9jaHJvbWFfaDsKKworICAgIHMtPmdyYXRpY3VsZWYgPSBncmF0aWN1bGVfbm9uZTsKKworICAgIHN3aXRjaCAocy0+ZmlsdGVyKSB7CisgICAgY2FzZSBYRkxBVDoKKyAgICBjYXNlIEFGTEFUOiBzLT5zaXplID0gMjU2ICogMjsgYnJlYWs7CisgICAgY2FzZSBGTEFUOiAgcy0+c2l6ZSA9IDI1NiAqIDM7IGJyZWFrOworICAgIGRlZmF1bHQ6ICAgIHMtPnNpemUgPSAyNTY7ICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMtPmZpbHRlciB8ICgocy0+Yml0cyA+IDgpIDw8IDQpIHwKKyAgICAgICAgICAgIChzLT5tb2RlIDw8IDgpIHwgKHMtPm1pcnJvciA8PCAxMikpIHsKKyAgICBjYXNlIDB4MTEwMDogcy0+d2F2ZWZvcm0gPSBsb3dwYXNzX2NvbHVtbl9taXJyb3I7IGJyZWFrOworICAgIGNhc2UgMHgxMDAwOiBzLT53YXZlZm9ybSA9IGxvd3Bhc3Nfcm93X21pcnJvcjsgICAgYnJlYWs7CisgICAgY2FzZSAweDAxMDA6IHMtPndhdmVmb3JtID0gbG93cGFzc19jb2x1bW47ICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDAwMDogcy0+d2F2ZWZvcm0gPSBsb3dwYXNzX3JvdzsgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMTEwOiBzLT53YXZlZm9ybSA9IGxvd3Bhc3MxNl9jb2x1bW5fbWlycm9yOyBicmVhazsKKyAgICBjYXNlIDB4MTAxMDogcy0+d2F2ZWZvcm0gPSBsb3dwYXNzMTZfcm93X21pcnJvcjsgICAgYnJlYWs7CisgICAgY2FzZSAweDAxMTA6IHMtPndhdmVmb3JtID0gbG93cGFzczE2X2NvbHVtbjsgICAgICAgIGJyZWFrOworICAgIGNhc2UgMHgwMDEwOiBzLT53YXZlZm9ybSA9IGxvd3Bhc3MxNl9yb3c7ICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTEwMToKKyAgICBjYXNlIDB4MTAwMToKKyAgICBjYXNlIDB4MDEwMToKKyAgICBjYXNlIDB4MDAwMTogcy0+d2F2ZWZvcm0gPSBmbGF0OyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgxMTExOgorICAgIGNhc2UgMHgxMDExOgorICAgIGNhc2UgMHgwMTExOgorICAgIGNhc2UgMHgwMDExOiBzLT53YXZlZm9ybSA9IGZsYXQxNjsgICAgYnJlYWs7CisgICAgY2FzZSAweDExMDI6IHMtPndhdmVmb3JtID0gYWZsYXRfY29sdW1uX21pcnJvcjsgYnJlYWs7CisgICAgY2FzZSAweDEwMDI6IHMtPndhdmVmb3JtID0gYWZsYXRfcm93X21pcnJvcjsgICAgYnJlYWs7CisgICAgY2FzZSAweDAxMDI6IHMtPndhdmVmb3JtID0gYWZsYXRfY29sdW1uOyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAwMDI6IHMtPndhdmVmb3JtID0gYWZsYXRfcm93OyAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDExMTI6IHMtPndhdmVmb3JtID0gYWZsYXQxNl9jb2x1bW5fbWlycm9yOyBicmVhazsKKyAgICBjYXNlIDB4MTAxMjogcy0+d2F2ZWZvcm0gPSBhZmxhdDE2X3Jvd19taXJyb3I7ICAgIGJyZWFrOworICAgIGNhc2UgMHgwMTEyOiBzLT53YXZlZm9ybSA9IGFmbGF0MTZfY29sdW1uOyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDAwMTI6IHMtPndhdmVmb3JtID0gYWZsYXQxNl9yb3c7ICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTEwMzoKKyAgICBjYXNlIDB4MTAwMzoKKyAgICBjYXNlIDB4MDEwMzoKKyAgICBjYXNlIDB4MDAwMzogcy0+d2F2ZWZvcm0gPSBjaHJvbWE7ICAgIGJyZWFrOworICAgIGNhc2UgMHgxMTEzOgorICAgIGNhc2UgMHgxMDEzOgorICAgIGNhc2UgMHgwMTEzOgorICAgIGNhc2UgMHgwMDEzOiBzLT53YXZlZm9ybSA9IGNocm9tYTE2OyAgYnJlYWs7CisgICAgY2FzZSAweDExMDQ6CisgICAgY2FzZSAweDEwMDQ6CisgICAgY2FzZSAweDAxMDQ6CisgICAgY2FzZSAweDAwMDQ6IHMtPndhdmVmb3JtID0gY29sb3I7ICAgICBicmVhazsKKyAgICBjYXNlIDB4MTExNDoKKyAgICBjYXNlIDB4MTAxNDoKKyAgICBjYXNlIDB4MDExNDoKKyAgICBjYXNlIDB4MDAxNDogcy0+d2F2ZWZvcm0gPSBjb2xvcjE2OyAgIGJyZWFrOworICAgIGNhc2UgMHgxMTA1OgorICAgIGNhc2UgMHgxMDA1OgorICAgIGNhc2UgMHgwMTA1OgorICAgIGNhc2UgMHgwMDA1OiBzLT53YXZlZm9ybSA9IGFjb2xvcjsgICAgYnJlYWs7CisgICAgY2FzZSAweDExMTU6CisgICAgY2FzZSAweDEwMTU6CisgICAgY2FzZSAweDAxMTU6CisgICAgY2FzZSAweDAwMTU6IHMtPndhdmVmb3JtID0gYWNvbG9yMTY7ICBicmVhazsKKyAgICBjYXNlIDB4MTEwNjogcy0+d2F2ZWZvcm0gPSB4ZmxhdF9jb2x1bW5fbWlycm9yOyBicmVhazsKKyAgICBjYXNlIDB4MTAwNjogcy0+d2F2ZWZvcm0gPSB4ZmxhdF9yb3dfbWlycm9yOyAgICBicmVhazsKKyAgICBjYXNlIDB4MDEwNjogcy0+d2F2ZWZvcm0gPSB4ZmxhdF9jb2x1bW47ICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDAwNjogcy0+d2F2ZWZvcm0gPSB4ZmxhdF9yb3c7ICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MTExNjogcy0+d2F2ZWZvcm0gPSB4ZmxhdDE2X2NvbHVtbl9taXJyb3I7IGJyZWFrOworICAgIGNhc2UgMHgxMDE2OiBzLT53YXZlZm9ybSA9IHhmbGF0MTZfcm93X21pcnJvcjsgICAgYnJlYWs7CisgICAgY2FzZSAweDAxMTY6IHMtPndhdmVmb3JtID0geGZsYXQxNl9jb2x1bW47ICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MDAxNjogcy0+d2F2ZWZvcm0gPSB4ZmxhdDE2X3JvdzsgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHMtPmdyYXRfeXV2YV9jb2xvclswXSA9IDI1NTsKKyAgICBzLT5ncmF0X3l1dmFfY29sb3JbMl0gPSBzLT5ncmF0aWN1bGUgPT0gMiA/IDI1NSA6IDA7CisgICAgcy0+Z3JhdF95dXZhX2NvbG9yWzNdID0gMjU1OworCiAgICAgc3dpdGNoIChzLT5maWx0ZXIpIHsKICAgICBjYXNlIExPV1BBU1M6Ci0gICAgICAgICAgICBzLT5zaXplID0gMjU2OwotICAgICAgICAgICAgcy0+d2F2ZWZvcm0gPSBzLT5iaXRzID4gOCA/IGxvd3Bhc3MxNiA6IGxvd3Bhc3M7IGJyZWFrOwotICAgIGNhc2UgRkxBVDoKLSAgICAgICAgICAgIHMtPnNpemUgPSAyNTYgKiAzOwotICAgICAgICAgICAgcy0+d2F2ZWZvcm0gPSBmbGF0OyAgICBicmVhazsKLSAgICBjYXNlIEFGTEFUOgotICAgICAgICAgICAgcy0+c2l6ZSA9IDI1NiAqIDI7Ci0gICAgICAgICAgICBzLT53YXZlZm9ybSA9IGFmbGF0OyAgIGJyZWFrOwotICAgIGNhc2UgQ0hST01BOgotICAgICAgICAgICAgcy0+c2l6ZSA9IDI1NiAqIDI7Ci0gICAgICAgICAgICBzLT53YXZlZm9ybSA9IGNocm9tYTsgIGJyZWFrOwotICAgIGNhc2UgQUNIUk9NQToKLSAgICAgICAgICAgIHMtPnNpemUgPSAyNTY7Ci0gICAgICAgICAgICBzLT53YXZlZm9ybSA9IGFjaHJvbWE7IGJyZWFrOwogICAgIGNhc2UgQ09MT1I6Ci0gICAgICAgICAgICBzLT5zaXplID0gMjU2OwotICAgICAgICAgICAgcy0+d2F2ZWZvcm0gPSBzLT5iaXRzID4gOCA/ICAgY29sb3IxNiA6ICAgY29sb3I7IGJyZWFrOworICAgIGNhc2UgQUNPTE9SOgorICAgIGNhc2UgQ0hST01BOgorICAgIGNhc2UgQUZMQVQ6CisgICAgY2FzZSBYRkxBVDoKKyAgICBjYXNlIEZMQVQ6CisgICAgICAgIGlmIChzLT5ncmF0aWN1bGUgJiYgcy0+bW9kZSA9PSAxKQorICAgICAgICAgICAgcy0+Z3JhdGljdWxlZiA9IHMtPmJpdHMgPiA4ID8gZ3JhdGljdWxlMTZfY29sdW1uIDogZ3JhdGljdWxlX2NvbHVtbjsKKyAgICAgICAgZWxzZSBpZiAocy0+Z3JhdGljdWxlICYmIHMtPm1vZGUgPT0gMCkKKyAgICAgICAgICAgIHMtPmdyYXRpY3VsZWYgPSBzLT5iaXRzID4gOCA/IGdyYXRpY3VsZTE2X3JvdyA6IGdyYXRpY3VsZV9yb3c7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAocy0+ZmlsdGVyKSB7CisgICAgY2FzZSBDT0xPUjoKKyAgICBjYXNlIEFDT0xPUjoKKyAgICBjYXNlIExPV1BBU1M6CisgICAgICAgIHN3aXRjaCAocy0+c2NhbGUpIHsKKyAgICAgICAgY2FzZSBESUdJVEFMOgorICAgICAgICAgICAgc3dpdGNoIChzLT5iaXRzKSB7CisgICAgICAgICAgICBjYXNlICA4OiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilkaWdpdGFsODsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGRpZ2l0YWw4KTsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgOTogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopZGlnaXRhbDk7ICBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhkaWdpdGFsOSk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWRpZ2l0YWwxMDsgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoZGlnaXRhbDEwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyOiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilkaWdpdGFsMTI7IHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGRpZ2l0YWwxMik7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUlMTElWT0xUUzoKKyAgICAgICAgICAgIHN3aXRjaCAocy0+Yml0cykgeworICAgICAgICAgICAgY2FzZSAgODogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopbWlsbGl2b2x0czg7ICBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhtaWxsaXZvbHRzOCk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDk6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKW1pbGxpdm9sdHM5OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMobWlsbGl2b2x0czkpOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKiltaWxsaXZvbHRzMTA7IHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKG1pbGxpdm9sdHMxMCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopbWlsbGl2b2x0czEyOyBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhtaWxsaXZvbHRzMTIpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElSRToKKyAgICAgICAgICAgIHN3aXRjaCAocy0+Yml0cykgeworICAgICAgICAgICAgY2FzZSAgODogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopaXJlODsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGlyZTgpOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA5OiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilpcmU5OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoaXJlOSk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWlyZTEwOyBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhpcmUxMCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopaXJlMTI7IHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGlyZTEyKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENIUk9NQToKKyAgICAgICAgc3dpdGNoIChzLT5zY2FsZSkgeworICAgICAgICBjYXNlIERJR0lUQUw6CisgICAgICAgICAgICBzd2l0Y2ggKHMtPmJpdHMpIHsKKyAgICAgICAgICAgIGNhc2UgIDg6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWNocm9tYV9kaWdpdGFsODsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGNocm9tYV9kaWdpdGFsOCk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDk6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWNocm9tYV9kaWdpdGFsOTsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGNocm9tYV9kaWdpdGFsOSk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWNocm9tYV9kaWdpdGFsMTA7IHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGNocm9tYV9kaWdpdGFsMTApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWNocm9tYV9kaWdpdGFsMTI7IHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGNocm9tYV9kaWdpdGFsMTIpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1JTExJVk9MVFM6CisgICAgICAgICAgICBzd2l0Y2ggKHMtPmJpdHMpIHsKKyAgICAgICAgICAgIGNhc2UgIDg6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKW1pbGxpdm9sdHM4OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMobWlsbGl2b2x0czgpOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA5OiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKiltaWxsaXZvbHRzOTsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKG1pbGxpdm9sdHM5KTsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopbWlsbGl2b2x0czEwOyBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhtaWxsaXZvbHRzMTApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKW1pbGxpdm9sdHMxMjsgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMobWlsbGl2b2x0czEyKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJUkU6CisgICAgICAgICAgICBzd2l0Y2ggKHMtPmJpdHMpIHsKKyAgICAgICAgICAgIGNhc2UgIDg6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWlyZTg7ICBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhpcmU4KTsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgOTogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopaXJlOTsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGlyZTkpOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilpcmUxMDsgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoaXJlMTApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWlyZTEyOyBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhpcmUxMik7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkxBVDoKKyAgICBjYXNlIEFGTEFUOgorICAgICAgICBzd2l0Y2ggKHMtPnNjYWxlKSB7CisgICAgICAgIGNhc2UgRElHSVRBTDoKKyAgICAgICAgICAgIHN3aXRjaCAocy0+Yml0cykgeworICAgICAgICAgICAgY2FzZSAgODogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopYWZsYXRfZGlnaXRhbDg7ICBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhhZmxhdF9kaWdpdGFsOCk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDk6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWFmbGF0X2RpZ2l0YWw5OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoYWZsYXRfZGlnaXRhbDkpOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilhZmxhdF9kaWdpdGFsMTA7IHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGFmbGF0X2RpZ2l0YWwxMCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopYWZsYXRfZGlnaXRhbDEyOyBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhhZmxhdF9kaWdpdGFsMTIpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1JTExJVk9MVFM6CisgICAgICAgICAgICBzd2l0Y2ggKHMtPmJpdHMpIHsKKyAgICAgICAgICAgIGNhc2UgIDg6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWFmbGF0X21pbGxpdm9sdHM4OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoYWZsYXRfbWlsbGl2b2x0czgpOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA5OiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilhZmxhdF9taWxsaXZvbHRzOTsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGFmbGF0X21pbGxpdm9sdHM5KTsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopYWZsYXRfbWlsbGl2b2x0czEwOyBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhhZmxhdF9taWxsaXZvbHRzMTApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWFmbGF0X21pbGxpdm9sdHMxMjsgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoYWZsYXRfbWlsbGl2b2x0czEyKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBJUkU6CisgICAgICAgICAgICBzd2l0Y2ggKHMtPmJpdHMpIHsKKyAgICAgICAgICAgIGNhc2UgIDg6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWFmbGF0X2lyZTg7ICBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhhZmxhdF9pcmU4KTsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgOTogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopYWZsYXRfaXJlOTsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGFmbGF0X2lyZTkpOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilhZmxhdF9pcmUxMDsgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoYWZsYXRfaXJlMTApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWFmbGF0X2lyZTEyOyBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhhZmxhdF9pcmUxMik7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGTEFUOgorICAgICAgICBzd2l0Y2ggKHMtPnNjYWxlKSB7CisgICAgICAgIGNhc2UgRElHSVRBTDoKKyAgICAgICAgICAgIHN3aXRjaCAocy0+Yml0cykgeworICAgICAgICAgICAgY2FzZSAgODogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopZmxhdF9kaWdpdGFsODsgIHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGZsYXRfZGlnaXRhbDgpOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICA5OiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilmbGF0X2RpZ2l0YWw5OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoZmxhdF9kaWdpdGFsOSk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWZsYXRfZGlnaXRhbDEwOyBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhmbGF0X2RpZ2l0YWwxMCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopZmxhdF9kaWdpdGFsMTI7IHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGZsYXRfZGlnaXRhbDEyKTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNSUxMSVZPTFRTOgorICAgICAgICAgICAgc3dpdGNoIChzLT5iaXRzKSB7CisgICAgICAgICAgICBjYXNlICA4OiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilmbGF0X21pbGxpdm9sdHM4OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoZmxhdF9taWxsaXZvbHRzOCk7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgIDk6IHMtPmdsaW5lcyA9IChHcmF0aWN1bGVMaW5lcyAqKWZsYXRfbWlsbGl2b2x0czk7ICBzLT5uYl9nbGluZXMgPSBGRl9BUlJBWV9FTEVNUyhmbGF0X21pbGxpdm9sdHM5KTsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopZmxhdF9taWxsaXZvbHRzMTA7IHMtPm5iX2dsaW5lcyA9IEZGX0FSUkFZX0VMRU1TKGZsYXRfbWlsbGl2b2x0czEwKTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyOiBzLT5nbGluZXMgPSAoR3JhdGljdWxlTGluZXMgKilmbGF0X21pbGxpdm9sdHMxMjsgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoZmxhdF9taWxsaXZvbHRzMTIpOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElSRToKKyAgICAgICAgICAgIHN3aXRjaCAocy0+Yml0cykgeworICAgICAgICAgICAgY2FzZSAgODogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopZmxhdF9pcmU4OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoZmxhdF9pcmU4KTsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgOTogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopZmxhdF9pcmU5OyAgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoZmxhdF9pcmU5KTsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopZmxhdF9pcmUxMDsgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoZmxhdF9pcmUxMCk7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjogcy0+Z2xpbmVzID0gKEdyYXRpY3VsZUxpbmVzICopZmxhdF9pcmUxMjsgcy0+bmJfZ2xpbmVzID0gRkZfQVJSQVlfRUxFTVMoZmxhdF9pcmUxMik7IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgcy0+c2l6ZSA9IHMtPnNpemUgPDwgKHMtPmJpdHMgLSA4KTsKQEAgLTExMjAsMTIgKzI3MzEsMTYgQEAKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDoKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDk6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxMDoKLSAgICAgICAgcy0+YmdfY29sb3IgPSBibGFja19nYnJwX2NvbG9yOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTI6CisgICAgICAgIG1lbWNweShzLT5iZ19jb2xvciwgYmxhY2tfZ2JycF9jb2xvciwgc2l6ZW9mKHMtPmJnX2NvbG9yKSk7CisgICAgICAgIHMtPmdyYXRpY3VsZWYgPSBncmF0aWN1bGVfbm9uZTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgcy0+YmdfY29sb3IgPSBibGFja195dXZhX2NvbG9yOworICAgICAgICBtZW1jcHkocy0+YmdfY29sb3IsIGJsYWNrX3l1dmFfY29sb3IsIHNpemVvZihzLT5iZ19jb2xvcikpOwogICAgIH0KIAorICAgIHMtPmJnX2NvbG9yWzNdICo9IHMtPmJnb3BhY2l0eTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0xMTM0LDIwICsyNzQ5LDI1IEBACiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CiAgICAgQVZGaWx0ZXJMaW5rICppbmxpbmsgPSBjdHgtPmlucHV0c1swXTsKICAgICBXYXZlZm9ybUNvbnRleHQgKnMgPSBjdHgtPnByaXY7Ci0gICAgaW50IGNvbXAgPSAwLCBpLCBqID0gMCwgaywgcCwgc2l6ZSwgc2hpZnQ7CisgICAgaW50IGNvbXAgPSAwLCBpLCBqID0gMCwgaywgcCwgc2l6ZTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uY29tcDsgaSsrKSB7CiAgICAgICAgIGlmICgoMSA8PCBpKSAmIHMtPnBjb21wKQogICAgICAgICAgICAgY29tcCsrOwogICAgIH0KKyAgICBzLT5hY29tcCA9IGNvbXA7CisgICAgcy0+b2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KG91dGxpbmstPmZvcm1hdCk7CisgICAgcy0+ZGNvbXAgPSBzLT5vZGVzYy0+bmJfY29tcG9uZW50czsKIAogICAgIGF2X2ZyZWVwKCZzLT5wZWFrKTsKIAogICAgIGlmIChzLT5tb2RlKSB7Ci0gICAgICAgIG91dGxpbmstPmggPSBzLT5zaXplICogRkZNQVgoY29tcCAqIHMtPmRpc3BsYXksIDEpOworICAgICAgICBvdXRsaW5rLT5oID0gcy0+c2l6ZSAqIEZGTUFYKGNvbXAgKiAocy0+ZGlzcGxheSA9PSBTVEFDSyksIDEpOworICAgICAgICBvdXRsaW5rLT53ID0gaW5saW5rLT53ICogRkZNQVgoY29tcCAqIChzLT5kaXNwbGF5ID09IFBBUkFERSksIDEpOwogICAgICAgICBzaXplID0gaW5saW5rLT53OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dGxpbmstPncgPSBzLT5zaXplICogRkZNQVgoY29tcCAqIHMtPmRpc3BsYXksIDEpOworICAgICAgICBvdXRsaW5rLT53ID0gcy0+c2l6ZSAqIEZGTUFYKGNvbXAgKiAocy0+ZGlzcGxheSA9PSBTVEFDSyksIDEpOworICAgICAgICBvdXRsaW5rLT5oID0gaW5saW5rLT5oICogRkZNQVgoY29tcCAqIChzLT5kaXNwbGF5ID09IFBBUkFERSksIDEpOwogICAgICAgICBzaXplID0gaW5saW5rLT5oOwogICAgIH0KIApAQCAtMTE1NSwyNiArMjc3NSwyMSBAQAogICAgIGlmICghcy0+cGVhaykKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIGZvciAocCA9IDA7IHAgPCA0OyBwKyspIHsKLSAgICAgICAgY29uc3QgaW50IGlzX2Nocm9tYSA9IChwID09IDEgfHwgcCA9PSAyKTsKLSAgICAgICAgY29uc3QgaW50IHNoaWZ0X3cgPSAoaXNfY2hyb21hID8gcy0+ZGVzYy0+bG9nMl9jaHJvbWFfdyA6IDApOwotICAgICAgICBjb25zdCBpbnQgc2hpZnRfaCA9IChpc19jaHJvbWEgPyBzLT5kZXNjLT5sb2cyX2Nocm9tYV9oIDogMCk7CisgICAgZm9yIChwID0gMDsgcCA8IHMtPm5jb21wOyBwKyspIHsKICAgICAgICAgY29uc3QgaW50IHBsYW5lID0gcy0+ZGVzYy0+Y29tcFtwXS5wbGFuZTsKICAgICAgICAgaW50IG9mZnNldDsKIAogICAgICAgICBpZiAoISgoMSA8PCBwKSAmIHMtPnBjb21wKSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIHNoaWZ0ID0gcy0+bW9kZSA/IHNoaWZ0X2ggOiBzaGlmdF93OwotCiAgICAgICAgIGZvciAoayA9IDA7IGsgPCA0OyBrKyspIHsKICAgICAgICAgICAgIHMtPmVtYXhbcGxhbmVdW2tdID0gcy0+cGVhayArIHNpemUgKiAocGxhbmUgKiA0ICsgayArIDApOwogICAgICAgICAgICAgcy0+ZW1pbltwbGFuZV1ba10gPSBzLT5wZWFrICsgc2l6ZSAqIChwbGFuZSAqIDQgKyBrICsgMTYpOwogICAgICAgICB9CiAKLSAgICAgICAgb2Zmc2V0ID0gaisrICogcy0+c2l6ZSAqIHMtPmRpc3BsYXk7Ci0gICAgICAgIHMtPmVzdGFydFtwbGFuZV0gPSBvZmZzZXQgPj4gc2hpZnQ7Ci0gICAgICAgIHMtPmVlbmRbcGxhbmVdICAgPSAob2Zmc2V0ICsgcy0+c2l6ZSAtIDEpID4+IHNoaWZ0OworICAgICAgICBvZmZzZXQgPSBqKysgKiBzLT5zaXplICogKHMtPmRpc3BsYXkgPT0gU1RBQ0spOworICAgICAgICBzLT5lc3RhcnRbcGxhbmVdID0gb2Zmc2V0OworICAgICAgICBzLT5lZW5kW3BsYW5lXSAgID0gKG9mZnNldCArIHMtPnNpemUgLSAxKTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDQ7IGsrKykgewogICAgICAgICAgICAgICAgIHMtPmVtYXhbcGxhbmVdW2tdW2ldID0gcy0+ZXN0YXJ0W3BsYW5lXTsKQEAgLTEyMDIsMzQgKzI4MTcsNDIgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAgICAgb3V0LT5wdHMgPSBpbi0+cHRzOworICAgIG91dC0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9KUEVHOwogCi0gICAgZm9yIChrID0gMDsgayA8IHMtPm5jb21wOyBrKyspIHsKLSAgICAgICAgY29uc3QgaW50IGlzX2Nocm9tYSA9IChrID09IDEgfHwgayA9PSAyKTsKLSAgICAgICAgY29uc3QgaW50IGRzdF9oID0gQVZfQ0VJTF9SU0hJRlQob3V0bGluay0+aCwgKGlzX2Nocm9tYSA/IHMtPmRlc2MtPmxvZzJfY2hyb21hX2ggOiAwKSk7Ci0gICAgICAgIGNvbnN0IGludCBkc3RfdyA9IEFWX0NFSUxfUlNISUZUKG91dGxpbmstPncsIChpc19jaHJvbWEgPyBzLT5kZXNjLT5sb2cyX2Nocm9tYV93IDogMCkpOworICAgIGZvciAoayA9IDA7IGsgPCBzLT5kY29tcDsgaysrKSB7CiAgICAgICAgIGlmIChzLT5iaXRzIDw9IDgpIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkc3RfaCA7IGkrKykKLSAgICAgICAgICAgICAgICBtZW1zZXQob3V0LT5kYXRhW3MtPmRlc2MtPmNvbXBba10ucGxhbmVdICsKLSAgICAgICAgICAgICAgICAgICAgICAgaSAqIG91dC0+bGluZXNpemVbcy0+ZGVzYy0+Y29tcFtrXS5wbGFuZV0sCi0gICAgICAgICAgICAgICAgICAgICAgIHMtPmJnX2NvbG9yW2tdLCBkc3Rfdyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0bGluay0+aCA7IGkrKykKKyAgICAgICAgICAgICAgICBtZW1zZXQob3V0LT5kYXRhW3MtPm9kZXNjLT5jb21wW2tdLnBsYW5lXSArCisgICAgICAgICAgICAgICAgICAgICAgIGkgKiBvdXQtPmxpbmVzaXplW3MtPm9kZXNjLT5jb21wW2tdLnBsYW5lXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+YmdfY29sb3Jba10sIG91dGxpbmstPncpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgaW50IG11bHQgPSBzLT5zaXplIC8gMjU2OwotICAgICAgICAgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtzLT5kZXNjLT5jb21wW2tdLnBsYW5lXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBtdWx0ID0gcy0+bWF4IC8gMjU2OworICAgICAgICAgICAgdWludDE2X3QgKmRzdCA9ICh1aW50MTZfdCAqKW91dC0+ZGF0YVtzLT5vZGVzYy0+Y29tcFtrXS5wbGFuZV07CiAKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkc3RfaCA7IGkrKykgewotICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBkc3RfdzsgaisrKQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG91dGxpbmstPmggOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgb3V0bGluay0+dzsgaisrKQogICAgICAgICAgICAgICAgICAgICBkc3Rbal0gPSBzLT5iZ19jb2xvcltrXSAqIG11bHQ7Ci0gICAgICAgICAgICAgICAgZHN0ICs9IG91dC0+bGluZXNpemVbcy0+ZGVzYy0+Y29tcFtrXS5wbGFuZV0gLyAyOworICAgICAgICAgICAgICAgIGRzdCArPSBvdXQtPmxpbmVzaXplW3MtPm9kZXNjLT5jb21wW2tdLnBsYW5lXSAvIDI7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBmb3IgKGsgPSAwLCBpID0gMDsgayA8IHMtPm5jb21wOyBrKyspIHsKICAgICAgICAgaWYgKCgxIDw8IGspICYgcy0+cGNvbXApIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBvZmZzZXQgPSBpKysgKiBzLT5zaXplICogcy0+ZGlzcGxheTsKLSAgICAgICAgICAgIHMtPndhdmVmb3JtKHMsIGluLCBvdXQsIGssIHMtPmludGVuc2l0eSwgb2Zmc2V0LCBzLT5tb2RlKTsKKyAgICAgICAgICAgIGludCBvZmZzZXRfeTsKKyAgICAgICAgICAgIGludCBvZmZzZXRfeDsKKworICAgICAgICAgICAgaWYgKHMtPmRpc3BsYXkgPT0gUEFSQURFKSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0X3ggPSBzLT5tb2RlID8gaSsrICogaW5saW5rLT53IDogMDsKKyAgICAgICAgICAgICAgICBvZmZzZXRfeSA9IHMtPm1vZGUgPyAwIDogaSsrICogaW5saW5rLT5oOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfeSA9IHMtPm1vZGUgPyBpKysgKiBzLT5zaXplICogISFzLT5kaXNwbGF5IDogMDsKKyAgICAgICAgICAgICAgICBvZmZzZXRfeCA9IHMtPm1vZGUgPyAwIDogaSsrICogcy0+c2l6ZSAqICEhcy0+ZGlzcGxheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPndhdmVmb3JtKHMsIGluLCBvdXQsIGssIHMtPmludGVuc2l0eSwgb2Zmc2V0X3ksIG9mZnNldF94LCBzLT5tb2RlLCBzLT5taXJyb3IpOwogICAgICAgICB9CiAgICAgfQorICAgIHMtPmdyYXRpY3VsZWYocywgb3V0KTsKIAogICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKICAgICByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dCk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl93ZWF2ZS5jIGIvbGliYXZmaWx0ZXIvdmZfd2VhdmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzdmNWQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfd2VhdmUuYwpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImF2ZmlsdGVyLmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgV2VhdmVDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZmlyc3RfZmllbGQ7CisgICAgaW50IGRvdWJsZV93ZWF2ZTsKKyAgICBpbnQgbmJfcGxhbmVzOworICAgIGludCBwbGFuZWhlaWdodFs0XTsKKyAgICBpbnQgbGluZXNpemVbNF07CisKKyAgICBBVkZyYW1lICpwcmV2OworfSBXZWF2ZUNvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFdlYXZlQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BBUkFNfEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNCisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB3ZWF2ZV9vcHRpb25zW10gPSB7CisgICAgeyAiZmlyc3RfZmllbGQiLCAic2V0IGZpcnN0IGZpZWxkIiwgT0ZGU0VUKGZpcnN0X2ZpZWxkKSwgQVZfT1BUX1RZUEVfSU5ULCAgIHsuaTY0PTB9LCAwLCAxLCBGTEFHUywgImZpZWxkIn0sCisgICAgICAgIHsgInRvcCIsICAgICAic2V0IHRvcCBmaWVsZCBmaXJzdCIsICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBGTEFHUywgImZpZWxkIn0sCisgICAgICAgIHsgInQiLCAgICAgICAic2V0IHRvcCBmaWVsZCBmaXJzdCIsICAgICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTB9LCAwLCAwLCBGTEFHUywgImZpZWxkIn0sCisgICAgICAgIHsgImJvdHRvbSIsICAic2V0IGJvdHRvbSBmaWVsZCBmaXJzdCIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgImZpZWxkIn0sCisgICAgICAgIHsgImIiLCAgICAgICAic2V0IGJvdHRvbSBmaWVsZCBmaXJzdCIsICAgICAgICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0PTF9LCAwLCAwLCBGTEFHUywgImZpZWxkIn0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRklMVEVSX0RFRklORV9DTEFTUyh3ZWF2ZSk7CisKK3N0YXRpYyBpbnQgY29uZmlnX3Byb3BzX291dHB1dChBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CisgICAgV2VhdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIEFWRmlsdGVyTGluayAqaW5saW5rID0gY3R4LT5pbnB1dHNbMF07CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpbmxpbmstPmZvcm1hdCk7CisgICAgaW50IHJldDsKKworICAgIGlmICghcy0+ZG91YmxlX3dlYXZlKSB7CisgICAgICAgIG91dGxpbmstPnRpbWVfYmFzZS5udW0gPSBpbmxpbmstPnRpbWVfYmFzZS5udW0gKiAyOworICAgICAgICBvdXRsaW5rLT50aW1lX2Jhc2UuZGVuID0gaW5saW5rLT50aW1lX2Jhc2UuZGVuOworICAgICAgICBvdXRsaW5rLT5mcmFtZV9yYXRlLm51bSA9IGlubGluay0+ZnJhbWVfcmF0ZS5udW07CisgICAgICAgIG91dGxpbmstPmZyYW1lX3JhdGUuZGVuID0gaW5saW5rLT5mcmFtZV9yYXRlLmRlbiAqIDI7CisgICAgfQorICAgIG91dGxpbmstPncgPSBpbmxpbmstPnc7CisgICAgb3V0bGluay0+aCA9IGlubGluay0+aCAqIDI7CisKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKHMtPmxpbmVzaXplLCBpbmxpbmstPmZvcm1hdCwgaW5saW5rLT53KSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+cGxhbmVoZWlnaHRbMV0gPSBzLT5wbGFuZWhlaWdodFsyXSA9IEFWX0NFSUxfUlNISUZUKGlubGluay0+aCwgZGVzYy0+bG9nMl9jaHJvbWFfaCk7CisgICAgcy0+cGxhbmVoZWlnaHRbMF0gPSBzLT5wbGFuZWhlaWdodFszXSA9IGlubGluay0+aDsKKworICAgIHMtPm5iX3BsYW5lcyA9IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGlubGluay0+Zm9ybWF0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCit7CisgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKKyAgICBXZWF2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgICAgQVZGaWx0ZXJMaW5rICpvdXRsaW5rID0gY3R4LT5vdXRwdXRzWzBdOworICAgIEFWRnJhbWUgKm91dDsKKyAgICBpbnQgaTsKKworICAgIGlmICghcy0+cHJldikgeworICAgICAgICBzLT5wcmV2ID0gaW47CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG91dCA9IGZmX2dldF92aWRlb19idWZmZXIob3V0bGluaywgb3V0bGluay0+dywgb3V0bGluay0+aCk7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmaW4pOworICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5wcmV2KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisgICAgYXZfZnJhbWVfY29weV9wcm9wcyhvdXQsIGluKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9wbGFuZXM7IGkrKykgeworICAgICAgICBpZiAocy0+ZG91YmxlX3dlYXZlICYmICEoaW5saW5rLT5mcmFtZV9jb3VudF9vdXQgJiAxKSkgeworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbaV0gKyBvdXQtPmxpbmVzaXplW2ldICogcy0+Zmlyc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bGluZXNpemVbaV0gKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVtpXSwgaW4tPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZVtpXSwgcy0+cGxhbmVoZWlnaHRbaV0pOworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbaV0gKyBvdXQtPmxpbmVzaXplW2ldICogIXMtPmZpcnN0X2ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmxpbmVzaXplW2ldICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldi0+ZGF0YVtpXSwgcy0+cHJldi0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmxpbmVzaXplW2ldLCBzLT5wbGFuZWhlaWdodFtpXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9pbWFnZV9jb3B5X3BsYW5lKG91dC0+ZGF0YVtpXSArIG91dC0+bGluZXNpemVbaV0gKiAhcy0+Zmlyc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bGluZXNpemVbaV0gKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbi0+ZGF0YVtpXSwgaW4tPmxpbmVzaXplW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5saW5lc2l6ZVtpXSwgcy0+cGxhbmVoZWlnaHRbaV0pOworICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShvdXQtPmRhdGFbaV0gKyBvdXQtPmxpbmVzaXplW2ldICogcy0+Zmlyc3RfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC0+bGluZXNpemVbaV0gKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcmV2LT5kYXRhW2ldLCBzLT5wcmV2LT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bGluZXNpemVbaV0sIHMtPnBsYW5laGVpZ2h0W2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG91dC0+cHRzID0gcy0+ZG91YmxlX3dlYXZlID8gcy0+cHJldi0+cHRzIDogaW4tPnB0cyAvIDI7CisgICAgb3V0LT5pbnRlcmxhY2VkX2ZyYW1lID0gMTsKKyAgICBvdXQtPnRvcF9maWVsZF9maXJzdCA9ICFzLT5maXJzdF9maWVsZDsKKworICAgIGlmICghcy0+ZG91YmxlX3dlYXZlKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZpbik7CisgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldik7CisgICAgaWYgKHMtPmRvdWJsZV93ZWF2ZSkKKyAgICAgICAgcy0+cHJldiA9IGluOworICAgIHJldHVybiBmZl9maWx0ZXJfZnJhbWUob3V0bGluaywgb3V0KTsKK30KKworc3RhdGljIGF2X2NvbGQgdm9pZCB1bmluaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgV2VhdmVDb250ZXh0ICpzID0gY3R4LT5wcml2OworCisgICAgYXZfZnJhbWVfZnJlZSgmcy0+cHJldik7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCB3ZWF2ZV9pbnB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmZpbHRlcl9mcmFtZSAgICAgPSBmaWx0ZXJfZnJhbWUsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGNvbnN0IEFWRmlsdGVyUGFkIHdlYXZlX291dHB1dHNbXSA9IHsKKyAgICB7CisgICAgICAgIC5uYW1lICAgICAgICAgID0gImRlZmF1bHQiLAorICAgICAgICAudHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAgICAgICAgLmNvbmZpZ19wcm9wcyAgPSBjb25maWdfcHJvcHNfb3V0cHV0LAorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK0FWRmlsdGVyIGZmX3ZmX3dlYXZlID0geworICAgIC5uYW1lICAgICAgICAgID0gIndlYXZlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXZWF2ZSBpbnB1dCB2aWRlbyBmaWVsZHMgaW50byBmcmFtZXMuIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoV2VhdmVDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICA9ICZ3ZWF2ZV9jbGFzcywKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IHdlYXZlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHdlYXZlX291dHB1dHMsCit9OworCitzdGF0aWMgYXZfY29sZCBpbnQgaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBXZWF2ZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CisKKyAgICBpZiAoIXN0cmNtcChjdHgtPmZpbHRlci0+bmFtZSwgImRvdWJsZXdlYXZlIikpCisgICAgICAgIHMtPmRvdWJsZV93ZWF2ZSA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBkb3VibGV3ZWF2ZV9vcHRpb25zIHdlYXZlX29wdGlvbnMKK0FWRklMVEVSX0RFRklORV9DTEFTUyhkb3VibGV3ZWF2ZSk7CisKK0FWRmlsdGVyIGZmX3ZmX2RvdWJsZXdlYXZlID0geworICAgIC5uYW1lICAgICAgICAgID0gImRvdWJsZXdlYXZlIiwKKyAgICAuZGVzY3JpcHRpb24gICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJXZWF2ZSBpbnB1dCB2aWRlbyBmaWVsZHMgaW50byBkb3VibGUgbnVtYmVyIG9mIGZyYW1lcy4iKSwKKyAgICAucHJpdl9zaXplICAgICA9IHNpemVvZihXZWF2ZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJmRvdWJsZXdlYXZlX2NsYXNzLAorICAgIC5pbml0ICAgICAgICAgID0gaW5pdCwKKyAgICAudW5pbml0ICAgICAgICA9IHVuaW5pdCwKKyAgICAuaW5wdXRzICAgICAgICA9IHdlYXZlX2lucHV0cywKKyAgICAub3V0cHV0cyAgICAgICA9IHdlYXZlX291dHB1dHMsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfeGJyLmMgYi9saWJhdmZpbHRlci92Zl94YnIuYwppbmRleCBjOTJlOWE4Li43ODA5NGUwIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl94YnIuYworKysgYi9saWJhdmZpbHRlci92Zl94YnIuYwpAQCAtMzcsOSArMzcsMTMgQEAKICNkZWZpbmUgUkVEX0JMVUVfTUFTSyAweDAwRkYwMEZGCiAjZGVmaW5lIEdSRUVOX01BU0sgICAgMHgwMDAwRkYwMAogCisjaWZkZWYgUEkKKyN1bmRlZiBQSQorI2VuZGlmCisKIHR5cGVkZWYgaW50ICgqeGJyZnVuY190KShBVkZpbHRlckNvbnRleHQgKmN0eCwgdm9pZCAqYXJnLCBpbnQgam9ibnIsIGludCBuYl9qb2JzKTsKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgWEJSQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IG47CiAgICAgeGJyZnVuY190IGZ1bmM7CkBAIC0zNjcsNyArMzcxLDcgQEAKICAgICB0ZC5pbiA9IGluOwogICAgIHRkLm91dCA9IG91dDsKICAgICB0ZC5yZ2J0b3l1diA9IHMtPnJnYnRveXV2OwotICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBzLT5mdW5jLCAmdGQsIE5VTEwsIEZGTUlOKGlubGluay0+aCwgY3R4LT5ncmFwaC0+bmJfdGhyZWFkcykpOworICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBzLT5mdW5jLCAmdGQsIE5VTEwsIEZGTUlOKGlubGluay0+aCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKIAogICAgIG91dC0+d2lkdGggID0gb3V0bGluay0+dzsKICAgICBvdXQtPmhlaWdodCA9IG91dGxpbmstPmg7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92Zl95YWRpZi5jIGIvbGliYXZmaWx0ZXIvdmZfeWFkaWYuYwppbmRleCA4ZTY1MjJjLi5mNThkOGFjIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl95YWRpZi5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZmX3lhZGlmLmMKQEAgLTEyMywxOCArMTIzLDIwIEBACiAgICAgdWludDhfdCAqcHJldjIgPSBwYXJpdHkgPyBwcmV2IDogY3VyIDsKICAgICB1aW50OF90ICpuZXh0MiA9IHBhcml0eSA/IGN1ciAgOiBuZXh0OwogCisgICAgY29uc3QgaW50IGVkZ2UgPSBNQVhfQUxJR04gLSAxOworCiAgICAgLyogT25seSBlZGdlIHBpeGVscyBuZWVkIHRvIGJlIHByb2Nlc3NlZCBoZXJlLiAgQSBjb25zdGFudCB2YWx1ZSBvZiBmYWxzZQogICAgICAqIGZvciBpc19ub3RfZWRnZSBzaG91bGQgbGV0IHRoZSBjb21waWxlciBpZ25vcmUgdGhlIHdob2xlIGJyYW5jaC4gKi8KICAgICBGSUxURVIoMCwgMywgMCkKIAotICAgIGRzdCAgPSAodWludDhfdCopZHN0MSAgKyB3IC0gKE1BWF9BTElHTi0xKTsKLSAgICBwcmV2ID0gKHVpbnQ4X3QqKXByZXYxICsgdyAtIChNQVhfQUxJR04tMSk7Ci0gICAgY3VyICA9ICh1aW50OF90KiljdXIxICArIHcgLSAoTUFYX0FMSUdOLTEpOwotICAgIG5leHQgPSAodWludDhfdCopbmV4dDEgKyB3IC0gKE1BWF9BTElHTi0xKTsKKyAgICBkc3QgID0gKHVpbnQ4X3QqKWRzdDEgICsgdyAtIGVkZ2U7CisgICAgcHJldiA9ICh1aW50OF90KilwcmV2MSArIHcgLSBlZGdlOworICAgIGN1ciAgPSAodWludDhfdCopY3VyMSAgKyB3IC0gZWRnZTsKKyAgICBuZXh0ID0gKHVpbnQ4X3QqKW5leHQxICsgdyAtIGVkZ2U7CiAgICAgcHJldjIgPSAodWludDhfdCopKHBhcml0eSA/IHByZXYgOiBjdXIpOwogICAgIG5leHQyID0gKHVpbnQ4X3QqKShwYXJpdHkgPyBjdXIgIDogbmV4dCk7CiAKLSAgICBGSUxURVIodyAtIChNQVhfQUxJR04tMSksIHcgLSAzLCAxKQorICAgIEZJTFRFUih3IC0gZWRnZSwgdyAtIDMsIDEpCiAgICAgRklMVEVSKHcgLSAzLCB3LCAwKQogfQogCkBAIC0xNjcsMTkgKzE2OSwyMiBAQAogICAgIGludCB4OwogICAgIHVpbnQxNl90ICpwcmV2MiA9IHBhcml0eSA/IHByZXYgOiBjdXIgOwogICAgIHVpbnQxNl90ICpuZXh0MiA9IHBhcml0eSA/IGN1ciAgOiBuZXh0OworCisgICAgY29uc3QgaW50IGVkZ2UgPSBNQVhfQUxJR04gLyAyIC0gMTsKKwogICAgIG1yZWZzIC89IDI7CiAgICAgcHJlZnMgLz0gMjsKIAogICAgIEZJTFRFUigwLCAzLCAwKQogCi0gICAgZHN0ICAgPSAodWludDE2X3QqKWRzdDEgICsgdyAtIChNQVhfQUxJR04vMi0xKTsKLSAgICBwcmV2ICA9ICh1aW50MTZfdCopcHJldjEgKyB3IC0gKE1BWF9BTElHTi8yLTEpOwotICAgIGN1ciAgID0gKHVpbnQxNl90KiljdXIxICArIHcgLSAoTUFYX0FMSUdOLzItMSk7Ci0gICAgbmV4dCAgPSAodWludDE2X3QqKW5leHQxICsgdyAtIChNQVhfQUxJR04vMi0xKTsKKyAgICBkc3QgICA9ICh1aW50MTZfdCopZHN0MSAgKyB3IC0gZWRnZTsKKyAgICBwcmV2ICA9ICh1aW50MTZfdCopcHJldjEgKyB3IC0gZWRnZTsKKyAgICBjdXIgICA9ICh1aW50MTZfdCopY3VyMSAgKyB3IC0gZWRnZTsKKyAgICBuZXh0ICA9ICh1aW50MTZfdCopbmV4dDEgKyB3IC0gZWRnZTsKICAgICBwcmV2MiA9ICh1aW50MTZfdCopKHBhcml0eSA/IHByZXYgOiBjdXIpOwogICAgIG5leHQyID0gKHVpbnQxNl90KikocGFyaXR5ID8gY3VyICA6IG5leHQpOwogCi0gICAgRklMVEVSKHcgLSAoTUFYX0FMSUdOLzItMSksIHcgLSAzLCAxKQorICAgIEZJTFRFUih3IC0gZWRnZSwgdyAtIDMsIDEpCiAgICAgRklMVEVSKHcgLSAzLCB3LCAwKQogfQogCkBAIC0xOTMsNiArMTk4LDcgQEAKICAgICBpbnQgc2xpY2Vfc3RhcnQgPSAodGQtPmggKiAgam9ibnIgICApIC8gbmJfam9iczsKICAgICBpbnQgc2xpY2VfZW5kICAgPSAodGQtPmggKiAoam9ibnIrMSkpIC8gbmJfam9iczsKICAgICBpbnQgeTsKKyAgICBpbnQgZWRnZSA9IDMgKyBNQVhfQUxJR04gLyBkZiAtIDE7CiAKICAgICAvKiBmaWx0ZXJpbmcgcmVhZHMgMyBwaXhlbHMgdG8gdGhlIGxlZnQvcmlnaHQ7IHRvIGF2b2lkIGludmFsaWQgcmVhZHMsCiAgICAgICogd2UgbmVlZCB0byBjYWxsIHRoZSBjIHZhcmlhbnQgd2hpY2ggYXZvaWRzIHRoaXMgZm9yIGJvcmRlciBwaXhlbHMKQEAgLTIwNSw3ICsyMTEsNyBAQAogICAgICAgICAgICAgdWludDhfdCAqZHN0ICA9ICZ0ZC0+ZnJhbWUtPmRhdGFbdGQtPnBsYW5lXVt5ICogdGQtPmZyYW1lLT5saW5lc2l6ZVt0ZC0+cGxhbmVdXTsKICAgICAgICAgICAgIGludCAgICAgbW9kZSAgPSB5ID09IDEgfHwgeSArIDIgPT0gdGQtPmggPyAyIDogcy0+bW9kZTsKICAgICAgICAgICAgIHMtPmZpbHRlcl9saW5lKGRzdCArIHBpeF8zLCBwcmV2ICsgcGl4XzMsIGN1ciArIHBpeF8zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCArIHBpeF8zLCB0ZC0+dyAtICgzICsgTUFYX0FMSUdOL2RmLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCArIHBpeF8zLCB0ZC0+dyAtIGVkZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgMSA8IHRkLT5oID8gcmVmcyA6IC1yZWZzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA/IC1yZWZzIDogcmVmcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT5wYXJpdHkgXiB0ZC0+dGZmLCBtb2RlKTsKQEAgLTI0Miw3ICsyNDgsNyBAQAogICAgICAgICB0ZC5oICAgICAgID0gaDsKICAgICAgICAgdGQucGxhbmUgICA9IGk7CiAKLSAgICAgICAgY3R4LT5pbnRlcm5hbC0+ZXhlY3V0ZShjdHgsIGZpbHRlcl9zbGljZSwgJnRkLCBOVUxMLCBGRk1JTihoLCBjdHgtPmdyYXBoLT5uYl90aHJlYWRzKSk7CisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmV4ZWN1dGUoY3R4LCBmaWx0ZXJfc2xpY2UsICZ0ZCwgTlVMTCwgRkZNSU4oaCwgZmZfZmlsdGVyX2dldF9uYl90aHJlYWRzKGN0eCkpKTsKICAgICB9CiAKICAgICBlbW1zX2MoKTsKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3ZmX3pvb21wYW4uYyBiL2xpYmF2ZmlsdGVyL3ZmX3pvb21wYW4uYwppbmRleCA5OWExYTM0Li4wNjM1MTcxIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl96b29tcGFuLmMKKysrIGIvbGliYXZmaWx0ZXIvdmZfem9vbXBhbi5jCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAiYXZmaWx0ZXIuaCIKKyNpbmNsdWRlICJmaWx0ZXJzLmgiCiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAidmlkZW8uaCIKQEAgLTgwLDYgKzgxLDkgQEAKICAgICBjaGFyICp4X2V4cHJfc3RyOwogICAgIGNoYXIgKnlfZXhwcl9zdHI7CiAgICAgY2hhciAqZHVyYXRpb25fZXhwcl9zdHI7CisKKyAgICBBVkV4cHIgKnpvb21fZXhwciwgKnhfZXhwciwgKnlfZXhwcjsKKwogICAgIGludCB3LCBoOwogICAgIGRvdWJsZSB4LCB5OwogICAgIGRvdWJsZSBwcmV2X3pvb207CkBAIC0xMDQsNyArMTA4LDcgQEAKICAgICB7ICJ5IiwgInNldCB0aGUgeSBleHByZXNzaW9uIiwgT0ZGU0VUKHlfZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSIwIn0sIC5mbGFncyA9IEZMQUdTIH0sCiAgICAgeyAiZCIsICJzZXQgdGhlIGR1cmF0aW9uIGV4cHJlc3Npb24iLCBPRkZTRVQoZHVyYXRpb25fZXhwcl9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyPSI5MCJ9LCAuZmxhZ3MgPSBGTEFHUyB9LAogICAgIHsgInMiLCAic2V0IHRoZSBvdXRwdXQgaW1hZ2Ugc2l6ZSIsIE9GRlNFVCh3KSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHI9ImhkNzIwIn0sIC5mbGFncyA9IEZMQUdTIH0sCi0gICAgeyAiZnBzIiwgInNldCB0aGUgb3V0cHV0IGZyYW1lcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7IC5zdHIgPSAiMjUiIH0sIC5mbGFncyA9IEZMQUdTIH0sCisgICAgeyAiZnBzIiwgInNldCB0aGUgb3V0cHV0IGZyYW1lcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7IC5zdHIgPSAiMjUiIH0sIDAsIElOVF9NQVgsIC5mbGFncyA9IEZMQUdTIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTEyMiwxMiArMTI2LDI2IEBACiB7CiAgICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5rLT5zcmM7CiAgICAgWlBDb250ZXh0ICpzID0gY3R4LT5wcml2OworICAgIGludCByZXQ7CiAKICAgICBvdXRsaW5rLT53ID0gcy0+dzsKICAgICBvdXRsaW5rLT5oID0gcy0+aDsKICAgICBvdXRsaW5rLT50aW1lX2Jhc2UgPSBhdl9pbnZfcShzLT5mcmFtZXJhdGUpOwogICAgIG91dGxpbmstPmZyYW1lX3JhdGUgPSBzLT5mcmFtZXJhdGU7CiAgICAgcy0+ZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQob3V0bGluay0+Zm9ybWF0KTsKKyAgICBzLT5maW5pc2hlZCA9IDE7CisKKyAgICByZXQgPSBhdl9leHByX3BhcnNlKCZzLT56b29tX2V4cHIsIHMtPnpvb21fZXhwcl9zdHIsIHZhcl9uYW1lcywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGF2X2V4cHJfcGFyc2UoJnMtPnhfZXhwciwgcy0+eF9leHByX3N0ciwgdmFyX25hbWVzLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZSgmcy0+eV9leHByLCBzLT55X2V4cHJfc3RyLCB2YXJfbmFtZXMsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTE0MywzMSArMTYxLDI5IEBACiAgICAgaW50IHB4WzRdLCBweVs0XTsKICAgICBBVkZyYW1lICpvdXQ7CiAKKyAgICB2YXJfdmFsdWVzW1ZBUl9QWF0gICAgPSBzLT54OworICAgIHZhcl92YWx1ZXNbVkFSX1BZXSAgICA9IHMtPnk7CisgICAgdmFyX3ZhbHVlc1tWQVJfUFpPT01dID0gcy0+cHJldl96b29tOworICAgIHZhcl92YWx1ZXNbVkFSX1BEVVJBVElPTl0gPSBzLT5wcmV2X25iX2ZyYW1lczsKICAgICB2YXJfdmFsdWVzW1ZBUl9USU1FXSA9IHB0cyAqIGF2X3EyZChvdXRsaW5rLT50aW1lX2Jhc2UpOwogICAgIHZhcl92YWx1ZXNbVkFSX0ZSQU1FXSA9IGk7Ci0gICAgdmFyX3ZhbHVlc1tWQVJfT05dID0gb3V0bGluay0+ZnJhbWVfY291bnQgKyAxOwotICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCh6b29tLCBzLT56b29tX2V4cHJfc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICB2YXJfdmFsdWVzW1ZBUl9PTl0gPSBvdXRsaW5rLT5mcmFtZV9jb3VudF9pbiArIDE7CisKKyAgICAqem9vbSA9IGF2X2V4cHJfZXZhbChzLT56b29tX2V4cHIsIHZhcl92YWx1ZXMsIE5VTEwpOwogCiAgICAgKnpvb20gPSBhdl9jbGlwZCgqem9vbSwgMSwgMTApOwogICAgIHZhcl92YWx1ZXNbVkFSX1pPT01dID0gKnpvb207CiAgICAgdyA9IGluLT53aWR0aCAqICgxLjAgLyAqem9vbSk7CiAgICAgaCA9IGluLT5oZWlnaHQgKiAoMS4wIC8gKnpvb20pOwogCi0gICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKGR4LCBzLT54X2V4cHJfc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfbmFtZXMsIHZhcl92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIGN0eCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAqZHggPSBhdl9leHByX2V2YWwocy0+eF9leHByLCB2YXJfdmFsdWVzLCBOVUxMKTsKKwogICAgIHggPSAqZHggPSBhdl9jbGlwZCgqZHgsIDAsIEZGTUFYKGluLT53aWR0aCAtIHcsIDApKTsKICAgICB2YXJfdmFsdWVzW1ZBUl9YXSA9ICpkeDsKICAgICB4ICY9IH4oKDEgPDwgcy0+ZGVzYy0+bG9nMl9jaHJvbWFfdykgLSAxKTsKIAotICAgIGlmICgocmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbChkeSwgcy0+eV9leHByX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCB2YXJfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBjdHgpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgKmR5ID0gYXZfZXhwcl9ldmFsKHMtPnlfZXhwciwgdmFyX3ZhbHVlcywgTlVMTCk7CisKICAgICB5ID0gKmR5ID0gYXZfY2xpcGQoKmR5LCAwLCBGRk1BWChpbi0+aGVpZ2h0IC0gaCwgMCkpOwogICAgIHZhcl92YWx1ZXNbVkFSX1ldID0gKmR5OwogICAgIHkgJj0gfigoMSA8PCBzLT5kZXNjLT5sb2cyX2Nocm9tYV9oKSAtIDEpOwpAQCAtMTg3LDcgKzIwMyw3IEBACiAgICAgcy0+c3dzID0gc3dzX2FsbG9jX2NvbnRleHQoKTsKICAgICBpZiAoIXMtPnN3cykgewogICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCiAgICAgZm9yIChrID0gMDsgaW4tPmRhdGFba107IGsrKykKQEAgLTIwMiw3ICsyMTgsNyBAQAogICAgIGF2X29wdF9zZXRfaW50KHMtPnN3cywgInN3c19mbGFncyIsIFNXU19CSUNVQklDLCAwKTsKIAogICAgIGlmICgocmV0ID0gc3dzX2luaXRfY29udGV4dChzLT5zd3MsIE5VTEwsIE5VTEwpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGdvdG8gZXJyb3I7CiAKICAgICBzd3Nfc2NhbGUocy0+c3dzLCAoY29uc3QgdWludDhfdCAqY29uc3QgKikmaW5wdXQsIGluLT5saW5lc2l6ZSwgMCwgaCwgb3V0LT5kYXRhLCBvdXQtPmxpbmVzaXplKTsKIApAQCAtMjEzLDkxICsyMjksOTEgQEAKICAgICBzd3NfZnJlZUNvbnRleHQocy0+c3dzKTsKICAgICBzLT5zd3MgPSBOVUxMOwogICAgIHMtPmN1cnJlbnRfZnJhbWUrKzsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmlubGluaywgQVZGcmFtZSAqaW4pCi17Ci0gICAgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBpbmxpbmstPmRzdDsKLSAgICBBVkZpbHRlckxpbmsgKm91dGxpbmsgPSBjdHgtPm91dHB1dHNbMF07Ci0gICAgWlBDb250ZXh0ICpzID0gY3R4LT5wcml2OwotICAgIGRvdWJsZSBuYl9mcmFtZXM7Ci0gICAgaW50IHJldDsKLQotICAgIGF2X2Fzc2VydDAocy0+aW4gPT0gTlVMTCk7Ci0KLSAgICBzLT5maW5pc2hlZCA9IDA7Ci0gICAgcy0+dmFyX3ZhbHVlc1tWQVJfSU5fV10gID0gcy0+dmFyX3ZhbHVlc1tWQVJfSVddID0gaW4tPndpZHRoOwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX0lOX0hdICA9IHMtPnZhcl92YWx1ZXNbVkFSX0lIXSA9IGluLT5oZWlnaHQ7Ci0gICAgcy0+dmFyX3ZhbHVlc1tWQVJfT1VUX1ddID0gcy0+dmFyX3ZhbHVlc1tWQVJfT1ddID0gcy0+dzsKLSAgICBzLT52YXJfdmFsdWVzW1ZBUl9PVVRfSF0gPSBzLT52YXJfdmFsdWVzW1ZBUl9PSF0gPSBzLT5oOwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX0lOXSAgICA9IGlubGluay0+ZnJhbWVfY291bnQgKyAxOwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX09OXSAgICA9IG91dGxpbmstPmZyYW1lX2NvdW50ICsgMTsKLSAgICBzLT52YXJfdmFsdWVzW1ZBUl9QWF0gICAgPSBzLT54OwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX1BZXSAgICA9IHMtPnk7Ci0gICAgcy0+dmFyX3ZhbHVlc1tWQVJfWF0gICAgID0gMDsKLSAgICBzLT52YXJfdmFsdWVzW1ZBUl9ZXSAgICAgPSAwOwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX1BaT09NXSA9IHMtPnByZXZfem9vbTsKLSAgICBzLT52YXJfdmFsdWVzW1ZBUl9aT09NXSAgPSAxOwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX1BEVVJBVElPTl0gPSBzLT5wcmV2X25iX2ZyYW1lczsKLSAgICBzLT52YXJfdmFsdWVzW1ZBUl9BXSAgICAgPSAoZG91YmxlKSBpbi0+d2lkdGggLyBpbi0+aGVpZ2h0OwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX1NBUl0gICA9IGlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPwotICAgICAgICAoZG91YmxlKSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtIC8gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA6IDE7Ci0gICAgcy0+dmFyX3ZhbHVlc1tWQVJfREFSXSAgID0gcy0+dmFyX3ZhbHVlc1tWQVJfQV0gKiBzLT52YXJfdmFsdWVzW1ZBUl9TQVJdOwotICAgIHMtPnZhcl92YWx1ZXNbVkFSX0hTVUJdICA9IDEgPDwgcy0+ZGVzYy0+bG9nMl9jaHJvbWFfdzsKLSAgICBzLT52YXJfdmFsdWVzW1ZBUl9WU1VCXSAgPSAxIDw8IHMtPmRlc2MtPmxvZzJfY2hyb21hX2g7Ci0KLSAgICBpZiAoKHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJm5iX2ZyYW1lcywgcy0+ZHVyYXRpb25fZXhwcl9zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcl9uYW1lcywgcy0+dmFyX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKSB7Ci0gICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmluKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBzLT52YXJfdmFsdWVzW1ZBUl9EVVJBVElPTl0gPSBzLT5uYl9mcmFtZXMgPSBuYl9mcmFtZXM7Ci0gICAgcy0+aW4gPSBpbjsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHJlcXVlc3RfZnJhbWUoQVZGaWx0ZXJMaW5rICpvdXRsaW5rKQotewotICAgIEFWRmlsdGVyQ29udGV4dCAqY3R4ID0gb3V0bGluay0+c3JjOwotICAgIFpQQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKLSAgICBBVkZyYW1lICppbiA9IHMtPmluOwotICAgIGRvdWJsZSB6b29tPTEsIGR4PTAsIGR5PTA7Ci0gICAgaW50IHJldCA9IC0xOwotCi0gICAgaWYgKGluKSB7Ci0gICAgICAgIHJldCA9IG91dHB1dF9zaW5nbGVfZnJhbWUoY3R4LCBpbiwgcy0+dmFyX3ZhbHVlcywgcy0+Y3VycmVudF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmem9vbSwgJmR4LCAmZHkpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICB9CiAKICAgICBpZiAocy0+Y3VycmVudF9mcmFtZSA+PSBzLT5uYl9mcmFtZXMpIHsKLSAgICAgICAgcy0+eCA9IGR4OwotICAgICAgICBzLT55ID0gZHk7Ci0gICAgICAgIHMtPnByZXZfem9vbSA9IHpvb207CisgICAgICAgIGlmICgqZHggIT0gLTEpCisgICAgICAgICAgICBzLT54ID0gKmR4OworICAgICAgICBpZiAoKmR5ICE9IC0xKQorICAgICAgICAgICAgcy0+eSA9ICpkeTsKKyAgICAgICAgaWYgKCp6b29tICE9IC0xKQorICAgICAgICAgICAgcy0+cHJldl96b29tID0gKnpvb207CiAgICAgICAgIHMtPnByZXZfbmJfZnJhbWVzID0gcy0+bmJfZnJhbWVzOwogICAgICAgICBzLT5uYl9mcmFtZXMgPSAwOwogICAgICAgICBzLT5jdXJyZW50X2ZyYW1lID0gMDsKICAgICAgICAgYXZfZnJhbWVfZnJlZSgmcy0+aW4pOwogICAgICAgICBzLT5maW5pc2hlZCA9IDE7Ci0gICAgICAgIHJldCA9IGZmX3JlcXVlc3RfZnJhbWUoY3R4LT5pbnB1dHNbMF0pOwogICAgIH0KLQotZmFpbDoKLSAgICBzd3NfZnJlZUNvbnRleHQocy0+c3dzKTsKLSAgICBzLT5zd3MgPSBOVUxMOwotCisgICAgcmV0dXJuIHJldDsKK2Vycm9yOgorICAgIGF2X2ZyYW1lX2ZyZWUoJm91dCk7CiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwb2xsX2ZyYW1lKEFWRmlsdGVyTGluayAqbGluaykKK3N0YXRpYyBpbnQgYWN0aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCiB7Ci0gICAgWlBDb250ZXh0ICpzID0gbGluay0+c3JjLT5wcml2OwotICAgIHJldHVybiBzLT5uYl9mcmFtZXMgLSBzLT5jdXJyZW50X2ZyYW1lOworICAgIFpQQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKyAgICBBVkZpbHRlckxpbmsgKmlubGluayA9IGN0eC0+aW5wdXRzWzBdOworICAgIEFWRmlsdGVyTGluayAqb3V0bGluayA9IGN0eC0+b3V0cHV0c1swXTsKKyAgICBpbnQgc3RhdHVzLCByZXQgPSAwOworICAgIGludDY0X3QgcHRzOworCisgICAgaWYgKHMtPmluICYmIGZmX291dGxpbmtfZnJhbWVfd2FudGVkKG91dGxpbmspKSB7CisgICAgICAgIGRvdWJsZSB6b29tID0gLTEsIGR4ID0gLTEsIGR5ID0gLTE7CisKKyAgICAgICAgcmV0ID0gb3V0cHV0X3NpbmdsZV9mcmFtZShjdHgsIHMtPmluLCBzLT52YXJfdmFsdWVzLCBzLT5jdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ6b29tLCAmZHgsICZkeSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoIXMtPmluICYmIChyZXQgPSBmZl9pbmxpbmtfY29uc3VtZV9mcmFtZShpbmxpbmssICZzLT5pbikpID4gMCkgeworICAgICAgICBkb3VibGUgem9vbSA9IC0xLCBkeCA9IC0xLCBkeSA9IC0xLCBuYl9mcmFtZXM7CisKKyAgICAgICAgcy0+ZmluaXNoZWQgPSAwOworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9JTl9XXSAgPSBzLT52YXJfdmFsdWVzW1ZBUl9JV10gPSBzLT5pbi0+d2lkdGg7CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX0lOX0hdICA9IHMtPnZhcl92YWx1ZXNbVkFSX0lIXSA9IHMtPmluLT5oZWlnaHQ7CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX09VVF9XXSA9IHMtPnZhcl92YWx1ZXNbVkFSX09XXSA9IHMtPnc7CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX09VVF9IXSA9IHMtPnZhcl92YWx1ZXNbVkFSX09IXSA9IHMtPmg7CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX0lOXSAgICA9IGlubGluay0+ZnJhbWVfY291bnRfb3V0ICsgMTsKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfT05dICAgID0gb3V0bGluay0+ZnJhbWVfY291bnRfaW4gKyAxOworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9QWF0gICAgPSBzLT54OworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9QWV0gICAgPSBzLT55OworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9YXSAgICAgPSAwOworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9ZXSAgICAgPSAwOworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9QWk9PTV0gPSBzLT5wcmV2X3pvb207CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1pPT01dICA9IDE7CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX1BEVVJBVElPTl0gPSBzLT5wcmV2X25iX2ZyYW1lczsKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfQV0gICAgID0gKGRvdWJsZSkgcy0+aW4tPndpZHRoIC8gcy0+aW4tPmhlaWdodDsKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfU0FSXSAgID0gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA/CisgICAgICAgICAgICAoZG91YmxlKSBpbmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtIC8gaW5saW5rLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA6IDE7CisgICAgICAgIHMtPnZhcl92YWx1ZXNbVkFSX0RBUl0gICA9IHMtPnZhcl92YWx1ZXNbVkFSX0FdICogcy0+dmFyX3ZhbHVlc1tWQVJfU0FSXTsKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfSFNVQl0gID0gMSA8PCBzLT5kZXNjLT5sb2cyX2Nocm9tYV93OworICAgICAgICBzLT52YXJfdmFsdWVzW1ZBUl9WU1VCXSAgPSAxIDw8IHMtPmRlc2MtPmxvZzJfY2hyb21hX2g7CisKKyAgICAgICAgaWYgKChyZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZuYl9mcmFtZXMsIHMtPmR1cmF0aW9uX2V4cHJfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyX25hbWVzLCBzLT52YXJfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgY3R4KSkgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZzLT5pbik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcy0+dmFyX3ZhbHVlc1tWQVJfRFVSQVRJT05dID0gcy0+bmJfZnJhbWVzID0gbmJfZnJhbWVzOworCisgICAgICAgIHJldCA9IG91dHB1dF9zaW5nbGVfZnJhbWUoY3R4LCBzLT5pbiwgcy0+dmFyX3ZhbHVlcywgcy0+Y3VycmVudF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmem9vbSwgJmR4LCAmZHkpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIGlmIChzLT5maW5pc2hlZCAmJiBmZl9pbmxpbmtfYWNrbm93bGVkZ2Vfc3RhdHVzKGlubGluaywgJnN0YXR1cywgJnB0cykpIHsKKyAgICAgICAgZmZfb3V0bGlua19zZXRfc3RhdHVzKG91dGxpbmssIHN0YXR1cywgcHRzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZmX291dGxpbmtfZnJhbWVfd2FudGVkKG91dGxpbmspICYmIHMtPmZpbmlzaGVkKQorICAgICAgICAgICAgZmZfaW5saW5rX3JlcXVlc3RfZnJhbWUoaW5saW5rKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiBzdGF0aWMgaW50IHF1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCkBAIC0zMzQsOCArMzUwLDYgQEAKICAgICB7CiAgICAgICAgIC5uYW1lICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCi0gICAgICAgIC5maWx0ZXJfZnJhbWUgPSBmaWx0ZXJfZnJhbWUsCi0gICAgICAgIC5uZWVkc19maWZvICAgPSAxLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0zNDUsOCArMzU5LDYgQEAKICAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCiAgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgICAgICAuY29uZmlnX3Byb3BzICA9IGNvbmZpZ19vdXRwdXQsCi0gICAgICAgIC5wb2xsX2ZyYW1lICAgID0gcG9sbF9mcmFtZSwKLSAgICAgICAgLnJlcXVlc3RfZnJhbWUgPSByZXF1ZXN0X2ZyYW1lLAogICAgIH0sCiAgICAgeyBOVUxMIH0KIH07CkBAIC0zNTksNyArMzcxLDcgQEAKICAgICAuaW5pdCAgICAgICAgICA9IGluaXQsCiAgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCiAgICAgLnF1ZXJ5X2Zvcm1hdHMgPSBxdWVyeV9mb3JtYXRzLAorICAgIC5hY3RpdmF0ZSAgICAgID0gYWN0aXZhdGUsCiAgICAgLmlucHV0cyAgICAgICAgPSBpbnB1dHMsCiAgICAgLm91dHB1dHMgICAgICAgPSBvdXRwdXRzLAotICAgIC5mbGFncyAgICAgICAgID0gQVZGSUxURVJfRkxBR19TVVBQT1JUX1RJTUVMSU5FX0dFTkVSSUMsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdmZfenNjYWxlLmMgYi9saWJhdmZpbHRlci92Zl96c2NhbGUuYwppbmRleCA5Mzk3NzVhLi42ZTFkMzZjIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92Zl96c2NhbGUuYworKysgYi9saWJhdmZpbHRlci92Zl96c2NhbGUuYwpAQCAtMjMsNiArMjMsNyBAQAogICogenNjYWxlIHZpZGVvIGZpbHRlciB1c2luZyB6LmxpYiBsaWJyYXJ5CiAgKi8KIAorI2luY2x1ZGUgPGZsb2F0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIApAQCAtMzUsNiArMzYsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9ldmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgpAQCAtODgsMTEgKzkwLDE1IEBACiAgICAgaW50IHRyYzsKICAgICBpbnQgcHJpbWFyaWVzOwogICAgIGludCByYW5nZTsKKyAgICBpbnQgY2hyb21hbDsKICAgICBpbnQgY29sb3JzcGFjZV9pbjsKICAgICBpbnQgdHJjX2luOwogICAgIGludCBwcmltYXJpZXNfaW47CiAgICAgaW50IHJhbmdlX2luOworICAgIGludCBjaHJvbWFsX2luOwogICAgIGNoYXIgKnNpemVfc3RyOworICAgIGRvdWJsZSBub21pbmFsX3BlYWtfbHVtaW5hbmNlOworICAgIGludCBhcHByb3hpbWF0ZV9nYW1tYTsKIAogICAgIGNoYXIgKndfZXhwcjsgICAgICAgICAgICAgICAvLy88IHdpZHRoICBleHByZXNzaW9uIHN0cmluZwogICAgIGNoYXIgKmhfZXhwcjsgICAgICAgICAgICAgICAvLy88IGhlaWdodCBleHByZXNzaW9uIHN0cmluZwpAQCAtMTE2LDYgKzEyMiw3IEBACiAgICAgZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyBpbl90cmMsIG91dF90cmM7CiAgICAgZW51bSBBVkNvbG9yUHJpbWFyaWVzIGluX3ByaW1hcmllcywgb3V0X3ByaW1hcmllczsKICAgICBlbnVtIEFWQ29sb3JSYW5nZSBpbl9yYW5nZSwgb3V0X3JhbmdlOworICAgIGVudW0gQVZDaHJvbWFMb2NhdGlvbiBpbl9jaHJvbWFsLCBvdXRfY2hyb21hbDsKIH0gWlNjYWxlQ29udGV4dDsKIAogc3RhdGljIGF2X2NvbGQgaW50IGluaXRfZGljdChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZEaWN0aW9uYXJ5ICoqb3B0cykKQEAgLTE3Myw2ICsxODAsNyBAQAogICAgICAgICBBVl9QSVhfRk1UX0dCUlAsIEFWX1BJWF9GTVRfR0JSUDksIEFWX1BJWF9GTVRfR0JSUDEwLAogICAgICAgICBBVl9QSVhfRk1UX0dCUlAxMiwgQVZfUElYX0ZNVF9HQlJQMTQsIEFWX1BJWF9GTVRfR0JSUDE2LAogICAgICAgICBBVl9QSVhfRk1UX0dCUkFQLCBBVl9QSVhfRk1UX0dCUkFQMTYsCisgICAgICAgIEFWX1BJWF9GTVRfR0JSUEYzMiwgQVZfUElYX0ZNVF9HQlJBUEYzMiwKICAgICAgICAgQVZfUElYX0ZNVF9OT05FCiAgICAgfTsKICAgICBpbnQgcmV0OwpAQCAtMzEzLDcgKzMyMSwyNyBAQAogCiAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiY29kZSAlZDogJXNcbiIsIGVycl9jb2RlLCBlcnJfbXNnKTsKIAotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKK30KKworc3RhdGljIGludCBjb252ZXJ0X2Nocm9tYV9sb2NhdGlvbihlbnVtIEFWQ2hyb21hTG9jYXRpb24gY2hyb21hX2xvY2F0aW9uKQoreworICAgIHN3aXRjaCAoY2hyb21hX2xvY2F0aW9uKSB7CisgICAgY2FzZSBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQ6CisgICAgY2FzZSBBVkNIUk9NQV9MT0NfTEVGVDoKKyAgICAgICAgcmV0dXJuIFpJTUdfQ0hST01BX0xFRlQ7CisgICAgY2FzZSBBVkNIUk9NQV9MT0NfQ0VOVEVSOgorICAgICAgICByZXR1cm4gWklNR19DSFJPTUFfQ0VOVEVSOworICAgIGNhc2UgQVZDSFJPTUFfTE9DX1RPUExFRlQ6CisgICAgICAgIHJldHVybiBaSU1HX0NIUk9NQV9UT1BfTEVGVDsKKyAgICBjYXNlIEFWQ0hST01BX0xPQ19UT1A6CisgICAgICAgIHJldHVybiBaSU1HX0NIUk9NQV9UT1A7CisgICAgY2FzZSBBVkNIUk9NQV9MT0NfQk9UVE9NTEVGVDoKKyAgICAgICAgcmV0dXJuIFpJTUdfQ0hST01BX0JPVFRPTV9MRUZUOworICAgIGNhc2UgQVZDSFJPTUFfTE9DX0JPVFRPTToKKyAgICAgICAgcmV0dXJuIFpJTUdfQ0hST01BX0JPVFRPTTsKKyAgICB9CisgICAgcmV0dXJuIFpJTUdfQ0hST01BX0xFRlQ7CiB9CiAKIHN0YXRpYyBpbnQgY29udmVydF9tYXRyaXgoZW51bSBBVkNvbG9yU3BhY2UgY29sb3JzcGFjZSkKQEAgLTMyNSwxNiArMzUzLDI2IEBACiAgICAgICAgIHJldHVybiBaSU1HX01BVFJJWF83MDk7CiAgICAgY2FzZSBBVkNPTF9TUENfVU5TUEVDSUZJRUQ6CiAgICAgICAgIHJldHVybiBaSU1HX01BVFJJWF9VTlNQRUNJRklFRDsKKyAgICBjYXNlIEFWQ09MX1NQQ19GQ0M6CisgICAgICAgIHJldHVybiBaSU1HX01BVFJJWF9GQ0M7CiAgICAgY2FzZSBBVkNPTF9TUENfQlQ0NzBCRzoKICAgICAgICAgcmV0dXJuIFpJTUdfTUFUUklYXzQ3MEJHOwogICAgIGNhc2UgQVZDT0xfU1BDX1NNUFRFMTcwTToKICAgICAgICAgcmV0dXJuIFpJTUdfTUFUUklYXzE3ME07CisgICAgY2FzZSBBVkNPTF9TUENfU01QVEUyNDBNOgorICAgICAgICByZXR1cm4gWklNR19NQVRSSVhfMjQwTTsKICAgICBjYXNlIEFWQ09MX1NQQ19ZQ0dDTzoKICAgICAgICAgcmV0dXJuIFpJTUdfTUFUUklYX1lDR0NPOwogICAgIGNhc2UgQVZDT0xfU1BDX0JUMjAyMF9OQ0w6CiAgICAgICAgIHJldHVybiBaSU1HX01BVFJJWF8yMDIwX05DTDsKICAgICBjYXNlIEFWQ09MX1NQQ19CVDIwMjBfQ0w6CiAgICAgICAgIHJldHVybiBaSU1HX01BVFJJWF8yMDIwX0NMOworICAgIGNhc2UgQVZDT0xfU1BDX0NIUk9NQV9ERVJJVkVEX05DTDoKKyAgICAgICAgcmV0dXJuIFpJTUdfTUFUUklYX0NIUk9NQVRJQ0lUWV9ERVJJVkVEX05DTDsKKyAgICBjYXNlIEFWQ09MX1NQQ19DSFJPTUFfREVSSVZFRF9DTDoKKyAgICAgICAgcmV0dXJuIFpJTUdfTUFUUklYX0NIUk9NQVRJQ0lUWV9ERVJJVkVEX0NMOworICAgIGNhc2UgQVZDT0xfU1BDX0lDVENQOgorICAgICAgICByZXR1cm4gWklNR19NQVRSSVhfSUNUQ1A7CiAgICAgfQogICAgIHJldHVybiBaSU1HX01BVFJJWF9VTlNQRUNJRklFRDsKIH0KQEAgLTM0NiwxNCArMzg0LDMyIEBACiAgICAgICAgIHJldHVybiBaSU1HX1RSQU5TRkVSX1VOU1BFQ0lGSUVEOwogICAgIGNhc2UgQVZDT0xfVFJDX0JUNzA5OgogICAgICAgICByZXR1cm4gWklNR19UUkFOU0ZFUl83MDk7CisgICAgY2FzZSBBVkNPTF9UUkNfR0FNTUEyMjoKKyAgICAgICAgcmV0dXJuIFpJTUdfVFJBTlNGRVJfNDcwX007CisgICAgY2FzZSBBVkNPTF9UUkNfR0FNTUEyODoKKyAgICAgICAgcmV0dXJuIFpJTUdfVFJBTlNGRVJfNDcwX0JHOwogICAgIGNhc2UgQVZDT0xfVFJDX1NNUFRFMTcwTToKICAgICAgICAgcmV0dXJuIFpJTUdfVFJBTlNGRVJfNjAxOworICAgIGNhc2UgQVZDT0xfVFJDX1NNUFRFMjQwTToKKyAgICAgICAgcmV0dXJuIFpJTUdfVFJBTlNGRVJfMjQwTTsKICAgICBjYXNlIEFWQ09MX1RSQ19MSU5FQVI6CiAgICAgICAgIHJldHVybiBaSU1HX1RSQU5TRkVSX0xJTkVBUjsKKyAgICBjYXNlIEFWQ09MX1RSQ19MT0c6CisgICAgICAgIHJldHVybiBaSU1HX1RSQU5TRkVSX0xPR18xMDA7CisgICAgY2FzZSBBVkNPTF9UUkNfTE9HX1NRUlQ6CisgICAgICAgIHJldHVybiBaSU1HX1RSQU5TRkVSX0xPR18zMTY7CisgICAgY2FzZSBBVkNPTF9UUkNfSUVDNjE5NjZfMl80OgorICAgICAgICByZXR1cm4gWklNR19UUkFOU0ZFUl9JRUNfNjE5NjZfMl80OwogICAgIGNhc2UgQVZDT0xfVFJDX0JUMjAyMF8xMDoKICAgICAgICAgcmV0dXJuIFpJTUdfVFJBTlNGRVJfMjAyMF8xMDsKICAgICBjYXNlIEFWQ09MX1RSQ19CVDIwMjBfMTI6CiAgICAgICAgIHJldHVybiBaSU1HX1RSQU5TRkVSXzIwMjBfMTI7CisgICAgY2FzZSBBVkNPTF9UUkNfU01QVEUyMDg0OgorICAgICAgICByZXR1cm4gWklNR19UUkFOU0ZFUl9TVDIwODQ7CisgICAgY2FzZSBBVkNPTF9UUkNfQVJJQl9TVERfQjY3OgorICAgICAgICByZXR1cm4gWklNR19UUkFOU0ZFUl9BUklCX0I2NzsKKyAgICBjYXNlIEFWQ09MX1RSQ19JRUM2MTk2Nl8yXzE6CisgICAgICAgIHJldHVybiBaSU1HX1RSQU5TRkVSX0lFQ182MTk2Nl8yXzE7CiAgICAgfQogICAgIHJldHVybiBaSU1HX1RSQU5TRkVSX1VOU1BFQ0lGSUVEOwogfQpAQCAtMzY1LDEyICs0MjEsMjYgQEAKICAgICAgICAgcmV0dXJuIFpJTUdfUFJJTUFSSUVTX1VOU1BFQ0lGSUVEOwogICAgIGNhc2UgQVZDT0xfUFJJX0JUNzA5OgogICAgICAgICByZXR1cm4gWklNR19QUklNQVJJRVNfNzA5OworICAgIGNhc2UgQVZDT0xfUFJJX0JUNDcwTToKKyAgICAgICAgcmV0dXJuIFpJTUdfUFJJTUFSSUVTXzQ3MF9NOworICAgIGNhc2UgQVZDT0xfUFJJX0JUNDcwQkc6CisgICAgICAgIHJldHVybiBaSU1HX1BSSU1BUklFU180NzBfQkc7CiAgICAgY2FzZSBBVkNPTF9QUklfU01QVEUxNzBNOgogICAgICAgICByZXR1cm4gWklNR19QUklNQVJJRVNfMTcwTTsKICAgICBjYXNlIEFWQ09MX1BSSV9TTVBURTI0ME06CiAgICAgICAgIHJldHVybiBaSU1HX1BSSU1BUklFU18yNDBNOworICAgIGNhc2UgQVZDT0xfUFJJX0ZJTE06CisgICAgICAgIHJldHVybiBaSU1HX1BSSU1BUklFU19GSUxNOwogICAgIGNhc2UgQVZDT0xfUFJJX0JUMjAyMDoKICAgICAgICAgcmV0dXJuIFpJTUdfUFJJTUFSSUVTXzIwMjA7CisgICAgY2FzZSBBVkNPTF9QUklfU01QVEU0Mjg6CisgICAgICAgIHJldHVybiBaSU1HX1BSSU1BUklFU19TVDQyODsKKyAgICBjYXNlIEFWQ09MX1BSSV9TTVBURTQzMToKKyAgICAgICAgcmV0dXJuIFpJTUdfUFJJTUFSSUVTX1NUNDMxXzI7CisgICAgY2FzZSBBVkNPTF9QUklfU01QVEU0MzI6CisgICAgICAgIHJldHVybiBaSU1HX1BSSU1BUklFU19TVDQzMl8xOworICAgIGNhc2UgQVZDT0xfUFJJX0pFREVDX1AyMjoKKyAgICAgICAgcmV0dXJuIFpJTUdfUFJJTUFSSUVTX0VCVTMyMTNfRTsKICAgICB9CiAgICAgcmV0dXJuIFpJTUdfUFJJTUFSSUVTX1VOU1BFQ0lGSUVEOwogfQpAQCAtMzg3LDYgKzQ1Nyw1MSBAQAogICAgIHJldHVybiBaSU1HX1JBTkdFX0xJTUlURUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGZvcm1hdF9pbml0KHppbWdfaW1hZ2VfZm9ybWF0ICpmb3JtYXQsIEFWRnJhbWUgKmZyYW1lLCBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JzcGFjZSwgaW50IHByaW1hcmllcywgaW50IHRyYW5zZmVyLCBpbnQgcmFuZ2UsIGludCBsb2NhdGlvbikKK3sKKyAgICBmb3JtYXQtPndpZHRoID0gZnJhbWUtPndpZHRoOworICAgIGZvcm1hdC0+aGVpZ2h0ID0gZnJhbWUtPmhlaWdodDsKKyAgICBmb3JtYXQtPnN1YnNhbXBsZV93ID0gZGVzYy0+bG9nMl9jaHJvbWFfdzsKKyAgICBmb3JtYXQtPnN1YnNhbXBsZV9oID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKKyAgICBmb3JtYXQtPmRlcHRoID0gZGVzYy0+Y29tcFswXS5kZXB0aDsKKyAgICBmb3JtYXQtPnBpeGVsX3R5cGUgPSAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfRkxPQVQpID8gWklNR19QSVhFTF9GTE9BVCA6IGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4ID8gWklNR19QSVhFTF9XT1JEIDogWklNR19QSVhFTF9CWVRFOworICAgIGZvcm1hdC0+Y29sb3JfZmFtaWx5ID0gKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgPyBaSU1HX0NPTE9SX1JHQiA6IFpJTUdfQ09MT1JfWVVWOworICAgIGZvcm1hdC0+bWF0cml4X2NvZWZmaWNpZW50cyA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpID8gWklNR19NQVRSSVhfUkdCIDogY29sb3JzcGFjZSA9PSAtMSA/IGNvbnZlcnRfbWF0cml4KGZyYW1lLT5jb2xvcnNwYWNlKSA6IGNvbG9yc3BhY2U7CisgICAgZm9ybWF0LT5jb2xvcl9wcmltYXJpZXMgPSBwcmltYXJpZXMgPT0gLTEgPyBjb252ZXJ0X3ByaW1hcmllcyhmcmFtZS0+Y29sb3JfcHJpbWFyaWVzKSA6IHByaW1hcmllczsKKyAgICBmb3JtYXQtPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9IHRyYW5zZmVyID09IC0gMSA/IGNvbnZlcnRfdHJjKGZyYW1lLT5jb2xvcl90cmMpIDogdHJhbnNmZXI7CisgICAgZm9ybWF0LT5waXhlbF9yYW5nZSA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpID8gWklNR19SQU5HRV9GVUxMIDogcmFuZ2UgPT0gLTEgPyBjb252ZXJ0X3JhbmdlKGZyYW1lLT5jb2xvcl9yYW5nZSkgOiByYW5nZTsKKyAgICBmb3JtYXQtPmNocm9tYV9sb2NhdGlvbiA9IGxvY2F0aW9uID09IC0xID8gY29udmVydF9jaHJvbWFfbG9jYXRpb24oZnJhbWUtPmNocm9tYV9sb2NhdGlvbikgOiBsb2NhdGlvbjsKK30KKworc3RhdGljIGludCBncmFwaF9idWlsZCh6aW1nX2ZpbHRlcl9ncmFwaCAqKmdyYXBoLCB6aW1nX2dyYXBoX2J1aWxkZXJfcGFyYW1zICpwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIHppbWdfaW1hZ2VfZm9ybWF0ICpzcmNfZm9ybWF0LCB6aW1nX2ltYWdlX2Zvcm1hdCAqZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnRtcCwgc2l6ZV90ICp0bXBfc2l6ZSkKK3sKKyAgICBpbnQgcmV0OworICAgIHNpemVfdCBzaXplOworCisgICAgemltZ19maWx0ZXJfZ3JhcGhfZnJlZSgqZ3JhcGgpOworICAgICpncmFwaCA9IHppbWdfZmlsdGVyX2dyYXBoX2J1aWxkKHNyY19mb3JtYXQsIGRzdF9mb3JtYXQsIHBhcmFtcyk7CisgICAgaWYgKCEqZ3JhcGgpCisgICAgICAgIHJldHVybiBwcmludF96aW1nX2Vycm9yKE5VTEwpOworCisgICAgcmV0ID0gemltZ19maWx0ZXJfZ3JhcGhfZ2V0X3RtcF9zaXplKCpncmFwaCwgJnNpemUpOworICAgIGlmIChyZXQpCisgICAgICAgIHJldHVybiBwcmludF96aW1nX2Vycm9yKE5VTEwpOworCisgICAgaWYgKHNpemUgPiAqdG1wX3NpemUpIHsKKyAgICAgICAgYXZfZnJlZXAodG1wKTsKKyAgICAgICAgKnRtcCA9IGF2X21hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCEqdG1wKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAqdG1wX3NpemUgPSBzaXplOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGZpbHRlcl9mcmFtZShBVkZpbHRlckxpbmsgKmxpbmssIEFWRnJhbWUgKmluKQogewogICAgIFpTY2FsZUNvbnRleHQgKnMgPSBsaW5rLT5kc3QtPnByaXY7CkBAIC0zOTYsNyArNTExLDYgQEAKICAgICB6aW1nX2ltYWdlX2J1ZmZlcl9jb25zdCBzcmNfYnVmID0geyBaSU1HX0FQSV9WRVJTSU9OIH07CiAgICAgemltZ19pbWFnZV9idWZmZXIgZHN0X2J1ZiA9IHsgWklNR19BUElfVkVSU0lPTiB9OwogICAgIGNoYXIgYnVmWzMyXTsKLSAgICBzaXplX3QgdG1wX3NpemU7CiAgICAgaW50IHJldCA9IDAsIHBsYW5lOwogICAgIEFWRnJhbWUgKm91dDsKIApAQCAtNDIwLDcgKzUzNCw5IEBACiAgICAgICAgfHwgcy0+b3V0X2NvbG9yc3BhY2UgIT0gb3V0LT5jb2xvcnNwYWNlCiAgICAgICAgfHwgcy0+b3V0X3RyYyAgIT0gb3V0LT5jb2xvcl90cmMKICAgICAgICB8fCBzLT5vdXRfcHJpbWFyaWVzICE9IG91dC0+Y29sb3JfcHJpbWFyaWVzCi0gICAgICAgfHwgcy0+b3V0X3JhbmdlICE9IG91dC0+Y29sb3JfcmFuZ2UpIHsKKyAgICAgICB8fCBzLT5vdXRfcmFuZ2UgIT0gb3V0LT5jb2xvcl9yYW5nZQorICAgICAgIHx8IHMtPmluX2Nocm9tYWwgIT0gaW4tPmNocm9tYV9sb2NhdGlvbgorICAgICAgIHx8IHMtPm91dF9jaHJvbWFsICE9IG91dC0+Y2hyb21hX2xvY2F0aW9uKSB7CiAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiktMSwgIiVkIiwgb3V0bGluay0+dyk7CiAgICAgICAgIGF2X29wdF9zZXQocywgInciLCBidWYsIDApOwogICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLTEsICIlZCIsIG91dGxpbmstPmgpOwpAQCAtNDQ0LDMwICs1NjAsMTMgQEAKICAgICAgICAgcy0+cGFyYW1zLmNwdV90eXBlID0gWklNR19DUFVfQVVUTzsKICAgICAgICAgcy0+cGFyYW1zLnJlc2FtcGxlX2ZpbHRlciA9IHMtPmZpbHRlcjsKICAgICAgICAgcy0+cGFyYW1zLnJlc2FtcGxlX2ZpbHRlcl91diA9IHMtPmZpbHRlcjsKKyAgICAgICAgcy0+cGFyYW1zLm5vbWluYWxfcGVha19sdW1pbmFuY2UgPSBzLT5ub21pbmFsX3BlYWtfbHVtaW5hbmNlOworICAgICAgICBzLT5wYXJhbXMuYWxsb3dfYXBwcm94aW1hdGVfZ2FtbWEgPSBzLT5hcHByb3hpbWF0ZV9nYW1tYTsKIAotICAgICAgICBzLT5zcmNfZm9ybWF0LndpZHRoID0gaW4tPndpZHRoOwotICAgICAgICBzLT5zcmNfZm9ybWF0LmhlaWdodCA9IGluLT5oZWlnaHQ7Ci0gICAgICAgIHMtPnNyY19mb3JtYXQuc3Vic2FtcGxlX3cgPSBkZXNjLT5sb2cyX2Nocm9tYV93OwotICAgICAgICBzLT5zcmNfZm9ybWF0LnN1YnNhbXBsZV9oID0gZGVzYy0+bG9nMl9jaHJvbWFfaDsKLSAgICAgICAgcy0+c3JjX2Zvcm1hdC5kZXB0aCA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7Ci0gICAgICAgIHMtPnNyY19mb3JtYXQucGl4ZWxfdHlwZSA9IGRlc2MtPmNvbXBbMF0uZGVwdGggPiA4ID8gWklNR19QSVhFTF9XT1JEIDogWklNR19QSVhFTF9CWVRFOwotICAgICAgICBzLT5zcmNfZm9ybWF0LmNvbG9yX2ZhbWlseSA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpID8gWklNR19DT0xPUl9SR0IgOiBaSU1HX0NPTE9SX1lVVjsKLSAgICAgICAgcy0+c3JjX2Zvcm1hdC5tYXRyaXhfY29lZmZpY2llbnRzID0gKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgPyBaSU1HX01BVFJJWF9SR0IgOiBzLT5jb2xvcnNwYWNlX2luID09IC0xID8gY29udmVydF9tYXRyaXgoaW4tPmNvbG9yc3BhY2UpIDogcy0+Y29sb3JzcGFjZV9pbjsKLSAgICAgICAgcy0+c3JjX2Zvcm1hdC50cmFuc2Zlcl9jaGFyYWN0ZXJpc3RpY3MgPSAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKSA/IFpJTUdfVFJBTlNGRVJfVU5TUEVDSUZJRUQgOiBzLT50cmNfaW4gPT0gLSAxID8gY29udmVydF90cmMoaW4tPmNvbG9yX3RyYykgOiBzLT50cmNfaW47Ci0gICAgICAgIHMtPnNyY19mb3JtYXQuY29sb3JfcHJpbWFyaWVzID0gKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgPyBaSU1HX1BSSU1BUklFU19VTlNQRUNJRklFRCA6IHMtPnByaW1hcmllc19pbiA9PSAtMSA/IGNvbnZlcnRfcHJpbWFyaWVzKGluLT5jb2xvcl9wcmltYXJpZXMpIDogcy0+cHJpbWFyaWVzX2luOwotICAgICAgICBzLT5zcmNfZm9ybWF0LnBpeGVsX3JhbmdlID0gKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgPyBaSU1HX1JBTkdFX0ZVTEwgOiBzLT5yYW5nZV9pbiA9PSAtMSA/IGNvbnZlcnRfcmFuZ2UoaW4tPmNvbG9yX3JhbmdlKSA6IHMtPnJhbmdlX2luOwotCi0gICAgICAgIHMtPmRzdF9mb3JtYXQud2lkdGggPSBvdXQtPndpZHRoOwotICAgICAgICBzLT5kc3RfZm9ybWF0LmhlaWdodCA9IG91dC0+aGVpZ2h0OwotICAgICAgICBzLT5kc3RfZm9ybWF0LnN1YnNhbXBsZV93ID0gb2Rlc2MtPmxvZzJfY2hyb21hX3c7Ci0gICAgICAgIHMtPmRzdF9mb3JtYXQuc3Vic2FtcGxlX2ggPSBvZGVzYy0+bG9nMl9jaHJvbWFfaDsKLSAgICAgICAgcy0+ZHN0X2Zvcm1hdC5kZXB0aCA9IG9kZXNjLT5jb21wWzBdLmRlcHRoOwotICAgICAgICBzLT5kc3RfZm9ybWF0LnBpeGVsX3R5cGUgPSBvZGVzYy0+Y29tcFswXS5kZXB0aCA+IDggPyBaSU1HX1BJWEVMX1dPUkQgOiBaSU1HX1BJWEVMX0JZVEU7Ci0gICAgICAgIHMtPmRzdF9mb3JtYXQuY29sb3JfZmFtaWx5ID0gKG9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpID8gWklNR19DT0xPUl9SR0IgOiBaSU1HX0NPTE9SX1lVVjsKLSAgICAgICAgcy0+ZHN0X2Zvcm1hdC5tYXRyaXhfY29lZmZpY2llbnRzID0gKG9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpID8gWklNR19NQVRSSVhfUkdCIDogcy0+Y29sb3JzcGFjZSA9PSAtMSA/IGNvbnZlcnRfbWF0cml4KG91dC0+Y29sb3JzcGFjZSkgOiBzLT5jb2xvcnNwYWNlOwotICAgICAgICBzLT5kc3RfZm9ybWF0LnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcyA9IChvZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKSA/IFpJTUdfVFJBTlNGRVJfVU5TUEVDSUZJRUQgOiBzLT50cmMgPT0gLTEgPyBjb252ZXJ0X3RyYyhvdXQtPmNvbG9yX3RyYykgOiBzLT50cmM7Ci0gICAgICAgIHMtPmRzdF9mb3JtYXQuY29sb3JfcHJpbWFyaWVzID0gKG9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpID8gWklNR19QUklNQVJJRVNfVU5TUEVDSUZJRUQgOiBzLT5wcmltYXJpZXMgPT0gLTEgPyBjb252ZXJ0X3ByaW1hcmllcyhvdXQtPmNvbG9yX3ByaW1hcmllcykgOiBzLT5wcmltYXJpZXM7Ci0gICAgICAgIHMtPmRzdF9mb3JtYXQucGl4ZWxfcmFuZ2UgPSAob2Rlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQikgPyBaSU1HX1JBTkdFX0ZVTEwgOiBzLT5yYW5nZSA9PSAtMSA/IGNvbnZlcnRfcmFuZ2Uob3V0LT5jb2xvcl9yYW5nZSkgOiBzLT5yYW5nZTsKKyAgICAgICAgZm9ybWF0X2luaXQoJnMtPnNyY19mb3JtYXQsIGluLCBkZXNjLCBzLT5jb2xvcnNwYWNlX2luLAorICAgICAgICAgICAgICAgICAgICBzLT5wcmltYXJpZXNfaW4sIHMtPnRyY19pbiwgcy0+cmFuZ2VfaW4sIHMtPmNocm9tYWxfaW4pOworICAgICAgICBmb3JtYXRfaW5pdCgmcy0+ZHN0X2Zvcm1hdCwgb3V0LCBvZGVzYywgcy0+Y29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgcy0+cHJpbWFyaWVzLCBzLT50cmMsIHMtPnJhbmdlLCBzLT5jaHJvbWFsKTsKIAogICAgICAgICBpZiAocy0+Y29sb3JzcGFjZSAhPSAtMSkKICAgICAgICAgICAgIG91dC0+Y29sb3JzcGFjZSA9IChpbnQpcy0+ZHN0X2Zvcm1hdC5tYXRyaXhfY29lZmZpY2llbnRzOwpAQCAtNDgxLDI3ICs1ODAsMTMgQEAKICAgICAgICAgaWYgKHMtPnRyYyAhPSAtMSkKICAgICAgICAgICAgIG91dC0+Y29sb3JfdHJjID0gKGludClzLT5kc3RfZm9ybWF0LnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKIAotICAgICAgICB6aW1nX2ZpbHRlcl9ncmFwaF9mcmVlKHMtPmdyYXBoKTsKLSAgICAgICAgcy0+Z3JhcGggPSB6aW1nX2ZpbHRlcl9ncmFwaF9idWlsZCgmcy0+c3JjX2Zvcm1hdCwgJnMtPmRzdF9mb3JtYXQsICZzLT5wYXJhbXMpOwotICAgICAgICBpZiAoIXMtPmdyYXBoKSB7Ci0gICAgICAgICAgICByZXQgPSBwcmludF96aW1nX2Vycm9yKGxpbmstPmRzdCk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKHMtPmNocm9tYWwgIT0gLTEpCisgICAgICAgICAgICBvdXQtPmNocm9tYV9sb2NhdGlvbiA9IChpbnQpcy0+ZHN0X2Zvcm1hdC5jaHJvbWFfbG9jYXRpb24gLSAxOwogCi0gICAgICAgIGlmICgocmV0ID0gemltZ19maWx0ZXJfZ3JhcGhfZ2V0X3RtcF9zaXplKHMtPmdyYXBoLCAmdG1wX3NpemUpKSkgewotICAgICAgICAgICAgcmV0ID0gcHJpbnRfemltZ19lcnJvcihsaW5rLT5kc3QpOworICAgICAgICByZXQgPSBncmFwaF9idWlsZCgmcy0+Z3JhcGgsICZzLT5wYXJhbXMsICZzLT5zcmNfZm9ybWF0LCAmcy0+ZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPnRtcCwgJnMtPnRtcF9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodG1wX3NpemUgPiBzLT50bXBfc2l6ZSkgewotICAgICAgICAgICAgYXZfZnJlZXAoJnMtPnRtcCk7Ci0gICAgICAgICAgICBzLT50bXAgPSBhdl9tYWxsb2ModG1wX3NpemUpOwotICAgICAgICAgICAgaWYgKCFzLT50bXApIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcy0+dG1wX3NpemUgPSB0bXBfc2l6ZTsKLSAgICAgICAgfQogCiAgICAgICAgIHMtPmluX2NvbG9yc3BhY2UgID0gaW4tPmNvbG9yc3BhY2U7CiAgICAgICAgIHMtPmluX3RyYyAgICAgICAgID0gaW4tPmNvbG9yX3RyYzsKQEAgLTUyNCwxMyArNjA5LDEzIEBACiAgICAgICAgICAgICBzLT5hbHBoYV9zcmNfZm9ybWF0LndpZHRoID0gaW4tPndpZHRoOwogICAgICAgICAgICAgcy0+YWxwaGFfc3JjX2Zvcm1hdC5oZWlnaHQgPSBpbi0+aGVpZ2h0OwogICAgICAgICAgICAgcy0+YWxwaGFfc3JjX2Zvcm1hdC5kZXB0aCA9IGRlc2MtPmNvbXBbMF0uZGVwdGg7Ci0gICAgICAgICAgICBzLT5hbHBoYV9zcmNfZm9ybWF0LnBpeGVsX3R5cGUgPSBkZXNjLT5jb21wWzBdLmRlcHRoID4gOCA/IFpJTUdfUElYRUxfV09SRCA6IFpJTUdfUElYRUxfQllURTsKKyAgICAgICAgICAgIHMtPmFscGhhX3NyY19mb3JtYXQucGl4ZWxfdHlwZSA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19GTE9BVCkgPyBaSU1HX1BJWEVMX0ZMT0FUIDogZGVzYy0+Y29tcFswXS5kZXB0aCA+IDggPyBaSU1HX1BJWEVMX1dPUkQgOiBaSU1HX1BJWEVMX0JZVEU7CiAgICAgICAgICAgICBzLT5hbHBoYV9zcmNfZm9ybWF0LmNvbG9yX2ZhbWlseSA9IFpJTUdfQ09MT1JfR1JFWTsKIAogICAgICAgICAgICAgcy0+YWxwaGFfZHN0X2Zvcm1hdC53aWR0aCA9IG91dC0+d2lkdGg7CiAgICAgICAgICAgICBzLT5hbHBoYV9kc3RfZm9ybWF0LmhlaWdodCA9IG91dC0+aGVpZ2h0OwogICAgICAgICAgICAgcy0+YWxwaGFfZHN0X2Zvcm1hdC5kZXB0aCA9IG9kZXNjLT5jb21wWzBdLmRlcHRoOwotICAgICAgICAgICAgcy0+YWxwaGFfZHN0X2Zvcm1hdC5waXhlbF90eXBlID0gb2Rlc2MtPmNvbXBbMF0uZGVwdGggPiA4ID8gWklNR19QSVhFTF9XT1JEIDogWklNR19QSVhFTF9CWVRFOworICAgICAgICAgICAgcy0+YWxwaGFfZHN0X2Zvcm1hdC5waXhlbF90eXBlID0gKG9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19GTE9BVCkgPyBaSU1HX1BJWEVMX0ZMT0FUIDogb2Rlc2MtPmNvbXBbMF0uZGVwdGggPiA4ID8gWklNR19QSVhFTF9XT1JEIDogWklNR19QSVhFTF9CWVRFOwogICAgICAgICAgICAgcy0+YWxwaGFfZHN0X2Zvcm1hdC5jb2xvcl9mYW1pbHkgPSBaSU1HX0NPTE9SX0dSRVk7CiAKICAgICAgICAgICAgIHppbWdfZmlsdGVyX2dyYXBoX2ZyZWUocy0+YWxwaGFfZ3JhcGgpOwpAQCAtNTczLDcgKzY1OCw3IEBACiAKICAgICByZXQgPSB6aW1nX2ZpbHRlcl9ncmFwaF9wcm9jZXNzKHMtPmdyYXBoLCAmc3JjX2J1ZiwgJmRzdF9idWYsIHMtPnRtcCwgMCwgMCwgMCwgMCk7CiAgICAgaWYgKHJldCkgewotICAgICAgICBwcmludF96aW1nX2Vycm9yKGxpbmstPmRzdCk7CisgICAgICAgIHJldCA9IHByaW50X3ppbWdfZXJyb3IobGluay0+ZHN0KTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KIApAQCAtNTg4LDE0ICs2NzMsMjMgQEAKIAogICAgICAgICByZXQgPSB6aW1nX2ZpbHRlcl9ncmFwaF9wcm9jZXNzKHMtPmFscGhhX2dyYXBoLCAmc3JjX2J1ZiwgJmRzdF9idWYsIHMtPnRtcCwgMCwgMCwgMCwgMCk7CiAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgIHByaW50X3ppbWdfZXJyb3IobGluay0+ZHN0KTsKKyAgICAgICAgICAgIHJldCA9IHByaW50X3ppbWdfZXJyb3IobGluay0+ZHN0KTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAob2Rlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBKSB7Ci0gICAgICAgIGludCB5OworICAgICAgICBpbnQgeCwgeTsKIAotICAgICAgICBmb3IgKHkgPSAwOyB5IDwgb3V0bGluay0+aDsgeSsrKQotICAgICAgICAgICAgbWVtc2V0KG91dC0+ZGF0YVszXSArIHkgKiBvdXQtPmxpbmVzaXplWzNdLCAweGZmLCBvdXRsaW5rLT53KTsKKyAgICAgICAgaWYgKG9kZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19GTE9BVCkgeworICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IG91dC0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgb3V0LT53aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgICAgIEFWX1dOMzIob3V0LT5kYXRhWzNdICsgeCAqIG9kZXNjLT5jb21wWzNdLnN0ZXAgKyB5ICogb3V0LT5saW5lc2l6ZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mbG9hdDJpbnQoMS4wZikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBvdXRsaW5rLT5oOyB5KyspCisgICAgICAgICAgICAgICAgbWVtc2V0KG91dC0+ZGF0YVszXSArIHkgKiBvdXQtPmxpbmVzaXplWzNdLCAweGZmLCBvdXRsaW5rLT53KTsKKyAgICAgICAgfQogICAgIH0KIAogZmFpbDoKQEAgLTYxMyw2ICs3MDcsNyBAQAogICAgIFpTY2FsZUNvbnRleHQgKnMgPSBjdHgtPnByaXY7CiAKICAgICB6aW1nX2ZpbHRlcl9ncmFwaF9mcmVlKHMtPmdyYXBoKTsKKyAgICB6aW1nX2ZpbHRlcl9ncmFwaF9mcmVlKHMtPmFscGhhX2dyYXBoKTsKICAgICBhdl9mcmVlcCgmcy0+dG1wKTsKICAgICBzLT50bXBfc2l6ZSA9IDA7CiB9CkBAIC02NjUsMjEgKzc2MCwzNyBAQAogICAgIHsgICAgICJzcGxpbmUxNiIsICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfUkVTSVpFX1NQTElORTE2fSwgMCwgMCwgRkxBR1MsICJmaWx0ZXIiIH0sCiAgICAgeyAgICAgInNwbGluZTM2IiwgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19SRVNJWkVfU1BMSU5FMzZ9LCAwLCAwLCBGTEFHUywgImZpbHRlciIgfSwKICAgICB7ICAgICAibGFuY3pvcyIsICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1JFU0laRV9MQU5DWk9TfSwgIDAsIDAsIEZMQUdTLCAiZmlsdGVyIiB9LAorICAgIHsgIm91dF9yYW5nZSIsICJzZXQgY29sb3IgcmFuZ2UiLCAgT0ZGU0VUKHJhbmdlKSwgICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX1JBTkdFX0ZVTEwsIEZMQUdTLCAicmFuZ2UiIH0sCiAgICAgeyAicmFuZ2UiLCAic2V0IGNvbG9yIHJhbmdlIiwgICAgICBPRkZTRVQocmFuZ2UpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfUkFOR0VfRlVMTCwgRkxBR1MsICJyYW5nZSIgfSwKICAgICB7ICJyIiwgICAgICJzZXQgY29sb3IgcmFuZ2UiLCAgICAgIE9GRlNFVChyYW5nZSksICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgWklNR19SQU5HRV9GVUxMLCBGTEFHUywgInJhbmdlIiB9LAogICAgIHsgICAgICJpbnB1dCIsICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IC0xfSwgICAgICAgICAgICAgICAgIDAsIDAsIEZMQUdTLCAicmFuZ2UiIH0sCiAgICAgeyAgICAgImxpbWl0ZWQiLCAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19SQU5HRV9MSU1JVEVEfSwgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKICAgICB7ICAgICAiZnVsbCIsICAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1JBTkdFX0ZVTEx9LCAgICAwLCAwLCBGTEFHUywgInJhbmdlIiB9LAotICAgIHsgInByaW1hcmllcyIsICJzZXQgY29sb3IgcHJpbWFyaWVzIiwgT0ZGU0VUKHByaW1hcmllcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX1BSSU1BUklFU18yMDIwLCBGTEFHUywgInByaW1hcmllcyIgfSwKLSAgICB7ICJwIiwgICAgICAgICAic2V0IGNvbG9yIHByaW1hcmllcyIsIE9GRlNFVChwcmltYXJpZXMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgWklNR19QUklNQVJJRVNfMjAyMCwgRkxBR1MsICJwcmltYXJpZXMiIH0sCisgICAgeyAgICAgInVua25vd24iLCAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gLTF9LCAgICAgICAgICAgICAgICAgMCwgMCwgRkxBR1MsICJyYW5nZSIgfSwKKyAgICB7ICAgICAidHYiLCAgICAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1JBTkdFX0xJTUlURUR9LCAwLCAwLCBGTEFHUywgInJhbmdlIiB9LAorICAgIHsgICAgICJwYyIsICAgICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfUkFOR0VfRlVMTH0sICAgIDAsIDAsIEZMQUdTLCAicmFuZ2UiIH0sCisgICAgeyAicHJpbWFyaWVzIiwgInNldCBjb2xvciBwcmltYXJpZXMiLCBPRkZTRVQocHJpbWFyaWVzKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIElOVF9NQVgsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAorICAgIHsgInAiLCAgICAgICAgICJzZXQgY29sb3IgcHJpbWFyaWVzIiwgT0ZGU0VUKHByaW1hcmllcyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBGTEFHUywgInByaW1hcmllcyIgfSwKICAgICB7ICAgICAiaW5wdXQiLCAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAtMX0sICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAogICAgIHsgICAgICI3MDkiLCAgICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfUFJJTUFSSUVTXzcwOX0sICAgICAgICAgMCwgMCwgRkxBR1MsICJwcmltYXJpZXMiIH0sCiAgICAgeyAgICAgInVuc3BlY2lmaWVkIiwgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19QUklNQVJJRVNfVU5TUEVDSUZJRUR9LCAwLCAwLCBGTEFHUywgInByaW1hcmllcyIgfSwKICAgICB7ICAgICAiMTcwbSIsICAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1BSSU1BUklFU18xNzBNfSwgICAgICAgIDAsIDAsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAogICAgIHsgICAgICIyNDBtIiwgICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfUFJJTUFSSUVTXzI0ME19LCAgICAgICAgMCwgMCwgRkxBR1MsICJwcmltYXJpZXMiIH0sCiAgICAgeyAgICAgIjIwMjAiLCAgICAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19QUklNQVJJRVNfMjAyMH0sICAgICAgICAwLCAwLCBGTEFHUywgInByaW1hcmllcyIgfSwKLSAgICB7ICJ0cmFuc2ZlciIsICJzZXQgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWMiLCBPRkZTRVQodHJjKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfVFJBTlNGRVJfMjAyMF8xMiwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKLSAgICB7ICJ0IiwgICAgICAgICJzZXQgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWMiLCBPRkZTRVQodHJjKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfVFJBTlNGRVJfMjAyMF8xMiwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAidW5rbm93biIsICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1BSSU1BUklFU19VTlNQRUNJRklFRH0sIDAsIDAsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAorICAgIHsgICAgICJidDcwOSIsICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfUFJJTUFSSUVTXzcwOX0sICAgICAgICAgMCwgMCwgRkxBR1MsICJwcmltYXJpZXMiIH0sCisgICAgeyAgICAgImJ0NDcwbSIsICAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19QUklNQVJJRVNfNDcwX019LCAgICAgICAwLCAwLCBGTEFHUywgInByaW1hcmllcyIgfSwKKyAgICB7ICAgICAiYnQ0NzBiZyIsICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1BSSU1BUklFU180NzBfQkd9LCAgICAgIDAsIDAsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAorICAgIHsgICAgICJzbXB0ZTE3MG0iLCAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfUFJJTUFSSUVTXzE3ME19LCAgICAgICAgMCwgMCwgRkxBR1MsICJwcmltYXJpZXMiIH0sCisgICAgeyAgICAgInNtcHRlMjQwbSIsICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19QUklNQVJJRVNfMjQwTX0sICAgICAgICAwLCAwLCBGTEFHUywgInByaW1hcmllcyIgfSwKKyAgICB7ICAgICAiZmlsbSIsICAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1BSSU1BUklFU19GSUxNfSwgICAgICAgIDAsIDAsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAorICAgIHsgICAgICJidDIwMjAiLCAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfUFJJTUFSSUVTXzIwMjB9LCAgICAgICAgMCwgMCwgRkxBR1MsICJwcmltYXJpZXMiIH0sCisgICAgeyAgICAgInNtcHRlNDI4IiwgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19QUklNQVJJRVNfU1Q0Mjh9LCAgICAgICAwLCAwLCBGTEFHUywgInByaW1hcmllcyIgfSwKKyAgICB7ICAgICAic21wdGU0MzEiLCAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1BSSU1BUklFU19TVDQzMV8yfSwgICAgIDAsIDAsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAorICAgIHsgICAgICJzbXB0ZTQzMiIsICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfUFJJTUFSSUVTX1NUNDMyXzF9LCAgICAgMCwgMCwgRkxBR1MsICJwcmltYXJpZXMiIH0sCisgICAgeyAgICAgImplZGVjLXAyMiIsICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19QUklNQVJJRVNfRUJVMzIxM19FfSwgICAwLCAwLCBGTEFHUywgInByaW1hcmllcyIgfSwKKyAgICB7ICJ0cmFuc2ZlciIsICJzZXQgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWMiLCBPRkZTRVQodHJjKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIElOVF9NQVgsIEZMQUdTLCAidHJhbnNmZXIiIH0sCisgICAgeyAidCIsICAgICAgICAic2V0IHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljIiwgT0ZGU0VUKHRyYyksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBGTEFHUywgInRyYW5zZmVyIiB9LAogICAgIHsgICAgICJpbnB1dCIsICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IC0xfSwgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKICAgICB7ICAgICAiNzA5IiwgICAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSXzcwOX0sICAgICAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKICAgICB7ICAgICAidW5zcGVjaWZpZWQiLCAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSX1VOU1BFQ0lGSUVEfSwgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKQEAgLTY4NywyNCArNzk4LDY0IEBACiAgICAgeyAgICAgImxpbmVhciIsICAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19UUkFOU0ZFUl9MSU5FQVJ9LCAgICAgIDAsIDAsIEZMQUdTLCAidHJhbnNmZXIiIH0sCiAgICAgeyAgICAgIjIwMjBfMTAiLCAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19UUkFOU0ZFUl8yMDIwXzEwfSwgICAgIDAsIDAsIEZMQUdTLCAidHJhbnNmZXIiIH0sCiAgICAgeyAgICAgIjIwMjBfMTIiLCAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19UUkFOU0ZFUl8yMDIwXzEyfSwgICAgIDAsIDAsIEZMQUdTLCAidHJhbnNmZXIiIH0sCi0gICAgeyAibWF0cml4IiwgInNldCBjb2xvcnNwYWNlIG1hdHJpeCIsIE9GRlNFVChjb2xvcnNwYWNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfTUFUUklYXzIwMjBfQ0wsIEZMQUdTLCAibWF0cml4IiB9LAotICAgIHsgIm0iLCAgICAgICJzZXQgY29sb3JzcGFjZSBtYXRyaXgiLCBPRkZTRVQoY29sb3JzcGFjZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX01BVFJJWF8yMDIwX0NMLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICAgICAidW5rbm93biIsICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSX1VOU1BFQ0lGSUVEfSwgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAiYnQ0NzBtIiwgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSXzQ3MF9NfSwgICAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAiYnQ0NzBiZyIsICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSXzQ3MF9CR30sICAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAic21wdGUxNzBtIiwgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSXzYwMX0sICAgICAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAiYnQ3MDkiLCAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSXzcwOX0sICAgICAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAibGluZWFyIiwgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSX0xJTkVBUn0sICAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAibG9nMTAwIiwgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSX0xPR18xMDB9LCAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAibG9nMzE2IiwgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSX0xPR18zMTZ9LCAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAiYnQyMDIwLTEwIiwgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSXzIwMjBfMTB9LCAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAiYnQyMDIwLTEyIiwgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSXzIwMjBfMTJ9LCAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAic21wdGUyMDg0IiwgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSX1NUMjA4NH0sICAgICAgMCwgMCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICAgICAiaWVjNjE5NjYtMi00IiwgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX1RSQU5TRkVSX0lFQ182MTk2Nl8yXzR9LDAsIDAsIEZMQUdTLCAidHJhbnNmZXIiIH0sCisgICAgeyAgICAgImllYzYxOTY2LTItMSIsICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19UUkFOU0ZFUl9JRUNfNjE5NjZfMl8xfSwwLCAwLCBGTEFHUywgInRyYW5zZmVyIiB9LAorICAgIHsgICAgICJhcmliLXN0ZC1iNjciLCAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfVFJBTlNGRVJfQVJJQl9CNjd9LCAgICAwLCAwLCBGTEFHUywgInRyYW5zZmVyIiB9LAorICAgIHsgIm1hdHJpeCIsICJzZXQgY29sb3JzcGFjZSBtYXRyaXgiLCBPRkZTRVQoY29sb3JzcGFjZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICJtIiwgICAgICAic2V0IGNvbG9yc3BhY2UgbWF0cml4IiwgT0ZGU0VUKGNvbG9yc3BhY2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgSU5UX01BWCwgRkxBR1MsICJtYXRyaXgiIH0sCiAgICAgeyAgICAgImlucHV0IiwgICAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gLTF9LCAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBGTEFHUywgIm1hdHJpeCIgfSwKICAgICB7ICAgICAiNzA5IiwgICAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX01BVFJJWF83MDl9LCAgICAgICAgIDAsIDAsIEZMQUdTLCAibWF0cml4IiB9LAogICAgIHsgICAgICJ1bnNwZWNpZmllZCIsICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfTUFUUklYX1VOU1BFQ0lGSUVEfSwgMCwgMCwgRkxBR1MsICJtYXRyaXgiIH0sCiAgICAgeyAgICAgIjQ3MGJnIiwgICAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19NQVRSSVhfNDcwQkd9LCAgICAgICAwLCAwLCBGTEFHUywgIm1hdHJpeCIgfSwKICAgICB7ICAgICAiMTcwbSIsICAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX01BVFJJWF8xNzBNfSwgICAgICAgIDAsIDAsIEZMQUdTLCAibWF0cml4IiB9LAotICAgIHsgICAgICJ5Y2djbyIsICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfTUFUUklYX1lDR0NPfSwgICAgICAgMCwgMCwgRkxBR1MsICJtYXRyaXgiIH0sCiAgICAgeyAgICAgIjIwMjBfbmNsIiwgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19NQVRSSVhfMjAyMF9OQ0x9LCAgICAwLCAwLCBGTEFHUywgIm1hdHJpeCIgfSwKICAgICB7ICAgICAiMjAyMF9jbCIsICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX01BVFJJWF8yMDIwX0NMfSwgICAgIDAsIDAsIEZMQUdTLCAibWF0cml4IiB9LAorICAgIHsgICAgICJ1bmtub3duIiwgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfTUFUUklYX1VOU1BFQ0lGSUVEfSwgMCwgMCwgRkxBR1MsICJtYXRyaXgiIH0sCisgICAgeyAgICAgImdiciIsICAgICAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19NQVRSSVhfUkdCfSwgICAgICAgICAwLCAwLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICAgICAiYnQ3MDkiLCAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX01BVFJJWF83MDl9LCAgICAgICAgIDAsIDAsIEZMQUdTLCAibWF0cml4IiB9LAorICAgIHsgICAgICJmY2MiLCAgICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfTUFUUklYX0ZDQ30sICAgICAgICAgMCwgMCwgRkxBR1MsICJtYXRyaXgiIH0sCisgICAgeyAgICAgImJ0NDcwYmciLCAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19NQVRSSVhfNDcwQkd9LCAgICAgICAwLCAwLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICAgICAic21wdGUxNzBtIiwgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX01BVFJJWF8xNzBNfSwgICAgICAgIDAsIDAsIEZMQUdTLCAibWF0cml4IiB9LAorICAgIHsgICAgICJzbXB0ZTI0MDBtIiwgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfTUFUUklYXzI0ME19LCAgICAgICAgMCwgMCwgRkxBR1MsICJtYXRyaXgiIH0sCisgICAgeyAgICAgInljZ2NvIiwgICAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19NQVRSSVhfWUNHQ099LCAgICAgICAwLCAwLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICAgICAiYnQyMDIwbmMiLCAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX01BVFJJWF8yMDIwX05DTH0sICAgIDAsIDAsIEZMQUdTLCAibWF0cml4IiB9LAorICAgIHsgICAgICJidDIwMjBjIiwgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfTUFUUklYXzIwMjBfQ0x9LCAgICAgMCwgMCwgRkxBR1MsICJtYXRyaXgiIH0sCisgICAgeyAgICAgImNocm9tYS1kZXJpdmVkLW5jIiwwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19NQVRSSVhfQ0hST01BVElDSVRZX0RFUklWRURfTkNMfSwgMCwgMCwgRkxBR1MsICJtYXRyaXgiIH0sCisgICAgeyAgICAgImNocm9tYS1kZXJpdmVkLWMiLCAwLCAgICAgICAwLCAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19NQVRSSVhfQ0hST01BVElDSVRZX0RFUklWRURfQ0x9LCAwLCAwLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICAgICAiaWN0Y3AiLCAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX01BVFJJWF9JQ1RDUH0sICAgICAgIDAsIDAsIEZMQUdTLCAibWF0cml4IiB9LAorICAgIHsgImluX3JhbmdlIiwgInNldCBpbnB1dCBjb2xvciByYW5nZSIsIE9GRlNFVChyYW5nZV9pbiksICAgIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX1JBTkdFX0ZVTEwsIEZMQUdTLCAicmFuZ2UiIH0sCiAgICAgeyAicmFuZ2VpbiIsICJzZXQgaW5wdXQgY29sb3IgcmFuZ2UiLCBPRkZTRVQocmFuZ2VfaW4pLCAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfUkFOR0VfRlVMTCwgRkxBR1MsICJyYW5nZSIgfSwKICAgICB7ICJyaW4iLCAgICAgInNldCBpbnB1dCBjb2xvciByYW5nZSIsIE9GRlNFVChyYW5nZV9pbiksICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgWklNR19SQU5HRV9GVUxMLCBGTEFHUywgInJhbmdlIiB9LAotICAgIHsgInByaW1hcmllc2luIiwgInNldCBpbnB1dCBjb2xvciBwcmltYXJpZXMiLCBPRkZTRVQocHJpbWFyaWVzX2luKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfUFJJTUFSSUVTXzIwMjAsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAotICAgIHsgInBpbiIsICAgICAgICAgInNldCBpbnB1dCBjb2xvciBwcmltYXJpZXMiLCBPRkZTRVQocHJpbWFyaWVzX2luKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfUFJJTUFSSUVTXzIwMjAsIEZMQUdTLCAicHJpbWFyaWVzIiB9LAotICAgIHsgInRyYW5zZmVyaW4iLCAic2V0IGlucHV0IHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljIiwgT0ZGU0VUKHRyY19pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX1RSQU5TRkVSXzIwMjBfMTIsIEZMQUdTLCAidHJhbnNmZXIiIH0sCi0gICAgeyAidGluIiwgICAgICAgICJzZXQgaW5wdXQgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWMiLCBPRkZTRVQodHJjX2luKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfVFJBTlNGRVJfMjAyMF8xMiwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKLSAgICB7ICJtYXRyaXhpbiIsICJzZXQgaW5wdXQgY29sb3JzcGFjZSBtYXRyaXgiLCBPRkZTRVQoY29sb3JzcGFjZV9pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX01BVFJJWF8yMDIwX0NMLCBGTEFHUywgIm1hdHJpeCIgfSwKLSAgICB7ICJtaW4iLCAgICAgICJzZXQgaW5wdXQgY29sb3JzcGFjZSBtYXRyaXgiLCBPRkZTRVQoY29sb3JzcGFjZV9pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX01BVFJJWF8yMDIwX0NMLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICJwcmltYXJpZXNpbiIsICJzZXQgaW5wdXQgY29sb3IgcHJpbWFyaWVzIiwgT0ZGU0VUKHByaW1hcmllc19pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBGTEFHUywgInByaW1hcmllcyIgfSwKKyAgICB7ICJwaW4iLCAgICAgICAgICJzZXQgaW5wdXQgY29sb3IgcHJpbWFyaWVzIiwgT0ZGU0VUKHByaW1hcmllc19pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBGTEFHUywgInByaW1hcmllcyIgfSwKKyAgICB7ICJ0cmFuc2ZlcmluIiwgInNldCBpbnB1dCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyIsIE9GRlNFVCh0cmNfaW4pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgSU5UX01BWCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICJ0aW4iLCAgICAgICAgInNldCBpbnB1dCB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyIsIE9GRlNFVCh0cmNfaW4pLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgSU5UX01BWCwgRkxBR1MsICJ0cmFuc2ZlciIgfSwKKyAgICB7ICJtYXRyaXhpbiIsICJzZXQgaW5wdXQgY29sb3JzcGFjZSBtYXRyaXgiLCBPRkZTRVQoY29sb3JzcGFjZV9pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICJtaW4iLCAgICAgICJzZXQgaW5wdXQgY29sb3JzcGFjZSBtYXRyaXgiLCBPRkZTRVQoY29sb3JzcGFjZV9pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBJTlRfTUFYLCBGTEFHUywgIm1hdHJpeCIgfSwKKyAgICB7ICJjaHJvbWFsIiwgICJzZXQgb3V0cHV0IGNocm9tYSBsb2NhdGlvbiIsIE9GRlNFVChjaHJvbWFsKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfQ0hST01BX0JPVFRPTSwgRkxBR1MsICJjaHJvbWEiIH0sCisgICAgeyAiYyIsICAgICAgICAic2V0IG91dHB1dCBjaHJvbWEgbG9jYXRpb24iLCBPRkZTRVQoY2hyb21hbCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX0NIUk9NQV9CT1RUT00sIEZMQUdTLCAiY2hyb21hIiB9LAorICAgIHsgICAgICJpbnB1dCIsICAgICAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSAtMX0sICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBGTEFHUywgImNocm9tYSIgfSwKKyAgICB7ICAgICAibGVmdCIsICAgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19DSFJPTUFfTEVGVH0sICAgICAgICAgMCwgMCwgRkxBR1MsICJjaHJvbWEiIH0sCisgICAgeyAgICAgImNlbnRlciIsICAgIDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfQ0hST01BX0NFTlRFUn0sICAgICAgIDAsIDAsIEZMQUdTLCAiY2hyb21hIiB9LAorICAgIHsgICAgICJ0b3BsZWZ0IiwgICAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX0NIUk9NQV9UT1BfTEVGVH0sICAgICAwLCAwLCBGTEFHUywgImNocm9tYSIgfSwKKyAgICB7ICAgICAidG9wIiwgICAgICAgMCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gWklNR19DSFJPTUFfVE9QfSwgICAgICAgICAgMCwgMCwgRkxBR1MsICJjaHJvbWEiIH0sCisgICAgeyAgICAgImJvdHRvbWxlZnQiLDAsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFpJTUdfQ0hST01BX0JPVFRPTV9MRUZUfSwgIDAsIDAsIEZMQUdTLCAiY2hyb21hIiB9LAorICAgIHsgICAgICJib3R0b20iLCAgICAwLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBaSU1HX0NIUk9NQV9CT1RUT019LCAgICAgICAwLCAwLCBGTEFHUywgImNocm9tYSIgfSwKKyAgICB7ICJjaHJvbWFsaW4iLCAgInNldCBpbnB1dCBjaHJvbWEgbG9jYXRpb24iLCBPRkZTRVQoY2hyb21hbF9pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIC0xLCBaSU1HX0NIUk9NQV9CT1RUT00sIEZMQUdTLCAiY2hyb21hIiB9LAorICAgIHsgImNpbiIsICAgICAgICAic2V0IGlucHV0IGNocm9tYSBsb2NhdGlvbiIsIE9GRlNFVChjaHJvbWFsX2luKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIFpJTUdfQ0hST01BX0JPVFRPTSwgRkxBR1MsICJjaHJvbWEiIH0sCisgICAgeyAibnBsIiwgICAgICAgInNldCBub21pbmFsIHBlYWsgbHVtaW5hbmNlIiwgT0ZGU0VUKG5vbWluYWxfcGVha19sdW1pbmFuY2UpLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsID0gTkFOfSwgMCwgREJMX01BWCwgRkxBR1MgfSwKKyAgICB7ICJhZ2FtbWEiLCAgICAgICAiYWxsb3cgYXBwcm94aW1hdGUgZ2FtbWEiLCBPRkZTRVQoYXBwcm94aW1hdGVfZ2FtbWEpLCAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQgPSAxfSwgICAwLCAxLCAgICAgICBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92aWRlby5jIGIvbGliYXZmaWx0ZXIvdmlkZW8uYwppbmRleCAyNzQ0YmU2Li43YThlNTg3IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92aWRlby5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZpZGVvLmMKQEAgLTI1LDYgKzI1LDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9idWZmZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaHdjb250ZXh0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgogCkBAIC00MiwxOCArNDMsMzQgQEAKIAogQVZGcmFtZSAqZmZfZGVmYXVsdF9nZXRfdmlkZW9fYnVmZmVyKEFWRmlsdGVyTGluayAqbGluaywgaW50IHcsIGludCBoKQogeworICAgIEFWRnJhbWUgKmZyYW1lID0gTlVMTDsKICAgICBpbnQgcG9vbF93aWR0aCA9IDA7CiAgICAgaW50IHBvb2xfaGVpZ2h0ID0gMDsKICAgICBpbnQgcG9vbF9hbGlnbiA9IDA7CiAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBvb2xfZm9ybWF0ID0gQVZfUElYX0ZNVF9OT05FOwogCi0gICAgaWYgKCFsaW5rLT52aWRlb19mcmFtZV9wb29sKSB7Ci0gICAgICAgIGxpbmstPnZpZGVvX2ZyYW1lX3Bvb2wgPSBmZl92aWRlb19mcmFtZV9wb29sX2luaXQoYXZfYnVmZmVyX2FsbG9jeiwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rLT5mb3JtYXQsIEJVRkZFUl9BTElHTik7Ci0gICAgICAgIGlmICghbGluay0+dmlkZW9fZnJhbWVfcG9vbCkKKyAgICBpZiAobGluay0+aHdfZnJhbWVzX2N0eCAmJgorICAgICAgICAoKEFWSFdGcmFtZXNDb250ZXh0KilsaW5rLT5od19mcmFtZXNfY3R4LT5kYXRhKS0+Zm9ybWF0ID09IGxpbmstPmZvcm1hdCkgeworICAgICAgICBpbnQgcmV0OworICAgICAgICBBVkZyYW1lICpmcmFtZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisKKyAgICAgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworCisgICAgICAgIHJldCA9IGF2X2h3ZnJhbWVfZ2V0X2J1ZmZlcihsaW5rLT5od19mcmFtZXNfY3R4LCBmcmFtZSwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOworCisgICAgICAgIHJldHVybiBmcmFtZTsKKyAgICB9CisKKyAgICBpZiAoIWxpbmstPmZyYW1lX3Bvb2wpIHsKKyAgICAgICAgbGluay0+ZnJhbWVfcG9vbCA9IGZmX2ZyYW1lX3Bvb2xfdmlkZW9faW5pdChhdl9idWZmZXJfYWxsb2N6LCB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmstPmZvcm1hdCwgQlVGRkVSX0FMSUdOKTsKKyAgICAgICAgaWYgKCFsaW5rLT5mcmFtZV9wb29sKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGZmX3ZpZGVvX2ZyYW1lX3Bvb2xfZ2V0X2NvbmZpZyhsaW5rLT52aWRlb19mcmFtZV9wb29sLAorICAgICAgICBpZiAoZmZfZnJhbWVfcG9vbF9nZXRfdmlkZW9fY29uZmlnKGxpbmstPmZyYW1lX3Bvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvb2xfd2lkdGgsICZwb29sX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9vbF9mb3JtYXQsICZwb29sX2FsaWduKSA8IDApIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNjIsMTUgKzc5LDIxIEBACiAgICAgICAgIGlmIChwb29sX3dpZHRoICE9IHcgfHwgcG9vbF9oZWlnaHQgIT0gaCB8fAogICAgICAgICAgICAgcG9vbF9mb3JtYXQgIT0gbGluay0+Zm9ybWF0IHx8IHBvb2xfYWxpZ24gIT0gQlVGRkVSX0FMSUdOKSB7CiAKLSAgICAgICAgICAgIGZmX3ZpZGVvX2ZyYW1lX3Bvb2xfdW5pbml0KChGRlZpZGVvRnJhbWVQb29sICoqKSZsaW5rLT52aWRlb19mcmFtZV9wb29sKTsKLSAgICAgICAgICAgIGxpbmstPnZpZGVvX2ZyYW1lX3Bvb2wgPSBmZl92aWRlb19mcmFtZV9wb29sX2luaXQoYXZfYnVmZmVyX2FsbG9jeiwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Zm9ybWF0LCBCVUZGRVJfQUxJR04pOwotICAgICAgICAgICAgaWYgKCFsaW5rLT52aWRlb19mcmFtZV9wb29sKQorICAgICAgICAgICAgZmZfZnJhbWVfcG9vbF91bmluaXQoKEZGRnJhbWVQb29sICoqKSZsaW5rLT5mcmFtZV9wb29sKTsKKyAgICAgICAgICAgIGxpbmstPmZyYW1lX3Bvb2wgPSBmZl9mcmFtZV9wb29sX3ZpZGVvX2luaXQoYXZfYnVmZmVyX2FsbG9jeiwgdywgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluay0+Zm9ybWF0LCBCVUZGRVJfQUxJR04pOworICAgICAgICAgICAgaWYgKCFsaW5rLT5mcmFtZV9wb29sKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIGZmX3ZpZGVvX2ZyYW1lX3Bvb2xfZ2V0KGxpbmstPnZpZGVvX2ZyYW1lX3Bvb2wpOworICAgIGZyYW1lID0gZmZfZnJhbWVfcG9vbF9nZXQobGluay0+ZnJhbWVfcG9vbCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87CisKKyAgICByZXR1cm4gZnJhbWU7CiB9CiAKIEFWRnJhbWUgKmZmX2dldF92aWRlb19idWZmZXIoQVZGaWx0ZXJMaW5rICpsaW5rLCBpbnQgdywgaW50IGgpCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92aWRzdGFidXRpbHMuYyBiL2xpYmF2ZmlsdGVyL3ZpZHN0YWJ1dGlscy5jCmluZGV4IDEzNTQ0Y2YuLjExOTlkYmQgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZpZHN0YWJ1dGlscy5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZpZHN0YWJ1dGlscy5jCkBAIC00Miw3ICs0Miw3IEBACiB9CiAKIC8qKiBzdHJ1Y3QgdG8gaG9sZCBhIHZhbGlkIGNvbnRleHQgZm9yIGxvZ2dpbmcgZnJvbSB3aXRoaW4gdmlkLnN0YWIgbGliICovCi10eXBlZGVmIHN0cnVjdCB7Cit0eXBlZGVmIHN0cnVjdCBWUzJBVkxvZ0N0eCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiB9IFZTMkFWTG9nQ3R4OwogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92bWFmX21vdGlvbi5oIGIvbGliYXZmaWx0ZXIvdm1hZl9tb3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTk4NDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdm1hZl9tb3Rpb24uaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNyBBc2hpc2ggUHJhdGFwIFNpbmdoIDxhc2hrNDM3MTJAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRklMVEVSX1ZNQUZfTU9USU9OX0gKKyNkZWZpbmUgQVZGSUxURVJfVk1BRl9NT1RJT05fSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAidmlkZW8uaCIKKwordHlwZWRlZiBzdHJ1Y3QgVk1BRk1vdGlvbkRTUENvbnRleHQgeworICAgIHVpbnQ2NF90ICgqc2FkKShjb25zdCB1aW50MTZfdCAqaW1nMSwgY29uc3QgdWludDE2X3QgKmltZzIsIGludCB3LCBpbnQgaCwKKyAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGltZzFfc3RyaWRlLCBwdHJkaWZmX3QgaW1nMl9zdHJpZGUpOworICAgIHZvaWQgKCpjb252b2x1dGlvbl94KShjb25zdCB1aW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdF93LCBjb25zdCB1aW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqZHN0LCBpbnQgdywgaW50IGgsIHB0cmRpZmZfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgZHN0X3N0cmlkZSk7CisgICAgdm9pZCAoKmNvbnZvbHV0aW9uX3kpKGNvbnN0IHVpbnQxNl90ICpmaWx0ZXIsIGludCBmaWx0X3csIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdCwgaW50IHcsIGludCBoLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGRzdF9zdHJpZGUpOworfSBWTUFGTW90aW9uRFNQQ29udGV4dDsKKwordm9pZCBmZl92bWFmbW90aW9uX2luaXRfeDg2KFZNQUZNb3Rpb25EU1BDb250ZXh0ICpkc3ApOworCit0eXBlZGVmIHN0cnVjdCBWTUFGTW90aW9uRGF0YSB7CisgICAgdWludDE2X3QgZmlsdGVyWzVdOworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworICAgIHB0cmRpZmZfdCBzdHJpZGU7CisgICAgdWludDE2X3QgKmJsdXJfZGF0YVsyIC8qIGN1ciwgcHJldiAqL107CisgICAgdWludDE2X3QgKnRlbXBfZGF0YTsKKyAgICBkb3VibGUgbW90aW9uX3N1bTsKKyAgICB1aW50NjRfdCBuYl9mcmFtZXM7CisgICAgVk1BRk1vdGlvbkRTUENvbnRleHQgdm1hZmRzcDsKK30gVk1BRk1vdGlvbkRhdGE7CisKK2ludCBmZl92bWFmbW90aW9uX2luaXQoVk1BRk1vdGlvbkRhdGEgKmRhdGEsIGludCB3LCBpbnQgaCwgZW51bSBBVlBpeGVsRm9ybWF0IGZtdCk7Citkb3VibGUgZmZfdm1hZm1vdGlvbl9wcm9jZXNzKFZNQUZNb3Rpb25EYXRhICpkYXRhLCBBVkZyYW1lICpmcmFtZSk7Citkb3VibGUgZmZfdm1hZm1vdGlvbl91bmluaXQoVk1BRk1vdGlvbkRhdGEgKmRhdGEpOworCisjZW5kaWYgLyogQVZGSUxURVJfVk1BRl9NT1RJT05fSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdnNyY19jZWxsYXV0by5jIGIvbGliYXZmaWx0ZXIvdnNyY19jZWxsYXV0by5jCmluZGV4IDY3YmQxNjcuLjdhNmQ5NjUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZzcmNfY2VsbGF1dG8uYworKysgYi9saWJhdmZpbHRlci92c3JjX2NlbGxhdXRvLmMKQEAgLTM3LDcgKzM3LDcgQEAKICNpbmNsdWRlICJmb3JtYXRzLmgiCiAjaW5jbHVkZSAidmlkZW8uaCIKIAotdHlwZWRlZiBzdHJ1Y3QgewordHlwZWRlZiBzdHJ1Y3QgQ2VsbEF1dG9Db250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgdywgaDsKICAgICBjaGFyICpmaWxlbmFtZTsKQEAgLTY1LDggKzY1LDggQEAKICAgICB7ICJmIiwgICAgICAgICJyZWFkIGluaXRpYWwgcGF0dGVybiBmcm9tIGZpbGUiLCBPRkZTRVQoZmlsZW5hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTIH0sCiAgICAgeyAicGF0dGVybiIsICAic2V0IGluaXRpYWwgcGF0dGVybiIsIE9GRlNFVChwYXR0ZXJuKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBGTEFHUyB9LAogICAgIHsgInAiLCAgICAgICAgInNldCBpbml0aWFsIHBhdHRlcm4iLCBPRkZTRVQocGF0dGVybiksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKLSAgICB7ICJyYXRlIiwgICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKLSAgICB7ICJyIiwgICAgICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyYXRlIiwgICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKKyAgICB7ICJyIiwgICAgICAgICJzZXQgdmlkZW8gcmF0ZSIsIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgSU5UX01BWCwgRkxBR1MgfSwKICAgICB7ICJzaXplIiwgICAgICJzZXQgdmlkZW8gc2l6ZSIsIE9GRlNFVCh3KSwgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKICAgICB7ICJzIiwgICAgICAgICJzZXQgdmlkZW8gc2l6ZSIsIE9GRlNFVCh3KSwgICAgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgRkxBR1MgfSwKICAgICB7ICJydWxlIiwgICAgICJzZXQgcnVsZSIsICAgICAgIE9GRlNFVChydWxlKSwgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDExMH0sICAwLCAyNTUsIEZMQUdTIH0sCkBAIC0xOTksNyArMTk5LDcgQEAKICAgICB9CiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKLSAgICAgICAgICAgInM6JWR4JWQgcjolZC8lZCBydWxlOiVkIHN0aXRjaDolZCBzY3JvbGw6JWQgZnVsbDolZCBzZWVkOiV1XG4iLAorICAgICAgICAgICAiczolZHglZCByOiVkLyVkIHJ1bGU6JWQgc3RpdGNoOiVkIHNjcm9sbDolZCBmdWxsOiVkIHNlZWQ6JSJQUkl1MzIiXG4iLAogICAgICAgICAgICBzLT53LCBzLT5oLCBzLT5mcmFtZV9yYXRlLm51bSwgcy0+ZnJhbWVfcmF0ZS5kZW4sCiAgICAgICAgICAgIHMtPnJ1bGUsIHMtPnN0aXRjaCwgcy0+c2Nyb2xsLCBzLT5zdGFydF9mdWxsLAogICAgICAgICAgICBzLT5yYW5kb21fc2VlZCk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci92c3JjX2xpZmUuYyBiL2xpYmF2ZmlsdGVyL3ZzcmNfbGlmZS5jCmluZGV4IDNkMWQzNmYuLmE4N2NlZWYgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3ZzcmNfbGlmZS5jCisrKyBiL2xpYmF2ZmlsdGVyL3ZzcmNfbGlmZS5jCkBAIC0zOCw3ICszOCw3IEBACiAjaW5jbHVkZSAiZm9ybWF0cy5oIgogI2luY2x1ZGUgInZpZGVvLmgiCiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IExpZmVDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgdywgaDsKICAgICBjaGFyICpmaWxlbmFtZTsKQEAgLTgyLDggKzgyLDggQEAKICAgICB7ICJmIiwgICAgICAgICJzZXQgc291cmNlIGZpbGUiLCAgT0ZGU0VUKGZpbGVuYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBGTEFHUyB9LAogICAgIHsgInNpemUiLCAgICAgInNldCB2aWRlbyBzaXplIiwgICBPRkZTRVQodyksICAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBGTEFHUyB9LAogICAgIHsgInMiLCAgICAgICAgInNldCB2aWRlbyBzaXplIiwgICBPRkZTRVQodyksICAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCB7LnN0ciA9IE5VTEx9LCAwLCAwLCBGTEFHUyB9LAotICAgIHsgInJhdGUiLCAgICAgInNldCB2aWRlbyByYXRlIiwgICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsIEZMQUdTIH0sCi0gICAgeyAiciIsICAgICAgICAic2V0IHZpZGVvIHJhdGUiLCAgIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyYXRlIiwgICAgICJzZXQgdmlkZW8gcmF0ZSIsICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAorICAgIHsgInIiLCAgICAgICAgInNldCB2aWRlbyByYXRlIiwgICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCiAgICAgeyAicnVsZSIsICAgICAic2V0IHJ1bGUiLCAgICAgICAgIE9GRlNFVChydWxlX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSAiQjMvUzIzIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgRkxBR1MgfSwKICAgICB7ICJyYW5kb21fZmlsbF9yYXRpbyIsICJzZXQgZmlsbCByYXRpbyBmb3IgZmlsbGluZyBpbml0aWFsIGdyaWQgcmFuZG9tbHkiLCBPRkZTRVQocmFuZG9tX2ZpbGxfcmF0aW8pLCBBVl9PUFRfVFlQRV9ET1VCTEUsIHsuZGJsPTEvTV9QSEl9LCAwLCAxLCBGTEFHUyB9LAogICAgIHsgInJhdGlvIiwgICAgICAgICAgICAgInNldCBmaWxsIHJhdGlvIGZvciBmaWxsaW5nIGluaXRpYWwgZ3JpZCByYW5kb21seSIsIE9GRlNFVChyYW5kb21fZmlsbF9yYXRpbyksIEFWX09QVF9UWVBFX0RPVUJMRSwgey5kYmw9MS9NX1BISX0sIDAsIDEsIEZMQUdTIH0sCkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICB9CiAKICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwKLSAgICAgICAgICAgInM6JWR4JWQgcjolZC8lZCBydWxlOiVzIHN0YXlfcnVsZTolZCBib3JuX3J1bGU6JWQgc3RpdGNoOiVkIHNlZWQ6JXVcbiIsCisgICAgICAgICAgICJzOiVkeCVkIHI6JWQvJWQgcnVsZTolcyBzdGF5X3J1bGU6JWQgYm9ybl9ydWxlOiVkIHN0aXRjaDolZCBzZWVkOiUiUFJJdTMyIlxuIiwKICAgICAgICAgICAgbGlmZS0+dywgbGlmZS0+aCwgbGlmZS0+ZnJhbWVfcmF0ZS5udW0sIGxpZmUtPmZyYW1lX3JhdGUuZGVuLAogICAgICAgICAgICBsaWZlLT5ydWxlX3N0ciwgbGlmZS0+c3RheV9ydWxlLCBsaWZlLT5ib3JuX3J1bGUsIGxpZmUtPnN0aXRjaCwKICAgICAgICAgICAgbGlmZS0+cmFuZG9tX3NlZWQpOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdnNyY19tYW5kZWxicm90LmMgYi9saWJhdmZpbHRlci92c3JjX21hbmRlbGJyb3QuYwppbmRleCAyZjY5NDRmLi42YWQxMDgxIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92c3JjX21hbmRlbGJyb3QuYworKysgYi9saWJhdmZpbHRlci92c3JjX21hbmRlbGJyb3QuYwpAQCAtNTcsNyArNTcsNyBAQAogICAgIHVpbnQzMl90IHZhbDsKIH0gUG9pbnQ7CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IE1CQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgaW50IHcsIGg7CiAgICAgQVZSYXRpb25hbCBmcmFtZV9yYXRlOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdnNyY19tcHRlc3RzcmMuYyBiL2xpYmF2ZmlsdGVyL3ZzcmNfbXB0ZXN0c3JjLmMKaW5kZXggMjVhZDJhZC4uYzVmZGVhNyAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvdnNyY19tcHRlc3RzcmMuYworKysgYi9saWJhdmZpbHRlci92c3JjX21wdGVzdHNyYy5jCkBAIC02MSw4ICs2MSw4IEBACiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNUFRlc3RDb250ZXh0LCB4KQogI2RlZmluZSBGTEFHUyBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU18QVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBtcHRlc3RzcmNfb3B0aW9uc1tdPSB7Ci0gICAgeyAicmF0ZSIsICAgICAic2V0IHZpZGVvIHJhdGUiLCAgICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCAwLCBGTEFHUyB9LAotICAgIHsgInIiLCAgICAgICAgInNldCB2aWRlbyByYXRlIiwgICAgIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSwKKyAgICB7ICJyYXRlIiwgICAgICJzZXQgdmlkZW8gcmF0ZSIsICAgICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIElOVF9NQVgsIEZMQUdTIH0sCisgICAgeyAiciIsICAgICAgICAic2V0IHZpZGVvIHJhdGUiLCAgICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LAogICAgIHsgImR1cmF0aW9uIiwgInNldCB2aWRlbyBkdXJhdGlvbiIsIE9GRlNFVChkdXJhdGlvbiksIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IC0xfSwgLTEsIElOVDY0X01BWCwgRkxBR1MgfSwKICAgICB7ICJkIiwgICAgICAgICJzZXQgdmlkZW8gZHVyYXRpb24iLCBPRkZTRVQoZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAtMX0sIC0xLCBJTlQ2NF9NQVgsIEZMQUdTIH0sCiAKQEAgLTMwMyw3ICszMDMsNyBAQAogICAgIEFWRnJhbWUgKnBpY3JlZjsKICAgICBpbnQgdyA9IFdJRFRILCBoID0gSEVJR0hULAogICAgICAgICBjdyA9IEFWX0NFSUxfUlNISUZUKHcsIHRlc3QtPmhzdWIpLCBjaCA9IEFWX0NFSUxfUlNISUZUKGgsIHRlc3QtPnZzdWIpOwotICAgIHVuc2lnbmVkIGludCBmcmFtZSA9IG91dGxpbmstPmZyYW1lX2NvdW50OworICAgIHVuc2lnbmVkIGludCBmcmFtZSA9IG91dGxpbmstPmZyYW1lX2NvdW50X2luOwogICAgIGVudW0gdGVzdF90eXBlIHR0ID0gdGVzdC0+dGVzdDsKICAgICBpbnQgaTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvdnNyY190ZXN0c3JjLmMgYi9saWJhdmZpbHRlci92c3JjX3Rlc3RzcmMuYwppbmRleCA1NGQ4YjI2Li5hNzkwOTc0IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci92c3JjX3Rlc3RzcmMuYworKysgYi9saWJhdmZpbHRlci92c3JjX3Rlc3RzcmMuYwpAQCAtMzcsNiArMzcsNyBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9mZm1hdGguaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgpAQCAtNjUsNiArNjYsOSBAQAogICAgIC8qIG9ubHkgdXNlZCBieSB0ZXN0c3JjICovCiAgICAgaW50IG5iX2RlY2ltYWxzOwogCisgICAgLyogb25seSB1c2VkIGJ5IHRlc3RzcmMyICovCisgICAgaW50IGFscGhhOworCiAgICAgLyogb25seSB1c2VkIGJ5IGNvbG9yICovCiAgICAgRkZEcmF3Q29udGV4dCBkcmF3OwogICAgIEZGRHJhd0NvbG9yIGNvbG9yOwpAQCAtODUsOCArODksOCBAQAogICAgIHsgInMiLCAgICAgICAgInNldCB2aWRlbyBzaXplIiwgICAgIE9GRlNFVCh3KSwgICAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gIjMyMHgyNDAifSwgMCwgMCwgRkxBR1MgfSxcCiAKICNkZWZpbmUgQ09NTU9OX09QVElPTlNfTk9TSVpFIFwKLSAgICB7ICJyYXRlIiwgICAgICJzZXQgdmlkZW8gcmF0ZSIsICAgICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsIEZMQUdTIH0sXAotICAgIHsgInIiLCAgICAgICAgInNldCB2aWRlbyByYXRlIiwgICAgIE9GRlNFVChmcmFtZV9yYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgRkxBR1MgfSxcCisgICAgeyAicmF0ZSIsICAgICAic2V0IHZpZGVvIHJhdGUiLCAgICAgT0ZGU0VUKGZyYW1lX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCBJTlRfTUFYLCBGTEFHUyB9LFwKKyAgICB7ICJyIiwgICAgICAgICJzZXQgdmlkZW8gcmF0ZSIsICAgICBPRkZTRVQoZnJhbWVfcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIElOVF9NQVgsIEZMQUdTIH0sXAogICAgIHsgImR1cmF0aW9uIiwgInNldCB2aWRlbyBkdXJhdGlvbiIsIE9GRlNFVChkdXJhdGlvbiksIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IC0xfSwgLTEsIElOVDY0X01BWCwgRkxBR1MgfSxcCiAgICAgeyAiZCIsICAgICAgICAic2V0IHZpZGVvIGR1cmF0aW9uIiwgT0ZGU0VUKGR1cmF0aW9uKSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gLTF9LCAtMSwgSU5UNjRfTUFYLCBGTEFHUyB9LFwKICAgICB7ICJzYXIiLCAgICAgICJzZXQgdmlkZW8gc2FtcGxlIGFzcGVjdCByYXRpbyIsIE9GRlNFVChzYXIpLCBBVl9PUFRfVFlQRV9SQVRJT05BTCwgey5kYmw9IDF9LCAgMCwgSU5UX01BWCwgRkxBR1MgfSwKQEAgLTY4NCw2ICs2ODgsNyBAQAogCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gdGVzdHNyYzJfb3B0aW9uc1tdID0gewogICAgIENPTU1PTl9PUFRJT05TCisgICAgeyAiYWxwaGEiLCAic2V0IGdsb2JhbCBhbHBoYSAob3BhY2l0eSkiLCBPRkZTRVQoYWxwaGEpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMjU1fSwgMCwgMjU1LCBGTEFHUyB9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC03MzQsNiArNzM5LDcgQEAKIHsKICAgICBUZXN0U291cmNlQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKICAgICBGRkRyYXdDb2xvciBjb2xvcjsKKyAgICB1bnNpZ25lZCBhbHBoYSA9ICh1aW50MzJfdClzLT5hbHBoYSA8PCAyNDsKIAogICAgIC8qIGNvbG9yZWQgYmFja2dyb3VuZCAqLwogICAgIHsKQEAgLTc0NSw3ICs3NTEsOCBAQAogICAgICAgICAgICAgeDIgPSBmZl9kcmF3X3JvdW5kX3RvX3N1Yigmcy0+ZHJhdywgMCwgMCwgeDIpOwogICAgICAgICAgICAgc2V0X2NvbG9yKHMsICZjb2xvciwgKChpICYgMSkgPyAweEZGMDAwMCA6IDApIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSAmIDIpID8gMHgwMEZGMDAgOiAwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGkgJiA0KSA/IDB4MDAwMEZGIDogMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpICYgNCkgPyAweDAwMDBGRiA6IDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhKTsKICAgICAgICAgICAgIGZmX2ZpbGxfcmVjdGFuZ2xlKCZzLT5kcmF3LCAmY29sb3IsIGZyYW1lLT5kYXRhLCBmcmFtZS0+bGluZXNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCAwLCB4MiAtIHgsIGZyYW1lLT5oZWlnaHQpOwogICAgICAgICAgICAgeCA9IHgyOwpAQCAtNzYyLDcgKzc2OSw3IEBACiAgICAgICAgIGcwID0gYXZfcmVzY2FsZV9xKHMtPnB0cywgcy0+dGltZV9iYXNlLCBhdl9tYWtlX3EoMSwgMTI4KSk7CiAgICAgICAgIGZvciAoeCA9IDA7IHggPCBzLT53OyB4ICs9IGR4KSB7CiAgICAgICAgICAgICBnID0gKGF2X3Jlc2NhbGUoeCwgNiAqIDI1Niwgcy0+dykgKyBnMCkgJSAoNiAqIDI1Nik7Ci0gICAgICAgICAgICBzZXRfY29sb3IocywgJmNvbG9yLCBjb2xvcl9ncmFkaWVudChnKSk7CisgICAgICAgICAgICBzZXRfY29sb3IocywgJmNvbG9yLCBjb2xvcl9ncmFkaWVudChnKSB8IGFscGhhKTsKICAgICAgICAgICAgIHkgPSB5MCArIGF2X3Jlc2NhbGUoeCwgcy0+aCAvIDIsIHMtPncpOwogICAgICAgICAgICAgeSAlPSAyICogKHMtPmggLSAxNik7CiAgICAgICAgICAgICBpZiAoeSA+IHMtPmggLSAxNikKQEAgLTc4NCw3ICs3OTEsNyBAQAogICAgICAgICBpbnQgYywgaTsKIAogICAgICAgICBmb3IgKGMgPSAwOyBjIDwgMzsgYysrKSB7Ci0gICAgICAgICAgICBzZXRfY29sb3IocywgJmNvbG9yLCAweEJCQkJCQiBeICgweEZGIDw8IChjIDw8IDMpKSk7CisgICAgICAgICAgICBzZXRfY29sb3IocywgJmNvbG9yLCAoMHhCQkJCQkIgXiAoMHhGRiA8PCAoYyA8PCAzKSkpIHwgYWxwaGEpOwogICAgICAgICAgICAgcG9zID0gYXZfcmVzY2FsZV9xKHMtPnB0cywgcy0+dGltZV9iYXNlLCBhdl9tYWtlX3EoNjQgPj4gKGMgPDwgMSksIGN5Y2xlKSkgJSBjeWNsZTsKICAgICAgICAgICAgIHhoID0gcG9zIDwgMSAqIGwgPyBwb3MgOgogICAgICAgICAgICAgICAgICBwb3MgPCAyICogbCA/IGwgOgpAQCAtODUwLDggKzg1Nyw4IEBACiAgICAgICAgIHVpbnQ4X3QgYWxwaGFbMjU2XTsKIAogICAgICAgICByID0gcy0+cHRzOwotICAgICAgICBmb3IgKHkgPSB5bWluOyB5IDwgeW1heCAtIDE1OyB5ICs9IDE2KSB7Ci0gICAgICAgICAgICBmb3IgKHggPSB4bWluOyB4IDwgeG1heCAtIDE1OyB4ICs9IDE2KSB7CisgICAgICAgIGZvciAoeSA9IHltaW47IHkgKyAxNSA8IHltYXg7IHkgKz0gMTYpIHsKKyAgICAgICAgICAgIGZvciAoeCA9IHhtaW47IHggKyAxNSA8IHhtYXg7IHggKz0gMTYpIHsKICAgICAgICAgICAgICAgICBpZiAoKHggXiB5KSAmIDE2KQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKQEAgLTEwNjksMTYgKzEwNzYsMTkyIEBACiAKICNlbmRpZiAvKiBDT05GSUdfUkdCVEVTVFNSQ19GSUxURVIgKi8KIAorI2lmIENPTkZJR19ZVVZURVNUU1JDX0ZJTFRFUgorCisjZGVmaW5lIHl1dnRlc3RzcmNfb3B0aW9ucyBvcHRpb25zCitBVkZJTFRFUl9ERUZJTkVfQ0xBU1MoeXV2dGVzdHNyYyk7CisKK3N0YXRpYyB2b2lkIHl1dnRlc3RfZmlsbF9waWN0dXJlOChBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHksIHcgPSBmcmFtZS0+d2lkdGgsIGggPSBmcmFtZS0+aGVpZ2h0IC8gMzsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZyYW1lLT5mb3JtYXQpOworICAgIGNvbnN0IGludCBmYWN0b3IgPSAxIDw8IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgY29uc3QgaW50IG1pZCA9IDEgPDwgKGRlc2MtPmNvbXBbMF0uZGVwdGggLSAxKTsKKyAgICB1aW50OF90ICp5ZHN0ID0gZnJhbWUtPmRhdGFbMF07CisgICAgdWludDhfdCAqdWRzdCA9IGZyYW1lLT5kYXRhWzFdOworICAgIHVpbnQ4X3QgKnZkc3QgPSBmcmFtZS0+ZGF0YVsyXTsKKyAgICBpbnQgeWxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzBdOworICAgIGludCB1bGluZXNpemUgPSBmcmFtZS0+bGluZXNpemVbMV07CisgICAgaW50IHZsaW5lc2l6ZSA9IGZyYW1lLT5saW5lc2l6ZVsyXTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaW50IGMgPSBmYWN0b3IgKiB4IC8gdzsKKworICAgICAgICAgICAgeWRzdFt4XSA9IGM7CisgICAgICAgICAgICB1ZHN0W3hdID0gbWlkOworICAgICAgICAgICAgdmRzdFt4XSA9IG1pZDsKKyAgICAgICAgfQorCisgICAgICAgIHlkc3QgKz0geWxpbmVzaXplOworICAgICAgICB1ZHN0ICs9IHVsaW5lc2l6ZTsKKyAgICAgICAgdmRzdCArPSB2bGluZXNpemU7CisgICAgfQorCisgICAgaCArPSBoOworICAgIGZvciAoOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBjID0gZmFjdG9yICogeCAvIHc7CisKKyAgICAgICAgICAgIHlkc3RbeF0gPSBtaWQ7CisgICAgICAgICAgICB1ZHN0W3hdID0gYzsKKyAgICAgICAgICAgIHZkc3RbeF0gPSBtaWQ7CisgICAgICAgIH0KKworICAgICAgICB5ZHN0ICs9IHlsaW5lc2l6ZTsKKyAgICAgICAgdWRzdCArPSB1bGluZXNpemU7CisgICAgICAgIHZkc3QgKz0gdmxpbmVzaXplOworICAgIH0KKworICAgIGZvciAoOyB5IDwgZnJhbWUtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBjID0gZmFjdG9yICogeCAvIHc7CisKKyAgICAgICAgICAgIHlkc3RbeF0gPSBtaWQ7CisgICAgICAgICAgICB1ZHN0W3hdID0gbWlkOworICAgICAgICAgICAgdmRzdFt4XSA9IGM7CisgICAgICAgIH0KKworICAgICAgICB5ZHN0ICs9IHlsaW5lc2l6ZTsKKyAgICAgICAgdWRzdCArPSB1bGluZXNpemU7CisgICAgICAgIHZkc3QgKz0gdmxpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIHZvaWQgeXV2dGVzdF9maWxsX3BpY3R1cmUxNihBVkZpbHRlckNvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IHgsIHksIHcgPSBmcmFtZS0+d2lkdGgsIGggPSBmcmFtZS0+aGVpZ2h0IC8gMzsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZyYW1lLT5mb3JtYXQpOworICAgIGNvbnN0IGludCBmYWN0b3IgPSAxIDw8IGRlc2MtPmNvbXBbMF0uZGVwdGg7CisgICAgY29uc3QgaW50IG1pZCA9IDEgPDwgKGRlc2MtPmNvbXBbMF0uZGVwdGggLSAxKTsKKyAgICB1aW50MTZfdCAqeWRzdCA9ICh1aW50MTZfdCAqKWZyYW1lLT5kYXRhWzBdOworICAgIHVpbnQxNl90ICp1ZHN0ID0gKHVpbnQxNl90ICopZnJhbWUtPmRhdGFbMV07CisgICAgdWludDE2X3QgKnZkc3QgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YVsyXTsKKyAgICBpbnQgeWxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzBdIC8gMjsKKyAgICBpbnQgdWxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzFdIC8gMjsKKyAgICBpbnQgdmxpbmVzaXplID0gZnJhbWUtPmxpbmVzaXplWzJdIC8gMjsKKworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHc7IHgrKykgeworICAgICAgICAgICAgaW50IGMgPSBmYWN0b3IgKiB4IC8gdzsKKworICAgICAgICAgICAgeWRzdFt4XSA9IGM7CisgICAgICAgICAgICB1ZHN0W3hdID0gbWlkOworICAgICAgICAgICAgdmRzdFt4XSA9IG1pZDsKKyAgICAgICAgfQorCisgICAgICAgIHlkc3QgKz0geWxpbmVzaXplOworICAgICAgICB1ZHN0ICs9IHVsaW5lc2l6ZTsKKyAgICAgICAgdmRzdCArPSB2bGluZXNpemU7CisgICAgfQorCisgICAgaCArPSBoOworICAgIGZvciAoOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBjID0gZmFjdG9yICogeCAvIHc7CisKKyAgICAgICAgICAgIHlkc3RbeF0gPSBtaWQ7CisgICAgICAgICAgICB1ZHN0W3hdID0gYzsKKyAgICAgICAgICAgIHZkc3RbeF0gPSBtaWQ7CisgICAgICAgIH0KKworICAgICAgICB5ZHN0ICs9IHlsaW5lc2l6ZTsKKyAgICAgICAgdWRzdCArPSB1bGluZXNpemU7CisgICAgICAgIHZkc3QgKz0gdmxpbmVzaXplOworICAgIH0KKworICAgIGZvciAoOyB5IDwgZnJhbWUtPmhlaWdodDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBjID0gZmFjdG9yICogeCAvIHc7CisKKyAgICAgICAgICAgIHlkc3RbeF0gPSBtaWQ7CisgICAgICAgICAgICB1ZHN0W3hdID0gbWlkOworICAgICAgICAgICAgdmRzdFt4XSA9IGM7CisgICAgICAgIH0KKworICAgICAgICB5ZHN0ICs9IHlsaW5lc2l6ZTsKKyAgICAgICAgdWRzdCArPSB1bGluZXNpemU7CisgICAgICAgIHZkc3QgKz0gdmxpbmVzaXplOworICAgIH0KK30KKworc3RhdGljIGF2X2NvbGQgaW50IHl1dnRlc3RfaW5pdChBVkZpbHRlckNvbnRleHQgKmN0eCkKK3sKKyAgICBUZXN0U291cmNlQ29udGV4dCAqdGVzdCA9IGN0eC0+cHJpdjsKKworICAgIHRlc3QtPmRyYXdfb25jZSA9IDE7CisgICAgcmV0dXJuIGluaXQoY3R4KTsKK30KKworc3RhdGljIGludCB5dXZ0ZXN0X3F1ZXJ5X2Zvcm1hdHMoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgICAgc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10c1tdID0geworICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsIEFWX1BJWF9GTVRfWVVWSjQ0NFAsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDksIEFWX1BJWF9GTVRfWVVWNDQ0UDEwLAorICAgICAgICBBVl9QSVhfRk1UX1lVVjQ0NFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTQsCisgICAgICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2LAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9OworCisgICAgQVZGaWx0ZXJGb3JtYXRzICpmbXRzX2xpc3QgPSBmZl9tYWtlX2Zvcm1hdF9saXN0KHBpeF9mbXRzKTsKKyAgICBpZiAoIWZtdHNfbGlzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICByZXR1cm4gZmZfc2V0X2NvbW1vbl9mb3JtYXRzKGN0eCwgZm10c19saXN0KTsKK30KKworc3RhdGljIGludCB5dXZ0ZXN0X2NvbmZpZ19wcm9wcyhBVkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgICAgVGVzdFNvdXJjZUNvbnRleHQgKnRlc3QgPSBvdXRsaW5rLT5zcmMtPnByaXY7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChvdXRsaW5rLT5mb3JtYXQpOworCisgICAgdGVzdC0+ZmlsbF9waWN0dXJlX2ZuID0gZGVzYy0+Y29tcFswXS5kZXB0aCA+IDggPyB5dXZ0ZXN0X2ZpbGxfcGljdHVyZTE2IDogeXV2dGVzdF9maWxsX3BpY3R1cmU4OworICAgIHJldHVybiBjb25maWdfcHJvcHMob3V0bGluayk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkZpbHRlclBhZCBhdmZpbHRlcl92c3JjX3l1dnRlc3RzcmNfb3V0cHV0c1tdID0geworICAgIHsKKyAgICAgICAgLm5hbWUgICAgICAgICAgPSAiZGVmYXVsdCIsCisgICAgICAgIC50eXBlICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgICAgICAucmVxdWVzdF9mcmFtZSA9IHJlcXVlc3RfZnJhbWUsCisgICAgICAgIC5jb25maWdfcHJvcHMgID0geXV2dGVzdF9jb25maWdfcHJvcHMsCisgICAgfSwKKyAgICB7IE5VTEwgfQorfTsKKworQVZGaWx0ZXIgZmZfdnNyY195dXZ0ZXN0c3JjID0geworICAgIC5uYW1lICAgICAgICAgID0gInl1dnRlc3RzcmMiLAorICAgIC5kZXNjcmlwdGlvbiAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkdlbmVyYXRlIFlVViB0ZXN0IHBhdHRlcm4uIiksCisgICAgLnByaXZfc2l6ZSAgICAgPSBzaXplb2YoVGVzdFNvdXJjZUNvbnRleHQpLAorICAgIC5wcml2X2NsYXNzICAgID0gJnl1dnRlc3RzcmNfY2xhc3MsCisgICAgLmluaXQgICAgICAgICAgPSB5dXZ0ZXN0X2luaXQsCisgICAgLnVuaW5pdCAgICAgICAgPSB1bmluaXQsCisgICAgLnF1ZXJ5X2Zvcm1hdHMgPSB5dXZ0ZXN0X3F1ZXJ5X2Zvcm1hdHMsCisgICAgLmlucHV0cyAgICAgICAgPSBOVUxMLAorICAgIC5vdXRwdXRzICAgICAgID0gYXZmaWx0ZXJfdnNyY195dXZ0ZXN0c3JjX291dHB1dHMsCit9OworCisjZW5kaWYgLyogQ09ORklHX1lVVlRFU1RTUkNfRklMVEVSICovCisKICNpZiBDT05GSUdfU01QVEVCQVJTX0ZJTFRFUiB8fCBDT05GSUdfU01QVEVIREJBUlNfRklMVEVSCiAKIHN0YXRpYyBjb25zdCB1aW50OF90IHJhaW5ib3dbN11bNF0gPSB7CiAgICAgeyAxODAsIDEyOCwgMTI4LCAyNTUgfSwgICAgIC8qIDc1JSB3aGl0ZSAqLwotICAgIHsgMTYxLCAgNDQsIDE0MSwgMjU1IH0sICAgICAvKiA3NSUgeWVsbG93ICovCisgICAgeyAxNjIsICA0NCwgMTQyLCAyNTUgfSwgICAgIC8qIDc1JSB5ZWxsb3cgKi8KICAgICB7IDEzMSwgMTU2LCAgNDQsIDI1NSB9LCAgICAgLyogNzUlIGN5YW4gKi8KLSAgICB7IDExMiwgIDcyLCAgNTcsIDI1NSB9LCAgICAgLyogNzUlIGdyZWVuICovCi0gICAgeyAgODMsIDE4MywgMTk4LCAyNTUgfSwgICAgIC8qIDc1JSBtYWdlbnRhICovCi0gICAgeyAgNjUsICA5OSwgMjEyLCAyNTUgfSwgICAgIC8qIDc1JSByZWQgKi8KLSAgICB7ICAzNCwgMjEyLCAxMTQsIDI1NSB9LCAgICAgLyogNzUlIGJsdWUgKi8KKyAgICB7IDExMiwgIDcyLCAgNTgsIDI1NSB9LCAgICAgLyogNzUlIGdyZWVuICovCisgICAgeyAgODQsIDE4NCwgMTk4LCAyNTUgfSwgICAgIC8qIDc1JSBtYWdlbnRhICovCisgICAgeyAgNjUsIDEwMCwgMjEyLCAyNTUgfSwgICAgIC8qIDc1JSByZWQgKi8KKyAgICB7ICAzNSwgMjEyLCAxMTQsIDI1NSB9LCAgICAgLyogNzUlIGJsdWUgKi8KIH07CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IHJhaW5ib3doZFs3XVs0XSA9IHsKQEAgLTEwOTIsOSArMTI3NSw5IEBACiB9OwogCiBzdGF0aWMgY29uc3QgdWludDhfdCB3b2JuYWlyWzddWzRdID0gewotICAgIHsgIDM0LCAyMTIsIDExNCwgMjU1IH0sICAgICAvKiA3NSUgYmx1ZSAqLworICAgIHsgIDM1LCAyMTIsIDExNCwgMjU1IH0sICAgICAvKiA3NSUgYmx1ZSAqLwogICAgIHsgIDE5LCAxMjgsIDEyOCwgMjU1IH0sICAgICAvKiA3LjUlIGludGVuc2l0eSBibGFjayAqLwotICAgIHsgIDgzLCAxODMsIDE5OCwgMjU1IH0sICAgICAvKiA3NSUgbWFnZW50YSAqLworICAgIHsgIDg0LCAxODQsIDE5OCwgMjU1IH0sICAgICAvKiA3NSUgbWFnZW50YSAqLwogICAgIHsgIDE5LCAxMjgsIDEyOCwgMjU1IH0sICAgICAvKiA3LjUlIGludGVuc2l0eSBibGFjayAqLwogICAgIHsgMTMxLCAxNTYsICA0NCwgMjU1IH0sICAgICAvKiA3NSUgY3lhbiAqLwogICAgIHsgIDE5LCAxMjgsIDEyOCwgMjU1IH0sICAgICAvKiA3LjUlIGludGVuc2l0eSBibGFjayAqLwpAQCAtMTEzMiw4ICsxMzE1LDggQEAKIAogICAgIHggPSBGRk1JTih4LCB0ZXN0LT53IC0gMSk7CiAgICAgeSA9IEZGTUlOKHksIHRlc3QtPmggLSAxKTsKLSAgICB3ID0gRkZNSU4odywgdGVzdC0+dyAtIHgpOwotICAgIGggPSBGRk1JTihoLCB0ZXN0LT5oIC0geSk7CisgICAgdyA9IEZGTUFYKEZGTUlOKHcsIHRlc3QtPncgLSB4KSwgMCk7CisgICAgaCA9IEZGTUFYKEZGTUlOKGgsIHRlc3QtPmggLSB5KSwgMCk7CiAKICAgICBhdl9hc3NlcnQwKHggKyB3IDw9IHRlc3QtPncpOwogICAgIGF2X2Fzc2VydDAoeSArIGggPD0gdGVzdC0+aCk7CkBAIC0xMTk5LDcgKzEzODIsNyBAQAogICAgIGludCByX3csIHJfaCwgd19oLCBwX3csIHBfaCwgaSwgdG1wLCB4ID0gMDsKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpY3JlZi0+Zm9ybWF0KTsKIAotICAgIGF2X2ZyYW1lX3NldF9jb2xvcnNwYWNlKHBpY3JlZiwgQVZDT0xfU1BDX0JUNDcwQkcpOworICAgIHBpY3JlZi0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOwogCiAgICAgcl93ID0gRkZBTElHTigodGVzdC0+dyArIDYpIC8gNywgMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV93KTsKICAgICByX2ggPSBGRkFMSUdOKHRlc3QtPmggKiAyIC8gMywgMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV9oKTsKQEAgLTEyNjYsNyArMTQ0OSw3IEBACiAgICAgaW50IGRfdywgcl93LCByX2gsIGxfdywgaSwgdG1wLCB4ID0gMCwgeSA9IDA7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaWNyZWYtPmZvcm1hdCk7CiAKLSAgICBhdl9mcmFtZV9zZXRfY29sb3JzcGFjZShwaWNyZWYsIEFWQ09MX1NQQ19CVDcwOSk7CisgICAgcGljcmVmLT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNzA5OwogCiAgICAgZF93ID0gRkZBTElHTih0ZXN0LT53IC8gOCwgMSA8PCBwaXhkZXNjLT5sb2cyX2Nocm9tYV93KTsKICAgICByX2ggPSBGRkFMSUdOKHRlc3QtPmggKiA3IC8gMTIsIDEgPDwgcGl4ZGVzYy0+bG9nMl9jaHJvbWFfaCk7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci93M2ZkaWYuaCBiL2xpYmF2ZmlsdGVyL3czZmRpZi5oCmluZGV4IDY3YmI4NzQuLjljMGI3MjMgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3czZmRpZi5oCisrKyBiL2xpYmF2ZmlsdGVyL3czZmRpZi5oCkBAIC0zOSw5ICszOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbl9saW5lc19jdXJbNV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmluX2xpbmVzX2Fkals1XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY29lZiwgaW50IGxpbmVzaXplKTsKLSAgICB2b2lkICgqZmlsdGVyX3NjYWxlKSh1aW50OF90ICpvdXRfcGl4ZWwsIGNvbnN0IGludDMyX3QgKndvcmtfcGl4ZWwsIGludCBsaW5lc2l6ZSk7CisgICAgdm9pZCAoKmZpbHRlcl9zY2FsZSkodWludDhfdCAqb3V0X3BpeGVsLCBjb25zdCBpbnQzMl90ICp3b3JrX3BpeGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lc2l6ZSwgaW50IG1heCk7CiB9IFczRkRJRkRTUENvbnRleHQ7CiAKLXZvaWQgZmZfdzNmZGlmX2luaXRfeDg2KFczRkRJRkRTUENvbnRleHQgKmRzcCk7Cit2b2lkIGZmX3czZmRpZl9pbml0X3g4NihXM0ZESUZEU1BDb250ZXh0ICpkc3AsIGludCBkZXB0aCk7CiAKICNlbmRpZiAvKiBBVkZJTFRFUl9XM0ZESUZfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvd2luZG93X2Z1bmMuYyBiL2xpYmF2ZmlsdGVyL3dpbmRvd19mdW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjIwMmEuLjAwMDAwMDAKLS0tIGEvbGliYXZmaWx0ZXIvd2luZG93X2Z1bmMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDE1IFBhdWwgQiBNYWhvbAotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0jaW5jbHVkZSAid2luZG93X2Z1bmMuaCIKLQotdm9pZCBmZl9nZW5lcmF0ZV93aW5kb3dfZnVuYyhmbG9hdCAqbHV0LCBpbnQgTiwgaW50IHdpbl9mdW5jLCBmbG9hdCAqb3ZlcmxhcCkKLXsKLSAgICBpbnQgbjsKLQotICAgIHN3aXRjaCAod2luX2Z1bmMpIHsKLSAgICBjYXNlIFdGVU5DX1JFQ1Q6Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCi0gICAgICAgICAgICBsdXRbbl0gPSAxLjsKLSAgICAgICAgKm92ZXJsYXAgPSAwLjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRlVOQ19CQVJUTEVUVDoKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKLSAgICAgICAgICAgIGx1dFtuXSA9IDEuLWZhYnMoKG4tKE4tMSkvMi4pLygoTi0xKS8yLikpOwotICAgICAgICAqb3ZlcmxhcCA9IDAuNTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRlVOQ19IQU5OSU5HOgotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQotICAgICAgICAgICAgbHV0W25dID0gLjUqKDEtY29zKDIqTV9QSSpuLyhOLTEpKSk7Ci0gICAgICAgICpvdmVybGFwID0gMC41OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdGVU5DX0hBTU1JTkc6Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCi0gICAgICAgICAgICBsdXRbbl0gPSAuNTQtLjQ2KmNvcygyKk1fUEkqbi8oTi0xKSk7Ci0gICAgICAgICpvdmVybGFwID0gMC41OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdGVU5DX0JMQUNLTUFOOgotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQotICAgICAgICAgICAgbHV0W25dID0gLjQyNjU5LS40OTY1Nipjb3MoMipNX1BJKm4vKE4tMSkpKy4wNzY4NDkqY29zKDQqTV9QSSpuLyhOLTEpKTsKLSAgICAgICAgKm92ZXJsYXAgPSAwLjY2MTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRlVOQ19XRUxDSDoKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKLSAgICAgICAgICAgIGx1dFtuXSA9IDEuLShuLShOLTEpLzIuKS8oKE4tMSkvMi4pKihuLShOLTEpLzIuKS8oKE4tMSkvMi4pOwotICAgICAgICAqb3ZlcmxhcCA9IDAuMjkzOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdGVU5DX0ZMQVRUT1A6Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCi0gICAgICAgICAgICBsdXRbbl0gPSAxLi0xLjk4NTg0NDE2NDEwMipjb3MoIDIqTV9QSSpuLyhOLTEpKSsxLjc5MTE3NjQzODUwNipjb3MoIDQqTV9QSSpuLyhOLTEpKS0KLSAgICAgICAgICAgICAgICAgICAgICAgIDEuMjgyMDc1Mjg0MDA1KmNvcyggNipNX1BJKm4vKE4tMSkpKzAuNjY3Nzc3NTMwMjY2KmNvcyggOCpNX1BJKm4vKE4tMSkpLQotICAgICAgICAgICAgICAgICAgICAgICAgMC4yNDAxNjA3OTY1NzYqY29zKDEwKk1fUEkqbi8oTi0xKSkrMC4wNTY2NTYzODE3NjQqY29zKDEyKk1fUEkqbi8oTi0xKSktCi0gICAgICAgICAgICAgICAgICAgICAgICAwLjAwODEzNDk3NDQ3OSpjb3MoMTQqTV9QSSpuLyhOLTEpKSswLjAwMDYyNDU0NDY1MCpjb3MoMTYqTV9QSSpuLyhOLTEpKS0KLSAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDE5ODA4OTk4KmNvcygxOCpNX1BJKm4vKE4tMSkpKzAuMDAwMDAwMTMyOTc0KmNvcygyMCpNX1BJKm4vKE4tMSkpOwotICAgICAgICAqb3ZlcmxhcCA9IDAuODQxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdGVU5DX0JIQVJSSVM6Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCi0gICAgICAgICAgICBsdXRbbl0gPSAwLjM1ODc1LTAuNDg4MjkqY29zKDIqTV9QSSpuLyhOLTEpKSswLjE0MTI4KmNvcyg0Kk1fUEkqbi8oTi0xKSktMC4wMTE2OCpjb3MoNipNX1BJKm4vKE4tMSkpOwotICAgICAgICAqb3ZlcmxhcCA9IDAuNjYxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdGVU5DX0JOVVRUQUxMOgotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQotICAgICAgICAgICAgbHV0W25dID0gMC4zNjM1ODE5LTAuNDg5MTc3NSpjb3MoMipNX1BJKm4vKE4tMSkpKzAuMTM2NTk5NSpjb3MoNCpNX1BJKm4vKE4tMSkpLTAuMDEwNjQxMSpjb3MoNipNX1BJKm4vKE4tMSkpOwotICAgICAgICAqb3ZlcmxhcCA9IDAuNjYxOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdGVU5DX0JIQU5OOgotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQotICAgICAgICAgICAgbHV0W25dID0gMC42Mi0wLjQ4KmZhYnMobi8oZG91YmxlKShOLTEpLS41KS0wLjM4KmNvcygyKk1fUEkqbi8oTi0xKSk7Ci0gICAgICAgICpvdmVybGFwID0gMC41OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdGVU5DX1NJTkU6Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCi0gICAgICAgICAgICBsdXRbbl0gPSBzaW4oTV9QSSpuLyhOLTEpKTsKLSAgICAgICAgKm92ZXJsYXAgPSAwLjc1OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFdGVU5DX05VVFRBTEw6Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCi0gICAgICAgICAgICBsdXRbbl0gPSAwLjM1NTc2OC0wLjQ4NzM5Nipjb3MoMipNX1BJKm4vKE4tMSkpKzAuMTQ0MjMyKmNvcyg0Kk1fUEkqbi8oTi0xKSktMC4wMTI2MDQqY29zKDYqTV9QSSpuLyhOLTEpKTsKLSAgICAgICAgKm92ZXJsYXAgPSAwLjY2MzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRlVOQ19MQU5DWk9TOgotI2RlZmluZSBTSU5DKHgpICghKHgpKSA/IDEgOiBzaW4oTV9QSSAqICh4KSkvKE1fUEkgKiAoeCkpOwotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQotICAgICAgICAgICAgbHV0W25dID0gU0lOQygoMi4qbikvKE4tMSktMSk7Ci0gICAgICAgICpvdmVybGFwID0gMC43NTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRlVOQ19HQVVTUzoKLSNkZWZpbmUgU1FSKHgpICgoeCkqKHgpKQotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQotICAgICAgICAgICAgbHV0W25dID0gZXhwKC0wLjUgKiBTUVIoKG4tKE4tMSkvMikvKDAuNCooTi0xKS8yLmYpKSk7Ci0gICAgICAgICpvdmVybGFwID0gMC43NTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRlVOQ19UVUtFWToKLSAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykgewotICAgICAgICAgICAgZmxvYXQgTSA9IChOLTEpLzIuOwotCi0gICAgICAgICAgICBpZiAoRkZBQlMobiAtIE0pID49IDAuMyAqIE0pIHsKLSAgICAgICAgICAgICAgICBsdXRbbl0gPSAwLjUgKiAoMSArIGNvcygoTV9QSSooRkZBQlMobiAtIE0pIC0gMC4zICogTSkpLygoMSAtIDAuMykgKiBNKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBsdXRbbl0gPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICpvdmVybGFwID0gMC4zMzsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYXZfYXNzZXJ0MCgwKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci93aW5kb3dfZnVuYy5oIGIvbGliYXZmaWx0ZXIvd2luZG93X2Z1bmMuaAppbmRleCAzZGEwOWQ4Li5hOTQ0ODJjIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci93aW5kb3dfZnVuYy5oCisrKyBiL2xpYmF2ZmlsdGVyL3dpbmRvd19mdW5jLmgKQEAgLTIyLDExICsyMiwxNjkgQEAKICNpZm5kZWYgQVZGSUxURVJfV0lORE9XX0ZVTkNfSAogI2RlZmluZSBBVkZJTFRFUl9XSU5ET1dfRlVOQ19ICiAKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKIGVudW0gV2luZG93RnVuYyAgICAgeyBXRlVOQ19SRUNULCBXRlVOQ19IQU5OSU5HLCBXRlVOQ19IQU1NSU5HLCBXRlVOQ19CTEFDS01BTiwKICAgICAgICAgICAgICAgICAgICAgICBXRlVOQ19CQVJUTEVUVCwgV0ZVTkNfV0VMQ0gsIFdGVU5DX0ZMQVRUT1AsCiAgICAgICAgICAgICAgICAgICAgICAgV0ZVTkNfQkhBUlJJUywgV0ZVTkNfQk5VVFRBTEwsIFdGVU5DX1NJTkUsIFdGVU5DX05VVFRBTEwsCi0gICAgICAgICAgICAgICAgICAgICAgV0ZVTkNfQkhBTk4sIFdGVU5DX0xBTkNaT1MsIFdGVU5DX0dBVVNTLCBXRlVOQ19UVUtFWSwgTkJfV0ZVTkMgfTsKKyAgICAgICAgICAgICAgICAgICAgICBXRlVOQ19CSEFOTiwgV0ZVTkNfTEFOQ1pPUywgV0ZVTkNfR0FVU1MsIFdGVU5DX1RVS0VZLAorICAgICAgICAgICAgICAgICAgICAgIFdGVU5DX0RPTFBILCBXRlVOQ19DQVVDSFksIFdGVU5DX1BBUlpFTiwgV0ZVTkNfUE9JU1NPTiwKKyAgICAgICAgICAgICAgICAgICAgICBOQl9XRlVOQyB9OwogCi12b2lkIGZmX2dlbmVyYXRlX3dpbmRvd19mdW5jKGZsb2F0ICpsdXQsIGludCBOLCBpbnQgd2luX2Z1bmMsIGZsb2F0ICpvdmVybGFwKTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZW5lcmF0ZV93aW5kb3dfZnVuYyhmbG9hdCAqbHV0LCBpbnQgTiwgaW50IHdpbl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdmVybGFwKQoreworICAgIGludCBuOworCisgICAgc3dpdGNoICh3aW5fZnVuYykgeworICAgIGNhc2UgV0ZVTkNfUkVDVDoKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKKyAgICAgICAgICAgIGx1dFtuXSA9IDEuOworICAgICAgICAqb3ZlcmxhcCA9IDAuOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdGVU5DX0JBUlRMRVRUOgorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQorICAgICAgICAgICAgbHV0W25dID0gMS4tZmFicygobi0oTi0xKS8yLikvKChOLTEpLzIuKSk7CisgICAgICAgICpvdmVybGFwID0gMC41OworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdGVU5DX0hBTk5JTkc6CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCisgICAgICAgICAgICBsdXRbbl0gPSAuNSooMS1jb3MoMipNX1BJKm4vKE4tMSkpKTsKKyAgICAgICAgKm92ZXJsYXAgPSAwLjU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfSEFNTUlORzoKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKKyAgICAgICAgICAgIGx1dFtuXSA9IC41NC0uNDYqY29zKDIqTV9QSSpuLyhOLTEpKTsKKyAgICAgICAgKm92ZXJsYXAgPSAwLjU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfQkxBQ0tNQU46CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCisgICAgICAgICAgICBsdXRbbl0gPSAuNDI2NTktLjQ5NjU2KmNvcygyKk1fUEkqbi8oTi0xKSkrLjA3Njg0OSpjb3MoNCpNX1BJKm4vKE4tMSkpOworICAgICAgICAqb3ZlcmxhcCA9IDAuNjYxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdGVU5DX1dFTENIOgorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQorICAgICAgICAgICAgbHV0W25dID0gMS4tKG4tKE4tMSkvMi4pLygoTi0xKS8yLikqKG4tKE4tMSkvMi4pLygoTi0xKS8yLik7CisgICAgICAgICpvdmVybGFwID0gMC4yOTM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfRkxBVFRPUDoKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKKyAgICAgICAgICAgIGx1dFtuXSA9IDEuLTEuOTg1ODQ0MTY0MTAyKmNvcyggMipNX1BJKm4vKE4tMSkpKzEuNzkxMTc2NDM4NTA2KmNvcyggNCpNX1BJKm4vKE4tMSkpLQorICAgICAgICAgICAgMS4yODIwNzUyODQwMDUqY29zKCA2Kk1fUEkqbi8oTi0xKSkrMC42Njc3Nzc1MzAyNjYqY29zKCA4Kk1fUEkqbi8oTi0xKSktCisgICAgICAgICAgICAwLjI0MDE2MDc5NjU3Nipjb3MoMTAqTV9QSSpuLyhOLTEpKSswLjA1NjY1NjM4MTc2NCpjb3MoMTIqTV9QSSpuLyhOLTEpKS0KKyAgICAgICAgICAgIDAuMDA4MTM0OTc0NDc5KmNvcygxNCpNX1BJKm4vKE4tMSkpKzAuMDAwNjI0NTQ0NjUwKmNvcygxNipNX1BJKm4vKE4tMSkpLQorICAgICAgICAgICAgMC4wMDAwMTk4MDg5OTgqY29zKDE4Kk1fUEkqbi8oTi0xKSkrMC4wMDAwMDAxMzI5NzQqY29zKDIwKk1fUEkqbi8oTi0xKSk7CisgICAgICAgICpvdmVybGFwID0gMC44NDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfQkhBUlJJUzoKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKKyAgICAgICAgICAgIGx1dFtuXSA9IDAuMzU4NzUtMC40ODgyOSpjb3MoMipNX1BJKm4vKE4tMSkpKzAuMTQxMjgqY29zKDQqTV9QSSpuLyhOLTEpKS0wLjAxMTY4KmNvcyg2Kk1fUEkqbi8oTi0xKSk7CisgICAgICAgICpvdmVybGFwID0gMC42NjE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfQk5VVFRBTEw6CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCisgICAgICAgICAgICBsdXRbbl0gPSAwLjM2MzU4MTktMC40ODkxNzc1KmNvcygyKk1fUEkqbi8oTi0xKSkrMC4xMzY1OTk1KmNvcyg0Kk1fUEkqbi8oTi0xKSktMC4wMTA2NDExKmNvcyg2Kk1fUEkqbi8oTi0xKSk7CisgICAgICAgICpvdmVybGFwID0gMC42NjE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfQkhBTk46CisgICAgICAgIGZvciAobiA9IDA7IG4gPCBOOyBuKyspCisgICAgICAgICAgICBsdXRbbl0gPSAwLjYyLTAuNDgqZmFicyhuLyhkb3VibGUpKE4tMSktLjUpLTAuMzgqY29zKDIqTV9QSSpuLyhOLTEpKTsKKyAgICAgICAgKm92ZXJsYXAgPSAwLjU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfU0lORToKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKKyAgICAgICAgICAgIGx1dFtuXSA9IHNpbihNX1BJKm4vKE4tMSkpOworICAgICAgICAqb3ZlcmxhcCA9IDAuNzU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfTlVUVEFMTDoKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKKyAgICAgICAgICAgIGx1dFtuXSA9IDAuMzU1NzY4LTAuNDg3Mzk2KmNvcygyKk1fUEkqbi8oTi0xKSkrMC4xNDQyMzIqY29zKDQqTV9QSSpuLyhOLTEpKS0wLjAxMjYwNCpjb3MoNipNX1BJKm4vKE4tMSkpOworICAgICAgICAqb3ZlcmxhcCA9IDAuNjYzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdGVU5DX0xBTkNaT1M6CisgICAgICAgICNkZWZpbmUgU0lOQyh4KSAoISh4KSkgPyAxIDogc2luKE1fUEkgKiAoeCkpLyhNX1BJICogKHgpKTsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykKKyAgICAgICAgICAgIGx1dFtuXSA9IFNJTkMoKDIuKm4pLyhOLTEpLTEpOworICAgICAgICAqb3ZlcmxhcCA9IDAuNzU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfR0FVU1M6CisgICAgICAgICNkZWZpbmUgU1FSKHgpICgoeCkqKHgpKQorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKQorICAgICAgICAgICAgbHV0W25dID0gZXhwKC0wLjUgKiBTUVIoKG4tKE4tMSkvMikvKDAuNCooTi0xKS8yLmYpKSk7CisgICAgICAgICpvdmVybGFwID0gMC43NTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXRlVOQ19UVUtFWToKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykgeworICAgICAgICAgICAgZmxvYXQgTSA9IChOLTEpLzIuOworCisgICAgICAgICAgICBpZiAoRkZBQlMobiAtIE0pID49IDAuMyAqIE0pIHsKKyAgICAgICAgICAgICAgICBsdXRbbl0gPSAwLjUgKiAoMSArIGNvcygoTV9QSSooRkZBQlMobiAtIE0pIC0gMC4zICogTSkpLygoMSAtIDAuMykgKiBNKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsdXRbbl0gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpvdmVybGFwID0gMC4zMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXRlVOQ19ET0xQSDogeworICAgICAgICBkb3VibGUgYiA9IGNvc2goNy42MDA5MDIyMDk1NDE5ODg3IC8gKE4tMSkpLCBzdW0sIHQsIGMsIG5vcm0gPSAwOworICAgICAgICBpbnQgajsKKyAgICAgICAgZm9yIChjID0gMSAtIDEgLyAoYipiKSwgbiA9IChOLTEpIC8gMjsgbiA+PSAwOyAtLW4pIHsKKyAgICAgICAgICAgIGZvciAoc3VtID0gIW4sIGIgPSB0ID0gaiA9IDE7IGogPD0gbiAmJiBzdW0gIT0gdDsgYiAqPSAobi1qKSAqICgxLi9qKSwgKytqKQorICAgICAgICAgICAgICAgIHQgPSBzdW0sIHN1bSArPSAoYiAqPSBjICogKE4gLSBuIC0gaikgKiAoMS4vaikpOworICAgICAgICAgICAgc3VtIC89IChOIC0gMSAtIG4pLCBzdW0gLz0gKG5vcm0gPSBub3JtID8gbm9ybSA6IHN1bSk7CisgICAgICAgICAgICBsdXRbbl0gPSBzdW07CisgICAgICAgICAgICBsdXRbTiAtIDEgLSBuXSA9IHN1bTsKKyAgICAgICAgfQorICAgICAgICAqb3ZlcmxhcCA9IDAuNTt9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfQ0FVQ0hZOgorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IDIgKiAoKG4gLyAoZG91YmxlKShOIC0gMSkpIC0gLjUpOworCisgICAgICAgICAgICBpZiAoeCA8PSAtLjUgfHwgeCA+PSAuNSkgeworICAgICAgICAgICAgICAgIGx1dFtuXSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGx1dFtuXSA9IEZGTUlOKDEsIGZhYnMoMS8oMSs0KjE2KngqeCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqb3ZlcmxhcCA9IDAuNzU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfUEFSWkVOOgorICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTjsgbisrKSB7CisgICAgICAgICAgICBkb3VibGUgeCA9IDIgKiAoKG4gLyAoZG91YmxlKShOIC0gMSkpIC0gLjUpOworCisgICAgICAgICAgICBpZiAoeCA+IDAuMjUgJiYgeCA8PSAwLjUpIHsKKyAgICAgICAgICAgICAgICBsdXRbbl0gPSAtMiAqIHBvd2YoLTEgKyAyICogeCwgMyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHggPj0gLS41ICYmIHggPCAtLjI1KSB7CisgICAgICAgICAgICAgICAgbHV0W25dID0gMiAqIHBvd2YoMSArIDIgKiB4LCAzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA+PSAtLjI1ICYmIHggPCAwKSB7CisgICAgICAgICAgICAgICAgbHV0W25dID0gMSAtIDI0ICogeCAqIHggLSA0OCAqIHggKiB4ICogeDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoeCA+PSAwICYmIHggPD0gLjI1KSB7CisgICAgICAgICAgICAgICAgbHV0W25dID0gMSAtIDI0ICogeCAqIHggKyA0OCAqIHggKiB4ICogeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbHV0W25dID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqb3ZlcmxhcCA9IDAuNzU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV0ZVTkNfUE9JU1NPTjoKKyAgICAgICAgZm9yIChuID0gMDsgbiA8IE47IG4rKykgeworICAgICAgICAgICAgZG91YmxlIHggPSAyICogKChuIC8gKGRvdWJsZSkoTiAtIDEpKSAtIC41KTsKKworICAgICAgICAgICAgaWYgKHggPj0gMCAmJiB4IDw9IC41KSB7CisgICAgICAgICAgICAgICAgbHV0W25dID0gZXhwKC02KngpOworICAgICAgICAgICAgfSBlbHNlIGlmICh4IDwgMCAmJiB4ID49IC0uNSkgeworICAgICAgICAgICAgICAgIGx1dFtuXSA9IGV4cCg2KngpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsdXRbbl0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpvdmVybGFwID0gMC43NTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICB9Cit9CiAKICNlbmRpZiAvKiBBVkZJTFRFUl9XSU5ET1dfRlVOQ19IICovCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYvTWFrZWZpbGUgYi9saWJhdmZpbHRlci94ODYvTWFrZWZpbGUKaW5kZXggMzNkZTM4MC4uNGQ0YzVlNSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L01ha2VmaWxlCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni9NYWtlZmlsZQpAQCAtMSw0MiArMSw1OCBAQAorT0JKUy0kKENPTkZJR19BRklSX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0geDg2L2FmX2FmaXJfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0JMRU5EX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB4ODYvdmZfYmxlbmRfaW5pdC5vCitPQkpTLSQoQ09ORklHX0JXRElGX0ZJTFRFUikgICAgICAgICAgICAgICAgICArPSB4ODYvdmZfYndkaWZfaW5pdC5vCitPQkpTLSQoQ09ORklHX0NPTE9SU1BBQ0VfRklMVEVSKSAgICAgICAgICAgICArPSB4ODYvY29sb3JzcGFjZWRzcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfRVFfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl9lcS5vCiBPQkpTLSQoQ09ORklHX0ZTUFBfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB4ODYvdmZfZnNwcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfR1JBREZVTl9GSUxURVIpICAgICAgICAgICAgICAgICs9IHg4Ni92Zl9ncmFkZnVuX2luaXQubworT0JKUy0kKENPTkZJR19GUkFNRVJBVEVfRklMVEVSKSAgICAgICAgICAgICAgKz0geDg2L3ZmX2ZyYW1lcmF0ZV9pbml0Lm8KK09CSlMtJChDT05GSUdfSEZMSVBfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl9oZmxpcF9pbml0Lm8KIE9CSlMtJChDT05GSUdfSFFETjNEX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl9ocWRuM2RfaW5pdC5vCiBPQkpTLSQoQ09ORklHX0lERVRfRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB4ODYvdmZfaWRldF9pbml0Lm8KIE9CSlMtJChDT05GSUdfSU5URVJMQUNFX0ZJTFRFUikgICAgICAgICAgICAgICs9IHg4Ni92Zl9pbnRlcmxhY2VfaW5pdC5vCitPQkpTLSQoQ09ORklHX0xJTUlURVJfRklMVEVSKSAgICAgICAgICAgICAgICArPSB4ODYvdmZfbGltaXRlcl9pbml0Lm8KIE9CSlMtJChDT05GSUdfTUFTS0VETUVSR0VfRklMVEVSKSAgICAgICAgICAgICs9IHg4Ni92Zl9tYXNrZWRtZXJnZV9pbml0Lm8KIE9CSlMtJChDT05GSUdfTk9JU0VfRklMVEVSKSAgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl9ub2lzZS5vCiBPQkpTLSQoQ09ORklHX1BQN19GSUxURVIpICAgICAgICAgICAgICAgICAgICArPSB4ODYvdmZfcHA3X2luaXQubwogT0JKUy0kKENPTkZJR19QU05SX0ZJTFRFUikgICAgICAgICAgICAgICAgICAgKz0geDg2L3ZmX3BzbnJfaW5pdC5vCiBPQkpTLSQoQ09ORklHX1BVTExVUF9GSUxURVIpICAgICAgICAgICAgICAgICArPSB4ODYvdmZfcHVsbHVwX2luaXQubwogT0JKUy0kKENPTkZJR19SRU1PVkVHUkFJTl9GSUxURVIpICAgICAgICAgICAgKz0geDg2L3ZmX3JlbW92ZWdyYWluX2luaXQubworT0JKUy0kKENPTkZJR19TSE9XQ1FUX0ZJTFRFUikgICAgICAgICAgICAgICAgKz0geDg2L2F2Zl9zaG93Y3F0X2luaXQubwogT0JKUy0kKENPTkZJR19TUFBfRklMVEVSKSAgICAgICAgICAgICAgICAgICAgKz0geDg2L3ZmX3NwcC5vCiBPQkpTLSQoQ09ORklHX1NTSU1fRklMVEVSKSAgICAgICAgICAgICAgICAgICArPSB4ODYvdmZfc3NpbV9pbml0Lm8KIE9CSlMtJChDT05GSUdfU1RFUkVPM0RfRklMVEVSKSAgICAgICAgICAgICAgICs9IHg4Ni92Zl9zdGVyZW8zZF9pbml0Lm8KIE9CSlMtJChDT05GSUdfVEJMRU5EX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHg4Ni92Zl9ibGVuZF9pbml0Lm8KK09CSlMtJChDT05GSUdfVEhSRVNIT0xEX0ZJTFRFUikgICAgICAgICAgICAgICs9IHg4Ni92Zl90aHJlc2hvbGRfaW5pdC5vCiBPQkpTLSQoQ09ORklHX1RJTlRFUkxBQ0VfRklMVEVSKSAgICAgICAgICAgICArPSB4ODYvdmZfdGludGVybGFjZV9pbml0Lm8KIE9CSlMtJChDT05GSUdfVk9MVU1FX0ZJTFRFUikgICAgICAgICAgICAgICAgICs9IHg4Ni9hZl92b2x1bWVfaW5pdC5vCiBPQkpTLSQoQ09ORklHX1czRkRJRl9GSUxURVIpICAgICAgICAgICAgICAgICArPSB4ODYvdmZfdzNmZGlmX2luaXQubwogT0JKUy0kKENPTkZJR19ZQURJRl9GSUxURVIpICAgICAgICAgICAgICAgICAgKz0geDg2L3ZmX3lhZGlmX2luaXQubwogCi1ZQVNNLU9CSlMtJChDT05GSUdfQkxFTkRfRklMVEVSKSAgICAgICAgICAgICArPSB4ODYvdmZfYmxlbmQubwotWUFTTS1PQkpTLSQoQ09ORklHX0ZTUFBfRklMVEVSKSAgICAgICAgICAgICAgKz0geDg2L3ZmX2ZzcHAubwotWUFTTS1PQkpTLSQoQ09ORklHX0dSQURGVU5fRklMVEVSKSAgICAgICAgICAgKz0geDg2L3ZmX2dyYWRmdW4ubwotWUFTTS1PQkpTLSQoQ09ORklHX0hRRE4zRF9GSUxURVIpICAgICAgICAgICAgKz0geDg2L3ZmX2hxZG4zZC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfSURFVF9GSUxURVIpICAgICAgICAgICAgICArPSB4ODYvdmZfaWRldC5vCi1ZQVNNLU9CSlMtJChDT05GSUdfSU5URVJMQUNFX0ZJTFRFUikgICAgICAgICArPSB4ODYvdmZfaW50ZXJsYWNlLm8KLVlBU00tT0JKUy0kKENPTkZJR19NQVNLRURNRVJHRV9GSUxURVIpICAgICAgICs9IHg4Ni92Zl9tYXNrZWRtZXJnZS5vCi1ZQVNNLU9CSlMtJChDT05GSUdfUFA3X0ZJTFRFUikgICAgICAgICAgICAgICArPSB4ODYvdmZfcHA3Lm8KLVlBU00tT0JKUy0kKENPTkZJR19QU05SX0ZJTFRFUikgICAgICAgICAgICAgICs9IHg4Ni92Zl9wc25yLm8KLVlBU00tT0JKUy0kKENPTkZJR19QVUxMVVBfRklMVEVSKSAgICAgICAgICAgICs9IHg4Ni92Zl9wdWxsdXAubworWDg2QVNNLU9CSlMtJChDT05GSUdfQUZJUl9GSUxURVIpICAgICAgICAgICAgKz0geDg2L2FmX2FmaXIubworWDg2QVNNLU9CSlMtJChDT05GSUdfQkxFTkRfRklMVEVSKSAgICAgICAgICAgKz0geDg2L3ZmX2JsZW5kLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0JXRElGX0ZJTFRFUikgICAgICAgICAgICs9IHg4Ni92Zl9id2RpZi5vCitYODZBU00tT0JKUy0kKENPTkZJR19DT0xPUlNQQUNFX0ZJTFRFUikgICAgICArPSB4ODYvY29sb3JzcGFjZWRzcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19GUkFNRVJBVEVfRklMVEVSKSAgICAgICArPSB4ODYvdmZfZnJhbWVyYXRlLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0ZTUFBfRklMVEVSKSAgICAgICAgICAgICs9IHg4Ni92Zl9mc3BwLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0dSQURGVU5fRklMVEVSKSAgICAgICAgICs9IHg4Ni92Zl9ncmFkZnVuLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0hGTElQX0ZJTFRFUikgICAgICAgICAgICs9IHg4Ni92Zl9oZmxpcC5vCitYODZBU00tT0JKUy0kKENPTkZJR19IUUROM0RfRklMVEVSKSAgICAgICAgICArPSB4ODYvdmZfaHFkbjNkLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0lERVRfRklMVEVSKSAgICAgICAgICAgICs9IHg4Ni92Zl9pZGV0Lm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX0lOVEVSTEFDRV9GSUxURVIpICAgICAgICs9IHg4Ni92Zl9pbnRlcmxhY2UubworWDg2QVNNLU9CSlMtJChDT05GSUdfTElNSVRFUl9GSUxURVIpICAgICAgICAgKz0geDg2L3ZmX2xpbWl0ZXIubworWDg2QVNNLU9CSlMtJChDT05GSUdfTUFTS0VETUVSR0VfRklMVEVSKSAgICAgKz0geDg2L3ZmX21hc2tlZG1lcmdlLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1BQN19GSUxURVIpICAgICAgICAgICAgICs9IHg4Ni92Zl9wcDcubworWDg2QVNNLU9CSlMtJChDT05GSUdfUFNOUl9GSUxURVIpICAgICAgICAgICAgKz0geDg2L3ZmX3BzbnIubworWDg2QVNNLU9CSlMtJChDT05GSUdfUFVMTFVQX0ZJTFRFUikgICAgICAgICAgKz0geDg2L3ZmX3B1bGx1cC5vCiBpZmRlZiBDT05GSUdfR1BMCi1ZQVNNLU9CSlMtJChDT05GSUdfUkVNT1ZFR1JBSU5fRklMVEVSKSAgICAgICArPSB4ODYvdmZfcmVtb3ZlZ3JhaW4ubworWDg2QVNNLU9CSlMtJChDT05GSUdfUkVNT1ZFR1JBSU5fRklMVEVSKSAgICAgKz0geDg2L3ZmX3JlbW92ZWdyYWluLm8KIGVuZGlmCi1ZQVNNLU9CSlMtJChDT05GSUdfU1NJTV9GSUxURVIpICAgICAgICAgICAgICArPSB4ODYvdmZfc3NpbS5vCi1ZQVNNLU9CSlMtJChDT05GSUdfU1RFUkVPM0RfRklMVEVSKSAgICAgICAgICArPSB4ODYvdmZfc3RlcmVvM2QubwotWUFTTS1PQkpTLSQoQ09ORklHX1RCTEVORF9GSUxURVIpICAgICAgICAgICAgKz0geDg2L3ZmX2JsZW5kLm8KLVlBU00tT0JKUy0kKENPTkZJR19USU5URVJMQUNFX0ZJTFRFUikgICAgICAgICs9IHg4Ni92Zl9pbnRlcmxhY2UubwotWUFTTS1PQkpTLSQoQ09ORklHX1ZPTFVNRV9GSUxURVIpICAgICAgICAgICAgKz0geDg2L2FmX3ZvbHVtZS5vCi1ZQVNNLU9CSlMtJChDT05GSUdfVzNGRElGX0ZJTFRFUikgICAgICAgICAgICArPSB4ODYvdmZfdzNmZGlmLm8KLVlBU00tT0JKUy0kKENPTkZJR19ZQURJRl9GSUxURVIpICAgICAgICAgICAgICs9IHg4Ni92Zl95YWRpZi5vIHg4Ni95YWRpZi0xNi5vIHg4Ni95YWRpZi0xMC5vCitYODZBU00tT0JKUy0kKENPTkZJR19TSE9XQ1FUX0ZJTFRFUikgICAgICAgICArPSB4ODYvYXZmX3Nob3djcXQubworWDg2QVNNLU9CSlMtJChDT05GSUdfU1NJTV9GSUxURVIpICAgICAgICAgICAgKz0geDg2L3ZmX3NzaW0ubworWDg2QVNNLU9CSlMtJChDT05GSUdfU1RFUkVPM0RfRklMVEVSKSAgICAgICAgKz0geDg2L3ZmX3N0ZXJlbzNkLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1RCTEVORF9GSUxURVIpICAgICAgICAgICs9IHg4Ni92Zl9ibGVuZC5vCitYODZBU00tT0JKUy0kKENPTkZJR19USFJFU0hPTERfRklMVEVSKSAgICAgICArPSB4ODYvdmZfdGhyZXNob2xkLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1RJTlRFUkxBQ0VfRklMVEVSKSAgICAgICs9IHg4Ni92Zl9pbnRlcmxhY2UubworWDg2QVNNLU9CSlMtJChDT05GSUdfVk9MVU1FX0ZJTFRFUikgICAgICAgICAgKz0geDg2L2FmX3ZvbHVtZS5vCitYODZBU00tT0JKUy0kKENPTkZJR19XM0ZESUZfRklMVEVSKSAgICAgICAgICArPSB4ODYvdmZfdzNmZGlmLm8KK1g4NkFTTS1PQkpTLSQoQ09ORklHX1lBRElGX0ZJTFRFUikgICAgICAgICAgICs9IHg4Ni92Zl95YWRpZi5vIHg4Ni95YWRpZi0xNi5vIHg4Ni95YWRpZi0xMC5vCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYvYWZfYWZpci5hc20gYi9saWJhdmZpbHRlci94ODYvYWZfYWZpci5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ5ZDg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni9hZl9hZmlyLmFzbQpAQCAtMCwwICsxLDYwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciBhZmlyIGZpbHRlcgorOyogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT04gLnRleHQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyB2b2lkIGZmX2ZjbXVsX2FkZChmbG9hdCAqc3VtLCBjb25zdCBmbG9hdCAqdCwgY29uc3QgZmxvYXQgKmMsIGludCBsZW4pCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lOSVRfWE1NIHNzZTMKK2NnbG9iYWwgZmNtdWxfYWRkLCA0LDQsNiwgc3VtLCB0LCBjLCBsZW4KKyAgICBzaGwgICAgICAgbGVuZCwgMworICAgIGFkZCAgICAgICBsZW5kLCBtbXNpemUqMgorICAgIGFkZCAgICAgICAgIHRxLCBsZW5xCisgICAgYWRkICAgICAgICAgY3EsIGxlbnEKKyAgICBhZGQgICAgICAgc3VtcSwgbGVucQorICAgIG5lZyAgICAgICBsZW5xCitBTElHTiAxNgorLmxvb3A6CisgICAgbW92c2xkdXAgIG0wLCBbdHEgKyBsZW5xXQorICAgIG1vdnNsZHVwICBtMywgW3RxICsgbGVucSttbXNpemVdCisgICAgbW92YXBzICAgIG0xLCBbY3EgKyBsZW5xXQorICAgIG1vdmFwcyAgICBtNCwgW2NxICsgbGVucSttbXNpemVdCisgICAgbXVscHMgICAgIG0wLCBtMQorICAgIG11bHBzICAgICBtMywgbTQKKyAgICBzaHVmcHMgICAgbTEsIG0xLCAweGIxCisgICAgc2h1ZnBzICAgIG00LCBtNCwgMHhiMQorICAgIG1vdnNoZHVwICBtMiwgW3RxICsgbGVucV0KKyAgICBtb3ZzaGR1cCAgbTUsIFt0cSArIGxlbnErbW1zaXplXQorICAgIG11bHBzICAgICBtMiwgbTEKKyAgICBtdWxwcyAgICAgbTUsIG00CisgICAgYWRkc3VicHMgIG0wLCBtMgorICAgIGFkZHN1YnBzICBtMywgbTUKKyAgICBhZGRwcyAgICAgbTAsIFtzdW1xICsgbGVucV0KKyAgICBhZGRwcyAgICAgbTMsIFtzdW1xICsgbGVucSttbXNpemVdCisgICAgbW92YXBzICAgIFtzdW1xICsgbGVucV0sIG0wCisgICAgbW92YXBzICAgIFtzdW1xICsgbGVucSttbXNpemVdLCBtMworICAgIGFkZCAgICAgICBsZW5xLCBtbXNpemUqMgorICAgIGpsIC5sb29wCisgICAgUkVQX1JFVApkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L2FmX2FmaXJfaW5pdC5jIGIvbGliYXZmaWx0ZXIveDg2L2FmX2FmaXJfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNjUyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci94ODYvYWZfYWZpcl9pbml0LmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9hZl9hZmlyLmgiCisKK3ZvaWQgZmZfZmNtdWxfYWRkX3NzZTMoZmxvYXQgKnN1bSwgY29uc3QgZmxvYXQgKnQsIGNvbnN0IGZsb2F0ICpjLAorICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgbGVuKTsKKworYXZfY29sZCB2b2lkIGZmX2FmaXJfaW5pdF94ODYoQXVkaW9GSVJDb250ZXh0ICpzKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoRVhURVJOQUxfU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgIHMtPmZjbXVsX2FkZCA9IGZmX2ZjbXVsX2FkZF9zc2UzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni9hdmZfc2hvd2NxdC5hc20gYi9saWJhdmZpbHRlci94ODYvYXZmX3Nob3djcXQuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTU4NDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci94ODYvYXZmX3Nob3djcXQuYXNtCkBAIC0wLDAgKzEsMTkyIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciBzaG93Y3F0IGZpbHRlcgorOyoKKzsqIENvcHlyaWdodCAoQykgMjAxNiBNdWhhbW1hZCBGYWl6IDxtZmNjNjRAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKKyVpZiBBUkNIX1g4Nl82NAorJWRlZmluZSBwb2ludGVyIHJlc3EKKyVlbHNlCislZGVmaW5lIHBvaW50ZXIgcmVzZAorJWVuZGlmCisKK3N0cnVjIENvZWZmcworICAgIC52YWw6ICAgcG9pbnRlciAxCisgICAgLnN0YXJ0OiByZXNkIDEKKyAgICAubGVuOiAgIHJlc2QgMQorICAgIC5zaXplb2Y6CitlbmRzdHJ1YworCislbWFjcm8gQ1FUX0NBTEMgOQorOyAlMSA9IGFfcmUsICUyID0gYV9pbSwgJTMgPSBiX3JlLCAlNCA9IGJfaW0KKzsgJTUgPSBtX3JlLCAlNiA9IG1faW0sICU3ID0gdG1wLCAlOCA9IGNvZWZmdmFsLCAlOSA9IGNvZWZmc3Ffb2Zmc2V0CisgICAgbW92ICAgICBpZCwgeGQKKyAgICBhZGQgICAgIGlkLCBbY29lZmZzcSArIENvZWZmcy5zdGFydCArICU5XQorICAgIG1vdmFwcyAgbSU1LCBbc3JjcSArIDggKiBpcV0KKyAgICBtb3ZhcHMgIG0lNywgW3NyY3EgKyA4ICogaXEgKyBtbXNpemVdCisgICAgc2h1ZnBzICBtJTYsIG0lNSwgbSU3LCBxMzEzMQorICAgIHNodWZwcyAgbSU1LCBtJTUsIG0lNywgcTIwMjAKKyAgICBzdWIgICAgIGlkLCBmZnRfbGVuZAorICAgIEZNVUxBRERfUFMgbSUyLCBtJTYsIG0lOCwgbSUyLCBtJTYKKyAgICBuZWcgICAgIGlkCisgICAgRk1VTEFERF9QUyBtJTEsIG0lNSwgbSU4LCBtJTEsIG0lNQorICAgIG1vdnVwcyAgbSU1LCBbc3JjcSArIDggKiBpcSAtIG1tc2l6ZSArIDhdCisgICAgbW92dXBzICBtJTcsIFtzcmNxICsgOCAqIGlxIC0gMiptbXNpemUgKyA4XQorICAgICVpZiBtbXNpemUgPT0gMzIKKyAgICB2cGVybTJmMTI4IG0lNSwgbSU1LCBtJTUsIDEKKyAgICB2cGVybTJmMTI4IG0lNywgbSU3LCBtJTcsIDEKKyAgICAlZW5kaWYKKyAgICBzaHVmcHMgIG0lNiwgbSU1LCBtJTcsIHExMzEzCisgICAgc2h1ZnBzICBtJTUsIG0lNSwgbSU3LCBxMDIwMgorICAgIEZNVUxBRERfUFMgbSU0LCBtJTYsIG0lOCwgbSU0LCBtJTYKKyAgICBGTVVMQUREX1BTIG0lMywgbSU1LCBtJTgsIG0lMywgbSU1CislZW5kbWFjcm8gOyBDUVRfQ0FMQworCislbWFjcm8gQ1FUX1NFUEFSQVRFIDYgOyBhX3JlLCBhX2ltLCBiX3JlLCBiX2ltLCB0bXAsIHRtcDIKKyAgICBhZGRwcyAgIG0lNSwgbSU0LCBtJTIKKyAgICBzdWJwcyAgIG0lNiwgbSUzLCBtJTEKKyAgICBhZGRwcyAgIG0lMSwgbSUxLCBtJTMKKyAgICBzdWJwcyAgIG0lMiwgbSUyLCBtJTQKKyAgICBIQUREUFMgIG0lNSwgbSU2LCBtJTMKKyAgICBIQUREUFMgIG0lMSwgbSUyLCBtJTMKKyAgICBIQUREUFMgIG0lMSwgbSU1LCBtJTIKKyAgICAlaWYgbW1zaXplID09IDMyCisgICAgdmV4dHJhY3RmMTI4IHhtbSUyLCBtJTEsIDEKKyAgICBhZGRwcyAgIHhtbSUxLCB4bW0lMgorICAgICVlbmRpZgorJWVuZG1hY3JvIDsgQ1FUX1NFUEFSQVRFCisKKyVtYWNybyBERUNMQVJFX0NRVF9DQUxDIDAKKzsgZmZfc2hvd2NxdF9jcXRfY2FsY18qKGRzdCwgc3JjLCBjb2VmZnMsIGxlbiwgZmZ0X2xlbikKKyVpZiBBUkNIX1g4Nl82NAorY2dsb2JhbCBzaG93Y3F0X2NxdF9jYWxjLCA1LCAxMCwgMTIsIGRzdCwgc3JjLCBjb2VmZnMsIGxlbiwgZmZ0X2xlbiwgeCwgY29lZmZzX3ZhbCwgY29lZmZzX3ZhbDIsIGksIGNvZWZmc19sZW4KKyAgICBhbGlnbiAgIDE2CisgICAgLmxvb3BfazoKKyAgICAgICAgbW92ICAgICB4ZCwgW2NvZWZmc3EgKyBDb2VmZnMubGVuXQorICAgICAgICB4b3JwcyAgIG0wLCBtMCwgbTAKKyAgICAgICAgbW92YXBzICBtMSwgbTAKKyAgICAgICAgbW92YXBzICBtMiwgbTAKKyAgICAgICAgbW92ICAgICBjb2VmZnNfbGVuZCwgW2NvZWZmc3EgKyBDb2VmZnMubGVuICsgQ29lZmZzLnNpemVvZl0KKyAgICAgICAgbW92YXBzICBtMywgbTAKKyAgICAgICAgbW92YXBzICBtOCwgbTAKKyAgICAgICAgY21wICAgICBjb2VmZnNfbGVuZCwgeGQKKyAgICAgICAgbW92YXBzICBtOSwgbTAKKyAgICAgICAgbW92YXBzICBtMTAsIG0wCisgICAgICAgIG1vdmFwcyAgbTExLCBtMAorICAgICAgICBjbW92YSAgIGNvZWZmc19sZW5kLCB4ZAorICAgICAgICB4b3IgICAgIHhkLCB4ZAorICAgICAgICB0ZXN0ICAgIGNvZWZmc19sZW5kLCBjb2VmZnNfbGVuZAorICAgICAgICBqeiAgICAgIC5jaGVja19sb29wX2IKKyAgICAgICAgbW92ICAgICBjb2VmZnNfdmFscSwgW2NvZWZmc3EgKyBDb2VmZnMudmFsXQorICAgICAgICBtb3YgICAgIGNvZWZmc192YWwycSwgW2NvZWZmc3EgKyBDb2VmZnMudmFsICsgQ29lZmZzLnNpemVvZl0KKyAgICAgICAgYWxpZ24gICAxNgorICAgICAgICAubG9vcF9hYjoKKyAgICAgICAgICAgIG1vdmFwcyAgbTcsIFtjb2VmZnNfdmFscSArIDQgKiB4cV0KKyAgICAgICAgICAgIENRVF9DQUxDIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDAKKyAgICAgICAgICAgIG1vdmFwcyAgbTcsIFtjb2VmZnNfdmFsMnEgKyA0ICogeHFdCisgICAgICAgICAgICBDUVRfQ0FMQyA4LCA5LCAxMCwgMTEsIDQsIDUsIDYsIDcsIENvZWZmcy5zaXplb2YKKyAgICAgICAgICAgIGFkZCAgICAgeGQsIG1tc2l6ZS80CisgICAgICAgICAgICBjbXAgICAgIHhkLCBjb2VmZnNfbGVuZAorICAgICAgICAgICAgamIgICAgICAubG9vcF9hYgorICAgICAgICAuY2hlY2tfbG9vcF9iOgorICAgICAgICBjbXAgICAgIHhkLCBbY29lZmZzcSArIENvZWZmcy5sZW4gKyBDb2VmZnMuc2l6ZW9mXQorICAgICAgICBqYWUgICAgIC5jaGVja19sb29wX2EKKyAgICAgICAgYWxpZ24gICAxNgorICAgICAgICAubG9vcF9iOgorICAgICAgICAgICAgbW92YXBzICBtNywgW2NvZWZmc192YWwycSArIDQgKiB4cV0KKyAgICAgICAgICAgIENRVF9DQUxDIDgsIDksIDEwLCAxMSwgNCwgNSwgNiwgNywgQ29lZmZzLnNpemVvZgorICAgICAgICAgICAgYWRkICAgICB4ZCwgbW1zaXplLzQKKyAgICAgICAgICAgIGNtcCAgICAgeGQsIFtjb2VmZnNxICsgQ29lZmZzLmxlbiArIENvZWZmcy5zaXplb2ZdCisgICAgICAgICAgICBqYiAgICAgIC5sb29wX2IKKyAgICAgICAgLmxvb3BfZW5kOgorICAgICAgICBDUVRfU0VQQVJBVEUgMCwgMSwgMiwgMywgNCwgNQorICAgICAgICBDUVRfU0VQQVJBVEUgOCwgOSwgMTAsIDExLCA0LCA1CisgICAgICAgIG11bHBzICAgeG1tMCwgeG1tMAorICAgICAgICBtdWxwcyAgIHhtbTgsIHhtbTgKKyAgICAgICAgSEFERFBTICB4bW0wLCB4bW04LCB4bW0xCisgICAgICAgIG1vdmFwcyAgW2RzdHFdLCB4bW0wCisgICAgICAgIHN1YiAgICAgbGVuZCwgMgorICAgICAgICBsZWEgICAgIGRzdHEsIFtkc3RxICsgMTZdCisgICAgICAgIGxlYSAgICAgY29lZmZzcSwgW2NvZWZmc3EgKyAyKkNvZWZmcy5zaXplb2ZdCisgICAgICAgIGpueiAgICAgLmxvb3BfaworICAgICAgICBSRVBfUkVUCisgICAgICAgIGFsaWduICAgMTYKKyAgICAgICAgLmNoZWNrX2xvb3BfYToKKyAgICAgICAgY21wICAgICB4ZCwgW2NvZWZmc3EgKyBDb2VmZnMubGVuXQorICAgICAgICBqYWUgICAgIC5sb29wX2VuZAorICAgICAgICBhbGlnbiAgIDE2CisgICAgICAgIC5sb29wX2E6CisgICAgICAgICAgICBtb3ZhcHMgIG03LCBbY29lZmZzX3ZhbHEgKyA0ICogeHFdCisgICAgICAgICAgICBDUVRfQ0FMQyAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCAwCisgICAgICAgICAgICBhZGQgICAgIHhkLCBtbXNpemUvNAorICAgICAgICAgICAgY21wICAgICB4ZCwgW2NvZWZmc3EgKyBDb2VmZnMubGVuXQorICAgICAgICAgICAgamIgICAgICAubG9vcF9hCisgICAgICAgIGptcCAgICAgLmxvb3BfZW5kCislZWxzZQorY2dsb2JhbCBzaG93Y3F0X2NxdF9jYWxjLCA0LCA3LCA4LCBkc3QsIHNyYywgY29lZmZzLCBsZW4sIHgsIGNvZWZmc192YWwsIGkKKyVkZWZpbmUgZmZ0X2xlbmQgcjRtCisgICAgYWxpZ24gICAxNgorICAgIC5sb29wX2s6CisgICAgICAgIG1vdiAgICAgeGQsIFtjb2VmZnNxICsgQ29lZmZzLmxlbl0KKyAgICAgICAgeG9ycHMgICBtMCwgbTAsIG0wCisgICAgICAgIG1vdmFwcyAgbTEsIG0wCisgICAgICAgIG1vdmFwcyAgbTIsIG0wCisgICAgICAgIG1vdmFwcyAgbTMsIG0wCisgICAgICAgIHRlc3QgICAgeGQsIHhkCisgICAgICAgIGp6ICAgICAgLnN0b3JlCisgICAgICAgIG1vdiAgICAgY29lZmZzX3ZhbHEsIFtjb2VmZnNxICsgQ29lZmZzLnZhbF0KKyAgICAgICAgeG9yICAgICB4ZCwgeGQKKyAgICAgICAgYWxpZ24gICAxNgorICAgICAgICAubG9vcF94OgorICAgICAgICAgICAgbW92YXBzICBtNywgW2NvZWZmc192YWxxICsgNCAqIHhxXQorICAgICAgICAgICAgQ1FUX0NBTEMgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgMAorICAgICAgICAgICAgYWRkICAgICB4ZCwgbW1zaXplLzQKKyAgICAgICAgICAgIGNtcCAgICAgeGQsIFtjb2VmZnNxICsgQ29lZmZzLmxlbl0KKyAgICAgICAgICAgIGpiICAgICAgLmxvb3BfeAorICAgICAgICBDUVRfU0VQQVJBVEUgMCwgMSwgMiwgMywgNCwgNQorICAgICAgICBtdWxwcyAgIHhtbTAsIHhtbTAKKyAgICAgICAgSEFERFBTICB4bW0wLCB4bW0wLCB4bW0xCisgICAgICAgIC5zdG9yZToKKyAgICAgICAgbW92bHBzICBbZHN0cV0sIHhtbTAKKyAgICAgICAgc3ViICAgICBsZW5kLCAxCisgICAgICAgIGxlYSAgICAgZHN0cSwgW2RzdHEgKyA4XQorICAgICAgICBsZWEgICAgIGNvZWZmc3EsIFtjb2VmZnNxICsgQ29lZmZzLnNpemVvZl0KKyAgICAgICAgam56ICAgICAubG9vcF9rCisgICAgICAgIFJFUF9SRVQKKyVlbmRpZiA7IEFSQ0hfWDg2XzY0CislZW5kbWFjcm8gOyBERUNMQVJFX0NRVF9DQUxDCisKK0lOSVRfWE1NIHNzZQorREVDTEFSRV9DUVRfQ0FMQworSU5JVF9YTU0gc3NlMworREVDTEFSRV9DUVRfQ0FMQworJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK0RFQ0xBUkVfQ1FUX0NBTEMKKyVlbmRpZgorJWlmIEhBVkVfRk1BM19FWFRFUk5BTAorSU5JVF9ZTU0gZm1hMworREVDTEFSRV9DUVRfQ0FMQworJWVuZGlmCislaWYgSEFWRV9GTUE0X0VYVEVSTkFMCitJTklUX1hNTSBmbWE0CitERUNMQVJFX0NRVF9DQUxDCislZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni9hdmZfc2hvd2NxdF9pbml0LmMgYi9saWJhdmZpbHRlci94ODYvYXZmX3Nob3djcXRfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYzE2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci94ODYvYXZmX3Nob3djcXRfaW5pdC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTXVoYW1tYWQgRmFpeiA8bWZjYzY0QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvYXZmX3Nob3djcXQuaCIKKworI2RlZmluZSBERUNMQVJFX0NRVF9DQUxDKHR5cGUpIFwKK3ZvaWQgZmZfc2hvd2NxdF9jcXRfY2FsY18jI3R5cGUoRkZUQ29tcGxleCAqZHN0LCBjb25zdCBGRlRDb21wbGV4ICpzcmMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29lZmZzICpjb2VmZnMsIGludCBsZW4sIGludCBmZnRfbGVuKQorCitERUNMQVJFX0NRVF9DQUxDKHNzZSk7CitERUNMQVJFX0NRVF9DQUxDKHNzZTMpOworREVDTEFSRV9DUVRfQ0FMQyhhdngpOworREVDTEFSRV9DUVRfQ0FMQyhmbWEzKTsKK0RFQ0xBUkVfQ1FUX0NBTEMoZm1hNCk7CisKKyNkZWZpbmUgcGVybXV0ZV9jb2VmZnNfMCBOVUxMCisKK3N0YXRpYyB2b2lkIHBlcm11dGVfY29lZmZzXzAxNDUyMzY3KGZsb2F0ICp2LCBpbnQgbGVuKQoreworICAgIGludCBrOworICAgIGZvciAoayA9IDA7IGsgPCBsZW47IGsgKz0gOCkgeworICAgICAgICBGRlNXQVAoZmxvYXQsIHZbaysyXSwgdltrKzRdKTsKKyAgICAgICAgRkZTV0FQKGZsb2F0LCB2W2srM10sIHZbays1XSk7CisgICAgfQorfQorCithdl9jb2xkIHZvaWQgZmZfc2hvd2NxdF9pbml0X3g4NihTaG93Q1FUQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1ZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyNkZWZpbmUgU0VMRUNUX0NRVF9DQUxDKHR5cGUsIFRZUEUsIGFsaWduLCBwZXJtKSBcCitpZiAoRVhURVJOQUxfIyNUWVBFKGNwdWZsYWdzKSkgeyBcCisgICAgcy0+Y3F0X2NhbGMgPSBmZl9zaG93Y3F0X2NxdF9jYWxjXyMjdHlwZTsgXAorICAgIHMtPmNxdF9hbGlnbiA9IGFsaWduOyBcCisgICAgcy0+cGVybXV0ZV9jb2VmZnMgPSBwZXJtdXRlX2NvZWZmc18jI3Blcm07IFwKK30KKworICAgIFNFTEVDVF9DUVRfQ0FMQyhzc2UsICBTU0UsICA0LCAwKTsKKyAgICBTRUxFQ1RfQ1FUX0NBTEMoc3NlMywgU1NFM19GQVNULCA0LCAwKTsKKyAgICBTRUxFQ1RfQ1FUX0NBTEMoZm1hNCwgRk1BNCwgNCwgMCk7IC8vIHVzaW5nIHhtbQorICAgIFNFTEVDVF9DUVRfQ0FMQyhhdngsICBBVlhfRkFTVCwgIDgsIDAxNDUyMzY3KTsKKyAgICBTRUxFQ1RfQ1FUX0NBTEMoZm1hMywgRk1BM19GQVNULCA4LCAwMTQ1MjM2Nyk7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYvY29sb3JzcGFjZWRzcC5hc20gYi9saWJhdmZpbHRlci94ODYvY29sb3JzcGFjZWRzcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdkODUxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni9jb2xvcnNwYWNlZHNwLmFzbQpAQCAtMCwwICsxLDEwOTcgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2LW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIGNvbG9yc3BhY2UgZmlsdGVyCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDE2IFJvbmFsZCBTLiBCdWx0amUgPHJzYnVsdGplQGdtYWlsLmNvbT4KKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIgorCitTRUNUSU9OX1JPREFUQQorCitwd18xOiB0aW1lcyA4IGR3IDEKK3B3XzI6IHRpbWVzIDggZHcgMgorcHdfNDogdGltZXMgOCBkdyA0Citwd184OiB0aW1lcyA4IGR3IDgKK3B3XzE2OiB0aW1lcyA4IGR3IDE2Citwd182NDogdGltZXMgOCBkdyA2NAorcHdfMTI4OiB0aW1lcyA4IGR3IDEyOAorcHdfMjU2OiB0aW1lcyA4IGR3IDI1NgorcHdfNTEyOiB0aW1lcyA4IGR3IDUxMgorcHdfMTAyMzogdGltZXMgOCBkdyAxMDIzCitwd18xMDI0OiB0aW1lcyA4IGR3IDEwMjQKK3B3XzIwNDg6IHRpbWVzIDggZHcgMjA0OAorcHdfNDA5NTogdGltZXMgOCBkdyA0MDk1Citwd184MTkyOiB0aW1lcyA4IGR3IDgxOTIKK3B3XzE2Mzg0OiB0aW1lcyA4IGR3IDE2Mzg0CisKK3BkXzE6IHRpbWVzIDQgZGQgMQorcGRfMjogdGltZXMgNCBkZCAyCitwZF8xMjg6IHRpbWVzIDQgZGQgMTI4CitwZF81MTI6IHRpbWVzIDQgZGQgNTEyCitwZF8yMDQ4OiB0aW1lcyA0IGRkIDIwNDgKK3BkXzgxOTI6IHRpbWVzIDQgZGQgODE5MgorcGRfMzI3Njg6IHRpbWVzIDQgZGQgMzI3NjgKK3BkXzEzMTA3MjogdGltZXMgNCBkZCAxMzEwNzIKKworU0VDVElPTiAudGV4dAorCis7IHZvaWQgZmZfeXV2Mnl1dl80MjBwOHRvOF9zc2UyKHVpbnQ4X3QgKnl1dl9vdXRbM10sIHB0cmRpZmZfdCB5dXZfb3V0X3N0cmlkZVszXSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqeXV2X2luWzNdLCBwdHJkaWZmX3QgeXV2X2luX3N0cmlkZVszXSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBjb25zdCBpbnQxNl90IHl1djJ5dXZfY29lZmZzWzNdWzNdWzhdLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHl1dl9vZmZzZXRbMl1bOF0pCisKKyVpZiBBUkNIX1g4Nl82NAorJW1hY3JvIFlVVjJZVVZfRk4gNCA7IGluX2JpdGRlcHRoLCBvdXRfYml0ZGVwdGgsIGxvZzJfY2hyb21hX3cgKGhvcml6KSwgbG9nMl9jaHJvbWFfaCAodmVydCkKKworJWFzc2lnbiAlJXNoICgxNCArICUxIC0gJTIpCislYXNzaWduICUlcm5kICgxIDw8ICglJXNoIC0gMSkpCislYXNzaWduICUldXZpbm9mZiAoMTI4IDw8ICglMSAtIDgpKQorJWFzc2lnbiAlJXV2b3V0b2ZmICgxMjggPDwgKCUyIC0gOCkpCislaWYgJTMgPT0gMAorJWFzc2lnbiAlJXNzIDQ0NAorJWVsaWYgJTQgPT0gMAorJWFzc2lnbiAlJXNzIDQyMgorJWVsc2UgOyAlNCA9PSAxCislYXNzaWduICUlc3MgNDIwCislZW5kaWYgOyAlMy8lNAorJWlmICUyICE9IDgKKyVhc3NpZ24gJSVtYXh2YWwgKDEgPDwgJTIpIC0gMQorJWVuZGlmIDsgJTIgIT0gOAorCislYXNzaWduICUleXBzaCAlJXNoIC0gMQorJWlmICUleXBzaCA+IDE0CislYXNzaWduICUleW9mZnNoICUleXBzaCAtIDEzCislYXNzaWduICUleXBzaCAxNAorJWVsc2UKKyVhc3NpZ24gJSV5b2Zmc2ggMQorJWVuZGlmCislYXNzaWduICUleXBybmQgKDEgPDwgKCUleW9mZnNoIC0gMSkpCislYXNzaWduICUleXBtdWwgKDEgPDwgJSV5cHNoKQorCitjZ2xvYmFsIHl1djJ5dXZfICUrICUlc3MgJSsgcCUxdG8lMiwgOCwgMTQsIDE2LCAwIC0gKDQgKiBtbXNpemUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeW8sIHlvcywgeWksIHlpcywgdywgaCwgYywgeW9mZiwgdWksIHZpLCB1bywgdm8KKyVpZiAlMyA9PSAxCisgICAgaW5jICAgICAgICAgICAgIHdkCisgICAgc2FyICAgICAgICAgICAgIHdkLCAxCislaWYgJTQgPT0gMQorICAgIGluYyAgICAgICAgICAgICBoZAorICAgIHNhciAgICAgICAgICAgICBoZCwgMQorJWVuZGlmIDsgJTQgPT0gMQorJWVuZGlmIDsgJTMgPT0gMQorICAgIG1vdiBbcnNwKzMqbW1zaXplKzBdLCB3ZAorICAgIG1vdiBbcnNwKzMqbW1zaXplKzRdLCBoZAorCisgICAgbW92YSAgICAgICAgICAgbTEwLCBbY3FdCisgICAgcHhvciAgICAgICAgICAgbTExLCBtMTEKKyAgICBtb3ZhICAgICAgICAgICBtMTIsIFtwZF8gJSsgJSV1dm91dG9mZl0KKyAgICBwc2xsZCAgICAgICAgICBtMTIsICUlc2gKKyAgICBwYWRkZCAgICAgICAgICBtMTIsIFtwZF8gJSsgJSVybmRdCisgICAgbW92YSAgICAgICAgICAgbTEzLCBbcHdfICUrICUldXZpbm9mZl0KKyAgICBtb3ZhICAgICAgICAgICBtMTQsIFt5b2ZmcSsgMF0gICAgICA7IHlfb2ZmX2luCisgICAgbW92YSAgICAgICAgICAgbTE1LCBbeW9mZnErMTZdICAgICAgOyB5X29mZl9vdXQKKyVpZiAlJXlvZmZzaCAhPSAwCisgICAgcHNsbHcgICAgICAgICAgbTE1LCAlJXlvZmZzaAorJWVuZGlmCisgICAgcGFkZHcgICAgICAgICAgbTE1LCBbcHdfICUrICUleXBybmRdCisgICAgcHVucGNrbHdkICAgICAgbTEwLCBtMTUKKyAgICBtb3ZhICAgICAgICAgICBtMTUsIFtwd18gJSsgJSV5cG11bF0KKyAgICBtb3ZoICAgICAgICAgICAgbTAsIFtjcSsxKjE2XSAgICAgICA7IGN5dQorICAgIG1vdmggICAgICAgICAgICBtMSwgW2NxKzIqMTZdICAgICAgIDsgY3l2CisgICAgbW92aCAgICAgICAgICAgIG0yLCBbY3ErNCoxNl0gICAgICAgOyBjdXUKKyAgICBtb3ZoICAgICAgICAgICAgbTMsIFtjcSs1KjE2XSAgICAgICA7IGN1dgorICAgIG1vdmggICAgICAgICAgICBtNCwgW2NxKzcqMTZdICAgICAgIDsgY3Z1CisgICAgbW92aCAgICAgICAgICAgIG01LCBbY3ErOCoxNl0gICAgICAgOyBjdnYKKyAgICBwdW5wY2tsd2QgICAgICAgbTAsIG0xCisgICAgcHVucGNrbHdkICAgICAgIG0yLCBtMworICAgIHB1bnBja2x3ZCAgICAgICBtNCwgbTUKKyAgICBtb3ZhIFtyc3ArMCptbXNpemVdLCBtMAorICAgIG1vdmEgW3JzcCsxKm1tc2l6ZV0sIG0yCisgICAgbW92YSBbcnNwKzIqbW1zaXplXSwgbTQKKworICAgIERFRklORV9BUkdTIHlvLCB5b3MsIHlpLCB5aXMsIHVpLCB2aSwgdW8sIHZvLCB1aXMsIHZpcywgdW9zLCB2b3MsIHgsIHRtcAorCisgICAgbW92ICAgICAgICAgICAgdWlxLCBbeWlxK2dwcnNpemUqMV0KKyAgICBtb3YgICAgICAgICAgICB2aXEsIFt5aXErZ3Byc2l6ZSoyXQorICAgIG1vdiAgICAgICAgICAgIHlpcSwgW3lpcStncHJzaXplKjBdCisgICAgbW92ICAgICAgICAgICAgdW9xLCBbeW9xK2dwcnNpemUqMV0KKyAgICBtb3YgICAgICAgICAgICB2b3EsIFt5b3ErZ3Byc2l6ZSoyXQorICAgIG1vdiAgICAgICAgICAgIHlvcSwgW3lvcStncHJzaXplKjBdCisgICAgbW92ICAgICAgICAgICB1aXNxLCBbeWlzcStncHJzaXplKjFdCisgICAgbW92ICAgICAgICAgICB2aXNxLCBbeWlzcStncHJzaXplKjJdCisgICAgbW92ICAgICAgICAgICB5aXNxLCBbeWlzcStncHJzaXplKjBdCisgICAgbW92ICAgICAgICAgICB1b3NxLCBbeW9zcStncHJzaXplKjFdCisgICAgbW92ICAgICAgICAgICB2b3NxLCBbeW9zcStncHJzaXplKjJdCisgICAgbW92ICAgICAgICAgICB5b3NxLCBbeW9zcStncHJzaXplKjBdCisKKy5sb29wX3Y6CisgICAgeG9yICAgICAgICAgICAgIHhxLCB4cQorCisubG9vcF9oOgorJWlmICU0ID09IDEKKyAgICBsZWEgICAgICAgICAgIHRtcHEsIFt5aXEreWlzcV0KKyVlbmRpZiA7ICU0ID09IDEKKyVpZiAlMSA9PSA4CisgICAgbW92dSAgICAgICAgICAgIG0wLCBbeWlxK3hxKigxPDwlMyldICAgICAgICA7IHkwMC8wMQorJWlmICU0ID09IDEKKyAgICBtb3Z1ICAgICAgICAgICAgbTIsIFt0bXBxK3hxKjJdICAgICAgICAgICAgIDsgeTEwLzExCislZW5kaWYgOyAlNCA9PSAxCislaWYgJTMgPT0gMQorICAgIG1vdmggICAgICAgICAgICBtNCwgW3VpcSt4cV0gICAgICAgICAgICAgICAgOyB1CisgICAgbW92aCAgICAgICAgICAgIG01LCBbdmlxK3hxXSAgICAgICAgICAgICAgICA7IHYKKyVlbHNlIDsgJTMgIT0gMQorICAgIG1vdnUgICAgICAgICAgICBtNCwgW3VpcSt4cV0gICAgICAgICAgICAgICAgOyB1CisgICAgbW92dSAgICAgICAgICAgIG01LCBbdmlxK3hxXSAgICAgICAgICAgICAgICA7IHYKKyVlbmRpZiA7ICUzID09LyE9IDEKKyAgICBwdW5wY2toYncgICAgICAgbTEsIG0wLCBtMTEKKyAgICBwdW5wY2tsYncgICAgICAgbTAsIG0xMQorJWlmICU0ID09IDEKKyAgICBwdW5wY2toYncgICAgICAgbTMsIG0yLCBtMTEKKyAgICBwdW5wY2tsYncgICAgICAgbTIsIG0xMQorJWVuZGlmIDsgJTQgPT0gMQorJWlmICUzID09IDAKKyAgICBwdW5wY2toYncgICAgICAgbTIsIG00LCBtMTEKKyAgICBwdW5wY2toYncgICAgICAgbTMsIG01LCBtMTEKKyVlbmRpZiA7ICUzID09IDAKKyAgICBwdW5wY2tsYncgICAgICAgbTQsIG0xMQorICAgIHB1bnBja2xidyAgICAgICBtNSwgbTExCislZWxzZSA7ICUxICE9IDgKKyAgICBtb3Z1ICAgICAgICAgICAgbTAsIFt5aXEreHEqKDI8PCUzKV0gICAgICAgIDsgeTAwLzAxCisgICAgbW92dSAgICAgICAgICAgIG0xLCBbeWlxK3hxKigyPDwlMykrbW1zaXplXSA7IHkwMC8wMQorJWlmICU0ID09IDEKKyAgICBtb3Z1ICAgICAgICAgICAgbTIsIFt0bXBxK3hxKjRdICAgICAgICAgICAgIDsgeTEwLzExCisgICAgbW92dSAgICAgICAgICAgIG0zLCBbdG1wcSt4cSo0K21tc2l6ZV0gICAgICA7IHkxMC8xMQorJWVuZGlmIDsgJTQgPT0gMQorICAgIG1vdnUgICAgICAgICAgICBtNCwgW3VpcSt4cSoyXSAgICAgICAgICAgICAgOyB1CisgICAgbW92dSAgICAgICAgICAgIG01LCBbdmlxK3hxKjJdICAgICAgICAgICAgICA7IHYKKyVpZiAlMyA9PSAwCisgICAgbW92dSAgICAgICAgICAgIG0yLCBbdWlxK3hxKjIrbW1zaXplXQorICAgIG1vdnUgICAgICAgICAgICBtMywgW3ZpcSt4cSoyK21tc2l6ZV0KKyVlbmRpZiA7ICUzID09IDAKKyVlbmRpZiA7ICUxID09LyE9IDgKKyAgICBwc3VidyAgICAgICAgICAgbTAsIG0xNAorICAgIHBzdWJ3ICAgICAgICAgICBtMSwgbTE0CislaWYgJTQgPT0gMQorICAgIHBzdWJ3ICAgICAgICAgICBtMiwgbTE0CisgICAgcHN1YncgICAgICAgICAgIG0zLCBtMTQKKyVlbmRpZiA7ICU0ID09IDEKKyAgICBwc3VidyAgICAgICAgICAgbTQsIG0xMworICAgIHBzdWJ3ICAgICAgICAgICBtNSwgbTEzCislaWYgJTMgPT0gMAorICAgIHBzdWJ3ICAgICAgICAgICBtMiwgbTEzCisgICAgcHN1YncgICAgICAgICAgIG0zLCBtMTMKKyVlbmRpZiA7ICUzID09IDAKKworICAgIFNCVVRURVJGTFkgICB3ZCwgNCwgNSwgNgorICAgIHBtYWRkd2QgICAgICAgICBtNiwgbTQsIFtyc3ArMSptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgIG03LCBtNSwgW3JzcCsxKm1tc2l6ZV0KKyVpZiAlMyA9PSAwCisgICAgU0JVVFRFUkZMWSAgIHdkLCAyLCAzLCA4CisgICAgcG1hZGR3ZCAgICAgICAgIG04LCBtMiwgW3JzcCsxKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTksIG0zLCBbcnNwKzEqbW1zaXplXQorJWVsc2UgOyAlMyAhPSAwCisgICAgcG1hZGR3ZCAgICAgICAgIG04LCBtNCwgW3JzcCsyKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTksIG01LCBbcnNwKzIqbW1zaXplXQorJWVuZGlmCisgICAgcGFkZGQgICAgICAgICAgIG02LCBtMTIKKyAgICBwYWRkZCAgICAgICAgICAgbTcsIG0xMgorICAgIHBhZGRkICAgICAgICAgICBtOCwgbTEyCisgICAgcGFkZGQgICAgICAgICAgIG05LCBtMTIKKyAgICBwc3JhZCAgICAgICAgICAgbTYsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTcsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTgsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTksICUlc2gKKyAgICBwYWNrc3NkdyAgICAgICAgbTYsIG03CisgICAgcGFja3NzZHcgICAgICAgIG04LCBtOQorJWlmICUyID09IDgKKyAgICBwYWNrdXN3YiAgICAgICAgbTYsIG04CislaWYgJTMgPT0gMAorICAgIG1vdnUgICAgICBbdW9xK3hxXSwgbTYKKyVlbHNlIDsgJTMgIT0gMAorICAgIG1vdmggICAgICBbdW9xK3hxXSwgbTYKKyAgICBtb3ZocHMgICAgW3ZvcSt4cV0sIG02CislZW5kaWYgOyAlMyA9PS8hPSAwCislZWxzZSA7ICUyICE9IDgKKyAgICBDTElQVyAgICAgICAgICAgbTYsIG0xMSwgW3B3XyAlKyAlJW1heHZhbF0KKyAgICBDTElQVyAgICAgICAgICAgbTgsIG0xMSwgW3B3XyAlKyAlJW1heHZhbF0KKyAgICBtb3Z1ICAgIFt1b3EreHEqMl0sIG02CislaWYgJTMgPT0gMAorICAgIG1vdnUgICAgW3VvcSt4cSoyK21tc2l6ZV0sIG04CislZWxzZSA7ICUzICE9IDAKKyAgICBtb3Z1ICAgIFt2b3EreHEqMl0sIG04CislZW5kaWYgOyAlMyA9PS8hPSAwCislZW5kaWYgOyAlMiA9PS8hPSA4CisKKyVpZiAlMyA9PSAwCisgICAgcG1hZGR3ZCAgICAgICAgIG02LCBtNCwgW3JzcCsyKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTcsIG01LCBbcnNwKzIqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtOCwgbTIsIFtyc3ArMiptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgIG05LCBtMywgW3JzcCsyKm1tc2l6ZV0KKyAgICBwYWRkZCAgICAgICAgICAgbTYsIG0xMgorICAgIHBhZGRkICAgICAgICAgICBtNywgbTEyCisgICAgcGFkZGQgICAgICAgICAgIG04LCBtMTIKKyAgICBwYWRkZCAgICAgICAgICAgbTksIG0xMgorICAgIHBzcmFkICAgICAgICAgICBtNiwgJSVzaAorICAgIHBzcmFkICAgICAgICAgICBtNywgJSVzaAorICAgIHBzcmFkICAgICAgICAgICBtOCwgJSVzaAorICAgIHBzcmFkICAgICAgICAgICBtOSwgJSVzaAorICAgIHBhY2tzc2R3ICAgICAgICBtNiwgbTcKKyAgICBwYWNrc3NkdyAgICAgICAgbTgsIG05CislaWYgJTIgPT0gOAorICAgIHBhY2t1c3diICAgICAgICBtNiwgbTgKKyAgICBtb3Z1ICAgICAgW3ZvcSt4cV0sIG02CislZWxzZSA7ICUyICE9IDgKKyAgICBDTElQVyAgICAgICAgICAgbTYsIG0xMSwgW3B3XyAlKyAlJW1heHZhbF0KKyAgICBDTElQVyAgICAgICAgICAgbTgsIG0xMSwgW3B3XyAlKyAlJW1heHZhbF0KKyAgICBtb3Z1ICAgIFt2b3EreHEqMl0sIG02CisgICAgbW92dSAgICBbdm9xK3hxKjIrbW1zaXplXSwgbTgKKyVlbmRpZiA7ICUyID09LyE9IDgKKyVlbmRpZiA7ICUzID09IDAKKworICAgIHBtYWRkd2QgICAgICAgICBtNCwgW3JzcCswKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTUsIFtyc3ArMCptbXNpemVdICAgICAgICAgIDsgdXZfdmFsCislaWYgJTMgPT0gMAorICAgIHBtYWRkd2QgICAgICAgICBtMiwgW3JzcCswKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTMsIFtyc3ArMCptbXNpemVdCislZW5kaWYgOyAlMyA9PSAwCisKKyAgICA7IHVucGFjayB5IHBpeGVscyB3aXRoIG0xNSAoc2hpZnRlZCByb3VuZCArIG9mZnNldCksIHRoZW4gbXVsdGlwbHkKKyAgICA7IGJ5IG0xMCwgYWRkIHV2IHBpeGVscywgYW5kIHdlJ3JlIGRvbmUhCislaWYgJTMgPT0gMQorICAgIHB1bnBja2hkcSAgICAgICBtOCwgbTQsIG00CisgICAgcHVucGNrbGRxICAgICAgIG00LCBtNAorICAgIHB1bnBja2hkcSAgICAgICBtOSwgbTUsIG01CisgICAgcHVucGNrbGRxICAgICAgIG01LCBtNQorJWVsc2UgOyAlMyAhPSAxCisgICAgU1dBUCAgICAgICAgICAgICA4LCA1LCAyCisgICAgU1dBUCAgICAgICAgICAgICAzLCA5CislZW5kaWYgOyAlMyA9PS8hPSAxCislaWYgJTQgPT0gMQorICAgIHB1bnBja2h3ZCAgICAgICBtNiwgbTIsIG0xNQorICAgIHB1bnBja2x3ZCAgICAgICBtMiwgbTE1CisgICAgcHVucGNraHdkICAgICAgIG03LCBtMywgbTE1CisgICAgcHVucGNrbHdkICAgICAgIG0zLCBtMTUKKyAgICBwbWFkZHdkICAgICAgICAgbTIsIG0xMAorICAgIHBtYWRkd2QgICAgICAgICBtNiwgbTEwCisgICAgcG1hZGR3ZCAgICAgICAgIG0zLCBtMTAKKyAgICBwbWFkZHdkICAgICAgICAgbTcsIG0xMAorICAgIHBhZGRkICAgICAgICAgICBtMiwgbTQKKyAgICBwYWRkZCAgICAgICAgICAgbTYsIG04CisgICAgcGFkZGQgICAgICAgICAgIG0zLCBtNQorICAgIHBhZGRkICAgICAgICAgICBtNywgbTkKKyAgICBwc3JhZCAgICAgICAgICAgbTIsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTYsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTMsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTcsICUlc2gKKyAgICBwYWNrc3NkdyAgICAgICAgbTIsIG02CisgICAgcGFja3NzZHcgICAgICAgIG0zLCBtNworCisgICAgbGVhICAgICAgICAgICB0bXBxLCBbeW9xK3lvc3FdCislaWYgJTIgPT0gOAorICAgIHBhY2t1c3diICAgICAgICBtMiwgbTMKKyAgICBtb3Z1ICAgW3RtcHEreHEqMl0sIG0yCislZWxzZSA7ICUyICE9IDgKKyAgICBDTElQVyAgICAgICAgICAgbTIsIG0xMSwgW3B3XyAlKyAlJW1heHZhbF0KKyAgICBDTElQVyAgICAgICAgICAgbTMsIG0xMSwgW3B3XyAlKyAlJW1heHZhbF0KKyAgICBtb3Z1ICAgW3RtcHEreHEqNF0sIG0yCisgICAgbW92dSBbdG1wcSt4cSo0K21tc2l6ZV0sIG0zCislZW5kaWYgOyAlMiA9PS8hPSA4CislZW5kaWYgOyAlNCA9PSAxCisKKyAgICBwdW5wY2tod2QgICAgICAgbTYsIG0wLCBtMTUKKyAgICBwdW5wY2tsd2QgICAgICAgbTAsIG0xNQorICAgIHB1bnBja2h3ZCAgICAgICBtNywgbTEsIG0xNQorICAgIHB1bnBja2x3ZCAgICAgICBtMSwgbTE1CisgICAgcG1hZGR3ZCAgICAgICAgIG0wLCBtMTAKKyAgICBwbWFkZHdkICAgICAgICAgbTYsIG0xMAorICAgIHBtYWRkd2QgICAgICAgICBtMSwgbTEwCisgICAgcG1hZGR3ZCAgICAgICAgIG03LCBtMTAKKyAgICBwYWRkZCAgICAgICAgICAgbTAsIG00CisgICAgcGFkZGQgICAgICAgICAgIG02LCBtOAorICAgIHBhZGRkICAgICAgICAgICBtMSwgbTUKKyAgICBwYWRkZCAgICAgICAgICAgbTcsIG05CisgICAgcHNyYWQgICAgICAgICAgIG0wLCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG02LCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG0xLCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG03LCAlJXNoCisgICAgcGFja3NzZHcgICAgICAgIG0wLCBtNgorICAgIHBhY2tzc2R3ICAgICAgICBtMSwgbTcKKworJWlmICUyID09IDgKKyAgICBwYWNrdXN3YiAgICAgICAgbTAsIG0xCisgICAgbW92dSAgICBbeW9xK3hxKigxPDwlMyldLCBtMAorJWVsc2UgOyAlMiAhPSA4CisgICAgQ0xJUFcgICAgICAgICAgIG0wLCBtMTEsIFtwd18gJSsgJSVtYXh2YWxdCisgICAgQ0xJUFcgICAgICAgICAgIG0xLCBtMTEsIFtwd18gJSsgJSVtYXh2YWxdCisgICAgbW92dSAgW3lvcSt4cSooMjw8JTMpXSwgbTAKKyAgICBtb3Z1IFt5b3EreHEqKDI8PCUzKSttbXNpemVdLCBtMQorJWVuZGlmIDsgJTIgPT0vIT0gOAorCisgICAgYWRkICAgICAgICAgICAgIHhxLCBtbXNpemUgPj4gJTMKKyAgICBjbXAgICAgICAgICAgICAgeGQsIGR3b3JkIFtyc3ArMyptbXNpemUrMF0KKyAgICBqbCAubG9vcF9oCisKKyVpZiAlNCA9PSAxCisgICAgbGVhICAgICAgICAgICAgeWlxLCBbeWlxK3lpc3EqMl0KKyAgICBsZWEgICAgICAgICAgICB5b3EsIFt5b3EreW9zcSoyXQorJWVsc2UgOyAlNCAhPSAxCisgICAgYWRkICAgICAgICAgICAgeWlxLCB5aXNxCisgICAgYWRkICAgICAgICAgICAgeW9xLCB5b3NxCislZW5kaWYgOyAlNCA9PS8hPSAxCisgICAgYWRkICAgICAgICAgICAgdWlxLCB1aXNxCisgICAgYWRkICAgICAgICAgICAgdmlxLCB2aXNxCisgICAgYWRkICAgICAgICAgICAgdW9xLCB1b3NxCisgICAgYWRkICAgICAgICAgICAgdm9xLCB2b3NxCisgICAgZGVjIGR3b3JkIFtyc3ArMyptbXNpemUrNF0KKyAgICBqZyAubG9vcF92CisKKyAgICBSRVQKKyVlbmRtYWNybworCislbWFjcm8gWVVWMllVVl9GTlMgMiA7IHNzX3csIHNzX2gKK1lVVjJZVVZfRk4gIDgsICA4LCAlMSwgJTIKK1lVVjJZVVZfRk4gMTAsICA4LCAlMSwgJTIKK1lVVjJZVVZfRk4gMTIsICA4LCAlMSwgJTIKK1lVVjJZVVZfRk4gIDgsIDEwLCAlMSwgJTIKK1lVVjJZVVZfRk4gMTAsIDEwLCAlMSwgJTIKK1lVVjJZVVZfRk4gMTIsIDEwLCAlMSwgJTIKK1lVVjJZVVZfRk4gIDgsIDEyLCAlMSwgJTIKK1lVVjJZVVZfRk4gMTAsIDEyLCAlMSwgJTIKK1lVVjJZVVZfRk4gMTIsIDEyLCAlMSwgJTIKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitZVVYyWVVWX0ZOUyAwLCAwCitZVVYyWVVWX0ZOUyAxLCAwCitZVVYyWVVWX0ZOUyAxLCAxCisKKzsgdm9pZCBmZl95dXYycmdiXzQyMHA4X3NzZTIoaW50MTZfdCAqcmdiWzNdLCBwdHJkaWZmX3QgcmdiX3N0cmlkZSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqeXV2WzNdLCBwdHJkaWZmX3QgeXV2X3N0cmlkZVszXSwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBjb25zdCBpbnQxNl90IHl1djJyZ2JfY29lZmZzWzNdWzNdWzhdLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IHl1dl9vZmZzZXRbOF0pCislbWFjcm8gWVVWMlJHQl9GTiAzIDsgZGVwdGgsIGxvZzJfY2hyb21hX3cgKGhvcml6KSwgbG9nMl9jaHJvbWFfaCAodmVydCkKKyVhc3NpZ24gJSVzaCAoJTEgLSAxKQorJWFzc2lnbiAlJXJuZCAoMSA8PCAoJSVzaCAtIDEpKQorJWFzc2lnbiAlJXV2b2ZmICgxIDw8ICglMSAtIDEpKQorJWlmICUyID09IDAKKyVhc3NpZ24gJSVzcyA0NDQKKyVlbGlmICUzID09IDAKKyVhc3NpZ24gJSVzcyA0MjIKKyVlbHNlIDsgJTMgPT0gMQorJWFzc2lnbiAlJXNzIDQyMAorJWVuZGlmIDsgJTIvJTMKKworY2dsb2JhbCB5dXYycmdiXyAlKyAlJXNzICUrIHAlMSwgOCwgMTQsIDE2LCAwIC0gOCAqIG1tc2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2IsIHJnYnMsIHl1diwgeXV2cywgd3csIGgsIGMsIHlvZmYKKyVpZiAlMiA9PSAxCisgICAgaW5jICAgICAgICAgICAgd3dkCisgICAgc2FyICAgICAgICAgICAgd3dkLCAxCislZW5kaWYgOyAlMiA9PSAxCislaWYgJTMgPT0gMQorICAgIGluYyAgICAgICAgICAgICBoZAorICAgIHNhciAgICAgICAgICAgICBoZCwgMQorJWVuZGlmIDsgJTMgPT0gMQorICAgIHB4b3IgICAgICAgICAgIG0xMSwgbTExCisgICAgbW92YSAgICAgICAgICAgbTE1LCBbeW9mZnFdICAgICAgICAgICAgICAgICA7IHlvZmYKKyAgICBtb3ZoICAgICAgICAgICBtMTQsIFtjcSsgIDBdICAgICAgICAgICAgICAgIDsgY3kKKyAgICBtb3ZoICAgICAgICAgICBtMTAsIFtjcSsgMzJdICAgICAgICAgICAgICAgIDsgY3J2CisgICAgbW92aCAgICAgICAgICAgbTEzLCBbY3ErMTEyXSAgICAgICAgICAgICAgICA7IGNidQorICAgIG1vdmggICAgICAgICAgIG0xMiwgW2NxKyA2NF0gICAgICAgICAgICAgICAgOyBjZ3UKKyAgICBtb3ZoICAgICAgICAgICAgbTksIFtjcSsgODBdICAgICAgICAgICAgICAgIDsgY2d2CisgICAgcHVucGNrbHdkICAgICAgbTE0LCBbcHdfICUrICUlcm5kXSAgICAgICAgICA7IGN5LCBybmQKKyAgICBwdW5wY2tsd2QgICAgICBtMTMsIG0xMSAgICAgICAgICAgICAgICAgICAgIDsgY2J1LCAwCisgICAgcHVucGNrbHdkICAgICAgbTExLCBtMTAgICAgICAgICAgICAgICAgICAgICA7IDAsIGNydgorICAgIHB1bnBja2x3ZCAgICAgIG0xMiwgbTkgICAgICAgICAgICAgICAgICAgICAgOyBjZ3UsIGNndgorICAgIG1vdmEgW3JzcCswKm1tc2l6ZV0sIG0xMQorICAgIG1vdmEgW3JzcCsxKm1tc2l6ZV0sIG0xMgorICAgIG1vdmEgW3JzcCsyKm1tc2l6ZV0sIG0xMworICAgIG1vdmEgW3JzcCszKm1tc2l6ZV0sIG0xNAorICAgIHB4b3IgICAgICAgICAgIG0xNCwgbTE0CisKKyAgICBERUZJTkVfQVJHUyByLCByZ2JzLCB5LCB5cywgd3csIGgsIGcsIGIsIHUsIHYsIHVzLCB2cywgeCwgdG1wCisKKyAgICBtb3YgICAgICAgICAgICAgZ3EsIFtycSsxKmdwcnNpemVdCisgICAgbW92ICAgICAgICAgICAgIGJxLCBbcnErMipncHJzaXplXQorICAgIG1vdiAgICAgICAgICAgICBycSwgW3JxKzAqZ3Byc2l6ZV0KKyAgICBtb3YgICAgICAgICAgICAgdXEsIFt5cSsxKmdwcnNpemVdCisgICAgbW92ICAgICAgICAgICAgIHZxLCBbeXErMipncHJzaXplXQorICAgIG1vdiAgICAgICAgICAgICB5cSwgW3lxKzAqZ3Byc2l6ZV0KKyAgICBtb3YgICAgICAgICAgICB1c3EsIFt5c3ErMSpncHJzaXplXQorICAgIG1vdiAgICAgICAgICAgIHZzcSwgW3lzcSsyKmdwcnNpemVdCisgICAgbW92ICAgICAgICAgICAgeXNxLCBbeXNxKzAqZ3Byc2l6ZV0KKworLmxvb3BfdjoKKyAgICB4b3IgICAgICAgICAgICAgeHEsIHhxCisKKy5sb29wX2g6CislaWYgJTMgPT0gMQorICAgIGxlYSAgICAgICAgICAgdG1wcSwgW3lxK3lzcV0KKyVlbmRpZiA7ICUzID09IDEKKyVpZiAlMSA9PSA4CisgICAgbW92dSAgICAgICAgICAgIG0wLCBbeXEreHEqKDE8PCUyKV0KKyVpZiAlMyA9PSAxCisgICAgbW92dSAgICAgICAgICAgIG0yLCBbdG1wcSt4cSoyXQorJWVuZGlmIDsgJTMgPT0gMQorJWlmICUyID09IDEKKyAgICBtb3ZoICAgICAgICAgICAgbTQsIFt1cSt4cV0KKyAgICBtb3ZoICAgICAgICAgICAgbTUsIFt2cSt4cV0KKyVlbHNlIDsgJTIgIT0gMQorICAgIG1vdnUgICAgICAgICAgICBtNCwgW3VxK3hxXQorICAgIG1vdnUgICAgICAgICAgICBtNSwgW3ZxK3hxXQorJWVuZGlmIDsgJTIgPT0vIT0gMQorICAgIHB1bnBja2hidyAgICAgICBtMSwgbTAsIG0xNAorICAgIHB1bnBja2xidyAgICAgICBtMCwgbTE0CislaWYgJTMgPT0gMQorICAgIHB1bnBja2hidyAgICAgICBtMywgbTIsIG0xNAorICAgIHB1bnBja2xidyAgICAgICBtMiwgbTE0CislZW5kaWYgOyAlMyA9PSAxCislaWYgJTIgPT0gMAorICAgIHB1bnBja2hidyAgICAgICBtMiwgbTQsIG0xNAorICAgIHB1bnBja2hidyAgICAgICBtMywgbTUsIG0xNAorJWVuZGlmIDsgJTIgPT0gMAorICAgIHB1bnBja2xidyAgICAgICBtNCwgbTE0CisgICAgcHVucGNrbGJ3ICAgICAgIG01LCBtMTQKKyVlbHNlIDsgJTEgIT0gOAorICAgIG1vdnUgICAgICAgICAgICBtMCwgW3lxK3hxKigyPDwlMildCisgICAgbW92dSAgICAgICAgICAgIG0xLCBbeXEreHEqKDI8PCUyKSttbXNpemVdCislaWYgJTMgPT0gMQorICAgIG1vdnUgICAgICAgICAgICBtMiwgW3RtcHEreHEqNF0KKyAgICBtb3Z1ICAgICAgICAgICAgbTMsIFt0bXBxK3hxKjQrbW1zaXplXQorJWVuZGlmIDsgJTMgPT0gMQorICAgIG1vdnUgICAgICAgICAgICBtNCwgW3VxK3hxKjJdCisgICAgbW92dSAgICAgICAgICAgIG01LCBbdnEreHEqMl0KKyVpZiAlMiA9PSAwCisgICAgbW92dSAgICAgICAgICAgIG0yLCBbdXEreHEqMittbXNpemVdCisgICAgbW92dSAgICAgICAgICAgIG0zLCBbdnEreHEqMittbXNpemVdCislZW5kaWYgOyAlMiA9PSAwCislZW5kaWYgOyAlMSA9PS8hPSA4CisgICAgcHN1YncgICAgICAgICAgIG0wLCBtMTUKKyAgICBwc3VidyAgICAgICAgICAgbTEsIG0xNQorJWlmICUzID09IDEKKyAgICBwc3VidyAgICAgICAgICAgbTIsIG0xNQorICAgIHBzdWJ3ICAgICAgICAgICBtMywgbTE1CislZW5kaWYgOyAlMyA9PSAxCisgICAgcHN1YncgICAgICAgICAgIG00LCBbcHdfICUrICUldXZvZmZdCisgICAgcHN1YncgICAgICAgICAgIG01LCBbcHdfICUrICUldXZvZmZdCisgICAgU0JVVFRFUkZMWSAgIHdkLCA0LCA1LCA2CislaWYgJTIgPT0gMAorICAgIHBzdWJ3ICAgICAgICAgICBtMiwgW3B3XyAlKyAlJXV2b2ZmXQorICAgIHBzdWJ3ICAgICAgICAgICBtMywgW3B3XyAlKyAlJXV2b2ZmXQorICAgIFNCVVRURVJGTFkgICB3ZCwgMiwgMywgNgorJWVuZGlmIDsgJTIgPT0gMAorCisgICAgOyBjYWxjdWxhdGUgeStybmQgZnVsbC1yZXNvbHV0aW9uIFswLTMsNi05XQorICAgIHB1bnBja2h3ZCAgICAgICBtNiwgbTAsIFtwd18xXSAgICAgICAgICAgICAgOyB5LCAxCisgICAgcHVucGNrbHdkICAgICAgIG0wLCBbcHdfMV0gICAgICAgICAgICAgICAgICA7IHksIDEKKyAgICBwdW5wY2tod2QgICAgICAgbTcsIG0xLCBbcHdfMV0gICAgICAgICAgICAgIDsgeSwgMQorICAgIHB1bnBja2x3ZCAgICAgICBtMSwgW3B3XzFdICAgICAgICAgICAgICAgICAgOyB5LCAxCisgICAgcG1hZGR3ZCAgICAgICAgIG0wLCBbcnNwKzMqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtNiwgW3JzcCszKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTEsIFtyc3ArMyptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgIG03LCBbcnNwKzMqbW1zaXplXQorJWlmICUzID09IDEKKyAgICBwdW5wY2tod2QgICAgICAgbTgsIG0yLCBbcHdfMV0gICAgICAgICAgICAgIDsgeSwgMQorICAgIHB1bnBja2x3ZCAgICAgICBtMiwgW3B3XzFdICAgICAgICAgICAgICAgICAgOyB5LCAxCisgICAgcHVucGNraHdkICAgICAgIG05LCBtMywgW3B3XzFdICAgICAgICAgICAgICA7IHksIDEKKyAgICBwdW5wY2tsd2QgICAgICAgbTMsIFtwd18xXSAgICAgICAgICAgICAgICAgIDsgeSwgMQorICAgIHBtYWRkd2QgICAgICAgICBtMiwgW3JzcCszKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTgsIFtyc3ArMyptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgIG0zLCBbcnNwKzMqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtOSwgW3JzcCszKm1tc2l6ZV0KKyAgICBtb3ZhIFtyc3ArNCptbXNpemVdLCBtMgorICAgIG1vdmEgW3JzcCs1Km1tc2l6ZV0sIG04CisgICAgbW92YSBbcnNwKzYqbW1zaXplXSwgbTMKKyAgICBtb3ZhIFtyc3ArNyptbXNpemVdLCBtOQorJWVuZGlmIDsgJTMgPT0gMQorCisgICAgOyBjYWxjdWxhdGUgciBvZmZzZXRzICh1bi1zdWJzYW1wbGVkLCB0aGVuIGR1cGxpY2F0ZSkKKyAgICBwbWFkZHdkICAgICAgICBtMTAsIG00LCBbcnNwKzAqbW1zaXplXQorJWlmICUyID09IDEKKyAgICBwbWFkZHdkICAgICAgICBtMTIsIG01LCBbcnNwKzAqbW1zaXplXQorICAgIHB1bnBja2hkcSAgICAgIG0xMSwgbTEwLCBtMTAKKyAgICBwdW5wY2tsZHEgICAgICBtMTAsIG0xMAorICAgIHB1bnBja2hkcSAgICAgIG0xMywgbTEyLCBtMTIKKyAgICBwdW5wY2tsZHEgICAgICBtMTIsIG0xMgorJWVsc2UgOyAlMiAhPSAxCisgICAgcG1hZGR3ZCAgICAgICAgbTExLCBtNSwgW3JzcCswKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICBtMTIsIG0yLCBbcnNwKzAqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgIG0xMywgbTMsIFtyc3ArMCptbXNpemVdCislZW5kaWYgOyAlMiA9PS8hPSAxCislaWYgJTMgPT0gMQorICAgIHBhZGRkICAgICAgICAgICBtMiwgbTEwLCBbcnNwKzQqbW1zaXplXQorICAgIHBhZGRkICAgICAgICAgICBtMywgbTExLCBbcnNwKzUqbW1zaXplXQorICAgIHBhZGRkICAgICAgICAgICBtOCwgbTEyLCBbcnNwKzYqbW1zaXplXQorICAgIHBhZGRkICAgICAgICAgICBtOSwgbTEzLCBbcnNwKzcqbW1zaXplXQorJWVuZGlmCisgICAgcGFkZGQgICAgICAgICAgbTEwLCBtMAorICAgIHBhZGRkICAgICAgICAgIG0xMSwgbTYKKyAgICBwYWRkZCAgICAgICAgICBtMTIsIG0xCisgICAgcGFkZGQgICAgICAgICAgbTEzLCBtNworJWlmICUzID09IDEKKyAgICBwc3JhZCAgICAgICAgICAgbTIsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTMsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTgsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTksICUlc2gKKyVlbmRpZiA7ICUzID09IDEKKyAgICBwc3JhZCAgICAgICAgICBtMTAsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTEsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTIsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTMsICUlc2gKKyVpZiAlMyA9PSAxCisgICAgbGVhICAgICAgICAgICB0bXBxLCBbcnErcmdic3EqMl0KKyAgICBwYWNrc3NkdyAgICAgICAgbTIsIG0zCisgICAgcGFja3NzZHcgICAgICAgIG04LCBtOQorICAgIG1vdmEgW3RtcHEreHEqNF0sIG0yCisgICAgbW92YSBbdG1wcSt4cSo0K21tc2l6ZV0sIG04CislZW5kaWYgOyAlMyA9PSAxCisgICAgcGFja3NzZHcgICAgICAgbTEwLCBtMTEKKyAgICBwYWNrc3NkdyAgICAgICBtMTIsIG0xMworICAgIG1vdmEgICBbcnEreHEqKDIgPDwgJTIpXSwgbTEwCisgICAgbW92YSAgIFtycSt4cSooMiA8PCAlMikrbW1zaXplXSwgbTEyCisKKyAgICA7IGNhbGN1bGF0ZSBnIG9mZnNldHMgKHVuLXN1YnNhbXBsZWQsIHRoZW4gZHVwbGljYXRlKQorICAgIHBtYWRkd2QgICAgICAgIG0xMCwgbTQsIFtyc3ArMSptbXNpemVdCislaWYgJTIgPT0gMQorICAgIHBtYWRkd2QgICAgICAgIG0xMiwgbTUsIFtyc3ArMSptbXNpemVdCisgICAgcHVucGNraGRxICAgICAgbTExLCBtMTAsIG0xMAorICAgIHB1bnBja2xkcSAgICAgIG0xMCwgbTEwCisgICAgcHVucGNraGRxICAgICAgbTEzLCBtMTIsIG0xMgorICAgIHB1bnBja2xkcSAgICAgIG0xMiwgbTEyCislZWxzZSA7ICUyICE9IDEKKyAgICBwbWFkZHdkICAgICAgICBtMTEsIG01LCBbcnNwKzEqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgIG0xMiwgbTIsIFtyc3ArMSptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgbTEzLCBtMywgW3JzcCsxKm1tc2l6ZV0KKyVlbmRpZiA7ICUyID09LyE9IDEKKyVpZiAlMyA9PSAxCisgICAgcGFkZGQgICAgICAgICAgIG0yLCBtMTAsIFtyc3ArNCptbXNpemVdCisgICAgcGFkZGQgICAgICAgICAgIG0zLCBtMTEsIFtyc3ArNSptbXNpemVdCisgICAgcGFkZGQgICAgICAgICAgIG04LCBtMTIsIFtyc3ArNiptbXNpemVdCisgICAgcGFkZGQgICAgICAgICAgIG05LCBtMTMsIFtyc3ArNyptbXNpemVdCislZW5kaWYgOyAlMyA9PSAxCisgICAgcGFkZGQgICAgICAgICAgbTEwLCBtMAorICAgIHBhZGRkICAgICAgICAgIG0xMSwgbTYKKyAgICBwYWRkZCAgICAgICAgICBtMTIsIG0xCisgICAgcGFkZGQgICAgICAgICAgbTEzLCBtNworJWlmICUzID09IDEKKyAgICBwc3JhZCAgICAgICAgICAgbTIsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTMsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTgsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTksICUlc2gKKyVlbmRpZiA7ICUzID09IDEKKyAgICBwc3JhZCAgICAgICAgICBtMTAsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTEsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTIsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTMsICUlc2gKKyVpZiAlMyA9PSAxCisgICAgbGVhICAgICAgICAgICB0bXBxLCBbZ3Ercmdic3EqMl0KKyAgICBwYWNrc3NkdyAgICAgICAgbTIsIG0zCisgICAgcGFja3NzZHcgICAgICAgIG04LCBtOQorICAgIG1vdmEgW3RtcHEreHEqNF0sIG0yCisgICAgbW92YSBbdG1wcSt4cSo0K21tc2l6ZV0sIG04CislZW5kaWYgOyAlMyA9PSAxCisgICAgcGFja3NzZHcgICAgICAgbTEwLCBtMTEKKyAgICBwYWNrc3NkdyAgICAgICBtMTIsIG0xMworICAgIG1vdmEgICBbZ3EreHEqKDIgPDwgJTIpXSwgbTEwCisgICAgbW92YSAgIFtncSt4cSooMiA8PCAlMikrbW1zaXplXSwgbTEyCisKKyAgICA7IGNhbGN1bGF0ZSBiIG9mZnNldHMgKHVuLXN1YnNhbXBsZWQsIHRoZW4gZHVwbGljYXRlKQorICAgIHBtYWRkd2QgICAgICAgICBtNCwgW3JzcCsyKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTUsIFtyc3ArMiptbXNpemVdCislaWYgJTIgPT0gMQorICAgIHB1bnBja2hkcSAgICAgICBtMiwgbTQsIG00CisgICAgcHVucGNrbGRxICAgICAgIG00LCBtNAorICAgIHB1bnBja2hkcSAgICAgICBtMywgbTUsIG01CisgICAgcHVucGNrbGRxICAgICAgIG01LCBtNQorJWVsc2UgOyAlMiAhPSAxCisgICAgcG1hZGR3ZCAgICAgICAgIG0yLCBbcnNwKzIqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtMywgW3JzcCsyKm1tc2l6ZV0KKyAgICBTV0FQICAgICAgICAgICAgIDIsIDUKKyVlbmRpZiA7ICUyID09LyE9IDEKKyAgICBwYWRkZCAgICAgICAgICAgbTAsIG00CisgICAgcGFkZGQgICAgICAgICAgIG02LCBtMgorICAgIHBhZGRkICAgICAgICAgICBtMSwgbTUKKyAgICBwYWRkZCAgICAgICAgICAgbTcsIG0zCislaWYgJTMgPT0gMQorICAgIHBhZGRkICAgICAgICAgICBtNCwgW3JzcCs0Km1tc2l6ZV0KKyAgICBwYWRkZCAgICAgICAgICAgbTIsIFtyc3ArNSptbXNpemVdCisgICAgcGFkZGQgICAgICAgICAgIG01LCBbcnNwKzYqbW1zaXplXQorICAgIHBhZGRkICAgICAgICAgICBtMywgW3JzcCs3Km1tc2l6ZV0KKyVlbmRpZiA7ICUzID09IDEKKyAgICBwc3JhZCAgICAgICAgICAgbTAsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTYsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTEsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTcsICUlc2gKKyVpZiAlMyA9PSAxCisgICAgcHNyYWQgICAgICAgICAgIG00LCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG0yLCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG01LCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG0zLCAlJXNoCislZW5kaWYgOyAlMyA9PSAxCisgICAgcGFja3NzZHcgICAgICAgIG0wLCBtNgorICAgIHBhY2tzc2R3ICAgICAgICBtMSwgbTcKKyAgICBtb3Z1ICAgW2JxK3hxKigyIDw8ICUyKV0sIG0wCisgICAgbW92dSAgIFticSt4cSooMiA8PCAlMikrbW1zaXplXSwgbTEKKyVpZiAlMyA9PSAxCisgICAgbGVhICAgICAgICAgICB0bXBxLCBbYnErcmdic3EqMl0KKyAgICBwYWNrc3NkdyAgICAgICAgbTQsIG0yCisgICAgcGFja3NzZHcgICAgICAgIG01LCBtMworICAgIG1vdnUgW3RtcHEreHEqNF0sIG00CisgICAgbW92dSBbdG1wcSt4cSo0K21tc2l6ZV0sIG01CislZW5kaWYgOyAlMyA9PSAxCisKKyAgICBhZGQgICAgICAgICAgICAgeGQsIG1tc2l6ZSA+PiAlMgorICAgIGNtcCAgICAgICAgICAgICB4ZCwgd3dkCisgICAgamwgLmxvb3BfaAorCisgICAgbGVhICAgICAgICAgICAgIHJxLCBbcnErcmdic3EqKDIgPDwgJTMpXQorICAgIGxlYSAgICAgICAgICAgICBncSwgW2dxK3JnYnNxKigyIDw8ICUzKV0KKyAgICBsZWEgICAgICAgICAgICAgYnEsIFticStyZ2JzcSooMiA8PCAlMyldCislaWYgJTMgPT0gMQorICAgIGxlYSAgICAgICAgICAgICB5cSwgW3lxK3lzcSoyXQorJWVsc2UgOyAlMyAhPSAwCisgICAgYWRkICAgICAgICAgICAgIHlxLCB5c3EKKyVlbmRpZiA7ICUzID09LyE9IDEKKyAgICBhZGQgICAgICAgICAgICAgdXEsIHVzcQorICAgIGFkZCAgICAgICAgICAgICB2cSwgdnNxCisgICAgZGVjICAgICAgICAgICAgIGhkCisgICAgamcgLmxvb3BfdgorCisgICAgUkVUCislZW5kbWFjcm8KKworJW1hY3JvIFlVVjJSR0JfRk5TIDIKK1lVVjJSR0JfRk4gIDgsICUxLCAlMgorWVVWMlJHQl9GTiAxMCwgJTEsICUyCitZVVYyUkdCX0ZOIDEyLCAlMSwgJTIKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2UyCitZVVYyUkdCX0ZOUyAwLCAwCitZVVYyUkdCX0ZOUyAxLCAwCitZVVYyUkdCX0ZOUyAxLCAxCisKKyVtYWNybyBSR0IyWVVWX0ZOIDMgOyBkZXB0aCwgbG9nMl9jaHJvbWFfdyAoaG9yaXopLCBsb2cyX2Nocm9tYV9oICh2ZXJ0KQorJWFzc2lnbiAlJXNoIDI5IC0gJTEKKyVhc3NpZ24gJSVybmQgKDEgPDwgKCUlc2ggLSAxNSkpCislYXNzaWduICUldXZybmQgKCgxMjggPDwgKCUxIC0gOCkpIDw8ICglJXNoIC0gMTQpKQorJWlmICUxICE9IDgKKyVhc3NpZ24gJSVtYXh2YWwgKCgxIDw8ICUxKSAtIDEpCislZW5kaWYgOyAlMSAhPSA4CislaWYgJTIgPT0gMAorJWFzc2lnbiAlJXNzIDQ0NAorJWVsaWYgJTMgPT0gMAorJWFzc2lnbiAlJXNzIDQyMgorJWVsc2UgOyAlMyA9PSAxCislYXNzaWduICUlc3MgNDIwCislZW5kaWYgOyAlMi8lMworCitjZ2xvYmFsIHJnYjJ5dXZfICUrICUlc3MgJSsgcCUxLCA4LCAxNCwgMTYsIDAgLSA2ICogbW1zaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXYsIHl1dnMsIHJnYiwgcmdicywgd3csIGgsIGMsIG9mZgorJWlmICUyID09IDEKKyAgICBpbmMgICAgICAgICAgICB3d2QKKyAgICBzYXIgICAgICAgICAgICB3d2QsIDEKKyVlbmRpZiA7ICUyID09IDEKKyVpZiAlMyA9PSAxCisgICAgaW5jICAgICAgICAgICAgIGhkCisgICAgc2FyICAgICAgICAgICAgIGhkLCAxCislZW5kaWYgOyAlMyA9PSAxCisKKyAgICA7IHByZXBhcmUgY29lZmZzCisgICAgbW92aCAgICAgICAgICAgIG04LCBbb2ZmcV0KKyAgICBtb3ZoICAgICAgICAgICAgbTksIFtwd18gJSsgJSV1dnJuZF0KKyAgICBwc2xsdyAgICAgICAgICAgbTgsICUlc2ggLSAxNAorICAgIHBhZGR3ICAgICAgICAgICBtOSwgW3B3XyAlKyAlJXJuZF0KKyAgICBwYWRkdyAgICAgICAgICAgbTgsIFtwd18gJSsgJSVybmRdCisgICAgbW92aCAgICAgICAgICAgIG0wLCBbY3ErICAwXQorICAgIG1vdmggICAgICAgICAgICBtMSwgW2NxKyAxNl0KKyAgICBtb3ZoICAgICAgICAgICAgbTIsIFtjcSsgMzJdCisgICAgbW92aCAgICAgICAgICAgIG0zLCBbY3ErIDQ4XQorICAgIG1vdmggICAgICAgICAgICBtNCwgW2NxKyA2NF0KKyAgICBtb3ZoICAgICAgICAgICAgbTUsIFtjcSsgODBdCisgICAgbW92aCAgICAgICAgICAgIG02LCBbY3ErMTEyXQorICAgIG1vdmggICAgICAgICAgICBtNywgW2NxKzEyOF0KKyAgICBwdW5wY2tsd2QgICAgICAgbTAsIG0xCisgICAgcHVucGNrbHdkICAgICAgIG0yLCBtOAorICAgIHB1bnBja2x3ZCAgICAgICBtMywgbTQKKyAgICBwdW5wY2tsd2QgICAgICAgbTQsIG01LCBtOQorICAgIHB1bnBja2x3ZCAgICAgICBtNSwgbTYKKyAgICBwdW5wY2tsd2QgICAgICAgbTcsIG05CisKKyAgICBtb3ZhIFtyc3ArMCptbXNpemVdLCBtMCAgICAgICAgICAgICAgICAgOyBjcnksIGNneQorICAgIG1vdmEgW3JzcCsxKm1tc2l6ZV0sIG0yICAgICAgICAgICAgICAgICA7IGNieSwgb2ZmICsgcm5kCisgICAgbW92YSBbcnNwKzIqbW1zaXplXSwgbTMgICAgICAgICAgICAgICAgIDsgY3J1LCBjZ3UKKyAgICBtb3ZhIFtyc3ArMyptbXNpemVdLCBtNCAgICAgICAgICAgICAgICAgOyBjYnVydiwgdXZvZmYgKyBybmQKKyAgICBtb3ZhIFtyc3ArNCptbXNpemVdLCBtNSAgICAgICAgICAgICAgICAgOyBjYnVydiwgY2d2CisgICAgbW92YSBbcnNwKzUqbW1zaXplXSwgbTcgICAgICAgICAgICAgICAgIDsgY2J2LCB1dm9mZiArIHJuZAorCisKKyAgICBERUZJTkVfQVJHUyB5LCB5cywgciwgcmdicywgd3csIGgsIHUsIHYsIHVzLCB2cywgZywgYiwgdG1wLCB4CisgICAgbW92ICAgICAgICAgICAgIGdxLCBbcnErZ3Byc2l6ZSoxXQorICAgIG1vdiAgICAgICAgICAgICBicSwgW3JxK2dwcnNpemUqMl0KKyAgICBtb3YgICAgICAgICAgICAgcnEsIFtycStncHJzaXplKjBdCisgICAgbW92ICAgICAgICAgICAgIHVxLCBbeXErZ3Byc2l6ZSoxXQorICAgIG1vdiAgICAgICAgICAgICB2cSwgW3lxK2dwcnNpemUqMl0KKyAgICBtb3YgICAgICAgICAgICAgeXEsIFt5cStncHJzaXplKjBdCisgICAgbW92ICAgICAgICAgICAgdXNxLCBbeXNxK2dwcnNpemUqMV0KKyAgICBtb3YgICAgICAgICAgICB2c3EsIFt5c3ErZ3Byc2l6ZSoyXQorICAgIG1vdiAgICAgICAgICAgIHlzcSwgW3lzcStncHJzaXplKjBdCisKKyAgICBweG9yICAgICAgICAgICBtMTUsIG0xNQorLmxvb3BfdjoKKyAgICB4b3IgICAgICAgICAgICAgeGQsIHhkCisKKy5sb29wX2g6CisgICAgOyB0b3AgbGluZSB5CisgICAgbW92YSAgICAgICAgICAgIG0wLCBbcnEreHEqKDI8PCUyKV0KKyAgICBtb3ZhICAgICAgICAgICAgbTMsIFtycSt4cSooMjw8JTIpK21tc2l6ZV0KKyAgICBtb3ZhICAgICAgICAgICAgbTEsIFtncSt4cSooMjw8JTIpXQorICAgIG1vdmEgICAgICAgICAgICBtNCwgW2dxK3hxKigyPDwlMikrbW1zaXplXQorICAgIG1vdmEgICAgICAgICAgICBtMiwgW2JxK3hxKigyPDwlMildCisgICAgbW92YSAgICAgICAgICAgIG01LCBbYnEreHEqKDI8PCUyKSttbXNpemVdCisKKyAgICBwdW5wY2tsd2QgICAgICAgbTYsIG0wLCBtMQorICAgIHB1bnBja2h3ZCAgICAgICBtNywgbTAsIG0xCisgICAgcHVucGNrbHdkICAgICAgIG04LCBtMywgbTQKKyAgICBwdW5wY2tod2QgICAgICAgbTksIG0zLCBtNAorICAgIHB1bnBja2x3ZCAgICAgIG0xMCwgbTIsIFtwd18xNjM4NF0KKyAgICBwdW5wY2tod2QgICAgICBtMTEsIG0yLCBbcHdfMTYzODRdCisgICAgcHVucGNrbHdkICAgICAgbTEyLCBtNSwgW3B3XzE2Mzg0XQorICAgIHB1bnBja2h3ZCAgICAgIG0xMywgbTUsIFtwd18xNjM4NF0KKworICAgIHBtYWRkd2QgICAgICAgICBtNiwgW3JzcCswKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTcsIFtyc3ArMCptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgIG04LCBbcnNwKzAqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtOSwgW3JzcCswKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICBtMTAsIFtyc3ArMSptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgbTExLCBbcnNwKzEqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgIG0xMiwgW3JzcCsxKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICBtMTMsIFtyc3ArMSptbXNpemVdCisgICAgcGFkZGQgICAgICAgICAgIG02LCBtMTAKKyAgICBwYWRkZCAgICAgICAgICAgbTcsIG0xMQorICAgIHBhZGRkICAgICAgICAgICBtOCwgbTEyCisgICAgcGFkZGQgICAgICAgICAgIG05LCBtMTMKKyAgICBwc3JhZCAgICAgICAgICAgbTYsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTcsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTgsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTksICUlc2gKKyAgICBwYWNrc3NkdyAgICAgICAgbTYsIG03CisgICAgcGFja3NzZHcgICAgICAgIG04LCBtOQorJWlmICUxID09IDgKKyAgICBwYWNrdXN3YiAgICAgICAgbTYsIG04CisgICAgbW92dSBbeXEreHEqKDE8PCUyKV0sIG02CislZWxzZQorICAgIENMSVBXICAgICAgICAgICBtNiwgbTE1LCBbcHdfICUrICUlbWF4dmFsXQorICAgIENMSVBXICAgICAgICAgICBtOCwgbTE1LCBbcHdfICUrICUlbWF4dmFsXQorICAgIG1vdnUgW3lxK3hxKigyPDwlMildLCBtNgorICAgIG1vdnUgW3lxK3hxKigyPDwlMikrbW1zaXplXSwgbTgKKyVlbmRpZgorCislaWYgJTIgPT0gMQorICAgIDsgc3Vic2FtcGxpbmcgY2FjaGVkIGRhdGEKKyAgICBwbWFkZHdkICAgICAgICAgbTAsIFtwd18xXQorICAgIHBtYWRkd2QgICAgICAgICBtMSwgW3B3XzFdCisgICAgcG1hZGR3ZCAgICAgICAgIG0yLCBbcHdfMV0KKyAgICBwbWFkZHdkICAgICAgICAgbTMsIFtwd18xXQorICAgIHBtYWRkd2QgICAgICAgICBtNCwgW3B3XzFdCisgICAgcG1hZGR3ZCAgICAgICAgIG01LCBbcHdfMV0KKworJWlmICUzID09IDEKKyAgICA7IGJvdHRvbSBsaW5lIHksIHIvZyBwb3J0aW9uIG9ubHkKKyAgICBsZWEgICAgICAgICAgIHRtcHEsIFtyZ2JzcSt4cSoyXQorICAgIG1vdmEgICAgICAgICAgICBtNiwgW3JxK3RtcHEqMl0KKyAgICBtb3ZhICAgICAgICAgICAgbTksIFtycSt0bXBxKjIrbW1zaXplXQorICAgIG1vdmEgICAgICAgICAgICBtNywgW2dxK3RtcHEqMl0KKyAgICBtb3ZhICAgICAgICAgICBtMTAsIFtncSt0bXBxKjIrbW1zaXplXQorICAgIG1vdmEgICAgICAgICAgICBtOCwgW2JxK3RtcHEqMl0KKyAgICBtb3ZhICAgICAgICAgICBtMTEsIFticSt0bXBxKjIrbW1zaXplXQorCisgICAgcHVucGNrbHdkICAgICAgbTEyLCBtNiwgbTcKKyAgICBwdW5wY2tod2QgICAgICBtMTMsIG02LCBtNworICAgIHB1bnBja2x3ZCAgICAgIG0xNCwgbTksIG0xMAorICAgIHB1bnBja2h3ZCAgICAgIG0xNSwgbTksIG0xMAorCisgICAgOyByZWxlYXNlIHR3byBtb3JlIHJlZ2lzdGVycworICAgIHBtYWRkd2QgICAgICAgICBtNiwgW3B3XzFdCisgICAgcG1hZGR3ZCAgICAgICAgIG03LCBbcHdfMV0KKyAgICBwbWFkZHdkICAgICAgICAgbTksIFtwd18xXQorICAgIHBtYWRkd2QgICAgICAgIG0xMCwgW3B3XzFdCisgICAgcGFkZGQgICAgICAgICAgIG0wLCBtNgorICAgIHBhZGRkICAgICAgICAgICBtMywgbTkKKyAgICBwYWRkZCAgICAgICAgICAgbTEsIG03CisgICAgcGFkZGQgICAgICAgICAgIG00LCBtMTAKKworICAgIDsgYm90dG9tIGxpbmUgeSwgYi9ybmQgcG9ydGlvbiBvbmx5CisgICAgcHVucGNrbHdkICAgICAgIG02LCBtOCwgIFtwd18xNjM4NF0KKyAgICBwdW5wY2tod2QgICAgICAgbTcsIG04LCAgW3B3XzE2Mzg0XQorICAgIHB1bnBja2x3ZCAgICAgICBtOSwgbTExLCBbcHdfMTYzODRdCisgICAgcHVucGNraHdkICAgICAgbTEwLCBtMTEsIFtwd18xNjM4NF0KKworICAgIHBtYWRkd2QgICAgICAgIG0xMiwgW3JzcCswKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICBtMTMsIFtyc3ArMCptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgbTE0LCBbcnNwKzAqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgIG0xNSwgW3JzcCswKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTYsIFtyc3ArMSptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgIG03LCBbcnNwKzEqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtOSwgW3JzcCsxKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICBtMTAsIFtyc3ArMSptbXNpemVdCisgICAgcGFkZGQgICAgICAgICAgbTEyLCBtNgorICAgIHBhZGRkICAgICAgICAgIG0xMywgbTcKKyAgICBwYWRkZCAgICAgICAgICBtMTQsIG05CisgICAgcGFkZGQgICAgICAgICAgbTE1LCBtMTAKKyAgICBwc3JhZCAgICAgICAgICBtMTIsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTMsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTQsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICBtMTUsICUlc2gKKyAgICBwYWNrc3NkdyAgICAgICBtMTIsIG0xMworICAgIHBhY2tzc2R3ICAgICAgIG0xNCwgbTE1CisgICAgbGVhICAgICAgICAgICB0bXBxLCBbeXEreXNxXQorJWlmICUxID09IDgKKyAgICBwYWNrdXN3YiAgICAgICBtMTIsIG0xNAorICAgIG1vdnUgICBbdG1wcSt4cSoyXSwgbTEyCislZWxzZQorICAgIHB4b3IgICAgICAgICAgIG0xNSwgbTE1CisgICAgQ0xJUFcgICAgICAgICAgbTEyLCBtMTUsIFtwd18gJSsgJSVtYXh2YWxdCisgICAgQ0xJUFcgICAgICAgICAgbTE0LCBtMTUsIFtwd18gJSsgJSVtYXh2YWxdCisgICAgbW92dSAgIFt0bXBxK3hxKjRdLCBtMTIKKyAgICBtb3Z1IFt0bXBxK3hxKjQrbW1zaXplXSwgbTE0CislZW5kaWYKKworICAgIDsgY29tcGxldGUgc3Vic2FtcGxpbmcgb2Ygci9nL2IgcGl4ZWxzIGZvciB1L3YKKyAgICBwbWFkZHdkICAgICAgICAgbTgsIFtwd18xXQorICAgIHBtYWRkd2QgICAgICAgIG0xMSwgW3B3XzFdCisgICAgcGFkZGQgICAgICAgICAgIG0yLCBtOAorICAgIHBhZGRkICAgICAgICAgICBtNSwgbTExCisgICAgcGFkZGQgICAgICAgICAgIG0wLCBbcGRfMl0KKyAgICBwYWRkZCAgICAgICAgICAgbTEsIFtwZF8yXQorICAgIHBhZGRkICAgICAgICAgICBtMiwgW3BkXzJdCisgICAgcGFkZGQgICAgICAgICAgIG0zLCBbcGRfMl0KKyAgICBwYWRkZCAgICAgICAgICAgbTQsIFtwZF8yXQorICAgIHBhZGRkICAgICAgICAgICBtNSwgW3BkXzJdCisgICAgcHNyYWQgICAgICAgICAgIG0wLCAyCisgICAgcHNyYWQgICAgICAgICAgIG0xLCAyCisgICAgcHNyYWQgICAgICAgICAgIG0yLCAyCisgICAgcHNyYWQgICAgICAgICAgIG0zLCAyCisgICAgcHNyYWQgICAgICAgICAgIG00LCAyCisgICAgcHNyYWQgICAgICAgICAgIG01LCAyCislZWxzZSA7ICUzICE9IDEKKyAgICBwYWRkZCAgICAgICAgICAgbTAsIFtwZF8xXQorICAgIHBhZGRkICAgICAgICAgICBtMSwgW3BkXzFdCisgICAgcGFkZGQgICAgICAgICAgIG0yLCBbcGRfMV0KKyAgICBwYWRkZCAgICAgICAgICAgbTMsIFtwZF8xXQorICAgIHBhZGRkICAgICAgICAgICBtNCwgW3BkXzFdCisgICAgcGFkZGQgICAgICAgICAgIG01LCBbcGRfMV0KKyAgICBwc3JhZCAgICAgICAgICAgbTAsIDEKKyAgICBwc3JhZCAgICAgICAgICAgbTEsIDEKKyAgICBwc3JhZCAgICAgICAgICAgbTIsIDEKKyAgICBwc3JhZCAgICAgICAgICAgbTMsIDEKKyAgICBwc3JhZCAgICAgICAgICAgbTQsIDEKKyAgICBwc3JhZCAgICAgICAgICAgbTUsIDEKKyVlbmRpZiA7ICUzID09LyE9IDEKKyAgICBwYWNrc3NkdyAgICAgICAgbTAsIG0zCisgICAgcGFja3NzZHcgICAgICAgIG0xLCBtNAorICAgIHBhY2tzc2R3ICAgICAgICBtMiwgbTUKKyVlbmRpZiA7ICUyID09IDEKKworICAgIDsgY29udmVydCB1L3YgcGl4ZWxzCisgICAgU0JVVFRFUkZMWSAgIHdkLCAwLCAxLCA2CisgICAgcHVucGNraHdkICAgICAgIG02LCBtMiwgW3B3XzE2Mzg0XQorICAgIHB1bnBja2x3ZCAgICAgICBtMiwgW3B3XzE2Mzg0XQorCisgICAgcG1hZGR3ZCAgICAgICAgIG03LCBtMCwgW3JzcCsyKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTgsIG0xLCBbcnNwKzIqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtOSwgbTIsIFtyc3ArMyptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgbTEwLCBtNiwgW3JzcCszKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTAsIFtyc3ArNCptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgIG0xLCBbcnNwKzQqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtMiwgW3JzcCs1Km1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTYsIFtyc3ArNSptbXNpemVdCisgICAgcGFkZGQgICAgICAgICAgIG03LCBtOQorICAgIHBhZGRkICAgICAgICAgICBtOCwgbTEwCisgICAgcGFkZGQgICAgICAgICAgIG0wLCBtMgorICAgIHBhZGRkICAgICAgICAgICBtMSwgbTYKKyAgICBwc3JhZCAgICAgICAgICAgbTcsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTgsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTAsICUlc2gKKyAgICBwc3JhZCAgICAgICAgICAgbTEsICUlc2gKKyAgICBwYWNrc3NkdyAgICAgICAgbTcsIG04CisgICAgcGFja3NzZHcgICAgICAgIG0wLCBtMQorJWlmICUyID09IDEKKyVpZiAlMSA9PSA4CisgICAgcGFja3Vzd2IgICAgICAgIG03LCBtMAorICAgIG1vdmggICAgICAgW3VxK3hxXSwgbTcKKyAgICBtb3ZocHMgICAgIFt2cSt4cV0sIG03CislZWxzZQorICAgIENMSVBXICAgICAgICAgICBtNywgbTE1LCBbcHdfICUrICUlbWF4dmFsXQorICAgIENMSVBXICAgICAgICAgICBtMCwgbTE1LCBbcHdfICUrICUlbWF4dmFsXQorICAgIG1vdnUgICAgIFt1cSt4cSoyXSwgbTcKKyAgICBtb3Z1ICAgICBbdnEreHEqMl0sIG0wCislZW5kaWYKKyVlbHNlIDsgJTIgIT0gMQorICAgIDsgc2Vjb25kIHNldCBvZiB1L3YgcGl4ZWxzCisgICAgU0JVVFRFUkZMWSAgIHdkLCAzLCA0LCA2CisgICAgcHVucGNraHdkICAgICAgIG02LCBtNSwgW3B3XzE2Mzg0XQorICAgIHB1bnBja2x3ZCAgICAgICBtNSwgW3B3XzE2Mzg0XQorCisgICAgcG1hZGR3ZCAgICAgICAgIG04LCBtMywgW3JzcCsyKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTksIG00LCBbcnNwKzIqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgIG0xMCwgbTUsIFtyc3ArMyptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgbTExLCBtNiwgW3JzcCszKm1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTMsIFtyc3ArNCptbXNpemVdCisgICAgcG1hZGR3ZCAgICAgICAgIG00LCBbcnNwKzQqbW1zaXplXQorICAgIHBtYWRkd2QgICAgICAgICBtNSwgW3JzcCs1Km1tc2l6ZV0KKyAgICBwbWFkZHdkICAgICAgICAgbTYsIFtyc3ArNSptbXNpemVdCisgICAgcGFkZGQgICAgICAgICAgIG04LCBtMTAKKyAgICBwYWRkZCAgICAgICAgICAgbTksIG0xMQorICAgIHBhZGRkICAgICAgICAgICBtMywgbTUKKyAgICBwYWRkZCAgICAgICAgICAgbTQsIG02CisgICAgcHNyYWQgICAgICAgICAgIG04LCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG05LCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG0zLCAlJXNoCisgICAgcHNyYWQgICAgICAgICAgIG00LCAlJXNoCisgICAgcGFja3NzZHcgICAgICAgIG04LCBtOQorICAgIHBhY2tzc2R3ICAgICAgICBtMywgbTQKKworJWlmICUxID09IDgKKyAgICBwYWNrdXN3YiAgICAgICAgbTcsIG04CisgICAgcGFja3Vzd2IgICAgICAgIG0wLCBtMworICAgIG1vdnUgICAgICAgW3VxK3hxXSwgbTcKKyAgICBtb3Z1ICAgICAgIFt2cSt4cV0sIG0wCislZWxzZQorICAgIENMSVBXICAgICAgICAgICBtNywgbTE1LCBbcHdfICUrICUlbWF4dmFsXQorICAgIENMSVBXICAgICAgICAgICBtMCwgbTE1LCBbcHdfICUrICUlbWF4dmFsXQorICAgIENMSVBXICAgICAgICAgICBtOCwgbTE1LCBbcHdfICUrICUlbWF4dmFsXQorICAgIENMSVBXICAgICAgICAgICBtMywgbTE1LCBbcHdfICUrICUlbWF4dmFsXQorICAgIG1vdnUgICAgIFt1cSt4cSoyXSwgbTcKKyAgICBtb3Z1IFt1cSt4cSoyK21tc2l6ZV0sIG04CisgICAgbW92dSAgICAgW3ZxK3hxKjJdLCBtMAorICAgIG1vdnUgW3ZxK3hxKjIrbW1zaXplXSwgbTMKKyVlbmRpZgorJWVuZGlmIDsgJTIgPT0vIT0gMQorCisgICAgYWRkICAgICAgICAgICAgIHhxLCBtbXNpemUgPj4gJTIKKyAgICBjbXAgICAgICAgICAgICAgeGQsIHd3ZAorICAgIGpsIC5sb29wX2gKKworJWlmICUzID09IDAKKyAgICBhZGQgICAgICAgICAgICAgeXEsIHlzcQorJWVsc2UgOyAlMyAhPSAwCisgICAgbGVhICAgICAgICAgICAgIHlxLCBbeXEreXNxKjJdCislZW5kaWYgOyAlMyA9PS8hPSAwCisgICAgYWRkICAgICAgICAgICAgIHVxLCB1c3EKKyAgICBhZGQgICAgICAgICAgICAgdnEsIHZzcQorICAgIGxlYSAgICAgICAgICAgICBycSwgW3JxK3JnYnNxKigyPDwlMyldCisgICAgbGVhICAgICAgICAgICAgIGdxLCBbZ3Ercmdic3EqKDI8PCUzKV0KKyAgICBsZWEgICAgICAgICAgICAgYnEsIFticStyZ2JzcSooMjw8JTMpXQorICAgIGRlYyAgICAgICAgICAgICBoZAorICAgIGpnIC5sb29wX3YKKworICAgIFJFVAorJWVuZG1hY3JvCisKKyVtYWNybyBSR0IyWVVWX0ZOUyAyCitSR0IyWVVWX0ZOICA4LCAlMSwgJTIKK1JHQjJZVVZfRk4gMTAsICUxLCAlMgorUkdCMllVVl9GTiAxMiwgJTEsICUyCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NlMgorUkdCMllVVl9GTlMgMCwgMAorUkdCMllVVl9GTlMgMSwgMAorUkdCMllVVl9GTlMgMSwgMQorCis7IHZvaWQgZmZfbXVsdGlwbHkzeDNfc3NlMihpbnQxNl90ICpkYXRhWzNdLCBwdHJkaWZmX3Qgc3RyaWRlLAorOyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBjb25zdCBpbnQxNl90IGNvZWZmWzNdWzNdWzhdKQorSU5JVF9YTU0gc3NlMgorY2dsb2JhbCBtdWx0aXBseTN4MywgNSwgNywgMTYsIGRhdGEsIHN0cmlkZSwgd3csIGgsIGMKKyAgICBtb3ZoICAgICAgICAgICAgbTAsIFtjcSsgIDBdCisgICAgbW92aCAgICAgICAgICAgIG0xLCBbY3ErIDMyXQorICAgIG1vdmggICAgICAgICAgICBtMiwgW2NxKyA0OF0KKyAgICBtb3ZoICAgICAgICAgICAgbTMsIFtjcSsgODBdCisgICAgbW92aCAgICAgICAgICAgIG00LCBbY3ErIDk2XQorICAgIG1vdmggICAgICAgICAgICBtNSwgW2NxKzEyOF0KKyAgICBwdW5wY2tsd2QgICAgICAgbTAsIFtjcSsgMTZdCisgICAgcHVucGNrbHdkICAgICAgIG0xLCBbcHdfODE5Ml0KKyAgICBwdW5wY2tsd2QgICAgICAgbTIsIFtjcSsgNjRdCisgICAgcHVucGNrbHdkICAgICAgIG0zLCBbcHdfODE5Ml0KKyAgICBwdW5wY2tsd2QgICAgICAgbTQsIFtjcSsxMTJdCisgICAgcHVucGNrbHdkICAgICAgIG01LCBbcHdfODE5Ml0KKworICAgIERFRklORV9BUkdTIGRhdGEwLCBzdHJpZGUsIHd3LCBoLCBkYXRhMSwgZGF0YTIsIHgKKyAgICBzaGwgICAgICAgIHN0cmlkZXEsIDEKKyAgICBtb3YgICAgICAgICBkYXRhMXEsIFtkYXRhMHErZ3Byc2l6ZSoxXQorICAgIG1vdiAgICAgICAgIGRhdGEycSwgW2RhdGEwcStncHJzaXplKjJdCisgICAgbW92ICAgICAgICAgZGF0YTBxLCBbZGF0YTBxK2dwcnNpemUqMF0KKworLmxvb3BfdjoKKyAgICB4b3IgICAgICAgICAgICAgeGQsIHhkCisKKy5sb29wX2g6CisgICAgbW92YSAgICAgICAgICAgIG02LCBbZGF0YTBxK3hxKjJdCisgICAgbW92YSAgICAgICAgICAgIG03LCBbZGF0YTFxK3hxKjJdCisgICAgbW92YSAgICAgICAgICAgIG04LCBbZGF0YTJxK3hxKjJdCisgICAgU0JVVFRFUkZMWSAgIHdkLCA2LCA3LCA5CisgICAgcHVucGNraHdkICAgICAgIG05LCBtOCwgW3B3XzFdCisgICAgcHVucGNrbHdkICAgICAgIG04LCBbcHdfMV0KKworICAgIHBtYWRkd2QgICAgICAgIG0xMCwgbTYsIG0wCisgICAgcG1hZGR3ZCAgICAgICAgbTExLCBtNywgbTAKKyAgICBwbWFkZHdkICAgICAgICBtMTIsIG04LCBtMQorICAgIHBtYWRkd2QgICAgICAgIG0xMywgbTksIG0xCisgICAgcGFkZGQgICAgICAgICAgbTEwLCBtMTIKKyAgICBwYWRkZCAgICAgICAgICBtMTEsIG0xMworICAgIHBzcmFkICAgICAgICAgIG0xMCwgMTQKKyAgICBwc3JhZCAgICAgICAgICBtMTEsIDE0CisKKyAgICBwbWFkZHdkICAgICAgICBtMTIsIG02LCBtMgorICAgIHBtYWRkd2QgICAgICAgIG0xMywgbTcsIG0yCisgICAgcG1hZGR3ZCAgICAgICAgbTE0LCBtOCwgbTMKKyAgICBwbWFkZHdkICAgICAgICBtMTUsIG05LCBtMworICAgIHBhZGRkICAgICAgICAgIG0xMiwgbTE0CisgICAgcGFkZGQgICAgICAgICAgbTEzLCBtMTUKKyAgICBwc3JhZCAgICAgICAgICBtMTIsIDE0CisgICAgcHNyYWQgICAgICAgICAgbTEzLCAxNAorCisgICAgcG1hZGR3ZCAgICAgICAgIG02LCBtNAorICAgIHBtYWRkd2QgICAgICAgICBtNywgbTQKKyAgICBwbWFkZHdkICAgICAgICAgbTgsIG01CisgICAgcG1hZGR3ZCAgICAgICAgIG05LCBtNQorICAgIHBhZGRkICAgICAgICAgICBtNiwgbTgKKyAgICBwYWRkZCAgICAgICAgICAgbTcsIG05CisgICAgcHNyYWQgICAgICAgICAgIG02LCAxNAorICAgIHBzcmFkICAgICAgICAgICBtNywgMTQKKworICAgIHBhY2tzc2R3ICAgICAgIG0xMCwgbTExCisgICAgcGFja3NzZHcgICAgICAgbTEyLCBtMTMKKyAgICBwYWNrc3NkdyAgICAgICAgbTYsIG03CisKKyAgICBtb3ZhIFtkYXRhMHEreHEqMl0sIG0xMAorICAgIG1vdmEgW2RhdGExcSt4cSoyXSwgbTEyCisgICAgbW92YSBbZGF0YTJxK3hxKjJdLCBtNgorCisgICAgYWRkICAgICAgICAgICAgIHhkLCBtbXNpemUgLyAyCisgICAgY21wICAgICAgICAgICAgIHhkLCB3d2QKKyAgICBqbCAubG9vcF9oCisKKyAgICBhZGQgICAgICAgICBkYXRhMHEsIHN0cmlkZXEKKyAgICBhZGQgICAgICAgICBkYXRhMXEsIHN0cmlkZXEKKyAgICBhZGQgICAgICAgICBkYXRhMnEsIHN0cmlkZXEKKyAgICBkZWMgICAgICAgICAgICAgaGQKKyAgICBqZyAubG9vcF92CisKKyAgICBSRVQKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L2NvbG9yc3BhY2Vkc3BfaW5pdC5jIGIvbGliYXZmaWx0ZXIveDg2L2NvbG9yc3BhY2Vkc3BfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDA2YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci94ODYvY29sb3JzcGFjZWRzcF9pbml0LmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUm9uYWxkIFMuIEJ1bHRqZSA8cnNidWx0amVAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKworI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2NvbG9yc3BhY2Vkc3AuaCIKKworI2RlZmluZSBkZWNsX3l1djJ5dXZfZm4odCkgXAordm9pZCBmZl95dXYyeXV2XyMjdCMjX3NzZTIodWludDhfdCAqeXV2X291dFszXSwgY29uc3QgcHRyZGlmZl90IHl1dl9vdXRfc3RyaWRlWzNdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp5dXZfaW5bM10sIGNvbnN0IHB0cmRpZmZfdCB5dXZfaW5fc3RyaWRlWzNdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgeXV2Mnl1dl9jb2VmZnNbM11bM11bOF0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgeXV2X29mZnNldFsyXVs4XSkKKworI2RlZmluZSBkZWNsX3l1djJ5dXZfZm5zKHNzKSBcCitkZWNsX3l1djJ5dXZfZm4oc3MjI3A4dG84KTsgXAorZGVjbF95dXYyeXV2X2ZuKHNzIyNwMTB0bzgpOyBcCitkZWNsX3l1djJ5dXZfZm4oc3MjI3AxMnRvOCk7IFwKK2RlY2xfeXV2Mnl1dl9mbihzcyMjcDh0bzEwKTsgXAorZGVjbF95dXYyeXV2X2ZuKHNzIyNwMTB0bzEwKTsgXAorZGVjbF95dXYyeXV2X2ZuKHNzIyNwMTJ0bzEwKTsgXAorZGVjbF95dXYyeXV2X2ZuKHNzIyNwOHRvMTIpOyBcCitkZWNsX3l1djJ5dXZfZm4oc3MjI3AxMHRvMTIpOyBcCitkZWNsX3l1djJ5dXZfZm4oc3MjI3AxMnRvMTIpCisKK2RlY2xfeXV2Mnl1dl9mbnMoNDIwKTsKK2RlY2xfeXV2Mnl1dl9mbnMoNDIyKTsKK2RlY2xfeXV2Mnl1dl9mbnMoNDQ0KTsKKworI2RlZmluZSBkZWNsX3l1djJyZ2JfZm4odCkgXAordm9pZCBmZl95dXYycmdiXyMjdCMjX3NzZTIoaW50MTZfdCAqcmdiX291dFszXSwgcHRyZGlmZl90IHJnYl9zdHJpZGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnl1dl9pblszXSwgY29uc3QgcHRyZGlmZl90IHl1dl9zdHJpZGVbM10sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgY29uc3QgaW50MTZfdCBjb2VmZlszXVszXVs4XSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCB5dXZfb2Zmc2V0WzhdKQorCisjZGVmaW5lIGRlY2xfeXV2MnJnYl9mbnMoc3MpIFwKK2RlY2xfeXV2MnJnYl9mbihzcyMjcDgpOyBcCitkZWNsX3l1djJyZ2JfZm4oc3MjI3AxMCk7IFwKK2RlY2xfeXV2MnJnYl9mbihzcyMjcDEyKQorCitkZWNsX3l1djJyZ2JfZm5zKDQyMCk7CitkZWNsX3l1djJyZ2JfZm5zKDQyMik7CitkZWNsX3l1djJyZ2JfZm5zKDQ0NCk7CisKKyNkZWZpbmUgZGVjbF9yZ2IyeXV2X2ZuKHQpIFwKK3ZvaWQgZmZfcmdiMnl1dl8jI3QjI19zc2UyKHVpbnQ4X3QgKnl1dl9vdXRbM10sIGNvbnN0IHB0cmRpZmZfdCB5dXZfc3RyaWRlWzNdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpyZ2JfaW5bM10sIHB0cmRpZmZfdCByZ2Jfc3RyaWRlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgY29lZmZbM11bM11bOF0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgeXV2X29mZnNldFs4XSkKKworI2RlZmluZSBkZWNsX3JnYjJ5dXZfZm5zKHNzKSBcCitkZWNsX3JnYjJ5dXZfZm4oc3MjI3A4KTsgXAorZGVjbF9yZ2IyeXV2X2ZuKHNzIyNwMTApOyBcCitkZWNsX3JnYjJ5dXZfZm4oc3MjI3AxMikKKworZGVjbF9yZ2IyeXV2X2Zucyg0MjApOworZGVjbF9yZ2IyeXV2X2Zucyg0MjIpOworZGVjbF9yZ2IyeXV2X2Zucyg0NDQpOworCit2b2lkIGZmX211bHRpcGx5M3gzX3NzZTIoaW50MTZfdCAqZGF0YVszXSwgcHRyZGlmZl90IHN0cmlkZSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgY29lZmZbM11bM11bOF0pOworCit2b2lkIGZmX2NvbG9yc3BhY2Vkc3BfeDg2X2luaXQoQ29sb3JTcGFjZURTUENvbnRleHQgKmRzcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEFSQ0hfWDg2XzY0ICYmIEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworI2RlZmluZSBhc3NpZ25feXV2Mnl1dl9mbnMoc3MpIFwKKyAgICAgICAgZHNwLT55dXYyeXV2W0JQUF84IF1bQlBQXzggXVtTU18jI3NzXSA9IGZmX3l1djJ5dXZfIyNzcyMjcDh0bzhfc3NlMjsgXAorICAgICAgICBkc3AtPnl1djJ5dXZbQlBQXzggXVtCUFBfMTBdW1NTXyMjc3NdID0gZmZfeXV2Mnl1dl8jI3NzIyNwOHRvMTBfc3NlMjsgXAorICAgICAgICBkc3AtPnl1djJ5dXZbQlBQXzggXVtCUFBfMTJdW1NTXyMjc3NdID0gZmZfeXV2Mnl1dl8jI3NzIyNwOHRvMTJfc3NlMjsgXAorICAgICAgICBkc3AtPnl1djJ5dXZbQlBQXzEwXVtCUFBfOCBdW1NTXyMjc3NdID0gZmZfeXV2Mnl1dl8jI3NzIyNwMTB0bzhfc3NlMjsgXAorICAgICAgICBkc3AtPnl1djJ5dXZbQlBQXzEwXVtCUFBfMTBdW1NTXyMjc3NdID0gZmZfeXV2Mnl1dl8jI3NzIyNwMTB0bzEwX3NzZTI7IFwKKyAgICAgICAgZHNwLT55dXYyeXV2W0JQUF8xMF1bQlBQXzEyXVtTU18jI3NzXSA9IGZmX3l1djJ5dXZfIyNzcyMjcDEwdG8xMl9zc2UyOyBcCisgICAgICAgIGRzcC0+eXV2Mnl1dltCUFBfMTJdW0JQUF84IF1bU1NfIyNzc10gPSBmZl95dXYyeXV2XyMjc3MjI3AxMnRvOF9zc2UyOyBcCisgICAgICAgIGRzcC0+eXV2Mnl1dltCUFBfMTJdW0JQUF8xMF1bU1NfIyNzc10gPSBmZl95dXYyeXV2XyMjc3MjI3AxMnRvMTBfc3NlMjsgXAorICAgICAgICBkc3AtPnl1djJ5dXZbQlBQXzEyXVtCUFBfMTJdW1NTXyMjc3NdID0gZmZfeXV2Mnl1dl8jI3NzIyNwMTJ0bzEyX3NzZTIKKworICAgICAgICBhc3NpZ25feXV2Mnl1dl9mbnMoNDIwKTsKKyAgICAgICAgYXNzaWduX3l1djJ5dXZfZm5zKDQyMik7CisgICAgICAgIGFzc2lnbl95dXYyeXV2X2Zucyg0NDQpOworCisjZGVmaW5lIGFzc2lnbl95dXYycmdiX2ZucyhzcykgXAorICAgICAgICBkc3AtPnl1djJyZ2JbQlBQXzggXVtTU18jI3NzXSA9IGZmX3l1djJyZ2JfIyNzcyMjcDhfc3NlMjsgXAorICAgICAgICBkc3AtPnl1djJyZ2JbQlBQXzEwXVtTU18jI3NzXSA9IGZmX3l1djJyZ2JfIyNzcyMjcDEwX3NzZTI7IFwKKyAgICAgICAgZHNwLT55dXYycmdiW0JQUF8xMl1bU1NfIyNzc10gPSBmZl95dXYycmdiXyMjc3MjI3AxMl9zc2UyCisKKyAgICAgICAgYXNzaWduX3l1djJyZ2JfZm5zKDQyMCk7CisgICAgICAgIGFzc2lnbl95dXYycmdiX2Zucyg0MjIpOworICAgICAgICBhc3NpZ25feXV2MnJnYl9mbnMoNDQ0KTsKKworI2RlZmluZSBhc3NpZ25fcmdiMnl1dl9mbnMoc3MpIFwKKyAgICAgICAgZHNwLT5yZ2IyeXV2W0JQUF84IF1bU1NfIyNzc10gPSBmZl9yZ2IyeXV2XyMjc3MjI3A4X3NzZTI7IFwKKyAgICAgICAgZHNwLT5yZ2IyeXV2W0JQUF8xMF1bU1NfIyNzc10gPSBmZl9yZ2IyeXV2XyMjc3MjI3AxMF9zc2UyOyBcCisgICAgICAgIGRzcC0+cmdiMnl1dltCUFBfMTJdW1NTXyMjc3NdID0gZmZfcmdiMnl1dl8jI3NzIyNwMTJfc3NlMgorCisgICAgICAgIGFzc2lnbl9yZ2IyeXV2X2Zucyg0MjApOworICAgICAgICBhc3NpZ25fcmdiMnl1dl9mbnMoNDIyKTsKKyAgICAgICAgYXNzaWduX3JnYjJ5dXZfZm5zKDQ0NCk7CisKKyAgICAgICAgZHNwLT5tdWx0aXBseTN4MyA9IGZmX211bHRpcGx5M3gzX3NzZTI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX2JsZW5kLmFzbSBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ibGVuZC5hc20KaW5kZXggNDc0NzFhYS4uMjUxYmJiNSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L3ZmX2JsZW5kLmFzbQorKysgYi9saWJhdmZpbHRlci94ODYvdmZfYmxlbmQuYXNtCkBAIC0yLDYgKzIsOCBAQAogOyogeDg2LW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIGJsZW5kIGZpbHRlcgogOyoKIDsqIENvcHlyaWdodCAoQykgMjAxNSBQYXVsIEIgTWFob2wKKzsqIENvcHlyaWdodCAoQykgMjAxOCBIZW5yaWsgR3JhbW5lcgorOyogQ29weXJpZ2h0IChDKSAyMDE4IEpva3lvIEltYWdlcwogOyoKIDsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KIDsqCkBAIC0yNCw2ICsyNiw5IEBACiAKIFNFQ1RJT05fUk9EQVRBCiAKK3BzXzI1NTogdGltZXMgNCBkZCAyNTUuMAorcGRfMzI3NjggOiB0aW1lcyA0IGRkIDMyNzY4CitwZF82NTUzNSA6IHRpbWVzIDQgZGQgNjU1MzUKIHB3XzE6ICAgdGltZXMgOCBkdyAxCiBwd18xMjg6IHRpbWVzIDggZHcgMTI4CiBwd18yNTU6IHRpbWVzIDggZHcgMjU1CkBAIC0zMywxMCArMzgsMTMgQEAKIAogU0VDVElPTiAudGV4dAogCi0lbWFjcm8gQkxFTkRfSU5JVCAyCislbWFjcm8gQkxFTkRfSU5JVCAyLTMKICVpZiBBUkNIX1g4Nl82NAogY2dsb2JhbCBibGVuZF8lMSwgNiwgOSwgJTIsIHRvcCwgdG9wX2xpbmVzaXplLCBib3R0b20sIGJvdHRvbV9saW5lc2l6ZSwgZHN0LCBkc3RfbGluZXNpemUsIHdpZHRoLCBlbmQsIHgKICAgICBtb3YgICAgd2lkdGhkLCBkd29yZCB3aWR0aG0KKyAgICAlaWYgJTAgPT0gMzsgaXMgMTYgYml0CisgICAgICAgIGFkZCAgICB3aWR0aHEsIHdpZHRocSA7IGRvZXNuJ3QgY29tcGlsZSBvbiB4ODZfMzIKKyAgICAlZW5kaWYKICVlbHNlCiBjZ2xvYmFsIGJsZW5kXyUxLCA1LCA3LCAlMiwgdG9wLCB0b3BfbGluZXNpemUsIGJvdHRvbSwgYm90dG9tX2xpbmVzaXplLCBkc3QsIGVuZCwgeAogJWRlZmluZSBkc3RfbGluZXNpemVxIHI1bXAKQEAgLTU4LDggKzY2LDggQEAKIFJFUF9SRVQKICVlbmRtYWNybwogCi0lbWFjcm8gQkxFTkRfU0lNUExFIDIKLUJMRU5EX0lOSVQgJTEsIDIKKyVtYWNybyBCTEVORF9TSU1QTEUgMi0zCitCTEVORF9JTklUICUxLCAyLCAlMwogLm5leHRyb3c6CiAgICAgbW92ICAgICAgICB4cSwgd2lkdGhxCiAKQEAgLTczLDM5ICs4MSw0MyBAQAogQkxFTkRfRU5ECiAlZW5kbWFjcm8KIAotSU5JVF9YTU0gc3NlMgotQkxFTkRfU0lNUExFIHhvciwgICAgICB4b3IKLUJMRU5EX1NJTVBMRSBvciwgICAgICAgb3IKLUJMRU5EX1NJTVBMRSBhbmQsICAgICAgYW5kCi1CTEVORF9TSU1QTEUgYWRkaXRpb24sIGFkZHVzYgotQkxFTkRfU0lNUExFIHN1YnRyYWN0LCBzdWJ1c2IKLUJMRU5EX1NJTVBMRSBkYXJrZW4sICAgbWludWIKLUJMRU5EX1NJTVBMRSBsaWdodGVuLCAgbWF4dWIKLQotQkxFTkRfSU5JVCBkaWZmZXJlbmNlMTI4LCA0Ci0gICAgcHhvciAgICAgICBtMiwgbTIKLSAgICBtb3ZhICAgICAgIG0zLCBbcHdfMTI4XQorOyAlMSBuYW1lICwgJTIgc3JjIChiIG9yIHcpLCAlMyBpbnRlciAodyBvciBkKSwgJTQgKDEgaWYgMTZiaXQsIG5vdCBzZXQgaWYgOCBiaXQpCislbWFjcm8gR1JBSU5FWFRSQUNUIDMtNAorQkxFTkRfSU5JVCAlMSwgNiwgJTQKKyAgICBweG9yICAgICAgICAgICBtNCwgbTQKKyVpZiAlMCA9PSA0IDsgMTYgYml0CisgICAgVkJST0FEQ0FTVEkxMjggbTUsIFtwZF8zMjc2OF0KKyVlbHNlCisgICAgVkJST0FEQ0FTVEkxMjggbTUsIFtwd18xMjhdCislZW5kaWYKIC5uZXh0cm93OgogICAgIG1vdiAgICAgICAgeHEsIHdpZHRocQotCiAgICAgLmxvb3A6Ci0gICAgICAgIG1vdmggICAgICAgICAgICBtMCwgW3RvcHEgKyB4cV0KLSAgICAgICAgbW92aCAgICAgICAgICAgIG0xLCBbYm90dG9tcSArIHhxXQotICAgICAgICBwdW5wY2tsYncgICAgICAgbTAsIG0yCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtMSwgbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG0wLCBtMwotICAgICAgICBwc3VidyAgICAgICAgICAgbTAsIG0xCi0gICAgICAgIHBhY2t1c3diICAgICAgICBtMCwgbTAKLSAgICAgICAgbW92aCAgIFtkc3RxICsgeHFdLCBtMAotICAgICAgICBhZGQgICAgICAgICAgICAgeHEsIG1tc2l6ZSAvIDIKKyAgICAgICAgbW92dSAgICAgICAgICAgbTEsIFt0b3BxICsgeHFdCisgICAgICAgIG1vdnUgICAgICAgICAgIG0zLCBbYm90dG9tcSArIHhxXQorCisgICAgICAgIHB1bnBja2wlMiUzICAgICAgbTAsIG0xLCBtNAorICAgICAgICBwdW5wY2toJTIlMyAgICAgIG0xLCBtNAorICAgICAgICBwdW5wY2tsJTIlMyAgICAgIG0yLCBtMywgbTQKKyAgICAgICAgcHVucGNraCUyJTMgICAgICBtMywgbTQKKworICAgICAgICBwYWRkJTMgICAgICAgICAgbTAsIG01CisgICAgICAgIHBhZGQlMyAgICAgICAgICBtMSwgbTUKKyAgICAgICAgcHN1YiUzICAgICAgICAgIG0wLCBtMgorICAgICAgICBwc3ViJTMgICAgICAgICAgbTEsIG0zCisKKyAgICAgICAgcGFja3VzJTMlMiAgICAgICBtMCwgbTEKKworICAgICAgICBtb3ZhICBbZHN0cSArIHhxXSwgbTAKKyAgICAgICAgYWRkICAgICAgICAgICAgeHEsIG1tc2l6ZQogICAgIGpsIC5sb29wCiBCTEVORF9FTkQKKyVlbmRtYWNybwogCiAlbWFjcm8gTVVMVElQTFkgMyA7IGEsIGIsIHB3XzEKICAgICBwbXVsbHcgICAgICAgICAgJTEsICUyICAgICAgICAgICAgICAgOyB4eHh4eHh4eCAgYSAqIGIKICAgICBwYWRkdyAgICAgICAgICAgJTEsICUzCi0gICAgbW92YSAgICAgICAgICAgICUyLCAlMQotICAgIHBzcmx3ICAgICAgICAgICAlMiwgOAorICAgIHBzcmx3ICAgICAgICAgICAlMiwgJTEsIDgKICAgICBwYWRkdyAgICAgICAgICAgJTEsICUyCiAgICAgcHNybHcgICAgICAgICAgICUxLCA4ICAgICAgICAgICAgICAgIDsgMDB4eDAweHggIGEgKiBiIC8gMjU1CiAlZW5kbWFjcm8KQEAgLTExNyw5MiArMTI5LDExOCBAQAogICAgIHB4b3IgICAgICAgICAgICAlMSwgJTQgICAgICAgICAgICAgICA7IDAweHgwMHh4ICAyNTUgLSB4IC8gMjU1CiAlZW5kbWFjcm8KIAotQkxFTkRfSU5JVCBtdWx0aXBseSwgNAotICAgIHB4b3IgICAgICAgbTIsIG0yCi0gICAgbW92YSAgICAgICBtMywgW3B3XzFdCislbWFjcm8gQkxFTkRfTVVMVElQTFkgMAorQkxFTkRfSU5JVCBtdWx0aXBseSwgNgorICAgIHB4b3IgICAgICAgbTQsIG00CisgICAgVkJST0FEQ0FTVEkxMjggICAgICAgbTUsIFtwd18xXQogLm5leHRyb3c6CiAgICAgbW92ICAgICAgICB4cSwgd2lkdGhxCiAKICAgICAubG9vcDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICAgIHdvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgICAgIHwtLXwKLSAgICAgICAgbW92aCAgICAgICAgICAgIG0wLCBbdG9wcSArIHhxXSAgICAgIDsgMDAwMHh4eHgKLSAgICAgICAgbW92aCAgICAgICAgICAgIG0xLCBbYm90dG9tcSArIHhxXQotICAgICAgICBwdW5wY2tsYncgICAgICAgbTAsIG0yICAgICAgICAgICAgICAgOyAwMHh4MDB4eAotICAgICAgICBwdW5wY2tsYncgICAgICAgbTEsIG0yCisgICAgICAgIG1vdnUgICAgICAgICAgIG0xLCBbdG9wcSArIHhxXQorICAgICAgICBtb3Z1ICAgICAgICAgICBtMywgW2JvdHRvbXEgKyB4cV0KKyAgICAgICAgcHVucGNrbGJ3ICAgICAgbTAsIG0xLCBtNAorICAgICAgICBwdW5wY2toYncgICAgICBtMSwgbTQKKyAgICAgICAgcHVucGNrbGJ3ICAgICAgbTIsIG0zLCBtNAorICAgICAgICBwdW5wY2toYncgICAgICBtMywgbTQKIAotICAgICAgICBNVUxUSVBMWSAgICAgICAgbTAsIG0xLCBtMworICAgICAgICBNVUxUSVBMWSAgICAgICAgbTAsIG0yLCBtNQorICAgICAgICBNVUxUSVBMWSAgICAgICAgbTEsIG0zLCBtNQogCi0gICAgICAgIHBhY2t1c3diICAgICAgICBtMCwgbTAgICAgICAgICAgICAgICA7IDAwMDB4eHh4Ci0gICAgICAgIG1vdmggICBbZHN0cSArIHhxXSwgbTAKLSAgICAgICAgYWRkICAgICAgICAgICAgIHhxLCBtbXNpemUgLyAyCi0KKyAgICAgICAgcGFja3Vzd2IgICAgICAgbTAsIG0xCisgICAgICAgIG1vdmEgIFtkc3RxICsgeHFdLCBtMAorICAgICAgICBhZGQgICAgICAgICAgICB4cSwgbW1zaXplCiAgICAgamwgLmxvb3AKIEJMRU5EX0VORAorJWVuZG1hY3JvCiAKLUJMRU5EX0lOSVQgc2NyZWVuLCA1Ci0gICAgcHhvciAgICAgICBtMiwgbTIKLSAgICBtb3ZhICAgICAgIG0zLCBbcHdfMV0KLSAgICBtb3ZhICAgICAgIG00LCBbcHdfMjU1XQorJW1hY3JvIEJMRU5EX1NDUkVFTiAwCitCTEVORF9JTklUIHNjcmVlbiwgNworICAgIHB4b3IgICAgICAgbTQsIG00CisKKyAgICBWQlJPQURDQVNUSTEyOCAgICAgICBtNSwgW3B3XzFdCisgICAgVkJST0FEQ0FTVEkxMjggICAgICAgbTYsIFtwd18yNTVdCiAubmV4dHJvdzoKICAgICBtb3YgICAgICAgIHhxLCB3aWR0aHEKIAogICAgIC5sb29wOgotICAgICAgICBtb3ZoICAgICAgICAgICAgbTAsIFt0b3BxICsgeHFdICAgICAgOyAwMDAweHh4eAotICAgICAgICBtb3ZoICAgICAgICAgICAgbTEsIFtib3R0b21xICsgeHFdCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtMCwgbTIgICAgICAgICAgICAgICA7IDAweHgwMHh4Ci0gICAgICAgIHB1bnBja2xidyAgICAgICBtMSwgbTIKKyAgICAgICAgbW92dSAgICAgICAgICAgbTEsIFt0b3BxICsgeHFdCisgICAgICAgIG1vdnUgICAgICAgICAgIG0zLCBbYm90dG9tcSArIHhxXQorICAgICAgICBwdW5wY2tsYncgICAgICBtMCwgbTEsIG00CisgICAgICAgIHB1bnBja2hidyAgICAgIG0xLCBtNAorICAgICAgICBwdW5wY2tsYncgICAgICBtMiwgbTMsIG00CisgICAgICAgIHB1bnBja2hidyAgICAgIG0zLCBtNAogCi0gICAgICAgIFNDUkVFTiAgICAgICAgICBtMCwgbTEsIG0zLCBtNAorICAgICAgICBTQ1JFRU4gICAgICAgICAgbTAsIG0yLCBtNSwgbTYKKyAgICAgICAgU0NSRUVOICAgICAgICAgIG0xLCBtMywgbTUsIG02CiAKLSAgICAgICAgcGFja3Vzd2IgICAgICAgIG0wLCBtMCAgICAgICAgICAgICAgIDsgMDAwMHh4eHgKLSAgICAgICAgbW92aCAgIFtkc3RxICsgeHFdLCBtMAotICAgICAgICBhZGQgICAgICAgICAgICAgeHEsIG1tc2l6ZSAvIDIKLQorICAgICAgICBwYWNrdXN3YiAgICAgICBtMCwgbTEKKyAgICAgICAgbW92YSAgW2RzdHEgKyB4cV0sIG0wCisgICAgICAgIGFkZCAgICAgICAgICAgIHhxLCBtbXNpemUKICAgICBqbCAubG9vcAogQkxFTkRfRU5ECislZW5kbWFjcm8KIAotQkxFTkRfSU5JVCBhdmVyYWdlLCAzCi0gICAgcHhvciAgICAgICBtMiwgbTIKKzslMSBuYW1lLCAlMiAoYiBvciB3KSwgJTMgKHNldCBpZiAxNiBiaXQpCislbWFjcm8gQVZFUkFHRSAyLTMKK0JMRU5EX0lOSVQgJTEsIDMsICUzCisgICAgcGNtcGVxYiAgICAgICAgbTIsIG0yCisKKy5uZXh0cm93OgorICAgIG1vdiAgICAgICAgeHEsIHdpZHRocQorCisubG9vcDoKKyAgICBtb3Z1ICAgICAgICAgICBtMCwgW3RvcHEgKyB4cV0KKyAgICBtb3Z1ICAgICAgICAgICBtMSwgW2JvdHRvbXEgKyB4cV0KKyAgICBweG9yICAgICAgICAgICBtMCwgbTIKKyAgICBweG9yICAgICAgICAgICBtMSwgbTIKKyAgICBwYXZnJTIgICAgICAgICBtMCwgbTEKKyAgICBweG9yICAgICAgICAgICBtMCwgbTIKKyAgICBtb3ZhICBbZHN0cSArIHhxXSwgbTAKKyAgICBhZGQgICAgICAgICAgICB4cSwgbW1zaXplCisgICAgamwgLmxvb3AKK0JMRU5EX0VORAorJWVuZG1hY3JvCisKKzsgJTEgbmFtZSAsICUyIHNyYyAoYiBvciB3KSwgJTMgaW50ZXIgKHcgb3IgZCksICU0ICgxIGlmIDE2Yml0LCBub3Qgc2V0IGlmIDggYml0KQorJW1hY3JvIEdSQUlOTUVSR0UgMy00CitCTEVORF9JTklUICUxLCA2LCAlNAorICAgIHB4b3IgICAgICAgbTQsIG00CislaWYgJTAgPT0gNCA7IDE2IGJpdAorICAgIFZCUk9BRENBU1RJMTI4ICAgICAgIG01LCBbcGRfMzI3NjhdCislZWxzZQorICAgIFZCUk9BRENBU1RJMTI4ICAgICAgIG01LCBbcHdfMTI4XQorJWVuZGlmCiAubmV4dHJvdzoKICAgICBtb3YgICAgICAgIHhxLCB3aWR0aHEKIAogICAgIC5sb29wOgotICAgICAgICBtb3ZoICAgICAgICAgICAgbTAsIFt0b3BxICsgeHFdCi0gICAgICAgIG1vdmggICAgICAgICAgICBtMSwgW2JvdHRvbXEgKyB4cV0KLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG0wLCBtMgotICAgICAgICBwdW5wY2tsYncgICAgICAgbTEsIG0yCi0gICAgICAgIHBhZGR3ICAgICAgICAgICBtMCwgbTEKLSAgICAgICAgcHNybHcgICAgICAgICAgIG0wLCAxCi0gICAgICAgIHBhY2t1c3diICAgICAgICBtMCwgbTAKLSAgICAgICAgbW92aCAgIFtkc3RxICsgeHFdLCBtMAotICAgICAgICBhZGQgICAgICAgICAgICAgeHEsIG1tc2l6ZSAvIDIKKyAgICAgICAgbW92dSAgICAgICAgICAgbTEsIFt0b3BxICsgeHFdCisgICAgICAgIG1vdnUgICAgICAgICAgIG0zLCBbYm90dG9tcSArIHhxXQorCisgICAgICAgIHB1bnBja2wlMiUzICAgIG0wLCBtMSwgbTQKKyAgICAgICAgcHVucGNraCUyJTMgICAgbTEsIG00CisgICAgICAgIHB1bnBja2wlMiUzICAgIG0yLCBtMywgbTQKKyAgICAgICAgcHVucGNraCUyJTMgICAgbTMsIG00CisKKyAgICAgICAgcGFkZCUzICAgICAgICAgbTAsIG0yCisgICAgICAgIHBhZGQlMyAgICAgICAgIG0xLCBtMworICAgICAgICBwc3ViJTMgICAgICAgICBtMCwgbTUKKyAgICAgICAgcHN1YiUzICAgICAgICAgbTEsIG01CisKKyAgICAgICAgcGFja3VzJTMlMiAgICAgbTAsIG0xCisKKyAgICAgICAgbW92YSAgW2RzdHEgKyB4cV0sIG0wCisgICAgICAgIGFkZCAgICAgICAgICAgIHhxLCBtbXNpemUKICAgICBqbCAubG9vcAogQkxFTkRfRU5ECislZW5kbWFjcm8KIAotQkxFTkRfSU5JVCBhZGRpdGlvbjEyOCwgNAotICAgIHB4b3IgICAgICAgbTIsIG0yCi0gICAgbW92YSAgICAgICBtMywgW3B3XzEyOF0KLS5uZXh0cm93OgotICAgIG1vdiAgICAgICAgeHEsIHdpZHRocQotCi0gICAgLmxvb3A6Ci0gICAgICAgIG1vdmggICAgICAgICAgICBtMCwgW3RvcHEgKyB4cV0KLSAgICAgICAgbW92aCAgICAgICAgICAgIG0xLCBbYm90dG9tcSArIHhxXQotICAgICAgICBwdW5wY2tsYncgICAgICAgbTAsIG0yCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtMSwgbTIKLSAgICAgICAgcGFkZHcgICAgICAgICAgIG0wLCBtMQotICAgICAgICBwc3VidyAgICAgICAgICAgbTAsIG0zCi0gICAgICAgIHBhY2t1c3diICAgICAgICBtMCwgbTAKLSAgICAgICAgbW92aCAgIFtkc3RxICsgeHFdLCBtMAotICAgICAgICBhZGQgICAgICAgICAgICAgeHEsIG1tc2l6ZSAvIDIKLSAgICBqbCAubG9vcAotQkxFTkRfRU5ECi0KKyVtYWNybyBIQVJETUlYIDAKIEJMRU5EX0lOSVQgaGFyZG1peCwgNQotICAgIG1vdmEgICAgICAgbTIsIFtwYl8yNTVdCi0gICAgbW92YSAgICAgICBtMywgW3BiXzEyOF0KLSAgICBtb3ZhICAgICAgIG00LCBbcGJfMTI3XQorICAgIFZCUk9BRENBU1RJMTI4ICAgICAgIG0yLCBbcGJfMjU1XQorICAgIFZCUk9BRENBU1RJMTI4ICAgICAgIG0zLCBbcGJfMTI4XQorICAgIFZCUk9BRENBU1RJMTI4ICAgICAgIG00LCBbcGJfMTI3XQogLm5leHRyb3c6CiAgICAgbW92ICAgICAgICB4cSwgd2lkdGhxCiAKQEAgLTIxNyw5ICsyNTUsNDMgQEAKICAgICAgICAgYWRkICAgICAgICAgICAgIHhxLCBtbXNpemUKICAgICBqbCAubG9vcAogQkxFTkRfRU5ECislZW5kbWFjcm8KIAotQkxFTkRfSU5JVCBwaG9lbml4LCA0Ci0gICAgbW92YSAgICAgICBtMywgW3BiXzI1NV0KKyVtYWNybyBESVZJREUgMAorQkxFTkRfSU5JVCBkaXZpZGUsIDQKKyAgICBweG9yICAgICAgIG0yLCBtMgorICAgIG1vdmEgICAgICAgbTMsIFtwc18yNTVdCisubmV4dHJvdzoKKyAgICBtb3YgICAgICAgIHhxLCB3aWR0aHEKKworICAgIC5sb29wOgorICAgICAgICBtb3ZkICAgICAgICAgICAgbTAsIFt0b3BxICsgeHFdICAgICAgOyAwMDAwMDB4eAorICAgICAgICBtb3ZkICAgICAgICAgICAgbTEsIFtib3R0b21xICsgeHFdCisgICAgICAgIHB1bnBja2xidyAgICAgICBtMCwgbTIgICAgICAgICAgICAgICA7IDAwMDAweDB4CisgICAgICAgIHB1bnBja2xidyAgICAgICBtMSwgbTIKKyAgICAgICAgcHVucGNrbHdkICAgICAgIG0wLCBtMiAgICAgICAgICAgICAgIDsgMDAweDAwMHgKKyAgICAgICAgcHVucGNrbHdkICAgICAgIG0xLCBtMgorCisgICAgICAgIGN2dGRxMnBzICAgICAgICBtMCwgbTAKKyAgICAgICAgY3Z0ZHEycHMgICAgICAgIG0xLCBtMQorICAgICAgICBkaXZwcyAgICAgICAgICAgbTAsIG0xICAgICAgICAgICAgICAgOyBhIC8gYgorICAgICAgICBtdWxwcyAgICAgICAgICAgbTAsIG0zICAgICAgICAgICAgICAgOyBhIC8gYiAqIDI1NQorICAgICAgICBtaW5wcyAgICAgICAgICAgbTAsIG0zCisgICAgICAgIGN2dHRwczJkcSAgICAgICBtMCwgbTAKKworICAgICAgICBwYWNrc3NkdyAgICAgICAgbTAsIG0wICAgICAgICAgICAgICAgOyAwMDAwMHgweAorICAgICAgICBwYWNrdXN3YiAgICAgICAgbTAsIG0wICAgICAgICAgICAgICAgOyAwMDAwMDB4eAorICAgICAgICBtb3ZkICAgW2RzdHEgKyB4cV0sIG0wCisgICAgICAgIGFkZCAgICAgICAgICAgICB4cSwgbW1zaXplIC8gNAorCisgICAgamwgLmxvb3AKK0JMRU5EX0VORAorJWVuZG1hY3JvCisKKyVtYWNybyBQSE9FTklYIDItMworOyAlMSBuYW1lLCAlMiBiIG9yIHcsICUzIChvcHQpIDEgaWYgMTYgYml0CitCTEVORF9JTklUICUxLCA0LCAlMworICAgIFZCUk9BRENBU1RJMTI4ICAgICAgIG0zLCBbcGJfMjU1XQogLm5leHRyb3c6CiAgICAgbW92ICAgICAgICB4cSwgd2lkdGhxCiAKQEAgLTIyNyw2MCArMjk5LDIwMCBAQAogICAgICAgICBtb3Z1ICAgICAgICAgICAgbTAsIFt0b3BxICsgeHFdCiAgICAgICAgIG1vdnUgICAgICAgICAgICBtMSwgW2JvdHRvbXEgKyB4cV0KICAgICAgICAgbW92YSAgICAgICAgICAgIG0yLCBtMAotICAgICAgICBwbWludWIgICAgICAgICAgbTAsIG0xCi0gICAgICAgIHBtYXh1YiAgICAgICAgICBtMSwgbTIKKyAgICAgICAgcG1pbnUlMiAgICAgICAgIG0wLCBtMQorICAgICAgICBwbWF4dSUyICAgICAgICAgbTEsIG0yCiAgICAgICAgIG1vdmEgICAgICAgICAgICBtMiwgbTMKLSAgICAgICAgcHN1YnVzYiAgICAgICAgIG0yLCBtMQotICAgICAgICBwYWRkdXNiICAgICAgICAgbTIsIG0wCisgICAgICAgIHBzdWJ1cyUyICAgICAgICBtMiwgbTEKKyAgICAgICAgcGFkZHVzJTIgICAgICAgIG0yLCBtMAogICAgICAgICBtb3ZhICAgW2RzdHEgKyB4cV0sIG0yCiAgICAgICAgIGFkZCAgICAgICAgICAgICB4cSwgbW1zaXplCiAgICAgamwgLmxvb3AKIEJMRU5EX0VORAorJWVuZG1hY3JvCiAKLSVtYWNybyBCTEVORF9BQlMgMAotQkxFTkRfSU5JVCBkaWZmZXJlbmNlLCAzCis7ICUxIG5hbWUgLCAlMiBzcmMgKGIgb3IgdyksICUzIGludGVyICh3IG9yIGQpLCAlNCAoMSBpZiAxNmJpdCwgbm90IHNldCBpZiA4IGJpdCkKKyVtYWNybyBESUZGRVJFTkNFIDMtNAorQkxFTkRfSU5JVCAlMSwgNSwgJTQKICAgICBweG9yICAgICAgIG0yLCBtMgogLm5leHRyb3c6CiAgICAgbW92ICAgICAgICB4cSwgd2lkdGhxCiAKICAgICAubG9vcDoKLSAgICAgICAgbW92aCAgICAgICAgICAgIG0wLCBbdG9wcSArIHhxXQotICAgICAgICBtb3ZoICAgICAgICAgICAgbTEsIFtib3R0b21xICsgeHFdCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtMCwgbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG0xLCBtMgotICAgICAgICBwc3VidyAgICAgICAgICAgbTAsIG0xCi0gICAgICAgIEFCUzEgICAgICAgICAgICBtMCwgbTEKLSAgICAgICAgcGFja3Vzd2IgICAgICAgIG0wLCBtMAotICAgICAgICBtb3ZoICAgW2RzdHEgKyB4cV0sIG0wCi0gICAgICAgIGFkZCAgICAgICAgICAgICB4cSwgbW1zaXplIC8gMgorICAgICAgICBtb3Z1ICAgICAgICAgICAgbTAsIFt0b3BxICsgeHFdCisgICAgICAgIG1vdnUgICAgICAgICAgICBtMSwgW2JvdHRvbXEgKyB4cV0KKyAgICAgICAgcHVucGNraCUyJTMgICAgIG0zLCBtMCwgbTIKKyAgICAgICAgcHVucGNrbCUyJTMgICAgIG0wLCBtMgorICAgICAgICBwdW5wY2toJTIlMyAgICAgbTQsIG0xLCBtMgorICAgICAgICBwdW5wY2tsJTIlMyAgICAgbTEsIG0yCisgICAgICAgIHBzdWIlMyAgICAgICAgICBtMCwgbTEKKyAgICAgICAgcHN1YiUzICAgICAgICAgIG0zLCBtNAorJWlmICUwID09IDQ7IDE2IGJpdAorICAgICAgICBwYWJzZCAgICAgICAgICAgbTAsIG0wCisgICAgICAgIHBhYnNkICAgICAgICAgICBtMywgbTMKKyVlbHNlCisgICAgICAgIEFCUzIgICAgICAgICAgICBtMCwgbTMsIG0xLCBtNAorJWVuZGlmCisgICAgICAgIHBhY2t1cyUzJTIgICAgICBtMCwgbTMKKyAgICAgICAgbW92YSAgIFtkc3RxICsgeHFdLCBtMAorICAgICAgICBhZGQgICAgICAgICAgICAgeHEsIG1tc2l6ZQogICAgIGpsIC5sb29wCiBCTEVORF9FTkQKKyVlbmRtYWNybwogCi1CTEVORF9JTklUIG5lZ2F0aW9uLCA1Cis7ICUxIG5hbWUgLCAlMiBzcmMgKGIgb3IgdyksICUzIGludGVyICh3IG9yIGQpLCAlNCAoMSBpZiAxNmJpdCwgbm90IHNldCBpZiA4IGJpdCkKKyVtYWNybyBFWFRSRU1JVFkgMy00CitCTEVORF9JTklUICUxLCA4LCAlNAogICAgIHB4b3IgICAgICAgbTIsIG0yCi0gICAgbW92YSAgICAgICBtNCwgW3B3XzI1NV0KKyVpZiAlMCA9PSA0OyAxNiBiaXQKKyAgICBWQlJPQURDQVNUSTEyOCAgICAgICBtNCwgW3BkXzY1NTM1XQorJWVsc2UKKyAgICBWQlJPQURDQVNUSTEyOCAgICAgICBtNCwgW3B3XzI1NV0KKyVlbmRpZgogLm5leHRyb3c6CiAgICAgbW92ICAgICAgICB4cSwgd2lkdGhxCiAKICAgICAubG9vcDoKLSAgICAgICAgbW92aCAgICAgICAgICAgIG0wLCBbdG9wcSArIHhxXQotICAgICAgICBtb3ZoICAgICAgICAgICAgbTEsIFtib3R0b21xICsgeHFdCi0gICAgICAgIHB1bnBja2xidyAgICAgICBtMCwgbTIKLSAgICAgICAgcHVucGNrbGJ3ICAgICAgIG0xLCBtMgotICAgICAgICBtb3ZhICAgICAgICAgICAgbTMsIG00Ci0gICAgICAgIHBzdWJ3ICAgICAgICAgICBtMywgbTAKLSAgICAgICAgcHN1YncgICAgICAgICAgIG0zLCBtMQotICAgICAgICBBQlMxICAgICAgICAgICAgbTMsIG0xCi0gICAgICAgIG1vdmEgICAgICAgICAgICBtMCwgbTQKLSAgICAgICAgcHN1YncgICAgICAgICAgIG0wLCBtMwotICAgICAgICBwYWNrdXN3YiAgICAgICAgbTAsIG0wCi0gICAgICAgIG1vdmggICBbZHN0cSArIHhxXSwgbTAKLSAgICAgICAgYWRkICAgICAgICAgICAgIHhxLCBtbXNpemUgLyAyCisgICAgICAgIG1vdnUgICAgICAgICAgICBtMCwgW3RvcHEgKyB4cV0KKyAgICAgICAgbW92dSAgICAgICAgICAgIG0xLCBbYm90dG9tcSArIHhxXQorICAgICAgICBwdW5wY2toJTIlMyAgICAgbTUsIG0wLCBtMgorICAgICAgICBwdW5wY2tsJTIlMyAgICAgbTAsIG0yCisgICAgICAgIHB1bnBja2glMiUzICAgICBtNiwgbTEsIG0yCisgICAgICAgIHB1bnBja2wlMiUzICAgICBtMSwgbTIKKyAgICAgICAgcHN1YiUzICAgICAgICAgIG0zLCBtNCwgbTAKKyAgICAgICAgcHN1YiUzICAgICAgICAgIG03LCBtNCwgbTUKKyAgICAgICAgcHN1YiUzICAgICAgICAgIG0zLCBtMQorICAgICAgICBwc3ViJTMgICAgICAgICAgbTcsIG02CislaWYgJTAgPT0gNDsgMTYgYml0CisgICAgICAgIHBhYnNkICAgICAgICAgICBtMywgbTMKKyAgICAgICAgcGFic2QgICAgICAgICAgIG03LCBtNworJWVsc2UKKyAgICAgICAgQUJTMiAgICAgICAgICAgIG0zLCBtNywgbTEsIG02CislZW5kaWYKKyAgICAgICAgcGFja3VzJTMlMiAgICAgIG0zLCBtNworICAgICAgICBtb3ZhICAgW2RzdHEgKyB4cV0sIG0zCisgICAgICAgIGFkZCAgICAgICAgICAgICB4cSwgbW1zaXplCisgICAgamwgLmxvb3AKK0JMRU5EX0VORAorJWVuZG1hY3JvCisKKyVtYWNybyBORUdBVElPTiAzLTQKK0JMRU5EX0lOSVQgJTEsIDgsICU0CisgICAgcHhvciAgICAgICBtMiwgbTIKKyVpZiAlMCA9PSA0OyAxNiBiaXQKKyAgICBWQlJPQURDQVNUSTEyOCAgICAgICBtNCwgW3BkXzY1NTM1XQorJWVsc2UKKyAgICBWQlJPQURDQVNUSTEyOCAgICAgICBtNCwgW3B3XzI1NV0KKyVlbmRpZgorLm5leHRyb3c6CisgICAgbW92ICAgICAgICB4cSwgd2lkdGhxCisKKyAgICAubG9vcDoKKyAgICAgICAgbW92dSAgICAgICAgICAgIG0wLCBbdG9wcSArIHhxXQorICAgICAgICBtb3Z1ICAgICAgICAgICAgbTEsIFtib3R0b21xICsgeHFdCisgICAgICAgIHB1bnBja2glMiUzICAgICBtNSwgbTAsIG0yCisgICAgICAgIHB1bnBja2wlMiUzICAgICBtMCwgbTIKKyAgICAgICAgcHVucGNraCUyJTMgICAgIG02LCBtMSwgbTIKKyAgICAgICAgcHVucGNrbCUyJTMgICAgIG0xLCBtMgorICAgICAgICBwc3ViJTMgICAgICAgICAgbTMsIG00LCBtMAorICAgICAgICBwc3ViJTMgICAgICAgICAgbTcsIG00LCBtNQorICAgICAgICBwc3ViJTMgICAgICAgICAgbTMsIG0xCisgICAgICAgIHBzdWIlMyAgICAgICAgICBtNywgbTYKKyVpZiAlMCA9PSA0OyAxNiBiaXQKKyAgICAgICAgcGFic2QgICAgICAgICAgIG0zLCBtMworICAgICAgICBwYWJzZCAgICAgICAgICAgbTcsIG03CislZWxzZQorICAgICAgICBBQlMyICAgICAgICAgICAgbTMsIG03LCBtMSwgbTYKKyVlbmRpZgorICAgICAgICBwc3ViJTMgICAgICAgICAgbTAsIG00LCBtMworICAgICAgICBwc3ViJTMgICAgICAgICAgbTEsIG00LCBtNworICAgICAgICBwYWNrdXMlMyUyICAgICAgbTAsIG0xCisgICAgICAgIG1vdmEgICBbZHN0cSArIHhxXSwgbTAKKyAgICAgICAgYWRkICAgICAgICAgICAgIHhxLCBtbXNpemUKICAgICBqbCAubG9vcAogQkxFTkRfRU5ECiAlZW5kbWFjcm8KIAogSU5JVF9YTU0gc3NlMgotQkxFTkRfQUJTCitCTEVORF9TSU1QTEUgeG9yLCAgICAgIHhvcgorQkxFTkRfU0lNUExFIG9yLCAgICAgICBvcgorQkxFTkRfU0lNUExFIGFuZCwgICAgICBhbmQKK0JMRU5EX1NJTVBMRSBhZGRpdGlvbiwgYWRkdXNiCitCTEVORF9TSU1QTEUgc3VidHJhY3QsIHN1YnVzYgorQkxFTkRfU0lNUExFIGRhcmtlbiwgICBtaW51YgorQkxFTkRfU0lNUExFIGxpZ2h0ZW4sICBtYXh1YgorR1JBSU5FWFRSQUNUIGdyYWluZXh0cmFjdCwgYiwgdworQkxFTkRfTVVMVElQTFkKK0JMRU5EX1NDUkVFTgorQVZFUkFHRSAgICAgICBhdmVyYWdlLCAgICBiCitHUkFJTk1FUkdFICAgIGdyYWlubWVyZ2UsIGIsIHcKK0hBUkRNSVgKK1BIT0VOSVggcGhvZW5peCwgYgorRElGRkVSRU5DRSBkaWZmZXJlbmNlLCBiLCB3CitESVZJREUKK0VYVFJFTUlUWSBleHRyZW1pdHksIGIsIHcKK05FR0FUSU9OIG5lZ2F0aW9uLCBiLCB3CisKKyVpZiBBUkNIX1g4Nl82NAorQkxFTkRfU0lNUExFIGFkZGl0aW9uXzE2LCBhZGR1c3csIDEKK0JMRU5EX1NJTVBMRSBhbmRfMTYsICAgICAgYW5kLCAgICAxCitCTEVORF9TSU1QTEUgb3JfMTYsICAgICAgIG9yLCAgICAgMQorQkxFTkRfU0lNUExFIHN1YnRyYWN0XzE2LCBzdWJ1c3csIDEKK0JMRU5EX1NJTVBMRSB4b3JfMTYsICAgICAgeG9yLCAgICAxCitBVkVSQUdFICAgICAgYXZlcmFnZV8xNiwgIHcsICAgICAgMQorJWVuZGlmCisKIElOSVRfWE1NIHNzc2UzCi1CTEVORF9BQlMKK0RJRkZFUkVOQ0UgZGlmZmVyZW5jZSwgYiwgdworRVhUUkVNSVRZIGV4dHJlbWl0eSwgYiwgdworTkVHQVRJT04gbmVnYXRpb24sIGIsIHcKKworSU5JVF9YTU0gc3NlNAorJWlmIEFSQ0hfWDg2XzY0CitCTEVORF9TSU1QTEUgZGFya2VuXzE2LCAgIG1pbnV3LCAxCitCTEVORF9TSU1QTEUgbGlnaHRlbl8xNiwgIG1heHV3LCAxCitHUkFJTkVYVFJBQ1QgZ3JhaW5leHRyYWN0XzE2LCB3LCBkLCAxCitHUkFJTk1FUkdFICAgZ3JhaW5tZXJnZV8xNiwgdywgZCwgMQorUEhPRU5JWCAgICAgIHBob2VuaXhfMTYsICAgICAgdywgMQorRElGRkVSRU5DRSAgIGRpZmZlcmVuY2VfMTYsIHcsIGQsIDEKK0VYVFJFTUlUWSAgICBleHRyZW1pdHlfMTYsIHcsIGQsIDEKK05FR0FUSU9OICAgICBuZWdhdGlvbl8xNiwgdywgZCwgMQorJWVuZGlmCisKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK0JMRU5EX1NJTVBMRSB4b3IsICAgICAgeG9yCitCTEVORF9TSU1QTEUgb3IsICAgICAgIG9yCitCTEVORF9TSU1QTEUgYW5kLCAgICAgIGFuZAorQkxFTkRfU0lNUExFIGFkZGl0aW9uLCBhZGR1c2IKK0JMRU5EX1NJTVBMRSBzdWJ0cmFjdCwgc3VidXNiCitCTEVORF9TSU1QTEUgZGFya2VuLCAgIG1pbnViCitCTEVORF9TSU1QTEUgbGlnaHRlbiwgIG1heHViCitHUkFJTkVYVFJBQ1QgZ3JhaW5leHRyYWN0LCBiLCB3CitCTEVORF9NVUxUSVBMWQorQkxFTkRfU0NSRUVOCitBVkVSQUdFICAgIGF2ZXJhZ2UsICAgIGIKK0dSQUlOTUVSR0UgZ3JhaW5tZXJnZSwgYiwgdworSEFSRE1JWAorUEhPRU5JWCBwaG9lbml4LCBiCisKK0RJRkZFUkVOQ0UgZGlmZmVyZW5jZSwgYiwgdworRVhUUkVNSVRZIGV4dHJlbWl0eSwgYiwgdworTkVHQVRJT04gbmVnYXRpb24sIGIsIHcKKworJWlmIEFSQ0hfWDg2XzY0CitCTEVORF9TSU1QTEUgYWRkaXRpb25fMTYsIGFkZHVzdywgMQorQkxFTkRfU0lNUExFIGFuZF8xNiwgICAgICBhbmQsICAgIDEKK0JMRU5EX1NJTVBMRSBkYXJrZW5fMTYsICAgbWludXcsICAxCitCTEVORF9TSU1QTEUgbGlnaHRlbl8xNiwgIG1heHV3LCAgMQorQkxFTkRfU0lNUExFIG9yXzE2LCAgICAgICBvciwgICAgIDEKK0JMRU5EX1NJTVBMRSBzdWJ0cmFjdF8xNiwgc3VidXN3LCAxCitCTEVORF9TSU1QTEUgeG9yXzE2LCAgICAgIHhvciwgICAgMQorR1JBSU5FWFRSQUNUIGdyYWluZXh0cmFjdF8xNiwgdywgZCwgMQorQVZFUkFHRSAgICAgIGF2ZXJhZ2VfMTYsICB3LCAgICAgIDEKK0dSQUlOTUVSR0UgICBncmFpbm1lcmdlXzE2LCB3LCBkLCAxCitQSE9FTklYICAgICAgcGhvZW5peF8xNiwgICAgICAgdywgMQorRElGRkVSRU5DRSAgIGRpZmZlcmVuY2VfMTYsIHcsIGQsIDEKK0VYVFJFTUlUWSAgICBleHRyZW1pdHlfMTYsIHcsIGQsIDEKK05FR0FUSU9OICAgICBuZWdhdGlvbl8xNiwgdywgZCwgMQorJWVuZGlmCislZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ibGVuZF9pbml0LmMgYi9saWJhdmZpbHRlci94ODYvdmZfYmxlbmRfaW5pdC5jCmluZGV4IDU1NWUxZTUuLmFjZjI4NTUgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ibGVuZF9pbml0LmMKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2JsZW5kX2luaXQuYwpAQCAtMjgsNTUgKzI4LDE3NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpib3R0b20sIHB0cmRpZmZfdCBib3R0b21fbGluZXNpemUsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLCAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB3aWR0aCwgcHRyZGlmZl90IGhlaWdodCwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRmlsdGVyUGFyYW1zICpwYXJhbSwgZG91YmxlICp2YWx1ZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRmlsdGVyUGFyYW1zICpwYXJhbSwgZG91YmxlICp2YWx1ZXMsIGludCBzdGFydHkpOwogCiBCTEVORF9GVU5DKGFkZGl0aW9uLCBzc2UyKQotQkxFTkRfRlVOQyhhZGRpdGlvbjEyOCwgc3NlMikKK0JMRU5EX0ZVTkMoYWRkaXRpb24sIGF2eDIpCitCTEVORF9GVU5DKGdyYWlubWVyZ2UsIHNzZTIpCitCTEVORF9GVU5DKGdyYWlubWVyZ2UsIGF2eDIpCiBCTEVORF9GVU5DKGF2ZXJhZ2UsIHNzZTIpCitCTEVORF9GVU5DKGF2ZXJhZ2UsIGF2eDIpCiBCTEVORF9GVU5DKGFuZCwgc3NlMikKK0JMRU5EX0ZVTkMoYW5kLCBhdngyKQogQkxFTkRfRlVOQyhkYXJrZW4sIHNzZTIpCi1CTEVORF9GVU5DKGRpZmZlcmVuY2UxMjgsIHNzZTIpCitCTEVORF9GVU5DKGRhcmtlbiwgYXZ4MikKK0JMRU5EX0ZVTkMoZ3JhaW5leHRyYWN0LCBzc2UyKQorQkxFTkRfRlVOQyhncmFpbmV4dHJhY3QsIGF2eDIpCiBCTEVORF9GVU5DKG11bHRpcGx5LCBzc2UyKQorQkxFTkRfRlVOQyhtdWx0aXBseSwgYXZ4MikKIEJMRU5EX0ZVTkMoc2NyZWVuLCBzc2UyKQorQkxFTkRfRlVOQyhzY3JlZW4sIGF2eDIpCiBCTEVORF9GVU5DKGhhcmRtaXgsIHNzZTIpCitCTEVORF9GVU5DKGhhcmRtaXgsIGF2eDIpCitCTEVORF9GVU5DKGRpdmlkZSwgc3NlMikKIEJMRU5EX0ZVTkMobGlnaHRlbiwgc3NlMikKK0JMRU5EX0ZVTkMobGlnaHRlbiwgYXZ4MikKIEJMRU5EX0ZVTkMob3IsIHNzZTIpCitCTEVORF9GVU5DKG9yLCBhdngyKQogQkxFTkRfRlVOQyhwaG9lbml4LCBzc2UyKQorQkxFTkRfRlVOQyhwaG9lbml4LCBhdngyKQogQkxFTkRfRlVOQyhzdWJ0cmFjdCwgc3NlMikKK0JMRU5EX0ZVTkMoc3VidHJhY3QsIGF2eDIpCiBCTEVORF9GVU5DKHhvciwgc3NlMikKK0JMRU5EX0ZVTkMoeG9yLCBhdngyKQogQkxFTkRfRlVOQyhkaWZmZXJlbmNlLCBzc2UyKQogQkxFTkRfRlVOQyhkaWZmZXJlbmNlLCBzc3NlMykKK0JMRU5EX0ZVTkMoZGlmZmVyZW5jZSwgYXZ4MikKK0JMRU5EX0ZVTkMoZXh0cmVtaXR5LCBzc2UyKQorQkxFTkRfRlVOQyhleHRyZW1pdHksIHNzc2UzKQorQkxFTkRfRlVOQyhleHRyZW1pdHksIGF2eDIpCiBCTEVORF9GVU5DKG5lZ2F0aW9uLCBzc2UyKQogQkxFTkRfRlVOQyhuZWdhdGlvbiwgc3NzZTMpCitCTEVORF9GVU5DKG5lZ2F0aW9uLCBhdngyKQorCisjaWYgQVJDSF9YODZfNjQKK0JMRU5EX0ZVTkMoYWRkaXRpb25fMTYsIHNzZTIpCitCTEVORF9GVU5DKGFkZGl0aW9uXzE2LCBhdngyKQorQkxFTkRfRlVOQyhncmFpbm1lcmdlXzE2LCBzc2U0KQorQkxFTkRfRlVOQyhncmFpbm1lcmdlXzE2LCBhdngyKQorQkxFTkRfRlVOQyhhdmVyYWdlXzE2LCBzc2UyKQorQkxFTkRfRlVOQyhhdmVyYWdlXzE2LCBhdngyKQorQkxFTkRfRlVOQyhhbmRfMTYsIHNzZTIpCitCTEVORF9GVU5DKGFuZF8xNiwgYXZ4MikKK0JMRU5EX0ZVTkMoZGFya2VuXzE2LCBzc2U0KQorQkxFTkRfRlVOQyhkYXJrZW5fMTYsIGF2eDIpCitCTEVORF9GVU5DKGdyYWluZXh0cmFjdF8xNiwgc3NlNCkKK0JMRU5EX0ZVTkMoZ3JhaW5leHRyYWN0XzE2LCBhdngyKQorQkxFTkRfRlVOQyhkaWZmZXJlbmNlXzE2LCBzc2U0KQorQkxFTkRfRlVOQyhkaWZmZXJlbmNlXzE2LCBhdngyKQorQkxFTkRfRlVOQyhleHRyZW1pdHlfMTYsIHNzZTQpCitCTEVORF9GVU5DKGV4dHJlbWl0eV8xNiwgYXZ4MikKK0JMRU5EX0ZVTkMobmVnYXRpb25fMTYsIHNzZTQpCitCTEVORF9GVU5DKG5lZ2F0aW9uXzE2LCBhdngyKQorQkxFTkRfRlVOQyhsaWdodGVuXzE2LCBzc2U0KQorQkxFTkRfRlVOQyhsaWdodGVuXzE2LCBhdngyKQorQkxFTkRfRlVOQyhvcl8xNiwgc3NlMikKK0JMRU5EX0ZVTkMob3JfMTYsIGF2eDIpCitCTEVORF9GVU5DKHBob2VuaXhfMTYsIHNzZTQpCitCTEVORF9GVU5DKHBob2VuaXhfMTYsIGF2eDIpCitCTEVORF9GVU5DKHN1YnRyYWN0XzE2LCBzc2UyKQorQkxFTkRfRlVOQyhzdWJ0cmFjdF8xNiwgYXZ4MikKK0JMRU5EX0ZVTkMoeG9yXzE2LCBzc2UyKQorQkxFTkRfRlVOQyh4b3JfMTYsIGF2eDIpCisjZW5kaWYgLyogQVJDSF9YODZfNjQgKi8KIAogYXZfY29sZCB2b2lkIGZmX2JsZW5kX2luaXRfeDg2KEZpbHRlclBhcmFtcyAqcGFyYW0sIGludCBpc18xNmJpdCkKIHsKICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCi0gICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSAmJiBwYXJhbS0+b3BhY2l0eSA9PSAxICYmICFpc18xNmJpdCkgewotICAgICAgICBzd2l0Y2ggKHBhcmFtLT5tb2RlKSB7Ci0gICAgICAgIGNhc2UgQkxFTkRfQURESVRJT046IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2FkZGl0aW9uX3NzZTI7IGJyZWFrOwotICAgICAgICBjYXNlIEJMRU5EX0FERElUSU9OMTI4OiBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9hZGRpdGlvbjEyOF9zc2UyOyBicmVhazsKLSAgICAgICAgY2FzZSBCTEVORF9BTkQ6ICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfYW5kX3NzZTI7ICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQkxFTkRfQVZFUkFHRTogIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2F2ZXJhZ2Vfc3NlMjsgIGJyZWFrOwotICAgICAgICBjYXNlIEJMRU5EX0RBUktFTjogICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9kYXJrZW5fc3NlMjsgICBicmVhazsKLSAgICAgICAgY2FzZSBCTEVORF9ESUZGRVJFTkNFMTI4OiBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9kaWZmZXJlbmNlMTI4X3NzZTI7IGJyZWFrOwotICAgICAgICBjYXNlIEJMRU5EX0hBUkRNSVg6ICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9oYXJkbWl4X3NzZTI7ICBicmVhazsKLSAgICAgICAgY2FzZSBCTEVORF9MSUdIVEVOOiAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfbGlnaHRlbl9zc2UyOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQkxFTkRfTVVMVElQTFk6IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX211bHRpcGx5X3NzZTI7IGJyZWFrOwotICAgICAgICBjYXNlIEJMRU5EX09SOiAgICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9vcl9zc2UyOyAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCTEVORF9QSE9FTklYOiAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfcGhvZW5peF9zc2UyOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQkxFTkRfU0NSRUVOOiAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX3NjcmVlbl9zc2UyOyBicmVhazsKLSAgICAgICAgY2FzZSBCTEVORF9TVUJUUkFDVDogcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfc3VidHJhY3Rfc3NlMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgQkxFTkRfWE9SOiAgICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX3hvcl9zc2UyOyAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJMRU5EX0RJRkZFUkVOQ0U6IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2RpZmZlcmVuY2Vfc3NlMjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgQkxFTkRfTkVHQVRJT046ICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfbmVnYXRpb25fc3NlMjsgICBicmVhazsKKyAgICBpZiAoIWlzXzE2Yml0KSB7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykgJiYgcGFyYW0tPm9wYWNpdHkgPT0gMSkgeworICAgICAgICAgICAgc3dpdGNoIChwYXJhbS0+bW9kZSkgeworICAgICAgICAgICAgY2FzZSBCTEVORF9BRERJVElPTjogICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2FkZGl0aW9uX3NzZTI7ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfR1JBSU5NRVJHRTogICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9ncmFpbm1lcmdlX3NzZTI7ICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0FORDogICAgICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfYW5kX3NzZTI7ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9BVkVSQUdFOiAgICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2F2ZXJhZ2Vfc3NlMjsgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfREFSS0VOOiAgICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9kYXJrZW5fc3NlMjsgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0dSQUlORVhUUkFDVDogcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZ3JhaW5leHRyYWN0X3NzZTI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9ESVZJREU6ICAgICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2RpdmlkZV9zc2UyOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfSEFSRE1JWDogICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9oYXJkbWl4X3NzZTI7ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0xJR0hURU46ICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfbGlnaHRlbl9zc2UyOyAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9NVUxUSVBMWTogICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX211bHRpcGx5X3NzZTI7ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfT1I6ICAgICAgICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9vcl9zc2UyOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX1BIT0VOSVg6ICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfcGhvZW5peF9zc2UyOyAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9TQ1JFRU46ICAgICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX3NjcmVlbl9zc2UyOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfU1VCVFJBQ1Q6ICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9zdWJ0cmFjdF9zc2UyOyAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX1hPUjogICAgICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfeG9yX3NzZTI7ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9ESUZGRVJFTkNFOiAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2RpZmZlcmVuY2Vfc3NlMjsgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfRVhUUkVNSVRZOiAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9leHRyZW1pdHlfc3NlMjsgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX05FR0FUSU9OOiAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfbmVnYXRpb25fc3NlMjsgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpICYmIHBhcmFtLT5vcGFjaXR5ID09IDEgJiYgIWlzXzE2Yml0KSB7Ci0gICAgICAgIHN3aXRjaCAocGFyYW0tPm1vZGUpIHsKLSAgICAgICAgY2FzZSBCTEVORF9ESUZGRVJFTkNFOiBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9kaWZmZXJlbmNlX3Nzc2UzOyBicmVhazsKLSAgICAgICAgY2FzZSBCTEVORF9ORUdBVElPTjogICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9uZWdhdGlvbl9zc3NlMzsgICBicmVhazsKKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykgJiYgcGFyYW0tPm9wYWNpdHkgPT0gMSkgeworICAgICAgICAgICAgc3dpdGNoIChwYXJhbS0+bW9kZSkgeworICAgICAgICAgICAgY2FzZSBCTEVORF9ESUZGRVJFTkNFOiBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9kaWZmZXJlbmNlX3Nzc2UzOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfRVhUUkVNSVRZOiAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZXh0cmVtaXR5X3Nzc2UzOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX05FR0FUSU9OOiAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX25lZ2F0aW9uX3Nzc2UzOyAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgaWYgKEVYVEVSTkFMX0FWWDJfRkFTVChjcHVfZmxhZ3MpICYmIHBhcmFtLT5vcGFjaXR5ID09IDEpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocGFyYW0tPm1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfQURESVRJT046ICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9hZGRpdGlvbl9hdngyOyAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0dSQUlOTUVSR0U6ICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZ3JhaW5tZXJnZV9hdngyOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9BTkQ6ICAgICAgICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2FuZF9hdngyOyAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfQVZFUkFHRTogICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9hdmVyYWdlX2F2eDI7ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0RBUktFTjogICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZGFya2VuX2F2eDI7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9HUkFJTkVYVFJBQ1Q6IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2dyYWluZXh0cmFjdF9hdngyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfSEFSRE1JWDogICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9oYXJkbWl4X2F2eDI7ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0xJR0hURU46ICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfbGlnaHRlbl9hdngyOyAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9NVUxUSVBMWTogICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX211bHRpcGx5X2F2eDI7ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfT1I6ICAgICAgICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9vcl9hdngyOyAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX1BIT0VOSVg6ICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfcGhvZW5peF9hdngyOyAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9TQ1JFRU46ICAgICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX3NjcmVlbl9hdngyOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfU1VCVFJBQ1Q6ICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9zdWJ0cmFjdF9hdngyOyAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX1hPUjogICAgICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfeG9yX2F2eDI7ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9ESUZGRVJFTkNFOiAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2RpZmZlcmVuY2VfYXZ4MjsgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfRVhUUkVNSVRZOiAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9leHRyZW1pdHlfYXZ4MjsgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX05FR0FUSU9OOiAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfbmVnYXRpb25fYXZ4MjsgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLyogaXNfMTZfYml0ICovCisjaWYgQVJDSF9YODZfNjQKKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSAmJiBwYXJhbS0+b3BhY2l0eSA9PSAxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtLT5tb2RlKSB7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0FERElUSU9OOiBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9hZGRpdGlvbl8xNl9zc2UyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfQU5EOiAgICAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2FuZF8xNl9zc2UyOyAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9BVkVSQUdFOiAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfYXZlcmFnZV8xNl9zc2UyOyAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX09SOiAgICAgICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9vcl8xNl9zc2UyOyAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfU1VCVFJBQ1Q6IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX3N1YnRyYWN0XzE2X3NzZTI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9YT1I6ICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfeG9yXzE2X3NzZTI7ICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSAmJiBwYXJhbS0+b3BhY2l0eSA9PSAxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtLT5tb2RlKSB7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0dSQUlOTUVSR0U6IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2dyYWlubWVyZ2VfMTZfc3NlNDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0RBUktFTjogICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9kYXJrZW5fMTZfc3NlNDsgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9HUkFJTkVYVFJBQ1Q6IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2dyYWluZXh0cmFjdF8xNl9zc2U0OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfRElGRkVSRU5DRTogcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZGlmZmVyZW5jZV8xNl9zc2U0OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfRVhUUkVNSVRZOiAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZXh0cmVtaXR5XzE2X3NzZTQ7ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9ORUdBVElPTjogIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX25lZ2F0aW9uXzE2X3NzZTQ7ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfTElHSFRFTjogIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2xpZ2h0ZW5fMTZfc3NlNDsgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX1BIT0VOSVg6ICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9waG9lbml4XzE2X3NzZTQ7ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSAmJiBwYXJhbS0+b3BhY2l0eSA9PSAxKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHBhcmFtLT5tb2RlKSB7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0FERElUSU9OOiBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9hZGRpdGlvbl8xNl9hdngyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfR1JBSU5NRVJHRTogcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZ3JhaW5tZXJnZV8xNl9hdngyOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9BTkQ6ICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfYW5kXzE2X2F2eDI7ICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX0FWRVJBR0U6ICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9hdmVyYWdlXzE2X2F2eDI7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfREFSS0VOOiAgIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2Rhcmtlbl8xNl9hdngyOyAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9HUkFJTkVYVFJBQ1Q6IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2dyYWluZXh0cmFjdF8xNl9hdngyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfRElGRkVSRU5DRTogcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZGlmZmVyZW5jZV8xNl9hdngyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfRVhUUkVNSVRZOiAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfZXh0cmVtaXR5XzE2X2F2eDI7ICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9ORUdBVElPTjogIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX25lZ2F0aW9uXzE2X2F2eDI7ICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfTElHSFRFTjogIHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX2xpZ2h0ZW5fMTZfYXZ4MjsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9PUjogICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfb3JfMTZfYXZ4MjsgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJMRU5EX1BIT0VOSVg6ICBwYXJhbS0+YmxlbmQgPSBmZl9ibGVuZF9waG9lbml4XzE2X2F2eDI7ICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQkxFTkRfU1VCVFJBQ1Q6IHBhcmFtLT5ibGVuZCA9IGZmX2JsZW5kX3N1YnRyYWN0XzE2X2F2eDI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBCTEVORF9YT1I6ICAgICAgcGFyYW0tPmJsZW5kID0gZmZfYmxlbmRfeG9yXzE2X2F2eDI7ICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBBUkNIX1g4Nl82NCAqLwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl9id2RpZi5hc20gYi9saWJhdmZpbHRlci94ODYvdmZfYndkaWYuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2I3YzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci94ODYvdmZfYndkaWYuYXNtCkBAIC0wLDAgKzEsMjcwIEBACis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIHg4Ni1vcHRpbWl6ZWQgZnVuY3Rpb25zIGZvciBid2RpZiBmaWx0ZXIKKzsqCis7KiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhvbWFzIE11bmR0IDxsb3VkbWF4QHlhaG9vLmRlPgorOyoKKzsqIEJhc2VkIG9uIHlhZGlmIHNpbWQgY29kZQorOyogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Cis7KiAgICAgICAgICAgICAgIDIwMTMgRGFuaWVsIEthbmcgPGRhbmllbC5kLmthbmdAZ21haWwuY29tPgorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK3B3X2NvZWZoZjogIHRpbWVzIDQgZHcgIDEwMTYsIDU1NzAKK3B3X2NvZWZoZjE6IHRpbWVzIDggZHcgLTM4MDEKK3B3X2NvZWZzcDogIHRpbWVzIDQgZHcgIDUwNzcsIC05ODEKK3B3X3NwbGZkaWY6IHRpbWVzIDQgZHcgIC03NjgsICA3NjgKKworU0VDVElPTiAudGV4dAorCislbWFjcm8gTE9BRDggMgorICAgIG1vdmggICAgICAgICAlMSwgJTIKKyAgICBwdW5wY2tsYncgICAgJTEsIG03CislZW5kbWFjcm8KKworJW1hY3JvIExPQUQxMiAyCisgICAgbW92dSAgICAgICAgICUxLCAlMgorJWVuZG1hY3JvCisKKyVtYWNybyBESVNQOCAwCisgICAgcGFja3Vzd2IgICAgIG0yLCBtMgorICAgIG1vdmggICAgIFtkc3RxXSwgbTIKKyVlbmRtYWNybworCislbWFjcm8gRElTUDEyIDAKKyAgICBDTElQVyAgICAgICAgbTIsIG03LCBtMTIKKyAgICBtb3Z1ICAgICBbZHN0cV0sIG0yCislZW5kbWFjcm8KKworJW1hY3JvIEZJTFRFUiA1CisgICAgcHhvciAgICAgICAgIG03LCBtNworLmxvb3AlMToKKyAgICBMT0FEJTQgICAgICAgbTAsIFtjdXJxK3QwKiU1XQorICAgIExPQUQlNCAgICAgICBtMSwgW2N1cnErdDEqJTVdCisgICAgTE9BRCU0ICAgICAgIG0yLCBbJTJdCisgICAgTE9BRCU0ICAgICAgIG0zLCBbJTNdCisgICAgbW92YSAgICAgICAgIG00LCBtMworICAgIHBhZGR3ICAgICAgICBtMywgbTIKKyAgICBwc3VidyAgICAgICAgbTIsIG00CisgICAgQUJTMSAgICAgICAgIG0yLCBtNAorICAgIG1vdmEgICAgICAgICBtOCwgbTMKKyAgICBtb3ZhICAgICAgICAgbTksIG0yCisgICAgTE9BRCU0ICAgICAgIG0zLCBbcHJldnErdDAqJTVdCisgICAgTE9BRCU0ICAgICAgIG00LCBbcHJldnErdDEqJTVdCisgICAgcHN1YncgICAgICAgIG0zLCBtMAorICAgIHBzdWJ3ICAgICAgICBtNCwgbTEKKyAgICBBQlMyICAgICAgICAgbTMsIG00LCBtNSwgbTYKKyAgICBwYWRkdyAgICAgICAgbTMsIG00CisgICAgcHNybHcgICAgICAgIG0yLCAxCisgICAgcHNybHcgICAgICAgIG0zLCAxCisgICAgcG1heHN3ICAgICAgIG0yLCBtMworICAgIExPQUQlNCAgICAgICBtMywgW25leHRxK3QwKiU1XQorICAgIExPQUQlNCAgICAgICBtNCwgW25leHRxK3QxKiU1XQorICAgIHBzdWJ3ICAgICAgICBtMywgbTAKKyAgICBwc3VidyAgICAgICAgbTQsIG0xCisgICAgQUJTMiAgICAgICAgIG0zLCBtNCwgbTUsIG02CisgICAgcGFkZHcgICAgICAgIG0zLCBtNAorICAgIHBzcmx3ICAgICAgICBtMywgMQorICAgIHBtYXhzdyAgICAgICBtMiwgbTMKKworICAgIExPQUQlNCAgICAgICBtMywgWyUyK3QwKjIqJTVdCisgICAgTE9BRCU0ICAgICAgIG00LCBbJTMrdDAqMiolNV0KKyAgICBMT0FEJTQgICAgICAgbTUsIFslMit0MSoyKiU1XQorICAgIExPQUQlNCAgICAgICBtNiwgWyUzK3QxKjIqJTVdCisgICAgcGFkZHcgICAgICAgIG0zLCBtNAorICAgIHBhZGR3ICAgICAgICBtNSwgbTYKKyAgICBtb3ZhICAgICAgICAgbTYsIG0zCisgICAgcGFkZHcgICAgICAgIG02LCBtNQorICAgIG1vdmEgICAgICAgIG0xMCwgbTYKKyAgICBwc3JsdyAgICAgICAgbTMsIDEKKyAgICBwc3JsdyAgICAgICAgbTUsIDEKKyAgICBwc3VidyAgICAgICAgbTMsIG0wCisgICAgcHN1YncgICAgICAgIG01LCBtMQorICAgIG1vdmEgICAgICAgICBtNiwgbTMKKyAgICBwbWluc3cgICAgICAgbTMsIG01CisgICAgcG1heHN3ICAgICAgIG01LCBtNgorICAgIG1vdmEgICAgICAgICBtNCwgbTgKKyAgICBwc3JhdyAgICAgICAgbTQsIDEKKyAgICBtb3ZhICAgICAgICAgbTYsIG00CisgICAgcHN1YncgICAgICAgIG02LCBtMAorICAgIHBzdWJ3ICAgICAgICBtNCwgbTEKKyAgICBwbWF4c3cgICAgICAgbTMsIG02CisgICAgcG1pbnN3ICAgICAgIG01LCBtNgorICAgIHBtYXhzdyAgICAgICBtMywgbTQKKyAgICBwbWluc3cgICAgICAgbTUsIG00CisgICAgbW92YSAgICAgICAgIG02LCBtNworICAgIHBzdWJ3ICAgICAgICBtNiwgbTMKKyAgICBwbWF4c3cgICAgICAgbTYsIG01CisgICAgbW92YSAgICAgICAgIG0zLCBtMgorICAgIHBjbXBndHcgICAgICBtMywgbTcKKyAgICBwYW5kICAgICAgICAgbTYsIG0zCisgICAgcG1heHN3ICAgICAgIG0yLCBtNgorICAgIG1vdmEgICAgICAgIG0xMSwgbTIKKworICAgIExPQUQlNCAgICAgICBtMiwgWyUyK3QwKjQqJTVdCisgICAgTE9BRCU0ICAgICAgIG0zLCBbJTMrdDAqNColNV0KKyAgICBMT0FEJTQgICAgICAgbTQsIFslMit0MSo0KiU1XQorICAgIExPQUQlNCAgICAgICBtNSwgWyUzK3QxKjQqJTVdCisgICAgcGFkZHcgICAgICAgIG0yLCBtMworICAgIHBhZGR3ICAgICAgICBtNCwgbTUKKyAgICBwYWRkdyAgICAgICAgbTIsIG00CisgICAgbW92YSAgICAgICAgIG0zLCBtMgorICAgIHB1bnBja2x3ZCAgICBtMiwgbTgKKyAgICBwdW5wY2tod2QgICAgbTMsIG04CisgICAgcG1hZGR3ZCAgICAgIG0yLCBbcHdfY29lZmhmXQorICAgIHBtYWRkd2QgICAgICBtMywgW3B3X2NvZWZoZl0KKyAgICBtb3ZhICAgICAgICAgbTQsIG0xMAorICAgIG1vdmEgICAgICAgICBtNiwgbTQKKyAgICBwbXVsbHcgICAgICAgbTQsIFtwd19jb2VmaGYxXQorICAgIHBtdWxodyAgICAgICBtNiwgW3B3X2NvZWZoZjFdCisgICAgbW92YSAgICAgICAgIG01LCBtNAorICAgIHB1bnBja2x3ZCAgICBtNCwgbTYKKyAgICBwdW5wY2tod2QgICAgbTUsIG02CisgICAgcGFkZGQgICAgICAgIG0yLCBtNAorICAgIHBhZGRkICAgICAgICBtMywgbTUKKyAgICBwc3JhZCAgICAgICAgbTIsIDIKKyAgICBwc3JhZCAgICAgICAgbTMsIDIKKworICAgIG1vdmEgICAgICAgICBtNCwgbTAKKyAgICBwYWRkdyAgICAgICAgbTAsIG0xCislaWYgQVJDSF9YODZfNjQKKyAgICBMT0FEJTQgICAgICAgbTUsIFtjdXJxK3QyKiU1XQorICAgIExPQUQlNCAgICAgICBtNiwgW2N1cnErdDMqJTVdCislZWxzZQorICAgIG1vdiAgICAgICAgICByNCwgcHJlZnMzbXAKKyAgICBtb3YgICAgICAgICAgcjUsIG1yZWZzM21wCisgICAgTE9BRCU0ICAgICAgIG01LCBbY3VycSt0MColNV0KKyAgICBMT0FEJTQgICAgICAgbTYsIFtjdXJxK3QxKiU1XQorICAgIG1vdiAgICAgICAgICByNCwgcHJlZnNtcAorICAgIG1vdiAgICAgICAgICByNSwgbXJlZnNtcAorJWVuZGlmCisgICAgcGFkZHcgICAgICAgIG02LCBtNQorICAgIHBzdWJ3ICAgICAgICBtMSwgbTQKKyAgICBBQlMxICAgICAgICAgbTEsIG00CisgICAgcGNtcGd0dyAgICAgIG0xLCBtOQorICAgIG1vdmEgICAgICAgICBtNCwgbTEKKyAgICBwdW5wY2tsd2QgICAgbTEsIG00CisgICAgcHVucGNraHdkICAgIG00LCBtNAorICAgIHBhbmQgICAgICAgICBtMiwgbTEKKyAgICBwYW5kICAgICAgICAgbTMsIG00CisgICAgbW92YSAgICAgICAgIG01LCBbcHdfc3BsZmRpZl0KKyAgICBtb3ZhICAgICAgICAgbTcsIG01CisgICAgcGFuZCAgICAgICAgIG01LCBtMQorICAgIHBhbmQgICAgICAgICBtNywgbTQKKyAgICBwYWRkdyAgICAgICAgbTUsIFtwd19jb2Vmc3BdCisgICAgcGFkZHcgICAgICAgIG03LCBbcHdfY29lZnNwXQorICAgIG1vdmEgICAgICAgICBtNCwgbTAKKyAgICBwdW5wY2tsd2QgICAgbTAsIG02CisgICAgcHVucGNraHdkICAgIG00LCBtNgorICAgIHBtYWRkd2QgICAgICBtMCwgbTUKKyAgICBwbWFkZHdkICAgICAgbTQsIG03CisgICAgcGFkZGQgICAgICAgIG0yLCBtMAorICAgIHBhZGRkICAgICAgICBtMywgbTQKKyAgICBwc3JhZCAgICAgICAgbTIsIDEzCisgICAgcHNyYWQgICAgICAgIG0zLCAxMworICAgIHBhY2tzc2R3ICAgICBtMiwgbTMKKworICAgIG1vdmEgICAgICAgICBtNCwgbTgKKyAgICBwc3JhdyAgICAgICAgbTQsIDEKKyAgICBtb3ZhICAgICAgICAgbTAsIG0xMQorICAgIG1vdmEgICAgICAgICBtMywgbTQKKyAgICBwc3VidyAgICAgICAgbTQsIG0wCisgICAgcGFkZHcgICAgICAgIG0zLCBtMAorICAgIENMSVBXICAgICAgICBtMiwgbTQsIG0zCisgICAgcHhvciAgICAgICAgIG03LCBtNworICAgIERJU1AlNAorCisgICAgYWRkICAgICAgICBkc3RxLCBTVEVQCisgICAgYWRkICAgICAgIHByZXZxLCBTVEVQCisgICAgYWRkICAgICAgICBjdXJxLCBTVEVQCisgICAgYWRkICAgICAgIG5leHRxLCBTVEVQCisgICAgc3ViICAgIERXT1JEIHdtLCBtbXNpemUvMgorICAgIGpnIC5sb29wJTEKKyVlbmRtYWNybworCislbWFjcm8gUFJPQyAyCislaWYgQVJDSF9YODZfNjQKKyAgICBtb3ZzeGQgICAgICAgcjUsIERXT1JEIHByZWZzbQorICAgIG1vdnN4ZCAgICAgICByNiwgRFdPUkQgbXJlZnNtCisgICAgbW92c3hkICAgICAgIHI3LCBEV09SRCBwcmVmczNtCisgICAgbW92c3hkICAgICAgIHI4LCBEV09SRCBtcmVmczNtCisgICAgREVDTEFSRV9SRUdfVE1QIDUsIDYsIDcsIDgKKyVlbHNlCisgICAgJWRlZmluZSBtOCAgW3JzcCsgMF0KKyAgICAlZGVmaW5lIG05ICBbcnNwKzE2XQorICAgICVkZWZpbmUgbTEwIFtyc3ArMzJdCisgICAgJWRlZmluZSBtMTEgW3JzcCs0OF0KKyAgICBtb3YgICAgICAgICAgcjQsIHByZWZzbXAKKyAgICBtb3YgICAgICAgICAgcjUsIG1yZWZzbXAKKyAgICBERUNMQVJFX1JFR19UTVAgNCwgNQorJWVuZGlmCisgICAgY21wIERXT1JEIHBhcml0eW0sIDAKKyAgICBqZSAucGFyaXR5MAorICAgIEZJTFRFUiAxLCBwcmV2cSwgY3VycSwgJTEsICUyCisgICAgam1wIC5yZXQKKy5wYXJpdHkwOgorICAgIEZJTFRFUiAwLCBjdXJxLCBuZXh0cSwgJTEsICUyCisucmV0OgorICAgIFJFVAorJWVuZG1hY3JvCisKKyVtYWNybyBCV0RJRiAwCislaWYgQVJDSF9YODZfNjQKK2NnbG9iYWwgYndkaWZfZmlsdGVyX2xpbmUsIDQsIDksIDEyLCAwLCBkc3QsIHByZXYsIGN1ciwgbmV4dCwgdywgcHJlZnMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcmVmcywgcHJlZnMyLCBtcmVmczIsIHByZWZzMywgbXJlZnMzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZnM0LCBtcmVmczQsIHBhcml0eSwgY2xpcF9tYXgKKyVlbHNlCitjZ2xvYmFsIGJ3ZGlmX2ZpbHRlcl9saW5lLCA0LCA2LCA4LCA2NCwgZHN0LCBwcmV2LCBjdXIsIG5leHQsIHcsIHByZWZzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXJlZnMsIHByZWZzMiwgbXJlZnMyLCBwcmVmczMsIG1yZWZzMywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZzNCwgbXJlZnM0LCBwYXJpdHksIGNsaXBfbWF4CislZW5kaWYKKyAgICAlZGVmaW5lIFNURVAgbW1zaXplLzIKKyAgICBQUk9DIDgsIDEKKworJWlmIEFSQ0hfWDg2XzY0CitjZ2xvYmFsIGJ3ZGlmX2ZpbHRlcl9saW5lXzEyYml0LCA0LCA5LCAxMywgMCwgZHN0LCBwcmV2LCBjdXIsIG5leHQsIHcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmcywgbXJlZnMsIHByZWZzMiwgbXJlZnMyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZnMzLCBtcmVmczMsIHByZWZzNCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yZWZzNCwgcGFyaXR5LCBjbGlwX21heAorICAgIG1vdmQgICAgICAgIG0xMiwgRFdPUkQgY2xpcF9tYXhtCisgICAgU1BMQVRXICAgICAgbTEyLCBtMTIsIDAKKyVlbHNlCitjZ2xvYmFsIGJ3ZGlmX2ZpbHRlcl9saW5lXzEyYml0LCA0LCA2LCA4LCA4MCwgZHN0LCBwcmV2LCBjdXIsIG5leHQsIHcsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmcywgbXJlZnMsIHByZWZzMiwgbXJlZnMyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZnMzLCBtcmVmczMsIHByZWZzNCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1yZWZzNCwgcGFyaXR5LCBjbGlwX21heAorICAgICVkZWZpbmUgbTEyIFtyc3ArNjRdCisgICAgbW92ZCAgICAgICAgIG0wLCBEV09SRCBjbGlwX21heG0KKyAgICBTUExBVFcgICAgICAgbTAsIG0wLCAwCisgICAgbW92YSAgICAgICAgbTEyLCBtMAorJWVuZGlmCisgICAgJWRlZmluZSBTVEVQIG1tc2l6ZQorICAgIFBST0MgMTIsIDIKKyVlbmRtYWNybworCitJTklUX1hNTSBzc3NlMworQldESUYKK0lOSVRfWE1NIHNzZTIKK0JXRElGCislaWYgQVJDSF9YODZfMzIKK0lOSVRfTU1YIG1teGV4dAorQldESUYKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX2J3ZGlmX2luaXQuYyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9id2RpZl9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNiODQzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9id2RpZl9pbml0LmMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaG9tYXMgTXVuZHQgPGxvdWRtYXhAeWFob28uZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2J3ZGlmLmgiCisKK3ZvaWQgZmZfYndkaWZfZmlsdGVyX2xpbmVfbW14ZXh0KHZvaWQgKmRzdCwgdm9pZCAqcHJldiwgdm9pZCAqY3VyLCB2b2lkICpuZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBwcmVmcywgaW50IG1yZWZzLCBpbnQgcHJlZnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzMiwgaW50IHByZWZzMywgaW50IG1yZWZzMywgaW50IHByZWZzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtcmVmczQsIGludCBwYXJpdHksIGludCBjbGlwX21heCk7Cit2b2lkIGZmX2J3ZGlmX2ZpbHRlcl9saW5lX3NzZTIodm9pZCAqZHN0LCB2b2lkICpwcmV2LCB2b2lkICpjdXIsIHZvaWQgKm5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBwcmVmcywgaW50IG1yZWZzLCBpbnQgcHJlZnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtcmVmczIsIGludCBwcmVmczMsIGludCBtcmVmczMsIGludCBwcmVmczQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzNCwgaW50IHBhcml0eSwgaW50IGNsaXBfbWF4KTsKK3ZvaWQgZmZfYndkaWZfZmlsdGVyX2xpbmVfc3NzZTModm9pZCAqZHN0LCB2b2lkICpwcmV2LCB2b2lkICpjdXIsIHZvaWQgKm5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgcHJlZnMsIGludCBtcmVmcywgaW50IHByZWZzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzMiwgaW50IHByZWZzMywgaW50IG1yZWZzMywgaW50IHByZWZzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzNCwgaW50IHBhcml0eSwgaW50IGNsaXBfbWF4KTsKKwordm9pZCBmZl9id2RpZl9maWx0ZXJfbGluZV8xMmJpdF9tbXhleHQodm9pZCAqZHN0LCB2b2lkICpwcmV2LCB2b2lkICpjdXIsIHZvaWQgKm5leHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsIGludCBwcmVmczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXJlZnMyLCBpbnQgcHJlZnMzLCBpbnQgbXJlZnMzLCBpbnQgcHJlZnM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzNCwgaW50IHBhcml0eSwgaW50IGNsaXBfbWF4KTsKK3ZvaWQgZmZfYndkaWZfZmlsdGVyX2xpbmVfMTJiaXRfc3NlMih2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwgdm9pZCAqbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IHByZWZzLCBpbnQgbXJlZnMsIGludCBwcmVmczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1yZWZzMiwgaW50IHByZWZzMywgaW50IG1yZWZzMywgaW50IHByZWZzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXJlZnM0LCBpbnQgcGFyaXR5LCBpbnQgY2xpcF9tYXgpOwordm9pZCBmZl9id2RpZl9maWx0ZXJfbGluZV8xMmJpdF9zc3NlMyh2b2lkICpkc3QsIHZvaWQgKnByZXYsIHZvaWQgKmN1ciwgdm9pZCAqbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBwcmVmcywgaW50IG1yZWZzLCBpbnQgcHJlZnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXJlZnMyLCBpbnQgcHJlZnMzLCBpbnQgbXJlZnMzLCBpbnQgcHJlZnM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXJlZnM0LCBpbnQgcGFyaXR5LCBpbnQgY2xpcF9tYXgpOworCithdl9jb2xkIHZvaWQgZmZfYndkaWZfaW5pdF94ODYoQldESUZDb250ZXh0ICpid2RpZikKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGludCBiaXRfZGVwdGggPSAoIWJ3ZGlmLT5jc3ApID8gOCA6IGJ3ZGlmLT5jc3AtPmNvbXBbMF0uZGVwdGg7CisKKyAgICBpZiAoYml0X2RlcHRoIDw9IDgpIHsKKyNpZiBBUkNIX1g4Nl8zMgorICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgICAgICBid2RpZi0+ZmlsdGVyX2xpbmUgPSBmZl9id2RpZl9maWx0ZXJfbGluZV9tbXhleHQ7CisjZW5kaWYgLyogQVJDSF9YODZfMzIgKi8KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIGJ3ZGlmLT5maWx0ZXJfbGluZSA9IGZmX2J3ZGlmX2ZpbHRlcl9saW5lX3NzZTI7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKQorICAgICAgICAgICAgYndkaWYtPmZpbHRlcl9saW5lID0gZmZfYndkaWZfZmlsdGVyX2xpbmVfc3NzZTM7CisgICAgfSBlbHNlIGlmIChiaXRfZGVwdGggPD0gMTIpIHsKKyNpZiBBUkNIX1g4Nl8zMgorICAgICAgICBpZiAoRVhURVJOQUxfTU1YRVhUKGNwdV9mbGFncykpCisgICAgICAgICAgICBid2RpZi0+ZmlsdGVyX2xpbmUgPSBmZl9id2RpZl9maWx0ZXJfbGluZV8xMmJpdF9tbXhleHQ7CisjZW5kaWYgLyogQVJDSF9YODZfMzIgKi8KKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIGJ3ZGlmLT5maWx0ZXJfbGluZSA9IGZmX2J3ZGlmX2ZpbHRlcl9saW5lXzEyYml0X3NzZTI7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKQorICAgICAgICAgICAgYndkaWYtPmZpbHRlcl9saW5lID0gZmZfYndkaWZfZmlsdGVyX2xpbmVfMTJiaXRfc3NzZTM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX2ZyYW1lcmF0ZS5hc20gYi9saWJhdmZpbHRlci94ODYvdmZfZnJhbWVyYXRlLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTMwYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2ZyYW1lcmF0ZS5hc20KQEAgLTAsMCArMSwxMzQgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2LW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIGZyYW1lcmF0ZSBmaWx0ZXIKKzsqCis7KiBDb3B5cmlnaHQgKEMpIDIwMTggTWFydG9uIEJhbGludAorOyoKKzsqIEJhc2VkIG9uIHZmX2JsZW5kLmFzbSwgQ29weXJpZ2h0IChDKSAyMDE1IFBhdWwgQiBNYWhvbAorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT04gLnRleHQKKworCislbWFjcm8gWFNQTEFUIDMKKyVpZiBjcHVmbGFnKGF2eDIpCisgICAgdnBicm9hZGNhc3QlMyAgJTEsICUyCislZWxzZQorICAgIG1vdmQgICAgICAgICAgICUxLCAlMgorJWlmaWRuICUzLCBkCisgICAgU1BMQVREICAgICAgICAgJTEKKyVlbHNlCisgICAgU1BMQVRXICAgICAgICAgJTEsICUxCislZW5kaWYKKyVlbmRpZgorJWVuZG1hY3JvCisKKworJW1hY3JvIEJMRU5EX0lOSVQgMC0xCislaWYgQVJDSF9YODZfNjQKK2NnbG9iYWwgYmxlbmRfZnJhbWVzJTEsIDYsIDksIDUsIHNyYzEsIHNyYzFfbGluZXNpemUsIHNyYzIsIHNyYzJfbGluZXNpemUsIGRzdCwgZHN0X2xpbmVzaXplLCB3aWR0aCwgZW5kLCB4CisgICAgbW92ICAgIHdpZHRoZCwgZHdvcmQgd2lkdGhtCislZWxzZQorY2dsb2JhbCBibGVuZF9mcmFtZXMlMSwgNSwgNywgNSwgc3JjMSwgc3JjMV9saW5lc2l6ZSwgc3JjMiwgc3JjMl9saW5lc2l6ZSwgZHN0LCBlbmQsIHgKKyVkZWZpbmUgZHN0X2xpbmVzaXplcSByNW1wCislZGVmaW5lIHdpZHRocSByNm1wCislZW5kaWYKKyAgICBtb3YgICAgICBlbmRkLCBkd29yZCByN20KKyAgICBhZGQgICAgIHNyYzFxLCB3aWR0aHEKKyAgICBhZGQgICAgIHNyYzJxLCB3aWR0aHEKKyAgICBhZGQgICAgICBkc3RxLCB3aWR0aHEKKyAgICBuZWcgICAgd2lkdGhxCislZW5kbWFjcm8KKworCislbWFjcm8gQkxFTkRfTE9PUCA0CisubmV4dHJvdzoKKyAgICBtb3YgICAgICAgIHhxLCB3aWR0aHEKKworICAgIC5sb29wOgorICAgICAgICBtb3Z1ICAgICAgICAgICAgbTAsIFtzcmMxcSArIHhxXQorICAgICAgICBtb3Z1ICAgICAgICAgICAgbTEsIFtzcmMycSArIHhxXQorICAgICAgICBTQlVUVEVSRkxZICAgICUxJTIsIDAsIDEsIDQgICAgICAgICA7IGFBYkJjQ2RECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZUVmRmdHaEgKKyAgICAgICAgcG1hZGQlMyAgICAgICAgIG0wLCBtMgorICAgICAgICBwbWFkZCUzICAgICAgICAgbTEsIG0yCisKKyAgICAgICAgcGFkZCUyICAgICAgICAgIG0wLCBtMworICAgICAgICBwYWRkJTIgICAgICAgICAgbTEsIG0zCisgICAgICAgIHBzcmwlMiAgICAgICAgICBtMCwgJTQgICAgICAgICAgICAgIDsgMEEwQjBDMEQKKyAgICAgICAgcHNybCUyICAgICAgICAgIG0xLCAlNCAgICAgICAgICAgICAgOyAwRTBGMEcwSAorCisgICAgICAgIHBhY2t1cyUyJTEgICAgICBtMCwgbTEgICAgICAgICAgICAgIDsgQUJDREVGR0gKKyAgICAgICAgbW92dSAgIFtkc3RxICsgeHFdLCBtMAorICAgICAgICBhZGQgICAgICAgICAgICAgeHEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisgICAgYWRkICAgICBzcmMxcSwgc3JjMV9saW5lc2l6ZXEKKyAgICBhZGQgICAgIHNyYzJxLCBzcmMyX2xpbmVzaXplcQorICAgIGFkZCAgICAgIGRzdHEsIGRzdF9saW5lc2l6ZXEKKyAgICBzdWIgICAgICBlbmRkLCAxCisgICAgamcgLm5leHRyb3cKK1JFUF9SRVQKKyVlbmRtYWNybworCisKKyVtYWNybyBCTEVORF9GUkFNRVMgMAorICAgIEJMRU5EX0lOSVQKKworICAgIFhTUExBVCAgICAgbTIsIHI4bSwgdyAgICAgICAgICAgICAgICAgICA7IGZhY3RvcjEKKyAgICBYU1BMQVQgICAgIG0zLCByOW0sIHcgICAgICAgICAgICAgICAgICAgOyBmYWN0b3IyCisKKyAgICBwc2xsdyAgICAgIG0zLCA4CisgICAgcG9yICAgICAgICBtMiwgbTMgICAgICAgICAgICAgICAgICAgICAgIDsgaW50ZXJsZWF2ZWQgZmFjdG9ycworCisgICAgWFNQTEFUICAgICBtMywgcjEwbSwgdyAgICAgICAgICAgICAgICAgIDsgaGFsZgorCisgICAgQkxFTkRfTE9PUCAgYiwgdywgdWJzdywgNworJWVuZG1hY3JvCisKKworJW1hY3JvIEJMRU5EX0ZSQU1FUzE2IDAKKyAgICBCTEVORF9JTklUIDE2CisKKyAgICBYU1BMQVQgICAgIG0yLCByOG0sIGQgICAgICAgICAgICAgICAgICAgOyBmYWN0b3IxCisgICAgWFNQTEFUICAgICBtMywgcjltLCBkICAgICAgICAgICAgICAgICAgIDsgZmFjdG9yMgorCisgICAgcHNsbGQgICAgICBtMywgMTYKKyAgICBwb3IgICAgICAgIG0yLCBtMyAgICAgICAgICAgICAgICAgICAgICAgOyBpbnRlcmxlYXZlZCBmYWN0b3JzCisKKyAgICBYU1BMQVQgICAgIG0zLCByMTBtLCBkICAgICAgICAgICAgICAgICAgOyBoYWxmCisKKyAgICBCTEVORF9MT09QICB3LCBkLCB3ZCwgMTUKKyVlbmRtYWNybworCisKK0lOSVRfWE1NIHNzc2UzCitCTEVORF9GUkFNRVMKKworSU5JVF9YTU0gc3NlNAorQkxFTkRfRlJBTUVTMTYKKworCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCisKK0lOSVRfWU1NIGF2eDIKK0JMRU5EX0ZSQU1FUworQkxFTkRfRlJBTUVTMTYKKworJWVuZGlmCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYvdmZfZnJhbWVyYXRlX2luaXQuYyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9mcmFtZXJhdGVfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNDBmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZpbHRlci94ODYvdmZfZnJhbWVyYXRlX2luaXQuYwpAQCAtMCwwICsxLDQyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9mcmFtZXJhdGUuaCIKKwordm9pZCBmZl9ibGVuZF9mcmFtZXNfc3NzZTMoQkxFTkRfRlVOQ19QQVJBTVMpOwordm9pZCBmZl9ibGVuZF9mcmFtZXNfYXZ4MihCTEVORF9GVU5DX1BBUkFNUyk7Cit2b2lkIGZmX2JsZW5kX2ZyYW1lczE2X3NzZTQoQkxFTkRfRlVOQ19QQVJBTVMpOwordm9pZCBmZl9ibGVuZF9mcmFtZXMxNl9hdngyKEJMRU5EX0ZVTkNfUEFSQU1TKTsKKwordm9pZCBmZl9mcmFtZXJhdGVfaW5pdF94ODYoRnJhbWVSYXRlQ29udGV4dCAqcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGlmIChzLT5iaXRkZXB0aCA9PSA4KSB7CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIHMtPmJsZW5kID0gZmZfYmxlbmRfZnJhbWVzX2F2eDI7CisgICAgICAgIGVsc2UgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpCisgICAgICAgICAgICBzLT5ibGVuZCA9IGZmX2JsZW5kX2ZyYW1lc19zc3NlMzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpCisgICAgICAgICAgICBzLT5ibGVuZCA9IGZmX2JsZW5kX2ZyYW1lczE2X2F2eDI7CisgICAgICAgIGVsc2UgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIHMtPmJsZW5kID0gZmZfYmxlbmRfZnJhbWVzMTZfc3NlNDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYvdmZfZ3JhZGZ1bl9pbml0LmMgYi9saWJhdmZpbHRlci94ODYvdmZfZ3JhZGZ1bl9pbml0LmMKaW5kZXggYzYzOGEwNS4uNDAwOTcxMSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L3ZmX2dyYWRmdW5faW5pdC5jCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ncmFkZnVuX2luaXQuYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZmaWx0ZXIvZ3JhZGZ1bi5oIgogCkBAIC00MCw3ICszOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpidWYxLCB1aW50MTZfdCAqZGMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIpOwogCi0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KIHN0YXRpYyB2b2lkIGdyYWRmdW5fZmlsdGVyX2xpbmVfbW14ZXh0KHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QgKmRjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgdGhyZXNoLApAQCAtODgsMTEgKzg3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjICsgd2lkdGgsIHNyYyArIHdpZHRoICogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgd2lkdGggKiAyICsgc3JjX2xpbmVzaXplKTsKIH0KLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogCiBhdl9jb2xkIHZvaWQgZmZfZ3JhZGZ1bl9pbml0X3g4NihHcmFkRnVuQ29udGV4dCAqZ2YpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX01NWEVYVChjcHVfZmxhZ3MpKQpAQCAtMTAyLDUgKzEwMSw1IEBACiAKICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKQogICAgICAgICBnZi0+Ymx1cl9saW5lID0gZ3JhZGZ1bl9ibHVyX2xpbmVfc3NlMjsKLSNlbmRpZiAvKiBIQVZFX1lBU00gKi8KKyNlbmRpZiAvKiBIQVZFX1g4NkFTTSAqLwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX2hmbGlwLmFzbSBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9oZmxpcC5hc20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1NjE4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9oZmxpcC5hc20KQEAgLTAsMCArMSw5MCBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODYtb3B0aW1pemVkIGZ1bmN0aW9ucyBmb3IgaGZsaXAgZmlsdGVyCis7KgorOyogQ29weXJpZ2h0IChDKSAyMDE3IFBhdWwgQiBNYWhvbAorOyoKKzsqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKzsqCis7KiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCis7KiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKzsqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOyoKKzsqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorOyogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzsqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCis7KiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorOyoKKzsqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKzsqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcGJfZmxpcF9ieXRlOiAgZGIgMTUsMTQsMTMsMTIsMTEsMTAsOSw4LDcsNiw1LDQsMywyLDEsMAorcGJfZmxpcF9zaG9ydDogZGIgMTQsMTUsMTIsMTMsMTAsMTEsOCw5LDYsNyw0LDUsMiwzLDAsMQorCitTRUNUSU9OIC50ZXh0CisKKzslMSBieXRlIG9yIHNob3J0LCAlMiBiIG9yIHcsICUzIHNpemUgaW4gYnl0ZSAoMSBmb3IgYnl0ZSwgMiBmb3Igc2hvcnQpCislbWFjcm8gSEZMSVAgMworY2dsb2JhbCBoZmxpcF8lMSwgMywgNSwgMywgc3JjLCBkc3QsIHcsIHIsIHgKKyAgICBWQlJPQURDQVNUSTEyOCAgICBtMCwgW3BiX2ZsaXBfJTFdCisgICAgeG9yICAgICAgICAgICAgICAgeHEsIHhxCislaWYgJTMgPT0gMQorICAgIG1vdnN4ZGlmbmlkbiB3cSwgd2QKKyVlbHNlIDsgc2hvcnQKKyAgICBhZGQgICAgIHdkLCB3ZAorJWVuZGlmCisgICAgbW92ICAgICBycSwgd3EKKyAgICBhbmQgICAgIHJxLCAyICogbW1zaXplIC0gMQorICAgIGNtcCAgICAgd3EsIDIgKiBtbXNpemUKKyAgICBqbCAubG9vcDEKKyAgICBzdWIgICAgIHdxLCBycQorCisgICAgLmxvb3AwOgorICAgICAgICBuZWcgICAgIHhxCislaWYgbW1zaXplID09IDMyCisgICAgICAgIHZwZXJtcSAgbTEsIFtzcmNxICsgeHEgLSAgICAgbW1zaXplICsgJTNdLCAweDRlOyBmbGlwIGVhY2ggbGFuZSBhdCBsb2FkCisgICAgICAgIHZwZXJtcSAgbTIsIFtzcmNxICsgeHEgLSAyICogbW1zaXplICsgJTNdLCAweDRlOyBmbGlwIGVhY2ggbGFuZSBhdCBsb2FkCislZWxzZQorICAgICAgICBtb3Z1ICAgIG0xLCBbc3JjcSArIHhxIC0gICAgIG1tc2l6ZSArICUzXQorICAgICAgICBtb3Z1ICAgIG0yLCBbc3JjcSArIHhxIC0gMiAqIG1tc2l6ZSArICUzXQorJWVuZGlmCisgICAgICAgIHBzaHVmYiAgbTEsIG0wCisgICAgICAgIHBzaHVmYiAgbTIsIG0wCisgICAgICAgIG5lZyAgICAgeHEKKyAgICAgICAgbW92dSAgICBbZHN0cSArIHhxICAgICAgICAgXSwgbTEKKyAgICAgICAgbW92dSAgICBbZHN0cSArIHhxICsgbW1zaXplXSwgbTIKKyAgICAgICAgYWRkICAgICB4cSwgbW1zaXplICogMgorICAgICAgICBjbXAgICAgIHhxLCB3cQorICAgICAgICBqbCAubG9vcDAKKworICAgIGNtcCAgICBycSwgMAorICAgIGplIC5lbmQKKyAgICBhZGQgICAgd3EsIHJxCisKKyAgICAubG9vcDE6CisgICAgICAgIG5lZyAgICB4cQorICAgICAgICBtb3YgICAgciUyLCBbc3JjcSArIHhxXQorICAgICAgICBuZWcgICAgeHEKKyAgICAgICAgbW92ICAgIFtkc3RxICsgeHFdLCByJTIKKyAgICAgICAgYWRkICAgIHhxLCAlMworICAgICAgICBjbXAgICAgeHEsIHdxCisgICAgICAgIGpsIC5sb29wMQorICAgIC5lbmQ6CisgICAgICAgIFJFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzc2UzCitIRkxJUCBieXRlLCBiLCAxCitIRkxJUCBzaG9ydCwgdywgMgorCislaWYgSEFWRV9BVlgyX0VYVEVSTkFMCitJTklUX1lNTSBhdngyCitIRkxJUCBieXRlLCBiLCAxCitIRkxJUCBzaG9ydCwgdywgMgorJWVuZGlmCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYvdmZfaGZsaXBfaW5pdC5jIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2hmbGlwX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMzOTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2hmbGlwX2luaXQuYwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9oZmxpcC5oIgorCit2b2lkIGZmX2hmbGlwX2J5dGVfc3NzZTMoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCB3KTsKK3ZvaWQgZmZfaGZsaXBfYnl0ZV9hdngyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgdyk7Cit2b2lkIGZmX2hmbGlwX3Nob3J0X3Nzc2UzKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgdyk7Cit2b2lkIGZmX2hmbGlwX3Nob3J0X2F2eDIoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCB3KTsKKworYXZfY29sZCB2b2lkIGZmX2hmbGlwX2luaXRfeDg2KEZsaXBDb250ZXh0ICpzLCBpbnQgc3RlcFs0XSwgaW50IG5iX3BsYW5lcykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5iX3BsYW5lczsgaSsrKSB7CisgICAgICAgIGlmIChzdGVwW2ldID09IDEpIHsKKyAgICAgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcy0+ZmxpcF9saW5lW2ldID0gZmZfaGZsaXBfYnl0ZV9zc3NlMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgICAgIHMtPmZsaXBfbGluZVtpXSA9IGZmX2hmbGlwX2J5dGVfYXZ4MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdGVwW2ldID09IDIpIHsKKyAgICAgICAgICAgIGlmIChFWFRFUk5BTF9TU1NFMyhjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICAgICAgcy0+ZmxpcF9saW5lW2ldID0gZmZfaGZsaXBfc2hvcnRfc3NzZTM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgICAgICBzLT5mbGlwX2xpbmVbaV0gPSBmZl9oZmxpcF9zaG9ydF9hdngyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX2hxZG4zZF9pbml0LmMgYi9saWJhdmZpbHRlci94ODYvdmZfaHFkbjNkX2luaXQuYwppbmRleCBiNjM5MTZiLi40M2FjYTkwIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci94ODYvdmZfaHFkbjNkX2luaXQuYworKysgYi9saWJhdmZpbHRlci94ODYvdmZfaHFkbjNkX2luaXQuYwpAQCAtNDAsMTAgKzQwLDEwIEBACiAKIGF2X2NvbGQgdm9pZCBmZl9ocWRuM2RfaW5pdF94ODYoSFFETjNEQ29udGV4dCAqaHFkbjNkKQogewotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAgICAgaHFkbjNkLT5kZW5vaXNlX3Jvd1s4XSAgPSBmZl9ocWRuM2Rfcm93XzhfeDg2OwogICAgIGhxZG4zZC0+ZGVub2lzZV9yb3dbOV0gID0gZmZfaHFkbjNkX3Jvd185X3g4NjsKICAgICBocWRuM2QtPmRlbm9pc2Vfcm93WzEwXSA9IGZmX2hxZG4zZF9yb3dfMTBfeDg2OwogICAgIGhxZG4zZC0+ZGVub2lzZV9yb3dbMTZdID0gZmZfaHFkbjNkX3Jvd18xNl94ODY7Ci0jZW5kaWYgLyogSEFWRV9ZQVNNICovCisjZW5kaWYgLyogSEFWRV9YODZBU00gKi8KIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl9pZGV0X2luaXQuYyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9pZGV0X2luaXQuYwppbmRleCAxMTQ3Y2E4Li5jYTE3NWUyIDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci94ODYvdmZfaWRldF9pbml0LmMKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2lkZXRfaW5pdC5jCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKICNpbmNsdWRlICJsaWJhdmZpbHRlci92Zl9pZGV0LmgiCiAKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogCiAvKiBkZWNsYXJlcyBtYWluIGNhbGxhYmxlIGlkZXRfZmlsdGVyX2xpbmVfe21teCxtbXhleHQsc3NlMn0oKSAqLwogI2RlZmluZSBGVU5DX01BSU5fREVDTChLSU5ELCBTUEFOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02OCw3ICs2OCw3IEBACiAjZW5kaWYKIGF2X2NvbGQgdm9pZCBmZl9pZGV0X2luaXRfeDg2KElERVRDb250ZXh0ICppZGV0LCBpbnQgZm9yXzE2YikKIHsKLSNpZiBIQVZFX1lBU00KKyNpZiBIQVZFX1g4NkFTTQogICAgIGNvbnN0IGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKICNpZiBBUkNIX1g4Nl8zMgpAQCAtODMsNSArODMsNSBAQAogICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKICAgICAgICAgaWRldC0+ZmlsdGVyX2xpbmUgPSBmb3JfMTZiID8gKGZmX2lkZXRfZmlsdGVyX2Z1bmMpaWRldF9maWx0ZXJfbGluZV8xNmJpdF9zc2UyIDogaWRldF9maWx0ZXJfbGluZV9zc2UyOwogICAgIH0KLSNlbmRpZiAvLyBIQVZFX1lBU00KKyNlbmRpZiAvLyBIQVZFX1g4NkFTTQogfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX2ludGVybGFjZS5hc20gYi9saWJhdmZpbHRlci94ODYvdmZfaW50ZXJsYWNlLmFzbQppbmRleCBmNzBjNzAwLi5hNmM2NWI4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci94ODYvdmZfaW50ZXJsYWNlLmFzbQorKysgYi9saWJhdmZpbHRlci94ODYvdmZfaW50ZXJsYWNlLmFzbQpAQCAtMyw2ICszLDcgQEAKIDsqCiA7KiBDb3B5cmlnaHQgKEMpIDIwMTQgS2llcmFuIEt1bmh5YSA8a2llcmFua0BvYmUudHY+CiA7KiBDb3B5cmlnaHQgKGMpIDIwMTQgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKzsqIENvcHlyaWdodCAoYykgMjAxNyBUaG9tYXMgTXVuZHQgPHRtdW5kdDc1QGdtYWlsLmNvbT4KIDsqCiA7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiA7KgpAQCAtMjUsMzYgKzI2LDE4OCBAQAogCiBTRUNUSU9OX1JPREFUQQogCitwd180OiB0aW1lcyA4IGR3IDQKKwogU0VDVElPTiAudGV4dAogCi0lbWFjcm8gTE9XUEFTU19MSU5FIDAKLWNnbG9iYWwgbG93cGFzc19saW5lLCA1LCA1LCA3Ci0gICAgYWRkIHIwLCByMQotICAgIGFkZCByMiwgcjEKLSAgICBhZGQgcjMsIHIxCi0gICAgYWRkIHI0LCByMQotICAgIG5lZyByMQorJW1hY3JvIExPV1BBU1MgMQorICAgIGFkZCBkc3RxLCBocQorICAgIGFkZCBzcmNxLCBocQorICAgIGFkZCBtcmVmcSwgc3JjcQorICAgIGFkZCBwcmVmcSwgc3JjcQorICAgIG5lZyBocQogCi0gICAgcGNtcGVxYiBtNiwgbTYKKyAgICBwY21wZXElMSBtNiwgbTYKKworICAgIHRlc3QgaHEsIG1tc2l6ZQorICAgIGplIC5sb29wCisKKyAgICA7cHJvY2VzcyAxICogbW1zaXplCisgICAgbW92dSBtMCwgW21yZWZxK2hxXQorICAgIHBhdmclMSBtMCwgW3ByZWZxK2hxXQorICAgIHB4b3IgbTAsIG02CisgICAgcHhvciBtMiwgbTYsIFtzcmNxK2hxXQorICAgIHBhdmclMSBtMCwgbTIKKyAgICBweG9yIG0wLCBtNgorICAgIG1vdmEgW2RzdHEraHFdLCBtMAorICAgIGFkZCBocSwgbW1zaXplCisgICAgamdlIC5lbmQKIAogLmxvb3A6Ci0gICAgbW92YSBtMCwgW3IzK3IxXQotICAgIG1vdmEgbTEsIFtyMytyMSttbXNpemVdCi0gICAgcGF2Z2IgbTAsIFtyNCtyMV0KLSAgICBwYXZnYiBtMSwgW3I0K3IxK21tc2l6ZV0KKyAgICBtb3Z1IG0wLCBbbXJlZnEraHFdCisgICAgbW92dSBtMSwgW21yZWZxK2hxK21tc2l6ZV0KKyAgICBwYXZnJTEgbTAsIFtwcmVmcStocV0KKyAgICBwYXZnJTEgbTEsIFtwcmVmcStocSttbXNpemVdCiAgICAgcHhvciBtMCwgbTYKICAgICBweG9yIG0xLCBtNgotICAgIHB4b3IgbTIsIG02LCBbcjIrcjFdCi0gICAgcHhvciBtMywgbTYsIFtyMityMSttbXNpemVdCi0gICAgcGF2Z2IgbTAsIG0yCi0gICAgcGF2Z2IgbTEsIG0zCisgICAgcHhvciBtMiwgbTYsIFtzcmNxK2hxXQorICAgIHB4b3IgbTMsIG02LCBbc3JjcStocSttbXNpemVdCisgICAgcGF2ZyUxIG0wLCBtMgorICAgIHBhdmclMSBtMSwgbTMKICAgICBweG9yIG0wLCBtNgogICAgIHB4b3IgbTEsIG02Ci0gICAgbW92YSBbcjArcjFdLCBtMAotICAgIG1vdmEgW3IwK3IxK21tc2l6ZV0sIG0xCisgICAgbW92YSBbZHN0cStocV0sIG0wCisgICAgbW92YSBbZHN0cStocSttbXNpemVdLCBtMQogCi0gICAgYWRkIHIxLCAyKm1tc2l6ZQorICAgIGFkZCBocSwgMiptbXNpemUKICAgICBqbCAubG9vcAorCisuZW5kOgorICAgIFJFUF9SRVQKKyVlbmRtYWNybworCislbWFjcm8gTE9XUEFTU19MSU5FIDAKK2NnbG9iYWwgbG93cGFzc19saW5lLCA1LCA1LCA3LCBkc3QsIGgsIHNyYywgbXJlZiwgcHJlZgorICAgIExPV1BBU1MgYgorCitjZ2xvYmFsIGxvd3Bhc3NfbGluZV8xNiwgNSwgNSwgNywgZHN0LCBoLCBzcmMsIG1yZWYsIHByZWYKKyAgICBzaGwgaHEsIDEKKyAgICBMT1dQQVNTIHcKKyVlbmRtYWNybworCislbWFjcm8gTE9XUEFTU19MSU5FX0NPTVBMRVggMAorY2dsb2JhbCBsb3dwYXNzX2xpbmVfY29tcGxleCwgNSwgNSwgOCwgZHN0LCBoLCBzcmMsIG1yZWYsIHByZWYKKyAgICBweG9yIG03LCBtNworLmxvb3A6CisgICAgbW92dSBtMCwgW3NyY3ErbXJlZnFdCisgICAgbW92dSBtMiwgW3NyY3ErcHJlZnFdCisgICAgbW92YSBtMSwgbTAKKyAgICBtb3ZhIG0zLCBtMgorICAgIHB1bnBja2xidyBtMCwgbTcKKyAgICBwdW5wY2tsYncgbTIsIG03CisgICAgcHVucGNraGJ3IG0xLCBtNworICAgIHB1bnBja2hidyBtMywgbTcKKyAgICBwYWRkdyBtMCwgbTIKKyAgICBwYWRkdyBtMSwgbTMKKyAgICBtb3ZhIG02LCBtMAorICAgIG1vdmEgbTUsIG0xCisgICAgbW92dSBtMiwgW3NyY3FdCisgICAgbW92YSBtMywgbTIKKyAgICBwdW5wY2tsYncgbTIsIG03CisgICAgcHVucGNraGJ3IG0zLCBtNworICAgIHBhZGR3IG0wLCBtMgorICAgIHBhZGR3IG0xLCBtMworICAgIHBzbGx3IG0yLCAxCisgICAgcHNsbHcgbTMsIDEKKyAgICBwYWRkdyBtMCwgbTIKKyAgICBwYWRkdyBtMSwgbTMKKyAgICBwc2xsdyBtMCwgMQorICAgIHBzbGx3IG0xLCAxCisgICAgcGNtcGd0dyBtNiwgbTIKKyAgICBwY21wZ3R3IG01LCBtMworICAgIHBhY2tzc3diIG02LCBtNQorICAgIG1vdnUgbTIsIFtzcmNxK21yZWZxKjJdCisgICAgbW92dSBtNCwgW3NyY3ErcHJlZnEqMl0KKyAgICBtb3ZhIG0zLCBtMgorICAgIG1vdmEgbTUsIG00CisgICAgcHVucGNrbGJ3IG0yLCBtNworICAgIHB1bnBja2xidyBtNCwgbTcKKyAgICBwdW5wY2toYncgbTMsIG03CisgICAgcHVucGNraGJ3IG01LCBtNworICAgIHBhZGR3IG0yLCBtNAorICAgIHBhZGR3IG0zLCBtNQorICAgIHBhZGR3IG0wLCBbcHdfNF0KKyAgICBwYWRkdyBtMSwgW3B3XzRdCisgICAgcHN1YnVzdyBtMCwgbTIKKyAgICBwc3VidXN3IG0xLCBtMworICAgIHBzcmx3IG0wLCAzCisgICAgcHNybHcgbTEsIDMKKyAgICBwYWNrdXN3YiBtMCwgbTEKKyAgICBtb3ZhIG0xLCBtMAorICAgIG1vdnUgbTIsIFtzcmNxXQorICAgIHBtYXh1YiBtMCwgbTIKKyAgICBwbWludWIgbTEsIG0yCisgICAgcGFuZCBtMCwgbTYKKyAgICBwYW5kbiBtNiwgbTEKKyAgICBwb3IgbTAsIG02CisgICAgbW92YSBbZHN0cV0sIG0wCisKKyAgICBhZGQgZHN0cSwgbW1zaXplCisgICAgYWRkIHNyY3EsIG1tc2l6ZQorICAgIHN1YiBoZCwgbW1zaXplCisgICAgamcgLmxvb3AKK1JFUF9SRVQKKworY2dsb2JhbCBsb3dwYXNzX2xpbmVfY29tcGxleF8xMiwgNSwgNSwgOCwgMTYsIGRzdCwgaCwgc3JjLCBtcmVmLCBwcmVmLCBjbGlwX21heAorICAgIG1vdmQgbTcsIERXT1JEIGNsaXBfbWF4bQorICAgIFNQTEFUVyBtNywgbTcsIDAKKyAgICBtb3Z1IFtyc3BdLCBtNworLmxvb3A6CisgICAgbW92dSBtMCwgW3NyY3ErbXJlZnFdCisgICAgbW92dSBtMSwgW3NyY3ErbXJlZnErbW1zaXplXQorICAgIG1vdnUgbTIsIFtzcmNxK3ByZWZxXQorICAgIG1vdnUgbTMsIFtzcmNxK3ByZWZxK21tc2l6ZV0KKyAgICBwYWRkdyBtMCwgbTIKKyAgICBwYWRkdyBtMSwgbTMKKyAgICBtb3ZhIG02LCBtMAorICAgIG1vdmEgbTcsIG0xCisgICAgbW92dSBtMiwgW3NyY3FdCisgICAgbW92dSBtMywgW3NyY3ErbW1zaXplXQorICAgIHBhZGR3IG0wLCBtMgorICAgIHBhZGR3IG0xLCBtMworICAgIHBzbGx3IG0yLCAxCisgICAgcHNsbHcgbTMsIDEKKyAgICBwYWRkdyBtMCwgbTIKKyAgICBwYWRkdyBtMSwgbTMKKyAgICBwc2xsdyBtMCwgMQorICAgIHBzbGx3IG0xLCAxCisgICAgcGNtcGd0dyBtNiwgbTIKKyAgICBwY21wZ3R3IG03LCBtMworICAgIG1vdnUgbTIsIFtzcmNxKzIqbXJlZnFdCisgICAgbW92dSBtMywgW3NyY3ErMiptcmVmcSttbXNpemVdCisgICAgbW92dSBtNCwgW3NyY3ErMipwcmVmcV0KKyAgICBtb3Z1IG01LCBbc3JjcSsyKnByZWZxK21tc2l6ZV0KKyAgICBwYWRkdyBtMiwgbTQKKyAgICBwYWRkdyBtMywgbTUKKyAgICBwYWRkdyBtMCwgW3B3XzRdCisgICAgcGFkZHcgbTEsIFtwd180XQorICAgIHBzdWJ1c3cgbTAsIG0yCisgICAgcHN1YnVzdyBtMSwgbTMKKyAgICBwc3JsdyBtMCwgMworICAgIHBzcmx3IG0xLCAzCisgICAgcG1pbnN3IG0wLCBbcnNwXQorICAgIHBtaW5zdyBtMSwgW3JzcF0KKyAgICBtb3ZhIG0yLCBtMAorICAgIG1vdmEgbTMsIG0xCisgICAgbW92dSBtNCwgW3NyY3FdCisgICAgcG1heHN3IG0wLCBtNAorICAgIHBtaW5zdyBtMiwgbTQKKyAgICBtb3Z1IG00LCBbc3JjcSArIG1tc2l6ZV0KKyAgICBwbWF4c3cgbTEsIG00CisgICAgcG1pbnN3IG0zLCBtNAorICAgIHBhbmQgbTAsIG02CisgICAgcGFuZCBtMSwgbTcKKyAgICBwYW5kbiBtNiwgbTIKKyAgICBwYW5kbiBtNywgbTMKKyAgICBwb3IgbTAsIG02CisgICAgcG9yIG0xLCBtNworICAgIG1vdmEgW2RzdHFdLCBtMAorICAgIG1vdmEgW2RzdHErbW1zaXplXSwgbTEKKworICAgIGFkZCBkc3RxLCAyKm1tc2l6ZQorICAgIGFkZCBzcmNxLCAyKm1tc2l6ZQorICAgIHN1YiBoZCwgbW1zaXplCisgICAgamcgLmxvb3AKIFJFUF9SRVQKICVlbmRtYWNybwogCkBAIC02MywzICsyMTYsMTEgQEAKIAogSU5JVF9YTU0gYXZ4CiBMT1dQQVNTX0xJTkUKKworJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorTE9XUEFTU19MSU5FCislZW5kaWYKKworSU5JVF9YTU0gc3NlMgorTE9XUEFTU19MSU5FX0NPTVBMRVgKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl9pbnRlcmxhY2VfaW5pdC5jIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2ludGVybGFjZV9pbml0LmMKaW5kZXggNjhlZTQ3ZC4uMGRlMGZlYSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L3ZmX2ludGVybGFjZV9pbml0LmMKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2ludGVybGFjZV9pbml0LmMKQEAgLTIyLDI2ICsyMiw2NyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgogCiAjaW5jbHVkZSAibGliYXZmaWx0ZXIvaW50ZXJsYWNlLmgiCiAKIHZvaWQgZmZfbG93cGFzc19saW5lX3NzZTIodWludDhfdCAqZHN0cCwgcHRyZGlmZl90IGxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwX2Fib3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwX2JlbG93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCwgcHRyZGlmZl90IG1yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwcmVmLCBpbnQgY2xpcF9tYXgpOwogdm9pZCBmZl9sb3dwYXNzX2xpbmVfYXZ4ICh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYWJvdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3BfYmVsb3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLCBwdHJkaWZmX3QgbXJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCk7Cit2b2lkIGZmX2xvd3Bhc3NfbGluZV9hdngyICh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsIHB0cmRpZmZfdCBtcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KTsKIAotYXZfY29sZCB2b2lkIGZmX2ludGVybGFjZV9pbml0X3g4NihJbnRlcmxhY2VDb250ZXh0ICpzKQordm9pZCBmZl9sb3dwYXNzX2xpbmVfMTZfc3NlMih1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsIHB0cmRpZmZfdCBtcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KTsKK3ZvaWQgZmZfbG93cGFzc19saW5lXzE2X2F2eCAodWludDhfdCAqZHN0cCwgcHRyZGlmZl90IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLCBwdHJkaWZmX3QgbXJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCk7Cit2b2lkIGZmX2xvd3Bhc3NfbGluZV8xNl9hdngyICh1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsIHB0cmRpZmZfdCBtcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KTsKKwordm9pZCBmZl9sb3dwYXNzX2xpbmVfY29tcGxleF9zc2UyKHVpbnQ4X3QgKmRzdHAsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLCBwdHJkaWZmX3QgbXJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KTsKKwordm9pZCBmZl9sb3dwYXNzX2xpbmVfY29tcGxleF8xMl9zc2UyKHVpbnQ4X3QgKmRzdHAsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLCBwdHJkaWZmX3QgbXJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KTsKKworYXZfY29sZCB2b2lkIGZmX2ludGVybGFjZV9pbml0X3g4NihJbnRlcmxhY2VDb250ZXh0ICpzLCBpbnQgZGVwdGgpCiB7CiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKIAotICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpCi0gICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV9zc2UyOwotICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkKLSAgICAgICAgcy0+bG93cGFzc19saW5lID0gZmZfbG93cGFzc19saW5lX2F2eDsKKyAgICBpZiAoZGVwdGggPiA4KSB7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGlmIChzLT5sb3dwYXNzID09IFZMUEZfTElOKQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV8xNl9zc2UyOworICAgICAgICAgICAgZWxzZSBpZiAocy0+bG93cGFzcyA9PSBWTFBGX0NNUCkKKyAgICAgICAgICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBmZl9sb3dwYXNzX2xpbmVfY29tcGxleF8xMl9zc2UyOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIGlmIChzLT5sb3dwYXNzID09IFZMUEZfTElOKQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV8xNl9hdng7CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIGlmIChzLT5sb3dwYXNzID09IFZMUEZfTElOKQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV8xNl9hdngyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIGlmIChzLT5sb3dwYXNzID09IFZMUEZfTElOKQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV9zc2UyOworICAgICAgICAgICAgZWxzZSBpZiAocy0+bG93cGFzcyA9PSBWTFBGX0NNUCkKKyAgICAgICAgICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBmZl9sb3dwYXNzX2xpbmVfY29tcGxleF9zc2UyOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIGlmIChzLT5sb3dwYXNzID09IFZMUEZfTElOKQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV9hdng7CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkKKyAgICAgICAgICAgIGlmIChzLT5sb3dwYXNzID09IFZMUEZfTElOKQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV9hdngyOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl9saW1pdGVyLmFzbSBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9saW1pdGVyLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWI5YjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2xpbWl0ZXIuYXNtCkBAIC0wLDAgKzEsODAgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorOyogeDg2LW9wdGltaXplZCBmdW5jdGlvbnMgZm9yIGxpbWl0ZXIgZmlsdGVyCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCitJTklUX1hNTSBzc2UyCisKK2NnbG9iYWwgbGltaXRlcl84Yml0LCA2LCA3LCAzLCBzcmMsIGRzdCwgc2xpbmVzaXplLCBkbGluZXNpemUsIHcsIGgsIHgKKyAgICBtb3ZzeGRpZm5pZG4gd3EsIHdkCisgICAgYWRkICAgICAgICBzcmNxLCB3cQorICAgIGFkZCAgICAgICAgZHN0cSwgd3EKKyAgICBuZWcgICAgICAgICAgd3EKKyAgICBtb3ZkICAgICAgICAgbTEsIHI2bQorICAgIHB1bnBja2xidyAgICBtMSwgbTEKKyAgICBTUExBVFcgICAgICAgbTEsIG0xCisgICAgbW92ZCAgICAgICAgIG0yLCByN20KKyAgICBwdW5wY2tsYncgICAgbTIsIG0yCisgICAgU1BMQVRXICAgICAgIG0yLCBtMgorLm5leHRyb3c6CisgICAgbW92ICAgICAgICAgIHhxLCB3cQorCisgICAgLmxvb3A6CisgICAgICAgIG1vdnUgICAgICAgICAgIG0wLCBbc3JjcSArIHhxXQorICAgICAgICBDTElQVUIgICAgICAgICBtMCwgbTEsIG0yCisgICAgICAgIG1vdmEgICAgW2RzdHEreHFdLCBtMAorICAgICAgICBhZGQgICAgICAgICAgICB4cSwgbW1zaXplCisgICAgamwgLmxvb3AKKworICAgIGFkZCAgICAgICAgc3JjcSwgc2xpbmVzaXplcQorICAgIGFkZCAgICAgICAgZHN0cSwgZGxpbmVzaXplcQorICAgIHN1YiAgICAgICAgaGQsIDEKKyAgICBqZyAubmV4dHJvdworICAgIFJFVAorCitJTklUX1hNTSBzc2U0CisKK2NnbG9iYWwgbGltaXRlcl8xNmJpdCwgNiwgNywgMywgc3JjLCBkc3QsIHNsaW5lc2l6ZSwgZGxpbmVzaXplLCB3LCBoLCB4CisgICAgc2hsICAgICAgICAgIHdkLCAxCisgICAgYWRkICAgICAgICBzcmNxLCB3cQorICAgIGFkZCAgICAgICAgZHN0cSwgd3EKKyAgICBuZWcgICAgICAgICAgd3EKKyAgICBtb3ZkICAgICAgICAgbTEsIHI2bQorICAgIFNQTEFUVyAgICAgICBtMSwgbTEKKyAgICBtb3ZkICAgICAgICAgbTIsIHI3bQorICAgIFNQTEFUVyAgICAgICBtMiwgbTIKKy5uZXh0cm93OgorICAgIG1vdiAgICAgICAgICB4cSwgd3EKKworICAgIC5sb29wOgorICAgICAgICBtb3Z1ICAgICAgICAgICBtMCwgW3NyY3EgKyB4cV0KKyAgICAgICAgcG1heHV3ICAgICAgICAgbTAsIG0xCisgICAgICAgIHBtaW51dyAgICAgICAgIG0wLCBtMgorICAgICAgICBtb3ZhICAgIFtkc3RxK3hxXSwgbTAKKyAgICAgICAgYWRkICAgICAgICAgICAgeHEsIG1tc2l6ZQorICAgIGpsIC5sb29wCisKKyAgICBhZGQgICAgICAgIHNyY3EsIHNsaW5lc2l6ZXEKKyAgICBhZGQgICAgICAgIGRzdHEsIGRsaW5lc2l6ZXEKKyAgICBzdWIgICAgICAgIGhkLCAxCisgICAgamcgLm5leHRyb3cKKyAgICBSRVQKZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl9saW1pdGVyX2luaXQuYyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9saW1pdGVyX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M3MzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX2xpbWl0ZXJfaW5pdC5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9saW1pdGVyLmgiCisKK3ZvaWQgZmZfbGltaXRlcl84Yml0X3NzZTIoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IG1pbiwgaW50IG1heCk7Cit2b2lkIGZmX2xpbWl0ZXJfMTZiaXRfc3NlNChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzbGluZXNpemUsIHB0cmRpZmZfdCBkbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBtaW4sIGludCBtYXgpOworCit2b2lkIGZmX2xpbWl0ZXJfaW5pdF94ODYoTGltaXRlckRTUENvbnRleHQgKmRzcCwgaW50IGJwcCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoYnBwIDw9IDgpIHsKKyAgICAgICAgICAgIGRzcC0+bGltaXRlciA9IGZmX2xpbWl0ZXJfOGJpdF9zc2UyOworICAgICAgICB9CisgICAgfQorICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYgKGJwcCA+IDgpIHsKKyAgICAgICAgICAgIGRzcC0+bGltaXRlciA9IGZmX2xpbWl0ZXJfMTZiaXRfc3NlNDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl9ub2lzZS5jIGIvbGliYXZmaWx0ZXIveDg2L3ZmX25vaXNlLmMKaW5kZXggMGE4NmNiMC4uZjdhNGQwMCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L3ZmX25vaXNlLmMKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX25vaXNlLmMKQEAgLTMyLDIyICszMiwyMiBAQAogICAgIG5vaXNlICs9IHNoaWZ0OwogCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJtb3YgJTMsICUlIlJFR19hIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICUzLCAlJSJGRl9SRUdfYSIgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInBjbXBlcWIgJSVtbTcsICUlbW03ICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwc2xsdyAkMTUsICUlbW03ICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicGFja3Nzd2IgJSVtbTcsICUlbW03ICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiksICUlbW0wICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTEsICUlIkZGX1JFR19hIiksICUlbW0xICBcblx0IgogICAgICAgICAgICAgInB4b3IgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwYWRkc2IgJSVtbTEsICUlbW0wICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicHhvciAlJW1tNywgJSVtbTAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgJSVtbTAsICglMiwgJSUiUkVHX2EiKSAgICAgXG5cdCIKLSAgICAgICAgICAgICJhZGQgJDgsICUlIlJFR19hIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMCwgKCUyLCAlJSJGRl9SRUdfYSIpICBcblx0IgorICAgICAgICAgICAgImFkZCAkOCwgJSUiRkZfUkVHX2EiICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICIganMgMWIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiAiciIgKHNyYyttbXhfbGVuKSwgInIiIChub2lzZSttbXhfbGVuKSwgInIiIChkc3QrbW14X2xlbiksICJnIiAoLW1teF9sZW4pCi0gICAgICAgICAgICA6ICIlIlJFR19hCisgICAgICAgICAgICA6ICIlIkZGX1JFR19hCiAgICAgKTsKICAgICBpZiAobW14X2xlbiAhPSBsZW4pCiAgICAgICAgIGZmX2xpbmVfbm9pc2VfYyhkc3QrbW14X2xlbiwgc3JjK21teF9sZW4sIG5vaXNlK21teF9sZW4sIGxlbi1tbXhfbGVuLCAwKTsKQEAgLTYwLDEzICs2MCwxMyBAQAogICAgIHg4Nl9yZWcgbW14X2xlbiA9IGxlbiAmICh+Nyk7CiAKICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAlNSwgJSUiUkVHX2EiICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAlNSwgJSUiRkZfUkVHX2EiICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIi5wMmFsaWduIDQgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMCAgICBcblx0IgotICAgICAgICAgICAgInBhZGRiICglMiwgJSUiUkVHX2EiKSwgJSVtbTEgICBcblx0IgotICAgICAgICAgICAgInBhZGRiICglMywgJSUiUkVHX2EiKSwgJSVtbTEgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMSBcblx0IgorICAgICAgICAgICAgIm1vdnEgKCUwLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCBcblx0IgorICAgICAgICAgICAgInBhZGRiICglMiwgJSUiRkZfUkVHX2EiKSwgJSVtbTFcblx0IgorICAgICAgICAgICAgInBhZGRiICglMywgJSUiRkZfUkVHX2EiKSwgJSVtbTFcblx0IgogICAgICAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0zICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAlJW1tMCwgJSVtbTAgICAgICAgICBcblx0IgpAQCAtODIsMTIgKzgyLDEyIEBACiAgICAgICAgICAgICAicHNybHcgJDgsICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicHNybHcgJDgsICUlbW0zICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicGFja3Vzd2IgJSVtbTMsICUlbW0xICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAlJW1tMSwgKCU0LCAlJSJSRUdfYSIpICAgIFxuXHQiCi0gICAgICAgICAgICAiYWRkICQ4LCAlJSJSRUdfYSIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAlJW1tMSwgKCU0LCAlJSJGRl9SRUdfYSIpIFxuXHQiCisgICAgICAgICAgICAiYWRkICQ4LCAlJSJGRl9SRUdfYSIgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAiIGpzIDFiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiAiciIgKHNyYyttbXhfbGVuKSwgInIiIChzaGlmdFswXSttbXhfbGVuKSwgInIiIChzaGlmdFsxXSttbXhfbGVuKSwgInIiIChzaGlmdFsyXSttbXhfbGVuKSwKICAgICAgICAgICAgICAgICJyIiAoZHN0K21teF9sZW4pLCAiZyIgKC1tbXhfbGVuKQotICAgICAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICAgICAgOiAiJSJGRl9SRUdfYQogICAgICAgICApOwogCiAgICAgaWYgKG1teF9sZW4gIT0gbGVuKXsKQEAgLTEwNCwyMiArMTA0LDIyIEBACiAgICAgbm9pc2UgKz0gc2hpZnQ7CiAKICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAlMywgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICUzLCAlJSJGRl9SRUdfYSIgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwY21wZXFiICUlbW03LCAlJW1tNyAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInBzbGx3ICQxNSwgJSVtbTcgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicGFja3Nzd2IgJSVtbTcsICUlbW03ICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICIucDJhbGlnbiA0ICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiksICUlbW0wICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2EiKSwgJSVtbTEgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgKCUwLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJTEsICUlIkZGX1JFR19hIiksICUlbW0xICAgXG5cdCIKICAgICAgICAgICAgICJweG9yICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInBhZGRzYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicHhvciAlJW1tNywgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZudHEgJSVtbTAsICglMiwgJSUiUkVHX2EiKSAgICBcblx0IgotICAgICAgICAgICAgImFkZCAkOCwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92bnRxICUlbW0wLCAoJTIsICUlIkZGX1JFR19hIikgXG5cdCIKKyAgICAgICAgICAgICJhZGQgJDgsICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIiBqcyAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiAiciIgKHNyYyttbXhfbGVuKSwgInIiIChub2lzZSttbXhfbGVuKSwgInIiIChkc3QrbW14X2xlbiksICJnIiAoLW1teF9sZW4pCi0gICAgICAgICAgICA6ICIlIlJFR19hCisgICAgICAgICAgICA6ICIlIkZGX1JFR19hCiAgICAgICAgICAgICApOwogICAgIGlmIChtbXhfbGVuICE9IGxlbikKICAgICAgICAgZmZfbGluZV9ub2lzZV9jKGRzdCttbXhfbGVuLCBzcmMrbW14X2xlbiwgbm9pc2UrbW14X2xlbiwgbGVuLW1teF9sZW4sIDApOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX3B1bGx1cF9pbml0LmMgYi9saWJhdmZpbHRlci94ODYvdmZfcHVsbHVwX2luaXQuYwppbmRleCA1YjM2YjY4Li4zZGMwNzk4IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci94ODYvdmZfcHVsbHVwX2luaXQuYworKysgYi9saWJhdmZpbHRlci94ODYvdmZfcHVsbHVwX2luaXQuYwpAQCAtMjksNyArMjksNyBAQAogCiBhdl9jb2xkIHZvaWQgZmZfcHVsbHVwX2luaXRfeDg2KFB1bGx1cENvbnRleHQgKnMpCiB7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKEVYVEVSTkFMX01NWChjcHVfZmxhZ3MpKSB7CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYvdmZfc3BwLmMgYi9saWJhdmZpbHRlci94ODYvdmZfc3BwLmMKaW5kZXggNDVhOWViMC4uN2Q1ZGE2MSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L3ZmX3NwcC5jCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl9zcHAuYwpAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2FzbS5oIgogI2luY2x1ZGUgImxpYmF2ZmlsdGVyL3ZmX3NwcC5oIgpAQCAtMjIzLDEwICsyMjQsMTUgQEAKICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogCiAgICAgaWYgKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX01NWCkgeworICAgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbW14X2lkY3RfcGVybV9jcmMgPSAweGU1ZThhZGM0OworICAgICAgICB1aW50MzJfdCBpZGN0X3Blcm1fY3JjID0KKyAgICAgICAgICAgIGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18zMl9JRUVFKSwgMCwKKyAgICAgICAgICAgICAgICAgICBzLT5kY3QtPmlkY3RfcGVybXV0YXRpb24sCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHMtPmRjdC0+aWRjdF9wZXJtdXRhdGlvbikpOwogICAgICAgICBpbnQ2NF90IGJwczsKICAgICAgICAgcy0+c3RvcmVfc2xpY2UgPSBzdG9yZV9zbGljZV9tbXg7CiAgICAgICAgIGF2X29wdF9nZXRfaW50KHMtPmRjdCwgImJpdHNfcGVyX3NhbXBsZSIsIDAsICZicHMpOwotICAgICAgICBpZiAoYnBzIDw9IDgpIHsKKyAgICAgICAgaWYgKGJwcyA8PSA4ICYmIGlkY3RfcGVybV9jcmMgPT0gbW14X2lkY3RfcGVybV9jcmMpIHsKICAgICAgICAgICAgIHN3aXRjaCAocy0+bW9kZSkgewogICAgICAgICAgICAgY2FzZSAwOiBzLT5yZXF1YW50aXplID0gaGFyZHRocmVzaF9tbXg7IGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxOiBzLT5yZXF1YW50aXplID0gc29mdHRocmVzaF9tbXg7IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX3RocmVzaG9sZC5hc20gYi9saWJhdmZpbHRlci94ODYvdmZfdGhyZXNob2xkLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTgwNjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX3RocmVzaG9sZC5hc20KQEAgLTAsMCArMSw5MiBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiB4ODYtb3B0aW1pemVkIGZ1bmN0aW9ucyBmb3IgdGhyZXNob2xkIGZpbHRlcgorOyoKKzsqIENvcHlyaWdodCAoQykgMjAxNyBQYXVsIEIgTWFob2wKKzsqCis7KiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCis7KgorOyogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorOyogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCis7KiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzsqCis7KiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzsqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorOyogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzsqCis7KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCis7KiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCis7KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCis7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworJWluY2x1ZGUgImxpYmF2dXRpbC94ODYveDg2dXRpbC5hc20iCisKK1NFQ1RJT05fUk9EQVRBCisKK3BiXzEyODogdGltZXMgMTYgZGIgMTI4CitwYl8xMjhfMCA6IHRpbWVzIDggZGIgMCwgMTI4CisKK1NFQ1RJT04gLnRleHQKKworOyUxIGRlcHRoICg4IG9yIDE2KSA7ICUyIGIgb3IgdyA7ICUzIGNvbnN0YW50CislbWFjcm8gVEhSRVNIT0xEIDMKKyVpZiBBUkNIX1g4Nl82NAorY2dsb2JhbCB0aHJlc2hvbGQlMSwgMTAsIDEzLCA1LCBpbiwgdGhyZXNob2xkLCBtaW4sIG1heCwgb3V0LCBpbGluZXNpemUsIHRsaW5lc2l6ZSwgZmxpbmVzaXplLCBzbGluZXNpemUsIG9saW5lc2l6ZSwgdywgaCwgeAorICAgIG1vdiAgICAgICAgICAgICB3ZCwgZHdvcmQgd20KKyAgICBtb3YgICAgICAgICAgICAgaGQsIGR3b3JkIGhtCislZWxzZQorY2dsb2JhbCB0aHJlc2hvbGQlMSwgNSwgNywgNSwgaW4sIHRocmVzaG9sZCwgbWluLCBtYXgsIG91dCwgdywgeAorICAgIG1vdiAgICAgICAgICAgICB3ZCwgcjEwbQorJWRlZmluZSAgICAgaWxpbmVzaXplcSAgcjVtcAorJWRlZmluZSAgICAgdGxpbmVzaXplcSAgcjZtcAorJWRlZmluZSAgICAgZmxpbmVzaXplcSAgcjdtcAorJWRlZmluZSAgICAgc2xpbmVzaXplcSAgcjhtcAorJWRlZmluZSAgICAgb2xpbmVzaXplcSAgcjltcAorJWRlZmluZSAgICAgICAgICAgICBoZCAgcjExbXAKKyVlbmRpZgorICAgIFZCUk9BRENBU1RJMTI4ICBtNCwgWyUzXQorJWlmICUxID09IDE2CisgICAgYWRkICAgICAgICAgICAgIHdxLCB3cSA7IHcgKj0gMiAoMTYgYml0cyBpbnN0ZWFkIG9mIDgpCislZW5kaWYKKyAgICBhZGQgICAgICAgICAgICBpbnEsIHdxCisgICAgYWRkICAgICB0aHJlc2hvbGRxLCB3cQorICAgIGFkZCAgICAgICAgICAgbWlucSwgd3EKKyAgICBhZGQgICAgICAgICAgIG1heHEsIHdxCisgICAgYWRkICAgICAgICAgICBvdXRxLCB3cQorICAgIG5lZyAgICAgICAgICAgICB3cQorLm5leHRyb3c6CisgICAgbW92ICAgICAgICAgeHEsIHdxCisKKyAgICAubG9vcDoKKyAgICAgICAgbW92dSAgICAgICAgICAgIG0xLCBbaW5xICsgeHFdCisgICAgICAgIG1vdnUgICAgICAgICAgICBtMCwgW3RocmVzaG9sZHEgKyB4cV0KKyAgICAgICAgbW92dSAgICAgICAgICAgIG0yLCBbbWlucSArIHhxXQorICAgICAgICBtb3Z1ICAgICAgICAgICAgbTMsIFttYXhxICsgeHFdCisgICAgICAgIHB4b3IgICAgICAgICAgICBtMCwgbTQKKyAgICAgICAgcHhvciAgICAgICAgICAgIG0xLCBtNAorICAgICAgICBwY21wZ3QlMiAgICAgICAgbTAsIG0xCisgICAgICAgIFBCTEVORFZCICAgICAgICBtMywgbTIsIG0wCisgICAgICAgIG1vdnUgICBbb3V0cSArIHhxXSwgbTMKKyAgICAgICAgYWRkICAgICAgICAgICAgIHhxLCBtbXNpemUKKyAgICBqbCAubG9vcAorCisgICAgYWRkICAgICAgICAgIGlucSwgaWxpbmVzaXplcQorICAgIGFkZCAgIHRocmVzaG9sZHEsIHRsaW5lc2l6ZXEKKyAgICBhZGQgICAgICAgICBtaW5xLCBmbGluZXNpemVxCisgICAgYWRkICAgICAgICAgbWF4cSwgc2xpbmVzaXplcQorICAgIGFkZCAgICAgICAgIG91dHEsIG9saW5lc2l6ZXEKKyAgICBzdWIgICAgICAgICBoZCwgMQorICAgIGpnIC5uZXh0cm93CitSRVQKKyVlbmRtYWNybworCitJTklUX1hNTSBzc2U0CitUSFJFU0hPTEQgOCwgYiwgcGJfMTI4CitUSFJFU0hPTEQgMTYsIHcsIHBiXzEyOF8wCisKKyVpZiBIQVZFX0FWWDJfRVhURVJOQUwKK0lOSVRfWU1NIGF2eDIKK1RIUkVTSE9MRCA4LCBiLCBwYl8xMjgKK1RIUkVTSE9MRCAxNiwgdywgcGJfMTI4XzAKKyVlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX3RocmVzaG9sZF9pbml0LmMgYi9saWJhdmZpbHRlci94ODYvdmZfdGhyZXNob2xkX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTQyMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX3RocmVzaG9sZF9pbml0LmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvY3B1LmgiCisjaW5jbHVkZSAibGliYXZmaWx0ZXIvdGhyZXNob2xkLmgiCisKKyNkZWZpbmUgVEhSRVNIT0xEX0ZVTkMoZGVwdGgsIG9wdCkgXAordm9pZCBmZl90aHJlc2hvbGQjI2RlcHRoIyNfIyNvcHQoY29uc3QgdWludDhfdCAqaW4sIGNvbnN0IHVpbnQ4X3QgKnRocmVzaG9sZCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm1pbiwgY29uc3QgdWludDhfdCAqbWF4LCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGlsaW5lc2l6ZSwgcHRyZGlmZl90IHRsaW5lc2l6ZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBmbGluZXNpemUsIHB0cmRpZmZfdCBzbGluZXNpemUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgb2xpbmVzaXplLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKTsKKworVEhSRVNIT0xEX0ZVTkMoOCwgc3NlNCkKK1RIUkVTSE9MRF9GVU5DKDgsIGF2eDIpCitUSFJFU0hPTERfRlVOQygxNiwgc3NlNCkKK1RIUkVTSE9MRF9GVU5DKDE2LCBhdngyKQorCithdl9jb2xkIHZvaWQgZmZfdGhyZXNob2xkX2luaXRfeDg2KFRocmVzaG9sZENvbnRleHQgKnMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChzLT5kZXB0aCA9PSA4KSB7CisgICAgICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIHMtPnRocmVzaG9sZCA9IGZmX3RocmVzaG9sZDhfc3NlNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIHMtPnRocmVzaG9sZCA9IGZmX3RocmVzaG9sZDhfYXZ4MjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocy0+ZGVwdGggPT0gMTYpIHsKKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTQoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgcy0+dGhyZXNob2xkID0gZmZfdGhyZXNob2xkMTZfc3NlNDsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKKyAgICAgICAgICAgIHMtPnRocmVzaG9sZCA9IGZmX3RocmVzaG9sZDE2X2F2eDI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYvdmZfdGludGVybGFjZV9pbml0LmMgYi9saWJhdmZpbHRlci94ODYvdmZfdGludGVybGFjZV9pbml0LmMKaW5kZXggZGRiMGNjZS4uMmM5YjFkZSAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L3ZmX3RpbnRlcmxhY2VfaW5pdC5jCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl90aW50ZXJsYWNlX2luaXQuYwpAQCAtMjgsMjAgKzI4LDY2IEBACiAjaW5jbHVkZSAibGliYXZmaWx0ZXIvdGludGVybGFjZS5oIgogCiB2b2lkIGZmX2xvd3Bhc3NfbGluZV9zc2UyKHVpbnQ4X3QgKmRzdHAsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9hYm92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcF9iZWxvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY3AsIHB0cmRpZmZfdCBtcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgcHJlZiwgaW50IGNsaXBfbWF4KTsKIHZvaWQgZmZfbG93cGFzc19saW5lX2F2eCAodWludDhfdCAqZHN0cCwgcHRyZGlmZl90IGxpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwX2Fib3ZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwX2JlbG93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCwgcHRyZGlmZl90IG1yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwcmVmLCBpbnQgY2xpcF9tYXgpOwordm9pZCBmZl9sb3dwYXNzX2xpbmVfYXZ4MiAodWludDhfdCAqZHN0cCwgcHRyZGlmZl90IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLCBwdHJkaWZmX3QgbXJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCk7CisKK3ZvaWQgZmZfbG93cGFzc19saW5lXzE2X3NzZTIodWludDhfdCAqZHN0cCwgcHRyZGlmZl90IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLCBwdHJkaWZmX3QgbXJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCk7Cit2b2lkIGZmX2xvd3Bhc3NfbGluZV8xNl9hdnggKHVpbnQ4X3QgKmRzdHAsIHB0cmRpZmZfdCBsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCwgcHRyZGlmZl90IG1yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBwcmVmLCBpbnQgY2xpcF9tYXgpOwordm9pZCBmZl9sb3dwYXNzX2xpbmVfMTZfYXZ4MiAodWludDhfdCAqZHN0cCwgcHRyZGlmZl90IGxpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNwLCBwdHJkaWZmX3QgbXJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCk7CisKK3ZvaWQgZmZfbG93cGFzc19saW5lX2NvbXBsZXhfc3NlMih1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCwgcHRyZGlmZl90IG1yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCk7CisKK3ZvaWQgZmZfbG93cGFzc19saW5lX2NvbXBsZXhfMTJfc3NlMih1aW50OF90ICpkc3RwLCBwdHJkaWZmX3QgbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjcCwgcHRyZGlmZl90IG1yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHByZWYsIGludCBjbGlwX21heCk7CiAKIGF2X2NvbGQgdm9pZCBmZl90aW50ZXJsYWNlX2luaXRfeDg2KFRJbnRlcmxhY2VDb250ZXh0ICpzKQogewogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKLSAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKQotICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBmZl9sb3dwYXNzX2xpbmVfc3NlMjsKLSAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpCi0gICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV9hdng7CisgICAgaWYgKHMtPmNzcC0+Y29tcFswXS5kZXB0aCA+IDgpIHsKKyAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBUSU5URVJMQUNFX0ZMQUdfQ1ZMUEYpKQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV8xNl9zc2UyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV9jb21wbGV4XzEyX3NzZTI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEVYVEVSTkFMX0FWWChjcHVfZmxhZ3MpKQorICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBUSU5URVJMQUNFX0ZMQUdfQ1ZMUEYpKQorICAgICAgICAgICAgICAgIHMtPmxvd3Bhc3NfbGluZSA9IGZmX2xvd3Bhc3NfbGluZV8xNl9hdng7CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlgyX0ZBU1QoY3B1X2ZsYWdzKSkgeworICAgICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBUSU5URVJMQUNFX0ZMQUdfQ1ZMUEYpKSB7CisgICAgICAgICAgICAgICAgcy0+bG93cGFzc19saW5lID0gZmZfbG93cGFzc19saW5lXzE2X2F2eDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIFRJTlRFUkxBQ0VfRkxBR19DVkxQRikpCisgICAgICAgICAgICAgICAgcy0+bG93cGFzc19saW5lID0gZmZfbG93cGFzc19saW5lX3NzZTI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcy0+bG93cGFzc19saW5lID0gZmZfbG93cGFzc19saW5lX2NvbXBsZXhfc3NlMjsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfQVZYKGNwdV9mbGFncykpCisgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIFRJTlRFUkxBQ0VfRkxBR19DVkxQRikpCisgICAgICAgICAgICAgICAgcy0+bG93cGFzc19saW5lID0gZmZfbG93cGFzc19saW5lX2F2eDsKKyAgICAgICAgaWYgKEVYVEVSTkFMX0FWWDJfRkFTVChjcHVfZmxhZ3MpKSB7CisgICAgICAgICAgICBpZiAoIShzLT5mbGFncyAmIFRJTlRFUkxBQ0VfRkxBR19DVkxQRikpIHsKKyAgICAgICAgICAgICAgICBzLT5sb3dwYXNzX2xpbmUgPSBmZl9sb3dwYXNzX2xpbmVfYXZ4MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmF2ZmlsdGVyL3g4Ni92Zl93M2ZkaWZfaW5pdC5jIGIvbGliYXZmaWx0ZXIveDg2L3ZmX3czZmRpZl9pbml0LmMKaW5kZXggOWJmMDZlOC4uZDQ1MzRiYiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L3ZmX3czZmRpZl9pbml0LmMKKysrIGIvbGliYXZmaWx0ZXIveDg2L3ZmX3czZmRpZl9pbml0LmMKQEAgLTQzLDIwICs0MywyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqaW5fbGluZXNfYWRqWzVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqY29lZiwgaW50IGxpbmVzaXplKTsKIAotdm9pZCBmZl93M2ZkaWZfc2NhbGVfc3NlMih1aW50OF90ICpvdXRfcGl4ZWwsIGNvbnN0IGludDMyX3QgKndvcmtfcGl4ZWwsIGludCBsaW5lc2l6ZSk7Cit2b2lkIGZmX3czZmRpZl9zY2FsZV9zc2UyKHVpbnQ4X3QgKm91dF9waXhlbCwgY29uc3QgaW50MzJfdCAqd29ya19waXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVzaXplLCBpbnQgbWF4KTsKIAotYXZfY29sZCB2b2lkIGZmX3czZmRpZl9pbml0X3g4NihXM0ZESUZEU1BDb250ZXh0ICpkc3ApCithdl9jb2xkIHZvaWQgZmZfdzNmZGlmX2luaXRfeDg2KFczRkRJRkRTUENvbnRleHQgKmRzcCwgaW50IGRlcHRoKQogewogICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAKLSAgICBpZiAoRVhURVJOQUxfU1NFMihjcHVfZmxhZ3MpKSB7CisgICAgaWYgKEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSAmJiBkZXB0aCA8PSA4KSB7CiAgICAgICAgIGRzcC0+ZmlsdGVyX3NpbXBsZV9sb3cgICA9IGZmX3czZmRpZl9zaW1wbGVfbG93X3NzZTI7CiAgICAgICAgIGRzcC0+ZmlsdGVyX3NpbXBsZV9oaWdoICA9IGZmX3czZmRpZl9zaW1wbGVfaGlnaF9zc2UyOwogICAgICAgICBkc3AtPmZpbHRlcl9jb21wbGV4X2xvdyAgPSBmZl93M2ZkaWZfY29tcGxleF9sb3dfc3NlMjsKICAgICAgICAgZHNwLT5maWx0ZXJfc2NhbGUgICAgICAgID0gZmZfdzNmZGlmX3NjYWxlX3NzZTI7CiAgICAgfQogCi0gICAgaWYgKEFSQ0hfWDg2XzY0ICYmIEVYVEVSTkFMX1NTRTIoY3B1X2ZsYWdzKSkgeworICAgIGlmIChBUkNIX1g4Nl82NCAmJiBFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykgJiYgZGVwdGggPD0gOCkgewogICAgICAgICBkc3AtPmZpbHRlcl9jb21wbGV4X2hpZ2ggPSBmZl93M2ZkaWZfY29tcGxleF9oaWdoX3NzZTI7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIveDg2L3ZmX3lhZGlmX2luaXQuYyBiL2xpYmF2ZmlsdGVyL3g4Ni92Zl95YWRpZl9pbml0LmMKaW5kZXggYzM2YTJkMC4uYzM5YmM0NCAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIveDg2L3ZmX3lhZGlmX2luaXQuYworKysgYi9saWJhdmZpbHRlci94ODYvdmZfeWFkaWZfaW5pdC5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKICNpbmNsdWRlICJsaWJhdmZpbHRlci95YWRpZi5oIgogCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci94ODYveWFkaWYtMTYuYXNtIGIvbGliYXZmaWx0ZXIveDg2L3lhZGlmLTE2LmFzbQppbmRleCA3OWQxMjdkLi45MDUzYjM3IDEwMDY0NAotLS0gYS9saWJhdmZpbHRlci94ODYveWFkaWYtMTYuYXNtCisrKyBiL2xpYmF2ZmlsdGVyL3g4Ni95YWRpZi0xNi5hc20KQEAgLTU0LDMwICs1NCw2IEBACiAlZW5kaWYKICVlbmRtYWNybwogCi0lbWFjcm8gUE1JTlNEIDMKLSVpZiBjcHVmbGFnKHNzZTQpCi0gICAgcG1pbnNkICUxLCAlMgotJWVsc2UKLSAgICBtb3ZhICAgICUzLCAlMgotICAgIHBjbXBndGQgJTMsICUxCi0gICAgcGFuZCAgICAlMSwgJTMKLSAgICBwYW5kbiAgICUzLCAlMgotICAgIHBvciAgICAgJTEsICUzCi0lZW5kaWYKLSVlbmRtYWNybwotCi0lbWFjcm8gUE1BWFNEIDMKLSVpZiBjcHVmbGFnKHNzZTQpCi0gICAgcG1heHNkICUxLCAlMgotJWVsc2UKLSAgICBtb3ZhICAgICUzLCAlMQotICAgIHBjbXBndGQgJTMsICUyCi0gICAgcGFuZCAgICAlMSwgJTMKLSAgICBwYW5kbiAgICUzLCAlMgotICAgIHBvciAgICAgJTEsICUzCi0lZW5kaWYKLSVlbmRtYWNybwotCiAlbWFjcm8gUE1BWFVXIDIKICVpZiBjcHVmbGFnKHNzZTQpCiAgICAgcG1heHV3ICUxLCAlMgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvM2Rvc3RyLmMgYi9saWJhdmZvcm1hdC8zZG9zdHIuYwppbmRleCA1MzI1YTAzLi4zNjY4ZTVmIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC8zZG9zdHIuYworKysgYi9saWJhdmZvcm1hdC8zZG9zdHIuYwpAQCAtNjEsMTcgKzYxLDE3IEBACiAgICAgICAgICAgICBpZiAoIXN0KQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHMtPnBiKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3JiMzIocy0+cGIpOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPD0gMCkKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPD0gMCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGNvZGVjICAgICAgICAgICAgICAgICAgPSBhdmlvX3JsMzIocy0+cGIpOwogICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKICAgICAgICAgICAgIGlmIChjdHJsX3NpemUgPT0gMjAgfHwgY3RybF9zaXplID09IDMgfHwgY3RybF9zaXplID09IC0xKQotICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbiAgICAgICA9IChhdmlvX3JiMzIocy0+cGIpIC0gMSkgLyBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbiAgICAgICA9IChhdmlvX3JiMzIocy0+cGIpIC0gMSkgLyBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbiAgICAgICA9IGF2aW9fcmIzMihzLT5wYikgKiAxNiAvIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgc3QtPmR1cmF0aW9uICAgICAgID0gYXZpb19yYjMyKHMtPnBiKSAqIDE2IC8gc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICAgICAgICAgIHNpemUgLT0gNTY7CiAgICAgICAgICAgICBmb3VuZF9zaGRyID0gMTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTUsMTUgKzk1LDE1IEBACiAKICAgICBzd2l0Y2ggKGNvZGVjKSB7CiAgICAgY2FzZSBNS1RBRygnUycsJ0QnLCdYJywnMicpOgotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfU0RYMl9EUENNOwotICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9TRFgyX0RQQ007CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAxICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJjb2RlYyAlWCIsIGNvZGVjKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKICAgICAgICAgICAgIHBrdC0+cG9zID0gcG9zOwogICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IHNpemUgLyBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IHNpemUgLyBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogICAgICAgICAgICAgc2l6ZSA9IDA7CiAgICAgICAgICAgICBmb3VuZF9zc21wID0gMTsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvNHhtLmMgYi9saWJhdmZvcm1hdC80eG0uYwppbmRleCA3MGYwZGVmLi5lYWQ2ZDJiIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC80eG0uYworKysgYi9saWJhdmZvcm1hdC80eG0uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiA0WCBUZWNobm9sb2dpZXMgLjR4bSBGaWxlIERlbXV4ZXIgKG5vIG11eGVyKQotICogQ29weXJpZ2h0IChjKSAyMDAzICBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMyAgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCkBAIC0xMDgsMTYgKzEwOSwxNiBAQAogCiAgICAgZm91cnhtLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF80WE07CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgID0gQVZfQ09ERUNfSURfNFhNOwogCi0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgICAgICA9IGF2X21hbGxvY3ooNCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpCisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgICAgICA9IGF2X21hbGxvY3ooNCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDQ7Ci0gICAgQVZfV0wzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSwgQVZfUkwzMihidWYgKyAxNikpOwotICAgIHN0LT5jb2RlYy0+d2lkdGggID0gQVZfUkwzMihidWYgKyAzNik7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBBVl9STDMyKGJ1ZiArIDQwKTsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gNDsKKyAgICBBVl9XTDMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBBVl9STDMyKGJ1ZiArIDE2KSk7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSBBVl9STDMyKGJ1ZiArIDM2KTsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IEFWX1JMMzIoYnVmICsgNDApOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNTMsOCArMTU0LDEwIEBACiAgICAgZm91cnhtLT50cmFja3NbdHJhY2tdLmF1ZGlvX3B0cyAgID0gMDsKIAogICAgIGlmIChmb3VyeG0tPnRyYWNrc1t0cmFja10uY2hhbm5lbHMgICAgPD0gMCB8fAorICAgICAgICBmb3VyeG0tPnRyYWNrc1t0cmFja10uY2hhbm5lbHMgICAgID4gRkZfU0FORV9OQl9DSEFOTkVMUyB8fAogICAgICAgICBmb3VyeG0tPnRyYWNrc1t0cmFja10uc2FtcGxlX3JhdGUgPD0gMCB8fAotICAgICAgICBmb3VyeG0tPnRyYWNrc1t0cmFja10uYml0cyAgICAgICAgPD0gMCkgeworICAgICAgICBmb3VyeG0tPnRyYWNrc1t0cmFja10uYml0cyAgICAgICAgPD0gMCB8fAorICAgICAgICBmb3VyeG0tPnRyYWNrc1t0cmFja10uYml0cyAgICAgICAgID4gSU5UX01BWCAvIEZGX1NBTkVfTkJfQ0hBTk5FTFMpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImF1ZGlvIGhlYWRlciBpbnZhbGlkXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtMTYzLDYgKzE2NiwxMiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKKyAgICBpZiAoZm91cnhtLT50cmFja3NbdHJhY2tdLnNhbXBsZV9yYXRlID4gSU5UNjRfTUFYIC8gZm91cnhtLT50cmFja3NbdHJhY2tdLmJpdHMgLyBmb3VyeG0tPnRyYWNrc1t0cmFja10uY2hhbm5lbHMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk92ZXJmbG93IGR1cmluZyBiaXQgcmF0ZSBjYWxjdWxhdGlvbiAlZCAqICVkICogJWRcbiIsCisgICAgICAgICAgICAgICBmb3VyeG0tPnRyYWNrc1t0cmFja10uc2FtcGxlX3JhdGUsIGZvdXJ4bS0+dHJhY2tzW3RyYWNrXS5iaXRzLCBmb3VyeG0tPnRyYWNrc1t0cmFja10uY2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBBVlN0cmVhbSAqLwogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQpAQCAtMTczLDIzICsxODIsMjMgQEAKIAogICAgIGZvdXJ4bS0+dHJhY2tzW3RyYWNrXS5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgICAgICAgICAgICA9IDA7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgICAgICAgPSBmb3VyeG0tPnRyYWNrc1t0cmFja10uY2hhbm5lbHM7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSBmb3VyeG0tPnRyYWNrc1t0cmFja10uc2FtcGxlX3JhdGU7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBmb3VyeG0tPnRyYWNrc1t0cmFja10uYml0czsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICAgICAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduICAgICAgICAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICAgICAgICAgICAgPSAwOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gZm91cnhtLT50cmFja3NbdHJhY2tdLmNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gZm91cnhtLT50cmFja3NbdHJhY2tdLnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gZm91cnhtLT50cmFja3NbdHJhY2tdLmJpdHM7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICAgICAgICAgICAgPSAoaW50NjRfdClzdC0+Y29kZWNwYXItPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAgICAgICAgICAgPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwogCiAgICAgaWYgKGZvdXJ4bS0+dHJhY2tzW3RyYWNrXS5hZHBjbSl7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV80WE07Ci0gICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4KSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV80WE07CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4KSB7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CiAgICAgfSBlbHNlCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L01ha2VmaWxlIGIvbGliYXZmb3JtYXQvTWFrZWZpbGUKaW5kZXggMzVhMzgzZC4uM2VlY2E1MCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvTWFrZWZpbGUKKysrIGIvbGliYXZmb3JtYXQvTWFrZWZpbGUKQEAgLTEsNiArMSw1IEBACi1pbmNsdWRlICQoU1VCRElSKS4uL2NvbmZpZy5tYWsKLQogTkFNRSA9IGF2Zm9ybWF0CitERVNDID0gRkZtcGVnIGNvbnRhaW5lciBmb3JtYXQgbGlicmFyeQogCiBIRUFERVJTID0gYXZmb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgYXZpby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xOSwxMSArMTgsMTYgQEAKICAgICAgICBvcHRpb25zLm8gICAgICAgICAgICBcCiAgICAgICAgb3Nfc3VwcG9ydC5vICAgICAgICAgXAogICAgICAgIHF0cGFsZXR0ZS5vICAgICAgICAgIFwKKyAgICAgICBwcm90b2NvbHMubyAgICAgICAgICBcCiAgICAgICAgcmlmZi5vICAgICAgICAgICAgICAgXAogICAgICAgIHNkcC5vICAgICAgICAgICAgICAgIFwKICAgICAgICB1cmwubyAgICAgICAgICAgICAgICBcCiAgICAgICAgdXRpbHMubyAgICAgICAgICAgICAgXAogCitPQkpTLSQoSEFWRV9MSUJDX01TVkNSVCkgICAgICAgICAgICAgICAgICs9IGZpbGVfb3Blbi5vCisKKyMgc3Vic3lzdGVtcworT0JKUy0kKENPTkZJR19JU09fTUVESUEpICAgICAgICAgICAgICAgICArPSBpc29tLm8KIE9CSlMtJChDT05GSUdfTkVUV09SSykgICAgICAgICAgICAgICAgICAgKz0gbmV0d29yay5vCiBPQkpTLSQoQ09ORklHX1JJRkZERUMpICAgICAgICAgICAgICAgICAgICs9IHJpZmZkZWMubwogT0JKUy0kKENPTkZJR19SSUZGRU5DKSAgICAgICAgICAgICAgICAgICArPSByaWZmZW5jLm8KQEAgLTUwLDEzICs1NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfcWNlbHAubyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfcWRtMi5vICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfcXQubyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfcmZjNDE3NS5vICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfc3ZxMy5vICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfdmMyaHEubyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfdnA4Lm8gICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfdnA5Lm8gICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBkZWNfeGlwaC5vICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcnRwLm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZGVjX3hpcGgubwogT0JKUy0kKENPTkZJR19SVFBFTkNfQ0hBSU4pICAgICAgICAgICAgICArPSBydHBlbmNfY2hhaW4ubyBydHAubwogT0JKUy0kKENPTkZJR19TSEFSRUQpICAgICAgICAgICAgICAgICAgICArPSBsb2cyX3RhYi5vIGdvbG9tYl90YWIubworT0JKUy0kKENPTkZJR19TUlRQKSAgICAgICAgICAgICAgICAgICAgICArPSBzcnRwLm8KIAogIyBtdXhlcnMvZGVtdXhlcnMKIE9CSlMtJChDT05GSUdfQTY0X01VWEVSKSAgICAgICAgICAgICAgICAgKz0gYTY0Lm8gcmF3ZW5jLm8KQEAgLTY5LDQwICs3NSw0NiBAQAogT0JKUy0kKENPTkZJR19BREZfREVNVVhFUikgICAgICAgICAgICAgICArPSBiaW50ZXh0Lm8gc2F1Y2UubwogT0JKUy0kKENPTkZJR19BRFBfREVNVVhFUikgICAgICAgICAgICAgICArPSBhZHAubwogT0JKUy0kKENPTkZJR19BRFNfREVNVVhFUikgICAgICAgICAgICAgICArPSBhZHMubwotT0JKUy0kKENPTkZJR19BRFhfREVNVVhFUikgICAgICAgICAgICAgICArPSBhZHhkZWMubwotT0JKUy0kKENPTkZJR19BRFhfTVVYRVIpICAgICAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19BRFRTX01VWEVSKSAgICAgICAgICAgICAgICArPSBhZHRzZW5jLm8gYXBldGFnLm8gaW1nMi5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQzdjJlbmMubworT0JKUy0kKENPTkZJR19BRFhfREVNVVhFUikgICAgICAgICAgICAgICArPSBhZHhkZWMubworT0JKUy0kKENPTkZJR19BRFhfTVVYRVIpICAgICAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19BRUFfREVNVVhFUikgICAgICAgICAgICAgICArPSBhZWEubyBwY20ubwogT0JKUy0kKENPTkZJR19BRkNfREVNVVhFUikgICAgICAgICAgICAgICArPSBhZmMubwogT0JKUy0kKENPTkZJR19BSUZGX0RFTVVYRVIpICAgICAgICAgICAgICArPSBhaWZmZGVjLm8gcGNtLm8gaXNvbS5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92X2NoYW4ubwotT0JKUy0kKENPTkZJR19BSUZGX01VWEVSKSAgICAgICAgICAgICAgICArPSBhaWZmZW5jLm8gaXNvbS5vIGlkM3YyZW5jLm8KK09CSlMtJChDT05GSUdfQUlGRl9NVVhFUikgICAgICAgICAgICAgICAgKz0gYWlmZmVuYy5vIGlkM3YyZW5jLm8KK09CSlMtJChDT05GSUdfQUlYX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYWl4ZGVjLm8KIE9CSlMtJChDT05GSUdfQU1SX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYW1yLm8KIE9CSlMtJChDT05GSUdfQU1SX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gYW1yLm8KK09CSlMtJChDT05GSUdfQU1STkJfREVNVVhFUikgICAgICAgICAgICAgKz0gYW1yLm8KK09CSlMtJChDT05GSUdfQU1SV0JfREVNVVhFUikgICAgICAgICAgICAgKz0gYW1yLm8KIE9CSlMtJChDT05GSUdfQU5NX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYW5tLm8KIE9CSlMtJChDT05GSUdfQVBDX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYXBjLm8KIE9CSlMtJChDT05GSUdfQVBFX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYXBlLm8gYXBldGFnLm8gaW1nMi5vCiBPQkpTLSQoQ09ORklHX0FQTkdfREVNVVhFUikgICAgICAgICAgICAgICs9IGFwbmdkZWMubwogT0JKUy0kKENPTkZJR19BUE5HX01VWEVSKSAgICAgICAgICAgICAgICArPSBhcG5nZW5jLm8KK09CSlMtJChDT05GSUdfQVBUWF9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gYXB0eGRlYy5vIHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX0FQVFhfTVVYRVIpICAgICAgICAgICAgICAgICs9IHJhd2VuYy5vCitPQkpTLSQoQ09ORklHX0FQVFhfSERfREVNVVhFUikgICAgICAgICAgICs9IGFwdHhkZWMubyByYXdkZWMubworT0JKUy0kKENPTkZJR19BUFRYX0hEX01VWEVSKSAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19BUVRJVExFX0RFTVVYRVIpICAgICAgICAgICArPSBhcXRpdGxlZGVjLm8gc3VidGl0bGVzLm8KIE9CSlMtJChDT05GSUdfQVNGX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYXNmZGVjX2YubyBhc2YubyBhc2ZjcnlwdC5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZsYW5ndWFnZS5vCiBPQkpTLSQoQ09ORklHX0FTRl9PX0RFTVVYRVIpICAgICAgICAgICAgICs9IGFzZmRlY19vLm8gYXNmLm8gYXNmY3J5cHQubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2bGFuZ3VhZ2UubwotT0JKUy0kKENPTkZJR19BU0ZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBhc2ZlbmMubyBhc2YubworT0JKUy0kKENPTkZJR19BU0ZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBhc2ZlbmMubyBhc2YubyBhdmxhbmd1YWdlLm8KIE9CSlMtJChDT05GSUdfQVNTX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYXNzZGVjLm8gc3VidGl0bGVzLm8KIE9CSlMtJChDT05GSUdfQVNTX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gYXNzZW5jLm8KIE9CSlMtJChDT05GSUdfQVNUX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gYXN0Lm8gYXN0ZGVjLm8KIE9CSlMtJChDT05GSUdfQVNUX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gYXN0Lm8gYXN0ZW5jLm8KIE9CSlMtJChDT05GSUdfQVVfREVNVVhFUikgICAgICAgICAgICAgICAgKz0gYXUubyBwY20ubwogT0JKUy0kKENPTkZJR19BVV9NVVhFUikgICAgICAgICAgICAgICAgICArPSBhdS5vIHJhd2VuYy5vCi1PQkpTLSQoQ09ORklHX0FWSV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGF2aWRlYy5vIGlzb20ubwotT0JKUy0kKENPTkZJR19BVklfTVVYRVIpICAgICAgICAgICAgICAgICArPSBhdmllbmMubyBtcGVndHNlbmMubyBhdmxhbmd1YWdlLm8KLU9CSlMtJChDT05GSUdfQVZJU1lOVEgpICAgICAgICAgICAgICAgICAgKz0gYXZpc3ludGgubworT0JKUy0kKENPTkZJR19BVklfREVNVVhFUikgICAgICAgICAgICAgICArPSBhdmlkZWMubworT0JKUy0kKENPTkZJR19BVklfTVVYRVIpICAgICAgICAgICAgICAgICArPSBhdmllbmMubyBtcGVndHNlbmMubyBhdmxhbmd1YWdlLm8gcmF3dXRpbHMubwogT0JKUy0kKENPTkZJR19BVk0yX01VWEVSKSAgICAgICAgICAgICAgICArPSBzd2ZlbmMubyBzd2YubwogT0JKUy0kKENPTkZJR19BVlJfREVNVVhFUikgICAgICAgICAgICAgICArPSBhdnIubyBwY20ubwotT0JKUy0kKENPTkZJR19BVlNfREVNVVhFUikgICAgICAgICAgICAgICArPSBhdnMubyB2b2NkZWMubyB2b2MubworT0JKUy0kKENPTkZJR19BVlNfREVNVVhFUikgICAgICAgICAgICAgICArPSBhdnMubyB2b2NfcGFja2V0Lm8gdm9jZGVjLm8gdm9jLm8KIE9CSlMtJChDT05GSUdfQkVUSFNPRlRWSURfREVNVVhFUikgICAgICAgKz0gYmV0aHNvZnR2aWQubwogT0JKUy0kKENPTkZJR19CRklfREVNVVhFUikgICAgICAgICAgICAgICArPSBiZmkubwogT0JKUy0kKENPTkZJR19CSU5LX0RFTVVYRVIpICAgICAgICAgICAgICArPSBiaW5rLm8KQEAgLTExMywyMCArMTI1LDI0IEBACiBPQkpTLSQoQ09ORklHX0JPQV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGJvYWRlYy5vCiBPQkpTLSQoQ09ORklHX0JGU1RNX0RFTVVYRVIpICAgICAgICAgICAgICs9IGJyc3RtLm8KIE9CSlMtJChDT05GSUdfQlJTVE1fREVNVVhFUikgICAgICAgICAgICAgKz0gYnJzdG0ubwotT0JKUy0kKENPTkZJR19DOTNfREVNVVhFUikgICAgICAgICAgICAgICArPSBjOTMubyB2b2NkZWMubyB2b2MubwotT0JKUy0kKENPTkZJR19DQUZfREVNVVhFUikgICAgICAgICAgICAgICArPSBjYWZkZWMubyBjYWYubyBtb3YubyBtb3ZfY2hhbi5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbS5vIHJlcGxheWdhaW4ubwotT0JKUy0kKENPTkZJR19DQUZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBjYWZlbmMubyBjYWYubyByaWZmLm8gaXNvbS5vCitPQkpTLSQoQ09ORklHX0M5M19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGM5My5vIHZvY19wYWNrZXQubyB2b2NkZWMubyB2b2MubworT0JKUy0kKENPTkZJR19DQUZfREVNVVhFUikgICAgICAgICAgICAgICArPSBjYWZkZWMubyBjYWYubyBtb3ZfY2hhbi5vIG1vdl9lc2RzLm8KK09CSlMtJChDT05GSUdfQ0FGX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gY2FmZW5jLm8gY2FmLm8gcmlmZi5vCiBPQkpTLSQoQ09ORklHX0NBVlNWSURFT19ERU1VWEVSKSAgICAgICAgICs9IGNhdnN2aWRlb2RlYy5vIHJhd2RlYy5vCiBPQkpTLSQoQ09ORklHX0NBVlNWSURFT19NVVhFUikgICAgICAgICAgICs9IHJhd2VuYy5vCiBPQkpTLSQoQ09ORklHX0NER19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGNkZy5vCiBPQkpTLSQoQ09ORklHX0NEWExfREVNVVhFUikgICAgICAgICAgICAgICs9IGNkeGwubwogT0JKUy0kKENPTkZJR19DSU5FX0RFTVVYRVIpICAgICAgICAgICAgICArPSBjaW5lZGVjLm8KK09CSlMtJChDT05GSUdfQ09ERUMyX0RFTVVYRVIpICAgICAgICAgICAgKz0gY29kZWMyLm8gcmF3ZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfQ09ERUMyX01VWEVSKSAgICAgICAgICAgICAgKz0gY29kZWMyLm8gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfQ09ERUMyUkFXX0RFTVVYRVIpICAgICAgICAgKz0gY29kZWMyLm8gcmF3ZGVjLm8gcGNtLm8KK09CSlMtJChDT05GSUdfQ09ERUMyUkFXX01VWEVSKSAgICAgICAgICAgKz0gcmF3ZW5jLm8KIE9CSlMtJChDT05GSUdfQ09OQ0FUX0RFTVVYRVIpICAgICAgICAgICAgKz0gY29uY2F0ZGVjLm8KIE9CSlMtJChDT05GSUdfQ1JDX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gY3JjZW5jLm8KIE9CSlMtJChDT05GSUdfREFUQV9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gcmF3ZGVjLm8KLU9CSlMtJChDT05GSUdfREFUQV9NVVhFUikgICAgICAgICAgICAgICAgKz0gcmF3ZGVjLm8KLU9CSlMtJChDT05GSUdfREFTSF9NVVhFUikgICAgICAgICAgICAgICAgKz0gZGFzaGVuYy5vIGlzb20ubworT0JKUy0kKENPTkZJR19EQVRBX01VWEVSKSAgICAgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19EQVNIX01VWEVSKSAgICAgICAgICAgICAgICArPSBkYXNoLm8gZGFzaGVuYy5vIGhsc3BsYXlsaXN0Lm8KK09CSlMtJChDT05GSUdfREFTSF9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gZGFzaC5vIGRhc2hkZWMubwogT0JKUy0kKENPTkZJR19EQVVEX0RFTVVYRVIpICAgICAgICAgICAgICArPSBkYXVkZGVjLm8KIE9CSlMtJChDT05GSUdfREFVRF9NVVhFUikgICAgICAgICAgICAgICAgKz0gZGF1ZGVuYy5vCiBPQkpTLSQoQ09ORklHX0RDU1RSX0RFTVVYRVIpICAgICAgICAgICAgICs9IGRjc3RyLm8KQEAgLTE0NCwxOCArMTYwLDIxIEBACiBPQkpTLSQoQ09ORklHX0RWX0RFTVVYRVIpICAgICAgICAgICAgICAgICs9IGR2Lm8KIE9CSlMtJChDT05GSUdfRFZfTVVYRVIpICAgICAgICAgICAgICAgICAgKz0gZHZlbmMubwogT0JKUy0kKENPTkZJR19EVkJTVUJfREVNVVhFUikgICAgICAgICAgICArPSBkdmJzdWIubworT0JKUy0kKENPTkZJR19EVkJUWFRfREVNVVhFUikgICAgICAgICAgICArPSBkdmJ0eHQubwogT0JKUy0kKENPTkZJR19EWEFfREVNVVhFUikgICAgICAgICAgICAgICArPSBkeGEubwogT0JKUy0kKENPTkZJR19FQV9DREFUQV9ERU1VWEVSKSAgICAgICAgICArPSBlYWNkYXRhLm8KIE9CSlMtJChDT05GSUdfRUFfREVNVVhFUikgICAgICAgICAgICAgICAgKz0gZWxlY3Ryb25pY2FydHMubwogT0JKUy0kKENPTkZJR19FQUMzX0RFTVVYRVIpICAgICAgICAgICAgICArPSBhYzNkZWMubyByYXdkZWMubwogT0JKUy0kKENPTkZJR19FQUMzX01VWEVSKSAgICAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19FUEFGX0RFTVVYRVIpICAgICAgICAgICAgICArPSBlcGFmZGVjLm8gcGNtLm8KLU9CSlMtJChDT05GSUdfRkZNX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gZmZtZGVjLm8KLU9CSlMtJChDT05GSUdfRkZNX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gZmZtZW5jLm8KIE9CSlMtJChDT05GSUdfRkZNRVRBREFUQV9ERU1VWEVSKSAgICAgICAgKz0gZmZtZXRhZGVjLm8KIE9CSlMtJChDT05GSUdfRkZNRVRBREFUQV9NVVhFUikgICAgICAgICAgKz0gZmZtZXRhZW5jLm8KK09CSlMtJChDT05GSUdfRklGT19NVVhFUikgICAgICAgICAgICAgICAgKz0gZmlmby5vCitPQkpTLSQoQ09ORklHX0ZJRk9fVEVTVF9NVVhFUikgICAgICAgICAgICs9IGZpZm9fdGVzdC5vCiBPQkpTLSQoQ09ORklHX0ZJTE1TVFJJUF9ERU1VWEVSKSAgICAgICAgICs9IGZpbG1zdHJpcGRlYy5vCiBPQkpTLSQoQ09ORklHX0ZJTE1TVFJJUF9NVVhFUikgICAgICAgICAgICs9IGZpbG1zdHJpcGVuYy5vCitPQkpTLSQoQ09ORklHX0ZJVFNfREVNVVhFUikgICAgICAgICAgICAgICs9IGZpdHNkZWMubworT0JKUy0kKENPTkZJR19GSVRTX01VWEVSKSAgICAgICAgICAgICAgICArPSBmaXRzZW5jLm8KIE9CSlMtJChDT05GSUdfRkxBQ19ERU1VWEVSKSAgICAgICAgICAgICAgKz0gZmxhY2RlYy5vIHJhd2RlYy5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhY19waWN0dXJlLm8gICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9nZ3BhcnNldm9yYmlzLm8gXApAQCAtMTY5LDE5ICsxODgsMjYgQEAKIE9CSlMtJChDT05GSUdfRkxWX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gZmx2ZW5jLm8gYXZjLm8KIE9CSlMtJChDT05GSUdfRk9VUlhNX0RFTVVYRVIpICAgICAgICAgICAgKz0gNHhtLm8KIE9CSlMtJChDT05GSUdfRlJBTUVDUkNfTVVYRVIpICAgICAgICAgICAgKz0gZnJhbWVjcmNlbmMubyBmcmFtZWhhc2gubwotT0JKUy0kKENPTkZJR19GUkFNRU1ENV9NVVhFUikgICAgICAgICAgICArPSBtZDVlbmMubyBmcmFtZWhhc2gubworT0JKUy0kKENPTkZJR19GUkFNRUhBU0hfTVVYRVIpICAgICAgICAgICArPSBoYXNoZW5jLm8gZnJhbWVoYXNoLm8KK09CSlMtJChDT05GSUdfRlJBTUVNRDVfTVVYRVIpICAgICAgICAgICAgKz0gaGFzaGVuYy5vIGZyYW1laGFzaC5vCiBPQkpTLSQoQ09ORklHX0ZSTV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGZybWRlYy5vCiBPQkpTLSQoQ09ORklHX0ZTQl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGZzYi5vCiBPQkpTLSQoQ09ORklHX0dJRl9NVVhFUikgICAgICAgICAgICAgICAgICs9IGdpZi5vCiBPQkpTLSQoQ09ORklHX0dJRl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGdpZmRlYy5vCiBPQkpTLSQoQ09ORklHX0dTTV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGdzbWRlYy5vCitPQkpTLSQoQ09ORklHX0dTTV9NVVhFUikgICAgICAgICAgICAgICAgICs9IHJhd2VuYy5vCiBPQkpTLSQoQ09ORklHX0dYRl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGd4Zi5vCiBPQkpTLSQoQ09ORklHX0dYRl9NVVhFUikgICAgICAgICAgICAgICAgICs9IGd4ZmVuYy5vIGF1ZGlvaW50ZXJsZWF2ZS5vCiBPQkpTLSQoQ09ORklHX0c3MjJfREVNVVhFUikgICAgICAgICAgICAgICs9IGc3MjIubyByYXdkZWMubwogT0JKUy0kKENPTkZJR19HNzIyX01VWEVSKSAgICAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19HNzIzXzFfREVNVVhFUikgICAgICAgICAgICArPSBnNzIzXzEubwogT0JKUy0kKENPTkZJR19HNzIzXzFfTVVYRVIpICAgICAgICAgICAgICArPSByYXdlbmMubworT0JKUy0kKENPTkZJR19HNzI2X0RFTVVYRVIpICAgICAgICAgICAgICArPSBnNzI2Lm8KK09CSlMtJChDT05GSUdfRzcyNl9NVVhFUikgICAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfRzcyNkxFX0RFTVVYRVIpICAgICAgICAgICAgKz0gZzcyNi5vCitPQkpTLSQoQ09ORklHX0c3MjZMRV9NVVhFUikgICAgICAgICAgICAgICs9IHJhd2VuYy5vCiBPQkpTLSQoQ09ORklHX0c3MjlfREVNVVhFUikgICAgICAgICAgICAgICs9IGc3MjlkZWMubworT0JKUy0kKENPTkZJR19HRFZfREVNVVhFUikgICAgICAgICAgICAgICArPSBnZHYubwogT0JKUy0kKENPTkZJR19HRU5IX0RFTVVYRVIpICAgICAgICAgICAgICArPSBnZW5oLm8KIE9CSlMtJChDT05GSUdfSDI2MV9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gaDI2MWRlYy5vIHJhd2RlYy5vCiBPQkpTLSQoQ09ORklHX0gyNjFfTVVYRVIpICAgICAgICAgICAgICAgICs9IHJhd2VuYy5vCkBAIC0xODksMTEgKzIxNSwxMiBAQAogT0JKUy0kKENPTkZJR19IMjYzX01VWEVSKSAgICAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19IMjY0X0RFTVVYRVIpICAgICAgICAgICAgICArPSBoMjY0ZGVjLm8gcmF3ZGVjLm8KIE9CSlMtJChDT05GSUdfSDI2NF9NVVhFUikgICAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfSEFTSF9NVVhFUikgICAgICAgICAgICAgICAgKz0gaGFzaGVuYy5vCiBPQkpTLSQoQ09ORklHX0hEU19NVVhFUikgICAgICAgICAgICAgICAgICs9IGhkc2VuYy5vCiBPQkpTLSQoQ09ORklHX0hFVkNfREVNVVhFUikgICAgICAgICAgICAgICs9IGhldmNkZWMubyByYXdkZWMubwogT0JKUy0kKENPTkZJR19IRVZDX01VWEVSKSAgICAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19ITFNfREVNVVhFUikgICAgICAgICAgICAgICArPSBobHMubwotT0JKUy0kKENPTkZJR19ITFNfTVVYRVIpICAgICAgICAgICAgICAgICArPSBobHNlbmMubworT0JKUy0kKENPTkZJR19ITFNfTVVYRVIpICAgICAgICAgICAgICAgICArPSBobHNlbmMubyBobHNwbGF5bGlzdC5vCiBPQkpTLSQoQ09ORklHX0hOTV9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGhubS5vCiBPQkpTLSQoQ09ORklHX0lDT19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IGljb2RlYy5vCiBPQkpTLSQoQ09ORklHX0lDT19NVVhFUikgICAgICAgICAgICAgICAgICs9IGljb2VuYy5vCkBAIC0yMTUsMTMgKzI0MiwyMiBAQAogT0JKUy0kKENPTkZJR19JTUFHRV9KMktfUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9KUEVHX1BJUEVfREVNVVhFUikgICAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9KUEVHTFNfUElQRV9ERU1VWEVSKSAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9QQU1fUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9QQk1fUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9QQ1hfUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9QR01ZVVZfUElQRV9ERU1VWEVSKSAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9QR01fUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9QSUNUT1JfUElQRV9ERU1VWEVSKSAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9QTkdfUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9QUE1fUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9QU0RfUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9RRFJBV19QSVBFX0RFTVVYRVIpICAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9TR0lfUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9TVkdfUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9TVU5SQVNUX1BJUEVfREVNVVhFUikgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9USUZGX1BJUEVfREVNVVhFUikgICAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTUFHRV9XRUJQX1BJUEVfREVNVVhFUikgICAgKz0gaW1nMmRlYy5vIGltZzIubworT0JKUy0kKENPTkZJR19JTUFHRV9YUE1fUElQRV9ERU1VWEVSKSAgICAgKz0gaW1nMmRlYy5vIGltZzIubwogT0JKUy0kKENPTkZJR19JTkdFTklFTlRfREVNVVhFUikgICAgICAgICArPSBpbmdlbmllbnRkZWMubyByYXdkZWMubwogT0JKUy0kKENPTkZJR19JUE1PVklFX0RFTVVYRVIpICAgICAgICAgICArPSBpcG1vdmllLm8KIE9CSlMtJChDT05GSUdfSVJDQU1fREVNVVhFUikgICAgICAgICAgICAgKz0gaXJjYW1kZWMubyBpcmNhbS5vIHBjbS5vCkBAIC0yNDQsMTcgKzI4MCwxOCBAQAogT0JKUy0kKENPTkZJR19NNFZfREVNVVhFUikgICAgICAgICAgICAgICArPSBtNHZkZWMubyByYXdkZWMubwogT0JKUy0kKENPTkZJR19NNFZfTVVYRVIpICAgICAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19NQVRST1NLQV9ERU1VWEVSKSAgICAgICAgICArPSBtYXRyb3NrYWRlYy5vIG1hdHJvc2thLm8gIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNvbS5vIHJtc2lwci5vIGZsYWNfcGljdHVyZS5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm1zaXByLm8gZmxhY19waWN0dXJlLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ2dwYXJzZXZvcmJpcy5vIHZvcmJpc2NvbW1lbnQubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWNfcGljdHVyZS5vIHJlcGxheWdhaW4ubwogT0JKUy0kKENPTkZJR19NQVRST1NLQV9NVVhFUikgICAgICAgICAgICArPSBtYXRyb3NrYWVuYy5vIG1hdHJvc2thLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29tLm8gYXZjLm8gaGV2Yy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjLm8gaGV2Yy5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhY2VuY19oZWFkZXIubyBhdmxhbmd1YWdlLm8gdm9yYmlzY29tbWVudC5vIHd2Lm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJtZGFzaGVuYy5vIHdlYm1fY2h1bmsubwotT0JKUy0kKENPTkZJR19NRDVfTVVYRVIpICAgICAgICAgICAgICAgICArPSBtZDVlbmMubworT0JKUy0kKENPTkZJR19NRDVfTVVYRVIpICAgICAgICAgICAgICAgICArPSBoYXNoZW5jLm8KIE9CSlMtJChDT05GSUdfTUdTVFNfREVNVVhFUikgICAgICAgICAgICAgKz0gbWdzdHMubwogT0JKUy0kKENPTkZJR19NSUNST0RWRF9ERU1VWEVSKSAgICAgICAgICArPSBtaWNyb2R2ZGRlYy5vIHN1YnRpdGxlcy5vCiBPQkpTLSQoQ09ORklHX01JQ1JPRFZEX01VWEVSKSAgICAgICAgICAgICs9IG1pY3JvZHZkZW5jLm8KK09CSlMtJChDT05GSUdfTUpQRUdfMjAwMF9ERU1VWEVSKSAgICAgICAgKz0gcmF3ZGVjLm8gbWoya2RlYy5vCiBPQkpTLSQoQ09ORklHX01KUEVHX0RFTVVYRVIpICAgICAgICAgICAgICs9IHJhd2RlYy5vCiBPQkpTLSQoQ09ORklHX01KUEVHX01VWEVSKSAgICAgICAgICAgICAgICs9IHJhd2VuYy5vCiBPQkpTLSQoQ09ORklHX01MUF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHJhd2RlYy5vIG1scGRlYy5vCkBAIC0yNjMsMjMgKzMwMCwyNCBAQAogT0JKUy0kKENPTkZJR19NTV9ERU1VWEVSKSAgICAgICAgICAgICAgICArPSBtbS5vCiBPQkpTLSQoQ09ORklHX01NRl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG1tZi5vCiBPQkpTLSQoQ09ORklHX01NRl9NVVhFUikgICAgICAgICAgICAgICAgICs9IG1tZi5vIHJhd2VuYy5vCi1PQkpTLSQoQ09ORklHX01PVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG1vdi5vIGlzb20ubyBtb3ZfY2hhbi5vIHJlcGxheWdhaW4ubwotT0JKUy0kKENPTkZJR19NT1ZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBtb3ZlbmMubyBpc29tLm8gYXZjLm8gaGV2Yy5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZW5jaGludC5vIG1vdl9jaGFuLm8gcnRwLm8gbW92ZW5jY2VuYy5vCi1PQkpTLSQoQ09ORklHX01QMl9NVVhFUikgICAgICAgICAgICAgICAgICs9IG1wM2VuYy5vIHJhd2VuYy5vIGlkM3YyZW5jLm8KK09CSlMtJChDT05GSUdfTU9WX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gbW92Lm8gbW92X2NoYW4ubyBtb3ZfZXNkcy5vIHJlcGxheWdhaW4ubworT0JKUy0kKENPTkZJR19NT1ZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBtb3ZlbmMubyBhdmMubyBoZXZjLm8gdnBjYy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZW5jaGludC5vIG1vdl9jaGFuLm8gcnRwLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlbmNjZW5jLm8gcmF3dXRpbHMubworT0JKUy0kKENPTkZJR19NUDJfTVVYRVIpICAgICAgICAgICAgICAgICArPSByYXdlbmMubwogT0JKUy0kKENPTkZJR19NUDNfREVNVVhFUikgICAgICAgICAgICAgICArPSBtcDNkZWMubyByZXBsYXlnYWluLm8KIE9CSlMtJChDT05GSUdfTVAzX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gbXAzZW5jLm8gcmF3ZW5jLm8gaWQzdjJlbmMubwogT0JKUy0kKENPTkZJR19NUENfREVNVVhFUikgICAgICAgICAgICAgICArPSBtcGMubyBhcGV0YWcubyBpbWcyLm8KIE9CSlMtJChDT05GSUdfTVBDOF9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gbXBjOC5vIGFwZXRhZy5vIGltZzIubwogT0JKUy0kKENPTkZJR19NUEVHMVNZU1RFTV9NVVhFUikgICAgICAgICArPSBtcGVnZW5jLm8KIE9CSlMtJChDT05GSUdfTVBFRzFWQ0RfTVVYRVIpICAgICAgICAgICAgKz0gbXBlZ2VuYy5vCi1PQkpTLSQoQ09ORklHX01QRUcyRFZEX01VWEVSKSAgICAgICAgICAgICs9IG1wZWdlbmMubwotT0JKUy0kKENPTkZJR19NUEVHMlZPQl9NVVhFUikgICAgICAgICAgICArPSBtcGVnZW5jLm8KLU9CSlMtJChDT05GSUdfTVBFRzJTVkNEX01VWEVSKSAgICAgICAgICAgKz0gbXBlZ2VuYy5vCiBPQkpTLSQoQ09ORklHX01QRUcxVklERU9fTVVYRVIpICAgICAgICAgICs9IHJhd2VuYy5vCitPQkpTLSQoQ09ORklHX01QRUcyRFZEX01VWEVSKSAgICAgICAgICAgICs9IG1wZWdlbmMubworT0JKUy0kKENPTkZJR19NUEVHMlNWQ0RfTVVYRVIpICAgICAgICAgICArPSBtcGVnZW5jLm8KIE9CSlMtJChDT05GSUdfTVBFRzJWSURFT19NVVhFUikgICAgICAgICAgKz0gcmF3ZW5jLm8KK09CSlMtJChDT05GSUdfTVBFRzJWT0JfTVVYRVIpICAgICAgICAgICAgKz0gbXBlZ2VuYy5vCiBPQkpTLSQoQ09ORklHX01QRUdQU19ERU1VWEVSKSAgICAgICAgICAgICs9IG1wZWcubwotT0JKUy0kKENPTkZJR19NUEVHVFNfREVNVVhFUikgICAgICAgICAgICArPSBtcGVndHMubyBpc29tLm8KK09CSlMtJChDT05GSUdfTVBFR1RTX0RFTVVYRVIpICAgICAgICAgICAgKz0gbXBlZ3RzLm8KIE9CSlMtJChDT05GSUdfTVBFR1RTX01VWEVSKSAgICAgICAgICAgICAgKz0gbXBlZ3RzZW5jLm8KIE9CSlMtJChDT05GSUdfTVBFR1ZJREVPX0RFTVVYRVIpICAgICAgICAgKz0gbXBlZ3ZpZGVvZGVjLm8gcmF3ZGVjLm8KIE9CSlMtJChDT05GSUdfTVBKUEVHX0RFTVVYRVIpICAgICAgICAgICAgKz0gbXBqcGVnZGVjLm8KQEAgLTI4OCw3ICszMjYsOSBAQAogT0JKUy0kKENPTkZJR19NU0ZfREVNVVhFUikgICAgICAgICAgICAgICArPSBtc2YubwogT0JKUy0kKENPTkZJR19NUFNVQl9ERU1VWEVSKSAgICAgICAgICAgICArPSBtcHN1YmRlYy5vIHN1YnRpdGxlcy5vCiBPQkpTLSQoQ09ORklHX01TTldDX1RDUF9ERU1VWEVSKSAgICAgICAgICs9IG1zbndjX3RjcC5vCitPQkpTLSQoQ09ORklHX01UQUZfREVNVVhFUikgICAgICAgICAgICAgICs9IG10YWYubwogT0JKUy0kKENPTkZJR19NVFZfREVNVVhFUikgICAgICAgICAgICAgICArPSBtdHYubworT0JKUy0kKENPTkZJR19NVVNYX0RFTVVYRVIpICAgICAgICAgICAgICArPSBtdXN4Lm8KIE9CSlMtJChDT05GSUdfTVZfREVNVVhFUikgICAgICAgICAgICAgICAgKz0gbXZkZWMubwogT0JKUy0kKENPTkZJR19NVklfREVNVVhFUikgICAgICAgICAgICAgICArPSBtdmkubwogT0JKUy0kKENPTkZJR19NWEZfREVNVVhFUikgICAgICAgICAgICAgICArPSBteGZkZWMubyBteGYubwpAQCAtMjk2LDYgKzMzNiw3IEBACiBPQkpTLSQoQ09ORklHX01YR19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG14Zy5vCiBPQkpTLSQoQ09ORklHX05DX0RFTVVYRVIpICAgICAgICAgICAgICAgICs9IG5jZGVjLm8KIE9CSlMtJChDT05GSUdfTklTVFNQSEVSRV9ERU1VWEVSKSAgICAgICAgKz0gbmlzdHNwaGVyZWRlYy5vIHBjbS5vCitPQkpTLSQoQ09ORklHX05TUF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG5zcGRlYy5vCiBPQkpTLSQoQ09ORklHX05TVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IG5zdmRlYy5vCiBPQkpTLSQoQ09ORklHX05VTExfTVVYRVIpICAgICAgICAgICAgICAgICs9IG51bGxlbmMubwogT0JKUy0kKENPTkZJR19OVVRfREVNVVhFUikgICAgICAgICAgICAgICArPSBudXRkZWMubyBudXQubyBpc29tLm8KQEAgLTMyMCw2ICszNjEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNjb21tZW50Lm8KIE9CSlMtJChDT05GSUdfT0dHX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gb2dnZW5jLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNjb21tZW50Lm8KK09CSlMtJChDT05GSUdfT0dWX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gb2dnZW5jLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNjb21tZW50Lm8KIE9CSlMtJChDT05GSUdfT01BX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gb21hZGVjLm8gcGNtLm8gb21hLm8KIE9CSlMtJChDT05GSUdfT01BX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gb21hZW5jLm8gcmF3ZW5jLm8gb21hLm8gaWQzdjJlbmMubwogT0JKUy0kKENPTkZJR19PUFVTX01VWEVSKSAgICAgICAgICAgICAgICArPSBvZ2dlbmMubyBcCkBAIC0zODEsOSArNDI0LDkgQEAKIE9CSlMtJChDT05GSUdfUk9RX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gaWRyb3FkZWMubwogT0JKUy0kKENPTkZJR19ST1FfTVVYRVIpICAgICAgICAgICAgICAgICArPSBpZHJvcWVuYy5vIHJhd2VuYy5vCiBPQkpTLSQoQ09ORklHX1JTRF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHJzZC5vCitPQkpTLSQoQ09ORklHX1JQTF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHJwbC5vCiBPQkpTLSQoQ09ORklHX1JTT19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHJzb2RlYy5vIHJzby5vIHBjbS5vCiBPQkpTLSQoQ09ORklHX1JTT19NVVhFUikgICAgICAgICAgICAgICAgICs9IHJzb2VuYy5vIHJzby5vCi1PQkpTLSQoQ09ORklHX1JQTF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHJwbC5vCiBPQkpTLSQoQ09ORklHX1JUUF9NUEVHVFNfTVVYRVIpICAgICAgICAgICs9IHJ0cGVuY19tcGVndHMubwogT0JKUy0kKENPTkZJR19SVFBfTVVYRVIpICAgICAgICAgICAgICAgICArPSBydHAubyAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jX2FhYy5vICAgICBcCkBAIC0zOTYsMjAgKzQzOSwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBlbmNfanBlZy5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jX21wdi5vICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0cGVuYy5vICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBlbmNfdmMyaHEubyAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHBlbmNfdnA4Lm8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jX3ZwOS5vICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRwZW5jX3hpcGgubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Yy5vIGhldmMubwogT0JKUy0kKENPTkZJR19SVFNQX0RFTVVYRVIpICAgICAgICAgICAgICArPSBydHNwLm8gcnRzcGRlYy5vIGh0dHBhdXRoLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxkZWNvZGUubwogT0JKUy0kKENPTkZJR19SVFNQX01VWEVSKSAgICAgICAgICAgICAgICArPSBydHNwLm8gcnRzcGVuYy5vIGh0dHBhdXRoLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxkZWNvZGUubworT0JKUy0kKENPTkZJR19TMzM3TV9ERU1VWEVSKSAgICAgICAgICAgICArPSBzMzM3bS5vIHNwZGlmLm8KIE9CSlMtJChDT05GSUdfU0FNSV9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gc2FtaWRlYy5vIHN1YnRpdGxlcy5vCiBPQkpTLSQoQ09ORklHX1NBUF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHNhcGRlYy5vCiBPQkpTLSQoQ09ORklHX1NBUF9NVVhFUikgICAgICAgICAgICAgICAgICs9IHNhcGVuYy5vCitPQkpTLSQoQ09ORklHX1NCQ19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHNiY2RlYy5vIHJhd2RlYy5vCitPQkpTLSQoQ09ORklHX1NCQ19NVVhFUikgICAgICAgICAgICAgICAgICs9IHJhd2VuYy5vCiBPQkpTLSQoQ09ORklHX1NCR19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHNiZ2RlYy5vCitPQkpTLSQoQ09ORklHX1NDQ19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHNjY2RlYy5vIHN1YnRpdGxlcy5vCitPQkpTLSQoQ09ORklHX1NDQ19NVVhFUikgICAgICAgICAgICAgICAgICs9IHNjY2VuYy5vIHN1YnRpdGxlcy5vCiBPQkpTLSQoQ09ORklHX1NEUF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHJ0c3AubwogT0JKUy0kKENPTkZJR19TRFIyX0RFTVVYRVIpICAgICAgICAgICAgICArPSBzZHIyLm8KK09CSlMtJChDT05GSUdfU0RTX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gc2RzZGVjLm8KK09CSlMtJChDT05GSUdfU0RYX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gc2R4ZGVjLm8KIE9CSlMtJChDT05GSUdfU0VHQUZJTE1fREVNVVhFUikgICAgICAgICAgKz0gc2VnYWZpbG0ubworT0JKUy0kKENPTkZJR19TRUdBRklMTV9NVVhFUikgICAgICAgICAgICArPSBzZWdhZmlsbWVuYy5vCiBPQkpTLSQoQ09ORklHX1NFR01FTlRfTVVYRVIpICAgICAgICAgICAgICs9IHNlZ21lbnQubwogT0JKUy0kKENPTkZJR19TSE9SVEVOX0RFTVVYRVIpICAgICAgICAgICArPSBzaG9ydGVuZGVjLm8gcmF3ZGVjLm8KIE9CSlMtJChDT05GSUdfU0lGRl9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gc2lmZi5vCkBAIC00MTcsNyArNDcwLDcgQEAKIE9CSlMtJChDT05GSUdfU01BQ0tFUl9ERU1VWEVSKSAgICAgICAgICAgKz0gc21hY2tlci5vCiBPQkpTLSQoQ09ORklHX1NNSlBFR19ERU1VWEVSKSAgICAgICAgICAgICs9IHNtanBlZ2RlYy5vIHNtanBlZy5vCiBPQkpTLSQoQ09ORklHX1NNSlBFR19NVVhFUikgICAgICAgICAgICAgICs9IHNtanBlZ2VuYy5vIHNtanBlZy5vCi1PQkpTLSQoQ09ORklHX1NNT09USFNUUkVBTUlOR19NVVhFUikgICAgICs9IHNtb290aHN0cmVhbWluZ2VuYy5vIGlzb20ubworT0JKUy0kKENPTkZJR19TTU9PVEhTVFJFQU1JTkdfTVVYRVIpICAgICArPSBzbW9vdGhzdHJlYW1pbmdlbmMubwogT0JKUy0kKENPTkZJR19TTVVTSF9ERU1VWEVSKSAgICAgICAgICAgICArPSBzbXVzaC5vCiBPQkpTLSQoQ09ORklHX1NPTF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHNvbC5vIHBjbS5vCiBPQkpTLSQoQ09ORklHX1NPWF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHNveGRlYy5vIHBjbS5vCkBAIC00MzAsMTUgKzQ4MywxNyBAQAogT0JKUy0kKENPTkZJR19TUlRfTVVYRVIpICAgICAgICAgICAgICAgICArPSBzcnRlbmMubwogT0JKUy0kKENPTkZJR19TVExfREVNVVhFUikgICAgICAgICAgICAgICArPSBzdGxkZWMubyBzdWJ0aXRsZXMubwogT0JKUy0kKENPTkZJR19TVFJfREVNVVhFUikgICAgICAgICAgICAgICArPSBwc3hzdHIubworT0JKUy0kKENPTkZJR19TVFJFQU1fU0VHTUVOVF9NVVhFUikgICAgICArPSBzZWdtZW50Lm8KIE9CSlMtJChDT05GSUdfU1VCVklFV0VSMV9ERU1VWEVSKSAgICAgICAgKz0gc3Vidmlld2VyMWRlYy5vIHN1YnRpdGxlcy5vCiBPQkpTLSQoQ09ORklHX1NVQlZJRVdFUl9ERU1VWEVSKSAgICAgICAgICs9IHN1YnZpZXdlcmRlYy5vIHN1YnRpdGxlcy5vCiBPQkpTLSQoQ09ORklHX1NVUF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHN1cGRlYy5vCitPQkpTLSQoQ09ORklHX1NVUF9NVVhFUikgICAgICAgICAgICAgICAgICs9IHN1cGVuYy5vCiBPQkpTLSQoQ09ORklHX1NWQUdfREVNVVhFUikgICAgICAgICAgICAgICs9IHN2YWcubwogT0JKUy0kKENPTkZJR19TV0ZfREVNVVhFUikgICAgICAgICAgICAgICArPSBzd2ZkZWMubyBzd2YubwogT0JKUy0kKENPTkZJR19TV0ZfTVVYRVIpICAgICAgICAgICAgICAgICArPSBzd2ZlbmMubyBzd2YubwogT0JKUy0kKENPTkZJR19UQUtfREVNVVhFUikgICAgICAgICAgICAgICArPSB0YWtkZWMubyBhcGV0YWcubyBpbWcyLm8gcmF3ZGVjLm8KIE9CSlMtJChDT05GSUdfVEVEQ0FQVElPTlNfREVNVVhFUikgICAgICAgKz0gdGVkY2FwdGlvbnNkZWMubyBzdWJ0aXRsZXMubwotT0JKUy0kKENPTkZJR19URUVfTVVYRVIpICAgICAgICAgICAgICAgICArPSB0ZWUubworT0JKUy0kKENPTkZJR19URUVfTVVYRVIpICAgICAgICAgICAgICAgICArPSB0ZWUubyB0ZWVfY29tbW9uLm8KIE9CSlMtJChDT05GSUdfVEhQX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gdGhwLm8KIE9CSlMtJChDT05GSUdfVEhSRUVET1NUUl9ERU1VWEVSKSAgICAgICAgKz0gM2Rvc3RyLm8KIE9CSlMtJChDT05GSUdfVElFUlRFWFNFUV9ERU1VWEVSKSAgICAgICAgKz0gdGllcnRleHNlcS5vCkBAIC00NDcsNyArNTAyLDkgQEAKIE9CSlMtJChDT05GSUdfVFJVRUhEX0RFTVVYRVIpICAgICAgICAgICAgKz0gcmF3ZGVjLm8gbWxwZGVjLm8KIE9CSlMtJChDT05GSUdfVFJVRUhEX01VWEVSKSAgICAgICAgICAgICAgKz0gcmF3ZW5jLm8KIE9CSlMtJChDT05GSUdfVFRBX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gdHRhLm8gYXBldGFnLm8gaW1nMi5vCitPQkpTLSQoQ09ORklHX1RUQV9NVVhFUikgICAgICAgICAgICAgICAgICs9IHR0YWVuYy5vIGFwZXRhZy5vIGltZzIubwogT0JKUy0kKENPTkZJR19UVFlfREVNVVhFUikgICAgICAgICAgICAgICArPSB0dHkubyBzYXVjZS5vCitPQkpTLSQoQ09ORklHX1RZX0RFTVVYRVIpICAgICAgICAgICAgICAgICs9IHR5Lm8KIE9CSlMtJChDT05GSUdfVFhEX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gdHhkLm8KIE9CSlMtJChDT05GSUdfVU5DT0RFREZSQU1FQ1JDX01VWEVSKSAgICAgKz0gdW5jb2RlZGZyYW1lY3JjZW5jLm8gZnJhbWVoYXNoLm8KIE9CSlMtJChDT05GSUdfVjIxMF9ERU1VWEVSKSAgICAgICAgICAgICAgKz0gdjIxMC5vCkBAIC00NjAsNyArNTE3LDcgQEAKIE9CSlMtJChDT05GSUdfVklWT19ERU1VWEVSKSAgICAgICAgICAgICAgKz0gdml2by5vCiBPQkpTLSQoQ09ORklHX1ZNRF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHNpZXJyYXZtZC5vCiBPQkpTLSQoQ09ORklHX1ZPQlNVQl9ERU1VWEVSKSAgICAgICAgICAgICs9IHN1YnRpdGxlcy5vICMgbXBlZyBkZW11eGVyIGlzIGluIHRoZSBkZXBlbmRlbmNpZXMKLU9CSlMtJChDT05GSUdfVk9DX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gdm9jZGVjLm8gdm9jLm8KK09CSlMtJChDT05GSUdfVk9DX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gdm9jZGVjLm8gdm9jX3BhY2tldC5vIHZvYy5vCiBPQkpTLSQoQ09ORklHX1ZPQ19NVVhFUikgICAgICAgICAgICAgICAgICs9IHZvY2VuYy5vIHZvYy5vCiBPQkpTLSQoQ09ORklHX1ZQS19ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHZway5vCiBPQkpTLSQoQ09ORklHX1ZQTEFZRVJfREVNVVhFUikgICAgICAgICAgICs9IHZwbGF5ZXJkZWMubyBzdWJ0aXRsZXMubwpAQCAtNDcxLDI1ICs1MjgsMjIgQEAKIE9CSlMtJChDT05GSUdfV0FWX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gd2F2ZW5jLm8KIE9CSlMtJChDT05GSUdfV0MzX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gd2MzbW92aWUubwogT0JKUy0kKENPTkZJR19XRUJNX01VWEVSKSAgICAgICAgICAgICAgICArPSBtYXRyb3NrYWVuYy5vIG1hdHJvc2thLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29tLm8gYXZjLm8gaGV2Yy5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjLm8gaGV2Yy5vIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhY2VuY19oZWFkZXIubyBhdmxhbmd1YWdlLm8gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3di5vIHZvcmJpc2NvbW1lbnQubyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYm1kYXNoZW5jLm8gd2VibV9jaHVuay5vCi1PQkpTLSQoQ09ORklHX1dFQk1fREFTSF9NQU5JRkVTVF9ERU1VWEVSKSs9IG1hdHJvc2thZGVjLm8gbWF0cm9za2EubyAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc29tLm8gcm1zaXByLm8gZmxhY19waWN0dXJlLm8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZ2dwYXJzZXZvcmJpcy5vIHZvcmJpc2NvbW1lbnQubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWNfcGljdHVyZS5vIHJlcGxheWdhaW4ubwogT0JKUy0kKENPTkZJR19XRUJNX0RBU0hfTUFOSUZFU1RfTVVYRVIpICArPSB3ZWJtZGFzaGVuYy5vIG1hdHJvc2thLm8KIE9CSlMtJChDT05GSUdfV0VCTV9DSFVOS19NVVhFUikgICAgICAgICAgKz0gd2VibV9jaHVuay5vIG1hdHJvc2thLm8KIE9CSlMtJChDT05GSUdfV0VCUF9NVVhFUikgICAgICAgICAgICAgICAgKz0gd2VicGVuYy5vCiBPQkpTLSQoQ09ORklHX1dFQlZUVF9ERU1VWEVSKSAgICAgICAgICAgICs9IHdlYnZ0dGRlYy5vIHN1YnRpdGxlcy5vCiBPQkpTLSQoQ09ORklHX1dFQlZUVF9NVVhFUikgICAgICAgICAgICAgICs9IHdlYnZ0dGVuYy5vCiBPQkpTLSQoQ09ORklHX1dTQVVEX0RFTVVYRVIpICAgICAgICAgICAgICs9IHdlc3R3b29kX2F1ZC5vCitPQkpTLSQoQ09ORklHX1dTRF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHdzZGRlYy5vIHJhd2RlYy5vCiBPQkpTLSQoQ09ORklHX1dTVlFBX0RFTVVYRVIpICAgICAgICAgICAgICs9IHdlc3R3b29kX3ZxYS5vCi1PQkpTLSQoQ09ORklHX1dUVl9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHd0dmRlYy5vIHd0dl9jb21tb24ubyBhc2YubyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2bGFuZ3VhZ2UubyBtcGVndHMubyBpc29tLm8KK09CSlMtJChDT05GSUdfV1RWX0RFTVVYRVIpICAgICAgICAgICAgICAgKz0gd3R2ZGVjLm8gd3R2X2NvbW1vbi5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNmLm8KIE9CSlMtJChDT05GSUdfV1RWX01VWEVSKSAgICAgICAgICAgICAgICAgKz0gd3R2ZW5jLm8gd3R2X2NvbW1vbi5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZ3RzZW5jLm8gYXNmLm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNmLm8KIE9CSlMtJChDT05GSUdfV1ZfREVNVVhFUikgICAgICAgICAgICAgICAgKz0gd3ZkZWMubyB3di5vIGFwZXRhZy5vIGltZzIubwogT0JKUy0kKENPTkZJR19XVkVfREVNVVhFUikgICAgICAgICAgICAgICArPSB3dmVkZWMubyBwY20ubwogT0JKUy0kKENPTkZJR19XVl9NVVhFUikgICAgICAgICAgICAgICAgICArPSB3dmVuYy5vIHd2Lm8gYXBldGFnLm8gaW1nMi5vCkBAIC00OTksMTYgKzU1MywyMSBAQAogT0JKUy0kKENPTkZJR19YVkFHX0RFTVVYRVIpICAgICAgICAgICAgICArPSB4dmFnLm8KIE9CSlMtJChDT05GSUdfWFdNQV9ERU1VWEVSKSAgICAgICAgICAgICAgKz0geHdtYS5vCiBPQkpTLSQoQ09ORklHX1lPUF9ERU1VWEVSKSAgICAgICAgICAgICAgICs9IHlvcC5vCi1PQkpTLSQoQ09ORklHX1lVVjRNUEVHUElQRV9NVVhFUikgICAgICAgICs9IHl1djRtcGVnZW5jLm8KIE9CSlMtJChDT05GSUdfWVVWNE1QRUdQSVBFX0RFTVVYRVIpICAgICAgKz0geXV2NG1wZWdkZWMubworT0JKUy0kKENPTkZJR19ZVVY0TVBFR1BJUEVfTVVYRVIpICAgICAgICArPSB5dXY0bXBlZ2VuYy5vCiAKICMgZXh0ZXJuYWwgbGlicmFyaWVzCitPQkpTLSQoQ09ORklHX0FWSVNZTlRIX0RFTVVYRVIpICAgICAgICAgICs9IGF2aXN5bnRoLm8KIE9CSlMtJChDT05GSUdfQ0hST01BUFJJTlRfTVVYRVIpICAgICAgICAgKz0gY2hyb21hcHJpbnQubwogT0JKUy0kKENPTkZJR19MSUJHTUVfREVNVVhFUikgICAgICAgICAgICArPSBsaWJnbWUubwogT0JKUy0kKENPTkZJR19MSUJNT0RQTFVHX0RFTVVYRVIpICAgICAgICArPSBsaWJtb2RwbHVnLm8KLU9CSlMtJChDT05GSUdfTElCTlVUX0RFTVVYRVIpICAgICAgICAgICAgKz0gbGlibnV0Lm8KLU9CSlMtJChDT05GSUdfTElCTlVUX01VWEVSKSAgICAgICAgICAgICAgKz0gbGlibnV0Lm8KLU9CSlMtJChDT05GSUdfTElCUlRNUCkgICAgICAgICAgICAgICAgICAgKz0gbGlicnRtcC5vCitPQkpTLSQoQ09ORklHX0xJQk9QRU5NUFRfREVNVVhFUikgICAgICAgICs9IGxpYm9wZW5tcHQubworT0JKUy0kKENPTkZJR19MSUJSVE1QX1BST1RPQ09MKSAgICAgICAgICArPSBsaWJydG1wLm8KK09CSlMtJChDT05GSUdfTElCUlRNUEVfUFJPVE9DT0wpICAgICAgICAgKz0gbGlicnRtcC5vCitPQkpTLSQoQ09ORklHX0xJQlJUTVBTX1BST1RPQ09MKSAgICAgICAgICs9IGxpYnJ0bXAubworT0JKUy0kKENPTkZJR19MSUJSVE1QVF9QUk9UT0NPTCkgICAgICAgICArPSBsaWJydG1wLm8KK09CSlMtJChDT05GSUdfTElCUlRNUFRFX1BST1RPQ09MKSAgICAgICAgKz0gbGlicnRtcC5vCitPQkpTLSQoQ09ORklHX0xJQlNSVF9QUk9UT0NPTCkgICAgICAgICAgICs9IGxpYnNydC5vCiBPQkpTLSQoQ09ORklHX0xJQlNTSF9QUk9UT0NPTCkgICAgICAgICAgICs9IGxpYnNzaC5vCiBPQkpTLSQoQ09ORklHX0xJQlNNQkNMSUVOVF9QUk9UT0NPTCkgICAgICs9IGxpYnNtYmNsaWVudC5vCiAKQEAgLTUyMCw3ICs1NzksNyBAQAogT0JKUy0kKENPTkZJR19DT05DQVRfUFJPVE9DT0wpICAgICAgICAgICArPSBjb25jYXQubwogT0JKUy0kKENPTkZJR19DUllQVE9fUFJPVE9DT0wpICAgICAgICAgICArPSBjcnlwdG8ubwogT0JKUy0kKENPTkZJR19EQVRBX1BST1RPQ09MKSAgICAgICAgICAgICArPSBkYXRhX3VyaS5vCi1PQkpTLSQoQ09ORklHX0ZGUlRNUENSWVBUX1BST1RPQ09MKSAgICAgICs9IHJ0bXBjcnlwdC5vIHJ0bXBkaC5vCitPQkpTLSQoQ09ORklHX0ZGUlRNUENSWVBUX1BST1RPQ09MKSAgICAgICs9IHJ0bXBjcnlwdC5vIHJ0bXBkaWdlc3QubyBydG1wZGgubwogT0JKUy0kKENPTkZJR19GRlJUTVBIVFRQX1BST1RPQ09MKSAgICAgICArPSBydG1waHR0cC5vCiBPQkpTLSQoQ09ORklHX0ZJTEVfUFJPVE9DT0wpICAgICAgICAgICAgICs9IGZpbGUubwogT0JKUy0kKENPTkZJR19GVFBfUFJPVE9DT0wpICAgICAgICAgICAgICArPSBmdHAubwpAQCAtNTMwLDMxICs1ODksMzMgQEAKIE9CSlMtJChDT05GSUdfSFRUUFBST1hZX1BST1RPQ09MKSAgICAgICAgKz0gaHR0cC5vIGh0dHBhdXRoLm8gdXJsZGVjb2RlLm8KIE9CSlMtJChDT05GSUdfSFRUUFNfUFJPVE9DT0wpICAgICAgICAgICAgKz0gaHR0cC5vIGh0dHBhdXRoLm8gdXJsZGVjb2RlLm8KIE9CSlMtJChDT05GSUdfSUNFQ0FTVF9QUk9UT0NPTCkgICAgICAgICAgKz0gaWNlY2FzdC5vCitPQkpTLSQoQ09ORklHX01ENV9QUk9UT0NPTCkgICAgICAgICAgICAgICs9IG1kNXByb3RvLm8KIE9CSlMtJChDT05GSUdfTU1TSF9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gbW1zaC5vIG1tcy5vIGFzZi5vCiBPQkpTLSQoQ09ORklHX01NU1RfUFJPVE9DT0wpICAgICAgICAgICAgICs9IG1tc3QubyBtbXMubyBhc2YubwotT0JKUy0kKENPTkZJR19NRDVfUFJPVE9DT0wpICAgICAgICAgICAgICArPSBtZDVwcm90by5vCiBPQkpTLSQoQ09ORklHX1BJUEVfUFJPVE9DT0wpICAgICAgICAgICAgICs9IGZpbGUubwotT0JKUy0kKENPTkZJR19SVE1QX1BST1RPQ09MKSAgICAgICAgICAgICArPSBydG1wcHJvdG8ubyBydG1wcGt0Lm8KLU9CSlMtJChDT05GSUdfUlRNUEVfUFJPVE9DT0wpICAgICAgICAgICAgKz0gcnRtcHByb3RvLm8gcnRtcHBrdC5vCi1PQkpTLSQoQ09ORklHX1JUTVBTX1BST1RPQ09MKSAgICAgICAgICAgICs9IHJ0bXBwcm90by5vIHJ0bXBwa3QubwotT0JKUy0kKENPTkZJR19SVE1QVF9QUk9UT0NPTCkgICAgICAgICAgICArPSBydG1wcHJvdG8ubyBydG1wcGt0Lm8KLU9CSlMtJChDT05GSUdfUlRNUFRFX1BST1RPQ09MKSAgICAgICAgICAgKz0gcnRtcHByb3RvLm8gcnRtcHBrdC5vCi1PQkpTLSQoQ09ORklHX1JUTVBUU19QUk9UT0NPTCkgICAgICAgICAgICs9IHJ0bXBwcm90by5vIHJ0bXBwa3QubworT0JKUy0kKENPTkZJR19QUk9NUEVHX1BST1RPQ09MKSAgICAgICAgICArPSBwcm9tcGVnLm8KK09CSlMtJChDT05GSUdfUlRNUF9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gcnRtcHByb3RvLm8gcnRtcGRpZ2VzdC5vIHJ0bXBwa3QubworT0JKUy0kKENPTkZJR19SVE1QRV9QUk9UT0NPTCkgICAgICAgICAgICArPSBydG1wcHJvdG8ubyBydG1wZGlnZXN0Lm8gcnRtcHBrdC5vCitPQkpTLSQoQ09ORklHX1JUTVBTX1BST1RPQ09MKSAgICAgICAgICAgICs9IHJ0bXBwcm90by5vIHJ0bXBkaWdlc3QubyBydG1wcGt0Lm8KK09CSlMtJChDT05GSUdfUlRNUFRfUFJPVE9DT0wpICAgICAgICAgICAgKz0gcnRtcHByb3RvLm8gcnRtcGRpZ2VzdC5vIHJ0bXBwa3QubworT0JKUy0kKENPTkZJR19SVE1QVEVfUFJPVE9DT0wpICAgICAgICAgICArPSBydG1wcHJvdG8ubyBydG1wZGlnZXN0Lm8gcnRtcHBrdC5vCitPQkpTLSQoQ09ORklHX1JUTVBUU19QUk9UT0NPTCkgICAgICAgICAgICs9IHJ0bXBwcm90by5vIHJ0bXBkaWdlc3QubyBydG1wcGt0Lm8KIE9CSlMtJChDT05GSUdfUlRQX1BST1RPQ09MKSAgICAgICAgICAgICAgKz0gcnRwcHJvdG8ubwogT0JKUy0kKENPTkZJR19TQ1RQX1BST1RPQ09MKSAgICAgICAgICAgICArPSBzY3RwLm8KIE9CSlMtJChDT05GSUdfU1JUUF9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gc3J0cHByb3RvLm8gc3J0cC5vCiBPQkpTLSQoQ09ORklHX1NVQkZJTEVfUFJPVE9DT0wpICAgICAgICAgICs9IHN1YmZpbGUubworT0JKUy0kKENPTkZJR19URUVfUFJPVE9DT0wpICAgICAgICAgICAgICArPSB0ZWVwcm90by5vIHRlZV9jb21tb24ubwogT0JKUy0kKENPTkZJR19UQ1BfUFJPVE9DT0wpICAgICAgICAgICAgICArPSB0Y3AubwotT0JKUy0kKENPTkZJR19UTFNfR05VVExTX1BST1RPQ09MKSAgICAgICArPSB0bHNfZ251dGxzLm8gdGxzLm8KLU9CSlMtJChDT05GSUdfVExTX09QRU5TU0xfUFJPVE9DT0wpICAgICAgKz0gdGxzX29wZW5zc2wubyB0bHMubwotT0JKUy0kKENPTkZJR19UTFNfU0NIQU5ORUxfUFJPVE9DT0wpICAgICArPSB0bHNfc2NoYW5uZWwubyB0bHMubwotT0JKUy0kKENPTkZJR19UTFNfU0VDVVJFVFJBTlNQT1JUX1BST1RPQ09MKSArPSB0bHNfc2VjdXJldHJhbnNwb3J0Lm8gdGxzLm8KK1RMUy1PQkpTLSQoQ09ORklHX0dOVVRMUykgICAgICAgICAgICAgICAgKz0gdGxzX2dudXRscy5vCitUTFMtT0JKUy0kKENPTkZJR19MSUJUTFMpICAgICAgICAgICAgICAgICs9IHRsc19saWJ0bHMubworVExTLU9CSlMtJChDT05GSUdfT1BFTlNTTCkgICAgICAgICAgICAgICArPSB0bHNfb3BlbnNzbC5vCitUTFMtT0JKUy0kKENPTkZJR19TRUNVUkVUUkFOU1BPUlQpICAgICAgICs9IHRsc19zZWN1cmV0cmFuc3BvcnQubworVExTLU9CSlMtJChDT05GSUdfU0NIQU5ORUwpICAgICAgICAgICAgICArPSB0bHNfc2NoYW5uZWwubworT0JKUy0kKENPTkZJR19UTFNfUFJPVE9DT0wpICAgICAgICAgICAgICArPSB0bHMubyAkKFRMUy1PQkpTLXllcykKIE9CSlMtJChDT05GSUdfVURQX1BST1RPQ09MKSAgICAgICAgICAgICAgKz0gdWRwLm8KIE9CSlMtJChDT05GSUdfVURQTElURV9QUk9UT0NPTCkgICAgICAgICAgKz0gdWRwLm8KIE9CSlMtJChDT05GSUdfVU5JWF9QUk9UT0NPTCkgICAgICAgICAgICAgKz0gdW5peC5vCiAKLU9CSlMtJChIQVZFX0xJQkNfTVNWQ1JUKSAgICAgICAgICAgICAgICAgKz0gZmlsZV9vcGVuLm8KLQogIyBsaWJhdmRldmljZSBkZXBlbmRlbmNpZXMKIE9CSlMtJChDT05GSUdfSUVDNjE4ODNfSU5ERVYpICAgICAgICAgICAgKz0gZHYubwogCkBAIC01NjQsMTQgKzYyNSwxNiBAQAogU0tJUEhFQURFUlMtJChDT05GSUdfRkZSVE1QQ1JZUFRfUFJPVE9DT0wpICs9IHJ0bXBkaC5oCiBTS0lQSEVBREVSUy0kKENPTkZJR19ORVRXT1JLKSAgICAgICAgICAgICs9IG5ldHdvcmsuaCBydHNwLmgKIAotVEVTVFBST0dTID0gYXN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgc2VlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgc3J0cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorVEVTVFBST0dTID0gc2VlayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgdXJsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorIyAgICAgICAgICAgYXN5bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCitGSUZPLU1VWEVSLVRFU1RQUk9HUy0kKENPTkZJR19ORVRXT1JLKSAgICs9IGZpZm9fbXV4ZXIKK1RFU1RQUk9HUy0kKENPTkZJR19GSUZPX01VWEVSKSAgICAgICAgICAgKz0gJChGSUZPLU1VWEVSLVRFU1RQUk9HUy15ZXMpCitURVNUUFJPR1MtJChDT05GSUdfRkZSVE1QQ1JZUFRfUFJPVE9DT0wpICs9IHJ0bXBkaAogVEVTVFBST0dTLSQoQ09ORklHX01PVl9NVVhFUikgICAgICAgICAgICArPSBtb3ZlbmMKIFRFU1RQUk9HUy0kKENPTkZJR19ORVRXT1JLKSAgICAgICAgICAgICAgKz0gbm9wcm94eQotVEVTVFBST0dTLSQoQ09ORklHX0ZGUlRNUENSWVBUX1BST1RPQ09MKSArPSBydG1wZGgKK1RFU1RQUk9HUy0kKENPTkZJR19TUlRQKSAgICAgICAgICAgICAgICAgKz0gc3J0cAogCiBUT09MUyAgICAgPSBhdmlvY2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBpc21pbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hNjQuYyBiL2xpYmF2Zm9ybWF0L2E2NC5jCmluZGV4IGE3ZjkzYTIuLjJhMDQ4OWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2E2NC5jCisrKyBiL2xpYmF2Zm9ybWF0L2E2NC5jCkBAIC0yNiw3ICsyNiw3IEBACiAKIHN0YXRpYyBpbnQgYTY0X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogICAgIHVpbnQ4X3QgaGVhZGVyWzVdID0gewogICAgICAgICAweDAwLCAvL2xvYWQKICAgICAgICAgMHg0MCwgLy9hZGRyZXNzCkBAIC0zNSwyMCArMzUsMjAgQEAKICAgICAgICAgMHgwMCAgLy9mcHMgaW4gNTAvZnBzOwogICAgIH07CiAKLSAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplIDwgNCkgeworICAgIGlmIChwYXItPmV4dHJhZGF0YV9zaXplIDwgNCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBleHRyYWRhdGFcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIHN3aXRjaCAocGFyLT5jb2RlY19pZCkgewogICAgIGNhc2UgQVZfQ09ERUNfSURfQTY0X01VTFRJOgogICAgICAgICBoZWFkZXJbMl0gPSAweDAwOwotICAgICAgICBoZWFkZXJbM10gPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGErMCk7CisgICAgICAgIGhlYWRlclszXSA9IEFWX1JCMzIocGFyLT5leHRyYWRhdGErMCk7CiAgICAgICAgIGhlYWRlcls0XSA9IDI7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfQTY0X01VTFRJNToKICAgICAgICAgaGVhZGVyWzJdID0gMHgwMTsKLSAgICAgICAgaGVhZGVyWzNdID0gQVZfUkIzMihhdmN0eC0+ZXh0cmFkYXRhKzApOworICAgICAgICBoZWFkZXJbM10gPSBBVl9SQjMyKHBhci0+ZXh0cmFkYXRhKzApOwogICAgICAgICBoZWFkZXJbNF0gPSAzOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYWFjZGVjLmMgYi9saWJhdmZvcm1hdC9hYWNkZWMuYwppbmRleCAxYjk4ZTFkLi42ODU0NThiIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hYWNkZWMuYworKysgYi9saWJhdmZvcm1hdC9hYWNkZWMuYwpAQCAtMjIsMTEgKzIyLDE0IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJyYXdkZWMuaCIKICNpbmNsdWRlICJpZDN2MS5oIgorI2luY2x1ZGUgImlkM3YyLmgiCiAjaW5jbHVkZSAiYXBldGFnLmgiCiAKKyNkZWZpbmUgQURUU19IRUFERVJfU0laRSA3CisKIHN0YXRpYyBpbnQgYWR0c19hYWNfcHJvYmUoQVZQcm9iZURhdGEgKnApCiB7CiAgICAgaW50IG1heF9mcmFtZXMgPSAwLCBmaXJzdF9mcmFtZXMgPSAwOwpAQCAtNzAsNyArNzMsNyBAQAogICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CiAgICAgZWxzZSBpZiAobWF4X2ZyYW1lcyA+PSAzKQogICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyOwotICAgIGVsc2UgaWYgKG1heF9mcmFtZXMgPj0gMSkKKyAgICBlbHNlIGlmIChmaXJzdF9mcmFtZXMgPj0gMSkKICAgICAgICAgcmV0dXJuIDE7CiAgICAgZWxzZQogICAgICAgICByZXR1cm4gMDsKQEAgLTc5LDM1ICs4MiwxMjEgQEAKIHN0YXRpYyBpbnQgYWR0c19hYWNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIEFWU3RyZWFtICpzdDsKKyAgICB1aW50MTZfdCBzdGF0ZTsKIAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IHMtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKLSAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworICAgIHN0LT5uZWVkX3BhcnNpbmcgICAgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOwogCiAgICAgZmZfaWQzdjFfcmVhZChzKTsKLSAgICBpZiAocy0+cGItPnNlZWthYmxlICYmCisgICAgaWYgKChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgJiYKICAgICAgICAgIWF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkgewogICAgICAgICBpbnQ2NF90IGN1ciA9IGF2aW9fdGVsbChzLT5wYik7CiAgICAgICAgIGZmX2FwZV9wYXJzZV90YWcocyk7CiAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgY3VyLCBTRUVLX1NFVCk7CiAgICAgfQogCisgICAgLy8gc2tpcCBkYXRhIHVudGlsIHRoZSBmaXJzdCBBRFRTIGZyYW1lIGlzIGZvdW5kCisgICAgc3RhdGUgPSBhdmlvX3I4KHMtPnBiKTsKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikgJiYgYXZpb190ZWxsKHMtPnBiKSA8IHMtPnByb2Jlc2l6ZSkgeworICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGF2aW9fcjgocy0+cGIpOworICAgICAgICBpZiAoKHN0YXRlID4+IDQpICE9IDB4RkZGKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgLTIsIFNFRUtfQ1VSKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICgoc3RhdGUgPj4gNCkgIT0gMHhGRkYpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgLy8gTENNIG9mIGFsbCBwb3NzaWJsZSBBRFRTIHNhbXBsZSByYXRlcwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAyODIyNDAwMCk7CiAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBoYW5kbGVfaWQzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhID0gTlVMTDsKKyAgICBBVklPQ29udGV4dCBpb2N0eDsKKyAgICBJRDN2MkV4dHJhTWV0YSAqaWQzdjJfZXh0cmFfbWV0YSA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGF2X2FwcGVuZF9wYWNrZXQocy0+cGIsIHBrdCwgZmZfaWQzdjJfdGFnX2xlbihwa3QtPmRhdGEpIC0gcGt0LT5zaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmZmlvX2luaXRfY29udGV4dCgmaW9jdHgsIHBrdC0+ZGF0YSwgcGt0LT5zaXplLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBmZl9pZDN2Ml9yZWFkX2RpY3QoJmlvY3R4LCAmbWV0YWRhdGEsIElEM3YyX0RFRkFVTFRfTUFHSUMsICZpZDN2Ml9leHRyYV9tZXRhKTsKKyAgICBpZiAoKHJldCA9IGZmX2lkM3YyX3BhcnNlX3ByaXZfZGljdCgmbWV0YWRhdGEsICZpZDN2Ml9leHRyYV9tZXRhKSkgPCAwKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgaWYgKG1ldGFkYXRhKSB7CisgICAgICAgIGlmICgocmV0ID0gYXZfZGljdF9jb3B5KCZzLT5tZXRhZGF0YSwgbWV0YWRhdGEsIDApKSA8IDApCisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBzLT5ldmVudF9mbGFncyB8PSBBVkZNVF9FVkVOVF9GTEFHX01FVEFEQVRBX1VQREFURUQ7CisgICAgfQorCitlcnJvcjoKKyAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoJmlkM3YyX2V4dHJhX21ldGEpOworICAgIGF2X2RpY3RfZnJlZSgmbWV0YWRhdGEpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZHRzX2FhY19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCwgZnNpemU7CisKKyAgICAvLyBQYXJzZSBhbGwgdGhlIElEMyBoZWFkZXJzIGJldHdlZW4gZnJhbWVzCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBGRk1BWChJRDN2Ml9IRUFERVJfU0laRSwgQURUU19IRUFERVJfU0laRSkpOworICAgICAgICBpZiAocmV0ID49IElEM3YyX0hFQURFUl9TSVpFICYmIGZmX2lkM3YyX21hdGNoKHBrdC0+ZGF0YSwgSUQzdjJfREVGQVVMVF9NQUdJQykpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gaGFuZGxlX2lkMyhzLCBwa3QpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAocmV0IDwgQURUU19IRUFERVJfU0laRSkgeworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBpZiAoKEFWX1JCMTYocGt0LT5kYXRhKSA+PiA0KSAhPSAweGZmZikgeworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgZnNpemUgPSAoQVZfUkIzMihwa3QtPmRhdGEgKyAzKSA+PiAxMykgJiAweDFGRkY7CisgICAgaWYgKGZzaXplIDwgQURUU19IRUFERVJfU0laRSkgeworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0ID0gYXZfYXBwZW5kX3BhY2tldChzLT5wYiwgcGt0LCBmc2l6ZSAtIHBrdC0+c2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworCisgICAgcmV0dXJuIHJldDsKK30KKwogQVZJbnB1dEZvcm1hdCBmZl9hYWNfZGVtdXhlciA9IHsKICAgICAubmFtZSAgICAgICAgID0gImFhYyIsCiAgICAgLmxvbmdfbmFtZSAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgQURUUyBBQUMgKEFkdmFuY2VkIEF1ZGlvIENvZGluZykiKSwKICAgICAucmVhZF9wcm9iZSAgID0gYWR0c19hYWNfcHJvYmUsCiAgICAgLnJlYWRfaGVhZGVyICA9IGFkdHNfYWFjX3JlYWRfaGVhZGVyLAotICAgIC5yZWFkX3BhY2tldCAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAucmVhZF9wYWNrZXQgID0gYWR0c19hYWNfcmVhZF9wYWNrZXQsCiAgICAgLmZsYWdzICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCiAgICAgLmV4dGVuc2lvbnMgICA9ICJhYWMiLAogICAgIC5taW1lX3R5cGUgICAgPSAiYXVkaW8vYWFjLGF1ZGlvL2FhY3AsYXVkaW8veC1hYWMiLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYWFkZWMuYyBiL2xpYmF2Zm9ybWF0L2FhZGVjLmMKaW5kZXggMjY2YThlOC4uOGQzOWIxZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWFkZWMuYworKysgYi9saWJhdmZvcm1hdC9hYWRlYy5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RlYS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKQEAgLTEwMSwyNyArMTAyLDE4IEBACiAgICAgICAgIGF2aW9fc2tpcChwYiwgMSk7IC8vIHVuaWRlbnRpZmllZCBpbnRlZ2VyCiAgICAgICAgIG5rZXkgPSBhdmlvX3JiMzIocGIpOyAvLyBrZXkgc3RyaW5nIGxlbmd0aAogICAgICAgICBudmFsID0gYXZpb19yYjMyKHBiKTsgLy8gdmFsdWUgc3RyaW5nIGxlbmd0aAotICAgICAgICBpZiAobmtleSA+IHNpemVvZihrZXkpKSB7Ci0gICAgICAgICAgICBhdmlvX3NraXAocGIsIG5rZXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZpb19yZWFkKHBiLCBrZXksIG5rZXkpOyAvLyBrZXkgc3RyaW5nCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG52YWwgPiBzaXplb2YodmFsKSkgewotICAgICAgICAgICAgYXZpb19za2lwKHBiLCBudmFsKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgdmFsLCBudmFsKTsgLy8gdmFsdWUgc3RyaW5nCi0gICAgICAgIH0KKyAgICAgICAgYXZpb19nZXRfc3RyKHBiLCBua2V5LCBrZXksIHNpemVvZihrZXkpKTsKKyAgICAgICAgYXZpb19nZXRfc3RyKHBiLCBudmFsLCB2YWwsIHNpemVvZih2YWwpKTsKICAgICAgICAgaWYgKCFzdHJjbXAoa2V5LCAiY29kZWMiKSkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkNvZGVjIGlzIDwlcz5cbiIsIHZhbCk7CiAgICAgICAgICAgICBzdHJuY3B5KGNvZGVjX25hbWUsIHZhbCwgc2l6ZW9mKGNvZGVjX25hbWUpIC0gMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFzdHJjbXAoa2V5LCAiSGVhZGVyU2VlZCIpKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJIZWFkZXJTZWVkIikpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJIZWFkZXJTZWVkIGlzIDwlcz5cbiIsIHZhbCk7CiAgICAgICAgICAgICBoZWFkZXJfc2VlZCA9IGF0b2kodmFsKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXN0cmNtcChrZXksICJIZWFkZXJLZXkiKSkgeyAvLyB0aGlzIGxvb2tzIGxpa2UgIjEyMzQ1Njc4OTAgMTIzNDU2Nzg5MCAxMjM0NTY3ODkwIDEyMzQ1Njc4OTAiCisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJIZWFkZXJLZXkiKSkgeyAvLyB0aGlzIGxvb2tzIGxpa2UgIjEyMzQ1Njc4OTAgMTIzNDU2Nzg5MCAxMjM0NTY3ODkwIDEyMzQ1Njc4OTAiCiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiSGVhZGVyS2V5IGlzIDwlcz5cbiIsIHZhbCk7Ci0gICAgICAgICAgICBzc2NhbmYodmFsLCAiJXUldSV1JXUiLCAmaGVhZGVyX2tleV9wYXJ0WzBdLCAmaGVhZGVyX2tleV9wYXJ0WzFdLCAmaGVhZGVyX2tleV9wYXJ0WzJdLCAmaGVhZGVyX2tleV9wYXJ0WzNdKTsKKyAgICAgICAgICAgIHNzY2FuZih2YWwsICIlIlNDTnUzMiIlIlNDTnUzMiIlIlNDTnUzMiIlIlNDTnUzMiwKKyAgICAgICAgICAgICAgICAgICAmaGVhZGVyX2tleV9wYXJ0WzBdLCAmaGVhZGVyX2tleV9wYXJ0WzFdLCAmaGVhZGVyX2tleV9wYXJ0WzJdLCAmaGVhZGVyX2tleV9wYXJ0WzNdKTsKICAgICAgICAgICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgNDsgaWR4KyspIHsKICAgICAgICAgICAgICAgICBBVl9XQjMyKCZoZWFkZXJfa2V5W2lkeCAqIDRdLCBoZWFkZXJfa2V5X3BhcnRbaWR4XSk7IC8vIGNvbnZlcnQgZWFjaCBwYXJ0IHRvIEJFIQogICAgICAgICAgICAgfQpAQCAtMTI5LDYgKzEyMSw4IEBACiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJTAyeCIsIGhlYWRlcl9rZXlbaV0pOwogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIGtleSwgdmFsLCAwKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTczLDIyICsxNjcsMjQgQEAKICAgICAgICAgYXZfZnJlZXAoJmMtPnRlYV9jdHgpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgIGlmICghc3RyY21wKGNvZGVjX25hbWUsICJtcDMzMiIpKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDM7Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSAyMjA1MDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QMzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDIyMDUwOwogICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CiAgICAgICAgIHN0LT5zdGFydF90aW1lID0gMDsKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoY29kZWNfbmFtZSwgImFjZWxwODUiKSkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfU0lQUjsKLSAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IDE5OwotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMTsKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDg1MDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TSVBSOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMTk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSAxOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gODUwMDsKKyAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOwogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChjb2RlY19uYW1lLCAiYWNlbHAxNiIpKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TSVBSOwotICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMjA7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOwotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TSVBSOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMjA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSAxOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKICAgICB9CiAKICAgICAvKiBkZXRlcm1pbmUsIGFuZCBqdW1wIHRvIGF1ZGlvIHN0YXJ0IG9mZnNldCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYWMzZGVjLmMgYi9saWJhdmZvcm1hdC9hYzNkZWMuYwppbmRleCAzNjNhMzJlLi42ZjQyM2ZmIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hYzNkZWMuYworKysgYi9saWJhdmZvcm1hdC9hYzNkZWMuYwpAQCAtMTksNiArMTksNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9hYzNfcGFyc2VyLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKQEAgLTI4LDggKzI5LDYgQEAKIHsKICAgICBpbnQgbWF4X2ZyYW1lcywgZmlyc3RfZnJhbWVzID0gMCwgZnJhbWVzOwogICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgKmJ1ZjIsICplbmQ7Ci0gICAgQUMzSGVhZGVySW5mbyAqcGhkciA9IE5VTEw7Ci0gICAgR2V0Qml0Q29udGV4dCBnYmM7CiAgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQzM7CiAKICAgICBtYXhfZnJhbWVzID0gMDsKQEAgLTQ0LDM5ICs0Myw0OSBAQAogCiAgICAgICAgIGZvcihmcmFtZXMgPSAwOyBidWYyIDwgZW5kOyBmcmFtZXMrKykgewogICAgICAgICAgICAgdWludDhfdCBidWYzWzQwOTZdOwotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBpZighbWVtY21wKGJ1ZjIsICJceDFceDEwXDBcMFwwXDBcMFwwIiwgOCkpCisgICAgICAgICAgICB1aW50OF90IGJpdHN0cmVhbV9pZDsKKyAgICAgICAgICAgIHVpbnQxNl90IGZyYW1lX3NpemU7CisgICAgICAgICAgICBpbnQgaSwgcmV0OworCisgICAgICAgICAgICBpZighbWVtY21wKGJ1ZjIsICJceDFceDEwXDBcMFwwXDBcMFwwIiwgOCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoYnVmMiArIDE2ID4gZW5kKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBidWYyKz0xNjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChidWZbMF0gPT0gMHg3NyAmJiBidWZbMV0gPT0gMHgwQikgewogICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8ODsgaSs9MikgewotICAgICAgICAgICAgICAgICAgICBidWYzW2kgIF0gPSBidWZbaSsxXTsKLSAgICAgICAgICAgICAgICAgICAgYnVmM1tpKzFdID0gYnVmW2kgIF07CisgICAgICAgICAgICAgICAgICAgIGJ1ZjNbaSAgXSA9IGJ1ZjJbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgYnVmM1tpKzFdID0gYnVmMltpICBdOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbml0X2dldF9iaXRzKCZnYmMsIGJ1ZjMsIDU0KTsKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9hYzNfcGFyc2VfaGVhZGVyKGJ1ZjMsIDgsICZiaXRzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVfc2l6ZSk7CiAgICAgICAgICAgICB9ZWxzZQotICAgICAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiYywgYnVmMiwgNTQpOwotICAgICAgICAgICAgaWYoYXZwcml2X2FjM19wYXJzZV9oZWFkZXIoJmdiYywgJnBoZHIpIDwgMCkKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9hYzNfcGFyc2VfaGVhZGVyKGJ1ZjIsIGVuZCAtIGJ1ZjIsICZiaXRzdHJlYW1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGlmKGJ1ZjIgKyBwaGRyLT5mcmFtZV9zaXplID4gZW5kKQorICAgICAgICAgICAgaWYoYnVmMiArIGZyYW1lX3NpemUgPiBlbmQpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBpZiAoYnVmWzBdID09IDB4NzcgJiYgYnVmWzFdID09IDB4MEIpIHsKLSAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKHBoZHItPmZyYW1lX3NpemUgPD0gc2l6ZW9mKGJ1ZjMpKTsKLSAgICAgICAgICAgICAgICBmb3IoaT04OyBpPHBoZHItPmZyYW1lX3NpemU7IGkrPTIpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmM1tpICBdID0gYnVmW2krMV07Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZjNbaSsxXSA9IGJ1ZltpICBdOworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoZnJhbWVfc2l6ZSA8PSBzaXplb2YoYnVmMykpOworICAgICAgICAgICAgICAgIGZvcihpID0gODsgaSA8IGZyYW1lX3NpemU7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICBidWYzW2kgIF0gPSBidWYyW2krMV07CisgICAgICAgICAgICAgICAgICAgIGJ1ZjNbaSsxXSA9IGJ1ZjJbaSAgXTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18xNl9BTlNJKSwgMCwgYnVmMyArIDIsIGZyYW1lX3NpemUgLSAyKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMTZfQU5TSSksIDAsIGJ1ZjIgKyAyLCBmcmFtZV9zaXplIC0gMikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYoYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzE2X0FOU0kpLCAwLCBnYmMuYnVmZmVyICsgMiwgcGhkci0+ZnJhbWVfc2l6ZSAtIDIpKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKHBoZHItPmJpdHN0cmVhbV9pZCA+IDEwKQorICAgICAgICAgICAgaWYgKGJpdHN0cmVhbV9pZCA+IDEwKQogICAgICAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfRUFDMzsKLSAgICAgICAgICAgIGJ1ZjIgKz0gcGhkci0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgICAgIGJ1ZjIgKz0gZnJhbWVfc2l6ZTsKICAgICAgICAgfQogICAgICAgICBtYXhfZnJhbWVzID0gRkZNQVgobWF4X2ZyYW1lcywgZnJhbWVzKTsKICAgICAgICAgaWYoYnVmID09IHAtPmJ1ZikKICAgICAgICAgICAgIGZpcnN0X2ZyYW1lcyA9IGZyYW1lczsKICAgICB9Ci0gICAgYXZfZnJlZXAoJnBoZHIpOwogICAgIGlmKGNvZGVjX2lkICE9IGV4cGVjdGVkX2NvZGVjX2lkKSByZXR1cm4gMDsKICAgICAvLyBrZWVwIHRoaXMgaW4gc3luYyB3aXRoIG1wMyBwcm9iZSwgYm90aCBuZWVkIHRvIGF2b2lkCiAgICAgLy8gaXNzdWVzIHdpdGggTVBFRy1maWxlcyEKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FjbS5jIGIvbGliYXZmb3JtYXQvYWNtLmMKaW5kZXggYWZjYWZhOC4uMDhkZDkyOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWNtLmMKKysrIGIvbGliYXZmb3JtYXQvYWNtLmMKQEAgLTQxLDI0ICs0MSwyNCBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfSU5URVJQTEFZX0FDTTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfSU5URVJQTEFZX0FDTTsKIAotICAgIGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDE0KTsKLSAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgIGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIDE0KTsKKyAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHJldCA9IGF2aW9fcmVhZChzLT5wYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIDE0KTsKKyAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCAxNCk7CiAgICAgaWYgKHJldCA8IDEwKQogICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfRU9GOwogCi0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IEFWX1JMMTYoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAgOCk7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IEFWX1JMMTYoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAxMCk7Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPD0gMCB8fCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIDw9IDApCisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IEFWX1JMMTYoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAgOCk7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IEFWX1JMMTYoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAxMCk7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPD0gMCB8fCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgPSAwOwotICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICAgPSBBVl9STDMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgIDQpIC8gc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgID0gQVZfUkwzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArICA0KSAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FjdC5jIGIvbGliYXZmb3JtYXQvYWN0LmMKaW5kZXggMzVhYWNiYy4uZmU2NzQxMSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWN0LmMKKysrIGIvbGliYXZmb3JtYXQvYWN0LmMKQEAgLTc1LDI5ICs3NSwyOSBAQAogCiAgICAgYXZpb19za2lwKHBiLCAxNik7CiAgICAgc2l6ZT1hdmlvX3JsMzIocGIpOwotICAgIGZmX2dldF93YXZfaGVhZGVyKHMsIHBiLCBzdC0+Y29kZWMsIHNpemUsIDApOworICAgIGZmX2dldF93YXZfaGVhZGVyKHMsIHBiLCBzdC0+Y29kZWNwYXIsIHNpemUsIDApOwogCiAgICAgLyoKICAgICAgIDgwMDBIeiAoRmluZS1yZWMpIGZpbGUgZm9ybWF0IGhhcyAxMCBieXRlcyBsb25nCiAgICAgICBwYWNrZXRzIHdpdGggMTBtcyBvZiBzb3VuZCBkYXRhIGluIHRoZW0KICAgICAqLwotICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICE9IDgwMDApIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNhbXBsZSByYXRlICVkIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAhPSA4MDAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTYW1wbGUgcmF0ZSAlZCBpcyBub3Qgc3VwcG9ydGVkLlxuIiwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIHN0LT5jb2RlYy0+ZnJhbWVfc2l6ZT04MDsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzPTE7CisgICAgc3QtPmNvZGVjcGFyLT5mcmFtZV9zaXplPTgwOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM9MTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQ9QVZfQ09ERUNfSURfRzcyOTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkPUFWX0NPREVDX0lEX0c3Mjk7CiAKICAgICBhdmlvX3NlZWsocGIsIDI1NywgU0VFS19TRVQpOwogICAgIG1zZWM9YXZpb19ybDE2KHBiKTsKICAgICBzZWM9YXZpb19yOChwYik7CiAgICAgbWluPWF2aW9fcmwzMihwYik7CiAKLSAgICBzdC0+ZHVyYXRpb24gPSBhdl9yZXNjYWxlKDEwMDAqKG1pbio2MCtzZWMpK21zZWMsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUsIDEwMDAgKiBzdC0+Y29kZWMtPmZyYW1lX3NpemUpOworICAgIHN0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoMTAwMCoobWluKjYwK3NlYykrbXNlYywgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSwgMTAwMCAqIHN0LT5jb2RlY3Bhci0+ZnJhbWVfc2l6ZSk7CiAKICAgICBjdHgtPmJ5dGVzX2xlZnRfaW5fY2h1bms9Q0hVTktfU0laRTsKIApAQCAtMTEzLDEwICsxMTMsMTAgQEAKICAgICBBQ1RDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgaW50IHJldDsKLSAgICBpbnQgZnJhbWVfc2l6ZT1zLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGU9PTgwMDA/MTA6MjI7CisgICAgaW50IGZyYW1lX3NpemU9cy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlPT04MDAwPzEwOjIyOwogCiAKLSAgICBpZihzLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGU9PTgwMDApCisgICAgaWYocy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlPT04MDAwKQogICAgICAgICByZXQ9YXZfbmV3X3BhY2tldChwa3QsIDEwKTsKICAgICBlbHNlCiAgICAgICAgIHJldD1hdl9uZXdfcGFja2V0KHBrdCwgMTEpOwpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgaWYocmV0KQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgaWYocy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlPT00NDAwICYmICFjdHgtPnNlY29uZF9wYWNrZXQpCisgICAgaWYocy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlPT00NDAwICYmICFjdHgtPnNlY29uZF9wYWNrZXQpCiAgICAgewogICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIGN0eC0+YXVkaW9fYnVmZmVyLCBmcmFtZV9zaXplKTsKIApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAKICAgICAgICAgY3R4LT5zZWNvbmRfcGFja2V0PTE7CiAgICAgfQotICAgIGVsc2UgaWYocy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlPT00NDAwICYmIGN0eC0+c2Vjb25kX3BhY2tldCkKKyAgICBlbHNlIGlmKHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZT09NDQwMCAmJiBjdHgtPnNlY29uZF9wYWNrZXQpCiAgICAgewogICAgICAgICBwa3QtPmRhdGFbMF09Y3R4LT5hdWRpb19idWZmZXJbNV07CiAgICAgICAgIHBrdC0+ZGF0YVsxXT1jdHgtPmF1ZGlvX2J1ZmZlclsxN107CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hZHAuYyBiL2xpYmF2Zm9ybWF0L2FkcC5jCmluZGV4IGY1MzM3NWEuLjM5MTQ4NTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FkcC5jCisrKyBiL2xpYmF2Zm9ybWF0L2FkcC5jCkBAIC0yNyw3ICsyNyw3IEBACiBzdGF0aWMgaW50IGFkcF9wcm9iZShBVlByb2JlRGF0YSAqcCkKIHsKICAgICBpbnQgaSwgY2hhbmdlcyA9IDA7Ci0gICAgY2hhciBsYXN0ID0gMDsKKyAgICB1aW50OF90IGxhc3QgPSAwOwogCiAgICAgaWYgKHAtPmJ1Zl9zaXplIDwgMzIpCiAgICAgICAgIHJldHVybiAwOwpAQCAtNTMsMTYgKzUzLDE2IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX0RUSzsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgID0gNDgwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fRFRLOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgPSA0ODAwMDsKICAgICBzdC0+c3RhcnRfdGltZSAgICAgICAgICAgID0gMDsKLSAgICBpZiAocy0+cGItPnNlZWthYmxlKQotICAgICAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oc3QtPmNvZGVjLCBhdmlvX3NpemUocy0+cGIpKTsKKyAgICBpZiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpCisgICAgICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbjIoc3QtPmNvZGVjcGFyLCBhdmlvX3NpemUocy0+cGIpKTsKIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2Fkcy5jIGIvbGliYXZmb3JtYXQvYWRzLmMKaW5kZXggYmRhMjY3My4uNzNlYTdjNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWRzLmMKKysrIGIvbGliYXZmb3JtYXQvYWRzLmMKQEAgLTQyLDM5ICs0MiwzOSBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgYXZpb19za2lwKHMtPnBiLCA4KTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CiAgICAgY29kZWMgICAgICAgICAgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPD0gMCkKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA8PSAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA8PSAwKQorICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGFsaWduICAgICAgICAgICAgICAgICAgPSBhdmlvX3JsMzIocy0+cGIpOwotICAgIGlmIChhbGlnbiA8PSAwIHx8IGFsaWduID4gSU5UX01BWCAvIHN0LT5jb2RlYy0+Y2hhbm5lbHMpCisgICAgaWYgKGFsaWduIDw9IDAgfHwgYWxpZ24gPiBJTlRfTUFYIC8gc3QtPmNvZGVjcGFyLT5jaGFubmVscykKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBpZiAoY29kZWMgPT0gMSkKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRV9QTEFOQVI7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSOwogICAgIGVsc2UKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX1BTWDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX1BTWDsKIAotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogYWxpZ247CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiBhbGlnbjsKICAgICBhdmlvX3NraXAocy0+cGIsIDEyKTsKICAgICBzaXplID0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9QU1gpCi0gICAgICAgIHN0LT5kdXJhdGlvbiA9IChzaXplIC0gMHg0MCkgLyAxNiAvIHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiAyODsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fUFNYKQorICAgICAgICBzdC0+ZHVyYXRpb24gPSAoc2l6ZSAtIDB4NDApIC8gMTYgLyBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogMjg7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYWRzX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgaW50IHJldDsKIAotICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgY29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHBhci0+YmxvY2tfYWxpZ24pOwogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKICAgICByZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYWR0c2VuYy5jIGIvbGliYXZmb3JtYXQvYWR0c2VuYy5jCmluZGV4IDI0MmQ3MzguLjNjMjg0MGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FkdHNlbmMuYworKysgYi9saWJhdmZvcm1hdC9hZHRzZW5jLmMKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAgICAgaW5pdF9wdXRfYml0cygmcGIsIGFkdHMtPnBjZV9kYXRhLCBNQVhfUENFX1NJWkUpOwogCiAgICAgICAgIHB1dF9iaXRzKCZwYiwgMywgNSk7IC8vSURfUENFCi0gICAgICAgIGFkdHMtPnBjZV9zaXplID0gKGF2cHJpdl9jb3B5X3BjZV9kYXRhKCZwYiwgJmdiKSArIDMpIC8gODsKKyAgICAgICAgYWR0cy0+cGNlX3NpemUgPSAoZmZfY29weV9wY2VfZGF0YSgmcGIsICZnYikgKyAzKSAvIDg7CiAgICAgICAgIGZsdXNoX3B1dF9iaXRzKCZwYik7CiAgICAgfQogCkBAIC05NCwxNiArOTQsMjggQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBhZHRzX2luaXQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFEVFNDb250ZXh0ICphZHRzID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKKworICAgIGlmIChwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBBQUMgc3RyZWFtcyBjYW4gYmUgbXV4ZWQgYnkgdGhlIEFEVFMgbXV4ZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAocGFyLT5leHRyYWRhdGFfc2l6ZSA+IDApCisgICAgICAgIHJldHVybiBhZHRzX2RlY29kZV9leHRyYWRhdGEocywgYWR0cywgcGFyLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBhZHRzX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgQURUU0NvbnRleHQgKmFkdHMgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2YyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOwogCiAgICAgaWYgKGFkdHMtPmlkM3YydGFnKQogICAgICAgICBmZl9pZDN2Ml93cml0ZV9zaW1wbGUocywgNCwgSUQzdjJfREVGQVVMVF9NQUdJQyk7Ci0gICAgaWYgKGF2Yy0+ZXh0cmFkYXRhX3NpemUgPiAwKQotICAgICAgICByZXR1cm4gYWR0c19kZWNvZGVfZXh0cmFkYXRhKHMsIGFkdHMsIGF2Yy0+ZXh0cmFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Yy0+ZXh0cmFkYXRhX3NpemUpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNDksMTEgKzE2MSwyOCBAQAogc3RhdGljIGludCBhZHRzX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgQURUU0NvbnRleHQgKmFkdHMgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogICAgIHVpbnQ4X3QgYnVmW0FEVFNfSEVBREVSX1NJWkVdOwogCiAgICAgaWYgKCFwa3QtPnNpemUpCiAgICAgICAgIHJldHVybiAwOworICAgIGlmICghcGFyLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICB1aW50OF90ICpzaWRlX2RhdGE7CisgICAgICAgIGludCBzaWRlX2RhdGFfc2l6ZSA9IDAsIHJldDsKKworICAgICAgICBzaWRlX2RhdGEgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWRlX2RhdGFfc2l6ZSk7CisgICAgICAgIGlmIChzaWRlX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgcmV0ID0gYWR0c19kZWNvZGVfZXh0cmFkYXRhKHMsIGFkdHMsIHNpZGVfZGF0YSwgc2lkZV9kYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJldCA9IGZmX2FsbG9jX2V4dHJhZGF0YShwYXIsIHNpZGVfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBtZW1jcHkocGFyLT5leHRyYWRhdGEsIHNpZGVfZGF0YSwgc2lkZV9kYXRhX3NpemUpOworICAgICAgICB9CisgICAgfQogICAgIGlmIChhZHRzLT53cml0ZV9hZHRzKSB7CiAgICAgICAgIGludCBlcnIgPSBhZHRzX3dyaXRlX2ZyYW1lX2hlYWRlcihhZHRzLCBidWYsIHBrdC0+c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkdHMtPnBjZV9zaXplKTsKQEAgLTIwMyw2ICsyMzIsNyBAQAogICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihBRFRTQ29udGV4dCksCiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLmluaXQgICAgICAgICAgICAgID0gYWR0c19pbml0LAogICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGFkdHNfd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGFkdHNfd3JpdGVfcGFja2V0LAogICAgIC53cml0ZV90cmFpbGVyICAgICA9IGFkdHNfd3JpdGVfdHJhaWxlciwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FkeGRlYy5jIGIvbGliYXZmb3JtYXQvYWR4ZGVjLmMKaW5kZXggMDVjZWYwYi4uYTI3MWUyYSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWR4ZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvYWR4ZGVjLmMKQEAgLTUwLDE1ICs1MCwxNSBAQAogc3RhdGljIGludCBhZHhfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQogewogICAgIEFEWERlbXV4ZXJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKICAgICBpbnQgcmV0LCBzaXplOwogCi0gICAgaWYgKGF2Y3R4LT5jaGFubmVscyA8PSAwKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAlZFxuIiwgYXZjdHgtPmNoYW5uZWxzKTsKKyAgICBpZiAocGFyLT5jaGFubmVscyA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAlZFxuIiwgcGFyLT5jaGFubmVscyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIHNpemUgPSBCTE9DS19TSVpFICogYXZjdHgtPmNoYW5uZWxzOworICAgIHNpemUgPSBCTE9DS19TSVpFICogcGFyLT5jaGFubmVsczsKIAogICAgIHBrdC0+cG9zID0gYXZpb190ZWxsKHMtPnBiKTsKICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CkBAIC04MiwzNyArODIsNDMgQEAKIHN0YXRpYyBpbnQgYWR4X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBBRFhEZW11eGVyQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKLSAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKIAogICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBhdmN0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIHBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogCiAgICAgaWYgKGF2aW9fcmIxNihzLT5wYikgIT0gMHg4MDAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICBjLT5oZWFkZXJfc2l6ZSA9IGF2aW9fcmIxNihzLT5wYikgKyA0OwogICAgIGF2aW9fc2VlayhzLT5wYiwgLTQsIFNFRUtfQ1VSKTsKIAotICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKGF2Y3R4LCBzLT5wYiwgYy0+aGVhZGVyX3NpemUpIDwgMCkKKyAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzLCBwYXIsIHMtPnBiLCBjLT5oZWFkZXJfc2l6ZSkgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IDEyKSB7CisgICAgaWYgKHBhci0+ZXh0cmFkYXRhX3NpemUgPCAxMikgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBleHRyYWRhdGEgc2l6ZS5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9Ci0gICAgYXZjdHgtPmNoYW5uZWxzICAgID0gQVZfUkI4KGF2Y3R4LT5leHRyYWRhdGEgKyA3KTsKLSAgICBhdmN0eC0+c2FtcGxlX3JhdGUgPSBBVl9SQjMyKGF2Y3R4LT5leHRyYWRhdGEgKyA4KTsKKyAgICBwYXItPmNoYW5uZWxzICAgID0gQVZfUkI4IChwYXItPmV4dHJhZGF0YSArIDcpOworICAgIHBhci0+c2FtcGxlX3JhdGUgPSBBVl9SQjMyKHBhci0+ZXh0cmFkYXRhICsgOCk7CiAKLSAgICBpZiAoYXZjdHgtPmNoYW5uZWxzIDw9IDApIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzICVkXG4iLCBhdmN0eC0+Y2hhbm5lbHMpOworICAgIGlmIChwYXItPmNoYW5uZWxzIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgbnVtYmVyIG9mIGNoYW5uZWxzICVkXG4iLCBwYXItPmNoYW5uZWxzKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworICAgIGlmIChwYXItPnNhbXBsZV9yYXRlIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2FtcGxlIHJhdGUgJWRcbiIsIHBhci0+c2FtcGxlX3JhdGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CiAKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgQkxPQ0tfU0FNUExFUywgYXZjdHgtPnNhbXBsZV9yYXRlKTsKKyAgICBwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHBhci0+Y29kZWNfaWQgICAgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisgICAgcGFyLT5iaXRfcmF0ZSAgICA9IChpbnQ2NF90KXBhci0+c2FtcGxlX3JhdGUgKiBwYXItPmNoYW5uZWxzICogQkxPQ0tfU0laRSAqIDhMTCAvIEJMT0NLX1NBTVBMRVM7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgQkxPQ0tfU0FNUExFUywgcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FlYS5jIGIvbGliYXZmb3JtYXQvYWVhLmMKaW5kZXggZGI0MTVjOS4uZjc5NTQ5NSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWVhLmMKKysrIGIvbGliYXZmb3JtYXQvYWVhLmMKQEAgLTMyLDcgKzMyLDcgQEAKICAgICBpZiAocC0+YnVmX3NpemUgPD0gMjA0OCsyMTIpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgLyogTWFnaWMgaXMgJzAwIDA4IDAwIDAwJyBpbiBMaXR0bGUgRW5kaWFuKi8KKyAgICAvKiBNYWdpYyBpcyAnMDAgMDggMDAgMDAnIGluIGxpdHRsZS1lbmRpYW4qLwogICAgIGlmIChBVl9STDMyKHAtPmJ1Zik9PTB4ODAwKSB7CiAgICAgICAgIGludCBjaCwgaTsKICAgICAgICAgY2ggPSBwLT5idWZbMjY0XTsKQEAgLTY3LDI5ICs2NywyOSBAQAogCiAgICAgLyogUGFyc2UgdGhlIGFtb3VudCBvZiBjaGFubmVscyBhbmQgc2tpcCB0byBwb3MgMjA0OCgweDgwMCkgKi8KICAgICBhdmlvX3NraXAocy0+cGIsIDI2NCk7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGF2aW9fcjgocy0+cGIpOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBhdmlvX3I4KHMtPnBiKTsKICAgICBhdmlvX3NraXAocy0+cGIsIDE3ODMpOwogCiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9BVFJBQzE7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICA9IDQ0MTAwOwotICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgPSAyOTIwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgID0gQVZfQ09ERUNfSURfQVRSQUMxOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgPSA0NDEwMDsKKyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlICAgICAgID0gMjkyMDAwOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gMSAmJiBzdC0+Y29kZWMtPmNoYW5uZWxzICE9IDIpIHsKLSAgICAgICAgYXZfbG9nKHMsQVZfTE9HX0VSUk9SLCJDaGFubmVscyAlZCBub3Qgc3VwcG9ydGVkIVxuIixzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyAhPSAxICYmIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgIT0gMikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2hhbm5lbHMgJWQgbm90IHN1cHBvcnRlZCFcbiIsIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPT0gMSkgPyBBVl9DSF9MQVlPVVRfTU9OTyA6IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IChzdC0+Y29kZWNwYXItPmNoYW5uZWxzID09IDEpID8gQVZfQ0hfTEFZT1VUX01PTk8gOiBBVl9DSF9MQVlPVVRfU1RFUkVPOwogCi0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IEFUMV9TVV9TSVpFICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gQVQxX1NVX1NJWkUgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFlYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgaW50IHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICBpbnQgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pOwogCiAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOwogICAgIGlmIChyZXQgPD0gMCkKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FmYy5jIGIvbGliYXZmb3JtYXQvYWZjLmMKaW5kZXggOGRiZDIzMi4uNTQyY2IxNiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWZjLmMKKysrIGIvbGliYXZmb3JtYXQvYWZjLmMKQEAgLTM1LDIwICszNSwyMCBAQAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9BRkM7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgID0gMjsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQURQQ01fQUZDOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICA9IDI7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CiAKLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgMSkpCisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIDEpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzBdID0gOCAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMF0gPSA4ICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKIAogICAgIGMtPmRhdGFfZW5kID0gYXZpb19yYjMyKHMtPnBiKSArIDMyTEw7CiAgICAgc3QtPmR1cmF0aW9uID0gYXZpb19yYjMyKHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19yYjE2KHMtPnBiKTsKICAgICBhdmlvX3NraXAocy0+cGIsIDIyKTsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9haWZmLmggYi9saWJhdmZvcm1hdC9haWZmLmgKaW5kZXggMmE4N2Q2ZS4uMGVkMTBhMiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWlmZi5oCisrKyBiL2xpYmF2Zm9ybWF0L2FpZmYuaApAQCAtNTAsNiArNTAsNyBAQAogICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkJFLCAgICBNS1RBRygndCcsJ3cnLCdvJywncycpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsICAgIE1LVEFHKCdzJywnbycsJ3cnLCd0JykgfSwKICAgICB7IEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVCwgTUtUQUcoJ2knLCdtJywnYScsJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUURNQywgICAgICAgICBNS1RBRygnUScsJ0QnLCdNJywnQycpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9RRE0yLCAgICAgICAgIE1LVEFHKCdRJywnRCcsJ00nLCcyJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1FDRUxQLCAgICAgICAgTUtUQUcoJ1EnLCdjJywnbCcsJ3AnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfU0RYMl9EUENNLCAgICBNS1RBRygnUycsJ0QnLCdYJywnMicpIH0sCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9haWZmZGVjLmMgYi9saWJhdmZvcm1hdC9haWZmZGVjLmMKaW5kZXggMzRiMjY2ZC4uN2M3MDFlMCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYWlmZmRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2FpZmZkZWMuYwpAQCAtODEsMTEgKzgxLDEwIEBACiAgICAgICAgICAgICBhdl9mcmVlKHN0cik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgc2l6ZSArPSAoc2l6ZSYxKS1yZXM7CisgICAgICAgIHNpemUgLT0gcmVzOwogICAgICAgICBzdHJbcmVzXSA9IDA7CiAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwga2V5LCBzdHIsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKLSAgICB9ZWxzZQotICAgICAgICBzaXplKz0gc2l6ZSYxOworICAgIH0KIAogICAgIGF2aW9fc2tpcChzLT5wYiwgc2l6ZSk7CiB9CkBAIC05NSw3ICs5NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB2ZXJzaW9uKQogewogICAgIEFWSU9Db250ZXh0ICpwYiAgICAgICAgPSBzLT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogICAgIEFJRkZJbnB1dENvbnRleHQgKmFpZmYgPSBzLT5wcml2X2RhdGE7CiAgICAgaW50IGV4cDsKICAgICB1aW50NjRfdCB2YWw7CkBAIC0xMDQsMTAgKzEwMywxMCBAQAogCiAgICAgaWYgKHNpemUgJiAxKQogICAgICAgICBzaXplKys7Ci0gICAgY29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgY29kZWMtPmNoYW5uZWxzID0gYXZpb19yYjE2KHBiKTsKKyAgICBwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgcGFyLT5jaGFubmVscyA9IGF2aW9fcmIxNihwYik7CiAgICAgbnVtX2ZyYW1lcyA9IGF2aW9fcmIzMihwYik7Ci0gICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmIxNihwYik7CisgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JiMTYocGIpOwogCiAgICAgZXhwID0gYXZpb19yYjE2KHBiKSAtIDE2MzgzIC0gNjM7CiAgICAgdmFsID0gYXZpb19yYjY0KHBiKTsKQEAgLTExOSwyOSArMTE4LDI3IEBACiAgICAgICAgIHNhbXBsZV9yYXRlID0gdmFsIDw8IGV4cDsKICAgICBlbHNlCiAgICAgICAgIHNhbXBsZV9yYXRlID0gKHZhbCArICgxVUxMPDwoLWV4cC0xKSkpID4+IC1leHA7Ci0gICAgY29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgICAgcGFyLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOwogICAgIHNpemUgLT0gMTg7CiAKICAgICAvKiBnZXQgY29kZWMgaWQgZm9yIEFJRkYtQyAqLwogICAgIGlmIChzaXplIDwgNCkgewogICAgICAgICB2ZXJzaW9uID0gQUlGRjsKICAgICB9IGVsc2UgaWYgKHZlcnNpb24gPT0gQUlGRl9DX1ZFUlNJT04xKSB7Ci0gICAgICAgIGNvZGVjLT5jb2RlY190YWcgPSBhdmlvX3JsMzIocGIpOwotICAgICAgICBjb2RlYy0+Y29kZWNfaWQgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2FpZmZfdGFncywgY29kZWMtPmNvZGVjX3RhZyk7Ci0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgewotICAgICAgICAgICAgY2hhciB0YWdbMzJdOwotICAgICAgICAgICAgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcodGFnLCBzaXplb2YodGFnKSwgY29kZWMtPmNvZGVjX3RhZyk7Ci0gICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgInVua25vd24gb3IgdW5zdXBwb3J0ZWQgY29kZWMgdGFnOiAlcyIsIHRhZyk7Ci0gICAgICAgIH0KKyAgICAgICAgcGFyLT5jb2RlY190YWcgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBwYXItPmNvZGVjX2lkICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19haWZmX3RhZ3MsIHBhci0+Y29kZWNfdGFnKTsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAidW5rbm93biBvciB1bnN1cHBvcnRlZCBjb2RlYyB0YWc6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKHBhci0+Y29kZWNfdGFnKSk7CiAgICAgICAgIHNpemUgLT0gNDsKICAgICB9CiAKLSAgICBpZiAodmVyc2lvbiAhPSBBSUZGX0NfVkVSU0lPTjEgfHwgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZCRSkgewotICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPSBhaWZmX2NvZGVjX2dldF9pZChjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKLSAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoY29kZWMtPmNvZGVjX2lkKTsKKyAgICBpZiAodmVyc2lvbiAhPSBBSUZGX0NfVkVSU0lPTjEgfHwgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2QkUpIHsKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9IGFpZmZfY29kZWNfZ2V0X2lkKHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHBhci0+Y29kZWNfaWQpOwogICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbiA9IDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoIChjb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgc3dpdGNoIChwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9GNjRCRToKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CkBAIC0xNTAsMzkgKzE0NywzOSBAQAogICAgICAgICAgICAgYWlmZi0+YmxvY2tfZHVyYXRpb24gPSAxOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUOgotICAgICAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gMzQqY29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgcGFyLT5ibG9ja19hbGlnbiA9IDM0ICogcGFyLT5jaGFubmVsczsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01BQ0UzOgotICAgICAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gMipjb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgICAgICBwYXItPmJsb2NrX2FsaWduID0gMiAqIHBhci0+Y2hhbm5lbHM7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2TEU6Ci0gICAgICAgICAgICBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gNTsKKyAgICAgICAgICAgIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gNTsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV1M6CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyMjoKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NQUNFNjoKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9TRFgyX0RQQ006Ci0gICAgICAgICAgICBjb2RlYy0+YmxvY2tfYWxpZ24gPSAxKmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgICAgIHBhci0+YmxvY2tfYWxpZ24gPSAxICogcGFyLT5jaGFubmVsczsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0dTTToKLSAgICAgICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IDMzOworICAgICAgICAgICAgcGFyLT5ibG9ja19hbGlnbiA9IDMzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbiA9IDE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoY29kZWMtPmJsb2NrX2FsaWduID4gMCkKLSAgICAgICAgICAgIGFpZmYtPmJsb2NrX2R1cmF0aW9uID0gYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKGNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgaWYgKHBhci0+YmxvY2tfYWxpZ24gPiAwKQorICAgICAgICAgICAgYWlmZi0+YmxvY2tfZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmJsb2NrX2FsaWduKTsKICAgICB9CiAKICAgICAvKiBCbG9jayBhbGlnbiBuZWVkcyB0byBiZSBjb21wdXRlZCBpbiBhbGwgY2FzZXMsIGFzIHRoZSBkZWZpbml0aW9uCiAgICAgICogaXMgc3BlY2lmaWMgdG8gYXBwbGljYXRpb25zIC0+IGhlcmUgd2UgdXNlIHRoZSBXQVZFIGZvcm1hdCBkZWZpbml0aW9uICovCi0gICAgaWYgKCFjb2RlYy0+YmxvY2tfYWxpZ24pCi0gICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IChhdl9nZXRfYml0c19wZXJfc2FtcGxlKGNvZGVjLT5jb2RlY19pZCkgKiBjb2RlYy0+Y2hhbm5lbHMpID4+IDM7CisgICAgaWYgKCFwYXItPmJsb2NrX2FsaWduKQorICAgICAgICBwYXItPmJsb2NrX2FsaWduID0gKGF2X2dldF9iaXRzX3Blcl9zYW1wbGUocGFyLT5jb2RlY19pZCkgKiBwYXItPmNoYW5uZWxzKSA+PiAzOwogCiAgICAgaWYgKGFpZmYtPmJsb2NrX2R1cmF0aW9uKSB7Ci0gICAgICAgIGNvZGVjLT5iaXRfcmF0ZSA9IGNvZGVjLT5zYW1wbGVfcmF0ZSAqIChjb2RlYy0+YmxvY2tfYWxpZ24gPDwgMykgLwotICAgICAgICAgICAgICAgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbjsKKyAgICAgICAgcGFyLT5iaXRfcmF0ZSA9IChpbnQ2NF90KXBhci0+c2FtcGxlX3JhdGUgKiAocGFyLT5ibG9ja19hbGlnbiA8PCAzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbjsKICAgICB9CiAKICAgICAvKiBDaHVuayBpcyBvdmVyICovCkBAIC0yMzgsNyArMjM1LDcgQEAKICAgICAgICAgLyogcGFyc2UgZGlmZmVyZW50IGNodW5rcyAqLwogICAgICAgICBzaXplID0gZ2V0X3RhZyhwYiwgJnRhZyk7CiAKLSAgICAgICAgaWYgKHNpemUgPT0gQVZFUlJPUl9FT0YgJiYgb2Zmc2V0ID4gMCAmJiBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKSB7CisgICAgICAgIGlmIChzaXplID09IEFWRVJST1JfRU9GICYmIG9mZnNldCA+IDAgJiYgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbikgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiaGVhZGVyIHBhcnNlciBoaXQgRU9GXG4iKTsKICAgICAgICAgICAgIGdvdG8gZ290X3NvdW5kOwogICAgICAgICB9CkBAIC0yNjAsNyArMjU3LDggQEAKICAgICAgICAgICAgIHBvc2l0aW9uID0gYXZpb190ZWxsKHBiKTsKICAgICAgICAgICAgIGZmX2lkM3YyX3JlYWQocywgSUQzdjJfREVGQVVMVF9NQUdJQywgJmlkM3YyX2V4dHJhX21ldGEsIHNpemUpOwogICAgICAgICAgICAgaWYgKGlkM3YyX2V4dHJhX21ldGEpCi0gICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9pZDN2Ml9wYXJzZV9hcGljKHMsICZpZDN2Ml9leHRyYV9tZXRhKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9pZDN2Ml9wYXJzZV9hcGljKHMsICZpZDN2Ml9leHRyYV9tZXRhKSkgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgIChyZXQgPSBmZl9pZDN2Ml9wYXJzZV9jaGFwdGVycyhzLCAmaWQzdjJfZXh0cmFfbWV0YSkpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoJmlkM3YyX2V4dHJhX21ldGEpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgIH0KQEAgLTI4OCw5ICsyODYsOSBAQAogICAgICAgICAgICAgb2Zmc2V0ID0gYXZpb19yYjMyKHBiKTsgICAgICAvKiBPZmZzZXQgb2Ygc291bmQgZGF0YSAqLwogICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgICAgICAgICAgICAgICAvKiBCbG9ja1NpemUuLi4gZG9uJ3QgY2FyZSAqLwogICAgICAgICAgICAgb2Zmc2V0ICs9IGF2aW9fdGVsbChwYik7ICAgIC8qIENvbXB1dGUgYWJzb2x1dGUgZGF0YSBvZmZzZXQgKi8KLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmJsb2NrX2FsaWduICYmICFwYi0+c2Vla2FibGUpICAgIC8qIEFzc3VtZSBDT01NIGFscmVhZHkgcGFyc2VkICovCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAmJiAhKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkgICAgLyogQXNzdW1lIENPTU0gYWxyZWFkeSBwYXJzZWQgKi8KICAgICAgICAgICAgICAgICBnb3RvIGdvdF9zb3VuZDsKLSAgICAgICAgICAgIGlmICghcGItPnNlZWthYmxlKSB7CisgICAgICAgICAgICBpZiAoIShwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmlsZSBpcyBub3Qgc2Vla2FibGVcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KQEAgLTI5OSw1MCArMjk3LDY4IEBACiAgICAgICAgIGNhc2UgTUtUQUcoJ3cnLCAnYScsICd2JywgJ2UnKToKICAgICAgICAgICAgIGlmICgodWludDY0X3Qpc2l6ZSA+ICgxPDwzMCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEocywgc3QtPmNvZGVjcGFyLCBwYiwgc2l6ZSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yICYmIHNpemU+PTEyKjQgJiYgIXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSsxMSo0KTsKLSAgICAgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbiA9IEFWX1JCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGErOSo0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RQ0VMUCkgeworICAgICAgICAgICAgaWYgKCAgIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1FETUMgfHwgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yKQorICAgICAgICAgICAgICAgICYmIHNpemU+PTEyKjQgJiYgIXN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gQVZfUkIzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSsxMSo0KTsKKyAgICAgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbiA9IEFWX1JCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGErOSo0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RQ0VMUCkgewogICAgICAgICAgICAgICAgIGNoYXIgcmF0ZSA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gMjUpCi0gICAgICAgICAgICAgICAgICAgIHJhdGUgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YVsyNF07CisgICAgICAgICAgICAgICAgICAgIHJhdGUgPSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsyNF07CiAgICAgICAgICAgICAgICAgc3dpdGNoIChyYXRlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSAnSCc6IC8vIFJBVEVfSEFMRgotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTc7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAxNzsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnRic6IC8vIFJBVEVfRlVMTAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSAzNTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDM1OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhaWZmLT5ibG9ja19kdXJhdGlvbiA9IDE2MDsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIChzdC0+Y29kZWMtPmJsb2NrX2FsaWduIDw8IDMpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlmZi0+YmxvY2tfZHVyYXRpb247CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IChpbnQ2NF90KXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKiAoc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA8PCAzKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpZmYtPmJsb2NrX2R1cmF0aW9uOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUtUQUcoJ0MnLCdIJywnQScsJ04nKToKICAgICAgICAgICAgIGlmKGZmX21vdl9yZWFkX2NoYW4ocywgcGIsIHN0LCBzaXplKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnQScsJ1AnLCdDJywnTScpOiAvKiBYQSBBRFBDTSBjb21wcmVzc2VkIHNvdW5kIGNodW5rICovCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fWEE7CisgICAgICAgICAgICBhaWZmLT5kYXRhX2VuZCA9IGF2aW9fdGVsbChwYikgKyBzaXplOworICAgICAgICAgICAgb2Zmc2V0ID0gYXZpb190ZWxsKHBiKSArIDg7CisgICAgICAgICAgICAvKiBUaGlzIGZpZWxkIGlzIHVua25vd24gYW5kIGl0cyBkYXRhIHNlZW1zIHRvIGJlIGlycmVsZXZhbnQgKi8KKyAgICAgICAgICAgIGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gYXZpb19yYjMyKHBiKTsKKworICAgICAgICAgICAgZ290byBnb3Rfc291bmQ7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgaWYgKG9mZnNldCA+IDAgJiYgc3QtPmNvZGVjLT5ibG9ja19hbGlnbikgLy8gQ09NTSAmJiBTU05ECisgICAgICAgICAgICBpZiAob2Zmc2V0ID4gMCAmJiBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKSAvLyBDT01NICYmIFNTTkQKICAgICAgICAgICAgICAgICBnb3RvIGdvdF9zb3VuZDsKICAgICAgICAgZGVmYXVsdDogLyogSnVtcCAqLwotICAgICAgICAgICAgaWYgKHNpemUgJiAxKSAgIC8qIEFsd2F5cyBldmVuIGFsaWduZWQgKi8KLSAgICAgICAgICAgICAgICBzaXplKys7CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOwogICAgICAgICB9CisKKyAgICAgICAgLyogU2tpcCByZXF1aXJlZCBwYWRkaW5nIGJ5dGUgZm9yIG9kZC1zaXplZCBjaHVua3MuICovCisgICAgICAgIGlmIChzaXplICYgMSkgeworICAgICAgICAgICAgZmlsZXNpemUtLTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMSk7CisgICAgICAgIH0KICAgICB9CiAKIGdvdF9zb3VuZDoKLSAgICBpZiAoIXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pIHsKKyAgICBpZiAoIXN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gJiYgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RQ0VMUCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJxY2VscCB3aXRob3V0IHdhdmUgY2h1bmssIGFzc3VtaW5nIGZ1bGwgcmF0ZVxuIik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAzNTsKKyAgICB9IGVsc2UgaWYgKCFzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZmluZCBDT01NIHRhZyBvciBpbnZhbGlkIGJsb2NrX2FsaWduIHZhbHVlXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIC8qIE5vdyBwb3NpdGlvbmVkLCBnZXQgdGhlIHNvdW5kIGRhdGEgc3RhcnQgYW5kIGVuZCAqLwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOwogICAgIHN0LT5kdXJhdGlvbiA9IHN0LT5uYl9mcmFtZXMgKiBhaWZmLT5ibG9ja19kdXJhdGlvbjsKIApAQCAtMzY3LDI3ICszODMsMzIgQEAKICAgICBpZiAobWF4X3NpemUgPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogCisgICAgaWYgKCFzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJibG9ja19hbGlnbiBub3Qgc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCiAgICAgLyogTm93IGZvciB0aGF0IHBhY2tldCAqLwotICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgIHN3aXRjaCAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkgewogICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUOgogICAgIGNhc2UgQVZfQ09ERUNfSURfR1NNOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUURNMjoKICAgICBjYXNlIEFWX0NPREVDX0lEX1FDRUxQOgotICAgICAgICBzaXplID0gc3QtPmNvZGVjLT5ibG9ja19hbGlnbjsKKyAgICAgICAgc2l6ZSA9IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ247CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHNpemUgPSAoTUFYX1NJWkUgLyBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKSAqIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgIHNpemUgPSBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID8gKE1BWF9TSVpFIC8gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbikgKiBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduIDogTUFYX1NJWkU7CiAgICAgfQogICAgIHNpemUgPSBGRk1JTihtYXhfc2l6ZSwgc2l6ZSk7CiAgICAgcmVzID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgcmV0dXJuIHJlczsKIAotICAgIGlmIChzaXplID49IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pCisgICAgaWYgKHNpemUgPj0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbikKICAgICAgICAgcGt0LT5mbGFncyAmPSB+QVZfUEtUX0ZMQUdfQ09SUlVQVDsKICAgICAvKiBPbmx5IG9uZSBzdHJlYW0gaW4gYW4gQUlGRiBmaWxlICovCiAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOwotICAgIHBrdC0+ZHVyYXRpb24gICAgID0gKHJlcyAvIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pICogYWlmZi0+YmxvY2tfZHVyYXRpb247CisgICAgcGt0LT5kdXJhdGlvbiAgICAgPSAocmVzIC8gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbikgKiBhaWZmLT5ibG9ja19kdXJhdGlvbjsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYWlmZmVuYy5jIGIvbGliYXZmb3JtYXQvYWlmZmVuYy5jCmluZGV4IDI1ZGM1ZTYuLmFhYjM3NDEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FpZmZlbmMuYworKysgYi9saWJhdmZvcm1hdC9haWZmZW5jLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBBVlBhY2tldExpc3QgKnBpY3RfbGlzdCA9IGFpZmYtPnBpY3RfbGlzdDsKIAotICAgIGlmICghcGItPnNlZWthYmxlKQorICAgIGlmICghcGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgaWYgKCFzLT5tZXRhZGF0YSAmJiAhYWlmZi0+cGljdF9saXN0KQpAQCAtMTAyLDE2ICsxMDIsMTYgQEAKIHsKICAgICBBSUZGT3V0cHV0Q29udGV4dCAqYWlmZiA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXI7CiAgICAgdWludDY0X3Qgc2FtcGxlX3JhdGU7CiAgICAgaW50IGksIGFpZmMgPSAwOwogCiAgICAgYWlmZi0+YXVkaW9fc3RyZWFtX2lkeCA9IC0xOwogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgaWYgKGFpZmYtPmF1ZGlvX3N0cmVhbV9pZHggPCAwICYmIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgaWYgKGFpZmYtPmF1ZGlvX3N0cmVhbV9pZHggPCAwICYmIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKICAgICAgICAgICAgIGFpZmYtPmF1ZGlvX3N0cmVhbV9pZHggPSBpOwotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQUlGRiBhbGxvd3Mgb25seSBvbmUgYXVkaW8gc3RyZWFtIGFuZCBhIHBpY3R1cmUuXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KQEAgLTEyMSwxMiArMTIxLDEyIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgZW5jID0gcy0+c3RyZWFtc1thaWZmLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWM7CisgICAgcGFyID0gcy0+c3RyZWFtc1thaWZmLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWNwYXI7CiAKICAgICAvKiBGaXJzdCB2ZXJpZnkgaWYgZm9ybWF0IGlzIG9rICovCi0gICAgaWYgKCFlbmMtPmNvZGVjX3RhZykKKyAgICBpZiAoIXBhci0+Y29kZWNfdGFnKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKGVuYy0+Y29kZWNfdGFnICE9IE1LVEFHKCdOJywnTycsJ04nLCdFJykpCisgICAgaWYgKHBhci0+Y29kZWNfdGFnICE9IE1LVEFHKCdOJywnTycsJ04nLCdFJykpCiAgICAgICAgIGFpZmMgPSAxOwogCiAgICAgLyogRk9STSBBSUZGIGhlYWRlciAqLwpAQCAtMTM2LDcgKzEzNiw3IEBACiAgICAgZmZpb193Zm91cmNjKHBiLCBhaWZjID8gIkFJRkMiIDogIkFJRkYiKTsKIAogICAgIGlmIChhaWZjKSB7IC8vIGNvbXByZXNzZWQgYXVkaW8KLSAgICAgICAgaWYgKCFlbmMtPmJsb2NrX2FsaWduKSB7CisgICAgICAgIGlmICghcGFyLT5ibG9ja19hbGlnbikgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImJsb2NrIGFsaWduIG5vdCBzZXRcbiIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CkBAIC0xNDYsMTAgKzE0NiwxMCBAQAogICAgICAgICBhdmlvX3diMzIocGIsIDB4QTI4MDUxNDApOwogICAgIH0KIAotICAgIGlmIChlbmMtPmNoYW5uZWxzID4gMiAmJiBlbmMtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgaWYgKHBhci0+Y2hhbm5lbHMgPiAyICYmIHBhci0+Y2hhbm5lbF9sYXlvdXQpIHsKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiQ0hBTiIpOwogICAgICAgICBhdmlvX3diMzIocGIsIDEyKTsKLSAgICAgICAgZmZfbW92X3dyaXRlX2NoYW4ocGIsIGVuYy0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICBmZl9tb3Zfd3JpdGVfY2hhbihwYiwgcGFyLT5jaGFubmVsX2xheW91dCk7CiAgICAgfQogCiAgICAgcHV0X21ldGEocywgInRpdGxlIiwgICAgIE1LVEFHKCdOJywgJ0EnLCAnTScsICdFJykpOwpAQCAtMTYwLDM1ICsxNjAsMzYgQEAKICAgICAvKiBDb21tb24gY2h1bmsgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJDT01NIik7CiAgICAgYXZpb193YjMyKHBiLCBhaWZjID8gMjQgOiAxOCk7IC8qIHNpemUgKi8KLSAgICBhdmlvX3diMTYocGIsIGVuYy0+Y2hhbm5lbHMpOyAgLyogTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgYXZpb193YjE2KHBiLCBwYXItPmNoYW5uZWxzKTsgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLwogCiAgICAgYWlmZi0+ZnJhbWVzID0gYXZpb190ZWxsKHBiKTsKICAgICBhdmlvX3diMzIocGIsIDApOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwogCi0gICAgaWYgKCFlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkKLSAgICAgICAgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGVuYy0+Y29kZWNfaWQpOwotICAgIGlmICghZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKKyAgICBpZiAoIXBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQorICAgICAgICBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUocGFyLT5jb2RlY19pZCk7CisgICAgaWYgKCFwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGNvbXB1dGUgYml0cyBwZXIgc2FtcGxlXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBpZiAoIWVuYy0+YmxvY2tfYWxpZ24pCi0gICAgICAgIGVuYy0+YmxvY2tfYWxpZ24gPSAoZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBlbmMtPmNoYW5uZWxzKSA+PiAzOworICAgIGlmICghcGFyLT5ibG9ja19hbGlnbikKKyAgICAgICAgcGFyLT5ibG9ja19hbGlnbiA9IChwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIHBhci0+Y2hhbm5lbHMpID4+IDM7CiAKLSAgICBhdmlvX3diMTYocGIsIGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsgLyogU2FtcGxlIHNpemUgKi8KKyAgICBhdmlvX3diMTYocGIsIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsgLyogU2FtcGxlIHNpemUgKi8KIAotICAgIHNhbXBsZV9yYXRlID0gYXZfZG91YmxlMmludChlbmMtPnNhbXBsZV9yYXRlKTsKKyAgICBzYW1wbGVfcmF0ZSA9IGF2X2RvdWJsZTJpbnQocGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgYXZpb193YjE2KHBiLCAoc2FtcGxlX3JhdGUgPj4gNTIpICsgKDE2MzgzIC0gMTAyMykpOwogICAgIGF2aW9fd2I2NChwYiwgVUlOVDY0X0MoMSkgPDwgNjMgfCBzYW1wbGVfcmF0ZSA8PCAxMSk7CiAKICAgICBpZiAoYWlmYykgewotICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCBwYXItPmNvZGVjX3RhZyk7CiAgICAgICAgIGF2aW9fd2IxNihwYiwgMCk7CiAgICAgfQogCi0gICAgaWYgKGVuYy0+Y29kZWNfdGFnID09IE1LVEFHKCdRJywnRCcsJ00nLCcyJykgJiYgZW5jLT5leHRyYWRhdGFfc2l6ZSkgeworICAgIGlmICggIChwYXItPmNvZGVjX3RhZyA9PSBNS1RBRygnUScsJ0QnLCdNJywnMicpCisgICAgICAgIHx8IHBhci0+Y29kZWNfdGFnID09IE1LVEFHKCdRJywnYycsJ2wnLCdwJykpICYmIHBhci0+ZXh0cmFkYXRhX3NpemUpIHsKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAid2F2ZSIpOwotICAgICAgICBhdmlvX3diMzIocGIsIGVuYy0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICBhdmlvX3dyaXRlKHBiLCBlbmMtPmV4dHJhZGF0YSwgZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICB9CiAKICAgICAvKiBTb3VuZCBkYXRhIGNodW5rICovCkBAIC0xOTksNyArMjAwLDcgQEAKICAgICBhdmlvX3diMzIocGIsIDApOyAgICAgICAgICAgICAgICAgICAgLyogQmxvY2stc2l6ZSAoYmxvY2sgYWxpZ24pICovCiAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbYWlmZi0+YXVkaW9fc3RyZWFtX2lkeF0sIDY0LCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1thaWZmLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbYWlmZi0+YXVkaW9fc3RyZWFtX2lkeF0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICAvKiBEYXRhIGlzIHN0YXJ0aW5nIGhlcmUgKi8KICAgICBhdmlvX2ZsdXNoKHBiKTsKQEAgLTIxNyw3ICsyMTgsNyBAQAogICAgICAgICBpbnQgcmV0OwogICAgICAgICBBVlBhY2tldExpc3QgKnBpY3RfbGlzdCwgKmxhc3Q7CiAKLSAgICAgICAgaWYgKHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGlmIChzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICAgICAgcmV0dXJuIDA7CiAKICAgICAgICAgLyogd2FybiBvbmx5IG9uY2UgZm9yIGVhY2ggc3RyZWFtICovCkBAIC0yMzIsNyArMjMzLDggQEAKICAgICAgICAgaWYgKCFwaWN0X2xpc3QpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgIGlmICgocmV0ID0gYXZfY29weV9wYWNrZXQoJnBpY3RfbGlzdC0+cGt0LCBwa3QpKSA8IDApIHsKKyAgICAgICAgcmV0ID0gYXZfcGFja2V0X3JlZigmcGljdF9saXN0LT5wa3QsIHBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICBhdl9mcmVlcCgmcGljdF9saXN0KTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KQEAgLTI1Niw3ICsyNTgsNyBAQAogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogICAgIEFJRkZPdXRwdXRDb250ZXh0ICphaWZmID0gcy0+cHJpdl9kYXRhOwogICAgIEFWUGFja2V0TGlzdCAqcGljdF9saXN0ID0gYWlmZi0+cGljdF9saXN0OwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zW2FpZmYtPmF1ZGlvX3N0cmVhbV9pZHhdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1thaWZmLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWNwYXI7CiAKICAgICAvKiBDaHVua3Mgc2l6ZXMgbXVzdCBiZSBldmVuICovCiAgICAgaW50NjRfdCBmaWxlX3NpemUsIGVuZF9zaXplOwpAQCAtMjY2LDEwICsyNjgsMTAgQEAKICAgICAgICAgZW5kX3NpemUrKzsKICAgICB9CiAKLSAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CiAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGUgZnJhbWVzICovCiAgICAgICAgIGF2aW9fc2VlayhwYiwgYWlmZi0+ZnJhbWVzLCBTRUVLX1NFVCk7Ci0gICAgICAgIGF2aW9fd2IzMihwYiwgKGZpbGVfc2l6ZS1haWZmLT5zc25kLTEyKS9lbmMtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAoZmlsZV9zaXplIC0gYWlmZi0+c3NuZCAtIDEyKSAvIHBhci0+YmxvY2tfYWxpZ24pOwogCiAgICAgICAgIC8qIFNvdW5kIERhdGEgY2h1bmsgc2l6ZSAqLwogICAgICAgICBhdmlvX3NlZWsocGIsIGFpZmYtPnNzbmQsIFNFRUtfU0VUKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FpeGRlYy5jIGIvbGliYXZmb3JtYXQvYWl4ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkOGExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2FpeGRlYy5jCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQUlYIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0YXRpYyBpbnQgYWl4X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChBVl9STDMyKHAtPmJ1ZikgIT0gTUtUQUcoJ0EnLCdJJywnWCcsJ0YnKSB8fAorICAgICAgICBBVl9SQjMyKHAtPmJ1ZiArICA4KSAhPSAweDAxMDAwMDE0IHx8CisgICAgICAgIEFWX1JCMzIocC0+YnVmICsgMTIpICE9IDB4MDAwMDA4MDApCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworfQorCitzdGF0aWMgaW50IGFpeF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgdW5zaWduZWQgbmJfc3RyZWFtcywgZmlyc3Rfb2Zmc2V0LCBuYl9zZWdtZW50czsKKyAgICB1bnNpZ25lZCBzdHJlYW1fbGlzdF9vZmZzZXQ7CisgICAgdW5zaWduZWQgc2VnbWVudF9saXN0X29mZnNldCA9IDB4MjA7CisgICAgdW5zaWduZWQgc2VnbWVudF9saXN0X2VudHJ5X3NpemUgPSAweDEwOworICAgIHVuc2lnbmVkIHNpemU7CisgICAgaW50IGk7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIDQpOworICAgIGZpcnN0X29mZnNldCA9IGF2aW9fcmIzMihzLT5wYikgKyA4OworICAgIGF2aW9fc2tpcChzLT5wYiwgMTYpOworICAgIG5iX3NlZ21lbnRzID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICBpZiAobmJfc2VnbWVudHMgPT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc3RyZWFtX2xpc3Rfb2Zmc2V0ID0gc2VnbWVudF9saXN0X29mZnNldCArIHNlZ21lbnRfbGlzdF9lbnRyeV9zaXplICogbmJfc2VnbWVudHMgKyAweDEwOworICAgIGlmIChzdHJlYW1fbGlzdF9vZmZzZXQgPj0gZmlyc3Rfb2Zmc2V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdmlvX3NlZWsocy0+cGIsIHN0cmVhbV9saXN0X29mZnNldCwgU0VFS19TRVQpOworICAgIG5iX3N0cmVhbXMgPSBhdmlvX3I4KHMtPnBiKTsKKyAgICBpZiAobmJfc3RyZWFtcyA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBhdmlvX3NraXAocy0+cGIsIDcpOworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKworICAgICAgICBpZiAoIXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX0FEWDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBhdmlvX3I4KHMtPnBiKTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworICAgICAgICBhdmlvX3NraXAocy0+cGIsIDMpOworICAgIH0KKworICAgIGF2aW9fc2VlayhzLT5wYiwgZmlyc3Rfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBpZiAoYXZpb19ybDMyKHMtPnBiKSAhPSBNS1RBRygnQScsJ0knLCdYJywnUCcpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIHNpemUgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICBpZiAoc2l6ZSA8PSA4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgOCk7CisgICAgICAgIGZmX2dldF9leHRyYWRhdGEocywgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXIsIHMtPnBiLCBzaXplIC0gOCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWl4X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICB1bnNpZ25lZCBzaXplLCBpbmRleCwgZHVyYXRpb24sIGNodW5rOworICAgIGludDY0X3QgcG9zOworICAgIGludCBzZXF1ZW5jZSwgcmV0LCBpOworCisgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBpZiAoYXZpb19mZW9mKHMtPnBiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIGNodW5rID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoY2h1bmsgPT0gTUtUQUcoJ0EnLCdJJywnWCcsJ0UnKSkgeworICAgICAgICBhdmlvX3NraXAocy0+cGIsIHNpemUpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoYXZpb19mZW9mKHMtPnBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgICAgICBjaHVuayA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBzaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICAgICAgY2h1bmsgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICBzaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICB9CisKKyAgICBpZiAoY2h1bmsgIT0gTUtUQUcoJ0EnLCdJJywnWCcsJ1AnKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKHNpemUgPD0gOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaW5kZXggPSBhdmlvX3I4KHMtPnBiKTsKKyAgICBpZiAoYXZpb19yOChzLT5wYikgIT0gcy0+bmJfc3RyZWFtcyB8fCBpbmRleCA+PSBzLT5uYl9zdHJlYW1zKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBkdXJhdGlvbiA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgc2VxdWVuY2UgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmIChzZXF1ZW5jZSA8IDApIHsKKyAgICAgICAgYXZpb19za2lwKHMtPnBiLCBzaXplIC0gOCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSAtIDgpOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gaW5kZXg7CisgICAgcGt0LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIHBrdC0+cG9zID0gcG9zOworICAgIHJldHVybiByZXQ7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYWl4X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgID0gImFpeCIsCisgICAgLmxvbmdfbmFtZSAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNSSSBBSVgiKSwKKyAgICAucmVhZF9wcm9iZSAgPSBhaXhfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyID0gYWl4X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCA9IGFpeF9yZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgPSAiYWl4IiwKKyAgICAuZmxhZ3MgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FsbGZvcm1hdHMuYyBiL2xpYmF2Zm9ybWF0L2FsbGZvcm1hdHMuYwppbmRleCAwMmJiMTZhLi5kNTgyNzc4IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hbGxmb3JtYXRzLmMKKysrIGIvbGliYXZmb3JtYXQvYWxsZm9ybWF0cy5jCkBAIC0xOSw0MDMgKzE5LDYwMiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgInJ0cC5oIgogI2luY2x1ZGUgInJkdC5oIgogI2luY2x1ZGUgInVybC5oIgogI2luY2x1ZGUgInZlcnNpb24uaCIKIAotI2RlZmluZSBSRUdJU1RFUl9NVVhFUihYLCB4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfIyN4IyNfbXV4ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoQ09ORklHXyMjWCMjX01VWEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXZfcmVnaXN0ZXJfb3V0cHV0X2Zvcm1hdCgmZmZfIyN4IyNfbXV4ZXIpOyAgICAgICAgICAgICAgICAgXAorLyogKGRlKW11eGVycyAqLworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2E2NF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hYV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FhY19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FjM19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2FjM19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hY21fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hY3RfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hZGZfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hZHBfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hZHNfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hZHRzX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FkeF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2FkeF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hZWFfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hZmNfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9haWZmX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfYWlmZl9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9haXhfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hbXJfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hbXJfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYW1ybmJfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hbXJ3Yl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FubV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FwY19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FwZV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FwbmdfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hcG5nX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FwdHhfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hcHR4X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FwdHhfaGRfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hcHR4X2hkX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2FxdGl0bGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hc2ZfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hc2ZfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYXNmX29fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hc3NfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hc3NfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYXN0X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfYXN0X211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2FzZl9zdHJlYW1fbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYXVfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hdV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9hdmlfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hdmlfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYXZpc3ludGhfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9hdm0yX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2F2cl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2F2c19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2JldGhzb2Z0dmlkX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYmZpX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYmludGV4dF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2JpbmtfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9iaXRfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9iaXRfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYm12X2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfYmZzdG1fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9icnN0bV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2JvYV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2M5M19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2NhZl9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2NhZl9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9jYXZzdmlkZW9fZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9jYXZzdmlkZW9fbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfY2RnX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfY2R4bF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2NpbmVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9jb2RlYzJfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9jb2RlYzJfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfY29kZWMycmF3X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfY29kZWMycmF3X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2NvbmNhdF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2NyY19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kYXNoX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZGFzaF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kYXRhX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZGF0YV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kYXVkX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZGF1ZF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kY3N0cl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2RmYV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2RpcmFjX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZGlyYWNfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZG54aGRfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9kbnhoZF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kc2ZfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kc2ljaW5fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kc3NfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kdHNfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9kdHNfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZHRzaGRfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9kdl9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2R2X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2R2YnN1Yl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2R2YnR4dF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2R4YV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2VhX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZWFfY2RhdGFfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9lYWMzX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZWFjM19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9lcGFmX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZjR2X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ZmbWV0YWRhdGFfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9mZm1ldGFkYXRhX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2ZpZm9fbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZmlmb190ZXN0X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ZpbG1zdHJpcF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2ZpbG1zdHJpcF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9maXRzX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZml0c19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9mbGFjX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZmxhY19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9mbGljX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZmx2X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZmx2X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2xpdmVfZmx2X2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZm91cnhtX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZnJhbWVjcmNfbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZnJhbWVoYXNoX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2ZyYW1lbWQ1X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ZybV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ZzYl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2c3MjJfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9nNzIyX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2c3MjNfMV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2c3MjNfMV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9nNzI2X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZzcyNl9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9nNzI2bGVfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9nNzI2bGVfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZzcyOV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2dkdl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2dlbmhfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9naWZfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9naWZfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfZ3NtX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfZ3NtX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2d4Zl9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2d4Zl9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9oMjYxX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfaDI2MV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9oMjYzX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfaDI2M19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9oMjY0X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfaDI2NF9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9oYXNoX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2hkc19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9oZXZjX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfaGV2Y19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9obHNfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9obHNfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaG5tX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaWNvX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfaWNvX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2lkY2luX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaWRmX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaWZmX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaWxiY19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2lsYmNfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2UyX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfaW1hZ2UyX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlMnBpcGVfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9pbWFnZTJwaXBlX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlMl9hbGlhc19waXhfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZTJfYnJlbmRlcl9waXhfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbmdlbmllbnRfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pcG1vdmllX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfaXBvZF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pcmNhbV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2lyY2FtX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX2lzbXZfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaXNzX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaXY4X2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaXZmX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfaXZmX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2l2cl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2phY29zdWJfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9qYWNvc3ViX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2p2X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfbGF0bV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9sbWxtNF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2xvYXNfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9scmNfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9scmNfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbHZmX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbHhmX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbTR2X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfbTR2X211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21kNV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tYXRyb3NrYV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21hdHJvc2thX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21hdHJvc2thX2F1ZGlvX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX21nc3RzX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbWljcm9kdmRfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9taWNyb2R2ZF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tanBlZ19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21qcGVnX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX21qcGVnXzIwMDBfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tbHBfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tbHBfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbWx2X2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbW1fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tbWZfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tbWZfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbW92X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfbW92X211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21wMl9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tcDNfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcDNfbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfbXA0X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX21wY19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX21wYzhfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcGVnMXN5c3RlbV9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcGVnMXZjZF9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcGVnMXZpZGVvX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21wZWcyZHZkX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21wZWcyc3ZjZF9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcGVnMnZpZGVvX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21wZWcydm9iX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX21wZWdwc19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX21wZWd0c19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX21wZWd0c19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tcGVndHNyYXdfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tcGVndmlkZW9fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tcGpwZWdfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9tcGpwZWdfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbXBsMl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX21wc3ViX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbXNmX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbXNud2NfdGNwX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbXRhZl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX210dl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX211c3hfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9tdl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX212aV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX214Zl9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX214Zl9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9teGZfZDEwX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX214Zl9vcGF0b21fbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbXhnX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbmNfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9uaXN0c3BoZXJlX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbnNwX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbnN2X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfbnVsbF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9udXRfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9udXRfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbnV2X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfb2dhX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX29nZ19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX29nZ19tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9vZ3ZfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfb21hX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfb21hX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX29wdXNfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGFmX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGNtX2FsYXdfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wY21fYWxhd19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9wY21fbXVsYXdfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wY21fbXVsYXdfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGNtX2Y2NGJlX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcGNtX2Y2NGJlX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3BjbV9mNjRsZV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3BjbV9mNjRsZV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9wY21fZjMyYmVfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wY21fZjMyYmVfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGNtX2YzMmxlX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcGNtX2YzMmxlX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3BjbV9zMzJiZV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3BjbV9zMzJiZV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9wY21fczMybGVfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wY21fczMybGVfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGNtX3MyNGJlX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcGNtX3MyNGJlX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3BjbV9zMjRsZV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3BjbV9zMjRsZV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9wY21fczE2YmVfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wY21fczE2YmVfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGNtX3MxNmxlX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcGNtX3MxNmxlX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3BjbV9zOF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3BjbV9zOF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9wY21fdTMyYmVfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wY21fdTMyYmVfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGNtX3UzMmxlX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcGNtX3UzMmxlX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3BjbV91MjRiZV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3BjbV91MjRiZV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9wY21fdTI0bGVfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wY21fdTI0bGVfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGNtX3UxNmJlX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcGNtX3UxNmJlX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3BjbV91MTZsZV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3BjbV91MTZsZV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9wY21fdThfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9wY21fdThfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcGpzX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcG1wX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcHNwX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3B2YV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3B2Zl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3FjcF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3IzZF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3Jhd3ZpZGVvX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcmF3dmlkZW9fbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcmVhbHRleHRfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9yZWRzcGFya19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3JsMl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3JtX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcm1fbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfcm9xX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcm9xX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3JwbF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3JzZF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3Jzb19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3Jzb19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9ydHBfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9ydHBfbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcnRwX21wZWd0c19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9ydHNwX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfcnRzcF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zMzM3bV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3NhbWlfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zYXBfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9zYXBfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc2JjX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfc2JjX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3NiZ19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3NjY19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3NjY19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zZHBfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zZHIyX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc2RzX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc2R4X2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc2VnYWZpbG1fZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9zZWdhZmlsbV9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9zZWdtZW50X211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3N0cmVhbV9zZWdtZW50X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3Nob3J0ZW5fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zaWZmX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfc2luZ2xlanBlZ19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zbG5fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zbWFja2VyX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc21qcGVnX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfc21qcGVnX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3Ntb290aHN0cmVhbWluZ19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zbXVzaF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3NvbF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3NveF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3NveF9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9zcHhfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc3BkaWZfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9zcGRpZl9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zcnRfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9zcnRfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc3RyX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc3RsX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc3Vidmlld2VyMV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3N1YnZpZXdlcl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3N1cF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3N1cF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9zdmFnX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfc3dmX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfc3dmX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3Rha19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3RlZV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl90ZWRjYXB0aW9uc19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3RnMl9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl90Z3BfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdGhwX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdGhyZWVkb3N0cl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3RpZXJ0ZXhzZXFfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9ta3Z0aW1lc3RhbXBfdjJfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdG12X2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdHJ1ZWhkX2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfdHJ1ZWhkX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3R0YV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3R0YV9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl90eGRfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl90dHlfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl90eV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3VuY29kZWRmcmFtZWNyY19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl92MjEwX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdjIxMHhfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl92YWdfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl92YzFfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl92YzFfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdmMxdF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3ZjMXRfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdml2b19kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3ZtZF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3ZvYnN1Yl9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3ZvY19kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3ZvY19tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl92cGtfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl92cGxheWVyX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdnFmX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfdzY0X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfdzY0X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3dhdl9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3dhdl9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl93YzNfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl93ZWJtX211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3dlYm1fZGFzaF9tYW5pZmVzdF9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3dlYm1fZGFzaF9tYW5pZmVzdF9tdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl93ZWJtX2NodW5rX211eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3dlYnBfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfd2VidnR0X2RlbXV4ZXI7CitleHRlcm4gQVZPdXRwdXRGb3JtYXQgZmZfd2VidnR0X211eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3dzYXVkX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfd3NkX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfd3N2cWFfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl93dHZfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl93dHZfbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfd3ZlX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfd3ZfZGVtdXhlcjsKK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl93dl9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl94YV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3hiaW5fZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl94bXZfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl94dmFnX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfeHdtYV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3lvcF9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX3l1djRtcGVncGlwZV9kZW11eGVyOworZXh0ZXJuIEFWT3V0cHV0Rm9ybWF0IGZmX3l1djRtcGVncGlwZV9tdXhlcjsKKy8qIGltYWdlIGRlbXV4ZXJzICovCitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2VfYm1wX3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV9kZHNfcGlwZV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlX2RweF9waXBlX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2VfZXhyX3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV9qMmtfcGlwZV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlX2pwZWdfcGlwZV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlX2pwZWdsc19waXBlX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2VfcGFtX3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV9wYm1fcGlwZV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlX3BjeF9waXBlX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2VfcGdteXV2X3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV9wZ21fcGlwZV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlX3BpY3Rvcl9waXBlX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2VfcG5nX3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV9wcG1fcGlwZV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlX3BzZF9waXBlX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2VfcWRyYXdfcGlwZV9kZW11eGVyOworZXh0ZXJuIEFWSW5wdXRGb3JtYXQgIGZmX2ltYWdlX3NnaV9waXBlX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfaW1hZ2Vfc3ZnX3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV9zdW5yYXN0X3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV90aWZmX3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV93ZWJwX3BpcGVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9pbWFnZV94cG1fcGlwZV9kZW11eGVyOworCisvKiBleHRlcm5hbCBsaWJyYXJpZXMgKi8KK2V4dGVybiBBVk91dHB1dEZvcm1hdCBmZl9jaHJvbWFwcmludF9tdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9saWJnbWVfZGVtdXhlcjsKK2V4dGVybiBBVklucHV0Rm9ybWF0ICBmZl9saWJtb2RwbHVnX2RlbXV4ZXI7CitleHRlcm4gQVZJbnB1dEZvcm1hdCAgZmZfbGlib3Blbm1wdF9kZW11eGVyOworCisjaW5jbHVkZSAibGliYXZmb3JtYXQvbXV4ZXJfbGlzdC5jIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2RlbXV4ZXJfbGlzdC5jIgorCitzdGF0aWMgY29uc3QgQVZJbnB1dEZvcm1hdCAqIGNvbnN0ICppbmRldl9saXN0ID0gTlVMTDsKK3N0YXRpYyBjb25zdCBBVk91dHB1dEZvcm1hdCAqIGNvbnN0ICpvdXRkZXZfbGlzdCA9IE5VTEw7CisKK2NvbnN0IEFWT3V0cHV0Rm9ybWF0ICphdl9tdXhlcl9pdGVyYXRlKHZvaWQgKipvcGFxdWUpCit7CisgICAgc3RhdGljIGNvbnN0IHVpbnRwdHJfdCBzaXplID0gc2l6ZW9mKG11eGVyX2xpc3QpL3NpemVvZihtdXhlcl9saXN0WzBdKSAtIDE7CisgICAgdWludHB0cl90IGkgPSAodWludHB0cl90KSpvcGFxdWU7CisgICAgY29uc3QgQVZPdXRwdXRGb3JtYXQgKmYgPSBOVUxMOworCisgICAgaWYgKGkgPCBzaXplKSB7CisgICAgICAgIGYgPSBtdXhlcl9saXN0W2ldOworICAgIH0gZWxzZSBpZiAoaW5kZXZfbGlzdCkgeworICAgICAgICBmID0gb3V0ZGV2X2xpc3RbaSAtIHNpemVdOwogICAgIH0KIAotI2RlZmluZSBSRUdJU1RFUl9ERU1VWEVSKFgsIHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBleHRlcm4gQVZJbnB1dEZvcm1hdCBmZl8jI3gjI19kZW11eGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoQ09ORklHXyMjWCMjX0RFTVVYRVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXZfcmVnaXN0ZXJfaW5wdXRfZm9ybWF0KCZmZl8jI3gjI19kZW11eGVyKTsgICAgICAgICAgICAgICAgXAorICAgIGlmIChmKQorICAgICAgICAqb3BhcXVlID0gKHZvaWQqKShpICsgMSk7CisgICAgcmV0dXJuIGY7Cit9CisKK2NvbnN0IEFWSW5wdXRGb3JtYXQgKmF2X2RlbXV4ZXJfaXRlcmF0ZSh2b2lkICoqb3BhcXVlKQoreworICAgIHN0YXRpYyBjb25zdCB1aW50cHRyX3Qgc2l6ZSA9IHNpemVvZihkZW11eGVyX2xpc3QpL3NpemVvZihkZW11eGVyX2xpc3RbMF0pIC0gMTsKKyAgICB1aW50cHRyX3QgaSA9ICh1aW50cHRyX3QpKm9wYXF1ZTsKKyAgICBjb25zdCBBVklucHV0Rm9ybWF0ICpmID0gTlVMTDsKKworICAgIGlmIChpIDwgc2l6ZSkgeworICAgICAgICBmID0gZGVtdXhlcl9saXN0W2ldOworICAgIH0gZWxzZSBpZiAob3V0ZGV2X2xpc3QpIHsKKyAgICAgICAgZiA9IGluZGV2X2xpc3RbaSAtIHNpemVdOwogICAgIH0KIAotI2RlZmluZSBSRUdJU1RFUl9NVVhERU1VWChYLCB4KSBSRUdJU1RFUl9NVVhFUihYLCB4KTsgUkVHSVNURVJfREVNVVhFUihYLCB4KQorICAgIGlmIChmKQorICAgICAgICAqb3BhcXVlID0gKHZvaWQqKShpICsgMSk7CisgICAgcmV0dXJuIGY7Cit9CiAKLSNkZWZpbmUgUkVHSVNURVJfUFJPVE9DT0woWCwgeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZXh0ZXJuIFVSTFByb3RvY29sIGZmXyMjeCMjX3Byb3RvY29sOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKENPTkZJR18jI1gjI19QUk9UT0NPTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGZmdXJsX3JlZ2lzdGVyX3Byb3RvY29sKCZmZl8jI3gjI19wcm90b2NvbCk7ICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBBVk11dGV4IGF2cHJpdl9yZWdpc3Rlcl9kZXZpY2VzX211dGV4ID0gQVZfTVVURVhfSU5JVElBTElaRVI7CisKKyNpZiBGRl9BUElfTkVYVAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworc3RhdGljIEFWT25jZSBhdl9mb3JtYXRfbmV4dF9pbml0ID0gQVZfT05DRV9JTklUOworCitzdGF0aWMgdm9pZCBhdl9mb3JtYXRfaW5pdF9uZXh0KHZvaWQpCit7CisgICAgQVZPdXRwdXRGb3JtYXQgKnByZXZvdXQgPSBOVUxMLCAqb3V0OworICAgIEFWSW5wdXRGb3JtYXQgKnByZXZpbiA9IE5VTEwsICppbjsKKworICAgIGZmX211dGV4X2xvY2soJmF2cHJpdl9yZWdpc3Rlcl9kZXZpY2VzX211dGV4KTsKKworICAgIGZvciAoaW50IGkgPSAwOyAob3V0ID0gKEFWT3V0cHV0Rm9ybWF0KiltdXhlcl9saXN0W2ldKTsgaSsrKSB7CisgICAgICAgIGlmIChwcmV2b3V0KQorICAgICAgICAgICAgcHJldm91dC0+bmV4dCA9IG91dDsKKyAgICAgICAgcHJldm91dCA9IG91dDsKICAgICB9CiAKKyAgICBpZiAob3V0ZGV2X2xpc3QpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IChvdXQgPSAoQVZPdXRwdXRGb3JtYXQqKW91dGRldl9saXN0W2ldKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocHJldm91dCkKKyAgICAgICAgICAgICAgICBwcmV2b3V0LT5uZXh0ID0gb3V0OworICAgICAgICAgICAgcHJldm91dCA9IG91dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyAoaW4gPSAoQVZJbnB1dEZvcm1hdCopZGVtdXhlcl9saXN0W2ldKTsgaSsrKSB7CisgICAgICAgIGlmIChwcmV2aW4pCisgICAgICAgICAgICBwcmV2aW4tPm5leHQgPSBpbjsKKyAgICAgICAgcHJldmluID0gaW47CisgICAgfQorCisgICAgaWYgKGluZGV2X2xpc3QpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IChpbiA9IChBVklucHV0Rm9ybWF0KilpbmRldl9saXN0W2ldKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAocHJldmluKQorICAgICAgICAgICAgICAgIHByZXZpbi0+bmV4dCA9IGluOworICAgICAgICAgICAgcHJldmluID0gaW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmZl9tdXRleF91bmxvY2soJmF2cHJpdl9yZWdpc3Rlcl9kZXZpY2VzX211dGV4KTsKK30KKworQVZJbnB1dEZvcm1hdCAqYXZfaWZvcm1hdF9uZXh0KGNvbnN0IEFWSW5wdXRGb3JtYXQgKmYpCit7CisgICAgZmZfdGhyZWFkX29uY2UoJmF2X2Zvcm1hdF9uZXh0X2luaXQsIGF2X2Zvcm1hdF9pbml0X25leHQpOworCisgICAgaWYgKGYpCisgICAgICAgIHJldHVybiBmLT5uZXh0OworICAgIGVsc2UgeworICAgICAgICB2b2lkICpvcGFxdWUgPSBOVUxMOworICAgICAgICByZXR1cm4gKEFWSW5wdXRGb3JtYXQgKilhdl9kZW11eGVyX2l0ZXJhdGUoJm9wYXF1ZSk7CisgICAgfQorfQorCitBVk91dHB1dEZvcm1hdCAqYXZfb2Zvcm1hdF9uZXh0KGNvbnN0IEFWT3V0cHV0Rm9ybWF0ICpmKQoreworICAgIGZmX3RocmVhZF9vbmNlKCZhdl9mb3JtYXRfbmV4dF9pbml0LCBhdl9mb3JtYXRfaW5pdF9uZXh0KTsKKworICAgIGlmIChmKQorICAgICAgICByZXR1cm4gZi0+bmV4dDsKKyAgICBlbHNlIHsKKyAgICAgICAgdm9pZCAqb3BhcXVlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIChBVk91dHB1dEZvcm1hdCAqKWF2X211eGVyX2l0ZXJhdGUoJm9wYXF1ZSk7CisgICAgfQorfQorCiB2b2lkIGF2X3JlZ2lzdGVyX2FsbCh2b2lkKQogewotICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQ7CisgICAgZmZfdGhyZWFkX29uY2UoJmF2X2Zvcm1hdF9uZXh0X2luaXQsIGF2X2Zvcm1hdF9pbml0X25leHQpOworfQogCi0gICAgaWYgKGluaXRpYWxpemVkKQotICAgICAgICByZXR1cm47Ci0gICAgaW5pdGlhbGl6ZWQgPSAxOwordm9pZCBhdl9yZWdpc3Rlcl9pbnB1dF9mb3JtYXQoQVZJbnB1dEZvcm1hdCAqZm9ybWF0KQoreworICAgIGZmX3RocmVhZF9vbmNlKCZhdl9mb3JtYXRfbmV4dF9pbml0LCBhdl9mb3JtYXRfaW5pdF9uZXh0KTsKK30KIAotICAgIGF2Y29kZWNfcmVnaXN0ZXJfYWxsKCk7Ci0KLSAgICAvKiAoZGUpbXV4ZXJzICovCi0gICAgUkVHSVNURVJfTVVYRVIgICAoQTY0LCAgICAgICAgICAgICAgYTY0KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChBQSwgICAgICAgICAgICAgICBhYSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQUFDLCAgICAgICAgICAgICAgYWFjKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChBQzMsICAgICAgICAgICAgICBhYzMpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFDTSwgICAgICAgICAgICAgIGFjbSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQUNULCAgICAgICAgICAgICAgYWN0KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChBREYsICAgICAgICAgICAgICBhZGYpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFEUCwgICAgICAgICAgICAgIGFkcCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQURTLCAgICAgICAgICAgICAgYWRzKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChBRFRTLCAgICAgICAgICAgICBhZHRzKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChBRFgsICAgICAgICAgICAgICBhZHgpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFFQSwgICAgICAgICAgICAgIGFlYSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQUZDLCAgICAgICAgICAgICAgYWZjKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChBSUZGLCAgICAgICAgICAgICBhaWZmKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChBTVIsICAgICAgICAgICAgICBhbXIpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFOTSwgICAgICAgICAgICAgIGFubSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQVBDLCAgICAgICAgICAgICAgYXBjKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChBUEUsICAgICAgICAgICAgICBhcGUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEFQTkcsICAgICAgICAgICAgIGFwbmcpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEFRVElUTEUsICAgICAgICAgIGFxdGl0bGUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEFTRiwgICAgICAgICAgICAgIGFzZik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQVNGX08sICAgICAgICAgICAgYXNmX28pOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEFTUywgICAgICAgICAgICAgIGFzcyk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoQVNULCAgICAgICAgICAgICAgYXN0KTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChBU0ZfU1RSRUFNLCAgICAgICBhc2Zfc3RyZWFtKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChBVSwgICAgICAgICAgICAgICBhdSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoQVZJLCAgICAgICAgICAgICAgYXZpKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChBVklTWU5USCwgICAgICAgICBhdmlzeW50aCk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoQVZNMiwgICAgICAgICAgICAgYXZtMik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQVZSLCAgICAgICAgICAgICAgYXZyKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChBVlMsICAgICAgICAgICAgICBhdnMpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEJFVEhTT0ZUVklELCAgICAgIGJldGhzb2Z0dmlkKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChCRkksICAgICAgICAgICAgICBiZmkpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEJJTlRFWFQsICAgICAgICAgIGJpbnRleHQpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEJJTkssICAgICAgICAgICAgIGJpbmspOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEJJVCwgICAgICAgICAgICAgIGJpdCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQk1WLCAgICAgICAgICAgICAgYm12KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChCRlNUTSwgICAgICAgICAgICBiZnN0bSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQlJTVE0sICAgICAgICAgICAgYnJzdG0pOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEJPQSwgICAgICAgICAgICAgIGJvYSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQzkzLCAgICAgICAgICAgICAgYzkzKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChDQUYsICAgICAgICAgICAgICBjYWYpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKENBVlNWSURFTywgICAgICAgIGNhdnN2aWRlbyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoQ0RHLCAgICAgICAgICAgICAgY2RnKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChDRFhMLCAgICAgICAgICAgICBjZHhsKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChDSU5FLCAgICAgICAgICAgICBjaW5lKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChDT05DQVQsICAgICAgICAgICBjb25jYXQpOwotICAgIFJFR0lTVEVSX01VWEVSICAgKENSQywgICAgICAgICAgICAgIGNyYyk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoREFTSCwgICAgICAgICAgICAgZGFzaCk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoREFUQSwgICAgICAgICAgICAgZGF0YSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoREFVRCwgICAgICAgICAgICAgZGF1ZCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoRENTVFIsICAgICAgICAgICAgZGNzdHIpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKERGQSwgICAgICAgICAgICAgIGRmYSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoRElSQUMsICAgICAgICAgICAgZGlyYWMpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEROWEhELCAgICAgICAgICAgIGRueGhkKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChEU0YsICAgICAgICAgICAgICBkc2YpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKERTSUNJTiwgICAgICAgICAgIGRzaWNpbik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoRFNTLCAgICAgICAgICAgICAgZHNzKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChEVFMsICAgICAgICAgICAgICBkdHMpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKERUU0hELCAgICAgICAgICAgIGR0c2hkKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChEViwgICAgICAgICAgICAgICBkdik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoRFZCU1VCLCAgICAgICAgICAgZHZic3ViKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChEWEEsICAgICAgICAgICAgICBkeGEpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEVBLCAgICAgICAgICAgICAgIGVhKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChFQV9DREFUQSwgICAgICAgICBlYV9jZGF0YSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoRUFDMywgICAgICAgICAgICAgZWFjMyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoRVBBRiwgICAgICAgICAgICAgZXBhZik7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoRjRWLCAgICAgICAgICAgICAgZjR2KTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChGRk0sICAgICAgICAgICAgICBmZm0pOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEZGTUVUQURBVEEsICAgICAgIGZmbWV0YWRhdGEpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEZJTE1TVFJJUCwgICAgICAgIGZpbG1zdHJpcCk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoRkxBQywgICAgICAgICAgICAgZmxhYyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoRkxJQywgICAgICAgICAgICAgZmxpYyk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoRkxWLCAgICAgICAgICAgICAgZmx2KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChMSVZFX0ZMViwgICAgICAgICBsaXZlX2Zsdik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoRk9VUlhNLCAgICAgICAgICAgZm91cnhtKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChGUkFNRUNSQywgICAgICAgICBmcmFtZWNyYyk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoRlJBTUVNRDUsICAgICAgICAgZnJhbWVtZDUpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEZSTSwgICAgICAgICAgICAgIGZybSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoRlNCLCAgICAgICAgICAgICAgZnNiKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChHNzIyLCAgICAgICAgICAgICBnNzIyKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChHNzIzXzEsICAgICAgICAgICBnNzIzXzEpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEc3MjksICAgICAgICAgICAgIGc3MjkpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEdFTkgsICAgICAgICAgICAgIGdlbmgpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEdJRiwgICAgICAgICAgICAgIGdpZik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoR1NNLCAgICAgICAgICAgICAgZ3NtKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChHWEYsICAgICAgICAgICAgICBneGYpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEgyNjEsICAgICAgICAgICAgIGgyNjEpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEgyNjMsICAgICAgICAgICAgIGgyNjMpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEgyNjQsICAgICAgICAgICAgIGgyNjQpOwotICAgIFJFR0lTVEVSX01VWEVSICAgKEhEUywgICAgICAgICAgICAgIGhkcyk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoSEVWQywgICAgICAgICAgICAgaGV2Yyk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoSExTLCAgICAgICAgICAgICAgaGxzKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChITk0sICAgICAgICAgICAgICBobm0pOwotICAgIFJFR0lTVEVSX01VWERFTVVYKElDTywgICAgICAgICAgICAgIGljbyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoSURDSU4sICAgICAgICAgICAgaWRjaW4pOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKElERiwgICAgICAgICAgICAgIGlkZik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoSUZGLCAgICAgICAgICAgICAgaWZmKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChJTEJDLCAgICAgICAgICAgICBpbGJjKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChJTUFHRTIsICAgICAgICAgICBpbWFnZTIpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKElNQUdFMlBJUEUsICAgICAgIGltYWdlMnBpcGUpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFMl9BTElBU19QSVgsIGltYWdlMl9hbGlhc19waXgpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFMl9CUkVOREVSX1BJWCwgaW1hZ2UyX2JyZW5kZXJfcGl4KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTkdFTklFTlQsICAgICAgICBpbmdlbmllbnQpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKElQTU9WSUUsICAgICAgICAgIGlwbW92aWUpOwotICAgIFJFR0lTVEVSX01VWEVSICAgKElQT0QsICAgICAgICAgICAgIGlwb2QpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKElSQ0FNLCAgICAgICAgICAgIGlyY2FtKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChJU01WLCAgICAgICAgICAgICBpc212KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJU1MsICAgICAgICAgICAgICBpc3MpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKElWOCwgICAgICAgICAgICAgIGl2OCk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoSVZGLCAgICAgICAgICAgICAgaXZmKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJVlIsICAgICAgICAgICAgICBpdnIpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKEpBQ09TVUIsICAgICAgICAgIGphY29zdWIpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKEpWLCAgICAgICAgICAgICAgIGp2KTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChMQVRNLCAgICAgICAgICAgICBsYXRtKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChMTUxNNCwgICAgICAgICAgICBsbWxtNCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTE9BUywgICAgICAgICAgICAgbG9hcyk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoTFJDLCAgICAgICAgICAgICAgbHJjKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChMVkYsICAgICAgICAgICAgICBsdmYpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKExYRiwgICAgICAgICAgICAgIGx4Zik7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoTTRWLCAgICAgICAgICAgICAgbTR2KTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChNRDUsICAgICAgICAgICAgICBtZDUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKE1BVFJPU0tBLCAgICAgICAgIG1hdHJvc2thKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChNQVRST1NLQV9BVURJTywgICBtYXRyb3NrYV9hdWRpbyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTUdTVFMsICAgICAgICAgICAgbWdzdHMpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKE1JQ1JPRFZELCAgICAgICAgIG1pY3JvZHZkKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChNSlBFRywgICAgICAgICAgICBtanBlZyk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoTUxQLCAgICAgICAgICAgICAgbWxwKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChNTFYsICAgICAgICAgICAgICBtbHYpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1NLCAgICAgICAgICAgICAgIG1tKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChNTUYsICAgICAgICAgICAgICBtbWYpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKE1PViwgICAgICAgICAgICAgIG1vdik7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoTVAyLCAgICAgICAgICAgICAgbXAyKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChNUDMsICAgICAgICAgICAgICBtcDMpOwotICAgIFJFR0lTVEVSX01VWEVSICAgKE1QNCwgICAgICAgICAgICAgIG1wNCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTVBDLCAgICAgICAgICAgICAgbXBjKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChNUEM4LCAgICAgICAgICAgICBtcGM4KTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChNUEVHMVNZU1RFTSwgICAgICBtcGVnMXN5c3RlbSk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoTVBFRzFWQ0QsICAgICAgICAgbXBlZzF2Y2QpOwotICAgIFJFR0lTVEVSX01VWEVSICAgKE1QRUcxVklERU8sICAgICAgIG1wZWcxdmlkZW8pOwotICAgIFJFR0lTVEVSX01VWEVSICAgKE1QRUcyRFZELCAgICAgICAgIG1wZWcyZHZkKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChNUEVHMlNWQ0QsICAgICAgICBtcGVnMnN2Y2QpOwotICAgIFJFR0lTVEVSX01VWEVSICAgKE1QRUcyVklERU8sICAgICAgIG1wZWcydmlkZW8pOwotICAgIFJFR0lTVEVSX01VWEVSICAgKE1QRUcyVk9CLCAgICAgICAgIG1wZWcydm9iKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChNUEVHUFMsICAgICAgICAgICBtcGVncHMpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKE1QRUdUUywgICAgICAgICAgIG1wZWd0cyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTVBFR1RTUkFXLCAgICAgICAgbXBlZ3RzcmF3KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChNUEVHVklERU8sICAgICAgICBtcGVndmlkZW8pOwotICAgIFJFR0lTVEVSX01VWERFTVVYKE1QSlBFRywgICAgICAgICAgIG1wanBlZyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTVBMMiwgICAgICAgICAgICAgbXBsMik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTVBTVUIsICAgICAgICAgICAgbXBzdWIpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1TRiwgICAgICAgICAgICAgIG1zZik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTVNOV0NfVENQLCAgICAgICAgbXNud2NfdGNwKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChNVFYsICAgICAgICAgICAgICBtdHYpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKE1WLCAgICAgICAgICAgICAgIG12KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChNVkksICAgICAgICAgICAgICBtdmkpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKE1YRiwgICAgICAgICAgICAgIG14Zik7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoTVhGX0QxMCwgICAgICAgICAgbXhmX2QxMCk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoTVhGX09QQVRPTSwgICAgICAgbXhmX29wYXRvbSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTVhHLCAgICAgICAgICAgICAgbXhnKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChOQywgICAgICAgICAgICAgICBuYyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTklTVFNQSEVSRSwgICAgICAgbmlzdHNwaGVyZSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTlNWLCAgICAgICAgICAgICAgbnN2KTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChOVUxMLCAgICAgICAgICAgICBudWxsKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChOVVQsICAgICAgICAgICAgICBudXQpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKE5VViwgICAgICAgICAgICAgIG51dik7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoT0dBLCAgICAgICAgICAgICAgb2dhKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChPR0csICAgICAgICAgICAgICBvZ2cpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKE9NQSwgICAgICAgICAgICAgIG9tYSk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoT1BVUywgICAgICAgICAgICAgb3B1cyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoUEFGLCAgICAgICAgICAgICAgcGFmKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fQUxBVywgICAgICAgICBwY21fYWxhdyk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUENNX01VTEFXLCAgICAgICAgcGNtX211bGF3KTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fRjY0QkUsICAgICAgICBwY21fZjY0YmUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9GNjRMRSwgICAgICAgIHBjbV9mNjRsZSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUENNX0YzMkJFLCAgICAgICAgcGNtX2YzMmJlKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fRjMyTEUsICAgICAgICBwY21fZjMybGUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9TMzJCRSwgICAgICAgIHBjbV9zMzJiZSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1MzMkxFLCAgICAgICAgcGNtX3MzMmxlKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fUzI0QkUsICAgICAgICBwY21fczI0YmUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9TMjRMRSwgICAgICAgIHBjbV9zMjRsZSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1MxNkJFLCAgICAgICAgcGNtX3MxNmJlKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fUzE2TEUsICAgICAgICBwY21fczE2bGUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9TOCwgICAgICAgICAgIHBjbV9zOCk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1UzMkJFLCAgICAgICAgcGNtX3UzMmJlKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fVTMyTEUsICAgICAgICBwY21fdTMybGUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9VMjRCRSwgICAgICAgIHBjbV91MjRiZSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1UyNExFLCAgICAgICAgcGNtX3UyNGxlKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChQQ01fVTE2QkUsICAgICAgICBwY21fdTE2YmUpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFBDTV9VMTZMRSwgICAgICAgIHBjbV91MTZsZSk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUENNX1U4LCAgICAgICAgICAgcGNtX3U4KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChQSlMsICAgICAgICAgICAgICBwanMpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFBNUCwgICAgICAgICAgICAgIHBtcCk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoUFNQLCAgICAgICAgICAgICAgcHNwKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChQVkEsICAgICAgICAgICAgICBwdmEpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFBWRiwgICAgICAgICAgICAgIHB2Zik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoUUNQLCAgICAgICAgICAgICAgcWNwKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChSM0QsICAgICAgICAgICAgICByM2QpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFJBV1ZJREVPLCAgICAgICAgIHJhd3ZpZGVvKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChSRUFMVEVYVCwgICAgICAgICByZWFsdGV4dCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoUkVEU1BBUkssICAgICAgICAgcmVkc3BhcmspOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFJMMiwgICAgICAgICAgICAgIHJsMik7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUk0sICAgICAgICAgICAgICAgcm0pOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFJPUSwgICAgICAgICAgICAgIHJvcSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoUlBMLCAgICAgICAgICAgICAgcnBsKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChSU0QsICAgICAgICAgICAgICByc2QpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFJTTywgICAgICAgICAgICAgIHJzbyk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoUlRQLCAgICAgICAgICAgICAgcnRwKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChSVFBfTVBFR1RTLCAgICAgICBydHBfbXBlZ3RzKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChSVFNQLCAgICAgICAgICAgICBydHNwKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChTQU1JLCAgICAgICAgICAgICBzYW1pKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChTQVAsICAgICAgICAgICAgICBzYXApOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNCRywgICAgICAgICAgICAgIHNiZyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoU0RQLCAgICAgICAgICAgICAgc2RwKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChTRFIyLCAgICAgICAgICAgICBzZHIyKTsKLSNpZiBDT05GSUdfUlRQREVDCi0gICAgZmZfcmVnaXN0ZXJfcnRwX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVycygpOwotICAgIGZmX3JlZ2lzdGVyX3JkdF9keW5hbWljX3BheWxvYWRfaGFuZGxlcnMoKTsKK3ZvaWQgYXZfcmVnaXN0ZXJfb3V0cHV0X2Zvcm1hdChBVk91dHB1dEZvcm1hdCAqZm9ybWF0KQoreworICAgIGZmX3RocmVhZF9vbmNlKCZhdl9mb3JtYXRfbmV4dF9pbml0LCBhdl9mb3JtYXRfaW5pdF9uZXh0KTsKK30KK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogI2VuZGlmCi0gICAgUkVHSVNURVJfREVNVVhFUiAoU0VHQUZJTE0sICAgICAgICAgc2VnYWZpbG0pOwotICAgIFJFR0lTVEVSX01VWEVSICAgKFNFR01FTlQsICAgICAgICAgIHNlZ21lbnQpOwotICAgIFJFR0lTVEVSX01VWEVSICAgKFNFR01FTlQsICAgICAgICAgIHN0cmVhbV9zZWdtZW50KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChTSE9SVEVOLCAgICAgICAgICBzaG9ydGVuKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChTSUZGLCAgICAgICAgICAgICBzaWZmKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChTSU5HTEVKUEVHLCAgICAgICBzaW5nbGVqcGVnKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChTTE4sICAgICAgICAgICAgICBzbG4pOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNNQUNLRVIsICAgICAgICAgIHNtYWNrZXIpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFNNSlBFRywgICAgICAgICAgIHNtanBlZyk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoU01PT1RIU1RSRUFNSU5HLCAgc21vb3Roc3RyZWFtaW5nKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChTTVVTSCwgICAgICAgICAgICBzbXVzaCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoU09MLCAgICAgICAgICAgICAgc29sKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChTT1gsICAgICAgICAgICAgICBzb3gpOwotICAgIFJFR0lTVEVSX01VWEVSICAgKFNQWCwgICAgICAgICAgICAgIHNweCk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoU1BESUYsICAgICAgICAgICAgc3BkaWYpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFNSVCwgICAgICAgICAgICAgIHNydCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoU1RSLCAgICAgICAgICAgICAgc3RyKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChTVEwsICAgICAgICAgICAgICBzdGwpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNVQlZJRVdFUjEsICAgICAgIHN1YnZpZXdlcjEpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFNVQlZJRVdFUiwgICAgICAgIHN1YnZpZXdlcik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoU1VQLCAgICAgICAgICAgICAgc3VwKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChTVkFHLCAgICAgICAgICAgICBzdmFnKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChTV0YsICAgICAgICAgICAgICBzd2YpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFRBSywgICAgICAgICAgICAgIHRhayk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoVEVFLCAgICAgICAgICAgICAgdGVlKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChURURDQVBUSU9OUywgICAgICB0ZWRjYXB0aW9ucyk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoVEcyLCAgICAgICAgICAgICAgdGcyKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChUR1AsICAgICAgICAgICAgICB0Z3ApOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFRIUCwgICAgICAgICAgICAgIHRocCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoVEhSRUVET1NUUiwgICAgICAgdGhyZWVkb3N0cik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoVElFUlRFWFNFUSwgICAgICAgdGllcnRleHNlcSk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoTUtWVElNRVNUQU1QX1YyLCAgbWt2dGltZXN0YW1wX3YyKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChUTVYsICAgICAgICAgICAgICB0bXYpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFRSVUVIRCwgICAgICAgICAgIHRydWVoZCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoVFRBLCAgICAgICAgICAgICAgdHRhKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChUWEQsICAgICAgICAgICAgICB0eGQpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFRUWSwgICAgICAgICAgICAgIHR0eSk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoVU5DT0RFREZSQU1FQ1JDLCAgdW5jb2RlZGZyYW1lY3JjKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChWMjEwLCAgICAgICAgICAgICB2MjEwKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChWMjEwWCwgICAgICAgICAgICB2MjEweCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoVkFHLCAgICAgICAgICAgICAgdmFnKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChWQzEsICAgICAgICAgICAgICB2YzEpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFZDMVQsICAgICAgICAgICAgIHZjMXQpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFZJVk8sICAgICAgICAgICAgIHZpdm8pOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFZNRCwgICAgICAgICAgICAgIHZtZCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoVk9CU1VCLCAgICAgICAgICAgdm9ic3ViKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChWT0MsICAgICAgICAgICAgICB2b2MpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFZQSywgICAgICAgICAgICAgIHZwayk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoVlBMQVlFUiwgICAgICAgICAgdnBsYXllcik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoVlFGLCAgICAgICAgICAgICAgdnFmKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChXNjQsICAgICAgICAgICAgICB3NjQpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFdBViwgICAgICAgICAgICAgIHdhdik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoV0MzLCAgICAgICAgICAgICAgd2MzKTsKLSAgICBSRUdJU1RFUl9NVVhFUiAgIChXRUJNLCAgICAgICAgICAgICB3ZWJtKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChXRUJNX0RBU0hfTUFOSUZFU1QsIHdlYm1fZGFzaF9tYW5pZmVzdCk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoV0VCTV9DSFVOSywgICAgICAgd2VibV9jaHVuayk7Ci0gICAgUkVHSVNURVJfTVVYRVIgICAoV0VCUCwgICAgICAgICAgICAgd2VicCk7Ci0gICAgUkVHSVNURVJfTVVYREVNVVgoV0VCVlRULCAgICAgICAgICAgd2VidnR0KTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChXU0FVRCwgICAgICAgICAgICB3c2F1ZCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoV1NWUUEsICAgICAgICAgICAgd3N2cWEpOwotICAgIFJFR0lTVEVSX01VWERFTVVYKFdUViwgICAgICAgICAgICAgIHd0dik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoV1ZFLCAgICAgICAgICAgICAgd3ZlKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChXViwgICAgICAgICAgICAgICB3dik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoWEEsICAgICAgICAgICAgICAgeGEpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFhCSU4sICAgICAgICAgICAgIHhiaW4pOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKFhNViwgICAgICAgICAgICAgIHhtdik7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoWFZBRywgICAgICAgICAgICAgeHZhZyk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoWFdNQSwgICAgICAgICAgICAgeHdtYSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoWU9QLCAgICAgICAgICAgICAgeW9wKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChZVVY0TVBFR1BJUEUsICAgICB5dXY0bXBlZ3BpcGUpOwogCi0gICAgLyogaW1hZ2UgZGVtdXhlcnMgKi8KLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9CTVBfUElQRSwgICAgICAgIGltYWdlX2JtcF9waXBlKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9ERFNfUElQRSwgICAgICAgIGltYWdlX2Rkc19waXBlKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9EUFhfUElQRSwgICAgICAgIGltYWdlX2RweF9waXBlKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9FWFJfUElQRSwgICAgICAgIGltYWdlX2V4cl9waXBlKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9KMktfUElQRSwgICAgICAgIGltYWdlX2oya19waXBlKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9KUEVHX1BJUEUsICAgICAgIGltYWdlX2pwZWdfcGlwZSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoSU1BR0VfSlBFR0xTX1BJUEUsICAgICBpbWFnZV9qcGVnbHNfcGlwZSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoSU1BR0VfUElDVE9SX1BJUEUsICAgICBpbWFnZV9waWN0b3JfcGlwZSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoSU1BR0VfUE5HX1BJUEUsICAgICAgICBpbWFnZV9wbmdfcGlwZSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoSU1BR0VfUURSQVdfUElQRSwgICAgICBpbWFnZV9xZHJhd19waXBlKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9TR0lfUElQRSwgICAgICAgIGltYWdlX3NnaV9waXBlKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChJTUFHRV9TVU5SQVNUX1BJUEUsICAgIGltYWdlX3N1bnJhc3RfcGlwZSk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoSU1BR0VfVElGRl9QSVBFLCAgICAgICBpbWFnZV90aWZmX3BpcGUpOwotICAgIFJFR0lTVEVSX0RFTVVYRVIgKElNQUdFX1dFQlBfUElQRSwgICAgICAgaW1hZ2Vfd2VicF9waXBlKTsKLQotCi0gICAgLyogcHJvdG9jb2xzICovCi0gICAgUkVHSVNURVJfUFJPVE9DT0woQVNZTkMsICAgICAgICAgICAgYXN5bmMpOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKEJMVVJBWSwgICAgICAgICAgIGJsdXJheSk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woQ0FDSEUsICAgICAgICAgICAgY2FjaGUpOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKENPTkNBVCwgICAgICAgICAgIGNvbmNhdCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woQ1JZUFRPLCAgICAgICAgICAgY3J5cHRvKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChEQVRBLCAgICAgICAgICAgICBkYXRhKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChGRlJUTVBDUllQVCwgICAgICBmZnJ0bXBjcnlwdCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woRkZSVE1QSFRUUCwgICAgICAgZmZydG1waHR0cCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woRklMRSwgICAgICAgICAgICAgZmlsZSk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woRlRQLCAgICAgICAgICAgICAgZnRwKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChHT1BIRVIsICAgICAgICAgICBnb3BoZXIpOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKEhMUywgICAgICAgICAgICAgIGhscyk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woSFRUUCwgICAgICAgICAgICAgaHR0cCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woSFRUUFBST1hZLCAgICAgICAgaHR0cHByb3h5KTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChIVFRQUywgICAgICAgICAgICBodHRwcyk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woSUNFQ0FTVCwgICAgICAgICAgaWNlY2FzdCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woTU1TSCwgICAgICAgICAgICAgbW1zaCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woTU1TVCwgICAgICAgICAgICAgbW1zdCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woTUQ1LCAgICAgICAgICAgICAgbWQ1KTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChQSVBFLCAgICAgICAgICAgICBwaXBlKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChSVE1QLCAgICAgICAgICAgICBydG1wKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChSVE1QRSwgICAgICAgICAgICBydG1wZSk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woUlRNUFMsICAgICAgICAgICAgcnRtcHMpOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKFJUTVBULCAgICAgICAgICAgIHJ0bXB0KTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChSVE1QVEUsICAgICAgICAgICBydG1wdGUpOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKFJUTVBUUywgICAgICAgICAgIHJ0bXB0cyk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woUlRQLCAgICAgICAgICAgICAgcnRwKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChTQ1RQLCAgICAgICAgICAgICBzY3RwKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChTUlRQLCAgICAgICAgICAgICBzcnRwKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChTVUJGSUxFLCAgICAgICAgICBzdWJmaWxlKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChUQ1AsICAgICAgICAgICAgICB0Y3ApOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKFRMU19TQ0hBTk5FTCwgICAgIHRsc19zY2hhbm5lbCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woVExTX1NFQ1VSRVRSQU5TUE9SVCwgdGxzX3NlY3VyZXRyYW5zcG9ydCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woVExTX0dOVVRMUywgICAgICAgdGxzX2dudXRscyk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woVExTX09QRU5TU0wsICAgICAgdGxzX29wZW5zc2wpOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKFVEUCwgICAgICAgICAgICAgIHVkcCk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woVURQTElURSwgICAgICAgICAgdWRwbGl0ZSk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woVU5JWCwgICAgICAgICAgICAgdW5peCk7Ci0KLSAgICAvKiBleHRlcm5hbCBsaWJyYXJpZXMgKi8KLSAgICBSRUdJU1RFUl9NVVhFUiAgIChDSFJPTUFQUklOVCwgICAgICBjaHJvbWFwcmludCk7Ci0gICAgUkVHSVNURVJfREVNVVhFUiAoTElCR01FLCAgICAgICAgICAgbGliZ21lKTsKLSAgICBSRUdJU1RFUl9ERU1VWEVSIChMSUJNT0RQTFVHLCAgICAgICBsaWJtb2RwbHVnKTsKLSAgICBSRUdJU1RFUl9NVVhERU1VWChMSUJOVVQsICAgICAgICAgICBsaWJudXQpOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKExJQlJUTVAsICAgICAgICAgIGxpYnJ0bXApOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKExJQlJUTVBFLCAgICAgICAgIGxpYnJ0bXBlKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChMSUJSVE1QUywgICAgICAgICBsaWJydG1wcyk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woTElCUlRNUFQsICAgICAgICAgbGlicnRtcHQpOwotICAgIFJFR0lTVEVSX1BST1RPQ09MKExJQlJUTVBURSwgICAgICAgIGxpYnJ0bXB0ZSk7Ci0gICAgUkVHSVNURVJfUFJPVE9DT0woTElCU1NILCAgICAgICAgICAgbGlic3NoKTsKLSAgICBSRUdJU1RFUl9QUk9UT0NPTChMSUJTTUJDTElFTlQsICAgICBsaWJzbWJjbGllbnQpOwordm9pZCBhdnByaXZfcmVnaXN0ZXJfZGV2aWNlcyhjb25zdCBBVk91dHB1dEZvcm1hdCAqIGNvbnN0IG9bXSwgY29uc3QgQVZJbnB1dEZvcm1hdCAqIGNvbnN0IGlbXSkKK3sKKyAgICBmZl9tdXRleF9sb2NrKCZhdnByaXZfcmVnaXN0ZXJfZGV2aWNlc19tdXRleCk7CisgICAgb3V0ZGV2X2xpc3QgPSBvOworICAgIGluZGV2X2xpc3QgPSBpOworICAgIGZmX211dGV4X3VubG9jaygmYXZwcml2X3JlZ2lzdGVyX2RldmljZXNfbXV0ZXgpOworI2lmIEZGX0FQSV9ORVhUCisgICAgYXZfZm9ybWF0X2luaXRfbmV4dCgpOworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hbXIuYyBiL2xpYmF2Zm9ybWF0L2Ftci5jCmluZGV4IDEzN2RmMTEuLmY5NTQ4MDMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2Ftci5jCisrKyBiL2xpYmF2Zm9ybWF0L2Ftci5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIGFtciBmaWxlIGZvcm1hdAotICogQ29weXJpZ2h0IChjKSAyMDAxIGZmbXBlZyBwcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDEgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMzgsMTcgKzM4LDI0IEBACiBzdGF0aWMgY29uc3QgY2hhciBBTVJfaGVhZGVyW10gICA9ICIjIUFNUlxuIjsKIHN0YXRpYyBjb25zdCBjaGFyIEFNUldCX2hlYWRlcltdID0gIiMhQU1SLVdCXG4iOwogCitzdGF0aWMgY29uc3QgdWludDhfdCBhbXJuYl9wYWNrZWRfc2l6ZVsxNl0gPSB7CisgICAgMTMsIDE0LCAxNiwgMTgsIDIwLCAyMSwgMjcsIDMyLCA2LCAxLCAxLCAxLCAxLCAxLCAxLCAxCit9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYW1yd2JfcGFja2VkX3NpemVbMTZdID0geworICAgIDE4LCAyNCwgMzMsIDM3LCA0MSwgNDcsIDUxLCA1OSwgNjEsIDYsIDEsIDEsIDEsIDEsIDEsIDEKK307CisKICNpZiBDT05GSUdfQU1SX01VWEVSCiBzdGF0aWMgaW50IGFtcl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIEFWSU9Db250ZXh0ICAgICpwYiAgPSBzLT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogCiAgICAgcy0+cHJpdl9kYXRhID0gTlVMTDsKIAotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgewogICAgICAgICBhdmlvX3dyaXRlKHBiLCBBTVJfaGVhZGVyLCAgIHNpemVvZihBTVJfaGVhZGVyKSAgIC0gMSk7IC8qIG1hZ2ljIG51bWJlciAqLwotICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVJfV0IpIHsKKyAgICB9IGVsc2UgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX1dCKSB7CiAgICAgICAgIGF2aW9fd3JpdGUocGIsIEFNUldCX2hlYWRlciwgc2l6ZW9mKEFNUldCX2hlYWRlcikgLSAxKTsgLyogbWFnaWMgbnVtYmVyICovCiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtOTQsNDkgKzEwMSw0MSBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IE1LVEFHKCdzJywgJ2EnLCAndycsICdiJyk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BTVJfV0I7Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSAxNjAwMDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICA9IE1LVEFHKCdzJywgJ2EnLCAndycsICdiJyk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BTVJfV0I7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSAxNjAwMDsKICAgICB9IGVsc2UgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgID0gTUtUQUcoJ3MnLCAnYScsICdtJywgJ3InKTsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FNUl9OQjsKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgPSBNS1RBRygncycsICdhJywgJ20nLCAncicpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQU1SX05COworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gODAwMDsKICAgICB9Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgID0gMTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgPSAxOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYW1yX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogICAgIGludCByZWFkLCBzaXplID0gMCwgdG9jLCBtb2RlOwogICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKICAgICBBTVJDb250ZXh0ICphbXIgPSBzLT5wcml2X2RhdGE7CiAKICAgICBpZiAoYXZpb19mZW9mKHMtPnBiKSkgewotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAgICAgfQogCi0gICAgLy8gRklYTUUgdGhpcyBpcyB3cm9uZywgdGhpcyBzaG91bGQgcmF0aGVyIGJlIGluIGEgQVZQYXJzZXIKKyAgICAvLyBGSVhNRSB0aGlzIGlzIHdyb25nLCB0aGlzIHNob3VsZCByYXRoZXIgYmUgaW4gYW4gQVZQYXJzZXIKICAgICB0b2MgID0gYXZpb19yOChzLT5wYik7CiAgICAgbW9kZSA9ICh0b2MgPj4gMykgJiAweDBGOwogCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHBhY2tlZF9zaXplWzE2XSA9IHsKLSAgICAgICAgICAgIDEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMSwgNSwgMCwgMCwgMCwgMCwgMCwgMCwgMAotICAgICAgICB9OwotCi0gICAgICAgIHNpemUgPSBwYWNrZWRfc2l6ZVttb2RlXSArIDE7Ci0gICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9XQikgewotICAgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBwYWNrZWRfc2l6ZVsxNl0gPSB7Ci0gICAgICAgICAgICAxOCwgMjQsIDMzLCAzNywgNDEsIDQ3LCA1MSwgNTksIDYxLCA2LCA2LCAwLCAwLCAwLCAxLCAxCi0gICAgICAgIH07Ci0KLSAgICAgICAgc2l6ZSA9IHBhY2tlZF9zaXplW21vZGVdOworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgeworICAgICAgICBzaXplID0gYW1ybmJfcGFja2VkX3NpemVbbW9kZV07CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9XQikgeworICAgICAgICBzaXplID0gYW1yd2JfcGFja2VkX3NpemVbbW9kZV07CiAgICAgfQogCiAgICAgaWYgKCFzaXplIHx8IGF2X25ld19wYWNrZXQocGt0LCBzaXplKSkKQEAgLTE0NSwxNyArMTQ0LDE5IEBACiAgICAgaWYgKGFtci0+Y3VtdWxhdGVkX3NpemUgPCBVSU5UNjRfTUFYIC0gc2l6ZSkgewogICAgICAgICBhbXItPmN1bXVsYXRlZF9zaXplICs9IHNpemU7CiAgICAgICAgIC8qIEJvdGggQU1SIGZvcm1hdHMgaGF2ZSA1MCBmcmFtZXMgcGVyIHNlY29uZCAqLwotICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Yml0X3JhdGUgPSBhbXItPmN1bXVsYXRlZF9zaXplIC8gKythbXItPmJsb2NrX2NvdW50ICogOCAqIDUwOworICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBhbXItPmN1bXVsYXRlZF9zaXplIC8gKythbXItPmJsb2NrX2NvdW50ICogOCAqIDUwOwogICAgIH0KIAogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKICAgICBwa3QtPnBvcyAgICAgICAgICA9IHBvczsKICAgICBwa3QtPmRhdGFbMF0gICAgICA9IHRvYzsKLSAgICBwa3QtPmR1cmF0aW9uICAgICA9IGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CID8gMTYwIDogMzIwOworICAgIHBrdC0+ZHVyYXRpb24gICAgID0gcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVJfTkIgPyAxNjAgOiAzMjA7CiAgICAgcmVhZCAgICAgICAgICAgICAgPSBhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSArIDEsIHNpemUgLSAxKTsKIAogICAgIGlmIChyZWFkICE9IHNpemUgLSAxKSB7CiAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICBpZiAocmVhZCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmVhZDsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKICAgICB9CiAKQEAgLTE3NCw2ICsxNzUsMTIwIEBACiB9OwogI2VuZGlmCiAKKyNpZiBDT05GSUdfQU1STkJfREVNVVhFUgorc3RhdGljIGludCBhbXJuYl9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgbW9kZSwgaSA9IDAsIHZhbGlkID0gMCwgaW52YWxpZCA9IDA7CisgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKworICAgIHdoaWxlIChpIDwgcC0+YnVmX3NpemUpIHsKKyAgICAgICAgbW9kZSA9IGJbaV0gPj4gMyAmIDB4MEY7CisgICAgICAgIGlmIChtb2RlIDwgOSAmJiAoYltpXSAmIDB4NCkgPT0gMHg0KSB7CisgICAgICAgICAgICBpbnQgbGFzdCA9IG1vZGU7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IGFtcm5iX3BhY2tlZF9zaXplW21vZGVdOworICAgICAgICAgICAgd2hpbGUgKHNpemUtLSkgeworICAgICAgICAgICAgICAgIGlmIChiWysraV0gIT0gbGFzdCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgbGFzdCA9IGJbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICB2YWxpZCsrOworICAgICAgICAgICAgICAgIGkgKz0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZhbGlkID0gMDsKKyAgICAgICAgICAgIGludmFsaWQrKzsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodmFsaWQgPiAxMDAgJiYgdmFsaWQgPiBpbnZhbGlkKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyICsgMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhbXJuYl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9BTVJfTkI7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICA9IDgwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDgwMDApOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfYW1ybmJfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYW1ybmIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgQU1SLU5CIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFNUkNvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGFtcm5iX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGFtcm5iX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGFtcl9yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0FNUldCX0RFTVVYRVIKK3N0YXRpYyBpbnQgYW1yd2JfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IG1vZGUsIGkgPSAwLCB2YWxpZCA9IDAsIGludmFsaWQgPSAwOworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisKKyAgICB3aGlsZSAoaSA8IHAtPmJ1Zl9zaXplKSB7CisgICAgICAgIG1vZGUgPSBiW2ldID4+IDMgJiAweDBGOworICAgICAgICBpZiAobW9kZSA8IDEwICYmIChiW2ldICYgMHg0KSA9PSAweDQpIHsKKyAgICAgICAgICAgIGludCBsYXN0ID0gbW9kZTsKKyAgICAgICAgICAgIGludCBzaXplID0gYW1yd2JfcGFja2VkX3NpemVbbW9kZV07CisgICAgICAgICAgICB3aGlsZSAoc2l6ZS0tKSB7CisgICAgICAgICAgICAgICAgaWYgKGJbKytpXSAhPSBsYXN0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBsYXN0ID0gYltpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgICAgIHZhbGlkKys7CisgICAgICAgICAgICAgICAgaSArPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFsaWQgPSAwOworICAgICAgICAgICAgaW52YWxpZCsrOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh2YWxpZCA+IDEwMCAmJiB2YWxpZCA+IGludmFsaWQpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDIgLSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtcndiX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICA9IEFWX0NPREVDX0lEX0FNUl9XQjsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgID0gMTYwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDE2MDAwKTsKKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2FtcndiX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFtcndiIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IEFNUi1XQiIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBTVJDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBhbXJ3Yl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBhbXJ3Yl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBhbXJfcmVhZF9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CisjZW5kaWYKKwogI2lmIENPTkZJR19BTVJfTVVYRVIKIEFWT3V0cHV0Rm9ybWF0IGZmX2Ftcl9tdXhlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgPSAiYW1yIiwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FubS5jIGIvbGliYXZmb3JtYXQvYW5tLmMKaW5kZXggMjMyMDA0Ny4uYjMxNzU3YSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYW5tLmMKKysrIGIvbGliYXZmb3JtYXQvYW5tLmMKQEAgLTEwMCwxMSArMTAwLDExIEBACiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FOTTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOyAvKiBubyBmb3VyY2MgKi8KLSAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmlvX3JsMTYocGIpOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FOTTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSAwOyAvKiBubyBmb3VyY2MgKi8KKyAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IGF2aW9fcmwxNihwYik7CiAgICAgaWYgKGF2aW9fcjgocGIpICE9IDApCiAgICAgICAgIGdvdG8gaW52YWxpZDsKICAgICBhdmlvX3NraXAocGIsIDEpOyAvKiBmcmFtZSByYXRlIG11bHRpcGxpZXIgaW5mbyAqLwpAQCAtMTMyLDEyICsxMzIsMTIgQEAKICAgICBhdmlvX3NraXAocGIsIDU4KTsKIAogICAgIC8qIGNvbG9yIGN5Y2xpbmcgYW5kIHBhbGV0dGUgZGF0YSAqLwotICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAxNio4ICsgNCoyNTY7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgICAgICA9IGF2X21hbGxvY3ooc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpIHsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gMTYqOCArIDQqMjU2OworICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2N6KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKSB7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQotICAgIHJldCA9IGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgIHJldCA9IGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hcGMuYyBiL2xpYmF2Zm9ybWF0L2FwYy5jCmluZGV4IDIxYmI1MTQuLmIxODBhNTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FwYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2FwYy5jCkBAIC00NiwyOCArNDYsMjggQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQVBDOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0FQQzsKIAogICAgIGF2aW9fcmwzMihwYik7IC8qIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihwYik7CiAKICAgICAvKiBpbml0aWFsIHByZWRpY3RvciB2YWx1ZXMgZm9yIGFkcGNtIGRlY29kZXIgKi8KLSAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIHBiLCAyICogNCkgPCAwKQorICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsIHN0LT5jb2RlY3BhciwgcGIsIDIgKiA0KSA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBpZiAoYXZpb19ybDMyKHBiKSkgewotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKICAgICB9IGVsc2UgewotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwogICAgIH0KIAotICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gNDsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDQ7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IChpbnQ2NF90KXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjcGFyLT5jaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDE7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FwZS5jIGIvbGliYXZmb3JtYXQvYXBlLmMKaW5kZXggM2U4MTk3Mi4uYzA2ZGI3OCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXBlLmMKKysrIGIvbGliYXZmb3JtYXQvYXBlLmMKQEAgLTU3LDcgKzU3LDYgQEAKICAgICBBUEVGcmFtZSAqZnJhbWVzOwogCiAgICAgLyogSW5mbyBmcm9tIERlc2NyaXB0b3IgQmxvY2sgKi8KLSAgICBjaGFyIG1hZ2ljWzRdOwogICAgIGludDE2X3QgZmlsZXZlcnNpb247CiAgICAgaW50MTZfdCBwYWRkaW5nMTsKICAgICB1aW50MzJfdCBkZXNjcmlwdG9ybGVuZ3RoOwpAQCAtMTAyLDcgKzEwMSw2IEBACiAgICAgaW50IGk7CiAKICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiRGVzY3JpcHRvciBCbG9jazpcblxuIik7Ci0gICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIm1hZ2ljICAgICAgICAgICAgICAgID0gXCIlYyVjJWMlY1wiXG4iLCBhcGVfY3R4LT5tYWdpY1swXSwgYXBlX2N0eC0+bWFnaWNbMV0sIGFwZV9jdHgtPm1hZ2ljWzJdLCBhcGVfY3R4LT5tYWdpY1szXSk7CiAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImZpbGV2ZXJzaW9uICAgICAgICAgID0gJSJQUklkMTYiXG4iLCBhcGVfY3R4LT5maWxldmVyc2lvbik7CiAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImRlc2NyaXB0b3JsZW5ndGggICAgID0gJSJQUkl1MzIiXG4iLCBhcGVfY3R4LT5kZXNjcmlwdG9ybGVuZ3RoKTsKICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiaGVhZGVybGVuZ3RoICAgICAgICAgPSAlIlBSSXUzMiJcbiIsIGFwZV9jdHgtPmhlYWRlcmxlbmd0aCk7CkBAIC0zNDgsMjMgKzM0NiwyMyBAQAogCiAgICAgdG90YWxfYmxvY2tzID0gKGFwZS0+dG90YWxmcmFtZXMgPT0gMCkgPyAwIDogKChhcGUtPnRvdGFsZnJhbWVzIC0gMSkgKiBhcGUtPmJsb2Nrc3BlcmZyYW1lKSArIGFwZS0+ZmluYWxmcmFtZWJsb2NrczsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgID0gQVZfQ09ERUNfSURfQVBFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgID0gTUtUQUcoJ0EnLCAnUCcsICdFJywgJyAnKTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICA9IGFwZS0+Y2hhbm5lbHM7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgPSBhcGUtPnNhbXBsZXJhdGU7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhcGUtPmJwczsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgICA9IEFWX0NPREVDX0lEX0FQRTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgICAgICA9IE1LVEFHKCdBJywgJ1AnLCAnRScsICcgJyk7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICAgPSBhcGUtPmNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgID0gYXBlLT5zYW1wbGVyYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXBlLT5icHM7CiAKICAgICBzdC0+bmJfZnJhbWVzID0gYXBlLT50b3RhbGZyYW1lczsKICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CiAgICAgc3QtPmR1cmF0aW9uICA9IHRvdGFsX2Jsb2NrczsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgYXBlLT5zYW1wbGVyYXRlKTsKIAotICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBBUEVfRVhUUkFEQVRBX1NJWkUpKQorICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBBUEVfRVhUUkFEQVRBX1NJWkUpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIEFWX1dMMTYoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAwLCBhcGUtPmZpbGV2ZXJzaW9uKTsKLSAgICBBVl9XTDE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMiwgYXBlLT5jb21wcmVzc2lvbnR5cGUpOwotICAgIEFWX1dMMTYoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA0LCBhcGUtPmZvcm1hdGZsYWdzKTsKKyAgICBBVl9XTDE2KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMCwgYXBlLT5maWxldmVyc2lvbik7CisgICAgQVZfV0wxNihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDIsIGFwZS0+Y29tcHJlc3Npb250eXBlKTsKKyAgICBBVl9XTDE2KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgNCwgYXBlLT5mb3JtYXRmbGFncyk7CiAKICAgICBwdHMgPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBhcGUtPnRvdGFsZnJhbWVzOyBpKyspIHsKQEAgLTM3NCw3ICszNzIsNyBAQAogICAgIH0KIAogICAgIC8qIHRyeSB0byByZWFkIEFQRSB0YWdzICovCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBmZl9hcGVfcGFyc2VfdGFnKHMpOwogICAgICAgICBhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hcGV0YWcuYyBiL2xpYmF2Zm9ybWF0L2FwZXRhZy5jCmluZGV4IDJlZTI3N2YuLmNkYzYwMmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FwZXRhZy5jCisrKyBiL2xpYmF2Zm9ybWF0L2FwZXRhZy5jCkBAIC0zMCw3ICszMCw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBBUEVfVEFHX0ZMQUdfQ09OVEFJTlNfSEVBREVSICAoMSA8PCAzMSkKLSNkZWZpbmUgQVBFX1RBR19GTEFHX0NPTlRBSU5TX0ZPT1RFUiAgKDEgPDwgMzApCisjZGVmaW5lIEFQRV9UQUdfRkxBR19MQUNLU19GT09URVIgICAgICgxIDw8IDMwKQogI2RlZmluZSBBUEVfVEFHX0ZMQUdfSVNfSEVBREVSICAgICAgICAoMSA8PCAyOSkKICNkZWZpbmUgQVBFX1RBR19GTEFHX0lTX0JJTkFSWSAgICAgICAgKDEgPDwgMSkKIApAQCAtODksMTYgKzg5LDE2IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiAgICAgIHw9IEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGlkOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gaWQ7CiAKICAgICAgICAgICAgIHN0LT5hdHRhY2hlZF9waWMgICAgICAgICAgICAgID0gcGt0OwogICAgICAgICAgICAgc3QtPmF0dGFjaGVkX3BpYy5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CiAgICAgICAgICAgICBzdC0+YXR0YWNoZWRfcGljLmZsYWdzICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcy0+cGIsIHNpemUpIDwgMCkKKyAgICAgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsIHN0LT5jb2RlY3Bhciwgcy0+cGIsIHNpemUpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHZhbHVlID0gYXZfbWFsbG9jKHNpemUrMSk7CkBAIC0xNTAsNyArMTUwLDYgQEAKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGFnIHNpemUgJSJQUkl1MzIiLlxuIiwgdGFnX2J5dGVzKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIHRhZ19zdGFydCA9IGZpbGVfc2l6ZSAtIHRhZ19ieXRlcyAtIEFQRV9UQUdfRk9PVEVSX0JZVEVTOwogCiAgICAgZmllbGRzID0gYXZpb19ybDMyKHBiKTsgICAgLyogbnVtYmVyIG9mIGZpZWxkcyAqLwogICAgIGlmIChmaWVsZHMgPiA2NTUzNikgewpAQCAtMTY2LDYgKzE2NSwxMSBAQAogCiAgICAgYXZpb19zZWVrKHBiLCBmaWxlX3NpemUgLSB0YWdfYnl0ZXMsIFNFRUtfU0VUKTsKIAorICAgIGlmICh2YWwgJiBBUEVfVEFHX0ZMQUdfQ09OVEFJTlNfSEVBREVSKQorICAgICAgICB0YWdfYnl0ZXMgKz0gQVBFX1RBR19IRUFERVJfQllURVM7CisKKyAgICB0YWdfc3RhcnQgPSBmaWxlX3NpemUgLSB0YWdfYnl0ZXM7CisKICAgICBmb3IgKGk9MDsgaTxmaWVsZHM7IGkrKykKICAgICAgICAgaWYgKGFwZV90YWdfcmVhZF9maWVsZChzKSA8IDApIGJyZWFrOwogCkBAIC0xODgsMTEgKzE5Miw3IEBACiAgICAgaWYgKChyZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmZHluX2JjKSkgPCAwKQogICAgICAgICBnb3RvIGVuZDsKIAotICAgIC8vIGZsYWdzCi0gICAgYXZpb193bDMyKGR5bl9iYywgQVBFX1RBR19GTEFHX0NPTlRBSU5TX0hFQURFUiB8IEFQRV9UQUdfRkxBR19DT05UQUlOU19GT09URVIgfAotICAgICAgICAgICAgICAgICAgICAgQVBFX1RBR19GTEFHX0lTX0hFQURFUik7Ci0gICAgZmZpb19maWxsKGR5bl9iYywgMCwgOCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCi0KKyAgICBmZl9zdGFuZGFyZGl6ZV9jcmVhdGlvbl90aW1lKHMpOwogICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiIiwgZSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKICAgICAgICAgaW50IHZhbF9sZW47CiAKQEAgLTIxNCw3ICsyMTQsNyBAQAogICAgIHNpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHluX2JjLCAmZHluX2J1Zik7CiAgICAgaWYgKHNpemUgPD0gMCkKICAgICAgICAgZ290byBlbmQ7Ci0gICAgc2l6ZSArPSAyMDsKKyAgICBzaXplICs9IEFQRV9UQUdfRk9PVEVSX0JZVEVTOwogCiAgICAgLy8gaGVhZGVyCiAgICAgYXZpb193cml0ZShzLT5wYiwgIkFQRVRBR0VYIiwgOCk7ICAgLy8gaWQKQEAgLTIyMiw3ICsyMjIsMTEgQEAKICAgICBhdmlvX3dsMzIocy0+cGIsIHNpemUpOwogICAgIGF2aW9fd2wzMihzLT5wYiwgY291bnQpOwogCi0gICAgYXZpb193cml0ZShzLT5wYiwgZHluX2J1Ziwgc2l6ZSAtIDIwKTsKKyAgICAvLyBmbGFncworICAgIGF2aW9fd2wzMihzLT5wYiwgQVBFX1RBR19GTEFHX0NPTlRBSU5TX0hFQURFUiB8IEFQRV9UQUdfRkxBR19JU19IRUFERVIpOworICAgIGZmaW9fZmlsbChzLT5wYiwgMCwgOCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCisKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBkeW5fYnVmLCBzaXplIC0gQVBFX1RBR19GT09URVJfQllURVMpOwogCiAgICAgLy8gZm9vdGVyCiAgICAgYXZpb193cml0ZShzLT5wYiwgIkFQRVRBR0VYIiwgOCk7ICAgLy8gaWQKQEAgLTIzMSw3ICsyMzUsNyBAQAogICAgIGF2aW9fd2wzMihzLT5wYiwgY291bnQpOyAgICAgICAgICAgIC8vIHRhZyBjb3VudAogCiAgICAgLy8gZmxhZ3MKLSAgICBhdmlvX3dsMzIocy0+cGIsIEFQRV9UQUdfRkxBR19DT05UQUlOU19IRUFERVIgfCBBUEVfVEFHX0ZMQUdfQ09OVEFJTlNfRk9PVEVSKTsKKyAgICBhdmlvX3dsMzIocy0+cGIsIEFQRV9UQUdfRkxBR19DT05UQUlOU19IRUFERVIpOwogICAgIGZmaW9fZmlsbChzLT5wYiwgMCwgOCk7ICAgICAgICAgICAgIC8vIHJlc2VydmVkCiAKIGVuZDoKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FwZXRhZy5oIGIvbGliYXZmb3JtYXQvYXBldGFnLmgKaW5kZXggY2YyYTVmOC4uNDljZDEwZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXBldGFnLmgKKysrIGIvbGliYXZmb3JtYXQvYXBldGFnLmgKQEAgLTI4LDYgKzI4LDcgQEAKICNkZWZpbmUgQVBFX1RBR19QUkVBTUJMRSAgICAgICAgIkFQRVRBR0VYIgogI2RlZmluZSBBUEVfVEFHX1ZFUlNJT04gICAgICAgICAyMDAwCiAjZGVmaW5lIEFQRV9UQUdfRk9PVEVSX0JZVEVTICAgIDMyCisjZGVmaW5lIEFQRV9UQUdfSEVBREVSX0JZVEVTICAgIDMyCiAKIC8qKgogICogUmVhZCBhbmQgcGFyc2UgYW4gQVBFIHRhZwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXBuZ2RlYy5jIGIvbGliYXZmb3JtYXQvYXBuZ2RlYy5jCmluZGV4IGM2NDAzYTEuLmZmZmYwMzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FwbmdkZWMuYworKysgYi9saWJhdmZvcm1hdC9hcG5nZGVjLmMKQEAgLTEyMiw5ICsxMjIsOSBAQAogICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKIH0KIAotc3RhdGljIGludCBhcHBlbmRfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIGludCBsZW4pCitzdGF0aWMgaW50IGFwcGVuZF9leHRyYWRhdGEoQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgQVZJT0NvbnRleHQgKnBiLCBpbnQgbGVuKQogewotICAgIGludCBwcmV2aW91c19zaXplID0gcy0+ZXh0cmFkYXRhX3NpemU7CisgICAgaW50IHByZXZpb3VzX3NpemUgPSBwYXItPmV4dHJhZGF0YV9zaXplOwogICAgIGludCBuZXdfc2l6ZSwgcmV0OwogICAgIHVpbnQ4X3QgKm5ld19leHRyYWRhdGE7CiAKQEAgLTEzMiwxMyArMTMyLDEzIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgbmV3X3NpemUgPSBwcmV2aW91c19zaXplICsgbGVuOwotICAgIG5ld19leHRyYWRhdGEgPSBhdl9yZWFsbG9jKHMtPmV4dHJhZGF0YSwgbmV3X3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBuZXdfZXh0cmFkYXRhID0gYXZfcmVhbGxvYyhwYXItPmV4dHJhZGF0YSwgbmV3X3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKICAgICBpZiAoIW5ld19leHRyYWRhdGEpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgcy0+ZXh0cmFkYXRhID0gbmV3X2V4dHJhZGF0YTsKLSAgICBzLT5leHRyYWRhdGFfc2l6ZSA9IG5ld19zaXplOworICAgIHBhci0+ZXh0cmFkYXRhID0gbmV3X2V4dHJhZGF0YTsKKyAgICBwYXItPmV4dHJhZGF0YV9zaXplID0gbmV3X3NpemU7CiAKLSAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChwYiwgcy0+ZXh0cmFkYXRhICsgcHJldmlvdXNfc2l6ZSwgbGVuKSkgPCAwKQorICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHBiLCBwYXItPmV4dHJhZGF0YSArIHByZXZpb3VzX3NpemUsIGxlbikpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIHJldHVybiBwcmV2aW91c19zaXplOwpAQCAtMTcwLDIzICsxNzAsMjMgQEAKICAgICAvKiBzZXQgdGhlIHRpbWViYXNlIHRvIHNvbWV0aGluZyBsYXJnZSBlbm91Z2ggKDEvMTAwLDAwMCBvZiBzZWNvbmQpCiAgICAgICogdG8gaG9wZWZ1bGx5IGNvcGUgd2l0aCBhbGwgc2FuZSBmcmFtZSBkdXJhdGlvbnMgKi8KICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMDAwKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQVBORzsKLSAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmlvX3JiMzIocGIpOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmIzMihwYik7Ci0gICAgaWYgKChyZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHN0LT5jb2RlYy0+d2lkdGgsIHN0LT5jb2RlYy0+aGVpZ2h0LCAwLCBzKSkgPCAwKQorICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BUE5HOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IGF2aW9fcmIzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoKHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUoc3QtPmNvZGVjcGFyLT53aWR0aCwgc3QtPmNvZGVjcGFyLT5oZWlnaHQsIDAsIHMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAvKiBleHRyYWRhdGEgd2lsbCBjb250YWluIGV2ZXJ5IGNodW5rIHVwIHRvIHRoZSBmaXJzdCBmY1RMIChleGNsdWRlZCkgKi8KLSAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSA9IGF2X21hbGxvYyhsZW4gKyAxMiArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpCisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgPSBhdl9tYWxsb2MobGVuICsgMTIgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBsZW4gKyAxMjsKLSAgICBBVl9XQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCAgICBsZW4pOwotICAgIEFWX1dMMzIoc3QtPmNvZGVjLT5leHRyYWRhdGErNCwgIHRhZyk7Ci0gICAgQVZfV0IzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSs4LCAgc3QtPmNvZGVjLT53aWR0aCk7Ci0gICAgQVZfV0IzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSsxMiwgc3QtPmNvZGVjLT5oZWlnaHQpOwotICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSsxNiwgOSkpIDwgMCkKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gbGVuICsgMTI7CisgICAgQVZfV0IzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgICAgbGVuKTsKKyAgICBBVl9XTDMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKzQsICB0YWcpOworICAgIEFWX1dCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGErOCwgIHN0LT5jb2RlY3Bhci0+d2lkdGgpOworICAgIEFWX1dCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGErMTIsIHN0LT5jb2RlY3Bhci0+aGVpZ2h0KTsKKyAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGErMTYsIDkpKSA8IDApCiAgICAgICAgIGdvdG8gZmFpbDsKIAogICAgIHdoaWxlICghYXZpb19mZW9mKHBiKSkgewpAQCAtMjE4LDExICsyMTgsMTEgQEAKICAgICAgICAgc3dpdGNoICh0YWcpIHsKICAgICAgICAgY2FzZSBNS1RBRygnYScsICdjJywgJ1QnLCAnTCcpOgogICAgICAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUikpIDwgMCB8fAotICAgICAgICAgICAgICAgIChyZXQgPSBhcHBlbmRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGxlbiArIDEyKSkgPCAwKQorICAgICAgICAgICAgICAgIChyZXQgPSBhcHBlbmRfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgcGIsIGxlbiArIDEyKSkgPCAwKQogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIGFjVExfZm91bmQgPSAxOwotICAgICAgICAgICAgY3R4LT5udW1fZnJhbWVzID0gQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSArIHJldCArIDgpOwotICAgICAgICAgICAgY3R4LT5udW1fcGxheSAgID0gQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSArIHJldCArIDEyKTsKKyAgICAgICAgICAgIGN0eC0+bnVtX2ZyYW1lcyA9IEFWX1JCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyByZXQgKyA4KTsKKyAgICAgICAgICAgIGN0eC0+bnVtX3BsYXkgICA9IEFWX1JCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyByZXQgKyAxMik7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAibnVtX2ZyYW1lczogJSJQUkl1MzIiLCBudW1fcGxheTogJSJQUkl1MzIiXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5udW1fZnJhbWVzLCBjdHgtPm51bV9wbGF5KTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjM2LDE1ICsyMzYsMTUgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIC04LCBTRUVLX0NVUikpIDwgMCB8fAotICAgICAgICAgICAgICAgIChyZXQgPSBhcHBlbmRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGxlbiArIDEyKSkgPCAwKQorICAgICAgICAgICAgICAgIChyZXQgPSBhcHBlbmRfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgcGIsIGxlbiArIDEyKSkgPCAwKQogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogICAgIH0KIAogZmFpbDoKLSAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgewotICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gMDsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTI2OSw3ICsyNjksNyBAQAogICAgIC8qIGRlZmF1bHQgaXMgaHVuZHJlZHRocyBvZiBzZWNvbmRzICovCiAgICAgaWYgKCFkZWxheV9kZW4pCiAgICAgICAgIGRlbGF5X2RlbiA9IDEwMDsKLSAgICBpZiAoIWRlbGF5X251bSB8fCBkZWxheV9kZW4gLyBkZWxheV9udW0gPiBjdHgtPm1heF9mcHMpIHsKKyAgICBpZiAoIWRlbGF5X251bSB8fCAoY3R4LT5tYXhfZnBzICYmIGRlbGF5X2RlbiAvIGRlbGF5X251bSA+IGN0eC0+bWF4X2ZwcykpIHsKICAgICAgICAgZGVsYXlfbnVtID0gMTsKICAgICAgICAgZGVsYXlfZGVuID0gY3R4LT5kZWZhdWx0X2ZwczsKICAgICB9CkBAIC0yOTgsMTUgKzI5OCwxNSBAQAogICAgICAgICAgICAgZGlzcG9zZV9vcCwKICAgICAgICAgICAgIGJsZW5kX29wKTsKIAotICAgIGlmICh3aWR0aCAhPSBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+d2lkdGggfHwKLSAgICAgICAgaGVpZ2h0ICE9IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5oZWlnaHQgfHwKKyAgICBpZiAod2lkdGggIT0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPndpZHRoIHx8CisgICAgICAgIGhlaWdodCAhPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+aGVpZ2h0IHx8CiAgICAgICAgIHhfb2Zmc2V0ICE9IDAgfHwKICAgICAgICAgeV9vZmZzZXQgIT0gMCkgewogICAgICAgICBpZiAoc2VxdWVuY2VfbnVtYmVyID09IDAgfHwKLSAgICAgICAgICAgIHhfb2Zmc2V0ID49IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT53aWR0aCB8fAotICAgICAgICAgICAgd2lkdGggPiBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+d2lkdGggLSB4X29mZnNldCB8fAotICAgICAgICAgICAgeV9vZmZzZXQgPj0gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmhlaWdodCB8fAotICAgICAgICAgICAgaGVpZ2h0ID4gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmhlaWdodCAtIHlfb2Zmc2V0KQorICAgICAgICAgICAgeF9vZmZzZXQgPj0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPndpZHRoIHx8CisgICAgICAgICAgICB3aWR0aCA+IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT53aWR0aCAtIHhfb2Zmc2V0IHx8CisgICAgICAgICAgICB5X29mZnNldCA+PSBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+aGVpZ2h0IHx8CisgICAgICAgICAgICBoZWlnaHQgPiBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+aGVpZ2h0IC0geV9vZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgY3R4LT5pc19rZXlfZnJhbWUgPSAwOwogICAgIH0gZWxzZSB7CkBAIC00MDAsMTcgKzQwMCwxMyBAQAogICAgICAgICAgICAgYXZpb19zZWVrKHBiLCAtOCwgU0VFS19DVVIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogICAgICAgICB9Ci0gICAgICAgIGlmICgocmV0ID0gYXZpb19zZWVrKHBiLCBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKyA4LCBTRUVLX1NFVCkpIDwgMCkKKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSArIDgsIFNFRUtfU0VUKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICBjaGFyIHRhZ19idWZbMzJdOwotCi0gICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKHRhZ19idWYsIHNpemVvZih0YWdfYnVmKSwgdGFnKTsKLSAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJJbi1zdHJlYW0gdGFnPSVzICgweCUwOFgpIGxlbj0lIlBSSXUzMiwgdGFnX2J1ZiwgdGFnLCBsZW4pOworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIkluLXN0cmVhbSB0YWc9JXMgKDB4JTA4IlBSSVgzMiIpIGxlbj0lIlBSSXUzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZvdXJjYzJzdHIodGFnKSwgdGFnLCBsZW4pOwogICAgICAgICBhdmlvX3NraXAocGIsIGxlbiArIDQpOwotICAgICAgICB9CiAgICAgfQogCiAgICAgLyogSGFuZGxlIHRoZSB1bnN1cHBvcnRlZCB5ZXQgY2FzZXMgKi8KQEAgLTQyMSw3ICs0MTcsNyBAQAogICAgIHsgImlnbm9yZV9sb29wIiwgImlnbm9yZSBsb29wIHNldHRpbmciICAgICAgICAgICAgICAgICAgICAgICAgICwgb2Zmc2V0b2YoQVBOR0RlbXV4Q29udGV4dCwgaWdub3JlX2xvb3ApLAogICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9ICAgICAgICAgICAgICAsIDAsIDEgICAgICAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCiAgICAgeyAibWF4X2ZwcyIgICAgLCAibWF4aW11bSBmcmFtZXJhdGUgKDAgaXMgbm8gbGltaXQpIiAgICAgICAgICAgLCBvZmZzZXRvZihBUE5HRGVtdXhDb250ZXh0LCBtYXhfZnBzKSwKLSAgICAgIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gREVGQVVMVF9BUE5HX0ZQUyB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCiAgICAgeyAiZGVmYXVsdF9mcHMiLCAiZGVmYXVsdCBmcmFtZXJhdGUgKDAgaXMgYXMgZmFzdCBhcyBwb3NzaWJsZSkiLCBvZmZzZXRvZihBUE5HRGVtdXhDb250ZXh0LCBkZWZhdWx0X2ZwcyksCiAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IERFRkFVTFRfQVBOR19GUFMgfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKICAgICB7IE5VTEwgfSwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FwbmdlbmMuYyBiL2xpYmF2Zm9ybWF0L2FwbmdlbmMuYwppbmRleCA0MzI2YTdjLi43N2MxYzkxIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hcG5nZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvYXBuZ2VuYy5jCkBAIC00NCw2ICs0NCw5IEBACiAgICAgQVZSYXRpb25hbCBwcmV2X2RlbGF5OwogCiAgICAgaW50IGZyYW1lcmF0ZV93YXJuZWQ7CisKKyAgICB1aW50OF90ICpleHRyYV9kYXRhOworICAgIGludCBleHRyYV9kYXRhX3NpemU7CiB9IEFQTkdNdXhDb250ZXh0OwogCiBzdGF0aWMgdWludDhfdCAqYXBuZ19maW5kX2NodW5rKHVpbnQzMl90IHRhZywgdWludDhfdCAqYnVmLCBzaXplX3QgbGVuZ3RoKQpAQCAtNzgsMTAgKzgxLDExIEBACiBzdGF0aWMgaW50IGFwbmdfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqZm9ybWF0X2NvbnRleHQpCiB7CiAgICAgQVBOR011eENvbnRleHQgKmFwbmcgPSBmb3JtYXRfY29udGV4dC0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBmb3JtYXRfY29udGV4dC0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAKICAgICBpZiAoZm9ybWF0X2NvbnRleHQtPm5iX3N0cmVhbXMgIT0gMSB8fAotICAgICAgICBmb3JtYXRfY29udGV4dC0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8Ci0gICAgICAgIGZvcm1hdF9jb250ZXh0LT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQgICAhPSBBVl9DT0RFQ19JRF9BUE5HKSB7CisgICAgICAgIGZvcm1hdF9jb250ZXh0LT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgZm9ybWF0X2NvbnRleHQtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY19pZCAgICE9IEFWX0NPREVDX0lEX0FQTkcpIHsKICAgICAgICAgYXZfbG9nKGZvcm1hdF9jb250ZXh0LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiQVBORyBtdXhlciBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIHZpZGVvIEFQTkcgc3RyZWFtLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC05OCwxOCArMTAyLDM4IEBACiAgICAgYXZpb193YjY0KGZvcm1hdF9jb250ZXh0LT5wYiwgUE5HU0lHKTsKICAgICAvLyBSZW1haW5pbmcgaGVhZGVycyBhcmUgd3JpdHRlbiB3aGVuIHRoZXkgYXJlIGNvcGllZCBmcm9tIHRoZSBlbmNvZGVyCiAKKyAgICBpZiAocGFyLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICBhcG5nLT5leHRyYV9kYXRhID0gYXZfbWFsbG9jeihwYXItPmV4dHJhZGF0YV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgIGlmICghYXBuZy0+ZXh0cmFfZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGFwbmctPmV4dHJhX2RhdGFfc2l6ZSA9IHBhci0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIG1lbWNweShhcG5nLT5leHRyYV9kYXRhLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgfQorCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGZsdXNoX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmZvcm1hdF9jb250ZXh0LCBBVlBhY2tldCAqcGFja2V0KQorc3RhdGljIGludCBmbHVzaF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpmb3JtYXRfY29udGV4dCwgQVZQYWNrZXQgKnBhY2tldCkKIHsKICAgICBBUE5HTXV4Q29udGV4dCAqYXBuZyA9IGZvcm1hdF9jb250ZXh0LT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKmlvX2NvbnRleHQgPSBmb3JtYXRfY29udGV4dC0+cGI7CiAgICAgQVZTdHJlYW0gKmNvZGVjX3N0cmVhbSA9IGZvcm1hdF9jb250ZXh0LT5zdHJlYW1zWzBdOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlY19jb250ZXh0ID0gY29kZWNfc3RyZWFtLT5jb2RlYzsKKyAgICB1aW50OF90ICpzaWRlX2RhdGEgPSBOVUxMOworICAgIGludCBzaWRlX2RhdGFfc2l6ZSA9IDA7CiAKICAgICBhdl9hc3NlcnQwKGFwbmctPnByZXZfcGFja2V0KTsKIAorICAgIHNpZGVfZGF0YSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKGFwbmctPnByZXZfcGFja2V0LCBBVl9QS1RfREFUQV9ORVdfRVhUUkFEQVRBLCAmc2lkZV9kYXRhX3NpemUpOworCisgICAgaWYgKHNpZGVfZGF0YV9zaXplKSB7CisgICAgICAgIGF2X2ZyZWVwKCZhcG5nLT5leHRyYV9kYXRhKTsKKyAgICAgICAgYXBuZy0+ZXh0cmFfZGF0YSA9IGF2X21hbGxvY3ooc2lkZV9kYXRhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgaWYgKCFhcG5nLT5leHRyYV9kYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgYXBuZy0+ZXh0cmFfZGF0YV9zaXplID0gc2lkZV9kYXRhX3NpemU7CisgICAgICAgIG1lbWNweShhcG5nLT5leHRyYV9kYXRhLCBzaWRlX2RhdGEsIGFwbmctPmV4dHJhX2RhdGFfc2l6ZSk7CisgICAgfQorCiAgICAgaWYgKGFwbmctPmZyYW1lX251bWJlciA9PSAwICYmICFwYWNrZXQpIHsKICAgICAgICAgdWludDhfdCAqZXhpc3RpbmdfYWNUTF9jaHVuazsKICAgICAgICAgdWludDhfdCAqZXhpc3RpbmdfZmNUTF9jaHVuazsKQEAgLTExNywxMyArMTQxLDEzIEBACiAgICAgICAgIGF2X2xvZyhmb3JtYXRfY29udGV4dCwgQVZfTE9HX0lORk8sICJPbmx5IGEgc2luZ2xlIGZyYW1lIHNvIHNhdmluZyBhcyBhIG5vcm1hbCBQTkcuXG4iKTsKIAogICAgICAgICAvLyBXcml0ZSBub3JtYWwgUE5HIGhlYWRlcnMgd2l0aG91dCBhY1RMIGNodW5rCi0gICAgICAgIGV4aXN0aW5nX2FjVExfY2h1bmsgPSBhcG5nX2ZpbmRfY2h1bmsoTUtCRVRBRygnYScsICdjJywgJ1QnLCAnTCcpLCBjb2RlY19jb250ZXh0LT5leHRyYWRhdGEsIGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgZXhpc3RpbmdfYWNUTF9jaHVuayA9IGFwbmdfZmluZF9jaHVuayhNS0JFVEFHKCdhJywgJ2MnLCAnVCcsICdMJyksIGFwbmctPmV4dHJhX2RhdGEsIGFwbmctPmV4dHJhX2RhdGFfc2l6ZSk7CiAgICAgICAgIGlmIChleGlzdGluZ19hY1RMX2NodW5rKSB7CiAgICAgICAgICAgICB1aW50OF90ICpjaHVua19hZnRlcl9hY1RMID0gZXhpc3RpbmdfYWNUTF9jaHVuayArIEFWX1JCMzIoZXhpc3RpbmdfYWNUTF9jaHVuaykgKyAxMjsKLSAgICAgICAgICAgIGF2aW9fd3JpdGUoaW9fY29udGV4dCwgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhLCBleGlzdGluZ19hY1RMX2NodW5rIC0gY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhKTsKLSAgICAgICAgICAgIGF2aW9fd3JpdGUoaW9fY29udGV4dCwgY2h1bmtfYWZ0ZXJfYWNUTCwgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhICsgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhX3NpemUgLSBjaHVua19hZnRlcl9hY1RMKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUoaW9fY29udGV4dCwgYXBuZy0+ZXh0cmFfZGF0YSwgZXhpc3RpbmdfYWNUTF9jaHVuayAtIGFwbmctPmV4dHJhX2RhdGEpOworICAgICAgICAgICAgYXZpb193cml0ZShpb19jb250ZXh0LCBjaHVua19hZnRlcl9hY1RMLCBhcG5nLT5leHRyYV9kYXRhICsgYXBuZy0+ZXh0cmFfZGF0YV9zaXplIC0gY2h1bmtfYWZ0ZXJfYWNUTCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdmlvX3dyaXRlKGlvX2NvbnRleHQsIGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YSwgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgYXZpb193cml0ZShpb19jb250ZXh0LCBhcG5nLT5leHRyYV9kYXRhLCBhcG5nLT5leHRyYV9kYXRhX3NpemUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gV3JpdGUgZnJhbWUgZGF0YSB3aXRob3V0IGZjVEwgY2h1bmsKQEAgLTE0Miw5ICsxNjYsOSBAQAogICAgICAgICAgICAgdWludDhfdCAqZXhpc3RpbmdfYWNUTF9jaHVuazsKIAogICAgICAgICAgICAgLy8gV3JpdGUgbm9ybWFsIFBORyBoZWFkZXJzCi0gICAgICAgICAgICBhdmlvX3dyaXRlKGlvX2NvbnRleHQsIGNvZGVjX2NvbnRleHQtPmV4dHJhZGF0YSwgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgYXZpb193cml0ZShpb19jb250ZXh0LCBhcG5nLT5leHRyYV9kYXRhLCBhcG5nLT5leHRyYV9kYXRhX3NpemUpOwogCi0gICAgICAgICAgICBleGlzdGluZ19hY1RMX2NodW5rID0gYXBuZ19maW5kX2NodW5rKE1LQkVUQUcoJ2EnLCAnYycsICdUJywgJ0wnKSwgY29kZWNfY29udGV4dC0+ZXh0cmFkYXRhLCBjb2RlY19jb250ZXh0LT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBleGlzdGluZ19hY1RMX2NodW5rID0gYXBuZ19maW5kX2NodW5rKE1LQkVUQUcoJ2EnLCAnYycsICdUJywgJ0wnKSwgYXBuZy0+ZXh0cmFfZGF0YSwgYXBuZy0+ZXh0cmFfZGF0YV9zaXplKTsKICAgICAgICAgICAgIGlmICghZXhpc3RpbmdfYWNUTF9jaHVuaykgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgYnVmWzhdOwogICAgICAgICAgICAgICAgIC8vIFdyaXRlIGFuaW1hdGlvbiBjb250cm9sIGhlYWRlcgpAQCAtMTk0LDIxICsyMTgsMjUgQEAKIAogICAgIGF2X3BhY2tldF91bnJlZihhcG5nLT5wcmV2X3BhY2tldCk7CiAgICAgaWYgKHBhY2tldCkKLSAgICAgICAgYXZfY29weV9wYWNrZXQoYXBuZy0+cHJldl9wYWNrZXQsIHBhY2tldCk7CisgICAgICAgIGF2X3BhY2tldF9yZWYoYXBuZy0+cHJldl9wYWNrZXQsIHBhY2tldCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYXBuZ193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpmb3JtYXRfY29udGV4dCwgQVZQYWNrZXQgKnBhY2tldCkKIHsKICAgICBBUE5HTXV4Q29udGV4dCAqYXBuZyA9IGZvcm1hdF9jb250ZXh0LT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKIAogICAgIGlmICghYXBuZy0+cHJldl9wYWNrZXQpIHsKLSAgICAgICAgYXBuZy0+cHJldl9wYWNrZXQgPSBhdl9tYWxsb2Moc2l6ZW9mKCphcG5nLT5wcmV2X3BhY2tldCkpOworICAgICAgICBhcG5nLT5wcmV2X3BhY2tldCA9IGF2X3BhY2tldF9hbGxvYygpOwogICAgICAgICBpZiAoIWFwbmctPnByZXZfcGFja2V0KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICAgICBhdl9jb3B5X3BhY2tldChhcG5nLT5wcmV2X3BhY2tldCwgcGFja2V0KTsKKyAgICAgICAgYXZfcGFja2V0X3JlZihhcG5nLT5wcmV2X3BhY2tldCwgcGFja2V0KTsKICAgICB9IGVsc2UgewotICAgICAgICBmbHVzaF9wYWNrZXQoZm9ybWF0X2NvbnRleHQsIHBhY2tldCk7CisgICAgICAgIHJldCA9IGZsdXNoX3BhY2tldChmb3JtYXRfY29udGV4dCwgcGFja2V0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMjE5LDE1ICsyNDcsMTggQEAKICAgICBBUE5HTXV4Q29udGV4dCAqYXBuZyA9IGZvcm1hdF9jb250ZXh0LT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKmlvX2NvbnRleHQgPSBmb3JtYXRfY29udGV4dC0+cGI7CiAgICAgdWludDhfdCBidWZbOF07CisgICAgaW50IHJldDsKIAogICAgIGlmIChhcG5nLT5wcmV2X3BhY2tldCkgewotICAgICAgICBmbHVzaF9wYWNrZXQoZm9ybWF0X2NvbnRleHQsIE5VTEwpOworICAgICAgICByZXQgPSBmbHVzaF9wYWNrZXQoZm9ybWF0X2NvbnRleHQsIE5VTEwpOwogICAgICAgICBhdl9mcmVlcCgmYXBuZy0+cHJldl9wYWNrZXQpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgYXBuZ193cml0ZV9jaHVuayhpb19jb250ZXh0LCBNS0JFVEFHKCdJJywgJ0UnLCAnTicsICdEJyksIE5VTEwsIDApOwogCi0gICAgaWYgKGFwbmctPmFjVExfb2Zmc2V0ICYmIGlvX2NvbnRleHQtPnNlZWthYmxlKSB7CisgICAgaWYgKGFwbmctPmFjVExfb2Zmc2V0ICYmIChpb19jb250ZXh0LT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkgewogICAgICAgICBhdmlvX3NlZWsoaW9fY29udGV4dCwgYXBuZy0+YWNUTF9vZmZzZXQsIFNFRUtfU0VUKTsKIAogICAgICAgICBBVl9XQjMyKGJ1ZiwgYXBuZy0+ZnJhbWVfbnVtYmVyKTsKQEAgLTIzNSw2ICsyNjYsOSBAQAogICAgICAgICBhcG5nX3dyaXRlX2NodW5rKGlvX2NvbnRleHQsIE1LQkVUQUcoJ2EnLCAnYycsICdUJywgJ0wnKSwgYnVmLCA4KTsKICAgICB9CiAKKyAgICBhdl9mcmVlcCgmYXBuZy0+ZXh0cmFfZGF0YSk7CisgICAgYXBuZy0+ZXh0cmFfZGF0YSA9IDA7CisKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXB0eGRlYy5jIGIvbGliYXZmb3JtYXQvYXB0eGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjJjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9hcHR4ZGVjLmMKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBSQVcgYXB0WCBkZW11eGVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE3ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorCisjZGVmaW5lIEFQVFhfQkxPQ0tfU0laRSAgIDQKKyNkZWZpbmUgQVBUWF9QQUNLRVRfU0laRSAgKDI1NipBUFRYX0JMT0NLX1NJWkUpCisKKyNkZWZpbmUgQVBUWF9IRF9CTE9DS19TSVpFICAgNgorI2RlZmluZSBBUFRYX0hEX1BBQ0tFVF9TSVpFICAoMjU2KkFQVFhfSERfQkxPQ0tfU0laRSkKKwordHlwZWRlZiBzdHJ1Y3QgQXB0WERlbXV4ZXJDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgc2FtcGxlX3JhdGU7Cit9IEFwdFhEZW11eGVyQ29udGV4dDsKKworc3RhdGljIEFWU3RyZWFtICphcHR4X3JlYWRfaGVhZGVyX2NvbW1vbihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQXB0WERlbXV4ZXJDb250ZXh0ICpzMSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1NBTVBMRV9GTVRfUzMyUDsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMjsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gczEtPnNhbXBsZV9yYXRlOworICAgIHN0LT5zdGFydF90aW1lID0gMDsKKyAgICByZXR1cm4gc3Q7Cit9CisKK3N0YXRpYyBpbnQgYXB0eF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gYXB0eF9yZWFkX2hlYWRlcl9jb21tb24ocyk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQVBUWDsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDQ7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IEFQVFhfQkxPQ0tfU0laRTsKKyAgICBzdC0+Y29kZWNwYXItPmZyYW1lX3NpemUgPSBBUFRYX1BBQ0tFVF9TSVpFOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwdHhfaGRfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdCA9IGFwdHhfcmVhZF9oZWFkZXJfY29tbW9uKHMpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FQVFhfSEQ7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA2OworICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBBUFRYX0hEX0JMT0NLX1NJWkU7CisgICAgc3QtPmNvZGVjcGFyLT5mcmFtZV9zaXplID0gQVBUWF9IRF9QQUNLRVRfU0laRTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhcHR4X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBBUFRYX1BBQ0tFVF9TSVpFKTsKK30KKworc3RhdGljIGludCBhcHR4X2hkX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBBUFRYX0hEX1BBQ0tFVF9TSVpFKTsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGFwdHhfb3B0aW9uc1tdID0geworICAgIHsgInNhbXBsZV9yYXRlIiwgIiIsIG9mZnNldG9mKEFwdFhEZW11eGVyQ29udGV4dCwgc2FtcGxlX3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNDgwMDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgTlVMTCB9LAorfTsKKworI2lmIENPTkZJR19BUFRYX0RFTVVYRVIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGFwdHhfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJhcHR4IGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBhcHR4X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2FwdHhfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiYXB0eCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBhcHRYIiksCisgICAgLmV4dGVuc2lvbnMgICAgID0gImFwdHgiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBcHRYRGVtdXhlckNvbnRleHQpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGFwdHhfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYXB0eF9yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhcHR4X2RlbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfQVBUWF9IRF9ERU1VWEVSCitzdGF0aWMgY29uc3QgQVZDbGFzcyBhcHR4X2hkX2RlbXV4ZXJfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiYXB0eCBoZCBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gYXB0eF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZJbnB1dEZvcm1hdCBmZl9hcHR4X2hkX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImFwdHhfaGQiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgYXB0WCBIRCIpLAorICAgIC5leHRlbnNpb25zICAgICA9ICJhcHR4aGQiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihBcHRYRGVtdXhlckNvbnRleHQpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGFwdHhfaGRfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gYXB0eF9oZF9yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZhcHR4X2hkX2RlbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hcXRpdGxlZGVjLmMgYi9saWJhdmZvcm1hdC9hcXRpdGxlZGVjLmMKaW5kZXggN2M4NjRjOC4uZjBlODQwYiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXF0aXRsZWRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2FxdGl0bGVkZWMuYwpAQCAtNTgsOCArNTgsOCBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIGFxdC0+ZnJhbWVfcmF0ZS5kZW4sIGFxdC0+ZnJhbWVfcmF0ZS5udW0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9URVhUOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9URVhUOwogCiAgICAgd2hpbGUgKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CiAgICAgICAgIGNoYXIgbGluZVs0MDk2XTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FzZi5jIGIvbGliYXZmb3JtYXQvYXNmLmMKaW5kZXggNDU1Y2E0ZC4uNzE5Y2FlOSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXNmLmMKKysrIGIvbGliYXZmb3JtYXQvYXNmLmMKQEAgLTE0Nyw2ICsxNDcsMTQgQEAKICAgICAweGNiLCAweGE1LCAweGU2LCAweDE0LCAweDcyLCAweGM2LCAweDMyLCAweDQzLCAweDgzLCAweDk5LCAweGE5LCAweDY5LCAweDUyLCAweDA2LCAweDViLCAweDVhCiB9OwogCitjb25zdCBmZl9hc2ZfZ3VpZCBmZl9hc2ZfZ3JvdXBfbXV0dWFsX2V4Y2x1c2lvbl9vYmplY3QgPSB7CisgICAgMHg0MCwgMHg1YSwgMHg0NiwgMHhkMSwgMHg3OSwgMHg1YSwgMHgzOCwgMHg0MywgMHhiNywgMHgxYiwgMHhlMywgMHg2YiwgMHg4ZiwgMHhkNiwgMHhjMiwgMHg0OQorfTsKKworY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX211dGV4X2xhbmd1YWdlID0geworICAgIDB4MDAsIDB4MmEsIDB4ZTIsIDB4ZDYsIDB4ZGEsIDB4MzUsIDB4ZDEsIDB4MTEsIDB4OTAsIDB4MzQsIDB4MDAsIDB4YTAsIDB4YzksIDB4MDMsIDB4NDksIDB4YmUKK307CisKIC8qIExpc3Qgb2Ygb2ZmaWNpYWwgdGFncyBhdCBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZGQ3NDMwNjYoVlMuODUpLmFzcHggKi8KIGNvbnN0IEFWTWV0YWRhdGFDb252IGZmX2FzZl9tZXRhZGF0YV9jb252W10gPSB7CiAgICAgeyAiV00vQWxidW1BcnRpc3QiLCAgICAgICAgICAiYWxidW1fYXJ0aXN0IiAgICAgfSwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FzZi5oIGIvbGliYXZmb3JtYXQvYXNmLmgKaW5kZXggOTE0ZGRlZi4uMWE1YjMzOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXNmLmgKKysrIGIvbGliYXZmb3JtYXQvYXNmLmgKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbnZhbGlkIGlmIGJyb2FkY2FzdGluZyAoY291bGQgYmUgaWdub3JlZCkgKi8KICAgICB1aW50MzJfdCBwcmVyb2xsOyAgICAgICAgICAgLyoqPCB0aW1lc3RhbXAgb2YgdGhlIGZpcnN0IHBhY2tldCwgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgaWYgbm9uemVybyAtIHN1YnRyYWN0IGZyb20gdGltZSAqLwotICAgIHVpbnQzMl90IGlnbm9yZTsgICAgICAgICAgICAvLy88IHByZXJvbGwgaXMgNjRiaXQgLSBidXQgbGV0J3MganVzdCBpZ25vcmUgaXQKKyAgICB1aW50MzJfdCBpZ25vcmU7ICAgICAgICAgICAgLy8vPCBwcmVyb2xsIGlzIDY0IGJpdHMgLSBidXQgbGV0J3MganVzdCBpZ25vcmUgaXQKICAgICB1aW50MzJfdCBmbGFnczsgICAgICAgICAgICAgLyoqPCAweDAxIC0gYnJvYWRjYXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgMHgwMiAtIHNlZWthYmxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgcmVzdCBpcyByZXNlcnZlZCBzaG91bGQgYmUgMCAqLwpAQCAtMTAwLDYgKzEwMCw4IEBACiBleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2V4dF9jb250ZW50X2VuY3J5cHRpb247CiBleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2RpZ2l0YWxfc2lnbmF0dXJlOwogZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9leHRlbmRlZF9zdHJlYW1fcHJvcGVydGllc19vYmplY3Q7CitleHRlcm4gY29uc3QgZmZfYXNmX2d1aWQgZmZfYXNmX2dyb3VwX211dHVhbF9leGNsdXNpb25fb2JqZWN0OworZXh0ZXJuIGNvbnN0IGZmX2FzZl9ndWlkIGZmX2FzZl9tdXRleF9sYW5ndWFnZTsKIAogZXh0ZXJuIGNvbnN0IEFWTWV0YWRhdGFDb252IGZmX2FzZl9tZXRhZGF0YV9jb252W107CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FzZmRlY19mLmMgYi9saWJhdmZvcm1hdC9hc2ZkZWNfZi5jCmluZGV4IDNlZTBmY2QuLjY0YTBiOWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FzZmRlY19mLmMKKysrIGIvbGliYXZmb3JtYXQvYXNmZGVjX2YuYwpAQCAtMjgxLDggKzI4MSw4IEBACiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAgICAgc3QtPmRpc3Bvc2l0aW9uICAgICAgICAgICAgICB8PSBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUM7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgPSBpZDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgICA9IGlkOwogICAgIHN0LT5hdHRhY2hlZF9waWMgICAgICAgICAgICAgID0gcGt0OwogICAgIHN0LT5hdHRhY2hlZF9waWMuc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwogICAgIHN0LT5hdHRhY2hlZF9waWMuZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOwpAQCAtMzA3LDggKzMwNywxMCBAQAogICAgIElEM3YyRXh0cmFNZXRhICppZDN2Ml9leHRyYV9tZXRhID0gTlVMTDsKIAogICAgIGZmX2lkM3YyX3JlYWQocywgSUQzdjJfREVGQVVMVF9NQUdJQywgJmlkM3YyX2V4dHJhX21ldGEsIGxlbik7Ci0gICAgaWYgKGlkM3YyX2V4dHJhX21ldGEpCisgICAgaWYgKGlkM3YyX2V4dHJhX21ldGEpIHsKICAgICAgICAgZmZfaWQzdjJfcGFyc2VfYXBpYyhzLCAmaWQzdjJfZXh0cmFfbWV0YSk7CisgICAgICAgIGZmX2lkM3YyX3BhcnNlX2NoYXB0ZXJzKHMsICZpZDN2Ml9leHRyYV9tZXRhKTsKKyAgICB9CiAgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZpZDN2Ml9leHRyYV9tZXRhKTsKIH0KIApAQCAtNDM2LDcgKzQzOCw3IEBACiAgICAgICAgIHR5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CiAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9qZmlmX21lZGlhKSkgewogICAgICAgICB0eXBlICAgICAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTUpQRUc7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NSlBFRzsKICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX2NvbW1hbmRfc3RyZWFtKSkgewogICAgICAgICB0eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CiAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9leHRfc3RyZWFtX2VtYmVkX3N0cmVhbV9oZWFkZXIpKSB7CkBAIC00NzAsMTggKzQ3MiwxOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gdHlwZTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSB0eXBlOwogICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICBpbnQgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlYywgdHlwZV9zcGVjaWZpY19zaXplLCAwKTsKKyAgICAgICAgaW50IHJldCA9IGZmX2dldF93YXZfaGVhZGVyKHMsIHBiLCBzdC0+Y29kZWNwYXIsIHR5cGVfc3BlY2lmaWNfc2l6ZSwgMCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgaWYgKGlzX2R2cl9tc19hdWRpbykgewogICAgICAgICAgICAgLy8gY29kZWNfaWQgYW5kIGNvZGVjX3RhZyBhcmUgdW5yZWxpYWJsZSBpbiBkdnJfbXMKICAgICAgICAgICAgIC8vIGZpbGVzLiBTZXQgdGhlbSBsYXRlciBieSBwcm9iaW5nIHN0cmVhbS4KICAgICAgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlICAgID0gMTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsKICAgICAgICAgfQotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykKICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9OT05FOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKQEAgLTUwNyw1MiArNTA5LDUyIEBACiAgICAgICAgIGF2aW9fcjgocGIpOwogICAgICAgICBhdmlvX3JsMTYocGIpOyAgICAgICAgLyogc2l6ZSAqLwogICAgICAgICBzaXplWCAgICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7IC8qIHNpemUgKi8KLSAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JsMzIocGIpOwotICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBhdmlvX3JsMzIocGIpOwogICAgICAgICAvKiBub3QgYXZhaWxhYmxlIGZvciBhc2YgKi8KICAgICAgICAgYXZpb19ybDE2KHBiKTsgLyogcGFuZXMgKi8KLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMTYocGIpOyAvKiBkZXB0aCAqLworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmwxNihwYik7IC8qIGRlcHRoICovCiAgICAgICAgIHRhZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKICAgICAgICAgYXZpb19za2lwKHBiLCAyMCk7CiAgICAgICAgIGlmIChzaXplWCA+IDQwKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gZmZpb19saW1pdChwYiwgc2l6ZVggLSA0MCk7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSAgICAgID0gYXZfbWFsbG9jeihzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSBmZmlvX2xpbWl0KHBiLCBzaXplWCAtIDQwKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2N6KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBhdmlvX3JlYWQocGIsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgfQogCiAgICAgICAgIC8qIEV4dHJhY3QgcGFsZXR0ZSBmcm9tIGV4dHJhZGF0YSBpZiBicHAgPD0gOCAqLwogICAgICAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IGV4dHJhZGF0YSBjb250YWlucyBvbmx5IHBhbGV0dGUgKi8KICAgICAgICAgLyogVGhpcyBpcyB0cnVlIGZvciBhbGwgcGFsZXR0ZWQgY29kZWNzIGltcGxlbWVudGVkIGluIGxpYmF2Y29kZWMgKi8KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgJiYgKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDw9IDgpKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICYmIChzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSA4KSkgewogI2lmIEhBVkVfQklHRU5ESUFOCiAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplLCBBVlBBTEVUVEVfU0laRSkgLyA0OyBpKyspCi0gICAgICAgICAgICAgICAgYXNmX3N0LT5wYWxldHRlW2ldID0gYXZfYnN3YXAzMigoKHVpbnQzMl90ICopc3QtPmNvZGVjLT5leHRyYWRhdGEpW2ldKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplLCBBVlBBTEVUVEVfU0laRSkgLyA0OyBpKyspCisgICAgICAgICAgICAgICAgYXNmX3N0LT5wYWxldHRlW2ldID0gYXZfYnN3YXAzMigoKHVpbnQzMl90ICopc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpW2ldKTsKICNlbHNlCi0gICAgICAgICAgICBtZW1jcHkoYXNmX3N0LT5wYWxldHRlLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwKLSAgICAgICAgICAgICAgICAgICBGRk1JTihzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplLCBBVlBBTEVUVEVfU0laRSkpOworICAgICAgICAgICAgbWVtY3B5KGFzZl9zdC0+cGFsZXR0ZSwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgRkZNSU4oc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSwgQVZQQUxFVFRFX1NJWkUpKTsKICNlbmRpZgogICAgICAgICAgICAgYXNmX3N0LT5wYWxldHRlX2NoYW5nZWQgPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSB0YWcxOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgdGFnMSk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gdGFnMTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIHRhZzEpOwogICAgICAgICBpZiAodGFnMSA9PSBNS1RBRygnRCcsICdWJywgJ1InLCAnICcpKSB7CiAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKICAgICAgICAgICAgIC8qIGlzc3VlNjU4IGNvbnRhaW5zIHdyb25nIHcvaCBhbmQgTVMgZXZlbiBwdXRzIGEgZmFrZSBzZXEgaGVhZGVyCiAgICAgICAgICAgICAgKiB3aXRoIHdyb25nIHcvaCBpbiBleHRyYWRhdGEgd2hpbGUgYSBjb3JyZWN0IG9uZSBpcyBpbiB0aGUgc3RyZWFtLgogICAgICAgICAgICAgICogbWF4aW11bSBsYW1lbmVzcyAqLwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0KLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IDA7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gMDsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gMDsKICAgICAgICAgfQotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQogICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfT05DRTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KQogICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfT05DRTsKICAgICB9CiAgICAgcG9zMiA9IGF2aW9fdGVsbChwYik7CkBAIC03NDksMTMgKzc1MSwxNSBAQAogICAgIGNvdW50ID0gYXZpb19ybDMyKHBiKTsgICAgLy8gbWFya2VycyBjb3VudAogICAgIGF2aW9fcmwxNihwYik7ICAgICAgICAgICAgLy8gcmVzZXJ2ZWQgMiBieXRlcwogICAgIG5hbWVfbGVuID0gYXZpb19ybDE2KHBiKTsgLy8gbmFtZSBsZW5ndGgKLSAgICBmb3IgKGkgPSAwOyBpIDwgbmFtZV9sZW47IGkrKykKLSAgICAgICAgYXZpb19yOChwYik7IC8vIHNraXAgdGhlIG5hbWUKKyAgICBhdmlvX3NraXAocGIsIG5hbWVfbGVuKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgIGludDY0X3QgcHJlc190aW1lOwogICAgICAgICBpbnQgbmFtZV9sZW47CiAKKyAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgICAgICBhdmlvX3JsNjQocGIpOyAgICAgICAgICAgICAvLyBvZmZzZXQsIDggYnl0ZXMKICAgICAgICAgcHJlc190aW1lID0gYXZpb19ybDY0KHBiKTsgLy8gcHJlc2VudGF0aW9uIHRpbWUKICAgICAgICAgcHJlc190aW1lIC09IGFzZi0+aGRyLnByZXJvbGwgKiAxMDAwMDsKQEAgLTgyOCw3ICs4MzIsNyBAQAogICAgICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKCZnLCAmZmZfYXNmX2V4dF9zdHJlYW1faGVhZGVyKSkgewogICAgICAgICAgICAgYXNmX3JlYWRfZXh0X3N0cmVhbV9wcm9wZXJ0aWVzKHMsIGdzaXplKTsKIAotICAgICAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgYSBvcHRpb25hbCBzdHJlYW0gcHJvcGVydGllcyBvYmplY3QgdG8gZm9sbG93CisgICAgICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBhbiBvcHRpb25hbCBzdHJlYW0gcHJvcGVydGllcyBvYmplY3QgdG8gZm9sbG93CiAgICAgICAgICAgICAvLyBpZiBzbyB0aGUgbmV4dCBpdGVyYXRpb24gd2lsbCBwaWNrIGl0IHVwCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcCgmZywgJmZmX2FzZl9oZWFkMV9ndWlkKSkgewpAQCAtODkwLDIxICs4OTQsMjEgQEAKICAgICAgICAgaW50IHN0cmVhbV9udW0gPSBhc2YtPmFzZmlkMmF2aWRbaV07CiAgICAgICAgIGlmIChzdHJlYW1fbnVtID49IDApIHsKICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX251bV07Ci0gICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+Yml0X3JhdGUpCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGFzZi0+c3RyZWFtX2JpdHJhdGVzW2ldOworICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmJpdF9yYXRlKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBhc2YtPnN0cmVhbV9iaXRyYXRlc1tpXTsKICAgICAgICAgICAgIGlmIChhc2YtPmRhcltpXS5udW0gPiAwICYmIGFzZi0+ZGFyW2ldLmRlbiA+IDApIHsKICAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNmLT5kYXJbaV0ubnVtLCBhc2YtPmRhcltpXS5kZW4sIElOVF9NQVgpOwogICAgICAgICAgICAgfSBlbHNlIGlmICgoYXNmLT5kYXJbMF0ubnVtID4gMCkgJiYgKGFzZi0+ZGFyWzBdLmRlbiA+IDApICYmCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBBU0YgY29udGFpbmVyIHZhbHVlIGlmIHRoZSBzdHJlYW0gZG9lc24ndCBzZXQgQVIuCi0gICAgICAgICAgICAgICAgICAgICAgIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSkKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pKQogICAgICAgICAgICAgICAgIGF2X3JlZHVjZSgmc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhc2YtPmRhclswXS5udW0sIGFzZi0+ZGFyWzBdLmRlbiwgSU5UX01BWCk7CiAKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJpPSVkLCBzdC0+Y29kZWMtPmNvZGVjX3R5cGU6JWQsIGFzZi0+ZGFyICVkOiVkIHNhcj0lZDolZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaSwgc3QtPmNvZGVjLT5jb2RlY190eXBlLCBhc2YtPmRhcltpXS5udW0sIGFzZi0+ZGFyW2ldLmRlbiwKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJpPSVkLCBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGU6JWQsIGFzZi0+ZGFyICVkOiVkIHNhcj0lZDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlLCBhc2YtPmRhcltpXS5udW0sIGFzZi0+ZGFyW2ldLmRlbiwKICAgICAgICAgICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOwogCiAgICAgICAgICAgICAvLyBjb3B5IGFuZCBjb252ZXJ0IGxhbmd1YWdlIGNvZGVzIHRvIHRoZSBmcm9udGVuZApAQCAtOTEyLDcgKzkxNiw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmZjMTc2NiA9IGFzZi0+c3RyZWFtX2xhbmd1YWdlc1thc2YtPnN0cmVhbXNbaV0uc3RyZWFtX2xhbmd1YWdlX2luZGV4XTsKICAgICAgICAgICAgICAgICBpZiAocmZjMTc2NiAmJiBzdHJsZW4ocmZjMTc2NikgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgcHJpbWFyeV90YWdbM10gPSB7IHJmYzE3NjZbMF0sIHJmYzE3NjZbMV0sICdcMCcgfTsgLy8gaWdub3JlIGNvdW50cnkgY29kZSBpZiBhbnkKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaXNvNjM5MiAgICAgICA9IGF2X2NvbnZlcnRfbGFuZ190byhwcmltYXJ5X3RhZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqaXNvNjM5MiAgICAgICA9IGZmX2NvbnZlcnRfbGFuZ190byhwcmltYXJ5X3RhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9MQU5HX0lTTzYzOV8yX0JJQkwpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaXNvNjM5MikKICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIGlzbzYzOTIsIDApOwpAQCAtMTAxMCw3ICsxMDE0LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGMgIT0gMHg4MikKLSAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIkludmFsaWQgRUNDIGJ5dGVcbiIpOworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiSW52YWxpZCBFQ0MgYnl0ZSIpOwogCiAgICAgICAgICAgICBpZiAoIWFzZi0+dXNlc19zdGRfZWNjKQogICAgICAgICAgICAgICAgIGFzZi0+dXNlc19zdGRfZWNjID0gIChjID09IDB4ODIgJiYgIWQgJiYgIWUpID8gMSA6IC0xOwpAQCAtMTMxNiw5ICsxMzIwLDkgQEAKICAgICAgICAgICAgIGF2X2xvZyhhc2YsIEFWX0xPR19UUkFDRSwgIm5ldyBwYWNrZXQ6IHN0cmVhbTolZCBrZXk6JWQgcGFja2V0X2tleTolZCBhdWRpbzolZCBzaXplOiVkXG4iLAogICAgICAgICAgICAgICAgICAgICBhc2YtPnN0cmVhbV9pbmRleCwgYXNmLT5wYWNrZXRfa2V5X2ZyYW1lLAogICAgICAgICAgICAgICAgICAgICBhc2Zfc3QtPnBrdC5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSwKLSAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1thc2YtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1thc2YtPnN0cmVhbV9pbmRleF0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAgICAgICAgICAgICAgICAgYXNmX3N0LT5wYWNrZXRfb2JqX3NpemUpOwotICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbYXNmLT5zdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1thc2YtPnN0cmVhbV9pbmRleF0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgICAgICAgICBhc2YtPnBhY2tldF9rZXlfZnJhbWUgPSAxOwogICAgICAgICAgICAgaWYgKGFzZi0+cGFja2V0X2tleV9mcmFtZSkKICAgICAgICAgICAgICAgICBhc2Zfc3QtPnBrdC5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CkBAIC0xMzcxLDcgKzEzNzUsNyBAQAogICAgICAgICAvKiB0ZXN0IGlmIHdob2xlIHBhY2tldCBpcyByZWFkICovCiAgICAgICAgIGlmIChhc2Zfc3QtPmZyYWdfb2Zmc2V0ID09IGFzZl9zdC0+cGt0LnNpemUpIHsKICAgICAgICAgICAgIC8vIHdvcmthcm91bmQgZm9yIG1hY3Jvc2hpdCByYWRpbyBEVlItTVMgZmlsZXMKLSAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2FzZi0+c3RyZWFtX2luZGV4XS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2FzZi0+c3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYKICAgICAgICAgICAgICAgICBhc2Zfc3QtPnBrdC5zaXplID4gMTAwKSB7CiAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFzZl9zdC0+cGt0LnNpemUgJiYgIWFzZl9zdC0+cGt0LmRhdGFbaV07IGkrKykKQEAgLTE0OTIsNyArMTQ5Niw3IEBACiAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgaSsrKSB7CiAgICAgICAgIGludCBqID0gYXNmLT5hc2ZpZDJhdmlkW2ldOwogICAgICAgICBBU0ZTdHJlYW0gKmFzZl9zdCA9ICZhc2YtPnN0cmVhbXNbaV07Ci0gICAgICAgIGlmIChqIDwgMCB8fCBzLT5zdHJlYW1zW2pdLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGlmIChqIDwgMCB8fCBzLT5zdHJlYW1zW2pdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBhc2Zfc3QtPnNraXBfdG9fa2V5ID0gMTsKQEAgLTE2MDgsNiArMTYxMiwxMSBAQAogICAgICAgICAgICAgaW50NjRfdCBwb3MgICAgICAgPSBzLT5pbnRlcm5hbC0+ZGF0YV9vZmZzZXQgKyBzLT5wYWNrZXRfc2l6ZSAqIChpbnQ2NF90KXBrdG51bTsKICAgICAgICAgICAgIGludDY0X3QgaW5kZXhfcHRzID0gRkZNQVgoYXZfcmVzY2FsZShpdGltZSwgaSwgMTAwMDApIC0gYXNmLT5oZHIucHJlcm9sbCwgMCk7CiAKKyAgICAgICAgICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKHBvcyAhPSBsYXN0X3BvcykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJwa3RudW06JWQsIHBrdGN0OiVkICBwdHM6ICUiUFJJZDY0IlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgcGt0bnVtLCBwa3RjdCwgaW5kZXhfcHRzKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FzZmRlY19vLmMgYi9saWJhdmZvcm1hdC9hc2ZkZWNfby5jCmluZGV4IDIzMjBjNjYuLmI0YjI2OTggMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FzZmRlY19vLmMKKysrIGIvbGliYXZmb3JtYXQvYXNmZGVjX28uYwpAQCAtMjAsNyArMjAsNiBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKQEAgLTEyMiw4ICsxMjEsOCBAQAogCiAgICAgaW50IHN0cmVhbV9pbmRleDsgLy8gZnJvbSBwYWNrZXQgaGVhZGVyLCBmb3IgdGhlIHN1YnBheWxvYWQgY2FzZQogCi0gICAgLy8gcGFja2V0IHBhcmFtZXRlcmVzCi0gICAgdWludDY0X3Qgc3ViX2hlYWRlcl9vZmZzZXQ7IC8vIG9mZnNldCBvZiBzdWJwbGF5bG9hZCBoZWFkZXIKKyAgICAvLyBwYWNrZXQgcGFyYW1ldGVycworICAgIHVpbnQ2NF90IHN1Yl9oZWFkZXJfb2Zmc2V0OyAvLyBvZmZzZXQgb2Ygc3VicGF5bG9hZCBoZWFkZXIKICAgICBpbnQ2NF90IHN1Yl9kdHM7CiAgICAgdWludDhfdCBkdHNfZGVsdGE7IC8vIGZvciBzdWJwYXlsb2FkcwogICAgIHVpbnQzMl90IHBhY2tldF9zaXplX2ludGVybmFsOyAvLyBwYWNrZXQgc2l6ZSBzdG9yZWQgaW5zaWRlIEFTRlBhY2tldCwgY2FuIGJlIDAKQEAgLTQzMSw4ICs0MzAsOCBAQAogICAgIH0KIAogICAgIHN0LT5kaXNwb3NpdGlvbiAgICAgICAgICAgICAgfD0gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgICAgID0gYXNmX3N0LT50eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgID0gaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgPSBhc2Zfc3QtPnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICAgPSBpZDsKICAgICBzdC0+YXR0YWNoZWRfcGljICAgICAgICAgICAgICA9IHBrdDsKICAgICBzdC0+YXR0YWNoZWRfcGljLnN0cmVhbV9pbmRleCA9IGFzZl9zdC0+aW5kZXggPSBzdC0+aW5kZXg7CiAgICAgc3QtPmF0dGFjaGVkX3BpYy5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CkBAIC00NjEsOCArNDYwLDEwIEBACiAgICAgSUQzdjJFeHRyYU1ldGEgKmlkM3YyX2V4dHJhX21ldGEgPSBOVUxMOwogCiAgICAgZmZfaWQzdjJfcmVhZChzLCBJRDN2Ml9ERUZBVUxUX01BR0lDLCAmaWQzdjJfZXh0cmFfbWV0YSwgbGVuKTsKLSAgICBpZiAoaWQzdjJfZXh0cmFfbWV0YSkKKyAgICBpZiAoaWQzdjJfZXh0cmFfbWV0YSkgewogICAgICAgICBmZl9pZDN2Ml9wYXJzZV9hcGljKHMsICZpZDN2Ml9leHRyYV9tZXRhKTsKKyAgICAgICAgZmZfaWQzdjJfcGFyc2VfY2hhcHRlcnMocywgJmlkM3YyX2V4dHJhX21ldGEpOworICAgIH0KICAgICBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoJmlkM3YyX2V4dHJhX21ldGEpOwogfQogCkBAIC02OTIsMjkgKzY5MywzMiBAQAogCiBzdGF0aWMgaW50IHBhcnNlX3ZpZGVvX2luZm8oQVZJT0NvbnRleHQgKnBiLCBBVlN0cmVhbSAqc3QpCiB7Ci0gICAgdWludDE2X3Qgc2l6ZTsKKyAgICB1aW50MTZfdCBzaXplX2FzZjsgLy8gQVNGLXNwZWNpZmljIEZvcm1hdCBEYXRhIHNpemUKKyAgICB1aW50MzJfdCBzaXplX2JtcDsgLy8gQk1QX0hFQURFUi1zcGVjaWZpYyBGb3JtYXQgRGF0YSBzaXplCiAgICAgdW5zaWduZWQgaW50IHRhZzsKIAotICAgIHN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSBhdmlvX3JsMzIocGIpOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKICAgICBhdmlvX3NraXAocGIsIDEpOyAvLyBza2lwIHJlc2VydmVkIGZsYWdzCi0gICAgc2l6ZSA9IGF2aW9fcmwxNihwYik7IC8vIHNpemUgb2YgdGhlIEZvcm1hdCBEYXRhCi0gICAgdGFnICA9IGZmX2dldF9ibXBfaGVhZGVyKHBiLCBzdCwgTlVMTCk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSB0YWc7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIHRhZyk7CisgICAgc2l6ZV9hc2YgPSBhdmlvX3JsMTYocGIpOworICAgIHRhZyA9IGZmX2dldF9ibXBfaGVhZGVyKHBiLCBzdCwgJnNpemVfYm1wKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IHRhZzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgdGFnKTsKKyAgICBzaXplX2JtcCA9IEZGTUFYKHNpemVfYXNmLCBzaXplX2JtcCk7CiAKLSAgICBpZiAoc2l6ZSA+IEJNUF9IRUFERVJfU0laRSkgeworICAgIGlmIChzaXplX2JtcCA+IEJNUF9IRUFERVJfU0laRSAmJgorICAgICAgICBzaXplX2JtcCA8IElOVF9NQVggLSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSB7CiAgICAgICAgIGludCByZXQ7Ci0gICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgID0gc2l6ZSAtIEJNUF9IRUFERVJfU0laRTsKLSAgICAgICAgaWYgKCEoc3QtPmNvZGVjLT5leHRyYWRhdGEgPSBhdl9tYWxsb2Moc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSArCisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgID0gc2l6ZV9ibXAgLSBCTVBfSEVBREVSX1NJWkU7CisgICAgICAgIGlmICghKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSkpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDA7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9Ci0gICAgICAgIG1lbXNldChzdC0+Y29kZWMtPmV4dHJhZGF0YSArIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgLCAwLAorICAgICAgICBtZW1zZXQoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICwgMCwKICAgICAgICAgICAgICAgIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgICAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpKSA8IDApCisgICAgICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHBiLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIHJldHVybiAwOwpAQCAtNzczLDcgKzc3Nyw3IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgMTAwMCk7IC8vIHB0cyBzaG91bGQgYmUgZHdvcmQsIGluIG1pbGxpc2Vjb25kcwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IHR5cGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gdHlwZTsKICAgICBhc2YtPmFzZl9zdFthc2YtPm5iX3N0cmVhbXNdID0gYXZfbWFsbG9jeihzaXplb2YoKmFzZl9zdCkpOwogICAgIGlmICghYXNmLT5hc2Zfc3RbYXNmLT5uYl9zdHJlYW1zXSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTc5MCw3ICs3OTQsNyBAQAogICAgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgogICAgICAgICBhc2Zfc3QtPnR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlYywgdHNfZGF0YV9sZW4sIDApKSA8IDApCisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlY3BhciwgdHNfZGF0YV9sZW4sIDApKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKQEAgLTgyOSw3ICs4MzMsNyBAQAogICAgIC8vIGxhbmd1YWdlIGFiYnIgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgMiBjaGFycwogICAgIGlmIChyZmMxNzY2ICYmIHN0cmxlbihyZmMxNzY2KSA+IDEpIHsKICAgICAgICAgY29uc3QgY2hhciBwcmltYXJ5X3RhZ1szXSA9IHsgcmZjMTc2NlswXSwgcmZjMTc2NlsxXSwgJ1wwJyB9OyAvLyBpZ25vcmUgY291bnRyeSBjb2RlIGlmIGFueQotICAgICAgICBjb25zdCBjaGFyICppc282MzkyICAgICAgID0gYXZfY29udmVydF9sYW5nX3RvKHByaW1hcnlfdGFnLAorICAgICAgICBjb25zdCBjaGFyICppc282MzkyICAgICAgID0gZmZfY29udmVydF9sYW5nX3RvKHByaW1hcnlfdGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0xBTkdfSVNPNjM5XzJfQklCTCk7CiAgICAgICAgIGlmIChpc282MzkyKQogICAgICAgICAgICAgaWYgKGF2X2RpY3Rfc2V0KG1ldCwgImxhbmd1YWdlIiwgaXNvNjM5MiwgMCkgPCAwKQpAQCAtODY3LDcgKzg3MSw3IEBACiAgICAgaWYgKHN0KSB7CiAgICAgICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgICA9IHN0YXJ0X3RpbWU7CiAgICAgICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICAgICA9IGVuZF90aW1lIC0gc3RhcnRfdGltZTsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICAgID0gYml0cmF0ZTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgID0gYml0cmF0ZTsKICAgICAgICAgc3QtPmF2Z19mcmFtZV9yYXRlLm51bSAgID0gMTAwMDAwMDA7CiAgICAgICAgIHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4gICA9IHRpbWVfcGVyX2ZyYW1lOwogICAgIH0KQEAgLTk2MSw3ICs5NjUsNyBAQAogICAgICAgICAgICAgICAgc2l6ZSwgYXNmLT5uYl9wYWNrZXRzKTsKICAgICBhdmlvX3NraXAocGIsIDIpOyAvLyBza2lwIHJlc2VydmVkIGZpZWxkCiAgICAgYXNmLT5maXJzdF9wYWNrZXRfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKLSAgICBpZiAocGItPnNlZWthYmxlICYmICEoYXNmLT5iX2ZsYWdzICYgQVNGX0ZMQUdfQlJPQURDQVNUKSkKKyAgICBpZiAoKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJiAhKGFzZi0+Yl9mbGFncyAmIEFTRl9GTEFHX0JST0FEQ0FTVCkpCiAgICAgICAgIGFsaWduX3Bvc2l0aW9uKHBiLCBhc2YtPm9mZnNldCwgYXNmLT5kYXRhX3NpemUpOwogCiAgICAgcmV0dXJuIDA7CkBAIC05NzUsNyArOTc5LDggQEAKICAgICB1aW50NjRfdCBpbnRlcnZhbDsgLy8gaW5kZXggZW50cnkgdGltZSBpbnRlcnZhbCBpbiAxMDAgbnMgdW5pdHMsIHVzdWFsbHkgaXQncyAxcwogICAgIHVpbnQzMl90IHBrdF9udW0sIG5iX2VudHJpZXM7CiAgICAgaW50MzJfdCBwcmV2X3BrdF9udW0gPSAtMTsKLSAgICBpbnQgaSwgcmV0OworICAgIGludCBpOworICAgIGludDY0X3Qgb2Zmc2V0OwogICAgIHVpbnQ2NF90IHNpemUgPSBhdmlvX3JsNjQocGIpOwogCiAgICAgLy8gc2ltcGxlIGluZGV4IG9iamVjdHMgc2hvdWxkIGJlIG9yZGVyZWQgYnkgc3RyZWFtIG51bWJlciwgdGhpcyBsb29wIHRyaWVzIHRvIGZpbmQKQEAgLTk5NywxMCArMTAwMiwxMCBAQAogICAgIG5iX2VudHJpZXMgPSBhdmlvX3JsMzIocGIpOwogICAgIGZvciAoaSA9IDA7IGkgPCBuYl9lbnRyaWVzOyBpKyspIHsKICAgICAgICAgcGt0X251bSA9IGF2aW9fcmwzMihwYik7Ci0gICAgICAgIHJldCA9IGF2aW9fc2tpcChwYiwgMik7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIG9mZnNldCA9IGF2aW9fc2tpcChwYiwgMik7CisgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU2tpcHBpbmcgZmFpbGVkIGluIGFzZl9yZWFkX3NpbXBsZV9pbmRleC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHByZXZfcGt0X251bSAhPSBwa3RfbnVtKSB7CiAgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIGFzZi0+Zmlyc3RfcGFja2V0X29mZnNldCArIGFzZi0+cGFja2V0X3NpemUgKgpAQCAtMTQ4Niw3ICsxNDkxLDcgQEAKICAgICAgICAgICAgIGFzZi0+cmV0dXJuX3N1YnBheWxvYWQgPSAwOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXNmLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgIEFTRlBhY2tldCAqYXNmX3BrdCA9ICZhc2YtPmFzZl9zdFtpXS0+cGt0OwogICAgICAgICAgICAgaWYgKGFzZl9wa3QgJiYgIWFzZl9wa3QtPnNpemVfbGVmdCAmJiBhc2ZfcGt0LT5kYXRhX3NpemUpIHsKICAgICAgICAgICAgICAgICBpZiAoYXNmLT5hc2Zfc3RbaV0tPnNwYW4gPiAxICYmCkBAIC0xNzM5LDcgKzE3NDQsOSBAQAogICAgICAgICAgICAgc2l6ZSA9IGF2aW9fcmw2NChwYik7CiAgICAgICAgICAgICBhbGlnbl9wb3NpdGlvbihwYiwgYXNmLT5vZmZzZXQsIHNpemUpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChhc2YtPmRhdGFfcmVhY2hlZCAmJiAoIXBiLT5zZWVrYWJsZSB8fCAoYXNmLT5iX2ZsYWdzICYgQVNGX0ZMQUdfQlJPQURDQVNUKSkpCisgICAgICAgIGlmIChhc2YtPmRhdGFfcmVhY2hlZCAmJgorICAgICAgICAgICAgKCEocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHx8CisgICAgICAgICAgICAgKGFzZi0+Yl9mbGFncyAmIEFTRl9GTEFHX0JST0FEQ0FTVCkpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0xNzQ4LDcgKzE3NTUsNyBAQAogICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBnb3RvIGZhaWxlZDsKICAgICB9Ci0gICAgaWYgKHBiLT5zZWVrYWJsZSkKKyAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpCiAgICAgICAgIGF2aW9fc2VlayhwYiwgYXNmLT5maXJzdF9wYWNrZXRfb2Zmc2V0LCBTRUVLX1NFVCk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgYXNmLT5uYl9zdHJlYW1zOyBpKyspIHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FzZmVuYy5jIGIvbGliYXZmb3JtYXQvYXNmZW5jLmMKaW5kZXggMTRmOTJlMi4uM2NmZTc1YSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXNmZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvYXNmZW5jLmMKQEAgLTIyNyw3ICsyMjcsNyBAQAogICAgIGNvbnN0IGNoYXIgKmxhbmd1YWdlc1sxMjhdOwogICAgIGludCBuYl9sYW5ndWFnZXM7CiAgICAgaW50NjRfdCBjcmVhdGlvbl90aW1lOwotICAgIC8qIG5vbiBzdHJlYW1lZCBhZGRpdG9ubmFsIGluZm8gKi8KKyAgICAvKiBub24tc3RyZWFtZWQgYWRkaXRpb25hbCBpbmZvICovCiAgICAgdWludDY0X3QgbmJfcGFja2V0czsgICAgICAgICAgICAgICAgIC8vLzwgaG93IG1hbnkgcGFja2V0cyBhcmUgdGhlcmUgaW4gdGhlIGZpbGUsIGludmFsaWQgaWYgYnJvYWRjYXN0aW5nCiAgICAgaW50NjRfdCBkdXJhdGlvbjsgICAgICAgICAgICAgICAgICAgIC8vLzwgaW4gMTAwbnMgdW5pdHMKICAgICAvKiBwYWNrZXQgZmlsbGluZyAqLwpAQCAtMzkyLDEwICszOTIsMTEgQEAKICAgICBpbnQgaGVhZGVyX3NpemUsIG4sIGV4dHJhX3NpemUsIGV4dHJhX3NpemUyLCB3YXZfZXh0cmFfc2l6ZTsKICAgICBpbnQgaGFzX3RpdGxlLCBoYXNfYXNwZWN0X3JhdGlvID0gMDsKICAgICBpbnQgbWV0YWRhdGFfY291bnQ7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmVuYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyOwogICAgIGludDY0X3QgaGVhZGVyX29mZnNldCwgY3VyX3BvcywgaHBvczsKICAgICBpbnQgYml0X3JhdGU7CiAgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBpbnQgYXVkaW9fbGFuZ3VhZ2VfY291bnRzWzEyOF0gPSB7IDAgfTsKIAogICAgIGZmX21ldGFkYXRhX2NvbnYoJnMtPm1ldGFkYXRhLCBmZl9hc2ZfbWV0YWRhdGFfY29udiwgTlVMTCk7CiAKQEAgLTQxOCwxOSArNDE5LDE5IEBACiAgICAgYml0X3JhdGUgPSAwOwogICAgIGZvciAobiA9IDA7IG4gPCBzLT5uYl9zdHJlYW1zOyBuKyspIHsKICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmVudHJ5OwotICAgICAgICBlbmMgPSBzLT5zdHJlYW1zW25dLT5jb2RlYzsKKyAgICAgICAgcGFyID0gcy0+c3RyZWFtc1tuXS0+Y29kZWNwYXI7CiAKICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zW25dLCAzMiwgMSwgMTAwMCk7IC8qIDMyIGJpdCBwdHMgaW4gbXMgKi8KIAotICAgICAgICBiaXRfcmF0ZSArPSBlbmMtPmJpdF9yYXRlOwotICAgICAgICBpZiAoICAgZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTwotICAgICAgICAgICAgJiYgZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDAKLSAgICAgICAgICAgICYmIGVuYy0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPiAwKQorICAgICAgICBiaXRfcmF0ZSArPSBwYXItPmJpdF9yYXRlOworICAgICAgICBpZiAoICAgcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTworICAgICAgICAgICAgJiYgcGFyLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDAKKyAgICAgICAgICAgICYmIHBhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gPiAwKQogICAgICAgICAgICAgaGFzX2FzcGVjdF9yYXRpbysrOwogCiAgICAgICAgIGVudHJ5ID0gYXZfZGljdF9nZXQocy0+c3RyZWFtc1tuXS0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIE5VTEwsIDApOwogICAgICAgICBpZiAoZW50cnkpIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlzbzYzOTFsYW5nID0gYXZfY29udmVydF9sYW5nX3RvKGVudHJ5LT52YWx1ZSwgQVZfTEFOR19JU082MzlfMSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICppc282MzkxbGFuZyA9IGZmX2NvbnZlcnRfbGFuZ190byhlbnRyeS0+dmFsdWUsIEFWX0xBTkdfSVNPNjM5XzEpOwogICAgICAgICAgICAgaWYgKGlzbzYzOTFsYW5nKSB7CiAgICAgICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFzZi0+bmJfbGFuZ3VhZ2VzOyBpKyspIHsKQEAgLTQ0NCw2ICs0NDUsOCBAQAogICAgICAgICAgICAgICAgICAgICBhc2YtPnN0cmVhbXNbbl0uc3RyZWFtX2xhbmd1YWdlX2luZGV4ID0gYXNmLT5uYl9sYW5ndWFnZXM7CiAgICAgICAgICAgICAgICAgICAgIGFzZi0+bmJfbGFuZ3VhZ2VzKys7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgICAgICAgICBhdWRpb19sYW5ndWFnZV9jb3VudHNbYXNmLT5zdHJlYW1zW25dLnN0cmVhbV9sYW5ndWFnZV9pbmRleF0rKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGFzZi0+c3RyZWFtc1tuXS5zdHJlYW1fbGFuZ3VhZ2VfaW5kZXggPSAxMjg7CkBAIC00NzAsNyArNDczLDcgQEAKICAgICBhdmlvX3dsNjQocGIsIGR1cmF0aW9uKTsgLyogZW5kIHRpbWUgc3RhbXAgKGluIDEwMG5zIHVuaXRzKSAqLwogICAgIGF2aW9fd2w2NChwYiwgYXNmLT5kdXJhdGlvbik7IC8qIGR1cmF0aW9uIChpbiAxMDBucyB1bml0cykgKi8KICAgICBhdmlvX3dsNjQocGIsIFBSRVJPTExfVElNRSk7IC8qIHN0YXJ0IHRpbWUgc3RhbXAgKi8KLSAgICBhdmlvX3dsMzIocGIsIChhc2YtPmlzX3N0cmVhbWVkIHx8ICFwYi0+c2Vla2FibGUpID8gMyA6IDIpOyAgLyogPz8/ICovCisgICAgYXZpb193bDMyKHBiLCAoYXNmLT5pc19zdHJlYW1lZCB8fCAhKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkgPyAzIDogMik7ICAvKiA/Pz8gKi8KICAgICBhdmlvX3dsMzIocGIsIHMtPnBhY2tldF9zaXplKTsgLyogcGFja2V0IHNpemUgKi8KICAgICBhdmlvX3dsMzIocGIsIHMtPnBhY2tldF9zaXplKTsgLyogcGFja2V0IHNpemUgKi8KICAgICBhdmlvX3dsMzIocGIsIGJpdF9yYXRlID8gYml0X3JhdGUgOiAtMSk7IC8qIE1heGltdW0gZGF0YSByYXRlIGluIGJwcyAqLwpAQCAtNDg0LDYgKzQ4Nyw3IEBACiAgICAgaWYgKGFzZi0+bmJfbGFuZ3VhZ2VzKSB7CiAgICAgICAgIGludDY0X3QgaHBvczI7CiAgICAgICAgIGludCBpOworICAgICAgICBpbnQgbmJfYXVkaW9fbGFuZ3VhZ2VzID0gMDsKIAogICAgICAgICBocG9zMiA9IHB1dF9oZWFkZXIocGIsICZmZl9hc2ZfbGFuZ3VhZ2VfZ3VpZCk7CiAgICAgICAgIGF2aW9fd2wxNihwYiwgYXNmLT5uYl9sYW5ndWFnZXMpOwpAQCAtNDkzLDYgKzQ5NywyNSBAQAogICAgICAgICB9CiAgICAgICAgIGVuZF9oZWFkZXIocGIsIGhwb3MyKTsKIAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXNmLT5uYl9sYW5ndWFnZXM7IGkrKykKKyAgICAgICAgICAgIGlmIChhdWRpb19sYW5ndWFnZV9jb3VudHNbaV0pCisgICAgICAgICAgICAgICAgbmJfYXVkaW9fbGFuZ3VhZ2VzKys7CisKKyAgICAgICAgaWYgKG5iX2F1ZGlvX2xhbmd1YWdlcyA+IDEpIHsKKyAgICAgICAgICAgIGhwb3MyID0gcHV0X2hlYWRlcihwYiwgJmZmX2FzZl9ncm91cF9tdXR1YWxfZXhjbHVzaW9uX29iamVjdCk7CisgICAgICAgICAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX2FzZl9tdXRleF9sYW5ndWFnZSk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIG5iX2F1ZGlvX2xhbmd1YWdlcyk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXNmLT5uYl9sYW5ndWFnZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhdWRpb19sYW5ndWFnZV9jb3VudHNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZpb193bDE2KHBiLCBhdWRpb19sYW5ndWFnZV9jb3VudHNbaV0pOworICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bmJfc3RyZWFtczsgbisrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFzZi0+c3RyZWFtc1tuXS5zdHJlYW1fbGFuZ3VhZ2VfaW5kZXggPT0gaSAmJiBzLT5zdHJlYW1zW25dLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpb193bDE2KHBiLCBuICsgMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kX2hlYWRlcihwYiwgaHBvczIpOworICAgICAgICB9CisKICAgICAgICAgZm9yIChuID0gMDsgbiA8IHMtPm5iX3N0cmVhbXM7IG4rKykgewogICAgICAgICAgICAgaW50NjRfdCBlc19wb3M7CiAgICAgICAgICAgICBpZiAoYXNmLT5zdHJlYW1zW25dLnN0cmVhbV9sYW5ndWFnZV9pbmRleCA+IDEyNykKQEAgLTUwMCwxNCArNTIzLDE0IEBACiAgICAgICAgICAgICBlc19wb3MgPSBwdXRfaGVhZGVyKHBiLCAmZmZfYXNmX2V4dGVuZGVkX3N0cmVhbV9wcm9wZXJ0aWVzX29iamVjdCk7CiAgICAgICAgICAgICBhdmlvX3dsNjQocGIsIDApOyAvKiBzdGFydCB0aW1lICovCiAgICAgICAgICAgICBhdmlvX3dsNjQocGIsIDApOyAvKiBlbmQgdGltZSAqLwotICAgICAgICAgICAgYXZpb193bDMyKHBiLCBzLT5zdHJlYW1zW25dLT5jb2RlYy0+Yml0X3JhdGUpOyAvKiBkYXRhIGJpdHJhdGUgYnBzICovCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHMtPnN0cmVhbXNbbl0tPmNvZGVjcGFyLT5iaXRfcmF0ZSk7IC8qIGRhdGEgYml0cmF0ZSBicHMgKi8KICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgNTAwMCk7IC8qIGJ1ZmZlciBzaXplIG1zICovCiAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAvKiBpbml0aWFsIGJ1ZmZlciBmdWxsbmVzcyAqLwotICAgICAgICAgICAgYXZpb193bDMyKHBiLCBzLT5zdHJlYW1zW25dLT5jb2RlYy0+Yml0X3JhdGUpOyAvKiBwZWFrIGRhdGEgYml0cmF0ZSAqLworICAgICAgICAgICAgYXZpb193bDMyKHBiLCBzLT5zdHJlYW1zW25dLT5jb2RlY3Bhci0+Yml0X3JhdGUpOyAvKiBwZWFrIGRhdGEgYml0cmF0ZSAqLwogICAgICAgICAgICAgYXZpb193bDMyKHBiLCA1MDAwKTsgLyogbWF4aW11bSBidWZmZXIgc2l6ZSBtcyAqLwogICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLyogbWF4IGluaXRpYWwgYnVmZmVyIGZ1bGxuZXNzICovCiAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAvKiBtYXggb2JqZWN0IHNpemUgKi8KLSAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgKCFhc2YtPmlzX3N0cmVhbWVkICYmIHBiLT5zZWVrYWJsZSkgPDwgMSk7IC8qIGZsYWdzIC0gc2Vla2FibGUgKi8KKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgKCFhc2YtPmlzX3N0cmVhbWVkICYmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpIDw8IDEpOyAvKiBmbGFncyAtIHNlZWthYmxlICovCiAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIG4gKyAxKTsgLyogc3RyZWFtIG51bWJlciAqLwogICAgICAgICAgICAgYXZpb193bDE2KHBiLCBhc2YtPnN0cmVhbXNbbl0uc3RyZWFtX2xhbmd1YWdlX2luZGV4KTsgLyogbGFuZ3VhZ2UgaWQgaW5kZXggKi8KICAgICAgICAgICAgIGF2aW9fd2w2NChwYiwgMCk7IC8qIGF2ZyB0aW1lIHBlciBmcmFtZSAqLwpAQCAtNTIxLDExICs1NDQsMTEgQEAKICAgICAgICAgaHBvczIgPSBwdXRfaGVhZGVyKHBiLCAmZmZfYXNmX21ldGFkYXRhX2hlYWRlcik7CiAgICAgICAgIGF2aW9fd2wxNihwYiwgMiAqIGhhc19hc3BlY3RfcmF0aW8pOwogICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcy0+bmJfc3RyZWFtczsgbisrKSB7Ci0gICAgICAgICAgICBlbmMgPSBzLT5zdHJlYW1zW25dLT5jb2RlYzsKLSAgICAgICAgICAgIGlmICggICBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPCi0gICAgICAgICAgICAgICAgJiYgZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDAKLSAgICAgICAgICAgICAgICAmJiBlbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID4gMCkgewotICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgc2FyID0gZW5jLT5zYW1wbGVfYXNwZWN0X3JhdGlvOworICAgICAgICAgICAgcGFyID0gcy0+c3RyZWFtc1tuXS0+Y29kZWNwYXI7CisgICAgICAgICAgICBpZiAoICAgcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTworICAgICAgICAgICAgICAgICYmIHBhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPiAwCisgICAgICAgICAgICAgICAgJiYgcGFyLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHNhciA9IHBhci0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKICAgICAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIDApOwogICAgICAgICAgICAgICAgIC8vIHRoZSBzdHJlYW0gbnVtYmVyIGlzIHNldCBsaWtlIHRoaXMgYmVsb3cKICAgICAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIG4gKyAxKTsKQEAgLTU1NSw3ICs1NzgsNyBAQAogICAgIH0KICAgICBlbmRfaGVhZGVyKHBiLCBocG9zKTsKIAotICAgIC8qIHRpdGxlIGFuZCBvdGhlciBpbmZvcyAqLworICAgIC8qIHRpdGxlIGFuZCBvdGhlciBpbmZvICovCiAgICAgaWYgKGhhc190aXRsZSkgewogICAgICAgICBpbnQgbGVuOwogICAgICAgICB1aW50OF90ICpidWY7CkBAIC01OTcsMTEgKzYyMCwxMSBAQAogICAgICAgICBpbnQ2NF90IGVzX3BvczsKICAgICAgICAgLy8gICAgICAgIEFTRlN0cmVhbSAqc3RyZWFtID0gJmFzZi0+c3RyZWFtc1tuXTsKIAotICAgICAgICBlbmMgICAgICAgICAgICAgICAgID0gcy0+c3RyZWFtc1tuXS0+Y29kZWM7CisgICAgICAgIHBhciAgICAgICAgICAgICAgICAgPSBzLT5zdHJlYW1zW25dLT5jb2RlY3BhcjsKICAgICAgICAgYXNmLT5zdHJlYW1zW25dLm51bSA9IG4gKyAxOwogICAgICAgICBhc2YtPnN0cmVhbXNbbl0uc2VxID0gMTsKIAotICAgICAgICBzd2l0Y2ggKGVuYy0+Y29kZWNfdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHBhci0+Y29kZWNfdHlwZSkgewogICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKICAgICAgICAgICAgIHdhdl9leHRyYV9zaXplID0gMDsKICAgICAgICAgICAgIGV4dHJhX3NpemUgICAgID0gMTggKyB3YXZfZXh0cmFfc2l6ZTsKQEAgLTYwOSwxNCArNjMyLDE0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICB3YXZfZXh0cmFfc2l6ZSA9IGVuYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgICAgICB3YXZfZXh0cmFfc2l6ZSA9IHBhci0+ZXh0cmFkYXRhX3NpemU7CiAgICAgICAgICAgICBleHRyYV9zaXplICAgICA9IDB4MzMgKyB3YXZfZXh0cmFfc2l6ZTsKICAgICAgICAgICAgIGV4dHJhX3NpemUyICAgID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgaHBvcyA9IHB1dF9oZWFkZXIocGIsICZmZl9hc2Zfc3RyZWFtX2hlYWRlcik7Ci0gICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgICAgICBmZl9wdXRfZ3VpZChwYiwgJmZmX2FzZl9hdWRpb19zdHJlYW0pOwogICAgICAgICAgICAgZmZfcHV0X2d1aWQocGIsICZmZl9hc2ZfYXVkaW9fY29uY2VhbF9zcHJlYWQpOwogICAgICAgICB9IGVsc2UgewpAQCAtNjMwLDkgKzY1Myw5IEBACiAgICAgICAgIGF2aW9fd2wxNihwYiwgbiArIDEpOyAvKiBzdHJlYW0gbnVtYmVyICovCiAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qID8/PyAqLwogCi0gICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgICAgICAvKiBXQVZFRk9STUFURVggaGVhZGVyICovCi0gICAgICAgICAgICBpbnQgd2F2c2l6ZSA9IGZmX3B1dF93YXZfaGVhZGVyKHBiLCBlbmMsIEZGX1BVVF9XQVZfSEVBREVSX0ZPUkNFX1dBVkVGT1JNQVRFWCk7CisgICAgICAgICAgICBpbnQgd2F2c2l6ZSA9IGZmX3B1dF93YXZfaGVhZGVyKHMsIHBiLCBwYXIsIEZGX1BVVF9XQVZfSEVBREVSX0ZPUkNFX1dBVkVGT1JNQVRFWCk7CiAKICAgICAgICAgICAgIGlmICh3YXZzaXplIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC02NDQsMjMgKzY2NywyMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogRVJST1IgQ29ycmVjdGlvbiAqLwogICAgICAgICAgICAgYXZpb193OChwYiwgMHgwMSk7Ci0gICAgICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2IHx8ICFlbmMtPmJsb2NrX2FsaWduKSB7CisgICAgICAgICAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2IHx8ICFwYXItPmJsb2NrX2FsaWduKSB7CiAgICAgICAgICAgICAgICAgYXZpb193bDE2KHBiLCAweDAxOTApOwogICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMHgwMTkwKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZpb193bDE2KHBiLCBlbmMtPmJsb2NrX2FsaWduKTsKLSAgICAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIGVuYy0+YmxvY2tfYWxpZ24pOworICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgcGFyLT5ibG9ja19hbGlnbik7CisgICAgICAgICAgICAgICAgYXZpb193bDE2KHBiLCBwYXItPmJsb2NrX2FsaWduKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMHgwMSk7CiAgICAgICAgICAgICBhdmlvX3c4KHBiLCAweDAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT53aWR0aCk7Ci0gICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgcGFyLT53aWR0aCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHBhci0+aGVpZ2h0KTsKICAgICAgICAgICAgIGF2aW9fdzgocGIsIDIpOyAvKiA/Pz8gKi8KLSAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgNDAgKyBlbmMtPmV4dHJhZGF0YV9zaXplKTsgLyogc2l6ZSAqLworICAgICAgICAgICAgYXZpb193bDE2KHBiLCA0MCArIHBhci0+ZXh0cmFkYXRhX3NpemUpOyAvKiBzaXplICovCiAKICAgICAgICAgICAgIC8qIEJJVE1BUElORk9IRUFERVIgaGVhZGVyICovCi0gICAgICAgICAgICBmZl9wdXRfYm1wX2hlYWRlcihwYiwgZW5jLCBmZl9jb2RlY19ibXBfdGFncywgMSwgMCk7CisgICAgICAgICAgICBmZl9wdXRfYm1wX2hlYWRlcihwYiwgcGFyLCAxLCAwKTsKICAgICAgICAgfQogICAgICAgICBlbmRfaGVhZGVyKHBiLCBocG9zKTsKICAgICB9CkBAIC02NzQsMTcgKzY5NywxNyBAQAogICAgICAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqY29kZWNfZGVzYzsKICAgICAgICAgY29uc3QgY2hhciAqZGVzYzsKIAotICAgICAgICBlbmMgID0gcy0+c3RyZWFtc1tuXS0+Y29kZWM7Ci0gICAgICAgIGNvZGVjX2Rlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGVuYy0+Y29kZWNfaWQpOworICAgICAgICBwYXIgID0gcy0+c3RyZWFtc1tuXS0+Y29kZWNwYXI7CisgICAgICAgIGNvZGVjX2Rlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KHBhci0+Y29kZWNfaWQpOwogCi0gICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgMik7Ci0gICAgICAgIGVsc2UgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGVsc2UgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIDEpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIC0xKTsKIAotICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTUFWMikKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01BVjIpCiAgICAgICAgICAgICBkZXNjID0gIldpbmRvd3MgTWVkaWEgQXVkaW8gVjgiOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBkZXNjID0gY29kZWNfZGVzYyA/IGNvZGVjX2Rlc2MtPm5hbWUgOiBOVUxMOwpAQCAtNzA5LDE0ICs3MzIsMTQgQEAKICAgICAgICAgYXZpb193bDE2KHBiLCAwKTsgLyogbm8gcGFyYW1ldGVycyAqLwogCiAgICAgICAgIC8qIGlkICovCi0gICAgICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIDIpOwotICAgICAgICAgICAgYXZpb193bDE2KHBiLCBlbmMtPmNvZGVjX3RhZyk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIHBhci0+Y29kZWNfdGFnKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgNCk7Ci0gICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgcGFyLT5jb2RlY190YWcpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghZW5jLT5jb2RlY190YWcpCisgICAgICAgIGlmICghcGFyLT5jb2RlY190YWcpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIGVuZF9oZWFkZXIocGIsIGhwb3MpOwpAQCAtOTQwLDcgKzk2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBQQUNLRVRfSEVBREVSX01JTl9TSVpFIC0gMTsKIAogICAgICAgICAgICAgaWYgKGZyYWdfbGVuMSA8IHBheWxvYWRfbGVuICYmCi0gICAgICAgICAgICAgICAgYXZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAgICAgYXZzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgICAgICAgICAgZmx1c2hfcGFja2V0KHMpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMTAzMCw3ICsxMDUzLDcgQEAKICAgICBBU0ZDb250ZXh0ICphc2YgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgQVNGU3RyZWFtICpzdHJlYW07Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXI7CiAgICAgdWludDMyX3QgcGFja2V0X251bWJlcjsKICAgICBpbnQ2NF90IHB0czsKICAgICBpbnQgc3RhcnRfc2VjOwpAQCAtMTAzOCwxMCArMTA2MSwxMCBAQAogICAgIGludCByZXQ7CiAgICAgdWludDY0X3Qgb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKIAotICAgIGNvZGVjICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBwYXIgID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjcGFyOwogICAgIHN0cmVhbSA9ICZhc2YtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOwogCi0gICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgZmxhZ3MgJj0gfkFWX1BLVF9GTEFHX0tFWTsKIAogICAgIHB0cyA9IChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgPyBwa3QtPnB0cyA6IHBrdC0+ZHRzOwpAQCAtMTExMiw3ICsxMTM1LDcgQEAKICAgICB9CiAgICAgYXZpb19mbHVzaChzLT5wYik7CiAKLSAgICBpZiAoYXNmLT5pc19zdHJlYW1lZCB8fCAhcy0+cGItPnNlZWthYmxlKSB7CisgICAgaWYgKGFzZi0+aXNfc3RyZWFtZWQgfHwgIShzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpIHsKICAgICAgICAgcHV0X2NodW5rKHMsIDB4NDUyNCwgMCwgMCk7IC8qIGVuZCBvZiBzdHJlYW0gKi8KICAgICB9IGVsc2UgewogICAgICAgICAvKiByZXdyaXRlIGFuIHVwZGF0ZWQgaGVhZGVyICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hc3NkZWMuYyBiL2xpYmF2Zm9ybWF0L2Fzc2RlYy5jCmluZGV4IDIxMTQ4YjYuLmQ4OWMxNGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2Fzc2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2Fzc2RlYy5jCkBAIC0xMjEsOCArMTIxLDggQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDApOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BU1M7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FTUzsKIAogICAgIGF2X2JwcmludF9pbml0KCZoZWFkZXIsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CiAgICAgYXZfYnByaW50X2luaXQoJmxpbmUsICAgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgICAgICBzdWItPmR1cmF0aW9uID0gZHVyYXRpb247CiAgICAgfQogCi0gICAgcmVzID0gYXZwcml2X2JwcmludF90b19leHRyYWRhdGEoc3QtPmNvZGVjLCAmaGVhZGVyKTsKKyAgICByZXMgPSBmZl9icHJpbnRfdG9fY29kZWNwYXJfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgJmhlYWRlcik7CiAgICAgaWYgKHJlcyA8IDApCiAgICAgICAgIGdvdG8gZW5kOwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hc3NlbmMuYyBiL2xpYmF2Zm9ybWF0L2Fzc2VuYy5jCmluZGV4IGU1OWMyNjYuLmQ1MGYxOGYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2Fzc2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2Fzc2VuYy5jCkBAIC0zMyw3ICszMyw2IEBACiAKIHR5cGVkZWYgc3RydWN0IEFTU0NvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwotICAgIGludCB3cml0ZV90czsgLy8gMDogc3NhICh0aW1pbmcgaW4gcGF5bG9hZCksIDE6IGFzcyAobWF0cm9za2EgbGlrZSkKICAgICBpbnQgZXhwZWN0ZWRfcmVhZG9yZGVyOwogICAgIERpYWxvZ3VlTGluZSAqZGlhbG9ndWVfY2FjaGU7CiAgICAgRGlhbG9ndWVMaW5lICpsYXN0X2FkZGVkX2RpYWxvZ3VlOwpAQCAtNDcsMTggKzQ2LDE2IEBACiBzdGF0aWMgaW50IHdyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgQVNTQ29udGV4dCAqYXNzID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKIAotICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEgfHwgKGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9TU0EgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQVNTKSkgeworICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEgfHwgcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9BU1MpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkV4YWN0bHkgb25lIEFTUy9TU0Egc3RyZWFtIGlzIG5lZWRlZC5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KLSAgICBhc3MtPndyaXRlX3RzID0gYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FTUzsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDY0LCAxLCAxMDApOwotICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBoZWFkZXJfc2l6ZSA9IGF2Y3R4LT5leHRyYWRhdGFfc2l6ZTsKLSAgICAgICAgdWludDhfdCAqdHJhaWxlciA9IHN0cnN0cihhdmN0eC0+ZXh0cmFkYXRhLCAiXG5bRXZlbnRzXSIpOworICAgIGlmIChwYXItPmV4dHJhZGF0YV9zaXplID4gMCkgeworICAgICAgICBzaXplX3QgaGVhZGVyX3NpemUgPSBwYXItPmV4dHJhZGF0YV9zaXplOworICAgICAgICB1aW50OF90ICp0cmFpbGVyID0gc3Ryc3RyKHBhci0+ZXh0cmFkYXRhLCAiXG5bRXZlbnRzXSIpOwogCiAgICAgICAgIGlmICh0cmFpbGVyKQogICAgICAgICAgICAgdHJhaWxlciA9IHN0cnN0cih0cmFpbGVyLCAiRm9ybWF0OiIpOwpAQCAtNjYsMTcgKzYzLDE3IEBACiAgICAgICAgICAgICB0cmFpbGVyID0gc3Ryc3RyKHRyYWlsZXIsICJcbiIpOwogCiAgICAgICAgIGlmICh0cmFpbGVyKyspIHsKLSAgICAgICAgICAgIGhlYWRlcl9zaXplID0gKHRyYWlsZXIgLSBhdmN0eC0+ZXh0cmFkYXRhKTsKLSAgICAgICAgICAgIGFzcy0+dHJhaWxlcl9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplIC0gaGVhZGVyX3NpemU7CisgICAgICAgICAgICBoZWFkZXJfc2l6ZSA9ICh0cmFpbGVyIC0gcGFyLT5leHRyYWRhdGEpOworICAgICAgICAgICAgYXNzLT50cmFpbGVyX3NpemUgPSBwYXItPmV4dHJhZGF0YV9zaXplIC0gaGVhZGVyX3NpemU7CiAgICAgICAgICAgICBpZiAoYXNzLT50cmFpbGVyX3NpemUpCiAgICAgICAgICAgICAgICAgYXNzLT50cmFpbGVyID0gdHJhaWxlcjsKICAgICAgICAgfQogCi0gICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIGF2Y3R4LT5leHRyYWRhdGEsIGhlYWRlcl9zaXplKTsKLSAgICAgICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFbaGVhZGVyX3NpemUgLSAxXSAhPSAnXG4nKQorICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBwYXItPmV4dHJhZGF0YSwgaGVhZGVyX3NpemUpOworICAgICAgICBpZiAocGFyLT5leHRyYWRhdGFbaGVhZGVyX3NpemUgLSAxXSAhPSAnXG4nKQogICAgICAgICAgICAgYXZpb193cml0ZShzLT5wYiwgIlxyXG4iLCAyKTsKLSAgICAgICAgYXNzLT5zc2FfbW9kZSA9ICFzdHJzdHIoYXZjdHgtPmV4dHJhZGF0YSwgIlxuW1Y0KyBTdHlsZXNdIik7Ci0gICAgICAgIGlmICghc3Ryc3RyKGF2Y3R4LT5leHRyYWRhdGEsICJcbltFdmVudHNdIikpCisgICAgICAgIGFzcy0+c3NhX21vZGUgPSAhc3Ryc3RyKHBhci0+ZXh0cmFkYXRhLCAiXG5bVjQrIFN0eWxlc10iKTsKKyAgICAgICAgaWYgKCFzdHJzdHIocGFyLT5leHRyYWRhdGEsICJcbltFdmVudHNdIikpCiAgICAgICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIltFdmVudHNdXHJcbkZvcm1hdDogJXMsIFN0YXJ0LCBFbmQsIFN0eWxlLCBOYW1lLCBNYXJnaW5MLCBNYXJnaW5SLCBNYXJnaW5WLCBFZmZlY3QsIFRleHRcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIGFzcy0+c3NhX21vZGUgPyAiTWFya2VkIiA6ICJMYXllciIpOwogICAgIH0KQEAgLTE1OSw1MCArMTU2LDQ2IEBACiB7CiAgICAgQVNTQ29udGV4dCAqYXNzID0gcy0+cHJpdl9kYXRhOwogCi0gICAgaWYgKGFzcy0+d3JpdGVfdHMpIHsKLSAgICAgICAgbG9uZyBpbnQgbGF5ZXI7Ci0gICAgICAgIGNoYXIgKnAgPSBwa3QtPmRhdGE7Ci0gICAgICAgIGludDY0X3Qgc3RhcnQgPSBwa3QtPnB0czsKLSAgICAgICAgaW50NjRfdCBlbmQgICA9IHN0YXJ0ICsgcGt0LT5kdXJhdGlvbjsKLSAgICAgICAgaW50IGhoMSwgbW0xLCBzczEsIG1zMTsKLSAgICAgICAgaW50IGhoMiwgbW0yLCBzczIsIG1zMjsKLSAgICAgICAgRGlhbG9ndWVMaW5lICpkaWFsb2d1ZSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpkaWFsb2d1ZSkpOworICAgIGxvbmcgaW50IGxheWVyOworICAgIGNoYXIgKnAgPSBwa3QtPmRhdGE7CisgICAgaW50NjRfdCBzdGFydCA9IHBrdC0+cHRzOworICAgIGludDY0X3QgZW5kICAgPSBzdGFydCArIHBrdC0+ZHVyYXRpb247CisgICAgaW50IGhoMSwgbW0xLCBzczEsIG1zMTsKKyAgICBpbnQgaGgyLCBtbTIsIHNzMiwgbXMyOworICAgIERpYWxvZ3VlTGluZSAqZGlhbG9ndWUgPSBhdl9tYWxsb2N6KHNpemVvZigqZGlhbG9ndWUpKTsKIAotICAgICAgICBpZiAoIWRpYWxvZ3VlKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpZiAoIWRpYWxvZ3VlKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgIGRpYWxvZ3VlLT5yZWFkb3JkZXIgPSBzdHJ0b2wocCwgJnAsIDEwKTsKLSAgICAgICAgaWYgKGRpYWxvZ3VlLT5yZWFkb3JkZXIgPCBhc3MtPmV4cGVjdGVkX3JlYWRvcmRlcikKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuZXhwZWN0ZWQgUmVhZE9yZGVyICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGRpYWxvZ3VlLT5yZWFkb3JkZXIpOwotICAgICAgICBpZiAoKnAgPT0gJywnKQotICAgICAgICAgICAgcCsrOworICAgIGRpYWxvZ3VlLT5yZWFkb3JkZXIgPSBzdHJ0b2wocCwgJnAsIDEwKTsKKyAgICBpZiAoZGlhbG9ndWUtPnJlYWRvcmRlciA8IGFzcy0+ZXhwZWN0ZWRfcmVhZG9yZGVyKQorICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJVbmV4cGVjdGVkIFJlYWRPcmRlciAlZFxuIiwKKyAgICAgICAgICAgICAgIGRpYWxvZ3VlLT5yZWFkb3JkZXIpOworICAgIGlmICgqcCA9PSAnLCcpCisgICAgICAgIHArKzsKIAotICAgICAgICBpZiAoYXNzLT5zc2FfbW9kZSAmJiAhc3RybmNtcChwLCAiTWFya2VkPSIsIDcpKQotICAgICAgICAgICAgcCArPSA3OworICAgIGlmIChhc3MtPnNzYV9tb2RlICYmICFzdHJuY21wKHAsICJNYXJrZWQ9IiwgNykpCisgICAgICAgIHAgKz0gNzsKIAotICAgICAgICBsYXllciA9IHN0cnRvbChwLCAmcCwgMTApOwotICAgICAgICBpZiAoKnAgPT0gJywnKQotICAgICAgICAgICAgcCsrOwotICAgICAgICBoaDEgPSAoaW50KShzdGFydCAvIDM2MDAwMCk7ICAgIG1tMSA9IChpbnQpKHN0YXJ0IC8gNjAwMCkgJSA2MDsKLSAgICAgICAgaGgyID0gKGludCkoZW5kICAgLyAzNjAwMDApOyAgICBtbTIgPSAoaW50KShlbmQgICAvIDYwMDApICUgNjA7Ci0gICAgICAgIHNzMSA9IChpbnQpKHN0YXJ0IC8gMTAwKSAlIDYwOyAgbXMxID0gKGludCkoc3RhcnQgJSAxMDApOwotICAgICAgICBzczIgPSAoaW50KShlbmQgICAvIDEwMCkgJSA2MDsgIG1zMiA9IChpbnQpKGVuZCAgICUgMTAwKTsKLSAgICAgICAgaWYgKGhoMSA+IDkpIGhoMSA9IDksIG1tMSA9IDU5LCBzczEgPSA1OSwgbXMxID0gOTk7Ci0gICAgICAgIGlmIChoaDIgPiA5KSBoaDIgPSA5LCBtbTIgPSA1OSwgc3MyID0gNTksIG1zMiA9IDk5OworICAgIGxheWVyID0gc3RydG9sKHAsICZwLCAxMCk7CisgICAgaWYgKCpwID09ICcsJykKKyAgICAgICAgcCsrOworICAgIGhoMSA9IChpbnQpKHN0YXJ0IC8gMzYwMDAwKTsgICAgbW0xID0gKGludCkoc3RhcnQgLyA2MDAwKSAlIDYwOworICAgIGhoMiA9IChpbnQpKGVuZCAgIC8gMzYwMDAwKTsgICAgbW0yID0gKGludCkoZW5kICAgLyA2MDAwKSAlIDYwOworICAgIHNzMSA9IChpbnQpKHN0YXJ0IC8gMTAwKSAlIDYwOyAgbXMxID0gKGludCkoc3RhcnQgJSAxMDApOworICAgIHNzMiA9IChpbnQpKGVuZCAgIC8gMTAwKSAlIDYwOyAgbXMyID0gKGludCkoZW5kICAgJSAxMDApOworICAgIGlmIChoaDEgPiA5KSBoaDEgPSA5LCBtbTEgPSA1OSwgc3MxID0gNTksIG1zMSA9IDk5OworICAgIGlmIChoaDIgPiA5KSBoaDIgPSA5LCBtbTIgPSA1OSwgc3MyID0gNTksIG1zMiA9IDk5OwogCi0gICAgICAgIGRpYWxvZ3VlLT5saW5lID0gYXZfYXNwcmludGYoIiVzJWxkLCVkOiUwMmQ6JTAyZC4lMDJkLCVkOiUwMmQ6JTAyZC4lMDJkLCVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3MtPnNzYV9tb2RlID8gIk1hcmtlZD0iIDogIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIsIGhoMSwgbW0xLCBzczEsIG1zMSwgaGgyLCBtbTIsIHNzMiwgbXMyLCBwKTsKLSAgICAgICAgaWYgKCFkaWFsb2d1ZS0+bGluZSkgewotICAgICAgICAgICAgYXZfZnJlZShkaWFsb2d1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICB9Ci0gICAgICAgIGluc2VydF9kaWFsb2d1ZShhc3MsIGRpYWxvZ3VlKTsKLSAgICAgICAgcHVyZ2VfZGlhbG9ndWVzKHMsIGFzcy0+aWdub3JlX3JlYWRvcmRlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZpb193cml0ZShzLT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIGRpYWxvZ3VlLT5saW5lID0gYXZfYXNwcmludGYoIiVzJWxkLCVkOiUwMmQ6JTAyZC4lMDJkLCVkOiUwMmQ6JTAyZC4lMDJkLCVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzcy0+c3NhX21vZGUgPyAiTWFya2VkPSIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLCBoaDEsIG1tMSwgc3MxLCBtczEsIGhoMiwgbW0yLCBzczIsIG1zMiwgcCk7CisgICAgaWYgKCFkaWFsb2d1ZS0+bGluZSkgeworICAgICAgICBhdl9mcmVlKGRpYWxvZ3VlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CisgICAgaW5zZXJ0X2RpYWxvZ3VlKGFzcywgZGlhbG9ndWUpOworICAgIHB1cmdlX2RpYWxvZ3VlcyhzLCBhc3MtPmlnbm9yZV9yZWFkb3JkZXIpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yMzcsMTAgKzIzMCwxMCBAQAogQVZPdXRwdXRGb3JtYXQgZmZfYXNzX211eGVyID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJhc3MiLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTU0EgKFN1YlN0YXRpb24gQWxwaGEpIHN1YnRpdGxlIiksCi0gICAgLm1pbWVfdHlwZSAgICAgID0gInRleHQveC1zc2EiLAorICAgIC5taW1lX3R5cGUgICAgICA9ICJ0ZXh0L3gtYXNzIiwKICAgICAuZXh0ZW5zaW9ucyAgICAgPSAiYXNzLHNzYSIsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFTU0NvbnRleHQpLAotICAgIC5zdWJ0aXRsZV9jb2RlYyA9IEFWX0NPREVDX0lEX1NTQSwKKyAgICAuc3VidGl0bGVfY29kZWMgPSBBVl9DT0RFQ19JRF9BU1MsCiAgICAgLndyaXRlX2hlYWRlciAgID0gd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICA9IHdyaXRlX3BhY2tldCwKICAgICAud3JpdGVfdHJhaWxlciAgPSB3cml0ZV90cmFpbGVyLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXN0ZGVjLmMgYi9saWJhdmZvcm1hdC9hc3RkZWMuYwppbmRleCA5MmMyMDhkLi40YmEwOGMyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hc3RkZWMuYworKysgYi9saWJhdmZvcm1hdC9hc3RkZWMuYwpAQCAtNDgsOCArNDgsOCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgYXZpb19za2lwKHMtPnBiLCA4KTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2FzdF90YWdzLCBhdmlvX3JiMTYocy0+cGIpKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2FzdF90YWdzLCBhdmlvX3JiMTYocy0+cGIpKTsKIAogICAgIGRlcHRoID0gYXZpb19yYjE2KHMtPnBiKTsKICAgICBpZiAoZGVwdGggIT0gMTYpIHsKQEAgLTU3LDIzICs1NywyMyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gYXZpb19yYjE2KHMtPnBiKTsKLSAgICBpZiAoIXN0LT5jb2RlYy0+Y2hhbm5lbHMpCisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgaWYgKCFzdC0+Y29kZWNwYXItPmNoYW5uZWxzKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID09IDIpCi0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwotICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPT0gNCkKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF80UE9JTlQwOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzID09IDIpCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPT0gNCkKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF80UE9JTlQwOwogCiAgICAgYXZpb19za2lwKHMtPnBiLCAyKTsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHMtPnBiKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKQorICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgPSAwOwogICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICAgPSBhdmlvX3JiMzIocy0+cGIpOwogICAgIGF2aW9fc2tpcChzLT5wYiwgNDApOwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTkwLDEwICs5MCwxMCBAQAogICAgIHBvcyAgPSBhdmlvX3RlbGwocy0+cGIpOwogICAgIHR5cGUgPSBhdmlvX3JsMzIocy0+cGIpOwogICAgIHNpemUgPSBhdmlvX3JiMzIocy0+cGIpOwotICAgIGlmIChzaXplID4gSU5UX01BWCAvIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jaGFubmVscykKKyAgICBpZiAoIXMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jaGFubmVscyB8fCBzaXplID4gSU5UX01BWCAvIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jaGFubmVscykKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBzaXplICo9IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jaGFubmVsczsKKyAgICBzaXplICo9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICBpZiAoKHJldCA9IGF2aW9fc2tpcChzLT5wYiwgMjQpKSA8IDApIC8vIHBhZGRpbmcKICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtMTAyLDcgKzEwMiw3IEBACiAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKICAgICAgICAgcGt0LT5wb3MgPSBwb3M7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVua25vd24gY2h1bmsgJXhcbiIsIHR5cGUpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5rbm93biBjaHVuayAlIlBSSXgzMiJcbiIsIHR5cGUpOwogICAgICAgICBhdmlvX3NraXAocy0+cGIsIHNpemUpOwogICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FzdGVuYy5jIGIvbGliYXZmb3JtYXQvYXN0ZW5jLmMKaW5kZXggY2Y3YTEyYy4uNTc4ZTY1OCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXN0ZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvYXN0ZW5jLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2RlZmluZSBDSEVDS19MT09QKHR5cGUpIFwKICAgICBpZiAoYXN0LT5sb29wICMjIHR5cGUgPiAwKSB7IFwKLSAgICAgICAgYXN0LT5sb29wICMjIHR5cGUgPSBhdl9yZXNjYWxlX3JuZChhc3QtPmxvb3AgIyMgdHlwZSwgZW5jLT5zYW1wbGVfcmF0ZSwgMTAwMCwgQVZfUk9VTkRfRE9XTik7IFwKKyAgICAgICAgYXN0LT5sb29wICMjIHR5cGUgPSBhdl9yZXNjYWxlX3JuZChhc3QtPmxvb3AgIyMgdHlwZSwgcGFyLT5zYW1wbGVfcmF0ZSwgMTAwMCwgQVZfUk9VTkRfRE9XTik7IFwKICAgICAgICAgaWYgKGFzdC0+bG9vcCAjIyB0eXBlIDwgMCB8fCBhc3QtPmxvb3AgIyMgdHlwZSA+IFVJTlRfTUFYKSB7IFwKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGxvb3AiICN0eXBlICIgdmFsdWVcbiIpOyBcCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOyAgXApAQCAtNDgsMjIgKzQ4LDIyIEBACiB7CiAgICAgQVNUTXV4Q29udGV4dCAqYXN0ID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICB1bnNpZ25lZCBpbnQgY29kZWNfdGFnOwogCiAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPT0gMSkgewotICAgICAgICBlbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICAgICAgcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm9ubHkgb25lIHN0cmVhbSBpcyBzdXBwb3J0ZWRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0FGQykgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0FGQykgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibXV4aW5nIEFEUENNIEFGQyBpcyBub3QgaW1wbGVtZW50ZWRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCi0gICAgY29kZWNfdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19hc3RfdGFncywgZW5jLT5jb2RlY19pZCk7CisgICAgY29kZWNfdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19hc3RfdGFncywgcGFyLT5jb2RlY19pZCk7CiAgICAgaWYgKCFjb2RlY190YWcpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvZGVjXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKQEAgLTg0LDkgKzg0LDkgQEAKICAgICBhdmlvX3diMzIocGIsIDApOyAvKiBGaWxlIHNpemUgbWludXMgaGVhZGVyICovCiAgICAgYXZpb193YjE2KHBiLCBjb2RlY190YWcpOwogICAgIGF2aW9fd2IxNihwYiwgMTYpOyAvKiBCaXQgZGVwdGggKi8KLSAgICBhdmlvX3diMTYocGIsIGVuYy0+Y2hhbm5lbHMpOworICAgIGF2aW9fd2IxNihwYiwgcGFyLT5jaGFubmVscyk7CiAgICAgYXZpb193YjE2KHBiLCAwKTsgLyogTG9vcCBmbGFnICovCi0gICAgYXZpb193YjMyKHBiLCBlbmMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdmlvX3diMzIocGIsIHBhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgYXN0LT5zYW1wbGVzID0gYXZpb190ZWxsKHBiKTsKICAgICBhdmlvX3diMzIocGIsIDApOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLwpAQCAtMTEwLDggKzExMCw4IEBACiB7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgQVNUTXV4Q29udGV4dCAqYXN0ID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKLSAgICBpbnQgc2l6ZSA9IHBrdC0+c2l6ZSAvIGVuYy0+Y2hhbm5lbHM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOworICAgIGludCBzaXplID0gcGt0LT5zaXplIC8gcGFyLT5jaGFubmVsczsKIAogICAgIGlmIChzLT5zdHJlYW1zWzBdLT5uYl9mcmFtZXMgPT0gMCkKICAgICAgICAgYXN0LT5mYnMgPSBzaXplOwpAQCAtMTMzLDEzICsxMzMsMTMgQEAKIHsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBBU1RNdXhDb250ZXh0ICphc3QgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKICAgICBpbnQ2NF90IGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7Ci0gICAgaW50NjRfdCBzYW1wbGVzID0gKGZpbGVfc2l6ZSAtIDY0IC0gKDMyICogcy0+c3RyZWFtc1swXS0+bmJfZnJhbWVzKSkgLyBlbmMtPmJsb2NrX2FsaWduOyAvKiBQQ01fUzE2QkVfUExBTkFSICovCisgICAgaW50NjRfdCBzYW1wbGVzID0gKGZpbGVfc2l6ZSAtIDY0IC0gKDMyICogcy0+c3RyZWFtc1swXS0+bmJfZnJhbWVzKSkgLyBwYXItPmJsb2NrX2FsaWduOyAvKiBQQ01fUzE2QkVfUExBTkFSICovCiAKICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAidG90YWwgc2FtcGxlczogJSJQUklkNjQiXG4iLCBzYW1wbGVzKTsKIAotICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICBpZiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KICAgICAgICAgYXZpb19zZWVrKHBiLCBhc3QtPnNhbXBsZXMsIFNFRUtfU0VUKTsKICAgICAgICAgYXZpb193YjMyKHBiLCBzYW1wbGVzKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2FzeW5jLmMgYi9saWJhdmZvcm1hdC9hc3luYy5jCmluZGV4IDEzOGVmMTMuLjU0ZGJkMjMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2FzeW5jLmMKKysrIGIvbGliYXZmb3JtYXQvYXN5bmMuYwpAQCAtMjUxLDcgKzI1MSw3IEBACiAKICAgICAvKiB3cmFwIGludGVycnVwdCBjYWxsYmFjayAqLwogICAgIGMtPmludGVycnVwdF9jYWxsYmFjayA9IGgtPmludGVycnVwdF9jYWxsYmFjazsKLSAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmYy0+aW5uZXIsIGFyZywgZmxhZ3MsICZpbnRlcnJ1cHRfY2FsbGJhY2ssIG9wdGlvbnMsIGgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgcmV0ID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJmMtPmlubmVyLCBhcmcsIGZsYWdzLCAmaW50ZXJydXB0X2NhbGxiYWNrLCBvcHRpb25zLCBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaCk7CiAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJmZnVybF9vcGVuIGZhaWxlZCA6ICVzLCAlc1xuIiwgYXZfZXJyMnN0cihyZXQpLCBhcmcpOwogICAgICAgICBnb3RvIHVybF9mYWlsOwpAQCAtNDc5LDcgKzQ3OSw3IEBACiAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi1VUkxQcm90b2NvbCBmZl9hc3luY19wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX2FzeW5jX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgICAgID0gImFzeW5jIiwKICAgICAudXJsX29wZW4yICAgICAgICAgICA9IGFzeW5jX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSBhc3luY19yZWFkLApAQCAtNDg5LDcgKzQ4OSw3IEBACiAgICAgLnByaXZfZGF0YV9jbGFzcyAgICAgPSAmYXN5bmNfY29udGV4dF9jbGFzcywKIH07CiAKLSNpZmRlZiBURVNUCisjaWYgMAogCiAjZGVmaW5lIFRFU1RfU0VFS19QT1MgICAgKDE1MzYpCiAjZGVmaW5lIFRFU1RfU1RSRUFNX1NJWkUgKDIwNDgpCkBAIC01ODEsNyArNTgxLDcgQEAKICAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKIH07CiAKLVVSTFByb3RvY29sIGZmX2FzeW5jX3Rlc3RfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9hc3luY190ZXN0X3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgICAgID0gImFzeW5jLXRlc3QiLAogICAgIC51cmxfb3BlbjIgICAgICAgICAgID0gYXN5bmNfdGVzdF9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gYXN5bmNfdGVzdF9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXUuYyBiL2xpYmF2Zm9ybWF0L2F1LmMKaW5kZXggNTM3MDJiYy4uNTIwODI0ZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXUuYworKysgYi9saWJhdmZvcm1hdC9hdS5jCkBAIC0zNiw3ICszNiw3IEBACiAvKiBpZiB3ZSBkb24ndCBrbm93IHRoZSBzaXplIGluIGFkdmFuY2UgKi8KICNkZWZpbmUgQVVfVU5LTk9XTl9TSVpFICgodWludDMyX3QpKH4wKSkKIC8qIHRoZSBzcGVjaWZpY2F0aW9uIHJlcXVpcmVzIGFuIGFubm90YXRpb24gZmllbGQgb2YgYXQgbGVhc3QgZWlnaHQgYnl0ZXMgKi8KLSNkZWZpbmUgQVVfSEVBREVSX1NJWkUgKDI0KzgpCisjZGVmaW5lIEFVX0RFRkFVTFRfSEVBREVSX1NJWkUgKDI0KzgpCiAKIHN0YXRpYyBjb25zdCBBVkNvZGVjVGFnIGNvZGVjX2F1X3RhZ3NbXSA9IHsKICAgICB7IEFWX0NPREVDX0lEX1BDTV9NVUxBVywgIDEgfSwKQEAgLTY2LDYgKzY2LDcyIEBACiAgICAgICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF1X3JlYWRfYW5ub3RhdGlvbihBVkZvcm1hdENvbnRleHQgKnMsIGludCBzaXplKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICoga2V5c1tdID0geworICAgICAgICAidGl0bGUiLAorICAgICAgICAiYXJ0aXN0IiwKKyAgICAgICAgImFsYnVtIiwKKyAgICAgICAgInRyYWNrIiwKKyAgICAgICAgImdlbnJlIiwKKyAgICAgICAgTlVMTCB9OworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGVudW0geyBQQVJTRV9LRVksIFBBUlNFX1ZBTFVFLCBQQVJTRV9GSU5JU0hFRCB9IHN0YXRlID0gUEFSU0VfS0VZOworICAgIGNoYXIgYzsKKyAgICBBVkJQcmludCBicHJpbnQ7CisgICAgY2hhciAqIGtleSA9IE5VTEw7CisgICAgY2hhciAqIHZhbHVlID0gTlVMTDsKKyAgICBpbnQgaTsKKworICAgIGF2X2JwcmludF9pbml0KCZicHJpbnQsIDY0LCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICAgICAgYyA9IGF2aW9fcjgocGIpOworICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICAgICAgY2FzZSBQQVJTRV9LRVk6CisgICAgICAgICAgICBpZiAoYyA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBQQVJTRV9GSU5JU0hFRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnPScpIHsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJwcmludCwgJmtleSk7CisgICAgICAgICAgICAgICAgYXZfYnByaW50X2luaXQoJmJwcmludCwgNjQsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgICAgICAgICAgICAgc3RhdGUgPSBQQVJTRV9WQUxVRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKCZicHJpbnQsIGMsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEFSU0VfVkFMVUU6CisgICAgICAgICAgICBpZiAoYyA9PSAnXDAnIHx8IGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGlmIChhdl9icHJpbnRfZmluYWxpemUoJmJwcmludCwgJnZhbHVlKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNZW1vcnkgZXJyb3Igd2hpbGUgcGFyc2luZyBBVSBtZXRhZGF0YS5cbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludF9pbml0KCZicHJpbnQsIDY0LCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBrZXlzW2ldICE9IE5VTEwgJiYga2V5ICE9IE5VTEw7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2X3N0cmNhc2VjbXAoa2V5c1tpXSwga2V5KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJihzLT5tZXRhZGF0YSksIGtleXNbaV0sIHZhbHVlLCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZrZXkpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ2YWx1ZSk7CisgICAgICAgICAgICAgICAgc3RhdGUgPSAoYyA9PSAnXDAnKSA/IFBBUlNFX0ZJTklTSEVEIDogUEFSU0VfS0VZOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9icHJpbnRfY2hhcnMoJmJwcmludCwgYywgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQVJTRV9GSU5JU0hFRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworICAgICAgICAgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmJwcmludCwgTlVMTCk7CisgICAgYXZfZnJlZXAoJmtleSk7CisgICAgcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgQkxPQ0tfU0laRSAxMDI0CiAKIHN0YXRpYyBpbnQgYXVfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQpAQCAtOTQsOCArMTYwLDggQEAKICAgICBjaGFubmVscyA9IGF2aW9fcmIzMihwYik7CiAKICAgICBpZiAoc2l6ZSA+IDI0KSB7Ci0gICAgICAgIC8qIHNraXAgdW51c2VkIGRhdGEgKi8KLSAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gMjQpOworICAgICAgICAvKiBwYXJzZSBhbm5vdGF0aW9uIGZpZWxkIHRvIGdldCBtZXRhZGF0YSAqLworICAgICAgICBhdV9yZWFkX2Fubm90YXRpb24ocywgc2l6ZSAtIDI0KTsKICAgICB9CiAKICAgICBjb2RlYyA9IGZmX2NvZGVjX2dldF9pZChjb2RlY19hdV90YWdzLCBpZCk7CkBAIC0xMzIsMTYgKzE5OCwxNiBAQAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IGlkOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBjb2RlYzsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gY2hhbm5lbHM7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHM7Ci0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICA9IGNoYW5uZWxzICogcmF0ZSAqIGJwczsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gRkZNQVgoYnBzICogc3QtPmNvZGVjLT5jaGFubmVscyAvIDgsIDEpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICA9IGlkOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBjb2RlYzsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gY2hhbm5lbHM7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHJhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHM7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICA9IGNoYW5uZWxzICogcmF0ZSAqIGJwczsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gRkZNQVgoYnBzICogc3QtPmNvZGVjcGFyLT5jaGFubmVscyAvIDgsIDEpOwogICAgIGlmIChkYXRhX3NpemUgIT0gQVVfVU5LTk9XTl9TSVpFKQotICAgIHN0LT5kdXJhdGlvbiA9ICgoKGludDY0X3QpZGF0YV9zaXplKTw8MykgLyAoc3QtPmNvZGVjLT5jaGFubmVscyAqIChpbnQ2NF90KWJwcyk7CisgICAgICAgIHN0LT5kdXJhdGlvbiA9ICgoKGludDY0X3QpZGF0YV9zaXplKTw8MykgLyAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIChpbnQ2NF90KWJwcyk7CiAKICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHJhdGUpOwpAQCAtMTYzLDMxICsyMjksODcgQEAKIAogI2lmIENPTkZJR19BVV9NVVhFUgogCit0eXBlZGVmIHN0cnVjdCBBVUNvbnRleHQgeworICAgIHVpbnQzMl90IGhlYWRlcl9zaXplOworfSBBVUNvbnRleHQ7CisKICNpbmNsdWRlICJyYXdlbmMuaCIKIAorc3RhdGljIGludCBhdV9nZXRfYW5ub3RhdGlvbnMoQVZGb3JtYXRDb250ZXh0ICpzLCBjaGFyICoqYnVmZmVyKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICoga2V5c1tdID0geworICAgICAgICAiVGl0bGUiLAorICAgICAgICAiQXJ0aXN0IiwKKyAgICAgICAgIkFsYnVtIiwKKyAgICAgICAgIlRyYWNrIiwKKyAgICAgICAgIkdlbnJlIiwKKyAgICAgICAgTlVMTCB9OworICAgIGludCBpOworICAgIGludCBjbnQgPSAwOworICAgIEFWRGljdGlvbmFyeSAqbSA9IHMtPm1ldGFkYXRhOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBBVkJQcmludCBicHJpbnQ7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYnByaW50LCA2NCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKKworICAgIGZvciAoaSA9IDA7IGtleXNbaV0gIT0gTlVMTDsgaSsrKSB7CisgICAgICAgIHQgPSBhdl9kaWN0X2dldChtLCBrZXlzW2ldLCBOVUxMLCAwKTsKKyAgICAgICAgaWYgKHQgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGNudCsrKQorICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycygmYnByaW50LCAnXG4nLCAxKTsKKyAgICAgICAgICAgIGF2X2JwcmludF9hcHBlbmRfZGF0YSgmYnByaW50LCBrZXlzW2ldLCBzdHJsZW4oa2V5c1tpXSkpOworICAgICAgICAgICAgYXZfYnByaW50X2NoYXJzKCZicHJpbnQsICc9JywgMSk7CisgICAgICAgICAgICBhdl9icHJpbnRfYXBwZW5kX2RhdGEoJmJwcmludCwgdC0+dmFsdWUsIHN0cmxlbih0LT52YWx1ZSkpOworICAgICAgICB9CisgICAgfQorICAgIC8qIHBhZCB3aXRoIDAncyAqLworICAgIGF2X2JwcmludF9hcHBlbmRfZGF0YSgmYnByaW50LCAiXDBcMFwwXDBcMFwwXDBcMCIsIDgpOworICAgIHJldHVybiBhdl9icHJpbnRfZmluYWxpemUoJmJwcmludCwgYnVmZmVyKTsKK30KKwogc3RhdGljIGludCBhdV93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogeworICAgIGludCByZXQ7CisgICAgQVVDb250ZXh0ICphdSA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOworICAgIGNoYXIgKmFubm90YXRpb25zID0gTlVMTDsKKworICAgIGF1LT5oZWFkZXJfc2l6ZSA9IEFVX0RFRkFVTFRfSEVBREVSX1NJWkU7CiAKICAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJvbmx5IG9uZSBzdHJlYW0gaXMgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBlbmMtPmNvZGVjX3RhZyA9IGZmX2NvZGVjX2dldF90YWcoY29kZWNfYXVfdGFncywgZW5jLT5jb2RlY19pZCk7Ci0gICAgaWYgKCFlbmMtPmNvZGVjX3RhZykgeworICAgIHBhci0+Y29kZWNfdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhjb2RlY19hdV90YWdzLCBwYXItPmNvZGVjX2lkKTsKKyAgICBpZiAoIXBhci0+Y29kZWNfdGFnKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBjb2RlY1xuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCisgICAgaWYgKGF2X2RpY3RfY291bnQocy0+bWV0YWRhdGEpID4gMCkgeworICAgICAgICByZXQgPSBhdV9nZXRfYW5ub3RhdGlvbnMocywgJmFubm90YXRpb25zKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoYW5ub3RhdGlvbnMgIT0gTlVMTCkgeworICAgICAgICAgICAgYXUtPmhlYWRlcl9zaXplID0gKDI0ICsgc3RybGVuKGFubm90YXRpb25zKSArIDgpICYgfjc7CisgICAgICAgICAgICBpZiAoYXUtPmhlYWRlcl9zaXplIDwgQVVfREVGQVVMVF9IRUFERVJfU0laRSkKKyAgICAgICAgICAgICAgICBhdS0+aGVhZGVyX3NpemUgPSBBVV9ERUZBVUxUX0hFQURFUl9TSVpFOworICAgICAgICB9CisgICAgfQogICAgIGZmaW9fd2ZvdXJjYyhwYiwgIi5zbmQiKTsgICAgICAgICAgICAgICAgICAgLyogbWFnaWMgbnVtYmVyICovCi0gICAgYXZpb193YjMyKHBiLCBBVV9IRUFERVJfU0laRSk7ICAgICAgICAgICAgICAvKiBoZWFkZXIgc2l6ZSAqLworICAgIGF2aW9fd2IzMihwYiwgYXUtPmhlYWRlcl9zaXplKTsgICAgICAgICAgICAgLyogaGVhZGVyIHNpemUgKi8KICAgICBhdmlvX3diMzIocGIsIEFVX1VOS05PV05fU0laRSk7ICAgICAgICAgICAgIC8qIGRhdGEgc2l6ZSAqLwotICAgIGF2aW9fd2IzMihwYiwgZW5jLT5jb2RlY190YWcpOyAgICAgICAgICAgICAgLyogY29kZWMgSUQgKi8KLSAgICBhdmlvX3diMzIocGIsIGVuYy0+c2FtcGxlX3JhdGUpOwotICAgIGF2aW9fd2IzMihwYiwgZW5jLT5jaGFubmVscyk7Ci0gICAgYXZpb193YjY0KHBiLCAwKTsgLyogYW5ub3RhdGlvbiBmaWVsZCAqLworICAgIGF2aW9fd2IzMihwYiwgcGFyLT5jb2RlY190YWcpOyAgICAgICAgICAgICAgLyogY29kZWMgSUQgKi8KKyAgICBhdmlvX3diMzIocGIsIHBhci0+c2FtcGxlX3JhdGUpOworICAgIGF2aW9fd2IzMihwYiwgcGFyLT5jaGFubmVscyk7CisgICAgaWYgKGFubm90YXRpb25zICE9IE5VTEwpIHsKKyAgICAgICAgYXZpb193cml0ZShwYiwgYW5ub3RhdGlvbnMsIGF1LT5oZWFkZXJfc2l6ZSAtIDI0KTsKKyAgICAgICAgYXZfZnJlZXAoJmFubm90YXRpb25zKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3diNjQocGIsIDApOyAvKiBhbm5vdGF0aW9uIGZpZWxkICovCisgICAgfQogICAgIGF2aW9fZmx1c2gocGIpOwogCiAgICAgcmV0dXJuIDA7CkBAIC0xOTYsMTIgKzMxOCwxMyBAQAogc3RhdGljIGludCBhdV93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBBVUNvbnRleHQgKmF1ID0gcy0+cHJpdl9kYXRhOwogICAgIGludDY0X3QgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKIAotICAgIGlmIChzLT5wYi0+c2Vla2FibGUgJiYgZmlsZV9zaXplIDwgSU5UMzJfTUFYKSB7CisgICAgaWYgKChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgJiYgZmlsZV9zaXplIDwgSU5UMzJfTUFYKSB7CiAgICAgICAgIC8qIHVwZGF0ZSBmaWxlIHNpemUgKi8KICAgICAgICAgYXZpb19zZWVrKHBiLCA4LCBTRUVLX1NFVCk7Ci0gICAgICAgIGF2aW9fd2IzMihwYiwgKHVpbnQzMl90KShmaWxlX3NpemUgLSBBVV9IRUFERVJfU0laRSkpOworICAgICAgICBhdmlvX3diMzIocGIsICh1aW50MzJfdCkoZmlsZV9zaXplIC0gYXUtPmhlYWRlcl9zaXplKSk7CiAgICAgICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplLCBTRUVLX1NFVCk7CiAgICAgICAgIGF2aW9fZmx1c2gocGIpOwogICAgIH0KQEAgLTIxNCw2ICszMzcsNyBAQAogICAgIC5sb25nX25hbWUgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlN1biBBVSIpLAogICAgIC5taW1lX3R5cGUgICAgID0gImF1ZGlvL2Jhc2ljIiwKICAgICAuZXh0ZW5zaW9ucyAgICA9ICJhdSIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEFVQ29udGV4dCksCiAgICAgLmF1ZGlvX2NvZGVjICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsCiAgICAgLnZpZGVvX2NvZGVjICAgPSBBVl9DT0RFQ19JRF9OT05FLAogICAgIC53cml0ZV9oZWFkZXIgID0gYXVfd3JpdGVfaGVhZGVyLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXVkaW9pbnRlcmxlYXZlLmMgYi9saWJhdmZvcm1hdC9hdWRpb2ludGVybGVhdmUuYwppbmRleCA2ZDE0MDFkLi42ZDQ5NTRiIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hdWRpb2ludGVybGVhdmUuYworKysgYi9saWJhdmZvcm1hdC9hdWRpb2ludGVybGVhdmUuYwpAQCAtMzMsNyArMzMsNyBAQAogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICBBdWRpb0ludGVybGVhdmVDb250ZXh0ICphaWMgPSBzdC0+cHJpdl9kYXRhOwogCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgICAgIGF2X2ZpZm9fZnJlZXAoJmFpYy0+Zmlmbyk7CiAgICAgfQogfQpAQCAtNTUsOSArNTUsOSBAQAogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICBBdWRpb0ludGVybGVhdmVDb250ZXh0ICphaWMgPSBzdC0+cHJpdl9kYXRhOwogCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBhaWMtPnNhbXBsZV9zaXplID0gKHN0LT5jb2RlYy0+Y2hhbm5lbHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpKSAvIDg7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBhaWMtPnNhbXBsZV9zaXplID0gKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpKSAvIDg7CiAgICAgICAgICAgICBpZiAoIWFpYy0+c2FtcGxlX3NpemUpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGNvbXB1dGUgc2FtcGxlIHNpemVcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC0xMTEsNyArMTExLDcgQEAKICAgICBpZiAocGt0KSB7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOwogICAgICAgICBBdWRpb0ludGVybGVhdmVDb250ZXh0ICphaWMgPSBzdC0+cHJpdl9kYXRhOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICAgICAgdW5zaWduZWQgbmV3X3NpemUgPSBhdl9maWZvX3NpemUoYWljLT5maWZvKSArIHBrdC0+c2l6ZTsKICAgICAgICAgICAgIGlmIChuZXdfc2l6ZSA+IGFpYy0+Zmlmb19zaXplKSB7CiAgICAgICAgICAgICAgICAgaWYgKGF2X2ZpZm9fcmVhbGxvYzIoYWljLT5maWZvLCBuZXdfc2l6ZSkgPCAwKQpAQCAtMTMxLDcgKzEzMSw3IEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgICAgICBBVlBhY2tldCBuZXdfcGt0ID0geyAwIH07CiAgICAgICAgICAgICB3aGlsZSAoKHJldCA9IGludGVybGVhdmVfbmV3X2F1ZGlvX3BhY2tldChzLCAmbmV3X3BrdCwgaSwgZmx1c2gpKSA+IDApIHsKICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2ludGVybGVhdmVfYWRkX3BhY2tldChzLCAmbmV3X3BrdCwgY29tcGFyZV90cykpIDwgMCkKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2F2Yy5jIGIvbGliYXZmb3JtYXQvYXZjLmMKaW5kZXggZjdiOGYzOC4uZWM1MDAzMyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXZjLmMKKysrIGIvbGliYXZmb3JtYXQvYXZjLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NC5oIgogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiYXZpby5oIgogI2luY2x1ZGUgImF2Yy5oIgpAQCAtMTA1LDYwICsxMDYsOTIgQEAKIAogaW50IGZmX2lzb21fd3JpdGVfYXZjYyhBVklPQ29udGV4dCAqcGIsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBsZW4pCiB7Ci0gICAgaWYgKGxlbiA+IDYpIHsKLSAgICAgICAgLyogY2hlY2sgZm9yIGgyNjQgc3RhcnQgY29kZSAqLwotICAgICAgICBpZiAoQVZfUkIzMihkYXRhKSA9PSAweDAwMDAwMDAxIHx8Ci0gICAgICAgICAgICBBVl9SQjI0KGRhdGEpID09IDB4MDAwMDAxKSB7Ci0gICAgICAgICAgICB1aW50OF90ICpidWY9TlVMTCwgKmVuZCwgKnN0YXJ0OwotICAgICAgICAgICAgdWludDMyX3Qgc3BzX3NpemU9MCwgcHBzX3NpemU9MDsKLSAgICAgICAgICAgIHVpbnQ4X3QgKnNwcz0wLCAqcHBzPTA7CisgICAgQVZJT0NvbnRleHQgKnNwc19wYiA9IE5VTEwsICpwcHNfcGIgPSBOVUxMOworICAgIHVpbnQ4X3QgKmJ1ZiA9IE5VTEwsICplbmQsICpzdGFydCA9IE5VTEw7CisgICAgdWludDhfdCAqc3BzID0gTlVMTCwgKnBwcyA9IE5VTEw7CisgICAgdWludDMyX3Qgc3BzX3NpemUgPSAwLCBwcHNfc2l6ZSA9IDA7CisgICAgaW50IHJldCwgbmJfc3BzID0gMCwgbmJfcHBzID0gMDsKIAotICAgICAgICAgICAgaW50IHJldCA9IGZmX2F2Y19wYXJzZV9uYWxfdW5pdHNfYnVmKGRhdGEsICZidWYsICZsZW4pOwotICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIHN0YXJ0ID0gYnVmOwotICAgICAgICAgICAgZW5kID0gYnVmICsgbGVuOworICAgIGlmIChsZW4gPD0gNikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICAgICAgICAgIC8qIGxvb2sgZm9yIHNwcyBhbmQgcHBzICovCi0gICAgICAgICAgICB3aGlsZSAoZW5kIC0gYnVmID4gNCkgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemU7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBuYWxfdHlwZTsKLSAgICAgICAgICAgICAgICBzaXplID0gRkZNSU4oQVZfUkIzMihidWYpLCBlbmQgLSBidWYgLSA0KTsKLSAgICAgICAgICAgICAgICBidWYgKz0gNDsKLSAgICAgICAgICAgICAgICBuYWxfdHlwZSA9IGJ1ZlswXSAmIDB4MWY7Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsX3R5cGUgPT0gNykgeyAvKiBTUFMgKi8KLSAgICAgICAgICAgICAgICAgICAgc3BzID0gYnVmOwotICAgICAgICAgICAgICAgICAgICBzcHNfc2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYWxfdHlwZSA9PSA4KSB7IC8qIFBQUyAqLwotICAgICAgICAgICAgICAgICAgICBwcHMgPSBidWY7Ci0gICAgICAgICAgICAgICAgICAgIHBwc19zaXplID0gc2l6ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBidWYgKz0gc2l6ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFzcHMgfHwgIXBwcyB8fCBzcHNfc2l6ZSA8IDQgfHwgc3BzX3NpemUgPiBVSU5UMTZfTUFYIHx8IHBwc19zaXplID4gVUlOVDE2X01BWCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLQotICAgICAgICAgICAgYXZpb193OChwYiwgMSk7IC8qIHZlcnNpb24gKi8KLSAgICAgICAgICAgIGF2aW9fdzgocGIsIHNwc1sxXSk7IC8qIHByb2ZpbGUgKi8KLSAgICAgICAgICAgIGF2aW9fdzgocGIsIHNwc1syXSk7IC8qIHByb2ZpbGUgY29tcGF0ICovCi0gICAgICAgICAgICBhdmlvX3c4KHBiLCBzcHNbM10pOyAvKiBsZXZlbCAqLwotICAgICAgICAgICAgYXZpb193OChwYiwgMHhmZik7IC8qIDYgYml0cyByZXNlcnZlZCAoMTExMTExKSArIDIgYml0cyBuYWwgc2l6ZSBsZW5ndGggLSAxICgxMSkgKi8KLSAgICAgICAgICAgIGF2aW9fdzgocGIsIDB4ZTEpOyAvKiAzIGJpdHMgcmVzZXJ2ZWQgKDExMSkgKyA1IGJpdHMgbnVtYmVyIG9mIHNwcyAoMDAwMDEpICovCi0KLSAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgc3BzX3NpemUpOwotICAgICAgICAgICAgYXZpb193cml0ZShwYiwgc3BzLCBzcHNfc2l6ZSk7Ci0gICAgICAgICAgICBhdmlvX3c4KHBiLCAxKTsgLyogbnVtYmVyIG9mIHBwcyAqLwotICAgICAgICAgICAgYXZpb193YjE2KHBiLCBwcHNfc2l6ZSk7Ci0gICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBwcHMsIHBwc19zaXplKTsKLSAgICAgICAgICAgIGF2X2ZyZWUoc3RhcnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZpb193cml0ZShwYiwgZGF0YSwgbGVuKTsKLSAgICAgICAgfQorICAgIC8qIGNoZWNrIGZvciBILjI2NCBzdGFydCBjb2RlICovCisgICAgaWYgKEFWX1JCMzIoZGF0YSkgIT0gMHgwMDAwMDAwMSAmJgorICAgICAgICBBVl9SQjI0KGRhdGEpICE9IDB4MDAwMDAxKSB7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIGRhdGEsIGxlbik7CisgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gMDsKKworICAgIHJldCA9IGZmX2F2Y19wYXJzZV9uYWxfdW5pdHNfYnVmKGRhdGEsICZidWYsICZsZW4pOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHN0YXJ0ID0gYnVmOworICAgIGVuZCA9IGJ1ZiArIGxlbjsKKworICAgIHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZzcHNfcGIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJnBwc19wYik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIGxvb2sgZm9yIHNwcyBhbmQgcHBzICovCisgICAgd2hpbGUgKGVuZCAtIGJ1ZiA+IDQpIHsKKyAgICAgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAgICAgdWludDhfdCBuYWxfdHlwZTsKKyAgICAgICAgc2l6ZSA9IEZGTUlOKEFWX1JCMzIoYnVmKSwgZW5kIC0gYnVmIC0gNCk7CisgICAgICAgIGJ1ZiArPSA0OworICAgICAgICBuYWxfdHlwZSA9IGJ1ZlswXSAmIDB4MWY7CisKKyAgICAgICAgaWYgKG5hbF90eXBlID09IDcpIHsgLyogU1BTICovCisgICAgICAgICAgICBuYl9zcHMrKzsKKyAgICAgICAgICAgIGlmIChzaXplID4gVUlOVDE2X01BWCB8fCBuYl9zcHMgPj0gSDI2NF9NQVhfU1BTX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX3diMTYoc3BzX3BiLCBzaXplKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUoc3BzX3BiLCBidWYsIHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG5hbF90eXBlID09IDgpIHsgLyogUFBTICovCisgICAgICAgICAgICBuYl9wcHMrKzsKKyAgICAgICAgICAgIGlmIChzaXplID4gVUlOVDE2X01BWCB8fCBuYl9wcHMgPj0gSDI2NF9NQVhfUFBTX0NPVU5UKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdmlvX3diMTYocHBzX3BiLCBzaXplKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUocHBzX3BiLCBidWYsIHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgYnVmICs9IHNpemU7CisgICAgfQorICAgIHNwc19zaXplID0gYXZpb19jbG9zZV9keW5fYnVmKHNwc19wYiwgJnNwcyk7CisgICAgcHBzX3NpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYocHBzX3BiLCAmcHBzKTsKKworICAgIGlmIChzcHNfc2l6ZSA8IDYgfHwgIXBwc19zaXplKSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdmlvX3c4KHBiLCAxKTsgLyogdmVyc2lvbiAqLworICAgIGF2aW9fdzgocGIsIHNwc1szXSk7IC8qIHByb2ZpbGUgKi8KKyAgICBhdmlvX3c4KHBiLCBzcHNbNF0pOyAvKiBwcm9maWxlIGNvbXBhdCAqLworICAgIGF2aW9fdzgocGIsIHNwc1s1XSk7IC8qIGxldmVsICovCisgICAgYXZpb193OChwYiwgMHhmZik7IC8qIDYgYml0cyByZXNlcnZlZCAoMTExMTExKSArIDIgYml0cyBuYWwgc2l6ZSBsZW5ndGggLSAxICgxMSkgKi8KKyAgICBhdmlvX3c4KHBiLCAweGUwIHwgbmJfc3BzKTsgLyogMyBiaXRzIHJlc2VydmVkICgxMTEpICsgNSBiaXRzIG51bWJlciBvZiBzcHMgKi8KKworICAgIGF2aW9fd3JpdGUocGIsIHNwcywgc3BzX3NpemUpOworICAgIGF2aW9fdzgocGIsIG5iX3Bwcyk7IC8qIG51bWJlciBvZiBwcHMgKi8KKyAgICBhdmlvX3dyaXRlKHBiLCBwcHMsIHBwc19zaXplKTsKKworZmFpbDoKKyAgICBpZiAoIXNwcykKKyAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKHNwc19wYiwgJnNwcyk7CisgICAgaWYgKCFwcHMpCisgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1ZihwcHNfcGIsICZwcHMpOworICAgIGF2X2ZyZWUoc3BzKTsKKyAgICBhdl9mcmVlKHBwcyk7CisgICAgYXZfZnJlZShzdGFydCk7CisKKyAgICByZXR1cm4gcmV0OwogfQogCiBpbnQgZmZfYXZjX3dyaXRlX2FubmV4Yl9leHRyYWRhdGEoY29uc3QgdWludDhfdCAqaW4sIHVpbnQ4X3QgKipidWYsIGludCAqc2l6ZSkKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2F2Zm9ybWF0LmggYi9saWJhdmZvcm1hdC9hdmZvcm1hdC5oCmluZGV4IDM0YmFkNDMuLmEyZmU3YzYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgKKysrIGIvbGliYXZmb3JtYXQvYXZmb3JtYXQuaApAQCAtMjgsOCArMjgsOCBAQAogICovCiAKIC8qKgotICogQGRlZmdyb3VwIGxpYmF2ZiBJL08gYW5kIE11eGluZy9EZW11eGluZyBMaWJyYXJ5Ci0gKiBAeworICogQGRlZmdyb3VwIGxpYmF2ZiBsaWJhdmZvcm1hdAorICogSS9PIGFuZCBNdXhpbmcvRGVtdXhpbmcgTGlicmFyeQogICoKICAqIExpYmF2Zm9ybWF0IChsYXZmKSBpcyBhIGxpYnJhcnkgZm9yIGRlYWxpbmcgd2l0aCB2YXJpb3VzIG1lZGlhIGNvbnRhaW5lcgogICogZm9ybWF0cy4gSXRzIG1haW4gdHdvIHB1cnBvc2VzIGFyZSBkZW11eGluZyAtIGkuZS4gc3BsaXR0aW5nIGEgbWVkaWEgZmlsZQpAQCAtOTAsNiArOTAsOCBAQAogICogYm90aCBsb2NhbCBhbmQgcmVtb3RlIGZpbGVzLCBwYXJ0cyBvZiB0aGVtLCBjb25jYXRlbmF0aW9ucyBvZiB0aGVtLCBsb2NhbAogICogYXVkaW8gYW5kIHZpZGVvIGRldmljZXMgYW5kIHNvIG9uLgogICoKKyAqIEB7CisgKgogICogQGRlZmdyb3VwIGxhdmZfZGVjb2RpbmcgRGVtdXhpbmcKICAqIEB7CiAgKiBEZW11eGVycyByZWFkIGEgbWVkaWEgZmlsZSBhbmQgc3BsaXQgaXQgaW50byBjaHVua3Mgb2YgZGF0YSAoQGVtIHBhY2tldHMpLiBBCkBAIC0xNjEsOCArMTYzLDggQEAKICAqIGF2X3JlYWRfZnJhbWUoKSBvbiBpdC4gRWFjaCBjYWxsLCBpZiBzdWNjZXNzZnVsLCB3aWxsIHJldHVybiBhbiBBVlBhY2tldAogICogY29udGFpbmluZyBlbmNvZGVkIGRhdGEgZm9yIG9uZSBBVlN0cmVhbSwgaWRlbnRpZmllZCBieQogICogQVZQYWNrZXQuc3RyZWFtX2luZGV4LiBUaGlzIHBhY2tldCBtYXkgYmUgcGFzc2VkIHN0cmFpZ2h0IGludG8gdGhlIGxpYmF2Y29kZWMKLSAqIGRlY29kaW5nIGZ1bmN0aW9ucyBhdmNvZGVjX2RlY29kZV92aWRlbzIoKSwgYXZjb2RlY19kZWNvZGVfYXVkaW80KCkgb3IKLSAqIGF2Y29kZWNfZGVjb2RlX3N1YnRpdGxlMigpIGlmIHRoZSBjYWxsZXIgd2lzaGVzIHRvIGRlY29kZSB0aGUgZGF0YS4KKyAqIGRlY29kaW5nIGZ1bmN0aW9ucyBhdmNvZGVjX3NlbmRfcGFja2V0KCkgb3IgYXZjb2RlY19kZWNvZGVfc3VidGl0bGUyKCkgaWYgdGhlCisgKiBjYWxsZXIgd2lzaGVzIHRvIGRlY29kZSB0aGUgZGF0YS4KICAqCiAgKiBBVlBhY2tldC5wdHMsIEFWUGFja2V0LmR0cyBhbmQgQVZQYWNrZXQuZHVyYXRpb24gdGltaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUKICAqIHNldCBpZiBrbm93bi4gVGhleSBtYXkgYWxzbyBiZSB1bnNldCAoaS5lLiBBVl9OT1BUU19WQUxVRSBmb3IKQEAgLTIwMywxNSArMjA1LDE1IEBACiAgKiAgIGF2aW9fb3BlbjIoKSBvciBhIGN1c3RvbSBvbmUuCiAgKiAtIFVubGVzcyB0aGUgZm9ybWF0IGlzIG9mIHRoZSBBVkZNVF9OT1NUUkVBTVMgdHlwZSwgYXQgbGVhc3Qgb25lIHN0cmVhbSBtdXN0CiAgKiAgIGJlIGNyZWF0ZWQgd2l0aCB0aGUgYXZmb3JtYXRfbmV3X3N0cmVhbSgpIGZ1bmN0aW9uLiBUaGUgY2FsbGVyIHNob3VsZCBmaWxsCi0gKiAgIHRoZSBAcmVmIEFWU3RyZWFtLmNvZGVjICJzdHJlYW0gY29kZWMgY29udGV4dCIgaW5mb3JtYXRpb24sIHN1Y2ggYXMgdGhlCi0gKiAgIGNvZGVjIEByZWYgQVZDb2RlY0NvbnRleHQuY29kZWNfdHlwZSAidHlwZSIsIEByZWYgQVZDb2RlY0NvbnRleHQuY29kZWNfaWQKKyAqICAgdGhlIEByZWYgQVZTdHJlYW0uY29kZWNwYXIgInN0cmVhbSBjb2RlYyBwYXJhbWV0ZXJzIiBpbmZvcm1hdGlvbiwgc3VjaCBhcyB0aGUKKyAqICAgY29kZWMgQHJlZiBBVkNvZGVjUGFyYW1ldGVycy5jb2RlY190eXBlICJ0eXBlIiwgQHJlZiBBVkNvZGVjUGFyYW1ldGVycy5jb2RlY19pZAogICogICAiaWQiIGFuZCBvdGhlciBwYXJhbWV0ZXJzIChlLmcuIHdpZHRoIC8gaGVpZ2h0LCB0aGUgcGl4ZWwgb3Igc2FtcGxlIGZvcm1hdCwKICAqICAgZXRjLikgYXMga25vd24uIFRoZSBAcmVmIEFWU3RyZWFtLnRpbWVfYmFzZSAic3RyZWFtIHRpbWViYXNlIiBzaG91bGQKICAqICAgYmUgc2V0IHRvIHRoZSB0aW1lYmFzZSB0aGF0IHRoZSBjYWxsZXIgZGVzaXJlcyB0byB1c2UgZm9yIHRoaXMgc3RyZWFtIChub3RlCiAgKiAgIHRoYXQgdGhlIHRpbWViYXNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIG11eGVyIGNhbiBiZSBkaWZmZXJlbnQsIGFzIHdpbGwgYmUKICAqICAgZGVzY3JpYmVkIGxhdGVyKS4KICAqIC0gSXQgaXMgYWR2aXNlZCB0byBtYW51YWxseSBpbml0aWFsaXplIG9ubHkgdGhlIHJlbGV2YW50IGZpZWxkcyBpbgotICogICBBVkNvZGVjQ29udGV4dCwgcmF0aGVyIHRoYW4gdXNpbmcgQHJlZiBhdmNvZGVjX2NvcHlfY29udGV4dCgpIGR1cmluZworICogICBBVkNvZGVjUGFyYW1ldGVycywgcmF0aGVyIHRoYW4gdXNpbmcgQHJlZiBhdmNvZGVjX3BhcmFtZXRlcnNfY29weSgpIGR1cmluZwogICogICByZW11eGluZzogdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGNvZGVjIGNvbnRleHQgdmFsdWVzIHJlbWFpbiB2YWxpZAogICogICBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGZvcm1hdCBjb250ZXh0cy4KICAqIC0gVGhlIGNhbGxlciBtYXkgZmlsbCBpbiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBzdWNoIGFzIEByZWYKQEAgLTMxMCw3ICszMTIsNiBAQAogICogQHsKICAqIEB9CiAgKiBAfQotICoKICAqLwogCiAjaW5jbHVkZSA8dGltZS5oPgpAQCAtNDM2LDE5ICs0MzcsNiBAQAogICovCiBpbnQgYXZfYXBwZW5kX3BhY2tldChBVklPQ29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwgaW50IHNpemUpOwogCi0jaWYgRkZfQVBJX0xBVkZfRlJBQwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBmcmFjdGlvbmFsIG51bWJlcnMgZm9yIGV4YWN0IHB0cyBoYW5kbGluZyAqLwotCi0vKioKLSAqIFRoZSBleGFjdCB2YWx1ZSBvZiB0aGUgZnJhY3Rpb25hbCBudW1iZXIgaXM6ICd2YWwgKyBudW0gLyBkZW4nLgotICogbnVtIGlzIGFzc3VtZWQgdG8gYmUgMCA8PSBudW0gPCBkZW4uCi0gKi8KLXR5cGVkZWYgc3RydWN0IEFWRnJhYyB7Ci0gICAgaW50NjRfdCB2YWwsIG51bSwgZGVuOwotfSBBVkZyYWM7Ci0jZW5kaWYKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiBpbnB1dC9vdXRwdXQgZm9ybWF0cyAqLwogCkBAIC00NzcsMTAgKzQ2NSw2IEBACiAjZGVmaW5lIEFWRk1UX05PRklMRSAgICAgICAgMHgwMDAxCiAjZGVmaW5lIEFWRk1UX05FRUROVU1CRVIgICAgMHgwMDAyIC8qKjwgTmVlZHMgJyVkJyBpbiBmaWxlbmFtZS4gKi8KICNkZWZpbmUgQVZGTVRfU0hPV19JRFMgICAgICAweDAwMDggLyoqPCBTaG93IGZvcm1hdCBzdHJlYW0gSURzIG51bWJlcnMuICovCi0jaWYgRkZfQVBJX0xBVkZfRk1UX1JBV1BJQ1RVUkUKLSNkZWZpbmUgQVZGTVRfUkFXUElDVFVSRSAgICAweDAwMjAgLyoqPCBGb3JtYXQgd2FudHMgQVZQaWN0dXJlIHN0cnVjdHVyZSBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3IHBpY3R1cmUgZGF0YS4gQGRlcHJlY2F0ZWQgTm90IHVzZWQgYW55bW9yZSAqLwotI2VuZGlmCiAjZGVmaW5lIEFWRk1UX0dMT0JBTEhFQURFUiAgMHgwMDQwIC8qKjwgRm9ybWF0IHdhbnRzIGdsb2JhbCBoZWFkZXIuICovCiAjZGVmaW5lIEFWRk1UX05PVElNRVNUQU1QUyAgMHgwMDgwIC8qKjwgRm9ybWF0IGRvZXMgbm90IG5lZWQgLyBoYXZlIGFueSB0aW1lc3RhbXBzLiAqLwogI2RlZmluZSBBVkZNVF9HRU5FUklDX0lOREVYIDB4MDEwMCAvKio8IFVzZSBnZW5lcmljIGluZGV4IGJ1aWxkaW5nIGNvZGUuICovCkBAIC01MjgsNyArNTEyLDcgQEAKICAgICAgKiBjYW4gdXNlIGZsYWdzOiBBVkZNVF9OT0ZJTEUsIEFWRk1UX05FRUROVU1CRVIsCiAgICAgICogQVZGTVRfR0xPQkFMSEVBREVSLCBBVkZNVF9OT1RJTUVTVEFNUFMsIEFWRk1UX1ZBUklBQkxFX0ZQUywKICAgICAgKiBBVkZNVF9OT0RJTUVOU0lPTlMsIEFWRk1UX05PU1RSRUFNUywgQVZGTVRfQUxMT1dfRkxVU0gsCi0gICAgICogQVZGTVRfVFNfTk9OU1RSSUNUCisgICAgICogQVZGTVRfVFNfTk9OU1RSSUNULCBBVkZNVF9UU19ORUdBVElWRQogICAgICAqLwogICAgIGludCBmbGFnczsKIApAQCAtNjE3LDYgKzYwMSw4IEBACiAgICAgICogQVZTdHJlYW0gcGFyYW1ldGVycyB0aGF0IG5lZWQgdG8gYmUgc2V0IGJlZm9yZSBwYWNrZXRzIGFyZSBzZW50LgogICAgICAqIFRoaXMgbWV0aG9kIG11c3Qgbm90IHdyaXRlIG91dHB1dC4KICAgICAgKgorICAgICAqIFJldHVybiAwIGlmIHN0cmVhbXMgd2VyZSBmdWxseSBjb25maWd1cmVkLCAxIGlmIG5vdCwgbmVnYXRpdmUgQVZFUlJPUiBvbiBmYWlsdXJlCisgICAgICoKICAgICAgKiBBbnkgYWxsb2NhdGlvbnMgbWFkZSBoZXJlIG11c3QgYmUgZnJlZWQgaW4gZGVpbml0KCkuCiAgICAgICovCiAgICAgaW50ICgqaW5pdCkoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqKTsKQEAgLTc5OSw5ICs3ODUsOSBAQAogICAgIEFWU1RSRUFNX1BBUlNFX0hFQURFUlMsICAgIC8qKjwgT25seSBwYXJzZSBoZWFkZXJzLCBkbyBub3QgcmVwYWNrLiAqLwogICAgIEFWU1RSRUFNX1BBUlNFX1RJTUVTVEFNUFMsIC8qKjwgZnVsbCBwYXJzaW5nIGFuZCBpbnRlcnBvbGF0aW9uIG9mIHRpbWVzdGFtcHMgZm9yIGZyYW1lcyBub3Qgc3RhcnRpbmcgb24gYSBwYWNrZXQgYm91bmRhcnkgKi8KICAgICBBVlNUUkVBTV9QQVJTRV9GVUxMX09OQ0UsICAvKio8IGZ1bGwgcGFyc2luZyBhbmQgcmVwYWNrIG9mIHRoZSBmaXJzdCBmcmFtZSBvbmx5LCBvbmx5IGltcGxlbWVudGVkIGZvciBILjI2NCBjdXJyZW50bHkgKi8KLSAgICBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVz1NS1RBRygwLCdSJywnQScsJ1cnKSwgICAgICAgLyoqPCBmdWxsIHBhcnNpbmcgYW5kIHJlcGFjayB3aXRoIHRpbWVzdGFtcCBhbmQgcG9zaXRpb24gZ2VuZXJhdGlvbiBieSBwYXJzZXIgZm9yIHJhdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYXNzdW1lcyB0aGF0IGVhY2ggcGFja2V0IGluIHRoZSBmaWxlIGNvbnRhaW5zIG5vIGRlbXV4ZXIgbGV2ZWwgaGVhZGVycyBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IGNvZGVjIGxldmVsIGRhdGEsIG90aGVyd2lzZSBwb3NpdGlvbiBnZW5lcmF0aW9uIHdvdWxkIGZhaWwgKi8KKyAgICBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVywgICAvKio8IGZ1bGwgcGFyc2luZyBhbmQgcmVwYWNrIHdpdGggdGltZXN0YW1wIGFuZCBwb3NpdGlvbiBnZW5lcmF0aW9uIGJ5IHBhcnNlciBmb3IgcmF3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGFzc3VtZXMgdGhhdCBlYWNoIHBhY2tldCBpbiB0aGUgZmlsZSBjb250YWlucyBubyBkZW11eGVyIGxldmVsIGhlYWRlcnMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IGNvZGVjIGxldmVsIGRhdGEsIG90aGVyd2lzZSBwb3NpdGlvbiBnZW5lcmF0aW9uIHdvdWxkIGZhaWwgKi8KIH07CiAKIHR5cGVkZWYgc3RydWN0IEFWSW5kZXhFbnRyeSB7CkBAIC04MTMsNiArNzk5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlzIGtub3duCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgQVZJTkRFWF9LRVlGUkFNRSAweDAwMDEKKyNkZWZpbmUgQVZJTkRFWF9ESVNDQVJEX0ZSQU1FICAweDAwMDIgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEZsYWcgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBmcmFtZSBzaG91bGQgYmUgZGlzY2FyZGVkIGFmdGVyIGRlY29kaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBpbnQgZmxhZ3M6MjsKICAgICBpbnQgc2l6ZTozMDsgLy9ZZWFoLCB0cnlpbmcgdG8ga2VlcCB0aGUgc2l6ZSBvZiB0aGlzIHNtYWxsIHRvIHJlZHVjZSBtZW1vcnkgcmVxdWlyZW1lbnRzIChpdCBpcyAyNCB2cy4gMzIgYnl0ZXMgZHVlIHRvIHBvc3NpYmxlIDgtYnl0ZSBhbGlnbm1lbnQpLgogICAgIGludCBtaW5fZGlzdGFuY2U7ICAgICAgICAgLyoqPCBNaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gdGhpcyBhbmQgdGhlIHByZXZpb3VzIGtleWZyYW1lLCB1c2VkIHRvIGF2b2lkIHVubmVlZGVkIHNlYXJjaGluZy4gKi8KQEAgLTgzNiwxMSArODI1LDE3IEBACiAjZGVmaW5lIEFWX0RJU1BPU0lUSU9OX0NMRUFOX0VGRkVDVFMgICAgIDB4MDIwMCAgLyoqPCBzdHJlYW0gd2l0aG91dCB2b2ljZSAqLwogLyoqCiAgKiBUaGUgc3RyZWFtIGlzIHN0b3JlZCBpbiB0aGUgZmlsZSBhcyBhbiBhdHRhY2hlZCBwaWN0dXJlLyJjb3ZlciBhcnQiIChlLmcuCi0gKiBBUElDIGZyYW1lIGluIElEM3YyKS4gVGhlIHNpbmdsZSBwYWNrZXQgYXNzb2NpYXRlZCB3aXRoIGl0IHdpbGwgYmUgcmV0dXJuZWQKLSAqIGFtb25nIHRoZSBmaXJzdCBmZXcgcGFja2V0cyByZWFkIGZyb20gdGhlIGZpbGUgdW5sZXNzIHNlZWtpbmcgdGFrZXMgcGxhY2UuCi0gKiBJdCBjYW4gYWxzbyBiZSBhY2Nlc3NlZCBhdCBhbnkgdGltZSBpbiBBVlN0cmVhbS5hdHRhY2hlZF9waWMuCisgKiBBUElDIGZyYW1lIGluIElEM3YyKS4gVGhlIGZpcnN0ICh1c3VhbGx5IG9ubHkpIHBhY2tldCBhc3NvY2lhdGVkIHdpdGggaXQKKyAqIHdpbGwgYmUgcmV0dXJuZWQgYW1vbmcgdGhlIGZpcnN0IGZldyBwYWNrZXRzIHJlYWQgZnJvbSB0aGUgZmlsZSB1bmxlc3MKKyAqIHNlZWtpbmcgdGFrZXMgcGxhY2UuIEl0IGNhbiBhbHNvIGJlIGFjY2Vzc2VkIGF0IGFueSB0aW1lIGluCisgKiBBVlN0cmVhbS5hdHRhY2hlZF9waWMuCiAgKi8KICNkZWZpbmUgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDICAgICAgMHgwNDAwCisvKioKKyAqIFRoZSBzdHJlYW0gaXMgc3BhcnNlLCBhbmQgY29udGFpbnMgdGh1bWJuYWlsIGltYWdlcywgb2Z0ZW4gY29ycmVzcG9uZGluZworICogdG8gY2hhcHRlciBtYXJrZXJzLiBPbmx5IGV2ZXIgdXNlZCB3aXRoIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQy4KKyAqLworI2RlZmluZSBBVl9ESVNQT1NJVElPTl9USU1FRF9USFVNQk5BSUxTICAweDA4MDAKIAogdHlwZWRlZiBzdHJ1Y3QgQVZTdHJlYW1JbnRlcm5hbCBBVlN0cmVhbUludGVybmFsOwogCkBAIC04NTAsNiArODQ1LDcgQEAKICNkZWZpbmUgQVZfRElTUE9TSVRJT05fQ0FQVElPTlMgICAgIDB4MTAwMDAKICNkZWZpbmUgQVZfRElTUE9TSVRJT05fREVTQ1JJUFRJT05TIDB4MjAwMDAKICNkZWZpbmUgQVZfRElTUE9TSVRJT05fTUVUQURBVEEgICAgIDB4NDAwMDAKKyNkZWZpbmUgQVZfRElTUE9TSVRJT05fREVQRU5ERU5UICAgIDB4ODAwMDAgLy8vPCBkZXBlbmRlbnQgYXVkaW8gc3RyZWFtIChtaXhfdHlwZT0wIGluIG1wZWd0cykKIAogLyoqCiAgKiBPcHRpb25zIGZvciBiZWhhdmlvciBvbiB0aW1lc3RhbXAgd3JhcCBkZXRlY3Rpb24uCkBAIC04NzMsMjcgKzg2OSwxNCBAQAogICAgICAqIGVuY29kaW5nOiBzZXQgYnkgdGhlIHVzZXIsIHJlcGxhY2VkIGJ5IGxpYmF2Zm9ybWF0IGlmIGxlZnQgdW5zZXQKICAgICAgKi8KICAgICBpbnQgaWQ7CisjaWYgRkZfQVBJX0xBVkZfQVZDVFgKICAgICAvKioKLSAgICAgKiBDb2RlYyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0cmVhbS4gQWxsb2NhdGVkIGFuZCBmcmVlZCBieQotICAgICAqIGxpYmF2Zm9ybWF0LgotICAgICAqCi0gICAgICogLSBkZWNvZGluZzogVGhlIGRlbXV4ZXIgZXhwb3J0cyBjb2RlYyBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGhlYWRlcnMKLSAgICAgKiAgICAgICAgICAgICBoZXJlLgotICAgICAqIC0gZW5jb2Rpbmc6IFRoZSB1c2VyIHNldHMgY29kZWMgaW5mb3JtYXRpb24sIHRoZSBtdXhlciB3cml0ZXMgaXQgdG8gdGhlCi0gICAgICogICAgICAgICAgICAgb3V0cHV0LiBNYW5kYXRvcnkgZmllbGRzIGFzIHNwZWNpZmllZCBpbiBBVkNvZGVjQ29udGV4dAotICAgICAqICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gbXVzdCBiZSBzZXQgZXZlbiBpZiB0aGlzIEFWQ29kZWNDb250ZXh0IGlzCi0gICAgICogICAgICAgICAgICAgbm90IGFjdHVhbGx5IHVzZWQgZm9yIGVuY29kaW5nLgotICAgICAqLwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKLSAgICB2b2lkICpwcml2X2RhdGE7Ci0KLSNpZiBGRl9BUElfTEFWRl9GUkFDCi0gICAgLyoqCi0gICAgICogQGRlcHJlY2F0ZWQgdGhpcyBmaWVsZCBpcyB1bnVzZWQKKyAgICAgKiBAZGVwcmVjYXRlZCB1c2UgdGhlIGNvZGVjcGFyIHN0cnVjdCBpbnN0ZWFkCiAgICAgICovCiAgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKLSAgICBzdHJ1Y3QgQVZGcmFjIHB0czsKKyAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CiAjZW5kaWYKKyAgICB2b2lkICpwcml2X2RhdGE7CiAKICAgICAvKioKICAgICAgKiBUaGlzIGlzIHRoZSBmdW5kYW1lbnRhbCB1bml0IG9mIHRpbWUgKGluIHNlY29uZHMpIGluIHRlcm1zCkBAIC05MjMsNiArOTA2LDkgQEAKICAgICAgKiBEZWNvZGluZzogZHVyYXRpb24gb2YgdGhlIHN0cmVhbSwgaW4gc3RyZWFtIHRpbWUgYmFzZS4KICAgICAgKiBJZiBhIHNvdXJjZSBmaWxlIGRvZXMgbm90IHNwZWNpZnkgYSBkdXJhdGlvbiwgYnV0IGRvZXMgc3BlY2lmeQogICAgICAqIGEgYml0cmF0ZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGVzdGltYXRlZCBmcm9tIGJpdHJhdGUgYW5kIGZpbGUgc2l6ZS4KKyAgICAgKgorICAgICAqIEVuY29kaW5nOiBNYXkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpIHRvCisgICAgICogcHJvdmlkZSBhIGhpbnQgdG8gdGhlIG11eGVyIGFib3V0IHRoZSBlc3RpbWF0ZWQgZHVyYXRpb24uCiAgICAgICovCiAgICAgaW50NjRfdCBkdXJhdGlvbjsKIApAQCAtOTkxLDE4ICs5NzcsNTMgQEAKICAgICBpbnQgZXZlbnRfZmxhZ3M7CiAjZGVmaW5lIEFWU1RSRUFNX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRCAweDAwMDEgLy8vPCBUaGUgY2FsbCByZXN1bHRlZCBpbiB1cGRhdGVkIG1ldGFkYXRhLgogCisgICAgLyoqCisgICAgICogUmVhbCBiYXNlIGZyYW1lcmF0ZSBvZiB0aGUgc3RyZWFtLgorICAgICAqIFRoaXMgaXMgdGhlIGxvd2VzdCBmcmFtZXJhdGUgd2l0aCB3aGljaCBhbGwgdGltZXN0YW1wcyBjYW4gYmUKKyAgICAgKiByZXByZXNlbnRlZCBhY2N1cmF0ZWx5IChpdCBpcyB0aGUgbGVhc3QgY29tbW9uIG11bHRpcGxlIG9mIGFsbAorICAgICAqIGZyYW1lcmF0ZXMgaW4gdGhlIHN0cmVhbSkuIE5vdGUsIHRoaXMgdmFsdWUgaXMganVzdCBhIGd1ZXNzIQorICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgdGltZSBiYXNlIGlzIDEvOTAwMDAgYW5kIGFsbCBmcmFtZXMgaGF2ZSBlaXRoZXIKKyAgICAgKiBhcHByb3hpbWF0ZWx5IDM2MDAgb3IgMTgwMCB0aW1lciB0aWNrcywgdGhlbiByX2ZyYW1lX3JhdGUgd2lsbCBiZSA1MC8xLgorICAgICAqLworICAgIEFWUmF0aW9uYWwgcl9mcmFtZV9yYXRlOworCisjaWYgRkZfQVBJX0xBVkZfRkZTRVJWRVIKKyAgICAvKioKKyAgICAgKiBTdHJpbmcgY29udGFpbmluZyBwYWlycyBvZiBrZXkgYW5kIHZhbHVlcyBkZXNjcmliaW5nIHJlY29tbWVuZGVkIGVuY29kZXIgY29uZmlndXJhdGlvbi4KKyAgICAgKiBQYWlycyBhcmUgc2VwYXJhdGVkIGJ5ICcsJy4KKyAgICAgKiBLZXlzIGFyZSBzZXBhcmF0ZWQgZnJvbSB2YWx1ZXMgYnkgJz0nLgorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgdW51c2VkCisgICAgICovCisgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKKyAgICBjaGFyICpyZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb247CisjZW5kaWYKKworICAgIC8qKgorICAgICAqIENvZGVjIHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyZWFtLiBBbGxvY2F0ZWQgYW5kIGZyZWVkIGJ5CisgICAgICogbGliYXZmb3JtYXQgaW4gYXZmb3JtYXRfbmV3X3N0cmVhbSgpIGFuZCBhdmZvcm1hdF9mcmVlX2NvbnRleHQoKQorICAgICAqIHJlc3BlY3RpdmVseS4KKyAgICAgKgorICAgICAqIC0gZGVtdXhpbmc6IGZpbGxlZCBieSBsaWJhdmZvcm1hdCBvbiBzdHJlYW0gY3JlYXRpb24gb3IgaW4KKyAgICAgKiAgICAgICAgICAgICBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkKKyAgICAgKiAtIG11eGluZzogZmlsbGVkIGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGF2Zm9ybWF0X3dyaXRlX2hlYWRlcigpCisgICAgICovCisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmNvZGVjcGFyOworCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICogQWxsIGZpZWxkcyBiZWxvdyB0aGlzIGxpbmUgYXJlIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLiBUaGV5CiAgICAgICogbWF5IG5vdCBiZSB1c2VkIG91dHNpZGUgb2YgbGliYXZmb3JtYXQgYW5kIGNhbiBiZSBjaGFuZ2VkIGFuZAogICAgICAqIHJlbW92ZWQgYXQgd2lsbC4KLSAgICAgKiBOZXcgcHVibGljIGZpZWxkcyBzaG91bGQgYmUgYWRkZWQgcmlnaHQgYWJvdmUuCisgICAgICogSW50ZXJuYWwgbm90ZTogYmUgYXdhcmUgdGhhdCBwaHlzaWNhbGx5IHJlbW92aW5nIHRoZXNlIGZpZWxkcworICAgICAqIHdpbGwgYnJlYWsgQUJJLiBSZXBsYWNlIHJlbW92ZWQgZmllbGRzIHdpdGggZHVtbXkgZmllbGRzLCBhbmQKKyAgICAgKiBhZGQgbmV3IGZpZWxkcyB0byBBVlN0cmVhbUludGVybmFsLgogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAqLwogCi0gICAgLyoqCi0gICAgICogU3RyZWFtIGluZm9ybWF0aW9uIHVzZWQgaW50ZXJuYWxseSBieSBhdl9maW5kX3N0cmVhbV9pbmZvKCkKLSAgICAgKi8KICNkZWZpbmUgTUFYX1NURF9USU1FQkFTRVMgKDMwKjEyKzMwKzMrNikKKyAgICAvKioKKyAgICAgKiBTdHJlYW0gaW5mb3JtYXRpb24gdXNlZCBpbnRlcm5hbGx5IGJ5IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oKQorICAgICAqLwogICAgIHN0cnVjdCB7CiAgICAgICAgIGludDY0X3QgbGFzdF9kdHM7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb25fZ2NkOwpAQCAtMTAxMSw2ICsxMDMyLDcgQEAKICAgICAgICAgZG91YmxlICgqZHVyYXRpb25fZXJyb3IpWzJdW01BWF9TVERfVElNRUJBU0VTXTsKICAgICAgICAgaW50NjRfdCBjb2RlY19pbmZvX2R1cmF0aW9uOwogICAgICAgICBpbnQ2NF90IGNvZGVjX2luZm9fZHVyYXRpb25fZmllbGRzOworICAgICAgICBpbnQgZnJhbWVfZGVsYXlfZXZpZGVuY2U7CiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIDAgIC0+IGRlY29kZXIgaGFzIG5vdCBiZWVuIHNlYXJjaGVkIGZvciB5ZXQuCkBAIC0xMDUyLDcgKzEwNzQsNyBAQAogICAgIGludCBwcm9iZV9wYWNrZXRzOwogCiAgICAgLyoqCi0gICAgICogTnVtYmVyIG9mIGZyYW1lcyB0aGF0IGhhdmUgYmVlbiBkZW11eGVkIGR1cmluZyBhdl9maW5kX3N0cmVhbV9pbmZvKCkKKyAgICAgKiBOdW1iZXIgb2YgZnJhbWVzIHRoYXQgaGF2ZSBiZWVuIGRlbXV4ZWQgZHVyaW5nIGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oKQogICAgICAqLwogICAgIGludCBjb2RlY19pbmZvX25iX2ZyYW1lczsKIApAQCAtMTA3NCwxOSArMTA5Niw2IEBACiAgICAgdW5zaWduZWQgaW50IGluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemU7CiAKICAgICAvKioKLSAgICAgKiBSZWFsIGJhc2UgZnJhbWVyYXRlIG9mIHRoZSBzdHJlYW0uCi0gICAgICogVGhpcyBpcyB0aGUgbG93ZXN0IGZyYW1lcmF0ZSB3aXRoIHdoaWNoIGFsbCB0aW1lc3RhbXBzIGNhbiBiZQotICAgICAqIHJlcHJlc2VudGVkIGFjY3VyYXRlbHkgKGl0IGlzIHRoZSBsZWFzdCBjb21tb24gbXVsdGlwbGUgb2YgYWxsCi0gICAgICogZnJhbWVyYXRlcyBpbiB0aGUgc3RyZWFtKS4gTm90ZSwgdGhpcyB2YWx1ZSBpcyBqdXN0IGEgZ3Vlc3MhCi0gICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSB0aW1lIGJhc2UgaXMgMS85MDAwMCBhbmQgYWxsIGZyYW1lcyBoYXZlIGVpdGhlcgotICAgICAqIGFwcHJveGltYXRlbHkgMzYwMCBvciAxODAwIHRpbWVyIHRpY2tzLCB0aGVuIHJfZnJhbWVfcmF0ZSB3aWxsIGJlIDUwLzEuCi0gICAgICoKLSAgICAgKiBDb2RlIG91dHNpZGUgYXZmb3JtYXQgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nOgotICAgICAqIGF2X3N0cmVhbV9nZXQvc2V0X3JfZnJhbWVfcmF0ZShzdHJlYW0pCi0gICAgICovCi0gICAgQVZSYXRpb25hbCByX2ZyYW1lX3JhdGU7Ci0KLSAgICAvKioKICAgICAgKiBTdHJlYW0gSWRlbnRpZmllcgogICAgICAqIFRoaXMgaXMgdGhlIE1QRUctVFMgc3RyZWFtIGlkZW50aWZpZXIgKzEKICAgICAgKiAwIG1lYW5zIHVua25vd24KQEAgLTExOTIsMjEgKzEyMDEsMTIgQEAKICAgICBpbnQgaW5qZWN0X2dsb2JhbF9zaWRlX2RhdGE7CiAKICAgICAvKioKLSAgICAgKiBTdHJpbmcgY29udGFpbmluZyBwYXJpcyBvZiBrZXkgYW5kIHZhbHVlcyBkZXNjcmliaW5nIHJlY29tbWVuZGVkIGVuY29kZXIgY29uZmlndXJhdGlvbi4KLSAgICAgKiBQYXJpcyBhcmUgc2VwYXJhdGVkIGJ5ICcsJy4KLSAgICAgKiBLZXlzIGFyZSBzZXBhcmF0ZWQgZnJvbSB2YWx1ZXMgYnkgJz0nLgotICAgICAqLwotICAgIGNoYXIgKnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbjsKLQotICAgIC8qKgogICAgICAqIGRpc3BsYXkgYXNwZWN0IHJhdGlvICgwIGlmIHVua25vd24pCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCiAgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Zm9ybWF0IHRvIGNhbGN1bGF0ZSBzYW1wbGVfYXNwZWN0X3JhdGlvIGludGVybmFsbHkKICAgICAgKi8KICAgICBBVlJhdGlvbmFsIGRpc3BsYXlfYXNwZWN0X3JhdGlvOwogCi0gICAgc3RydWN0IEZGRnJhYyAqcHJpdl9wdHM7Ci0KICAgICAvKioKICAgICAgKiBBbiBvcGFxdWUgZmllbGQgZm9yIGxpYmF2Zm9ybWF0IGludGVybmFsIHVzYWdlLgogICAgICAqIE11c3Qgbm90IGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgYnkgY2FsbGVycy4KQEAgLTEyMTQsMTEgKzEyMTQsMjQgQEAKICAgICBBVlN0cmVhbUludGVybmFsICppbnRlcm5hbDsKIH0gQVZTdHJlYW07CiAKKyNpZiBGRl9BUElfRk9STUFUX0dFVF9TRVQKKy8qKgorICogQWNjZXNzb3JzIGZvciBzb21lIEFWU3RyZWFtIGZpZWxkcy4gVGhlc2UgdXNlZCB0byBiZSBwcm92aWRlZCBmb3IgQUJJCisgKiBjb21wYXRpYmlsaXR5LCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgdXNlZCBhbnltb3JlLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogQVZSYXRpb25hbCBhdl9zdHJlYW1fZ2V0X3JfZnJhbWVfcmF0ZShjb25zdCBBVlN0cmVhbSAqcyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICAgICBhdl9zdHJlYW1fc2V0X3JfZnJhbWVfcmF0ZShBVlN0cmVhbSAqcywgQVZSYXRpb25hbCByKTsKLXN0cnVjdCBBVkNvZGVjUGFyc2VyQ29udGV4dCAqYXZfc3RyZWFtX2dldF9wYXJzZXIoY29uc3QgQVZTdHJlYW0gKnMpOworI2lmIEZGX0FQSV9MQVZGX0ZGU0VSVkVSCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogY2hhciogYXZfc3RyZWFtX2dldF9yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24oY29uc3QgQVZTdHJlYW0gKnMpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgIGF2X3N0cmVhbV9zZXRfcmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKEFWU3RyZWFtICpzLCBjaGFyICpjb25maWd1cmF0aW9uKTsKKyNlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBBVkNvZGVjUGFyc2VyQ29udGV4dCAqYXZfc3RyZWFtX2dldF9wYXJzZXIoY29uc3QgQVZTdHJlYW0gKnMpOwogCiAvKioKICAqIFJldHVybnMgdGhlIHB0cyBvZiB0aGUgbGFzdCBtdXhlZCBwYWNrZXQgKyBpdHMgZHVyYXRpb24KQEAgLTEyNjMsNiArMTI3NiwxMSBAQAogCiAjZGVmaW5lIEFWRk1UQ1RYX05PSEVBREVSICAgICAgMHgwMDAxIC8qKjwgc2lnbmFsIHRoYXQgbm8gaGVhZGVyIGlzIHByZXNlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbXMgYXJlIGFkZGVkIGR5bmFtaWNhbGx5KSAqLworI2RlZmluZSBBVkZNVENUWF9VTlNFRUtBQkxFICAgIDB4MDAwMiAvKio8IHNpZ25hbCB0aGF0IHRoZSBzdHJlYW0gaXMgZGVmaW5pdGVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2Vla2FibGUsIGFuZCBhdHRlbXB0cyB0byBjYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVrIGZ1bmN0aW9uIHdpbGwgZmFpbC4gRm9yIHNvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayBwcm90b2NvbHMgKGUuZy4gSExTKSwgdGhpcyBjYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWUuICovCiAKIHR5cGVkZWYgc3RydWN0IEFWQ2hhcHRlciB7CiAgICAgaW50IGlkOyAgICAgICAgICAgICAgICAgLy8vPCB1bmlxdWUgSUQgdG8gaWRlbnRpZnkgdGhlIGNoYXB0ZXIKQEAgLTEzMDAsNiArMTMxOCwxMiBAQAogICogdmVyc2lvbiBidW1wLgogICogc2l6ZW9mKEFWRm9ybWF0Q29udGV4dCkgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIGxpYmF2KiwgdXNlCiAgKiBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkgdG8gY3JlYXRlIGFuIEFWRm9ybWF0Q29udGV4dC4KKyAqCisgKiBGaWVsZHMgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggQVZPcHRpb25zIChhdl9vcHQqKSwKKyAqIHRoZSBuYW1lIHN0cmluZyB1c2VkIG1hdGNoZXMgdGhlIGFzc29jaWF0ZWQgY29tbWFuZCBsaW5lIHBhcmFtZXRlciBuYW1lIGFuZAorICogY2FuIGJlIGZvdW5kIGluIGxpYmF2Zm9ybWF0L29wdGlvbnNfdGFibGUuaC4KKyAqIFRoZSBBVk9wdGlvbi9jb21tYW5kIGxpbmUgcGFyYW1ldGVyIG5hbWVzIGRpZmZlciBpbiBzb21lIGNhc2VzIGZyb20gdGhlIEMKKyAqIHN0cnVjdHVyZSBmaWVsZCBuYW1lcyBmb3IgaGlzdG9yaWMgcmVhc29ucyBvciBicmV2aXR5LgogICovCiB0eXBlZGVmIHN0cnVjdCBBVkZvcm1hdENvbnRleHQgewogICAgIC8qKgpAQCAtMTM3MSwxMyArMTM5NSwzMyBAQAogICAgICAqLwogICAgIEFWU3RyZWFtICoqc3RyZWFtczsKIAorI2lmIEZGX0FQSV9GT1JNQVRfRklMRU5BTUUKICAgICAvKioKICAgICAgKiBpbnB1dCBvciBvdXRwdXQgZmlsZW5hbWUKICAgICAgKgogICAgICAqIC0gZGVtdXhpbmc6IHNldCBieSBhdmZvcm1hdF9vcGVuX2lucHV0KCkKICAgICAgKiAtIG11eGluZzogbWF5IGJlIHNldCBieSB0aGUgY2FsbGVyIGJlZm9yZSBhdmZvcm1hdF93cml0ZV9oZWFkZXIoKQorICAgICAqCisgICAgICogQGRlcHJlY2F0ZWQgVXNlIHVybCBpbnN0ZWFkLgogICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCiAgICAgY2hhciBmaWxlbmFtZVsxMDI0XTsKKyNlbmRpZgorCisgICAgLyoqCisgICAgICogaW5wdXQgb3Igb3V0cHV0IFVSTC4gVW5saWtlIHRoZSBvbGQgZmlsZW5hbWUgZmllbGQsIHRoaXMgZmllbGQgaGFzIG5vCisgICAgICogbGVuZ3RoIHJlc3RyaWN0aW9uLgorICAgICAqCisgICAgICogLSBkZW11eGluZzogc2V0IGJ5IGF2Zm9ybWF0X29wZW5faW5wdXQoKSwgaW5pdGlhbGl6ZWQgdG8gYW4gZW1wdHkKKyAgICAgKiAgICAgICAgICAgICBzdHJpbmcgaWYgdXJsIHBhcmFtZXRlciB3YXMgTlVMTCBpbiBhdmZvcm1hdF9vcGVuX2lucHV0KCkuCisgICAgICogLSBtdXhpbmc6IG1heSBiZSBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgY2FsbGluZyBhdmZvcm1hdF93cml0ZV9oZWFkZXIoKQorICAgICAqICAgICAgICAgICAob3IgYXZmb3JtYXRfaW5pdF9vdXRwdXQoKSBpZiB0aGF0IGlzIGNhbGxlZCBmaXJzdCkgdG8gYSBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgd2hpY2ggaXMgZnJlZWFibGUgYnkgYXZfZnJlZSgpLiBTZXQgdG8gYW4gZW1wdHkgc3RyaW5nIGlmIGl0CisgICAgICogICAgICAgICAgIHdhcyBOVUxMIGluIGF2Zm9ybWF0X2luaXRfb3V0cHV0KCkuCisgICAgICoKKyAgICAgKiBGcmVlZCBieSBsaWJhdmZvcm1hdCBpbiBhdmZvcm1hdF9mcmVlX2NvbnRleHQoKS4KKyAgICAgKi8KKyAgICBjaGFyICp1cmw7CiAKICAgICAvKioKICAgICAgKiBQb3NpdGlvbiBvZiB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlIGNvbXBvbmVudCwgaW4KQEAgLTE0MzMsOCArMTQ3NywxMiBAQAogI2RlZmluZSBBVkZNVF9GTEFHX01QNEFfTEFUTSAgICAweDgwMDAgLy8vPCBFbmFibGUgUlRQIE1QNEEtTEFUTSBwYXlsb2FkCiAjZGVmaW5lIEFWRk1UX0ZMQUdfU09SVF9EVFMgICAgMHgxMDAwMCAvLy88IHRyeSB0byBpbnRlcmxlYXZlIG91dHB1dHRlZCBwYWNrZXRzIGJ5IGR0cyAodXNpbmcgdGhpcyBmbGFnIGNhbiBzbG93IGRlbXV4aW5nIGRvd24pCiAjZGVmaW5lIEFWRk1UX0ZMQUdfUFJJVl9PUFQgICAgMHgyMDAwMCAvLy88IEVuYWJsZSB1c2Ugb2YgcHJpdmF0ZSBvcHRpb25zIGJ5IGRlbGF5aW5nIGNvZGVjIG9wZW4gKHRoaXMgY291bGQgYmUgbWFkZSBkZWZhdWx0IG9uY2UgYWxsIGNvZGUgaXMgY29udmVydGVkKQotI2RlZmluZSBBVkZNVF9GTEFHX0tFRVBfU0lERV9EQVRBIDB4NDAwMDAgLy8vPCBEb24ndCBtZXJnZSBzaWRlIGRhdGEgYnV0IGtlZXAgaXQgc2VwYXJhdGUuCisjaWYgRkZfQVBJX0xBVkZfS0VFUFNJREVfRkxBRworI2RlZmluZSBBVkZNVF9GTEFHX0tFRVBfU0lERV9EQVRBIDB4NDAwMDAgLy8vPCBEZXByZWNhdGVkLCBkb2VzIG5vdGhpbmcuCisjZW5kaWYKICNkZWZpbmUgQVZGTVRfRkxBR19GQVNUX1NFRUsgICAweDgwMDAwIC8vLzwgRW5hYmxlIGZhc3QsIGJ1dCBpbmFjY3VyYXRlIHNlZWtzIGZvciBzb21lIGZvcm1hdHMKKyNkZWZpbmUgQVZGTVRfRkxBR19TSE9SVEVTVCAgIDB4MTAwMDAwIC8vLzwgU3RvcCBtdXhpbmcgd2hlbiB0aGUgc2hvcnRlc3Qgc3RyZWFtIHN0b3BzLgorI2RlZmluZSBBVkZNVF9GTEFHX0FVVE9fQlNGICAgMHgyMDAwMDAgLy8vPCBBZGQgYml0c3RyZWFtIGZpbHRlcnMgYXMgcmVxdWVzdGVkIGJ5IHRoZSBtdXhlcgogCiAgICAgLyoqCiAgICAgICogTWF4aW11bSBzaXplIG9mIHRoZSBkYXRhIHJlYWQgZnJvbSBpbnB1dCBmb3IgZGV0ZXJtaW5pbmcKQEAgLTE2MjAsNyArMTY2OCw3IEBACiAgICAgLyoqCiAgICAgICogQXVkaW8gcHJlbG9hZCBpbiBtaWNyb3NlY29uZHMuCiAgICAgICogTm90ZSwgbm90IGFsbCBmb3JtYXRzIHN1cHBvcnQgdGhpcyBhbmQgdW5wcmVkaWN0YWJsZSB0aGluZ3MgbWF5IGhhcHBlbiBpZiBpdCBpcyB1c2VkIHdoZW4gbm90IHN1cHBvcnRlZC4KLSAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyCiAgICAgICogLSBkZWNvZGluZzogdW51c2VkCiAgICAgICovCiAgICAgaW50IGF1ZGlvX3ByZWxvYWQ7CkBAIC0xNjI4LDcgKzE2NzYsNyBAQAogICAgIC8qKgogICAgICAqIE1heCBjaHVuayB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KICAgICAgKiBOb3RlLCBub3QgYWxsIGZvcm1hdHMgc3VwcG9ydCB0aGlzIGFuZCB1bnByZWRpY3RhYmxlIHRoaW5ncyBtYXkgaGFwcGVuIGlmIGl0IGlzIHVzZWQgd2hlbiBub3Qgc3VwcG9ydGVkLgotICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyIHZpYSBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIKICAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKICAgICAgKi8KICAgICBpbnQgbWF4X2NodW5rX2R1cmF0aW9uOwpAQCAtMTYzNiw3ICsxNjg0LDcgQEAKICAgICAvKioKICAgICAgKiBNYXggY2h1bmsgc2l6ZSBpbiBieXRlcwogICAgICAqIE5vdGUsIG5vdCBhbGwgZm9ybWF0cyBzdXBwb3J0IHRoaXMgYW5kIHVucHJlZGljdGFibGUgdGhpbmdzIG1heSBoYXBwZW4gaWYgaXQgaXMgdXNlZCB3aGVuIG5vdCBzdXBwb3J0ZWQuCi0gICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIgdmlhIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlcgogICAgICAqIC0gZGVjb2Rpbmc6IHVudXNlZAogICAgICAqLwogICAgIGludCBtYXhfY2h1bmtfc2l6ZTsKQEAgLTE2NDUsMTQgKzE2OTMsMTQgQEAKICAgICAgKiBmb3JjZXMgdGhlIHVzZSBvZiB3YWxsY2xvY2sgdGltZXN0YW1wcyBhcyBwdHMvZHRzIG9mIHBhY2tldHMKICAgICAgKiBUaGlzIGhhcyB1bmRlZmluZWQgcmVzdWx0cyBpbiB0aGUgcHJlc2VuY2Ugb2YgQiBmcmFtZXMuCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIgdmlhIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlcgogICAgICAqLwogICAgIGludCB1c2Vfd2FsbGNsb2NrX2FzX3RpbWVzdGFtcHM7CiAKICAgICAvKioKICAgICAgKiBhdmlvIGZsYWdzLCB1c2VkIHRvIGZvcmNlIEFWSU9fRkxBR19ESVJFQ1QuCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIgdmlhIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlcgogICAgICAqLwogICAgIGludCBhdmlvX2ZsYWdzOwogCkBAIC0xNjYwLDM0ICsxNzA4LDM0IEBACiAgICAgICogVGhlIGR1cmF0aW9uIGZpZWxkIGNhbiBiZSBlc3RpbWF0ZWQgdGhyb3VnaCB2YXJpb3VzIHdheXMsIGFuZCB0aGlzIGZpZWxkIGNhbiBiZSB1c2VkCiAgICAgICogdG8ga25vdyBob3cgdGhlIGR1cmF0aW9uIHdhcyBlc3RpbWF0ZWQuCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogUmVhZCBieSB1c2VyIHZpYSBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICogLSBkZWNvZGluZzogUmVhZCBieSB1c2VyCiAgICAgICovCiAgICAgZW51bSBBVkR1cmF0aW9uRXN0aW1hdGlvbk1ldGhvZCBkdXJhdGlvbl9lc3RpbWF0aW9uX21ldGhvZDsKIAogICAgIC8qKgogICAgICAqIFNraXAgaW5pdGlhbCBieXRlcyB3aGVuIG9wZW5pbmcgc3RyZWFtCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIgdmlhIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlcgogICAgICAqLwogICAgIGludDY0X3Qgc2tpcF9pbml0aWFsX2J5dGVzOwogCiAgICAgLyoqCiAgICAgICogQ29ycmVjdCBzaW5nbGUgdGltZXN0YW1wIG92ZXJmbG93cwogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAotICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyIHZpYSBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IHVzZXIKICAgICAgKi8KICAgICB1bnNpZ25lZCBpbnQgY29ycmVjdF90c19vdmVyZmxvdzsKIAogICAgIC8qKgogICAgICAqIEZvcmNlIHNlZWtpbmcgdG8gYW55IChhbHNvIG5vbiBrZXkpIGZyYW1lcy4KICAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSB1c2VyCiAgICAgICovCiAgICAgaW50IHNlZWsyYW55OwogCiAgICAgLyoqCiAgICAgICogRmx1c2ggdGhlIEkvTyBjb250ZXh0IGFmdGVyIGVhY2ggcGFja2V0LgotICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyIHZpYSBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICogLSBlbmNvZGluZzogU2V0IGJ5IHVzZXIKICAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKICAgICAgKi8KICAgICBpbnQgZmx1c2hfcGFja2V0czsKQEAgLTE2OTcsMTQgKzE3NDUsMTQgQEAKICAgICAgKiBUaGUgbWF4aW1hbCBzY29yZSBpcyBBVlBST0JFX1NDT1JFX01BWCwgaXRzIHNldCB3aGVuIHRoZSBkZW11eGVyIHByb2JlcwogICAgICAqIHRoZSBmb3JtYXQuCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogc2V0IGJ5IGF2Zm9ybWF0LCByZWFkIGJ5IHVzZXIgdmlhIGF2X2Zvcm1hdF9nZXRfcHJvYmVfc2NvcmUoKSAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgYXZmb3JtYXQsIHJlYWQgYnkgdXNlcgogICAgICAqLwogICAgIGludCBwcm9iZV9zY29yZTsKIAogICAgIC8qKgogICAgICAqIG51bWJlciBvZiBieXRlcyB0byByZWFkIG1heGltYWxseSB0byBpZGVudGlmeSBmb3JtYXQuCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHVzZXIgdGhyb3VnaCBBVk9QdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHVzZXIKICAgICAgKi8KICAgICBpbnQgZm9ybWF0X3Byb2Jlc2l6ZTsKIApAQCAtMTcxMiw3ICsxNzYwLDcgQEAKICAgICAgKiAnLCcgc2VwYXJhdGVkIGxpc3Qgb2YgYWxsb3dlZCBkZWNvZGVycy4KICAgICAgKiBJZiBOVUxMIHRoZW4gYWxsIGFyZSBhbGxvd2VkCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCi0gICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHVzZXIgdGhyb3VnaCBBVk9wdGlvbnMgKE5PIGRpcmVjdCBhY2Nlc3MpCisgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHVzZXIKICAgICAgKi8KICAgICBjaGFyICpjb2RlY193aGl0ZWxpc3Q7CiAKQEAgLTE3MjAsNyArMTc2OCw3IEBACiAgICAgICogJywnIHNlcGFyYXRlZCBsaXN0IG9mIGFsbG93ZWQgZGVtdXhlcnMuCiAgICAgICogSWYgTlVMTCB0aGVuIGFsbCBhcmUgYWxsb3dlZAogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAotICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSB1c2VyIHRocm91Z2ggQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSB1c2VyCiAgICAgICovCiAgICAgY2hhciAqZm9ybWF0X3doaXRlbGlzdDsKIApAQCAtMTc0Miw3ICsxNzkwLDcgQEAKICAgICAgKiBGb3JjZWQgdmlkZW8gY29kZWMuCiAgICAgICogVGhpcyBhbGxvd3MgZm9yY2luZyBhIHNwZWNpZmljIGRlY29kZXIsIGV2ZW4gd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgd2l0aAogICAgICAqIHRoZSBzYW1lIGNvZGVjX2lkLgotICAgICAqIERlbXV4aW5nOiBTZXQgYnkgdXNlciB2aWEgYXZfZm9ybWF0X3NldF92aWRlb19jb2RlYyAoTk8gZGlyZWN0IGFjY2VzcykuCisgICAgICogRGVtdXhpbmc6IFNldCBieSB1c2VyCiAgICAgICovCiAgICAgQVZDb2RlYyAqdmlkZW9fY29kZWM7CiAKQEAgLTE3NTAsNyArMTc5OCw3IEBACiAgICAgICogRm9yY2VkIGF1ZGlvIGNvZGVjLgogICAgICAqIFRoaXMgYWxsb3dzIGZvcmNpbmcgYSBzcGVjaWZpYyBkZWNvZGVyLCBldmVuIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHdpdGgKICAgICAgKiB0aGUgc2FtZSBjb2RlY19pZC4KLSAgICAgKiBEZW11eGluZzogU2V0IGJ5IHVzZXIgdmlhIGF2X2Zvcm1hdF9zZXRfYXVkaW9fY29kZWMgKE5PIGRpcmVjdCBhY2Nlc3MpLgorICAgICAqIERlbXV4aW5nOiBTZXQgYnkgdXNlcgogICAgICAqLwogICAgIEFWQ29kZWMgKmF1ZGlvX2NvZGVjOwogCkBAIC0xNzU4LDcgKzE4MDYsNyBAQAogICAgICAqIEZvcmNlZCBzdWJ0aXRsZSBjb2RlYy4KICAgICAgKiBUaGlzIGFsbG93cyBmb3JjaW5nIGEgc3BlY2lmaWMgZGVjb2RlciwgZXZlbiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB3aXRoCiAgICAgICogdGhlIHNhbWUgY29kZWNfaWQuCi0gICAgICogRGVtdXhpbmc6IFNldCBieSB1c2VyIHZpYSBhdl9mb3JtYXRfc2V0X3N1YnRpdGxlX2NvZGVjIChOTyBkaXJlY3QgYWNjZXNzKS4KKyAgICAgKiBEZW11eGluZzogU2V0IGJ5IHVzZXIKICAgICAgKi8KICAgICBBVkNvZGVjICpzdWJ0aXRsZV9jb2RlYzsKIApAQCAtMTc2Niw3ICsxODE0LDcgQEAKICAgICAgKiBGb3JjZWQgZGF0YSBjb2RlYy4KICAgICAgKiBUaGlzIGFsbG93cyBmb3JjaW5nIGEgc3BlY2lmaWMgZGVjb2RlciwgZXZlbiB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB3aXRoCiAgICAgICogdGhlIHNhbWUgY29kZWNfaWQuCi0gICAgICogRGVtdXhpbmc6IFNldCBieSB1c2VyIHZpYSBhdl9mb3JtYXRfc2V0X2RhdGFfY29kZWMgKE5PIGRpcmVjdCBhY2Nlc3MpLgorICAgICAqIERlbXV4aW5nOiBTZXQgYnkgdXNlcgogICAgICAqLwogICAgIEFWQ29kZWMgKmRhdGFfY29kZWM7CiAKQEAgLTE3OTAsMTUgKzE4MzgsMTMgQEAKIAogICAgIC8qKgogICAgICAqIE91dHB1dCB0aW1lc3RhbXAgb2Zmc2V0LCBpbiBtaWNyb3NlY29uZHMuCi0gICAgICogTXV4aW5nOiBzZXQgYnkgdXNlciB2aWEgQVZPcHRpb25zIChOTyBkaXJlY3QgYWNjZXNzKQorICAgICAqIE11eGluZzogc2V0IGJ5IHVzZXIKICAgICAgKi8KICAgICBpbnQ2NF90IG91dHB1dF90c19vZmZzZXQ7CiAKICAgICAvKioKICAgICAgKiBkdW1wIGZvcm1hdCBzZXBhcmF0b3IuCiAgICAgICogY2FuIGJlICIsICIgb3IgIlxuICAgICAgIiBvciBhbnl0aGluZyBlbHNlCi0gICAgICogQ29kZSBvdXRzaWRlIGxpYmF2Zm9ybWF0IHNob3VsZCBhY2Nlc3MgdGhpcyBmaWVsZCB1c2luZyBBVk9wdGlvbnMKLSAgICAgKiAoTk8gZGlyZWN0IGFjY2VzcykuCiAgICAgICogLSBtdXhpbmc6IFNldCBieSB1c2VyLgogICAgICAqIC0gZGVtdXhpbmc6IFNldCBieSB1c2VyLgogICAgICAqLwpAQCAtMTgzNSwxNiArMTg4MSwxNiBAQAogICAgIC8qKgogICAgICAqICcsJyBzZXBhcmF0ZWQgbGlzdCBvZiBhbGxvd2VkIHByb3RvY29scy4KICAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKLSAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgdXNlciB0aHJvdWdoIEFWT3B0aW9ucyAoTk8gZGlyZWN0IGFjY2VzcykKKyAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgdXNlcgogICAgICAqLwogICAgIGNoYXIgKnByb3RvY29sX3doaXRlbGlzdDsKIAotICAgIC8qCisgICAgLyoqCiAgICAgICogQSBjYWxsYmFjayBmb3Igb3BlbmluZyBuZXcgSU8gc3RyZWFtcy4KICAgICAgKgotICAgICAqIENlcnRhaW4gbXV4ZXJzIG9yIGRlbXV4ZXJzIChlLmcuIGZvciB2YXJpb3VzIHBsYXlsaXN0LWJhc2VkIGZvcm1hdHMpIG5lZWQKLSAgICAgKiB0byBvcGVuIGFkZGl0aW9uYWwgZmlsZXMgZHVyaW5nIG11eGluZyBvciBkZW11eGluZy4gVGhpcyBjYWxsYmFjayBhbGxvd3MKLSAgICAgKiB0aGUgY2FsbGVyIHRvIHByb3ZpZGUgY3VzdG9tIElPIGluIHN1Y2ggY2FzZXMuCisgICAgICogV2hlbmV2ZXIgYSBtdXhlciBvciBhIGRlbXV4ZXIgbmVlZHMgdG8gb3BlbiBhbiBJTyBzdHJlYW0gKHR5cGljYWxseSBmcm9tCisgICAgICogYXZmb3JtYXRfb3Blbl9pbnB1dCgpIGZvciBkZW11eGVycywgYnV0IGZvciBjZXJ0YWluIGZvcm1hdHMgY2FuIGhhcHBlbiBhdAorICAgICAqIG90aGVyIHRpbWVzIGFzIHdlbGwpLCBpdCB3aWxsIGNhbGwgdGhpcyBjYWxsYmFjayB0byBvYnRhaW4gYW4gSU8gY29udGV4dC4KICAgICAgKgogICAgICAqIEBwYXJhbSBzIHRoZSBmb3JtYXQgY29udGV4dAogICAgICAqIEBwYXJhbSBwYiBvbiBzdWNjZXNzLCB0aGUgbmV3bHkgb3BlbmVkIElPIGNvbnRleHQgc2hvdWxkIGJlIHJldHVybmVkIGhlcmUKQEAgLTE4NjYsMjcgKzE5MTIsNjIgQEAKICAgICAgKiBBIGNhbGxiYWNrIGZvciBjbG9zaW5nIHRoZSBzdHJlYW1zIG9wZW5lZCB3aXRoIEFWRm9ybWF0Q29udGV4dC5pb19vcGVuKCkuCiAgICAgICovCiAgICAgdm9pZCAoKmlvX2Nsb3NlKShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIpOworCisgICAgLyoqCisgICAgICogJywnIHNlcGFyYXRlZCBsaXN0IG9mIGRpc2FsbG93ZWQgcHJvdG9jb2xzLgorICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAorICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSB1c2VyCisgICAgICovCisgICAgY2hhciAqcHJvdG9jb2xfYmxhY2tsaXN0OworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMuCisgICAgICogLSBlbmNvZGluZzogdW51c2VkCisgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IHVzZXIKKyAgICAgKi8KKyAgICBpbnQgbWF4X3N0cmVhbXM7CiB9IEFWRm9ybWF0Q29udGV4dDsKIAorI2lmIEZGX0FQSV9GT1JNQVRfR0VUX1NFVAorLyoqCisgKiBBY2Nlc3NvcnMgZm9yIHNvbWUgQVZGb3JtYXRDb250ZXh0IGZpZWxkcy4gVGhlc2UgdXNlZCB0byBiZSBwcm92aWRlZCBmb3IgQUJJCisgKiBjb21wYXRpYmlsaXR5LCBhbmQgZG8gbm90IG5lZWQgdG8gYmUgdXNlZCBhbnltb3JlLgorICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2X2Zvcm1hdF9nZXRfcHJvYmVfc2NvcmUoY29uc3QgQVZGb3JtYXRDb250ZXh0ICpzKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBBVkNvZGVjICogYXZfZm9ybWF0X2dldF92aWRlb19jb2RlYyhjb25zdCBBVkZvcm1hdENvbnRleHQgKnMpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgICAgICBhdl9mb3JtYXRfc2V0X3ZpZGVvX2NvZGVjKEFWRm9ybWF0Q29udGV4dCAqcywgQVZDb2RlYyAqYyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogQVZDb2RlYyAqIGF2X2Zvcm1hdF9nZXRfYXVkaW9fY29kZWMoY29uc3QgQVZGb3JtYXRDb250ZXh0ICpzKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiB2b2lkICAgICAgYXZfZm9ybWF0X3NldF9hdWRpb19jb2RlYyhBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWMgKmMpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIEFWQ29kZWMgKiBhdl9mb3JtYXRfZ2V0X3N1YnRpdGxlX2NvZGVjKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICAgIGF2X2Zvcm1hdF9zZXRfc3VidGl0bGVfY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjICpjKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBBVkNvZGVjICogYXZfZm9ybWF0X2dldF9kYXRhX2NvZGVjKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICAgIGF2X2Zvcm1hdF9zZXRfZGF0YV9jb2RlYyhBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWMgKmMpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCAgICAgICBhdl9mb3JtYXRfZ2V0X21ldGFkYXRhX2hlYWRlcl9wYWRkaW5nKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICAgIGF2X2Zvcm1hdF9zZXRfbWV0YWRhdGFfaGVhZGVyX3BhZGRpbmcoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgYyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAqICAgIGF2X2Zvcm1hdF9nZXRfb3BhcXVlKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICAgIGF2X2Zvcm1hdF9zZXRfb3BhcXVlKEFWRm9ybWF0Q29udGV4dCAqcywgdm9pZCAqb3BhcXVlKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBhdl9mb3JtYXRfY29udHJvbF9tZXNzYWdlIGF2X2Zvcm1hdF9nZXRfY29udHJvbF9tZXNzYWdlX2NiKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcyk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICAgIGF2X2Zvcm1hdF9zZXRfY29udHJvbF9tZXNzYWdlX2NiKEFWRm9ybWF0Q29udGV4dCAqcywgYXZfZm9ybWF0X2NvbnRyb2xfbWVzc2FnZSBjYWxsYmFjayk7CiAjaWYgRkZfQVBJX09MRF9PUEVOX0NBTExCQUNLUwogYXR0cmlidXRlX2RlcHJlY2F0ZWQgQVZPcGVuQ2FsbGJhY2sgYXZfZm9ybWF0X2dldF9vcGVuX2NiKGNvbnN0IEFWRm9ybWF0Q29udGV4dCAqcyk7CiBhdHRyaWJ1dGVfZGVwcmVjYXRlZCB2b2lkIGF2X2Zvcm1hdF9zZXRfb3Blbl9jYihBVkZvcm1hdENvbnRleHQgKnMsIEFWT3BlbkNhbGxiYWNrIGNhbGxiYWNrKTsKICNlbmRpZgorI2VuZGlmCiAKIC8qKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIGNhdXNlIGdsb2JhbCBzaWRlIGRhdGEgdG8gYmUgaW5qZWN0ZWQgaW4gdGhlIG5leHQgcGFja2V0CkBAIC0xOTMxLDYgKzIwMTIsNyBAQAogICovCiBjb25zdCBjaGFyICphdmZvcm1hdF9saWNlbnNlKHZvaWQpOwogCisjaWYgRkZfQVBJX05FWFQKIC8qKgogICogSW5pdGlhbGl6ZSBsaWJhdmZvcm1hdCBhbmQgcmVnaXN0ZXIgYWxsIHRoZSBtdXhlcnMsIGRlbXV4ZXJzIGFuZAogICogcHJvdG9jb2xzLiBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgdGhlbiB5b3UgY2FuIHNlbGVjdApAQCAtMTkzOSwzMSArMjAyMSw0NCBAQAogICogQHNlZSBhdl9yZWdpc3Rlcl9pbnB1dF9mb3JtYXQoKQogICogQHNlZSBhdl9yZWdpc3Rlcl9vdXRwdXRfZm9ybWF0KCkKICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgYXZfcmVnaXN0ZXJfYWxsKHZvaWQpOwogCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCBhdl9yZWdpc3Rlcl9pbnB1dF9mb3JtYXQoQVZJbnB1dEZvcm1hdCAqZm9ybWF0KTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiB2b2lkIGF2X3JlZ2lzdGVyX291dHB1dF9mb3JtYXQoQVZPdXRwdXRGb3JtYXQgKmZvcm1hdCk7CisjZW5kaWYKIAogLyoqCi0gKiBEbyBnbG9iYWwgaW5pdGlhbGl6YXRpb24gb2YgbmV0d29yayBjb21wb25lbnRzLiBUaGlzIGlzIG9wdGlvbmFsLAotICogYnV0IHJlY29tbWVuZGVkLCBzaW5jZSBpdCBhdm9pZHMgdGhlIG92ZXJoZWFkIG9mIGltcGxpY2l0bHkKLSAqIGRvaW5nIHRoZSBzZXR1cCBmb3IgZWFjaCBzZXNzaW9uLgorICogRG8gZ2xvYmFsIGluaXRpYWxpemF0aW9uIG9mIG5ldHdvcmsgbGlicmFyaWVzLiBUaGlzIGlzIG9wdGlvbmFsLAorICogYW5kIG5vdCByZWNvbW1lbmRlZCBhbnltb3JlLgogICoKLSAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGJlY29tZSBtYW5kYXRvcnkgaWYgdXNpbmcgbmV0d29yawotICogcHJvdG9jb2xzIGF0IHNvbWUgbWFqb3IgdmVyc2lvbiBidW1wLgorICogVGhpcyBmdW5jdGlvbnMgb25seSBleGlzdHMgdG8gd29yayBhcm91bmQgdGhyZWFkLXNhZmV0eSBpc3N1ZXMKKyAqIHdpdGggb2xkZXIgR251VExTIG9yIE9wZW5TU0wgbGlicmFyaWVzLiBJZiBsaWJhdmZvcm1hdCBpcyBsaW5rZWQKKyAqIHRvIG5ld2VyIHZlcnNpb25zIG9mIHRob3NlIGxpYnJhcmllcywgb3IgaWYgeW91IGRvIG5vdCB1c2UgdGhlbSwKKyAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBpcyB1bm5lY2Vzc2FyeS4gT3RoZXJ3aXNlLCB5b3UgbmVlZCB0byBjYWxsCisgKiB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhbnkgb3RoZXIgdGhyZWFkcyB1c2luZyB0aGVtIGFyZSBzdGFydGVkLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBkZXByZWNhdGVkIG9uY2Ugc3VwcG9ydCBmb3Igb2xkZXIgR251VExTIGFuZAorICogT3BlblNTTCBsaWJyYXJpZXMgaXMgcmVtb3ZlZCwgYW5kIHRoaXMgZnVuY3Rpb24gaGFzIG5vIHB1cnBvc2UKKyAqIGFueW1vcmUuCiAgKi8KIGludCBhdmZvcm1hdF9uZXR3b3JrX2luaXQodm9pZCk7CiAKIC8qKgotICogVW5kbyB0aGUgaW5pdGlhbGl6YXRpb24gZG9uZSBieSBhdmZvcm1hdF9uZXR3b3JrX2luaXQuCisgKiBVbmRvIHRoZSBpbml0aWFsaXphdGlvbiBkb25lIGJ5IGF2Zm9ybWF0X25ldHdvcmtfaW5pdC4gQ2FsbCBpdCBvbmx5CisgKiBvbmNlIGZvciBlYWNoIHRpbWUgeW91IGNhbGxlZCBhdmZvcm1hdF9uZXR3b3JrX2luaXQuCiAgKi8KIGludCBhdmZvcm1hdF9uZXR3b3JrX2RlaW5pdCh2b2lkKTsKIAorI2lmIEZGX0FQSV9ORVhUCiAvKioKICAqIElmIGYgaXMgTlVMTCwgcmV0dXJucyB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBpbnB1dCBmb3JtYXQsCiAgKiBpZiBmIGlzIG5vbi1OVUxMLCByZXR1cm5zIHRoZSBuZXh0IHJlZ2lzdGVyZWQgaW5wdXQgZm9ybWF0IGFmdGVyIGYKICAqIG9yIE5VTEwgaWYgZiBpcyB0aGUgbGFzdCBvbmUuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBBVklucHV0Rm9ybWF0ICAqYXZfaWZvcm1hdF9uZXh0KGNvbnN0IEFWSW5wdXRGb3JtYXQgICpmKTsKIAogLyoqCkBAIC0xOTcxLDcgKzIwNjYsMzEgQEAKICAqIGlmIGYgaXMgbm9uLU5VTEwsIHJldHVybnMgdGhlIG5leHQgcmVnaXN0ZXJlZCBvdXRwdXQgZm9ybWF0IGFmdGVyIGYKICAqIG9yIE5VTEwgaWYgZiBpcyB0aGUgbGFzdCBvbmUuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBBVk91dHB1dEZvcm1hdCAqYXZfb2Zvcm1hdF9uZXh0KGNvbnN0IEFWT3V0cHV0Rm9ybWF0ICpmKTsKKyNlbmRpZgorCisvKioKKyAqIEl0ZXJhdGUgb3ZlciBhbGwgcmVnaXN0ZXJlZCBtdXhlcnMuCisgKgorICogQHBhcmFtIG9wYXF1ZSBhIHBvaW50ZXIgd2hlcmUgbGliYXZmb3JtYXQgd2lsbCBzdG9yZSB0aGUgaXRlcmF0aW9uIHN0YXRlLiBNdXN0CisgKiAgICAgICAgICAgICAgIHBvaW50IHRvIE5VTEwgdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbi4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXh0IHJlZ2lzdGVyZWQgbXV4ZXIgb3IgTlVMTCB3aGVuIHRoZSBpdGVyYXRpb24gaXMKKyAqICAgICAgICAgZmluaXNoZWQKKyAqLworY29uc3QgQVZPdXRwdXRGb3JtYXQgKmF2X211eGVyX2l0ZXJhdGUodm9pZCAqKm9wYXF1ZSk7CisKKy8qKgorICogSXRlcmF0ZSBvdmVyIGFsbCByZWdpc3RlcmVkIGRlbXV4ZXJzLgorICoKKyAqIEBwYXJhbSBvcGFxdWUgYSBwb2ludGVyIHdoZXJlIGxpYmF2Zm9ybWF0IHdpbGwgc3RvcmUgdGhlIGl0ZXJhdGlvbiBzdGF0ZS4gTXVzdAorICogICAgICAgICAgICAgICBwb2ludCB0byBOVUxMIHRvIHN0YXJ0IHRoZSBpdGVyYXRpb24uCisgKgorICogQHJldHVybiB0aGUgbmV4dCByZWdpc3RlcmVkIGRlbXV4ZXIgb3IgTlVMTCB3aGVuIHRoZSBpdGVyYXRpb24gaXMKKyAqICAgICAgICAgZmluaXNoZWQKKyAqLworY29uc3QgQVZJbnB1dEZvcm1hdCAqYXZfZGVtdXhlcl9pdGVyYXRlKHZvaWQgKipvcGFxdWUpOwogCiAvKioKICAqIEFsbG9jYXRlIGFuIEFWRm9ybWF0Q29udGV4dC4KQEAgLTIwMTYsNiArMjEzNSwyMSBAQAogQVZTdHJlYW0gKmF2Zm9ybWF0X25ld19zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBBVkNvZGVjICpjKTsKIAogLyoqCisgKiBXcmFwIGFuIGV4aXN0aW5nIGFycmF5IGFzIHN0cmVhbSBzaWRlIGRhdGEuCisgKgorICogQHBhcmFtIHN0IHN0cmVhbQorICogQHBhcmFtIHR5cGUgc2lkZSBpbmZvcm1hdGlvbiB0eXBlCisgKiBAcGFyYW0gZGF0YSB0aGUgc2lkZSBkYXRhIGFycmF5LiBJdCBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIHRoZSBhdl9tYWxsb2MoKQorICogICAgICAgICAgICAgZmFtaWx5IG9mIGZ1bmN0aW9ucy4gVGhlIG93bmVyc2hpcCBvZiB0aGUgZGF0YSBpcyB0cmFuc2ZlcnJlZCB0bworICogICAgICAgICAgICAgc3QuCisgKiBAcGFyYW0gc2l6ZSBzaWRlIGluZm9ybWF0aW9uIHNpemUKKyAqIEByZXR1cm4gemVybyBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlLiBPbiBmYWlsdXJlLAorICogICAgICAgICB0aGUgc3RyZWFtIGlzIHVuY2hhbmdlZCBhbmQgdGhlIGRhdGEgcmVtYWlucyBvd25lZCBieSB0aGUgY2FsbGVyLgorICovCitpbnQgYXZfc3RyZWFtX2FkZF9zaWRlX2RhdGEoQVZTdHJlYW0gKnN0LCBlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisvKioKICAqIEFsbG9jYXRlIG5ldyBpbmZvcm1hdGlvbiBmcm9tIHN0cmVhbS4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHN0cmVhbQpAQCAtMjAzMyw3ICsyMTY3LDcgQEAKICAqIEBwYXJhbSBzaXplIHBvaW50ZXIgZm9yIHNpZGUgaW5mb3JtYXRpb24gc2l6ZSB0byBzdG9yZSAob3B0aW9uYWwpCiAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gZGF0YSBpZiBwcmVzZW50IG9yIE5VTEwgb3RoZXJ3aXNlCiAgKi8KLXVpbnQ4X3QgKmF2X3N0cmVhbV9nZXRfc2lkZV9kYXRhKEFWU3RyZWFtICpzdHJlYW0sCit1aW50OF90ICphdl9zdHJlYW1fZ2V0X3NpZGVfZGF0YShjb25zdCBBVlN0cmVhbSAqc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLCBpbnQgKnNpemUpOwogCiBBVlByb2dyYW0gKmF2X25ld19wcm9ncmFtKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGlkKTsKQEAgLTIzNDQsNiArMjQ3OCwxMCBAQAogICogQGFkZHRvZ3JvdXAgbGF2Zl9lbmNvZGluZwogICogQHsKICAqLworCisjZGVmaW5lIEFWU1RSRUFNX0lOSVRfSU5fV1JJVEVfSEVBREVSIDAgLy8vPCBzdHJlYW0gcGFyYW1ldGVycyBpbml0aWFsaXplZCBpbiBhdmZvcm1hdF93cml0ZV9oZWFkZXIKKyNkZWZpbmUgQVZTVFJFQU1fSU5JVF9JTl9JTklUX09VVFBVVCAgMSAvLy88IHN0cmVhbSBwYXJhbWV0ZXJzIGluaXRpYWxpemVkIGluIGF2Zm9ybWF0X2luaXRfb3V0cHV0CisKIC8qKgogICogQWxsb2NhdGUgdGhlIHN0cmVhbSBwcml2YXRlIGRhdGEgYW5kIHdyaXRlIHRoZSBzdHJlYW0gaGVhZGVyIHRvCiAgKiBhbiBvdXRwdXQgbWVkaWEgZmlsZS4KQEAgLTIzNTUsMTQgKzI0OTMsMzggQEAKICAqICAgICAgICAgICAgICAgICBPbiByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBkZXN0cm95ZWQgYW5kIHJlcGxhY2VkIHdpdGggYSBkaWN0IGNvbnRhaW5pbmcKICAqICAgICAgICAgICAgICAgICBvcHRpb25zIHRoYXQgd2VyZSBub3QgZm91bmQuIE1heSBiZSBOVUxMLgogICoKLSAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKiBAcmV0dXJuIEFWU1RSRUFNX0lOSVRfSU5fV1JJVEVfSEVBREVSIG9uIHN1Y2Nlc3MgaWYgdGhlIGNvZGVjIGhhZCBub3QgYWxyZWFkeSBiZWVuIGZ1bGx5IGluaXRpYWxpemVkIGluIGF2Zm9ybWF0X2luaXQsCisgKiAgICAgICAgIEFWU1RSRUFNX0lOSVRfSU5fSU5JVF9PVVRQVVQgIG9uIHN1Y2Nlc3MgaWYgdGhlIGNvZGVjIGhhZCBhbHJlYWR5IGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQgaW4gYXZmb3JtYXRfaW5pdCwKKyAqICAgICAgICAgbmVnYXRpdmUgQVZFUlJPUiBvbiBmYWlsdXJlLgogICoKLSAqIEBzZWUgYXZfb3B0X2ZpbmQsIGF2X2RpY3Rfc2V0LCBhdmlvX29wZW4sIGF2X29mb3JtYXRfbmV4dC4KKyAqIEBzZWUgYXZfb3B0X2ZpbmQsIGF2X2RpY3Rfc2V0LCBhdmlvX29wZW4sIGF2X29mb3JtYXRfbmV4dCwgYXZmb3JtYXRfaW5pdF9vdXRwdXQuCiAgKi8KIGF2X3dhcm5fdW51c2VkX3Jlc3VsdAogaW50IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpOwogCiAvKioKKyAqIEFsbG9jYXRlIHRoZSBzdHJlYW0gcHJpdmF0ZSBkYXRhIGFuZCBpbml0aWFsaXplIHRoZSBjb2RlYywgYnV0IGRvIG5vdCB3cml0ZSB0aGUgaGVhZGVyLgorICogTWF5IG9wdGlvbmFsbHkgYmUgdXNlZCBiZWZvcmUgYXZmb3JtYXRfd3JpdGVfaGVhZGVyIHRvIGluaXRpYWxpemUgc3RyZWFtIHBhcmFtZXRlcnMKKyAqIGJlZm9yZSBhY3R1YWxseSB3cml0aW5nIHRoZSBoZWFkZXIuCisgKiBJZiB1c2luZyB0aGlzIGZ1bmN0aW9uLCBkbyBub3QgcGFzcyB0aGUgc2FtZSBvcHRpb25zIHRvIGF2Zm9ybWF0X3dyaXRlX2hlYWRlci4KKyAqCisgKiBAcGFyYW0gcyBNZWRpYSBmaWxlIGhhbmRsZSwgbXVzdCBiZSBhbGxvY2F0ZWQgd2l0aCBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkuCisgKiAgICAgICAgICBJdHMgb2Zvcm1hdCBmaWVsZCBtdXN0IGJlIHNldCB0byB0aGUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0OworICogICAgICAgICAgSXRzIHBiIGZpZWxkIG11c3QgYmUgc2V0IHRvIGFuIGFscmVhZHkgb3BlbmVkIEFWSU9Db250ZXh0LgorICogQHBhcmFtIG9wdGlvbnMgIEFuIEFWRGljdGlvbmFyeSBmaWxsZWQgd2l0aCBBVkZvcm1hdENvbnRleHQgYW5kIG11eGVyLXByaXZhdGUgb3B0aW9ucy4KKyAqICAgICAgICAgICAgICAgICBPbiByZXR1cm4gdGhpcyBwYXJhbWV0ZXIgd2lsbCBiZSBkZXN0cm95ZWQgYW5kIHJlcGxhY2VkIHdpdGggYSBkaWN0IGNvbnRhaW5pbmcKKyAqICAgICAgICAgICAgICAgICBvcHRpb25zIHRoYXQgd2VyZSBub3QgZm91bmQuIE1heSBiZSBOVUxMLgorICoKKyAqIEByZXR1cm4gQVZTVFJFQU1fSU5JVF9JTl9XUklURV9IRUFERVIgb24gc3VjY2VzcyBpZiB0aGUgY29kZWMgcmVxdWlyZXMgYXZmb3JtYXRfd3JpdGVfaGVhZGVyIHRvIGZ1bGx5IGluaXRpYWxpemUsCisgKiAgICAgICAgIEFWU1RSRUFNX0lOSVRfSU5fSU5JVF9PVVRQVVQgIG9uIHN1Y2Nlc3MgaWYgdGhlIGNvZGVjIGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLAorICogICAgICAgICBuZWdhdGl2ZSBBVkVSUk9SIG9uIGZhaWx1cmUuCisgKgorICogQHNlZSBhdl9vcHRfZmluZCwgYXZfZGljdF9zZXQsIGF2aW9fb3BlbiwgYXZfb2Zvcm1hdF9uZXh0LCBhdmZvcm1hdF93cml0ZV9oZWFkZXIuCisgKi8KK2F2X3dhcm5fdW51c2VkX3Jlc3VsdAoraW50IGF2Zm9ybWF0X2luaXRfb3V0cHV0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucyk7CisKKy8qKgogICogV3JpdGUgYSBwYWNrZXQgdG8gYW4gb3V0cHV0IG1lZGlhIGZpbGUuCiAgKgogICogVGhpcyBmdW5jdGlvbiBwYXNzZXMgdGhlIHBhY2tldCBkaXJlY3RseSB0byB0aGUgbXV4ZXIsIHdpdGhvdXQgYW55IGJ1ZmZlcmluZwpAQCAtMjQwOSw2ICsyNTcxLDEwIEBACiAgKiBpbmNyZWFzaW5nIGR0cy4gQ2FsbGVycyBkb2luZyB0aGVpciBvd24gaW50ZXJsZWF2aW5nIHNob3VsZCBjYWxsCiAgKiBhdl93cml0ZV9mcmFtZSgpIGluc3RlYWQgb2YgdGhpcyBmdW5jdGlvbi4KICAqCisgKiBVc2luZyB0aGlzIGZ1bmN0aW9uIGluc3RlYWQgb2YgYXZfd3JpdGVfZnJhbWUoKSBjYW4gZ2l2ZSBtdXhlcnMgYWR2YW5jZQorICoga25vd2xlZGdlIG9mIGZ1dHVyZSBwYWNrZXRzLCBpbXByb3ZpbmcgZS5nLiB0aGUgYmVoYXZpb3VyIG9mIHRoZSBtcDQKKyAqIG11eGVyIGZvciBWRlIgY29udGVudCBpbiBmcmFnbWVudGluZyBtb2RlLgorICoKICAqIEBwYXJhbSBzIG1lZGlhIGZpbGUgaGFuZGxlCiAgKiBAcGFyYW0gcGt0IFRoZSBwYWNrZXQgY29udGFpbmluZyB0aGUgZGF0YSB0byBiZSB3cml0dGVuLgogICogICAgICAgICAgICA8YnI+CkBAIC0yNDQzLDcgKzI2MDksNyBAQAogaW50IGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCk7CiAKIC8qKgotICogV3JpdGUgYSB1bmNvZGVkIGZyYW1lIHRvIGFuIG91dHB1dCBtZWRpYSBmaWxlLgorICogV3JpdGUgYW4gdW5jb2RlZCBmcmFtZSB0byBhbiBvdXRwdXQgbWVkaWEgZmlsZS4KICAqCiAgKiBUaGUgZnJhbWUgbXVzdCBiZSBjb3JyZWN0bHkgaW50ZXJsZWF2ZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZXIKICAqIHNwZWNpZmljYXRpb247IGlmIG5vdCwgdGhlbiBhdl9pbnRlcmxlYXZlZF93cml0ZV9mcmFtZSgpIG11c3QgYmUgdXNlZC4KQEAgLTI0NTQsNyArMjYyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpmcmFtZSk7CiAKIC8qKgotICogV3JpdGUgYSB1bmNvZGVkIGZyYW1lIHRvIGFuIG91dHB1dCBtZWRpYSBmaWxlLgorICogV3JpdGUgYW4gdW5jb2RlZCBmcmFtZSB0byBhbiBvdXRwdXQgbWVkaWEgZmlsZS4KICAqCiAgKiBJZiB0aGUgbXV4ZXIgc3VwcG9ydHMgaXQsIHRoaXMgZnVuY3Rpb24gbWFrZXMgaXQgcG9zc2libGUgdG8gd3JpdGUgYW4gQVZGcmFtZQogICogc3RydWN0dXJlIGRpcmVjdGx5LCB3aXRob3V0IGVuY29kaW5nIGl0IGludG8gYSBwYWNrZXQuCkBAIC0yNjk2LDYgKzI4NjIsOSBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCiAgICAgICAgICAgICAgICAgICAgIGludCBpc19vdXRwdXQpOwogCisKKyNkZWZpbmUgQVZfRlJBTUVfRklMRU5BTUVfRkxBR1NfTVVMVElQTEUgMSAvLy88IEFsbG93IG11bHRpcGxlICVkCisKIC8qKgogICogUmV0dXJuIGluICdidWYnIHRoZSBwYXRoIHdpdGggJyVkJyByZXBsYWNlZCBieSBhIG51bWJlci4KICAqCkBAIC0yNzA2LDggKzI4NzUsMTIgQEAKICAqIEBwYXJhbSBidWZfc2l6ZSBkZXN0aW5hdGlvbiBidWZmZXIgc2l6ZQogICogQHBhcmFtIHBhdGggbnVtYmVyZWQgc2VxdWVuY2Ugc3RyaW5nCiAgKiBAcGFyYW0gbnVtYmVyIGZyYW1lIG51bWJlcgorICogQHBhcmFtIGZsYWdzIEFWX0ZSQU1FX0ZJTEVOQU1FX0ZMQUdTXyoKICAqIEByZXR1cm4gMCBpZiBPSywgLTEgb24gZm9ybWF0IGVycm9yCiAgKi8KK2ludCBhdl9nZXRfZnJhbWVfZmlsZW5hbWUyKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBpbnQgbnVtYmVyLCBpbnQgZmxhZ3MpOworCiBpbnQgYXZfZ2V0X2ZyYW1lX2ZpbGVuYW1lKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXRoLCBpbnQgbnVtYmVyKTsKIApAQCAtMjg0MCwxNyArMzAxMyw1MiBAQAogCiBpbnQgYXZmb3JtYXRfcXVldWVfYXR0YWNoZWRfcGljdHVyZXMoQVZGb3JtYXRDb250ZXh0ICpzKTsKIAorI2lmIEZGX0FQSV9PTERfQlNGCiAvKioKICAqIEFwcGx5IGEgbGlzdCBvZiBiaXRzdHJlYW0gZmlsdGVycyB0byBhIHBhY2tldC4KICAqCiAgKiBAcGFyYW0gY29kZWMgQVZDb2RlY0NvbnRleHQsIHVzdWFsbHkgZnJvbSBhbiBBVlN0cmVhbQotICogQHBhcmFtIHBrdCB0aGUgcGFja2V0IHRvIGFwcGx5IGZpbHRlcnMgdG8KKyAqIEBwYXJhbSBwa3QgdGhlIHBhY2tldCB0byBhcHBseSBmaWx0ZXJzIHRvLiBJZiwgb24gc3VjY2VzcywgdGhlIHJldHVybmVkCisgKiAgICAgICAgcGFja2V0IGhhcyBzaXplID09IDAgYW5kIHNpZGVfZGF0YV9lbGVtcyA9PSAwLCBpdCBpbmRpY2F0ZXMgdGhhdAorICogICAgICAgIHRoZSBwYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQKICAqIEBwYXJhbSBic2ZjIGEgTlVMTC10ZXJtaW5hdGVkIGxpc3Qgb2YgZmlsdGVycyB0byBhcHBseQogICogQHJldHVybiAgPj0wIG9uIHN1Y2Nlc3M7CiAgKiAgICAgICAgICBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2X2FwcGx5X2JpdHN0cmVhbV9maWx0ZXJzKEFWQ29kZWNDb250ZXh0ICpjb2RlYywgQVZQYWNrZXQgKnBrdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMpOworI2VuZGlmCisKK2VudW0gQVZUaW1lYmFzZVNvdXJjZSB7CisgICAgQVZGTVRfVEJDRl9BVVRPID0gLTEsCisgICAgQVZGTVRfVEJDRl9ERUNPREVSLAorICAgIEFWRk1UX1RCQ0ZfREVNVVhFUiwKKyNpZiBGRl9BUElfUl9GUkFNRV9SQVRFCisgICAgQVZGTVRfVEJDRl9SX0ZSQU1FUkFURSwKKyNlbmRpZgorfTsKKworLyoqCisgKiBUcmFuc2ZlciBpbnRlcm5hbCB0aW1pbmcgaW5mb3JtYXRpb24gZnJvbSBvbmUgc3RyZWFtIHRvIGFub3RoZXIuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgd2hlbiBkb2luZyBzdHJlYW0gY29weS4KKyAqCisgKiBAcGFyYW0gb2ZtdCAgICAgdGFyZ2V0IG91dHB1dCBmb3JtYXQgZm9yIG9zdAorICogQHBhcmFtIG9zdCAgICAgIG91dHB1dCBzdHJlYW0gd2hpY2ggbmVlZHMgdGltaW5ncyBjb3B5IGFuZCBhZGp1c3RtZW50cworICogQHBhcmFtIGlzdCAgICAgIHJlZmVyZW5jZSBpbnB1dCBzdHJlYW0gdG8gY29weSB0aW1pbmdzIGZyb20KKyAqIEBwYXJhbSBjb3B5X3RiICBkZWZpbmUgZnJvbSB3aGVyZSB0aGUgc3RyZWFtIGNvZGVjIHRpbWViYXNlIG5lZWRzIHRvIGJlIGltcG9ydGVkCisgKi8KK2ludCBhdmZvcm1hdF90cmFuc2Zlcl9pbnRlcm5hbF9zdHJlYW1fdGltaW5nX2luZm8oY29uc3QgQVZPdXRwdXRGb3JtYXQgKm9mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpvc3QsIGNvbnN0IEFWU3RyZWFtICppc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZUaW1lYmFzZVNvdXJjZSBjb3B5X3RiKTsKKworLyoqCisgKiBHZXQgdGhlIGludGVybmFsIGNvZGVjIHRpbWViYXNlIGZyb20gYSBzdHJlYW0uCisgKgorICogQHBhcmFtIHN0ICBpbnB1dCBzdHJlYW0gdG8gZXh0cmFjdCB0aGUgdGltZWJhc2UgZnJvbQorICovCitBVlJhdGlvbmFsIGF2X3N0cmVhbV9nZXRfY29kZWNfdGltZWJhc2UoY29uc3QgQVZTdHJlYW0gKnN0KTsKIAogLyoqCiAgKiBAfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXZpLmggYi9saWJhdmZvcm1hdC9hdmkuaAppbmRleCAzNGRhNzZmLi5iMTcxMWYwIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hdmkuaAorKysgYi9saWJhdmZvcm1hdC9hdmkuaApAQCAtMjksMTAgKzI5LDEzIEBACiAjZGVmaW5lIEFWSUZfQ09QWVJJR0hURUQgICAgICAgIDB4MDAwMjAwMDAKIAogI2RlZmluZSBBVklfTUFYX1JJRkZfU0laRSAgICAgICAweDQwMDAwMDAwTEwKLSNkZWZpbmUgQVZJX01BU1RFUl9JTkRFWF9TSVpFICAgMjU2CiAjZGVmaW5lIEFWSV9NQVhfU1RSRUFNX0NPVU5UICAgIDEwMAogCisvKiBzdHJlYW0gaGVhZGVyIGZsYWdzICovCisjZGVmaW5lIEFWSVNGX1ZJREVPX1BBTENIQU5HRVMgIDB4MDAwMTAwMDAKKwogLyogaW5kZXggZmxhZ3MgKi8KLSNkZWZpbmUgQVZJSUZfSU5ERVggICAgICAgICAgICAgMHgxMAorI2RlZmluZSBBVklJRl9JTkRFWCAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFWSUlGX05PX1RJTUUgICAgICAgICAgIDB4MDAwMDAxMDAKIAogI2VuZGlmIC8qIEFWRk9STUFUX0FWSV9IICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hdmlkZWMuYyBiL2xpYmF2Zm9ybWF0L2F2aWRlYy5jCmluZGV4IDM4NTk4MTAuLmJhZmUxZGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2F2aWRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2F2aWRlYy5jCkBAIC0xMTcsMTMgKzExNyw5IEBACiBzdGF0aWMgaW50IGF2aV9sb2FkX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcyk7CiBzdGF0aWMgaW50IGd1ZXNzX25pX2ZsYWcoQVZGb3JtYXRDb250ZXh0ICpzKTsKIAotI2RlZmluZSBwcmludF90YWcoc3RyLCB0YWcsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfVFJBQ0UsICJwb3M6JSJQUklYNjQiICVzOiB0YWc9JWMlYyVjJWMgc2l6ZT0weCV4XG4iLCBcCi0gICAgICAgICAgICBhdmlvX3RlbGwocGIpLCBzdHIsIHRhZyAmIDB4ZmYsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAodGFnID4+IDgpICYgMHhmZiwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAodGFnID4+IDE2KSAmIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAodGFnID4+IDI0KSAmIDB4ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBzaXplKQorI2RlZmluZSBwcmludF90YWcoc3RyLCB0YWcsIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19UUkFDRSwgInBvczolIlBSSVg2NCIgJXM6IHRhZz0lcyBzaXplPTB4JXhcbiIsIFwKKyAgICAgICAgICAgYXZpb190ZWxsKHBiKSwgc3RyLCBhdl9mb3VyY2Myc3RyKHRhZyksIHNpemUpICAgICAgICAgICAgICAgICAgXAogCiBzdGF0aWMgaW5saW5lIGludCBnZXRfZHVyYXRpb24oQVZJU3RyZWFtICphc3QsIGludCBsZW4pCiB7CkBAIC0xNjAsMTEgKzE1NiwxMSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHJlYWRfYnJhaW5kZWFkX29kbWxfaW5keChBVkZvcm1hdENvbnRleHQgKnMsIGludCBmcmFtZV9udW0pCitzdGF0aWMgaW50IHJlYWRfb2RtbF9pbmRleChBVkZvcm1hdENvbnRleHQgKnMsIGludCBmcmFtZV9udW0pCiB7CiAgICAgQVZJQ29udGV4dCAqYXZpICAgICA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgICAgID0gcy0+cGI7Ci0gICAgaW50IGxvbmdzX3ByZV9lbnRyeSA9IGF2aW9fcmwxNihwYik7CisgICAgaW50IGxvbmdzX3Blcl9lbnRyeSA9IGF2aW9fcmwxNihwYik7CiAgICAgaW50IGluZGV4X3N1Yl90eXBlICA9IGF2aW9fcjgocGIpOwogICAgIGludCBpbmRleF90eXBlICAgICAgPSBhdmlvX3I4KHBiKTsKICAgICBpbnQgZW50cmllc19pbl91c2UgID0gYXZpb19ybDMyKHBiKTsKQEAgLTE3OSw5ICsxNzUsOSBAQAogICAgIGludDY0X3QgZmlsZXNpemUgPSBhdmktPmZzaXplOwogCiAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwKLSAgICAgICAgICAgICJsb25nc19wcmVfZW50cnk6JWQgaW5kZXhfdHlwZTolZCBlbnRyaWVzX2luX3VzZTolZCAiCisgICAgICAgICAgICAibG9uZ3NfcGVyX2VudHJ5OiVkIGluZGV4X3R5cGU6JWQgZW50cmllc19pbl91c2U6JWQgIgogICAgICAgICAgICAgImNodW5rX2lkOiVYIGJhc2U6JTE2IlBSSVg2NCIgZnJhbWVfbnVtOiVkXG4iLAotICAgICAgICAgICAgbG9uZ3NfcHJlX2VudHJ5LAorICAgICAgICAgICAgbG9uZ3NfcGVyX2VudHJ5LAogICAgICAgICAgICAgaW5kZXhfdHlwZSwKICAgICAgICAgICAgIGVudHJpZXNfaW5fdXNlLAogICAgICAgICAgICAgY2h1bmtfaWQsCkBAIC0xOTgsNyArMTk0LDcgQEAKIAogICAgIGF2aW9fcmwzMihwYik7CiAKLSAgICBpZiAoaW5kZXhfdHlwZSAmJiBsb25nc19wcmVfZW50cnkgIT0gMikKKyAgICBpZiAoaW5kZXhfdHlwZSAmJiBsb25nc19wZXJfZW50cnkgIT0gMikKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgaWYgKGluZGV4X3R5cGUgPiAxKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTI1Myw3ICsyNDksNyBAQAogICAgICAgICAgICAgaWYgKGF2aW9fc2VlayhwYiwgb2Zmc2V0ICsgOCwgU0VFS19TRVQpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICBhdmktPm9kbWxfZGVwdGgrKzsKLSAgICAgICAgICAgIHJlYWRfYnJhaW5kZWFkX29kbWxfaW5keChzLCBmcmFtZV9udW0pOworICAgICAgICAgICAgcmVhZF9vZG1sX2luZGV4KHMsIGZyYW1lX251bSk7CiAgICAgICAgICAgICBhdmktPm9kbWxfZGVwdGgtLTsKICAgICAgICAgICAgIGZyYW1lX251bSArPSBkdXJhdGlvbjsKIApAQCAtMzQ0LDE0ICszNDAsMTQgQEAKIAogc3RhdGljIHZvaWQgYXZpX3JlYWRfbmlrb24oQVZGb3JtYXRDb250ZXh0ICpzLCB1aW50NjRfdCBlbmQpCiB7Ci0gICAgd2hpbGUgKGF2aW9fdGVsbChzLT5wYikgPCBlbmQpIHsKKyAgICB3aGlsZSAoYXZpb190ZWxsKHMtPnBiKSA8IGVuZCAmJiAhYXZpb19mZW9mKHMtPnBiKSkgewogICAgICAgICB1aW50MzJfdCB0YWcgID0gYXZpb19ybDMyKHMtPnBiKTsKICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgIGNhc2UgTUtUQUcoJ24nLCAnYycsICd0JywgJ2cnKTogIC8qIE5pa29uIFRhZ3MgKi8KICAgICAgICAgewogICAgICAgICAgICAgdWludDY0X3QgdGFnX2VuZCA9IGF2aW9fdGVsbChzLT5wYikgKyBzaXplOwotICAgICAgICAgICAgd2hpbGUgKGF2aW9fdGVsbChzLT5wYikgPCB0YWdfZW5kKSB7CisgICAgICAgICAgICB3aGlsZSAoYXZpb190ZWxsKHMtPnBiKSA8IHRhZ19lbmQgJiYgIWF2aW9fZmVvZihzLT5wYikpIHsKICAgICAgICAgICAgICAgICB1aW50MTZfdCB0YWcgICAgID0gYXZpb19ybDE2KHMtPnBiKTsKICAgICAgICAgICAgICAgICB1aW50MTZfdCBzaXplICAgID0gYXZpb19ybDE2KHMtPnBiKTsKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKQEAgLTM4NSwxMSArMzgxLDExIEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IGF2aV9leHRyYWN0X3N0cmVhbV9tZXRhZGF0YShBVlN0cmVhbSAqc3QpCitzdGF0aWMgaW50IGF2aV9leHRyYWN0X3N0cmVhbV9tZXRhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKIHsKICAgICBHZXRCeXRlQ29udGV4dCBnYjsKLSAgICB1aW50OF90ICpkYXRhID0gc3QtPmNvZGVjLT5leHRyYWRhdGE7Ci0gICAgaW50IGRhdGFfc2l6ZSA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgdWludDhfdCAqZGF0YSA9IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhOworICAgIGludCBkYXRhX3NpemUgPSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplOwogICAgIGludCB0YWcsIG9mZnNldDsKIAogICAgIGlmICghZGF0YSB8fCBkYXRhX3NpemUgPCA4KSB7CkBAIC00MDUsMTYgKzQwMSwxNiBAQAogICAgICAgICAvLyBza2lwIDQgYnl0ZSBwYWRkaW5nCiAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA0KTsKICAgICAgICAgb2Zmc2V0ID0gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOwotICAgICAgICBieXRlc3RyZWFtMl9pbml0KCZnYiwgZGF0YSArIG9mZnNldCwgZGF0YV9zaXplIC0gb2Zmc2V0KTsKIAogICAgICAgICAvLyBkZWNvZGUgRVhJRiB0YWdzIGZyb20gSUZELCBBVkkgaXMgYWx3YXlzIGxpdHRsZS1lbmRpYW4KLSAgICAgICAgcmV0dXJuIGF2cHJpdl9leGlmX2RlY29kZV9pZmQoc3QtPmNvZGVjLCAmZ2IsIDEsIDAsICZzdC0+bWV0YWRhdGEpOworICAgICAgICByZXR1cm4gYXZwcml2X2V4aWZfZGVjb2RlX2lmZChzLCBkYXRhICsgb2Zmc2V0LCBkYXRhX3NpemUgLSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsICZzdC0+bWV0YWRhdGEpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1LVEFHKCdDJywgJ0EnLCAnUycsICdJJyk6Ci0gICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzdC0+Y29kZWMsICJSSUZGIHN0cmVhbSBkYXRhIHRhZyB0eXBlIENBU0kgKCV1KSIsIHRhZyk7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiUklGRiBzdHJlYW0gZGF0YSB0YWcgdHlwZSBDQVNJICgldSkiLCB0YWcpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1LVEFHKCdaJywgJ28nLCAncicsICdhJyk6Ci0gICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzdC0+Y29kZWMsICJSSUZGIHN0cmVhbSBkYXRhIHRhZyB0eXBlIFpvcmEgKCV1KSIsIHRhZyk7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiUklGRiBzdHJlYW0gZGF0YSB0YWcgdHlwZSBab3JhICgldSkiLCB0YWcpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKQEAgLTQ1NiwxMiArNDUyLDEyIEBACiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzdC0+bmJfaW5kZXhfZW50cmllczsgaisrKQogICAgICAgICAgICAgbGVuICs9IHN0LT5pbmRleF9lbnRyaWVzW2pdLnNpemU7CiAKLSAgICAgICAgaWYgKHN0LT5uYl9pbmRleF9lbnRyaWVzIDwgMiB8fCBzdC0+Y29kZWMtPmJpdF9yYXRlID4gMCkKKyAgICAgICAgaWYgKHN0LT5uYl9pbmRleF9lbnRyaWVzIDwgMiB8fCBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID4gMCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBkdXJhdGlvbiA9IHN0LT5pbmRleF9lbnRyaWVzW2otMV0udGltZXN0YW1wIC0gc3QtPmluZGV4X2VudHJpZXNbMF0udGltZXN0YW1wOwogICAgICAgICBiaXRyYXRlID0gYXZfcmVzY2FsZSg4Kmxlbiwgc3QtPnRpbWVfYmFzZS5kZW4sIGR1cmF0aW9uICogc3QtPnRpbWVfYmFzZS5udW0pOwogICAgICAgICBpZiAoYml0cmF0ZSA8PSBJTlRfTUFYICYmIGJpdHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBiaXRyYXRlOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAxOwpAQCAtNjAzLDExICs1OTksMTkgQEAKICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogCiAgICAgICAgICAgICAgICAgYXN0ID0gcy0+c3RyZWFtc1swXS0+cHJpdl9kYXRhOwotICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyKTsKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zWzBdLT5jb2RlYyk7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogICAgICAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zWzBdLT5pbmZvKQogICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmcy0+c3RyZWFtc1swXS0+aW5mby0+ZHVyYXRpb25fZXJyb3IpOwogICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zWzBdLT5pbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1swXS0+aW50ZXJuYWwpCisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zWzBdLT5pbnRlcm5hbC0+YXZjdHgpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zWzBdLT5pbnRlcm5hbCk7CiAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnMtPnN0cmVhbXNbMF0pOwogICAgICAgICAgICAgICAgIHMtPm5iX3N0cmVhbXMgPSAwOwogICAgICAgICAgICAgICAgIGlmIChDT05GSUdfRFZfREVNVVhFUikgewpAQCAtNjY2LDExICs2NzAsMTEgQEAKICAgICAgICAgICAgIHN0LT5zdGFydF90aW1lID0gMDsKICAgICAgICAgICAgIGF2aW9fcmwzMihwYik7IC8qIGJ1ZmZlciBzaXplICovCiAgICAgICAgICAgICBhdmlvX3JsMzIocGIpOyAvKiBxdWFsaXR5ICovCi0gICAgICAgICAgICBpZiAoYXN0LT5jdW1fbGVuKmFzdC0+c2NhbGUvYXN0LT5yYXRlID4gMzYwMCkgeworICAgICAgICAgICAgaWYgKGFzdC0+Y3VtX2xlbiA+IDM2MDBMTCAqIGFzdC0+cmF0ZSAvIGFzdC0+c2NhbGUpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY3Jhenkgc3RhcnQgdGltZSwgaWFtIHNjYXJlZCwgZ2l2aW5nIHVwXG4iKTsKICAgICAgICAgICAgICAgICBhc3QtPmN1bV9sZW4gPSAwOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXN0LT5zYW1wbGVfc2l6ZSA9IGF2aW9fcmwzMihwYik7IC8qIHNhbXBsZSBzc2l6ZSAqLworICAgICAgICAgICAgYXN0LT5zYW1wbGVfc2l6ZSA9IGF2aW9fcmwzMihwYik7CiAgICAgICAgICAgICBhc3QtPmN1bV9sZW4gICAgKj0gRkZNQVgoMSwgYXN0LT5zYW1wbGVfc2l6ZSk7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiJSJQUkl1MzIiICUiUFJJdTMyIiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICAgYXN0LT5yYXRlLCBhc3QtPnNjYWxlLCBhc3QtPnNhbXBsZV9zaXplKTsKQEAgLTcyMyw3ICs3MjcsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUtUQUcoJ3MnLCAndCcsICdyJywgJ2YnKToKICAgICAgICAgICAgIC8qIHN0cmVhbSBoZWFkZXIgKi8KLSAgICAgICAgICAgIGlmICghc2l6ZSkKKyAgICAgICAgICAgIGlmICghc2l6ZSAmJiAoY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pKQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA+PSAodW5zaWduZWQpcy0+bmJfc3RyZWFtcyB8fCBhdmktPmR2X2RlbXV4KSB7CiAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKQEAgLTczMywxNyArNzM4LDE3IEBACiAgICAgICAgICAgICAgICAgaWYgKGN1cl9wb3MgPCBsaXN0X2VuZCkKICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIGxpc3RfZW5kIC0gY3VyX3Bvcyk7CiAgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1VOS05PV04pIHsKICAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN3aXRjaCAoY29kZWNfdHlwZSkgewogICAgICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgogICAgICAgICAgICAgICAgICAgICBpZiAoYW12X2ZpbGVfZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmloX3dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gYXZpaF9oZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BTVY7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSBhdmloX3dpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gYXZpaF9oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BTVY7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTc1MSwxMDUgKzc1NiwxMDcgQEAKIAogICAgICAgICAgICAgICAgICAgICBpZiAodGFnMSA9PSBNS1RBRygnRCcsICdYJywgJ1MnLCAnQicpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICB0YWcxID09IE1LVEFHKCdEJywgJ1gnLCAnUycsICdBJykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IHRhZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9YU1VCOworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gdGFnMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1hTVUI7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplID4gMTAgKiA0ICYmIHNpemUgPCAoMSA8PCAzMCkgJiYgc2l6ZSA8IGF2aS0+ZnNpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlc2l6ZSA9PSBzaXplLTEgJiYgKGVzaXplJjEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IGVzaXplIC0gMTAgKiA0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSBlc2l6ZSAtIDEwICogNDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAgc2l6ZSAtIDEwICogNDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gIHNpemUgLSAxMCAqIDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJOZXcgZXh0cmFkYXRhIGluIHN0cmYgY2h1bmssIGZyZWVpbmcgcHJldmlvdXMgb25lLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsIHN0LT5jb2RlY3BhciwgcGIsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IGNoZWNrIGlmIHRoZSBlbmNvZGVyIHJlYWxseSBkaWQgdGhpcyBjb3JyZWN0bHkKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgJiAxKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSAmIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3I4KHBiKTsKIAogICAgICAgICAgICAgICAgICAgICAvKiBFeHRyYWN0IHBhbGV0dGUgZnJvbSBleHRyYWRhdGEgaWYgYnBwIDw9IDguCiAgICAgICAgICAgICAgICAgICAgICAqIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgZXh0cmFkYXRhIGNvbnRhaW5zIG9ubHkgcGFsZXR0ZS4KICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyB0cnVlIGZvciBhbGwgcGFsZXR0ZWQgY29kZWNzIGltcGxlbWVudGVkIGluCiAgICAgICAgICAgICAgICAgICAgICAqIEZGbXBlZy4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8PSA4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbF9zaXplID0gKDEgPDwgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIDw8IDI7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPD0gOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWxfc2l6ZSA9ICgxIDw8IHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSA8PCAyOwogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcGFsX3NyYzsKIAotICAgICAgICAgICAgICAgICAgICAgICAgcGFsX3NpemUgPSBGRk1JTihwYWxfc2l6ZSwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWxfc3JjICA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAtIHBhbF9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgcGFsX3NpemUgPSBGRk1JTihwYWxfc2l6ZSwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYWxfc3JjICA9IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSAtIHBhbF9zaXplOwogICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhjbHVkZSB0aGUgIkJvdHRvbVVwIiBmaWVsZCBmcm9tIHRoZSBwYWxldHRlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFsX3NyYyAtIHN0LT5jb2RlYy0+ZXh0cmFkYXRhID49IDkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbWVtY21wKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAtIDksICJCb3R0b21VcCIsIDkpKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhbF9zcmMgLSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSA+PSA5ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1lbWNtcChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgLSA5LCAiQm90dG9tVXAiLCA5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxfc3JjIC09IDk7CiAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFsX3NpemUgLyA0OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5wYWxbaV0gPSAweEZGVTw8MjQgfCBBVl9STDMyKHBhbF9zcmMrNCppKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPnBhbFtpXSA9IDB4RkZVPDwyNCB8IEFWX1JMMzIocGFsX3NyYyArIDQgKiBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+aGFzX3BhbCA9IDE7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBwcmludF90YWcoInZpZGVvIiwgdGFnMSwgMCk7CiAKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSB0YWcxOwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gdGFnMTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnMSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIElmIGNvZGVjIGlzIG5vdCBmb3VuZCB5ZXQsIHRyeSB3aXRoIHRoZSBtb3YgdGFncy4gKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmNvZGVjX2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyIHRhZ19idWZbMzJdOwotICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2NvZGVjX3RhZ19zdHJpbmcodGFnX2J1Ziwgc2l6ZW9mKHRhZ19idWYpLCB0YWcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPQorICAgICAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19tb3Z2aWRlb190YWdzLCB0YWcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdiB0YWcgZm91bmQgaW4gYXZpIChmb3VyY2MgJXMpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZvdXJjYzJzdHIodGFnMSkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgbmVlZGVkIHRvIGdldCB0aGUgcGljdCB0eXBlIHdoaWNoIGlzIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgICAgICAgKiBmb3IgZ2VuZXJhdGluZyBjb3JyZWN0IHB0cy4gKi8KICAgICAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgJiYKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+aGFuZGxlciA9PSBNS1RBRygnWCcsICdWJywgJ0knLCAnRCcpKQotICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnWCcsICdWJywgJ0knLCAnRCcpOworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBNS1RBRygnWCcsICdWJywgJ0knLCAnRCcpOwogCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBNS1RBRygnVicsICdTJywgJ1MnLCAnSCcpKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ1YnLCAnUycsICdTJywgJ0gnKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjQwKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjQwKQogICAgICAgICAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX05PTkU7CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnID09IDAgJiYgc3QtPmNvZGVjLT5oZWlnaHQgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIDwgMVUgPDwgMzApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKz0gOTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZfcmVhbGxvY3AoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID09IDAgJiYgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplIDwgMVUgPDwgMzApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKz0gOTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZfcmVhbGxvY3AoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIC0gOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplIC0gOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJvdHRvbVVwIiwgOSk7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBGRkFCUyhzdC0+Y29kZWMtPmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gRkZBQlMoc3QtPmNvZGVjcGFyLT5oZWlnaHQpOwogCiAvLyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gNSAqIDQpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlYywgc2l6ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGZmX2dldF93YXZfaGVhZGVyKHMsIHBiLCBzdC0+Y29kZWNwYXIsIHNpemUsIDApOwogICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24gPSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOwotICAgICAgICAgICAgICAgICAgICBpZiAoYXN0LT5zYW1wbGVfc2l6ZSAmJiBzdC0+Y29kZWMtPmJsb2NrX2FsaWduICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBhc3QtPnNhbXBsZV9zaXplICE9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pIHsKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5kc2hvd19ibG9ja19hbGlnbiA9IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ247CisgICAgICAgICAgICAgICAgICAgIGlmIChhc3QtPnNhbXBsZV9zaXplICYmIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+c2FtcGxlX3NpemUgIT0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbikgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZSBzaXplICglZCkgIT0gYmxvY2sgYWxpZ24gKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPnNhbXBsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pOwotICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5zYW1wbGVfc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbik7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPnNhbXBsZV9zaXplID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvKiAyLWFsaWduZWQKICAgICAgICAgICAgICAgICAgICAgICogKGZpeCBmb3IgU3RhcmdhdGUgU0ctMSAtIDN4MTggLSBTaGFkZXMgb2YgR3JleS5hdmkpICovCkBAIC04NjEsNDUgKzg2OCw0NSBAQAogICAgICAgICAgICAgICAgICAgICAvKiBBRFRTIGhlYWRlciBpcyBpbiBleHRyYWRhdGEsIEFBQyB3aXRob3V0IGhlYWRlciBtdXN0IGJlCiAgICAgICAgICAgICAgICAgICAgICAqIHN0b3JlZCBhcyBleGFjdCBmcmFtZXMuIFBhcnNlciBub3QgbmVlZGVkIGFuZCBpdCB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAqIGZhaWwuICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX05PTkU7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmbGFjIHBhcnNlciBkb2VzIG5vdCB3b3JrIHdpdGggQVZTVFJFQU1fUEFSU0VfVElNRVNUQU1QUwotICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFDKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFDKQogICAgICAgICAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX05PTkU7CiAgICAgICAgICAgICAgICAgICAgIC8qIEFWSSBmaWxlcyB3aXRoIFhhbiBEUENNIGF1ZGlvICh3cm9uZ2x5KSBkZWNsYXJlIFBDTQogICAgICAgICAgICAgICAgICAgICAgKiBhdWRpbyBpbiB0aGUgaGVhZGVyIGJ1dCBoYXZlIEF4YW4gYXMgc3RyZWFtX2NvZGVfdGFnLiAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoYXN0LT5oYW5kbGVyID09IEFWX1JMMzIoIkF4YW4iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgPSBBVl9DT0RFQ19JRF9YQU5fRFBDTTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgID0gQVZfQ09ERUNfSURfWEFOX0RQQ007CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPmRzaG93X2Jsb2NrX2FsaWduID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpZiAoYW12X2ZpbGVfZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0FNVjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQU1WOwogICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5kc2hvd19ibG9ja19hbGlnbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMQUMgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMiApICYmIGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24gPD0gNCAmJiBhc3QtPmRzaG93X2Jsb2NrX2FsaWduKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFDIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIgKSAmJiBhc3QtPmRzaG93X2Jsb2NrX2FsaWduIDw9IDQgJiYgYXN0LT5kc2hvd19ibG9ja19hbGlnbikgewogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIm92ZXJyaWRpbmcgaW52YWxpZCBkc2hvd19ibG9ja19hbGlnbiBvZiAlZFxuIiwgYXN0LT5kc2hvd19ibG9ja19hbGlnbik7CiAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPmRzaG93X2Jsb2NrX2FsaWduID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYgYXN0LT5kc2hvd19ibG9ja19hbGlnbiA9PSAxMDI0ICYmIGFzdC0+c2FtcGxlX3NpemUgPT0gMTAyNCB8fAotICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJiBhc3QtPmRzaG93X2Jsb2NrX2FsaWduID09IDQwOTYgJiYgYXN0LT5zYW1wbGVfc2l6ZSA9PSA0MDk2IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzICYmIGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24gPT0gMTE1MiAmJiBhc3QtPnNhbXBsZV9zaXplID09IDExNTIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmIGFzdC0+ZHNob3dfYmxvY2tfYWxpZ24gPT0gMTAyNCAmJiBhc3QtPnNhbXBsZV9zaXplID09IDEwMjQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYgYXN0LT5kc2hvd19ibG9ja19hbGlnbiA9PSA0MDk2ICYmIGFzdC0+c2FtcGxlX3NpemUgPT0gNDA5NiB8fAorICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMyAmJiBhc3QtPmRzaG93X2Jsb2NrX2FsaWduID09IDExNTIgJiYgYXN0LT5zYW1wbGVfc2l6ZSA9PSAxMTUyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAib3ZlcnJpZGluZyBzYW1wbGVfc2l6ZVxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPnNhbXBsZV9zaXplID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CiAgICAgICAgICAgICAgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlPSAxOwogICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICA9IDA7CiAgICAgICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTkwNyw4ICs5MTQsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUtUQUcoJ3MnLCAndCcsICdyJywgJ2QnKToKICAgICAgICAgICAgIGlmIChzdHJlYW1faW5kZXggPj0gKHVuc2lnbmVkKXMtPm5iX3N0cmVhbXMKLSAgICAgICAgICAgICAgICB8fCBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjLT5leHRyYWRhdGFfc2l6ZQotICAgICAgICAgICAgICAgIHx8IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPmNvZGVjX3RhZyA9PSBNS1RBRygnSCcsJzInLCc2JywnNCcpKSB7CisgICAgICAgICAgICAgICAgfHwgcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUKKyAgICAgICAgICAgICAgICB8fCBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ0gnLCcyJywnNicsJzQnKSkgewogICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHVpbnQ2NF90IGN1cl9wb3MgPSBhdmlvX3RlbGwocGIpOwpAQCAtOTE3LDE0ICs5MjQsMTggQEAKICAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKIAogICAgICAgICAgICAgICAgIGlmIChzaXplPCgxPDwzMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk5ldyBleHRyYWRhdGEgaW4gc3RyZCBjaHVuaywgZnJlZWluZyBwcmV2aW91cyBvbmUuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEocywgc3QtPmNvZGVjcGFyLCBwYiwgc2l6ZSkgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAmIDEpIC8vRklYTUUgY2hlY2sgaWYgdGhlIGVuY29kZXIgcmVhbGx5IGRpZCB0aGlzIGNvcnJlY3RseQorICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICYgMSkgLy9GSVhNRSBjaGVjayBpZiB0aGUgZW5jb2RlciByZWFsbHkgZGlkIHRoaXMgY29ycmVjdGx5CiAgICAgICAgICAgICAgICAgICAgIGF2aW9fcjgocGIpOwogCi0gICAgICAgICAgICAgICAgcmV0ID0gYXZpX2V4dHJhY3Rfc3RyZWFtX21ldGFkYXRhKHN0KTsKKyAgICAgICAgICAgICAgICByZXQgPSBhdmlfZXh0cmFjdF9zdHJlYW1fbWV0YWRhdGEocywgc3QpOwogICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImNvdWxkIG5vdCBkZWNvZGluZyBFWElGIGRhdGEgaW4gc3RyZWFtIGhlYWRlci5cbiIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTkzMiw5ICs5NDMsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUtUQUcoJ2knLCAnbicsICdkJywgJ3gnKToKICAgICAgICAgICAgIHBvcyA9IGF2aW9fdGVsbChwYik7Ci0gICAgICAgICAgICBpZiAocGItPnNlZWthYmxlICYmICEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0lHTklEWCkgJiYKKyAgICAgICAgICAgIGlmICgocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmICEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0lHTklEWCkgJiYKICAgICAgICAgICAgICAgICBhdmktPnVzZV9vZG1sICYmCi0gICAgICAgICAgICAgICAgcmVhZF9icmFpbmRlYWRfb2RtbF9pbmR4KHMsIDApIDwgMCAmJgorICAgICAgICAgICAgICAgIHJlYWRfb2RtbF9pbmRleChzLCAwKSA8IDAgJiYKICAgICAgICAgICAgICAgICAocy0+ZXJyb3JfcmVjb2duaXRpb24gJiBBVl9FRl9FWFBMT0RFKSkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIHBvcyArIHNpemUsIFNFRUtfU0VUKTsKQEAgLTk3OCwxMyArOTg5LDE3IEBACiAgICAgICAgICAgICBpZiAoc2l6ZSA+IDEwMDAwMDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiU29tZXRoaW5nIHdlbnQgd3JvbmcgZHVyaW5nIGhlYWRlciBwYXJzaW5nLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICJJIHdpbGwgaWdub3JlIGl0IGFuZCB0cnkgdG8gY29udGludWUgYW55d2F5LlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICJ0YWcgJXMgaGFzIHNpemUgJXUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgIkkgd2lsbCBpZ25vcmUgaXQgYW5kIHRyeSB0byBjb250aW51ZSBhbnl3YXkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKHRhZyksIHNpemUpOwogICAgICAgICAgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpCiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgICAgICBhdmktPm1vdmlfbGlzdCA9IGF2aW9fdGVsbChwYikgLSA0OwogICAgICAgICAgICAgICAgIGF2aS0+bW92aV9lbmQgID0gYXZpLT5mc2l6ZTsKICAgICAgICAgICAgICAgICBnb3RvIGVuZF9vZl9oZWFkZXI7CiAgICAgICAgICAgICB9CisgICAgICAgIC8qIERvIG5vdCBmYWlsIGZvciB2ZXJ5IGxhcmdlIGlkeDEgdGFncyAqLworICAgICAgICBjYXNlIE1LVEFHKCdpJywgJ2QnLCAneCcsICcxJyk6CiAgICAgICAgICAgICAvKiBza2lwIHRhZyAqLwogICAgICAgICAgICAgc2l6ZSArPSAoc2l6ZSAmIDEpOwogICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKQEAgLTEwMDAsNyArMTAxNSw3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGlmICghYXZpLT5pbmRleF9sb2FkZWQgJiYgcGItPnNlZWthYmxlKQorICAgIGlmICghYXZpLT5pbmRleF9sb2FkZWQgJiYgKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKICAgICAgICAgYXZpX2xvYWRfaW5kZXgocyk7CiAgICAgY2FsY3VsYXRlX2JpdHJhdGUocyk7CiAgICAgYXZpLT5pbmRleF9sb2FkZWQgICAgfD0gMTsKQEAgLTEwMTQsOCArMTAyOSw4IEBACiAgICAgaWYgKGRpY3RfZW50cnkgJiYgIXN0cmNtcChkaWN0X2VudHJ5LT52YWx1ZSwgIlBvdEVuY29kZXIiKSkKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgIGlmICggICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8KLSAgICAgICAgICAgICAgICB8fCBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pCisgICAgICAgICAgICBpZiAoICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPCisgICAgICAgICAgICAgICAgfHwgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKQogICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwogICAgICAgICB9CiAKQEAgLTEwODQsMTggKzEwOTksMjIgQEAKICAgICAgICAgaWYgKCFzdWJfZGVtdXhlcikKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAKKyAgICAgICAgaWYgKHN0cmNtcChzdWJfZGVtdXhlci0+bmFtZSwgInNydCIpICYmIHN0cmNtcChzdWJfZGVtdXhlci0+bmFtZSwgImFzcyIpKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKwogICAgICAgICBpZiAoIShhc3QtPnN1Yl9jdHggPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCkpKQogICAgICAgICAgICAgZ290byBlcnJvcjsKIAogICAgICAgICBhc3QtPnN1Yl9jdHgtPnBiID0gcGI7CiAKLSAgICAgICAgaWYgKGZmX2NvcHlfd2hpdGVsaXN0cyhhc3QtPnN1Yl9jdHgsIHMpIDwgMCkKKyAgICAgICAgaWYgKGZmX2NvcHlfd2hpdGVibGFja2xpc3RzKGFzdC0+c3ViX2N0eCwgcykgPCAwKQogICAgICAgICAgICAgZ290byBlcnJvcjsKIAogICAgICAgICBpZiAoIWF2Zm9ybWF0X29wZW5faW5wdXQoJmFzdC0+c3ViX2N0eCwgIiIsIHN1Yl9kZW11eGVyLCBOVUxMKSkgeworICAgICAgICAgICAgaWYgKGFzdC0+c3ViX2N0eC0+bmJfc3RyZWFtcyAhPSAxKQorICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICBmZl9yZWFkX3BhY2tldChhc3QtPnN1Yl9jdHgsICZhc3QtPnN1Yl9wa3QpOwotICAgICAgICAgICAgKnN0LT5jb2RlYyA9ICphc3QtPnN1Yl9jdHgtPnN0cmVhbXNbMF0tPmNvZGVjOwotICAgICAgICAgICAgYXN0LT5zdWJfY3R4LT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhID0gTlVMTDsKKyAgICAgICAgICAgIGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KHN0LT5jb2RlY3BhciwgYXN0LT5zdWJfY3R4LT5zdHJlYW1zWzBdLT5jb2RlY3Bhcik7CiAgICAgICAgICAgICB0aW1lX2Jhc2UgPSBhc3QtPnN1Yl9jdHgtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZTsKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCB0aW1lX2Jhc2UubnVtLCB0aW1lX2Jhc2UuZGVuKTsKICAgICAgICAgfQpAQCAtMTEwNSw3ICsxMTI0LDcgQEAKIAogZXJyb3I6CiAgICAgICAgIGF2X2ZyZWVwKCZhc3QtPnN1Yl9jdHgpOwotICAgICAgICBhdl9mcmVlcCgmcGIpOworICAgICAgICBhdmlvX2NvbnRleHRfZnJlZSgmcGIpOwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTExODgsNyArMTIwNyw4IEBACiAgICAgICAgIGlmICgoZFswXSA9PSAnaScgJiYgZFsxXSA9PSAneCcgJiYgbiA8IHMtPm5iX3N0cmVhbXMpIHx8CiAgICAgICAgICAgICAvLyBwYXJzZSBKVU5LCiAgICAgICAgICAgICAoZFswXSA9PSAnSicgJiYgZFsxXSA9PSAnVScgJiYgZFsyXSA9PSAnTicgJiYgZFszXSA9PSAnSycpIHx8Ci0gICAgICAgICAgICAoZFswXSA9PSAnaScgJiYgZFsxXSA9PSAnZCcgJiYgZFsyXSA9PSAneCcgJiYgZFszXSA9PSAnMScpKSB7CisgICAgICAgICAgICAoZFswXSA9PSAnaScgJiYgZFsxXSA9PSAnZCcgJiYgZFsyXSA9PSAneCcgJiYgZFszXSA9PSAnMScpIHx8CisgICAgICAgICAgICAoZFswXSA9PSAnaScgJiYgZFsxXSA9PSAnbicgJiYgZFsyXSA9PSAnZCcgJiYgZFszXSA9PSAneCcpKSB7CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOwogICAgICAgICAgICAgZ290byBzdGFydF9zeW5jOwogICAgICAgICB9CkBAIC0xMjMyLDggKzEyNTIsOCBAQAogICAgICAgICAgICAgICAgIC8vIHdvcmthcm91bmQgZm9yIGJyb2tlbiBzbWFsbC1maWxlLWJ1ZzQwMi5hdmkKICAgICAgICAgICAgICAgICBpZiAoICAgZFsyXSA9PSAndycgJiYgZFszXSA9PSAnYicKICAgICAgICAgICAgICAgICAgICAmJiBuID09IDAKLSAgICAgICAgICAgICAgICAgICAmJiBzdCAtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTwotICAgICAgICAgICAgICAgICAgICYmIHN0MS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPCisgICAgICAgICAgICAgICAgICAgJiYgc3QgLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8KKyAgICAgICAgICAgICAgICAgICAmJiBzdDEtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTwogICAgICAgICAgICAgICAgICAgICYmIGFzdC0+cHJlZml4ID09ICdkJyoyNTYrJ2MnCiAgICAgICAgICAgICAgICAgICAgJiYgKGRbMl0qMjU2K2RbM10gPT0gYXN0MS0+cHJlZml4IHx8ICFhc3QxLT5wcmVmaXhfY291bnQpCiAgICAgICAgICAgICAgICAgICApIHsKQEAgLTEyNDUsMTkgKzEyNjUsNiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCFhdmktPmR2X2RlbXV4ICYmCi0gICAgICAgICAgICAgICAgKChzdC0+ZGlzY2FyZCA+PSBBVkRJU0NBUkRfREVGQVVMVCAmJiBzaXplID09IDApIC8qIHx8Ci0gICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBuZWVkcyBhIGxpdHRsZSByZW9yZGVyaW5nCi0gICAgICAgICAgICAgICAgIChzdC0+ZGlzY2FyZCA+PSBBVkRJU0NBUkRfTk9OS0VZICYmCi0gICAgICAgICAgICAgICAgICEocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkpICovCi0gICAgICAgICAgICAgICAgfHwgc3QtPmRpc2NhcmQgPj0gQVZESVNDQVJEX0FMTCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWV4aXRfZWFybHkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXN0LT5mcmFtZV9vZmZzZXQgKz0gZ2V0X2R1cmF0aW9uKGFzdCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gc3RhcnRfc3luYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIGlmIChkWzJdID09ICdwJyAmJiBkWzNdID09ICdjJyAmJiBzaXplIDw9IDQgKiAyNTYgKyA0KSB7CiAgICAgICAgICAgICAgICAgaW50IGsgICAgPSBhdmlvX3I4KHBiKTsKICAgICAgICAgICAgICAgICBpbnQgbGFzdCA9IChrICsgYXZpb19yOChwYikgLSAxKSAmIDB4RkY7CkBAIC0xMjg0LDYgKzEyOTEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgYXN0LT5wcmVmaXhfY291bnQgPSAwOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmICghYXZpLT5kdl9kZW11eCAmJgorICAgICAgICAgICAgICAgICAgICAoKHN0LT5kaXNjYXJkID49IEFWRElTQ0FSRF9ERUZBVUxUICYmIHNpemUgPT0gMCkgLyogfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBuZWVkcyBhIGxpdHRsZSByZW9yZGVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAoc3QtPmRpc2NhcmQgPj0gQVZESVNDQVJEX05PTktFWSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIShwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSkgKi8KKyAgICAgICAgICAgICAgICAgICAgfHwgc3QtPmRpc2NhcmQgPj0gQVZESVNDQVJEX0FMTCkpIHsKKworICAgICAgICAgICAgICAgICAgICBhc3QtPmZyYW1lX29mZnNldCArPSBnZXRfZHVyYXRpb24oYXN0LCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBzdGFydF9zeW5jOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGF2aS0+c3RyZWFtX2luZGV4ID0gbjsKICAgICAgICAgICAgICAgICBhc3QtPnBhY2tldF9zaXplICA9IHNpemUgKyA4OwogICAgICAgICAgICAgICAgIGFzdC0+cmVtYWluaW5nICAgID0gc2l6ZTsKQEAgLTE0NDMsOCArMTQ2Miw4IEBACiAgICAgICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKICAgICAgICAgICAgIGlmIChzaXplIDwgMCkKICAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKLSAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICYmCi0gICAgICAgICAgICAgICAgICAgIXN0LT5jb2RlYy0+Y29kZWNfdGFnICYmIHJlYWRfZ2FiMl9zdWIocywgc3QsIHBrdCkpIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICYmCisgICAgICAgICAgICAgICAgICAgIXN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICYmIHJlYWRfZ2FiMl9zdWIocywgc3QsIHBrdCkpIHsKICAgICAgICAgICAgIGFzdC0+ZnJhbWVfb2Zmc2V0Kys7CiAgICAgICAgICAgICBhdmktPnN0cmVhbV9pbmRleCA9IC0xOwogICAgICAgICAgICAgYXN0LT5yZW1haW5pbmcgICAgPSAwOwpAQCAtMTQ1NSwyMCArMTQ3NCw5IEBACiAvLyAgICAgICAgICAgICAgICBwa3QtPmR0cyArPSBhc3QtPnN0YXJ0OwogICAgICAgICAgICAgaWYgKGFzdC0+c2FtcGxlX3NpemUpCiAgICAgICAgICAgICAgICAgcGt0LT5kdHMgLz0gYXN0LT5zYW1wbGVfc2l6ZTsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsCi0gICAgICAgICAgICAgICAgICAgICJkdHM6JSJQUklkNjQiIG9mZnNldDolIlBSSWQ2NCIgJWQvJWQgc21wbF9zaXo6JWQgIgotICAgICAgICAgICAgICAgICAgICAiYmFzZTolZCBzdDolZCBzaXplOiVkXG4iLAotICAgICAgICAgICAgICAgICAgICBwa3QtPmR0cywKLSAgICAgICAgICAgICAgICAgICAgYXN0LT5mcmFtZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGFzdC0+c2NhbGUsCi0gICAgICAgICAgICAgICAgICAgIGFzdC0+cmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgYXN0LT5zYW1wbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFLAotICAgICAgICAgICAgICAgICAgICBhdmktPnN0cmVhbV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CiAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGF2aS0+c3RyZWFtX2luZGV4OwogCi0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBzdC0+aW5kZXhfZW50cmllcykgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc3QtPmluZGV4X2VudHJpZXMpIHsKICAgICAgICAgICAgICAgICBBVkluZGV4RW50cnkgKmU7CiAgICAgICAgICAgICAgICAgaW50IGluZGV4OwogCkBAIC0xNDc5LDcgKzE0ODcsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT0gc3QtPm5iX2luZGV4X2VudHJpZXMtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleT0xOwogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RhdGU9LTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSBwa3QtPmRhdGEsICplbmQgPSBwdHIgKyBGRk1JTihzaXplLCAyNTYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwdHIgPCBlbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gYXZwcml2X2ZpbmRfc3RhcnRfY29kZShwdHIsIGVuZCwgJnN0YXRlKTsKQEAgLTE1NTcsNyArMTU2NSw3IEBACiAgICAgYXZpLT5zdHJlYW1faW5kZXggPSAtMTsKICAgICBhdmlvX3NlZWsocGIsIGlkeDFfcG9zLCBTRUVLX1NFVCk7CiAKLSAgICBpZiAocy0+bmJfc3RyZWFtcyA9PSAxICYmIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190YWcgPT0gQVZfUkwzMigiTU1FUyIpKSB7CisgICAgaWYgKHMtPm5iX3N0cmVhbXMgPT0gMSAmJiBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfdGFnID09IEFWX1JMMzIoIk1NRVMiKSkgewogICAgICAgICBmaXJzdF9wYWNrZXRfcG9zID0gMDsKICAgICAgICAgZGF0YV9vZmZzZXQgPSBhdmktPm1vdmlfbGlzdDsKICAgICB9CkBAIC0xNTgxLDYgKzE1ODksMTEgQEAKICAgICAgICAgc3QgID0gcy0+c3RyZWFtc1tpbmRleF07CiAgICAgICAgIGFzdCA9IHN0LT5wcml2X2RhdGE7CiAKKyAgICAgICAgLyogU2tpcCAneHhwYycgcGFsZXR0ZSBjaGFuZ2UgZW50cmllcyBpbiB0aGUgaW5kZXggdW50aWwgYSBsb2dpYworICAgICAgICAgKiB0byBwcm9jZXNzIHRoZXNlIGlzIHByb3Blcmx5IGltcGxlbWVudGVkLiAqLworICAgICAgICBpZiAoKHRhZyA+PiAxNiAmIDB4ZmYpID09ICdwJyAmJiAodGFnID4+IDI0ICYgMHhmZikgPT0gJ2MnKQorICAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgaWYgKGZpcnN0X3BhY2tldCAmJiBmaXJzdF9wYWNrZXRfcG9zKSB7CiAgICAgICAgICAgICBpZiAoYXZpLT5tb3ZpX2xpc3QgKyA0ICE9IHBvcyB8fCBwb3MgKyA1MDAgPiBmaXJzdF9wYWNrZXRfcG9zKQogICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICA9IGZpcnN0X3BhY2tldF9wb3MgLSBwb3M7CkBAIC0xNjU2LDcgKzE2NjksNyBAQAogICAgICAgICAgICAgICAgIG1heF9kdHMgPSBGRk1BWChtYXhfZHRzLCBkdHMpOwogICAgICAgICAgICAgICAgIG1heF9idWZmZXIgPSBGRk1BWChtYXhfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKGR0cyAtIG1pbl9kdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNjk1LDYgKzE3MDgsOCBAQAogICAgICAgICAgICAgc2l6ZSA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgICAgICAgICBpZiAoZ2V0X3N0cmVhbV9pZHgodGFnKSA9PSBpICYmIHBvcyArIHNpemUgPiBzdC0+aW5kZXhfZW50cmllc1sxXS5wb3MpCiAgICAgICAgICAgICAgICAgbGFzdF9zdGFydCA9IElOVDY0X01BWDsKKyAgICAgICAgICAgIGlmIChnZXRfc3RyZWFtX2lkeCh0YWcpID09IGkgJiYgc2l6ZSA9PSBzdC0+aW5kZXhfZW50cmllc1swXS5zaXplICsgOCkKKyAgICAgICAgICAgICAgICBsYXN0X3N0YXJ0ID0gSU5UNjRfTUFYOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHN0LT5pbmRleF9lbnRyaWVzWzBdLnBvcyA+IGxhc3Rfc3RhcnQpCkBAIC0xNzI5LDEzICsxNzQ0LDYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBuZXh0ID0gYXZpb190ZWxsKHBiKSArIHNpemUgKyAoc2l6ZSAmIDEpOwogCi0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJ0YWc9JWMlYyVjJWMgc2l6ZT0weCV4XG4iLAotICAgICAgICAgICAgICAgICB0YWcgICAgICAgICYgMHhmZiwKLSAgICAgICAgICAgICAgICAodGFnID4+ICA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgKHRhZyA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICh0YWcgPj4gMjQpICYgMHhmZiwKLSAgICAgICAgICAgICAgICBzaXplKTsKLQogICAgICAgICBpZiAodGFnID09IE1LVEFHKCdpJywgJ2QnLCAneCcsICcxJykgJiYKICAgICAgICAgICAgIGF2aV9yZWFkX2lkeDEocywgc2l6ZSkgPj0gMCkgewogICAgICAgICAgICAgYXZpLT5pbmRleF9sb2FkZWQ9MjsKQEAgLTE4NDIsOCArMTg1MCw3IEBACiAgICAgICAgIGlmIChzdDItPm5iX2luZGV4X2VudHJpZXMgPD0gMCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0vLyAgICAgICAgYXZfYXNzZXJ0MShzdDItPmNvZGVjLT5ibG9ja19hbGlnbik7Ci0gICAgICAgIGF2X2Fzc2VydDAoZmFicyhhdl9xMmQoc3QyLT50aW1lX2Jhc2UpIC0gYXN0Mi0+c2NhbGUgLyAoZG91YmxlKWFzdDItPnJhdGUpIDwgYXZfcTJkKHN0Mi0+dGltZV9iYXNlKSAqIDAuMDAwMDAwMDEpOworLy8gICAgICAgIGF2X2Fzc2VydDEoc3QyLT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pOwogICAgICAgICBpbmRleCA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLApAQCAtMTg1MSw3ICsxODU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGTUFYKGFzdDItPnNhbXBsZV9zaXplLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU0VFS19GTEFHX0JBQ0tXQVJEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdDItPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyA/IEFWU0VFS19GTEFHX0FOWSA6IDApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdDItPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyA/IEFWU0VFS19GTEFHX0FOWSA6IDApKTsKICAgICAgICAgaWYgKGluZGV4IDwgMCkKICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgYXN0Mi0+c2Vla19wb3MgPSBzdDItPmluZGV4X2VudHJpZXNbaW5kZXhdLnBvczsKQEAgLTE4NjcsNyArMTg3NCw3IEBACiAgICAgICAgIGluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcCgKICAgICAgICAgICAgICAgICBzdDIsCiAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZV9xKHRpbWVzdGFtcCwgc3QtPnRpbWVfYmFzZSwgc3QyLT50aW1lX2Jhc2UpICogRkZNQVgoYXN0Mi0+c2FtcGxlX3NpemUsIDEpLAotICAgICAgICAgICAgICAgIGZsYWdzIHwgQVZTRUVLX0ZMQUdfQkFDS1dBUkQgfCAoc3QyLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gPyBBVlNFRUtfRkxBR19BTlkgOiAwKSk7CisgICAgICAgICAgICAgICAgZmxhZ3MgfCBBVlNFRUtfRkxBR19CQUNLV0FSRCB8IChzdDItPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyA/IEFWU0VFS19GTEFHX0FOWSA6IDApKTsKICAgICAgICAgaWYgKGluZGV4IDwgMCkKICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgd2hpbGUgKCFhdmktPm5vbl9pbnRlcmxlYXZlZCAmJiBpbmRleD4wICYmIHN0Mi0+aW5kZXhfZW50cmllc1tpbmRleC0xXS5wb3MgPj0gcG9zX21pbikKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2F2aWVuYy5jIGIvbGliYXZmb3JtYXQvYXZpZW5jLmMKaW5kZXggNjQ5OTYxZC4uYWMwZjA0YyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXZpZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvYXZpZW5jLmMKQEAgLTE5LDcgKzE5LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0vLyNkZWZpbmUgREVCVUcKKyNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAibXBlZ3RzLmgiCiAjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZsYW5ndWFnZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKQEAgLTQ0LDEwICs0NSwxNiBAQAogICovCiAKIHR5cGVkZWYgc3RydWN0IEFWSUllbnRyeSB7Ci0gICAgdW5zaWduZWQgaW50IGZsYWdzLCBwb3MsIGxlbjsKKyAgICBjaGFyIHRhZ1s0XTsKKyAgICB1bnNpZ25lZCBpbnQgZmxhZ3M7CisgICAgdW5zaWduZWQgaW50IHBvczsKKyAgICB1bnNpZ25lZCBpbnQgbGVuOwogfSBBVklJZW50cnk7CiAKICNkZWZpbmUgQVZJX0lOREVYX0NMVVNURVJfU0laRSAxNjM4NAorI2RlZmluZSBBVklfTUFTVEVSX0lOREVYX1BSRUZJWF9TSVpFICAgICg4KzIrMSsxKzQrOCs0KzQpCisjZGVmaW5lIEFWSV9NQVNURVJfSU5ERVhfRU5UUllfU0laRSAgICAgMTYgIC8qIGJ5dGVzIHBlciBlbnRyeSAqLworI2RlZmluZSBBVklfTUFTVEVSX0lOREVYX1NJWkVfREVGQVVMVCAgIDI1NiAvKiBudW1iZXIgb2YgZW50cmllcyAqLwogCiB0eXBlZGVmIHN0cnVjdCBBVklJbmRleCB7CiAgICAgaW50NjRfdCAgICAgaW5keF9zdGFydDsKQEAgLTYzLDYgKzcwLDggQEAKICAgICBpbnQ2NF90IHJpZmZfc3RhcnQsIG1vdmlfbGlzdCwgb2RtbF9saXN0OwogICAgIGludDY0X3QgZnJhbWVzX2hkcl9hbGw7CiAgICAgaW50IHJpZmZfaWQ7CisgICAgaW50IHJlc2VydmVfaW5kZXhfc3BhY2U7CisgICAgaW50IG1hc3Rlcl9pbmRleF9tYXhfc2l6ZTsKICAgICBpbnQgd3JpdGVfY2hhbm5lbF9tYXNrOwogfSBBVklDb250ZXh0OwogCkBAIC03Nyw5ICs4NiwxNSBAQAogICAgIGludDY0X3QgbGFzdF9kdHM7CiAKICAgICBBVklJbmRleCBpbmRleGVzOworCisgICAgaW50NjRfdCBzdHJoX2ZsYWdzX29mZnNldDsKKworICAgIHVpbnQzMl90IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKKyAgICB1aW50MzJfdCBvbGRfcGFsZXR0ZVtBVlBBTEVUVEVfQ09VTlRdOworICAgIGludDY0X3QgcGFsX29mZnNldDsKIH0gQVZJU3RyZWFtOwogCi1zdGF0aWMgaW50IGF2aV93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KTsKK3N0YXRpYyBpbnQgYXZpX3dyaXRlX3BhY2tldF9pbnRlcm5hbChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpOwogCiBzdGF0aWMgaW5saW5lIEFWSUllbnRyeSAqYXZpX2dldF9pZW50cnkoY29uc3QgQVZJSW5kZXggKmlkeCwgaW50IGVudF9pZCkKIHsKQEAgLTg4LDYgKzEwMyw1OCBAQAogICAgIHJldHVybiAmaWR4LT5jbHVzdGVyW2NsXVtpZF07CiB9CiAKK3N0YXRpYyBpbnQgYXZpX2FkZF9pZW50cnkoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IHNpemUpCit7CisgICAgQVZJQ29udGV4dCAqYXZpICA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgID0gcy0+cGI7CisgICAgQVZJU3RyZWFtICphdmlzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+cHJpdl9kYXRhOworICAgIEFWSUluZGV4ICppZHggICAgPSAmYXZpc3QtPmluZGV4ZXM7CisgICAgaW50IGNsICAgICAgICAgICA9IGlkeC0+ZW50cnkgLyBBVklfSU5ERVhfQ0xVU1RFUl9TSVpFOworICAgIGludCBpZCAgICAgICAgICAgPSBpZHgtPmVudHJ5ICUgQVZJX0lOREVYX0NMVVNURVJfU0laRTsKKworICAgIGlmIChpZHgtPmVudHNfYWxsb2NhdGVkIDw9IGlkeC0+ZW50cnkpIHsKKyAgICAgICAgaWR4LT5jbHVzdGVyID0gYXZfcmVhbGxvY19mKGlkeC0+Y2x1c3Rlciwgc2l6ZW9mKHZvaWQqKSwgY2wrMSk7CisgICAgICAgIGlmICghaWR4LT5jbHVzdGVyKSB7CisgICAgICAgICAgICBpZHgtPmVudHNfYWxsb2NhdGVkID0gMDsKKyAgICAgICAgICAgIGlkeC0+ZW50cnkgICAgICAgICAgPSAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBpZHgtPmNsdXN0ZXJbY2xdID0KKyAgICAgICAgICAgIGF2X21hbGxvYyhBVklfSU5ERVhfQ0xVU1RFUl9TSVpFICogc2l6ZW9mKEFWSUllbnRyeSkpOworICAgICAgICBpZiAoIWlkeC0+Y2x1c3RlcltjbF0pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZHgtPmVudHNfYWxsb2NhdGVkICs9IEFWSV9JTkRFWF9DTFVTVEVSX1NJWkU7CisgICAgfQorCisgICAgaWYgKHRhZykKKyAgICAgICAgbWVtY3B5KGlkeC0+Y2x1c3RlcltjbF1baWRdLnRhZywgdGFnLCA0KTsKKyAgICBlbHNlCisgICAgICAgIG1lbXNldChpZHgtPmNsdXN0ZXJbY2xdW2lkXS50YWcsIDAsIDQpOworICAgIGlkeC0+Y2x1c3RlcltjbF1baWRdLmZsYWdzID0gZmxhZ3M7CisgICAgaWR4LT5jbHVzdGVyW2NsXVtpZF0ucG9zICAgPSBhdmlvX3RlbGwocGIpIC0gYXZpLT5tb3ZpX2xpc3Q7CisgICAgaWR4LT5jbHVzdGVyW2NsXVtpZF0ubGVuICAgPSBzaXplOworICAgIGF2aXN0LT5tYXhfc2l6ZSA9IEZGTUFYKGF2aXN0LT5tYXhfc2l6ZSwgc2l6ZSk7CisgICAgaWR4LT5lbnRyeSsrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBhdl9jb2xkIGludCBhdmlfaW5pdChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWSUNvbnRleHQgKmF2aSA9IHMtPnByaXZfZGF0YTsKKworICAgIGlmIChhdmktPnJlc2VydmVfaW5kZXhfc3BhY2UgPiAwKSB7CisgICAgICAgIGF2aS0+bWFzdGVyX2luZGV4X21heF9zaXplID0gKGF2aS0+cmVzZXJ2ZV9pbmRleF9zcGFjZSAtIEFWSV9NQVNURVJfSU5ERVhfUFJFRklYX1NJWkUpIC8gQVZJX01BU1RFUl9JTkRFWF9FTlRSWV9TSVpFOworICAgICAgICBhdmktPm1hc3Rlcl9pbmRleF9tYXhfc2l6ZSA9IEZGTUFYKGF2aS0+bWFzdGVyX2luZGV4X21heF9zaXplLCAxNik7CisgICAgfSBlbHNlCisgICAgICAgIGF2aS0+bWFzdGVyX2luZGV4X21heF9zaXplID0gQVZJX01BU1RFUl9JTkRFWF9TSVpFX0RFRkFVTFQ7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInJlc2VydmVfaW5kZXhfc3BhY2U6JWQgbWFzdGVyX2luZGV4X21heF9zaXplOiVkXG4iLAorICAgICAgICAgICBhdmktPnJlc2VydmVfaW5kZXhfc3BhY2UsIGF2aS0+bWFzdGVyX2luZGV4X21heF9zaXplKTsKKworICAgIHJldHVybiAxOyAvKiBzdHJlYW0gaW5pdGlhbGl6YXRpb24gY29udGludWVzIGluIGF2aV93cml0ZV9oZWFkZXIgKi8KK30KKwogc3RhdGljIGludDY0X3QgYXZpX3N0YXJ0X25ld19yaWZmKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJpZmZfdGFnLCBjb25zdCBjaGFyICpsaXN0X3RhZykKIHsKQEAgLTEzNCwyMSArMjAxLDIxIEBACiAgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOwogICAgIGludCBuLCBhdV9ieXRlcmF0ZSwgYXVfc3NpemUsIGF1X3NjYWxlLCBuYl9mcmFtZXMgPSAwOwogICAgIGludDY0X3QgZmlsZV9zaXplOwotICAgIEFWQ29kZWNDb250ZXh0ICpzdHJlYW07CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKIAogICAgIGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7CiAgICAgZm9yIChuID0gMDsgbiA8IHMtPm5iX3N0cmVhbXM7IG4rKykgewogICAgICAgICBBVklTdHJlYW0gKmF2aXN0ID0gcy0+c3RyZWFtc1tuXS0+cHJpdl9kYXRhOwogCiAgICAgICAgIGF2X2Fzc2VydDAoYXZpc3QtPmZyYW1lc19oZHJfc3RybSk7Ci0gICAgICAgIHN0cmVhbSA9IHMtPnN0cmVhbXNbbl0tPmNvZGVjOworICAgICAgICBwYXIgPSBzLT5zdHJlYW1zW25dLT5jb2RlY3BhcjsKICAgICAgICAgYXZpb19zZWVrKHBiLCBhdmlzdC0+ZnJhbWVzX2hkcl9zdHJtLCBTRUVLX1NFVCk7CiAgICAgICAgIGZmX3BhcnNlX3NwZWNpZmljX3BhcmFtcyhzLT5zdHJlYW1zW25dLCAmYXVfYnl0ZXJhdGUsICZhdV9zc2l6ZSwgJmF1X3NjYWxlKTsKICAgICAgICAgaWYgKGF1X3NzaXplID09IDApCiAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGF2aXN0LT5wYWNrZXRfY291bnQpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGF2aXN0LT5hdWRpb19zdHJtX2xlbmd0aCAvIGF1X3NzaXplKTsKLSAgICAgICAgaWYgKHN0cmVhbS0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICAgICAgbmJfZnJhbWVzID0gRkZNQVgobmJfZnJhbWVzLCBhdmlzdC0+cGFja2V0X2NvdW50KTsKICAgICB9CiAgICAgaWYgKHJpZmZfaWQgPT0gMSkgewpAQCAtMTY0LDggKzIzMSw5IEBACiBzdGF0aWMgdm9pZCB3cml0ZV9vZG1sX21hc3RlcihBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgpCiB7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZJQ29udGV4dCAqYXZpID0gcy0+cHJpdl9kYXRhOwogICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gc3QtPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzdC0+Y29kZWNwYXI7CiAgICAgQVZJU3RyZWFtICphdmlzdCA9IHN0LT5wcml2X2RhdGE7CiAgICAgdW5zaWduZWQgY2hhciB0YWdbNV07CiAgICAgaW50IGo7CkBAIC0xNzksMTEgKzI0NywxMSBAQAogICAgIGF2aW9fdzgocGIsIDApOyAgICAgLyogYkluZGV4U3ViVHlwZSAoMCA9PSBmcmFtZSBpbmRleCkgKi8KICAgICBhdmlvX3c4KHBiLCAwKTsgICAgIC8qIGJJbmRleFR5cGUgKDAgPT0gQVZJX0lOREVYX09GX0lOREVYRVMpICovCiAgICAgYXZpb193bDMyKHBiLCAwKTsgICAvKiBuRW50cmllc0luVXNlICh3aWxsIGZpbGwgb3V0IGxhdGVyIG9uKSAqLwotICAgIGZmaW9fd2ZvdXJjYyhwYiwgYXZpX3N0cmVhbTJmb3VyY2ModGFnLCBzdHJlYW1faW5kZXgsIGVuYy0+Y29kZWNfdHlwZSkpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgYXZpX3N0cmVhbTJmb3VyY2ModGFnLCBzdHJlYW1faW5kZXgsIHBhci0+Y29kZWNfdHlwZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgLyogZHdDaHVua0lkICovCiAgICAgYXZpb193bDY0KHBiLCAwKTsgICAvKiBkd1Jlc2VydmVkWzNdICovCiAgICAgYXZpb193bDMyKHBiLCAwKTsgICAvKiBNdXN0IGJlIDAuICAgICovCi0gICAgZm9yIChqID0gMDsgaiA8IEFWSV9NQVNURVJfSU5ERVhfU0laRSAqIDI7IGorKykKKyAgICBmb3IgKGogPSAwOyBqIDwgYXZpLT5tYXN0ZXJfaW5kZXhfbWF4X3NpemUgKiAyOyBqKyspCiAgICAgICAgIGF2aW9fd2w2NChwYiwgMCk7CiAgICAgZmZfZW5kX3RhZyhwYiwgYXZpc3QtPmluZGV4ZXMuaW5keF9zdGFydCk7CiB9CkBAIC0xOTMsNyArMjYxLDggQEAKICAgICBBVklDb250ZXh0ICphdmkgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgaW50IGJpdHJhdGUsIG4sIGksIG5iX2ZyYW1lcywgYXVfYnl0ZXJhdGUsIGF1X3NzaXplLCBhdV9zY2FsZTsKLSAgICBBVkNvZGVjQ29udGV4dCAqdmlkZW9fZW5jOworICAgIGludDY0X3QgbWF4X3N0cmVhbV9kdXJhdGlvbiA9IDA7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnZpZGVvX3BhcjsKICAgICBBVlN0cmVhbSAqdmlkZW9fc3QgPSBOVUxMOwogICAgIGludDY0X3QgbGlzdDEsIGxpc3QyLCBzdHJoLCBzdHJmOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKQEAgLTIyMCwxNCArMjg5LDM1IEBACiAgICAgYXZpb193bDMyKHBiLCAxNCAqIDQpOwogICAgIGJpdHJhdGUgPSAwOwogCi0gICAgdmlkZW9fZW5jID0gTlVMTDsKKyAgICB2aWRlb19wYXIgPSBOVUxMOwogICAgIGZvciAobiA9IDA7IG4gPCBzLT5uYl9zdHJlYW1zOyBuKyspIHsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1tuXS0+Y29kZWM7Ci0gICAgICAgIGJpdHJhdGUgKz0gY29kZWMtPmJpdF9yYXRlOwotICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICB2aWRlb19lbmMgPSBjb2RlYzsKLSAgICAgICAgICAgIHZpZGVvX3N0ID0gcy0+c3RyZWFtc1tuXTsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbbl0tPmNvZGVjcGFyOworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW25dOworICAgICAgICBiaXRyYXRlID0gRkZNSU4oYml0cmF0ZSArIHBhci0+Yml0X3JhdGUsIElOVDMyX01BWCk7CisgICAgICAgIGlmIChzdC0+ZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHN0cmVhbV9kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShzdC0+ZHVyYXRpb24sIHN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKTsKKyAgICAgICAgICAgIG1heF9zdHJlYW1fZHVyYXRpb24gPSBGRk1BWChzdHJlYW1fZHVyYXRpb24sIG1heF9zdHJlYW1fZHVyYXRpb24pOwogICAgICAgICB9CisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICB2aWRlb19wYXIgPSBwYXI7CisgICAgICAgICAgICB2aWRlb19zdCA9IHN0OworICAgICAgICB9CisgICAgfQorCisgICAgLyogZ3Vlc3MgbWFzdGVyIGluZGV4IHNpemUgYmFzZWQgb24gYml0cmF0ZSBhbmQgZHVyYXRpb24gKi8KKyAgICBpZiAoIWF2aS0+cmVzZXJ2ZV9pbmRleF9zcGFjZSkgeworICAgICAgICBkb3VibGUgZHVyYXRpb25fZXN0LCBmaWxlc2l6ZV9lc3Q7CisgICAgICAgIGlmIChzLT5kdXJhdGlvbiA+IDApCisgICAgICAgICAgICBkdXJhdGlvbl9lc3QgPSAoZG91YmxlKXMtPmR1cmF0aW9uIC8gQVZfVElNRV9CQVNFOworICAgICAgICBlbHNlIGlmIChtYXhfc3RyZWFtX2R1cmF0aW9uID4gMCkKKyAgICAgICAgICAgIGR1cmF0aW9uX2VzdCA9IChkb3VibGUpbWF4X3N0cmVhbV9kdXJhdGlvbiAvIEFWX1RJTUVfQkFTRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZHVyYXRpb25fZXN0ID0gMTAgKiA2MCAqIDYwOyAvKiBkZWZhdWx0IHRvIDEwIGhvdXJzICovCisgICAgICAgIGZpbGVzaXplX2VzdCA9IGR1cmF0aW9uX2VzdCAqIChiaXRyYXRlIC8gOCkgKiAxLjEwOyAvKiBhZGQgMTAlIHNhZmV0eSBtYXJnaW4gZm9yIG11eGVyK2JpdHJhdGUgKi8KKyAgICAgICAgYXZpLT5tYXN0ZXJfaW5kZXhfbWF4X3NpemUgPSBGRk1BWCgoaW50KWNlaWwoZmlsZXNpemVfZXN0IC8gQVZJX01BWF9SSUZGX1NJWkUpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmktPm1hc3Rlcl9pbmRleF9tYXhfc2l6ZSk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJkdXJhdGlvbl9lc3Q6JTAuM2YsIGZpbGVzaXplX2VzdDolMC4xZkdpQiwgbWFzdGVyX2luZGV4X21heF9zaXplOiVkXG4iLAorICAgICAgICAgICAgICAgZHVyYXRpb25fZXN0LCBmaWxlc2l6ZV9lc3QgLyAoMTAyNCoxMDI0KjEwMjQpLCBhdmktPm1hc3Rlcl9pbmRleF9tYXhfc2l6ZSk7CiAgICAgfQogCiAgICAgbmJfZnJhbWVzID0gMDsKQEAgLTI0MCw3ICszMzAsNyBAQAogICAgICAgICBhdmlvX3dsMzIocGIsIDApOwogICAgIGF2aW9fd2wzMihwYiwgYml0cmF0ZSAvIDgpOyAvKiBYWFg6IG5vdCBxdWl0ZSBleGFjdCAqLwogICAgIGF2aW9fd2wzMihwYiwgMCk7IC8qIHBhZGRpbmcgKi8KLSAgICBpZiAoIXBiLT5zZWVrYWJsZSkKKyAgICBpZiAoIShwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpCiAgICAgICAgIGF2aW9fd2wzMihwYiwgQVZJRl9UUlVTVENLVFlQRSB8IEFWSUZfSVNJTlRFUkxFQVZFRCk7ICAvKiBmbGFncyAqLwogICAgIGVsc2UKICAgICAgICAgYXZpb193bDMyKHBiLCBBVklGX1RSVVNUQ0tUWVBFIHwgQVZJRl9IQVNJTkRFWCB8IEFWSUZfSVNJTlRFUkxFQVZFRCk7ICAvKiBmbGFncyAqLwpAQCAtMjQ5LDkgKzMzOSw5IEBACiAgICAgYXZpb193bDMyKHBiLCAwKTsgLyogaW5pdGlhbCBmcmFtZSAqLwogICAgIGF2aW9fd2wzMihwYiwgcy0+bmJfc3RyZWFtcyk7IC8qIG5iIHN0cmVhbXMgKi8KICAgICBhdmlvX3dsMzIocGIsIDEwMjQgKiAxMDI0KTsgLyogc3VnZ2VzdGVkIGJ1ZmZlciBzaXplICovCi0gICAgaWYgKHZpZGVvX2VuYykgewotICAgICAgICBhdmlvX3dsMzIocGIsIHZpZGVvX2VuYy0+d2lkdGgpOwotICAgICAgICBhdmlvX3dsMzIocGIsIHZpZGVvX2VuYy0+aGVpZ2h0KTsKKyAgICBpZiAodmlkZW9fcGFyKSB7CisgICAgICAgIGF2aW9fd2wzMihwYiwgdmlkZW9fcGFyLT53aWR0aCk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgdmlkZW9fcGFyLT5oZWlnaHQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CkBAIC0yNjQsMjAgKzM1NCwxOSBAQAogICAgIC8qIHN0cmVhbSBsaXN0ICovCiAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gc3QtPmNvZGVjOworICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3QtPmNvZGVjcGFyOwogICAgICAgICBBVklTdHJlYW0gKmF2aXN0ID0gc3QtPnByaXZfZGF0YTsKICAgICAgICAgbGlzdDIgPSBmZl9zdGFydF90YWcocGIsICJMSVNUIik7CiAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgInN0cmwiKTsKIAogICAgICAgICAvKiBzdHJlYW0gZ2VuZXJpYyBoZWFkZXIgKi8KICAgICAgICAgc3RyaCA9IGZmX3N0YXJ0X3RhZyhwYiwgInN0cmgiKTsKLSAgICAgICAgc3dpdGNoIChlbmMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChwYXItPmNvZGVjX3R5cGUpIHsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6CiAgICAgICAgICAgICAvLyBYU1VCIHN1YnRpdGxlcyBiZWhhdmUgbGlrZSB2aWRlbyB0cmFja3MsIG90aGVyIHN1YnRpdGxlcwogICAgICAgICAgICAgLy8gYXJlIG5vdCAoeWV0KSBzdXBwb3J0ZWQuCi0gICAgICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9YU1VCKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIlN1YnRpdGxlIHN0cmVhbXMgb3RoZXIgdGhhbiBEaXZYIFhTVUIgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEFWSSBtdXhlci5cbiIpOworICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfWFNVQikgeworICAgICAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMsICJTdWJ0aXRsZSBzdHJlYW1zIG90aGVyIHRoYW4gRGl2WCBYU1VCIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKQEAgLTI5MywxMSArMzgyLDEyIEBACiAgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJkYXRzIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAotICAgICAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YU1VCKQotICAgICAgICAgICAgYXZpb193bDMyKHBiLCBlbmMtPmNvZGVjX3RhZyk7CisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1hTVUIpCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHBhci0+Y29kZWNfdGFnKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgYXZpb193bDMyKHBiLCAxKTsKKyAgICAgICAgYXZpc3QtPnN0cmhfZmxhZ3Nfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLyogZmxhZ3MgKi8KICAgICAgICAgYXZpb193bDE2KHBiLCAwKTsgLyogcHJpb3JpdHkgKi8KICAgICAgICAgYXZpb193bDE2KHBiLCAwKTsgLyogbGFuZ3VhZ2UgKi8KQEAgLTMwNSwxNCArMzk1LDE0IEBACiAKICAgICAgICAgZmZfcGFyc2Vfc3BlY2lmaWNfcGFyYW1zKHN0LCAmYXVfYnl0ZXJhdGUsICZhdV9zc2l6ZSwgJmF1X3NjYWxlKTsKIAotICAgICAgICBpZiAoICAgZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTwotICAgICAgICAgICAgJiYgZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9YU1VCCisgICAgICAgIGlmICggICBwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPCisgICAgICAgICAgICAmJiBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1hTVUIKICAgICAgICAgICAgICYmIGF1X2J5dGVyYXRlID4gMTAwMExMKmF1X3NjYWxlKSB7CiAgICAgICAgICAgICBhdV9ieXRlcmF0ZSA9IDYwMDsKICAgICAgICAgICAgIGF1X3NjYWxlICAgID0gMTsKICAgICAgICAgfQogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgYXVfc2NhbGUsIGF1X2J5dGVyYXRlKTsKLSAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWFNVQikKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWFNVQikKICAgICAgICAgICAgIGF1X3NjYWxlID0gYXVfYnl0ZXJhdGUgPSAwOwogCiAgICAgICAgIGF2aW9fd2wzMihwYiwgYXVfc2NhbGUpOyAvKiBzY2FsZSAqLwpAQCAtMzIxLDYzICs0MTEsNjQgQEAKICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLyogc3RhcnQgKi8KICAgICAgICAgLyogcmVtZW1iZXIgdGhpcyBvZmZzZXQgdG8gZmlsbCBsYXRlciAqLwogICAgICAgICBhdmlzdC0+ZnJhbWVzX2hkcl9zdHJtID0gYXZpb190ZWxsKHBiKTsKLSAgICAgICAgaWYgKCFwYi0+c2Vla2FibGUpCisgICAgICAgIGlmICghKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKICAgICAgICAgICAgIC8qIEZJWE1FOiB0aGlzIG1heSBiZSBicm9rZW4sIGJ1dCB3aG8gY2FyZXMgKi8KICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgQVZJX01BWF9SSUZGX1NJWkUpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAgLyogbGVuZ3RoLCBYWFg6IGZpbGxlZCBsYXRlciAqLwogCiAgICAgICAgIC8qIHN1Z2dlc3RlZCBidWZmZXIgc2l6ZSwgaXMgc2V0IHRvIGxhcmdlc3QgY2h1bmsgc2l6ZSBpbiBhdmlfd3JpdGVfdHJhaWxlciAqLwotICAgICAgICBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDEwMjQgKiAxMDI0KTsKLSAgICAgICAgZWxzZSBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgZWxzZSBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMTIgKiAxMDI0KTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKICAgICAgICAgYXZpb193bDMyKHBiLCAtMSk7IC8qIHF1YWxpdHkgKi8KICAgICAgICAgYXZpb193bDMyKHBiLCBhdV9zc2l6ZSk7IC8qIHNhbXBsZSBzaXplICovCiAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7Ci0gICAgICAgIGF2aW9fd2wxNihwYiwgZW5jLT53aWR0aCk7Ci0gICAgICAgIGF2aW9fd2wxNihwYiwgZW5jLT5oZWlnaHQpOworICAgICAgICBhdmlvX3dsMTYocGIsIHBhci0+d2lkdGgpOworICAgICAgICBhdmlvX3dsMTYocGIsIHBhci0+aGVpZ2h0KTsKICAgICAgICAgZmZfZW5kX3RhZyhwYiwgc3RyaCk7CiAKLSAgICAgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfREFUQSkgeworICAgICAgICBpZiAocGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9EQVRBKSB7CiAgICAgICAgICAgICBpbnQgcmV0LCBmbGFnczsKICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OwogCiAgICAgICAgICAgICBzdHJmID0gZmZfc3RhcnRfdGFnKHBiLCAic3RyZiIpOwotICAgICAgICAgICAgc3dpdGNoIChlbmMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocGFyLT5jb2RlY190eXBlKSB7CiAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRToKICAgICAgICAgICAgICAgICAvKiBYU1VCIHN1YnRpdGxlcyBiZWhhdmUgbGlrZSB2aWRlbyB0cmFja3MsIG90aGVyIHN1YnRpdGxlcwogICAgICAgICAgICAgICAgICAqIGFyZSBub3QgKHlldCkgc3VwcG9ydGVkLiAqLwotICAgICAgICAgICAgICAgIGlmIChlbmMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1hTVUIpCisgICAgICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfWFNVQikKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKICAgICAgICAgICAgICAgICAvKiBXTVAgZXhwZWN0cyBSR0IgNTo1OjUgcmF3dmlkZW8gaW4gYXZpIHRvIGhhdmUgYnBwIHNldCB0byAxNi4gKi8KLSAgICAgICAgICAgICAgICBpZiAoICAhZW5jLT5jb2RlY190YWcKLSAgICAgICAgICAgICAgICAgICAgJiYgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTwotICAgICAgICAgICAgICAgICAgICAmJiBlbmMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I1NTVMRQotICAgICAgICAgICAgICAgICAgICAmJiBlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNSkKLSAgICAgICAgICAgICAgICAgICAgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKLSAgICAgICAgICAgICAgICBmZl9wdXRfYm1wX2hlYWRlcihwYiwgZW5jLCBmZl9jb2RlY19ibXBfdGFncywgMCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKCAgIXBhci0+Y29kZWNfdGFnCisgICAgICAgICAgICAgICAgICAgICYmIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8KKyAgICAgICAgICAgICAgICAgICAgJiYgcGFyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9SR0I1NTVMRQorICAgICAgICAgICAgICAgICAgICAmJiBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNSkKKyAgICAgICAgICAgICAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICAgICAgICAgICAgICBhdmlzdC0+cGFsX29mZnNldCA9IGF2aW9fdGVsbChwYikgKyA0MDsKKyAgICAgICAgICAgICAgICBmZl9wdXRfYm1wX2hlYWRlcihwYiwgcGFyLCAwLCAwKTsKICAgICAgICAgICAgICAgICBwaXhfZm10ID0gYXZwcml2X2ZpbmRfcGl4X2ZtdChhdnByaXZfcGl4X2ZtdF9icHNfYXZpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKLSAgICAgICAgICAgICAgICBpZiAoICAgIWVuYy0+Y29kZWNfdGFnCi0gICAgICAgICAgICAgICAgICAgICYmIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8KLSAgICAgICAgICAgICAgICAgICAgJiYgZW5jLT5waXhfZm10ICE9IHBpeF9mbXQKLSAgICAgICAgICAgICAgICAgICAgJiYgZW5jLT5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICAgICAgaWYgKCAgICFwYXItPmNvZGVjX3RhZworICAgICAgICAgICAgICAgICAgICAmJiBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPCisgICAgICAgICAgICAgICAgICAgICYmIHBhci0+Zm9ybWF0ICE9IHBpeF9mbXQKKyAgICAgICAgICAgICAgICAgICAgJiYgcGFyLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9OT05FKQogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXMgcmF3dmlkZW8gY2Fubm90IGJlIHdyaXR0ZW4gdG8gYXZpLCBvdXRwdXQgZmlsZSB3aWxsIGJlIHVucmVhZGFibGVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoZW5jLT5waXhfZm10KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocGFyLT5mb3JtYXQpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgogICAgICAgICAgICAgICAgIGZsYWdzID0gKGF2aS0+d3JpdGVfY2hhbm5lbF9tYXNrID09IDApID8gRkZfUFVUX1dBVl9IRUFERVJfU0tJUF9DSEFOTkVMTUFTSyA6IDA7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9wdXRfd2F2X2hlYWRlcihwYiwgZW5jLCBmbGFncykpIDwgMCkKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX3B1dF93YXZfaGVhZGVyKHMsIHBiLCBwYXIsIGZsYWdzKSkgPCAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvciBub3Qgc3VwcG9ydGVkIGNvZGVjIHR5cGUgJyVzJyBmb3VuZCBpbiB0aGUgaW5wdXRcbiIsCi0gICAgICAgICAgICAgICAgICAgIChjaGFyICopYXZfeF9pZl9udWxsKGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhlbmMtPmNvZGVjX3R5cGUpLCAiPyIpKTsKKyAgICAgICAgICAgICAgICAgICAgKGNoYXIgKilhdl94X2lmX251bGwoYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHBhci0+Y29kZWNfdHlwZSksICI/IikpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmZl9lbmRfdGFnKHBiLCBzdHJmKTsKQEAgLTM4NSw5ICs0NzYsOSBAQAogICAgICAgICAgICAgICAgIGZmX3JpZmZfd3JpdGVfaW5mb190YWcocy0+cGIsICJzdHJuIiwgdC0+dmFsdWUpOwogICAgICAgICAgICAgICAgIHQgPSBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWFNVQgorICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWFNVQgogICAgICAgICAgICAgJiYgKHQgPSBhdl9kaWN0X2dldChzLT5zdHJlYW1zW2ldLT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgTlVMTCwgMCkpKSB7Ci0gICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGFuZ3N0ciA9IGF2X2NvbnZlcnRfbGFuZ190byh0LT52YWx1ZSwgQVZfTEFOR19JU082MzlfMSk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGFuZ3N0ciA9IGZmX2NvbnZlcnRfbGFuZ190byh0LT52YWx1ZSwgQVZfTEFOR19JU082MzlfMSk7CiAgICAgICAgICAgICAgICAgdCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgaWYgKGxhbmdzdHIpIHsKICAgICAgICAgICAgICAgICAgICAgY2hhciogc3RyID0gYXZfYXNwcmludGYoIlN1YnRpdGxlIC0gJXMteHg7MDIiLCBsYW5nc3RyKTsKQEAgLTM5OSw0OCArNDkwLDY3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICAgICAgd3JpdGVfb2RtbF9tYXN0ZXIocywgaSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAgICYmCisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICAgJiYKICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSA+IDAgJiYKICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA+IDApIHsKICAgICAgICAgICAgIGludCB2cHJwICAgICAgID0gZmZfc3RhcnRfdGFnKHBiLCAidnBycCIpOwogICAgICAgICAgICAgQVZSYXRpb25hbCBkYXIgPSBhdl9tdWxfcShzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgZW5jLT53aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5oZWlnaHQgfSk7Ci0gICAgICAgICAgICBpbnQgbnVtLCBkZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKSB7IHBhci0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+aGVpZ2h0IH0pOworICAgICAgICAgICAgaW50IG51bSwgZGVuLCBmaWVsZHMsIGk7CiAgICAgICAgICAgICBhdl9yZWR1Y2UoJm51bSwgJmRlbiwgZGFyLm51bSwgZGFyLmRlbiwgMHhGRkZGKTsKKyAgICAgICAgICAgIGlmIChwYXItPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1RUIHx8IHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQkIgfHwKKyAgICAgICAgICAgICAgICBwYXItPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1RCIHx8IHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQlQpIHsKKyAgICAgICAgICAgICAgICBmaWVsZHMgPSAyOyAvLyBpbnRlcmxhY2VkCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpZWxkcyA9IDE7IC8vIHByb2dyZXNzaXZlCisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7IC8vIHZpZGVvIGZvcm1hdCAgID0gdW5rbm93bgogICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgLy8gdmlkZW8gc3RhbmRhcmQgPSB1bmtub3duCiAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYmUgYXZnX2ZyYW1lX3JhdGUKICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgKDJMTCpzdC0+dGltZV9iYXNlLmRlbiArIHN0LT50aW1lX2Jhc2UubnVtIC0gMSkgLyAoMkxMICogc3QtPnRpbWVfYmFzZS5udW0pKTsKLSAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT53aWR0aCk7Ci0gICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgcGFyLT53aWR0aCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHBhci0+aGVpZ2h0KTsKICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgZGVuKTsKICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgbnVtKTsKLSAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT53aWR0aCk7Ci0gICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+aGVpZ2h0KTsKLSAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMSk7IC8vIHByb2dyZXNzaXZlIEZJWE1FCisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHBhci0+d2lkdGgpOworICAgICAgICAgICAgYXZpb193bDMyKHBiLCBwYXItPmhlaWdodCk7CisgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGZpZWxkcyk7IC8vIGZpZWxkcyBwZXIgZnJhbWUKIAotICAgICAgICAgICAgYXZpb193bDMyKHBiLCBlbmMtPmhlaWdodCk7Ci0gICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+d2lkdGgpOwotICAgICAgICAgICAgYXZpb193bDMyKHBiLCBlbmMtPmhlaWdodCk7Ci0gICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+d2lkdGgpOwotICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKLSAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmllbGRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRfbGluZTsKKyAgICAgICAgICAgICAgICAvLyBPcGVuRE1MIHYxLjAyIGlzIG5vdCB2ZXJ5IHNwZWNpZmljIG9uIHdoYXQgdmFsdWUgdG8gdXNlIGZvcgorICAgICAgICAgICAgICAgIC8vIHN0YXJ0X2xpbmUgd2hlbiBmcmFtZSBkYXRhIGlzIG5vdCBjb21pbmcgZnJvbSBhIGNhcHR1cmluZyBkZXZpY2UsCisgICAgICAgICAgICAgICAgLy8gc28ganVzdCB1c2UgMC8xIGRlcGVuZGluZyBvbiB0aGUgZmllbGQgb3JkZXIgZm9yIGludGVybGFjZWQgZnJhbWVzCisgICAgICAgICAgICAgICAgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVFQgfHwgcGFyLT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9UQikgeworICAgICAgICAgICAgICAgICAgICBzdGFydF9saW5lID0gKGkgPT0gMCkgPyAwIDogMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfQkIgfHwgcGFyLT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9CVCkgeworICAgICAgICAgICAgICAgICAgICBzdGFydF9saW5lID0gKGkgPT0gMCkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGFydF9saW5lID0gMDsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7Ci0gICAgICAgICAgICBhdmlvX3dsMzIocGIsIDApOworICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgcGFyLT5oZWlnaHQgLyBmaWVsZHMpOyAvLyBjb21wcmVzc2VkIGJpdG1hcCBoZWlnaHQKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHBhci0+d2lkdGgpOyAgICAgICAgICAgLy8gY29tcHJlc3NlZCBiaXRtYXAgd2lkdGgKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHBhci0+aGVpZ2h0IC8gZmllbGRzKTsgLy8gdmFsaWQgYml0bWFwIGhlaWdodAorICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgcGFyLT53aWR0aCk7ICAgICAgICAgICAvLyB2YWxpZCBiaXRtYXAgd2lkdGgKKyAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDApOyAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWQgYml0bWFwIFggb2Zmc2V0CisgICAgICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsgICAgICAgICAgICAgICAgICAgIC8vIHZhbGlkIGJpdG1hcCBZIG9mZnNldAorICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7ICAgICAgICAgICAgICAgICAgICAvLyB2YWxpZCBYIG9mZnNldCBpbiBUCisgICAgICAgICAgICAgICAgYXZpb193bDMyKHBiLCBzdGFydF9saW5lKTsgICAgICAgICAgIC8vIHZhbGlkIFkgc3RhcnQgbGluZQorICAgICAgICAgICAgfQogICAgICAgICAgICAgZmZfZW5kX3RhZyhwYiwgdnBycCk7CiAgICAgICAgIH0KIAogICAgICAgICBmZl9lbmRfdGFnKHBiLCBsaXN0Mik7CiAgICAgfQogCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICAvKiBBVkkgY291bGQgYmVjb21lIGFuIE9wZW5ETUwgb25lLCBpZiBpdCBncm93cyBiZXlvbmQgMkdiIHJhbmdlICovCiAgICAgICAgIGF2aS0+b2RtbF9saXN0ID0gZmZfc3RhcnRfdGFnKHBiLCAiSlVOSyIpOwogICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJvZG1sIik7CkBAIC00OTYsNyArNjA2LDcgQEAKICAgICBhdmlvX3dsNjQocGIsIGl4KTsgICAgICAgICAgICAgICAgICAgIC8qIHF3T2Zmc2V0ICovCiAgICAgYXZpb193bDMyKHBiLCBzaXplKTsgICAgICAgICAgICAgICAgICAvKiBkd1NpemUgKi8KICAgICBmZl9wYXJzZV9zcGVjaWZpY19wYXJhbXMocy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLCAmYXVfYnl0ZXJhdGUsICZhdV9zc2l6ZSwgJmF1X3NjYWxlKTsKLSAgICBpZiAocy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgYXVfc3NpemUgPiAwKSB7CisgICAgaWYgKHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIGF1X3NzaXplID4gMCkgewogICAgICAgICB1aW50MzJfdCBhdWRpb19zZWdtX3NpemUgPSAoYXZpc3QtPmF1ZGlvX3N0cm1fbGVuZ3RoIC0gYXZpc3QtPmluZGV4ZXMuYXVkaW9fc3RybV9vZmZzZXQpOwogICAgICAgICBpZiAoKGF1ZGlvX3NlZ21fc2l6ZSAlIGF1X3NzaXplID4gMCkgJiYgIWF2aXN0LT5zYW1wbGVfcmVxdWVzdGVkKSB7CiAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIk9wZW5ETUwgaW5kZXggZHVyYXRpb24gZm9yIGF1ZGlvIHBhY2tldHMgd2l0aCBwYXJ0aWFsIGZyYW1lcyIpOwpAQCAtNTE3LDEzICs2MjcsMTMgQEAKICAgICBjaGFyIGl4X3RhZ1tdID0gIml4MDAiOwogICAgIGludCBpLCBqOwogCi0gICAgYXZfYXNzZXJ0MChwYi0+c2Vla2FibGUpOworICAgIGF2X2Fzc2VydDAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBBVklTdHJlYW0gKmF2aXN0ID0gcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhOwotICAgICAgICBpZiAoYXZpLT5yaWZmX2lkIC0gYXZpc3QtPmluZGV4ZXMubWFzdGVyX29kbWxfcmlmZl9pZF9iYXNlID09IEFWSV9NQVNURVJfSU5ERVhfU0laRSkgeworICAgICAgICBpZiAoYXZpLT5yaWZmX2lkIC0gYXZpc3QtPmluZGV4ZXMubWFzdGVyX29kbWxfcmlmZl9pZF9iYXNlID09IGF2aS0+bWFzdGVyX2luZGV4X21heF9zaXplKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHBvczsKLSAgICAgICAgICAgIGludCBzaXplID0gOCsyKzErMSs0KzgrNCs0KzE2KkFWSV9NQVNURVJfSU5ERVhfU0laRTsKKyAgICAgICAgICAgIGludCBzaXplID0gQVZJX01BU1RFUl9JTkRFWF9QUkVGSVhfU0laRSArIEFWSV9NQVNURVJfSU5ERVhfRU5UUllfU0laRSAqIGF2aS0+bWFzdGVyX2luZGV4X21heF9zaXplOwogCiAgICAgICAgICAgICBwb3MgPSBhdmlvX3RlbGwocGIpOwogICAgICAgICAgICAgdXBkYXRlX29kbWxfZW50cnkocywgaSwgcG9zLCBzaXplKTsKQEAgLTUzMSwxNCArNjQxLDE0IEBACiAgICAgICAgICAgICBhdl9hc3NlcnQxKGF2aW9fdGVsbChwYikgLSBwb3MgPT0gc2l6ZSk7CiAgICAgICAgICAgICBhdmlzdC0+aW5kZXhlcy5tYXN0ZXJfb2RtbF9yaWZmX2lkX2Jhc2UgPSBhdmktPnJpZmZfaWQgLSAxOwogICAgICAgICB9Ci0gICAgICAgIGF2X2Fzc2VydDAoYXZpLT5yaWZmX2lkIC0gYXZpc3QtPmluZGV4ZXMubWFzdGVyX29kbWxfcmlmZl9pZF9iYXNlIDwgQVZJX01BU1RFUl9JTkRFWF9TSVpFKTsKKyAgICAgICAgYXZfYXNzZXJ0MChhdmktPnJpZmZfaWQgLSBhdmlzdC0+aW5kZXhlcy5tYXN0ZXJfb2RtbF9yaWZmX2lkX2Jhc2UgPCBhdmktPm1hc3Rlcl9pbmRleF9tYXhfc2l6ZSk7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBBVklTdHJlYW0gKmF2aXN0ID0gcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhOwogICAgICAgICBpbnQ2NF90IGl4OwogCi0gICAgICAgIGF2aV9zdHJlYW0yZm91cmNjKHRhZywgaSwgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICBhdmlfc3RyZWFtMmZvdXJjYyh0YWcsIGksIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlKTsKICAgICAgICAgaXhfdGFnWzNdID0gJzAnICsgaTsKIAogICAgICAgICAvKiBXcml0aW5nIEFWSSBPcGVuRE1MIGxlYWYgaW5kZXggY2h1bmsgKi8KQEAgLTU3NSw3ICs2ODUsNyBAQAogICAgIGludCBpOwogICAgIGNoYXIgdGFnWzVdOwogCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBBVklTdHJlYW0gKmF2aXN0OwogICAgICAgICBBVklJZW50cnkgKmllID0gMCwgKnRpZTsKICAgICAgICAgaW50IGVtcHR5LCBzdHJlYW1faWQgPSAtMTsKQEAgLTYwMiw5ICs3MTIsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghZW1wdHkpIHsKICAgICAgICAgICAgICAgICBhdmlzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2lkXS0+cHJpdl9kYXRhOwotICAgICAgICAgICAgICAgIGF2aV9zdHJlYW0yZm91cmNjKHRhZywgc3RyZWFtX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbc3RyZWFtX2lkXS0+Y29kZWMtPmNvZGVjX3R5cGUpOwotICAgICAgICAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgdGFnKTsKKyAgICAgICAgICAgICAgICBpZiAoKmllLT50YWcpCisgICAgICAgICAgICAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgaWUtPnRhZyk7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2aV9zdHJlYW0yZm91cmNjKHRhZywgc3RyZWFtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbc3RyZWFtX2lkXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUpOworICAgICAgICAgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsIHRhZyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgaWUtPmZsYWdzKTsKICAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIGllLT5wb3MpOwogICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgaWUtPmxlbik7CkBAIC02MjEsMTEgKzczNSwxMSBAQAogc3RhdGljIGludCB3cml0ZV9za2lwX2ZyYW1lcyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgZHRzKQogewogICAgIEFWSVN0cmVhbSAqYXZpc3QgICAgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnByaXZfZGF0YTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5jb2RlY3BhcjsKIAogICAgIGZmX2Rsb2cocywgImR0czolcyBwYWNrZXRfY291bnQ6JWQgc3RyZWFtX2luZGV4OiVkXG4iLCBhdl90czJzdHIoZHRzKSwgYXZpc3QtPnBhY2tldF9jb3VudCwgc3RyZWFtX2luZGV4KTsKLSAgICB3aGlsZSAoZW5jLT5ibG9ja19hbGlnbiA9PSAwICYmIGR0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgotICAgICAgICAgICBkdHMgPiBhdmlzdC0+cGFja2V0X2NvdW50ICYmIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfWFNVQiAmJiBhdmlzdC0+cGFja2V0X2NvdW50KSB7CisgICAgd2hpbGUgKHBhci0+YmxvY2tfYWxpZ24gPT0gMCAmJiBkdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgZHRzID4gYXZpc3QtPnBhY2tldF9jb3VudCAmJiBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1hTVUIgJiYgYXZpc3QtPnBhY2tldF9jb3VudCkgewogICAgICAgICBBVlBhY2tldCBlbXB0eV9wYWNrZXQ7CiAKICAgICAgICAgaWYgKGR0cyAtIGF2aXN0LT5wYWNrZXRfY291bnQgPiA2MDAwMCkgewpAQCAtNjM3LDcgKzc1MSw3IEBACiAgICAgICAgIGVtcHR5X3BhY2tldC5zaXplICAgICAgICAgPSAwOwogICAgICAgICBlbXB0eV9wYWNrZXQuZGF0YSAgICAgICAgID0gTlVMTDsKICAgICAgICAgZW1wdHlfcGFja2V0LnN0cmVhbV9pbmRleCA9IHN0cmVhbV9pbmRleDsKLSAgICAgICAgYXZpX3dyaXRlX3BhY2tldChzLCAmZW1wdHlfcGFja2V0KTsKKyAgICAgICAgYXZpX3dyaXRlX3BhY2tldF9pbnRlcm5hbChzLCAmZW1wdHlfcGFja2V0KTsKICAgICAgICAgZmZfZGxvZyhzLCAiZHVwIGR0czolcyBwYWNrZXRfY291bnQ6JWRcbiIsIGF2X3RzMnN0cihkdHMpLCBhdmlzdC0+cGFja2V0X2NvdW50KTsKICAgICB9CiAKQEAgLTY0NiwxNyArNzYwLDExIEBACiAKIHN0YXRpYyBpbnQgYXZpX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgdW5zaWduZWQgY2hhciB0YWdbNV07Ci0gICAgdW5zaWduZWQgaW50IGZsYWdzID0gMDsKICAgICBjb25zdCBpbnQgc3RyZWFtX2luZGV4ID0gcGt0LT5zdHJlYW1faW5kZXg7Ci0gICAgaW50IHNpemUgICAgICAgICAgICAgICA9IHBrdC0+c2l6ZTsKLSAgICBBVklDb250ZXh0ICphdmkgICAgID0gcy0+cHJpdl9kYXRhOwotICAgIEFWSU9Db250ZXh0ICpwYiAgICAgPSBzLT5wYjsKLSAgICBBVklTdHJlYW0gKmF2aXN0ICAgID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5wcml2X2RhdGE7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXI7CiAgICAgaW50IHJldDsKIAotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYgZW5jLT5jb2RlY190YWcgPT0gTUtUQUcoJ0gnLCcyJywnNicsJzQnKSAmJiBwa3QtPnNpemUpIHsKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmIHBhci0+Y29kZWNfdGFnID09IE1LVEFHKCdIJywnMicsJzYnLCc0JykgJiYgcGt0LT5zaXplKSB7CiAgICAgICAgIHJldCA9IGZmX2NoZWNrX2gyNjRfc3RhcnRjb2RlKHMsIHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XSwgcGt0KTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtNjY1LDEzICs3NzMsMTA0IEBACiAgICAgaWYgKChyZXQgPSB3cml0ZV9za2lwX2ZyYW1lcyhzLCBzdHJlYW1faW5kZXgsIHBrdC0+ZHRzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCisgICAgaWYgKCFwa3QtPnNpemUpCisgICAgICAgIHJldHVybiBhdmlfd3JpdGVfcGFja2V0X2ludGVybmFsKHMsIHBrdCk7IC8qIFBhc3N0aHJvdWdoICovCisKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBBVklTdHJlYW0gKmF2aXN0ID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5wcml2X2RhdGE7CisgICAgICAgIEFWSU9Db250ZXh0ICpwYiAgPSBzLT5wYjsKKyAgICAgICAgQVZQYWNrZXQgKm9wa3QgICA9IHBrdDsKKyAgICAgICAgaW50IHJlc2h1ZmZsZV9yZXQ7CisgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPICYmIHBhci0+Y29kZWNfdGFnID09IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgYnBjID0gcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgIT0gMTUgPyBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA6IDE2OworICAgICAgICAgICAgaW50IGV4cGVjdGVkX3N0cmlkZSA9ICgocGFyLT53aWR0aCAqIGJwYyArIDMxKSA+PiA1KSo0OworICAgICAgICAgICAgcmVzaHVmZmxlX3JldCA9IGZmX3Jlc2h1ZmZsZV9yYXdfcmdiKHMsICZwa3QsIHBhciwgZXhwZWN0ZWRfc3RyaWRlKTsKKyAgICAgICAgICAgIGlmIChyZXNodWZmbGVfcmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzaHVmZmxlX3JldDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXNodWZmbGVfcmV0ID0gMDsKKyAgICAgICAgaWYgKHBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfUEFMOCkgeworICAgICAgICAgICAgcmV0ID0gZmZfZ2V0X3BhY2tldF9wYWxldHRlKHMsIG9wa3QsIHJlc2h1ZmZsZV9yZXQsIGF2aXN0LT5wYWxldHRlKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBpbnQgcGFsX3NpemUgPSAxIDw8IHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICAgICAgICAgIGludCBwY190YWcsIGk7CisKKyAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID49IDAgJiYgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPD0gOCk7CisKKyAgICAgICAgICAgICAgICBpZiAoKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJiBhdmlzdC0+cGFsX29mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cl9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGF2aXN0LT5wYWxfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWxfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2ID0gYXZpc3QtPnBhbGV0dGVbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHYgJiAweGZmZmZmZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBjdXJfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShhdmlzdC0+b2xkX3BhbGV0dGUsIGF2aXN0LT5wYWxldHRlLCBwYWxfc2l6ZSAqIDQpOworICAgICAgICAgICAgICAgICAgICBhdmlzdC0+cGFsX29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoYXZpc3QtPnBhbGV0dGUsIGF2aXN0LT5vbGRfcGFsZXR0ZSwgcGFsX3NpemUgKiA0KSkgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRhZ1s1XTsKKyAgICAgICAgICAgICAgICAgICAgYXZpX3N0cmVhbTJmb3VyY2ModGFnLCBzdHJlYW1faW5kZXgsIHBhci0+Y29kZWNfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIHRhZ1syXSA9ICdwJzsgdGFnWzNdID0gJ2MnOworICAgICAgICAgICAgICAgICAgICBpZiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdmlzdC0+c3RyaF9mbGFnc19vZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cl9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgYXZpc3QtPnN0cmhfZmxhZ3Nfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpb193bDMyKHBiLCBBVklTRl9WSURFT19QQUxDSEFOR0VTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGN1cl9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmlzdC0+c3RyaF9mbGFnc19vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZpX2FkZF9pZW50cnkocywgc3RyZWFtX2luZGV4LCB0YWcsIEFWSUlGX05PX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWxfc2l6ZSAqIDQgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwY190YWcgPSBmZl9zdGFydF90YWcocGIsIHRhZyk7CisgICAgICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgICAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCBwYWxfc2l6ZSAmIDB4RkYpOworICAgICAgICAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIDApOyAvLyByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFsX3NpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdiA9IGF2aXN0LT5wYWxldHRlW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgYXZpb193YjMyKHBiLCB2PDw4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmZl9lbmRfdGFnKHBiLCBwY190YWcpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYXZpc3QtPm9sZF9wYWxldHRlLCBhdmlzdC0+cGFsZXR0ZSwgcGFsX3NpemUgKiA0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc2h1ZmZsZV9yZXQpIHsKKyAgICAgICAgICAgIHJldCA9IGF2aV93cml0ZV9wYWNrZXRfaW50ZXJuYWwocywgcGt0KTsKKworZmFpbDoKKyAgICAgICAgICAgIGlmIChyZXNodWZmbGVfcmV0KQorICAgICAgICAgICAgICAgIGF2X3BhY2tldF9mcmVlKCZwa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBhdmlfd3JpdGVfcGFja2V0X2ludGVybmFsKHMsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgYXZpX3dyaXRlX3BhY2tldF9pbnRlcm5hbChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgdW5zaWduZWQgY2hhciB0YWdbNV07CisgICAgdW5zaWduZWQgaW50IGZsYWdzID0gMDsKKyAgICBjb25zdCBpbnQgc3RyZWFtX2luZGV4ID0gcGt0LT5zdHJlYW1faW5kZXg7CisgICAgaW50IHNpemUgICAgICAgICAgICAgICA9IHBrdC0+c2l6ZTsKKyAgICBBVklDb250ZXh0ICphdmkgICAgID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiAgICAgPSBzLT5wYjsKKyAgICBBVklTdHJlYW0gKmF2aXN0ICAgID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXI7CisKICAgICBpZiAocGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCiAgICAgICAgIGF2aXN0LT5sYXN0X2R0cyA9IHBrdC0+ZHRzICsgcGt0LT5kdXJhdGlvbjsKIAogICAgIGF2aXN0LT5wYWNrZXRfY291bnQrKzsKIAogICAgIC8vIE1ha2Ugc3VyZSB0byBwdXQgYW4gT3BlbkRNTCBjaHVuayB3aGVuIHRoZSBmaWxlIHNpemUgZXhjZWVkcyB0aGUgbGltaXRzCi0gICAgaWYgKHBiLT5zZWVrYWJsZSAmJgorICAgIGlmICgocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmCiAgICAgICAgIChhdmlvX3RlbGwocGIpIC0gYXZpLT5yaWZmX3N0YXJ0ID4gQVZJX01BWF9SSUZGX1NJWkUpKSB7CiAgICAgICAgIGF2aV93cml0ZV9peChzKTsKICAgICAgICAgZmZfZW5kX3RhZyhwYiwgYXZpLT5tb3ZpX2xpc3QpOwpAQCAtNjgzLDM1ICs4ODIsMTcgQEAKICAgICAgICAgYXZpLT5tb3ZpX2xpc3QgPSBhdmlfc3RhcnRfbmV3X3JpZmYocywgcGIsICJBVklYIiwgIm1vdmkiKTsKICAgICB9CiAKLSAgICBhdmlfc3RyZWFtMmZvdXJjYyh0YWcsIHN0cmVhbV9pbmRleCwgZW5jLT5jb2RlY190eXBlKTsKKyAgICBhdmlfc3RyZWFtMmZvdXJjYyh0YWcsIHN0cmVhbV9pbmRleCwgcGFyLT5jb2RlY190eXBlKTsKICAgICBpZiAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkKICAgICAgICAgZmxhZ3MgPSAweDEwOwotICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQogICAgICAgICBhdmlzdC0+YXVkaW9fc3RybV9sZW5ndGggKz0gc2l6ZTsKIAotICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKLSAgICAgICAgQVZJSW5kZXggKmlkeCA9ICZhdmlzdC0+aW5kZXhlczsKLSAgICAgICAgaW50IGNsID0gaWR4LT5lbnRyeSAvIEFWSV9JTkRFWF9DTFVTVEVSX1NJWkU7Ci0gICAgICAgIGludCBpZCA9IGlkeC0+ZW50cnkgJSBBVklfSU5ERVhfQ0xVU1RFUl9TSVpFOwotICAgICAgICBpZiAoaWR4LT5lbnRzX2FsbG9jYXRlZCA8PSBpZHgtPmVudHJ5KSB7Ci0gICAgICAgICAgICBpZHgtPmNsdXN0ZXIgPSBhdl9yZWFsbG9jX2YoaWR4LT5jbHVzdGVyLCBzaXplb2Yodm9pZCopLCBjbCsxKTsKLSAgICAgICAgICAgIGlmICghaWR4LT5jbHVzdGVyKSB7Ci0gICAgICAgICAgICAgICAgaWR4LT5lbnRzX2FsbG9jYXRlZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWR4LT5lbnRyeSAgICAgICAgICA9IDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlkeC0+Y2x1c3RlcltjbF0gPQotICAgICAgICAgICAgICAgIGF2X21hbGxvYyhBVklfSU5ERVhfQ0xVU1RFUl9TSVpFICogc2l6ZW9mKEFWSUllbnRyeSkpOwotICAgICAgICAgICAgaWYgKCFpZHgtPmNsdXN0ZXJbY2xdKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBpZHgtPmVudHNfYWxsb2NhdGVkICs9IEFWSV9JTkRFWF9DTFVTVEVSX1NJWkU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZHgtPmNsdXN0ZXJbY2xdW2lkXS5mbGFncyA9IGZsYWdzOwotICAgICAgICBpZHgtPmNsdXN0ZXJbY2xdW2lkXS5wb3MgICA9IGF2aW9fdGVsbChwYikgLSBhdmktPm1vdmlfbGlzdDsKLSAgICAgICAgaWR4LT5jbHVzdGVyW2NsXVtpZF0ubGVuICAgPSBzaXplOwotICAgICAgICBhdmlzdC0+bWF4X3NpemUgPSBGRk1BWChhdmlzdC0+bWF4X3NpemUsIHNpemUpOwotICAgICAgICBpZHgtPmVudHJ5Kys7CisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIHJldCA9IGF2aV9hZGRfaWVudHJ5KHMsIHN0cmVhbV9pbmRleCwgTlVMTCwgZmxhZ3MsIHNpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgYXZpb193cml0ZShwYiwgdGFnLCA0KTsKQEAgLTczNiw3ICs5MTcsNyBAQAogICAgICAgICB3cml0ZV9za2lwX2ZyYW1lcyhzLCBpLCBhdmlzdC0+bGFzdF9kdHMpOwogICAgIH0KIAotICAgIGlmIChwYi0+c2Vla2FibGUpIHsKKyAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgaWYgKGF2aS0+cmlmZl9pZCA9PSAxKSB7CiAgICAgICAgICAgICBmZl9lbmRfdGFnKHBiLCBhdmktPm1vdmlfbGlzdCk7CiAgICAgICAgICAgICByZXMgPSBhdmlfd3JpdGVfaWR4MShzKTsKQEAgLTc1MiwxNSArOTMzLDE1IEBACiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDE2KTsKIAogICAgICAgICAgICAgZm9yIChuID0gbmJfZnJhbWVzID0gMDsgbiA8IHMtPm5iX3N0cmVhbXM7IG4rKykgewotICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICpzdHJlYW0gPSBzLT5zdHJlYW1zW25dLT5jb2RlYzsKKyAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1tuXS0+Y29kZWNwYXI7CiAgICAgICAgICAgICAgICAgQVZJU3RyZWFtICphdmlzdCAgICAgICA9IHMtPnN0cmVhbXNbbl0tPnByaXZfZGF0YTsKIAotICAgICAgICAgICAgICAgIGlmIChzdHJlYW0tPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG5iX2ZyYW1lcyA8IGF2aXN0LT5wYWNrZXRfY291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgICBuYl9mcmFtZXMgPSBhdmlzdC0+cGFja2V0X2NvdW50OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0tPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMiB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpCiAgICAgICAgICAgICAgICAgICAgICAgICBuYl9mcmFtZXMgKz0gYXZpc3QtPnBhY2tldF9jb3VudDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC03NzEsMTMgKzk1MiwyMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKGF2aS0+cmlmZl9pZCA+PSBhdmktPm1hc3Rlcl9pbmRleF9tYXhfc2l6ZSkgeworICAgICAgICBpbnQgaW5kZXhfc3BhY2UgPSBBVklfTUFTVEVSX0lOREVYX1BSRUZJWF9TSVpFICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJX01BU1RFUl9JTkRFWF9FTlRSWV9TSVpFICogYXZpLT5yaWZmX2lkOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJPdXRwdXQgZmlsZSBub3Qgc3RyaWN0bHkgT3BlbkRNTCBjb21wbGlhbnQsICIKKyAgICAgICAgICAgICAgICJjb25zaWRlciByZS1tdXhpbmcgd2l0aCAncmVzZXJ2ZV9pbmRleF9zcGFjZScgb3B0aW9uIHZhbHVlID49ICVkXG4iLAorICAgICAgICAgICAgICAgaW5kZXhfc3BhY2UpOworICAgIH0KKwogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZJU3RyZWFtICphdmlzdCA9IHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2aXN0LT5pbmRleGVzLmVudHNfYWxsb2NhdGVkIC8gQVZJX0lOREVYX0NMVVNURVJfU0laRTsgaisrKQogICAgICAgICAgICAgYXZfZnJlZXAoJmF2aXN0LT5pbmRleGVzLmNsdXN0ZXJbal0pOwogICAgICAgICBhdl9mcmVlcCgmYXZpc3QtPmluZGV4ZXMuY2x1c3Rlcik7CiAgICAgICAgIGF2aXN0LT5pbmRleGVzLmVudHNfYWxsb2NhdGVkID0gYXZpc3QtPmluZGV4ZXMuZW50cnkgPSAwOwotICAgICAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBhdmlzdC0+ZnJhbWVzX2hkcl9zdHJtICsgNCwgU0VFS19TRVQpOwogICAgICAgICAgICAgYXZpb193bDMyKHBiLCBhdmlzdC0+bWF4X3NpemUpOwogICAgICAgICB9CkBAIC03ODksNiArOTc4LDcgQEAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEFWSUNvbnRleHQsIHgpCiAjZGVmaW5lIEVOQyBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICB7ICJyZXNlcnZlX2luZGV4X3NwYWNlIiwgInJlc2VydmUgc3BhY2UgKGluIGJ5dGVzKSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGZvciBlYWNoIHN0cmVhbSBpbmRleCIsIE9GRlNFVChyZXNlcnZlX2luZGV4X3NwYWNlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAwIH0sIDAsIElOVF9NQVgsIEVOQyB9LAogICAgIHsgIndyaXRlX2NoYW5uZWxfbWFzayIsICJ3cml0ZSBjaGFubmVsIG1hc2sgaW50byB3YXZlIGZvcm1hdCBoZWFkZXIiLCBPRkZTRVQod3JpdGVfY2hhbm5lbF9tYXNrKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBFTkMgfSwKICAgICB7IE5VTEwgfSwKIH07CkBAIC04MDgsNiArOTk4LDcgQEAKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoQVZJQ29udGV4dCksCiAgICAgLmF1ZGlvX2NvZGVjICAgID0gQ09ORklHX0xJQk1QM0xBTUUgPyBBVl9DT0RFQ19JRF9NUDMgOiBBVl9DT0RFQ19JRF9BQzMsCiAgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfTVBFRzQsCisgICAgLmluaXQgICAgICAgICAgID0gYXZpX2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgID0gYXZpX3dyaXRlX2hlYWRlciwKICAgICAud3JpdGVfcGFja2V0ICAgPSBhdmlfd3JpdGVfcGFja2V0LAogICAgIC53cml0ZV90cmFpbGVyICA9IGF2aV93cml0ZV90cmFpbGVyLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXZpby5jIGIvbGliYXZmb3JtYXQvYXZpby5jCmluZGV4IDM2MjA5OWQuLjYzZTgyODcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2F2aW8uYworKysgYi9saWJhdmZvcm1hdC9hdmlvLmMKQEAgLTMxLDEzICszMSw2IEBACiAjZW5kaWYKICNpbmNsdWRlICJ1cmwuaCIKIAotc3RhdGljIFVSTFByb3RvY29sICpmaXJzdF9wcm90b2NvbCA9IE5VTEw7Ci0KLVVSTFByb3RvY29sICpmZnVybF9wcm90b2NvbF9uZXh0KGNvbnN0IFVSTFByb3RvY29sICpwcmV2KQotewotICAgIHJldHVybiBwcmV2ID8gcHJldi0+bmV4dCA6IGZpcnN0X3Byb3RvY29sOwotfQotCiAvKiogQG5hbWUgTG9nZ2luZyBjb250ZXh0LiAqLwogLypAeyovCiBzdGF0aWMgY29uc3QgY2hhciAqdXJsY29udGV4dF90b19uYW1lKHZvaWQgKnB0cikKQEAgLTU3LDYyICs1MCwyNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgY29uc3QgQVZDbGFzcyAqdXJsY29udGV4dF9jaGlsZF9jbGFzc19uZXh0KGNvbnN0IEFWQ2xhc3MgKnByZXYpCi17Ci0gICAgVVJMUHJvdG9jb2wgKnAgPSBOVUxMOwotCi0gICAgLyogZmluZCB0aGUgcHJvdG9jb2wgdGhhdCBjb3JyZXNwb25kcyB0byBwcmV2ICovCi0gICAgd2hpbGUgKHByZXYgJiYgKHAgPSBmZnVybF9wcm90b2NvbF9uZXh0KHApKSkKLSAgICAgICAgaWYgKHAtPnByaXZfZGF0YV9jbGFzcyA9PSBwcmV2KQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAvKiBmaW5kIG5leHQgcHJvdG9jb2wgd2l0aCBwcml2IG9wdGlvbnMgKi8KLSAgICB3aGlsZSAocCA9IGZmdXJsX3Byb3RvY29sX25leHQocCkpCi0gICAgICAgIGlmIChwLT5wcml2X2RhdGFfY2xhc3MpCi0gICAgICAgICAgICByZXR1cm4gcC0+cHJpdl9kYXRhX2NsYXNzOwotICAgIHJldHVybiBOVUxMOwotfQotCiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihVUkxDb250ZXh0LHgpCiAjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KICNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICB7InByb3RvY29sX3doaXRlbGlzdCIsICJMaXN0IG9mIHByb3RvY29scyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQiLCBPRkZTRVQocHJvdG9jb2xfd2hpdGVsaXN0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEQgfSwKKyAgICB7InByb3RvY29sX2JsYWNrbGlzdCIsICJMaXN0IG9mIHByb3RvY29scyB0aGF0IGFyZSBub3QgYWxsb3dlZCB0byBiZSB1c2VkIiwgT0ZGU0VUKHByb3RvY29sX2JsYWNrbGlzdCksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAgQ0hBUl9NSU4sIENIQVJfTUFYLCBEIH0sCisgICAgeyJyd190aW1lb3V0IiwgIlRpbWVvdXQgZm9yIElPIG9wZXJhdGlvbnMgKGluIG1pY3Jvc2Vjb25kcykiLCBvZmZzZXRvZihVUkxDb250ZXh0LCByd190aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UNjRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCiAgICAgeyBOVUxMIH0KIH07CisKIGNvbnN0IEFWQ2xhc3MgZmZ1cmxfY29udGV4dF9jbGFzcyA9IHsKICAgICAuY2xhc3NfbmFtZSAgICAgICA9ICJVUkxDb250ZXh0IiwKICAgICAuaXRlbV9uYW1lICAgICAgICA9IHVybGNvbnRleHRfdG9fbmFtZSwKICAgICAub3B0aW9uICAgICAgICAgICA9IG9wdGlvbnMsCiAgICAgLnZlcnNpb24gICAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiAgICAgLmNoaWxkX25leHQgICAgICAgPSB1cmxjb250ZXh0X2NoaWxkX25leHQsCi0gICAgLmNoaWxkX2NsYXNzX25leHQgPSB1cmxjb250ZXh0X2NoaWxkX2NsYXNzX25leHQsCisgICAgLmNoaWxkX2NsYXNzX25leHQgPSBmZl91cmxjb250ZXh0X2NoaWxkX2NsYXNzX25leHQsCiB9OwogLypAfSovCiAKLWNvbnN0IGNoYXIgKmF2aW9fZW51bV9wcm90b2NvbHModm9pZCAqKm9wYXF1ZSwgaW50IG91dHB1dCkKLXsKLSAgICBVUkxQcm90b2NvbCAqcDsKLSAgICAqb3BhcXVlID0gZmZ1cmxfcHJvdG9jb2xfbmV4dCgqb3BhcXVlKTsKLSAgICBpZiAoIShwID0gKm9wYXF1ZSkpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIGlmICgob3V0cHV0ICYmIHAtPnVybF93cml0ZSkgfHwgKCFvdXRwdXQgJiYgcC0+dXJsX3JlYWQpKQotICAgICAgICByZXR1cm4gcC0+bmFtZTsKLSAgICByZXR1cm4gYXZpb19lbnVtX3Byb3RvY29scyhvcGFxdWUsIG91dHB1dCk7Ci19Ci0KLWludCBmZnVybF9yZWdpc3Rlcl9wcm90b2NvbChVUkxQcm90b2NvbCAqcHJvdG9jb2wpCi17Ci0gICAgVVJMUHJvdG9jb2wgKipwOwotICAgIHAgPSAmZmlyc3RfcHJvdG9jb2w7Ci0gICAgd2hpbGUgKCpwKQotICAgICAgICBwID0gJigqcCktPm5leHQ7Ci0gICAgKnAgICAgICAgICAgICAgPSBwcm90b2NvbDsKLSAgICBwcm90b2NvbC0+bmV4dCA9IE5VTEw7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdXJsX2FsbG9jX2Zvcl9wcm90b2NvbChVUkxDb250ZXh0ICoqcHVjLCBzdHJ1Y3QgVVJMUHJvdG9jb2wgKnVwLAorc3RhdGljIGludCB1cmxfYWxsb2NfZm9yX3Byb3RvY29sKFVSTENvbnRleHQgKipwdWMsIGNvbnN0IFVSTFByb3RvY29sICp1cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWSU9JbnRlcnJ1cHRDQiAqaW50X2NiKQogewpAQCAtMjE3LDkgKzE3NSwxNiBAQAogICAgIC8vIENoZWNrIHRoYXQgVVJMQ29udGV4dCB3YXMgaW5pdGlhbGl6ZWQgY29ycmVjdGx5IGFuZCBsaXN0cyBhcmUgbWF0Y2hpbmcgaWYgc2V0CiAgICAgYXZfYXNzZXJ0MCghKGU9YXZfZGljdF9nZXQoKm9wdGlvbnMsICJwcm90b2NvbF93aGl0ZWxpc3QiLCBOVUxMLCAwKSkgfHwKICAgICAgICAgICAgICAgICh1Yy0+cHJvdG9jb2xfd2hpdGVsaXN0ICYmICFzdHJjbXAodWMtPnByb3RvY29sX3doaXRlbGlzdCwgZS0+dmFsdWUpKSk7CisgICAgYXZfYXNzZXJ0MCghKGU9YXZfZGljdF9nZXQoKm9wdGlvbnMsICJwcm90b2NvbF9ibGFja2xpc3QiLCBOVUxMLCAwKSkgfHwKKyAgICAgICAgICAgICAgICh1Yy0+cHJvdG9jb2xfYmxhY2tsaXN0ICYmICFzdHJjbXAodWMtPnByb3RvY29sX2JsYWNrbGlzdCwgZS0+dmFsdWUpKSk7CiAKICAgICBpZiAodWMtPnByb3RvY29sX3doaXRlbGlzdCAmJiBhdl9tYXRjaF9saXN0KHVjLT5wcm90LT5uYW1lLCB1Yy0+cHJvdG9jb2xfd2hpdGVsaXN0LCAnLCcpIDw9IDApIHsKLSAgICAgICAgYXZfbG9nKHVjLCBBVl9MT0dfRVJST1IsICJQcm90b2NvbCBub3Qgb24gd2hpdGVsaXN0IFwnJXNcJyFcbiIsIHVjLT5wcm90b2NvbF93aGl0ZWxpc3QpOworICAgICAgICBhdl9sb2codWMsIEFWX0xPR19FUlJPUiwgIlByb3RvY29sICclcycgbm90IG9uIHdoaXRlbGlzdCAnJXMnIVxuIiwgdWMtPnByb3QtPm5hbWUsIHVjLT5wcm90b2NvbF93aGl0ZWxpc3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICh1Yy0+cHJvdG9jb2xfYmxhY2tsaXN0ICYmIGF2X21hdGNoX2xpc3QodWMtPnByb3QtPm5hbWUsIHVjLT5wcm90b2NvbF9ibGFja2xpc3QsICcsJykgPiAwKSB7CisgICAgICAgIGF2X2xvZyh1YywgQVZfTE9HX0VSUk9SLCAiUHJvdG9jb2wgJyVzJyBvbiBibGFja2xpc3QgJyVzJyFcbiIsIHVjLT5wcm90LT5uYW1lLCB1Yy0+cHJvdG9jb2xfYmxhY2tsaXN0KTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKQEAgLTIzNCw2ICsxOTksOCBAQAogCiAgICAgaWYgKChlcnIgPSBhdl9kaWN0X3NldChvcHRpb25zLCAicHJvdG9jb2xfd2hpdGVsaXN0IiwgdWMtPnByb3RvY29sX3doaXRlbGlzdCwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIGVycjsKKyAgICBpZiAoKGVyciA9IGF2X2RpY3Rfc2V0KG9wdGlvbnMsICJwcm90b2NvbF9ibGFja2xpc3QiLCB1Yy0+cHJvdG9jb2xfYmxhY2tsaXN0LCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gZXJyOwogCiAgICAgZXJyID0KICAgICAgICAgdWMtPnByb3QtPnVybF9vcGVuMiA/IHVjLT5wcm90LT51cmxfb3BlbjIodWMsCkBAIC0yNDMsNiArMjEwLDcgQEAKICAgICAgICAgdWMtPnByb3QtPnVybF9vcGVuKHVjLCB1Yy0+ZmlsZW5hbWUsIHVjLT5mbGFncyk7CiAKICAgICBhdl9kaWN0X3NldChvcHRpb25zLCAicHJvdG9jb2xfd2hpdGVsaXN0IiwgTlVMTCwgMCk7CisgICAgYXZfZGljdF9zZXQob3B0aW9ucywgInByb3RvY29sX2JsYWNrbGlzdCIsIE5VTEwsIDApOwogCiAgICAgaWYgKGVycikKICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTI4MCwxMSArMjQ4LDEyIEBACiAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIiAgICAgICAgICAgICAgICBcCiAgICAgIjAxMjM0NTY3ODkrLS4iCiAKLXN0YXRpYyBzdHJ1Y3QgVVJMUHJvdG9jb2wgKnVybF9maW5kX3Byb3RvY29sKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQorc3RhdGljIGNvbnN0IHN0cnVjdCBVUkxQcm90b2NvbCAqdXJsX2ZpbmRfcHJvdG9jb2woY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0gICAgVVJMUHJvdG9jb2wgKnVwID0gTlVMTDsKKyAgICBjb25zdCBVUkxQcm90b2NvbCAqKnByb3RvY29sczsKICAgICBjaGFyIHByb3RvX3N0clsxMjhdLCBwcm90b19uZXN0ZWRbMTI4XSwgKnB0cjsKICAgICBzaXplX3QgcHJvdG9fbGVuID0gc3Ryc3BuKGZpbGVuYW1lLCBVUkxfU0NIRU1FX0NIQVJTKTsKKyAgICBpbnQgaTsKIAogICAgIGlmIChmaWxlbmFtZVtwcm90b19sZW5dICE9ICc6JyAmJgogICAgICAgICAoc3RybmNtcChmaWxlbmFtZSwgInN1YmZpbGUsIiwgOCkgfHwgIXN0cmNocihmaWxlbmFtZSArIHByb3RvX2xlbiArIDEsICc6JykpIHx8CkBAIC0yOTQsNTMgKzI2Myw2MiBAQAogICAgICAgICBhdl9zdHJsY3B5KHByb3RvX3N0ciwgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgRkZNSU4ocHJvdG9fbGVuICsgMSwgc2l6ZW9mKHByb3RvX3N0cikpKTsKIAotICAgIGlmICgocHRyID0gc3RyY2hyKHByb3RvX3N0ciwgJywnKSkpCi0gICAgICAgICpwdHIgPSAnXDAnOwogICAgIGF2X3N0cmxjcHkocHJvdG9fbmVzdGVkLCBwcm90b19zdHIsIHNpemVvZihwcm90b19uZXN0ZWQpKTsKICAgICBpZiAoKHB0ciA9IHN0cmNocihwcm90b19uZXN0ZWQsICcrJykpKQogICAgICAgICAqcHRyID0gJ1wwJzsKIAotICAgIHdoaWxlICh1cCA9IGZmdXJsX3Byb3RvY29sX25leHQodXApKSB7Ci0gICAgICAgIGlmICghc3RyY21wKHByb3RvX3N0ciwgdXAtPm5hbWUpKQotICAgICAgICAgICAgYnJlYWs7CisgICAgcHJvdG9jb2xzID0gZmZ1cmxfZ2V0X3Byb3RvY29scyhOVUxMLCBOVUxMKTsKKyAgICBpZiAoIXByb3RvY29scykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgZm9yIChpID0gMDsgcHJvdG9jb2xzW2ldOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IFVSTFByb3RvY29sICp1cCA9IHByb3RvY29sc1tpXTsKKyAgICAgICAgaWYgKCFzdHJjbXAocHJvdG9fc3RyLCB1cC0+bmFtZSkpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwcm90b2NvbHMpOworICAgICAgICAgICAgcmV0dXJuIHVwOworICAgICAgICB9CiAgICAgICAgIGlmICh1cC0+ZmxhZ3MgJiBVUkxfUFJPVE9DT0xfRkxBR19ORVNURURfU0NIRU1FICYmCi0gICAgICAgICAgICAhc3RyY21wKHByb3RvX25lc3RlZCwgdXAtPm5hbWUpKQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAhc3RyY21wKHByb3RvX25lc3RlZCwgdXAtPm5hbWUpKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcHJvdG9jb2xzKTsKKyAgICAgICAgICAgIHJldHVybiB1cDsKKyAgICAgICAgfQogICAgIH0KKyAgICBhdl9mcmVlcCgmcHJvdG9jb2xzKTsKIAotICAgIHJldHVybiB1cDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogaW50IGZmdXJsX2FsbG9jKFVSTENvbnRleHQgKipwdWMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgY29uc3QgQVZJT0ludGVycnVwdENCICppbnRfY2IpCiB7Ci0gICAgVVJMUHJvdG9jb2wgKnAgPSBOVUxMOwotCi0gICAgaWYgKCFmaXJzdF9wcm90b2NvbCkgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJObyBVUkwgUHJvdG9jb2xzIGFyZSByZWdpc3RlcmVkLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1pc3NpbmcgY2FsbCB0byBhdl9yZWdpc3Rlcl9hbGwoKT9cbiIpOwotICAgIH0KKyAgICBjb25zdCBVUkxQcm90b2NvbCAqcCA9IE5VTEw7CiAKICAgICBwID0gdXJsX2ZpbmRfcHJvdG9jb2woZmlsZW5hbWUpOwogICAgIGlmIChwKQogICAgICAgIHJldHVybiB1cmxfYWxsb2NfZm9yX3Byb3RvY29sKHB1YywgcCwgZmlsZW5hbWUsIGZsYWdzLCBpbnRfY2IpOwogCiAgICAgKnB1YyA9IE5VTEw7Ci0gICAgaWYgKGF2X3N0cnN0YXJ0KGZpbGVuYW1lLCAiaHR0cHM6IiwgTlVMTCkpCisgICAgaWYgKGF2X3N0cnN0YXJ0KGZpbGVuYW1lLCAiaHR0cHM6IiwgTlVMTCkgfHwgYXZfc3Ryc3RhcnQoZmlsZW5hbWUsICJ0bHM6IiwgTlVMTCkpCiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgImh0dHBzIHByb3RvY29sIG5vdCBmb3VuZCwgcmVjb21waWxlIEZGbXBlZyB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlbnNzbCwgZ251dGxzLFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuc3NsLCBnbnV0bHMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBzZWN1cmV0cmFuc3BvcnQgZW5hYmxlZC5cbiIpOwogICAgIHJldHVybiBBVkVSUk9SX1BST1RPQ09MX05PVF9GT1VORDsKIH0KIAogaW50IGZmdXJsX29wZW5fd2hpdGVsaXN0KFVSTENvbnRleHQgKipwdWMsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZJT0ludGVycnVwdENCICppbnRfY2IsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMsIGNvbnN0IGNoYXIgKndoaXRlbGlzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVklPSW50ZXJydXB0Q0IgKmludF9jYiwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aGl0ZWxpc3QsIGNvbnN0IGNoYXIqIGJsYWNrbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVUkxDb250ZXh0ICpwYXJlbnQpCiB7CiAgICAgQVZEaWN0aW9uYXJ5ICp0bXBfb3B0cyA9IE5VTEw7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7CiAgICAgaW50IHJldCA9IGZmdXJsX2FsbG9jKHB1YywgZmlsZW5hbWUsIGZsYWdzLCBpbnRfY2IpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OworICAgIGlmIChwYXJlbnQpCisgICAgICAgIGF2X29wdF9jb3B5KCpwdWMsIHBhcmVudCk7CisgICAgaWYgKG9wdGlvbnMgJiYKKyAgICAgICAgKHJldCA9IGF2X29wdF9zZXRfZGljdCgqcHVjLCBvcHRpb25zKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CiAgICAgaWYgKG9wdGlvbnMgJiYgKCpwdWMpLT5wcm90LT5wcml2X2RhdGFfY2xhc3MgJiYKICAgICAgICAgKHJldCA9IGF2X29wdF9zZXRfZGljdCgoKnB1YyktPnByaXZfZGF0YSwgb3B0aW9ucykpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwpAQCAtMzUxLDEwICszMjksMTYgQEAKICAgICBhdl9hc3NlcnQwKCF3aGl0ZWxpc3QgfHwKICAgICAgICAgICAgICAgICEoZT1hdl9kaWN0X2dldCgqb3B0aW9ucywgInByb3RvY29sX3doaXRlbGlzdCIsIE5VTEwsIDApKSB8fAogICAgICAgICAgICAgICAgIXN0cmNtcCh3aGl0ZWxpc3QsIGUtPnZhbHVlKSk7CisgICAgYXZfYXNzZXJ0MCghYmxhY2tsaXN0IHx8CisgICAgICAgICAgICAgICAhKGU9YXZfZGljdF9nZXQoKm9wdGlvbnMsICJwcm90b2NvbF9ibGFja2xpc3QiLCBOVUxMLCAwKSkgfHwKKyAgICAgICAgICAgICAgICFzdHJjbXAoYmxhY2tsaXN0LCBlLT52YWx1ZSkpOwogCiAgICAgaWYgKChyZXQgPSBhdl9kaWN0X3NldChvcHRpb25zLCAicHJvdG9jb2xfd2hpdGVsaXN0Iiwgd2hpdGVsaXN0LCAwKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKKyAgICBpZiAoKHJldCA9IGF2X2RpY3Rfc2V0KG9wdGlvbnMsICJwcm90b2NvbF9ibGFja2xpc3QiLCBibGFja2xpc3QsIDApKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKwogICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9kaWN0KCpwdWMsIG9wdGlvbnMpKSA8IDApCiAgICAgICAgIGdvdG8gZmFpbDsKIApAQCAtMzcyLDcgKzM1Niw3IEBACiAgICAgICAgICAgICAgICBjb25zdCBBVklPSW50ZXJydXB0Q0IgKmludF9jYiwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKIHsKICAgICByZXR1cm4gZmZ1cmxfb3Blbl93aGl0ZWxpc3QocHVjLCBmaWxlbmFtZSwgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9jYiwgb3B0aW9ucywgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludF9jYiwgb3B0aW9ucywgTlVMTCwgTlVMTCwgTlVMTCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJldHJ5X3RyYW5zZmVyX3dyYXBwZXIoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLApAQCAtNDA3LDEwICszOTEsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXZfdXNsZWVwKDEwMDApOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDEpCi0gICAgICAgICAgICByZXR1cm4gKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1JfRU9GKSA/IHJldCA6IGxlbjsKLSAgICAgICAgaWYgKHJldCkKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICByZXR1cm4gKGxlbiA+IDApID8gbGVuIDogQVZFUlJPUl9FT0Y7CisgICAgICAgIGVsc2UgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICBmYXN0X3JldHJpZXMgPSBGRk1BWChmYXN0X3JldHJpZXMsIDIpOworICAgICAgICAgICAgd2FpdF9zaW5jZSA9IDA7CisgICAgICAgIH0KICAgICAgICAgbGVuICs9IHJldDsKICAgICB9CiAgICAgcmV0dXJuIGxlbjsKQEAgLTQ4NCw3ICs0NzIsNyBAQAogCiBjb25zdCBjaGFyICphdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShjb25zdCBjaGFyICp1cmwpCiB7Ci0gICAgVVJMUHJvdG9jb2wgKnAgPSB1cmxfZmluZF9wcm90b2NvbCh1cmwpOworICAgIGNvbnN0IFVSTFByb3RvY29sICpwID0gdXJsX2ZpbmRfcHJvdG9jb2wodXJsKTsKIAogICAgIHJldHVybiBwID8gcC0+bmFtZSA6IE5VTEw7CiB9CkBAIC02MzcsMTMgKzYyNSwxNSBAQAogCiBpbnQgZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgpCiB7Ci0gICAgaWYgKCFoLT5wcm90LT51cmxfZ2V0X2ZpbGVfaGFuZGxlKQorICAgIGlmICghaCB8fCAhaC0+cHJvdCB8fCAhaC0+cHJvdC0+dXJsX2dldF9maWxlX2hhbmRsZSkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIHJldHVybiBoLT5wcm90LT51cmxfZ2V0X2ZpbGVfaGFuZGxlKGgpOwogfQogCiBpbnQgZmZ1cmxfZ2V0X211bHRpX2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgsIGludCAqKmhhbmRsZXMsIGludCAqbnVtaGFuZGxlcykKIHsKKyAgICBpZiAoIWggfHwgIWgtPnByb3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgaWYgKCFoLT5wcm90LT51cmxfZ2V0X211bHRpX2ZpbGVfaGFuZGxlKSB7CiAgICAgICAgIGlmICghaC0+cHJvdC0+dXJsX2dldF9maWxlX2hhbmRsZSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CkBAIC02NTcsMTAgKzY0NywxNyBAQAogICAgIHJldHVybiBoLT5wcm90LT51cmxfZ2V0X211bHRpX2ZpbGVfaGFuZGxlKGgsIGhhbmRsZXMsIG51bWhhbmRsZXMpOwogfQogCitpbnQgZmZ1cmxfZ2V0X3Nob3J0X3NlZWsoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBpZiAoIWggfHwgIWgtPnByb3QgfHwgIWgtPnByb3QtPnVybF9nZXRfc2hvcnRfc2VlaykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICByZXR1cm4gaC0+cHJvdC0+dXJsX2dldF9zaG9ydF9zZWVrKGgpOworfQorCiBpbnQgZmZ1cmxfc2h1dGRvd24oVVJMQ29udGV4dCAqaCwgaW50IGZsYWdzKQogewotICAgIGlmICghaC0+cHJvdC0+dXJsX3NodXRkb3duKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIGlmICghaCB8fCAhaC0+cHJvdCB8fCAhaC0+cHJvdC0+dXJsX3NodXRkb3duKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogICAgIHJldHVybiBoLT5wcm90LT51cmxfc2h1dGRvd24oaCwgZmxhZ3MpOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hdmlvLmggYi9saWJhdmZvcm1hdC9hdmlvLmgKaW5kZXggN2ZiY2UzMi4uNzU5MTJjZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXZpby5oCisrKyBiL2xpYmF2Zm9ybWF0L2F2aW8uaApAQCAtMzQsNyArMzQsMTUgQEAKIAogI2luY2x1ZGUgImxpYmF2Zm9ybWF0L3ZlcnNpb24uaCIKIAotI2RlZmluZSBBVklPX1NFRUtBQkxFX05PUk1BTCAweDAwMDEgLyoqPCBTZWVraW5nIHdvcmtzIGxpa2UgZm9yIGEgbG9jYWwgZmlsZSAqLworLyoqCisgKiBTZWVraW5nIHdvcmtzIGxpa2UgZm9yIGEgbG9jYWwgZmlsZS4KKyAqLworI2RlZmluZSBBVklPX1NFRUtBQkxFX05PUk1BTCAoMSA8PCAwKQorCisvKioKKyAqIFNlZWtpbmcgYnkgdGltZXN0YW1wIHdpdGggYXZpb19zZWVrX3RpbWUoKSBpcyBwb3NzaWJsZS4KKyAqLworI2RlZmluZSBBVklPX1NFRUtBQkxFX1RJTUUgICAoMSA8PCAxKQogCiAvKioKICAqIENhbGxiYWNrIGZvciBjaGVja2luZyB3aGV0aGVyIHRvIGFib3J0IGJsb2NraW5nIGZ1bmN0aW9ucy4KQEAgLTk3LDYgKzEwNSw0OCBAQAogfSBBVklPRGlyQ29udGV4dDsKIAogLyoqCisgKiBEaWZmZXJlbnQgZGF0YSB0eXBlcyB0aGF0IGNhbiBiZSByZXR1cm5lZCB2aWEgdGhlIEFWSU8KKyAqIHdyaXRlX2RhdGFfdHlwZSBjYWxsYmFjay4KKyAqLworZW51bSBBVklPRGF0YU1hcmtlclR5cGUgeworICAgIC8qKgorICAgICAqIEhlYWRlciBkYXRhOyB0aGlzIG5lZWRzIHRvIGJlIHByZXNlbnQgZm9yIHRoZSBzdHJlYW0gdG8gYmUgZGVjb2RlYWJsZS4KKyAgICAgKi8KKyAgICBBVklPX0RBVEFfTUFSS0VSX0hFQURFUiwKKyAgICAvKioKKyAgICAgKiBBIHBvaW50IGluIHRoZSBvdXRwdXQgYnl0ZXN0cmVhbSB3aGVyZSBhIGRlY29kZXIgY2FuIHN0YXJ0IGRlY29kaW5nCisgICAgICogKGkuZS4gYSBrZXlmcmFtZSkuIEEgZGVtdXhlci9kZWNvZGVyIGdpdmVuIHRoZSBkYXRhIGZsYWdnZWQgd2l0aAorICAgICAqIEFWSU9fREFUQV9NQVJLRVJfSEVBREVSLCBmb2xsb3dlZCBieSBhbnkgQVZJT19EQVRBX01BUktFUl9TWU5DX1BPSU5ULAorICAgICAqIHNob3VsZCBnaXZlIGRlY29kZWFibGUgcmVzdWx0cy4KKyAgICAgKi8KKyAgICBBVklPX0RBVEFfTUFSS0VSX1NZTkNfUE9JTlQsCisgICAgLyoqCisgICAgICogQSBwb2ludCBpbiB0aGUgb3V0cHV0IGJ5dGVzdHJlYW0gd2hlcmUgYSBkZW11eGVyIGNhbiBzdGFydCBwYXJzaW5nCisgICAgICogKGZvciBub24gc2VsZiBzeW5jaHJvbml6aW5nIGJ5dGVzdHJlYW0gZm9ybWF0cykuIFRoYXQgaXMsIGFueQorICAgICAqIG5vbi1rZXlmcmFtZSBwYWNrZXQgc3RhcnQgcG9pbnQuCisgICAgICovCisgICAgQVZJT19EQVRBX01BUktFUl9CT1VOREFSWV9QT0lOVCwKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIGFueSwgdW5sYWJlbGxlZCBkYXRhLiBJdCBjYW4gZWl0aGVyIGJlIGEgbXV4ZXIgbm90IG1hcmtpbmcKKyAgICAgKiBhbnkgcG9zaXRpb25zIGF0IGFsbCwgaXQgY2FuIGJlIGFuIGFjdHVhbCBib3VuZGFyeS9zeW5jIHBvaW50CisgICAgICogdGhhdCB0aGUgbXV4ZXIgY2hvb3NlcyBub3QgdG8gbWFyaywgb3IgYSBsYXRlciBwYXJ0IG9mIGEgcGFja2V0L2ZyYWdtZW50CisgICAgICogdGhhdCBpcyBjdXQgaW50byBtdWx0aXBsZSB3cml0ZSBjYWxsYmFja3MgZHVlIHRvIGxpbWl0ZWQgSU8gYnVmZmVyIHNpemUuCisgICAgICovCisgICAgQVZJT19EQVRBX01BUktFUl9VTktOT1dOLAorICAgIC8qKgorICAgICAqIFRyYWlsZXIgZGF0YSwgd2hpY2ggZG9lc24ndCBjb250YWluIGFjdHVhbCBjb250ZW50LCBidXQgb25seSBmb3IKKyAgICAgKiBmaW5hbGl6aW5nIHRoZSBvdXRwdXQgZmlsZS4KKyAgICAgKi8KKyAgICBBVklPX0RBVEFfTUFSS0VSX1RSQUlMRVIsCisgICAgLyoqCisgICAgICogQSBwb2ludCBpbiB0aGUgb3V0cHV0IGJ5dGVzdHJlYW0gd2hlcmUgdGhlIHVuZGVybHlpbmcgQVZJT0NvbnRleHQgbWlnaHQKKyAgICAgKiBmbHVzaCB0aGUgYnVmZmVyIGRlcGVuZGluZyBvbiBsYXRlbmN5IG9yIGJ1ZmZlcmluZyByZXF1aXJlbWVudHMuIFR5cGljYWxseQorICAgICAqIG1lYW5zIHRoZSBlbmQgb2YgYSBwYWNrZXQuCisgICAgICovCisgICAgQVZJT19EQVRBX01BUktFUl9GTFVTSF9QT0lOVCwKK307CisKKy8qKgogICogQnl0ZXN0cmVhbSBJTyBDb250ZXh0LgogICogTmV3IGZpZWxkcyBjYW4gYmUgYWRkZWQgdG8gdGhlIGVuZCB3aXRoIG1pbm9yIHZlcnNpb24gYnVtcHMuCiAgKiBSZW1vdmFsLCByZW9yZGVyaW5nIGFuZCBjaGFuZ2VzIHRvIGV4aXN0aW5nIGZpZWxkcyByZXF1aXJlIGEgbWFqb3IKQEAgLTEyNCw4ICsxNzQsOSBAQAogICAgIGNvbnN0IEFWQ2xhc3MgKmF2X2NsYXNzOwogCiAgICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIHNob3dzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBidWZmZXIsIGJ1Zl9wdHIsIGJ1Zl9lbmQsIGJ1Zl9zaXplLAotICAgICAqIGFuZCBwb3MsIHdoZW4gcmVhZGluZyBhbmQgd2hlbiB3cml0aW5nIChzaW5jZSBBVklPQ29udGV4dCBpcyB1c2VkIGZvciBib3RoKToKKyAgICAgKiBUaGUgZm9sbG93aW5nIHNob3dzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBidWZmZXIsIGJ1Zl9wdHIsCisgICAgICogYnVmX3B0cl9tYXgsIGJ1Zl9lbmQsIGJ1Zl9zaXplLCBhbmQgcG9zLCB3aGVuIHJlYWRpbmcgYW5kIHdoZW4gd3JpdGluZworICAgICAqIChzaW5jZSBBVklPQ29udGV4dCBpcyB1c2VkIGZvciBib3RoKToKICAgICAgKgogICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQURJTkcKQEAgLTE1MiwyMSArMjAzLDI0IEBACiAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcKICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAqCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIGJ1ZmZlcl9zaXplICAgICAgICAgIHwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgYnVmZmVyX3NpemUgICAgICAgICAgICAgICAgIHwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgYnVmX3B0ciAgICAgYnVmX2VuZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0rCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LyAvIC8gLyAvIC8gLyAvIC8gL3wgICAgICAgICAgIHwKLSAgICAgKiAgd3JpdGUgYnVmZmVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgLyB0byBiZSBmbHVzaGVkIC8gfCAgICAgICAgICAgfAotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC8gLyAvIC8gLyAvIC8gLyAvIC98ICAgICAgICAgICB8Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zl9wdHJfbWF4CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgKGJ1Zl9wdHIpICAgICAgIGJ1Zl9lbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8LyAvIC8gLyAvIC8gLyAvIC8gLyAvIC98ICAgICAgICAgICAgICB8CisgICAgICogIHdyaXRlIGJ1ZmZlcjogICAgICAgICAgICAgIHwgLyAvIHRvIGJlIGZsdXNoZWQgLyAvIHwgICAgICAgICAgICAgIHwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfC8gLyAvIC8gLyAvIC8gLyAvIC8gLyAvfCAgICAgICAgICAgICAgfAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0rCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmX3B0ciBjYW4gYmUgaW4gdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byBhIGJhY2t3YXJkIHNlZWsKICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MKLSAgICAgKiAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLSAgICAgKiAgb3V0cHV0IGZpbGU6IHwgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgKiAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MKKyAgICAgKiAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICogIG91dHB1dCBmaWxlOiB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAqICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgKgogICAgICAqLwogICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsgIC8qKjwgU3RhcnQgb2YgdGhlIGJ1ZmZlci4gKi8KQEAgLTE4Miw3ICsyMzYsNiBAQAogICAgIGludCAoKndyaXRlX3BhY2tldCkodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSk7CiAgICAgaW50NjRfdCAoKnNlZWspKHZvaWQgKm9wYXF1ZSwgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpOwogICAgIGludDY0X3QgcG9zOyAgICAgICAgICAgIC8qKjwgcG9zaXRpb24gaW4gdGhlIGZpbGUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyICovCi0gICAgaW50IG11c3RfZmx1c2g7ICAgICAgICAgLyoqPCB0cnVlIGlmIHRoZSBuZXh0IHNlZWsgc2hvdWxkIGZsdXNoICovCiAgICAgaW50IGVvZl9yZWFjaGVkOyAgICAgICAgLyoqPCB0cnVlIGlmIGVvZiByZWFjaGVkICovCiAgICAgaW50IHdyaXRlX2ZsYWc7ICAgICAgICAgLyoqPCB0cnVlIGlmIG9wZW4gZm9yIHdyaXRpbmcgKi8KICAgICBpbnQgbWF4X3BhY2tldF9zaXplOwpAQCAtMjU0LDkgKzMwNyw0OSBAQAogICAgICAqICcsJyBzZXBhcmF0ZWQgbGlzdCBvZiBhbGxvd2VkIHByb3RvY29scy4KICAgICAgKi8KICAgICBjb25zdCBjaGFyICpwcm90b2NvbF93aGl0ZWxpc3Q7Ci19IEFWSU9Db250ZXh0OwogCi0vKiB1bmJ1ZmZlcmVkIEkvTyAqLworICAgIC8qKgorICAgICAqICcsJyBzZXBhcmF0ZWQgbGlzdCBvZiBkaXNhbGxvd2VkIHByb3RvY29scy4KKyAgICAgKi8KKyAgICBjb25zdCBjaGFyICpwcm90b2NvbF9ibGFja2xpc3Q7CisKKyAgICAvKioKKyAgICAgKiBBIGNhbGxiYWNrIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHdyaXRlX3BhY2tldC4KKyAgICAgKi8KKyAgICBpbnQgKCp3cml0ZV9kYXRhX3R5cGUpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWSU9EYXRhTWFya2VyVHlwZSB0eXBlLCBpbnQ2NF90IHRpbWUpOworICAgIC8qKgorICAgICAqIElmIHNldCwgZG9uJ3QgY2FsbCB3cml0ZV9kYXRhX3R5cGUgc2VwYXJhdGVseSBmb3IgQVZJT19EQVRBX01BUktFUl9CT1VOREFSWV9QT0lOVCwKKyAgICAgKiBidXQgaWdub3JlIHRoZW0gYW5kIHRyZWF0IHRoZW0gYXMgQVZJT19EQVRBX01BUktFUl9VTktOT1dOICh0byBhdm9pZCBuZWVkbGVzc2x5CisgICAgICogc21hbGwgY2h1bmtzIG9mIGRhdGEgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGJhY2spLgorICAgICAqLworICAgIGludCBpZ25vcmVfYm91bmRhcnlfcG9pbnQ7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCwgbm90IG1lYW50IHRvIGJlIHVzZWQgZnJvbSBvdXRzaWRlIG9mIEFWSU9Db250ZXh0LgorICAgICAqLworICAgIGVudW0gQVZJT0RhdGFNYXJrZXJUeXBlIGN1cnJlbnRfdHlwZTsKKyAgICBpbnQ2NF90IGxhc3RfdGltZTsKKworICAgIC8qKgorICAgICAqIEEgY2FsbGJhY2sgdGhhdCBpcyB1c2VkIGluc3RlYWQgb2Ygc2hvcnRfc2Vla190aHJlc2hvbGQuCisgICAgICogVGhpcyBpcyBjdXJyZW50IGludGVybmFsIG9ubHksIGRvIG5vdCB1c2UgZnJvbSBvdXRzaWRlLgorICAgICAqLworICAgIGludCAoKnNob3J0X3NlZWtfZ2V0KSh2b2lkICpvcGFxdWUpOworCisgICAgaW50NjRfdCB3cml0dGVuOworCisgICAgLyoqCisgICAgICogTWF4aW11bSByZWFjaGVkIHBvc2l0aW9uIGJlZm9yZSBhIGJhY2t3YXJkIHNlZWsgaW4gdGhlIHdyaXRlIGJ1ZmZlciwKKyAgICAgKiB1c2VkIGtlZXBpbmcgdHJhY2sgb2YgYWxyZWFkeSB3cml0dGVuIGRhdGEgZm9yIGEgbGF0ZXIgZmx1c2guCisgICAgICovCisgICAgdW5zaWduZWQgY2hhciAqYnVmX3B0cl9tYXg7CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gYnVmZmVyIGF0IGxlYXN0IHRoaXMgYW1vdW50IG9mIGRhdGEgYmVmb3JlIGZsdXNoaW5nIGl0CisgICAgICovCisgICAgaW50IG1pbl9wYWNrZXRfc2l6ZTsKK30gQVZJT0NvbnRleHQ7CiAKIC8qKgogICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm90b2NvbCB0aGF0IHdpbGwgaGFuZGxlIHRoZSBwYXNzZWQgVVJMLgpAQCAtMzQ1LDcgKzQzOCw3IEBACiAKIC8qKgogICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gQVZJT0NvbnRleHQgZm9yIGJ1ZmZlcmVkIEkvTy4gSXQgbXVzdCBiZSBsYXRlcgotICogZnJlZWQgd2l0aCBhdl9mcmVlKCkuCisgKiBmcmVlZCB3aXRoIGF2aW9fY29udGV4dF9mcmVlKCkuCiAgKgogICogQHBhcmFtIGJ1ZmZlciBNZW1vcnkgYmxvY2sgZm9yIGlucHV0L291dHB1dCBvcGVyYXRpb25zIHZpYSBBVklPQ29udGV4dC4KICAqICAgICAgICBUaGUgYnVmZmVyIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggYXZfbWFsbG9jKCkgYW5kIGZyaWVuZHMuCkBAIC0zNTgsNiArNDUxLDggQEAKICAqIEBwYXJhbSB3cml0ZV9mbGFnIFNldCB0byAxIGlmIHRoZSBidWZmZXIgc2hvdWxkIGJlIHdyaXRhYmxlLCAwIG90aGVyd2lzZS4KICAqIEBwYXJhbSBvcGFxdWUgQW4gb3BhcXVlIHBvaW50ZXIgdG8gdXNlci1zcGVjaWZpYyBkYXRhLgogICogQHBhcmFtIHJlYWRfcGFja2V0ICBBIGZ1bmN0aW9uIGZvciByZWZpbGxpbmcgdGhlIGJ1ZmZlciwgbWF5IGJlIE5VTEwuCisgKiAgICAgICAgICAgICAgICAgICAgIEZvciBzdHJlYW0gcHJvdG9jb2xzLCBtdXN0IG5ldmVyIHJldHVybiAwIGJ1dCByYXRoZXIKKyAqICAgICAgICAgICAgICAgICAgICAgYSBwcm9wZXIgQVZFUlJPUiBjb2RlLgogICogQHBhcmFtIHdyaXRlX3BhY2tldCBBIGZ1bmN0aW9uIGZvciB3cml0aW5nIHRoZSBidWZmZXIgY29udGVudHMsIG1heSBiZSBOVUxMLgogICogICAgICAgIFRoZSBmdW5jdGlvbiBtYXkgbm90IGNoYW5nZSB0aGUgaW5wdXQgYnVmZmVycyBjb250ZW50LgogICogQHBhcmFtIHNlZWsgQSBmdW5jdGlvbiBmb3Igc2Vla2luZyB0byBzcGVjaWZpZWQgYnl0ZSBwb3NpdGlvbiwgbWF5IGJlIE5VTEwuCkBAIC0zNzMsNiArNDY4LDE0IEBACiAgICAgICAgICAgICAgICAgICBpbnQgKCp3cml0ZV9wYWNrZXQpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpLAogICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKnNlZWspKHZvaWQgKm9wYXF1ZSwgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpKTsKIAorLyoqCisgKiBGcmVlIHRoZSBzdXBwbGllZCBJTyBjb250ZXh0IGFuZCBldmVyeXRoaW5nIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAqCisgKiBAcGFyYW0gcyBEb3VibGUgcG9pbnRlciB0byB0aGUgSU8gY29udGV4dC4gVGhpcyBmdW5jdGlvbiB3aWxsIHdyaXRlIE5VTEwKKyAqIGludG8gcy4KKyAqLwordm9pZCBhdmlvX2NvbnRleHRfZnJlZShBVklPQ29udGV4dCAqKnMpOworCiB2b2lkIGF2aW9fdzgoQVZJT0NvbnRleHQgKnMsIGludCBiKTsKIHZvaWQgYXZpb193cml0ZShBVklPQ29udGV4dCAqcywgY29uc3QgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSk7CiB2b2lkIGF2aW9fd2w2NChBVklPQ29udGV4dCAqcywgdWludDY0X3QgdmFsKTsKQEAgLTQwOSwxNCArNTEyLDI2IEBACiBpbnQgYXZpb19wdXRfc3RyMTZiZShBVklPQ29udGV4dCAqcywgY29uc3QgY2hhciAqc3RyKTsKIAogLyoqCi0gKiBQYXNzaW5nIHRoaXMgYXMgdGhlICJ3aGVuY2UiIHBhcmFtZXRlciB0byBhIHNlZWsgZnVuY3Rpb24gY2F1c2VzIGl0IHRvCisgKiBNYXJrIHRoZSB3cml0dGVuIGJ5dGVzdHJlYW0gYXMgYSBzcGVjaWZpYyB0eXBlLgorICoKKyAqIFplcm8tbGVuZ3RoIHJhbmdlcyBhcmUgb21pdHRlZCBmcm9tIHRoZSBvdXRwdXQuCisgKgorICogQHBhcmFtIHRpbWUgdGhlIHN0cmVhbSB0aW1lIHRoZSBjdXJyZW50IGJ5dGVzdHJlYW0gcG9zIGNvcnJlc3BvbmRzIHRvCisgKiAgICAgICAgICAgICAoaW4gQVZfVElNRV9CQVNFIHVuaXRzKSwgb3IgQVZfTk9QVFNfVkFMVUUgaWYgdW5rbm93biBvciBub3QKKyAqICAgICAgICAgICAgIGFwcGxpY2FibGUKKyAqIEBwYXJhbSB0eXBlIHRoZSBraW5kIG9mIGRhdGEgd3JpdHRlbiBzdGFydGluZyBhdCB0aGUgY3VycmVudCBwb3MKKyAqLwordm9pZCBhdmlvX3dyaXRlX21hcmtlcihBVklPQ29udGV4dCAqcywgaW50NjRfdCB0aW1lLCBlbnVtIEFWSU9EYXRhTWFya2VyVHlwZSB0eXBlKTsKKworLyoqCisgKiBPUmluZyB0aGlzIGFzIHRoZSAid2hlbmNlIiBwYXJhbWV0ZXIgdG8gYSBzZWVrIGZ1bmN0aW9uIGNhdXNlcyBpdCB0bwogICogcmV0dXJuIHRoZSBmaWxlc2l6ZSB3aXRob3V0IHNlZWtpbmcgYW55d2hlcmUuIFN1cHBvcnRpbmcgdGhpcyBpcyBvcHRpb25hbC4KICAqIElmIGl0IGlzIG5vdCBzdXBwb3J0ZWQgdGhlbiB0aGUgc2VlayBmdW5jdGlvbiB3aWxsIHJldHVybiA8MC4KICAqLwogI2RlZmluZSBBVlNFRUtfU0laRSAweDEwMDAwCiAKIC8qKgotICogT3JpbmcgdGhpcyBmbGFnIGFzIGludG8gdGhlICJ3aGVuY2UiIHBhcmFtZXRlciB0byBhIHNlZWsgZnVuY3Rpb24gY2F1c2VzIGl0IHRvCisgKiBQYXNzaW5nIHRoaXMgZmxhZyBhcyB0aGUgIndoZW5jZSIgcGFyYW1ldGVyIHRvIGEgc2VlayBmdW5jdGlvbiBjYXVzZXMgaXQgdG8KICAqIHNlZWsgYnkgYW55IG1lYW5zIChsaWtlIHJlb3BlbmluZyBhbmQgbGluZWFyIHJlYWRpbmcpIG9yIG90aGVyIG5vcm1hbGx5IHVucmVhc29uYWJsZQogICogbWVhbnMgdGhhdCBjYW4gYmUgZXh0cmVtZWx5IHNsb3cuCiAgKiBUaGlzIG1heSBiZSBpZ25vcmVkIGJ5IHRoZSBzZWVrIGNvZGUuCkBAIC00NTUsMTMgKzU3MCw2IEBACiAgKiBAcmV0dXJuIG5vbiB6ZXJvIGlmIGFuZCBvbmx5IGlmIGVuZCBvZiBmaWxlCiAgKi8KIGludCBhdmlvX2Zlb2YoQVZJT0NvbnRleHQgKnMpOwotI2lmIEZGX0FQSV9VUkxfRkVPRgotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgYXZpb19mZW9mKCkKLSAqLwotYXR0cmlidXRlX2RlcHJlY2F0ZWQKLWludCB1cmxfZmVvZihBVklPQ29udGV4dCAqcyk7Ci0jZW5kaWYKIAogLyoqIEB3YXJuaW5nIFdyaXRlcyB1cCB0byA0IEtpQiBwZXIgY2FsbCAqLwogaW50IGF2aW9fcHJpbnRmKEFWSU9Db250ZXh0ICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLikgYXZfcHJpbnRmX2Zvcm1hdCgyLCAzKTsKQEAgLTQ4NSw2ICs1OTMsMTUgQEAKIGludCBhdmlvX3JlYWQoQVZJT0NvbnRleHQgKnMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpOwogCiAvKioKKyAqIFJlYWQgc2l6ZSBieXRlcyBmcm9tIEFWSU9Db250ZXh0IGludG8gYnVmLiBVbmxpa2UgYXZpb19yZWFkKCksIHRoaXMgaXMgYWxsb3dlZAorICogdG8gcmVhZCBmZXdlciBieXRlcyB0aGFuIHJlcXVlc3RlZC4gVGhlIG1pc3NpbmcgYnl0ZXMgY2FuIGJlIHJlYWQgaW4gdGhlIG5leHQKKyAqIGNhbGwuIFRoaXMgYWx3YXlzIHRyaWVzIHRvIHJlYWQgYXQgbGVhc3QgMSBieXRlLgorICogVXNlZnVsIHRvIHJlZHVjZSBsYXRlbmN5IGluIGNlcnRhaW4gY2FzZXMuCisgKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkIG9yIEFWRVJST1IKKyAqLworaW50IGF2aW9fcmVhZF9wYXJ0aWFsKEFWSU9Db250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKTsKKworLyoqCiAgKiBAbmFtZSBGdW5jdGlvbnMgZm9yIHJlYWRpbmcgZnJvbSBBVklPQ29udGV4dAogICogQHsKICAqCkBAIC02MzUsNiArNzUyLDE4IEBACiBpbnQgYXZpb19vcGVuX2R5bl9idWYoQVZJT0NvbnRleHQgKipzKTsKIAogLyoqCisgKiBSZXR1cm4gdGhlIHdyaXR0ZW4gc2l6ZSBhbmQgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIuCisgKiBUaGUgQVZJT0NvbnRleHQgc3RyZWFtIGlzIGxlZnQgaW50YWN0LgorICogVGhlIGJ1ZmZlciBtdXN0IE5PVCBiZSBmcmVlZC4KKyAqIE5vIHBhZGRpbmcgaXMgYWRkZWQgdG8gdGhlIGJ1ZmZlci4KKyAqCisgKiBAcGFyYW0gcyBJTyBjb250ZXh0CisgKiBAcGFyYW0gcGJ1ZmZlciBwb2ludGVyIHRvIGEgYnl0ZSBidWZmZXIKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZSBidWZmZXIKKyAqLworaW50IGF2aW9fZ2V0X2R5bl9idWYoQVZJT0NvbnRleHQgKnMsIHVpbnQ4X3QgKipwYnVmZmVyKTsKKworLyoqCiAgKiBSZXR1cm4gdGhlIHdyaXR0ZW4gc2l6ZSBhbmQgYSBwb2ludGVyIHRvIHRoZSBidWZmZXIuIFRoZSBidWZmZXIKICAqIG11c3QgYmUgZnJlZWQgd2l0aCBhdl9mcmVlKCkuCiAgKiBQYWRkaW5nIG9mIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgaXMgYWRkZWQgdG8gdGhlIGJ1ZmZlci4KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2F2aW9faW50ZXJuYWwuaCBiL2xpYmF2Zm9ybWF0L2F2aW9faW50ZXJuYWwuaAppbmRleCBmN2M4NTg4Li4wNGMxYWQ1IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hdmlvX2ludGVybmFsLmgKKysrIGIvbGliYXZmb3JtYXQvYXZpb19pbnRlcm5hbC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNTQsMTQgKzUzLDYgQEAKICAqLwogaW50IGZmaW9fcmVhZF9pbmRpcmVjdChBVklPQ29udGV4dCAqcywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgdW5zaWduZWQgY2hhciAqKmRhdGEpOwogCi0vKioKLSAqIFJlYWQgc2l6ZSBieXRlcyBmcm9tIEFWSU9Db250ZXh0IGludG8gYnVmLgotICogVGhpcyByZWFkcyBhdCBtb3N0IDEgcGFja2V0LiBJZiB0aGF0IGlzIG5vdCBlbm91Z2ggZmV3ZXIgYnl0ZXMgd2lsbCBiZQotICogcmV0dXJuZWQuCi0gKiBAcmV0dXJuIG51bWJlciBvZiBieXRlcyByZWFkIG9yIEFWRVJST1IKLSAqLwotaW50IGZmaW9fcmVhZF9wYXJ0aWFsKEFWSU9Db250ZXh0ICpzLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKTsKLQogdm9pZCBmZmlvX2ZpbGwoQVZJT0NvbnRleHQgKnMsIGludCBiLCBpbnQgY291bnQpOwogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGZmaW9fd2ZvdXJjYyhBVklPQ29udGV4dCAqcGIsIGNvbnN0IHVpbnQ4X3QgKnMpCkBAIC0xMTIsNiArMTAzLDggQEAKIHVuc2lnbmVkIGxvbmcgZmZpb19nZXRfY2hlY2tzdW0oQVZJT0NvbnRleHQgKnMpOwogdW5zaWduZWQgbG9uZyBmZl9jcmMwNEMxMURCN191cGRhdGUodW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY29uc3QgdWludDhfdCAqYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbik7Cit1bnNpZ25lZCBsb25nIGZmX2NyY0VEQjg4MzIwX3VwZGF0ZSh1bnNpZ25lZCBsb25nIGNoZWNrc3VtLCBjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKTsKIHVuc2lnbmVkIGxvbmcgZmZfY3JjQTAwMV91cGRhdGUodW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY29uc3QgdWludDhfdCAqYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKTsKIApAQCAtMTQwLDYgKzEzMywxNCBAQAogaW50IGZmaW9fZmRvcGVuKEFWSU9Db250ZXh0ICoqcywgVVJMQ29udGV4dCAqaCk7CiAKIC8qKgorICogUmV0dXJuIHRoZSBVUkxDb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgQVZJT0NvbnRleHQKKyAqCisgKiBAcGFyYW0gcyBJTyBjb250ZXh0CisgKiBAcmV0dXJuIHBvaW50ZXIgdG8gVVJMQ29udGV4dCBvciBOVUxMLgorICovCitVUkxDb250ZXh0ICpmZmlvX2dldHVybGNvbnRleHQoQVZJT0NvbnRleHQgKnMpOworCisvKioKICAqIE9wZW4gYSB3cml0ZS1vbmx5IGZha2UgbWVtb3J5IHN0cmVhbS4gVGhlIHdyaXR0ZW4gZGF0YSBpcyBub3Qgc3RvcmVkCiAgKiBhbnl3aGVyZSAtIHRoaXMgaXMgb25seSB1c2VkIGZvciBtZWFzdXJpbmcgdGhlIGFtb3VudCBvZiBkYXRhCiAgKiB3cml0dGVuLgpAQCAtMTUxLDcgKzE1Miw3IEBACiAKIGludCBmZmlvX29wZW5fd2hpdGVsaXN0KEFWSU9Db250ZXh0ICoqcywgY29uc3QgY2hhciAqdXJsLCBpbnQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZJT0ludGVycnVwdENCICppbnRfY2IsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aGl0ZWxpc3QsIGNvbnN0IGNoYXIgKmJsYWNrbGlzdCk7CiAKIC8qKgogICogQ2xvc2UgYSBudWxsIGJ1ZmZlci4KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2F2aW9idWYuYyBiL2xpYmF2Zm9ybWF0L2F2aW9idWYuYwppbmRleCAyMTNlZTk2Li5lNzUyZDBlIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hdmlvYnVmLmMKKysrIGIvbGliYXZmb3JtYXQvYXZpb2J1Zi5jCkBAIC00MiwxMCArNDIsMTUgQEAKICAqLwogI2RlZmluZSBTSE9SVF9TRUVLX1RIUkVTSE9MRCA0MDk2CiAKK3R5cGVkZWYgc3RydWN0IEFWSU9JbnRlcm5hbCB7CisgICAgVVJMQ29udGV4dCAqaDsKK30gQVZJT0ludGVybmFsOworCiBzdGF0aWMgdm9pZCAqZmZfYXZpb19jaGlsZF9uZXh0KHZvaWQgKm9iaiwgdm9pZCAqcHJldikKIHsKICAgICBBVklPQ29udGV4dCAqcyA9IG9iajsKLSAgICByZXR1cm4gcHJldiA/IE5VTEwgOiBzLT5vcGFxdWU7CisgICAgQVZJT0ludGVybmFsICppbnRlcm5hbCA9IHMtPm9wYXF1ZTsKKyAgICByZXR1cm4gcHJldiA/IE5VTEwgOiBpbnRlcm5hbC0+aDsKIH0KIAogc3RhdGljIGNvbnN0IEFWQ2xhc3MgKmZmX2F2aW9fY2hpbGRfY2xhc3NfbmV4dChjb25zdCBBVkNsYXNzICpwcmV2KQpAQCAtODIsMTAgKzg3LDEzIEBACiAgICAgICAgICAgICAgICAgICBpbnQgKCp3cml0ZV9wYWNrZXQpKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpLAogICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKnNlZWspKHZvaWQgKm9wYXF1ZSwgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpKQogeworICAgIG1lbXNldChzLCAwLCBzaXplb2YoQVZJT0NvbnRleHQpKTsKKwogICAgIHMtPmJ1ZmZlciAgICAgID0gYnVmZmVyOwogICAgIHMtPm9yaWdfYnVmZmVyX3NpemUgPQogICAgIHMtPmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemU7CiAgICAgcy0+YnVmX3B0ciAgICAgPSBidWZmZXI7CisgICAgcy0+YnVmX3B0cl9tYXggPSBidWZmZXI7CiAgICAgcy0+b3BhcXVlICAgICAgPSBvcGFxdWU7CiAgICAgcy0+ZGlyZWN0ICAgICAgPSAwOwogCkBAIC05NSwxMCArMTAzLDEwIEBACiAgICAgcy0+cmVhZF9wYWNrZXQgICAgID0gcmVhZF9wYWNrZXQ7CiAgICAgcy0+c2VlayAgICAgICAgICAgID0gc2VlazsKICAgICBzLT5wb3MgICAgICAgICAgICAgPSAwOwotICAgIHMtPm11c3RfZmx1c2ggICAgICA9IDA7CiAgICAgcy0+ZW9mX3JlYWNoZWQgICAgID0gMDsKICAgICBzLT5lcnJvciAgICAgICAgICAgPSAwOwogICAgIHMtPnNlZWthYmxlICAgICAgICA9IHNlZWsgPyBBVklPX1NFRUtBQkxFX05PUk1BTCA6IDA7CisgICAgcy0+bWluX3BhY2tldF9zaXplID0gMDsKICAgICBzLT5tYXhfcGFja2V0X3NpemUgPSAwOwogICAgIHMtPnVwZGF0ZV9jaGVja3N1bSA9IE5VTEw7CiAgICAgcy0+c2hvcnRfc2Vla190aHJlc2hvbGQgPSBTSE9SVF9TRUVLX1RIUkVTSE9MRDsKQEAgLTExMCw2ICsxMTgsMTMgQEAKICAgICBzLT5yZWFkX3BhdXNlID0gTlVMTDsKICAgICBzLT5yZWFkX3NlZWsgID0gTlVMTDsKIAorICAgIHMtPndyaXRlX2RhdGFfdHlwZSAgICAgICA9IE5VTEw7CisgICAgcy0+aWdub3JlX2JvdW5kYXJ5X3BvaW50ID0gMDsKKyAgICBzLT5jdXJyZW50X3R5cGUgICAgICAgICAgPSBBVklPX0RBVEFfTUFSS0VSX1VOS05PV047CisgICAgcy0+bGFzdF90aW1lICAgICAgICAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgcy0+c2hvcnRfc2Vla19nZXQgICAgICAgID0gTlVMTDsKKyAgICBzLT53cml0dGVuICAgICAgICAgICAgICAgPSAwOworCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTEyMiw3ICsxMzcsNyBAQAogICAgICAgICAgICAgICAgICAgaW50ICgqd3JpdGVfcGFja2V0KSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKSwKICAgICAgICAgICAgICAgICAgIGludDY0X3QgKCpzZWVrKSh2b2lkICpvcGFxdWUsIGludDY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSkKIHsKLSAgICBBVklPQ29udGV4dCAqcyA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWSU9Db250ZXh0KSk7CisgICAgQVZJT0NvbnRleHQgKnMgPSBhdl9tYWxsb2Moc2l6ZW9mKEFWSU9Db250ZXh0KSk7CiAgICAgaWYgKCFzKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBmZmlvX2luaXRfY29udGV4dChzLCBidWZmZXIsIGJ1ZmZlcl9zaXplLCB3cml0ZV9mbGFnLCBvcGFxdWUsCkBAIC0xMzAsMjkgKzE0NSw1MCBAQAogICAgIHJldHVybiBzOwogfQogCit2b2lkIGF2aW9fY29udGV4dF9mcmVlKEFWSU9Db250ZXh0ICoqcHMpCit7CisgICAgYXZfZnJlZXAocHMpOworfQorCiBzdGF0aWMgdm9pZCB3cml0ZW91dChBVklPQ29udGV4dCAqcywgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGxlbikKIHsKLSAgICBpZiAocy0+d3JpdGVfcGFja2V0ICYmICFzLT5lcnJvcikgewotICAgICAgICBpbnQgcmV0ID0gcy0+d3JpdGVfcGFja2V0KHMtPm9wYXF1ZSwgKHVpbnQ4X3QgKilkYXRhLCBsZW4pOworICAgIGlmICghcy0+ZXJyb3IpIHsKKyAgICAgICAgaW50IHJldCA9IDA7CisgICAgICAgIGlmIChzLT53cml0ZV9kYXRhX3R5cGUpCisgICAgICAgICAgICByZXQgPSBzLT53cml0ZV9kYXRhX3R5cGUocy0+b3BhcXVlLCAodWludDhfdCAqKWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmN1cnJlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5sYXN0X3RpbWUpOworICAgICAgICBlbHNlIGlmIChzLT53cml0ZV9wYWNrZXQpCisgICAgICAgICAgICByZXQgPSBzLT53cml0ZV9wYWNrZXQocy0+b3BhcXVlLCAodWludDhfdCAqKWRhdGEsIGxlbik7CiAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICBzLT5lcnJvciA9IHJldDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzLT5wb3MgKyBsZW4gPiBzLT53cml0dGVuKQorICAgICAgICAgICAgICAgIHMtPndyaXR0ZW4gPSBzLT5wb3MgKyBsZW47CiAgICAgICAgIH0KICAgICB9CisgICAgaWYgKHMtPmN1cnJlbnRfdHlwZSA9PSBBVklPX0RBVEFfTUFSS0VSX1NZTkNfUE9JTlQgfHwKKyAgICAgICAgcy0+Y3VycmVudF90eXBlID09IEFWSU9fREFUQV9NQVJLRVJfQk9VTkRBUllfUE9JTlQpIHsKKyAgICAgICAgcy0+Y3VycmVudF90eXBlID0gQVZJT19EQVRBX01BUktFUl9VTktOT1dOOworICAgIH0KKyAgICBzLT5sYXN0X3RpbWUgPSBBVl9OT1BUU19WQUxVRTsKICAgICBzLT53cml0ZW91dF9jb3VudCArKzsKICAgICBzLT5wb3MgKz0gbGVuOwogfQogCiBzdGF0aWMgdm9pZCBmbHVzaF9idWZmZXIoQVZJT0NvbnRleHQgKnMpCiB7Ci0gICAgaWYgKHMtPndyaXRlX2ZsYWcgJiYgcy0+YnVmX3B0ciA+IHMtPmJ1ZmZlcikgewotICAgICAgICB3cml0ZW91dChzLCBzLT5idWZmZXIsIHMtPmJ1Zl9wdHIgLSBzLT5idWZmZXIpOworICAgIHMtPmJ1Zl9wdHJfbWF4ID0gRkZNQVgocy0+YnVmX3B0ciwgcy0+YnVmX3B0cl9tYXgpOworICAgIGlmIChzLT53cml0ZV9mbGFnICYmIHMtPmJ1Zl9wdHJfbWF4ID4gcy0+YnVmZmVyKSB7CisgICAgICAgIHdyaXRlb3V0KHMsIHMtPmJ1ZmZlciwgcy0+YnVmX3B0cl9tYXggLSBzLT5idWZmZXIpOwogICAgICAgICBpZiAocy0+dXBkYXRlX2NoZWNrc3VtKSB7CiAgICAgICAgICAgICBzLT5jaGVja3N1bSAgICAgPSBzLT51cGRhdGVfY2hlY2tzdW0ocy0+Y2hlY2tzdW0sIHMtPmNoZWNrc3VtX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5idWZfcHRyIC0gcy0+Y2hlY2tzdW1fcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5idWZfcHRyX21heCAtIHMtPmNoZWNrc3VtX3B0cik7CiAgICAgICAgICAgICBzLT5jaGVja3N1bV9wdHIgPSBzLT5idWZmZXI7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcy0+YnVmX3B0ciA9IHMtPmJ1ZmZlcjsKKyAgICBzLT5idWZfcHRyID0gcy0+YnVmX3B0cl9tYXggPSBzLT5idWZmZXI7CiAgICAgaWYgKCFzLT53cml0ZV9mbGFnKQogICAgICAgICBzLT5idWZfZW5kID0gcy0+YnVmZmVyOwogfQpAQCAtMjAxLDggKzIzNywxMCBAQAogCiB2b2lkIGF2aW9fZmx1c2goQVZJT0NvbnRleHQgKnMpCiB7CisgICAgaW50IHNlZWtiYWNrID0gcy0+d3JpdGVfZmxhZyA/IEZGTUlOKDAsIHMtPmJ1Zl9wdHIgLSBzLT5idWZfcHRyX21heCkgOiAwOwogICAgIGZsdXNoX2J1ZmZlcihzKTsKLSAgICBzLT5tdXN0X2ZsdXNoID0gMDsKKyAgICBpZiAoc2Vla2JhY2spCisgICAgICAgIGF2aW9fc2VlayhzLCBzZWVrYmFjaywgU0VFS19DVVIpOwogfQogCiBpbnQ2NF90IGF2aW9fc2VlayhBVklPQ29udGV4dCAqcywgaW50NjRfdCBvZmZzZXQsIGludCB3aGVuY2UpCkBAIC0yMTEsNiArMjQ5LDcgQEAKICAgICBpbnQ2NF90IHBvczsKICAgICBpbnQgZm9yY2UgPSB3aGVuY2UgJiBBVlNFRUtfRk9SQ0U7CiAgICAgaW50IGJ1ZmZlcl9zaXplOworICAgIGludCBzaG9ydF9zZWVrOwogICAgIHdoZW5jZSAmPSB+QVZTRUVLX0ZPUkNFOwogCiAgICAgaWYoIXMpCkBAIC0yMjcsMTggKzI2NiwyOSBAQAogICAgICAgICBvZmZzZXQxID0gcG9zICsgKHMtPmJ1Zl9wdHIgLSBzLT5idWZmZXIpOwogICAgICAgICBpZiAob2Zmc2V0ID09IDApCiAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0MTsKKyAgICAgICAgaWYgKG9mZnNldCA+IElOVDY0X01BWCAtIG9mZnNldDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICBvZmZzZXQgKz0gb2Zmc2V0MTsKICAgICB9CiAgICAgaWYgKG9mZnNldCA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAKKyAgICBpZiAocy0+c2hvcnRfc2Vla19nZXQpIHsKKyAgICAgICAgc2hvcnRfc2VlayA9IHMtPnNob3J0X3NlZWtfZ2V0KHMtPm9wYXF1ZSk7CisgICAgICAgIC8qIGZhbGxiYWNrIHRvIGRlZmF1bHQgc2hvcnQgc2VlayAqLworICAgICAgICBpZiAoc2hvcnRfc2VlayA8PSAwKQorICAgICAgICAgICAgc2hvcnRfc2VlayA9IHMtPnNob3J0X3NlZWtfdGhyZXNob2xkOworICAgIH0gZWxzZQorICAgICAgICBzaG9ydF9zZWVrID0gcy0+c2hvcnRfc2Vla190aHJlc2hvbGQ7CisKICAgICBvZmZzZXQxID0gb2Zmc2V0IC0gcG9zOyAvLyAib2Zmc2V0MSIgaXMgdGhlIHJlbGF0aXZlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2Ygcy0+YnVmZmVyCi0gICAgaWYgKCFzLT5tdXN0X2ZsdXNoICYmICghcy0+ZGlyZWN0IHx8ICFzLT5zZWVrKSAmJgotICAgICAgICBvZmZzZXQxID49IDAgJiYgb2Zmc2V0MSA8PSBidWZmZXJfc2l6ZSAtIHMtPndyaXRlX2ZsYWcpIHsKKyAgICBzLT5idWZfcHRyX21heCA9IEZGTUFYKHMtPmJ1Zl9wdHJfbWF4LCBzLT5idWZfcHRyKTsKKyAgICBpZiAoKCFzLT5kaXJlY3QgfHwgIXMtPnNlZWspICYmCisgICAgICAgIG9mZnNldDEgPj0gMCAmJiBvZmZzZXQxIDw9IChzLT53cml0ZV9mbGFnID8gcy0+YnVmX3B0cl9tYXggLSBzLT5idWZmZXIgOiBidWZmZXJfc2l6ZSkpIHsKICAgICAgICAgLyogY2FuIGRvIHRoZSBzZWVrIGluc2lkZSB0aGUgYnVmZmVyICovCiAgICAgICAgIHMtPmJ1Zl9wdHIgPSBzLT5idWZmZXIgKyBvZmZzZXQxOwotICAgIH0gZWxzZSBpZiAoKCFzLT5zZWVrYWJsZSB8fAotICAgICAgICAgICAgICAgb2Zmc2V0MSA8PSBidWZmZXJfc2l6ZSArIHMtPnNob3J0X3NlZWtfdGhyZXNob2xkKSAmJgorICAgIH0gZWxzZSBpZiAoKCEocy0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgfHwKKyAgICAgICAgICAgICAgIG9mZnNldDEgPD0gYnVmZmVyX3NpemUgKyBzaG9ydF9zZWVrKSAmJgogICAgICAgICAgICAgICAgIXMtPndyaXRlX2ZsYWcgJiYgb2Zmc2V0MSA+PSAwICYmCiAgICAgICAgICAgICAgICAoIXMtPmRpcmVjdCB8fCAhcy0+c2VlaykgJiYKICAgICAgICAgICAgICAgKHdoZW5jZSAhPSBTRUVLX0VORCB8fCBmb3JjZSkpIHsKQEAgLTI2Myw3ICszMTMsNiBAQAogICAgICAgICBpbnQ2NF90IHJlczsKICAgICAgICAgaWYgKHMtPndyaXRlX2ZsYWcpIHsKICAgICAgICAgICAgIGZsdXNoX2J1ZmZlcihzKTsKLSAgICAgICAgICAgIHMtPm11c3RfZmx1c2ggPSAxOwogICAgICAgICB9CiAgICAgICAgIGlmICghcy0+c2VlaykKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVQSVBFKTsKQEAgLTI3Miw3ICszMjEsNyBAQAogICAgICAgICBzLT5zZWVrX2NvdW50ICsrOwogICAgICAgICBpZiAoIXMtPndyaXRlX2ZsYWcpCiAgICAgICAgICAgICBzLT5idWZfZW5kID0gcy0+YnVmZmVyOwotICAgICAgICBzLT5idWZfcHRyID0gcy0+YnVmZmVyOworICAgICAgICBzLT5idWZfcHRyID0gcy0+YnVmX3B0cl9tYXggPSBzLT5idWZmZXI7CiAgICAgICAgIHMtPnBvcyA9IG9mZnNldDsKICAgICB9CiAgICAgcy0+ZW9mX3JlYWNoZWQgPSAwOwpAQCAtMjkxLDYgKzM0MCw5IEBACiAgICAgaWYgKCFzKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCisgICAgaWYgKHMtPndyaXR0ZW4pCisgICAgICAgIHJldHVybiBzLT53cml0dGVuOworCiAgICAgaWYgKCFzLT5zZWVrKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogICAgIHNpemUgPSBzLT5zZWVrKHMtPm9wYXF1ZSwgMCwgQVZTRUVLX1NJWkUpOwpAQCAtMzE0LDEzICszNjYsNiBAQAogICAgIHJldHVybiBzLT5lb2ZfcmVhY2hlZDsKIH0KIAotI2lmIEZGX0FQSV9VUkxfRkVPRgotaW50IHVybF9mZW9mKEFWSU9Db250ZXh0ICpzKQotewotICAgIHJldHVybiBhdmlvX2Zlb2Yocyk7Ci19Ci0jZW5kaWYKLQogdm9pZCBhdmlvX3dsMzIoQVZJT0NvbnRleHQgKnMsIHVuc2lnbmVkIGludCB2YWwpCiB7CiAgICAgYXZpb193OChzLCAodWludDhfdCkgdmFsICAgICAgICk7CkBAIC0zNjMsNyArNDA4LDcgQEAKICAgICAgICAgICAgICAgICAgIHJldCArPSAyOykKICAgICAgICAgY29udGludWU7CiBpbnZhbGlkOgotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWlkIFVURjggc2VxdWVuY2UgaW4gYXZpb19wdXRfc3RyMTYlc1xuIiwgYmUgPyAiYmUiIDogImxlIik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIFVURjggc2VxdWVuY2UgaW4gYXZpb19wdXRfc3RyMTYlc1xuIiwgYmUgPyAiYmUiIDogImxlIik7CiAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgaWYgKCEqKHEtMSkpCiAgICAgICAgICAgICBicmVhazsKQEAgLTQ0NSw2ICs0OTAsNjAgQEAKICAgICBhdmlvX3c4KHMsICh1aW50OF90KXZhbCk7CiB9CiAKK3ZvaWQgYXZpb193cml0ZV9tYXJrZXIoQVZJT0NvbnRleHQgKnMsIGludDY0X3QgdGltZSwgZW51bSBBVklPRGF0YU1hcmtlclR5cGUgdHlwZSkKK3sKKyAgICBpZiAodHlwZSA9PSBBVklPX0RBVEFfTUFSS0VSX0ZMVVNIX1BPSU5UKSB7CisgICAgICAgIGlmIChzLT5idWZfcHRyIC0gcy0+YnVmZmVyID49IHMtPm1pbl9wYWNrZXRfc2l6ZSkKKyAgICAgICAgICAgIGF2aW9fZmx1c2gocyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFzLT53cml0ZV9kYXRhX3R5cGUpCisgICAgICAgIHJldHVybjsKKyAgICAvLyBJZiBpZ25vcmluZyBib3VuZGFyeSBwb2ludHMsIGp1c3QgdHJlYXQgaXQgYXMgdW5rbm93bgorICAgIGlmICh0eXBlID09IEFWSU9fREFUQV9NQVJLRVJfQk9VTkRBUllfUE9JTlQgJiYgcy0+aWdub3JlX2JvdW5kYXJ5X3BvaW50KQorICAgICAgICB0eXBlID0gQVZJT19EQVRBX01BUktFUl9VTktOT1dOOworICAgIC8vIEF2b2lkIHVubmVjZXNzYXJ5IGZsdXNoZXMgaWYgd2UgYXJlIGFscmVhZHkgaW4gbm9uLWhlYWRlci90cmFpbGVyCisgICAgLy8gZGF0YSBhbmQgc2V0dGluZyB0aGUgdHlwZSB0byB1bmtub3duCisgICAgaWYgKHR5cGUgPT0gQVZJT19EQVRBX01BUktFUl9VTktOT1dOICYmCisgICAgICAgIChzLT5jdXJyZW50X3R5cGUgIT0gQVZJT19EQVRBX01BUktFUl9IRUFERVIgJiYKKyAgICAgICAgIHMtPmN1cnJlbnRfdHlwZSAhPSBBVklPX0RBVEFfTUFSS0VSX1RSQUlMRVIpKQorICAgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFWSU9fREFUQV9NQVJLRVJfSEVBREVSOgorICAgIGNhc2UgQVZJT19EQVRBX01BUktFUl9UUkFJTEVSOgorICAgICAgICAvLyBGb3IgaGVhZGVyL3RyYWlsZXIsIGlnbm9yZSBhIG5ldyBtYXJrZXIgb2YgdGhlIHNhbWUgdHlwZTsKKyAgICAgICAgLy8gY29uc2VjdXRpdmUgaGVhZGVyL3RyYWlsZXIgbWFya2VycyBjYW4gYmUgbWVyZ2VkLgorICAgICAgICBpZiAodHlwZSA9PSBzLT5jdXJyZW50X3R5cGUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIElmIHdlJ3ZlIHJlYWNoZWQgaGVyZSwgd2UgaGF2ZSBhIG5ldywgbm90ZXdvcnRoeSBtYXJrZXIuCisgICAgLy8gRmx1c2ggdGhlIHByZXZpb3VzIGRhdGEgYW5kIG1hcmsgdGhlIHN0YXJ0IG9mIHRoZSBuZXcgZGF0YS4KKyAgICBhdmlvX2ZsdXNoKHMpOworICAgIHMtPmN1cnJlbnRfdHlwZSA9IHR5cGU7CisgICAgcy0+bGFzdF90aW1lID0gdGltZTsKK30KKworc3RhdGljIGludCByZWFkX3BhY2tldF93cmFwcGVyKEFWSU9Db250ZXh0ICpzLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIGludCByZXQ7CisKKyAgICBpZiAoIXMtPnJlYWRfcGFja2V0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIHJldCA9IHMtPnJlYWRfcGFja2V0KHMtPm9wYXF1ZSwgYnVmLCBzaXplKTsKKyNpZiBGRl9BUElfT0xEX0FWSU9fRU9GXzAKKyAgICBpZiAoIXJldCAmJiAhcy0+bWF4X3BhY2tldF9zaXplKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgcmV0dXJuIHZhbHVlIDAgZm9yIHN0cmVhbSBwcm90b2NvbFxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOworICAgIH0KKyNlbHNlCisgICAgYXZfYXNzZXJ0MihyZXQgfHwgcy0+bWF4X3BhY2tldF9zaXplKTsKKyNlbmRpZgorICAgIHJldHVybiByZXQ7Cit9CisKIC8qIElucHV0IHN0cmVhbSAqLwogCiBzdGF0aWMgdm9pZCBmaWxsX2J1ZmZlcihBVklPQ29udGV4dCAqcykKQEAgLTQ3Miw3ICs1NzEsNyBAQAogCiAgICAgLyogbWFrZSBidWZmZXIgc21hbGxlciBpbiBjYXNlIGl0IGVuZGVkIHVwIGxhcmdlIGFmdGVyIHByb2JpbmcgKi8KICAgICBpZiAocy0+cmVhZF9wYWNrZXQgJiYgcy0+b3JpZ19idWZmZXJfc2l6ZSAmJiBzLT5idWZmZXJfc2l6ZSA+IHMtPm9yaWdfYnVmZmVyX3NpemUpIHsKLSAgICAgICAgaWYgKGRzdCA9PSBzLT5idWZmZXIpIHsKKyAgICAgICAgaWYgKGRzdCA9PSBzLT5idWZmZXIgJiYgcy0+YnVmX3B0ciAhPSBkc3QpIHsKICAgICAgICAgICAgIGludCByZXQgPSBmZmlvX3NldF9idWZfc2l6ZShzLCBzLT5vcmlnX2J1ZmZlcl9zaXplKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBkZWNyZWFzZSBidWZmZXIgc2l6ZVxuIik7CkBAIC00ODMsMTYgKzU4MiwxNCBAQAogICAgICAgICBsZW4gPSBzLT5vcmlnX2J1ZmZlcl9zaXplOwogICAgIH0KIAotICAgIGlmIChzLT5yZWFkX3BhY2tldCkKLSAgICAgICAgbGVuID0gcy0+cmVhZF9wYWNrZXQocy0+b3BhcXVlLCBkc3QsIGxlbik7Ci0gICAgZWxzZQotICAgICAgICBsZW4gPSAwOwotICAgIGlmIChsZW4gPD0gMCkgeworICAgIGxlbiA9IHJlYWRfcGFja2V0X3dyYXBwZXIocywgZHN0LCBsZW4pOworICAgIGlmIChsZW4gPT0gQVZFUlJPUl9FT0YpIHsKICAgICAgICAgLyogZG8gbm90IG1vZGlmeSBidWZmZXIgaWYgRU9GIHJlYWNoZWQgc28gdGhhdCBhIHNlZWsgYmFjayBjYW4KICAgICAgICAgICAgYmUgZG9uZSB3aXRob3V0IHJlcmVhZGluZyBkYXRhICovCiAgICAgICAgIHMtPmVvZl9yZWFjaGVkID0gMTsKLSAgICAgICAgaWYgKGxlbiA8IDApCi0gICAgICAgICAgICBzLT5lcnJvciA9IGxlbjsKKyAgICB9IGVsc2UgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgcy0+ZW9mX3JlYWNoZWQgPSAxOworICAgICAgICBzLT5lcnJvcj0gbGVuOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHMtPnBvcyArPSBsZW47CiAgICAgICAgIHMtPmJ1Zl9wdHIgPSBkc3Q7CkBAIC01MDcsNiArNjA0LDEyIEBACiAgICAgcmV0dXJuIGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18zMl9JRUVFKSwgY2hlY2tzdW0sIGJ1ZiwgbGVuKTsKIH0KIAordW5zaWduZWQgbG9uZyBmZl9jcmNFREI4ODMyMF91cGRhdGUodW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY29uc3QgdWludDhfdCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKyAgICByZXR1cm4gYXZfY3JjKGF2X2NyY19nZXRfdGFibGUoQVZfQ1JDXzMyX0lFRUVfTEUpLCBjaGVja3N1bSwgYnVmLCBsZW4pOworfQorCiB1bnNpZ25lZCBsb25nIGZmX2NyY0EwMDFfdXBkYXRlKHVuc2lnbmVkIGxvbmcgY2hlY2tzdW0sIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGxlbikKIHsKQEAgLTU1MiwxNSArNjU1LDE1IEBACiAgICAgICAgIGlmIChsZW4gPT0gMCB8fCBzLT53cml0ZV9mbGFnKSB7CiAgICAgICAgICAgICBpZigocy0+ZGlyZWN0IHx8IHNpemUgPiBzLT5idWZmZXJfc2l6ZSkgJiYgIXMtPnVwZGF0ZV9jaGVja3N1bSkgewogICAgICAgICAgICAgICAgIC8vIGJ5cGFzcyB0aGUgYnVmZmVyIGFuZCByZWFkIGRhdGEgZGlyZWN0bHkgaW50byBidWYKLSAgICAgICAgICAgICAgICBpZihzLT5yZWFkX3BhY2tldCkKLSAgICAgICAgICAgICAgICAgICAgbGVuID0gcy0+cmVhZF9wYWNrZXQocy0+b3BhcXVlLCBidWYsIHNpemUpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSAwKSB7CisgICAgICAgICAgICAgICAgbGVuID0gcmVhZF9wYWNrZXRfd3JhcHBlcihzLCBidWYsIHNpemUpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gQVZFUlJPUl9FT0YpIHsKICAgICAgICAgICAgICAgICAgICAgLyogZG8gbm90IG1vZGlmeSBidWZmZXIgaWYgRU9GIHJlYWNoZWQgc28gdGhhdCBhIHNlZWsgYmFjayBjYW4KICAgICAgICAgICAgICAgICAgICAgYmUgZG9uZSB3aXRob3V0IHJlcmVhZGluZyBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgIHMtPmVvZl9yZWFjaGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgaWYobGVuPDApCi0gICAgICAgICAgICAgICAgICAgICAgICBzLT5lcnJvcj0gbGVuOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcy0+ZW9mX3JlYWNoZWQgPSAxOworICAgICAgICAgICAgICAgICAgICBzLT5lcnJvcj0gbGVuOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzLT5wb3MgKz0gbGVuOwpAQCAtNjExLDcgKzcxNCw3IEBACiAgICAgfQogfQogCi1pbnQgZmZpb19yZWFkX3BhcnRpYWwoQVZJT0NvbnRleHQgKnMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCitpbnQgYXZpb19yZWFkX3BhcnRpYWwoQVZJT0NvbnRleHQgKnMsIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCiB7CiAgICAgaW50IGxlbjsKIApAQCAtNjE5LDcgKzcyMiw3IEBACiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmIChzLT5yZWFkX3BhY2tldCAmJiBzLT53cml0ZV9mbGFnKSB7Ci0gICAgICAgIGxlbiA9IHMtPnJlYWRfcGFja2V0KHMtPm9wYXF1ZSwgYnVmLCBzaXplKTsKKyAgICAgICAgbGVuID0gcmVhZF9wYWNrZXRfd3JhcHBlcihzLCBidWYsIHNpemUpOwogICAgICAgICBpZiAobGVuID4gMCkKICAgICAgICAgICAgIHMtPnBvcyArPSBsZW47CiAgICAgICAgIHJldHVybiBsZW47CkBAIC03MjAsNiArODIzLDYwIEBACiAgICAgcmV0dXJuIGk7CiB9CiAKK2ludCBmZl9nZXRfY2hvbXBfbGluZShBVklPQ29udGV4dCAqcywgY2hhciAqYnVmLCBpbnQgbWF4bGVuKQoreworICAgIGludCBsZW4gPSBmZl9nZXRfbGluZShzLCBidWYsIG1heGxlbik7CisgICAgd2hpbGUgKGxlbiA+IDAgJiYgYXZfaXNzcGFjZShidWZbbGVuIC0gMV0pKQorICAgICAgICBidWZbLS1sZW5dID0gJ1wwJzsKKyAgICByZXR1cm4gbGVuOworfQorCitpbnQ2NF90IGZmX3JlYWRfbGluZV90b19icHJpbnQoQVZJT0NvbnRleHQgKnMsIEFWQlByaW50ICpicCkKK3sKKyAgICBpbnQgbGVuLCBlbmQ7CisgICAgaW50NjRfdCByZWFkID0gMDsKKyAgICBjaGFyIHRtcFsxMDI0XTsKKyAgICBjaGFyIGM7CisKKyAgICBkbyB7CisgICAgICAgIGxlbiA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGMgPSBhdmlvX3I4KHMpOworICAgICAgICAgICAgZW5kID0gKGMgPT0gJ1xyJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXDAnKTsKKyAgICAgICAgICAgIGlmICghZW5kKQorICAgICAgICAgICAgICAgIHRtcFtsZW4rK10gPSBjOworICAgICAgICB9IHdoaWxlICghZW5kICYmIGxlbiA8IHNpemVvZih0bXApKTsKKyAgICAgICAgYXZfYnByaW50X2FwcGVuZF9kYXRhKGJwLCB0bXAsIGxlbik7CisgICAgICAgIHJlYWQgKz0gbGVuOworICAgIH0gd2hpbGUgKCFlbmQpOworCisgICAgaWYgKGMgPT0gJ1xyJyAmJiBhdmlvX3I4KHMpICE9ICdcbicgJiYgIWF2aW9fZmVvZihzKSkKKyAgICAgICAgYXZpb19za2lwKHMsIC0xKTsKKworICAgIGlmICghYyAmJiBzLT5lcnJvcikKKyAgICAgICAgcmV0dXJuIHMtPmVycm9yOworCisgICAgaWYgKCFjICYmICFyZWFkICYmIGF2aW9fZmVvZihzKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgcmV0dXJuIHJlYWQ7Cit9CisKK2ludDY0X3QgZmZfcmVhZF9saW5lX3RvX2JwcmludF9vdmVyd3JpdGUoQVZJT0NvbnRleHQgKnMsIEFWQlByaW50ICpicCkKK3sKKyAgICBpbnQ2NF90IHJldDsKKworICAgIGF2X2JwcmludF9jbGVhcihicCk7CisgICAgcmV0ID0gZmZfcmVhZF9saW5lX3RvX2JwcmludChzLCBicCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZShicCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXR1cm4gYnAtPmxlbjsKK30KKwogaW50IGF2aW9fZ2V0X3N0cihBVklPQ29udGV4dCAqcywgaW50IG1heGxlbiwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQogewogICAgIGludCBpOwpAQCAtNzgxLDkgKzkzOCw1MCBAQAogICAgIHJldHVybiB2YWw7CiB9CiAKK3N0YXRpYyBpbnQgaW9fcmVhZF9wYWNrZXQodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBBVklPSW50ZXJuYWwgKmludGVybmFsID0gb3BhcXVlOworICAgIHJldHVybiBmZnVybF9yZWFkKGludGVybmFsLT5oLCBidWYsIGJ1Zl9zaXplKTsKK30KKworc3RhdGljIGludCBpb193cml0ZV9wYWNrZXQodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBBVklPSW50ZXJuYWwgKmludGVybmFsID0gb3BhcXVlOworICAgIHJldHVybiBmZnVybF93cml0ZShpbnRlcm5hbC0+aCwgYnVmLCBidWZfc2l6ZSk7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGlvX3NlZWsodm9pZCAqb3BhcXVlLCBpbnQ2NF90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgICBBVklPSW50ZXJuYWwgKmludGVybmFsID0gb3BhcXVlOworICAgIHJldHVybiBmZnVybF9zZWVrKGludGVybmFsLT5oLCBvZmZzZXQsIHdoZW5jZSk7Cit9CisKK3N0YXRpYyBpbnQgaW9fc2hvcnRfc2Vlayh2b2lkICpvcGFxdWUpCit7CisgICAgQVZJT0ludGVybmFsICppbnRlcm5hbCA9IG9wYXF1ZTsKKyAgICByZXR1cm4gZmZ1cmxfZ2V0X3Nob3J0X3NlZWsoaW50ZXJuYWwtPmgpOworfQorCitzdGF0aWMgaW50IGlvX3JlYWRfcGF1c2Uodm9pZCAqb3BhcXVlLCBpbnQgcGF1c2UpCit7CisgICAgQVZJT0ludGVybmFsICppbnRlcm5hbCA9IG9wYXF1ZTsKKyAgICBpZiAoIWludGVybmFsLT5oLT5wcm90LT51cmxfcmVhZF9wYXVzZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICByZXR1cm4gaW50ZXJuYWwtPmgtPnByb3QtPnVybF9yZWFkX3BhdXNlKGludGVybmFsLT5oLCBwYXVzZSk7Cit9CisKK3N0YXRpYyBpbnQ2NF90IGlvX3JlYWRfc2Vlayh2b2lkICpvcGFxdWUsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCit7CisgICAgQVZJT0ludGVybmFsICppbnRlcm5hbCA9IG9wYXF1ZTsKKyAgICBpZiAoIWludGVybmFsLT5oLT5wcm90LT51cmxfcmVhZF9zZWVrKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIHJldHVybiBpbnRlcm5hbC0+aC0+cHJvdC0+dXJsX3JlYWRfc2VlayhpbnRlcm5hbC0+aCwgc3RyZWFtX2luZGV4LCB0aW1lc3RhbXAsIGZsYWdzKTsKK30KKwogaW50IGZmaW9fZmRvcGVuKEFWSU9Db250ZXh0ICoqcywgVVJMQ29udGV4dCAqaCkKIHsKLSAgICB1aW50OF90ICpidWZmZXI7CisgICAgQVZJT0ludGVybmFsICppbnRlcm5hbCA9IE5VTEw7CisgICAgdWludDhfdCAqYnVmZmVyID0gTlVMTDsKICAgICBpbnQgYnVmZmVyX3NpemUsIG1heF9wYWNrZXRfc2l6ZTsKIAogICAgIG1heF9wYWNrZXRfc2l6ZSA9IGgtPm1heF9wYWNrZXRfc2l6ZTsKQEAgLTc5NiwyOCArOTk0LDU5IEBACiAgICAgaWYgKCFidWZmZXIpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICAqcyA9IGF2aW9fYWxsb2NfY29udGV4dChidWZmZXIsIGJ1ZmZlcl9zaXplLCBoLT5mbGFncyAmIEFWSU9fRkxBR19XUklURSwgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ICgqKSh2b2lkICosIHVpbnQ4X3QgKiwgaW50KSkgZmZ1cmxfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ICgqKSh2b2lkICosIHVpbnQ4X3QgKiwgaW50KSkgZmZ1cmxfd3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QgKCopKHZvaWQgKiwgaW50NjRfdCwgaW50KSkgZmZ1cmxfc2Vlayk7Ci0gICAgaWYgKCEqcykgewotICAgICAgICBhdl9mcmVlKGJ1ZmZlcik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQorICAgIGludGVybmFsID0gYXZfbWFsbG9jeihzaXplb2YoKmludGVybmFsKSk7CisgICAgaWYgKCFpbnRlcm5hbCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaW50ZXJuYWwtPmggPSBoOworCisgICAgKnMgPSBhdmlvX2FsbG9jX2NvbnRleHQoYnVmZmVyLCBidWZmZXJfc2l6ZSwgaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwsIGlvX3JlYWRfcGFja2V0LCBpb193cml0ZV9wYWNrZXQsIGlvX3NlZWspOworICAgIGlmICghKnMpCisgICAgICAgIGdvdG8gZmFpbDsKKwogICAgICgqcyktPnByb3RvY29sX3doaXRlbGlzdCA9IGF2X3N0cmR1cChoLT5wcm90b2NvbF93aGl0ZWxpc3QpOwogICAgIGlmICghKCpzKS0+cHJvdG9jb2xfd2hpdGVsaXN0ICYmIGgtPnByb3RvY29sX3doaXRlbGlzdCkgewogICAgICAgICBhdmlvX2Nsb3NlcChzKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICAoKnMpLT5wcm90b2NvbF9ibGFja2xpc3QgPSBhdl9zdHJkdXAoaC0+cHJvdG9jb2xfYmxhY2tsaXN0KTsKKyAgICBpZiAoISgqcyktPnByb3RvY29sX2JsYWNrbGlzdCAmJiBoLT5wcm90b2NvbF9ibGFja2xpc3QpIHsKKyAgICAgICAgYXZpb19jbG9zZXAocyk7CisgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAgICAgKCpzKS0+ZGlyZWN0ID0gaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfRElSRUNUOworCiAgICAgKCpzKS0+c2Vla2FibGUgPSBoLT5pc19zdHJlYW1lZCA/IDAgOiBBVklPX1NFRUtBQkxFX05PUk1BTDsKICAgICAoKnMpLT5tYXhfcGFja2V0X3NpemUgPSBtYXhfcGFja2V0X3NpemU7CisgICAgKCpzKS0+bWluX3BhY2tldF9zaXplID0gaC0+bWluX3BhY2tldF9zaXplOwogICAgIGlmKGgtPnByb3QpIHsKLSAgICAgICAgKCpzKS0+cmVhZF9wYXVzZSA9IChpbnQgKCopKHZvaWQgKiwgaW50KSloLT5wcm90LT51cmxfcmVhZF9wYXVzZTsKLSAgICAgICAgKCpzKS0+cmVhZF9zZWVrICA9IChpbnQ2NF90ICgqKSh2b2lkICosIGludCwgaW50NjRfdCwgaW50KSloLT5wcm90LT51cmxfcmVhZF9zZWVrOworICAgICAgICAoKnMpLT5yZWFkX3BhdXNlID0gaW9fcmVhZF9wYXVzZTsKKyAgICAgICAgKCpzKS0+cmVhZF9zZWVrICA9IGlvX3JlYWRfc2VlazsKKworICAgICAgICBpZiAoaC0+cHJvdC0+dXJsX3JlYWRfc2VlaykKKyAgICAgICAgICAgICgqcyktPnNlZWthYmxlIHw9IEFWSU9fU0VFS0FCTEVfVElNRTsKICAgICB9CisgICAgKCpzKS0+c2hvcnRfc2Vla19nZXQgPSBpb19zaG9ydF9zZWVrOwogICAgICgqcyktPmF2X2NsYXNzID0gJmZmX2F2aW9fY2xhc3M7CiAgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2ZyZWVwKCZpbnRlcm5hbCk7CisgICAgYXZfZnJlZXAoJmJ1ZmZlcik7CisgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKK30KKworVVJMQ29udGV4dCogZmZpb19nZXR1cmxjb250ZXh0KEFWSU9Db250ZXh0ICpzKQoreworICAgIEFWSU9JbnRlcm5hbCAqaW50ZXJuYWw7CisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGludGVybmFsID0gcy0+b3BhcXVlOworICAgIGlmIChpbnRlcm5hbCAmJiBzLT5yZWFkX3BhY2tldCA9PSBpb19yZWFkX3BhY2tldCkKKyAgICAgICAgcmV0dXJuIGludGVybmFsLT5oOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiAKIGludCBmZmlvX2Vuc3VyZV9zZWVrYmFjayhBVklPQ29udGV4dCAqcywgaW50NjRfdCBidWZfc2l6ZSkKQEAgLTg2MCw3ICsxMDg5LDcgQEAKICAgICBzLT5idWZmZXIgPSBidWZmZXI7CiAgICAgcy0+b3JpZ19idWZmZXJfc2l6ZSA9CiAgICAgcy0+YnVmZmVyX3NpemUgPSBidWZfc2l6ZTsKLSAgICBzLT5idWZfcHRyID0gYnVmZmVyOworICAgIHMtPmJ1Zl9wdHIgPSBzLT5idWZfcHRyX21heCA9IGJ1ZmZlcjsKICAgICB1cmxfcmVzZXRidWYocywgcy0+d3JpdGVfZmxhZyA/IEFWSU9fRkxBR19XUklURSA6IEFWSU9fRkxBR19SRUFEKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTkxOCw3ICsxMTQ3LDYgQEAKICAgICBzLT5wb3MgPSBidWZfc2l6ZTsKICAgICBzLT5idWZfZW5kID0gcy0+YnVmX3B0ciArIGJ1Zl9zaXplOwogICAgIHMtPmVvZl9yZWFjaGVkID0gMDsKLSAgICBzLT5tdXN0X2ZsdXNoID0gMDsKIAogICAgIHJldHVybiAwOwogfQpAQCAtOTMwLDEzICsxMTU4LDEzIEBACiAKIGludCBmZmlvX29wZW5fd2hpdGVsaXN0KEFWSU9Db250ZXh0ICoqcywgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVklPSW50ZXJydXB0Q0IgKmludF9jYiwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aGl0ZWxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aGl0ZWxpc3QsIGNvbnN0IGNoYXIgKmJsYWNrbGlzdAogICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICAgIFVSTENvbnRleHQgKmg7CiAgICAgaW50IGVycjsKIAotICAgIGVyciA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZoLCBmaWxlbmFtZSwgZmxhZ3MsIGludF9jYiwgb3B0aW9ucywgd2hpdGVsaXN0KTsKKyAgICBlcnIgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmaCwgZmlsZW5hbWUsIGZsYWdzLCBpbnRfY2IsIG9wdGlvbnMsIHdoaXRlbGlzdCwgYmxhY2tsaXN0LCBOVUxMKTsKICAgICBpZiAoZXJyIDwgMCkKICAgICAgICAgcmV0dXJuIGVycjsKICAgICBlcnIgPSBmZmlvX2Zkb3BlbihzLCBoKTsKQEAgLTk1MCwzMSArMTE3OCwzNyBAQAogaW50IGF2aW9fb3BlbjIoQVZJT0NvbnRleHQgKipzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgY29uc3QgQVZJT0ludGVycnVwdENCICppbnRfY2IsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCiB7Ci0gICAgcmV0dXJuIGZmaW9fb3Blbl93aGl0ZWxpc3QocywgZmlsZW5hbWUsIGZsYWdzLCBpbnRfY2IsIG9wdGlvbnMsIE5VTEwpOworICAgIHJldHVybiBmZmlvX29wZW5fd2hpdGVsaXN0KHMsIGZpbGVuYW1lLCBmbGFncywgaW50X2NiLCBvcHRpb25zLCBOVUxMLCBOVUxMKTsKIH0KIAogaW50IGZmaW9fb3BlbjJfd3JhcHBlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqKnBiLCBjb25zdCBjaGFyICp1cmwsIGludCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZJT0ludGVycnVwdENCICppbnRfY2IsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCiB7Ci0gICAgcmV0dXJuIGZmaW9fb3Blbl93aGl0ZWxpc3QocGIsIHVybCwgZmxhZ3MsIGludF9jYiwgb3B0aW9ucywgcy0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICByZXR1cm4gZmZpb19vcGVuX3doaXRlbGlzdChwYiwgdXJsLCBmbGFncywgaW50X2NiLCBvcHRpb25zLCBzLT5wcm90b2NvbF93aGl0ZWxpc3QsIHMtPnByb3RvY29sX2JsYWNrbGlzdCk7CiB9CiAKIGludCBhdmlvX2Nsb3NlKEFWSU9Db250ZXh0ICpzKQogeworICAgIEFWSU9JbnRlcm5hbCAqaW50ZXJuYWw7CiAgICAgVVJMQ29udGV4dCAqaDsKIAogICAgIGlmICghcykKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBhdmlvX2ZsdXNoKHMpOwotICAgIGggPSBzLT5vcGFxdWU7CisgICAgaW50ZXJuYWwgPSBzLT5vcGFxdWU7CisgICAgaCAgICAgICAgPSBpbnRlcm5hbC0+aDsKKworICAgIGF2X2ZyZWVwKCZzLT5vcGFxdWUpOwogICAgIGF2X2ZyZWVwKCZzLT5idWZmZXIpOwogICAgIGlmIChzLT53cml0ZV9mbGFnKQogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiU3RhdGlzdGljczogJWQgc2Vla3MsICVkIHdyaXRlb3V0c1xuIiwgcy0+c2Vla19jb3VudCwgcy0+d3JpdGVvdXRfY291bnQpOwogICAgIGVsc2UKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIlN0YXRpc3RpY3M6ICUiUFJJZDY0IiBieXRlcyByZWFkLCAlZCBzZWVrc1xuIiwgcy0+Ynl0ZXNfcmVhZCwgcy0+c2Vla19jb3VudCk7CiAgICAgYXZfb3B0X2ZyZWUocyk7Ci0gICAgYXZfZnJlZShzKTsKKworICAgIGF2aW9fY29udGV4dF9mcmVlKCZzKTsKKwogICAgIHJldHVybiBmZnVybF9jbG9zZShoKTsKIH0KIApAQCAtMTAwOCwxNSArMTI0MiwxNCBAQAogaW50NjRfdCBhdmlvX3NlZWtfdGltZShBVklPQ29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKIHsKLSAgICBVUkxDb250ZXh0ICpoID0gcy0+b3BhcXVlOwogICAgIGludDY0X3QgcmV0OwogICAgIGlmICghcy0+cmVhZF9zZWVrKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwotICAgIHJldCA9IHMtPnJlYWRfc2VlayhoLCBzdHJlYW1faW5kZXgsIHRpbWVzdGFtcCwgZmxhZ3MpOworICAgIHJldCA9IHMtPnJlYWRfc2VlayhzLT5vcGFxdWUsIHN0cmVhbV9pbmRleCwgdGltZXN0YW1wLCBmbGFncyk7CiAgICAgaWYgKHJldCA+PSAwKSB7CiAgICAgICAgIGludDY0X3QgcG9zOwogICAgICAgICBzLT5idWZfcHRyID0gcy0+YnVmX2VuZDsgLy8gRmx1c2ggYnVmZmVyCi0gICAgICAgIHBvcyA9IHMtPnNlZWsoaCwgMCwgU0VFS19DVVIpOworICAgICAgICBwb3MgPSBzLT5zZWVrKHMtPm9wYXF1ZSwgMCwgU0VFS19DVVIpOwogICAgICAgICBpZiAocG9zID49IDApCiAgICAgICAgICAgICBzLT5wb3MgPSBwb3M7CiAgICAgICAgIGVsc2UgaWYgKHBvcyAhPSBBVkVSUk9SKEVOT1NZUykpCkBAIC0xMDQ2LDcgKzEyNzksOCBAQAogaW50IGF2aW9fYWNjZXB0KEFWSU9Db250ZXh0ICpzLCBBVklPQ29udGV4dCAqKmMpCiB7CiAgICAgaW50IHJldDsKLSAgICBVUkxDb250ZXh0ICpzYyA9IHMtPm9wYXF1ZTsKKyAgICBBVklPSW50ZXJuYWwgKmludGVybmFsID0gcy0+b3BhcXVlOworICAgIFVSTENvbnRleHQgKnNjID0gaW50ZXJuYWwtPmg7CiAgICAgVVJMQ29udGV4dCAqY2MgPSBOVUxMOwogICAgIHJldCA9IGZmdXJsX2FjY2VwdChzYywgJmNjKTsKICAgICBpZiAocmV0IDwgMCkKQEAgLTEwNTYsNyArMTI5MCw4IEBACiAKIGludCBhdmlvX2hhbmRzaGFrZShBVklPQ29udGV4dCAqYykKIHsKLSAgICBVUkxDb250ZXh0ICpjYyA9IGMtPm9wYXF1ZTsKKyAgICBBVklPSW50ZXJuYWwgKmludGVybmFsID0gYy0+b3BhcXVlOworICAgIFVSTENvbnRleHQgKmNjID0gaW50ZXJuYWwtPmg7CiAgICAgcmV0dXJuIGZmdXJsX2hhbmRzaGFrZShjYyk7CiB9CiAKQEAgLTExNjUsNiArMTQwMCwyMyBAQAogICAgIHJldHVybiB1cmxfb3Blbl9keW5fYnVmX2ludGVybmFsKHMsIG1heF9wYWNrZXRfc2l6ZSk7CiB9CiAKK2ludCBhdmlvX2dldF9keW5fYnVmKEFWSU9Db250ZXh0ICpzLCB1aW50OF90ICoqcGJ1ZmZlcikKK3sKKyAgICBEeW5CdWZmZXIgKmQ7CisKKyAgICBpZiAoIXMpIHsKKyAgICAgICAgKnBidWZmZXIgPSBOVUxMOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBhdmlvX2ZsdXNoKHMpOworCisgICAgZCA9IHMtPm9wYXF1ZTsKKyAgICAqcGJ1ZmZlciA9IGQtPmJ1ZmZlcjsKKworICAgIHJldHVybiBkLT5zaXplOworfQorCiBpbnQgYXZpb19jbG9zZV9keW5fYnVmKEFWSU9Db250ZXh0ICpzLCB1aW50OF90ICoqcGJ1ZmZlcikKIHsKICAgICBEeW5CdWZmZXIgKmQ7CkBAIC0xMTg5LDcgKzE0NDEsOSBAQAogICAgICpwYnVmZmVyID0gZC0+YnVmZmVyOwogICAgIHNpemUgPSBkLT5zaXplOwogICAgIGF2X2ZyZWUoZCk7Ci0gICAgYXZfZnJlZShzKTsKKworICAgIGF2aW9fY29udGV4dF9mcmVlKCZzKTsKKwogICAgIHJldHVybiBzaXplIC0gcGFkZGluZzsKIH0KIApAQCAtMTIzMiw2ICsxNDg2LDggQEAKIAogICAgIHNpemUgPSBkLT5zaXplOwogICAgIGF2X2ZyZWUoZCk7Ci0gICAgYXZfZnJlZShzKTsKKworICAgIGF2aW9fY29udGV4dF9mcmVlKCZzKTsKKwogICAgIHJldHVybiBzaXplOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYXZpc3ludGguYyBiL2xpYmF2Zm9ybWF0L2F2aXN5bnRoLmMKaW5kZXggNDU2NDFjMC4uMjUwYTQ4OSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXZpc3ludGguYworKysgYi9saWJhdmZvcm1hdC9hdmlzeW50aC5jCkBAIC0xLDggKzEsOSBAQAogLyoKICAqIEF2aVN5bnRoL0F2eFN5bnRoIHN1cHBvcnQKLSAqIENvcHlyaWdodCAoYykgMjAxMiBBdnhTeW50aCBUZWFtLgorICogQ29weXJpZ2h0IChjKSAyMDEyIEF2eFN5bnRoIFRlYW0KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcKKyAqCiAgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKQEAgLTE4LDggKzE5LDExIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisKICNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCisKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiY29uZmlnLmgiCkBAIC0yOSw3ICszMyw3IEBACiAKIC8qIFBsYXRmb3JtLXNwZWNpZmljIGRpcmVjdGl2ZXMgZm9yIEF2aVN5bnRoIHZzIEF2eFN5bnRoLiAqLwogI2lmZGVmIF9XSU4zMgotICAjaW5jbHVkZSA8d2luZG93cy5oPgorICAjaW5jbHVkZSAiY29tcGF0L3czMmRsZmNuLmgiCiAgICN1bmRlZiBFWFRFUk5fQwogICAjaW5jbHVkZSAiY29tcGF0L2F2aXN5bnRoL2F2aXN5bnRoX2MuaCIKICAgI2RlZmluZSBBVklTWU5USF9MSUIgImF2aXN5bnRoIgpAQCAtMzksMTAgKzQzLDYgQEAKICAgI2luY2x1ZGUgImNvbXBhdC9hdmlzeW50aC9hdnhzeW50aF9jLmgiCiAgICNkZWZpbmUgQVZJU1lOVEhfTkFNRSAibGliYXZ4c3ludGgiCiAgICNkZWZpbmUgQVZJU1lOVEhfTElCIEFWSVNZTlRIX05BTUUgU0xJQlNVRgotCi0gICNkZWZpbmUgTG9hZExpYnJhcnkoeCkgZGxvcGVuKHgsIFJUTERfTk9XIHwgUlRMRF9MT0NBTCkKLSAgI2RlZmluZSBHZXRQcm9jQWRkcmVzcyBkbHN5bQotICAjZGVmaW5lIEZyZWVMaWJyYXJ5IGRsY2xvc2UKICNlbmRpZgogCiB0eXBlZGVmIHN0cnVjdCBBdmlTeW50aExpYnJhcnkgewpAQCAtNjgsMTAgKzY4LDggQEAKICAgICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfZ2V0X3BpdGNoX3ApOwogICAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19nZXRfcmVhZF9wdHJfcCk7CiAgICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2dldF9yb3dfc2l6ZV9wKTsKLSAgICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfeXYyNCk7Ci0gICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX3l2MTYpOwotICAgIEFWU0NfREVDTEFSRV9GVU5DKGF2c19pc195djQxMSk7Ci0gICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX3k4KTsKKyAgICBBVlNDX0RFQ0xBUkVfRlVOQyhhdnNfaXNfcGxhbmFyX3JnYik7CisgICAgQVZTQ19ERUNMQVJFX0ZVTkMoYXZzX2lzX3BsYW5hcl9yZ2JhKTsKICNlbmRpZgogI3VuZGVmIEFWU0NfREVDTEFSRV9GVU5DCiB9IEF2aVN5bnRoTGlicmFyeTsKQEAgLTk5LDYgKzk3LDE0IEBACiBzdGF0aWMgY29uc3QgaW50IGF2c19wbGFuZXNfZ3JleVsxXSAgID0geyBBVlNfUExBTkFSX1kgfTsKIHN0YXRpYyBjb25zdCBpbnQgYXZzX3BsYW5lc195dXZbM10gICAgPSB7IEFWU19QTEFOQVJfWSwgQVZTX1BMQU5BUl9VLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTX1BMQU5BUl9WIH07CisjaWZkZWYgVVNJTkdfQVZJU1lOVEgKK3N0YXRpYyBjb25zdCBpbnQgYXZzX3BsYW5lc19yZ2JbM10gICAgPSB7IEFWU19QTEFOQVJfRywgQVZTX1BMQU5BUl9CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTX1BMQU5BUl9SIH07CitzdGF0aWMgY29uc3QgaW50IGF2c19wbGFuZXNfeXV2YVs0XSAgID0geyBBVlNfUExBTkFSX1ksIEFWU19QTEFOQVJfVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU19QTEFOQVJfViwgQVZTX1BMQU5BUl9BIH07CitzdGF0aWMgY29uc3QgaW50IGF2c19wbGFuZXNfcmdiYVs0XSAgID0geyBBVlNfUExBTkFSX0csIEFWU19QTEFOQVJfQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU19QTEFOQVJfUiwgQVZTX1BMQU5BUl9BIH07CisjZW5kaWYKIAogLyogQSBjb25mbGljdCBiZXR3ZWVuIEMrKyBnbG9iYWwgb2JqZWN0cywgYXRleGl0LCBhbmQgZHluYW1pYyBsb2FkaW5nIHJlcXVpcmVzCiAgKiB1cyB0byByZWdpc3RlciBvdXIgb3duIGF0ZXhpdCBoYW5kbGVyIHRvIHByZXZlbnQgZG91YmxlIGZyZWVpbmcuICovCkBAIC0xMTIsMTMgKzExOCwxMiBAQAogCiBzdGF0aWMgYXZfY29sZCBpbnQgYXZpc3ludGhfbG9hZF9saWJyYXJ5KHZvaWQpCiB7Ci0gICAgYXZzX2xpYnJhcnkubGlicmFyeSA9IExvYWRMaWJyYXJ5KEFWSVNZTlRIX0xJQik7CisgICAgYXZzX2xpYnJhcnkubGlicmFyeSA9IGRsb3BlbihBVklTWU5USF9MSUIsIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CiAgICAgaWYgKCFhdnNfbGlicmFyeS5saWJyYXJ5KQogICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOwogCiAjZGVmaW5lIExPQURfQVZTX0ZVTkMobmFtZSwgY29udGludWVfb25fZmFpbCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXZzX2xpYnJhcnkubmFtZSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKHZvaWQgKilHZXRQcm9jQWRkcmVzcyhhdnNfbGlicmFyeS5saWJyYXJ5LCAjbmFtZSk7ICAgICAgICBcCisgICAgICAgIGF2c19saWJyYXJ5Lm5hbWUgPSBkbHN5bShhdnNfbGlicmFyeS5saWJyYXJ5LCAjbmFtZSk7ICAgICAgICAgIFwKICAgICAgICAgaWYgKCFjb250aW51ZV9vbl9mYWlsICYmICFhdnNfbGlicmFyeS5uYW1lKSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgZ290byBmYWlsOwogCkBAIC0xNDIsMTAgKzE0Nyw4IEBACiAgICAgTE9BRF9BVlNfRlVOQyhhdnNfZ2V0X3BpdGNoX3AsIDEpOwogICAgIExPQURfQVZTX0ZVTkMoYXZzX2dldF9yZWFkX3B0cl9wLCAxKTsKICAgICBMT0FEX0FWU19GVU5DKGF2c19nZXRfcm93X3NpemVfcCwgMSk7Ci0gICAgTE9BRF9BVlNfRlVOQyhhdnNfaXNfeXYyNCwgMSk7Ci0gICAgTE9BRF9BVlNfRlVOQyhhdnNfaXNfeXYxNiwgMSk7Ci0gICAgTE9BRF9BVlNfRlVOQyhhdnNfaXNfeXY0MTEsIDEpOwotICAgIExPQURfQVZTX0ZVTkMoYXZzX2lzX3k4LCAxKTsKKyAgICBMT0FEX0FWU19GVU5DKGF2c19pc19wbGFuYXJfcmdiLCAxKTsKKyAgICBMT0FEX0FWU19GVU5DKGF2c19pc19wbGFuYXJfcmdiYSwgMSk7CiAjZW5kaWYKICN1bmRlZiBMT0FEX0FWU19GVU5DCiAKQEAgLTE1Myw3ICsxNTYsNyBAQAogICAgIHJldHVybiAwOwogCiBmYWlsOgotICAgIEZyZWVMaWJyYXJ5KGF2c19saWJyYXJ5LmxpYnJhcnkpOworICAgIGRsY2xvc2UoYXZzX2xpYnJhcnkubGlicmFyeSk7CiAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKIH0KIApAQCAtMjIxLDcgKzIyNCw3IEBACiAgICAgICAgIGF2aXN5bnRoX2NvbnRleHRfZGVzdHJveShhdnMpOwogICAgICAgICBhdnMgPSBuZXh0OwogICAgIH0KLSAgICBGcmVlTGlicmFyeShhdnNfbGlicmFyeS5saWJyYXJ5KTsKKyAgICBkbGNsb3NlKGF2c19saWJyYXJ5LmxpYnJhcnkpOwogCiAgICAgYXZzX2F0ZXhpdF9jYWxsZWQgPSAxOwogfQpAQCAtMjMwLDEyICsyMzMsMTIgQEAKIHN0YXRpYyBpbnQgYXZpc3ludGhfY3JlYXRlX3N0cmVhbV92aWRlbyhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKIHsKICAgICBBdmlTeW50aENvbnRleHQgKmF2cyA9IHMtPnByaXZfZGF0YTsKLSAgICBpbnQgcGxhbmFyID0gMDsgLy8gMDogcGFja2VkLCAxOiBZVVYsIDI6IFk4CisgICAgaW50IHBsYW5hciA9IDA7IC8vIDA6IHBhY2tlZCwgMTogWVVWLCAyOiBZOCwgMzogUGxhbmFyIFJHQiwgNDogWVVWQSwgNTogUGxhbmFyIFJHQkEKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKLSAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdnMtPnZpLT53aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBhdnMtPnZpLT5oZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IGF2cy0+dmktPndpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IGF2cy0+dmktPmhlaWdodDsKIAogICAgIHN0LT5hdmdfZnJhbWVfcmF0ZSAgICA9IChBVlJhdGlvbmFsKSB7IGF2cy0+dmktPmZwc19udW1lcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZzLT52aS0+ZnBzX2Rlbm9taW5hdG9yIH07CkBAIC0yNDYsMzkgKzI0OSwxNzcgQEAKIAogICAgIHN3aXRjaCAoYXZzLT52aS0+cGl4ZWxfdHlwZSkgewogI2lmZGVmIFVTSU5HX0FWSVNZTlRICisgICAgLyogMTB+MTYtYml0IFlVViBwaXhfZm10cyAoQXZpU3ludGgrKSAqLworICAgIGNhc2UgQVZTX0NTX1lVVjQ0NFAxMDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMDsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19ZVVY0MjJQMTA6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWNDIwUDEwOgorICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEwOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1lVVjQ0NFAxMjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxMjsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19ZVVY0MjJQMTI6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTI7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWNDIwUDEyOgorICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDEyOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1lVVjQ0NFAxNDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxNDsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19ZVVY0MjJQMTQ6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTQ7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWNDIwUDE0OgorICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDE0OworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1lVVjQ0NFAxNjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFAxNjsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19ZVVY0MjJQMTY6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjJQMTY7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWNDIwUDE2OgorICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDE2OworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDE7CisgICAgICAgIGJyZWFrOworICAgIC8qIDh+MTYtYml0IFlVViBwaXhfZm10cyB3aXRoIEFscGhhIChBdmlTeW50aCspICovCisgICAgY2FzZSBBVlNfQ1NfWVVWQTQ0NDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0NDRQOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1lVVkE0MjI6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVZBNDIyUDsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19ZVVZBNDIwOgorICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWQTQyMFA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWQTQ0NFAxMDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0NDRQMTA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWQTQyMlAxMDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQMTA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWQTQyMFAxMDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0MjBQMTA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWQTQ0NFAxNjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0NDRQMTY7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWQTQyMlAxNjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0MjJQMTY7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfWVVWQTQyMFAxNjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVkE0MjBQMTY7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgLyogUGxhbmFyIFJHQiBwaXhfZm10cyAoQXZpU3ludGgrKSAqLworICAgIGNhc2UgQVZTX0NTX1JHQlA6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9HQlJQOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1JHQlAxMDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0dCUlAxMDsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSAzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWU19DU19SR0JQMTI6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9HQlJQMTI7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVlNfQ1NfUkdCUDE0OgorICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfR0JSUDE0OworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1JHQlAxNjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0dCUlAxNjsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSAzOworICAgICAgICBicmVhazsKKyAgICAvKiBQbGFuYXIgUkdCIHBpeF9mbXRzIHdpdGggQWxwaGEgKEF2aVN5bnRoKykgKi8KKyAgICBjYXNlIEFWU19DU19SR0JBUDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0dCUkFQOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1JHQkFQMTA6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9HQlJBUDEwOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1JHQkFQMTI6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9HQlJBUDEyOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX1JHQkFQMTY6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9HQlJBUDE2OworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDU7CisgICAgICAgIGJyZWFrOworICAgIC8qIEdSQVkxNiAoQXZpU3ludGgrKSAqLworICAgIGNhc2UgQVZTX0NTX1kxNjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0dSQVkxNjsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSAyOworICAgICAgICBicmVhazsKKyAgICAvKiBwaXhfZm10cyBhZGRlZCBpbiBBdmlTeW50aCAyLjYgKi8KICAgICBjYXNlIEFWU19DU19ZVjI0OgotICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7Ci0gICAgICAgIHBsYW5hciAgICAgICAgICAgICA9IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0NDRQOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZTX0NTX1lWMTY6Ci0gICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKLSAgICAgICAgcGxhbmFyICAgICAgICAgICAgID0gMTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gMTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVlNfQ1NfWVY0MTE6Ci0gICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDExUDsKLSAgICAgICAgcGxhbmFyICAgICAgICAgICAgID0gMTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1lVVjQxMVA7CisgICAgICAgIHBsYW5hciAgICAgICAgICAgICAgID0gMTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVlNfQ1NfWTg6Ci0gICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTg7Ci0gICAgICAgIHBsYW5hciAgICAgICAgICAgICA9IDI7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICAgICAgcGxhbmFyICAgICAgICAgICAgICAgPSAyOworICAgICAgICBicmVhazsKKyAgICAvKiAxNi1iaXQgcGFja2VkIFJHQiBwaXhfZm10cyAoQXZpU3ludGgrKSAqLworICAgIGNhc2UgQVZTX0NTX0JHUjQ4OgorICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfQkdSNDg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTX0NTX0JHUjY0OgorICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfQkdSQTY0OwogICAgICAgICBicmVhazsKICNlbmRpZgorICAgIC8qIEF2aVN5bnRoIDIuNSBhbmQgQXZ4U3ludGggcGl4X2ZtdHMgKi8KICAgICBjYXNlIEFWU19DU19CR1IyNDoKLSAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1IyNDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0JHUjI0OwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWU19DU19CR1IzMjoKLSAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1JHQjMyOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWU19DU19ZVVkyOgotICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVWVY0MjI7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVlWNDIyOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWU19DU19ZVjEyOgotICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7Ci0gICAgICAgIHBsYW5hciAgICAgICAgICAgICA9IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZTX0NTX0k0MjA6IC8vIElzIHRoaXMgZXZlbiB1c2VkIGFueXdoZXJlPwotICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7Ci0gICAgICAgIHBsYW5hciAgICAgICAgICAgICA9IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9ZVVY0MjBQOworICAgICAgICBwbGFuYXIgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCkBAIC0yODgsNiArNDI5LDIwIEBACiAgICAgfQogCiAgICAgc3dpdGNoIChwbGFuYXIpIHsKKyNpZmRlZiBVU0lOR19BVklTWU5USAorICAgIGNhc2UgNTogLy8gUGxhbmFyIFJHQiArIEFscGhhCisgICAgICAgIGF2cy0+bl9wbGFuZXMgPSA0OworICAgICAgICBhdnMtPnBsYW5lcyAgID0gYXZzX3BsYW5lc19yZ2JhOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6IC8vIFlVViArIEFscGhhCisgICAgICAgIGF2cy0+bl9wbGFuZXMgPSA0OworICAgICAgICBhdnMtPnBsYW5lcyAgID0gYXZzX3BsYW5lc195dXZhOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6IC8vIFBsYW5hciBSR0IKKyAgICAgICAgYXZzLT5uX3BsYW5lcyA9IDM7CisgICAgICAgIGF2cy0+cGxhbmVzICAgPSBhdnNfcGxhbmVzX3JnYjsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKICAgICBjYXNlIDI6IC8vIFk4CiAgICAgICAgIGF2cy0+bl9wbGFuZXMgPSAxOwogICAgICAgICBhdnMtPnBsYW5lcyAgID0gYXZzX3BsYW5lc19ncmV5OwpAQCAtMzA3LDI3ICs0NjIsMjcgQEAKIHsKICAgICBBdmlTeW50aENvbnRleHQgKmF2cyA9IHMtPnByaXZfZGF0YTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2cy0+dmktPmF1ZGlvX3NhbXBsZXNfcGVyX3NlY29uZDsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gYXZzLT52aS0+bmNoYW5uZWxzOwotICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICAgPSBhdnMtPnZpLT5udW1fYXVkaW9fc2FtcGxlczsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdnMtPnZpLT5hdWRpb19zYW1wbGVzX3Blcl9zZWNvbmQ7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGF2cy0+dmktPm5jaGFubmVsczsKKyAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgICAgID0gYXZzLT52aS0+bnVtX2F1ZGlvX3NhbXBsZXM7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGF2cy0+dmktPmF1ZGlvX3NhbXBsZXNfcGVyX3NlY29uZCk7CiAKICAgICBzd2l0Y2ggKGF2cy0+dmktPnNhbXBsZV90eXBlKSB7CiAgICAgY2FzZSBBVlNfU0FNUExFX0lOVDg6Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZTX1NBTVBMRV9JTlQxNjoKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVlNfU0FNUExFX0lOVDI0OgotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MyNExFOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MyNExFOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWU19TQU1QTEVfSU5UMzI6Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZTX1NBTVBMRV9GTE9BVDoKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9GMzJMRTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9GMzJMRTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKQEAgLTQ1NSw2ICs2MTAsNyBAQAogICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyY19wOwogICAgIGludCBuLCBpLCBwbGFuZSwgcm93c2l6ZSwgcGxhbmVoZWlnaHQsIHBpdGNoLCBiaXRzOwogICAgIGNvbnN0IGNoYXIgKmVycm9yOworICAgIGludCBhdnNwbHVzIGF2X3VudXNlZDsKIAogICAgIGlmIChhdnMtPmN1cnJfZnJhbWUgPj0gYXZzLT52aS0+bnVtX2ZyYW1lcykKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwpAQCAtNDY1LDIwICs2MjEsMTggQEAKICAgICAgICAgcmV0dXJuIDA7CiAKICNpZmRlZiBVU0lOR19BVklTWU5USAotICAgIC8qIERlZmluZSB0aGUgYnBwIHZhbHVlcyBmb3IgdGhlIG5ldyBBdmlTeW50aCAyLjYgY29sb3JzcGFjZXMuCi0gICAgICogU2luY2UgQXZ4U3ludGggZG9lc24ndCBoYXZlIHRoZXNlIGZ1bmN0aW9ucywgc3BlY2lhbC1jYXNlCi0gICAgICogaXQgaW4gb3JkZXIgdG8gYXZvaWQgaW1wbGljaXQgZGVjbGFyYXRpb24gZXJyb3JzLiAqLwotCi0gICAgaWYgKGF2c19saWJyYXJ5LmF2c19pc195djI0KGF2cy0+dmkpKQotICAgICAgICBiaXRzID0gMjQ7Ci0gICAgZWxzZSBpZiAoYXZzX2xpYnJhcnkuYXZzX2lzX3l2MTYoYXZzLT52aSkpCi0gICAgICAgIGJpdHMgPSAxNjsKLSAgICBlbHNlIGlmIChhdnNfbGlicmFyeS5hdnNfaXNfeXY0MTEoYXZzLT52aSkpCi0gICAgICAgIGJpdHMgPSAxMjsKLSAgICBlbHNlIGlmIChhdnNfbGlicmFyeS5hdnNfaXNfeTgoYXZzLT52aSkpCi0gICAgICAgIGJpdHMgPSA4OworICAgIC8qIERldGVjdCB3aGV0aGVyIHdlJ3JlIHVzaW5nIEF2aVN5bnRoIDIuNiBvciBBdmlTeW50aCsgYnkKKyAgICAgKiBsb29raW5nIGZvciB3aGV0aGVyIGF2c19pc19wbGFuYXJfcmdiIGV4aXN0cy4gKi8KKyAgICBpZiAoR2V0UHJvY0FkZHJlc3MoYXZzX2xpYnJhcnkubGlicmFyeSwgImF2c19pc19wbGFuYXJfcmdiIikgPT0gTlVMTCkKKyAgICAgICAgYXZzcGx1cyA9IDA7CiAgICAgZWxzZQotICAgICAgICBiaXRzID0gYXZzX2xpYnJhcnkuYXZzX2JpdHNfcGVyX3BpeGVsKGF2cy0+dmkpOworICAgICAgICBhdnNwbHVzID0gMTsKKworICAgIC8qIGF2c19iaXRzX3Blcl9waXhlbCBjaGFuZ2VkIHRvIEFWU0NfQVBJIHdpdGggQXZpU3ludGggMi42LCB3aGljaAorICAgICAqIHJlcXVpcmVzIGdvaW5nIHRocm91Z2ggYXZzX2xpYnJhcnksIHdoaWxlIEF2eFN5bnRoIGhhcyBpdCB1bmRlcgorICAgICAqIHRoZSBvbGRlciBBVlNDX0lOTElORSB0eXBlLCBzbyBzcGVjaWFsLWNhc2UgdGhpcy4gKi8KKworICAgIGJpdHMgPSBhdnNfbGlicmFyeS5hdnNfYml0c19wZXJfcGl4ZWwoYXZzLT52aSk7CiAjZWxzZQogICAgIGJpdHMgPSBhdnNfYml0c19wZXJfcGl4ZWwoYXZzLT52aSk7CiAjZW5kaWYKQEAgLTUzMCw2ICs2ODQsMTUgQEAKICAgICAgICAgICAgIHBpdGNoID0gLXBpdGNoOwogICAgICAgICB9CiAKKyNpZmRlZiBVU0lOR19BVklTWU5USAorICAgICAgICAvKiBGbGlwIFBsYW5hciBSR0IgdmlkZW8gKi8KKyAgICAgICAgaWYgKGF2c3BsdXMgJiYgKGF2c19saWJyYXJ5LmF2c19pc19wbGFuYXJfcmdiKGF2cy0+dmkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBhdnNfbGlicmFyeS5hdnNfaXNfcGxhbmFyX3JnYmEoYXZzLT52aSkpKSB7CisgICAgICAgICAgICBzcmNfcCA9IHNyY19wICsgKHBsYW5laGVpZ2h0IC0gMSkgKiBwaXRjaDsKKyAgICAgICAgICAgIHBpdGNoID0gLXBpdGNoOworICAgICAgICB9CisjZW5kaWYKKwogICAgICAgICBhdnNfbGlicmFyeS5hdnNfYml0X2JsdChhdnMtPmVudiwgZHN0X3AsIHJvd3NpemUsIHNyY19wLCBwaXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3NpemUsIHBsYW5laGVpZ2h0KTsKICAgICAgICAgZHN0X3AgKz0gcm93c2l6ZSAqIHBsYW5laGVpZ2h0OwpAQCAtNjExLDE1ICs3NzQsMTUgQEAKICAgICBpbnQgcmV0OwogCiAgICAgLy8gQ2FsbGluZyBsaWJyYXJ5IG11c3QgaW1wbGVtZW50IGEgbG9jayBmb3IgdGhyZWFkLXNhZmUgb3BlbnMuCi0gICAgaWYgKHJldCA9IGF2cHJpdl9sb2NrX2F2Zm9ybWF0KCkpCisgICAgaWYgKHJldCA9IGZmX2xvY2tfYXZmb3JtYXQoKSkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmIChyZXQgPSBhdmlzeW50aF9vcGVuX2ZpbGUocykpIHsKLSAgICAgICAgYXZwcml2X3VubG9ja19hdmZvcm1hdCgpOworICAgICAgICBmZl91bmxvY2tfYXZmb3JtYXQoKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICBhdnByaXZfdW5sb2NrX2F2Zm9ybWF0KCk7CisgICAgZmZfdW5sb2NrX2F2Zm9ybWF0KCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTYzNiw3ICs3OTksNyBAQAogICAgIC8qIElmIGVpdGhlciBzdHJlYW0gcmVhY2hlcyBFT0YsIHRyeSB0byByZWFkIHRoZSBvdGhlciBvbmUgYmVmb3JlCiAgICAgICogZ2l2aW5nIHVwLiAqLwogICAgIGF2aXN5bnRoX25leHRfc3RyZWFtKHMsICZzdCwgcGt0LCAmZGlzY2FyZCk7Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewogICAgICAgICByZXQgPSBhdmlzeW50aF9yZWFkX3BhY2tldF92aWRlbyhzLCBwa3QsIGRpc2NhcmQpOwogICAgICAgICBpZiAocmV0ID09IEFWRVJST1JfRU9GICYmIGF2c19oYXNfYXVkaW8oYXZzLT52aSkpIHsKICAgICAgICAgICAgIGF2aXN5bnRoX25leHRfc3RyZWFtKHMsICZzdCwgcGt0LCAmZGlzY2FyZCk7CkBAIC02NTUsMTEgKzgxOCwxMSBAQAogCiBzdGF0aWMgYXZfY29sZCBpbnQgYXZpc3ludGhfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCiB7Ci0gICAgaWYgKGF2cHJpdl9sb2NrX2F2Zm9ybWF0KCkpCisgICAgaWYgKGZmX2xvY2tfYXZmb3JtYXQoKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKIAogICAgIGF2aXN5bnRoX2NvbnRleHRfZGVzdHJveShzLT5wcml2X2RhdGEpOwotICAgIGF2cHJpdl91bmxvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl91bmxvY2tfYXZmb3JtYXQoKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjc4LDcgKzg0MSw3IEBACiAgICAgc2FtcGxlcmF0ZSA9IChBVlJhdGlvbmFsKSB7IGF2cy0+dmktPmF1ZGlvX3NhbXBsZXNfcGVyX3NlY29uZCwgMSB9OwogCiAgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewogICAgICAgICAvKiBBdmlTeW50aCBmcmFtZSBjb3VudHMgYXJlIHNpZ25lZCBpbnQuICovCiAgICAgICAgIGlmICgodGltZXN0YW1wID49IGF2cy0+dmktPm51bV9mcmFtZXMpIHx8CiAgICAgICAgICAgICAodGltZXN0YW1wID4gSU5UX01BWCkgICAgICAgICAgICAgIHx8CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hdmxhbmd1YWdlLmMgYi9saWJhdmZvcm1hdC9hdmxhbmd1YWdlLmMKaW5kZXggMzlmMjU2MC4uZjVkMmRkZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXZsYW5ndWFnZS5jCisrKyBiL2xpYmF2Zm9ybWF0L2F2bGFuZ3VhZ2UuYwpAQCAtNzMzLDcgKzczMyw3IEBACiAgICAgcmV0dXJuIHN0cmNtcChsaHMsICgoY29uc3QgTGFuZ0VudHJ5ICopcmhzKS0+c3RyKTsKIH0KIAotY29uc3QgY2hhciAqYXZfY29udmVydF9sYW5nX3RvKGNvbnN0IGNoYXIgKmxhbmcsIGVudW0gQVZMYW5nQ29kZXNwYWNlIHRhcmdldF9jb2Rlc3BhY2UpCitjb25zdCBjaGFyICpmZl9jb252ZXJ0X2xhbmdfdG8oY29uc3QgY2hhciAqbGFuZywgZW51bSBBVkxhbmdDb2Rlc3BhY2UgdGFyZ2V0X2NvZGVzcGFjZSkKIHsKICAgICBpbnQgaTsKICAgICBjb25zdCBMYW5nRW50cnkgKmVudHJ5ID0gTlVMTDsKQEAgLTc1OSw3ICs3NTksMTQgQEAKICAgICAgICAgICAgIGVudHJ5ID0gbGFuZ190YWJsZSArIGVudHJ5LT5uZXh0X2VxdWl2YWxlbnQ7CiAKICAgICBpZiAodGFyZ2V0X2NvZGVzcGFjZSA9PSBBVl9MQU5HX0lTTzYzOV8yX1RFUk0pCi0gICAgICAgIHJldHVybiBhdl9jb252ZXJ0X2xhbmdfdG8obGFuZywgQVZfTEFOR19JU082MzlfMl9CSUJMKTsKKyAgICAgICAgcmV0dXJuIGZmX2NvbnZlcnRfbGFuZ190byhsYW5nLCBBVl9MQU5HX0lTTzYzOV8yX0JJQkwpOwogCiAgICAgcmV0dXJuIE5VTEw7CiB9CisKKyNpZiBMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTgKK2NvbnN0IGNoYXIgKmF2X2NvbnZlcnRfbGFuZ190byhjb25zdCBjaGFyICpsYW5nLCBlbnVtIEFWTGFuZ0NvZGVzcGFjZSB0YXJnZXRfY29kZXNwYWNlKQoreworICAgIHJldHVybiBmZl9jb252ZXJ0X2xhbmdfdG8obGFuZywgdGFyZ2V0X2NvZGVzcGFjZSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2F2bGFuZ3VhZ2UuaCBiL2xpYmF2Zm9ybWF0L2F2bGFuZ3VhZ2UuaAppbmRleCA3ZmI4OTY4Li4xZDcyZGNiIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9hdmxhbmd1YWdlLmgKKysrIGIvbGliYXZmb3JtYXQvYXZsYW5ndWFnZS5oCkBAIC0yMSwxMiArMjEsMTUgQEAKICNpZm5kZWYgQVZGT1JNQVRfQVZMQU5HVUFHRV9ICiAjZGVmaW5lIEFWRk9STUFUX0FWTEFOR1VBR0VfSAogCisjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC92ZXJzaW9uLmgiCisKIC8qKgogICogS25vd24gbGFuZ3VhZ2UgY29kZXNwYWNlcwogICovCiBlbnVtIEFWTGFuZ0NvZGVzcGFjZSB7CiAgICAgQVZfTEFOR19JU082MzlfMl9CSUJMLCAvKiogMy1jaGFyIGJpYmxpb2dyYXBoaWMgbGFuZ3VhZ2UgY29kZXMgYXMgcGVyIElTTy1JRUMgNjM5LTIgKi8KLSAgICBBVl9MQU5HX0lTTzYzOV8yX1RFUk0sIC8qKiAzLWNoYXIgdGVybWlub2xvZ2ljIGxhbmd1YWdlIGNvZGVzIGFzIHBlciBJU08tSUVDIDYzOS0yICovCisgICAgQVZfTEFOR19JU082MzlfMl9URVJNLCAvKiogMy1jaGFyIHRlcm1pbm9sb2dpY2FsIGxhbmd1YWdlIGNvZGVzIGFzIHBlciBJU08tSUVDIDYzOS0yICovCiAgICAgQVZfTEFOR19JU082MzlfMSAgICAgICAvKiogMi1jaGFyIGNvZGUgb2YgbGFuZ3VhZ2UgYXMgcGVyIElTTy9JRUMgNjM5LTEgKi8KIH07CiAKQEAgLTM0LDYgKzM3LDEwIEBACiAgKiBDb252ZXJ0IGEgbGFuZ3VhZ2UgY29kZSB0byBhIHRhcmdldCBjb2Rlc3BhY2UuIFRoZSBzb3VyY2UgY29kZXNwYWNlIGlzIGd1ZXNzZWQuCiAgKiBAcmV0dXJuIE5VTEwgaWYgdGhlIHByb3ZpZGVkIGxhbmcgaXMgbnVsbCBvciBpbnZhbGlkLgogICovCitjb25zdCBjaGFyICpmZl9jb252ZXJ0X2xhbmdfdG8oY29uc3QgY2hhciAqbGFuZywgZW51bSBBVkxhbmdDb2Rlc3BhY2UgdGFyZ2V0X2NvZGVzcGFjZSk7CisjaWYgTElCQVZGT1JNQVRfVkVSU0lPTl9NQUpPUiA8IDU4CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogY29uc3QgY2hhciAqYXZfY29udmVydF9sYW5nX3RvKGNvbnN0IGNoYXIgKmxhbmcsIGVudW0gQVZMYW5nQ29kZXNwYWNlIHRhcmdldF9jb2Rlc3BhY2UpOworI2VuZGlmCiAKICNlbmRpZiAvKiBBVkZPUk1BVF9BVkxBTkdVQUdFX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2F2ci5jIGIvbGliYXZmb3JtYXQvYXZyLmMKaW5kZXggYTMzMTM0ZS4uMjk0MTYwZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYXZyLmMKKysrIGIvbGliYXZmb3JtYXQvYXZyLmMKQEAgLTQ2LDIyICs0NiwyMiBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogCiAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsgLy8gbWFnaWMKICAgICBhdmlvX3NraXAocy0+cGIsIDgpOyAvLyBzYW1wbGVfbmFtZQogCiAgICAgY2hhbiA9IGF2aW9fcmIxNihzLT5wYik7CiAgICAgaWYgKCFjaGFuKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKICAgICB9IGVsc2UgaWYgKGNoYW4gPT0gMHhGRkZGdSkgewotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMjsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IDI7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJjaGFuICVkIiwgY2hhbik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJwcyA9IGF2aW9fcmIxNihzLT5wYik7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHMgPSBhdmlvX3JiMTYocy0+cGIpOwogCiAgICAgc2lnbiA9IGF2aW9fcmIxNihzLT5wYik7CiAKQEAgLTY5LDIxICs2OSwyMSBAQAogICAgIGF2aW9fc2tpcChzLT5wYiwgMik7IC8vIG1pZGkKICAgICBhdmlvX3NraXAocy0+cGIsIDEpOyAvLyByZXBsYXkgc3BlZWQKIAotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMjQocy0+cGIpOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMjQocy0+cGIpOwogICAgIGF2aW9fc2tpcChzLT5wYiwgNCAqIDMpOwogICAgIGF2aW9fc2tpcChzLT5wYiwgMiAqIDMpOwogICAgIGF2aW9fc2tpcChzLT5wYiwgMjApOwogICAgIGF2aW9fc2tpcChzLT5wYiwgNjQpOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2dldF9wY21fY29kZWNfaWQoYnBzLCAwLCAxLCBzaWduKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2dldF9wY21fY29kZWNfaWQoYnBzLCAwLCAxLCBzaWduKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CiAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiQnBzICVkIGFuZCBzaWduICVkIiwgYnBzLCBzaWduKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KIAotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBicHMgKiBzdC0+Y29kZWMtPmNoYW5uZWxzIC8gODsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gYnBzICogc3QtPmNvZGVjcGFyLT5jaGFubmVscyAvIDg7CiAKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9hdnMuYyBiL2xpYmF2Zm9ybWF0L2F2cy5jCmluZGV4IGIyNjRiNTUuLjc2M2JhNjMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2F2cy5jCisrKyBiL2xpYmF2Zm9ybWF0L2F2cy5jCkBAIC0xODQsMTEgKzE4NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X3ZpZGVvID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdnMtPnN0X3ZpZGVvKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF92aWRlby0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfdmlkZW8tPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FWUzsKLSAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF92aWRlby0+Y29kZWMtPndpZHRoID0gYXZzLT53aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF92aWRlby0+Y29kZWMtPmhlaWdodCA9IGF2cy0+aGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X3ZpZGVvLT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlPWF2cy0+Yml0c19wZXJfc2FtcGxlOworICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X3ZpZGVvLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF92aWRlby0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQVZTOworICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X3ZpZGVvLT5jb2RlY3Bhci0+d2lkdGggPSBhdnMtPndpZHRoOworICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X3ZpZGVvLT5jb2RlY3Bhci0+aGVpZ2h0ID0gYXZzLT5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfdmlkZW8tPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU9YXZzLT5iaXRzX3Blcl9zYW1wbGU7CiAgICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfdmlkZW8tPm5iX2ZyYW1lcyA9IGF2cy0+bmJfZnJhbWVzOwogI2lmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKICAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF92aWRlby0+cl9mcmFtZV9yYXRlID0KQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICBhdnMtPnN0X2F1ZGlvID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdnMtPnN0X2F1ZGlvKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgICAgICAgICAgYXZzLT5zdF9hdWRpby0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICAgICAgICAgIGF2cy0+c3RfYXVkaW8tPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhdnMtPnJlbWFpbmluZ19hdWRpb19zaXplID0gc2l6ZSAtIDQ7CiAgICAgICAgICAgICAgICAgc2l6ZSA9IGF2c19yZWFkX2F1ZGlvX3BhY2tldChzLCBwa3QpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYmV0aHNvZnR2aWQuYyBiL2xpYmF2Zm9ybWF0L2JldGhzb2Z0dmlkLmMKaW5kZXggNDBhNDI1Mi4uZjUxNjgwNiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYmV0aHNvZnR2aWQuYworKysgYi9saWJhdmZvcm1hdC9iZXRoc29mdHZpZC5jCkBAIC0xMTYsMTMgKzExNiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlbyBwYWNrZXQiKTsKICAgICAgICAgfQogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMTg1LCB2aWQtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9CRVRIU09GVFZJRDsKLSAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gdmlkLT53aWR0aDsKLSAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gdmlkLT5oZWlnaHQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQkVUSFNPRlRWSUQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IHZpZC0+d2lkdGg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IHZpZC0+aGVpZ2h0OwogICAgIH0KICAgICBzdCAgICAgID0gcy0+c3RyZWFtc1t2aWQtPnZpZGVvX2luZGV4XTsKLSAgICBucGl4ZWxzID0gc3QtPmNvZGVjLT53aWR0aCAqIHN0LT5jb2RlYy0+aGVpZ2h0OworICAgIG5waXhlbHMgPSBzdC0+Y29kZWNwYXItPndpZHRoICogc3QtPmNvZGVjcGFyLT5oZWlnaHQ7CiAKICAgICB2aWRidWZfc3RhcnQgPSBhdl9tYWxsb2ModmlkYnVmX2NhcGFjaXR5ID0gQlVGRkVSX1BBRERJTkdfU0laRSk7CiAgICAgaWYoIXZpZGJ1Zl9zdGFydCkKQEAgLTI0NSwxMyArMjQ1LDEzIEBACiAgICAgICAgICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgICAgICB2aWQtPmF1ZGlvX2luZGV4ICAgICAgICAgICAgICAgICA9IHN0LT5pbmRleDsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9VODsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSB2aWQtPnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgICAgICAgID0gOCAqIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICAgICAgICAgPSAxOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgICAgICAgID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gdmlkLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlICAgICAgICAgICAgICA9IDggKiBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgICAgICAgICAgID0gMDsKICAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgdmlkLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9iZmkuYyBiL2xpYmF2Zm9ybWF0L2JmaS5jCmluZGV4IGNjN2Y0OTQuLjZjOThlMzMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2JmaS5jCisrKyBiL2xpYmF2Zm9ybWF0L2JmaS5jCkBAIC03NSwzOCArNzUsNDIgQEAKICAgICBhdmlvX3JsMzIocGIpOwogICAgIGZwcyAgICAgICAgICAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOwogICAgIGF2aW9fc2tpcChwYiwgMTIpOwotICAgIHZzdHJlYW0tPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JsMzIocGIpOwotICAgIHZzdHJlYW0tPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JsMzIocGIpOworICAgIHZzdHJlYW0tPmNvZGVjcGFyLT53aWR0aCAgPSBhdmlvX3JsMzIocGIpOworICAgIHZzdHJlYW0tPmNvZGVjcGFyLT5oZWlnaHQgPSBhdmlvX3JsMzIocGIpOwogCiAgICAgLypMb2FkIHRoZSBwYWxldHRlIHRvIGV4dHJhZGF0YSAqLwogICAgIGF2aW9fc2tpcChwYiwgOCk7Ci0gICAgdnN0cmVhbS0+Y29kZWMtPmV4dHJhZGF0YSAgICAgID0gYXZfbWFsbG9jKDc2OCk7Ci0gICAgaWYgKCF2c3RyZWFtLT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgIHZzdHJlYW0tPmNvZGVjcGFyLT5leHRyYWRhdGEgICAgICA9IGF2X21hbGxvYyg3NjgpOworICAgIGlmICghdnN0cmVhbS0+Y29kZWNwYXItPmV4dHJhZGF0YSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB2c3RyZWFtLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSA3Njg7Ci0gICAgYXZpb19yZWFkKHBiLCB2c3RyZWFtLT5jb2RlYy0+ZXh0cmFkYXRhLAotICAgICAgICAgICAgICAgdnN0cmVhbS0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICB2c3RyZWFtLT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSA3Njg7CisgICAgYXZpb19yZWFkKHBiLCB2c3RyZWFtLT5jb2RlY3Bhci0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgdnN0cmVhbS0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKTsKIAotICAgIGFzdHJlYW0tPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihwYik7CisgICAgYXN0cmVhbS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHBiKTsKKyAgICBpZiAoYXN0cmVhbS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIDw9IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2FtcGxlIHJhdGUgJWRcbiIsIGFzdHJlYW0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KIAogICAgIC8qIFNldCB1cCB0aGUgdmlkZW8gY29kZWMuLi4gKi8KICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdHJlYW0sIDMyLCAxLCBmcHMpOwotICAgIHZzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdHJlYW0tPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQkZJOwotICAgIHZzdHJlYW0tPmNvZGVjLT5waXhfZm10ICAgID0gQVZfUElYX0ZNVF9QQUw4OwotICAgIHZzdHJlYW0tPm5iX2ZyYW1lcyAgICAgICAgID0KLSAgICB2c3RyZWFtLT5kdXJhdGlvbiAgICAgICAgICA9IGJmaS0+bmZyYW1lczsKKyAgICB2c3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0JGSTsKKyAgICB2c3RyZWFtLT5jb2RlY3Bhci0+Zm9ybWF0ICAgICA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICB2c3RyZWFtLT5uYl9mcmFtZXMgICAgICAgICAgICA9CisgICAgdnN0cmVhbS0+ZHVyYXRpb24gICAgICAgICAgICAgPSBiZmktPm5mcmFtZXM7CiAKICAgICAvKiBTZXQgdXAgdGhlIGF1ZGlvIGNvZGVjIG5vdy4uLiAqLwotICAgIGFzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgYXN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9VODsKLSAgICBhc3RyZWFtLT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgID0gMTsKLSAgICBhc3RyZWFtLT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgYXN0cmVhbS0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7Ci0gICAgYXN0cmVhbS0+Y29kZWMtPmJpdF9yYXRlICAgICAgICA9Ci0gICAgICAgIGFzdHJlYW0tPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIGFzdHJlYW0tPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgYXN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgIGFzdHJlYW0tPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICAgPSAxOworICAgIGFzdHJlYW0tPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCAgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBhc3RyZWFtLT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICBhc3RyZWFtLT5jb2RlY3Bhci0+Yml0X3JhdGUgICAgICAgID0KKyAgICAgICAgKGludDY0X3QpYXN0cmVhbS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICogYXN0cmVhbS0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKICAgICBhdmlvX3NlZWsocGIsIGNodW5rX2hlYWRlciAtIDMsIFNFRUtfU0VUKTsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdHJlYW0sIDY0LCAxLCBhc3RyZWFtLT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0cmVhbSwgNjQsIDEsIGFzdHJlYW0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2JpbmsuYyBiL2xpYmF2Zm9ybWF0L2JpbmsuYwppbmRleCAzMzJlZGJiLi44YTA1MDgyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9iaW5rLmMKKysrIGIvbGliYXZmb3JtYXQvYmluay5jCkBAIC00NSw2ICs0NSw3IEBACiAjZGVmaW5lIEJJTktfTUFYX0FVRElPX1RSQUNLUyAgIDI1NgogI2RlZmluZSBCSU5LX01BWF9XSURUSCAgICAgICAgICA3NjgwCiAjZGVmaW5lIEJJTktfTUFYX0hFSUdIVCAgICAgICAgIDQ4MDAKKyNkZWZpbmUgU01VU0hfQkxPQ0tfU0laRSAgICAgICAgNTEyCiAKIHR5cGVkZWYgc3RydWN0IEJpbmtEZW11eENvbnRleHQgewogICAgIHVpbnQzMl90IGZpbGVfc2l6ZTsKQEAgLTU1LDIxICs1NiwyOCBAQAogICAgIGludDY0X3QgYXVkaW9fcHRzW0JJTktfTUFYX0FVRElPX1RSQUNLU107CiAKICAgICB1aW50MzJfdCByZW1haW5fcGFja2V0X3NpemU7CisgICAgaW50IHNtdXNoX3NpemU7CiB9IEJpbmtEZW11eENvbnRleHQ7CiAKIHN0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCiB7CiAgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKKyAgICBpbnQgc211c2ggPSBBVl9STjMyKHAtPmJ1ZikgPT0gQVZfUk4zMigiU01VUyIpOwogCi0gICAgaWYgKCgoYlswXSA9PSAnQicgJiYgYlsxXSA9PSAnSScgJiYgYlsyXSA9PSAnSycgJiYKLSAgICAgICAgIChiWzNdID09ICdiJyB8fCBiWzNdID09ICdmJyB8fCBiWzNdID09ICdnJyB8fCBiWzNdID09ICdoJyB8fCBiWzNdID09ICdpJykpIHx8Ci0gICAgICAgICAoYlswXSA9PSAnSycgJiYgYlsxXSA9PSAnQicgJiYgYlsyXSA9PSAnMicgJiYgLyogQmluayAyICovCi0gICAgICAgICAoYlszXSA9PSAnYScgfHwgYlszXSA9PSAnZCcgfHwgYlszXSA9PSAnZicgfHwgYlszXSA9PSAnZycpKSkgJiYKLSAgICAgICAgQVZfUkwzMihiKzgpID4gMCAmJiAgLy8gbnVtX2ZyYW1lcwotICAgICAgICBBVl9STDMyKGIrMjApID4gMCAmJiBBVl9STDMyKGIrMjApIDw9IEJJTktfTUFYX1dJRFRIICYmCi0gICAgICAgIEFWX1JMMzIoYisyNCkgPiAwICYmIEFWX1JMMzIoYisyNCkgPD0gQklOS19NQVhfSEVJR0hUICYmCi0gICAgICAgIEFWX1JMMzIoYisyOCkgPiAwICYmIEFWX1JMMzIoYiszMikgPiAwKSAgLy8gZnBzIG51bSxkZW4KLSAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIGRvIHsKKyAgICAgICAgaWYgKCgoYlswXSA9PSAnQicgJiYgYlsxXSA9PSAnSScgJiYgYlsyXSA9PSAnSycgJiYgLyogQmluayAxICovCisgICAgICAgICAgICAgKGJbM10gPT0gJ2InIHx8IGJbM10gPT0gJ2YnIHx8IGJbM10gPT0gJ2cnIHx8IGJbM10gPT0gJ2gnIHx8IGJbM10gPT0gJ2knIHx8CisgICAgICAgICAgICAgIGJbM10gPT0gJ2snKSkgfHwKKyAgICAgICAgICAgICAoYlswXSA9PSAnSycgJiYgYlsxXSA9PSAnQicgJiYgYlsyXSA9PSAnMicgJiYgLyogQmluayAyICovCisgICAgICAgICAgICAgKGJbM10gPT0gJ2EnIHx8IGJbM10gPT0gJ2QnIHx8IGJbM10gPT0gJ2YnIHx8IGJbM10gPT0gJ2cnIHx8IGJbM10gPT0gJ2gnIHx8CisgICAgICAgICAgICAgIGJbM10gPT0gJ2knIHx8IGJbM10gPT0gJ2onIHx8IGJbM10gPT0gJ2snKSkpICYmCisgICAgICAgICAgICBBVl9STDMyKGIrOCkgPiAwICYmICAvLyBudW1fZnJhbWVzCisgICAgICAgICAgICBBVl9STDMyKGIrMjApID4gMCAmJiBBVl9STDMyKGIrMjApIDw9IEJJTktfTUFYX1dJRFRIICYmCisgICAgICAgICAgICBBVl9STDMyKGIrMjQpID4gMCAmJiBBVl9STDMyKGIrMjQpIDw9IEJJTktfTUFYX0hFSUdIVCAmJgorICAgICAgICAgICAgQVZfUkwzMihiKzI4KSA+IDAgJiYgQVZfUkwzMihiKzMyKSA+IDApICAvLyBmcHMgbnVtLGRlbgorICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgICAgICBiICs9IFNNVVNIX0JMT0NLX1NJWkU7CisgICAgfSB3aGlsZSAoc211c2ggJiYgYiA8IHAtPmJ1ZiArIHAtPmJ1Zl9zaXplIC0gMzIpOwogICAgIHJldHVybiAwOwogfQogCkBAIC04OSw3ICs5NywxOCBAQAogICAgIGlmICghdnN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICh2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gQVZfUkwzMigiU01VUyIpKSB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGJpbmstPnNtdXNoX3NpemUgKz0gU01VU0hfQkxPQ0tfU0laRTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgU01VU0hfQkxPQ0tfU0laRSAtIDQpOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgfSB3aGlsZSAoIWF2aW9fZmVvZihwYikgJiYgKHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAmIDB4RkZGRkZGKSAhPSBBVl9STDMyKCJCSUsiKSk7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBTTVVTSCBoZWFkZXI6IEJJSyBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBiaW5rLT5maWxlX3NpemUgPSBhdmlvX3JsMzIocGIpICsgODsKICAgICB2c3QtPmR1cmF0aW9uICAgPSBhdmlvX3JsMzIocGIpOwpAQCAtMTA3LDggKzEyNiw4IEBACiAKICAgICBhdmlvX3NraXAocGIsIDQpOwogCi0gICAgdnN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKLSAgICB2c3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JsMzIocGIpOworICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICA9IGF2aW9fcmwzMihwYik7CisgICAgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKIAogICAgIGZwc19udW0gPSBhdmlvX3JsMzIocGIpOwogICAgIGZwc19kZW4gPSBhdmlvX3JsMzIocGIpOwpAQCAtMTIxLDE1ICsxNDAsMTUgQEAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgNjQsIGZwc19kZW4sIGZwc19udW0pOwogICAgIHZzdC0+YXZnX2ZyYW1lX3JhdGUgPSBhdl9pbnZfcSh2c3QtPnRpbWVfYmFzZSk7CiAKLSAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9CSU5LVklERU87CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQklOS1ZJREVPOwogCi0gICAgaWYgKCh2c3QtPmNvZGVjLT5jb2RlY190YWcgJiAweEZGRkZGRikgPT0gTUtUQUcoJ0snLCAnQicsICcyJywgMCkpIHsKKyAgICBpZiAoKHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAmIDB4RkZGRkZGKSA9PSBNS1RBRygnSycsICdCJywgJzInLCAwKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJCaW5rIDIgdmlkZW8gaXMgbm90IGltcGxlbWVudGVkXG4iKTsKLSAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7CiAgICAgfQogCi0gICAgaWYgKGZmX2dldF9leHRyYWRhdGEodnN0LT5jb2RlYywgcGIsIDQpIDwgMCkKKyAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzLCB2c3QtPmNvZGVjcGFyLCBwYiwgNCkgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgYmluay0+bnVtX2F1ZGlvX3RyYWNrcyA9IGF2aW9fcmwzMihwYik7CkBAIC0xNDIsMjkgKzE2MSwzNiBAQAogICAgIH0KIAogICAgIGlmIChiaW5rLT5udW1fYXVkaW9fdHJhY2tzKSB7Ci0gICAgICAgIGF2aW9fc2tpcChwYiwgNCAqIGJpbmstPm51bV9hdWRpb190cmFja3MpOworICAgICAgICB1aW50MzJfdCBzaWduYXR1cmUgPSAodnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICYgMHhGRkZGRkYpOworICAgICAgICB1aW50OF90IHJldmlzaW9uID0gKCh2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPj4gMjQpICUgMHhGRik7CisKKyAgICAgICAgaWYgKChzaWduYXR1cmUgPT0gQVZfUkwzMigiQklLIikgJiYgKHJldmlzaW9uID09IDB4NmIpKSB8fCAvKiBrICovCisgICAgICAgICAgICAoc2lnbmF0dXJlID09IEFWX1JMMzIoIktCMiIpICYmIChyZXZpc2lvbiA9PSAweDY5IHx8IHJldmlzaW9uID09IDB4NmEgfHwgcmV2aXNpb24gPT0gMHg2YikpKSAvKiBpLGosayAqLworICAgICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLyogdW5rbm93biBuZXcgZmllbGQgKi8KKworICAgICAgICBhdmlvX3NraXAocGIsIDQgKiBiaW5rLT5udW1fYXVkaW9fdHJhY2tzKTsgLyogbWF4IGRlY29kZWQgc2l6ZSAqLwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiaW5rLT5udW1fYXVkaW9fdHJhY2tzOyBpKyspIHsKICAgICAgICAgICAgIGFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgICAgICAgICBpZiAoIWFzdCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IDA7Ci0gICAgICAgICAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwxNihwYik7Ci0gICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgNjQsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgPSAwOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDY0LCAxLCBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICBmbGFncyA9IGF2aW9fcmwxNihwYik7Ci0gICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZsYWdzICYgQklOS19BVURfVVNFRENUID8KKyAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gZmxhZ3MgJiBCSU5LX0FVRF9VU0VEQ1QgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9CSU5LQVVESU9fRENUIDogQVZfQ09ERUNfSURfQklOS0FVRElPX1JERlQ7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBCSU5LX0FVRF9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDI7Ci0gICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShhc3QtPmNvZGVjLCA0KSkKKyAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoYXN0LT5jb2RlY3BhciwgNCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIEFWX1dMMzIoYXN0LT5jb2RlYy0+ZXh0cmFkYXRhLCB2c3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgICAgICAgICAgQVZfV0wzMihhc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyk7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYmluay0+bnVtX2F1ZGlvX3RyYWNrczsgaSsrKQpAQCAtMTk1LDcgKzIyMSw3IEBACiAgICAgfQogCiAgICAgaWYgKHZzdC0+aW5kZXhfZW50cmllcykKLSAgICAgICAgYXZpb19zZWVrKHBiLCB2c3QtPmluZGV4X2VudHJpZXNbMF0ucG9zLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fc2VlayhwYiwgdnN0LT5pbmRleF9lbnRyaWVzWzBdLnBvcyArIGJpbmstPnNtdXNoX3NpemUsIFNFRUtfU0VUKTsKICAgICBlbHNlCiAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7CiAKQEAgLTI0NywxMCArMjczLDEwIEBACiAgICAgICAgICAgICBwa3QtPnB0cyA9IGJpbmstPmF1ZGlvX3B0c1tiaW5rLT5jdXJyZW50X3RyYWNrIC0gMV07CiAKICAgICAgICAgICAgIC8qIEVhY2ggYXVkaW8gcGFja2V0IHJlcG9ydHMgdGhlIG51bWJlciBvZiBkZWNvbXByZXNzZWQgc2FtcGxlcwotICAgICAgICAgICAgICAgKGluIGJ5dGVzKS4gV2UgdXNlIHRoaXMgdmFsdWUgdG8gY2FsY3VhdGUgdGhlIGF1ZGlvIFBUUyAqLworICAgICAgICAgICAgICAgKGluIGJ5dGVzKS4gV2UgdXNlIHRoaXMgdmFsdWUgdG8gY2FsY3VsYXRlIHRoZSBhdWRpbyBQVFMgKi8KICAgICAgICAgICAgIGlmIChwa3QtPnNpemUgPj0gNCkKICAgICAgICAgICAgICAgICBiaW5rLT5hdWRpb19wdHNbYmluay0+Y3VycmVudF90cmFjayAtMV0gKz0KLSAgICAgICAgICAgICAgICAgICAgQVZfUkwzMihwa3QtPmRhdGEpIC8gKDIgKiBzLT5zdHJlYW1zW2JpbmstPmN1cnJlbnRfdHJhY2tdLT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICBBVl9STDMyKHBrdC0+ZGF0YSkgLyAoMiAqIHMtPnN0cmVhbXNbYmluay0+Y3VycmVudF90cmFja10tPmNvZGVjcGFyLT5jaGFubmVscyk7CiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgYXVkaW9fc2l6ZSk7CkBAIC0yNzUsMTEgKzMwMSwxMSBAQAogICAgIEJpbmtEZW11eENvbnRleHQgKmJpbmsgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZTdHJlYW0gKnZzdCA9IHMtPnN0cmVhbXNbMF07CiAKLSAgICBpZiAoIXMtPnBiLT5zZWVrYWJsZSkKKyAgICBpZiAoIShzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpCiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIC8qIHNlZWsgdG8gdGhlIGZpcnN0IGZyYW1lICovCi0gICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgdnN0LT5pbmRleF9lbnRyaWVzWzBdLnBvcywgU0VFS19TRVQpIDwgMCkKKyAgICBpZiAoYXZpb19zZWVrKHMtPnBiLCB2c3QtPmluZGV4X2VudHJpZXNbMF0ucG9zICsgYmluay0+c211c2hfc2l6ZSwgU0VFS19TRVQpIDwgMCkKICAgICAgICAgcmV0dXJuIC0xOwogCiAgICAgYmluay0+dmlkZW9fcHRzID0gMDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2JpbnRleHQuYyBiL2xpYmF2Zm9ybWF0L2JpbnRleHQuYwppbmRleCAyMTdlYTQ5Li4wYjQ5OWQ5IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9iaW50ZXh0LmMKKysrIGIvbGliYXZmb3JtYXQvYmludGV4dC5jCkBAIC01NCwxMiArNTQsMTIgQEAKICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSAwOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICA9IDA7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9WSURFTzsKIAogICAgIGlmICghYmluLT53aWR0aCkgewotICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9ICg4MDw8Myk7Ci0gICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gKDI1PDw0KTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSAoODA8PDMpOworICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9ICgyNTw8NCk7CiAgICAgfQogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjAsIGJpbi0+ZnJhbWVyYXRlLmRlbiwgYmluLT5mcmFtZXJhdGUubnVtKTsKQEAgLTc0LDkgKzc0LDkgQEAKIC8qKgogICogR2l2ZW4gZmlsZXNpemUgYW5kIHdpZHRoLCBjYWxjdWxhdGUgaGVpZ2h0IChhc3N1bWUgZm9udF9oZWlnaHQgb2YgMTYpCiAgKi8KLXN0YXRpYyB2b2lkIGNhbGN1bGF0ZV9oZWlnaHQoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1aW50NjRfdCBmc2l6ZSkKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9oZWlnaHQoQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgdWludDY0X3QgZnNpemUpCiB7Ci0gICAgYXZjdHgtPmhlaWdodCA9IChmc2l6ZSAvICgoYXZjdHgtPndpZHRoPj4zKSoyKSkgPDwgNDsKKyAgICBwYXItPmhlaWdodCA9IChmc2l6ZSAvICgocGFyLT53aWR0aD4+MykqMikpIDw8IDQ7CiB9CiAjZW5kaWYKIApAQCAtMTE5LDEzICsxMTksNjAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcHJlZGljdF93aWR0aChBVkNvZGVjQ29udGV4dCAqYXZjdHgsIHVpbnQ2NF90IGZzaXplLCBpbnQgZ290X3dpZHRoKQorc3RhdGljIHZvaWQgcHJlZGljdF93aWR0aChBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCB1aW50NjRfdCBmc2l6ZSwgaW50IGdvdF93aWR0aCkKIHsKICAgICAvKiogYXR0ZW1wdCB0byBndWVzcyB3aWR0aCAqLwogICAgIGlmICghZ290X3dpZHRoKQotICAgICAgICBhdmN0eC0+d2lkdGggPSBmc2l6ZSA+IDQwMDAgPyAoMTYwPDwzKSA6ICg4MDw8Myk7CisgICAgICAgIHBhci0+d2lkdGggPSBmc2l6ZSA+IDQwMDAgPyAoMTYwPDwzKSA6ICg4MDw8Myk7CiB9CiAKK3N0YXRpYyBpbnQgYmluX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmQgPSBwLT5idWY7CisgICAgaW50IG1hZ2ljID0gMCwgc2F1Y2UgPSAwOworICAgIGludCBpbnZpc2libGUgPSAwOworICAgIGludCBpOworCisgICAgaWYgKHAtPmJ1Zl9zaXplID4gMjU2KQorICAgICAgICBtYWdpYyA9ICFtZW1jbXAoZCArIHAtPmJ1Zl9zaXplIC0gMjU2LCBuZXh0X21hZ2ljLCBzaXplb2YobmV4dF9tYWdpYykpOworICAgIGlmIChwLT5idWZfc2l6ZSA+IDEyOCkKKyAgICAgICAgc2F1Y2UgPSAhbWVtY21wKGQgKyBwLT5idWZfc2l6ZSAtIDEyOCwgIlNBVUNFMDAiLCA3KTsKKworICAgIGlmIChtYWdpYykKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsKKworICAgIGlmIChhdl9tYXRjaF9leHQocC0+ZmlsZW5hbWUsICJiaW4iKSkgeworICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyBwYXI7CisgICAgICAgIGludCBnb3Rfd2lkdGggPSAwOworICAgICAgICBwYXIud2lkdGggPSBwYXIuaGVpZ2h0ID0gMDsKKyAgICAgICAgaWYgKHNhdWNlKQorICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsKKworICAgICAgICBwcmVkaWN0X3dpZHRoKCZwYXIsIHAtPmJ1Zl9zaXplLCBnb3Rfd2lkdGgpOworICAgICAgICBpZiAocGFyLndpZHRoIDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FsY3VsYXRlX2hlaWdodCgmcGFyLCBwLT5idWZfc2l6ZSk7CisgICAgICAgIGlmIChwYXIuaGVpZ2h0IDw9IDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcC0+YnVmX3NpemUgLSAyNTY7ICBpKz0yKSB7CisgICAgICAgICAgICBpZiAoKGRbaSsxXSAmIDE1KSA9PSAoZFtpKzFdID4+IDQpICYmIGRbaV0gJiYgZFtpXSAhPSAweEZGICYmIGRbaV0gIT0gJyAnKSB7CisgICAgICAgICAgICAgICAgaW52aXNpYmxlICsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhci53aWR0aCAqIHBhci5oZWlnaHQgKiAyIC8gKDgqMTYpID09IHAtPmJ1Zl9zaXplKQorICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gMjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKHNhdWNlKQorICAgICAgICByZXR1cm4gMTsKKworICAgIHJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgYmludGV4dF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgQmluRGVtdXhDb250ZXh0ICpiaW4gPSBzLT5wcml2X2RhdGE7CkBAIC0xMzQsMjEgKzE4MSwyMSBAQAogICAgIEFWU3RyZWFtICpzdCA9IGluaXRfc3RyZWFtKHMpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0JJTlRFWFQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0JJTlRFWFQ7CiAKLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgMikpCisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIDIpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzBdID0gMTY7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMV0gPSAwOworICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzBdID0gMTY7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMV0gPSAwOwogCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBpbnQgZ290X3dpZHRoID0gMDsKICAgICAgICAgYmluLT5mc2l6ZSA9IGF2aW9fc2l6ZShwYik7CiAgICAgICAgIGlmIChmZl9zYXVjZV9yZWFkKHMsICZiaW4tPmZzaXplLCAmZ290X3dpZHRoLCAwKSA8IDApCiAgICAgICAgICAgICBuZXh0X3RhZ19yZWFkKHMsICZiaW4tPmZzaXplKTsKICAgICAgICAgaWYgKCFiaW4tPndpZHRoKSB7Ci0gICAgICAgICAgICBwcmVkaWN0X3dpZHRoKHN0LT5jb2RlYywgYmluLT5mc2l6ZSwgZ290X3dpZHRoKTsKLSAgICAgICAgICAgIGNhbGN1bGF0ZV9oZWlnaHQoc3QtPmNvZGVjLCBiaW4tPmZzaXplKTsKKyAgICAgICAgICAgIHByZWRpY3Rfd2lkdGgoc3QtPmNvZGVjcGFyLCBiaW4tPmZzaXplLCBnb3Rfd2lkdGgpOworICAgICAgICAgICAgY2FsY3VsYXRlX2hlaWdodChzdC0+Y29kZWNwYXIsIGJpbi0+ZnNpemUpOwogICAgICAgICB9CiAgICAgICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOwogICAgIH0KQEAgLTE3OSwzMCArMjI2LDMwIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBhdmlvX3NraXAocGIsIDUpOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICA9IGF2aW9fcmwxNihwYik8PDM7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgID0gYXZpb19ybDE2KHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgPSBhdmlvX3JsMTYocGIpPDwzOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICA9IGF2aW9fcmwxNihwYik7CiAgICAgZm9udGhlaWdodCAgICAgICAgID0gYXZpb19yOChwYik7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgKj0gZm9udGhlaWdodDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAqPSBmb250aGVpZ2h0OwogICAgIGZsYWdzICAgICAgICAgICAgICA9IGF2aW9fcjgocGIpOwogCi0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDI7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDI7CiAgICAgaWYgKChmbGFncyAmIEJJTlRFWFRfUEFMRVRURSkpCi0gICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKz0gNDg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKz0gNDg7CiAgICAgaWYgKChmbGFncyAmIEJJTlRFWFRfRk9OVCkpCi0gICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKz0gZm9udGhlaWdodCAqIChmbGFncyAmIDB4MTAgPyA1MTIgOiAyNTYpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBmbGFncyAmIDQgPyBBVl9DT0RFQ19JRF9YQklOIDogQVZfQ09ERUNfSURfQklOVEVYVDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSArPSBmb250aGVpZ2h0ICogKGZsYWdzICYgMHgxMCA/IDUxMiA6IDI1Nik7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IGZsYWdzICYgNCA/IEFWX0NPREVDX0lEX1hCSU4gOiBBVl9DT0RFQ19JRF9CSU5URVhUOwogCi0gICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpKQorICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVswXSA9IGZvbnRoZWlnaHQ7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMV0gPSBmbGFnczsKLSAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgLSAyKSA8IDApCisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMF0gPSBmb250aGVpZ2h0OworICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzFdID0gZmxhZ3M7CisgICAgaWYgKGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAyLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplIC0gMikgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgewotICAgICAgICBiaW4tPmZzaXplID0gYXZpb19zaXplKHBiKSAtIDkgLSBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplOworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgeworICAgICAgICBiaW4tPmZzaXplID0gYXZpb19zaXplKHBiKSAtIDkgLSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplOwogICAgICAgICBmZl9zYXVjZV9yZWFkKHMsICZiaW4tPmZzaXplLCBOVUxMLCAwKTsKLSAgICAgICAgYXZpb19zZWVrKHBiLCA5ICsgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSwgU0VFS19TRVQpOworICAgICAgICBhdmlvX3NlZWsocGIsIDkgKyBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplLCBTRUVLX1NFVCk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0yMjIsMjggKzI2OSwyOCBAQAogICAgIHN0ID0gaW5pdF9zdHJlYW0ocyk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQklOVEVYVDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQklOVEVYVDsKIAotICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAyICsgNDggKyA0MDk2KSkKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMiArIDQ4ICsgNDA5NikpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMF0gPSAxNjsKLSAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsxXSA9IEJJTlRFWFRfUEFMRVRURXxCSU5URVhUX0ZPTlQ7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMF0gPSAxNjsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxXSA9IEJJTlRFWFRfUEFMRVRURXxCSU5URVhUX0ZPTlQ7CiAKLSAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIsIDI0KSA8IDApCisgICAgaWYgKGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAyLCAyNCkgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogICAgIGF2aW9fc2tpcChwYiwgMTQ0KTsKLSAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIgKyAyNCwgMjQpIDwgMCkKKyAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDIgKyAyNCwgMjQpIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKLSAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIgKyA0OCwgNDA5NikgPCAwKQorICAgIGlmIChhdmlvX3JlYWQocGIsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMiArIDQ4LCA0MDk2KSA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAKLSAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgaWYgKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CiAgICAgICAgIGludCBnb3Rfd2lkdGggPSAwOwogICAgICAgICBiaW4tPmZzaXplID0gYXZpb19zaXplKHBiKSAtIDEgLSAxOTIgLSA0MDk2OwotICAgICAgICBzdC0+Y29kZWMtPndpZHRoID0gODA8PDM7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggPSA4MDw8MzsKICAgICAgICAgZmZfc2F1Y2VfcmVhZChzLCAmYmluLT5mc2l6ZSwgJmdvdF93aWR0aCwgMCk7CiAgICAgICAgIGlmICghYmluLT53aWR0aCkKLSAgICAgICAgICAgIGNhbGN1bGF0ZV9oZWlnaHQoc3QtPmNvZGVjLCBiaW4tPmZzaXplKTsKKyAgICAgICAgICAgIGNhbGN1bGF0ZV9oZWlnaHQoc3QtPmNvZGVjcGFyLCBiaW4tPmZzaXplKTsKICAgICAgICAgYXZpb19zZWVrKHBiLCAxICsgMTkyICsgNDA5NiwgU0VFS19TRVQpOwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTI3MSwzMCArMzE4LDMwIEBACiAgICAgQVZTdHJlYW0gKnN0OwogICAgIGludCBnb3Rfd2lkdGggPSAwOwogCi0gICAgaWYgKCFwYi0+c2Vla2FibGUpCisgICAgaWYgKCEocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogCiAgICAgc3QgPSBpbml0X3N0cmVhbShzKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9JREY7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0lERjsKIAotICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAyICsgNDggKyA0MDk2KSkKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMiArIDQ4ICsgNDA5NikpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMF0gPSAxNjsKLSAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsxXSA9IEJJTlRFWFRfUEFMRVRURXxCSU5URVhUX0ZPTlQ7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMF0gPSAxNjsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxXSA9IEJJTlRFWFRfUEFMRVRURXxCSU5URVhUX0ZPTlQ7CiAKICAgICBhdmlvX3NlZWsocGIsIGF2aW9fc2l6ZShwYikgLSA0MDk2IC0gNDgsIFNFRUtfU0VUKTsKIAotICAgIGlmIChhdmlvX3JlYWQocGIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMiArIDQ4LCA0MDk2KSA8IDApCisgICAgaWYgKGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAyICsgNDgsIDQwOTYpIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKLSAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIsIDQ4KSA8IDApCisgICAgaWYgKGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAyLCA0OCkgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogCiAgICAgYmluLT5mc2l6ZSA9IGF2aW9fc2l6ZShwYikgLSAxMiAtIDQwOTYgLSA0ODsKICAgICBmZl9zYXVjZV9yZWFkKHMsICZiaW4tPmZzaXplLCAmZ290X3dpZHRoLCAwKTsKICAgICBpZiAoIWJpbi0+d2lkdGgpCi0gICAgICAgIGNhbGN1bGF0ZV9oZWlnaHQoc3QtPmNvZGVjLCBiaW4tPmZzaXplKTsKKyAgICAgICAgY2FsY3VsYXRlX2hlaWdodChzdC0+Y29kZWNwYXIsIGJpbi0+ZnNpemUpOwogICAgIGF2aW9fc2VlayhwYiwgMTIsIFNFRUtfU0VUKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTMyNiw3ICszNzMsNyBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICB7ICJsaW5lc3BlZWQiLCAic2V0IHNpbXVsYXRlZCBsaW5lIHNwZWVkIChieXRlcyBwZXIgc2Vjb25kKSIsIE9GRlNFVChjaGFyc19wZXJfZnJhbWUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNjAwMH0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNfSwKICAgICB7ICJ2aWRlb19zaXplIiwgInNldCB2aWRlbyBzaXplLCBzdWNoIGFzIDY0MHg0ODAgb3IgaGQ3MjAuIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKLSAgICB7ICJmcmFtZXJhdGUiLCAic2V0IGZyYW1lcmF0ZSAoZnJhbWVzIHBlciBzZWNvbmQpIiwgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgInNldCBmcmFtZXJhdGUgKGZyYW1lcyBwZXIgc2Vjb25kKSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAogICAgIHsgTlVMTCB9LAogfTsKIApAQCAtMzQzLDkgKzM5MCw5IEBACiAgICAgLm5hbWUgICAgICAgICAgID0gImJpbiIsCiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkJpbmFyeSB0ZXh0IiksCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEJpbkRlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gYmluX3Byb2JlLAogICAgIC5yZWFkX2hlYWRlciAgICA9IGJpbnRleHRfcmVhZF9oZWFkZXIsCiAgICAgLnJlYWRfcGFja2V0ICAgID0gcmVhZF9wYWNrZXQsCi0gICAgLmV4dGVuc2lvbnMgICAgID0gImJpbiIsCiAgICAgLnByaXZfY2xhc3MgICAgID0gQ0xBU1MoIkJpbmFyeSB0ZXh0IGRlbXV4ZXIiKSwKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2JpdC5jIGIvbGliYXZmb3JtYXQvYml0LmMKaW5kZXggMTM4ZDJmZS4uNzZhYWUyZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYml0LmMKKysrIGIvbGliYXZmb3JtYXQvYml0LmMKQEAgLTI5LDIyICsyOSwyNiBAQAogI2RlZmluZSBCSVRfMCAgICAgIDB4N2YKICNkZWZpbmUgQklUXzEgICAgICAweDgxCiAKKyNpZiBDT05GSUdfQklUX0RFTVVYRVIKIHN0YXRpYyBpbnQgcHJvYmUoQVZQcm9iZURhdGEgKnApCiB7Ci0gICAgaW50IGksIGo7CisgICAgaW50IGkgPSAwLCBqLCB2YWxpZCA9IDA7CiAKLSAgICBpZihwLT5idWZfc2l6ZSA8IDB4NDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgZm9yKGk9MDsgaSszPHAtPmJ1Zl9zaXplICYmIGk8IDEwKjB4NTA7ICl7Ci0gICAgICAgIGlmKEFWX1JMMTYoJnAtPmJ1ZlswXSkgIT0gU1lOQ19XT1JEKQorICAgIHdoaWxlICgyICogaSArIDMgPCBwLT5idWZfc2l6ZSl7CisgICAgICAgIGlmIChBVl9STDE2KCZwLT5idWZbMiAqIGkrK10pICE9IFNZTkNfV09SRCkKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBqPUFWX1JMMTYoJnAtPmJ1ZlsyXSk7Ci0gICAgICAgIGlmKGohPTB4NDAgJiYgaiE9MHg1MCkKKyAgICAgICAgaiA9IEFWX1JMMTYoJnAtPmJ1ZlsyICogaSsrXSk7CisgICAgICAgIGlmIChqICE9IDAgJiYgaiAhPSAweDEwICYmIGogIT0gMHg0MCAmJiBqICE9IDB4NTAgJiYgaiAhPSAweDc2KQogICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIGkrPWo7CisgICAgICAgIGlmIChqKQorICAgICAgICAgICAgdmFsaWQrKzsKKyAgICAgICAgaSArPSBqOwogICAgIH0KLSAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisgICAgaWYgKHZhbGlkID4gMTApCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICBpZiAodmFsaWQgPiAyKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLSAxOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKQEAgLTU1LDExICs1OSwxMSBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZD1BVl9DT0RFQ19JRF9HNzI5OwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU9ODAwMDsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTY7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscz0xOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkPUFWX0NPREVDX0lEX0c3Mjk7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZT04MDAwOworICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAxNjsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzPTE7CiAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKICAgICByZXR1cm4gMDsKQEAgLTExMywyMCArMTE3LDIxIEBACiAgICAgLnJlYWRfcGFja2V0ID0gcmVhZF9wYWNrZXQsCiAgICAgLmV4dGVuc2lvbnMgID0gImJpdCIsCiB9OworI2VuZGlmCiAKLSNpZiBDT05GSUdfTVVYRVJTCisjaWYgQ09ORklHX0JJVF9NVVhFUgogc3RhdGljIGludCB3cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAKLSAgICBpZiAoKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfRzcyOSkgfHwgZW5jLT5jaGFubmVscyAhPSAxKSB7CisgICAgaWYgKChwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0c3MjkpIHx8IHBhci0+Y2hhbm5lbHMgIT0gMSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIm9ubHkgY29kZWMgZzcyOSB3aXRoIDEgY2hhbm5lbCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBmb3JtYXRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7Ci0gICAgZW5jLT5ibG9ja19hbGlnbiA9IChlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIGVuYy0+Y2hhbm5lbHMpID4+IDM7CisgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICBwYXItPmJsb2NrX2FsaWduID0gKHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogcGFyLT5jaGFubmVscykgPj4gMzsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMTQxLDEwICsxNDYsMTAgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIAogICAgIGF2aW9fd2wxNihwYiwgU1lOQ19XT1JEKTsKLSAgICBhdmlvX3dsMTYocGIsIDggKiAxMCk7CisgICAgYXZpb193bDE2KHBiLCA4ICogcGt0LT5zaXplKTsKIAotICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBwa3QtPmRhdGEsIDgqMTApOwotICAgIGZvcihpPTA7IGk8IDggKiAxMDsgaSsrKQorICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBwa3QtPmRhdGEsIDggKiBwa3QtPnNpemUpOworICAgIGZvciAoaSA9IDA7IGkgPCA4ICogcGt0LT5zaXplOyBpKyspCiAgICAgICAgIGF2aW9fd2wxNihwYiwgZ2V0X2JpdHMxKCZnYikgPyBCSVRfMSA6IEJJVF8wKTsKIAogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYmx1cmF5LmMgYi9saWJhdmZvcm1hdC9ibHVyYXkuYwppbmRleCBkMmM1N2FhLi42MzVjNGYxIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ibHVyYXkuYworKysgYi9saWJhdmZvcm1hdC9ibHVyYXkuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAKICAgICBsZW4gPSBiZF9yZWFkKGJkLT5iZCwgYnVmLCBzaXplKTsKIAotICAgIHJldHVybiBsZW47CisgICAgcmV0dXJuIGxlbiA9PSAwID8gQVZFUlJPUl9FT0YgOiBsZW47CiB9CiAKIHN0YXRpYyBpbnQ2NF90IGJsdXJheV9zZWVrKFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKQpAQCAtMjI0LDcgKzIyNCw3IEBACiB9CiAKIAotVVJMUHJvdG9jb2wgZmZfYmx1cmF5X3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfYmx1cmF5X3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgPSAiYmx1cmF5IiwKICAgICAudXJsX2Nsb3NlICAgICAgID0gYmx1cmF5X2Nsb3NlLAogICAgIC51cmxfb3BlbiAgICAgICAgPSBibHVyYXlfb3BlbiwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2Jtdi5jIGIvbGliYXZmb3JtYXQvYm12LmMKaW5kZXggZjdhNjA2OC4uYWM1NjdjMiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvYm12LmMKKysrIGIvbGliYXZmb3JtYXQvYm12LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogRGlzY3dvcmxkIElJIEJNViBkZW11eGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgS29uc3RhbnRpbiBTaGlzaGtvdi4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBLb25zdGFudGluIFNoaXNoa292CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTQ3LDIwICs0NywyMCBAQAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9CTVZfVklERU87Ci0gICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gNjQwOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IDQyOTsKLSAgICBzdC0+Y29kZWMtPnBpeF9mbXQgICAgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0JNVl9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSA2NDA7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gNDI5OworICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICA9IEFWX1BJWF9GTVRfUEFMODsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAxNiwgMSwgMTIpOwogICAgIGFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgMCk7CiAgICAgaWYgKCFhc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgICA9IEFWX0NPREVDX0lEX0JNVl9BVURJTzsKLSAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgPSAyOwotICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ICA9IEFWX0NIX0xBWU9VVF9TVEVSRU87Ci0gICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgID0gMjIwNTA7CisgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgICA9IEFWX0NPREVDX0lEX0JNVl9BVURJTzsKKyAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICAgPSAyOworICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ICA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgID0gMjIwNTA7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDE2LCAxLCAyMjA1MCk7CiAKICAgICBjLT5nZXRfbmV4dCAgPSAxOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvYm9hZGVjLmMgYi9saWJhdmZvcm1hdC9ib2FkZWMuYwppbmRleCBiZTAwM2U1Li43MzBlOTU3IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ib2FkZWMuYworKysgYi9saWJhdmZvcm1hdC9ib2FkZWMuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtNDYsMTYgKzQ3LDIxIEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fTVM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9NUzsKIAogICAgIGF2aW9fcmwzMihzLT5wYik7CiAgICAgYXZpb19ybDMyKHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IEZGX1NBTkVfTkJfQ0hBTk5FTFMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgcy0+aW50ZXJuYWwtPmRhdGFfb2Zmc2V0ID0gYXZpb19ybDMyKHMtPnBiKTsKICAgICBhdmlvX3I4KHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIGF2aW9fcmwzMihzLT5wYik7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPiBJTlRfTUFYIC8gRkZfU0FORV9OQl9DSEFOTkVMUykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAqPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogCiAgICAgYXZpb19zZWVrKHMtPnBiLCBzLT5pbnRlcm5hbC0+ZGF0YV9vZmZzZXQsIFNFRUtfU0VUKTsKIApAQCAtNjYsNyArNzIsNyBAQAogewogICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CiAKLSAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKTsKIH0KIAogQVZJbnB1dEZvcm1hdCBmZl9ib2FfZGVtdXhlciA9IHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2Jyc3RtLmMgYi9saWJhdmZvcm1hdC9icnN0bS5jCmluZGV4IGFhZTI1NzUuLjg3NjkwZTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2Jyc3RtLmMKKysrIGIvbGliYXZmb3JtYXQvYnJzdG0uYwpAQCAtOTksNyArOTksNyBAQAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CiAKICAgICBhdmlvX3NraXAocy0+cGIsIDQpOwogCkBAIC0xNjksNyArMTY5LDcgQEAKICAgICB9CiAKICAgICBzaXplID0gcmVhZDMyKHMpOwotICAgIGlmIChzaXplIDwgMTkyKQorICAgIGlmIChzaXplIDwgNDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7IC8vIHVua25vd24KICAgICBoMW9mZnNldCA9IHJlYWQzMihzKTsKQEAgLTE5NywxNSArMTk3LDE1IEBACiAgICAgfQogCiAgICAgbG9vcCA9IGF2aW9fcjgocy0+cGIpOyAvLyBsb29wIGZsYWcKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gY29kZWM7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGF2aW9fcjgocy0+cGIpOwotICAgIGlmICghc3QtPmNvZGVjLT5jaGFubmVscykKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gY29kZWM7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IGF2aW9fcjgocy0+cGIpOworICAgIGlmICghc3QtPmNvZGVjcGFyLT5jaGFubmVscykKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBhdmlvX3NraXAocy0+cGIsIDEpOyAvLyBwYWRkaW5nCiAKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYmZzdG0gPyByZWFkMzIocykgOiByZWFkMTYocyk7Ci0gICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPD0gMCkKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYmZzdG0gPyByZWFkMzIocykgOiByZWFkMTYocyk7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBpZiAoIWJmc3RtKQpAQCAtMjE0LDcgKzIxNCw3IEBACiAgICAgaWYgKGxvb3ApIHsKICAgICAgICAgaWYgKGF2X2RpY3Rfc2V0X2ludCgmcy0+bWV0YWRhdGEsICJsb29wX3N0YXJ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKHJlYWQzMihzKSwgQVZfVElNRV9CQVNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0gZWxzZSB7CkBAIC0yMjMsMjYgKzIyMywyNiBAQAogCiAgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOwogICAgIHN0LT5kdXJhdGlvbiA9IHJlYWQzMihzKTsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgaWYgKCFiZnN0bSkKICAgICAgICAgc3RhcnQgPSByZWFkMzIocyk7CiAgICAgYi0+Y3VycmVudF9ibG9jayA9IDA7CiAgICAgYi0+YmxvY2tfY291bnQgPSByZWFkMzIocyk7CiAgICAgaWYgKGItPmJsb2NrX2NvdW50ID4gVUlOVDE2X01BWCkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJ0b28gbWFueSBibG9ja3M6ICV1XG4iLCBiLT5ibG9ja19jb3VudCk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInRvbyBtYW55IGJsb2NrczogJSJQUkl1MzIiXG4iLCBiLT5ibG9ja19jb3VudCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAogICAgIGItPmJsb2NrX3NpemUgPSByZWFkMzIocyk7Ci0gICAgaWYgKGItPmJsb2NrX3NpemUgPiBVSU5UMzJfTUFYIC8gc3QtPmNvZGVjLT5jaGFubmVscykKKyAgICBpZiAoYi0+YmxvY2tfc2l6ZSA+IFVJTlQzMl9NQVggLyBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIGItPnNhbXBsZXNfcGVyX2Jsb2NrID0gcmVhZDMyKHMpOwogICAgIGItPmxhc3RfYmxvY2tfdXNlZF9ieXRlcyA9IHJlYWQzMihzKTsKICAgICBiLT5sYXN0X2Jsb2NrX3NhbXBsZXMgPSByZWFkMzIocyk7CiAgICAgYi0+bGFzdF9ibG9ja19zaXplID0gcmVhZDMyKHMpOwotICAgIGlmIChiLT5sYXN0X2Jsb2NrX3NpemUgPiBVSU5UMzJfTUFYIC8gc3QtPmNvZGVjLT5jaGFubmVscykKKyAgICBpZiAoYi0+bGFzdF9ibG9ja19zaXplID4gVUlOVDMyX01BWCAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGlmIChiLT5sYXN0X2Jsb2NrX3VzZWRfYnl0ZXMgPiBiLT5sYXN0X2Jsb2NrX3NpemUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtMjU1LDE2ICsyNTUsMTYgQEAKICAgICAgICAgaWYgKCFiZnN0bSkKICAgICAgICAgICAgIHRvZmZzZXQgPSByZWFkMzIocykgKyAxNkxMOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICB0b2Zmc2V0ID0gdG9mZnNldCArIHJlYWQzMihzKSArIHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiA4IC0gODsKKyAgICAgICAgICAgIHRvZmZzZXQgPSB0b2Zmc2V0ICsgcmVhZDMyKHMpICsgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIDggLSA4OwogICAgICAgICBpZiAodG9mZnNldCA+IHNpemUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgICAgICBhdmlvX3NraXAocy0+cGIsIHBvcyArIHRvZmZzZXQgLSBhdmlvX3RlbGwocy0+cGIpKTsKLSAgICAgICAgYi0+dGFibGUgPSBhdl9tYWxsb2N6KDMyICogc3QtPmNvZGVjLT5jaGFubmVscyk7CisgICAgICAgIGItPnRhYmxlID0gYXZfbWFsbG9jeigzMiAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpOwogICAgICAgICBpZiAoIWItPnRhYmxlKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdC0+Y29kZWMtPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocy0+cGIsIGItPnRhYmxlICsgY2ggKiAzMiwgMzIpICE9IDMyKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CkBAIC0yOTUsNyArMjk1LDcgQEAKICAgICAgICAgICAgICAgICBjb2RlYyAhPSBBVl9DT0RFQ19JRF9BRFBDTV9USFBfTEUpCiAgICAgICAgICAgICAgICAgZ290byBza2lwOwogCi0gICAgICAgICAgICBhc2l6ZSA9IGItPmJsb2NrX2NvdW50ICogc3QtPmNvZGVjLT5jaGFubmVscyAqIDQ7CisgICAgICAgICAgICBhc2l6ZSA9IGItPmJsb2NrX2NvdW50ICogc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIDQ7CiAgICAgICAgICAgICBpZiAoc2l6ZSA8IGFzaXplKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CkBAIC0zNTcsNyArMzU3LDcgQEAKIAogc3RhdGljIGludCByZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogICAgIEJSU1RNRGVtdXhDb250ZXh0ICpiID0gcy0+cHJpdl9kYXRhOwogICAgIHVpbnQzMl90IHNhbXBsZXMsIHNpemUsIHNraXAgPSAwOwogICAgIGludCByZXQsIGk7CkBAIC0zODUsOCArMzg1LDggQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogICAgIH0KIAotICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fVEhQIHx8Ci0gICAgICAgIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFBfTEUpIHsKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFAgfHwKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFBfTEUpIHsKICAgICAgICAgdWludDhfdCAqZHN0OwogCiAgICAgICAgIGlmICghYi0+YWRwYykgewpAQCAtMzk0LDMwICszOTQsMzAgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgICAgIGlmICghYi0+dGFibGUpIHsKLSAgICAgICAgICAgIGItPnRhYmxlID0gYXZfbWFsbG9jeigzMiAqIGNvZGVjLT5jaGFubmVscyk7CisgICAgICAgICAgICBiLT50YWJsZSA9IGF2X21hbGxvY3ooMzIgKiBwYXItPmNoYW5uZWxzKTsKICAgICAgICAgICAgIGlmICghYi0+dGFibGUpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzaXplID4gKElOVF9NQVggLSAzMiAtIDQpIHx8Ci0gICAgICAgICAgICAoMzIgKyA0ICsgc2l6ZSkgPiAoSU5UX01BWCAvIGNvZGVjLT5jaGFubmVscykgfHwKLSAgICAgICAgICAgICgzMiArIDQgKyBzaXplKSAqIGNvZGVjLT5jaGFubmVscyA+IElOVF9NQVggLSA4KQorICAgICAgICAgICAgKDMyICsgNCArIHNpemUpID4gKElOVF9NQVggLyBwYXItPmNoYW5uZWxzKSB8fAorICAgICAgICAgICAgKDMyICsgNCArIHNpemUpICogcGFyLT5jaGFubmVscyA+IElOVF9NQVggLSA4KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgOCArICgzMiArIDQgKyBzaXplKSAqIGNvZGVjLT5jaGFubmVscykgPCAwKQorICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIDggKyAoMzIgKyA0ICsgc2l6ZSkgKiBwYXItPmNoYW5uZWxzKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBkc3QgPSBwa3QtPmRhdGE7Ci0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fVEhQX0xFKSB7Ci0gICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZkc3QsIHNpemUgKiBjb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFBfTEUpIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJmRzdCwgc2l6ZSAqIHBhci0+Y2hhbm5lbHMpOwogICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmZHN0LCBzYW1wbGVzKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmRzdCwgc2l6ZSAqIGNvZGVjLT5jaGFubmVscyk7CisgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZkc3QsIHNpemUgKiBwYXItPmNoYW5uZWxzKTsKICAgICAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmRzdCwgc2FtcGxlcyk7CiAgICAgICAgIH0KLSAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZkc3QsIGItPnRhYmxlLCAzMiAqIGNvZGVjLT5jaGFubmVscyk7Ci0gICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmZHN0LCBiLT5hZHBjICsgNCAqIGNvZGVjLT5jaGFubmVscyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYi0+Y3VycmVudF9ibG9jayAtIDEpLCA0ICogY29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZkc3QsIGItPnRhYmxlLCAzMiAqIHBhci0+Y2hhbm5lbHMpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJmRzdCwgYi0+YWRwYyArIDQgKiBwYXItPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiLT5jdXJyZW50X2Jsb2NrIC0gMSksIDQgKiBwYXItPmNoYW5uZWxzKTsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhci0+Y2hhbm5lbHM7IGkrKykgewogICAgICAgICAgICAgcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBkc3QsIHNpemUpOwogICAgICAgICAgICAgZHN0ICs9IHNpemU7CiAgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIHNraXApOwpAQCAtNDI4LDcgKzQyOCw3IEBACiAgICAgICAgIH0KICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IHNhbXBsZXM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc2l6ZSAqPSBjb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgIHNpemUgKj0gcGFyLT5jaGFubmVsczsKICAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKICAgICB9CiAKQEAgLTQ0OSw3ICs0NDksNyBAQAogCiAgICAgdGltZXN0YW1wIC89IGItPnNhbXBsZXNfcGVyX2Jsb2NrOwogICAgIHJldCA9IGF2aW9fc2VlayhzLT5wYiwgYi0+ZGF0YV9zdGFydCArIHRpbWVzdGFtcCAqIGItPmJsb2NrX3NpemUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscywgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscywgU0VFS19TRVQpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9jOTMuYyBiL2xpYmF2Zm9ybWF0L2M5My5jCmluZGV4IDIwYWU5YzQuLmIxYTI0NWEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2M5My5jCisrKyBiL2xpYmF2Zm9ybWF0L2M5My5jCkBAIC04MywxMCArODMsMTAgQEAKICAgICBpZiAoIXZpZGVvKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgdmlkZW8tPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZpZGVvLT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9DOTM7Ci0gICAgdmlkZW8tPmNvZGVjLT53aWR0aCA9IDMyMDsKLSAgICB2aWRlby0+Y29kZWMtPmhlaWdodCA9IDE5MjsKKyAgICB2aWRlby0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdmlkZW8tPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0M5MzsKKyAgICB2aWRlby0+Y29kZWNwYXItPndpZHRoID0gMzIwOworICAgIHZpZGVvLT5jb2RlY3Bhci0+aGVpZ2h0ID0gMTkyOwogICAgIC8qIDQ6MyAzMjB4MjAwIHdpdGggOCBlbXB0eSBsaW5lcyAqLwogICAgIHZpZGVvLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpIHsgNSwgNiB9OwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odmlkZW8sIDY0LCAyLCAyNSk7CkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgICAgICAgICBjOTMtPmF1ZGlvID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICAgICAgICAgICAgICBpZiAoIWM5My0+YXVkaW8pCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgYzkzLT5hdWRpby0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICAgICAgYzkzLT5hdWRpby0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDI2KTsgLyogVk9DIGhlYWRlciAqLwogICAgICAgICAgICAgcmV0ID0gZmZfdm9jX2dldF9wYWNrZXQocywgcGt0LCBjOTMtPmF1ZGlvLCBkYXRhc2l6ZSAtIDI2KTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2NhY2hlLmMgYi9saWJhdmZvcm1hdC9jYWNoZS5jCmluZGV4IDhlOGI5ZTguLjY2YmJiZjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2NhY2hlLmMKKysrIGIvbGliYXZmb3JtYXQvY2FjaGUuYwpAQCAtMjksNyArMjksNyBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ZpbGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RyZWUuaCIKICNpbmNsdWRlICJhdmZvcm1hdC5oIgpAQCAtNzcsNyArNzcsNyBAQAogCiAgICAgYXZfc3Ryc3RhcnQoYXJnLCAiY2FjaGU6IiwgJmFyZyk7CiAKLSAgICBjLT5mZCA9IGF2X3RlbXBmaWxlKCJmZmNhY2hlIiwgJmJ1ZmZlcm5hbWUsIDAsIGgpOworICAgIGMtPmZkID0gYXZwcml2X3RlbXBmaWxlKCJmZmNhY2hlIiwgJmJ1ZmZlcm5hbWUsIDAsIGgpOwogICAgIGlmIChjLT5mZCA8IDApewogICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wZmlsZVxuIik7CiAgICAgICAgIHJldHVybiBjLT5mZDsKQEAgLTg3LDcgKzg3LDcgQEAKICAgICBhdl9mcmVlcCgmYnVmZmVybmFtZSk7CiAKICAgICByZXR1cm4gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJmMtPmlubmVyLCBhcmcsIGZsYWdzLCAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLCBoLT5wcm90b2NvbF93aGl0ZWxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLCBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaCk7CiB9CiAKIHN0YXRpYyBpbnQgYWRkX2VudHJ5KFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCkBAIC0yMDEsNyArMjAxLDcgQEAKICAgICB9CiAKICAgICByID0gZmZ1cmxfcmVhZChjLT5pbm5lciwgYnVmLCBzaXplKTsKLSAgICBpZiAociA9PSAwICYmIHNpemU+MCkgeworICAgIGlmIChyID09IEFWRVJST1JfRU9GICYmIHNpemU+MCkgewogICAgICAgICBjLT5pc190cnVlX2VvZiA9IDE7CiAgICAgICAgIGF2X2Fzc2VydDAoYy0+ZW5kID49IGMtPmxvZ2ljYWxfcG9zKTsKICAgICB9CkBAIC0yNjMsNyArMjYzLDcgQEAKICAgICAgICAgICAgICAgICBpZiAod2hlbmNlID09IFNFRUtfU0VUKQogICAgICAgICAgICAgICAgICAgICBzaXplID0gRkZNSU4oc2l6ZW9mKHRtcCksIHBvcyAtIGMtPmxvZ2ljYWxfcG9zKTsKICAgICAgICAgICAgICAgICByZXQgPSBjYWNoZV9yZWFkKGgsIHRtcCwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA9PSAwICYmIHdoZW5jZSA9PSBTRUVLX0VORCkgeworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YgJiYgd2hlbmNlID09IFNFRUtfRU5EKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoYy0+aXNfdHJ1ZV9lb2YpOwogICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc29sdmVfZW9mOwogICAgICAgICAgICAgICAgIH0KQEAgLTI4Myw2ICsyODMsMTIgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGVudV9mcmVlKHZvaWQgKm9wYXF1ZSwgdm9pZCAqZWxlbSkKK3sKKyAgICBhdl9mcmVlKGVsZW0pOworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGNhY2hlX2Nsb3NlKFVSTENvbnRleHQgKmgpCiB7CiAgICAgQ29udGV4dCAqYz0gaC0+cHJpdl9kYXRhOwpAQCAtMjkyLDYgKzI5OCw3IEBACiAKICAgICBjbG9zZShjLT5mZCk7CiAgICAgZmZ1cmxfY2xvc2UoYy0+aW5uZXIpOworICAgIGF2X3RyZWVfZW51bWVyYXRlKGMtPnJvb3QsIE5VTEwsIE5VTEwsIGVudV9mcmVlKTsKICAgICBhdl90cmVlX2Rlc3Ryb3koYy0+cm9vdCk7CiAKICAgICByZXR1cm4gMDsKQEAgLTMxMiw3ICszMTksNyBAQAogICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAotVVJMUHJvdG9jb2wgZmZfY2FjaGVfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9jYWNoZV9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJjYWNoZSIsCiAgICAgLnVybF9vcGVuMiAgICAgICAgICAgPSBjYWNoZV9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gY2FjaGVfcmVhZCwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2NhZi5jIGIvbGliYXZmb3JtYXQvY2FmLmMKaW5kZXggMDA4NTQ2MS4uZmUyNDJmZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvY2FmLmMKKysrIGIvbGliYXZmb3JtYXQvY2FmLmMKQEAgLTMzLDYgKzMzLDcgQEAKICAqLwogY29uc3QgQVZDb2RlY1RhZyBmZl9jb2RlY19jYWZfdGFnc1tdID0gewogICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICAgICAgICAgICBNS1RBRygnYScsJ2EnLCdjJywnICcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgICAgICAgICAgIE1LVEFHKCdhJywnYScsJ2MnLCdsJykgfSwKICAgICB7IEFWX0NPREVDX0lEX0FDMywgICAgICAgICAgICAgTUtUQUcoJ2EnLCdjJywnLScsJzMnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfQURQQ01fSU1BX1FULCAgICBNS1RBRygnaScsJ20nLCdhJywnNCcpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWLCAgIE1LVEFHKCdtJywncycsIDAsIDE3ICkgfSwKQEAgLTUxLDExICs1MiwxMiBAQAogICAgIHsgQVZfQ09ERUNfSURfTVAyLCAgICAgICAgICAgICBNS1RBRygnLicsJ20nLCdwJywnMicpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9NUDMsICAgICAgICAgICAgIE1LVEFHKCcuJywnbScsJ3AnLCczJykgfSwKICAgICB7IEFWX0NPREVDX0lEX01QMywgICAgICAgICAgICAgTUtUQUcoJ20nLCdzJywgMCAsJ1UnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfT1BVUywgICAgICAgICAgICBNS1RBRygnbycsJ3AnLCd1JywncycpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9QQ01fQUxBVywgICAgICAgIE1LVEFHKCdhJywnbCcsJ2EnLCd3JykgfSwKICAgICB7IEFWX0NPREVDX0lEX1BDTV9NVUxBVywgICAgICAgTUtUQUcoJ3UnLCdsJywnYScsJ3cnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUUNFTFAsICAgICAgICAgICBNS1RBRygnUScsJ2MnLCdsJywncCcpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9RRE0yLCAgICAgICAgICAgIE1LVEFHKCdRJywnRCcsJ00nLCcyJykgfSwKLSAgICB7IEFWX0NPREVDX0lEX1FETTIsICAgICAgICAgICAgTUtUQUcoJ1EnLCdEJywnTScsJ0MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUURNQywgICAgICAgICAgICBNS1RBRygnUScsJ0QnLCdNJywnQycpIH0sCiAgIC8qIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBjb2RlY3MgKi8KICAgLyp7IEFDLTMgb3ZlciBTL1BESUYgICAgICAgICAgTUtUQUcoJ2MnLCdhJywnYycsJzMnKSB9LCovCiAgIC8qeyBNUEVHNENFTFAgICAgICAgICAgICAgICAgIE1LVEFHKCdjJywnZScsJ2wnLCdwJykgfSwqLwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvY2FmZGVjLmMgYi9saWJhdmZvcm1hdC9jYWZkZWMuYwppbmRleCBiZmJiYjAyLi43NjUyZDllIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9jYWZkZWMuYworKysgYi9saWJhdmZvcm1hdC9jYWZkZWMuYwpAQCAtNjksMjkgKzY5LDI5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICAvKiBwYXJzZSBmb3JtYXQgZGVzY3JpcHRpb24gKi8KLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSBhdmlvX3JsMzIocGIpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICA9IGF2aW9fcmwzMihwYik7CiAgICAgZmxhZ3MgPSBhdmlvX3JiMzIocGIpOwogICAgIGNhZi0+Ynl0ZXNfcGVyX3BhY2tldCAgPSBhdmlvX3JiMzIocGIpOwotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBjYWYtPmJ5dGVzX3Blcl9wYWNrZXQ7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IGNhZi0+Ynl0ZXNfcGVyX3BhY2tldDsKICAgICBjYWYtPmZyYW1lc19wZXJfcGFja2V0ID0gYXZpb19yYjMyKHBiKTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19yYjMyKHBiKTsKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmIzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGF2aW9fcmIzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JiMzIocGIpOwogCiAgICAgLyogY2FsY3VsYXRlIGJpdCByYXRlIGZvciBjb25zdGFudCBzaXplIHBhY2tldHMgKi8KICAgICBpZiAoY2FmLT5mcmFtZXNfcGVyX3BhY2tldCA+IDAgJiYgY2FmLT5ieXRlc19wZXJfcGFja2V0ID4gMCkgewotICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gKHVpbnQ2NF90KXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiAodWludDY0X3QpY2FmLT5ieXRlc19wZXJfcGFja2V0ICogOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAodWludDY0X3QpY2FmLT5mcmFtZXNfcGVyX3BhY2tldDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9ICh1aW50NjRfdClzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICogKHVpbnQ2NF90KWNhZi0+Ynl0ZXNfcGVyX3BhY2tldCAqIDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKHVpbnQ2NF90KWNhZi0+ZnJhbWVzX3Blcl9wYWNrZXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSAwOwogICAgIH0KIAogICAgIC8qIGRldGVybWluZSBjb2RlYyAqLwotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBNS1RBRygnbCcsJ3AnLCdjJywnbScpKQotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfbW92X2dldF9scGNtX2NvZGVjX2lkKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlLCAoZmxhZ3MgXiAweDIpIHwgMHg0KTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ2wnLCdwJywnYycsJ20nKSkKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX21vdl9nZXRfbHBjbV9jb2RlY19pZChzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwgKGZsYWdzIF4gMHgyKSB8IDB4NCk7CiAgICAgZWxzZQotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2NhZl90YWdzLCBzdC0+Y29kZWMtPmNvZGVjX3RhZyk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfY2FmX3RhZ3MsIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPiBJTlRfTUFYIC0gQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CiAgICAgICAgIC8qIFRoZSBtYWdpYyBjb29raWUgZm9ybWF0IGZvciBBQUMgaXMgYW4gbXA0IGVzZHMgYXRvbS4KICAgICAgICAgICAgVGhlIGxhdmMgQUFDIGRlY29kZXIgcmVxdWlyZXMgdGhlIGRhdGEgZnJvbSB0aGUgY29kZWMgc3BlY2lmaWMKICAgICAgICAgICAgZGVzY3JpcHRpb24gYXMgZXh0cmFkYXRhIGlucHV0LiAqLwpAQCAtMTEzLDEzICsxMTMsMTMgQEAKICAgICAgICAgc3RydCA9IGF2aW9fdGVsbChwYik7CiAgICAgICAgIGZmX21vdl9yZWFkX2VzZHMocywgcGIpOwogICAgICAgICBza2lwID0gc2l6ZSAtIChhdmlvX3RlbGwocGIpIC0gc3RydCk7Ci0gICAgICAgIGlmIChza2lwIDwgMCB8fCAhc3QtPmNvZGVjLT5leHRyYWRhdGEgfHwKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgIGlmIChza2lwIDwgMCB8fCAhc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgfHwKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUFDKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBBQUMgbWFnaWMgY29va2llXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgICAgIGF2aW9fc2tpcChwYiwgc2tpcCk7Ci0gICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FMQUMpIHsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUxBQykgewogI2RlZmluZSBBTEFDX1BSRUFNQkxFIDEyCiAjZGVmaW5lIEFMQUNfSEVBREVSICAgMzYKICNkZWZpbmUgQUxBQ19ORVdfS1VLSSAyNApAQCAtMTM0LDggKzEzNCw4IEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogCi0gICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBBTEFDX0hFQURFUikpCisgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBBTEFDX0hFQURFUikpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgICAgIC8qIEZvciB0aGUgb2xkIHN0eWxlIGNvb2tpZSwgd2Ugc2tpcCAxMiBieXRlcywgdGhlbiByZWFkIDM2IGJ5dGVzLgpAQCAtMTQ1LDMwICsxNDUsMzggQEAKICAgICAgICAgaWYgKCFtZW1jbXAoJnByZWFtYmxlWzRdLCAiZnJtYWFsYWMiLCA4KSkgewogICAgICAgICAgICAgaWYgKHNpemUgPCBBTEFDX1BSRUFNQkxFICsgQUxBQ19IRUFERVIpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBBTEFDIG1hZ2ljIGNvb2tpZVxuIik7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIEFMQUNfSEVBREVSKSAhPSBBTEFDX0hFQURFUikgeworICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIEFMQUNfSEVBREVSKSAhPSBBTEFDX0hFQURFUikgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gcmVhZCBrdWtpIGhlYWRlclxuIik7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gQUxBQ19QUkVBTUJMRSAtIEFMQUNfSEVBREVSKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEsIDM2KTsKLSAgICAgICAgICAgIG1lbWNweSgmc3QtPmNvZGVjLT5leHRyYWRhdGFbNF0sICJhbGFjIiwgNCk7Ci0gICAgICAgICAgICBBVl9XQjMyKCZzdC0+Y29kZWMtPmV4dHJhZGF0YVs4XSwgMCk7Ci0gICAgICAgICAgICBtZW1jcHkoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhWzEyXSwgcHJlYW1ibGUsIDEyKTsKLSAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsICZzdC0+Y29kZWMtPmV4dHJhZGF0YVsyNF0sIEFMQUNfTkVXX0tVS0kgLSAxMikgIT0gQUxBQ19ORVdfS1VLSSAtIDEyKSB7CisgICAgICAgICAgICBBVl9XQjMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCAzNik7CisgICAgICAgICAgICBtZW1jcHkoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzRdLCAiYWxhYyIsIDQpOworICAgICAgICAgICAgQVZfV0IzMigmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbOF0sIDApOworICAgICAgICAgICAgbWVtY3B5KCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxMl0sIHByZWFtYmxlLCAxMik7CisgICAgICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCAmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMjRdLCBBTEFDX05FV19LVUtJIC0gMTIpICE9IEFMQUNfTkVXX0tVS0kgLSAxMikgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gcmVhZCBuZXcga3VraSBoZWFkZXJcbiIpOwotICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSAtIEFMQUNfTkVXX0tVS0kpOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKKyAgICAgICAgLy8gVGhlIGRhdGEgbGF5b3V0IGZvciBPcHVzIGlzIGN1cnJlbnRseSB1bmtub3duLCBzbyB3ZSBkbyBub3QgZXhwb3J0CisgICAgICAgIC8vIGV4dHJhZGF0YSBhdCBhbGwuIE11bHRpY2hhbm5lbCBzdHJlYW1zIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAibXVsdGljaGFubmVsIE9wdXMgaW4gQ0FGIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKICAgICB9IGVsc2UgewotICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIHBiLCBzaXplKSA8IDApCisgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsIHN0LT5jb2RlY3BhciwgcGIsIHNpemUpIDwgMCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCkBAIC0yNTcsNyArMjY1LDcgQEAKIAogICAgICAgICAvKiBzdG9wIGF0IGRhdGEgY2h1bmsgaWYgc2Vla2luZyBpcyBub3Qgc3VwcG9ydGVkIG9yCiAgICAgICAgICAgIGRhdGEgY2h1bmsgc2l6ZSBpcyB1bmtub3duICovCi0gICAgICAgIGlmIChmb3VuZF9kYXRhICYmIChjYWYtPmRhdGFfc2l6ZSA8IDAgfHwgIXBiLT5zZWVrYWJsZSkpCisgICAgICAgIGlmIChmb3VuZF9kYXRhICYmIChjYWYtPmRhdGFfc2l6ZSA8IDAgfHwgIShwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpKQogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgdGFnICA9IGF2aW9fcmIzMihwYik7CkBAIC0yNzEsNyArMjc5LDcgQEAKICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNCk7IC8qIGVkaXQgY291bnQgKi8KICAgICAgICAgICAgIGNhZi0+ZGF0YV9zdGFydCA9IGF2aW9fdGVsbChwYik7CiAgICAgICAgICAgICBjYWYtPmRhdGFfc2l6ZSAgPSBzaXplIDwgMCA/IC0xIDogc2l6ZSAtIDQ7Ci0gICAgICAgICAgICBpZiAoY2FmLT5kYXRhX3NpemUgPiAwICYmIHBiLT5zZWVrYWJsZSkKKyAgICAgICAgICAgIGlmIChjYWYtPmRhdGFfc2l6ZSA+IDAgJiYgKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGNhZi0+ZGF0YV9zaXplKTsKICAgICAgICAgICAgIGZvdW5kX2RhdGEgPSAxOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yOTgsMTEgKzMwNiw5IEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotI2RlZmluZSBfKHgpICgoeCkgPj0gJyAnID8gKHgpIDogJyAnKQogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICJza2lwcGluZyBDQUYgY2h1bms6ICUwOCJQUklYMzIiICglYyVjJWMlYyksIHNpemUgJSJQUklkNjQiXG4iLAotICAgICAgICAgICAgICAgIHRhZywgXyh0YWc+PjI0KSwgXygodGFnPj4xNikmMHhGRiksIF8oKHRhZz4+OCkmMHhGRiksIF8odGFnJjB4RkYpLCBzaXplKTsKLSN1bmRlZiBfCisgICAgICAgICAgICAgICAgICAgInNraXBwaW5nIENBRiBjaHVuazogJTA4IlBSSVgzMiIgKCVzKSwgc2l6ZSAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgdGFnLCBhdl9mb3VyY2Myc3RyKGF2X2Jzd2FwMzIodGFnKSksIHNpemUpOwogICAgICAgICBjYXNlIE1LQkVUQUcoJ2YnLCdyJywnZScsJ2UnKToKICAgICAgICAgICAgIGlmIChzaXplIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTMyMywxNSArMzI5LDIwIEBACiAgICAgICAgIGlmIChjYWYtPmRhdGFfc2l6ZSA+IDApCiAgICAgICAgICAgICBzdC0+bmJfZnJhbWVzID0gKGNhZi0+ZGF0YV9zaXplIC8gY2FmLT5ieXRlc19wZXJfcGFja2V0KSAqIGNhZi0+ZnJhbWVzX3Blcl9wYWNrZXQ7CiAgICAgfSBlbHNlIGlmIChzdC0+bmJfaW5kZXhfZW50cmllcyAmJiBzdC0+ZHVyYXRpb24gPiAwKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICogY2FmLT5kYXRhX3NpemUgKiA4IC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbjsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgJiYgY2FmLT5kYXRhX3NpemUgLyBzdC0+ZHVyYXRpb24gPiBJTlQ2NF9NQVggLyBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIC8gOCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk92ZXJmbG93IGR1cmluZyBiaXQgcmF0ZSBjYWxjdWxhdGlvbiAlZCAqIDggKiAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSwgY2FmLT5kYXRhX3NpemUgLyBzdC0+ZHVyYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKiA4TEwgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhZi0+ZGF0YV9zaXplIC8gc3QtPmR1cmF0aW9uKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBwYWNrZXQgdGFibGUuIEl0IGlzIHJlcXVpcmVkIHdoZW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmxvY2sgc2l6ZSBvciBmcmFtZSBzaXplIGFyZSB2YXJpYWJsZS5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIHN0LT5zdGFydF90aW1lID0gMDsKIAogICAgIC8qIHBvc2l0aW9uIHRoZSBzdHJlYW0gYXQgdGhlIHN0YXJ0IG9mIGRhdGEgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2NhZmVuYy5jIGIvbGliYXZmb3JtYXQvY2FmZW5jLmMKaW5kZXggNTQ0YmM0YS4uMGY3YzRlYiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvY2FmZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvY2FmZW5jLmMKQEAgLTgxLDEyICs4MSwxNSBAQAogICAgICAgICByZXR1cm4gMzIwOwogICAgIGNhc2UgQVZfQ09ERUNfSURfTVAxOgogICAgICAgICByZXR1cm4gMzg0OworICAgIGNhc2UgQVZfQ09ERUNfSURfT1BVUzoKKyAgICAgICAgcmV0dXJuIDk2MDsKICAgICBjYXNlIEFWX0NPREVDX0lEX01QMjoKICAgICBjYXNlIEFWX0NPREVDX0lEX01QMzoKICAgICAgICAgcmV0dXJuIDExNTI7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BQzM6CiAgICAgICAgIHJldHVybiAxNTM2OwogICAgIGNhc2UgQVZfQ09ERUNfSURfUURNMjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1FETUM6CiAgICAgICAgIHJldHVybiAyMDQ4ICogY2hhbm5lbHM7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BTEFDOgogICAgICAgICByZXR1cm4gNDA5NjsKQEAgLTEwMiwzNiArMTA1LDQxIEBACiBzdGF0aWMgaW50IGNhZl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgQ0FGQ29udGV4dCAqY2FmID0gcy0+cHJpdl9kYXRhOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKLSAgICB1bnNpZ25lZCBpbnQgY29kZWNfdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19jYWZfdGFncywgZW5jLT5jb2RlY19pZCk7CisgICAgdW5zaWduZWQgaW50IGNvZGVjX3RhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfY2FmX3RhZ3MsIHBhci0+Y29kZWNfaWQpOwogICAgIGludDY0X3QgY2h1bmtfc2l6ZSA9IDA7Ci0gICAgaW50IGZyYW1lX3NpemUgPSBlbmMtPmZyYW1lX3NpemU7CisgICAgaW50IGZyYW1lX3NpemUgPSBwYXItPmZyYW1lX3NpemU7CiAKICAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDQUYgZmlsZXMgaGF2ZSBleGFjdGx5IG9uZSBzdHJlYW1cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIHN3aXRjaCAoZW5jLT5jb2RlY19pZCkgeworICAgIHN3aXRjaCAocGFyLT5jb2RlY19pZCkgewogICAgIGNhc2UgQVZfQ09ERUNfSURfQUFDOgogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibXV4aW5nIGNvZGVjIGN1cnJlbnRseSB1bnN1cHBvcnRlZFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTICYmIHBhci0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPbmx5IG1vbm8gYW5kIHN0ZXJlbyBhcmUgc3VwcG9ydGVkIGZvciBPcHVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCiAgICAgaWYgKCFjb2RlY190YWcpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvZGVjXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKCFlbmMtPmJsb2NrX2FsaWduICYmICFwYi0+c2Vla2FibGUpIHsKKyAgICBpZiAoIXBhci0+YmxvY2tfYWxpZ24gJiYgIShwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk11eGluZyB2YXJpYWJsZSBwYWNrZXQgc2l6ZSBub3Qgc3VwcG9ydGVkIG9uIG5vbiBzZWVrYWJsZSBvdXRwdXRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBpZiAoZW5jLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUDMgfHwgZnJhbWVfc2l6ZSAhPSA1NzYpCi0gICAgICAgIGZyYW1lX3NpemUgPSBzYW1wbGVzX3Blcl9wYWNrZXQoZW5jLT5jb2RlY19pZCwgZW5jLT5jaGFubmVscywgZW5jLT5ibG9ja19hbGlnbik7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVAzIHx8IGZyYW1lX3NpemUgIT0gNTc2KQorICAgICAgICBmcmFtZV9zaXplID0gc2FtcGxlc19wZXJfcGFja2V0KHBhci0+Y29kZWNfaWQsIHBhci0+Y2hhbm5lbHMsIHBhci0+YmxvY2tfYWxpZ24pOwogCiAgICAgZmZpb193Zm91cmNjKHBiLCAiY2FmZiIpOyAvLzwgbUZpbGVUeXBlCiAgICAgYXZpb193YjE2KHBiLCAxKTsgICAgICAgICAvLzwgbUZpbGVWZXJzaW9uCkBAIC0xMzksMjYgKzE0NywyNiBAQAogCiAgICAgZmZpb193Zm91cmNjKHBiLCAiZGVzYyIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLzwgQXVkaW8gRGVzY3JpcHRpb24gY2h1bmsKICAgICBhdmlvX3diNjQocGIsIDMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vPCBtQ2h1bmtTaXplCi0gICAgYXZpb193YjY0KHBiLCBhdl9kb3VibGUyaW50KGVuYy0+c2FtcGxlX3JhdGUpKTsgICAvLzwgbVNhbXBsZVJhdGUKKyAgICBhdmlvX3diNjQocGIsIGF2X2RvdWJsZTJpbnQocGFyLT5zYW1wbGVfcmF0ZSkpOyAgIC8vPCBtU2FtcGxlUmF0ZQogICAgIGF2aW9fd2wzMihwYiwgY29kZWNfdGFnKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy88IG1Gb3JtYXRJRAotICAgIGF2aW9fd2IzMihwYiwgY29kZWNfZmxhZ3MoZW5jLT5jb2RlY19pZCkpOyAgICAgICAgLy88IG1Gb3JtYXRGbGFncwotICAgIGF2aW9fd2IzMihwYiwgZW5jLT5ibG9ja19hbGlnbik7ICAgICAgICAgICAgICAgICAgLy88IG1CeXRlc1BlclBhY2tldAorICAgIGF2aW9fd2IzMihwYiwgY29kZWNfZmxhZ3MocGFyLT5jb2RlY19pZCkpOyAgICAgICAgLy88IG1Gb3JtYXRGbGFncworICAgIGF2aW9fd2IzMihwYiwgcGFyLT5ibG9ja19hbGlnbik7ICAgICAgICAgICAgICAgICAgLy88IG1CeXRlc1BlclBhY2tldAogICAgIGF2aW9fd2IzMihwYiwgZnJhbWVfc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgLy88IG1GcmFtZXNQZXJQYWNrZXQKLSAgICBhdmlvX3diMzIocGIsIGVuYy0+Y2hhbm5lbHMpOyAgICAgICAgICAgICAgICAgICAgIC8vPCBtQ2hhbm5lbHNQZXJGcmFtZQotICAgIGF2aW9fd2IzMihwYiwgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShlbmMtPmNvZGVjX2lkKSk7IC8vPCBtQml0c1BlckNoYW5uZWwKKyAgICBhdmlvX3diMzIocGIsIHBhci0+Y2hhbm5lbHMpOyAgICAgICAgICAgICAgICAgICAgIC8vPCBtQ2hhbm5lbHNQZXJGcmFtZQorICAgIGF2aW9fd2IzMihwYiwgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShwYXItPmNvZGVjX2lkKSk7IC8vPCBtQml0c1BlckNoYW5uZWwKIAotICAgIGlmIChlbmMtPmNoYW5uZWxfbGF5b3V0KSB7CisgICAgaWYgKHBhci0+Y2hhbm5lbF9sYXlvdXQpIHsKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiY2hhbiIpOwogICAgICAgICBhdmlvX3diNjQocGIsIDEyKTsKLSAgICAgICAgZmZfbW92X3dyaXRlX2NoYW4ocGIsIGVuYy0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICBmZl9tb3Zfd3JpdGVfY2hhbihwYiwgcGFyLT5jaGFubmVsX2xheW91dCk7CiAgICAgfQogCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUxBQykgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FMQUMpIHsKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAia3VraSIpOwotICAgICAgICBhdmlvX3diNjQocGIsIDEyICsgZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIGF2aW9fd2I2NChwYiwgMTIgKyBwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgYXZpb193cml0ZShwYiwgIlwwXDBcMFwxNGZybWFhbGFjIiwgMTIpOwotICAgICAgICBhdmlvX3dyaXRlKHBiLCBlbmMtPmV4dHJhZGF0YSwgZW5jLT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgeworICAgICAgICBhdmlvX3dyaXRlKHBiLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgewogICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJrdWtpIik7CiAgICAgICAgIGF2aW9fd2I2NChwYiwgMjkpOwogICAgICAgICBhdmlvX3dyaXRlKHBiLCAiXDBcMFwwXDE0ZnJtYXNhbXIiLCAxMik7CkBAIC0xNjksMTIgKzE3NywxMyBAQAogICAgICAgICBhdmlvX3diMTYocGIsIDB4ODFGRik7IC8qIE1vZGUgc2V0IChhbGwgbW9kZXMgZm9yIEFNUl9OQikgKi8KICAgICAgICAgYXZpb193OChwYiwgMHgwMCk7IC8qIE1vZGUgY2hhbmdlIHBlcmlvZCAobm8gcmVzdHJpY3Rpb24pICovCiAgICAgICAgIGF2aW9fdzgocGIsIDB4MDEpOyAvKiBGcmFtZXMgcGVyIHNhbXBsZSAqLwotICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yKSB7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1FETTIgfHwgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE1DKSB7CiAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImt1a2kiKTsKLSAgICAgICAgYXZpb193YjY0KHBiLCBlbmMtPmV4dHJhZGF0YV9zaXplKTsKLSAgICAgICAgYXZpb193cml0ZShwYiwgZW5jLT5leHRyYWRhdGEsIGVuYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBhdmlvX3diNjQocGIsIHBhci0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAgICAgfQogCisgICAgZmZfc3RhbmRhcmRpemVfY3JlYXRpb25fdGltZShzKTsKICAgICBpZiAoYXZfZGljdF9jb3VudChzLT5tZXRhZGF0YSkpIHsKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiaW5mbyIpOyAvLzwgSW5mb3JtYXRpb24gY2h1bmsKICAgICAgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewpAQCAtMjAzLDcgKzIxMiw3IEBACiAgICAgQ0FGQ29udGV4dCAqY2FmID0gcy0+cHJpdl9kYXRhOwogCiAgICAgYXZpb193cml0ZShzLT5wYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOwotICAgIGlmICghcy0+c3RyZWFtc1swXS0+Y29kZWMtPmJsb2NrX2FsaWduKSB7CisgICAgaWYgKCFzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pIHsKICAgICAgICAgdm9pZCAqcGt0X3NpemVzID0gY2FmLT5wa3Rfc2l6ZXM7CiAgICAgICAgIGludCBpLCBhbGxvY19zaXplID0gY2FmLT5zaXplX2VudHJpZXNfdXNlZCArIDU7CiAgICAgICAgIGlmIChhbGxvY19zaXplIDwgMCkgewpAQCAtMjMyLDE5ICsyNDEsMTkgQEAKIHsKICAgICBDQUZDb250ZXh0ICpjYWYgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKIAotICAgIGlmIChwYi0+c2Vla2FibGUpIHsKKyAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgaW50NjRfdCBmaWxlX3NpemUgPSBhdmlvX3RlbGwocGIpOwogCiAgICAgICAgIGF2aW9fc2VlayhwYiwgY2FmLT5kYXRhLCBTRUVLX1NFVCk7CiAgICAgICAgIGF2aW9fd2I2NChwYiwgZmlsZV9zaXplIC0gY2FmLT5kYXRhIC0gOCk7CiAgICAgICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplLCBTRUVLX1NFVCk7Ci0gICAgICAgIGlmICghZW5jLT5ibG9ja19hbGlnbikgeworICAgICAgICBpZiAoIXBhci0+YmxvY2tfYWxpZ24pIHsKICAgICAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgInBha3QiKTsKICAgICAgICAgICAgIGF2aW9fd2I2NChwYiwgY2FmLT5zaXplX2VudHJpZXNfdXNlZCArIDI0KTsKICAgICAgICAgICAgIGF2aW9fd2I2NChwYiwgY2FmLT5wYWNrZXRzKTsgLy8vPCBtTnVtYmVyUGFja2V0cwotICAgICAgICAgICAgYXZpb193YjY0KHBiLCBjYWYtPnBhY2tldHMgKiBzYW1wbGVzX3Blcl9wYWNrZXQoZW5jLT5jb2RlY19pZCwgZW5jLT5jaGFubmVscywgZW5jLT5ibG9ja19hbGlnbikpOyAvLy88IG1OdW1iZXJWYWxpZEZyYW1lcworICAgICAgICAgICAgYXZpb193YjY0KHBiLCBjYWYtPnBhY2tldHMgKiBzYW1wbGVzX3Blcl9wYWNrZXQocGFyLT5jb2RlY19pZCwgcGFyLT5jaGFubmVscywgcGFyLT5ibG9ja19hbGlnbikpOyAvLy88IG1OdW1iZXJWYWxpZEZyYW1lcwogICAgICAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLy8vPCBtUHJpbWluZ0ZyYW1lcwogICAgICAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLy8vPCBtUmVtYWluZGVyRnJhbWVzCiAgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBjYWYtPnBrdF9zaXplcywgY2FmLT5zaXplX2VudHJpZXNfdXNlZCk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9jZGcuYyBiL2xpYmF2Zm9ybWF0L2NkZy5jCmluZGV4IGIxZjEzN2YuLjA1Y2FjNmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2NkZy5jCisrKyBiL2xpYmF2Zm9ybWF0L2NkZy5jCkBAIC0zOSw4ICszOSw4IEBACiAgICAgaWYgKCF2c3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9DREdSQVBISUNTOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0NER1JBUEhJQ1M7CiAKICAgICAvLy8gNzUgc2VjdG9ycy9zZWMgKiA0IHBhY2tldHMvc2VjdG9yID0gMzAwIHBhY2tldHMvc2VjCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDMyLCAxLCAzMDApOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvY2R4bC5jIGIvbGliYXZmb3JtYXQvY2R4bC5jCmluZGV4IDNkODBiNDcuLjk0YTA2M2MgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2NkeGwuYworKysgYi9saWJhdmZvcm1hdC9jZHhsLmMKQEAgLTExMSw3ICsxMTEsNyBAQAogICAgIHVpbnQzMl90IGN1cnJlbnRfc2l6ZSwgdmlkZW9fc2l6ZSwgaW1hZ2Vfc2l6ZTsKICAgICB1aW50MTZfdCBhdWRpb19zaXplLCBwYWxldHRlX3NpemUsIHdpZHRoLCBoZWlnaHQ7CiAgICAgaW50NjRfdCAgcG9zOwotICAgIGludCAgICAgIGZyYW1lcywgcmV0OworICAgIGludCAgICAgIGZvcm1hdCwgZnJhbWVzLCByZXQ7CiAKICAgICBpZiAoYXZpb19mZW9mKHBiKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwpAQCAtMTI1LDYgKzEyNSw3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAorICAgIGZvcm1hdCAgICAgICA9IGNkeGwtPmhlYWRlclsxXSAmIDB4RTA7CiAgICAgY3VycmVudF9zaXplID0gQVZfUkIzMigmY2R4bC0+aGVhZGVyWzJdKTsKICAgICB3aWR0aCAgICAgICAgPSBBVl9SQjE2KCZjZHhsLT5oZWFkZXJbMTRdKTsKICAgICBoZWlnaHQgICAgICAgPSBBVl9SQjE2KCZjZHhsLT5oZWFkZXJbMTZdKTsKQEAgLTEzMiw3ICsxMzMsMTAgQEAKICAgICBhdWRpb19zaXplICAgPSBBVl9SQjE2KCZjZHhsLT5oZWFkZXJbMjJdKTsKICAgICBpZiAoRkZBTElHTih3aWR0aCwgMTYpICogKHVpbnQ2NF90KWhlaWdodCAqIGNkeGwtPmhlYWRlclsxOV0gPiBJTlRfTUFYKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBpbWFnZV9zaXplICAgPSBGRkFMSUdOKHdpZHRoLCAxNikgKiBoZWlnaHQgKiBjZHhsLT5oZWFkZXJbMTldIC8gODsKKyAgICBpZiAoZm9ybWF0ID09IDB4MjApCisgICAgICAgIGltYWdlX3NpemUgPSB3aWR0aCAqIGhlaWdodCAqIGNkeGwtPmhlYWRlclsxOV0gLyA4OworICAgIGVsc2UKKyAgICAgICAgaW1hZ2Vfc2l6ZSA9IEZGQUxJR04od2lkdGgsIDE2KSAqIGhlaWdodCAqIGNkeGwtPmhlYWRlclsxOV0gLyA4OwogICAgIHZpZGVvX3NpemUgICA9IHBhbGV0dGVfc2l6ZSArIGltYWdlX3NpemU7CiAKICAgICBpZiAocGFsZXR0ZV9zaXplID4gNTEyKQpAQCAtMTQ2LDE3ICsxNTAsMTcgQEAKICAgICAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICAgID0gMDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TODsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgICA9IDA7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzg7CiAgICAgICAgICAgICBpZiAoY2R4bC0+aGVhZGVyWzFdICYgMHgxMCkgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAyOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgID0gY2R4bC0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgPSBjZHhsLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgICA9IDA7CiAgICAgICAgICAgICBjZHhsLT5hdWRpb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CiAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgY2R4bC0+c2FtcGxlX3JhdGUpOwpAQCAtMTc1LDExICsxNzksMTEgQEAKICAgICAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICAgID0gMDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICA9IEFWX0NPREVDX0lEX0NEWEw7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgICAgPSB3aWR0aDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICAgICA9IGhlaWdodDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgICA9IDA7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgPSBBVl9DT0RFQ19JRF9DRFhMOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgICAgID0gd2lkdGg7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgICAgPSBoZWlnaHQ7CiAKICAgICAgICAgICAgIGlmIChhdWRpb19zaXplICsgdmlkZW9fc2l6ZSAmJiBjZHhsLT5maWxlc2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICBmcmFtZXMgPSBjZHhsLT5maWxlc2l6ZSAvIChhdWRpb19zaXplICsgdmlkZW9fc2l6ZSk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9jaHJvbWFwcmludC5jIGIvbGliYXZmb3JtYXQvY2hyb21hcHJpbnQuYwppbmRleCA0ZDY3ZjQzLi5mMzljMDlkIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9jaHJvbWFwcmludC5jCisrKyBiL2xpYmF2Zm9ybWF0L2Nocm9tYXByaW50LmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCiAjaW5jbHVkZSA8Y2hyb21hcHJpbnQuaD4KQEAgLTM5LDE1ICs0MCwxOSBAQAogICAgIGludCBzaWxlbmNlX3RocmVzaG9sZDsKICAgICBpbnQgYWxnb3JpdGhtOwogICAgIEZpbmdlcnByaW50Rm9ybWF0IGZwX2Zvcm1hdDsKKyNpZiBDUFJfVkVSU0lPTl9JTlQgPj0gQVZfVkVSU0lPTl9JTlQoMSwgNCwgMCkKKyAgICBDaHJvbWFwcmludENvbnRleHQgKmN0eDsKKyNlbHNlCiAgICAgQ2hyb21hcHJpbnRDb250ZXh0IGN0eDsKKyNlbmRpZgogfSBDaHJvbWFwcmludE11eENvbnRleHQ7CiAKIHN0YXRpYyB2b2lkIGNsZWFudXAoQ2hyb21hcHJpbnRNdXhDb250ZXh0ICpjcHIpCiB7CiAgICAgaWYgKGNwci0+Y3R4KSB7Ci0gICAgICAgIGF2cHJpdl9sb2NrX2F2Zm9ybWF0KCk7CisgICAgICAgIGZmX2xvY2tfYXZmb3JtYXQoKTsKICAgICAgICAgY2hyb21hcHJpbnRfZnJlZShjcHItPmN0eCk7Ci0gICAgICAgIGF2cHJpdl91bmxvY2tfYXZmb3JtYXQoKTsKKyAgICAgICAgZmZfdW5sb2NrX2F2Zm9ybWF0KCk7CiAgICAgfQogfQogCkBAIC01Niw5ICs2MSw5IEBACiAgICAgQ2hyb21hcHJpbnRNdXhDb250ZXh0ICpjcHIgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZTdHJlYW0gKnN0OwogCi0gICAgYXZwcml2X2xvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl9sb2NrX2F2Zm9ybWF0KCk7CiAgICAgY3ByLT5jdHggPSBjaHJvbWFwcmludF9uZXcoY3ByLT5hbGdvcml0aG0pOwotICAgIGF2cHJpdl91bmxvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl91bmxvY2tfYXZmb3JtYXQoKTsKIAogICAgIGlmICghY3ByLT5jdHgpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgY2hyb21hcHJpbnQgY29udGV4dC5cbiIpOwpAQCAtODUsMTcgKzkwLDE3IEBACiAKICAgICBzdCA9IHMtPnN0cmVhbXNbMF07CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA+IDIpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IDIpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk9ubHkgdXAgdG8gMiBjaGFubmVscyBhcmUgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KIAotICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIDwgMTAwMCkgeworICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIDwgMTAwMCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU2FtcGxpbmcgcmF0ZSBtdXN0IGJlIGF0IGxlYXN0IDEwMDBcbiIpOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCi0gICAgaWYgKCFjaHJvbWFwcmludF9zdGFydChjcHItPmN0eCwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSwgc3QtPmNvZGVjLT5jaGFubmVscykpIHsKKyAgICBpZiAoIWNocm9tYXByaW50X3N0YXJ0KGNwci0+Y3R4LCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlLCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHN0YXJ0IGNocm9tYXByaW50XG4iKTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2NpbmVkZWMuYyBiL2xpYmF2Zm9ybWF0L2NpbmVkZWMuYwppbmRleCAzMTg0MDg0Li5kZTM0ZmI5IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9jaW5lZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvY2luZWRlYy5jCkBAIC0xMDEsOSArMTAxLDkgQEAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IDA7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICA9IDA7CiAKICAgICAvKiBDSU5FRklMRUhFQURFUiBzdHJ1Y3R1cmUgKi8KICAgICBhdmlvX3NraXAocGIsIDQpOyAvLyBUeXBlLCBIZWFkZXJzaXplCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICBjb21wcmVzc2lvbiA9IGF2aW9fcmwxNihwYik7CiAgICAgdmVyc2lvbiAgICAgPSBhdmlvX3JsMTYocGIpOwogICAgIGlmICh2ZXJzaW9uICE9IDEpIHsKLSAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidWtub3duIHZlcnNpb24gJWkiLCB2ZXJzaW9uKTsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAidW5rbm93biB2ZXJzaW9uICVpIiwgdmVyc2lvbik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIApAQCAtMTI3LDggKzEyNyw4IEBACiAgICAgLyogQklUTUFQSU5GT0hFQURFUiBzdHJ1Y3R1cmUgKi8KICAgICBhdmlvX3NlZWsocGIsIG9mZkltYWdlSGVhZGVyLCBTRUVLX1NFVCk7CiAgICAgYXZpb19za2lwKHBiLCA0KTsgLy9iaVNpemUKLSAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSBhdmlvX3JsMzIocGIpOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBhdmlvX3JsMzIocGIpOwogCiAgICAgaWYgKGF2aW9fcmwxNihwYikgIT0gMSkgLy8gYmlQbGFuZXMKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICAgICAgdmZsaXAgPSAwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDB4MTAwOiAvKiBCSV9QQUNLRUQgKi8KLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnQicsICdJJywgJ1QnLCAwKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBNS1RBRygnQicsICdJJywgJ1QnLCAwKTsKICAgICAgICAgdmZsaXAgPSAxOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtMTY3LDggKzE2Nyw4IEBACiAKICAgICBhdmlvX3NraXAocGIsIDYxNik7IC8vIEJpbm5pbmcgLi4gYkZsaXBICiAgICAgaWYgKCFhdmlvX3JsMzIocGIpIF4gdmZsaXApIHsKLSAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgID0gYXZfc3RyZHVwKCJCb3R0b21VcCIpOwotICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICA9IDk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICA9IGF2X3N0cmR1cCgiQm90dG9tVXAiKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSAgPSA5OwogICAgIH0KIAogICAgIGF2aW9fc2tpcChwYiwgNCk7IC8vIEdyaWQKQEAgLTE5MywxNyArMTkzLDE3IEBACiAgICAgc2V0X21ldGFkYXRhX2Zsb2F0KCZzdC0+bWV0YWRhdGEsICJ3YmdhaW5bMF0uYiIsIGF2X2ludDJmbG9hdChhdmlvX3JsMzIocGIpKSwgMSk7CiAgICAgYXZpb19za2lwKHBiLCAzNik7IC8vIFdCR2FpblsxXS4uIFdCVmlldwogCi0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMzIocGIpOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19ybDMyKHBiKTsKIAogICAgIGlmIChjb21wcmVzc2lvbiA9PSBDQ19SR0IpIHsKICAgICAgICAgaWYgKGJpQml0Q291bnQgPT0gOCkgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9HUkFZODsKICAgICAgICAgfSBlbHNlIGlmIChiaUJpdENvdW50ID09IDE2KSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxNkxFOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0dSQVkxNkxFOwogICAgICAgICB9IGVsc2UgaWYgKGJpQml0Q291bnQgPT0gMjQpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkdSMjQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfQkdSMjQ7CiAgICAgICAgIH0gZWxzZSBpZiAoYmlCaXRDb3VudCA9PSA0OCkgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9CR1I0OExFOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0JHUjQ4TEU7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bnN1cHBvcnRlZCBiaUJpdENvdW50ICVpIiwgYmlCaXRDb3VudCk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTIxMiw5ICsyMTIsOSBAQAogICAgICAgICBzd2l0Y2ggKENGQSAmIDB4RkZGRkZGKSB7CiAgICAgICAgIGNhc2UgQ0ZBX0JBWUVSOgogICAgICAgICAgICAgaWYgKGJpQml0Q291bnQgPT0gOCkgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkFZRVJfR0JSRzg7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0JBWUVSX0dCUkc4OwogICAgICAgICAgICAgfSBlbHNlIGlmIChiaUJpdENvdW50ID09IDE2KSB7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZMRTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfQkFZRVJfR0JSRzE2TEU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInVuc3VwcG9ydGVkIGJpQml0Q291bnQgJWkiLCBiaUJpdENvdW50KTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTIyMiw5ICsyMjIsOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZBX0JBWUVSRkxJUDoKICAgICAgICAgICAgIGlmIChiaUJpdENvdW50ID09IDgpIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JBWUVSX1JHR0I4OworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9CQVlFUl9SR0dCODsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmlCaXRDb3VudCA9PSAxNikgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2TEU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0JBWUVSX1JHR0IxNkxFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJ1bnN1cHBvcnRlZCBiaUJpdENvdW50ICVpIiwgYmlCaXRDb3VudCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC0yNjcsOCArMjY3LDEyIEBACiAKICAgICAvKiBwYXJzZSBpbWFnZSBvZmZzZXRzICovCiAgICAgYXZpb19zZWVrKHBiLCBvZmZJbWFnZU9mZnNldHMsIFNFRUtfU0VUKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPmR1cmF0aW9uOyBpKyspCisgICAgZm9yIChpID0gMDsgaSA8IHN0LT5kdXJhdGlvbjsgaSsrKSB7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBhdmlvX3JsNjQocGIpLCBpLCAwLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKKyAgICB9CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTMwNyw3ICszMTEsNyBAQAogICAgIGlmICgoZmxhZ3MgJiBBVlNFRUtfRkxBR19GUkFNRSkgfHwgKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAKLSAgICBpZiAoIWF2Y3R4LT5wYi0+c2Vla2FibGUpCisgICAgaWYgKCEoYXZjdHgtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAogICAgIGNpbmUtPnB0cyA9IHRpbWVzdGFtcDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2NvZGVjMi5jIGIvbGliYXZmb3JtYXQvY29kZWMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhkYmJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2NvZGVjMi5jCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogY29kZWMyIG11eGVyIGFuZCBkZW11eGVycworICogQ29weXJpZ2h0IChjKSAyMDE3IFRvbWFzIEjDpHJkaW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgImxpYmF2Y29kZWMvY29kZWMydXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJyYXdkZWMuaCIKKyNpbmNsdWRlICJyYXdlbmMuaCIKKyNpbmNsdWRlICJwY20uaCIKKworI2RlZmluZSBBVlBSSVZfQ09ERUMyX0hFQURFUl9TSVpFIDcKKyNkZWZpbmUgQVZQUklWX0NPREVDMl9NQUdJQyAgICAgICAweEMwREVDMgorCisvL3RoZSBsb3dlc3QgdmVyc2lvbiB3ZSBzaG91bGQgZXZlciBydW4gYWNyb3NzIGlzIDAuOAorLy93ZSBtYXkgcnVuIGFjcm9zcyBsYXRlciB2ZXJzaW9ucyBhcyB0aGUgZm9ybWF0IGV2b2x2ZXMKKyNkZWZpbmUgRVhQRUNURURfQ09ERUMyX01BSk9SX1ZFUlNJT04gMAorI2RlZmluZSBFWFBFQ1RFRF9DT0RFQzJfTUlOT1JfVkVSU0lPTiA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgZnJhbWVzX3Blcl9wYWNrZXQ7Cit9IENvZGVjMkNvbnRleHQ7CisKK3N0YXRpYyBpbnQgY29kZWMyX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIC8vbXVzdCBzdGFydCB3aWggQzAgREUgQzIKKyAgICBpZiAoQVZfUkIyNChwLT5idWYpICE9IEFWUFJJVl9DT0RFQzJfTUFHSUMpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy9ubyAuYzIgZmlsZXMgcHJpb3IgdG8gMC44CisgICAgLy9iZSBzdHJpY3QgYWJvdXQgbWFqb3IgdmVyc2lvbiB3aGlsZSB3ZSdyZSBhdCBpdAorICAgIGlmIChwLT5idWZbM10gIT0gRVhQRUNURURfQ09ERUMyX01BSk9SX1ZFUlNJT04gfHwKKyAgICAgICAgcC0+YnVmWzRdIDwgIEVYUEVDVEVEX0NPREVDMl9NSU5PUl9WRVJTSU9OKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vMzIgYml0cyBvZiBpZGVudGlmaWNhdGlvbiAtPiBsb3cgc2NvcmUKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworfQorCitzdGF0aWMgaW50IGNvZGVjMl9yZWFkX2hlYWRlcl9jb21tb24oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgaW50IG1vZGUgPSBhdnByaXZfY29kZWMyX21vZGVfZnJvbV9leHRyYWRhdGEoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworCisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgICAgID0gQVZfQ09ERUNfSURfQ09ERUMyOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgICAgPSA4MDAwOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgICAgPSAxOworICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICAgICAgICAgPSBBVl9TQU1QTEVfRk1UX1MxNjsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ICAgID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICAgICAgICA9IGF2cHJpdl9jb2RlYzJfbW9kZV9iaXRfcmF0ZShzLCBtb2RlKTsKKyAgICBzdC0+Y29kZWNwYXItPmZyYW1lX3NpemUgICAgICAgID0gYXZwcml2X2NvZGVjMl9tb2RlX2ZyYW1lX3NpemUocywgbW9kZSk7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAgICAgICA9IGF2cHJpdl9jb2RlYzJfbW9kZV9ibG9ja19hbGlnbihzLCBtb2RlKTsKKworICAgIGlmIChzdC0+Y29kZWNwYXItPmJpdF9yYXRlIDw9IDAgfHwKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5mcmFtZV9zaXplIDw9IDAgfHwKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA8PSAwKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvZGVjMl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpbnQgcmV0LCB2ZXJzaW9uOworCisgICAgaWYgKCFzdCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIGlmIChhdmlvX3JiMjQocy0+cGIpICE9IEFWUFJJVl9DT0RFQzJfTUFHSUMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm5vdCBhIC5jMiBmaWxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcmV0ID0gZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgQVZQUklWX0NPREVDMl9FWFRSQURBVEFfU0laRSk7CisgICAgaWYgKHJldCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IGZmaW9fcmVhZF9zaXplKHMtPnBiLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgQVZQUklWX0NPREVDMl9FWFRSQURBVEFfU0laRSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICB2ZXJzaW9uID0gYXZwcml2X2NvZGVjMl92ZXJzaW9uX2Zyb21fZXh0cmFkYXRhKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICBpZiAoKHZlcnNpb24gPj4gOCkgIT0gRVhQRUNURURfQ09ERUMyX01BSk9SX1ZFUlNJT04pIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIk1ham9yIHZlcnNpb24gJWkiLCB2ZXJzaW9uID4+IDgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgcy0+aW50ZXJuYWwtPmRhdGFfb2Zmc2V0ID0gQVZQUklWX0NPREVDMl9IRUFERVJfU0laRTsKKworICAgIHJldHVybiBjb2RlYzJfcmVhZF9oZWFkZXJfY29tbW9uKHMsIHN0KTsKK30KKworc3RhdGljIGludCBjb2RlYzJfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIENvZGVjMkNvbnRleHQgKmMyID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgaW50IHJldCwgc2l6ZSwgbiwgYmxvY2tfYWxpZ24sIGZyYW1lX3NpemU7CisKKyAgICBibG9ja19hbGlnbiA9IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ247CisgICAgZnJhbWVfc2l6ZSAgPSBzdC0+Y29kZWNwYXItPmZyYW1lX3NpemU7CisKKyAgICBpZiAoYmxvY2tfYWxpZ24gPD0gMCB8fCBmcmFtZV9zaXplIDw9IDAgfHwgYzItPmZyYW1lc19wZXJfcGFja2V0IDw9IDApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAvL3RyeSB0byByZWFkIGRlc2lyZWQgbnVtYmVyIG9mIGZyYW1lcywgY29tcHV0ZSBuIGZyb20gdG8gYWN0dWFsIG51bWJlciBvZiBieXRlcyByZWFkCisgICAgc2l6ZSA9IGMyLT5mcmFtZXNfcGVyX3BhY2tldCAqIGJsb2NrX2FsaWduOworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvL29ubHkgc2V0IGR1cmF0aW9uIC0gY29tcHV0ZV9wa3RfZmllbGRzKCkgYW5kIGZmX3BjbV9yZWFkX3NlZWsoKSB0YWtlcyBjYXJlIG9mIGV2ZXJ5dGhpbmcgZWxzZQorICAgIC8vdGVzdGVkIGJ5IHNwYW1taW5nIHRoZSBzZWVrIGZ1bmN0aW9uYWxpdHkgaW4gZmZwbGF5CisgICAgbiA9IHJldCAvIGJsb2NrX2FsaWduOworICAgIHBrdC0+ZHVyYXRpb24gPSBuICogZnJhbWVfc2l6ZTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29kZWMyX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSB8fCBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQ09ERUMyKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICIuYzIgZmlsZXMgbXVzdCBoYXZlIGV4YWN0bHkgb25lIGNvZGVjMiBzdHJlYW1cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHN0ID0gcy0+c3RyZWFtc1swXTsKKworICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICE9IEFWUFJJVl9DT0RFQzJfRVhUUkFEQVRBX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIi5jMiBmaWxlcyByZXF1aXJlIGV4YWN0bHkgJWkgYnl0ZXMgb2YgZXh0cmFkYXRhIChnb3QgJWkpXG4iLAorICAgICAgICAgICAgICAgQVZQUklWX0NPREVDMl9FWFRSQURBVEFfU0laRSwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZpb193YjI0KHMtPnBiLCBBVlBSSVZfQ09ERUMyX01BR0lDKTsKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgQVZQUklWX0NPREVDMl9FWFRSQURBVEFfU0laRSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjb2RlYzJyYXdfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIENvZGVjMkNvbnRleHQgKmMyID0gcy0+cHJpdl9kYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGMyLT5tb2RlIDwgMCkgeworICAgICAgICAvL0ZJWE1FOiB1c2luZyBhIGRlZmF1bHQgdmFsdWUgb2YgLTEgZm9yIG1hbmRhdG9yeSBvcHRpb25zIGlzIGFuIGluY3JlZGlibHkgdWdseSBoYWNrCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICItbW9kZSBtdXN0IGJlIHNldCBpbiBvcmRlciB0byBtYWtlIHNlbnNlIG9mIHJhdyBjb2RlYzIgZmlsZXNcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgcmV0ID0gZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgQVZQUklWX0NPREVDMl9FWFRSQURBVEFfU0laRSk7CisgICAgaWYgKHJldCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHMtPmludGVybmFsLT5kYXRhX29mZnNldCA9IDA7CisgICAgYXZwcml2X2NvZGVjMl9tYWtlX2V4dHJhZGF0YShzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgYzItPm1vZGUpOworCisgICAgcmV0dXJuIGNvZGVjMl9yZWFkX2hlYWRlcl9jb21tb24ocywgc3QpOworfQorCisvL3RyYW5zY29kaW5nIHJlcG9ydDIwNzQuYzIgdG8gd2F2IHdlbnQgZnJvbSA3LjM5MXMgdG8gNS4zMjJzIHdpdGggLWZyYW1lc19wZXJfcGFja2V0IDEwMDAgY29tcGFyZWQgdG8gZGVmYXVsdCwgc2FtZSBzaGExc3VtCisjZGVmaW5lIEZSQU1FU19QRVJfUEFDS0VUIFwKKyAgICB7ICJmcmFtZXNfcGVyX3BhY2tldCIsICJOdW1iZXIgb2YgZnJhbWVzIHRvIHJlYWQgYXQgYSB0aW1lLiBIaWdoZXIgPSBmYXN0ZXIgZGVjb2RpbmcsIGxvd2VyIGdyYW51bGFyaXR5IiwgXAorICAgICAgb2Zmc2V0b2YoQ29kZWMyQ29udGV4dCwgZnJhbWVzX3Blcl9wYWNrZXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNfQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gY29kZWMyX29wdGlvbnNbXSA9IHsKKyAgICBGUkFNRVNfUEVSX1BBQ0tFVCwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBjb2RlYzJyYXdfb3B0aW9uc1tdID0geworICAgIEFWUFJJVl9DT0RFQzJfQVZPUFRJT05TKCJjb2RlYzIgbW9kZSBbbWFuZGF0b3J5XSIsIENvZGVjMkNvbnRleHQsIC0xLCAtMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0pLAorICAgIEZSQU1FU19QRVJfUEFDS0VULAorICAgIHsgTlVMTCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY29kZWMyX211eF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJjb2RlYzIgbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERU1VWEVSLAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY29kZWMyX2RlbXV4X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImNvZGVjMiBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gY29kZWMyX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERU1VWEVSLAorfTsKKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgY29kZWMycmF3X2RlbXV4X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImNvZGVjMnJhdyBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gY29kZWMycmF3X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNhdGVnb3J5ICAgPSBBVl9DTEFTU19DQVRFR09SWV9ERU1VWEVSLAorfTsKKworI2lmIENPTkZJR19DT0RFQzJfREVNVVhFUgorQVZJbnB1dEZvcm1hdCBmZl9jb2RlYzJfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY29kZWMyIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiY29kZWMyIC5jMiBkZW11eGVyIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENvZGVjMkNvbnRleHQpLAorICAgIC5leHRlbnNpb25zICAgICA9ICJjMiIsCisgICAgLnJlYWRfcHJvYmUgICAgID0gY29kZWMyX3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGNvZGVjMl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBjb2RlYzJfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gZmZfcGNtX3JlYWRfc2VlaywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5yYXdfY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0NPREVDMiwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmY29kZWMyX2RlbXV4X2NsYXNzLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX0NPREVDMl9NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfY29kZWMyX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJjb2RlYzIiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJjb2RlYzIgLmMyIG11eGVyIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENvZGVjMkNvbnRleHQpLAorICAgIC5leHRlbnNpb25zICAgICA9ICJjMiIsCisgICAgLmF1ZGlvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfQ09ERUMyLAorICAgIC52aWRlb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgID0gY29kZWMyX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmY29kZWMyX211eF9jbGFzcywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19DT0RFQzJSQVdfREVNVVhFUgorQVZJbnB1dEZvcm1hdCBmZl9jb2RlYzJyYXdfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiY29kZWMycmF3IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IGNvZGVjMiBkZW11eGVyIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKENvZGVjMkNvbnRleHQpLAorICAgIC5yZWFkX2hlYWRlciAgICA9IGNvZGVjMnJhd19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBjb2RlYzJfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfc2VlayAgICAgID0gZmZfcGNtX3JlYWRfc2VlaywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorICAgIC5yYXdfY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0NPREVDMiwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmY29kZWMycmF3X2RlbXV4X2NsYXNzLAorfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvY29uY2F0LmMgYi9saWJhdmZvcm1hdC9jb25jYXQuYwppbmRleCA3YThlYjFiLi4xOWM4M2MzIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9jb25jYXQuYworKysgYi9saWJhdmZvcm1hdC9jb25jYXQuYwpAQCAtOTgsNyArOTgsNyBAQAogCiAgICAgICAgIC8qIGNyZWF0aW5nIFVSTENvbnRleHQgKi8KICAgICAgICAgZXJyID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJnVjLCBub2RlX3VyaSwgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsIGgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsIGgtPnByb3RvY29sX3doaXRlbGlzdCwgaC0+cHJvdG9jb2xfYmxhY2tsaXN0LCBoKTsKICAgICAgICAgaWYgKGVyciA8IDApCiAgICAgICAgICAgICBicmVhazsKIApAQCAtMTM1LDE5ICsxMzUsMjAgQEAKIAogICAgIHdoaWxlIChzaXplID4gMCkgewogICAgICAgICByZXN1bHQgPSBmZnVybF9yZWFkKG5vZGVzW2ldLnVjLCBidWYsIHNpemUpOwotICAgICAgICBpZiAocmVzdWx0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiB0b3RhbCA/IHRvdGFsIDogcmVzdWx0OwotICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICBpZiAocmVzdWx0ID09IEFWRVJST1JfRU9GKSB7CiAgICAgICAgICAgICBpZiAoaSArIDEgPT0gZGF0YS0+bGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgZmZ1cmxfc2Vlayhub2Rlc1srK2ldLnVjLCAwLCBTRUVLX1NFVCkgPCAwKQogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmVzdWx0ID0gMDsKICAgICAgICAgfQorICAgICAgICBpZiAocmVzdWx0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiB0b3RhbCA/IHRvdGFsIDogcmVzdWx0OwogICAgICAgICB0b3RhbCArPSByZXN1bHQ7CiAgICAgICAgIGJ1ZiAgICs9IHJlc3VsdDsKICAgICAgICAgc2l6ZSAgLT0gcmVzdWx0OwogICAgIH0KICAgICBkYXRhLT5jdXJyZW50ID0gaTsKLSAgICByZXR1cm4gdG90YWw7CisgICAgcmV0dXJuIHRvdGFsID8gdG90YWwgOiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQ2NF90IGNvbmNhdF9zZWVrKFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKQpAQCAtMTg2LDcgKzE4Nyw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotVVJMUHJvdG9jb2wgZmZfY29uY2F0X3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfY29uY2F0X3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJjb25jYXQiLAogICAgIC51cmxfb3BlbiAgICAgICA9IGNvbmNhdF9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICA9IGNvbmNhdF9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvY29uY2F0ZGVjLmMgYi9saWJhdmZvcm1hdC9jb25jYXRkZWMuYwppbmRleCBkMjI2ZTE1Li5iYmUxMzEzIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9jb25jYXRkZWMuYworKysgYi9saWJhdmZvcm1hdC9jb25jYXRkZWMuYwpAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKQEAgLTM0LDcgKzM1LDcgQEAKIH0gQ29uY2F0TWF0Y2hNb2RlOwogCiB0eXBlZGVmIHN0cnVjdCBDb25jYXRTdHJlYW0gewotICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmOworICAgIEFWQlNGQ29udGV4dCAqYnNmOwogICAgIGludCBvdXRfc3RyZWFtX2luZGV4OwogfSBDb25jYXRTdHJlYW07CiAKQEAgLTQ0LDYgKzQ1LDcgQEAKICAgICBpbnQ2NF90IGZpbGVfc3RhcnRfdGltZTsKICAgICBpbnQ2NF90IGZpbGVfaW5wb2ludDsKICAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIGludDY0X3QgbmV4dF9kdHM7CiAgICAgQ29uY2F0U3RyZWFtICpzdHJlYW1zOwogICAgIGludDY0X3QgaW5wb2ludDsKICAgICBpbnQ2NF90IG91dHBvaW50OwpAQCAtMTIwLDE1ICsxMjIsMTUgQEAKIAogICAgIHByb3RvID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUoZmlsZW5hbWUpOwogICAgIHByb3RvX2xlbiA9IHByb3RvID8gc3RybGVuKHByb3RvKSA6IDA7Ci0gICAgaWYgKCFtZW1jbXAoZmlsZW5hbWUsIHByb3RvLCBwcm90b19sZW4pICYmCisgICAgaWYgKHByb3RvICYmICFtZW1jbXAoZmlsZW5hbWUsIHByb3RvLCBwcm90b19sZW4pICYmCiAgICAgICAgIChmaWxlbmFtZVtwcm90b19sZW5dID09ICc6JyB8fCBmaWxlbmFtZVtwcm90b19sZW5dID09ICcsJykpIHsKICAgICAgICAgdXJsID0gZmlsZW5hbWU7CiAgICAgICAgIGZpbGVuYW1lID0gTlVMTDsKICAgICB9IGVsc2UgewotICAgICAgICB1cmxfbGVuID0gc3RybGVuKGF2Zi0+ZmlsZW5hbWUpICsgc3RybGVuKGZpbGVuYW1lKSArIDE2OworICAgICAgICB1cmxfbGVuID0gc3RybGVuKGF2Zi0+dXJsKSArIHN0cmxlbihmaWxlbmFtZSkgKyAxNjsKICAgICAgICAgaWYgKCEodXJsID0gYXZfbWFsbG9jKHVybF9sZW4pKSkKICAgICAgICAgICAgIEZBSUwoQVZFUlJPUihFTk9NRU0pKTsKLSAgICAgICAgZmZfbWFrZV9hYnNvbHV0ZV91cmwodXJsLCB1cmxfbGVuLCBhdmYtPmZpbGVuYW1lLCBmaWxlbmFtZSk7CisgICAgICAgIGZmX21ha2VfYWJzb2x1dGVfdXJsKHVybCwgdXJsX2xlbiwgYXZmLT51cmwsIGZpbGVuYW1lKTsKICAgICAgICAgYXZfZnJlZXAoJmZpbGVuYW1lKTsKICAgICB9CiAKQEAgLTE0OSw2ICsxNTEsNyBAQAogICAgIGZpbGUtPnVybCAgICAgICAgPSB1cmw7CiAgICAgZmlsZS0+c3RhcnRfdGltZSA9IEFWX05PUFRTX1ZBTFVFOwogICAgIGZpbGUtPmR1cmF0aW9uICAgPSBBVl9OT1BUU19WQUxVRTsKKyAgICBmaWxlLT5uZXh0X2R0cyAgID0gQVZfTk9QVFNfVkFMVUU7CiAgICAgZmlsZS0+aW5wb2ludCAgICA9IEFWX05PUFRTX1ZBTFVFOwogICAgIGZpbGUtPm91dHBvaW50ICAgPSBBVl9OT1BUU19WQUxVRTsKIApAQCAtMTY0LDIzICsxNjcsMjcgQEAKIHsKICAgICBpbnQgcmV0OwogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgfHwgIXNvdXJjZV9zdC0+Y29kZWMtPmNvZGVjX2lkKSB7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIDwgc291cmNlX3N0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpIHsKLSAgICAgICAgICAgIHJldCA9IGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX3N0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkIHx8ICFzb3VyY2Vfc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA8IHNvdXJjZV9zdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2Vfc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9Ci0gICAgICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgc291cmNlX3N0LT5jb2RlYy0+ZXh0cmFkYXRhLAotICAgICAgICAgICAgICAgc291cmNlX3N0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBtZW1jcHkoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHNvdXJjZV9zdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgIHNvdXJjZV9zdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGlmICgocmV0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzb3VyY2Vfc3QtPmNvZGVjKSkgPCAwKQorICAgIGlmICgocmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkoc3QtPmNvZGVjcGFyLCBzb3VyY2Vfc3QtPmNvZGVjcGFyKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIHN0LT5yX2ZyYW1lX3JhdGUgICAgICAgID0gc291cmNlX3N0LT5yX2ZyYW1lX3JhdGU7CiAgICAgc3QtPmF2Z19mcmFtZV9yYXRlICAgICAgPSBzb3VyY2Vfc3QtPmF2Z19mcmFtZV9yYXRlOwotICAgIHN0LT50aW1lX2Jhc2UgICAgICAgICAgID0gc291cmNlX3N0LT50aW1lX2Jhc2U7CiAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzb3VyY2Vfc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHNvdXJjZV9zdC0+dGltZV9iYXNlLm51bSwgc291cmNlX3N0LT50aW1lX2Jhc2UuZGVuKTsKIAogICAgIGF2X2RpY3RfY29weSgmc3QtPm1ldGFkYXRhLCBzb3VyY2Vfc3QtPm1ldGFkYXRhLCAwKTsKICAgICByZXR1cm4gMDsKQEAgLTE5MSwxOCArMTk4LDM5IEBACiAgICAgQ29uY2F0Q29udGV4dCAqY2F0ID0gYXZmLT5wcml2X2RhdGE7CiAgICAgQVZTdHJlYW0gKnN0ID0gY2F0LT5hdmYtPnN0cmVhbXNbaWR4XTsKICAgICBDb25jYXRTdHJlYW0gKmNzID0gJmNhdC0+Y3VyX2ZpbGUtPnN0cmVhbXNbaWR4XTsKLSAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZjsKKyAgICBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqZmlsdGVyOworICAgIEFWQlNGQ29udGV4dCAqYnNmOworICAgIGludCByZXQ7CiAKLSAgICBpZiAoY2F0LT5hdXRvX2NvbnZlcnQgJiYgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmCi0gICAgICAgIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIDwgNCB8fCBBVl9SQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhKSAhPSAxKSkgeworICAgIGlmIChjYXQtPmF1dG9fY29udmVydCAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID49IDMgJiYgQVZfUkIyNChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgPT0gMSkgfHwKKyAgICAgICAgICAgIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID49IDQgJiYgQVZfUkIzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgPT0gMSkpCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgYXZfbG9nKGNhdC0+YXZmLCBBVl9MT0dfSU5GTywKICAgICAgICAgICAgICAgICJBdXRvLWluc2VydGluZyBoMjY0X21wNHRvYW5uZXhiIGJpdHN0cmVhbSBmaWx0ZXJcbiIpOwotICAgICAgICBpZiAoIShic2YgPSBhdl9iaXRzdHJlYW1fZmlsdGVyX2luaXQoImgyNjRfbXA0dG9hbm5leGIiKSkpIHsKKyAgICAgICAgZmlsdGVyID0gYXZfYnNmX2dldF9ieV9uYW1lKCJoMjY0X21wNHRvYW5uZXhiIik7CisgICAgICAgIGlmICghZmlsdGVyKSB7CiAgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJoMjY0X21wNHRvYW5uZXhiIGJpdHN0cmVhbSBmaWx0ZXIgIgogICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBmb3IgSC4yNjQgc3RyZWFtc1xuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CU0ZfTk9UX0ZPVU5EOwogICAgICAgICB9CisgICAgICAgIHJldCA9IGF2X2JzZl9hbGxvYyhmaWx0ZXIsICZic2YpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIGNzLT5ic2YgPSBic2Y7CisKKyAgICAgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkoYnNmLT5wYXJfaW4sIHN0LT5jb2RlY3Bhcik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldCA9IGF2X2JzZl9pbml0KGJzZik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShzdC0+Y29kZWNwYXIsIGJzZi0+cGFyX291dCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yNjUsOCArMjkzLDExIEBACiAgICAgbWVtc2V0KG1hcCArIGNhdC0+Y3VyX2ZpbGUtPm5iX3N0cmVhbXMsIDAsCiAgICAgICAgICAgIChjYXQtPmF2Zi0+bmJfc3RyZWFtcyAtIGNhdC0+Y3VyX2ZpbGUtPm5iX3N0cmVhbXMpICogc2l6ZW9mKCptYXApKTsKIAotICAgIGZvciAoaSA9IGNhdC0+Y3VyX2ZpbGUtPm5iX3N0cmVhbXM7IGkgPCBjYXQtPmF2Zi0+bmJfc3RyZWFtczsgaSsrKQorICAgIGZvciAoaSA9IGNhdC0+Y3VyX2ZpbGUtPm5iX3N0cmVhbXM7IGkgPCBjYXQtPmF2Zi0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIG1hcFtpXS5vdXRfc3RyZWFtX2luZGV4ID0gLTE7CisgICAgICAgIGlmICgocmV0ID0gZGV0ZWN0X3N0cmVhbV9zcGVjaWZpYyhhdmYsIGkpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KICAgICBzd2l0Y2ggKGNhdC0+c3RyZWFtX21hdGNoX21vZGUpIHsKICAgICBjYXNlIE1BVENIX09ORV9UT19PTkU6CiAgICAgICAgIHJldCA9IG1hdGNoX3N0cmVhbXNfb25lX3RvX29uZShhdmYpOwpAQCAtMjc5LDkgKzMxMCw2IEBACiAgICAgfQogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwotICAgIGZvciAoaSA9IGNhdC0+Y3VyX2ZpbGUtPm5iX3N0cmVhbXM7IGkgPCBjYXQtPmF2Zi0+bmJfc3RyZWFtczsgaSsrKQotICAgICAgICBpZiAoKHJldCA9IGRldGVjdF9zdHJlYW1fc3BlY2lmaWMoYXZmLCBpKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICBjYXQtPmN1cl9maWxlLT5uYl9zdHJlYW1zID0gY2F0LT5hdmYtPm5iX3N0cmVhbXM7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yOTksOSArMzI3LDEwIEBACiAgICAgaWYgKCFjYXQtPmF2ZikKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAorICAgIGNhdC0+YXZmLT5mbGFncyB8PSBhdmYtPmZsYWdzICYgfkFWRk1UX0ZMQUdfQ1VTVE9NX0lPOwogICAgIGNhdC0+YXZmLT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSBhdmYtPmludGVycnVwdF9jYWxsYmFjazsKIAotICAgIGlmICgocmV0ID0gZmZfY29weV93aGl0ZWxpc3RzKGNhdC0+YXZmLCBhdmYpKSA8IDApCisgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlYmxhY2tsaXN0cyhjYXQtPmF2ZiwgYXZmKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgaWYgKChyZXQgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZjYXQtPmF2ZiwgZmlsZS0+dXJsLCBOVUxMLCBOVUxMKSkgPCAwIHx8CkBAIC0zMzgsMTUgKzM2NywxOSBAQAogc3RhdGljIGludCBjb25jYXRfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKmF2ZikKIHsKICAgICBDb25jYXRDb250ZXh0ICpjYXQgPSBhdmYtPnByaXZfZGF0YTsKLSAgICB1bnNpZ25lZCBpOworICAgIHVuc2lnbmVkIGksIGo7CiAKLSAgICBpZiAoY2F0LT5hdmYpCi0gICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZjYXQtPmF2Zik7CiAgICAgZm9yIChpID0gMDsgaSA8IGNhdC0+bmJfZmlsZXM7IGkrKykgewogICAgICAgICBhdl9mcmVlcCgmY2F0LT5maWxlc1tpXS51cmwpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2F0LT5maWxlc1tpXS5uYl9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChjYXQtPmZpbGVzW2ldLnN0cmVhbXNbal0uYnNmKQorICAgICAgICAgICAgICAgIGF2X2JzZl9mcmVlKCZjYXQtPmZpbGVzW2ldLnN0cmVhbXNbal0uYnNmKTsKKyAgICAgICAgfQogICAgICAgICBhdl9mcmVlcCgmY2F0LT5maWxlc1tpXS5zdHJlYW1zKTsKICAgICAgICAgYXZfZGljdF9mcmVlKCZjYXQtPmZpbGVzW2ldLm1ldGFkYXRhKTsKICAgICB9CisgICAgaWYgKGNhdC0+YXZmKQorICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmY2F0LT5hdmYpOwogICAgIGF2X2ZyZWVwKCZjYXQtPmZpbGVzKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTM1NCwxOCArMzg3LDE4IEBACiBzdGF0aWMgaW50IGNvbmNhdF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmF2ZikKIHsKICAgICBDb25jYXRDb250ZXh0ICpjYXQgPSBhdmYtPnByaXZfZGF0YTsKLSAgICB1aW50OF90IGJ1Zls0MDk2XTsKKyAgICBBVkJQcmludCBicDsKICAgICB1aW50OF90ICpjdXJzb3IsICprZXl3b3JkOwotICAgIGludCByZXQsIGxpbmUgPSAwLCBpOworICAgIGludCBsaW5lID0gMCwgaTsKICAgICB1bnNpZ25lZCBuYl9maWxlc19hbGxvYyA9IDA7CiAgICAgQ29uY2F0RmlsZSAqZmlsZSA9IE5VTEw7Ci0gICAgaW50NjRfdCB0aW1lID0gMDsKKyAgICBpbnQ2NF90IHJldCwgdGltZSA9IDA7CiAKLSAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9saW5lKGF2Zi0+cGIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKSA8PSAwKQotICAgICAgICAgICAgYnJlYWs7CisgICAgYXZfYnByaW50X2luaXQoJmJwLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgd2hpbGUgKChyZXQgPSBmZl9yZWFkX2xpbmVfdG9fYnByaW50X292ZXJ3cml0ZShhdmYtPnBiLCAmYnApKSA+PSAwKSB7CiAgICAgICAgIGxpbmUrKzsKLSAgICAgICAgY3Vyc29yID0gYnVmOworICAgICAgICBjdXJzb3IgPSBicC5zdHI7CiAgICAgICAgIGtleXdvcmQgPSBnZXRfa2V5d29yZCgmY3Vyc29yKTsKICAgICAgICAgaWYgKCEqa2V5d29yZCB8fCAqa2V5d29yZCA9PSAnIycpCiAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0MSw3ICs0NzQsNyBAQAogICAgICAgICAgICAgRkFJTChBVkVSUk9SX0lOVkFMSUREQVRBKTsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocmV0IDwgMCkKKyAgICBpZiAocmV0ICE9IEFWRVJST1JfRU9GICYmIHJldCA8IDApCiAgICAgICAgIGdvdG8gZmFpbDsKICAgICBpZiAoIWNhdC0+bmJfZmlsZXMpCiAgICAgICAgIEZBSUwoQVZFUlJPUl9JTlZBTElEREFUQSk7CkBAIC00NjcsOSArNTAwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVENIX09ORV9UT19PTkU7CiAgICAgaWYgKChyZXQgPSBvcGVuX2ZpbGUoYXZmLCAwKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZicCwgTlVMTCk7CiAgICAgcmV0dXJuIDA7CiAKIGZhaWw6CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZicCwgTlVMTCk7CiAgICAgY29uY2F0X3JlYWRfY2xvc2UoYXZmKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtNDc5LDggKzUxNCwxNCBAQAogICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOwogICAgIHVuc2lnbmVkIGZpbGVubyA9IGNhdC0+Y3VyX2ZpbGUgLSBjYXQtPmZpbGVzOwogCi0gICAgaWYgKGNhdC0+Y3VyX2ZpbGUtPmR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICBjYXQtPmN1cl9maWxlLT5kdXJhdGlvbiA9IGNhdC0+YXZmLT5kdXJhdGlvbiAtIChjYXQtPmN1cl9maWxlLT5maWxlX2lucG9pbnQgLSBjYXQtPmN1cl9maWxlLT5maWxlX3N0YXJ0X3RpbWUpOworICAgIGlmIChjYXQtPmN1cl9maWxlLT5kdXJhdGlvbiA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICBpZiAoY2F0LT5hdmYtPmR1cmF0aW9uID4gMCB8fCBjYXQtPmN1cl9maWxlLT5uZXh0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgY2F0LT5jdXJfZmlsZS0+ZHVyYXRpb24gPSBjYXQtPmF2Zi0+ZHVyYXRpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjYXQtPmN1cl9maWxlLT5kdXJhdGlvbiA9IGNhdC0+Y3VyX2ZpbGUtPm5leHRfZHRzOworICAgICAgICB9CisgICAgICAgIGNhdC0+Y3VyX2ZpbGUtPmR1cmF0aW9uIC09IChjYXQtPmN1cl9maWxlLT5maWxlX2lucG9pbnQgLSBjYXQtPmN1cl9maWxlLT5maWxlX3N0YXJ0X3RpbWUpOworICAgIH0KIAogICAgIGlmICgrK2ZpbGVubyA+PSBjYXQtPm5iX2ZpbGVzKSB7CiAgICAgICAgIGNhdC0+ZW9mID0gMTsKQEAgLTQ5MSw0MCArNTMyLDI1IEBACiAKIHN0YXRpYyBpbnQgZmlsdGVyX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2ZiwgQ29uY2F0U3RyZWFtICpjcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBBVlN0cmVhbSAqc3QgPSBhdmYtPnN0cmVhbXNbY3MtPm91dF9zdHJlYW1faW5kZXhdOwotICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmOwotICAgIEFWUGFja2V0IHBrdDI7CiAgICAgaW50IHJldDsKIAotICAgIGF2X2Fzc2VydDAoY3MtPm91dF9zdHJlYW1faW5kZXggPj0gMCk7Ci0gICAgZm9yIChic2YgPSBjcy0+YnNmOyBic2Y7IGJzZiA9IGJzZi0+bmV4dCkgewotICAgICAgICBwa3QyID0gKnBrdDsKLSAgICAgICAgcmV0ID0gYXZfYml0c3RyZWFtX2ZpbHRlcl9maWx0ZXIoYnNmLCBzdC0+Y29kZWMsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwa3QyLmRhdGEsICZwa3QyLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YSwgcGt0LT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIShwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSk7CisgICAgaWYgKGNzLT5ic2YpIHsKKyAgICAgICAgcmV0ID0gYXZfYnNmX3NlbmRfcGFja2V0KGNzLT5ic2YsIHBrdCk7CiAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJoMjY0X21wNHRvYW5uZXhiIGZpbHRlciAiCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzZW5kIGlucHV0IHBhY2tldFxuIik7CiAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KLSAgICAgICAgYXZfYXNzZXJ0MChwa3QyLmJ1Zik7Ci0gICAgICAgIGlmIChyZXQgPT0gMCAmJiBwa3QyLmRhdGEgIT0gcGt0LT5kYXRhKSB7Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGF2X2NvcHlfcGFja2V0KCZwa3QyLCBwa3QpKSA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9mcmVlKHBrdDIuZGF0YSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldCA9IDE7CisKKyAgICAgICAgd2hpbGUgKCFyZXQpCisgICAgICAgICAgICByZXQgPSBhdl9ic2ZfcmVjZWl2ZV9wYWNrZXQoY3MtPmJzZiwgcGt0KTsKKworICAgICAgICBpZiAocmV0IDwgMCAmJiAocmV0ICE9IEFWRVJST1IoRUFHQUlOKSAmJiByZXQgIT0gQVZFUlJPUl9FT0YpKSB7CisgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJoMjY0X21wNHRvYW5uZXhiIGZpbHRlciAiCisgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byByZWNlaXZlIG91dHB1dCBwYWNrZXRcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQotICAgICAgICBpZiAocmV0ID4gMCkgewotICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7Ci0gICAgICAgICAgICBwa3QyLmJ1ZiA9IGF2X2J1ZmZlcl9jcmVhdGUocGt0Mi5kYXRhLCBwa3QyLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfYnVmZmVyX2RlZmF1bHRfZnJlZSwgTlVMTCwgMCk7Ci0gICAgICAgICAgICBpZiAoIXBrdDIuYnVmKSB7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShwa3QyLmRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKnBrdCA9IHBrdDI7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtNTc3LDcgKzYwMyw2IEBACiAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gY3MtPm91dF9zdHJlYW1faW5kZXg7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoKHJldCA9IGZpbHRlcl9wYWNrZXQoYXZmLCBjcywgcGt0KSkpCkBAIC02MTIsNiArNjM3LDE1IEBACiAgICAgICAgIG1lbWNweShtZXRhZGF0YSwgcGFja2VkX21ldGFkYXRhLCBtZXRhZGF0YV9sZW4pOwogICAgICAgICBhdl9mcmVlcCgmcGFja2VkX21ldGFkYXRhKTsKICAgICB9CisKKyAgICBpZiAoY2F0LT5jdXJfZmlsZS0+ZHVyYXRpb24gPT0gQVZfTk9QVFNfVkFMVUUgJiYgc3QtPmN1cl9kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgaW50NjRfdCBuZXh0X2R0cyA9IGF2X3Jlc2NhbGVfcShzdC0+Y3VyX2R0cywgc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOworICAgICAgICBpZiAoY2F0LT5jdXJfZmlsZS0+bmV4dF9kdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgbmV4dF9kdHMgPiBjYXQtPmN1cl9maWxlLT5uZXh0X2R0cykgeworICAgICAgICAgICAgY2F0LT5jdXJfZmlsZS0+bmV4dF9kdHMgPSBuZXh0X2R0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gY3MtPm91dF9zdHJlYW1faW5kZXg7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtNjQ0LDcgKzY3OCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgcmVhbF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqYXZmLCBpbnQgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtaW5fdHMsIGludDY0X3QgdHMsIGludDY0X3QgbWF4X3RzLCBpbnQgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1pbl90cywgaW50NjRfdCB0cywgaW50NjRfdCBtYXhfdHMsIGludCBmbGFncywgQVZGb3JtYXRDb250ZXh0ICpjdXJfYXZmKQogewogICAgIENvbmNhdENvbnRleHQgKmNhdCA9IGF2Zi0+cHJpdl9kYXRhOwogICAgIGludCByZXQsIGxlZnQsIHJpZ2h0OwpAQCAtNjY2LDEzICs3MDAsMTkgQEAKICAgICAgICAgICAgIGxlZnQgID0gbWlkOwogICAgIH0KIAotICAgIGlmICgocmV0ID0gb3Blbl9maWxlKGF2ZiwgbGVmdCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoY2F0LT5jdXJfZmlsZSAhPSAmY2F0LT5maWxlc1tsZWZ0XSkgeworICAgICAgICBpZiAoKHJldCA9IG9wZW5fZmlsZShhdmYsIGxlZnQpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGNhdC0+YXZmID0gY3VyX2F2ZjsKKyAgICB9CiAKICAgICByZXQgPSB0cnlfc2VlayhhdmYsIHN0cmVhbSwgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7CiAgICAgaWYgKHJldCA8IDAgJiYKICAgICAgICAgbGVmdCA8IGNhdC0+bmJfZmlsZXMgLSAxICYmCiAgICAgICAgIGNhdC0+ZmlsZXNbbGVmdCArIDFdLnN0YXJ0X3RpbWUgPCBtYXhfdHMpIHsKKyAgICAgICAgaWYgKGNhdC0+Y3VyX2ZpbGUgPT0gJmNhdC0+ZmlsZXNbbGVmdF0pCisgICAgICAgICAgICBjYXQtPmF2ZiA9IE5VTEw7CiAgICAgICAgIGlmICgocmV0ID0gb3Blbl9maWxlKGF2ZiwgbGVmdCArIDEpKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICByZXQgPSB0cnlfc2VlayhhdmYsIHN0cmVhbSwgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncyk7CkBAIC02OTMsMTMgKzczMywxNyBAQAogICAgIGlmIChmbGFncyAmIChBVlNFRUtfRkxBR19CWVRFIHwgQVZTRUVLX0ZMQUdfRlJBTUUpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogICAgIGNhdC0+YXZmID0gTlVMTDsKLSAgICBpZiAoKHJldCA9IHJlYWxfc2VlayhhdmYsIHN0cmVhbSwgbWluX3RzLCB0cywgbWF4X3RzLCBmbGFncykpIDwgMCkgewotICAgICAgICBpZiAoY2F0LT5hdmYpCi0gICAgICAgICAgICBhdmZvcm1hdF9jbG9zZV9pbnB1dCgmY2F0LT5hdmYpOworICAgIGlmICgocmV0ID0gcmVhbF9zZWVrKGF2Ziwgc3RyZWFtLCBtaW5fdHMsIHRzLCBtYXhfdHMsIGZsYWdzLCBjdXJfYXZmX3NhdmVkKSkgPCAwKSB7CisgICAgICAgIGlmIChjYXQtPmN1cl9maWxlICE9IGN1cl9maWxlX3NhdmVkKSB7CisgICAgICAgICAgICBpZiAoY2F0LT5hdmYpCisgICAgICAgICAgICAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmNhdC0+YXZmKTsKKyAgICAgICAgfQogICAgICAgICBjYXQtPmF2ZiAgICAgID0gY3VyX2F2Zl9zYXZlZDsKICAgICAgICAgY2F0LT5jdXJfZmlsZSA9IGN1cl9maWxlX3NhdmVkOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZjdXJfYXZmX3NhdmVkKTsKKyAgICAgICAgaWYgKGNhdC0+Y3VyX2ZpbGUgIT0gY3VyX2ZpbGVfc2F2ZWQpIHsKKyAgICAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZjdXJfYXZmX3NhdmVkKTsKKyAgICAgICAgfQogICAgICAgICBjYXQtPmVvZiA9IDA7CiAgICAgfQogICAgIHJldHVybiByZXQ7CkBAIC03MTAsNyArNzU0LDcgQEAKIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICB7ICJzYWZlIiwgImVuYWJsZSBzYWZlIG1vZGUiLAotICAgICAgT0ZGU0VUKHNhZmUpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IC0xfSwgLTEsIDEsIERFQyB9LAorICAgICAgT0ZGU0VUKHNhZmUpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDF9LCAtMSwgMSwgREVDIH0sCiAgICAgeyAiYXV0b19jb252ZXJ0IiwgImF1dG9tYXRpY2FsbHkgY29udmVydCBiaXRzdHJlYW0gZm9ybWF0IiwKICAgICAgIE9GRlNFVChhdXRvX2NvbnZlcnQpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDF9LCAwLCAxLCBERUMgfSwKICAgICB7ICJzZWdtZW50X3RpbWVfbWV0YWRhdGEiLCAib3V0cHV0IGZpbGUgc2VnbWVudCBzdGFydCB0aW1lIGFuZCBkdXJhdGlvbiBhcyBwYWNrZXQgbWV0YWRhdGEiLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvY3J5cHRvLmMgYi9saWJhdmZvcm1hdC9jcnlwdG8uYwppbmRleCBiMTg3MWZlLi45YTQ4ZjJlIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9jcnlwdG8uYworKysgYi9saWJhdmZvcm1hdC9jcnlwdG8uYwpAQCAtMjYsNyArMjYsOCBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAidXJsLmgiCiAKLSNkZWZpbmUgTUFYX0JVRkZFUl9CTE9DS1MgMTUwCisvLyBlbmNvdXJhZ2UgcmVhZHMgb2YgNDA5NiBieXRlcyAtIDEgYmxvY2sgaXMgYWx3YXlzIHJldGFpbmVkLgorI2RlZmluZSBNQVhfQlVGRkVSX0JMT0NLUyAyNTcKICNkZWZpbmUgQkxPQ0tTSVpFIDE2CiAKIHR5cGVkZWYgc3RydWN0IENyeXB0b0NvbnRleHQgewpAQCAtMzYsNiArMzcsOCBAQAogICAgICAgICAgICAgb3V0YnVmZmVyW0JMT0NLU0laRSpNQVhfQlVGRkVSX0JMT0NLU107CiAgICAgdWludDhfdCAqb3V0cHRyOwogICAgIGludCBpbmRhdGEsIGluZGF0YV91c2VkLCBvdXRkYXRhOworICAgIGludDY0X3QgcG9zaXRpb247ICAvLyBwb3NpdGlvbiBpbiBmaWxlIC0gdXNlZCBpbiBzZWVrCisgICAgaW50IGZsYWdzOwogICAgIGludCBlb2Y7CiAgICAgdWludDhfdCAqa2V5OwogICAgIGludCBrZXlsZW47CkBAIC01MSwxMCArNTQsMTAgQEAKICAgICBpbnQgZW5jcnlwdF9pdmxlbjsKICAgICBzdHJ1Y3QgQVZBRVMgKmFlc19kZWNyeXB0OwogICAgIHN0cnVjdCBBVkFFUyAqYWVzX2VuY3J5cHQ7Ci0KKyAgICB1aW50OF90ICp3cml0ZV9idWY7CisgICAgdW5zaWduZWQgaW50IHdyaXRlX2J1Zl9zaXplOwogICAgIHVpbnQ4X3QgcGFkW0JMT0NLU0laRV07CiAgICAgaW50IHBhZF9sZW47Ci0KIH0gQ3J5cHRvQ29udGV4dDsKIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoQ3J5cHRvQ29udGV4dCwgeCkKQEAgLTc3LDE2ICs4MCwxNiBAQAogICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKIH07CiAKLXN0YXRpYyBpbnQgc2V0X2Flc19hcmcoQ3J5cHRvQ29udGV4dCAqYywgdWludDhfdCAqKmJ1ZiwgaW50ICpidWZfbGVuLAorc3RhdGljIGludCBzZXRfYWVzX2FyZyhVUkxDb250ZXh0ICpoLCB1aW50OF90ICoqYnVmLCBpbnQgKmJ1Zl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlZmF1bHRfYnVmLCBpbnQgZGVmYXVsdF9idWZfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXNjKQogewogICAgIGlmICghKmJ1Zl9sZW4pIHsKICAgICAgICAgaWYgKCFkZWZhdWx0X2J1Zl9sZW4pIHsKLSAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICIlcyBub3Qgc2V0XG4iLCBkZXNjKTsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICIlcyBub3Qgc2V0XG4iLCBkZXNjKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdF9idWZfbGVuICE9IEJMT0NLU0laRSkgewotICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgImludmFsaWQgJXMgc2l6ZSAoJWQgYnl0ZXMsIGJsb2NrIHNpemUgaXMgJWQpXG4iLAogICAgICAgICAgICAgICAgICAgIGRlc2MsIGRlZmF1bHRfYnVmX2xlbiwgQkxPQ0tTSVpFKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC05Niw3ICs5OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAqYnVmX2xlbiA9IGRlZmF1bHRfYnVmX2xlbjsKICAgICB9IGVsc2UgaWYgKCpidWZfbGVuICE9IEJMT0NLU0laRSkgewotICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLAorICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgImludmFsaWQgJXMgc2l6ZSAoJWQgYnl0ZXMsIGJsb2NrIHNpemUgaXMgJWQpXG4iLAogICAgICAgICAgICAgICAgZGVzYywgKmJ1Zl9sZW4sIEJMT0NLU0laRSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC0xMDksNiArMTEyLDcgQEAKICAgICBjb25zdCBjaGFyICpuZXN0ZWRfdXJsOwogICAgIGludCByZXQgPSAwOwogICAgIENyeXB0b0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgYy0+ZmxhZ3MgPSBmbGFnczsKIAogICAgIGlmICghYXZfc3Ryc3RhcnQodXJpLCAiY3J5cHRvKyIsICZuZXN0ZWRfdXJsKSAmJgogICAgICAgICAhYXZfc3Ryc3RhcnQodXJpLCAiY3J5cHRvOiIsICZuZXN0ZWRfdXJsKSkgewpAQCAtMTE4LDI3ICsxMjIsMjcgQEAKICAgICB9CiAKICAgICBpZiAoZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkgewotICAgICAgICBpZiAoKHJldCA9IHNldF9hZXNfYXJnKGMsICZjLT5kZWNyeXB0X2tleSwgJmMtPmRlY3J5cHRfa2V5bGVuLAorICAgICAgICBpZiAoKHJldCA9IHNldF9hZXNfYXJnKGgsICZjLT5kZWNyeXB0X2tleSwgJmMtPmRlY3J5cHRfa2V5bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmtleSwgYy0+a2V5bGVuLCAiZGVjcnlwdGlvbiBrZXkiKSkgPCAwKQogICAgICAgICAgICAgZ290byBlcnI7Ci0gICAgICAgIGlmICgocmV0ID0gc2V0X2Flc19hcmcoYywgJmMtPmRlY3J5cHRfaXYsICZjLT5kZWNyeXB0X2l2bGVuLAorICAgICAgICBpZiAoKHJldCA9IHNldF9hZXNfYXJnKGgsICZjLT5kZWNyeXB0X2l2LCAmYy0+ZGVjcnlwdF9pdmxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5pdiwgYy0+aXZsZW4sICJkZWNyeXB0aW9uIElWIikpIDwgMCkKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KIAogICAgIGlmIChmbGFncyAmIEFWSU9fRkxBR19XUklURSkgewotICAgICAgICBpZiAoKHJldCA9IHNldF9hZXNfYXJnKGMsICZjLT5lbmNyeXB0X2tleSwgJmMtPmVuY3J5cHRfa2V5bGVuLAorICAgICAgICBpZiAoKHJldCA9IHNldF9hZXNfYXJnKGgsICZjLT5lbmNyeXB0X2tleSwgJmMtPmVuY3J5cHRfa2V5bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmtleSwgYy0+a2V5bGVuLCAiZW5jcnlwdGlvbiBrZXkiKSkgPCAwKQogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICBpZiAoKHJldCA9IHNldF9hZXNfYXJnKGMsICZjLT5lbmNyeXB0X2l2LCAmYy0+ZW5jcnlwdF9pdmxlbiwKKyAgICAgICAgaWYgKChyZXQgPSBzZXRfYWVzX2FyZyhoLCAmYy0+ZW5jcnlwdF9pdiwgJmMtPmVuY3J5cHRfaXZsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+aXYsIGMtPml2bGVuLCAiZW5jcnlwdGlvbiBJViIpKSA8IDApCiAgICAgICAgICAgICBnb3RvIGVycjsKICAgICB9CiAKICAgICBpZiAoKHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZjLT5oZCwgbmVzdGVkX3VybCwgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0KSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaCkpIDwgMCkgewogICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG9wZW4gcmVzb3VyY2U6ICVzXG4iLCBuZXN0ZWRfdXJsKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgfQpAQCAtMTQ5LDkgKzE1MywxMyBAQAogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0KLSAgICAgICAgcmV0ID0gYXZfYWVzX2luaXQoYy0+YWVzX2RlY3J5cHQsIGMtPmRlY3J5cHRfa2V5LCBCTE9DS1NJWkUqOCwgMSk7CisgICAgICAgIHJldCA9IGF2X2Flc19pbml0KGMtPmFlc19kZWNyeXB0LCBjLT5kZWNyeXB0X2tleSwgQkxPQ0tTSVpFICogOCwgMSk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgZ290byBlcnI7CisKKyAgICAgICAgLy8gcGFzcyBiYWNrIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZXh0IHdlIG9wZW5uZWQKKyAgICAgICAgaWYgKGMtPmhkLT5pc19zdHJlYW1lZCkKKyAgICAgICAgICAgIGgtPmlzX3N0cmVhbWVkID0gYy0+aGQtPmlzX3N0cmVhbWVkOwogICAgIH0KIAogICAgIGlmIChmbGFncyAmIEFWSU9fRkxBR19XUklURSkgewpAQCAtMTYwLDE1ICsxNjgsMTQgQEAKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICB9Ci0gICAgICAgIHJldCA9IGF2X2Flc19pbml0KGMtPmFlc19lbmNyeXB0LCBjLT5lbmNyeXB0X2tleSwgQkxPQ0tTSVpFKjgsIDApOworICAgICAgICByZXQgPSBhdl9hZXNfaW5pdChjLT5hZXNfZW5jcnlwdCwgYy0+ZW5jcnlwdF9rZXksIEJMT0NLU0laRSAqIDgsIDApOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICAvLyBmb3Igd3JpdGUsIHdlIG11c3QgYmUgc3RyZWFtZWQKKyAgICAgICAgLy8gLSBsaW5lYXIgd3JpdGUgb25seSBmb3IgY3J5dHBvIGFlcy0xMjgtY2JjCisgICAgICAgIGgtPmlzX3N0cmVhbWVkID0gMTsKICAgICB9CiAKLSAgICBjLT5wYWRfbGVuID0gMDsKLQotICAgIGgtPmlzX3N0cmVhbWVkID0gMTsKLQogZXJyOgogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xODMsNiArMTkwLDcgQEAKICAgICAgICAgbWVtY3B5KGJ1ZiwgYy0+b3V0cHRyLCBzaXplKTsKICAgICAgICAgYy0+b3V0cHRyICArPSBzaXplOwogICAgICAgICBjLT5vdXRkYXRhIC09IHNpemU7CisgICAgICAgIGMtPnBvc2l0aW9uID0gYy0+cG9zaXRpb24gKyBzaXplOwogICAgICAgICByZXR1cm4gc2l6ZTsKICAgICB9CiAgICAgLy8gV2UgYXZvaWQgdXNpbmcgdGhlIGxhc3QgYmxvY2sgdW50aWwgd2UndmUgZm91bmQgRU9GLApAQCAtMjIyLDExICsyMzAsMTEwIEBACiAgICAgZ290byByZXRyeTsKIH0KIAorc3RhdGljIGludDY0X3QgY3J5cHRvX3NlZWsoVVJMQ29udGV4dCAqaCwgaW50NjRfdCBwb3MsIGludCB3aGVuY2UpCit7CisgICAgQ3J5cHRvQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IGJsb2NrOworICAgIGludDY0X3QgbmV3cG9zOworCisgICAgaWYgKGMtPmZsYWdzICYgQVZJT19GTEFHX1dSSVRFKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAiQ3J5cHRvOiBzZWVrIG5vdCBzdXBwb3J0ZWQgZm9yIHdyaXRlXHJcbiIpOworICAgICAgICAvKiBzZWVtcyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBlcnJvciB0byByZXR1cm4gKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRVNQSVBFKTsKKyAgICB9CisKKyAgICAvLyByZXNldCBlb2YsIGVsc2Ugd2Ugd29uJ3QgcmVhZCBpdCBjb3JyZWN0bHkgaWYgd2UgYWxyZWFkeSBoaXQgZW9mLgorICAgIGMtPmVvZiA9IDA7CisKKyAgICBzd2l0Y2ggKHdoZW5jZSkgeworICAgIGNhc2UgU0VFS19TRVQ6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0VFS19DVVI6CisgICAgICAgIHBvcyA9IHBvcyArIGMtPnBvc2l0aW9uOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFRUtfRU5EOiB7CisgICAgICAgIGludDY0X3QgbmV3cG9zID0gZmZ1cmxfc2VlayggYy0+aGQsIHBvcywgQVZTRUVLX1NJWkUgKTsKKyAgICAgICAgaWYgKG5ld3BvcyA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIkNyeXB0bzogc2Vla19lbmQgLSBjYW4ndCBnZXQgZmlsZSBzaXplIChwb3M9JWxsZClcclxuIiwgKGxvbmcgbG9uZyBpbnQpcG9zKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdwb3M7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gbmV3cG9zIC0gcG9zOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZTRUVLX1NJWkU6IHsKKyAgICAgICAgaW50NjRfdCBuZXdwb3MgPSBmZnVybF9zZWVrKCBjLT5oZCwgcG9zLCBBVlNFRUtfU0laRSApOworICAgICAgICByZXR1cm4gbmV3cG9zOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAiQ3J5cHRvOiBubyBzdXBwb3J0IGZvciBzZWVrIHdoZXJlICd3aGVuY2UnIGlzICVkXHJcbiIsIHdoZW5jZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYy0+b3V0ZGF0YSA9IDA7CisgICAgYy0+aW5kYXRhID0gMDsKKyAgICBjLT5pbmRhdGFfdXNlZCA9IDA7CisgICAgYy0+b3V0cHRyID0gYy0+b3V0YnVmZmVyOworCisgICAgLy8gaWRlbnRpZnkgdGhlIGJsb2NrIGNvbnRhaW5pbmcgdGhlIElWIGZvciB0aGUKKyAgICAvLyBuZXh0IGJsb2NrIHdlIHdpbGwgZGVjcnlwdAorICAgIGJsb2NrID0gcG9zL0JMT0NLU0laRTsKKyAgICBpZiAoYmxvY2sgPT0gMCkgeworICAgICAgICAvLyByZXN0b3JlIHRoZSBpdiB0byB0aGUgc2VlZCBvbmUgLSB0aGlzIGlzIHRoZSBpdiBmb3IgdGhlIEZJUlNUIGJsb2NrCisgICAgICAgIG1lbWNweSggYy0+ZGVjcnlwdF9pdiwgYy0+aXYsIGMtPml2bGVuICk7CisgICAgICAgIGMtPnBvc2l0aW9uID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBlbHNlLCBnbyBiYWNrIG9uZSBibG9jayAtIHdlIHdpbGwgZ2V0IGF2X2N5cnB0IHRvIHJlYWQgdGhpcyBibG9jaworICAgICAgICAvLyB3aGljaCBpdCB3aWxsIHRoZW4gc3RvcmUgdXNlIGFzIHRoZSBpdi4KKyAgICAgICAgLy8gbm90ZSB0aGF0IHRoZSBERUNSWVBURUQgcmVzdWx0IHdpbGwgbm90IGJlIGNvcnJlY3QsCisgICAgICAgIC8vIGJ1dCB3aWxsIGJlIGRpc2NhcmRlZAorICAgICAgICBibG9jay0tOworICAgICAgICBjLT5wb3NpdGlvbiA9IChibG9jayAqIEJMT0NLU0laRSk7CisgICAgfQorCisgICAgbmV3cG9zID0gZmZ1cmxfc2VlayggYy0+aGQsIGMtPnBvc2l0aW9uLCBTRUVLX1NFVCApOworICAgIGlmIChuZXdwb3MgPCAwKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAiQ3J5cHRvOiBuZXN0ZWQgcHJvdG9jb2wgbm8gc3VwcG9ydCBmb3Igc2VlayBvciBzZWVrIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBuZXdwb3M7CisgICAgfQorCisgICAgLy8gcmVhZCBhbmQgZGlzY2FyZCBmcm9tIGhlcmUgdXAgdG8gcmVxdWlyZWQgcG9zaXRpb24KKyAgICAvLyAod2hpY2ggd2lsbCBzZXQgdGhlIGl2IGNvcnJlY3RseSB0byBpdCkuCisgICAgaWYgKHBvcyAtIGMtPnBvc2l0aW9uKSB7CisgICAgICAgIHVpbnQ4X3QgYnVmZltCTE9DS1NJWkUqMl07IC8vIG1heGltdW0gc2l6ZSBvZiBwb3MtYy0+cG9zaXRpb24KKyAgICAgICAgaW50IGxlbiA9IHBvcyAtIGMtPnBvc2l0aW9uOworICAgICAgICBpbnQgcmVzOworCisgICAgICAgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgICAgICAgICAvLyBub3RlOiB0aGlzIG1heSBub3QgcmV0dXJuIGFsbCB0aGUgYnl0ZXMgZmlyc3QgdGltZQorICAgICAgICAgICAgcmVzID0gY3J5cHRvX3JlYWQoaCwgYnVmZiwgbGVuKTsKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbGVuIC09IHJlczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHdlIGRpZCBub3QgZ2V0IGFsbCB0aGUgYnl0ZXMKKyAgICAgICAgaWYgKGxlbiAhPSAwKSB7CisgICAgICAgICAgICBjaGFyIGVycmJ1ZlsxMDBdID0gInVua25vd24gZXJyb3IiOworICAgICAgICAgICAgYXZfc3RyZXJyb3IocmVzLCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIkNyeXB0bzogZGlzY2FyZCByZWFkIGRpZCBub3QgZ2V0IGFsbCB0aGUgYnl0ZXMgKCVkIHJlbWFpbikgLSByZWFkIHJldHVybmVkICglZCktJXNcbiIsCisgICAgICAgICAgICAgICAgbGVuLCByZXMsIGVycmJ1Zik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGMtPnBvc2l0aW9uOworfQorCiBzdGF0aWMgaW50IGNyeXB0b193cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBzaXplKQogewogICAgIENyeXB0b0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CiAgICAgaW50IHRvdGFsX3NpemUsIGJsb2NrcywgcGFkX2xlbiwgb3V0X3NpemU7Ci0gICAgdWludDhfdCAqb3V0X2J1ZjsKICAgICBpbnQgcmV0ID0gMDsKIAogICAgIHRvdGFsX3NpemUgPSBzaXplICsgYy0+cGFkX2xlbjsKQEAgLTIzNSwyMiArMzQyLDIzIEBACiAgICAgYmxvY2tzID0gb3V0X3NpemUgLyBCTE9DS1NJWkU7CiAKICAgICBpZiAob3V0X3NpemUpIHsKLSAgICAgICAgb3V0X2J1ZiA9IGF2X21hbGxvYyhvdXRfc2l6ZSk7Ci0gICAgICAgIGlmICghb3V0X2J1ZikKKyAgICAgICAgYXZfZmFzdF9tYWxsb2MoJmMtPndyaXRlX2J1ZiwgJmMtPndyaXRlX2J1Zl9zaXplLCBvdXRfc2l6ZSk7CisKKyAgICAgICAgaWYgKCFjLT53cml0ZV9idWYpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgICAgIGlmIChjLT5wYWRfbGVuKSB7CiAgICAgICAgICAgICBtZW1jcHkoJmMtPnBhZFtjLT5wYWRfbGVuXSwgYnVmLCBCTE9DS1NJWkUgLSBjLT5wYWRfbGVuKTsKLSAgICAgICAgICAgIGF2X2Flc19jcnlwdChjLT5hZXNfZW5jcnlwdCwgb3V0X2J1ZiwgYy0+cGFkLCAxLCBjLT5lbmNyeXB0X2l2LCAwKTsKKyAgICAgICAgICAgIGF2X2Flc19jcnlwdChjLT5hZXNfZW5jcnlwdCwgYy0+d3JpdGVfYnVmLCBjLT5wYWQsIDEsIGMtPmVuY3J5cHRfaXYsIDApOwogICAgICAgICAgICAgYmxvY2tzLS07CiAgICAgICAgIH0KIAotICAgICAgICBhdl9hZXNfY3J5cHQoYy0+YWVzX2VuY3J5cHQsICZvdXRfYnVmW2MtPnBhZF9sZW4gPyBCTE9DS1NJWkUgOiAwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZltjLT5wYWRfbGVuID8gQkxPQ0tTSVpFIC0gYy0+cGFkX2xlbjogMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrcywgYy0+ZW5jcnlwdF9pdiwgMCk7CisgICAgICAgIGF2X2Flc19jcnlwdChjLT5hZXNfZW5jcnlwdCwKKyAgICAgICAgICAgICAgICAgICAgICZjLT53cml0ZV9idWZbYy0+cGFkX2xlbiA/IEJMT0NLU0laRSA6IDBdLAorICAgICAgICAgICAgICAgICAgICAgJmJ1ZltjLT5wYWRfbGVuID8gQkxPQ0tTSVpFIC0gYy0+cGFkX2xlbiA6IDBdLAorICAgICAgICAgICAgICAgICAgICAgYmxvY2tzLCBjLT5lbmNyeXB0X2l2LCAwKTsKIAotICAgICAgICByZXQgPSBmZnVybF93cml0ZShjLT5oZCwgb3V0X2J1Ziwgb3V0X3NpemUpOwotICAgICAgICBhdl9mcmVlKG91dF9idWYpOworICAgICAgICByZXQgPSBmZnVybF93cml0ZShjLT5oZCwgYy0+d3JpdGVfYnVmLCBvdXRfc2l6ZSk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtMjY2LDI3ICszNzQsMjkgQEAKIHN0YXRpYyBpbnQgY3J5cHRvX2Nsb3NlKFVSTENvbnRleHQgKmgpCiB7CiAgICAgQ3J5cHRvQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKLSAgICB1aW50OF90IG91dF9idWZbQkxPQ0tTSVpFXTsKLSAgICBpbnQgcmV0LCBwYWQ7CisgICAgaW50IHJldCA9IDA7CiAKICAgICBpZiAoYy0+YWVzX2VuY3J5cHQpIHsKLSAgICAgICAgcGFkID0gQkxPQ0tTSVpFIC0gYy0+cGFkX2xlbjsKKyAgICAgICAgdWludDhfdCBvdXRfYnVmW0JMT0NLU0laRV07CisgICAgICAgIGludCBwYWQgPSBCTE9DS1NJWkUgLSBjLT5wYWRfbGVuOworCiAgICAgICAgIG1lbXNldCgmYy0+cGFkW2MtPnBhZF9sZW5dLCBwYWQsIHBhZCk7CiAgICAgICAgIGF2X2Flc19jcnlwdChjLT5hZXNfZW5jcnlwdCwgb3V0X2J1ZiwgYy0+cGFkLCAxLCBjLT5lbmNyeXB0X2l2LCAwKTsKLSAgICAgICAgaWYgKChyZXQgPSAgZmZ1cmxfd3JpdGUoYy0+aGQsIG91dF9idWYsIEJMT0NLU0laRSkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IGZmdXJsX3dyaXRlKGMtPmhkLCBvdXRfYnVmLCBCTE9DS1NJWkUpOwogICAgIH0KIAogICAgIGlmIChjLT5oZCkKICAgICAgICAgZmZ1cmxfY2xvc2UoYy0+aGQpOwogICAgIGF2X2ZyZWVwKCZjLT5hZXNfZGVjcnlwdCk7CiAgICAgYXZfZnJlZXAoJmMtPmFlc19lbmNyeXB0KTsKLSAgICByZXR1cm4gMDsKKyAgICBhdl9mcmVlcCgmYy0+d3JpdGVfYnVmKTsKKyAgICByZXR1cm4gcmV0OwogfQogCi1VUkxQcm90b2NvbCBmZl9jcnlwdG9fcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9jcnlwdG9fcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICA9ICJjcnlwdG8iLAogICAgIC51cmxfb3BlbjIgICAgICAgPSBjcnlwdG9fb3BlbjIsCisgICAgLnVybF9zZWVrICAgICAgICA9IGNyeXB0b19zZWVrLAogICAgIC51cmxfcmVhZCAgICAgICAgPSBjcnlwdG9fcmVhZCwKICAgICAudXJsX3dyaXRlICAgICAgID0gY3J5cHRvX3dyaXRlLAogICAgIC51cmxfY2xvc2UgICAgICAgPSBjcnlwdG9fY2xvc2UsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9kYXNoLmMgYi9saWJhdmZvcm1hdC9kYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1MDFmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2Rhc2guYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIE1QRUctREFTSCBJU08gQk1GRiBzZWdtZW50ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgSEFWRV9VTklTVERfSAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCisKKyNpbmNsdWRlICJhdmMuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImlzb20uaCIKKyNpbmNsdWRlICJvc19zdXBwb3J0LmgiCisjaW5jbHVkZSAidXJsLmgiCisjaW5jbHVkZSAiZGFzaC5oIgorCitzdGF0aWMgREFTSFRtcGxJZCBkYXNoX3JlYWRfdG1wbF9pZChjb25zdCBjaGFyICppZGVudGlmaWVyLCBjaGFyICpmb3JtYXRfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZvcm1hdF90YWdfc2l6ZSwgY29uc3QgY2hhciAqKnB0cikgeworICAgIGNvbnN0IGNoYXIgKm5leHRfcHRyOworICAgIERBU0hUbXBsSWQgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9VTkRFRklORUQ7CisKKyAgICBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiQkIiwgJm5leHRfcHRyKSkgeworICAgICAgICBpZF90eXBlID0gREFTSF9UTVBMX0lEX0VTQ0FQRTsKKyAgICAgICAgKnB0ciA9IG5leHRfcHRyOworICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiRSZXByZXNlbnRhdGlvbklEJCIsICZuZXh0X3B0cikpIHsKKyAgICAgICAgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9SRVBfSUQ7CisgICAgICAgIC8vIGRlZmF1bHQgdG8gYmFzaWMgZm9ybWF0LCBhcyAkUmVwcmVzZW50YXRpb25JRCQgaWRlbnRpZmllcnMKKyAgICAgICAgLy8gYXJlIG5vdCBhbGxvd2VkIHRvIGhhdmUgY3VzdG9tIGZvcm1hdC10YWdzLgorICAgICAgICBhdl9zdHJsY3B5KGZvcm1hdF90YWcsICIlZCIsIGZvcm1hdF90YWdfc2l6ZSk7CisgICAgICAgICpwdHIgPSBuZXh0X3B0cjsKKyAgICB9IGVsc2UgeyAvLyB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIG1heSBoYXZlIGFuIGV4cGxpY2l0IGZvcm1hdF90YWcKKyAgICAgICAgaWYgKGF2X3N0cnN0YXJ0KGlkZW50aWZpZXIsICIkTnVtYmVyIiwgJm5leHRfcHRyKSkKKyAgICAgICAgICAgIGlkX3R5cGUgPSBEQVNIX1RNUExfSURfTlVNQkVSOworICAgICAgICBlbHNlIGlmIChhdl9zdHJzdGFydChpZGVudGlmaWVyLCAiJEJhbmR3aWR0aCIsICZuZXh0X3B0cikpCisgICAgICAgICAgICBpZF90eXBlID0gREFTSF9UTVBMX0lEX0JBTkRXSURUSDsKKyAgICAgICAgZWxzZSBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiRUaW1lIiwgJm5leHRfcHRyKSkKKyAgICAgICAgICAgIGlkX3R5cGUgPSBEQVNIX1RNUExfSURfVElNRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9VTkRFRklORUQ7CisKKyAgICAgICAgLy8gbmV4dCBwYXJzZSB0aGUgZGFzaCBmb3JtYXQtdGFnIGFuZCBnZW5lcmF0ZSBhIGMtc3RyaW5nIGZvcm1hdCB0YWcKKyAgICAgICAgLy8gKG5leHRfcHRyIG5vdyBwb2ludHMgYXQgdGhlIGZpcnN0ICclJyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb3JtYXQtdGFnKQorICAgICAgICBpZiAoaWRfdHlwZSAhPSBEQVNIX1RNUExfSURfVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpudW1iZXJfZm9ybWF0ID0gKGlkX3R5cGUgPT0gREFTSF9UTVBMX0lEX1RJTUUpID8gUFJJZDY0IDogImQiOworICAgICAgICAgICAgaWYgKG5leHRfcHRyWzBdID09ICckJykgeyAvLyBubyBkYXNoIGZvcm1hdC10YWcKKyAgICAgICAgICAgICAgICBzbnByaW50Zihmb3JtYXRfdGFnLCBmb3JtYXRfdGFnX3NpemUsICIlJSVzIiwgbnVtYmVyX2Zvcm1hdCk7CisgICAgICAgICAgICAgICAgKnB0ciA9ICZuZXh0X3B0clsxXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2lkdGhfcHRyOworICAgICAgICAgICAgICAgIC8vIG9ubHkgdG9sZXJhdGUgc2luZ2xlLWRpZ2l0IHdpZHRoLWZpZWxkIChpLmUuIHVwIHRvIDktZGlnaXQgd2lkdGgpCisgICAgICAgICAgICAgICAgaWYgKGF2X3N0cnN0YXJ0KG5leHRfcHRyLCAiJTAiLCAmd2lkdGhfcHRyKSAmJgorICAgICAgICAgICAgICAgICAgICBhdl9pc2RpZ2l0KHdpZHRoX3B0clswXSkgJiYKKyAgICAgICAgICAgICAgICAgICAgYXZfc3Ryc3RhcnQoJndpZHRoX3B0clsxXSwgImQkIiwgJm5leHRfcHRyKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB5ZXMsIHdlJ3JlIHVzaW5nIGEgZm9ybWF0IHRhZyB0byBidWlsZCBmb3JtYXRfdGFnLgorICAgICAgICAgICAgICAgICAgICBzbnByaW50Zihmb3JtYXRfdGFnLCBmb3JtYXRfdGFnX3NpemUsICIlcyVjJXMiLCAiJTAiLCB3aWR0aF9wdHJbMF0sIG51bWJlcl9mb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAqcHRyID0gbmV4dF9wdHI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIHBhcnNlIGZvcm1hdC10YWcgYmVnaW5uaW5nIHdpdGggJXMuIEV4cGVjdGVkIGVpdGhlciBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xvc2luZyAnJCcgY2hhcmFjdGVyIG9yIGEgZm9ybWF0LXN0cmluZyBsaWtlICclJTBbd2lkdGhdZCcsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgd2lkdGggbXVzdCBiZSBhIHNpbmdsZSBkaWdpdFxuIiwgbmV4dF9wdHIpOworICAgICAgICAgICAgICAgICAgICBpZF90eXBlID0gREFTSF9UTVBMX0lEX1VOREVGSU5FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGlkX3R5cGU7Cit9CisKK3ZvaWQgZmZfZGFzaF9maWxsX3RtcGxfcGFyYW1zKGNoYXIgKmRzdCwgc2l6ZV90IGJ1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRlbXBsYXRlLCBpbnQgcmVwX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIGludCBiaXRfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWUpIHsKKyAgICBpbnQgZHN0X3BvcyA9IDA7CisgICAgY29uc3QgY2hhciAqdF9jdXIgPSB0ZW1wbGF0ZTsKKyAgICB3aGlsZSAoZHN0X3BvcyA8IGJ1ZmZlcl9zaXplIC0gMSAmJiAqdF9jdXIpIHsKKyAgICAgICAgY2hhciBmb3JtYXRfdGFnWzddOyAvLyBNYXkgYmUgIiVkIiwgIiUwWGQiLCBvciAiJTBYbGxkIiAoZm9yICRUaW1lJCksIHdoZXJlIFggaXMgaW4gWzAtOV0KKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBEQVNIVG1wbElkIGlkX3R5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgKnRfbmV4dCA9IHN0cmNocih0X2N1ciwgJyQnKTsgLy8gY29weSBvdmVyIGV2ZXJ5dGhpbmcgdXAgdG8gdGhlIGZpcnN0ICckJyBjaGFyYWN0ZXIKKyAgICAgICAgaWYgKHRfbmV4dCkgeworICAgICAgICAgICAgaW50IG51bV9jb3B5X2J5dGVzID0gRkZNSU4odF9uZXh0IC0gdF9jdXIsIGJ1ZmZlcl9zaXplIC0gZHN0X3BvcyAtIDEpOworICAgICAgICAgICAgYXZfc3RybGNweSgmZHN0W2RzdF9wb3NdLCB0X2N1ciwgbnVtX2NvcHlfYnl0ZXMgKyAxKTsKKyAgICAgICAgICAgIC8vIGFkdmFuY2UKKyAgICAgICAgICAgIGRzdF9wb3MgKz0gbnVtX2NvcHlfYnl0ZXM7CisgICAgICAgICAgICB0X2N1ciA9IHRfbmV4dDsKKyAgICAgICAgfSBlbHNlIHsgLy8gbm8gbW9yZSBEQVNIIGlkZW50aWZpZXJzIHRvIHN1YnN0aXR1dGUgLSBqdXN0IGNvcHkgdGhlIHJlc3Qgb3ZlciBhbmQgYnJlYWsKKyAgICAgICAgICAgIGF2X3N0cmxjcHkoJmRzdFtkc3RfcG9zXSwgdF9jdXIsIGJ1ZmZlcl9zaXplIC0gZHN0X3Bvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkc3RfcG9zID49IGJ1ZmZlcl9zaXplIC0gMSB8fCAhKnRfY3VyKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gdF9jdXIgaXMgbm93IHBvaW50aW5nIHRvIGEgJyQnIGNoYXJhY3RlcgorICAgICAgICBpZF90eXBlID0gZGFzaF9yZWFkX3RtcGxfaWQodF9jdXIsIGZvcm1hdF90YWcsIHNpemVvZihmb3JtYXRfdGFnKSwgJnRfbmV4dCk7CisgICAgICAgIHN3aXRjaCAoaWRfdHlwZSkgeworICAgICAgICBjYXNlIERBU0hfVE1QTF9JRF9FU0NBUEU6CisgICAgICAgICAgICBhdl9zdHJsY3B5KCZkc3RbZHN0X3Bvc10sICIkIiwgMik7CisgICAgICAgICAgICBuID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERBU0hfVE1QTF9JRF9SRVBfSUQ6CisgICAgICAgICAgICBuID0gc25wcmludGYoJmRzdFtkc3RfcG9zXSwgYnVmZmVyX3NpemUgLSBkc3RfcG9zLCBmb3JtYXRfdGFnLCByZXBfaWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREFTSF9UTVBMX0lEX05VTUJFUjoKKyAgICAgICAgICAgIG4gPSBzbnByaW50ZigmZHN0W2RzdF9wb3NdLCBidWZmZXJfc2l6ZSAtIGRzdF9wb3MsIGZvcm1hdF90YWcsIG51bWJlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEQVNIX1RNUExfSURfQkFORFdJRFRIOgorICAgICAgICAgICAgbiA9IHNucHJpbnRmKCZkc3RbZHN0X3Bvc10sIGJ1ZmZlcl9zaXplIC0gZHN0X3BvcywgZm9ybWF0X3RhZywgYml0X3JhdGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgREFTSF9UTVBMX0lEX1RJTUU6CisgICAgICAgICAgICBuID0gc25wcmludGYoJmRzdFtkc3RfcG9zXSwgYnVmZmVyX3NpemUgLSBkc3RfcG9zLCBmb3JtYXRfdGFnLCB0aW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERBU0hfVE1QTF9JRF9VTkRFRklORUQ6CisgICAgICAgICAgICAvLyBjb3B5IG92ZXIgb25lIGJ5dGUgYW5kIGFkdmFuY2UKKyAgICAgICAgICAgIGF2X3N0cmxjcHkoJmRzdFtkc3RfcG9zXSwgdF9jdXIsIDIpOworICAgICAgICAgICAgbiA9IDE7CisgICAgICAgICAgICB0X25leHQgPSAmdF9jdXJbMV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyB0X25leHQgcG9pbnRzIGp1c3QgcGFzdCB0aGUgcHJvY2Vzc2VkIGlkZW50aWZpZXIKKyAgICAgICAgLy8gbiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2VyZSBhdHRlbXB0ZWQgdG8gYmUgd3JpdHRlbiB0byBkc3QKKyAgICAgICAgLy8gKG1heSBoYXZlIGZhaWxlZCB0byB3cml0ZSBhbGwgYmVjYXVzZSBidWZmZXJfc2l6ZSkuCisKKyAgICAgICAgLy8gYWR2YW5jZQorICAgICAgICBkc3RfcG9zICs9IEZGTUlOKG4sIGJ1ZmZlcl9zaXplIC0gZHN0X3BvcyAtIDEpOworICAgICAgICB0X2N1ciA9IHRfbmV4dDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZGFzaC5oIGIvbGliYXZmb3JtYXQvZGFzaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ZDlkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9kYXNoLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIE1QRUctREFTSCBJU08gQk1GRiBzZWdtZW50ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWRk9STUFUX0RBU0hfSAorI2RlZmluZSBBVkZPUk1BVF9EQVNIX0gKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorCisvLyBTZWUgSVNPL0lFQyAyMzAwOS0xOjIwMTQgNS4zLjkuNC40Cit0eXBlZGVmIGVudW0geworICAgIERBU0hfVE1QTF9JRF9VTkRFRklORUQgPSAtMSwKKyAgICBEQVNIX1RNUExfSURfRVNDQVBFLAorICAgIERBU0hfVE1QTF9JRF9SRVBfSUQsCisgICAgREFTSF9UTVBMX0lEX05VTUJFUiwKKyAgICBEQVNIX1RNUExfSURfQkFORFdJRFRILAorICAgIERBU0hfVE1QTF9JRF9USU1FLAorfSBEQVNIVG1wbElkOworCisKK3ZvaWQgZmZfZGFzaF9maWxsX3RtcGxfcGFyYW1zKGNoYXIgKmRzdCwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSwgaW50IHJlcF9pZCwgaW50IG51bWJlciwgaW50IGJpdF9yYXRlLCBpbnQ2NF90IHRpbWUpOworCisjZW5kaWYgLyogQVZGT1JNQVRfREFTSF9IICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9kYXNoZGVjLmMgYi9saWJhdmZvcm1hdC9kYXNoZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUxMTU0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2Rhc2hkZWMuYwpAQCAtMCwwICsxLDIxODAgQEAKKy8qCisgKiBEeW5hbWljIEFkYXB0aXZlIFN0cmVhbWluZyBvdmVyIEhUVFAgZGVtdXgKKyAqIENvcHlyaWdodCAoYykgMjAxNyBzYW1zYW1zYW1AbzIucGwgYmFzZWQgb24gSExTIGRlbXV4CisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgU3RldmVuIExpdQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworI2luY2x1ZGUgPGxpYnhtbC9wYXJzZXIuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJkYXNoLmgiCisKKyNkZWZpbmUgSU5JVElBTF9CVUZGRVJfU0laRSAzMjc2OAorCitzdHJ1Y3QgZnJhZ21lbnQgeworICAgIGludDY0X3QgdXJsX29mZnNldDsKKyAgICBpbnQ2NF90IHNpemU7CisgICAgY2hhciAqdXJsOworfTsKKworLyoKKyAqIHJlZmVyZW5jZSB0byA6IElTT19JRUNfMjMwMDktMS1EQVNILTIwMTIKKyAqIFNlY3Rpb246IDUuMy45LjYuMgorICogVGFibGU6IFRhYmxlIDE3IOKAlCBTZW1hbnRpY3Mgb2YgU2VnbWVudFRpbWVsaW5lIGVsZW1lbnQKKyAqICovCitzdHJ1Y3QgdGltZWxpbmUgeworICAgIC8qIHN0YXJ0dGltZTogRWxlbWVudCBvciBBdHRyaWJ1dGUgTmFtZQorICAgICAqIHNwZWNpZmllcyB0aGUgTVBEIHN0YXJ0IHRpbWUsIGluIEB0aW1lc2NhbGUgdW5pdHMsCisgICAgICogdGhlIGZpcnN0IFNlZ21lbnQgaW4gdGhlIHNlcmllcyBzdGFydHMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgUGVyaW9kLgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3VtIG9mIHRoZSBwcmV2aW91cyBTCisgICAgICogZWxlbWVudCBlYXJsaWVzdCBwcmVzZW50YXRpb24gdGltZSBhbmQgdGhlIHN1bSBvZiB0aGUgY29udGlndW91cyBTZWdtZW50IGR1cmF0aW9ucy4KKyAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBpcyBncmVhdGVyIHRoYW4gd2hhdCBpcyBleHByZXNzZWQgYnkgdGhlIHByZXZpb3VzIFMgZWxlbWVudCwKKyAgICAgKiBpdCBleHByZXNzZXMgZGlzY29udGludWl0aWVzIGluIHRoZSB0aW1lbGluZS4KKyAgICAgKiBJZiBub3QgcHJlc2VudCB0aGVuIHRoZSB2YWx1ZSBzaGFsbCBiZSBhc3N1bWVkIHRvIGJlIHplcm8gZm9yIHRoZSBmaXJzdCBTIGVsZW1lbnQKKyAgICAgKiBhbmQgZm9yIHRoZSBzdWJzZXF1ZW50IFMgZWxlbWVudHMsIHRoZSB2YWx1ZSBzaGFsbCBiZSBhc3N1bWVkIHRvIGJlIHRoZSBzdW0gb2YKKyAgICAgKiB0aGUgcHJldmlvdXMgUyBlbGVtZW50J3MgZWFybGllc3QgcHJlc2VudGF0aW9uIHRpbWUgYW5kIGNvbnRpZ3VvdXMgZHVyYXRpb24KKyAgICAgKiAoaS5lLiBwcmV2aW91cyBTQHN0YXJ0dGltZSArIEBkdXJhdGlvbiAqIChAcmVwZWF0ICsgMSkpLgorICAgICAqICovCisgICAgaW50NjRfdCBzdGFydHRpbWU7CisgICAgLyogcmVwZWF0OiBFbGVtZW50IG9yIEF0dHJpYnV0ZSBOYW1lCisgICAgICogc3BlY2lmaWVzIHRoZSByZXBlYXQgY291bnQgb2YgdGhlIG51bWJlciBvZiBmb2xsb3dpbmcgY29udGlndW91cyBTZWdtZW50cyB3aXRoCisgICAgICogdGhlIHNhbWUgZHVyYXRpb24gZXhwcmVzc2VkIGJ5IHRoZSB2YWx1ZSBvZiBAZHVyYXRpb24uIFRoaXMgdmFsdWUgaXMgemVyby1iYXNlZAorICAgICAqIChlLmcuIGEgdmFsdWUgb2YgdGhyZWUgbWVhbnMgZm91ciBTZWdtZW50cyBpbiB0aGUgY29udGlndW91cyBzZXJpZXMpLgorICAgICAqICovCisgICAgaW50NjRfdCByZXBlYXQ7CisgICAgLyogZHVyYXRpb246IEVsZW1lbnQgb3IgQXR0cmlidXRlIE5hbWUKKyAgICAgKiBzcGVjaWZpZXMgdGhlIFNlZ21lbnQgZHVyYXRpb24sIGluIHVuaXRzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgQHRpbWVzY2FsZS4KKyAgICAgKiAqLworICAgIGludDY0X3QgZHVyYXRpb247Cit9OworCisvKgorICogRWFjaCBwbGF5bGlzdCBoYXMgaXRzIG93biBkZW11eGVyLiBJZiBpdCBpcyBjdXJyZW50bHkgYWN0aXZlLAorICogaXQgaGFzIGFuIG9wZW5lZCBBVklPQ29udGV4dCB0b28sIGFuZCBwb3RlbnRpYWxseSBhbiBBVlBhY2tldAorICogY29udGFpbmluZyB0aGUgbmV4dCBwYWNrZXQgZnJvbSB0aGlzIHN0cmVhbS4KKyAqLworc3RydWN0IHJlcHJlc2VudGF0aW9uIHsKKyAgICBjaGFyICp1cmxfdGVtcGxhdGU7CisgICAgQVZJT0NvbnRleHQgcGI7CisgICAgQVZJT0NvbnRleHQgKmlucHV0OworICAgIEFWRm9ybWF0Q29udGV4dCAqcGFyZW50OworICAgIEFWRm9ybWF0Q29udGV4dCAqY3R4OworICAgIEFWUGFja2V0IHBrdDsKKyAgICBpbnQgcmVwX2lkeDsKKyAgICBpbnQgcmVwX2NvdW50OworICAgIGludCBzdHJlYW1faW5kZXg7CisKKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGU7CisgICAgY2hhciBpZFsyMF07CisgICAgaW50IGJhbmR3aWR0aDsKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKKyAgICBBVlN0cmVhbSAqYXNzb2Nfc3RyZWFtOyAvKiBkZW11eGVyIHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXByZXNlbnRhdGlvbiAqLworCisgICAgaW50IG5fZnJhZ21lbnRzOworICAgIHN0cnVjdCBmcmFnbWVudCAqKmZyYWdtZW50czsgLyogVk9EIGxpc3Qgb2YgZnJhZ21lbnQgZm9yIHByb2ZpbGUgKi8KKworICAgIGludCBuX3RpbWVsaW5lczsKKyAgICBzdHJ1Y3QgdGltZWxpbmUgKip0aW1lbGluZXM7CisKKyAgICBpbnQ2NF90IGZpcnN0X3NlcV9ubzsKKyAgICBpbnQ2NF90IGxhc3Rfc2VxX25vOworICAgIGludDY0X3Qgc3RhcnRfbnVtYmVyOyAvKiB1c2VkIGluIGNhc2Ugd2hlbiB3ZSBoYXZlIGR5bmFtaWMgbGlzdCBvZiBzZWdtZW50IHRvIGtub3cgd2hpY2ggc2VnbWVudHMgYXJlIG5ldyBvbmUqLworCisgICAgaW50NjRfdCBmcmFnbWVudF9kdXJhdGlvbjsKKyAgICBpbnQ2NF90IGZyYWdtZW50X3RpbWVzY2FsZTsKKworICAgIGludDY0X3QgcHJlc2VudGF0aW9uX3RpbWVvZmZzZXQ7CisKKyAgICBpbnQ2NF90IGN1cl9zZXFfbm87CisgICAgaW50NjRfdCBjdXJfc2VnX29mZnNldDsKKyAgICBpbnQ2NF90IGN1cl9zZWdfc2l6ZTsKKyAgICBzdHJ1Y3QgZnJhZ21lbnQgKmN1cl9zZWc7CisKKyAgICAvKiBDdXJyZW50bHkgYWN0aXZlIE1lZGlhIEluaXRpYWxpemF0aW9uIFNlY3Rpb24gKi8KKyAgICBzdHJ1Y3QgZnJhZ21lbnQgKmluaXRfc2VjdGlvbjsKKyAgICB1aW50OF90ICppbml0X3NlY19idWY7CisgICAgdWludDMyX3QgaW5pdF9zZWNfYnVmX3NpemU7CisgICAgdWludDMyX3QgaW5pdF9zZWNfZGF0YV9sZW47CisgICAgdWludDMyX3QgaW5pdF9zZWNfYnVmX3JlYWRfb2Zmc2V0OworICAgIGludDY0X3QgY3VyX3RpbWVzdGFtcDsKKyAgICBpbnQgaXNfcmVzdGFydF9uZWVkZWQ7Cit9OworCit0eXBlZGVmIHN0cnVjdCBEQVNIQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgY2hhciAqYmFzZV91cmw7CisKKyAgICBpbnQgbl92aWRlb3M7CisgICAgc3RydWN0IHJlcHJlc2VudGF0aW9uICoqdmlkZW9zOworICAgIGludCBuX2F1ZGlvczsKKyAgICBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKiphdWRpb3M7CisKKyAgICAvKiBNZWRpYVByZXNlbnRhdGlvbkRlc2NyaXB0aW9uIEF0dHJpYnV0ZSAqLworICAgIHVpbnQ2NF90IG1lZGlhX3ByZXNlbnRhdGlvbl9kdXJhdGlvbjsKKyAgICB1aW50NjRfdCBzdWdnZXN0ZWRfcHJlc2VudGF0aW9uX2RlbGF5OworICAgIHVpbnQ2NF90IGF2YWlsYWJpbGl0eV9zdGFydF90aW1lOworICAgIHVpbnQ2NF90IHB1Ymxpc2hfdGltZTsKKyAgICB1aW50NjRfdCBtaW5pbXVtX3VwZGF0ZV9wZXJpb2Q7CisgICAgdWludDY0X3QgdGltZV9zaGlmdF9idWZmZXJfZGVwdGg7CisgICAgdWludDY0X3QgbWluX2J1ZmZlcl90aW1lOworCisgICAgLyogUGVyaW9kIEF0dHJpYnV0ZSAqLworICAgIHVpbnQ2NF90IHBlcmlvZF9kdXJhdGlvbjsKKyAgICB1aW50NjRfdCBwZXJpb2Rfc3RhcnQ7CisKKyAgICBpbnQgaXNfbGl2ZTsKKyAgICBBVklPSW50ZXJydXB0Q0IgKmludGVycnVwdF9jYWxsYmFjazsKKyAgICBjaGFyICp1c2VyX2FnZW50OyAgICAgICAgICAgICAgICAgICAgLy8vPCBob2xkcyBIVFRQIHVzZXIgYWdlbnQgc2V0IGFzIGFuIEFWT3B0aW9uIHRvIHRoZSBIVFRQIHByb3RvY29sIGNvbnRleHQKKyAgICBjaGFyICpjb29raWVzOyAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBob2xkcyBIVFRQIGNvb2tpZSB2YWx1ZXMgc2V0IGluIGVpdGhlciB0aGUgaW5pdGlhbCByZXNwb25zZSBvciBhcyBhbiBBVk9wdGlvbiB0byB0aGUgSFRUUCBwcm90b2NvbCBjb250ZXh0CisgICAgY2hhciAqaGVhZGVyczsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaG9sZHMgSFRUUCBoZWFkZXJzIHNldCBhcyBhbiBBVk9wdGlvbiB0byB0aGUgSFRUUCBwcm90b2NvbCBjb250ZXh0CisgICAgY2hhciAqYWxsb3dlZF9leHRlbnNpb25zOworICAgIEFWRGljdGlvbmFyeSAqYXZpb19vcHRzOworICAgIGludCBtYXhfdXJsX3NpemU7Cit9IERBU0hDb250ZXh0OworCitzdGF0aWMgaW50IGlzaHR0cChjaGFyICp1cmwpCit7CisgICAgY29uc3QgY2hhciAqcHJvdG9fbmFtZSA9IGF2aW9fZmluZF9wcm90b2NvbF9uYW1lKHVybCk7CisgICAgcmV0dXJuIGF2X3N0cnN0YXJ0KHByb3RvX25hbWUsICJodHRwIiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYWxpZ25lZChpbnQgdmFsKQoreworICAgIHJldHVybiAoKHZhbCArIDB4M0YpID4+IDYpIDw8IDY7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBnZXRfY3VycmVudF90aW1lX2luX3NlYyh2b2lkKQoreworICAgIHJldHVybiAgYXZfZ2V0dGltZSgpIC8gMTAwMDAwMDsKK30KKworc3RhdGljIHVpbnQ2NF90IGdldF91dGNfZGF0ZV90aW1lX2luc2VjKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqZGF0ZXRpbWUpCit7CisgICAgc3RydWN0IHRtIHRpbWVpbmZvOworICAgIGludCB5ZWFyID0gMDsKKyAgICBpbnQgbW9udGggPSAwOworICAgIGludCBkYXkgPSAwOworICAgIGludCBob3VyID0gMDsKKyAgICBpbnQgbWludXRlID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBmbG9hdCBzZWNvbmQgPSAwLjA7CisKKyAgICAvKiBJU08tODYwMSBkYXRlIHBhcnNlciAqLworICAgIGlmICghZGF0ZXRpbWUpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0ID0gc3NjYW5mKGRhdGV0aW1lLCAiJWQtJWQtJWRUJWQ6JWQ6JWZaIiwgJnllYXIsICZtb250aCwgJmRheSwgJmhvdXIsICZtaW51dGUsICZzZWNvbmQpOworICAgIC8qIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kICA2IGFyZ3VtZW50cyAqLworICAgIGlmIChyZXQgIT0gNikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJnZXRfdXRjX2RhdGVfdGltZV9pbnNlYyBnZXQgYSB3cm9uZyB0aW1lIGZvcm1hdFxuIik7CisgICAgfQorICAgIHRpbWVpbmZvLnRtX3llYXIgPSB5ZWFyIC0gMTkwMDsKKyAgICB0aW1laW5mby50bV9tb24gID0gbW9udGggLSAxOworICAgIHRpbWVpbmZvLnRtX21kYXkgPSBkYXk7CisgICAgdGltZWluZm8udG1faG91ciA9IGhvdXI7CisgICAgdGltZWluZm8udG1fbWluICA9IG1pbnV0ZTsKKyAgICB0aW1laW5mby50bV9zZWMgID0gKGludClzZWNvbmQ7CisKKyAgICByZXR1cm4gYXZfdGltZWdtKCZ0aW1laW5mbyk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBnZXRfZHVyYXRpb25faW5zZWMoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICpkdXJhdGlvbikKK3sKKyAgICAvKiBJU08tODYwMSBkdXJhdGlvbiBwYXJzZXIgKi8KKyAgICB1aW50MzJfdCBkYXlzID0gMDsKKyAgICB1aW50MzJfdCBob3VycyA9IDA7CisgICAgdWludDMyX3QgbWlucyA9IDA7CisgICAgdWludDMyX3Qgc2VjcyA9IDA7CisgICAgaW50IHNpemUgPSAwOworICAgIGZsb2F0IHZhbHVlID0gMDsKKyAgICBjaGFyIHR5cGUgPSAnXDAnOworICAgIGNvbnN0IGNoYXIgKnB0ciA9IGR1cmF0aW9uOworCisgICAgd2hpbGUgKCpwdHIpIHsKKyAgICAgICAgaWYgKCpwdHIgPT0gJ1AnIHx8ICpwdHIgPT0gJ1QnKSB7CisgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNzY2FuZihwdHIsICIlZiVjJW4iLCAmdmFsdWUsICZ0eXBlLCAmc2l6ZSkgIT0gMikgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiZ2V0X2R1cmF0aW9uX2luc2VjIGdldCBhIHdyb25nIHRpbWUgZm9ybWF0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOyAvKiBwYXJzZXIgZXJyb3IgKi8KKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIGRheXMgPSAodWludDMyX3QpdmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgICAgICBob3VycyA9ICh1aW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICAgIG1pbnMgPSAodWludDMyX3QpdmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICBzZWNzID0gKHVpbnQzMl90KXZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgaW52YWxpZCB0eXBlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcHRyICs9IHNpemU7CisgICAgfQorICAgIHJldHVybiAgKChkYXlzICogMjQgKyBob3VycykgKiA2MCArIG1pbnMpICogNjAgKyBzZWNzOworfQorCitzdGF0aWMgaW50NjRfdCBnZXRfc2VnbWVudF9zdGFydF90aW1lX2Jhc2VkX29uX3RpbWVsaW5lKHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzLCBpbnQ2NF90IGN1cl9zZXFfbm8pCit7CisgICAgaW50NjRfdCBzdGFydF90aW1lID0gMDsKKyAgICBpbnQ2NF90IGkgPSAwOworICAgIGludDY0X3QgaiA9IDA7CisgICAgaW50NjRfdCBudW0gPSAwOworCisgICAgaWYgKHBscy0+bl90aW1lbGluZXMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBscy0+bl90aW1lbGluZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHBscy0+dGltZWxpbmVzW2ldLT5zdGFydHRpbWUgPiAwKSB7CisgICAgICAgICAgICAgICAgc3RhcnRfdGltZSA9IHBscy0+dGltZWxpbmVzW2ldLT5zdGFydHRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobnVtID09IGN1cl9zZXFfbm8pCisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisKKyAgICAgICAgICAgIHN0YXJ0X3RpbWUgKz0gcGxzLT50aW1lbGluZXNbaV0tPmR1cmF0aW9uOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBscy0+dGltZWxpbmVzW2ldLT5yZXBlYXQ7IGorKykgeworICAgICAgICAgICAgICAgIG51bSsrOworICAgICAgICAgICAgICAgIGlmIChudW0gPT0gY3VyX3NlcV9ubykKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICAgICAgc3RhcnRfdGltZSArPSBwbHMtPnRpbWVsaW5lc1tpXS0+ZHVyYXRpb247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgfQorICAgIH0KK2ZpbmlzaDoKKyAgICByZXR1cm4gc3RhcnRfdGltZTsKK30KKworc3RhdGljIGludDY0X3QgY2FsY19uZXh0X3NlZ19ub19mcm9tX3RpbWVsaW5lcyhzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnBscywgaW50NjRfdCBjdXJfdGltZSkKK3sKKyAgICBpbnQ2NF90IGkgPSAwOworICAgIGludDY0X3QgaiA9IDA7CisgICAgaW50NjRfdCBudW0gPSAwOworICAgIGludDY0X3Qgc3RhcnRfdGltZSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxzLT5uX3RpbWVsaW5lczsgaSsrKSB7CisgICAgICAgIGlmIChwbHMtPnRpbWVsaW5lc1tpXS0+c3RhcnR0aW1lID4gMCkgeworICAgICAgICAgICAgc3RhcnRfdGltZSA9IHBscy0+dGltZWxpbmVzW2ldLT5zdGFydHRpbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXJ0X3RpbWUgPiBjdXJfdGltZSkKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworCisgICAgICAgIHN0YXJ0X3RpbWUgKz0gcGxzLT50aW1lbGluZXNbaV0tPmR1cmF0aW9uOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGxzLT50aW1lbGluZXNbaV0tPnJlcGVhdDsgaisrKSB7CisgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgICAgIGlmIChzdGFydF90aW1lID4gY3VyX3RpbWUpCisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICBzdGFydF90aW1lICs9IHBscy0+dGltZWxpbmVzW2ldLT5kdXJhdGlvbjsKKyAgICAgICAgfQorICAgICAgICBudW0rKzsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7CisKK2ZpbmlzaDoKKyAgICByZXR1cm4gbnVtOworfQorCitzdGF0aWMgdm9pZCBmcmVlX2ZyYWdtZW50KHN0cnVjdCBmcmFnbWVudCAqKnNlZykKK3sKKyAgICBpZiAoISgqc2VnKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF2X2ZyZWVwKCYoKnNlZyktPnVybCk7CisgICAgYXZfZnJlZXAoc2VnKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9mcmFnbWVudF9saXN0KHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBscy0+bl9mcmFnbWVudHM7IGkrKykgeworICAgICAgICBmcmVlX2ZyYWdtZW50KCZwbHMtPmZyYWdtZW50c1tpXSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZwbHMtPmZyYWdtZW50cyk7CisgICAgcGxzLT5uX2ZyYWdtZW50cyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdGltZWxpbmVzX2xpc3Qoc3RydWN0IHJlcHJlc2VudGF0aW9uICpwbHMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxzLT5uX3RpbWVsaW5lczsgaSsrKSB7CisgICAgICAgIGF2X2ZyZWVwKCZwbHMtPnRpbWVsaW5lc1tpXSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZwbHMtPnRpbWVsaW5lcyk7CisgICAgcGxzLT5uX3RpbWVsaW5lcyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcmVwcmVzZW50YXRpb24oc3RydWN0IHJlcHJlc2VudGF0aW9uICpwbHMpCit7CisgICAgZnJlZV9mcmFnbWVudF9saXN0KHBscyk7CisgICAgZnJlZV90aW1lbGluZXNfbGlzdChwbHMpOworICAgIGZyZWVfZnJhZ21lbnQoJnBscy0+Y3VyX3NlZyk7CisgICAgZnJlZV9mcmFnbWVudCgmcGxzLT5pbml0X3NlY3Rpb24pOworICAgIGF2X2ZyZWVwKCZwbHMtPmluaXRfc2VjX2J1Zik7CisgICAgYXZfZnJlZXAoJnBscy0+cGIuYnVmZmVyKTsKKyAgICBpZiAocGxzLT5pbnB1dCkKKyAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHBscy0+cGFyZW50LCAmcGxzLT5pbnB1dCk7CisgICAgaWYgKHBscy0+Y3R4KSB7CisgICAgICAgIHBscy0+Y3R4LT5wYiA9IE5VTEw7CisgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZwbHMtPmN0eCk7CisgICAgfQorCisgICAgYXZfZnJlZXAoJnBscy0+dXJsX3RlbXBsYXRlKTsKKyAgICBhdl9mcmVlcCgmcGxzKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV92aWRlb19saXN0KERBU0hDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3ZpZGVvczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzID0gYy0+dmlkZW9zW2ldOworICAgICAgICBmcmVlX3JlcHJlc2VudGF0aW9uKHBscyk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZjLT52aWRlb3MpOworICAgIGMtPm5fdmlkZW9zID0gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9hdWRpb19saXN0KERBU0hDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX2F1ZGlvczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzID0gYy0+YXVkaW9zW2ldOworICAgICAgICBmcmVlX3JlcHJlc2VudGF0aW9uKHBscyk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZjLT5hdWRpb3MpOworICAgIGMtPm5fYXVkaW9zID0gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2h0dHBoZWFkZXJfb3B0aW9ucyhEQVNIQ29udGV4dCAqYywgQVZEaWN0aW9uYXJ5ICoqb3B0cykKK3sKKyAgICAvLyBicm9rZXIgcHJpb3IgSFRUUCBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgYWNyb3NzIHJlcXVlc3RzCisgICAgYXZfZGljdF9zZXQob3B0cywgInVzZXItYWdlbnQiLCBjLT51c2VyX2FnZW50LCAwKTsKKyAgICBhdl9kaWN0X3NldChvcHRzLCAiY29va2llcyIsIGMtPmNvb2tpZXMsIDApOworICAgIGF2X2RpY3Rfc2V0KG9wdHMsICJoZWFkZXJzIiwgYy0+aGVhZGVycywgMCk7CisgICAgaWYgKGMtPmlzX2xpdmUpIHsKKyAgICAgICAgYXZfZGljdF9zZXQob3B0cywgInNlZWthYmxlIiwgIjAiLCAwKTsKKyAgICB9Cit9CitzdGF0aWMgdm9pZCB1cGRhdGVfb3B0aW9ucyhjaGFyICoqZGVzdCwgY29uc3QgY2hhciAqbmFtZSwgdm9pZCAqc3JjKQoreworICAgIGF2X2ZyZWVwKGRlc3QpOworICAgIGF2X29wdF9nZXQoc3JjLCBuYW1lLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOLCAodWludDhfdCoqKWRlc3QpOworICAgIGlmICgqZGVzdCkKKyAgICAgICAgYXZfZnJlZXAoZGVzdCk7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl91cmwoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqKnBiLCBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cywgQVZEaWN0aW9uYXJ5ICpvcHRzMiwgaW50ICppc19odHRwKQoreworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWRGljdGlvbmFyeSAqdG1wID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpwcm90b19uYW1lID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgYXZfZGljdF9jb3B5KCZ0bXAsIG9wdHMsIDApOworICAgIGF2X2RpY3RfY29weSgmdG1wLCBvcHRzMiwgMCk7CisKKyAgICBpZiAoYXZfc3Ryc3RhcnQodXJsLCAiY3J5cHRvIiwgTlVMTCkpIHsKKyAgICAgICAgaWYgKHVybFs2XSA9PSAnKycgfHwgdXJsWzZdID09ICc6JykKKyAgICAgICAgICAgIHByb3RvX25hbWUgPSBhdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZSh1cmwgKyA3KTsKKyAgICB9CisKKyAgICBpZiAoIXByb3RvX25hbWUpCisgICAgICAgIHByb3RvX25hbWUgPSBhdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZSh1cmwpOworCisgICAgaWYgKCFwcm90b19uYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8vIG9ubHkgaHR0cChzKSAmIGZpbGUgYXJlIGFsbG93ZWQKKyAgICBpZiAoYXZfc3Ryc3RhcnQocHJvdG9fbmFtZSwgImZpbGUiLCBOVUxMKSkgeworICAgICAgICBpZiAoc3RyY21wKGMtPmFsbG93ZWRfZXh0ZW5zaW9ucywgIkFMTCIpICYmICFhdl9tYXRjaF9leHQodXJsLCBjLT5hbGxvd2VkX2V4dGVuc2lvbnMpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJGaWxlbmFtZSBleHRlbnNpb24gb2YgXCclc1wnIGlzIG5vdCBhIGNvbW1vbiBtdWx0aW1lZGlhIGV4dGVuc2lvbiwgYmxvY2tlZCBmb3Igc2VjdXJpdHkgcmVhc29ucy5cbiIKKyAgICAgICAgICAgICAgICAiSWYgeW91IHdpc2ggdG8gb3ZlcnJpZGUgdGhpcyBhZGp1c3QgYWxsb3dlZF9leHRlbnNpb25zLCB5b3UgY2FuIHNldCBpdCB0byBcJ0FMTFwnIHRvIGFsbG93IGFsbFxuIiwKKyAgICAgICAgICAgICAgICB1cmwpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHByb3RvX25hbWUsICJodHRwIiwgTlVMTCkpIHsKKyAgICAgICAgOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIGlmICghc3RybmNtcChwcm90b19uYW1lLCB1cmwsIHN0cmxlbihwcm90b19uYW1lKSkgJiYgdXJsW3N0cmxlbihwcm90b19uYW1lKV0gPT0gJzonKQorICAgICAgICA7CisgICAgZWxzZSBpZiAoYXZfc3Ryc3RhcnQodXJsLCAiY3J5cHRvIiwgTlVMTCkgJiYgIXN0cm5jbXAocHJvdG9fbmFtZSwgdXJsICsgNywgc3RybGVuKHByb3RvX25hbWUpKSAmJiB1cmxbNyArIHN0cmxlbihwcm90b19uYW1lKV0gPT0gJzonKQorICAgICAgICA7CisgICAgZWxzZSBpZiAoc3RyY21wKHByb3RvX25hbWUsICJmaWxlIikgfHwgIXN0cm5jbXAodXJsLCAiZmlsZSwiLCA1KSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdl9mcmVlcChwYik7CisgICAgcmV0ID0gYXZpb19vcGVuMihwYiwgdXJsLCBBVklPX0ZMQUdfUkVBRCwgYy0+aW50ZXJydXB0X2NhbGxiYWNrLCAmdG1wKTsKKyAgICBpZiAocmV0ID49IDApIHsKKyAgICAgICAgLy8gdXBkYXRlIGNvb2tpZXMgb24gaHR0cCByZXNwb25zZSB3aXRoIHNldGNvb2tpZXMuCisgICAgICAgIGNoYXIgKm5ld19jb29raWVzID0gTlVMTDsKKworICAgICAgICBpZiAoIShzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQ1VTVE9NX0lPKSkKKyAgICAgICAgICAgIGF2X29wdF9nZXQoKnBiLCAiY29va2llcyIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4sICh1aW50OF90KiopJm5ld19jb29raWVzKTsKKworICAgICAgICBpZiAobmV3X2Nvb2tpZXMpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoYy0+Y29va2llcyk7CisgICAgICAgICAgICBjLT5jb29raWVzID0gbmV3X2Nvb2tpZXM7CisgICAgICAgIH0KKworICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgImNvb2tpZXMiLCBjLT5jb29raWVzLCAwKTsKKyAgICB9CisKKyAgICBhdl9kaWN0X2ZyZWUoJnRtcCk7CisKKyAgICBpZiAoaXNfaHR0cCkKKyAgICAgICAgKmlzX2h0dHAgPSBhdl9zdHJzdGFydChwcm90b19uYW1lLCAiaHR0cCIsIE5VTEwpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNoYXIgKmdldF9jb250ZW50X3VybCh4bWxOb2RlUHRyICpiYXNldXJsX25vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbl9iYXNldXJsX25vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3VybF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXBfaWRfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXBfYmFuZHdpZHRoX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqdmFsKQoreworICAgIGludCBpOworICAgIGNoYXIgKnRleHQ7CisgICAgY2hhciAqdXJsID0gTlVMTDsKKyAgICBjaGFyICp0bXBfc3RyID0gYXZfbWFsbG9jeihtYXhfdXJsX3NpemUpOworICAgIGNoYXIgKnRtcF9zdHJfMiA9IGF2X21hbGxvY3oobWF4X3VybF9zaXplKTsKKworICAgIGlmICghdG1wX3N0ciB8fCAhdG1wX3N0cl8yKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuX2Jhc2V1cmxfbm9kZXM7ICsraSkgeworICAgICAgICBpZiAoYmFzZXVybF9ub2Rlc1tpXSAmJgorICAgICAgICAgICAgYmFzZXVybF9ub2Rlc1tpXS0+Y2hpbGRyZW4gJiYKKyAgICAgICAgICAgIGJhc2V1cmxfbm9kZXNbaV0tPmNoaWxkcmVuLT50eXBlID09IFhNTF9URVhUX05PREUpIHsKKyAgICAgICAgICAgIHRleHQgPSB4bWxOb2RlR2V0Q29udGVudChiYXNldXJsX25vZGVzW2ldLT5jaGlsZHJlbik7CisgICAgICAgICAgICBpZiAodGV4dCkgeworICAgICAgICAgICAgICAgIG1lbXNldCh0bXBfc3RyLCAwLCBtYXhfdXJsX3NpemUpOworICAgICAgICAgICAgICAgIG1lbXNldCh0bXBfc3RyXzIsIDAsIG1heF91cmxfc2l6ZSk7CisgICAgICAgICAgICAgICAgZmZfbWFrZV9hYnNvbHV0ZV91cmwodG1wX3N0cl8yLCBtYXhfdXJsX3NpemUsIHRtcF9zdHIsIHRleHQpOworICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkodG1wX3N0ciwgdG1wX3N0cl8yLCBtYXhfdXJsX3NpemUpOworICAgICAgICAgICAgICAgIHhtbEZyZWUodGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodmFsKQorICAgICAgICBhdl9zdHJsY2F0KHRtcF9zdHIsIChjb25zdCBjaGFyKil2YWwsIG1heF91cmxfc2l6ZSk7CisKKyAgICBpZiAocmVwX2lkX3ZhbCkgeworICAgICAgICB1cmwgPSBhdl9zdHJpcmVwbGFjZSh0bXBfc3RyLCAiJFJlcHJlc2VudGF0aW9uSUQkIiwgKGNvbnN0IGNoYXIqKXJlcF9pZF92YWwpOworICAgICAgICBpZiAoIXVybCkgeworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfc3RybGNweSh0bXBfc3RyLCB1cmwsIG1heF91cmxfc2l6ZSk7CisgICAgfQorICAgIGlmIChyZXBfYmFuZHdpZHRoX3ZhbCAmJiB0bXBfc3RyWzBdICE9ICdcMCcpIHsKKyAgICAgICAgLy8gZnJlZSBhbnkgcHJldmlvdXNseSBhc3NpZ25lZCB1cmwgYmVmb3JlIHJlYXNzaWduaW5nCisgICAgICAgIGF2X2ZyZWUodXJsKTsKKyAgICAgICAgdXJsID0gYXZfc3RyaXJlcGxhY2UodG1wX3N0ciwgIiRCYW5kd2lkdGgkIiwgKGNvbnN0IGNoYXIqKXJlcF9iYW5kd2lkdGhfdmFsKTsKKyAgICAgICAgaWYgKCF1cmwpIHsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorZW5kOgorICAgIGF2X2ZyZWUodG1wX3N0cik7CisgICAgYXZfZnJlZSh0bXBfc3RyXzIpOworICAgIHJldHVybiB1cmw7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfdmFsX2Zyb21fbm9kZXNfdGFiKHhtbE5vZGVQdHIgKm5vZGVzLCBjb25zdCBpbnQgbl9ub2RlcywgY29uc3QgY2hhciAqYXR0cm5hbWUpCit7CisgICAgaW50IGk7CisgICAgY2hhciAqdmFsOworCisgICAgZm9yIChpID0gMDsgaSA8IG5fbm9kZXM7ICsraSkgeworICAgICAgICBpZiAobm9kZXNbaV0pIHsKKyAgICAgICAgICAgIHZhbCA9IHhtbEdldFByb3Aobm9kZXNbaV0sIGF0dHJuYW1lKTsKKyAgICAgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgeG1sTm9kZVB0ciBmaW5kX2NoaWxkX25vZGVfYnlfbmFtZSh4bWxOb2RlUHRyIHJvb3Rub2RlLCBjb25zdCBjaGFyICpub2RlbmFtZSkKK3sKKyAgICB4bWxOb2RlUHRyIG5vZGUgPSByb290bm9kZTsKKyAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbm9kZSA9IHhtbEZpcnN0RWxlbWVudENoaWxkKG5vZGUpOworICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChub2RlLT5uYW1lLCBub2RlbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBub2RlOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSB4bWxOZXh0RWxlbWVudFNpYmxpbmcobm9kZSk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgZW51bSBBVk1lZGlhVHlwZSBnZXRfY29udGVudF90eXBlKHhtbE5vZGVQdHIgbm9kZSkKK3sKKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBBVk1FRElBX1RZUEVfVU5LTk9XTjsKKyAgICBpbnQgaSA9IDA7CisgICAgY29uc3QgY2hhciAqYXR0cjsKKyAgICBjaGFyICp2YWwgPSBOVUxMOworCisgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICAgICAgYXR0ciA9IGkgPyAibWltZVR5cGUiIDogImNvbnRlbnRUeXBlIjsKKyAgICAgICAgICAgIHZhbCA9IHhtbEdldFByb3Aobm9kZSwgYXR0cik7CisgICAgICAgICAgICBpZiAodmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2X3N0cmlzdHIoKGNvbnN0IGNoYXIgKil2YWwsICJ2aWRlbyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJpc3RyKChjb25zdCBjaGFyICopdmFsLCAiYXVkaW8iKSkgeworICAgICAgICAgICAgICAgICAgICB0eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWxGcmVlKHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHR5cGU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnJhZ21lbnQgKiBnZXRfRnJhZ21lbnQoY2hhciAqcmFuZ2UpCit7CisgICAgc3RydWN0IGZyYWdtZW50ICogc2VnID0gIGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCBmcmFnbWVudCkpOworCisgICAgaWYgKCFzZWcpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgc2VnLT5zaXplID0gLTE7CisgICAgaWYgKHJhbmdlKSB7CisgICAgICAgIGNoYXIgKnN0cl9lbmRfb2Zmc2V0OworICAgICAgICBjaGFyICpzdHJfb2Zmc2V0ID0gYXZfc3RydG9rKHJhbmdlLCAiLSIsICZzdHJfZW5kX29mZnNldCk7CisgICAgICAgIHNlZy0+dXJsX29mZnNldCA9IHN0cnRvbGwoc3RyX29mZnNldCwgTlVMTCwgMTApOworICAgICAgICBzZWctPnNpemUgPSBzdHJ0b2xsKHN0cl9lbmRfb2Zmc2V0LCBOVUxMLCAxMCkgLSBzZWctPnVybF9vZmZzZXQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlZzsKK30KKworc3RhdGljIGludCBwYXJzZV9tYW5pZmVzdF9zZWdtZW50dXJsbm9kZShBVkZvcm1hdENvbnRleHQgKnMsIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcmVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOb2RlUHRyIGZyYWdtZW50dXJsX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgKmJhc2V1cmxfbm9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlcF9pZF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnJlcF9iYW5kd2lkdGhfdmFsKQoreworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgKmluaXRpYWxpemF0aW9uX3ZhbCA9IE5VTEw7CisgICAgY2hhciAqbWVkaWFfdmFsID0gTlVMTDsKKyAgICBjaGFyICpyYW5nZV92YWwgPSBOVUxMOworICAgIGludCBtYXhfdXJsX3NpemUgPSBjID8gYy0+bWF4X3VybF9zaXplOiBNQVhfVVJMX1NJWkU7CisKKyAgICBpZiAoIWF2X3N0cmNhc2VjbXAoZnJhZ21lbnR1cmxfbm9kZS0+bmFtZSwgKGNvbnN0IGNoYXIgKikiSW5pdGlhbGl6YXRpb24iKSkgeworICAgICAgICBpbml0aWFsaXphdGlvbl92YWwgPSB4bWxHZXRQcm9wKGZyYWdtZW50dXJsX25vZGUsICJzb3VyY2VVUkwiKTsKKyAgICAgICAgcmFuZ2VfdmFsID0geG1sR2V0UHJvcChmcmFnbWVudHVybF9ub2RlLCAicmFuZ2UiKTsKKyAgICAgICAgaWYgKGluaXRpYWxpemF0aW9uX3ZhbCB8fCByYW5nZV92YWwpIHsKKyAgICAgICAgICAgIHJlcC0+aW5pdF9zZWN0aW9uID0gZ2V0X0ZyYWdtZW50KHJhbmdlX3ZhbCk7CisgICAgICAgICAgICBpZiAoIXJlcC0+aW5pdF9zZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgeG1sRnJlZShpbml0aWFsaXphdGlvbl92YWwpOworICAgICAgICAgICAgICAgIHhtbEZyZWUocmFuZ2VfdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwLT5pbml0X3NlY3Rpb24tPnVybCA9IGdldF9jb250ZW50X3VybChiYXNldXJsX25vZGVzLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdXJsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcF9pZF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcF9iYW5kd2lkdGhfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvbl92YWwpOworCisgICAgICAgICAgICBpZiAoIXJlcC0+aW5pdF9zZWN0aW9uLT51cmwpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHJlcC0+aW5pdF9zZWN0aW9uKTsKKyAgICAgICAgICAgICAgICB4bWxGcmVlKGluaXRpYWxpemF0aW9uX3ZhbCk7CisgICAgICAgICAgICAgICAgeG1sRnJlZShyYW5nZV92YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB4bWxGcmVlKGluaXRpYWxpemF0aW9uX3ZhbCk7CisgICAgICAgICAgICB4bWxGcmVlKHJhbmdlX3ZhbCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGZyYWdtZW50dXJsX25vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIlNlZ21lbnRVUkwiKSkgeworICAgICAgICBtZWRpYV92YWwgPSB4bWxHZXRQcm9wKGZyYWdtZW50dXJsX25vZGUsICJtZWRpYSIpOworICAgICAgICByYW5nZV92YWwgPSB4bWxHZXRQcm9wKGZyYWdtZW50dXJsX25vZGUsICJtZWRpYVJhbmdlIik7CisgICAgICAgIGlmIChtZWRpYV92YWwgfHwgcmFuZ2VfdmFsKSB7CisgICAgICAgICAgICBzdHJ1Y3QgZnJhZ21lbnQgKnNlZyA9IGdldF9GcmFnbWVudChyYW5nZV92YWwpOworICAgICAgICAgICAgaWYgKCFzZWcpIHsKKyAgICAgICAgICAgICAgICB4bWxGcmVlKG1lZGlhX3ZhbCk7CisgICAgICAgICAgICAgICAgeG1sRnJlZShyYW5nZV92YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWctPnVybCA9IGdldF9jb250ZW50X3VybChiYXNldXJsX25vZGVzLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3VybF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwX2lkX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcF9iYW5kd2lkdGhfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdmFsKTsKKyAgICAgICAgICAgIGlmICghc2VnLT51cmwpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHNlZyk7CisgICAgICAgICAgICAgICAgeG1sRnJlZShtZWRpYV92YWwpOworICAgICAgICAgICAgICAgIHhtbEZyZWUocmFuZ2VfdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHluYXJyYXlfYWRkKCZyZXAtPmZyYWdtZW50cywgJnJlcC0+bl9mcmFnbWVudHMsIHNlZyk7CisgICAgICAgICAgICB4bWxGcmVlKG1lZGlhX3ZhbCk7CisgICAgICAgICAgICB4bWxGcmVlKHJhbmdlX3ZhbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9tYW5pZmVzdF9zZWdtZW50dGltZWxpbmUoQVZGb3JtYXRDb250ZXh0ICpzLCBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnJlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgZnJhZ21lbnRfdGltZWxpbmVfbm9kZSkKK3sKKyAgICB4bWxBdHRyUHRyIGF0dHIgPSBOVUxMOworICAgIGNoYXIgKnZhbCAgPSBOVUxMOworCisgICAgaWYgKCFhdl9zdHJjYXNlY21wKGZyYWdtZW50X3RpbWVsaW5lX25vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIlMiKSkgeworICAgICAgICBzdHJ1Y3QgdGltZWxpbmUgKnRtbCA9IGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCB0aW1lbGluZSkpOworICAgICAgICBpZiAoIXRtbCkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorICAgICAgICBhdHRyID0gZnJhZ21lbnRfdGltZWxpbmVfbm9kZS0+cHJvcGVydGllczsKKyAgICAgICAgd2hpbGUgKGF0dHIpIHsKKyAgICAgICAgICAgIHZhbCA9IHhtbEdldFByb3AoZnJhZ21lbnRfdGltZWxpbmVfbm9kZSwgYXR0ci0+bmFtZSk7CisKKyAgICAgICAgICAgIGlmICghdmFsKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAicGFyc2VfbWFuaWZlc3Rfc2VnbWVudHRpbWVsaW5lIGF0dHItPm5hbWUgPSAlcyB2YWwgaXMgTlVMTFxuIiwgYXR0ci0+bmFtZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChhdHRyLT5uYW1lLCAoY29uc3QgY2hhciAqKSJ0IikpIHsKKyAgICAgICAgICAgICAgICB0bWwtPnN0YXJ0dGltZSA9IChpbnQ2NF90KXN0cnRvbGwodmFsLCBOVUxMLCAxMCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGF0dHItPm5hbWUsIChjb25zdCBjaGFyICopInIiKSkgeworICAgICAgICAgICAgICAgIHRtbC0+cmVwZWF0ID0oaW50NjRfdCkgc3RydG9sbCh2YWwsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoYXR0ci0+bmFtZSwgKGNvbnN0IGNoYXIgKikiZCIpKSB7CisgICAgICAgICAgICAgICAgdG1sLT5kdXJhdGlvbiA9IChpbnQ2NF90KXN0cnRvbGwodmFsLCBOVUxMLCAxMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyID0gYXR0ci0+bmV4dDsKKyAgICAgICAgICAgIHhtbEZyZWUodmFsKTsKKyAgICAgICAgfQorICAgICAgICBkeW5hcnJheV9hZGQoJnJlcC0+dGltZWxpbmVzLCAmcmVwLT5uX3RpbWVsaW5lcywgdG1sKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXNvbHZlX2NvbnRlbnRfcGF0aChBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnVybCwgaW50ICptYXhfdXJsX3NpemUsIHhtbE5vZGVQdHIgKmJhc2V1cmxfbm9kZXMsIGludCBuX2Jhc2V1cmxfbm9kZXMpIHsKKworICAgIGNoYXIgKnRtcF9zdHIgPSBOVUxMOworICAgIGNoYXIgKnBhdGggPSBOVUxMOworICAgIGNoYXIgKm1wZE5hbWUgPSBOVUxMOworICAgIHhtbE5vZGVQdHIgbm9kZSA9IE5VTEw7CisgICAgY2hhciAqYmFzZXVybCA9IE5VTEw7CisgICAgY2hhciAqcm9vdF91cmwgPSBOVUxMOworICAgIGNoYXIgKnRleHQgPSBOVUxMOworCisgICAgaW50IGlzUm9vdEh0dHAgPSAwOworICAgIGNoYXIgdG9rZW4gPScvJzsKKyAgICBpbnQgc3RhcnQgPSAgMDsKKyAgICBpbnQgcm9vdElkID0gMDsKKyAgICBpbnQgdXBkYXRlZCA9IDA7CisgICAgaW50IHNpemUgPSAwOworICAgIGludCBpOworICAgIGludCB0bXBfbWF4X3VybF9zaXplID0gc3RybGVuKHVybCk7CisKKyAgICBmb3IgKGkgPSBuX2Jhc2V1cmxfbm9kZXMtMTsgaSA+PSAwIDsgaS0tKSB7CisgICAgICAgIHRleHQgPSB4bWxOb2RlR2V0Q29udGVudChiYXNldXJsX25vZGVzW2ldKTsKKyAgICAgICAgaWYgKCF0ZXh0KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHRtcF9tYXhfdXJsX3NpemUgKz0gc3RybGVuKHRleHQpOworICAgICAgICBpZiAoaXNodHRwKHRleHQpKSB7CisgICAgICAgICAgICB4bWxGcmVlKHRleHQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgeG1sRnJlZSh0ZXh0KTsKKyAgICB9CisKKyAgICB0bXBfbWF4X3VybF9zaXplID0gYWxpZ25lZCh0bXBfbWF4X3VybF9zaXplKTsKKyAgICB0ZXh0ID0gYXZfbWFsbG9jeih0bXBfbWF4X3VybF9zaXplKTsKKyAgICBpZiAoIXRleHQpIHsKKyAgICAgICAgdXBkYXRlZCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorICAgIGF2X3N0cmxjcHkodGV4dCwgdXJsLCBzdHJsZW4odXJsKSsxKTsKKyAgICB3aGlsZSAobXBkTmFtZSA9IGF2X3N0cnRvayh0ZXh0LCAiLyIsICZ0ZXh0KSkgIHsKKyAgICAgICAgc2l6ZSA9IHN0cmxlbihtcGROYW1lKTsKKyAgICB9CisKKyAgICBwYXRoID0gYXZfbWFsbG9jeih0bXBfbWF4X3VybF9zaXplKTsKKyAgICB0bXBfc3RyID0gYXZfbWFsbG9jeih0bXBfbWF4X3VybF9zaXplKTsKKyAgICBpZiAoIXRtcF9zdHIgfHwgIXBhdGgpIHsKKyAgICAgICAgdXBkYXRlZCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgYXZfc3RybGNweSAocGF0aCwgdXJsLCBzdHJsZW4odXJsKSAtIHNpemUgKyAxKTsKKyAgICBmb3IgKHJvb3RJZCA9IG5fYmFzZXVybF9ub2RlcyAtIDE7IHJvb3RJZCA+IDA7IHJvb3RJZCAtLSkgeworICAgICAgICBpZiAoIShub2RlID0gYmFzZXVybF9ub2Rlc1tyb290SWRdKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzaHR0cCh4bWxOb2RlR2V0Q29udGVudChub2RlKSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgbm9kZSA9IGJhc2V1cmxfbm9kZXNbcm9vdElkXTsKKyAgICBiYXNldXJsID0geG1sTm9kZUdldENvbnRlbnQobm9kZSk7CisgICAgcm9vdF91cmwgPSAoYXZfc3RyY2FzZWNtcChiYXNldXJsLCAiIikpID8gYmFzZXVybCA6IHBhdGg7CisgICAgaWYgKG5vZGUpIHsKKyAgICAgICAgeG1sTm9kZVNldENvbnRlbnQobm9kZSwgcm9vdF91cmwpOworICAgICAgICB1cGRhdGVkID0gMTsKKyAgICB9CisKKyAgICBzaXplID0gc3RybGVuKHJvb3RfdXJsKTsKKyAgICBpc1Jvb3RIdHRwID0gaXNodHRwKHJvb3RfdXJsKTsKKworICAgIGlmIChyb290X3VybFtzaXplIC0gMV0gIT0gdG9rZW4pIHsKKyAgICAgICAgYXZfc3RybGNhdChyb290X3VybCwgIi8iLCBzaXplICsgMik7CisgICAgICAgIHNpemUgKz0gMjsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl9iYXNldXJsX25vZGVzOyArK2kpIHsKKyAgICAgICAgaWYgKGkgPT0gcm9vdElkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICB0ZXh0ID0geG1sTm9kZUdldENvbnRlbnQoYmFzZXVybF9ub2Rlc1tpXSk7CisgICAgICAgIGlmICh0ZXh0KSB7CisgICAgICAgICAgICBtZW1zZXQodG1wX3N0ciwgMCwgc3RybGVuKHRtcF9zdHIpKTsKKyAgICAgICAgICAgIGlmICghaXNodHRwKHRleHQpICYmIGlzUm9vdEh0dHApIHsKKyAgICAgICAgICAgICAgICBhdl9zdHJsY3B5KHRtcF9zdHIsIHJvb3RfdXJsLCBzaXplICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9ICh0ZXh0WzBdID09IHRva2VuKTsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQodG1wX3N0ciwgdGV4dCArIHN0YXJ0LCB0bXBfbWF4X3VybF9zaXplKTsKKyAgICAgICAgICAgIHhtbE5vZGVTZXRDb250ZW50KGJhc2V1cmxfbm9kZXNbaV0sIHRtcF9zdHIpOworICAgICAgICAgICAgdXBkYXRlZCA9IDE7CisgICAgICAgICAgICB4bWxGcmVlKHRleHQpOworICAgICAgICB9CisgICAgfQorCitlbmQ6CisgICAgaWYgKHRtcF9tYXhfdXJsX3NpemUgPiAqbWF4X3VybF9zaXplKSB7CisgICAgICAgICptYXhfdXJsX3NpemUgPSB0bXBfbWF4X3VybF9zaXplOworICAgIH0KKyAgICBhdl9mcmVlKHBhdGgpOworICAgIGF2X2ZyZWUodG1wX3N0cik7CisgICAgcmV0dXJuIHVwZGF0ZWQ7CisKK30KKworc3RhdGljIGludCBwYXJzZV9tYW5pZmVzdF9yZXByZXNlbnRhdGlvbihBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOb2RlUHRyIGFkYXB0aW9uc2V0X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgbXBkX2Jhc2V1cmxfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBwZXJpb2RfYmFzZXVybF9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOb2RlUHRyIHBlcmlvZF9zZWdtZW50dGVtcGxhdGVfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBwZXJpb2Rfc2VnbWVudGxpc3Rfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBmcmFnbWVudF90ZW1wbGF0ZV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOb2RlUHRyIGNvbnRlbnRfY29tcG9uZW50X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgYWRhcHRpb25zZXRfYmFzZXVybF9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOb2RlUHRyIGFkYXB0aW9uc2V0X3NlZ21lbnRsaXN0X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgYWRhcHRpb25zZXRfc3VwcGxlbWVudGFscHJvcGVydHlfbm9kZSkKK3sKKyAgICBpbnQzMl90IHJldCA9IDA7CisgICAgaW50MzJfdCBhdWRpb19yZXBfaWR4ID0gMDsKKyAgICBpbnQzMl90IHZpZGVvX3JlcF9pZHggPSAwOworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcmVwID0gTlVMTDsKKyAgICBzdHJ1Y3QgZnJhZ21lbnQgKnNlZyA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciByZXByZXNlbnRhdGlvbl9zZWdtZW50dGVtcGxhdGVfbm9kZSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciByZXByZXNlbnRhdGlvbl9iYXNldXJsX25vZGUgPSBOVUxMOworICAgIHhtbE5vZGVQdHIgcmVwcmVzZW50YXRpb25fc2VnbWVudGxpc3Rfbm9kZSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciBzZWdtZW50bGlzdHNfdGFiWzJdOworICAgIHhtbE5vZGVQdHIgZnJhZ21lbnRfdGltZWxpbmVfbm9kZSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciBmcmFnbWVudF90ZW1wbGF0ZXNfdGFiWzVdOworICAgIGNoYXIgKmR1cmF0aW9uX3ZhbCA9IE5VTEw7CisgICAgY2hhciAqcHJlc2VudGF0aW9uX3RpbWVvZmZzZXRfdmFsID0gTlVMTDsKKyAgICBjaGFyICpzdGFydG51bWJlcl92YWwgPSBOVUxMOworICAgIGNoYXIgKnRpbWVzY2FsZV92YWwgPSBOVUxMOworICAgIGNoYXIgKmluaXRpYWxpemF0aW9uX3ZhbCA9IE5VTEw7CisgICAgY2hhciAqbWVkaWFfdmFsID0gTlVMTDsKKyAgICBjaGFyICp2YWwgPSBOVUxMOworICAgIHhtbE5vZGVQdHIgYmFzZXVybF9ub2Rlc1s0XTsKKyAgICB4bWxOb2RlUHRyIHJlcHJlc2VudGF0aW9uX25vZGUgPSBub2RlOworICAgIGNoYXIgKnJlcF9pZF92YWwgPSB4bWxHZXRQcm9wKHJlcHJlc2VudGF0aW9uX25vZGUsICJpZCIpOworICAgIGNoYXIgKnJlcF9iYW5kd2lkdGhfdmFsID0geG1sR2V0UHJvcChyZXByZXNlbnRhdGlvbl9ub2RlLCAiYmFuZHdpZHRoIik7CisgICAgY2hhciAqcmVwX2ZyYW1lcmF0ZV92YWwgPSB4bWxHZXRQcm9wKHJlcHJlc2VudGF0aW9uX25vZGUsICJmcmFtZVJhdGUiKTsKKyAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUgPSBBVk1FRElBX1RZUEVfVU5LTk9XTjsKKworICAgIC8vIHRyeSBnZXQgaW5mb3JtYXRpb24gZnJvbSByZXByZXNlbnRhdGlvbgorICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9VTktOT1dOKQorICAgICAgICB0eXBlID0gZ2V0X2NvbnRlbnRfdHlwZShyZXByZXNlbnRhdGlvbl9ub2RlKTsKKyAgICAvLyB0cnkgZ2V0IGluZm9ybWF0aW9uIGZyb20gY29udGVudENvbXBvbmVuCisgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX1VOS05PV04pCisgICAgICAgIHR5cGUgPSBnZXRfY29udGVudF90eXBlKGNvbnRlbnRfY29tcG9uZW50X25vZGUpOworICAgIC8vIHRyeSBnZXQgaW5mb3JtYXRpb24gZnJvbSBhZGFwdGlvbiBzZXQKKyAgICBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfVU5LTk9XTikKKyAgICAgICAgdHlwZSA9IGdldF9jb250ZW50X3R5cGUoYWRhcHRpb25zZXRfbm9kZSk7CisgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiUGFyc2luZyAnJXMnIC0gc2tpcHAgbm90IHN1cHBvcnRlZCByZXByZXNlbnRhdGlvbiB0eXBlXG4iLCB1cmwpOworICAgIH0gZWxzZSBpZiAodHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwgdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgLy8gY29udmVydCBzZWxlY3RlZCByZXByZXNlbnRhdGlvbiB0byBvdXIgaW50ZXJuYWwgc3RydWN0CisgICAgICAgIHJlcCA9IGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCByZXByZXNlbnRhdGlvbikpOworICAgICAgICBpZiAoIXJlcCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgcmVwcmVzZW50YXRpb25fc2VnbWVudHRlbXBsYXRlX25vZGUgPSBmaW5kX2NoaWxkX25vZGVfYnlfbmFtZShyZXByZXNlbnRhdGlvbl9ub2RlLCAiU2VnbWVudFRlbXBsYXRlIik7CisgICAgICAgIHJlcHJlc2VudGF0aW9uX2Jhc2V1cmxfbm9kZSA9IGZpbmRfY2hpbGRfbm9kZV9ieV9uYW1lKHJlcHJlc2VudGF0aW9uX25vZGUsICJCYXNlVVJMIik7CisgICAgICAgIHJlcHJlc2VudGF0aW9uX3NlZ21lbnRsaXN0X25vZGUgPSBmaW5kX2NoaWxkX25vZGVfYnlfbmFtZShyZXByZXNlbnRhdGlvbl9ub2RlLCAiU2VnbWVudExpc3QiKTsKKworICAgICAgICBiYXNldXJsX25vZGVzWzBdID0gbXBkX2Jhc2V1cmxfbm9kZTsKKyAgICAgICAgYmFzZXVybF9ub2Rlc1sxXSA9IHBlcmlvZF9iYXNldXJsX25vZGU7CisgICAgICAgIGJhc2V1cmxfbm9kZXNbMl0gPSBhZGFwdGlvbnNldF9iYXNldXJsX25vZGU7CisgICAgICAgIGJhc2V1cmxfbm9kZXNbM10gPSByZXByZXNlbnRhdGlvbl9iYXNldXJsX25vZGU7CisKKyAgICAgICAgcmV0ID0gcmVzb2x2ZV9jb250ZW50X3BhdGgocywgdXJsLCAmYy0+bWF4X3VybF9zaXplLCBiYXNldXJsX25vZGVzLCA0KTsKKyAgICAgICAgYy0+bWF4X3VybF9zaXplID0gYWxpZ25lZChjLT5tYXhfdXJsX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChyZXBfaWRfdmFsID8gc3RybGVuKHJlcF9pZF92YWwpIDogMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChyZXBfYmFuZHdpZHRoX3ZhbCA/IHN0cmxlbihyZXBfYmFuZHdpZHRoX3ZhbCkgOiAwKSk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFTk9NRU0pIHx8IHJldCA9PSAwKSB7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVwcmVzZW50YXRpb25fc2VnbWVudHRlbXBsYXRlX25vZGUgfHwgZnJhZ21lbnRfdGVtcGxhdGVfbm9kZSB8fCBwZXJpb2Rfc2VnbWVudHRlbXBsYXRlX25vZGUpIHsKKyAgICAgICAgICAgIGZyYWdtZW50X3RpbWVsaW5lX25vZGUgPSBOVUxMOworICAgICAgICAgICAgZnJhZ21lbnRfdGVtcGxhdGVzX3RhYlswXSA9IHJlcHJlc2VudGF0aW9uX3NlZ21lbnR0ZW1wbGF0ZV9ub2RlOworICAgICAgICAgICAgZnJhZ21lbnRfdGVtcGxhdGVzX3RhYlsxXSA9IGFkYXB0aW9uc2V0X3NlZ21lbnRsaXN0X25vZGU7CisgICAgICAgICAgICBmcmFnbWVudF90ZW1wbGF0ZXNfdGFiWzJdID0gZnJhZ21lbnRfdGVtcGxhdGVfbm9kZTsKKyAgICAgICAgICAgIGZyYWdtZW50X3RlbXBsYXRlc190YWJbM10gPSBwZXJpb2Rfc2VnbWVudHRlbXBsYXRlX25vZGU7CisgICAgICAgICAgICBmcmFnbWVudF90ZW1wbGF0ZXNfdGFiWzRdID0gcGVyaW9kX3NlZ21lbnRsaXN0X25vZGU7CisKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl90aW1lb2Zmc2V0X3ZhbCA9IGdldF92YWxfZnJvbV9ub2Rlc190YWIoZnJhZ21lbnRfdGVtcGxhdGVzX3RhYiwgNCwgInByZXNlbnRhdGlvblRpbWVPZmZzZXQiKTsKKyAgICAgICAgICAgIGR1cmF0aW9uX3ZhbCA9IGdldF92YWxfZnJvbV9ub2Rlc190YWIoZnJhZ21lbnRfdGVtcGxhdGVzX3RhYiwgNCwgImR1cmF0aW9uIik7CisgICAgICAgICAgICBzdGFydG51bWJlcl92YWwgPSBnZXRfdmFsX2Zyb21fbm9kZXNfdGFiKGZyYWdtZW50X3RlbXBsYXRlc190YWIsIDQsICJzdGFydE51bWJlciIpOworICAgICAgICAgICAgdGltZXNjYWxlX3ZhbCA9IGdldF92YWxfZnJvbV9ub2Rlc190YWIoZnJhZ21lbnRfdGVtcGxhdGVzX3RhYiwgNCwgInRpbWVzY2FsZSIpOworICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25fdmFsID0gZ2V0X3ZhbF9mcm9tX25vZGVzX3RhYihmcmFnbWVudF90ZW1wbGF0ZXNfdGFiLCA0LCAiaW5pdGlhbGl6YXRpb24iKTsKKyAgICAgICAgICAgIG1lZGlhX3ZhbCA9IGdldF92YWxfZnJvbV9ub2Rlc190YWIoZnJhZ21lbnRfdGVtcGxhdGVzX3RhYiwgNCwgIm1lZGlhIik7CisKKyAgICAgICAgICAgIGlmIChpbml0aWFsaXphdGlvbl92YWwpIHsKKyAgICAgICAgICAgICAgICByZXAtPmluaXRfc2VjdGlvbiA9IGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCBmcmFnbWVudCkpOworICAgICAgICAgICAgICAgIGlmICghcmVwLT5pbml0X3NlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShyZXApOworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjLT5tYXhfdXJsX3NpemUgPSBhbGlnbmVkKGMtPm1heF91cmxfc2l6ZSAgKyBzdHJsZW4oaW5pdGlhbGl6YXRpb25fdmFsKSk7CisgICAgICAgICAgICAgICAgcmVwLT5pbml0X3NlY3Rpb24tPnVybCA9IGdldF9jb250ZW50X3VybChiYXNldXJsX25vZGVzLCA0LCAgYy0+bWF4X3VybF9zaXplLCByZXBfaWRfdmFsLCByZXBfYmFuZHdpZHRoX3ZhbCwgaW5pdGlhbGl6YXRpb25fdmFsKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlcC0+aW5pdF9zZWN0aW9uLT51cmwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShyZXAtPmluaXRfc2VjdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUocmVwKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwLT5pbml0X3NlY3Rpb24tPnNpemUgPSAtMTsKKyAgICAgICAgICAgICAgICB4bWxGcmVlKGluaXRpYWxpemF0aW9uX3ZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtZWRpYV92YWwpIHsKKyAgICAgICAgICAgICAgICBjLT5tYXhfdXJsX3NpemUgPSBhbGlnbmVkKGMtPm1heF91cmxfc2l6ZSAgKyBzdHJsZW4obWVkaWFfdmFsKSk7CisgICAgICAgICAgICAgICAgcmVwLT51cmxfdGVtcGxhdGUgPSBnZXRfY29udGVudF91cmwoYmFzZXVybF9ub2RlcywgNCwgYy0+bWF4X3VybF9zaXplLCByZXBfaWRfdmFsLCByZXBfYmFuZHdpZHRoX3ZhbCwgbWVkaWFfdmFsKTsKKyAgICAgICAgICAgICAgICB4bWxGcmVlKG1lZGlhX3ZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdGltZW9mZnNldF92YWwpIHsKKyAgICAgICAgICAgICAgICByZXAtPnByZXNlbnRhdGlvbl90aW1lb2Zmc2V0ID0gKGludDY0X3QpIHN0cnRvbGwocHJlc2VudGF0aW9uX3RpbWVvZmZzZXRfdmFsLCBOVUxMLCAxMCk7CisgICAgICAgICAgICAgICAgeG1sRnJlZShwcmVzZW50YXRpb25fdGltZW9mZnNldF92YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGR1cmF0aW9uX3ZhbCkgeworICAgICAgICAgICAgICAgIHJlcC0+ZnJhZ21lbnRfZHVyYXRpb24gPSAoaW50NjRfdCkgc3RydG9sbChkdXJhdGlvbl92YWwsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgICAgICB4bWxGcmVlKGR1cmF0aW9uX3ZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGltZXNjYWxlX3ZhbCkgeworICAgICAgICAgICAgICAgIHJlcC0+ZnJhZ21lbnRfdGltZXNjYWxlID0gKGludDY0X3QpIHN0cnRvbGwodGltZXNjYWxlX3ZhbCwgTlVMTCwgMTApOworICAgICAgICAgICAgICAgIHhtbEZyZWUodGltZXNjYWxlX3ZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhcnRudW1iZXJfdmFsKSB7CisgICAgICAgICAgICAgICAgcmVwLT5maXJzdF9zZXFfbm8gPSAoaW50NjRfdCkgc3RydG9sbChzdGFydG51bWJlcl92YWwsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgICAgICB4bWxGcmVlKHN0YXJ0bnVtYmVyX3ZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRhcHRpb25zZXRfc3VwcGxlbWVudGFscHJvcGVydHlfbm9kZSkgeworICAgICAgICAgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcCh4bWxHZXRQcm9wKGFkYXB0aW9uc2V0X3N1cHBsZW1lbnRhbHByb3BlcnR5X25vZGUsInNjaGVtZUlkVXJpIiksICJodHRwOi8vZGFzaGlmLm9yZy9ndWlkZWxpbmVzL2xhc3Qtc2VnbWVudC1udW1iZXIiKSkgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSB4bWxHZXRQcm9wKGFkYXB0aW9uc2V0X3N1cHBsZW1lbnRhbHByb3BlcnR5X25vZGUsInZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgIGlmICghdmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyB2YWx1ZSBhdHRyaWJ1dGUgaW4gYWRhcHRpb25zZXRfc3VwcGxlbWVudGFscHJvcGVydHlfbm9kZVxuIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXAtPmxhc3Rfc2VxX25vID0oaW50NjRfdCkgc3RydG9sbCh2YWwsIE5VTEwsIDEwKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWxGcmVlKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmcmFnbWVudF90aW1lbGluZV9ub2RlID0gZmluZF9jaGlsZF9ub2RlX2J5X25hbWUocmVwcmVzZW50YXRpb25fc2VnbWVudHRlbXBsYXRlX25vZGUsICJTZWdtZW50VGltZWxpbmUiKTsKKworICAgICAgICAgICAgaWYgKCFmcmFnbWVudF90aW1lbGluZV9ub2RlKQorICAgICAgICAgICAgICAgIGZyYWdtZW50X3RpbWVsaW5lX25vZGUgPSBmaW5kX2NoaWxkX25vZGVfYnlfbmFtZShmcmFnbWVudF90ZW1wbGF0ZV9ub2RlLCAiU2VnbWVudFRpbWVsaW5lIik7CisgICAgICAgICAgICBpZiAoIWZyYWdtZW50X3RpbWVsaW5lX25vZGUpCisgICAgICAgICAgICAgICAgZnJhZ21lbnRfdGltZWxpbmVfbm9kZSA9IGZpbmRfY2hpbGRfbm9kZV9ieV9uYW1lKGFkYXB0aW9uc2V0X3NlZ21lbnRsaXN0X25vZGUsICJTZWdtZW50VGltZWxpbmUiKTsKKyAgICAgICAgICAgIGlmICghZnJhZ21lbnRfdGltZWxpbmVfbm9kZSkKKyAgICAgICAgICAgICAgICBmcmFnbWVudF90aW1lbGluZV9ub2RlID0gZmluZF9jaGlsZF9ub2RlX2J5X25hbWUocGVyaW9kX3NlZ21lbnRsaXN0X25vZGUsICJTZWdtZW50VGltZWxpbmUiKTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudF90aW1lbGluZV9ub2RlKSB7CisgICAgICAgICAgICAgICAgZnJhZ21lbnRfdGltZWxpbmVfbm9kZSA9IHhtbEZpcnN0RWxlbWVudENoaWxkKGZyYWdtZW50X3RpbWVsaW5lX25vZGUpOworICAgICAgICAgICAgICAgIHdoaWxlIChmcmFnbWVudF90aW1lbGluZV9ub2RlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHBhcnNlX21hbmlmZXN0X3NlZ21lbnR0aW1lbGluZShzLCByZXAsIGZyYWdtZW50X3RpbWVsaW5lX25vZGUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcmFnbWVudF90aW1lbGluZV9ub2RlID0geG1sTmV4dEVsZW1lbnRTaWJsaW5nKGZyYWdtZW50X3RpbWVsaW5lX25vZGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXByZXNlbnRhdGlvbl9iYXNldXJsX25vZGUgJiYgIXJlcHJlc2VudGF0aW9uX3NlZ21lbnRsaXN0X25vZGUpIHsKKyAgICAgICAgICAgIHNlZyA9IGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCBmcmFnbWVudCkpOworICAgICAgICAgICAgaWYgKCFzZWcpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWctPnVybCA9IGdldF9jb250ZW50X3VybChiYXNldXJsX25vZGVzLCA0LCBjLT5tYXhfdXJsX3NpemUsIHJlcF9pZF92YWwsIHJlcF9iYW5kd2lkdGhfdmFsLCBOVUxMKTsKKyAgICAgICAgICAgIGlmICghc2VnLT51cmwpIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHNlZyk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VnLT5zaXplID0gLTE7CisgICAgICAgICAgICBkeW5hcnJheV9hZGQoJnJlcC0+ZnJhZ21lbnRzLCAmcmVwLT5uX2ZyYWdtZW50cywgc2VnKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXByZXNlbnRhdGlvbl9zZWdtZW50bGlzdF9ub2RlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBodHRwczovL3d3dy5icmVuZGFubG9uZy5jb20vdGhlLXN0cnVjdHVyZS1vZi1hbi1tcGVnLWRhc2gtbXBkLmh0bWwKKyAgICAgICAgICAgIC8vIGh0dHA6Ly93d3ctaXRlYy51bmkta2x1LmFjLmF0L2Rhc2gvZGRhc2gvbXBkR2VuZXJhdG9yLnBocD9mcmFnbWVudGxlbmd0aD0xNSZ0eXBlPWZ1bGwKKyAgICAgICAgICAgIHhtbE5vZGVQdHIgZnJhZ21lbnR1cmxfbm9kZSA9IE5VTEw7CisgICAgICAgICAgICBzZWdtZW50bGlzdHNfdGFiWzBdID0gcmVwcmVzZW50YXRpb25fc2VnbWVudGxpc3Rfbm9kZTsKKyAgICAgICAgICAgIHNlZ21lbnRsaXN0c190YWJbMV0gPSBhZGFwdGlvbnNldF9zZWdtZW50bGlzdF9ub2RlOworCisgICAgICAgICAgICBkdXJhdGlvbl92YWwgPSBnZXRfdmFsX2Zyb21fbm9kZXNfdGFiKHNlZ21lbnRsaXN0c190YWIsIDIsICJkdXJhdGlvbiIpOworICAgICAgICAgICAgdGltZXNjYWxlX3ZhbCA9IGdldF92YWxfZnJvbV9ub2Rlc190YWIoc2VnbWVudGxpc3RzX3RhYiwgMiwgInRpbWVzY2FsZSIpOworICAgICAgICAgICAgaWYgKGR1cmF0aW9uX3ZhbCkgeworICAgICAgICAgICAgICAgIHJlcC0+ZnJhZ21lbnRfZHVyYXRpb24gPSAoaW50NjRfdCkgc3RydG9sbChkdXJhdGlvbl92YWwsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgICAgICB4bWxGcmVlKGR1cmF0aW9uX3ZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGltZXNjYWxlX3ZhbCkgeworICAgICAgICAgICAgICAgIHJlcC0+ZnJhZ21lbnRfdGltZXNjYWxlID0gKGludDY0X3QpIHN0cnRvbGwodGltZXNjYWxlX3ZhbCwgTlVMTCwgMTApOworICAgICAgICAgICAgICAgIHhtbEZyZWUodGltZXNjYWxlX3ZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmFnbWVudHVybF9ub2RlID0geG1sRmlyc3RFbGVtZW50Q2hpbGQocmVwcmVzZW50YXRpb25fc2VnbWVudGxpc3Rfbm9kZSk7CisgICAgICAgICAgICB3aGlsZSAoZnJhZ21lbnR1cmxfbm9kZSkgeworICAgICAgICAgICAgICAgIHJldCA9IHBhcnNlX21hbmlmZXN0X3NlZ21lbnR1cmxub2RlKHMsIHJlcCwgZnJhZ21lbnR1cmxfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNldXJsX25vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcF9pZF92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwX2JhbmR3aWR0aF92YWwpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyYWdtZW50dXJsX25vZGUgPSB4bWxOZXh0RWxlbWVudFNpYmxpbmcoZnJhZ21lbnR1cmxfbm9kZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYWdtZW50X3RpbWVsaW5lX25vZGUgPSBmaW5kX2NoaWxkX25vZGVfYnlfbmFtZShyZXByZXNlbnRhdGlvbl9zZWdtZW50dGVtcGxhdGVfbm9kZSwgIlNlZ21lbnRUaW1lbGluZSIpOworCisgICAgICAgICAgICBpZiAoIWZyYWdtZW50X3RpbWVsaW5lX25vZGUpCisgICAgICAgICAgICAgICAgZnJhZ21lbnRfdGltZWxpbmVfbm9kZSA9IGZpbmRfY2hpbGRfbm9kZV9ieV9uYW1lKGZyYWdtZW50X3RlbXBsYXRlX25vZGUsICJTZWdtZW50VGltZWxpbmUiKTsKKyAgICAgICAgICAgIGlmICghZnJhZ21lbnRfdGltZWxpbmVfbm9kZSkKKyAgICAgICAgICAgICAgICBmcmFnbWVudF90aW1lbGluZV9ub2RlID0gZmluZF9jaGlsZF9ub2RlX2J5X25hbWUoYWRhcHRpb25zZXRfc2VnbWVudGxpc3Rfbm9kZSwgIlNlZ21lbnRUaW1lbGluZSIpOworICAgICAgICAgICAgaWYgKCFmcmFnbWVudF90aW1lbGluZV9ub2RlKQorICAgICAgICAgICAgICAgIGZyYWdtZW50X3RpbWVsaW5lX25vZGUgPSBmaW5kX2NoaWxkX25vZGVfYnlfbmFtZShwZXJpb2Rfc2VnbWVudGxpc3Rfbm9kZSwgIlNlZ21lbnRUaW1lbGluZSIpOworICAgICAgICAgICAgaWYgKGZyYWdtZW50X3RpbWVsaW5lX25vZGUpIHsKKyAgICAgICAgICAgICAgICBmcmFnbWVudF90aW1lbGluZV9ub2RlID0geG1sRmlyc3RFbGVtZW50Q2hpbGQoZnJhZ21lbnRfdGltZWxpbmVfbm9kZSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGZyYWdtZW50X3RpbWVsaW5lX25vZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcGFyc2VfbWFuaWZlc3Rfc2VnbWVudHRpbWVsaW5lKHMsIHJlcCwgZnJhZ21lbnRfdGltZWxpbmVfbm9kZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50X3RpbWVsaW5lX25vZGUgPSB4bWxOZXh0RWxlbWVudFNpYmxpbmcoZnJhZ21lbnRfdGltZWxpbmVfbm9kZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJlZV9yZXByZXNlbnRhdGlvbihyZXApOworICAgICAgICAgICAgcmVwID0gTlVMTDsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGZvcm1hdCBvZiBSZXByZXNlbnRhdGlvbiBub2RlIGlkWyVzXSBcbiIsIChjb25zdCBjaGFyICopcmVwX2lkX3ZhbCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVwKSB7CisgICAgICAgICAgICBpZiAocmVwLT5mcmFnbWVudF9kdXJhdGlvbiA+IDAgJiYgIXJlcC0+ZnJhZ21lbnRfdGltZXNjYWxlKQorICAgICAgICAgICAgICAgIHJlcC0+ZnJhZ21lbnRfdGltZXNjYWxlID0gMTsKKyAgICAgICAgICAgIHJlcC0+YmFuZHdpZHRoID0gcmVwX2JhbmR3aWR0aF92YWwgPyBhdG9pKHJlcF9iYW5kd2lkdGhfdmFsKSA6IDA7CisgICAgICAgICAgICBzdHJuY3B5KHJlcC0+aWQsIHJlcF9pZF92YWwgPyByZXBfaWRfdmFsIDogIiIsIHNpemVvZihyZXAtPmlkKSk7CisgICAgICAgICAgICByZXAtPmZyYW1lcmF0ZSA9IGF2X21ha2VfcSgwLCAwKTsKKyAgICAgICAgICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiByZXBfZnJhbWVyYXRlX3ZhbCkgeworICAgICAgICAgICAgICAgIHJldCA9IGF2X3BhcnNlX3ZpZGVvX3JhdGUoJnJlcC0+ZnJhbWVyYXRlLCByZXBfZnJhbWVyYXRlX3ZhbCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIklnbm9yaW5nIGludmFsaWQgZnJhbWUgcmF0ZSAnJXMnXG4iLCByZXBfZnJhbWVyYXRlX3ZhbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgICAgIHJlcC0+cmVwX2lkeCA9IHZpZGVvX3JlcF9pZHg7CisgICAgICAgICAgICAgICAgZHluYXJyYXlfYWRkKCZjLT52aWRlb3MsICZjLT5uX3ZpZGVvcywgcmVwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVwLT5yZXBfaWR4ID0gYXVkaW9fcmVwX2lkeDsKKyAgICAgICAgICAgICAgICBkeW5hcnJheV9hZGQoJmMtPmF1ZGlvcywgJmMtPm5fYXVkaW9zLCByZXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlkZW9fcmVwX2lkeCArPSB0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBhdWRpb19yZXBfaWR4ICs9IHR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPOworCitlbmQ6CisgICAgaWYgKHJlcF9pZF92YWwpCisgICAgICAgIHhtbEZyZWUocmVwX2lkX3ZhbCk7CisgICAgaWYgKHJlcF9iYW5kd2lkdGhfdmFsKQorICAgICAgICB4bWxGcmVlKHJlcF9iYW5kd2lkdGhfdmFsKTsKKyAgICBpZiAocmVwX2ZyYW1lcmF0ZV92YWwpCisgICAgICAgIHhtbEZyZWUocmVwX2ZyYW1lcmF0ZV92YWwpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwYXJzZV9tYW5pZmVzdF9hZGFwdGF0aW9uc2V0KEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqdXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgYWRhcHRpb25zZXRfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxOb2RlUHRyIG1wZF9iYXNldXJsX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sTm9kZVB0ciBwZXJpb2RfYmFzZXVybF9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgcGVyaW9kX3NlZ21lbnR0ZW1wbGF0ZV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbE5vZGVQdHIgcGVyaW9kX3NlZ21lbnRsaXN0X25vZGUpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgeG1sTm9kZVB0ciBmcmFnbWVudF90ZW1wbGF0ZV9ub2RlID0gTlVMTDsKKyAgICB4bWxOb2RlUHRyIGNvbnRlbnRfY29tcG9uZW50X25vZGUgPSBOVUxMOworICAgIHhtbE5vZGVQdHIgYWRhcHRpb25zZXRfYmFzZXVybF9ub2RlID0gTlVMTDsKKyAgICB4bWxOb2RlUHRyIGFkYXB0aW9uc2V0X3NlZ21lbnRsaXN0X25vZGUgPSBOVUxMOworICAgIHhtbE5vZGVQdHIgYWRhcHRpb25zZXRfc3VwcGxlbWVudGFscHJvcGVydHlfbm9kZSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciBub2RlID0gTlVMTDsKKworICAgIG5vZGUgPSB4bWxGaXJzdEVsZW1lbnRDaGlsZChhZGFwdGlvbnNldF9ub2RlKTsKKyAgICB3aGlsZSAobm9kZSkgeworICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAobm9kZS0+bmFtZSwgKGNvbnN0IGNoYXIgKikiU2VnbWVudFRlbXBsYXRlIikpIHsKKyAgICAgICAgICAgIGZyYWdtZW50X3RlbXBsYXRlX25vZGUgPSBub2RlOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKG5vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIkNvbnRlbnRDb21wb25lbnQiKSkgeworICAgICAgICAgICAgY29udGVudF9jb21wb25lbnRfbm9kZSA9IG5vZGU7CisgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAobm9kZS0+bmFtZSwgKGNvbnN0IGNoYXIgKikiQmFzZVVSTCIpKSB7CisgICAgICAgICAgICBhZGFwdGlvbnNldF9iYXNldXJsX25vZGUgPSBub2RlOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKG5vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIlNlZ21lbnRMaXN0IikpIHsKKyAgICAgICAgICAgIGFkYXB0aW9uc2V0X3NlZ21lbnRsaXN0X25vZGUgPSBub2RlOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKG5vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIlN1cHBsZW1lbnRhbFByb3BlcnR5IikpIHsKKyAgICAgICAgICAgIGFkYXB0aW9uc2V0X3N1cHBsZW1lbnRhbHByb3BlcnR5X25vZGUgPSBub2RlOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKG5vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIlJlcHJlc2VudGF0aW9uIikpIHsKKyAgICAgICAgICAgIHJldCA9IHBhcnNlX21hbmlmZXN0X3JlcHJlc2VudGF0aW9uKHMsIHVybCwgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXB0aW9uc2V0X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGRfYmFzZXVybF9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kX2Jhc2V1cmxfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZF9zZWdtZW50dGVtcGxhdGVfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmlvZF9zZWdtZW50bGlzdF9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRfdGVtcGxhdGVfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRfY29tcG9uZW50X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGlvbnNldF9iYXNldXJsX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGlvbnNldF9zZWdtZW50bGlzdF9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRhcHRpb25zZXRfc3VwcGxlbWVudGFscHJvcGVydHlfbm9kZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9IHhtbE5leHRFbGVtZW50U2libGluZyhub2RlKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfbWFuaWZlc3QoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICp1cmwsIEFWSU9Db250ZXh0ICppbikKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgY2xvc2VfaW4gPSAwOworICAgIHVpbnQ4X3QgKm5ld191cmwgPSBOVUxMOworICAgIGludDY0X3QgZmlsZXNpemUgPSAwOworICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKKyAgICB4bWxEb2MgKmRvYyA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciByb290X2VsZW1lbnQgPSBOVUxMOworICAgIHhtbE5vZGVQdHIgbm9kZSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciBwZXJpb2Rfbm9kZSA9IE5VTEw7CisgICAgeG1sTm9kZVB0ciBtcGRfYmFzZXVybF9ub2RlID0gTlVMTDsKKyAgICB4bWxOb2RlUHRyIHBlcmlvZF9iYXNldXJsX25vZGUgPSBOVUxMOworICAgIHhtbE5vZGVQdHIgcGVyaW9kX3NlZ21lbnR0ZW1wbGF0ZV9ub2RlID0gTlVMTDsKKyAgICB4bWxOb2RlUHRyIHBlcmlvZF9zZWdtZW50bGlzdF9ub2RlID0gTlVMTDsKKyAgICB4bWxOb2RlUHRyIGFkYXB0aW9uc2V0X25vZGUgPSBOVUxMOworICAgIHhtbEF0dHJQdHIgYXR0ciA9IE5VTEw7CisgICAgY2hhciAqdmFsICA9IE5VTEw7CisgICAgdWludDMyX3QgcGVyaW9kX2R1cmF0aW9uX3NlYyA9IDA7CisgICAgdWludDMyX3QgcGVyaW9kX3N0YXJ0X3NlYyA9IDA7CisKKyAgICBpZiAoIWluKSB7CisgICAgICAgIGNsb3NlX2luID0gMTsKKworICAgICAgICBzZXRfaHR0cGhlYWRlcl9vcHRpb25zKGMsICZvcHRzKTsKKyAgICAgICAgcmV0ID0gYXZpb19vcGVuMigmaW4sIHVybCwgQVZJT19GTEFHX1JFQUQsIGMtPmludGVycnVwdF9jYWxsYmFjaywgJm9wdHMpOworICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGF2X29wdF9nZXQoaW4sICJsb2NhdGlvbiIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4sICZuZXdfdXJsKSA+PSAwKSB7CisgICAgICAgIGMtPmJhc2VfdXJsID0gYXZfc3RyZHVwKG5ld191cmwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGMtPmJhc2VfdXJsID0gYXZfc3RyZHVwKHVybCk7CisgICAgfQorCisgICAgZmlsZXNpemUgPSBhdmlvX3NpemUoaW4pOworICAgIGlmIChmaWxlc2l6ZSA8PSAwKSB7CisgICAgICAgIGZpbGVzaXplID0gOCAqIDEwMjQ7CisgICAgfQorCisgICAgYnVmZmVyID0gYXZfbWFsbG9jeihmaWxlc2l6ZSk7CisgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgYXZfZnJlZShjLT5iYXNlX3VybCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgZmlsZXNpemUgPSBhdmlvX3JlYWQoaW4sIGJ1ZmZlciwgZmlsZXNpemUpOworICAgIGlmIChmaWxlc2l6ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVhZCB0byBvZmZzZXQgJyVzJ1xuIiwgdXJsKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9IGVsc2UgeworICAgICAgICBMSUJYTUxfVEVTVF9WRVJTSU9OCisKKyAgICAgICAgZG9jID0geG1sUmVhZE1lbW9yeShidWZmZXIsIGZpbGVzaXplLCBjLT5iYXNlX3VybCwgTlVMTCwgMCk7CisgICAgICAgIHJvb3RfZWxlbWVudCA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7CisgICAgICAgIG5vZGUgPSByb290X2VsZW1lbnQ7CisKKyAgICAgICAgaWYgKCFub2RlKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSAnJXMnIC0gbWlzc2luZyByb290IG5vZGVcbiIsIHVybCk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobm9kZS0+dHlwZSAhPSBYTUxfRUxFTUVOVF9OT0RFIHx8CisgICAgICAgICAgICBhdl9zdHJjYXNlY21wKG5vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIk1QRCIpKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSAnJXMnIC0gd3Jvbmcgcm9vdCBub2RlIG5hbWVbJXNdIHR5cGVbJWRdXG4iLCB1cmwsIG5vZGUtPm5hbWUsIChpbnQpbm9kZS0+dHlwZSk7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICB2YWwgPSB4bWxHZXRQcm9wKG5vZGUsICJ0eXBlIik7CisgICAgICAgIGlmICghdmFsKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlICclcycgLSBtaXNzaW5nIHR5cGUgYXR0cmliXG4iLCB1cmwpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAodmFsLCAoY29uc3QgY2hhciAqKSJkeW5hbWljIikpCisgICAgICAgICAgICBjLT5pc19saXZlID0gMTsKKyAgICAgICAgeG1sRnJlZSh2YWwpOworCisgICAgICAgIGF0dHIgPSBub2RlLT5wcm9wZXJ0aWVzOworICAgICAgICB3aGlsZSAoYXR0cikgeworICAgICAgICAgICAgdmFsID0geG1sR2V0UHJvcChub2RlLCBhdHRyLT5uYW1lKTsKKworICAgICAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKGF0dHItPm5hbWUsIChjb25zdCBjaGFyICopImF2YWlsYWJpbGl0eVN0YXJ0VGltZSIpKSB7CisgICAgICAgICAgICAgICAgYy0+YXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWUgPSBnZXRfdXRjX2RhdGVfdGltZV9pbnNlYyhzLCAoY29uc3QgY2hhciAqKXZhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGF0dHItPm5hbWUsIChjb25zdCBjaGFyICopInB1Ymxpc2hUaW1lIikpIHsKKyAgICAgICAgICAgICAgICBjLT5wdWJsaXNoX3RpbWUgPSBnZXRfdXRjX2RhdGVfdGltZV9pbnNlYyhzLCAoY29uc3QgY2hhciAqKXZhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGF0dHItPm5hbWUsIChjb25zdCBjaGFyICopIm1pbmltdW1VcGRhdGVQZXJpb2QiKSkgeworICAgICAgICAgICAgICAgIGMtPm1pbmltdW1fdXBkYXRlX3BlcmlvZCA9IGdldF9kdXJhdGlvbl9pbnNlYyhzLCAoY29uc3QgY2hhciAqKXZhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGF0dHItPm5hbWUsIChjb25zdCBjaGFyICopInRpbWVTaGlmdEJ1ZmZlckRlcHRoIikpIHsKKyAgICAgICAgICAgICAgICBjLT50aW1lX3NoaWZ0X2J1ZmZlcl9kZXB0aCA9IGdldF9kdXJhdGlvbl9pbnNlYyhzLCAoY29uc3QgY2hhciAqKXZhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGF0dHItPm5hbWUsIChjb25zdCBjaGFyICopIm1pbkJ1ZmZlclRpbWUiKSkgeworICAgICAgICAgICAgICAgIGMtPm1pbl9idWZmZXJfdGltZSA9IGdldF9kdXJhdGlvbl9pbnNlYyhzLCAoY29uc3QgY2hhciAqKXZhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGF0dHItPm5hbWUsIChjb25zdCBjaGFyICopInN1Z2dlc3RlZFByZXNlbnRhdGlvbkRlbGF5IikpIHsKKyAgICAgICAgICAgICAgICBjLT5zdWdnZXN0ZWRfcHJlc2VudGF0aW9uX2RlbGF5ID0gZ2V0X2R1cmF0aW9uX2luc2VjKHMsIChjb25zdCBjaGFyICopdmFsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoYXR0ci0+bmFtZSwgKGNvbnN0IGNoYXIgKikibWVkaWFQcmVzZW50YXRpb25EdXJhdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgYy0+bWVkaWFfcHJlc2VudGF0aW9uX2R1cmF0aW9uID0gZ2V0X2R1cmF0aW9uX2luc2VjKHMsIChjb25zdCBjaGFyICopdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIgPSBhdHRyLT5uZXh0OworICAgICAgICAgICAgeG1sRnJlZSh2YWwpOworICAgICAgICB9CisKKyAgICAgICAgbXBkX2Jhc2V1cmxfbm9kZSA9IGZpbmRfY2hpbGRfbm9kZV9ieV9uYW1lKG5vZGUsICJCYXNlVVJMIik7CisgICAgICAgIGlmICghbXBkX2Jhc2V1cmxfbm9kZSkgeworICAgICAgICAgICAgbXBkX2Jhc2V1cmxfbm9kZSA9IHhtbE5ld05vZGUoTlVMTCwgIkJhc2VVUkwiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGF0IG5vdyB3ZSBjYW4gaGFuZGxlIG9ubHkgb25lIHBlcmlvZCwgd2l0aCB0aGUgbG9uZ2VzdCBkdXJhdGlvbgorICAgICAgICBub2RlID0geG1sRmlyc3RFbGVtZW50Q2hpbGQobm9kZSk7CisgICAgICAgIHdoaWxlIChub2RlKSB7CisgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAobm9kZS0+bmFtZSwgKGNvbnN0IGNoYXIgKikiUGVyaW9kIikpIHsKKyAgICAgICAgICAgICAgICBwZXJpb2RfZHVyYXRpb25fc2VjID0gMDsKKyAgICAgICAgICAgICAgICBwZXJpb2Rfc3RhcnRfc2VjID0gMDsKKyAgICAgICAgICAgICAgICBhdHRyID0gbm9kZS0+cHJvcGVydGllczsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYXR0cikgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSB4bWxHZXRQcm9wKG5vZGUsIGF0dHItPm5hbWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoYXR0ci0+bmFtZSwgKGNvbnN0IGNoYXIgKikiZHVyYXRpb24iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kX2R1cmF0aW9uX3NlYyA9IGdldF9kdXJhdGlvbl9pbnNlYyhzLCAoY29uc3QgY2hhciAqKXZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoYXR0ci0+bmFtZSwgKGNvbnN0IGNoYXIgKikic3RhcnQiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kX3N0YXJ0X3NlYyA9IGdldF9kdXJhdGlvbl9pbnNlYyhzLCAoY29uc3QgY2hhciAqKXZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXR0ciA9IGF0dHItPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUodmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChwZXJpb2RfZHVyYXRpb25fc2VjKSA+PSAoYy0+cGVyaW9kX2R1cmF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICBwZXJpb2Rfbm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgIGMtPnBlcmlvZF9kdXJhdGlvbiA9IHBlcmlvZF9kdXJhdGlvbl9zZWM7CisgICAgICAgICAgICAgICAgICAgIGMtPnBlcmlvZF9zdGFydCA9IHBlcmlvZF9zdGFydF9zZWM7CisgICAgICAgICAgICAgICAgICAgIGlmIChjLT5wZXJpb2Rfc3RhcnQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgYy0+bWVkaWFfcHJlc2VudGF0aW9uX2R1cmF0aW9uID0gYy0+cGVyaW9kX2R1cmF0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSB4bWxOZXh0RWxlbWVudFNpYmxpbmcobm9kZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwZXJpb2Rfbm9kZSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSAnJXMnIC0gbWlzc2luZyBQZXJpb2Qgbm9kZVxuIiwgdXJsKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgICAgIH0KKworICAgICAgICBhZGFwdGlvbnNldF9ub2RlID0geG1sRmlyc3RFbGVtZW50Q2hpbGQocGVyaW9kX25vZGUpOworICAgICAgICB3aGlsZSAoYWRhcHRpb25zZXRfbm9kZSkgeworICAgICAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKGFkYXB0aW9uc2V0X25vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIkJhc2VVUkwiKSkgeworICAgICAgICAgICAgICAgIHBlcmlvZF9iYXNldXJsX25vZGUgPSBhZGFwdGlvbnNldF9ub2RlOworICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChhZGFwdGlvbnNldF9ub2RlLT5uYW1lLCAoY29uc3QgY2hhciAqKSJTZWdtZW50VGVtcGxhdGUiKSkgeworICAgICAgICAgICAgICAgIHBlcmlvZF9zZWdtZW50dGVtcGxhdGVfbm9kZSA9IGFkYXB0aW9uc2V0X25vZGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGFkYXB0aW9uc2V0X25vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIlNlZ21lbnRMaXN0IikpIHsKKyAgICAgICAgICAgICAgICBwZXJpb2Rfc2VnbWVudGxpc3Rfbm9kZSA9IGFkYXB0aW9uc2V0X25vZGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGFkYXB0aW9uc2V0X25vZGUtPm5hbWUsIChjb25zdCBjaGFyICopIkFkYXB0YXRpb25TZXQiKSkgeworICAgICAgICAgICAgICAgIHBhcnNlX21hbmlmZXN0X2FkYXB0YXRpb25zZXQocywgdXJsLCBhZGFwdGlvbnNldF9ub2RlLCBtcGRfYmFzZXVybF9ub2RlLCBwZXJpb2RfYmFzZXVybF9ub2RlLCBwZXJpb2Rfc2VnbWVudHRlbXBsYXRlX25vZGUsIHBlcmlvZF9zZWdtZW50bGlzdF9ub2RlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkYXB0aW9uc2V0X25vZGUgPSB4bWxOZXh0RWxlbWVudFNpYmxpbmcoYWRhcHRpb25zZXRfbm9kZSk7CisgICAgICAgIH0KK2NsZWFudXA6CisgICAgICAgIC8qZnJlZSB0aGUgZG9jdW1lbnQgKi8KKyAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgICAgICB4bWxDbGVhbnVwUGFyc2VyKCk7CisgICAgfQorCisgICAgYXZfZnJlZShuZXdfdXJsKTsKKyAgICBhdl9mcmVlKGJ1ZmZlcik7CisgICAgaWYgKGNsb3NlX2luKSB7CisgICAgICAgIGF2aW9fY2xvc2UoaW4pOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50NjRfdCBjYWxjX2N1cl9zZWdfbm8oQVZGb3JtYXRDb250ZXh0ICpzLCBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnBscykKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IG51bSA9IDA7CisgICAgaW50NjRfdCBzdGFydF90aW1lX29mZnNldCA9IDA7CisKKyAgICBpZiAoYy0+aXNfbGl2ZSkgeworICAgICAgICBpZiAocGxzLT5uX2ZyYWdtZW50cykgeworICAgICAgICAgICAgbnVtID0gcGxzLT5maXJzdF9zZXFfbm87CisgICAgICAgIH0gZWxzZSBpZiAocGxzLT5uX3RpbWVsaW5lcykgeworICAgICAgICAgICAgc3RhcnRfdGltZV9vZmZzZXQgPSBnZXRfc2VnbWVudF9zdGFydF90aW1lX2Jhc2VkX29uX3RpbWVsaW5lKHBscywgMHhGRkZGRkZGRikgLSA2MCAqIHBscy0+ZnJhZ21lbnRfdGltZXNjYWxlOyAvLyA2MCBzZWNvbmRzIGJlZm9yZSBlbmQKKyAgICAgICAgICAgIG51bSA9IGNhbGNfbmV4dF9zZWdfbm9fZnJvbV90aW1lbGluZXMocGxzLCBzdGFydF90aW1lX29mZnNldCk7CisgICAgICAgICAgICBpZiAobnVtID09IC0xKQorICAgICAgICAgICAgICAgIG51bSA9IHBscy0+Zmlyc3Rfc2VxX25vOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG51bSArPSBwbHMtPmZpcnN0X3NlcV9ubzsKKyAgICAgICAgfSBlbHNlIGlmIChwbHMtPmZyYWdtZW50X2R1cmF0aW9uKXsKKyAgICAgICAgICAgIGlmIChwbHMtPnByZXNlbnRhdGlvbl90aW1lb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgbnVtID0gcGxzLT5wcmVzZW50YXRpb25fdGltZW9mZnNldCAqIHBscy0+ZnJhZ21lbnRfdGltZXNjYWxlIC8gcGxzLT5mcmFnbWVudF9kdXJhdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYy0+cHVibGlzaF90aW1lID4gMCAmJiAhYy0+YXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWUpIHsKKyAgICAgICAgICAgICAgICBudW0gPSBwbHMtPmZpcnN0X3NlcV9ubyArICgoKGMtPnB1Ymxpc2hfdGltZSAtIGMtPmF2YWlsYWJpbGl0eV9zdGFydF90aW1lKSAtIGMtPnN1Z2dlc3RlZF9wcmVzZW50YXRpb25fZGVsYXkpICogcGxzLT5mcmFnbWVudF90aW1lc2NhbGUpIC8gcGxzLT5mcmFnbWVudF9kdXJhdGlvbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtID0gcGxzLT5maXJzdF9zZXFfbm8gKyAoKChnZXRfY3VycmVudF90aW1lX2luX3NlYygpIC0gYy0+YXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWUpIC0gYy0+c3VnZ2VzdGVkX3ByZXNlbnRhdGlvbl9kZWxheSkgKiBwbHMtPmZyYWdtZW50X3RpbWVzY2FsZSkgLyBwbHMtPmZyYWdtZW50X2R1cmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbnVtID0gcGxzLT5maXJzdF9zZXFfbm87CisgICAgfQorICAgIHJldHVybiBudW07Cit9CisKK3N0YXRpYyBpbnQ2NF90IGNhbGNfbWluX3NlZ19ubyhBVkZvcm1hdENvbnRleHQgKnMsIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzKQoreworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgbnVtID0gMDsKKworICAgIGlmIChjLT5pc19saXZlICYmIHBscy0+ZnJhZ21lbnRfZHVyYXRpb24pIHsKKyAgICAgICAgbnVtID0gcGxzLT5maXJzdF9zZXFfbm8gKyAoKChnZXRfY3VycmVudF90aW1lX2luX3NlYygpIC0gYy0+YXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWUpIC0gYy0+dGltZV9zaGlmdF9idWZmZXJfZGVwdGgpICogcGxzLT5mcmFnbWVudF90aW1lc2NhbGUpIC8gcGxzLT5mcmFnbWVudF9kdXJhdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBudW0gPSBwbHMtPmZpcnN0X3NlcV9ubzsKKyAgICB9CisgICAgcmV0dXJuIG51bTsKK30KKworc3RhdGljIGludDY0X3QgY2FsY19tYXhfc2VnX25vKHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzLCBEQVNIQ29udGV4dCAqYykKK3sKKyAgICBpbnQ2NF90IG51bSA9IDA7CisKKyAgICBpZiAocGxzLT5uX2ZyYWdtZW50cykgeworICAgICAgICBudW0gPSBwbHMtPmZpcnN0X3NlcV9ubyArIHBscy0+bl9mcmFnbWVudHMgLSAxOworICAgIH0gZWxzZSBpZiAocGxzLT5uX3RpbWVsaW5lcykgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIG51bSA9IHBscy0+Zmlyc3Rfc2VxX25vICsgcGxzLT5uX3RpbWVsaW5lcyAtIDE7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwbHMtPm5fdGltZWxpbmVzOyBpKyspIHsKKyAgICAgICAgICAgIG51bSArPSBwbHMtPnRpbWVsaW5lc1tpXS0+cmVwZWF0OworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjLT5pc19saXZlICYmIHBscy0+ZnJhZ21lbnRfZHVyYXRpb24pIHsKKyAgICAgICAgbnVtID0gcGxzLT5maXJzdF9zZXFfbm8gKyAoKChnZXRfY3VycmVudF90aW1lX2luX3NlYygpIC0gYy0+YXZhaWxhYmlsaXR5X3N0YXJ0X3RpbWUpKSAqIHBscy0+ZnJhZ21lbnRfdGltZXNjYWxlKSAgLyBwbHMtPmZyYWdtZW50X2R1cmF0aW9uOworICAgIH0gZWxzZSBpZiAocGxzLT5mcmFnbWVudF9kdXJhdGlvbikgeworICAgICAgICBudW0gPSBwbHMtPmZpcnN0X3NlcV9ubyArIChjLT5tZWRpYV9wcmVzZW50YXRpb25fZHVyYXRpb24gKiBwbHMtPmZyYWdtZW50X3RpbWVzY2FsZSkgLyBwbHMtPmZyYWdtZW50X2R1cmF0aW9uOworICAgIH0KKworICAgIHJldHVybiBudW07Cit9CisKK3N0YXRpYyB2b2lkIG1vdmVfdGltZWxpbmVzKHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcmVwX3NyYywgc3RydWN0IHJlcHJlc2VudGF0aW9uICpyZXBfZGVzdCwgREFTSENvbnRleHQgKmMpCit7CisgICAgaWYgKHJlcF9kZXN0ICYmIHJlcF9zcmMgKSB7CisgICAgICAgIGZyZWVfdGltZWxpbmVzX2xpc3QocmVwX2Rlc3QpOworICAgICAgICByZXBfZGVzdC0+dGltZWxpbmVzICAgID0gcmVwX3NyYy0+dGltZWxpbmVzOworICAgICAgICByZXBfZGVzdC0+bl90aW1lbGluZXMgID0gcmVwX3NyYy0+bl90aW1lbGluZXM7CisgICAgICAgIHJlcF9kZXN0LT5maXJzdF9zZXFfbm8gPSByZXBfc3JjLT5maXJzdF9zZXFfbm87CisgICAgICAgIHJlcF9kZXN0LT5sYXN0X3NlcV9ubyA9IGNhbGNfbWF4X3NlZ19ubyhyZXBfZGVzdCwgYyk7CisgICAgICAgIHJlcF9zcmMtPnRpbWVsaW5lcyA9IE5VTEw7CisgICAgICAgIHJlcF9zcmMtPm5fdGltZWxpbmVzID0gMDsKKyAgICAgICAgcmVwX2Rlc3QtPmN1cl9zZXFfbm8gPSByZXBfc3JjLT5jdXJfc2VxX25vOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbW92ZV9zZWdtZW50cyhzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnJlcF9zcmMsIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcmVwX2Rlc3QsIERBU0hDb250ZXh0ICpjKQoreworICAgIGlmIChyZXBfZGVzdCAmJiByZXBfc3JjICkgeworICAgICAgICBmcmVlX2ZyYWdtZW50X2xpc3QocmVwX2Rlc3QpOworICAgICAgICBpZiAocmVwX3NyYy0+c3RhcnRfbnVtYmVyID4gKHJlcF9kZXN0LT5zdGFydF9udW1iZXIgKyByZXBfZGVzdC0+bl9mcmFnbWVudHMpKQorICAgICAgICAgICAgcmVwX2Rlc3QtPmN1cl9zZXFfbm8gPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXBfZGVzdC0+Y3VyX3NlcV9ubyArPSByZXBfc3JjLT5zdGFydF9udW1iZXIgLSByZXBfZGVzdC0+c3RhcnRfbnVtYmVyOworICAgICAgICByZXBfZGVzdC0+ZnJhZ21lbnRzICAgID0gcmVwX3NyYy0+ZnJhZ21lbnRzOworICAgICAgICByZXBfZGVzdC0+bl9mcmFnbWVudHMgID0gcmVwX3NyYy0+bl9mcmFnbWVudHM7CisgICAgICAgIHJlcF9kZXN0LT5wYXJlbnQgID0gcmVwX3NyYy0+cGFyZW50OworICAgICAgICByZXBfZGVzdC0+bGFzdF9zZXFfbm8gPSBjYWxjX21heF9zZWdfbm8ocmVwX2Rlc3QsIGMpOworICAgICAgICByZXBfc3JjLT5mcmFnbWVudHMgPSBOVUxMOworICAgICAgICByZXBfc3JjLT5uX2ZyYWdtZW50cyA9IDA7CisgICAgfQorfQorCisKK3N0YXRpYyBpbnQgcmVmcmVzaF9tYW5pZmVzdChBVkZvcm1hdENvbnRleHQgKnMpCit7CisKKyAgICBpbnQgcmV0ID0gMCwgaTsKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKworICAgIC8vIHNhdmUgY3VycmVudCBjb250ZXh0CisgICAgaW50IG5fdmlkZW9zID0gYy0+bl92aWRlb3M7CisgICAgc3RydWN0IHJlcHJlc2VudGF0aW9uICoqdmlkZW9zID0gYy0+dmlkZW9zOworICAgIGludCBuX2F1ZGlvcyA9IGMtPm5fYXVkaW9zOworICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqKmF1ZGlvcyA9IGMtPmF1ZGlvczsKKyAgICBjaGFyICpiYXNlX3VybCA9IGMtPmJhc2VfdXJsOworCisgICAgYy0+YmFzZV91cmwgPSBOVUxMOworICAgIGMtPm5fdmlkZW9zID0gMDsKKyAgICBjLT52aWRlb3MgPSBOVUxMOworICAgIGMtPm5fYXVkaW9zID0gMDsKKyAgICBjLT5hdWRpb3MgPSBOVUxMOworICAgIHJldCA9IHBhcnNlX21hbmlmZXN0KHMsIHMtPmZpbGVuYW1lLCBOVUxMKTsKKyAgICBpZiAocmV0KQorICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgIGlmIChjLT5uX3ZpZGVvcyAhPSBuX3ZpZGVvcykgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgIm5ldyBtYW5pZmVzdCBoYXMgbWlzbWF0Y2hlZCBuby4gb2YgdmlkZW8gcmVwcmVzZW50YXRpb25zLCAlZCAtPiAlZFxuIiwKKyAgICAgICAgICAgIG5fdmlkZW9zLCBjLT5uX3ZpZGVvcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBpZiAoYy0+bl9hdWRpb3MgIT0gbl9hdWRpb3MpIHsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICJuZXcgbWFuaWZlc3QgaGFzIG1pc21hdGNoZWQgbm8uIG9mIGF1ZGlvIHJlcHJlc2VudGF0aW9ucywgJWQgLT4gJWRcbiIsCisgICAgICAgICAgICBuX2F1ZGlvcywgYy0+bl9hdWRpb3MpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbl92aWRlb3M7IGkrKykgeworICAgICAgICBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKmN1cl92aWRlbyA9IHZpZGVvc1tpXTsKKyAgICAgICAgc3RydWN0IHJlcHJlc2VudGF0aW9uICpjY3VyX3ZpZGVvID0gYy0+dmlkZW9zW2ldOworICAgICAgICBpZiAoY3VyX3ZpZGVvLT50aW1lbGluZXMpIHsKKyAgICAgICAgICAgIC8vIGNhbGMgY3VycmVudCB0aW1lCisgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRUaW1lID0gZ2V0X3NlZ21lbnRfc3RhcnRfdGltZV9iYXNlZF9vbl90aW1lbGluZShjdXJfdmlkZW8sIGN1cl92aWRlby0+Y3VyX3NlcV9ubykgLyBjdXJfdmlkZW8tPmZyYWdtZW50X3RpbWVzY2FsZTsKKyAgICAgICAgICAgIC8vIHVwZGF0ZSBzZWdtZW50cworICAgICAgICAgICAgY2N1cl92aWRlby0+Y3VyX3NlcV9ubyA9IGNhbGNfbmV4dF9zZWdfbm9fZnJvbV90aW1lbGluZXMoY2N1cl92aWRlbywgY3VycmVudFRpbWUgKiBjdXJfdmlkZW8tPmZyYWdtZW50X3RpbWVzY2FsZSAtIDEpOworICAgICAgICAgICAgaWYgKGNjdXJfdmlkZW8tPmN1cl9zZXFfbm8gPj0gMCkgeworICAgICAgICAgICAgICAgIG1vdmVfdGltZWxpbmVzKGNjdXJfdmlkZW8sIGN1cl92aWRlbywgYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cl92aWRlby0+ZnJhZ21lbnRzKSB7CisgICAgICAgICAgICBtb3ZlX3NlZ21lbnRzKGNjdXJfdmlkZW8sIGN1cl92aWRlbywgYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5fYXVkaW9zOyBpKyspIHsKKyAgICAgICAgc3RydWN0IHJlcHJlc2VudGF0aW9uICpjdXJfYXVkaW8gPSBhdWRpb3NbaV07CisgICAgICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqY2N1cl9hdWRpbyA9IGMtPmF1ZGlvc1tpXTsKKyAgICAgICAgaWYgKGN1cl9hdWRpby0+dGltZWxpbmVzKSB7CisgICAgICAgICAgICAvLyBjYWxjIGN1cnJlbnQgdGltZQorICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZSA9IGdldF9zZWdtZW50X3N0YXJ0X3RpbWVfYmFzZWRfb25fdGltZWxpbmUoY3VyX2F1ZGlvLCBjdXJfYXVkaW8tPmN1cl9zZXFfbm8pIC8gY3VyX2F1ZGlvLT5mcmFnbWVudF90aW1lc2NhbGU7CisgICAgICAgICAgICAvLyB1cGRhdGUgc2VnbWVudHMKKyAgICAgICAgICAgIGNjdXJfYXVkaW8tPmN1cl9zZXFfbm8gPSBjYWxjX25leHRfc2VnX25vX2Zyb21fdGltZWxpbmVzKGNjdXJfYXVkaW8sIGN1cnJlbnRUaW1lICogY3VyX2F1ZGlvLT5mcmFnbWVudF90aW1lc2NhbGUgLSAxKTsKKyAgICAgICAgICAgIGlmIChjY3VyX2F1ZGlvLT5jdXJfc2VxX25vID49IDApIHsKKyAgICAgICAgICAgICAgICBtb3ZlX3RpbWVsaW5lcyhjY3VyX2F1ZGlvLCBjdXJfYXVkaW8sIGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjdXJfYXVkaW8tPmZyYWdtZW50cykgeworICAgICAgICAgICAgbW92ZV9zZWdtZW50cyhjY3VyX2F1ZGlvLCBjdXJfYXVkaW8sIGMpOworICAgICAgICB9CisgICAgfQorCitmaW5pc2g6CisgICAgLy8gcmVzdG9yZSBjb250ZXh0CisgICAgaWYgKGMtPmJhc2VfdXJsKQorICAgICAgICBhdl9mcmVlKGJhc2VfdXJsKTsKKyAgICBlbHNlCisgICAgICAgIGMtPmJhc2VfdXJsICA9IGJhc2VfdXJsOworICAgIGlmIChjLT5hdWRpb3MpCisgICAgICAgIGZyZWVfYXVkaW9fbGlzdChjKTsKKyAgICBpZiAoYy0+dmlkZW9zKQorICAgICAgICBmcmVlX3ZpZGVvX2xpc3QoYyk7CisgICAgYy0+bl9hdWRpb3MgPSBuX2F1ZGlvczsKKyAgICBjLT5hdWRpb3MgPSBhdWRpb3M7CisgICAgYy0+bl92aWRlb3MgPSBuX3ZpZGVvczsKKyAgICBjLT52aWRlb3MgPSB2aWRlb3M7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBmcmFnbWVudCAqZ2V0X2N1cnJlbnRfZnJhZ21lbnQoc3RydWN0IHJlcHJlc2VudGF0aW9uICpwbHMpCit7CisgICAgaW50NjRfdCBtaW5fc2VxX25vID0gMDsKKyAgICBpbnQ2NF90IG1heF9zZXFfbm8gPSAwOworICAgIHN0cnVjdCBmcmFnbWVudCAqc2VnID0gTlVMTDsKKyAgICBzdHJ1Y3QgZnJhZ21lbnQgKnNlZ19wdHIgPSBOVUxMOworICAgIERBU0hDb250ZXh0ICpjID0gcGxzLT5wYXJlbnQtPnByaXZfZGF0YTsKKworICAgIHdoaWxlICgoICFmZl9jaGVja19pbnRlcnJ1cHQoYy0+aW50ZXJydXB0X2NhbGxiYWNrKSYmIHBscy0+bl9mcmFnbWVudHMgPiAwKSkgeworICAgICAgICBpZiAocGxzLT5jdXJfc2VxX25vIDwgcGxzLT5uX2ZyYWdtZW50cykgeworICAgICAgICAgICAgc2VnX3B0ciA9IHBscy0+ZnJhZ21lbnRzW3Bscy0+Y3VyX3NlcV9ub107CisgICAgICAgICAgICBzZWcgPSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgZnJhZ21lbnQpKTsKKyAgICAgICAgICAgIGlmICghc2VnKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWctPnVybCA9IGF2X3N0cmR1cChzZWdfcHRyLT51cmwpOworICAgICAgICAgICAgaWYgKCFzZWctPnVybCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUoc2VnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlZy0+c2l6ZSA9IHNlZ19wdHItPnNpemU7CisgICAgICAgICAgICBzZWctPnVybF9vZmZzZXQgPSBzZWdfcHRyLT51cmxfb2Zmc2V0OworICAgICAgICAgICAgcmV0dXJuIHNlZzsKKyAgICAgICAgfSBlbHNlIGlmIChjLT5pc19saXZlKSB7CisgICAgICAgICAgICByZWZyZXNoX21hbmlmZXN0KHBscy0+cGFyZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjLT5pc19saXZlKSB7CisgICAgICAgIG1pbl9zZXFfbm8gPSBjYWxjX21pbl9zZWdfbm8ocGxzLT5wYXJlbnQsIHBscyk7CisgICAgICAgIG1heF9zZXFfbm8gPSBjYWxjX21heF9zZWdfbm8ocGxzLCBjKTsKKworICAgICAgICBpZiAocGxzLT50aW1lbGluZXMgfHwgcGxzLT5mcmFnbWVudHMpIHsKKyAgICAgICAgICAgIHJlZnJlc2hfbWFuaWZlc3QocGxzLT5wYXJlbnQpOworICAgICAgICB9CisgICAgICAgIGlmIChwbHMtPmN1cl9zZXFfbm8gPD0gbWluX3NlcV9ubykgeworICAgICAgICAgICAgYXZfbG9nKHBscy0+cGFyZW50LCBBVl9MT0dfVkVSQk9TRSwgIm9sZCBmcmFnbWVudDogY3VyWyUiUFJJZDY0Il0gbWluWyUiUFJJZDY0Il0gbWF4WyUiUFJJZDY0Il0sIHBsYXlsaXN0ICVkXG4iLCAoaW50NjRfdClwbHMtPmN1cl9zZXFfbm8sIG1pbl9zZXFfbm8sIG1heF9zZXFfbm8sIChpbnQpcGxzLT5yZXBfaWR4KTsKKyAgICAgICAgICAgIHBscy0+Y3VyX3NlcV9ubyA9IGNhbGNfY3VyX3NlZ19ubyhwbHMtPnBhcmVudCwgcGxzKTsKKyAgICAgICAgfSBlbHNlIGlmIChwbHMtPmN1cl9zZXFfbm8gPiBtYXhfc2VxX25vKSB7CisgICAgICAgICAgICBhdl9sb2cocGxzLT5wYXJlbnQsIEFWX0xPR19WRVJCT1NFLCAibmV3IGZyYWdtZW50OiBtaW5bJSJQUklkNjQiXSBtYXhbJSJQUklkNjQiXSwgcGxheWxpc3QgJWRcbiIsIG1pbl9zZXFfbm8sIG1heF9zZXFfbm8sIChpbnQpcGxzLT5yZXBfaWR4KTsKKyAgICAgICAgfQorICAgICAgICBzZWcgPSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgZnJhZ21lbnQpKTsKKyAgICAgICAgaWYgKCFzZWcpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwbHMtPmN1cl9zZXFfbm8gPD0gcGxzLT5sYXN0X3NlcV9ubykgeworICAgICAgICBzZWcgPSBhdl9tYWxsb2N6KHNpemVvZihzdHJ1Y3QgZnJhZ21lbnQpKTsKKyAgICAgICAgaWYgKCFzZWcpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzZWcpIHsKKyAgICAgICAgY2hhciAqdG1wZmlsZW5hbWU9IGF2X21hbGxvY3ooYy0+bWF4X3VybF9zaXplKTsKKyAgICAgICAgaWYgKCF0bXBmaWxlbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZmZfZGFzaF9maWxsX3RtcGxfcGFyYW1zKHRtcGZpbGVuYW1lLCBjLT5tYXhfdXJsX3NpemUsIHBscy0+dXJsX3RlbXBsYXRlLCAwLCBwbHMtPmN1cl9zZXFfbm8sIDAsIGdldF9zZWdtZW50X3N0YXJ0X3RpbWVfYmFzZWRfb25fdGltZWxpbmUocGxzLCBwbHMtPmN1cl9zZXFfbm8pKTsKKyAgICAgICAgc2VnLT51cmwgPSBhdl9zdHJpcmVwbGFjZShwbHMtPnVybF90ZW1wbGF0ZSwgcGxzLT51cmxfdGVtcGxhdGUsIHRtcGZpbGVuYW1lKTsKKyAgICAgICAgaWYgKCFzZWctPnVybCkgeworICAgICAgICAgICAgYXZfbG9nKHBscy0+cGFyZW50LCBBVl9MT0dfV0FSTklORywgIlVuYWJsZSB0byByZXNvbHZlIHRlbXBsYXRlIHVybCAnJXMnLCB0cnkgdG8gdXNlIG9yaWdpbiB0ZW1wbGF0ZVxuIiwgcGxzLT51cmxfdGVtcGxhdGUpOworICAgICAgICAgICAgc2VnLT51cmwgPSBhdl9zdHJkdXAocGxzLT51cmxfdGVtcGxhdGUpOworICAgICAgICAgICAgaWYgKCFzZWctPnVybCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhwbHMtPnBhcmVudCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IHJlc29sdmUgdGVtcGxhdGUgdXJsICclcydcbiIsIHBscy0+dXJsX3RlbXBsYXRlKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHRtcGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlKHRtcGZpbGVuYW1lKTsKKyAgICAgICAgc2VnLT5zaXplID0gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHNlZzsKK30KKworZW51bSBSZWFkRnJvbVVSTE1vZGUgeworICAgIFJFQURfTk9STUFMLAorICAgIFJFQURfQ09NUExFVEUsCit9OworCitzdGF0aWMgaW50IHJlYWRfZnJvbV91cmwoc3RydWN0IHJlcHJlc2VudGF0aW9uICpwbHMsIHN0cnVjdCBmcmFnbWVudCAqc2VnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gUmVhZEZyb21VUkxNb2RlIG1vZGUpCit7CisgICAgaW50IHJldDsKKworICAgIC8qIGxpbWl0IHJlYWQgaWYgdGhlIGZyYWdtZW50IHdhcyBvbmx5IGEgcGFydCBvZiBhIGZpbGUgKi8KKyAgICBpZiAoc2VnLT5zaXplID49IDApCisgICAgICAgIGJ1Zl9zaXplID0gRkZNSU4oYnVmX3NpemUsIHBscy0+Y3VyX3NlZ19zaXplIC0gcGxzLT5jdXJfc2VnX29mZnNldCk7CisKKyAgICBpZiAobW9kZSA9PSBSRUFEX0NPTVBMRVRFKSB7CisgICAgICAgIHJldCA9IGF2aW9fcmVhZChwbHMtPmlucHV0LCBidWYsIGJ1Zl9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IGJ1Zl9zaXplKSB7CisgICAgICAgICAgICBhdl9sb2cocGxzLT5wYXJlbnQsIEFWX0xPR19XQVJOSU5HLCAiQ291bGQgbm90IHJlYWQgY29tcGxldGUgZnJhZ21lbnQuXG4iKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGF2aW9fcmVhZChwbHMtPmlucHV0LCBidWYsIGJ1Zl9zaXplKTsKKyAgICB9CisgICAgaWYgKHJldCA+IDApCisgICAgICAgIHBscy0+Y3VyX3NlZ19vZmZzZXQgKz0gcmV0OworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvcGVuX2lucHV0KERBU0hDb250ZXh0ICpjLCBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnBscywgc3RydWN0IGZyYWdtZW50ICpzZWcpCit7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKKyAgICBjaGFyICp1cmwgPSBOVUxMOworICAgIGludCByZXQgPSAwOworCisgICAgdXJsID0gYXZfbWFsbG9jeihjLT5tYXhfdXJsX3NpemUpOworICAgIGlmICghdXJsKSB7CisgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICB9CisgICAgc2V0X2h0dHBoZWFkZXJfb3B0aW9ucyhjLCAmb3B0cyk7CisgICAgaWYgKHNlZy0+c2l6ZSA+PSAwKSB7CisgICAgICAgIC8qIHRyeSB0byByZXN0cmljdCB0aGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBwYXJ0IHdlIHdhbnQKKyAgICAgICAgICogKGlmIHRoaXMgaXMgaW4gZmFjdCBhIEhUVFAgcmVxdWVzdCkgKi8KKyAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvcHRzLCAib2Zmc2V0Iiwgc2VnLT51cmxfb2Zmc2V0LCAwKTsKKyAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvcHRzLCAiZW5kX29mZnNldCIsIHNlZy0+dXJsX29mZnNldCArIHNlZy0+c2l6ZSwgMCk7CisgICAgfQorCisgICAgZmZfbWFrZV9hYnNvbHV0ZV91cmwodXJsLCBjLT5tYXhfdXJsX3NpemUsIGMtPmJhc2VfdXJsLCBzZWctPnVybCk7CisgICAgYXZfbG9nKHBscy0+cGFyZW50LCBBVl9MT0dfVkVSQk9TRSwgIkRBU0ggcmVxdWVzdCBmb3IgdXJsICclcycsIG9mZnNldCAlIlBSSWQ2NCIsIHBsYXlsaXN0ICVkXG4iLAorICAgICAgICAgICB1cmwsIHNlZy0+dXJsX29mZnNldCwgcGxzLT5yZXBfaWR4KTsKKyAgICByZXQgPSBvcGVuX3VybChwbHMtPnBhcmVudCwgJnBscy0+aW5wdXQsIHVybCwgYy0+YXZpb19vcHRzLCBvcHRzLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBnb3RvIGNsZWFudXA7CisgICAgfQorCitjbGVhbnVwOgorICAgIGF2X2ZyZWUodXJsKTsKKyAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgIHBscy0+Y3VyX3NlZ19vZmZzZXQgPSAwOworICAgIHBscy0+Y3VyX3NlZ19zaXplID0gc2VnLT5zaXplOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX2luaXRfc2VjdGlvbihzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnBscykKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IG1heF9pbml0X3NlY3Rpb25fc2l6ZSA9IDEwMjQgKiAxMDI0OworICAgIERBU0hDb250ZXh0ICpjID0gcGxzLT5wYXJlbnQtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHNlY19zaXplOworICAgIGludDY0X3QgdXJsc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFwbHMtPmluaXRfc2VjdGlvbiB8fCBwbHMtPmluaXRfc2VjX2J1ZikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXQgPSBvcGVuX2lucHV0KGMsIHBscywgcGxzLT5pbml0X3NlY3Rpb24pOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhwbHMtPnBhcmVudCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gYW4gaW5pdGlhbGl6YXRpb24gc2VjdGlvbiBpbiBwbGF5bGlzdCAlZFxuIiwKKyAgICAgICAgICAgICAgIHBscy0+cmVwX2lkeCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKHBscy0+aW5pdF9zZWN0aW9uLT5zaXplID49IDApCisgICAgICAgIHNlY19zaXplID0gcGxzLT5pbml0X3NlY3Rpb24tPnNpemU7CisgICAgZWxzZSBpZiAoKHVybHNpemUgPSBhdmlvX3NpemUocGxzLT5pbnB1dCkpID49IDApCisgICAgICAgIHNlY19zaXplID0gdXJsc2l6ZTsKKyAgICBlbHNlCisgICAgICAgIHNlY19zaXplID0gbWF4X2luaXRfc2VjdGlvbl9zaXplOworCisgICAgYXZfbG9nKHBscy0+cGFyZW50LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICJEb3dubG9hZGluZyBhbiBpbml0aWFsaXphdGlvbiBzZWN0aW9uIG9mIHNpemUgJSJQUklkNjQiXG4iLAorICAgICAgICAgICBzZWNfc2l6ZSk7CisKKyAgICBzZWNfc2l6ZSA9IEZGTUlOKHNlY19zaXplLCBtYXhfaW5pdF9zZWN0aW9uX3NpemUpOworCisgICAgYXZfZmFzdF9tYWxsb2MoJnBscy0+aW5pdF9zZWNfYnVmLCAmcGxzLT5pbml0X3NlY19idWZfc2l6ZSwgc2VjX3NpemUpOworCisgICAgcmV0ID0gcmVhZF9mcm9tX3VybChwbHMsIHBscy0+aW5pdF9zZWN0aW9uLCBwbHMtPmluaXRfc2VjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBscy0+aW5pdF9zZWNfYnVmX3NpemUsIFJFQURfQ09NUExFVEUpOworICAgIGZmX2Zvcm1hdF9pb19jbG9zZShwbHMtPnBhcmVudCwgJnBscy0+aW5wdXQpOworCisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBwbHMtPmluaXRfc2VjX2RhdGFfbGVuID0gcmV0OworICAgIHBscy0+aW5pdF9zZWNfYnVmX3JlYWRfb2Zmc2V0ID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCBzZWVrX2RhdGEodm9pZCAqb3BhcXVlLCBpbnQ2NF90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKyAgICBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnYgPSBvcGFxdWU7CisgICAgaWYgKHYtPm5fZnJhZ21lbnRzICYmICF2LT5pbml0X3NlY19kYXRhX2xlbikgeworICAgICAgICByZXR1cm4gYXZpb19zZWVrKHYtPmlucHV0LCBvZmZzZXQsIHdoZW5jZSk7CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworc3RhdGljIGludCByZWFkX2RhdGEodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnYgPSBvcGFxdWU7CisgICAgREFTSENvbnRleHQgKmMgPSB2LT5wYXJlbnQtPnByaXZfZGF0YTsKKworcmVzdGFydDoKKyAgICBpZiAoIXYtPmlucHV0KSB7CisgICAgICAgIGZyZWVfZnJhZ21lbnQoJnYtPmN1cl9zZWcpOworICAgICAgICB2LT5jdXJfc2VnID0gZ2V0X2N1cnJlbnRfZnJhZ21lbnQodik7CisgICAgICAgIGlmICghdi0+Y3VyX3NlZykgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIGxvYWQvdXBkYXRlIE1lZGlhIEluaXRpYWxpemF0aW9uIFNlY3Rpb24sIGlmIGFueSAqLworICAgICAgICByZXQgPSB1cGRhdGVfaW5pdF9zZWN0aW9uKHYpOworICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgZ290byBlbmQ7CisKKyAgICAgICAgcmV0ID0gb3Blbl9pbnB1dChjLCB2LCB2LT5jdXJfc2VnKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChmZl9jaGVja19pbnRlcnJ1cHQoYy0+aW50ZXJydXB0X2NhbGxiYWNrKSkgeworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyh2LT5wYXJlbnQsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIG9wZW4gZnJhZ21lbnQgb2YgcGxheWxpc3QgJWRcbiIsIHYtPnJlcF9pZHgpOworICAgICAgICAgICAgdi0+Y3VyX3NlcV9ubysrOworICAgICAgICAgICAgZ290byByZXN0YXJ0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHYtPmluaXRfc2VjX2J1Zl9yZWFkX29mZnNldCA8IHYtPmluaXRfc2VjX2RhdGFfbGVuKSB7CisgICAgICAgIC8qIFB1c2ggaW5pdCBzZWN0aW9uIG91dCBmaXJzdCBiZWZvcmUgZmlyc3QgYWN0dWFsIGZyYWdtZW50ICovCisgICAgICAgIGludCBjb3B5X3NpemUgPSBGRk1JTih2LT5pbml0X3NlY19kYXRhX2xlbiAtIHYtPmluaXRfc2VjX2J1Zl9yZWFkX29mZnNldCwgYnVmX3NpemUpOworICAgICAgICBtZW1jcHkoYnVmLCB2LT5pbml0X3NlY19idWYsIGNvcHlfc2l6ZSk7CisgICAgICAgIHYtPmluaXRfc2VjX2J1Zl9yZWFkX29mZnNldCArPSBjb3B5X3NpemU7CisgICAgICAgIHJldCA9IGNvcHlfc2l6ZTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogY2hlY2sgdGhlIHYtPmN1cl9zZWcsIGlmIGl0IGlzIG51bGwsIGdldCBjdXJyZW50IGFuZCBkb3VibGUgY2hlY2sgaWYgdGhlIG5ldyB2LT5jdXJfc2VnKi8KKyAgICBpZiAoIXYtPmN1cl9zZWcpIHsKKyAgICAgICAgdi0+Y3VyX3NlZyA9IGdldF9jdXJyZW50X2ZyYWdtZW50KHYpOworICAgIH0KKyAgICBpZiAoIXYtPmN1cl9zZWcpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9FT0Y7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICByZXQgPSByZWFkX2Zyb21fdXJsKHYsIHYtPmN1cl9zZWcsIGJ1ZiwgYnVmX3NpemUsIFJFQURfTk9STUFMKTsKKyAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICBpZiAoYy0+aXNfbGl2ZSB8fCB2LT5jdXJfc2VxX25vIDwgdi0+bGFzdF9zZXFfbm8pIHsKKyAgICAgICAgaWYgKCF2LT5pc19yZXN0YXJ0X25lZWRlZCkKKyAgICAgICAgICAgIHYtPmN1cl9zZXFfbm8rKzsKKyAgICAgICAgdi0+aXNfcmVzdGFydF9uZWVkZWQgPSAxOworICAgIH0KKworZW5kOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2F2ZV9hdmlvX29wdGlvbnMoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGNvbnN0IGNoYXIgKm9wdHNbXSA9IHsgImhlYWRlcnMiLCAidXNlcl9hZ2VudCIsICJ1c2VyLWFnZW50IiwgImNvb2tpZXMiLCBOVUxMIH0sICoqb3B0ID0gb3B0czsKKyAgICB1aW50OF90ICpidWYgPSBOVUxMOworICAgIGludCByZXQgPSAwOworCisgICAgd2hpbGUgKCpvcHQpIHsKKyAgICAgICAgaWYgKGF2X29wdF9nZXQocy0+cGIsICpvcHQsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4sICZidWYpID49IDApIHsKKyAgICAgICAgICAgIGlmIChidWZbMF0gIT0gJ1wwJykgeworICAgICAgICAgICAgICAgIHJldCA9IGF2X2RpY3Rfc2V0KCZjLT5hdmlvX29wdHMsICpvcHQsIGJ1ZiwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZidWYpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3B0Kys7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBuZXN0ZWRfaW9fb3BlbihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICoqcGIsIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBBVkRpY3Rpb25hcnkgKipvcHRzKQoreworICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICJBIERBU0ggcGxheWxpc3QgaXRlbSAnJXMnIHJlZmVycmVkIHRvIGFuIGV4dGVybmFsIGZpbGUgJyVzJy4gIgorICAgICAgICAgICAiT3BlbmluZyB0aGlzIGZpbGUgd2FzIGZvcmJpZGRlbiBmb3Igc2VjdXJpdHkgcmVhc29uc1xuIiwKKyAgICAgICAgICAgcy0+ZmlsZW5hbWUsIHVybCk7CisgICAgcmV0dXJuIEFWRVJST1IoRVBFUk0pOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9kZW11eF9mb3JfY29tcG9uZW50KHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzKQoreworICAgIC8qIG5vdGU6IHRoZSBpbnRlcm5hbCBidWZmZXIgY291bGQgaGF2ZSBjaGFuZ2VkICovCisgICAgYXZfZnJlZXAoJnBscy0+cGIuYnVmZmVyKTsKKyAgICBtZW1zZXQoJnBscy0+cGIsIDB4MDAsIHNpemVvZihBVklPQ29udGV4dCkpOworICAgIHBscy0+Y3R4LT5wYiA9IE5VTEw7CisgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJnBscy0+Y3R4KTsKKyAgICBwbHMtPmN0eCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcmVvcGVuX2RlbXV4X2Zvcl9jb21wb25lbnQoQVZGb3JtYXRDb250ZXh0ICpzLCBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnBscykKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklucHV0Rm9ybWF0ICppbl9mbXQgPSBOVUxMOworICAgIEFWRGljdGlvbmFyeSAgKmluX2ZtdF9vcHRzID0gTlVMTDsKKyAgICB1aW50OF90ICphdmlvX2N0eF9idWZmZXIgID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMCwgaTsKKworICAgIGlmIChwbHMtPmN0eCkgeworICAgICAgICBjbG9zZV9kZW11eF9mb3JfY29tcG9uZW50KHBscyk7CisgICAgfQorICAgIGlmICghKHBscy0+Y3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpKSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBhdmlvX2N0eF9idWZmZXIgID0gYXZfbWFsbG9jKElOSVRJQUxfQlVGRkVSX1NJWkUpOworICAgIGlmICghYXZpb19jdHhfYnVmZmVyICkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChwbHMtPmN0eCk7CisgICAgICAgIHBscy0+Y3R4ID0gTlVMTDsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBpZiAoYy0+aXNfbGl2ZSkgeworICAgICAgICBmZmlvX2luaXRfY29udGV4dCgmcGxzLT5wYiwgYXZpb19jdHhfYnVmZmVyICwgSU5JVElBTF9CVUZGRVJfU0laRSwgMCwgcGxzLCByZWFkX2RhdGEsIE5VTEwsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZmaW9faW5pdF9jb250ZXh0KCZwbHMtPnBiLCBhdmlvX2N0eF9idWZmZXIgLCBJTklUSUFMX0JVRkZFUl9TSVpFLCAwLCBwbHMsIHJlYWRfZGF0YSwgTlVMTCwgc2Vla19kYXRhKTsKKyAgICB9CisgICAgcGxzLT5wYi5zZWVrYWJsZSA9IDA7CisKKyAgICBpZiAoKHJldCA9IGZmX2NvcHlfd2hpdGVibGFja2xpc3RzKHBscy0+Y3R4LCBzKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBwbHMtPmN0eC0+ZmxhZ3MgPSBBVkZNVF9GTEFHX0NVU1RPTV9JTzsKKyAgICBwbHMtPmN0eC0+cHJvYmVzaXplID0gMTAyNCAqIDQ7CisgICAgcGxzLT5jdHgtPm1heF9hbmFseXplX2R1cmF0aW9uID0gNCAqIEFWX1RJTUVfQkFTRTsKKyAgICByZXQgPSBhdl9wcm9iZV9pbnB1dF9idWZmZXIoJnBscy0+cGIsICZpbl9mbXQsICIiLCBOVUxMLCAwLCAwKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd2hlbiBsb2FkaW5nIGZpcnN0IGZyYWdtZW50LCBwbGF5bGlzdCAlZFxuIiwgKGludClwbHMtPnJlcF9pZHgpOworICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQocGxzLT5jdHgpOworICAgICAgICBwbHMtPmN0eCA9IE5VTEw7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBwbHMtPmN0eC0+cGIgPSAmcGxzLT5wYjsKKyAgICBwbHMtPmN0eC0+aW9fb3BlbiAgPSBuZXN0ZWRfaW9fb3BlbjsKKworICAgIC8vIHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmcm9tIG1wZCBpZiBhdmFpbGFibGUKKyAgICByZXQgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZwbHMtPmN0eCwgIiIsIGluX2ZtdCwgJmluX2ZtdF9vcHRzKTsgLy9wbHMtPmluaXRfc2VjdGlvbi0+dXJsCisgICAgYXZfZGljdF9mcmVlKCZpbl9mbXRfb3B0cyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAocGxzLT5uX2ZyYWdtZW50cykgeworI2lmIEZGX0FQSV9SX0ZSQU1FX1JBVEUKKyAgICAgICAgaWYgKHBscy0+ZnJhbWVyYXRlLmRlbikgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBscy0+Y3R4LT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICAgICAgcGxzLT5jdHgtPnN0cmVhbXNbaV0tPnJfZnJhbWVfcmF0ZSA9IHBscy0+ZnJhbWVyYXRlOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICByZXQgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKHBscy0+Y3R4LCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Blbl9kZW11eF9mb3JfY29tcG9uZW50KEFWRm9ybWF0Q29udGV4dCAqcywgc3RydWN0IHJlcHJlc2VudGF0aW9uICpwbHMpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGk7CisKKyAgICBwbHMtPnBhcmVudCA9IHM7CisgICAgcGxzLT5jdXJfc2VxX25vICA9IGNhbGNfY3VyX3NlZ19ubyhzLCBwbHMpOworCisgICAgaWYgKCFwbHMtPmxhc3Rfc2VxX25vKSB7CisgICAgICAgIHBscy0+bGFzdF9zZXFfbm8gPSBjYWxjX21heF9zZWdfbm8ocGxzLCBzLT5wcml2X2RhdGEpOworICAgIH0KKworICAgIHJldCA9IHJlb3Blbl9kZW11eF9mb3JfY29tcG9uZW50KHMsIHBscyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGxzLT5jdHgtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBBVlN0cmVhbSAqaXN0ID0gcGxzLT5jdHgtPnN0cmVhbXNbaV07CisgICAgICAgIGlmICghc3QpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBzdC0+aWQgPSBpOworICAgICAgICBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShzdC0+Y29kZWNwYXIsIHBscy0+Y3R4LT5zdHJlYW1zW2ldLT5jb2RlY3Bhcik7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIGlzdC0+cHRzX3dyYXBfYml0cywgaXN0LT50aW1lX2Jhc2UubnVtLCBpc3QtPnRpbWVfYmFzZS5kZW4pOworICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRhc2hfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHZvaWQgKnUgPSAocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0NVU1RPTV9JTykgPyBOVUxMIDogcy0+cGI7CisgICAgREFTSENvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IHN0cmVhbV9pbmRleCA9IDA7CisgICAgaW50IGk7CisKKyAgICBjLT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSAmcy0+aW50ZXJydXB0X2NhbGxiYWNrOworICAgIC8vIGlmIHRoZSBVUkwgY29udGV4dCBpcyBnb29kLCByZWFkIGltcG9ydGFudCBvcHRpb25zIHdlIG11c3QgYnJva2VyIGxhdGVyCisgICAgaWYgKHUpIHsKKyAgICAgICAgdXBkYXRlX29wdGlvbnMoJmMtPnVzZXJfYWdlbnQsICJ1c2VyLWFnZW50IiwgdSk7CisgICAgICAgIHVwZGF0ZV9vcHRpb25zKCZjLT5jb29raWVzLCAiY29va2llcyIsIHUpOworICAgICAgICB1cGRhdGVfb3B0aW9ucygmYy0+aGVhZGVycywgImhlYWRlcnMiLCB1KTsKKyAgICB9CisKKyAgICBpZiAoKHJldCA9IHBhcnNlX21hbmlmZXN0KHMsIHMtPmZpbGVuYW1lLCBzLT5wYikpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKChyZXQgPSBzYXZlX2F2aW9fb3B0aW9ucyhzKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAvKiBJZiB0aGlzIGlzbid0IGEgbGl2ZSBzdHJlYW0sIGZpbGwgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZQorICAgICAqIHN0cmVhbS4gKi8KKyAgICBpZiAoIWMtPmlzX2xpdmUpIHsKKyAgICAgICAgcy0+ZHVyYXRpb24gPSAoaW50NjRfdCkgYy0+bWVkaWFfcHJlc2VudGF0aW9uX2R1cmF0aW9uICogQVZfVElNRV9CQVNFOworICAgIH0KKworICAgIC8qIE9wZW4gdGhlIGRlbXV4ZXIgZm9yIHZpZGVvIGFuZCBhdWRpbyBjb21wb25lbnRzIGlmIGF2YWlsYWJsZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3ZpZGVvczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqY3VyX3ZpZGVvID0gYy0+dmlkZW9zW2ldOworICAgICAgICByZXQgPSBvcGVuX2RlbXV4X2Zvcl9jb21wb25lbnQocywgY3VyX3ZpZGVvKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgY3VyX3ZpZGVvLT5zdHJlYW1faW5kZXggPSBzdHJlYW1faW5kZXg7CisgICAgICAgICsrc3RyZWFtX2luZGV4OworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX2F1ZGlvczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqY3VyX2F1ZGlvID0gYy0+YXVkaW9zW2ldOworICAgICAgICByZXQgPSBvcGVuX2RlbXV4X2Zvcl9jb21wb25lbnQocywgY3VyX2F1ZGlvKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgY3VyX2F1ZGlvLT5zdHJlYW1faW5kZXggPSBzdHJlYW1faW5kZXg7CisgICAgICAgICsrc3RyZWFtX2luZGV4OworICAgIH0KKworICAgIGlmICghc3RyZWFtX2luZGV4KSB7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgYSBwcm9ncmFtICovCisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgQVZQcm9ncmFtICpwcm9ncmFtOworICAgICAgICBwcm9ncmFtID0gYXZfbmV3X3Byb2dyYW0ocywgMCk7CisgICAgICAgIGlmICghcHJvZ3JhbSkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fdmlkZW9zOyBpKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzID0gYy0+dmlkZW9zW2ldOworCisgICAgICAgICAgICBhdl9wcm9ncmFtX2FkZF9zdHJlYW1faW5kZXgocywgMCwgcGxzLT5zdHJlYW1faW5kZXgpOworICAgICAgICAgICAgcGxzLT5hc3NvY19zdHJlYW0gPSBzLT5zdHJlYW1zW3Bscy0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgIGlmIChwbHMtPmJhbmR3aWR0aCA+IDApCisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZwbHMtPmFzc29jX3N0cmVhbS0+bWV0YWRhdGEsICJ2YXJpYW50X2JpdHJhdGUiLCBwbHMtPmJhbmR3aWR0aCwgMCk7CisgICAgICAgICAgICBpZiAocGxzLT5pZFswXSkKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcGxzLT5hc3NvY19zdHJlYW0tPm1ldGFkYXRhLCAiaWQiLCBwbHMtPmlkLCAwKTsKKyAgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fYXVkaW9zOyBpKyspIHsKKyAgICAgICAgICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzID0gYy0+YXVkaW9zW2ldOworCisgICAgICAgICAgICBhdl9wcm9ncmFtX2FkZF9zdHJlYW1faW5kZXgocywgMCwgcGxzLT5zdHJlYW1faW5kZXgpOworICAgICAgICAgICAgcGxzLT5hc3NvY19zdHJlYW0gPSBzLT5zdHJlYW1zW3Bscy0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgIGlmIChwbHMtPmJhbmR3aWR0aCA+IDApCisgICAgICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZwbHMtPmFzc29jX3N0cmVhbS0+bWV0YWRhdGEsICJ2YXJpYW50X2JpdHJhdGUiLCBwbHMtPmJhbmR3aWR0aCwgMCk7CisgICAgICAgICAgICBpZiAocGxzLT5pZFswXSkKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcGxzLT5hc3NvY19zdHJlYW0tPm1ldGFkYXRhLCAiaWQiLCBwbHMtPmlkLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworZmFpbDoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCByZWNoZWNrX2Rpc2NhcmRfZmxhZ3MoQVZGb3JtYXRDb250ZXh0ICpzLCBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKipwLCBpbnQgbikKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgc3RydWN0IHJlcHJlc2VudGF0aW9uICpwbHMgPSBwW2ldOworCisgICAgICAgIGludCBuZWVkZWQgPSAhcGxzLT5hc3NvY19zdHJlYW0gfHwgcGxzLT5hc3NvY19zdHJlYW0tPmRpc2NhcmQgPCBBVkRJU0NBUkRfQUxMOworICAgICAgICBpZiAobmVlZGVkICYmICFwbHMtPmN0eCkgeworICAgICAgICAgICAgcGxzLT5jdXJfc2VnX29mZnNldCA9IDA7CisgICAgICAgICAgICBwbHMtPmluaXRfc2VjX2J1Zl9yZWFkX29mZnNldCA9IDA7CisgICAgICAgICAgICAvKiBDYXRjaCB1cCAqLworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgeworICAgICAgICAgICAgICAgIHBscy0+Y3VyX3NlcV9ubyA9IEZGTUFYKHBscy0+Y3VyX3NlcV9ubywgcFtqXS0+Y3VyX3NlcV9ubyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZW9wZW5fZGVtdXhfZm9yX2NvbXBvbmVudChzLCBwbHMpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiTm93IHJlY2VpdmluZyBzdHJlYW1faW5kZXggJWRcbiIsIHBscy0+c3RyZWFtX2luZGV4KTsKKyAgICAgICAgfSBlbHNlIGlmICghbmVlZGVkICYmIHBscy0+Y3R4KSB7CisgICAgICAgICAgICBjbG9zZV9kZW11eF9mb3JfY29tcG9uZW50KHBscyk7CisgICAgICAgICAgICBpZiAocGxzLT5pbnB1dCkKKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocGxzLT5wYXJlbnQsICZwbHMtPmlucHV0KTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIk5vIGxvbmdlciByZWNlaXZpbmcgc3RyZWFtX2luZGV4ICVkXG4iLCBwbHMtPnN0cmVhbV9pbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZGFzaF9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgREFTSENvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCA9IDAsIGk7CisgICAgaW50NjRfdCBtaW50cyA9IDA7CisgICAgc3RydWN0IHJlcHJlc2VudGF0aW9uICpjdXIgPSBOVUxMOworCisgICAgcmVjaGVja19kaXNjYXJkX2ZsYWdzKHMsIGMtPnZpZGVvcywgYy0+bl92aWRlb3MpOworICAgIHJlY2hlY2tfZGlzY2FyZF9mbGFncyhzLCBjLT5hdWRpb3MsIGMtPm5fYXVkaW9zKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3ZpZGVvczsgaSsrKSB7CisgICAgICAgIHN0cnVjdCByZXByZXNlbnRhdGlvbiAqcGxzID0gYy0+dmlkZW9zW2ldOworICAgICAgICBpZiAoIXBscy0+Y3R4KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICghY3VyIHx8IHBscy0+Y3VyX3RpbWVzdGFtcCA8IG1pbnRzKSB7CisgICAgICAgICAgICBjdXIgPSBwbHM7CisgICAgICAgICAgICBtaW50cyA9IHBscy0+Y3VyX3RpbWVzdGFtcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl9hdWRpb3M7IGkrKykgeworICAgICAgICBzdHJ1Y3QgcmVwcmVzZW50YXRpb24gKnBscyA9IGMtPmF1ZGlvc1tpXTsKKyAgICAgICAgaWYgKCFwbHMtPmN0eCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIWN1ciB8fCBwbHMtPmN1cl90aW1lc3RhbXAgPCBtaW50cykgeworICAgICAgICAgICAgY3VyID0gcGxzOworICAgICAgICAgICAgbWludHMgPSBwbHMtPmN1cl90aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWN1cikgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisgICAgd2hpbGUgKCFmZl9jaGVja19pbnRlcnJ1cHQoYy0+aW50ZXJydXB0X2NhbGxiYWNrKSAmJiAhcmV0KSB7CisgICAgICAgIHJldCA9IGF2X3JlYWRfZnJhbWUoY3VyLT5jdHgsIHBrdCk7CisgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgLyogSWYgd2UgZ290IGEgcGFja2V0LCByZXR1cm4gaXQgKi8KKyAgICAgICAgICAgIGN1ci0+Y3VyX3RpbWVzdGFtcCA9IGF2X3Jlc2NhbGUocGt0LT5wdHMsIChpbnQ2NF90KWN1ci0+Y3R4LT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UubnVtICogOTAwMDAsIGN1ci0+Y3R4LT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gY3VyLT5zdHJlYW1faW5kZXg7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VyLT5pc19yZXN0YXJ0X25lZWRlZCkgeworICAgICAgICAgICAgY3VyLT5jdXJfc2VnX29mZnNldCA9IDA7CisgICAgICAgICAgICBjdXItPmluaXRfc2VjX2J1Zl9yZWFkX29mZnNldCA9IDA7CisgICAgICAgICAgICBpZiAoY3VyLT5pbnB1dCkKKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UoY3VyLT5wYXJlbnQsICZjdXItPmlucHV0KTsKKyAgICAgICAgICAgIHJldCA9IHJlb3Blbl9kZW11eF9mb3JfY29tcG9uZW50KHMsIGN1cik7CisgICAgICAgICAgICBjdXItPmlzX3Jlc3RhcnRfbmVlZGVkID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Cit9CisKK3N0YXRpYyBpbnQgZGFzaF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgREFTSENvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CisgICAgZnJlZV9hdWRpb19saXN0KGMpOworICAgIGZyZWVfdmlkZW9fbGlzdChjKTsKKworICAgIGF2X2ZyZWVwKCZjLT5jb29raWVzKTsKKyAgICBhdl9mcmVlcCgmYy0+dXNlcl9hZ2VudCk7CisgICAgYXZfZGljdF9mcmVlKCZjLT5hdmlvX29wdHMpOworICAgIGF2X2ZyZWVwKCZjLT5iYXNlX3VybCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFzaF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgc3RydWN0IHJlcHJlc2VudGF0aW9uICpwbHMsIGludDY0X3Qgc2Vla19wb3NfbXNlYywgaW50IGZsYWdzLCBpbnQgZHJ5X3J1bikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGogPSAwOworICAgIGludDY0X3QgZHVyYXRpb24gPSAwOworCisgICAgYXZfbG9nKHBscy0+cGFyZW50LCBBVl9MT0dfVkVSQk9TRSwgIkRBU0ggc2VlayBwb3NbJSJQUklkNjQibXNdLCBwbGF5bGlzdCAlZCVzXG4iLAorICAgICAgICAgICAgc2Vla19wb3NfbXNlYywgcGxzLT5yZXBfaWR4LCBkcnlfcnVuID8gIiAoZHJ5KSIgOiAiIik7CisKKyAgICAvLyBzaW5nbGUgZnJhZ21lbnQgbW9kZQorICAgIGlmIChwbHMtPm5fZnJhZ21lbnRzID09IDEpIHsKKyAgICAgICAgcGxzLT5jdXJfdGltZXN0YW1wID0gMDsKKyAgICAgICAgcGxzLT5jdXJfc2VnX29mZnNldCA9IDA7CisgICAgICAgIGlmIChkcnlfcnVuKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGZmX3JlYWRfZnJhbWVfZmx1c2gocGxzLT5jdHgpOworICAgICAgICByZXR1cm4gYXZfc2Vla19mcmFtZShwbHMtPmN0eCwgLTEsIHNlZWtfcG9zX21zZWMgKiAxMDAwLCBmbGFncyk7CisgICAgfQorCisgICAgaWYgKHBscy0+aW5wdXQpCisgICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShwbHMtPnBhcmVudCwgJnBscy0+aW5wdXQpOworCisgICAgLy8gZmluZCB0aGUgbmVhcmVzdCBmcmFnbWVudAorICAgIGlmIChwbHMtPm5fdGltZWxpbmVzID4gMCAmJiBwbHMtPmZyYWdtZW50X3RpbWVzY2FsZSA+IDApIHsKKyAgICAgICAgaW50NjRfdCBudW0gPSBwbHMtPmZpcnN0X3NlcV9ubzsKKyAgICAgICAgYXZfbG9nKHBscy0+cGFyZW50LCBBVl9MT0dfVkVSQk9TRSwgImRhc2hfc2VlayB3aXRoIFNlZ21lbnRUaW1lbGluZSBzdGFydCBuX3RpbWVsaW5lc1slZF0gIgorICAgICAgICAgICAgICAgImxhc3Rfc2VxX25vWyUiUFJJZDY0Il0sIHBsYXlsaXN0ICVkLlxuIiwKKyAgICAgICAgICAgICAgIChpbnQpcGxzLT5uX3RpbWVsaW5lcywgKGludDY0X3QpcGxzLT5sYXN0X3NlcV9ubywgKGludClwbHMtPnJlcF9pZHgpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxzLT5uX3RpbWVsaW5lczsgaSsrKSB7CisgICAgICAgICAgICBpZiAocGxzLT50aW1lbGluZXNbaV0tPnN0YXJ0dGltZSA+IDApIHsKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHBscy0+dGltZWxpbmVzW2ldLT5zdGFydHRpbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkdXJhdGlvbiArPSBwbHMtPnRpbWVsaW5lc1tpXS0+ZHVyYXRpb247CisgICAgICAgICAgICBpZiAoc2Vla19wb3NfbXNlYyA8ICgoZHVyYXRpb24gKiAxMDAwKSAvICBwbHMtPmZyYWdtZW50X3RpbWVzY2FsZSkpIHsKKyAgICAgICAgICAgICAgICBnb3RvIHNldF9zZXFfbnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBscy0+dGltZWxpbmVzW2ldLT5yZXBlYXQ7IGorKykgeworICAgICAgICAgICAgICAgIGR1cmF0aW9uICs9IHBscy0+dGltZWxpbmVzW2ldLT5kdXJhdGlvbjsKKyAgICAgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgICAgICAgICBpZiAoc2Vla19wb3NfbXNlYyA8ICgoZHVyYXRpb24gKiAxMDAwKSAvICBwbHMtPmZyYWdtZW50X3RpbWVzY2FsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ290byBzZXRfc2VxX251bTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgfQorCitzZXRfc2VxX251bToKKyAgICAgICAgcGxzLT5jdXJfc2VxX25vID0gbnVtID4gcGxzLT5sYXN0X3NlcV9ubyA/IHBscy0+bGFzdF9zZXFfbm8gOiBudW07CisgICAgICAgIGF2X2xvZyhwbHMtPnBhcmVudCwgQVZfTE9HX1ZFUkJPU0UsICJkYXNoX3NlZWsgd2l0aCBTZWdtZW50VGltZWxpbmUgZW5kIGN1cl9zZXFfbm9bJSJQUklkNjQiXSwgcGxheWxpc3QgJWQuXG4iLAorICAgICAgICAgICAgICAgKGludDY0X3QpcGxzLT5jdXJfc2VxX25vLCAoaW50KXBscy0+cmVwX2lkeCk7CisgICAgfSBlbHNlIGlmIChwbHMtPmZyYWdtZW50X2R1cmF0aW9uID4gMCkgeworICAgICAgICBwbHMtPmN1cl9zZXFfbm8gPSBwbHMtPmZpcnN0X3NlcV9ubyArICgoc2Vla19wb3NfbXNlYyAqIHBscy0+ZnJhZ21lbnRfdGltZXNjYWxlKSAvIHBscy0+ZnJhZ21lbnRfZHVyYXRpb24pIC8gMTAwMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2cocGxzLT5wYXJlbnQsIEFWX0xPR19FUlJPUiwgImRhc2hfc2VlayBtaXNzaW5nIHRpbWVsaW5lIG9yIGZyYWdtZW50X2R1cmF0aW9uXG4iKTsKKyAgICAgICAgcGxzLT5jdXJfc2VxX25vID0gcGxzLT5maXJzdF9zZXFfbm87CisgICAgfQorICAgIHBscy0+Y3VyX3RpbWVzdGFtcCA9IDA7CisgICAgcGxzLT5jdXJfc2VnX29mZnNldCA9IDA7CisgICAgcGxzLT5pbml0X3NlY19idWZfcmVhZF9vZmZzZXQgPSAwOworICAgIHJldCA9IGRyeV9ydW4gPyAwIDogcmVvcGVuX2RlbXV4X2Zvcl9jb21wb25lbnQocywgcGxzKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGFzaF9yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LCBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQoreworICAgIGludCByZXQgPSAwLCBpOworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3Qgc2Vla19wb3NfbXNlYyA9IGF2X3Jlc2NhbGVfcm5kKHRpbWVzdGFtcCwgMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPnRpbWVfYmFzZS5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBBVlNFRUtfRkxBR19CQUNLV0FSRCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUk9VTkRfRE9XTiA6IEFWX1JPVU5EX1VQKTsKKyAgICBpZiAoKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkgfHwgYy0+aXNfbGl2ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIC8qIFNlZWsgaW4gZGlzY2FyZGVkIHN0cmVhbXMgd2l0aCBkcnlfcnVuPTEgdG8gYXZvaWQgcmVvcGVuaW5nIHRoZW0gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl92aWRlb3M7IGkrKykgeworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgIHJldCA9IGRhc2hfc2VlayhzLCBjLT52aWRlb3NbaV0sIHNlZWtfcG9zX21zZWMsIGZsYWdzLCAhYy0+dmlkZW9zW2ldLT5jdHgpOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl9hdWRpb3M7IGkrKykgeworICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgIHJldCA9IGRhc2hfc2VlayhzLCBjLT5hdWRpb3NbaV0sIHNlZWtfcG9zX21zZWMsIGZsYWdzLCAhYy0+YXVkaW9zW2ldLT5jdHgpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZGFzaF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoIWF2X3N0cmlzdHIocC0+YnVmLCAiPE1QRCIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChhdl9zdHJpc3RyKHAtPmJ1ZiwgImRhc2g6cHJvZmlsZTppc29mZi1vbi1kZW1hbmQ6MjAxMSIpIHx8CisgICAgICAgIGF2X3N0cmlzdHIocC0+YnVmLCAiZGFzaDpwcm9maWxlOmlzb2ZmLWxpdmU6MjAxMSIpIHx8CisgICAgICAgIGF2X3N0cmlzdHIocC0+YnVmLCAiZGFzaDpwcm9maWxlOmlzb2ZmLWxpdmU6MjAxMiIpIHx8CisgICAgICAgIGF2X3N0cmlzdHIocC0+YnVmLCAiZGFzaDpwcm9maWxlOmlzb2ZmLW1haW46MjAxMSIpKSB7CisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICB9CisgICAgaWYgKGF2X3N0cmlzdHIocC0+YnVmLCAiZGFzaDpwcm9maWxlIikpIHsKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihEQVNIQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KK3N0YXRpYyBjb25zdCBBVk9wdGlvbiBkYXNoX29wdGlvbnNbXSA9IHsKKyAgICB7ImFsbG93ZWRfZXh0ZW5zaW9ucyIsICJMaXN0IG9mIGZpbGUgZXh0ZW5zaW9ucyB0aGF0IGRhc2ggaXMgYWxsb3dlZCB0byBhY2Nlc3MiLAorICAgICAgICBPRkZTRVQoYWxsb3dlZF9leHRlbnNpb25zKSwgQVZfT1BUX1RZUEVfU1RSSU5HLAorICAgICAgICB7LnN0ciA9ICJhYWMsbTRhLG00cyxtNHYsbW92LG1wNCJ9LAorICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHU30sCisgICAge05VTEx9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBkYXNoX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImRhc2giLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBkYXNoX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2Rhc2hfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZGFzaCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkR5bmFtaWMgQWRhcHRpdmUgU3RyZWFtaW5nIG92ZXIgSFRUUCIpLAorICAgIC5wcml2X2NsYXNzICAgICA9ICZkYXNoX2NsYXNzLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihEQVNIQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gZGFzaF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBkYXNoX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGRhc2hfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gZGFzaF9jbG9zZSwKKyAgICAucmVhZF9zZWVrICAgICAgPSBkYXNoX3JlYWRfc2VlaywKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT19CWVRFX1NFRUssCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZGFzaGVuYy5jIGIvbGliYXZmb3JtYXQvZGFzaGVuYy5jCmluZGV4IDFkZDFhOWQuLjdiNDM2MTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2Rhc2hlbmMuYworKysgYi9saWJhdmZvcm1hdC9kYXNoZW5jLmMKQEAgLTEsNiArMSw3IEBACiAvKgogICogTVBFRy1EQVNIIElTTyBCTUZGIHNlZ21lbnRlcgogICogQ29weXJpZ2h0IChjKSAyMDE0IE1hcnRpbiBTdG9yc2pvCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggQWthbWFpIFRlY2hub2xvZ2llcywgSW5jLgogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0yNSw2ICsyNiw3IEBACiAjZW5kaWYKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCkBAIC0zNSwyMCArMzcsMTUgQEAKICNpbmNsdWRlICJhdmMuaCIKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJobHNwbGF5bGlzdC5oIgorI2lmIENPTkZJR19IVFRQX1BST1RPQ09MCisjaW5jbHVkZSAiaHR0cC5oIgorI2VuZGlmCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJpc29tLmgiCiAjaW5jbHVkZSAib3Nfc3VwcG9ydC5oIgogI2luY2x1ZGUgInVybC5oIgotCi0vLyBTZWUgSVNPL0lFQyAyMzAwOS0xOjIwMTQgNS4zLjkuNC40Ci10eXBlZGVmIGVudW0gewotICAgIERBU0hfVE1QTF9JRF9VTkRFRklORUQgPSAtMSwKLSAgICBEQVNIX1RNUExfSURfRVNDQVBFLAotICAgIERBU0hfVE1QTF9JRF9SRVBfSUQsCi0gICAgREFTSF9UTVBMX0lEX05VTUJFUiwKLSAgICBEQVNIX1RNUExfSURfQkFORFdJRFRILAotICAgIERBU0hfVE1QTF9JRF9USU1FLAotfSBEQVNIVG1wbElkOworI2luY2x1ZGUgImRhc2guaCIKIAogdHlwZWRlZiBzdHJ1Y3QgU2VnbWVudCB7CiAgICAgY2hhciBmaWxlWzEwMjRdOwpAQCAtNTksMTQgKzU2LDIyIEBACiAgICAgaW50IG47CiB9IFNlZ21lbnQ7CiAKK3R5cGVkZWYgc3RydWN0IEFkYXB0YXRpb25TZXQgeworICAgIGNoYXIgaWRbMTBdOworICAgIGVudW0gQVZNZWRpYVR5cGUgbWVkaWFfdHlwZTsKKyAgICBBVkRpY3Rpb25hcnkgKm1ldGFkYXRhOworICAgIEFWUmF0aW9uYWwgbWluX2ZyYW1lX3JhdGUsIG1heF9mcmFtZV9yYXRlOworICAgIGludCBhbWJpZ3VvdXNfZnJhbWVfcmF0ZTsKK30gQWRhcHRhdGlvblNldDsKKwogdHlwZWRlZiBzdHJ1Y3QgT3V0cHV0U3RyZWFtIHsKICAgICBBVkZvcm1hdENvbnRleHQgKmN0eDsKLSAgICBpbnQgY3R4X2luaXRlZDsKLSAgICB1aW50OF90IGlvYnVmWzMyNzY4XTsKLSAgICBVUkxDb250ZXh0ICpvdXQ7CisgICAgaW50IGN0eF9pbml0ZWQsIGFzX2lkeDsKKyAgICBBVklPQ29udGV4dCAqb3V0OworICAgIGNoYXIgZm9ybWF0X25hbWVbOF07CiAgICAgaW50IHBhY2tldHNfd3JpdHRlbjsKICAgICBjaGFyIGluaXRmaWxlWzEwMjRdOwotICAgIGludDY0X3QgaW5pdF9zdGFydF9wb3M7CisgICAgaW50NjRfdCBpbml0X3N0YXJ0X3BvcywgcG9zOwogICAgIGludCBpbml0X3JhbmdlX2xlbmd0aDsKICAgICBpbnQgbmJfc2VnbWVudHMsIHNlZ21lbnRzX3NpemUsIHNlZ21lbnRfaW5kZXg7CiAgICAgU2VnbWVudCAqKnNlZ21lbnRzOwpAQCAtNzYsMTAgKzgxLDE3IEBACiAgICAgY2hhciBiYW5kd2lkdGhfc3RyWzY0XTsKIAogICAgIGNoYXIgY29kZWNfc3RyWzEwMF07CisgICAgaW50IHdyaXR0ZW5fbGVuOworICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07CisgICAgY2hhciBmdWxsX3BhdGhbMTAyNF07CisgICAgY2hhciB0ZW1wX3BhdGhbMTAyNF07CiB9IE91dHB1dFN0cmVhbTsKIAogdHlwZWRlZiBzdHJ1Y3QgREFTSENvbnRleHQgewogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgLyogQ2xhc3MgZm9yIHByaXZhdGUgb3B0aW9ucy4gKi8KKyAgICBjaGFyICphZGFwdGF0aW9uX3NldHM7CisgICAgQWRhcHRhdGlvblNldCAqYXM7CisgICAgaW50IG5iX2FzOwogICAgIGludCB3aW5kb3dfc2l6ZTsKICAgICBpbnQgZXh0cmFfd2luZG93X3NpemU7CiAgICAgaW50IG1pbl9zZWdfZHVyYXRpb247CkBAIC04OCw3ICsxMDAsNyBAQAogICAgIGludCB1c2VfdGltZWxpbmU7CiAgICAgaW50IHNpbmdsZV9maWxlOwogICAgIE91dHB1dFN0cmVhbSAqc3RyZWFtczsKLSAgICBpbnQgaGFzX3ZpZGVvLCBoYXNfYXVkaW87CisgICAgaW50IGhhc192aWRlbzsKICAgICBpbnQ2NF90IGxhc3RfZHVyYXRpb247CiAgICAgaW50NjRfdCB0b3RhbF9kdXJhdGlvbjsKICAgICBjaGFyIGF2YWlsYWJpbGl0eV9zdGFydF90aW1lWzEwMF07CkBAIC05NiwzMiArMTA4LDg1IEBACiAgICAgY29uc3QgY2hhciAqc2luZ2xlX2ZpbGVfbmFtZTsKICAgICBjb25zdCBjaGFyICppbml0X3NlZ19uYW1lOwogICAgIGNvbnN0IGNoYXIgKm1lZGlhX3NlZ19uYW1lOwotICAgIEFWUmF0aW9uYWwgbWluX2ZyYW1lX3JhdGUsIG1heF9mcmFtZV9yYXRlOwotICAgIGludCBhbWJpZ3VvdXNfZnJhbWVfcmF0ZTsKKyAgICBjb25zdCBjaGFyICp1dGNfdGltaW5nX3VybDsKKyAgICBjb25zdCBjaGFyICptZXRob2Q7CisgICAgY29uc3QgY2hhciAqdXNlcl9hZ2VudDsKKyAgICBpbnQgaGxzX3BsYXlsaXN0OworICAgIGludCBodHRwX3BlcnNpc3RlbnQ7CisgICAgaW50IG1hc3Rlcl9wbGF5bGlzdF9jcmVhdGVkOworICAgIEFWSU9Db250ZXh0ICptcGRfb3V0OworICAgIEFWSU9Db250ZXh0ICptM3U4X291dDsKKyAgICBpbnQgc3RyZWFtaW5nOworICAgIGludDY0X3QgdGltZW91dDsKIH0gREFTSENvbnRleHQ7CiAKLXN0YXRpYyBpbnQgZGFzaF93cml0ZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplKQotewotICAgIE91dHB1dFN0cmVhbSAqb3MgPSBvcGFxdWU7Ci0gICAgaWYgKG9zLT5vdXQpCi0gICAgICAgIGZmdXJsX3dyaXRlKG9zLT5vdXQsIGJ1ZiwgYnVmX3NpemUpOwotICAgIHJldHVybiBidWZfc2l6ZTsKK3N0YXRpYyBzdHJ1Y3QgY29kZWNfc3RyaW5nIHsKKyAgICBpbnQgaWQ7CisgICAgY29uc3QgY2hhciAqc3RyOworfSBjb2RlY3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX1ZQOCwgInZwOCIgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQOSwgInZwOSIgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZPUkJJUywgInZvcmJpcyIgfSwKKyAgICB7IEFWX0NPREVDX0lEX09QVVMsICJvcHVzIiB9LAorICAgIHsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgaW50IGRhc2hlbmNfaW9fb3BlbihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICoqcGIsIGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykgeworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCBodHRwX2Jhc2VfcHJvdG8gPSBmaWxlbmFtZSA/IGZmX2lzX2h0dHBfcHJvdG8oZmlsZW5hbWUpIDogMDsKKyAgICBpbnQgZXJyID0gQVZFUlJPUl9NVVhFUl9OT1RfRk9VTkQ7CisgICAgaWYgKCEqcGIgfHwgIWh0dHBfYmFzZV9wcm90byB8fCAhYy0+aHR0cF9wZXJzaXN0ZW50KSB7CisgICAgICAgIGVyciA9IHMtPmlvX29wZW4ocywgcGIsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsIG9wdGlvbnMpOworI2lmIENPTkZJR19IVFRQX1BST1RPQ09MCisgICAgfSBlbHNlIHsKKyAgICAgICAgVVJMQ29udGV4dCAqaHR0cF91cmxfY29udGV4dCA9IGZmaW9fZ2V0dXJsY29udGV4dCgqcGIpOworICAgICAgICBhdl9hc3NlcnQwKGh0dHBfdXJsX2NvbnRleHQpOworICAgICAgICBlcnIgPSBmZl9odHRwX2RvX25ld19yZXF1ZXN0KGh0dHBfdXJsX2NvbnRleHQsIGZpbGVuYW1lKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gZXJyOwogfQogCi0vLyBSRkMgNjM4MQotc3RhdGljIHZvaWQgc2V0X2NvZGVjX3N0cihBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICpjb2RlYywKK3N0YXRpYyB2b2lkIGRhc2hlbmNfaW9fY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqKnBiLCBjaGFyICpmaWxlbmFtZSkgeworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCBodHRwX2Jhc2VfcHJvdG8gPSBmaWxlbmFtZSA/IGZmX2lzX2h0dHBfcHJvdG8oZmlsZW5hbWUpIDogMDsKKworICAgIGlmICghaHR0cF9iYXNlX3Byb3RvIHx8ICFjLT5odHRwX3BlcnNpc3RlbnQpIHsKKyAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsIHBiKTsKKyNpZiBDT05GSUdfSFRUUF9QUk9UT0NPTAorICAgIH0gZWxzZSB7CisgICAgICAgIFVSTENvbnRleHQgKmh0dHBfdXJsX2NvbnRleHQgPSBmZmlvX2dldHVybGNvbnRleHQoKnBiKTsKKyAgICAgICAgYXZfYXNzZXJ0MChodHRwX3VybF9jb250ZXh0KTsKKyAgICAgICAgYXZpb19mbHVzaCgqcGIpOworICAgICAgICBmZnVybF9zaHV0ZG93bihodHRwX3VybF9jb250ZXh0LCBBVklPX0ZMQUdfV1JJVEUpOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfY29kZWNfc3RyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc3RyLCBpbnQgc2l6ZSkKIHsKICAgICBjb25zdCBBVkNvZGVjVGFnICp0YWdzWzJdID0geyBOVUxMLCBOVUxMIH07CiAgICAgdWludDMyX3QgdGFnOwotICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgaW50IGk7CisKKyAgICAvLyBjb21tb24gV2VibSBjb2RlY3MgYXJlIG5vdCBwYXJ0IG9mIFJGQyA2MzgxCisgICAgZm9yIChpID0gMDsgY29kZWNzW2ldLmlkOyBpKyspCisgICAgICAgIGlmIChjb2RlY3NbaV0uaWQgPT0gcGFyLT5jb2RlY19pZCkgeworICAgICAgICAgICAgYXZfc3RybGNweShzdHIsIGNvZGVjc1tpXS5zdHIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAvLyBmb3IgY29kZWNzIHBhcnQgb2YgUkZDIDYzODEKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKICAgICAgICAgdGFnc1swXSA9IGZmX2NvZGVjX21vdnZpZGVvX3RhZ3M7Ci0gICAgZWxzZSBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgIGVsc2UgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCiAgICAgICAgIHRhZ3NbMF0gPSBmZl9jb2RlY19tb3ZhdWRpb190YWdzOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuOwogCi0gICAgdGFnID0gYXZfY29kZWNfZ2V0X3RhZyh0YWdzLCBjb2RlYy0+Y29kZWNfaWQpOworICAgIHRhZyA9IGF2X2NvZGVjX2dldF90YWcodGFncywgcGFyLT5jb2RlY19pZCk7CiAgICAgaWYgKCF0YWcpCiAgICAgICAgIHJldHVybjsKICAgICBpZiAoc2l6ZSA8IDUpCkBAIC0xMzIsMTcgKzE5NywxNyBAQAogICAgIGlmICghc3RyY21wKHN0ciwgIm1wNGEiKSB8fCAhc3RyY21wKHN0ciwgIm1wNHYiKSkgewogICAgICAgICB1aW50MzJfdCBvdGk7CiAgICAgICAgIHRhZ3NbMF0gPSBmZl9tcDRfb2JqX3R5cGU7Ci0gICAgICAgIG90aSA9IGF2X2NvZGVjX2dldF90YWcodGFncywgY29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgb3RpID0gYXZfY29kZWNfZ2V0X3RhZyh0YWdzLCBwYXItPmNvZGVjX2lkKTsKICAgICAgICAgaWYgKG90aSkKLSAgICAgICAgICAgIGF2X3N0cmxjYXRmKHN0ciwgc2l6ZSwgIi4lMDJ4Iiwgb3RpKTsKKyAgICAgICAgICAgIGF2X3N0cmxjYXRmKHN0ciwgc2l6ZSwgIi4lMDIiUFJJeDMyLCBvdGkpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgaWYgKHRhZyA9PSBNS1RBRygnbScsICdwJywgJzQnLCAnYScpKSB7Ci0gICAgICAgICAgICBpZiAoY29kZWMtPmV4dHJhZGF0YV9zaXplID49IDIpIHsKLSAgICAgICAgICAgICAgICBpbnQgYW90ID0gY29kZWMtPmV4dHJhZGF0YVswXSA+PiAzOworICAgICAgICAgICAgaWYgKHBhci0+ZXh0cmFkYXRhX3NpemUgPj0gMikgeworICAgICAgICAgICAgICAgIGludCBhb3QgPSBwYXItPmV4dHJhZGF0YVswXSA+PiAzOwogICAgICAgICAgICAgICAgIGlmIChhb3QgPT0gMzEpCi0gICAgICAgICAgICAgICAgICAgIGFvdCA9ICgoQVZfUkIxNihjb2RlYy0+ZXh0cmFkYXRhKSA+PiA1KSAmIDB4M2YpICsgMzI7CisgICAgICAgICAgICAgICAgICAgIGFvdCA9ICgoQVZfUkIxNihwYXItPmV4dHJhZGF0YSkgPj4gNSkgJiAweDNmKSArIDMyOwogICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKHN0ciwgc2l6ZSwgIi4lZCIsIGFvdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAodGFnID09IE1LVEFHKCdtJywgJ3AnLCAnNCcsICd2JykpIHsKQEAgLTE1MSw4ICsyMTYsOCBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY21wKHN0ciwgImF2YzEiKSkgewogICAgICAgICB1aW50OF90ICp0bXBidWYgPSBOVUxMOwotICAgICAgICB1aW50OF90ICpleHRyYWRhdGEgPSBjb2RlYy0+ZXh0cmFkYXRhOwotICAgICAgICBpbnQgZXh0cmFkYXRhX3NpemUgPSBjb2RlYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgIHVpbnQ4X3QgKmV4dHJhZGF0YSA9IHBhci0+ZXh0cmFkYXRhOworICAgICAgICBpbnQgZXh0cmFkYXRhX3NpemUgPSBwYXItPmV4dHJhZGF0YV9zaXplOwogICAgICAgICBpZiAoIWV4dHJhZGF0YV9zaXplKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBpZiAoZXh0cmFkYXRhWzBdICE9IDEpIHsKQEAgLTE3NCwxMCArMjM5LDc2IEBACiAgICAgfQogfQogCitzdGF0aWMgaW50IGZsdXNoX2R5bmJ1ZihPdXRwdXRTdHJlYW0gKm9zLCBpbnQgKnJhbmdlX2xlbmd0aCkKK3sKKyAgICB1aW50OF90ICpidWZmZXI7CisKKyAgICBpZiAoIW9zLT5jdHgtPnBiKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8gZmx1c2gKKyAgICBhdl93cml0ZV9mcmFtZShvcy0+Y3R4LCBOVUxMKTsKKyAgICBhdmlvX2ZsdXNoKG9zLT5jdHgtPnBiKTsKKworICAgIC8vIHdyaXRlIG91dCB0byBmaWxlCisgICAgKnJhbmdlX2xlbmd0aCA9IGF2aW9fY2xvc2VfZHluX2J1Zihvcy0+Y3R4LT5wYiwgJmJ1ZmZlcik7CisgICAgb3MtPmN0eC0+cGIgPSBOVUxMOworICAgIGF2aW9fd3JpdGUob3MtPm91dCwgYnVmZmVyICsgb3MtPndyaXR0ZW5fbGVuLCAqcmFuZ2VfbGVuZ3RoIC0gb3MtPndyaXR0ZW5fbGVuKTsKKyAgICBvcy0+d3JpdHRlbl9sZW4gPSAwOworICAgIGF2X2ZyZWUoYnVmZmVyKTsKKworICAgIC8vIHJlLW9wZW4gYnVmZmVyCisgICAgcmV0dXJuIGF2aW9fb3Blbl9keW5fYnVmKCZvcy0+Y3R4LT5wYik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9odHRwX29wdGlvbnMoQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywgREFTSENvbnRleHQgKmMpCit7CisgICAgaWYgKGMtPm1ldGhvZCkKKyAgICAgICAgYXZfZGljdF9zZXQob3B0aW9ucywgIm1ldGhvZCIsIGMtPm1ldGhvZCwgMCk7CisgICAgaWYgKGMtPnVzZXJfYWdlbnQpCisgICAgICAgIGF2X2RpY3Rfc2V0KG9wdGlvbnMsICJ1c2VyX2FnZW50IiwgYy0+dXNlcl9hZ2VudCwgMCk7CisgICAgaWYgKGMtPmh0dHBfcGVyc2lzdGVudCkKKyAgICAgICAgYXZfZGljdF9zZXRfaW50KG9wdGlvbnMsICJtdWx0aXBsZV9yZXF1ZXN0cyIsIDEsIDApOworICAgIGlmIChjLT50aW1lb3V0ID49IDApCisgICAgICAgIGF2X2RpY3Rfc2V0X2ludChvcHRpb25zLCAidGltZW91dCIsIGMtPnRpbWVvdXQsIDApOworfQorCitzdGF0aWMgdm9pZCBnZXRfaGxzX3BsYXlsaXN0X25hbWUoY2hhciAqcGxheWxpc3RfbmFtZSwgaW50IHN0cmluZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJhc2VfdXJsLCBpbnQgaWQpIHsKKyAgICBpZiAoYmFzZV91cmwpCisgICAgICAgIHNucHJpbnRmKHBsYXlsaXN0X25hbWUsIHN0cmluZ19zaXplLCAiJXNtZWRpYV8lZC5tM3U4IiwgYmFzZV91cmwsIGlkKTsKKyAgICBlbHNlCisgICAgICAgIHNucHJpbnRmKHBsYXlsaXN0X25hbWUsIHN0cmluZ19zaXplLCAibWVkaWFfJWQubTN1OCIsIGlkKTsKK30KKworc3RhdGljIGludCBmbHVzaF9pbml0X3NlZ21lbnQoQVZGb3JtYXRDb250ZXh0ICpzLCBPdXRwdXRTdHJlYW0gKm9zKQoreworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQsIHJhbmdlX2xlbmd0aDsKKworICAgIHJldCA9IGZsdXNoX2R5bmJ1ZihvcywgJnJhbmdlX2xlbmd0aCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBvcy0+cG9zID0gb3MtPmluaXRfcmFuZ2VfbGVuZ3RoID0gcmFuZ2VfbGVuZ3RoOworICAgIGlmICghYy0+c2luZ2xlX2ZpbGUpCisgICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShzLCAmb3MtPm91dCk7CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGRhc2hfZnJlZShBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgREFTSENvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CiAgICAgaW50IGksIGo7CisKKyAgICBpZiAoYy0+YXMpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPm5iX2FzOyBpKyspCisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmMtPmFzW2ldLm1ldGFkYXRhKTsKKyAgICAgICAgYXZfZnJlZXAoJmMtPmFzKTsKKyAgICAgICAgYy0+bmJfYXMgPSAwOworICAgIH0KKwogICAgIGlmICghYy0+c3RyZWFtcykKICAgICAgICAgcmV0dXJuOwogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKQEAgLTE4NSw5ICszMTYsOCBAQAogICAgICAgICBpZiAob3MtPmN0eCAmJiBvcy0+Y3R4X2luaXRlZCkKICAgICAgICAgICAgIGF2X3dyaXRlX3RyYWlsZXIob3MtPmN0eCk7CiAgICAgICAgIGlmIChvcy0+Y3R4ICYmIG9zLT5jdHgtPnBiKQotICAgICAgICAgICAgYXZfZnJlZShvcy0+Y3R4LT5wYik7Ci0gICAgICAgIGZmdXJsX2Nsb3NlKG9zLT5vdXQpOwotICAgICAgICBvcy0+b3V0ID0gIE5VTEw7CisgICAgICAgICAgICBmZmlvX2ZyZWVfZHluX2J1Zigmb3MtPmN0eC0+cGIpOworICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJm9zLT5vdXQpOwogICAgICAgICBpZiAob3MtPmN0eCkKICAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChvcy0+Y3R4KTsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9zLT5uYl9zZWdtZW50czsgaisrKQpAQCAtMTk1LDEwICszMjUsMTUgQEAKICAgICAgICAgYXZfZnJlZShvcy0+c2VnbWVudHMpOwogICAgIH0KICAgICBhdl9mcmVlcCgmYy0+c3RyZWFtcyk7CisKKyAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJmMtPm1wZF9vdXQpOworICAgIGZmX2Zvcm1hdF9pb19jbG9zZShzLCAmYy0+bTN1OF9vdXQpOwogfQogCi1zdGF0aWMgdm9pZCBvdXRwdXRfc2VnbWVudF9saXN0KE91dHB1dFN0cmVhbSAqb3MsIEFWSU9Db250ZXh0ICpvdXQsIERBU0hDb250ZXh0ICpjKQorc3RhdGljIHZvaWQgb3V0cHV0X3NlZ21lbnRfbGlzdChPdXRwdXRTdHJlYW0gKm9zLCBBVklPQ29udGV4dCAqb3V0LCBBVkZvcm1hdENvbnRleHQgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXByZXNlbnRhdGlvbl9pZCwgaW50IGZpbmFsKQogeworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwogICAgIGludCBpLCBzdGFydF9pbmRleCA9IDAsIHN0YXJ0X251bWJlciA9IDE7CiAgICAgaWYgKGMtPndpbmRvd19zaXplKSB7CiAgICAgICAgIHN0YXJ0X2luZGV4ICA9IEZGTUFYKG9zLT5uYl9zZWdtZW50cyAgIC0gYy0+d2luZG93X3NpemUsIDApOwpAQCAtMjU3LDExOSArMzkyLDYxIEBACiAgICAgICAgIH0KICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHQ8L1NlZ21lbnRMaXN0PlxuIik7CiAgICAgfQotfQorICAgIGlmIChjLT5obHNfcGxheWxpc3QgJiYgc3RhcnRfaW5kZXggPCBvcy0+bmJfc2VnbWVudHMpCisgICAgeworICAgICAgICBpbnQgdGltZXNjYWxlID0gb3MtPmN0eC0+c3RyZWFtc1swXS0+dGltZV9iYXNlLmRlbjsKKyAgICAgICAgY2hhciB0ZW1wX2ZpbGVuYW1lX2hsc1sxMDI0XTsKKyAgICAgICAgY2hhciBmaWxlbmFtZV9obHNbMTAyNF07CisgICAgICAgIEFWRGljdGlvbmFyeSAqaHR0cF9vcHRzID0gTlVMTDsKKyAgICAgICAgaW50IHRhcmdldF9kdXJhdGlvbiA9IDA7CisgICAgICAgIGludCByZXQgPSAwOworICAgICAgICBjb25zdCBjaGFyICpwcm90byA9IGF2aW9fZmluZF9wcm90b2NvbF9uYW1lKGMtPmRpcm5hbWUpOworICAgICAgICBpbnQgdXNlX3JlbmFtZSA9IHByb3RvICYmICFzdHJjbXAocHJvdG8sICJmaWxlIik7CiAKLXN0YXRpYyBEQVNIVG1wbElkIGRhc2hfcmVhZF90bXBsX2lkKGNvbnN0IGNoYXIgKmlkZW50aWZpZXIsIGNoYXIgKmZvcm1hdF90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZm9ybWF0X3RhZ19zaXplLCBjb25zdCBjaGFyICoqcHRyKSB7Ci0gICAgY29uc3QgY2hhciAqbmV4dF9wdHI7Ci0gICAgREFTSFRtcGxJZCBpZF90eXBlID0gREFTSF9UTVBMX0lEX1VOREVGSU5FRDsKKyAgICAgICAgZ2V0X2hsc19wbGF5bGlzdF9uYW1lKGZpbGVuYW1lX2hscywgc2l6ZW9mKGZpbGVuYW1lX2hscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5kaXJuYW1lLCByZXByZXNlbnRhdGlvbl9pZCk7CiAKLSAgICBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiQkIiwgJm5leHRfcHRyKSkgewotICAgICAgICBpZF90eXBlID0gREFTSF9UTVBMX0lEX0VTQ0FQRTsKLSAgICAgICAgKnB0ciA9IG5leHRfcHRyOwotICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiRSZXByZXNlbnRhdGlvbklEJCIsICZuZXh0X3B0cikpIHsKLSAgICAgICAgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9SRVBfSUQ7Ci0gICAgICAgIC8vIGRlZmF1bHQgdG8gYmFzaWMgZm9ybWF0LCBhcyAkUmVwcmVzZW50YXRpb25JRCQgaWRlbnRpZmllcnMKLSAgICAgICAgLy8gYXJlIG5vdCBhbGxvd2VkIHRvIGhhdmUgY3VzdG9tIGZvcm1hdC10YWdzLgotICAgICAgICBhdl9zdHJsY3B5KGZvcm1hdF90YWcsICIlZCIsIGZvcm1hdF90YWdfc2l6ZSk7Ci0gICAgICAgICpwdHIgPSBuZXh0X3B0cjsKLSAgICB9IGVsc2UgeyAvLyB0aGUgZm9sbG93aW5nIGlkZW50aWZpZXJzIG1heSBoYXZlIGFuIGV4cGxpY2l0IGZvcm1hdF90YWcKLSAgICAgICAgaWYgKGF2X3N0cnN0YXJ0KGlkZW50aWZpZXIsICIkTnVtYmVyIiwgJm5leHRfcHRyKSkKLSAgICAgICAgICAgIGlkX3R5cGUgPSBEQVNIX1RNUExfSURfTlVNQkVSOwotICAgICAgICBlbHNlIGlmIChhdl9zdHJzdGFydChpZGVudGlmaWVyLCAiJEJhbmR3aWR0aCIsICZuZXh0X3B0cikpCi0gICAgICAgICAgICBpZF90eXBlID0gREFTSF9UTVBMX0lEX0JBTkRXSURUSDsKLSAgICAgICAgZWxzZSBpZiAoYXZfc3Ryc3RhcnQoaWRlbnRpZmllciwgIiRUaW1lIiwgJm5leHRfcHRyKSkKLSAgICAgICAgICAgIGlkX3R5cGUgPSBEQVNIX1RNUExfSURfVElNRTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9VTkRFRklORUQ7CisgICAgICAgIHNucHJpbnRmKHRlbXBfZmlsZW5hbWVfaGxzLCBzaXplb2YodGVtcF9maWxlbmFtZV9obHMpLCB1c2VfcmVuYW1lID8gIiVzLnRtcCIgOiAiJXMiLCBmaWxlbmFtZV9obHMpOwogCi0gICAgICAgIC8vIG5leHQgcGFyc2UgdGhlIGRhc2ggZm9ybWF0LXRhZyBhbmQgZ2VuZXJhdGUgYSBjLXN0cmluZyBmb3JtYXQgdGFnCi0gICAgICAgIC8vIChuZXh0X3B0ciBub3cgcG9pbnRzIGF0IHRoZSBmaXJzdCAnJScgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZm9ybWF0LXRhZykKLSAgICAgICAgaWYgKGlkX3R5cGUgIT0gREFTSF9UTVBMX0lEX1VOREVGSU5FRCkgewotICAgICAgICAgICAgY29uc3QgY2hhciAqbnVtYmVyX2Zvcm1hdCA9IChpZF90eXBlID09IERBU0hfVE1QTF9JRF9USU1FKSA/IFBSSWQ2NCA6ICJkIjsKLSAgICAgICAgICAgIGlmIChuZXh0X3B0clswXSA9PSAnJCcpIHsgLy8gbm8gZGFzaCBmb3JtYXQtdGFnCi0gICAgICAgICAgICAgICAgc25wcmludGYoZm9ybWF0X3RhZywgZm9ybWF0X3RhZ19zaXplLCAiJSUlcyIsIG51bWJlcl9mb3JtYXQpOwotICAgICAgICAgICAgICAgICpwdHIgPSAmbmV4dF9wdHJbMV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKndpZHRoX3B0cjsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IHRvbGVyYXRlIHNpbmdsZS1kaWdpdCB3aWR0aC1maWVsZCAoaS5lLiB1cCB0byA5LWRpZ2l0IHdpZHRoKQotICAgICAgICAgICAgICAgIGlmIChhdl9zdHJzdGFydChuZXh0X3B0ciwgIiUwIiwgJndpZHRoX3B0cikgJiYKLSAgICAgICAgICAgICAgICAgICAgYXZfaXNkaWdpdCh3aWR0aF9wdHJbMF0pICYmCi0gICAgICAgICAgICAgICAgICAgIGF2X3N0cnN0YXJ0KCZ3aWR0aF9wdHJbMV0sICJkJCIsICZuZXh0X3B0cikpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8geWVzLCB3ZSdyZSB1c2luZyBhIGZvcm1hdCB0YWcgdG8gYnVpbGQgZm9ybWF0X3RhZy4KLSAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZm9ybWF0X3RhZywgZm9ybWF0X3RhZ19zaXplLCAiJXMlYyVzIiwgIiUwIiwgd2lkdGhfcHRyWzBdLCBudW1iZXJfZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgKnB0ciA9IG5leHRfcHRyOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBwYXJzZSBmb3JtYXQtdGFnIGJlZ2lubmluZyB3aXRoICVzLiBFeHBlY3RlZCBlaXRoZXIgYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsb3NpbmcgJyQnIGNoYXJhY3RlciBvciBhIGZvcm1hdC1zdHJpbmcgbGlrZSAnJSUwW3dpZHRoXWQnLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIHdpZHRoIG11c3QgYmUgYSBzaW5nbGUgZGlnaXRcbiIsIG5leHRfcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgaWRfdHlwZSA9IERBU0hfVE1QTF9JRF9VTkRFRklORUQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBzZXRfaHR0cF9vcHRpb25zKCZodHRwX29wdHMsIGMpOworICAgICAgICBkYXNoZW5jX2lvX29wZW4ocywgJmMtPm0zdThfb3V0LCB0ZW1wX2ZpbGVuYW1lX2hscywgJmh0dHBfb3B0cyk7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmaHR0cF9vcHRzKTsKKyAgICAgICAgZm9yIChpID0gc3RhcnRfaW5kZXg7IGkgPCBvcy0+bmJfc2VnbWVudHM7IGkrKykgeworICAgICAgICAgICAgU2VnbWVudCAqc2VnID0gb3MtPnNlZ21lbnRzW2ldOworICAgICAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gKGRvdWJsZSkgc2VnLT5kdXJhdGlvbiAvIHRpbWVzY2FsZTsKKyAgICAgICAgICAgIGlmICh0YXJnZXRfZHVyYXRpb24gPD0gZHVyYXRpb24pCisgICAgICAgICAgICAgICAgdGFyZ2V0X2R1cmF0aW9uID0gbHJpbnQoZHVyYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgZmZfaGxzX3dyaXRlX3BsYXlsaXN0X2hlYWRlcihjLT5tM3U4X291dCwgNiwgLTEsIHRhcmdldF9kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9udW1iZXIsIFBMQVlMSVNUX1RZUEVfTk9ORSk7CisKKyAgICAgICAgZmZfaGxzX3dyaXRlX2luaXRfZmlsZShjLT5tM3U4X291dCwgb3MtPmluaXRmaWxlLCBjLT5zaW5nbGVfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy0+aW5pdF9yYW5nZV9sZW5ndGgsIG9zLT5pbml0X3N0YXJ0X3Bvcyk7CisKKyAgICAgICAgZm9yIChpID0gc3RhcnRfaW5kZXg7IGkgPCBvcy0+bmJfc2VnbWVudHM7IGkrKykgeworICAgICAgICAgICAgU2VnbWVudCAqc2VnID0gb3MtPnNlZ21lbnRzW2ldOworICAgICAgICAgICAgcmV0ID0gZmZfaGxzX3dyaXRlX2ZpbGVfZW50cnkoYy0+bTN1OF9vdXQsIDAsIGMtPnNpbmdsZV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgc2VnLT5kdXJhdGlvbiAvIHRpbWVzY2FsZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+cmFuZ2VfbGVuZ3RoLCBzZWctPnN0YXJ0X3BvcywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnNpbmdsZV9maWxlID8gb3MtPmluaXRmaWxlIDogc2VnLT5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhvcy0+Y3R4LCBBVl9MT0dfV0FSTklORywgImZmX2hsc193cml0ZV9maWxlX2VudHJ5IGdldCBlcnJvclxuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICBpZiAoZmluYWwpCisgICAgICAgICAgICBmZl9obHNfd3JpdGVfZW5kX2xpc3QoYy0+bTN1OF9vdXQpOworCisgICAgICAgIGRhc2hlbmNfaW9fY2xvc2UocywgJmMtPm0zdThfb3V0LCB0ZW1wX2ZpbGVuYW1lX2hscyk7CisKKyAgICAgICAgaWYgKHVzZV9yZW5hbWUpCisgICAgICAgICAgICBpZiAoYXZwcml2X2lvX21vdmUodGVtcF9maWxlbmFtZV9obHMsIGZpbGVuYW1lX2hscykgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKG9zLT5jdHgsIEFWX0xPR19XQVJOSU5HLCAicmVuYW1pbmcgZmlsZSAlcyB0byAlcyBmYWlsZWRcblxuIiwgdGVtcF9maWxlbmFtZV9obHMsIGZpbGVuYW1lX2hscyk7CisgICAgICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBpZF90eXBlOwotfQogCi1zdGF0aWMgdm9pZCBkYXNoX2ZpbGxfdG1wbF9wYXJhbXMoY2hhciAqZHN0LCBzaXplX3QgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGVtcGxhdGUsIGludCByZXBfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgaW50IGJpdF9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZSkgewotICAgIGludCBkc3RfcG9zID0gMDsKLSAgICBjb25zdCBjaGFyICp0X2N1ciA9IHRlbXBsYXRlOwotICAgIHdoaWxlIChkc3RfcG9zIDwgYnVmZmVyX3NpemUgLSAxICYmICp0X2N1cikgewotICAgICAgICBjaGFyIGZvcm1hdF90YWdbN107IC8vIE1heSBiZSAiJWQiLCAiJTBYZCIsIG9yICIlMFhsbGQiIChmb3IgJFRpbWUkKSwgd2hlcmUgWCBpcyBpbiBbMC05XQotICAgICAgICBpbnQgbiA9IDA7Ci0gICAgICAgIERBU0hUbXBsSWQgaWRfdHlwZTsKLSAgICAgICAgY29uc3QgY2hhciAqdF9uZXh0ID0gc3RyY2hyKHRfY3VyLCAnJCcpOyAvLyBjb3B5IG92ZXIgZXZlcnl0aGluZyB1cCB0byB0aGUgZmlyc3QgJyQnIGNoYXJhY3RlcgotICAgICAgICBpZiAodF9uZXh0KSB7Ci0gICAgICAgICAgICBpbnQgbnVtX2NvcHlfYnl0ZXMgPSBGRk1JTih0X25leHQgLSB0X2N1ciwgYnVmZmVyX3NpemUgLSBkc3RfcG9zIC0gMSk7Ci0gICAgICAgICAgICBhdl9zdHJsY3B5KCZkc3RbZHN0X3Bvc10sIHRfY3VyLCBudW1fY29weV9ieXRlcyArIDEpOwotICAgICAgICAgICAgLy8gYWR2YW5jZQotICAgICAgICAgICAgZHN0X3BvcyArPSBudW1fY29weV9ieXRlczsKLSAgICAgICAgICAgIHRfY3VyID0gdF9uZXh0OwotICAgICAgICB9IGVsc2UgeyAvLyBubyBtb3JlIERBU0ggaWRlbnRpZmllcnMgdG8gc3Vic3RpdHV0ZSAtIGp1c3QgY29weSB0aGUgcmVzdCBvdmVyIGFuZCBicmVhawotICAgICAgICAgICAgYXZfc3RybGNweSgmZHN0W2RzdF9wb3NdLCB0X2N1ciwgYnVmZmVyX3NpemUgLSBkc3RfcG9zKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRzdF9wb3MgPj0gYnVmZmVyX3NpemUgLSAxIHx8ICEqdF9jdXIpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyB0X2N1ciBpcyBub3cgcG9pbnRpbmcgdG8gYSAnJCcgY2hhcmFjdGVyCi0gICAgICAgIGlkX3R5cGUgPSBkYXNoX3JlYWRfdG1wbF9pZCh0X2N1ciwgZm9ybWF0X3RhZywgc2l6ZW9mKGZvcm1hdF90YWcpLCAmdF9uZXh0KTsKLSAgICAgICAgc3dpdGNoIChpZF90eXBlKSB7Ci0gICAgICAgIGNhc2UgREFTSF9UTVBMX0lEX0VTQ0FQRToKLSAgICAgICAgICAgIGF2X3N0cmxjcHkoJmRzdFtkc3RfcG9zXSwgIiQiLCAyKTsKLSAgICAgICAgICAgIG4gPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREFTSF9UTVBMX0lEX1JFUF9JRDoKLSAgICAgICAgICAgIG4gPSBzbnByaW50ZigmZHN0W2RzdF9wb3NdLCBidWZmZXJfc2l6ZSAtIGRzdF9wb3MsIGZvcm1hdF90YWcsIHJlcF9pZCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVNIX1RNUExfSURfTlVNQkVSOgotICAgICAgICAgICAgbiA9IHNucHJpbnRmKCZkc3RbZHN0X3Bvc10sIGJ1ZmZlcl9zaXplIC0gZHN0X3BvcywgZm9ybWF0X3RhZywgbnVtYmVyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERBU0hfVE1QTF9JRF9CQU5EV0lEVEg6Ci0gICAgICAgICAgICBuID0gc25wcmludGYoJmRzdFtkc3RfcG9zXSwgYnVmZmVyX3NpemUgLSBkc3RfcG9zLCBmb3JtYXRfdGFnLCBiaXRfcmF0ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBEQVNIX1RNUExfSURfVElNRToKLSAgICAgICAgICAgIG4gPSBzbnByaW50ZigmZHN0W2RzdF9wb3NdLCBidWZmZXJfc2l6ZSAtIGRzdF9wb3MsIGZvcm1hdF90YWcsIHRpbWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREFTSF9UTVBMX0lEX1VOREVGSU5FRDoKLSAgICAgICAgICAgIC8vIGNvcHkgb3ZlciBvbmUgYnl0ZSBhbmQgYWR2YW5jZQotICAgICAgICAgICAgYXZfc3RybGNweSgmZHN0W2RzdF9wb3NdLCB0X2N1ciwgMik7Ci0gICAgICAgICAgICBuID0gMTsKLSAgICAgICAgICAgIHRfbmV4dCA9ICZ0X2N1clsxXTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIC8vIHRfbmV4dCBwb2ludHMganVzdCBwYXN0IHRoZSBwcm9jZXNzZWQgaWRlbnRpZmllcgotICAgICAgICAvLyBuIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3ZXJlIGF0dGVtcHRlZCB0byBiZSB3cml0dGVuIHRvIGRzdAotICAgICAgICAvLyAobWF5IGhhdmUgZmFpbGVkIHRvIHdyaXRlIGFsbCBiZWNhdXNlIGJ1ZmZlcl9zaXplKS4KLQotICAgICAgICAvLyBhZHZhbmNlCi0gICAgICAgIGRzdF9wb3MgKz0gRkZNSU4obiwgYnVmZmVyX3NpemUgLSBkc3RfcG9zIC0gMSk7Ci0gICAgICAgIHRfY3VyID0gdF9uZXh0OwotICAgIH0KIH0KIAogc3RhdGljIGNoYXIgKnhtbGVzY2FwZShjb25zdCBjaGFyICpzdHIpIHsKQEAgLTQzNCwyNSArNTExLDIxNyBAQAogICAgIHN0cnVjdCB0bSAqcHRtLCB0bWJ1ZjsKICAgICBwdG0gPSBnbXRpbWVfcigmdCwgJnRtYnVmKTsKICAgICBpZiAocHRtKSB7Ci0gICAgICAgIGlmICghc3RyZnRpbWUoYnVmLCBzaXplLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwdG0pKQorICAgICAgICBpZiAoIXN0cmZ0aW1lKGJ1Ziwgc2l6ZSwgIiVZLSVtLSVkVCVIOiVNOiVTWiIsIHB0bSkpCiAgICAgICAgICAgICBidWZbMF0gPSAnXDAnOwogICAgIH0KIH0KIAorc3RhdGljIGludCB3cml0ZV9hZGFwdGF0aW9uX3NldChBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpvdXQsIGludCBhc19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbmFsKQoreworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFkYXB0YXRpb25TZXQgKmFzID0gJmMtPmFzW2FzX2luZGV4XTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqbGFuZywgKnJvbGU7CisgICAgaW50IGk7CisKKyAgICBhdmlvX3ByaW50ZihvdXQsICJcdFx0PEFkYXB0YXRpb25TZXQgaWQ9XCIlc1wiIGNvbnRlbnRUeXBlPVwiJXNcIiBzZWdtZW50QWxpZ25tZW50PVwidHJ1ZVwiIGJpdHN0cmVhbVN3aXRjaGluZz1cInRydWVcIiIsCisgICAgICAgICAgICAgICAgYXMtPmlkLCBhcy0+bWVkaWFfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgaWYgKGFzLT5tZWRpYV90eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBhcy0+bWF4X2ZyYW1lX3JhdGUubnVtICYmICFhcy0+YW1iaWd1b3VzX2ZyYW1lX3JhdGUgJiYgYXZfY21wX3EoYXMtPm1pbl9mcmFtZV9yYXRlLCBhcy0+bWF4X2ZyYW1lX3JhdGUpIDwgMCkKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiIG1heEZyYW1lUmF0ZT1cIiVkLyVkXCIiLCBhcy0+bWF4X2ZyYW1lX3JhdGUubnVtLCBhcy0+bWF4X2ZyYW1lX3JhdGUuZGVuKTsKKyAgICBsYW5nID0gYXZfZGljdF9nZXQoYXMtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCBOVUxMLCAwKTsKKyAgICBpZiAobGFuZykKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiIGxhbmc9XCIlc1wiIiwgbGFuZy0+dmFsdWUpOworICAgIGF2aW9fcHJpbnRmKG91dCwgIj5cbiIpOworCisgICAgcm9sZSA9IGF2X2RpY3RfZ2V0KGFzLT5tZXRhZGF0YSwgInJvbGUiLCBOVUxMLCAwKTsKKyAgICBpZiAocm9sZSkKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0PFJvbGUgc2NoZW1lSWRVcmk9XCJ1cm46bXBlZzpkYXNoOnJvbGU6MjAxMVwiIHZhbHVlPVwiJXNcIi8+XG4iLCByb2xlLT52YWx1ZSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3MgPSAmYy0+c3RyZWFtc1tpXTsKKworICAgICAgICBpZiAob3MtPmFzX2lkeCAtIDEgIT0gYXNfaW5kZXgpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoYXMtPm1lZGlhX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0PFJlcHJlc2VudGF0aW9uIGlkPVwiJWRcIiBtaW1lVHlwZT1cInZpZGVvLyVzXCIgY29kZWNzPVwiJXNcIiVzIHdpZHRoPVwiJWRcIiBoZWlnaHQ9XCIlZFwiIiwKKyAgICAgICAgICAgICAgICBpLCBvcy0+Zm9ybWF0X25hbWUsIG9zLT5jb2RlY19zdHIsIG9zLT5iYW5kd2lkdGhfc3RyLCBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+d2lkdGgsIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5oZWlnaHQpOworICAgICAgICAgICAgaWYgKHN0LT5hdmdfZnJhbWVfcmF0ZS5udW0pCisgICAgICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiIGZyYW1lUmF0ZT1cIiVkLyVkXCIiLCBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtLCBzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuKTsKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIj5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0PFJlcHJlc2VudGF0aW9uIGlkPVwiJWRcIiBtaW1lVHlwZT1cImF1ZGlvLyVzXCIgY29kZWNzPVwiJXNcIiVzIGF1ZGlvU2FtcGxpbmdSYXRlPVwiJWRcIj5cbiIsCisgICAgICAgICAgICAgICAgaSwgb3MtPmZvcm1hdF9uYW1lLCBvcy0+Y29kZWNfc3RyLCBvcy0+YmFuZHdpZHRoX3N0ciwgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHRcdFx0PEF1ZGlvQ2hhbm5lbENvbmZpZ3VyYXRpb24gc2NoZW1lSWRVcmk9XCJ1cm46bXBlZzpkYXNoOjIzMDAzOjM6YXVkaW9fY2hhbm5lbF9jb25maWd1cmF0aW9uOjIwMTFcIiB2YWx1ZT1cIiVkXCIgLz5cbiIsCisgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXRfc2VnbWVudF9saXN0KG9zLCBvdXQsIHMsIGksIGZpbmFsKTsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0PC9SZXByZXNlbnRhdGlvbj5cbiIpOworICAgIH0KKyAgICBhdmlvX3ByaW50ZihvdXQsICJcdFx0PC9BZGFwdGF0aW9uU2V0PlxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfYWRhcHRhdGlvbl9zZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBZGFwdGF0aW9uU2V0ICoqYXMsIGVudW0gQVZNZWRpYVR5cGUgdHlwZSkKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKworICAgIHZvaWQgKm1lbSA9IGF2X3JlYWxsb2MoYy0+YXMsIHNpemVvZigqYy0+YXMpICogKGMtPm5iX2FzICsgMSkpOworICAgIGlmICghbWVtKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGMtPmFzID0gbWVtOworICAgICsrYy0+bmJfYXM7CisKKyAgICAqYXMgPSAmYy0+YXNbYy0+bmJfYXMgLSAxXTsKKyAgICBtZW1zZXQoKmFzLCAwLCBzaXplb2YoKiphcykpOworICAgICgqYXMpLT5tZWRpYV90eXBlID0gdHlwZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkYXB0YXRpb25fc2V0X2FkZF9zdHJlYW0oQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgYXNfaWR4LCBpbnQgaSkKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBZGFwdGF0aW9uU2V0ICphcyA9ICZjLT5hc1thc19pZHggLSAxXTsKKyAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07CisKKyAgICBpZiAoYXMtPm1lZGlhX3R5cGUgIT0gcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvZGVjIHR5cGUgb2Ygc3RyZWFtICVkIGRvZXNuJ3QgbWF0Y2ggQWRhcHRhdGlvblNldCdzIG1lZGlhIHR5cGVcbiIsIGkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0gZWxzZSBpZiAob3MtPmFzX2lkeCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU3RyZWFtICVkIGlzIGFscmVhZHkgYXNzaWduZWQgdG8gYW4gQWRhcHRhdGlvblNldFxuIiwgaSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIG9zLT5hc19pZHggPSBhc19pZHg7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9hZGFwdGF0aW9uX3NldHMoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGNvbnN0IGNoYXIgKnAgPSBjLT5hZGFwdGF0aW9uX3NldHM7CisgICAgZW51bSB7IG5ld19zZXQsIHBhcnNlX2lkLCBwYXJzaW5nX3N0cmVhbXMgfSBzdGF0ZTsKKyAgICBBZGFwdGF0aW9uU2V0ICphczsKKyAgICBpbnQgaSwgbiwgcmV0OworCisgICAgLy8gZGVmYXVsdDogb25lIEFkYXB0YXRpb25TZXQgZm9yIGVhY2ggc3RyZWFtCisgICAgaWYgKCFwKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gYWRkX2FkYXB0YXRpb25fc2V0KHMsICZhcywgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHNucHJpbnRmKGFzLT5pZCwgc2l6ZW9mKGFzLT5pZCksICIlZCIsIGkpOworCisgICAgICAgICAgICBjLT5zdHJlYW1zW2ldLmFzX2lkeCA9IGMtPm5iX2FzOworICAgICAgICB9CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIC8vIHN5bnRheCBpZD0wLHN0cmVhbXM9MCwxLDIgaWQ9MSxzdHJlYW1zPTMsNCBhbmQgc28gb24KKyAgICBzdGF0ZSA9IG5ld19zZXQ7CisgICAgd2hpbGUgKCpwKSB7CisgICAgICAgIGlmICgqcCA9PSAnICcpIHsKKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IG5ld19zZXQgJiYgYXZfc3Ryc3RhcnQocCwgImlkPSIsICZwKSkgeworCisgICAgICAgICAgICBpZiAoKHJldCA9IGFkZF9hZGFwdGF0aW9uX3NldChzLCAmYXMsIEFWTUVESUFfVFlQRV9VTktOT1dOKSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgICAgIG4gPSBzdHJjc3BuKHAsICIsIik7CisgICAgICAgICAgICBzbnByaW50Zihhcy0+aWQsIHNpemVvZihhcy0+aWQpLCAiJS4qcyIsIG4sIHApOworCisgICAgICAgICAgICBwICs9IG47CisgICAgICAgICAgICBpZiAoKnApCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgc3RhdGUgPSBwYXJzZV9pZDsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBwYXJzZV9pZCAmJiBhdl9zdHJzdGFydChwLCAic3RyZWFtcz0iLCAmcCkpIHsKKyAgICAgICAgICAgIHN0YXRlID0gcGFyc2luZ19zdHJlYW1zOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IHBhcnNpbmdfc3RyZWFtcykgeworICAgICAgICAgICAgQWRhcHRhdGlvblNldCAqYXMgPSAmYy0+YXNbYy0+bmJfYXMgLSAxXTsKKyAgICAgICAgICAgIGNoYXIgaWR4X3N0cls4XSwgKmVuZF9zdHI7CisKKyAgICAgICAgICAgIG4gPSBzdHJjc3BuKHAsICIgLCIpOworICAgICAgICAgICAgc25wcmludGYoaWR4X3N0ciwgc2l6ZW9mKGlkeF9zdHIpLCAiJS4qcyIsIG4sIHApOworICAgICAgICAgICAgcCArPSBuOworCisgICAgICAgICAgICAvLyBpZiB2YWx1ZSBpcyAiYSIgb3IgInYiLCBtYXAgYWxsIHN0cmVhbXMgb2YgdGhhdCB0eXBlCisgICAgICAgICAgICBpZiAoYXMtPm1lZGlhX3R5cGUgPT0gQVZNRURJQV9UWVBFX1VOS05PV04gJiYgKGlkeF9zdHJbMF0gPT0gJ3YnIHx8IGlkeF9zdHJbMF0gPT0gJ2EnKSkgeworICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZSA9IChpZHhfc3RyWzBdID09ICd2JykgPyBBVk1FRElBX1RZUEVfVklERU8gOiBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIk1hcCBhbGwgc3RyZWFtcyBvZiB0eXBlICVzXG4iLCBpZHhfc3RyKTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBhcy0+bWVkaWFfdHlwZSA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlOworCisgICAgICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYWRhcHRhdGlvbl9zZXRfYWRkX3N0cmVhbShzLCBjLT5uYl9hcywgaSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2VsZWN0IHNpbmdsZSBzdHJlYW0KKyAgICAgICAgICAgICAgICBpID0gc3RydG9sKGlkeF9zdHIsICZlbmRfc3RyLCAxMCk7CisgICAgICAgICAgICAgICAgaWYgKGlkeF9zdHIgPT0gZW5kX3N0ciB8fCBpIDwgMCB8fCBpID49IHMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNlbGVjdGVkIHN0cmVhbSBcIiVzXCIgbm90IGZvdW5kIVxuIiwgaWR4X3N0cik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJNYXAgc3RyZWFtICVkXG4iLCBpKTsKKworICAgICAgICAgICAgICAgIGlmIChhcy0+bWVkaWFfdHlwZSA9PSBBVk1FRElBX1RZUEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgICAgICBhcy0+bWVkaWFfdHlwZSA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYWRhcHRhdGlvbl9zZXRfYWRkX3N0cmVhbShzLCBjLT5uYl9hcywgaSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCpwID09ICcgJykKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ld19zZXQ7CisgICAgICAgICAgICBpZiAoKnApCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworZW5kOgorICAgIC8vIGNoZWNrIGZvciB1bmFzc2lnbmVkIHN0cmVhbXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSAqb3MgPSAmYy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKCFvcy0+YXNfaWR4KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU3RyZWFtICVkIGlzIG5vdCBtYXBwZWQgdG8gYW4gQWRhcHRhdGlvblNldFxuIiwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHdyaXRlX21hbmlmZXN0KEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGZpbmFsKQogewogICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpvdXQ7CiAgICAgY2hhciB0ZW1wX2ZpbGVuYW1lWzEwMjRdOwogICAgIGludCByZXQsIGk7CisgICAgY29uc3QgY2hhciAqcHJvdG8gPSBhdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShzLT51cmwpOworICAgIGludCB1c2VfcmVuYW1lID0gcHJvdG8gJiYgIXN0cmNtcChwcm90bywgImZpbGUiKTsKKyAgICBzdGF0aWMgdW5zaWduZWQgaW50IHdhcm5lZF9ub25fZmlsZSA9IDA7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRpdGxlID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApOworICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CiAKLSAgICBzbnByaW50Zih0ZW1wX2ZpbGVuYW1lLCBzaXplb2YodGVtcF9maWxlbmFtZSksICIlcy50bXAiLCBzLT5maWxlbmFtZSk7Ci0gICAgcmV0ID0gcy0+aW9fb3BlbihzLCAmb3V0LCB0ZW1wX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwpOworICAgIGlmICghdXNlX3JlbmFtZSAmJiAhd2FybmVkX25vbl9maWxlKyspCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgdXNlIHJlbmFtZSBvbiBub24gZmlsZSBwcm90b2NvbCwgdGhpcyBtYXkgbGVhZCB0byByYWNlcyBhbmQgdGVtcG9yYXJ5IHBhcnRpYWwgZmlsZXNcbiIpOworCisgICAgc25wcmludGYodGVtcF9maWxlbmFtZSwgc2l6ZW9mKHRlbXBfZmlsZW5hbWUpLCB1c2VfcmVuYW1lID8gIiVzLnRtcCIgOiAiJXMiLCBzLT51cmwpOworICAgIHNldF9odHRwX29wdGlvbnMoJm9wdHMsIGMpOworICAgIHJldCA9IGRhc2hlbmNfaW9fb3BlbihzLCAmYy0+bXBkX291dCwgdGVtcF9maWxlbmFtZSwgJm9wdHMpOwogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgdGVtcF9maWxlbmFtZSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQorICAgIG91dCA9IGMtPm1wZF9vdXQ7CisgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKICAgICBhdmlvX3ByaW50ZihvdXQsICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJ1dGYtOFwiPz5cbiIpOwogICAgIGF2aW9fcHJpbnRmKG91dCwgIjxNUEQgeG1sbnM6eHNpPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2VcIlxuIgogICAgICAgICAgICAgICAgICJcdHhtbG5zPVwidXJuOm1wZWc6ZGFzaDpzY2hlbWE6bXBkOjIwMTFcIlxuIgpAQCAtNDg2LDcgKzc1NSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgYXZpb19wcmludGYob3V0LCAiXHRtaW5CdWZmZXJUaW1lPVwiIik7Ci0gICAgd3JpdGVfdGltZShvdXQsIGMtPmxhc3RfZHVyYXRpb24pOworICAgIHdyaXRlX3RpbWUob3V0LCBjLT5sYXN0X2R1cmF0aW9uICogMik7CiAgICAgYXZpb19wcmludGYob3V0LCAiXCI+XG4iKTsKICAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxQcm9ncmFtSW5mb3JtYXRpb24+XG4iKTsKICAgICBpZiAodGl0bGUpIHsKQEAgLTQ5NSw2OCArNzY0LDEwNSBAQAogICAgICAgICBhdl9mcmVlKGVzY2FwZWQpOwogICAgIH0KICAgICBhdmlvX3ByaW50ZihvdXQsICJcdDwvUHJvZ3JhbUluZm9ybWF0aW9uPlxuIik7CisKICAgICBpZiAoYy0+d2luZG93X3NpemUgJiYgcy0+bmJfc3RyZWFtcyA+IDAgJiYgYy0+c3RyZWFtc1swXS5uYl9zZWdtZW50cyA+IDAgJiYgIWMtPnVzZV90ZW1wbGF0ZSkgewogICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbMF07CiAgICAgICAgIGludCBzdGFydF9pbmRleCA9IEZGTUFYKG9zLT5uYl9zZWdtZW50cyAtIGMtPndpbmRvd19zaXplLCAwKTsKICAgICAgICAgaW50NjRfdCBzdGFydF90aW1lID0gYXZfcmVzY2FsZV9xKG9zLT5zZWdtZW50c1tzdGFydF9pbmRleF0tPnRpbWUsIHMtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOwotICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxQZXJpb2Qgc3RhcnQ9XCIiKTsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHQ8UGVyaW9kIGlkPVwiMFwiIHN0YXJ0PVwiIik7CiAgICAgICAgIHdyaXRlX3RpbWUob3V0LCBzdGFydF90aW1lKTsKICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXCI+XG4iKTsKICAgICB9IGVsc2UgewotICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxQZXJpb2Qgc3RhcnQ9XCJQVDAuMFNcIj5cbiIpOworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxQZXJpb2QgaWQ9XCIwXCIgc3RhcnQ9XCJQVDAuMFNcIj5cbiIpOwogICAgIH0KIAotICAgIGlmIChjLT5oYXNfdmlkZW8pIHsKLSAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdDxBZGFwdGF0aW9uU2V0IGNvbnRlbnRUeXBlPVwidmlkZW9cIiBzZWdtZW50QWxpZ25tZW50PVwidHJ1ZVwiIGJpdHN0cmVhbVN3aXRjaGluZz1cInRydWVcIiIpOwotICAgICAgICBpZiAoYy0+bWF4X2ZyYW1lX3JhdGUubnVtICYmICFjLT5hbWJpZ3VvdXNfZnJhbWVfcmF0ZSkKLSAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIiAlcz1cIiVkLyVkXCIiLCAoYXZfY21wX3EoYy0+bWluX2ZyYW1lX3JhdGUsIGMtPm1heF9mcmFtZV9yYXRlKSA8IDApID8gIm1heEZyYW1lUmF0ZSIgOiAiZnJhbWVSYXRlIiwgYy0+bWF4X2ZyYW1lX3JhdGUubnVtLCBjLT5tYXhfZnJhbWVfcmF0ZS5kZW4pOwotICAgICAgICBhdmlvX3ByaW50ZihvdXQsICI+XG4iKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOwotCi0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTykKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0PFJlcHJlc2VudGF0aW9uIGlkPVwiJWRcIiBtaW1lVHlwZT1cInZpZGVvL21wNFwiIGNvZGVjcz1cIiVzXCIlcyB3aWR0aD1cIiVkXCIgaGVpZ2h0PVwiJWRcIiIsIGksIG9zLT5jb2RlY19zdHIsIG9zLT5iYW5kd2lkdGhfc3RyLCBzdC0+Y29kZWMtPndpZHRoLCBzdC0+Y29kZWMtPmhlaWdodCk7Ci0gICAgICAgICAgICBpZiAoc3QtPmF2Z19mcmFtZV9yYXRlLm51bSkKLSAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIgZnJhbWVSYXRlPVwiJWQvJWRcIiIsIHN0LT5hdmdfZnJhbWVfcmF0ZS5udW0sIHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4pOwotICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiPlxuIik7Ci0KLSAgICAgICAgICAgIG91dHB1dF9zZWdtZW50X2xpc3QoJmMtPnN0cmVhbXNbaV0sIG91dCwgYyk7Ci0gICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICJcdFx0XHQ8L1JlcHJlc2VudGF0aW9uPlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdDwvQWRhcHRhdGlvblNldD5cbiIpOwotICAgIH0KLSAgICBpZiAoYy0+aGFzX2F1ZGlvKSB7Ci0gICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHQ8QWRhcHRhdGlvblNldCBjb250ZW50VHlwZT1cImF1ZGlvXCIgc2VnbWVudEFsaWdubWVudD1cInRydWVcIiBiaXRzdHJlYW1Td2l0Y2hpbmc9XCJ0cnVlXCI+XG4iKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgIE91dHB1dFN0cmVhbSAqb3MgPSAmYy0+c3RyZWFtc1tpXTsKLQotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHRcdDxSZXByZXNlbnRhdGlvbiBpZD1cIiVkXCIgbWltZVR5cGU9XCJhdWRpby9tcDRcIiBjb2RlY3M9XCIlc1wiJXMgYXVkaW9TYW1wbGluZ1JhdGU9XCIlZFwiPlxuIiwgaSwgb3MtPmNvZGVjX3N0ciwgb3MtPmJhbmR3aWR0aF9zdHIsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0XHQ8QXVkaW9DaGFubmVsQ29uZmlndXJhdGlvbiBzY2hlbWVJZFVyaT1cInVybjptcGVnOmRhc2g6MjMwMDM6MzphdWRpb19jaGFubmVsX2NvbmZpZ3VyYXRpb246MjAxMVwiIHZhbHVlPVwiJWRcIiAvPlxuIiwgc3QtPmNvZGVjLT5jaGFubmVscyk7Ci0gICAgICAgICAgICBvdXRwdXRfc2VnbWVudF9saXN0KCZjLT5zdHJlYW1zW2ldLCBvdXQsIGMpOwotICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXHRcdFx0PC9SZXByZXNlbnRhdGlvbj5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0XHQ8L0FkYXB0YXRpb25TZXQ+XG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bmJfYXM7IGkrKykgeworICAgICAgICBpZiAoKHJldCA9IHdyaXRlX2FkYXB0YXRpb25fc2V0KHMsIG91dCwgaSwgZmluYWwpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBhdmlvX3ByaW50ZihvdXQsICJcdDwvUGVyaW9kPlxuIik7CisKKyAgICBpZiAoYy0+dXRjX3RpbWluZ191cmwpCisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0PFVUQ1RpbWluZyBzY2hlbWVJZFVyaT1cInVybjptcGVnOmRhc2g6dXRjOmh0dHAteHNkYXRlOjIwMTRcIiB2YWx1ZT1cIiVzXCIvPlxuIiwgYy0+dXRjX3RpbWluZ191cmwpOworCiAgICAgYXZpb19wcmludGYob3V0LCAiPC9NUEQ+XG4iKTsKICAgICBhdmlvX2ZsdXNoKG91dCk7Ci0gICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsICZvdXQpOwotICAgIHJldHVybiBmZl9yZW5hbWUodGVtcF9maWxlbmFtZSwgcy0+ZmlsZW5hbWUsIHMpOworICAgIGRhc2hlbmNfaW9fY2xvc2UocywgJmMtPm1wZF9vdXQsIHRlbXBfZmlsZW5hbWUpOworCisgICAgaWYgKHVzZV9yZW5hbWUpIHsKKyAgICAgICAgaWYgKChyZXQgPSBhdnByaXZfaW9fbW92ZSh0ZW1wX2ZpbGVuYW1lLCBzLT51cmwpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChjLT5obHNfcGxheWxpc3QgJiYgIWMtPm1hc3Rlcl9wbGF5bGlzdF9jcmVhdGVkKSB7CisgICAgICAgIGNoYXIgZmlsZW5hbWVfaGxzWzEwMjRdOworICAgICAgICBjb25zdCBjaGFyICphdWRpb19ncm91cCA9ICJBMSI7CisgICAgICAgIGludCBpc19kZWZhdWx0ID0gMTsKKyAgICAgICAgaW50IG1heF9hdWRpb19iaXRyYXRlID0gMDsKKworICAgICAgICBpZiAoKmMtPmRpcm5hbWUpCisgICAgICAgICAgICBzbnByaW50ZihmaWxlbmFtZV9obHMsIHNpemVvZihmaWxlbmFtZV9obHMpLCAiJXMvbWFzdGVyLm0zdTgiLCBjLT5kaXJuYW1lKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc25wcmludGYoZmlsZW5hbWVfaGxzLCBzaXplb2YoZmlsZW5hbWVfaGxzKSwgIm1hc3Rlci5tM3U4Iik7CisKKyAgICAgICAgc25wcmludGYodGVtcF9maWxlbmFtZSwgc2l6ZW9mKHRlbXBfZmlsZW5hbWUpLCB1c2VfcmVuYW1lID8gIiVzLnRtcCIgOiAiJXMiLCBmaWxlbmFtZV9obHMpOworCisgICAgICAgIHNldF9odHRwX29wdGlvbnMoJm9wdHMsIGMpOworICAgICAgICByZXQgPSBhdmlvX29wZW4yKCZvdXQsIHRlbXBfZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwgTlVMTCwgJm9wdHMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBvcGVuICVzIGZvciB3cml0aW5nXG4iLCB0ZW1wX2ZpbGVuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKKworICAgICAgICBmZl9obHNfd3JpdGVfcGxheWxpc3RfdmVyc2lvbihvdXQsIDYpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgcGxheWxpc3RfZmlsZVs2NF07CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBnZXRfaGxzX3BsYXlsaXN0X25hbWUocGxheWxpc3RfZmlsZSwgc2l6ZW9mKHBsYXlsaXN0X2ZpbGUpLCBOVUxMLCBpKTsKKyAgICAgICAgICAgIGZmX2hsc193cml0ZV9hdWRpb19yZW5kaXRpb24ob3V0LCAoY2hhciAqKWF1ZGlvX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdF9maWxlLCBpLCBpc19kZWZhdWx0KTsKKyAgICAgICAgICAgIG1heF9hdWRpb19iaXRyYXRlID0gRkZNQVgoc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSwgbWF4X2F1ZGlvX2JpdHJhdGUpOworICAgICAgICAgICAgaXNfZGVmYXVsdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBjaGFyIHBsYXlsaXN0X2ZpbGVbNjRdOworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGNoYXIgKmFncm91cCA9IE5VTEw7CisgICAgICAgICAgICBpbnQgc3RyZWFtX2JpdHJhdGUgPSBzdC0+Y29kZWNwYXItPmJpdF9yYXRlOworICAgICAgICAgICAgaWYgKChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSAmJiBtYXhfYXVkaW9fYml0cmF0ZSkgeworICAgICAgICAgICAgICAgIGFncm91cCA9IChjaGFyICopYXVkaW9fZ3JvdXA7CisgICAgICAgICAgICAgICAgc3RyZWFtX2JpdHJhdGUgKz0gbWF4X2F1ZGlvX2JpdHJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnZXRfaGxzX3BsYXlsaXN0X25hbWUocGxheWxpc3RfZmlsZSwgc2l6ZW9mKHBsYXlsaXN0X2ZpbGUpLCBOVUxMLCBpKTsKKyAgICAgICAgICAgIGZmX2hsc193cml0ZV9zdHJlYW1faW5mbyhzdCwgb3V0LCBzdHJlYW1fYml0cmF0ZSwgcGxheWxpc3RfZmlsZSwgYWdyb3VwLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX2Nsb3NlKG91dCk7CisgICAgICAgIGlmICh1c2VfcmVuYW1lKQorICAgICAgICAgICAgaWYgKChyZXQgPSBhdnByaXZfaW9fbW92ZSh0ZW1wX2ZpbGVuYW1lLCBmaWxlbmFtZV9obHMpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYy0+bWFzdGVyX3BsYXlsaXN0X2NyZWF0ZWQgPSAxOworICAgIH0KKworICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRhc2hfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3N0YXRpYyBpbnQgZGljdF9jb3B5X2VudHJ5KEFWRGljdGlvbmFyeSAqKmRzdCwgY29uc3QgQVZEaWN0aW9uYXJ5ICpzcmMsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZW50cnkgPSBhdl9kaWN0X2dldChzcmMsIGtleSwgTlVMTCwgMCk7CisgICAgaWYgKGVudHJ5KQorICAgICAgICBhdl9kaWN0X3NldChkc3QsIGtleSwgZW50cnktPnZhbHVlLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYXNoX2luaXQoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIERBU0hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwogICAgIGludCByZXQgPSAwLCBpOwotICAgIEFWT3V0cHV0Rm9ybWF0ICpvZm9ybWF0OwogICAgIGNoYXIgKnB0cjsKICAgICBjaGFyIGJhc2VuYW1lWzEwMjRdOwogCkBAIC01NjQsNDQgKzg3MCwzNyBAQAogICAgICAgICBjLT5zaW5nbGVfZmlsZSA9IDE7CiAgICAgaWYgKGMtPnNpbmdsZV9maWxlKQogICAgICAgICBjLT51c2VfdGVtcGxhdGUgPSAwOwotICAgIGMtPmFtYmlndW91c19mcmFtZV9yYXRlID0gMDsKIAotICAgIGF2X3N0cmxjcHkoYy0+ZGlybmFtZSwgcy0+ZmlsZW5hbWUsIHNpemVvZihjLT5kaXJuYW1lKSk7CisgICAgYXZfc3RybGNweShjLT5kaXJuYW1lLCBzLT51cmwsIHNpemVvZihjLT5kaXJuYW1lKSk7CiAgICAgcHRyID0gc3RycmNocihjLT5kaXJuYW1lLCAnLycpOwogICAgIGlmIChwdHIpIHsKICAgICAgICAgYXZfc3RybGNweShiYXNlbmFtZSwgJnB0clsxXSwgc2l6ZW9mKGJhc2VuYW1lKSk7CiAgICAgICAgIHB0clsxXSA9ICdcMCc7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYy0+ZGlybmFtZVswXSA9ICdcMCc7Ci0gICAgICAgIGF2X3N0cmxjcHkoYmFzZW5hbWUsIHMtPmZpbGVuYW1lLCBzaXplb2YoYmFzZW5hbWUpKTsKKyAgICAgICAgYXZfc3RybGNweShiYXNlbmFtZSwgcy0+dXJsLCBzaXplb2YoYmFzZW5hbWUpKTsKICAgICB9CiAKICAgICBwdHIgPSBzdHJyY2hyKGJhc2VuYW1lLCAnLicpOwogICAgIGlmIChwdHIpCiAgICAgICAgICpwdHIgPSAnXDAnOwogCi0gICAgb2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdCgibXA0IiwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKCFvZm9ybWF0KSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCiAgICAgYy0+c3RyZWFtcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjLT5zdHJlYW1zKSAqIHMtPm5iX3N0cmVhbXMpOwotICAgIGlmICghYy0+c3RyZWFtcykgewotICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9CisgICAgaWYgKCFjLT5zdHJlYW1zKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKChyZXQgPSBwYXJzZV9hZGFwdGF0aW9uX3NldHMocykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICBBZGFwdGF0aW9uU2V0ICphcyA9ICZjLT5hc1tvcy0+YXNfaWR4IC0gMV07CiAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqY3R4OwogICAgICAgICBBVlN0cmVhbSAqc3Q7CiAgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CiAgICAgICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07CiAKLSAgICAgICAgb3MtPmJpdF9yYXRlID0gcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmJpdF9yYXRlID8KLSAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmJpdF9yYXRlIDoKLSAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPnJjX21heF9yYXRlOworICAgICAgICBvcy0+Yml0X3JhdGUgPSBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Yml0X3JhdGU7CiAgICAgICAgIGlmIChvcy0+Yml0X3JhdGUpIHsKICAgICAgICAgICAgIHNucHJpbnRmKG9zLT5iYW5kd2lkdGhfc3RyLCBzaXplb2Yob3MtPmJhbmR3aWR0aF9zdHIpLAogICAgICAgICAgICAgICAgICAgICAgIiBiYW5kd2lkdGg9XCIlZFwiIiwgb3MtPmJpdF9yYXRlKTsKQEAgLTYwOSw1NyArOTA4LDgwIEBACiAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPj0gRkZfQ09NUExJQU5DRV9TVFJJQ1QgPwogICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SIDogQVZfTE9HX1dBUk5JTkc7CiAgICAgICAgICAgICBhdl9sb2cocywgbGV2ZWwsICJObyBiaXQgcmF0ZSBzZXQgZm9yIHN0cmVhbSAlZFxuIiwgaSk7Ci0gICAgICAgICAgICBpZiAocy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID49IEZGX0NPTVBMSUFOQ0VfU1RSSUNUKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPj0gRkZfQ09NUExJQU5DRV9TVFJJQ1QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQogCisgICAgICAgIC8vIGNvcHkgQWRhcHRhdGlvblNldCBsYW5ndWFnZSBhbmQgcm9sZSBmcm9tIHN0cmVhbSBtZXRhZGF0YQorICAgICAgICBkaWN0X2NvcHlfZW50cnkoJmFzLT5tZXRhZGF0YSwgcy0+c3RyZWFtc1tpXS0+bWV0YWRhdGEsICJsYW5ndWFnZSIpOworICAgICAgICBkaWN0X2NvcHlfZW50cnkoJmFzLT5tZXRhZGF0YSwgcy0+c3RyZWFtc1tpXS0+bWV0YWRhdGEsICJyb2xlIik7CisKICAgICAgICAgY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOwotICAgICAgICBpZiAoIWN0eCkgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoIWN0eCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgLy8gY2hvb3NlIG11eGVyIGJhc2VkIG9uIGNvZGVjOiB3ZWJtIGZvciBWUDgvOSBhbmQgb3B1cywgbXA0IG90aGVyd2lzZQorICAgICAgICAvLyBub3RlOiBvcy0+Zm9ybWF0X25hbWUgaXMgYWxzbyB1c2VkIGFzIHBhcnQgb2YgdGhlIG1pbWV0eXBlIG9mIHRoZQorICAgICAgICAvLyAgICAgICByZXByZXNlbnRhdGlvbiwgZS5nLiB2aWRlby88Zm9ybWF0X25hbWU+CisgICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4IHx8CisgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA5IHx8CisgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUyB8fAorICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZPUkJJUykgeworICAgICAgICAgICAgc25wcmludGYob3MtPmZvcm1hdF9uYW1lLCBzaXplb2Yob3MtPmZvcm1hdF9uYW1lKSwgIndlYm0iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKG9zLT5mb3JtYXRfbmFtZSwgc2l6ZW9mKG9zLT5mb3JtYXRfbmFtZSksICJtcDQiKTsKICAgICAgICAgfQorICAgICAgICBjdHgtPm9mb3JtYXQgPSBhdl9ndWVzc19mb3JtYXQob3MtPmZvcm1hdF9uYW1lLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFjdHgtPm9mb3JtYXQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9NVVhFUl9OT1RfRk9VTkQ7CiAgICAgICAgIG9zLT5jdHggPSBjdHg7Ci0gICAgICAgIGN0eC0+b2Zvcm1hdCA9IG9mb3JtYXQ7CiAgICAgICAgIGN0eC0+aW50ZXJydXB0X2NhbGxiYWNrID0gcy0+aW50ZXJydXB0X2NhbGxiYWNrOwogICAgICAgICBjdHgtPm9wYXF1ZSAgICAgICAgICAgICA9IHMtPm9wYXF1ZTsKICAgICAgICAgY3R4LT5pb19jbG9zZSAgICAgICAgICAgPSBzLT5pb19jbG9zZTsKICAgICAgICAgY3R4LT5pb19vcGVuICAgICAgICAgICAgPSBzLT5pb19vcGVuOwogCi0gICAgICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIE5VTEwpKSkgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIGF2Y29kZWNfY29weV9jb250ZXh0KHN0LT5jb2RlYywgcy0+c3RyZWFtc1tpXS0+Y29kZWMpOworICAgICAgICBpZiAoIShzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oY3R4LCBOVUxMKSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShzdC0+Y29kZWNwYXIsIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyKTsKICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzLT5zdHJlYW1zW2ldLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwogICAgICAgICBzdC0+dGltZV9iYXNlID0gcy0+c3RyZWFtc1tpXS0+dGltZV9iYXNlOworICAgICAgICBzdC0+YXZnX2ZyYW1lX3JhdGUgPSBzLT5zdHJlYW1zW2ldLT5hdmdfZnJhbWVfcmF0ZTsKICAgICAgICAgY3R4LT5hdm9pZF9uZWdhdGl2ZV90cyA9IHMtPmF2b2lkX25lZ2F0aXZlX3RzOworICAgICAgICBjdHgtPmZsYWdzID0gcy0+ZmxhZ3M7CiAKLSAgICAgICAgY3R4LT5wYiA9IGF2aW9fYWxsb2NfY29udGV4dChvcy0+aW9idWYsIHNpemVvZihvcy0+aW9idWYpLCBBVklPX0ZMQUdfV1JJVEUsIG9zLCBOVUxMLCBkYXNoX3dyaXRlLCBOVUxMKTsKLSAgICAgICAgaWYgKCFjdHgtPnBiKSB7Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKChyZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmY3R4LT5wYikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAgICAgaWYgKGMtPnNpbmdsZV9maWxlKSB7CiAgICAgICAgICAgICBpZiAoYy0+c2luZ2xlX2ZpbGVfbmFtZSkKLSAgICAgICAgICAgICAgICBkYXNoX2ZpbGxfdG1wbF9wYXJhbXMob3MtPmluaXRmaWxlLCBzaXplb2Yob3MtPmluaXRmaWxlKSwgYy0+c2luZ2xlX2ZpbGVfbmFtZSwgaSwgMCwgb3MtPmJpdF9yYXRlLCAwKTsKKyAgICAgICAgICAgICAgICBmZl9kYXNoX2ZpbGxfdG1wbF9wYXJhbXMob3MtPmluaXRmaWxlLCBzaXplb2Yob3MtPmluaXRmaWxlKSwgYy0+c2luZ2xlX2ZpbGVfbmFtZSwgaSwgMCwgb3MtPmJpdF9yYXRlLCAwKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBzbnByaW50Zihvcy0+aW5pdGZpbGUsIHNpemVvZihvcy0+aW5pdGZpbGUpLCAiJXMtc3RyZWFtJWQubTRzIiwgYmFzZW5hbWUsIGkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGFzaF9maWxsX3RtcGxfcGFyYW1zKG9zLT5pbml0ZmlsZSwgc2l6ZW9mKG9zLT5pbml0ZmlsZSksIGMtPmluaXRfc2VnX25hbWUsIGksIDAsIG9zLT5iaXRfcmF0ZSwgMCk7CisgICAgICAgICAgICBmZl9kYXNoX2ZpbGxfdG1wbF9wYXJhbXMob3MtPmluaXRmaWxlLCBzaXplb2Yob3MtPmluaXRmaWxlKSwgYy0+aW5pdF9zZWdfbmFtZSwgaSwgMCwgb3MtPmJpdF9yYXRlLCAwKTsKICAgICAgICAgfQogICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzJXMiLCBjLT5kaXJuYW1lLCBvcy0+aW5pdGZpbGUpOwotICAgICAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmb3MtPm91dCwgZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwgcy0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgc2V0X2h0dHBfb3B0aW9ucygmb3B0cywgYyk7CisgICAgICAgIHJldCA9IHMtPmlvX29wZW4ocywgJm9zLT5vdXQsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZvcHRzKTsKICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwogICAgICAgICBvcy0+aW5pdF9zdGFydF9wb3MgPSAwOwogCi0gICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19jdXN0b20rZGFzaCtkZWxheV9tb292IiwgMCk7Ci0gICAgICAgIGlmICgocmV0ID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKGN0eCwgJm9wdHMpKSA8IDApIHsKLSAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGlmICghc3RyY21wKG9zLT5mb3JtYXRfbmFtZSwgIm1wNCIpKSB7CisgICAgICAgICAgICBpZiAoYy0+c3RyZWFtaW5nKQorICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19ldmVyeV9mcmFtZStkYXNoK2RlbGF5X21vb3YiLCAwKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2Rhc2grZGVsYXlfbW9vdiIsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvcHRzLCAiY2x1c3Rlcl90aW1lX2xpbWl0IiwgYy0+bWluX3NlZ19kdXJhdGlvbiAvIDEwMDAsIDApOworICAgICAgICAgICAgYXZfZGljdF9zZXRfaW50KCZvcHRzLCAiY2x1c3Rlcl9zaXplX2xpbWl0IiwgNSAqIDEwMjQgKiAxMDI0LCAwKTsgLy8gc2V0IGEgbGFyZ2UgY2x1c3RlciBzaXplIGxpbWl0CisgICAgICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm9wdHMsICJkYXNoIiwgMSwgMCk7CisgICAgICAgICAgICBhdl9kaWN0X3NldF9pbnQoJm9wdHMsICJkYXNoX3RyYWNrX251bWJlciIsIGkgKyAxLCAwKTsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmb3B0cywgImxpdmUiLCAxLCAwKTsKICAgICAgICAgfQorICAgICAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X2luaXRfb3V0cHV0KGN0eCwgJm9wdHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBvcy0+Y3R4X2luaXRlZCA9IDE7CiAgICAgICAgIGF2aW9fZmx1c2goY3R4LT5wYik7CiAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CkBAIC02NzEsMjIgKzk5MywyMCBAQAogICAgICAgICAvLyBhbHJlYWR5IGJlZm9yZSBiZWluZyBoYW5kZWQgdG8gdGhpcyBtdXhlciwgc28gd2UgZG9uJ3QgaGF2ZSBtaXNtYXRjaGVzCiAgICAgICAgIC8vIGJldHdlZW4gdGhlIE1QRCBhbmQgdGhlIGFjdHVhbCBzZWdtZW50cy4KICAgICAgICAgcy0+YXZvaWRfbmVnYXRpdmVfdHMgPSBjdHgtPmF2b2lkX25lZ2F0aXZlX3RzOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewogICAgICAgICAgICAgQVZSYXRpb25hbCBhdmdfZnJhbWVfcmF0ZSA9IHMtPnN0cmVhbXNbaV0tPmF2Z19mcmFtZV9yYXRlOwogICAgICAgICAgICAgaWYgKGF2Z19mcmFtZV9yYXRlLm51bSA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZfY21wX3EoYXZnX2ZyYW1lX3JhdGUsIGMtPm1pbl9mcmFtZV9yYXRlKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIGMtPm1pbl9mcmFtZV9yYXRlID0gYXZnX2ZyYW1lX3JhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKGF2X2NtcF9xKGMtPm1heF9mcmFtZV9yYXRlLCBhdmdfZnJhbWVfcmF0ZSkgPCAwKQotICAgICAgICAgICAgICAgICAgICBjLT5tYXhfZnJhbWVfcmF0ZSA9IGF2Z19mcmFtZV9yYXRlOworICAgICAgICAgICAgICAgIGlmIChhdl9jbXBfcShhdmdfZnJhbWVfcmF0ZSwgYXMtPm1pbl9mcmFtZV9yYXRlKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGFzLT5taW5fZnJhbWVfcmF0ZSA9IGF2Z19mcmFtZV9yYXRlOworICAgICAgICAgICAgICAgIGlmIChhdl9jbXBfcShhcy0+bWF4X2ZyYW1lX3JhdGUsIGF2Z19mcmFtZV9yYXRlKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGFzLT5tYXhfZnJhbWVfcmF0ZSA9IGF2Z19mcmFtZV9yYXRlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjLT5hbWJpZ3VvdXNfZnJhbWVfcmF0ZSA9IDE7CisgICAgICAgICAgICAgICAgYXMtPmFtYmlndW91c19mcmFtZV9yYXRlID0gMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGMtPmhhc192aWRlbyA9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICAgICAgYy0+aGFzX2F1ZGlvID0gMTsKICAgICAgICAgfQogCi0gICAgICAgIHNldF9jb2RlY19zdHIocywgc3QtPmNvZGVjLCBvcy0+Y29kZWNfc3RyLCBzaXplb2Yob3MtPmNvZGVjX3N0cikpOworICAgICAgICBzZXRfY29kZWNfc3RyKHMsIHN0LT5jb2RlY3Bhciwgb3MtPmNvZGVjX3N0ciwgc2l6ZW9mKG9zLT5jb2RlY19zdHIpKTsKICAgICAgICAgb3MtPmZpcnN0X3B0cyA9IEFWX05PUFRTX1ZBTFVFOwogICAgICAgICBvcy0+bWF4X3B0cyA9IEFWX05PUFRTX1ZBTFVFOwogICAgICAgICBvcy0+bGFzdF9kdHMgPSBBVl9OT1BUU19WQUxVRTsKQEAgLTY5NSwxNSArMTAxNSwyOSBAQAogCiAgICAgaWYgKCFjLT5oYXNfdmlkZW8gJiYgYy0+bWluX3NlZ19kdXJhdGlvbiA8PSAwKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIm5vIHZpZGVvIHN0cmVhbSBhbmQgbm8gbWluIHNlZyBkdXJhdGlvbiBzZXRcbiIpOwotICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRhc2hfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgcmV0OworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihvcy0+Y3R4LCBOVUxMKSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgLy8gRmx1c2ggaW5pdCBzZWdtZW50CisgICAgICAgIC8vIE9ubHkgZm9yIFdlYk0gc2VnbWVudCwgc2luY2UgZm9yIG1wNCBkZWxheV9tb292IGlzIHNldCBhbmQKKyAgICAgICAgLy8gdGhlIGluaXQgc2VnbWVudCBpcyB0aHVzIGZsdXNoZWQgYWZ0ZXIgdGhlIGZpcnN0IHBhY2tldHMuCisgICAgICAgIGlmIChzdHJjbXAob3MtPmZvcm1hdF9uYW1lLCAibXA0IikgJiYKKyAgICAgICAgICAgIChyZXQgPSBmbHVzaF9pbml0X3NlZ21lbnQocywgb3MpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICByZXQgPSB3cml0ZV9tYW5pZmVzdChzLCAwKTsKICAgICBpZiAoIXJldCkKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiTWFuaWZlc3Qgd3JpdHRlbiB0bzogJXNcbiIsIHMtPmZpbGVuYW1lKTsKLQotZmFpbDoKLSAgICBpZiAocmV0KQotICAgICAgICBkYXNoX2ZyZWUocyk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIk1hbmlmZXN0IHdyaXR0ZW4gdG86ICVzXG4iLCBzLT51cmwpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTc1NSwxOCArMTA4OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcywgaW50ICppbmRleF9sZW5ndGgpCiB7CiAgICAgdWludDhfdCBidWZbOF07Ci0gICAgVVJMQ29udGV4dCAqZmQ7CisgICAgQVZJT0NvbnRleHQgKnBiOwogICAgIGludCByZXQ7CiAKLSAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmZmQsIGZ1bGxfcGF0aCwgQVZJT19GTEFHX1JFQUQsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsIHMtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgcmV0ID0gcy0+aW9fb3BlbihzLCAmcGIsIGZ1bGxfcGF0aCwgQVZJT19GTEFHX1JFQUQsIE5VTEwpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm47Ci0gICAgaWYgKGZmdXJsX3NlZWsoZmQsIHBvcywgU0VFS19TRVQpICE9IHBvcykgewotICAgICAgICBmZnVybF9jbG9zZShmZCk7CisgICAgaWYgKGF2aW9fc2VlayhwYiwgcG9zLCBTRUVLX1NFVCkgIT0gcG9zKSB7CisgICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShzLCAmcGIpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHJldCA9IGZmdXJsX3JlYWQoZmQsIGJ1ZiwgOCk7Ci0gICAgZmZ1cmxfY2xvc2UoZmQpOworICAgIHJldCA9IGF2aW9fcmVhZChwYiwgYnVmLCA4KTsKKyAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJnBiKTsKICAgICBpZiAocmV0IDwgOCkKICAgICAgICAgcmV0dXJuOwogICAgIGlmIChBVl9STDMyKCZidWZbNF0pICE9IE1LVEFHKCdzJywgJ2knLCAnZCcsICd4JykpCkBAIC03NzUsNDAgKzExMDksNjUgQEAKIH0KIAogc3RhdGljIGludCB1cGRhdGVfc3RyZWFtX2V4dHJhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIE91dHB1dFN0cmVhbSAqb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcikKIHsKICAgICB1aW50OF90ICpleHRyYWRhdGE7CiAKLSAgICBpZiAob3MtPmN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIHx8ICFjb2RlYy0+ZXh0cmFkYXRhX3NpemUpCisgICAgaWYgKG9zLT5jdHgtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSB8fCAhcGFyLT5leHRyYWRhdGFfc2l6ZSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBleHRyYWRhdGEgPSBhdl9tYWxsb2MoY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICBleHRyYWRhdGEgPSBhdl9tYWxsb2MocGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAKICAgICBpZiAoIWV4dHJhZGF0YSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIG1lbWNweShleHRyYWRhdGEsIGNvZGVjLT5leHRyYWRhdGEsIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgbWVtY3B5KGV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGEsIHBhci0+ZXh0cmFkYXRhX3NpemUpOwogCi0gICAgb3MtPmN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPmV4dHJhZGF0YSA9IGV4dHJhZGF0YTsKLSAgICBvcy0+Y3R4LT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBjb2RlYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgb3MtPmN0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmV4dHJhZGF0YSA9IGV4dHJhZGF0YTsKKyAgICBvcy0+Y3R4LT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSBwYXItPmV4dHJhZGF0YV9zaXplOwogCi0gICAgc2V0X2NvZGVjX3N0cihzLCBjb2RlYywgb3MtPmNvZGVjX3N0ciwgc2l6ZW9mKG9zLT5jb2RlY19zdHIpKTsKKyAgICBzZXRfY29kZWNfc3RyKHMsIHBhciwgb3MtPmNvZGVjX3N0ciwgc2l6ZW9mKG9zLT5jb2RlY19zdHIpKTsKIAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBkYXNoZW5jX2RlbGV0ZV9maWxlKEFWRm9ybWF0Q29udGV4dCAqcywgY2hhciAqZmlsZW5hbWUpIHsKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaHR0cF9iYXNlX3Byb3RvID0gZmZfaXNfaHR0cF9wcm90byhmaWxlbmFtZSk7CisKKyAgICBpZiAoaHR0cF9iYXNlX3Byb3RvKSB7CisgICAgICAgIEFWSU9Db250ZXh0ICpvdXQgPSBOVUxMOworICAgICAgICBBVkRpY3Rpb25hcnkgKmh0dHBfb3B0cyA9IE5VTEw7CisKKyAgICAgICAgc2V0X2h0dHBfb3B0aW9ucygmaHR0cF9vcHRzLCBjKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJmh0dHBfb3B0cywgIm1ldGhvZCIsICJERUxFVEUiLCAwKTsKKworICAgICAgICBpZiAoZGFzaGVuY19pb19vcGVuKHMsICZvdXQsIGZpbGVuYW1lLCAmaHR0cF9vcHRzKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gZGVsZXRlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBhdl9kaWN0X2ZyZWUoJmh0dHBfb3B0cyk7CisgICAgICAgIGRhc2hlbmNfaW9fY2xvc2UocywgJm91dCwgZmlsZW5hbWUpOworICAgIH0gZWxzZSBpZiAodW5saW5rKGZpbGVuYW1lKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImZhaWxlZCB0byBkZWxldGUgJXM6ICVzXG4iLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICB9Cit9CisKIHN0YXRpYyBpbnQgZGFzaF9mbHVzaChBVkZvcm1hdENvbnRleHQgKnMsIGludCBmaW5hbCwgaW50IHN0cmVhbSkKIHsKICAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKICAgICBpbnQgaSwgcmV0ID0gMDsKKworICAgIGNvbnN0IGNoYXIgKnByb3RvID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUocy0+dXJsKTsKKyAgICBpbnQgdXNlX3JlbmFtZSA9IHByb3RvICYmICFzdHJjbXAocHJvdG8sICJmaWxlIik7CisKICAgICBpbnQgY3VyX2ZsdXNoX3NlZ21lbnRfaW5kZXggPSAwOwogICAgIGlmIChzdHJlYW0gPj0gMCkKICAgICAgICAgY3VyX2ZsdXNoX3NlZ21lbnRfaW5kZXggPSBjLT5zdHJlYW1zW3N0cmVhbV0uc2VnbWVudF9pbmRleDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOwotICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdID0gIiIsIGZ1bGxfcGF0aFsxMDI0XSwgdGVtcF9wYXRoWzEwMjRdOwotICAgICAgICBpbnQ2NF90IHN0YXJ0X3BvczsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKICAgICAgICAgaW50IHJhbmdlX2xlbmd0aCwgaW5kZXhfbGVuZ3RoID0gMDsKIAogICAgICAgICBpZiAoIW9zLT5wYWNrZXRzX3dyaXR0ZW4pCkBAIC04MTgsNyArMTE3Nyw3IEBACiAgICAgICAgIC8vIEZsdXNoIGFsbCBhdWRpbyBzdHJlYW1zIGFzIHdlbGwsIGluIHN5bmMgd2l0aCB2aWRlbyBrZXlmcmFtZXMsCiAgICAgICAgIC8vIGJ1dCBub3QgdGhlIG90aGVyIHZpZGVvIHN0cmVhbXMuCiAgICAgICAgIGlmIChzdHJlYW0gPj0gMCAmJiBpICE9IHN0cmVhbSkgewotICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG9uJ3QgZmx1c2ggYXVkaW8gc3RyZWFtcyBtdWx0aXBsZSB0aW1lcywgd2hlbgogICAgICAgICAgICAgLy8gYWxsIHZpZGVvIHN0cmVhbXMgYXJlIGZsdXNoZWQgb25lIGF0IGEgdGltZS4KQEAgLTgyNiw0NSArMTE4NSw0NSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFvcy0+aW5pdF9yYW5nZV9sZW5ndGgpIHsKLSAgICAgICAgICAgIGF2X3dyaXRlX2ZyYW1lKG9zLT5jdHgsIE5VTEwpOwotICAgICAgICAgICAgb3MtPmluaXRfcmFuZ2VfbGVuZ3RoID0gYXZpb190ZWxsKG9zLT5jdHgtPnBiKTsKLSAgICAgICAgICAgIGlmICghYy0+c2luZ2xlX2ZpbGUpIHsKLSAgICAgICAgICAgICAgICBmZnVybF9jbG9zZShvcy0+b3V0KTsKLSAgICAgICAgICAgICAgICBvcy0+b3V0ID0gTlVMTDsKKyAgICAgICAgaWYgKCFjLT5zaW5nbGVfZmlsZSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAob3MtPmZvcm1hdF9uYW1lLCAibXA0IikgJiYgIW9zLT53cml0dGVuX2xlbikKKyAgICAgICAgICAgICAgICB3cml0ZV9zdHlwKG9zLT5jdHgtPnBiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNucHJpbnRmKG9zLT5mdWxsX3BhdGgsIHNpemVvZihvcy0+ZnVsbF9wYXRoKSwgIiVzJXMiLCBjLT5kaXJuYW1lLCBvcy0+aW5pdGZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gZmx1c2hfZHluYnVmKG9zLCAmcmFuZ2VfbGVuZ3RoKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgb3MtPnBhY2tldHNfd3JpdHRlbiA9IDA7CisKKyAgICAgICAgaWYgKGMtPnNpbmdsZV9maWxlKSB7CisgICAgICAgICAgICBmaW5kX2luZGV4X3JhbmdlKHMsIG9zLT5mdWxsX3BhdGgsIG9zLT5wb3MsICZpbmRleF9sZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGFzaGVuY19pb19jbG9zZShzLCAmb3MtPm91dCwgb3MtPnRlbXBfcGF0aCk7CisKKyAgICAgICAgICAgIGlmICh1c2VfcmVuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZwcml2X2lvX21vdmUob3MtPnRlbXBfcGF0aCwgb3MtPmZ1bGxfcGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgc3RhcnRfcG9zID0gYXZpb190ZWxsKG9zLT5jdHgtPnBiKTsKLQotICAgICAgICBpZiAoIWMtPnNpbmdsZV9maWxlKSB7Ci0gICAgICAgICAgICBkYXNoX2ZpbGxfdG1wbF9wYXJhbXMoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIGMtPm1lZGlhX3NlZ19uYW1lLCBpLCBvcy0+c2VnbWVudF9pbmRleCwgb3MtPmJpdF9yYXRlLCBvcy0+c3RhcnRfcHRzKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGZ1bGxfcGF0aCwgc2l6ZW9mKGZ1bGxfcGF0aCksICIlcyVzIiwgYy0+ZGlybmFtZSwgZmlsZW5hbWUpOwotICAgICAgICAgICAgc25wcmludGYodGVtcF9wYXRoLCBzaXplb2YodGVtcF9wYXRoKSwgIiVzLnRtcCIsIGZ1bGxfcGF0aCk7Ci0gICAgICAgICAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmb3MtPm91dCwgdGVtcF9wYXRoLCBBVklPX0ZMQUdfV1JJVEUsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsIHMtPnByb3RvY29sX3doaXRlbGlzdCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHdyaXRlX3N0eXAob3MtPmN0eC0+cGIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoZnVsbF9wYXRoLCBzaXplb2YoZnVsbF9wYXRoKSwgIiVzJXMiLCBjLT5kaXJuYW1lLCBvcy0+aW5pdGZpbGUpOworICAgICAgICBpZiAoIW9zLT5iaXRfcmF0ZSkgeworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGF2ZXJhZ2UgYml0cmF0ZSBvZiBmaXJzdCBzZWdtZW50CisgICAgICAgICAgICBpbnQ2NF90IGJpdHJhdGUgPSAoaW50NjRfdCkgcmFuZ2VfbGVuZ3RoICogOCAqIEFWX1RJTUVfQkFTRSAvIGF2X3Jlc2NhbGVfcShvcy0+bWF4X3B0cyAtIG9zLT5zdGFydF9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworICAgICAgICAgICAgaWYgKGJpdHJhdGUgPj0gMCkgeworICAgICAgICAgICAgICAgIG9zLT5iaXRfcmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICAgICAgc25wcmludGYob3MtPmJhbmR3aWR0aF9zdHIsIHNpemVvZihvcy0+YmFuZHdpZHRoX3N0ciksCisgICAgICAgICAgICAgICAgICAgICAiIGJhbmR3aWR0aD1cIiVkXCIiLCBvcy0+Yml0X3JhdGUpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGFkZF9zZWdtZW50KG9zLCBvcy0+ZmlsZW5hbWUsIG9zLT5zdGFydF9wdHMsIG9zLT5tYXhfcHRzIC0gb3MtPnN0YXJ0X3B0cywgb3MtPnBvcywgcmFuZ2VfbGVuZ3RoLCBpbmRleF9sZW5ndGgpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJSZXByZXNlbnRhdGlvbiAlZCBtZWRpYSBzZWdtZW50ICVkIHdyaXR0ZW4gdG86ICVzXG4iLCBpLCBvcy0+c2VnbWVudF9pbmRleCwgb3MtPmZ1bGxfcGF0aCk7CiAKLSAgICAgICAgYXZfd3JpdGVfZnJhbWUob3MtPmN0eCwgTlVMTCk7Ci0gICAgICAgIGF2aW9fZmx1c2gob3MtPmN0eC0+cGIpOwotICAgICAgICBvcy0+cGFja2V0c193cml0dGVuID0gMDsKLQotICAgICAgICByYW5nZV9sZW5ndGggPSBhdmlvX3RlbGwob3MtPmN0eC0+cGIpIC0gc3RhcnRfcG9zOwotICAgICAgICBpZiAoYy0+c2luZ2xlX2ZpbGUpIHsKLSAgICAgICAgICAgIGZpbmRfaW5kZXhfcmFuZ2UocywgZnVsbF9wYXRoLCBzdGFydF9wb3MsICZpbmRleF9sZW5ndGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmZ1cmxfY2xvc2Uob3MtPm91dCk7Ci0gICAgICAgICAgICBvcy0+b3V0ID0gTlVMTDsKLSAgICAgICAgICAgIHJldCA9IGZmX3JlbmFtZSh0ZW1wX3BhdGgsIGZ1bGxfcGF0aCwgcyk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBhZGRfc2VnbWVudChvcywgZmlsZW5hbWUsIG9zLT5zdGFydF9wdHMsIG9zLT5tYXhfcHRzIC0gb3MtPnN0YXJ0X3B0cywgc3RhcnRfcG9zLCByYW5nZV9sZW5ndGgsIGluZGV4X2xlbmd0aCk7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIlJlcHJlc2VudGF0aW9uICVkIG1lZGlhIHNlZ21lbnQgJWQgd3JpdHRlbiB0bzogJXNcbiIsIGksIG9zLT5zZWdtZW50X2luZGV4LCBmdWxsX3BhdGgpOworICAgICAgICBvcy0+cG9zICs9IHJhbmdlX2xlbmd0aDsKICAgICB9CiAKICAgICBpZiAoYy0+d2luZG93X3NpemUgfHwgKGZpbmFsICYmIGMtPnJlbW92ZV9hdF9leGl0KSkgewpAQCAtODc4LDcgKzEyMzcsNyBAQAogICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByZW1vdmU7IGorKykgewogICAgICAgICAgICAgICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOwogICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzJXMiLCBjLT5kaXJuYW1lLCBvcy0+c2VnbWVudHNbal0tPmZpbGUpOwotICAgICAgICAgICAgICAgICAgICB1bmxpbmsoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICAgICBkYXNoZW5jX2RlbGV0ZV9maWxlKHMsIGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShvcy0+c2VnbWVudHNbal0pOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBvcy0+bmJfc2VnbWVudHMgLT0gcmVtb3ZlOwpAQCAtODk3LDEwICsxMjU2LDkgQEAKICAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOwotICAgIGludDY0X3Qgc2VnX2VuZF9kdXJhdGlvbiA9IChvcy0+c2VnbWVudF9pbmRleCkgKiAoaW50NjRfdCkgYy0+bWluX3NlZ19kdXJhdGlvbjsKICAgICBpbnQgcmV0OwogCi0gICAgcmV0ID0gdXBkYXRlX3N0cmVhbV9leHRyYWRhdGEocywgb3MsIHN0LT5jb2RlYyk7CisgICAgcmV0ID0gdXBkYXRlX3N0cmVhbV9leHRyYWRhdGEocywgb3MsIHN0LT5jb2RlY3Bhcik7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTkyNSwxMCArMTI4MywxMCBAQAogICAgIGlmIChvcy0+Zmlyc3RfcHRzID09IEFWX05PUFRTX1ZBTFVFKQogICAgICAgICBvcy0+Zmlyc3RfcHRzID0gcGt0LT5wdHM7CiAKLSAgICBpZiAoKCFjLT5oYXNfdmlkZW8gfHwgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgJiYKKyAgICBpZiAoKCFjLT5oYXNfdmlkZW8gfHwgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgJiYKICAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSAmJiBvcy0+cGFja2V0c193cml0dGVuICYmCi0gICAgICAgIGF2X2NvbXBhcmVfdHMocGt0LT5wdHMgLSBvcy0+Zmlyc3RfcHRzLCBzdC0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgIHNlZ19lbmRfZHVyYXRpb24sIEFWX1RJTUVfQkFTRV9RKSA+PSAwKSB7CisgICAgICAgIGF2X2NvbXBhcmVfdHMocGt0LT5wdHMgLSBvcy0+c3RhcnRfcHRzLCBzdC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgIGMtPm1pbl9zZWdfZHVyYXRpb24sIEFWX1RJTUVfQkFTRV9RKSA+PSAwKSB7CiAgICAgICAgIGludDY0X3QgcHJldl9kdXJhdGlvbiA9IGMtPmxhc3RfZHVyYXRpb247CiAKICAgICAgICAgYy0+bGFzdF9kdXJhdGlvbiA9IGF2X3Jlc2NhbGVfcShwa3QtPnB0cyAtIG9zLT5zdGFydF9wdHMsCkBAIC05NjUsNyArMTMyMyw0NiBAQAogICAgIGVsc2UKICAgICAgICAgb3MtPm1heF9wdHMgPSBGRk1BWChvcy0+bWF4X3B0cywgcGt0LT5wdHMgKyBwa3QtPmR1cmF0aW9uKTsKICAgICBvcy0+cGFja2V0c193cml0dGVuKys7Ci0gICAgcmV0dXJuIGZmX3dyaXRlX2NoYWluZWQob3MtPmN0eCwgMCwgcGt0LCBzLCAwKTsKKyAgICBpZiAoKHJldCA9IGZmX3dyaXRlX2NoYWluZWQob3MtPmN0eCwgMCwgcGt0LCBzLCAwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFvcy0+aW5pdF9yYW5nZV9sZW5ndGgpCisgICAgICAgIGZsdXNoX2luaXRfc2VnbWVudChzLCBvcyk7CisKKyAgICAvL29wZW4gdGhlIG91dHB1dCBjb250ZXh0IHdoZW4gdGhlIGZpcnN0IGZyYW1lIG9mIGEgc2VnbWVudCBpcyByZWFkeQorICAgIGlmICghYy0+c2luZ2xlX2ZpbGUgJiYgb3MtPnBhY2tldHNfd3JpdHRlbiA9PSAxKSB7CisgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CisgICAgICAgIGNvbnN0IGNoYXIgKnByb3RvID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUocy0+dXJsKTsKKyAgICAgICAgaW50IHVzZV9yZW5hbWUgPSBwcm90byAmJiAhc3RyY21wKHByb3RvLCAiZmlsZSIpOworICAgICAgICBvcy0+ZmlsZW5hbWVbMF0gPSBvcy0+ZnVsbF9wYXRoWzBdID0gb3MtPnRlbXBfcGF0aFswXSA9ICdcMCc7CisgICAgICAgIGZmX2Rhc2hfZmlsbF90bXBsX3BhcmFtcyhvcy0+ZmlsZW5hbWUsIHNpemVvZihvcy0+ZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+bWVkaWFfc2VnX25hbWUsIHBrdC0+c3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MtPnNlZ21lbnRfaW5kZXgsIG9zLT5iaXRfcmF0ZSwgb3MtPnN0YXJ0X3B0cyk7CisgICAgICAgIHNucHJpbnRmKG9zLT5mdWxsX3BhdGgsIHNpemVvZihvcy0+ZnVsbF9wYXRoKSwgIiVzJXMiLCBjLT5kaXJuYW1lLAorICAgICAgICAgICAgICAgICBvcy0+ZmlsZW5hbWUpOworICAgICAgICBzbnByaW50Zihvcy0+dGVtcF9wYXRoLCBzaXplb2Yob3MtPnRlbXBfcGF0aCksCisgICAgICAgICAgICAgICAgIHVzZV9yZW5hbWUgPyAiJXMudG1wIiA6ICIlcyIsIG9zLT5mdWxsX3BhdGgpOworICAgICAgICBzZXRfaHR0cF9vcHRpb25zKCZvcHRzLCBjKTsKKyAgICAgICAgcmV0ID0gZGFzaGVuY19pb19vcGVuKHMsICZvcy0+b3V0LCBvcy0+dGVtcF9wYXRoLCAmb3B0cyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKKyAgICB9CisKKyAgICAvL3dyaXRlIG91dCB0aGUgZGF0YSBpbW1lZGlhdGVseSBpbiBzdHJlYW1pbmcgbW9kZQorICAgIGlmIChjLT5zdHJlYW1pbmcgJiYgIXN0cmNtcChvcy0+Zm9ybWF0X25hbWUsICJtcDQiKSkgeworICAgICAgICBpbnQgbGVuID0gMDsKKyAgICAgICAgdWludDhfdCAqYnVmID0gTlVMTDsKKyAgICAgICAgaWYgKCFvcy0+d3JpdHRlbl9sZW4pCisgICAgICAgICAgICB3cml0ZV9zdHlwKG9zLT5jdHgtPnBiKTsKKyAgICAgICAgYXZpb19mbHVzaChvcy0+Y3R4LT5wYik7CisgICAgICAgIGxlbiA9IGF2aW9fZ2V0X2R5bl9idWYgKG9zLT5jdHgtPnBiLCAmYnVmKTsKKyAgICAgICAgYXZpb193cml0ZShvcy0+b3V0LCBidWYgKyBvcy0+d3JpdHRlbl9sZW4sIGxlbiAtIG9zLT53cml0dGVuX2xlbik7CisgICAgICAgIG9zLT53cml0dGVuX2xlbiA9IGxlbjsKKyAgICAgICAgYXZpb19mbHVzaChvcy0+b3V0KTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGRhc2hfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCkBAIC05OTIsMjEgKzEzODksNDQgQEAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvcyA9ICZjLT5zdHJlYW1zW2ldOwogICAgICAgICAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcyVzIiwgYy0+ZGlybmFtZSwgb3MtPmluaXRmaWxlKTsKLSAgICAgICAgICAgIHVubGluayhmaWxlbmFtZSk7CisgICAgICAgICAgICBkYXNoZW5jX2RlbGV0ZV9maWxlKHMsIGZpbGVuYW1lKTsKICAgICAgICAgfQotICAgICAgICB1bmxpbmsocy0+ZmlsZW5hbWUpOworICAgICAgICBkYXNoZW5jX2RlbGV0ZV9maWxlKHMsIHMtPnVybCk7CiAgICAgfQogCi0gICAgZGFzaF9mcmVlKHMpOwogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRhc2hfY2hlY2tfYml0c3RyZWFtKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IEFWUGFja2V0ICphdnBrdCkKK3sKKyAgICBEQVNIQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbYXZwa3QtPnN0cmVhbV9pbmRleF07CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IG9zLT5jdHg7CisgICAgaWYgKG9jLT5vZm9ybWF0LT5jaGVja19iaXRzdHJlYW0pIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgQVZQYWNrZXQgcGt0ID0gKmF2cGt0OworICAgICAgICBwa3Quc3RyZWFtX2luZGV4ID0gMDsKKyAgICAgICAgcmV0ID0gb2MtPm9mb3JtYXQtPmNoZWNrX2JpdHN0cmVhbShvYywgJnBrdCk7CisgICAgICAgIGlmIChyZXQgPT0gMSkgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1thdnBrdC0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgIEFWU3RyZWFtICpvc3QgPSBvYy0+c3RyZWFtc1swXTsKKyAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+YnNmY3MgPSBvc3QtPmludGVybmFsLT5ic2ZjczsKKyAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+bmJfYnNmY3MgPSBvc3QtPmludGVybmFsLT5uYl9ic2ZjczsKKyAgICAgICAgICAgIG9zdC0+aW50ZXJuYWwtPmJzZmNzID0gTlVMTDsKKyAgICAgICAgICAgIG9zdC0+aW50ZXJuYWwtPm5iX2JzZmNzID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKwogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoREFTSENvbnRleHQsIHgpCiAjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CisgICAgeyAiYWRhcHRhdGlvbl9zZXRzIiwgIkFkYXB0YXRpb24gc2V0cy4gU3ludGF4OiBpZD0wLHN0cmVhbXM9MCwxLDIgaWQ9MSxzdHJlYW1zPTMsNCBhbmQgc28gb24iLCBPRkZTRVQoYWRhcHRhdGlvbl9zZXRzKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKICAgICB7ICJ3aW5kb3dfc2l6ZSIsICJudW1iZXIgb2Ygc2VnbWVudHMga2VwdCBpbiB0aGUgbWFuaWZlc3QiLCBPRkZTRVQod2luZG93X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgSU5UX01BWCwgRSB9LAogICAgIHsgImV4dHJhX3dpbmRvd19zaXplIiwgIm51bWJlciBvZiBzZWdtZW50cyBrZXB0IG91dHNpZGUgb2YgdGhlIG1hbmlmZXN0IGJlZm9yZSByZW1vdmluZyBmcm9tIGRpc2siLCBPRkZTRVQoZXh0cmFfd2luZG93X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDUgfSwgMCwgSU5UX01BWCwgRSB9LAotICAgIHsgIm1pbl9zZWdfZHVyYXRpb24iLCAibWluaW11bSBzZWdtZW50IGR1cmF0aW9uIChpbiBtaWNyb3NlY29uZHMpIiwgT0ZGU0VUKG1pbl9zZWdfZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gNTAwMDAwMCB9LCAwLCBJTlRfTUFYLCBFIH0sCisgICAgeyAibWluX3NlZ19kdXJhdGlvbiIsICJtaW5pbXVtIHNlZ21lbnQgZHVyYXRpb24gKGluIG1pY3Jvc2Vjb25kcykiLCBPRkZTRVQobWluX3NlZ19kdXJhdGlvbiksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gNTAwMDAwMCB9LCAwLCBJTlRfTUFYLCBFIH0sCiAgICAgeyAicmVtb3ZlX2F0X2V4aXQiLCAicmVtb3ZlIGFsbCBzZWdtZW50cyB3aGVuIGZpbmlzaGVkIiwgT0ZGU0VUKHJlbW92ZV9hdF9leGl0KSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCiAgICAgeyAidXNlX3RlbXBsYXRlIiwgIlVzZSBTZWdtZW50VGVtcGxhdGUgaW5zdGVhZCBvZiBTZWdtZW50TGlzdCIsIE9GRlNFVCh1c2VfdGVtcGxhdGUpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAxIH0sIDAsIDEsIEUgfSwKICAgICB7ICJ1c2VfdGltZWxpbmUiLCAiVXNlIFNlZ21lbnRUaW1lbGluZSBpbiBTZWdtZW50VGVtcGxhdGUiLCBPRkZTRVQodXNlX3RpbWVsaW5lKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBFIH0sCkBAIC0xMDE0LDYgKzE0MzQsMTMgQEAKICAgICB7ICJzaW5nbGVfZmlsZV9uYW1lIiwgIkRBU0gtdGVtcGxhdGVkIG5hbWUgdG8gYmUgdXNlZCBmb3IgYmFzZVVSTC4gSW1wbGllcyBzdG9yaW5nIGFsbCBzZWdtZW50cyBpbiBvbmUgZmlsZSwgYWNjZXNzZWQgdXNpbmcgYnl0ZSByYW5nZXMiLCBPRkZTRVQoc2luZ2xlX2ZpbGVfbmFtZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBFIH0sCiAgICAgeyAiaW5pdF9zZWdfbmFtZSIsICJEQVNILXRlbXBsYXRlZCBuYW1lIHRvIHVzZWQgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBzZWdtZW50IiwgT0ZGU0VUKGluaXRfc2VnX25hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gImluaXQtc3RyZWFtJFJlcHJlc2VudGF0aW9uSUQkLm00cyJ9LCAwLCAwLCBFIH0sCiAgICAgeyAibWVkaWFfc2VnX25hbWUiLCAiREFTSC10ZW1wbGF0ZWQgbmFtZSB0byB1c2VkIGZvciB0aGUgbWVkaWEgc2VnbWVudHMiLCBPRkZTRVQobWVkaWFfc2VnX25hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gImNodW5rLXN0cmVhbSRSZXByZXNlbnRhdGlvbklEJC0kTnVtYmVyJTA1ZCQubTRzIn0sIDAsIDAsIEUgfSwKKyAgICB7ICJ1dGNfdGltaW5nX3VybCIsICJVUkwgb2YgdGhlIHBhZ2UgdGhhdCB3aWxsIHJldHVybiB0aGUgVVRDIHRpbWVzdGFtcCBpbiBJU08gZm9ybWF0IiwgT0ZGU0VUKHV0Y190aW1pbmdfdXJsKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IDAgfSwgMCwgMCwgRSB9LAorICAgIHsgIm1ldGhvZCIsICJzZXQgdGhlIEhUVFAgbWV0aG9kIiwgT0ZGU0VUKG1ldGhvZCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgRSB9LAorICAgIHsgImh0dHBfdXNlcl9hZ2VudCIsICJvdmVycmlkZSBVc2VyLUFnZW50IGZpZWxkIGluIEhUVFAgaGVhZGVyIiwgT0ZGU0VUKHVzZXJfYWdlbnQpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEV9LAorICAgIHsgImh0dHBfcGVyc2lzdGVudCIsICJVc2UgcGVyc2lzdGVudCBIVFRQIGNvbm5lY3Rpb25zIiwgT0ZGU0VUKGh0dHBfcGVyc2lzdGVudCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCisgICAgeyAiaGxzX3BsYXlsaXN0IiwgIkdlbmVyYXRlIEhMUyBwbGF5bGlzdCBmaWxlcyhtYXN0ZXIubTN1OCwgbWVkaWFfJWQubTN1OCkiLCBPRkZTRVQoaGxzX3BsYXlsaXN0KSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCisgICAgeyAic3RyZWFtaW5nIiwgIkVuYWJsZS9EaXNhYmxlIHN0cmVhbWluZyBtb2RlIG9mIG91dHB1dC4gRWFjaCBmcmFtZSB3aWxsIGJlIG1vb2YgZnJhZ21lbnQiLCBPRkZTRVQoc3RyZWFtaW5nKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCisgICAgeyAidGltZW91dCIsICJzZXQgdGltZW91dCBmb3Igc29ja2V0IEkvTyBvcGVyYXRpb25zIiwgT0ZGU0VUKHRpbWVvdXQpLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIC5mbGFncyA9IEUgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKQEAgLTEwMjcsMTMgKzE0NTQsMTYgQEAKIEFWT3V0cHV0Rm9ybWF0IGZmX2Rhc2hfbXV4ZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImRhc2giLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJEQVNIIE11eGVyIiksCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm1wZCIsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKERBU0hDb250ZXh0KSwKICAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9BQUMsCiAgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfSDI2NCwKICAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9OT0ZJTEUgfCBBVkZNVF9UU19ORUdBVElWRSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBkYXNoX2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgID0gZGFzaF93cml0ZV9oZWFkZXIsCiAgICAgLndyaXRlX3BhY2tldCAgID0gZGFzaF93cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgID0gZGFzaF93cml0ZV90cmFpbGVyLAotICAgIC5jb2RlY190YWcgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGZmX21wNF9vYmpfdHlwZSwgMCB9LAorICAgIC5kZWluaXQgICAgICAgICA9IGRhc2hfZnJlZSwKKyAgICAuY2hlY2tfYml0c3RyZWFtID0gZGFzaF9jaGVja19iaXRzdHJlYW0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmRhc2hfY2xhc3MsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZGF0YV91cmkuYyBiL2xpYmF2Zm9ybWF0L2RhdGFfdXJpLmMKaW5kZXggMTU5OGI5OS4uMTg2MzgzMCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZGF0YV91cmkuYworKysgYi9saWJhdmZvcm1hdC9kYXRhX3VyaS5jCkBAIC0xMDksNyArMTA5LDcgQEAKICAgICByZXR1cm4gc2l6ZTsKIH0KIAotVVJMUHJvdG9jb2wgZmZfZGF0YV9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX2RhdGFfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImRhdGEiLAogICAgIC51cmxfb3BlbiAgICAgICA9IGRhdGFfb3BlbiwKICAgICAudXJsX2Nsb3NlICAgICAgPSBkYXRhX2Nsb3NlLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZGF1ZGRlYy5jIGIvbGliYXZmb3JtYXQvZGF1ZGRlYy5jCmluZGV4IGY2ZTc0OTEuLjY5MTk2YjAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2RhdWRkZWMuYworKysgYi9saWJhdmZvcm1hdC9kYXVkZGVjLmMKQEAgLTI2LDE1ICsyNiwxNSBAQAogICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMjREQVVEOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gTUtUQUcoJ2QnLCAnYScsICd1JywgJ2QnKTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gNjsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzVQT0lOVDE7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDk2MDAwOwotICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSAzICogNiAqIDk2MDAwICogODsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMyAqIDY7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMjREQVVEOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gTUtUQUcoJ2QnLCAnYScsICd1JywgJ2QnKTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gNjsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUXzVQT0lOVDE7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDk2MDAwOworICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSAzICogNiAqIDk2MDAwICogODsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMyAqIDY7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZGF1ZGVuYy5jIGIvbGliYXZmb3JtYXQvZGF1ZGVuYy5jCmluZGV4IDk5YjE4ZDMuLjE1YTVhZmQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2RhdWRlbmMuYworKysgYi9saWJhdmZvcm1hdC9kYXVkZW5jLmMKQEAgLTIzLDggKzIzLDggQEAKIAogc3RhdGljIGludCBkYXVkX3dyaXRlX2hlYWRlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOwotICAgIGlmIChjb2RlYy0+Y2hhbm5lbHMhPTYgfHwgY29kZWMtPnNhbXBsZV9yYXRlIT05NjAwMCkKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisgICAgaWYgKHBhci0+Y2hhbm5lbHMhPTYgfHwgcGFyLT5zYW1wbGVfcmF0ZSE9OTYwMDApCiAgICAgICAgIHJldHVybiAtMTsKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2Rjc3RyLmMgYi9saWJhdmZvcm1hdC9kY3N0ci5jCmluZGV4IDJhZTYxZGUuLjYwMzVkZDQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2Rjc3RyLmMKKysrIGIvbGliYXZmb3JtYXQvZGNzdHIuYwpAQCAtMzMsNDEgKzMzLDQ3IEBACiBzdGF0aWMgaW50IGRjc3RyX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICB1bnNpZ25lZCBjb2RlYywgYWxpZ247CisgICAgaW50IG11bHQ7CiAgICAgQVZTdHJlYW0gKnN0OwogCiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3JsMzIocy0+cGIpOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgY29kZWMgICAgICAgICAgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgYWxpZ24gICAgICAgICAgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKICAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgKj0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICBpZiAoIWFsaWduIHx8IGFsaWduID4gSU5UX01BWCAvIHN0LT5jb2RlYy0+Y2hhbm5lbHMpCisgICAgbXVsdCAgICAgICAgICAgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPD0gMCB8fCBtdWx0IDw9IDAgfHwgbXVsdCA+IElOVF9NQVggLyBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIG51bWJlciBvZiBjaGFubmVscyAlZCB4ICVkXG4iLCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzLCBtdWx0KTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IGFsaWduICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICB9CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqPSBtdWx0OworICAgIGlmICghYWxpZ24gfHwgYWxpZ24gPiBJTlRfTUFYIC8gc3QtPmNvZGVjcGFyLT5jaGFubmVscykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IGFsaWduICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKIAogICAgIHN3aXRjaCAoY29kZWMpIHsKLSAgICBjYXNlICA0OiBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fQUlDQTsgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNjogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRV9QTEFOQVI7IGJyZWFrOworICAgIGNhc2UgIDQ6IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9BSUNBOyAgICAgICBicmVhazsKKyAgICBjYXNlIDE2OiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFX1BMQU5BUjsgYnJlYWs7CiAgICAgZGVmYXVsdDogYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJjb2RlYyAlWCIsIGNvZGVjKTsKICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCiAgICAgYXZpb19za2lwKHMtPnBiLCAweDgwMCAtIGF2aW9fdGVsbChzLT5wYikpOwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkY3N0cl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7Ci0gICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgY29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyICAgID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisgICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgcGFyLT5ibG9ja19hbGlnbik7CiB9CiAKIEFWSW5wdXRGb3JtYXQgZmZfZGNzdHJfZGVtdXhlciA9IHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2RmYS5jIGIvbGliYXZmb3JtYXQvZGZhLmMKaW5kZXggYjE2NjcyYy4uOTg1OGVlNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZGZhLmMKKysrIGIvbGliYXZmb3JtYXQvZGZhLmMKQEAgLTU2LDEwICs1NiwxMCBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfREZBOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2aW9fcmwxNihwYik7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfREZBOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gYXZpb19ybDE2KHBiKTsKICAgICBtc3BmID0gYXZpb19ybDMyKHBiKTsKICAgICBpZiAoIW1zcGYpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiWmVybyBGUFMgcmVwb3J0ZWQsIGRlZmF1bHRpbmcgdG8gMTBcbiIpOwpAQCAtNjksOSArNjksOSBAQAogICAgIGF2aW9fc2tpcChwYiwgMTI4IC0gMTYpOyAvLyBwYWRkaW5nCiAgICAgc3QtPmR1cmF0aW9uID0gZnJhbWVzOwogCi0gICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDIpKQorICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCAyKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBBVl9XTDE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCB2ZXJzaW9uKTsKKyAgICBBVl9XTDE2KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCB2ZXJzaW9uKTsKICAgICBpZiAodmVyc2lvbiA9PSAweDEwMCkKICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MiwgMX07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2RueGhkZGVjLmMgYi9saWJhdmZvcm1hdC9kbnhoZGRlYy5jCmluZGV4IDQ4Yzg5MGQuLjBhZDUxYjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2RueGhkZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvZG54aGRkZWMuYwpAQCAtMzAsNyArMzAsNyBAQAogICAgIGludCB3LCBoLCBjb21wcmVzc2lvbl9pZDsKICAgICBpZiAocC0+YnVmX3NpemUgPCAweDJjKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoYXZwcml2X2RueGhkX3BhcnNlX2hlYWRlcl9wcmVmaXgocC0+YnVmKSA9PSAwKQorICAgIGlmIChmZl9kbnhoZF9wYXJzZV9oZWFkZXJfcHJlZml4KHAtPmJ1ZikgPT0gMCkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgaCA9IEFWX1JCMTYocC0+YnVmICsgMHgxOCk7CiAgICAgdyA9IEFWX1JCMTYocC0+YnVmICsgMHgxYSk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9kc2ZkZWMuYyBiL2xpYmF2Zm9ybWF0L2RzZmRlYy5jCmluZGV4IGFlMTk4YjIuLjVlMDZmZDYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2RzZmRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2RzZmRlYy5jCkBAIC0yNiw2ICsyNiw4IEBACiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICB1aW50NjRfdCBkYXRhX2VuZDsKKyAgICB1aW50NjRfdCBhdWRpb19zaXplOworICAgIHVpbnQ2NF90IGRhdGFfc2l6ZTsKIH0gRFNGQ29udGV4dDsKIAogc3RhdGljIGludCBkc2ZfcHJvYmUoQVZQcm9iZURhdGEgKnApCkBAIC01Myw4ICs1NSwxMCBAQAogICAgICAgICByZXR1cm47CiAKICAgICBmZl9pZDN2Ml9yZWFkKHMsIElEM3YyX0RFRkFVTFRfTUFHSUMsICZpZDN2Ml9leHRyYV9tZXRhLCAwKTsKLSAgICBpZiAoaWQzdjJfZXh0cmFfbWV0YSkKKyAgICBpZiAoaWQzdjJfZXh0cmFfbWV0YSkgewogICAgICAgICBmZl9pZDN2Ml9wYXJzZV9hcGljKHMsICZpZDN2Ml9leHRyYV9tZXRhKTsKKyAgICAgICAgZmZfaWQzdjJfcGFyc2VfY2hhcHRlcnMocywgJmlkM3YyX2V4dHJhX21ldGEpOworICAgIH0KICAgICBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoJmlkM3YyX2V4dHJhX21ldGEpOwogfQogCkBAIC03Nyw3ICs4MSw3IEBACiAKICAgICBhdmlvX3NraXAocGIsIDgpOwogICAgIGlkM3BvcyA9IGF2aW9fcmw2NChwYik7Ci0gICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICByZWFkX2lkMyhzLCBpZDNwb3MpOwogICAgICAgICBhdmlvX3NlZWsocGIsIDI4LCBTRUVLX1NFVCk7CiAgICAgfQpAQCAtOTksMjkgKzEwMywzMyBAQAogCiAgICAgY2hhbm5lbF90eXBlID0gYXZpb19ybDMyKHBiKTsKICAgICBpZiAoY2hhbm5lbF90eXBlIDwgRkZfQVJSQVlfRUxFTVMoZHNmX2NoYW5uZWxfbGF5b3V0KSkKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IGRzZl9jaGFubmVsX2xheW91dFtjaGFubmVsX3R5cGVdOwotICAgIGlmICghc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCkKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IGRzZl9jaGFubmVsX2xheW91dFtjaGFubmVsX3R5cGVdOworICAgIGlmICghc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCkKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJjaGFubmVsIHR5cGUgJWkiLCBjaGFubmVsX3R5cGUpOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgPSBhdmlvX3JsMzIocGIpOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgID0gYXZpb19ybDMyKHBiKSAvIDg7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgPSBhdmlvX3JsMzIocGIpOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgID0gYXZpb19ybDMyKHBiKSAvIDg7CisKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA8PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIHN3aXRjaChhdmlvX3JsMzIocGIpKSB7Ci0gICAgY2FzZSAxOiBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFNEX0xTQkZfUExBTkFSOyBicmVhazsKLSAgICBjYXNlIDg6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9EU0RfTVNCRl9QTEFOQVI7IGJyZWFrOworICAgIGNhc2UgMTogc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0RTRF9MU0JGX1BMQU5BUjsgYnJlYWs7CisgICAgY2FzZSA4OiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFNEX01TQkZfUExBTkFSOyBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgInVua25vd24gbW9zdCBzaWduaWZpY2FudCBiaXQiKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgYXZpb19za2lwKHBiLCA4KTsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gYXZpb19ybDMyKHBiKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA+IElOVF9NQVggLyBzdC0+Y29kZWMtPmNoYW5uZWxzKSB7CisgICAgZHNmLT5hdWRpb19zaXplID0gYXZpb19ybDY0KHBiKSAvIDggKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBhdmlvX3JsMzIocGIpOworICAgIGlmIChzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID4gSU5UX01BWCAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpIHsKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJibG9ja19hbGlnbiBvdmVyZmxvdyIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9Ci0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAqPSBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gKj0gc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKiA4TEw7CiAgICAgYXZpb19za2lwKHBiLCA0KTsKIAogICAgIC8qIGRhdGEgY2h1bmsgKi8KQEAgLTEyOSw3ICsxMzcsOSBAQAogICAgIGRzZi0+ZGF0YV9lbmQgPSBhdmlvX3RlbGwocGIpOwogICAgIGlmIChhdmlvX3JsMzIocGIpICE9IE1LVEFHKCdkJywgJ2EnLCAndCcsICdhJykpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIGRzZi0+ZGF0YV9lbmQgKz0gYXZpb19ybDY0KHBiKTsKKyAgICBkc2YtPmRhdGFfc2l6ZSA9IGF2aW9fcmw2NChwYikgLSAxMjsKKyAgICBkc2YtPmRhdGFfZW5kICs9IGRzZi0+ZGF0YV9zaXplICsgMTI7CisgICAgcy0+aW50ZXJuYWwtPmRhdGFfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMTQ1LDcgKzE1NSwzNSBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAKICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7Ci0gICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocGIsIHBrdCwgRkZNSU4oZHNmLT5kYXRhX2VuZCAtIHBvcywgc3QtPmNvZGVjLT5ibG9ja19hbGlnbikpOworICAgIGlmIChkc2YtPmRhdGFfc2l6ZSA+IGRzZi0+YXVkaW9fc2l6ZSkgeworICAgICAgICBpbnQgbGFzdF9wYWNrZXQgPSBwb3MgPT0gKGRzZi0+ZGF0YV9lbmQgLSBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKTsKKworICAgICAgICBpZiAobGFzdF9wYWNrZXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgZGF0YV9wb3MgPSBwb3MgLSBzLT5pbnRlcm5hbC0+ZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICBpbnQ2NF90IHBhY2tldF9zaXplID0gZHNmLT5hdWRpb19zaXplIC0gZGF0YV9wb3M7CisgICAgICAgICAgICBpbnQ2NF90IHNraXBfc2l6ZSA9IGRzZi0+ZGF0YV9zaXplIC0gZGF0YV9wb3MgLSBwYWNrZXRfc2l6ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdDsKKyAgICAgICAgICAgIGludCBjaCwgcmV0OworCisgICAgICAgICAgICBpZiAocGFja2V0X3NpemUgPD0gMCB8fCBza2lwX3NpemUgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBwYWNrZXRfc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBkc3QgPSBwa3QtPmRhdGE7CisgICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOyBjaCsrKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBkc3QsICBwYWNrZXRfc2l6ZSAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCBwYWNrZXRfc2l6ZSAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgICAgICAgICAgICAgIGRzdCArPSByZXQ7CisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCBza2lwX3NpemUgLyBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocGIsIHBrdCwgRkZNSU4oZHNmLT5kYXRhX2VuZCAtIHBvcywgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbikpOwogfQogCiBBVklucHV0Rm9ybWF0IGZmX2RzZl9kZW11eGVyID0gewpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZHNpY2luLmMgYi9saWJhdmZvcm1hdC9kc2ljaW4uYwppbmRleCA2YmE4YzI4Li5iZDRmM2FkIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9kc2ljaW4uYworKysgYi9saWJhdmZvcm1hdC9kc2ljaW4uYwpAQCAtMTE2LDExICsxMTYsMTEgQEAKIAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCAxMik7CiAgICAgY2luLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9EU0lDSU5WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KLSAgICBzdC0+Y29kZWMtPndpZHRoID0gaGRyLT52aWRlb19mcmFtZV93aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGhkci0+dmlkZW9fZnJhbWVfaGVpZ2h0OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFNJQ0lOVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IGhkci0+dmlkZW9fZnJhbWVfd2lkdGg7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBoZHItPnZpZGVvX2ZyYW1lX2hlaWdodDsKIAogICAgIC8qIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgc3RyZWFtICovCiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwpAQCAtMTI5LDE0ICsxMjksMTQgQEAKIAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCAyMjA1MCk7CiAgICAgY2luLT5hdWRpb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9EU0lDSU5BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyB0YWcgKi8KLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDIyMDUwOwotICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0RTSUNJTkFVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIHRhZyAqLworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSAxOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gMjIwNTA7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OworICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICogc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9kc3MuYyBiL2xpYmF2Zm9ybWF0L2Rzcy5jCmluZGV4IGJmN2ExYTQuLjA4M2ViNGEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2Rzcy5jCisrKyBiL2xpYmF2Zm9ybWF0L2Rzcy5jCkBAIC00Miw3ICs0Miw2IEBACiAjZGVmaW5lIERTU19DT01NRU5UX1NJWkUgICAgICAgICAgICAgIDY0CiAKICNkZWZpbmUgRFNTX0JMT0NLX1NJWkUgICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIERTU19IRUFERVJfU0laRSAgICAgICAgICAgICAgKERTU19CTE9DS19TSVpFICogMikKICNkZWZpbmUgRFNTX0FVRElPX0JMT0NLX0hFQURFUl9TSVpFICAgNgogI2RlZmluZSBEU1NfRlJBTUVfU0laRSAgICAgICAgICAgICAgICA0MgogCkBAIC01NiwxMSArNTUsMTMgQEAKICAgICBpbnQ4X3QgKmRzc19zcF9idWY7CiAKICAgICBpbnQgcGFja2V0X3NpemU7CisgICAgaW50IGRzc19oZWFkZXJfc2l6ZTsKIH0gRFNTRGVtdXhDb250ZXh0OwogCiBzdGF0aWMgaW50IGRzc19wcm9iZShBVlByb2JlRGF0YSAqcCkKIHsKLSAgICBpZiAoQVZfUkwzMihwLT5idWYpICE9IE1LVEFHKDB4MiwgJ2QnLCAncycsICdzJykpCisgICAgaWYgKCAgIEFWX1JMMzIocC0+YnVmKSAhPSBNS1RBRygweDIsICdkJywgJ3MnLCAncycpCisgICAgICAgICYmIEFWX1JMMzIocC0+YnVmKSAhPSBNS1RBRygweDMsICdkJywgJ3MnLCAncycpKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKQEAgLTEyMCwxMiArMTIxLDE1IEBACiAgICAgRFNTRGVtdXhDb250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgQVZTdHJlYW0gKnN0OwotICAgIGludCByZXQ7CisgICAgaW50IHJldCwgdmVyc2lvbjsKIAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCisgICAgdmVyc2lvbiA9IGF2aW9fcjgocGIpOworICAgIGN0eC0+ZHNzX2hlYWRlcl9zaXplID0gdmVyc2lvbiAqIERTU19CTE9DS19TSVpFOworCiAgICAgcmV0ID0gZHNzX3JlYWRfbWV0YWRhdGFfc3RyaW5nKHMsIERTU19IRUFEX09GRlNFVF9BVVRIT1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTU19BVVRIT1JfU0laRSwgImF1dGhvciIpOwogICAgIGlmIChyZXQpCkBAIC0xNDQsMjcgKzE0OCwyNyBAQAogICAgIGN0eC0+YXVkaW9fY29kZWMgPSBhdmlvX3I4KHBiKTsKIAogICAgIGlmIChjdHgtPmF1ZGlvX2NvZGVjID09IERTU19BQ09ERUNfRFNTX1NQKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9EU1NfU1A7Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSAxMTAyNTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0RTU19TUDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDExMDI1OwogICAgIH0gZWxzZSBpZiAoY3R4LT5hdWRpb19jb2RlYyA9PSBEU1NfQUNPREVDX0c3MjNfMSkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfRzcyM18xOwotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0c3MjNfMTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJTdXBwb3J0IGZvciBjb2RlYyAleCBpbiBEU1MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5hdWRpb19jb2RlYyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOwogCiAgICAgLyogSnVtcCBvdmVyIGhlYWRlciAqLwogCi0gICAgaWYgKGF2aW9fc2VlayhwYiwgRFNTX0hFQURFUl9TSVpFLCBTRUVLX1NFVCkgIT0gRFNTX0hFQURFUl9TSVpFKQorICAgIGlmIChhdmlvX3NlZWsocGIsIGN0eC0+ZHNzX2hlYWRlcl9zaXplLCBTRUVLX1NFVCkgIT0gY3R4LT5kc3NfaGVhZGVyX3NpemUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAKICAgICBjdHgtPmNvdW50ZXIgPSAwOwpAQCAtMjM1LDcgKzIzOSw3IEBACiAgICAgcGt0LT5kdXJhdGlvbiAgICAgPSAyNjQ7CiAgICAgcGt0LT5wb3MgPSBwb3M7CiAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOwotICAgIHMtPmJpdF9yYXRlID0gOExMICogY3R4LT5wYWNrZXRfc2l6ZSAqIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiA1MTIgLyAoNTA2ICogcGt0LT5kdXJhdGlvbik7CisgICAgcy0+Yml0X3JhdGUgPSA4TEwgKiBjdHgtPnBhY2tldF9zaXplICogc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAqIDUxMiAvICg1MDYgKiBwa3QtPmR1cmF0aW9uKTsKIAogICAgIGlmIChjdHgtPmNvdW50ZXIgPCAwKSB7CiAgICAgICAgIGludCBzaXplMiA9IGN0eC0+Y291bnRlciArIHJlYWRfc2l6ZTsKQEAgLTI2MSw5ICsyNjUsNiBAQAogICAgICAgICBnb3RvIGVycm9yX2VvZjsKICAgICB9CiAKLSAgICBpZiAocGt0LT5kYXRhWzBdID09IDB4ZmYpCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotCiAgICAgcmV0dXJuIHBrdC0+c2l6ZTsKIAogZXJyb3JfZW9mOgpAQCAtMjk5LDcgKzMwMCw3IEBACiAgICAgcGt0LT5kYXRhWzBdICA9IGJ5dGU7CiAgICAgb2Zmc2V0ICAgICAgICA9IDE7CiAgICAgcGt0LT5kdXJhdGlvbiA9IDI0MDsKLSAgICBzLT5iaXRfcmF0ZSA9IDhMTCAqIHNpemUgKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICogNTEyIC8gKDUwNiAqIHBrdC0+ZHVyYXRpb24pOworICAgIHMtPmJpdF9yYXRlID0gOExMICogc2l6ZSAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKiA1MTIgLyAoNTA2ICogcGt0LT5kdXJhdGlvbik7CiAKICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CiAKQEAgLTM2MSw3ICszNjIsNyBAQAogICAgIGlmIChzZWVrdG8gPCAwKQogICAgICAgICBzZWVrdG8gPSAwOwogCi0gICAgc2Vla3RvICs9IERTU19IRUFERVJfU0laRTsKKyAgICBzZWVrdG8gKz0gY3R4LT5kc3NfaGVhZGVyX3NpemU7CiAKICAgICByZXQgPSBhdmlvX3NlZWsocy0+cGIsIHNlZWt0bywgU0VFS19TRVQpOwogICAgIGlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZHRzZGVjLmMgYi9saWJhdmZvcm1hdC9kdHNkZWMuYwppbmRleCBlZjI4MzkxLi5hM2U1MmNkIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9kdHNkZWMuYworKysgYi9saWJhdmZvcm1hdC9kdHNkZWMuYwpAQCAtMTksNiArMTksOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisKICNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2RjYS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvZGNhX3N5bmN3b3Jkcy5oIgpAQCAtMzIsMjMgKzM0LDUwIEBACiAgICAgY29uc3QgdWludDhfdCAqYnVmLCAqYnVmcDsKICAgICB1aW50MzJfdCBzdGF0ZSA9IC0xOwogICAgIGludCBtYXJrZXJzWzQqMTZdID0gezB9OwotICAgIGludCBzdW0sIG1heCwgaTsKKyAgICBpbnQgZXhzc19tYXJrZXJzID0gMCwgZXhzc19uZXh0cG9zID0gMDsKKyAgICBpbnQgc3VtLCBtYXgsIHBvcywgcmV0LCBpOwogICAgIGludDY0X3QgZGlmZiA9IDA7Ci0gICAgdWludDhfdCBoZHJbMTIgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFXSA9IHsgMCB9OworICAgIHVpbnQ4X3QgaGRyW0RDQV9DT1JFX0ZSQU1FX0hFQURFUl9TSVpFICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRV0gPSB7IDAgfTsKIAotICAgIGJ1ZiA9IHAtPmJ1ZiArIEZGTUlOKDQwOTYsIHAtPmJ1Zl9zaXplKTsKLQotICAgIGZvcig7IGJ1ZiA8IChwLT5idWYrcC0+YnVmX3NpemUpLTI7IGJ1Zis9MikgewotICAgICAgICBpbnQgbWFya2VyLCBzYW1wbGVfYmxvY2tzLCBzYW1wbGVfcmF0ZSwgc3JfY29kZSwgZnJhbWVzaXplOwotICAgICAgICBpbnQgbGZlOworICAgIGZvciAocG9zID0gRkZNSU4oNDA5NiwgcC0+YnVmX3NpemUpOyBwb3MgPCBwLT5idWZfc2l6ZSAtIDI7IHBvcyArPSAyKSB7CisgICAgICAgIGludCBtYXJrZXIsIHdpZGVfaGRyLCBoZHJfc2l6ZSwgZnJhbWVzaXplOworICAgICAgICBEQ0FDb3JlRnJhbWVIZWFkZXIgaDsKICAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKIAotICAgICAgICBidWZwID0gYnVmOworICAgICAgICBidWZwID0gYnVmID0gcC0+YnVmICsgcG9zOwogICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCAxNikgfCBieXRlc3RyZWFtX2dldF9iZTE2KCZidWZwKTsKIAotICAgICAgICBpZiAoYnVmIC0gcC0+YnVmID49IDQpCisgICAgICAgIGlmIChwb3MgPj0gNCkKICAgICAgICAgICAgIGRpZmYgKz0gRkZBQlMoKChpbnQxNl90KUFWX1JMMTYoYnVmKSkgLSAoaW50MTZfdClBVl9STDE2KGJ1Zi00KSk7CiAKKyAgICAgICAgLyogZXh0ZW5zaW9uIHN1YnN0cmVhbSAoRVhTUykgKi8KKyAgICAgICAgaWYgKHN0YXRlID09IERDQV9TWU5DV09SRF9TVUJTVFJFQU0pIHsKKyAgICAgICAgICAgIGlmIChwb3MgPCBleHNzX25leHRwb3MpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYgLSAyLCA5Nik7CisgICAgICAgICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDQyKTsKKworICAgICAgICAgICAgd2lkZV9oZHIgID0gZ2V0X2JpdHMxKCZnYik7CisgICAgICAgICAgICBoZHJfc2l6ZSAgPSBnZXRfYml0cygmZ2IsICA4ICsgNCAqIHdpZGVfaGRyKSArIDE7CisgICAgICAgICAgICBmcmFtZXNpemUgPSBnZXRfYml0cygmZ2IsIDE2ICsgNCAqIHdpZGVfaGRyKSArIDE7CisgICAgICAgICAgICBpZiAoaGRyX3NpemUgJiAzIHx8IGZyYW1lc2l6ZSAmIDMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoaGRyX3NpemUgPCAxNiB8fCBmcmFtZXNpemUgPCBoZHJfc2l6ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChwb3MgLSAyICsgaGRyX3NpemUgPiBwLT5idWZfc2l6ZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMTZfQ0NJVFQpLCAweGZmZmYsIGJ1ZiArIDMsIGhkcl9zaXplIC0gNSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChwb3MgPT0gZXhzc19uZXh0cG9zKQorICAgICAgICAgICAgICAgIGV4c3NfbWFya2VycysrOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGV4c3NfbWFya2VycyA9IEZGTUFYKDEsIGV4c3NfbWFya2VycyAtIDEpOworICAgICAgICAgICAgZXhzc19uZXh0cG9zID0gcG9zICsgZnJhbWVzaXplOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICAvKiByZWd1bGFyIGJpdHN0cmVhbSAqLwogICAgICAgICBpZiAoc3RhdGUgPT0gRENBX1NZTkNXT1JEX0NPUkVfQkUgJiYKICAgICAgICAgICAgIChieXRlc3RyZWFtX2dldF9iZTE2KCZidWZwKSAmIDB4RkMwMCkgPT0gMHhGQzAwKQpAQCAtNjksNDAgKzk4LDIwIEBACiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmIChhdnByaXZfZGNhX2NvbnZlcnRfYml0c3RyZWFtKGJ1Zi0yLCAxMiwgaGRyLCAxMikgPCAwKQorICAgICAgICBpZiAoKHJldCA9IGF2cHJpdl9kY2FfY29udmVydF9iaXRzdHJlYW0oYnVmIC0gMiwgRENBX0NPUkVfRlJBTUVfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHIsICAgICBEQ0FfQ09SRV9GUkFNRV9IRUFERVJfU0laRSkpIDwgMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYXZwcml2X2RjYV9wYXJzZV9jb3JlX2ZyYW1lX2hlYWRlcigmaCwgaGRyLCByZXQpIDwgMCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBoZHIsIDk2KTsKLSAgICAgICAgc2tpcF9iaXRzX2xvbmcoJmdiLCAzOSk7Ci0KLSAgICAgICAgc2FtcGxlX2Jsb2NrcyA9IGdldF9iaXRzKCZnYiwgNykgKyAxOwotICAgICAgICBpZiAoc2FtcGxlX2Jsb2NrcyA8IDgpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBmcmFtZXNpemUgPSBnZXRfYml0cygmZ2IsIDE0KSArIDE7Ci0gICAgICAgIGlmIChmcmFtZXNpemUgPCA5NSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHNraXBfYml0cygmZ2IsIDYpOwotICAgICAgICBzcl9jb2RlID0gZ2V0X2JpdHMoJmdiLCA0KTsKLSAgICAgICAgc2FtcGxlX3JhdGUgPSBhdnByaXZfZGNhX3NhbXBsZV9yYXRlc1tzcl9jb2RlXTsKLSAgICAgICAgaWYgKHNhbXBsZV9yYXRlID09IDApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBnZXRfYml0cygmZ2IsIDUpOwotICAgICAgICBpZiAoZ2V0X2JpdHMoJmdiLCAxKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgOSk7Ci0gICAgICAgIGxmZSA9IGdldF9iaXRzKCZnYiwgMik7Ci0gICAgICAgIGlmIChsZmUgPiAyKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgbWFya2VyICs9IDQqIHNyX2NvZGU7CisgICAgICAgIG1hcmtlciArPSA0ICogaC5zcl9jb2RlOwogCiAgICAgICAgIG1hcmtlcnNbbWFya2VyXSArKzsKICAgICB9CiAKKyAgICBpZiAoZXhzc19tYXJrZXJzID4gMykKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsKKwogICAgIHN1bSA9IG1heCA9IDA7CiAgICAgZm9yIChpPTA7IGk8RkZfQVJSQVlfRUxFTVMobWFya2Vycyk7IGkrKykgewogICAgICAgICBzdW0gKz0gbWFya2Vyc1tpXTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2R0c2hkZGVjLmMgYi9saWJhdmZvcm1hdC9kdHNoZGRlYy5jCmluZGV4IDBmZDAzMDQuLjFiZDQwM2MgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2R0c2hkZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvZHRzaGRkZWMuYwpAQCAtMjEsNyArMjEsOSBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9kY2EuaCIKICNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKICNkZWZpbmUgQVVQUl9IRFIgMHg0MTU1NTA1MjJENDg0NDUyCiAjZGVmaW5lIEFVUFJJTkZPIDB4NDE1NTUwNTI0OTRFNDY0RgpAQCAtNTMsNiArNTUsNyBAQAogICAgIERUU0hERGVtdXhDb250ZXh0ICpkdHNoZCA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICB1aW50NjRfdCBjaHVua190eXBlLCBjaHVua19zaXplOworICAgIGludDY0X3QgZHVyYXRpb24sIGRhdGFfc3RhcnQ7CiAgICAgQVZTdHJlYW0gKnN0OwogICAgIGludCByZXQ7CiAgICAgY2hhciAqdmFsdWU7CkBAIC02MCwxNCArNjMsMTcgQEAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfRFRTOwotICAgIHN0LT5uZWVkX3BhcnNpbmcgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9EVFM7CisgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CiAKLSAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikpIHsKKyAgICBmb3IgKDs7KSB7CiAgICAgICAgIGNodW5rX3R5cGUgPSBhdmlvX3JiNjQocGIpOwogICAgICAgICBjaHVua19zaXplID0gYXZpb19yYjY0KHBiKTsKIAorICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGlmIChjaHVua19zaXplIDwgNCkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNodW5rIHNpemUgdG9vIHNtYWxsXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtNzksMTAgKzg1LDI4IEBACiAKICAgICAgICAgc3dpdGNoIChjaHVua190eXBlKSB7CiAgICAgICAgIGNhc2UgU1RSTURBVEE6Ci0gICAgICAgICAgICBkdHNoZC0+ZGF0YV9lbmQgPSBjaHVua19zaXplICsgYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgIGRhdGFfc3RhcnQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgZHRzaGQtPmRhdGFfZW5kID0gZGF0YV9zdGFydCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICBpZiAoZHRzaGQtPmRhdGFfZW5kIDw9IGNodW5rX3NpemUpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGlmICghKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKKyAgICAgICAgICAgICAgICBnb3RvIGJyZWFrX2xvb3A7CisgICAgICAgICAgICBnb3RvIHNraXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVVBSX0hEUjoKKyAgICAgICAgICAgIGlmIChjaHVua19zaXplIDwgMjEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIDMpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIyNChwYik7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBkdXJhdGlvbiAgPSBhdmlvX3JiMzIocGIpOyAvLyBudW1fZnJhbWVzCisgICAgICAgICAgICBkdXJhdGlvbiAqPSBhdmlvX3JiMTYocGIpOyAvLyBzYW1wbGVzX3Blcl9mcmFtZXMKKyAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCA1KTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBmZl9kY2FfY291bnRfY2hzX2Zvcl9tYXNrKGF2aW9fcmIxNihwYikpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5pbml0aWFsX3BhZGRpbmcgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCBjaHVua19zaXplIC0gMjEpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRklMRUlORk86CiAgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IElOVF9NQVgpCkBAIC0xMDMsNyArMTI3LDE2IEBACiAgICAgICAgIH07CiAgICAgfQogCi0gICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIGlmICghZHRzaGQtPmRhdGFfZW5kKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBhdmlvX3NlZWsocGIsIGRhdGFfc3RhcnQsIFNFRUtfU0VUKTsKKworYnJlYWtfbG9vcDoKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcmF3X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2R1bXAuYyBiL2xpYmF2Zm9ybWF0L2R1bXAuYwppbmRleCBlYWY4N2ZlLi45NDJlNjJhIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9kdW1wLmMKKysrIGIvbGliYXZmb3JtYXQvZHVtcC5jCkBAIC0yNiwxMCArMjYsMTIgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9yZXBsYXlnYWluLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NwaGVyaWNhbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgogCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKQEAgLTEwMCw3ICsxMDIsNyBAQAogICAgIEhFWERVTVBfUFJJTlQoIlxuIik7CiAgICAgSEVYRFVNUF9QUklOVCgiICBzaXplPSVkXG4iLCBwa3QtPnNpemUpOwogICAgIGlmIChkdW1wX3BheWxvYWQpCi0gICAgICAgIGF2X2hleF9kdW1wKGYsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICAgICAgaGV4X2R1bXBfaW50ZXJuYWwoYXZjbCwgZiwgbGV2ZWwsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKIH0KIAogdm9pZCBhdl9wa3RfZHVtcDIoRklMRSAqZiwgY29uc3QgQVZQYWNrZXQgKnBrdCwgaW50IGR1bXBfcGF5bG9hZCwgY29uc3QgQVZTdHJlYW0gKnN0KQpAQCAtMjU5LDM1ICsyNjEsNyBAQAogCiAgICAgc3RlcmVvID0gKEFWU3RlcmVvM0QgKilzZC0+ZGF0YTsKIAotICAgIHN3aXRjaCAoc3RlcmVvLT50eXBlKSB7Ci0gICAgY2FzZSBBVl9TVEVSRU8zRF8yRDoKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIyRCIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX1NURVJFTzNEX1NJREVCWVNJREU6Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAic2lkZSBieSBzaWRlIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU1RFUkVPM0RfVE9QQk9UVE9NOgotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInRvcCBhbmQgYm90dG9tIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU1RFUkVPM0RfRlJBTUVTRVFVRU5DRToKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJmcmFtZSBhbHRlcm5hdGUiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9TVEVSRU8zRF9DSEVDS0VSQk9BUkQ6Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiY2hlY2tlcmJvYXJkIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU1RFUkVPM0RfTElORVM6Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaW50ZXJsZWF2ZWQgbGluZXMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9TVEVSRU8zRF9DT0xVTU5TOgotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgImludGVybGVhdmVkIGNvbHVtbnMiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9TVEVSRU8zRF9TSURFQllTSURFX1FVSU5DVU5YOgotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgInNpZGUgYnkgc2lkZSAocXVpbmN1bnggc3Vic2FtcGxpbmcpIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAidW5rbm93biIpOwotICAgICAgICBicmVhazsKLSAgICB9CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlcyIsIGF2X3N0ZXJlbzNkX3R5cGVfbmFtZShzdGVyZW8tPnR5cGUpKTsKIAogICAgIGlmIChzdGVyZW8tPmZsYWdzICYgQVZfU1RFUkVPM0RfRkxBR19JTlZFUlQpCiAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiIChpbnZlcnRlZCkiKTsKQEAgLTMzNiw2ICszMTAsNzYgQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIGR1bXBfY3BiKHZvaWQgKmN0eCwgQVZQYWNrZXRTaWRlRGF0YSAqc2QpCit7CisgICAgQVZDUEJQcm9wZXJ0aWVzICpjcGIgPSAoQVZDUEJQcm9wZXJ0aWVzICopc2QtPmRhdGE7CisKKyAgICBpZiAoc2QtPnNpemUgPCBzaXplb2YoKmNwYikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJpbnZhbGlkIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAiYml0cmF0ZSBtYXgvbWluL2F2ZzogJWQvJWQvJWQgYnVmZmVyIHNpemU6ICVkIHZidl9kZWxheTogJSJQUklkNjQsCisgICAgICAgICAgIGNwYi0+bWF4X2JpdHJhdGUsIGNwYi0+bWluX2JpdHJhdGUsIGNwYi0+YXZnX2JpdHJhdGUsCisgICAgICAgICAgIGNwYi0+YnVmZmVyX3NpemUsCisgICAgICAgICAgIGNwYi0+dmJ2X2RlbGF5KTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YSh2b2lkICpjdHgsIEFWUGFja2V0U2lkZURhdGEqIHNkKSB7CisgICAgQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEqIG1ldGFkYXRhID0gKEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhKilzZC0+ZGF0YTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIk1hc3RlcmluZyBEaXNwbGF5IE1ldGFkYXRhLCAiCisgICAgICAgICAgICJoYXNfcHJpbWFyaWVzOiVkIGhhc19sdW1pbmFuY2U6JWQgIgorICAgICAgICAgICAiciglNS40ZiwlNS40ZikgZyglNS40ZiwlNS40ZikgYiglNS40ZiAlNS40Zikgd3AoJTUuNGYsICU1LjRmKSAiCisgICAgICAgICAgICJtaW5fbHVtaW5hbmNlPSVmLCBtYXhfbHVtaW5hbmNlPSVmIiwKKyAgICAgICAgICAgbWV0YWRhdGEtPmhhc19wcmltYXJpZXMsIG1ldGFkYXRhLT5oYXNfbHVtaW5hbmNlLAorICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzBdWzBdKSwKKyAgICAgICAgICAgYXZfcTJkKG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1swXVsxXSksCisgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMV1bMF0pLAorICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzFdWzFdKSwKKyAgICAgICAgICAgYXZfcTJkKG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1syXVswXSksCisgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMl1bMV0pLAorICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPndoaXRlX3BvaW50WzBdKSwgYXZfcTJkKG1ldGFkYXRhLT53aGl0ZV9wb2ludFsxXSksCisgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+bWluX2x1bWluYW5jZSksIGF2X3EyZChtZXRhZGF0YS0+bWF4X2x1bWluYW5jZSkpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2NvbnRlbnRfbGlnaHRfbWV0YWRhdGEodm9pZCAqY3R4LCBBVlBhY2tldFNpZGVEYXRhKiBzZCkKK3sKKyAgICBBVkNvbnRlbnRMaWdodE1ldGFkYXRhKiBtZXRhZGF0YSA9IChBVkNvbnRlbnRMaWdodE1ldGFkYXRhKilzZC0+ZGF0YTsKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkNvbnRlbnQgTGlnaHQgTGV2ZWwgTWV0YWRhdGEsICIKKyAgICAgICAgICAgIk1heENMTD0lZCwgTWF4RkFMTD0lZCIsCisgICAgICAgICAgIG1ldGFkYXRhLT5NYXhDTEwsIG1ldGFkYXRhLT5NYXhGQUxMKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9zcGhlcmljYWwodm9pZCAqY3R4LCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBBVlBhY2tldFNpZGVEYXRhICpzZCkKK3sKKyAgICBBVlNwaGVyaWNhbE1hcHBpbmcgKnNwaGVyaWNhbCA9IChBVlNwaGVyaWNhbE1hcHBpbmcgKilzZC0+ZGF0YTsKKyAgICBkb3VibGUgeWF3LCBwaXRjaCwgcm9sbDsKKworICAgIGlmIChzZC0+c2l6ZSA8IHNpemVvZigqc3BoZXJpY2FsKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgImludmFsaWQgZGF0YSIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIlcyAiLCBhdl9zcGhlcmljYWxfcHJvamVjdGlvbl9uYW1lKHNwaGVyaWNhbC0+cHJvamVjdGlvbikpOworCisgICAgeWF3ID0gKChkb3VibGUpc3BoZXJpY2FsLT55YXcpIC8gKDEgPDwgMTYpOworICAgIHBpdGNoID0gKChkb3VibGUpc3BoZXJpY2FsLT5waXRjaCkgLyAoMSA8PCAxNik7CisgICAgcm9sbCA9ICgoZG91YmxlKXNwaGVyaWNhbC0+cm9sbCkgLyAoMSA8PCAxNik7CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIoJWYvJWYvJWYpICIsIHlhdywgcGl0Y2gsIHJvbGwpOworCisgICAgaWYgKHNwaGVyaWNhbC0+cHJvamVjdGlvbiA9PSBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSX1RJTEUpIHsKKyAgICAgICAgc2l6ZV90IGwsIHQsIHIsIGI7CisgICAgICAgIGF2X3NwaGVyaWNhbF90aWxlX2JvdW5kcyhzcGhlcmljYWwsIHBhci0+d2lkdGgsIHBhci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmwsICZ0LCAmciwgJmIpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywKKyAgICAgICAgICAgICAgICJbJSJTSVpFX1NQRUNJRklFUiIsICUiU0laRV9TUEVDSUZJRVIiLCAlIlNJWkVfU1BFQ0lGSUVSIiwgJSJTSVpFX1NQRUNJRklFUiJdICIsCisgICAgICAgICAgICAgICBsLCB0LCByLCBiKTsKKyAgICB9IGVsc2UgaWYgKHNwaGVyaWNhbC0+cHJvamVjdGlvbiA9PSBBVl9TUEhFUklDQUxfQ1VCRU1BUCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIltwYWQgJSJQUkl1MzIiXSAiLCBzcGhlcmljYWwtPnBhZGRpbmcpOworICAgIH0KK30KKwogc3RhdGljIHZvaWQgZHVtcF9zaWRlZGF0YSh2b2lkICpjdHgsIEFWU3RyZWFtICpzdCwgY29uc3QgY2hhciAqaW5kZW50KQogewogICAgIGludCBpOwpAQCAtMzU5LDcgKzQwMyw3IEBACiAgICAgICAgICAgICBkdW1wX3BhcmFtY2hhbmdlKGN0eCwgJnNkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX1BLVF9EQVRBX0gyNjNfTUJfSU5GTzoKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiaDI2MyBtYWNyb2Jsb2NrIGluZm8iKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiSC4yNjMgbWFjcm9ibG9jayBpbmZvIik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9QS1RfREFUQV9SRVBMQVlHQUlOOgogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJyZXBsYXlnYWluOiAiKTsKQEAgLTM3OCwxMCArNDIyLDI1IEBACiAgICAgICAgICAgICBkdW1wX2F1ZGlvc2VydmljZXR5cGUoY3R4LCAmc2QpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfUVVBTElUWV9TVEFUUzoKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAicXVhbGl0eSBmYWN0b3I6ICVkLCBwaWN0X3R5cGU6ICVjIiwgQVZfUkwzMihzZC5kYXRhKSwgYXZfZ2V0X3BpY3R1cmVfdHlwZV9jaGFyKHNkLmRhdGFbNF0pKTsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAicXVhbGl0eSBmYWN0b3I6ICUiUFJJZDMyIiwgcGljdF90eXBlOiAlYyIsCisgICAgICAgICAgICAgICAgICAgQVZfUkwzMihzZC5kYXRhKSwgYXZfZ2V0X3BpY3R1cmVfdHlwZV9jaGFyKHNkLmRhdGFbNF0pKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BLVF9EQVRBX0NQQl9QUk9QRVJUSUVTOgorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICJjcGI6ICIpOworICAgICAgICAgICAgZHVtcF9jcGIoY3R4LCAmc2QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfTUFTVEVSSU5HX0RJU1BMQVlfTUVUQURBVEE6CisgICAgICAgICAgICBkdW1wX21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhKGN0eCwgJnNkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BLVF9EQVRBX1NQSEVSSUNBTDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAic3BoZXJpY2FsOiAiKTsKKyAgICAgICAgICAgIGR1bXBfc3BoZXJpY2FsKGN0eCwgc3QtPmNvZGVjcGFyLCAmc2QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUEtUX0RBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTDoKKyAgICAgICAgICAgIGR1bXBfY29udGVudF9saWdodF9tZXRhZGF0YShjdHgsICZzZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sCiAgICAgICAgICAgICAgICAgICAgInVua25vd24gc2lkZSBkYXRhIHR5cGUgJWQgKCVkIGJ5dGVzKSIsIHNkLnR5cGUsIHNkLnNpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTM5OSwxNCArNDU4LDMyIEBACiAgICAgQVZTdHJlYW0gKnN0ID0gaWMtPnN0cmVhbXNbaV07CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmxhbmcgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIE5VTEwsIDApOwogICAgIGNoYXIgKnNlcGFyYXRvciA9IGljLT5kdW1wX3NlcGFyYXRvcjsKLSAgICBjaGFyICoqY29kZWNfc2VwYXJhdG9yID0gYXZfb3B0X3B0cihzdC0+Y29kZWMtPmF2X2NsYXNzLCBzdC0+Y29kZWMsICJkdW1wX3NlcGFyYXRvciIpOwotICAgIGludCB1c2VfZm9ybWF0X3NlcGFyYXRvciA9ICEqY29kZWNfc2VwYXJhdG9yOworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKKyAgICBpbnQgcmV0OwogCi0gICAgaWYgKHVzZV9mb3JtYXRfc2VwYXJhdG9yKQotICAgICAgICAqY29kZWNfc2VwYXJhdG9yID0gYXZfc3RyZHVwKHNlcGFyYXRvcik7Ci0gICAgYXZjb2RlY19zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgc3QtPmNvZGVjLCBpc19vdXRwdXQpOwotICAgIGlmICh1c2VfZm9ybWF0X3NlcGFyYXRvcikKLSAgICAgICAgYXZfZnJlZXAoY29kZWNfc2VwYXJhdG9yKTsKKyAgICBhdmN0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCk7CisgICAgaWYgKCFhdmN0eCkKKyAgICAgICAgcmV0dXJuOworCisgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoYXZjdHgsIHN0LT5jb2RlY3Bhcik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmF2Y3R4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEZpZWxkcyB3aGljaCBhcmUgbWlzc2luZyBmcm9tIEFWQ29kZWNQYXJhbWV0ZXJzIG5lZWQgdG8gYmUgdGFrZW4gZnJvbSB0aGUgQVZDb2RlY0NvbnRleHQKKyAgICBhdmN0eC0+cHJvcGVydGllcyA9IHN0LT5jb2RlYy0+cHJvcGVydGllczsKKyAgICBhdmN0eC0+Y29kZWMgICAgICA9IHN0LT5jb2RlYy0+Y29kZWM7CisgICAgYXZjdHgtPnFtaW4gICAgICAgPSBzdC0+Y29kZWMtPnFtaW47CisgICAgYXZjdHgtPnFtYXggICAgICAgPSBzdC0+Y29kZWMtPnFtYXg7CisgICAgYXZjdHgtPmNvZGVkX3dpZHRoICA9IHN0LT5jb2RlYy0+Y29kZWRfd2lkdGg7CisgICAgYXZjdHgtPmNvZGVkX2hlaWdodCA9IHN0LT5jb2RlYy0+Y29kZWRfaGVpZ2h0OworCisgICAgaWYgKHNlcGFyYXRvcikKKyAgICAgICAgYXZfb3B0X3NldChhdmN0eCwgImR1bXBfc2VwYXJhdG9yIiwgc2VwYXJhdG9yLCAwKTsKKyAgICBhdmNvZGVjX3N0cmluZyhidWYsIHNpemVvZihidWYpLCBhdmN0eCwgaXNfb3V0cHV0KTsKKyAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmYXZjdHgpOworCiAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiICAgIFN0cmVhbSAjJWQ6JWQiLCBpbmRleCwgaSk7CiAKICAgICAvKiB0aGUgcGlkIGlzIGFuIGltcG9ydGFudCBpbmZvcm1hdGlvbiwgc28gd2UgZGlzcGxheSBpdCAqLwpAQCAtNDE5LDE5ICs0OTYsMTkgQEAKICAgICAgICAgICAgc3QtPnRpbWVfYmFzZS5udW0sIHN0LT50aW1lX2Jhc2UuZGVuKTsKICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICI6ICVzIiwgYnVmKTsKIAotICAgIGlmIChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gJiYgLy8gZGVmYXVsdAotICAgICAgICBhdl9jbXBfcShzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbywgc3QtPmNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvKSkgeworICAgIGlmIChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gJiYKKyAgICAgICAgYXZfY21wX3Eoc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8sIHN0LT5jb2RlY3Bhci0+c2FtcGxlX2FzcGVjdF9yYXRpbykpIHsKICAgICAgICAgQVZSYXRpb25hbCBkaXNwbGF5X2FzcGVjdF9yYXRpbzsKICAgICAgICAgYXZfcmVkdWNlKCZkaXNwbGF5X2FzcGVjdF9yYXRpby5udW0sICZkaXNwbGF5X2FzcGVjdF9yYXRpby5kZW4sCi0gICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAqIChpbnQ2NF90KXN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICogKGludDY0X3Qpc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgKiAoaW50NjRfdClzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCisgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAqIChpbnQ2NF90KXN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKICAgICAgICAgICAgICAgICAgIDEwMjQgKiAxMDI0KTsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiLCBTQVIgJWQ6JWQgREFSICVkOiVkIiwKICAgICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAogICAgICAgICAgICAgICAgZGlzcGxheV9hc3BlY3RfcmF0aW8ubnVtLCBkaXNwbGF5X2FzcGVjdF9yYXRpby5kZW4pOwogICAgIH0KIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgaW50IGZwcyA9IHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4gJiYgc3QtPmF2Z19mcmFtZV9yYXRlLm51bTsKICAgICAgICAgaW50IHRiciA9IHN0LT5yX2ZyYW1lX3JhdGUuZGVuICYmIHN0LT5yX2ZyYW1lX3JhdGUubnVtOwogICAgICAgICBpbnQgdGJuID0gc3QtPnRpbWVfYmFzZS5kZW4gJiYgc3QtPnRpbWVfYmFzZS5udW07CkBAIC00NzAsNiArNTQ3LDEwIEBACiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiAodmlzdWFsIGltcGFpcmVkKSIpOwogICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9DTEVBTl9FRkZFQ1RTKQogICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIgKGNsZWFuIGVmZmVjdHMpIik7CisgICAgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0RFU0NSSVBUSU9OUykKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIChkZXNjcmlwdGlvbnMpIik7CisgICAgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0RFUEVOREVOVCkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiIChkZXBlbmRlbnQpIik7CiAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiXG4iKTsKIAogICAgIGR1bXBfbWV0YWRhdGEoTlVMTCwgc3QtPm1ldGFkYXRhLCAiICAgICIpOwpAQCAtNTExLDE0ICs1OTIsMTYgQEAKICAgICAgICAgaWYgKGljLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFKSB7CiAgICAgICAgICAgICBpbnQgc2VjcywgdXM7CiAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIsIHN0YXJ0OiAiKTsKLSAgICAgICAgICAgIHNlY3MgPSBpYy0+c3RhcnRfdGltZSAvIEFWX1RJTUVfQkFTRTsKKyAgICAgICAgICAgIHNlY3MgPSBsbGFicyhpYy0+c3RhcnRfdGltZSAvIEFWX1RJTUVfQkFTRSk7CiAgICAgICAgICAgICB1cyAgID0gbGxhYnMoaWMtPnN0YXJ0X3RpbWUgJSBBVl9USU1FX0JBU0UpOwotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJWQuJTA2ZCIsCi0gICAgICAgICAgICAgICAgICAgc2VjcywgKGludCkgYXZfcmVzY2FsZSh1cywgMTAwMDAwMCwgQVZfVElNRV9CQVNFKSk7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlcyVkLiUwNmQiLAorICAgICAgICAgICAgICAgICAgIGljLT5zdGFydF90aW1lID49IDAgPyAiIiA6ICItIiwKKyAgICAgICAgICAgICAgICAgICBzZWNzLAorICAgICAgICAgICAgICAgICAgIChpbnQpIGF2X3Jlc2NhbGUodXMsIDEwMDAwMDAsIEFWX1RJTUVfQkFTRSkpOwogICAgICAgICB9CiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiwgYml0cmF0ZTogIik7CiAgICAgICAgIGlmIChpYy0+Yml0X3JhdGUpCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlIlBSSWQ2NCIga2IvcyIsIChpbnQ2NF90KWljLT5iaXRfcmF0ZSAvIDEwMDApOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJSJQUklkNjQiIGtiL3MiLCBpYy0+Yml0X3JhdGUgLyAxMDAwKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiTi9BIik7CiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlxuIik7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9kdi5jIGIvbGliYXZmb3JtYXQvZHYuYwppbmRleCA4NGMzMDYxLi4wNmRlMDQ0IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9kdi5jCisrKyBiL2xpYmF2Zm9ybWF0L2R2LmMKQEAgLTExMCwxMSArMTEwLDExIEBACiAKIC8qCiAgKiBUaGVyZSdzIGEgY291cGxlIG9mIGFzc3VtcHRpb25zIGJlaW5nIG1hZGUgaGVyZToKLSAqIDEuIEJ5IGRlZmF1bHQgd2Ugc2lsZW5jZSBlcnJvbmVvdXMgKDB4ODAwMC8xNmJpdCAweDgwMC8xMmJpdCkgYXVkaW8gc2FtcGxlcy4KKyAqIDEuIEJ5IGRlZmF1bHQgd2Ugc2lsZW5jZSBlcnJvbmVvdXMgKDB4ODAwMC8xNi1iaXQgMHg4MDAvMTItYml0KSBhdWRpbyBzYW1wbGVzLgogICogICAgV2UgY2FuIHBhc3MgdGhlbSB1cHdhcmRzIHdoZW4gbGliYXZjb2RlYyB3aWxsIGJlIHJlYWR5IHRvIGRlYWwgd2l0aCB0aGVtLgogICogMi4gV2UgZG9uJ3QgZG8gc29mdHdhcmUgZW1waGFzaXMuCi0gKiAzLiBBdWRpbyBpcyBhbHdheXMgcmV0dXJuZWQgYXMgMTZiaXQgbGluZWFyIHNhbXBsZXM6IDEyYml0IG5vbmxpbmVhciBzYW1wbGVzCi0gKiAgICBhcmUgY29udmVydGVkIGludG8gMTZiaXQgbGluZWFyIG9uZXMuCisgKiAzLiBBdWRpbyBpcyBhbHdheXMgcmV0dXJuZWQgYXMgMTYtYml0IGxpbmVhciBzYW1wbGVzOiAxMi1iaXQgbm9ubGluZWFyIHNhbXBsZXMKKyAqICAgIGFyZSBjb252ZXJ0ZWQgaW50byAxNi1iaXQgbGluZWFyIG9uZXMuCiAgKi8KIHN0YXRpYyBpbnQgZHZfZXh0cmFjdF9hdWRpbyhjb25zdCB1aW50OF90ICpmcmFtZSwgdWludDhfdCAqKnBwY20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZEVlByb2ZpbGUgKnN5cykKQEAgLTEzMCw3ICsxMzAsNyBAQAogCiAgICAgc21wbHMgPSBhc19wYWNrWzFdICAgICAgJiAweDNmOyAvKiBzYW1wbGVzIGluIHRoaXMgZnJhbWUgLSBtaW4uIHNhbXBsZXMgKi8KICAgICBmcmVxICA9IGFzX3BhY2tbNF0gPj4gMyAmIDB4MDc7IC8qIDAgLSA0OGtIeiwgMSAtIDQ0LDFrSHosIDIgLSAzMmtIeiAqLwotICAgIHF1YW50ID0gYXNfcGFja1s0XSAgICAgICYgMHgwNzsgLyogMCAtIDE2Yml0IGxpbmVhciwgMSAtIDEyYml0IG5vbmxpbmVhciAqLworICAgIHF1YW50ID0gYXNfcGFja1s0XSAgICAgICYgMHgwNzsgLyogMCAtIDE2LWJpdCBsaW5lYXIsIDEgLSAxMi1iaXQgbm9ubGluZWFyICovCiAKICAgICBpZiAocXVhbnQgPiAxKQogICAgICAgICByZXR1cm4gLTE7ICAvKiB1bnN1cHBvcnRlZCBxdWFudGl6YXRpb24gKi8KQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3lzLT5kaWZzZWdfc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgICBmcmFtZSArPSA2ICogODA7IC8qIHNraXAgRElGIHNlZ21lbnQgaGVhZGVyICovCiAgICAgICAgICAgICBpZiAocXVhbnQgPT0gMSAmJiBpID09IGhhbGZfY2gpIHsKLSAgICAgICAgICAgICAgICAvKiBuZXh0IHN0ZXJlbyBjaGFubmVsICgxMmJpdCBtb2RlIG9ubHkpICovCisgICAgICAgICAgICAgICAgLyogbmV4dCBzdGVyZW8gY2hhbm5lbCAoMTItYml0IG1vZGUgb25seSkgKi8KICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKGlwY208NCk7CiAgICAgICAgICAgICAgICAgcGNtID0gcHBjbVtpcGNtKytdOwogICAgICAgICAgICAgICAgIGlmICghcGNtKQpAQCAtMTcxLDcgKzE3MSw3IEBACiAgICAgICAgICAgICAvKiBmb3IgZWFjaCBBViBzZXF1ZW5jZSAqLwogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDk7IGorKykgewogICAgICAgICAgICAgICAgIGZvciAoZCA9IDg7IGQgPCA4MDsgZCArPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChxdWFudCA9PSAwKSB7ICAvKiAxNmJpdCBxdWFudGl6YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHF1YW50ID09IDApIHsgIC8qIDE2LWJpdCBxdWFudGl6YXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgIG9mID0gc3lzLT5hdWRpb19zaHVmZmxlW2ldW2pdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGQgLSA4KSAvIDIgKiBzeXMtPmF1ZGlvX3N0cmlkZTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvZiAqIDIgPj0gc2l6ZSkKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNtW29mICogMiArIDFdID09IDB4ODAgJiYgcGNtW29mICogMl0gPT0gMHgwMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY21bb2YgKiAyICsgMV0gPSAwOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgLyogMTJiaXQgcXVhbnRpemF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAvKiAxMi1iaXQgcXVhbnRpemF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgICBsYyA9ICgodWludDE2X3QpZnJhbWVbZF0gICAgIDw8IDQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdClmcmFtZVtkICsgMl0gPj4gNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByYyA9ICgodWludDE2X3QpZnJhbWVbZCArIDFdIDw8IDQpIHwKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgIHNtcGxzID0gYXNfcGFja1sxXSAgICAgICYgMHgzZjsgLyogc2FtcGxlcyBpbiB0aGlzIGZyYW1lIC0gbWluLiBzYW1wbGVzICovCiAgICAgZnJlcSAgPSBhc19wYWNrWzRdID4+IDMgJiAweDA3OyAvKiAwIC0gNDhrSHosIDEgLSA0NCwxa0h6LCAyIC0gMzJrSHogKi8KICAgICBzdHlwZSA9IGFzX3BhY2tbM10gICAgICAmIDB4MWY7IC8qIDAgLSAyQ0gsIDIgLSA0Q0gsIDMgLSA4Q0ggKi8KLSAgICBxdWFudCA9IGFzX3BhY2tbNF0gICAgICAmIDB4MDc7IC8qIDAgLSAxNmJpdCBsaW5lYXIsIDEgLSAxMmJpdCBub25saW5lYXIgKi8KKyAgICBxdWFudCA9IGFzX3BhY2tbNF0gICAgICAmIDB4MDc7IC8qIDAgLSAxNi1iaXQgbGluZWFyLCAxIC0gMTItYml0IG5vbmxpbmVhciAqLwogCiAgICAgaWYgKGZyZXEgPj0gRkZfQVJSQVlfRUxFTVMoZHZfYXVkaW9fZnJlcXVlbmN5KSkgewogICAgICAgICBhdl9sb2coYy0+ZmN0eCwgQVZfTE9HX0VSUk9SLApAQCAtMjU5LDggKzI1OSw4IEBACiAgICAgICAgICAgICBpZiAoIWMtPmFzdFtpXSkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYy0+YXN0W2ldLCA2NCwgMSwgMzAwMDApOwotICAgICAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgICAgIGMtPmFzdFtpXS0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgICAgICBjLT5hc3RbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgYy0+YXN0W2ldLT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKIAogICAgICAgICAgICAgYXZfaW5pdF9wYWNrZXQoJmMtPmF1ZGlvX3BrdFtpXSk7CiAgICAgICAgICAgICBjLT5hdWRpb19wa3RbaV0uc2l6ZSAgICAgICAgID0gMDsKQEAgLTI2OCwxMCArMjY4LDEwIEBACiAgICAgICAgICAgICBjLT5hdWRpb19wa3RbaV0uc3RyZWFtX2luZGV4ID0gYy0+YXN0W2ldLT5pbmRleDsKICAgICAgICAgICAgIGMtPmF1ZGlvX3BrdFtpXS5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CiAgICAgICAgIH0KLSAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgPSBkdl9hdWRpb19mcmVxdWVuY3lbZnJlcV07Ci0gICAgICAgIGMtPmFzdFtpXS0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwotICAgICAgICBjLT5hc3RbaV0tPmNvZGVjLT5iaXRfcmF0ZSAgICAgICA9IDIgKiBkdl9hdWRpb19mcmVxdWVuY3lbZnJlcV0gKiAxNjsKKyAgICAgICAgYy0+YXN0W2ldLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgPSBkdl9hdWRpb19mcmVxdWVuY3lbZnJlcV07CisgICAgICAgIGMtPmFzdFtpXS0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgYy0+YXN0W2ldLT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBjLT5hc3RbaV0tPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICAgICA9IDIgKiBkdl9hdWRpb19mcmVxdWVuY3lbZnJlcV0gKiAxNjsKICAgICAgICAgYy0+YXN0W2ldLT5zdGFydF90aW1lICAgICAgICAgICAgPSAwOwogICAgIH0KICAgICBjLT5hY2ggPSBpOwpAQCAtMjgyLDI5ICsyODIsMjUgQEAKIHN0YXRpYyBpbnQgZHZfZXh0cmFjdF92aWRlb19pbmZvKERWRGVtdXhDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpmcmFtZSkKIHsKICAgICBjb25zdCB1aW50OF90ICp2c2NfcGFjazsKLSAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBpbnQgYXB0LCBpczE2Xzk7Ci0gICAgaW50IHNpemUgPSAwOwogCi0gICAgaWYgKGMtPnN5cykgewotICAgICAgICBhdmN0eCA9IGMtPnZzdC0+Y29kZWM7CisgICAgcGFyID0gYy0+dnN0LT5jb2RlY3BhcjsKIAotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGMtPnZzdCwgNjQsIGMtPnN5cy0+dGltZV9iYXNlLm51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zeXMtPnRpbWVfYmFzZS5kZW4pOwotICAgICAgICBjLT52c3QtPmF2Z19mcmFtZV9yYXRlID0gYXZfaW52X3EoYy0+dnN0LT50aW1lX2Jhc2UpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYy0+dnN0LCA2NCwgYy0+c3lzLT50aW1lX2Jhc2UubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgYy0+c3lzLT50aW1lX2Jhc2UuZGVuKTsKKyAgICBjLT52c3QtPmF2Z19mcmFtZV9yYXRlID0gYXZfaW52X3EoYy0+dnN0LT50aW1lX2Jhc2UpOwogCi0gICAgICAgIC8qIGZpbmRpbmcgb3V0IFNBUiBpcyBhIGxpdHRsZSBiaXQgbWVzc3kgKi8KLSAgICAgICAgdnNjX3BhY2sgPSBkdl9leHRyYWN0X3BhY2soZnJhbWUsIGR2X3ZpZGVvX2NvbnRyb2wpOwotICAgICAgICBhcHQgICAgICA9IGZyYW1lWzRdICYgMHgwNzsKLSAgICAgICAgaXMxNl85ICAgPSAodnNjX3BhY2sgJiYgKCh2c2NfcGFja1syXSAmIDB4MDcpID09IDB4MDIgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICghYXB0ICYmICh2c2NfcGFja1syXSAmIDB4MDcpID09IDB4MDcpKSk7Ci0gICAgICAgIGMtPnZzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IGMtPnN5cy0+c2FyW2lzMTZfOV07Ci0gICAgICAgIGF2Y3R4LT5iaXRfcmF0ZSA9IGF2X3Jlc2NhbGVfcShjLT5zeXMtPmZyYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCkgeyA4LCAxIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zeXMtPnRpbWVfYmFzZSk7Ci0gICAgICAgIHNpemUgPSBjLT5zeXMtPmZyYW1lX3NpemU7Ci0gICAgfQotICAgIHJldHVybiBzaXplOworICAgIC8qIGZpbmRpbmcgb3V0IFNBUiBpcyBhIGxpdHRsZSBiaXQgbWVzc3kgKi8KKyAgICB2c2NfcGFjayA9IGR2X2V4dHJhY3RfcGFjayhmcmFtZSwgZHZfdmlkZW9fY29udHJvbCk7CisgICAgYXB0ICAgICAgPSBmcmFtZVs0XSAmIDB4MDc7CisgICAgaXMxNl85ICAgPSAodnNjX3BhY2sgJiYgKCh2c2NfcGFja1syXSAmIDB4MDcpID09IDB4MDIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFhcHQgJiYgKHZzY19wYWNrWzJdICYgMHgwNykgPT0gMHgwNykpKTsKKyAgICBjLT52c3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBjLT5zeXMtPnNhcltpczE2XzldOworICAgIHBhci0+Yml0X3JhdGUgPSBhdl9yZXNjYWxlX3EoYy0+c3lzLT5mcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCkgeyA4LCAxIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnN5cy0+dGltZV9iYXNlKTsKKyAgICByZXR1cm4gYy0+c3lzLT5mcmFtZV9zaXplOwogfQogCiBzdGF0aWMgaW50IGR2X2V4dHJhY3RfdGltZWNvZGUoRFZEZW11eENvbnRleHQqIGMsIGNvbnN0IHVpbnQ4X3QqIGZyYW1lLCBjaGFyICp0YykKQEAgLTM0MCw5ICszMzYsOSBAQAogICAgIH0KIAogICAgIGMtPmZjdHggICAgICAgICAgICAgICAgICAgPSBzOwotICAgIGMtPnZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgYy0+dnN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0RWVklERU87Ci0gICAgYy0+dnN0LT5jb2RlYy0+Yml0X3JhdGUgICA9IDI1MDAwMDAwOworICAgIGMtPnZzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgYy0+dnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0RWVklERU87CisgICAgYy0+dnN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgICA9IDI1MDAwMDAwOwogICAgIGMtPnZzdC0+c3RhcnRfdGltZSAgICAgICAgPSAwOwogCiAgICAgcmV0dXJuIGM7CkBAIC0zODQsNyArMzgwLDcgQEAKICAgICAgICAgYy0+YXVkaW9fcGt0W2ldLnBvcyAgPSBwb3M7CiAgICAgICAgIGMtPmF1ZGlvX3BrdFtpXS5zaXplID0gc2l6ZTsKICAgICAgICAgYy0+YXVkaW9fcGt0W2ldLnB0cyAgPSBjLT5hYnl0ZXMgKiAzMDAwMCAqIDggLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFzdFtpXS0+Y29kZWMtPmJpdF9yYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmFzdFtpXS0+Y29kZWNwYXItPmJpdF9yYXRlOwogICAgICAgICBwcGNtW2ldID0gYy0+YXVkaW9fYnVmW2ldOwogICAgIH0KICAgICBpZiAoYy0+YWNoKQpAQCAtNDIyLDEzICs0MTgsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwgaW50IGZsYWdzKQogewogICAgIC8vIEZJWE1FOiBzeXMgbWF5IGJlIHdyb25nIGlmIGxhc3QgZHZfcmVhZF9wYWNrZXQoKSBmYWlsZWQgKGJ1ZmZlciBpcyBqdW5rKQotICAgIGNvbnN0IEFWRFZQcm9maWxlICpzeXMgPSBhdl9kdl9jb2RlY19wcm9maWxlMihjLT52c3QtPmNvZGVjLT5jb2RlZF93aWR0aCwgYy0+dnN0LT5jb2RlYy0+Y29kZWRfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT52c3QtPmNvZGVjLT5waXhfZm10LCBjLT52c3QtPmNvZGVjLT50aW1lX2Jhc2UpOworICAgIGNvbnN0IGludCBmcmFtZV9zaXplID0gYy0+c3lzLT5mcmFtZV9zaXplOwogICAgIGludDY0X3Qgb2Zmc2V0OwogICAgIGludDY0X3Qgc2l6ZSAgICAgICA9IGF2aW9fc2l6ZShzLT5wYikgLSBzLT5pbnRlcm5hbC0+ZGF0YV9vZmZzZXQ7Ci0gICAgaW50NjRfdCBtYXhfb2Zmc2V0ID0gKChzaXplIC0gMSkgLyBzeXMtPmZyYW1lX3NpemUpICogc3lzLT5mcmFtZV9zaXplOworICAgIGludDY0X3QgbWF4X29mZnNldCA9ICgoc2l6ZSAtIDEpIC8gZnJhbWVfc2l6ZSkgKiBmcmFtZV9zaXplOwogCi0gICAgb2Zmc2V0ID0gc3lzLT5mcmFtZV9zaXplICogdGltZXN0YW1wOworICAgIG9mZnNldCA9IGZyYW1lX3NpemUgKiB0aW1lc3RhbXA7CiAKICAgICBpZiAoc2l6ZSA+PSAwICYmIG9mZnNldCA+IG1heF9vZmZzZXQpCiAgICAgICAgIG9mZnNldCA9IG1heF9vZmZzZXQ7CkBAIC00NDQsNyArNDM5LDcgQEAKICAgICBpZiAoYy0+YWNoKSB7CiAgICAgICAgIGlmIChjLT5zeXMpIHsKICAgICAgICAgYy0+YWJ5dGVzID0gYXZfcmVzY2FsZV9xKGMtPmZyYW1lcywgYy0+c3lzLT50aW1lX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCkgeyA4LCBjLT5hc3RbMF0tPmNvZGVjLT5iaXRfcmF0ZSB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKSB7IDgsIGMtPmFzdFswXS0+Y29kZWNwYXItPmJpdF9yYXRlIH0pOwogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgIGF2X2xvZyhjLT5mY3R4LCBBVl9MT0dfRVJST1IsICJjYW5ub3QgYWRqdXN0IGF1ZGlvIGJ5dGVzXG4iKTsKICAgICB9CkBAIC01MzksNyArNTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCkgeyA4LCAxIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+ZHZfZGVtdXgtPnN5cy0+dGltZV9iYXNlKTsKIAotICAgIGlmIChzLT5wYi0+c2Vla2FibGUpCisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKQogICAgICAgICBkdl9yZWFkX3RpbWVjb2RlKHMpOwogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9kdmJ0eHQuYyBiL2xpYmF2Zm9ybWF0L2R2YnR4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Mjg3MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9kdmJ0eHQuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogUkFXIGR2YiB0ZWxldGV4dCBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWFydG9uIEJhbG50IDxjdXNAcGFzc3dkLmh1PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9kdmJ0eHQuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmF3ZGVjLmgiCisKK3N0YXRpYyBpbnQgZHZidHh0X3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IHAtPmJ1ZiArIHAtPmJ1Zl9zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKworICAgIC8qIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgZGVtdXhlciBpcyB0byBkZXRlY3QgRFZCIHRlbGV0ZXh0IHN0cmVhbXMgaW4KKyAgICAgKiBtcGVndHMsIHNvIHdlIHJlamVjdCBpbnZhbGlkIGJ1ZmZlciBzaXplcyAqLworICAgIGlmICgocC0+YnVmX3NpemUgKyA0NSkgJSAxODQgIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIWZmX2RhdGFfaWRlbnRpZmllcl9pc190ZWxldGV4dChwLT5idWZbMF0pKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoYnVmID0gcC0+YnVmICsgMTsgYnVmIDwgZW5kOyBidWYgKz0gNDYpIHsKKyAgICAgICAgaWYgKCFmZl9kYXRhX3VuaXRfaWRfaXNfdGVsZXRleHQoYnVmWzBdKSAmJiBidWZbMF0gIT0gMHhmZikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoYnVmWzFdICE9IDB4MmMpICAgICAvLyBkYXRhX3VuaXRfbGVuZ3RoCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyAyOworfQorCitGRl9ERUZfUkFXU1VCX0RFTVVYRVIoZHZidHh0LCAiZHZidHh0IiwgZHZidHh0X3Byb2JlLCBOVUxMLCBBVl9DT0RFQ19JRF9EVkJfVEVMRVRFWFQsIDApCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9kdmVuYy5jIGIvbGliYXZmb3JtYXQvZHZlbmMuYwppbmRleCA2Y2VmZThiLi45M2MxMDNiIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9kdmVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2R2ZW5jLmMKQEAgLTM1LDEzICszNSwxNCBAQAogI2luY2x1ZGUgImxpYmF2Y29kZWMvZHZfcHJvZmlsZS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvZHYuaCIKICNpbmNsdWRlICJkdi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGltZWNvZGUuaCIKIAotI2RlZmluZSBNQVhfQVVESU9fRlJBTUVfU0laRSAxOTIwMDAgLy8gMSBzZWNvbmQgb2YgNDhraHogMzJiaXQgYXVkaW8KKyNkZWZpbmUgTUFYX0FVRElPX0ZSQU1FX1NJWkUgMTkyMDAwIC8vIDEgc2Vjb25kIG9mIDQ4a2h6IDMyLWJpdCBhdWRpbwogCiBzdHJ1Y3QgRFZNdXhDb250ZXh0IHsKICAgICBBVkNsYXNzICAgICAgICAgICphdl9jbGFzczsKQEAgLTEwNSwxMyArMTA2LDEzIEBACiAgICAgY2FzZSBkdl9hdWRpb19zb3VyY2U6ICAvKiBBQVVYIHNvdXJjZSBwYWNrICovCiAgICAgICAgIHZhX3N0YXJ0KGFwLCBidWYpOwogICAgICAgICBjaGFubmVsID0gdmFfYXJnKGFwLCBpbnQpOwotICAgICAgICBpZiAoYy0+YXN0W2NoYW5uZWxdLT5jb2RlYy0+c2FtcGxlX3JhdGUgPT0gNDQxMDApIHsKKyAgICAgICAgaWYgKGMtPmFzdFtjaGFubmVsXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID09IDQ0MTAwKSB7CiAgICAgICAgICAgICBhdWRpb190eXBlID0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChjLT5hc3RbY2hhbm5lbF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSA9PSAzMjAwMCkKKyAgICAgICAgfSBlbHNlIGlmIChjLT5hc3RbY2hhbm5lbF0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9PSAzMjAwMCkKICAgICAgICAgICAgIGF1ZGlvX3R5cGUgPSAyOwogICAgICAgICBidWZbMV0gPSAoMSA8PCA3KSB8IC8qIGxvY2tlZCBtb2RlIC0tIFNNUFRFIG9ubHkgc3VwcG9ydHMgbG9ja2VkIG1vZGUgKi8KICAgICAgICAgICAgICAgICAgKDEgPDwgNikgfCAvKiByZXNlcnZlZCAtLSBhbHdheXMgMSAqLwotICAgICAgICAgICAgICAgICAoZHZfYXVkaW9fZnJhbWVfc2l6ZShjLT5zeXMsIGMtPmZyYW1lcywgYy0+YXN0W2NoYW5uZWxdLT5jb2RlYy0+c2FtcGxlX3JhdGUpIC0KKyAgICAgICAgICAgICAgICAgKGR2X2F1ZGlvX2ZyYW1lX3NpemUoYy0+c3lzLCBjLT5mcmFtZXMsIGMtPmFzdFtjaGFubmVsXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKSAtCiAgICAgICAgICAgICAgICAgICBjLT5zeXMtPmF1ZGlvX21pbl9zYW1wbGVzW2F1ZGlvX3R5cGVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAjIG9mIHNhbXBsZXMgICAgICAqLwogICAgICAgICBidWZbMl0gPSAoMCA8PCA3KSB8IC8qIG11bHRpLXN0ZXJlbyAgICAgICovCkBAIC0xMjUsNyArMTI2LDcgQEAKICAgICAgICAgYnVmWzRdID0gKDEgPDwgNykgfCAvKiBlbXBoYXNpczogMSAtLSBvZmYgKi8KICAgICAgICAgICAgICAgICAgKDAgPDwgNikgfCAvKiBlbXBoYXNpcyB0aW1lIGNvbnN0YW50OiAwIC0tIHJlc2VydmVkICovCiAgICAgICAgICAgICAgICAgIChhdWRpb190eXBlIDw8IDMpIHwgLyogZnJlcXVlbmN5OiAwIC0tIDQ4a0h6LCAxIC0tIDQ0LDFrSHosIDIgLS0gMzJrSHogKi8KLSAgICAgICAgICAgICAgICAgIDA7ICAgICAgICAvKiBxdWFudGl6YXRpb246IDAgLS0gMTZiaXQgbGluZWFyLCAxIC0tIDEyYml0IG5vbmxpbmVhciAqLworICAgICAgICAgICAgICAgICAgMDsgICAgICAgIC8qIHF1YW50aXphdGlvbjogMCAtLSAxNi1iaXQgbGluZWFyLCAxIC0tIDEyLWJpdCBub25saW5lYXIgKi8KIAogICAgICAgICB2YV9lbmQoYXApOwogICAgICAgICBicmVhazsKQEAgLTE4Niw3ICsxODcsNyBAQAogc3RhdGljIHZvaWQgZHZfaW5qZWN0X2F1ZGlvKERWTXV4Q29udGV4dCAqYywgaW50IGNoYW5uZWwsIHVpbnQ4X3QqIGZyYW1lX3B0cikKIHsKICAgICBpbnQgaSwgaiwgZCwgb2YsIHNpemU7Ci0gICAgc2l6ZSA9IDQgKiBkdl9hdWRpb19mcmFtZV9zaXplKGMtPnN5cywgYy0+ZnJhbWVzLCBjLT5hc3RbY2hhbm5lbF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgc2l6ZSA9IDQgKiBkdl9hdWRpb19mcmFtZV9zaXplKGMtPnN5cywgYy0+ZnJhbWVzLCBjLT5hc3RbY2hhbm5lbF0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgZnJhbWVfcHRyICs9IGNoYW5uZWwgKiBjLT5zeXMtPmRpZnNlZ19zaXplICogMTUwICogODA7CiAgICAgZm9yIChpID0gMDsgaSA8IGMtPnN5cy0+ZGlmc2VnX3NpemU7IGkrKykgewogICAgICAgICBmcmFtZV9wdHIgKz0gNiAqIDgwOyAvKiBza2lwIERJRiBzZWdtZW50IGhlYWRlciAqLwpAQCAtMjM4LDIwICsyMzksMjEgQEAKICAqIFRoZSBmb2xsb3dpbmcgMyBmdW5jdGlvbnMgY29uc3RpdHV0ZSBvdXIgaW50ZXJmYWNlIHRvIHRoZSB3b3JsZAogICovCiAKLXN0YXRpYyBpbnQgZHZfYXNzZW1ibGVfZnJhbWUoRFZNdXhDb250ZXh0ICpjLCBBVlN0cmVhbSogc3QsCitzdGF0aWMgaW50IGR2X2Fzc2VtYmxlX2ZyYW1lKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFZNdXhDb250ZXh0ICpjLCBBVlN0cmVhbSogc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEsIGludCBkYXRhX3NpemUsIHVpbnQ4X3QqKiBmcmFtZSkKIHsKICAgICBpbnQgaSwgcmVxYXNpemU7CiAKICAgICAqZnJhbWUgPSAmYy0+ZnJhbWVfYnVmWzBdOwogCi0gICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICBzd2l0Y2ggKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSkgewogICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgogICAgICAgICAvKiBGSVhNRTogd2UgaGF2ZSB0byBoYXZlIG1vcmUgc2Vuc2libGUgYXBwcm9hY2ggdGhhbiB0aGlzIG9uZSAqLwogICAgICAgICBpZiAoYy0+aGFzX3ZpZGVvKQotICAgICAgICAgICAgYXZfbG9nKHN0LT5jb2RlYywgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgcHJvY2VzcyBEViBmcmFtZSAjJWQuIEluc3VmZmljaWVudCBhdWRpbyBkYXRhIG9yIHNldmVyZSBzeW5jIHByb2JsZW0uXG4iLCBjLT5mcmFtZXMpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbid0IHByb2Nlc3MgRFYgZnJhbWUgIyVkLiBJbnN1ZmZpY2llbnQgYXVkaW8gZGF0YSBvciBzZXZlcmUgc3luYyBwcm9ibGVtLlxuIiwgYy0+ZnJhbWVzKTsKICAgICAgICAgaWYgKGRhdGFfc2l6ZSAhPSBjLT5zeXMtPmZyYW1lX3NpemUpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzdC0+Y29kZWMsIEFWX0xPR19FUlJPUiwgIlVuZXhwZWN0ZWQgZnJhbWUgc2l6ZSwgJWQgIT0gJWRcbiIsCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5leHBlY3RlZCBmcmFtZSBzaXplLCAlZCAhPSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUsIGMtPnN5cy0+ZnJhbWVfc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogICAgICAgICB9CkBAIC0yNjQsMTAgKzI2NiwxMCBAQAogCiAgICAgICAgICAgLyogRklYTUU6IHdlIGhhdmUgdG8gaGF2ZSBtb3JlIHNlbnNpYmxlIGFwcHJvYWNoIHRoYW4gdGhpcyBvbmUgKi8KICAgICAgICAgaWYgKGF2X2ZpZm9fc2l6ZShjLT5hdWRpb19kYXRhW2ldKSArIGRhdGFfc2l6ZSA+PSAxMDAqTUFYX0FVRElPX0ZSQU1FX1NJWkUpCi0gICAgICAgICAgICBhdl9sb2coc3QtPmNvZGVjLCBBVl9MT0dfRVJST1IsICJDYW4ndCBwcm9jZXNzIERWIGZyYW1lICMlZC4gSW5zdWZmaWNpZW50IHZpZGVvIGRhdGEgb3Igc2V2ZXJlIHN5bmMgcHJvYmxlbS5cbiIsIGMtPmZyYW1lcyk7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgcHJvY2VzcyBEViBmcmFtZSAjJWQuIEluc3VmZmljaWVudCB2aWRlbyBkYXRhIG9yIHNldmVyZSBzeW5jIHByb2JsZW0uXG4iLCBjLT5mcmFtZXMpOwogICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoYy0+YXVkaW9fZGF0YVtpXSwgZGF0YSwgZGF0YV9zaXplLCBOVUxMKTsKIAotICAgICAgICByZXFhc2l6ZSA9IDQgKiBkdl9hdWRpb19mcmFtZV9zaXplKGMtPnN5cywgYy0+ZnJhbWVzLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmVxYXNpemUgPSA0ICogZHZfYXVkaW9fZnJhbWVfc2l6ZShjLT5zeXMsIGMtPmZyYW1lcywgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICAgICAgLyogTGV0IHVzIHNlZSBpZiB3ZSd2ZSBnb3QgZW5vdWdoIGF1ZGlvIGZvciBvbmUgRFYgZnJhbWUuICovCiAgICAgICAgIGMtPmhhc19hdWRpbyB8PSAoKHJlcWFzaXplIDw9IGF2X2ZpZm9fc2l6ZShjLT5hdWRpb19kYXRhW2ldKSkgPDwgaSk7CkBAIC0yODMsNyArMjg1LDcgQEAKICAgICAgICAgYy0+aGFzX2F1ZGlvID0gMDsKICAgICAgICAgZm9yIChpPTA7IGkgPCBjLT5uX2FzdDsgaSsrKSB7CiAgICAgICAgICAgICBkdl9pbmplY3RfYXVkaW8oYywgaSwgKmZyYW1lKTsKLSAgICAgICAgICAgIHJlcWFzaXplID0gNCAqIGR2X2F1ZGlvX2ZyYW1lX3NpemUoYy0+c3lzLCBjLT5mcmFtZXMsIGMtPmFzdFtpXS0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIHJlcWFzaXplID0gNCAqIGR2X2F1ZGlvX2ZyYW1lX3NpemUoYy0+c3lzLCBjLT5mcmFtZXMsIGMtPmFzdFtpXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKICAgICAgICAgICAgIGF2X2ZpZm9fZHJhaW4oYy0+YXVkaW9fZGF0YVtpXSwgcmVxYXNpemUpOwogICAgICAgICAgICAgYy0+aGFzX2F1ZGlvIHw9ICgocmVxYXNpemUgPD0gYXZfZmlmb19zaXplKGMtPmF1ZGlvX2RhdGFbaV0pKSA8PCBpKTsKICAgICAgICAgfQpAQCAtMzEzLDcgKzMxNSw3IEBACiAKICAgICAvKiBXZSBoYXZlIHRvIHNvcnQgb3V0IHdoZXJlIGF1ZGlvIGFuZCB3aGVyZSB2aWRlbyBzdHJlYW0gaXMgKi8KICAgICBmb3IgKGk9MDsgaTxzLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgc3dpdGNoIChzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfdHlwZSkgeworICAgICAgICBzd2l0Y2ggKHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlKSB7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgogICAgICAgICAgICAgaWYgKHZzdCkgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB2c3QgPSBzLT5zdHJlYW1zW2ldOwpAQCAtMzI4LDI4ICszMzAsMjggQEAKICAgICB9CiAKICAgICAvKiBTb21lIGNoZWNrcyAtLSBEViBmb3JtYXQgaXMgdmVyeSBwaWNreSBhYm91dCBpdHMgaW5jb21pbmcgc3RyZWFtcyAqLwotICAgIGlmICghdnN0IHx8IHZzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0RWVklERU8pCisgICAgaWYgKCF2c3QgfHwgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfRFZWSURFTykKICAgICAgICAgZ290byBiYWlsX291dDsKICAgICBmb3IgKGk9MDsgaTxjLT5uX2FzdDsgaSsrKSB7CiAgICAgICAgIGlmIChjLT5hc3RbaV0pIHsKLSAgICAgICAgICAgIGlmKGMtPmFzdFtpXS0+Y29kZWMtPmNvZGVjX2lkICAgICE9IEFWX0NPREVDX0lEX1BDTV9TMTZMRSB8fAotICAgICAgICAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+Y2hhbm5lbHMgICAgIT0gMikKKyAgICAgICAgICAgIGlmKGMtPmFzdFtpXS0+Y29kZWNwYXItPmNvZGVjX2lkICAgICE9IEFWX0NPREVDX0lEX1BDTV9TMTZMRSB8fAorICAgICAgICAgICAgICAgYy0+YXN0W2ldLT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgIT0gMikKICAgICAgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OwotICAgICAgICAgICAgaWYgKGMtPmFzdFtpXS0+Y29kZWMtPnNhbXBsZV9yYXRlICE9IDQ4MDAwICYmCi0gICAgICAgICAgICAgICAgYy0+YXN0W2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUgIT0gNDQxMDAgJiYKLSAgICAgICAgICAgICAgICBjLT5hc3RbaV0tPmNvZGVjLT5zYW1wbGVfcmF0ZSAhPSAzMjAwMCAgICApCisgICAgICAgICAgICBpZiAoYy0+YXN0W2ldLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgIT0gNDgwMDAgJiYKKyAgICAgICAgICAgICAgICBjLT5hc3RbaV0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAhPSA0NDEwMCAmJgorICAgICAgICAgICAgICAgIGMtPmFzdFtpXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICE9IDMyMDAwICAgICkKICAgICAgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OwogICAgICAgICB9CiAgICAgfQotICAgIGMtPnN5cyA9IGF2X2R2X2NvZGVjX3Byb2ZpbGUyKHZzdC0+Y29kZWMtPndpZHRoLCB2c3QtPmNvZGVjLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnN0LT5jb2RlYy0+cGl4X2ZtdCwgdnN0LT5jb2RlYy0+dGltZV9iYXNlKTsKKyAgICBjLT5zeXMgPSBhdl9kdl9jb2RlY19wcm9maWxlMih2c3QtPmNvZGVjcGFyLT53aWR0aCwgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmZvcm1hdCwgdnN0LT50aW1lX2Jhc2UpOwogICAgIGlmICghYy0+c3lzKQogICAgICAgICBnb3RvIGJhaWxfb3V0OwogCiAgICAgaWYgKChjLT5zeXMtPnRpbWVfYmFzZS5kZW4gIT0gMjUgJiYgYy0+c3lzLT50aW1lX2Jhc2UuZGVuICE9IDUwKSB8fCBjLT5zeXMtPnRpbWVfYmFzZS5udW0gIT0gMSkgewotICAgICAgICBpZiAoYy0+YXN0WzBdICYmIGMtPmFzdFswXS0+Y29kZWMtPnNhbXBsZV9yYXRlICE9IDQ4MDAwKQorICAgICAgICBpZiAoYy0+YXN0WzBdICYmIGMtPmFzdFswXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICE9IDQ4MDAwKQogICAgICAgICAgICAgZ290byBiYWlsX291dDsKLSAgICAgICAgaWYgKGMtPmFzdFsxXSAmJiBjLT5hc3RbMV0tPmNvZGVjLT5zYW1wbGVfcmF0ZSAhPSA0ODAwMCkKKyAgICAgICAgaWYgKGMtPmFzdFsxXSAmJiBjLT5hc3RbMV0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAhPSA0ODAwMCkKICAgICAgICAgICAgIGdvdG8gYmFpbF9vdXQ7CiAgICAgfQogCkBAIC00MjAsNyArNDIyLDcgQEAKICAgICB1aW50OF90KiBmcmFtZTsKICAgICBpbnQgZnNpemU7CiAKLSAgICBmc2l6ZSA9IGR2X2Fzc2VtYmxlX2ZyYW1lKHMtPnByaXZfZGF0YSwgcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0sCisgICAgZnNpemUgPSBkdl9hc3NlbWJsZV9mcmFtZShzLCBzLT5wcml2X2RhdGEsIHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5kYXRhLCBwa3QtPnNpemUsICZmcmFtZSk7CiAgICAgaWYgKGZzaXplID4gMCkgewogICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBmcmFtZSwgZnNpemUpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZHhhLmMgYi9saWJhdmZvcm1hdC9keGEuYwppbmRleCAxYTU4MjJhLi41MDE5MzkwIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9keGEuYworKysgYi9saWJhdmZvcm1hdC9keGEuYwpAQCAtMTA2LDExICsxMDYsMTEgQEAKICAgICAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICAgICAgaWYgKCFhc3QpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICByZXQgPSBmZl9nZXRfd2F2X2hlYWRlcihzLCBwYiwgYXN0LT5jb2RlYywgZnNpemUsIDApOworICAgICAgICByZXQgPSBmZl9nZXRfd2F2X2hlYWRlcihzLCBwYiwgYXN0LT5jb2RlY3BhciwgZnNpemUsIDApOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmIChhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA+IDApCi0gICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgNjQsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgaWYgKGFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID4gMCkKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgICAgICAvLyBmaW5kICdkYXRhJyBjaHVuawogICAgICAgICB3aGlsZShhdmlvX3RlbGwocGIpIDwgYy0+dmlkcG9zICYmICFhdmlvX2Zlb2YocGIpKXsKICAgICAgICAgICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CkBAIC0xMTksMTggKzExOSwxOCBAQAogICAgICAgICAgICAgYXZpb19za2lwKHBiLCBmc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgYy0+YnBjID0gKGZzaXplICsgYy0+ZnJhbWVzIC0gMSkgLyBjLT5mcmFtZXM7Ci0gICAgICAgIGlmKGFzdC0+Y29kZWMtPmJsb2NrX2FsaWduKQotICAgICAgICAgICAgYy0+YnBjID0gKChjLT5icGMgKyBhc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAtIDEpIC8gYXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pICogYXN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgIGlmKGFzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKQorICAgICAgICAgICAgYy0+YnBjID0gKChjLT5icGMgKyBhc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAtIDEpIC8gYXN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pICogYXN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ247CiAgICAgICAgIGMtPmJ5dGVzX2xlZnQgPSBmc2l6ZTsKICAgICAgICAgYy0+d2F2cG9zID0gYXZpb190ZWxsKHBiKTsKICAgICAgICAgYXZpb19zZWVrKHBiLCBjLT52aWRwb3MsIFNFRUtfU0VUKTsKICAgICB9CiAKICAgICAvKiBub3cgd2UgYXJlIHJlYWR5OiBidWlsZCBmb3JtYXQgc3RyZWFtcyAqLwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9EWEE7Ci0gICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gdzsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBoOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9EWEE7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgID0gdzsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBoOwogICAgIGF2X3JlZHVjZSgmZGVuLCAmbnVtLCBkZW4sIG51bSwgKDFVTDw8MzEpLTEpOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCBudW0sIGRlbik7CiAgICAgLyogZmxhZ3MgJiAweDgwIG1lYW5zIHRoYXQgaW1hZ2UgaXMgaW50ZXJsYWNlZCwKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAqIGVpdGhlciB3YXkgc2V0IHRydWUgaGVpZ2h0CiAgICAgICovCiAgICAgaWYoZmxhZ3MgJiAweEMwKXsKLSAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPj49IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID4+PSAxOwogICAgIH0KICAgICBjLT5yZWFkdmlkID0gIWMtPmhhc19zb3VuZDsKICAgICBjLT52aWRwb3MgID0gYXZpb190ZWxsKHBiKTsKQEAgLTE3MSwxMSArMTcxLDEzIEBACiAgICAgfQogICAgIGF2aW9fc2VlayhzLT5wYiwgYy0+dmlkcG9zLCBTRUVLX1NFVCk7CiAgICAgd2hpbGUoIWF2aW9fZmVvZihzLT5wYikgJiYgYy0+ZnJhbWVzKXsKKyAgICAgICAgdWludDMyX3QgdGFnOwogICAgICAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChzLT5wYiwgYnVmLCA0KSkgIT0gNCkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImZhaWxlZCByZWFkaW5nIGNodW5rIHR5cGVcbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9Ci0gICAgICAgIHN3aXRjaChBVl9STDMyKGJ1ZikpeworICAgICAgICB0YWcgPSBBVl9STDMyKGJ1Zik7CisgICAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgIGNhc2UgTUtUQUcoJ04nLCAnVScsICdMJywgJ0wnKToKICAgICAgICAgICAgIGlmKGF2X25ld19wYWNrZXQocGt0LCA0ICsgcGFsX3NpemUpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpAQCAtMjE3LDcgKzIxOSw3IEBACiAgICAgICAgICAgICBjLT5yZWFkdmlkID0gMDsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVua25vd24gdGFnICVjJWMlYyVjXG4iLCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10pOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVua25vd24gdGFnICVzXG4iLCBhdl9mb3VyY2Myc3RyKHRhZykpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9lYWNkYXRhLmMgYi9saWJhdmZvcm1hdC9lYWNkYXRhLmMKaW5kZXggMTY1ZmYxYS4uOTdlYjY2ZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZWFjZGF0YS5jCisrKyBiL2xpYmF2Zm9ybWF0L2VhY2RhdGEuYwpAQCAtNzAsMTIgKzcwLDEyIEBACiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgLyogbm8gZm91cmNjICovCi0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0VBX1hBUzsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gY2RhdGEtPmNoYW5uZWxzOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBjaGFubmVsX2xheW91dDsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0VBX1hBUzsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gY2RhdGEtPmNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBjaGFubmVsX2xheW91dDsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNhbXBsZV9yYXRlKTsKIAogICAgIGNkYXRhLT5hdWRpb19wdHMgPSAwOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZWxlY3Ryb25pY2FydHMuYyBiL2xpYmF2Zm9ybWF0L2VsZWN0cm9uaWNhcnRzLmMKaW5kZXggODYwMTc4Mi4uYmZkM2ZlZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZWxlY3Ryb25pY2FydHMuYworKysgYi9saWJhdmZvcm1hdC9lbGVjdHJvbmljYXJ0cy5jCkBAIC0xLDUgKzEsNSBAQAogLyogRWxlY3Ryb25pYyBBcnRzIE11bHRpbWVkaWEgRmlsZSBEZW11eGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgIFRoZSBGRm1wZWcgcHJvamVjdAogICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggUGV0ZXIgUm9zcwogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KQEAgLTQ5OSwxNCArNDk5LDE0IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB2aWRlby0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IHZpZGVvLT5jb2RlYzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSB2aWRlby0+Y29kZWM7CiAgICAgLy8gcGFyc2luZyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBGRm1wZWcgZ2VuZXJhdGUgY29ycmVjdCB0aW1lc3RhbXBzCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKQogICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgID0gMDsgLyogbm8gZm91cmNjICovCi0gICAgc3QtPmNvZGVjLT53aWR0aCAgICAgICA9IHZpZGVvLT53aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgID0gdmlkZW8tPmhlaWdodDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgID0gMDsgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgICA9IHZpZGVvLT53aWR0aDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgID0gdmlkZW8tPmhlaWdodDsKICAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgID0gc3QtPm5iX2ZyYW1lcyA9IHZpZGVvLT5uYl9mcmFtZXM7CiAgICAgaWYgKHZpZGVvLT50aW1lX2Jhc2UubnVtKQogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgdmlkZW8tPnRpbWVfYmFzZS5udW0sIHZpZGVvLT50aW1lX2Jhc2UuZGVuKTsKQEAgLTUzOSw3ICs1MzksNyBAQAogICAgICAgICAgICAgZWEtPmF1ZGlvX2NvZGVjID0gMDsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICB9Ci0gICAgICAgIGlmIChlYS0+Ynl0ZXMgPD0gMCkgeworICAgICAgICBpZiAoZWEtPmJ5dGVzIDw9IDAgfHwgZWEtPmJ5dGVzID4gMikgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZTogJWRcbiIsIGVhLT5ieXRlcyk7CiAgICAgICAgICAgICBlYS0+YXVkaW9fY29kZWMgPSBBVl9DT0RFQ19JRF9OT05FOwpAQCAtNTUxLDE3ICs1NTEsMTcgQEAKICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCBlYS0+c2FtcGxlX3JhdGUpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBlYS0+YXVkaW9fY29kZWM7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgICAgICAgID0gMDsgICAvKiBubyB0YWcgKi8KLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgICAgICAgPSBlYS0+bnVtX2NoYW5uZWxzOwotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICAgICAgICA9IGVhLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBlYS0+Ynl0ZXMgKiA4OwotICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICAgICAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gNDsKLSAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAgICAgICAgICAgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgICAgICAgID0gZWEtPmF1ZGlvX2NvZGVjOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgICAgICAgICAgICA9IDA7ICAgLyogbm8gdGFnICovCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gZWEtPm51bV9jaGFubmVsczsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSBlYS0+c2FtcGxlX3JhdGU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gZWEtPmJ5dGVzICogODsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICAgICAgICAgICAgPSAoaW50NjRfdClzdC0+Y29kZWNwYXItPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAvIDQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gICAgICAgICAgID0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CiAgICAgICAgIGVhLT5hdWRpb19zdHJlYW1faW5kZXggICAgICAgICAgID0gc3QtPmluZGV4OwogICAgICAgICBzdC0+c3RhcnRfdGltZSAgICAgICAgICAgICAgICAgICA9IDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZXBhZmRlYy5jIGIvbGliYXZmb3JtYXQvZXBhZmRlYy5jCmluZGV4IGM3Mzc4OTIuLjBjZDk2MjcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2VwYWZkZWMuYworKysgYi9saWJhdmZvcm1hdC9lcGFmZGVjLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAicGNtLmgiCkBAIC01OSwyMiArNjAsMjIgQEAKICAgICAgICAgY2hhbm5lbHMgICAgPSBhdmlvX3JiMzIocy0+cGIpOwogICAgIH0KIAotICAgIGlmICghY2hhbm5lbHMgfHwgIXNhbXBsZV9yYXRlKQorICAgIGlmIChjaGFubmVscyA8PSAwIHx8IGNoYW5uZWxzID4gRkZfU0FORV9OQl9DSEFOTkVMUyB8fCBzYW1wbGVfcmF0ZSA8PSAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gY2hhbm5lbHM7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKICAgICBzd2l0Y2ggKGNvZGVjKSB7CiAgICAgY2FzZSAwOgotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gbGUgPyBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgOiBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBsZSA/IEFWX0NPREVDX0lEX1BDTV9TMTZMRSA6IEFWX0NPREVDX0lEX1BDTV9TMTZCRTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyOgotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1M4OworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1M4OwogICAgICAgICBicmVhazsKICAgICBjYXNlIDE6CiAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiMjQtYml0IFBhcmlzIFBDTSBmb3JtYXQiKTsKQEAgLTgyLDEwICs4MywxMCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCk7Ci0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVscyAvIDg7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOworICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgLyA4OwogCi0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIGlmIChhdmlvX3NraXAocy0+cGIsIDIwMjQpIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9mZm0uaCBiL2xpYmF2Zm9ybWF0L2ZmbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDQ1ZjQ3Li4wMDAwMDAwCi0tLSBhL2xpYmF2Zm9ybWF0L2ZmbS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqIEZGTSAoZmZzZXJ2ZXIgbGl2ZSBmZWVkKSBjb21tb24gaGVhZGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgRmFicmljZSBCZWxsYXJkCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZGT1JNQVRfRkZNX0gKLSNkZWZpbmUgQVZGT1JNQVRfRkZNX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgImF2Zm9ybWF0LmgiCi0jaW5jbHVkZSAiYXZpby5oIgotCi0vKiBUaGUgRkZNIGZpbGUgaXMgbWFkZSBvZiBibG9ja3Mgb2YgZml4ZWQgc2l6ZSAqLwotI2RlZmluZSBGRk1fSEVBREVSX1NJWkUgMTQKLSNkZWZpbmUgRkZNX1BBQ0tFVF9TSVpFIDQwOTYKLSNkZWZpbmUgUEFDS0VUX0lEICAgICAgIDB4NjY2ZAotCi0vKiBlYWNoIHBhY2tldCBjb250YWlucyBmcmFtZXMgKHdoaWNoIGNhbiBzcGFuIHNldmVyYWwgcGFja2V0cyAqLwotI2RlZmluZSBGUkFNRV9IRUFERVJfU0laRSAgICAxNgotI2RlZmluZSBGTEFHX0tFWV9GUkFNRSAgICAgICAweDAxCi0jZGVmaW5lIEZMQUdfRFRTICAgICAgICAgICAgIDB4MDIKLQotZW51bSB7Ci0gICAgUkVBRF9IRUFERVIsCi0gICAgUkVBRF9EQVRBLAotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgRkZNQ29udGV4dCB7Ci0gICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Ci0gICAgLyogb25seSByZWFkaW5nIG1vZGUgKi8KLSAgICBpbnQ2NF90IHdyaXRlX2luZGV4LCBmaWxlX3NpemU7Ci0gICAgaW50IHJlYWRfc3RhdGU7Ci0gICAgdWludDhfdCBoZWFkZXJbRlJBTUVfSEVBREVSX1NJWkUrNF07Ci0KLSAgICAvKiByZWFkIGFuZCB3cml0ZSAqLwotICAgIGludCBmaXJzdF9wYWNrZXQ7IC8qIHRydWUgaWYgZmlyc3QgcGFja2V0LCBuZWVkZWQgdG8gc2V0IHRoZSBkaXNjb250aW51aXR5IHRhZyAqLwotICAgIGludCBwYWNrZXRfc2l6ZTsKLSAgICBpbnQgZnJhbWVfb2Zmc2V0OwotICAgIGludDY0X3QgZHRzOwotICAgIHVpbnQ4X3QgKnBhY2tldF9wdHIsICpwYWNrZXRfZW5kOwotICAgIHVpbnQ4X3QgcGFja2V0W0ZGTV9QQUNLRVRfU0laRV07Ci0gICAgaW50NjRfdCBzdGFydF90aW1lOwotICAgIGludCBzZXJ2ZXJfYXR0YWNoZWQ7Ci19IEZGTUNvbnRleHQ7Ci0KLSNlbmRpZiAvKiBBVkZPUk1BVF9GRk1fSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZmZtZGVjLmMgYi9saWJhdmZvcm1hdC9mZm1kZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjNTE4Zi4uMDAwMDAwMAotLS0gYS9saWJhdmZvcm1hdC9mZm1kZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDc5OSArMCwwIEBACi0vKgotICogRkZNIChmZnNlcnZlciBsaXZlIGZlZWQpIGRlbXV4ZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKLSNpbmNsdWRlICJhdmZvcm1hdC5oIgotI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAiZmZtLmgiCi0jaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgotCi1zdGF0aWMgaW50IGZmbV9pc19hdmFpbF9kYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHNpemUpCi17Ci0gICAgRkZNQ29udGV4dCAqZmZtID0gcy0+cHJpdl9kYXRhOwotICAgIGludDY0X3QgcG9zLCBhdmFpbF9zaXplOwotICAgIHB0cmRpZmZfdCBsZW47Ci0KLSAgICBsZW4gPSBmZm0tPnBhY2tldF9lbmQgLSBmZm0tPnBhY2tldF9wdHI7Ci0gICAgaWYgKHNpemUgPD0gbGVuKQotICAgICAgICByZXR1cm4gMTsKLSAgICBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOwotICAgIGlmICghZmZtLT53cml0ZV9pbmRleCkgewotICAgICAgICBpZiAocG9zID09IGZmbS0+ZmlsZV9zaXplKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwotICAgICAgICBhdmFpbF9zaXplID0gZmZtLT5maWxlX3NpemUgLSBwb3M7Ci0gICAgfSBlbHNlIHsKLSAgICBpZiAocG9zID09IGZmbS0+d3JpdGVfaW5kZXgpIHsKLSAgICAgICAgLyogZXhhY3RseSBhdCB0aGUgZW5kIG9mIHN0cmVhbSAqLwotICAgICAgICBpZiAoZmZtLT5zZXJ2ZXJfYXR0YWNoZWQpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9IGVsc2UgaWYgKHBvcyA8IGZmbS0+d3JpdGVfaW5kZXgpIHsKLSAgICAgICAgYXZhaWxfc2l6ZSA9IGZmbS0+d3JpdGVfaW5kZXggLSBwb3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZhaWxfc2l6ZSA9IChmZm0tPmZpbGVfc2l6ZSAtIHBvcykgKyAoZmZtLT53cml0ZV9pbmRleCAtIEZGTV9QQUNLRVRfU0laRSk7Ci0gICAgfQotICAgIH0KLSAgICBhdmFpbF9zaXplID0gKGF2YWlsX3NpemUgLyBmZm0tPnBhY2tldF9zaXplKSAqIChmZm0tPnBhY2tldF9zaXplIC0gRkZNX0hFQURFUl9TSVpFKSArIGxlbjsKLSAgICBpZiAoc2l6ZSA8PSBhdmFpbF9zaXplKQotICAgICAgICByZXR1cm4gMTsKLSAgICBlbHNlIGlmIChmZm0tPnNlcnZlcl9hdHRhY2hlZCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotfQotCi1zdGF0aWMgaW50IGZmbV9yZXN5bmMoQVZGb3JtYXRDb250ZXh0ICpzLCB1aW50MzJfdCBzdGF0ZSkKLXsKLSAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAicmVzeW5jaW5nXG4iKTsKLSAgICB3aGlsZSAoc3RhdGUgIT0gUEFDS0VUX0lEKSB7Ci0gICAgICAgIGlmIChhdmlvX2Zlb2Yocy0+cGIpKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY2Fubm90IGZpbmQgRkZNIHN5bmN3b3JkXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGF2aW9fcjgocy0+cGIpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogZmlyc3QgaXMgdHJ1ZSBpZiB3ZSByZWFkIHRoZSBmcmFtZSBoZWFkZXIgKi8KLXN0YXRpYyBpbnQgZmZtX3JlYWRfZGF0YShBVkZvcm1hdENvbnRleHQgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwgaW50IGhlYWRlcikKLXsKLSAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7Ci0gICAgaW50IGZpbGxfc2l6ZSwgc2l6ZTEsIGZyYW1lX29mZnNldDsKLSAgICB1aW50MzJfdCBpZDsKLSAgICBwdHJkaWZmX3QgbGVuOwotICAgIGludDY0X3QgbGFzdF9wb3MgPSAtMTsKLQotICAgIHNpemUxID0gc2l6ZTsKLSAgICB3aGlsZSAoc2l6ZSA+IDApIHsKLSAgICByZWRvOgotICAgICAgICBsZW4gPSBmZm0tPnBhY2tldF9lbmQgLSBmZm0tPnBhY2tldF9wdHI7Ci0gICAgICAgIGlmIChsZW4gPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBpZiAobGVuID4gc2l6ZSkKLSAgICAgICAgICAgIGxlbiA9IHNpemU7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgICAgaWYgKGF2aW9fdGVsbChwYikgPT0gZmZtLT5maWxlX3NpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmZtLT5zZXJ2ZXJfYXR0YWNoZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBmZm0tPnBhY2tldF9zaXplLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKLSAgICAgICAgICAgIH0KLSAgICByZXRyeV9yZWFkOgotICAgICAgICAgICAgaWYgKHBiLT5idWZmZXJfc2l6ZSAhPSBmZm0tPnBhY2tldF9zaXplKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCB0ZWxsID0gYXZpb190ZWxsKHBiKTsKLSAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZmZpb19zZXRfYnVmX3NpemUocGIsIGZmbS0+cGFja2V0X3NpemUpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgdGVsbCwgU0VFS19TRVQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWQgPSBhdmlvX3JiMTYocGIpOyAvKiBQQUNLRVRfSUQgKi8KLSAgICAgICAgICAgIGlmIChpZCAhPSBQQUNLRVRfSUQpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmZtX3Jlc3luYyhzLCBpZCkgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgbGFzdF9wb3MgPSBhdmlvX3RlbGwocGIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmlsbF9zaXplID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgICAgIGZmbS0+ZHRzID0gYXZpb19yYjY0KHBiKTsKLSAgICAgICAgICAgIGZyYW1lX29mZnNldCA9IGF2aW9fcmIxNihwYik7Ci0gICAgICAgICAgICBhdmlvX3JlYWQocGIsIGZmbS0+cGFja2V0LCBmZm0tPnBhY2tldF9zaXplIC0gRkZNX0hFQURFUl9TSVpFKTsKLSAgICAgICAgICAgIGlmIChmZm0tPnBhY2tldF9zaXplIDwgRkZNX0hFQURFUl9TSVpFICsgZmlsbF9zaXplIHx8IGZyYW1lX29mZnNldCA8IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmZm0tPnBhY2tldF9lbmQgPSBmZm0tPnBhY2tldCArIChmZm0tPnBhY2tldF9zaXplIC0gRkZNX0hFQURFUl9TSVpFIC0gZmlsbF9zaXplKTsKLSAgICAgICAgICAgIC8qIGlmIGZpcnN0IHBhY2tldCBvciByZXN5bmNocm9uaXphdGlvbiBwYWNrZXQsIHdlIG11c3QKLSAgICAgICAgICAgICAgIGhhbmRsZSBpdCBzcGVjaWZpY2FsbHkgKi8KLSAgICAgICAgICAgIGlmIChmZm0tPmZpcnN0X3BhY2tldCB8fCAoZnJhbWVfb2Zmc2V0ICYgMHg4MDAwKSkgewotICAgICAgICAgICAgICAgIGlmICghZnJhbWVfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgcGFja2V0IGhhcyBubyBmcmFtZSBoZWFkZXJzIGluIGl0ICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChhdmlvX3RlbGwocGIpID49IGZmbS0+cGFja2V0X3NpemUgKiAzTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2Vla2JhY2sgPSBGRk1JTihmZm0tPnBhY2tldF9zaXplICogMkxMLCBhdmlvX3RlbGwocGIpIC0gbGFzdF9wb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2Vla2JhY2sgPSBGRk1BWChzZWVrYmFjaywgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIC1zZWVrYmFjaywgU0VFS19DVVIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeV9yZWFkOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgaXMgYmFkLCB3ZSBjYW5ub3QgZmluZCBhIHZhbGlkIGZyYW1lIGhlYWRlciAqLwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmZtLT5maXJzdF9wYWNrZXQgPSAwOwotICAgICAgICAgICAgICAgIGlmICgoZnJhbWVfb2Zmc2V0ICYgMHg3ZmZmKSA8IEZGTV9IRUFERVJfU0laRSkgewotICAgICAgICAgICAgICAgICAgICBmZm0tPnBhY2tldF9lbmQgPSBmZm0tPnBhY2tldF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZmZtLT5wYWNrZXRfcHRyID0gZmZtLT5wYWNrZXQgKyAoZnJhbWVfb2Zmc2V0ICYgMHg3ZmZmKSAtIEZGTV9IRUFERVJfU0laRTsKLSAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcikKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGZmbS0+cGFja2V0X3B0ciA9IGZmbS0+cGFja2V0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290byByZWRvOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShidWYsIGZmbS0+cGFja2V0X3B0ciwgbGVuKTsKLSAgICAgICAgYnVmICs9IGxlbjsKLSAgICAgICAgZmZtLT5wYWNrZXRfcHRyICs9IGxlbjsKLSAgICAgICAgc2l6ZSAtPSBsZW47Ci0gICAgICAgIGhlYWRlciA9IDA7Ci0gICAgfQotICAgIHJldHVybiBzaXplMSAtIHNpemU7Ci19Ci0KLS8qIGVuc3VyZSB0aGF0IGFjdHVhbCBzZWVraW5nIGhhcHBlbnMgYmV0d2VlbiBGRk1fUEFDS0VUX1NJWkUKLSAgIGFuZCBmaWxlX3NpemUgLSBGRk1fUEFDS0VUX1NJWkUgKi8KLXN0YXRpYyBpbnQ2NF90IGZmbV9zZWVrMShBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3QgcG9zMSkKLXsKLSAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7Ci0gICAgaW50NjRfdCBwb3M7Ci0KLSAgICBwb3MgPSBGRk1JTihwb3MxLCBmZm0tPmZpbGVfc2l6ZSAtIEZGTV9QQUNLRVRfU0laRSk7Ci0gICAgcG9zID0gRkZNQVgocG9zLCBGRk1fUEFDS0VUX1NJWkUpOwotICAgIGZmX2Rsb2cocywgInNlZWsgdG8gJSJQUkl4NjQiIC0+ICUiUFJJeDY0IlxuIiwgcG9zMSwgcG9zKTsKLSAgICByZXR1cm4gYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKTsKLX0KLQotc3RhdGljIGludDY0X3QgZ2V0X2R0cyhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3QgcG9zKQotewotICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIGludDY0X3QgZHRzOwotCi0gICAgZmZtX3NlZWsxKHMsIHBvcyk7Ci0gICAgYXZpb19za2lwKHBiLCA0KTsKLSAgICBkdHMgPSBhdmlvX3JiNjQocGIpOwotICAgIGZmX2Rsb2cocywgImR0cz0lMC42ZlxuIiwgZHRzIC8gMTAwMDAwMC4wKTsKLSAgICByZXR1cm4gZHRzOwotfQotCi1zdGF0aWMgdm9pZCBhZGp1c3Rfd3JpdGVfaW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzKQotewotICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKLSAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKLSAgICBpbnQ2NF90IHB0czsKLSAgICAvL2ludDY0X3Qgb3JpZ193cml0ZV9pbmRleCA9IGZmbS0+d3JpdGVfaW5kZXg7Ci0gICAgaW50NjRfdCBwb3NfbWluLCBwb3NfbWF4OwotICAgIGludDY0X3QgcHRzX3N0YXJ0OwotICAgIGludDY0X3QgcHRyID0gYXZpb190ZWxsKHBiKTsKLQotCi0gICAgcG9zX21pbiA9IDA7Ci0gICAgcG9zX21heCA9IGZmbS0+ZmlsZV9zaXplIC0gMiAqIEZGTV9QQUNLRVRfU0laRTsKLQotICAgIHB0c19zdGFydCA9IGdldF9kdHMocywgcG9zX21pbik7Ci0KLSAgICBwdHMgPSBnZXRfZHRzKHMsIHBvc19tYXgpOwotCi0gICAgaWYgKHB0cyAtIDEwMDAwMCA+IHB0c19zdGFydCkKLSAgICAgICAgZ290byBlbmQ7Ci0KLSAgICBmZm0tPndyaXRlX2luZGV4ID0gRkZNX1BBQ0tFVF9TSVpFOwotCi0gICAgcHRzX3N0YXJ0ID0gZ2V0X2R0cyhzLCBwb3NfbWluKTsKLQotICAgIHB0cyA9IGdldF9kdHMocywgcG9zX21heCk7Ci0KLSAgICBpZiAocHRzIC0gMTAwMDAwIDw9IHB0c19zdGFydCkgewotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgaW50NjRfdCBuZXdwb3M7Ci0gICAgICAgICAgICBpbnQ2NF90IG5ld3B0czsKLQotICAgICAgICAgICAgbmV3cG9zID0gKChwb3NfbWF4ICsgcG9zX21pbikgLyAoMiAqIEZGTV9QQUNLRVRfU0laRSkpICogRkZNX1BBQ0tFVF9TSVpFOwotCi0gICAgICAgICAgICBpZiAobmV3cG9zID09IHBvc19taW4pCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIG5ld3B0cyA9IGdldF9kdHMocywgbmV3cG9zKTsKLQotICAgICAgICAgICAgaWYgKG5ld3B0cyAtIDEwMDAwMCA8PSBwdHMpIHsKLSAgICAgICAgICAgICAgICBwb3NfbWF4ID0gbmV3cG9zOwotICAgICAgICAgICAgICAgIHB0cyA9IG5ld3B0czsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcG9zX21pbiA9IG5ld3BvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBmZm0tPndyaXRlX2luZGV4ICs9IHBvc19tYXg7Ci0gICAgfQotCi0gZW5kOgotICAgIGF2aW9fc2VlayhwYiwgcHRyLCBTRUVLX1NFVCk7Ci19Ci0KLQotc3RhdGljIGludCBmZm1fY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgYXZfZnJlZXAoJnMtPnN0cmVhbXNbaV0tPmNvZGVjLT5yY19lcSk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmZm1fYXBwZW5kX3JlY29tbWVuZGVkX2NvbmZpZ3VyYXRpb24oQVZTdHJlYW0gKnN0LCBjaGFyICoqY29uZikKLXsKLSAgICBpbnQgcmV0OwotICAgIHNpemVfdCBuZXdzaXplOwotICAgIGF2X2Fzc2VydDAoY29uZiAmJiBzdCk7Ci0gICAgaWYgKCEqY29uZikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCFzdC0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKSB7Ci0gICAgICAgIHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24gPSAqY29uZjsKLSAgICAgICAgKmNvbmYgPSAwOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgbmV3c2l6ZSA9IHN0cmxlbigqY29uZikgKyBzdHJsZW4oc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbikgKyAyOwotICAgIGlmICgocmV0ID0gYXZfcmVhbGxvY3AoJnN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24sIG5ld3NpemUpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgYXZfc3RybGNhdChzdC0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uLCAiLCIsIG5ld3NpemUpOwotICAgIGF2X3N0cmxjYXQoc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbiwgKmNvbmYsIG5ld3NpemUpOwotICAgIGF2X2ZyZWVwKGNvbmYpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZmbTJfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQotewotICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOwotICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpjb2RlY19kZXNjOwotICAgIGludCByZXQ7Ci0gICAgaW50IGZfbWFpbiA9IDAsIGZfY3BydiA9IC0xLCBmX3N0dmkgPSAtMSwgZl9zdGF1ID0gLTE7Ci0gICAgQVZDb2RlYyAqZW5jOwotICAgIGNoYXIgKmJ1ZmZlcjsKLQotICAgIGZmbS0+cGFja2V0X3NpemUgPSBhdmlvX3JiMzIocGIpOwotICAgIGlmIChmZm0tPnBhY2tldF9zaXplICE9IEZGTV9QQUNLRVRfU0laRSkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBwYWNrZXQgc2l6ZSAlZCwgZXhwZWN0ZWQgc2l6ZSB3YXMgJWRcbiIsCi0gICAgICAgICAgICAgICBmZm0tPnBhY2tldF9zaXplLCBGRk1fUEFDS0VUX1NJWkUpOwotICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQotCi0gICAgZmZtLT53cml0ZV9pbmRleCA9IGF2aW9fcmI2NChwYik7Ci0gICAgLyogZ2V0IGFsc28gZmlsZXNpemUgKi8KLSAgICBpZiAocGItPnNlZWthYmxlKSB7Ci0gICAgICAgIGZmbS0+ZmlsZV9zaXplID0gYXZpb19zaXplKHBiKTsKLSAgICAgICAgaWYgKGZmbS0+d3JpdGVfaW5kZXggJiYgMCkKLSAgICAgICAgICAgIGFkanVzdF93cml0ZV9pbmRleChzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmZm0tPmZpbGVfc2l6ZSA9IChVSU5UNjRfQygxKSA8PCA2MykgLSAxOwotICAgIH0KLQotICAgIHdoaWxlKCFhdmlvX2Zlb2YocGIpKSB7Ci0gICAgICAgIHVuc2lnbmVkIGlkID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgdW5zaWduZWQgc2l6ZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgIGludDY0X3QgbmV4dCA9IGF2aW9fdGVsbChwYikgKyBzaXplOwotICAgICAgICBjaGFyIHJjX2VxX2J1ZlsxMjhdOwotCi0gICAgICAgIGlmKCFpZCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHN3aXRjaChpZCkgewotICAgICAgICBjYXNlIE1LQkVUQUcoJ00nLCAnQScsICdJJywgJ04nKToKLSAgICAgICAgICAgIGlmIChmX21haW4rKykgewotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBuYl9zdHJlYW1zICovCi0gICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiB0b3RhbCBiaXRyYXRlICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNS0JFVEFHKCdDJywgJ08nLCAnTScsICdNJyk6Ci0gICAgICAgICAgICBmX2NwcnYgPSBmX3N0dmkgPSBmX3N0YXUgPSAwOwotICAgICAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwotICAgICAgICAgICAgaWYgKCFzdCkgewotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsKLQotICAgICAgICAgICAgY29kZWMgPSBzdC0+Y29kZWM7Ci0gICAgICAgICAgICAvKiBnZW5lcmljIGluZm8gKi8KLSAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlY19kZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChjb2RlYy0+Y29kZWNfaWQpOwotICAgICAgICAgICAgaWYgKCFjb2RlY19kZXNjKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29kZWMgaWQ6ICVkXG4iLCBjb2RlYy0+Y29kZWNfaWQpOwotICAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPSBhdmlvX3I4KHBiKTsKLSAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSAhPSBjb2RlY19kZXNjLT50eXBlKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvZGVjIHR5cGUgbWlzbWF0Y2g6IGV4cGVjdGVkICVkLCBmb3VuZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29kZWNfZGVzYy0+dHlwZSwgY29kZWMtPmNvZGVjX3R5cGUpOwotICAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7Ci0gICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb2RlYy0+Yml0X3JhdGUgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPmZsYWdzID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5mbGFnczIgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPmRlYnVnID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGlmIChjb2RlYy0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX0dMT0JBTF9IRUFERVIpIHsKLSAgICAgICAgICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShjb2RlYywgcGIsIGF2aW9fcmIzMihwYikpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnVCcsICdWJywgJ0knKToKLSAgICAgICAgICAgIGlmIChmX3N0dmkrKykgewotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb2RlYy0+dGltZV9iYXNlLm51bSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+dGltZV9iYXNlLmRlbiA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBpZiAoY29kZWMtPnRpbWVfYmFzZS5udW0gPD0gMCB8fCBjb2RlYy0+dGltZV9iYXNlLmRlbiA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdGltZSBiYXNlICVkLyVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+dGltZV9iYXNlLm51bSwgY29kZWMtPnRpbWVfYmFzZS5kZW4pOwotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZWMtPndpZHRoID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOwotICAgICAgICAgICAgY29kZWMtPmdvcF9zaXplID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5waXhfZm10ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5xbWluID0gYXZpb19yOChwYik7Ci0gICAgICAgICAgICBjb2RlYy0+cW1heCA9IGF2aW9fcjgocGIpOwotICAgICAgICAgICAgY29kZWMtPm1heF9xZGlmZiA9IGF2aW9fcjgocGIpOwotICAgICAgICAgICAgY29kZWMtPnFjb21wcmVzcyA9IGF2aW9fcmIxNihwYikgLyAxMDAwMC4wOwotICAgICAgICAgICAgY29kZWMtPnFibHVyID0gYXZpb19yYjE2KHBiKSAvIDEwMDAwLjA7Ci0gICAgICAgICAgICBjb2RlYy0+Yml0X3JhdGVfdG9sZXJhbmNlID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGF2aW9fZ2V0X3N0cihwYiwgSU5UX01BWCwgcmNfZXFfYnVmLCBzaXplb2YocmNfZXFfYnVmKSk7Ci0gICAgICAgICAgICBjb2RlYy0+cmNfZXEgPSBhdl9zdHJkdXAocmNfZXFfYnVmKTsKLSAgICAgICAgICAgIGNvZGVjLT5yY19tYXhfcmF0ZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+cmNfbWluX3JhdGUgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPnJjX2J1ZmZlcl9zaXplID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5pX3F1YW50X2ZhY3RvciA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7Ci0gICAgICAgICAgICBjb2RlYy0+Yl9xdWFudF9mYWN0b3IgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOwotICAgICAgICAgICAgY29kZWMtPmlfcXVhbnRfb2Zmc2V0ID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKLSAgICAgICAgICAgIGNvZGVjLT5iX3F1YW50X29mZnNldCA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7Ci0gICAgICAgICAgICBjb2RlYy0+ZGN0X2FsZ28gPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+bWF4X2JfZnJhbWVzID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5tcGVnX3F1YW50ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5pbnRyYV9kY19wcmVjaXNpb24gPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPm1lX21ldGhvZCA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+bWJfZGVjaXNpb24gPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPm5zc2Vfd2VpZ2h0ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5mcmFtZV9za2lwX2NtcCA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+cmNfYnVmZmVyX2FnZ3Jlc3Npdml0eSA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7Ci0gICAgICAgICAgICBjb2RlYy0+Y29kZWNfdGFnID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT50aHJlYWRfY291bnQgPSBhdmlvX3I4KHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5jb2Rlcl90eXBlID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5tZV9jbXAgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPm1lX3N1YnBlbF9xdWFsaXR5ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5tZV9yYW5nZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+a2V5aW50X21pbiA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+c2NlbmVjaGFuZ2VfdGhyZXNob2xkID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5iX2ZyYW1lX3N0cmF0ZWd5ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5xY29tcHJlc3MgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOwotICAgICAgICAgICAgY29kZWMtPnFibHVyID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKLSAgICAgICAgICAgIGNvZGVjLT5tYXhfcWRpZmYgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPnJlZnMgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUtCRVRBRygnUycsICdUJywgJ0EnLCAnVScpOgotICAgICAgICAgICAgaWYgKGZfc3RhdSsrKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+Y2hhbm5lbHMgPSBhdmlvX3JsMTYocGIpOwotICAgICAgICAgICAgY29kZWMtPmZyYW1lX3NpemUgPSBhdmlvX3JsMTYocGIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUtCRVRBRygnQycsICdQJywgJ1InLCAnVicpOgotICAgICAgICAgICAgaWYgKGZfY3BydisrKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuYyA9IGF2Y29kZWNfZmluZF9lbmNvZGVyKGNvZGVjLT5jb2RlY19pZCk7Ci0gICAgICAgICAgICBpZiAoZW5jICYmIGVuYy0+cHJpdl9kYXRhX3NpemUgJiYgZW5jLT5wcml2X2NsYXNzKSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gYXZfbWFsbG9jKHNpemUgKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXZpb19nZXRfc3RyKHBiLCBzaXplLCBidWZmZXIsIHNpemUgKyAxKTsKLSAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmbV9hcHBlbmRfcmVjb21tZW5kZWRfY29uZmlndXJhdGlvbihzdCwgJmJ1ZmZlcikpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUtCRVRBRygnUycsICcyJywgJ1YnLCAnSScpOgotICAgICAgICAgICAgaWYgKGZfc3R2aSsrIHx8ICFzaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1ZmZlciA9IGF2X21hbGxvYyhzaXplKTsKLSAgICAgICAgICAgIGlmICghYnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF2aW9fZ2V0X3N0cihwYiwgSU5UX01BWCwgYnVmZmVyLCBzaXplKTsKLSAgICAgICAgICAgIGF2X3NldF9vcHRpb25zX3N0cmluZyhjb2RlYywgYnVmZmVyLCAiPSIsICIsIik7Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGZmbV9hcHBlbmRfcmVjb21tZW5kZWRfY29uZmlndXJhdGlvbihzdCwgJmJ1ZmZlcikpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNS0JFVEFHKCdTJywgJzInLCAnQScsICdVJyk6Ci0gICAgICAgICAgICBpZiAoZl9zdGF1KysgfHwgIXNpemUpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmZmVyID0gYXZfbWFsbG9jKHNpemUpOwotICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZpb19nZXRfc3RyKHBiLCBJTlRfTUFYLCBidWZmZXIsIHNpemUpOwotICAgICAgICAgICAgYXZfc2V0X29wdGlvbnNfc3RyaW5nKGNvZGVjLCBidWZmZXIsICI9IiwgIiwiKTsKLSAgICAgICAgICAgIGlmICgocmV0ID0gZmZtX2FwcGVuZF9yZWNvbW1lbmRlZF9jb25maWd1cmF0aW9uKHN0LCAmYnVmZmVyKSkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGF2aW9fc2VlayhwYiwgbmV4dCwgU0VFS19TRVQpOwotICAgIH0KLQotICAgIC8qIGdldCB1bnRpbCBlbmQgb2YgYmxvY2sgcmVhY2hlZCAqLwotICAgIHdoaWxlICgoYXZpb190ZWxsKHBiKSAlIGZmbS0+cGFja2V0X3NpemUpICE9IDAgJiYgIXBiLT5lb2ZfcmVhY2hlZCkKLSAgICAgICAgYXZpb19yOChwYik7Ci0KLSAgICAvKiBpbml0IHBhY2tldCBkZW11eCAqLwotICAgIGZmbS0+cGFja2V0X3B0ciA9IGZmbS0+cGFja2V0OwotICAgIGZmbS0+cGFja2V0X2VuZCA9IGZmbS0+cGFja2V0OwotICAgIGZmbS0+ZnJhbWVfb2Zmc2V0ID0gMDsKLSAgICBmZm0tPmR0cyA9IDA7Ci0gICAgZmZtLT5yZWFkX3N0YXRlID0gUkVBRF9IRUFERVI7Ci0gICAgZmZtLT5maXJzdF9wYWNrZXQgPSAxOwotICAgIHJldHVybiAwOwotIGZhaWw6Ci0gICAgZmZtX2Nsb3NlKHMpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgZmZtX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKLXsKLSAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZTdHJlYW0gKnN0OwotICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKLSAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqY29kZWNfZGVzYzsKLSAgICBpbnQgaSwgbmJfc3RyZWFtczsKLSAgICB1aW50MzJfdCB0YWc7Ci0KLSAgICAvKiBoZWFkZXIgKi8KLSAgICB0YWcgPSBhdmlvX3JsMzIocGIpOwotICAgIGlmICh0YWcgPT0gTUtUQUcoJ0YnLCAnRicsICdNJywgJzInKSkKLSAgICAgICAgcmV0dXJuIGZmbTJfcmVhZF9oZWFkZXIocyk7Ci0gICAgaWYgKHRhZyAhPSBNS1RBRygnRicsICdGJywgJ00nLCAnMScpKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgZmZtLT5wYWNrZXRfc2l6ZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgaWYgKGZmbS0+cGFja2V0X3NpemUgIT0gRkZNX1BBQ0tFVF9TSVpFKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgZmZtLT53cml0ZV9pbmRleCA9IGF2aW9fcmI2NChwYik7Ci0gICAgLyogZ2V0IGFsc28gZmlsZXNpemUgKi8KLSAgICBpZiAocGItPnNlZWthYmxlKSB7Ci0gICAgICAgIGZmbS0+ZmlsZV9zaXplID0gYXZpb19zaXplKHBiKTsKLSAgICAgICAgaWYgKGZmbS0+d3JpdGVfaW5kZXggJiYgMCkKLSAgICAgICAgICAgIGFkanVzdF93cml0ZV9pbmRleChzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmZm0tPmZpbGVfc2l6ZSA9IChVSU5UNjRfQygxKSA8PCA2MykgLSAxOwotICAgIH0KLQotICAgIG5iX3N0cmVhbXMgPSBhdmlvX3JiMzIocGIpOwotICAgIGF2aW9fcmIzMihwYik7IC8qIHRvdGFsIGJpdHJhdGUgKi8KLSAgICAvKiByZWFkIGVhY2ggc3RyZWFtICovCi0gICAgZm9yKGk9MDtpPG5iX3N0cmVhbXM7aSsrKSB7Ci0gICAgICAgIGNoYXIgcmNfZXFfYnVmWzEyOF07Ci0KLSAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwotICAgICAgICBpZiAoIXN0KQotICAgICAgICAgICAgZ290byBmYWlsOwotCi0gICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwKTsKLQotICAgICAgICBjb2RlYyA9IHN0LT5jb2RlYzsKLSAgICAgICAgLyogZ2VuZXJpYyBpbmZvICovCi0gICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgIGNvZGVjX2Rlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGNvZGVjLT5jb2RlY19pZCk7Ci0gICAgICAgIGlmICghY29kZWNfZGVzYykgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgY29kZWMgaWQ6ICVkXG4iLCBjb2RlYy0+Y29kZWNfaWQpOwotICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTk9ORTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgICBjb2RlYy0+Y29kZWNfdHlwZSA9IGF2aW9fcjgocGIpOyAvKiBjb2RlY190eXBlICovCi0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSAhPSBjb2RlY19kZXNjLT50eXBlKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ29kZWMgdHlwZSBtaXNtYXRjaDogZXhwZWN0ZWQgJWQsIGZvdW5kICVkXG4iLAotICAgICAgICAgICAgICAgICAgIGNvZGVjX2Rlc2MtPnR5cGUsIGNvZGVjLT5jb2RlY190eXBlKTsKLSAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7Ci0gICAgICAgICAgICBjb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9VTktOT1dOOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIGNvZGVjLT5iaXRfcmF0ZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgIGNvZGVjLT5mbGFncyA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgIGNvZGVjLT5mbGFnczIgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICBjb2RlYy0+ZGVidWcgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAvKiBzcGVjaWZpYyBpbmZvICovCi0gICAgICAgIHN3aXRjaChjb2RlYy0+Y29kZWNfdHlwZSkgewotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgICAgIGNvZGVjLT50aW1lX2Jhc2UubnVtID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT50aW1lX2Jhc2UuZGVuID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGlmIChjb2RlYy0+dGltZV9iYXNlLm51bSA8PSAwIHx8IGNvZGVjLT50aW1lX2Jhc2UuZGVuIDw9IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCB0aW1lIGJhc2UgJWQvJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT50aW1lX2Jhc2UubnVtLCBjb2RlYy0+dGltZV9iYXNlLmRlbik7Ci0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29kZWMtPndpZHRoID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOwotICAgICAgICAgICAgY29kZWMtPmdvcF9zaXplID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5waXhfZm10ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5xbWluID0gYXZpb19yOChwYik7Ci0gICAgICAgICAgICBjb2RlYy0+cW1heCA9IGF2aW9fcjgocGIpOwotICAgICAgICAgICAgY29kZWMtPm1heF9xZGlmZiA9IGF2aW9fcjgocGIpOwotICAgICAgICAgICAgY29kZWMtPnFjb21wcmVzcyA9IGF2aW9fcmIxNihwYikgLyAxMDAwMC4wOwotICAgICAgICAgICAgY29kZWMtPnFibHVyID0gYXZpb19yYjE2KHBiKSAvIDEwMDAwLjA7Ci0gICAgICAgICAgICBjb2RlYy0+Yml0X3JhdGVfdG9sZXJhbmNlID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGF2aW9fZ2V0X3N0cihwYiwgSU5UX01BWCwgcmNfZXFfYnVmLCBzaXplb2YocmNfZXFfYnVmKSk7Ci0gICAgICAgICAgICBjb2RlYy0+cmNfZXEgPSBhdl9zdHJkdXAocmNfZXFfYnVmKTsKLSAgICAgICAgICAgIGNvZGVjLT5yY19tYXhfcmF0ZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+cmNfbWluX3JhdGUgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPnJjX2J1ZmZlcl9zaXplID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5pX3F1YW50X2ZhY3RvciA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7Ci0gICAgICAgICAgICBjb2RlYy0+Yl9xdWFudF9mYWN0b3IgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOwotICAgICAgICAgICAgY29kZWMtPmlfcXVhbnRfb2Zmc2V0ID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKLSAgICAgICAgICAgIGNvZGVjLT5iX3F1YW50X29mZnNldCA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7Ci0gICAgICAgICAgICBjb2RlYy0+ZGN0X2FsZ28gPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+bWF4X2JfZnJhbWVzID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5tcGVnX3F1YW50ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5pbnRyYV9kY19wcmVjaXNpb24gPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPm1lX21ldGhvZCA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+bWJfZGVjaXNpb24gPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPm5zc2Vfd2VpZ2h0ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5mcmFtZV9za2lwX2NtcCA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+cmNfYnVmZmVyX2FnZ3Jlc3Npdml0eSA9IGF2X2ludDJkb3VibGUoYXZpb19yYjY0KHBiKSk7Ci0gICAgICAgICAgICBjb2RlYy0+Y29kZWNfdGFnID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT50aHJlYWRfY291bnQgPSBhdmlvX3I4KHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5jb2Rlcl90eXBlID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5tZV9jbXAgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPm1lX3N1YnBlbF9xdWFsaXR5ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5tZV9yYW5nZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+a2V5aW50X21pbiA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+c2NlbmVjaGFuZ2VfdGhyZXNob2xkID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5iX2ZyYW1lX3N0cmF0ZWd5ID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5xY29tcHJlc3MgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOwotICAgICAgICAgICAgY29kZWMtPnFibHVyID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKLSAgICAgICAgICAgIGNvZGVjLT5tYXhfcWRpZmYgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgY29kZWMtPnJlZnMgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGNvZGVjLT5jaGFubmVscyA9IGF2aW9fcmwxNihwYik7Ci0gICAgICAgICAgICBjb2RlYy0+ZnJhbWVfc2l6ZSA9IGF2aW9fcmwxNihwYik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29kZWMtPmZsYWdzICYgQVZfQ09ERUNfRkxBR19HTE9CQUxfSEVBREVSKSB7Ci0gICAgICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShjb2RlYywgcGIsIGF2aW9fcmIzMihwYikpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogZ2V0IHVudGlsIGVuZCBvZiBibG9jayByZWFjaGVkICovCi0gICAgd2hpbGUgKChhdmlvX3RlbGwocGIpICUgZmZtLT5wYWNrZXRfc2l6ZSkgIT0gMCAmJiAhcGItPmVvZl9yZWFjaGVkKQotICAgICAgICBhdmlvX3I4KHBiKTsKLQotICAgIC8qIGluaXQgcGFja2V0IGRlbXV4ICovCi0gICAgZmZtLT5wYWNrZXRfcHRyID0gZmZtLT5wYWNrZXQ7Ci0gICAgZmZtLT5wYWNrZXRfZW5kID0gZmZtLT5wYWNrZXQ7Ci0gICAgZmZtLT5mcmFtZV9vZmZzZXQgPSAwOwotICAgIGZmbS0+ZHRzID0gMDsKLSAgICBmZm0tPnJlYWRfc3RhdGUgPSBSRUFEX0hFQURFUjsKLSAgICBmZm0tPmZpcnN0X3BhY2tldCA9IDE7Ci0gICAgcmV0dXJuIDA7Ci0gZmFpbDoKLSAgICBmZm1fY2xvc2Uocyk7Ci0gICAgcmV0dXJuIC0xOwotfQotCi0vKiByZXR1cm4gPCAwIGlmIGVvZiAqLwotc3RhdGljIGludCBmZm1fcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQotewotICAgIGludCBzaXplOwotICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKLSAgICBpbnQgZHVyYXRpb24sIHJldDsKLQotICAgIHN3aXRjaChmZm0tPnJlYWRfc3RhdGUpIHsKLSAgICBjYXNlIFJFQURfSEVBREVSOgotICAgICAgICBpZiAoKHJldCA9IGZmbV9pc19hdmFpbF9kYXRhKHMsIEZSQU1FX0hFQURFUl9TSVpFKzQpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIGZmX2Rsb2cocywgInBvcz0lMDgiUFJJeDY0IiBzcG9zPSUiUFJJeDY0Iiwgd3JpdGVfaW5kZXg9JSJQUkl4NjQiIHNpemU9JSJQUkl4NjQiXG4iLAotICAgICAgICAgICAgICAgYXZpb190ZWxsKHMtPnBiKSwgcy0+cGItPnBvcywgZmZtLT53cml0ZV9pbmRleCwgZmZtLT5maWxlX3NpemUpOwotICAgICAgICBpZiAoZmZtX3JlYWRfZGF0YShzLCBmZm0tPmhlYWRlciwgRlJBTUVfSEVBREVSX1NJWkUsIDEpICE9Ci0gICAgICAgICAgICBGUkFNRV9IRUFERVJfU0laRSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKGZmbS0+aGVhZGVyWzFdICYgRkxBR19EVFMpCi0gICAgICAgICAgICBpZiAoZmZtX3JlYWRfZGF0YShzLCBmZm0tPmhlYWRlcisxNiwgNCwgMSkgIT0gNCkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGZmbS0+cmVhZF9zdGF0ZSA9IFJFQURfREFUQTsKLSAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCi0gICAgY2FzZSBSRUFEX0RBVEE6Ci0gICAgICAgIHNpemUgPSBBVl9SQjI0KGZmbS0+aGVhZGVyICsgMik7Ci0gICAgICAgIGlmICgocmV0ID0gZmZtX2lzX2F2YWlsX2RhdGEocywgc2l6ZSkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgZHVyYXRpb24gPSBBVl9SQjI0KGZmbS0+aGVhZGVyICsgNSk7Ci0KLSAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBzaXplKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLSAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBmZm0tPmhlYWRlclswXTsKLSAgICAgICAgaWYgKCh1bnNpZ25lZClwa3QtPnN0cmVhbV9pbmRleCA+PSBzLT5uYl9zdHJlYW1zKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzdHJlYW0gaW5kZXggJWRcbiIsIHBrdC0+c3RyZWFtX2luZGV4KTsKLSAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOwotICAgICAgICAgICAgZmZtLT5yZWFkX3N0YXRlID0gUkVBRF9IRUFERVI7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcGt0LT5wb3MgPSBhdmlvX3RlbGwocy0+cGIpOwotICAgICAgICBpZiAoZmZtLT5oZWFkZXJbMV0gJiBGTEFHX0tFWV9GUkFNRSkKLSAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwotCi0gICAgICAgIGZmbS0+cmVhZF9zdGF0ZSA9IFJFQURfSEVBREVSOwotICAgICAgICBpZiAoZmZtX3JlYWRfZGF0YShzLCBwa3QtPmRhdGEsIHNpemUsIDApICE9IHNpemUpIHsKLSAgICAgICAgICAgIC8qIGJhZCBjYXNlOiBkZXN5bmNocm9uaXplZCBwYWNrZXQuIHdlIGNhbmNlbCBhbGwgdGhlIHBhY2tldCBsb2FkaW5nICovCi0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBwa3QtPnB0cyA9IEFWX1JCNjQoZmZtLT5oZWFkZXIrOCk7Ci0gICAgICAgIGlmIChmZm0tPmhlYWRlclsxXSAmIEZMQUdfRFRTKQotICAgICAgICAgICAgcGt0LT5kdHMgPSBwa3QtPnB0cyAtIEFWX1JCMzIoZmZtLT5oZWFkZXIrMTYpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBwa3QtPmR0cyA9IHBrdC0+cHRzOwotICAgICAgICBwa3QtPmR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogc2VlayB0byBhIGdpdmVuIHRpbWUgaW4gdGhlIGZpbGUuIFRoZSBmaWxlIHJlYWQgcG9pbnRlciBpcwotICAgcG9zaXRpb25lZCBhdCBvciBiZWZvcmUgcHRzLiBYWFg6IHRoZSBmb2xsb3dpbmcgY29kZSBpcyBxdWl0ZQotICAgYXBwcm94aW1hdGl2ZSAqLwotc3RhdGljIGludCBmZm1fc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3Qgd2FudGVkX3B0cywgaW50IGZsYWdzKQotewotICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKLSAgICBpbnQ2NF90IHBvc19taW4sIHBvc19tYXgsIHBvczsKLSAgICBpbnQ2NF90IHB0c19taW4sIHB0c19tYXgsIHB0czsKLSAgICBkb3VibGUgcG9zMTsKLQotICAgIGZmX2Rsb2cocywgIndhbnRlZF9wdHM9JTAuNmZcbiIsIHdhbnRlZF9wdHMgLyAxMDAwMDAwLjApOwotICAgIC8qIGZpbmQgdGhlIHBvc2l0aW9uIHVzaW5nIGxpbmVhciBpbnRlcnBvbGF0aW9uIChiZXR0ZXIgdGhhbgotICAgICAgIGRpY2hvdG9teSBpbiB0eXBpY2FsIGNhc2VzKSAqLwotICAgIGlmIChmZm0tPndyaXRlX2luZGV4ICYmIGZmbS0+d3JpdGVfaW5kZXggPCBmZm0tPmZpbGVfc2l6ZSkgewotICAgICAgICBpZiAoZ2V0X2R0cyhzLCBGRk1fUEFDS0VUX1NJWkUpIDwgd2FudGVkX3B0cykgewotICAgICAgICAgICAgcG9zX21pbiA9IEZGTV9QQUNLRVRfU0laRTsKLSAgICAgICAgICAgIHBvc19tYXggPSBmZm0tPndyaXRlX2luZGV4IC0gRkZNX1BBQ0tFVF9TSVpFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcG9zX21pbiA9IGZmbS0+d3JpdGVfaW5kZXg7Ci0gICAgICAgICAgICBwb3NfbWF4ID0gZmZtLT5maWxlX3NpemUgLSBGRk1fUEFDS0VUX1NJWkU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBwb3NfbWluID0gRkZNX1BBQ0tFVF9TSVpFOwotICAgICAgICBwb3NfbWF4ID0gZmZtLT5maWxlX3NpemUgLSBGRk1fUEFDS0VUX1NJWkU7Ci0gICAgfQotICAgIHdoaWxlIChwb3NfbWluIDw9IHBvc19tYXgpIHsKLSAgICAgICAgcHRzX21pbiA9IGdldF9kdHMocywgcG9zX21pbik7Ci0gICAgICAgIHB0c19tYXggPSBnZXRfZHRzKHMsIHBvc19tYXgpOwotICAgICAgICBpZiAocHRzX21pbiA+IHdhbnRlZF9wdHMgfHwgcHRzX21heCA8PSB3YW50ZWRfcHRzKSB7Ci0gICAgICAgICAgICBwb3MgPSBwdHNfbWluID4gd2FudGVkX3B0cyA/IHBvc19taW4gOiBwb3NfbWF4OwotICAgICAgICAgICAgZ290byBmb3VuZDsKLSAgICAgICAgfQotICAgICAgICAvKiBsaW5lYXIgaW50ZXJwb2xhdGlvbiAqLwotICAgICAgICBwb3MxID0gKGRvdWJsZSkocG9zX21heCAtIHBvc19taW4pICogKGRvdWJsZSkod2FudGVkX3B0cyAtIHB0c19taW4pIC8KLSAgICAgICAgICAgIChkb3VibGUpKHB0c19tYXggLSBwdHNfbWluKTsKLSAgICAgICAgcG9zID0gKCgoaW50NjRfdClwb3MxKSAvIEZGTV9QQUNLRVRfU0laRSkgKiBGRk1fUEFDS0VUX1NJWkU7Ci0gICAgICAgIGlmIChwb3MgPD0gcG9zX21pbikKLSAgICAgICAgICAgIHBvcyA9IHBvc19taW47Ci0gICAgICAgIGVsc2UgaWYgKHBvcyA+PSBwb3NfbWF4KQotICAgICAgICAgICAgcG9zID0gcG9zX21heDsKLSAgICAgICAgcHRzID0gZ2V0X2R0cyhzLCBwb3MpOwotICAgICAgICAvKiBjaGVjayBpZiB3ZSBhcmUgbHVja3kgKi8KLSAgICAgICAgaWYgKHB0cyA9PSB3YW50ZWRfcHRzKSB7Ci0gICAgICAgICAgICBnb3RvIGZvdW5kOwotICAgICAgICB9IGVsc2UgaWYgKHB0cyA+IHdhbnRlZF9wdHMpIHsKLSAgICAgICAgICAgIHBvc19tYXggPSBwb3MgLSBGRk1fUEFDS0VUX1NJWkU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwb3NfbWluID0gcG9zICsgRkZNX1BBQ0tFVF9TSVpFOwotICAgICAgICB9Ci0gICAgfQotICAgIHBvcyA9IChmbGFncyAmIEFWU0VFS19GTEFHX0JBQ0tXQVJEKSA/IHBvc19taW4gOiBwb3NfbWF4OwotCi0gZm91bmQ6Ci0gICAgaWYgKGZmbV9zZWVrMShzLCBwb3MpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogcmVzZXQgcmVhZCBzdGF0ZSAqLwotICAgIGZmbS0+cmVhZF9zdGF0ZSA9IFJFQURfSEVBREVSOwotICAgIGZmbS0+cGFja2V0X3B0ciA9IGZmbS0+cGFja2V0OwotICAgIGZmbS0+cGFja2V0X2VuZCA9IGZmbS0+cGFja2V0OwotICAgIGZmbS0+Zmlyc3RfcGFja2V0ID0gMTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZmbV9wcm9iZShBVlByb2JlRGF0YSAqcCkKLXsKLSAgICBpZiAoCi0gICAgICAgIHAtPmJ1ZlswXSA9PSAnRicgJiYgcC0+YnVmWzFdID09ICdGJyAmJiBwLT5idWZbMl0gPT0gJ00nICYmCi0gICAgICAgIChwLT5idWZbM10gPT0gJzEnIHx8IHAtPmJ1ZlszXSA9PSAnMicpKQotICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggKyAxOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewotICAgIHsic2VydmVyX2F0dGFjaGVkIiwgTlVMTCwgb2Zmc2V0b2YoRkZNQ29udGV4dCwgc2VydmVyX2F0dGFjaGVkKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRVhQT1JUIH0sCi0gICAgeyJmZm1fd3JpdGVfaW5kZXgiLCBOVUxMLCBvZmZzZXRvZihGRk1Db250ZXh0LCB3cml0ZV9pbmRleCksIEFWX09QVF9UWVBFX0lOVDY0LCB7Lmk2NCA9IDB9LCAwLCAxLCBBVl9PUFRfRkxBR19FWFBPUlQgfSwKLSAgICB7ImZmbV9maWxlX3NpemUiLCBOVUxMLCBvZmZzZXRvZihGRk1Db250ZXh0LCBmaWxlX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSAwfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRVhQT1JUIH0sCi0gICAgeyBOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyBmZm1fY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiZmZtIGRlbXV4ZXIiLAotICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAotICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAotfTsKLUFWSW5wdXRGb3JtYXQgZmZfZmZtX2RlbXV4ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gImZmbSIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZGTSAoRkZzZXJ2ZXIgbGl2ZSBmZWVkKSIpLAotICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGRk1Db250ZXh0KSwKLSAgICAucmVhZF9wcm9iZSAgICAgPSBmZm1fcHJvYmUsCi0gICAgLnJlYWRfaGVhZGVyICAgID0gZmZtX3JlYWRfaGVhZGVyLAotICAgIC5yZWFkX3BhY2tldCAgICA9IGZmbV9yZWFkX3BhY2tldCwKLSAgICAucmVhZF9jbG9zZSAgICAgPSBmZm1fY2xvc2UsCi0gICAgLnJlYWRfc2VlayAgICAgID0gZmZtX3NlZWssCi0gICAgLnByaXZfY2xhc3MgICAgID0gJmZmbV9jbGFzcywKLX07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9mZm1lbmMuYyBiL2xpYmF2Zm9ybWF0L2ZmbWVuYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjIzYjc5Li4wMDAwMDAwCi0tLSBhL2xpYmF2Zm9ybWF0L2ZmbWVuYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzcwICswLDAgQEAKLS8qCi0gKiBGRk0gKGZmc2VydmVyIGxpdmUgZmVlZCkgbXV4ZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMSBGYWJyaWNlIEJlbGxhcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJhdmZvcm1hdC5oIgotI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKLSNpbmNsdWRlICJpbnRlcm5hbC5oIgotI2luY2x1ZGUgImZmbS5oIgotCi1zdGF0aWMgdm9pZCBmbHVzaF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzKQotewotICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKLSAgICBpbnQgZmlsbF9zaXplLCBoOwotICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotCi0gICAgZmlsbF9zaXplID0gZmZtLT5wYWNrZXRfZW5kIC0gZmZtLT5wYWNrZXRfcHRyOwotICAgIG1lbXNldChmZm0tPnBhY2tldF9wdHIsIDAsIGZpbGxfc2l6ZSk7Ci0KLSAgICBhdl9hc3NlcnQxKGF2aW9fdGVsbChwYikgJSBmZm0tPnBhY2tldF9zaXplID09IDApOwotCi0gICAgLyogcHV0IGhlYWRlciAqLwotICAgIGF2aW9fd2IxNihwYiwgUEFDS0VUX0lEKTsKLSAgICBhdmlvX3diMTYocGIsIGZpbGxfc2l6ZSk7Ci0gICAgYXZpb193YjY0KHBiLCBmZm0tPmR0cyk7Ci0gICAgaCA9IGZmbS0+ZnJhbWVfb2Zmc2V0OwotICAgIGlmIChmZm0tPmZpcnN0X3BhY2tldCkKLSAgICAgICAgaCB8PSAweDgwMDA7Ci0gICAgYXZpb193YjE2KHBiLCBoKTsKLSAgICBhdmlvX3dyaXRlKHBiLCBmZm0tPnBhY2tldCwgZmZtLT5wYWNrZXRfZW5kIC0gZmZtLT5wYWNrZXQpOwotICAgIGF2aW9fZmx1c2gocGIpOwotCi0gICAgLyogcHJlcGFyZSBuZXh0IHBhY2tldCAqLwotICAgIGZmbS0+ZnJhbWVfb2Zmc2V0ID0gMDsgLyogbm8ga2V5IGZyYW1lICovCi0gICAgZmZtLT5wYWNrZXRfcHRyID0gZmZtLT5wYWNrZXQ7Ci0gICAgZmZtLT5maXJzdF9wYWNrZXQgPSAwOwotfQotCi0vKiAnZmlyc3QnIGlzIHRydWUgaWYgZmlyc3QgZGF0YSBvZiBhIGZyYW1lICovCi1zdGF0aWMgdm9pZCBmZm1fd3JpdGVfZGF0YShBVkZvcm1hdENvbnRleHQgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdHMsIGludCBoZWFkZXIpCi17Ci0gICAgRkZNQ29udGV4dCAqZmZtID0gcy0+cHJpdl9kYXRhOwotICAgIGludCBsZW47Ci0KLSAgICBpZiAoaGVhZGVyICYmIGZmbS0+ZnJhbWVfb2Zmc2V0ID09IDApIHsKLSAgICAgICAgZmZtLT5mcmFtZV9vZmZzZXQgPSBmZm0tPnBhY2tldF9wdHIgLSBmZm0tPnBhY2tldCArIEZGTV9IRUFERVJfU0laRTsKLSAgICAgICAgZmZtLT5kdHMgPSBkdHM7Ci0gICAgfQotCi0gICAgLyogd3JpdGUgYXMgbWFueSBwYWNrZXRzIGFzIG5lZWRlZCAqLwotICAgIHdoaWxlIChzaXplID4gMCkgewotICAgICAgICBsZW4gPSBmZm0tPnBhY2tldF9lbmQgLSBmZm0tPnBhY2tldF9wdHI7Ci0gICAgICAgIGlmIChsZW4gPiBzaXplKQotICAgICAgICAgICAgbGVuID0gc2l6ZTsKLSAgICAgICAgbWVtY3B5KGZmbS0+cGFja2V0X3B0ciwgYnVmLCBsZW4pOwotCi0gICAgICAgIGZmbS0+cGFja2V0X3B0ciArPSBsZW47Ci0gICAgICAgIGJ1ZiArPSBsZW47Ci0gICAgICAgIHNpemUgLT0gbGVuOwotICAgICAgICBpZiAoZmZtLT5wYWNrZXRfcHRyID49IGZmbS0+cGFja2V0X2VuZCkKLSAgICAgICAgICAgIGZsdXNoX3BhY2tldChzKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHdyaXRlX2hlYWRlcl9jaHVuayhBVklPQ29udGV4dCAqcGIsIEFWSU9Db250ZXh0ICpkcGIsIHVuc2lnbmVkIGlkKQotewotICAgIHVpbnQ4X3QgKmR5bl9idWY7Ci0gICAgaW50IGR5bl9zaXplPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHBiLCAmZHluX2J1Zik7Ci0gICAgYXZpb193YjMyKHBiLCBpZCk7Ci0gICAgYXZpb193YjMyKHBiLCBkeW5fc2l6ZSk7Ci0gICAgYXZpb193cml0ZShwYiwgZHluX2J1ZiwgZHluX3NpemUpOwotICAgIGF2X2ZyZWUoZHluX2J1Zik7Ci19Ci0KLXN0YXRpYyBpbnQgZmZtX3dyaXRlX2hlYWRlcl9jb2RlY19wcml2YXRlX2N0eChBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWNDb250ZXh0ICpjdHgsIGludCB0eXBlKQotewotICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWSU9Db250ZXh0ICp0bXA7Ci0gICAgY2hhciAqYnVmID0gTlVMTDsKLSAgICBpbnQgcmV0OwotICAgIGNvbnN0IEFWQ29kZWMgKmVuYyA9IGN0eC0+Y29kZWMgPyBjdHgtPmNvZGVjIDogYXZjb2RlY19maW5kX2VuY29kZXIoY3R4LT5jb2RlY19pZCk7Ci0KLSAgICBpZiAoIWVuYykgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJTdHJlYW0gY29kZWMgaXMgbm90IGZvdW5kLiBDb2RlYyBwcml2YXRlIG9wdGlvbnMgYXJlIG5vdCBzdG9yZWQuXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChjdHgtPnByaXZfZGF0YSAmJiBlbmMtPnByaXZfY2xhc3MgJiYgZW5jLT5wcml2X2RhdGFfc2l6ZSkgewotICAgICAgICBpZiAoKHJldCA9IGF2X29wdF9zZXJpYWxpemUoY3R4LT5wcml2X2RhdGEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIHwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9TRVJJQUxJWkVfU0tJUF9ERUZBVUxUUywgJmJ1ZiwgJz0nLCAnLCcpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICBpZiAoYnVmICYmIHN0cmxlbihidWYpKSB7Ci0gICAgICAgICAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJnRtcCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShidWYpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdmlvX3B1dF9zdHIodG1wLCBidWYpOwotICAgICAgICAgICAgd3JpdGVfaGVhZGVyX2NodW5rKHBiLCB0bXAsIE1LQkVUQUcoJ0MnLCAnUCcsICdSJywgJ1YnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfZnJlZShidWYpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX2N0eChBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICpjdHgsIHVuc2lnbmVkIHRhZywgaW50IHR5cGUpCi17Ci0gICAgQVZJT0NvbnRleHQgKnRtcDsKLSAgICBjaGFyICpidWYgPSBOVUxMOwotICAgIGludCByZXQsIG5lZWRfY29tYSA9IDA7Ci0KLSNkZWZpbmUgU0tJUF9ERUZBVUxUUyAgIEFWX09QVF9TRVJJQUxJWkVfU0tJUF9ERUZBVUxUUwotI2RlZmluZSBPUFRfRkxBR1NfRVhBQ1QgQVZfT1BUX1NFUklBTElaRV9PUFRfRkxBR1NfRVhBQ1QKLSNkZWZpbmUgRU5DICAgICAgICAgICAgIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCi0KLSAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJnRtcCkgPCAwKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIGlmICgocmV0ID0gYXZfb3B0X3NlcmlhbGl6ZShjdHgsIEVOQyB8IHR5cGUsIFNLSVBfREVGQVVMVFMsICZidWYsICc9JywgJywnKSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgaWYgKGJ1ZiAmJiBzdHJsZW4oYnVmKSkgewotICAgICAgICBhdmlvX3dyaXRlKHRtcCwgYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZidWYpOwotICAgICAgICBuZWVkX2NvbWEgPSAxOwotICAgIH0KLSAgICBpZiAoKHJldCA9IGF2X29wdF9zZXJpYWxpemUoY3R4LCAwLCBTS0lQX0RFRkFVTFRTIHwgT1BUX0ZMQUdTX0VYQUNULCAmYnVmLCAnPScsICcsJykpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotICAgIGlmIChidWYgJiYgc3RybGVuKGJ1ZikpIHsKLSAgICAgICAgaWYgKG5lZWRfY29tYSkKLSAgICAgICAgICAgIGF2aW9fdzgodG1wLCAnLCcpOwotICAgICAgICBhdmlvX3dyaXRlKHRtcCwgYnVmLCBzdHJsZW4oYnVmKSk7Ci0gICAgfQotICAgIGF2X2ZyZWVwKCZidWYpOwotICAgIGF2aW9fdzgodG1wLCAwKTsKLSAgICB3cml0ZV9oZWFkZXJfY2h1bmsocGIsIHRtcCwgdGFnKTsKLSAgICByZXR1cm4gMDsKLSAgZmFpbDoKLSAgICBhdl9mcmVlKGJ1Zik7Ci0gICAgZmZpb19mcmVlX2R5bl9idWYoJnRtcCk7Ci0gICAgcmV0dXJuIHJldDsKLQotI3VuZGVmIFNLSVBfREVGQVVMVFMKLSN1bmRlZiBPUFRfRkxBR1NfRVhBQ1QKLSN1bmRlZiBFTkMKLX0KLQotc3RhdGljIGludCBmZm1fd3JpdGVfcmVjb21tZW5kZWRfY29uZmlnKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmN0eCwgdW5zaWduZWQgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbmZpZ3VyYXRpb24pCi17Ci0gICAgaW50IHJldDsKLSAgICBjb25zdCBBVkNvZGVjICplbmMgPSBjdHgtPmNvZGVjID8gY3R4LT5jb2RlYyA6IGF2Y29kZWNfZmluZF9lbmNvZGVyKGN0eC0+Y29kZWNfaWQpOwotICAgIEFWSU9Db250ZXh0ICp0bXA7Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOwotICAgIEFWRGljdGlvbmFyeSAqYWxsID0gTlVMTCwgKmNvbW0gPSBOVUxMLCAqcHJ2ID0gTlVMTDsKLSAgICBjaGFyICpidWYgPSBOVUxMOwotCi0gICAgaWYgKCFlbmMgfHwgIWVuYy0+cHJpdl9jbGFzcyB8fCAhZW5jLT5wcml2X2RhdGFfc2l6ZSkgewotICAgICAgICAvKiBjb2RlYyBpcyBub3Qga25vd24vaGFzIG5vIHByaXZhdGUgb3B0aW9ucywgc28gc2F2ZSBldmVyeXRoaW5nIGFzIGNvbW1vbiBvcHRpb25zICovCi0gICAgICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmdG1wKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBhdmlvX3B1dF9zdHIodG1wLCBjb25maWd1cmF0aW9uKTsKLSAgICAgICAgd3JpdGVfaGVhZGVyX2NodW5rKHBiLCB0bXAsIHRhZyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICgocmV0ID0gYXZfZGljdF9wYXJzZV9zdHJpbmcoJmFsbCwgY29uZmlndXJhdGlvbiwgIj0iLCAiLCIsIDApKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChhbGwsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkgewotICAgICAgICBpZiAoYXZfb3B0X2ZpbmQoKHZvaWQgKikmZW5jLT5wcml2X2NsYXNzLCB0LT5rZXksIE5VTEwsIDAsIEFWX09QVF9TRUFSQ0hfRkFLRV9PQkopKSB7Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGF2X2RpY3Rfc2V0KCZwcnYsIHQtPmtleSwgdC0+dmFsdWUsIDApKSA8IDApCi0gICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9IGVsc2UgaWYgKChyZXQgPSBhdl9kaWN0X3NldCgmY29tbSwgdC0+a2V5LCB0LT52YWx1ZSwgMCkpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoY29tbSkgewotICAgICAgICBpZiAoKHJldCA9IGF2X2RpY3RfZ2V0X3N0cmluZyhjb21tLCAmYnVmLCAnPScsICcsJykpIDwgMCB8fAotICAgICAgICAgICAgKHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZ0bXApKSA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGF2aW9fcHV0X3N0cih0bXAsIGJ1Zik7Ci0gICAgICAgIGF2X2ZyZWVwKCZidWYpOwotICAgICAgICB3cml0ZV9oZWFkZXJfY2h1bmsocGIsIHRtcCwgdGFnKTsKLSAgICB9Ci0gICAgaWYgKHBydikgewotICAgICAgICBpZiAoKHJldCA9IGF2X2RpY3RfZ2V0X3N0cmluZyhwcnYsICZidWYsICc9JywgJywnKSkgPCAwIHx8Ci0gICAgICAgICAgICAocmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJnRtcCkpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgYXZpb19wdXRfc3RyKHRtcCwgYnVmKTsKLSAgICAgICAgd3JpdGVfaGVhZGVyX2NodW5rKHBiLCB0bXAsIE1LQkVUQUcoJ0MnLCAnUCcsICdSJywgJ1YnKSk7Ci0gICAgfQotCi0gIGZhaWw6Ci0gICAgYXZfZnJlZShidWYpOwotICAgIGF2X2RpY3RfZnJlZSgmYWxsKTsKLSAgICBhdl9kaWN0X2ZyZWUoJmNvbW0pOwotICAgIGF2X2RpY3RfZnJlZSgmcHJ2KTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGZmbV93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQotewotICAgIEZGTUNvbnRleHQgKmZmbSA9IHMtPnByaXZfZGF0YTsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOwotICAgIGludCBiaXRfcmF0ZSwgaSwgcmV0OwotCi0gICAgaWYgKChyZXQgPSBmZl9wYXJzZV9jcmVhdGlvbl90aW1lX21ldGFkYXRhKHMsICZmZm0tPnN0YXJ0X3RpbWUsIDApKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBmZm0tPnBhY2tldF9zaXplID0gRkZNX1BBQ0tFVF9TSVpFOwotCi0gICAgLyogaGVhZGVyICovCi0gICAgYXZpb193bDMyKHBiLCBNS1RBRygnRicsICdGJywgJ00nLCAnMicpKTsKLSAgICBhdmlvX3diMzIocGIsIGZmbS0+cGFja2V0X3NpemUpOwotICAgIGF2aW9fd2I2NChwYiwgMCk7IC8qIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24gKi8KLQotICAgIGlmKGF2aW9fb3Blbl9keW5fYnVmKCZwYikgPCAwKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgYXZpb193YjMyKHBiLCBzLT5uYl9zdHJlYW1zKTsKLSAgICBiaXRfcmF0ZSA9IDA7Ci0gICAgZm9yKGk9MDtpPHMtPm5iX3N0cmVhbXM7aSsrKSB7Ci0gICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgYml0X3JhdGUgKz0gc3QtPmNvZGVjLT5iaXRfcmF0ZTsKLSAgICB9Ci0gICAgYXZpb193YjMyKHBiLCBiaXRfcmF0ZSk7Ci0KLSAgICB3cml0ZV9oZWFkZXJfY2h1bmsocy0+cGIsIHBiLCBNS0JFVEFHKCdNJywgJ0EnLCAnSScsICdOJykpOwotCi0gICAgLyogbGlzdCBvZiBzdHJlYW1zICovCi0gICAgZm9yKGk9MDtpPHMtPm5iX3N0cmVhbXM7aSsrKSB7Ci0gICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDAwMDApOwotICAgICAgICBpZihhdmlvX29wZW5fZHluX2J1ZigmcGIpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgY29kZWMgPSBzdC0+Y29kZWM7Ci0gICAgICAgIC8qIGdlbmVyaWMgaW5mbyAqLwotICAgICAgICBhdmlvX3diMzIocGIsIGNvZGVjLT5jb2RlY19pZCk7Ci0gICAgICAgIGF2aW9fdzgocGIsIGNvZGVjLT5jb2RlY190eXBlKTsKLSAgICAgICAgYXZpb193YjMyKHBiLCBjb2RlYy0+Yml0X3JhdGUpOwotICAgICAgICBhdmlvX3diMzIocGIsIGNvZGVjLT5mbGFncyk7Ci0gICAgICAgIGF2aW9fd2IzMihwYiwgY29kZWMtPmZsYWdzMik7Ci0gICAgICAgIGF2aW9fd2IzMihwYiwgY29kZWMtPmRlYnVnKTsKLSAgICAgICAgaWYgKGNvZGVjLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfR0xPQkFMX0hFQURFUikgewotICAgICAgICAgICAgYXZpb193YjMyKHBiLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICAgICAgYXZpb193cml0ZShwYiwgY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKLSAgICAgICAgfQotICAgICAgICB3cml0ZV9oZWFkZXJfY2h1bmsocy0+cGIsIHBiLCBNS0JFVEFHKCdDJywgJ08nLCAnTScsICdNJykpOwotICAgICAgICAvKiBzcGVjaWZpYyBpbmZvICovCi0gICAgICAgIHN3aXRjaChjb2RlYy0+Y29kZWNfdHlwZSkgewotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgICAgIGlmIChzdC0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIndyaXRpbmcgcmVjb21tZW5kZWQgY29uZmlndXJhdGlvbjogJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24pOwotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZtX3dyaXRlX3JlY29tbWVuZGVkX2NvbmZpZyhzLT5wYiwgY29kZWMsIE1LQkVUQUcoJ1MnLCAnMicsICdWJywgJ0knKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbikpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfSBlbHNlIGlmICgocmV0ID0gZmZtX3dyaXRlX2hlYWRlcl9jb2RlY19jdHgocy0+cGIsIGNvZGVjLCBNS0JFVEFHKCdTJywgJzInLCAnVicsICdJJyksIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNKSkgPCAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIChyZXQgPSBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX3ByaXZhdGVfY3R4KHMsIGNvZGVjLCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSkpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgaWYgKHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAid3JpdGluZyByZWNvbW1lbmRlZCBjb25maWd1cmF0aW9uOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZm1fd3JpdGVfcmVjb21tZW5kZWRfY29uZmlnKHMtPnBiLCBjb2RlYywgTUtCRVRBRygnUycsICcyJywgJ0EnLCAnVScpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uKSkgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChyZXQgPSBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX2N0eChzLT5wYiwgY29kZWMsIE1LQkVUQUcoJ1MnLCAnMicsICdBJywgJ1UnKSwgQVZfT1BUX0ZMQUdfQVVESU9fUEFSQU0pKSA8IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgIChyZXQgPSBmZm1fd3JpdGVfaGVhZGVyX2NvZGVjX3ByaXZhdGVfY3R4KHMsIGNvZGVjLCBBVl9PUFRfRkxBR19BVURJT19QQVJBTSkpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcGIgPSBzLT5wYjsKLQotICAgIGF2aW9fd2I2NChwYiwgMCk7IC8vIGVuZCBvZiBoZWFkZXIKLQotICAgIC8qIGZsdXNoIHVudGlsIGVuZCBvZiBibG9jayByZWFjaGVkICovCi0gICAgd2hpbGUgKChhdmlvX3RlbGwocGIpICUgZmZtLT5wYWNrZXRfc2l6ZSkgIT0gMCkKLSAgICAgICAgYXZpb193OChwYiwgMCk7Ci0KLSAgICBhdmlvX2ZsdXNoKHBiKTsKLQotICAgIC8qIGluaXQgcGFja2V0IG11eCAqLwotICAgIGZmbS0+cGFja2V0X3B0ciA9IGZmbS0+cGFja2V0OwotICAgIGZmbS0+cGFja2V0X2VuZCA9IGZmbS0+cGFja2V0ICsgZmZtLT5wYWNrZXRfc2l6ZSAtIEZGTV9IRUFERVJfU0laRTsKLSAgICBhdl9hc3NlcnQwKGZmbS0+cGFja2V0X2VuZCA+PSBmZm0tPnBhY2tldCk7Ci0gICAgZmZtLT5mcmFtZV9vZmZzZXQgPSAwOwotICAgIGZmbS0+ZHRzID0gMDsKLSAgICBmZm0tPmZpcnN0X3BhY2tldCA9IDE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmZm1fd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKLXsKLSAgICBGRk1Db250ZXh0ICpmZm0gPSBzLT5wcml2X2RhdGE7Ci0gICAgaW50NjRfdCBkdHM7Ci0gICAgdWludDhfdCBoZWFkZXJbRlJBTUVfSEVBREVSX1NJWkUrNF07Ci0gICAgaW50IGhlYWRlcl9zaXplID0gRlJBTUVfSEVBREVSX1NJWkU7Ci0KLSAgICBkdHMgPSBmZm0tPnN0YXJ0X3RpbWUgKyBwa3QtPmR0czsKLSAgICAvKiBwYWNrZXQgc2l6ZSAmIGtleV9mcmFtZSAqLwotICAgIGhlYWRlclswXSA9IHBrdC0+c3RyZWFtX2luZGV4OwotICAgIGhlYWRlclsxXSA9IDA7Ci0gICAgaWYgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpCi0gICAgICAgIGhlYWRlclsxXSB8PSBGTEFHX0tFWV9GUkFNRTsKLSAgICBBVl9XQjI0KGhlYWRlcisyLCBwa3QtPnNpemUpOwotICAgIEFWX1dCMjQoaGVhZGVyKzUsIHBrdC0+ZHVyYXRpb24pOwotICAgIEFWX1dCNjQoaGVhZGVyKzgsIGZmbS0+c3RhcnRfdGltZSArIHBrdC0+cHRzKTsKLSAgICBpZiAocGt0LT5wdHMgIT0gcGt0LT5kdHMpIHsKLSAgICAgICAgaGVhZGVyWzFdIHw9IEZMQUdfRFRTOwotICAgICAgICBBVl9XQjMyKGhlYWRlcisxNiwgcGt0LT5wdHMgLSBwa3QtPmR0cyk7Ci0gICAgICAgIGhlYWRlcl9zaXplICs9IDQ7Ci0gICAgfQotICAgIGZmbV93cml0ZV9kYXRhKHMsIGhlYWRlciwgaGVhZGVyX3NpemUsIGR0cywgMSk7Ci0gICAgZmZtX3dyaXRlX2RhdGEocywgcGt0LT5kYXRhLCBwa3QtPnNpemUsIGR0cywgMCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBmZm1fd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgRkZNQ29udGV4dCAqZmZtID0gcy0+cHJpdl9kYXRhOwotCi0gICAgLyogZmx1c2ggcGFja2V0cyAqLwotICAgIGlmIChmZm0tPnBhY2tldF9wdHIgPiBmZm0tPnBhY2tldCkKLSAgICAgICAgZmx1c2hfcGFja2V0KHMpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLUFWT3V0cHV0Rm9ybWF0IGZmX2ZmbV9tdXhlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgICAgPSAiZmZtIiwKLSAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRkZNIChGRnNlcnZlciBsaXZlIGZlZWQpIiksCi0gICAgLmV4dGVuc2lvbnMgICAgICAgID0gImZmbSIsCi0gICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKEZGTUNvbnRleHQpLAotICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX01QMiwKLSAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLAotICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZmbV93cml0ZV9oZWFkZXIsCi0gICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZtX3dyaXRlX3BhY2tldCwKLSAgICAud3JpdGVfdHJhaWxlciAgICAgPSBmZm1fd3JpdGVfdHJhaWxlciwKLSAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19ORUdBVElWRSwKLX07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9mZm1ldGFkZWMuYyBiL2xpYmF2Zm9ybWF0L2ZmbWV0YWRlYy5jCmluZGV4IGUyMjY0MDYuLjMyOTBiM2IgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2ZmbWV0YWRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2ZmbWV0YWRlYy5jCkBAIC0xMzksOCArMTM5LDggQEAKICAgICAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9GRk1FVEFEQVRBOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9GRk1FVEFEQVRBOwogCiAgICAgICAgICAgICBtID0gJnN0LT5tZXRhZGF0YTsKICAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKGxpbmUsIElEX0NIQVBURVIsIHN0cmxlbihJRF9DSEFQVEVSKSkpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ZpZm8uYyBiL2xpYmF2Zm9ybWF0L2ZpZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDVlMmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvZmlmby5jCkBAIC0wLDAgKzEsNjY3IEBACisvKgorICogRklGTyBwc2V1ZG8tbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBKYW4gU2ViZWNobGVic2t5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkbWVzc2FnZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKworI2RlZmluZSBGSUZPX0RFRkFVTFRfUVVFVUVfU0laRSAgICAgICAgICAgICAgNjAKKyNkZWZpbmUgRklGT19ERUZBVUxUX01BWF9SRUNPVkVSWV9BVFRFTVBUUyAgIDAKKyNkZWZpbmUgRklGT19ERUZBVUxUX1JFQ09WRVJZX1dBSVRfVElNRV9VU0VDIDUwMDAwMDAgLy8gNSBzZWNvbmRzCisKK3R5cGVkZWYgc3RydWN0IEZpZm9Db250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjsKKworICAgIGNoYXIgKmZvcm1hdDsKKyAgICBjaGFyICpmb3JtYXRfb3B0aW9uc19zdHI7CisgICAgQVZEaWN0aW9uYXJ5ICpmb3JtYXRfb3B0aW9uczsKKworICAgIGludCBxdWV1ZV9zaXplOworICAgIEFWVGhyZWFkTWVzc2FnZVF1ZXVlICpxdWV1ZTsKKworICAgIHB0aHJlYWRfdCB3cml0ZXJfdGhyZWFkOworCisgICAgLyogUmV0dXJuIHZhbHVlIG9mIGxhc3Qgd3JpdGVfdHJhaWxlcl9jYWxsICovCisgICAgaW50IHdyaXRlX3RyYWlsZXJfcmV0OworCisgICAgLyogVGltZSB0byB3YWl0IGJlZm9yZSBuZXh0IHJlY292ZXJ5IGF0dGVtcHQKKyAgICAgKiBUaGlzIGNhbiByZWZlciB0byB0aGUgdGltZSBpbiBwcm9jZXNzZWQgc3RyZWFtLAorICAgICAqIG9yIHJlYWwgdGltZS4gKi8KKyAgICBpbnQ2NF90IHJlY292ZXJ5X3dhaXRfdGltZTsKKworICAgIC8qIE1heGltYWwgbnVtYmVyIG9mIHVuc3VjY2Vzc2Z1bCBzdWNjZXNzaXZlIHJlY292ZXJ5IGF0dGVtcHRzICovCisgICAgaW50IG1heF9yZWNvdmVyeV9hdHRlbXB0czsKKworICAgIC8qIFdoZXRoZXIgdG8gYXR0ZW1wdCByZWNvdmVyeSBmcm9tIGZhaWx1cmUgKi8KKyAgICBpbnQgYXR0ZW1wdF9yZWNvdmVyeTsKKworICAgIC8qIElmID4wIHN0cmVhbSB0aW1lIHdpbGwgYmUgdXNlZCB3aGVuIHdhaXRpbmcKKyAgICAgKiBmb3IgdGhlIHJlY292ZXJ5IGF0dGVtcHQgaW5zdGVhZCBvZiByZWFsIHRpbWUgKi8KKyAgICBpbnQgcmVjb3Zlcnlfd2FpdF9zdHJlYW10aW1lOworCisgICAgLyogSWYgPjAgcmVjb3Zlcnkgd2lsbCBiZSBhdHRlbXB0ZWQgcmVnYXJkbGVzcyBvZiBlcnJvciBjb2RlCisgICAgICogKGV4Y2VwdCBBVkVSUk9SX0VYSVQsIHNvIGV4aXQgcmVxdWVzdCBpcyBuZXZlciBpZ25vcmVkKSAqLworICAgIGludCByZWNvdmVyX2FueV9lcnJvcjsKKworICAgIC8qIFdoZXRoZXIgdG8gZHJvcCBwYWNrZXRzIGluIGNhc2UgdGhlIHF1ZXVlIGlzIGZ1bGwuICovCisgICAgaW50IGRyb3BfcGt0c19vbl9vdmVyZmxvdzsKKworICAgIC8qIFdoZXRoZXIgdG8gd2FpdCBmb3Iga2V5ZnJhbWUgd2hlbiByZWNvdmVyaW5nCisgICAgICogZnJvbSBmYWlsdXJlIG9yIHF1ZXVlIG92ZXJmbG93ICovCisgICAgaW50IHJlc3RhcnRfd2l0aF9rZXlmcmFtZTsKKworICAgIHB0aHJlYWRfbXV0ZXhfdCBvdmVyZmxvd19mbGFnX2xvY2s7CisgICAgaW50IG92ZXJmbG93X2ZsYWdfbG9ja19pbml0aWFsaXplZDsKKyAgICAvKiBWYWx1ZSA+IDAgc2lnbmFscyBxdWV1ZSBvdmVyZmxvdyAqLworICAgIHZvbGF0aWxlIHVpbnQ4X3Qgb3ZlcmZsb3dfZmxhZzsKKworfSBGaWZvQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgRmlmb1RocmVhZENvbnRleHQgeworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmOworCisgICAgLyogVGltZXN0YW1wIG9mIGxhc3QgZmFpbHVyZS4KKyAgICAgKiBUaGlzIGlzIGVpdGhlciBwdHMgaW4gY2FzZSBzdHJlYW0gdGltZSBpcyB1c2VkLAorICAgICAqIG9yIG1pY3Jvc2Vjb25kcyBhcyByZXR1cm5lZCBieSBhdl9nZXR0dGltZV9yZWxhdGl2ZSgpICovCisgICAgaW50NjRfdCBsYXN0X3JlY292ZXJ5X3RzOworCisgICAgLyogTnVtYmVyIG9mIGN1cnJlbnQgcmVjb3ZlcnkgcHJvY2VzcworICAgICAqIFZhbHVlID4gMCBtZWFucyB3ZSBhcmUgaW4gcmVjb3ZlcnkgcHJvY2VzcyAqLworICAgIGludCByZWNvdmVyeV9ucjsKKworICAgIC8qIElmID4gMCBhbGwgZnJhbWVzIHdpbGwgYmUgZHJvcHBlZCB1bnRpbCBrZXlmcmFtZSBpcyByZWNlaXZlZCAqLworICAgIHVpbnQ4X3QgZHJvcF91bnRpbF9rZXlmcmFtZTsKKworICAgIC8qIFZhbHVlID4gMCBtZWFucyB0aGF0IHRoZSBwcmV2aW91cyB3cml0ZV9oZWFkZXIgY2FsbCB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIHNvIGZpbmFsaXphdGlvbiBieSBjYWxsaW5nIHdyaXRlX3RyYWlsZXIgYW5kIGZmX2lvX2Nsb3NlIG11c3QgYmUgZG9uZQorICAgICAqIGJlZm9yZSBleGl0aW5nIC8gcmVpbml0aWFsaXphdGlvbiBvZiB1bmRlcmx5aW5nIG11eGVyICovCisgICAgdWludDhfdCBoZWFkZXJfd3JpdHRlbjsKK30gRmlmb1RocmVhZENvbnRleHQ7CisKK3R5cGVkZWYgZW51bSBGaWZvTWVzc2FnZVR5cGUgeworICAgIEZJRk9fV1JJVEVfSEVBREVSLAorICAgIEZJRk9fV1JJVEVfUEFDS0VULAorICAgIEZJRk9fRkxVU0hfT1VUUFVUCit9IEZpZm9NZXNzYWdlVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgRmlmb01lc3NhZ2UgeworICAgIEZpZm9NZXNzYWdlVHlwZSB0eXBlOworICAgIEFWUGFja2V0IHBrdDsKK30gRmlmb01lc3NhZ2U7CisKK3N0YXRpYyBpbnQgZmlmb190aHJlYWRfd3JpdGVfaGVhZGVyKEZpZm9UaHJlYWRDb250ZXh0ICpjdHgpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmYgPSBjdHgtPmF2ZjsKKyAgICBGaWZvQ29udGV4dCAqZmlmbyA9IGF2Zi0+cHJpdl9kYXRhOworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmMiA9IGZpZm8tPmF2ZjsKKyAgICBBVkRpY3Rpb25hcnkgKmZvcm1hdF9vcHRpb25zID0gTlVMTDsKKyAgICBpbnQgcmV0LCBpOworCisgICAgcmV0ID0gYXZfZGljdF9jb3B5KCZmb3JtYXRfb3B0aW9ucywgZmlmby0+Zm9ybWF0X29wdGlvbnMsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gZmZfZm9ybWF0X291dHB1dF9vcGVuKGF2ZjIsIGF2Zi0+dXJsLCAmZm9ybWF0X29wdGlvbnMpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIkVycm9yIG9wZW5pbmcgJXM6ICVzXG4iLCBhdmYtPnVybCwKKyAgICAgICAgICAgICAgIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGZvciAoaSA9IDA7aSA8IGF2ZjItPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgYXZmMi0+c3RyZWFtc1tpXS0+Y3VyX2R0cyA9IDA7CisKKyAgICByZXQgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIoYXZmMiwgJmZvcm1hdF9vcHRpb25zKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgY3R4LT5oZWFkZXJfd3JpdHRlbiA9IDE7CisKKyAgICAvLyBDaGVjayBmb3Igb3B0aW9ucyB1bnJlY29nbml6ZWQgYnkgdW5kZXJseWluZyBtdXhlcgorICAgIGlmIChmb3JtYXRfb3B0aW9ucykgeworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZW50cnkgPSBOVUxMOworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gYXZfZGljdF9nZXQoZm9ybWF0X29wdGlvbnMsICIiLCBlbnRyeSwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpCisgICAgICAgICAgICBhdl9sb2coYXZmMiwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBvcHRpb24gJyVzJ1xuIiwgZW50cnktPmtleSk7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKK2VuZDoKKyAgICBhdl9kaWN0X2ZyZWUoJmZvcm1hdF9vcHRpb25zKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZpZm9fdGhyZWFkX2ZsdXNoX291dHB1dChGaWZvVGhyZWFkQ29udGV4dCAqY3R4KQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmID0gY3R4LT5hdmY7CisgICAgRmlmb0NvbnRleHQgKmZpZm8gPSBhdmYtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjIgPSBmaWZvLT5hdmY7CisKKyAgICByZXR1cm4gYXZfd3JpdGVfZnJhbWUoYXZmMiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgZmlmb190aHJlYWRfd3JpdGVfcGFja2V0KEZpZm9UaHJlYWRDb250ZXh0ICpjdHgsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmYgPSBjdHgtPmF2ZjsKKyAgICBGaWZvQ29udGV4dCAqZmlmbyA9IGF2Zi0+cHJpdl9kYXRhOworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmMiA9IGZpZm8tPmF2ZjsKKyAgICBBVlJhdGlvbmFsIHNyY190YiwgZHN0X3RiOworICAgIGludCByZXQsIHNfaWR4OworCisgICAgaWYgKGN0eC0+ZHJvcF91bnRpbF9rZXlmcmFtZSkgeworICAgICAgICBpZiAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgeworICAgICAgICAgICAgY3R4LT5kcm9wX3VudGlsX2tleWZyYW1lID0gMDsKKyAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19WRVJCT1NFLCAiS2V5ZnJhbWUgcmVjZWl2ZWQsIHJlY292ZXJpbmcuLi5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX1ZFUkJPU0UsICJEcm9wcGluZyBub24ta2V5ZnJhbWUgcGFja2V0XG4iKTsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzX2lkeCA9IHBrdC0+c3RyZWFtX2luZGV4OworICAgIHNyY190YiA9IGF2Zi0+c3RyZWFtc1tzX2lkeF0tPnRpbWVfYmFzZTsKKyAgICBkc3RfdGIgPSBhdmYyLT5zdHJlYW1zW3NfaWR4XS0+dGltZV9iYXNlOworICAgIGF2X3BhY2tldF9yZXNjYWxlX3RzKHBrdCwgc3JjX3RiLCBkc3RfdGIpOworCisgICAgcmV0ID0gYXZfd3JpdGVfZnJhbWUoYXZmMiwgcGt0KTsKKyAgICBpZiAocmV0ID49IDApCisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlmb190aHJlYWRfd3JpdGVfdHJhaWxlcihGaWZvVGhyZWFkQ29udGV4dCAqY3R4KQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmID0gY3R4LT5hdmY7CisgICAgRmlmb0NvbnRleHQgKmZpZm8gPSBhdmYtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjIgPSBmaWZvLT5hdmY7CisgICAgaW50IHJldDsKKworICAgIGlmICghY3R4LT5oZWFkZXJfd3JpdHRlbikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXQgPSBhdl93cml0ZV90cmFpbGVyKGF2ZjIpOworICAgIGZmX2Zvcm1hdF9pb19jbG9zZShhdmYyLCAmYXZmMi0+cGIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBmaWZvX3RocmVhZF9kaXNwYXRjaF9tZXNzYWdlKEZpZm9UaHJlYWRDb250ZXh0ICpjdHgsIEZpZm9NZXNzYWdlICptc2cpCit7CisgICAgaW50IHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmICghY3R4LT5oZWFkZXJfd3JpdHRlbikgeworICAgICAgICByZXQgPSBmaWZvX3RocmVhZF93cml0ZV9oZWFkZXIoY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN3aXRjaChtc2ctPnR5cGUpIHsKKyAgICBjYXNlIEZJRk9fV1JJVEVfSEVBREVSOgorICAgICAgICBhdl9hc3NlcnQwKHJldCA+PSAwKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBjYXNlIEZJRk9fV1JJVEVfUEFDS0VUOgorICAgICAgICByZXR1cm4gZmlmb190aHJlYWRfd3JpdGVfcGFja2V0KGN0eCwgJm1zZy0+cGt0KTsKKyAgICBjYXNlIEZJRk9fRkxVU0hfT1VUUFVUOgorICAgICAgICByZXR1cm4gZmlmb190aHJlYWRfZmx1c2hfb3V0cHV0KGN0eCk7CisgICAgfQorCisgICAgYXZfYXNzZXJ0MCgwKTsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCitzdGF0aWMgaW50IGlzX3JlY292ZXJhYmxlKGNvbnN0IEZpZm9Db250ZXh0ICpmaWZvLCBpbnQgZXJyX25vKSB7CisgICAgaWYgKCFmaWZvLT5hdHRlbXB0X3JlY292ZXJ5KQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChmaWZvLT5yZWNvdmVyX2FueV9lcnJvcikKKyAgICAgICAgcmV0dXJuIGVycl9ubyAhPSBBVkVSUk9SX0VYSVQ7CisKKyAgICBzd2l0Y2ggKGVycl9ubykgeworICAgIGNhc2UgQVZFUlJPUihFSU5WQUwpOgorICAgIGNhc2UgQVZFUlJPUihFTk9TWVMpOgorICAgIGNhc2UgQVZFUlJPUl9FT0Y6CisgICAgY2FzZSBBVkVSUk9SX0VYSVQ6CisgICAgY2FzZSBBVkVSUk9SX1BBVENIV0VMQ09NRToKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBmcmVlX21lc3NhZ2Uodm9pZCAqbXNnKQoreworICAgIEZpZm9NZXNzYWdlICpmaWZvX21zZyA9IG1zZzsKKworICAgIGlmIChmaWZvX21zZy0+dHlwZSA9PSBGSUZPX1dSSVRFX1BBQ0tFVCkKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKCZmaWZvX21zZy0+cGt0KTsKK30KKworc3RhdGljIGludCBmaWZvX3RocmVhZF9wcm9jZXNzX3JlY292ZXJ5X2ZhaWx1cmUoRmlmb1RocmVhZENvbnRleHQgKmN0eCwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJfbm8pCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmYgPSBjdHgtPmF2ZjsKKyAgICBGaWZvQ29udGV4dCAqZmlmbyA9IGF2Zi0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBhdl9sb2coYXZmLCBBVl9MT0dfSU5GTywgIlJlY292ZXJ5IGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgIGF2X2VycjJzdHIoZXJyX25vKSk7CisKKyAgICBpZiAoZmlmby0+cmVjb3Zlcnlfd2FpdF9zdHJlYW10aW1lKSB7CisgICAgICAgIGlmIChwa3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19XQVJOSU5HLCAiUGFja2V0IGRvZXMgbm90IGNvbnRhaW4gcHJlc2VudGF0aW9uIgorICAgICAgICAgICAgICAgICAgICIgdGltZXN0YW1wLCByZWNvdmVyeSB3aWxsIGJlIGF0dGVtcHRlZCBpbW1lZGlhdGVseSIpOworICAgICAgICBjdHgtPmxhc3RfcmVjb3ZlcnlfdHMgPSBwa3QtPnB0czsKKyAgICB9IGVsc2UgeworICAgICAgICBjdHgtPmxhc3RfcmVjb3ZlcnlfdHMgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgfQorCisgICAgaWYgKGZpZm8tPm1heF9yZWNvdmVyeV9hdHRlbXB0cyAmJgorICAgICAgICBjdHgtPnJlY292ZXJ5X25yID49IGZpZm8tPm1heF9yZWNvdmVyeV9hdHRlbXB0cykgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiTWF4aW1hbCBudW1iZXIgb2YgJWQgcmVjb3ZlcnkgYXR0ZW1wdHMgcmVhY2hlZC5cbiIsCisgICAgICAgICAgICAgICBmaWZvLT5tYXhfcmVjb3ZlcnlfYXR0ZW1wdHMpOworICAgICAgICByZXQgPSBlcnJfbm87CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFQUdBSU4pOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlmb190aHJlYWRfYXR0ZW1wdF9yZWNvdmVyeShGaWZvVGhyZWFkQ29udGV4dCAqY3R4LCBGaWZvTWVzc2FnZSAqbXNnLCBpbnQgZXJyX25vKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmID0gY3R4LT5hdmY7CisgICAgRmlmb0NvbnRleHQgKmZpZm8gPSBhdmYtPnByaXZfZGF0YTsKKyAgICBBVlBhY2tldCAqcGt0ID0gJm1zZy0+cGt0OworICAgIGludDY0X3QgdGltZV9zaW5jZV9yZWNvdmVyeTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFpc19yZWNvdmVyYWJsZShmaWZvLCBlcnJfbm8pKSB7CisgICAgICAgIHJldCA9IGVycl9ubzsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChjdHgtPmhlYWRlcl93cml0dGVuKSB7CisgICAgICAgIGZpZm8tPndyaXRlX3RyYWlsZXJfcmV0ID0gZmlmb190aHJlYWRfd3JpdGVfdHJhaWxlcihjdHgpOworICAgICAgICBjdHgtPmhlYWRlcl93cml0dGVuID0gMDsKKyAgICB9CisKKyAgICBpZiAoIWN0eC0+cmVjb3ZlcnlfbnIpIHsKKyAgICAgICAgY3R4LT5sYXN0X3JlY292ZXJ5X3RzID0gZmlmby0+cmVjb3Zlcnlfd2FpdF9zdHJlYW10aW1lID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTk9QVFNfVkFMVUUgOiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmaWZvLT5yZWNvdmVyeV93YWl0X3N0cmVhbXRpbWUpIHsKKyAgICAgICAgICAgIGlmIChjdHgtPmxhc3RfcmVjb3ZlcnlfdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIHRiID0gYXZmLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+dGltZV9iYXNlOworICAgICAgICAgICAgICAgIHRpbWVfc2luY2VfcmVjb3ZlcnkgPSBhdl9yZXNjYWxlX3EocGt0LT5wdHMgLSBjdHgtPmxhc3RfcmVjb3ZlcnlfdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YiwgQVZfVElNRV9CQVNFX1EpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBFbmZvcmNlIHJlY292ZXJ5IGltbWVkaWF0ZWx5ICovCisgICAgICAgICAgICAgICAgdGltZV9zaW5jZV9yZWNvdmVyeSA9IGZpZm8tPnJlY292ZXJ5X3dhaXRfdGltZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRpbWVfc2luY2VfcmVjb3ZlcnkgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSBjdHgtPmxhc3RfcmVjb3ZlcnlfdHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGltZV9zaW5jZV9yZWNvdmVyeSA8IGZpZm8tPnJlY292ZXJ5X3dhaXRfdGltZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CisgICAgfQorCisgICAgY3R4LT5yZWNvdmVyeV9ucisrOworCisgICAgaWYgKGZpZm8tPm1heF9yZWNvdmVyeV9hdHRlbXB0cykgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfVkVSQk9TRSwgIlJlY292ZXJ5IGF0dGVtcHQgIyVkLyVkXG4iLAorICAgICAgICAgICAgICAgY3R4LT5yZWNvdmVyeV9uciwgZmlmby0+bWF4X3JlY292ZXJ5X2F0dGVtcHRzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfVkVSQk9TRSwgIlJlY292ZXJ5IGF0dGVtcHQgIyVkXG4iLAorICAgICAgICAgICAgICAgY3R4LT5yZWNvdmVyeV9ucik7CisgICAgfQorCisgICAgaWYgKGZpZm8tPnJlc3RhcnRfd2l0aF9rZXlmcmFtZSAmJiBmaWZvLT5kcm9wX3BrdHNfb25fb3ZlcmZsb3cpCisgICAgICAgIGN0eC0+ZHJvcF91bnRpbF9rZXlmcmFtZSA9IDE7CisKKyAgICByZXQgPSBmaWZvX3RocmVhZF9kaXNwYXRjaF9tZXNzYWdlKGN0eCwgbXNnKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoaXNfcmVjb3ZlcmFibGUoZmlmbywgcmV0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZpZm9fdGhyZWFkX3Byb2Nlc3NfcmVjb3ZlcnlfZmFpbHVyZShjdHgsIHBrdCwgcmV0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19JTkZPLCAiUmVjb3Zlcnkgc3VjY2Vzc2Z1bFxuIik7CisgICAgICAgIGN0eC0+cmVjb3ZlcnlfbnIgPSAwOworICAgIH0KKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZyZWVfbWVzc2FnZShtc2cpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlmb190aHJlYWRfcmVjb3ZlcihGaWZvVGhyZWFkQ29udGV4dCAqY3R4LCBGaWZvTWVzc2FnZSAqbXNnLCBpbnQgZXJyX25vKQoreworICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmID0gY3R4LT5hdmY7CisgICAgRmlmb0NvbnRleHQgKmZpZm8gPSBhdmYtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgZG8geworICAgICAgICBpZiAoIWZpZm8tPnJlY292ZXJ5X3dhaXRfc3RyZWFtdGltZSAmJiBjdHgtPnJlY292ZXJ5X25yID4gMCkgeworICAgICAgICAgICAgaW50NjRfdCB0aW1lX3NpbmNlX3JlY292ZXJ5ID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIC0gY3R4LT5sYXN0X3JlY292ZXJ5X3RzOworICAgICAgICAgICAgaW50NjRfdCB0aW1lX3RvX3dhaXQgPSBGRk1BWCgwLCBmaWZvLT5yZWNvdmVyeV93YWl0X3RpbWUgLSB0aW1lX3NpbmNlX3JlY292ZXJ5KTsKKyAgICAgICAgICAgIGlmICh0aW1lX3RvX3dhaXQpCisgICAgICAgICAgICAgICAgYXZfdXNsZWVwKEZGTUlOKDEwMDAwLCB0aW1lX3RvX3dhaXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGZpZm9fdGhyZWFkX2F0dGVtcHRfcmVjb3ZlcnkoY3R4LCBtc2csIGVycl9ubyk7CisgICAgfSB3aGlsZSAocmV0ID09IEFWRVJST1IoRUFHQUlOKSAmJiAhZmlmby0+ZHJvcF9wa3RzX29uX292ZXJmbG93KTsKKworICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pICYmIGZpZm8tPmRyb3BfcGt0c19vbl9vdmVyZmxvdykgeworICAgICAgICBpZiAobXNnLT50eXBlID09IEZJRk9fV1JJVEVfUEFDS0VUKQorICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZtc2ctPnBrdCk7CisgICAgICAgIHJldCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgKmZpZm9fY29uc3VtZXJfdGhyZWFkKHZvaWQgKmRhdGEpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICphdmYgPSBkYXRhOworICAgIEZpZm9Db250ZXh0ICpmaWZvID0gYXZmLT5wcml2X2RhdGE7CisgICAgQVZUaHJlYWRNZXNzYWdlUXVldWUgKnF1ZXVlID0gZmlmby0+cXVldWU7CisgICAgRmlmb01lc3NhZ2UgbXNnID0ge0ZJRk9fV1JJVEVfSEVBREVSLCB7MH19OworICAgIGludCByZXQ7CisKKyAgICBGaWZvVGhyZWFkQ29udGV4dCBmaWZvX3RocmVhZF9jdHg7CisgICAgbWVtc2V0KCZmaWZvX3RocmVhZF9jdHgsIDAsIHNpemVvZihGaWZvVGhyZWFkQ29udGV4dCkpOworICAgIGZpZm9fdGhyZWFkX2N0eC5hdmYgPSBhdmY7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB1aW50OF90IGp1c3RfZmx1c2hlZCA9IDA7CisKKyAgICAgICAgaWYgKCFmaWZvX3RocmVhZF9jdHgucmVjb3ZlcnlfbnIpCisgICAgICAgICAgICByZXQgPSBmaWZvX3RocmVhZF9kaXNwYXRjaF9tZXNzYWdlKCZmaWZvX3RocmVhZF9jdHgsICZtc2cpOworCisgICAgICAgIGlmIChyZXQgPCAwIHx8IGZpZm9fdGhyZWFkX2N0eC5yZWNvdmVyeV9uciA+IDApIHsKKyAgICAgICAgICAgIGludCByZWNfcmV0ID0gZmlmb190aHJlYWRfcmVjb3ZlcigmZmlmb190aHJlYWRfY3R4LCAmbXNnLCByZXQpOworICAgICAgICAgICAgaWYgKHJlY19yZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2V0X2Vycl9zZW5kKHF1ZXVlLCByZWNfcmV0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHRoZSBxdWV1ZSBpcyBmdWxsIGF0IHRoZSBtb21lbnQgd2hlbiBmaWZvX3dyaXRlX3BhY2tldAorICAgICAgICAgKiBhdHRlbXB0cyB0byBpbnNlcnQgbmV3IG1lc3NhZ2UgKHBhY2tldCkgdG8gdGhlIHF1ZXVlLAorICAgICAgICAgKiBpdCBzZXRzIHRoZSBmaWZvLT5vdmVyZmxvd19mbGFnIHRvIDEgYW5kIGRyb3BzIHBhY2tldC4KKyAgICAgICAgICogSGVyZSBpbiBjb25zdW1lciB0aHJlYWQsIHRoZSBmbGFnIGlzIGNoZWNrZWQgYW5kIGlmIGl0IGlzCisgICAgICAgICAqIHNldCwgdGhlIHF1ZXVlIGlzIGZsdXNoZWQgYW5kIGZsYWcgY2xlYXJlZC4gKi8KKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZmaWZvLT5vdmVyZmxvd19mbGFnX2xvY2spOworICAgICAgICBpZiAoZmlmby0+b3ZlcmZsb3dfZmxhZykgeworICAgICAgICAgICAgYXZfdGhyZWFkX21lc3NhZ2VfZmx1c2gocXVldWUpOworICAgICAgICAgICAgaWYgKGZpZm8tPnJlc3RhcnRfd2l0aF9rZXlmcmFtZSkKKyAgICAgICAgICAgICAgICBmaWZvX3RocmVhZF9jdHguZHJvcF91bnRpbF9rZXlmcmFtZSA9IDE7CisgICAgICAgICAgICBmaWZvLT5vdmVyZmxvd19mbGFnID0gMDsKKyAgICAgICAgICAgIGp1c3RfZmx1c2hlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmZpZm8tPm92ZXJmbG93X2ZsYWdfbG9jayk7CisKKyAgICAgICAgaWYgKGp1c3RfZmx1c2hlZCkKKyAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19JTkZPLCAiRklGTyBxdWV1ZSBmbHVzaGVkXG4iKTsKKworICAgICAgICByZXQgPSBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9yZWN2KHF1ZXVlLCAmbXNnLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfc2VuZChxdWV1ZSwgcmV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZmlmby0+d3JpdGVfdHJhaWxlcl9yZXQgPSBmaWZvX3RocmVhZF93cml0ZV90cmFpbGVyKCZmaWZvX3RocmVhZF9jdHgpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgZmlmb19tdXhfaW5pdChBVkZvcm1hdENvbnRleHQgKmF2ZiwgQVZPdXRwdXRGb3JtYXQgKm9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisgICAgRmlmb0NvbnRleHQgKmZpZm8gPSBhdmYtPnByaXZfZGF0YTsKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjI7CisgICAgaW50IHJldCA9IDAsIGk7CisKKyAgICByZXQgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJmF2ZjIsIG9mb3JtYXQsIE5VTEwsIGZpbGVuYW1lKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGZpZm8tPmF2ZiA9IGF2ZjI7CisKKyAgICBhdmYyLT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSBhdmYtPmludGVycnVwdF9jYWxsYmFjazsKKyAgICBhdmYyLT5tYXhfZGVsYXkgPSBhdmYtPm1heF9kZWxheTsKKyAgICByZXQgPSBhdl9kaWN0X2NvcHkoJmF2ZjItPm1ldGFkYXRhLCBhdmYtPm1ldGFkYXRhLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBhdmYyLT5vcGFxdWUgPSBhdmYtPm9wYXF1ZTsKKyAgICBhdmYyLT5pb19jbG9zZSA9IGF2Zi0+aW9fY2xvc2U7CisgICAgYXZmMi0+aW9fb3BlbiA9IGF2Zi0+aW9fb3BlbjsKKyAgICBhdmYyLT5mbGFncyA9IGF2Zi0+ZmxhZ3M7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYXZmLT5uYl9zdHJlYW1zOyArK2kpIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShhdmYyLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgcmV0ID0gZmZfc3RyZWFtX2VuY29kZV9wYXJhbXNfY29weShzdCwgYXZmLT5zdHJlYW1zW2ldKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpZm9faW5pdChBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBGaWZvQ29udGV4dCAqZmlmbyA9IGF2Zi0+cHJpdl9kYXRhOworICAgIEFWT3V0cHV0Rm9ybWF0ICpvZm9ybWF0OworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGZpZm8tPnJlY292ZXJ5X3dhaXRfc3RyZWFtdGltZSAmJiAhZmlmby0+ZHJvcF9wa3RzX29uX292ZXJmbG93KSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgInJlY292ZXJ5X3dhaXRfc3RyZWFtdGltZSBjYW4gYmUgdHVybmVkIG9uIgorICAgICAgICAgICAgICAgIiBvbmx5IHdoZW4gZHJvcF9wa3RzX29uX292ZXJmbG93IGlzIGFsc28gdHVybmVkIG9uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoZmlmby0+Zm9ybWF0X29wdGlvbnNfc3RyKSB7CisgICAgICAgIHJldCA9IGF2X2RpY3RfcGFyc2Vfc3RyaW5nKCZmaWZvLT5mb3JtYXRfb3B0aW9ucywgZmlmby0+Zm9ybWF0X29wdGlvbnNfc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPSIsICI6IiwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgcGFyc2UgZm9ybWF0IG9wdGlvbnMgbGlzdCAnJXMnXG4iLAorICAgICAgICAgICAgICAgICAgIGZpZm8tPmZvcm1hdF9vcHRpb25zX3N0cik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgb2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdChmaWZvLT5mb3JtYXQsIGF2Zi0+dXJsLCBOVUxMKTsKKyAgICBpZiAoIW9mb3JtYXQpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9NVVhFUl9OT1RfRk9VTkQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gZmlmb19tdXhfaW5pdChhdmYsIG9mb3JtYXQsIGF2Zi0+dXJsKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2FsbG9jKCZmaWZvLT5xdWV1ZSwgKHVuc2lnbmVkKSBmaWZvLT5xdWV1ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGaWZvTWVzc2FnZSkpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2V0X2ZyZWVfZnVuYyhmaWZvLT5xdWV1ZSwgZnJlZV9tZXNzYWdlKTsKKworICAgIHJldCA9IHB0aHJlYWRfbXV0ZXhfaW5pdCgmZmlmby0+b3ZlcmZsb3dfZmxhZ19sb2NrLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IocmV0KTsKKyAgICBmaWZvLT5vdmVyZmxvd19mbGFnX2xvY2tfaW5pdGlhbGl6ZWQgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlmb193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmYpCit7CisgICAgRmlmb0NvbnRleHQgKiBmaWZvID0gYXZmLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IHB0aHJlYWRfY3JlYXRlKCZmaWZvLT53cml0ZXJfdGhyZWFkLCBOVUxMLCBmaWZvX2NvbnN1bWVyX3RocmVhZCwgYXZmKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzdGFydCB0aHJlYWQ6ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZXJyMnN0cihBVkVSUk9SKHJldCkpKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihyZXQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlmb193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmYsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRmlmb0NvbnRleHQgKmZpZm8gPSBhdmYtPnByaXZfZGF0YTsKKyAgICBGaWZvTWVzc2FnZSBtc2cgPSB7LnR5cGUgPSBwa3QgPyBGSUZPX1dSSVRFX1BBQ0tFVCA6IEZJRk9fRkxVU0hfT1VUUFVUfTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHBrdCkgeworICAgICAgICBhdl9pbml0X3BhY2tldCgmbXNnLnBrdCk7CisgICAgICAgIHJldCA9IGF2X3BhY2tldF9yZWYoJm1zZy5wa3QscGt0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NlbmQoZmlmby0+cXVldWUsICZtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWZvLT5kcm9wX3BrdHNfb25fb3ZlcmZsb3cgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVEhSRUFEX01FU1NBR0VfTk9OQkxPQ0sgOiAwKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkgeworICAgICAgICB1aW50OF90IG92ZXJmbG93X3NldCA9IDA7CisKKyAgICAgICAgLyogUXVldWUgaXMgZnVsbCwgc2V0IGZpZm8tPm92ZXJmbG93X2ZsYWcgdG8gMQorICAgICAgICAgKiB0byBsZXQgY29uc3VtZXIgdGhyZWFkIGtub3cgdGhlIHF1ZXVlIHNob3VsZAorICAgICAgICAgKiBiZSBmbHVzaGVkLiAqLworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmZpZm8tPm92ZXJmbG93X2ZsYWdfbG9jayk7CisgICAgICAgIGlmICghZmlmby0+b3ZlcmZsb3dfZmxhZykKKyAgICAgICAgICAgIGZpZm8tPm92ZXJmbG93X2ZsYWcgPSBvdmVyZmxvd19zZXQgPSAxOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmZmlmby0+b3ZlcmZsb3dfZmxhZ19sb2NrKTsKKworICAgICAgICBpZiAob3ZlcmZsb3dfc2V0KQorICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX1dBUk5JTkcsICJGSUZPIHF1ZXVlIGZ1bGxcbiIpOworICAgICAgICByZXQgPSAwOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworZmFpbDoKKyAgICBpZiAocGt0KQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJm1zZy5wa3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlmb193cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqYXZmKQoreworICAgIEZpZm9Db250ZXh0ICpmaWZvPSBhdmYtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworCisgICAgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2V0X2Vycl9yZWN2KGZpZm8tPnF1ZXVlLCBBVkVSUk9SX0VPRik7CisKKyAgICByZXQgPSBwdGhyZWFkX2pvaW4oZmlmby0+d3JpdGVyX3RocmVhZCwgTlVMTCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLCAicHRocmVhZCBqb2luIGVycm9yOiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2VycjJzdHIoQVZFUlJPUihyZXQpKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKHJldCk7CisgICAgfQorCisgICAgcmV0ID0gZmlmby0+d3JpdGVfdHJhaWxlcl9yZXQ7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZmlmb19kZWluaXQoQVZGb3JtYXRDb250ZXh0ICphdmYpCit7CisgICAgRmlmb0NvbnRleHQgKmZpZm8gPSBhdmYtPnByaXZfZGF0YTsKKworICAgIGF2X2RpY3RfZnJlZSgmZmlmby0+Zm9ybWF0X29wdGlvbnMpOworICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChmaWZvLT5hdmYpOworICAgIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX2ZyZWUoJmZpZm8tPnF1ZXVlKTsKKyAgICBpZiAoZmlmby0+b3ZlcmZsb3dfZmxhZ19sb2NrX2luaXRpYWxpemVkKQorICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJmZpZm8tPm92ZXJmbG93X2ZsYWdfbG9jayk7Cit9CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZpZm9Db250ZXh0LCB4KQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAgICAgeyJmaWZvX2Zvcm1hdCIsICJUYXJnZXQgbXV4ZXIiLCBPRkZTRVQoZm9ybWF0KSwKKyAgICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgMCwgMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAorCisgICAgICAgIHsicXVldWVfc2l6ZSIsICJTaXplIG9mIGZpZm8gcXVldWUiLCBPRkZTRVQocXVldWVfc2l6ZSksCisgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gRklGT19ERUZBVUxUX1FVRVVFX1NJWkV9LCAxLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisKKyAgICAgICAgeyJmb3JtYXRfb3B0cyIsICJPcHRpb25zIHRvIGJlIHBhc3NlZCB0byB1bmRlcmx5aW5nIG11eGVyIiwgT0ZGU0VUKGZvcm1hdF9vcHRpb25zX3N0ciksCisgICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKworICAgICAgICB7ImRyb3BfcGt0c19vbl9vdmVyZmxvdyIsICJEcm9wIHBhY2tldHMgb24gZmlmbyBxdWV1ZSBvdmVyZmxvdyBub3QgdG8gYmxvY2sgZW5jb2RlciIsIE9GRlNFVChkcm9wX3BrdHNfb25fb3ZlcmZsb3cpLAorICAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAorCisgICAgICAgIHsicmVzdGFydF93aXRoX2tleWZyYW1lIiwgIldhaXQgZm9yIGtleWZyYW1lIHdoZW4gcmVzdGFydGluZyBvdXRwdXQiLCBPRkZTRVQocmVzdGFydF93aXRoX2tleWZyYW1lKSwKKyAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIDAsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKworICAgICAgICB7ImF0dGVtcHRfcmVjb3ZlcnkiLCAiQXR0ZW1wdCByZWNvdmVyeSBpbiBjYXNlIG9mIGZhaWx1cmUiLCBPRkZTRVQoYXR0ZW1wdF9yZWNvdmVyeSksCisgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIDAsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKworICAgICAgICB7Im1heF9yZWNvdmVyeV9hdHRlbXB0cyIsICJNYXhpbWFsIG51bWJlciBvZiByZWNvdmVyeSBhdHRlbXB0cyIsIE9GRlNFVChtYXhfcmVjb3ZlcnlfYXR0ZW1wdHMpLAorICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEZJRk9fREVGQVVMVF9NQVhfUkVDT1ZFUllfQVRURU1QVFN9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisKKyAgICAgICAgeyJyZWNvdmVyeV93YWl0X3RpbWUiLCAiV2FpdGluZyB0aW1lIGJldHdlZW4gcmVjb3ZlcnkgYXR0ZW1wdHMiLCBPRkZTRVQocmVjb3Zlcnlfd2FpdF90aW1lKSwKKyAgICAgICAgIEFWX09QVF9UWVBFX0RVUkFUSU9OLCB7Lmk2NCA9IEZJRk9fREVGQVVMVF9SRUNPVkVSWV9XQUlUX1RJTUVfVVNFQ30sIDAsIElOVDY0X01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAorCisgICAgICAgIHsicmVjb3Zlcnlfd2FpdF9zdHJlYW10aW1lIiwgIlVzZSBzdHJlYW0gdGltZSBpbnN0ZWFkIG9mIHJlYWwgdGltZSB3aGlsZSB3YWl0aW5nIGZvciByZWNvdmVyeSIsCisgICAgICAgICBPRkZTRVQocmVjb3Zlcnlfd2FpdF9zdHJlYW10aW1lKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAorCisgICAgICAgIHsicmVjb3Zlcl9hbnlfZXJyb3IiLCAiQXR0ZW1wdCByZWNvdmVyeSByZWdhcmRsZXNzIG9mIHR5cGUgb2YgdGhlIGVycm9yIiwgT0ZGU0VUKHJlY292ZXJfYW55X2Vycm9yKSwKKyAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIDAsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKworICAgICAgICB7TlVMTH0sCit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmaWZvX211eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkZpZm8gbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfZmlmb19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmlmbyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZJRk8gcXVldWUgcHNldWRvLW11eGVyIiksCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZpZm9Db250ZXh0KSwKKyAgICAuaW5pdCAgICAgICAgICAgPSBmaWZvX2luaXQsCisgICAgLndyaXRlX2hlYWRlciAgID0gZmlmb193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gZmlmb193cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gZmlmb193cml0ZV90cmFpbGVyLAorICAgIC5kZWluaXQgICAgICAgICA9IGZpZm9fZGVpbml0LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZmaWZvX211eGVyX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PRklMRSB8IEFWRk1UX0FMTE9XX0ZMVVNIIHwgQVZGTVRfVFNfTkVHQVRJVkUsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZmlmb190ZXN0LmMgYi9saWJhdmZvcm1hdC9maWZvX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmVjMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvZmlmb190ZXN0LmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBGSUZPIHRlc3QgcHNldWRvLW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgSmFuIFNlYmVjaGxlYnNreQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgKiBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJ1cmwuaCIKKworLyogSW1wbGVtZW50YXRpb24gb2YgbW9jayBtdXhlciB0byBzaW11bGF0ZSByZWFsIG11eGVyIGZhaWx1cmVzICovCisKKyNkZWZpbmUgTUFYX1RTVF9QQUNLRVRTIDEyOAorI2RlZmluZSBTTEVFUFRJTUVfNTBfTVMgNTAwMDAKKyNkZWZpbmUgU0xFRVBUSU1FXzEwX01TIDEwMDAwCisKKy8qIEltcGxlbWVudGF0aW9uIG9mIG1vY2sgbXV4ZXIgdG8gc2ltdWxhdGUgcmVhbCBtdXhlciBmYWlsdXJlcyAqLworCisvKiBUaGlzIGlzIHN0cnVjdHVyZSBvZiBkYXRhIHNlbnQgaW4gcGFja2V0cyB0bworICogZmFpbGluZyBtdXhlciAqLwordHlwZWRlZiBzdHJ1Y3QgRmFpbGluZ011eGVyUGFja2V0RGF0YSB7CisgICAgaW50IHJldDsgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlIG9mIHdyaXRlX3BhY2tldCBjYWxsKi8KKyAgICBpbnQgcmVjb3Zlcl9hZnRlcjsgICAvKiBzZXQgcmV0IHRvIHplcm8gYWZ0ZXIgdGhpcyBudW1iZXIgb2YgcmVjb3ZlcnkgYXR0ZW1wdHMgKi8KKyAgICB1bnNpZ25lZCBzbGVlcF90aW1lOyAvKiBzbGVlcCBmb3IgdGhpcyBsb25nIGluIHdyaXRlX3BhY2tldCB0byBzaW11bGF0ZSBsb25nIEkvTyBvcGVyYXRpb24gKi8KK30gRmFpbGluZ011eGVyUGFja2V0RGF0YTsKKworCit0eXBlZGVmIHN0cnVjdCBGYWlsaW5nTXV4ZXJDb250ZXh0IHsKKyAgICBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgd3JpdGVfaGVhZGVyX3JldDsKKyAgICBpbnQgd3JpdGVfdHJhaWxlcl9yZXQ7CisgICAgLyogSWYgbm9uLXplcm8sIHN1bW1hcnkgb2YgcHJvY2Vzc2VkIHBhY2tldHMgd2lsbCBiZSBwcmludGVkIGluIGRlaW5pdCAqLworICAgIGludCBwcmludF9kZWluaXRfc3VtbWFyeTsKKworICAgIGludCBmbHVzaF9jb3VudDsKKyAgICBpbnQgcHRzX3dyaXR0ZW5bTUFYX1RTVF9QQUNLRVRTXTsKKyAgICBpbnQgcHRzX3dyaXR0ZW5fbnI7Cit9IEZhaWxpbmdNdXhlckNvbnRleHQ7CisKK3N0YXRpYyBpbnQgZmFpbGluZ193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmYpCit7CisgICAgRmFpbGluZ011eGVyQ29udGV4dCAqY3R4ID0gYXZmLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGN0eC0+d3JpdGVfaGVhZGVyX3JldDsKK30KKworc3RhdGljIGludCBmYWlsaW5nX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmF2ZiwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBGYWlsaW5nTXV4ZXJDb250ZXh0ICpjdHggPSBhdmYtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAoIXBrdCkgeworICAgICAgICBjdHgtPmZsdXNoX2NvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRmFpbGluZ011eGVyUGFja2V0RGF0YSAqZGF0YSA9IChGYWlsaW5nTXV4ZXJQYWNrZXREYXRhKikgcGt0LT5kYXRhOworCisgICAgICAgIGlmICghZGF0YS0+cmVjb3Zlcl9hZnRlcikgeworICAgICAgICAgICAgZGF0YS0+cmV0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEtPnJlY292ZXJfYWZ0ZXItLTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGRhdGEtPnJldDsKKworICAgICAgICBpZiAoZGF0YS0+c2xlZXBfdGltZSkgeworICAgICAgICAgICAgaW50NjRfdCBzbGVwdCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc2xlcHQgPCBkYXRhLT5zbGVlcF90aW1lKSB7CisgICAgICAgICAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdCgmYXZmLT5pbnRlcnJ1cHRfY2FsbGJhY2spKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOworICAgICAgICAgICAgICAgIGF2X3VzbGVlcChTTEVFUFRJTUVfMTBfTVMpOworICAgICAgICAgICAgICAgIHNsZXB0ICs9IFNMRUVQVElNRV8xMF9NUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmV0KSB7CisgICAgICAgICAgICBjdHgtPnB0c193cml0dGVuW2N0eC0+cHRzX3dyaXR0ZW5fbnIrK10gPSBwa3QtPnB0czsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmFpbGluZ193cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqYXZmKQoreworICAgIEZhaWxpbmdNdXhlckNvbnRleHQgKmN0eCA9IGF2Zi0+cHJpdl9kYXRhOworICAgIHJldHVybiBjdHgtPndyaXRlX3RyYWlsZXJfcmV0OworfQorCitzdGF0aWMgdm9pZCBmYWlsaW5nX2RlaW5pdChBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBpbnQgaTsKKyAgICBGYWlsaW5nTXV4ZXJDb250ZXh0ICpjdHggPSBhdmYtPnByaXZfZGF0YTsKKworICAgIGlmICghY3R4LT5wcmludF9kZWluaXRfc3VtbWFyeSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHJpbnRmKCJmbHVzaCBjb3VudDogJWRcbiIsIGN0eC0+Zmx1c2hfY291bnQpOworICAgIHByaW50ZigicHRzIHNlZW4gbnI6ICVkXG4iLCBjdHgtPnB0c193cml0dGVuX25yKTsKKyAgICBwcmludGYoInB0cyBzZWVuOiAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5wdHNfd3JpdHRlbl9ucjsgKytpICkgeworICAgICAgICBwcmludGYoaSA/ICIsJWQiIDogIiVkIiwgY3R4LT5wdHNfd3JpdHRlbltpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKK30KKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZhaWxpbmdNdXhlckNvbnRleHQsIHgpCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgICAgICB7IndyaXRlX2hlYWRlcl9yZXQiLCAid3JpdGVfaGVhZGVyKCkgcmV0dXJuIHZhbHVlIiwgT0ZGU0VUKHdyaXRlX2hlYWRlcl9yZXQpLAorICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAgICAgIHsid3JpdGVfdHJhaWxlcl9yZXQiLCAid3JpdGVfdHJhaWxlcigpIHJldHVybiB2YWx1ZSIsIE9GRlNFVCh3cml0ZV90cmFpbGVyX3JldCksCisgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICAgICAgeyJwcmludF9kZWluaXRfc3VtbWFyeSIsICJwcmludCBzdW1tYXJ5IHdoZW4gZGVpbml0aWFsaXppbmcgbXV4ZXIiLCBPRkZTRVQocHJpbnRfZGVpbml0X3N1bW1hcnkpLAorICAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAxfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAorICAgICAgICB7TlVMTH0KKyAgICB9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmYWlsaW5nX211eGVyX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIkZpZm8gdGVzdCBtdXhlciIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9maWZvX3Rlc3RfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImZpZm9fdGVzdCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZpZm8gdGVzdCBtdXhlciIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihGYWlsaW5nTXV4ZXJDb250ZXh0KSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBmYWlsaW5nX3dyaXRlX2hlYWRlciwKKyAgICAud3JpdGVfcGFja2V0ICAgPSBmYWlsaW5nX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgPSBmYWlsaW5nX3dyaXRlX3RyYWlsZXIsCisgICAgLmRlaW5pdCAgICAgICAgID0gZmFpbGluZ19kZWluaXQsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmZhaWxpbmdfbXV4ZXJfY2xhc3MsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfQUxMT1dfRkxVU0gsCit9OworCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9maWxlLmMgYi9saWJhdmZvcm1hdC9maWxlLmMKaW5kZXggNTk1YmEzNi4uMWQzMjFjNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZmlsZS5jCisrKyBiL2xpYmF2Zm9ybWF0L2ZpbGUuYwpAQCAtNzIsNiArNzIsNyBAQAogICAgIGludCBmZDsKICAgICBpbnQgdHJ1bmM7CiAgICAgaW50IGJsb2Nrc2l6ZTsKKyAgICBpbnQgZm9sbG93OwogI2lmIEhBVkVfRElSRU5UX0gKICAgICBESVIgKmRpcjsKICNlbmRpZgpAQCAtODAsNiArODEsNyBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZpbGVfb3B0aW9uc1tdID0gewogICAgIHsgInRydW5jYXRlIiwgInRydW5jYXRlIGV4aXN0aW5nIGZpbGVzIG9uIHdyaXRlIiwgb2Zmc2V0b2YoRmlsZUNvbnRleHQsIHRydW5jKSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9LCAwLCAxLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAogICAgIHsgImJsb2Nrc2l6ZSIsICJzZXQgSS9PIG9wZXJhdGlvbiBtYXhpbXVtIGJsb2NrIHNpemUiLCBvZmZzZXRvZihGaWxlQ29udGV4dCwgYmxvY2tzaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSBJTlRfTUFYIH0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiZm9sbG93IiwgIkZvbGxvdyBhIGZpbGUgYXMgaXQgaXMgYmVpbmcgd3JpdHRlbiIsIG9mZnNldG9mKEZpbGVDb250ZXh0LCBmb2xsb3cpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDAgfSwgMCwgMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtMTA4LDYgKzExMCwxMCBAQAogICAgIGludCByZXQ7CiAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIGMtPmJsb2Nrc2l6ZSk7CiAgICAgcmV0ID0gcmVhZChjLT5mZCwgYnVmLCBzaXplKTsKKyAgICBpZiAocmV0ID09IDAgJiYgYy0+Zm9sbG93KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogICAgIHJldHVybiAocmV0ID09IC0xKSA/IEFWRVJST1IoZXJybm8pIDogcmV0OwogfQogCkBAIC0xNDQsNyArMTUwLDExIEBACiAgICAgICAgICAgICByZXQgfD0gQVZJT19GTEFHX1dSSVRFOwogI2Vsc2UKICAgICBzdHJ1Y3Qgc3RhdCBzdDsKKyMgICBpZm5kZWYgX1dJTjMyCiAgICAgcmV0ID0gc3RhdChmaWxlbmFtZSwgJnN0KTsKKyMgICBlbHNlCisgICAgcmV0ID0gd2luMzJfc3RhdChmaWxlbmFtZSwgJnN0KTsKKyMgICBlbmRpZgogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CiAKQEAgLTE3Niw3ICsxODYsNiBAQAogCiBzdGF0aWMgaW50IGZpbGVfbW92ZShVUkxDb250ZXh0ICpoX3NyYywgVVJMQ29udGV4dCAqaF9kc3QpCiB7Ci0jaWYgSEFWRV9VTklTVERfSAogICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lX3NyYyA9IGhfc3JjLT5maWxlbmFtZTsKICAgICBjb25zdCBjaGFyICpmaWxlbmFtZV9kc3QgPSBoX2RzdC0+ZmlsZW5hbWU7CiAgICAgYXZfc3Ryc3RhcnQoZmlsZW5hbWVfc3JjLCAiZmlsZToiLCAmZmlsZW5hbWVfc3JjKTsKQEAgLTE4Niw5ICsxOTUsNiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CiAKICAgICByZXR1cm4gMDsKLSNlbHNlCi0gICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKLSNlbmRpZiAvKiBIQVZFX1VOSVNURF9IICovCiB9CiAKICNpZiBDT05GSUdfRklMRV9QUk9UT0NPTApAQCAtMjIzLDYgKzIyOSwxMSBAQAogCiAgICAgaC0+aXNfc3RyZWFtZWQgPSAhZnN0YXQoZmQsICZzdCkgJiYgU19JU0ZJRk8oc3Quc3RfbW9kZSk7CiAKKyAgICAvKiBCdWZmZXIgd3JpdGVzIG1vcmUgdGhhbiB0aGUgZGVmYXVsdCAzMmsgdG8gaW1wcm92ZSB0aHJvdWdocHV0IGVzcGVjaWFsbHkKKyAgICAgKiB3aXRoIG5ldHdvcmtlZCBmaWxlIHN5c3RlbXMgKi8KKyAgICBpZiAoIWgtPmlzX3N0cmVhbWVkICYmIGZsYWdzICYgQVZJT19GTEFHX1dSSVRFKQorICAgICAgICBoLT5taW5fcGFja2V0X3NpemUgPSBoLT5tYXhfcGFja2V0X3NpemUgPSAyNjIxNDQ7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMzMzLDcgKzM0NCw3IEBACiAjZW5kaWYgLyogSEFWRV9MU1RBVCAqLwogfQogCi1VUkxQcm90b2NvbCBmZl9maWxlX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfZmlsZV9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJmaWxlIiwKICAgICAudXJsX29wZW4gICAgICAgICAgICA9IGZpbGVfb3BlbiwKICAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGZpbGVfcmVhZCwKQEAgLTM0OSw3ICszNjAsNyBAQAogICAgIC51cmxfb3Blbl9kaXIgICAgICAgID0gZmlsZV9vcGVuX2RpciwKICAgICAudXJsX3JlYWRfZGlyICAgICAgICA9IGZpbGVfcmVhZF9kaXIsCiAgICAgLnVybF9jbG9zZV9kaXIgICAgICAgPSBmaWxlX2Nsb3NlX2RpciwKLSAgICAuZGVmYXVsdF93aGl0ZWxpc3QgICA9ICJmaWxlIgorICAgIC5kZWZhdWx0X3doaXRlbGlzdCAgID0gImZpbGUsY3J5cHRvIgogfTsKIAogI2VuZGlmIC8qIENPTkZJR19GSUxFX1BST1RPQ09MICovCkBAIC0zNzksNyArMzkwLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotVVJMUHJvdG9jb2wgZmZfcGlwZV9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX3BpcGVfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAicGlwZSIsCiAgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBwaXBlX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSBmaWxlX3JlYWQsCkBAIC0zODgsNyArMzk5LDcgQEAKICAgICAudXJsX2NoZWNrICAgICAgICAgICA9IGZpbGVfY2hlY2ssCiAgICAgLnByaXZfZGF0YV9zaXplICAgICAgPSBzaXplb2YoRmlsZUNvbnRleHQpLAogICAgIC5wcml2X2RhdGFfY2xhc3MgICAgID0gJnBpcGVfY2xhc3MsCi0gICAgLmRlZmF1bHRfd2hpdGVsaXN0ICAgPSAibm9uZSIKKyAgICAuZGVmYXVsdF93aGl0ZWxpc3QgICA9ICJjcnlwdG8iCiB9OwogCiAjZW5kaWYgLyogQ09ORklHX1BJUEVfUFJPVE9DT0wgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ZpbG1zdHJpcGRlYy5jIGIvbGliYXZmb3JtYXQvZmlsbXN0cmlwZGVjLmMKaW5kZXggY2RiYjkzYi4uMGJmNWE4MCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZmlsbXN0cmlwZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvZmlsbXN0cmlwZGVjLmMKQEAgLTI1LDYgKzI1LDcgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtNDAsNyArNDEsNyBAQAogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogICAgIEFWU3RyZWFtICpzdDsKIAotICAgIGlmICghcy0+cGItPnNlZWthYmxlKQorICAgIGlmICghKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAogICAgIGF2aW9fc2VlayhwYiwgYXZpb19zaXplKHBiKSAtIDM2LCBTRUVLX1NFVCk7CkBAIC02MCwxOCArNjEsMTYgQEAKICAgICB9CiAKICAgICBhdmlvX3NraXAocGIsIDIpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKLSAgICBzdC0+Y29kZWMtPnBpeF9mbXQgICAgPSBBVl9QSVhfRk1UX1JHQkE7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgID0gMDsgLyogbm8gZm91cmNjICovCi0gICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19yYjE2KHBiKTsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBhdmlvX3JiMTYocGIpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCAgICAgPSBBVl9QSVhfRk1UX1JHQkE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gMDsgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgID0gYXZpb19yYjE2KHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBhdmlvX3JiMTYocGIpOwogICAgIGZpbG0tPmxlYWRpbmcgICAgICAgICA9IGF2aW9fcmIxNihwYik7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT53aWR0aCAqIDRMTCAqIHN0LT5jb2RlYy0+aGVpZ2h0ID49IElOVF9NQVgpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImRpbWVuc2lvbnMgdG9vIGxhcmdlXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwotICAgIH0KKyAgICBpZiAoYXZfaW1hZ2VfY2hlY2tfc2l6ZShzdC0+Y29kZWNwYXItPndpZHRoLCBzdC0+Y29kZWNwYXItPmhlaWdodCwgMCwgcykgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBhdmlvX3JiMTYocGIpKTsKIApAQCAtODgsOSArODcsOSBAQAogCiAgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Ci0gICAgcGt0LT5kdHMgPSBhdmlvX3RlbGwocy0+cGIpIC8gKHN0LT5jb2RlYy0+d2lkdGggKiAoaW50NjRfdCkoc3QtPmNvZGVjLT5oZWlnaHQgKyBmaWxtLT5sZWFkaW5nKSAqIDQpOwotICAgIHBrdC0+c2l6ZSA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc3QtPmNvZGVjLT53aWR0aCAqIHN0LT5jb2RlYy0+aGVpZ2h0ICogNCk7Ci0gICAgYXZpb19za2lwKHMtPnBiLCBzdC0+Y29kZWMtPndpZHRoICogKGludDY0X3QpIGZpbG0tPmxlYWRpbmcgKiA0KTsKKyAgICBwa3QtPmR0cyA9IGF2aW9fdGVsbChzLT5wYikgLyAoc3QtPmNvZGVjcGFyLT53aWR0aCAqIChpbnQ2NF90KShzdC0+Y29kZWNwYXItPmhlaWdodCArIGZpbG0tPmxlYWRpbmcpICogNCk7CisgICAgcGt0LT5zaXplID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzdC0+Y29kZWNwYXItPndpZHRoICogc3QtPmNvZGVjcGFyLT5oZWlnaHQgKiA0KTsKKyAgICBhdmlvX3NraXAocy0+cGIsIHN0LT5jb2RlY3Bhci0+d2lkdGggKiAoaW50NjRfdCkgZmlsbS0+bGVhZGluZyAqIDQpOwogICAgIGlmIChwa3QtPnNpemUgPCAwKQogICAgICAgICByZXR1cm4gcGt0LT5zaXplOwogICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwpAQCAtMTAwLDcgKzk5LDcgQEAKIHN0YXRpYyBpbnQgcmVhZF9zZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKIHsKICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07Ci0gICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgRkZNQVgodGltZXN0YW1wLCAwKSAqIHN0LT5jb2RlYy0+d2lkdGggKiBzdC0+Y29kZWMtPmhlaWdodCAqIDQsIFNFRUtfU0VUKSA8IDApCisgICAgaWYgKGF2aW9fc2VlayhzLT5wYiwgRkZNQVgodGltZXN0YW1wLCAwKSAqIHN0LT5jb2RlY3Bhci0+d2lkdGggKiBzdC0+Y29kZWNwYXItPmhlaWdodCAqIDQsIFNFRUtfU0VUKSA8IDApCiAgICAgICAgIHJldHVybiAtMTsKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ZpbG1zdHJpcGVuYy5jIGIvbGliYXZmb3JtYXQvZmlsbXN0cmlwZW5jLmMKaW5kZXggOWUyYzcxMC4uOGVhZDY5NiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZmlsbXN0cmlwZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvZmlsbXN0cmlwZW5jLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAogc3RhdGljIGludCB3cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1JHQkEpIHsKKyAgICBpZiAocy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmZvcm1hdCAhPSBBVl9QSVhfRk1UX1JHQkEpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm9ubHkgQVZfUElYX0ZNVF9SR0JBIGlzIHN1cHBvcnRlZFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KQEAgLTYxLDggKzYxLDggQEAKICAgICBhdmlvX3diMzIocGIsIGZpbG0tPm5iX2ZyYW1lcyk7CiAgICAgYXZpb193YjE2KHBiLCAwKTsgIC8vIHBhY2tpbmcgbWV0aG9kCiAgICAgYXZpb193YjE2KHBiLCAwKTsgIC8vIHJlc2VydmVkCi0gICAgYXZpb193YjE2KHBiLCBzdC0+Y29kZWMtPndpZHRoKTsKLSAgICBhdmlvX3diMTYocGIsIHN0LT5jb2RlYy0+aGVpZ2h0KTsKKyAgICBhdmlvX3diMTYocGIsIHN0LT5jb2RlY3Bhci0+d2lkdGgpOworICAgIGF2aW9fd2IxNihwYiwgc3QtPmNvZGVjcGFyLT5oZWlnaHQpOwogICAgIGF2aW9fd2IxNihwYiwgMCk7ICAvLyBsZWFkaW5nCiAgICAgLy8gVE9ETzogc2hvdWxkIGJlIGF2Z19mcmFtZV9yYXRlCiAgICAgYXZpb193YjE2KHBiLCBzdC0+dGltZV9iYXNlLmRlbiAvIHN0LT50aW1lX2Jhc2UubnVtKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ZpdHNkZWMuYyBiL2xpYmF2Zm9ybWF0L2ZpdHNkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI4OGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvZml0c2RlYy5jCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogRklUUyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGFyYXMgQ2hhZGhhCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEZJVFMgZGVtdXhlci4KKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZml0cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuaCIKKworI2RlZmluZSBGSVRTX0JMT0NLX1NJWkUgMjg4MAorCit0eXBlZGVmIHN0cnVjdCBGSVRTQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgQVZSYXRpb25hbCBmcmFtZXJhdGU7CisgICAgaW50IGZpcnN0X2ltYWdlOworICAgIGludDY0X3QgcHRzOworfSBGSVRTQ29udGV4dDsKKworc3RhdGljIGludCBmaXRzX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisgICAgaWYgKCFtZW1jbXAoYiwgIlNJTVBMRSAgPSAgICAgICAgICAgICAgICAgICAgVCIsIDMwKSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC0gMTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaXRzX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgRklUU0NvbnRleHQgKiBmaXRzID0gcy0+cHJpdl9kYXRhOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZJVFM7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgZml0cy0+ZnJhbWVyYXRlLmRlbiwgZml0cy0+ZnJhbWVyYXRlLm51bSk7CisgICAgZml0cy0+cHRzID0gMDsKKyAgICBmaXRzLT5maXJzdF9pbWFnZSA9IDE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogUGFyc2VzIGhlYWRlciBhbmQgY2hlY2tzIHRoYXQgdGhlIGN1cnJlbnQgSERVIGNvbnRhaW5zIGltYWdlIG9yIG5vdAorICogSXQgYWxzbyBzdG9yZXMgdGhlIGhlYWRlciBpbiB0aGUgYXZidWYgYW5kIHN0b3JlcyB0aGUgc2l6ZSBvZiBkYXRhIHBhcnQgaW4gZGF0YV9zaXplCisgKiBAcGFyYW0gcyBwb2ludGVyIHRvIEFWRm9ybWF0IENvbnRleHQKKyAqIEBwYXJhbSBmaXRzIHBvaW50ZXIgdG8gRklUU0NvbnRleHQKKyAqIEBwYXJhbSBoZWFkZXIgcG9pbnRlciB0byBGSVRTSGVhZGVyCisgKiBAcGFyYW0gYXZidWYgcG9pbnRlciB0byBBVkJQcmludCB0byBzdG9yZSB0aGUgaGVhZGVyCisgKiBAcGFyYW0gZGF0YV9zaXplIHRvIHN0b3JlIHRoZSBzaXplIG9mIGRhdGEgcGFydAorICogQHJldHVybiAxIGlmIGltYWdlIGZvdW5kLCAwIGlmIGFueSBvdGhlciBleHRlbnNpb24gYW5kIEFWRVJST1JfSU5WQUxJRERBVEEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQ2NF90IGlzX2ltYWdlKEFWRm9ybWF0Q29udGV4dCAqcywgRklUU0NvbnRleHQgKmZpdHMsIEZJVFNIZWFkZXIgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkJQcmludCAqYXZidWYsIHVpbnQ2NF90ICpkYXRhX3NpemUpCit7CisgICAgaW50IGksIHJldCwgaW1hZ2UgPSAwOworICAgIGNoYXIgYnVmW0ZJVFNfQkxPQ0tfU0laRV0gPSB7IDAgfTsKKyAgICBpbnQ2NF90IGJ1Zl9zaXplID0gMCwgc2l6ZSA9IDAsIHQ7CisKKyAgICBkbyB7CisgICAgICAgIHJldCA9IGF2aW9fcmVhZChzLT5wYiwgYnVmLCBGSVRTX0JMT0NLX1NJWkUpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPCBGSVRTX0JMT0NLX1NJWkUpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgYXZfYnByaW50X2FwcGVuZF9kYXRhKGF2YnVmLCBidWYsIEZJVFNfQkxPQ0tfU0laRSk7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGJ1Zl9zaXplID0gMDsKKyAgICAgICAgd2hpbGUoIXJldCAmJiBidWZfc2l6ZSA8IEZJVFNfQkxPQ0tfU0laRSkgeworICAgICAgICAgICAgcmV0ID0gYXZwcml2X2ZpdHNfaGVhZGVyX3BhcnNlX2xpbmUocywgaGVhZGVyLCBidWYgKyBidWZfc2l6ZSwgTlVMTCk7CisgICAgICAgICAgICBidWZfc2l6ZSArPSA4MDsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKCFyZXQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaW1hZ2UgPSBmaXRzLT5maXJzdF9pbWFnZSB8fCBoZWFkZXItPmltYWdlX2V4dGVuc2lvbjsKKyAgICBmaXRzLT5maXJzdF9pbWFnZSA9IDA7CisKKyAgICBpZiAoaGVhZGVyLT5ncm91cHMpIHsKKyAgICAgICAgaW1hZ2UgPSAwOworICAgICAgICBpZiAoaGVhZGVyLT5uYXhpcyA+IDEpCisgICAgICAgICAgICBzaXplID0gMTsKKyAgICB9IGVsc2UgaWYgKGhlYWRlci0+bmF4aXMpIHsKKyAgICAgICAgc2l6ZSA9IGhlYWRlci0+bmF4aXNuWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIGltYWdlID0gMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgaGVhZGVyLT5uYXhpczsgaSsrKSB7CisgICAgICAgIGlmKHNpemUgJiYgaGVhZGVyLT5uYXhpc25baV0gPiBVSU5UNjRfTUFYIC8gc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBzaXplICo9IGhlYWRlci0+bmF4aXNuW2ldOworICAgIH0KKworICAgIGlmKGhlYWRlci0+cGNvdW50ID4gVUlOVDY0X01BWCAtIHNpemUpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHNpemUgKz0gaGVhZGVyLT5wY291bnQ7CisKKyAgICB0ID0gKGFicyhoZWFkZXItPmJpdHBpeCkgPj4gMykgKiAoKGludDY0X3QpIGhlYWRlci0+Z2NvdW50KTsKKyAgICBpZihzaXplICYmIHQgPiBVSU5UNjRfTUFYIC8gc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgc2l6ZSAqPSB0OworCisgICAgaWYgKCFzaXplKSB7CisgICAgICAgIGltYWdlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZihGSVRTX0JMT0NLX1NJWkUgLSAxID4gVUlOVDY0X01BWCAtIHNpemUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgc2l6ZSA9ICgoc2l6ZSArIEZJVFNfQkxPQ0tfU0laRSAtIDEpIC8gRklUU19CTE9DS19TSVpFKSAqIEZJVFNfQkxPQ0tfU0laRTsKKyAgICB9CisgICAgKmRhdGFfc2l6ZSA9IHNpemU7CisgICAgcmV0dXJuIGltYWdlOworfQorCitzdGF0aWMgaW50IGZpdHNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIGludDY0X3QgcG9zLCByZXQ7CisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICBGSVRTQ29udGV4dCAqZml0cyA9IHMtPnByaXZfZGF0YTsKKyAgICBGSVRTSGVhZGVyIGhlYWRlcjsKKyAgICBBVkJQcmludCBhdmJ1ZjsKKyAgICBjaGFyICpidWY7CisKKyAgICBpZiAoZml0cy0+Zmlyc3RfaW1hZ2UpIHsKKyAgICAgICAgYXZwcml2X2ZpdHNfaGVhZGVyX2luaXQoJmhlYWRlciwgU1RBVEVfU0lNUExFKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdnByaXZfZml0c19oZWFkZXJfaW5pdCgmaGVhZGVyLCBTVEFURV9YVEVOU0lPTik7CisgICAgfQorCisgICAgYXZfYnByaW50X2luaXQoJmF2YnVmLCBGSVRTX0JMT0NLX1NJWkUsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisgICAgd2hpbGUgKChyZXQgPSBpc19pbWFnZShzLCBmaXRzLCAmaGVhZGVyLCAmYXZidWYsICZzaXplKSkgPT0gMCkgeworICAgICAgICBwb3MgPSBhdmlvX3NraXAocy0+cGIsIHNpemUpOworICAgICAgICBpZiAocG9zIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBwb3M7CisKKyAgICAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZhdmJ1ZiwgTlVMTCk7CisgICAgICAgIGF2X2JwcmludF9pbml0KCZhdmJ1ZiwgRklUU19CTE9DS19TSVpFLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgICAgICBhdnByaXZfZml0c19oZWFkZXJfaW5pdCgmaGVhZGVyLCBTVEFURV9YVEVOU0lPTik7CisgICAgfQorICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmYXZidWYpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIC8vIEhlYWRlciBpcyBzZW50IHdpdGggdGhlIGZpcnN0IGxpbmUgcmVtb3ZlZC4uLgorICAgIHJldCA9IGF2X25ld19wYWNrZXQocGt0LCBhdmJ1Zi5sZW4gLSA4MCArIHNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisKKyAgICByZXQgPSBhdl9icHJpbnRfZmluYWxpemUoJmF2YnVmLCAmYnVmKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtZW1jcHkocGt0LT5kYXRhLCBidWYgKyA4MCwgYXZidWYubGVuIC0gODApOworICAgIHBrdC0+c2l6ZSA9IGF2YnVmLmxlbiAtIDgwOworICAgIGF2X2ZyZWVwKCZidWYpOworICAgIHJldCA9IGF2aW9fcmVhZChzLT5wYiwgcGt0LT5kYXRhICsgcGt0LT5zaXplLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBwa3QtPnNpemUgKz0gcmV0OworICAgIHBrdC0+cHRzID0gZml0cy0+cHRzOworICAgIGZpdHMtPnB0cysrOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZhdmJ1ZiwgTlVMTCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIGZpdHNfb3B0aW9uc1tdID0geworICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgdGhlIGZyYW1lcmF0ZSIsIG9mZnNldG9mKEZJVFNDb250ZXh0LCBmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIxIn0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZpdHNfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJGSVRTIGRlbXV4ZXIiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBmaXRzX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2ZpdHNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZml0cyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkZsZXhpYmxlIEltYWdlIFRyYW5zcG9ydCBTeXN0ZW0iKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRklUU0NvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IGZpdHNfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZml0c19yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBmaXRzX3JlYWRfcGFja2V0LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZmaXRzX2RlbXV4ZXJfY2xhc3MsCisgICAgLnJhd19jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfRklUUywKK307CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9maXRzZW5jLmMgYi9saWJhdmZvcm1hdC9maXRzZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzOTk5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2ZpdHNlbmMuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIEZJVFMgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXJhcyBDaGFkaGEKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogRklUUyBtdXhlci4KKyAqLworCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRklUU0NvbnRleHQgeworICAgIGludCBmaXJzdF9pbWFnZTsKK30gRklUU0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgZml0c193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEZJVFNDb250ZXh0ICpmaXRzY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIGZpdHNjdHgtPmZpcnN0X2ltYWdlID0gMTsKKyAgICByZXR1cm4gMDsKK30KKworLyoqCisgKiBXcml0ZSBvbmUgaGVhZGVyIGxpbmUgY29tcHJpc2luZyBvZiBrZXl3b3JkIGFuZCB2YWx1ZShpbnQpCisgKiBAcGFyYW0gcyBBVkZvcm1hdCBDb250ZXh0CisgKiBAcGFyYW0ga2V5d29yZCBwb2ludGVyIHRvIHRoZSBjaGFyIGFycmF5IGluIHdoaWNoIGtleXdvcmQgaXMgc3RvcmVkCisgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleXdvcmQKKyAqIEBwYXJhbSBsaW5lc193cml0dGVuIHRvIGtlZXAgdHJhY2sgb2YgbGluZXMgd3JpdHRlbiBzbyBmYXIKKyAqIEByZXR1cm4gMAorICovCitzdGF0aWMgaW50IHdyaXRlX2tleXdvcmRfdmFsdWUoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICprZXl3b3JkLCBpbnQgdmFsdWUsIGludCAqbGluZXNfd3JpdHRlbikKK3sKKyAgICBpbnQgbGVuLCByZXQ7CisgICAgdWludDhfdCBoZWFkZXJbODBdOworCisgICAgbGVuID0gc3RybGVuKGtleXdvcmQpOworICAgIG1lbXNldChoZWFkZXIsICcgJywgc2l6ZW9mKGhlYWRlcikpOworICAgIG1lbWNweShoZWFkZXIsIGtleXdvcmQsIGxlbik7CisKKyAgICBoZWFkZXJbOF0gPSAnPSc7CisgICAgaGVhZGVyWzldID0gJyAnOworCisgICAgcmV0ID0gc25wcmludGYoaGVhZGVyICsgMTAsIDcwLCAiJWQiLCB2YWx1ZSk7CisgICAgbWVtc2V0KCZoZWFkZXJbcmV0ICsgMTBdLCAnICcsIHNpemVvZihoZWFkZXIpIC0gKHJldCArIDEwKSk7CisKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKyAgICAqbGluZXNfd3JpdHRlbiArPSAxOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2ltYWdlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1swXTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqZW5jY3R4ID0gc3QtPmNvZGVjcGFyOworICAgIEZJVFNDb250ZXh0ICpmaXRzY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIHVpbnQ4X3QgYnVmZmVyWzgwXTsKKyAgICBpbnQgYml0cGl4LCBuYXhpcywgbmF4aXMzID0gMSwgYnplcm8gPSAwLCByZ2IgPSAwLCBsaW5lc193cml0dGVuID0gMCwgbGluZXNfbGVmdDsKKworICAgIHN3aXRjaCAoZW5jY3R4LT5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk4OgorICAgICAgICAgICAgYml0cGl4ID0gODsKKyAgICAgICAgICAgIG5heGlzID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2QkU6CisgICAgICAgICAgICBiaXRwaXggPSAxNjsKKyAgICAgICAgICAgIG5heGlzID0gMjsKKyAgICAgICAgICAgIGJ6ZXJvID0gMzI3Njg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDoKKyAgICAgICAgICAgIGJpdHBpeCA9IDg7CisgICAgICAgICAgICBuYXhpcyA9IDM7CisgICAgICAgICAgICByZ2IgPSAxOworICAgICAgICAgICAgaWYgKGVuY2N0eC0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUCkgeworICAgICAgICAgICAgICAgIG5heGlzMyA9IDM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5heGlzMyA9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNkJFOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNkJFOgorICAgICAgICAgICAgYml0cGl4ID0gMTY7CisgICAgICAgICAgICBuYXhpcyA9IDM7CisgICAgICAgICAgICByZ2IgPSAxOworICAgICAgICAgICAgaWYgKGVuY2N0eC0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDE2QkUpIHsKKyAgICAgICAgICAgICAgICBuYXhpczMgPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuYXhpczMgPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnplcm8gPSAzMjc2ODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoZml0c2N0eC0+Zmlyc3RfaW1hZ2UpIHsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgIlNJTVBMRSAgPSAiLCAxMCk7CisgICAgICAgIG1lbXNldChidWZmZXIgKyAxMCwgJyAnLCA3MCk7CisgICAgICAgIGJ1ZmZlclsyOV0gPSAnVCc7CisgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShidWZmZXIsICJYVEVOU0lPTj0gJ0lNQUdFICAgJyIsIDIwKTsKKyAgICAgICAgbWVtc2V0KGJ1ZmZlciArIDIwLCAnICcsIDYwKTsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgfQorICAgIGxpbmVzX3dyaXR0ZW4rKzsKKworICAgIHdyaXRlX2tleXdvcmRfdmFsdWUocywgIkJJVFBJWCIsIGJpdHBpeCwgJmxpbmVzX3dyaXR0ZW4pOyAgICAgICAgIC8vIG5vIG9mIGJpdHMgcGVyIHBpeGVsCisgICAgd3JpdGVfa2V5d29yZF92YWx1ZShzLCAiTkFYSVMiLCBuYXhpcywgJmxpbmVzX3dyaXR0ZW4pOyAgICAgICAgICAgLy8gbm8gb2YgZGltZW5zaW9ucyBvZiBpbWFnZQorICAgIHdyaXRlX2tleXdvcmRfdmFsdWUocywgIk5BWElTMSIsIGVuY2N0eC0+d2lkdGgsICZsaW5lc193cml0dGVuKTsgICAvLyBmaXJzdCBkaW1lbnNpb24gaS5lLiB3aWR0aAorICAgIHdyaXRlX2tleXdvcmRfdmFsdWUocywgIk5BWElTMiIsIGVuY2N0eC0+aGVpZ2h0LCAmbGluZXNfd3JpdHRlbik7ICAvLyBzZWNvbmQgZGltZW5zaW9uIGkuZS4gaGVpZ2h0CisKKyAgICBpZiAocmdiKQorICAgICAgICB3cml0ZV9rZXl3b3JkX3ZhbHVlKHMsICJOQVhJUzMiLCBuYXhpczMsICZsaW5lc193cml0dGVuKTsgICAgIC8vIHRoaXJkIGRpbWVuc2lvbiB0byBzdG9yZSBSR0JBIHBsYW5lcworCisgICAgaWYgKCFmaXRzY3R4LT5maXJzdF9pbWFnZSkgeworICAgICAgICB3cml0ZV9rZXl3b3JkX3ZhbHVlKHMsICJQQ09VTlQiLCAwLCAmbGluZXNfd3JpdHRlbik7CisgICAgICAgIHdyaXRlX2tleXdvcmRfdmFsdWUocywgIkdDT1VOVCIsIDEsICZsaW5lc193cml0dGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaXRzY3R4LT5maXJzdF9pbWFnZSA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBTaW5jZSBGSVRTIGRvZXMgbm90IHN1cHBvcnQgdW5zaWduZWQgMTYgYml0IGludGVnZXJzLAorICAgICAqIEJaRVJPID0gMzI3NjggaXMgdXNlZCB0byBzdG9yZSB1bnNpZ25lZCAxNiBiaXQgaW50ZWdlcnMgYXMKKyAgICAgKiBzaWduZWQgaW50ZWdlcnMgc28gdGhhdCBpdCBjYW4gYmUgcmVhZCBwcm9wZXJseS4KKyAgICAgKi8KKyAgICBpZiAoYml0cGl4ID09IDE2KQorICAgICAgICB3cml0ZV9rZXl3b3JkX3ZhbHVlKHMsICJCWkVSTyIsIGJ6ZXJvLCAmbGluZXNfd3JpdHRlbik7CisKKyAgICBpZiAocmdiKSB7CisgICAgICAgIG1lbWNweShidWZmZXIsICJDVFlQRTMgID0gJ1JHQiAgICAgJyIsIDIwKTsKKyAgICAgICAgbWVtc2V0KGJ1ZmZlciArIDIwLCAnICcsIDYwKTsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgIGxpbmVzX3dyaXR0ZW4rKzsKKyAgICB9CisKKyAgICBtZW1jcHkoYnVmZmVyLCAiRU5EIiwgMyk7CisgICAgbWVtc2V0KGJ1ZmZlciArIDMsICcgJywgNzcpOworICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgIGxpbmVzX3dyaXR0ZW4rKzsKKworICAgIGxpbmVzX2xlZnQgPSAoKGxpbmVzX3dyaXR0ZW4gKyAzNSkgLyAzNikgKiAzNiAtIGxpbmVzX3dyaXR0ZW47CisgICAgbWVtc2V0KGJ1ZmZlciwgJyAnLCA4MCk7CisgICAgd2hpbGUgKGxpbmVzX2xlZnQgPiAwKSB7CisgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICBsaW5lc19sZWZ0LS07CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpdHNfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmV0ID0gd3JpdGVfaW1hZ2VfaGVhZGVyKHMpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGF2aW9fd3JpdGUocy0+cGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZPdXRwdXRGb3JtYXQgZmZfZml0c19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgID0gImZpdHMiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiRmxleGlibGUgSW1hZ2UgVHJhbnNwb3J0IFN5c3RlbSIpLAorICAgIC5leHRlbnNpb25zICAgPSAiZml0cyIsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEZJVFNDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAudmlkZW9fY29kZWMgID0gQVZfQ09ERUNfSURfRklUUywKKyAgICAud3JpdGVfaGVhZGVyID0gZml0c193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCA9IGZpdHNfd3JpdGVfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ZsYWNfcGljdHVyZS5jIGIvbGliYXZmb3JtYXQvZmxhY19waWN0dXJlLmMKaW5kZXggN2JkOTgyNS4uMzg5ODJiOSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZmxhY19waWN0dXJlLmMKKysrIGIvbGliYXZmb3JtYXQvZmxhY19waWN0dXJlLmMKQEAgLTEzMiwyMiArMTMyLDIyIEBACiAgICAgc3QtPmF0dGFjaGVkX3BpYy5mbGFncyAgICAgICB8PSBBVl9QS1RfRkxBR19LRVk7CiAKICAgICBzdC0+ZGlzcG9zaXRpb24gICAgICB8PSBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUM7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGlkOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IHdpZHRoOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGhlaWdodDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gaWQ7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgID0gd2lkdGg7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gaGVpZ2h0OwogICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJjb21tZW50IiwgZmZfaWQzdjJfcGljdHVyZV90eXBlc1t0eXBlXSwgMCk7CiAgICAgaWYgKGRlc2MpCiAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIGRlc2MsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKIAotICAgIGF2X2ZyZWVwKCZwYik7CisgICAgYXZpb19jb250ZXh0X2ZyZWUoJnBiKTsKIAogICAgIHJldHVybiAwOwogCiBmYWlsOgogICAgIGF2X2J1ZmZlcl91bnJlZigmZGF0YSk7CiAgICAgYXZfZnJlZXAoJmRlc2MpOwotICAgIGF2X2ZyZWVwKCZwYik7CisgICAgYXZpb19jb250ZXh0X2ZyZWUoJnBiKTsKIAogICAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9mbGFjZGVjLmMgYi9saWJhdmZvcm1hdC9mbGFjZGVjLmMKaW5kZXggZWI5MjIxNi4uYTAzMjM3OCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZmxhY2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2ZsYWNkZWMuYwpAQCAtNTIsOCArNTIsOCBAQAogICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMQUM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9GTEFDOwogICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKICAgICAvKiB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBjb21wcmVzc2VkIGJpdHN0cmVhbSAqLwogCkBAIC02NSw3ICs2NSw4IEBACiAKICAgICAvKiBwcm9jZXNzIG1ldGFkYXRhIGJsb2NrcyAqLwogICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSAmJiAhbWV0YWRhdGFfbGFzdCkgewotICAgICAgICBhdmlvX3JlYWQocy0+cGIsIGhlYWRlciwgNCk7CisgICAgICAgIGlmIChhdmlvX3JlYWQocy0+cGIsIGhlYWRlciwgNCkgIT0gNCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEFWRVJST1JfSU5WQUxJRERBVEEpOwogICAgICAgICBmbGFjX3BhcnNlX2Jsb2NrX2hlYWRlcihoZWFkZXIsICZtZXRhZGF0YV9sYXN0LCAmbWV0YWRhdGFfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1ldGFkYXRhX3NpemUpOwogICAgICAgICBzd2l0Y2ggKG1ldGFkYXRhX3R5cGUpIHsKQEAgLTEwMiwxNCArMTAzLDE0IEBACiAgICAgICAgICAgICAgICAgUkVUVVJOX0VSUk9SKEFWRVJST1JfSU5WQUxJRERBVEEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm91bmRfc3RyZWFtaW5mbyA9IDE7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSAgICAgID0gYnVmZmVyOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IG1ldGFkYXRhX3NpemU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSAgICAgID0gYnVmZmVyOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IG1ldGFkYXRhX3NpemU7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAvKiBnZXQgc2FtcGxlIHJhdGUgYW5kIHNhbXBsZSBjb3VudCBmcm9tIFNUUkVBTUlORk8gaGVhZGVyOwogICAgICAgICAgICAgICogb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGV4dHJhY3RlZCBieSB0aGUgcGFyc2VyICovCi0gICAgICAgICAgICBzYW1wbGVyYXRlID0gQVZfUkIyNChzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDEwKSA+PiA0OwotICAgICAgICAgICAgc2FtcGxlcyAgICA9IChBVl9SQjY0KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMTMpID4+IDI0KSAmICgoMVVMTCA8PCAzNikgLSAxKTsKKyAgICAgICAgICAgIHNhbXBsZXJhdGUgPSBBVl9SQjI0KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMTApID4+IDQ7CisgICAgICAgICAgICBzYW1wbGVzICAgID0gKEFWX1JCNjQoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAxMykgPj4gMjQpICYgKCgxVUxMIDw8IDM2KSAtIDEpOwogCiAgICAgICAgICAgICAvKiBzZXQgdGltZSBiYXNlIGFuZCBkdXJhdGlvbiAqLwogICAgICAgICAgICAgaWYgKHNhbXBsZXJhdGUgPiAwKSB7CkBAIC0xODksNyArMTkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBvZiBXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0tcbiIpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IG1hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gbWFzazsKICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgIldBVkVGT1JNQVRFWFRFTlNJQkxFX0NIQU5ORUxfTUFTSyIsIE5VTEwsIDApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjMwLDkgKzIzMSwyNyBAQAogewogICAgIGlmICgoQVZfUkIxNihwLT5idWYpICYgMHhGRkZFKSA9PSAweEZGRjgpCiAgICAgICAgIHJldHVybiByYXdfZmxhY19wcm9iZShwKTsKLSAgICBpZiAocC0+YnVmX3NpemUgPCA0IHx8IG1lbWNtcChwLT5idWYsICJmTGFDIiwgNCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKworICAgIC8qIGZpbGUgaGVhZGVyICsgbWV0YWRhdGEgaGVhZGVyICsgY2hlY2tlZCBieXRlcyBvZiBzdHJlYW1pbmZvICovCisgICAgaWYgKHAtPmJ1Zl9zaXplID49IDQgKyA0ICsgMTMpIHsKKyAgICAgICAgaW50IHR5cGUgICAgICAgICAgID0gcC0+YnVmWzRdICYgMHg3ZjsKKyAgICAgICAgaW50IHNpemUgICAgICAgICAgID0gQVZfUkIyNChwLT5idWYgKyA1KTsKKyAgICAgICAgaW50IG1pbl9ibG9ja19zaXplID0gQVZfUkIxNihwLT5idWYgKyA4KTsKKyAgICAgICAgaW50IG1heF9ibG9ja19zaXplID0gQVZfUkIxNihwLT5idWYgKyAxMCk7CisgICAgICAgIGludCBzYW1wbGVfcmF0ZSAgICA9IEFWX1JCMjQocC0+YnVmICsgMTgpID4+IDQ7CisKKyAgICAgICAgaWYgKG1lbWNtcChwLT5idWYsICJmTGFDIiwgNCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKHR5cGUgPT0gRkxBQ19NRVRBREFUQV9UWVBFX1NUUkVBTUlORk8gJiYKKyAgICAgICAgICAgIHNpemUgPT0gRkxBQ19TVFJFQU1JTkZPX1NJWkUgICAgICAgICAgJiYKKyAgICAgICAgICAgIG1pbl9ibG9ja19zaXplID49IDE2ICAgICAgICAgICAgICAgICAgJiYKKyAgICAgICAgICAgIG1heF9ibG9ja19zaXplID49IG1pbl9ibG9ja19zaXplICAgICAgJiYKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlICYmIHNhbXBsZV9yYXRlIDw9IDY1NTM1MCkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OOworICAgIH0KKworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgYXZfdW51c2VkIGludDY0X3QgZmxhY19yZWFkX3RpbWVzdGFtcChBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCkBAIC0yNDgsNyArMjY3LDcgQEAKICAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOwogCiAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7Ci0gICAgcGFyc2VyID0gYXZfcGFyc2VyX2luaXQoc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgcGFyc2VyID0gYXZfcGFyc2VyX2luaXQoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCk7CiAgICAgaWYgKCFwYXJzZXIpewogICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CiAgICAgfQpAQCAtMjU5LDExICsyNzgsMTMgQEAKICAgICAgICAgaWYgKHJldCA8IDApewogICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCiAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgICAgICAgICAgICAgYXZfYXNzZXJ0MSghcGt0LnNpemUpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGF2X2luaXRfcGFja2V0KCZvdXRfcGt0KTsKLSAgICAgICAgYXZfcGFyc2VyX3BhcnNlMihwYXJzZXIsIHN0LT5jb2RlYywKKyAgICAgICAgYXZfcGFyc2VyX3BhcnNlMihwYXJzZXIsIHN0LT5pbnRlcm5hbC0+YXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF9wa3QuZGF0YSwgJm91dF9wa3Quc2l6ZSwgcGt0LmRhdGEsIHBrdC5zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgIHBrdC5wdHMsIHBrdC5kdHMsICpwcG9zKTsKIApAQCAtMjc3LDcgKzI5OCw4IEBACiAgICAgICAgICAgICAgICAgcHRzID0gcGFyc2VyLT5wdHM7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGF2X3BhcnNlcl9jbG9zZShwYXJzZXIpOwogICAgIHJldHVybiBwdHM7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9mbGFjZW5jLmMgYi9saWJhdmZvcm1hdC9mbGFjZW5jLmMKaW5kZXggMzIxYWY1MC4uNjE3YmNjZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZmxhY2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2ZsYWNlbmMuYwpAQCAtMjEsMTAgKzIxLDEzIEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2ZsYWMuaCIKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKICNpbmNsdWRlICJmbGFjZW5jLmgiCisjaW5jbHVkZSAiaWQzdjIuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInZvcmJpc2NvbW1lbnQuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKIApAQCAtMzMsOCArMzYsMTUgQEAKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKICAgICBpbnQgd3JpdGVfaGVhZGVyOwogCisgICAgaW50IGF1ZGlvX3N0cmVhbV9pZHg7CisgICAgaW50IHdhaXRpbmdfcGljczsKKyAgICAvKiBhdWRpbyBwYWNrZXRzIGFyZSBxdWV1ZWQgaGVyZSB1bnRpbCB3ZSBnZXQgYWxsIHRoZSBhdHRhY2hlZCBwaWN0dXJlcyAqLworICAgIEFWUGFja2V0TGlzdCAqcXVldWUsICpxdWV1ZV9lbmQ7CisKICAgICAvKiB1cGRhdGVkIHN0cmVhbWluZm8gc2VudCBieSB0aGUgZW5jb2RlciBhdCB0aGUgZW5kICovCiAgICAgdWludDhfdCAqc3RyZWFtaW5mbzsKKworICAgIHVuc2lnbmVkIGF0dGFjaGVkX3R5cGVzOwogfSBGbGFjTXV4ZXJDb250ZXh0OwogCiBzdGF0aWMgaW50IGZsYWNfd3JpdGVfYmxvY2tfcGFkZGluZyhBVklPQ29udGV4dCAqcGIsIHVuc2lnbmVkIGludCBuX3BhZGRpbmdfYnl0ZXMsCkBAIC03NCw1MSArODQsMTA0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZmxhY193cml0ZV9oZWFkZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKK3N0YXRpYyBpbnQgZmxhY193cml0ZV9waWN0dXJlKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgaW50IHJldDsKLSAgICBpbnQgcGFkZGluZyA9IHMtPm1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOwotICAgIEZsYWNNdXhlckNvbnRleHQgKmMgICA9IHMtPnByaXZfZGF0YTsKKyAgICBGbGFjTXV4ZXJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4ZGVzYzsKKyAgICBjb25zdCBDb2RlY01pbWUgKm1pbWUgPSBmZl9pZDN2Ml9taW1lX3RhZ3M7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7CisgICAgY29uc3QgY2hhciAqbWltZXR5cGUgPSBOVUxMLCAqZGVzYyA9ICIiOworICAgIGNvbnN0IEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgIGludCBpLCBtaW1lbGVuLCBkZXNjbGVuLCB0eXBlID0gMDsKIAotICAgIGlmICghYy0+d3JpdGVfaGVhZGVyKQorICAgIGlmICghcGt0LT5kYXRhKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGlmIChzLT5uYl9zdHJlYW1zID4gMSkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAib25seSBvbmUgc3RyZWFtIGlzIHN1cHBvcnRlZFxuIik7CisgICAgd2hpbGUgKG1pbWUtPmlkICE9IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgaWYgKG1pbWUtPmlkID09IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgIG1pbWV0eXBlID0gbWltZS0+c3RyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbWltZSsrOworICAgIH0KKyAgICBpZiAoIW1pbWV0eXBlKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBtaW1ldHlwZSBpcyBrbm93biBmb3Igc3RyZWFtICVkLCBjYW5ub3QgIgorICAgICAgICAgICAgICAgIndyaXRlIGFuIGF0dGFjaGVkIHBpY3R1cmUuXG4iLCBzdC0+aW5kZXgpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KLSAgICBpZiAoY29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0ZMQUMpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvZGVjXG4iKTsKKyAgICBtaW1lbGVuID0gc3RybGVuKG1pbWV0eXBlKTsKKworICAgIC8qIGdldCB0aGUgcGljdHVyZSB0eXBlICovCisgICAgZSA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgImNvbW1lbnQiLCBOVUxMLCAwKTsKKyAgICBmb3IgKGkgPSAwOyBlICYmIGkgPCBGRl9BUlJBWV9FTEVNUyhmZl9pZDN2Ml9waWN0dXJlX3R5cGVzKTsgaSsrKSB7CisgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChlLT52YWx1ZSwgZmZfaWQzdjJfcGljdHVyZV90eXBlc1tpXSkpIHsKKyAgICAgICAgICAgIHR5cGUgPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGMtPmF0dGFjaGVkX3R5cGVzICYgKDEgPDwgdHlwZSkpICYgMHg2KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJEdXBsaWNhdGUgYXR0YWNobWVudCBmb3IgdHlwZSAnJXMnXG4iLCBmZl9pZDN2Ml9waWN0dXJlX3R5cGVzW3R5cGVdKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKKyAgICBpZiAodHlwZSA9PSAxICYmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1BORyB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggIT0gMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAhPSAzMikpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZpbGUgaWNvbiBhdHRhY2htZW50IG11c3QgYmUgYSAzMngzMiBQTkciKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjLT5hdHRhY2hlZF90eXBlcyB8PSAoMSA8PCB0eXBlKTsKKworICAgIC8qIGdldCB0aGUgZGVzY3JpcHRpb24gKi8KKyAgICBpZiAoKGUgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKSkKKyAgICAgICAgZGVzYyA9IGUtPnZhbHVlOworICAgIGRlc2NsZW4gPSBzdHJsZW4oZGVzYyk7CisKKyAgICBhdmlvX3c4KHBiLCAweDA2KTsKKyAgICBhdmlvX3diMjQocGIsIDQgKyA0ICsgbWltZWxlbiArIDQgKyBkZXNjbGVuICsgNCArIDQgKyA0ICsgNCArIDQgKyBwa3QtPnNpemUpOworCisgICAgYXZpb193YjMyKHBiLCB0eXBlKTsKKworICAgIGF2aW9fd2IzMihwYiwgbWltZWxlbik7CisgICAgYXZpb193cml0ZShwYiwgbWltZXR5cGUsIG1pbWVsZW4pOworCisgICAgYXZpb193YjMyKHBiLCBkZXNjbGVuKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBkZXNjLCBkZXNjbGVuKTsKKworICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjcGFyLT53aWR0aCk7CisgICAgYXZpb193YjMyKHBiLCBzdC0+Y29kZWNwYXItPmhlaWdodCk7CisgICAgaWYgKChwaXhkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzdC0+Y29kZWNwYXItPmZvcm1hdCkpKQorICAgICAgICBhdmlvX3diMzIocGIsIGF2X2dldF9iaXRzX3Blcl9waXhlbChwaXhkZXNjKSk7CisgICAgZWxzZQorICAgICAgICBhdmlvX3diMzIocGIsIDApOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisKKyAgICBhdmlvX3diMzIocGIsIHBrdC0+c2l6ZSk7CisgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZsYWNfZmluaXNoX2hlYWRlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpLCByZXQsIHBhZGRpbmcgPSBzLT5tZXRhZGF0YV9oZWFkZXJfcGFkZGluZzsKICAgICBpZiAocGFkZGluZyA8IDApCiAgICAgICAgIHBhZGRpbmcgPSA4MTkyOwogICAgIC8qIFRoZSBGTEFDIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgMjQgYml0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlCiAgICAgICogc2l6ZSBvZiBhIG1ldGFkYXRhIGJsb2NrIHNvIHdlIG11c3QgY2xpcCB0aGlzIHZhbHVlIHRvIDJeMjQtMS4gKi8KICAgICBwYWRkaW5nID0gYXZfY2xpcF91aW50cDIocGFkZGluZywgMjQpOwogCi0gICAgcmV0ID0gZmZfZmxhY193cml0ZV9oZWFkZXIocy0+cGIsIGNvZGVjLT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplLCAwKTsKLSAgICBpZiAocmV0KQotICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgLyogYWRkIHRoZSBjaGFubmVsIGxheW91dCB0YWcgKi8KLSAgICBpZiAoY29kZWMtPmNoYW5uZWxfbGF5b3V0ICYmCi0gICAgICAgICEoY29kZWMtPmNoYW5uZWxfbGF5b3V0ICYgfjB4M2ZmZmZVTEwpICYmCi0gICAgICAgICFmZl9mbGFjX2lzX25hdGl2ZV9sYXlvdXQoY29kZWMtPmNoYW5uZWxfbGF5b3V0KSkgewotICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqY2htYXNrID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0siLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCk7Ci0KLSAgICAgICAgaWYgKGNobWFzaykgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQSBXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0sgaXMgIgotICAgICAgICAgICAgICAgICAgICJhbHJlYWR5IHByZXNlbnQsIHRoaXMgbXV4ZXIgd2lsbCBub3Qgb3ZlcndyaXRlIGl0LlxuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGJ1ZlszMl07Ci0gICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiMHglIlBSSXg2NCwgY29kZWMtPmNoYW5uZWxfbGF5b3V0KTsKLSAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgIldBVkVGT1JNQVRFWFRFTlNJQkxFX0NIQU5ORUxfTUFTSyIsIGJ1ZiwgMCk7Ci0gICAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CisgICAgICAgIEFWUGFja2V0ICpwa3QgPSBzdC0+cHJpdl9kYXRhOworICAgICAgICBpZiAoIXBrdCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICByZXQgPSBmbGFjX3dyaXRlX3BpY3R1cmUocywgcGt0KTsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwICYmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICByZXQgPSBmbGFjX3dyaXRlX2Jsb2NrX2NvbW1lbnQocy0+cGIsICZzLT5tZXRhZGF0YSwgIXBhZGRpbmcsCkBAIC0xMzMsMzcgKzE5Niw4OSBAQAogICAgIGlmIChwYWRkaW5nKQogICAgICAgICBmbGFjX3dyaXRlX2Jsb2NrX3BhZGRpbmcocy0+cGIsIHBhZGRpbmcsIDEpOwogCi0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmbGFjX3dyaXRlX3RyYWlsZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKK3N0YXRpYyBpbnQgZmxhY19pbml0KHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCiB7Ci0gICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7Ci0gICAgaW50NjRfdCBmaWxlX3NpemU7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBGbGFjTXV4ZXJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwotICAgIHVpbnQ4X3QgKnN0cmVhbWluZm8gPSBjLT5zdHJlYW1pbmZvID8gYy0+c3RyZWFtaW5mbyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZXh0cmFkYXRhOworICAgIGludCBpOwogCi0gICAgaWYgKCFjLT53cml0ZV9oZWFkZXIgfHwgIXN0cmVhbWluZm8pCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgewotICAgICAgICAvKiByZXdyaXRlIHRoZSBTVFJFQU1JTkZPIGhlYWRlciBibG9jayBkYXRhICovCi0gICAgICAgIGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7Ci0gICAgICAgIGF2aW9fc2VlayhwYiwgOCwgU0VFS19TRVQpOwotICAgICAgICBhdmlvX3dyaXRlKHBiLCBzdHJlYW1pbmZvLCBGTEFDX1NUUkVBTUlORk9fU0laRSk7Ci0gICAgICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplLCBTRUVLX1NFVCk7Ci0gICAgICAgIGF2aW9fZmx1c2gocGIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVuYWJsZSB0byByZXdyaXRlIEZMQUMgaGVhZGVyLlxuIik7CisgICAgYy0+YXVkaW9fc3RyZWFtX2lkeCA9IC0xOworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGlmIChjLT5hdWRpb19zdHJlYW1faWR4ID49IDAgfHwgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9GTEFDKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYXVkaW8gc3RyZWFtLiBFeGFjdGx5IG9uZSBGTEFDICIKKyAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvIHN0cmVhbSBpcyByZXF1aXJlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXIgPSBzLT5zdHJlYW1zW2ldLT5jb2RlY3BhcjsKKyAgICAgICAgICAgIGMtPmF1ZGlvX3N0cmVhbV9pZHggPSBpOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIGlmICghKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJWaWRlbyBzdHJlYW0gIyVkIGlzIG5vdCBhbiBhdHRhY2hlZCBwaWN0dXJlLiBJZ25vcmluZ1xuIiwgaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfR0lGKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkdJRiBpbWFnZSBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWMtPndyaXRlX2hlYWRlcikgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW4ndCB3cml0ZSBhdHRhY2hlZCBwaWN0dXJlcyB3aXRob3V0IGEgaGVhZGVyLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGMtPndhaXRpbmdfcGljcysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk9ubHkgYXVkaW8gc3RyZWFtcyBhbmQgcGljdHVyZXMgYXJlIGFsbG93ZWQgaW4gRkxBQy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoYy0+YXVkaW9fc3RyZWFtX2lkeCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk5vIGF1ZGlvIHN0cmVhbSBwcmVzZW50LlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgYXZfZnJlZXAoJmMtPnN0cmVhbWluZm8pOworICAgIC8qIGFkZCB0aGUgY2hhbm5lbCBsYXlvdXQgdGFnICovCisgICAgaWYgKHBhci0+Y2hhbm5lbF9sYXlvdXQgJiYKKyAgICAgICAgIShwYXItPmNoYW5uZWxfbGF5b3V0ICYgfjB4M2ZmZmZVTEwpICYmCisgICAgICAgICFmZl9mbGFjX2lzX25hdGl2ZV9sYXlvdXQocGFyLT5jaGFubmVsX2xheW91dCkpIHsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmNobWFzayA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiV0FWRUZPUk1BVEVYVEVOU0lCTEVfQ0hBTk5FTF9NQVNLIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworCisgICAgICAgIGlmIChjaG1hc2spIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkEgV0FWRUZPUk1BVEVYVEVOU0lCTEVfQ0hBTk5FTF9NQVNLIGlzICIKKyAgICAgICAgICAgICAgICAgICAiYWxyZWFkeSBwcmVzZW50LCB0aGlzIG11eGVyIHdpbGwgbm90IG92ZXJ3cml0ZSBpdC5cbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCBidWZbMzJdOworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjB4JSJQUkl4NjQsIHBhci0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCAiV0FWRUZPUk1BVEVYVEVOU0lCTEVfQ0hBTk5FTF9NQVNLIiwgYnVmLCAwKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZsYWNfd3JpdGVfcGFja2V0KHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCitzdGF0aWMgaW50IGZsYWNfd3JpdGVfaGVhZGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgRmxhY011eGVyQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1tjLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWNwYXI7CisgICAgaW50IHJldDsKKworICAgIGlmICghYy0+d3JpdGVfaGVhZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldCA9IGZmX2ZsYWNfd3JpdGVfaGVhZGVyKHMtPnBiLCBwYXItPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmV4dHJhZGF0YV9zaXplLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICghYy0+d2FpdGluZ19waWNzKQorICAgICAgICByZXQgPSBmbGFjX2ZpbmlzaF9oZWFkZXIocyk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZsYWNfd3JpdGVfYXVkaW9fcGFja2V0KHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgRmxhY011eGVyQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKICAgICB1aW50OF90ICpzdHJlYW1pbmZvOwpAQCAtMTg2LDYgKzMwMSwxMDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBmbGFjX3F1ZXVlX2ZsdXNoKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBGbGFjTXV4ZXJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWUGFja2V0IHBrdDsKKyAgICBpbnQgcmV0LCB3cml0ZSA9IDE7CisKKyAgICByZXQgPSBmbGFjX2ZpbmlzaF9oZWFkZXIocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHdyaXRlID0gMDsKKworICAgIHdoaWxlIChjLT5xdWV1ZSkgeworICAgICAgICBmZl9wYWNrZXRfbGlzdF9nZXQoJmMtPnF1ZXVlLCAmYy0+cXVldWVfZW5kLCAmcGt0KTsKKyAgICAgICAgaWYgKHdyaXRlICYmIChyZXQgPSBmbGFjX3dyaXRlX2F1ZGlvX3BhY2tldChzLCAmcGt0KSkgPCAwKQorICAgICAgICAgICAgd3JpdGUgPSAwOworICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmxhY193cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50NjRfdCBmaWxlX3NpemU7CisgICAgRmxhY011eGVyQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpzdHJlYW1pbmZvID0gYy0+c3RyZWFtaW5mbyA/IGMtPnN0cmVhbWluZm8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tjLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWNwYXItPmV4dHJhZGF0YTsKKworICAgIGlmIChjLT53YWl0aW5nX3BpY3MpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiTm8gcGFja2V0cyB3ZXJlIHNlbnQgZm9yIHNvbWUgb2YgdGhlICIKKyAgICAgICAgICAgICAgICJhdHRhY2hlZCBwaWN0dXJlcy5cbiIpOworICAgICAgICBmbGFjX3F1ZXVlX2ZsdXNoKHMpOworICAgIH0KKworICAgIGlmICghYy0+d3JpdGVfaGVhZGVyIHx8ICFzdHJlYW1pbmZvKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgeworICAgICAgICAvKiByZXdyaXRlIHRoZSBTVFJFQU1JTkZPIGhlYWRlciBibG9jayBkYXRhICovCisgICAgICAgIGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGF2aW9fc2VlayhwYiwgOCwgU0VFS19TRVQpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBzdHJlYW1pbmZvLCBGTEFDX1NUUkVBTUlORk9fU0laRSk7CisgICAgICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fZmx1c2gocGIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVuYWJsZSB0byByZXdyaXRlIEZMQUMgaGVhZGVyLlxuIik7CisgICAgfQorCisgICAgYXZfZnJlZXAoJmMtPnN0cmVhbWluZm8pOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmxhY193cml0ZV9wYWNrZXQoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBGbGFjTXV4ZXJDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAocGt0LT5zdHJlYW1faW5kZXggPT0gYy0+YXVkaW9fc3RyZWFtX2lkeCkgeworICAgICAgICBpZiAoYy0+d2FpdGluZ19waWNzKSB7CisgICAgICAgICAgICAvKiBidWZmZXIgYXVkaW8gcGFja2V0cyB1bnRpbCB3ZSBnZXQgYWxsIHRoZSBwaWN0dXJlcyAqLworICAgICAgICAgICAgcmV0ID0gZmZfcGFja2V0X2xpc3RfcHV0KCZjLT5xdWV1ZSwgJmMtPnF1ZXVlX2VuZCwgcGt0LCBGRl9QQUNLRVRMSVNUX0ZMQUdfUkVGX1BBQ0tFVCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPdXQgb2YgbWVtb3J5IGluIHBhY2tldCBxdWV1ZTsgc2tpcHBpbmcgYXR0YWNoZWQgcGljdHVyZXNcbiIpOworICAgICAgICAgICAgICAgIGMtPndhaXRpbmdfcGljcyA9IDA7CisgICAgICAgICAgICAgICAgcmV0ID0gZmxhY19xdWV1ZV9mbHVzaChzKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxhY193cml0ZV9hdWRpb19wYWNrZXQocywgcGt0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXR1cm4gZmxhY193cml0ZV9hdWRpb19wYWNrZXQocywgcGt0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKworICAgICAgICBpZiAoIWMtPndhaXRpbmdfcGljcyB8fAorICAgICAgICAgICAgIShzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgLyogd2FybiBvbmx5IG9uY2UgZm9yIGVhY2ggc3RyZWFtICovCisgICAgICAgIGlmIChzdC0+bmJfZnJhbWVzID09IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkdvdCBtb3JlIHRoYW4gb25lIHBpY3R1cmUgaW4gc3RyZWFtICVkLCIKKyAgICAgICAgICAgICAgICAgICAiIGlnbm9yaW5nLlxuIiwgcGt0LT5zdHJlYW1faW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdC0+bmJfZnJhbWVzID49IDEpCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBzdC0+cHJpdl9kYXRhID0gYXZfcGFja2V0X2Nsb25lKHBrdCk7CisgICAgICAgIGlmICghc3QtPnByaXZfZGF0YSkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPdXQgb2YgbWVtb3J5IHF1ZXVlaW5nIGFuIGF0dGFjaGVkIHBpY3R1cmU7IHNraXBwaW5nXG4iKTsKKyAgICAgICAgYy0+d2FpdGluZ19waWNzLS07CisKKyAgICAgICAgLyogZmx1c2ggdGhlIGJ1ZmZlcmVkIGF1ZGlvIHBhY2tldHMgKi8KKyAgICAgICAgaWYgKCFjLT53YWl0aW5nX3BpY3MgJiYKKyAgICAgICAgICAgIChyZXQgPSBmbGFjX3F1ZXVlX2ZsdXNoKHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gZmxhY2VuY19vcHRpb25zW10gPSB7CiAgICAgeyAid3JpdGVfaGVhZGVyIiwgIldyaXRlIHRoZSBmaWxlIGhlYWRlciIsIG9mZnNldG9mKEZsYWNNdXhlckNvbnRleHQsIHdyaXRlX2hlYWRlciksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMX0sIDAsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCiAgICAgeyBOVUxMIH0sCkBAIC0yMDUsNyArNDIwLDggQEAKICAgICAubWltZV90eXBlICAgICAgICAgPSAiYXVkaW8veC1mbGFjIiwKICAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiZmxhYyIsCiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfRkxBQywKLSAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1BORywKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSBmbGFjX2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgICAgID0gZmxhY193cml0ZV9oZWFkZXIsCiAgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmxhY193cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgICAgID0gZmxhY193cml0ZV90cmFpbGVyLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZmxpYy5jIGIvbGliYXZmb3JtYXQvZmxpYy5jCmluZGV4IDMwZGUzNTEuLjdjNjJjYjQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2ZsaWMuYworKysgYi9saWJhdmZvcm1hdC9mbGljLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogRkxJL0ZMQyBBbmltYXRpb24gRmlsZSBEZW11eGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTEwOSwyNSArMTA5LDI1IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBmbGljLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9GTElDOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLwotICAgIHN0LT5jb2RlYy0+d2lkdGggPSBBVl9STDE2KCZoZWFkZXJbMHgwOF0pOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gQVZfUkwxNigmaGVhZGVyWzB4MEFdKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMSUM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IEFWX1JMMTYoJmhlYWRlclsweDA4XSk7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBBVl9STDE2KCZoZWFkZXJbMHgwQV0pOwogCi0gICAgaWYgKCFzdC0+Y29kZWMtPndpZHRoIHx8ICFzdC0+Y29kZWMtPmhlaWdodCkgeworICAgIGlmICghc3QtPmNvZGVjcGFyLT53aWR0aCB8fCAhc3QtPmNvZGVjcGFyLT5oZWlnaHQpIHsKICAgICAgICAgLyogVWdseSBoYWNrIG5lZWRlZCBmb3IgdGhlIGZvbGxvd2luZyBzYW1wbGU6ICovCiAgICAgICAgIC8qIGh0dHA6Ly9zYW1wbGVzLm1wbGF5ZXJocS5odS9mbGktZmxjL2ZsaS1idWdzL3NwZWN1bGFyLmZsYyAqLwogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAiRmlsZSB3aXRoIG5vIHNwZWNpZmllZCB3aWR0aC9oZWlnaHQuIFRyeWluZyA2NDB4NDgwLlxuIik7Ci0gICAgICAgIHN0LT5jb2RlYy0+d2lkdGggID0gNjQwOwotICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IDQ4MDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSA2NDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gNDgwOwogICAgIH0KIAogICAgIC8qIHNlbmQgb3ZlciB0aGUgd2hvbGUgMTI4LWJ5dGUgRkxJQyBoZWFkZXIgKi8KLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgRkxJQ19IRUFERVJfU0laRSkpCisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIEZMSUNfSEVBREVSX1NJWkUpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgaGVhZGVyLCBGTElDX0hFQURFUl9TSVpFKTsKKyAgICBtZW1jcHkoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIGhlYWRlciwgRkxJQ19IRUFERVJfU0laRSk7CiAKICAgICAvKiBwZWVrIGF0IHRoZSBwcmVhbWJsZSB0byBkZXRlY3QgVEZURCB2aWRlb3MgLSB0aGV5IHNlZW0gdG8gYWx3YXlzIHN0YXJ0IHdpdGggYW4gYXVkaW8gY2h1bmsgKi8KICAgICBpZiAoYXZpb19yZWFkKHBiLCBwcmVhbWJsZSwgRkxJQ19QUkVBTUJMRV9TSVpFKSAhPSBGTElDX1BSRUFNQkxFX1NJWkUpIHsKQEAgLTE1MiwyMSArMTUyLDIxIEBACiAgICAgICAgIGZsaWMtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IGFzdC0+aW5kZXg7CiAKICAgICAgICAgLyogYWxsIGF1ZGlvIGZyYW1lcyBhcmUgdGhlIHNhbWUgc2l6ZSwgc28gdXNlIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBjaHVuayBmb3IgYmxvY2tfYWxpZ24gKi8KLSAgICAgICAgYXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBBVl9STDMyKCZwcmVhbWJsZVswXSk7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OwotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOwotICAgICAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IEZMSUNfVEZURF9TQU1QTEVfUkFURTsKLSAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOwotICAgICAgICBhc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiA4OwotICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OwotICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwotICAgICAgICBhc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gQVZfUkwzMigmcHJlYW1ibGVbMF0pOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBGTElDX1RGVERfU0FNUExFX1JBVEU7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICogODsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSAwOwogCiAgICAgICAgIC8qIFNpbmNlIHRoZSBoZWFkZXIgaW5mb3JtYXRpb24gaXMgaW5jb3JyZWN0IHdlIGhhdmUgdG8gZmlndXJlIG91dCB0aGUKICAgICAgICAgICogZnJhbWVyYXRlIHVzaW5nIGJsb2NrX2FsaWduIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSBhdWRpbyBpcyAyMjA1MCBIei4KICAgICAgICAgICogV2UgdXN1YWxseSBoYXZlIHR3byBjYXNlczogMjIwNSAtPiAxMCBmcHMgYW5kIDE0NzAgLT4gMTUgZnBzICovCi0gICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBhc3QtPmNvZGVjLT5ibG9ja19hbGlnbiwgRkxJQ19URlREX1NBTVBMRV9SQVRFKTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIGFzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduLCBGTElDX1RGVERfU0FNUExFX1JBVEUpOwogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgNjQsIDEsIEZMSUNfVEZURF9TQU1QTEVfUkFURSk7CiAgICAgfSBlbHNlIGlmIChBVl9STDE2KCZoZWFkZXJbMHgxMF0pID09IEZMSUNfQ0hVTktfTUFHSUNfMSkgewogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgRkxJQ19NQ19TUEVFRCwgNzApOwpAQCAtMTc1LDEwICsxNzUsMTAgQEAKICAgICAgICAgYXZpb19zZWVrKHBiLCAxMiwgU0VFS19TRVQpOwogCiAgICAgICAgIC8qIHNlbmQgb3ZlciBhYmJyZXZpYXRlZCBGTElDIGhlYWRlciBjaHVuayAqLwotICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgMTIpKQorICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMTIpKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBoZWFkZXIsIDEyKTsKKyAgICAgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBoZWFkZXIsIDEyKTsKIAogICAgIH0gZWxzZSBpZiAobWFnaWNfbnVtYmVyID09IEZMSUNfRklMRV9NQUdJQ18xKSB7CiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBzcGVlZCwgNzApOwpAQCAtMjA0LDcgKzIwNCw3IEBACiAgICAgaW50IHJldCA9IDA7CiAgICAgdW5zaWduZWQgY2hhciBwcmVhbWJsZVtGTElDX1BSRUFNQkxFX1NJWkVdOwogCi0gICAgd2hpbGUgKCFwYWNrZXRfcmVhZCkgeworICAgIHdoaWxlICghcGFja2V0X3JlYWQgJiYgIWF2aW9fZmVvZihwYikpIHsKIAogICAgICAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChwYiwgcHJlYW1ibGUsIEZMSUNfUFJFQU1CTEVfU0laRSkpICE9CiAgICAgICAgICAgICBGTElDX1BSRUFNQkxFX1NJWkUpIHsKQEAgLTI1Niw3ICsyNTYsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gYXZpb19mZW9mKHBiKSA/IEFWRVJST1JfRU9GIDogcmV0OwogfQogCiBBVklucHV0Rm9ybWF0IGZmX2ZsaWNfZGVtdXhlciA9IHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ZsdmRlYy5jIGIvbGliYXZmb3JtYXQvZmx2ZGVjLmMKaW5kZXggNTA5MGFjMi4uMzRjM2UwOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZmx2ZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvZmx2ZGVjLmMKQEAgLTQsOCArNCw4IEBACiAgKgogICogVGhpcyBkZW11eGVyIHdpbGwgZ2VuZXJhdGUgYSAxIGJ5dGUgZXh0cmFkYXRhIGZvciBWUDZGIGNvbnRlbnQuCiAgKiBJdCBpcyBjb21wb3NlZCBvZjoKLSAqICAtIHVwcGVyIDRiaXRzOiBkaWZmZXJlbmNlIGJldHdlZW4gZW5jb2RlZCB3aWR0aCBhbmQgdmlzaWJsZSB3aWR0aAotICogIC0gbG93ZXIgNGJpdHM6IGRpZmZlcmVuY2UgYmV0d2VlbiBlbmNvZGVkIGhlaWdodCBhbmQgdmlzaWJsZSBoZWlnaHQKKyAqICAtIHVwcGVyIDQgYml0czogZGlmZmVyZW5jZSBiZXR3ZWVuIGVuY29kZWQgd2lkdGggYW5kIHZpc2libGUgd2lkdGgKKyAqICAtIGxvd2VyIDQgYml0czogZGlmZmVyZW5jZSBiZXR3ZWVuIGVuY29kZWQgaGVpZ2h0IGFuZCB2aXNpYmxlIGhlaWdodAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC02MSw2ICs2MSwxNSBAQAogCiAgICAgaW50IGJyb2tlbl9zaXplczsKICAgICBpbnQgc3VtX2Zsdl90YWdfc2l6ZTsKKworICAgIGludCBsYXN0X2tleWZyYW1lX3N0cmVhbV9pbmRleDsKKyAgICBpbnQga2V5ZnJhbWVfY291bnQ7CisgICAgaW50NjRfdCB2aWRlb19iaXRfcmF0ZTsKKyAgICBpbnQ2NF90IGF1ZGlvX2JpdF9yYXRlOworICAgIGludDY0X3QgKmtleWZyYW1lX3RpbWVzOworICAgIGludDY0X3QgKmtleWZyYW1lX2ZpbGVwb3NpdGlvbnM7CisgICAgaW50IG1pc3Npbmdfc3RyZWFtczsKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKIH0gRkxWQ29udGV4dDsKIAogc3RhdGljIGludCBwcm9iZShBVlByb2JlRGF0YSAqcCwgaW50IGxpdmUpCkBAIC05MiwzMSArMTAxLDc1IEBACiAgICAgcmV0dXJuIHByb2JlKHAsIDEpOwogfQogCitzdGF0aWMgdm9pZCBhZGRfa2V5ZnJhbWVzX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBGTFZDb250ZXh0ICpmbHYgICA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3RyZWFtICA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGkgICAgPSAwOworCisgICAgaWYgKGZsdi0+bGFzdF9rZXlmcmFtZV9zdHJlYW1faW5kZXggPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJrZXlmcmFtZSBzdHJlYW0gaGFzbid0IGJlZW4gY3JlYXRlZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdl9hc3NlcnQwKGZsdi0+bGFzdF9rZXlmcmFtZV9zdHJlYW1faW5kZXggPD0gcy0+bmJfc3RyZWFtcyk7CisgICAgc3RyZWFtID0gcy0+c3RyZWFtc1tmbHYtPmxhc3Rfa2V5ZnJhbWVfc3RyZWFtX2luZGV4XTsKKworICAgIGlmIChzdHJlYW0tPm5iX2luZGV4X2VudHJpZXMgPT0gMCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmx2LT5rZXlmcmFtZV9jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAia2V5ZnJhbWUgZmlsZXBvc2l0aW9ucyA9ICUiUFJJZDY0IiB0aW1lcyA9ICUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgICAgICAgICBmbHYtPmtleWZyYW1lX2ZpbGVwb3NpdGlvbnNbaV0sIGZsdi0+a2V5ZnJhbWVfdGltZXNbaV0gKiAxMDAwKTsKKyAgICAgICAgICAgIGF2X2FkZF9pbmRleF9lbnRyeShzdHJlYW0sIGZsdi0+a2V5ZnJhbWVfZmlsZXBvc2l0aW9uc1tpXSwKKyAgICAgICAgICAgICAgICBmbHYtPmtleWZyYW1lX3RpbWVzW2ldICogMTAwMCwgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiU2tpcHBpbmcgZHVwbGljYXRlIGluZGV4XG4iKTsKKworICAgIGlmIChzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBhdl9mcmVlcCgmZmx2LT5rZXlmcmFtZV90aW1lcyk7CisgICAgICAgIGF2X2ZyZWVwKCZmbHYtPmtleWZyYW1lX2ZpbGVwb3NpdGlvbnMpOworICAgICAgICBmbHYtPmtleWZyYW1lX2NvdW50ID0gMDsKKyAgICB9Cit9CisKIHN0YXRpYyBBVlN0cmVhbSAqY3JlYXRlX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMsIGludCBjb2RlY190eXBlKQogeworICAgIEZMVkNvbnRleHQgKmZsdiAgID0gcy0+cHJpdl9kYXRhOwogICAgIEFWU3RyZWFtICpzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gY29kZWNfdHlwZTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBjb2RlY190eXBlOwogICAgIGlmIChzLT5uYl9zdHJlYW1zPj0zIHx8KCAgIHMtPm5iX3N0cmVhbXM9PTIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRQotICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcy0+c3RyZWFtc1sxXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgcy0+c3RyZWFtc1sxXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSkKICAgICAgICAgcy0+Y3R4X2ZsYWdzICY9IH5BVkZNVENUWF9OT0hFQURFUjsKKyAgICBpZiAoY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IGZsdi0+YXVkaW9fYml0X3JhdGU7CisgICAgICAgIGZsdi0+bWlzc2luZ19zdHJlYW1zICY9IH5GTFZfSEVBREVSX0ZMQUdfSEFTQVVESU87CisgICAgfQorICAgIGlmIChjb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gZmx2LT52aWRlb19iaXRfcmF0ZTsKKyAgICAgICAgZmx2LT5taXNzaW5nX3N0cmVhbXMgJj0gfkZMVl9IRUFERVJfRkxBR19IQVNWSURFTzsKKyAgICAgICAgc3QtPmF2Z19mcmFtZV9yYXRlID0gZmx2LT5mcmFtZXJhdGU7CisgICAgfQorCiAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgMTAwMCk7IC8qIDMyIGJpdCBwdHMgaW4gbXMgKi8KKyAgICBmbHYtPmxhc3Rfa2V5ZnJhbWVfc3RyZWFtX2luZGV4ID0gcy0+bmJfc3RyZWFtcyAtIDE7CisgICAgYWRkX2tleWZyYW1lc19pbmRleChzKTsKICAgICByZXR1cm4gc3Q7CiB9CiAKLXN0YXRpYyBpbnQgZmx2X3NhbWVfYXVkaW9fY29kZWMoQVZDb2RlY0NvbnRleHQgKmFjb2RlYywgaW50IGZsYWdzKQorc3RhdGljIGludCBmbHZfc2FtZV9hdWRpb19jb2RlYyhBVkNvZGVjUGFyYW1ldGVycyAqYXBhciwgaW50IGZsYWdzKQogewogICAgIGludCBiaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAoZmxhZ3MgJiBGTFZfQVVESU9fU0FNUExFU0laRV9NQVNLKSA/IDE2IDogODsKICAgICBpbnQgZmx2X2NvZGVjaWQgICAgICAgICAgID0gZmxhZ3MgJiBGTFZfQVVESU9fQ09ERUNJRF9NQVNLOwogICAgIGludCBjb2RlY19pZDsKIAotICAgIGlmICghYWNvZGVjLT5jb2RlY19pZCAmJiAhYWNvZGVjLT5jb2RlY190YWcpCisgICAgaWYgKCFhcGFyLT5jb2RlY19pZCAmJiAhYXBhci0+Y29kZWNfdGFnKQogICAgICAgICByZXR1cm4gMTsKIAotICAgIGlmIChhY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAhPSBiaXRzX3Blcl9jb2RlZF9zYW1wbGUpCisgICAgaWYgKGFwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAhPSBiaXRzX3Blcl9jb2RlZF9zYW1wbGUpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgc3dpdGNoIChmbHZfY29kZWNpZCkgewpAQCAtMTI5LDQyICsxODIsNDIgQEAKICNlbHNlCiAgICAgICAgICAgICAgICAgICAgOiBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CiAjZW5kaWYKLSAgICAgICAgcmV0dXJuIGNvZGVjX2lkID09IGFjb2RlYy0+Y29kZWNfaWQ7CisgICAgICAgIHJldHVybiBjb2RlY19pZCA9PSBhcGFyLT5jb2RlY19pZDsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX1BDTV9MRToKICAgICAgICAgY29kZWNfaWQgPSBiaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gOAogICAgICAgICAgICAgICAgICAgID8gQVZfQ09ERUNfSURfUENNX1U4CiAgICAgICAgICAgICAgICAgICAgOiBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7Ci0gICAgICAgIHJldHVybiBjb2RlY19pZCA9PSBhY29kZWMtPmNvZGVjX2lkOworICAgICAgICByZXR1cm4gY29kZWNfaWQgPT0gYXBhci0+Y29kZWNfaWQ7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9BQUM6Ci0gICAgICAgIHJldHVybiBhY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQzsKKyAgICAgICAgcmV0dXJuIGFwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQzsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX0FEUENNOgotICAgICAgICByZXR1cm4gYWNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9TV0Y7CisgICAgICAgIHJldHVybiBhcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9TV0Y7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9TUEVFWDoKLSAgICAgICAgcmV0dXJuIGFjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVg7CisgICAgICAgIHJldHVybiBhcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TUEVFWDsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX01QMzoKLSAgICAgICAgcmV0dXJuIGFjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzOworICAgICAgICByZXR1cm4gYXBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzOwogICAgIGNhc2UgRkxWX0NPREVDSURfTkVMTFlNT1NFUl84S0haX01PTk86CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9ORUxMWU1PU0VSXzE2S0haX01PTk86CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9ORUxMWU1PU0VSOgotICAgICAgICByZXR1cm4gYWNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSOworICAgICAgICByZXR1cm4gYXBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTkVMTFlNT1NFUjsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX1BDTV9NVUxBVzoKLSAgICAgICAgcmV0dXJuIGFjb2RlYy0+c2FtcGxlX3JhdGUgPT0gODAwMCAmJgotICAgICAgICAgICAgICAgYWNvZGVjLT5jb2RlY19pZCAgICA9PSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CisgICAgICAgIHJldHVybiBhcGFyLT5zYW1wbGVfcmF0ZSA9PSA4MDAwICYmCisgICAgICAgICAgICAgICBhcGFyLT5jb2RlY19pZCAgICA9PSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9QQ01fQUxBVzoKLSAgICAgICAgcmV0dXJuIGFjb2RlYy0+c2FtcGxlX3JhdGUgPT0gODAwMCAmJgotICAgICAgICAgICAgICAgYWNvZGVjLT5jb2RlY19pZCAgICA9PSBBVl9DT0RFQ19JRF9QQ01fQUxBVzsKKyAgICAgICAgcmV0dXJuIGFwYXItPnNhbXBsZV9yYXRlID09IDgwMDAgJiYKKyAgICAgICAgICAgICAgIGFwYXItPmNvZGVjX2lkICAgID09IEFWX0NPREVDX0lEX1BDTV9BTEFXOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBhY29kZWMtPmNvZGVjX3RhZyA9PSAoZmx2X2NvZGVjaWQgPj4gRkxWX0FVRElPX0NPREVDSURfT0ZGU0VUKTsKKyAgICAgICAgcmV0dXJuIGFwYXItPmNvZGVjX3RhZyA9PSAoZmx2X2NvZGVjaWQgPj4gRkxWX0FVRElPX0NPREVDSURfT0ZGU0VUKTsKICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIGZsdl9zZXRfYXVkaW9fY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqYXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmFjb2RlYywgaW50IGZsdl9jb2RlY2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqYXBhciwgaW50IGZsdl9jb2RlY2lkKQogewogICAgIHN3aXRjaCAoZmx2X2NvZGVjaWQpIHsKICAgICAvLyBubyBkaXN0aW5jdGlvbiBiZXR3ZWVuIFMxNiBhbmQgUzggUENNIGNvZGVjIGZsYWdzCiAgICAgY2FzZSBGTFZfQ09ERUNJRF9QQ006Ci0gICAgICAgIGFjb2RlYy0+Y29kZWNfaWQgPSBhY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4CisgICAgICAgIGFwYXItPmNvZGVjX2lkID0gYXBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQVZfQ09ERUNfSURfUENNX1U4CiAjaWYgSEFWRV9CSUdFTkRJQU4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfQ09ERUNfSURfUENNX1MxNkJFOwpAQCAtMTczLDEyMSArMjI2LDEzMSBAQAogI2VuZGlmCiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfUENNX0xFOgotICAgICAgICBhY29kZWMtPmNvZGVjX2lkID0gYWNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gOAorICAgICAgICBhcGFyLT5jb2RlY19pZCA9IGFwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFWX0NPREVDX0lEX1BDTV9VOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfQUFDOgotICAgICAgICBhY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQUFDOworICAgICAgICBhcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FBQzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9BRFBDTToKLSAgICAgICAgYWNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX1NXRjsKKyAgICAgICAgYXBhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9TV0Y7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfU1BFRVg6Ci0gICAgICAgIGFjb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9TUEVFWDsKLSAgICAgICAgYWNvZGVjLT5zYW1wbGVfcmF0ZSA9IDE2MDAwOworICAgICAgICBhcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1NQRUVYOworICAgICAgICBhcGFyLT5zYW1wbGVfcmF0ZSA9IDE2MDAwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX01QMzoKLSAgICAgICAgYWNvZGVjLT5jb2RlY19pZCAgICAgID0gQVZfQ09ERUNfSURfTVAzOworICAgICAgICBhcGFyLT5jb2RlY19pZCAgICAgID0gQVZfQ09ERUNfSURfTVAzOwogICAgICAgICBhc3RyZWFtLT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX05FTExZTU9TRVJfOEtIWl9NT05POgogICAgICAgICAvLyBpbiBjYXNlIG1ldGFkYXRhIGRvZXMgbm90IG90aGVyd2lzZSBkZWNsYXJlIHNhbXBsZXJhdGUKLSAgICAgICAgYWNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0gICAgICAgIGFjb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSOworICAgICAgICBhcGFyLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgICAgIGFwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfTkVMTFlNT1NFUjsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9ORUxMWU1PU0VSXzE2S0haX01PTk86Ci0gICAgICAgIGFjb2RlYy0+c2FtcGxlX3JhdGUgPSAxNjAwMDsKLSAgICAgICAgYWNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX05FTExZTU9TRVI7CisgICAgICAgIGFwYXItPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgICAgIGFwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfTkVMTFlNT1NFUjsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9ORUxMWU1PU0VSOgotICAgICAgICBhY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTkVMTFlNT1NFUjsKKyAgICAgICAgYXBhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX1BDTV9NVUxBVzoKLSAgICAgICAgYWNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7Ci0gICAgICAgIGFjb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CisgICAgICAgIGFwYXItPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICAgICAgYXBhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfUENNX0FMQVc6Ci0gICAgICAgIGFjb2RlYy0+c2FtcGxlX3JhdGUgPSA4MDAwOwotICAgICAgICBhY29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfUENNX0FMQVc7CisgICAgICAgIGFwYXItPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICAgICAgYXBhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fQUxBVzsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJBdWRpbyBjb2RlYyAoJXgpIiwKICAgICAgICAgICAgICAgIGZsdl9jb2RlY2lkID4+IEZMVl9BVURJT19DT0RFQ0lEX09GRlNFVCk7Ci0gICAgICAgIGFjb2RlYy0+Y29kZWNfdGFnID0gZmx2X2NvZGVjaWQgPj4gRkxWX0FVRElPX0NPREVDSURfT0ZGU0VUOworICAgICAgICBhcGFyLT5jb2RlY190YWcgPSBmbHZfY29kZWNpZCA+PiBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQ7CiAgICAgfQogfQogCi1zdGF0aWMgaW50IGZsdl9zYW1lX3ZpZGVvX2NvZGVjKEFWQ29kZWNDb250ZXh0ICp2Y29kZWMsIGludCBmbGFncykKK3N0YXRpYyBpbnQgZmx2X3NhbWVfdmlkZW9fY29kZWMoQVZDb2RlY1BhcmFtZXRlcnMgKnZwYXIsIGludCBmbGFncykKIHsKICAgICBpbnQgZmx2X2NvZGVjaWQgPSBmbGFncyAmIEZMVl9WSURFT19DT0RFQ0lEX01BU0s7CiAKLSAgICBpZiAoIXZjb2RlYy0+Y29kZWNfaWQgJiYgIXZjb2RlYy0+Y29kZWNfdGFnKQorICAgIGlmICghdnBhci0+Y29kZWNfaWQgJiYgIXZwYXItPmNvZGVjX3RhZykKICAgICAgICAgcmV0dXJuIDE7CiAKICAgICBzd2l0Y2ggKGZsdl9jb2RlY2lkKSB7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9IMjYzOgotICAgICAgICByZXR1cm4gdmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTFYxOworICAgICAgICByZXR1cm4gdnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxWMTsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX1NDUkVFTjoKLSAgICAgICAgcmV0dXJuIHZjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxBU0hTVjsKKyAgICAgICAgcmV0dXJuIHZwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMQVNIU1Y7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9TQ1JFRU4yOgotICAgICAgICByZXR1cm4gdmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFTSFNWMjsKKyAgICAgICAgcmV0dXJuIHZwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMQVNIU1YyOwogICAgIGNhc2UgRkxWX0NPREVDSURfVlA2OgotICAgICAgICByZXR1cm4gdmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZGOworICAgICAgICByZXR1cm4gdnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RjsKICAgICBjYXNlIEZMVl9DT0RFQ0lEX1ZQNkE6Ci0gICAgICAgIHJldHVybiB2Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkE7CisgICAgICAgIHJldHVybiB2cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZBOwogICAgIGNhc2UgRkxWX0NPREVDSURfSDI2NDoKLSAgICAgICAgcmV0dXJuIHZjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NDsKKyAgICAgICAgcmV0dXJuIHZwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQ7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIHZjb2RlYy0+Y29kZWNfdGFnID09IGZsdl9jb2RlY2lkOworICAgICAgICByZXR1cm4gdnBhci0+Y29kZWNfdGFnID09IGZsdl9jb2RlY2lkOwogICAgIH0KIH0KIAogc3RhdGljIGludCBmbHZfc2V0X3ZpZGVvX2NvZGVjKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnZzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsdl9jb2RlY2lkLCBpbnQgcmVhZCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqdmNvZGVjID0gdnN0cmVhbS0+Y29kZWM7CisgICAgaW50IHJldCA9IDA7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHZzdHJlYW0tPmNvZGVjcGFyOworICAgIGVudW0gQVZDb2RlY0lEIG9sZF9jb2RlY19pZCA9IHZzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY19pZDsKICAgICBzd2l0Y2ggKGZsdl9jb2RlY2lkKSB7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9IMjYzOgotICAgICAgICB2Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxWMTsKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMVjE7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfUkVBTEgyNjM6Ci0gICAgICAgIHZjb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IMjYzOworICAgICAgICBwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSDI2MzsKICAgICAgICAgYnJlYWs7IC8vIFJlYWxseSBtZWFuIGl0IHRoaXMgdGltZQogICAgIGNhc2UgRkxWX0NPREVDSURfU0NSRUVOOgotICAgICAgICB2Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxBU0hTVjsKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMQVNIU1Y7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfU0NSRUVOMjoKLSAgICAgICAgdmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMQVNIU1YyOworICAgICAgICBwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxBU0hTVjI7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfVlA2OgotICAgICAgICB2Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfVlA2RjsKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1ZQNkY7CiAgICAgY2FzZSBGTFZfQ09ERUNJRF9WUDZBOgogICAgICAgICBpZiAoZmx2X2NvZGVjaWQgPT0gRkxWX0NPREVDSURfVlA2QSkKLSAgICAgICAgICAgIHZjb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9WUDZBOworICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1ZQNkE7CiAgICAgICAgIGlmIChyZWFkKSB7Ci0gICAgICAgICAgICBpZiAodmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgZmZfYWxsb2NfZXh0cmFkYXRhKHZjb2RlYywgMSk7CisgICAgICAgICAgICBpZiAocGFyLT5leHRyYWRhdGFfc2l6ZSAhPSAxKSB7CisgICAgICAgICAgICAgICAgZmZfYWxsb2NfZXh0cmFkYXRhKHBhciwgMSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmNvZGVjLT5leHRyYWRhdGEpCi0gICAgICAgICAgICAgICAgdmNvZGVjLT5leHRyYWRhdGFbMF0gPSBhdmlvX3I4KHMtPnBiKTsKKyAgICAgICAgICAgIGlmIChwYXItPmV4dHJhZGF0YSkKKyAgICAgICAgICAgICAgICBwYXItPmV4dHJhZGF0YVswXSA9IGF2aW9fcjgocy0+cGIpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgMSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7ICAgICAvLyAxIGJ5dGUgYm9keSBzaXplIGFkanVzdG1lbnQgZm9yIGZsdl9yZWFkX3BhY2tldCgpCisgICAgICAgIHJldCA9IDE7ICAgICAvLyAxIGJ5dGUgYm9keSBzaXplIGFkanVzdG1lbnQgZm9yIGZsdl9yZWFkX3BhY2tldCgpCisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfSDI2NDoKLSAgICAgICAgdmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0gyNjQ7CisgICAgICAgIHBhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IMjY0OwogICAgICAgICB2c3RyZWFtLT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOwotICAgICAgICByZXR1cm4gMzsgICAgIC8vIG5vdCA0LCByZWFkaW5nIHBhY2tldCB0eXBlIHdpbGwgY29uc3VtZSBvbmUgYnl0ZQorICAgICAgICByZXQgPSAzOyAgICAgLy8gbm90IDQsIHJlYWRpbmcgcGFja2V0IHR5cGUgd2lsbCBjb25zdW1lIG9uZSBieXRlCisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgRkxWX0NPREVDSURfTVBFRzQ6Ci0gICAgICAgIHZjb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHNDsKLSAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIHBhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHNDsKKyAgICAgICAgcmV0ID0gMzsKKyAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJWaWRlbyBjb2RlYyAoJXgpIiwgZmx2X2NvZGVjaWQpOwotICAgICAgICB2Y29kZWMtPmNvZGVjX3RhZyA9IGZsdl9jb2RlY2lkOworICAgICAgICBwYXItPmNvZGVjX3RhZyA9IGZsdl9jb2RlY2lkOwogICAgIH0KIAotICAgIHJldHVybiAwOworICAgIGlmICghdnN0cmVhbS0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUgJiYgcGFyLT5jb2RlY19pZCAhPSBvbGRfY29kZWNfaWQpIHsKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJDaGFuZ2luZyB0aGUgY29kZWMgaWQgbWlkc3RyZWFtIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGFtZl9nZXRfc3RyaW5nKEFWSU9Db250ZXh0ICppb2MsIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZzaXplKQpAQCAtMzA1LDggKzM2OCw3IEBACiAgICAgcmV0dXJuIGxlbmd0aDsKIH0KIAotc3RhdGljIGludCBwYXJzZV9rZXlmcmFtZXNfaW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqaW9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnZzdHJlYW0sIGludDY0X3QgbWF4X3BvcykKK3N0YXRpYyBpbnQgcGFyc2Vfa2V5ZnJhbWVzX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKmlvYywgaW50NjRfdCBtYXhfcG9zKQogewogICAgIEZMVkNvbnRleHQgKmZsdiAgICAgICA9IHMtPnByaXZfZGF0YTsKICAgICB1bnNpZ25lZCBpbnQgdGltZXNsZW4gPSAwLCBmaWxlcG9zbGVuID0gMCwgaTsKQEAgLTMxNiwxMCArMzc4LDEyIEBACiAgICAgaW50IHJldCAgICAgICAgICAgICAgICA9IEFWRVJST1IoRU5PU1lTKTsKICAgICBpbnQ2NF90IGluaXRpYWxfcG9zICAgID0gYXZpb190ZWxsKGlvYyk7CiAKLSAgICBpZiAodnN0cmVhbS0+bmJfaW5kZXhfZW50cmllcz4wKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlNraXBwaW5nIGR1cGxpY2F0ZSBpbmRleFxuIik7CisgICAgaWYgKGZsdi0+a2V5ZnJhbWVfY291bnQgPiAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJrZXlmcmFtZXMgaGF2ZSBiZWVuIHBhcmVzZWRcbiIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CisgICAgYXZfYXNzZXJ0MCghZmx2LT5rZXlmcmFtZV90aW1lcyk7CisgICAgYXZfYXNzZXJ0MCghZmx2LT5rZXlmcmFtZV9maWxlcG9zaXRpb25zKTsKIAogICAgIGlmIChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfSUdOSURYKQogICAgICAgICByZXR1cm4gMDsKQEAgLTM2OCwxNSArNDMyLDE2IEBACiAgICAgfQogCiAgICAgaWYgKHRpbWVzbGVuID09IGZpbGVwb3NsZW4gJiYgZmlsZXBvc2xlbj4xICYmIG1heF9wb3MgPD0gZmlsZXBvc2l0aW9uc1swXSkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZmlsZXBvc2xlbjsgaSsrKSB7Ci0gICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkodnN0cmVhbSwgZmlsZXBvc2l0aW9uc1tpXSwgdGltZXNbaV0gKiAxMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOwotICAgICAgICAgICAgaWYgKGkgPCAyKSB7Ci0gICAgICAgICAgICAgICAgZmx2LT52YWxpZGF0ZV9pbmRleFtpXS5wb3MgPSBmaWxlcG9zaXRpb25zW2ldOwotICAgICAgICAgICAgICAgIGZsdi0+dmFsaWRhdGVfaW5kZXhbaV0uZHRzID0gdGltZXNbaV0gKiAxMDAwOwotICAgICAgICAgICAgICAgIGZsdi0+dmFsaWRhdGVfY291bnQgICAgICAgID0gaSArIDE7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRk1JTigyLGZpbGVwb3NsZW4pOyBpKyspIHsKKyAgICAgICAgICAgIGZsdi0+dmFsaWRhdGVfaW5kZXhbaV0ucG9zID0gZmlsZXBvc2l0aW9uc1tpXTsKKyAgICAgICAgICAgIGZsdi0+dmFsaWRhdGVfaW5kZXhbaV0uZHRzID0gdGltZXNbaV0gKiAxMDAwOworICAgICAgICAgICAgZmx2LT52YWxpZGF0ZV9jb3VudCAgICAgICAgPSBpICsgMTsKICAgICAgICAgfQorICAgICAgICBmbHYtPmtleWZyYW1lX3RpbWVzID0gdGltZXM7CisgICAgICAgIGZsdi0+a2V5ZnJhbWVfZmlsZXBvc2l0aW9ucyA9IGZpbGVwb3NpdGlvbnM7CisgICAgICAgIGZsdi0+a2V5ZnJhbWVfY291bnQgPSB0aW1lc2xlbjsKKyAgICAgICAgdGltZXMgPSBOVUxMOworICAgICAgICBmaWxlcG9zaXRpb25zID0gTlVMTDsKICAgICB9IGVsc2UgewogaW52YWxpZDoKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBrZXlmcmFtZXMgb2JqZWN0LCBza2lwcGluZy5cbiIpOwpAQCAtMzkzLDcgKzQ1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnZzdHJlYW0sIGNvbnN0IGNoYXIgKmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1heF9wb3MsIGludCBkZXB0aCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqYWNvZGVjLCAqdmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICphcGFyLCAqdnBhcjsKICAgICBGTFZDb250ZXh0ICpmbHYgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKmlvYzsKICAgICBBTUZEYXRhVHlwZSBhbWZfdHlwZTsKQEAgLTQxOCwxMyArNDgzLDE0IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBTUZfREFUQV9UWVBFX09CSkVDVDoKLSAgICAgICAgaWYgKCh2c3RyZWFtIHx8IGFzdHJlYW0pICYmIGtleSAmJgotICAgICAgICAgICAgaW9jLT5zZWVrYWJsZSAmJgorICAgICAgICBpZiAoa2V5ICYmCisgICAgICAgICAgICAoaW9jLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJgogICAgICAgICAgICAgIXN0cmNtcChLRVlGUkFNRVNfVEFHLCBrZXkpICYmIGRlcHRoID09IDEpCi0gICAgICAgICAgICBpZiAocGFyc2Vfa2V5ZnJhbWVzX2luZGV4KHMsIGlvYywgdnN0cmVhbSA/IHZzdHJlYW0gOiBhc3RyZWFtLAorICAgICAgICAgICAgaWYgKHBhcnNlX2tleWZyYW1lc19pbmRleChzLCBpb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9wb3MpIDwgMCkKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiS2V5ZnJhbWUgaW5kZXggcGFyc2luZyBmYWlsZWRcbiIpOwotCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYWRkX2tleWZyYW1lc19pbmRleChzKTsKICAgICAgICAgd2hpbGUgKGF2aW9fdGVsbChpb2MpIDwgbWF4X3BvcyAtIDIgJiYKICAgICAgICAgICAgICAgIGFtZl9nZXRfc3RyaW5nKGlvYywgc3RyX3ZhbCwgc2l6ZW9mKHN0cl92YWwpKSA+IDApCiAgICAgICAgICAgICBpZiAoYW1mX3BhcnNlX29iamVjdChzLCBhc3RyZWFtLCB2c3RyZWFtLCBzdHJfdmFsLCBtYXhfcG9zLApAQCAtNDc3LDggKzU0Myw4IEBACiAgICAgfQogCiAgICAgaWYgKGtleSkgewotICAgICAgICBhY29kZWMgPSBhc3RyZWFtID8gYXN0cmVhbS0+Y29kZWMgOiBOVUxMOwotICAgICAgICB2Y29kZWMgPSB2c3RyZWFtID8gdnN0cmVhbS0+Y29kZWMgOiBOVUxMOworICAgICAgICBhcGFyID0gYXN0cmVhbSA/IGFzdHJlYW0tPmNvZGVjcGFyIDogTlVMTDsKKyAgICAgICAgdnBhciA9IHZzdHJlYW0gPyB2c3RyZWFtLT5jb2RlY3BhciA6IE5VTEw7CiAKICAgICAgICAgLy8gc3RyZWFtIGluZm8gZG9lc24ndCBsaXZlIGFueSBkZWVwZXIgdGhhbiB0aGUgZmlyc3Qgb2JqZWN0CiAgICAgICAgIGlmIChkZXB0aCA9PSAxKSB7CkBAIC00ODYsMzYgKzU1Miw0MiBAQAogICAgICAgICAgICAgICAgIGFtZl90eXBlID09IEFNRl9EQVRBX1RZUEVfQk9PTCkgewogICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGtleSwgImR1cmF0aW9uIikpCiAgICAgICAgICAgICAgICAgICAgIHMtPmR1cmF0aW9uID0gbnVtX3ZhbCAqIEFWX1RJTUVfQkFTRTsKLSAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgInZpZGVvZGF0YXJhdGUiKSAmJiB2Y29kZWMgJiYKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgInZpZGVvZGF0YXJhdGUiKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gKGludCkobnVtX3ZhbCAqIDEwMjQuMCkpCi0gICAgICAgICAgICAgICAgICAgIHZjb2RlYy0+Yml0X3JhdGUgPSBudW1fdmFsICogMTAyNC4wOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiYXVkaW9kYXRhcmF0ZSIpICYmIGFjb2RlYyAmJgorICAgICAgICAgICAgICAgICAgICBmbHYtPnZpZGVvX2JpdF9yYXRlID0gbnVtX3ZhbCAqIDEwMjQuMDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgImF1ZGlvZGF0YXJhdGUiKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gKGludCkobnVtX3ZhbCAqIDEwMjQuMCkpCi0gICAgICAgICAgICAgICAgICAgIGFjb2RlYy0+Yml0X3JhdGUgPSBudW1fdmFsICogMTAyNC4wOworICAgICAgICAgICAgICAgICAgICBmbHYtPmF1ZGlvX2JpdF9yYXRlID0gbnVtX3ZhbCAqIDEwMjQuMDsKICAgICAgICAgICAgICAgICBlbHNlIGlmICghc3RyY21wKGtleSwgImRhdGFzdHJlYW0iKSkgewogICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBjcmVhdGVfc3RyZWFtKHMsIEFWTUVESUFfVFlQRV9TVUJUSVRMRSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfVEVYVDsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RFWFQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgImZyYW1lcmF0ZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZsdi0+ZnJhbWVyYXRlID0gYXZfZDJxKG51bV92YWwsIDEwMDApOworICAgICAgICAgICAgICAgICAgICBpZiAodnN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZzdHJlYW0tPmF2Z19mcmFtZV9yYXRlID0gZmx2LT5mcmFtZXJhdGU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbHYtPnRydXN0X21ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGtleSwgInZpZGVvY29kZWNpZCIpICYmIHZjb2RlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmx2X3NldF92aWRlb19jb2RlYyhzLCB2c3RyZWFtLCBudW1fdmFsLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgImF1ZGlvY29kZWNpZCIpICYmIGFjb2RlYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChrZXksICJ2aWRlb2NvZGVjaWQiKSAmJiB2cGFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0ID0gZmx2X3NldF92aWRlb19jb2RlYyhzLCB2c3RyZWFtLCBudW1fdmFsLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJhdWRpb2NvZGVjaWQiKSAmJiBhcGFyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQgPSAoKGludCludW1fdmFsKSA8PCBGTFZfQVVESU9fQ09ERUNJRF9PRkZTRVQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbHZfc2V0X2F1ZGlvX2NvZGVjKHMsIGFzdHJlYW0sIGFjb2RlYywgaWQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiYXVkaW9zYW1wbGVyYXRlIikgJiYgYWNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY29kZWMtPnNhbXBsZV9yYXRlID0gbnVtX3ZhbDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgImF1ZGlvc2FtcGxlc2l6ZSIpICYmIGFjb2RlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBudW1fdmFsOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAic3RlcmVvIikgJiYgYWNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY29kZWMtPmNoYW5uZWxzICAgICAgID0gbnVtX3ZhbCArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gYWNvZGVjLT5jaGFubmVscyA9PSAyID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfU1RFUkVPIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIndpZHRoIikgJiYgdmNvZGVjKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2Y29kZWMtPndpZHRoID0gbnVtX3ZhbDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgImhlaWdodCIpICYmIHZjb2RlYykgewotICAgICAgICAgICAgICAgICAgICAgICAgdmNvZGVjLT5oZWlnaHQgPSBudW1fdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgZmx2X3NldF9hdWRpb19jb2RlYyhzLCBhc3RyZWFtLCBhcGFyLCBpZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJhdWRpb3NhbXBsZXJhdGUiKSAmJiBhcGFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGFyLT5zYW1wbGVfcmF0ZSA9IG51bV92YWw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJhdWRpb3NhbXBsZXNpemUiKSAmJiBhcGFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAic3RlcmVvIikgJiYgYXBhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBhci0+Y2hhbm5lbHMgICAgICAgPSBudW1fdmFsICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwYXItPmNoYW5uZWxfbGF5b3V0ID0gYXBhci0+Y2hhbm5lbHMgPT0gMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIndpZHRoIikgJiYgdnBhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgdnBhci0+d2lkdGggPSBudW1fdmFsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiaGVpZ2h0IikgJiYgdnBhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgdnBhci0+aGVpZ2h0ID0gbnVtX3ZhbDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTUyNiwxNSArNTk4LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA+IDAgJiYgdmVyc2lvbiA8PSA2NTUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx2LT5icm9rZW5fc2l6ZXMgPSAxOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIm1ldGFkYXRhY3JlYXRvciIpICYmICFzdHJjbXAoc3RyX3ZhbCwgIk1FR0EiKSkgewotICAgICAgICAgICAgICAgICAgICBmbHYtPmJyb2tlbl9zaXplcyA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIm1ldGFkYXRhY3JlYXRvciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggICAhc3RyY21wIChzdHJfdmFsLCAiTUVHQSIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhc3RybmNtcChzdHJfdmFsLCAiRmxpeEVuZ2luZSIsIDEwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsdi0+YnJva2VuX3NpemVzID0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYW1mX3R5cGUgPT0gQU1GX0RBVEFfVFlQRV9PQkpFQ1QgJiYgcy0+bmJfc3RyZWFtcyA9PSAxICYmCi0gICAgICAgICAgICgoIWFjb2RlYyAmJiAhc3RyY21wKGtleSwgImF1ZGlvY29kZWNpZCIpKSB8fAotICAgICAgICAgICAgKCF2Y29kZWMgJiYgIXN0cmNtcChrZXksICJ2aWRlb2NvZGVjaWQiKSkpKQorICAgICAgICAgICAoKCFhcGFyICYmICFzdHJjbXAoa2V5LCAiYXVkaW9jb2RlY2lkIikpIHx8CisgICAgICAgICAgICAoIXZwYXIgJiYgIXN0cmNtcChrZXksICJ2aWRlb2NvZGVjaWQiKSkpKQogICAgICAgICAgICAgICAgIHMtPmN0eF9mbGFncyAmPSB+QVZGTVRDVFhfTk9IRUFERVI7IC8vSWYgdGhlcmUgaXMgZWl0aGVyIGF1ZGlvL3ZpZGVvIG1pc3NpbmcsIGNvZGVjaWQgd2lsbCBiZSBhbiBlbXB0eSBvYmplY3QKIAogICAgICAgICBpZiAoIXN0cmNtcChrZXksICJkdXJhdGlvbiIpICAgICAgICB8fApAQCAtNTc0LDYgKzY0OCw3IEBACiAKIHN0YXRpYyBpbnQgZmx2X3JlYWRfbWV0YWJvZHkoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IG5leHRfcG9zKQogeworICAgIEZMVkNvbnRleHQgKmZsdiA9IHMtPnByaXZfZGF0YTsKICAgICBBTUZEYXRhVHlwZSB0eXBlOwogICAgIEFWU3RyZWFtICpzdHJlYW0sICphc3RyZWFtLCAqdnN0cmVhbTsKICAgICBBVlN0cmVhbSBhdl91bnVzZWQgKmRzdHJlYW07CkBAIC02MTIsMTEgKzY4NywxNSBAQAogICAgIC8vIHRoZSBsb29rdXAgZXZlcnkgdGltZSBpdCBpcyBjYWxsZWQuCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBzdHJlYW0gPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICBpZiAoc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGlmIChzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewogICAgICAgICAgICAgdnN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgZWxzZSBpZiAoc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgICAgICBmbHYtPmxhc3Rfa2V5ZnJhbWVfc3RyZWFtX2luZGV4ID0gaTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICAgICAgYXN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgZWxzZSBpZiAoc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCisgICAgICAgICAgICBpZiAoZmx2LT5sYXN0X2tleWZyYW1lX3N0cmVhbV9pbmRleCA9PSAtMSkKKyAgICAgICAgICAgICAgICBmbHYtPmxhc3Rfa2V5ZnJhbWVfc3RyZWFtX2luZGV4ID0gaTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKICAgICAgICAgICAgIGRzdHJlYW0gPSBzdHJlYW07CiAgICAgfQogCkBAIC02MjksMjkgKzcwOCwzNCBAQAogCiBzdGF0aWMgaW50IGZsdl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7Ci0gICAgaW50IG9mZnNldCwgZmxhZ3M7CisgICAgaW50IGZsYWdzOwogICAgIEZMVkNvbnRleHQgKmZsdiA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBwcmVfdGFnX3NpemUgPSAwOwogCiAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKICAgICBmbGFncyA9IGF2aW9fcjgocy0+cGIpOwogCi0gICAgcy0+Y3R4X2ZsYWdzIHw9IEFWRk1UQ1RYX05PSEVBREVSOworICAgIGZsdi0+bWlzc2luZ19zdHJlYW1zID0gZmxhZ3MgJiAoRkxWX0hFQURFUl9GTEFHX0hBU1ZJREVPIHwgRkxWX0hFQURFUl9GTEFHX0hBU0FVRElPKTsKIAotICAgIGlmIChmbGFncyAmIEZMVl9IRUFERVJfRkxBR19IQVNWSURFTykKLSAgICAgICAgaWYgKCFjcmVhdGVfc3RyZWFtKHMsIEFWTUVESUFfVFlQRV9WSURFTykpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIGlmIChmbGFncyAmIEZMVl9IRUFERVJfRkxBR19IQVNBVURJTykKLSAgICAgICAgaWYgKCFjcmVhdGVfc3RyZWFtKHMsIEFWTUVESUFfVFlQRV9BVURJTykpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIC8vIEZsYWcgZG9lc24ndCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBzY3JpcHQtZGF0YSBwcmVzZW50LiBNdXN0Ci0gICAgLy8gY3JlYXRlIHRoYXQgc3RyZWFtIGlmIGl0J3MgZW5jb3VudGVyZWQuCisgICAgcy0+Y3R4X2ZsYWdzIHw9IEFWRk1UQ1RYX05PSEVBREVSOwogCiAgICAgb2Zmc2V0ID0gYXZpb19yYjMyKHMtPnBiKTsKICAgICBhdmlvX3NlZWsocy0+cGIsIG9mZnNldCwgU0VFS19TRVQpOwotICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7CisKKyAgICAvKiBBbm5leCBFLiBUaGUgRkxWIEZpbGUgRm9ybWF0CisgICAgICogRS4zIFRoZUZMVkZpbGVCb2R5CisgICAgICogICAgIEZpZWxkICAgICAgICAgICAgICAgVHlwZSAgICBDb21tZW50CisgICAgICogICAgIFByZXZpb3VzVGFnU2l6ZTAgICAgVUkzMiAgICBBbHdheXMgMAorICAgICAqICovCisgICAgcHJlX3RhZ19zaXplID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAocHJlX3RhZ19zaXplKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlJlYWQgRkxWIGhlYWRlciBlcnJvciwgaW5wdXQgZmlsZSBpcyBub3QgYSBzdGFuZGFyZCBmbHYgZm9ybWF0LCBmaXJzdCBQcmV2aW91c1RhZ1NpemUwIGFsd2F5cyBpcyAwXG4iKTsKKyAgICB9CiAKICAgICBzLT5zdGFydF90aW1lID0gMDsKICAgICBmbHYtPnN1bV9mbHZfdGFnX3NpemUgPSAwOworICAgIGZsdi0+bGFzdF9rZXlmcmFtZV9zdHJlYW1faW5kZXggPSAtMTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNjYyLDE0ICs3NDYsMTcgQEAKICAgICBGTFZDb250ZXh0ICpmbHYgPSBzLT5wcml2X2RhdGE7CiAgICAgZm9yIChpPTA7IGk8RkxWX1NUUkVBTV9UWVBFX05COyBpKyspCiAgICAgICAgIGF2X2ZyZWVwKCZmbHYtPm5ld19leHRyYWRhdGFbaV0pOworICAgIGF2X2ZyZWVwKCZmbHYtPmtleWZyYW1lX3RpbWVzKTsKKyAgICBhdl9mcmVlcCgmZmx2LT5rZXlmcmFtZV9maWxlcG9zaXRpb25zKTsKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBmbHZfZ2V0X2V4dHJhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgaW50IHNpemUpCiB7Ci0gICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIHMtPnBiLCBzaXplKSA8IDApCisgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzLCBzdC0+Y29kZWNwYXIsIHMtPnBiLCBzaXplKSA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmludGVybmFsLT5uZWVkX2NvbnRleHRfdXBkYXRlID0gMTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNzg2LDcgKzg3Myw3IEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC03OTQsNyArODgxLDcgQEAKICAgICAgICAgc3QgPSBjcmVhdGVfc3RyZWFtKHMsIEFWTUVESUFfVFlQRV9TVUJUSVRMRSk7CiAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfVEVYVDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RFWFQ7CiAgICAgfQogCiAgICAgcGt0LT5kdHMgID0gZHRzOwpAQCAtOTMwLDcgKzEwMTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZmx2IHBhY2tldDogdHlwZSAlZCwgc2l6ZSAlZCwgZmxhZ3MgJWQuXG4iLAogICAgICAgICAgICAgICAgICAgIHR5cGUsIHNpemUsIGZsYWdzKTsKIHNraXA6Ci0gICAgICAgICAgICBhdmlvX3NlZWsocy0+cGIsIG5leHQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIG5leHQsIFNFRUtfU0VUKSAhPSBuZXh0KSB7CisgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiBmbHZfcmVhZF9tZXRhYm9keSBhYm92ZSByZWFkIHBhc3QKKyAgICAgICAgICAgICAgICAgLy8gbmV4dCwgb24gYSBub24tc2Vla2FibGUgaW5wdXQsIGFuZCB0aGUgcHJlY2VkaW5nIGRhdGEgaGFzCisgICAgICAgICAgICAgICAgIC8vIGJlZW4gZmx1c2hlZCBvdXQgZnJvbSB0aGUgSU8gYnVmZmVyLgorICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNlZWsgdG8gdGhlIG5leHQgcGFja2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXQgPSBGRkVSUk9SX1JFRE87CiAgICAgICAgICAgICBnb3RvIGxlYXZlOwogICAgICAgICB9CkBAIC05NDUsMjEgKzEwMzgsMjAgQEAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICAgICAgaWYgKHN0cmVhbV90eXBlID09IEZMVl9TVFJFQU1fVFlQRV9BVURJTykgewotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCi0gICAgICAgICAgICAgICAgICAgIChzLT5hdWRpb19jb2RlY19pZCB8fCBmbHZfc2FtZV9hdWRpb19jb2RlYyhzdC0+Y29kZWMsIGZsYWdzKSkpCisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICAgICAgICAgKHMtPmF1ZGlvX2NvZGVjX2lkIHx8IGZsdl9zYW1lX2F1ZGlvX2NvZGVjKHN0LT5jb2RlY3BhciwgZmxhZ3MpKSkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbV90eXBlID09IEZMVl9TVFJFQU1fVFlQRV9WSURFTykgewotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCi0gICAgICAgICAgICAgICAgICAgIChzLT52aWRlb19jb2RlY19pZCB8fCBmbHZfc2FtZV92aWRlb19jb2RlYyhzdC0+Y29kZWMsIGZsYWdzKSkpCisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgICAgICAgICAgICAgKHMtPnZpZGVvX2NvZGVjX2lkIHx8IGZsdl9zYW1lX3ZpZGVvX2NvZGVjKHN0LT5jb2RlY3BhciwgZmxhZ3MpKSkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbV90eXBlID09IEZMVl9TVFJFQU1fVFlQRV9EQVRBKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChpID09IHMtPm5iX3N0cmVhbXMpIHsKICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBlbnVtIEFWTWVkaWFUeXBlIHN0cmVhbV90eXBlc1tdID0ge0FWTUVESUFfVFlQRV9WSURFTywgQVZNRURJQV9UWVBFX0FVRElPLCBBVk1FRElBX1RZUEVfU1VCVElUTEV9OwotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiJXMgc3RyZWFtIGRpc2NvdmVyZWQgYWZ0ZXIgaGVhZCBhbHJlYWR5IHBhcnNlZFxuIiwgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHN0cmVhbV90eXBlc1tzdHJlYW1fdHlwZV0pKTsKICAgICAgICAgICAgIHN0ID0gY3JlYXRlX3N0cmVhbShzLCBzdHJlYW1fdHlwZXNbc3RyZWFtX3R5cGVdKTsKICAgICAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTk2Nyw3ICsxMDU5LDcgQEAKICAgICAgICAgfQogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiJWQgJVggJWQgXG4iLCBzdHJlYW1fdHlwZSwgZmxhZ3MsIHN0LT5kaXNjYXJkKTsKIAotICAgICAgICBpZiAocy0+cGItPnNlZWthYmxlICYmCisgICAgICAgIGlmICgocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmCiAgICAgICAgICAgICAoKGZsYWdzICYgRkxWX1ZJREVPX0ZSQU1FVFlQRV9NQVNLKSA9PSBGTFZfRlJBTUVfS0VZIHx8CiAgICAgICAgICAgICAgIHN0cmVhbV90eXBlID09IEZMVl9TVFJFQU1fVFlQRV9BVURJTykpCiAgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIHBvcywgZHRzLCBzaXplLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKQEAgLTk4Myw3ICsxMDc1LDggQEAKIAogICAgIC8vIGlmIG5vdCBzdHJlYW1lZCBhbmQgbm8gZHVyYXRpb24gZnJvbSBtZXRhZGF0YSB0aGVuIHNlZWsgdG8gZW5kIHRvIGZpbmQKICAgICAvLyB0aGUgZHVyYXRpb24gZnJvbSB0aGUgdGltZXN0YW1wcwotICAgIGlmIChzLT5wYi0+c2Vla2FibGUgJiYgKCFzLT5kdXJhdGlvbiB8fCBzLT5kdXJhdGlvbiA9PSBBVl9OT1BUU19WQUxVRSkgJiYKKyAgICBpZiAoKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJgorICAgICAgICAoIXMtPmR1cmF0aW9uIHx8IHMtPmR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFKSAmJgogICAgICAgICAhZmx2LT5zZWFyY2hlZF9mb3JfZW5kKSB7CiAgICAgICAgIGludCBzaXplOwogICAgICAgICBjb25zdCBpbnQ2NF90IHBvcyAgID0gYXZpb190ZWxsKHMtPnBiKTsKQEAgLTEwMTksNDEgKzExMTIsNTUgQEAKICAgICAgICAgc2FtcGxlX3JhdGUgPSA0NDEwMCA8PCAoKGZsYWdzICYgRkxWX0FVRElPX1NBTVBMRVJBVEVfTUFTSykgPj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxWX0FVRElPX1NBTVBMRVJBVEVfT0ZGU0VUKSA+PiAzOwogICAgICAgICBiaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAoZmxhZ3MgJiBGTFZfQVVESU9fU0FNUExFU0laRV9NQVNLKSA/IDE2IDogODsKLSAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmNoYW5uZWxzIHx8ICFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIHx8Ci0gICAgICAgICAgICAhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gY2hhbm5lbHM7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ICAgICAgICA9IGNoYW5uZWxzID09IDEKKyAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmNoYW5uZWxzIHx8ICFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIHx8CisgICAgICAgICAgICAhc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gY2hhbm5lbHM7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ICAgICAgICA9IGNoYW5uZWxzID09IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBBVl9DSF9MQVlPVVRfTU9OTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX0NIX0xBWU9VVF9TVEVSRU87Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICAgICAgICA9IHNhbXBsZV9yYXRlOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgICAgICAgICA9IHNhbXBsZV9yYXRlOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaXRzX3Blcl9jb2RlZF9zYW1wbGU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmNvZGVjX2lkKSB7Ci0gICAgICAgICAgICBmbHZfc2V0X2F1ZGlvX2NvZGVjKHMsIHN0LCBzdC0+Y29kZWMsCisgICAgICAgIGlmICghc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkgeworICAgICAgICAgICAgZmx2X3NldF9hdWRpb19jb2RlYyhzLCBzdCwgc3QtPmNvZGVjcGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIEZMVl9BVURJT19DT0RFQ0lEX01BU0spOwogICAgICAgICAgICAgZmx2LT5sYXN0X3NhbXBsZV9yYXRlID0KLSAgICAgICAgICAgIHNhbXBsZV9yYXRlICAgICAgICAgICA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBzYW1wbGVfcmF0ZSAgICAgICAgICAgPSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgZmx2LT5sYXN0X2NoYW5uZWxzICAgID0KLSAgICAgICAgICAgIGNoYW5uZWxzICAgICAgICAgICAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgICAgICBjaGFubmVscyAgICAgICAgICAgICAgPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgY3R4ID0gezB9OwotICAgICAgICAgICAgY3R4LnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBjdHguYml0c19wZXJfY29kZWRfc2FtcGxlID0gYml0c19wZXJfY29kZWRfc2FtcGxlOwotICAgICAgICAgICAgZmx2X3NldF9hdWRpb19jb2RlYyhzLCBzdCwgJmN0eCwgZmxhZ3MgJiBGTFZfQVVESU9fQ09ERUNJRF9NQVNLKTsKLSAgICAgICAgICAgIHNhbXBsZV9yYXRlID0gY3R4LnNhbXBsZV9yYXRlOworICAgICAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IGF2Y29kZWNfcGFyYW1ldGVyc19hbGxvYygpOworICAgICAgICAgICAgaWYgKCFwYXIpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBsZWF2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICAgICAgZmx2X3NldF9hdWRpb19jb2RlYyhzLCBzdCwgcGFyLCBmbGFncyAmIEZMVl9BVURJT19DT0RFQ0lEX01BU0spOworICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSBwYXItPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2ZyZWUoJnBhcik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmVhbV90eXBlID09IEZMVl9TVFJFQU1fVFlQRV9WSURFTykgewotICAgICAgICBzaXplIC09IGZsdl9zZXRfdmlkZW9fY29kZWMocywgc3QsIGZsYWdzICYgRkxWX1ZJREVPX0NPREVDSURfTUFTSywgMSk7CisgICAgICAgIGludCByZXQgPSBmbHZfc2V0X3ZpZGVvX2NvZGVjKHMsIHN0LCBmbGFncyAmIEZMVl9WSURFT19DT0RFQ0lEX01BU0ssIDEpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHNpemUgLT0gcmV0OwogICAgIH0gZWxzZSBpZiAoc3RyZWFtX3R5cGUgPT0gRkxWX1NUUkVBTV9UWVBFX0RBVEEpIHsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RFWFQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9URVhUOwogICAgIH0KIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyB8fAotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyB8fAorICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgewogICAgICAgICBpbnQgdHlwZSA9IGF2aW9fcjgocy0+cGIpOwogICAgICAgICBzaXplLS07Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworCisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGdvdG8gbGVhdmU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKICAgICAgICAgICAgIC8vIHNpZ24gZXh0ZW5zaW9uCiAgICAgICAgICAgICBpbnQzMl90IGN0cyA9IChhdmlvX3JiMjQocy0+cGIpICsgMHhmZjgwMDAwMCkgXiAweGZmODAwMDAwOwogICAgICAgICAgICAgcHRzID0gZHRzICsgY3RzOwpAQCAtMTA2OCwxMSArMTE3NSwxMSBAQAogICAgICAgICAgICAgICAgIGR0cyA9IHB0cyA9IEFWX05PUFRTX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmICh0eXBlID09IDAgJiYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSB8fCBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyB8fAotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSkgeworICAgICAgICBpZiAodHlwZSA9PSAwICYmICghc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgfHwgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgfHwKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkpIHsKICAgICAgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0OwogCi0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgewogICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmx2X3F1ZXVlX2V4dHJhZGF0YShmbHYsIHMtPnBiLCBzdHJlYW1fdHlwZSwgc2l6ZSkpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICByZXQgPSBGRkVSUk9SX1JFRE87CkBAIC0xMDgzLDIyICsxMTkwLDIyIEBACiAKICAgICAgICAgICAgIC8qIFdvcmthcm91bmQgZm9yIGJ1Z2d5IE9tbmlhIEEvWEUgZW5jb2RlciAqLwogICAgICAgICAgICAgdCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiRW5jb2RlciIsIE5VTEwsIDApOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmIHQgJiYgIXN0cmNtcCh0LT52YWx1ZSwgIk9tbmlhIEEvWEUiKSkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMjsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJiB0ICYmICFzdHJjbXAodC0+dmFsdWUsICJPbW5pYSBBL1hFIikpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDI7CiAKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJiAwKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYgMCkgewogICAgICAgICAgICAgICAgIE1QRUc0QXVkaW9Db25maWcgY2ZnOwogCi0gICAgICAgICAgICAgICAgaWYgKGF2cHJpdl9tcGVnNGF1ZGlvX2dldF9jb25maWcoJmNmZywgc3QtPmNvZGVjLT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICogOCwgMSkgPj0gMCkgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSBjZmcuY2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKGF2cHJpdl9tcGVnNGF1ZGlvX2dldF9jb25maWcoJmNmZywgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSAqIDgsIDEpID49IDApIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gY2ZnLmNoYW5uZWxzOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSAwOwogICAgICAgICAgICAgICAgIGlmIChjZmcuZXh0X3NhbXBsZV9yYXRlKQotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gY2ZnLmV4dF9zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGNmZy5leHRfc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gY2ZnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gY2ZnLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJtcDRhIGNvbmZpZyBjaGFubmVscyAlZCBzYW1wbGUgcmF0ZSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscywgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC0xMTE5LDYgKzEyMjYsNyBAQAogICAgIHBrdC0+ZHRzICAgICAgICAgID0gZHRzOwogICAgIHBrdC0+cHRzICAgICAgICAgID0gcHRzID09IEFWX05PUFRTX1ZBTFVFID8gZHRzIDogcHRzOwogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgIHBrdC0+cG9zICAgICAgICAgID0gcG9zOwogICAgIGlmIChmbHYtPm5ld19leHRyYWRhdGFbc3RyZWFtX3R5cGVdKSB7CiAgICAgICAgIHVpbnQ4X3QgKnNpZGUgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHYtPm5ld19leHRyYWRhdGFfc2l6ZVtzdHJlYW1fdHlwZV0pOwpAQCAtMTE0NCwxMCArMTI1MiwxMSBAQAogCiBsZWF2ZToKICAgICBsYXN0ID0gYXZpb19yYjMyKHMtPnBiKTsKLSAgICBpZiAobGFzdCAhPSBvcmlnX3NpemUgKyAxMSAmJgorICAgIGlmIChsYXN0ICE9IG9yaWdfc2l6ZSArIDExICYmIGxhc3QgIT0gb3JpZ19zaXplICsgMTAgJiYKKyAgICAgICAgIWF2aW9fZmVvZihzLT5wYikgJiYKICAgICAgICAgKGxhc3QgIT0gb3JpZ19zaXplIHx8ICFsYXN0KSAmJiBsYXN0ICE9IGZsdi0+c3VtX2Zsdl90YWdfc2l6ZSAmJgogICAgICAgICAhZmx2LT5icm9rZW5fc2l6ZXMpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBtaXNtYXRjaCAlZCAlZFxuIiwgbGFzdCwgb3JpZ19zaXplICsgMTEpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUGFja2V0IG1pc21hdGNoICVkICVkICVkXG4iLCBsYXN0LCBvcmlnX3NpemUgKyAxMSwgZmx2LT5zdW1fZmx2X3RhZ19zaXplKTsKICAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBwb3MgKyAxLCBTRUVLX1NFVCk7CiAgICAgICAgIHJldCA9IHJlc3luYyhzKTsKICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CkBAIC0xMTcwLDYgKzEyNzksNyBAQAogI2RlZmluZSBWRCBBVl9PUFRfRkxBR19WSURFT19QQVJBTSB8IEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewogICAgIHsgImZsdl9tZXRhZGF0YSIsICJBbGxvY2F0ZSBzdHJlYW1zIGFjY29yZGluZyB0byB0aGUgb25NZXRhRGF0YSBhcnJheSIsIE9GRlNFVCh0cnVzdF9tZXRhZGF0YSksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgVkQgfSwKKyAgICB7ICJtaXNzaW5nX3N0cmVhbXMiLCAiIiwgT0ZGU0VUKG1pc3Npbmdfc3RyZWFtcyksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gMCB9LCAwLCAweEZGLCBWRCB8IEFWX09QVF9GTEFHX0VYUE9SVCB8IEFWX09QVF9GTEFHX1JFQURPTkxZIH0sCiAgICAgeyBOVUxMIH0KIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ZsdmVuYy5jIGIvbGliYXZmb3JtYXQvZmx2ZW5jLmMKaW5kZXggOGZkNWQyOS4uMWY1MDM2NyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZmx2ZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvZmx2ZW5jLmMKQEAgLTIzLDYgKzIzLDkgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRmbG9hdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJhdmlvLmgiCiAjaW5jbHVkZSAiYXZjLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJmbHYuaCIKQEAgLTYwLDYgKzYzLDIwIEBACiAgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAgICAgICAwIH0KIH07CiAKK3R5cGVkZWYgZW51bSB7CisgICAgRkxWX0FBQ19TRVFfSEVBREVSX0RFVEVDVCA9ICgxIDw8IDApLAorICAgIEZMVl9OT19TRVFVRU5DRV9FTkQgPSAoMSA8PCAxKSwKKyAgICBGTFZfQUREX0tFWUZSQU1FX0lOREVYID0gKDEgPDwgMiksCisgICAgRkxWX05PX01FVEFEQVRBID0gKDEgPDwgMyksCisgICAgRkxWX05PX0RVUkFUSU9OX0ZJTEVTSVpFID0gKDEgPDwgNCksCit9IEZMVkZsYWdzOworCit0eXBlZGVmIHN0cnVjdCBGTFZGaWxlcG9zaXRpb24geworICAgIGludDY0X3Qga2V5ZnJhbWVfcG9zaXRpb247CisgICAgZG91YmxlIGtleWZyYW1lX3RpbWVzdGFtcDsKKyAgICBzdHJ1Y3QgRkxWRmlsZXBvc2l0aW9uICpuZXh0OworfSBGTFZGaWxlcG9zaXRpb247CisKIHR5cGVkZWYgc3RydWN0IEZMVkNvbnRleHQgewogICAgIEFWQ2xhc3MgKmF2X2NsYXNzOwogICAgIGludCAgICAgcmVzZXJ2ZWQ7CkBAIC02OCwxMCArODUsMzcgQEAKICAgICBpbnQ2NF90IGR1cmF0aW9uOwogICAgIGludDY0X3QgZGVsYXk7ICAgICAgLy8vPCBmaXJzdCBkdHMgZGVsYXkgKG5lZWRlZCBmb3IgQVZDICYgU3BlZXgpCiAKLSAgICBBVkNvZGVjQ29udGV4dCAqYXVkaW9fZW5jOwotICAgIEFWQ29kZWNDb250ZXh0ICp2aWRlb19lbmM7CisgICAgaW50NjRfdCBkYXRhc3RhcnRfb2Zmc2V0OworICAgIGludDY0X3QgZGF0YXNpemVfb2Zmc2V0OworICAgIGludDY0X3QgZGF0YXNpemU7CisgICAgaW50NjRfdCB2aWRlb3NpemVfb2Zmc2V0OworICAgIGludDY0X3QgdmlkZW9zaXplOworICAgIGludDY0X3QgYXVkaW9zaXplX29mZnNldDsKKyAgICBpbnQ2NF90IGF1ZGlvc2l6ZTsKKworICAgIGludDY0X3QgbWV0YWRhdGFfc2l6ZV9wb3M7CisgICAgaW50NjRfdCBtZXRhZGF0YV90b3RhbHNpemVfcG9zOworICAgIGludDY0X3QgbWV0YWRhdGFfdG90YWxzaXplOworICAgIGludDY0X3Qga2V5ZnJhbWVfaW5kZXhfc2l6ZTsKKworICAgIGludDY0X3QgbGFzdHRpbWVzdGFtcF9vZmZzZXQ7CisgICAgZG91YmxlIGxhc3R0aW1lc3RhbXA7CisgICAgaW50NjRfdCBsYXN0a2V5ZnJhbWV0aW1lc3RhbXBfb2Zmc2V0OworICAgIGRvdWJsZSBsYXN0a2V5ZnJhbWV0aW1lc3RhbXA7CisgICAgaW50NjRfdCBsYXN0a2V5ZnJhbWVsb2NhdGlvbl9vZmZzZXQ7CisgICAgaW50NjRfdCBsYXN0a2V5ZnJhbWVsb2NhdGlvbjsKKworICAgIGludCBhY3VyZnJhbWVpbmRleDsKKyAgICBpbnQ2NF90IGtleWZyYW1lc19pbmZvX29mZnNldDsKKworICAgIGludDY0X3QgZmlsZXBvc2l0aW9uc19jb3VudDsKKyAgICBGTFZGaWxlcG9zaXRpb24gKmZpbGVwb3NpdGlvbnM7CisgICAgRkxWRmlsZXBvc2l0aW9uICpoZWFkX2ZpbGVwb3NpdGlvbnM7CisKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqYXVkaW9fcGFyOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICp2aWRlb19wYXI7CiAgICAgZG91YmxlIGZyYW1lcmF0ZTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZGF0YV9lbmM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmRhdGFfcGFyOwogCiAgICAgaW50IGZsYWdzOwogfSBGTFZDb250ZXh0OwpAQCAtODAsMjcgKzEyNCwzNSBAQAogICAgIGludDY0X3QgbGFzdF90czsgICAgLy8vPCBsYXN0IHRpbWVzdGFtcCBmb3IgZWFjaCBzdHJlYW0KIH0gRkxWU3RyZWFtQ29udGV4dDsKIAotc3RhdGljIGludCBnZXRfYXVkaW9fZmxhZ3MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqZW5jKQorc3RhdGljIGludCBnZXRfYXVkaW9fZmxhZ3MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyKQogewotICAgIGludCBmbGFncyA9IChlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikgPyBGTFZfU0FNUExFU1NJWkVfMTZCSVQKKyAgICBpbnQgZmxhZ3MgPSAocGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpID8gRkxWX1NBTVBMRVNTSVpFXzE2QklUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZMVl9TQU1QTEVTU0laRV84QklUOwogCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSAvLyBzcGVjcyBmb3JjZSB0aGVzZSBwYXJhbWV0ZXJzCisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSAvLyBzcGVjcyBmb3JjZSB0aGVzZSBwYXJhbWV0ZXJzCiAgICAgICAgIHJldHVybiBGTFZfQ09ERUNJRF9BQUMgfCBGTFZfU0FNUExFUkFURV80NDEwMEhaIHwKICAgICAgICAgICAgICAgIEZMVl9TQU1QTEVTU0laRV8xNkJJVCB8IEZMVl9TVEVSRU87Ci0gICAgZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TUEVFWCkgewotICAgICAgICBpZiAoZW5jLT5zYW1wbGVfcmF0ZSAhPSAxNjAwMCkgeworICAgIGVsc2UgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVgpIHsKKyAgICAgICAgaWYgKHBhci0+c2FtcGxlX3JhdGUgIT0gMTYwMDApIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIkZMViBvbmx5IHN1cHBvcnRzIHdpZGViYW5kICgxNmtIeikgU3BlZXggYXVkaW9cbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQotICAgICAgICBpZiAoZW5jLT5jaGFubmVscyAhPSAxKSB7CisgICAgICAgIGlmIChwYXItPmNoYW5uZWxzICE9IDEpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGTFYgb25seSBzdXBwb3J0cyBtb25vIFNwZWV4IGF1ZGlvXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEZMVl9DT0RFQ0lEX1NQRUVYIHwgRkxWX1NBTVBMRVJBVEVfMTEwMjVIWiB8IEZMVl9TQU1QTEVTU0laRV8xNkJJVDsKICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKGVuYy0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgc3dpdGNoIChwYXItPnNhbXBsZV9yYXRlKSB7CisgICAgICAgIGNhc2UgNDgwMDA6CisgICAgICAgICAgICAvLyA0OGtoeiBtcDMgaXMgc3RvcmVkIHdpdGggNDRrMSBzYW1wbGVyYXRlIGlkZW50aWZlcgorICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxWX1NBTVBMRVJBVEVfNDQxMDBIWjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSA0NDEwMDoKICAgICAgICAgICAgIGZsYWdzIHw9IEZMVl9TQU1QTEVSQVRFXzQ0MTAwSFo7CiAgICAgICAgICAgICBicmVhazsKQEAgLTExMywyMiArMTY1LDIzIEBACiAgICAgICAgIGNhc2UgMTYwMDA6IC8vIG5lbGx5bW9zZXIgb25seQogICAgICAgICBjYXNlICA4MDAwOiAvLyBuZWxseW1vc2VyIG9ubHkKICAgICAgICAgY2FzZSAgNTUxMjogLy8gbm90IE1QMwotICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVAzKSB7CisgICAgICAgICAgICBpZiAocGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUDMpIHsKICAgICAgICAgICAgICAgICBmbGFncyB8PSBGTFZfU0FNUExFUkFURV9TUEVDSUFMOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgorZXJyb3I6CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJGTFYgZG9lcyBub3Qgc3VwcG9ydCBzYW1wbGUgcmF0ZSAlZCwgIgotICAgICAgICAgICAgICAgICAgICJjaG9vc2UgZnJvbSAoNDQxMDAsIDIyMDUwLCAxMTAyNSlcbiIsIGVuYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgICAgICJjaG9vc2UgZnJvbSAoNDQxMDAsIDIyMDUwLCAxMTAyNSlcbiIsIHBhci0+c2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChlbmMtPmNoYW5uZWxzID4gMSkKKyAgICBpZiAocGFyLT5jaGFubmVscyA+IDEpCiAgICAgICAgIGZsYWdzIHw9IEZMVl9TVEVSRU87CiAKLSAgICBzd2l0Y2ggKGVuYy0+Y29kZWNfaWQpIHsKKyAgICBzd2l0Y2ggKHBhci0+Y29kZWNfaWQpIHsKICAgICBjYXNlIEFWX0NPREVDX0lEX01QMzoKICAgICAgICAgZmxhZ3MgfD0gRkxWX0NPREVDSURfTVAzICAgIHwgRkxWX1NBTVBMRVNTSVpFXzE2QklUOwogICAgICAgICBicmVhazsKQEAgLTE0NSw5ICsxOTgsOSBAQAogICAgICAgICBmbGFncyB8PSBGTFZfQ09ERUNJRF9BRFBDTSAgfCBGTFZfU0FNUExFU1NJWkVfMTZCSVQ7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfTkVMTFlNT1NFUjoKLSAgICAgICAgaWYgKGVuYy0+c2FtcGxlX3JhdGUgPT0gODAwMCkKKyAgICAgICAgaWYgKHBhci0+c2FtcGxlX3JhdGUgPT0gODAwMCkKICAgICAgICAgICAgIGZsYWdzIHw9IEZMVl9DT0RFQ0lEX05FTExZTU9TRVJfOEtIWl9NT05PICB8IEZMVl9TQU1QTEVTU0laRV8xNkJJVDsKLSAgICAgICAgZWxzZSBpZiAoZW5jLT5zYW1wbGVfcmF0ZSA9PSAxNjAwMCkKKyAgICAgICAgZWxzZSBpZiAocGFyLT5zYW1wbGVfcmF0ZSA9PSAxNjAwMCkKICAgICAgICAgICAgIGZsYWdzIHw9IEZMVl9DT0RFQ0lEX05FTExZTU9TRVJfMTZLSFpfTU9OTyB8IEZMVl9TQU1QTEVTU0laRV8xNkJJVDsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgZmxhZ3MgfD0gRkxWX0NPREVDSURfTkVMTFlNT1NFUiAgICAgICAgICAgIHwgRkxWX1NBTVBMRVNTSVpFXzE2QklUOwpAQCAtMTU5LDExICsyMTIsMTEgQEAKICAgICAgICAgZmxhZ3MgPSBGTFZfQ09ERUNJRF9QQ01fQUxBVyAgfCBGTFZfU0FNUExFUkFURV9TUEVDSUFMIHwgRkxWX1NBTVBMRVNTSVpFXzE2QklUOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDA6Ci0gICAgICAgIGZsYWdzIHw9IGVuYy0+Y29kZWNfdGFnIDw8IDQ7CisgICAgICAgIGZsYWdzIHw9IHBhci0+Y29kZWNfdGFnIDw8IDQ7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBdWRpbyBjb2RlYyAnJXMnIG5vdCBjb21wYXRpYmxlIHdpdGggRkxWXG4iLAotICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShlbmMtPmNvZGVjX2lkKSk7CisgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHBhci0+Y29kZWNfaWQpKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKQEAgLTE5Niw2ICsyNDksMTcgQEAKICAgICBhdmlvX3diNjQocGIsIGF2X2RvdWJsZTJpbnQoZCkpOwogfQogCitzdGF0aWMgdm9pZCBwdXRfYW1mX2J5dGUoQVZJT0NvbnRleHQgKnBiLCB1bnNpZ25lZCBjaGFyIGFieXRlKQoreworICAgIGF2aW9fdzgocGIsIGFieXRlKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2FtZl9kd29yZF9hcnJheShBVklPQ29udGV4dCAqcGIsIHVpbnQzMl90IGR3KQoreworICAgIGF2aW9fdzgocGIsIEFNRl9EQVRBX1RZUEVfQVJSQVkpOworICAgIGF2aW9fd2IzMihwYiwgZHcpOworfQorCiBzdGF0aWMgdm9pZCBwdXRfYW1mX2Jvb2woQVZJT0NvbnRleHQgKnBiLCBpbnQgYikKIHsKICAgICBhdmlvX3c4KHBiLCBBTUZfREFUQV9UWVBFX0JPT0wpOwpAQCAtMjA2LDEzICsyNzAsMTQgQEAKIHsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBGTFZDb250ZXh0ICpmbHYgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHdyaXRlX2R1cmF0aW9uX2ZpbGVzaXplID0gIShmbHYtPmZsYWdzICYgRkxWX05PX0RVUkFUSU9OX0ZJTEVTSVpFKTsKICAgICBpbnQgbWV0YWRhdGFfY291bnQgPSAwOwotICAgIGludDY0X3QgbWV0YWRhdGFfc2l6ZV9wb3MsIGRhdGFfc2l6ZSwgbWV0YWRhdGFfY291bnRfcG9zOworICAgIGludDY0X3QgbWV0YWRhdGFfY291bnRfcG9zOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWcgPSBOVUxMOwogCiAgICAgLyogd3JpdGUgbWV0YV90YWcgKi8KLSAgICBhdmlvX3c4KHBiLCAxOCk7ICAgICAgICAgICAgLy8gdGFnIHR5cGUgTUVUQQotICAgIG1ldGFkYXRhX3NpemVfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3c4KHBiLCBGTFZfVEFHX1RZUEVfTUVUQSk7ICAgICAgICAgICAgLy8gdGFnIHR5cGUgTUVUQQorICAgIGZsdi0+bWV0YWRhdGFfc2l6ZV9wb3MgPSBhdmlvX3RlbGwocGIpOwogICAgIGF2aW9fd2IyNChwYiwgMCk7ICAgICAgICAgICAvLyBzaXplIG9mIGRhdGEgcGFydCAoc3VtIG9mIGFsbCBwYXJ0cyBiZWxvdykKICAgICBhdmlvX3diMjQocGIsIHRzKTsgICAgICAgICAgLy8gdGltZXN0YW1wCiAgICAgYXZpb193YjMyKHBiLCAwKTsgICAgICAgICAgIC8vIHJlc2VydmVkCkBAIC0yMjYsMjggKzI5MSwzMCBAQAogICAgIC8qIG1peGVkIGFycmF5IChoYXNoKSB3aXRoIHNpemUgYW5kIHN0cmluZy90eXBlL2RhdGEgdHVwbGVzICovCiAgICAgYXZpb193OChwYiwgQU1GX0RBVEFfVFlQRV9NSVhFREFSUkFZKTsKICAgICBtZXRhZGF0YV9jb3VudF9wb3MgPSBhdmlvX3RlbGwocGIpOwotICAgIG1ldGFkYXRhX2NvdW50ID0gNCAqICEhZmx2LT52aWRlb19lbmMgKwotICAgICAgICAgICAgICAgICAgICAgNSAqICEhZmx2LT5hdWRpb19lbmMgKwotICAgICAgICAgICAgICAgICAgICAgMSAqICEhZmx2LT5kYXRhX2VuYyAgKwotICAgICAgICAgICAgICAgICAgICAgMjsgLy8gKzIgZm9yIGR1cmF0aW9uIGFuZCBmaWxlIHNpemUKLQorICAgIG1ldGFkYXRhX2NvdW50ID0gNCAqICEhZmx2LT52aWRlb19wYXIgKworICAgICAgICAgICAgICAgICAgICAgNSAqICEhZmx2LT5hdWRpb19wYXIgKworICAgICAgICAgICAgICAgICAgICAgMSAqICEhZmx2LT5kYXRhX3BhcjsKKyAgICBpZiAod3JpdGVfZHVyYXRpb25fZmlsZXNpemUpIHsKKyAgICAgICAgbWV0YWRhdGFfY291bnQgKz0gMjsgLy8gKzIgZm9yIGR1cmF0aW9uIGFuZCBmaWxlIHNpemUKKyAgICB9CiAgICAgYXZpb193YjMyKHBiLCBtZXRhZGF0YV9jb3VudCk7CiAKLSAgICBwdXRfYW1mX3N0cmluZyhwYiwgImR1cmF0aW9uIik7Ci0gICAgZmx2LT5kdXJhdGlvbl9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgIGlmICh3cml0ZV9kdXJhdGlvbl9maWxlc2l6ZSkgeworICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgImR1cmF0aW9uIik7CisgICAgICAgIGZsdi0+ZHVyYXRpb25fb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgLy8gZmlsbCBpbiB0aGUgZ3Vlc3NlZCBkdXJhdGlvbiwgaXQnbGwgYmUgY29ycmVjdGVkIGxhdGVyIGlmIGluY29ycmVjdAorICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgcy0+ZHVyYXRpb24gLyBBVl9USU1FX0JBU0UpOworICAgIH0KIAotICAgIC8vIGZpbGwgaW4gdGhlIGd1ZXNzZWQgZHVyYXRpb24sIGl0J2xsIGJlIGNvcnJlY3RlZCBsYXRlciBpZiBpbmNvcnJlY3QKLSAgICBwdXRfYW1mX2RvdWJsZShwYiwgcy0+ZHVyYXRpb24gLyBBVl9USU1FX0JBU0UpOwotCi0gICAgaWYgKGZsdi0+dmlkZW9fZW5jKSB7CisgICAgaWYgKGZsdi0+dmlkZW9fcGFyKSB7CiAgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAid2lkdGgiKTsKLSAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+dmlkZW9fZW5jLT53aWR0aCk7CisgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPnZpZGVvX3Bhci0+d2lkdGgpOwogCiAgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiaGVpZ2h0Iik7Ci0gICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPnZpZGVvX2VuYy0+aGVpZ2h0KTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+dmlkZW9fcGFyLT5oZWlnaHQpOwogCiAgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAidmlkZW9kYXRhcmF0ZSIpOwotICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT52aWRlb19lbmMtPmJpdF9yYXRlIC8gMTAyNC4wKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+dmlkZW9fcGFyLT5iaXRfcmF0ZSAvIDEwMjQuMCk7CiAKICAgICAgICAgaWYgKGZsdi0+ZnJhbWVyYXRlICE9IDAuMCkgewogICAgICAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJmcmFtZXJhdGUiKTsKQEAgLTI1NiwzMSArMzIzLDMyIEBACiAgICAgICAgIH0KIAogICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgInZpZGVvY29kZWNpZCIpOwotICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT52aWRlb19lbmMtPmNvZGVjX3RhZyk7CisgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPnZpZGVvX3Bhci0+Y29kZWNfdGFnKTsKICAgICB9CiAKLSAgICBpZiAoZmx2LT5hdWRpb19lbmMpIHsKKyAgICBpZiAoZmx2LT5hdWRpb19wYXIpIHsKICAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJhdWRpb2RhdGFyYXRlIik7Ci0gICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPmF1ZGlvX2VuYy0+Yml0X3JhdGUgLyAxMDI0LjApOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT5hdWRpb19wYXItPmJpdF9yYXRlIC8gMTAyNC4wKTsKIAogICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgImF1ZGlvc2FtcGxlcmF0ZSIpOwotICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT5hdWRpb19lbmMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+YXVkaW9fcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJhdWRpb3NhbXBsZXNpemUiKTsKLSAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+YXVkaW9fZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fVTggPyA4IDogMTYpOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT5hdWRpb19wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9VOCA/IDggOiAxNik7CiAKICAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJzdGVyZW8iKTsKLSAgICAgICAgcHV0X2FtZl9ib29sKHBiLCBmbHYtPmF1ZGlvX2VuYy0+Y2hhbm5lbHMgPT0gMik7CisgICAgICAgIHB1dF9hbWZfYm9vbChwYiwgZmx2LT5hdWRpb19wYXItPmNoYW5uZWxzID09IDIpOwogCiAgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiYXVkaW9jb2RlY2lkIik7Ci0gICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPmF1ZGlvX2VuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+YXVkaW9fcGFyLT5jb2RlY190YWcpOwogICAgIH0KIAotICAgIGlmIChmbHYtPmRhdGFfZW5jKSB7CisgICAgaWYgKGZsdi0+ZGF0YV9wYXIpIHsKICAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJkYXRhc3RyZWFtIik7CiAgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCAwLjApOwogICAgIH0KIAorICAgIGZmX3N0YW5kYXJkaXplX2NyZWF0aW9uX3RpbWUocyk7CiAgICAgd2hpbGUgKCh0YWcgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIHRhZywgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKICAgICAgICAgaWYoICAgIXN0cmNtcCh0YWctPmtleSwgIndpZHRoIikKICAgICAgICAgICAgIHx8IXN0cmNtcCh0YWctPmtleSwgImhlaWdodCIpCkBAIC0zMTIsMjMgKzM4MCw5MyBAQAogICAgICAgICBtZXRhZGF0YV9jb3VudCsrOwogICAgIH0KIAotICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiZmlsZXNpemUiKTsKLSAgICBmbHYtPmZpbGVzaXplX29mZnNldCA9IGF2aW9fdGVsbChwYik7Ci0gICAgcHV0X2FtZl9kb3VibGUocGIsIDApOyAvLyBkZWxheWVkIHdyaXRlCisgICAgaWYgKHdyaXRlX2R1cmF0aW9uX2ZpbGVzaXplKSB7CisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiZmlsZXNpemUiKTsKKyAgICAgICAgZmx2LT5maWxlc2l6ZV9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgMCk7IC8vIGRlbGF5ZWQgd3JpdGUKKyAgICB9CisKKyAgICBpZiAoZmx2LT5mbGFncyAmIEZMVl9BRERfS0VZRlJBTUVfSU5ERVgpIHsKKyAgICAgICAgZmx2LT5hY3VyZnJhbWVpbmRleCA9IDA7CisgICAgICAgIGZsdi0+a2V5ZnJhbWVfaW5kZXhfc2l6ZSA9IDA7CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJoYXNWaWRlbyIpOworICAgICAgICBwdXRfYW1mX2Jvb2wocGIsICEhZmx2LT52aWRlb19wYXIpOworICAgICAgICBtZXRhZGF0YV9jb3VudCsrOworCisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiaGFzS2V5ZnJhbWVzIik7CisgICAgICAgIHB1dF9hbWZfYm9vbChwYiwgMSk7CisgICAgICAgIG1ldGFkYXRhX2NvdW50Kys7CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJoYXNBdWRpbyIpOworICAgICAgICBwdXRfYW1mX2Jvb2wocGIsICEhZmx2LT5hdWRpb19wYXIpOworICAgICAgICBtZXRhZGF0YV9jb3VudCsrOworCisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiaGFzTWV0YWRhdGEiKTsKKyAgICAgICAgcHV0X2FtZl9ib29sKHBiLCAxKTsKKyAgICAgICAgbWV0YWRhdGFfY291bnQrKzsKKworICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgImNhblNlZWtUb0VuZCIpOworICAgICAgICBwdXRfYW1mX2Jvb2wocGIsIDEpOworICAgICAgICBtZXRhZGF0YV9jb3VudCsrOworCisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiZGF0YXNpemUiKTsKKyAgICAgICAgZmx2LT5kYXRhc2l6ZV9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBmbHYtPmRhdGFzaXplID0gMDsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+ZGF0YXNpemUpOworICAgICAgICBtZXRhZGF0YV9jb3VudCsrOworCisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAidmlkZW9zaXplIik7CisgICAgICAgIGZsdi0+dmlkZW9zaXplX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGZsdi0+dmlkZW9zaXplID0gMDsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+dmlkZW9zaXplKTsKKyAgICAgICAgbWV0YWRhdGFfY291bnQrKzsKKworICAgICAgICBwdXRfYW1mX3N0cmluZyhwYiwgImF1ZGlvc2l6ZSIpOworICAgICAgICBmbHYtPmF1ZGlvc2l6ZV9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBmbHYtPmF1ZGlvc2l6ZSA9IDA7CisgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmbHYtPmF1ZGlvc2l6ZSk7CisgICAgICAgIG1ldGFkYXRhX2NvdW50Kys7CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJsYXN0dGltZXN0YW1wIik7CisgICAgICAgIGZsdi0+bGFzdHRpbWVzdGFtcF9vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBmbHYtPmxhc3R0aW1lc3RhbXAgPSAwOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgMCk7CisgICAgICAgIG1ldGFkYXRhX2NvdW50Kys7CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJsYXN0a2V5ZnJhbWV0aW1lc3RhbXAiKTsKKyAgICAgICAgZmx2LT5sYXN0a2V5ZnJhbWV0aW1lc3RhbXBfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgZmx2LT5sYXN0a2V5ZnJhbWV0aW1lc3RhbXAgPSAwOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgMCk7CisgICAgICAgIG1ldGFkYXRhX2NvdW50Kys7CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJsYXN0a2V5ZnJhbWVsb2NhdGlvbiIpOworICAgICAgICBmbHYtPmxhc3RrZXlmcmFtZWxvY2F0aW9uX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGZsdi0+bGFzdGtleWZyYW1lbG9jYXRpb24gPSAwOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgMCk7CisgICAgICAgIG1ldGFkYXRhX2NvdW50Kys7CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJrZXlmcmFtZXMiKTsKKyAgICAgICAgcHV0X2FtZl9ieXRlKHBiLCBBTUZfREFUQV9UWVBFX09CSkVDVCk7CisgICAgICAgIG1ldGFkYXRhX2NvdW50Kys7CisKKyAgICAgICAgZmx2LT5rZXlmcmFtZXNfaW5mb19vZmZzZXQgPSBhdmlvX3RlbGwocGIpOworICAgIH0KIAogICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiIik7CiAgICAgYXZpb193OChwYiwgQU1GX0VORF9PRl9PQkpFQ1QpOwogCiAgICAgLyogd3JpdGUgdG90YWwgc2l6ZSBvZiB0YWcgKi8KLSAgICBkYXRhX3NpemUgPSBhdmlvX3RlbGwocGIpIC0gbWV0YWRhdGFfc2l6ZV9wb3MgLSAxMDsKKyAgICBmbHYtPm1ldGFkYXRhX3RvdGFsc2l6ZSA9IGF2aW9fdGVsbChwYikgLSBmbHYtPm1ldGFkYXRhX3NpemVfcG9zIC0gMTA7CiAKICAgICBhdmlvX3NlZWsocGIsIG1ldGFkYXRhX2NvdW50X3BvcywgU0VFS19TRVQpOwogICAgIGF2aW9fd2IzMihwYiwgbWV0YWRhdGFfY291bnQpOwogCi0gICAgYXZpb19zZWVrKHBiLCBtZXRhZGF0YV9zaXplX3BvcywgU0VFS19TRVQpOwotICAgIGF2aW9fd2IyNChwYiwgZGF0YV9zaXplKTsKLSAgICBhdmlvX3NraXAocGIsIGRhdGFfc2l6ZSArIDEwIC0gMyk7Ci0gICAgYXZpb193YjMyKHBiLCBkYXRhX3NpemUgKyAxMSk7CisgICAgYXZpb19zZWVrKHBiLCBmbHYtPm1ldGFkYXRhX3NpemVfcG9zLCBTRUVLX1NFVCk7CisgICAgYXZpb193YjI0KHBiLCBmbHYtPm1ldGFkYXRhX3RvdGFsc2l6ZSk7CisgICAgYXZpb19za2lwKHBiLCBmbHYtPm1ldGFkYXRhX3RvdGFsc2l6ZSArIDEwIC0gMyk7CisgICAgZmx2LT5tZXRhZGF0YV90b3RhbHNpemVfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIGZsdi0+bWV0YWRhdGFfdG90YWxzaXplICsgMTEpOwogfQogCiBzdGF0aWMgaW50IHVuc3VwcG9ydGVkX2NvZGVjKEFWRm9ybWF0Q29udGV4dCAqcywKQEAgLTM0Miw3NiArNDgwLDI0NSBAQAogICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiB9CiAKK3N0YXRpYyB2b2lkIGZsdl93cml0ZV9jb2RlY19oZWFkZXIoQVZGb3JtYXRDb250ZXh0KiBzLCBBVkNvZGVjUGFyYW1ldGVycyogcGFyKSB7CisgICAgaW50NjRfdCBkYXRhX3NpemU7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgRkxWQ29udGV4dCAqZmx2ID0gcy0+cHJpdl9kYXRhOworCisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDIHx8IHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NAorICAgICAgICAgICAgfHwgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgICAgICBpbnQ2NF90IHBvczsKKyAgICAgICAgYXZpb193OChwYiwKKyAgICAgICAgICAgICAgICBwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEZMVl9UQUdfVFlQRV9WSURFTyA6IEZMVl9UQUdfVFlQRV9BVURJTyk7CisgICAgICAgIGF2aW9fd2IyNChwYiwgMCk7IC8vIHNpemUgcGF0Y2hlZCBsYXRlcgorICAgICAgICBhdmlvX3diMjQocGIsIDApOyAvLyB0cworICAgICAgICBhdmlvX3c4KHBiLCAwKTsgICAvLyB0cyBleHQKKyAgICAgICAgYXZpb193YjI0KHBiLCAwKTsgLy8gc3RyZWFtaWQKKyAgICAgICAgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCBnZXRfYXVkaW9fZmxhZ3MocywgcGFyKSk7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCAwKTsgLy8gQUFDIHNlcXVlbmNlIGhlYWRlcgorCisgICAgICAgICAgICBpZiAoIXBhci0+ZXh0cmFkYXRhX3NpemUgJiYgKGZsdi0+ZmxhZ3MgJiBGTFZfQUFDX1NFUV9IRUFERVJfREVURUNUKSkgeworICAgICAgICAgICAgICAgIFB1dEJpdENvbnRleHQgcGJjOworICAgICAgICAgICAgICAgIGludCBzYW1wbGVyYXRlX2luZGV4OworICAgICAgICAgICAgICAgIGludCBjaGFubmVscyA9IGZsdi0+YXVkaW9fcGFyLT5jaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgLSAoZmx2LT5hdWRpb19wYXItPmNoYW5uZWxzID09IDggPyAxIDogMCk7CisgICAgICAgICAgICAgICAgdWludDhfdCBkYXRhWzJdOworCisgICAgICAgICAgICAgICAgZm9yIChzYW1wbGVyYXRlX2luZGV4ID0gMDsgc2FtcGxlcmF0ZV9pbmRleCA8IDE2OworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcmF0ZV9pbmRleCsrKQorICAgICAgICAgICAgICAgICAgICBpZiAoZmx2LT5hdWRpb19wYXItPnNhbXBsZV9yYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbc2FtcGxlcmF0ZV9pbmRleF0pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGluaXRfcHV0X2JpdHMoJnBiYywgZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGJjLCA1LCBmbHYtPmF1ZGlvX3Bhci0+cHJvZmlsZSArIDEpOyAvL3Byb2ZpbGUKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGJjLCA0LCBzYW1wbGVyYXRlX2luZGV4KTsgLy9zYW1wbGUgcmF0ZSBpbmRleAorICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYmMsIDQsIGNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGJjLCAxLCAwKTsgLy9mcmFtZSBsZW5ndGggLSAxMDI0IHNhbXBsZXMKKyAgICAgICAgICAgICAgICBwdXRfYml0cygmcGJjLCAxLCAwKTsgLy9kb2VzIG5vdCBkZXBlbmQgb24gY29yZSBjb2RlcgorICAgICAgICAgICAgICAgIHB1dF9iaXRzKCZwYmMsIDEsIDApOyAvL2lzIG5vdCBleHRlbnNpb24KKyAgICAgICAgICAgICAgICBmbHVzaF9wdXRfYml0cygmcGJjKTsKKworICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIGRhdGFbMF0pOworICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIGRhdGFbMV0pOworCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQUFDIHNlcXVlbmNlIGhlYWRlcjogJTAyeCAlMDJ4LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMF0sIGRhdGFbMV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb193cml0ZShwYiwgcGFyLT5leHRyYWRhdGEsIHBhci0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZpb193OChwYiwgcGFyLT5jb2RlY190YWcgfCBGTFZfRlJBTUVfS0VZKTsgLy8gZmxhZ3MKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOyAvLyBBVkMgc2VxdWVuY2UgaGVhZGVyCisgICAgICAgICAgICBhdmlvX3diMjQocGIsIDApOyAvLyBjb21wb3NpdGlvbiB0aW1lCisgICAgICAgICAgICBmZl9pc29tX3dyaXRlX2F2Y2MocGIsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhX3NpemUgPSBhdmlvX3RlbGwocGIpIC0gcG9zOworICAgICAgICBhdmlvX3NlZWsocGIsIC1kYXRhX3NpemUgLSAxMCwgU0VFS19DVVIpOworICAgICAgICBhdmlvX3diMjQocGIsIGRhdGFfc2l6ZSk7CisgICAgICAgIGF2aW9fc2tpcChwYiwgZGF0YV9zaXplICsgMTAgLSAzKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBkYXRhX3NpemUgKyAxMSk7IC8vIHByZXZpb3VzIHRhZyBzaXplCisgICAgfQorfQorCitzdGF0aWMgaW50IGZsdl9hcHBlbmRfa2V5ZnJhbWVfaW5mbyhBVkZvcm1hdENvbnRleHQgKnMsIEZMVkNvbnRleHQgKmZsdiwgZG91YmxlIHRzLCBpbnQ2NF90IHBvcykKK3sKKyAgICBGTFZGaWxlcG9zaXRpb24gKnBvc2l0aW9uID0gYXZfbWFsbG9jKHNpemVvZihGTFZGaWxlcG9zaXRpb24pKTsKKworICAgIGlmICghcG9zaXRpb24pIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAibm8gbWVtIGZvciBhZGQga2V5ZnJhbWUgaW5kZXghXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBwb3NpdGlvbi0+a2V5ZnJhbWVfdGltZXN0YW1wID0gdHM7CisgICAgcG9zaXRpb24tPmtleWZyYW1lX3Bvc2l0aW9uID0gcG9zOworCisgICAgaWYgKCFmbHYtPmZpbGVwb3NpdGlvbnNfY291bnQpIHsKKyAgICAgICAgZmx2LT5maWxlcG9zaXRpb25zID0gcG9zaXRpb247CisgICAgICAgIGZsdi0+aGVhZF9maWxlcG9zaXRpb25zID0gZmx2LT5maWxlcG9zaXRpb25zOworICAgICAgICBwb3NpdGlvbi0+bmV4dCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmx2LT5maWxlcG9zaXRpb25zLT5uZXh0ID0gcG9zaXRpb247CisgICAgICAgIHBvc2l0aW9uLT5uZXh0ID0gTlVMTDsKKyAgICAgICAgZmx2LT5maWxlcG9zaXRpb25zID0gZmx2LT5maWxlcG9zaXRpb25zLT5uZXh0OworICAgIH0KKworICAgIGZsdi0+ZmlsZXBvc2l0aW9uc19jb3VudCsrOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2hpZnRfZGF0YShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IG4gPSAwOworICAgIGludDY0X3QgbWV0YWRhdGFfc2l6ZSA9IDA7CisgICAgRkxWQ29udGV4dCAqZmx2ID0gcy0+cHJpdl9kYXRhOworICAgIGludDY0X3QgcG9zLCBwb3NfZW5kID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICB1aW50OF90ICpidWYsICpyZWFkX2J1ZlsyXTsKKyAgICBpbnQgcmVhZF9idWZfaWQgPSAwOworICAgIGludCByZWFkX3NpemVbMl07CisgICAgQVZJT0NvbnRleHQgKnJlYWRfcGI7CisKKyAgICBtZXRhZGF0YV9zaXplID0gZmx2LT5maWxlcG9zaXRpb25zX2NvdW50ICogOSAqIDIgKyAxMDsgLyogZmlsZXBvc2l0aW9ucyBhbmQgdGltZXMgdmFsdWUgKi8KKyAgICBtZXRhZGF0YV9zaXplICs9IDIgKyAxMzsgLyogZmlsZXBvc2l0aW9ucyBTdHJpbmcgKi8KKyAgICBtZXRhZGF0YV9zaXplICs9IDIgKyA1OyAvKiB0aW1lcyBTdHJpbmcgKi8KKyAgICBtZXRhZGF0YV9zaXplICs9IDM7IC8qIE9iamVjdCBlbmQgKi8KKworICAgIGZsdi0+a2V5ZnJhbWVfaW5kZXhfc2l6ZSA9IG1ldGFkYXRhX3NpemU7CisKKyAgICBpZiAobWV0YWRhdGFfc2l6ZSA8IDApCisgICAgICAgIHJldHVybiBtZXRhZGF0YV9zaXplOworCisgICAgYnVmID0gYXZfbWFsbG9jX2FycmF5KG1ldGFkYXRhX3NpemUsIDIpOworICAgIGlmICghYnVmKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIHJlYWRfYnVmWzBdID0gYnVmOworICAgIHJlYWRfYnVmWzFdID0gYnVmICsgbWV0YWRhdGFfc2l6ZTsKKworICAgIGF2aW9fc2VlayhzLT5wYiwgZmx2LT5tZXRhZGF0YV9zaXplX3BvcywgU0VFS19TRVQpOworICAgIGF2aW9fd2IyNChzLT5wYiwgZmx2LT5tZXRhZGF0YV90b3RhbHNpemUgKyBtZXRhZGF0YV9zaXplKTsKKworICAgIGF2aW9fc2VlayhzLT5wYiwgZmx2LT5tZXRhZGF0YV90b3RhbHNpemVfcG9zLCBTRUVLX1NFVCk7CisgICAgYXZpb193YjMyKHMtPnBiLCBmbHYtPm1ldGFkYXRhX3RvdGFsc2l6ZSArIDExICsgbWV0YWRhdGFfc2l6ZSk7CisgICAgYXZpb19zZWVrKHMtPnBiLCBwb3NfZW5kLCBTRUVLX1NFVCk7CisKKyAgICAvKiBTaGlmdCB0aGUgZGF0YTogdGhlIEFWSU8gY29udGV4dCBvZiB0aGUgb3V0cHV0IGNhbiBvbmx5IGJlIHVzZWQgZm9yCisgICAgICogd3JpdGluZywgc28gd2UgcmUtb3BlbiB0aGUgc2FtZSBvdXRwdXQsIGJ1dCBmb3IgcmVhZGluZy4gSXQgYWxzbyBhdm9pZHMKKyAgICAgKiBhIHJlYWQvc2Vlay93cml0ZS9zZWVrIGJhY2sgYW5kIGZvcnRoLiAqLworICAgIGF2aW9fZmx1c2gocy0+cGIpOworICAgIHJldCA9IHMtPmlvX29wZW4ocywgJnJlYWRfcGIsIHMtPnVybCwgQVZJT19GTEFHX1JFQUQsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmUtb3BlbiAlcyBvdXRwdXQgZmlsZSBmb3IgIgorICAgICAgICAgICAgICAgInRoZSBzZWNvbmQgcGFzcyAoYWRkX2tleWZyYW1lX2luZGV4KVxuIiwgcy0+dXJsKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgLyogbWFyayB0aGUgZW5kIG9mIHRoZSBzaGlmdCB0byB1cCB0byB0aGUgbGFzdCBkYXRhIHdlIHdyb3RlLCBhbmQgZ2V0IHJlYWR5CisgICAgICogZm9yIHdyaXRpbmcgKi8KKyAgICBwb3NfZW5kID0gYXZpb190ZWxsKHMtPnBiKTsKKyAgICBhdmlvX3NlZWsocy0+cGIsIGZsdi0+a2V5ZnJhbWVzX2luZm9fb2Zmc2V0ICsgbWV0YWRhdGFfc2l6ZSwgU0VFS19TRVQpOworCisgICAgLyogc3RhcnQgcmVhZGluZyBhdCB3aGVyZSB0aGUga2V5ZnJhbWUgaW5kZXggaW5mb3JtYXRpb24gd2lsbCBiZSBwbGFjZWQgKi8KKyAgICBhdmlvX3NlZWsocmVhZF9wYiwgZmx2LT5rZXlmcmFtZXNfaW5mb19vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICBwb3MgPSBhdmlvX3RlbGwocmVhZF9wYik7CisKKyNkZWZpbmUgUkVBRF9CTE9DSyBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWFkX3NpemVbcmVhZF9idWZfaWRdID0gYXZpb19yZWFkKHJlYWRfcGIsIHJlYWRfYnVmW3JlYWRfYnVmX2lkXSwgbWV0YWRhdGFfc2l6ZSk7ICBcCisgICAgcmVhZF9idWZfaWQgXj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgLyogc2hpZnQgZGF0YSBieSBjaHVuayBvZiBhdCBtb3N0IGtleWZyYW1lICpmaWxlcG9zaXRpb25zKiBhbmQgKnRpbWVzKiBzaXplICovCisgICAgUkVBRF9CTE9DSzsKKyAgICBkbyB7CisgICAgICAgIFJFQURfQkxPQ0s7CisgICAgICAgIG4gPSByZWFkX3NpemVbcmVhZF9idWZfaWRdOworICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXZpb193cml0ZShzLT5wYiwgcmVhZF9idWZbcmVhZF9idWZfaWRdLCBuKTsKKyAgICAgICAgcG9zICs9IG47CisgICAgfSB3aGlsZSAocG9zIDw9IHBvc19lbmQpOworCisgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsICZyZWFkX3BiKTsKKworZW5kOgorICAgIGF2X2ZyZWUoYnVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKIHN0YXRpYyBpbnQgZmx2X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgaW50IGk7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgRkxWQ29udGV4dCAqZmx2ID0gcy0+cHJpdl9kYXRhOwotICAgIGludDY0X3QgZGF0YV9zaXplOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1tpXS0+Y29kZWM7CisgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zW2ldLT5jb2RlY3BhcjsKICAgICAgICAgRkxWU3RyZWFtQ29udGV4dCAqc2M7Ci0gICAgICAgIHN3aXRjaCAoZW5jLT5jb2RlY190eXBlKSB7CisgICAgICAgIHN3aXRjaCAocGFyLT5jb2RlY190eXBlKSB7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgogICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmF2Z19mcmFtZV9yYXRlLmRlbiAmJgogICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmF2Z19mcmFtZV9yYXRlLm51bSkgewogICAgICAgICAgICAgICAgIGZsdi0+ZnJhbWVyYXRlID0gYXZfcTJkKHMtPnN0cmVhbXNbaV0tPmF2Z19mcmFtZV9yYXRlKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmbHYtPnZpZGVvX2VuYykgeworICAgICAgICAgICAgaWYgKGZsdi0+dmlkZW9fcGFyKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgImF0IG1vc3Qgb25lIHZpZGVvIHN0cmVhbSBpcyBzdXBwb3J0ZWQgaW4gZmx2XG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZmx2LT52aWRlb19lbmMgPSBlbmM7Ci0gICAgICAgICAgICBpZiAoIWZmX2NvZGVjX2dldF90YWcoZmx2X3ZpZGVvX2NvZGVjX2lkcywgZW5jLT5jb2RlY19pZCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkX2NvZGVjKHMsICJWaWRlbyIsIGVuYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgZmx2LT52aWRlb19wYXIgPSBwYXI7CisgICAgICAgICAgICBpZiAoIWZmX2NvZGVjX2dldF90YWcoZmx2X3ZpZGVvX2NvZGVjX2lkcywgcGFyLT5jb2RlY19pZCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkX2NvZGVjKHMsICJWaWRlbyIsIHBhci0+Y29kZWNfaWQpOwogCi0gICAgICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCB8fAotICAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2MykgeworICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQgfHwKKyAgICAgICAgICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjMpIHsKICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUw7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIGVycm9yID8gQVZfTE9HX0VSUk9SIDogQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICJDb2RlYyAlcyBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBvZmZpY2lhbCBGTFYgc3BlY2lmaWNhdGlvbixcbiIsIGF2Y29kZWNfZ2V0X25hbWUoZW5jLT5jb2RlY19pZCkpOworICAgICAgICAgICAgICAgICAgICAgICAiQ29kZWMgJXMgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgb2ZmaWNpYWwgRkxWIHNwZWNpZmljYXRpb24sXG4iLCBhdmNvZGVjX2dldF9uYW1lKHBhci0+Y29kZWNfaWQpKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZSB2c3RyaWN0PS0xIC8gLXN0cmljdCAtMSB0byB1c2UgaXQgYW55d2F5LlxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNikgeworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNikgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgIk11eGluZyBWUDYgaW4gZmx2IHdpbGwgcHJvZHVjZSBmbGlwcGVkIHZpZGVvIG9uIHBsYXliYWNrLlxuIik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICBpZiAoZmx2LT5hdWRpb19lbmMpIHsKKyAgICAgICAgICAgIGlmIChmbHYtPmF1ZGlvX3BhcikgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJhdCBtb3N0IG9uZSBhdWRpbyBzdHJlYW0gaXMgc3VwcG9ydGVkIGluIGZsdlxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsdi0+YXVkaW9fZW5jID0gZW5jOwotICAgICAgICAgICAgaWYgKGdldF9hdWRpb19mbGFncyhzLCBlbmMpIDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gdW5zdXBwb3J0ZWRfY29kZWMocywgIkF1ZGlvIiwgZW5jLT5jb2RlY19pZCk7Ci0gICAgICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2QkUpCisgICAgICAgICAgICBmbHYtPmF1ZGlvX3BhciA9IHBhcjsKKyAgICAgICAgICAgIGlmIChnZXRfYXVkaW9fZmxhZ3MocywgcGFyKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkX2NvZGVjKHMsICJBdWRpbyIsIHBhci0+Y29kZWNfaWQpOworICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFKQogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgIjE2LWJpdCBiaWctZW5kaWFuIGF1ZGlvIGluIGZsdiBpcyB2YWxpZCBidXQgbW9zdCBsaWtlbHkgdW5wbGF5YWJsZSAoaGFyZHdhcmUgZGVwZW5kZW50KTsgdXNlIHMxNmxlXG4iKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgotICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEVYVCAmJiBlbmMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkUpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkX2NvZGVjKHMsICJEYXRhIiwgZW5jLT5jb2RlY19pZCk7Ci0gICAgICAgICAgICBmbHYtPmRhdGFfZW5jID0gZW5jOworICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEVYVCAmJiBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHVuc3VwcG9ydGVkX2NvZGVjKHMsICJEYXRhIiwgcGFyLT5jb2RlY19pZCk7CisgICAgICAgICAgICBmbHYtPmRhdGFfcGFyID0gcGFyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgotICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEVYVCkgeworICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEVYVCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTdWJ0aXRsZSBjb2RlYyAnJXMnIGZvciBzdHJlYW0gJWQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBGTFZcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoZW5jLT5jb2RlY19pZCksIGkpOworICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHBhci0+Y29kZWNfaWQpLCBpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsdi0+ZGF0YV9lbmMgPSBlbmM7CisgICAgICAgICAgICBmbHYtPmRhdGFfcGFyID0gcGFyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ29kZWMgdHlwZSAnJXMnIGZvciBzdHJlYW0gJWQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBGTFZcbiIsCi0gICAgICAgICAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKGVuYy0+Y29kZWNfdHlwZSksIGkpOworICAgICAgICAgICAgICAgICAgIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhwYXItPmNvZGVjX3R5cGUpLCBpKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zW2ldLCAzMiwgMSwgMTAwMCk7IC8qIDMyIGJpdCBwdHMgaW4gbXMgKi8KQEAgLTQyNywxMyArNzM0LDEzIEBACiAKICAgICBhdmlvX3dyaXRlKHBiLCAiRkxWIiwgMyk7CiAgICAgYXZpb193OChwYiwgMSk7Ci0gICAgYXZpb193OChwYiwgRkxWX0hFQURFUl9GTEFHX0hBU0FVRElPICogISFmbHYtPmF1ZGlvX2VuYyArCi0gICAgICAgICAgICAgICAgRkxWX0hFQURFUl9GTEFHX0hBU1ZJREVPICogISFmbHYtPnZpZGVvX2VuYyk7CisgICAgYXZpb193OChwYiwgRkxWX0hFQURFUl9GTEFHX0hBU0FVRElPICogISFmbHYtPmF1ZGlvX3BhciArCisgICAgICAgICAgICAgICAgRkxWX0hFQURFUl9GTEFHX0hBU1ZJREVPICogISFmbHYtPnZpZGVvX3Bhcik7CiAgICAgYXZpb193YjMyKHBiLCA5KTsKICAgICBhdmlvX3diMzIocGIsIDApOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190YWcgPT0gNSkgeworICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3RhZyA9PSA1KSB7CiAgICAgICAgICAgICBhdmlvX3c4KHBiLCA4KTsgICAgIC8vIG1lc3NhZ2UgdHlwZQogICAgICAgICAgICAgYXZpb193YjI0KHBiLCAwKTsgICAvLyBpbmNsdWRlIGZsYWdzCiAgICAgICAgICAgICBhdmlvX3diMjQocGIsIDApOyAgIC8vIHRpbWUgc3RhbXAKQEAgLTQ0MiwxMTcgKzc0OSwxNjYgQEAKICAgICAgICAgICAgIGZsdi0+cmVzZXJ2ZWQgPSA1OwogICAgICAgICB9CiAKLSAgICB3cml0ZV9tZXRhZGF0YShzLCAwKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjOwotICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgfHwgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKLSAgICAgICAgICAgIGludDY0X3QgcG9zOwotICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyA/Ci0gICAgICAgICAgICAgICAgICAgIEZMVl9UQUdfVFlQRV9WSURFTyA6IEZMVl9UQUdfVFlQRV9BVURJTyk7Ci0gICAgICAgICAgICBhdmlvX3diMjQocGIsIDApOyAvLyBzaXplIHBhdGNoZWQgbGF0ZXIKLSAgICAgICAgICAgIGF2aW9fd2IyNChwYiwgMCk7IC8vIHRzCi0gICAgICAgICAgICBhdmlvX3c4KHBiLCAwKTsgICAvLyB0cyBleHQKLSAgICAgICAgICAgIGF2aW9fd2IyNChwYiwgMCk7IC8vIHN0cmVhbWlkCi0gICAgICAgICAgICBwb3MgPSBhdmlvX3RlbGwocGIpOwotICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7Ci0gICAgICAgICAgICAgICAgYXZpb193OChwYiwgZ2V0X2F1ZGlvX2ZsYWdzKHMsIGVuYykpOwotICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOyAvLyBBQUMgc2VxdWVuY2UgaGVhZGVyCi0KLSAgICAgICAgICAgICAgICBpZiAoIWVuYy0+ZXh0cmFkYXRhX3NpemUgJiYgZmx2LT5mbGFncyAmIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgUHV0Qml0Q29udGV4dCBwYmM7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVyYXRlX2luZGV4OwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMgPSBmbHYtPmF1ZGlvX2VuYy0+Y2hhbm5lbHMgLSAoZmx2LT5hdWRpb19lbmMtPmNoYW5uZWxzID09IDggPyAxIDogMCk7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF0YVsyXTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKHNhbXBsZXJhdGVfaW5kZXggPSAwOyBzYW1wbGVyYXRlX2luZGV4IDwgMTY7IHNhbXBsZXJhdGVfaW5kZXgrKykKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbHYtPmF1ZGlvX2VuYy0+c2FtcGxlX3JhdGUgPT0gbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbc2FtcGxlcmF0ZV9pbmRleF0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgaW5pdF9wdXRfYml0cygmcGJjLCBkYXRhLCBzaXplb2YoZGF0YSkpOwotICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcGJjLCA1LCBmbHYtPmF1ZGlvX2VuYy0+cHJvZmlsZSArIDEpOyAvL3Byb2ZpbGUKLSAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiYywgNCwgc2FtcGxlcmF0ZV9pbmRleCk7IC8vc2FtcGxlIHJhdGUgaW5kZXgKLSAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiYywgNCwgY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICBwdXRfYml0cygmcGJjLCAxLCAwKTsgLy9mcmFtZSBsZW5ndGggLSAxMDI0IHNhbXBsZXMKLSAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiYywgMSwgMCk7IC8vZG9lcyBub3QgZGVwZW5kIG9uIGNvcmUgY29kZXIKLSAgICAgICAgICAgICAgICAgICAgcHV0X2JpdHMoJnBiYywgMSwgMCk7IC8vaXMgbm90IGV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICBmbHVzaF9wdXRfYml0cygmcGJjKTsKLQotICAgICAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCBkYXRhWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgYXZpb193OChwYiwgZGF0YVsxXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQUFDIHNlcXVlbmNlIGhlYWRlcjogJTAyeCAlMDJ4LlxuIiwgZGF0YVswXSwgZGF0YVsxXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF2aW9fd3JpdGUocGIsIGVuYy0+ZXh0cmFkYXRhLCBlbmMtPmV4dHJhZGF0YV9zaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5jb2RlY190YWcgfCBGTFZfRlJBTUVfS0VZKTsgLy8gZmxhZ3MKLSAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCAwKTsgLy8gQVZDIHNlcXVlbmNlIGhlYWRlcgotICAgICAgICAgICAgICAgIGF2aW9fd2IyNChwYiwgMCk7IC8vIGNvbXBvc2l0aW9uIHRpbWUKLSAgICAgICAgICAgICAgICBmZl9pc29tX3dyaXRlX2F2Y2MocGIsIGVuYy0+ZXh0cmFkYXRhLCBlbmMtPmV4dHJhZGF0YV9zaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRhdGFfc2l6ZSA9IGF2aW9fdGVsbChwYikgLSBwb3M7Ci0gICAgICAgICAgICBhdmlvX3NlZWsocGIsIC1kYXRhX3NpemUgLSAxMCwgU0VFS19DVVIpOwotICAgICAgICAgICAgYXZpb193YjI0KHBiLCBkYXRhX3NpemUpOwotICAgICAgICAgICAgYXZpb19za2lwKHBiLCBkYXRhX3NpemUgKyAxMCAtIDMpOwotICAgICAgICAgICAgYXZpb193YjMyKHBiLCBkYXRhX3NpemUgKyAxMSk7IC8vIHByZXZpb3VzIHRhZyBzaXplCi0gICAgICAgIH0KKyAgICBpZiAoZmx2LT5mbGFncyAmIEZMVl9OT19NRVRBREFUQSkgeworICAgICAgICBwYi0+c2Vla2FibGUgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlX21ldGFkYXRhKHMsIDApOwogICAgIH0KIAorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgZmx2X3dyaXRlX2NvZGVjX2hlYWRlcihzLCBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhcik7CisgICAgfQorCisgICAgZmx2LT5kYXRhc3RhcnRfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBmbHZfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgaW50NjRfdCBmaWxlX3NpemU7Ci0KICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBGTFZDb250ZXh0ICpmbHYgPSBzLT5wcml2X2RhdGE7Ci0gICAgaW50IGk7CisgICAgaW50IGJ1aWxkX2tleWZyYW1lc19pZHggPSBmbHYtPmZsYWdzICYgRkxWX0FERF9LRVlGUkFNRV9JTkRFWDsKKyAgICBpbnQgaSwgcmVzOworICAgIGludDY0X3QgY3VyX3BvcyA9IGF2aW9fdGVsbChzLT5wYik7CiAKLSAgICAvKiBBZGQgRU9TIHRhZyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjOwotICAgICAgICBGTFZTdHJlYW1Db250ZXh0ICpzYyA9IHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKLSAgICAgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKLSAgICAgICAgICAgICAgICAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpKQotICAgICAgICAgICAgcHV0X2F2Y19lb3NfdGFnKHBiLCBzYy0+bGFzdF90cyk7CisgICAgaWYgKGJ1aWxkX2tleWZyYW1lc19pZHgpIHsKKyAgICAgICAgRkxWRmlsZXBvc2l0aW9uICpuZXdmbHZfcG9zaW5mbywgKnA7CisKKyAgICAgICAgYXZpb19zZWVrKHBiLCBmbHYtPnZpZGVvc2l6ZV9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+dmlkZW9zaXplKTsKKworICAgICAgICBhdmlvX3NlZWsocGIsIGZsdi0+YXVkaW9zaXplX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT5hdWRpb3NpemUpOworCisgICAgICAgIGF2aW9fc2VlayhwYiwgZmx2LT5sYXN0dGltZXN0YW1wX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT5sYXN0dGltZXN0YW1wKTsKKworICAgICAgICBhdmlvX3NlZWsocGIsIGZsdi0+bGFzdGtleWZyYW1ldGltZXN0YW1wX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT5sYXN0a2V5ZnJhbWV0aW1lc3RhbXApOworCisgICAgICAgIGF2aW9fc2VlayhwYiwgZmx2LT5sYXN0a2V5ZnJhbWVsb2NhdGlvbl9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+bGFzdGtleWZyYW1lbG9jYXRpb24gKyBmbHYtPmtleWZyYW1lX2luZGV4X3NpemUpOworICAgICAgICBhdmlvX3NlZWsocGIsIGN1cl9wb3MsIFNFRUtfU0VUKTsKKworICAgICAgICByZXMgPSBzaGlmdF9kYXRhKHMpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgICAgIGF2aW9fc2VlayhwYiwgZmx2LT5rZXlmcmFtZXNfaW5mb19vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJmaWxlcG9zaXRpb25zIik7CisgICAgICAgIHB1dF9hbWZfZHdvcmRfYXJyYXkocGIsIGZsdi0+ZmlsZXBvc2l0aW9uc19jb3VudCk7CisgICAgICAgIGZvciAobmV3Zmx2X3Bvc2luZm8gPSBmbHYtPmhlYWRfZmlsZXBvc2l0aW9uczsgbmV3Zmx2X3Bvc2luZm87IG5ld2Zsdl9wb3NpbmZvID0gbmV3Zmx2X3Bvc2luZm8tPm5leHQpIHsKKyAgICAgICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBuZXdmbHZfcG9zaW5mby0+a2V5ZnJhbWVfcG9zaXRpb24gKyBmbHYtPmtleWZyYW1lX2luZGV4X3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgcHV0X2FtZl9zdHJpbmcocGIsICJ0aW1lcyIpOworICAgICAgICBwdXRfYW1mX2R3b3JkX2FycmF5KHBiLCBmbHYtPmZpbGVwb3NpdGlvbnNfY291bnQpOworICAgICAgICBmb3IgKG5ld2Zsdl9wb3NpbmZvID0gZmx2LT5oZWFkX2ZpbGVwb3NpdGlvbnM7IG5ld2Zsdl9wb3NpbmZvOyBuZXdmbHZfcG9zaW5mbyA9IG5ld2Zsdl9wb3NpbmZvLT5uZXh0KSB7CisgICAgICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgbmV3Zmx2X3Bvc2luZm8tPmtleWZyYW1lX3RpbWVzdGFtcCk7CisgICAgICAgIH0KKworICAgICAgICBuZXdmbHZfcG9zaW5mbyA9IGZsdi0+aGVhZF9maWxlcG9zaXRpb25zOworICAgICAgICB3aGlsZSAobmV3Zmx2X3Bvc2luZm8pIHsKKyAgICAgICAgICAgIHAgPSBuZXdmbHZfcG9zaW5mby0+bmV4dDsKKyAgICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICAgICAgbmV3Zmx2X3Bvc2luZm8tPm5leHQgPSBwLT5uZXh0OworICAgICAgICAgICAgICAgIGF2X2ZyZWUocCk7CisgICAgICAgICAgICAgICAgcCA9IE5VTEw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUobmV3Zmx2X3Bvc2luZm8pOworICAgICAgICAgICAgICAgIG5ld2Zsdl9wb3NpbmZvID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAiIik7CisgICAgICAgIGF2aW9fdzgocGIsIEFNRl9FTkRfT0ZfT0JKRUNUKTsKKworICAgICAgICBhdmlvX3NlZWsocGIsIGN1cl9wb3MgKyBmbHYtPmtleWZyYW1lX2luZGV4X3NpemUsIFNFRUtfU0VUKTsKKyAgICB9CisKK2VuZDoKKyAgICBpZiAoZmx2LT5mbGFncyAmIEZMVl9OT19TRVFVRU5DRV9FTkQpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkZMViBubyBzZXF1ZW5jZSBlbmQgbW9kZSBvcGVuXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBBZGQgRU9TIHRhZyAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXI7CisgICAgICAgICAgICBGTFZTdHJlYW1Db250ZXh0ICpzYyA9IHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YTsKKyAgICAgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgICAgICAgICAgICAgIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkpCisgICAgICAgICAgICAgICAgcHV0X2F2Y19lb3NfdGFnKHBiLCBzYy0+bGFzdF90cyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBmaWxlX3NpemUgPSBhdmlvX3RlbGwocGIpOwogCi0gICAgLyogdXBkYXRlIGluZm9ybWF0aW9uICovCi0gICAgaWYgKGF2aW9fc2VlayhwYiwgZmx2LT5kdXJhdGlvbl9vZmZzZXQsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byB1cGRhdGUgaGVhZGVyIHdpdGggY29ycmVjdCBkdXJhdGlvbi5cbiIpOwotICAgIGVsc2UKLSAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+ZHVyYXRpb24gLyAoZG91YmxlKTEwMDApOwotICAgIGlmIChhdmlvX3NlZWsocGIsIGZsdi0+ZmlsZXNpemVfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQotICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gdXBkYXRlIGhlYWRlciB3aXRoIGNvcnJlY3QgZmlsZXNpemUuXG4iKTsKLSAgICBlbHNlCi0gICAgICAgIHB1dF9hbWZfZG91YmxlKHBiLCBmaWxlX3NpemUpOworICAgIGlmIChidWlsZF9rZXlmcmFtZXNfaWR4KSB7CisgICAgICAgIGZsdi0+ZGF0YXNpemUgPSBmaWxlX3NpemUgLSBmbHYtPmRhdGFzdGFydF9vZmZzZXQ7CisgICAgICAgIGF2aW9fc2VlayhwYiwgZmx2LT5kYXRhc2l6ZV9vZmZzZXQsIFNFRUtfU0VUKTsKKyAgICAgICAgcHV0X2FtZl9kb3VibGUocGIsIGZsdi0+ZGF0YXNpemUpOworICAgIH0KKyAgICBpZiAoIShmbHYtPmZsYWdzICYgRkxWX05PX01FVEFEQVRBKSkgeworICAgICAgICBpZiAoIShmbHYtPmZsYWdzICYgRkxWX05PX0RVUkFUSU9OX0ZJTEVTSVpFKSkgeworICAgICAgICAgICAgLyogdXBkYXRlIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICBpZiAoYXZpb19zZWVrKHBiLCBmbHYtPmR1cmF0aW9uX29mZnNldCwgU0VFS19TRVQpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byB1cGRhdGUgaGVhZGVyIHdpdGggY29ycmVjdCBkdXJhdGlvbi5cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmx2LT5kdXJhdGlvbiAvIChkb3VibGUpMTAwMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZpb19zZWVrKHBiLCBmbHYtPmZpbGVzaXplX29mZnNldCwgU0VFS19TRVQpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byB1cGRhdGUgaGVhZGVyIHdpdGggY29ycmVjdCBmaWxlc2l6ZS5cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwdXRfYW1mX2RvdWJsZShwYiwgZmlsZV9zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotICAgIGF2aW9fc2VlayhwYiwgZmlsZV9zaXplLCBTRUVLX1NFVCk7CiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgZmx2X3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgQVZJT0NvbnRleHQgKnBiICAgICAgPSBzLT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjcGFyOwogICAgIEZMVkNvbnRleHQgKmZsdiAgICAgID0gcy0+cHJpdl9kYXRhOwogICAgIEZMVlN0cmVhbUNvbnRleHQgKnNjID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPnByaXZfZGF0YTsKICAgICB1bnNpZ25lZCB0czsKICAgICBpbnQgc2l6ZSA9IHBrdC0+c2l6ZTsKICAgICB1aW50OF90ICpkYXRhID0gTlVMTDsKICAgICBpbnQgZmxhZ3MgPSAtMSwgZmxhZ3Nfc2l6ZSwgcmV0OworICAgIGludDY0X3QgY3VyX29mZnNldCA9IGF2aW9fdGVsbChwYik7CiAKLSAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZGIHx8IGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2QSB8fAotICAgICAgICBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNiAgfHwgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpCisgICAgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgIXBrdC0+c2l6ZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJFbXB0eSBhdWRpbyBQYWNrZXRcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkYgfHwgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZBIHx8CisgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2ICB8fCBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykKICAgICAgICAgZmxhZ3Nfc2l6ZSA9IDI7Ci0gICAgZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpCisgICAgZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8IHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpCiAgICAgICAgIGZsYWdzX3NpemUgPSA1OwogICAgIGVsc2UKICAgICAgICAgZmxhZ3Nfc2l6ZSA9IDE7CiAKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgfHwgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0CisgICAgICAgICAgICB8fCBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KSB7CisgICAgICAgIGludCBzaWRlX3NpemUgPSAwOworICAgICAgICB1aW50OF90ICpzaWRlID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9ORVdfRVhUUkFEQVRBLCAmc2lkZV9zaXplKTsKKyAgICAgICAgaWYgKHNpZGUgJiYgc2lkZV9zaXplID4gMCAmJiAoc2lkZV9zaXplICE9IHBhci0+ZXh0cmFkYXRhX3NpemUgfHwgbWVtY21wKHNpZGUsIHBhci0+ZXh0cmFkYXRhLCBzaWRlX3NpemUpKSkgeworICAgICAgICAgICAgYXZfZnJlZShwYXItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICBwYXItPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooc2lkZV9zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIXBhci0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShwYXItPmV4dHJhZGF0YSwgc2lkZSwgc2lkZV9zaXplKTsKKyAgICAgICAgICAgIHBhci0+ZXh0cmFkYXRhX3NpemUgPSBzaWRlX3NpemU7CisgICAgICAgICAgICBmbHZfd3JpdGVfY29kZWNfaGVhZGVyKHMsIHBhcik7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoZmx2LT5kZWxheSA9PSBBVl9OT1BUU19WQUxVRSkKICAgICAgICAgZmx2LT5kZWxheSA9IC1wa3QtPmR0czsKIApAQCAtNTY5LDE2ICs5MjUsMTkgQEAKICAgICAgICAgcy0+ZXZlbnRfZmxhZ3MgJj0gfkFWU1RSRUFNX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRDsKICAgICB9CiAKLSAgICBzd2l0Y2ggKGVuYy0+Y29kZWNfdHlwZSkgeworICAgIGF2aW9fd3JpdGVfbWFya2VyKHBiLCBhdl9yZXNjYWxlKHRzLCBBVl9USU1FX0JBU0UsIDEwMDApLAorICAgICAgICAgICAgICAgICAgICAgIHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkgJiYgKGZsdi0+dmlkZW9fcGFyID8gcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyA6IDEpID8gQVZJT19EQVRBX01BUktFUl9TWU5DX1BPSU5UIDogQVZJT19EQVRBX01BUktFUl9CT1VOREFSWV9QT0lOVCk7CisKKyAgICBzd2l0Y2ggKHBhci0+Y29kZWNfdHlwZSkgewogICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgogICAgICAgICBhdmlvX3c4KHBiLCBGTFZfVEFHX1RZUEVfVklERU8pOwogCi0gICAgICAgIGZsYWdzID0gZmZfY29kZWNfZ2V0X3RhZyhmbHZfdmlkZW9fY29kZWNfaWRzLCBlbmMtPmNvZGVjX2lkKTsKKyAgICAgICAgZmxhZ3MgPSBmZl9jb2RlY19nZXRfdGFnKGZsdl92aWRlb19jb2RlY19pZHMsIHBhci0+Y29kZWNfaWQpOwogCiAgICAgICAgIGZsYWdzIHw9IHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkgPyBGTFZfRlJBTUVfS0VZIDogRkxWX0ZSQU1FX0lOVEVSOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgICAgZmxhZ3MgPSBnZXRfYXVkaW9fZmxhZ3MocywgZW5jKTsKKyAgICAgICAgZmxhZ3MgPSBnZXRfYXVkaW9fZmxhZ3MocywgcGFyKTsKIAogICAgICAgICBhdl9hc3NlcnQwKHNpemUpOwogCkBAIC01OTIsMTIgKzk1MSwxMiBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgfHwgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkgewogICAgICAgICAvKiBjaGVjayBpZiBleHRyYWRhdGEgbG9va3MgbGlrZSBtcDQgZm9ybWF0dGVkICovCi0gICAgICAgIGlmIChlbmMtPmV4dHJhZGF0YV9zaXplID4gMCAmJiAqKHVpbnQ4X3QqKWVuYy0+ZXh0cmFkYXRhICE9IDEpCisgICAgICAgIGlmIChwYXItPmV4dHJhZGF0YV9zaXplID4gMCAmJiAqKHVpbnQ4X3QqKXBhci0+ZXh0cmFkYXRhICE9IDEpCiAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2F2Y19wYXJzZV9uYWxfdW5pdHNfYnVmKHBrdC0+ZGF0YSwgJmRhdGEsICZzaXplKSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJiBwa3QtPnNpemUgPiAyICYmCisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJiBwa3QtPnNpemUgPiAyICYmCiAgICAgICAgICAgICAgICAoQVZfUkIxNihwa3QtPmRhdGEpICYgMHhmZmYwKSA9PSAweGZmZjApIHsKICAgICAgICAgaWYgKCFzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+bmJfZnJhbWVzKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNYWxmb3JtZWQgQUFDIGJpdHN0cmVhbSBkZXRlY3RlZDogIgpAQCAtNjA5LDcgKzk2OCw3IEBACiAgICAgfQogCiAgICAgLyogY2hlY2sgU3BlZXggcGFja2V0IGR1cmF0aW9uICovCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVggJiYgdHMgLSBzYy0+bGFzdF90cyA+IDE2MCkKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TUEVFWCAmJiB0cyAtIHNjLT5sYXN0X3RzID4gMTYwKQogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJXYXJuaW5nOiBTcGVleCBzdHJlYW0gaGFzIG1vcmUgdGhhbiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjggZnJhbWVzIHBlciBwYWNrZXQuIEFkb2JlIEZsYXNoICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUGxheWVyIGNhbm5vdCBoYW5kbGUgdGhpcyFcbiIpOwpAQCAtNjI4LDExICs5ODcsMTEgQEAKICAgICBhdmlvX3c4KHBiLCAodHMgPj4gMjQpICYgMHg3Rik7IC8vIHRpbWVzdGFtcHMgYXJlIDMyIGJpdHMgX3NpZ25lZF8KICAgICBhdmlvX3diMjQocGIsIGZsdi0+cmVzZXJ2ZWQpOwogCi0gICAgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSB8fAotICAgICAgICBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICkgeworICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEgfHwKKyAgICAgICAgcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSApIHsKICAgICAgICAgaW50IGRhdGFfc2l6ZTsKICAgICAgICAgaW50NjRfdCBtZXRhZGF0YV9zaXplX3BvcyA9IGF2aW9fdGVsbChwYik7Ci0gICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RFWFQpIHsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVEVYVCkgewogICAgICAgICAgICAgLy8gbGVnYWN5IEZGbXBlZyBtYWdpYz8KICAgICAgICAgICAgIGF2aW9fdzgocGIsIEFNRl9EQVRBX1RZUEVfU1RSSU5HKTsKICAgICAgICAgICAgIHB1dF9hbWZfc3RyaW5nKHBiLCAib25UZXh0RGF0YSIpOwpAQCAtNjU5LDE3ICsxMDE4LDE3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZfYXNzZXJ0MShmbGFncz49MCk7CiAgICAgICAgIGF2aW9fdzgocGIsZmxhZ3MpOwotICAgICAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDYpCisgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNikKICAgICAgICAgICAgIGF2aW9fdzgocGIsMCk7Ci0gICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkYgfHwgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZBKSB7Ci0gICAgICAgICAgICBpZiAoZW5jLT5leHRyYWRhdGFfc2l6ZSkKLSAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCBlbmMtPmV4dHJhZGF0YVswXSk7CisgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkYgfHwgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZBKSB7CisgICAgICAgICAgICBpZiAocGFyLT5leHRyYWRhdGFfc2l6ZSkKKyAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCBwYXItPmV4dHJhZGF0YVswXSk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXZpb193OChwYiwgKChGRkFMSUdOKGVuYy0+d2lkdGgsICAxNikgLSBlbmMtPndpZHRoKSA8PCA0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGRkFMSUdOKGVuYy0+aGVpZ2h0LCAxNikgLSBlbmMtPmhlaWdodCkpOwotICAgICAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKQorICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsICgoRkZBTElHTihwYXItPndpZHRoLCAgMTYpIC0gcGFyLT53aWR0aCkgPDwgNCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRkZBTElHTihwYXItPmhlaWdodCwgMTYpIC0gcGFyLT5oZWlnaHQpKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykKICAgICAgICAgICAgIGF2aW9fdzgocGIsIDEpOyAvLyBBQUMgcmF3Ci0gICAgICAgIGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KSB7CisgICAgICAgIGVsc2UgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCB8fCBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUc0KSB7CiAgICAgICAgICAgICBhdmlvX3c4KHBiLCAxKTsgLy8gQVZDIE5BTFUKICAgICAgICAgICAgIGF2aW9fd2IyNChwYiwgcGt0LT5wdHMgLSBwa3QtPmR0cyk7CiAgICAgICAgIH0KQEAgLTY4MSw2ICsxMDQwLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPnB0cyArIGZsdi0+ZGVsYXkgKyBwa3QtPmR1cmF0aW9uKTsKICAgICB9CiAKKyAgICBpZiAoZmx2LT5mbGFncyAmIEZMVl9BRERfS0VZRlJBTUVfSU5ERVgpIHsKKyAgICAgICAgc3dpdGNoIChwYXItPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgorICAgICAgICAgICAgICAgIGZsdi0+dmlkZW9zaXplICs9IChhdmlvX3RlbGwocGIpIC0gY3VyX29mZnNldCk7CisgICAgICAgICAgICAgICAgZmx2LT5sYXN0dGltZXN0YW1wID0gZmx2LT5hY3VyZnJhbWVpbmRleCAvIGZsdi0+ZnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGlmIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0cyA9IGZsdi0+YWN1cmZyYW1laW5kZXggLyBmbHYtPmZyYW1lcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwb3MgPSBjdXJfb2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgIGZsdi0+bGFzdGtleWZyYW1ldGltZXN0YW1wID0gZmx2LT5hY3VyZnJhbWVpbmRleCAvIGZsdi0+ZnJhbWVyYXRlOworICAgICAgICAgICAgICAgICAgICBmbHYtPmxhc3RrZXlmcmFtZWxvY2F0aW9uID0gcG9zOworICAgICAgICAgICAgICAgICAgICBmbHZfYXBwZW5kX2tleWZyYW1lX2luZm8ocywgZmx2LCB0cywgcG9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmx2LT5hY3VyZnJhbWVpbmRleCsrOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgICAgICBmbHYtPmF1ZGlvc2l6ZSArPSAoYXZpb190ZWxsKHBiKSAtIGN1cl9vZmZzZXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInBhci0+Y29kZWNfdHlwZSBpcyB0eXBlID0gWyVkXVxuIiwgcGFyLT5jb2RlY190eXBlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKwogICAgIGF2X2ZyZWUoZGF0YSk7CiAKICAgICByZXR1cm4gcGItPmVycm9yOwpAQCAtNjg4LDcgKzEwNzMsMTEgQEAKIAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICB7ICJmbHZmbGFncyIsICJGTFYgbXV4ZXIgZmxhZ3MiLCBvZmZzZXRvZihGTFZDb250ZXh0LCBmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgImZsdmZsYWdzIiB9LAotICAgIHsgImFhY19zZXFfaGVhZGVyX2RldGVjdCIsICJQdXQgQUFDIHNlcXVlbmNlIGhlYWRlciBiYXNlZCBvbiBzdHJlYW0gZGF0YSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IDF9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgImZsdmZsYWdzIiB9LAorICAgIHsgImFhY19zZXFfaGVhZGVyX2RldGVjdCIsICJQdXQgQUFDIHNlcXVlbmNlIGhlYWRlciBiYXNlZCBvbiBzdHJlYW0gZGF0YSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZMVl9BQUNfU0VRX0hFQURFUl9ERVRFQ1R9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgImZsdmZsYWdzIiB9LAorICAgIHsgIm5vX3NlcXVlbmNlX2VuZCIsICJkaXNhYmxlIHNlcXVlbmNlIGVuZCBmb3IgRkxWIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkxWX05PX1NFUVVFTkNFX0VORH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAiZmx2ZmxhZ3MiIH0sCisgICAgeyAibm9fbWV0YWRhdGEiLCAiZGlzYWJsZSBtZXRhZGF0YSBmb3IgRkxWIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkxWX05PX01FVEFEQVRBfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJmbHZmbGFncyIgfSwKKyAgICB7ICJub19kdXJhdGlvbl9maWxlc2l6ZSIsICJkaXNhYmxlIGR1cmF0aW9uIGFuZCBmaWxlc2l6ZSB6ZXJvIHZhbHVlIG1ldGFkYXRhIGZvciBGTFYiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGTFZfTk9fRFVSQVRJT05fRklMRVNJWkV9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgImZsdmZsYWdzIiB9LAorICAgIHsgImFkZF9rZXlmcmFtZV9pbmRleCIsICJBZGQga2V5ZnJhbWUgaW5kZXggbWV0YWRhdGEiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGTFZfQUREX0tFWUZSQU1FX0lOREVYfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJmbHZmbGFncyIgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2Zvcm1hdC5jIGIvbGliYXZmb3JtYXQvZm9ybWF0LmMKaW5kZXggMTVmZTE2Ny4uMWM2NmFmYiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZm9ybWF0LmMKKysrIGIvbGliYXZmb3JtYXQvZm9ybWF0LmMKQEAgLTE5LDEwICsxOSwxMCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlICJsaWJhdnV0aWwvYXRvbWljLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGhyZWFkLmgiCiAKICNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKQEAgLTM0LDQ5ICszNCw2IEBACiAgKiBAZmlsZQogICogRm9ybWF0IHJlZ2lzdGVyIGFuZCBsb29rdXAKICAqLwotLyoqIGhlYWQgb2YgcmVnaXN0ZXJlZCBpbnB1dCBmb3JtYXQgbGlua2VkIGxpc3QgKi8KLXN0YXRpYyBBVklucHV0Rm9ybWF0ICpmaXJzdF9pZm9ybWF0ID0gTlVMTDsKLS8qKiBoZWFkIG9mIHJlZ2lzdGVyZWQgb3V0cHV0IGZvcm1hdCBsaW5rZWQgbGlzdCAqLwotc3RhdGljIEFWT3V0cHV0Rm9ybWF0ICpmaXJzdF9vZm9ybWF0ID0gTlVMTDsKLQotc3RhdGljIEFWSW5wdXRGb3JtYXQgKipsYXN0X2lmb3JtYXQgPSAmZmlyc3RfaWZvcm1hdDsKLXN0YXRpYyBBVk91dHB1dEZvcm1hdCAqKmxhc3Rfb2Zvcm1hdCA9ICZmaXJzdF9vZm9ybWF0OwotCi1BVklucHV0Rm9ybWF0ICphdl9pZm9ybWF0X25leHQoY29uc3QgQVZJbnB1dEZvcm1hdCAqZikKLXsKLSAgICBpZiAoZikKLSAgICAgICAgcmV0dXJuIGYtPm5leHQ7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gZmlyc3RfaWZvcm1hdDsKLX0KLQotQVZPdXRwdXRGb3JtYXQgKmF2X29mb3JtYXRfbmV4dChjb25zdCBBVk91dHB1dEZvcm1hdCAqZikKLXsKLSAgICBpZiAoZikKLSAgICAgICAgcmV0dXJuIGYtPm5leHQ7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gZmlyc3Rfb2Zvcm1hdDsKLX0KLQotdm9pZCBhdl9yZWdpc3Rlcl9pbnB1dF9mb3JtYXQoQVZJbnB1dEZvcm1hdCAqZm9ybWF0KQotewotICAgIEFWSW5wdXRGb3JtYXQgKipwID0gbGFzdF9pZm9ybWF0OwotCi0gICAgZm9ybWF0LT5uZXh0ID0gTlVMTDsKLSAgICB3aGlsZSgqcCB8fCBhdnByaXZfYXRvbWljX3B0cl9jYXMoKHZvaWQgKiB2b2xhdGlsZSAqKXAsIE5VTEwsIGZvcm1hdCkpCi0gICAgICAgIHAgPSAmKCpwKS0+bmV4dDsKLSAgICBsYXN0X2lmb3JtYXQgPSAmZm9ybWF0LT5uZXh0OwotfQotCi12b2lkIGF2X3JlZ2lzdGVyX291dHB1dF9mb3JtYXQoQVZPdXRwdXRGb3JtYXQgKmZvcm1hdCkKLXsKLSAgICBBVk91dHB1dEZvcm1hdCAqKnAgPSBsYXN0X29mb3JtYXQ7Ci0KLSAgICBmb3JtYXQtPm5leHQgPSBOVUxMOwotICAgIHdoaWxlKCpwIHx8IGF2cHJpdl9hdG9taWNfcHRyX2Nhcygodm9pZCAqIHZvbGF0aWxlICopcCwgTlVMTCwgZm9ybWF0KSkKLSAgICAgICAgcCA9ICYoKnApLT5uZXh0OwotICAgIGxhc3Rfb2Zvcm1hdCA9ICZmb3JtYXQtPm5leHQ7Ci19CiAKIGludCBhdl9tYXRjaF9leHQoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnMpCiB7CkBAIC05NCw3ICs1MSw5IEBACiBBVk91dHB1dEZvcm1hdCAqYXZfZ3Vlc3NfZm9ybWF0KGNvbnN0IGNoYXIgKnNob3J0X25hbWUsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lX3R5cGUpCiB7Ci0gICAgQVZPdXRwdXRGb3JtYXQgKmZtdCA9IE5VTEwsICpmbXRfZm91bmQ7CisgICAgY29uc3QgQVZPdXRwdXRGb3JtYXQgKmZtdCA9IE5VTEw7CisgICAgQVZPdXRwdXRGb3JtYXQgKmZtdF9mb3VuZCA9IE5VTEw7CisgICAgdm9pZCAqaSA9IDA7CiAgICAgaW50IHNjb3JlX21heCwgc2NvcmU7CiAKICAgICAvKiBzcGVjaWZpYyB0ZXN0IGZvciBpbWFnZSBzZXF1ZW5jZXMgKi8KQEAgLTEwNiw5ICs2NSw4IEBACiAgICAgfQogI2VuZGlmCiAgICAgLyogRmluZCB0aGUgcHJvcGVyIGZpbGUgdHlwZS4gKi8KLSAgICBmbXRfZm91bmQgPSBOVUxMOwogICAgIHNjb3JlX21heCA9IDA7Ci0gICAgd2hpbGUgKChmbXQgPSBhdl9vZm9ybWF0X25leHQoZm10KSkpIHsKKyAgICB3aGlsZSAoKGZtdCA9IGF2X211eGVyX2l0ZXJhdGUoJmkpKSkgewogICAgICAgICBzY29yZSA9IDA7CiAgICAgICAgIGlmIChmbXQtPm5hbWUgJiYgc2hvcnRfbmFtZSAmJiBhdl9tYXRjaF9uYW1lKHNob3J0X25hbWUsIGZtdC0+bmFtZSkpCiAgICAgICAgICAgICBzY29yZSArPSAxMDA7CkBAIC0xMjAsNyArNzgsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChzY29yZSA+IHNjb3JlX21heCkgewogICAgICAgICAgICAgc2NvcmVfbWF4ID0gc2NvcmU7Ci0gICAgICAgICAgICBmbXRfZm91bmQgPSBmbXQ7CisgICAgICAgICAgICBmbXRfZm91bmQgPSAoQVZPdXRwdXRGb3JtYXQqKWZtdDsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZm10X2ZvdW5kOwpAQCAtMTU5LDEwICsxMTcsMTEgQEAKIAogQVZJbnB1dEZvcm1hdCAqYXZfZmluZF9pbnB1dF9mb3JtYXQoY29uc3QgY2hhciAqc2hvcnRfbmFtZSkKIHsKLSAgICBBVklucHV0Rm9ybWF0ICpmbXQgPSBOVUxMOwotICAgIHdoaWxlICgoZm10ID0gYXZfaWZvcm1hdF9uZXh0KGZtdCkpKQorICAgIGNvbnN0IEFWSW5wdXRGb3JtYXQgKmZtdCA9IE5VTEw7CisgICAgdm9pZCAqaSA9IDA7CisgICAgd2hpbGUgKChmbXQgPSBhdl9kZW11eGVyX2l0ZXJhdGUoJmkpKSkKICAgICAgICAgaWYgKGF2X21hdGNoX25hbWUoc2hvcnRfbmFtZSwgZm10LT5uYW1lKSkKLSAgICAgICAgICAgIHJldHVybiBmbXQ7CisgICAgICAgICAgICByZXR1cm4gKEFWSW5wdXRGb3JtYXQqKWZtdDsKICAgICByZXR1cm4gTlVMTDsKIH0KIApAQCAtMTcwLDggKzEyOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNjb3JlX3JldCkKIHsKICAgICBBVlByb2JlRGF0YSBscGQgPSAqcGQ7Ci0gICAgQVZJbnB1dEZvcm1hdCAqZm10MSA9IE5VTEwsICpmbXQ7CisgICAgY29uc3QgQVZJbnB1dEZvcm1hdCAqZm10MSA9IE5VTEw7CisgICAgQVZJbnB1dEZvcm1hdCAqZm10ID0gTlVMTDsKICAgICBpbnQgc2NvcmUsIHNjb3JlX21heCA9IDA7CisgICAgdm9pZCAqaSA9IDA7CiAgICAgY29uc3Qgc3RhdGljIHVpbnQ4X3QgemVyb2J1ZmZlcltBVlBST0JFX1BBRERJTkdfU0laRV07CiAgICAgZW51bSBub2RhdCB7CiAgICAgICAgIE5PX0lEMywKQEAgLTE5Niw4ICsxNTcsNyBAQAogICAgICAgICAgICAgbm9kYXQgPSBJRDNfR1JFQVRFUl9QUk9CRTsKICAgICB9CiAKLSAgICBmbXQgPSBOVUxMOwotICAgIHdoaWxlICgoZm10MSA9IGF2X2lmb3JtYXRfbmV4dChmbXQxKSkpIHsKKyAgICB3aGlsZSAoKGZtdDEgPSBhdl9kZW11eGVyX2l0ZXJhdGUoJmkpKSkgewogICAgICAgICBpZiAoIWlzX29wZW5lZCA9PSAhKGZtdDEtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSAmJiBzdHJjbXAoZm10MS0+bmFtZSwgImltYWdlMiIpKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIHNjb3JlID0gMDsKQEAgLTIyMywxMSArMTgzLDE1IEBACiAgICAgICAgICAgICBpZiAoYXZfbWF0Y2hfZXh0KGxwZC5maWxlbmFtZSwgZm10MS0+ZXh0ZW5zaW9ucykpCiAgICAgICAgICAgICAgICAgc2NvcmUgPSBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKICAgICAgICAgfQotICAgICAgICBpZiAoYXZfbWF0Y2hfbmFtZShscGQubWltZV90eXBlLCBmbXQxLT5taW1lX3R5cGUpKQotICAgICAgICAgICAgc2NvcmUgPSBGRk1BWChzY29yZSwgQVZQUk9CRV9TQ09SRV9NSU1FKTsKKyAgICAgICAgaWYgKGF2X21hdGNoX25hbWUobHBkLm1pbWVfdHlwZSwgZm10MS0+bWltZV90eXBlKSkgeworICAgICAgICAgICAgaWYgKEFWUFJPQkVfU0NPUkVfTUlNRSA+IHNjb3JlKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIlByb2JpbmcgJXMgc2NvcmU6JWQgaW5jcmVhc2VkIHRvICVkIGR1ZSB0byBNSU1FIHR5cGVcbiIsIGZtdDEtPm5hbWUsIHNjb3JlLCBBVlBST0JFX1NDT1JFX01JTUUpOworICAgICAgICAgICAgICAgIHNjb3JlID0gQVZQUk9CRV9TQ09SRV9NSU1FOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChzY29yZSA+IHNjb3JlX21heCkgewogICAgICAgICAgICAgc2NvcmVfbWF4ID0gc2NvcmU7Ci0gICAgICAgICAgICBmbXQgICAgICAgPSBmbXQxOworICAgICAgICAgICAgZm10ICAgICAgID0gKEFWSW5wdXRGb3JtYXQqKWZtdDE7CiAgICAgICAgIH0gZWxzZSBpZiAoc2NvcmUgPT0gc2NvcmVfbWF4KQogICAgICAgICAgICAgZm10ID0gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9mcmFtZWNyY2VuYy5jIGIvbGliYXZmb3JtYXQvZnJhbWVjcmNlbmMuYwppbmRleCBlYWNiYzQ1Li5hNTY3YjUyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9mcmFtZWNyY2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2ZyYW1lY3JjZW5jLmMKQEAgLTMxLDExICszMSwxMSBAQAogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gc3QtPmNvZGVjOwotICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YSkgewotICAgICAgICAgICAgdWludDMyX3QgY3JjID0gYXZfYWRsZXIzMl91cGRhdGUoMCwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKKyAgICAgICAgaWYgKHBhci0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICB1aW50MzJfdCBjcmMgPSBhdl9hZGxlcjMyX3VwZGF0ZSgwLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAgICAgICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNleHRyYWRhdGEgJWQ6ICU4ZCwgMHglMDgiUFJJeDMyIlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSwgY3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIHBhci0+ZXh0cmFkYXRhX3NpemUsIGNyYyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5zaWRlX2RhdGFbaV0uZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5zaWRlX2RhdGFbaV0uc2l6ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdl9zdHJsY2F0ZihidWYsIHNpemVvZihidWYpLCAiLCAlOGQsIDB4JTA4eCIsIHBrdC0+c2lkZV9kYXRhW2ldLnNpemUsIHNpZGVfZGF0YV9jcmMpOworICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmLCBzaXplb2YoYnVmKSwgIiwgJThkLCAweCUwOCJQUkl4MzIsIHBrdC0+c2lkZV9kYXRhW2ldLnNpemUsIHNpZGVfZGF0YV9jcmMpOwogICAgICAgICB9CiAgICAgfQogICAgIGF2X3N0cmxjYXRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJcbiIpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZnJhbWVoYXNoLmMgYi9saWJhdmZvcm1hdC9mcmFtZWhhc2guYwppbmRleCBhODM1N2IwLi4zYWU5MDkyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9mcmFtZWhhc2guYworKysgYi9saWJhdmZvcm1hdC9mcmFtZWhhc2guYwpAQCAtMjgsNyArMjgsMjMgQEAKICAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIjc29mdHdhcmU6ICVzXG4iLCBMSUJBVkZPUk1BVF9JREVOVCk7CiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqYXZjdHggPSBzdC0+Y29kZWNwYXI7CisgICAgICAgIGNoYXIgYnVmWzI1Nl0gPSB7IDAgfTsKICAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIjdGIgJWQ6ICVkLyVkXG4iLCBpLCBzdC0+dGltZV9iYXNlLm51bSwgc3QtPnRpbWVfYmFzZS5kZW4pOworICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNtZWRpYV90eXBlICVkOiAlc1xuIiwgaSwgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKGF2Y3R4LT5jb2RlY190eXBlKSk7CisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiI2NvZGVjX2lkICVkOiAlc1xuIiwgaSwgYXZjb2RlY19nZXRfbmFtZShhdmN0eC0+Y29kZWNfaWQpKTsKKyAgICAgICAgc3dpdGNoIChhdmN0eC0+Y29kZWNfdHlwZSkgeworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKKyAgICAgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgYXZjdHgtPmNoYW5uZWxzLCBhdmN0eC0+Y2hhbm5lbF9sYXlvdXQpOworICAgICAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIjc2FtcGxlX3JhdGUgJWQ6ICVkXG4iLCBpLGF2Y3R4LT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNjaGFubmVsX2xheW91dCAlZDogJSJQUkl4NjQiXG4iLCBpLGF2Y3R4LT5jaGFubmVsX2xheW91dCk7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNjaGFubmVsX2xheW91dF9uYW1lICVkOiAlc1xuIiwgaSwgYnVmKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiI2RpbWVuc2lvbnMgJWQ6ICVkeCVkXG4iLCBpLCBhdmN0eC0+d2lkdGgsIGF2Y3R4LT5oZWlnaHQpOworICAgICAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIjc2FyICVkOiAlZC8lZFxuIiwgaSwgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLCBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgYXZpb19mbHVzaChzLT5wYik7CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZnJtZGVjLmMgYi9saWJhdmZvcm1hdC9mcm1kZWMuYwppbmRleCAyNjBhZmJjLi4yZjZiNzI2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9mcm1kZWMuYworKysgYi9saWJhdmZvcm1hdC9mcm1kZWMuYwpAQCAtNTgsMzAgKzU4LDMwIEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkFXVklERU87CiAgICAgYXZpb19za2lwKHBiLCAzKTsKIAotICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCAgICA9IGF2cHJpdl9maW5kX3BpeF9mbXQoZnJtX3BpeF9mbXRfdGFncywgYXZpb19yOChwYikpOwotICAgIGlmICghc3QtPmNvZGVjLT5waXhfZm10KQorICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgID0gYXZwcml2X2ZpbmRfcGl4X2ZtdChmcm1fcGl4X2ZtdF90YWdzLCBhdmlvX3I4KHBiKSk7CisgICAgaWYgKCFzdC0+Y29kZWNwYXItPmZvcm1hdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2aW9fcmwxNihwYik7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSAwOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gYXZpb19ybDE2KHBiKTsKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBmcm1fcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBGcm1Db250ZXh0ICpzID0gYXZjdHgtPnByaXZfZGF0YTsKLSAgICBBVkNvZGVjQ29udGV4dCAqc3RjID0gYXZjdHgtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgaW50IHBhY2tldF9zaXplLCByZXQ7CiAKICAgICBpZiAocy0+Y291bnQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKIAotICAgIHBhY2tldF9zaXplID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKHN0Yy0+cGl4X2ZtdCwgc3RjLT53aWR0aCwgc3RjLT5oZWlnaHQsIDEpOworICAgIHBhY2tldF9zaXplID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKHBhci0+Zm9ybWF0LCBwYXItPndpZHRoLCBwYXItPmhlaWdodCwgMSk7CiAgICAgaWYgKHBhY2tldF9zaXplIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKQEAgLTg5LDcgKzg5LDcgQEAKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIGlmIChzdGMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1JBKSB7CisgICAgaWYgKHBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfQkdSQSkgewogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gMzsgaSArIDEgPD0gcGt0LT5zaXplOyBpICs9IDQpCiAgICAgICAgICAgICBwa3QtPmRhdGFbaV0gPSAweEZGIC0gcGt0LT5kYXRhW2ldOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZnNiLmMgYi9saWJhdmZvcm1hdC9mc2IuYwppbmRleCAyODM3YzE5Li40ZjU5NTc2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9mc2IuYworKysgYi9saWJhdmZvcm1hdC9mc2IuYwpAQCAtMzksNyArMzksNyBAQAogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogICAgIHVuc2lnbmVkIGZvcm1hdCwgdmVyc2lvbiwgYzsKICAgICBpbnQ2NF90IG9mZnNldDsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogCiAgICAgYXZpb19za2lwKHBiLCAzKTsgLy8gIkZTQiIKQEAgLTUzLDkgKzUzLDkgQEAKIAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgY29kZWMgPSBzdC0+Y29kZWM7Ci0gICAgY29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIGNvZGVjLT5jb2RlY190YWcgICA9IDA7CisgICAgcGFyID0gc3QtPmNvZGVjcGFyOworICAgIHBhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgcGFyLT5jb2RlY190YWcgICA9IDA7CiAKICAgICBpZiAodmVyc2lvbiA9PSAzKSB7CiAgICAgICAgIG9mZnNldCA9IGF2aW9fcmwzMihwYikgKyAweDE4OwpAQCAtNjMsMzUgKzYzLDM1IEBACiAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2aW9fcmwzMihwYik7CiAgICAgICAgIGF2aW9fc2tpcChwYiwgMTIpOwogICAgICAgICBmb3JtYXQgPSBhdmlvX3JsMzIocGIpOwotICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOwotICAgICAgICBpZiAoY29kZWMtPnNhbXBsZV9yYXRlIDw9IDApCisgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAocGFyLT5zYW1wbGVfcmF0ZSA8PSAwKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGF2aW9fc2tpcChwYiwgNik7Ci0gICAgICAgIGNvZGVjLT5jaGFubmVscyAgICA9IGF2aW9fcmwxNihwYik7Ci0gICAgICAgIGlmICghY29kZWMtPmNoYW5uZWxzKQorICAgICAgICBwYXItPmNoYW5uZWxzICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgaWYgKCFwYXItPmNoYW5uZWxzKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgaWYgKGZvcm1hdCAmIDB4MDAwMDAxMDApIHsKLSAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKLSAgICAgICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IDQwOTYgKiBjb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgICAgICBwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICAgICAgcGFyLT5ibG9ja19hbGlnbiA9IDQwOTYgKiBwYXItPmNoYW5uZWxzOwogICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCAmIDB4MDA0MDAwMDApIHsKLSAgICAgICAgICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OwotICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVjsKLSAgICAgICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IDM2ICogY29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OworICAgICAgICAgICAgcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVY7CisgICAgICAgICAgICBwYXItPmJsb2NrX2FsaWduID0gMzYgKiBwYXItPmNoYW5uZWxzOwogICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCAmIDB4MDA4MDAwMDApIHsKLSAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX1BTWDsKLSAgICAgICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IDE2ICogY29kZWMtPmNoYW5uZWxzOworICAgICAgICAgICAgcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX1BTWDsKKyAgICAgICAgICAgIHBhci0+YmxvY2tfYWxpZ24gPSAxNiAqIHBhci0+Y2hhbm5lbHM7CiAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ICYgMHgwMjAwMDAwMCkgewotICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fVEhQOwotICAgICAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gOCAqIGNvZGVjLT5jaGFubmVsczsKLSAgICAgICAgICAgIGlmIChjb2RlYy0+Y2hhbm5lbHMgPiBJTlRfTUFYIC8gMzIpCisgICAgICAgICAgICBwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fVEhQOworICAgICAgICAgICAgcGFyLT5ibG9ja19hbGlnbiA9IDggKiBwYXItPmNoYW5uZWxzOworICAgICAgICAgICAgaWYgKHBhci0+Y2hhbm5lbHMgPiBJTlRfTUFYIC8gMzIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICBmZl9hbGxvY19leHRyYWRhdGEoY29kZWMsIDMyICogY29kZWMtPmNoYW5uZWxzKTsKLSAgICAgICAgICAgIGlmICghY29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgIGZmX2FsbG9jX2V4dHJhZGF0YShwYXIsIDMyICogcGFyLT5jaGFubmVscyk7CisgICAgICAgICAgICBpZiAoIXBhci0+ZXh0cmFkYXRhKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIDB4NjgsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjb2RlYy0+Y2hhbm5lbHM7IGMrKykgewotICAgICAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgY29kZWMtPmV4dHJhZGF0YSArIDMyICogYywgMzIpOworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHBhci0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgcGFyLT5leHRyYWRhdGEgKyAzMiAqIGMsIDMyKTsKICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDE0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKQEAgLTEwOSw0NSArMTA5LDQ1IEBACiAgICAgICAgIGNhc2UgMHgwMDAwMTAwNToKICAgICAgICAgY2FzZSAweDQwMDAxMDgxOgogICAgICAgICBjYXNlIDB4NDAyMDAwMDE6Ci0gICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9YTUEyOworICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1hNQTI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDQwMDAwODAyOgotICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fVEhQOworICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX1RIUDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJmb3JtYXQgMHglWCIsIGZvcm1hdCk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgIH0KIAotICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOwotICAgICAgICBpZiAoY29kZWMtPnNhbXBsZV9yYXRlIDw9IDApCisgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAocGFyLT5zYW1wbGVfcmF0ZSA8PSAwKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGF2aW9fc2tpcChwYiwgNik7CiAKLSAgICAgICAgY29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19ybDE2KHBiKTsKLSAgICAgICAgaWYgKCFjb2RlYy0+Y2hhbm5lbHMpCisgICAgICAgIHBhci0+Y2hhbm5lbHMgICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICBpZiAoIXBhci0+Y2hhbm5lbHMpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgICAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICBzd2l0Y2ggKHBhci0+Y29kZWNfaWQpIHsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9YTUEyOgotICAgICAgICAgICAgZmZfYWxsb2NfZXh0cmFkYXRhKGNvZGVjLCAzNCk7Ci0gICAgICAgICAgICBpZiAoIWNvZGVjLT5leHRyYWRhdGEpCisgICAgICAgICAgICBmZl9hbGxvY19leHRyYWRhdGEocGFyLCAzNCk7CisgICAgICAgICAgICBpZiAoIXBhci0+ZXh0cmFkYXRhKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBtZW1zZXQoY29kZWMtPmV4dHJhZGF0YSwgMCwgMzQpOwotICAgICAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gMjA0ODsKKyAgICAgICAgICAgIG1lbXNldChwYXItPmV4dHJhZGF0YSwgMCwgMzQpOworICAgICAgICAgICAgcGFyLT5ibG9ja19hbGlnbiA9IDIwNDg7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9USFA6Ci0gICAgICAgICAgICBpZiAoY29kZWMtPmNoYW5uZWxzID4gSU5UX01BWCAvIDMyKQorICAgICAgICAgICAgaWYgKHBhci0+Y2hhbm5lbHMgPiBJTlRfTUFYIC8gMzIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICBmZl9hbGxvY19leHRyYWRhdGEoY29kZWMsIDMyICogY29kZWMtPmNoYW5uZWxzKTsKLSAgICAgICAgICAgIGlmICghY29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgICAgIGZmX2FsbG9jX2V4dHJhZGF0YShwYXIsIDMyICogcGFyLT5jaGFubmVscyk7CisgICAgICAgICAgICBpZiAoIXBhci0+ZXh0cmFkYXRhKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIDB4ODAsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBjb2RlYy0+Y2hhbm5lbHM7IGMrKykgewotICAgICAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgY29kZWMtPmV4dHJhZGF0YSArIDMyICogYywgMzIpOworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IHBhci0+Y2hhbm5lbHM7IGMrKykgeworICAgICAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgcGFyLT5leHRyYWRhdGEgKyAzMiAqIGMsIDMyKTsKICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDE0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IDggKiBjb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgICAgICBwYXItPmJsb2NrX2FsaWduID0gOCAqIHBhci0+Y2hhbm5lbHM7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0xNTcsMTQgKzE1NywxNCBAQAogICAgIGF2aW9fc2tpcChwYiwgb2Zmc2V0IC0gYXZpb190ZWxsKHBiKSk7CiAgICAgcy0+aW50ZXJuYWwtPmRhdGFfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBjb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGZzYl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogICAgIGludDY0X3QgcG9zOwogICAgIGludCByZXQ7CiAKQEAgLTE3MiwyNSArMTcyLDI1IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKIAogICAgIHBvcyA9IGF2aW9fdGVsbChzLT5wYik7Ci0gICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFAgJiYKLSAgICAgICAgICAgICAgIGNvZGVjLT5jaGFubmVscyA+IDEpIHsKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFAgJiYKKyAgICAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgPiAxKSB7CiAgICAgICAgIGludCBpLCBjaDsKIAotICAgICAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgY29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHBhci0+YmxvY2tfYWxpZ24pOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNvZGVjLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcGFyLT5jaGFubmVsczsgY2grKykgewogICAgICAgICAgICAgICAgIHBrdC0+ZGF0YVtjaCAqIDggKyBpICogMiArIDBdID0gYXZpb19yOChzLT5wYik7CiAgICAgICAgICAgICAgICAgcGt0LT5kYXRhW2NoICogOCArIGkgKiAyICsgMV0gPSBhdmlvX3I4KHMtPnBiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXQgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgY29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBwYXItPmJsb2NrX2FsaWduKTsKICAgICB9CiAKLSAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1hNQTIgJiYgcGt0LT5zaXplID49IDEpCisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWE1BMiAmJiBwa3QtPnNpemUgPj0gMSkKICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IChwa3QtPmRhdGFbMF0gPj4gMikgKiA1MTI7CiAKICAgICBwa3QtPnBvcyA9IHBvczsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2Z0cC5jIGIvbGliYXZmb3JtYXQvZnRwLmMKaW5kZXggYzJhNjBmNi4uYmE2NGFiYiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZnRwLmMKKysrIGIvbGliYXZmb3JtYXQvZnRwLmMKQEAgLTIwNiw2ICsyMDYsOSBAQAogICAgIGlmIChyZXNwb25zZSkKICAgICAgICAgKnJlc3BvbnNlID0gTlVMTDsKIAorICAgIGlmICghcy0+Y29ubl9jb250cm9sKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCiAgICAgaWYgKChlcnIgPSBmZnVybF93cml0ZShzLT5jb25uX2NvbnRyb2wsIGNvbW1hbmQsIHN0cmxlbihjb21tYW5kKSkpIDwgMCkKICAgICAgICAgcmV0dXJuIGVycjsKICAgICBpZiAoIWVycikKQEAgLTM4Niw3ICszODksNyBAQAogICAgIHN0YXRpYyBjb25zdCBpbnQgc2l6ZV9jb2Rlc1tdID0gezIxMywgMH07CiAKICAgICBzbnByaW50Zihjb21tYW5kLCBzaXplb2YoY29tbWFuZCksICJTSVpFICVzXHJcbiIsIHMtPnBhdGgpOwotICAgIGlmIChmdHBfc2VuZF9jb21tYW5kKHMsIGNvbW1hbmQsIHNpemVfY29kZXMsICZyZXMpID09IDIxMyAmJiByZXMpIHsKKyAgICBpZiAoZnRwX3NlbmRfY29tbWFuZChzLCBjb21tYW5kLCBzaXplX2NvZGVzLCAmcmVzKSA9PSAyMTMgJiYgcmVzICYmIHN0cmxlbihyZXMpID4gNCkgewogICAgICAgICBzLT5maWxlc2l6ZSA9IHN0cnRvbGwoJnJlc1s0XSwgTlVMTCwgMTApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHMtPmZpbGVzaXplID0gLTE7CkBAIC00MDEsMTAgKzQwNCwxMiBAQAogc3RhdGljIGludCBmdHBfcmV0cmlldmUoRlRQQ29udGV4dCAqcykKIHsKICAgICBjaGFyIGNvbW1hbmRbQ09OVFJPTF9CVUZGRVJfU0laRV07Ci0gICAgc3RhdGljIGNvbnN0IGludCByZXRyX2NvZGVzW10gPSB7MTUwLCAwfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHJldHJfY29kZXNbXSA9IHsxNTAsIDEyNSwgMH07CisgICAgaW50IHJlc3BfY29kZTsKIAogICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgIlJFVFIgJXNcclxuIiwgcy0+cGF0aCk7Ci0gICAgaWYgKGZ0cF9zZW5kX2NvbW1hbmQocywgY29tbWFuZCwgcmV0cl9jb2RlcywgTlVMTCkgIT0gMTUwKQorICAgIHJlc3BfY29kZSA9IGZ0cF9zZW5kX2NvbW1hbmQocywgY29tbWFuZCwgcmV0cl9jb2RlcywgTlVMTCk7CisgICAgaWYgKHJlc3BfY29kZSAhPSAxMjUgJiYgcmVzcF9jb2RlICE9IDE1MCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAogICAgIHMtPnN0YXRlID0gRE9XTkxPQURJTkc7CkBAIC00MTUsMTAgKzQyMCwxMiBAQAogc3RhdGljIGludCBmdHBfc3RvcmUoRlRQQ29udGV4dCAqcykKIHsKICAgICBjaGFyIGNvbW1hbmRbQ09OVFJPTF9CVUZGRVJfU0laRV07Ci0gICAgc3RhdGljIGNvbnN0IGludCBzdG9yX2NvZGVzW10gPSB7MTUwLCAwfTsKKyAgICBzdGF0aWMgY29uc3QgaW50IHN0b3JfY29kZXNbXSA9IHsxNTAsIDEyNSwgMH07CisgICAgaW50IHJlc3BfY29kZTsKIAogICAgIHNucHJpbnRmKGNvbW1hbmQsIHNpemVvZihjb21tYW5kKSwgIlNUT1IgJXNcclxuIiwgcy0+cGF0aCk7Ci0gICAgaWYgKGZ0cF9zZW5kX2NvbW1hbmQocywgY29tbWFuZCwgc3Rvcl9jb2RlcywgTlVMTCkgIT0gMTUwKQorICAgIHJlc3BfY29kZSA9IGZ0cF9zZW5kX2NvbW1hbmQocywgY29tbWFuZCwgc3Rvcl9jb2RlcywgTlVMTCk7CisgICAgaWYgKHJlc3BfY29kZSAhPSAxMjUgJiYgcmVzcF9jb2RlICE9IDE1MCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAogICAgIHMtPnN0YXRlID0gVVBMT0FESU5HOwpAQCAtNTM5LDcgKzU0Niw3IEBACiAgICAgICAgIH0gLyogaWYgb3B0aW9uIGlzIG5vdCBnaXZlbiwgZG9uJ3QgcGFzcyBpdCBhbmQgbGV0IHRjcCB1c2UgaXRzIG93biBkZWZhdWx0ICovCiAgICAgICAgIGVyciA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZzLT5jb25uX2NvbnRyb2wsIGJ1ZiwgQVZJT19GTEFHX1JFQURfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssICZvcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcm90b2NvbF93aGl0ZWxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaCk7CiAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CiAgICAgICAgIGlmIChlcnIgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IG9wZW4gY29udHJvbCBjb25uZWN0aW9uXG4iKTsKQEAgLTU5Myw3ICs2MDAsNyBAQAogICAgICAgICB9IC8qIGlmIG9wdGlvbiBpcyBub3QgZ2l2ZW4sIGRvbid0IHBhc3MgaXQgYW5kIGxldCB0Y3AgdXNlIGl0cyBvd24gZGVmYXVsdCAqLwogICAgICAgICBlcnIgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmcy0+Y29ubl9kYXRhLCBidWYsIGgtPmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpOwogICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwogICAgICAgICBpZiAoZXJyIDwgMCkKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC03NzYsMTMgKzc4MywxMyBAQAogICAgIGlmIChzLT5zdGF0ZSA9PSBESVNDT05ORUNURUQpIHsKICAgICAgICAgLyogb3B0aW1pemF0aW9uICovCiAgICAgICAgIGlmIChzLT5wb3NpdGlvbiA+PSBzLT5maWxlc2l6ZSkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogICAgICAgICBpZiAoKGVyciA9IGZ0cF9jb25uZWN0X2RhdGFfY29ubmVjdGlvbihoKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAgICAgaWYgKHMtPnN0YXRlID09IFJFQURZKSB7CiAgICAgICAgIGlmIChzLT5wb3NpdGlvbiA+PSBzLT5maWxlc2l6ZSkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogICAgICAgICBpZiAoKGVyciA9IGZ0cF9yZXRyaWV2ZShzKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC0xMDk5LDcgKzExMDYsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLVVSTFByb3RvY29sIGZmX2Z0cF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX2Z0cF9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJmdHAiLAogICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gZnRwX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSBmdHBfcmVhZCwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2c3MjIuYyBiL2xpYmF2Zm9ybWF0L2c3MjIuYwppbmRleCAxYTg3YzdkLi4yZmVlYzAxIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9nNzIyLmMKKysrIGIvbGliYXZmb3JtYXQvZzcyMi5jCkBAIC0zMiwxNyArMzIsMTcgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fRzcyMjsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gMTYwMDA7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IDE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fRzcyMjsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IDE7CiAKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9Ci0gICAgICAgIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPQorICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogCi0gICAgYXZfYXNzZXJ0MChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA+IDApOworICAgIGF2X2Fzc2VydDAoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPiAwKTsKIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2c3MjNfMS5jIGIvbGliYXZmb3JtYXQvZzcyM18xLmMKaW5kZXggNjYxZTdiZC4uMjdjOGMzOSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZzcyM18xLmMKKysrIGIvbGliYXZmb3JtYXQvZzcyM18xLmMKQEAgLTM5LDEzICszOSwxMyBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9HNzIzXzE7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAxOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgPSA4MDAwOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICA9IEFWX0NPREVDX0lEX0c3MjNfMTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICA9IDgwMDA7CiAKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIHN0LT5zdGFydF90aW1lID0gMDsKIAogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZzcyNi5jIGIvbGliYXZmb3JtYXQvZzcyNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYTk0MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9nNzI2LmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBHLjcyNiByYXcgZGVtdXhlcgorICogQ29weXJpZ2h0IDIwMTcgQ2FybCBFdWdlbiBIb3lvcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgRzcyNkNvbnRleHQgeworICAgIEFWQ2xhc3MgKmNsYXNzOworICAgIGludCBjb2RlX3NpemU7CisgICAgaW50IHNhbXBsZV9yYXRlOworfSBHNzI2Q29udGV4dDsKKworc3RhdGljIGludCBnNzI2X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBHNzI2Q29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworCisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSBjLT5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGMtPmNvZGVfc2l6ZTsKKyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlICAgICAgICAgICAgICA9ICgoaW50W10peyAxNjAwMCwgMjQwMDAsIDMyMDAwLCA0MDAwMCB9KVtjLT5jb2RlX3NpemUgLSAyXTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgICAgICAgICA9IDE7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnNzI2X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmVzOworICAgIHJlcyA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgMTAyMCk7IC8vIGEgc2l6ZSBzaW1pbGFyIHRvIFJBV19QQUNLRVRfU0laRSBkaXZpc2libGUgYnkgYWxsIGNvZGVfc2l6ZSB2YWx1ZXMKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRzcyNkNvbnRleHQsIHgpCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgImNvZGVfc2l6ZSIsICJCaXRzIHBlciBHLjcyNiBjb2RlIiwKKyAgICAgICAgT0ZGU0VUKGNvZGVfc2l6ZSksICAgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9ICAgIDR9LCAyLCAgICAgICA1LCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsgInNhbXBsZV9yYXRlIiwgIiIsCisgICAgICAgIE9GRlNFVChzYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA4MDAwfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKKyAgICB7IE5VTEwgfSwKK307CisKKyNpZiBDT05GSUdfRzcyNl9ERU1VWEVSCitzdGF0aWMgY29uc3QgQVZDbGFzcyBnNzI2bGVfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiRy43MjYgYmlnLWVuZGlhbiBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfZzcyNl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnNzI2IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IGJpZy1lbmRpYW4gRy43MjYgKFwibGVmdCBhbGlnbmVkXCIpIiksCisgICAgLnJlYWRfaGVhZGVyICAgID0gZzcyNl9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBnNzI2X3JlYWRfcGFja2V0LAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihHNzI2Q29udGV4dCksCisgICAgLnByaXZfY2xhc3MgICAgID0gJmc3MjZsZV9kZW11eGVyX2NsYXNzLAorICAgIC5yYXdfY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjYsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfRzcyNkxFX0RFTVVYRVIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGc3MjZfZGVtdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiRy43MjYgbGl0dGxlLWVuZGlhbiBkZW11eGVyIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK0FWSW5wdXRGb3JtYXQgZmZfZzcyNmxlX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gImc3MjZsZSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBsaXR0bGUtZW5kaWFuIEcuNzI2IChcInJpZ2h0IGFsaWduZWRcIikiKSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBnNzI2X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGc3MjZfcmVhZF9wYWNrZXQsCisgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEc3MjZDb250ZXh0KSwKKyAgICAucHJpdl9jbGFzcyAgICAgPSAmZzcyNl9kZW11eGVyX2NsYXNzLAorICAgIC5yYXdfY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjZMRSwKK307CisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZzcyOWRlYy5jIGIvbGliYXZmb3JtYXQvZzcyOWRlYy5jCmluZGV4IDM0OWEwMTQuLjdiNjdmYzQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2c3MjlkZWMuYworKysgYi9saWJhdmZvcm1hdC9nNzI5ZGVjLmMKQEAgLTE5LDEzICsxOSwxNSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKLSNpbmNsdWRlICJhdmZvcm1hdC5oIgotI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKIAorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwogdHlwZWRlZiBzdHJ1Y3QgRzcyOURlbXV4ZXJDb250ZXh0IHsKICAgICBBVkNsYXNzICpjbGFzczsKKwogICAgIGludCBiaXRfcmF0ZTsKIH0gRzcyOURlbXV4ZXJDb250ZXh0OwogCkBAIC0zOCw0OSArNDAsNDkgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9HNzI5OwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA4MDAwOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0c3Mjk7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IDE7CiAKLSAgICBpZiAoczEgJiYgczEtPmJpdF9yYXRlKSB7CisgICAgaWYgKHMxICYmIHMxLT5iaXRfcmF0ZSkKICAgICAgICAgcy0+Yml0X3JhdGUgPSBzMS0+Yml0X3JhdGU7CisKKyAgICBzd2l0Y2gocy0+Yml0X3JhdGUpIHsKKyAgICBjYXNlIDY0MDA6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSA4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIDgwMDA6CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYml0X3JhdGUgdmFsdWUgJSJQUklkNjQiLiAiCisgICAgICAgICAgICAgICAiT25seSA2NDAwIGFuZCA4MDAwIGIvcyBhcmUgc3VwcG9ydGVkLiIsIHMtPmJpdF9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBpZiAocy0+Yml0X3JhdGUgPT0gMCkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiTm8gYml0cmF0ZSBzcGVjaWZpZWQuIEFzc3VtaW5nIDgwMDAgYi9zXG4iKTsKLSAgICAgICAgcy0+Yml0X3JhdGUgPSA4MDAwOwotICAgIH0KKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduIDw8IDMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAotICAgIGlmIChzLT5iaXRfcmF0ZSA9PSA2NDAwKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSA4OwotICAgIH0gZWxzZSBpZiAocy0+Yml0X3JhdGUgPT0gODAwMCkgewotICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk9ubHkgODAwMCBiL3MgYW5kIDY0MDAgYi9zIGJpdHJhdGVzIGFyZSBzdXBwb3J0ZWQuIFByb3ZpZGVkOiAlIlBSSWQ2NCIgYi9zXG4iLCAoaW50NjRfdClzLT5iaXRfcmF0ZSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIH0KLQotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPDwgMywgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CiAgICAgcmV0dXJuIDA7CiB9CisKIHN0YXRpYyBpbnQgZzcyOV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgaW50IHJldDsKLQotICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmJsb2NrX2FsaWduKTsKLQotICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIGludCByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgcGt0LT5kdHMgPSBwa3QtPnB0cyA9IHBrdC0+cG9zIC8gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmJsb2NrX2FsaWduOworICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKKyAgICBwa3QtPmR0cyA9IHBrdC0+cHRzID0gcGt0LT5wb3MgLyBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduOwogCi0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gMDsKIH0KIAorI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoRzcyOURlbXV4ZXJDb250ZXh0LCB4KQogc3RhdGljIGNvbnN0IEFWT3B0aW9uIGc3Mjlfb3B0aW9uc1tdID0gewotICAgIHsgImJpdF9yYXRlIiwgIiIsIG9mZnNldG9mKEc3MjlEZW11eGVyQ29udGV4dCwgYml0X3JhdGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiYml0X3JhdGUiLCAiIiwgT0ZGU0VUKGJpdF9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSA4MDAwIH0sIDAsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCiAgICAgeyBOVUxMIH0sCiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9nZHYuYyBiL2xpYmF2Zm9ybWF0L2dkdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYWQzODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9nZHYuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqIEdyZW1saW4gRGlnaXRhbCBWaWRlbyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW8uaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBHRFZDb250ZXh0IHsKKyAgICBpbnQgaXNfZmlyc3RfdmlkZW87CisgICAgaW50IGlzX2F1ZGlvOworICAgIGludCBhdWRpb19zaXplOworICAgIGludCBhdWRpb19zdHJlYW1faW5kZXg7CisgICAgaW50IHZpZGVvX3N0cmVhbV9pbmRleDsKKyAgICB1bnNpZ25lZCBwYWxbMjU2XTsKK30gR0RWQ29udGV4dDsKKworc3RhdGljIGludCBnZHZfcmVhZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAoQVZfUkwzMihwLT5idWYpID09IDB4MjkxMTE5OTQpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHsKKyAgICB1aW50MTZfdCBpZDsKKyAgICB1aW50MTZfdCB3aWR0aDsKKyAgICB1aW50MTZfdCBoZWlnaHQ7Cit9IEZpeGVkU2l6ZVtdID0geworICAgIHsgMCwgMzIwLCAyMDB9LAorICAgIHsgMSwgNjQwLCAyMDB9LAorICAgIHsgMiwgMzIwLCAxNjd9LAorICAgIHsgMywgMzIwLCAxODB9LAorICAgIHsgNCwgMzIwLCA0MDB9LAorICAgIHsgNSwgMzIwLCAxNzB9LAorICAgIHsgNiwgMTYwLCAgODV9LAorICAgIHsgNywgMTYwLCAgODN9LAorICAgIHsgOCwgMTYwLCAgOTB9LAorICAgIHsgOSwgMjgwLCAxMjh9LAorICAgIHsxMCwgMzIwLCAyNDB9LAorICAgIHsxMSwgMzIwLCAyMDF9LAorICAgIHsxNiwgNjQwLCA0MDB9LAorICAgIHsxNywgNjQwLCAyMDB9LAorICAgIHsxOCwgNjQwLCAxODB9LAorICAgIHsxOSwgNjQwLCAxNjd9LAorICAgIHsyMCwgNjQwLCAxNzB9LAorICAgIHsyMSwgMzIwLCAyNDB9Cit9OworCitzdGF0aWMgaW50IGdkdl9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmN0eCkKK3sKKyAgICBHRFZDb250ZXh0ICpnZHYgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBjdHgtPnBiOworICAgIEFWU3RyZWFtICp2c3QsICphc3Q7CisgICAgdW5zaWduZWQgZnBzLCBzbmRfZmxhZ3MsIHZpZF9kZXB0aCwgc2l6ZV9pZDsKKworICAgIGF2aW9fc2tpcChwYiwgNCk7CisgICAgc2l6ZV9pZCA9IGF2aW9fcmwxNihwYik7CisKKyAgICB2c3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGN0eCwgMCk7CisgICAgaWYgKCF2c3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICB2c3QtPnN0YXJ0X3RpbWUgICAgICAgID0gMDsKKyAgICB2c3QtPmR1cmF0aW9uICAgICAgICAgID0KKyAgICB2c3QtPm5iX2ZyYW1lcyAgICAgICAgID0gYXZpb19ybDE2KHBiKTsKKworICAgIGZwcyA9IGF2aW9fcmwxNihwYik7CisgICAgaWYgKCFmcHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc25kX2ZsYWdzID0gYXZpb19ybDE2KHBiKTsKKyAgICBpZiAoc25kX2ZsYWdzICYgMSkgeworICAgICAgICBhc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGN0eCwgMCk7CisgICAgICAgIGlmICghYXN0KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBhc3QtPnN0YXJ0X3RpbWUgPSAwOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgPSAwOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gMSArICEhKHNuZF9mbGFncyAmIDIpOworICAgICAgICBpZiAoc25kX2ZsYWdzICYgOCkgeworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9HUkVNTElOX0RQQ007CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IChzbmRfZmxhZ3MgJiA0KSA/IEFWX0NPREVDX0lEX1BDTV9TMTZMRSA6IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgfQorCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworICAgICAgICBnZHYtPmF1ZGlvX3NpemUgPSAoYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgLyBmcHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogKDEgKyAhIShzbmRfZmxhZ3MgJiA0KSkgLyAoMSArICEhKHNuZF9mbGFncyAmIDgpKTsKKyAgICAgICAgZ2R2LT5pc19hdWRpbyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZpb19za2lwKHBiLCAyKTsKKyAgICB9CisgICAgdmlkX2RlcHRoID0gYXZpb19ybDE2KHBiKTsKKyAgICBhdmlvX3NraXAocGIsIDQpOworCisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfR0RWOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSAwOworICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIHZzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBhdmlvX3JsMTYocGIpOworCisgICAgaWYgKHZzdC0+Y29kZWNwYXItPndpZHRoID09IDAgfHwgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0ID09IDApIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKEZpeGVkU2l6ZSkgLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChGaXhlZFNpemVbaV0uaWQgPT0gc2l6ZV9pZCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICA9IEZpeGVkU2l6ZVtpXS53aWR0aDsKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gRml4ZWRTaXplW2ldLmhlaWdodDsKKyAgICB9CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgNjQsIDEsIGZwcyk7CisKKyAgICBpZiAodmlkX2RlcHRoICYgMSkgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIHIgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGcgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGIgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGdkdi0+cGFsW2ldID0gMHhGRlUgPDwgMjQgfCByIDw8IDE4IHwgZyA8PCAxMCB8IGIgPDwgMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdkdi0+aXNfZmlyc3RfdmlkZW8gPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2R2X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIEdEVkNvbnRleHQgKmdkdiA9IGN0eC0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IGN0eC0+cGI7CisgICAgaW50IHJldDsKKworICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICByZXR1cm4gcGItPmVycm9yID8gcGItPmVycm9yIDogQVZFUlJPUl9FT0Y7CisKKyAgICBpZiAoZ2R2LT5hdWRpb19zaXplICYmIGdkdi0+aXNfYXVkaW8pIHsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBnZHYtPmF1ZGlvX3NpemUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKKyAgICAgICAgZ2R2LT5pc19hdWRpbyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDhfdCAqcGFsOworCisgICAgICAgIGlmIChhdmlvX3JsMTYocGIpICE9IDB4MTMwNSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIDQgKyBhdmlvX3JsMTYocGIpKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgICAgIGdkdi0+aXNfYXVkaW8gPSAxOworCisgICAgICAgIGlmIChnZHYtPmlzX2ZpcnN0X3ZpZGVvKSB7CisgICAgICAgICAgICBwYWwgPSBhdl9wYWNrZXRfbmV3X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX1BBTEVUVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBBTEVUVEVfU0laRSk7CisgICAgICAgICAgICBpZiAoIXBhbCkgeworICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkocGFsLCBnZHYtPnBhbCwgQVZQQUxFVFRFX1NJWkUpOworICAgICAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgICAgICBnZHYtPmlzX2ZpcnN0X3ZpZGVvID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitBVklucHV0Rm9ybWF0IGZmX2dkdl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJnZHYiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJHcmVtbGluIERpZ2l0YWwgVmlkZW8iKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoR0RWQ29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gZ2R2X3JlYWRfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZ2R2X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGdkdl9yZWFkX3BhY2tldCwKK307CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9nZW5oLmMgYi9saWJhdmZvcm1hdC9nZW5oLmMKaW5kZXggY2IxYTAyZi4uZGQ0ZTc2ZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZ2VuaC5jCisrKyBiL2xpYmF2Zm9ybWF0L2dlbmguYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtNTIsNTAgKzUzLDUwIEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPD0gMCkKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzIDw9IDAgfHwgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IEZGX1NBTkVfTkJfQ0hBTk5FTFMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID09IDEpCi0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID09IDIpCi0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzID09IDEpCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzID09IDIpCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwogICAgIGFsaWduICAgICAgICAgICAgICAgICAgPQogICAgIGMtPmludGVybGVhdmVfc2l6ZSAgICAgPSBhdmlvX3JsMzIocy0+cGIpOwotICAgIGlmIChhbGlnbiA8IDAgfHwgYWxpZ24gPiBJTlRfTUFYIC8gc3QtPmNvZGVjLT5jaGFubmVscykKKyAgICBpZiAoYWxpZ24gPCAwIHx8IGFsaWduID4gSU5UX01BWCAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBhbGlnbiAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IGFsaWduICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHMtPnBiKTsKICAgICBhdmlvX3NraXAocy0+cGIsIDQpOwogICAgIHN0LT5kdXJhdGlvbiA9IGF2aW9fcmwzMihzLT5wYik7CiAKICAgICBjb2RlYyA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgc3dpdGNoIChjb2RlYykgewotICAgIGNhc2UgIDA6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9QU1g7ICAgICAgICBicmVhazsKKyAgICBjYXNlICAwOiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fUFNYOyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAgMToKLSAgICBjYXNlIDExOiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDQ7Ci0gICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IDM2ICogc3QtPmNvZGVjLT5jaGFubmVsczsKLSAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVjsgICAgYnJlYWs7Ci0gICAgY2FzZSAgMjogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0RUSzsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgIDM6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID4gMCA/CisgICAgY2FzZSAxMTogc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OworICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAzNiAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVY7ICAgIGJyZWFrOworICAgIGNhc2UgIDI6IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9EVEs7ICAgICAgICBicmVhazsKKyAgICBjYXNlICAzOiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA+IDAgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9QQ01fUzE2QkVfUExBTkFSIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfUENNX1MxNkJFOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAgNDogc3QtPmNvZGVjLT5jb2RlY19pZCA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPiAwID8KKyAgICBjYXNlICA0OiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA+IDAgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9QQ01fUzE2TEVfUExBTkFSIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfUENNX1MxNkxFOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAgNTogc3QtPmNvZGVjLT5jb2RlY19pZCA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPiAwID8KKyAgICBjYXNlICA1OiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA+IDAgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9QQ01fUzhfUExBTkFSIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfUENNX1M4OyAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAgNjogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NEWDJfRFBDTTsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgIDc6IHJldCA9IGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDIpOworICAgIGNhc2UgIDY6IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TRFgyX0RQQ007ICAgICAgICBicmVhazsKKyAgICBjYXNlICA3OiByZXQgPSBmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCAyKTsKICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICBBVl9XTDE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCAzKTsKLSAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dTOyAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMDogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0FJQ0E7ICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9USFA7ICAgICAgICBicmVhazsKLSAgICBjYXNlIDEzOiBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OyAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxNzogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVDsgICAgIGJyZWFrOworICAgICAgICAgICAgIEFWX1dMMTYoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIDMpOworICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV1M7ICAgICBicmVhazsKKyAgICBjYXNlIDEwOiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fQUlDQTsgICAgICAgYnJlYWs7CisgICAgY2FzZSAxMjogc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX1RIUDsgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTM6IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7ICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDE3OiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1FUOyAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNvZGVjICVkIiwgY29kZWMpOwogICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKQEAgLTExNywyNSArMTE4LDI1IEBACiAgICAgY29lZl9zcGxpdHRlZFswXSA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgY29lZl9zcGxpdHRlZFsxXSA9IGF2aW9fcmwzMihzLT5wYik7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFApIHsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPiAyKSB7Ci0gICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNoYW5uZWxzICVkPjIiLCBzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFApIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPiAyKSB7CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNoYW5uZWxzICVkPjIiLCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgfQogCi0gICAgICAgIGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDMyICogc3QtPmNvZGVjLT5jaGFubmVscyk7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHN0LT5jb2RlYy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMzIgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgc3QtPmNvZGVjcGFyLT5jaGFubmVsczsgY2grKykgewogICAgICAgICAgICAgaWYgKGNvZWZfdHlwZSAmIDEpIHsKICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNvZWZfdHlwZSAmIDEiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgY29lZltjaF0sIFNFRUtfU0VUKTsKLSAgICAgICAgICAgICAgICBhdmlvX3JlYWQocy0+cGIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMzIgKiBjaCwgMzIpOworICAgICAgICAgICAgICAgIGF2aW9fcmVhZChzLT5wYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAzMiAqIGNoLCAzMik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoYy0+ZHNwX2ludF90eXBlID09IDEpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSA4ICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSA4ICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICAgICAgICAgIGlmIChjLT5pbnRlcmxlYXZlX3NpemUgIT0gMSAmJgogICAgICAgICAgICAgICAgIGMtPmludGVybGVhdmVfc2l6ZSAhPSAyICYmCiAgICAgICAgICAgICAgICAgYy0+aW50ZXJsZWF2ZV9zaXplICE9IDQpCkBAIC0xNDUsMzggKzE0NiwzOCBAQAogCiAgICAgYXZpb19za2lwKHMtPnBiLCBzdGFydF9vZmZzZXQgLSBhdmlvX3RlbGwocy0+cGIpKTsKIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBnZW5oX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgR0VOSERlbXV4Q29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKICAgICBpbnQgcmV0OwogCi0gICAgaWYgKGMtPmRzcF9pbnRfdHlwZSA9PSAxICYmIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9USFAgJiYKLSAgICAgICAgY29kZWMtPmNoYW5uZWxzID4gMSkgeworICAgIGlmIChjLT5kc3BfaW50X3R5cGUgPT0gMSAmJiBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX1RIUCAmJgorICAgICAgICBwYXItPmNoYW5uZWxzID4gMSkgewogICAgICAgICBpbnQgaSwgY2g7CiAKICAgICAgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Ci0gICAgICAgIHJldCA9IGF2X25ld19wYWNrZXQocGt0LCA4ICogY29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIDggKiBwYXItPmNoYW5uZWxzKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCAvIGMtPmludGVybGVhdmVfc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjb2RlYy0+Y2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHBhci0+Y2hhbm5lbHM7IGNoKyspIHsKICAgICAgICAgICAgICAgICBwa3QtPmRhdGFbY2ggKiA4ICsgaSpjLT5pbnRlcmxlYXZlX3NpemUrMF0gPSBhdmlvX3I4KHMtPnBiKTsKICAgICAgICAgICAgICAgICBwa3QtPmRhdGFbY2ggKiA4ICsgaSpjLT5pbnRlcmxlYXZlX3NpemUrMV0gPSBhdmlvX3I4KHMtPnBiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICByZXQgPSAwOwotICAgIH0gZWxzZSBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NEWDJfRFBDTSkgewotICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGNvZGVjLT5ibG9ja19hbGlnbiAqIDEwMjQpOworICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TRFgyX0RQQ00pIHsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBwYXItPmJsb2NrX2FsaWduICogMTAyNCk7CiAKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGNvZGVjLT5ibG9ja19hbGlnbiA/IGNvZGVjLT5ibG9ja19hbGlnbiA6IDEwMjQgKiBjb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHBhci0+YmxvY2tfYWxpZ24gPyBwYXItPmJsb2NrX2FsaWduIDogMTAyNCAqIHBhci0+Y2hhbm5lbHMpOwogICAgIH0KIAogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2dpZi5jIGIvbGliYXZmb3JtYXQvZ2lmLmMKaW5kZXggNjUzN2U1NS4uMDFkOThhMiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZ2lmLmMKKysrIGIvbGliYXZmb3JtYXQvZ2lmLmMKQEAgLTUwLDEyICs1MCwxMiBAQAogICAgIHJldHVybiBzbWFsbGVzdF9hbHBoYSA8IDEyOCA/IHRyYW5zcGFyZW50X2NvbG9yX2luZGV4IDogLTE7CiB9CiAKLXN0YXRpYyBpbnQgZ2lmX2ltYWdlX3dyaXRlX2hlYWRlcihBVklPQ29udGV4dCAqcGIsIGNvbnN0IEFWQ29kZWNDb250ZXh0ICphdmN0eCwKK3N0YXRpYyBpbnQgZ2lmX2ltYWdlX3dyaXRlX2hlYWRlcihBVklPQ29udGV4dCAqcGIsIEFWU3RyZWFtICpzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9vcF9jb3VudCwgdWludDMyX3QgKnBhbGV0dGUpCiB7CiAgICAgaW50IGk7CiAgICAgaW50NjRfdCBhc3BlY3QgPSAwOwotICAgIGNvbnN0IEFWUmF0aW9uYWwgc2FyID0gYXZjdHgtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgY29uc3QgQVZSYXRpb25hbCBzYXIgPSBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKIAogICAgIGlmIChzYXIubnVtID4gMCAmJiBzYXIuZGVuID4gMCkgewogICAgICAgICBhc3BlY3QgPSBzYXIubnVtICogNjRMTCAvIHNhci5kZW4gLSAxNTsKQEAgLTY1LDggKzY1LDggQEAKIAogICAgIGF2aW9fd3JpdGUocGIsICJHSUYiLCAzKTsKICAgICBhdmlvX3dyaXRlKHBiLCAiODlhIiwgMyk7Ci0gICAgYXZpb193bDE2KHBiLCBhdmN0eC0+d2lkdGgpOwotICAgIGF2aW9fd2wxNihwYiwgYXZjdHgtPmhlaWdodCk7CisgICAgYXZpb193bDE2KHBiLCBzdC0+Y29kZWNwYXItPndpZHRoKTsKKyAgICBhdmlvX3dsMTYocGIsIHN0LT5jb2RlY3Bhci0+aGVpZ2h0KTsKIAogICAgIGlmIChwYWxldHRlKSB7CiAgICAgICAgIGNvbnN0IGludCBiY2lkID0gZ2V0X3BhbGV0dGVfdHJhbnNwYXJlbmN5X2luZGV4KHBhbGV0dGUpOwpAQCAtMTEyLDI2ICsxMTIsMjYgQEAKIHN0YXRpYyBpbnQgZ2lmX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgR0lGQ29udGV4dCAqZ2lmID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICp2aWRlb19lbmM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnZpZGVvX3BhcjsKICAgICB1aW50MzJfdCBwYWxldHRlW0FWUEFMRVRURV9DT1VOVF07CiAKICAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxIHx8Ci0gICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyB8fAotICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQgICAhPSBBVl9DT0RFQ19JRF9HSUYpIHsKKyAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY19pZCAgICE9IEFWX0NPREVDX0lEX0dJRikgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIkdJRiBtdXhlciBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIHZpZGVvIEdJRiBzdHJlYW0uXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICB2aWRlb19lbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICB2aWRlb19wYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKIAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1swXSwgNjQsIDEsIDEwMCk7Ci0gICAgaWYgKGF2cHJpdl9zZXRfc3lzdGVtYXRpY19wYWwyKHBhbGV0dGUsIHZpZGVvX2VuYy0+cGl4X2ZtdCkgPCAwKSB7Ci0gICAgICAgIGF2X2Fzc2VydDAodmlkZW9fZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfUEFMOCk7CisgICAgaWYgKGF2cHJpdl9zZXRfc3lzdGVtYXRpY19wYWwyKHBhbGV0dGUsIHZpZGVvX3Bhci0+Zm9ybWF0KSA8IDApIHsKKyAgICAgICAgYXZfYXNzZXJ0MCh2aWRlb19wYXItPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1BBTDgpOwogICAgICAgICAvKiBkZWxheSBoZWFkZXIgd3JpdGluZzogd2Ugd2FpdCBmb3IgdGhlIGZpcnN0IHBhbGV0dGUgdG8gcHV0IGl0CiAgICAgICAgICAqIGdsb2JhbGx5ICovCiAgICAgfSBlbHNlIHsKLSAgICAgICAgZ2lmX2ltYWdlX3dyaXRlX2hlYWRlcihzLT5wYiwgdmlkZW9fZW5jLCBnaWYtPmxvb3AsIHBhbGV0dGUpOworICAgICAgICBnaWZfaW1hZ2Vfd3JpdGVfaGVhZGVyKHMtPnBiLCBzLT5zdHJlYW1zWzBdLCBnaWYtPmxvb3AsIHBhbGV0dGUpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMTc1LDcgKzE3NSw3IEBACiAKICAgICBhdl9wYWNrZXRfdW5yZWYoZ2lmLT5wcmV2X3BrdCk7CiAgICAgaWYgKG5ldykKLSAgICAgICAgYXZfY29weV9wYWNrZXQoZ2lmLT5wcmV2X3BrdCwgbmV3KTsKKyAgICAgICAgYXZfcGFja2V0X3JlZihnaWYtPnByZXZfcGt0LCBuZXcpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xODMsMTUgKzE4MywxNSBAQAogc3RhdGljIGludCBnaWZfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBHSUZDb250ZXh0ICpnaWYgPSBzLT5wcml2X2RhdGE7Ci0gICAgY29uc3QgQVZDb2RlY0NvbnRleHQgKnZpZGVvX2VuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWU3RyZWFtICp2aWRlb19zdCA9IHMtPnN0cmVhbXNbMF07CiAKICAgICBpZiAoIWdpZi0+cHJldl9wa3QpIHsKLSAgICAgICAgZ2lmLT5wcmV2X3BrdCA9IGF2X21hbGxvYyhzaXplb2YoKmdpZi0+cHJldl9wa3QpKTsKKyAgICAgICAgZ2lmLT5wcmV2X3BrdCA9IGF2X3BhY2tldF9hbGxvYygpOwogICAgICAgICBpZiAoIWdpZi0+cHJldl9wa3QpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgICAgIC8qIFdyaXRlIHRoZSBmaXJzdCBwYWxldHRlIGFzIGdsb2JhbCBwYWxldHRlICovCi0gICAgICAgIGlmICh2aWRlb19lbmMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CisgICAgICAgIGlmICh2aWRlb19zdC0+Y29kZWNwYXItPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1BBTDgpIHsKICAgICAgICAgICAgIGludCBzaXplOwogICAgICAgICAgICAgdm9pZCAqcGFsZXR0ZSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfUEFMRVRURSwgJnNpemUpOwogCkBAIC0yMDMsMTAgKzIwMywxMCBAQAogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHBhbGV0dGUgZXh0cmFkYXRhXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdpZl9pbWFnZV93cml0ZV9oZWFkZXIocy0+cGIsIHZpZGVvX2VuYywgZ2lmLT5sb29wLCBwYWxldHRlKTsKKyAgICAgICAgICAgIGdpZl9pbWFnZV93cml0ZV9oZWFkZXIocy0+cGIsIHZpZGVvX3N0LCBnaWYtPmxvb3AsIHBhbGV0dGUpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGF2X2NvcHlfcGFja2V0KGdpZi0+cHJldl9wa3QsIHBrdCk7CisgICAgICAgIHJldHVybiBhdl9wYWNrZXRfcmVmKGdpZi0+cHJldl9wa3QsIHBrdCk7CiAgICAgfQogICAgIHJldHVybiBmbHVzaF9wYWNrZXQocywgcGt0KTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2dpZmRlYy5jIGIvbGliYXZmb3JtYXQvZ2lmZGVjLmMKaW5kZXggNDhiZDYwMy4uODk5M2NhNiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZ2lmZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvZ2lmZGVjLmMKQEAgLTExOCwxMCArMTE4LDEwIEBACiAgICAgLyogR0lGIGZvcm1hdCBvcGVyYXRlcyB3aXRoIHRpbWUgaW4gImh1bmRyZWR0aHMgb2Ygc2Vjb25kIiwKICAgICAgKiB0aGVyZWZvcmUgdGltZWJhc2UgaXMgMS8xMDAgKi8KICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfR0lGOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IHdpZHRoOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGhlaWdodDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfR0lGOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IHdpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IGhlaWdodDsKIAogICAgIC8qIGp1bXAgdG8gc3RhcnQgYmVjYXVzZSBnaWYgZGVjb2RlciBuZWVkcyBoZWFkZXIgZGF0YSB0b28gKi8KICAgICBpZiAoYXZpb19zZWVrKHBiLCAwLCBTRUVLX1NFVCkgIT0gMCkKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2dvcGhlci5jIGIvbGliYXZmb3JtYXQvZ29waGVyLmMKaW5kZXggODM1YWQ3Zi4uMzA3MGIyNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZ29waGVyLmMKKysrIGIvbGliYXZmb3JtYXQvZ29waGVyLmMKQEAgLTk0LDcgKzk0LDcgQEAKIAogICAgIHMtPmhkID0gTlVMTDsKICAgICBlcnIgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmcy0+aGQsIGJ1ZiwgQVZJT19GTEFHX1JFQURfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwgaC0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLCBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaCk7CiAgICAgaWYgKGVyciA8IDApCiAgICAgICAgIGdvdG8gZmFpbDsKIApAQCAtMTE0LDcgKzExNCw3IEBACiB9CiAKIAotVVJMUHJvdG9jb2wgZmZfZ29waGVyX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfZ29waGVyX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJnb3BoZXIiLAogICAgIC51cmxfb3BlbiAgICAgICA9IGdvcGhlcl9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICA9IGdvcGhlcl9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZ3NtZGVjLmMgYi9saWJhdmZvcm1hdC9nc21kZWMuYwppbmRleCA5N2RkOGM1Li4xNjI3MTA2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9nc21kZWMuYworKysgYi9saWJhdmZvcm1hdC9nc21kZWMuYwpAQCAtMzQsNiArMzQsMjMgQEAKICAgICBpbnQgc2FtcGxlX3JhdGU7CiB9IEdTTURlbXV4ZXJDb250ZXh0OwogCitzdGF0aWMgaW50IGdzbV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgdmFsaWQgPSAwLCBpbnZhbGlkID0gMDsKKyAgICB1aW50OF90ICpiID0gcC0+YnVmOworICAgIHdoaWxlIChiIDwgcC0+YnVmICsgcC0+YnVmX3NpemUgLSAzMikgeworICAgICAgICBpZiAoKCpiICYgMHhmMCkgPT0gMHhkMCkgeworICAgICAgICAgICAgdmFsaWQrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludmFsaWQrKzsKKyAgICAgICAgfQorICAgICAgICBiICs9IDMzOworICAgIH0KKyAgICBpZiAodmFsaWQgPj4gNSA+IGludmFsaWQpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDE7CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgZ3NtX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBpbnQgcmV0LCBzaXplOwpAQCAtNjEsMTIgKzc4LDEyIEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IHMtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gMTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGMtPnNhbXBsZV9yYXRlOwotICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgPSBHU01fQkxPQ0tfU0laRSAqIDggKiBjLT5zYW1wbGVfcmF0ZSAvIEdTTV9CTE9DS19TQU1QTEVTOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IHMtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGMtPnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgICAgPSBHU01fQkxPQ0tfU0laRSAqIDggKiBjLT5zYW1wbGVfcmF0ZSAvIEdTTV9CTE9DS19TQU1QTEVTOwogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIEdTTV9CTE9DS19TQU1QTEVTLCBHU01fU0FNUExFX1JBVEUpOwogCkBAIC05MSw2ICsxMDgsNyBAQAogICAgIC5uYW1lICAgICAgICAgICA9ICJnc20iLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgR1NNIiksCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKEdTTURlbXV4ZXJDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBnc21fcHJvYmUsCiAgICAgLnJlYWRfaGVhZGVyICAgID0gZ3NtX3JlYWRfaGVhZGVyLAogICAgIC5yZWFkX3BhY2tldCAgICA9IGdzbV9yZWFkX3BhY2tldCwKICAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvZ3hmLmMgYi9saWJhdmZvcm1hdC9neGYuYwppbmRleCBkOWI2MjlkLi4zOTlmNzQ1IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9neGYuYworKysgYi9saWJhdmZvcm1hdC9neGYuYwpAQCAtMTE0LDc3ICsxMTQsNzcgQEAKICAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgICAgICBjYXNlIDM6CiAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NSlBFRzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NSlBFRzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEzOgogICAgICAgICBjYXNlIDE0OgogICAgICAgICBjYXNlIDE1OgogICAgICAgICBjYXNlIDE2OgogICAgICAgICBjYXNlIDI1OgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0RWVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFZWSURFTzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDExOgogICAgICAgICBjYXNlIDEyOgogICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QRUcyVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVBFRzJWSURFTzsKICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOyAvL2dldCBrZXlmcmFtZSBmbGFnIGV0Yy4KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDIyOgogICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QRUcxVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVBFRzFWSURFTzsKICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOyAvL2dldCBrZXlmcmFtZSBmbGFnIGV0Yy4KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MyNExFOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gNDgwMDA7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gMyAqIDEgKiA0ODAwMCAqIDg7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMyAqIDE7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDI0OworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMjRMRTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSAxOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IDMgKiAxICogNDgwMDAgKiA4OworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDMgKiAxOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwotICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDQ4MDAwOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IDIgKiAxICogNDgwMDAgKiA4OwotICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IDIgKiAxOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSAyICogMSAqIDQ4MDAwICogODsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAyICogMTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQzM7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMjsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FDMzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSAyOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gNDgwMDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyNjogLyogQVZDaTUwIC8gQVZDaTEwMCAoQVZDIEludHJhKSAqLwogICAgICAgICBjYXNlIDI5OiAvKiBBVkNIRCAqLwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0gyNjQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSDI2NDsKICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIC8vIHRpbWVjb2RlIHRyYWNrczoKICAgICAgICAgY2FzZSA3OgogICAgICAgICBjYXNlIDg6CiAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ROWEhEOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ROWEhEOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVU5LTk9XTjsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1VOS05PV047CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gcy0+bmJfc3RyZWFtcyAtIDE7CkBAIC01MzIsMTEgKzUzMiwxMSBAQAogICAgICAgICBhdmlvX3JiMzIocGIpOyAvLyAidGltZWxpbmUiIGZpZWxkIG51bWJlcgogICAgICAgICBhdmlvX3I4KHBiKTsgLy8gZmxhZ3MKICAgICAgICAgYXZpb19yOChwYik7IC8vIHJlc2VydmVkCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMjRMRSB8fAotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MyNExFIHx8CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZMRSkgewogICAgICAgICAgICAgaW50IGZpcnN0ID0gZmllbGRfaW5mbyA+PiAxNjsKICAgICAgICAgICAgIGludCBsYXN0ICA9IGZpZWxkX2luZm8gJiAweGZmZmY7IC8vIGxhc3QgaXMgZXhjbHVzaXZlCi0gICAgICAgICAgICBpbnQgYnBzID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKT4+MzsKKyAgICAgICAgICAgIGludCBicHMgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpPj4zOwogICAgICAgICAgICAgaWYgKGZpcnN0IDw9IGxhc3QgJiYgbGFzdCpicHMgPD0gcGt0X2xlbikgewogICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgZmlyc3QqYnBzKTsKICAgICAgICAgICAgICAgICBza2lwID0gcGt0X2xlbiAtIGxhc3QqYnBzOwpAQCAtNTUxLDcgKzU1MSw3IEBACiAgICAgICAgIHBrdC0+ZHRzID0gZmllbGRfbnI7CiAKICAgICAgICAgLy9zZXQgZHVyYXRpb24gbWFudWFsbHkgZm9yIERWIG9yIGVsc2UgbGF2ZiBtaXNkZXRlY3RzIHRoZSBmcmFtZSByYXRlCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8pCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8pCiAgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gc2ktPmZpZWxkc19wZXJfZnJhbWU7CiAKICAgICAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2d4ZmVuYy5jIGIvbGliYXZmb3JtYXQvZ3hmZW5jLmMKaW5kZXggODIyOWZlOS4uMzUwN2MwMCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvZ3hmZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvZ3hmZW5jLmMKQEAgLTU3LDcgKzU3LDcgQEAKICAgICBpbnQgcGZyYW1lczsKICAgICBpbnQgYmZyYW1lczsKICAgICBpbnQgcF9wZXJfZ29wOwotICAgIGludCBiX3Blcl9pX29yX3A7IC8vLzwgbnVtYmVyIG9mIEIgZnJhbWVzIHBlciBJIGZyYW1lIG9yIFAgZnJhbWUKKyAgICBpbnQgYl9wZXJfaV9vcl9wOyAvLy88IG51bWJlciBvZiBCLWZyYW1lcyBwZXIgSS1mcmFtZSBvciBQLWZyYW1lCiAgICAgaW50IGZpcnN0X2dvcF9jbG9zZWQ7CiAgICAgdW5zaWduZWQgb3JkZXI7ICAgLy8vPCBpbnRlcmxlYXZpbmcgb3JkZXIKIH0gR1hGU3RyZWFtQ29udGV4dDsKQEAgLTEyNCw3ICsxMjQsNyBAQAogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IDY7ICsraSkgewotICAgICAgICBpZiAoc3QtPmNvZGVjLT5oZWlnaHQgPT0gZ3hmX2xpbmVzX3RhYltpXS5oZWlnaHQpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID09IGd4Zl9saW5lc190YWJbaV0uaGVpZ2h0KSB7CiAgICAgICAgICAgICBzYy0+bGluZXNfaW5kZXggPSBneGZfbGluZXNfdGFiW2ldLmluZGV4OwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTE5OCwxOCArMTk4LDE4IEBACiAgICAgICAgIGlmIChzYy0+Yl9wZXJfaV9vcl9wID4gOSkKICAgICAgICAgICAgIHNjLT5iX3Blcl9pX29yX3AgPSA5OyAvKiBlbnN1cmUgdmFsdWUgd29uJ3QgdGFrZSBtb3JlIHRoYW4gb25lIGNoYXIgKi8KICAgICB9Ci0gICAgaWYgKHN0LT5jb2RlYy0+aGVpZ2h0ID09IDUxMiB8fCBzdC0+Y29kZWMtPmhlaWdodCA9PSA2MDgpCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID09IDUxMiB8fCBzdC0+Y29kZWNwYXItPmhlaWdodCA9PSA2MDgpCiAgICAgICAgIHN0YXJ0aW5nX2xpbmUgPSA3OyAvLyBWQkkKLSAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmhlaWdodCA9PSA0ODApCisgICAgZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5oZWlnaHQgPT0gNDgwKQogICAgICAgICBzdGFydGluZ19saW5lID0gMjA7CiAgICAgZWxzZQogICAgICAgICBzdGFydGluZ19saW5lID0gMjM7IC8vIGRlZmF1bHQgUEFMCiAKICAgICBzaXplID0gc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIlZlciAxXG5CciAlLjZmXG5JcGcgMVxuUHBpICVkXG5CcGlvcCAlZFxuIgogICAgICAgICAgICAgICAgICAgICAiUGl4IDBcbkNmICVkXG5DZyAlZFxuU2wgJWRcbm5sMTYgJWRcblZpIDFcbmYxIDFcbiIsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdClzdC0+Y29kZWMtPmJpdF9yYXRlLCBzYy0+cF9wZXJfZ29wLCBzYy0+Yl9wZXJfaV9vcl9wLAotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQID8gMiA6IDEsIHNjLT5maXJzdF9nb3BfY2xvc2VkID09IDEsCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nX2xpbmUsIChzdC0+Y29kZWMtPmhlaWdodCArIDE1KSAvIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KXN0LT5jb2RlY3Bhci0+Yml0X3JhdGUsIHNjLT5wX3Blcl9nb3AsIHNjLT5iX3Blcl9pX29yX3AsCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCA/IDIgOiAxLCBzYy0+Zmlyc3RfZ29wX2Nsb3NlZCA9PSAxLAorICAgICAgICAgICAgICAgICAgICBzdGFydGluZ19saW5lLCAoc3QtPmNvZGVjcGFyLT5oZWlnaHQgKyAxNSkgLyAxNik7CiAgICAgYXZfYXNzZXJ0MChzaXplIDwgc2l6ZW9mKGJ1ZmZlcikpOwogICAgIGF2aW9fdzgocGIsIFRSQUNLX01QR19BVVgpOwogICAgIGF2aW9fdzgocGIsIHNpemUgKyAxKTsKQEAgLTIyMyw3ICsyMjMsNyBAQAogCiAgICAgYXZpb193OChwYiwgVFJBQ0tfQVVYKTsKICAgICBhdmlvX3c4KHBiLCA4KTsKLSAgICBpZiAoc3QtPmNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKQogICAgICAgICB0cmFja19hdXhfZGF0YSB8PSAweDAxOyAgICAgLyogbWFya3Mgc3RyZWFtIGFzIERWQ0FNIGluc3RlYWQgb2YgRFZQUk8gKi8KICAgICB0cmFja19hdXhfZGF0YSB8PSAweDQwMDAwMDAwOyAgIC8qIGF1eCBkYXRhIGlzIHZhbGlkICovCiAgICAgYXZpb193bDY0KHBiLCB0cmFja19hdXhfZGF0YSk7CkBAIC0zMTEsNyArMzExLDcgQEAKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBpbnQ2NF90IHBvczsKICAgICBpbnQgbGVuOwotICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gc3RycmNocihzLT5maWxlbmFtZSwgJy8nKTsKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IHN0cnJjaHIocy0+dXJsLCAnLycpOwogCiAgICAgcG9zID0gYXZpb190ZWxsKHBiKTsKICAgICBhdmlvX3diMTYocGIsIDApOyAvKiBzaXplICovCkBAIC0zMjAsNyArMzIwLDcgQEAKICAgICBpZiAoZmlsZW5hbWUpCiAgICAgICAgIGZpbGVuYW1lKys7CiAgICAgZWxzZQotICAgICAgICBmaWxlbmFtZSA9IHMtPmZpbGVuYW1lOworICAgICAgICBmaWxlbmFtZSA9IHMtPnVybDsKICAgICBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOwogCiAgICAgYXZpb193OChwYiwgTUFUX05BTUUpOwpAQCAtNTIwLDcgKzUyMCw3IEBACiB7CiAgICAgR1hGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlApCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkKICAgICAgICAgYXZpb193bDMyKHBiLCAyKTsKICAgICBlbHNlCiAgICAgICAgIGF2aW9fd2wzMihwYiwgMSk7IC8qIGRlZmF1bHQgdG8gNDIwICovCkBAIC01MjksOSArNTI5LDkgQEAKICAgICBhdmlvX3dsMzIocGIsIDEpOyAvKiBJIHBpY3R1cmUgcGVyIEdPUCAqLwogICAgIGF2aW9fd2wzMihwYiwgc2MtPnBfcGVyX2dvcCk7CiAgICAgYXZpb193bDMyKHBiLCBzYy0+Yl9wZXJfaV9vcl9wKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKQorICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pCiAgICAgICAgIGF2aW9fd2wzMihwYiwgMik7Ci0gICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMVZJREVPKQorICAgIGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTykKICAgICAgICAgYXZpb193bDMyKHBiLCAxKTsKICAgICBlbHNlCiAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CkBAIC01NTYsNyArNTU2LDcgQEAKIHsKICAgICBpbnQgZHZfdW1mX2RhdGEgPSAwOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkKICAgICAgICAgZHZfdW1mX2RhdGEgfD0gMHgyMDsgLyogbWFya3MgYXMgRFZDQU0gaW5zdGVhZCBvZiBEVlBSTyAqLwogICAgIGF2aW9fd2wzMihwYiwgZHZfdW1mX2RhdGEpOwogICAgIGF2aW9fd2wzMihwYiwgMCk7CkBAIC02MjAsNyArNjIwLDcgQEAKICAgICAgICAgICAgIGd4Zl93cml0ZV91bWZfbWVkaWFfdGltZWNvZGUocGIsIGd4Zi0+dGMuZHJvcCk7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcxVklERU86CiAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVklERU86CiAgICAgICAgICAgICAgICAgZ3hmX3dyaXRlX3VtZl9tZWRpYV9tcGVnKHBiLCBzdCk7CkBAIC03MDksNyArNzA5LDcgQEAKICAgICBpbnQgcmV0OwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0Y3IgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCk7CiAKLSAgICBpZiAoIXBiLT5zZWVrYWJsZSkgeworICAgIGlmICghKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZ3hmIG11eGVyIGRvZXMgbm90IHN1cHBvcnQgc3RyZWFtZWQgb3V0cHV0LCBwYXRjaCB3ZWxjb21lXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTcyMiwyMiArNzIyLDIyIEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBzdC0+cHJpdl9kYXRhID0gc2M7CiAKLSAgICAgICAgc2MtPm1lZGlhX3R5cGUgPSBmZl9jb2RlY19nZXRfdGFnKGd4Zl9tZWRpYV90eXBlcywgc3QtPmNvZGVjLT5jb2RlY19pZCk7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpIHsKKyAgICAgICAgc2MtPm1lZGlhX3R5cGUgPSBmZl9jb2RlY19nZXRfdGFnKGd4Zl9tZWRpYV90eXBlcywgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCk7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAib25seSAxNiBCSVQgUENNIExFIGFsbG93ZWQgZm9yIG5vd1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgIT0gNDgwMDApIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICE9IDQ4MDAwKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm9ubHkgNDgwMDBoeiBzYW1wbGluZyByYXRlIGlzIGFsbG93ZWRcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzICE9IDEpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAib25seSBtb25vIHRyYWNrcyBhcmUgYWxsb3dlZFxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2MtPnRyYWNrX3R5cGUgPSAyOwotICAgICAgICAgICAgc2MtPnNhbXBsZV9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIHNjLT5zYW1wbGVfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGU7CiAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc2MtPnNhbXBsZV9yYXRlKTsKICAgICAgICAgICAgIHNjLT5zYW1wbGVfc2l6ZSA9IDE2OwogICAgICAgICAgICAgc2MtPmZyYW1lX3JhdGVfaW5kZXggPSAtMjsKQEAgLTc0NiwxOCArNzQ2LDE4IEBACiAgICAgICAgICAgICBneGYtPmF1ZGlvX3RyYWNrcysrOwogICAgICAgICAgICAgZ3hmLT5mbGFncyB8PSAweDA0MDAwMDAwOyAvKiBhdWRpbyBpcyAxNiBiaXQgcGNtICovCiAgICAgICAgICAgICBtZWRpYV9pbmZvID0gJ0EnOwotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInZpZGVvIHN0cmVhbSBtdXN0IGJlIHRoZSBmaXJzdCB0cmFja1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogRklYTUUgY2hlY2sgZnJvbSB0aW1lX2Jhc2UgPyAqLwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+aGVpZ2h0ID09IDQ4MCB8fCBzdC0+Y29kZWMtPmhlaWdodCA9PSA1MTIpIHsgLyogTlRTQyBvciBOVFNDK1ZCSSAqLworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID09IDQ4MCB8fCBzdC0+Y29kZWNwYXItPmhlaWdodCA9PSA1MTIpIHsgLyogTlRTQyBvciBOVFNDK1ZCSSAqLwogICAgICAgICAgICAgICAgIHNjLT5mcmFtZV9yYXRlX2luZGV4ID0gNTsKICAgICAgICAgICAgICAgICBzYy0+c2FtcGxlX3JhdGUgPSA2MDsKICAgICAgICAgICAgICAgICBneGYtPmZsYWdzIHw9IDB4MDAwMDAwODA7CiAgICAgICAgICAgICAgICAgZ3hmLT50aW1lX2Jhc2UgPSAoQVZSYXRpb25hbCl7IDEwMDEsIDYwMDAwIH07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+aGVpZ2h0ID09IDU3NiB8fCBzdC0+Y29kZWMtPmhlaWdodCA9PSA2MDgpIHsgLyogUEFMIG9yIFBBTCtWQkkgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5oZWlnaHQgPT0gNTc2IHx8IHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID09IDYwOCkgeyAvKiBQQUwgb3IgUEFMK1ZCSSAqLwogICAgICAgICAgICAgICAgIHNjLT5mcmFtZV9yYXRlX2luZGV4ID0gNjsKICAgICAgICAgICAgICAgICBzYy0+bWVkaWFfdHlwZSsrOwogICAgICAgICAgICAgICAgIHNjLT5zYW1wbGVfcmF0ZSA9IDUwOwpAQCAtNzczLDEyICs3NzMsMTIgQEAKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBneGYtPnRpbWVfYmFzZS5udW0sIGd4Zi0+dGltZV9iYXNlLmRlbik7CiAgICAgICAgICAgICBpZiAoZ3hmX2ZpbmRfbGluZXNfaW5kZXgoc3QpIDwgMCkKICAgICAgICAgICAgICAgICBzYy0+bGluZXNfaW5kZXggPSAtMTsKLSAgICAgICAgICAgIHNjLT5zYW1wbGVfc2l6ZSA9IHN0LT5jb2RlYy0+Yml0X3JhdGU7CisgICAgICAgICAgICBzYy0+c2FtcGxlX3NpemUgPSBzdC0+Y29kZWNwYXItPmJpdF9yYXRlOwogICAgICAgICAgICAgc2MtPmZpZWxkcyA9IDI7IC8qIGludGVybGFjZWQgKi8KIAogICAgICAgICAgICAgdnNjID0gc2M7CiAKLSAgICAgICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01KUEVHOgogICAgICAgICAgICAgICAgIHNjLT50cmFja190eXBlID0gMTsKICAgICAgICAgICAgICAgICBneGYtPmZsYWdzIHw9IDB4MDAwMDQwMDA7CkBAIC03OTcsNyArNzk3LDcgQEAKICAgICAgICAgICAgICAgICBtZWRpYV9pbmZvID0gJ00nOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9EVlZJREVPOgotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgewogICAgICAgICAgICAgICAgICAgICBzYy0+bWVkaWFfdHlwZSArPSAyOwogICAgICAgICAgICAgICAgICAgICBzYy0+dHJhY2tfdHlwZSA9IDY7CiAgICAgICAgICAgICAgICAgICAgIGd4Zi0+ZmxhZ3MgfD0gMHgwMDAwMjAwMDsKQEAgLTkwMyw3ICs5MDMsNyBAQAogICAgIC8qIElmIHRoZSB2aWRlbyBpcyBmcmFtZS1lbmNvZGVkLCB0aGUgZnJhbWUgbnVtYmVycyBzaGFsbCBiZSByZXByZXNlbnRlZCBieQogICAgICAqIGV2ZW4gZmllbGQgbnVtYmVycy4KICAgICAgKiBzZWUgU01QVEUzNjBNLTIwMDQgIDYuNC4yLjEuMyBNZWRpYSBmaWVsZCBudW1iZXIgKi8KLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgIGZpZWxkX25iID0gZ3hmLT5uYl9maWVsZHM7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmllbGRfbmIgPSBhdl9yZXNjYWxlX3JuZChwa3QtPmR0cywgZ3hmLT50aW1lX2Jhc2UuZGVuLApAQCAtOTEzLDEwICs5MTMsMTAgQEAKICAgICBhdmlvX3c4KHBiLCBzYy0+bWVkaWFfdHlwZSk7CiAgICAgYXZpb193OChwYiwgc3QtPmluZGV4KTsKICAgICBhdmlvX3diMzIocGIsIGZpZWxkX25iKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgIGF2aW9fd2IxNihwYiwgMCk7CiAgICAgICAgIGF2aW9fd2IxNihwYiwgc2l6ZSAvIDIpOwotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pIHsKICAgICAgICAgaW50IGZyYW1lX3R5cGUgPSBneGZfcGFyc2VfbXBlZ19mcmFtZShzYywgcGt0LT5kYXRhLCBwa3QtPnNpemUpOwogICAgICAgICBpZiAoZnJhbWVfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfSSkgewogICAgICAgICAgICAgYXZpb193OChwYiwgMHgwZCk7CkBAIC05MjksNyArOTI5LDcgQEAKICAgICAgICAgICAgIHNjLT5wZnJhbWVzKys7CiAgICAgICAgIH0KICAgICAgICAgYXZpb193YjI0KHBiLCBzaXplKTsKLSAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZWSURFTykgeworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVlZJREVPKSB7CiAgICAgICAgIGF2aW9fdzgocGIsIHNpemUgLyA0MDk2KTsKICAgICAgICAgYXZpb193YjI0KHBiLCAwKTsKICAgICB9IGVsc2UKQEAgLTk1MSwxNSArOTUxLDE1IEBACiAgICAgaW50IHJldDsKIAogICAgIGd4Zl93cml0ZV9wYWNrZXRfaGVhZGVyKHBiLCBQS1RfTUVESUEpOwotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYgcGt0LT5zaXplICUgNCkgLyogTVBFRy0yIGZyYW1lcyBtdXN0IGJlIHBhZGRlZCAqLworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYgcGt0LT5zaXplICUgNCkgLyogTVBFRy0yIGZyYW1lcyBtdXN0IGJlIHBhZGRlZCAqLwogICAgICAgICBwYWRkaW5nID0gNCAtIHBrdC0+c2l6ZSAlIDQ7Ci0gICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQogICAgICAgICBwYWRkaW5nID0gR1hGX0FVRElPX1BBQ0tFVF9TSVpFIC0gcGt0LT5zaXplOwogICAgIGd4Zl93cml0ZV9tZWRpYV9wcmVhbWJsZShzLCBwa3QsIHBrdC0+c2l6ZSArIHBhZGRpbmcpOwogICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKICAgICBneGZfd3JpdGVfcGFkZGluZyhwYiwgcGFkZGluZyk7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgIGlmICghKGd4Zi0+Zmx0X2VudHJpZXNfbmIgJSA1MDApKSB7CiAgICAgICAgICAgICBpbnQgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcF9hcnJheSgmZ3hmLT5mbHRfZW50cmllcywKQEAgLTk5Nyw3ICs5OTcsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3RbaV0tPnN0cmVhbV9pbmRleF07CiAgICAgICAgIHNjW2ldID0gc3QtPnByaXZfZGF0YTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKICAgICAgICAgICAgIGZpZWxkX25iW2ldID0gYXZfcmVzY2FsZV9ybmQocGt0W2ldLT5kdHMsIGd4Zi0+dGltZV9iYXNlLmRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpNDgwMDAqZ3hmLT50aW1lX2Jhc2UubnVtLCBBVl9ST1VORF9VUCk7CiAgICAgICAgICAgICBmaWVsZF9uYltpXSAmPSB+MTsgLy8gY29tcGFyZSBhZ2FpbnN0IGV2ZW4gZmllbGQgbnVtYmVyIGJlY2F1c2UgYXVkaW8gbXVzdCBiZSBiZWZvcmUgdmlkZW8KQEAgLTEwMTEsNyArMTAxMSw3IEBACiAKIHN0YXRpYyBpbnQgZ3hmX2ludGVybGVhdmVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKm91dCwgQVZQYWNrZXQgKnBrdCwgaW50IGZsdXNoKQogewotICAgIGlmIChwa3QgJiYgcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICBpZiAocGt0ICYmIHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgIHBrdC0+ZHVyYXRpb24gPSAyOyAvLyBlbmZvcmNlIDIgZmllbGRzCiAgICAgcmV0dXJuIGZmX2F1ZGlvX3JlY2h1bmtfaW50ZXJsZWF2ZShzLCBvdXQsIHBrdCwgZmx1c2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfaW50ZXJsZWF2ZV9wYWNrZXRfcGVyX2R0cywgZ3hmX2NvbXBhcmVfZmllbGRfbmIpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaDI2NGRlYy5jIGIvbGliYXZmb3JtYXQvaDI2NGRlYy5jCmluZGV4IGQxZDM3Y2EuLjg1ZDcxNjMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2gyNjRkZWMuYworKysgYi9saWJhdmZvcm1hdC9oMjY0ZGVjLmMKQEAgLTE5LDE3ICsxOSwyNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nb2xvbWIuaCIKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgInJhd2RlYy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKIAorI2RlZmluZSBNQVhfU1BTX0NPVU5UICAgICAgICAgIDMyCisjZGVmaW5lIE1BWF9QUFNfQ09VTlQgICAgICAgICAyNTYKKwogc3RhdGljIGludCBoMjY0X3Byb2JlKEFWUHJvYmVEYXRhICpwKQogewogICAgIHVpbnQzMl90IGNvZGUgPSAtMTsKICAgICBpbnQgc3BzID0gMCwgcHBzID0gMCwgaWRyID0gMCwgcmVzID0gMCwgc2xpID0gMDsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgcmV0OworICAgIGludCBwcHNfaWRzW01BWF9QUFNfQ09VTlQrMV0gPSB7MH07CisgICAgaW50IHNwc19pZHNbTUFYX1NQU19DT1VOVCsxXSA9IHswfTsKKyAgICB1bnNpZ25lZCBwcHNfaWQsIHNwc19pZDsKKyAgICBHZXRCaXRDb250ZXh0IGdiOwogCi0gICAgZm9yIChpID0gMDsgaSA8IHAtPmJ1Zl9zaXplOyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpICsgMiA8IHAtPmJ1Zl9zaXplOyBpKyspIHsKICAgICAgICAgY29kZSA9IChjb2RlIDw8IDgpICsgcC0+YnVmW2ldOwogICAgICAgICBpZiAoKGNvZGUgJiAweGZmZmZmZjAwKSA9PSAweDEwMCkgewogICAgICAgICAgICAgaW50IHJlZl9pZGMgPSAoY29kZSA+PiA1KSAmIDM7CkBAIC01MywxOSArNjIsNDggQEAKICAgICAgICAgICAgICAgICAgICAgcmVzKys7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIHJldCA9IGluaXRfZ2V0X2JpdHM4KCZnYiwgcC0+YnVmICsgaSArIDEsIHAtPmJ1Zl9zaXplIC0gaSAtIDEpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHNsaSsrOwotICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgIGlkcisrOworICAgICAgICAgICAgICAgIGdldF91ZV9nb2xvbWJfbG9uZygmZ2IpOworICAgICAgICAgICAgICAgIGlmIChnZXRfdWVfZ29sb21iX2xvbmcoJmdiKSA+IDlVKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBwcHNfaWQgPSBnZXRfdWVfZ29sb21iX2xvbmcoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAocHBzX2lkID4gTUFYX1BQU19DT1VOVCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgaWYgKCFwcHNfaWRzW3Bwc19pZF0pCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgc2xpKys7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZHIrKzsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICBpZiAocC0+YnVmW2kgKyAyXSAmIDB4MDMpCisgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgMTQpOworICAgICAgICAgICAgICAgIGlmIChnZXRfYml0cygmZ2IsIDIpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBza2lwX2JpdHMoJmdiLCA4KTsKKyAgICAgICAgICAgICAgICBzcHNfaWQgPSBnZXRfdWVfZ29sb21iX2xvbmcoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAoc3BzX2lkID4gTUFYX1NQU19DT1VOVCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgc3BzX2lkc1tzcHNfaWRdID0gMTsKICAgICAgICAgICAgICAgICBzcHMrKzsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBwcHNfaWQgPSBnZXRfdWVfZ29sb21iX2xvbmcoJmdiKTsKKyAgICAgICAgICAgICAgICBpZiAocHBzX2lkID4gTUFYX1BQU19DT1VOVCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgc3BzX2lkID0gZ2V0X3VlX2dvbG9tYl9sb25nKCZnYik7CisgICAgICAgICAgICAgICAgaWYgKHNwc19pZCA+IE1BWF9TUFNfQ09VTlQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGlmICghc3BzX2lkc1tzcHNfaWRdKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwcHNfaWRzW3Bwc19pZF0gPSAxOwogICAgICAgICAgICAgICAgIHBwcysrOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaGFzaGVuYy5jIGIvbGliYXZmb3JtYXQvaGFzaGVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NmRiNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9oYXNoZW5jLmMKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBIYXNoL01ENSBlbmNvZGVyIChmb3IgY29kZWMvZm9ybWF0IHRlc3RpbmcpCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVpbWFyIETDtmZmaW5nZXIsIGJhc2VkIG9uIGNyY2VuYyAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9oYXNoLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0cnVjdCBIYXNoQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqYXZjbGFzczsKKyAgICBzdHJ1Y3QgQVZIYXNoQ29udGV4dCAqaGFzaDsKKyAgICBjaGFyICpoYXNoX25hbWU7CisgICAgaW50IGZvcm1hdF92ZXJzaW9uOworfTsKKworI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2Yoc3RydWN0IEhhc2hDb250ZXh0LCB4KQorI2RlZmluZSBFTkMgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KKyNpZiBDT05GSUdfSEFTSF9NVVhFUiB8fCBDT05GSUdfRlJBTUVIQVNIX01VWEVSCitzdGF0aWMgY29uc3QgQVZPcHRpb24gaGFzaF9vcHRpb25zW10gPSB7CisgICAgeyAiaGFzaCIsICJzZXQgaGFzaCB0byB1c2UiLCBPRkZTRVQoaGFzaF9uYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJzaGEyNTYifSwgMCwgMCwgRU5DIH0sCisgICAgeyAiZm9ybWF0X3ZlcnNpb24iLCAiZmlsZSBmb3JtYXQgdmVyc2lvbiIsIE9GRlNFVChmb3JtYXRfdmVyc2lvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAyfSwgMSwgMiwgRU5DIH0sCisgICAgeyBOVUxMIH0sCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfTUQ1X01VWEVSIHx8IENPTkZJR19GUkFNRU1ENV9NVVhFUgorc3RhdGljIGNvbnN0IEFWT3B0aW9uIG1kNV9vcHRpb25zW10gPSB7CisgICAgeyAiaGFzaCIsICJzZXQgaGFzaCB0byB1c2UiLCBPRkZTRVQoaGFzaF9uYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJtZDUifSwgMCwgMCwgRU5DIH0sCisgICAgeyAiZm9ybWF0X3ZlcnNpb24iLCAiZmlsZSBmb3JtYXQgdmVyc2lvbiIsIE9GRlNFVChmb3JtYXRfdmVyc2lvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAyfSwgMSwgMiwgRU5DIH0sCisgICAgeyBOVUxMIH0sCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfSEFTSF9NVVhFUiB8fCBDT05GSUdfTUQ1X01VWEVSCitzdGF0aWMgaW50IGhhc2hfd3JpdGVfaGVhZGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IEhhc2hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXMgPSBhdl9oYXNoX2FsbG9jKCZjLT5oYXNoLCBjLT5oYXNoX25hbWUpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworICAgIGF2X2hhc2hfaW5pdChjLT5oYXNoKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYXNoX3dyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHN0cnVjdCBIYXNoQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBhdl9oYXNoX3VwZGF0ZShjLT5oYXNoLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFzaF93cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IEhhc2hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgYnVmW0FWX0hBU0hfTUFYX1NJWkUqMisxMjhdOworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAyMDAsICIlcz0iLCBhdl9oYXNoX2dldF9uYW1lKGMtPmhhc2gpKTsKKworICAgIGF2X2hhc2hfZmluYWxfaGV4KGMtPmhhc2gsIGJ1ZiArIHN0cmxlbihidWYpLCBzaXplb2YoYnVmKSAtIHN0cmxlbihidWYpKTsKKyAgICBhdl9zdHJsY2F0ZihidWYsIHNpemVvZihidWYpLCAiXG4iKTsKKyAgICBhdmlvX3dyaXRlKHMtPnBiLCBidWYsIHN0cmxlbihidWYpKTsKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKworICAgIGF2X2hhc2hfZnJlZXAoJmMtPmhhc2gpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiBDT05GSUdfSEFTSF9NVVhFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3MgaGFzaGVuY19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJoYXNoIGVuY29kZXIgY2xhc3MiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBoYXNoX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9oYXNoX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJoYXNoIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiSGFzaCB0ZXN0aW5nIiksCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKHN0cnVjdCBIYXNoQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGhhc2hfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGhhc2hfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IGhhc2hfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9UU19OT05TVFJJQ1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZoYXNoZW5jX2NsYXNzLAorfTsKKyNlbmRpZgorCisjaWYgQ09ORklHX01ENV9NVVhFUgorc3RhdGljIGNvbnN0IEFWQ2xhc3MgbWQ1ZW5jX2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIk1ENSBlbmNvZGVyIGNsYXNzIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gbWQ1X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9tZDVfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gIm1kNSIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1ENSB0ZXN0aW5nIiksCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKHN0cnVjdCBIYXNoQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGhhc2hfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGhhc2hfd3JpdGVfcGFja2V0LAorICAgIC53cml0ZV90cmFpbGVyICAgICA9IGhhc2hfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9UU19OT05TVFJJQ1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZtZDVlbmNfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfRlJBTUVIQVNIX01VWEVSIHx8IENPTkZJR19GUkFNRU1ENV9NVVhFUgorc3RhdGljIHZvaWQgZnJhbWVoYXNoX3ByaW50X2V4dHJhZGF0YShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3QtPmNvZGVjcGFyOworICAgICAgICBpZiAocGFyLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgIHN0cnVjdCBIYXNoQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICAgICAgICAgIGNoYXIgYnVmW0FWX0hBU0hfTUFYX1NJWkUqMisxXTsKKworICAgICAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIjZXh0cmFkYXRhICVkLCAlMzFkLCAiLCBpLCBwYXItPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGF2X2hhc2hfaW5pdChjLT5oYXNoKTsKKyAgICAgICAgICAgIGF2X2hhc2hfdXBkYXRlKGMtPmhhc2gsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGF2X2hhc2hfZmluYWxfaGV4KGMtPmhhc2gsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgYXZpb193cml0ZShzLT5wYiwgYnVmLCBzdHJsZW4oYnVmKSk7CisgICAgICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIlxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZnJhbWVoYXNoX3dyaXRlX2hlYWRlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIHN0cnVjdCBIYXNoQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmVzID0gYXZfaGFzaF9hbGxvYygmYy0+aGFzaCwgYy0+aGFzaF9uYW1lKTsKKyAgICBpZiAocmVzIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNmb3JtYXQ6IGZyYW1lIGNoZWNrc3Vtc1xuIik7CisgICAgYXZpb19wcmludGYocy0+cGIsICIjdmVyc2lvbjogJWRcbiIsIGMtPmZvcm1hdF92ZXJzaW9uKTsKKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNoYXNoOiAlc1xuIiwgYXZfaGFzaF9nZXRfbmFtZShjLT5oYXNoKSk7CisgICAgZnJhbWVoYXNoX3ByaW50X2V4dHJhZGF0YShzKTsKKyAgICBmZl9mcmFtZWhhc2hfd3JpdGVfaGVhZGVyKHMpOworICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmcmFtZWhhc2hfd3JpdGVfcGFja2V0KHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgc3RydWN0IEhhc2hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGNoYXIgYnVmW0FWX0hBU0hfTUFYX1NJWkUqMisxMjhdOworICAgIGludCBsZW47CisgICAgYXZfaGFzaF9pbml0KGMtPmhhc2gpOworICAgIGF2X2hhc2hfdXBkYXRlKGMtPmhhc2gsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAoQVZfSEFTSF9NQVhfU0laRSAqIDIgKyAxKSwgIiVkLCAlMTAiUFJJZDY0IiwgJTEwIlBSSWQ2NCIsICU4IlBSSWQ2NCIsICU4ZCwgIiwKKyAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCwgcGt0LT5kdHMsIHBrdC0+cHRzLCBwa3QtPmR1cmF0aW9uLCBwa3QtPnNpemUpOworICAgIGxlbiA9IHN0cmxlbihidWYpOworICAgIGF2X2hhc2hfZmluYWxfaGV4KGMtPmhhc2gsIGJ1ZiArIGxlbiwgc2l6ZW9mKGJ1ZikgLSBsZW4pOworICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCisgICAgaWYgKGMtPmZvcm1hdF92ZXJzaW9uID4gMSAmJiBwa3QtPnNpZGVfZGF0YV9lbGVtcykgeworICAgICAgICBpbnQgaSwgajsKKyAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIsIFM9JWQiLCBwa3QtPnNpZGVfZGF0YV9lbGVtcyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwa3QtPnNpZGVfZGF0YV9lbGVtczsgaSsrKSB7CisgICAgICAgICAgICBhdl9oYXNoX2luaXQoYy0+aGFzaCk7CisgICAgICAgICAgICBpZiAoSEFWRV9CSUdFTkRJQU4gJiYgcGt0LT5zaWRlX2RhdGFbaV0udHlwZSA9PSBBVl9QS1RfREFUQV9QQUxFVFRFKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHBrdC0+c2lkZV9kYXRhW2ldLnNpemU7IGogKz0gc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhID0gQVZfUkwzMihwa3QtPnNpZGVfZGF0YVtpXS5kYXRhICsgaik7CisgICAgICAgICAgICAgICAgICAgIGF2X2hhc2hfdXBkYXRlKGMtPmhhc2gsICh1aW50OF90ICopJmRhdGEsIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2X2hhc2hfdXBkYXRlKGMtPmhhc2gsIHBrdC0+c2lkZV9kYXRhW2ldLmRhdGEsIHBrdC0+c2lkZV9kYXRhW2ldLnNpemUpOworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIChBVl9IQVNIX01BWF9TSVpFICogMiArIDEpLCAiLCAlOGQsICIsIHBrdC0+c2lkZV9kYXRhW2ldLnNpemUpOworICAgICAgICAgICAgbGVuID0gc3RybGVuKGJ1Zik7CisgICAgICAgICAgICBhdl9oYXNoX2ZpbmFsX2hleChjLT5oYXNoLCBidWYgKyBsZW4sIHNpemVvZihidWYpIC0gbGVuKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1Ziwgc3RybGVuKGJ1ZikpOworICAgICAgICB9CisgICAgfQorCisgICAgYXZpb19wcmludGYocy0+cGIsICJcbiIpOworICAgIGF2aW9fZmx1c2gocy0+cGIpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZyYW1laGFzaF93cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgc3RydWN0IEhhc2hDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIGF2X2hhc2hfZnJlZXAoJmMtPmhhc2gpOworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiBDT05GSUdfRlJBTUVIQVNIX01VWEVSCitzdGF0aWMgY29uc3QgQVZDbGFzcyBmcmFtZWhhc2hfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiZnJhbWUgaGFzaCBlbmNvZGVyIGNsYXNzIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gaGFzaF9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfZnJhbWVoYXNoX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJmcmFtZWhhc2giLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJQZXItZnJhbWUgaGFzaCB0ZXN0aW5nIiksCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKHN0cnVjdCBIYXNoQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZyYW1laGFzaF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZnJhbWVoYXNoX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBmcmFtZWhhc2hfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9UU19OT05TVFJJQ1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZmcmFtZWhhc2hfY2xhc3MsCit9OworI2VuZGlmCisKKyNpZiBDT05GSUdfRlJBTUVNRDVfTVVYRVIKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZyYW1lbWQ1X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gImZyYW1lIGhhc2ggZW5jb2RlciBjbGFzcyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG1kNV9vcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworQVZPdXRwdXRGb3JtYXQgZmZfZnJhbWVtZDVfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gImZyYW1lbWQ1IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUGVyLWZyYW1lIE1ENSB0ZXN0aW5nIiksCisgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKHN0cnVjdCBIYXNoQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZyYW1laGFzaF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZnJhbWVoYXNoX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBmcmFtZWhhc2hfd3JpdGVfdHJhaWxlciwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9UU19OT05TVFJJQ1QgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWRk1UX1RTX05FR0FUSVZFLAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZmcmFtZW1kNV9jbGFzcywKK307CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2hkc2VuYy5jIGIvbGliYXZmb3JtYXQvaGRzZW5jLmMKaW5kZXggM2U2ZTgyMS4uZDgyYWVlMSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaGRzZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvaGRzZW5jLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogICAgICAgICBpZiAob3MtPmN0eCAmJiBvcy0+Y3R4X2luaXRlZCkKICAgICAgICAgICAgIGF2X3dyaXRlX3RyYWlsZXIob3MtPmN0eCk7CiAgICAgICAgIGlmIChvcy0+Y3R4KQotICAgICAgICAgICAgYXZfZnJlZXAoJm9zLT5jdHgtPnBiKTsKKyAgICAgICAgICAgIGF2aW9fY29udGV4dF9mcmVlKCZvcy0+Y3R4LT5wYik7CiAgICAgICAgIGlmIChvcy0+Y3R4KQogICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KG9zLT5jdHgpOwogICAgICAgICBhdl9mcmVlcCgmb3MtPm1ldGFkYXRhKTsKQEAgLTE2OSw4ICsxNjksOCBAQAogICAgIGlmIChjLT5uYl9zdHJlYW1zID4gMCkKICAgICAgICAgZHVyYXRpb24gPSBjLT5zdHJlYW1zWzBdLmxhc3RfdHMgKiBhdl9xMmQocy0+c3RyZWFtc1swXS0+dGltZV9iYXNlKTsKIAotICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvaW5kZXguZjRtIiwgcy0+ZmlsZW5hbWUpOwotICAgIHNucHJpbnRmKHRlbXBfZmlsZW5hbWUsIHNpemVvZih0ZW1wX2ZpbGVuYW1lKSwgIiVzL2luZGV4LmY0bS50bXAiLCBzLT5maWxlbmFtZSk7CisgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy9pbmRleC5mNG0iLCBzLT51cmwpOworICAgIHNucHJpbnRmKHRlbXBfZmlsZW5hbWUsIHNpemVvZih0ZW1wX2ZpbGVuYW1lKSwgIiVzL2luZGV4LmY0bS50bXAiLCBzLT51cmwpOwogICAgIHJldCA9IHMtPmlvX29wZW4ocywgJm91dCwgdGVtcF9maWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFLCBOVUxMKTsKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG9wZW4gJXMgZm9yIHdyaXRpbmdcbiIsIHRlbXBfZmlsZW5hbWUpOwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgfQogICAgIGF2aW9fcHJpbnRmKG91dCwgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cInV0Zi04XCI/PlxuIik7CiAgICAgYXZpb19wcmludGYob3V0LCAiPG1hbmlmZXN0IHhtbG5zPVwiaHR0cDovL25zLmFkb2JlLmNvbS9mNG0vMS4wXCI+XG4iKTsKLSAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxpZD4lczwvaWQ+XG4iLCBhdl9iYXNlbmFtZShzLT5maWxlbmFtZSkpOworICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0PGlkPiVzPC9pZD5cbiIsIGF2X2Jhc2VuYW1lKHMtPnVybCkpOwogICAgIGF2aW9fcHJpbnRmKG91dCwgIlx0PHN0cmVhbVR5cGU+JXM8L3N0cmVhbVR5cGU+XG4iLAogICAgICAgICAgICAgICAgICAgICAgZmluYWwgPyAicmVjb3JkZWQiIDogImxpdmUiKTsKICAgICBhdmlvX3ByaW50ZihvdXQsICJcdDxkZWxpdmVyeVR5cGU+c3RyZWFtaW5nPC9kZWxpdmVyeVR5cGU+XG4iKTsKQEAgLTIzNiw5ICsyMzYsOSBAQAogICAgICAgICBjdXJfbWVkaWFfdGltZSA9IG9zLT5mcmFnbWVudHNbb3MtPm5iX2ZyYWdtZW50cyAtIDFdLT5zdGFydF90aW1lOwogCiAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksCi0gICAgICAgICAgICAgIiVzL3N0cmVhbSVkLmFic3QiLCBzLT5maWxlbmFtZSwgaW5kZXgpOworICAgICAgICAgICAgICIlcy9zdHJlYW0lZC5hYnN0Iiwgcy0+dXJsLCBpbmRleCk7CiAgICAgc25wcmludGYodGVtcF9maWxlbmFtZSwgc2l6ZW9mKHRlbXBfZmlsZW5hbWUpLAotICAgICAgICAgICAgICIlcy9zdHJlYW0lZC5hYnN0LnRtcCIsIHMtPmZpbGVuYW1lLCBpbmRleCk7CisgICAgICAgICAgICAgIiVzL3N0cmVhbSVkLmFic3QudG1wIiwgcy0+dXJsLCBpbmRleCk7CiAgICAgcmV0ID0gcy0+aW9fb3BlbihzLCAmb3V0LCB0ZW1wX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwpOwogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgdGVtcF9maWxlbmFtZSk7CkBAIC0zMTcsOSArMzE3LDkgQEAKICAgICBpbnQgcmV0ID0gMCwgaTsKICAgICBBVk91dHB1dEZvcm1hdCAqb2Zvcm1hdDsKIAotICAgIGlmIChta2RpcihzLT5maWxlbmFtZSwgMDc3NykgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgaWYgKG1rZGlyKHMtPnVybCwgMDc3NykgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOwotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SICwgIkZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5ICVzXG4iLCBzLT5maWxlbmFtZSk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IgLCAiRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgJXNcbiIsIHMtPnVybCk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKQEAgLTM0MCwxOCArMzQwLDE4IEBACiAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqY3R4OwogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogCi0gICAgICAgIGlmICghc3QtPmNvZGVjLT5iaXRfcmF0ZSkgeworICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+Yml0X3JhdGUpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBiaXQgcmF0ZSBzZXQgZm9yIHN0cmVhbSAlZFxuIiwgaSk7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgICAgIGlmIChvcy0+aGFzX3ZpZGVvKSB7CiAgICAgICAgICAgICAgICAgYy0+bmJfc3RyZWFtcysrOwogICAgICAgICAgICAgICAgIG9zKys7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcy0+aGFzX3ZpZGVvID0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICAgICAgaWYgKG9zLT5oYXNfYXVkaW8pIHsKICAgICAgICAgICAgICAgICBjLT5uYl9zdHJlYW1zKys7CiAgICAgICAgICAgICAgICAgb3MrKzsKQEAgLTM2Miw3ICszNjIsNyBAQAogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9Ci0gICAgICAgIG9zLT5iaXRyYXRlICs9IHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5iaXRfcmF0ZTsKKyAgICAgICAgb3MtPmJpdHJhdGUgKz0gcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmJpdF9yYXRlOwogCiAgICAgICAgIGlmICghb3MtPmN0eCkgewogICAgICAgICAgICAgb3MtPmZpcnN0X3N0cmVhbSA9IGk7CkBAIC0zNzQsNiArMzc0LDcgQEAKICAgICAgICAgICAgIG9zLT5jdHggPSBjdHg7CiAgICAgICAgICAgICBjdHgtPm9mb3JtYXQgPSBvZm9ybWF0OwogICAgICAgICAgICAgY3R4LT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSBzLT5pbnRlcnJ1cHRfY2FsbGJhY2s7CisgICAgICAgICAgICBjdHgtPmZsYWdzID0gcy0+ZmxhZ3M7CiAKICAgICAgICAgICAgIGN0eC0+cGIgPSBhdmlvX2FsbG9jX2NvbnRleHQob3MtPmlvYnVmLCBzaXplb2Yob3MtPmlvYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJT19GTEFHX1dSSVRFLCBvcywKQEAgLTM5MSw4ICszOTIsOCBAQAogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9Ci0gICAgICAgIGF2Y29kZWNfY29weV9jb250ZXh0KHN0LT5jb2RlYywgcy0+c3RyZWFtc1tpXS0+Y29kZWMpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7CisgICAgICAgIGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KHN0LT5jb2RlY3Bhciwgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXIpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDA7CiAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcy0+c3RyZWFtc1tpXS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKICAgICAgICAgc3QtPnRpbWVfYmFzZSA9IHMtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZTsKICAgICB9CkBAIC00MTEsNyArNDEyLDcgQEAKICAgICAgICAgICAgIHMtPnN0cmVhbXNbb3MtPmZpcnN0X3N0cmVhbSArIGpdLT50aW1lX2Jhc2UgPSBvcy0+Y3R4LT5zdHJlYW1zW2pdLT50aW1lX2Jhc2U7CiAKICAgICAgICAgc25wcmludGYob3MtPnRlbXBfZmlsZW5hbWUsIHNpemVvZihvcy0+dGVtcF9maWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICIlcy9zdHJlYW0lZF90ZW1wIiwgcy0+ZmlsZW5hbWUsIGkpOworICAgICAgICAgICAgICAgICAiJXMvc3RyZWFtJWRfdGVtcCIsIHMtPnVybCwgaSk7CiAgICAgICAgIHJldCA9IGluaXRfZmlsZShzLCBvcywgMCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgZ290byBmYWlsOwpAQCAtNDE5LDcgKzQyMCw2IEBACiAgICAgICAgIGlmICghb3MtPmhhc192aWRlbyAmJiBjLT5taW5fZnJhZ19kdXJhdGlvbiA8PSAwKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgIk5vIHZpZGVvIHN0cmVhbSBpbiBvdXRwdXQgc3RyZWFtICVkIGFuZCBubyBtaW4gZnJhZyBkdXJhdGlvbiBzZXRcbiIsIGkpOwotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAgICAgICAgIG9zLT5mcmFnbWVudF9pbmRleCA9IDE7CiAgICAgICAgIHdyaXRlX2Fic3Qocywgb3MsIDApOwpAQCAtNDc2LDcgKzQ3Niw3IEBACiAgICAgY2xvc2VfZmlsZShzLCBvcyk7CiAKICAgICBzbnByaW50Zih0YXJnZXRfZmlsZW5hbWUsIHNpemVvZih0YXJnZXRfZmlsZW5hbWUpLAotICAgICAgICAgICAgICIlcy9zdHJlYW0lZFNlZzEtRnJhZyVkIiwgcy0+ZmlsZW5hbWUsIGluZGV4LCBvcy0+ZnJhZ21lbnRfaW5kZXgpOworICAgICAgICAgICAgICIlcy9zdHJlYW0lZFNlZzEtRnJhZyVkIiwgcy0+dXJsLCBpbmRleCwgb3MtPmZyYWdtZW50X2luZGV4KTsKICAgICByZXQgPSBmZl9yZW5hbWUob3MtPnRlbXBfZmlsZW5hbWUsIHRhcmdldF9maWxlbmFtZSwgcyk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC01MTksNyArNTE5LDcgQEAKICAgICBpZiAoc3QtPmZpcnN0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSkKICAgICAgICAgc3QtPmZpcnN0X2R0cyA9IHBrdC0+ZHRzOwogCi0gICAgaWYgKCghb3MtPmhhc192aWRlbyB8fCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSAmJgorICAgIGlmICgoIW9zLT5oYXNfdmlkZW8gfHwgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgJiYKICAgICAgICAgYXZfY29tcGFyZV90cyhwa3QtPmR0cyAtIHN0LT5maXJzdF9kdHMsIHN0LT50aW1lX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgZW5kX2R0cywgQVZfVElNRV9CQVNFX1EpID49IDAgJiYKICAgICAgICAgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSAmJiBvcy0+cGFja2V0c193cml0dGVuKSB7CkBAIC01NDksMTMgKzU0OSwxMyBAQAogCiAgICAgaWYgKGMtPnJlbW92ZV9hdF9leGl0KSB7CiAgICAgICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07Ci0gICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvaW5kZXguZjRtIiwgcy0+ZmlsZW5hbWUpOworICAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzL2luZGV4LmY0bSIsIHMtPnVybCk7CiAgICAgICAgIHVubGluayhmaWxlbmFtZSk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvc3RyZWFtJWQuYWJzdCIsIHMtPmZpbGVuYW1lLCBpKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvc3RyZWFtJWQuYWJzdCIsIHMtPnVybCwgaSk7CiAgICAgICAgICAgICB1bmxpbmsoZmlsZW5hbWUpOwogICAgICAgICB9Ci0gICAgICAgIHJtZGlyKHMtPmZpbGVuYW1lKTsKKyAgICAgICAgcm1kaXIocy0+dXJsKTsKICAgICB9CiAKICAgICBoZHNfZnJlZShzKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2hldmMuYyBiL2xpYmF2Zm9ybWF0L2hldmMuYwppbmRleCA3YzI5NGVmLi4zNjI4ZDVhIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9oZXZjLmMKKysrIGIvbGliYXZmb3JtYXQvaGV2Yy5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2dvbG9tYi5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvaGV2Yy5oIgpAQCAtMTI3LDggKzEyOCw4IEBACiB7CiAgICAgdW5zaWduZWQgaW50IGk7CiAgICAgSFZDQ1Byb2ZpbGVUaWVyTGV2ZWwgZ2VuZXJhbF9wdGw7Ci0gICAgdWludDhfdCBzdWJfbGF5ZXJfcHJvZmlsZV9wcmVzZW50X2ZsYWdbTUFYX1NVQl9MQVlFUlNdOwotICAgIHVpbnQ4X3Qgc3ViX2xheWVyX2xldmVsX3ByZXNlbnRfZmxhZ1tNQVhfU1VCX0xBWUVSU107CisgICAgdWludDhfdCBzdWJfbGF5ZXJfcHJvZmlsZV9wcmVzZW50X2ZsYWdbSEVWQ19NQVhfU1VCX0xBWUVSU107CisgICAgdWludDhfdCBzdWJfbGF5ZXJfbGV2ZWxfcHJlc2VudF9mbGFnW0hFVkNfTUFYX1NVQl9MQVlFUlNdOwogCiAgICAgZ2VuZXJhbF9wdGwucHJvZmlsZV9zcGFjZSAgICAgICAgICAgICAgID0gZ2V0X2JpdHMoZ2IsIDIpOwogICAgIGdlbmVyYWxfcHRsLnRpZXJfZmxhZyAgICAgICAgICAgICAgICAgICA9IGdldF9iaXRzMShnYik7CkBAIC00MTYsNyArNDE3LDcgQEAKIAogc3RhdGljIGludCBwYXJzZV9ycHMoR2V0Qml0Q29udGV4dCAqZ2IsIHVuc2lnbmVkIGludCBycHNfaWR4LAogICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9ycHMsCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX2RlbHRhX3BvY3NbTUFYX1NIT1JUX1RFUk1fUlBTX0NPVU5UXSkKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fZGVsdGFfcG9jc1tIRVZDX01BWF9TSE9SVF9URVJNX1JFRl9QSUNfU0VUU10pCiB7CiAgICAgdW5zaWduZWQgaW50IGk7CiAKQEAgLTQ4NSw3ICs0ODYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBIRVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQgKmh2Y2MpCiB7CiAgICAgdW5zaWduZWQgaW50IGksIHNwc19tYXhfc3ViX2xheWVyc19taW51czEsIGxvZzJfbWF4X3BpY19vcmRlcl9jbnRfbHNiX21pbnVzNDsKLSAgICB1bnNpZ25lZCBpbnQgbnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzLCBudW1fZGVsdGFfcG9jc1tNQVhfU0hPUlRfVEVSTV9SUFNfQ09VTlRdOworICAgIHVuc2lnbmVkIGludCBudW1fc2hvcnRfdGVybV9yZWZfcGljX3NldHMsIG51bV9kZWx0YV9wb2NzW0hFVkNfTUFYX1NIT1JUX1RFUk1fUkVGX1BJQ19TRVRTXTsKIAogICAgIHNraXBfYml0cyhnYiwgNCk7IC8vIHNwc192aWRlb19wYXJhbWV0ZXJfc2V0X2lkCiAKQEAgLTU1NSw3ICs1NTYsNyBAQAogICAgIH0KIAogICAgIG51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0cyA9IGdldF91ZV9nb2xvbWJfbG9uZyhnYik7Ci0gICAgaWYgKG51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0cyA+IE1BWF9TSE9SVF9URVJNX1JQU19DT1VOVCkKKyAgICBpZiAobnVtX3Nob3J0X3Rlcm1fcmVmX3BpY19zZXRzID4gSEVWQ19NQVhfU0hPUlRfVEVSTV9SRUZfUElDX1NFVFMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgZm9yIChpID0gMDsgaSA8IG51bV9zaG9ydF90ZXJtX3JlZl9waWNfc2V0czsgaSsrKSB7CkBAIC02NjgsNiArNjY5LDggQEAKICAgICB3aGlsZSAoaSA8IHNyY19sZW4pCiAgICAgICAgIGRzdFtsZW4rK10gPSBzcmNbaSsrXTsKIAorICAgIG1lbXNldChkc3QgKyBsZW4sIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCiAgICAgKmRzdF9sZW4gPSBsZW47CiAgICAgcmV0dXJuIGRzdDsKIH0KQEAgLTczNCw3ICs3MzcsNyBAQAogICAgICAqIGZvciBhbGwgb3RoZXIgYXJyYXlzLiBXaGVuIHRoZSBzYW1wbGUgZW50cnkgbmFtZSBpcyDigJhoZXYx4oCZLCB0aGUgZGVmYXVsdAogICAgICAqIHZhbHVlIG9mIGFycmF5X2NvbXBsZXRlbmVzcyBpcyAwIGZvciBhbGwgYXJyYXlzLgogICAgICAqLwotICAgIGlmIChuYWxfdHlwZSA9PSBOQUxfVlBTIHx8IG5hbF90eXBlID09IE5BTF9TUFMgfHwgbmFsX3R5cGUgPT0gTkFMX1BQUykKKyAgICBpZiAobmFsX3R5cGUgPT0gSEVWQ19OQUxfVlBTIHx8IG5hbF90eXBlID09IEhFVkNfTkFMX1NQUyB8fCBuYWxfdHlwZSA9PSBIRVZDX05BTF9QUFMpCiAgICAgICAgIGFycmF5LT5hcnJheV9jb21wbGV0ZW5lc3MgPSBwc19hcnJheV9jb21wbGV0ZW5lc3M7CiAKICAgICByZXR1cm4gMDsKQEAgLTc2OCwyMCArNzcxLDIwIEBACiAgICAgICogYW5kIG5vbi1kZWNsYXJhdGl2ZSBTRUkgbWVzc2FnZXMgZGlzY2FyZGVkPwogICAgICAqLwogICAgIHN3aXRjaCAobmFsX3R5cGUpIHsKLSAgICBjYXNlIE5BTF9WUFM6Ci0gICAgY2FzZSBOQUxfU1BTOgotICAgIGNhc2UgTkFMX1BQUzoKLSAgICBjYXNlIE5BTF9TRUlfUFJFRklYOgotICAgIGNhc2UgTkFMX1NFSV9TVUZGSVg6CisgICAgY2FzZSBIRVZDX05BTF9WUFM6CisgICAgY2FzZSBIRVZDX05BTF9TUFM6CisgICAgY2FzZSBIRVZDX05BTF9QUFM6CisgICAgY2FzZSBIRVZDX05BTF9TRUlfUFJFRklYOgorICAgIGNhc2UgSEVWQ19OQUxfU0VJX1NVRkZJWDoKICAgICAgICAgcmV0ID0gaHZjY19hcnJheV9hZGRfbmFsX3VuaXQobmFsX2J1ZiwgbmFsX3NpemUsIG5hbF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc19hcnJheV9jb21wbGV0ZW5lc3MsIGh2Y2MpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICBlbHNlIGlmIChuYWxfdHlwZSA9PSBOQUxfVlBTKQorICAgICAgICBlbHNlIGlmIChuYWxfdHlwZSA9PSBIRVZDX05BTF9WUFMpCiAgICAgICAgICAgICByZXQgPSBodmNjX3BhcnNlX3ZwcygmZ2JjLCBodmNjKTsKLSAgICAgICAgZWxzZSBpZiAobmFsX3R5cGUgPT0gTkFMX1NQUykKKyAgICAgICAgZWxzZSBpZiAobmFsX3R5cGUgPT0gSEVWQ19OQUxfU1BTKQogICAgICAgICAgICAgcmV0ID0gaHZjY19wYXJzZV9zcHMoJmdiYywgaHZjYyk7Ci0gICAgICAgIGVsc2UgaWYgKG5hbF90eXBlID09IE5BTF9QUFMpCisgICAgICAgIGVsc2UgaWYgKG5hbF90eXBlID09IEhFVkNfTkFMX1BQUykKICAgICAgICAgICAgIHJldCA9IGh2Y2NfcGFyc2VfcHBzKCZnYmMsIGh2Y2MpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZW5kOwpAQCAtOTE1LDIxICs5MTgsMjEgQEAKICAgICAgKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgaHZjYy0+bnVtT2ZBcnJheXM7IGkrKykKICAgICAgICAgc3dpdGNoIChodmNjLT5hcnJheVtpXS5OQUxfdW5pdF90eXBlKSB7Ci0gICAgICAgIGNhc2UgTkFMX1ZQUzoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9WUFM6CiAgICAgICAgICAgICB2cHNfY291bnQgKz0gaHZjYy0+YXJyYXlbaV0ubnVtTmFsdXM7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOQUxfU1BTOgorICAgICAgICBjYXNlIEhFVkNfTkFMX1NQUzoKICAgICAgICAgICAgIHNwc19jb3VudCArPSBodmNjLT5hcnJheVtpXS5udW1OYWx1czsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5BTF9QUFM6CisgICAgICAgIGNhc2UgSEVWQ19OQUxfUFBTOgogICAgICAgICAgICAgcHBzX2NvdW50ICs9IGh2Y2MtPmFycmF5W2ldLm51bU5hbHVzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgIGlmICghdnBzX2NvdW50IHx8IHZwc19jb3VudCA+IE1BWF9WUFNfQ09VTlQgfHwKLSAgICAgICAgIXNwc19jb3VudCB8fCBzcHNfY291bnQgPiBNQVhfU1BTX0NPVU5UIHx8Ci0gICAgICAgICFwcHNfY291bnQgfHwgcHBzX2NvdW50ID4gTUFYX1BQU19DT1VOVCkKKyAgICBpZiAoIXZwc19jb3VudCB8fCB2cHNfY291bnQgPiBIRVZDX01BWF9WUFNfQ09VTlQgfHwKKyAgICAgICAgIXNwc19jb3VudCB8fCBzcHNfY291bnQgPiBIRVZDX01BWF9TUFNfQ09VTlQgfHwKKyAgICAgICAgIXBwc19jb3VudCB8fCBwcHNfY291bnQgPiBIRVZDX01BWF9QUFNfQ09VTlQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgLyogdW5zaWduZWQgaW50KDgpIGNvbmZpZ3VyYXRpb25WZXJzaW9uID0gMTsgKi8KQEAgLTEwNTIsOSArMTA1NSw5IEBACiAgICAgICAgIGJ1ZiArPSA0OwogCiAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICBjYXNlIE5BTF9WUFM6Ci0gICAgICAgIGNhc2UgTkFMX1NQUzoKLSAgICAgICAgY2FzZSBOQUxfUFBTOgorICAgICAgICBjYXNlIEhFVkNfTkFMX1ZQUzoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9TUFM6CisgICAgICAgIGNhc2UgSEVWQ19OQUxfUFBTOgogICAgICAgICAgICAgbnVtX3BzKys7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKQEAgLTExMjcsMTEgKzExMzAsMTEgQEAKICAgICAgICAgYnVmICs9IDQ7CiAKICAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgTkFMX1ZQUzoKLSAgICAgICAgY2FzZSBOQUxfU1BTOgotICAgICAgICBjYXNlIE5BTF9QUFM6Ci0gICAgICAgIGNhc2UgTkFMX1NFSV9QUkVGSVg6Ci0gICAgICAgIGNhc2UgTkFMX1NFSV9TVUZGSVg6CisgICAgICAgIGNhc2UgSEVWQ19OQUxfVlBTOgorICAgICAgICBjYXNlIEhFVkNfTkFMX1NQUzoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9QUFM6CisgICAgICAgIGNhc2UgSEVWQ19OQUxfU0VJX1BSRUZJWDoKKyAgICAgICAgY2FzZSBIRVZDX05BTF9TRUlfU1VGRklYOgogICAgICAgICAgICAgcmV0ID0gaHZjY19hZGRfbmFsX3VuaXQoYnVmLCBsZW4sIHBzX2FycmF5X2NvbXBsZXRlbmVzcywgJmh2Y2MpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9oZXZjZGVjLmMgYi9saWJhdmZvcm1hdC9oZXZjZGVjLmMKaW5kZXggZTM2YTA1MS4uYWFhYjBmZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaGV2Y2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2hldmNkZWMuYwpAQCAtNDMsMTUgKzQzLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBOQUxfVlBTOiAgICAgICAgdnBzKys7ICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTkFMX1NQUzogICAgICAgIHNwcysrOyAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE5BTF9QUFM6ICAgICAgICBwcHMrKzsgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBOQUxfQkxBX05fTFA6Ci0gICAgICAgICAgICBjYXNlIE5BTF9CTEFfV19MUDoKLSAgICAgICAgICAgIGNhc2UgTkFMX0JMQV9XX1JBREw6Ci0gICAgICAgICAgICBjYXNlIE5BTF9DUkFfTlVUOgotICAgICAgICAgICAgY2FzZSBOQUxfSURSX05fTFA6Ci0gICAgICAgICAgICBjYXNlIE5BTF9JRFJfV19SQURMOiBpcmFwKys7IGJyZWFrOworICAgICAgICAgICAgY2FzZSBIRVZDX05BTF9WUFM6ICAgICAgICB2cHMrKzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIRVZDX05BTF9TUFM6ICAgICAgICBzcHMrKzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIRVZDX05BTF9QUFM6ICAgICAgICBwcHMrKzsgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBIRVZDX05BTF9CTEFfTl9MUDoKKyAgICAgICAgICAgIGNhc2UgSEVWQ19OQUxfQkxBX1dfTFA6CisgICAgICAgICAgICBjYXNlIEhFVkNfTkFMX0JMQV9XX1JBREw6CisgICAgICAgICAgICBjYXNlIEhFVkNfTkFMX0NSQV9OVVQ6CisgICAgICAgICAgICBjYXNlIEhFVkNfTkFMX0lEUl9OX0xQOgorICAgICAgICAgICAgY2FzZSBIRVZDX05BTF9JRFJfV19SQURMOiBpcmFwKys7IGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaGxzLmMgYi9saWJhdmZvcm1hdC9obHMuYwppbmRleCBmYzFmZjM4Li4xMjU3Y2QxIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9obHMuYworKysgYi9saWJhdmZvcm1hdC9obHMuYwpAQCAtMjYsNiArMjYsNyBAQAogICogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtcGFudG9zLWh0dHAtbGl2ZS1zdHJlYW1pbmcKICAqLwogCisjaW5jbHVkZSAibGliYXZmb3JtYXQvaHR0cC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKQEAgLTM2LDcgKzM3LDYgQEAKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgotI2luY2x1ZGUgInVybC5oIgogI2luY2x1ZGUgImlkM3YyLmgiCiAKICNkZWZpbmUgSU5JVElBTF9CVUZGRVJfU0laRSAzMjc2OApAQCAtOTQsMTIgKzk0LDIwIEBACiAgICAgY2hhciB1cmxbTUFYX1VSTF9TSVpFXTsKICAgICBBVklPQ29udGV4dCBwYjsKICAgICB1aW50OF90KiByZWFkX2J1ZmZlcjsKLSAgICBVUkxDb250ZXh0ICppbnB1dDsKKyAgICBBVklPQ29udGV4dCAqaW5wdXQ7CisgICAgaW50IGlucHV0X3JlYWRfZG9uZTsKKyAgICBBVklPQ29udGV4dCAqaW5wdXRfbmV4dDsKKyAgICBpbnQgaW5wdXRfbmV4dF9yZXF1ZXN0ZWQ7CiAgICAgQVZGb3JtYXRDb250ZXh0ICpwYXJlbnQ7CiAgICAgaW50IGluZGV4OwogICAgIEFWRm9ybWF0Q29udGV4dCAqY3R4OwogICAgIEFWUGFja2V0IHBrdDsKLSAgICBpbnQgc3RyZWFtX29mZnNldDsKKyAgICBpbnQgaGFzX25vaGVhZGVyX2ZsYWc7CisKKyAgICAvKiBtYWluIGRlbXV4ZXIgc3RyZWFtcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBwbGF5bGlzdAorICAgICAqIGluZGV4ZWQgYnkgdGhlIHN1YmRlbXV4ZXIgc3RyZWFtIGluZGV4ZXMgKi8KKyAgICBBVlN0cmVhbSAqKm1haW5fc3RyZWFtczsKKyAgICBpbnQgbl9tYWluX3N0cmVhbXM7CiAKICAgICBpbnQgZmluaXNoZWQ7CiAgICAgZW51bSBQbGF5bGlzdFR5cGUgdHlwZTsKQEAgLTEwNyw3ICsxMTUsNyBAQAogICAgIGludCBzdGFydF9zZXFfbm87CiAgICAgaW50IG5fc2VnbWVudHM7CiAgICAgc3RydWN0IHNlZ21lbnQgKipzZWdtZW50czsKLSAgICBpbnQgbmVlZGVkLCBjdXJfbmVlZGVkOworICAgIGludCBuZWVkZWQ7CiAgICAgaW50IGN1cl9zZXFfbm87CiAgICAgaW50NjRfdCBjdXJfc2VnX29mZnNldDsKICAgICBpbnQ2NF90IGxhc3RfbG9hZF90aW1lOwpAQCAtMTk0LDIyICsyMDIsMjAgQEAKICAgICBpbnQ2NF90IGZpcnN0X3RpbWVzdGFtcDsKICAgICBpbnQ2NF90IGN1cl90aW1lc3RhbXA7CiAgICAgQVZJT0ludGVycnVwdENCICppbnRlcnJ1cHRfY2FsbGJhY2s7CisgICAgY2hhciAqcmVmZXJlcjsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaG9sZHMgSFRUUCByZWZlcmVyIHNldCBhcyBhbiBBVk9wdGlvbiB0byB0aGUgSFRUUCBwcm90b2NvbCBjb250ZXh0CiAgICAgY2hhciAqdXNlcl9hZ2VudDsgICAgICAgICAgICAgICAgICAgIC8vLzwgaG9sZHMgSFRUUCB1c2VyIGFnZW50IHNldCBhcyBhbiBBVk9wdGlvbiB0byB0aGUgSFRUUCBwcm90b2NvbCBjb250ZXh0CiAgICAgY2hhciAqY29va2llczsgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaG9sZHMgSFRUUCBjb29raWUgdmFsdWVzIHNldCBpbiBlaXRoZXIgdGhlIGluaXRpYWwgcmVzcG9uc2Ugb3IgYXMgYW4gQVZPcHRpb24gdG8gdGhlIEhUVFAgcHJvdG9jb2wgY29udGV4dAogICAgIGNoYXIgKmhlYWRlcnM7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IGhvbGRzIEhUVFAgaGVhZGVycyBzZXQgYXMgYW4gQVZPcHRpb24gdG8gdGhlIEhUVFAgcHJvdG9jb2wgY29udGV4dAogICAgIGNoYXIgKmh0dHBfcHJveHk7ICAgICAgICAgICAgICAgICAgICAvLy88IGhvbGRzIHRoZSBhZGRyZXNzIG9mIHRoZSBIVFRQIHByb3h5IHNlcnZlcgogICAgIEFWRGljdGlvbmFyeSAqYXZpb19vcHRzOwogICAgIGludCBzdHJpY3Rfc3RkX2NvbXBsaWFuY2U7CisgICAgY2hhciAqYWxsb3dlZF9leHRlbnNpb25zOworICAgIGludCBtYXhfcmVsb2FkOworICAgIGludCBodHRwX3BlcnNpc3RlbnQ7CisgICAgaW50IGh0dHBfbXVsdGlwbGU7CisgICAgQVZJT0NvbnRleHQgKnBsYXlsaXN0X3BiOwogfSBITFNDb250ZXh0OwogCi1zdGF0aWMgaW50IHJlYWRfY2hvbXBfbGluZShBVklPQ29udGV4dCAqcywgY2hhciAqYnVmLCBpbnQgbWF4bGVuKQotewotICAgIGludCBsZW4gPSBmZl9nZXRfbGluZShzLCBidWYsIG1heGxlbik7Ci0gICAgd2hpbGUgKGxlbiA+IDAgJiYgYXZfaXNzcGFjZShidWZbbGVuIC0gMV0pKQotICAgICAgICBidWZbLS1sZW5dID0gJ1wwJzsKLSAgICByZXR1cm4gbGVuOwotfQotCiBzdGF0aWMgdm9pZCBmcmVlX3NlZ21lbnRfbGlzdChzdHJ1Y3QgcGxheWxpc3QgKnBscykKIHsKICAgICBpbnQgaTsKQEAgLTI0MCw2ICsyNDYsNyBAQAogICAgICAgICBzdHJ1Y3QgcGxheWxpc3QgKnBscyA9IGMtPnBsYXlsaXN0c1tpXTsKICAgICAgICAgZnJlZV9zZWdtZW50X2xpc3QocGxzKTsKICAgICAgICAgZnJlZV9pbml0X3NlY3Rpb25fbGlzdChwbHMpOworICAgICAgICBhdl9mcmVlcCgmcGxzLT5tYWluX3N0cmVhbXMpOwogICAgICAgICBhdl9mcmVlcCgmcGxzLT5yZW5kaXRpb25zKTsKICAgICAgICAgYXZfZnJlZXAoJnBscy0+aWQzX2J1Zik7CiAgICAgICAgIGF2X2RpY3RfZnJlZSgmcGxzLT5pZDNfaW5pdGlhbCk7CkBAIC0yNDgsNyArMjU1LDExIEBACiAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGxzLT5wa3QpOwogICAgICAgICBhdl9mcmVlcCgmcGxzLT5wYi5idWZmZXIpOwogICAgICAgICBpZiAocGxzLT5pbnB1dCkKLSAgICAgICAgICAgIGZmdXJsX2Nsb3NlKHBscy0+aW5wdXQpOworICAgICAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKGMtPmN0eCwgJnBscy0+aW5wdXQpOworICAgICAgICBwbHMtPmlucHV0X3JlYWRfZG9uZSA9IDA7CisgICAgICAgIGlmIChwbHMtPmlucHV0X25leHQpCisgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UoYy0+Y3R4LCAmcGxzLT5pbnB1dF9uZXh0KTsKKyAgICAgICAgcGxzLT5pbnB1dF9uZXh0X3JlcXVlc3RlZCA9IDA7CiAgICAgICAgIGlmIChwbHMtPmN0eCkgewogICAgICAgICAgICAgcGxzLT5jdHgtPnBiID0gTlVMTDsKICAgICAgICAgICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZwbHMtPmN0eCk7CkBAIC00MTIsMTAgKzQyMywxMCBAQAogICAgIH0KIAogICAgIGlmIChpbmZvLT5ieXRlcmFuZ2VbMF0pIHsKLSAgICAgICAgc2VjLT5zaXplID0gYXRvaShpbmZvLT5ieXRlcmFuZ2UpOworICAgICAgICBzZWMtPnNpemUgPSBzdHJ0b2xsKGluZm8tPmJ5dGVyYW5nZSwgTlVMTCwgMTApOwogICAgICAgICBwdHIgPSBzdHJjaHIoaW5mby0+Ynl0ZXJhbmdlLCAnQCcpOwogICAgICAgICBpZiAocHRyKQotICAgICAgICAgICAgc2VjLT51cmxfb2Zmc2V0ID0gYXRvaShwdHIrMSk7CisgICAgICAgICAgICBzZWMtPnVybF9vZmZzZXQgPSBzdHJ0b2xsKHB0cisxLCBOVUxMLCAxMCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogdGhlIGVudGlyZSBmaWxlIGlzIHRoZSBpbml0IHNlY3Rpb24gKi8KICAgICAgICAgc2VjLT5zaXplID0gLTE7CkBAIC01ODIsNjkgKzU5MywxMTAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB1cmxfY29ubmVjdChzdHJ1Y3QgcGxheWxpc3QgKnBscywgQVZEaWN0aW9uYXJ5ICpvcHRzLCBBVkRpY3Rpb25hcnkgKm9wdHMyKQotewotICAgIEFWRGljdGlvbmFyeSAqdG1wID0gTlVMTDsKLSAgICBpbnQgcmV0OwotCi0gICAgYXZfZGljdF9jb3B5KCZ0bXAsIG9wdHMsIDApOwotICAgIGF2X2RpY3RfY29weSgmdG1wLCBvcHRzMiwgMCk7Ci0KLSAgICBpZiAocGxzLT5wYXJlbnQtPnByb3RvY29sX3doaXRlbGlzdCkgewotICAgICAgICBwbHMtPmlucHV0LT5wcm90b2NvbF93aGl0ZWxpc3QgPSAgYXZfc3RyZHVwKHBscy0+cGFyZW50LT5wcm90b2NvbF93aGl0ZWxpc3QpOwotICAgICAgICBpZiAoIXBscy0+aW5wdXQtPnByb3RvY29sX3doaXRlbGlzdCkgewotICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZ0bXApOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICgocmV0ID0gZmZ1cmxfY29ubmVjdChwbHMtPmlucHV0LCAmdG1wKSkgPCAwKSB7Ci0gICAgICAgIGZmdXJsX2Nsb3NlKHBscy0+aW5wdXQpOwotICAgICAgICBwbHMtPmlucHV0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICBhdl9kaWN0X2ZyZWUoJnRtcCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogc3RhdGljIHZvaWQgdXBkYXRlX29wdGlvbnMoY2hhciAqKmRlc3QsIGNvbnN0IGNoYXIgKm5hbWUsIHZvaWQgKnNyYykKIHsKICAgICBhdl9mcmVlcChkZXN0KTsKLSAgICBhdl9vcHRfZ2V0KHNyYywgbmFtZSwgMCwgKHVpbnQ4X3QqKilkZXN0KTsKKyAgICBhdl9vcHRfZ2V0KHNyYywgbmFtZSwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiwgKHVpbnQ4X3QqKilkZXN0KTsKICAgICBpZiAoKmRlc3QgJiYgIXN0cmxlbigqZGVzdCkpCiAgICAgICAgIGF2X2ZyZWVwKGRlc3QpOwogfQogCi1zdGF0aWMgaW50IG9wZW5fdXJsKEhMU0NvbnRleHQgKmMsIFVSTENvbnRleHQgKip1YywgY29uc3QgY2hhciAqdXJsLCBBVkRpY3Rpb25hcnkgKm9wdHMpCitzdGF0aWMgaW50IG9wZW5fdXJsX2tlZXBhbGl2ZShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICoqcGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwpCiB7Ci0gICAgQVZEaWN0aW9uYXJ5ICp0bXAgPSBOVUxMOworI2lmICFDT05GSUdfSFRUUF9QUk9UT0NPTAorICAgIHJldHVybiBBVkVSUk9SX1BST1RPQ09MX05PVF9GT1VORDsKKyNlbHNlCiAgICAgaW50IHJldDsKLSAgICBjb25zdCBjaGFyICpwcm90b19uYW1lID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUodXJsKTsKKyAgICBVUkxDb250ZXh0ICp1YyA9IGZmaW9fZ2V0dXJsY29udGV4dCgqcGIpOworICAgIGF2X2Fzc2VydDAodWMpOworICAgICgqcGIpLT5lb2ZfcmVhY2hlZCA9IDA7CisgICAgcmV0ID0gZmZfaHR0cF9kb19uZXdfcmVxdWVzdCh1YywgdXJsKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgcGIpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgb3Blbl91cmwoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqKnBiLCBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cywgQVZEaWN0aW9uYXJ5ICpvcHRzMiwgaW50ICppc19odHRwX291dCkKK3sKKyAgICBITFNDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOworICAgIEFWRGljdGlvbmFyeSAqdG1wID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICpwcm90b19uYW1lID0gTlVMTDsKKyAgICBpbnQgcmV0OworICAgIGludCBpc19odHRwID0gMDsKKworICAgIGF2X2RpY3RfY29weSgmdG1wLCBvcHRzLCAwKTsKKyAgICBhdl9kaWN0X2NvcHkoJnRtcCwgb3B0czIsIDApOworCisgICAgaWYgKGF2X3N0cnN0YXJ0KHVybCwgImNyeXB0byIsIE5VTEwpKSB7CisgICAgICAgIGlmICh1cmxbNl0gPT0gJysnIHx8IHVybFs2XSA9PSAnOicpCisgICAgICAgICAgICBwcm90b19uYW1lID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUodXJsICsgNyk7CisgICAgfQorCisgICAgaWYgKCFwcm90b19uYW1lKQorICAgICAgICBwcm90b19uYW1lID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUodXJsKTsKIAogICAgIGlmICghcHJvdG9fbmFtZSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAvLyBvbmx5IGh0dHAocykgJiBmaWxlIGFyZSBhbGxvd2VkCi0gICAgaWYgKCFhdl9zdHJzdGFydChwcm90b19uYW1lLCAiaHR0cCIsIE5VTEwpICYmICFhdl9zdHJzdGFydChwcm90b19uYW1lLCAiZmlsZSIsIE5VTEwpKQorICAgIGlmIChhdl9zdHJzdGFydChwcm90b19uYW1lLCAiZmlsZSIsIE5VTEwpKSB7CisgICAgICAgIGlmIChzdHJjbXAoYy0+YWxsb3dlZF9leHRlbnNpb25zLCAiQUxMIikgJiYgIWF2X21hdGNoX2V4dCh1cmwsIGMtPmFsbG93ZWRfZXh0ZW5zaW9ucykpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgIkZpbGVuYW1lIGV4dGVuc2lvbiBvZiBcJyVzXCcgaXMgbm90IGEgY29tbW9uIG11bHRpbWVkaWEgZXh0ZW5zaW9uLCBibG9ja2VkIGZvciBzZWN1cml0eSByZWFzb25zLlxuIgorICAgICAgICAgICAgICAgICJJZiB5b3Ugd2lzaCB0byBvdmVycmlkZSB0aGlzIGFkanVzdCBhbGxvd2VkX2V4dGVuc2lvbnMsIHlvdSBjYW4gc2V0IGl0IHRvIFwnQUxMXCcgdG8gYWxsb3cgYWxsXG4iLAorICAgICAgICAgICAgICAgIHVybCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQocHJvdG9fbmFtZSwgImh0dHAiLCBOVUxMKSkgeworICAgICAgICBpc19odHRwID0gMTsKKyAgICB9IGVsc2UKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKICAgICBpZiAoIXN0cm5jbXAocHJvdG9fbmFtZSwgdXJsLCBzdHJsZW4ocHJvdG9fbmFtZSkpICYmIHVybFtzdHJsZW4ocHJvdG9fbmFtZSldID09ICc6JykKICAgICAgICAgOworICAgIGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHVybCwgImNyeXB0byIsIE5VTEwpICYmICFzdHJuY21wKHByb3RvX25hbWUsIHVybCArIDcsIHN0cmxlbihwcm90b19uYW1lKSkgJiYgdXJsWzcgKyBzdHJsZW4ocHJvdG9fbmFtZSldID09ICc6JykKKyAgICAgICAgOwogICAgIGVsc2UgaWYgKHN0cmNtcChwcm90b19uYW1lLCAiZmlsZSIpIHx8ICFzdHJuY21wKHVybCwgImZpbGUsIiwgNSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgYXZfZGljdF9jb3B5KCZ0bXAsIGMtPmF2aW9fb3B0cywgMCk7Ci0gICAgYXZfZGljdF9jb3B5KCZ0bXAsIG9wdHMsIDApOwotCi0gICAgcmV0ID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QodWMsIHVybCwgQVZJT19GTEFHX1JFQUQsIGMtPmludGVycnVwdF9jYWxsYmFjaywgJnRtcCwgYy0+Y3R4LT5wcm90b2NvbF93aGl0ZWxpc3QpOwotICAgIGlmKCByZXQgPj0gMCkgeworICAgIGlmIChpc19odHRwICYmIGMtPmh0dHBfcGVyc2lzdGVudCAmJiAqcGIpIHsKKyAgICAgICAgcmV0ID0gb3Blbl91cmxfa2VlcGFsaXZlKGMtPmN0eCwgcGIsIHVybCk7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FWElUKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGVsc2UgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAia2VlcGFsaXZlIHJlcXVlc3QgZmFpbGVkIGZvciAnJXMnLCByZXRyeWluZyB3aXRoIG5ldyBjb25uZWN0aW9uOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdXJsLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgcmV0ID0gcy0+aW9fb3BlbihzLCBwYiwgdXJsLCBBVklPX0ZMQUdfUkVBRCwgJnRtcCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBzLT5pb19vcGVuKHMsIHBiLCB1cmwsIEFWSU9fRkxBR19SRUFELCAmdG1wKTsKKyAgICB9CisgICAgaWYgKHJldCA+PSAwKSB7CiAgICAgICAgIC8vIHVwZGF0ZSBjb29raWVzIG9uIGh0dHAgcmVzcG9uc2Ugd2l0aCBzZXRjb29raWVzLgotICAgICAgICBVUkxDb250ZXh0ICp1ID0gKnVjOwotICAgICAgICB1cGRhdGVfb3B0aW9ucygmYy0+Y29va2llcywgImNvb2tpZXMiLCB1LT5wcml2X2RhdGEpOworICAgICAgICBjaGFyICpuZXdfY29va2llcyA9IE5VTEw7CisKKyAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0NVU1RPTV9JTykpCisgICAgICAgICAgICBhdl9vcHRfZ2V0KCpwYiwgImNvb2tpZXMiLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOLCAodWludDhfdCoqKSZuZXdfY29va2llcyk7CisKKyAgICAgICAgaWYgKG5ld19jb29raWVzKSB7CisgICAgICAgICAgICBhdl9mcmVlKGMtPmNvb2tpZXMpOworICAgICAgICAgICAgYy0+Y29va2llcyA9IG5ld19jb29raWVzOworICAgICAgICB9CisKICAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJjb29raWVzIiwgYy0+Y29va2llcywgMCk7CiAgICAgfQogCiAgICAgYXZfZGljdF9mcmVlKCZ0bXApOwogCisgICAgaWYgKGlzX2h0dHBfb3V0KQorICAgICAgICAqaXNfaHR0cF9vdXQgPSBpc19odHRwOworCiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtNjY2LDM2ICs3MTgsNTEgQEAKICAgICBzdHJ1Y3QgdmFyaWFudF9pbmZvIHZhcmlhbnRfaW5mbzsKICAgICBjaGFyIHRtcF9zdHJbTUFYX1VSTF9TSVpFXTsKICAgICBzdHJ1Y3Qgc2VnbWVudCAqY3VyX2luaXRfc2VjdGlvbiA9IE5VTEw7CisgICAgaW50IGlzX2h0dHAgPSBhdl9zdHJzdGFydCh1cmwsICJodHRwIiwgTlVMTCk7CisKKyAgICBpZiAoaXNfaHR0cCAmJiAhaW4gJiYgYy0+aHR0cF9wZXJzaXN0ZW50ICYmIGMtPnBsYXlsaXN0X3BiKSB7CisgICAgICAgIGluID0gYy0+cGxheWxpc3RfcGI7CisgICAgICAgIHJldCA9IG9wZW5fdXJsX2tlZXBhbGl2ZShjLT5jdHgsICZjLT5wbGF5bGlzdF9wYiwgdXJsKTsKKyAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VYSVQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgICAgICBhdl9sb2coYy0+Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgImtlZXBhbGl2ZSByZXF1ZXN0IGZhaWxlZCBmb3IgJyVzJywgcmV0cnlpbmcgd2l0aCBuZXcgY29ubmVjdGlvbjogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHVybCwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIGluID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KIAogICAgIGlmICghaW4pIHsKLSNpZiAxCiAgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7Ci0gICAgICAgIGNsb3NlX2luID0gMTsKICAgICAgICAgLyogU29tZSBITFMgc2VydmVycyBkb24ndCBsaWtlIGJlaW5nIHNlbnQgdGhlIHJhbmdlIGhlYWRlciAqLwogICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgInNlZWthYmxlIiwgIjAiLCAwKTsKIAogICAgICAgICAvLyBicm9rZXIgcHJpb3IgSFRUUCBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgYWNyb3NzIHJlcXVlc3RzCi0gICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidXNlci1hZ2VudCIsIGMtPnVzZXJfYWdlbnQsIDApOworICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgInVzZXJfYWdlbnQiLCBjLT51c2VyX2FnZW50LCAwKTsKICAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJjb29raWVzIiwgYy0+Y29va2llcywgMCk7CiAgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAiaGVhZGVycyIsIGMtPmhlYWRlcnMsIDApOwogICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgImh0dHBfcHJveHkiLCBjLT5odHRwX3Byb3h5LCAwKTsKIAorICAgICAgICBpZiAoYy0+aHR0cF9wZXJzaXN0ZW50KQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtdWx0aXBsZV9yZXF1ZXN0cyIsICIxIiwgMCk7CisKICAgICAgICAgcmV0ID0gYy0+Y3R4LT5pb19vcGVuKGMtPmN0eCwgJmluLCB1cmwsIEFWSU9fRkxBR19SRUFELCAmb3B0cyk7CiAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKLSNlbHNlCi0gICAgICAgIHJldCA9IG9wZW5faW4oYywgJmluLCB1cmwpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGNsb3NlX2luID0gMTsKLSNlbmRpZgorCisgICAgICAgIGlmIChpc19odHRwICYmIGMtPmh0dHBfcGVyc2lzdGVudCkKKyAgICAgICAgICAgIGMtPnBsYXlsaXN0X3BiID0gaW47CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNsb3NlX2luID0gMTsKICAgICB9CiAKICAgICBpZiAoYXZfb3B0X2dldChpbiwgImxvY2F0aW9uIiwgQVZfT1BUX1NFQVJDSF9DSElMRFJFTiwgJm5ld191cmwpID49IDApCiAgICAgICAgIHVybCA9IG5ld191cmw7CiAKLSAgICByZWFkX2Nob21wX2xpbmUoaW4sIGxpbmUsIHNpemVvZihsaW5lKSk7CisgICAgZmZfZ2V0X2Nob21wX2xpbmUoaW4sIGxpbmUsIHNpemVvZihsaW5lKSk7CiAgICAgaWYgKHN0cmNtcChsaW5lLCAiI0VYVE0zVSIpKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGdvdG8gZmFpbDsKQEAgLTcwNyw3ICs3NzQsNyBAQAogICAgICAgICBwbHMtPnR5cGUgPSBQTFNfVFlQRV9VTlNQRUNJRklFRDsKICAgICB9CiAgICAgd2hpbGUgKCFhdmlvX2Zlb2YoaW4pKSB7Ci0gICAgICAgIHJlYWRfY2hvbXBfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICAgICAgZmZfZ2V0X2Nob21wX2xpbmUoaW4sIGxpbmUsIHNpemVvZihsaW5lKSk7CiAgICAgICAgIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVC1YLVNUUkVBTS1JTkY6IiwgJnB0cikpIHsKICAgICAgICAgICAgIGlzX3ZhcmlhbnQgPSAxOwogICAgICAgICAgICAgbWVtc2V0KCZ2YXJpYW50X2luZm8sIDAsIHNpemVvZih2YXJpYW50X2luZm8pKTsKQEAgLTczNyw3ICs4MDQsNyBAQAogICAgICAgICAgICAgcmV0ID0gZW5zdXJlX3BsYXlsaXN0KGMsICZwbHMsIHVybCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICBwbHMtPnRhcmdldF9kdXJhdGlvbiA9IGF0b2kocHRyKSAqIEFWX1RJTUVfQkFTRTsKKyAgICAgICAgICAgIHBscy0+dGFyZ2V0X2R1cmF0aW9uID0gc3RydG9sbChwdHIsIE5VTEwsIDEwKSAqIEFWX1RJTUVfQkFTRTsKICAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVC1YLU1FRElBLVNFUVVFTkNFOiIsICZwdHIpKSB7CiAgICAgICAgICAgICByZXQgPSBlbnN1cmVfcGxheWxpc3QoYywgJnBscywgdXJsKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtNzY2LDEwICs4MzMsMTAgQEAKICAgICAgICAgICAgIGlzX3NlZ21lbnQgPSAxOwogICAgICAgICAgICAgZHVyYXRpb24gICA9IGF0b2YocHRyKSAqIEFWX1RJTUVfQkFTRTsKICAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVC1YLUJZVEVSQU5HRToiLCAmcHRyKSkgewotICAgICAgICAgICAgc2VnX3NpemUgPSBhdG9pKHB0cik7CisgICAgICAgICAgICBzZWdfc2l6ZSA9IHN0cnRvbGwocHRyLCBOVUxMLCAxMCk7CiAgICAgICAgICAgICBwdHIgPSBzdHJjaHIocHRyLCAnQCcpOwogICAgICAgICAgICAgaWYgKHB0cikKLSAgICAgICAgICAgICAgICBzZWdfb2Zmc2V0ID0gYXRvaShwdHIrMSk7CisgICAgICAgICAgICAgICAgc2VnX29mZnNldCA9IHN0cnRvbGwocHRyKzEsIE5VTEwsIDEwKTsKICAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChsaW5lLCAiIyIsIE5VTEwpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfSBlbHNlIGlmIChsaW5lWzBdKSB7CkBAIC04NDksNiArOTE2LDExIEBACiAgICAgYXZfZnJlZShuZXdfdXJsKTsKICAgICBpZiAoY2xvc2VfaW4pCiAgICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShjLT5jdHgsICZpbik7CisgICAgYy0+Y3R4LT5jdHhfZmxhZ3MgPSBjLT5jdHgtPmN0eF9mbGFncyAmIH4odW5zaWduZWQpQVZGTVRDVFhfVU5TRUVLQUJMRTsKKyAgICBpZiAoIWMtPm5fdmFyaWFudHMgfHwgIWMtPnZhcmlhbnRzWzBdLT5uX3BsYXlsaXN0cyB8fAorICAgICAgICAhKGMtPnZhcmlhbnRzWzBdLT5wbGF5bGlzdHNbMF0tPmZpbmlzaGVkIHx8CisgICAgICAgICAgYy0+dmFyaWFudHNbMF0tPnBsYXlsaXN0c1swXS0+dHlwZSA9PSBQTFNfVFlQRV9FVkVOVCkpCisgICAgICAgIGMtPmN0eC0+Y3R4X2ZsYWdzIHw9IEFWRk1UQ1RYX1VOU0VFS0FCTEU7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtODU3LDEyICs5MjksMTkgQEAKICAgICByZXR1cm4gcGxzLT5zZWdtZW50c1twbHMtPmN1cl9zZXFfbm8gLSBwbHMtPnN0YXJ0X3NlcV9ub107CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc2VnbWVudCAqbmV4dF9zZWdtZW50KHN0cnVjdCBwbGF5bGlzdCAqcGxzKQoreworICAgIGludCBuID0gcGxzLT5jdXJfc2VxX25vIC0gcGxzLT5zdGFydF9zZXFfbm8gKyAxOworICAgIGlmIChuID49IHBscy0+bl9zZWdtZW50cykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHBscy0+c2VnbWVudHNbbl07Cit9CisKIGVudW0gUmVhZEZyb21VUkxNb2RlIHsKICAgICBSRUFEX05PUk1BTCwKICAgICBSRUFEX0NPTVBMRVRFLAogfTsKIAotLyogcmVhZCBmcm9tIFVSTENvbnRleHQsIGxpbWl0aW5nIHJlYWQgdG8gY3VycmVudCBzZWdtZW50ICovCiBzdGF0aWMgaW50IHJlYWRfZnJvbV91cmwoc3RydWN0IHBsYXlsaXN0ICpwbHMsIHN0cnVjdCBzZWdtZW50ICpzZWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBSZWFkRnJvbVVSTE1vZGUgbW9kZSkKQEAgLTg3MywxMCArOTUyLDEyIEBACiAgICAgaWYgKHNlZy0+c2l6ZSA+PSAwKQogICAgICAgICBidWZfc2l6ZSA9IEZGTUlOKGJ1Zl9zaXplLCBzZWctPnNpemUgLSBwbHMtPmN1cl9zZWdfb2Zmc2V0KTsKIAotICAgIGlmIChtb2RlID09IFJFQURfQ09NUExFVEUpCi0gICAgICAgIHJldCA9IGZmdXJsX3JlYWRfY29tcGxldGUocGxzLT5pbnB1dCwgYnVmLCBidWZfc2l6ZSk7Ci0gICAgZWxzZQotICAgICAgICByZXQgPSBmZnVybF9yZWFkKHBscy0+aW5wdXQsIGJ1ZiwgYnVmX3NpemUpOworICAgIGlmIChtb2RlID09IFJFQURfQ09NUExFVEUpIHsKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBscy0+aW5wdXQsIGJ1ZiwgYnVmX3NpemUpOworICAgICAgICBpZiAocmV0ICE9IGJ1Zl9zaXplKQorICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCByZWFkIGNvbXBsZXRlIHNlZ21lbnQuXG4iKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBscy0+aW5wdXQsIGJ1ZiwgYnVmX3NpemUpOwogCiAgICAgaWYgKHJldCA+IDApCiAgICAgICAgIHBscy0+Y3VyX3NlZ19vZmZzZXQgKz0gcmV0OwpAQCAtOTY2LDYgKzEwNDcsNyBAQAogICAgICAgICAgICAgLyogZGVtdXhlciBub3QgeWV0IG9wZW5lZCwgZGVmZXIgcGljdHVyZSBhdHRhY2htZW50ICovCiAgICAgICAgICAgICBwbHMtPmlkM19kZWZlcnJlZF9leHRyYSA9IGV4dHJhX21ldGE7CiAKKyAgICAgICAgZmZfaWQzdjJfcGFyc2VfcHJpdl9kaWN0KCZtZXRhZGF0YSwgJmV4dHJhX21ldGEpOwogICAgICAgICBhdl9kaWN0X2NvcHkoJnBscy0+Y3R4LT5tZXRhZGF0YSwgbWV0YWRhdGEsIDApOwogICAgICAgICBwbHMtPmlkM19pbml0aWFsID0gbWV0YWRhdGE7CiAKQEAgLTk4MSw3ICsxMDYzLDYgQEAKICAgICAgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZleHRyYV9tZXRhKTsKIH0KIAotLyogSW50ZXJjZXB0IGFuZCBoYW5kbGUgSUQzIHRhZ3MgYmV0d2VlbiBVUkxDb250ZXh0IGFuZCBBVklPQ29udGV4dCAqLwogc3RhdGljIHZvaWQgaW50ZXJjZXB0X2lkMyhzdHJ1Y3QgcGxheWxpc3QgKnBscywgdWludDhfdCAqYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZfc2l6ZSwgaW50ICpsZW4pCiB7CkBAIC0xMDgyLDE4ICsxMTYzLDIzIEBACiAgICAgICAgIHBscy0+aXNfaWQzX3RpbWVzdGFtcGVkID0gKHBscy0+aWQzX21wZWd0c190aW1lc3RhbXAgIT0gQVZfTk9QVFNfVkFMVUUpOwogfQogCi1zdGF0aWMgaW50IG9wZW5faW5wdXQoSExTQ29udGV4dCAqYywgc3RydWN0IHBsYXlsaXN0ICpwbHMsIHN0cnVjdCBzZWdtZW50ICpzZWcpCitzdGF0aWMgaW50IG9wZW5faW5wdXQoSExTQ29udGV4dCAqYywgc3RydWN0IHBsYXlsaXN0ICpwbHMsIHN0cnVjdCBzZWdtZW50ICpzZWcsIEFWSU9Db250ZXh0ICoqaW4pCiB7CiAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKICAgICBpbnQgcmV0OworICAgIGludCBpc19odHRwID0gMDsKIAogICAgIC8vIGJyb2tlciBwcmlvciBIVFRQIG9wdGlvbnMgdGhhdCBzaG91bGQgYmUgY29uc2lzdGVudCBhY3Jvc3MgcmVxdWVzdHMKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgInVzZXItYWdlbnQiLCBjLT51c2VyX2FnZW50LCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgInVzZXJfYWdlbnQiLCBjLT51c2VyX2FnZW50LCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgInJlZmVyZXIiLCBjLT5yZWZlcmVyLCAwKTsKICAgICBhdl9kaWN0X3NldCgmb3B0cywgImNvb2tpZXMiLCBjLT5jb29raWVzLCAwKTsKICAgICBhdl9kaWN0X3NldCgmb3B0cywgImhlYWRlcnMiLCBjLT5oZWFkZXJzLCAwKTsKICAgICBhdl9kaWN0X3NldCgmb3B0cywgImh0dHBfcHJveHkiLCBjLT5odHRwX3Byb3h5LCAwKTsKICAgICBhdl9kaWN0X3NldCgmb3B0cywgInNlZWthYmxlIiwgIjAiLCAwKTsKIAorICAgIGlmIChjLT5odHRwX3BlcnNpc3RlbnQpCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibXVsdGlwbGVfcmVxdWVzdHMiLCAiMSIsIDApOworCiAgICAgaWYgKHNlZy0+c2l6ZSA+PSAwKSB7CiAgICAgICAgIC8qIHRyeSB0byByZXN0cmljdCB0aGUgSFRUUCByZXF1ZXN0IHRvIHRoZSBwYXJ0IHdlIHdhbnQKICAgICAgICAgICogKGlmIHRoaXMgaXMgaW4gZmFjdCBhIEhUVFAgcmVxdWVzdCkgKi8KQEAgLTExMDUsMTkgKzExOTEsMTkgQEAKICAgICAgICAgICAgc2VnLT51cmwsIHNlZy0+dXJsX29mZnNldCwgcGxzLT5pbmRleCk7CiAKICAgICBpZiAoc2VnLT5rZXlfdHlwZSA9PSBLRVlfTk9ORSkgewotICAgICAgICByZXQgPSBvcGVuX3VybChwbHMtPnBhcmVudC0+cHJpdl9kYXRhLCAmcGxzLT5pbnB1dCwgc2VnLT51cmwsIG9wdHMpOworICAgICAgICByZXQgPSBvcGVuX3VybChwbHMtPnBhcmVudCwgaW4sIHNlZy0+dXJsLCBjLT5hdmlvX29wdHMsIG9wdHMsICZpc19odHRwKTsKICAgICB9IGVsc2UgaWYgKHNlZy0+a2V5X3R5cGUgPT0gS0VZX0FFU18xMjgpIHsKLS8vICAgICAgICAgSExTQ29udGV4dCAqYyA9IHZhci0+cGFyZW50LT5wcml2X2RhdGE7CisgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0czIgPSBOVUxMOwogICAgICAgICBjaGFyIGl2WzMzXSwga2V5WzMzXSwgdXJsW01BWF9VUkxfU0laRV07CiAgICAgICAgIGlmIChzdHJjbXAoc2VnLT5rZXksIHBscy0+a2V5X3VybCkpIHsKLSAgICAgICAgICAgIFVSTENvbnRleHQgKnVjOwotICAgICAgICAgICAgaWYgKG9wZW5fdXJsKHBscy0+cGFyZW50LT5wcml2X2RhdGEsICZ1Yywgc2VnLT5rZXksIG9wdHMpID09IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZmZ1cmxfcmVhZF9jb21wbGV0ZSh1YywgcGxzLT5rZXksIHNpemVvZihwbHMtPmtleSkpCi0gICAgICAgICAgICAgICAgICAgICE9IHNpemVvZihwbHMtPmtleSkpIHsKKyAgICAgICAgICAgIEFWSU9Db250ZXh0ICpwYiA9IE5VTEw7CisgICAgICAgICAgICBpZiAob3Blbl91cmwocGxzLT5wYXJlbnQsICZwYiwgc2VnLT5rZXksIGMtPmF2aW9fb3B0cywgb3B0cywgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgcGxzLT5rZXksIHNpemVvZihwbHMtPmtleSkpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gc2l6ZW9mKHBscy0+a2V5KSkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHJlYWQga2V5IGZpbGUgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPmtleSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZmdXJsX2Nsb3NlKHVjKTsKKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocGxzLT5wYXJlbnQsICZwYik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiBrZXkgZmlsZSAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5rZXkpOwpAQCAtMTEzMiwxMyArMTIxOCwxNSBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBzbnByaW50Zih1cmwsIHNpemVvZih1cmwpLCAiY3J5cHRvOiVzIiwgc2VnLT51cmwpOwogCi0gICAgICAgIGlmICgocmV0ID0gZmZ1cmxfYWxsb2MoJnBscy0+aW5wdXQsIHVybCwgQVZJT19GTEFHX1JFQUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBscy0+cGFyZW50LT5pbnRlcnJ1cHRfY2FsbGJhY2spKSA8IDApCi0gICAgICAgICAgICBnb3RvIGNsZWFudXA7Ci0gICAgICAgIGF2X29wdF9zZXQocGxzLT5pbnB1dC0+cHJpdl9kYXRhLCAia2V5Iiwga2V5LCAwKTsKLSAgICAgICAgYXZfb3B0X3NldChwbHMtPmlucHV0LT5wcml2X2RhdGEsICJpdiIsIGl2LCAwKTsKKyAgICAgICAgYXZfZGljdF9jb3B5KCZvcHRzMiwgYy0+YXZpb19vcHRzLCAwKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMyLCAia2V5Iiwga2V5LCAwKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMyLCAiaXYiLCBpdiwgMCk7CiAKLSAgICAgICAgaWYgKChyZXQgPSB1cmxfY29ubmVjdChwbHMsIGMtPmF2aW9fb3B0cywgb3B0cykpIDwgMCkgeworICAgICAgICByZXQgPSBvcGVuX3VybChwbHMtPnBhcmVudCwgaW4sIHVybCwgb3B0czIsIG9wdHMsICZpc19odHRwKTsKKworICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMyKTsKKworICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgZ290byBjbGVhbnVwOwogICAgICAgICB9CiAgICAgICAgIHJldCA9IDA7CkBAIC0xMTUyLDE0ICsxMjQwLDIwIEBACiAKICAgICAvKiBTZWVrIHRvIHRoZSByZXF1ZXN0ZWQgcG9zaXRpb24uIElmIHRoaXMgd2FzIGEgSFRUUCByZXF1ZXN0LCB0aGUgb2Zmc2V0CiAgICAgICogc2hvdWxkIGFscmVhZHkgYmUgd2hlcmUgd2FudCBpdCB0bywgYnV0IHRoaXMgYWxsb3dzIGUuZy4gbG9jYWwgdGVzdGluZwotICAgICAqIHdpdGhvdXQgYSBIVFRQIHNlcnZlci4gKi8KLSAgICBpZiAocmV0ID09IDAgJiYgc2VnLT5rZXlfdHlwZSA9PSBLRVlfTk9ORSAmJiBzZWctPnVybF9vZmZzZXQpIHsKLSAgICAgICAgaW50IHNlZWtyZXQgPSBmZnVybF9zZWVrKHBscy0+aW5wdXQsIHNlZy0+dXJsX29mZnNldCwgU0VFS19TRVQpOworICAgICAqIHdpdGhvdXQgYSBIVFRQIHNlcnZlci4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgbm90IGRvbmUgZm9yIEhUVFAgYXQgYWxsIGFzIGF2aW9fc2VlaygpIGRvZXMgaW50ZXJuYWwgYm9va2tlZXBpbmcKKyAgICAgKiBvZiBmaWxlIG9mZnNldCB3aGljaCBpcyBvdXQtb2Ytc3luYyB3aXRoIHRoZSBhY3R1YWwgb2Zmc2V0IHdoZW4gIm9mZnNldCIKKyAgICAgKiBBVk9wdGlvbiBpcyB1c2VkIHdpdGggaHR0cCBwcm90b2NvbCwgY2F1c2luZyB0aGUgc2VlayB0byBub3QgYmUgYSBuby1vcAorICAgICAqIGFzIHdvdWxkIGJlIGV4cGVjdGVkLiBXcm9uZyBvZmZzZXQgcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIHdpbGwgbm90IGJlCisgICAgICogbm90aWNlZCB3aXRob3V0IHRoZSBjYWxsLCB0aG91Z2guCisgICAgICovCisgICAgaWYgKHJldCA9PSAwICYmICFpc19odHRwICYmIHNlZy0+a2V5X3R5cGUgPT0gS0VZX05PTkUgJiYgc2VnLT51cmxfb2Zmc2V0KSB7CisgICAgICAgIGludDY0X3Qgc2Vla3JldCA9IGF2aW9fc2VlaygqaW4sIHNlZy0+dXJsX29mZnNldCwgU0VFS19TRVQpOwogICAgICAgICBpZiAoc2Vla3JldCA8IDApIHsKICAgICAgICAgICAgIGF2X2xvZyhwbHMtPnBhcmVudCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHNlZWsgdG8gb2Zmc2V0ICUiUFJJZDY0IiBvZiBITFMgc2VnbWVudCAnJXMnXG4iLCBzZWctPnVybF9vZmZzZXQsIHNlZy0+dXJsKTsKICAgICAgICAgICAgIHJldCA9IHNlZWtyZXQ7Ci0gICAgICAgICAgICBmZnVybF9jbG9zZShwbHMtPmlucHV0KTsKLSAgICAgICAgICAgIHBscy0+aW5wdXQgPSBOVUxMOworICAgICAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHBscy0+cGFyZW50LCBpbik7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTExODUsOSArMTI3OSw3IEBACiAgICAgaWYgKCFzZWctPmluaXRfc2VjdGlvbikKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAvKiB0aGlzIHdpbGwgY2xvYmJlciBwbGF5bGlzdCBVUkxDb250ZXh0IHN0dWZmLCBzbyB0aGlzIHNob3VsZCBiZQotICAgICAqIGNhbGxlZCBiZXR3ZWVuIHNlZ21lbnRzIG9ubHkgKi8KLSAgICByZXQgPSBvcGVuX2lucHV0KGMsIHBscywgc2VnLT5pbml0X3NlY3Rpb24pOworICAgIHJldCA9IG9wZW5faW5wdXQoYywgcGxzLCBzZWctPmluaXRfc2VjdGlvbiwgJnBscy0+aW5wdXQpOwogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhwbHMtPnBhcmVudCwgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gYW4gaW5pdGlhbGl6YXRpb24gc2VjdGlvbiBpbiBwbGF5bGlzdCAlZFxuIiwKQEAgLTExOTcsNyArMTI4OSw3IEBACiAKICAgICBpZiAoc2VnLT5pbml0X3NlY3Rpb24tPnNpemUgPj0gMCkKICAgICAgICAgc2VjX3NpemUgPSBzZWctPmluaXRfc2VjdGlvbi0+c2l6ZTsKLSAgICBlbHNlIGlmICgodXJsc2l6ZSA9IGZmdXJsX3NpemUocGxzLT5pbnB1dCkpID49IDApCisgICAgZWxzZSBpZiAoKHVybHNpemUgPSBhdmlvX3NpemUocGxzLT5pbnB1dCkpID49IDApCiAgICAgICAgIHNlY19zaXplID0gdXJsc2l6ZTsKICAgICBlbHNlCiAgICAgICAgIHNlY19zaXplID0gbWF4X2luaXRfc2VjdGlvbl9zaXplOwpAQCAtMTIxMiw4ICsxMzA0LDcgQEAKIAogICAgIHJldCA9IHJlYWRfZnJvbV91cmwocGxzLCBzZWctPmluaXRfc2VjdGlvbiwgcGxzLT5pbml0X3NlY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICBwbHMtPmluaXRfc2VjX2J1Zl9zaXplLCBSRUFEX0NPTVBMRVRFKTsKLSAgICBmZnVybF9jbG9zZShwbHMtPmlucHV0KTsKLSAgICBwbHMtPmlucHV0ID0gTlVMTDsKKyAgICBmZl9mb3JtYXRfaW9fY2xvc2UocGxzLT5wYXJlbnQsICZwbHMtPmlucHV0KTsKIAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMTIzNiwzMiArMTMyNyw3MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBwbHMtPnRhcmdldF9kdXJhdGlvbjsKIH0KIAorc3RhdGljIGludCBwbGF5bGlzdF9uZWVkZWQoc3RydWN0IHBsYXlsaXN0ICpwbHMpCit7CisgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gcGxzLT5wYXJlbnQ7CisgICAgaW50IGksIGo7CisgICAgaW50IHN0cmVhbV9uZWVkZWQgPSAwOworICAgIGludCBmaXJzdF9zdDsKKworICAgIC8qIElmIHRoZXJlIGlzIG5vIGNvbnRleHQgb3Igc3RyZWFtcyB5ZXQsIHRoZSBwbGF5bGlzdCBpcyBuZWVkZWQgKi8KKyAgICBpZiAoIXBscy0+Y3R4IHx8ICFwbHMtPm5fbWFpbl9zdHJlYW1zKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8qIGNoZWNrIGlmIGFueSBvZiB0aGUgc3RyZWFtcyBpbiB0aGUgcGxheWxpc3QgYXJlIG5lZWRlZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBwbHMtPm5fbWFpbl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKHBscy0+bWFpbl9zdHJlYW1zW2ldLT5kaXNjYXJkIDwgQVZESVNDQVJEX0FMTCkgeworICAgICAgICAgICAgc3RyZWFtX25lZWRlZCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIElmIGFsbCBzdHJlYW1zIGluIHRoZSBwbGF5bGlzdCB3ZXJlIGRpc2NhcmRlZCwgdGhlIHBsYXlsaXN0IGlzIG5vdAorICAgICAqIG5lZWRlZCAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdob2xlIHByb2dyYW1zIGFyZSBkaXNjYXJkZWQgb3Igbm90KS4gKi8KKyAgICBpZiAoIXN0cmVhbV9uZWVkZWQpCisgICAgICAgIHJldHVybiAwOworCisgICAgLyogT3RoZXJ3aXNlLCBjaGVjayBpZiBhbGwgdGhlIHByb2dyYW1zICh2YXJpYW50cykgdGhpcyBwbGF5bGlzdCBpcyBpbiBhcmUKKyAgICAgKiBkaXNjYXJkZWQuIFNpbmNlIGFsbCBzdHJlYW1zIGluIHRoZSBwbGF5bGlzdCBhcmUgcGFydCBvZiB0aGUgc2FtZSBwcm9ncmFtcworICAgICAqIHdlIGNhbiBqdXN0IGNoZWNrIHRoZSBwcm9ncmFtcyBvZiB0aGUgZmlyc3Qgc3RyZWFtLiAqLworCisgICAgZmlyc3Rfc3QgPSBwbHMtPm1haW5fc3RyZWFtc1swXS0+aW5kZXg7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfcHJvZ3JhbXM7IGkrKykgeworICAgICAgICBBVlByb2dyYW0gKnByb2dyYW0gPSBzLT5wcm9ncmFtc1tpXTsKKyAgICAgICAgaWYgKHByb2dyYW0tPmRpc2NhcmQgPCBBVkRJU0NBUkRfQUxMKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcHJvZ3JhbS0+bmJfc3RyZWFtX2luZGV4ZXM7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLT5zdHJlYW1faW5kZXhbal0gPT0gZmlyc3Rfc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcGxheWxpc3QgaXMgaW4gYW4gdW5kaXNjYXJkZWQgcHJvZ3JhbSAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzb21lIHN0cmVhbXMgd2VyZSBub3QgZGlzY2FyZGVkIGJ1dCBhbGwgdGhlIHByb2dyYW1zIHdlcmUgKi8KKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCByZWFkX2RhdGEodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBidWZfc2l6ZSkKIHsKICAgICBzdHJ1Y3QgcGxheWxpc3QgKnYgPSBvcGFxdWU7CiAgICAgSExTQ29udGV4dCAqYyA9IHYtPnBhcmVudC0+cHJpdl9kYXRhOwotICAgIGludCByZXQsIGk7CisgICAgaW50IHJldDsKICAgICBpbnQganVzdF9vcGVuZWQgPSAwOworICAgIGludCByZWxvYWRfY291bnQgPSAwOworICAgIHN0cnVjdCBzZWdtZW50ICpzZWc7CiAKIHJlc3RhcnQ6CiAgICAgaWYgKCF2LT5uZWVkZWQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKIAotICAgIGlmICghdi0+aW5wdXQpIHsKKyAgICBpZiAoIXYtPmlucHV0IHx8IChjLT5odHRwX3BlcnNpc3RlbnQgJiYgdi0+aW5wdXRfcmVhZF9kb25lKSkgewogICAgICAgICBpbnQ2NF90IHJlbG9hZF9pbnRlcnZhbDsKLSAgICAgICAgc3RydWN0IHNlZ21lbnQgKnNlZzsKIAogICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBwbGF5bGlzdCBpcyBzdGlsbCBuZWVkZWQgYmVmb3JlIG9wZW5pbmcgYSBuZXcKICAgICAgICAgICogc2VnbWVudC4gKi8KLSAgICAgICAgaWYgKHYtPmN0eCAmJiB2LT5jdHgtPm5iX3N0cmVhbXMgJiYKLSAgICAgICAgICAgIHYtPnBhcmVudC0+bmJfc3RyZWFtcyA+PSB2LT5zdHJlYW1fb2Zmc2V0ICsgdi0+Y3R4LT5uYl9zdHJlYW1zKSB7Ci0gICAgICAgICAgICB2LT5uZWVkZWQgPSAwOwotICAgICAgICAgICAgZm9yIChpID0gdi0+c3RyZWFtX29mZnNldDsgaSA8IHYtPnN0cmVhbV9vZmZzZXQgKyB2LT5jdHgtPm5iX3N0cmVhbXM7Ci0gICAgICAgICAgICAgICAgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHYtPnBhcmVudC0+c3RyZWFtc1tpXS0+ZGlzY2FyZCA8IEFWRElTQ0FSRF9BTEwpCi0gICAgICAgICAgICAgICAgICAgIHYtPm5lZWRlZCA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgdi0+bmVlZGVkID0gcGxheWxpc3RfbmVlZGVkKHYpOworCiAgICAgICAgIGlmICghdi0+bmVlZGVkKSB7CiAgICAgICAgICAgICBhdl9sb2codi0+cGFyZW50LCBBVl9MT0dfSU5GTywgIk5vIGxvbmdlciByZWNlaXZpbmcgcGxheWxpc3QgJWRcbiIsCiAgICAgICAgICAgICAgICAgdi0+aW5kZXgpOwpAQCAtMTI3MywxMSArMTQwNCwxNSBAQAogICAgICAgICByZWxvYWRfaW50ZXJ2YWwgPSBkZWZhdWx0X3JlbG9hZF9pbnRlcnZhbCh2KTsKIAogcmVsb2FkOgorICAgICAgICByZWxvYWRfY291bnQrKzsKKyAgICAgICAgaWYgKHJlbG9hZF9jb3VudCA+IGMtPm1heF9yZWxvYWQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAgICAgICAgIGlmICghdi0+ZmluaXNoZWQgJiYKICAgICAgICAgICAgIGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHYtPmxhc3RfbG9hZF90aW1lID49IHJlbG9hZF9pbnRlcnZhbCkgewogICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9wbGF5bGlzdChjLCB2LT51cmwsIHYsIE5VTEwpKSA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2codi0+cGFyZW50LCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byByZWxvYWQgcGxheWxpc3QgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHYtPmluZGV4KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEFWRVJST1JfRVhJVCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHYtPnBhcmVudCwgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gcmVsb2FkIHBsYXlsaXN0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdi0+aW5kZXgpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvKiBJZiB3ZSBuZWVkIHRvIHJlbG9hZCB0aGUgcGxheWxpc3QgYWdhaW4gYmVsb3cgKGlmCkBAIC0xMzAzLDYgKzE0MzgsNyBAQAogICAgICAgICAgICAgZ290byByZWxvYWQ7CiAgICAgICAgIH0KIAorICAgICAgICB2LT5pbnB1dF9yZWFkX2RvbmUgPSAwOwogICAgICAgICBzZWcgPSBjdXJyZW50X3NlZ21lbnQodik7CiAKICAgICAgICAgLyogbG9hZC91cGRhdGUgTWVkaWEgSW5pdGlhbGl6YXRpb24gU2VjdGlvbiwgaWYgYW55ICovCkBAIC0xMzEwLDExICsxNDQ2LDE4IEBACiAgICAgICAgIGlmIChyZXQpCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgIHJldCA9IG9wZW5faW5wdXQoYywgdiwgc2VnKTsKKyAgICAgICAgaWYgKGMtPmh0dHBfbXVsdGlwbGUgPT0gMSAmJiB2LT5pbnB1dF9uZXh0X3JlcXVlc3RlZCkgeworICAgICAgICAgICAgRkZTV0FQKEFWSU9Db250ZXh0ICosIHYtPmlucHV0LCB2LT5pbnB1dF9uZXh0KTsKKyAgICAgICAgICAgIHYtPmlucHV0X25leHRfcmVxdWVzdGVkID0gMDsKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBvcGVuX2lucHV0KGMsIHYsIHNlZywgJnYtPmlucHV0KTsKKyAgICAgICAgfQogICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdChjLT5pbnRlcnJ1cHRfY2FsbGJhY2spKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7Ci0gICAgICAgICAgICBhdl9sb2codi0+cGFyZW50LCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBvcGVuIHNlZ21lbnQgb2YgcGxheWxpc3QgJWRcbiIsCisgICAgICAgICAgICBhdl9sb2codi0+cGFyZW50LCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBvcGVuIHNlZ21lbnQgJWQgb2YgcGxheWxpc3QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgdi0+Y3VyX3NlcV9ubywKICAgICAgICAgICAgICAgICAgICB2LT5pbmRleCk7CiAgICAgICAgICAgICB2LT5jdXJfc2VxX25vICs9IDE7CiAgICAgICAgICAgICBnb3RvIHJlbG9hZDsKQEAgLTEzMjIsNiArMTQ2NSwzMCBAQAogICAgICAgICBqdXN0X29wZW5lZCA9IDE7CiAgICAgfQogCisgICAgaWYgKGMtPmh0dHBfbXVsdGlwbGUgPT0gLTEpIHsKKyAgICAgICAgdWludDhfdCAqaHR0cF92ZXJzaW9uX29wdCA9IE5VTEw7CisgICAgICAgIGludCByID0gYXZfb3B0X2dldCh2LT5pbnB1dCwgImh0dHBfdmVyc2lvbiIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4sICZodHRwX3ZlcnNpb25fb3B0KTsKKyAgICAgICAgaWYgKHIgPj0gMCkgeworICAgICAgICAgICAgYy0+aHR0cF9tdWx0aXBsZSA9IHN0cm5jbXAoKGNvbnN0IGNoYXIgKilodHRwX3ZlcnNpb25fb3B0LCAiMS4xIiwgMykgPT0gMDsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZodHRwX3ZlcnNpb25fb3B0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNlZyA9IG5leHRfc2VnbWVudCh2KTsKKyAgICBpZiAoYy0+aHR0cF9tdWx0aXBsZSA9PSAxICYmICF2LT5pbnB1dF9uZXh0X3JlcXVlc3RlZCAmJgorICAgICAgICBzZWcgJiYgc2VnLT5rZXlfdHlwZSA9PSBLRVlfTk9ORSAmJiBhdl9zdHJzdGFydChzZWctPnVybCwgImh0dHAiLCBOVUxMKSkgeworICAgICAgICByZXQgPSBvcGVuX2lucHV0KGMsIHYsIHNlZywgJnYtPmlucHV0X25leHQpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdChjLT5pbnRlcnJ1cHRfY2FsbGJhY2spKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgICAgICAgICBhdl9sb2codi0+cGFyZW50LCBBVl9MT0dfV0FSTklORywgIkZhaWxlZCB0byBvcGVuIHNlZ21lbnQgJWQgb2YgcGxheWxpc3QgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgdi0+Y3VyX3NlcV9ubyArIDEsCisgICAgICAgICAgICAgICAgICAgdi0+aW5kZXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdi0+aW5wdXRfbmV4dF9yZXF1ZXN0ZWQgPSAxOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKHYtPmluaXRfc2VjX2J1Zl9yZWFkX29mZnNldCA8IHYtPmluaXRfc2VjX2RhdGFfbGVuKSB7CiAgICAgICAgIC8qIFB1c2ggaW5pdCBzZWN0aW9uIG91dCBmaXJzdCBiZWZvcmUgZmlyc3QgYWN0dWFsIHNlZ21lbnQgKi8KICAgICAgICAgaW50IGNvcHlfc2l6ZSA9IEZGTUlOKHYtPmluaXRfc2VjX2RhdGFfbGVuIC0gdi0+aW5pdF9zZWNfYnVmX3JlYWRfb2Zmc2V0LCBidWZfc2l6ZSk7CkBAIC0xMzMwLDcgKzE0OTcsOCBAQAogICAgICAgICByZXR1cm4gY29weV9zaXplOwogICAgIH0KIAotICAgIHJldCA9IHJlYWRfZnJvbV91cmwodiwgY3VycmVudF9zZWdtZW50KHYpLCBidWYsIGJ1Zl9zaXplLCBSRUFEX05PUk1BTCk7CisgICAgc2VnID0gY3VycmVudF9zZWdtZW50KHYpOworICAgIHJldCA9IHJlYWRfZnJvbV91cmwodiwgc2VnLCBidWYsIGJ1Zl9zaXplLCBSRUFEX05PUk1BTCk7CiAgICAgaWYgKHJldCA+IDApIHsKICAgICAgICAgaWYgKGp1c3Rfb3BlbmVkICYmIHYtPmlzX2lkM190aW1lc3RhbXBlZCAhPSAwKSB7CiAgICAgICAgICAgICAvKiBJbnRlcmNlcHQgSUQzIHRhZ3MgaGVyZSwgZWxlbWVudGFyeSBhdWRpbyBzdHJlYW1zIGFyZSByZXF1aXJlZApAQCAtMTM0MCw4ICsxNTA4LDEyIEBACiAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0gICAgZmZ1cmxfY2xvc2Uodi0+aW5wdXQpOwotICAgIHYtPmlucHV0ID0gTlVMTDsKKyAgICBpZiAoYy0+aHR0cF9wZXJzaXN0ZW50ICYmCisgICAgICAgIHNlZy0+a2V5X3R5cGUgPT0gS0VZX05PTkUgJiYgYXZfc3Ryc3RhcnQoc2VnLT51cmwsICJodHRwIiwgTlVMTCkpIHsKKyAgICAgICAgdi0+aW5wdXRfcmVhZF9kb25lID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2Uodi0+cGFyZW50LCAmdi0+aW5wdXQpOworICAgIH0KICAgICB2LT5jdXJfc2VxX25vKys7CiAKICAgICBjLT5jdXJfc2VxX25vID0gdi0+Y3VyX3NlcV9ubzsKQEAgLTEzNDksMjUgKzE1MjEsNiBAQAogICAgIGdvdG8gcmVzdGFydDsKIH0KIAotc3RhdGljIGludCBwbGF5bGlzdF9pbl9tdWx0aXBsZV92YXJpYW50cyhITFNDb250ZXh0ICpjLCBzdHJ1Y3QgcGxheWxpc3QgKnBscykKLXsKLSAgICBpbnQgdmFyaWFudF9jb3VudCA9IDA7Ci0gICAgaW50IGksIGo7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl92YXJpYW50cyAmJiB2YXJpYW50X2NvdW50IDwgMjsgaSsrKSB7Ci0gICAgICAgIHN0cnVjdCB2YXJpYW50ICp2ID0gYy0+dmFyaWFudHNbaV07Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHYtPm5fcGxheWxpc3RzOyBqKyspIHsKLSAgICAgICAgICAgIGlmICh2LT5wbGF5bGlzdHNbal0gPT0gcGxzKSB7Ci0gICAgICAgICAgICAgICAgdmFyaWFudF9jb3VudCsrOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhcmlhbnRfY291bnQgPj0gMjsKLX0KLQogc3RhdGljIHZvaWQgYWRkX3JlbmRpdGlvbnNfdG9fdmFyaWFudChITFNDb250ZXh0ICpjLCBzdHJ1Y3QgdmFyaWFudCAqdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUsIGNvbnN0IGNoYXIgKmdyb3VwX2lkKQogewpAQCAtMTM5OCwxMCArMTU1MSwxMCBAQAogICAgIGludCByZW5kX2lkeCA9IDA7CiAgICAgaW50IGk7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcGxzLT5jdHgtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3Bscy0+c3RyZWFtX29mZnNldCArIGldOworICAgIGZvciAoaSA9IDA7IGkgPCBwbHMtPm5fbWFpbl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gcGxzLT5tYWluX3N0cmVhbXNbaV07CiAKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSB0eXBlKQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IHR5cGUpCiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBmb3IgKDsgcmVuZF9pZHggPCBwbHMtPm5fcmVuZGl0aW9uczsgcmVuZF9pZHgrKykgewpAQCAtMTQ5Miw5ICsxNjQ1LDkgQEAKIHN0YXRpYyBpbnQgc2F2ZV9hdmlvX29wdGlvbnMoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIEhMU0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7Ci0gICAgY29uc3QgY2hhciAqb3B0c1tdID0gewotICAgICAgICAiaGVhZGVycyIsICJodHRwX3Byb3h5IiwgInVzZXJfYWdlbnQiLCAidXNlci1hZ2VudCIsICJjb29raWVzIiwgTlVMTCB9OwotICAgIGNvbnN0IGNoYXIgKipvcHQgPSBvcHRzOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3B0c1tdID0geworICAgICAgICAiaGVhZGVycyIsICJodHRwX3Byb3h5IiwgInVzZXJfYWdlbnQiLCAidXNlci1hZ2VudCIsICJjb29raWVzIiwgInJlZmVyZXIiLCBOVUxMIH07CisgICAgY29uc3QgY2hhciAqIGNvbnN0ICogb3B0ID0gb3B0czsKICAgICB1aW50OF90ICpidWY7CiAgICAgaW50IHJldCA9IDA7CiAKQEAgLTE1MTEsMTEgKzE2NjQsMTI3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBuZXN0ZWRfaW9fb3BlbihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICoqcGIsIGNvbnN0IGNoYXIgKnVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBBVkRpY3Rpb25hcnkgKipvcHRzKQoreworICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICJBIEhMUyBwbGF5bGlzdCBpdGVtICclcycgcmVmZXJyZWQgdG8gYW4gZXh0ZXJuYWwgZmlsZSAnJXMnLiAiCisgICAgICAgICAgICJPcGVuaW5nIHRoaXMgZmlsZSB3YXMgZm9yYmlkZGVuIGZvciBzZWN1cml0eSByZWFzb25zXG4iLAorICAgICAgICAgICBzLT51cmwsIHVybCk7CisgICAgcmV0dXJuIEFWRVJST1IoRVBFUk0pOworfQorCitzdGF0aWMgdm9pZCBhZGRfc3RyZWFtX3RvX3Byb2dyYW1zKEFWRm9ybWF0Q29udGV4dCAqcywgc3RydWN0IHBsYXlsaXN0ICpwbHMsIEFWU3RyZWFtICpzdHJlYW0pCit7CisgICAgSExTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgYmFuZHdpZHRoID0gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl92YXJpYW50czsgaSsrKSB7CisgICAgICAgIHN0cnVjdCB2YXJpYW50ICp2ID0gYy0+dmFyaWFudHNbaV07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHYtPm5fcGxheWxpc3RzOyBqKyspIHsKKyAgICAgICAgICAgIGlmICh2LT5wbGF5bGlzdHNbal0gIT0gcGxzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBhdl9wcm9ncmFtX2FkZF9zdHJlYW1faW5kZXgocywgaSwgc3RyZWFtLT5pbmRleCk7CisKKyAgICAgICAgICAgIGlmIChiYW5kd2lkdGggPCAwKQorICAgICAgICAgICAgICAgIGJhbmR3aWR0aCA9IHYtPmJhbmR3aWR0aDsKKyAgICAgICAgICAgIGVsc2UgaWYgKGJhbmR3aWR0aCAhPSB2LT5iYW5kd2lkdGgpCisgICAgICAgICAgICAgICAgYmFuZHdpZHRoID0gLTE7IC8qIHN0cmVhbSBpbiBtdWx0aXBsZSB2YXJpYW50cyB3aXRoIGRpZmZlcmVudCBiYW5kd2lkdGhzICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYmFuZHdpZHRoID49IDApCisgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmc3RyZWFtLT5tZXRhZGF0YSwgInZhcmlhbnRfYml0cmF0ZSIsIGJhbmR3aWR0aCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3N0cmVhbV9pbmZvX2Zyb21faW5wdXRfc3RyZWFtKEFWU3RyZWFtICpzdCwgc3RydWN0IHBsYXlsaXN0ICpwbHMsIEFWU3RyZWFtICppc3QpCit7CisgICAgaW50IGVycjsKKworICAgIGVyciA9IGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KHN0LT5jb2RlY3BhciwgaXN0LT5jb2RlY3Bhcik7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBpZiAocGxzLT5pc19pZDNfdGltZXN0YW1wZWQpIC8qIGN1c3RvbSB0aW1lc3RhbXBzIHZpYSBpZDMgKi8KKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIE1QRUdfVElNRV9CQVNFKTsKKyAgICBlbHNlCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIGlzdC0+cHRzX3dyYXBfYml0cywgaXN0LT50aW1lX2Jhc2UubnVtLCBpc3QtPnRpbWVfYmFzZS5kZW4pOworCisgICAgc3QtPmludGVybmFsLT5uZWVkX2NvbnRleHRfdXBkYXRlID0gMTsKKworICAgIHJldHVybiAwOworfQorCisvKiBhZGQgbmV3IHN1YmRlbXV4ZXIgc3RyZWFtcyB0byBvdXIgY29udGV4dCwgaWYgYW55ICovCitzdGF0aWMgaW50IHVwZGF0ZV9zdHJlYW1zX2Zyb21fc3ViZGVtdXhlcihBVkZvcm1hdENvbnRleHQgKnMsIHN0cnVjdCBwbGF5bGlzdCAqcGxzKQoreworICAgIGludCBlcnI7CisKKyAgICB3aGlsZSAocGxzLT5uX21haW5fc3RyZWFtcyA8IHBscy0+Y3R4LT5uYl9zdHJlYW1zKSB7CisgICAgICAgIGludCBpc3RfaWR4ID0gcGxzLT5uX21haW5fc3RyZWFtczsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgQVZTdHJlYW0gKmlzdCA9IHBscy0+Y3R4LT5zdHJlYW1zW2lzdF9pZHhdOworCisgICAgICAgIGlmICghc3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHN0LT5pZCA9IHBscy0+aW5kZXg7CisgICAgICAgIGR5bmFycmF5X2FkZCgmcGxzLT5tYWluX3N0cmVhbXMsICZwbHMtPm5fbWFpbl9zdHJlYW1zLCBzdCk7CisKKyAgICAgICAgYWRkX3N0cmVhbV90b19wcm9ncmFtcyhzLCBwbHMsIHN0KTsKKworICAgICAgICBlcnIgPSBzZXRfc3RyZWFtX2luZm9fZnJvbV9pbnB1dF9zdHJlYW0oc3QsIHBscywgaXN0KTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfbm9oZWFkZXJfZmxhZyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSExTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgZmxhZ19uZWVkZWQgPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fcGxheWxpc3RzOyBpKyspIHsKKyAgICAgICAgc3RydWN0IHBsYXlsaXN0ICpwbHMgPSBjLT5wbGF5bGlzdHNbaV07CisKKyAgICAgICAgaWYgKHBscy0+aGFzX25vaGVhZGVyX2ZsYWcpIHsKKyAgICAgICAgICAgIGZsYWdfbmVlZGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZsYWdfbmVlZGVkKQorICAgICAgICBzLT5jdHhfZmxhZ3MgfD0gQVZGTVRDVFhfTk9IRUFERVI7CisgICAgZWxzZQorICAgICAgICBzLT5jdHhfZmxhZ3MgJj0gfkFWRk1UQ1RYX05PSEVBREVSOworfQorCitzdGF0aWMgaW50IGhsc19jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSExTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKKworICAgIGZyZWVfcGxheWxpc3RfbGlzdChjKTsKKyAgICBmcmVlX3ZhcmlhbnRfbGlzdChjKTsKKyAgICBmcmVlX3JlbmRpdGlvbl9saXN0KGMpOworCisgICAgYXZfZGljdF9mcmVlKCZjLT5hdmlvX29wdHMpOworICAgIGZmX2Zvcm1hdF9pb19jbG9zZShjLT5jdHgsICZjLT5wbGF5bGlzdF9wYik7CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBobHNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIFVSTENvbnRleHQgKnUgPSAocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0NVU1RPTV9JTykgPyBOVUxMIDogcy0+cGItPm9wYXF1ZTsKKyAgICB2b2lkICp1ID0gKHMtPmZsYWdzICYgQVZGTVRfRkxBR19DVVNUT01fSU8pID8gTlVMTCA6IHMtPnBiOwogICAgIEhMU0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7Ci0gICAgaW50IHJldCA9IDAsIGksIGosIHN0cmVhbV9vZmZzZXQgPSAwOworICAgIGludCByZXQgPSAwLCBpOworICAgIGludCBoaWdoZXN0X2N1cl9zZXFfbm8gPSAwOwogCiAgICAgYy0+Y3R4ICAgICAgICAgICAgICAgID0gczsKICAgICBjLT5pbnRlcnJ1cHRfY2FsbGJhY2sgPSAmcy0+aW50ZXJydXB0X2NhbGxiYWNrOwpAQCAtMTUyNSwyMiArMTc5NCwyMSBAQAogICAgIGMtPmZpcnN0X3RpbWVzdGFtcCA9IEFWX05PUFRTX1ZBTFVFOwogICAgIGMtPmN1cl90aW1lc3RhbXAgPSBBVl9OT1BUU19WQUxVRTsKIAotICAgIC8vIGlmIHRoZSBVUkwgY29udGV4dCBpcyBnb29kLCByZWFkIGltcG9ydGFudCBvcHRpb25zIHdlIG11c3QgYnJva2VyIGxhdGVyCi0gICAgaWYgKHUgJiYgdS0+cHJvdC0+cHJpdl9kYXRhX2NsYXNzKSB7CisgICAgaWYgKHUpIHsKICAgICAgICAgLy8gZ2V0IHRoZSBwcmV2aW91cyB1c2VyIGFnZW50ICYgc2V0IGJhY2sgdG8gbnVsbCBpZiBzdHJpbmcgc2l6ZSBpcyB6ZXJvCi0gICAgICAgIHVwZGF0ZV9vcHRpb25zKCZjLT51c2VyX2FnZW50LCAidXNlci1hZ2VudCIsIHUtPnByaXZfZGF0YSk7CisgICAgICAgIHVwZGF0ZV9vcHRpb25zKCZjLT51c2VyX2FnZW50LCAidXNlcl9hZ2VudCIsIHUpOwogCiAgICAgICAgIC8vIGdldCB0aGUgcHJldmlvdXMgY29va2llcyAmIHNldCBiYWNrIHRvIG51bGwgaWYgc3RyaW5nIHNpemUgaXMgemVybwotICAgICAgICB1cGRhdGVfb3B0aW9ucygmYy0+Y29va2llcywgImNvb2tpZXMiLCB1LT5wcml2X2RhdGEpOworICAgICAgICB1cGRhdGVfb3B0aW9ucygmYy0+Y29va2llcywgImNvb2tpZXMiLCB1KTsKIAogICAgICAgICAvLyBnZXQgdGhlIHByZXZpb3VzIGhlYWRlcnMgJiBzZXQgYmFjayB0byBudWxsIGlmIHN0cmluZyBzaXplIGlzIHplcm8KLSAgICAgICAgdXBkYXRlX29wdGlvbnMoJmMtPmhlYWRlcnMsICJoZWFkZXJzIiwgdS0+cHJpdl9kYXRhKTsKKyAgICAgICAgdXBkYXRlX29wdGlvbnMoJmMtPmhlYWRlcnMsICJoZWFkZXJzIiwgdSk7CiAKICAgICAgICAgLy8gZ2V0IHRoZSBwcmV2aW91cyBodHRwIHByb3h0ICYgc2V0IGJhY2sgdG8gbnVsbCBpZiBzdHJpbmcgc2l6ZSBpcyB6ZXJvCi0gICAgICAgIHVwZGF0ZV9vcHRpb25zKCZjLT5odHRwX3Byb3h5LCAiaHR0cF9wcm94eSIsIHUtPnByaXZfZGF0YSk7CisgICAgICAgIHVwZGF0ZV9vcHRpb25zKCZjLT5odHRwX3Byb3h5LCAiaHR0cF9wcm94eSIsIHUpOwogICAgIH0KIAotICAgIGlmICgocmV0ID0gcGFyc2VfcGxheWxpc3QoYywgcy0+ZmlsZW5hbWUsIE5VTEwsIHMtPnBiKSkgPCAwKQorICAgIGlmICgocmV0ID0gcGFyc2VfcGxheWxpc3QoYywgcy0+dXJsLCBOVUxMLCBzLT5wYikpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCiAgICAgaWYgKChyZXQgPSBzYXZlX2F2aW9fb3B0aW9ucyhzKSkgPCAwKQpAQCAtMTU5MSw2ICsxODU5LDI4IEBACiAgICAgICAgICAgICBhZGRfcmVuZGl0aW9uc190b192YXJpYW50KGMsIHZhciwgQVZNRURJQV9UWVBFX1NVQlRJVExFLCB2YXItPnN1YnRpdGxlc19ncm91cCk7CiAgICAgfQogCisgICAgLyogQ3JlYXRlIGEgcHJvZ3JhbSBmb3IgZWFjaCB2YXJpYW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fdmFyaWFudHM7IGkrKykgeworICAgICAgICBzdHJ1Y3QgdmFyaWFudCAqdiA9IGMtPnZhcmlhbnRzW2ldOworICAgICAgICBBVlByb2dyYW0gKnByb2dyYW07CisKKyAgICAgICAgcHJvZ3JhbSA9IGF2X25ld19wcm9ncmFtKHMsIGkpOworICAgICAgICBpZiAoIXByb2dyYW0pCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmcHJvZ3JhbS0+bWV0YWRhdGEsICJ2YXJpYW50X2JpdHJhdGUiLCB2LT5iYW5kd2lkdGgsIDApOworICAgIH0KKworICAgIC8qIFNlbGVjdCB0aGUgc3RhcnRpbmcgc2VnbWVudHMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl9wbGF5bGlzdHM7IGkrKykgeworICAgICAgICBzdHJ1Y3QgcGxheWxpc3QgKnBscyA9IGMtPnBsYXlsaXN0c1tpXTsKKworICAgICAgICBpZiAocGxzLT5uX3NlZ21lbnRzID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBwbHMtPmN1cl9zZXFfbm8gPSBzZWxlY3RfY3VyX3NlcV9ubyhjLCBwbHMpOworICAgICAgICBoaWdoZXN0X2N1cl9zZXFfbm8gPSBGRk1BWChoaWdoZXN0X2N1cl9zZXFfbm8sIHBscy0+Y3VyX3NlcV9ubyk7CisgICAgfQorCiAgICAgLyogT3BlbiB0aGUgZGVtdXhlciBmb3IgZWFjaCBwbGF5bGlzdCAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBjLT5uX3BsYXlsaXN0czsgaSsrKSB7CiAgICAgICAgIHN0cnVjdCBwbGF5bGlzdCAqcGxzID0gYy0+cGxheWxpc3RzW2ldOwpAQCAtMTYwNyw3ICsxODk3LDE4IEBACiAgICAgICAgIHBscy0+aW5kZXggID0gaTsKICAgICAgICAgcGxzLT5uZWVkZWQgPSAxOwogICAgICAgICBwbHMtPnBhcmVudCA9IHM7Ci0gICAgICAgIHBscy0+Y3VyX3NlcV9ubyA9IHNlbGVjdF9jdXJfc2VxX25vKGMsIHBscyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgdGhpcyBpcyBhIGxpdmUgc3RyZWFtIGFuZCB0aGlzIHBsYXlsaXN0IGxvb2tzIGxpa2UgaXQgaXMgb25lIHNlZ21lbnQKKyAgICAgICAgICogYmVoaW5kLCB0cnkgdG8gc3luYyBpdCB1cCBzbyB0aGF0IGV2ZXJ5IHN1YnN0cmVhbSBzdGFydHMgYXQgdGhlIHNhbWUKKyAgICAgICAgICogdGltZSBwb3NpdGlvbiAoc28gZS5nLiBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkgd2lsbCBzZWUgcGFja2V0cyBmcm9tCisgICAgICAgICAqIGFsbCBhY3RpdmUgc3RyZWFtcyB3aXRoaW4gdGhlIGZpcnN0IGZldyBzZWNvbmRzKS4gVGhpcyBpcyBub3QgdmVyeSBnZW5lcmljLAorICAgICAgICAgKiB0aG91Z2gsIGFzIHRoZSBzZXF1ZW5jZSBudW1iZXJzIGFyZSB0ZWNobmljYWxseSBpbmRlcGVuZGVudC4KKyAgICAgICAgICovCisgICAgICAgIGlmICghcGxzLT5maW5pc2hlZCAmJiBwbHMtPmN1cl9zZXFfbm8gPT0gaGlnaGVzdF9jdXJfc2VxX25vIC0gMSAmJgorICAgICAgICAgICAgaGlnaGVzdF9jdXJfc2VxX25vIDwgcGxzLT5zdGFydF9zZXFfbm8gKyBwbHMtPm5fc2VnbWVudHMpIHsKKyAgICAgICAgICAgIHBscy0+Y3VyX3NlcV9ubyA9IGhpZ2hlc3RfY3VyX3NlcV9ubzsKKyAgICAgICAgfQogCiAgICAgICAgIHBscy0+cmVhZF9idWZmZXIgPSBhdl9tYWxsb2MoSU5JVElBTF9CVUZGRVJfU0laRSk7CiAgICAgICAgIGlmICghcGxzLT5yZWFkX2J1ZmZlcil7CkBAIC0xNjMyLDkgKzE5MzMsMTAgQEAKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogICAgICAgICBwbHMtPmN0eC0+cGIgICAgICAgPSAmcGxzLT5wYjsKLSAgICAgICAgcGxzLT5zdHJlYW1fb2Zmc2V0ID0gc3RyZWFtX29mZnNldDsKKyAgICAgICAgcGxzLT5jdHgtPmlvX29wZW4gID0gbmVzdGVkX2lvX29wZW47CisgICAgICAgIHBscy0+Y3R4LT5mbGFncyAgIHw9IHMtPmZsYWdzICYgfkFWRk1UX0ZMQUdfQ1VTVE9NX0lPOwogCi0gICAgICAgIGlmICgocmV0ID0gZmZfY29weV93aGl0ZWxpc3RzKHBscy0+Y3R4LCBzKSkgPCAwKQorICAgICAgICBpZiAoKHJldCA9IGZmX2NvcHlfd2hpdGVibGFja2xpc3RzKHBscy0+Y3R4LCBzKSkgPCAwKQogICAgICAgICAgICAgZ290byBmYWlsOwogCiAgICAgICAgIHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJnBscy0+Y3R4LCBwbHMtPnNlZ21lbnRzWzBdLT51cmwsIGluX2ZtdCwgTlVMTCk7CkBAIC0xNjQ0LDc1ICsxOTQ2LDUwIEBACiAgICAgICAgIGlmIChwbHMtPmlkM19kZWZlcnJlZF9leHRyYSAmJiBwbHMtPmN0eC0+bmJfc3RyZWFtcyA9PSAxKSB7CiAgICAgICAgICAgICBmZl9pZDN2Ml9wYXJzZV9hcGljKHBscy0+Y3R4LCAmcGxzLT5pZDNfZGVmZXJyZWRfZXh0cmEpOwogICAgICAgICAgICAgYXZmb3JtYXRfcXVldWVfYXR0YWNoZWRfcGljdHVyZXMocGxzLT5jdHgpOworICAgICAgICAgICAgZmZfaWQzdjJfcGFyc2VfcHJpdihwbHMtPmN0eCwgJnBscy0+aWQzX2RlZmVycmVkX2V4dHJhKTsKICAgICAgICAgICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmcGxzLT5pZDNfZGVmZXJyZWRfZXh0cmEpOwogICAgICAgICAgICAgcGxzLT5pZDNfZGVmZXJyZWRfZXh0cmEgPSBOVUxMOwogICAgICAgICB9CiAKLSAgICAgICAgcGxzLT5jdHgtPmN0eF9mbGFncyAmPSB+QVZGTVRDVFhfTk9IRUFERVI7Ci0gICAgICAgIHJldCA9IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8ocGxzLT5jdHgsIE5VTEwpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLQogICAgICAgICBpZiAocGxzLT5pc19pZDNfdGltZXN0YW1wZWQgPT0gLTEpCiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJObyBleHBlY3RlZCBIVFRQIHJlcXVlc3RzIGhhdmUgYmVlbiBtYWRlXG4iKTsKIAotICAgICAgICAvKiBDcmVhdGUgbmV3IEFWU3RyZWFtcyBmb3IgZWFjaCBzdHJlYW0gaW4gdGhpcyBwbGF5bGlzdCAqLwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGxzLT5jdHgtPm5iX3N0cmVhbXM7IGorKykgewotICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKLSAgICAgICAgICAgIEFWU3RyZWFtICppc3QgPSBwbHMtPmN0eC0+c3RyZWFtc1tqXTsKLSAgICAgICAgICAgIGlmICghc3QpIHsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIC8qCisgICAgICAgICAqIEZvciBJRDMgdGltZXN0YW1wZWQgcmF3IGF1ZGlvIHN0cmVhbXMgd2UgbmVlZCB0byBkZXRlY3QgdGhlIHBhY2tldAorICAgICAgICAgKiBkdXJhdGlvbnMgdG8gY2FsY3VsYXRlIHRpbWVzdGFtcHMgaW4gZmlsbF90aW1pbmdfZm9yX2lkM190aW1lc3RhbXBlZF9zdHJlYW0oKSwKKyAgICAgICAgICogYnV0IGZvciBvdGhlciBzdHJlYW1zIHdlIGNhbiByZWx5IG9uIG91ciB1c2VyIGNhbGxpbmcgYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbygpCisgICAgICAgICAqIG9uIHVzIGlmIHRoZXkgd2FudCB0by4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwbHMtPmlzX2lkM190aW1lc3RhbXBlZCkgeworICAgICAgICAgICAgcmV0ID0gYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhwbHMtPmN0eCwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdC0+aWQgPSBpOwotCi0gICAgICAgICAgICBhdmNvZGVjX2NvcHlfY29udGV4dChzdC0+Y29kZWMsIHBscy0+Y3R4LT5zdHJlYW1zW2pdLT5jb2RlYyk7Ci0KLSAgICAgICAgICAgIGlmIChwbHMtPmlzX2lkM190aW1lc3RhbXBlZCkgLyogY3VzdG9tIHRpbWVzdGFtcHMgdmlhIGlkMyAqLwotICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCBNUEVHX1RJTUVfQkFTRSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgaXN0LT5wdHNfd3JhcF9iaXRzLCBpc3QtPnRpbWVfYmFzZS5udW0sIGlzdC0+dGltZV9iYXNlLmRlbik7CiAgICAgICAgIH0KIAorICAgICAgICBwbHMtPmhhc19ub2hlYWRlcl9mbGFnID0gISEocGxzLT5jdHgtPmN0eF9mbGFncyAmIEFWRk1UQ1RYX05PSEVBREVSKTsKKworICAgICAgICAvKiBDcmVhdGUgbmV3IEFWU3RyZWFtcyBmb3IgZWFjaCBzdHJlYW0gaW4gdGhpcyBwbGF5bGlzdCAqLworICAgICAgICByZXQgPSB1cGRhdGVfc3RyZWFtc19mcm9tX3N1YmRlbXV4ZXIocywgcGxzKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSBhbnkgbWV0YWRhdGEgZnJvbSBwbGF5bGlzdCB0byBtYWluIHN0cmVhbXMsIGJ1dCBkbyBub3Qgc2V0CisgICAgICAgICAqIGV2ZW50IGZsYWdzLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBscy0+bl9tYWluX3N0cmVhbXMpCisgICAgICAgICAgICBhdl9kaWN0X2NvcHkoJnBscy0+bWFpbl9zdHJlYW1zWzBdLT5tZXRhZGF0YSwgcGxzLT5jdHgtPm1ldGFkYXRhLCAwKTsKKwogICAgICAgICBhZGRfbWV0YWRhdGFfZnJvbV9yZW5kaXRpb25zKHMsIHBscywgQVZNRURJQV9UWVBFX0FVRElPKTsKICAgICAgICAgYWRkX21ldGFkYXRhX2Zyb21fcmVuZGl0aW9ucyhzLCBwbHMsIEFWTUVESUFfVFlQRV9WSURFTyk7CiAgICAgICAgIGFkZF9tZXRhZGF0YV9mcm9tX3JlbmRpdGlvbnMocywgcGxzLCBBVk1FRElBX1RZUEVfU1VCVElUTEUpOwotCi0gICAgICAgIHN0cmVhbV9vZmZzZXQgKz0gcGxzLT5jdHgtPm5iX3N0cmVhbXM7CiAgICAgfQogCi0gICAgLyogQ3JlYXRlIGEgcHJvZ3JhbSBmb3IgZWFjaCB2YXJpYW50ICovCi0gICAgZm9yIChpID0gMDsgaSA8IGMtPm5fdmFyaWFudHM7IGkrKykgewotICAgICAgICBzdHJ1Y3QgdmFyaWFudCAqdiA9IGMtPnZhcmlhbnRzW2ldOwotICAgICAgICBBVlByb2dyYW0gKnByb2dyYW07Ci0KLSAgICAgICAgcHJvZ3JhbSA9IGF2X25ld19wcm9ncmFtKHMsIGkpOwotICAgICAgICBpZiAoIXByb2dyYW0pCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmcHJvZ3JhbS0+bWV0YWRhdGEsICJ2YXJpYW50X2JpdHJhdGUiLCB2LT5iYW5kd2lkdGgsIDApOwotCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCB2LT5uX3BsYXlsaXN0czsgaisrKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgcGxheWxpc3QgKnBscyA9IHYtPnBsYXlsaXN0c1tqXTsKLSAgICAgICAgICAgIGludCBpc19zaGFyZWQgPSBwbGF5bGlzdF9pbl9tdWx0aXBsZV92YXJpYW50cyhjLCBwbHMpOwotICAgICAgICAgICAgaW50IGs7Ci0KLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwbHMtPmN0eC0+bmJfc3RyZWFtczsgaysrKSB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGxzLT5zdHJlYW1fb2Zmc2V0ICsga107Ci0KLSAgICAgICAgICAgICAgICBhdl9wcm9ncmFtX2FkZF9zdHJlYW1faW5kZXgocywgaSwgcGxzLT5zdHJlYW1fb2Zmc2V0ICsgayk7Ci0KLSAgICAgICAgICAgICAgICAvKiBTZXQgdmFyaWFudF9iaXRyYXRlIGZvciBzdHJlYW1zIHVuaXF1ZSB0byB0aGlzIHZhcmlhbnQgKi8KLSAgICAgICAgICAgICAgICBpZiAoIWlzX3NoYXJlZCAmJiB2LT5iYW5kd2lkdGgpCi0gICAgICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0X2ludCgmc3QtPm1ldGFkYXRhLCAidmFyaWFudF9iaXRyYXRlIiwgdi0+YmFuZHdpZHRoLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KKyAgICB1cGRhdGVfbm9oZWFkZXJfZmxhZyhzKTsKIAogICAgIHJldHVybiAwOwogZmFpbDoKLSAgICBmcmVlX3BsYXlsaXN0X2xpc3QoYyk7Ci0gICAgZnJlZV92YXJpYW50X2xpc3QoYyk7Ci0gICAgZnJlZV9yZW5kaXRpb25fbGlzdChjKTsKKyAgICBobHNfY2xvc2Uocyk7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMTcyMCwyMCArMTk5NywxNSBAQAogewogICAgIEhMU0NvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7CiAgICAgaW50IGksIGNoYW5nZWQgPSAwOworICAgIGludCBjdXJfbmVlZGVkOwogCiAgICAgLyogQ2hlY2sgaWYgYW55IG5ldyBzdHJlYW1zIGFyZSBuZWVkZWQgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl9wbGF5bGlzdHM7IGkrKykKLSAgICAgICAgYy0+cGxheWxpc3RzW2ldLT5jdXJfbmVlZGVkID0gMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgc3RydWN0IHBsYXlsaXN0ICpwbHMgPSBjLT5wbGF5bGlzdHNbcy0+c3RyZWFtc1tpXS0+aWRdOwotICAgICAgICBpZiAoc3QtPmRpc2NhcmQgPCBBVkRJU0NBUkRfQUxMKQotICAgICAgICAgICAgcGxzLT5jdXJfbmVlZGVkID0gMTsKLSAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fcGxheWxpc3RzOyBpKyspIHsKICAgICAgICAgc3RydWN0IHBsYXlsaXN0ICpwbHMgPSBjLT5wbGF5bGlzdHNbaV07Ci0gICAgICAgIGlmIChwbHMtPmN1cl9uZWVkZWQgJiYgIXBscy0+bmVlZGVkKSB7CisKKyAgICAgICAgY3VyX25lZWRlZCA9IHBsYXlsaXN0X25lZWRlZChjLT5wbGF5bGlzdHNbaV0pOworCisgICAgICAgIGlmIChjdXJfbmVlZGVkICYmICFwbHMtPm5lZWRlZCkgewogICAgICAgICAgICAgcGxzLT5uZWVkZWQgPSAxOwogICAgICAgICAgICAgY2hhbmdlZCA9IDE7CiAgICAgICAgICAgICBwbHMtPmN1cl9zZXFfbm8gPSBzZWxlY3RfY3VyX3NlcV9ubyhjLCBwbHMpOwpAQCAtMTc0NSwxMCArMjAxNywxMyBAQAogICAgICAgICAgICAgICAgIHBscy0+c2Vla19zdHJlYW1faW5kZXggPSAtMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIk5vdyByZWNlaXZpbmcgcGxheWxpc3QgJWQsIHNlZ21lbnQgJWRcbiIsIGksIHBscy0+Y3VyX3NlcV9ubyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmlyc3QgJiYgIXBscy0+Y3VyX25lZWRlZCAmJiBwbHMtPm5lZWRlZCkgeworICAgICAgICB9IGVsc2UgaWYgKGZpcnN0ICYmICFjdXJfbmVlZGVkICYmIHBscy0+bmVlZGVkKSB7CiAgICAgICAgICAgICBpZiAocGxzLT5pbnB1dCkKLSAgICAgICAgICAgICAgICBmZnVybF9jbG9zZShwbHMtPmlucHV0KTsKLSAgICAgICAgICAgIHBscy0+aW5wdXQgPSBOVUxMOworICAgICAgICAgICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShwbHMtPnBhcmVudCwgJnBscy0+aW5wdXQpOworICAgICAgICAgICAgcGxzLT5pbnB1dF9yZWFkX2RvbmUgPSAwOworICAgICAgICAgICAgaWYgKHBscy0+aW5wdXRfbmV4dCkKKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocGxzLT5wYXJlbnQsICZwbHMtPmlucHV0X25leHQpOworICAgICAgICAgICAgcGxzLT5pbnB1dF9uZXh0X3JlcXVlc3RlZCA9IDA7CiAgICAgICAgICAgICBwbHMtPm5lZWRlZCA9IDA7CiAgICAgICAgICAgICBjaGFuZ2VkID0gMTsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIk5vIGxvbmdlciByZWNlaXZpbmcgcGxheWxpc3QgJWRcbiIsIGkpOwpAQCAtMTg3OSw0MyArMjE1NCw3OSBAQAogICAgIC8qIElmIHdlIGdvdCBhIHBhY2tldCwgcmV0dXJuIGl0ICovCiAgICAgaWYgKG1pbnBsYXlsaXN0ID49IDApIHsKICAgICAgICAgc3RydWN0IHBsYXlsaXN0ICpwbHMgPSBjLT5wbGF5bGlzdHNbbWlucGxheWxpc3RdOworICAgICAgICBBVlN0cmVhbSAqaXN0OworICAgICAgICBBVlN0cmVhbSAqc3Q7CisKKyAgICAgICAgcmV0ID0gdXBkYXRlX3N0cmVhbXNfZnJvbV9zdWJkZW11eGVyKHMsIHBscyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBscy0+cGt0KTsKKyAgICAgICAgICAgIHJlc2V0X3BhY2tldCgmcGxzLT5wa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHN1Yi1kZW11eGVyIHJlcG9ydHMgdXBkYXRlZCBtZXRhZGF0YSwgY29weSBpdCB0byB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgIC8vIGFuZCBzZXQgaXRzIEFWU1RSRUFNX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRCBmbGFnLgorICAgICAgICBpZiAocGxzLT5jdHgtPmV2ZW50X2ZsYWdzICYgQVZGTVRfRVZFTlRfRkxBR19NRVRBREFUQV9VUERBVEVEKSB7CisgICAgICAgICAgICBpZiAocGxzLT5uX21haW5fc3RyZWFtcykgeworICAgICAgICAgICAgICAgIHN0ID0gcGxzLT5tYWluX3N0cmVhbXNbMF07CisgICAgICAgICAgICAgICAgYXZfZGljdF9jb3B5KCZzdC0+bWV0YWRhdGEsIHBscy0+Y3R4LT5tZXRhZGF0YSwgMCk7CisgICAgICAgICAgICAgICAgc3QtPmV2ZW50X2ZsYWdzIHw9IEFWU1RSRUFNX0VWRU5UX0ZMQUdfTUVUQURBVEFfVVBEQVRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBscy0+Y3R4LT5ldmVudF9mbGFncyAmPSB+QVZGTVRfRVZFTlRfRkxBR19NRVRBREFUQV9VUERBVEVEOworICAgICAgICB9CisKKyAgICAgICAgLyogY2hlY2sgaWYgbm9oZWFkZXIgZmxhZyBoYXMgYmVlbiBjbGVhcmVkIGJ5IHRoZSBzdWJkZW11eGVyICovCisgICAgICAgIGlmIChwbHMtPmhhc19ub2hlYWRlcl9mbGFnICYmICEocGxzLT5jdHgtPmN0eF9mbGFncyAmIEFWRk1UQ1RYX05PSEVBREVSKSkgeworICAgICAgICAgICAgcGxzLT5oYXNfbm9oZWFkZXJfZmxhZyA9IDA7CisgICAgICAgICAgICB1cGRhdGVfbm9oZWFkZXJfZmxhZyhzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwbHMtPnBrdC5zdHJlYW1faW5kZXggPj0gcGxzLT5uX21haW5fc3RyZWFtcykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInN0cmVhbSBpbmRleCBpbmNvbnNpc3RlbmN5OiBpbmRleCAlZCwgJWQgbWFpbiBzdHJlYW1zLCAlZCBzdWJkZW11eGVyIHN0cmVhbXNcbiIsCisgICAgICAgICAgICAgICAgICAgcGxzLT5wa3Quc3RyZWFtX2luZGV4LCBwbHMtPm5fbWFpbl9zdHJlYW1zLCBwbHMtPmN0eC0+bmJfc3RyZWFtcyk7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBscy0+cGt0KTsKKyAgICAgICAgICAgIHJlc2V0X3BhY2tldCgmcGxzLT5wa3QpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB9CisKKyAgICAgICAgaXN0ID0gcGxzLT5jdHgtPnN0cmVhbXNbcGxzLT5wa3Quc3RyZWFtX2luZGV4XTsKKyAgICAgICAgc3QgPSBwbHMtPm1haW5fc3RyZWFtc1twbHMtPnBrdC5zdHJlYW1faW5kZXhdOworCiAgICAgICAgICpwa3QgPSBwbHMtPnBrdDsKLSAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggKz0gcGxzLT5zdHJlYW1fb2Zmc2V0OworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKICAgICAgICAgcmVzZXRfcGFja2V0KCZjLT5wbGF5bGlzdHNbbWlucGxheWxpc3RdLT5wa3QpOwogCiAgICAgICAgIGlmIChwa3QtPmR0cyAhPSBBVl9OT1BUU19WQUxVRSkKICAgICAgICAgICAgIGMtPmN1cl90aW1lc3RhbXAgPSBhdl9yZXNjYWxlX3EocGt0LT5kdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBscy0+Y3R4LT5zdHJlYW1zW3Bscy0+cGt0LnN0cmVhbV9pbmRleF0tPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXN0LT50aW1lX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKTsKIAorICAgICAgICAvKiBUaGVyZSBtYXkgYmUgbW9yZSBzaXR1YXRpb25zIHdoZXJlIHRoaXMgd291bGQgYmUgdXNlZnVsLCBidXQgdGhpcyBhdCBsZWFzdAorICAgICAgICAgKiBoYW5kbGVzIG5ld2x5IHByb2JlZCBjb2RlY3MgcHJvcGVybHkgKGkuZS4gcmVxdWVzdF9wcm9iZSBieSBtcGVndHMpLiAqLworICAgICAgICBpZiAoaXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkgeworICAgICAgICAgICAgcmV0ID0gc2V0X3N0cmVhbV9pbmZvX2Zyb21faW5wdXRfc3RyZWFtKHN0LCBwbHMsIGlzdCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogfQogCi1zdGF0aWMgaW50IGhsc19jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgSExTQ29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKLQotICAgIGZyZWVfcGxheWxpc3RfbGlzdChjKTsKLSAgICBmcmVlX3ZhcmlhbnRfbGlzdChjKTsKLSAgICBmcmVlX3JlbmRpdGlvbl9saXN0KGMpOwotCi0gICAgYXZfZGljdF9mcmVlKCZjLT5hdmlvX29wdHMpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgaGxzX3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKIHsKICAgICBITFNDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwogICAgIHN0cnVjdCBwbGF5bGlzdCAqc2Vla19wbHMgPSBOVUxMOwogICAgIGludCBpLCBzZXFfbm87CisgICAgaW50IGo7CisgICAgaW50IHN0cmVhbV9zdWJkZW11eGVyX2luZGV4OwogICAgIGludDY0X3QgZmlyc3RfdGltZXN0YW1wLCBzZWVrX3RpbWVzdGFtcCwgZHVyYXRpb247CiAKLSAgICBpZiAoKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkgfHwKLSAgICAgICAgIShjLT52YXJpYW50c1swXS0+cGxheWxpc3RzWzBdLT5maW5pc2hlZCB8fCBjLT52YXJpYW50c1swXS0+cGxheWxpc3RzWzBdLT50eXBlID09IFBMU19UWVBFX0VWRU5UKSkKKyAgICBpZiAoKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkgfHwgKGMtPmN0eC0+Y3R4X2ZsYWdzICYgQVZGTVRDVFhfVU5TRUVLQUJMRSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAKICAgICBmaXJzdF90aW1lc3RhbXAgPSBjLT5maXJzdF90aW1lc3RhbXAgPT0gQVZfTk9QVFNfVkFMVUUgPwpAQCAtMTkzNSwxMCArMjI0NiwxMiBAQAogICAgIC8qIGZpbmQgdGhlIHBsYXlsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBzdHJlYW0gKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+bl9wbGF5bGlzdHM7IGkrKykgewogICAgICAgICBzdHJ1Y3QgcGxheWxpc3QgKnBscyA9IGMtPnBsYXlsaXN0c1tpXTsKLSAgICAgICAgaWYgKHN0cmVhbV9pbmRleCA+PSBwbHMtPnN0cmVhbV9vZmZzZXQgJiYKLSAgICAgICAgICAgIHN0cmVhbV9pbmRleCAtIHBscy0+c3RyZWFtX29mZnNldCA8IHBscy0+Y3R4LT5uYl9zdHJlYW1zKSB7Ci0gICAgICAgICAgICBzZWVrX3BscyA9IHBsczsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcGxzLT5uX21haW5fc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICBpZiAocGxzLT5tYWluX3N0cmVhbXNbal0gPT0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdKSB7CisgICAgICAgICAgICAgICAgc2Vla19wbHMgPSBwbHM7CisgICAgICAgICAgICAgICAgc3RyZWFtX3N1YmRlbXV4ZXJfaW5kZXggPSBqOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIC8qIGNoZWNrIGlmIHRoZSB0aW1lc3RhbXAgaXMgdmFsaWQgZm9yIHRoZSBwbGF5bGlzdCB3aXRoIHRoZQpAQCAtMTk0OCwxNSArMjI2MSwxNyBAQAogCiAgICAgLyogc2V0IHNlZ21lbnQgbm93IHNvIHdlIGRvIG5vdCBuZWVkIHRvIHNlYXJjaCBhZ2FpbiBiZWxvdyAqLwogICAgIHNlZWtfcGxzLT5jdXJfc2VxX25vID0gc2VxX25vOwotICAgIHNlZWtfcGxzLT5zZWVrX3N0cmVhbV9pbmRleCA9IHN0cmVhbV9pbmRleCAtIHNlZWtfcGxzLT5zdHJlYW1fb2Zmc2V0OworICAgIHNlZWtfcGxzLT5zZWVrX3N0cmVhbV9pbmRleCA9IHN0cmVhbV9zdWJkZW11eGVyX2luZGV4OwogCiAgICAgZm9yIChpID0gMDsgaSA8IGMtPm5fcGxheWxpc3RzOyBpKyspIHsKICAgICAgICAgLyogUmVzZXQgcmVhZGluZyAqLwogICAgICAgICBzdHJ1Y3QgcGxheWxpc3QgKnBscyA9IGMtPnBsYXlsaXN0c1tpXTsKLSAgICAgICAgaWYgKHBscy0+aW5wdXQpIHsKLSAgICAgICAgICAgIGZmdXJsX2Nsb3NlKHBscy0+aW5wdXQpOwotICAgICAgICAgICAgcGxzLT5pbnB1dCA9IE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKHBscy0+aW5wdXQpCisgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocGxzLT5wYXJlbnQsICZwbHMtPmlucHV0KTsKKyAgICAgICAgcGxzLT5pbnB1dF9yZWFkX2RvbmUgPSAwOworICAgICAgICBpZiAocGxzLT5pbnB1dF9uZXh0KQorICAgICAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHBscy0+cGFyZW50LCAmcGxzLT5pbnB1dF9uZXh0KTsKKyAgICAgICAgcGxzLT5pbnB1dF9uZXh0X3JlcXVlc3RlZCA9IDA7CiAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGxzLT5wa3QpOwogICAgICAgICByZXNldF9wYWNrZXQoJnBscy0+cGt0KTsKICAgICAgICAgcGxzLT5wYi5lb2ZfcmVhY2hlZCA9IDA7CkBAIC0yMDA1LDYgKzIzMjAsMTYgQEAKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBobHNfb3B0aW9uc1tdID0gewogICAgIHsibGl2ZV9zdGFydF9pbmRleCIsICJzZWdtZW50IGluZGV4IHRvIHN0YXJ0IGxpdmUgc3RyZWFtcyBhdCAobmVnYXRpdmUgdmFsdWVzIGFyZSBmcm9tIHRoZSBlbmQpIiwKICAgICAgICAgT0ZGU0VUKGxpdmVfc3RhcnRfaW5kZXgpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTN9LCBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHU30sCisgICAgeyJhbGxvd2VkX2V4dGVuc2lvbnMiLCAiTGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgdGhhdCBobHMgaXMgYWxsb3dlZCB0byBhY2Nlc3MiLAorICAgICAgICBPRkZTRVQoYWxsb3dlZF9leHRlbnNpb25zKSwgQVZfT1BUX1RZUEVfU1RSSU5HLAorICAgICAgICB7LnN0ciA9ICIzZ3AsYWFjLGF2aSxmbGFjLG1rdixtM3U4LG00YSxtNHMsbTR2LG1wZyxtb3YsbXAyLG1wMyxtcDQsbXBlZyxtcGVndHMsb2dnLG9ndixvZ2EsdHMsdm9iLHdhdiJ9LAorICAgICAgICBJTlRfTUlOLCBJTlRfTUFYLCBGTEFHU30sCisgICAgeyJtYXhfcmVsb2FkIiwgIk1heGltdW0gbnVtYmVyIG9mIHRpbWVzIGEgaW5zdWZmaWNpZW50IGxpc3QgaXMgYXR0ZW1wdGVkIHRvIGJlIHJlbG9hZGVkIiwKKyAgICAgICAgT0ZGU0VUKG1heF9yZWxvYWQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMTAwMH0sIDAsIElOVF9NQVgsIEZMQUdTfSwKKyAgICB7Imh0dHBfcGVyc2lzdGVudCIsICJVc2UgcGVyc2lzdGVudCBIVFRQIGNvbm5lY3Rpb25zIiwKKyAgICAgICAgT0ZGU0VUKGh0dHBfcGVyc2lzdGVudCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMX0sIDAsIDEsIEZMQUdTIH0sCisgICAgeyJodHRwX211bHRpcGxlIiwgIlVzZSBtdWx0aXBsZSBIVFRQIGNvbm5lY3Rpb25zIGZvciBmZXRjaGluZyBzZWdtZW50cyIsCisgICAgICAgIE9GRlNFVChodHRwX211bHRpcGxlKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAtMX0sIC0xLCAxLCBGTEFHU30sCiAgICAge05VTEx9CiB9OwogCkBAIC0yMDIwLDYgKzIzNDUsNyBAQAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJBcHBsZSBIVFRQIExpdmUgU3RyZWFtaW5nIiksCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmhsc19jbGFzcywKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoSExTQ29udGV4dCksCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9HRU5TRUFSQ0gsCiAgICAgLnJlYWRfcHJvYmUgICAgID0gaGxzX3Byb2JlLAogICAgIC5yZWFkX2hlYWRlciAgICA9IGhsc19yZWFkX2hlYWRlciwKICAgICAucmVhZF9wYWNrZXQgICAgPSBobHNfcmVhZF9wYWNrZXQsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9obHNlbmMuYyBiL2xpYmF2Zm9ybWF0L2hsc2VuYy5jCmluZGV4IDdhYjdjYmIuLmMyN2E2NmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2hsc2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2hsc2VuYy5jCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIEFwcGxlIEhUVFAgTGl2ZSBTdHJlYW1pbmcgc2VnbWVudGVyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEx1Y2EgQmFyYmF0bworICogQ29weXJpZ2h0IChjKSAyMDE3IEFrYW1haSBUZWNobm9sb2dpZXMsIEluYy4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMjYsMjggKzI3LDU1IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKIAorI2lmIENPTkZJR19HQ1JZUFQKKyNpbmNsdWRlIDxnY3J5cHQuaD4KKyNlbGlmIENPTkZJR19PUEVOU1NMCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CisjZW5kaWYKKwogI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVfaW50ZXJuYWwuaCIKIAogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2lmIENPTkZJR19IVFRQX1BST1RPQ09MCisjaW5jbHVkZSAiaHR0cC5oIgorI2VuZGlmCisjaW5jbHVkZSAiaGxzcGxheWxpc3QuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKIAordHlwZWRlZiBlbnVtIHsKKyAgSExTX1NUQVJUX1NFUVVFTkNFX0FTX1NUQVJUX05VTUJFUiA9IDAsCisgIEhMU19TVEFSVF9TRVFVRU5DRV9BU19TRUNPTkRTX1NJTkNFX0VQT0NIID0gMSwKKyAgSExTX1NUQVJUX1NFUVVFTkNFX0FTX0ZPUk1BVFRFRF9EQVRFVElNRSA9IDIsICAvLyBZWVlZTU1ERGhobW1zcworfSBTdGFydFNlcXVlbmNlU291cmNlVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBDT0RFQ19BVFRSSUJVVEVfV1JJVFRFTiA9IDAsCisgICAgQ09ERUNfQVRUUklCVVRFX1dJTExfTk9UX0JFX1dSSVRURU4sCit9IENvZGVjQXR0cmlidXRlU3RhdHVzOworCiAjZGVmaW5lIEtFWVNJWkUgMTYKICNkZWZpbmUgTElORV9CVUZGRVJfU0laRSAxMDI0CisjZGVmaW5lIEhMU19NSUNST1NFQ09ORF9VTklUICAgMTAwMDAwMAorI2RlZmluZSBQT1NURklYX1BBVFRFUk4gIl8lZCIKIAogdHlwZWRlZiBzdHJ1Y3QgSExTU2VnbWVudCB7CiAgICAgY2hhciBmaWxlbmFtZVsxMDI0XTsKICAgICBjaGFyIHN1Yl9maWxlbmFtZVsxMDI0XTsKICAgICBkb3VibGUgZHVyYXRpb247IC8qIGluIHNlY29uZHMgKi8KKyAgICBpbnQgZGlzY29udDsKICAgICBpbnQ2NF90IHBvczsKICAgICBpbnQ2NF90IHNpemU7CisgICAgdW5zaWduZWQgdmFyX3N0cmVhbV9pZHg7CiAKICAgICBjaGFyIGtleV91cmlbTElORV9CVUZGRVJfU0laRSArIDFdOwogICAgIGNoYXIgaXZfc3RyaW5nW0tFWVNJWkUqMiArIDFdOwpAQCAtNjIsMzAgKzkwLDM5IEBACiAgICAgSExTX1JPVU5EX0RVUkFUSU9OUyA9ICgxIDw8IDIpLAogICAgIEhMU19ESVNDT05UX1NUQVJUID0gKDEgPDwgMyksCiAgICAgSExTX09NSVRfRU5ETElTVCA9ICgxIDw8IDQpLAorICAgIEhMU19TUExJVF9CWV9USU1FID0gKDEgPDwgNSksCisgICAgSExTX0FQUEVORF9MSVNUID0gKDEgPDwgNiksCisgICAgSExTX1BST0dSQU1fREFURV9USU1FID0gKDEgPDwgNyksCisgICAgSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX0lOREVYID0gKDEgPDwgOCksIC8vIGluY2x1ZGUgc2VnbWVudCBpbmRleCBpbiBzZWdtZW50IGZpbGVuYW1lcyB3aGVuIHVzZV9sb2NhbHRpbWUgIGUuZy46ICUlMDNkCisgICAgSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX0RVUkFUSU9OID0gKDEgPDwgOSksIC8vIGluY2x1ZGUgc2VnbWVudCBkdXJhdGlvbiAobWljcm9zZWMpIGluIHNlZ21lbnQgZmlsZW5hbWVzIHdoZW4gdXNlX2xvY2FsdGltZSAgZS5nLjogJSUwOXQKKyAgICBITFNfU0VDT05EX0xFVkVMX1NFR01FTlRfU0laRSA9ICgxIDw8IDEwKSwgLy8gaW5jbHVkZSBzZWdtZW50IHNpemUgKGJ5dGVzKSBpbiBzZWdtZW50IGZpbGVuYW1lcyB3aGVuIHVzZV9sb2NhbHRpbWUgIGUuZy46ICUlMDE0cworICAgIEhMU19URU1QX0ZJTEUgPSAoMSA8PCAxMSksCisgICAgSExTX1BFUklPRElDX1JFS0VZID0gKDEgPDwgMTIpLAorICAgIEhMU19JTkRFUEVOREVOVF9TRUdNRU5UUyA9ICgxIDw8IDEzKSwKIH0gSExTRmxhZ3M7CiAKLXR5cGVkZWYgc3RydWN0IEhMU0NvbnRleHQgewotICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOyAgLy8gQ2xhc3MgZm9yIHByaXZhdGUgb3B0aW9ucy4KK3R5cGVkZWYgZW51bSB7CisgICAgU0VHTUVOVF9UWVBFX01QRUdUUywKKyAgICBTRUdNRU5UX1RZUEVfRk1QNCwKK30gU2VnbWVudFR5cGU7CisKK3R5cGVkZWYgc3RydWN0IFZhcmlhbnRTdHJlYW0geworICAgIHVuc2lnbmVkIHZhcl9zdHJlYW1faWR4OwogICAgIHVuc2lnbmVkIG51bWJlcjsKICAgICBpbnQ2NF90IHNlcXVlbmNlOwotICAgIGludDY0X3Qgc3RhcnRfc2VxdWVuY2U7CiAgICAgQVZPdXRwdXRGb3JtYXQgKm9mb3JtYXQ7CiAgICAgQVZPdXRwdXRGb3JtYXQgKnZ0dF9vZm9ybWF0OworICAgIEFWSU9Db250ZXh0ICpvdXQ7CisgICAgaW50IHBhY2tldHNfd3JpdHRlbjsKKyAgICBpbnQgaW5pdF9yYW5nZV9sZW5ndGg7CiAKICAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjsKICAgICBBVkZvcm1hdENvbnRleHQgKnZ0dF9hdmY7CiAKLSAgICBmbG9hdCB0aW1lOyAgICAgICAgICAgIC8vIFNldCBieSBhIHByaXZhdGUgb3B0aW9uLgotICAgIGludCBtYXhfbmJfc2VnbWVudHM7ICAgLy8gU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uCi0gICAgaW50ICB3cmFwOyAgICAgICAgICAgICAvLyBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4KLSAgICB1aW50MzJfdCBmbGFnczsgICAgICAgIC8vIGVudW0gSExTRmxhZ3MKLSAgICBjaGFyICpzZWdtZW50X2ZpbGVuYW1lOwotCi0gICAgaW50IHVzZV9sb2NhbHRpbWU7ICAgICAgLy8vPCBmbGFnIHRvIGV4cGFuZCBmaWxlbmFtZSB3aXRoIGxvY2FsdGltZQotICAgIGludCBhbGxvd2NhY2hlOwotICAgIGludDY0X3QgcmVjb3JkaW5nX3RpbWU7CiAgICAgaW50IGhhc192aWRlbzsKICAgICBpbnQgaGFzX3N1YnRpdGxlOworICAgIGludCBuZXdfc3RhcnQ7CisgICAgZG91YmxlIGRwcDsgICAgICAgICAgIC8vIGR1cmF0aW9uIHBlciBwYWNrZXQKICAgICBpbnQ2NF90IHN0YXJ0X3B0czsKICAgICBpbnQ2NF90IGVuZF9wdHM7CiAgICAgZG91YmxlIGR1cmF0aW9uOyAgICAgIC8vIGxhc3Qgc2VnbWVudCBkdXJhdGlvbiBjb21wdXRlZCBzbyBmYXIsIGluIHNlY29uZHMKQEAgLTkzLDYgKzEzMCw4IEBACiAgICAgaW50NjRfdCBzaXplOyAgICAgICAgIC8vIGxhc3Qgc2VnbWVudCBzaXplCiAgICAgaW50IG5iX2VudHJpZXM7CiAgICAgaW50IGRpc2NvbnRpbnVpdHlfc2V0OworICAgIGludCBkaXNjb250aW51aXR5OworICAgIGludCByZWZlcmVuY2Vfc3RyZWFtX2luZGV4OwogCiAgICAgSExTU2VnbWVudCAqc2VnbWVudHM7CiAgICAgSExTU2VnbWVudCAqbGFzdF9zZWdtZW50OwpAQCAtMTAxLDEyICsxNDAsNjggQEAKICAgICBjaGFyICpiYXNlbmFtZTsKICAgICBjaGFyICp2dHRfYmFzZW5hbWU7CiAgICAgY2hhciAqdnR0X20zdThfbmFtZTsKKyAgICBjaGFyICptM3U4X25hbWU7CisKKyAgICBkb3VibGUgaW5pdGlhbF9wcm9nX2RhdGVfdGltZTsKKyAgICBjaGFyIGN1cnJlbnRfc2VnbWVudF9maW5hbF9maWxlbmFtZV9mbXRbMTAyNF07IC8vIHdoZW4gcmVuYW1pbmcgc2VnbWVudHMKKworICAgIGNoYXIgKmZtcDRfaW5pdF9maWxlbmFtZTsKKyAgICBjaGFyICpiYXNlX291dHB1dF9kaXJuYW1lOworICAgIGludCBmbXA0X2luaXRfbW9kZTsKKworICAgIEFWU3RyZWFtICoqc3RyZWFtczsKKyAgICBjaGFyIGNvZGVjX2F0dHJbMTI4XTsKKyAgICBDb2RlY0F0dHJpYnV0ZVN0YXR1cyBhdHRyX3N0YXR1czsKKyAgICB1bnNpZ25lZCBpbnQgbmJfc3RyZWFtczsKKyAgICBpbnQgbTN1OF9jcmVhdGVkOyAvKiBzdGF0dXMgb2YgbWVkaWEgcGxheS1saXN0IGNyZWF0aW9uICovCisgICAgY2hhciAqYWdyb3VwOyAvKiBhdWRpbyBncm91cCBuYW1lICovCisgICAgY2hhciAqY2Nncm91cDsgLyogY2xvc2VkIGNhcHRpb24gZ3JvdXAgbmFtZSAqLworICAgIGNoYXIgKmJhc2V1cmw7Cit9IFZhcmlhbnRTdHJlYW07CisKK3R5cGVkZWYgc3RydWN0IENsb3NlZENhcHRpb25zU3RyZWFtIHsKKyAgICBjaGFyICpjY2dyb3VwOyAvKiBjbG9zZWQgY2FwdGlvbiBncm91cCBuYW1lICovCisgICAgY2hhciAqaW5zdHJlYW1pZDsgLyogY2xvc2VkIGNhcHRpb25zIElOU1RSRUFNLUlEICovCisgICAgY2hhciAqbGFuZ3VhZ2U7IC8qIGNsb3NlZCBjYXB0aW9ucyBsYW5nYXVnZSAqLworfSBDbG9zZWRDYXB0aW9uc1N0cmVhbTsKKwordHlwZWRlZiBzdHJ1Y3QgSExTQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7ICAvLyBDbGFzcyBmb3IgcHJpdmF0ZSBvcHRpb25zLgorICAgIGludDY0X3Qgc3RhcnRfc2VxdWVuY2U7CisgICAgdWludDMyX3Qgc3RhcnRfc2VxdWVuY2Vfc291cmNlX3R5cGU7ICAvLyBlbnVtIFN0YXJ0U2VxdWVuY2VTb3VyY2VUeXBlCisKKyAgICBmbG9hdCB0aW1lOyAgICAgICAgICAgIC8vIFNldCBieSBhIHByaXZhdGUgb3B0aW9uLgorICAgIGZsb2F0IGluaXRfdGltZTsgICAgICAgLy8gU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uCisgICAgaW50IG1heF9uYl9zZWdtZW50czsgICAvLyBTZXQgYnkgYSBwcml2YXRlIG9wdGlvbi4KKyAgICBpbnQgaGxzX2RlbGV0ZV90aHJlc2hvbGQ7IC8vIFNldCBieSBhIHByaXZhdGUgb3B0aW9uLgorI2lmIEZGX0FQSV9ITFNfV1JBUAorICAgIGludCAgd3JhcDsgICAgICAgICAgICAgLy8gU2V0IGJ5IGEgcHJpdmF0ZSBvcHRpb24uCisjZW5kaWYKKyAgICB1aW50MzJfdCBmbGFnczsgICAgICAgIC8vIGVudW0gSExTRmxhZ3MKKyAgICB1aW50MzJfdCBwbF90eXBlOyAgICAgIC8vIGVudW0gUGxheWxpc3RUeXBlCisgICAgY2hhciAqc2VnbWVudF9maWxlbmFtZTsKKyAgICBjaGFyICpmbXA0X2luaXRfZmlsZW5hbWU7CisgICAgaW50IHNlZ21lbnRfdHlwZTsKKworICAgIGludCB1c2VfbG9jYWx0aW1lOyAgICAgIC8vLzwgZmxhZyB0byBleHBhbmQgZmlsZW5hbWUgd2l0aCBsb2NhbHRpbWUKKyAgICBpbnQgdXNlX2xvY2FsdGltZV9ta2RpcjsvLy88IGZsYWcgdG8gbWtkaXIgZGlybmFtZSBpbiB0aW1lYmFzZWQgZmlsZW5hbWUKKyAgICBpbnQgYWxsb3djYWNoZTsKKyAgICBpbnQ2NF90IHJlY29yZGluZ190aW1lOworICAgIGludDY0X3QgbWF4X3NlZ19zaXplOyAvLyBldmVyeSBzZWdtZW50IGZpbGUgbWF4IHNpemUKKwogICAgIGNoYXIgKmJhc2V1cmw7CiAgICAgY2hhciAqZm9ybWF0X29wdGlvbnNfc3RyOwogICAgIGNoYXIgKnZ0dF9mb3JtYXRfb3B0aW9uc19zdHI7CiAgICAgY2hhciAqc3VidGl0bGVfZmlsZW5hbWU7CiAgICAgQVZEaWN0aW9uYXJ5ICpmb3JtYXRfb3B0aW9uczsKIAorICAgIGludCBlbmNyeXB0OworICAgIGNoYXIgKmtleTsKKyAgICBjaGFyICprZXlfdXJsOworICAgIGNoYXIgKml2OworICAgIGNoYXIgKmtleV9iYXNlbmFtZTsKKyAgICBpbnQgZW5jcnlwdF9zdGFydGVkOworCiAgICAgY2hhciAqa2V5X2luZm9fZmlsZTsKICAgICBjaGFyIGtleV9maWxlW0xJTkVfQlVGRkVSX1NJWkUgKyAxXTsKICAgICBjaGFyIGtleV91cmlbTElORV9CVUZGRVJfU0laRSArIDFdOwpAQCAtMTE1LDM5ICsyMTAsMjc3IEBACiAgICAgQVZEaWN0aW9uYXJ5ICp2dHRfZm9ybWF0X29wdGlvbnM7CiAKICAgICBjaGFyICptZXRob2Q7CisgICAgY2hhciAqdXNlcl9hZ2VudDsKIAorICAgIFZhcmlhbnRTdHJlYW0gKnZhcl9zdHJlYW1zOworICAgIHVuc2lnbmVkIGludCBuYl92YXJzdHJlYW1zOworICAgIENsb3NlZENhcHRpb25zU3RyZWFtICpjY19zdHJlYW1zOworICAgIHVuc2lnbmVkIGludCBuYl9jY3N0cmVhbXM7CisKKyAgICBpbnQgbWFzdGVyX20zdThfY3JlYXRlZDsgLyogc3RhdHVzIG9mIG1hc3RlciBwbGF5LWxpc3QgY3JlYXRpb24gKi8KKyAgICBjaGFyICptYXN0ZXJfbTN1OF91cmw7IC8qIFVSTCBvZiB0aGUgbWFzdGVyIG0zdTggZmlsZSAqLworICAgIGludCB2ZXJzaW9uOyAvKiBITFMgdmVyc2lvbiAqLworICAgIGNoYXIgKnZhcl9zdHJlYW1fbWFwOyAvKiB1c2VyIHNwZWNpZmllZCB2YXJpYW50IHN0cmVhbSBtYXAgc3RyaW5nICovCisgICAgY2hhciAqY2Nfc3RyZWFtX21hcDsgLyogdXNlciBzcGVjaWZpZWQgY2xvc2VkIGNhcHRpb24gc3RyZWFtcyBtYXAgc3RyaW5nICovCisgICAgY2hhciAqbWFzdGVyX3BsX25hbWU7CisgICAgdW5zaWduZWQgaW50IG1hc3Rlcl9wdWJsaXNoX3JhdGU7CisgICAgaW50IGh0dHBfcGVyc2lzdGVudDsKKyAgICBBVklPQ29udGV4dCAqbTN1OF9vdXQ7CisgICAgQVZJT0NvbnRleHQgKnN1Yl9tM3U4X291dDsKKyAgICBpbnQ2NF90IHRpbWVvdXQ7CiB9IEhMU0NvbnRleHQ7CiAKLXN0YXRpYyBpbnQgaGxzX2RlbGV0ZV9vbGRfc2VnbWVudHMoSExTQ29udGV4dCAqaGxzKSB7CitzdGF0aWMgaW50IG1rZGlyX3AoY29uc3QgY2hhciAqcGF0aCkgeworICAgIGludCByZXQgPSAwOworICAgIGNoYXIgKnRlbXAgPSBhdl9zdHJkdXAocGF0aCk7CisgICAgY2hhciAqcG9zID0gdGVtcDsKKyAgICBjaGFyIHRtcF9jaCA9ICdcMCc7CisKKyAgICBpZiAoIXBhdGggfHwgIXRlbXApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICghc3RybmNtcCh0ZW1wLCAiLyIsIDEpIHx8ICFzdHJuY21wKHRlbXAsICJcXCIsIDEpKSB7CisgICAgICAgIHBvcysrOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAodGVtcCwgIi4vIiwgMikgfHwgIXN0cm5jbXAodGVtcCwgIi5cXCIsIDIpKSB7CisgICAgICAgIHBvcyArPSAyOworICAgIH0KKworICAgIGZvciAoIDsgKnBvcyAhPSAnXDAnOyArK3BvcykgeworICAgICAgICBpZiAoKnBvcyA9PSAnLycgfHwgKnBvcyA9PSAnXFwnKSB7CisgICAgICAgICAgICB0bXBfY2ggPSAqcG9zOworICAgICAgICAgICAgKnBvcyA9ICdcMCc7CisgICAgICAgICAgICByZXQgPSBta2Rpcih0ZW1wLCAwNzU1KTsKKyAgICAgICAgICAgICpwb3MgPSB0bXBfY2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKCoocG9zIC0gMSkgIT0gJy8nKSB8fCAoKihwb3MgLSAxKSAhPSAnXFwnKSkgeworICAgICAgICByZXQgPSBta2Rpcih0ZW1wLCAwNzU1KTsKKyAgICB9CisKKyAgICBhdl9mcmVlKHRlbXApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaGxzZW5jX2lvX29wZW4oQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqKnBiLCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykgeworICAgIEhMU0NvbnRleHQgKmhscyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaHR0cF9iYXNlX3Byb3RvID0gZmlsZW5hbWUgPyBmZl9pc19odHRwX3Byb3RvKGZpbGVuYW1lKSA6IDA7CisgICAgaW50IGVyciA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOworICAgIGlmICghKnBiIHx8ICFodHRwX2Jhc2VfcHJvdG8gfHwgIWhscy0+aHR0cF9wZXJzaXN0ZW50KSB7CisgICAgICAgIGVyciA9IHMtPmlvX29wZW4ocywgcGIsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsIG9wdGlvbnMpOworI2lmIENPTkZJR19IVFRQX1BST1RPQ09MCisgICAgfSBlbHNlIHsKKyAgICAgICAgVVJMQ29udGV4dCAqaHR0cF91cmxfY29udGV4dCA9IGZmaW9fZ2V0dXJsY29udGV4dCgqcGIpOworICAgICAgICBhdl9hc3NlcnQwKGh0dHBfdXJsX2NvbnRleHQpOworICAgICAgICBlcnIgPSBmZl9odHRwX2RvX25ld19yZXF1ZXN0KGh0dHBfdXJsX2NvbnRleHQsIGZpbGVuYW1lKTsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBobHNlbmNfaW9fY2xvc2UoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqKnBiLCBjaGFyICpmaWxlbmFtZSkgeworICAgIEhMU0NvbnRleHQgKmhscyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgaHR0cF9iYXNlX3Byb3RvID0gZmlsZW5hbWUgPyBmZl9pc19odHRwX3Byb3RvKGZpbGVuYW1lKSA6IDA7CisgICAgaWYgKCFodHRwX2Jhc2VfcHJvdG8gfHwgIWhscy0+aHR0cF9wZXJzaXN0ZW50IHx8IGhscy0+a2V5X2luZm9fZmlsZSB8fCBobHMtPmVuY3J5cHQpIHsKKyAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsIHBiKTsKKyNpZiBDT05GSUdfSFRUUF9QUk9UT0NPTAorICAgIH0gZWxzZSB7CisgICAgICAgIFVSTENvbnRleHQgKmh0dHBfdXJsX2NvbnRleHQgPSBmZmlvX2dldHVybGNvbnRleHQoKnBiKTsKKyAgICAgICAgYXZfYXNzZXJ0MChodHRwX3VybF9jb250ZXh0KTsKKyAgICAgICAgYXZpb19mbHVzaCgqcGIpOworICAgICAgICBmZnVybF9zaHV0ZG93bihodHRwX3VybF9jb250ZXh0LCBBVklPX0ZMQUdfV1JJVEUpOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgdm9pZCBzZXRfaHR0cF9vcHRpb25zKEFWRm9ybWF0Q29udGV4dCAqcywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywgSExTQ29udGV4dCAqYykKK3sKKyAgICBpbnQgaHR0cF9iYXNlX3Byb3RvID0gZmZfaXNfaHR0cF9wcm90byhzLT51cmwpOworCisgICAgaWYgKGMtPm1ldGhvZCkgeworICAgICAgICBhdl9kaWN0X3NldChvcHRpb25zLCAibWV0aG9kIiwgYy0+bWV0aG9kLCAwKTsKKyAgICB9IGVsc2UgaWYgKGh0dHBfYmFzZV9wcm90bykgeworICAgICAgICBhdl9sb2coYywgQVZfTE9HX1dBUk5JTkcsICJObyBIVFRQIG1ldGhvZCBzZXQsIGhscyBtdXhlciBkZWZhdWx0aW5nIHRvIG1ldGhvZCBQVVQuXG4iKTsKKyAgICAgICAgYXZfZGljdF9zZXQob3B0aW9ucywgIm1ldGhvZCIsICJQVVQiLCAwKTsKKyAgICB9CisgICAgaWYgKGMtPnVzZXJfYWdlbnQpCisgICAgICAgIGF2X2RpY3Rfc2V0KG9wdGlvbnMsICJ1c2VyX2FnZW50IiwgYy0+dXNlcl9hZ2VudCwgMCk7CisgICAgaWYgKGMtPmh0dHBfcGVyc2lzdGVudCkKKyAgICAgICAgYXZfZGljdF9zZXRfaW50KG9wdGlvbnMsICJtdWx0aXBsZV9yZXF1ZXN0cyIsIDEsIDApOworICAgIGlmIChjLT50aW1lb3V0ID49IDApCisgICAgICAgIGF2X2RpY3Rfc2V0X2ludChvcHRpb25zLCAidGltZW91dCIsIGMtPnRpbWVvdXQsIDApOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9jb2RlY19hdHRyKEFWU3RyZWFtICpzdCwgVmFyaWFudFN0cmVhbSAqdnMpIHsKKyAgICBpbnQgY29kZWNfc3RybGVuID0gc3RybGVuKHZzLT5jb2RlY19hdHRyKTsKKyAgICBjaGFyIGF0dHJbMzJdOworCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAodnMtPmF0dHJfc3RhdHVzID09IENPREVDX0FUVFJJQlVURV9XSUxMX05PVF9CRV9XUklUVEVOKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YTsKKyAgICAgICAgaWYgKGRhdGEgJiYgKGRhdGFbMF0gfCBkYXRhWzFdIHwgZGF0YVsyXSkgPT0gMCAmJiBkYXRhWzNdID09IDEgJiYgKGRhdGFbNF0gJiAweDFGKSA9PSA3KSB7CisgICAgICAgICAgICBzbnByaW50ZihhdHRyLCBzaXplb2YoYXR0ciksCisgICAgICAgICAgICAgICAgICAgICAiYXZjMS4lMDJ4JTAyeCUwMngiLCBkYXRhWzVdLCBkYXRhWzZdLCBkYXRhWzddKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIpIHsKKyAgICAgICAgc25wcmludGYoYXR0ciwgc2l6ZW9mKGF0dHIpLCAibXA0YS40MC4zMyIpOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpIHsKKyAgICAgICAgc25wcmludGYoYXR0ciwgc2l6ZW9mKGF0dHIpLCAibXA0YS40MC4zNCIpOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgLyogVE9ETyA6IEZvciBIRS1BQUMsIEhFLUFBQ3YyLCB0aGUgbGFzdCBkaWdpdCBuZWVkcyB0byBiZSBzZXQgdG8gNSBhbmQgMjkgcmVzcGVjdGl2ZWx5ICovCisgICAgICAgIHNucHJpbnRmKGF0dHIsIHNpemVvZihhdHRyKSwgIm1wNGEuNDAuMiIpOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKKyAgICAgICAgc25wcmludGYoYXR0ciwgc2l6ZW9mKGF0dHIpLCAiYWMtMyIpOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzKSB7CisgICAgICAgIHNucHJpbnRmKGF0dHIsIHNpemVvZihhdHRyKSwgImVjLTMiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIC8vIERvbid0IHdyaXRlIHRoZSBzYW1lIGF0dHJpYnV0ZSBtdWx0aXBsZSB0aW1lcworICAgIGlmICghYXZfc3RyaXN0cih2cy0+Y29kZWNfYXR0ciwgYXR0cikpIHsKKyAgICAgICAgc25wcmludGYodnMtPmNvZGVjX2F0dHIgKyBjb2RlY19zdHJsZW4sCisgICAgICAgICAgICAgICAgIHNpemVvZih2cy0+Y29kZWNfYXR0cikgLSBjb2RlY19zdHJsZW4sCisgICAgICAgICAgICAgICAgICIlcyVzIiwgY29kZWNfc3RybGVuID8gIiwiIDogIiIsIGF0dHIpOworICAgIH0KKyAgICByZXR1cm47CisKK2ZhaWw6CisgICAgdnMtPmNvZGVjX2F0dHJbMF0gPSAnXDAnOworICAgIHZzLT5hdHRyX3N0YXR1cyA9IENPREVDX0FUVFJJQlVURV9XSUxMX05PVF9CRV9XUklUVEVOOworICAgIHJldHVybjsKK30KKworc3RhdGljIGludCByZXBsYWNlX2ludF9kYXRhX2luX2ZpbGVuYW1lKGNoYXIgKipzLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciBwbGFjZWhvbGRlciwgaW50NjRfdCBudW1iZXIpCit7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyICpuZXdfZmlsZW5hbWU7CisgICAgY2hhciBjOworICAgIGludCBuZCwgYWRkY2hhcl9jb3VudDsKKyAgICBpbnQgZm91bmRfY291bnQgPSAwOworICAgIEFWQlByaW50IGJ1ZjsKKworICAgIGF2X2JwcmludF9pbml0KCZidWYsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CisKKyAgICBwID0gZmlsZW5hbWU7CisgICAgZm9yICg7OykgeworICAgICAgICBjID0gKnA7CisgICAgICAgIGlmIChjID09ICdcMCcpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGMgPT0gJyUnICYmICoocCsxKSA9PSAnJScpICAvLyAlJQorICAgICAgICAgICAgYWRkY2hhcl9jb3VudCA9IDI7CisgICAgICAgIGVsc2UgaWYgKGMgPT0gJyUnICYmIChhdl9pc2RpZ2l0KCoocCsxKSkgfHwgKihwKzEpID09IHBsYWNlaG9sZGVyKSkgeworICAgICAgICAgICAgbmQgPSAwOworICAgICAgICAgICAgYWRkY2hhcl9jb3VudCA9IDE7CisgICAgICAgICAgICB3aGlsZSAoYXZfaXNkaWdpdCgqKHAgKyBhZGRjaGFyX2NvdW50KSkpIHsKKyAgICAgICAgICAgICAgICBuZCA9IG5kICogMTAgKyAqKHAgKyBhZGRjaGFyX2NvdW50KSAtICcwJzsKKyAgICAgICAgICAgICAgICBhZGRjaGFyX2NvdW50Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqKHAgKyBhZGRjaGFyX2NvdW50KSA9PSBwbGFjZWhvbGRlcikgeworICAgICAgICAgICAgICAgIGF2X2JwcmludGYoJmJ1ZiwgIiUwKiJQUklkNjQsIChudW1iZXIgPCAwKSA/IG5kIDogbmQrKywgbnVtYmVyKTsKKyAgICAgICAgICAgICAgICBwICs9IChhZGRjaGFyX2NvdW50ICsgMSk7CisgICAgICAgICAgICAgICAgYWRkY2hhcl9jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgZm91bmRfY291bnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGFkZGNoYXJfY291bnQgPSAxOworCisgICAgICAgIGF2X2JwcmludF9hcHBlbmRfZGF0YSgmYnVmLCBwLCBhZGRjaGFyX2NvdW50KTsKKyAgICAgICAgcCArPSBhZGRjaGFyX2NvdW50OworICAgIH0KKyAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZSgmYnVmKSkgeworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJmJ1ZiwgTlVMTCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGF2X2JwcmludF9maW5hbGl6ZSgmYnVmLCAmbmV3X2ZpbGVuYW1lKSA8IDAgfHwgIW5ld19maWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICpzID0gbmV3X2ZpbGVuYW1lOworICAgIHJldHVybiBmb3VuZF9jb3VudDsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfc3R5cChBVklPQ29udGV4dCAqcGIpCit7CisgICAgYXZpb193YjMyKHBiLCAyNCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAic3R5cCIpOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1zZGgiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBtaW5vciAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1zZGgiKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJtc2l4Iik7Cit9CisKK3N0YXRpYyBpbnQgZmx1c2hfZHluYnVmKFZhcmlhbnRTdHJlYW0gKnZzLCBpbnQgKnJhbmdlX2xlbmd0aCkKK3sKKyAgICBBVkZvcm1hdENvbnRleHQgKmN0eCA9IHZzLT5hdmY7CisgICAgdWludDhfdCAqYnVmZmVyOworCisgICAgaWYgKCFjdHgtPnBiKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8gZmx1c2gKKyAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOworICAgIGF2aW9fZmx1c2goY3R4LT5wYik7CisKKyAgICAvLyB3cml0ZSBvdXQgdG8gZmlsZQorICAgICpyYW5nZV9sZW5ndGggPSBhdmlvX2Nsb3NlX2R5bl9idWYoY3R4LT5wYiwgJmJ1ZmZlcik7CisgICAgY3R4LT5wYiA9IE5VTEw7CisgICAgYXZpb193cml0ZSh2cy0+b3V0LCBidWZmZXIsICpyYW5nZV9sZW5ndGgpOworICAgIGF2X2ZyZWUoYnVmZmVyKTsKKworICAgIC8vIHJlLW9wZW4gYnVmZmVyCisgICAgcmV0dXJuIGF2aW9fb3Blbl9keW5fYnVmKCZjdHgtPnBiKTsKK30KKworc3RhdGljIGludCBobHNfZGVsZXRlX29sZF9zZWdtZW50cyhBVkZvcm1hdENvbnRleHQgKnMsIEhMU0NvbnRleHQgKmhscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFudFN0cmVhbSAqdnMpIHsKIAogICAgIEhMU1NlZ21lbnQgKnNlZ21lbnQsICpwcmV2aW91c19zZWdtZW50ID0gTlVMTDsKICAgICBmbG9hdCBwbGF5bGlzdF9kdXJhdGlvbiA9IDAuMGY7CiAgICAgaW50IHJldCA9IDAsIHBhdGhfc2l6ZSwgc3ViX3BhdGhfc2l6ZTsKKyAgICBpbnQgc2VnbWVudF9jbnQgPSAwOwogICAgIGNoYXIgKmRpcm5hbWUgPSBOVUxMLCAqcCwgKnN1Yl9wYXRoOwogICAgIGNoYXIgKnBhdGggPSBOVUxMOworICAgIEFWRGljdGlvbmFyeSAqb3B0aW9ucyA9IE5VTEw7CisgICAgQVZJT0NvbnRleHQgKm91dCA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqcHJvdG8gPSBOVUxMOwogCi0gICAgc2VnbWVudCA9IGhscy0+c2VnbWVudHM7CisgICAgc2VnbWVudCA9IHZzLT5zZWdtZW50czsKICAgICB3aGlsZSAoc2VnbWVudCkgewogICAgICAgICBwbGF5bGlzdF9kdXJhdGlvbiArPSBzZWdtZW50LT5kdXJhdGlvbjsKICAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQtPm5leHQ7CiAgICAgfQogCi0gICAgc2VnbWVudCA9IGhscy0+b2xkX3NlZ21lbnRzOworICAgIHNlZ21lbnQgPSB2cy0+b2xkX3NlZ21lbnRzOworICAgIHNlZ21lbnRfY250ID0gMDsKICAgICB3aGlsZSAoc2VnbWVudCkgewogICAgICAgICBwbGF5bGlzdF9kdXJhdGlvbiAtPSBzZWdtZW50LT5kdXJhdGlvbjsKICAgICAgICAgcHJldmlvdXNfc2VnbWVudCA9IHNlZ21lbnQ7CiAgICAgICAgIHNlZ21lbnQgPSBwcmV2aW91c19zZWdtZW50LT5uZXh0OworICAgICAgICBzZWdtZW50X2NudCsrOwogICAgICAgICBpZiAocGxheWxpc3RfZHVyYXRpb24gPD0gLXByZXZpb3VzX3NlZ21lbnQtPmR1cmF0aW9uKSB7CiAgICAgICAgICAgICBwcmV2aW91c19zZWdtZW50LT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGlmIChzZWdtZW50X2NudCA+PSBobHMtPmhsc19kZWxldGVfdGhyZXNob2xkKSB7CisgICAgICAgICAgICBwcmV2aW91c19zZWdtZW50LT5uZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHNlZ21lbnQpIHsKKyAgICBpZiAoc2VnbWVudCAmJiAhaGxzLT51c2VfbG9jYWx0aW1lX21rZGlyKSB7CiAgICAgICAgIGlmIChobHMtPnNlZ21lbnRfZmlsZW5hbWUpIHsKICAgICAgICAgICAgIGRpcm5hbWUgPSBhdl9zdHJkdXAoaGxzLT5zZWdtZW50X2ZpbGVuYW1lKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRpcm5hbWUgPSBhdl9zdHJkdXAoaGxzLT5hdmYtPmZpbGVuYW1lKTsKKyAgICAgICAgICAgIGRpcm5hbWUgPSBhdl9zdHJkdXAodnMtPmF2Zi0+dXJsKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWRpcm5hbWUpIHsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKQEAgLTE1NSwyNyArNDg4LDUyIEBACiAgICAgICAgIH0KICAgICAgICAgcCA9IChjaGFyICopYXZfYmFzZW5hbWUoZGlybmFtZSk7CiAgICAgICAgICpwID0gJ1wwJzsKKwogICAgIH0KIAogICAgIHdoaWxlIChzZWdtZW50KSB7CisgICAgICAgIGNoYXIgKiByX2Rpcm5hbWUgPSBkaXJuYW1lOworCisgICAgICAgIC8qIGlmICV2IGlzIHByZXNlbnQgaW4gdGhlIGZpbGUncyBkaXJlY3RvcnkgKi8KKyAgICAgICAgaWYgKGF2X3N0cmlzdHIoZGlybmFtZSwgIiV2IikpIHsKKworICAgICAgICAgICAgaWYgKHJlcGxhY2VfaW50X2RhdGFfaW5fZmlsZW5hbWUoJnJfZGlybmFtZSwgZGlybmFtZSwgJ3YnLCBzZWdtZW50LT52YXJfc3RyZWFtX2lkeCkgPCAxKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2ZyZWUoZGlybmFtZSk7CisgICAgICAgICAgICBkaXJuYW1lID0gcl9kaXJuYW1lOworICAgICAgICB9CisKICAgICAgICAgYXZfbG9nKGhscywgQVZfTE9HX0RFQlVHLCAiZGVsZXRpbmcgb2xkIHNlZ21lbnQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC0+ZmlsZW5hbWUpOwotICAgICAgICBwYXRoX3NpemUgPSBzdHJsZW4oZGlybmFtZSkgKyBzdHJsZW4oc2VnbWVudC0+ZmlsZW5hbWUpICsgMTsKKyAgICAgICAgcGF0aF9zaXplID0gIChobHMtPnVzZV9sb2NhbHRpbWVfbWtkaXIgPyAwIDogc3RybGVuKGRpcm5hbWUpKSArIHN0cmxlbihzZWdtZW50LT5maWxlbmFtZSkgKyAxOwogICAgICAgICBwYXRoID0gYXZfbWFsbG9jKHBhdGhfc2l6ZSk7CiAgICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAKLSAgICAgICAgYXZfc3RybGNweShwYXRoLCBkaXJuYW1lLCBwYXRoX3NpemUpOwotICAgICAgICBhdl9zdHJsY2F0KHBhdGgsIHNlZ21lbnQtPmZpbGVuYW1lLCBwYXRoX3NpemUpOwotICAgICAgICBpZiAodW5saW5rKHBhdGgpIDwgMCkgeworICAgICAgICBpZiAoaGxzLT51c2VfbG9jYWx0aW1lX21rZGlyKQorICAgICAgICAgICAgYXZfc3RybGNweShwYXRoLCBzZWdtZW50LT5maWxlbmFtZSwgcGF0aF9zaXplKTsKKyAgICAgICAgZWxzZSB7IC8vIHNlZ21lbnQtPmZpbGVuYW1lIGNvbnRhaW5zIGJhc2VuYW1lIG9ubHkKKyAgICAgICAgICAgIGF2X3N0cmxjcHkocGF0aCwgZGlybmFtZSwgcGF0aF9zaXplKTsKKyAgICAgICAgICAgIGF2X3N0cmxjYXQocGF0aCwgc2VnbWVudC0+ZmlsZW5hbWUsIHBhdGhfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcm90byA9IGF2aW9fZmluZF9wcm90b2NvbF9uYW1lKHMtPnVybCk7CisgICAgICAgIGlmIChobHMtPm1ldGhvZCB8fCAocHJvdG8gJiYgIWF2X3N0cmNhc2VjbXAocHJvdG8sICJodHRwIikpKSB7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3B0aW9ucywgIm1ldGhvZCIsICJERUxFVEUiLCAwKTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gdnMtPmF2Zi0+aW9fb3Blbih2cy0+YXZmLCAmb3V0LCBwYXRoLCBBVklPX0ZMQUdfV1JJVEUsICZvcHRpb25zKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZSh2cy0+YXZmLCAmb3V0KTsKKyAgICAgICAgfSBlbHNlIGlmICh1bmxpbmsocGF0aCkgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2coaGxzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgdG8gZGVsZXRlIG9sZCBzZWdtZW50ICVzOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNlZ21lbnQtPnN1Yl9maWxlbmFtZVswXSAhPSAnXDAnKSB7Ci0gICAgICAgICAgICBzdWJfcGF0aF9zaXplID0gc3RybGVuKGRpcm5hbWUpICsgc3RybGVuKHNlZ21lbnQtPnN1Yl9maWxlbmFtZSkgKyAxOworICAgICAgICBpZiAoKHNlZ21lbnQtPnN1Yl9maWxlbmFtZVswXSAhPSAnXDAnKSkgeworICAgICAgICAgICAgc3ViX3BhdGhfc2l6ZSA9IHN0cmxlbihzZWdtZW50LT5zdWJfZmlsZW5hbWUpICsgMSArIChkaXJuYW1lID8gc3RybGVuKGRpcm5hbWUpIDogMCk7CiAgICAgICAgICAgICBzdWJfcGF0aCA9IGF2X21hbGxvYyhzdWJfcGF0aF9zaXplKTsKICAgICAgICAgICAgIGlmICghc3ViX3BhdGgpIHsKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CkBAIC0xODQsNyArNTQyLDE1IEBACiAKICAgICAgICAgICAgIGF2X3N0cmxjcHkoc3ViX3BhdGgsIGRpcm5hbWUsIHN1Yl9wYXRoX3NpemUpOwogICAgICAgICAgICAgYXZfc3RybGNhdChzdWJfcGF0aCwgc2VnbWVudC0+c3ViX2ZpbGVuYW1lLCBzdWJfcGF0aF9zaXplKTsKLSAgICAgICAgICAgIGlmICh1bmxpbmsoc3ViX3BhdGgpIDwgMCkgeworCisgICAgICAgICAgICBpZiAoaGxzLT5tZXRob2QgfHwgKHByb3RvICYmICFhdl9zdHJjYXNlY21wKHByb3RvLCAiaHR0cCIpKSkgeworICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRpb25zLCAibWV0aG9kIiwgIkRFTEVURSIsIDApOworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gdnMtPmF2Zi0+aW9fb3Blbih2cy0+YXZmLCAmb3V0LCBzdWJfcGF0aCwgQVZJT19GTEFHX1dSSVRFLCAmb3B0aW9ucykpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKHN1Yl9wYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UodnMtPmF2ZiwgJm91dCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHVubGluayhzdWJfcGF0aCkgPCAwKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGhscywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHRvIGRlbGV0ZSBvbGQgc2VnbWVudCAlczogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Yl9wYXRoLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICAgICAgfQpAQCAtMjAzLDYgKzU2OSw4OSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgcmFuZG9taXplKHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKyNpZiBDT05GSUdfR0NSWVBUCisgICAgZ2NyeV9yYW5kb21pemUoYnVmLCBsZW4sIEdDUllfVkVSWV9TVFJPTkdfUkFORE9NKTsKKyAgICByZXR1cm4gMDsKKyNlbGlmIENPTkZJR19PUEVOU1NMCisgICAgaWYgKFJBTkRfYnl0ZXMoYnVmLCBsZW4pKQorICAgICAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyNlbmRpZgorICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgZG9fZW5jcnlwdChBVkZvcm1hdENvbnRleHQgKnMsIFZhcmlhbnRTdHJlYW0gKnZzKQoreworICAgIEhMU0NvbnRleHQgKmhscyA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgcmV0OworICAgIGludCBsZW47CisgICAgQVZJT0NvbnRleHQgKnBiOworICAgIHVpbnQ4X3Qga2V5W0tFWVNJWkVdOworCisgICAgbGVuID0gc3RybGVuKHMtPnVybCkgKyA0ICsgMTsKKyAgICBobHMtPmtleV9iYXNlbmFtZSA9IGF2X21hbGxvY3oobGVuKTsKKyAgICBpZiAoIWhscy0+a2V5X2Jhc2VuYW1lKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfc3RybGNweShobHMtPmtleV9iYXNlbmFtZSwgcy0+dXJsLCBsZW4pOworICAgIGF2X3N0cmxjYXQoaGxzLT5rZXlfYmFzZW5hbWUsICIua2V5IiwgbGVuKTsKKworICAgIGlmIChobHMtPmtleV91cmwpIHsKKyAgICAgICAgYXZfc3RybGNweShobHMtPmtleV9maWxlLCBobHMtPmtleV91cmwsIHNpemVvZihobHMtPmtleV9maWxlKSk7CisgICAgICAgIGF2X3N0cmxjcHkoaGxzLT5rZXlfdXJpLCBobHMtPmtleV91cmwsIHNpemVvZihobHMtPmtleV91cmkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9zdHJsY3B5KGhscy0+a2V5X2ZpbGUsIGhscy0+a2V5X2Jhc2VuYW1lLCBzaXplb2YoaGxzLT5rZXlfZmlsZSkpOworICAgICAgICBhdl9zdHJsY3B5KGhscy0+a2V5X3VyaSwgaGxzLT5rZXlfYmFzZW5hbWUsIHNpemVvZihobHMtPmtleV91cmkpKTsKKyAgICB9CisKKyAgICBpZiAoISpobHMtPml2X3N0cmluZykgeworICAgICAgICB1aW50OF90IGl2WzE2XSA9IHsgMCB9OworICAgICAgICBjaGFyIGJ1ZlszM107CisKKyAgICAgICAgaWYgKCFobHMtPml2KSB7CisgICAgICAgICAgICBBVl9XQjY0KGl2ICsgOCwgdnMtPnNlcXVlbmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShpdiwgaGxzLT5pdiwgc2l6ZW9mKGl2KSk7CisgICAgICAgIH0KKyAgICAgICAgZmZfZGF0YV90b19oZXgoYnVmLCBpdiwgc2l6ZW9mKGl2KSwgMCk7CisgICAgICAgIGJ1ZlszMl0gPSAnXDAnOworICAgICAgICBtZW1jcHkoaGxzLT5pdl9zdHJpbmcsIGJ1Ziwgc2l6ZW9mKGhscy0+aXZfc3RyaW5nKSk7CisgICAgfQorCisgICAgaWYgKCEqaGxzLT5rZXlfdXJpKSB7CisgICAgICAgIGF2X2xvZyhobHMsIEFWX0xPR19FUlJPUiwgIm5vIGtleSBVUkkgc3BlY2lmaWVkIGluIGtleSBpbmZvIGZpbGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghKmhscy0+a2V5X2ZpbGUpIHsKKyAgICAgICAgYXZfbG9nKGhscywgQVZfTE9HX0VSUk9SLCAibm8ga2V5IGZpbGUgc3BlY2lmaWVkIGluIGtleSBpbmZvIGZpbGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghKmhscy0+a2V5X3N0cmluZykgeworICAgICAgICBpZiAoIWhscy0+a2V5KSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IHJhbmRvbWl6ZShrZXksIHNpemVvZihrZXkpKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBnZW5lcmF0ZSBhIHN0cm9uZyByYW5kb20ga2V5XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KGtleSwgaGxzLT5rZXksIHNpemVvZihrZXkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZmX2RhdGFfdG9faGV4KGhscy0+a2V5X3N0cmluZywga2V5LCBzaXplb2Yoa2V5KSwgMCk7CisgICAgICAgIGlmICgocmV0ID0gcy0+aW9fb3BlbihzLCAmcGIsIGhscy0+a2V5X2ZpbGUsIEFWSU9fRkxBR19XUklURSwgTlVMTCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19DVVIpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBrZXksIEtFWVNJWkUpOworICAgICAgICBhdmlvX2Nsb3NlKHBiKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCBobHNfZW5jcnlwdGlvbl9zdGFydChBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOwpAQCAtMjU1LDE5ICs3MDQsMjUgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBobHNfbXV4X2luaXQoQVZGb3JtYXRDb250ZXh0ICpzKQorc3RhdGljIGludCBobHNfbXV4X2luaXQoQVZGb3JtYXRDb250ZXh0ICpzLCBWYXJpYW50U3RyZWFtICp2cykKIHsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOwogICAgIEhMU0NvbnRleHQgKmhscyA9IHMtPnByaXZfZGF0YTsKICAgICBBVkZvcm1hdENvbnRleHQgKm9jOwogICAgIEFWRm9ybWF0Q29udGV4dCAqdnR0X29jID0gTlVMTDsKKyAgICBpbnQgYnl0ZXJhbmdlX21vZGUgPSAoaGxzLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSkgfHwgKGhscy0+bWF4X3NlZ19zaXplID4gMCk7CiAgICAgaW50IGksIHJldDsKIAotICAgIHJldCA9IGF2Zm9ybWF0X2FsbG9jX291dHB1dF9jb250ZXh0MigmaGxzLT5hdmYsIGhscy0+b2Zvcm1hdCwgTlVMTCwgTlVMTCk7CisgICAgcmV0ID0gYXZmb3JtYXRfYWxsb2Nfb3V0cHV0X2NvbnRleHQyKCZ2cy0+YXZmLCB2cy0+b2Zvcm1hdCwgTlVMTCwgTlVMTCk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgb2MgPSBobHMtPmF2ZjsKKyAgICBvYyA9IHZzLT5hdmY7CiAKLSAgICBvYy0+b2Zvcm1hdCAgICAgICAgICAgID0gaGxzLT5vZm9ybWF0OworICAgIG9jLT51cmwgICAgICAgICAgICAgICAgPSBhdl9zdHJkdXAoIiIpOworICAgIGlmICghb2MtPnVybCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIG9jLT5vZm9ybWF0ICAgICAgICAgICAgPSB2cy0+b2Zvcm1hdDsKICAgICBvYy0+aW50ZXJydXB0X2NhbGxiYWNrID0gcy0+aW50ZXJydXB0X2NhbGxiYWNrOwogICAgIG9jLT5tYXhfZGVsYXkgICAgICAgICAgPSBzLT5tYXhfZGVsYXk7CiAgICAgb2MtPm9wYXF1ZSAgICAgICAgICAgICA9IHMtPm9wYXF1ZTsKQEAgLTI3NSw0OCArNzMwLDI3NiBAQAogICAgIG9jLT5pb19jbG9zZSAgICAgICAgICAgPSBzLT5pb19jbG9zZTsKICAgICBhdl9kaWN0X2NvcHkoJm9jLT5tZXRhZGF0YSwgcy0+bWV0YWRhdGEsIDApOwogCi0gICAgaWYoaGxzLT52dHRfb2Zvcm1hdCkgewotICAgICAgICByZXQgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJmhscy0+dnR0X2F2ZiwgaGxzLT52dHRfb2Zvcm1hdCwgTlVMTCwgTlVMTCk7CisgICAgaWYodnMtPnZ0dF9vZm9ybWF0KSB7CisgICAgICAgIHJldCA9IGF2Zm9ybWF0X2FsbG9jX291dHB1dF9jb250ZXh0MigmdnMtPnZ0dF9hdmYsIHZzLT52dHRfb2Zvcm1hdCwgTlVMTCwgTlVMTCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgdnR0X29jICAgICAgICAgID0gaGxzLT52dHRfYXZmOwotICAgICAgICB2dHRfb2MtPm9mb3JtYXQgPSBobHMtPnZ0dF9vZm9ybWF0OworICAgICAgICB2dHRfb2MgICAgICAgICAgPSB2cy0+dnR0X2F2ZjsKKyAgICAgICAgdnR0X29jLT5vZm9ybWF0ID0gdnMtPnZ0dF9vZm9ybWF0OwogICAgICAgICBhdl9kaWN0X2NvcHkoJnZ0dF9vYy0+bWV0YWRhdGEsIHMtPm1ldGFkYXRhLCAwKTsKICAgICB9CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHZzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0OwogICAgICAgICBBVkZvcm1hdENvbnRleHQgKmxvYzsKLSAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgaWYgKHZzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCiAgICAgICAgICAgICBsb2MgPSB2dHRfb2M7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGxvYyA9IG9jOwogCiAgICAgICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShsb2MsIE5VTEwpKSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGF2Y29kZWNfY29weV9jb250ZXh0KHN0LT5jb2RlYywgcy0+c3RyZWFtc1tpXS0+Y29kZWMpOwotICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHMtPnN0cmVhbXNbaV0tPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0gICAgICAgIHN0LT50aW1lX2Jhc2UgPSBzLT5zdHJlYW1zW2ldLT50aW1lX2Jhc2U7Ci0gICAgfQotICAgIGhscy0+c3RhcnRfcG9zID0gMDsKKyAgICAgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkoc3QtPmNvZGVjcGFyLCB2cy0+c3RyZWFtc1tpXS0+Y29kZWNwYXIpOworICAgICAgICBpZiAoIW9jLT5vZm9ybWF0LT5jb2RlY190YWcgfHwKKyAgICAgICAgICAgIGF2X2NvZGVjX2dldF9pZCAob2MtPm9mb3JtYXQtPmNvZGVjX3RhZywgdnMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190YWcpID09IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgfHwKKyAgICAgICAgICAgIGF2X2NvZGVjX2dldF90YWcob2MtPm9mb3JtYXQtPmNvZGVjX3RhZywgdnMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY19pZCkgPD0gMCkgeworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSB2cy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3RhZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgfQogCisgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gdnMtPnN0cmVhbXNbaV0tPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgIHN0LT50aW1lX2Jhc2UgPSB2cy0+c3RyZWFtc1tpXS0+dGltZV9iYXNlOworICAgICAgICBhdl9kaWN0X2NvcHkoJnN0LT5tZXRhZGF0YSwgdnMtPnN0cmVhbXNbaV0tPm1ldGFkYXRhLCAwKTsKKyAgICB9CisKKyAgICB2cy0+cGFja2V0c193cml0dGVuID0gMTsKKyAgICB2cy0+c3RhcnRfcG9zID0gMDsKKyAgICB2cy0+bmV3X3N0YXJ0ID0gMTsKKyAgICB2cy0+Zm1wNF9pbml0X21vZGUgPSAwOworCisgICAgaWYgKGhscy0+c2VnbWVudF90eXBlID09IFNFR01FTlRfVFlQRV9GTVA0KSB7CisgICAgICAgIGlmIChobHMtPm1heF9zZWdfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk11bHRpLWZpbGUgYnl0ZXJhbmdlIG1vZGUgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGluIHRoZSBITFMgbXV4ZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorCisgICAgICAgIHZzLT5wYWNrZXRzX3dyaXR0ZW4gPSAwOworICAgICAgICB2cy0+aW5pdF9yYW5nZV9sZW5ndGggPSAwOworICAgICAgICB2cy0+Zm1wNF9pbml0X21vZGUgPSAhYnl0ZXJhbmdlX21vZGU7CisgICAgICAgIHNldF9odHRwX29wdGlvbnMocywgJm9wdGlvbnMsIGhscyk7CisgICAgICAgIGlmICgocmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJm9jLT5wYikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgaWYgKGJ5dGVyYW5nZV9tb2RlKSB7CisgICAgICAgICAgICByZXQgPSBobHNlbmNfaW9fb3BlbihzLCAmdnMtPm91dCwgdnMtPmJhc2VuYW1lLCAmb3B0aW9ucyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBobHNlbmNfaW9fb3BlbihzLCAmdnMtPm91dCwgdnMtPmJhc2Vfb3V0cHV0X2Rpcm5hbWUsICZvcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIHNlZ21lbnQgJyVzJ1xuIiwgdnMtPmZtcDRfaW5pdF9maWxlbmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhscy0+Zm9ybWF0X29wdGlvbnNfc3RyKSB7CisgICAgICAgICAgICByZXQgPSBhdl9kaWN0X3BhcnNlX3N0cmluZygmaGxzLT5mb3JtYXRfb3B0aW9ucywgaGxzLT5mb3JtYXRfb3B0aW9uc19zdHIsICI9IiwgIjoiLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBwYXJzZSBmb3JtYXQgb3B0aW9ucyBsaXN0ICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGhscy0+Zm9ybWF0X29wdGlvbnNfc3RyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXZfZGljdF9jb3B5KCZvcHRpb25zLCBobHMtPmZvcm1hdF9vcHRpb25zLCAwKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdGlvbnMsICJmZmxhZ3MiLCAiLWF1dG9ic2YiLCAwKTsKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdGlvbnMsICJtb3ZmbGFncyIsICJmcmFnX2N1c3RvbStkYXNoK2RlbGF5X21vb3YiLCAwKTsKKyAgICAgICAgcmV0ID0gYXZmb3JtYXRfaW5pdF9vdXRwdXQob2MsICZvcHRpb25zKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBpZiAoYXZfZGljdF9jb3VudChvcHRpb25zKSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNvbWUgb2YgdGhlIHByb3ZpZGVkIGZvcm1hdCBvcHRpb25zIGluICclcycgYXJlIG5vdCByZWNvZ25pemVkXG4iLCBobHMtPmZvcm1hdF9vcHRpb25zX3N0cik7CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX2ZsdXNoKG9jLT5wYik7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0aW9ucyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgSExTU2VnbWVudCAqZmluZF9zZWdtZW50X2J5X2ZpbGVuYW1lKEhMU1NlZ21lbnQgKnNlZ21lbnQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgIHdoaWxlIChzZWdtZW50KSB7CisgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChzZWdtZW50LT5maWxlbmFtZSxmaWxlbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gc2VnbWVudDsKKyAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQtPm5leHQ7CisgICAgfQorICAgIHJldHVybiAoSExTU2VnbWVudCAqKSBOVUxMOworfQorCitzdGF0aWMgaW50IHNsc19mbGFnc19maWxlbmFtZV9wcm9jZXNzKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIEhMU0NvbnRleHQgKmhscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFyaWFudFN0cmVhbSAqdnMsIEhMU1NlZ21lbnQgKmVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHVyYXRpb24sIGludDY0X3QgcG9zLCBpbnQ2NF90IHNpemUpCit7CisgICAgaWYgKChobHMtPmZsYWdzICYgKEhMU19TRUNPTkRfTEVWRUxfU0VHTUVOVF9TSVpFIHwgSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX0RVUkFUSU9OKSkgJiYKKyAgICAgICAgc3RybGVuKHZzLT5jdXJyZW50X3NlZ21lbnRfZmluYWxfZmlsZW5hbWVfZm10KSkgeworICAgICAgICBjaGFyICogbmV3X3VybCA9IGF2X3N0cmR1cCh2cy0+Y3VycmVudF9zZWdtZW50X2ZpbmFsX2ZpbGVuYW1lX2ZtdCk7CisgICAgICAgIGlmICghbmV3X3VybCkgeworICAgICAgICAgICAgYXZfZnJlZShlbik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIGZmX2Zvcm1hdF9zZXRfdXJsKHZzLT5hdmYsIG5ld191cmwpOworICAgICAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TRUNPTkRfTEVWRUxfU0VHTUVOVF9TSVpFKSB7CisgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAocmVwbGFjZV9pbnRfZGF0YV9pbl9maWxlbmFtZSgmZmlsZW5hbWUsIHZzLT5hdmYtPnVybCwgJ3MnLCBwb3MgKyBzaXplKSA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaGxzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHNlY29uZCBsZXZlbCBzZWdtZW50IGZpbGVuYW1lIHRlbXBsYXRlICclcycsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIHRyeSB0byByZW1vdmUgc2Vjb25kX2xldmVsX3NlZ21lbnRfc2l6ZSBmbGFnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB2cy0+YXZmLT51cmwpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoZW4pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl9mb3JtYXRfc2V0X3VybCh2cy0+YXZmLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhscy0+ZmxhZ3MgJiBITFNfU0VDT05EX0xFVkVMX1NFR01FTlRfRFVSQVRJT04pIHsKKyAgICAgICAgICAgIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChyZXBsYWNlX2ludF9kYXRhX2luX2ZpbGVuYW1lKCZmaWxlbmFtZSwgdnMtPmF2Zi0+dXJsLAorICAgICAgICAgICAgICAgICd0JywgIChpbnQ2NF90KXJvdW5kKGR1cmF0aW9uICogSExTX01JQ1JPU0VDT05EX1VOSVQpKSA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coaGxzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHNlY29uZCBsZXZlbCBzZWdtZW50IGZpbGVuYW1lIHRlbXBsYXRlICclcycsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIHRyeSB0byByZW1vdmUgc2Vjb25kX2xldmVsX3NlZ21lbnRfdGltZSBmbGFnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB2cy0+YXZmLT51cmwpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoZW4pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl9mb3JtYXRfc2V0X3VybCh2cy0+YXZmLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2xzX2ZsYWdfY2hlY2tfZHVyYXRpb25fc2l6ZV9pbmRleChITFNDb250ZXh0ICpobHMpCit7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TRUNPTkRfTEVWRUxfU0VHTUVOVF9EVVJBVElPTikgeworICAgICAgICAgYXZfbG9nKGhscywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJzZWNvbmRfbGV2ZWxfc2VnbWVudF9kdXJhdGlvbiBobHNfZmxhZyByZXF1aXJlcyB1c2VfbG9jYWx0aW1lIHRvIGJlIHRydWVcbiIpOworICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TRUNPTkRfTEVWRUxfU0VHTUVOVF9TSVpFKSB7CisgICAgICAgICBhdl9sb2coaGxzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgInNlY29uZF9sZXZlbF9zZWdtZW50X3NpemUgaGxzX2ZsYWcgcmVxdWlyZXMgdXNlX2xvY2FsdGltZSB0byBiZSB0cnVlXG4iKTsKKyAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKGhscy0+ZmxhZ3MgJiBITFNfU0VDT05EX0xFVkVMX1NFR01FTlRfSU5ERVgpIHsKKyAgICAgICAgYXZfbG9nKGhscywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgInNlY29uZF9sZXZlbF9zZWdtZW50X2luZGV4IGhsc19mbGFnIHJlcXVpcmVzIHVzZV9sb2NhbHRpbWUgdG8gYmUgdHJ1ZVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNsc19mbGFnX2NoZWNrX2R1cmF0aW9uX3NpemUoSExTQ29udGV4dCAqaGxzLCBWYXJpYW50U3RyZWFtICp2cykKK3sKKyAgICBjb25zdCBjaGFyICpwcm90byA9IGF2aW9fZmluZF9wcm90b2NvbF9uYW1lKHZzLT5iYXNlbmFtZSk7CisgICAgaW50IHNlZ21lbnRfcmVuYW1pbmdfb2sgPSBwcm90byAmJiAhc3RyY21wKHByb3RvLCAiZmlsZSIpOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKChobHMtPmZsYWdzICYgSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX0RVUkFUSU9OKSAmJiAhc2VnbWVudF9yZW5hbWluZ19vaykgeworICAgICAgICAgYXZfbG9nKGhscywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICJzZWNvbmRfbGV2ZWxfc2VnbWVudF9kdXJhdGlvbiBobHNfZmxhZyB3b3JrcyBvbmx5IHdpdGggZmlsZSBwcm90b2NvbCBzZWdtZW50IG5hbWVzXG4iKTsKKyAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKChobHMtPmZsYWdzICYgSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX1NJWkUpICYmICFzZWdtZW50X3JlbmFtaW5nX29rKSB7CisgICAgICAgICBhdl9sb2coaGxzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgInNlY29uZF9sZXZlbF9zZWdtZW50X3NpemUgaGxzX2ZsYWcgd29ya3Mgb25seSB3aXRoIGZpbGUgcHJvdG9jb2wgc2VnbWVudCBuYW1lc1xuIik7CisgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc2xzX2ZsYWdfZmlsZV9yZW5hbWUoSExTQ29udGV4dCAqaGxzLCBWYXJpYW50U3RyZWFtICp2cywgY2hhciAqb2xkX2ZpbGVuYW1lKSB7CisgICAgaWYgKChobHMtPmZsYWdzICYgKEhMU19TRUNPTkRfTEVWRUxfU0VHTUVOVF9TSVpFIHwgSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX0RVUkFUSU9OKSkgJiYKKyAgICAgICAgc3RybGVuKHZzLT5jdXJyZW50X3NlZ21lbnRfZmluYWxfZmlsZW5hbWVfZm10KSkgeworICAgICAgICBmZl9yZW5hbWUob2xkX2ZpbGVuYW1lLCB2cy0+YXZmLT51cmwsIGhscyk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHNsc19mbGFnX3VzZV9sb2NhbHRpbWVfZmlsZW5hbWUoQVZGb3JtYXRDb250ZXh0ICpvYywgSExTQ29udGV4dCAqYywgVmFyaWFudFN0cmVhbSAqdnMpCit7CisgICAgaWYgKGMtPmZsYWdzICYgSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX0lOREVYKSB7CisgICAgICAgIGNoYXIgKmZpbGVuYW1lID0gTlVMTDsKKyAgICAgICAgaWYgKHJlcGxhY2VfaW50X2RhdGFfaW5fZmlsZW5hbWUoJmZpbGVuYW1lLAorI2lmIEZGX0FQSV9ITFNfV1JBUAorICAgICAgICAgICAgb2MtPnVybCwgJ2QnLCBjLT53cmFwID8gdnMtPnNlcXVlbmNlICUgYy0+d3JhcCA6IHZzLT5zZXF1ZW5jZSkgPCAxKSB7CisjZWxzZQorICAgICAgICAgICAgb2MtPnVybCwgJ2QnLCB2cy0+c2VxdWVuY2UpIDwgMSkgeworI2VuZGlmCisgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzZWNvbmQgbGV2ZWwgc2VnbWVudCBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnLCAiCisgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIHRyeSB0byByZW1vdmUgc2Vjb25kX2xldmVsX3NlZ21lbnRfaW5kZXggZmxhZ1xuIiwKKyAgICAgICAgICAgICAgICAgICBvYy0+dXJsKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoZmlsZW5hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBmZl9mb3JtYXRfc2V0X3VybChvYywgZmlsZW5hbWUpOworICAgIH0KKyAgICBpZiAoYy0+ZmxhZ3MgJiAoSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX1NJWkUgfCBITFNfU0VDT05EX0xFVkVMX1NFR01FTlRfRFVSQVRJT04pKSB7CisgICAgICAgIGF2X3N0cmxjcHkodnMtPmN1cnJlbnRfc2VnbWVudF9maW5hbF9maWxlbmFtZV9mbXQsIG9jLT51cmwsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHZzLT5jdXJyZW50X3NlZ21lbnRfZmluYWxfZmlsZW5hbWVfZm10KSk7CisgICAgICAgIGlmIChjLT5mbGFncyAmIEhMU19TRUNPTkRfTEVWRUxfU0VHTUVOVF9TSVpFKSB7CisgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAocmVwbGFjZV9pbnRfZGF0YV9pbl9maWxlbmFtZSgmZmlsZW5hbWUsIG9jLT51cmwsICdzJywgMCkgPCAxKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2Vjb25kIGxldmVsIHNlZ21lbnQgZmlsZW5hbWUgdGVtcGxhdGUgJyVzJywgIgorICAgICAgICAgICAgICAgICAgICAgICAgInlvdSBjYW4gdHJ5IHRvIHJlbW92ZSBzZWNvbmRfbGV2ZWxfc2VnbWVudF9zaXplIGZsYWdcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG9jLT51cmwpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl9mb3JtYXRfc2V0X3VybChvYywgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmIChjLT5mbGFncyAmIEhMU19TRUNPTkRfTEVWRUxfU0VHTUVOVF9EVVJBVElPTikgeworICAgICAgICAgICAgY2hhciAqZmlsZW5hbWUgPSBOVUxMOworICAgICAgICAgICAgaWYgKHJlcGxhY2VfaW50X2RhdGFfaW5fZmlsZW5hbWUoJmZpbGVuYW1lLCBvYy0+dXJsLCAndCcsIDApIDwgMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNlY29uZCBsZXZlbCBzZWdtZW50IGZpbGVuYW1lIHRlbXBsYXRlICclcycsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ5b3UgY2FuIHRyeSB0byByZW1vdmUgc2Vjb25kX2xldmVsX3NlZ21lbnRfdGltZSBmbGFnXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBvYy0+dXJsKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmZfZm9ybWF0X3NldF91cmwob2MsIGZpbGVuYW1lKTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gMDsKIH0KIAogLyogQ3JlYXRlIGEgbmV3IHNlZ21lbnQgYW5kIGFwcGVuZCBpdCB0byB0aGUgc2VnbWVudCBsaXN0ICovCi1zdGF0aWMgaW50IGhsc19hcHBlbmRfc2VnbWVudChITFNDb250ZXh0ICpobHMsIGRvdWJsZSBkdXJhdGlvbiwgaW50NjRfdCBwb3MsCitzdGF0aWMgaW50IGhsc19hcHBlbmRfc2VnbWVudChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBITFNDb250ZXh0ICpobHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYW50U3RyZWFtICp2cywgZG91YmxlIGR1cmF0aW9uLCBpbnQ2NF90IHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSkKIHsKICAgICBITFNTZWdtZW50ICplbiA9IGF2X21hbGxvYyhzaXplb2YoKmVuKSk7CisgICAgY29uc3QgY2hhciAgKmZpbGVuYW1lOworICAgIGludCBieXRlcmFuZ2VfbW9kZSA9IChobHMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKSB8fCAoaGxzLT5tYXhfc2VnX3NpemUgPiAwKTsKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKCFlbikKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIGF2X3N0cmxjcHkoZW4tPmZpbGVuYW1lLCBhdl9iYXNlbmFtZShobHMtPmF2Zi0+ZmlsZW5hbWUpLCBzaXplb2YoZW4tPmZpbGVuYW1lKSk7CisgICAgZW4tPnZhcl9zdHJlYW1faWR4ID0gdnMtPnZhcl9zdHJlYW1faWR4OworICAgIHJldCA9IHNsc19mbGFnc19maWxlbmFtZV9wcm9jZXNzKHMsIGhscywgdnMsIGVuLCBkdXJhdGlvbiwgcG9zLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KIAotICAgIGlmKGhscy0+aGFzX3N1YnRpdGxlKQotICAgICAgICBhdl9zdHJsY3B5KGVuLT5zdWJfZmlsZW5hbWUsIGF2X2Jhc2VuYW1lKGhscy0+dnR0X2F2Zi0+ZmlsZW5hbWUpLCBzaXplb2YoZW4tPnN1Yl9maWxlbmFtZSkpOworICAgIGZpbGVuYW1lID0gYXZfYmFzZW5hbWUodnMtPmF2Zi0+dXJsKTsKKworICAgIGlmIChobHMtPnVzZV9sb2NhbHRpbWVfbWtkaXIpIHsKKyAgICAgICAgZmlsZW5hbWUgPSB2cy0+YXZmLT51cmw7CisgICAgfQorICAgIGlmICgoZmluZF9zZWdtZW50X2J5X2ZpbGVuYW1lKHZzLT5zZWdtZW50cywgZmlsZW5hbWUpIHx8IGZpbmRfc2VnbWVudF9ieV9maWxlbmFtZSh2cy0+b2xkX3NlZ21lbnRzLCBmaWxlbmFtZSkpCisgICAgICAgICYmICFieXRlcmFuZ2VfbW9kZSkgeworICAgICAgICBhdl9sb2coaGxzLCBBVl9MT0dfV0FSTklORywgIkR1cGxpY2F0ZWQgc2VnbWVudCBmaWxlbmFtZSBkZXRlY3RlZDogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICB9CisgICAgYXZfc3RybGNweShlbi0+ZmlsZW5hbWUsIGZpbGVuYW1lLCBzaXplb2YoZW4tPmZpbGVuYW1lKSk7CisKKyAgICBpZih2cy0+aGFzX3N1YnRpdGxlKQorICAgICAgICBhdl9zdHJsY3B5KGVuLT5zdWJfZmlsZW5hbWUsIGF2X2Jhc2VuYW1lKHZzLT52dHRfYXZmLT51cmwpLCBzaXplb2YoZW4tPnN1Yl9maWxlbmFtZSkpOwogICAgIGVsc2UKICAgICAgICAgZW4tPnN1Yl9maWxlbmFtZVswXSA9ICdcMCc7CiAKQEAgLTMyNCwzOCArMTAwNywxNDYgQEAKICAgICBlbi0+cG9zICAgICAgPSBwb3M7CiAgICAgZW4tPnNpemUgICAgID0gc2l6ZTsKICAgICBlbi0+bmV4dCAgICAgPSBOVUxMOworICAgIGVuLT5kaXNjb250ICA9IDA7CiAKLSAgICBpZiAoaGxzLT5rZXlfaW5mb19maWxlKSB7CisgICAgaWYgKHZzLT5kaXNjb250aW51aXR5KSB7CisgICAgICAgIGVuLT5kaXNjb250ID0gMTsKKyAgICAgICAgdnMtPmRpc2NvbnRpbnVpdHkgPSAwOworICAgIH0KKworICAgIGlmIChobHMtPmtleV9pbmZvX2ZpbGUgfHwgaGxzLT5lbmNyeXB0KSB7CiAgICAgICAgIGF2X3N0cmxjcHkoZW4tPmtleV91cmksIGhscy0+a2V5X3VyaSwgc2l6ZW9mKGVuLT5rZXlfdXJpKSk7CiAgICAgICAgIGF2X3N0cmxjcHkoZW4tPml2X3N0cmluZywgaGxzLT5pdl9zdHJpbmcsIHNpemVvZihlbi0+aXZfc3RyaW5nKSk7CiAgICAgfQogCi0gICAgaWYgKCFobHMtPnNlZ21lbnRzKQotICAgICAgICBobHMtPnNlZ21lbnRzID0gZW47CisgICAgaWYgKCF2cy0+c2VnbWVudHMpCisgICAgICAgIHZzLT5zZWdtZW50cyA9IGVuOwogICAgIGVsc2UKLSAgICAgICAgaGxzLT5sYXN0X3NlZ21lbnQtPm5leHQgPSBlbjsKKyAgICAgICAgdnMtPmxhc3Rfc2VnbWVudC0+bmV4dCA9IGVuOwogCi0gICAgaGxzLT5sYXN0X3NlZ21lbnQgPSBlbjsKKyAgICB2cy0+bGFzdF9zZWdtZW50ID0gZW47CiAKLSAgICBpZiAoaGxzLT5tYXhfbmJfc2VnbWVudHMgJiYgaGxzLT5uYl9lbnRyaWVzID49IGhscy0+bWF4X25iX3NlZ21lbnRzKSB7Ci0gICAgICAgIGVuID0gaGxzLT5zZWdtZW50czsKLSAgICAgICAgaGxzLT5zZWdtZW50cyA9IGVuLT5uZXh0OworICAgIC8vIEVWRU5UIG9yIFZPRCBwbGF5bGlzdHMgaW1wbHkgc2xpZGluZyB3aW5kb3cgY2Fubm90IGJlIHVzZWQKKyAgICBpZiAoaGxzLT5wbF90eXBlICE9IFBMQVlMSVNUX1RZUEVfTk9ORSkKKyAgICAgICAgaGxzLT5tYXhfbmJfc2VnbWVudHMgPSAwOworCisgICAgaWYgKGhscy0+bWF4X25iX3NlZ21lbnRzICYmIHZzLT5uYl9lbnRyaWVzID49IGhscy0+bWF4X25iX3NlZ21lbnRzKSB7CisgICAgICAgIGVuID0gdnMtPnNlZ21lbnRzOworICAgICAgICB2cy0+aW5pdGlhbF9wcm9nX2RhdGVfdGltZSArPSBlbi0+ZHVyYXRpb247CisgICAgICAgIHZzLT5zZWdtZW50cyA9IGVuLT5uZXh0OwogICAgICAgICBpZiAoZW4gJiYgaGxzLT5mbGFncyAmIEhMU19ERUxFVEVfU0VHTUVOVFMgJiYKKyNpZiBGRl9BUElfSExTX1dSQVAKICAgICAgICAgICAgICAgICAhKGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUgfHwgaGxzLT53cmFwKSkgewotICAgICAgICAgICAgZW4tPm5leHQgPSBobHMtPm9sZF9zZWdtZW50czsKLSAgICAgICAgICAgIGhscy0+b2xkX3NlZ21lbnRzID0gZW47Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGhsc19kZWxldGVfb2xkX3NlZ21lbnRzKGhscykpIDwgMCkKKyNlbHNlCisgICAgICAgICAgICAgICAgIShobHMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKSkgeworI2VuZGlmCisgICAgICAgICAgICBlbi0+bmV4dCA9IHZzLT5vbGRfc2VnbWVudHM7CisgICAgICAgICAgICB2cy0+b2xkX3NlZ21lbnRzID0gZW47CisgICAgICAgICAgICBpZiAoKHJldCA9IGhsc19kZWxldGVfb2xkX3NlZ21lbnRzKHMsIGhscywgdnMpKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICBhdl9mcmVlKGVuKTsKICAgICB9IGVsc2UKLSAgICAgICAgaGxzLT5uYl9lbnRyaWVzKys7CisgICAgICAgIHZzLT5uYl9lbnRyaWVzKys7CiAKLSAgICBobHMtPnNlcXVlbmNlKys7CisgICAgaWYgKGhscy0+bWF4X3NlZ19zaXplID4gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdnMtPnNlcXVlbmNlKys7CiAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwYXJzZV9wbGF5bGlzdChBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnVybCwgVmFyaWFudFN0cmVhbSAqdnMpCit7CisgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICppbjsKKyAgICBpbnQgcmV0ID0gMCwgaXNfc2VnbWVudCA9IDA7CisgICAgaW50NjRfdCBuZXdfc3RhcnRfcG9zOworICAgIGNoYXIgbGluZVsxMDI0XTsKKyAgICBjb25zdCBjaGFyICpwdHI7CisgICAgY29uc3QgY2hhciAqZW5kOworCisgICAgaWYgKChyZXQgPSBmZmlvX29wZW5fd2hpdGVsaXN0KCZpbiwgdXJsLCBBVklPX0ZMQUdfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvdG9jb2xfd2hpdGVsaXN0LCBzLT5wcm90b2NvbF9ibGFja2xpc3QpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBmZl9nZXRfY2hvbXBfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICBpZiAoc3RyY21wKGxpbmUsICIjRVhUTTNVIikpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHZzLT5kaXNjb250aW51aXR5ID0gMDsKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihpbikpIHsKKyAgICAgICAgZmZfZ2V0X2Nob21wX2xpbmUoaW4sIGxpbmUsIHNpemVvZihsaW5lKSk7CisgICAgICAgIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVC1YLU1FRElBLVNFUVVFTkNFOiIsICZwdHIpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRtcF9zZXF1ZW5jZSA9IHN0cnRvbGwocHRyLCBOVUxMLCAxMCk7CisgICAgICAgICAgICBpZiAodG1wX3NlcXVlbmNlIDwgdnMtPnNlcXVlbmNlKQorICAgICAgICAgICAgICBhdl9sb2coaGxzLCBBVl9MT0dfVkVSQk9TRSwKKyAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBwbGF5bGlzdCBzZXF1ZW5jZSBudW1iZXIgd2FzIHNtYWxsZXIgIiIiCisgICAgICAgICAgICAgICAgICAgICAidGhhbiBzcGVjaWZpZWQgc3RhcnQgc2VxdWVuY2UgbnVtYmVyOiAlIlBSSWQ2NCIgPCAlIlBSSWQ2NCIsICIKKyAgICAgICAgICAgICAgICAgICAgICJvbWl0dGluZ1xuIiwgdG1wX3NlcXVlbmNlLCBobHMtPnN0YXJ0X3NlcXVlbmNlKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICBhdl9sb2coaGxzLCBBVl9MT0dfREVCVUcsICJGb3VuZCBwbGF5bGlzdCBzZXF1ZW5jZSBudW1iZXI6ICUiUFJJZDY0IlxuIiwgdG1wX3NlcXVlbmNlKTsKKyAgICAgICAgICAgICAgdnMtPnNlcXVlbmNlID0gdG1wX3NlcXVlbmNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KGxpbmUsICIjRVhULVgtRElTQ09OVElOVUlUWSIsICZwdHIpKSB7CisgICAgICAgICAgICBpc19zZWdtZW50ID0gMTsKKyAgICAgICAgICAgIHZzLT5kaXNjb250aW51aXR5ID0gMTsKKyAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChsaW5lLCAiI0VYVElORjoiLCAmcHRyKSkgeworICAgICAgICAgICAgaXNfc2VnbWVudCA9IDE7CisgICAgICAgICAgICB2cy0+ZHVyYXRpb24gPSBhdG9mKHB0cik7CisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3RyaXN0YXJ0KGxpbmUsICIjRVhULVgtS0VZOiIsICZwdHIpKSB7CisgICAgICAgICAgICBwdHIgPSBhdl9zdHJpc3RyKGxpbmUsICJVUkk9XCIiKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBwdHIgKz0gc3RybGVuKCJVUkk9XCIiKTsKKyAgICAgICAgICAgICAgICBlbmQgPSBhdl9zdHJpc3RyKHB0ciwgIiwiKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkoaGxzLT5rZXlfdXJpLCBwdHIsIGVuZCAtIHB0cik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNweShobHMtPmtleV91cmksIHB0ciwgc2l6ZW9mKGhscy0+a2V5X3VyaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHRyID0gYXZfc3RyaXN0cihsaW5lLCAiSVY9MHgiKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBwdHIgKz0gc3RybGVuKCJJVj0weCIpOworICAgICAgICAgICAgICAgIGVuZCA9IGF2X3N0cmlzdHIocHRyLCAiLCIpOworICAgICAgICAgICAgICAgIGlmIChlbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNweShobHMtPml2X3N0cmluZywgcHRyLCBlbmQgLSBwdHIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkoaGxzLT5pdl9zdHJpbmcsIHB0ciwgc2l6ZW9mKGhscy0+aXZfc3RyaW5nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiMiLCBOVUxMKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAobGluZVswXSkgeworICAgICAgICAgICAgaWYgKGlzX3NlZ21lbnQpIHsKKyAgICAgICAgICAgICAgICBjaGFyICpuZXdfZmlsZSA9IGF2X3N0cmR1cChsaW5lKTsKKyAgICAgICAgICAgICAgICBpZiAoIW5ld19maWxlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRfc2V0X3VybCh2cy0+YXZmLCBuZXdfZmlsZSk7CisgICAgICAgICAgICAgICAgaXNfc2VnbWVudCA9IDA7CisgICAgICAgICAgICAgICAgbmV3X3N0YXJ0X3BvcyA9IGF2aW9fdGVsbCh2cy0+YXZmLT5wYik7CisgICAgICAgICAgICAgICAgdnMtPnNpemUgPSBuZXdfc3RhcnRfcG9zIC0gdnMtPnN0YXJ0X3BvczsKKyAgICAgICAgICAgICAgICByZXQgPSBobHNfYXBwZW5kX3NlZ21lbnQocywgaGxzLCB2cywgdnMtPmR1cmF0aW9uLCB2cy0+c3RhcnRfcG9zLCB2cy0+c2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB2cy0+c3RhcnRfcG9zID0gbmV3X3N0YXJ0X3BvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworZmFpbDoKKyAgICBhdmlvX2Nsb3NlKGluKTsKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0aWMgdm9pZCBobHNfZnJlZV9zZWdtZW50cyhITFNTZWdtZW50ICpwKQogewogICAgIEhMU1NlZ21lbnQgKmVuOwpAQCAtMzY3LDIwOCArMTE1OCw1MDMgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIHNldF9odHRwX29wdGlvbnMoQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywgSExTQ29udGV4dCAqYykKK3N0YXRpYyBpbnQgaGxzX3JlbmFtZV90ZW1wX2ZpbGUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkZvcm1hdENvbnRleHQgKm9jKQogewotICAgIGlmIChjLT5tZXRob2QpCi0gICAgICAgIGF2X2RpY3Rfc2V0KG9wdGlvbnMsICJtZXRob2QiLCBjLT5tZXRob2QsIDApOworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4ob2MtPnVybCk7CisgICAgY2hhciAqZmluYWxfZmlsZW5hbWUgPSBhdl9zdHJkdXAob2MtPnVybCk7CisgICAgaW50IHJldDsKKworICAgIGlmICghZmluYWxfZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmluYWxfZmlsZW5hbWVbbGVuLTRdID0gJ1wwJzsKKyAgICByZXQgPSBmZl9yZW5hbWUob2MtPnVybCwgZmluYWxfZmlsZW5hbWUsIHMpOworICAgIG9jLT51cmxbbGVuLTRdID0gJ1wwJzsKKyAgICBhdl9mcmVlcCgmZmluYWxfZmlsZW5hbWUpOworICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaGxzX3dpbmRvdyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBsYXN0KQorc3RhdGljIGludCBnZXRfcmVsYXRpdmVfdXJsKGNvbnN0IGNoYXIgKm1hc3Rlcl91cmwsIGNvbnN0IGNoYXIgKm1lZGlhX3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZWxfdXJsLCBpbnQgcmVsX3VybF9idWZfc2l6ZSkKK3sKKyAgICBjaGFyICpwID0gTlVMTDsKKyAgICBpbnQgYmFzZV9sZW4gPSAtMTsKKyAgICBwID0gc3RycmNocihtYXN0ZXJfdXJsLCAnLycpID8gc3RycmNocihtYXN0ZXJfdXJsLCAnLycpIDpcCisgICAgICAgICAgICBzdHJyY2hyKG1hc3Rlcl91cmwsICdcXCcpOworICAgIGlmIChwKSB7CisgICAgICAgIGJhc2VfbGVuID0gRkZBQlMocCAtIG1hc3Rlcl91cmwpOworICAgICAgICBpZiAoYXZfc3RybmNhc2VjbXAobWFzdGVyX3VybCwgbWVkaWFfdXJsLCBiYXNlX2xlbikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlVuYWJsZSB0byBmaW5kIHJlbGF0aXZlIHVybFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorICAgIGF2X3N0cmxjcHkocmVsX3VybCwgJihtZWRpYV91cmxbYmFzZV9sZW4gKyAxXSksIHJlbF91cmxfYnVmX3NpemUpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50NjRfdCBnZXRfc3RyZWFtX2JpdF9yYXRlKEFWU3RyZWFtICpzdHJlYW0pIHsKKyAgICBBVkNQQlByb3BlcnRpZXMgKnByb3BzID0gKEFWQ1BCUHJvcGVydGllcyopYXZfc3RyZWFtX2dldF9zaWRlX2RhdGEoCisgICAgICAgIHN0cmVhbSwKKyAgICAgICAgQVZfUEtUX0RBVEFfQ1BCX1BST1BFUlRJRVMsCisgICAgICAgIE5VTEwKKyAgICApOworCisgICAgaWYgKHN0cmVhbS0+Y29kZWNwYXItPmJpdF9yYXRlKQorICAgICAgICByZXR1cm4gc3RyZWFtLT5jb2RlY3Bhci0+Yml0X3JhdGU7CisgICAgZWxzZSBpZiAocHJvcHMpCisgICAgICAgIHJldHVybiBwcm9wcy0+bWF4X2JpdHJhdGU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjcmVhdGVfbWFzdGVyX3BsYXlsaXN0KEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYW50U3RyZWFtICogY29uc3QgaW5wdXRfdnMpCit7CisgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOworICAgIFZhcmlhbnRTdHJlYW0gKnZzLCAqdGVtcF92czsKKyAgICBBVlN0cmVhbSAqdmlkX3N0LCAqYXVkX3N0OworICAgIEFWRGljdGlvbmFyeSAqb3B0aW9ucyA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgaW50IG0zdThfbmFtZV9zaXplLCByZXQsIGJhbmR3aWR0aDsKKyAgICBjaGFyICptM3U4X3JlbF9uYW1lLCAqY2Nncm91cDsKKyAgICBDbG9zZWRDYXB0aW9uc1N0cmVhbSAqY2NzOworCisgICAgaW5wdXRfdnMtPm0zdThfY3JlYXRlZCA9IDE7CisgICAgaWYgKCFobHMtPm1hc3Rlcl9tM3U4X2NyZWF0ZWQpIHsKKyAgICAgICAgLyogRm9yIHRoZSBmaXJzdCB0aW1lLCB3YWl0IHVudGlsIGFsbCB0aGUgbWVkaWEgcGxheWxpc3RzIGFyZSBjcmVhdGVkICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBobHMtPm5iX3ZhcnN0cmVhbXM7IGkrKykKKyAgICAgICAgICAgIGlmICghaGxzLT52YXJfc3RyZWFtc1tpXS5tM3U4X2NyZWF0ZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgIC8qIEtlZXAgcHVibGlzaGluZyB0aGUgbWFzdGVyIHBsYXlsaXN0IGF0IHRoZSBjb25maWd1cmVkIHJhdGUgKi8KKyAgICAgICAgaWYgKCZobHMtPnZhcl9zdHJlYW1zWzBdICE9IGlucHV0X3ZzIHx8ICFobHMtPm1hc3Rlcl9wdWJsaXNoX3JhdGUgfHwKKyAgICAgICAgICAgIGlucHV0X3ZzLT5udW1iZXIgJSBobHMtPm1hc3Rlcl9wdWJsaXNoX3JhdGUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzZXRfaHR0cF9vcHRpb25zKHMsICZvcHRpb25zLCBobHMpOworCisgICAgcmV0ID0gaGxzZW5jX2lvX29wZW4ocywgJmhscy0+bTN1OF9vdXQsIGhscy0+bWFzdGVyX20zdThfdXJsLCAmb3B0aW9ucyk7CisgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gbWFzdGVyIHBsYXkgbGlzdCBmaWxlICclcydcbiIsCisgICAgICAgICAgICAgICAgaGxzLT5tYXN0ZXJfbTN1OF91cmwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZmZfaGxzX3dyaXRlX3BsYXlsaXN0X3ZlcnNpb24oaGxzLT5tM3U4X291dCwgaGxzLT52ZXJzaW9uKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBobHMtPm5iX2Njc3RyZWFtczsgaSsrKSB7CisgICAgICAgIGNjcyA9ICYoaGxzLT5jY19zdHJlYW1zW2ldKTsKKyAgICAgICAgYXZpb19wcmludGYoaGxzLT5tM3U4X291dCwgIiNFWFQtWC1NRURJQTpUWVBFPUNMT1NFRC1DQVBUSU9OUyIpOworICAgICAgICBhdmlvX3ByaW50ZihobHMtPm0zdThfb3V0LCAiLEdST1VQLUlEPVwiJXNcIiIsIGNjcy0+Y2Nncm91cCk7CisgICAgICAgIGF2aW9fcHJpbnRmKGhscy0+bTN1OF9vdXQsICIsTkFNRT1cIiVzXCIiLCBjY3MtPmluc3RyZWFtaWQpOworICAgICAgICBpZiAoY2NzLT5sYW5ndWFnZSkKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKGhscy0+bTN1OF9vdXQsICIsTEFOR1VBR0U9XCIlc1wiIiwgY2NzLT5sYW5ndWFnZSk7CisgICAgICAgIGF2aW9fcHJpbnRmKGhscy0+bTN1OF9vdXQsICIsSU5TVFJFQU0tSUQ9XCIlc1wiXG4iLCBjY3MtPmluc3RyZWFtaWQpOworICAgIH0KKworICAgIC8qIEZvciBhdWRpbyBvbmx5IHZhcmlhbnQgc3RyZWFtcyBhZGQgI0VYVC1YLU1FRElBIHRhZyB3aXRoIGF0dHJpYnV0ZXMqLworICAgIGZvciAoaSA9IDA7IGkgPCBobHMtPm5iX3ZhcnN0cmVhbXM7IGkrKykgeworICAgICAgICB2cyA9ICYoaGxzLT52YXJfc3RyZWFtc1tpXSk7CisKKyAgICAgICAgaWYgKHZzLT5oYXNfdmlkZW8gfHwgdnMtPmhhc19zdWJ0aXRsZSB8fCAhdnMtPmFncm91cCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG0zdThfbmFtZV9zaXplID0gc3RybGVuKHZzLT5tM3U4X25hbWUpICsgMTsKKyAgICAgICAgbTN1OF9yZWxfbmFtZSA9IGF2X21hbGxvYyhtM3U4X25hbWVfc2l6ZSk7CisgICAgICAgIGlmICghbTN1OF9yZWxfbmFtZSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGF2X3N0cmxjcHkobTN1OF9yZWxfbmFtZSwgdnMtPm0zdThfbmFtZSwgbTN1OF9uYW1lX3NpemUpOworICAgICAgICByZXQgPSBnZXRfcmVsYXRpdmVfdXJsKGhscy0+bWFzdGVyX20zdThfdXJsLCB2cy0+bTN1OF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0zdThfcmVsX25hbWUsIG0zdThfbmFtZV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZmluZCByZWxhdGl2ZSBVUkxcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgZmZfaGxzX3dyaXRlX2F1ZGlvX3JlbmRpdGlvbihobHMtPm0zdThfb3V0LCB2cy0+YWdyb3VwLCBtM3U4X3JlbF9uYW1lLCAwLCAxKTsKKworICAgICAgICBhdl9mcmVlcCgmbTN1OF9yZWxfbmFtZSk7CisgICAgfQorCisgICAgLyogRm9yIHZhcmlhbnQgc3RyZWFtcyB3aXRoIHZpZGVvIGFkZCAjRVhULVgtU1RSRUFNLUlORiB0YWcgd2l0aCBhdHRyaWJ1dGVzKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaGxzLT5uYl92YXJzdHJlYW1zOyBpKyspIHsKKyAgICAgICAgdnMgPSAmKGhscy0+dmFyX3N0cmVhbXNbaV0pOworCisgICAgICAgIG0zdThfbmFtZV9zaXplID0gc3RybGVuKHZzLT5tM3U4X25hbWUpICsgMTsKKyAgICAgICAgbTN1OF9yZWxfbmFtZSA9IGF2X21hbGxvYyhtM3U4X25hbWVfc2l6ZSk7CisgICAgICAgIGlmICghbTN1OF9yZWxfbmFtZSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGF2X3N0cmxjcHkobTN1OF9yZWxfbmFtZSwgdnMtPm0zdThfbmFtZSwgbTN1OF9uYW1lX3NpemUpOworICAgICAgICByZXQgPSBnZXRfcmVsYXRpdmVfdXJsKGhscy0+bWFzdGVyX20zdThfdXJsLCB2cy0+bTN1OF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0zdThfcmVsX25hbWUsIG0zdThfbmFtZV9zaXplKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZmluZCByZWxhdGl2ZSBVUkxcbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgdmlkX3N0ID0gTlVMTDsKKyAgICAgICAgYXVkX3N0ID0gTlVMTDsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHZzLT5uYl9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgIGlmICh2cy0+c3RyZWFtc1tqXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICAgICAgICAgIHZpZF9zdCA9IHZzLT5zdHJlYW1zW2pdOworICAgICAgICAgICAgZWxzZSBpZiAodnMtPnN0cmVhbXNbal0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgICAgICAgICBhdWRfc3QgPSB2cy0+c3RyZWFtc1tqXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghdmlkX3N0ICYmICFhdWRfc3QpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk1lZGlhIHN0cmVhbSBub3QgZm91bmRcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhdmVyc2UgdGhyb3VnaCB0aGUgbGlzdCBvZiBhdWRpbyBvbmx5IHJlbmRpdGlvbiBzdHJlYW1zIGFuZCBmaW5kCisgICAgICAgICAqIHRoZSByZW5kaXRpb24gd2hpY2ggaGFzIGhpZ2hlc3QgYml0cmF0ZSBpbiB0aGUgc2FtZSBhdWRpbyBncm91cAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHZzLT5hZ3JvdXApIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBobHMtPm5iX3ZhcnN0cmVhbXM7IGorKykgeworICAgICAgICAgICAgICAgIHRlbXBfdnMgPSAmKGhscy0+dmFyX3N0cmVhbXNbal0pOworICAgICAgICAgICAgICAgIGlmICghdGVtcF92cy0+aGFzX3ZpZGVvICYmICF0ZW1wX3ZzLT5oYXNfc3VidGl0bGUgJiYKKyAgICAgICAgICAgICAgICAgICAgdGVtcF92cy0+YWdyb3VwICYmCisgICAgICAgICAgICAgICAgICAgICFhdl9zdHJjYXNlY21wKHRlbXBfdnMtPmFncm91cCwgdnMtPmFncm91cCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFhdWRfc3QpCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRfc3QgPSB0ZW1wX3ZzLT5zdHJlYW1zWzBdOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcF92cy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmJpdF9yYXRlID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRfc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZF9zdCA9IHRlbXBfdnMtPnN0cmVhbXNbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYmFuZHdpZHRoID0gMDsKKyAgICAgICAgaWYgKHZpZF9zdCkKKyAgICAgICAgICAgIGJhbmR3aWR0aCArPSBnZXRfc3RyZWFtX2JpdF9yYXRlKHZpZF9zdCk7CisgICAgICAgIGlmIChhdWRfc3QpCisgICAgICAgICAgICBiYW5kd2lkdGggKz0gZ2V0X3N0cmVhbV9iaXRfcmF0ZShhdWRfc3QpOworICAgICAgICBiYW5kd2lkdGggKz0gYmFuZHdpZHRoIC8gMTA7CisKKyAgICAgICAgY2Nncm91cCA9IE5VTEw7CisgICAgICAgIGlmICh2aWRfc3QgJiYgdnMtPmNjZ3JvdXApIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoaXMgZ3JvdXAgbmFtZSBpcyBhdmFpbGFibGUgaW4gdGhlIGNjIG1hcCBzdHJpbmcgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBobHMtPm5iX2Njc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICAgICAgY2NzID0gJihobHMtPmNjX3N0cmVhbXNbal0pOworICAgICAgICAgICAgICAgIGlmICghYXZfc3RyY2FzZWNtcChjY3MtPmNjZ3JvdXAsIHZzLT5jY2dyb3VwKSkgeworICAgICAgICAgICAgICAgICAgICBjY2dyb3VwID0gdnMtPmNjZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqID09IGhscy0+bmJfY2NzdHJlYW1zKQorICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIm1hcHBpbmcgY2Nncm91cCAlcyBub3QgZm91bmRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB2cy0+Y2Nncm91cCk7CisgICAgICAgIH0KKworICAgICAgICBmZl9obHNfd3JpdGVfc3RyZWFtX2luZm8odmlkX3N0LCBobHMtPm0zdThfb3V0LCBiYW5kd2lkdGgsIG0zdThfcmVsX25hbWUsCisgICAgICAgICAgICAgICAgYXVkX3N0ID8gdnMtPmFncm91cCA6IE5VTEwsIHZzLT5jb2RlY19hdHRyLCBjY2dyb3VwKTsKKworICAgICAgICBhdl9mcmVlcCgmbTN1OF9yZWxfbmFtZSk7CisgICAgfQorZmFpbDoKKyAgICBpZihyZXQgPj0wKQorICAgICAgICBobHMtPm1hc3Rlcl9tM3U4X2NyZWF0ZWQgPSAxOworICAgIGF2X2ZyZWVwKCZtM3U4X3JlbF9uYW1lKTsKKyAgICBobHNlbmNfaW9fY2xvc2UocywgJmhscy0+bTN1OF9vdXQsIGhscy0+bWFzdGVyX20zdThfdXJsKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhsc193aW5kb3coQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgbGFzdCwgVmFyaWFudFN0cmVhbSAqdnMpCiB7CiAgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOwogICAgIEhMU1NlZ21lbnQgKmVuOwogICAgIGludCB0YXJnZXRfZHVyYXRpb24gPSAwOwogICAgIGludCByZXQgPSAwOwotICAgIEFWSU9Db250ZXh0ICpvdXQgPSBOVUxMOwotICAgIEFWSU9Db250ZXh0ICpzdWJfb3V0ID0gTlVMTDsKICAgICBjaGFyIHRlbXBfZmlsZW5hbWVbMTAyNF07Ci0gICAgaW50NjRfdCBzZXF1ZW5jZSA9IEZGTUFYKGhscy0+c3RhcnRfc2VxdWVuY2UsIGhscy0+c2VxdWVuY2UgLSBobHMtPm5iX2VudHJpZXMpOwotICAgIGludCB2ZXJzaW9uID0gaGxzLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSA/IDQgOiAzOwotICAgIGNvbnN0IGNoYXIgKnByb3RvID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUocy0+ZmlsZW5hbWUpOworICAgIGludDY0X3Qgc2VxdWVuY2UgPSBGRk1BWChobHMtPnN0YXJ0X3NlcXVlbmNlLCB2cy0+c2VxdWVuY2UgLSB2cy0+bmJfZW50cmllcyk7CisgICAgY29uc3QgY2hhciAqcHJvdG8gPSBhdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShzLT51cmwpOwogICAgIGludCB1c2VfcmVuYW1lID0gcHJvdG8gJiYgIXN0cmNtcChwcm90bywgImZpbGUiKTsKICAgICBzdGF0aWMgdW5zaWduZWQgd2FybmVkX25vbl9maWxlOwogICAgIGNoYXIgKmtleV91cmkgPSBOVUxMOwogICAgIGNoYXIgKml2X3N0cmluZyA9IE5VTEw7CiAgICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zID0gTlVMTDsKKyAgICBkb3VibGUgcHJvZ19kYXRlX3RpbWUgPSB2cy0+aW5pdGlhbF9wcm9nX2RhdGVfdGltZTsKKyAgICBkb3VibGUgKnByb2dfZGF0ZV90aW1lX3AgPSAoaGxzLT5mbGFncyAmIEhMU19QUk9HUkFNX0RBVEVfVElNRSkgPyAmcHJvZ19kYXRlX3RpbWUgOiBOVUxMOworICAgIGludCBieXRlcmFuZ2VfbW9kZSA9IChobHMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKSB8fCAoaGxzLT5tYXhfc2VnX3NpemUgPiAwKTsKKworICAgIGhscy0+dmVyc2lvbiA9IDM7CisgICAgaWYgKGJ5dGVyYW5nZV9tb2RlKSB7CisgICAgICAgIGhscy0+dmVyc2lvbiA9IDQ7CisgICAgICAgIHNlcXVlbmNlID0gMDsKKyAgICB9CisKKyAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19JTkRFUEVOREVOVF9TRUdNRU5UUykgeworICAgICAgICBobHMtPnZlcnNpb24gPSA2OworICAgIH0KKworICAgIGlmIChobHMtPnNlZ21lbnRfdHlwZSA9PSBTRUdNRU5UX1RZUEVfRk1QNCkgeworICAgICAgICBobHMtPnZlcnNpb24gPSA3OworICAgIH0KIAogICAgIGlmICghdXNlX3JlbmFtZSAmJiAhd2FybmVkX25vbl9maWxlKyspCi0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgdXNlIHJlbmFtZSBvbiBub24gZmlsZSBwcm90b2NvbCwgdGhpcyBtYXkgbGVhZCB0byByYWNlcyBhbmQgdGVtcG9yYXJseSBwYXJ0aWFsIGZpbGVzXG4iKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCB1c2UgcmVuYW1lIG9uIG5vbiBmaWxlIHByb3RvY29sLCB0aGlzIG1heSBsZWFkIHRvIHJhY2VzIGFuZCB0ZW1wb3JhcnkgcGFydGlhbCBmaWxlc1xuIik7CiAKLSAgICBzZXRfaHR0cF9vcHRpb25zKCZvcHRpb25zLCBobHMpOwotICAgIHNucHJpbnRmKHRlbXBfZmlsZW5hbWUsIHNpemVvZih0ZW1wX2ZpbGVuYW1lKSwgdXNlX3JlbmFtZSA/ICIlcy50bXAiIDogIiVzIiwgcy0+ZmlsZW5hbWUpOwotICAgIGlmICgocmV0ID0gcy0+aW9fb3BlbihzLCAmb3V0LCB0ZW1wX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwpKSA8IDApCisgICAgc2V0X2h0dHBfb3B0aW9ucyhzLCAmb3B0aW9ucywgaGxzKTsKKyAgICBzbnByaW50Zih0ZW1wX2ZpbGVuYW1lLCBzaXplb2YodGVtcF9maWxlbmFtZSksIHVzZV9yZW5hbWUgPyAiJXMudG1wIiA6ICIlcyIsIHZzLT5tM3U4X25hbWUpOworICAgIGlmICgocmV0ID0gaGxzZW5jX2lvX29wZW4ocywgJmhscy0+bTN1OF9vdXQsIHRlbXBfZmlsZW5hbWUsICZvcHRpb25zKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICBmb3IgKGVuID0gaGxzLT5zZWdtZW50czsgZW47IGVuID0gZW4tPm5leHQpIHsKLSAgICAgICAgaWYgKHRhcmdldF9kdXJhdGlvbiA8IGVuLT5kdXJhdGlvbikKLSAgICAgICAgICAgIHRhcmdldF9kdXJhdGlvbiA9IGNlaWwoZW4tPmR1cmF0aW9uKTsKKyAgICBmb3IgKGVuID0gdnMtPnNlZ21lbnRzOyBlbjsgZW4gPSBlbi0+bmV4dCkgeworICAgICAgICBpZiAodGFyZ2V0X2R1cmF0aW9uIDw9IGVuLT5kdXJhdGlvbikKKyAgICAgICAgICAgIHRhcmdldF9kdXJhdGlvbiA9IGxyaW50KGVuLT5kdXJhdGlvbik7CiAgICAgfQogCi0gICAgaGxzLT5kaXNjb250aW51aXR5X3NldCA9IDA7Ci0gICAgYXZpb19wcmludGYob3V0LCAiI0VYVE0zVVxuIik7Ci0gICAgYXZpb19wcmludGYob3V0LCAiI0VYVC1YLVZFUlNJT046JWRcbiIsIHZlcnNpb24pOwotICAgIGlmIChobHMtPmFsbG93Y2FjaGUgPT0gMCB8fCBobHMtPmFsbG93Y2FjaGUgPT0gMSkgewotICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIjRVhULVgtQUxMT1ctQ0FDSEU6JXNcbiIsIGhscy0+YWxsb3djYWNoZSA9PSAwID8gIk5PIiA6ICJZRVMiKTsKLSAgICB9Ci0gICAgYXZpb19wcmludGYob3V0LCAiI0VYVC1YLVRBUkdFVERVUkFUSU9OOiVkXG4iLCB0YXJnZXRfZHVyYXRpb24pOwotICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFQtWC1NRURJQS1TRVFVRU5DRTolIlBSSWQ2NCJcbiIsIHNlcXVlbmNlKTsKKyAgICB2cy0+ZGlzY29udGludWl0eV9zZXQgPSAwOworICAgIGZmX2hsc193cml0ZV9wbGF5bGlzdF9oZWFkZXIoaGxzLT5tM3U4X291dCwgaGxzLT52ZXJzaW9uLCBobHMtPmFsbG93Y2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZHVyYXRpb24sIHNlcXVlbmNlLCBobHMtPnBsX3R5cGUpOwogCi0gICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiRVhULVgtTUVESUEtU0VRVUVOQ0U6JSJQUklkNjQiXG4iLAotICAgICAgICAgICBzZXF1ZW5jZSk7Ci0gICAgaWYoKGhscy0+ZmxhZ3MgJiBITFNfRElTQ09OVF9TVEFSVCkgJiYgc2VxdWVuY2U9PWhscy0+c3RhcnRfc2VxdWVuY2UgJiYgaGxzLT5kaXNjb250aW51aXR5X3NldD09MCApewotICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIjRVhULVgtRElTQ09OVElOVUlUWVxuIik7Ci0gICAgICAgIGhscy0+ZGlzY29udGludWl0eV9zZXQgPSAxOworICAgIGlmKChobHMtPmZsYWdzICYgSExTX0RJU0NPTlRfU1RBUlQpICYmIHNlcXVlbmNlPT1obHMtPnN0YXJ0X3NlcXVlbmNlICYmIHZzLT5kaXNjb250aW51aXR5X3NldD09MCApeworICAgICAgICBhdmlvX3ByaW50ZihobHMtPm0zdThfb3V0LCAiI0VYVC1YLURJU0NPTlRJTlVJVFlcbiIpOworICAgICAgICB2cy0+ZGlzY29udGludWl0eV9zZXQgPSAxOwogICAgIH0KLSAgICBmb3IgKGVuID0gaGxzLT5zZWdtZW50czsgZW47IGVuID0gZW4tPm5leHQpIHsKLSAgICAgICAgaWYgKGhscy0+a2V5X2luZm9fZmlsZSAmJiAoIWtleV91cmkgfHwgc3RyY21wKGVuLT5rZXlfdXJpLCBrZXlfdXJpKSB8fAorICAgIGlmICh2cy0+aGFzX3ZpZGVvICYmIChobHMtPmZsYWdzICYgSExTX0lOREVQRU5ERU5UX1NFR01FTlRTKSkgeworICAgICAgICBhdmlvX3ByaW50ZihobHMtPm0zdThfb3V0LCAiI0VYVC1YLUlOREVQRU5ERU5ULVNFR01FTlRTXG4iKTsKKyAgICB9CisgICAgZm9yIChlbiA9IHZzLT5zZWdtZW50czsgZW47IGVuID0gZW4tPm5leHQpIHsKKyAgICAgICAgaWYgKChobHMtPmVuY3J5cHQgfHwgaGxzLT5rZXlfaW5mb19maWxlKSAmJiAoIWtleV91cmkgfHwgc3RyY21wKGVuLT5rZXlfdXJpLCBrZXlfdXJpKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfc3RyY2FzZWNtcChlbi0+aXZfc3RyaW5nLCBpdl9zdHJpbmcpKSkgewotICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiI0VYVC1YLUtFWTpNRVRIT0Q9QUVTLTEyOCxVUkk9XCIlc1wiIiwgZW4tPmtleV91cmkpOworICAgICAgICAgICAgYXZpb19wcmludGYoaGxzLT5tM3U4X291dCwgIiNFWFQtWC1LRVk6TUVUSE9EPUFFUy0xMjgsVVJJPVwiJXNcIiIsIGVuLT5rZXlfdXJpKTsKICAgICAgICAgICAgIGlmICgqZW4tPml2X3N0cmluZykKLSAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIsSVY9MHglcyIsIGVuLT5pdl9zdHJpbmcpOwotICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiXG4iKTsKKyAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihobHMtPm0zdThfb3V0LCAiLElWPTB4JXMiLCBlbi0+aXZfc3RyaW5nKTsKKyAgICAgICAgICAgIGF2aW9fcHJpbnRmKGhscy0+bTN1OF9vdXQsICJcbiIpOwogICAgICAgICAgICAga2V5X3VyaSA9IGVuLT5rZXlfdXJpOwogICAgICAgICAgICAgaXZfc3RyaW5nID0gZW4tPml2X3N0cmluZzsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChobHMtPmZsYWdzICYgSExTX1JPVU5EX0RVUkFUSU9OUykKLSAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFRJTkY6JWxkLFxuIiwgIGxyaW50KGVuLT5kdXJhdGlvbikpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIjRVhUSU5GOiVmLFxuIiwgZW4tPmR1cmF0aW9uKTsKLSAgICAgICAgaWYgKGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUpCi0gICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiI0VYVC1YLUJZVEVSQU5HRTolIlBSSWk2NCJAJSJQUklpNjQiXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVuLT5zaXplLCBlbi0+cG9zKTsKLSAgICAgICAgaWYgKGhscy0+YmFzZXVybCkKLSAgICAgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIiVzIiwgaGxzLT5iYXNldXJsKTsKLSAgICAgICAgYXZpb19wcmludGYob3V0LCAiJXNcbiIsIGVuLT5maWxlbmFtZSk7CisgICAgICAgIGlmICgoaGxzLT5zZWdtZW50X3R5cGUgPT0gU0VHTUVOVF9UWVBFX0ZNUDQpICYmIChlbiA9PSB2cy0+c2VnbWVudHMpKSB7CisgICAgICAgICAgICBmZl9obHNfd3JpdGVfaW5pdF9maWxlKGhscy0+bTN1OF9vdXQsIChobHMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKSA/IGVuLT5maWxlbmFtZSA6IHZzLT5mbXA0X2luaXRfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUsIHZzLT5pbml0X3JhbmdlX2xlbmd0aCwgMCk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBmZl9obHNfd3JpdGVfZmlsZV9lbnRyeShobHMtPm0zdThfb3V0LCBlbi0+ZGlzY29udCwgYnl0ZXJhbmdlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuLT5kdXJhdGlvbiwgaGxzLT5mbGFncyAmIEhMU19ST1VORF9EVVJBVElPTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuLT5zaXplLCBlbi0+cG9zLCB2cy0+YmFzZXVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW4tPmZpbGVuYW1lLCBwcm9nX2RhdGVfdGltZV9wKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImZmX2hsc193cml0ZV9maWxlX2VudHJ5IGdldCBlcnJvclxuIik7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobGFzdCAmJiAoaGxzLT5mbGFncyAmIEhMU19PTUlUX0VORExJU1QpPT0wKQotICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIjRVhULVgtRU5ETElTVFxuIik7CisgICAgICAgIGZmX2hsc193cml0ZV9lbmRfbGlzdChobHMtPm0zdThfb3V0KTsKIAotICAgIGlmKCBobHMtPnZ0dF9tM3U4X25hbWUgKSB7Ci0gICAgICAgIGlmICgocmV0ID0gcy0+aW9fb3BlbihzLCAmc3ViX291dCwgaGxzLT52dHRfbTN1OF9uYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZvcHRpb25zKSkgPCAwKQorICAgIGlmKCB2cy0+dnR0X20zdThfbmFtZSApIHsKKyAgICAgICAgaWYgKChyZXQgPSBobHNlbmNfaW9fb3BlbihzLCAmaGxzLT5zdWJfbTN1OF9vdXQsIHZzLT52dHRfbTN1OF9uYW1lLCAmb3B0aW9ucykpIDwgMCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgYXZpb19wcmludGYoc3ViX291dCwgIiNFWFRNM1VcbiIpOwotICAgICAgICBhdmlvX3ByaW50ZihzdWJfb3V0LCAiI0VYVC1YLVZFUlNJT046JWRcbiIsIHZlcnNpb24pOwotICAgICAgICBpZiAoaGxzLT5hbGxvd2NhY2hlID09IDAgfHwgaGxzLT5hbGxvd2NhY2hlID09IDEpIHsKLSAgICAgICAgICAgIGF2aW9fcHJpbnRmKHN1Yl9vdXQsICIjRVhULVgtQUxMT1ctQ0FDSEU6JXNcbiIsIGhscy0+YWxsb3djYWNoZSA9PSAwID8gIk5PIiA6ICJZRVMiKTsKLSAgICAgICAgfQotICAgICAgICBhdmlvX3ByaW50ZihzdWJfb3V0LCAiI0VYVC1YLVRBUkdFVERVUkFUSU9OOiVkXG4iLCB0YXJnZXRfZHVyYXRpb24pOwotICAgICAgICBhdmlvX3ByaW50ZihzdWJfb3V0LCAiI0VYVC1YLU1FRElBLVNFUVVFTkNFOiUiUFJJZDY0IlxuIiwgc2VxdWVuY2UpOwotCi0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIkVYVC1YLU1FRElBLVNFUVVFTkNFOiUiUFJJZDY0IlxuIiwKLSAgICAgICAgICAgICAgIHNlcXVlbmNlKTsKLQotICAgICAgICBmb3IgKGVuID0gaGxzLT5zZWdtZW50czsgZW47IGVuID0gZW4tPm5leHQpIHsKLSAgICAgICAgICAgIGF2aW9fcHJpbnRmKHN1Yl9vdXQsICIjRVhUSU5GOiVmLFxuIiwgZW4tPmR1cmF0aW9uKTsKLSAgICAgICAgICAgIGlmIChobHMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKQotICAgICAgICAgICAgICAgICBhdmlvX3ByaW50ZihzdWJfb3V0LCAiI0VYVC1YLUJZVEVSQU5HRTolIlBSSWk2NCJAJSJQUklpNjQiXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVuLT5zaXplLCBlbi0+cG9zKTsKLSAgICAgICAgICAgIGlmIChobHMtPmJhc2V1cmwpCi0gICAgICAgICAgICAgICAgYXZpb19wcmludGYoc3ViX291dCwgIiVzIiwgaGxzLT5iYXNldXJsKTsKLSAgICAgICAgICAgIGF2aW9fcHJpbnRmKHN1Yl9vdXQsICIlc1xuIiwgZW4tPnN1Yl9maWxlbmFtZSk7CisgICAgICAgIGZmX2hsc193cml0ZV9wbGF5bGlzdF9oZWFkZXIoaGxzLT5zdWJfbTN1OF9vdXQsIGhscy0+dmVyc2lvbiwgaGxzLT5hbGxvd2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9kdXJhdGlvbiwgc2VxdWVuY2UsIFBMQVlMSVNUX1RZUEVfTk9ORSk7CisgICAgICAgIGZvciAoZW4gPSB2cy0+c2VnbWVudHM7IGVuOyBlbiA9IGVuLT5uZXh0KSB7CisgICAgICAgICAgICByZXQgPSBmZl9obHNfd3JpdGVfZmlsZV9lbnRyeShobHMtPnN1Yl9tM3U4X291dCwgMCwgYnl0ZXJhbmdlX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbi0+ZHVyYXRpb24sIDAsIGVuLT5zaXplLCBlbi0+cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnMtPmJhc2V1cmwsIGVuLT5zdWJfZmlsZW5hbWUsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJmZl9obHNfd3JpdGVfZmlsZV9lbnRyeSBnZXQgZXJyb3JcbiIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKGxhc3QpCi0gICAgICAgICAgICBhdmlvX3ByaW50ZihzdWJfb3V0LCAiI0VYVC1YLUVORExJU1RcbiIpOworICAgICAgICAgICAgZmZfaGxzX3dyaXRlX2VuZF9saXN0KGhscy0+c3ViX20zdThfb3V0KTsKIAogICAgIH0KIAogZmFpbDoKICAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOwotICAgIGZmX2Zvcm1hdF9pb19jbG9zZShzLCAmb3V0KTsKLSAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJnN1Yl9vdXQpOworICAgIGhsc2VuY19pb19jbG9zZShzLCAmaGxzLT5tM3U4X291dCwgdGVtcF9maWxlbmFtZSk7CisgICAgaGxzZW5jX2lvX2Nsb3NlKHMsICZobHMtPnN1Yl9tM3U4X291dCwgdnMtPnZ0dF9tM3U4X25hbWUpOwogICAgIGlmIChyZXQgPj0gMCAmJiB1c2VfcmVuYW1lKQotICAgICAgICBmZl9yZW5hbWUodGVtcF9maWxlbmFtZSwgcy0+ZmlsZW5hbWUsIHMpOworICAgICAgICBmZl9yZW5hbWUodGVtcF9maWxlbmFtZSwgdnMtPm0zdThfbmFtZSwgcyk7CisKKyAgICBpZiAocmV0ID49IDAgJiYgaGxzLT5tYXN0ZXJfcGxfbmFtZSkKKyAgICAgICAgaWYgKGNyZWF0ZV9tYXN0ZXJfcGxheWxpc3QocywgdnMpIDwgMCkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk1hc3RlciBwbGF5bGlzdCBjcmVhdGlvbiBmYWlsZWRcbiIpOworCiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBobHNfc3RhcnQoQVZGb3JtYXRDb250ZXh0ICpzKQorc3RhdGljIGludCBobHNfc3RhcnQoQVZGb3JtYXRDb250ZXh0ICpzLCBWYXJpYW50U3RyZWFtICp2cykKIHsKICAgICBITFNDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwotICAgIEFWRm9ybWF0Q29udGV4dCAqb2MgPSBjLT5hdmY7Ci0gICAgQVZGb3JtYXRDb250ZXh0ICp2dHRfb2MgPSBjLT52dHRfYXZmOworICAgIEFWRm9ybWF0Q29udGV4dCAqb2MgPSB2cy0+YXZmOworICAgIEFWRm9ybWF0Q29udGV4dCAqdnR0X29jID0gdnMtPnZ0dF9hdmY7CiAgICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zID0gTlVMTDsKICAgICBjaGFyICpmaWxlbmFtZSwgaXZfc3RyaW5nW0tFWVNJWkUqMiArIDFdOwogICAgIGludCBlcnIgPSAwOwogCiAgICAgaWYgKGMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKSB7Ci0gICAgICAgIGF2X3N0cmxjcHkob2MtPmZpbGVuYW1lLCBjLT5iYXNlbmFtZSwKLSAgICAgICAgICAgICAgICAgICBzaXplb2Yob2MtPmZpbGVuYW1lKSk7Ci0gICAgICAgIGlmIChjLT52dHRfYmFzZW5hbWUpCi0gICAgICAgICAgICBhdl9zdHJsY3B5KHZ0dF9vYy0+ZmlsZW5hbWUsIGMtPnZ0dF9iYXNlbmFtZSwKLSAgICAgICAgICAgICAgICAgIHNpemVvZih2dHRfb2MtPmZpbGVuYW1lKSk7CisgICAgICAgIGNoYXIgKm5ld19uYW1lID0gYXZfc3RyZHVwKHZzLT5iYXNlbmFtZSk7CisgICAgICAgIGlmICghbmV3X25hbWUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBmZl9mb3JtYXRfc2V0X3VybChvYywgbmV3X25hbWUpOworICAgICAgICBpZiAodnMtPnZ0dF9iYXNlbmFtZSkgeworICAgICAgICAgICAgbmV3X25hbWUgPSBhdl9zdHJkdXAodnMtPnZ0dF9iYXNlbmFtZSk7CisgICAgICAgICAgICBpZiAoIW5ld19uYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBmZl9mb3JtYXRfc2V0X3VybCh2dHRfb2MsIG5ld19uYW1lKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYy0+bWF4X3NlZ19zaXplID4gMCkgeworICAgICAgICBjaGFyICpmaWxlbmFtZSA9IE5VTEw7CisgICAgICAgIGlmIChyZXBsYWNlX2ludF9kYXRhX2luX2ZpbGVuYW1lKCZmaWxlbmFtZSwKKyNpZiBGRl9BUElfSExTX1dSQVAKKyAgICAgICAgICAgIHZzLT5iYXNlbmFtZSwgJ2QnLCBjLT53cmFwID8gdnMtPnNlcXVlbmNlICUgYy0+d3JhcCA6IHZzLT5zZXF1ZW5jZSkgPCAxKSB7CisjZWxzZQorICAgICAgICAgICAgdnMtPmJhc2VuYW1lLCAnZCcsIHZzLT5zZXF1ZW5jZSkgPCAxKSB7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2VnbWVudCBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnLCB5b3UgY2FuIHRyeSB0byB1c2UgLXVzZV9sb2NhbHRpbWUgMSB3aXRoIGl0XG4iLCB2cy0+YmFzZW5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICAgICAgZmZfZm9ybWF0X3NldF91cmwob2MsIGZpbGVuYW1lKTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoYy0+dXNlX2xvY2FsdGltZSkgewogICAgICAgICAgICAgdGltZV90IG5vdzA7CiAgICAgICAgICAgICBzdHJ1Y3QgdG0gKnRtLCB0bXBidWY7CisgICAgICAgICAgICBpbnQgYnVmc2l6ZSA9IHN0cmxlbih2cy0+YmFzZW5hbWUpICsgMTAyNDsKKyAgICAgICAgICAgIGNoYXIgKmJ1ZiA9IGF2X21hbGxvY3ooYnVmc2l6ZSk7CisgICAgICAgICAgICBpZiAoIWJ1ZikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgdGltZSgmbm93MCk7CiAgICAgICAgICAgICB0bSA9IGxvY2FsdGltZV9yKCZub3cwLCAmdG1wYnVmKTsKLSAgICAgICAgICAgIGlmICghc3RyZnRpbWUob2MtPmZpbGVuYW1lLCBzaXplb2Yob2MtPmZpbGVuYW1lKSwgYy0+YmFzZW5hbWUsIHRtKSkgeworICAgICAgICAgICAgZmZfZm9ybWF0X3NldF91cmwob2MsIGJ1Zik7CisgICAgICAgICAgICBpZiAoIXN0cmZ0aW1lKG9jLT51cmwsIGJ1ZnNpemUsIHZzLT5iYXNlbmFtZSwgdG0pKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKG9jLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZ2V0IHNlZ21lbnQgZmlsZW5hbWUgd2l0aCB1c2VfbG9jYWx0aW1lXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQotICAgICAgIH0gZWxzZSBpZiAoYXZfZ2V0X2ZyYW1lX2ZpbGVuYW1lKG9jLT5maWxlbmFtZSwgc2l6ZW9mKG9jLT5maWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+YmFzZW5hbWUsIGMtPndyYXAgPyBjLT5zZXF1ZW5jZSAlIGMtPndyYXAgOiBjLT5zZXF1ZW5jZSkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2VnbWVudCBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnIHlvdSBjYW4gdHJ5IHVzZSAtdXNlX2xvY2FsdGltZSAxIHdpdGggaXRcbiIsIGMtPmJhc2VuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYoIGMtPnZ0dF9iYXNlbmFtZSkgewotICAgICAgICAgICAgaWYgKGF2X2dldF9mcmFtZV9maWxlbmFtZSh2dHRfb2MtPmZpbGVuYW1lLCBzaXplb2YodnR0X29jLT5maWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT52dHRfYmFzZW5hbWUsIGMtPndyYXAgPyBjLT5zZXF1ZW5jZSAlIGMtPndyYXAgOiBjLT5zZXF1ZW5jZSkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHZ0dF9vYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzZWdtZW50IGZpbGVuYW1lIHRlbXBsYXRlICclcydcbiIsIGMtPnZ0dF9iYXNlbmFtZSk7CisKKyAgICAgICAgICAgIGVyciA9IHNsc19mbGFnX3VzZV9sb2NhbHRpbWVfZmlsZW5hbWUob2MsIGMsIHZzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGMtPnVzZV9sb2NhbHRpbWVfbWtkaXIpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkaXI7CisgICAgICAgICAgICAgICAgY2hhciAqZm5fY29weSA9IGF2X3N0cmR1cChvYy0+dXJsKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZuX2NvcHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGlyID0gYXZfZGlybmFtZShmbl9jb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAobWtkaXJfcChkaXIpID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgZGlyZWN0b3J5ICVzIHdpdGggdXNlX2xvY2FsdGltZV9ta2RpclxuIiwgZGlyKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShmbl9jb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdl9mcmVlKGZuX2NvcHkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciAqZmlsZW5hbWUgPSBOVUxMOworICAgICAgICAgICAgaWYgKHJlcGxhY2VfaW50X2RhdGFfaW5fZmlsZW5hbWUoJmZpbGVuYW1lLAorI2lmIEZGX0FQSV9ITFNfV1JBUAorICAgICAgICAgICAgICAgICAgIHZzLT5iYXNlbmFtZSwgJ2QnLCBjLT53cmFwID8gdnMtPnNlcXVlbmNlICUgYy0+d3JhcCA6IHZzLT5zZXF1ZW5jZSkgPCAxKSB7CisjZWxzZQorICAgICAgICAgICAgICAgICAgIHZzLT5iYXNlbmFtZSwgJ2QnLCB2cy0+c2VxdWVuY2UpIDwgMSkgeworI2VuZGlmCisgICAgICAgICAgICAgICAgYXZfZnJlZShmaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgYXZfbG9nKG9jLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNlZ21lbnQgZmlsZW5hbWUgdGVtcGxhdGUgJyVzJyB5b3UgY2FuIHRyeSB0byB1c2UgLXVzZV9sb2NhbHRpbWUgMSB3aXRoIGl0XG4iLCB2cy0+YmFzZW5hbWUpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl9mb3JtYXRfc2V0X3VybChvYywgZmlsZW5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmKCB2cy0+dnR0X2Jhc2VuYW1lKSB7CisgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSA9IE5VTEw7CisgICAgICAgICAgICBpZiAocmVwbGFjZV9pbnRfZGF0YV9pbl9maWxlbmFtZSgmZmlsZW5hbWUsCisjaWYgRkZfQVBJX0hMU19XUkFQCisgICAgICAgICAgICAgICAgdnMtPnZ0dF9iYXNlbmFtZSwgJ2QnLCBjLT53cmFwID8gdnMtPnNlcXVlbmNlICUgYy0+d3JhcCA6IHZzLT5zZXF1ZW5jZSkgPCAxKSB7CisjZWxzZQorICAgICAgICAgICAgICAgIHZzLT52dHRfYmFzZW5hbWUsICdkJywgdnMtPnNlcXVlbmNlKSA8IDEpIHsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGF2X2ZyZWUoZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIGF2X2xvZyh2dHRfb2MsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2VnbWVudCBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnXG4iLCB2cy0+dnR0X2Jhc2VuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmZfZm9ybWF0X3NldF91cmwodnR0X29jLCBmaWxlbmFtZSk7CiAgICAgICAgfQogICAgIH0KLSAgICBjLT5udW1iZXIrKzsKKyAgICB2cy0+bnVtYmVyKys7CiAKLSAgICBzZXRfaHR0cF9vcHRpb25zKCZvcHRpb25zLCBjKTsKKyAgICBzZXRfaHR0cF9vcHRpb25zKHMsICZvcHRpb25zLCBjKTsKIAotICAgIGlmIChjLT5rZXlfaW5mb19maWxlKSB7Ci0gICAgICAgIGlmICgoZXJyID0gaGxzX2VuY3J5cHRpb25fc3RhcnQocykpIDwgMCkKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoYy0+ZmxhZ3MgJiBITFNfVEVNUF9GSUxFKSB7CisgICAgICAgIGNoYXIgKm5ld19uYW1lID0gYXZfYXNwcmludGYoIiVzLnRtcCIsIG9jLT51cmwpOworICAgICAgICBpZiAoIW5ld19uYW1lKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZmZfZm9ybWF0X3NldF91cmwob2MsIG5ld19uYW1lKTsKKyAgICB9CisKKyAgICBpZiAoYy0+a2V5X2luZm9fZmlsZSB8fCBjLT5lbmNyeXB0KSB7CisgICAgICAgIGlmIChjLT5zZWdtZW50X3R5cGUgPT0gU0VHTUVOVF9UWVBFX0ZNUDQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFbmNyeXB0ZWQgZm1wNCBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYy0+a2V5X2luZm9fZmlsZSAmJiBjLT5lbmNyeXB0KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJDYW5ub3QgdXNlIGJvdGggLWhsc19rZXlfaW5mb19maWxlIGFuZCAtaGxzX2VuYywiCisgICAgICAgICAgICAgICAgICAiIGlnbm9yaW5nIC1obHNfZW5jXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYy0+ZW5jcnlwdF9zdGFydGVkIHx8IChjLT5mbGFncyAmIEhMU19QRVJJT0RJQ19SRUtFWSkpIHsKKyAgICAgICAgICAgIGlmIChjLT5rZXlfaW5mb19maWxlKSB7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBobHNfZW5jcnlwdGlvbl9zdGFydChzKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoZXJyID0gZG9fZW5jcnlwdChzLCB2cykpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYy0+ZW5jcnlwdF9zdGFydGVkID0gMTsKKyAgICAgICAgfQogICAgICAgICBpZiAoKGVyciA9IGF2X2RpY3Rfc2V0KCZvcHRpb25zLCAiZW5jcnlwdGlvbl9rZXkiLCBjLT5rZXlfc3RyaW5nLCAwKSkKICAgICAgICAgICAgICAgICA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIGVyciA9IGF2X3N0cmxjcHkoaXZfc3RyaW5nLCBjLT5pdl9zdHJpbmcsIHNpemVvZihpdl9zdHJpbmcpKTsKICAgICAgICAgaWYgKCFlcnIpCi0gICAgICAgICAgICBzbnByaW50Zihpdl9zdHJpbmcsIHNpemVvZihpdl9zdHJpbmcpLCAiJTAzMiJQUkl4NjQsIGMtPnNlcXVlbmNlKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGl2X3N0cmluZywgc2l6ZW9mKGl2X3N0cmluZyksICIlMDMyIlBSSXg2NCwgdnMtPnNlcXVlbmNlKTsKICAgICAgICAgaWYgKChlcnIgPSBhdl9kaWN0X3NldCgmb3B0aW9ucywgImVuY3J5cHRpb25faXYiLCBpdl9zdHJpbmcsIDApKSA8IDApCiAgICAgICAgICAgIGdvdG8gZmFpbDsKIAotICAgICAgICBmaWxlbmFtZSA9IGF2X2FzcHJpbnRmKCJjcnlwdG86JXMiLCBvYy0+ZmlsZW5hbWUpOworICAgICAgICBmaWxlbmFtZSA9IGF2X2FzcHJpbnRmKCJjcnlwdG86JXMiLCBvYy0+dXJsKTsKICAgICAgICAgaWYgKCFmaWxlbmFtZSkgewogICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9Ci0gICAgICAgIGVyciA9IHMtPmlvX29wZW4ocywgJm9jLT5wYiwgZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwgJm9wdGlvbnMpOworICAgICAgICBlcnIgPSBobHNlbmNfaW9fb3BlbihzLCAmb2MtPnBiLCBmaWxlbmFtZSwgJm9wdGlvbnMpOwogICAgICAgICBhdl9mcmVlKGZpbGVuYW1lKTsKICAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKICAgICAgICAgaWYgKGVyciA8IDApCiAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgIH0gZWxzZQotICAgICAgICBpZiAoKGVyciA9IHMtPmlvX29wZW4ocywgJm9jLT5wYiwgb2MtPmZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZvcHRpb25zKSkgPCAwKQorICAgIH0gZWxzZSBpZiAoYy0+c2VnbWVudF90eXBlICE9IFNFR01FTlRfVFlQRV9GTVA0KSB7CisgICAgICAgIGlmICgoZXJyID0gaGxzZW5jX2lvX29wZW4ocywgJm9jLT5wYiwgb2MtPnVybCwgJm9wdGlvbnMpKSA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgaWYgKGMtPnZ0dF9iYXNlbmFtZSkgewotICAgICAgICBzZXRfaHR0cF9vcHRpb25zKCZvcHRpb25zLCBjKTsKLSAgICAgICAgaWYgKChlcnIgPSBzLT5pb19vcGVuKHMsICZ2dHRfb2MtPnBiLCB2dHRfb2MtPmZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZvcHRpb25zKSkgPCAwKQorICAgIH0KKyAgICBpZiAodnMtPnZ0dF9iYXNlbmFtZSkgeworICAgICAgICBzZXRfaHR0cF9vcHRpb25zKHMsICZvcHRpb25zLCBjKTsKKyAgICAgICAgaWYgKChlcnIgPSBobHNlbmNfaW9fb3BlbihzLCAmdnR0X29jLT5wYiwgdnR0X29jLT51cmwsICZvcHRpb25zKSkgPCAwKQogICAgICAgICAgICAgZ290byBmYWlsOwogICAgIH0KICAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOwogCi0gICAgLyogV2Ugb25seSByZXF1aXJlIG9uZSBQQVQvUE1UIHBlciBzZWdtZW50LiAqLwotICAgIGlmIChvYy0+b2Zvcm1hdC0+cHJpdl9jbGFzcyAmJiBvYy0+cHJpdl9kYXRhKSB7Ci0gICAgICAgIGNoYXIgcGVyaW9kWzIxXTsKKyAgICBpZiAoYy0+c2VnbWVudF90eXBlICE9IFNFR01FTlRfVFlQRV9GTVA0KSB7CisgICAgICAgIC8qIFdlIG9ubHkgcmVxdWlyZSBvbmUgUEFUL1BNVCBwZXIgc2VnbWVudC4gKi8KKyAgICAgICAgaWYgKG9jLT5vZm9ybWF0LT5wcml2X2NsYXNzICYmIG9jLT5wcml2X2RhdGEpIHsKKyAgICAgICAgICAgIGNoYXIgcGVyaW9kWzIxXTsKIAotICAgICAgICBzbnByaW50ZihwZXJpb2QsIHNpemVvZihwZXJpb2QpLCAiJWQiLCAoSU5UX01BWCAvIDIpIC0gMSk7CisgICAgICAgICAgICBzbnByaW50ZihwZXJpb2QsIHNpemVvZihwZXJpb2QpLCAiJWQiLCAoSU5UX01BWCAvIDIpIC0gMSk7CiAKLSAgICAgICAgYXZfb3B0X3NldChvYy0+cHJpdl9kYXRhLCAibXBlZ3RzX2ZsYWdzIiwgInJlc2VuZF9oZWFkZXJzIiwgMCk7Ci0gICAgICAgIGF2X29wdF9zZXQob2MtPnByaXZfZGF0YSwgInNkdF9wZXJpb2QiLCBwZXJpb2QsIDApOwotICAgICAgICBhdl9vcHRfc2V0KG9jLT5wcml2X2RhdGEsICJwYXRfcGVyaW9kIiwgcGVyaW9kLCAwKTsKKyAgICAgICAgICAgIGF2X29wdF9zZXQob2MtPnByaXZfZGF0YSwgIm1wZWd0c19mbGFncyIsICJyZXNlbmRfaGVhZGVycyIsIDApOworICAgICAgICAgICAgYXZfb3B0X3NldChvYy0+cHJpdl9kYXRhLCAic2R0X3BlcmlvZCIsIHBlcmlvZCwgMCk7CisgICAgICAgICAgICBhdl9vcHRfc2V0KG9jLT5wcml2X2RhdGEsICJwYXRfcGVyaW9kIiwgcGVyaW9kLCAwKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChjLT52dHRfYmFzZW5hbWUpIHsKKyAgICBpZiAodnMtPnZ0dF9iYXNlbmFtZSkgewogICAgICAgICBlcnIgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIodnR0X29jLE5VTEwpOwogICAgICAgICBpZiAoZXJyIDwgMCkKICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC01ODEsMTU5ICsxNjY3LDQ3MSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgaGxzX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCitzdGF0aWMgY29uc3QgY2hhciAqIGdldF9kZWZhdWx0X3BhdHRlcm5fbG9jYWx0aW1lX2ZtdChBVkZvcm1hdENvbnRleHQgKnMpCiB7CisgICAgY2hhciBiWzIxXTsKKyAgICB0aW1lX3QgdCA9IHRpbWUoTlVMTCk7CisgICAgc3RydWN0IHRtICpwLCB0bWJ1ZjsKICAgICBITFNDb250ZXh0ICpobHMgPSBzLT5wcml2X2RhdGE7Ci0gICAgaW50IHJldCwgaTsKKworICAgIHAgPSBsb2NhbHRpbWVfcigmdCwgJnRtYnVmKTsKKyAgICAvLyBubyAlcyBzdXBwb3J0IHdoZW4gc3RyZnRpbWUgcmV0dXJuZWQgZXJyb3Igb3IgbGVmdCBmb3JtYXQgc3RyaW5nIHVuY2hhbmdlZAorICAgIC8vIGFsc28gbm8gJXMgc3VwcG9ydCBvbiBNU1ZDLCB3aGljaCBpbnZva2VzIHRoZSBpbnZhbGlkIHBhcmFtZXRlciBoYW5kbGVyIG9uIHVuc3VwcG9ydGVkIGZvcm1hdCBzdHJpbmdzLCBpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvcgorICAgIGlmIChobHMtPnNlZ21lbnRfdHlwZSA9PSBTRUdNRU5UX1RZUEVfRk1QNCkgeworICAgICAgICByZXR1cm4gKEhBVkVfTElCQ19NU1ZDUlQgfHwgIXN0cmZ0aW1lKGIsIHNpemVvZihiKSwgIiVzIiwgcCkgfHwgIXN0cmNtcChiLCAiJXMiKSkgPyAiLSVZJW0lZCVIJU0lUy5tNHMiIDogIi0lcy5tNHMiOworICAgIH0KKyAgICByZXR1cm4gKEhBVkVfTElCQ19NU1ZDUlQgfHwgIXN0cmZ0aW1lKGIsIHNpemVvZihiKSwgIiVzIiwgcCkgfHwgIXN0cmNtcChiLCAiJXMiKSkgPyAiLSVZJW0lZCVIJU0lUy50cyIgOiAiLSVzLnRzIjsKK30KKworc3RhdGljIGludCBhcHBlbmRfcG9zdGZpeChjaGFyICpuYW1lLCBpbnQgbmFtZV9idWZfbGVuLCBpbnQgaSkKK3sKICAgICBjaGFyICpwOwotICAgIGNvbnN0IGNoYXIgKnBhdHRlcm4gPSAiJWQudHMiOwotICAgIGNvbnN0IGNoYXIgKnBhdHRlcm5fbG9jYWx0aW1lX2ZtdCA9ICItJXMudHMiOwotICAgIGNvbnN0IGNoYXIgKnZ0dF9wYXR0ZXJuID0gIiVkLnZ0dCI7Ci0gICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zID0gTlVMTDsKLSAgICBpbnQgYmFzZW5hbWVfc2l6ZTsKLSAgICBpbnQgdnR0X2Jhc2VuYW1lX3NpemU7CisgICAgY2hhciBleHRlbnNpb25bMTBdID0geydcMCd9OwogCi0gICAgaGxzLT5zZXF1ZW5jZSAgICAgICA9IGhscy0+c3RhcnRfc2VxdWVuY2U7Ci0gICAgaGxzLT5yZWNvcmRpbmdfdGltZSA9IGhscy0+dGltZSAqIEFWX1RJTUVfQkFTRTsKLSAgICBobHMtPnN0YXJ0X3B0cyAgICAgID0gQVZfTk9QVFNfVkFMVUU7Ci0KLSAgICBpZiAoaGxzLT5mb3JtYXRfb3B0aW9uc19zdHIpIHsKLSAgICAgICAgcmV0ID0gYXZfZGljdF9wYXJzZV9zdHJpbmcoJmhscy0+Zm9ybWF0X29wdGlvbnMsIGhscy0+Zm9ybWF0X29wdGlvbnNfc3RyLCAiPSIsICI6IiwgMCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHBhcnNlIGZvcm1hdCBvcHRpb25zIGxpc3QgJyVzJ1xuIiwgaGxzLT5mb3JtYXRfb3B0aW9uc19zdHIpOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9CisgICAgcCA9IHN0cnJjaHIobmFtZSwgJy4nKTsKKyAgICBpZiAocCkgeworICAgICAgICBhdl9zdHJsY3B5KGV4dGVuc2lvbiwgcCwgc2l6ZW9mKGV4dGVuc2lvbikpOworICAgICAgICAqcCA9ICdcMCc7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBobHMtPmhhc192aWRlbyArPQotICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICBobHMtPmhhc19zdWJ0aXRsZSArPQotICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIH0KKyAgICBzbnByaW50ZihuYW1lICsgc3RybGVuKG5hbWUpLCBuYW1lX2J1Zl9sZW4gLSBzdHJsZW4obmFtZSksIFBPU1RGSVhfUEFUVEVSTiwgaSk7CiAKLSAgICBpZiAoaGxzLT5oYXNfdmlkZW8gPiAxKQotICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAiTW9yZSB0aGFuIGEgc2luZ2xlIHZpZGVvIHN0cmVhbSBwcmVzZW50LCAiCi0gICAgICAgICAgICAgICAiZXhwZWN0IGlzc3VlcyBkZWNvZGluZyBpdC5cbiIpOworICAgIGlmIChzdHJsZW4oZXh0ZW5zaW9uKSkKKyAgICAgICAgYXZfc3RybGNhdChuYW1lLCBleHRlbnNpb24sIG5hbWVfYnVmX2xlbik7CiAKLSAgICBobHMtPm9mb3JtYXQgPSBhdl9ndWVzc19mb3JtYXQoIm1wZWd0cyIsIE5VTEwsIE5VTEwpOworICAgIHJldHVybiAwOworfQogCi0gICAgaWYgKCFobHMtPm9mb3JtYXQpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9NVVhFUl9OT1RfRk9VTkQ7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9CitzdGF0aWMgaW50IHZhbGlkYXRlX25hbWUoaW50IG5iX3ZzLCBjb25zdCBjaGFyICpmbikKK3sKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSwgKnN1YmRpcl9uYW1lOworICAgIGNoYXIgKmZuX2R1cCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CiAKLSAgICBpZihobHMtPmhhc19zdWJ0aXRsZSkgewotICAgICAgICBobHMtPnZ0dF9vZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KCJ3ZWJ2dHQiLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgaWYgKCFobHMtPm9mb3JtYXQpIHsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGhscy0+c2VnbWVudF9maWxlbmFtZSkgewotICAgICAgICBobHMtPmJhc2VuYW1lID0gYXZfc3RyZHVwKGhscy0+c2VnbWVudF9maWxlbmFtZSk7Ci0gICAgICAgIGlmICghaGxzLT5iYXNlbmFtZSkgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUpCi0gICAgICAgICAgICBwYXR0ZXJuID0gIi50cyI7Ci0KLSAgICAgICAgaWYgKGhscy0+dXNlX2xvY2FsdGltZSkgewotICAgICAgICAgICAgYmFzZW5hbWVfc2l6ZSA9IHN0cmxlbihzLT5maWxlbmFtZSkgKyBzdHJsZW4ocGF0dGVybl9sb2NhbHRpbWVfZm10KSArIDE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBiYXNlbmFtZV9zaXplID0gc3RybGVuKHMtPmZpbGVuYW1lKSArIHN0cmxlbihwYXR0ZXJuKSArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaGxzLT5iYXNlbmFtZSA9IGF2X21hbGxvYyhiYXNlbmFtZV9zaXplKTsKLSAgICAgICAgaWYgKCFobHMtPmJhc2VuYW1lKSB7Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9zdHJsY3B5KGhscy0+YmFzZW5hbWUsIHMtPmZpbGVuYW1lLCBiYXNlbmFtZV9zaXplKTsKLQotICAgICAgICBwID0gc3RycmNocihobHMtPmJhc2VuYW1lLCAnLicpOwotICAgICAgICBpZiAocCkKLSAgICAgICAgICAgICpwID0gJ1wwJzsKLSAgICAgICAgaWYgKGhscy0+dXNlX2xvY2FsdGltZSkgewotICAgICAgICAgICAgYXZfc3RybGNhdChobHMtPmJhc2VuYW1lLCBwYXR0ZXJuX2xvY2FsdGltZV9mbXQsIGJhc2VuYW1lX3NpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZfc3RybGNhdChobHMtPmJhc2VuYW1lLCBwYXR0ZXJuLCBiYXNlbmFtZV9zaXplKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmKGhscy0+aGFzX3N1YnRpdGxlKSB7Ci0KLSAgICAgICAgaWYgKGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUpCi0gICAgICAgICAgICB2dHRfcGF0dGVybiA9ICIudnR0IjsKLSAgICAgICAgdnR0X2Jhc2VuYW1lX3NpemUgPSBzdHJsZW4ocy0+ZmlsZW5hbWUpICsgc3RybGVuKHZ0dF9wYXR0ZXJuKSArIDE7Ci0gICAgICAgIGhscy0+dnR0X2Jhc2VuYW1lID0gYXZfbWFsbG9jKHZ0dF9iYXNlbmFtZV9zaXplKTsKLSAgICAgICAgaWYgKCFobHMtPnZ0dF9iYXNlbmFtZSkgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIGhscy0+dnR0X20zdThfbmFtZSA9IGF2X21hbGxvYyh2dHRfYmFzZW5hbWVfc2l6ZSk7Ci0gICAgICAgIGlmICghaGxzLT52dHRfbTN1OF9uYW1lICkgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICB9Ci0gICAgICAgIGF2X3N0cmxjcHkoaGxzLT52dHRfYmFzZW5hbWUsIHMtPmZpbGVuYW1lLCB2dHRfYmFzZW5hbWVfc2l6ZSk7Ci0gICAgICAgIHAgPSBzdHJyY2hyKGhscy0+dnR0X2Jhc2VuYW1lLCAnLicpOwotICAgICAgICBpZiAocCkKLSAgICAgICAgICAgICpwID0gJ1wwJzsKLQotICAgICAgICBpZiggaGxzLT5zdWJ0aXRsZV9maWxlbmFtZSApIHsKLSAgICAgICAgICAgIHN0cmNweShobHMtPnZ0dF9tM3U4X25hbWUsIGhscy0+c3VidGl0bGVfZmlsZW5hbWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RyY3B5KGhscy0+dnR0X20zdThfbmFtZSwgaGxzLT52dHRfYmFzZW5hbWUpOwotICAgICAgICAgICAgYXZfc3RybGNhdChobHMtPnZ0dF9tM3U4X25hbWUsICJfdnR0Lm0zdTgiLCB2dHRfYmFzZW5hbWVfc2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfc3RybGNhdChobHMtPnZ0dF9iYXNlbmFtZSwgdnR0X3BhdHRlcm4sIHZ0dF9iYXNlbmFtZV9zaXplKTsKLSAgICB9Ci0KLSAgICBpZiAoKHJldCA9IGhsc19tdXhfaW5pdChzKSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBpZiAoKHJldCA9IGhsc19zdGFydChzKSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBhdl9kaWN0X2NvcHkoJm9wdGlvbnMsIGhscy0+Zm9ybWF0X29wdGlvbnMsIDApOwotICAgIHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihobHMtPmF2ZiwgJm9wdGlvbnMpOwotICAgIGlmIChhdl9kaWN0X2NvdW50KG9wdGlvbnMpKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTb21lIG9mIHByb3ZpZGVkIGZvcm1hdCBvcHRpb25zIGluICclcycgYXJlIG5vdCByZWNvZ25pemVkXG4iLCBobHMtPmZvcm1hdF9vcHRpb25zX3N0cik7CisgICAgaWYgKCFmbikgewogICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9Ci0gICAgLy9hdl9hc3NlcnQwKHMtPm5iX3N0cmVhbXMgPT0gaGxzLT5hdmYtPm5iX3N0cmVhbXMpOwotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKLSAgICAgICAgQVZTdHJlYW0gKmlubmVyX3N0OwotICAgICAgICBBVlN0cmVhbSAqb3V0ZXJfc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICBpZiAob3V0ZXJfc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKLSAgICAgICAgICAgIGlubmVyX3N0ID0gaGxzLT5hdmYtPnN0cmVhbXNbaV07Ci0gICAgICAgIGVsc2UgaWYgKGhscy0+dnR0X2F2ZikKLSAgICAgICAgICAgIGlubmVyX3N0ID0gaGxzLT52dHRfYXZmLT5zdHJlYW1zWzBdOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIFdlIGhhdmUgYSBzdWJ0aXRsZSBzdHJlYW0sIHdoZW4gdGhlIHVzZXIgZG9lcyBub3Qgd2FudCBvbmUgKi8KLSAgICAgICAgICAgIGlubmVyX3N0ID0gTlVMTDsKLSAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgZm5fZHVwID0gYXZfc3RyZHVwKGZuKTsKKyAgICBpZiAoIWZuX2R1cCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBmaWxlbmFtZSA9IGF2X2Jhc2VuYW1lKGZuKTsKKyAgICBzdWJkaXJfbmFtZSA9IGF2X2Rpcm5hbWUoZm5fZHVwKTsKKworICAgIGlmIChuYl92cyA+IDEgJiYgIWF2X3N0cmlzdHIoZmlsZW5hbWUsICIldiIpICYmICFhdl9zdHJpc3RyKHN1YmRpcl9uYW1lLCAiJXYiKSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTW9yZSB0aGFuIDEgdmFyaWFudCBzdHJlYW1zIGFyZSBwcmVzZW50LCAlJXYgaXMgZXhwZWN0ZWQgaW4gdGhlIGZpbGVuYW1lICVzXG4iLAorICAgICAgICAgICAgICAgIGZuKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGF2X3N0cmlzdHIoZmlsZW5hbWUsICIldiIpICYmIGF2X3N0cmlzdHIoc3ViZGlyX25hbWUsICIldiIpKSB7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlJXYgaXMgZXhwZWN0ZWQgZWl0aGVyIGluIGZpbGVuYW1lIG9yIGluIHRoZSBzdWItZGlyZWN0b3J5IG5hbWUgb2YgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgICAgICBmbik7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICBhdl9mcmVlcCgmZm5fZHVwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZvcm1hdF9uYW1lKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9sZW4sIGludCBpbmRleCkKK3sKKyAgICBjb25zdCBjaGFyICpwcm90bywgKmRpcjsKKyAgICBjaGFyICpvcmlnX2J1Zl9kdXAgPSBOVUxMLCAqbW9kX2J1ZiA9IE5VTEwsICptb2RfYnVmX2R1cCA9IE5VTEw7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIWF2X3N0cmlzdHIoYnVmLCAiJXYiKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIG9yaWdfYnVmX2R1cCA9IGF2X3N0cmR1cChidWYpOworICAgIGlmICghb3JpZ19idWZfZHVwKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChyZXBsYWNlX2ludF9kYXRhX2luX2ZpbGVuYW1lKCZtb2RfYnVmLCBvcmlnX2J1Zl9kdXAsICd2JywgaW5kZXgpIDwgMSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgYXZfc3RybGNweShidWYsIG1vZF9idWYsIGJ1Zl9sZW4pOworCisgICAgcHJvdG8gPSBhdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShvcmlnX2J1Zl9kdXApOworICAgIGRpciA9IGF2X2Rpcm5hbWUob3JpZ19idWZfZHVwKTsKKworICAgIC8qIGlmICV2IGlzIHByZXNlbnQgaW4gdGhlIGZpbGUncyBkaXJlY3RvcnksIGNyZWF0ZSBzdWItZGlyZWN0b3J5ICovCisgICAgaWYgKGF2X3N0cmlzdHIoZGlyLCAiJXYiKSAmJiBwcm90byAmJiAhc3RyY21wKHByb3RvLCAiZmlsZSIpKSB7CisgICAgICAgIG1vZF9idWZfZHVwID0gYXZfc3RyZHVwKGJ1Zik7CisgICAgICAgIGlmICghbW9kX2J1Zl9kdXApIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKG91dGVyX3N0LCBpbm5lcl9zdC0+cHRzX3dyYXBfYml0cywgaW5uZXJfc3QtPnRpbWVfYmFzZS5udW0sIGlubmVyX3N0LT50aW1lX2Jhc2UuZGVuKTsKKworICAgICAgICBkaXIgPSBhdl9kaXJuYW1lKG1vZF9idWZfZHVwKTsKKyAgICAgICAgaWYgKG1rZGlyX3AoZGlyKSA9PSAtMSAmJiBlcnJubyAhPSBFRVhJU1QpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCitmYWlsOgorICAgIGF2X2ZyZWVwKCZvcmlnX2J1Zl9kdXApOworICAgIGF2X2ZyZWVwKCZtb2RfYnVmX2R1cCk7CisgICAgYXZfZnJlZXAoJm1vZF9idWYpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X250aF9jb2RlY19zdHJlYW1faW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIGNvZGVjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1faWQpCit7CisgICAgdW5zaWduZWQgaW50IHN0cmVhbV9pbmRleCwgY250OworICAgIGlmIChzdHJlYW1faWQgPCAwIHx8IHN0cmVhbV9pZCA+IHMtPm5iX3N0cmVhbXMgLSAxKQorICAgICAgICByZXR1cm4gLTE7CisgICAgY250ID0gMDsKKyAgICBmb3IgKHN0cmVhbV9pbmRleCA9IDA7IHN0cmVhbV9pbmRleCA8IHMtPm5iX3N0cmVhbXM7IHN0cmVhbV9pbmRleCsrKSB7CisgICAgICAgIGlmIChzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IGNvZGVjX3R5cGUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGNudCA9PSBzdHJlYW1faWQpCisgICAgICAgICAgICByZXR1cm4gc3RyZWFtX2luZGV4OworICAgICAgICBjbnQrKzsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHBhcnNlX3ZhcmlhbnRfc3RyZWFtX21hcHN0cmluZyhBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOworICAgIFZhcmlhbnRTdHJlYW0gKnZzOworICAgIGludCBzdHJlYW1faW5kZXg7CisgICAgZW51bSBBVk1lZGlhVHlwZSBjb2RlY190eXBlOworICAgIGludCBuYl92YXJzdHJlYW1zLCBuYl9zdHJlYW1zOworICAgIGNoYXIgKnAsICpxLCAqc2F2ZXB0cjEsICpzYXZlcHRyMiwgKnZhcnN0ciwgKmtleXZhbDsKKyAgICBjb25zdCBjaGFyICp2YWw7CisKKyAgICAvKioKKyAgICAgKiBFeHBlY3RlZCBmb3JtYXQgZm9yIHZhcl9zdHJlYW1fbWFwIHN0cmluZyBpcyBhcyBiZWxvdzoKKyAgICAgKiAiYTowLHY6MCBhOjEsdjoxIgorICAgICAqICJhOjAsYWdyb3VwOmEwIGE6MSxhZ3JvdXA6YTEgdjowLGFncm91cDphMCAgdjoxLGFncm91cDphMSIKKyAgICAgKiBUaGlzIHN0cmluZyBzcGVjaWZpZXMgaG93IHRvIGdyb3VwIHRoZSBhdWRpbywgdmlkZW8gYW5kIHN1YnRpdGxlIHN0cmVhbXMKKyAgICAgKiBpbnRvIGRpZmZlcmVudCB2YXJpYW50IHN0cmVhbXMuIFRoZSB2YXJpYW50IHN0cmVhbSBncm91cHMgYXJlIHNlcGFyYXRlZAorICAgICAqIGJ5IHNwYWNlLgorICAgICAqCisgICAgICogYTosIHY6LCBzOiBhcmUga2V5cyB0byBzcGVjaWZ5IGF1ZGlvLCB2aWRlbyBhbmQgc3VidGl0bGUgc3RyZWFtcworICAgICAqIHJlc3BlY3RpdmVseS4gQWxsb3dlZCB2YWx1ZXMgYXJlIDAgdG8gOSBkaWdpdHMgKGxpbWl0ZWQganVzdCBiYXNlZCBvbgorICAgICAqIHByYWN0aWNhbCB1c2FnZSkKKyAgICAgKgorICAgICAqIGFncm91cDogaXMga2V5IHRvIHNwZWNpZnkgYXVkaW8gZ3JvdXAuIEEgc3RyaW5nIGNhbiBiZSBnaXZlbiBhcyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwID0gYXZfc3RyZHVwKGhscy0+dmFyX3N0cmVhbV9tYXApOworICAgIHEgPSBwOworICAgIHdoaWxlKGF2X3N0cnRvayhxLCAiIFx0IiwgJnNhdmVwdHIxKSkgeworICAgICAgICBxID0gTlVMTDsKKyAgICAgICAgaGxzLT5uYl92YXJzdHJlYW1zKys7CisgICAgfQorICAgIGF2X2ZyZWVwKCZwKTsKKworICAgIGhscy0+dmFyX3N0cmVhbXMgPSBhdl9tYWxsb2N6KHNpemVvZigqaGxzLT52YXJfc3RyZWFtcykgKiBobHMtPm5iX3ZhcnN0cmVhbXMpOworICAgIGlmICghaGxzLT52YXJfc3RyZWFtcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHAgPSBobHMtPnZhcl9zdHJlYW1fbWFwOworICAgIG5iX3ZhcnN0cmVhbXMgPSAwOworICAgIHdoaWxlICh2YXJzdHIgPSBhdl9zdHJ0b2socCwgIiBcdCIsICZzYXZlcHRyMSkpIHsKKyAgICAgICAgcCA9IE5VTEw7CisKKyAgICAgICAgaWYgKG5iX3ZhcnN0cmVhbXMgPCBobHMtPm5iX3ZhcnN0cmVhbXMpIHsKKyAgICAgICAgICAgIHZzID0gJihobHMtPnZhcl9zdHJlYW1zW25iX3ZhcnN0cmVhbXNdKTsKKyAgICAgICAgICAgIHZzLT52YXJfc3RyZWFtX2lkeCA9IG5iX3ZhcnN0cmVhbXM7CisgICAgICAgICAgICBuYl92YXJzdHJlYW1zKys7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICBxID0gdmFyc3RyOworICAgICAgICB3aGlsZSAocSA8IHZhcnN0ciArIHN0cmxlbih2YXJzdHIpKSB7CisgICAgICAgICAgICBpZiAoIWF2X3N0cm5jYXNlY21wKHEsICJhOiIsIDIpIHx8ICFhdl9zdHJuY2FzZWNtcChxLCAidjoiLCAyKSB8fAorICAgICAgICAgICAgICAgICFhdl9zdHJuY2FzZWNtcChxLCAiczoiLCAyKSkKKyAgICAgICAgICAgICAgICB2cy0+bmJfc3RyZWFtcysrOworICAgICAgICAgICAgcSsrOworICAgICAgICB9CisgICAgICAgIHZzLT5zdHJlYW1zID0gYXZfbWFsbG9jeihzaXplb2YoQVZTdHJlYW0gKikgKiB2cy0+bmJfc3RyZWFtcyk7CisgICAgICAgIGlmICghdnMtPnN0cmVhbXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIG5iX3N0cmVhbXMgPSAwOworICAgICAgICB3aGlsZSAoa2V5dmFsID0gYXZfc3RydG9rKHZhcnN0ciwgIiwiLCAmc2F2ZXB0cjIpKSB7CisgICAgICAgICAgICB2YXJzdHIgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoYXZfc3Ryc3RhcnQoa2V5dmFsLCAiYWdyb3VwOiIsICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgdnMtPmFncm91cCA9IGF2X3N0cmR1cCh2YWwpOworICAgICAgICAgICAgICAgIGlmICghdnMtPmFncm91cCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQoa2V5dmFsLCAiY2Nncm91cDoiLCAmdmFsKSkgeworICAgICAgICAgICAgICAgIHZzLT5jY2dyb3VwID0gYXZfc3RyZHVwKHZhbCk7CisgICAgICAgICAgICAgICAgaWYgKCF2cy0+Y2Nncm91cCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQoa2V5dmFsLCAidjoiLCAmdmFsKSkgeworICAgICAgICAgICAgICAgIGNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KGtleXZhbCwgImE6IiwgJnZhbCkpIHsKKyAgICAgICAgICAgICAgICBjb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChrZXl2YWwsICJzOiIsICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQga2V5dmFsICVzXG4iLCBrZXl2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmVhbV9pbmRleCA9IC0xOworICAgICAgICAgICAgaWYgKGF2X2lzZGlnaXQoKnZhbCkpCisgICAgICAgICAgICAgICAgc3RyZWFtX2luZGV4ID0gZ2V0X250aF9jb2RlY19zdHJlYW1faW5kZXggKHMsIGNvZGVjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b2kodmFsKSk7CisKKyAgICAgICAgICAgIGlmIChzdHJlYW1faW5kZXggPj0gMCAmJiBuYl9zdHJlYW1zIDwgdnMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICB2cy0+c3RyZWFtc1tuYl9zdHJlYW1zKytdID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG1hcCBzdHJlYW0gYXQgJXNcbiIsIGtleXZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiTnVtYmVyIG9mIHZhcmlhbnQgc3RyZWFtcyAlZFxuIiwKKyAgICAgICAgICAgIGhscy0+bmJfdmFyc3RyZWFtcyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9jY19zdHJlYW1fbWFwc3RyaW5nKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBITFNDb250ZXh0ICpobHMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IG5iX2Njc3RyZWFtczsKKyAgICBjaGFyICpwLCAqcSwgKmNjc3RyLCAqa2V5dmFsOworICAgIGNoYXIgKnNhdmVwdHIxID0gTlVMTCwgKnNhdmVwdHIyID0gTlVMTDsKKyAgICBjb25zdCBjaGFyICp2YWw7CisgICAgQ2xvc2VkQ2FwdGlvbnNTdHJlYW0gKmNjczsKKworICAgIHAgPSBhdl9zdHJkdXAoaGxzLT5jY19zdHJlYW1fbWFwKTsKKyAgICBxID0gcDsKKyAgICB3aGlsZShhdl9zdHJ0b2socSwgIiBcdCIsICZzYXZlcHRyMSkpIHsKKyAgICAgICAgcSA9IE5VTEw7CisgICAgICAgIGhscy0+bmJfY2NzdHJlYW1zKys7CisgICAgfQorICAgIGF2X2ZyZWVwKCZwKTsKKworICAgIGhscy0+Y2Nfc3RyZWFtcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpobHMtPmNjX3N0cmVhbXMpICogaGxzLT5uYl9jY3N0cmVhbXMpOworICAgIGlmICghaGxzLT5jY19zdHJlYW1zKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcCA9IGhscy0+Y2Nfc3RyZWFtX21hcDsKKyAgICBuYl9jY3N0cmVhbXMgPSAwOworICAgIHdoaWxlIChjY3N0ciA9IGF2X3N0cnRvayhwLCAiIFx0IiwgJnNhdmVwdHIxKSkgeworICAgICAgICBwID0gTlVMTDsKKworICAgICAgICBpZiAobmJfY2NzdHJlYW1zIDwgaGxzLT5uYl9jY3N0cmVhbXMpCisgICAgICAgICAgICBjY3MgPSAmKGhscy0+Y2Nfc3RyZWFtc1tuYl9jY3N0cmVhbXMrK10pOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgICAgIHdoaWxlIChrZXl2YWwgPSBhdl9zdHJ0b2soY2NzdHIsICIsIiwgJnNhdmVwdHIyKSkgeworICAgICAgICAgICAgY2NzdHIgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoYXZfc3Ryc3RhcnQoa2V5dmFsLCAiY2Nncm91cDoiLCAmdmFsKSkgeworICAgICAgICAgICAgICAgIGNjcy0+Y2Nncm91cCA9IGF2X3N0cmR1cCh2YWwpOworICAgICAgICAgICAgICAgIGlmICghY2NzLT5jY2dyb3VwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChrZXl2YWwsICJpbnN0cmVhbWlkOiIsICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgY2NzLT5pbnN0cmVhbWlkID0gYXZfc3RyZHVwKHZhbCk7CisgICAgICAgICAgICAgICAgaWYgKCFjY3MtPmluc3RyZWFtaWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KGtleXZhbCwgImxhbmd1YWdlOiIsICZ2YWwpKSB7CisgICAgICAgICAgICAgICAgY2NzLT5sYW5ndWFnZSA9IGF2X3N0cmR1cCh2YWwpOworICAgICAgICAgICAgICAgIGlmICghY2NzLT5sYW5ndWFnZSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQga2V5dmFsICVzXG4iLCBrZXl2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNjcy0+Y2Nncm91cCB8fCAhY2NzLT5pbnN0cmVhbWlkKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW5zdWZmaWNpZW50IHBhcmFtZXRlcnMgaW4gY2Mgc3RyZWFtIG1hcCBzdHJpbmdcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhdl9zdHJzdGFydChjY3MtPmluc3RyZWFtaWQsICJDQyIsICZ2YWwpKSB7CisgICAgICAgICAgICBpZihhdG9pKHZhbCkgPCAxIHx8IGF0b2kodmFsKSA+IDQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBpbnN0cmVhbSBJRCBDQyBpbmRleCAlZCBpbiAlcywgcmFuZ2UgMS00XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdG9pKHZhbCksIGNjcy0+aW5zdHJlYW1pZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChjY3MtPmluc3RyZWFtaWQsICJTRVJWSUNFIiwgJnZhbCkpIHsKKyAgICAgICAgICAgIGlmKGF0b2kodmFsKSA8IDEgfHwgYXRvaSh2YWwpID4gNjMpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBpbnN0cmVhbSBJRCBTRVJWSUNFIGluZGV4ICVkIGluICVzLCByYW5nZSAxLTYzIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXRvaSh2YWwpLCBjY3MtPmluc3RyZWFtaWQpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBpbnN0cmVhbSBJRCAlcywgc3VwcG9ydGVkIGFyZSBDQ24gb3IgU0VSSVZJQ0VuXG4iLAorICAgICAgICAgICAgICAgICAgIGNjcy0+aW5zdHJlYW1pZCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX3ZhcmlhbnRfc3RyZWFtX2luZm8oQVZGb3JtYXRDb250ZXh0ICpzKSB7CisgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOworICAgIHVuc2lnbmVkIGludCBpOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGhscy0+Y2Nfc3RyZWFtX21hcCkgeworICAgICAgICByZXQgPSBwYXJzZV9jY19zdHJlYW1fbWFwc3RyaW5nKHMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGhscy0+dmFyX3N0cmVhbV9tYXApIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlX3ZhcmlhbnRfc3RyZWFtX21hcHN0cmluZyhzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvL0J5IGRlZmF1bHQsIGEgc2luZ2xlIHZhcmlhbnQgc3RyZWFtIHdpdGggYWxsIHRoZSBjb2RlYyBzdHJlYW1zIGlzIGNyZWF0ZWQKKyAgICAgICAgaGxzLT5uYl92YXJzdHJlYW1zID0gMTsKKyAgICAgICAgaGxzLT52YXJfc3RyZWFtcyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpobHMtPnZhcl9zdHJlYW1zKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHMtPm5iX3ZhcnN0cmVhbXMpOworICAgICAgICBpZiAoIWhscy0+dmFyX3N0cmVhbXMpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGhscy0+dmFyX3N0cmVhbXNbMF0udmFyX3N0cmVhbV9pZHggPSAwOworICAgICAgICBobHMtPnZhcl9zdHJlYW1zWzBdLm5iX3N0cmVhbXMgPSBzLT5uYl9zdHJlYW1zOworICAgICAgICBobHMtPnZhcl9zdHJlYW1zWzBdLnN0cmVhbXMgPSBhdl9tYWxsb2N6KHNpemVvZihBVlN0cmVhbSAqKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscy0+dmFyX3N0cmVhbXNbMF0ubmJfc3RyZWFtcyk7CisgICAgICAgIGlmICghaGxzLT52YXJfc3RyZWFtc1swXS5zdHJlYW1zKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAvL2J5IGRlZmF1bHQsIHRoZSBmaXJzdCBhdmFpbGFibGUgY2Nncm91cCBpcyBtYXBwZWQgdG8gdGhlIHZhcmlhbnQgc3RyZWFtCisgICAgICAgIGlmIChobHMtPm5iX2Njc3RyZWFtcykgeworICAgICAgICAgICAgaGxzLT52YXJfc3RyZWFtc1swXS5jY2dyb3VwID0gYXZfc3RyZHVwKGhscy0+Y2Nfc3RyZWFtc1swXS5jY2dyb3VwKTsKKyAgICAgICAgICAgIGlmICghaGxzLT52YXJfc3RyZWFtc1swXS5jY2dyb3VwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICAgICAgaGxzLT52YXJfc3RyZWFtc1swXS5zdHJlYW1zW2ldID0gcy0+c3RyZWFtc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdXBkYXRlX21hc3Rlcl9wbF9pbmZvKEFWRm9ybWF0Q29udGV4dCAqcykgeworICAgIEhMU0NvbnRleHQgKmhscyA9IHMtPnByaXZfZGF0YTsKKyAgICBjb25zdCBjaGFyICpkaXI7CisgICAgY2hhciAqZm4xPSBOVUxMLCAqZm4yID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGZuMSA9IGF2X3N0cmR1cChzLT51cmwpOworICAgIGlmICghZm4xKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGRpciA9IGF2X2Rpcm5hbWUoZm4xKTsKKworICAgIC8qKgorICAgICAqIGlmIG91dHB1dCBmaWxlJ3MgZGlyZWN0b3J5IGhhcyAldiwgdmFyaWFudHMgYXJlIGNyZWF0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzCisgICAgICogdGhlbiBtYXN0ZXIgaXMgY3JlYXRlZCBhdCB0aGUgc3ViLWRpcmVjdG9yaWVzIGxldmVsCisgICAgICovCisgICAgaWYgKGRpciAmJiBhdl9zdHJpc3RyKGF2X2Jhc2VuYW1lKGRpciksICIldiIpKSB7CisgICAgICAgIGZuMiA9IGF2X3N0cmR1cChkaXIpOworICAgICAgICBpZiAoIWZuMikgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGRpciA9IGF2X2Rpcm5hbWUoZm4yKTsKKyAgICB9CisKKyAgICBpZiAoZGlyICYmIHN0cmNtcChkaXIsICIuIikpCisgICAgICAgIGhscy0+bWFzdGVyX20zdThfdXJsID0gYXZfYXBwZW5kX3BhdGhfY29tcG9uZW50KGRpciwgaGxzLT5tYXN0ZXJfcGxfbmFtZSk7CisgICAgZWxzZQorICAgICAgICBobHMtPm1hc3Rlcl9tM3U4X3VybCA9IGF2X3N0cmR1cChobHMtPm1hc3Rlcl9wbF9uYW1lKTsKKworICAgIGlmICghaGxzLT5tYXN0ZXJfbTN1OF91cmwpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIGF2X2ZyZWVwKCZmbjEpOworICAgIGF2X2ZyZWVwKCZmbjIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBobHNfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBITFNDb250ZXh0ICpobHMgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldCwgaSwgajsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOworICAgIFZhcmlhbnRTdHJlYW0gKnZzID0gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBobHMtPm5iX3ZhcnN0cmVhbXM7IGkrKykgeworICAgICAgICB2cyA9ICZobHMtPnZhcl9zdHJlYW1zW2ldOworCisgICAgICAgIGF2X2RpY3RfY29weSgmb3B0aW9ucywgaGxzLT5mb3JtYXRfb3B0aW9ucywgMCk7CisgICAgICAgIHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcih2cy0+YXZmLCAmb3B0aW9ucyk7CisgICAgICAgIGlmIChhdl9kaWN0X2NvdW50KG9wdGlvbnMpKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU29tZSBvZiBwcm92aWRlZCBmb3JtYXQgb3B0aW9ucyBpbiAnJXMnIGFyZSBub3QgcmVjb2duaXplZFxuIiwgaGxzLT5mb3JtYXRfb3B0aW9uc19zdHIpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOworICAgICAgICAvL2F2X2Fzc2VydDAocy0+bmJfc3RyZWFtcyA9PSBobHMtPmF2Zi0+bmJfc3RyZWFtcyk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB2cy0+bmJfc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICBBVlN0cmVhbSAqaW5uZXJfc3Q7CisgICAgICAgICAgICBBVlN0cmVhbSAqb3V0ZXJfc3QgPSB2cy0+c3RyZWFtc1tqXTsKKworICAgICAgICAgICAgaWYgKGhscy0+bWF4X3NlZ19zaXplID4gMCkgeworICAgICAgICAgICAgICAgIGlmICgob3V0ZXJfc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgJiYKKyAgICAgICAgICAgICAgICAgICAgKG91dGVyX3N0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPiBobHMtPm1heF9zZWdfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiWW91ciB2aWRlbyBiaXRyYXRlIGlzIGJpZ2dlciB0aGFuIGhsc19zZWdtZW50X3NpemUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJSJQUklkNjQgIiA+ICUiUFJJZDY0ICIpLCB0aGUgcmVzdWx0IG1heWJlIG5vdCBiZSB3aGF0IHlvdSB3YW50LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRlcl9zdC0+Y29kZWNwYXItPmJpdF9yYXRlLCBobHMtPm1heF9zZWdfc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0ZXJfc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgICAgICAgICBpbm5lcl9zdCA9IHZzLT5hdmYtPnN0cmVhbXNbal07CisgICAgICAgICAgICBlbHNlIGlmICh2cy0+dnR0X2F2ZikKKyAgICAgICAgICAgICAgICBpbm5lcl9zdCA9IHZzLT52dHRfYXZmLT5zdHJlYW1zWzBdOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogV2UgaGF2ZSBhIHN1YnRpdGxlIHN0cmVhbSwgd2hlbiB0aGUgdXNlciBkb2VzIG5vdCB3YW50IG9uZSAqLworICAgICAgICAgICAgICAgIGlubmVyX3N0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ob3V0ZXJfc3QsIGlubmVyX3N0LT5wdHNfd3JhcF9iaXRzLCBpbm5lcl9zdC0+dGltZV9iYXNlLm51bSwgaW5uZXJfc3QtPnRpbWVfYmFzZS5kZW4pOworICAgICAgICAgICAgd3JpdGVfY29kZWNfYXR0cihvdXRlcl9zdCwgdnMpOworCisgICAgICAgIH0KKyAgICAgICAgLyogVXBkYXRlIHRoZSBDb2RlYyBBdHRyIHN0cmluZyBmb3IgdGhlIG1hcHBlZCBhdWRpbyBncm91cHMgKi8KKyAgICAgICAgaWYgKHZzLT5oYXNfdmlkZW8gJiYgdnMtPmFncm91cCkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGhscy0+bmJfdmFyc3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICAgICAgVmFyaWFudFN0cmVhbSAqdnNfYWdyb3VwID0gJihobHMtPnZhcl9zdHJlYW1zW2pdKTsKKyAgICAgICAgICAgICAgICBpZiAoIXZzX2Fncm91cC0+aGFzX3ZpZGVvICYmICF2c19hZ3JvdXAtPmhhc19zdWJ0aXRsZSAmJgorICAgICAgICAgICAgICAgICAgICB2c19hZ3JvdXAtPmFncm91cCAmJgorICAgICAgICAgICAgICAgICAgICAhYXZfc3RyY2FzZWNtcCh2c19hZ3JvdXAtPmFncm91cCwgdnMtPmFncm91cCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfY29kZWNfYXR0cih2c19hZ3JvdXAtPnN0cmVhbXNbMF0sIHZzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiBmYWlsOgogCi0gICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9mcmVlcCgmaGxzLT5iYXNlbmFtZSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZobHMtPnZ0dF9iYXNlbmFtZSk7Ci0gICAgICAgIGlmIChobHMtPmF2ZikKLSAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChobHMtPmF2Zik7Ci0gICAgICAgIGlmIChobHMtPnZ0dF9hdmYpCi0gICAgICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQoaGxzLT52dHRfYXZmKTsKLQotICAgIH0KICAgICByZXR1cm4gcmV0OwogfQogCkBAIC03NDIsNzQgKzIxNDAsMjA1IEBACiAgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOwogICAgIEFWRm9ybWF0Q29udGV4dCAqb2MgPSBOVUxMOwogICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOwotICAgIGludDY0X3QgZW5kX3B0cyA9IGhscy0+cmVjb3JkaW5nX3RpbWUgKiBobHMtPm51bWJlcjsKKyAgICBpbnQ2NF90IGVuZF9wdHMgPSAwOwogICAgIGludCBpc19yZWZfcGt0ID0gMTsKLSAgICBpbnQgcmV0LCBjYW5fc3BsaXQgPSAxOworICAgIGludCByZXQgPSAwLCBjYW5fc3BsaXQgPSAxLCBpLCBqOwogICAgIGludCBzdHJlYW1faW5kZXggPSAwOworICAgIGludCByYW5nZV9sZW5ndGggPSAwOworICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IE5VTEw7CisgICAgVmFyaWFudFN0cmVhbSAqdnMgPSBOVUxMOwogCi0gICAgaWYoIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUgKSB7Ci0gICAgICAgIG9jID0gaGxzLT52dHRfYXZmOwotICAgICAgICBzdHJlYW1faW5kZXggPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9jID0gaGxzLT5hdmY7Ci0gICAgICAgIHN0cmVhbV9pbmRleCA9IHBrdC0+c3RyZWFtX2luZGV4OwotICAgIH0KLSAgICBpZiAoaGxzLT5zdGFydF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKLSAgICAgICAgaGxzLT5zdGFydF9wdHMgPSBwa3QtPnB0czsKLSAgICAgICAgaGxzLT5lbmRfcHRzICAgPSBwa3QtPnB0czsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGxzLT5uYl92YXJzdHJlYW1zOyBpKyspIHsKKyAgICAgICAgdnMgPSAmaGxzLT52YXJfc3RyZWFtc1tpXTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHZzLT5uYl9zdHJlYW1zOyBqKyspIHsKKyAgICAgICAgICAgIGlmICh2cy0+c3RyZWFtc1tqXSA9PSBzdCkgeworICAgICAgICAgICAgICAgIGlmKCBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICkgeworICAgICAgICAgICAgICAgICAgICBvYyA9IHZzLT52dHRfYXZmOworICAgICAgICAgICAgICAgICAgICBzdHJlYW1faW5kZXggPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9jID0gdnMtPmF2ZjsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtX2luZGV4ID0gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob2MpCisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAoaGxzLT5oYXNfdmlkZW8pIHsKLSAgICAgICAgY2FuX3NwbGl0ID0gc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgotICAgICAgICAgICAgICAgICAgICBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZOwotICAgICAgICBpc19yZWZfcGt0ID0gc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBpZiAoIW9jKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gZmluZCBtYXBwaW5nIHZhcmlhbnQgc3RyZWFtXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBlbmRfcHRzID0gaGxzLT5yZWNvcmRpbmdfdGltZSAqIHZzLT5udW1iZXI7CisKKyAgICBpZiAodnMtPnNlcXVlbmNlIC0gdnMtPm5iX2VudHJpZXMgPiBobHMtPnN0YXJ0X3NlcXVlbmNlICYmIGhscy0+aW5pdF90aW1lID4gMCkgeworICAgICAgICAvKiByZXNldCBlbmRfcHRzLCBobHMtPnJlY29yZGluZ190aW1lIGF0IGVuZCBvZiB0aGUgaW5pdCBobHMgbGlzdCAqLworICAgICAgICBpbnQgaW5pdF9saXN0X2R1ciA9IGhscy0+aW5pdF90aW1lICogdnMtPm5iX2VudHJpZXMgKiBBVl9USU1FX0JBU0U7CisgICAgICAgIGludCBhZnRlcl9pbml0X2xpc3RfZHVyID0gKHZzLT5zZXF1ZW5jZSAtIHZzLT5uYl9lbnRyaWVzICkgKiBobHMtPnRpbWUgKiBBVl9USU1FX0JBU0U7CisgICAgICAgIGhscy0+cmVjb3JkaW5nX3RpbWUgPSBobHMtPnRpbWUgKiBBVl9USU1FX0JBU0U7CisgICAgICAgIGVuZF9wdHMgPSBpbml0X2xpc3RfZHVyICsgYWZ0ZXJfaW5pdF9saXN0X2R1ciA7CisgICAgfQorCisgICAgaWYgKHZzLT5zdGFydF9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgdnMtPnN0YXJ0X3B0cyA9IHBrdC0+cHRzOworICAgIH0KKworICAgIGlmICh2cy0+aGFzX3ZpZGVvKSB7CisgICAgICAgIGNhbl9zcGxpdCA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICAgICAgICAgICAgICAgICAgKChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSB8fCAoaGxzLT5mbGFncyAmIEhMU19TUExJVF9CWV9USU1FKSk7CisgICAgICAgIGlzX3JlZl9wa3QgPSAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgJiYgKHBrdC0+c3RyZWFtX2luZGV4ID09IHZzLT5yZWZlcmVuY2Vfc3RyZWFtX2luZGV4KTsKICAgICB9CiAgICAgaWYgKHBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFKQogICAgICAgICBpc19yZWZfcGt0ID0gY2FuX3NwbGl0ID0gMDsKIAotICAgIGlmIChpc19yZWZfcGt0KQotICAgICAgICBobHMtPmR1cmF0aW9uID0gKGRvdWJsZSkocGt0LT5wdHMgLSBobHMtPmVuZF9wdHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3QtPnRpbWVfYmFzZS5udW0gLyBzdC0+dGltZV9iYXNlLmRlbjsKLQotICAgIGlmIChjYW5fc3BsaXQgJiYgYXZfY29tcGFyZV90cyhwa3QtPnB0cyAtIGhscy0+c3RhcnRfcHRzLCBzdC0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcHRzLCBBVl9USU1FX0JBU0VfUSkgPj0gMCkgewotICAgICAgICBpbnQ2NF90IG5ld19zdGFydF9wb3M7Ci0gICAgICAgIGF2X3dyaXRlX2ZyYW1lKG9jLCBOVUxMKTsgLyogRmx1c2ggYW55IGJ1ZmZlcmVkIGRhdGEgKi8KLQotICAgICAgICBuZXdfc3RhcnRfcG9zID0gYXZpb190ZWxsKGhscy0+YXZmLT5wYik7Ci0gICAgICAgIGhscy0+c2l6ZSA9IG5ld19zdGFydF9wb3MgLSBobHMtPnN0YXJ0X3BvczsKLSAgICAgICAgcmV0ID0gaGxzX2FwcGVuZF9zZWdtZW50KGhscywgaGxzLT5kdXJhdGlvbiwgaGxzLT5zdGFydF9wb3MsIGhscy0+c2l6ZSk7Ci0gICAgICAgIGhscy0+c3RhcnRfcG9zID0gbmV3X3N0YXJ0X3BvczsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIGhscy0+ZW5kX3B0cyA9IHBrdC0+cHRzOwotICAgICAgICBobHMtPmR1cmF0aW9uID0gMDsKLQotICAgICAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSkgewotICAgICAgICAgICAgaWYgKGhscy0+YXZmLT5vZm9ybWF0LT5wcml2X2NsYXNzICYmIGhscy0+YXZmLT5wcml2X2RhdGEpCi0gICAgICAgICAgICAgICAgYXZfb3B0X3NldChobHMtPmF2Zi0+cHJpdl9kYXRhLCAibXBlZ3RzX2ZsYWdzIiwgInJlc2VuZF9oZWFkZXJzIiwgMCk7Ci0gICAgICAgICAgICBobHMtPm51bWJlcisrOworICAgIGlmIChpc19yZWZfcGt0KSB7CisgICAgICAgIGlmICh2cy0+ZW5kX3B0cyA9PSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHZzLT5lbmRfcHRzID0gcGt0LT5wdHM7CisgICAgICAgIGlmICh2cy0+bmV3X3N0YXJ0KSB7CisgICAgICAgICAgICB2cy0+bmV3X3N0YXJ0ID0gMDsKKyAgICAgICAgICAgIHZzLT5kdXJhdGlvbiA9IChkb3VibGUpKHBrdC0+cHRzIC0gdnMtPmVuZF9wdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0LT50aW1lX2Jhc2UubnVtIC8gc3QtPnRpbWVfYmFzZS5kZW47CisgICAgICAgICAgICB2cy0+ZHBwID0gKGRvdWJsZSkocGt0LT5kdXJhdGlvbikgKiBzdC0+dGltZV9iYXNlLm51bSAvIHN0LT50aW1lX2Jhc2UuZGVuOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsICZvYy0+cGIpOwotICAgICAgICAgICAgaWYgKGhscy0+dnR0X2F2ZikKLSAgICAgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJmhscy0+dnR0X2F2Zi0+cGIpOwotCi0gICAgICAgICAgICByZXQgPSBobHNfc3RhcnQocyk7CisgICAgICAgICAgICBpZiAocGt0LT5kdXJhdGlvbikgeworICAgICAgICAgICAgICAgIHZzLT5kdXJhdGlvbiArPSAoZG91YmxlKShwa3QtPmR1cmF0aW9uKSAqIHN0LT50aW1lX2Jhc2UubnVtIC8gc3QtPnRpbWVfYmFzZS5kZW47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInBrdC0+ZHVyYXRpb24gPSAwLCBtYXliZSB0aGUgaGxzIHNlZ21lbnQgZHVyYXRpb24gd2lsbCBub3QgcHJlY2lzZVxuIik7CisgICAgICAgICAgICAgICAgdnMtPmR1cmF0aW9uID0gKGRvdWJsZSkocGt0LT5wdHMgLSB2cy0+ZW5kX3B0cykgKiBzdC0+dGltZV9iYXNlLm51bSAvIHN0LT50aW1lX2Jhc2UuZGVuOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgIGlmKCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICkKLSAgICAgICAgICAgIG9jID0gaGxzLT52dHRfYXZmOwotICAgICAgICBlbHNlCi0gICAgICAgIG9jID0gaGxzLT5hdmY7Ci0KLSAgICAgICAgaWYgKChyZXQgPSBobHNfd2luZG93KHMsIDApKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAorICAgIGlmICh2cy0+cGFja2V0c193cml0dGVuICYmIGNhbl9zcGxpdCAmJiBhdl9jb21wYXJlX3RzKHBrdC0+cHRzIC0gdnMtPnN0YXJ0X3B0cywgc3QtPnRpbWVfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcHRzLCBBVl9USU1FX0JBU0VfUSkgPj0gMCkgeworICAgICAgICBpbnQ2NF90IG5ld19zdGFydF9wb3M7CisgICAgICAgIGNoYXIgKm9sZF9maWxlbmFtZSA9IE5VTEw7CisgICAgICAgIGludCBieXRlcmFuZ2VfbW9kZSA9IChobHMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKSB8fCAoaGxzLT5tYXhfc2VnX3NpemUgPiAwKTsKKworICAgICAgICBhdl93cml0ZV9mcmFtZSh2cy0+YXZmLCBOVUxMKTsgLyogRmx1c2ggYW55IGJ1ZmZlcmVkIGRhdGEgKi8KKworICAgICAgICBuZXdfc3RhcnRfcG9zID0gYXZpb190ZWxsKHZzLT5hdmYtPnBiKTsKKyAgICAgICAgaWYgKGhscy0+c2VnbWVudF90eXBlICE9IFNFR01FTlRfVFlQRV9GTVA0KSB7CisgICAgICAgICAgICB2cy0+c2l6ZSA9IG5ld19zdGFydF9wb3MgLSB2cy0+c3RhcnRfcG9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdnMtPnNpemUgPSBuZXdfc3RhcnRfcG9zOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhscy0+c2VnbWVudF90eXBlID09IFNFR01FTlRfVFlQRV9GTVA0KSB7CisgICAgICAgICAgICBpZiAoIXZzLT5pbml0X3JhbmdlX2xlbmd0aCkgeworICAgICAgICAgICAgICAgIGF2aW9fZmx1c2gob2MtPnBiKTsKKyAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGggPSBhdmlvX2Nsb3NlX2R5bl9idWYob2MtPnBiLCAmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dyaXRlKHZzLT5vdXQsIGJ1ZmZlciwgcmFuZ2VfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB2cy0+aW5pdF9yYW5nZV9sZW5ndGggPSByYW5nZV9sZW5ndGg7CisgICAgICAgICAgICAgICAgYXZpb19vcGVuX2R5bl9idWYoJm9jLT5wYik7CisgICAgICAgICAgICAgICAgdnMtPnBhY2tldHNfd3JpdHRlbiA9IDA7CisgICAgICAgICAgICAgICAgdnMtPnN0YXJ0X3BvcyA9IHJhbmdlX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBpZiAoIWJ5dGVyYW5nZV9tb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShzLCAmdnMtPm91dCk7CisgICAgICAgICAgICAgICAgICAgIGhsc2VuY19pb19jbG9zZShzLCAmdnMtPm91dCwgdnMtPmJhc2Vfb3V0cHV0X2Rpcm5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghYnl0ZXJhbmdlX21vZGUpIHsKKyAgICAgICAgICAgICAgICBobHNlbmNfaW9fY2xvc2UocywgJm9jLT5wYiwgb2MtPnVybCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFieXRlcmFuZ2VfbW9kZSkgeworICAgICAgICAgICAgaWYgKHZzLT52dHRfYXZmKSB7CisgICAgICAgICAgICAgICAgaGxzZW5jX2lvX2Nsb3NlKHMsICZ2cy0+dnR0X2F2Zi0+cGIsIHZzLT52dHRfYXZmLT51cmwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgoaGxzLT5mbGFncyAmIEhMU19URU1QX0ZJTEUpICYmIG9jLT51cmxbMF0pIHsKKyAgICAgICAgICAgIGlmICghKGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUpIHx8IChobHMtPm1heF9zZWdfc2l6ZSA8PSAwKSkKKyAgICAgICAgICAgICAgICBpZiAoKHZzLT5hdmYtPm9mb3JtYXQtPnByaXZfY2xhc3MgJiYgdnMtPmF2Zi0+cHJpdl9kYXRhKSAmJiBobHMtPnNlZ21lbnRfdHlwZSAhPSBTRUdNRU5UX1RZUEVfRk1QNCkKKyAgICAgICAgICAgICAgICAgICAgYXZfb3B0X3NldCh2cy0+YXZmLT5wcml2X2RhdGEsICJtcGVndHNfZmxhZ3MiLCAicmVzZW5kX2hlYWRlcnMiLCAwKTsKKyAgICAgICAgICAgIGhsc19yZW5hbWVfdGVtcF9maWxlKHMsIG9jKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2cy0+Zm1wNF9pbml0X21vZGUpIHsKKyAgICAgICAgICAgIHZzLT5udW1iZXItLTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChobHMtPnNlZ21lbnRfdHlwZSA9PSBTRUdNRU5UX1RZUEVfRk1QNCkgeworICAgICAgICAgICAgaWYgKGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBmbHVzaF9keW5idWYodnMsICZyYW5nZV9sZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWUob2xkX2ZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdnMtPnNpemUgPSByYW5nZV9sZW5ndGg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IGhsc2VuY19pb19vcGVuKHMsICZ2cy0+b3V0LCB2cy0+YXZmLT51cmwsIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBmaWxlICclcydcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2cy0+YXZmLT51cmwpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9zdHlwKHZzLT5vdXQpOworICAgICAgICAgICAgICAgIHJldCA9IGZsdXNoX2R5bmJ1Zih2cywgJnJhbmdlX2xlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsICZ2cy0+b3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9sZF9maWxlbmFtZSA9IGF2X3N0cmR1cCh2cy0+YXZmLT51cmwpOworICAgICAgICBpZiAoIW9sZF9maWxlbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2cy0+c3RhcnRfcG9zIHx8IGhscy0+c2VnbWVudF90eXBlICE9IFNFR01FTlRfVFlQRV9GTVA0KSB7CisgICAgICAgICAgICByZXQgPSBobHNfYXBwZW5kX3NlZ21lbnQocywgaGxzLCB2cywgdnMtPmR1cmF0aW9uLCB2cy0+c3RhcnRfcG9zLCB2cy0+c2l6ZSk7CisgICAgICAgICAgICB2cy0+ZW5kX3B0cyA9IHBrdC0+cHRzOworICAgICAgICAgICAgdnMtPmR1cmF0aW9uID0gMDsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShvbGRfZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGxzLT5zZWdtZW50X3R5cGUgIT0gU0VHTUVOVF9UWVBFX0ZNUDQpIHsKKyAgICAgICAgICAgIHZzLT5zdGFydF9wb3MgPSBuZXdfc3RhcnRfcG9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdnMtPnN0YXJ0X3BvcyArPSB2cy0+c2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZzLT5mbXA0X2luaXRfbW9kZSA9IDA7CisgICAgICAgIGlmIChobHMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKSB7CisgICAgICAgICAgICB2cy0+bnVtYmVyKys7CisgICAgICAgIH0gZWxzZSBpZiAoaGxzLT5tYXhfc2VnX3NpemUgPiAwKSB7CisgICAgICAgICAgICBpZiAodnMtPnN0YXJ0X3BvcyA+PSBobHMtPm1heF9zZWdfc2l6ZSkgeworICAgICAgICAgICAgICAgIHZzLT5zZXF1ZW5jZSsrOworICAgICAgICAgICAgICAgIHNsc19mbGFnX2ZpbGVfcmVuYW1lKGhscywgdnMsIG9sZF9maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gaGxzX3N0YXJ0KHMsIHZzKTsKKyAgICAgICAgICAgICAgICB2cy0+c3RhcnRfcG9zID0gMDsKKyAgICAgICAgICAgICAgICAvKiBXaGVuIHNwbGl0IHNlZ21lbnQgYnkgYnl0ZSwgdGhlIGR1cmF0aW9uIGlzIHNob3J0IHRoYW4gaGxzX3RpbWUsCisgICAgICAgICAgICAgICAgICogc28gaXQgaXMgbm90IGVub3VnaCBvbmUgc2VnbWVudCBkdXJhdGlvbiBhcyBobHNfdGltZSwgKi8KKyAgICAgICAgICAgICAgICB2cy0+bnVtYmVyLS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2cy0+bnVtYmVyKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbHNfZmxhZ19maWxlX3JlbmFtZShobHMsIHZzLCBvbGRfZmlsZW5hbWUpOworICAgICAgICAgICAgcmV0ID0gaGxzX3N0YXJ0KHMsIHZzKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlKG9sZF9maWxlbmFtZSk7CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZzLT5mbXA0X2luaXRfbW9kZSB8fCBieXRlcmFuZ2VfbW9kZSkKKyAgICAgICAgICAgIGlmICgocmV0ID0gaGxzX3dpbmRvdyhzLCAwLCB2cykpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgdnMtPnBhY2tldHNfd3JpdHRlbisrOwogICAgIHJldCA9IGZmX3dyaXRlX2NoYWluZWQob2MsIHN0cmVhbV9pbmRleCwgcGt0LCBzLCAwKTsKIAogICAgIHJldHVybiByZXQ7CkBAIC04MTgsNjIgKzIzNDcsNTE1IEBACiBzdGF0aWMgaW50IGhsc193cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOwotICAgIEFWRm9ybWF0Q29udGV4dCAqb2MgPSBobHMtPmF2ZjsKLSAgICBBVkZvcm1hdENvbnRleHQgKnZ0dF9vYyA9IGhscy0+dnR0X2F2ZjsKKyAgICBBVkZvcm1hdENvbnRleHQgKm9jID0gTlVMTDsKKyAgICBBVkZvcm1hdENvbnRleHQgKnZ0dF9vYyA9IE5VTEw7CisgICAgY2hhciAqb2xkX2ZpbGVuYW1lID0gTlVMTDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBWYXJpYW50U3RyZWFtICp2cyA9IE5VTEw7CiAKLSAgICBhdl93cml0ZV90cmFpbGVyKG9jKTsKLSAgICBpZiAob2MtPnBiKSB7Ci0gICAgICAgIGhscy0+c2l6ZSA9IGF2aW9fdGVsbChobHMtPmF2Zi0+cGIpIC0gaGxzLT5zdGFydF9wb3M7Ci0gICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShzLCAmb2MtPnBiKTsKLSAgICAgICAgaGxzX2FwcGVuZF9zZWdtZW50KGhscywgaGxzLT5kdXJhdGlvbiwgaGxzLT5zdGFydF9wb3MsIGhscy0+c2l6ZSk7CisgICAgZm9yIChpID0gMDsgaSA8IGhscy0+bmJfdmFyc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHZzID0gJmhscy0+dmFyX3N0cmVhbXNbaV07CisKKyAgICAgICAgb2MgPSB2cy0+YXZmOworICAgICAgICB2dHRfb2MgPSB2cy0+dnR0X2F2ZjsKKyAgICAgICAgb2xkX2ZpbGVuYW1lID0gYXZfc3RyZHVwKHZzLT5hdmYtPnVybCk7CisKKyAgICAgICAgaWYgKCFvbGRfZmlsZW5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBobHMtPnNlZ21lbnRfdHlwZSA9PSBTRUdNRU5UX1RZUEVfRk1QNCkgeworICAgICAgICAgICAgaW50IHJhbmdlX2xlbmd0aCA9IDA7CisgICAgICAgICAgICBpZiAoIShobHMtPmZsYWdzICYgSExTX1NJTkdMRV9GSUxFKSkgeworICAgICAgICAgICAgICAgIHJldCA9IGhsc2VuY19pb19vcGVuKHMsICZ2cy0+b3V0LCB2cy0+YXZmLT51cmwsIE5VTEwpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBmaWxlICclcydcbiIsIHZzLT5hdmYtPnVybCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3cml0ZV9zdHlwKHZzLT5vdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gZmx1c2hfZHluYnVmKHZzLCAmcmFuZ2VfbGVuZ3RoKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJnZzLT5vdXQpOworICAgICAgICB9CisKK2ZhaWxlZDoKKyAgICAgICAgYXZfd3JpdGVfdHJhaWxlcihvYyk7CisgICAgICAgIGlmIChvYy0+cGIpIHsKKyAgICAgICAgICAgIGlmIChobHMtPnNlZ21lbnRfdHlwZSAhPSBTRUdNRU5UX1RZUEVfRk1QNCkgeworICAgICAgICAgICAgICAgIHZzLT5zaXplID0gYXZpb190ZWxsKHZzLT5hdmYtPnBiKSAtIHZzLT5zdGFydF9wb3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZzLT5zaXplID0gYXZpb190ZWxsKHZzLT5hdmYtPnBiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChobHMtPnNlZ21lbnRfdHlwZSAhPSBTRUdNRU5UX1RZUEVfRk1QNCkKKyAgICAgICAgICAgICAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJm9jLT5wYik7CisKKyAgICAgICAgICAgIGlmICgoaGxzLT5mbGFncyAmIEhMU19URU1QX0ZJTEUpICYmIG9jLT51cmxbMF0pIHsKKyAgICAgICAgICAgICAgICBobHNfcmVuYW1lX3RlbXBfZmlsZShzLCBvYyk7CisgICAgICAgICAgICAgICAgYXZfZnJlZShvbGRfZmlsZW5hbWUpOworICAgICAgICAgICAgICAgIG9sZF9maWxlbmFtZSA9IGF2X3N0cmR1cCh2cy0+YXZmLT51cmwpOworCisgICAgICAgICAgICAgICAgaWYgKCFvbGRfZmlsZW5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFmdGVyIGF2X3dyaXRlX3RyYWlsZXIsIHRoZW4gZHVyYXRpb24gKyAxIGR1cmF0aW9uIHBlciBwYWNrZXQgKi8KKyAgICAgICAgICAgIGhsc19hcHBlbmRfc2VnbWVudChzLCBobHMsIHZzLCB2cy0+ZHVyYXRpb24gKyB2cy0+ZHBwLCB2cy0+c3RhcnRfcG9zLCB2cy0+c2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBzbHNfZmxhZ19maWxlX3JlbmFtZShobHMsIHZzLCBvbGRfZmlsZW5hbWUpOworCisgICAgICAgIGlmICh2dHRfb2MpIHsKKyAgICAgICAgICAgIGlmICh2dHRfb2MtPnBiKQorICAgICAgICAgICAgICAgIGF2X3dyaXRlX3RyYWlsZXIodnR0X29jKTsKKyAgICAgICAgICAgIHZzLT5zaXplID0gYXZpb190ZWxsKHZzLT52dHRfYXZmLT5wYikgLSB2cy0+c3RhcnRfcG9zOworICAgICAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsICZ2dHRfb2MtPnBiKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmdnMtPmJhc2VuYW1lKTsKKyAgICAgICAgYXZfZnJlZXAoJnZzLT5iYXNlX291dHB1dF9kaXJuYW1lKTsKKyAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KG9jKTsKKworICAgICAgICB2cy0+YXZmID0gTlVMTDsKKyAgICAgICAgaGxzX3dpbmRvdyhzLCAxLCB2cyk7CisKKyAgICAgICAgYXZfZnJlZXAoJnZzLT5mbXA0X2luaXRfZmlsZW5hbWUpOworICAgICAgICBpZiAodnR0X29jKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmdnMtPnZ0dF9iYXNlbmFtZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmdnMtPnZ0dF9tM3U4X25hbWUpOworICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHZ0dF9vYyk7CisgICAgICAgIH0KKworICAgICAgICBobHNfZnJlZV9zZWdtZW50cyh2cy0+c2VnbWVudHMpOworICAgICAgICBobHNfZnJlZV9zZWdtZW50cyh2cy0+b2xkX3NlZ21lbnRzKTsKKyAgICAgICAgYXZfZnJlZShvbGRfZmlsZW5hbWUpOworICAgICAgICBhdl9mcmVlcCgmdnMtPm0zdThfbmFtZSk7CisgICAgICAgIGF2X2ZyZWVwKCZ2cy0+c3RyZWFtcyk7CisgICAgICAgIGF2X2ZyZWVwKCZ2cy0+YWdyb3VwKTsKKyAgICAgICAgYXZfZnJlZXAoJnZzLT5jY2dyb3VwKTsKKyAgICAgICAgYXZfZnJlZXAoJnZzLT5iYXNldXJsKTsKICAgICB9CiAKLSAgICBpZiAodnR0X29jKSB7Ci0gICAgICAgIGlmICh2dHRfb2MtPnBiKQotICAgICAgICAgICAgYXZfd3JpdGVfdHJhaWxlcih2dHRfb2MpOwotICAgICAgICBobHMtPnNpemUgPSBhdmlvX3RlbGwoaGxzLT52dHRfYXZmLT5wYikgLSBobHMtPnN0YXJ0X3BvczsKLSAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsICZ2dHRfb2MtPnBiKTsKLSAgICB9Ci0gICAgYXZfZnJlZXAoJmhscy0+YmFzZW5hbWUpOwotICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dChvYyk7Ci0KLSAgICBpZiAodnR0X29jKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZobHMtPnZ0dF9iYXNlbmFtZSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZobHMtPnZ0dF9tM3U4X25hbWUpOwotICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQodnR0X29jKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGxzLT5uYl9jY3N0cmVhbXM7IGkrKykgeworICAgICAgICBDbG9zZWRDYXB0aW9uc1N0cmVhbSAqY2NzID0gJmhscy0+Y2Nfc3RyZWFtc1tpXTsKKyAgICAgICAgYXZfZnJlZXAoJmNjcy0+Y2Nncm91cCk7CisgICAgICAgIGF2X2ZyZWVwKCZjY3MtPmluc3RyZWFtaWQpOworICAgICAgICBhdl9mcmVlcCgmY2NzLT5sYW5ndWFnZSk7CiAgICAgfQogCi0gICAgaGxzLT5hdmYgPSBOVUxMOwotICAgIGhsc193aW5kb3cocywgMSk7Ci0KLSAgICBobHNfZnJlZV9zZWdtZW50cyhobHMtPnNlZ21lbnRzKTsKLSAgICBobHNfZnJlZV9zZWdtZW50cyhobHMtPm9sZF9zZWdtZW50cyk7CisgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsICZobHMtPm0zdThfb3V0KTsKKyAgICBmZl9mb3JtYXRfaW9fY2xvc2UocywgJmhscy0+c3ViX20zdThfb3V0KTsKKyAgICBhdl9mcmVlcCgmaGxzLT5rZXlfYmFzZW5hbWUpOworICAgIGF2X2ZyZWVwKCZobHMtPnZhcl9zdHJlYW1zKTsKKyAgICBhdl9mcmVlcCgmaGxzLT5jY19zdHJlYW1zKTsKKyAgICBhdl9mcmVlcCgmaGxzLT5tYXN0ZXJfbTN1OF91cmwpOwogICAgIHJldHVybiAwOwogfQogCisKK3N0YXRpYyBpbnQgaGxzX2luaXQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCByZXQgPSAwOworICAgIGludCBpID0gMDsKKyAgICBpbnQgaiA9IDA7CisgICAgSExTQ29udGV4dCAqaGxzID0gcy0+cHJpdl9kYXRhOworICAgIGNvbnN0IGNoYXIgKnBhdHRlcm4gPSAiJWQudHMiOworICAgIFZhcmlhbnRTdHJlYW0gKnZzID0gTlVMTDsKKyAgICBpbnQgYmFzZW5hbWVfc2l6ZSA9IDA7CisgICAgY29uc3QgY2hhciAqcGF0dGVybl9sb2NhbHRpbWVfZm10ID0gZ2V0X2RlZmF1bHRfcGF0dGVybl9sb2NhbHRpbWVfZm10KHMpOworICAgIGNvbnN0IGNoYXIgKnZ0dF9wYXR0ZXJuID0gIiVkLnZ0dCI7CisgICAgY2hhciAqcCA9IE5VTEw7CisgICAgaW50IHZ0dF9iYXNlbmFtZV9zaXplID0gMDsKKyAgICBpbnQgZm1wNF9pbml0X2ZpbGVuYW1lX2xlbiA9IHN0cmxlbihobHMtPmZtcDRfaW5pdF9maWxlbmFtZSkgKyAxOworCisgICAgcmV0ID0gdXBkYXRlX3ZhcmlhbnRfc3RyZWFtX2luZm8ocyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlZhcmlhbnQgc3RyZWFtIGluZm8gdXBkYXRlIGZhaWxlZCB3aXRoIHN0YXR1cyAleFxuIiwKKyAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgLy9UT0RPOiBVcGRhdGVzIG5lZWRlZCB0byBlbmNyeXB0aW9uIGZ1bmN0aW9uYWxpdHkgd2l0aCBwZXJpb2RpYyByZS1rZXkgd2hlbiBtb3JlIHRoYW4gb25lIHZhcmlhbnQgc3RyZWFtcyBhcmUgcHJlc2VudAorICAgIGlmIChobHMtPm5iX3ZhcnN0cmVhbXMgPiAxICYmIGhscy0+ZmxhZ3MgJiBITFNfUEVSSU9ESUNfUkVLRVkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUGVyaW9kaWMgcmUta2V5IG5vdCBzdXBwb3J0ZWQgd2hlbiBtb3JlIHRoYW4gb25lIHZhcmlhbnQgc3RyZWFtcyBhcmUgcHJlc2VudFxuIik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSB2YWxpZGF0ZV9uYW1lKGhscy0+bmJfdmFyc3RyZWFtcywgcy0+dXJsKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKGhscy0+c2VnbWVudF9maWxlbmFtZSkgeworICAgICAgICByZXQgPSB2YWxpZGF0ZV9uYW1lKGhscy0+bmJfdmFyc3RyZWFtcywgaGxzLT5zZWdtZW50X2ZpbGVuYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGF2X3N0cmNhc2VjbXAoaGxzLT5mbXA0X2luaXRfZmlsZW5hbWUsICJpbml0Lm1wNCIpKSB7CisgICAgICAgIHJldCA9IHZhbGlkYXRlX25hbWUoaGxzLT5uYl92YXJzdHJlYW1zLCBobHMtPmZtcDRfaW5pdF9maWxlbmFtZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChobHMtPnN1YnRpdGxlX2ZpbGVuYW1lKSB7CisgICAgICAgIHJldCA9IHZhbGlkYXRlX25hbWUoaGxzLT5uYl92YXJzdHJlYW1zLCBobHMtPnN1YnRpdGxlX2ZpbGVuYW1lKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGhscy0+bWFzdGVyX3BsX25hbWUpIHsKKyAgICAgICAgcmV0ID0gdXBkYXRlX21hc3Rlcl9wbF9pbmZvKHMpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk1hc3RlciBzdHJlYW0gaW5mbyB1cGRhdGUgZmFpbGVkIHdpdGggc3RhdHVzICV4XG4iLAorICAgICAgICAgICAgICAgICAgIHJldCk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaGxzLT5zZWdtZW50X3R5cGUgPT0gU0VHTUVOVF9UWVBFX0ZNUDQpIHsKKyAgICAgICAgcGF0dGVybiA9ICIlZC5tNHMiOworICAgIH0KKyAgICBpZiAoKGhscy0+c3RhcnRfc2VxdWVuY2Vfc291cmNlX3R5cGUgPT0gSExTX1NUQVJUX1NFUVVFTkNFX0FTX1NFQ09ORFNfU0lOQ0VfRVBPQ0gpIHx8CisgICAgICAgIChobHMtPnN0YXJ0X3NlcXVlbmNlX3NvdXJjZV90eXBlID09IEhMU19TVEFSVF9TRVFVRU5DRV9BU19GT1JNQVRURURfREFURVRJTUUpKSB7CisgICAgICAgIHRpbWVfdCB0ID0gdGltZShOVUxMKTsgLy8gd2Ugd2lsbCBuZWVkIGl0IGluIGVpdGhlciBjYXNlCisgICAgICAgIGlmIChobHMtPnN0YXJ0X3NlcXVlbmNlX3NvdXJjZV90eXBlID09IEhMU19TVEFSVF9TRVFVRU5DRV9BU19TRUNPTkRTX1NJTkNFX0VQT0NIKSB7CisgICAgICAgICAgICBobHMtPnN0YXJ0X3NlcXVlbmNlID0gKGludDY0X3QpdDsKKyAgICAgICAgfSBlbHNlIGlmIChobHMtPnN0YXJ0X3NlcXVlbmNlX3NvdXJjZV90eXBlID09IEhMU19TVEFSVF9TRVFVRU5DRV9BU19GT1JNQVRURURfREFURVRJTUUpIHsKKyAgICAgICAgICAgIGNoYXIgYlsxNV07CisgICAgICAgICAgICBzdHJ1Y3QgdG0gKnAsIHRtYnVmOworICAgICAgICAgICAgaWYgKCEocCA9IGxvY2FsdGltZV9yKCZ0LCAmdG1idWYpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgaWYgKCFzdHJmdGltZShiLCBzaXplb2YoYiksICIlWSVtJWQlSCVNJVMiLCBwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgaGxzLT5zdGFydF9zZXF1ZW5jZSA9IHN0cnRvbGwoYiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhobHMsIEFWX0xPR19ERUJVRywgInN0YXJ0X251bWJlciBldmFsdWF0ZWQgdG8gJSJQUklkNjQiXG4iLCBobHMtPnN0YXJ0X3NlcXVlbmNlKTsKKyAgICB9CisKKyAgICBobHMtPnJlY29yZGluZ190aW1lID0gKGhscy0+aW5pdF90aW1lID8gaGxzLT5pbml0X3RpbWUgOiBobHMtPnRpbWUpICogQVZfVElNRV9CQVNFOworICAgIGZvciAoaSA9IDA7IGkgPCBobHMtPm5iX3ZhcnN0cmVhbXM7IGkrKykgeworICAgICAgICB2cyA9ICZobHMtPnZhcl9zdHJlYW1zW2ldOworCisgICAgICAgIHZzLT5tM3U4X25hbWUgPSBhdl9zdHJkdXAocy0+dXJsKTsKKyAgICAgICAgaWYgKCF2cy0+bTN1OF9uYW1lICkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHJldCA9IGZvcm1hdF9uYW1lKHZzLT5tM3U4X25hbWUsIHN0cmxlbihzLT51cmwpICsgMSwgaSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIHZzLT5zZXF1ZW5jZSAgICAgICA9IGhscy0+c3RhcnRfc2VxdWVuY2U7CisgICAgICAgIHZzLT5zdGFydF9wdHMgICAgICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICB2cy0+ZW5kX3B0cyAgICAgID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIHZzLT5jdXJyZW50X3NlZ21lbnRfZmluYWxfZmlsZW5hbWVfZm10WzBdID0gJ1wwJzsKKworICAgICAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TUExJVF9CWV9USU1FICYmIGhscy0+ZmxhZ3MgJiBITFNfSU5ERVBFTkRFTlRfU0VHTUVOVFMpIHsKKyAgICAgICAgICAgIC8vIEluZGVwZW5kZW50IHNlZ21lbnRzIGNhbm5vdCBiZSBndWFyYW50ZWVkIHdoZW4gc3BsaXR0aW5nIGJ5IHRpbWUKKyAgICAgICAgICAgIGhscy0+ZmxhZ3MgJj0gfkhMU19JTkRFUEVOREVOVF9TRUdNRU5UUzsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAiJ3NwbGl0X2J5X3RpbWUnIGFuZCAnaW5kZXBlbmRlbnRfc2VnbWVudHMnIGNhbm5vdCBiZSBlbmFibGVkIHRvZ2V0aGVyLiAiCisgICAgICAgICAgICAgICAgICAgIkRpc2FibGluZyAnaW5kZXBlbmRlbnRfc2VnbWVudHMnIGZsYWdcbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhscy0+ZmxhZ3MgJiBITFNfUFJPR1JBTV9EQVRFX1RJTUUpIHsKKyAgICAgICAgICAgIHRpbWVfdCBub3cwOworICAgICAgICAgICAgdGltZSgmbm93MCk7CisgICAgICAgICAgICB2cy0+aW5pdGlhbF9wcm9nX2RhdGVfdGltZSA9IG5vdzA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhscy0+Zm9ybWF0X29wdGlvbnNfc3RyKSB7CisgICAgICAgICAgICByZXQgPSBhdl9kaWN0X3BhcnNlX3N0cmluZygmaGxzLT5mb3JtYXRfb3B0aW9ucywgaGxzLT5mb3JtYXRfb3B0aW9uc19zdHIsICI9IiwgIjoiLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBwYXJzZSBmb3JtYXQgb3B0aW9ucyBsaXN0ICclcydcbiIsIGhscy0+Zm9ybWF0X29wdGlvbnNfc3RyKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdnMtPm5iX3N0cmVhbXM7IGorKykgeworICAgICAgICAgICAgdnMtPmhhc192aWRlbyArPSB2cy0+c3RyZWFtc1tqXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgLyogR2V0IG9uZSB2aWRlbyBzdHJlYW0gdG8gcmVmZXJlbmNlIGZvciBzcGxpdCBzZWdtZW50cworICAgICAgICAgICAgICogc28gdXNlIHRoZSBmaXJzdCB2aWRlbyBzdHJlYW0gaW5kZXguICovCisgICAgICAgICAgICBpZiAoKHZzLT5oYXNfdmlkZW8gPT0gMSkgJiYgKHZzLT5zdHJlYW1zW2pdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pKSB7CisgICAgICAgICAgICAgICAgdnMtPnJlZmVyZW5jZV9zdHJlYW1faW5kZXggPSB2cy0+c3RyZWFtc1tqXS0+aW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2cy0+aGFzX3N1YnRpdGxlICs9IHZzLT5zdHJlYW1zW2pdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodnMtPmhhc192aWRlbyA+IDEpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJNb3JlIHRoYW4gYSBzaW5nbGUgdmlkZW8gc3RyZWFtIHByZXNlbnQsIGV4cGVjdCBpc3N1ZXMgZGVjb2RpbmcgaXQuXG4iKTsKKyAgICAgICAgaWYgKGhscy0+c2VnbWVudF90eXBlID09IFNFR01FTlRfVFlQRV9GTVA0KSB7CisgICAgICAgICAgICB2cy0+b2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdCgibXA0IiwgTlVMTCwgTlVMTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2cy0+b2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdCgibXBlZ3RzIiwgTlVMTCwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZzLT5vZm9ybWF0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX01VWEVSX05PVF9GT1VORDsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2cy0+aGFzX3N1YnRpdGxlKSB7CisgICAgICAgICAgICB2cy0+dnR0X29mb3JtYXQgPSBhdl9ndWVzc19mb3JtYXQoIndlYnZ0dCIsIE5VTEwsIE5VTEwpOworICAgICAgICAgICAgaWYgKCF2cy0+b2Zvcm1hdCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGxzLT5zZWdtZW50X2ZpbGVuYW1lKSB7CisgICAgICAgICAgICBiYXNlbmFtZV9zaXplID0gc3RybGVuKGhscy0+c2VnbWVudF9maWxlbmFtZSkgKyAxOworICAgICAgICAgICAgdnMtPmJhc2VuYW1lID0gYXZfbWFsbG9jKGJhc2VuYW1lX3NpemUpOworICAgICAgICAgICAgaWYgKCF2cy0+YmFzZW5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9zdHJsY3B5KHZzLT5iYXNlbmFtZSwgaGxzLT5zZWdtZW50X2ZpbGVuYW1lLCBiYXNlbmFtZV9zaXplKTsKKyAgICAgICAgICAgIHJldCA9IGZvcm1hdF9uYW1lKHZzLT5iYXNlbmFtZSwgYmFzZW5hbWVfc2l6ZSwgaSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSkgeworICAgICAgICAgICAgICAgIGlmIChobHMtPnNlZ21lbnRfdHlwZSA9PSBTRUdNRU5UX1RZUEVfRk1QNCkgeworICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gIi5tNHMiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gPSAiLnRzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChobHMtPnVzZV9sb2NhbHRpbWUpIHsKKyAgICAgICAgICAgICAgICBiYXNlbmFtZV9zaXplID0gc3RybGVuKHZzLT5tM3U4X25hbWUpICsgc3RybGVuKHBhdHRlcm5fbG9jYWx0aW1lX2ZtdCkgKyAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYXNlbmFtZV9zaXplID0gc3RybGVuKHZzLT5tM3U4X25hbWUpICsgc3RybGVuKHBhdHRlcm4pICsgMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdnMtPmJhc2VuYW1lID0gYXZfbWFsbG9jKGJhc2VuYW1lX3NpemUpOworICAgICAgICAgICAgaWYgKCF2cy0+YmFzZW5hbWUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9zdHJsY3B5KHZzLT5iYXNlbmFtZSwgdnMtPm0zdThfbmFtZSwgYmFzZW5hbWVfc2l6ZSk7CisKKyAgICAgICAgICAgIHAgPSBzdHJyY2hyKHZzLT5iYXNlbmFtZSwgJy4nKTsKKyAgICAgICAgICAgIGlmIChwKQorICAgICAgICAgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgICAgIGlmIChobHMtPnVzZV9sb2NhbHRpbWUpIHsKKyAgICAgICAgICAgICAgICBhdl9zdHJsY2F0KHZzLT5iYXNlbmFtZSwgcGF0dGVybl9sb2NhbHRpbWVfZm10LCBiYXNlbmFtZV9zaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfc3RybGNhdCh2cy0+YmFzZW5hbWUsIHBhdHRlcm4sIGJhc2VuYW1lX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGhscy0+c2VnbWVudF90eXBlID09IFNFR01FTlRfVFlQRV9GTVA0KSB7CisgICAgICAgICAgICBpZiAoaGxzLT5uYl92YXJzdHJlYW1zID4gMSkKKyAgICAgICAgICAgICAgICBmbXA0X2luaXRfZmlsZW5hbWVfbGVuICs9IHN0cmxlbihQT1NURklYX1BBVFRFUk4pOworICAgICAgICAgICAgaWYgKGhscy0+ZmxhZ3MgJiBITFNfU0lOR0xFX0ZJTEUpIHsKKyAgICAgICAgICAgICAgICB2cy0+Zm1wNF9pbml0X2ZpbGVuYW1lICA9IGF2X3N0cmR1cCh2cy0+YmFzZW5hbWUpOworICAgICAgICAgICAgICAgIGlmICghdnMtPmZtcDRfaW5pdF9maWxlbmFtZSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZzLT5mbXA0X2luaXRfZmlsZW5hbWUgPSBhdl9tYWxsb2MoZm1wNF9pbml0X2ZpbGVuYW1lX2xlbik7CisgICAgICAgICAgICAgICAgaWYgKCF2cy0+Zm1wNF9pbml0X2ZpbGVuYW1lICkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfc3RybGNweSh2cy0+Zm1wNF9pbml0X2ZpbGVuYW1lLCBobHMtPmZtcDRfaW5pdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtcDRfaW5pdF9maWxlbmFtZV9sZW4pOworICAgICAgICAgICAgICAgIGlmIChobHMtPm5iX3ZhcnN0cmVhbXMgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGFwcGVuZF9wb3N0Zml4KHZzLT5mbXA0X2luaXRfZmlsZW5hbWUsIGZtcDRfaW5pdF9maWxlbmFtZV9sZW4sIGkpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmbXA0X2luaXRfZmlsZW5hbWVfbGVuID0gc3RybGVuKHZzLT5tM3U4X25hbWUpICsKKyAgICAgICAgICAgICAgICAgICAgc3RybGVuKHZzLT5mbXA0X2luaXRfZmlsZW5hbWUpICsgMTsKKworICAgICAgICAgICAgICAgIHZzLT5iYXNlX291dHB1dF9kaXJuYW1lID0gYXZfbWFsbG9jKGZtcDRfaW5pdF9maWxlbmFtZV9sZW4pOworICAgICAgICAgICAgICAgIGlmICghdnMtPmJhc2Vfb3V0cHV0X2Rpcm5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXZfc3RybGNweSh2cy0+YmFzZV9vdXRwdXRfZGlybmFtZSwgdnMtPm0zdThfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtcDRfaW5pdF9maWxlbmFtZV9sZW4pOworICAgICAgICAgICAgICAgIHAgPSBzdHJyY2hyKHZzLT5iYXNlX291dHB1dF9kaXJuYW1lLCAnLycpOworICAgICAgICAgICAgICAgIGlmIChwKSB7CisgICAgICAgICAgICAgICAgICAgICoocCArIDEpID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgYXZfc3RybGNhdCh2cy0+YmFzZV9vdXRwdXRfZGlybmFtZSwgdnMtPmZtcDRfaW5pdF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXA0X2luaXRfZmlsZW5hbWVfbGVuKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdl9zdHJsY3B5KHZzLT5iYXNlX291dHB1dF9kaXJuYW1lLCB2cy0+Zm1wNF9pbml0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtcDRfaW5pdF9maWxlbmFtZV9sZW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghaGxzLT51c2VfbG9jYWx0aW1lKSB7CisgICAgICAgICAgICByZXQgPSBzbHNfZmxhZ19jaGVja19kdXJhdGlvbl9zaXplX2luZGV4KGhscyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IHNsc19mbGFnX2NoZWNrX2R1cmF0aW9uX3NpemUoaGxzLCB2cyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodnMtPmhhc19zdWJ0aXRsZSkgeworCisgICAgICAgICAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19TSU5HTEVfRklMRSkKKyAgICAgICAgICAgICAgICB2dHRfcGF0dGVybiA9ICIudnR0IjsKKyAgICAgICAgICAgIHZ0dF9iYXNlbmFtZV9zaXplID0gc3RybGVuKHZzLT5tM3U4X25hbWUpICsgc3RybGVuKHZ0dF9wYXR0ZXJuKSArIDE7CisKKyAgICAgICAgICAgIHZzLT52dHRfYmFzZW5hbWUgPSBhdl9tYWxsb2ModnR0X2Jhc2VuYW1lX3NpemUpOworICAgICAgICAgICAgaWYgKCF2cy0+dnR0X2Jhc2VuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZzLT52dHRfbTN1OF9uYW1lID0gYXZfbWFsbG9jKHZ0dF9iYXNlbmFtZV9zaXplKTsKKyAgICAgICAgICAgIGlmICghdnMtPnZ0dF9tM3U4X25hbWUgKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X3N0cmxjcHkodnMtPnZ0dF9iYXNlbmFtZSwgdnMtPm0zdThfbmFtZSwgdnR0X2Jhc2VuYW1lX3NpemUpOworICAgICAgICAgICAgcCA9IHN0cnJjaHIodnMtPnZ0dF9iYXNlbmFtZSwgJy4nKTsKKyAgICAgICAgICAgIGlmIChwKQorICAgICAgICAgICAgICAgICpwID0gJ1wwJzsKKworICAgICAgICAgICAgaWYgKCBobHMtPnN1YnRpdGxlX2ZpbGVuYW1lICkgeworICAgICAgICAgICAgICAgIHN0cmNweSh2cy0+dnR0X20zdThfbmFtZSwgaGxzLT5zdWJ0aXRsZV9maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgcmV0ID0gZm9ybWF0X25hbWUodnMtPnZ0dF9tM3U4X25hbWUsIHZ0dF9iYXNlbmFtZV9zaXplLCBpKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkodnMtPnZ0dF9tM3U4X25hbWUsIHZzLT52dHRfYmFzZW5hbWUpOworICAgICAgICAgICAgICAgIGF2X3N0cmxjYXQodnMtPnZ0dF9tM3U4X25hbWUsICJfdnR0Lm0zdTgiLCB2dHRfYmFzZW5hbWVfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9zdHJsY2F0KHZzLT52dHRfYmFzZW5hbWUsIHZ0dF9wYXR0ZXJuLCB2dHRfYmFzZW5hbWVfc2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGxzLT5iYXNldXJsKSB7CisgICAgICAgICAgICB2cy0+YmFzZXVybCA9IGF2X3N0cmR1cChobHMtPmJhc2V1cmwpOworICAgICAgICAgICAgaWYgKCF2cy0+YmFzZXVybCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGhsc19tdXhfaW5pdChzLCB2cykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKworICAgICAgICBpZiAoaGxzLT5mbGFncyAmIEhMU19BUFBFTkRfTElTVCkgeworICAgICAgICAgICAgcGFyc2VfcGxheWxpc3QocywgdnMtPm0zdThfbmFtZSwgdnMpOworICAgICAgICAgICAgdnMtPmRpc2NvbnRpbnVpdHkgPSAxOworICAgICAgICAgICAgaWYgKGhscy0+aW5pdF90aW1lID4gMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImFwcGVuZF9saXN0IG1vZGUgZG9lcyBub3Qgc3VwcG9ydCBobHNfaW5pdF90aW1lLCIKKyAgICAgICAgICAgICAgICAgICAgICAgIiBobHNfaW5pdF90aW1lIHZhbHVlIHdpbGwgaGF2ZSBubyBlZmZlY3RcbiIpOworICAgICAgICAgICAgICAgIGhscy0+aW5pdF90aW1lID0gMDsKKyAgICAgICAgICAgICAgICBobHMtPnJlY29yZGluZ190aW1lID0gaGxzLT50aW1lICogQVZfVElNRV9CQVNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBobHNfc3RhcnQocywgdnMpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCitmYWlsOgorICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyZWVwKCZobHMtPmtleV9iYXNlbmFtZSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBobHMtPm5iX3ZhcnN0cmVhbXMgJiYgaGxzLT52YXJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICB2cyA9ICZobHMtPnZhcl9zdHJlYW1zW2ldOworICAgICAgICAgICAgYXZfZnJlZXAoJnZzLT5iYXNlbmFtZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmdnMtPnZ0dF9iYXNlbmFtZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmdnMtPmZtcDRfaW5pdF9maWxlbmFtZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmdnMtPm0zdThfbmFtZSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmdnMtPnZ0dF9tM3U4X25hbWUpOworICAgICAgICAgICAgYXZfZnJlZXAoJnZzLT5zdHJlYW1zKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2cy0+YWdyb3VwKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZ2cy0+Y2Nncm91cCk7CisgICAgICAgICAgICBhdl9mcmVlcCgmdnMtPmJhc2V1cmwpOworICAgICAgICAgICAgaWYgKHZzLT5hdmYpCisgICAgICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHZzLT5hdmYpOworICAgICAgICAgICAgaWYgKHZzLT52dHRfYXZmKQorICAgICAgICAgICAgICAgIGF2Zm9ybWF0X2ZyZWVfY29udGV4dCh2cy0+dnR0X2F2Zik7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhscy0+bmJfY2NzdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIENsb3NlZENhcHRpb25zU3RyZWFtICpjY3MgPSAmaGxzLT5jY19zdHJlYW1zW2ldOworICAgICAgICAgICAgYXZfZnJlZXAoJmNjcy0+Y2Nncm91cCk7CisgICAgICAgICAgICBhdl9mcmVlcCgmY2NzLT5pbnN0cmVhbWlkKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZjY3MtPmxhbmd1YWdlKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmaGxzLT52YXJfc3RyZWFtcyk7CisgICAgICAgIGF2X2ZyZWVwKCZobHMtPmNjX3N0cmVhbXMpOworICAgICAgICBhdl9mcmVlcCgmaGxzLT5tYXN0ZXJfbTN1OF91cmwpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEhMU0NvbnRleHQsIHgpCiAjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CiAgICAgeyJzdGFydF9udW1iZXIiLCAgInNldCBmaXJzdCBudW1iZXIgaW4gdGhlIHNlcXVlbmNlIiwgICAgICAgIE9GRlNFVChzdGFydF9zZXF1ZW5jZSksQVZfT1BUX1RZUEVfSU5UNjQsICB7Lmk2NCA9IDB9LCAgICAgMCwgSU5UNjRfTUFYLCBFfSwKICAgICB7Imhsc190aW1lIiwgICAgICAic2V0IHNlZ21lbnQgbGVuZ3RoIGluIHNlY29uZHMiLCAgICAgICAgICAgT0ZGU0VUKHRpbWUpLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsID0gMn0sICAgICAwLCBGTFRfTUFYLCBFfSwKKyAgICB7Imhsc19pbml0X3RpbWUiLCAic2V0IHNlZ21lbnQgbGVuZ3RoIGluIHNlY29uZHMgYXQgaW5pdCBsaXN0IiwgICAgICAgICAgIE9GRlNFVChpbml0X3RpbWUpLCAgICBBVl9PUFRfVFlQRV9GTE9BVCwgIHsuZGJsID0gMH0sICAgICAwLCBGTFRfTUFYLCBFfSwKICAgICB7Imhsc19saXN0X3NpemUiLCAic2V0IG1heGltdW0gbnVtYmVyIG9mIHBsYXlsaXN0IGVudHJpZXMiLCAgT0ZGU0VUKG1heF9uYl9zZWdtZW50cyksICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSA1fSwgICAgIDAsIElOVF9NQVgsIEV9LAorICAgIHsiaGxzX2RlbGV0ZV90aHJlc2hvbGQiLCAic2V0IG51bWJlciBvZiB1bnJlZmVyZW5jZWQgc2VnbWVudHMgdG8ga2VlcCBiZWZvcmUgZGVsZXRpbmciLCAgT0ZGU0VUKGhsc19kZWxldGVfdGhyZXNob2xkKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDF9LCAgICAgMSwgSU5UX01BWCwgRX0sCiAgICAgeyJobHNfdHNfb3B0aW9ucyIsInNldCBobHMgbXBlZ3RzIGxpc3Qgb2Ygb3B0aW9ucyBmb3IgdGhlIGNvbnRhaW5lciBmb3JtYXQgdXNlZCBmb3IgaGxzIiwgT0ZGU0VUKGZvcm1hdF9vcHRpb25zX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgIDAsIDAsICAgIEV9LAogICAgIHsiaGxzX3Z0dF9vcHRpb25zIiwic2V0IGhscyB2dHQgbGlzdCBvZiBvcHRpb25zIGZvciB0aGUgY29udGFpbmVyIGZvcm1hdCB1c2VkIGZvciBobHMiLCBPRkZTRVQodnR0X2Zvcm1hdF9vcHRpb25zX3N0ciksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgIDAsIDAsICAgIEV9LAotICAgIHsiaGxzX3dyYXAiLCAgICAgICJzZXQgbnVtYmVyIGFmdGVyIHdoaWNoIHRoZSBpbmRleCB3cmFwcyIsICBPRkZTRVQod3JhcCksICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwfSwgICAgIDAsIElOVF9NQVgsIEV9LAorI2lmIEZGX0FQSV9ITFNfV1JBUAorICAgIHsiaGxzX3dyYXAiLCAgICAgICJzZXQgbnVtYmVyIGFmdGVyIHdoaWNoIHRoZSBpbmRleCB3cmFwcyAod2lsbCBiZSBkZXByZWNhdGVkKSIsICBPRkZTRVQod3JhcCksICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQgPSAwfSwgICAgIDAsIElOVF9NQVgsIEV9LAorI2VuZGlmCiAgICAgeyJobHNfYWxsb3dfY2FjaGUiLCAiZXhwbGljaXRseSBzZXQgd2hldGhlciB0aGUgY2xpZW50IE1BWSAoMSkgb3IgTVVTVCBOT1QgKDApIGNhY2hlIG1lZGlhIHNlZ21lbnRzIiwgT0ZGU0VUKGFsbG93Y2FjaGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCBJTlRfTUlOLCBJTlRfTUFYLCBFfSwKICAgICB7Imhsc19iYXNlX3VybCIsICAidXJsIHRvIHByZXBlbmQgdG8gZWFjaCBwbGF5bGlzdCBlbnRyeSIsICAgT0ZGU0VUKGJhc2V1cmwpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICAgICBFfSwKICAgICB7Imhsc19zZWdtZW50X2ZpbGVuYW1lIiwgImZpbGVuYW1lIHRlbXBsYXRlIGZvciBzZWdtZW50IGZpbGVzIiwgT0ZGU0VUKHNlZ21lbnRfZmlsZW5hbWUpLCAgIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgICAgICAgICAgICAwLCAgICAgICAwLCAgICAgICAgIEV9LAorICAgIHsiaGxzX3NlZ21lbnRfc2l6ZSIsICJtYXhpbXVtIHNpemUgcGVyIHNlZ21lbnQgZmlsZSwgKGluIGJ5dGVzKSIsICBPRkZTRVQobWF4X3NlZ19zaXplKSwgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2NCA9IDB9LCAgICAgICAgICAgICAgIDAsICAgICAgIElOVF9NQVgsICAgRX0sCiAgICAgeyJobHNfa2V5X2luZm9fZmlsZSIsICAgICJmaWxlIHdpdGgga2V5IFVSSSBhbmQga2V5IGZpbGUgcGF0aCIsIE9GRlNFVChrZXlfaW5mb19maWxlKSwgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICBFfSwKKyAgICB7Imhsc19lbmMiLCAgICAiZW5hYmxlIEFFUzEyOCBlbmNyeXB0aW9uIHN1cHBvcnQiLCBPRkZTRVQoZW5jcnlwdCksICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgICAgICAgICAgICAwLCAgICAgICAxLCAgICAgICAgIEV9LAorICAgIHsiaGxzX2VuY19rZXkiLCAgICAiaGV4LWNvZGVkIDE2IGJ5dGUga2V5IHRvIGVuY3J5cHQgdGhlIHNlZ21lbnRzIiwgT0ZGU0VUKGtleSksICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBFfSwKKyAgICB7Imhsc19lbmNfa2V5X3VybCIsICAgICJ1cmwgdG8gYWNjZXNzIHRoZSBrZXkgdG8gZGVjcnlwdCB0aGUgc2VnbWVudHMiLCBPRkZTRVQoa2V5X3VybCksICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAgICAgICAgICAgIDAsICAgICAgIDAsICAgICAgICAgRX0sCisgICAgeyJobHNfZW5jX2l2IiwgICAgImhleC1jb2RlZCAxNiBieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvciIsIE9GRlNFVChpdiksICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAuZmxhZ3MgPSBFfSwKICAgICB7Imhsc19zdWJ0aXRsZV9wYXRoIiwgICAgICJzZXQgcGF0aCBvZiBobHMgc3VidGl0bGVzIiwgT0ZGU0VUKHN1YnRpdGxlX2ZpbGVuYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAgMCwgMCwgICAgRX0sCisgICAgeyJobHNfc2VnbWVudF90eXBlIiwgICAgICJzZXQgaGxzIHNlZ21lbnQgZmlsZXMgdHlwZSIsIE9GRlNFVChzZWdtZW50X3R5cGUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gU0VHTUVOVF9UWVBFX01QRUdUUyB9LCAwLCBTRUdNRU5UX1RZUEVfRk1QNCwgRSwgInNlZ21lbnRfdHlwZSJ9LAorICAgIHsibXBlZ3RzIiwgICAibWFrZSBzZWdtZW50IGZpbGUgdG8gbXBlZ3RzIGZpbGVzIGluIG0zdTgiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBTRUdNRU5UX1RZUEVfTVBFR1RTIH0sIDAsIFVJTlRfTUFYLCAgIEUsICJzZWdtZW50X3R5cGUifSwKKyAgICB7ImZtcDQiLCAgICJtYWtlIHNlZ21lbnQgZmlsZSB0byBmcmFnbWVudCBtcDQgZmlsZXMgaW4gbTN1OCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFNFR01FTlRfVFlQRV9GTVA0IH0sIDAsIFVJTlRfTUFYLCAgIEUsICJzZWdtZW50X3R5cGUifSwKKyAgICB7Imhsc19mbXA0X2luaXRfZmlsZW5hbWUiLCAic2V0IGZyYWdtZW50IG1wNCBmaWxlIGluaXQgZmlsZW5hbWUiLCBPRkZTRVQoZm1wNF9pbml0X2ZpbGVuYW1lKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gImluaXQubXA0In0sICAgICAgICAgICAgMCwgICAgICAgMCwgICAgICAgICBFfSwKICAgICB7Imhsc19mbGFncyIsICAgICAic2V0IGZsYWdzIGFmZmVjdGluZyBITFMgcGxheWxpc3QgYW5kIG1lZGlhIGZpbGUgZ2VuZXJhdGlvbiIsIE9GRlNFVChmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IDAgfSwgMCwgVUlOVF9NQVgsIEUsICJmbGFncyJ9LAogICAgIHsic2luZ2xlX2ZpbGUiLCAgICJnZW5lcmF0ZSBhIHNpbmdsZSBtZWRpYSBmaWxlIGluZGV4ZWQgd2l0aCBieXRlIHJhbmdlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEhMU19TSU5HTEVfRklMRSB9LCAwLCBVSU5UX01BWCwgICBFLCAiZmxhZ3MifSwKKyAgICB7InRlbXBfZmlsZSIsICJ3cml0ZSBzZWdtZW50IHRvIHRlbXBvcmFyeSBmaWxlIGFuZCByZW5hbWUgd2hlbiBjb21wbGV0ZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEhMU19URU1QX0ZJTEUgfSwgMCwgVUlOVF9NQVgsICAgRSwgImZsYWdzIn0sCiAgICAgeyJkZWxldGVfc2VnbWVudHMiLCAiZGVsZXRlIHNlZ21lbnQgZmlsZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIHBhcnQgb2YgdGhlIHBsYXlsaXN0IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gSExTX0RFTEVURV9TRUdNRU5UUyB9LCAwLCBVSU5UX01BWCwgICBFLCAiZmxhZ3MifSwKICAgICB7InJvdW5kX2R1cmF0aW9ucyIsICJyb3VuZCBkdXJhdGlvbnMgaW4gbTN1OCB0byB3aG9sZSBudW1iZXJzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gSExTX1JPVU5EX0RVUkFUSU9OUyB9LCAwLCBVSU5UX01BWCwgICBFLCAiZmxhZ3MifSwKICAgICB7ImRpc2NvbnRfc3RhcnQiLCAic3RhcnQgdGhlIHBsYXlsaXN0IHdpdGggYSBkaXNjb250aW51aXR5IHRhZyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEhMU19ESVNDT05UX1NUQVJUIH0sIDAsIFVJTlRfTUFYLCAgIEUsICJmbGFncyJ9LAogICAgIHsib21pdF9lbmRsaXN0IiwgIkRvIG5vdCBhcHBlbmQgYW4gZW5kbGlzdCB3aGVuIGVuZGluZyBzdHJlYW0iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBITFNfT01JVF9FTkRMSVNUIH0sIDAsIFVJTlRfTUFYLCAgIEUsICJmbGFncyJ9LAotICAgIHsgInVzZV9sb2NhbHRpbWUiLCAic2V0IGZpbGVuYW1lIGV4cGFuc2lvbiB3aXRoIHN0cmZ0aW1lIGF0IHNlZ21lbnQgY3JlYXRpb24iLCBPRkZTRVQodXNlX2xvY2FsdGltZSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCi0gICAgeyJtZXRob2QiLCAic2V0IHRoZSBIVFRQIG1ldGhvZCIsIE9GRlNFVChtZXRob2QpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICBFfSwKLQorICAgIHsic3BsaXRfYnlfdGltZSIsICJzcGxpdCB0aGUgaGxzIHNlZ21lbnQgYnkgdGltZSB3aGljaCB1c2VyIHNldCBieSBobHNfdGltZSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEhMU19TUExJVF9CWV9USU1FIH0sIDAsIFVJTlRfTUFYLCAgIEUsICJmbGFncyJ9LAorICAgIHsiYXBwZW5kX2xpc3QiLCAiYXBwZW5kIHRoZSBuZXcgc2VnbWVudHMgaW50byBvbGQgaGxzIHNlZ21lbnQgbGlzdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEhMU19BUFBFTkRfTElTVCB9LCAwLCBVSU5UX01BWCwgICBFLCAiZmxhZ3MifSwKKyAgICB7InByb2dyYW1fZGF0ZV90aW1lIiwgImFkZCBFWFQtWC1QUk9HUkFNLURBVEUtVElNRSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEhMU19QUk9HUkFNX0RBVEVfVElNRSB9LCAwLCBVSU5UX01BWCwgICBFLCAiZmxhZ3MifSwKKyAgICB7InNlY29uZF9sZXZlbF9zZWdtZW50X2luZGV4IiwgImluY2x1ZGUgc2VnbWVudCBpbmRleCBpbiBzZWdtZW50IGZpbGVuYW1lcyB3aGVuIHVzZV9sb2NhbHRpbWUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBITFNfU0VDT05EX0xFVkVMX1NFR01FTlRfSU5ERVggfSwgMCwgVUlOVF9NQVgsICAgRSwgImZsYWdzIn0sCisgICAgeyJzZWNvbmRfbGV2ZWxfc2VnbWVudF9kdXJhdGlvbiIsICJpbmNsdWRlIHNlZ21lbnQgZHVyYXRpb24gaW4gc2VnbWVudCBmaWxlbmFtZXMgd2hlbiB1c2VfbG9jYWx0aW1lIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gSExTX1NFQ09ORF9MRVZFTF9TRUdNRU5UX0RVUkFUSU9OIH0sIDAsIFVJTlRfTUFYLCAgIEUsICJmbGFncyJ9LAorICAgIHsic2Vjb25kX2xldmVsX3NlZ21lbnRfc2l6ZSIsICJpbmNsdWRlIHNlZ21lbnQgc2l6ZSBpbiBzZWdtZW50IGZpbGVuYW1lcyB3aGVuIHVzZV9sb2NhbHRpbWUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBITFNfU0VDT05EX0xFVkVMX1NFR01FTlRfU0laRSB9LCAwLCBVSU5UX01BWCwgICBFLCAiZmxhZ3MifSwKKyAgICB7InBlcmlvZGljX3Jla2V5IiwgInJlbG9hZCBrZXlpbmZvIGZpbGUgcGVyaW9kaWNhbGx5IGZvciByZS1rZXlpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBITFNfUEVSSU9ESUNfUkVLRVkgfSwgMCwgVUlOVF9NQVgsICAgRSwgImZsYWdzIn0sCisgICAgeyJpbmRlcGVuZGVudF9zZWdtZW50cyIsICJhZGQgRVhULVgtSU5ERVBFTkRFTlQtU0VHTUVOVFMsIHdoZW5ldmVyIGFwcGxpY2FibGUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gSExTX0lOREVQRU5ERU5UX1NFR01FTlRTIH0sIDAsIFVJTlRfTUFYLCBFLCAiZmxhZ3MifSwKKyAgICB7InVzZV9sb2NhbHRpbWUiLCAic2V0IGZpbGVuYW1lIGV4cGFuc2lvbiB3aXRoIHN0cmZ0aW1lIGF0IHNlZ21lbnQgY3JlYXRpb24iLCBPRkZTRVQodXNlX2xvY2FsdGltZSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCisgICAgeyJ1c2VfbG9jYWx0aW1lX21rZGlyIiwgImNyZWF0ZSBsYXN0IGRpcmVjdG9yeSBjb21wb25lbnQgaW4gc3RyZnRpbWUtZ2VuZXJhdGVkIGZpbGVuYW1lIiwgT0ZGU0VUKHVzZV9sb2NhbHRpbWVfbWtkaXIpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDAgfSwgMCwgMSwgRSB9LAorICAgIHsiaGxzX3BsYXlsaXN0X3R5cGUiLCAic2V0IHRoZSBITFMgcGxheWxpc3QgdHlwZSIsIE9GRlNFVChwbF90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFBMQVlMSVNUX1RZUEVfTk9ORSB9LCAwLCBQTEFZTElTVF9UWVBFX05CLTEsIEUsICJwbF90eXBlIiB9LAorICAgIHsiZXZlbnQiLCAiRVZFTlQgcGxheWxpc3QiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBQTEFZTElTVF9UWVBFX0VWRU5UIH0sIElOVF9NSU4sIElOVF9NQVgsIEUsICJwbF90eXBlIiB9LAorICAgIHsidm9kIiwgIlZPRCBwbGF5bGlzdCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IFBMQVlMSVNUX1RZUEVfVk9EIH0sIElOVF9NSU4sIElOVF9NQVgsIEUsICJwbF90eXBlIiB9LAorICAgIHsibWV0aG9kIiwgInNldCB0aGUgSFRUUCBtZXRob2QoZGVmYXVsdDogUFVUKSIsIE9GRlNFVChtZXRob2QpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICBFfSwKKyAgICB7Imhsc19zdGFydF9udW1iZXJfc291cmNlIiwgInNldCBzb3VyY2Ugb2YgZmlyc3QgbnVtYmVyIGluIHNlcXVlbmNlIiwgT0ZGU0VUKHN0YXJ0X3NlcXVlbmNlX3NvdXJjZV90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IEhMU19TVEFSVF9TRVFVRU5DRV9BU19TVEFSVF9OVU1CRVIgfSwgMCwgSExTX1NUQVJUX1NFUVVFTkNFX0FTX0ZPUk1BVFRFRF9EQVRFVElNRSwgRSwgInN0YXJ0X3NlcXVlbmNlX3NvdXJjZV90eXBlIiB9LAorICAgIHsiZ2VuZXJpYyIsICJzdGFydF9udW1iZXIgdmFsdWUgKGRlZmF1bHQpIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gSExTX1NUQVJUX1NFUVVFTkNFX0FTX1NUQVJUX05VTUJFUiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBFLCAic3RhcnRfc2VxdWVuY2Vfc291cmNlX3R5cGUiIH0sCisgICAgeyJlcG9jaCIsICJzZWNvbmRzIHNpbmNlIGVwb2NoIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gSExTX1NUQVJUX1NFUVVFTkNFX0FTX1NFQ09ORFNfU0lOQ0VfRVBPQ0ggfSwgSU5UX01JTiwgSU5UX01BWCwgRSwgInN0YXJ0X3NlcXVlbmNlX3NvdXJjZV90eXBlIiB9LAorICAgIHsiZGF0ZXRpbWUiLCAiY3VycmVudCBkYXRldGltZSBhcyBZWVlZTU1ERGhobW1zcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEhMU19TVEFSVF9TRVFVRU5DRV9BU19GT1JNQVRURURfREFURVRJTUUgfSwgSU5UX01JTiwgSU5UX01BWCwgRSwgInN0YXJ0X3NlcXVlbmNlX3NvdXJjZV90eXBlIiB9LAorICAgIHsiaHR0cF91c2VyX2FnZW50IiwgIm92ZXJyaWRlIFVzZXItQWdlbnQgZmllbGQgaW4gSFRUUCBoZWFkZXIiLCBPRkZTRVQodXNlcl9hZ2VudCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgIDAsIDAsICAgIEV9LAorICAgIHsidmFyX3N0cmVhbV9tYXAiLCAiVmFyaWFudCBzdHJlYW0gbWFwIHN0cmluZyIsIE9GRlNFVCh2YXJfc3RyZWFtX21hcCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgIDAsIDAsICAgIEV9LAorICAgIHsiY2Nfc3RyZWFtX21hcCIsICJDbG9zZWQgY2FwdGlvbnMgc3RyZWFtIG1hcCBzdHJpbmciLCBPRkZTRVQoY2Nfc3RyZWFtX21hcCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBOVUxMfSwgIDAsIDAsICAgIEV9LAorICAgIHsibWFzdGVyX3BsX25hbWUiLCAiQ3JlYXRlIEhMUyBtYXN0ZXIgcGxheWxpc3Qgd2l0aCB0aGlzIG5hbWUiLCBPRkZTRVQobWFzdGVyX3BsX25hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sICAwLCAwLCAgICBFfSwKKyAgICB7Im1hc3Rlcl9wbF9wdWJsaXNoX3JhdGUiLCAiUHVibGlzaCBtYXN0ZXIgcGxheSBsaXN0IGV2ZXJ5IGFmdGVyIHRoaXMgbWFueSBzZWdtZW50IGludGVydmFscyIsIE9GRlNFVChtYXN0ZXJfcHVibGlzaF9yYXRlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBVSU5UX01BWCwgRX0sCisgICAgeyJodHRwX3BlcnNpc3RlbnQiLCAiVXNlIHBlcnNpc3RlbnQgSFRUUCBjb25uZWN0aW9ucyIsIE9GRlNFVChodHRwX3BlcnNpc3RlbnQpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDAgfSwgMCwgMSwgRSB9LAorICAgIHsidGltZW91dCIsICJzZXQgdGltZW91dCBmb3Igc29ja2V0IEkvTyBvcGVyYXRpb25zIiwgT0ZGU0VUKHRpbWVvdXQpLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsIC5mbGFncyA9IEUgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKQEAgLTg5Myw3ICsyODc1LDggQEAKICAgICAuYXVkaW9fY29kZWMgICAgPSBBVl9DT0RFQ19JRF9BQUMsCiAgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfSDI2NCwKICAgICAuc3VidGl0bGVfY29kZWMgPSBBVl9DT0RFQ19JRF9XRUJWVFQsCi0gICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfQUxMT1dfRkxVU0gsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfR0xPQkFMSEVBREVSIHwgQVZGTVRfQUxMT1dfRkxVU0gsCisgICAgLmluaXQgICAgICAgICAgID0gaGxzX2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgID0gaGxzX3dyaXRlX2hlYWRlciwKICAgICAud3JpdGVfcGFja2V0ICAgPSBobHNfd3JpdGVfcGFja2V0LAogICAgIC53cml0ZV90cmFpbGVyICA9IGhsc193cml0ZV90cmFpbGVyLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaGxzcGxheWxpc3QuYyBiL2xpYmF2Zm9ybWF0L2hsc3BsYXlsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjYmZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2hsc3BsYXlsaXN0LmMKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBBcHBsZSBIVFRQIExpdmUgU3RyZWFtaW5nIHNlZ21lbnRlcgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBMdWNhIEJhcmJhdG8KKyAqIENvcHlyaWdodCAoYykgMjAxNyBBa2FtYWkgVGVjaG5vbG9naWVzLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImhsc3BsYXlsaXN0LmgiCisKK3ZvaWQgZmZfaGxzX3dyaXRlX3BsYXlsaXN0X3ZlcnNpb24oQVZJT0NvbnRleHQgKm91dCwgaW50IHZlcnNpb24pIHsKKyAgICBpZiAoIW91dCkKKyAgICAgICAgcmV0dXJuOworICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFRNM1VcbiIpOworICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFQtWC1WRVJTSU9OOiVkXG4iLCB2ZXJzaW9uKTsKK30KKwordm9pZCBmZl9obHNfd3JpdGVfYXVkaW9fcmVuZGl0aW9uKEFWSU9Db250ZXh0ICpvdXQsIGNoYXIgKmFncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSwgaW50IG5hbWVfaWQsIGludCBpc19kZWZhdWx0KSB7CisgICAgaWYgKCFvdXQgfHwgIWFncm91cCB8fCAhZmlsZW5hbWUpCisgICAgICAgIHJldHVybjsKKworICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFQtWC1NRURJQTpUWVBFPUFVRElPLEdST1VQLUlEPVwiZ3JvdXBfJXNcIiIsIGFncm91cCk7CisgICAgYXZpb19wcmludGYob3V0LCAiLE5BTUU9XCJhdWRpb18lZFwiLERFRkFVTFQ9JXMsVVJJPVwiJXNcIlxuIiwgbmFtZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgIGlzX2RlZmF1bHQgPyAiWUVTIiA6ICJOTyIsIGZpbGVuYW1lKTsKK30KKwordm9pZCBmZl9obHNfd3JpdGVfc3RyZWFtX2luZm8oQVZTdHJlYW0gKnN0LCBBVklPQ29udGV4dCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmR3aWR0aCwgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmFncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvZGVjcywgY2hhciAqY2Nncm91cCkgeworCisgICAgaWYgKCFvdXQgfHwgIWZpbGVuYW1lKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWJhbmR3aWR0aCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgIkJhbmR3aWR0aCBpbmZvIG5vdCBhdmFpbGFibGUsIHNldCBhdWRpbyBhbmQgdmlkZW8gYml0cmF0ZXNcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXZpb19wcmludGYob3V0LCAiI0VYVC1YLVNUUkVBTS1JTkY6QkFORFdJRFRIPSVkIiwgYmFuZHdpZHRoKTsKKyAgICBpZiAoc3QgJiYgc3QtPmNvZGVjcGFyLT53aWR0aCA+IDAgJiYgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPiAwKQorICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIsUkVTT0xVVElPTj0lZHglZCIsIHN0LT5jb2RlY3Bhci0+d2lkdGgsCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQpOworICAgIGlmIChjb2RlY3MgJiYgc3RybGVuKGNvZGVjcykgPiAwKQorICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIsQ09ERUNTPVwiJXNcIiIsIGNvZGVjcyk7CisgICAgaWYgKGFncm91cCAmJiBzdHJsZW4oYWdyb3VwKSA+IDApCisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIixBVURJTz1cImdyb3VwXyVzXCIiLCBhZ3JvdXApOworICAgIGlmIChjY2dyb3VwICYmIHN0cmxlbihjY2dyb3VwKSA+IDApCisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIixDTE9TRUQtQ0FQVElPTlM9XCIlc1wiIiwgY2Nncm91cCk7CisgICAgYXZpb19wcmludGYob3V0LCAiXG4lc1xuXG4iLCBmaWxlbmFtZSk7Cit9CisKK3ZvaWQgZmZfaGxzX3dyaXRlX3BsYXlsaXN0X2hlYWRlcihBVklPQ29udGV4dCAqb3V0LCBpbnQgdmVyc2lvbiwgaW50IGFsbG93Y2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRhcmdldF9kdXJhdGlvbiwgaW50NjRfdCBzZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwbGF5bGlzdF90eXBlKSB7CisgICAgaWYgKCFvdXQpCisgICAgICAgIHJldHVybjsKKyAgICBmZl9obHNfd3JpdGVfcGxheWxpc3RfdmVyc2lvbihvdXQsIHZlcnNpb24pOworICAgIGlmIChhbGxvd2NhY2hlID09IDAgfHwgYWxsb3djYWNoZSA9PSAxKSB7CisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFQtWC1BTExPVy1DQUNIRTolc1xuIiwgYWxsb3djYWNoZSA9PSAwID8gIk5PIiA6ICJZRVMiKTsKKyAgICB9CisgICAgYXZpb19wcmludGYob3V0LCAiI0VYVC1YLVRBUkdFVERVUkFUSU9OOiVkXG4iLCB0YXJnZXRfZHVyYXRpb24pOworICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFQtWC1NRURJQS1TRVFVRU5DRTolIlBSSWQ2NCJcbiIsIHNlcXVlbmNlKTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1ZFUkJPU0UsICJFWFQtWC1NRURJQS1TRVFVRU5DRTolIlBSSWQ2NCJcbiIsIHNlcXVlbmNlKTsKKworICAgIGlmIChwbGF5bGlzdF90eXBlID09IFBMQVlMSVNUX1RZUEVfRVZFTlQpIHsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiI0VYVC1YLVBMQVlMSVNULVRZUEU6RVZFTlRcbiIpOworICAgIH0gZWxzZSBpZiAocGxheWxpc3RfdHlwZSA9PSBQTEFZTElTVF9UWVBFX1ZPRCkgeworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIjRVhULVgtUExBWUxJU1QtVFlQRTpWT0RcbiIpOworICAgIH0KK30KKwordm9pZCBmZl9obHNfd3JpdGVfaW5pdF9maWxlKEFWSU9Db250ZXh0ICpvdXQsIGNoYXIgKmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlcmFuZ2VfbW9kZSwgaW50NjRfdCBzaXplLCBpbnQ2NF90IHBvcykgeworICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFQtWC1NQVA6VVJJPVwiJXNcIiIsIGZpbGVuYW1lKTsKKyAgICBpZiAoYnl0ZXJhbmdlX21vZGUpIHsKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiLEJZVEVSQU5HRT1cIiUiUFJJZDY0IkAlIlBSSWQ2NCJcIiIsIHNpemUsIHBvcyk7CisgICAgfQorICAgIGF2aW9fcHJpbnRmKG91dCwgIlxuIik7Cit9CisKK2ludCBmZl9obHNfd3JpdGVfZmlsZV9lbnRyeShBVklPQ29udGV4dCAqb3V0LCBpbnQgaW5zZXJ0X2Rpc2NvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlcmFuZ2VfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGR1cmF0aW9uLCBpbnQgcm91bmRfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSwgaW50NjRfdCBwb3MsIC8vVXNlZCBvbmx5IGlmIEhMU19TSU5HTEVfRklMRSBmbGFnIGlzIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNldXJsLCAvL0lnbm9yZWQgaWYgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSwgZG91YmxlICpwcm9nX2RhdGVfdGltZSkgeworICAgIGlmICghb3V0IHx8ICFmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGlmIChpbnNlcnRfZGlzY29udCkgeworICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIjRVhULVgtRElTQ09OVElOVUlUWVxuIik7CisgICAgfQorICAgIGlmIChyb3VuZF9kdXJhdGlvbikKKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiI0VYVElORjolbGQsXG4iLCAgbHJpbnQoZHVyYXRpb24pKTsKKyAgICBlbHNlCisgICAgICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFRJTkY6JWYsXG4iLCBkdXJhdGlvbik7CisgICAgaWYgKGJ5dGVyYW5nZV9tb2RlKQorICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIjRVhULVgtQllURVJBTkdFOiUiUFJJZDY0IkAlIlBSSWQ2NCJcbiIsIHNpemUsIHBvcyk7CisKKyAgICBpZiAocHJvZ19kYXRlX3RpbWUpIHsKKyAgICAgICAgdGltZV90IHR0LCB3cm9uZ3NlY3M7CisgICAgICAgIGludCBtaWxsaTsKKyAgICAgICAgc3RydWN0IHRtICp0bSwgdG1wYnVmOworICAgICAgICBjaGFyIGJ1ZjBbMTI4XSwgYnVmMVsxMjhdOworICAgICAgICB0dCA9IChpbnQ2NF90KSpwcm9nX2RhdGVfdGltZTsKKyAgICAgICAgbWlsbGkgPSBhdl9jbGlwKGxyaW50KDEwMDAqKCpwcm9nX2RhdGVfdGltZSAtIHR0KSksIDAsIDk5OSk7CisgICAgICAgIHRtID0gbG9jYWx0aW1lX3IoJnR0LCAmdG1wYnVmKTsKKyAgICAgICAgaWYgKCFzdHJmdGltZShidWYwLCBzaXplb2YoYnVmMCksICIlWS0lbS0lZFQlSDolTTolUyIsIHRtKSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgInN0cmZ0aW1lIGVycm9yIGluIGZmX2hsc193cml0ZV9maWxlX2VudHJ5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdHJmdGltZShidWYxLCBzaXplb2YoYnVmMSksICIleiIsIHRtKSB8fCBidWYxWzFdPCcwJyB8fGJ1ZjFbMV0+JzInKSB7CisgICAgICAgICAgICBpbnQgdHpfbWluLCBkc3QgPSB0bS0+dG1faXNkc3Q7CisgICAgICAgICAgICB0bSA9IGdtdGltZV9yKCZ0dCwgJnRtcGJ1Zik7CisgICAgICAgICAgICB0bS0+dG1faXNkc3QgPSBkc3Q7CisgICAgICAgICAgICB3cm9uZ3NlY3MgPSBta3RpbWUodG0pOworICAgICAgICAgICAgdHpfbWluID0gKEZGQUJTKHdyb25nc2VjcyAtIHR0KSArIDMwKSAvIDYwOworICAgICAgICAgICAgc25wcmludGYoYnVmMSwgc2l6ZW9mKGJ1ZjEpLAorICAgICAgICAgICAgICAgICAgICAgIiVjJTAyZCUwMmQiLAorICAgICAgICAgICAgICAgICAgICAgd3JvbmdzZWNzIDw9IHR0ID8gJysnIDogJy0nLAorICAgICAgICAgICAgICAgICAgICAgdHpfbWluIC8gNjAsCisgICAgICAgICAgICAgICAgICAgICB0el9taW4gJSA2MCk7CisgICAgICAgIH0KKyAgICAgICAgYXZpb19wcmludGYob3V0LCAiI0VYVC1YLVBST0dSQU0tREFURS1USU1FOiVzLiUwM2Qlc1xuIiwgYnVmMCwgbWlsbGksIGJ1ZjEpOworICAgICAgICAqcHJvZ19kYXRlX3RpbWUgKz0gZHVyYXRpb247CisgICAgfQorICAgIGlmIChiYXNldXJsKQorICAgICAgICBhdmlvX3ByaW50ZihvdXQsICIlcyIsIGJhc2V1cmwpOworICAgIGF2aW9fcHJpbnRmKG91dCwgIiVzXG4iLCBmaWxlbmFtZSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBmZl9obHNfd3JpdGVfZW5kX2xpc3QgKEFWSU9Db250ZXh0ICpvdXQpIHsKKyAgICBpZiAoIW91dCkKKyAgICAgICAgcmV0dXJuOworICAgIGF2aW9fcHJpbnRmKG91dCwgIiNFWFQtWC1FTkRMSVNUXG4iKTsKK30KKwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaGxzcGxheWxpc3QuaCBiL2xpYmF2Zm9ybWF0L2hsc3BsYXlsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1NGIwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2hsc3BsYXlsaXN0LmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIEFwcGxlIEhUVFAgTGl2ZSBTdHJlYW1pbmcgc2VnbWVudGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIEx1Y2EgQmFyYmF0bworICogQ29weXJpZ2h0IChjKSAyMDE3IEFrYW1haSBUZWNobm9sb2dpZXMsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9ITFNQTEFZTElTVF9ICisjZGVmaW5lIEFWRk9STUFUX0hMU1BMQVlMSVNUX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpby5oIgorCit0eXBlZGVmIGVudW0geworICAgIFBMQVlMSVNUX1RZUEVfTk9ORSwKKyAgICBQTEFZTElTVF9UWVBFX0VWRU5ULAorICAgIFBMQVlMSVNUX1RZUEVfVk9ELAorICAgIFBMQVlMSVNUX1RZUEVfTkIsCit9IFBsYXlsaXN0VHlwZTsKKwordm9pZCBmZl9obHNfd3JpdGVfcGxheWxpc3RfdmVyc2lvbihBVklPQ29udGV4dCAqb3V0LCBpbnQgdmVyc2lvbik7Cit2b2lkIGZmX2hsc193cml0ZV9hdWRpb19yZW5kaXRpb24oQVZJT0NvbnRleHQgKm91dCwgY2hhciAqYWdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpbGVuYW1lLCBpbnQgbmFtZV9pZCwgaW50IGlzX2RlZmF1bHQpOwordm9pZCBmZl9obHNfd3JpdGVfc3RyZWFtX2luZm8oQVZTdHJlYW0gKnN0LCBBVklPQ29udGV4dCAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhbmR3aWR0aCwgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmFncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmNvZGVjcywgY2hhciAqY2Nncm91cCk7Cit2b2lkIGZmX2hsc193cml0ZV9wbGF5bGlzdF9oZWFkZXIoQVZJT0NvbnRleHQgKm91dCwgaW50IHZlcnNpb24sIGludCBhbGxvd2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRfZHVyYXRpb24sIGludDY0X3Qgc2VxdWVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGxheWxpc3RfdHlwZSk7Cit2b2lkIGZmX2hsc193cml0ZV9pbml0X2ZpbGUoQVZJT0NvbnRleHQgKm91dCwgY2hhciAqZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVyYW5nZV9tb2RlLCBpbnQ2NF90IHNpemUsIGludDY0X3QgcG9zKTsKK2ludCBmZl9obHNfd3JpdGVfZmlsZV9lbnRyeShBVklPQ29udGV4dCAqb3V0LCBpbnQgaW5zZXJ0X2Rpc2NvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlcmFuZ2VfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGR1cmF0aW9uLCBpbnQgcm91bmRfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZSwgaW50NjRfdCBwb3MsIC8vVXNlZCBvbmx5IGlmIEhMU19TSU5HTEVfRklMRSBmbGFnIGlzIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNldXJsLCAvL0lnbm9yZWQgaWYgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpmaWxlbmFtZSwgZG91YmxlICpwcm9nX2RhdGVfdGltZSk7Cit2b2lkIGZmX2hsc193cml0ZV9lbmRfbGlzdCAoQVZJT0NvbnRleHQgKm91dCk7CisKKyNlbmRpZiAvKiBBVkZPUk1BVF9ITFNQTEFZTElTVF9IXyAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaGxzcHJvdG8uYyBiL2xpYmF2Zm9ybWF0L2hsc3Byb3RvLmMKaW5kZXggYjhmMmYzNy4uZTdlZjJkOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaGxzcHJvdG8uYworKysgYi9saWJhdmZvcm1hdC9obHNwcm90by5jCkBAIC02OSwxNCArNjksNiBAQAogICAgIGludDY0X3QgbGFzdF9sb2FkX3RpbWU7CiB9IEhMU0NvbnRleHQ7CiAKLXN0YXRpYyBpbnQgcmVhZF9jaG9tcF9saW5lKEFWSU9Db250ZXh0ICpzLCBjaGFyICpidWYsIGludCBtYXhsZW4pCi17Ci0gICAgaW50IGxlbiA9IGZmX2dldF9saW5lKHMsIGJ1ZiwgbWF4bGVuKTsKLSAgICB3aGlsZSAobGVuID4gMCAmJiBhdl9pc3NwYWNlKGJ1ZltsZW4gLSAxXSkpCi0gICAgICAgIGJ1ZlstLWxlbl0gPSAnXDAnOwotICAgIHJldHVybiBsZW47Ci19Ci0KIHN0YXRpYyB2b2lkIGZyZWVfc2VnbWVudF9saXN0KEhMU0NvbnRleHQgKnMpCiB7CiAgICAgaW50IGk7CkBAIC0xMTksMTAgKzExMSwxMCBAQAogCiAgICAgaWYgKChyZXQgPSBmZmlvX29wZW5fd2hpdGVsaXN0KCZpbiwgdXJsLCBBVklPX0ZMQUdfUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgIHJlYWRfY2hvbXBfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICBmZl9nZXRfY2hvbXBfbGluZShpbiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKICAgICBpZiAoc3RyY21wKGxpbmUsICIjRVhUTTNVIikpIHsKICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgZ290byBmYWlsOwpAQCAtMTMxLDcgKzEyMyw3IEBACiAgICAgZnJlZV9zZWdtZW50X2xpc3Qocyk7CiAgICAgcy0+ZmluaXNoZWQgPSAwOwogICAgIHdoaWxlICghYXZpb19mZW9mKGluKSkgewotICAgICAgICByZWFkX2Nob21wX2xpbmUoaW4sIGxpbmUsIHNpemVvZihsaW5lKSk7CisgICAgICAgIGZmX2dldF9jaG9tcF9saW5lKGluLCBsaW5lLCBzaXplb2YobGluZSkpOwogICAgICAgICBpZiAoYXZfc3Ryc3RhcnQobGluZSwgIiNFWFQtWC1TVFJFQU0tSU5GOiIsICZwdHIpKSB7CiAgICAgICAgICAgICBzdHJ1Y3QgdmFyaWFudF9pbmZvIGluZm8gPSB7ezB9fTsKICAgICAgICAgICAgIGlzX3ZhcmlhbnQgPSAxOwpAQCAtMzA3LDcgKzI5OSw3IEBACiAgICAgYXZfbG9nKGgsIEFWX0xPR19ERUJVRywgIm9wZW5pbmcgJXNcbiIsIHVybCk7CiAgICAgcmV0ID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJnMtPnNlZ19oZCwgdXJsLCBBVklPX0ZMQUdfUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpOwogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGlmIChmZl9jaGVja19pbnRlcnJ1cHQoJmgtPmludGVycnVwdF9jYWxsYmFjaykpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOwpAQCAtMzE4LDcgKzMxMCw3IEBACiAgICAgZ290byBzdGFydDsKIH0KIAotVVJMUHJvdG9jb2wgZmZfaGxzX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfaGxzX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJobHMiLAogICAgIC51cmxfb3BlbiAgICAgICA9IGhsc19vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICA9IGhsc19yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaG5tLmMgYi9saWJhdmZvcm1hdC9obm0uYwppbmRleCA4YmQ4MDk3Li4yNGQ0ZTgwIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9obm0uYworKysgYi9saWJhdmZvcm1hdC9obm0uYwpAQCAtMTA4LDE1ICsxMDgsMTUgQEAKICAgICBpZiAoISh2c3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0hOTTRfVklERU87Ci0gICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IDA7Ci0gICAgdnN0LT5jb2RlYy0+d2lkdGggICAgICA9IGhubS0+d2lkdGg7Ci0gICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGhubS0+aGVpZ2h0OwotICAgIHZzdC0+Y29kZWMtPmV4dHJhZGF0YSAgPSBhdl9tYWxsb2N6KDEpOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0hOTTRfVklERU87CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICA9IDA7CisgICAgdnN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IGhubS0+d2lkdGg7CisgICAgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IGhubS0+aGVpZ2h0OworICAgIHZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSAgPSBhdl9tYWxsb2N6KDEpOwogCi0gICAgdnN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAxOwotICAgIG1lbWNweSh2c3QtPmNvZGVjLT5leHRyYWRhdGEsICZobm0tPnZlcnNpb24sIDEpOworICAgIHZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gMTsKKyAgICBtZW1jcHkodnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCAmaG5tLT52ZXJzaW9uLCAxKTsKIAogICAgIHZzdC0+c3RhcnRfdGltZSA9IDA7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2h0dHAuYyBiL2xpYmF2Zm9ybWF0L2h0dHAuYwppbmRleCBkMWI5MWUyLi45NTRlZWUzIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9odHRwLmMKKysrIGIvbGliYXZmb3JtYXQvaHR0cC5jCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKIAogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiaHR0cC5oIgpAQCAtNDgsNiArNDksOCBAQAogI2RlZmluZSBNQVhfUkVESVJFQ1RTIDgKICNkZWZpbmUgSFRUUF9TSU5HTEUgICAxCiAjZGVmaW5lIEhUVFBfTVVUTEkgICAgMgorI2RlZmluZSBNQVhfRVhQSVJZICAgIDE5CisjZGVmaW5lIFdISVRFU1BBQ0VTICIgXG5cdFxyIgogdHlwZWRlZiBlbnVtIHsKICAgICBMT1dFUl9QUk9UTywKICAgICBSRUFEX0hFQURFUlMsCkBAIC02MiwxNSArNjUsMjEgQEAKICAgICBpbnQgbGluZV9jb3VudDsKICAgICBpbnQgaHR0cF9jb2RlOwogICAgIC8qIFVzZWQgaWYgIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBvdGhlcndpc2UgLTEuICovCi0gICAgaW50NjRfdCBjaHVua3NpemU7Ci0gICAgaW50NjRfdCBvZmYsIGVuZF9vZmYsIGZpbGVzaXplOworICAgIHVpbnQ2NF90IGNodW5rc2l6ZTsKKyAgICBpbnQgY2h1bmtlbmQ7CisgICAgdWludDY0X3Qgb2ZmLCBlbmRfb2ZmLCBmaWxlc2l6ZTsKICAgICBjaGFyICpsb2NhdGlvbjsKICAgICBIVFRQQXV0aFN0YXRlIGF1dGhfc3RhdGU7CiAgICAgSFRUUEF1dGhTdGF0ZSBwcm94eV9hdXRoX3N0YXRlOwogICAgIGNoYXIgKmh0dHBfcHJveHk7CiAgICAgY2hhciAqaGVhZGVyczsKICAgICBjaGFyICptaW1lX3R5cGU7CisgICAgY2hhciAqaHR0cF92ZXJzaW9uOwogICAgIGNoYXIgKnVzZXJfYWdlbnQ7CisgICAgY2hhciAqcmVmZXJlcjsKKyNpZiBGRl9BUElfSFRUUF9VU0VSX0FHRU5UCisgICAgY2hhciAqdXNlcl9hZ2VudF9kZXByZWNhdGVkOworI2VuZGlmCiAgICAgY2hhciAqY29udGVudF90eXBlOwogICAgIC8qIFNldCBpZiB0aGUgc2VydmVyIGNvcnJlY3RseSBoYW5kbGVzIENvbm5lY3Rpb246IGNsb3NlIGFuZCB3aWxsIGNsb3NlCiAgICAgICogdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgZmVlZGluZyB1cyB0aGUgY29udGVudC4gKi8KQEAgLTkyLDkgKzEwMSw5IEBACiAgICAgQVZEaWN0aW9uYXJ5ICpjb29raWVfZGljdDsKICAgICBpbnQgaWN5OwogICAgIC8qIGhvdyBtdWNoIGRhdGEgd2FzIHJlYWQgc2luY2UgdGhlIGxhc3QgSUNZIG1ldGFkYXRhIHBhY2tldCAqLwotICAgIGludCBpY3lfZGF0YV9yZWFkOworICAgIHVpbnQ2NF90IGljeV9kYXRhX3JlYWQ7CiAgICAgLyogYWZ0ZXIgaG93IG1hbnkgYnl0ZXMgb2YgcmVhZCBkYXRhIGEgbmV3IG1ldGFkYXRhIHBhY2tldCB3aWxsIGJlIGZvdW5kICovCi0gICAgaW50IGljeV9tZXRhaW50OworICAgIHVpbnQ2NF90IGljeV9tZXRhaW50OwogICAgIGNoYXIgKmljeV9tZXRhZGF0YV9oZWFkZXJzOwogICAgIGNoYXIgKmljeV9tZXRhZGF0YV9wYWNrZXQ7CiAgICAgQVZEaWN0aW9uYXJ5ICptZXRhZGF0YTsKQEAgLTEwOSw3ICsxMTgsNiBAQAogICAgIGludCByZWNvbm5lY3Q7CiAgICAgaW50IHJlY29ubmVjdF9hdF9lb2Y7CiAgICAgaW50IHJlY29ubmVjdF9zdHJlYW1lZDsKLSAgICBpbnQgcmVjb25uZWN0X2RlbGF5OwogICAgIGludCByZWNvbm5lY3RfZGVsYXlfbWF4OwogICAgIGludCBsaXN0ZW47CiAgICAgY2hhciAqcmVzb3VyY2U7CkBAIC0xMzEsMTAgKzEzOSwxNCBAQAogICAgIHsgImhlYWRlcnMiLCAic2V0IGN1c3RvbSBIVFRQIGhlYWRlcnMsIGNhbiBvdmVycmlkZSBidWlsdCBpbiBkZWZhdWx0IGhlYWRlcnMiLCBPRkZTRVQoaGVhZGVycyksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBEIHwgRSB9LAogICAgIHsgImNvbnRlbnRfdHlwZSIsICJzZXQgYSBzcGVjaWZpYyBjb250ZW50IHR5cGUgZm9yIHRoZSBQT1NUIG1lc3NhZ2VzIiwgT0ZGU0VUKGNvbnRlbnRfdHlwZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBEIHwgRSB9LAogICAgIHsgInVzZXJfYWdlbnQiLCAib3ZlcnJpZGUgVXNlci1BZ2VudCBoZWFkZXIiLCBPRkZTRVQodXNlcl9hZ2VudCksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gREVGQVVMVF9VU0VSX0FHRU5UIH0sIDAsIDAsIEQgfSwKLSAgICB7ICJ1c2VyLWFnZW50IiwgIm92ZXJyaWRlIFVzZXItQWdlbnQgaGVhZGVyIiwgT0ZGU0VUKHVzZXJfYWdlbnQpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IERFRkFVTFRfVVNFUl9BR0VOVCB9LCAwLCAwLCBEIH0sCisgICAgeyAicmVmZXJlciIsICJvdmVycmlkZSByZWZlcmVyIGhlYWRlciIsIE9GRlNFVChyZWZlcmVyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sIDAsIDAsIEQgfSwKKyNpZiBGRl9BUElfSFRUUF9VU0VSX0FHRU5UCisgICAgeyAidXNlci1hZ2VudCIsICJvdmVycmlkZSBVc2VyLUFnZW50IGhlYWRlciIsIE9GRlNFVCh1c2VyX2FnZW50X2RlcHJlY2F0ZWQpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IERFRkFVTFRfVVNFUl9BR0VOVCB9LCAwLCAwLCBEIH0sCisjZW5kaWYKICAgICB7ICJtdWx0aXBsZV9yZXF1ZXN0cyIsICJ1c2UgcGVyc2lzdGVudCBjb25uZWN0aW9ucyIsIE9GRlNFVChtdWx0aXBsZV9yZXF1ZXN0cyksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRCB8IEUgfSwKICAgICB7ICJwb3N0X2RhdGEiLCAic2V0IGN1c3RvbSBIVFRQIHBvc3QgZGF0YSIsIE9GRlNFVChwb3N0X2RhdGEpLCBBVl9PUFRfVFlQRV9CSU5BUlksIC5mbGFncyA9IEQgfCBFIH0sCiAgICAgeyAibWltZV90eXBlIiwgImV4cG9ydCB0aGUgTUlNRSB0eXBlIiwgT0ZGU0VUKG1pbWVfdHlwZSksIEFWX09QVF9UWVBFX1NUUklORywgeyAuc3RyID0gTlVMTCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FWFBPUlQgfCBBVl9PUFRfRkxBR19SRUFET05MWSB9LAorICAgIHsgImh0dHBfdmVyc2lvbiIsICJleHBvcnQgdGhlIGh0dHAgcmVzcG9uc2UgdmVyc2lvbiIsIE9GRlNFVChodHRwX3ZlcnNpb24pLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgQVZfT1BUX0ZMQUdfRVhQT1JUIHwgQVZfT1BUX0ZMQUdfUkVBRE9OTFkgfSwKICAgICB7ICJjb29raWVzIiwgInNldCBjb29raWVzIHRvIGJlIHNlbnQgaW4gYXBwbGljYWJsZSBmdXR1cmUgcmVxdWVzdHMsIHVzZSBuZXdsaW5lIGRlbGltaXRlZCBTZXQtQ29va2llIEhUVFAgZmllbGQgdmFsdWUgc3ludGF4IiwgT0ZGU0VUKGNvb2tpZXMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgRCB9LAogICAgIHsgImljeSIsICJyZXF1ZXN0IElDWSBtZXRhZGF0YSIsIE9GRlNFVChpY3kpLCBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAxIH0sIDAsIDEsIEQgfSwKICAgICB7ICJpY3lfbWV0YWRhdGFfaGVhZGVycyIsICJyZXR1cm4gSUNZIG1ldGFkYXRhIGhlYWRlcnMiLCBPRkZTRVQoaWN5X21ldGFkYXRhX2hlYWRlcnMpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgMCwgMCwgQVZfT1BUX0ZMQUdfRVhQT1JUIH0sCkBAIC0xNjIsNiArMTc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmhvc3RzdHIsIGNvbnN0IGNoYXIgKmF1dGgsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwcm94eWF1dGgsIGludCAqbmV3X2xvY2F0aW9uKTsKIHN0YXRpYyBpbnQgaHR0cF9yZWFkX2hlYWRlcihVUkxDb250ZXh0ICpoLCBpbnQgKm5ld19sb2NhdGlvbik7CitzdGF0aWMgaW50IGh0dHBfc2h1dGRvd24oVVJMQ29udGV4dCAqaCwgaW50IGZsYWdzKTsKIAogdm9pZCBmZl9odHRwX2luaXRfYXV0aF9zdGF0ZShVUkxDb250ZXh0ICpkZXN0LCBjb25zdCBVUkxDb250ZXh0ICpzcmMpCiB7CkBAIC0yMjEsNyArMjM0LDcgQEAKICAgICBpZiAoIXMtPmhkKSB7CiAgICAgICAgIGVyciA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZzLT5oZCwgYnVmLCBBVklPX0ZMQUdfUkVBRF9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaywgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpOwogICAgICAgICBpZiAoZXJyIDwgMCkKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMjk2LDcgKzMwOSwzOSBAQAogICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOwogICAgIEFWRGljdGlvbmFyeSAqb3B0aW9ucyA9IE5VTEw7CiAgICAgaW50IHJldDsKKyAgICBjaGFyIGhvc3RuYW1lMVsxMDI0XSwgaG9zdG5hbWUyWzEwMjRdLCBwcm90bzFbMTBdLCBwcm90bzJbMTBdOworICAgIGludCBwb3J0MSwgcG9ydDI7CiAKKyAgICBpZiAoIWgtPnByb3QgfHwKKyAgICAgICAgISghc3RyY21wKGgtPnByb3QtPm5hbWUsICJodHRwIikgfHwKKyAgICAgICAgICAhc3RyY21wKGgtPnByb3QtPm5hbWUsICJodHRwcyIpKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGF2X3VybF9zcGxpdChwcm90bzEsIHNpemVvZihwcm90bzEpLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICBob3N0bmFtZTEsIHNpemVvZihob3N0bmFtZTEpLCAmcG9ydDEsCisgICAgICAgICAgICAgICAgIE5VTEwsIDAsIHMtPmxvY2F0aW9uKTsKKyAgICBhdl91cmxfc3BsaXQocHJvdG8yLCBzaXplb2YocHJvdG8yKSwgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgaG9zdG5hbWUyLCBzaXplb2YoaG9zdG5hbWUyKSwgJnBvcnQyLAorICAgICAgICAgICAgICAgICBOVUxMLCAwLCB1cmkpOworICAgIGlmIChwb3J0MSAhPSBwb3J0MiB8fCBzdHJuY21wKGhvc3RuYW1lMSwgaG9zdG5hbWUyLCBzaXplb2YoaG9zdG5hbWUyKSkgIT0gMCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IHJldXNlIEhUVFAgY29ubmVjdGlvbiBmb3IgZGlmZmVyZW50IGhvc3Q6ICVzOiVkICE9ICVzOiVkXG4iLAorICAgICAgICAgICAgaG9zdG5hbWUxLCBwb3J0MSwKKyAgICAgICAgICAgIGhvc3RuYW1lMiwgcG9ydDIKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAoIXMtPmVuZF9jaHVua2VkX3Bvc3QpIHsKKyAgICAgICAgcmV0ID0gaHR0cF9zaHV0ZG93bihoLCBoLT5mbGFncyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAocy0+d2lsbGNsb3NlKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKKyAgICBzLT5lbmRfY2h1bmtlZF9wb3N0ID0gMDsKKyAgICBzLT5jaHVua2VuZCAgICAgID0gMDsKICAgICBzLT5vZmYgICAgICAgICAgID0gMDsKICAgICBzLT5pY3lfZGF0YV9yZWFkID0gMDsKICAgICBhdl9mcmVlKHMtPmxvY2F0aW9uKTsKQEAgLTMwNCw2ICszNDksNyBAQAogICAgIGlmICghcy0+bG9jYXRpb24pCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKKyAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJPcGVuaW5nIFwnJXNcJyBmb3IgJXNcbiIsIHVyaSwgaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUgPyAid3JpdGluZyIgOiAicmVhZGluZyIpOwogICAgIHJldCA9IGh0dHBfb3Blbl9jbngoaCwgJm9wdGlvbnMpOwogICAgIGF2X2RpY3RfZnJlZSgmb3B0aW9ucyk7CiAgICAgcmV0dXJuIHJldDsKQEAgLTM1NSw3ICs0MDEsNyBAQAogICAgIGNhc2UgMjAwOgogICAgICAgICByZXBseV9jb2RlID0gMjAwOwogICAgICAgICByZXBseV90ZXh0ID0gIk9LIjsKLSAgICAgICAgY29udGVudF90eXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisgICAgICAgIGNvbnRlbnRfdHlwZSA9IHMtPmNvbnRlbnRfdHlwZSA/IHMtPmNvbnRlbnRfdHlwZSA6ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWRVJST1JfSFRUUF9TRVJWRVJfRVJST1I6CiAgICAgY2FzZSA1MDA6CkBAIC0zNzAsMTMgKzQxNiwxNSBAQAogICAgICAgICBtZXNzYWdlX2xlbiA9IHNucHJpbnRmKG1lc3NhZ2UsIHNpemVvZihtZXNzYWdlKSwKICAgICAgICAgICAgICAgICAgIkhUVFAvMS4xICUwM2QgJXNcclxuIgogICAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiAlc1xyXG4iCi0gICAgICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogJXp1XHJcbiIKKyAgICAgICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAlIlNJWkVfU1BFQ0lGSUVSIlxyXG4iCisgICAgICAgICAgICAgICAgICIlcyIKICAgICAgICAgICAgICAgICAgIlxyXG4iCiAgICAgICAgICAgICAgICAgICIlMDNkICVzXHJcbiIsCiAgICAgICAgICAgICAgICAgIHJlcGx5X2NvZGUsCiAgICAgICAgICAgICAgICAgIHJlcGx5X3RleHQsCiAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZSwKICAgICAgICAgICAgICAgICAgc3RybGVuKHJlcGx5X3RleHQpICsgNiwgLy8gMyBkaWdpdCBzdGF0dXMgY29kZSArIHNwYWNlICsgXHJcbgorICAgICAgICAgICAgICAgICBzLT5oZWFkZXJzID8gcy0+aGVhZGVycyA6ICIiLAogICAgICAgICAgICAgICAgICByZXBseV9jb2RlLAogICAgICAgICAgICAgICAgICByZXBseV90ZXh0KTsKICAgICB9IGVsc2UgewpAQCAtMzg1LDEwICs0MzMsMTIgQEAKICAgICAgICAgICAgICAgICAgIkhUVFAvMS4xICUwM2QgJXNcclxuIgogICAgICAgICAgICAgICAgICAiQ29udGVudC1UeXBlOiAlc1xyXG4iCiAgICAgICAgICAgICAgICAgICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG4iCisgICAgICAgICAgICAgICAgICIlcyIKICAgICAgICAgICAgICAgICAgIlxyXG4iLAogICAgICAgICAgICAgICAgICByZXBseV9jb2RlLAogICAgICAgICAgICAgICAgICByZXBseV90ZXh0LAotICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUpOworICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUsCisgICAgICAgICAgICAgICAgIHMtPmhlYWRlcnMgPyBzLT5oZWFkZXJzIDogIiIpOwogICAgIH0KICAgICBhdl9sb2coaCwgQVZfTE9HX1RSQUNFLCAiSFRUUCByZXBseSBoZWFkZXI6IFxuJXMtLS0tXG4iLCBtZXNzYWdlKTsKICAgICBpZiAoKHJldCA9IGZmdXJsX3dyaXRlKHMtPmhkLCBtZXNzYWdlLCBtZXNzYWdlX2xlbikpIDwgMCkKQEAgLTQ1Niw3ICs1MDYsNyBAQAogICAgICAgICBnb3RvIGZhaWw7CiAgICAgaWYgKChyZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmcy0+aGQsIGxvd2VyX3VybCwgQVZJT19GTEFHX1JFQURfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSA8IDApCiAgICAgICAgIGdvdG8gZmFpbDsKICAgICBzLT5oYW5kc2hha2Vfc3RlcCA9IExPV0VSX1BST1RPOwpAQCAtNDgwLDcgKzUzMCw3IEBACiAgICAgZWxzZQogICAgICAgICBoLT5pc19zdHJlYW1lZCA9IDE7CiAKLSAgICBzLT5maWxlc2l6ZSA9IC0xOworICAgIHMtPmZpbGVzaXplID0gVUlOVDY0X01BWDsKICAgICBzLT5sb2NhdGlvbiA9IGF2X3N0cmR1cCh1cmkpOwogICAgIGlmICghcy0+bG9jYXRpb24pCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC01MjYsNyArNTc2LDExIEBACiAgICAgICAgIGdvdG8gZmFpbDsKICAgICBjYy0+aGQgPSBjbDsKICAgICBjYy0+aXNfbXVsdGlfY2xpZW50ID0gMTsKKyAgICByZXR1cm4gMDsKIGZhaWw6CisgICAgaWYgKGMpIHsKKyAgICAgICAgZmZ1cmxfY2xvc2VwKGMpOworICAgIH0KICAgICByZXR1cm4gcmV0OwogfQogCkBAIC02MDcsOSArNjYxLDkgQEAKIAogICAgIGlmICghc3RybmNtcChwLCAiYnl0ZXMgIiwgNikpIHsKICAgICAgICAgcCAgICAgKz0gNjsKLSAgICAgICAgcy0+b2ZmID0gc3RydG9sbChwLCBOVUxMLCAxMCk7CisgICAgICAgIHMtPm9mZiA9IHN0cnRvdWxsKHAsIE5VTEwsIDEwKTsKICAgICAgICAgaWYgKChzbGFzaCA9IHN0cmNocihwLCAnLycpKSAmJiBzdHJsZW4oc2xhc2gpID4gMCkKLSAgICAgICAgICAgIHMtPmZpbGVzaXplID0gc3RydG9sbChzbGFzaCArIDEsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIHMtPmZpbGVzaXplID0gc3RydG91bGwoc2xhc2ggKyAxLCBOVUxMLCAxMCk7CiAgICAgfQogICAgIGlmIChzLT5zZWVrYWJsZSA9PSAtMSAmJiAoIXMtPmlzX2FrYW1haSB8fCBzLT5maWxlc2l6ZSAhPSAyMTQ3NDgzNjQ3KSkKICAgICAgICAgaC0+aXNfc3RyZWFtZWQgPSAwOyAvKiB3ZSBfY2FuXyBpbiBmYWN0IHNlZWsgKi8KQEAgLTY3MSwxMCArNzI1LDExOCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBhcnNlX3NldF9jb29raWVfZXhwaXJ5X3RpbWUoY29uc3QgY2hhciAqZXhwX3N0ciwgc3RydWN0IHRtICpidWYpCit7CisgICAgY2hhciBleHBfYnVmW01BWF9FWFBJUlldOworICAgIGludCBpLCBqLCBleHBfYnVmX2xlbiA9IE1BWF9FWFBJUlktMTsKKyAgICBjaGFyICpleHBpcnk7CisKKyAgICAvLyBzdHJpcCBvZmYgYW55IHB1bmN0dWF0aW9uIG9yIHdoaXRlc3BhY2UKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgZXhwX3N0cltpXSAhPSAnXDAnICYmIGogPCBleHBfYnVmX2xlbjsgaSsrKSB7CisgICAgICAgIGlmICgoZXhwX3N0cltpXSA+PSAnMCcgJiYgZXhwX3N0cltpXSA8PSAnOScpIHx8CisgICAgICAgICAgICAoZXhwX3N0cltpXSA+PSAnQScgJiYgZXhwX3N0cltpXSA8PSAnWicpIHx8CisgICAgICAgICAgICAoZXhwX3N0cltpXSA+PSAnYScgJiYgZXhwX3N0cltpXSA8PSAneicpKSB7CisgICAgICAgICAgICBleHBfYnVmW2pdID0gZXhwX3N0cltpXTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBleHBfYnVmW2pdID0gJ1wwJzsKKyAgICBleHBpcnkgPSBleHBfYnVmOworCisgICAgLy8gbW92ZSB0aGUgc3RyaW5nIGJleW9uZCB0aGUgZGF5IG9mIHdlZWsKKyAgICB3aGlsZSAoKCpleHBpcnkgPCAnMCcgfHwgKmV4cGlyeSA+ICc5JykgJiYgKmV4cGlyeSAhPSAnXDAnKQorICAgICAgICBleHBpcnkrKzsKKworICAgIHJldHVybiBhdl9zbWFsbF9zdHJwdGltZShleHBpcnksICIlZCViJVklSCVNJVMiLCBidWYpID8gMCA6IEFWRVJST1IoRUlOVkFMKTsKK30KKworc3RhdGljIGludCBwYXJzZV9zZXRfY29va2llKGNvbnN0IGNoYXIgKnNldF9jb29raWUsIEFWRGljdGlvbmFyeSAqKmRpY3QpCit7CisgICAgY2hhciAqcGFyYW0sICpuZXh0X3BhcmFtLCAqY3N0ciwgKmJhY2s7CisKKyAgICBpZiAoIXNldF9jb29raWVbMF0pCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCEoY3N0ciA9IGF2X3N0cmR1cChzZXRfY29va2llKSkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICAvLyBzdHJpcCBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgIGJhY2sgPSAmY3N0cltzdHJsZW4oY3N0ciktMV07CisgICAgd2hpbGUgKHN0cmNocihXSElURVNQQUNFUywgKmJhY2spKSB7CisgICAgICAgICpiYWNrPSdcMCc7CisgICAgICAgIGlmIChiYWNrID09IGNzdHIpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYmFjay0tOworICAgIH0KKworICAgIG5leHRfcGFyYW0gPSBjc3RyOworICAgIHdoaWxlICgocGFyYW0gPSBhdl9zdHJ0b2sobmV4dF9wYXJhbSwgIjsiLCAmbmV4dF9wYXJhbSkpKSB7CisgICAgICAgIGNoYXIgKm5hbWUsICp2YWx1ZTsKKyAgICAgICAgcGFyYW0gKz0gc3Ryc3BuKHBhcmFtLCBXSElURVNQQUNFUyk7CisgICAgICAgIGlmICgobmFtZSA9IGF2X3N0cnRvayhwYXJhbSwgIj0iLCAmdmFsdWUpKSkgeworICAgICAgICAgICAgaWYgKGF2X2RpY3Rfc2V0KGRpY3QsIG5hbWUsIHZhbHVlLCAwKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGNzdHIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyZWUoY3N0cik7CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgcGFyc2VfY29va2llKEhUVFBDb250ZXh0ICpzLCBjb25zdCBjaGFyICpwLCBBVkRpY3Rpb25hcnkgKipjb29raWVzKQogeworICAgIEFWRGljdGlvbmFyeSAqbmV3X3BhcmFtcyA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUsICpjb29raWVfZW50cnk7CiAgICAgY2hhciAqZXFsLCAqbmFtZTsKIAorICAgIC8vIGVuc3VyZSB0aGUgY29va2llIGlzIHBhcnNhYmxlCisgICAgaWYgKHBhcnNlX3NldF9jb29raWUocCwgJm5ld19wYXJhbXMpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvLyBpZiB0aGVyZSBpcyBubyBjb29raWUgdmFsdWUgdGhlcmUgaXMgbm90aGluZyB0byBwYXJzZQorICAgIGNvb2tpZV9lbnRyeSA9IGF2X2RpY3RfZ2V0KG5ld19wYXJhbXMsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpOworICAgIGlmICghY29va2llX2VudHJ5IHx8ICFjb29raWVfZW50cnktPnZhbHVlKSB7CisgICAgICAgIGF2X2RpY3RfZnJlZSgmbmV3X3BhcmFtcyk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgdGhlIGNvb2tpZSBpcyBub3QgZXhwaXJlZCBvciBvbGRlciB0aGFuIGFuIGV4aXN0aW5nIHZhbHVlCisgICAgaWYgKChlID0gYXZfZGljdF9nZXQobmV3X3BhcmFtcywgImV4cGlyZXMiLCBOVUxMLCAwKSkgJiYgZS0+dmFsdWUpIHsKKyAgICAgICAgc3RydWN0IHRtIG5ld190bSA9IHswfTsKKyAgICAgICAgaWYgKCFwYXJzZV9zZXRfY29va2llX2V4cGlyeV90aW1lKGUtPnZhbHVlLCAmbmV3X3RtKSkgeworICAgICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmUyOworCisgICAgICAgICAgICAvLyBpZiB0aGUgY29va2llIGhhcyBhbHJlYWR5IGV4cGlyZWQgaWdub3JlIGl0CisgICAgICAgICAgICBpZiAoYXZfdGltZWdtKCZuZXdfdG0pIDwgYXZfZ2V0dGltZSgpIC8gMTAwMDAwMCkgeworICAgICAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmbmV3X3BhcmFtcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIG9ubHkgcmVwbGFjZSBhbiBvbGRlciBjb29raWUgd2l0aCB0aGUgc2FtZSBuYW1lCisgICAgICAgICAgICBlMiA9IGF2X2RpY3RfZ2V0KCpjb29raWVzLCBjb29raWVfZW50cnktPmtleSwgTlVMTCwgMCk7CisgICAgICAgICAgICBpZiAoZTIgJiYgZTItPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpvbGRfcGFyYW1zID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNlX3NldF9jb29raWUocCwgJm9sZF9wYXJhbXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGUyID0gYXZfZGljdF9nZXQob2xkX3BhcmFtcywgImV4cGlyZXMiLCBOVUxMLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUyICYmIGUyLT52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRtIG9sZF90bSA9IHswfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2Vfc2V0X2Nvb2tpZV9leHBpcnlfdGltZShlLT52YWx1ZSwgJm9sZF90bSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXZfdGltZWdtKCZuZXdfdG0pIDwgYXZfdGltZWdtKCZvbGRfdG0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmbmV3X3BhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmb2xkX3BhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZvbGRfcGFyYW1zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9kaWN0X2ZyZWUoJm5ld19wYXJhbXMpOworCiAgICAgLy8gZHVwbGljYXRlIHRoZSBjb29raWUgbmFtZSAoZGljdCB3aWxsIGR1cGUgdGhlIHZhbHVlKQogICAgIGlmICghKGVxbCA9IHN0cmNocihwLCAnPScpKSkgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICBpZiAoIShuYW1lID0gYXZfc3RybmR1cChwLCBlcWwgLSBwKSkpIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC03NTMsNyArOTE1LDcgQEAKICAgICAgICAgICAgIHdoaWxlIChhdl9pc3NwYWNlKCpwKSkKICAgICAgICAgICAgICAgICBwKys7CiAgICAgICAgICAgICByZXNvdXJjZSA9IHA7Ci0gICAgICAgICAgICB3aGlsZSAoIWF2X2lzc3BhY2UoKnApKQorICAgICAgICAgICAgd2hpbGUgKCpwICYmICFhdl9pc3NwYWNlKCpwKSkKICAgICAgICAgICAgICAgICBwKys7CiAgICAgICAgICAgICAqKHArKykgPSAnXDAnOwogICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19UUkFDRSwgIlJlcXVlc3RlZCByZXNvdXJjZTogJXNcbiIsIHJlc291cmNlKTsKQEAgLTc3Myw2ICs5MzUsMTQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfVFJBQ0UsICJIVFRQIHZlcnNpb24gc3RyaW5nOiAlc1xuIiwgdmVyc2lvbik7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYXZfc3RybmNhc2VjbXAocCwgIkhUVFAvMS4wIiwgOCkgPT0gMCkKKyAgICAgICAgICAgICAgICBzLT53aWxsY2xvc2UgPSAxOworICAgICAgICAgICAgd2hpbGUgKCpwICE9ICcvJyAmJiAqcCAhPSAnXDAnKQorICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgIHdoaWxlICgqcCA9PSAnLycpCisgICAgICAgICAgICAgICAgcCsrOworICAgICAgICAgICAgYXZfZnJlZXAoJnMtPmh0dHBfdmVyc2lvbik7CisgICAgICAgICAgICBzLT5odHRwX3ZlcnNpb24gPSBhdl9zdHJuZHVwKHAsIDMpOwogICAgICAgICAgICAgd2hpbGUgKCFhdl9pc3NwYWNlKCpwKSAmJiAqcCAhPSAnXDAnKQogICAgICAgICAgICAgICAgIHArKzsKICAgICAgICAgICAgIHdoaWxlIChhdl9pc3NwYWNlKCpwKSkKQEAgLTc5OSw4ICs5NjksOSBAQAogICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9sb2NhdGlvbihzLCBwKSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAqbmV3X2xvY2F0aW9uID0gMTsKLSAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcCh0YWcsICJDb250ZW50LUxlbmd0aCIpICYmIHMtPmZpbGVzaXplID09IC0xKSB7Ci0gICAgICAgICAgICBzLT5maWxlc2l6ZSA9IHN0cnRvbGwocCwgTlVMTCwgMTApOworICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKHRhZywgIkNvbnRlbnQtTGVuZ3RoIikgJiYKKyAgICAgICAgICAgICAgICAgICBzLT5maWxlc2l6ZSA9PSBVSU5UNjRfTUFYKSB7CisgICAgICAgICAgICBzLT5maWxlc2l6ZSA9IHN0cnRvdWxsKHAsIE5VTEwsIDEwKTsKICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcCh0YWcsICJDb250ZW50LVJhbmdlIikpIHsKICAgICAgICAgICAgIHBhcnNlX2NvbnRlbnRfcmFuZ2UoaCwgcCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAodGFnLCAiQWNjZXB0LVJhbmdlcyIpICYmCkBAIC04MDksNyArOTgwLDcgQEAKICAgICAgICAgICAgIGgtPmlzX3N0cmVhbWVkID0gMDsKICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcCh0YWcsICJUcmFuc2Zlci1FbmNvZGluZyIpICYmCiAgICAgICAgICAgICAgICAgICAgIWF2X3N0cm5jYXNlY21wKHAsICJjaHVua2VkIiwgNykpIHsKLSAgICAgICAgICAgIHMtPmZpbGVzaXplICA9IC0xOworICAgICAgICAgICAgcy0+ZmlsZXNpemUgID0gVUlOVDY0X01BWDsKICAgICAgICAgICAgIHMtPmNodW5rc2l6ZSA9IDA7CiAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAodGFnLCAiV1dXLUF1dGhlbnRpY2F0ZSIpKSB7CiAgICAgICAgICAgICBmZl9odHRwX2F1dGhfaGFuZGxlX2hlYWRlcigmcy0+YXV0aF9zdGF0ZSwgdGFnLCBwKTsKQEAgLTgzMyw3ICsxMDA0LDcgQEAKICAgICAgICAgICAgIGlmIChwYXJzZV9jb29raWUocywgcCwgJnMtPmNvb2tpZV9kaWN0KSkKICAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJVbmFibGUgdG8gcGFyc2UgJyVzJ1xuIiwgcCk7CiAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAodGFnLCAiSWN5LU1ldGFJbnQiKSkgewotICAgICAgICAgICAgcy0+aWN5X21ldGFpbnQgPSBzdHJ0b2xsKHAsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIHMtPmljeV9tZXRhaW50ID0gc3RydG91bGwocCwgTlVMTCwgMTApOwogICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJuY2FzZWNtcCh0YWcsICJJY3ktIiwgNCkpIHsKICAgICAgICAgICAgIGlmICgocmV0ID0gcGFyc2VfaWN5KHMsIHRhZywgcCkpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwpAQCAtODU4LDcgKzEwMjksNyBAQAogICAgIC8vIGNvb2tpZSBzdHJpbmdzIHdpbGwgbG9vayBsaWtlIFNldC1Db29raWUgaGVhZGVyIGZpZWxkIHZhbHVlcy4gIE11bHRpcGxlCiAgICAgLy8gU2V0LUNvb2tpZSBmaWVsZHMgd2lsbCByZXN1bHQgaW4gbXVsdGlwbGUgdmFsdWVzIGRlbGltaXRlZCBieSBhIG5ld2xpbmUKICAgICBpbnQgcmV0ID0gMDsKLSAgICBjaGFyICpuZXh0LCAqY29va2llLCAqc2V0X2Nvb2tpZXMgPSBhdl9zdHJkdXAocy0+Y29va2llcyksICpjc2V0X2Nvb2tpZXMgPSBzZXRfY29va2llczsKKyAgICBjaGFyICpjb29raWUsICpzZXRfY29va2llcyA9IGF2X3N0cmR1cChzLT5jb29raWVzKSwgKm5leHQgPSBzZXRfY29va2llczsKIAogICAgIGlmICghc2V0X2Nvb2tpZXMpIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAKQEAgLTg2Niw4NyArMTAzNyw4MSBAQAogICAgIGF2X2RpY3RfZnJlZSgmcy0+Y29va2llX2RpY3QpOwogCiAgICAgKmNvb2tpZXMgPSBOVUxMOwotICAgIHdoaWxlICgoY29va2llID0gYXZfc3RydG9rKHNldF9jb29raWVzLCAiXG4iLCAmbmV4dCkpKSB7Ci0gICAgICAgIGludCBkb21haW5fb2Zmc2V0ID0gMDsKLSAgICAgICAgY2hhciAqcGFyYW0sICpuZXh0X3BhcmFtLCAqY2RvbWFpbiA9IE5VTEwsICpjcGF0aCA9IE5VTEwsICpjdmFsdWUgPSBOVUxMOwotICAgICAgICBzZXRfY29va2llcyA9IE5VTEw7CisgICAgd2hpbGUgKChjb29raWUgPSBhdl9zdHJ0b2sobmV4dCwgIlxuIiwgJm5leHQpKSkgeworICAgICAgICBBVkRpY3Rpb25hcnkgKmNvb2tpZV9wYXJhbXMgPSBOVUxMOworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqY29va2llX2VudHJ5LCAqZTsKIAogICAgICAgICAvLyBzdG9yZSB0aGUgY29va2llIGluIGEgZGljdCBpbiBjYXNlIGl0IGlzIHVwZGF0ZWQgaW4gdGhlIHJlc3BvbnNlCiAgICAgICAgIGlmIChwYXJzZV9jb29raWUocywgY29va2llLCAmcy0+Y29va2llX2RpY3QpKQogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5hYmxlIHRvIHBhcnNlICclcydcbiIsIGNvb2tpZSk7CiAKLSAgICAgICAgd2hpbGUgKChwYXJhbSA9IGF2X3N0cnRvayhjb29raWUsICI7ICIsICZuZXh0X3BhcmFtKSkpIHsKLSAgICAgICAgICAgIGlmIChjb29raWUpIHsKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBrZXktdmFsdWUgcGFpciBpcyB0aGUgYWN0dWFsIGNvb2tpZSB2YWx1ZQotICAgICAgICAgICAgICAgIGN2YWx1ZSA9IGF2X3N0cmR1cChwYXJhbSk7Ci0gICAgICAgICAgICAgICAgY29va2llID0gTlVMTDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cm5jYXNlY21wKCJwYXRoPSIsICAgcGFyYW0sIDUpKSB7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShjcGF0aCk7Ci0gICAgICAgICAgICAgICAgY3BhdGggPSBhdl9zdHJkdXAoJnBhcmFtWzVdKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF2X3N0cm5jYXNlY21wKCJkb21haW49IiwgcGFyYW0sIDcpKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNvb2tpZSBzcGVjaWZpZXMgYSBzdWItZG9tYWluLCBza2lwIHRoZSBsZWFkaW5nIGRvdCB0aGVyZWJ5Ci0gICAgICAgICAgICAgICAgLy8gc3VwcG9ydGluZyBVUkxzIHRoYXQgcG9pbnQgdG8gc3ViLWRvbWFpbnMgYW5kIHRoZSBtYXN0ZXIgZG9tYWluCi0gICAgICAgICAgICAgICAgaW50IGxlYWRpbmdfZG90ID0gKHBhcmFtWzddID09ICcuJyk7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShjZG9tYWluKTsKLSAgICAgICAgICAgICAgICBjZG9tYWluID0gYXZfc3RyZHVwKCZwYXJhbVs3K2xlYWRpbmdfZG90XSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB1bmtub3duIGF0dHJpYnV0ZXMKKyAgICAgICAgLy8gY29udGludWUgb24gdG8gdGhlIG5leHQgY29va2llIGlmIHRoaXMgb25lIGNhbm5vdCBiZSBwYXJzZWQKKyAgICAgICAgaWYgKHBhcnNlX3NldF9jb29raWUoY29va2llLCAmY29va2llX3BhcmFtcykpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBpZiB0aGUgY29va2llIGhhcyBubyB2YWx1ZSwgc2tpcCBpdAorICAgICAgICBjb29raWVfZW50cnkgPSBhdl9kaWN0X2dldChjb29raWVfcGFyYW1zLCAiIiwgTlVMTCwgQVZfRElDVF9JR05PUkVfU1VGRklYKTsKKyAgICAgICAgaWYgKCFjb29raWVfZW50cnkgfHwgIWNvb2tpZV9lbnRyeS0+dmFsdWUpIHsKKyAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmY29va2llX3BhcmFtcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBjb29raWUgaGFzIGV4cGlyZWQsIGRvbid0IGFkZCBpdAorICAgICAgICBpZiAoKGUgPSBhdl9kaWN0X2dldChjb29raWVfcGFyYW1zLCAiZXhwaXJlcyIsIE5VTEwsIDApKSAmJiBlLT52YWx1ZSkgeworICAgICAgICAgICAgc3RydWN0IHRtIHRtX2J1ZiA9IHswfTsKKyAgICAgICAgICAgIGlmICghcGFyc2Vfc2V0X2Nvb2tpZV9leHBpcnlfdGltZShlLT52YWx1ZSwgJnRtX2J1ZikpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZfdGltZWdtKCZ0bV9idWYpIDwgYXZfZ2V0dGltZSgpIC8gMTAwMDAwMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmNvb2tpZV9wYXJhbXMpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFjZG9tYWluKQotICAgICAgICAgICAgY2RvbWFpbiA9IGF2X3N0cmR1cChkb21haW4pOwogCi0gICAgICAgIC8vIGVuc3VyZSBhbGwgb2YgdGhlIG5lY2Vzc2FyeSB2YWx1ZXMgYXJlIHZhbGlkCi0gICAgICAgIGlmICghY2RvbWFpbiB8fCAhY3BhdGggfHwgIWN2YWx1ZSkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGNvb2tpZSBmb3VuZCwgbm8gdmFsdWUsIHBhdGggb3IgZG9tYWluIHNwZWNpZmllZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGRvbmVfY29va2llOworICAgICAgICAvLyBpZiBubyBkb21haW4gaW4gdGhlIGNvb2tpZSBhc3N1bWUgaXQgYXBwaWVkIHRvIHRoaXMgcmVxdWVzdAorICAgICAgICBpZiAoKGUgPSBhdl9kaWN0X2dldChjb29raWVfcGFyYW1zLCAiZG9tYWluIiwgTlVMTCwgMCkpICYmIGUtPnZhbHVlKSB7CisgICAgICAgICAgICAvLyBmaW5kIHRoZSBvZmZzZXQgY29tcGFyaXNvbiBpcyBvbiB0aGUgbWluIGRvbWFpbiAoYi5jb20sIG5vdCBhLmIuY29tKQorICAgICAgICAgICAgaW50IGRvbWFpbl9vZmZzZXQgPSBzdHJsZW4oZG9tYWluKSAtIHN0cmxlbihlLT52YWx1ZSk7CisgICAgICAgICAgICBpZiAoZG9tYWluX29mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJmNvb2tpZV9wYXJhbXMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYXRjaCB0aGUgY29va2llIGRvbWFpbgorICAgICAgICAgICAgaWYgKGF2X3N0cmNhc2VjbXAoJmRvbWFpbltkb21haW5fb2Zmc2V0XSwgZS0+dmFsdWUpKSB7CisgICAgICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZjb29raWVfcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIGNoZWNrIGlmIHRoZSByZXF1ZXN0IHBhdGggbWF0Y2hlcyB0aGUgY29va2llIHBhdGgKLSAgICAgICAgaWYgKGF2X3N0cm5jYXNlY21wKHBhdGgsIGNwYXRoLCBzdHJsZW4oY3BhdGgpKSkKLSAgICAgICAgICAgIGdvdG8gZG9uZV9jb29raWU7Ci0KLSAgICAgICAgLy8gdGhlIGRvbWFpbiBzaG91bGQgYmUgYXQgbGVhc3QgdGhlIHNpemUgb2Ygb3VyIGNvb2tpZSBkb21haW4KLSAgICAgICAgZG9tYWluX29mZnNldCA9IHN0cmxlbihkb21haW4pIC0gc3RybGVuKGNkb21haW4pOwotICAgICAgICBpZiAoZG9tYWluX29mZnNldCA8IDApCi0gICAgICAgICAgICBnb3RvIGRvbmVfY29va2llOwotCi0gICAgICAgIC8vIG1hdGNoIHRoZSBjb29raWUgZG9tYWluCi0gICAgICAgIGlmIChhdl9zdHJjYXNlY21wKCZkb21haW5bZG9tYWluX29mZnNldF0sIGNkb21haW4pKQotICAgICAgICAgICAgZ290byBkb25lX2Nvb2tpZTsKKyAgICAgICAgLy8gZW5zdXJlIHRoaXMgY29va2llIG1hdGNoZXMgdGhlIHBhdGgKKyAgICAgICAgZSA9IGF2X2RpY3RfZ2V0KGNvb2tpZV9wYXJhbXMsICJwYXRoIiwgTlVMTCwgMCk7CisgICAgICAgIGlmICghZSB8fCBhdl9zdHJuY2FzZWNtcChwYXRoLCBlLT52YWx1ZSwgc3RybGVuKGUtPnZhbHVlKSkpIHsKKyAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmY29va2llX3BhcmFtcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIGNvb2tpZSBwYXJhbWV0ZXJzIG1hdGNoLCBzbyBjb3B5IHRoZSB2YWx1ZQogICAgICAgICBpZiAoISpjb29raWVzKSB7Ci0gICAgICAgICAgICBpZiAoISgqY29va2llcyA9IGF2X3N0cmR1cChjdmFsdWUpKSkgeworICAgICAgICAgICAgaWYgKCEoKmNvb2tpZXMgPSBhdl9hc3ByaW50ZigiJXM9JXMiLCBjb29raWVfZW50cnktPmtleSwgY29va2llX2VudHJ5LT52YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgIGdvdG8gZG9uZV9jb29raWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyICp0bXAgPSAqY29va2llczsKLSAgICAgICAgICAgIHNpemVfdCBzdHJfc2l6ZSA9IHN0cmxlbihjdmFsdWUpICsgc3RybGVuKCpjb29raWVzKSArIDM7CisgICAgICAgICAgICBzaXplX3Qgc3RyX3NpemUgPSBzdHJsZW4oY29va2llX2VudHJ5LT5rZXkpICsgc3RybGVuKGNvb2tpZV9lbnRyeS0+dmFsdWUpICsgc3RybGVuKCpjb29raWVzKSArIDQ7CiAgICAgICAgICAgICBpZiAoISgqY29va2llcyA9IGF2X21hbGxvYyhzdHJfc2l6ZSkpKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgIGdvdG8gZG9uZV9jb29raWU7CisgICAgICAgICAgICAgICAgYXZfZnJlZSh0bXApOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc25wcmludGYoKmNvb2tpZXMsIHN0cl9zaXplLCAiJXM7ICVzIiwgdG1wLCBjdmFsdWUpOworICAgICAgICAgICAgc25wcmludGYoKmNvb2tpZXMsIHN0cl9zaXplLCAiJXM7ICVzPSVzIiwgdG1wLCBjb29raWVfZW50cnktPmtleSwgY29va2llX2VudHJ5LT52YWx1ZSk7CiAgICAgICAgICAgICBhdl9mcmVlKHRtcCk7CiAgICAgICAgIH0KLQotICAgICAgICBkb25lX2Nvb2tpZToKLSAgICAgICAgYXZfZnJlZXAoJmNkb21haW4pOwotICAgICAgICBhdl9mcmVlcCgmY3BhdGgpOwotICAgICAgICBhdl9mcmVlcCgmY3ZhbHVlKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGlmICgqY29va2llcykgYXZfZnJlZXAoY29va2llcyk7Ci0gICAgICAgICAgICBhdl9mcmVlKGNzZXRfY29va2llcyk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9CiAgICAgfQogCi0gICAgYXZfZnJlZShjc2V0X2Nvb2tpZXMpOworICAgIGF2X2ZyZWUoc2V0X2Nvb2tpZXMpOwogCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaGFzX2hlYWRlcihjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmhlYWRlcikKQEAgLTk2Myw3ICsxMTI4LDcgQEAKICAgICBjaGFyIGxpbmVbTUFYX1VSTF9TSVpFXTsKICAgICBpbnQgZXJyID0gMDsKIAotICAgIHMtPmNodW5rc2l6ZSA9IC0xOworICAgIHMtPmNodW5rc2l6ZSA9IFVJTlQ2NF9NQVg7CiAKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGlmICgoZXJyID0gaHR0cF9nZXRfbGluZShzLCBsaW5lLCBzaXplb2YobGluZSkpKSA8IDApCkBAIC05OTcsMTAgKzExNjIsMTEgQEAKICAgICBpbnQgcG9zdCwgZXJyOwogICAgIGNoYXIgaGVhZGVyc1tIVFRQX0hFQURFUlNfU0laRV0gPSAiIjsKICAgICBjaGFyICphdXRoc3RyID0gTlVMTCwgKnByb3h5YXV0aHN0ciA9IE5VTEw7Ci0gICAgaW50NjRfdCBvZmYgPSBzLT5vZmY7CisgICAgdWludDY0X3Qgb2ZmID0gcy0+b2ZmOwogICAgIGludCBsZW4gPSAwOwogICAgIGNvbnN0IGNoYXIgKm1ldGhvZDsKICAgICBpbnQgc2VuZF9leHBlY3RfMTAwID0gMDsKKyAgICBpbnQgcmV0OwogCiAgICAgLyogc2VuZCBodHRwIGhlYWRlciAqLwogICAgIHBvc3QgPSBoLT5mbGFncyAmIEFWSU9fRkxBR19XUklURTsKQEAgLTEwMzMsMTAgKzExOTksMjIgQEAKICAgICAgICAgICAgIHNlbmRfZXhwZWN0XzEwMCA9IDE7CiAgICAgfQogCisjaWYgRkZfQVBJX0hUVFBfVVNFUl9BR0VOVAorICAgIGlmIChzdHJjbXAocy0+dXNlcl9hZ2VudF9kZXByZWNhdGVkLCBERUZBVUxUX1VTRVJfQUdFTlQpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInRoZSB1c2VyLWFnZW50IG9wdGlvbiBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIHVzZXJfYWdlbnQgb3B0aW9uXG4iKTsKKyAgICAgICAgcy0+dXNlcl9hZ2VudCA9IGF2X3N0cmR1cChzLT51c2VyX2FnZW50X2RlcHJlY2F0ZWQpOworICAgIH0KKyNlbmRpZgogICAgIC8qIHNldCBkZWZhdWx0IGhlYWRlcnMgaWYgbmVlZGVkICovCiAgICAgaWYgKCFoYXNfaGVhZGVyKHMtPmhlYWRlcnMsICJcclxuVXNlci1BZ2VudDogIikpCiAgICAgICAgIGxlbiArPSBhdl9zdHJsY2F0ZihoZWFkZXJzICsgbGVuLCBzaXplb2YoaGVhZGVycykgLSBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNlci1BZ2VudDogJXNcclxuIiwgcy0+dXNlcl9hZ2VudCk7CisgICAgaWYgKHMtPnJlZmVyZXIpIHsKKyAgICAgICAgLyogc2V0IGRlZmF1bHQgaGVhZGVycyBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKCFoYXNfaGVhZGVyKHMtPmhlYWRlcnMsICJcclxuUmVmZXJlcjogIikpCisgICAgICAgICAgICBsZW4gKz0gYXZfc3RybGNhdGYoaGVhZGVycyArIGxlbiwgc2l6ZW9mKGhlYWRlcnMpIC0gbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZlcmVyOiAlc1xyXG4iLCBzLT5yZWZlcmVyKTsKKyAgICB9CiAgICAgaWYgKCFoYXNfaGVhZGVyKHMtPmhlYWRlcnMsICJcclxuQWNjZXB0OiAiKSkKICAgICAgICAgbGVuICs9IGF2X3N0cmxjcHkoaGVhZGVycyArIGxlbiwgIkFjY2VwdDogKi8qXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXJzKSAtIGxlbik7CkBAIC0xMDQ1LDcgKzEyMjMsNyBAQAogICAgIC8vIHNlcnZlciBzdXBwb3J0cyBzZWVraW5nIGJ5IGFuYWx5c2luZyB0aGUgcmVwbHkgaGVhZGVycy4KICAgICBpZiAoIWhhc19oZWFkZXIocy0+aGVhZGVycywgIlxyXG5SYW5nZTogIikgJiYgIXBvc3QgJiYgKHMtPm9mZiA+IDAgfHwgcy0+ZW5kX29mZiB8fCBzLT5zZWVrYWJsZSA9PSAtMSkpIHsKICAgICAgICAgbGVuICs9IGF2X3N0cmxjYXRmKGhlYWRlcnMgKyBsZW4sIHNpemVvZihoZWFkZXJzKSAtIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYW5nZTogYnl0ZXM9JSJQUklkNjQiLSIsIHMtPm9mZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmFuZ2U6IGJ5dGVzPSUiUFJJdTY0Ii0iLCBzLT5vZmYpOwogICAgICAgICBpZiAocy0+ZW5kX29mZikKICAgICAgICAgICAgIGxlbiArPSBhdl9zdHJsY2F0ZihoZWFkZXJzICsgbGVuLCBzaXplb2YoaGVhZGVycykgLSBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiUFJJZDY0LCBzLT5lbmRfb2ZmIC0gMSk7CkBAIC0xMDkxLDcgKzEyNjksNyBAQAogICAgIGlmIChzLT5oZWFkZXJzKQogICAgICAgICBhdl9zdHJsY3B5KGhlYWRlcnMgKyBsZW4sIHMtPmhlYWRlcnMsIHNpemVvZihoZWFkZXJzKSAtIGxlbik7CiAKLSAgICBzbnByaW50ZihzLT5idWZmZXIsIHNpemVvZihzLT5idWZmZXIpLAorICAgIHJldCA9IHNucHJpbnRmKHMtPmJ1ZmZlciwgc2l6ZW9mKHMtPmJ1ZmZlciksCiAgICAgICAgICAgICAgIiVzICVzIEhUVFAvMS4xXHJcbiIKICAgICAgICAgICAgICAiJXMiCiAgICAgICAgICAgICAgIiVzIgpAQCAtMTEwNyw2ICsxMjg1LDE0IEBACiAKICAgICBhdl9sb2coaCwgQVZfTE9HX0RFQlVHLCAicmVxdWVzdDogJXNcbiIsIHMtPmJ1ZmZlcik7CiAKKyAgICBpZiAoc3RybGVuKGhlYWRlcnMpICsgMSA9PSBzaXplb2YoaGVhZGVycykgfHwKKyAgICAgICAgcmV0ID49IHNpemVvZihzLT5idWZmZXIpKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJvdmVybG9uZyBoZWFkZXJzXG4iKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGRvbmU7CisgICAgfQorCisKICAgICBpZiAoKGVyciA9IGZmdXJsX3dyaXRlKHMtPmhkLCBzLT5idWZmZXIsIHN0cmxlbihzLT5idWZmZXIpKSkgPCAwKQogICAgICAgICBnb3RvIGRvbmU7CiAKQEAgLTExMjAsMTAgKzEzMDYsMTMgQEAKICAgICBzLT5saW5lX2NvdW50ICAgICAgID0gMDsKICAgICBzLT5vZmYgICAgICAgICAgICAgID0gMDsKICAgICBzLT5pY3lfZGF0YV9yZWFkICAgID0gMDsKLSAgICBzLT5maWxlc2l6ZSAgICAgICAgID0gLTE7CisgICAgcy0+ZmlsZXNpemUgICAgICAgICA9IFVJTlQ2NF9NQVg7CiAgICAgcy0+d2lsbGNsb3NlICAgICAgICA9IDA7CiAgICAgcy0+ZW5kX2NodW5rZWRfcG9zdCA9IDA7CiAgICAgcy0+ZW5kX2hlYWRlciAgICAgICA9IDA7CisjaWYgQ09ORklHX1pMSUIKKyAgICBzLT5jb21wcmVzc2VkICAgICAgID0gMDsKKyNlbmRpZgogICAgIGlmIChwb3N0ICYmICFzLT5wb3N0X2RhdGEgJiYgIXNlbmRfZXhwZWN0XzEwMCkgewogICAgICAgICAvKiBQcmV0ZW5kIHRoYXQgaXQgZGlkIHdvcmsuIFdlIGRpZG4ndCByZWFkIGFueSBoZWFkZXIgeWV0LCBzaW5jZQogICAgICAgICAgKiB3ZSd2ZSBzdGlsbCB0byBzZW5kIHRoZSBQT1NUIGRhdGEsIGJ1dCB0aGUgY29kZSBjYWxsaW5nIHRoaXMKQEAgLTExNTIsNiArMTM0MSw0NSBAQAogewogICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOwogICAgIGludCBsZW47CisKKyAgICBpZiAocy0+Y2h1bmtzaXplICE9IFVJTlQ2NF9NQVgpIHsKKyAgICAgICAgaWYgKHMtPmNodW5rZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzLT5jaHVua3NpemUpIHsKKyAgICAgICAgICAgIGNoYXIgbGluZVszMl07CisgICAgICAgICAgICBpbnQgZXJyOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBodHRwX2dldF9saW5lKHMsIGxpbmUsIHNpemVvZihsaW5lKSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0gd2hpbGUgKCEqbGluZSk7ICAgIC8qIHNraXAgQ1IgTEYgZnJvbSBsYXN0IGNodW5rICovCisKKyAgICAgICAgICAgIHMtPmNodW5rc2l6ZSA9IHN0cnRvdWxsKGxpbmUsIE5VTEwsIDE2KTsKKworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19UUkFDRSwKKyAgICAgICAgICAgICAgICAgICAiQ2h1bmtlZCBlbmNvZGluZyBkYXRhIHNpemU6ICUiUFJJdTY0IlxuIiwKKyAgICAgICAgICAgICAgICAgICAgcy0+Y2h1bmtzaXplKTsKKworICAgICAgICAgICAgaWYgKCFzLT5jaHVua3NpemUgJiYgcy0+bXVsdGlwbGVfcmVxdWVzdHMpIHsKKyAgICAgICAgICAgICAgICBodHRwX2dldF9saW5lKHMsIGxpbmUsIHNpemVvZihsaW5lKSk7IC8vIHJlYWQgZW1wdHkgY2h1bmsKKyAgICAgICAgICAgICAgICBzLT5jaHVua2VuZCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghcy0+Y2h1bmtzaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19ERUJVRywgIkxhc3QgY2h1bmsgcmVjZWl2ZWQsIGNsb3NpbmcgY29ublxuIik7CisgICAgICAgICAgICAgICAgZmZ1cmxfY2xvc2VwKCZzLT5oZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChzLT5jaHVua3NpemUgPT0gVUlOVDY0X01BWCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGNodW5rIHNpemUgJSJQUkl1NjQiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5jaHVua3NpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIHMtPmNodW5rc2l6ZSk7CisgICAgfQorCiAgICAgLyogcmVhZCBieXRlcyBmcm9tIGlucHV0IGJ1ZmZlciBmaXJzdCAqLwogICAgIGxlbiA9IHMtPmJ1Zl9lbmQgLSBzLT5idWZfcHRyOwogICAgIGlmIChsZW4gPiAwKSB7CkBAIC0xMTYwLDE1ICsxMzg4LDEzIEBACiAgICAgICAgIG1lbWNweShidWYsIHMtPmJ1Zl9wdHIsIGxlbik7CiAgICAgICAgIHMtPmJ1Zl9wdHIgKz0gbGVuOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDY0X3QgdGFyZ2V0X2VuZCA9IHMtPmVuZF9vZmYgPyBzLT5lbmRfb2ZmIDogcy0+ZmlsZXNpemU7Ci0gICAgICAgIGlmICgoIXMtPndpbGxjbG9zZSB8fCBzLT5jaHVua3NpemUgPCAwKSAmJgotICAgICAgICAgICAgdGFyZ2V0X2VuZCA+PSAwICYmIHMtPm9mZiA+PSB0YXJnZXRfZW5kKQorICAgICAgICB1aW50NjRfdCB0YXJnZXRfZW5kID0gcy0+ZW5kX29mZiA/IHMtPmVuZF9vZmYgOiBzLT5maWxlc2l6ZTsKKyAgICAgICAgaWYgKCghcy0+d2lsbGNsb3NlIHx8IHMtPmNodW5rc2l6ZSA9PSBVSU5UNjRfTUFYKSAmJiBzLT5vZmYgPj0gdGFyZ2V0X2VuZCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKICAgICAgICAgbGVuID0gZmZ1cmxfcmVhZChzLT5oZCwgYnVmLCBzaXplKTsKLSAgICAgICAgaWYgKCFsZW4gJiYgKCFzLT53aWxsY2xvc2UgfHwgcy0+Y2h1bmtzaXplIDwgMCkgJiYKLSAgICAgICAgICAgIHRhcmdldF9lbmQgPj0gMCAmJiBzLT5vZmYgPCB0YXJnZXRfZW5kKSB7CisgICAgICAgIGlmICghbGVuICYmICghcy0+d2lsbGNsb3NlIHx8IHMtPmNodW5rc2l6ZSA9PSBVSU5UNjRfTUFYKSAmJiBzLT5vZmYgPCB0YXJnZXRfZW5kKSB7CiAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJTdHJlYW0gZW5kcyBwcmVtYXR1cmVseSBhdCAlIlBSSWQ2NCIsIHNob3VsZCBiZSAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgIlN0cmVhbSBlbmRzIHByZW1hdHVyZWx5IGF0ICUiUFJJdTY0Iiwgc2hvdWxkIGJlICUiUFJJdTY0IlxuIiwKICAgICAgICAgICAgICAgICAgICBzLT5vZmYsIHRhcmdldF9lbmQKICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwpAQCAtMTE3Niw4ICsxNDAyLDEwIEBACiAgICAgfQogICAgIGlmIChsZW4gPiAwKSB7CiAgICAgICAgIHMtPm9mZiArPSBsZW47Ci0gICAgICAgIGlmIChzLT5jaHVua3NpemUgPiAwKQorICAgICAgICBpZiAocy0+Y2h1bmtzaXplID4gMCAmJiBzLT5jaHVua3NpemUgIT0gVUlOVDY0X01BWCkgeworICAgICAgICAgICAgYXZfYXNzZXJ0MChzLT5jaHVua3NpemUgPj0gbGVuKTsKICAgICAgICAgICAgIHMtPmNodW5rc2l6ZSAtPSBsZW47CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGxlbjsKIH0KQEAgLTEyMjAsNyArMTQ0OCw5IEBACiBzdGF0aWMgaW50IGh0dHBfcmVhZF9zdHJlYW0oVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKIHsKICAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKLSAgICBpbnQgZXJyLCBuZXdfbG9jYXRpb24sIHJlYWRfcmV0LCBzZWVrX3JldDsKKyAgICBpbnQgZXJyLCBuZXdfbG9jYXRpb24sIHJlYWRfcmV0OworICAgIGludDY0X3Qgc2Vla19yZXQ7CisgICAgaW50IHJlY29ubmVjdF9kZWxheSA9IDA7CiAKICAgICBpZiAoIXMtPmhkKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CkBAIC0xMjMxLDQ5ICsxNDYxLDQwIEBACiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGlmIChzLT5jaHVua3NpemUgPj0gMCkgewotICAgICAgICBpZiAoIXMtPmNodW5rc2l6ZSkgewotICAgICAgICAgICAgY2hhciBsaW5lWzMyXTsKLQotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChlcnIgPSBodHRwX2dldF9saW5lKHMsIGxpbmUsIHNpemVvZihsaW5lKSkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoISpsaW5lKTsgICAgLyogc2tpcCBDUiBMRiBmcm9tIGxhc3QgY2h1bmsgKi8KLQotICAgICAgICAgICAgICAgIHMtPmNodW5rc2l6ZSA9IHN0cnRvbGwobGluZSwgTlVMTCwgMTYpOwotCi0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19UUkFDRSwgIkNodW5rZWQgZW5jb2RpbmcgZGF0YSBzaXplOiAlIlBSSWQ2NCInXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2h1bmtzaXplKTsKLQotICAgICAgICAgICAgICAgIGlmICghcy0+Y2h1bmtzaXplKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBzaXplID0gRkZNSU4oc2l6ZSwgcy0+Y2h1bmtzaXplKTsKLSAgICB9CiAjaWYgQ09ORklHX1pMSUIKICAgICBpZiAocy0+Y29tcHJlc3NlZCkKICAgICAgICAgcmV0dXJuIGh0dHBfYnVmX3JlYWRfY29tcHJlc3NlZChoLCBidWYsIHNpemUpOwogI2VuZGlmIC8qIENPTkZJR19aTElCICovCiAgICAgcmVhZF9yZXQgPSBodHRwX2J1Zl9yZWFkKGgsIGJ1Ziwgc2l6ZSk7Ci0gICAgaWYgKCAgIChyZWFkX3JldCAgPCAwICYmIHMtPnJlY29ubmVjdCAgICAgICAgJiYgKCFoLT5pc19zdHJlYW1lZCB8fCBzLT5yZWNvbm5lY3Rfc3RyZWFtZWQpICYmIHMtPmZpbGVzaXplID4gMCAmJiBzLT5vZmYgPCBzLT5maWxlc2l6ZSkKLSAgICAgICAgfHwgKHJlYWRfcmV0ID09IDAgJiYgcy0+cmVjb25uZWN0X2F0X2VvZiAmJiAoIWgtPmlzX3N0cmVhbWVkIHx8IHMtPnJlY29ubmVjdF9zdHJlYW1lZCkpKSB7Ci0gICAgICAgIGludDY0X3QgdGFyZ2V0ID0gaC0+aXNfc3RyZWFtZWQgPyAwIDogcy0+b2ZmOworICAgIHdoaWxlIChyZWFkX3JldCA8IDApIHsKKyAgICAgICAgdWludDY0X3QgdGFyZ2V0ID0gaC0+aXNfc3RyZWFtZWQgPyAwIDogcy0+b2ZmOwogCi0gICAgICAgIGlmIChzLT5yZWNvbm5lY3RfZGVsYXkgPiBzLT5yZWNvbm5lY3RfZGVsYXlfbWF4KQorICAgICAgICBpZiAocmVhZF9yZXQgPT0gQVZFUlJPUl9FWElUKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYgKGgtPmlzX3N0cmVhbWVkICYmICFzLT5yZWNvbm5lY3Rfc3RyZWFtZWQpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiAoIShzLT5yZWNvbm5lY3QgJiYgcy0+ZmlsZXNpemUgPiAwICYmIHMtPm9mZiA8IHMtPmZpbGVzaXplKSAmJgorICAgICAgICAgICAgIShzLT5yZWNvbm5lY3RfYXRfZW9mICYmIHJlYWRfcmV0ID09IEFWRVJST1JfRU9GKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChyZWNvbm5lY3RfZGVsYXkgPiBzLT5yZWNvbm5lY3RfZGVsYXlfbWF4KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAotICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0lORk8sICJXaWxsIHJlY29ubmVjdCBhdCAlIlBSSWQ2NCIgZXJyb3I9JXMuXG4iLCBzLT5vZmYsIGF2X2VycjJzdHIocmVhZF9yZXQpKTsKLSAgICAgICAgYXZfdXNsZWVwKDEwMDBVKjEwMDAqcy0+cmVjb25uZWN0X2RlbGF5KTsKLSAgICAgICAgcy0+cmVjb25uZWN0X2RlbGF5ID0gMSArIDIqcy0+cmVjb25uZWN0X2RlbGF5OworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICJXaWxsIHJlY29ubmVjdCBhdCAlIlBSSXU2NCIgaW4gJWQgc2Vjb25kKHMpLCBlcnJvcj0lcy5cbiIsIHMtPm9mZiwgcmVjb25uZWN0X2RlbGF5LCBhdl9lcnIyc3RyKHJlYWRfcmV0KSk7CisgICAgICAgIGVyciA9IGZmX25ldHdvcmtfc2xlZXBfaW50ZXJydXB0aWJsZSgxMDAwVSoxMDAwKnJlY29ubmVjdF9kZWxheSwgJmgtPmludGVycnVwdF9jYWxsYmFjayk7CisgICAgICAgIGlmIChlcnIgIT0gQVZFUlJPUihFVElNRURPVVQpKQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgcmVjb25uZWN0X2RlbGF5ID0gMSArIDIqcmVjb25uZWN0X2RlbGF5OwogICAgICAgICBzZWVrX3JldCA9IGh0dHBfc2Vla19pbnRlcm5hbChoLCB0YXJnZXQsIFNFRUtfU0VULCAxKTsKLSAgICAgICAgaWYgKHNlZWtfcmV0ICE9IHRhcmdldCkgewotICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWNvbm5lY3QgYXQgJSJQUklkNjQiLlxuIiwgdGFyZ2V0KTsKKyAgICAgICAgaWYgKHNlZWtfcmV0ID49IDAgJiYgc2Vla19yZXQgIT0gdGFyZ2V0KSB7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlY29ubmVjdCBhdCAlIlBSSXU2NCIuXG4iLCB0YXJnZXQpOwogICAgICAgICAgICAgcmV0dXJuIHJlYWRfcmV0OwogICAgICAgICB9CiAKICAgICAgICAgcmVhZF9yZXQgPSBodHRwX2J1Zl9yZWFkKGgsIGJ1Ziwgc2l6ZSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHMtPnJlY29ubmVjdF9kZWxheSA9IDA7CisgICAgfQogCiAgICAgcmV0dXJuIHJlYWRfcmV0OwogfQpAQCAtMTMyMiwxMCArMTU0MywxMSBAQAogewogICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOwogICAgIC8qIHVudGlsIG5leHQgbWV0YWRhdGEgcGFja2V0ICovCi0gICAgaW50IHJlbWFpbmluZyA9IHMtPmljeV9tZXRhaW50IC0gcy0+aWN5X2RhdGFfcmVhZDsKKyAgICB1aW50NjRfdCByZW1haW5pbmc7CiAKLSAgICBpZiAocmVtYWluaW5nIDwgMCkKKyAgICBpZiAocy0+aWN5X21ldGFpbnQgPCBzLT5pY3lfZGF0YV9yZWFkKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICByZW1haW5pbmcgPSBzLT5pY3lfbWV0YWludCAtIHMtPmljeV9kYXRhX3JlYWQ7CiAKICAgICBpZiAoIXJlbWFpbmluZykgewogICAgICAgICAvKiBUaGUgbWV0YWRhdGEgcGFja2V0IGlzIHZhcmlhYmxlIHNpemVkLiBJdCBoYXMgYSAxIGJ5dGUgaGVhZGVyCkBAIC0xNDM5LDcgKzE2NjEsNyBAQAogewogICAgIEhUVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOwogICAgIFVSTENvbnRleHQgKm9sZF9oZCA9IHMtPmhkOwotICAgIGludDY0X3Qgb2xkX29mZiA9IHMtPm9mZjsKKyAgICB1aW50NjRfdCBvbGRfb2ZmID0gcy0+b2ZmOwogICAgIHVpbnQ4X3Qgb2xkX2J1ZltCVUZGRVJfU0laRV07CiAgICAgaW50IG9sZF9idWZfc2l6ZSwgcmV0OwogICAgIEFWRGljdGlvbmFyeSAqb3B0aW9ucyA9IE5VTEw7CkBAIC0xNDUwLDcgKzE2NzIsNyBAQAogICAgICAgICAgICAgICgod2hlbmNlID09IFNFRUtfQ1VSICYmIG9mZiA9PSAwKSB8fAogICAgICAgICAgICAgICAod2hlbmNlID09IFNFRUtfU0VUICYmIG9mZiA9PSBzLT5vZmYpKSkKICAgICAgICAgcmV0dXJuIHMtPm9mZjsKLSAgICBlbHNlIGlmICgocy0+ZmlsZXNpemUgPT0gLTEgJiYgd2hlbmNlID09IFNFRUtfRU5EKSkKKyAgICBlbHNlIGlmICgocy0+ZmlsZXNpemUgPT0gVUlOVDY0X01BWCAmJiB3aGVuY2UgPT0gU0VFS19FTkQpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogCiAgICAgaWYgKHdoZW5jZSA9PSBTRUVLX0NVUikKQEAgLTE0OTcsNiArMTcxOSwxMiBAQAogICAgIHJldHVybiBmZnVybF9nZXRfZmlsZV9oYW5kbGUocy0+aGQpOwogfQogCitzdGF0aWMgaW50IGh0dHBfZ2V0X3Nob3J0X3NlZWsoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBIVFRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZ1cmxfZ2V0X3Nob3J0X3NlZWsocy0+aGQpOworfQorCiAjZGVmaW5lIEhUVFBfQ0xBU1MoZmxhdm9yKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmxhdm9yICMjIF9jb250ZXh0X2NsYXNzID0geyAgIFwKICAgICAuY2xhc3NfbmFtZSA9ICMgZmxhdm9yLCAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNTA4LDcgKzE3MzYsNyBAQAogI2lmIENPTkZJR19IVFRQX1BST1RPQ09MCiBIVFRQX0NMQVNTKGh0dHApOwogCi1VUkxQcm90b2NvbCBmZl9odHRwX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfaHR0cF9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJodHRwIiwKICAgICAudXJsX29wZW4yICAgICAgICAgICA9IGh0dHBfb3BlbiwKICAgICAudXJsX2FjY2VwdCAgICAgICAgICA9IGh0dHBfYWNjZXB0LApAQCAtMTUxOCwxOCArMTc0NiwxOSBAQAogICAgIC51cmxfc2VlayAgICAgICAgICAgID0gaHR0cF9zZWVrLAogICAgIC51cmxfY2xvc2UgICAgICAgICAgID0gaHR0cF9jbG9zZSwKICAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IGh0dHBfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC51cmxfZ2V0X3Nob3J0X3NlZWsgID0gaHR0cF9nZXRfc2hvcnRfc2VlaywKICAgICAudXJsX3NodXRkb3duICAgICAgICA9IGh0dHBfc2h1dGRvd24sCiAgICAgLnByaXZfZGF0YV9zaXplICAgICAgPSBzaXplb2YoSFRUUENvbnRleHQpLAogICAgIC5wcml2X2RhdGFfY2xhc3MgICAgID0gJmh0dHBfY29udGV4dF9jbGFzcywKICAgICAuZmxhZ3MgICAgICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCi0gICAgLmRlZmF1bHRfd2hpdGVsaXN0ICAgPSAiaHR0cCxodHRwcyx0bHMscnRwLHRjcCx1ZHAsY3J5cHRvIgorICAgIC5kZWZhdWx0X3doaXRlbGlzdCAgID0gImh0dHAsaHR0cHMsdGxzLHJ0cCx0Y3AsdWRwLGNyeXB0byxodHRwcHJveHkiCiB9OwogI2VuZGlmIC8qIENPTkZJR19IVFRQX1BST1RPQ09MICovCiAKICNpZiBDT05GSUdfSFRUUFNfUFJPVE9DT0wKIEhUVFBfQ0xBU1MoaHR0cHMpOwogCi1VUkxQcm90b2NvbCBmZl9odHRwc19wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX2h0dHBzX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgICAgID0gImh0dHBzIiwKICAgICAudXJsX29wZW4yICAgICAgICAgICA9IGh0dHBfb3BlbiwKICAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGh0dHBfcmVhZCwKQEAgLTE1MzcsMTEgKzE3NjYsMTIgQEAKICAgICAudXJsX3NlZWsgICAgICAgICAgICA9IGh0dHBfc2VlaywKICAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IGh0dHBfY2xvc2UsCiAgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSBodHRwX2dldF9maWxlX2hhbmRsZSwKKyAgICAudXJsX2dldF9zaG9ydF9zZWVrICA9IGh0dHBfZ2V0X3Nob3J0X3NlZWssCiAgICAgLnVybF9zaHV0ZG93biAgICAgICAgPSBodHRwX3NodXRkb3duLAogICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKEhUVFBDb250ZXh0KSwKICAgICAucHJpdl9kYXRhX2NsYXNzICAgICA9ICZodHRwc19jb250ZXh0X2NsYXNzLAogICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKLSAgICAuZGVmYXVsdF93aGl0ZWxpc3QgICA9ICJodHRwLGh0dHBzLHRscyxydHAsdGNwLHVkcCxjcnlwdG8iCisgICAgLmRlZmF1bHRfd2hpdGVsaXN0ICAgPSAiaHR0cCxodHRwcyx0bHMscnRwLHRjcCx1ZHAsY3J5cHRvLGh0dHBwcm94eSIKIH07CiAjZW5kaWYgLyogQ09ORklHX0hUVFBTX1BST1RPQ09MICovCiAKQEAgLTE1ODIsNyArMTgxMiw3IEBACiByZWRvOgogICAgIHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZzLT5oZCwgbG93ZXJfdXJsLCBBVklPX0ZMQUdfUkVBRF9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCkBAIC0xNjA1LDcgKzE4MzUsNyBAQAogICAgIHMtPmJ1Zl9wdHIgICAgPSBzLT5idWZmZXI7CiAgICAgcy0+YnVmX2VuZCAgICA9IHMtPmJ1ZmZlcjsKICAgICBzLT5saW5lX2NvdW50ID0gMDsKLSAgICBzLT5maWxlc2l6ZSAgID0gLTE7CisgICAgcy0+ZmlsZXNpemUgICA9IFVJTlQ2NF9NQVg7CiAgICAgY3VyX2F1dGhfdHlwZSA9IHMtPnByb3h5X2F1dGhfc3RhdGUuYXV0aF90eXBlOwogCiAgICAgLyogTm90ZTogVGhpcyB1c2VzIGJ1ZmZlcmluZywgcG90ZW50aWFsbHkgcmVhZGluZyBtb3JlIHRoYW4gdGhlCkBAIC0xNjQ0LDcgKzE4NzQsNyBAQAogICAgIHJldHVybiBmZnVybF93cml0ZShzLT5oZCwgYnVmLCBzaXplKTsKIH0KIAotVVJMUHJvdG9jb2wgZmZfaHR0cHByb3h5X3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfaHR0cHByb3h5X3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgICAgID0gImh0dHBwcm94eSIsCiAgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBodHRwX3Byb3h5X29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSBodHRwX2J1Zl9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaHR0cGF1dGguYyBiL2xpYmF2Zm9ybWF0L2h0dHBhdXRoLmMKaW5kZXggMThjZjM2Yi4uMmQ0MmFiMiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaHR0cGF1dGguYworKysgYi9saWJhdmZvcm1hdC9odHRwYXV0aC5jCkBAIC05MCw3ICs5MCw3IEBACiB2b2lkIGZmX2h0dHBfYXV0aF9oYW5kbGVfaGVhZGVyKEhUVFBBdXRoU3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICprZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQogewotICAgIGlmICghc3RyY21wKGtleSwgIldXVy1BdXRoZW50aWNhdGUiKSB8fCAhc3RyY21wKGtleSwgIlByb3h5LUF1dGhlbnRpY2F0ZSIpKSB7CisgICAgaWYgKCFhdl9zdHJjYXNlY21wKGtleSwgIldXVy1BdXRoZW50aWNhdGUiKSB8fCAhYXZfc3RyY2FzZWNtcChrZXksICJQcm94eS1BdXRoZW50aWNhdGUiKSkgewogICAgICAgICBjb25zdCBjaGFyICpwOwogICAgICAgICBpZiAoYXZfc3RyaXN0YXJ0KHZhbHVlLCAiQmFzaWMgIiwgJnApICYmCiAgICAgICAgICAgICBzdGF0ZS0+YXV0aF90eXBlIDw9IEhUVFBfQVVUSF9CQVNJQykgewpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoc3RhdGUtPmRpZ2VzdF9wYXJhbXMuc3RhbGUsICJ0cnVlIikpCiAgICAgICAgICAgICAgICAgc3RhdGUtPnN0YWxlID0gMTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJBdXRoZW50aWNhdGlvbi1JbmZvIikpIHsKKyAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKGtleSwgIkF1dGhlbnRpY2F0aW9uLUluZm8iKSkgewogICAgICAgICBmZl9wYXJzZV9rZXlfdmFsdWUodmFsdWUsIChmZl9wYXJzZV9rZXlfdmFsX2NiKSBoYW5kbGVfZGlnZXN0X3VwZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9odHRwYXV0aC5oIGIvbGliYXZmb3JtYXQvaHR0cGF1dGguaAppbmRleCA5YzE1YTM4Li4wZTcwODU5IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9odHRwYXV0aC5oCisrKyBiL2xpYmF2Zm9ybWF0L2h0dHBhdXRoLmgKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgKi8KICAgICBjaGFyIHJlYWxtWzIwMF07CiAgICAgLyoqCi0gICAgICogVGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVjIHRvIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4KKyAgICAgKiBUaGUgcGFyYW1ldGVycyBzcGVjaWZpYyB0byBkaWdlc3QgYXV0aGVudGljYXRpb24uCiAgICAgICovCiAgICAgRGlnZXN0UGFyYW1zIGRpZ2VzdF9wYXJhbXM7CiAgICAgLyoqCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9pY2VjYXN0LmMgYi9saWJhdmZvcm1hdC9pY2VjYXN0LmMKaW5kZXggYTNiOWEzNi4uMDJlM2UzOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaWNlY2FzdC5jCisrKyBiL2xpYmF2Zm9ybWF0L2ljZWNhc3QuYwpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgZmZfdXJsX2pvaW4oaF91cmwsIHNpemVvZihoX3VybCksICJodHRwIiwgYXV0aCwgaG9zdCwgcG9ydCwgIiVzIiwgcGF0aCk7CiAgICAgLy8gRmluYWxseSBvcGVuIGh0dHAgcHJvdG8gaGFuZGxlcgogICAgIHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZzLT5oZCwgaF91cmwsIEFWSU9fRkxBR19SRUFEX1dSSVRFLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHRfZGljdCwgaC0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B0X2RpY3QsIGgtPnByb3RvY29sX3doaXRlbGlzdCwgaC0+cHJvdG9jb2xfYmxhY2tsaXN0LCBoKTsKIAogY2xlYW51cDoKICAgICBhdl9mcmVlcCgmdXNlcik7CkBAIC0yMDksNyArMjA5LDcgQEAKICAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi1VUkxQcm90b2NvbCBmZl9pY2VjYXN0X3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfaWNlY2FzdF9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgID0gImljZWNhc3QiLAogICAgIC51cmxfb3BlbiAgICAgICAgPSBpY2VjYXN0X29wZW4sCiAgICAgLnVybF93cml0ZSAgICAgICA9IGljZWNhc3Rfd3JpdGUsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9pY29kZWMuYyBiL2xpYmF2Zm9ybWF0L2ljb2RlYy5jCmluZGV4IDZkZGI5MDEuLmYzM2ZhMTEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2ljb2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2ljb2RlYy5jCkBAIC00NSwxMSArNDUsMTQgQEAKIAogc3RhdGljIGludCBwcm9iZShBVlByb2JlRGF0YSAqcCkKIHsKLSAgICB1bnNpZ25lZCBpLCBmcmFtZXMgPSBBVl9STDE2KHAtPmJ1ZiArIDQpOworICAgIHVuc2lnbmVkIGksIGZyYW1lcywgY2hlY2tlZCA9IDA7CiAKLSAgICBpZiAoQVZfUkwxNihwLT5idWYpIHx8IEFWX1JMMTYocC0+YnVmICsgMikgIT0gMSB8fCAhZnJhbWVzKQorICAgIGlmIChwLT5idWZfc2l6ZSA8IDIyIHx8IEFWX1JMMTYocC0+YnVmKSB8fCBBVl9STDE2KHAtPmJ1ZiArIDIpICE9IDEpCiAgICAgICAgIHJldHVybiAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXM7IGkrKykgeworICAgIGZyYW1lcyA9IEFWX1JMMTYocC0+YnVmICsgNCk7CisgICAgaWYgKCFmcmFtZXMpCisgICAgICAgIHJldHVybiAwOworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXMgJiYgaSAqIDE2ICsgMjIgPD0gcC0+YnVmX3NpemU7IGkrKykgewogICAgICAgICB1bnNpZ25lZCBvZmZzZXQ7CiAgICAgICAgIGlmIChBVl9STDE2KHAtPmJ1ZiArIDEwICsgaSAqIDE2KSAmIH4xKQogICAgICAgICAgICAgcmV0dXJuIEZGTUlOKGksIEFWUFJPQkVfU0NPUkVfTUFYIC8gNCk7CkBAIC02MCwxNCArNjMsMTUgQEAKICAgICAgICAgb2Zmc2V0ID0gQVZfUkwzMihwLT5idWYgKyAxOCArIGkgKiAxNik7CiAgICAgICAgIGlmIChvZmZzZXQgPCAyMikKICAgICAgICAgICAgIHJldHVybiBGRk1JTihpLCBBVlBST0JFX1NDT1JFX01BWCAvIDQpOwotICAgICAgICBpZiAob2Zmc2V0ICsgOCA+IHAtPmJ1Zl9zaXplKQotICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gNCArIEZGTUlOKGksIDEpOworICAgICAgICBpZiAob2Zmc2V0ID4gcC0+YnVmX3NpemUgLSA4KQorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmIChwLT5idWZbb2Zmc2V0XSAhPSA0MCAmJiBBVl9SQjY0KHAtPmJ1ZiArIG9mZnNldCkgIT0gUE5HU0lHKQogICAgICAgICAgICAgcmV0dXJuIEZGTUlOKGksIEFWUFJPQkVfU0NPUkVfTUFYIC8gNCk7Ci0gICAgICAgIGlmIChpICogMTYgKyA2ID4gcC0+YnVmX3NpemUpCi0gICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyA0ICsgRkZNSU4oaSwgMSk7CisgICAgICAgIGNoZWNrZWQrKzsKICAgICB9CiAKKyAgICBpZiAoY2hlY2tlZCA8IGZyYW1lcykKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gNCArIEZGTUlOKGNoZWNrZWQsIDEpOwogICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWCAvIDIgKyAxOwogfQogCkBAIC05NSw5ICs5OSw5IEBACiAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19yOChwYik7Ci0gICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcjgocGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IGF2aW9fcjgocGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBhdmlvX3I4KHBiKTsKICAgICAgICAgaWNvLT5pbWFnZXNbaV0ubmJfcGFsID0gYXZpb19yOChwYik7CiAgICAgICAgIGlmIChpY28tPmltYWdlc1tpXS5uYl9wYWwgPT0gMjU1KQogICAgICAgICAgICAgaWNvLT5pbWFnZXNbaV0ubmJfcGFsID0gMDsKQEAgLTEwNSw2ICsxMDksMTAgQEAKICAgICAgICAgYXZpb19za2lwKHBiLCA1KTsKIAogICAgICAgICBpY28tPmltYWdlc1tpXS5zaXplICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBpZiAoaWNvLT5pbWFnZXNbaV0uc2l6ZSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBpbWFnZSBzaXplICVkXG4iLCBpY28tPmltYWdlc1tpXS5zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAgICAgICAgIGljby0+aW1hZ2VzW2ldLm9mZnNldCA9IGF2aW9fcmwzMihwYik7CiAKICAgICAgICAgaWYgKGF2aW9fc2VlayhwYiwgaWNvLT5pbWFnZXNbaV0ub2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQpAQCAtMTEzLDIwICsxMjEsMjAgQEAKICAgICAgICAgY29kZWMgPSBhdmlvX3JsMzIocGIpOwogICAgICAgICBzd2l0Y2ggKGNvZGVjKSB7CiAgICAgICAgIGNhc2UgTUtUQUcoMHg4OSwgJ1AnLCAnTicsICdHJyk6Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUE5HOwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICA9IDA7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgID0gMDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QTkc7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgID0gMDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgPSAwOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgNDA6CiAgICAgICAgICAgICBpZiAoaWNvLT5pbWFnZXNbaV0uc2l6ZSA8IDQwKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0JNUDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9CTVA7CiAgICAgICAgICAgICB0bXAgPSBhdmlvX3JsMzIocGIpOwogICAgICAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoID0gdG1wOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggPSB0bXA7CiAgICAgICAgICAgICB0bXAgPSBhdmlvX3JsMzIocGIpOwogICAgICAgICAgICAgaWYgKHRtcCkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHRtcCAvIDI7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSB0bXAgLyAyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNvZGVjICVkIiwgY29kZWMpOwpAQCAtMTUzLDcgKzE2MSw3IEBACiAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIGltYWdlLT5vZmZzZXQsIFNFRUtfU0VUKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgaWYgKHMtPnN0cmVhbXNbaWNvLT5jdXJyZW50X2ltYWdlXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BORykgeworICAgIGlmIChzLT5zdHJlYW1zW2ljby0+Y3VycmVudF9pbWFnZV0tPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QTkcpIHsKICAgICAgICAgaWYgKChyZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGltYWdlLT5zaXplKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9IGVsc2UgewpAQCAtMTcwLDE2ICsxNzgsMTggQEAKICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmYnVmLCAwKTsKICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmYnVmLCAwKTsKIAotICAgICAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChwYiwgYnVmLCBpbWFnZS0+c2l6ZSkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICgocmV0ID0gYXZpb19yZWFkKHBiLCBidWYsIGltYWdlLT5zaXplKSkgIT0gaW1hZ2UtPnNpemUpIHsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBBVl9STDE2KGJ1ZiArIDE0KTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBBVl9STDE2KGJ1ZiArIDE0KTsKIAogICAgICAgICBpZiAoQVZfUkwzMihidWYgKyAzMikpCiAgICAgICAgICAgICBpbWFnZS0+bmJfcGFsID0gQVZfUkwzMihidWYgKyAzMik7CiAKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDw9IDggJiYgIWltYWdlLT5uYl9wYWwpIHsKLSAgICAgICAgICAgIGltYWdlLT5uYl9wYWwgPSAxIDw8IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPD0gOCAmJiAhaW1hZ2UtPm5iX3BhbCkgeworICAgICAgICAgICAgaW1hZ2UtPm5iX3BhbCA9IDEgPDwgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CiAgICAgICAgICAgICBBVl9XTDMyKGJ1ZiArIDMyLCBpbWFnZS0+bmJfcGFsKTsKICAgICAgICAgfQogCkBAIC0xOTMsNiArMjAzLDEzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaWNvX3JlYWRfY2xvc2UoQVZGb3JtYXRDb250ZXh0ICogcykKK3sKKyAgICBJY29EZW11eENvbnRleHQgKmljbyA9IHMtPnByaXZfZGF0YTsKKyAgICBhdl9mcmVlcCgmaWNvLT5pbWFnZXMpOworICAgIHJldHVybiAwOworfQorCiBBVklucHV0Rm9ybWF0IGZmX2ljb19kZW11eGVyID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJpY28iLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJNaWNyb3NvZnQgV2luZG93cyBJQ08iKSwKQEAgLTIwMCw1ICsyMTcsNiBAQAogICAgIC5yZWFkX3Byb2JlICAgICA9IHByb2JlLAogICAgIC5yZWFkX2hlYWRlciAgICA9IHJlYWRfaGVhZGVyLAogICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0LAorICAgIC5yZWFkX2Nsb3NlICAgICA9IGljb19yZWFkX2Nsb3NlLAogICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9pY29lbmMuYyBiL2xpYmF2Zm9ybWF0L2ljb2VuYy5jCmluZGV4IDUzZDQ0MjAuLmU2NDFmN2IgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2ljb2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2ljb2VuYy5jCkBAIC00MiwzMyArNDIsMzMgQEAKICAgICBJY29JbWFnZSAqaW1hZ2VzOwogfSBJY29NdXhDb250ZXh0OwogCi1zdGF0aWMgaW50IGljb19jaGVja19hdHRyaWJ1dGVzKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgQVZDb2RlY0NvbnRleHQgKmMpCitzdGF0aWMgaW50IGljb19jaGVja19hdHRyaWJ1dGVzKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgQVZDb2RlY1BhcmFtZXRlcnMgKnApCiB7Ci0gICAgaWYgKGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0JNUCkgewotICAgICAgICBpZiAoYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggJiYgQVZfUElYX0ZNVF9SR0IzMiAhPSBBVl9QSVhfRk1UX0JHUkEpIHsKKyAgICBpZiAocC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQk1QKSB7CisgICAgICAgIGlmIChwLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9QQUw4ICYmIEFWX1BJWF9GTVRfUkdCMzIgIT0gQVZfUElYX0ZNVF9CR1JBKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiV3JvbmcgZW5kaWFubmVzcyBmb3IgYm1wIHBpeGVsIGZvcm1hdFxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICB9IGVsc2UgaWYgKGMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9QQUw4ICYmCi0gICAgICAgICAgICAgICAgICAgYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1JHQjU1NUxFICYmCi0gICAgICAgICAgICAgICAgICAgYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX0JHUjI0ICYmCi0gICAgICAgICAgICAgICAgICAgYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX0JHUkEpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9QQUw4ICYmCisgICAgICAgICAgICAgICAgICAgcC0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfUkdCNTU1TEUgJiYKKyAgICAgICAgICAgICAgICAgICBwLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9CR1IyNCAmJgorICAgICAgICAgICAgICAgICAgIHAtPmZvcm1hdCAhPSBBVl9QSVhfRk1UX0JHUkEpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJCTVAgbXVzdCBiZSAxYml0LCA0Yml0LCA4Yml0LCAxNmJpdCwgMjRiaXQsIG9yIDMyYml0XG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BORykgewotICAgICAgICBpZiAoYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX1JHQkEpIHsKKyAgICB9IGVsc2UgaWYgKHAtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BORykgeworICAgICAgICBpZiAocC0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfUkdCQSkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlBORyBpbiBpY28gcmVxdWlyZXMgcGl4ZWwgZm9ybWF0IHRvIGJlIHJnYmFcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpjb2Rlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGMtPmNvZGVjX2lkKTsKKyAgICAgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmNvZGVzYyA9IGF2Y29kZWNfZGVzY3JpcHRvcl9nZXQocC0+Y29kZWNfaWQpOwogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgY29kZWMgJXNcbiIsIGNvZGVzYyA/IGNvZGVzYy0+bmFtZSA6ICIiKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBpZiAoYy0+d2lkdGggPiAyNTYgfHwKLSAgICAgICAgYy0+aGVpZ2h0ID4gMjU2KSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBkaW1lbnNpb25zICVkeCVkIChkaW1lbnNpb25zIGNhbm5vdCBleGNlZWQgMjU2eDI1NilcbiIsIGMtPndpZHRoLCBjLT5oZWlnaHQpOworICAgIGlmIChwLT53aWR0aCA+IDI1NiB8fAorICAgICAgICBwLT5oZWlnaHQgPiAyNTYpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGRpbWVuc2lvbnMgJWR4JWQgKGRpbWVuc2lvbnMgY2Fubm90IGV4Y2VlZCAyNTZ4MjU2KVxuIiwgcC0+d2lkdGgsIHAtPmhlaWdodCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCkBAIC04Miw3ICs4Miw3IEBACiAgICAgaW50IHJldDsKICAgICBpbnQgaTsKIAotICAgIGlmICghcGItPnNlZWthYmxlKSB7CisgICAgaWYgKCEocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPdXRwdXQgaXMgbm90IHNlZWthYmxlXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CkBAIC05NSw3ICs5NSw3IEBACiAgICAgYXZpb19za2lwKHBiLCAyKTsgLy8gc2tpcCB0aGUgbnVtYmVyIG9mIGltYWdlcwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBpZiAocmV0ID0gaWNvX2NoZWNrX2F0dHJpYnV0ZXMocywgcy0+c3RyZWFtc1tpXS0+Y29kZWMpKQorICAgICAgICBpZiAocmV0ID0gaWNvX2NoZWNrX2F0dHJpYnV0ZXMocywgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXIpKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgICAgICAvLyBGaWxsIGluIGxhdGVyIHdoZW4gd3JpdGluZyB0cmFpbGVyLi4uCkBAIC0xMTYsNyArMTE2LDcgQEAKICAgICBJY29NdXhDb250ZXh0ICppY28gPSBzLT5wcml2X2RhdGE7CiAgICAgSWNvSW1hZ2UgKmltYWdlOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICpjID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+Y29kZWNwYXI7CiAgICAgaW50IGk7CiAKICAgICBpZiAoaWNvLT5jdXJyZW50X2ltYWdlID49IGljby0+bmJfaW1hZ2VzKSB7CkBAIC0xMjcsMTEgKzEyNywxMSBAQAogICAgIGltYWdlID0gJmljby0+aW1hZ2VzW2ljby0+Y3VycmVudF9pbWFnZSsrXTsKIAogICAgIGltYWdlLT5vZmZzZXQgPSBhdmlvX3RlbGwocGIpOwotICAgIGltYWdlLT53aWR0aCA9IChjLT53aWR0aCA9PSAyNTYpID8gMCA6IGMtPndpZHRoOwotICAgIGltYWdlLT5oZWlnaHQgPSAoYy0+aGVpZ2h0ID09IDI1NikgPyAwIDogYy0+aGVpZ2h0OworICAgIGltYWdlLT53aWR0aCA9IChwYXItPndpZHRoID09IDI1NikgPyAwIDogcGFyLT53aWR0aDsKKyAgICBpbWFnZS0+aGVpZ2h0ID0gKHBhci0+aGVpZ2h0ID09IDI1NikgPyAwIDogcGFyLT5oZWlnaHQ7CiAKLSAgICBpZiAoYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUE5HKSB7Ci0gICAgICAgIGltYWdlLT5iaXRzID0gYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BORykgeworICAgICAgICBpbWFnZS0+Yml0cyA9IHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwogICAgICAgICBpbWFnZS0+c2l6ZSA9IHBrdC0+c2l6ZTsKIAogICAgICAgICBhdmlvX3dyaXRlKHBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CkBAIC0xNDIsMTMgKzE0MiwxMyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW1hZ2UtPmJpdHMgPSBBVl9STDE2KHBrdC0+ZGF0YSArIDI4KTsgLy8gYWxsb3dzIHRoaW5ncyBsaWtlIDFiaXQgYW5kIDRiaXQgaW1hZ2VzIHRvIGJlIHByZXNlcnZlZAotICAgICAgICBpbWFnZS0+c2l6ZSA9IHBrdC0+c2l6ZSAtIDE0ICsgYy0+aGVpZ2h0ICogKGMtPndpZHRoICsgNykgLyA4OworICAgICAgICBpbWFnZS0+c2l6ZSA9IHBrdC0+c2l6ZSAtIDE0ICsgcGFyLT5oZWlnaHQgKiAocGFyLT53aWR0aCArIDcpIC8gODsKIAogICAgICAgICBhdmlvX3dyaXRlKHBiLCBwa3QtPmRhdGEgKyAxNCwgOCk7IC8vIFNraXAgdGhlIEJJVE1BUEZJTEVIRUFERVIgaGVhZGVyCiAgICAgICAgIGF2aW9fd2wzMihwYiwgQVZfUkwzMihwa3QtPmRhdGEgKyAyMikgKiAyKTsgLy8gcmV3cml0ZSBoZWlnaHQgYXMgMiAqIGhlaWdodAogICAgICAgICBhdmlvX3dyaXRlKHBiLCBwa3QtPmRhdGEgKyAyNiwgcGt0LT5zaXplIC0gMjYpOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5oZWlnaHQgKiAoYy0+d2lkdGggKyA3KSAvIDg7ICsraSkKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhci0+aGVpZ2h0ICogKHBhci0+d2lkdGggKyA3KSAvIDg7ICsraSkKICAgICAgICAgICAgIGF2aW9fdzgocGIsIDB4MDApOyAvLyBXcml0ZSBiaXRtYXNrIChvcGFxdWUpCiAgICAgfQogCkBAIC0xNjksOCArMTY5LDggQEAKICAgICAgICAgYXZpb193OChwYiwgaWNvLT5pbWFnZXNbaV0ud2lkdGgpOwogICAgICAgICBhdmlvX3c4KHBiLCBpY28tPmltYWdlc1tpXS5oZWlnaHQpOwogCi0gICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQk1QICYmCi0gICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpIHsKKyAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9CTVAgJiYKKyAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9QQUw4KSB7CiAgICAgICAgICAgICBhdmlvX3c4KHBiLCAoaWNvLT5pbWFnZXNbaV0uYml0cyA+PSA4KSA/IDAgOiAxIDw8IGljby0+aW1hZ2VzW2ldLmJpdHMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXZpb193OChwYiwgMCk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9pZDN2MS5jIGIvbGliYXZmb3JtYXQvaWQzdjEuYwppbmRleCAyMThlZDczLi4xOWJlNDIxIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9pZDN2MS5jCisrKyBiL2xpYmF2Zm9ybWF0L2lkM3YxLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogICAgIHVpbnQ4X3QgYnVmW0lEM3YxX1RBR19TSVpFXTsKICAgICBpbnQ2NF90IGZpbGVzaXplLCBwb3NpdGlvbiA9IGF2aW9fdGVsbChzLT5wYik7CiAKLSAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CiAgICAgICAgIC8qIFhYWDogY2hhbmdlIHRoYXQgKi8KICAgICAgICAgZmlsZXNpemUgPSBhdmlvX3NpemUocy0+cGIpOwogICAgICAgICBpZiAoZmlsZXNpemUgPiAxMjgpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2lkM3YyLmMgYi9saWJhdmZvcm1hdC9pZDN2Mi5jCmluZGV4IGFkZGY5MzcuLjVmZTA1NWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2lkM3YyLmMKKysrIGIvbGliYXZmb3JtYXQvaWQzdjIuYwpAQCAtMzMsNiArMzMsNyBAQAogI2VuZGlmCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnByaW50LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgpAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgeyAwIH0sCiB9OwogCi1jb25zdCBjaGFyICpmZl9pZDN2Ml9waWN0dXJlX3R5cGVzWzIxXSA9IHsKK2NvbnN0IGNoYXIgKiBjb25zdCBmZl9pZDN2Ml9waWN0dXJlX3R5cGVzWzIxXSA9IHsKICAgICAiT3RoZXIiLAogICAgICIzMngzMiBwaXhlbHMgJ2ZpbGUgaWNvbiciLAogICAgICJPdGhlciBmaWxlIGljb24iLApAQCAtNDAwLDYgKzQwMSw0OCBAQAogfQogCiAvKioKKyAqIFBhcnNlIGEgY29tbWVudCB0YWcuCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfY29tbWVudChBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZ2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSkKK3sKKyAgICBjb25zdCBjaGFyICprZXkgPSAiY29tbWVudCI7CisgICAgdWludDhfdCAqZHN0OworICAgIGludCBlbmNvZGluZywgZGljdF9mbGFncyA9IEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUgfCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTDsKKyAgICBhdl91bnVzZWQgaW50IGxhbmd1YWdlOworCisgICAgaWYgKHRhZ2xlbiA8IDQpCisgICAgICAgIHJldHVybjsKKworICAgIGVuY29kaW5nID0gYXZpb19yOChwYik7CisgICAgbGFuZ3VhZ2UgPSBhdmlvX3JsMjQocGIpOworICAgIHRhZ2xlbiAtPSA0OworCisgICAgaWYgKGRlY29kZV9zdHIocywgcGIsIGVuY29kaW5nLCAmZHN0LCAmdGFnbGVuKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHJlYWRpbmcgY29tbWVudCBmcmFtZSwgc2tpcHBlZFxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZHN0ICYmICEqZHN0KQorICAgICAgICBhdl9mcmVlcCgmZHN0KTsKKworICAgIGlmIChkc3QpIHsKKyAgICAgICAga2V5ID0gKGNvbnN0IGNoYXIgKikgZHN0OworICAgICAgICBkaWN0X2ZsYWdzIHw9IEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZOworICAgIH0KKworICAgIGlmIChkZWNvZGVfc3RyKHMsIHBiLCBlbmNvZGluZywgJmRzdCwgJnRhZ2xlbikgPCAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFcnJvciByZWFkaW5nIGNvbW1lbnQgZnJhbWUsIHNraXBwZWRcbiIpOworICAgICAgICBpZiAoZGljdF9mbGFncyAmIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZKQorICAgICAgICAgICAgYXZfZnJlZXAoKHZvaWQqKSZrZXkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGRzdCkKKyAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsIGtleSwgKGNvbnN0IGNoYXIgKikgZHN0LCBkaWN0X2ZsYWdzKTsKK30KKworLyoqCiAgKiBQYXJzZSBHRU9CIHRhZyBpbnRvIGEgSUQzdjJFeHRyYU1ldGFHRU9CIHN0cnVjdC4KICAqLwogc3RhdGljIHZvaWQgcmVhZF9nZW9idGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBpbnQgdGFnbGVuLApAQCAtNTQ3LDcgKzU5MCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzdjM0KQogewogICAgIGludCBlbmMsIHBpY190eXBlOwotICAgIGNoYXIgbWltZXR5cGVbNjRdOworICAgIGNoYXIgbWltZXR5cGVbNjRdID0gezB9OwogICAgIGNvbnN0IENvZGVjTWltZSAqbWltZSAgICAgPSBmZl9pZDN2Ml9taW1lX3RhZ3M7CiAgICAgZW51bSBBVkNvZGVjSUQgaWQgICAgICAgICA9IEFWX0NPREVDX0lEX05PTkU7CiAgICAgSUQzdjJFeHRyYU1ldGFBUElDICphcGljICA9IE5VTEw7CkBAIC01NjksNyArNjEyLDkgQEAKICAgICBpZiAoaXN2MzQpIHsKICAgICAgICAgdGFnbGVuIC09IGF2aW9fZ2V0X3N0cihwYiwgdGFnbGVuLCBtaW1ldHlwZSwgc2l6ZW9mKG1pbWV0eXBlKSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYXZpb19yZWFkKHBiLCBtaW1ldHlwZSwgMyk7CisgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIG1pbWV0eXBlLCAzKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKICAgICAgICAgbWltZXR5cGVbM10gPSAwOwogICAgICAgICB0YWdsZW4gICAgLT0gMzsKICAgICB9CkBAIC02MjgsNTkgKzY3Myw2OCBAQAogICAgIGF2aW9fc2VlayhwYiwgZW5kLCBTRUVLX1NFVCk7CiB9CiAKK3N0YXRpYyB2b2lkIGZyZWVfY2hhcHRlcih2b2lkICpvYmopCit7CisgICAgSUQzdjJFeHRyYU1ldGFDSEFQICpjaGFwID0gb2JqOworICAgIGF2X2ZyZWVwKCZjaGFwLT5lbGVtZW50X2lkKTsKKyAgICBhdl9kaWN0X2ZyZWUoJmNoYXAtPm1ldGEpOworICAgIGF2X2ZyZWVwKCZjaGFwKTsKK30KKwogc3RhdGljIHZvaWQgcmVhZF9jaGFwdGVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBpbnQgbGVuLCBjb25zdCBjaGFyICp0dGFnLCBJRDN2MkV4dHJhTWV0YSAqKmV4dHJhX21ldGEsIGludCBpc3YzNCkKIHsKLSAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZSA9IHsxLCAxMDAwfTsKLSAgICB1aW50MzJfdCBzdGFydCwgZW5kOwotICAgIEFWQ2hhcHRlciAqY2hhcHRlcjsKLSAgICB1aW50OF90ICpkc3QgPSBOVUxMOwogICAgIGludCB0YWdsZW47CiAgICAgY2hhciB0YWdbNV07CisgICAgSUQzdjJFeHRyYU1ldGEgKm5ld19leHRyYSA9IE5VTEw7CisgICAgSUQzdjJFeHRyYU1ldGFDSEFQICpjaGFwICA9IE5VTEw7CiAKLSAgICBpZiAoIXMpIHsKLSAgICAgICAgLyogV2Ugc2hvdWxkIHByb2JhYmx5IGp1c3QgcHV0IHRoZSBjaGFwdGVyIGRhdGEgdG8gZXh0cmFfbWV0YSBoZXJlCi0gICAgICAgICAqIGFuZCBkbyB0aGUgQVZGb3JtYXRDb250ZXh0LW5lZWRpbmcgcGFydCBpbiBhIHNlcGFyYXRlCi0gICAgICAgICAqIGZmX2lkM3YyX3BhcnNlX2FwaWMoKS1saWtlIGZ1bmN0aW9uLiAqLwotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiTm8gQVZGb3JtYXRDb250ZXh0LCBza2lwcGVkIElEMyBjaGFwdGVyIGRhdGFcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQorICAgIG5ld19leHRyYSA9IGF2X21hbGxvY3ooc2l6ZW9mKCpuZXdfZXh0cmEpKTsKKyAgICBjaGFwICAgICAgPSBhdl9tYWxsb2N6KHNpemVvZigqY2hhcCkpOwogCi0gICAgaWYgKGRlY29kZV9zdHIocywgcGIsIDAsICZkc3QsICZsZW4pIDwgMCkKLSAgICAgICAgcmV0dXJuOworICAgIGlmICghbmV3X2V4dHJhIHx8ICFjaGFwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBpZiAoZGVjb2RlX3N0cihzLCBwYiwgMCwgJmNoYXAtPmVsZW1lbnRfaWQsICZsZW4pIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCiAgICAgaWYgKGxlbiA8IDE2KQotICAgICAgICByZXR1cm47CisgICAgICAgIGdvdG8gZmFpbDsKIAotICAgIHN0YXJ0ID0gYXZpb19yYjMyKHBiKTsKLSAgICBlbmQgICA9IGF2aW9fcmIzMihwYik7CisgICAgY2hhcC0+c3RhcnQgPSBhdmlvX3JiMzIocGIpOworICAgIGNoYXAtPmVuZCAgID0gYXZpb19yYjMyKHBiKTsKICAgICBhdmlvX3NraXAocGIsIDgpOwogCi0gICAgY2hhcHRlciA9IGF2cHJpdl9uZXdfY2hhcHRlcihzLCBzLT5uYl9jaGFwdGVycyArIDEsIHRpbWVfYmFzZSwgc3RhcnQsIGVuZCwgZHN0KTsKLSAgICBpZiAoIWNoYXB0ZXIpIHsKLSAgICAgICAgYXZfZnJlZShkc3QpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgbGVuIC09IDE2OwogICAgIHdoaWxlIChsZW4gPiAxMCkgewogICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCB0YWcsIDQpIDwgNCkKLSAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB0YWdbNF0gPSAwOwogICAgICAgICB0YWdsZW4gPSBhdmlvX3JiMzIocGIpOwogICAgICAgICBhdmlvX3NraXAocGIsIDIpOwogICAgICAgICBsZW4gLT0gMTA7CiAgICAgICAgIGlmICh0YWdsZW4gPCAwIHx8IHRhZ2xlbiA+IGxlbikKLSAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICBpZiAodGFnWzBdID09ICdUJykKLSAgICAgICAgICAgIHJlYWRfdHRhZyhzLCBwYiwgdGFnbGVuLCAmY2hhcHRlci0+bWV0YWRhdGEsIHRhZyk7CisgICAgICAgICAgICByZWFkX3R0YWcocywgcGIsIHRhZ2xlbiwgJmNoYXAtPm1ldGEsIHRhZyk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgdGFnbGVuKTsKICAgICAgICAgbGVuIC09IHRhZ2xlbjsKICAgICB9CiAKLSAgICBmZl9tZXRhZGF0YV9jb252KCZjaGFwdGVyLT5tZXRhZGF0YSwgTlVMTCwgZmZfaWQzdjJfMzRfbWV0YWRhdGFfY29udik7Ci0gICAgZmZfbWV0YWRhdGFfY29udigmY2hhcHRlci0+bWV0YWRhdGEsIE5VTEwsIGZmX2lkM3YyXzRfbWV0YWRhdGFfY29udik7Ci1lbmQ6Ci0gICAgYXZfZnJlZShkc3QpOworICAgIGZmX21ldGFkYXRhX2NvbnYoJmNoYXAtPm1ldGEsIE5VTEwsIGZmX2lkM3YyXzM0X21ldGFkYXRhX2NvbnYpOworICAgIGZmX21ldGFkYXRhX2NvbnYoJmNoYXAtPm1ldGEsIE5VTEwsIGZmX2lkM3YyXzRfbWV0YWRhdGFfY29udik7CisKKyAgICBuZXdfZXh0cmEtPnRhZyAgPSAiQ0hBUCI7CisgICAgbmV3X2V4dHJhLT5kYXRhID0gY2hhcDsKKyAgICBuZXdfZXh0cmEtPm5leHQgPSAqZXh0cmFfbWV0YTsKKyAgICAqZXh0cmFfbWV0YSAgICAgPSBuZXdfZXh0cmE7CisKKyAgICByZXR1cm47CisKK2ZhaWw6CisgICAgaWYgKGNoYXApCisgICAgICAgIGZyZWVfY2hhcHRlcihjaGFwKTsKKyAgICBhdl9mcmVlcCgmbmV3X2V4dHJhKTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9wcml2KHZvaWQgKm9iaikKQEAgLTc0MCw3ICs3OTQsNyBAQAogc3RhdGljIGNvbnN0IElEM3YyRU1GdW5jIGlkM3YyX2V4dHJhX21ldGFfZnVuY3NbXSA9IHsKICAgICB7ICJHRU8iLCAiR0VPQiIsIHJlYWRfZ2VvYnRhZywgZnJlZV9nZW9idGFnIH0sCiAgICAgeyAiUElDIiwgIkFQSUMiLCByZWFkX2FwaWMsICAgIGZyZWVfYXBpYyAgICB9LAotICAgIHsgIkNIQVAiLCJDSEFQIiwgcmVhZF9jaGFwdGVyLCBOVUxMICAgICAgICAgfSwKKyAgICB7ICJDSEFQIiwiQ0hBUCIsIHJlYWRfY2hhcHRlciwgZnJlZV9jaGFwdGVyIH0sCiAgICAgeyAiUFJJViIsIlBSSVYiLCByZWFkX3ByaXYsICAgIGZyZWVfcHJpdiAgICB9LAogICAgIHsgTlVMTCB9CiB9OwpAQCAtNzgxLDYgKzgzNSw3IEBACiAgICAgY29uc3QgSUQzdjJFTUZ1bmMgKmV4dHJhX2Z1bmMgPSBOVUxMOwogICAgIHVuc2lnbmVkIGNoYXIgKnVuY29tcHJlc3NlZF9idWZmZXIgPSBOVUxMOwogICAgIGF2X3VudXNlZCBpbnQgdW5jb21wcmVzc2VkX2J1ZmZlcl9zaXplID0gMDsKKyAgICBjb25zdCBjaGFyICpjb21tX2ZyYW1lOwogCiAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImlkM3YyIHZlcjolZCBmbGFnczolMDJYIGxlbjolZFxuIiwgdmVyc2lvbiwgZmxhZ3MsIGxlbik7CiAKQEAgLTc5MiwxMiArODQ3LDE0IEBACiAgICAgICAgIH0KICAgICAgICAgaXN2MzQgICAgID0gMDsKICAgICAgICAgdGFnaGRybGVuID0gNjsKKyAgICAgICAgY29tbV9mcmFtZSA9ICJDT00iOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMzoKICAgICBjYXNlIDQ6CiAgICAgICAgIGlzdjM0ICAgICA9IDE7CiAgICAgICAgIHRhZ2hkcmxlbiA9IDEwOworICAgICAgICBjb21tX2ZyYW1lID0gIkNPTU0iOwogICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6CkBAIC05MDgsNiArOTY1LDcgQEAKICAgICAgICAgLyogY2hlY2sgZm9yIHRleHQgdGFnIG9yIHN1cHBvcnRlZCBzcGVjaWFsIG1ldGEgdGFnICovCiAgICAgICAgIH0gZWxzZSBpZiAodGFnWzBdID09ICdUJyB8fAogICAgICAgICAgICAgICAgICAgICFtZW1jbXAodGFnLCAiVVNMVCIsIDQpIHx8CisgICAgICAgICAgICAgICAgICAgIXN0cmNtcCh0YWcsIGNvbW1fZnJhbWUpIHx8CiAgICAgICAgICAgICAgICAgICAgKGV4dHJhX21ldGEgJiYKICAgICAgICAgICAgICAgICAgICAgKGV4dHJhX2Z1bmMgPSBnZXRfZXh0cmFfbWV0YV9mdW5jKHRhZywgaXN2MzQpKSkpIHsKICAgICAgICAgICAgIHBieCA9IHBiOwpAQCAtOTIwLDE5ICs5NzgsMjEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodW5zeW5jIHx8IHR1bnN5bmMpIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGVuZCA9IGF2aW9fdGVsbChwYikgKyB0bGVuOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmI7CisgICAgICAgICAgICAgICAgdWludDhfdCAqYiA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICB1aW50OF90ICp0ID0gYnVmZmVyOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmVuZCA9IHQgKyB0bGVuOwogCi0gICAgICAgICAgICAgICAgYiA9IGJ1ZmZlcjsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYXZpb190ZWxsKHBiKSA8IGVuZCAmJiBiIC0gYnVmZmVyIDwgdGxlbiAmJiAhcGItPmVvZl9yZWFjaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICpiKysgPSBhdmlvX3I4KHBiKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCooYiAtIDEpID09IDB4ZmYgJiYgYXZpb190ZWxsKHBiKSA8IGVuZCAtIDEgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGIgLSBidWZmZXIgPCB0bGVuICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAhcGItPmVvZl9yZWFjaGVkICkgewotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB2YWwgPSBhdmlvX3I4KHBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpiKysgPSB2YWwgPyB2YWwgOiBhdmlvX3I4KHBiKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIGJ1ZmZlciwgdGxlbikgIT0gdGxlbikgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlYWQgdGFnIGRhdGFcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIHNlZWs7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgd2hpbGUgKHQgIT0gZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICpiKysgPSAqdCsrOworICAgICAgICAgICAgICAgICAgICBpZiAodCAhPSBlbmQgJiYgdFstMV0gPT0gMHhmZiAmJiAhdFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHQrKzsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBmZmlvX2luaXRfY29udGV4dCgmcGJfbG9jYWwsIGJ1ZmZlciwgYiAtIGJ1ZmZlciwgMCwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICAgICAgICAgICB0bGVuID0gYiAtIGJ1ZmZlcjsKQEAgLTk3NSw2ICsxMDM1LDggQEAKICAgICAgICAgICAgICAgICByZWFkX3R0YWcocywgcGJ4LCB0bGVuLCBtZXRhZGF0YSwgdGFnKTsKICAgICAgICAgICAgIGVsc2UgaWYgKCFtZW1jbXAodGFnLCAiVVNMVCIsIDQpKQogICAgICAgICAgICAgICAgIHJlYWRfdXNsdChzLCBwYngsIHRsZW4sIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFzdHJjbXAodGFnLCBjb21tX2ZyYW1lKSkKKyAgICAgICAgICAgICAgICByZWFkX2NvbW1lbnQocywgcGJ4LCB0bGVuLCBtZXRhZGF0YSk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgLyogcGFyc2Ugc3BlY2lhbCBtZXRhIHRhZyAqLwogICAgICAgICAgICAgICAgIGV4dHJhX2Z1bmMtPnJlYWQocywgcGJ4LCB0bGVuLCB0YWcsIGV4dHJhX21ldGEsIGlzdjM0KTsKQEAgLTEwMjQsNyArMTA4Niw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgYnVmLCBJRDN2Ml9IRUFERVJfU0laRSk7CisgICAgICAgIHJldCA9IGZmaW9fZW5zdXJlX3NlZWtiYWNrKHBiLCBJRDN2Ml9IRUFERVJfU0laRSk7CisgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChwYiwgYnVmLCBJRDN2Ml9IRUFERVJfU0laRSk7CiAgICAgICAgIGlmIChyZXQgIT0gSUQzdjJfSEVBREVSX1NJWkUpIHsKICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgb2ZmLCBTRUVLX1NFVCk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTEwOTEsMTEgKzExNTUsMTEgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uICAgICAgfD0gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGFwaWMtPmlkOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IGFwaWMtPmlkOwogCiAgICAgICAgIGlmIChBVl9SQjY0KGFwaWMtPmJ1Zi0+ZGF0YSkgPT0gMHg4OTUwNGU0NzBkMGExYTBhKQotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BORzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QTkc7CiAKICAgICAgICAgaWYgKGFwaWMtPmRlc2NyaXB0aW9uWzBdKQogICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgInRpdGxlIiwgYXBpYy0+ZGVzY3JpcHRpb24sIDApOwpAQCAtMTExNCwzICsxMTc4LDEwMSBAQAogCiAgICAgcmV0dXJuIDA7CiB9CisKK2ludCBmZl9pZDN2Ml9wYXJzZV9jaGFwdGVycyhBVkZvcm1hdENvbnRleHQgKnMsIElEM3YyRXh0cmFNZXRhICoqZXh0cmFfbWV0YSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBJRDN2MkV4dHJhTWV0YSAqY3VyOworICAgIEFWUmF0aW9uYWwgdGltZV9iYXNlID0gezEsIDEwMDB9OworICAgIElEM3YyRXh0cmFNZXRhQ0hBUCAqKmNoYXB0ZXJzID0gTlVMTDsKKyAgICBpbnQgbnVtX2NoYXB0ZXJzID0gMDsKKyAgICBpbnQgaTsKKworICAgIC8vIHNpbmNlIGV4dHJhX21ldGEgaXMgYSBsaW5rZWQgbGlzdCB3aGVyZSBlbGVtZW50cyBhcmUgcHJlcGVuZGVkLAorICAgIC8vIHdlIG5lZWQgdG8gcmV2ZXJzZSB0aGUgb3JkZXIgb2YgY2hhcHRlcnMKKyAgICBmb3IgKGN1ciA9ICpleHRyYV9tZXRhOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBJRDN2MkV4dHJhTWV0YUNIQVAgKmNoYXA7CisKKyAgICAgICAgaWYgKHN0cmNtcChjdXItPnRhZywgIkNIQVAiKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBjaGFwID0gY3VyLT5kYXRhOworCisgICAgICAgIGlmICgocmV0ID0gYXZfZHluYXJyYXlfYWRkX25vZnJlZSgmY2hhcHRlcnMsICZudW1fY2hhcHRlcnMsIGNoYXApKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG51bV9jaGFwdGVycyAvIDIpOyBpKyspIHsKKyAgICAgICAgSUQzdjJFeHRyYU1ldGFDSEFQICpyaWdodDsKKyAgICAgICAgaW50IHJpZ2h0X2luZGV4OworCisgICAgICAgIHJpZ2h0X2luZGV4ID0gKG51bV9jaGFwdGVycyAtIDEpIC0gaTsKKyAgICAgICAgcmlnaHQgPSBjaGFwdGVyc1tyaWdodF9pbmRleF07CisKKyAgICAgICAgY2hhcHRlcnNbcmlnaHRfaW5kZXhdID0gY2hhcHRlcnNbaV07CisgICAgICAgIGNoYXB0ZXJzW2ldID0gcmlnaHQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9jaGFwdGVyczsgaSsrKSB7CisgICAgICAgIElEM3YyRXh0cmFNZXRhQ0hBUCAqY2hhcDsKKyAgICAgICAgQVZDaGFwdGVyICpjaGFwdGVyOworCisgICAgICAgIGNoYXAgPSBjaGFwdGVyc1tpXTsKKyAgICAgICAgY2hhcHRlciA9IGF2cHJpdl9uZXdfY2hhcHRlcihzLCBpLCB0aW1lX2Jhc2UsIGNoYXAtPnN0YXJ0LCBjaGFwLT5lbmQsIGNoYXAtPmVsZW1lbnRfaWQpOworICAgICAgICBpZiAoIWNoYXB0ZXIpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoKHJldCA9IGF2X2RpY3RfY29weSgmY2hhcHRlci0+bWV0YWRhdGEsIGNoYXAtPm1ldGEsIDApKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKK2VuZDoKKyAgICBhdl9mcmVlcCgmY2hhcHRlcnMpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBmZl9pZDN2Ml9wYXJzZV9wcml2X2RpY3QoQVZEaWN0aW9uYXJ5ICoqbWV0YWRhdGEsIElEM3YyRXh0cmFNZXRhICoqZXh0cmFfbWV0YSkKK3sKKyAgICBJRDN2MkV4dHJhTWV0YSAqY3VyOworICAgIGludCBkaWN0X2ZsYWdzID0gQVZfRElDVF9ET05UX09WRVJXUklURSB8IEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZIHwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUw7CisKKyAgICBmb3IgKGN1ciA9ICpleHRyYV9tZXRhOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXN0cmNtcChjdXItPnRhZywgIlBSSVYiKSkgeworICAgICAgICAgICAgSUQzdjJFeHRyYU1ldGFQUklWICpwcml2ID0gY3VyLT5kYXRhOworICAgICAgICAgICAgQVZCUHJpbnQgYnByaW50OworICAgICAgICAgICAgY2hhciAqZXNjYXBlZCwgKmtleTsKKyAgICAgICAgICAgIGludCBpLCByZXQ7CisKKyAgICAgICAgICAgIGlmICgoa2V5ID0gYXZfYXNwcmludGYoSUQzdjJfUFJJVl9NRVRBREFUQV9QUkVGSVggIiVzIiwgcHJpdi0+b3duZXIpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfYnByaW50X2luaXQoJmJwcmludCwgcHJpdi0+ZGF0YXNpemUgKyAxLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHJpdi0+ZGF0YXNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwcml2LT5kYXRhW2ldIDwgMzIgfHwgcHJpdi0+ZGF0YVtpXSA+IDEyNiB8fCBwcml2LT5kYXRhW2ldID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfYnByaW50ZigmYnByaW50LCAiXFx4JTAyeCIsIHByaXYtPmRhdGFbaV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2JwcmludF9jaGFycygmYnByaW50LCBwcml2LT5kYXRhW2ldLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfYnByaW50X2ZpbmFsaXplKCZicHJpbnQsICZlc2NhcGVkKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShrZXkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocmV0ID0gYXZfZGljdF9zZXQobWV0YWRhdGEsIGtleSwgZXNjYXBlZCwgZGljdF9mbGFncykpIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUoa2V5KTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGVzY2FwZWQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2lkM3YyX3BhcnNlX3ByaXYoQVZGb3JtYXRDb250ZXh0ICpzLCBJRDN2MkV4dHJhTWV0YSAqKmV4dHJhX21ldGEpCit7CisgICAgcmV0dXJuIGZmX2lkM3YyX3BhcnNlX3ByaXZfZGljdCgmcy0+bWV0YWRhdGEsIGV4dHJhX21ldGEpOworfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaWQzdjIuaCBiL2xpYmF2Zm9ybWF0L2lkM3YyLmgKaW5kZXggOWQ3YmYxYy4uOWRlMGJlZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaWQzdjIuaAorKysgYi9saWJhdmZvcm1hdC9pZDN2Mi5oCkBAIC0zOSw2ICszOSw4IEBACiAjZGVmaW5lIElEM3YyX0ZMQUdfRU5DUllQVElPTiAgMHgwMDA0CiAjZGVmaW5lIElEM3YyX0ZMQUdfQ09NUFJFU1NJT04gMHgwMDA4CiAKKyNkZWZpbmUgSUQzdjJfUFJJVl9NRVRBREFUQV9QUkVGSVggImlkM3YyX3ByaXYuIgorCiBlbnVtIElEM3YyRW5jb2RpbmcgewogICAgIElEM3YyX0VOQ09ESU5HX0lTTzg4NTkgID0gMCwKICAgICBJRDN2Ml9FTkNPRElOR19VVEYxNkJPTSA9IDEsCkBAIC03OSw2ICs4MSwxMiBAQAogICAgIHVpbnQzMl90IGRhdGFzaXplOwogfSBJRDN2MkV4dHJhTWV0YVBSSVY7CiAKK3R5cGVkZWYgc3RydWN0IElEM3YyRXh0cmFNZXRhQ0hBUCB7CisgICAgdWludDhfdCAqZWxlbWVudF9pZDsKKyAgICB1aW50MzJfdCBzdGFydCwgZW5kOworICAgIEFWRGljdGlvbmFyeSAqbWV0YTsKK30gSUQzdjJFeHRyYU1ldGFDSEFQOworCiAvKioKICAqIERldGVjdCBJRDN2MiBIZWFkZXIuCiAgKiBAcGFyYW0gYnVmICAgbXVzdCBiZSBJRDN2Ml9IRUFERVJfU0laRSBieXRlIGxvbmcKQEAgLTk3LDggKzEwNSw2IEBACiAvKioKICAqIFJlYWQgYW4gSUQzdjIgdGFnIGludG8gc3BlY2lmaWVkIGRpY3Rpb25hcnkgYW5kIHJldHJpZXZlIHN1cHBvcnRlZCBleHRyYSBtZXRhZGF0YS4KICAqCi0gKiBDaGFwdGVycyBhcmUgbm90IGN1cnJlbnRseSByZWFkIGJ5IHRoaXMgdmFyaWFudC4KLSAqCiAgKiBAcGFyYW0gbWV0YWRhdGEgUGFyc2VkIG1ldGFkYXRhIGlzIHN0b3JlZCBoZXJlCiAgKiBAcGFyYW0gZXh0cmFfbWV0YSBJZiBub3QgTlVMTCwgZXh0cmEgbWV0YWRhdGEgaXMgcGFyc2VkIGludG8gYSBsaXN0IG9mCiAgKiBJRDN2MkV4dHJhTWV0YSBzdHJ1Y3RzIGFuZCAqZXh0cmFfbWV0YSBwb2ludHMgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QKQEAgLTEwNiw3ICsxMTIsNyBAQAogdm9pZCBmZl9pZDN2Ml9yZWFkX2RpY3QoQVZJT0NvbnRleHQgKnBiLCBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSwgY29uc3QgY2hhciAqbWFnaWMsIElEM3YyRXh0cmFNZXRhICoqZXh0cmFfbWV0YSk7CiAKIC8qKgotICogUmVhZCBhbiBJRDN2MiB0YWcsIGluY2x1ZGluZyBzdXBwb3J0ZWQgZXh0cmEgbWV0YWRhdGEgYW5kIGNoYXB0ZXJzLgorICogUmVhZCBhbiBJRDN2MiB0YWcsIGluY2x1ZGluZyBzdXBwb3J0ZWQgZXh0cmEgbWV0YWRhdGEuCiAgKgogICogRGF0YSBpcyByZWFkIGZyb20gYW5kIHN0b3JlZCB0byBBVkZvcm1hdENvbnRleHQuCiAgKgpAQCAtMTU4LDYgKzE2NCwyNCBAQAogICovCiBpbnQgZmZfaWQzdjJfcGFyc2VfYXBpYyhBVkZvcm1hdENvbnRleHQgKnMsIElEM3YyRXh0cmFNZXRhICoqZXh0cmFfbWV0YSk7CiAKKy8qKgorICogQ3JlYXRlIGNoYXB0ZXJzIGZvciBhbGwgQ0hBUCB0YWdzIGZvdW5kIGluIHRoZSBJRDN2MiBoZWFkZXIuCisgKi8KK2ludCBmZl9pZDN2Ml9wYXJzZV9jaGFwdGVycyhBVkZvcm1hdENvbnRleHQgKnMsIElEM3YyRXh0cmFNZXRhICoqZXh0cmFfbWV0YSk7CisKKy8qKgorICogUGFyc2UgUFJJViB0YWdzIGludG8gYSBkaWN0aW9uYXJ5LiBUaGUgUFJJViBvd25lciBpcyB0aGUgbWV0YWRhdGEga2V5LiBUaGUKKyAqIFBSSVYgZGF0YSBpcyB0aGUgdmFsdWUsIHdpdGggbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIGVzY2FwZWQuCisgKi8KK2ludCBmZl9pZDN2Ml9wYXJzZV9wcml2X2RpY3QoQVZEaWN0aW9uYXJ5ICoqZCwgSUQzdjJFeHRyYU1ldGEgKipleHRyYV9tZXRhKTsKKworLyoqCisgKiBBZGQgbWV0YWRhdGEgZm9yIGFsbCBQUklWIHRhZ3MgaW4gdGhlIElEM3YyIGhlYWRlci4gVGhlIFBSSVYgb3duZXIgaXMgdGhlCisgKiBtZXRhZGF0YSBrZXkuIFRoZSBQUklWIGRhdGEgaXMgdGhlIHZhbHVlLCB3aXRoIG5vbi1wcmludGFibGUgY2hhcmFjdGVycworICogZXNjYXBlZC4KKyAqLworaW50IGZmX2lkM3YyX3BhcnNlX3ByaXYoQVZGb3JtYXRDb250ZXh0ICpzLCBJRDN2MkV4dHJhTWV0YSAqKmV4dHJhX21ldGEpOworCiBleHRlcm4gY29uc3QgQVZNZXRhZGF0YUNvbnYgZmZfaWQzdjJfMzRfbWV0YWRhdGFfY29udltdOwogZXh0ZXJuIGNvbnN0IEFWTWV0YWRhdGFDb252IGZmX2lkM3YyXzRfbWV0YWRhdGFfY29udltdOwogCkBAIC0xODAsNiArMjA0LDYgQEAKIAogZXh0ZXJuIGNvbnN0IENvZGVjTWltZSBmZl9pZDN2Ml9taW1lX3RhZ3NbXTsKIAotZXh0ZXJuIGNvbnN0IGNoYXIgKmZmX2lkM3YyX3BpY3R1cmVfdHlwZXNbMjFdOworZXh0ZXJuIGNvbnN0IGNoYXIgKiBjb25zdCBmZl9pZDN2Ml9waWN0dXJlX3R5cGVzWzIxXTsKIAogI2VuZGlmIC8qIEFWRk9STUFUX0lEM1YyX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2lkM3YyZW5jLmMgYi9saWJhdmZvcm1hdC9pZDN2MmVuYy5jCmluZGV4IDhiODA0YzQuLmZmZTM1OGYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2lkM3YyZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvaWQzdjJlbmMuYwpAQCAtODQsNyArODQsNyBAQAogICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fYnVmLCAmcGIpOwogCiAgICAgYXZpb193YjMyKGF2aW9jLCB0YWcpOwotICAgIC8qIElEM3YyLjMgZnJhbWUgc2l6ZSBpcyBub3Qgc3luY2hzYWZlICovCisgICAgLyogSUQzdjIuMyBmcmFtZSBzaXplIGlzIG5vdCBzeW5jLXNhZmUgKi8KICAgICBpZiAoaWQzLT52ZXJzaW9uID09IDMpCiAgICAgICAgIGF2aW9fd2IzMihhdmlvYywgbGVuKTsKICAgICBlbHNlCkBAIC05Niw2ICs5Niw1OSBAQAogICAgIHJldHVybiBsZW4gKyBJRDN2Ml9IRUFERVJfU0laRTsKIH0KIAorLyoqCisgKiBXcml0ZSBhIHByaXYgZnJhbWUgd2l0aCBvd25lciBhbmQgZGF0YS4gJ2tleScgaXMgdGhlIG93bmVyIHByZXBlbmRlZCB3aXRoCisgKiBJRDN2Ml9QUklWX01FVEFEQVRBX1BSRUZJWC4gJ2RhdGEnIGlzIHByb3ZpZGVkIGFzIGEgc3RyaW5nLiBBbnkgXHhYWAorICogKHdoZXJlICdYJyBpcyBhIHZhbGlkIGhleCBkaWdpdCkgd2lsbCBiZSB1bmVzY2FwZWQgdG8gdGhlIGJ5dGUgdmFsdWUuCisgKi8KK3N0YXRpYyBpbnQgaWQzdjJfcHV0X3ByaXYoSUQzdjJFbmNDb250ZXh0ICppZDMsIEFWSU9Db250ZXh0ICphdmlvYywgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpkYXRhKQoreworICAgIGludCBsZW47CisgICAgdWludDhfdCAqcGI7CisgICAgQVZJT0NvbnRleHQgKmR5bl9idWY7CisKKyAgICBpZiAoIWF2X3N0cnN0YXJ0KGtleSwgSUQzdjJfUFJJVl9NRVRBREFUQV9QUkVGSVgsICZrZXkpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGlmIChhdmlvX29wZW5fZHluX2J1ZigmZHluX2J1ZikgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgLy8gb3duZXIgKyBudWxsIGJ5dGUuCisgICAgYXZpb193cml0ZShkeW5fYnVmLCBrZXksIHN0cmxlbihrZXkpICsgMSk7CisKKyAgICB3aGlsZSAoKmRhdGEpIHsKKyAgICAgICAgaWYgKGF2X3N0cnN0YXJ0KGRhdGEsICJcXHgiLCAmZGF0YSkpIHsKKyAgICAgICAgICAgIGlmIChkYXRhWzBdICYmIGRhdGFbMV0gJiYgYXZfaXN4ZGlnaXQoZGF0YVswXSkgJiYgYXZfaXN4ZGlnaXQoZGF0YVsxXSkpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGRpZ2l0c1tdID0ge2RhdGFbMF0sIGRhdGFbMV0sIDB9OworICAgICAgICAgICAgICAgIGF2aW9fdzgoZHluX2J1Ziwgc3RydG9sKGRpZ2l0cywgTlVMTCwgMTYpKTsKKyAgICAgICAgICAgICAgICBkYXRhICs9IDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZmaW9fZnJlZV9keW5fYnVmKCZkeW5fYnVmKTsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZpb2MsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZXNjYXBlICdcXHglLjJzJyBpbiBtZXRhZGF0YSB0YWcgJyIKKyAgICAgICAgICAgICAgICAgICAgICAgSUQzdjJfUFJJVl9NRVRBREFUQV9QUkVGSVggIiVzJy5cbiIsIGRhdGEsIGtleSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUoZHluX2J1ZiwgZGF0YSsrLCAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxlbiA9IGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fYnVmLCAmcGIpOworCisgICAgYXZpb193YjMyKGF2aW9jLCBNS0JFVEFHKCdQJywgJ1InLCAnSScsICdWJykpOworICAgIGlmIChpZDMtPnZlcnNpb24gPT0gMykKKyAgICAgICAgYXZpb193YjMyKGF2aW9jLCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgaWQzdjJfcHV0X3NpemUoYXZpb2MsIGxlbik7CisgICAgYXZpb193YjE2KGF2aW9jLCAwKTsKKyAgICBhdmlvX3dyaXRlKGF2aW9jLCBwYiwgbGVuKTsKKworICAgIGF2X2ZyZWUocGIpOworCisgICAgcmV0dXJuIGxlbiArIElEM3YyX0hFQURFUl9TSVpFOworfQorCiBzdGF0aWMgaW50IGlkM3YyX2NoZWNrX3dyaXRlX3RhZyhJRDN2MkVuY0NvbnRleHQgKmlkMywgQVZJT0NvbnRleHQgKnBiLCBBVkRpY3Rpb25hcnlFbnRyeSAqdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgdGFibGVbXVs0XSwgZW51bSBJRDN2MkVuY29kaW5nIGVuYykKIHsKQEAgLTE4Niw2ICsyMzksMTMgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKChyZXQgPSBpZDN2Ml9wdXRfcHJpdihpZDMsIHBiLCB0LT5rZXksIHQtPnZhbHVlKSkgPiAwKSB7CisgICAgICAgICAgICBpZDMtPmxlbiArPSByZXQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKICAgICAgICAgLyogdW5rbm93biB0YWcsIHdyaXRlIGFzIFRYWFggZnJhbWUgKi8KICAgICAgICAgaWYgKChyZXQgPSBpZDN2Ml9wdXRfdHRhZyhpZDMsIHBiLCB0LT5rZXksIHQtPnZhbHVlLCBNS0JFVEFHKCdUJywgJ1gnLCAnWCcsICdYJyksIGVuYykpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC0yNDIsNiArMzAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRDN2Ml9FTkNPRElOR19VVEY4OwogICAgIGludCBpLCByZXQ7CiAKKyAgICBmZl9zdGFuZGFyZGl6ZV9jcmVhdGlvbl90aW1lKHMpOwogICAgIGlmICgocmV0ID0gd3JpdGVfbWV0YWRhdGEocy0+cGIsICZzLT5tZXRhZGF0YSwgaWQzLCBlbmMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTI2OCw3ICszMjksNyBAQAogCiAgICAgLyogZ2V0IHRoZSBtaW1ldHlwZSovCiAgICAgd2hpbGUgKG1pbWUtPmlkICE9IEFWX0NPREVDX0lEX05PTkUpIHsKLSAgICAgICAgaWYgKG1pbWUtPmlkID09IHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgaWYgKG1pbWUtPmlkID09IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKICAgICAgICAgICAgIG1pbWV0eXBlID0gbWltZS0+c3RyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2lkY2luLmMgYi9saWJhdmZvcm1hdC9pZGNpbi5jCmluZGV4IDEwYWZlZDYuLmNmNjkxMDIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2lkY2luLmMKKysrIGIvbGliYXZmb3JtYXQvaWRjaW4uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBpZCBRdWFrZSBJSSBDSU4gRmlsZSBEZW11eGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTMzLDcgKzMzLDcgQEAKICAqIHR5cGVzLiBIb3dldmVyLCBhIENJTiBmaWxlIGRvZXMgc3RhcnQgd2l0aCA1IDMyLWJpdCBudW1iZXJzIHRoYXQKICAqIHNwZWNpZnkgYXVkaW8gYW5kIHZpZGVvIHBhcmFtZXRlcnMuIFRoaXMgZGVtdXhlciBnZXRzIGFyb3VuZCB0aGUgbGFjawogICogb2YgZmlsZSBzaWduYXR1cmUgYnkgcGVyZm9ybWluZyBzYW5pdHkgY2hlY2tzIG9uIHRob3NlIHBhcmFtZXRlcnMuCi0gKiBQcm9iYWJhbGlzdGljYWxseSwgdGhpcyBpcyBhIHJlYXNvbmFibGUgc29sdXRpb24gc2luY2UgdGhlIG51bWJlciBvZgorICogUHJvYmFiaWxpc3RpY2FsbHksIHRoaXMgaXMgYSByZWFzb25hYmxlIHNvbHV0aW9uIHNpbmNlIHRoZSBudW1iZXIgb2YKICAqIHZhbGlkIGNvbWJpbmF0aW9ucyBvZiB0aGUgNSBwYXJhbWV0ZXJzIGlzIGEgdmVyeSBzbWFsbCBzdWJzZXQgb2YgdGhlCiAgKiB0b3RhbCAxNjAtYml0IG51bWJlciBzcGFjZS4KICAqCkBAIC0xOTgsMTQgKzE5OCwxNCBAQAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCBJRENJTl9GUFMpOwogICAgIHN0LT5zdGFydF90aW1lID0gMDsKICAgICBpZGNpbi0+dmlkZW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSURDSU47Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCi0gICAgc3QtPmNvZGVjLT53aWR0aCA9IHdpZHRoOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSURDSU47CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IHdpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gaGVpZ2h0OwogCiAgICAgLyogbG9hZCB1cCB0aGUgSHVmZm1hbiB0YWJsZXMgaW50byBleHRyYWRhdGEgKi8KLSAgICBpZiAoKHJldCA9IGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgSFVGRk1BTl9UQUJMRV9TSVpFKSkgPCAwKQorICAgIGlmICgocmV0ID0gZmZfZ2V0X2V4dHJhZGF0YShzLCBzdC0+Y29kZWNwYXIsIHBiLCBIVUZGTUFOX1RBQkxFX1NJWkUpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBpZiAoaWRjaW4tPmF1ZGlvX3ByZXNlbnQpIHsKQEAgLTIxNiwxOSArMjE2LDE5IEBACiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDYzLCAxLCBzYW1wbGVfcmF0ZSk7CiAgICAgICAgIHN0LT5zdGFydF90aW1lID0gMDsKICAgICAgICAgaWRjaW4tPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDE7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IGNoYW5uZWxzID4gMSA/IEFWX0NIX0xBWU9VVF9TVEVSRU8gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBieXRlc19wZXJfc2FtcGxlICogODsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHNhbXBsZV9yYXRlICogYnl0ZXNfcGVyX3NhbXBsZSAqIDggKiBjaGFubmVsczsKLSAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IGlkY2luLT5ibG9ja19hbGlnbiA9IGJ5dGVzX3Blcl9zYW1wbGUgKiBjaGFubmVsczsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IGNoYW5uZWxzID4gMSA/IEFWX0NIX0xBWU9VVF9TVEVSRU8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBieXRlc19wZXJfc2FtcGxlICogODsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IHNhbXBsZV9yYXRlICogYnl0ZXNfcGVyX3NhbXBsZSAqIDggKiBjaGFubmVsczsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IGlkY2luLT5ibG9ja19hbGlnbiA9IGJ5dGVzX3Blcl9zYW1wbGUgKiBjaGFubmVsczsKICAgICAgICAgaWYgKGJ5dGVzX3Blcl9zYW1wbGUgPT0gMSkKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKIAogICAgICAgICBpZiAoc2FtcGxlX3JhdGUgJSAxNCAhPSAwKSB7CiAgICAgICAgICAgICBpZGNpbi0+YXVkaW9fY2h1bmtfc2l6ZTEgPSAoc2FtcGxlX3JhdGUgLyAxNCkgKgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaWRyb3FkZWMuYyBiL2xpYmF2Zm9ybWF0L2lkcm9xZGVjLmMKaW5kZXggNzZiYjM5Mi4uOGZkNjdhNiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaWRyb3FkZWMuYworKysgYi9saWJhdmZvcm1hdC9pZHJvcWRlYy5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIGlkIFJvUSAoLnJvcSkgRmlsZSBEZW11eGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTEzMCwxNCArMTMwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjMsIDEsIHJvcS0+ZnJhbWVfcmF0ZSk7CiAgICAgICAgICAgICAgICAgcm9xLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9ST1E7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICAgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9ST1E7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICAgPSAwOyAgLyogbm8gZm91cmNjICovCiAKICAgICAgICAgICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBwcmVhbWJsZSwgUm9RX0NIVU5LX1BSRUFNQkxFX1NJWkUpICE9IFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggID0gcm9xLT53aWR0aCAgPSBBVl9STDE2KHByZWFtYmxlKTsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHJvcS0+aGVpZ2h0ID0gQVZfUkwxNihwcmVhbWJsZSArIDIpOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggID0gcm9xLT53aWR0aCAgPSBBVl9STDE2KHByZWFtYmxlKTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IHJvcS0+aGVpZ2h0ID0gQVZfUkwxNihwcmVhbWJsZSArIDIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLyogZG9uJ3QgY2FyZSBhYm91dCB0aGlzIGNodW5rIGFueW1vcmUgKi8KQEAgLTE1Nyw2ICsxNTcsOSBAQAogICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IEFWX1JMMzIoJnByZWFtYmxlWzJdKSArIFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFICogMiArCiAgICAgICAgICAgICAgICAgY29kZWJvb2tfc2l6ZTsKIAorICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPiBJTlRfTUFYKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCiAgICAgICAgICAgICAvKiByZXdpbmQgKi8KICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgY29kZWJvb2tfb2Zmc2V0LCBTRUVLX1NFVCk7CiAKQEAgLTE3OCwyMiArMTgxLDIyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIFJvUV9BVURJT19TQU1QTEVfUkFURSk7CiAgICAgICAgICAgICAgICAgcm9xLT5hdWRpb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9ST1FfRFBDTTsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyB0YWcgKi8KKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JPUV9EUENNOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIHRhZyAqLwogICAgICAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IFJvUV9TT1VORF9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDI7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcm9xLT5hdWRpb19jaGFubmVscyAgICA9IHN0LT5jb2RlYy0+Y2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IFJvUV9BVURJT19TQU1QTEVfUkFURTsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqCi0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgICAgICAgICAgICAgcm9xLT5hdWRpb19jaGFubmVscyAgICA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IFJvUV9BVURJT19TQU1QTEVfUkFURTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAqCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIGNhc2UgUm9RX1FVQURfVlE6CiAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBSb1FfUVVBRF9WUSkgewpAQCAtMjE5LDggKzIyMiwxMCBAQAogICAgICAgICAgICAgcGt0LT5wb3M9IGF2aW9fdGVsbChwYik7CiAgICAgICAgICAgICByZXQgPSBhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIFJvUV9DSFVOS19QUkVBTUJMRV9TSVpFLAogICAgICAgICAgICAgICAgIGNodW5rX3NpemUpOwotICAgICAgICAgICAgaWYgKHJldCAhPSBjaHVua19zaXplKQorICAgICAgICAgICAgaWYgKHJldCAhPSBjaHVua19zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBwYWNrZXRfcmVhZCA9IDE7CiAgICAgICAgICAgICBicmVhazsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2lkcm9xZW5jLmMgYi9saWJhdmZvcm1hdC9pZHJvcWVuYy5jCmluZGV4IDI4YTNhYmEuLjgxMjJlZmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2lkcm9xZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvaWRyb3FlbmMuYwpAQCAtMjksMjUgKzI5LDI0IEBACiAgICAgICAgIDB4ODQsIDB4MTAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIC8qIGZwczogKi8gMHgxRSwgMHgwMAogICAgIH07CiAgICAgaW50IG47Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OwogCiAvLyBzZXQgdGhlIGFjdHVhbCBmcHMKICAgICBmb3Iobj0wO248cy0+bmJfc3RyZWFtcztuKyspIHsKLSAgICAgICAgaWYgKChhdmN0eD1zLT5zdHJlYW1zW25dLT5jb2RlYyktPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmIChzLT5zdHJlYW1zW25dLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmcHM7CiAKLSAgICAgICAgICAgIGlmIChhdmN0eC0+dGltZV9iYXNlLm51bSAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGcmFtZSByYXRlIG11c3QgYmUgaW50ZWdlclxuIik7CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tuXS0+YXZnX2ZyYW1lX3JhdGUuZGVuICE9IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRnJhbWUgcmF0ZSBtdXN0IGJlIGludGVnZXJcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICgoZnBzPWF2Y3R4LT50aW1lX2Jhc2UuZGVuKSA+IDI1NSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiRnJhbWUgcmF0ZSBtYXkgbm90IGV4Y2VlZCAyNTVmcHNcbiIpOworICAgICAgICAgICAgaWYgKChmcHM9cy0+c3RyZWFtc1tuXS0+YXZnX2ZyYW1lX3JhdGUubnVtKSA+IDI1NSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGcmFtZSByYXRlIG1heSBub3QgZXhjZWVkIDI1NWZwc1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGZwcyAhPSAzMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX1dBUk5JTkcsICJGb3IgdmludGFnZSBjb21wYXRpYmlsaXR5IGZwcyBtdXN0IGJlIDMwXG4iKTsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJGb3IgdmludGFnZSBjb21wYXRpYmlsaXR5IGZwcyBtdXN0IGJlIDMwXG4iKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaGVhZGVyWzZdID0gZnBzOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaWZmLmMgYi9saWJhdmZvcm1hdC9pZmYuYwppbmRleCAyODg5MDgzLi40Y2YxN2Y2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9pZmYuYworKysgYi9saWJhdmZvcm1hdC9pZmYuYwpAQCAtNTksNyArNTksMTQgQEAKICNkZWZpbmUgSURfUkdCOCAgICAgICBNS1RBRygnUicsJ0cnLCdCJywnOCcpCiAjZGVmaW5lIElEX1JHQk4gICAgICAgTUtUQUcoJ1InLCdHJywnQicsJ04nKQogI2RlZmluZSBJRF9EU0QgICAgICAgIE1LVEFHKCdEJywnUycsJ0QnLCcgJykKKyNkZWZpbmUgSURfRFNUICAgICAgICBNS1RBRygnRCcsJ1MnLCdUJywnICcpCisjZGVmaW5lIElEX0RTVEMgICAgICAgTUtUQUcoJ0QnLCdTJywnVCcsJ0MnKQorI2RlZmluZSBJRF9EU1RGICAgICAgIE1LVEFHKCdEJywnUycsJ1QnLCdGJykKKyNkZWZpbmUgSURfRlJURSAgICAgICBNS1RBRygnRicsJ1InLCdUJywnRScpCiAjZGVmaW5lIElEX0FOSU0gICAgICAgTUtUQUcoJ0EnLCdOJywnSScsJ00nKQorI2RlZmluZSBJRF9BTkhEICAgICAgIE1LVEFHKCdBJywnTicsJ0gnLCdEJykKKyNkZWZpbmUgSURfRExUQSAgICAgICBNS1RBRygnRCcsJ0wnLCdUJywnQScpCisjZGVmaW5lIElEX0RQQU4gICAgICAgTUtUQUcoJ0QnLCdQJywnQScsJ04nKQogCiAjZGVmaW5lIElEX0ZPUk0gICAgICAgTUtUQUcoJ0YnLCdPJywnUicsJ00nKQogI2RlZmluZSBJRF9GUk04ICAgICAgIE1LVEFHKCdGJywnUicsJ00nLCc4JykKQEAgLTExMyw2ICsxMjAsNyBAQAogICAgIHVuc2lnbmVkICB0cmFuc3BhcmVuY3k7IC8vLzwgdHJhbnNwYXJlbmN5IGNvbG9yIGluZGV4IGluIHBhbGV0dGUKICAgICB1bnNpZ25lZCAgbWFza2luZzsgICAgICAvLy88IG1hc2tpbmcgbWV0aG9kIHVzZWQKICAgICB1aW50OF90ICAgdHZkY1szMl07ICAgICAvLy88IFRWREMgbG9va3VwIHRhYmxlCisgICAgaW50NjRfdCAgIHB0czsKIH0gSWZmRGVtdXhDb250ZXh0OwogCiAvKiBNZXRhZGF0YSBzdHJpbmcgcmVhZCAqLwpAQCAtMTQ3LDcgKzE1NSw2IEBACiAgICAgICAgICAgQVZfUkwzMihkKzgpID09IElEX0RFRVAgfHwKICAgICAgICAgICBBVl9STDMyKGQrOCkgPT0gSURfSUxCTSB8fAogICAgICAgICAgIEFWX1JMMzIoZCs4KSA9PSBJRF9SR0I4IHx8Ci0gICAgICAgICAgQVZfUkwzMihkKzgpID09IElEX1JHQjggfHwKICAgICAgICAgICBBVl9STDMyKGQrOCkgPT0gSURfQU5JTSB8fAogICAgICAgICAgIEFWX1JMMzIoZCs4KSA9PSBJRF9SR0JOKSkgfHwKICAgICAgICAgIChBVl9STDMyKGQpID09IElEX0ZSTTggJiYgQVZfUkwzMihkKzEyKSA9PSBJRF9EU0QpKQpAQCAtMTU3LDYgKzE2NCw3IEBACiAKIHN0YXRpYyBjb25zdCBBVkNvZGVjVGFnIGRzZF9jb2RlY190YWdzW10gPSB7CiAgICAgeyBBVl9DT0RFQ19JRF9EU0RfTVNCRiwgSURfRFNEIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EU1QsICAgICAgSURfRFNUIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAwIH0sCiB9OwogCkBAIC0yMDksNyArMjE3LDcgQEAKIHsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKIAotICAgIHdoaWxlIChhdmlvX3RlbGwocGIpICsgMTIgPD0gZW9mKSB7CisgICAgd2hpbGUgKGF2aW9fdGVsbChwYikgKyAxMiA8PSBlb2YgJiYgIWF2aW9fZmVvZihwYikpIHsKICAgICAgICAgdWludDMyX3QgdGFnICAgICAgPSBhdmlvX3JsMzIocGIpOwogICAgICAgICB1aW50NjRfdCBzaXplICAgICA9IGF2aW9fcmI2NChwYik7CiAgICAgICAgIHVpbnQ2NF90IG9yaWdfcG9zID0gYXZpb190ZWxsKHBiKTsKQEAgLTI0Myw3ICsyNTEsNyBAQAogICAgIGludCBkc2RfbGF5b3V0WzZdOwogICAgIElEM3YyRXh0cmFNZXRhICppZDN2Ml9leHRyYV9tZXRhOwogCi0gICAgd2hpbGUgKGF2aW9fdGVsbChwYikgKyAxMiA8PSBlb2YpIHsKKyAgICB3aGlsZSAoYXZpb190ZWxsKHBiKSArIDEyIDw9IGVvZiAmJiAhYXZpb19mZW9mKHBiKSkgewogICAgICAgICB1aW50MzJfdCB0YWcgICAgICA9IGF2aW9fcmwzMihwYik7CiAgICAgICAgIHVpbnQ2NF90IHNpemUgICAgID0gYXZpb19yYjY0KHBiKTsKICAgICAgICAgdWludDY0X3Qgb3JpZ19wb3MgPSBhdmlvX3RlbGwocGIpOwpAQCAtMjYyLDIxICsyNzAsMjEgQEAKICAgICAgICAgY2FzZSBNS1RBRygnQycsJ0gnLCdOJywnTCcpOgogICAgICAgICAgICAgaWYgKHNpemUgPCAyKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IGF2aW9fcmIxNihwYik7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA8IDIgKyBzdC0+Y29kZWMtPmNoYW5uZWxzICogNCkKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgaWYgKHNpemUgPCAyICsgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIDQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gMDsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID4gRkZfQVJSQVlfRUxFTVMoZHNkX2xheW91dCkpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSAwOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPiBGRl9BUlJBWV9FTEVNUyhkc2RfbGF5b3V0KSkgewogICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiY2hhbm5lbCBsYXlvdXQiKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+Y29kZWMtPmNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPmNvZGVjcGFyLT5jaGFubmVsczsgaSsrKQogICAgICAgICAgICAgICAgIGRzZF9sYXlvdXRbaV0gPSBhdmlvX3JsMzIocGIpOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGRzZF9jaGFubmVsX2xheW91dCk7IGkrKykgewogICAgICAgICAgICAgICAgIGNvbnN0IERTRExheW91dERlc2MgKiBkID0gJmRzZF9jaGFubmVsX2xheW91dFtpXTsKLSAgICAgICAgICAgICAgICBpZiAoYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGQtPmxheW91dCkgPT0gc3QtPmNvZGVjLT5jaGFubmVscyAmJgotICAgICAgICAgICAgICAgICAgICAhbWVtY21wKGQtPmRzZF9sYXlvdXQsIGRzZF9sYXlvdXQsIHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiBzaXplb2YodWludDMyX3QpKSkgewotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gZC0+bGF5b3V0OworICAgICAgICAgICAgICAgIGlmIChhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoZC0+bGF5b3V0KSA9PSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICYmCisgICAgICAgICAgICAgICAgICAgICFtZW1jbXAoZC0+ZHNkX2xheW91dCwgZHNkX2xheW91dCwgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIHNpemVvZih1aW50MzJfdCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBkLT5sYXlvdXQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTI4NSwxMSArMjkzLDExIEBACiAgICAgICAgIGNhc2UgTUtUQUcoJ0MnLCdNJywnUCcsJ1InKToKICAgICAgICAgICAgIGlmIChzaXplIDwgNCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIHRhZyA9IGF2aW9fcmwzMihwYik7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGRzZF9jb2RlY190YWdzLCB0YWcpOwotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmNvZGVjX2lkKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiclYyVjJWMlYycgY29tcHJlc3Npb24gaXMgbm90IHN1cHBvcnRlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgdGFnJjB4RkYsICh0YWc+PjgpJjB4RkYsICh0YWc+PjE2KSYweEZGLCAodGFnPj4yNCkmMHhGRik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGRzZF9jb2RlY190YWdzLCB0YWcpOworICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiclcycgY29tcHJlc3Npb24gaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cih0YWcpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTI5NywxNCArMzA1LDE1IEBACiAgICAgICAgIGNhc2UgTUtUQUcoJ0YnLCdTJywnICcsJyAnKToKICAgICAgICAgICAgIGlmIChzaXplIDwgNCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocGIpIC8gODsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocGIpIC8gODsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgTUtUQUcoJ0knLCdEJywnMycsJyAnKToKICAgICAgICAgICAgIGlkM3YyX2V4dHJhX21ldGEgPSBOVUxMOwogICAgICAgICAgICAgZmZfaWQzdjJfcmVhZChzLCBJRDN2Ml9ERUZBVUxUX01BR0lDLCAmaWQzdjJfZXh0cmFfbWV0YSwgc2l6ZSk7CiAgICAgICAgICAgICBpZiAoaWQzdjJfZXh0cmFfbWV0YSkgewotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfaWQzdjJfcGFyc2VfYXBpYyhzLCAmaWQzdjJfZXh0cmFfbWV0YSkpIDwgMCkgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfaWQzdjJfcGFyc2VfYXBpYyhzLCAmaWQzdjJfZXh0cmFfbWV0YSkpIDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAocmV0ID0gZmZfaWQzdjJfcGFyc2VfY2hhcHRlcnMocywgJmlkM3YyX2V4dHJhX21ldGEpKSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZpZDN2Ml9leHRyYV9tZXRhKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICB9CkBAIC0zMjMsOCArMzMyLDggQEAKICAgICAgICAgICAgIGNvbmZpZyA9IGF2aW9fcmIxNihwYik7CiAgICAgICAgICAgICBpZiAoY29uZmlnICE9IDB4RkZGRikgewogICAgICAgICAgICAgICAgIGlmIChjb25maWcgPCBGRl9BUlJBWV9FTEVNUyhkc2RfbG91ZHNwZWFrZXJfY29uZmlnKSkKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IGRzZF9sb3Vkc3BlYWtlcl9jb25maWdbY29uZmlnXTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQpCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBkc2RfbG91ZHNwZWFrZXJfY29uZmlnW2NvbmZpZ107CisgICAgICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0KQogICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImxvdWRzcGVha2VyIGNvbmZpZ3VyYXRpb24gJWQiLCBjb25maWcpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0zMzYsNiArMzQ1LDYzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcmVhZF9kc3RfZnJhbWUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIElmZkRlbXV4Q29udGV4dCAqaWZmID0gcy0+cHJpdl9kYXRhOworICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIHVpbnQzMl90IGNodW5rX2lkOworICAgIHVpbnQ2NF90IGNodW5rX3BvcywgZGF0YV9wb3MsIGRhdGFfc2l6ZTsKKyAgICBpbnQgcmV0ID0gQVZFUlJPUl9FT0Y7CisKKyAgICB3aGlsZSAoIWF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgY2h1bmtfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgaWYgKGNodW5rX3BvcyA+PSBpZmYtPmJvZHlfZW5kKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgIGNodW5rX2lkID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgZGF0YV9zaXplID0gaWZmLT5pc182NGJpdCA/IGF2aW9fcmI2NChwYikgOiBhdmlvX3JiMzIocGIpOworICAgICAgICBkYXRhX3BvcyA9IGF2aW9fdGVsbChwYik7CisKKyAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IDEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBzd2l0Y2ggKGNodW5rX2lkKSB7CisgICAgICAgIGNhc2UgSURfRFNURjoKKyAgICAgICAgICAgIGlmICghcGt0KSB7CisgICAgICAgICAgICAgICAgaWZmLT5ib2R5X3BvcyAgPSBhdmlvX3RlbGwocGIpIC0gKGlmZi0+aXNfNjRiaXQgPyAxMiA6IDgpOworICAgICAgICAgICAgICAgIGlmZi0+Ym9keV9zaXplID0gaWZmLT5ib2R5X2VuZCAtIGlmZi0+Ym9keV9wb3M7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSAmIDEpCisgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxKTsKKyAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IDU4OCAqIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAvIDQ0MTAwOworICAgICAgICAgICAgcGt0LT5wb3MgPSBjaHVua19wb3M7CisKKyAgICAgICAgICAgIGNodW5rX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBpZiAoY2h1bmtfcG9zID49IGlmZi0+Ym9keV9lbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgY2h1bmtfcG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIElEX0ZSVEU6CisgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPmR1cmF0aW9uID0gYXZpb19yYjMyKHBiKSAqIDU4OExMICogcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIC8gNDQxMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGF2aW9fc2tpcChwYiwgZGF0YV9zaXplIC0gKGF2aW9fdGVsbChwYikgLSBkYXRhX3BvcykgKyAoZGF0YV9zaXplICYgMSkpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBjb25zdCB1aW50OF90IGRlZXBfcmdiMjRbXSA9IHswLCAwLCAwLCAzLCAwLCAxLCAwLCA4LCAwLCAyLCAwLCA4LCAwLCAzLCAwLCA4fTsKIHN0YXRpYyBjb25zdCB1aW50OF90IGRlZXBfcmdiYVtdICA9IHswLCAwLCAwLCA0LCAwLCAxLCAwLCA4LCAwLCAyLCAwLCA4LCAwLCAzLCAwLCA4fTsKIHN0YXRpYyBjb25zdCB1aW50OF90IGRlZXBfYmdyYVtdICA9IHswLCAwLCAwLCA0LCAwLCAzLCAwLCA4LCAwLCAyLCAwLCA4LCAwLCAxLCAwLCA4fTsKQEAgLTM2MCwxNSArNDI2LDE0IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CiAgICAgaWZmLT5pc182NGJpdCA9IGF2aW9fcmwzMihwYikgPT0gSURfRlJNODsKICAgICBhdmlvX3NraXAocGIsIGlmZi0+aXNfNjRiaXQgPyA4IDogNCk7CiAgICAgLy8gY29kZWNfdGFnIHVzZWQgYnkgQnl0ZVJ1bjEgZGVjb2RlciB0byBkaXN0aW5ndWlzaCBwcm9ncmVzc2l2ZSAoUEJNKSBhbmQgaW50ZXJsYWNlZCAoSUxCTSkgY29udGVudAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gYXZpb19ybDMyKHBiKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190YWcgPT0gSURfQU5JTSkgewotICAgICAgICBhdmlvX3NraXAocGIsIDgpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IGF2aW9fcmwzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9PSBJRF9BTklNKSB7CisgICAgICAgIGF2aW9fc2tpcChwYiwgMTIpOwogICAgIH0KICAgICBpZmYtPmJpdG1hcF9jb21wcmVzc2lvbiA9IC0xOwogICAgIGlmZi0+c3Z4OF9jb21wcmVzc2lvbiA9IC0xOwpAQCAtMzg2LDEyICs0NTEsMTIgQEAKIAogICAgICAgICBzd2l0Y2goY2h1bmtfaWQpIHsKICAgICAgICAgY2FzZSBJRF9WSERSOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogCiAgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgMTQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDEyKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIxNihwYik7CiAgICAgICAgICAgICBpZiAoZGF0YV9zaXplID49IDE2KSB7CiAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxKTsKICAgICAgICAgICAgICAgICBpZmYtPnN2eDhfY29tcHJlc3Npb24gPSBhdmlvX3I4KHBiKTsKQEAgLTM5OSw3ICs0NjQsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBJRF9NSERSOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogCiAgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgMzIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC00MTEsMzQgKzQ3Niw0MCBAQAogICAgICAgICAgICAgaWYgKCFkZW4pCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDIpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IG51bSAvIGRlbjsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IG51bSAvIGRlbjsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBhdmlvX3JiMTYocGIpOwogICAgICAgICAgICAgaWZmLT5tYXVkX2NvbXByZXNzaW9uID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID09IDEpCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwotICAgICAgICAgICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA9PSAyKQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPT0gMSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzID09IDIpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIElEX0FCSVQ6CiAgICAgICAgIGNhc2UgSURfQk9EWToKICAgICAgICAgY2FzZSBJRF9EQk9EOgogICAgICAgICBjYXNlIElEX0RTRDoKKyAgICAgICAgY2FzZSBJRF9EU1Q6CiAgICAgICAgIGNhc2UgSURfTURBVDoKICAgICAgICAgICAgIGlmZi0+Ym9keV9wb3MgPSBhdmlvX3RlbGwocGIpOwogICAgICAgICAgICAgaWZmLT5ib2R5X2VuZCA9IGlmZi0+Ym9keV9wb3MgKyBkYXRhX3NpemU7CiAgICAgICAgICAgICBpZmYtPmJvZHlfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICAgICAgICAgIGlmIChjaHVua19pZCA9PSBJRF9EU1QpIHsKKyAgICAgICAgICAgICAgICBpbnQgcmV0ID0gcmVhZF9kc3RfZnJhbWUocywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIElEX0NIQU46CiAgICAgICAgICAgICBpZiAoZGF0YV9zaXplIDwgNCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGlmIChhdmlvX3JiMzIocGIpIDwgNikgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAxOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAyOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTQ1NCwyMiArNTI1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3NpemUpOwogICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBkYXRhX3NpemUgKyBJRkZfRVhUUkFfVklERU9fU0laRTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2MoZGF0YV9zaXplICsgSUZGX0VYVFJBX1ZJREVPX1NJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gZGF0YV9zaXplICsgSUZGX0VYVFJBX1ZJREVPX1NJWkU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSAgICAgID0gYXZfbWFsbG9jKGRhdGFfc2l6ZSArIElGRl9FWFRSQV9WSURFT19TSVpFICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIElGRl9FWFRSQV9WSURFT19TSVpFLCBkYXRhX3NpemUpIDwgMCkKKyAgICAgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgSUZGX0VYVFJBX1ZJREVPX1NJWkUsIGRhdGFfc2l6ZSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIElEX0JNSEQ6Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOwogICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA8PSA4KQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOwogICAgICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLy8geCwgeSBvZmZzZXQKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcjgocGIpOwogICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA+PSAxMCkKICAgICAgICAgICAgICAgICBtYXNraW5nICAgICAgICAgICAgICAgICAgICAgID0gYXZpb19yOChwYik7CiAgICAgICAgICAgICBpZiAoZGF0YV9zaXplID49IDExKQpAQCAtNDg0LDIxICs1NTUsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgSURfQU5IRDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgSURfRFBBTjoKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMik7CisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgY2FzZSBJRF9EUEVMOgogICAgICAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IDQgfHwgKGRhdGFfc2l6ZSAmIDMpKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgaWYgKChmbXRfc2l6ZSA9IGF2aW9fcmVhZChwYiwgZm10LCBzaXplb2YoZm10KSkpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gZm10X3NpemU7CiAgICAgICAgICAgICBpZiAoZm10X3NpemUgPT0gc2l6ZW9mKGRlZXBfcmdiMjQpICYmICFtZW1jbXAoZm10LCBkZWVwX3JnYjI0LCBzaXplb2YoZGVlcF9yZ2IyNCkpKQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1JHQjI0OwogICAgICAgICAgICAgZWxzZSBpZiAoZm10X3NpemUgPT0gc2l6ZW9mKGRlZXBfcmdiYSkgJiYgIW1lbWNtcChmbXQsIGRlZXBfcmdiYSwgc2l6ZW9mKGRlZXBfcmdiYSkpKQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUkdCQTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfUkdCQTsKICAgICAgICAgICAgIGVsc2UgaWYgKGZtdF9zaXplID09IHNpemVvZihkZWVwX2JncmEpICYmICFtZW1jbXAoZm10LCBkZWVwX2JncmEsIHNpemVvZihkZWVwX2JncmEpKSkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX0JHUkE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0JHUkE7CiAgICAgICAgICAgICBlbHNlIGlmIChmbXRfc2l6ZSA9PSBzaXplb2YoZGVlcF9hcmdiKSAmJiAhbWVtY21wKGZtdCwgZGVlcF9hcmdiLCBzaXplb2YoZGVlcF9hcmdiKSkpCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9BUkdCOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9BUkdCOwogICAgICAgICAgICAgZWxzZSBpZiAoZm10X3NpemUgPT0gc2l6ZW9mKGRlZXBfYWJncikgJiYgIW1lbWNtcChmbXQsIGRlZXBfYWJnciwgc2l6ZW9mKGRlZXBfYWJncikpKQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfQUJHUjsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfQUJHUjsKICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiY29sb3IgZm9ybWF0ICUuMTZzIiwgZm10KTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CkBAIC01MDYsMjIgKzU4NSwyMiBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBJRF9ER0JMOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKICAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPCA4KQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOwogICAgICAgICAgICAgaWZmLT5iaXRtYXBfY29tcHJlc3Npb24gICAgICAgICAgPSBhdmlvX3JiMTYocGIpOwogICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICAgICAgPSBhdmlvX3I4KHBiKTsKICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAgICAgID0gYXZpb19yOChwYik7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDI0OworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgSURfRExPQzoKICAgICAgICAgICAgIGlmIChkYXRhX3NpemUgPCA0KQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JiMTYocGIpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBJRF9UVkRDOgpAQCAtNTQ1LDcgKzYyNCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB2ZXJzaW9uID0gYXZpb19yYjMyKHBiKTsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJEU0lGRiB2JWQuJWQuJWQuJWRcbiIsdmVyc2lvbiA+PiAyNCwgKHZlcnNpb24gPj4gMTYpICYgMHhGRiwgKHZlcnNpb24gPj4gOCkgJiAweEZGLCB2ZXJzaW9uICYgMHhGRik7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE1LVEFHKCdEJywnSScsJ0knLCdOJyk6CkBAIC02MjYsMzcgKzcwNSw0MSBAQAogICAgICAgICBhdmlvX3NraXAocGIsIGRhdGFfc2l6ZSAtIChhdmlvX3RlbGwocGIpIC0gb3JpZ19wb3MpICsgKGRhdGFfc2l6ZSAmIDEpKTsKICAgICB9CiAKLSAgICBhdmlvX3NlZWsocGIsIGlmZi0+Ym9keV9wb3MsIFNFRUtfU0VUKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gSURfQU5JTSkKKyAgICAgICAgYXZpb19zZWVrKHBiLCAxMiwgU0VFS19TRVQpOworICAgIGVsc2UKKyAgICAgICAgYXZpb19zZWVrKHBiLCBpZmYtPmJvZHlfcG9zLCBTRUVLX1NFVCk7CiAKLSAgICBzd2l0Y2goc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgc3dpdGNoKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSkgewogICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190YWcgPT0gSURfMTZTVikKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkVfUExBTkFSOwotICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBJRF9NQVVEKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9PSBJRF8xNlNWKQorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVI7CisgICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID09IElEX01BVUQpIHsKICAgICAgICAgICAgIGlmIChpZmYtPm1hdWRfYml0cyA9PSA4ICYmICFpZmYtPm1hdWRfY29tcHJlc3Npb24pIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlmZi0+bWF1ZF9iaXRzID09IDE2ICYmICFpZmYtPm1hdWRfY29tcHJlc3Npb24pIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlmZi0+bWF1ZF9iaXRzID09ICA4ICYmIGlmZi0+bWF1ZF9jb21wcmVzc2lvbiA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9BTEFXOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fQUxBVzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoaWZmLT5tYXVkX2JpdHMgPT0gIDggJiYgaWZmLT5tYXVkX2NvbXByZXNzaW9uID09IDMpIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX01VTEFXOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiY29tcHJlc3Npb24gJWQgYW5kIGJpdCBkZXB0aCAlZCIsIGlmZi0+bWF1ZF9jb21wcmVzc2lvbiwgaWZmLT5tYXVkX2JpdHMpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyAhPSBJRF9EU0QpIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAhPSBJRF9EU0QgJiYKKyAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAhPSBJRF9EU1QpIHsKICAgICAgICAgICAgIHN3aXRjaCAoaWZmLT5zdng4X2NvbXByZXNzaW9uKSB7CiAgICAgICAgICAgICBjYXNlIENPTVBfTk9ORToKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1M4X1BMQU5BUjsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1M4X1BMQU5BUjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQ09NUF9GSUI6Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEXzhTVlhfRklCOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF84U1ZYX0ZJQjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQ09NUF9FWFA6Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEXzhTVlhfRVhQOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF84U1ZYX0VYUDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKQEAgLTY2NSwyOSArNzQ4LDMzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwotICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSAoaW50NjRfdClzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAqIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gSURfRFNEICYmIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPD0gMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICBpZmYtPmJwcCAgICAgICAgICA9IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICBpZmYtPmJwcCAgICAgICAgICA9IHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gSURfQU5JTSkKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCA2MCk7CiAgICAgICAgIGlmICgoc2NyZWVubW9kZSAmIDB4ODAwIC8qIEhvbGQgQW5kIE1vZGlmeSAqLykgJiYgaWZmLT5icHAgPD0gOCkgewogICAgICAgICAgICAgaWZmLT5oYW0gICAgICA9IGlmZi0+YnBwID4gNiA/IDYgOiA0OwotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMjQ7CiAgICAgICAgIH0KICAgICAgICAgaWZmLT5mbGFncyAgICAgICAgPSAoc2NyZWVubW9kZSAmIDB4ODAgLyogRXh0cmEgSGFsZkJyaXRlICovKSAmJiBpZmYtPmJwcCA8PSA4OwogICAgICAgICBpZmYtPm1hc2tpbmcgICAgICA9IG1hc2tpbmc7CiAgICAgICAgIGlmZi0+dHJhbnNwYXJlbmN5ID0gdHJhbnNwYXJlbmN5OwogCi0gICAgICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBJRkZfRVhUUkFfVklERU9fU0laRTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2MoSUZGX0VYVFJBX1ZJREVPX1NJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpCisgICAgICAgIGlmICghc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSBJRkZfRVhUUkFfVklERU9fU0laRTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICAgICAgPSBhdl9tYWxsb2MoSUZGX0VYVFJBX1ZJREVPX1NJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgfQotICAgICAgICBhdl9hc3NlcnQwKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPj0gSUZGX0VYVFJBX1ZJREVPX1NJWkUpOwotICAgICAgICBidWYgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YTsKKyAgICAgICAgYXZfYXNzZXJ0MChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID49IElGRl9FWFRSQV9WSURFT19TSVpFKTsKKyAgICAgICAgYnVmID0gc3QtPmNvZGVjcGFyLT5leHRyYWRhdGE7CiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJmJ1ZiwgSUZGX0VYVFJBX1ZJREVPX1NJWkUpOwogICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZidWYsIGlmZi0+Yml0bWFwX2NvbXByZXNzaW9uKTsKICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmYnVmLCBpZmYtPmJwcCk7CkBAIC02OTYsNyArNzgzLDcgQEAKICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmYnVmLCBpZmYtPnRyYW5zcGFyZW5jeSk7CiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJmJ1ZiwgaWZmLT5tYXNraW5nKTsKICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZidWYsIGlmZi0+dHZkYywgc2l6ZW9mKGlmZi0+dHZkYykpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSUZGX0lMQk07CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9JRkZfSUxCTTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNzA1LDYgKzc5MiwyOCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdW5zaWduZWQgZ2V0X2FuaW1fZHVyYXRpb24odWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBidWYsIHNpemUpOworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCA0KTsKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA+IDgpIHsKKyAgICAgICAgdW5zaWduZWQgY2h1bmsgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2IpOworICAgICAgICB1bnNpZ25lZCBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKworICAgICAgICBpZiAoY2h1bmsgPT0gSURfQU5IRCkgeworICAgICAgICAgICAgaWYgKHNpemUgPCA0MCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAxNCk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCBzaXplICsgc2l6ZSAmIDEpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAxMDsKK30KKwogc3RhdGljIGludCBpZmZfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCkKIHsKQEAgLTcxNCwzOSArODIzLDYxIEBACiAgICAgaW50IHJldDsKICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CiAKLSAgICBpZiAocG9zID49IGlmZi0+Ym9keV9lbmQpCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgIT0gSURfQU5JTSAmJiBwb3MgPj0gaWZmLT5ib2R5X2VuZCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnID09IElEX0RTRCB8fCBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBJRF9NQVVEKSB7Ci0gICAgICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIEZGTUlOKGlmZi0+Ym9keV9lbmQgLSBwb3MsIDEwMjQgKiBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKSk7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID09IElEX0RTRCB8fCBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9PSBJRF9NQVVEKSB7CisgICAgICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIEZGTUlOKGlmZi0+Ym9keV9lbmQgLSBwb3MsIDEwMjQgKiBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gSURfRFNUKSB7CisgICAgICAgICAgICByZXR1cm4gcmVhZF9kc3RfZnJhbWUocywgcGt0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChpZmYtPmJvZHlfc2l6ZSA+IElOVF9NQVgpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGlmZi0+Ym9keV9zaXplKTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICB1aW50OF90ICpidWY7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPT0gSURfQU5JTSkgeworICAgICAgICB1aW50NjRfdCBkYXRhX3NpemUsIG9yaWdfcG9zOworICAgICAgICB1aW50MzJfdCBjaHVua19pZCwgY2h1bmtfaWQyOwogCi0gICAgICAgIGlmIChpZmYtPmJvZHlfc2l6ZSA+IElOVF9NQVggLSAyKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgaWZmLT5ib2R5X3NpemUgKyAyKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHdoaWxlICghYXZpb19mZW9mKHBiKSkgeworICAgICAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgICAgICAgICBvcmlnX3BvcyAgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgY2h1bmtfaWQgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIGRhdGFfc2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBjaHVua19pZDIgPSBhdmlvX3JsMzIocGIpOworCisgICAgICAgICAgICBpZiAoY2h1bmtfaWQgID09IElEX0ZPUk0gJiYKKyAgICAgICAgICAgICAgICBjaHVua19pZDIgPT0gSURfSUxCTSkgeworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgLTQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua19pZCA9PSBJRF9GT1JNICYmCisgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX2lkMiA9PSBJRF9BTklNKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotCi0gICAgICAgIGJ1ZiA9IHBrdC0+ZGF0YTsKLSAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmYnVmLCAyKTsKLSAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBidWYsIGlmZi0+Ym9keV9zaXplKTsKLSAgICAgICAgaWYgKHJldDwwKSB7Ci0gICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKLSAgICAgICAgfSBlbHNlIGlmIChyZXQgPCBpZmYtPmJvZHlfc2l6ZSkKLSAgICAgICAgICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCByZXQgKyAyKTsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBkYXRhX3NpemUpOworICAgICAgICBwa3QtPnBvcyA9IG9yaWdfcG9zOworICAgICAgICBwa3QtPmR1cmF0aW9uID0gZ2V0X2FuaW1fZHVyYXRpb24ocGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICBpZiAocG9zID09IDEyKQorICAgICAgICAgICAgcGt0LT5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgIT0gSURfQU5JTSkgeworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGlmZi0+Ym9keV9zaXplKTsKKyAgICAgICAgcGt0LT5wb3MgPSBwb3M7CisgICAgICAgIGlmIChwb3MgPT0gaWZmLT5ib2R5X3BvcykKKyAgICAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2X2Fzc2VydDAoMCk7CiAgICAgfQogCi0gICAgaWYgKHBvcyA9PSBpZmYtPmJvZHlfcG9zKQotICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9pbGJjLmMgYi9saWJhdmZvcm1hdC9pbGJjLmMKaW5kZXggZWJlZTJmYi4uNTBlM2MzYyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaWxiYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2lsYmMuYwpAQCAtMjgsMjIgKzI4LDIyIEBACiBzdGF0aWMgaW50IGlsYmNfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXI7CiAKICAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIgb2Ygc3RyZWFtc1xuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQotICAgIGVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIHBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSUxCQykgeworICAgIGlmIChwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0lMQkMpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBpZiAoZW5jLT5ibG9ja19hbGlnbiA9PSA1MCkgeworICAgIGlmIChwYXItPmJsb2NrX2FsaWduID09IDUwKSB7CiAgICAgICAgIGF2aW9fd3JpdGUocGIsIG1vZGUzMF9oZWFkZXIsIHNpemVvZihtb2RlMzBfaGVhZGVyKSAtIDEpOwotICAgIH0gZWxzZSBpZiAoZW5jLT5ibG9ja19hbGlnbiA9PSAzOCkgeworICAgIH0gZWxzZSBpZiAocGFyLT5ibG9ja19hbGlnbiA9PSAzOCkgewogICAgICAgICBhdmlvX3dyaXRlKHBiLCBtb2RlMjBfaGVhZGVyLCBzaXplb2YobW9kZTIwX2hlYWRlcikgLSAxKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgbW9kZVxuIik7CkBAIC03OSwxOCArNzksMTggQEAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSUxCQzsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0lMQkM7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IDE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgIHN0LT5zdGFydF90aW1lID0gMDsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIGlmICghbWVtY21wKGhlYWRlciwgbW9kZTIwX2hlYWRlciwgc2l6ZW9mKG1vZGUyMF9oZWFkZXIpIC0gMSkpIHsKLSAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IDM4OwotICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gMTUyMDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAzODsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IDE1MjAwOwogICAgIH0gZWxzZSBpZiAoIW1lbWNtcChoZWFkZXIsIG1vZGUzMF9oZWFkZXIsIHNpemVvZihtb2RlMzBfaGVhZGVyKSAtIDEpKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSA1MDsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IDEzMzMzOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gNTA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSAxMzMzMzsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5yZWNvZ25pemVkIGlMQkMgZmlsZSBoZWFkZXJcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTEwMiwxNiArMTAyLDE2IEBACiBzdGF0aWMgaW50IGlsYmNfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0KQogewotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgaW50IHJldDsKIAotICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIGVuYy0+YmxvY2tfYWxpZ24pKSA8IDApCisgICAgaWYgKChyZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgcGFyLT5ibG9ja19hbGlnbikpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKICAgICBwa3QtPnBvcyA9IGF2aW9fdGVsbChzLT5wYik7Ci0gICAgcGt0LT5kdXJhdGlvbiA9IGVuYy0+YmxvY2tfYWxpZ24gPT0gMzggPyAxNjAgOiAyNDA7Ci0gICAgaWYgKChyZXQgPSBhdmlvX3JlYWQocy0+cGIsIHBrdC0+ZGF0YSwgZW5jLT5ibG9ja19hbGlnbikpICE9IGVuYy0+YmxvY2tfYWxpZ24pIHsKKyAgICBwa3QtPmR1cmF0aW9uID0gcGFyLT5ibG9ja19hbGlnbiA9PSAzOCA/IDE2MCA6IDI0MDsKKyAgICBpZiAoKHJldCA9IGF2aW9fcmVhZChzLT5wYiwgcGt0LT5kYXRhLCBwYXItPmJsb2NrX2FsaWduKSkgIT0gcGFyLT5ibG9ja19hbGlnbikgewogICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKICAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBBVkVSUk9SKEVJTyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaW1nMi5jIGIvbGliYXZmb3JtYXQvaW1nMi5jCmluZGV4IDUwMzUyYjUuLjg0MzJjYzAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2ltZzIuYworKysgYi9saWJhdmZvcm1hdC9pbWcyLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sICJtcGcxLWltZyIgfSwKICAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICJtcGcyLWltZyIgfSwKICAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICJtcGc0LWltZyIgfSwKLSAgICB7IEFWX0NPREVDX0lEX0ZGVjEsICAgICAgICJmZnYxLWltZyIgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICJ5IiAgICAgICAgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICJyYXciICAgICAgfSwKICAgICB7IEFWX0NPREVDX0lEX0JNUCwgICAgICAgICJibXAiICAgICAgfSwKQEAgLTY2LDYgKzY1LDggQEAKICAgICB7IEFWX0NPREVDX0lEX1NVTlJBU1QsICAgICJpbTI0IiAgICAgfSwKICAgICB7IEFWX0NPREVDX0lEX1NVTlJBU1QsICAgICJpbTMyIiAgICAgfSwKICAgICB7IEFWX0NPREVDX0lEX1NVTlJBU1QsICAgICJzdW5yYXMiICAgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NWRywgICAgICAgICJzdmciICAgICAgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NWRywgICAgICAgICJzdmd6IiAgICAgfSwKICAgICB7IEFWX0NPREVDX0lEX0pQRUcyMDAwLCAgICJqMmMiICAgICAgfSwKICAgICB7IEFWX0NPREVDX0lEX0pQRUcyMDAwLCAgICJqcDIiICAgICAgfSwKICAgICB7IEFWX0NPREVDX0lEX0pQRUcyMDAwLCAgICJqcGMiICAgICAgfSwKQEAgLTc2LDEyICs3NywxMyBAQAogICAgIHsgQVZfQ09ERUNfSURfVjIxMFgsICAgICAgInl1djEwIiAgICB9LAogICAgIHsgQVZfQ09ERUNfSURfV0VCUCwgICAgICAgIndlYnAiICAgICB9LAogICAgIHsgQVZfQ09ERUNfSURfWEJNLCAgICAgICAgInhibSIgICAgICB9LAorICAgIHsgQVZfQ09ERUNfSURfWFBNLCAgICAgICAgInhwbSIgICAgICB9LAogICAgIHsgQVZfQ09ERUNfSURfWEZBQ0UsICAgICAgInhmYWNlIiAgICB9LAogICAgIHsgQVZfQ09ERUNfSURfWFdELCAgICAgICAgInh3ZCIgICAgICB9LAogICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAgTlVMTCAgICAgICB9CiB9OwogCi1zdGF0aWMgZW51bSBBVkNvZGVjSUQgYXZfc3RyMmlkKGNvbnN0IElkU3RyTWFwICp0YWdzLCBjb25zdCBjaGFyICpzdHIpCitzdGF0aWMgZW51bSBBVkNvZGVjSUQgc3RyMmlkKGNvbnN0IElkU3RyTWFwICp0YWdzLCBjb25zdCBjaGFyICpzdHIpCiB7CiAgICAgc3RyID0gc3RycmNocihzdHIsICcuJyk7CiAgICAgaWYgKCFzdHIpCkBAIC05OSw1ICsxMDEsNSBAQAogCiBlbnVtIEFWQ29kZWNJRCBmZl9ndWVzc19pbWFnZTJfY29kZWMoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0gICAgcmV0dXJuIGF2X3N0cjJpZChmZl9pbWdfdGFncywgZmlsZW5hbWUpOworICAgIHJldHVybiBzdHIyaWQoZmZfaW1nX3RhZ3MsIGZpbGVuYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2ltZzJkZWMuYyBiL2xpYmF2Zm9ybWF0L2ltZzJkZWMuYwppbmRleCBjMzUzNTYzLi5mZmJjOWE2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9pbWcyZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvaW1nMmRlYy5jCkBAIC0zMyw2ICszMyw4IEBACiAjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiaW1nMi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWpwZWcuaCIKKyNpbmNsdWRlICJzdWJ0aXRsZXMuaCIKIAogI2lmIEhBVkVfR0xPQgogLyogTG9jYWxseSBkZWZpbmUgYXMgMCAoYml0d2lzZS1PUiBuby1vcCkgYW55IG1pc3NpbmcgZ2xvYiBvcHRpb25zIHRoYXQKQEAgLTE5Niw3ICsxOTgsNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIGF2X3N0cmxjcHkocy0+cGF0aCwgczEtPmZpbGVuYW1lLCBzaXplb2Yocy0+cGF0aCkpOworICAgIGF2X3N0cmxjcHkocy0+cGF0aCwgczEtPnVybCwgc2l6ZW9mKHMtPnBhdGgpKTsKICAgICBzLT5pbWdfbnVtYmVyID0gMDsKICAgICBzLT5pbWdfY291bnQgID0gMDsKIApAQCAtMjIwLDggKzIyMiw4IEBACiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBzLT5mcmFtZXJhdGUuZGVuLCBzLT5mcmFtZXJhdGUubnVtKTsKIAogICAgIGlmIChzLT53aWR0aCAmJiBzLT5oZWlnaHQpIHsKLSAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBzLT53aWR0aDsKLSAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBzLT5oZWlnaHQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggID0gcy0+d2lkdGg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gcy0+aGVpZ2h0OwogICAgIH0KIAogICAgIGlmICghcy0+aXNfcGlwZSkgewpAQCAtMzA2LDIyICszMDgsMjMgQEAKICAgICB9CiAKICAgICBpZiAoczEtPnZpZGVvX2NvZGVjX2lkKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gczEtPnZpZGVvX2NvZGVjX2lkOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IHMxLT52aWRlb19jb2RlY19pZDsKICAgICB9IGVsc2UgaWYgKHMxLT5hdWRpb19jb2RlY19pZCkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IHMxLT5hdWRpb19jb2RlY19pZDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBzMS0+YXVkaW9fY29kZWNfaWQ7CiAgICAgfSBlbHNlIGlmIChzMS0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gczEtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBzMS0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IHN0cnJjaHIocy0+cGF0aCwgJy4nKTsKICAgICAgICAgcy0+c3BsaXRfcGxhbmVzICAgICAgID0gc3RyICYmICFhdl9zdHJjYXNlY21wKHN0ciArIDEsICJ5Iik7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwogICAgICAgICBpZiAoczEtPnBiKSB7CiAgICAgICAgICAgICBpbnQgcHJvYmVfYnVmZmVyX3NpemUgPSAyMDQ4OwogICAgICAgICAgICAgdWludDhfdCAqcHJvYmVfYnVmZmVyID0gYXZfcmVhbGxvYyhOVUxMLCBwcm9iZV9idWZmZXJfc2l6ZSArIEFWUFJPQkVfUEFERElOR19TSVpFKTsKLSAgICAgICAgICAgIEFWSW5wdXRGb3JtYXQgKmZtdCA9IE5VTEw7CisgICAgICAgICAgICBjb25zdCBBVklucHV0Rm9ybWF0ICpmbXQgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqZm10X2l0ZXIgPSBOVUxMOwogICAgICAgICAgICAgQVZQcm9iZURhdGEgcGQgPSB7IDAgfTsKIAogICAgICAgICAgICAgaWYgKCFwcm9iZV9idWZmZXIpCkBAIC0zMzYsMTYgKzMzOSwxNiBAQAogCiAgICAgICAgICAgICBwZC5idWYgPSBwcm9iZV9idWZmZXI7CiAgICAgICAgICAgICBwZC5idWZfc2l6ZSA9IHByb2JlX2J1ZmZlcl9zaXplOwotICAgICAgICAgICAgcGQuZmlsZW5hbWUgPSBzMS0+ZmlsZW5hbWU7CisgICAgICAgICAgICBwZC5maWxlbmFtZSA9IHMxLT51cmw7CiAKLSAgICAgICAgICAgIHdoaWxlICgoZm10ID0gYXZfaWZvcm1hdF9uZXh0KGZtdCkpKSB7CisgICAgICAgICAgICB3aGlsZSAoKGZtdCA9IGF2X2RlbXV4ZXJfaXRlcmF0ZSgmZm10X2l0ZXIpKSkgewogICAgICAgICAgICAgICAgIGlmIChmbXQtPnJlYWRfaGVhZGVyICE9IGZmX2ltZ19yZWFkX2hlYWRlciB8fAogICAgICAgICAgICAgICAgICAgICAhZm10LT5yZWFkX3Byb2JlIHx8CiAgICAgICAgICAgICAgICAgICAgIChmbXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSB8fAogICAgICAgICAgICAgICAgICAgICAhZm10LT5yYXdfY29kZWNfaWQpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGlmIChmbXQtPnJlYWRfcHJvYmUoJnBkKSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZtdC0+cmF3X2NvZGVjX2lkOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gZm10LT5yYXdfY29kZWNfaWQ7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTM1NCwxNiArMzU3LDE2IEBACiAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICBmZmlvX3Jld2luZF93aXRoX3Byb2JlX2RhdGEoczEtPnBiLCAmcHJvYmVfYnVmZmVyLCBwcm9iZV9idWZmZXJfc2l6ZSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9ndWVzc19pbWFnZTJfY29kZWMocy0+cGF0aCk7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0xKUEVHKQotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01KUEVHOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTElBU19QSVgpIC8vIHdlIGNhbm5vdCBkaXN0aW5naXVzaCB0aGlzIGZyb20gQlJFTkRFUl9QSVgKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2d1ZXNzX2ltYWdlMl9jb2RlYyhzLT5wYXRoKTsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTEpQRUcpCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTUpQRUc7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FMSUFTX1BJWCkgLy8gd2UgY2Fubm90IGRpc3RpbmdpdXNoIHRoaXMgZnJvbSBCUkVOREVSX1BJWAorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7CiAgICAgfQotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKICAgICAgICAgcGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUpCi0gICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IHBpeF9mbXQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gcGl4X2ZtdDsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMzc2LDcgKzM3OSw3IEBACiAgICAgaW50IGksIHJlczsKICAgICBpbnQgc2l6ZVszXSAgICAgICAgICAgPSB7IDAgfSwgcmV0WzNdID0geyAwIH07CiAgICAgQVZJT0NvbnRleHQgKmZbM10gICAgID0geyBOVUxMIH07Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gczEtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzMS0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAKICAgICBpZiAoIXMtPmlzX3BpcGUpIHsKICAgICAgICAgLyogbG9vcCBvdmVyIGlucHV0ICovCkBAIC00MTcsNyArNDIwLDcgQEAKICAgICAgICAgICAgIGZpbGVuYW1lW3N0cmxlbihmaWxlbmFtZSkgLSAxXSA9ICdVJyArIGk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgewogICAgICAgICAgICAgQVZQcm9iZURhdGEgcGQgPSB7IDAgfTsKICAgICAgICAgICAgIEFWSW5wdXRGb3JtYXQgKmlmbXQ7CiAgICAgICAgICAgICB1aW50OF90IGhlYWRlcltQUk9CRV9CVUZfTUlOICsgQVZQUk9CRV9QQURESU5HX1NJWkVdOwpAQCAtNDM1LDExICs0MzgsMTEgQEAKIAogICAgICAgICAgICAgaWZtdCA9IGF2X3Byb2JlX2lucHV0X2Zvcm1hdDMoJnBkLCAxLCAmc2NvcmUpOwogICAgICAgICAgICAgaWYgKGlmbXQgJiYgaWZtdC0+cmVhZF9wYWNrZXQgPT0gZmZfaW1nX3JlYWRfcGFja2V0ICYmIGlmbXQtPnJhd19jb2RlY19pZCkKLSAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPSBpZm10LT5yYXdfY29kZWNfaWQ7CisgICAgICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9IGlmbXQtPnJhd19jb2RlY19pZDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8gJiYgIWNvZGVjLT53aWR0aCkKLSAgICAgICAgICAgIGluZmVyX3NpemUoJmNvZGVjLT53aWR0aCwgJmNvZGVjLT5oZWlnaHQsIHNpemVbMF0pOworICAgICAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTyAmJiAhcGFyLT53aWR0aCkKKyAgICAgICAgICAgIGluZmVyX3NpemUoJnBhci0+d2lkdGgsICZwYXItPmhlaWdodCwgc2l6ZVswXSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZlswXSA9IHMxLT5wYjsKICAgICAgICAgaWYgKGF2aW9fZmVvZihmWzBdKSAmJiBzLT5sb29wICYmIHMtPmlzX3BpcGUpCkBAIC01NjAsNyArNTYzLDcgQEAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFZpZGVvRGVtdXhEYXRhLCB4KQogI2RlZmluZSBERUMgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KIGNvbnN0IEFWT3B0aW9uIGZmX2ltZ19vcHRpb25zW10gPSB7Ci0gICAgeyAiZnJhbWVyYXRlIiwgICAgInNldCB0aGUgdmlkZW8gZnJhbWVyYXRlIiwgICAgICAgICAgICAgT0ZGU0VUKGZyYW1lcmF0ZSksICAgIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsICAgREVDIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgICAgInNldCB0aGUgdmlkZW8gZnJhbWVyYXRlIiwgICAgICAgICAgICAgT0ZGU0VUKGZyYW1lcmF0ZSksICAgIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIElOVF9NQVgsICAgREVDIH0sCiAgICAgeyAibG9vcCIsICAgICAgICAgImZvcmNlIGxvb3Agb3ZlciBpbnB1dCBmaWxlIHNlcXVlbmNlIiwgT0ZGU0VUKGxvb3ApLCAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgey5pNjQgPSAwICAgfSwgMCwgMSwgICAgICAgREVDIH0sCiAKICAgICB7ICJwYXR0ZXJuX3R5cGUiLCAic2V0IHBhdHRlcm4gdHlwZSIsICAgICAgICAgICAgICAgICAgICBPRkZTRVQocGF0dGVybl90eXBlKSwgQVZfT1BUX1RZUEVfSU5ULCAgICB7Lmk2ND1QVF9ERUZBVUxUfSwgMCwgICAgICAgSU5UX01BWCwgREVDLCAicGF0dGVybl90eXBlIn0sCkBAIC02ODcsNyArNjkwLDcgQEAKIHN0YXRpYyBpbnQganBlZ19wcm9iZShBVlByb2JlRGF0YSAqcCkKIHsKICAgICBjb25zdCB1aW50OF90ICpiID0gcC0+YnVmOwotICAgIGludCBpLCBzdGF0ZSA9IDB4RDg7CisgICAgaW50IGksIHN0YXRlID0gU09JOwogCiAgICAgaWYgKEFWX1JCMTYoYikgIT0gMHhGRkQ4IHx8CiAgICAgICAgIEFWX1JCMzIoYikgPT0gMHhGRkQ4RkZGNykKQEAgLTcwMCw1NiArNzAzLDYyIEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgYyA9IGJbaSArIDFdOwogICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgY2FzZSAweEQ4OgorICAgICAgICBjYXNlIFNPSToKICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBjYXNlIDB4QzA6Ci0gICAgICAgIGNhc2UgMHhDMToKLSAgICAgICAgY2FzZSAweEMyOgotICAgICAgICBjYXNlIDB4QzM6Ci0gICAgICAgIGNhc2UgMHhDNToKLSAgICAgICAgY2FzZSAweEM2OgotICAgICAgICBjYXNlIDB4Qzc6Ci0gICAgICAgICAgICBpZiAoc3RhdGUgIT0gMHhEOCkKKyAgICAgICAgY2FzZSBTT0YwOgorICAgICAgICBjYXNlIFNPRjE6CisgICAgICAgIGNhc2UgU09GMjoKKyAgICAgICAgY2FzZSBTT0YzOgorICAgICAgICBjYXNlIFNPRjU6CisgICAgICAgIGNhc2UgU09GNjoKKyAgICAgICAgY2FzZSBTT0Y3OgorICAgICAgICAgICAgaSArPSBBVl9SQjE2KCZiW2kgKyAyXSkgKyAxOworICAgICAgICAgICAgaWYgKHN0YXRlICE9IFNPSSkKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIHN0YXRlID0gMHhDMDsKKyAgICAgICAgICAgIHN0YXRlID0gU09GMDsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDB4REE6Ci0gICAgICAgICAgICBpZiAoc3RhdGUgIT0gMHhDMCkKKyAgICAgICAgY2FzZSBTT1M6CisgICAgICAgICAgICBpICs9IEFWX1JCMTYoJmJbaSArIDJdKSArIDE7CisgICAgICAgICAgICBpZiAoc3RhdGUgIT0gU09GMCAmJiBzdGF0ZSAhPSBTT1MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBzdGF0ZSA9IDB4REE7CisgICAgICAgICAgICBzdGF0ZSA9IFNPUzsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDB4RDk6Ci0gICAgICAgICAgICBpZiAoc3RhdGUgIT0gMHhEQSkKKyAgICAgICAgY2FzZSBFT0k6CisgICAgICAgICAgICBpZiAoc3RhdGUgIT0gU09TKQogICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgc3RhdGUgPSAweEQ5OworICAgICAgICAgICAgc3RhdGUgPSBFT0k7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAweEUwOgotICAgICAgICBjYXNlIDB4RTE6Ci0gICAgICAgIGNhc2UgMHhFMjoKLSAgICAgICAgY2FzZSAweEUzOgotICAgICAgICBjYXNlIDB4RTQ6Ci0gICAgICAgIGNhc2UgMHhFNToKLSAgICAgICAgY2FzZSAweEU2OgotICAgICAgICBjYXNlIDB4RTc6Ci0gICAgICAgIGNhc2UgMHhFODoKLSAgICAgICAgY2FzZSAweEU5OgotICAgICAgICBjYXNlIDB4RUE6Ci0gICAgICAgIGNhc2UgMHhFQjoKLSAgICAgICAgY2FzZSAweEVDOgotICAgICAgICBjYXNlIDB4RUQ6Ci0gICAgICAgIGNhc2UgMHhFRToKLSAgICAgICAgY2FzZSAweEVGOgorICAgICAgICBjYXNlIERRVDoKKyAgICAgICAgY2FzZSBBUFAwOgorICAgICAgICBjYXNlIEFQUDE6CisgICAgICAgIGNhc2UgQVBQMjoKKyAgICAgICAgY2FzZSBBUFAzOgorICAgICAgICBjYXNlIEFQUDQ6CisgICAgICAgIGNhc2UgQVBQNToKKyAgICAgICAgY2FzZSBBUFA2OgorICAgICAgICBjYXNlIEFQUDc6CisgICAgICAgIGNhc2UgQVBQODoKKyAgICAgICAgY2FzZSBBUFA5OgorICAgICAgICBjYXNlIEFQUDEwOgorICAgICAgICBjYXNlIEFQUDExOgorICAgICAgICBjYXNlIEFQUDEyOgorICAgICAgICBjYXNlIEFQUDEzOgorICAgICAgICBjYXNlIEFQUDE0OgorICAgICAgICBjYXNlIEFQUDE1OgorICAgICAgICBjYXNlIENPTToKICAgICAgICAgICAgIGkgKz0gQVZfUkIxNigmYltpICsgMl0pICsgMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKCAgKGMgPj0gMHgwMiAmJiBjIDw9IDB4QkYpCi0gICAgICAgICAgICAgICAgfHwgYyA9PSAweEM4KQorICAgICAgICAgICAgaWYgKCAgKGMgPiBURU0gJiYgYyA8IFNPRjApCisgICAgICAgICAgICAgICAgfHwgYyA9PSBKUEcpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoc3RhdGUgPT0gMHhEOSkKKyAgICBpZiAoc3RhdGUgPT0gRU9JKQogICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworICAgIGlmIChzdGF0ZSA9PSBTT1MpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDI7CiAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC8gODsKIH0KIApAQCAtNzYyLDYgKzc3MSwyNyBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHBjeF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpiID0gcC0+YnVmOworCisgICAgaWYgKCAgIHAtPmJ1Zl9zaXplIDwgMTI4CisgICAgICAgIHx8IGJbMF0gIT0gMTAKKyAgICAgICAgfHwgYlsxXSA+IDUKKyAgICAgICAgfHwgYlsyXSA+IDEKKyAgICAgICAgfHwgYXZfcG9wY291bnQoYlszXSkgIT0gMSB8fCBiWzNdID4gOAorICAgICAgICB8fCBBVl9STDE2KCZiWzRdKSA+IEFWX1JMMTYoJmJbOF0pCisgICAgICAgIHx8IEFWX1JMMTYoJmJbNl0pID4gQVZfUkwxNigmYlsxMF0pCisgICAgICAgIHx8IGJbNjRdKQorICAgICAgICByZXR1cm4gMDsKKyAgICBiICs9IDczOworICAgIHdoaWxlICgrK2IgPCBwLT5idWYgKyAxMjgpCisgICAgICAgIGlmICgqYikKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDQ7CisKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOworfQorCiBzdGF0aWMgaW50IHFkcmF3X3Byb2JlKEFWUHJvYmVEYXRhICpwKQogewogICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CkBAIC03OTYsNiArODI2LDM0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgcHNkX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisgICAgaW50IHJldCA9IDA7CisgICAgdWludDE2X3QgY29sb3JfbW9kZTsKKworICAgIGlmIChBVl9STDMyKGIpID09IE1LVEFHKCc4JywnQicsJ1AnLCdTJykpIHsKKyAgICAgICAgcmV0ICs9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKChiWzRdID09IDApICYmIChiWzVdID09IDEpKSB7LyogdmVyc2lvbiAxIGlzIFBTRCwgdmVyc2lvbiAyIGlzIFBTQiAqLworICAgICAgICByZXQgKz0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoKEFWX1JMMzIoYis2KSA9PSAwKSAmJiAoQVZfUkwxNihiKzEwKSA9PSAwKSkvKiByZXNlcnZlZCBtdXN0IGJlIDAgKi8KKyAgICAgICAgcmV0ICs9IDE7CisKKyAgICBjb2xvcl9tb2RlID0gQVZfUkIxNihiKzI0KTsKKyAgICBpZiAoKGNvbG9yX21vZGUgPD0gOSkgJiYgKGNvbG9yX21vZGUgIT0gNSkgJiYgKGNvbG9yX21vZGUgIT0gNikpCisgICAgICAgIHJldCArPSAxOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgcmV0OworfQorCiBzdGF0aWMgaW50IHNnaV9wcm9iZShBVlByb2JlRGF0YSAqcCkKIHsKICAgICBjb25zdCB1aW50OF90ICpiID0gcC0+YnVmOwpAQCAtODE3LDYgKzg3NSwyNiBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHN2Z19wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpiID0gcC0+YnVmOworICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IHAtPmJ1ZiArIHAtPmJ1Zl9zaXplOworCisgICAgaWYgKG1lbWNtcChwLT5idWYsICI8P3htbCIsIDUpKQorICAgICAgICByZXR1cm4gMDsKKyAgICB3aGlsZSAoYiA8IGVuZCkgeworICAgICAgICBpbnQgaW5jID0gZmZfc3VidGl0bGVzX25leHRfbGluZShiKTsKKyAgICAgICAgaWYgKCFpbmMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYiArPSBpbmM7CisgICAgICAgIGlmIChiID49IGVuZCAtIDQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgaWYgKCFtZW1jbXAoYiwgIjxzdmciLCA0KSkKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHRpZmZfcHJvYmUoQVZQcm9iZURhdGEgKnApCiB7CiAgICAgY29uc3QgdWludDhfdCAqYiA9IHAtPmJ1ZjsKQEAgLTgzNyw2ICs5MTUsNjUgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBwbm1fbWFnaWNfY2hlY2soY29uc3QgQVZQcm9iZURhdGEgKnAsIGludCBtYWdpYykKK3sKKyAgICBjb25zdCB1aW50OF90ICpiID0gcC0+YnVmOworCisgICAgcmV0dXJuIGJbMF0gPT0gJ1AnICYmIGJbMV0gPT0gbWFnaWMgKyAnMCc7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBubV9wcm9iZShjb25zdCBBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBjb25zdCB1aW50OF90ICpiID0gcC0+YnVmOworCisgICAgd2hpbGUgKGJbMl0gPT0gJ1xyJykKKyAgICAgICAgYisrOworICAgIGlmIChiWzJdID09ICdcbicgJiYgKGJbM10gPT0gJyMnIHx8IChiWzNdID49ICcwJyAmJiBiWzNdIDw9ICc5JykpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAyOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBibV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICByZXR1cm4gcG5tX21hZ2ljX2NoZWNrKHAsIDEpIHx8IHBubV9tYWdpY19jaGVjayhwLCA0KSA/IHBubV9wcm9iZShwKSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBnbXhfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgcmV0dXJuIHBubV9tYWdpY19jaGVjayhwLCAyKSB8fCBwbm1fbWFnaWNfY2hlY2socCwgNSkgPyBwbm1fcHJvYmUocCkgOiAwOworfQorCitzdGF0aWMgaW50IHBnbV9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpbnQgcmV0ID0gcGdteF9wcm9iZShwKTsKKyAgICByZXR1cm4gcmV0ICYmICFhdl9tYXRjaF9leHQocC0+ZmlsZW5hbWUsICJwZ215dXYiKSA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgcGdteXV2X3Byb2JlKEFWUHJvYmVEYXRhICpwKSAvLyBjdXN0b20gRkZtcGVnIGZvcm1hdCByZWNvZ25pemVkIGJ5IGZpbGUgZXh0ZW5zaW9uCit7CisgICAgaW50IHJldCA9IHBnbXhfcHJvYmUocCk7CisgICAgcmV0dXJuIHJldCAmJiBhdl9tYXRjaF9leHQocC0+ZmlsZW5hbWUsICJwZ215dXYiKSA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgcHBtX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHJldHVybiBwbm1fbWFnaWNfY2hlY2socCwgMykgfHwgcG5tX21hZ2ljX2NoZWNrKHAsIDYpID8gcG5tX3Byb2JlKHApIDogMDsKK30KKworc3RhdGljIGludCBwYW1fcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgcmV0dXJuIHBubV9tYWdpY19jaGVjayhwLCA3KSA/IHBubV9wcm9iZShwKSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgeHBtX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisKKyAgICBpZiAoQVZfUkI2NChiKSA9PSAweDJmMmEyMDU4NTA0ZDIwMmEgJiYgKihiKzgpID09ICcvJykKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC0gMTsKKyAgICByZXR1cm4gMDsKK30KKwogI2RlZmluZSBJTUFHRUFVVE9fREVNVVhFUihpbWduYW1lLCBjb2RlY2lkKVwKIHN0YXRpYyBjb25zdCBBVkNsYXNzIGltZ25hbWUgIyMgX2NsYXNzID0ge1wKICAgICAuY2xhc3NfbmFtZSA9IEFWX1NUUklOR0lGWShpbWduYW1lKSAiIGRlbXV4ZXIiLFwKQEAgLTg2MywxMCArMTAwMCwxOSBAQAogSU1BR0VBVVRPX0RFTVVYRVIoajJrLCAgICAgQVZfQ09ERUNfSURfSlBFRzIwMDApCiBJTUFHRUFVVE9fREVNVVhFUihqcGVnLCAgICBBVl9DT0RFQ19JRF9NSlBFRykKIElNQUdFQVVUT19ERU1VWEVSKGpwZWdscywgIEFWX0NPREVDX0lEX0pQRUdMUykKK0lNQUdFQVVUT19ERU1VWEVSKHBhbSwgICAgIEFWX0NPREVDX0lEX1BBTSkKK0lNQUdFQVVUT19ERU1VWEVSKHBibSwgICAgIEFWX0NPREVDX0lEX1BCTSkKK0lNQUdFQVVUT19ERU1VWEVSKHBjeCwgICAgIEFWX0NPREVDX0lEX1BDWCkKK0lNQUdFQVVUT19ERU1VWEVSKHBnbSwgICAgIEFWX0NPREVDX0lEX1BHTSkKK0lNQUdFQVVUT19ERU1VWEVSKHBnbXl1diwgIEFWX0NPREVDX0lEX1BHTVlVVikKIElNQUdFQVVUT19ERU1VWEVSKHBpY3RvciwgIEFWX0NPREVDX0lEX1BJQ1RPUikKIElNQUdFQVVUT19ERU1VWEVSKHBuZywgICAgIEFWX0NPREVDX0lEX1BORykKK0lNQUdFQVVUT19ERU1VWEVSKHBwbSwgICAgIEFWX0NPREVDX0lEX1BQTSkKK0lNQUdFQVVUT19ERU1VWEVSKHBzZCwgICAgIEFWX0NPREVDX0lEX1BTRCkKIElNQUdFQVVUT19ERU1VWEVSKHFkcmF3LCAgIEFWX0NPREVDX0lEX1FEUkFXKQogSU1BR0VBVVRPX0RFTVVYRVIoc2dpLCAgICAgQVZfQ09ERUNfSURfU0dJKQogSU1BR0VBVVRPX0RFTVVYRVIoc3VucmFzdCwgQVZfQ09ERUNfSURfU1VOUkFTVCkKK0lNQUdFQVVUT19ERU1VWEVSKHN2ZywgICAgIEFWX0NPREVDX0lEX1NWRykKIElNQUdFQVVUT19ERU1VWEVSKHRpZmYsICAgIEFWX0NPREVDX0lEX1RJRkYpCiBJTUFHRUFVVE9fREVNVVhFUih3ZWJwLCAgICBBVl9DT0RFQ19JRF9XRUJQKQorSU1BR0VBVVRPX0RFTVVYRVIoeHBtLCAgICAgQVZfQ09ERUNfSURfWFBNKQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaW1nMmVuYy5jIGIvbGliYXZmb3JtYXQvaW1nMmVuYy5jCmluZGV4IGViYmFjMmIuLmEwOWNjOGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2ltZzJlbmMuYworKysgYi9saWJhdmZvcm1hdC9pbWcyZW5jLmMKQEAgLTQyLDYgKzQyLDcgQEAKICAgICBjaGFyIHRhcmdldFs0XVsxMDI0XTsKICAgICBpbnQgdXBkYXRlOwogICAgIGludCB1c2Vfc3RyZnRpbWU7CisgICAgaW50IGZyYW1lX3B0czsKICAgICBjb25zdCBjaGFyICptdXhlcjsKICAgICBpbnQgdXNlX3JlbmFtZTsKIH0gVmlkZW9NdXhEYXRhOwpAQCAtNTAsOSArNTEsOSBAQAogewogICAgIFZpZGVvTXV4RGF0YSAqaW1nID0gcy0+cHJpdl9kYXRhOwogICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07Ci0gICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzdC0+Y29kZWMtPnBpeF9mbXQpOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoc3QtPmNvZGVjcGFyLT5mb3JtYXQpOwogCi0gICAgYXZfc3RybGNweShpbWctPnBhdGgsIHMtPmZpbGVuYW1lLCBzaXplb2YoaW1nLT5wYXRoKSk7CisgICAgYXZfc3RybGNweShpbWctPnBhdGgsIHMtPnVybCwgc2l6ZW9mKGltZy0+cGF0aCkpOwogCiAgICAgLyogZmluZCBmb3JtYXQgKi8KICAgICBpZiAocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpCkBAIC02MCw5ICs2MSwxMSBAQAogICAgIGVsc2UKICAgICAgICAgaW1nLT5pc19waXBlID0gMTsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0dJRikgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0dJRikgewogICAgICAgICBpbWctPm11eGVyID0gImdpZiI7Ci0gICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZJVFMpIHsKKyAgICAgICAgaW1nLT5tdXhlciA9ICJmaXRzIjsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKICAgICAgICAgY29uc3QgY2hhciAqc3RyID0gc3RycmNocihpbWctPnBhdGgsICcuJyk7CiAgICAgICAgIGltZy0+c3BsaXRfcGxhbmVzID0gICAgIHN0cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhYXZfc3RyY2FzZWNtcChzdHIgKyAxLCAieSIpCkBAIC04MCw4ICs4Myw4IEBACiAgICAgVmlkZW9NdXhEYXRhICppbWcgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiWzRdOwogICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjOwotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoY29kZWMtPnBpeF9mbXQpOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+Y29kZWNwYXI7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwYXItPmZvcm1hdCk7CiAgICAgaW50IGk7CiAgICAgaW50IG5iX3JlbmFtZXMgPSAwOwogCkBAIC05NywxMCArMTAwLDE3IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgZnJhbWUgZmlsZW5hbWUgd2l0aCBzdHJmdGltZVxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChhdl9nZXRfZnJhbWVfZmlsZW5hbWUoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIGltZy0+cGF0aCwgaW1nLT5pbWdfbnVtYmVyKSA8IDAgJiYKKyAgICAgICAgfSBlbHNlIGlmIChpbWctPmZyYW1lX3B0cykgeworICAgICAgICAgICAgaWYgKGF2X2dldF9mcmFtZV9maWxlbmFtZTIoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksIGltZy0+cGF0aCwgcGt0LT5wdHMsIEFWX0ZSQU1FX0ZJTEVOQU1FX0ZMQUdTX01VTFRJUExFKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IHdyaXRlIGZpbGVuYW1lIGJ5IHB0cyBvZiB0aGUgZnJhbWVzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYXZfZ2V0X2ZyYW1lX2ZpbGVuYW1lMihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgaW1nLT5wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5pbWdfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRlJBTUVfRklMRU5BTUVfRkxBR1NfTVVMVElQTEUpIDwgMCAmJgogICAgICAgICAgICAgICAgICAgIGltZy0+aW1nX251bWJlciA+IDEpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBnZXQgZnJhbWUgZmlsZW5hbWUgbnVtYmVyICVkIGZyb20gcGF0dGVybiAnJXMnIChlaXRoZXIgc2V0IHVwZGF0ZWZpcnN0IG9yIHVzZSBhIHBhdHRlcm4gbGlrZSAlJTAzZCB3aXRoaW4gdGhlIGZpbGVuYW1lIHBhdHRlcm4pXG4iLAorICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IGZyYW1lIGZpbGVuYW1lIG51bWJlciAlZCBmcm9tIHBhdHRlcm4gJyVzJyAoZWl0aGVyIHNldCB1cGRhdGUgb3IgdXNlIGEgcGF0dGVybiBsaWtlICUlMDNkIHdpdGhpbiB0aGUgZmlsZW5hbWUgcGF0dGVybilcbiIsCiAgICAgICAgICAgICAgICAgICAgaW1nLT5pbWdfbnVtYmVyLCBpbWctPnBhdGgpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQpAQCAtMTIzLDggKzEzMyw4IEBACiAgICAgfQogCiAgICAgaWYgKGltZy0+c3BsaXRfcGxhbmVzKSB7Ci0gICAgICAgIGludCB5c2l6ZSA9IGNvZGVjLT53aWR0aCAqIGNvZGVjLT5oZWlnaHQ7Ci0gICAgICAgIGludCB1c2l6ZSA9IEFWX0NFSUxfUlNISUZUKGNvZGVjLT53aWR0aCwgZGVzYy0+bG9nMl9jaHJvbWFfdykgKiBBVl9DRUlMX1JTSElGVChjb2RlYy0+aGVpZ2h0LCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyAgICAgICAgaW50IHlzaXplID0gcGFyLT53aWR0aCAqIHBhci0+aGVpZ2h0OworICAgICAgICBpbnQgdXNpemUgPSBBVl9DRUlMX1JTSElGVChwYXItPndpZHRoLCBkZXNjLT5sb2cyX2Nocm9tYV93KSAqIEFWX0NFSUxfUlNISUZUKHBhci0+aGVpZ2h0LCBkZXNjLT5sb2cyX2Nocm9tYV9oKTsKICAgICAgICAgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGggPj0gOSkgewogICAgICAgICAgICAgeXNpemUgKj0gMjsKICAgICAgICAgICAgIHVzaXplICo9IDI7CkBAIC0xNDYsNyArMTU2LDcgQEAKIAogICAgICAgICBhdl9hc3NlcnQwKCFpbWctPnNwbGl0X3BsYW5lcyk7CiAKLSAgICAgICAgcmV0ID0gYXZmb3JtYXRfYWxsb2Nfb3V0cHV0X2NvbnRleHQyKCZmbXQsIE5VTEwsIGltZy0+bXV4ZXIsIHMtPmZpbGVuYW1lKTsKKyAgICAgICAgcmV0ID0gYXZmb3JtYXRfYWxsb2Nfb3V0cHV0X2NvbnRleHQyKCZmbXQsIE5VTEwsIGltZy0+bXV4ZXIsIHMtPnVybCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGZtdCwgTlVMTCk7CkBAIC0xNTcsOSArMTY3LDggQEAKICAgICAgICAgc3QtPmlkID0gcGt0LT5zdHJlYW1faW5kZXg7CiAKICAgICAgICAgZm10LT5wYiA9IHBiWzBdOwotICAgICAgICBpZiAoKHJldCA9IGF2X2NvcHlfcGFja2V0KCZwa3QyLCBwa3QpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IDAgfHwKLSAgICAgICAgICAgIChyZXQgPSBhdl9kdXBfcGFja2V0KCZwa3QyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAwIHx8Ci0gICAgICAgICAgICAocmV0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzLT5zdHJlYW1zWzBdLT5jb2RlYykpIDwgMCB8fAorICAgICAgICBpZiAoKHJldCA9IGF2X3BhY2tldF9yZWYoJnBrdDIsIHBrdCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IDAgfHwKKyAgICAgICAgICAgIChyZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShzdC0+Y29kZWNwYXIsIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyKSkgPCAwIHx8CiAgICAgICAgICAgICAocmV0ID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKGZtdCwgTlVMTCkpICAgICAgICAgICAgICAgICAgICAgIDwgMCB8fAogICAgICAgICAgICAgKHJldCA9IGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKGZtdCwgJnBrdDIpKSAgICAgICAgICAgICAgICA8IDAgfHwKICAgICAgICAgICAgIChyZXQgPSBhdl93cml0ZV90cmFpbGVyKGZtdCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCAwKSB7CkBAIC0yMDAsMTAgKzIwOSwxMCBAQAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVmlkZW9NdXhEYXRhLCB4KQogI2RlZmluZSBFTkMgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBtdXhvcHRpb25zW10gPSB7Ci0gICAgeyAidXBkYXRlZmlyc3QiLCAgImNvbnRpbnVvdXNseSBvdmVyd3JpdGUgb25lIGZpbGUiLCBPRkZTRVQodXBkYXRlKSwgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgICAgICAgMSwgRU5DIH0sCiAgICAgeyAidXBkYXRlIiwgICAgICAgImNvbnRpbnVvdXNseSBvdmVyd3JpdGUgb25lIGZpbGUiLCBPRkZTRVQodXBkYXRlKSwgIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgICAgICAgMSwgRU5DIH0sCiAgICAgeyAic3RhcnRfbnVtYmVyIiwgInNldCBmaXJzdCBudW1iZXIgaW4gdGhlIHNlcXVlbmNlIiwgT0ZGU0VUKGltZ19udW1iZXIpLCBBVl9PUFRfVFlQRV9JTlQsICB7IC5pNjQgPSAxIH0sIDAsIElOVF9NQVgsIEVOQyB9LAogICAgIHsgInN0cmZ0aW1lIiwgICAgICJ1c2Ugc3RyZnRpbWUgZm9yIGZpbGVuYW1lIiwgT0ZGU0VUKHVzZV9zdHJmdGltZSksICBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIEVOQyB9LAorICAgIHsgImZyYW1lX3B0cyIsICAgICJ1c2UgY3VycmVudCBmcmFtZSBwdHMgZm9yIGZpbGVuYW1lIiwgT0ZGU0VUKGZyYW1lX3B0cyksICBBVl9PUFRfVFlQRV9CT09MLCB7IC5pNjQgPSAwIH0sIDAsIDEsIEVOQyB9LAogICAgIHsgImF0b21pY193cml0aW5nIiwgIndyaXRlIGZpbGVzIGF0b21pY2FsbHkgKHVzaW5nIHRlbXBvcmFyeSBmaWxlcyBhbmQgcmVuYW1lcykiLCBPRkZTRVQodXNlX3JlbmFtZSksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRU5DIH0sCiAgICAgeyBOVUxMIH0sCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaW50ZXJuYWwuaCBiL2xpYmF2Zm9ybWF0L2ludGVybmFsLmgKaW5kZXggZmVlODIzZC4uMzU4MjY4MiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaW50ZXJuYWwuaAorKysgYi9saWJhdmZvcm1hdC9pbnRlcm5hbC5oCkBAIC0yMiw2ICsyMiw4IEBACiAjZGVmaW5lIEFWRk9STUFUX0lOVEVSTkFMX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAib3Nfc3VwcG9ydC5oIgogCkBAIC0xMTksOSArMTIxLDI5IEBACiAgICAgaW50IGF2b2lkX25lZ2F0aXZlX3RzX3VzZV9wdHM7CiAKICAgICAvKioKLSAgICAgKiBXaGV0aGVyIG9yIG5vdCBhIGhlYWRlciBoYXMgYWxyZWFkeSBiZWVuIHdyaXR0ZW4KKyAgICAgKiBUaW1lc3RhbXAgb2YgdGhlIGVuZCBvZiB0aGUgc2hvcnRlc3Qgc3RyZWFtLgogICAgICAqLwotICAgIGludCBoZWFkZXJfd3JpdHRlbjsKKyAgICBpbnQ2NF90IHNob3J0ZXN0X2VuZDsKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgb3Igbm90IGF2Zm9ybWF0X2luaXRfb3V0cHV0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkCisgICAgICovCisgICAgaW50IGluaXRpYWxpemVkOworCisgICAgLyoqCisgICAgICogV2hldGhlciBvciBub3QgYXZmb3JtYXRfaW5pdF9vdXRwdXQgZnVsbHkgaW5pdGlhbGl6ZWQgc3RyZWFtcworICAgICAqLworICAgIGludCBzdHJlYW1zX2luaXRpYWxpemVkOworCisgICAgLyoqCisgICAgICogSUQzdjIgdGFnIHVzZWZ1bCBmb3IgTVAzIGRlbXV4aW5nCisgICAgICovCisgICAgQVZEaWN0aW9uYXJ5ICppZDN2Ml9tZXRhOworCisgICAgLyoKKyAgICAgKiBQcmVmZXIgdGhlIGNvZGVjIGZyYW1lcmF0ZSBmb3IgYXZnX2ZyYW1lX3JhdGUgY29tcHV0YXRpb24uCisgICAgICovCisgICAgaW50IHByZWZlcl9jb2RlY19mcmFtZXJhdGU7CiB9OwogCiBzdHJ1Y3QgQVZTdHJlYW1JbnRlcm5hbCB7CkBAIC0xMzIsMTYgKzE1NCw0NCBAQAogICAgIGludCByZW9yZGVyOwogCiAgICAgLyoqCi0gICAgICogYml0c3RyZWFtIGZpbHRlciB0byBydW4gb24gc3RyZWFtCisgICAgICogYml0c3RyZWFtIGZpbHRlcnMgdG8gcnVuIG9uIHN0cmVhbQogICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSBtdXhlciB1c2luZyBmZl9zdHJlYW1fYWRkX2JpdHN0cmVhbV9maWx0ZXIKICAgICAgKiAtIGRlY29kaW5nOiB1bnVzZWQKICAgICAgKi8KLSAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmM7CisgICAgQVZCU0ZDb250ZXh0ICoqYnNmY3M7CisgICAgaW50IG5iX2JzZmNzOwogCiAgICAgLyoqCiAgICAgICogV2hldGhlciBvciBub3QgY2hlY2tfYml0c3RyZWFtIHNob3VsZCBzdGlsbCBiZSBydW4gb24gZWFjaCBwYWNrZXQKICAgICAgKi8KICAgICBpbnQgYml0c3RyZWFtX2NoZWNrZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29kZWMgY29udGV4dCB1c2VkIGJ5IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8sIHRoZSBwYXJzZXIsIGV0Yy4KKyAgICAgKi8KKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHg7CisgICAgLyoqCisgICAgICogMSBpZiBhdmN0eCBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZXMgZnJvbSB0aGUgY29kZWMgcGFyYW1ldGVycworICAgICAqLworICAgIGludCBhdmN0eF9pbml0ZWQ7CisKKyAgICBlbnVtIEFWQ29kZWNJRCBvcmlnX2NvZGVjX2lkOworCisgICAgLyogdGhlIGNvbnRleHQgZm9yIGV4dHJhY3RpbmcgZXh0cmFkYXRhIGluIGZpbmRfc3RyZWFtX2luZm8oKQorICAgICAqIGluaXRlZD0xL2JzZj1OVUxMIHNpZ25hbHMgdGhhdCBleHRyYWN0aW5nIGlzIG5vdCBwb3NzaWJsZSAoY29kZWMgbm90CisgICAgICogc3VwcG9ydGVkKSAqLworICAgIHN0cnVjdCB7CisgICAgICAgIEFWQlNGQ29udGV4dCAqYnNmOworICAgICAgICBBVlBhY2tldCAgICAgKnBrdDsKKyAgICAgICAgaW50IGluaXRlZDsKKyAgICB9IGV4dHJhY3RfZXh0cmFkYXRhOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgaW50ZXJuYWwgYXZjdHggbmVlZHMgdG8gYmUgdXBkYXRlZCBmcm9tIGNvZGVjcGFyIChhZnRlciBhIGxhdGUgY2hhbmdlIHRvIGNvZGVjcGFyKQorICAgICAqLworICAgIGludCBuZWVkX2NvbnRleHRfdXBkYXRlOworCisgICAgRkZGcmFjICpwcml2X3B0czsKIH07CiAKICNpZmRlZiBfX0dOVUNfXwpAQCAtMjQ5LDYgKzI5OSw0MiBAQAogICovCiBpbnQgZmZfZ2V0X2xpbmUoQVZJT0NvbnRleHQgKnMsIGNoYXIgKmJ1ZiwgaW50IG1heGxlbik7CiAKKy8qKgorICogU2FtZSBhcyBmZl9nZXRfbGluZSBidXQgc3RyaXAgdGhlIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMgaW4gdGhlIHRleHQgdGFpbAorICoKKyAqIEBwYXJhbSBzIHRoZSByZWFkLW9ubHkgQVZJT0NvbnRleHQKKyAqIEBwYXJhbSBidWYgYnVmZmVyIHRvIHN0b3JlIHRoZSByZWFkIGxpbmUKKyAqIEBwYXJhbSBtYXhsZW4gc2l6ZSBvZiB0aGUgYnVmZmVyCisgKiBAcmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB3cml0dGVuIGluIHRoZSBidWZmZXIKKyAqLworaW50IGZmX2dldF9jaG9tcF9saW5lKEFWSU9Db250ZXh0ICpzLCBjaGFyICpidWYsIGludCBtYXhsZW4pOworCisvKioKKyAqIFJlYWQgYSB3aG9sZSBsaW5lIG9mIHRleHQgZnJvbSBBVklPQ29udGV4dCB0byBhbiBBVkJQcmludCBidWZmZXIuIFN0b3AKKyAqIHJlYWRpbmcgYWZ0ZXIgcmVhY2hpbmcgYSBcXHIsIGEgXFxuLCBhIFxcclxcbiwgYSBcXDAgb3IgRU9GLiAgVGhlIGxpbmUKKyAqIGVuZGluZyBjaGFyYWN0ZXJzIGFyZSBOT1QgaW5jbHVkZWQgaW4gdGhlIGJ1ZmZlciwgYnV0IHRoZXkgYXJlIHNraXBwZWQgb24KKyAqIHRoZSBpbnB1dC4KKyAqCisgKiBAcGFyYW0gcyB0aGUgcmVhZC1vbmx5IEFWSU9Db250ZXh0CisgKiBAcGFyYW0gYnAgdGhlIEFWQlByaW50IGJ1ZmZlcgorICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZWFkIGxpbmUsIG5vdCBpbmNsdWRpbmcgdGhlIGxpbmUgZW5kaW5ncywKKyAqICAgICAgICAgbmVnYXRpdmUgb24gZXJyb3IuCisgKi8KK2ludDY0X3QgZmZfcmVhZF9saW5lX3RvX2JwcmludChBVklPQ29udGV4dCAqcywgQVZCUHJpbnQgKmJwKTsKKworLyoqCisgKiBSZWFkIGEgd2hvbGUgbGluZSBvZiB0ZXh0IGZyb20gQVZJT0NvbnRleHQgdG8gYW4gQVZCUHJpbnQgYnVmZmVyIG92ZXJ3cml0aW5nCisgKiBpdHMgY29udGVudHMuIFN0b3AgcmVhZGluZyBhZnRlciByZWFjaGluZyBhIFxcciwgYSBcXG4sIGEgXFxyXFxuLCBhIFxcMCBvcgorICogRU9GLiBUaGUgbGluZSBlbmRpbmcgY2hhcmFjdGVycyBhcmUgTk9UIGluY2x1ZGVkIGluIHRoZSBidWZmZXIsIGJ1dCB0aGV5CisgKiBhcmUgc2tpcHBlZCBvbiB0aGUgaW5wdXQuCisgKgorICogQHBhcmFtIHMgdGhlIHJlYWQtb25seSBBVklPQ29udGV4dAorICogQHBhcmFtIGJwIHRoZSBBVkJQcmludCBidWZmZXIKKyAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVhZCBsaW5lIG5vdCBpbmNsdWRpbmcgdGhlIGxpbmUgZW5kaW5ncywKKyAqICAgICAgICAgbmVnYXRpdmUgb24gZXJyb3IsIG9yIGlmIHRoZSBidWZmZXIgYmVjb21lcyB0cnVuY2F0ZWQuCisgKi8KK2ludDY0X3QgZmZfcmVhZF9saW5lX3RvX2JwcmludF9vdmVyd3JpdGUoQVZJT0NvbnRleHQgKnMsIEFWQlByaW50ICpicCk7CisKICNkZWZpbmUgU1BBQ0VfQ0hBUlMgIiBcdFxyXG4iCiAKIC8qKgpAQCAtNDcxLDYgKzU1NywxNSBAQAogaW50IGZmX3N0cmVhbV9hZGRfYml0c3RyZWFtX2ZpbHRlcihBVlN0cmVhbSAqc3QsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmFyZ3MpOwogCiAvKioKKyAqIENvcHkgZW5jb2RpbmcgcGFyYW1ldGVycyBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbiBzdHJlYW0KKyAqCisgKiBAcGFyYW0gZHN0IHBvaW50ZXIgdG8gZGVzdGluYXRpb24gQVZTdHJlYW0KKyAqIEBwYXJhbSBzcmMgcG9pbnRlciB0byBzb3VyY2UgQVZTdHJlYW0KKyAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIEFWRVJST1IgY29kZSBvbiBlcnJvcgorICovCitpbnQgZmZfc3RyZWFtX2VuY29kZV9wYXJhbXNfY29weShBVlN0cmVhbSAqZHN0LCBjb25zdCBBVlN0cmVhbSAqc3JjKTsKKworLyoqCiAgKiBXcmFwIGVycm5vIG9uIHJlbmFtZSgpIGVycm9yLgogICoKICAqIEBwYXJhbSBvbGRwYXRoIHNvdXJjZSBwYXRoCkBAIC00ODIsOCArNTc3LDExIEBACiAgICAgaW50IHJldCA9IDA7CiAgICAgaWYgKHJlbmFtZShvbGRwYXRoLCBuZXdwYXRoKSA9PSAtMSkgewogICAgICAgICByZXQgPSBBVkVSUk9SKGVycm5vKTsKLSAgICAgICAgaWYgKGxvZ2N0eCkKLSAgICAgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgImZhaWxlZCB0byByZW5hbWUgZmlsZSAlcyB0byAlc1xuIiwgb2xkcGF0aCwgbmV3cGF0aCk7CisgICAgICAgIGlmIChsb2djdHgpIHsKKyAgICAgICAgICAgIGNoYXIgZXJyW0FWX0VSUk9SX01BWF9TVFJJTkdfU0laRV0gPSB7MH07CisgICAgICAgICAgICBhdl9tYWtlX2Vycm9yX3N0cmluZyhlcnIsIEFWX0VSUk9SX01BWF9TVFJJTkdfU0laRSwgcmV0KTsKKyAgICAgICAgICAgIGF2X2xvZyhsb2djdHgsIEFWX0xPR19FUlJPUiwgImZhaWxlZCB0byByZW5hbWUgZmlsZSAlcyB0byAlczogJXNcbiIsIG9sZHBhdGgsIG5ld3BhdGgsIGVycik7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTQ5MiwxMCArNTkwLDEyIEBACiAgKiBBbGxvY2F0ZSBleHRyYWRhdGEgd2l0aCBhZGRpdGlvbmFsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgYXQgZW5kCiAgKiB3aGljaCBpcyBhbHdheXMgc2V0IHRvIDAuCiAgKgorICogUHJldmlvdXNseSBhbGxvY2F0ZWQgZXh0cmFkYXRhIGluIHBhciB3aWxsIGJlIGZyZWVkLgorICoKICAqIEBwYXJhbSBzaXplIHNpemUgb2YgZXh0cmFkYXRhCiAgKiBAcmV0dXJuIDAgaWYgT0ssIEFWRVJST1JfeHh4IG9uIGVycm9yCiAgKi8KLWludCBmZl9hbGxvY19leHRyYWRhdGEoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCBpbnQgc2l6ZSk7CitpbnQgZmZfYWxsb2NfZXh0cmFkYXRhKEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIGludCBzaXplKTsKIAogLyoqCiAgKiBBbGxvY2F0ZSBleHRyYWRhdGEgd2l0aCBhZGRpdGlvbmFsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgYXQgZW5kCkBAIC01MDQsNyArNjA0LDcgQEAKICAqIEBwYXJhbSBzaXplIHNpemUgb2YgZXh0cmFkYXRhCiAgKiBAcmV0dXJuID49IDAgaWYgT0ssIEFWRVJST1JfeHh4IG9uIGVycm9yCiAgKi8KLWludCBmZl9nZXRfZXh0cmFkYXRhKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgQVZJT0NvbnRleHQgKnBiLCBpbnQgc2l6ZSk7CitpbnQgZmZfZ2V0X2V4dHJhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUpOwogCiAvKioKICAqIGFkZCBmcmFtZSBmb3IgcmZwcyBjYWxjdWxhdGlvbi4KQEAgLTUzMiw3ICs2MzIsNyBAQAogLyoqCiAgKiBDb3BpZXMgdGhlIHdoaWxlbGlzdHMgZnJvbSBvbmUgY29udGV4dCB0byB0aGUgb3RoZXIKICAqLwotaW50IGZmX2NvcHlfd2hpdGVsaXN0cyhBVkZvcm1hdENvbnRleHQgKmRzdCwgQVZGb3JtYXRDb250ZXh0ICpzcmMpOworaW50IGZmX2NvcHlfd2hpdGVibGFja2xpc3RzKEFWRm9ybWF0Q29udGV4dCAqZHN0LCBjb25zdCBBVkZvcm1hdENvbnRleHQgKnNyYyk7CiAKIGludCBmZmlvX29wZW4yX3dyYXBwZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKipwYiwgY29uc3QgY2hhciAqdXJsLCBpbnQgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWSU9JbnRlcnJ1cHRDQiAqaW50X2NiLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKTsKQEAgLTU0MywxMyArNjQzLDMxIEBACiAgKi8KICNkZWZpbmUgRkZFUlJPUl9SRURPIEZGRVJSVEFHKCdSJywnRScsJ0QnLCdPJykKIAorLyoqCisgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIG9wZW4gSU8gc3RyZWFtIG9mIG91dHB1dCBmb3JtYXQuCisgKgorICogQHBhcmFtIHMgQVZGb3JtYXRDb250ZXh0CisgKiBAcGFyYW0gdXJsIFVSTCBvciBmaWxlIG5hbWUgdG8gb3BlbiBmb3Igd3JpdGluZworICogQG9wdGlvbnMgb3B0aW9uYWwgb3B0aW9ucyB3aGljaCB3aWxsIGJlIHBhc3NlZCB0byBpb19vcGVuIGNhbGxiYWNrCisgKiBAcmV0dXJuID49MCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGluIGNhc2Ugb2YgZmFpbHVyZQorICovCitpbnQgZmZfZm9ybWF0X291dHB1dF9vcGVuKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqdXJsLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKTsKKwogLyoKICAqIEEgd3JhcHBlciBhcm91bmQgQVZGb3JtYXRDb250ZXh0LmlvX2Nsb3NlIHRoYXQgc2hvdWxkIGJlIHVzZWQKLSAqIGludGVhZCBvZiBjYWxsaW5nIHRoZSBwb2ludGVyIGRpcmVjdGx5LgorICogaW5zdGVhZCBvZiBjYWxsaW5nIHRoZSBwb2ludGVyIGRpcmVjdGx5LgogICovCiB2b2lkIGZmX2Zvcm1hdF9pb19jbG9zZShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICoqcGIpOwogCiAvKioKKyAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIGZpbGUgdXNlcyBodHRwIG9yIGh0dHBzIHByb3RvY29sCisgKgorICogQHBhcmFtIHMgQVZGb3JtYXRDb250ZXh0CisgKiBAcGFyYW0gZmlsZW5hbWUgVVJMIG9yIGZpbGUgbmFtZSB0byBvcGVuIGZvciB3cml0aW5nCisgKi8KK2ludCBmZl9pc19odHRwX3Byb3RvKGNoYXIgKmZpbGVuYW1lKTsKKworLyoqCiAgKiBQYXJzZSBjcmVhdGlvbl90aW1lIGluIEFWRm9ybWF0Q29udGV4dCBtZXRhZGF0YSBpZiBleGlzdHMgYW5kIHdhcm4gaWYgdGhlCiAgKiBwYXJzaW5nIGZhaWxzLgogICoKQEAgLTU2MCw0ICs2NzgsMTA3IEBACiAgKi8KIGludCBmZl9wYXJzZV9jcmVhdGlvbl90aW1lX21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgaW50NjRfdCAqdGltZXN0YW1wLCBpbnQgcmV0dXJuX3NlY29uZHMpOwogCisvKioKKyAqIFN0YW5kYXJkaXplIGNyZWF0aW9uX3RpbWUgbWV0YWRhdGEgaW4gQVZGb3JtYXRDb250ZXh0IHRvIGFuIElTTy04NjAxCisgKiB0aW1lc3RhbXAgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzIEFWRm9ybWF0Q29udGV4dAorICogQHJldHVybiA8MCBvbiBlcnJvcgorICovCitpbnQgZmZfc3RhbmRhcmRpemVfY3JlYXRpb25fdGltZShBVkZvcm1hdENvbnRleHQgKnMpOworCisjZGVmaW5lIENPTlRBSU5TX1BBTCAyCisvKioKKyAqIFJlc2h1ZmZsZXMgdGhlIGxpbmVzIHRvIHVzZSB0aGUgdXNlciBzcGVjaWZpZWQgc3RyaWRlLgorICoKKyAqIEBwYXJhbSBwcGt0IGlucHV0IGFuZCBvdXRwdXQgcGFja2V0CisgKiBAcmV0dXJuIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IKKyAqICAgICAgICAgMCBpZiBubyBuZXcgcGFja2V0IHdhcyBhbGxvY2F0ZWQKKyAqICAgICAgICAgbm9uLXplcm8gaWYgYSBuZXcgcGFja2V0IHdhcyBhbGxvY2F0ZWQgYW5kIHBwa3QgaGFzIHRvIGJlIGZyZWVkCisgKiAgICAgICAgIENPTlRBSU5TX1BBTCBpZiBpbiBhZGRpdGlvbiB0byBhIG5ldyBwYWNrZXQgdGhlIG9sZCBjb250YWluZWQgYSBwYWxldHRlCisgKi8KK2ludCBmZl9yZXNodWZmbGVfcmF3X3JnYihBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICoqcHBrdCwgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgaW50IGV4cGVjdGVkX3N0cmlkZSk7CisKKy8qKgorICogUmV0cmlldmVzIHRoZSBwYWxldHRlIGZyb20gYSBwYWNrZXQsIGVpdGhlciBmcm9tIHNpZGUgZGF0YSwgb3IKKyAqIGFwcGVuZGVkIHRvIHRoZSB2aWRlbyBkYXRhIGluIHRoZSBwYWNrZXQgaXRzZWxmIChyYXcgdmlkZW8gb25seSkuCisgKiBJdCBpcyBjb21tb25seSB1c2VkIGFmdGVyIGEgY2FsbCB0byBmZl9yZXNodWZmbGVfcmF3X3JnYigpLgorICoKKyAqIFVzZSAwIGZvciB0aGUgcmV0IHBhcmFtZXRlciB0byBjaGVjayBmb3Igc2lkZSBkYXRhIG9ubHkuCisgKgorICogQHBhcmFtIHBrdCBwb2ludGVyIHRvIHBhY2tldCBiZWZvcmUgY2FsbGluZyBmZl9yZXNodWZmbGVfcmF3X3JnYigpCisgKiBAcGFyYW0gcmV0IHJldHVybiB2YWx1ZSBmcm9tIGZmX3Jlc2h1ZmZsZV9yYXdfcmdiKCksIG9yIDAKKyAqIEBwYXJhbSBwYWxldHRlIHBvaW50ZXIgdG8gcGFsZXR0ZSBidWZmZXIKKyAqIEByZXR1cm4gbmVnYXRpdmUgZXJyb3IgY29kZSBvcgorICogICAgICAgICAxIGlmIHRoZSBwYWNrZXQgaGFzIGEgcGFsZXR0ZSwgZWxzZSAwCisgKi8KK2ludCBmZl9nZXRfcGFja2V0X3BhbGV0dGUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBpbnQgcmV0LCB1aW50MzJfdCAqcGFsZXR0ZSk7CisKKy8qKgorICogRmluYWxpemUgYnVmIGludG8gZXh0cmFkYXRhIGFuZCBzZXQgaXRzIHNpemUgYXBwcm9wcmlhdGVseS4KKyAqLworaW50IGZmX2JwcmludF90b19jb2RlY3Bhcl9leHRyYWRhdGEoQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgc3RydWN0IEFWQlByaW50ICpidWYpOworCisvKioKKyAqIEZpbmQgdGhlIG5leHQgcGFja2V0IGluIHRoZSBpbnRlcmxlYXZpbmcgcXVldWUgZm9yIHRoZSBnaXZlbiBzdHJlYW0uCisgKiBUaGUgcGt0IHBhcmFtZXRlciBpcyBmaWxsZWQgaW4gd2l0aCB0aGUgcXVldWVkIHBhY2tldCwgaW5jbHVkaW5nCisgKiByZWZlcmVuY2VzIHRvIHRoZSBkYXRhICh3aGljaCB0aGUgY2FsbGVyIGlzIG5vdCBhbGxvd2VkIHRvIGtlZXAgb3IKKyAqIG1vZGlmeSkuCisgKgorICogQHJldHVybiAwIGlmIGEgcGFja2V0IHdhcyBmb3VuZCwgYSBuZWdhdGl2ZSB2YWx1ZSBpZiBubyBwYWNrZXQgd2FzIGZvdW5kCisgKi8KK2ludCBmZl9pbnRlcmxlYXZlZF9wZWVrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QsIGludCBhZGRfb2Zmc2V0KTsKKworCitpbnQgZmZfbG9ja19hdmZvcm1hdCh2b2lkKTsKK2ludCBmZl91bmxvY2tfYXZmb3JtYXQodm9pZCk7CisKKy8qKgorICogU2V0IEFWRm9ybWF0Q29udGV4dCB1cmwgZmllbGQgdG8gdGhlIHByb3ZpZGVkIHBvaW50ZXIuIFRoZSBwb2ludGVyIG11c3QKKyAqIHBvaW50IHRvIGEgdmFsaWQgc3RyaW5nLiBUaGUgZXhpc3RpbmcgdXJsIGZpZWxkIGlzIGZyZWVkIGlmIG5lY2Vzc2FyeS4gQWxzbworICogc2V0IHRoZSBsZWdhY3kgZmlsZW5hbWUgZmllbGQgdG8gdGhlIHNhbWUgc3RyaW5nIHdoaWNoIHdhcyBwcm92aWRlZCBpbiB1cmwuCisgKi8KK3ZvaWQgZmZfZm9ybWF0X3NldF91cmwoQVZGb3JtYXRDb250ZXh0ICpzLCBjaGFyICp1cmwpOworCisjZGVmaW5lIEZGX1BBQ0tFVExJU1RfRkxBR19SRUZfUEFDS0VUICgxIDw8IDApIC8qKjwgQ3JlYXRlIGEgbmV3IHJlZmVyZW5jZSBmb3IgdGhlIHBhY2tldCBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJyaW5nIHRoZSBvd25lcnNoaXAgb2YgdGhlIGV4aXN0aW5nIG9uZSB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LiAqLworCisvKioKKyAqIEFwcGVuZCBhbiBBVlBhY2tldCB0byB0aGUgbGlzdC4KKyAqCisgKiBAcGFyYW0gaGVhZCAgTGlzdCBoZWFkIGVsZW1lbnQKKyAqIEBwYXJhbSB0YWlsICBMaXN0IHRhaWwgZWxlbWVudAorICogQHBhcmFtIHBrdCAgIFRoZSBwYWNrZXQgYmVpbmcgYXBwZW5kZWQKKyAqIEBwYXJhbSBmbGFncyBBbnkgY29tYmluYXRpb24gb2YgRkZfUEFDS0VUTElTVF9GTEFHXyogZmxhZ3MKKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIHZhbHVlIG9uIGZhaWx1cmUuIE9uIGZhaWx1cmUsCisgICAgICAgICAgIHRoZSBsaXN0IGlzIHVuY2hhbmdlZAorICovCitpbnQgZmZfcGFja2V0X2xpc3RfcHV0KEFWUGFja2V0TGlzdCAqKmhlYWQsIEFWUGFja2V0TGlzdCAqKnRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QsIGludCBmbGFncyk7CisKKy8qKgorICogUmVtb3ZlIHRoZSBvbGRlc3QgQVZQYWNrZXQgaW4gdGhlIGxpc3QgYW5kIHJldHVybiBpdC4KKyAqCisgKiBAbm90ZSBUaGUgcGt0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gY29tcGxldGVseS4gVGhlIGNhbGxlciBvd25zIHRoZQorICogICAgICAgcGFja2V0IGFuZCBtdXN0IHVucmVmIGl0IGJ5IGl0c2VsZi4KKyAqCisgKiBAcGFyYW0gaGVhZCBMaXN0IGhlYWQgZWxlbWVudAorICogQHBhcmFtIHRhaWwgTGlzdCB0YWlsIGVsZW1lbnQKKyAqIEBwYXJhbSBwa3QgIFBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgQVZQYWNrZXQgc3RydWN0CisgKi8KK2ludCBmZl9wYWNrZXRfbGlzdF9nZXQoQVZQYWNrZXRMaXN0ICoqaGVhZCwgQVZQYWNrZXRMaXN0ICoqdGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgKnBrdCk7CisKKy8qKgorICogV2lwZSB0aGUgbGlzdCBhbmQgdW5yZWYgYWxsIHRoZSBwYWNrZXRzIGluIGl0LgorICoKKyAqIEBwYXJhbSBoZWFkIExpc3QgaGVhZCBlbGVtZW50CisgKiBAcGFyYW0gdGFpbCBMaXN0IHRhaWwgZWxlbWVudAorICovCit2b2lkIGZmX3BhY2tldF9saXN0X2ZyZWUoQVZQYWNrZXRMaXN0ICoqaGVhZCwgQVZQYWNrZXRMaXN0ICoqdGFpbCk7CisKK3ZvaWQgYXZwcml2X3JlZ2lzdGVyX2RldmljZXMoY29uc3QgQVZPdXRwdXRGb3JtYXQgKiBjb25zdCBvW10sIGNvbnN0IEFWSW5wdXRGb3JtYXQgKiBjb25zdCBpW10pOworCiAjZW5kaWYgLyogQVZGT1JNQVRfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaXBtb3ZpZS5jIGIvbGliYXZmb3JtYXQvaXBtb3ZpZS5jCmluZGV4IGJjNWQ4Y2MuLjdmNWE4YzYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2lwbW92aWUuYworKysgYi9saWJhdmZvcm1hdC9pcG1vdmllLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogSW50ZXJwbGF5IE1WRSBGaWxlIERlbXV4ZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtNTgsNyArNTgsNyBAQAogI2RlZmluZSBPUENPREVfSU5JVF9BVURJT19CVUZGRVJTICAgICAgMHgwMwogI2RlZmluZSBPUENPREVfU1RBUlRfU1RPUF9BVURJTyAgICAgICAgMHgwNAogI2RlZmluZSBPUENPREVfSU5JVF9WSURFT19CVUZGRVJTICAgICAgMHgwNQotI2RlZmluZSBPUENPREVfVU5LTk9XTl8wNiAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBPUENPREVfVklERU9fREFUQV8wNiAgICAgICAgICAgMHgwNgogI2RlZmluZSBPUENPREVfU0VORF9CVUZGRVIgICAgICAgICAgICAgMHgwNwogI2RlZmluZSBPUENPREVfQVVESU9fRlJBTUUgICAgICAgICAgICAgMHgwOAogI2RlZmluZSBPUENPREVfU0lMRU5DRV9GUkFNRSAgICAgICAgICAgMHgwOQpAQCAtNjYsMTAgKzY2LDEwIEBACiAjZGVmaW5lIE9QQ09ERV9DUkVBVEVfR1JBRElFTlQgICAgICAgICAweDBCCiAjZGVmaW5lIE9QQ09ERV9TRVRfUEFMRVRURSAgICAgICAgICAgICAweDBDCiAjZGVmaW5lIE9QQ09ERV9TRVRfUEFMRVRURV9DT01QUkVTU0VEICAweDBECi0jZGVmaW5lIE9QQ09ERV9VTktOT1dOXzBFICAgICAgICAgICAgICAweDBFCisjZGVmaW5lIE9QQ09ERV9TRVRfU0tJUF9NQVAgICAgICAgICAgICAweDBFCiAjZGVmaW5lIE9QQ09ERV9TRVRfREVDT0RJTkdfTUFQICAgICAgICAweDBGCi0jZGVmaW5lIE9QQ09ERV9VTktOT1dOXzEwICAgICAgICAgICAgICAweDEwCi0jZGVmaW5lIE9QQ09ERV9WSURFT19EQVRBICAgICAgICAgICAgICAweDExCisjZGVmaW5lIE9QQ09ERV9WSURFT19EQVRBXzEwICAgICAgICAgICAweDEwCisjZGVmaW5lIE9QQ09ERV9WSURFT19EQVRBXzExICAgICAgICAgICAweDExCiAjZGVmaW5lIE9QQ09ERV9VTktOT1dOXzEyICAgICAgICAgICAgICAweDEyCiAjZGVmaW5lIE9QQ09ERV9VTktOT1dOXzEzICAgICAgICAgICAgICAweDEzCiAjZGVmaW5lIE9QQ09ERV9VTktOT1dOXzE0ICAgICAgICAgICAgICAweDE0CkBAIC05MSw2ICs5MSw4IEBACiAgICAgdWludDMyX3QgICAgIHBhbGV0dGVbMjU2XTsKICAgICBpbnQgICAgICAgICAgaGFzX3BhbGV0dGU7CiAgICAgaW50ICAgICAgICAgIGNoYW5nZWQ7CisgICAgdWludDhfdCAgICAgIHNlbmRfYnVmZmVyOworICAgIHVpbnQ4X3QgICAgICBmcmFtZV9mb3JtYXQ7CiAKICAgICB1bnNpZ25lZCBpbnQgYXVkaW9fYml0czsKICAgICB1bnNpZ25lZCBpbnQgYXVkaW9fY2hhbm5lbHM7CkBAIC0xMDUsNiArMTA3LDggQEAKICAgICBpbnQgYXVkaW9fY2h1bmtfc2l6ZTsKICAgICBpbnQ2NF90IHZpZGVvX2NodW5rX29mZnNldDsKICAgICBpbnQgdmlkZW9fY2h1bmtfc2l6ZTsKKyAgICBpbnQ2NF90IHNraXBfbWFwX2NodW5rX29mZnNldDsKKyAgICBpbnQgc2tpcF9tYXBfY2h1bmtfc2l6ZTsKICAgICBpbnQ2NF90IGRlY29kZV9tYXBfY2h1bmtfb2Zmc2V0OwogICAgIGludCBkZWNvZGVfbWFwX2NodW5rX3NpemU7CiAKQEAgLTE1MiwxMSArMTU2LDExIEBACiAKICAgICAgICAgY2h1bmtfdHlwZSA9IENIVU5LX1ZJREVPOwogCi0gICAgfSBlbHNlIGlmIChzLT5kZWNvZGVfbWFwX2NodW5rX29mZnNldCkgeworICAgIH0gZWxzZSBpZiAocy0+ZnJhbWVfZm9ybWF0KSB7CiAKLSAgICAgICAgLyogc2VuZCBib3RoIHRoZSBkZWNvZGUgbWFwIGFuZCB0aGUgdmlkZW8gZGF0YSB0b2dldGhlciAqLworICAgICAgICAvKiBzZW5kIHRoZSBmcmFtZSBmb3JtYXQsIGRlY29kZSBtYXAsIHRoZSB2aWRlbyBkYXRhLCBza2lwIG1hcCwgYW5kIHRoZSBzZW5kX2J1ZmZlciBmbGFnIHRvZ2V0aGVyICovCiAKLSAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCAyICsgcy0+ZGVjb2RlX21hcF9jaHVua19zaXplICsgcy0+dmlkZW9fY2h1bmtfc2l6ZSkpCisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgOCArIHMtPmRlY29kZV9tYXBfY2h1bmtfc2l6ZSArIHMtPnZpZGVvX2NodW5rX3NpemUgKyBzLT5za2lwX21hcF9jaHVua19zaXplKSkKICAgICAgICAgICAgIHJldHVybiBDSFVOS19OT01FTTsKIAogICAgICAgICBpZiAocy0+aGFzX3BhbGV0dGUpIHsKQEAgLTE3NCwyNiArMTc4LDU0IEBACiAgICAgICAgICAgICBmZl9hZGRfcGFyYW1fY2hhbmdlKHBrdCwgMCwgMCwgMCwgcy0+dmlkZW9fd2lkdGgsIHMtPnZpZGVvX2hlaWdodCk7CiAgICAgICAgICAgICBzLT5jaGFuZ2VkID0gMDsKICAgICAgICAgfQotICAgICAgICBwa3QtPnBvcz0gcy0+ZGVjb2RlX21hcF9jaHVua19vZmZzZXQ7Ci0gICAgICAgIGF2aW9fc2VlayhwYiwgcy0+ZGVjb2RlX21hcF9jaHVua19vZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgcy0+ZGVjb2RlX21hcF9jaHVua19vZmZzZXQgPSAwOwogCi0gICAgICAgIEFWX1dMMTYocGt0LT5kYXRhLCBzLT5kZWNvZGVfbWFwX2NodW5rX3NpemUpOwotICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEgKyAyLCBzLT5kZWNvZGVfbWFwX2NodW5rX3NpemUpICE9Ci0gICAgICAgICAgICBzLT5kZWNvZGVfbWFwX2NodW5rX3NpemUpIHsKLSAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOwotICAgICAgICAgICAgcmV0dXJuIENIVU5LX0VPRjsKLSAgICAgICAgfQorICAgICAgICBBVl9XTDgocGt0LT5kYXRhLCBzLT5mcmFtZV9mb3JtYXQpOworICAgICAgICBBVl9XTDgocGt0LT5kYXRhICsgMSwgcy0+c2VuZF9idWZmZXIpOworICAgICAgICBBVl9XTDE2KHBrdC0+ZGF0YSArIDIsIHMtPnZpZGVvX2NodW5rX3NpemUpOworICAgICAgICBBVl9XTDE2KHBrdC0+ZGF0YSArIDQsIHMtPmRlY29kZV9tYXBfY2h1bmtfc2l6ZSk7CisgICAgICAgIEFWX1dMMTYocGt0LT5kYXRhICsgNiwgcy0+c2tpcF9tYXBfY2h1bmtfc2l6ZSk7CiAKKyAgICAgICAgcy0+ZnJhbWVfZm9ybWF0ID0gMDsKKyAgICAgICAgcy0+c2VuZF9idWZmZXIgPSAwOworCisgICAgICAgIHBrdC0+cG9zID0gcy0+dmlkZW9fY2h1bmtfb2Zmc2V0OwogICAgICAgICBhdmlvX3NlZWsocGIsIHMtPnZpZGVvX2NodW5rX29mZnNldCwgU0VFS19TRVQpOwogICAgICAgICBzLT52aWRlb19jaHVua19vZmZzZXQgPSAwOwogCi0gICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIDIgKyBzLT5kZWNvZGVfbWFwX2NodW5rX3NpemUsCi0gICAgICAgICAgICBzLT52aWRlb19jaHVua19zaXplKSAhPSBzLT52aWRlb19jaHVua19zaXplKSB7CisgICAgICAgIGlmIChhdmlvX3JlYWQocGIsIHBrdC0+ZGF0YSArIDgsIHMtPnZpZGVvX2NodW5rX3NpemUpICE9CisgICAgICAgICAgICBzLT52aWRlb19jaHVua19zaXplKSB7CiAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKICAgICAgICAgICAgIHJldHVybiBDSFVOS19FT0Y7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAocy0+ZGVjb2RlX21hcF9jaHVua19zaXplKSB7CisgICAgICAgICAgICBwa3QtPnBvcyA9IHMtPmRlY29kZV9tYXBfY2h1bmtfb2Zmc2V0OworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBzLT5kZWNvZGVfbWFwX2NodW5rX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgcy0+ZGVjb2RlX21hcF9jaHVua19vZmZzZXQgPSAwOworCisgICAgICAgICAgICBpZiAoYXZpb19yZWFkKHBiLCBwa3QtPmRhdGEgKyA4ICsgcy0+dmlkZW9fY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICBzLT5kZWNvZGVfbWFwX2NodW5rX3NpemUpICE9IHMtPmRlY29kZV9tYXBfY2h1bmtfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICAgICAgICAgIHJldHVybiBDSFVOS19FT0Y7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocy0+c2tpcF9tYXBfY2h1bmtfc2l6ZSkgeworICAgICAgICAgICAgcGt0LT5wb3MgPSBzLT5za2lwX21hcF9jaHVua19vZmZzZXQ7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIHMtPnNraXBfbWFwX2NodW5rX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgcy0+c2tpcF9tYXBfY2h1bmtfb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgcGt0LT5kYXRhICsgOCArIHMtPnZpZGVvX2NodW5rX3NpemUgKyBzLT5kZWNvZGVfbWFwX2NodW5rX3NpemUsCisgICAgICAgICAgICAgICAgcy0+c2tpcF9tYXBfY2h1bmtfc2l6ZSkgIT0gcy0+c2tpcF9tYXBfY2h1bmtfc2l6ZSkgeworICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICAgICAgICAgIHJldHVybiBDSFVOS19FT0Y7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzLT52aWRlb19jaHVua19zaXplID0gMDsKKyAgICAgICAgcy0+ZGVjb2RlX21hcF9jaHVua19zaXplID0gMDsKKyAgICAgICAgcy0+c2tpcF9tYXBfY2h1bmtfc2l6ZSA9IDA7CisKICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzLT52aWRlb19zdHJlYW1faW5kZXg7CiAgICAgICAgIHBrdC0+cHRzID0gcy0+dmlkZW9fcHRzOwogCkBAIC0yMjEsMTkgKzI1MywxOSBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBpcG1vdmllLT5hdWRpb19zYW1wbGVfcmF0ZSk7CiAgICAgaXBtb3ZpZS0+YXVkaW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gaXBtb3ZpZS0+YXVkaW9fdHlwZTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyB0YWcgKi8KLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gaXBtb3ZpZS0+YXVkaW9fY2hhbm5lbHM7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PIDoKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGlwbW92aWUtPmF1ZGlvX3R5cGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAgLyogbm8gdGFnICovCisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IGlwbW92aWUtPmF1ZGlvX2NoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID09IDEgPyBBVl9DSF9MQVlPVVRfTU9OTyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfU1RFUkVPOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBpcG1vdmllLT5hdWRpb19zYW1wbGVfcmF0ZTsKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGlwbW92aWUtPmF1ZGlvX2JpdHM7Ci0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICoKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSU5URVJQTEFZX0RQQ00pCi0gICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgLz0gMjsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBpcG1vdmllLT5hdWRpb19zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGlwbW92aWUtPmF1ZGlvX2JpdHM7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSU5URVJQTEFZX0RQQ00pCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgLz0gMjsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0zNTgsOSArMzkwLDYgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHMtPmZyYW1lX3B0c19pbmMgPSAoKHVpbnQ2NF90KUFWX1JMMzIoJnNjcmF0Y2hbMF0pKSAqIEFWX1JMMTYoJnNjcmF0Y2hbNF0pOwotICAgICAgICAgICAgYXZfbG9nKHMtPmF2ZiwgQVZfTE9HX1RSQUNFLCAiICAlLjJmIGZyYW1lcy9zZWNvbmQgKHRpbWVyIGRpdiA9ICVkLCBzdWJkaXYgPSAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgIDEwMDAwMDAuMCAvIHMtPmZyYW1lX3B0c19pbmMsIEFWX1JMMzIoJnNjcmF0Y2hbMF0pLAotICAgICAgICAgICAgICAgICAgICBBVl9STDE2KCZzY3JhdGNoWzRdKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9QQ09ERV9JTklUX0FVRElPX0JVRkZFUlM6CkBAIC00MzMsOSArNDYyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgcy0+dmlkZW9fd2lkdGgsIHMtPnZpZGVvX2hlaWdodCk7CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIE9QQ09ERV9VTktOT1dOXzA2OgotICAgICAgICBjYXNlIE9QQ09ERV9VTktOT1dOXzBFOgotICAgICAgICBjYXNlIE9QQ09ERV9VTktOT1dOXzEwOgogICAgICAgICBjYXNlIE9QQ09ERV9VTktOT1dOXzEyOgogICAgICAgICBjYXNlIE9QQ09ERV9VTktOT1dOXzEzOgogICAgICAgICBjYXNlIE9QQ09ERV9VTktOT1dOXzE0OgpAQCAtNDQ3LDYgKzQ3Myw3IEBACiAgICAgICAgIGNhc2UgT1BDT0RFX1NFTkRfQlVGRkVSOgogICAgICAgICAgICAgYXZfbG9nKHMtPmF2ZiwgQVZfTE9HX1RSQUNFLCAic2VuZCBidWZmZXJcbiIpOwogICAgICAgICAgICAgYXZpb19za2lwKHBiLCBvcGNvZGVfc2l6ZSk7CisgICAgICAgICAgICBzLT5zZW5kX2J1ZmZlciA9IDE7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9QQ09ERV9BVURJT19GUkFNRToKQEAgLTUxNiw2ICs1NDMsMTUgQEAKICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgb3Bjb2RlX3NpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBPUENPREVfU0VUX1NLSVBfTUFQOgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2ZiwgQVZfTE9HX1RSQUNFLCAic2V0IHNraXAgbWFwXG4iKTsKKworICAgICAgICAgICAgLyogbG9nIHBvc2l0aW9uIGFuZCBtb3ZlIG9uIGZvciBub3cgKi8KKyAgICAgICAgICAgIHMtPnNraXBfbWFwX2NodW5rX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBzLT5za2lwX21hcF9jaHVua19zaXplID0gb3Bjb2RlX3NpemU7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIG9wY29kZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgT1BDT0RFX1NFVF9ERUNPRElOR19NQVA6CiAgICAgICAgICAgICBhdl9sb2cocy0+YXZmLCBBVl9MT0dfVFJBQ0UsICJzZXQgZGVjb2RpbmcgbWFwXG4iKTsKIApAQCAtNTI1LDggKzU2MSwyOSBAQAogICAgICAgICAgICAgYXZpb19za2lwKHBiLCBvcGNvZGVfc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICBjYXNlIE9QQ09ERV9WSURFT19EQVRBOgotICAgICAgICAgICAgYXZfbG9nKHMtPmF2ZiwgQVZfTE9HX1RSQUNFLCAic2V0IHZpZGVvIGRhdGFcbiIpOworICAgICAgICBjYXNlIE9QQ09ERV9WSURFT19EQVRBXzA2OgorICAgICAgICAgICAgYXZfbG9nKHMtPmF2ZiwgQVZfTE9HX1RSQUNFLCAic2V0IHZpZGVvIGRhdGEgZm9ybWF0IDB4MDZcbiIpOworICAgICAgICAgICAgcy0+ZnJhbWVfZm9ybWF0ID0gMHgwNjsKKworICAgICAgICAgICAgLyogbG9nIHBvc2l0aW9uIGFuZCBtb3ZlIG9uIGZvciBub3cgKi8KKyAgICAgICAgICAgIHMtPnZpZGVvX2NodW5rX29mZnNldCA9IGF2aW9fdGVsbChwYik7CisgICAgICAgICAgICBzLT52aWRlb19jaHVua19zaXplID0gb3Bjb2RlX3NpemU7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIG9wY29kZV9zaXplKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgT1BDT0RFX1ZJREVPX0RBVEFfMTA6CisgICAgICAgICAgICBhdl9sb2cocy0+YXZmLCBBVl9MT0dfVFJBQ0UsICJzZXQgdmlkZW8gZGF0YSBmb3JtYXQgMHgxMFxuIik7CisgICAgICAgICAgICBzLT5mcmFtZV9mb3JtYXQgPSAweDEwOworCisgICAgICAgICAgICAvKiBsb2cgcG9zaXRpb24gYW5kIG1vdmUgb24gZm9yIG5vdyAqLworICAgICAgICAgICAgcy0+dmlkZW9fY2h1bmtfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgIHMtPnZpZGVvX2NodW5rX3NpemUgPSBvcGNvZGVfc2l6ZTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgb3Bjb2RlX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBPUENPREVfVklERU9fREFUQV8xMToKKyAgICAgICAgICAgIGF2X2xvZyhzLT5hdmYsIEFWX0xPR19UUkFDRSwgInNldCB2aWRlbyBkYXRhIGZvcm1hdCAweDExXG4iKTsKKyAgICAgICAgICAgIHMtPmZyYW1lX2Zvcm1hdCA9IDB4MTE7CiAKICAgICAgICAgICAgIC8qIGxvZyBwb3NpdGlvbiBhbmQgbW92ZSBvbiBmb3Igbm93ICovCiAgICAgICAgICAgICBzLT52aWRlb19jaHVua19vZmZzZXQgPSBhdmlvX3RlbGwocGIpOwpAQCAtNTkyLDcgKzY0OSwxMCBAQAogICAgIC8qIGluaXRpYWxpemUgcHJpdmF0ZSBjb250ZXh0IG1lbWJlcnMgKi8KICAgICBpcG1vdmllLT52aWRlb19wdHMgPSBpcG1vdmllLT5hdWRpb19mcmFtZV9jb3VudCA9IDA7CiAgICAgaXBtb3ZpZS0+YXVkaW9fY2h1bmtfb2Zmc2V0ID0gaXBtb3ZpZS0+dmlkZW9fY2h1bmtfb2Zmc2V0ID0KLSAgICBpcG1vdmllLT5kZWNvZGVfbWFwX2NodW5rX29mZnNldCA9IDA7CisgICAgaXBtb3ZpZS0+ZGVjb2RlX21hcF9jaHVua19vZmZzZXQgPSBpcG1vdmllLT5za2lwX21hcF9jaHVua19vZmZzZXQgPSAwOworICAgIGlwbW92aWUtPmRlY29kZV9tYXBfY2h1bmtfc2l6ZSA9IGlwbW92aWUtPnZpZGVvX2NodW5rX3NpemUgPQorICAgIGlwbW92aWUtPnNraXBfbWFwX2NodW5rX3NpemUgPSAwOworICAgIGlwbW92aWUtPnNlbmRfYnVmZmVyID0gaXBtb3ZpZS0+ZnJhbWVfZm9ybWF0ID0gMDsKIAogICAgIC8qIG9uIHRoZSBmaXJzdCByZWFkLCB0aGlzIHdpbGwgcG9zaXRpb24gdGhlIHN0cmVhbSBhdCB0aGUgZmlyc3QgY2h1bmsgKi8KICAgICBpcG1vdmllLT5uZXh0X2NodW5rX29mZnNldCA9IGF2aW9fdGVsbChwYikgKyA0OwpAQCAtNjIzLDEyICs2ODMsMTIgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2MywgMSwgMTAwMDAwMCk7CiAgICAgaXBtb3ZpZS0+dmlkZW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSU5URVJQTEFZX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLwotICAgIHN0LT5jb2RlYy0+d2lkdGggPSBpcG1vdmllLT52aWRlb193aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGlwbW92aWUtPnZpZGVvX2hlaWdodDsKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGlwbW92aWUtPnZpZGVvX2JwcDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0lOVEVSUExBWV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICBzdC0+Y29kZWNwYXItPndpZHRoID0gaXBtb3ZpZS0+dmlkZW9fd2lkdGg7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBpcG1vdmllLT52aWRlb19oZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBpcG1vdmllLT52aWRlb19icHA7CiAKICAgICBpZiAoaXBtb3ZpZS0+YXVkaW9fdHlwZSkgewogICAgICAgICByZXR1cm4gaW5pdF9hdWRpbyhzKTsKQEAgLTY1Myw2ICs3MTMsOCBAQAogICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CiAgICAgZWxzZSBpZiAocmV0ID09IENIVU5LX05PTUVNKQogICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgZWxzZSBpZiAocmV0ID09IENIVU5LX0VORCB8fCByZXQgPT0gQ0hVTktfU0hVVERPV04pCisgICAgICAgIHJldCA9IEFWRVJST1JfRU9GOwogICAgIGVsc2UgaWYgKHJldCA9PSBDSFVOS19WSURFTykKICAgICAgICAgcmV0ID0gMDsKICAgICBlbHNlIGlmIChyZXQgPT0gQ0hVTktfSU5JVF9WSURFTyB8fCByZXQgPT0gQ0hVTktfSU5JVF9BVURJTykKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2lyY2FtZGVjLmMgYi9saWJhdmZvcm1hdC9pcmNhbWRlYy5jCmluZGV4IGY5NTMzZWMuLmQzNzZmZmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2lyY2FtZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvaXJjYW1kZWMuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJwY20uaCIKQEAgLTg1LDE5ICs4NiwyMSBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gY2hhbm5lbHM7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPiBGRl9TQU5FX05CX0NIQU5ORUxTKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQodGFncywgdGFnKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIHRhZyAlWFxuIiwgdGFnKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKHRhZ3MsIHRhZyk7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5rbm93biB0YWcgJSJQUkl4MzIiXG4iLCB0YWcpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCk7Ci0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVscyAvIDg7Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzIC8gODsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgYXZpb19za2lwKHMtPnBiLCAxMDA4KTsKIAogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaXJjYW1lbmMuYyBiL2xpYmF2Zm9ybWF0L2lyY2FtZW5jLmMKaW5kZXggMWE4MjlkNC4uMzIzZWNiMyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvaXJjYW1lbmMuYworKysgYi9saWJhdmZvcm1hdC9pcmNhbWVuYy5jCkBAIC0yOCw3ICsyOCw3IEBACiAKIHN0YXRpYyBpbnQgaXJjYW1fd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgdWludDMyX3QgdGFnOwogCiAgICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSkgewpAQCAtMzYsMTUgKzM2LDE1IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19pcmNhbV9sZV90YWdzLCBjb2RlYy0+Y29kZWNfaWQpOworICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfaXJjYW1fbGVfdGFncywgcGFyLT5jb2RlY19pZCk7CiAgICAgaWYgKCF0YWcpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGNvZGVjXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKICAgICBhdmlvX3dsMzIocy0+cGIsIDB4MDAwMUEzNjQpOwotICAgIGF2aW9fd2wzMihzLT5wYiwgYXZfcTJpbnRmbG9hdCgoQVZSYXRpb25hbCl7Y29kZWMtPnNhbXBsZV9yYXRlLCAxfSkpOwotICAgIGF2aW9fd2wzMihzLT5wYiwgY29kZWMtPmNoYW5uZWxzKTsKKyAgICBhdmlvX3dsMzIocy0+cGIsIGF2X3EyaW50ZmxvYXQoKEFWUmF0aW9uYWwpe3Bhci0+c2FtcGxlX3JhdGUsIDF9KSk7CisgICAgYXZpb193bDMyKHMtPnBiLCBwYXItPmNoYW5uZWxzKTsKICAgICBhdmlvX3dsMzIocy0+cGIsIHRhZyk7CiAgICAgZmZpb19maWxsKHMtPnBiLCAwLCAxMDA4KTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2lzb20uYyBiL2xpYmF2Zm9ybWF0L2lzb20uYwppbmRleCAyY2ExMjY1Li4yNzkyMzcxIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9pc29tLmMKKysrIGIvbGliYXZmb3JtYXQvaXNvbS5jCkBAIC0zOCwxNSArMzgsMTUgQEAKICAgICB7IEFWX0NPREVDX0lEX0hFVkMgICAgICAgICwgMHgyMyB9LAogICAgIHsgQVZfQ09ERUNfSURfQUFDICAgICAgICAgLCAweDQwIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9NUDRBTFMgICAgICAsIDB4NDAgfSwgLyogMTQ0OTYtMyBBTFMgKi8KLSAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8gICwgMHg2MSB9LCAvKiBNUEVHMiBNYWluICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICAsIDB4NjAgfSwgLyogTVBFRzIgU2ltcGxlICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICAsIDB4NjIgfSwgLyogTVBFRzIgU05SICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICAsIDB4NjMgfSwgLyogTVBFRzIgU3BhdGlhbCAqLwotICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTyAgLCAweDY0IH0sIC8qIE1QRUcyIEhpZ2ggKi8KLSAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8gICwgMHg2NSB9LCAvKiBNUEVHMiA0MjIgKi8KLSAgICB7IEFWX0NPREVDX0lEX0FBQyAgICAgICAgICwgMHg2NiB9LCAvKiBNUEVHMiBBQUMgTWFpbiAqLwotICAgIHsgQVZfQ09ERUNfSURfQUFDICAgICAgICAgLCAweDY3IH0sIC8qIE1QRUcyIEFBQyBMb3cgKi8KLSAgICB7IEFWX0NPREVDX0lEX0FBQyAgICAgICAgICwgMHg2OCB9LCAvKiBNUEVHMiBBQUMgU1NSICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICAsIDB4NjEgfSwgLyogTVBFRy0yIE1haW4gKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8gICwgMHg2MCB9LCAvKiBNUEVHLTIgU2ltcGxlICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICAsIDB4NjIgfSwgLyogTVBFRy0yIFNOUiAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTyAgLCAweDYzIH0sIC8qIE1QRUctMiBTcGF0aWFsICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICAsIDB4NjQgfSwgLyogTVBFRy0yIEhpZ2ggKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8gICwgMHg2NSB9LCAvKiBNUEVHLTIgNDIyICovCisgICAgeyBBVl9DT0RFQ19JRF9BQUMgICAgICAgICAsIDB4NjYgfSwgLyogTVBFRy0yIEFBQyBNYWluICovCisgICAgeyBBVl9DT0RFQ19JRF9BQUMgICAgICAgICAsIDB4NjcgfSwgLyogTVBFRy0yIEFBQyBMb3cgKi8KKyAgICB7IEFWX0NPREVDX0lEX0FBQyAgICAgICAgICwgMHg2OCB9LCAvKiBNUEVHLTIgQUFDIFNTUiAqLwogICAgIHsgQVZfQ09ERUNfSURfTVAzICAgICAgICAgLCAweDY5IH0sIC8qIDEzODE4LTMgKi8KICAgICB7IEFWX0NPREVDX0lEX01QMiAgICAgICAgICwgMHg2OSB9LCAvKiAxMTE3Mi0zICovCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPICAsIDB4NkEgfSwgLyogMTExNzItMiAqLwpAQCAtNTksOSArNTksMTMgQEAKICAgICB7IEFWX0NPREVDX0lEX0FDMyAgICAgICAgICwgMHhBNSB9LAogICAgIHsgQVZfQ09ERUNfSURfRUFDMyAgICAgICAgLCAweEE2IH0sCiAgICAgeyBBVl9DT0RFQ19JRF9EVFMgICAgICAgICAsIDB4QTkgfSwgLyogbXA0cmEub3JnICovCi0gICAgeyBBVl9DT0RFQ19JRF9UU0NDMiAgICAgICAsIDB4RDAgfSwgLyogbm9uIHN0YW5kYXJkLCBjYW10YXNpYSB1c2VzIGl0ICovCi0gICAgeyBBVl9DT0RFQ19JRF9WT1JCSVMgICAgICAsIDB4REQgfSwgLyogbm9uIHN0YW5kYXJkLCBncGFjIHVzZXMgaXQgKi8KLSAgICB7IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRSwgMHhFMCB9LCAvKiBub24gc3RhbmRhcmQsIHNlZSB1bnN1cHBvcnRlZC1lbWJlZGRlZC1zdWJzLTIubXA0ICovCisgICAgeyBBVl9DT0RFQ19JRF9PUFVTICAgICAgICAsIDB4QUQgfSwgLyogbXA0cmEub3JnICovCisgICAgeyBBVl9DT0RFQ19JRF9WUDkgICAgICAgICAsIDB4QjEgfSwgLyogbXA0cmEub3JnICovCisgICAgeyBBVl9DT0RFQ19JRF9GTEFDICAgICAgICAsIDB4QzEgfSwgLyogbm9uc3RhbmRhcmQsIHVwZGF0ZSB3aGVuIHRoZXJlIGlzIGEgc3RhbmRhcmQgdmFsdWUgKi8KKyAgICB7IEFWX0NPREVDX0lEX1RTQ0MyICAgICAgICwgMHhEMCB9LCAvKiBub25zdGFuZGFyZCwgY2FtdGFzaWEgdXNlcyBpdCAqLworICAgIHsgQVZfQ09ERUNfSURfRVZSQyAgICAgICAgLCAweEQxIH0sIC8qIG5vbnN0YW5kYXJkLCBwdkF1dGhvciB1c2VzIGl0ICovCisgICAgeyBBVl9DT0RFQ19JRF9WT1JCSVMgICAgICAsIDB4REQgfSwgLyogbm9uc3RhbmRhcmQsIGdwYWMgdXNlcyBpdCAqLworICAgIHsgQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFLCAweEUwIH0sIC8qIG5vbnN0YW5kYXJkLCBzZWUgdW5zdXBwb3J0ZWQtZW1iZWRkZWQtc3Vicy0yLm1wNCAqLwogICAgIHsgQVZfQ09ERUNfSURfUUNFTFAgICAgICAgLCAweEUxIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHNFNZU1RFTVMsIDB4MDEgfSwKICAgICB7IEFWX0NPREVDX0lEX01QRUc0U1lTVEVNUywgMHgwMiB9LApAQCAtNzEsMTAgKzc1LDEwIEBACiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX21vdnZpZGVvX3RhZ3NbXSA9IHsKIC8qICB7IEFWX0NPREVDX0lEXywgTUtUQUcoJ0knLCAnVicsICc1JywgJzAnKSB9LCAqLy8qIEluZGVvIDUuMCAqLwogCi0gICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ3InLCAnYScsICd3JywgJyAnKSB9LCAvKiBVbmNvbXByZXNzZWQgUkdCICovCi0gICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ3knLCAndScsICd2JywgJzInKSB9LCAvKiBVbmNvbXByZXNzZWQgWVVWNDIyICovCi0gICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJzInLCAndicsICd1JywgJ3knKSB9LCAvKiBVTkNPTVBSRVNTRUQgOEJJVCA0OjI6MiAqLwotICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCd5JywgJ3UnLCAndicsICdzJykgfSwgLyogc2FtZSBhcyAydnV5IGJ1dCBieXRlIHN3YXBwZWQgKi8KKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygncicsICdhJywgJ3cnLCAnICcpIH0sIC8qIHVuY29tcHJlc3NlZCBSR0IgKi8KKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygneScsICd1JywgJ3YnLCAnMicpIH0sIC8qIHVuY29tcHJlc3NlZCBZVVY0MjIgKi8KKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnMicsICd2JywgJ3UnLCAneScpIH0sIC8qIHVuY29tcHJlc3NlZCA4LWJpdCA0OjI6MiAqLworICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCd5JywgJ3UnLCAndicsICdzJykgfSwgLyogc2FtZSBhcyAyVlVZIGJ1dCBieXRlLXN3YXBwZWQgKi8KIAogICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdMJywgJzUnLCAnNScsICc1JykgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnTCcsICc1JywgJzYnLCAnNScpIH0sCkBAIC04NSw2ICs4OSw3IEBACiAgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ0EnLCAnQicsICdHJywgJ1InKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdiJywgJzEnLCAnNicsICdnJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnYicsICc0JywgJzgnLCAncicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ2InLCAnNicsICc0JywgJ2EnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdiJywgJ3gnLCAnYicsICdnJykgfSwgLyogQk9YWCAqLwogICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sIE1LVEFHKCdiJywgJ3gnLCAncicsICdnJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnYicsICd4JywgJ3knLCAndicpIH0sCkBAIC05MywxOCArOTgsMTggQEAKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCBNS1RBRygnUicsICc0JywgJzInLCAnMCcpIH0sIC8qIFJhZGl1cyBEViBZVVYgUEFMICovCiAgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgTUtUQUcoJ1InLCAnNCcsICcxJywgJzEnKSB9LCAvKiBSYWRpdXMgRFYgWVVWIE5UU0MgKi8KIAotICAgIHsgQVZfQ09ERUNfSURfUjEwSywgICBNS1RBRygnUicsICcxJywgJzAnLCAnaycpIH0sIC8qIFVOQ09NUFJFU1NFRCAxMEJJVCBSR0IgKi8KLSAgICB7IEFWX0NPREVDX0lEX1IxMEssICAgTUtUQUcoJ1InLCAnMScsICcwJywgJ2cnKSB9LCAvKiBVTkNPTVBSRVNTRUQgMTBCSVQgUkdCICovCi0gICAgeyBBVl9DT0RFQ19JRF9SMjEwLCAgIE1LVEFHKCdyJywgJzInLCAnMScsICcwJykgfSwgLyogVU5DT01QUkVTU0VEIDEwQklUIFJHQiAqLworICAgIHsgQVZfQ09ERUNfSURfUjEwSywgICBNS1RBRygnUicsICcxJywgJzAnLCAnaycpIH0sIC8qIHVuY29tcHJlc3NlZCAxMC1iaXQgUkdCICovCisgICAgeyBBVl9DT0RFQ19JRF9SMTBLLCAgIE1LVEFHKCdSJywgJzEnLCAnMCcsICdnJykgfSwgLyogdW5jb21wcmVzc2VkIDEwLWJpdCBSR0IgKi8KKyAgICB7IEFWX0NPREVDX0lEX1IyMTAsICAgTUtUQUcoJ3InLCAnMicsICcxJywgJzAnKSB9LCAvKiB1bmNvbXByZXNzZWQgMTAtYml0IFJHQiAqLwogICAgIHsgQVZfQ09ERUNfSURfQVZVSSwgICBNS1RBRygnQScsICdWJywgJ1UnLCAnSScpIH0sIC8qIEFWSUQgVW5jb21wcmVzc2VkIGRlaW50ZXJsZWF2ZWQgVVlWWTQyMiAqLwogICAgIHsgQVZfQ09ERUNfSURfQVZSUCwgICBNS1RBRygnQScsICdWJywgJ3InLCAncCcpIH0sIC8qIEF2aWQgMToxIDEwLWJpdCBSR0IgUGFja2VyICovCiAgICAgeyBBVl9DT0RFQ19JRF9BVlJQLCAgIE1LVEFHKCdTJywgJ1UnLCAnRCcsICdTJykgfSwgLyogQXZpZCBEUyBVbmNvbXByZXNzZWQgKi8KLSAgICB7IEFWX0NPREVDX0lEX1YyMTAsICAgTUtUQUcoJ3YnLCAnMicsICcxJywgJzAnKSB9LCAvKiBVTkNPTVBSRVNTRUQgMTBCSVQgNDoyOjIgKi8KLSAgICB7IEFWX0NPREVDX0lEX1YyMTAsICAgTUtUQUcoJ2InLCAneCcsICd5JywgJzInKSB9LCAvKiBCT1hYIDEwQklUIDQ6MjoyICovCi0gICAgeyBBVl9DT0RFQ19JRF9WMzA4LCAgIE1LVEFHKCd2JywgJzMnLCAnMCcsICc4JykgfSwgLyogVU5DT01QUkVTU0VEICA4QklUIDQ6NDo0ICovCi0gICAgeyBBVl9DT0RFQ19JRF9WNDA4LCAgIE1LVEFHKCd2JywgJzQnLCAnMCcsICc4JykgfSwgLyogVU5DT01QUkVTU0VEICA4QklUIDQ6NDo0OjQgKi8KLSAgICB7IEFWX0NPREVDX0lEX1Y0MTAsICAgTUtUQUcoJ3YnLCAnNCcsICcxJywgJzAnKSB9LCAvKiBVTkNPTVBSRVNTRUQgMTBCSVQgNDo0OjQgKi8KLSAgICB7IEFWX0NPREVDX0lEX1k0MVAsICAgTUtUQUcoJ1knLCAnNCcsICcxJywgJ1AnKSB9LCAvKiBVTkNPTVBSRVNTRUQgMTJCSVQgNDoxOjEgKi8KKyAgICB7IEFWX0NPREVDX0lEX1YyMTAsICAgTUtUQUcoJ3YnLCAnMicsICcxJywgJzAnKSB9LCAvKiB1bmNvbXByZXNzZWQgMTAtYml0IDQ6MjoyICovCisgICAgeyBBVl9DT0RFQ19JRF9WMjEwLCAgIE1LVEFHKCdiJywgJ3gnLCAneScsICcyJykgfSwgLyogQk9YWCAxMC1iaXQgNDoyOjIgKi8KKyAgICB7IEFWX0NPREVDX0lEX1YzMDgsICAgTUtUQUcoJ3YnLCAnMycsICcwJywgJzgnKSB9LCAvKiB1bmNvbXByZXNzZWQgIDgtYml0IDQ6NDo0ICovCisgICAgeyBBVl9DT0RFQ19JRF9WNDA4LCAgIE1LVEFHKCd2JywgJzQnLCAnMCcsICc4JykgfSwgLyogdW5jb21wcmVzc2VkICA4LWJpdCA0OjQ6NDo0ICovCisgICAgeyBBVl9DT0RFQ19JRF9WNDEwLCAgIE1LVEFHKCd2JywgJzQnLCAnMScsICcwJykgfSwgLyogdW5jb21wcmVzc2VkIDEwLWJpdCA0OjQ6NCAqLworICAgIHsgQVZfQ09ERUNfSURfWTQxUCwgICBNS1RBRygnWScsICc0JywgJzEnLCAnUCcpIH0sIC8qIHVuY29tcHJlc3NlZCAxMi1iaXQgNDoxOjEgKi8KICAgICB7IEFWX0NPREVDX0lEX1lVVjQsICAgTUtUQUcoJ3knLCAndScsICd2JywgJzQnKSB9LCAvKiBsaWJxdWlja3RpbWUgcGFja2VkIHl1djQyMHAgKi8KICAgICB7IEFWX0NPREVDX0lEX1RBUkdBX1kyMTYsIE1LVEFHKCdZJywgJzInLCAnMScsICc2JykgfSwKIApAQCAtMTI1LDggKzEzMCw4IEBACiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgTUtUQUcoJ1gnLCAnVicsICdJJywgJ0QnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsIE1LVEFHKCczJywgJ0knLCAnVicsICcyJykgfSwgLyogZXhwZXJpbWVudGFsOiAzSVZYIGZpbGVzIGJlZm9yZSBpdnggRDQgNC41LjEgKi8KIAotICAgIHsgQVZfQ09ERUNfSURfSDI2MywgTUtUQUcoJ2gnLCAnMicsICc2JywgJzMnKSB9LCAvKiBIMjYzICovCi0gICAgeyBBVl9DT0RFQ19JRF9IMjYzLCBNS1RBRygncycsICcyJywgJzYnLCAnMycpIH0sIC8qIEgyNjMgPz8gd29ya3MgKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjMsIE1LVEFHKCdoJywgJzInLCAnNicsICczJykgfSwgLyogSC4yNjMgKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjMsIE1LVEFHKCdzJywgJzInLCAnNicsICczJykgfSwgLyogSC4yNjMgPz8gd29ya3MgKi8KIAogICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgTUtUQUcoJ2QnLCAndicsICdjJywgJ3AnKSB9LCAvKiBEViBQQUwgKi8KICAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sIE1LVEFHKCdkJywgJ3YnLCAnYycsICcgJykgfSwgLyogRFYgTlRTQyAqLwpAQCAtMTc2LDMwICsxODEsMzUgQEAKICAgICB7IEFWX0NPREVDX0lEX0gyNjQsIE1LVEFHKCdhJywgJ2knLCAnMScsICc1JykgfSwgLyogQVZDLUludHJhIDEwME0gMTA4MGk1MCAqLwogICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ2EnLCAnaScsICcxJywgJzYnKSB9LCAvKiBBVkMtSW50cmEgMTAwTSAxMDgwaTYwICovCiAgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCBNS1RBRygnQScsICdWJywgJ2knLCAnbicpIH0sIC8qIEFWQy1JbnRyYSB3aXRoIGltcGxpY2l0IFNQUy9QUFMgKi8KLSAgICB7IEFWX0NPREVDX0lEX0gyNjQsIE1LVEFHKCdhJywgJ2knLCAndicsICd4JykgfSwgLyogWEFWQyA0OjI6MiAxMGJpdCAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ2EnLCAnaScsICd2JywgJ3gnKSB9LCAvKiBYQVZDIDEwLWJpdCA0OjI6MiAqLwogICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ3InLCAndicsICc2JywgJzQnKSB9LCAvKiBYLUNvbSBSYWR2aXNpb24gKi8KKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsIE1LVEFHKCd4JywgJ2EnLCAnbCcsICdnJykgfSwgLyogWEFWQy1MIEhENDIyIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgTUtUQUcoJ2EnLCAndicsICdsJywgJ2cnKSB9LCAvKiBQYW5hc29uaWMgUDIgQVZDLUxvbmdHICovCisKKyAgICB7IEFWX0NPREVDX0lEX1ZQOCwgIE1LVEFHKCd2JywgJ3AnLCAnMCcsICc4JykgfSwgLyogVlA4ICovCisgICAgeyBBVl9DT0RFQ19JRF9WUDksICBNS1RBRygndicsICdwJywgJzAnLCAnOScpIH0sIC8qIFZQOSAqLwogCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCBNS1RBRygnbScsICcxJywgJ3YnLCAnICcpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCBNS1RBRygnbScsICcxJywgJ3YnLCAnMScpIH0sIC8qIEFwcGxlIE1QRUctMSBDYW1jb3JkZXIgKi8KICAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sIE1LVEFHKCdtJywgJ3AnLCAnZScsICdnJykgfSwgLyogTVBFRyAqLwogICAgIHsgQVZfQ09ERUNfSURfTVBFRzFWSURFTywgTUtUQUcoJ20nLCAncCcsICcxJywgJ3YnKSB9LCAvKiBDb3JlTWVkaWEgQ01WaWRlb0NvZGVjVHlwZSAqLwogICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ20nLCAnMicsICd2JywgJzEnKSB9LCAvKiBBcHBsZSBNUEVHLTIgQ2FtY29yZGVyICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnMScpIH0sIC8qIE1QRUcyIEhEViA3MjBwMzAgKi8KLSAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICcyJykgfSwgLyogTVBFRzIgSERWIDEwODBpNjAgKi8KLSAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICczJykgfSwgLyogTVBFRzIgSERWIDEwODBpNTAgKi8KLSAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICc0JykgfSwgLyogTVBFRzIgSERWIDcyMHAyNCAqLwotICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ2gnLCAnZCcsICd2JywgJzUnKSB9LCAvKiBNUEVHMiBIRFYgNzIwcDI1ICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnNicpIH0sIC8qIE1QRUcyIEhEViAxMDgwcDI0ICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnNycpIH0sIC8qIE1QRUcyIEhEViAxMDgwcDI1ICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnOCcpIH0sIC8qIE1QRUcyIEhEViAxMDgwcDMwICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnOScpIH0sIC8qIE1QRUcyIEhEViA3MjBwNjAgSlZDICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnYScpIH0sIC8qIE1QRUcyIEhEViA3MjBwNTAgKi8KLSAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdtJywgJ3gnLCAnNScsICduJykgfSwgLyogTVBFRzIgSU1YIE5UU0MgNTI1LzYwIDUwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KLSAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdtJywgJ3gnLCAnNScsICdwJykgfSwgLyogTVBFRzIgSU1YIFBBTCA2MjUvNTAgNTBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLwotICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ20nLCAneCcsICc0JywgJ24nKSB9LCAvKiBNUEVHMiBJTVggTlRTQyA1MjUvNjAgNDBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLwotICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ20nLCAneCcsICc0JywgJ3AnKSB9LCAvKiBNUEVHMiBJTVggUEFMIDYyNS81MCA0MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnbScsICd4JywgJzMnLCAnbicpIH0sIC8qIE1QRUcyIElNWCBOVFNDIDUyNS82MCAzMG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCi0gICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnbScsICd4JywgJzMnLCAncCcpIH0sIC8qIE1QRUcyIElNWCBQQUwgNjI1LzUwIDMwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICcxJykgfSwgLyogTVBFRy0yIEhEViA3MjBwMzAgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICcyJykgfSwgLyogTVBFRy0yIEhEViAxMDgwaTYwICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnMycpIH0sIC8qIE1QRUctMiBIRFYgMTA4MGk1MCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ2gnLCAnZCcsICd2JywgJzQnKSB9LCAvKiBNUEVHLTIgSERWIDcyMHAyNCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ2gnLCAnZCcsICd2JywgJzUnKSB9LCAvKiBNUEVHLTIgSERWIDcyMHAyNSAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ2gnLCAnZCcsICd2JywgJzYnKSB9LCAvKiBNUEVHLTIgSERWIDEwODBwMjQgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICc3JykgfSwgLyogTVBFRy0yIEhEViAxMDgwcDI1ICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnaCcsICdkJywgJ3YnLCAnOCcpIH0sIC8qIE1QRUctMiBIRFYgMTA4MHAzMCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ2gnLCAnZCcsICd2JywgJzknKSB9LCAvKiBNUEVHLTIgSERWIDcyMHA2MCBKVkMgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdoJywgJ2QnLCAndicsICdhJykgfSwgLyogTVBFRy0yIEhEViA3MjBwNTAgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdtJywgJ3gnLCAnNScsICduJykgfSwgLyogTVBFRy0yIElNWCBOVFNDIDUyNS82MCA1MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnbScsICd4JywgJzUnLCAncCcpIH0sIC8qIE1QRUctMiBJTVggUEFMIDYyNS81MCA1MG1iL3MgcHJvZHVjZWQgYnkgRkNQICovCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygnbScsICd4JywgJzQnLCAnbicpIH0sIC8qIE1QRUctMiBJTVggTlRTQyA1MjUvNjAgNDBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ20nLCAneCcsICc0JywgJ3AnKSB9LCAvKiBNUEVHLTIgSU1YIFBBTCA2MjUvNTAgNDBtYi9zIHByb2R1Y2VkIGJ5IEZDUCAqLworICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ20nLCAneCcsICczJywgJ24nKSB9LCAvKiBNUEVHLTIgSU1YIE5UU0MgNTI1LzYwIDMwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCdtJywgJ3gnLCAnMycsICdwJykgfSwgLyogTVBFRy0yIElNWCBQQUwgNjI1LzUwIDMwbWIvcyBwcm9kdWNlZCBieSBGQ1AgKi8KICAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sIE1LVEFHKCd4JywgJ2QnLCAnNScsICcxJykgfSwgLyogWERDQU0gSEQ0MjIgNzIwcDMwIENCUiAqLwogICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgTUtUQUcoJ3gnLCAnZCcsICc1JywgJzQnKSB9LCAvKiBYRENBTSBIRDQyMiA3MjBwMjQgQ0JSICovCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCBNS1RBRygneCcsICdkJywgJzUnLCAnNScpIH0sIC8qIFhEQ0FNIEhENDIyIDcyMHAyNSBDQlIgKi8KQEAgLTI2NSwxMCArMjc1LDM3IEBACiAgICAgeyBBVl9DT0RFQ19JRF9IQVAsIE1LVEFHKCdIJywgJ2EnLCAncCcsICcxJykgfSwKICAgICB7IEFWX0NPREVDX0lEX0hBUCwgTUtUQUcoJ0gnLCAnYScsICdwJywgJzUnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfSEFQLCBNS1RBRygnSCcsICdhJywgJ3AnLCAnWScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IQVAsIE1LVEFHKCdIJywgJ2EnLCAncCcsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0hBUCwgTUtUQUcoJ0gnLCAnYScsICdwJywgJ00nKSB9LAogCiAgICAgeyBBVl9DT0RFQ19JRF9EWFYsIE1LVEFHKCdEJywgJ1gnLCAnRCcsICczJykgfSwKICAgICB7IEFWX0NPREVDX0lEX0RYViwgTUtUQUcoJ0QnLCAnWCcsICdEJywgJ0knKSB9LAogCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgTUtUQUcoJ00nLCAnMCcsICdSJywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFHSUNZVVYsIE1LVEFHKCdNJywgJzAnLCAnUicsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCBNS1RBRygnTScsICcwJywgJ1InLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgTUtUQUcoJ00nLCAnMCcsICdZJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFHSUNZVVYsIE1LVEFHKCdNJywgJzgnLCAnUicsICdHJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCBNS1RBRygnTScsICc4JywgJ1InLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgTUtUQUcoJ00nLCAnOCcsICdHJywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFHSUNZVVYsIE1LVEFHKCdNJywgJzgnLCAnWScsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCBNS1RBRygnTScsICc4JywgJ1knLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgTUtUQUcoJ00nLCAnOCcsICdZJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFHSUNZVVYsIE1LVEFHKCdNJywgJzgnLCAnWScsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCBNS1RBRygnTScsICcyJywgJ1InLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgTUtUQUcoJ00nLCAnMicsICdSJywgJ0cnKSB9LAorCisgICAgeyBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLCBNS1RBRygnUycsICdoJywgJ3InLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLCBNS1RBRygnUycsICdoJywgJ3InLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLCBNS1RBRygnUycsICdoJywgJ3InLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLCBNS1RBRygnUycsICdoJywgJ3InLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLCBNS1RBRygnUycsICdoJywgJ3InLCAnNCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLCBNS1RBRygnUycsICdoJywgJ3InLCAnNScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLCBNS1RBRygnUycsICdoJywgJ3InLCAnNicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TSEVFUlZJREVPLCBNS1RBRygnUycsICdoJywgJ3InLCAnNycpIH0sCisKKyAgICB7IEFWX0NPREVDX0lEX1BJWExFVCwgTUtUQUcoJ3AnLCAneCcsICdsJywgJ3QnKSB9LAorCiAgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAwIH0sCiB9OwogCkBAIC0yODMsNiArMzIwLDcgQEAKICAgICB7IEFWX0NPREVDX0lEX0RUUywgICAgICAgICAgICAgTUtUQUcoJ2QnLCAndCcsICdzJywgJ2MnKSB9LCAvKiBEVFMgZm9ybWF0cyBwcmlvciB0byBEVFMtSEQgKi8KICAgICB7IEFWX0NPREVDX0lEX0RUUywgICAgICAgICAgICAgTUtUQUcoJ2QnLCAndCcsICdzJywgJ2gnKSB9LCAvKiBEVFMtSEQgYXVkaW8gZm9ybWF0cyAqLwogICAgIHsgQVZfQ09ERUNfSURfRFRTLCAgICAgICAgICAgICBNS1RBRygnZCcsICd0JywgJ3MnLCAnbCcpIH0sIC8qIERUUy1IRCBMb3NzbGVzcyBmb3JtYXRzICovCisgICAgeyBBVl9DT0RFQ19JRF9EVFMsICAgICAgICAgICAgIE1LVEFHKCdkJywgJ3QnLCAncycsICdlJykgfSwgLyogRFRTIEV4cHJlc3MgKi8KICAgICB7IEFWX0NPREVDX0lEX0RUUywgICAgICAgICAgICAgTUtUQUcoJ0QnLCAnVCcsICdTJywgJyAnKSB9LCAvKiBub24tc3RhbmRhcmQgKi8KICAgICB7IEFWX0NPREVDX0lEX0VBQzMsICAgICAgICAgICAgTUtUQUcoJ2UnLCAnYycsICctJywgJzMnKSB9LCAvKiBFVFNJIFRTIDEwMiAzNjYgQW5uZXggRiAob25seSB2YWxpZCBpbiBJU09CTUZGKSAqLwogICAgIHsgQVZfQ09ERUNfSURfRFZBVURJTywgICAgICAgICBNS1RBRygndicsICdkJywgJ3YnLCAnYScpIH0sCkBAIC0yOTYsNiArMzM0LDcgQEAKICAgICB7IEFWX0NPREVDX0lEX01QMywgICAgICAgICAgICAgTUtUQUcoJy4nLCAnbScsICdwJywgJzMnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICAgICAgICAweDZENzMwMDU1ICAgICAgICAgICAgICAgIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSLCAgICAgIE1LVEFHKCduJywgJ20nLCAnbycsICdzJykgfSwgLyogRmxhc2ggTWVkaWEgU2VydmVyICovCisgICAgeyBBVl9DT0RFQ19JRF9ORUxMWU1PU0VSLCAgICAgIE1LVEFHKCdOJywgJ0UnLCAnTCcsICdMJykgfSwgLyogUGVyaWFuICovCiAgICAgeyBBVl9DT0RFQ19JRF9QQ01fQUxBVywgICAgICAgIE1LVEFHKCdhJywgJ2wnLCAnYScsICd3JykgfSwKICAgICB7IEFWX0NPREVDX0lEX1BDTV9GMzJCRSwgICAgICAgTUtUQUcoJ2YnLCAnbCcsICczJywgJzInKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUENNX0YzMkxFLCAgICAgICBNS1RBRygnZicsICdsJywgJzMnLCAnMicpIH0sCkBAIC0zMjAsOSArMzU5LDEwIEBACiAgICAgeyBBVl9DT0RFQ19JRF9RRE1DLCAgICAgICAgICAgIE1LVEFHKCdRJywgJ0QnLCAnTScsICdDJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1NQRUVYLCAgICAgICAgICAgTUtUQUcoJ3MnLCAncCcsICdlJywgJ3gnKSB9LCAvKiBGbGFzaCBNZWRpYSBTZXJ2ZXIgKi8KICAgICB7IEFWX0NPREVDX0lEX1NQRUVYLCAgICAgICAgICAgTUtUQUcoJ1MnLCAnUCcsICdYJywgJ04nKSB9LCAvKiBaeWdvQXVkaW8gKHF1YWxpdHkgMTAgbW9kZSkgKi8KLSAgICB7IEFWX0NPREVDX0lEX1dNQVYyLCAgICAgICAgICAgTUtUQUcoJ1cnLCAnTScsICdBJywgJzInKSB9LAogICAgIHsgQVZfQ09ERUNfSURfRVZSQywgICAgICAgICAgICBNS1RBRygncycsICdlJywgJ3YnLCAnYycpIH0sIC8qIDNHUFAyICovCiAgICAgeyBBVl9DT0RFQ19JRF9TTVYsICAgICAgICAgICAgIE1LVEFHKCdzJywgJ3MnLCAnbScsICd2JykgfSwgLyogM0dQUDIgKi8KKyAgICB7IEFWX0NPREVDX0lEX0ZMQUMsICAgICAgICAgICAgTUtUQUcoJ2YnLCAnTCcsICdhJywgJ0MnKSB9LCAvKiBub25zdGFuZGFyZCAqLworICAgIHsgQVZfQ09ERUNfSURfT1BVUywgICAgICAgICAgICBNS1RBRygnTycsICdwJywgJ3UnLCAncycpIH0sIC8qIG1wNHJhLm9yZyAqLwogICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAogfTsKIApAQCAtMzM2LDcgKzM3Niw3IEBACiAvKiBtYXAgbnVtZXJpYyBjb2RlcyBmcm9tIG1kaGQgYXRvbSB0byBJU08gNjM5ICovCiAvKiBjZi4gUVRGaWxlRm9ybWF0LnBkZiBwMjUzLCBxdGZmLnBkZiBwMjA1ICovCiAvKiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL21hYy9UZXh0L1RleHQtMzY4Lmh0bWwgKi8KLS8qIGRlcHJlY2F0ZWQgYnkgcHV0dGluZyB0aGUgY29kZSBhcyAzKjViaXQgYXNjaWkgKi8KKy8qIGRlcHJlY2F0ZWQgYnkgcHV0dGluZyB0aGUgY29kZSBhcyAzKjUgYml0cyBBU0NJSSAqLwogc3RhdGljIGNvbnN0IGNoYXIgbW92X21kaGRfbGFuZ3VhZ2VfbWFwW11bNF0gPSB7CiAgICAgLyogMC05ICovCiAgICAgImVuZyIsICJmcmEiLCAiZ2VyIiwgIml0YSIsICJkdXQiLCAic3ZlIiwgInNwYSIsICJkYW4iLCAicG9yIiwgIm5vciIsCkBAIC0zNzQsNyArNDE0LDcgQEAKICAgICAvKiBoYW5kbGUgdW5kZWZpbmVkIGFzIHN1Y2ggKi8KICAgICBpZiAobGFuZ1swXSA9PSAnXDAnKQogICAgICAgICBsYW5nID0gInVuZCI7Ci0gICAgLyogNWJpdCBhc2NpaSAqLworICAgIC8qIDUgYml0cyBBU0NJSSAqLwogICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICAgdWludDhfdCBjID0gbGFuZ1tpXTsKICAgICAgICAgYyAtPSAweDYwOwpAQCAtNDI2LDcgKzQ2Niw3IEBACiAgICAgaW50IGxlbjsKICAgICAqdGFnID0gYXZpb19yOChwYik7CiAgICAgbGVuID0gZmZfbXA0X3JlYWRfZGVzY3JfbGVuKHBiKTsKLSAgICBhdl9sb2coZmMsIEFWX0xPR19UUkFDRSwgIk1QRUc0IGRlc2NyaXB0aW9uOiB0YWc9MHglMDJ4IGxlbj0lZFxuIiwgKnRhZywgbGVuKTsKKyAgICBhdl9sb2coZmMsIEFWX0xPR19UUkFDRSwgIk1QRUctNCBkZXNjcmlwdGlvbjogdGFnPTB4JTAyeCBsZW49JWRcbiIsICp0YWcsIGxlbik7CiAgICAgcmV0dXJuIGxlbjsKIH0KIApAQCAtNDY1LDQ3ICs1MDUsNDkgQEAKICAgICBhdmlvX3I4KHBiKTsgLyogc3RyZWFtIHR5cGUgKi8KICAgICBhdmlvX3JiMjQocGIpOyAvKiBidWZmZXIgc2l6ZSBkYiAqLwogCi0gICAgaWYoYXZjb2RlY19pc19vcGVuKHN0LT5jb2RlYykpIHsKLSAgICAgICAgYXZfbG9nKGZjLCBBVl9MT0dfREVCVUcsICJjb2RlYyBvcGVuIGluIHJlYWRfZGVjX2NvbmZpZ19kZXNjclxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KICAgICB2ID0gYXZpb19yYjMyKHBiKTsKKworICAgIC8vIFRPRE86IGZpeCB0aGlzIHdpdGggY29kZWNwYXIKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIGlmICh2IDwgSU5UMzJfTUFYKQogICAgICAgICBzdC0+Y29kZWMtPnJjX21heF9yYXRlID0gdjsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCiAKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gYXZpb19yYjMyKHBiKTsgLyogYXZnIGJpdHJhdGUgKi8KKyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gYXZpb19yYjMyKHBiKTsgLyogYXZnIGJpdHJhdGUgKi8KIAogICAgIGNvZGVjX2lkPSBmZl9jb2RlY19nZXRfaWQoZmZfbXA0X29ial90eXBlLCBvYmplY3RfdHlwZV9pZCk7CiAgICAgaWYgKGNvZGVjX2lkKQotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkPSBjb2RlY19pZDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGNvZGVjX2lkOwogICAgIGF2X2xvZyhmYywgQVZfTE9HX1RSQUNFLCAiZXNkcyBvYmplY3QgdHlwZSBpZCAweCUwMnhcbiIsIG9iamVjdF90eXBlX2lkKTsKICAgICBsZW4gPSBmZl9tcDRfcmVhZF9kZXNjcihmYywgcGIsICZ0YWcpOwogICAgIGlmICh0YWcgPT0gTVA0RGVjU3BlY2lmaWNEZXNjclRhZykgewotICAgICAgICBhdl9sb2coZmMsIEFWX0xPR19UUkFDRSwgIlNwZWNpZmljIE1QRUc0IGhlYWRlciBsZW49JWRcbiIsIGxlbik7CisgICAgICAgIGF2X2xvZyhmYywgQVZfTE9HX1RSQUNFLCAiU3BlY2lmaWMgTVBFRy00IGhlYWRlciBsZW49JWRcbiIsIGxlbik7CiAgICAgICAgIGlmICghbGVuIHx8ICh1aW50NjRfdClsZW4gPiAoMTw8MzApKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBhdl9mcmVlKHN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGxlbikpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBpZiAoKHJldCA9IGZmX2dldF9leHRyYWRhdGEoZmMsIHN0LT5jb2RlY3BhciwgcGIsIGxlbikpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKICAgICAgICAgICAgIE1QRUc0QXVkaW9Db25maWcgY2ZnID0gezB9OwotICAgICAgICAgICAgYXZwcml2X21wZWc0YXVkaW9fZ2V0X2NvbmZpZygmY2ZnLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAqIDgsIDEpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGNmZy5jaGFubmVsczsKKyAgICAgICAgICAgIHJldCA9IGF2cHJpdl9tcGVnNGF1ZGlvX2dldF9jb25maWcoJmNmZywgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKiA4LCAxKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gY2ZnLmNoYW5uZWxzOwogICAgICAgICAgICAgaWYgKGNmZy5vYmplY3RfdHlwZSA9PSAyOSAmJiBjZmcuc2FtcGxpbmdfaW5kZXggPCAzKSAvLyBvbGQgbXAzb240Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2cHJpdl9tcGFfZnJlcV90YWJbY2ZnLnNhbXBsaW5nX2luZGV4XTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZwcml2X21wYV9mcmVxX3RhYltjZmcuc2FtcGxpbmdfaW5kZXhdOwogICAgICAgICAgICAgZWxzZSBpZiAoY2ZnLmV4dF9zYW1wbGVfcmF0ZSkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gY2ZnLmV4dF9zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gY2ZnLmV4dF9zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gY2ZnLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBjZmcuc2FtcGxlX3JhdGU7CiAgICAgICAgICAgICBhdl9sb2coZmMsIEFWX0xPR19UUkFDRSwgIm1wNGEgY29uZmlnIGNoYW5uZWxzICVkIG9iaiAlZCBleHQgb2JqICVkICIKLSAgICAgICAgICAgICAgICAgICAgInNhbXBsZSByYXRlICVkIGV4dCBzYW1wbGUgcmF0ZSAlZFxuIiwgc3QtPmNvZGVjLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgInNhbXBsZSByYXRlICVkIGV4dCBzYW1wbGUgcmF0ZSAlZFxuIiwgc3QtPmNvZGVjcGFyLT5jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgY2ZnLm9iamVjdF90eXBlLCBjZmcuZXh0X29iamVjdF90eXBlLAogICAgICAgICAgICAgICAgICAgICBjZmcuc2FtcGxlX3JhdGUsIGNmZy5leHRfc2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgaWYgKCEoc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChtcDRfYXVkaW9fdHlwZXMsCisgICAgICAgICAgICBpZiAoIShzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKG1wNF9hdWRpb190eXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ZnLm9iamVjdF90eXBlKSkpCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FBQzsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQUFDOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaXNvbS5oIGIvbGliYXZmb3JtYXQvaXNvbS5oCmluZGV4IDk5YmM3YmUuLjBmODFiZWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2lzb20uaAorKysgYi9saWJhdmZvcm1hdC9pc29tLmgKQEAgLTI0LDYgKzI0LDEzIEBACiAjaWZuZGVmIEFWRk9STUFUX0lTT01fSAogI2RlZmluZSBBVkZPUk1BVF9JU09NX0gKIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NwaGVyaWNhbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zdGVyZW8zZC5oIgorCiAjaW5jbHVkZSAiYXZpby5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiZHYuaCIKQEAgLTQ1LDcgKzUyLDcgQEAKICAqLwogCiB0eXBlZGVmIHN0cnVjdCBNT1ZTdHRzIHsKLSAgICBpbnQgY291bnQ7CisgICAgdW5zaWduZWQgaW50IGNvdW50OwogICAgIGludCBkdXJhdGlvbjsKIH0gTU9WU3R0czsKIApAQCAtNzgsNiArODUsNyBAQAogc3RydWN0IE1PVlBhcnNlVGFibGVFbnRyeTsKIAogdHlwZWRlZiBzdHJ1Y3QgTU9WRnJhZ21lbnQgeworICAgIGludCBmb3VuZF90ZmhkOwogICAgIHVuc2lnbmVkIHRyYWNrX2lkOwogICAgIHVpbnQ2NF90IGJhc2VfZGF0YV9vZmZzZXQ7CiAgICAgdWludDY0X3QgbW9vZl9vZmZzZXQ7CkBAIC04Niw3ICs5NCw2IEBACiAgICAgdW5zaWduZWQgZHVyYXRpb247CiAgICAgdW5zaWduZWQgc2l6ZTsKICAgICB1bnNpZ25lZCBmbGFnczsKLSAgICBpbnQ2NF90IHRpbWU7CiB9IE1PVkZyYWdtZW50OwogCiB0eXBlZGVmIHN0cnVjdCBNT1ZUcmFja0V4dCB7CkBAIC0xMDIsMTkgKzEwOSwzNSBAQAogICAgIHVuc2lnbmVkIGludCBpbmRleDsKIH0gTU9WU2JncDsKIAordHlwZWRlZiBzdHJ1Y3QgTU9WRnJhZ21lbnRTdHJlYW1JbmZvIHsKKyAgICBpbnQgaWQ7CisgICAgaW50NjRfdCBzaWR4X3B0czsKKyAgICBpbnQ2NF90IGZpcnN0X3RmcmFfcHRzOworICAgIGludDY0X3QgdGZkdF9kdHM7CisgICAgaW50IGluZGV4X2VudHJ5OworfSBNT1ZGcmFnbWVudFN0cmVhbUluZm87CisKIHR5cGVkZWYgc3RydWN0IE1PVkZyYWdtZW50SW5kZXhJdGVtIHsKICAgICBpbnQ2NF90IG1vb2Zfb2Zmc2V0OwotICAgIGludDY0X3QgdGltZTsKICAgICBpbnQgaGVhZGVyc19yZWFkOworICAgIGludCBjdXJyZW50OworICAgIGludCBuYl9zdHJlYW1faW5mbzsKKyAgICBNT1ZGcmFnbWVudFN0cmVhbUluZm8gKiBzdHJlYW1faW5mbzsKIH0gTU9WRnJhZ21lbnRJbmRleEl0ZW07CiAKIHR5cGVkZWYgc3RydWN0IE1PVkZyYWdtZW50SW5kZXggewotICAgIHVuc2lnbmVkIHRyYWNrX2lkOwotICAgIHVuc2lnbmVkIGl0ZW1fY291bnQ7Ci0gICAgdW5zaWduZWQgY3VycmVudF9pdGVtOwotICAgIE1PVkZyYWdtZW50SW5kZXhJdGVtICppdGVtczsKKyAgICBpbnQgYWxsb2NhdGVkX3NpemU7CisgICAgaW50IGNvbXBsZXRlOworICAgIGludCBjdXJyZW50OworICAgIGludCBuYl9pdGVtczsKKyAgICBNT1ZGcmFnbWVudEluZGV4SXRlbSAqIGl0ZW07CiB9IE1PVkZyYWdtZW50SW5kZXg7CiAKK3R5cGVkZWYgc3RydWN0IE1PVkluZGV4UmFuZ2UgeworICAgIGludDY0X3Qgc3RhcnQ7CisgICAgaW50NjRfdCBlbmQ7Cit9IE1PVkluZGV4UmFuZ2U7CisKIHR5cGVkZWYgc3RydWN0IE1PVlN0cmVhbUNvbnRleHQgewogICAgIEFWSU9Db250ZXh0ICpwYjsKICAgICBpbnQgcGJfaXNfY29waWVkOwpAQCAtMTI1LDkgKzE0OCwxMiBAQAogICAgIHVuc2lnbmVkIGludCBzdHRzX2NvdW50OwogICAgIE1PVlN0dHMgKnN0dHNfZGF0YTsKICAgICB1bnNpZ25lZCBpbnQgY3R0c19jb3VudDsKKyAgICB1bnNpZ25lZCBpbnQgY3R0c19hbGxvY2F0ZWRfc2l6ZTsKICAgICBNT1ZTdHRzICpjdHRzX2RhdGE7CiAgICAgdW5zaWduZWQgaW50IHN0c2NfY291bnQ7CiAgICAgTU9WU3RzYyAqc3RzY19kYXRhOworICAgIHVuc2lnbmVkIGludCBzdHNjX2luZGV4OworICAgIGludCBzdHNjX3NhbXBsZTsKICAgICB1bnNpZ25lZCBpbnQgc3Rwc19jb3VudDsKICAgICB1bnNpZ25lZCAqc3Rwc19kYXRhOyAgLy8vPCBwYXJ0aWFsIHN5bmMgc2FtcGxlIGZvciBtcGVnLTIgb3BlbiBnb3AKICAgICBNT1ZFbHN0ICplbHN0X2RhdGE7CkBAIC0xNDMsNyArMTY5LDExIEBACiAgICAgaW50ICprZXlmcmFtZXM7CiAgICAgaW50IHRpbWVfc2NhbGU7CiAgICAgaW50NjRfdCB0aW1lX29mZnNldDsgIC8vLzwgdGltZSBvZmZzZXQgb2YgdGhlIGVkaXQgbGlzdCBlbnRyaWVzCisgICAgaW50NjRfdCBtaW5fY29ycmVjdGVkX3B0czsgIC8vLzwgbWluaW11bSBDb21wb3NpdGlvbiB0aW1lIHNob3duIGJ5IHRoZSBlZGl0cyBleGNsdWRpbmcgZW1wdHkgZWRpdHMuCiAgICAgaW50IGN1cnJlbnRfc2FtcGxlOworICAgIGludDY0X3QgY3VycmVudF9pbmRleDsKKyAgICBNT1ZJbmRleFJhbmdlKiBpbmRleF9yYW5nZXM7CisgICAgTU9WSW5kZXhSYW5nZSogY3VycmVudF9pbmRleF9yYW5nZTsKICAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfcGVyX2ZyYW1lOwogICAgIHVuc2lnbmVkIGludCBzYW1wbGVzX3Blcl9mcmFtZTsKICAgICBpbnQgZHZfYXVkaW9fY29udGFpbmVyOwpAQCAtMTUzLDcgKzE4Myw2IEBACiAgICAgTU9WRHJlZiAqZHJlZnM7CiAgICAgaW50IGRyZWZfaWQ7CiAgICAgaW50IHRpbWVjb2RlX3RyYWNrOwotICAgIGludCB3cm9uZ19kdHM7ICAgICAgICAvLy88IGR0cyBhcmUgd3JvbmcgZHVlIHRvIGh1Z2UgY3R0cyBvZmZzZXQgKGlNb3ZpZSBmaWxlcykKICAgICBpbnQgd2lkdGg7ICAgICAgICAgICAgLy8vPCB0a2hkIHdpZHRoCiAgICAgaW50IGhlaWdodDsgICAgICAgICAgIC8vLzwgdGtoZCBoZWlnaHQKICAgICBpbnQgZHRzX3NoaWZ0OyAgICAgICAgLy8vPCBkdHMgc2hpZnQgd2hlbiBjdHRzIGlzIG5lZ2F0aXZlCkBAIC0xNjksMTQgKzE5OCwzMiBAQAogICAgIGludCBuYl9mcmFtZXNfZm9yX2ZwczsKICAgICBpbnQ2NF90IGR1cmF0aW9uX2Zvcl9mcHM7CiAKKyAgICAvKiogZXh0cmFkYXRhIGFycmF5IChhbmQgc2l6ZSkgZm9yIG11bHRpcGxlIHN0c2QgKi8KKyAgICB1aW50OF90ICoqZXh0cmFkYXRhOworICAgIGludCAqZXh0cmFkYXRhX3NpemU7CisgICAgaW50IGxhc3Rfc3RzZF9pbmRleDsKKyAgICBpbnQgc3RzZF9jb3VudDsKKwogICAgIGludDMyX3QgKmRpc3BsYXlfbWF0cml4OworICAgIEFWU3RlcmVvM0QgKnN0ZXJlbzNkOworICAgIEFWU3BoZXJpY2FsTWFwcGluZyAqc3BoZXJpY2FsOworICAgIHNpemVfdCBzcGhlcmljYWxfc2l6ZTsKKyAgICBBVk1hc3RlcmluZ0Rpc3BsYXlNZXRhZGF0YSAqbWFzdGVyaW5nOworICAgIEFWQ29udGVudExpZ2h0TWV0YWRhdGEgKmNvbGw7CisgICAgc2l6ZV90IGNvbGxfc2l6ZTsKKwogICAgIHVpbnQzMl90IGZvcm1hdDsKIAorICAgIGludCBoYXNfc2lkeDsgIC8vIElmIHRoZXJlIGlzIGFuIHNpZHggZW50cnkgZm9yIHRoaXMgc3RyZWFtLgogICAgIHN0cnVjdCB7CiAgICAgICAgIGludCB1c2Vfc3Vic2FtcGxlczsKICAgICAgICAgdWludDhfdCogYXV4aWxpYXJ5X2luZm87CiAgICAgICAgIHVpbnQ4X3QqIGF1eGlsaWFyeV9pbmZvX2VuZDsKICAgICAgICAgdWludDhfdCogYXV4aWxpYXJ5X2luZm9fcG9zOworICAgICAgICB1aW50OF90IGF1eGlsaWFyeV9pbmZvX2RlZmF1bHRfc2l6ZTsKKyAgICAgICAgdWludDhfdCogYXV4aWxpYXJ5X2luZm9fc2l6ZXM7CisgICAgICAgIHNpemVfdCBhdXhpbGlhcnlfaW5mb19zaXplc19jb3VudDsKKyAgICAgICAgaW50NjRfdCBhdXhpbGlhcnlfaW5mb19pbmRleDsKICAgICAgICAgc3RydWN0IEFWQUVTQ1RSKiBhZXNfY3RyOwogICAgIH0gY2VuYzsKIH0gTU9WU3RyZWFtQ29udGV4dDsKQEAgLTIwMCw5ICsyNDcsMTEgQEAKICAgICB1bnNpZ25lZCB0cmV4X2NvdW50OwogICAgIGludCBpdHVuZXNfbWV0YWRhdGE7ICAvLy88IG1ldGFkYXRhIGFyZSBpdHVuZXMgc3R5bGUKICAgICBpbnQgaGFuZGJyYWtlX3ZlcnNpb247Ci0gICAgaW50IGNoYXB0ZXJfdHJhY2s7CisgICAgaW50ICpjaGFwdGVyX3RyYWNrczsKKyAgICB1bnNpZ25lZCBpbnQgbmJfY2hhcHRlcl90cmFja3M7CiAgICAgaW50IHVzZV9hYnNvbHV0ZV9wYXRoOwogICAgIGludCBpZ25vcmVfZWRpdGxpc3Q7CisgICAgaW50IGFkdmFuY2VkX2VkaXRsaXN0OwogICAgIGludCBpZ25vcmVfY2hhcHRlcnM7CiAgICAgaW50IHNlZWtfaW5kaXZpZHVhbGx5OwogICAgIGludDY0X3QgbmV4dF9yb290X2F0b207IC8vLzwgb2Zmc2V0IG9mIHRoZSBuZXh0IHJvb3QgYXRvbQpAQCAtMjEzLDkgKzI2Miw3IEBACiAgICAgaW50IG1vb3ZfcmV0cnk7CiAgICAgaW50IHVzZV9tZnJhX2ZvcjsKICAgICBpbnQgaGFzX2xvb2tlZF9mb3JfbWZyYTsKLSAgICBNT1ZGcmFnbWVudEluZGV4KiogZnJhZ21lbnRfaW5kZXhfZGF0YTsKLSAgICB1bnNpZ25lZCBmcmFnbWVudF9pbmRleF9jb3VudDsKLSAgICBpbnQgZnJhZ21lbnRfaW5kZXhfY29tcGxldGU7CisgICAgTU9WRnJhZ21lbnRJbmRleCBmcmFnX2luZGV4OwogICAgIGludCBhdG9tX2RlcHRoOwogICAgIHVuc2lnbmVkIGludCBhYXhfbW9kZTsgIC8vLzwgJ2FheCcgZmlsZSBoYXMgYmVlbiBkZXRlY3RlZAogICAgIHVpbnQ4X3QgZmlsZV9rZXlbMjBdOwpAQCAtMjI4LDYgKzI3NSw3IEBACiAgICAgdWludDhfdCAqZGVjcnlwdGlvbl9rZXk7CiAgICAgaW50IGRlY3J5cHRpb25fa2V5X2xlbjsKICAgICBpbnQgZW5hYmxlX2RyZWZzOworICAgIGludDMyX3QgbW92aWVfZGlzcGxheV9tYXRyaXhbM11bM107IC8vLzwgZGlzcGxheSBtYXRyaXggZnJvbSBtdmhkCiB9IE1PVkNvbnRleHQ7CiAKIGludCBmZl9tcDRfcmVhZF9kZXNjcl9sZW4oQVZJT0NvbnRleHQgKnBiKTsKQEAgLTI3Miw2ICszMjAsMTEgQEAKICNkZWZpbmUgTU9WX1RLSERfRkxBR19JTl9QUkVWSUVXICAgIDB4MDAwNAogI2RlZmluZSBNT1ZfVEtIRF9GTEFHX0lOX1BPU1RFUiAgICAgMHgwMDA4CiAKKyNkZWZpbmUgTU9WX1NBTVBMRV9ERVBFTkRFTkNZX1VOS05PV04gMHgwCisjZGVmaW5lIE1PVl9TQU1QTEVfREVQRU5ERU5DWV9ZRVMgICAgIDB4MQorI2RlZmluZSBNT1ZfU0FNUExFX0RFUEVOREVOQ1lfTk8gICAgICAweDIKKworCiAjZGVmaW5lIFRBR19JU19BVkNJKHRhZykgICAgICAgICAgICAgICAgICAgIFwKICAgICAoKHRhZykgPT0gTUtUQUcoJ2EnLCAnaScsICc1JywgJ3AnKSB8fCAgXAogICAgICAodGFnKSA9PSBNS1RBRygnYScsICdpJywgJzUnLCAncScpIHx8ICBcCkBAIC0yOTAsNyArMzQzLDYgQEAKIAogCiBpbnQgZmZfbW92X3JlYWRfZXNkcyhBVkZvcm1hdENvbnRleHQgKmZjLCBBVklPQ29udGV4dCAqcGIpOwotZW51bSBBVkNvZGVjSUQgZmZfbW92X2dldF9scGNtX2NvZGVjX2lkKGludCBicHMsIGludCBmbGFncyk7CiAKIGludCBmZl9tb3ZfcmVhZF9zdHNkX2VudHJpZXMoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBpbnQgZW50cmllcyk7CiB2b2lkIGZmX21vdl93cml0ZV9jaGFuKEFWSU9Db250ZXh0ICpwYiwgaW50NjRfdCBjaGFubmVsX2xheW91dCk7CkBAIC0yOTksNCArMzUxLDE4IEBACiAjZGVmaW5lIEZGX01PVl9GTEFHX01GUkFfRFRTIDEKICNkZWZpbmUgRkZfTU9WX0ZMQUdfTUZSQV9QVFMgMgogCisvKioKKyAqIENvbXB1dGUgY29kZWMgaWQgZm9yICdscGNtJyB0YWcuCisgKiBTZWUgQ29yZUF1ZGlvVHlwZXMgYW5kIEF1ZGlvU3RyZWFtQmFzaWNEZXNjcmlwdGlvbiBhdCBBcHBsZS4KKyAqLworc3RhdGljIGlubGluZSBlbnVtIEFWQ29kZWNJRCBmZl9tb3ZfZ2V0X2xwY21fY29kZWNfaWQoaW50IGJwcywgaW50IGZsYWdzKQoreworICAgIC8qIGxwY20gZmxhZ3M6CisgICAgICogMHgxID0gZmxvYXQKKyAgICAgKiAweDIgPSBiaWctZW5kaWFuCisgICAgICogMHg0ID0gc2lnbmVkCisgICAgICovCisgICAgcmV0dXJuIGZmX2dldF9wY21fY29kZWNfaWQoYnBzLCBmbGFncyAmIDEsIGZsYWdzICYgMiwgZmxhZ3MgJiA0ID8gLTEgOiAwKTsKK30KKwogI2VuZGlmIC8qIEFWRk9STUFUX0lTT01fSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaXNzLmMgYi9saWJhdmZvcm1hdC9pc3MuYwppbmRleCBmYmRlNTA1Li45NWIzNWRjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9pc3MuYworKysgYi9saWJhdmZvcm1hdC9pc3MuYwpAQCAtMTA3LDIzICsxMDcsMjMgQEAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9JU1M7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfSVNTOwogICAgIGlmIChzdGVyZW8pIHsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDI7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKICAgICB9Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA0NDEwMDsKICAgICBpZihyYXRlX2Rpdmlzb3IgPiAwKQotICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAvPSByYXRlX2Rpdmlzb3I7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OwotICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBpc3MtPnBhY2tldF9zaXplOwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgLz0gcmF0ZV9kaXZpc29yOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gNDsKKyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gaXNzLT5wYWNrZXRfc2l6ZTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTEzOCw4ICsxMzgsOCBAQAogCiAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOwogICAgIHBrdC0+cHRzID0gYXZpb190ZWxsKHMtPnBiKSAtIGlzcy0+c2FtcGxlX3N0YXJ0X3BvczsKLSAgICBpZihzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y2hhbm5lbHMgPiAwKQotICAgICAgICBwa3QtPnB0cyAvPSBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y2hhbm5lbHMqMjsKKyAgICBpZihzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y2hhbm5lbHMgPiAwKQorICAgICAgICBwa3QtPnB0cyAvPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y2hhbm5lbHMqMjsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaXY4LmMgYi9saWJhdmZvcm1hdC9pdjguYwppbmRleCBmMWUzNTFjLi4wNzdkOTA1IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9pdjguYworKysgYi9saWJhdmZvcm1hdC9pdjguYwpAQCAtNDUsOCArNDUsOCBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QRUc0OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVBFRzQ7CiAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDkwMDAwKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvaXZmZGVjLmMgYi9saWJhdmZvcm1hdC9pdmZkZWMuYwppbmRleCBjMGZkYWZiLi4xOTdjMDk5IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9pdmZkZWMuYworKysgYi9saWJhdmZvcm1hdC9pdmZkZWMuYwpAQCAtNDYsMTEgKzQ2LDExIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBhdmlvX3JsMzIocy0+cGIpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgc3QtPmNvZGVjLT5jb2RlY190YWcpOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2aW9fcmwxNihzLT5wYik7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gYXZpb19ybDE2KHMtPnBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKTsKKyAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSBhdmlvX3JsMTYocy0+cGIpOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IGF2aW9fcmwxNihzLT5wYik7CiAgICAgdGltZV9iYXNlLmRlbiAgICAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKICAgICB0aW1lX2Jhc2UubnVtICAgICAgICAgPSBhdmlvX3JsMzIocy0+cGIpOwogICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICA9IGF2aW9fcmw2NChzLT5wYik7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9pdmZlbmMuYyBiL2xpYmF2Zm9ybWF0L2l2ZmVuYy5jCmluZGV4IDQ4NGQ4N2QuLmFmODAzZDUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2l2ZmVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2l2ZmVuYy5jCkBAIC0xOCw2ICsxOCw3IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KICNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogCiB0eXBlZGVmIHN0cnVjdCBJVkZFbmNDb250ZXh0IHsKQEAgLTI3LDI1ICsyOCwyOSBAQAogCiBzdGF0aWMgaW50IGl2Zl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjdHg7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKIAogICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZvcm1hdCBzdXBwb3J0cyBvbmx5IGV4YWN0bHkgb25lIHZpZGVvIHN0cmVhbVxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQotICAgIGN0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOwotICAgIGlmIChjdHgtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8Ci0gICAgICAgICEoY3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDggfHwgY3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDdXJyZW50bHkgb25seSBWUDggYW5kIFZQOSBhcmUgc3VwcG9ydGVkIVxuIik7CisgICAgcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisgICAgaWYgKHBhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgIShwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FWMSB8fAorICAgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4IHx8CisgICAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDdXJyZW50bHkgb25seSBWUDgsIFZQOSBhbmQgQVYxIGFyZSBzdXBwb3J0ZWQhXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAgICAgYXZpb193cml0ZShwYiwgIkRLSUYiLCA0KTsKICAgICBhdmlvX3dsMTYocGIsIDApOyAvLyB2ZXJzaW9uCiAgICAgYXZpb193bDE2KHBiLCAzMik7IC8vIGhlYWRlciBsZW5ndGgKLSAgICBhdmlvX3dsMzIocGIsIGN0eC0+Y29kZWNfdGFnID8gY3R4LT5jb2RlY190YWcgOiBjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOSA/IEFWX1JMMzIoIlZQOTAiKSA6IEFWX1JMMzIoIlZQODAiKSk7Ci0gICAgYXZpb193bDE2KHBiLCBjdHgtPndpZHRoKTsKLSAgICBhdmlvX3dsMTYocGIsIGN0eC0+aGVpZ2h0KTsKKyAgICBhdmlvX3dsMzIocGIsIHBhci0+Y29kZWNfdGFnID8gcGFyLT5jb2RlY190YWcgOgorICAgICAgICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOSA/IEFWX1JMMzIoIlZQOTAiKSA6CisgICAgICAgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4ID8gQVZfUkwzMigiVlA4MCIpIDogQVZfUkwzMigiQVYwMSIpKTsKKyAgICBhdmlvX3dsMTYocGIsIHBhci0+d2lkdGgpOworICAgIGF2aW9fd2wxNihwYiwgcGFyLT5oZWlnaHQpOwogICAgIGF2aW9fd2wzMihwYiwgcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlLmRlbik7CiAgICAgYXZpb193bDMyKHBiLCBzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UubnVtKTsKICAgICBhdmlvX3dsNjQocGIsIDB4RkZGRkZGRkZGRkZGRkZGRlVMTCk7CkBAIC03NCw3ICs3OSw3IEBACiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgSVZGRW5jQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOwogCi0gICAgaWYgKHBiLT5zZWVrYWJsZSAmJiBjdHgtPmZyYW1lX2NudCA+IDEpIHsKKyAgICBpZiAoKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJiBjdHgtPmZyYW1lX2NudCA+IDEpIHsKICAgICAgICAgc2l6ZV90IGVuZCA9IGF2aW9fdGVsbChwYik7CiAKICAgICAgICAgYXZpb19zZWVrKHBiLCAyNCwgU0VFS19TRVQpOwpAQCAtODUsNiArOTAsMjQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpdmZfY2hlY2tfYml0c3RyZWFtKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCA9IDE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpCisgICAgICAgIHJldCA9IGZmX3N0cmVhbV9hZGRfYml0c3RyZWFtX2ZpbHRlcihzdCwgInZwOV9zdXBlcmZyYW1lIiwgTlVMTCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBjb2RlY19pdmZfdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfVlA4LCAgTUtUQUcoJ1YnLCAnUCcsICc4JywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA5LCAgTUtUQUcoJ1YnLCAnUCcsICc5JywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQVYxLCAgTUtUQUcoJ0EnLCAnVicsICcwJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9Cit9OworCiBBVk91dHB1dEZvcm1hdCBmZl9pdmZfbXV4ZXIgPSB7CiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKElWRkVuY0NvbnRleHQpLAogICAgIC5uYW1lICAgICAgICAgPSAiaXZmIiwKQEAgLTk1LDQgKzExOCw2IEBACiAgICAgLndyaXRlX2hlYWRlciA9IGl2Zl93cml0ZV9oZWFkZXIsCiAgICAgLndyaXRlX3BhY2tldCA9IGl2Zl93cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgPSBpdmZfd3JpdGVfdHJhaWxlciwKKyAgICAuY2hlY2tfYml0c3RyZWFtID0gaXZmX2NoZWNrX2JpdHN0cmVhbSwKKyAgICAuY29kZWNfdGFnICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgY29kZWNfaXZmX3RhZ3MsIDAgfSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9qYWNvc3ViZGVjLmMgYi9saWJhdmZvcm1hdC9qYWNvc3ViZGVjLmMKaW5kZXggMDQzNmE5My4uNTIwYzQzNSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvamFjb3N1YmRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2phY29zdWJkZWMuYwpAQCAtMTY3LDggKzE2Nyw4IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfSkFDT1NVQjsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfSkFDT1NVQjsKIAogICAgIGphY29zdWItPnRpbWVyZXMgPSAzMDsKIApAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgfQogCiAgICAgLyogZ2VuZXJhbC9lc3NlbnRpYWwgZGlyZWN0aXZlcyBpbiB0aGUgZXh0cmFkYXRhICovCi0gICAgcmV0ID0gYXZwcml2X2JwcmludF90b19leHRyYWRhdGEoc3QtPmNvZGVjLCAmaGVhZGVyKTsKKyAgICByZXQgPSBmZl9icHJpbnRfdG9fY29kZWNwYXJfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgJmhlYWRlcik7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIGdvdG8gZmFpbDsKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvamFjb3N1YmVuYy5jIGIvbGliYXZmb3JtYXQvamFjb3N1YmVuYy5jCmluZGV4IGExMWU0NWEuLjA5NTRmNWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2phY29zdWJlbmMuYworKysgYi9saWJhdmZvcm1hdC9qYWNvc3ViZW5jLmMKQEAgLTIxLDEwICsyMSwxMCBAQAogCiBzdGF0aWMgaW50IGphY29zdWJfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKLSAgICBjb25zdCBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBjb25zdCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAKLSAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplKSB7Ci0gICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIGF2Y3R4LT5leHRyYWRhdGEsIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSAtIDEpOworICAgIGlmIChwYXItPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplIC0gMSk7CiAgICAgICAgIGF2aW9fZmx1c2gocy0+cGIpOwogICAgIH0KICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2p2ZGVjLmMgYi9saWJhdmZvcm1hdC9qdmRlYy5jCmluZGV4IGEzMWM3MjMuLmIyYzA2N2YgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2p2ZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvanZkZWMuYwpAQCAtODUsMTEgKzg1LDExIEBACiAgICAgaWYgKCFhc3QgfHwgIXZzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfSlY7Ci0gICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSAwOyAvKiBubyBmb3VyY2MgKi8KLSAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgICA9IGF2aW9fcmwxNihwYik7Ci0gICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfSlY7CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgPSAwOyAvKiBubyBmb3VyY2MgKi8KKyAgICB2c3QtPmNvZGVjcGFyLT53aWR0aCAgICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICAgPSBhdmlvX3JsMTYocGIpOwogICAgIHZzdC0+ZHVyYXRpb24gICAgICAgICAgID0KICAgICB2c3QtPm5iX2ZyYW1lcyAgICAgICAgICA9CiAgICAgYXN0LT5uYl9pbmRleF9lbnRyaWVzICAgPSBhdmlvX3JsMTYocGIpOwpAQCAtOTcsMTMgKzk3LDEzIEBACiAKICAgICBhdmlvX3NraXAocGIsIDQpOwogCi0gICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7Ci0gICAgYXN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgPSAwOyAvKiBubyBmb3VyY2MgKi8KLSAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICA9IGF2aW9fcmwxNihwYik7Ci0gICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAxOwotICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDY0LCAxLCBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgICAgPSAwOyAvKiBubyBmb3VyY2MgKi8KKyAgICBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICA9IGF2aW9fcmwxNihwYik7CisgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDY0LCAxLCBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICBhdmlvX3NraXAocGIsIDEwKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbGF0bWVuYy5jIGIvbGliYXZmb3JtYXQvbGF0bWVuYy5jCmluZGV4IGRiNjk3N2UuLjI3MzE5N2IgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2xhdG1lbmMuYworKysgYi9saWJhdmZvcm1hdC9sYXRtZW5jLmMKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlICJsaWJhdmNvZGVjL21wZWc0YXVkaW8uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInJhd2VuYy5oIgogCiAjZGVmaW5lIE1BWF9FWFRSQURBVEFfU0laRSAxMDI0CkBAIC04NCwxMyArODUsMTMgQEAKIHN0YXRpYyBpbnQgbGF0bV93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIExBVE1Db250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogCi0gICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUNfTEFUTSkKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUNfTEFUTSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID4gMCAmJgotICAgICAgICBsYXRtX2RlY29kZV9leHRyYWRhdGEoY3R4LCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpIDwgMCkKKyAgICBpZiAocGFyLT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYKKyAgICAgICAgbGF0bV9kZWNvZGVfZXh0cmFkYXRhKGN0eCwgcGFyLT5leHRyYWRhdGEsIHBhci0+ZXh0cmFkYXRhX3NpemUpIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICByZXR1cm4gMDsKQEAgLTk5LDcgKzEwMCw3IEBACiBzdGF0aWMgdm9pZCBsYXRtX3dyaXRlX2ZyYW1lX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIFB1dEJpdENvbnRleHQgKmJzKQogewogICAgIExBVE1Db250ZXh0ICpjdHggPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogICAgIGludCBoZWFkZXJfc2l6ZTsKIAogICAgIC8qIEF1ZGlvTXV4RWxlbWVudCAqLwpAQCAtMTE1LDE5ICsxMTYsMTkgQEAKIAogICAgICAgICAvKiBBdWRpb1NwZWNpZmljQ29uZmlnICovCiAgICAgICAgIGlmIChjdHgtPm9iamVjdF90eXBlID09IEFPVF9BTFMpIHsKLSAgICAgICAgICAgIGhlYWRlcl9zaXplID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplLShjdHgtPm9mZiA+PiAzKTsKLSAgICAgICAgICAgIGF2cHJpdl9jb3B5X2JpdHMoYnMsICZhdmN0eC0+ZXh0cmFkYXRhW2N0eC0+b2ZmID4+IDNdLCBoZWFkZXJfc2l6ZSk7CisgICAgICAgICAgICBoZWFkZXJfc2l6ZSA9IHBhci0+ZXh0cmFkYXRhX3NpemUtKGN0eC0+b2ZmID4+IDMpOworICAgICAgICAgICAgYXZwcml2X2NvcHlfYml0cyhicywgJnBhci0+ZXh0cmFkYXRhW2N0eC0+b2ZmID4+IDNdLCBoZWFkZXJfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyArIDMgYXNzdW1lcyBub3Qgc2NhbGFibGUgYW5kIGRlcGVuZHNPbkNvcmVDb2RlciA9PSAwLAogICAgICAgICAgICAgLy8gc2VlIGRlY29kZV9nYV9zcGVjaWZpY19jb25maWcgaW4gbGliYXZjb2RlYy9hYWNkZWMuYwotICAgICAgICAgICAgYXZwcml2X2NvcHlfYml0cyhicywgYXZjdHgtPmV4dHJhZGF0YSwgY3R4LT5vZmYgKyAzKTsKKyAgICAgICAgICAgIGF2cHJpdl9jb3B5X2JpdHMoYnMsIHBhci0+ZXh0cmFkYXRhLCBjdHgtPm9mZiArIDMpOwogCiAgICAgICAgICAgICBpZiAoIWN0eC0+Y2hhbm5lbF9jb25mKSB7CiAgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCBnYjsKLSAgICAgICAgICAgICAgICBpbnQgcmV0ID0gaW5pdF9nZXRfYml0czgoJmdiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGludCByZXQgPSBpbml0X2dldF9iaXRzOCgmZ2IsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKHJldCA+PSAwKTsgLy8gZXh0cmFkYXRhIHNpemUgaGFzIGJlZW4gY2hlY2tlZCBhbHJlYWR5LCBzbyB0aGlzIHNob3VsZCBub3QgZmFpbAogICAgICAgICAgICAgICAgIHNraXBfYml0c19sb25nKCZnYiwgY3R4LT5vZmYgKyAzKTsKLSAgICAgICAgICAgICAgICBhdnByaXZfY29weV9wY2VfZGF0YShicywgJmdiKTsKKyAgICAgICAgICAgICAgICBmZl9jb3B5X3BjZV9kYXRhKGJzLCAmZ2IpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE0NSwyNSArMTQ2LDM0IEBACiBzdGF0aWMgaW50IGxhdG1fd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBMQVRNQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBQdXRCaXRDb250ZXh0IGJzOwogICAgIGludCBpLCBsZW47CiAgICAgdWludDhfdCBsb2FzX2hlYWRlcltdID0gIlx4NTZceGUwXHgwMCI7CiAKLSAgICBpZiAocy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQ19MQVRNKQorICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQ19MQVRNKQogICAgICAgICByZXR1cm4gZmZfcmF3X3dyaXRlX3BhY2tldChzLCBwa3QpOwogCi0gICAgaWYgKHBrdC0+c2l6ZSA+IDIgJiYgcGt0LT5kYXRhWzBdID09IDB4ZmYgJiYgKHBrdC0+ZGF0YVsxXSA+PiA0KSA9PSAweGYpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFEVFMgaGVhZGVyIGRldGVjdGVkIC0gQURUUyB3aWxsIG5vdCBiZSBpbmNvcnJlY3RseSBtdXhlZCBpbnRvIExBVE1cbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICBpZiAoIXMtPnN0cmVhbXNbMF0tPmNvZGVjLT5leHRyYWRhdGEpIHsKKyAgICBpZiAoIXBhci0+ZXh0cmFkYXRhKSB7CiAgICAgICAgIGlmKHBrdC0+c2l6ZSA+IDIgJiYgcGt0LT5kYXRhWzBdID09IDB4NTYgJiYgKHBrdC0+ZGF0YVsxXSA+PiA0KSA9PSAweGUgJiYKICAgICAgICAgICAgIChBVl9SQjE2KHBrdC0+ZGF0YSArIDEpICYgMHgxRkZGKSArIDMgPT0gcGt0LT5zaXplKQogICAgICAgICAgICAgcmV0dXJuIGZmX3Jhd193cml0ZV9wYWNrZXQocywgcGt0KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdWludDhfdCAqc2lkZV9kYXRhOworICAgICAgICAgICAgaW50IHNpZGVfZGF0YV9zaXplID0gMCwgcmV0OworCisgICAgICAgICAgICBzaWRlX2RhdGEgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsIEFWX1BLVF9EQVRBX05FV19FWFRSQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lkZV9kYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKHNpZGVfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhdG1fZGVjb2RlX2V4dHJhZGF0YShjdHgsIHNpZGVfZGF0YSwgc2lkZV9kYXRhX3NpemUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfYWxsb2NfZXh0cmFkYXRhKHBhciwgc2lkZV9kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIG1lbWNweShwYXItPmV4dHJhZGF0YSwgc2lkZV9kYXRhLCBzaWRlX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAocGt0LT5zaXplID4gMHgxZmZmKQpAQCAtMjE3LDYgKzIyNywxOSBAQAogICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogfQogCitzdGF0aWMgaW50IGxhdG1fY2hlY2tfYml0c3RyZWFtKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCA9IDE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgaWYgKHBrdC0+c2l6ZSA+IDIgJiYgKEFWX1JCMTYocGt0LT5kYXRhKSAmIDB4ZmZmMCkgPT0gMHhmZmYwKQorICAgICAgICAgICAgcmV0ID0gZmZfc3RyZWFtX2FkZF9iaXRzdHJlYW1fZmlsdGVyKHN0LCAiYWFjX2FkdHN0b2FzYyIsIE5VTEwpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIEFWT3V0cHV0Rm9ybWF0IGZmX2xhdG1fbXV4ZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gImxhdG0iLAogICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJMT0FTL0xBVE0iKSwKQEAgLTIyOCw1ICsyNTEsNiBAQAogICAgIC53cml0ZV9oZWFkZXIgICA9IGxhdG1fd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICA9IGxhdG1fd3JpdGVfcGFja2V0LAogICAgIC5wcml2X2NsYXNzICAgICA9ICZsYXRtX211eGVyX2NsYXNzLAorICAgIC5jaGVja19iaXRzdHJlYW09IGxhdG1fY2hlY2tfYml0c3RyZWFtLAogICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9saWJhdmZvcm1hdC52IGIvbGliYXZmb3JtYXQvbGliYXZmb3JtYXQudgppbmRleCBhMDBhMzA5Li40N2Q1ZGRjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9saWJhdmZvcm1hdC52CisrKyBiL2xpYmF2Zm9ybWF0L2xpYmF2Zm9ybWF0LnYKQEAgLTEsMTcgKzEsNiBAQAotTElCQVZGT1JNQVRfJE1BSk9SIHsKLSAgICAgICAgZ2xvYmFsOiBhdio7Ci0gICAgICAgICAgICAgICAgI0ZJWE1FIHRob3NlIGFyZSBmb3IgZmZzZXJ2ZXIKLSAgICAgICAgICAgICAgICBmZl9pbmV0X2F0b247Ci0gICAgICAgICAgICAgICAgZmZfc29ja2V0X25vbmJsb2NrOwotICAgICAgICAgICAgICAgIGZmX3J0c3BfcGFyc2VfbGluZTsKLSAgICAgICAgICAgICAgICBmZl9ydHBfZ2V0X2xvY2FsX3J0cF9wb3J0OwotICAgICAgICAgICAgICAgIGZmX3J0cF9nZXRfbG9jYWxfcnRjcF9wb3J0OwotICAgICAgICAgICAgICAgIGZmaW9fb3Blbl9keW5fcGFja2V0X2J1ZjsKLSAgICAgICAgICAgICAgICBmZmlvX3NldF9idWZfc2l6ZTsKLSAgICAgICAgICAgICAgICBmZnVybF9jbG9zZTsKLSAgICAgICAgICAgICAgICBmZnVybF9vcGVuOwotICAgICAgICAgICAgICAgIGZmdXJsX3dyaXRlOwotICAgICAgICAgICAgICAgICN0aG9zZSBhcmUgZGVwcmVjYXRlZCwgcmVtb3ZlIG9uIG5leHQgYnVtcAotICAgICAgICAgICAgICAgIHVybF9mZW9mOwotICAgICAgICBsb2NhbDogKjsKK0xJQkFWRk9STUFUX01BSk9SIHsKKyAgICBnbG9iYWw6CisgICAgICAgIGF2KjsKKyAgICBsb2NhbDoKKyAgICAgICAgKjsKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9saWJnbWUuYyBiL2xpYmF2Zm9ybWF0L2xpYmdtZS5jCmluZGV4IDI3NjQ3N2IuLjIyODI3M2QgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2xpYmdtZS5jCisrKyBiL2xpYmF2Zm9ybWF0L2xpYmdtZS5jCkBAIC0xMjYsMTAgKzEyNiwxMCBAQAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwKTsKICAgICBpZiAoc3QtPmR1cmF0aW9uID4gMCkKICAgICAgICAgc3QtPmR1cmF0aW9uID0gZ21lLT5pbmZvLT5sZW5ndGg7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfTkUoQVZfQ09ERUNfSURfUENNX1MxNkJFLCBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSAyOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBnbWUtPnNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX05FKEFWX0NPREVDX0lEX1BDTV9TMTZCRSwgQVZfQ09ERUNfSURfUENNX1MxNkxFKTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gMjsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gZ21lLT5zYW1wbGVfcmF0ZTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbGlibW9kcGx1Zy5jIGIvbGliYXZmb3JtYXQvbGlibW9kcGx1Zy5jCmluZGV4IDc1Njk5ZTguLmYxOGM2MTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2xpYm1vZHBsdWcuYworKysgYi9saWJhdmZvcm1hdC9saWJtb2RwbHVnLmMKQEAgLTIyNCwxMCArMjI0LDEwIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDApOwogICAgIHN0LT5kdXJhdGlvbiA9IE1vZFBsdWdfR2V0TGVuZ3RoKG1vZHBsdWctPmYpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gc2V0dGluZ3MubUNoYW5uZWxzOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzZXR0aW5ncy5tRnJlcXVlbmN5OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gc2V0dGluZ3MubUNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzZXR0aW5ncy5tRnJlcXVlbmN5OwogCiAgICAgLy8gdGltZWJhc2UgPSAxLzEwMDAsIDJjaCAxNmJpdHMgNDQuMWtIei0+IDIqMio0NDEwMAogICAgIG1vZHBsdWctPnRzX3Blcl9wYWNrZXQgPSAxMDAwKkFVRElPX1BLVF9TSVpFIC8gKDQqNDQxMDAuKTsKQEAgLTIzOCwxMCArMjM4LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgNjQsIDEsIDEwMDApOwogICAgICAgICB2c3QtPmR1cmF0aW9uID0gc3QtPmR1cmF0aW9uOwotICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfWEJJTjsKLSAgICAgICAgdnN0LT5jb2RlYy0+d2lkdGggICAgICA9IG1vZHBsdWctPncgPDwgMzsKLSAgICAgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IG1vZHBsdWctPmggPDwgMzsKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1hCSU47CisgICAgICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSBtb2RwbHVnLT53IDw8IDM7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBtb2RwbHVnLT5oIDw8IDM7CiAgICAgICAgIG1vZHBsdWctPmxpbmVzaXplID0gbW9kcGx1Zy0+dyAqIDM7CiAgICAgICAgIG1vZHBsdWctPmZzaXplICAgID0gbW9kcGx1Zy0+bGluZXNpemUgKiBtb2RwbHVnLT5oOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2xpYm51dC5jIGIvbGliYXZmb3JtYXQvbGlibnV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNjIzZWQuLjAwMDAwMDAKLS0tIGEvbGliYXZmb3JtYXQvbGlibnV0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotLyoKLSAqIE5VVCAoZGUpbXV4aW5nIHZpYSBsaWJudXQKLSAqIGNvcHlyaWdodCAoYykgMjAwNiBPZGVkIFNoaW1vbiA8b2RzMTVAb2RzMTUuZHluZG5zLm9yZz4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogTlVUIGRlbXV4aW5nIGFuZCBtdXhpbmcgdmlhIGxpYm51dC4KLSAqIEBhdXRob3IgT2RlZCBTaGltb24gPG9kczE1QG9kczE1LmR5bmRucy5vcmc+Ci0gKi8KLQotI2luY2x1ZGUgImF2Zm9ybWF0LmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJyaWZmLmgiCi0jaW5jbHVkZSA8bGlibnV0Lmg+Ci0KLSNkZWZpbmUgSURfU1RSSU5HICJudXQvbXVsdGltZWRpYSBjb250YWluZXIiCi0jZGVmaW5lIElEX0xFTkdUSCAoc3RybGVuKElEX1NUUklORykgKyAxKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgbnV0X2NvbnRleHRfdHQgKiBudXQ7Ci0gICAgbnV0X3N0cmVhbV9oZWFkZXJfdHQgKiBzOwotfSBOVVRDb250ZXh0OwotCi1zdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBudXRfdGFnc1tdID0gewotICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICBNS1RBRygnbScsICdwJywgJzQnLCAndicpIH0sCi0gICAgeyBBVl9DT0RFQ19JRF9NUDMsICAgIE1LVEFHKCdtJywgJ3AnLCAnMycsICcgJykgfSwKLSAgICB7IEFWX0NPREVDX0lEX1ZPUkJJUywgTUtUQUcoJ3YnLCAncicsICdiJywgJ3MnKSB9LAotICAgIHsgMCwgMCB9LAotfTsKLQotI2lmIENPTkZJR19MSUJOVVRfTVVYRVIKLXN0YXRpYyBpbnQgYXZfd3JpdGUodm9pZCAqIGgsIHNpemVfdCBsZW4sIGNvbnN0IHVpbnQ4X3QgKiBidWYpIHsKLSAgICBBVklPQ29udGV4dCAqIGJjID0gaDsKLSAgICBhdmlvX3dyaXRlKGJjLCBidWYsIGxlbik7Ci0gICAgLy9hdmlvX2ZsdXNoKGJjKTsKLSAgICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgaW50IG51dF93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICogYXZmKSB7Ci0gICAgTlVUQ29udGV4dCAqIHByaXYgPSBhdmYtPnByaXZfZGF0YTsKLSAgICBBVklPQ29udGV4dCAqIGJjID0gYXZmLT5wYjsKLSAgICBudXRfbXV4ZXJfb3B0c190dCBtb3B0cyA9IHsKLSAgICAgICAgLm91dHB1dCA9IHsKLSAgICAgICAgICAgIC5wcml2ID0gYmMsCi0gICAgICAgICAgICAud3JpdGUgPSBhdl93cml0ZSwKLSAgICAgICAgfSwKLSAgICAgICAgLmFsbG9jID0geyBhdl9tYWxsb2MsIGF2X3JlYWxsb2MsIGF2X2ZyZWUgfSwKLSAgICAgICAgLndyaXRlX2luZGV4ID0gMSwKLSAgICAgICAgLnJlYWx0aW1lX3N0cmVhbSA9IDAsCi0gICAgICAgIC5tYXhfZGlzdGFuY2UgPSAzMjc2OCwKLSAgICAgICAgLmZ0aSA9IE5VTEwsCi0gICAgfTsKLSAgICBudXRfc3RyZWFtX2hlYWRlcl90dCAqIHM7Ci0gICAgaW50IGk7Ci0KLSAgICBwcml2LT5zID0gcyA9IGF2X21hbGxvY3pfYXJyYXkoYXZmLT5uYl9zdHJlYW1zICsgMSwgc2l6ZW9mKnMpOwotICAgIGlmKCFzKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGF2Zi0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIEFWQ29kZWNDb250ZXh0ICogY29kZWMgPSBhdmYtPnN0cmVhbXNbaV0tPmNvZGVjOwotICAgICAgICBpbnQgajsKLSAgICAgICAgaW50IGZvdXJjYyA9IDA7Ci0gICAgICAgIGludCBudW0sIGRlbm9tLCBzc2l6ZTsKLQotICAgICAgICBzW2ldLnR5cGUgPSBjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gPyBOVVRfVklERU9fQ0xBU1MgOiBOVVRfQVVESU9fQ0xBU1M7Ci0KLSAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190YWcpIGZvdXJjYyA9IGNvZGVjLT5jb2RlY190YWc7Ci0gICAgICAgIGVsc2UgZm91cmNjID0gZmZfY29kZWNfZ2V0X3RhZyhudXRfdGFncywgY29kZWMtPmNvZGVjX2lkKTsKLQotICAgICAgICBpZiAoIWZvdXJjYykgewotICAgICAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgZm91cmNjID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19ibXBfdGFncywgY29kZWMtPmNvZGVjX2lkKTsKLSAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIGZvdXJjYyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfd2F2X3RhZ3MsIGNvZGVjLT5jb2RlY19pZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzW2ldLmZvdXJjY19sZW4gPSA0OwotICAgICAgICBzW2ldLmZvdXJjYyA9IGF2X21hbGxvYyhzW2ldLmZvdXJjY19sZW4pOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgc1tpXS5mb3VyY2NfbGVuOyBqKyspIHNbaV0uZm91cmNjW2pdID0gKGZvdXJjYyA+PiAoaio4KSkgJiAweEZGOwotCi0gICAgICAgIGZmX3BhcnNlX3NwZWNpZmljX3BhcmFtcyhjb2RlYywgJm51bSwgJnNzaXplLCAmZGVub20pOwotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGF2Zi0+c3RyZWFtc1tpXSwgNjAsIGRlbm9tLCBudW0pOwotCi0gICAgICAgIHNbaV0udGltZV9iYXNlLm51bSA9IGRlbm9tOwotICAgICAgICBzW2ldLnRpbWVfYmFzZS5kZW4gPSBudW07Ci0KLSAgICAgICAgc1tpXS5maXhlZF9mcHMgPSAwOwotICAgICAgICBzW2ldLmRlY29kZV9kZWxheSA9IGNvZGVjLT5oYXNfYl9mcmFtZXM7Ci0gICAgICAgIHNbaV0uY29kZWNfc3BlY2lmaWNfbGVuID0gY29kZWMtPmV4dHJhZGF0YV9zaXplOwotICAgICAgICBzW2ldLmNvZGVjX3NwZWNpZmljID0gY29kZWMtPmV4dHJhZGF0YTsKLQotICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICBzW2ldLndpZHRoID0gY29kZWMtPndpZHRoOwotICAgICAgICAgICAgc1tpXS5oZWlnaHQgPSBjb2RlYy0+aGVpZ2h0OwotICAgICAgICAgICAgc1tpXS5zYW1wbGVfd2lkdGggPSAwOwotICAgICAgICAgICAgc1tpXS5zYW1wbGVfaGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIHNbaV0uY29sb3JzcGFjZV90eXBlID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNbaV0uc2FtcGxlcmF0ZV9udW0gPSBjb2RlYy0+c2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBzW2ldLnNhbXBsZXJhdGVfZGVub20gPSAxOwotICAgICAgICAgICAgc1tpXS5jaGFubmVsX2NvdW50ID0gY29kZWMtPmNoYW5uZWxzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc1thdmYtPm5iX3N0cmVhbXNdLnR5cGUgPSAtMTsKLSAgICBwcml2LT5udXQgPSBudXRfbXV4ZXJfaW5pdCgmbW9wdHMsIHMsIE5VTEwpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbnV0X3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKiBhdmYsIEFWUGFja2V0ICogcGt0KSB7Ci0gICAgTlVUQ29udGV4dCAqIHByaXYgPSBhdmYtPnByaXZfZGF0YTsKLSAgICBudXRfcGFja2V0X3R0IHA7Ci0KLSAgICBwLmxlbiA9IHBrdC0+c2l6ZTsKLSAgICBwLnN0cmVhbSA9IHBrdC0+c3RyZWFtX2luZGV4OwotICAgIHAucHRzID0gcGt0LT5wdHM7Ci0gICAgcC5mbGFncyA9IHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkgPyBOVVRfRkxBR19LRVkgOiAwOwotICAgIHAubmV4dF9wdHMgPSAwOwotCi0gICAgbnV0X3dyaXRlX2ZyYW1lX3Jlb3JkZXIocHJpdi0+bnV0LCAmcCwgcGt0LT5kYXRhKTsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG51dF93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqIGF2ZikgewotICAgIEFWSU9Db250ZXh0ICogYmMgPSBhdmYtPnBiOwotICAgIE5VVENvbnRleHQgKiBwcml2ID0gYXZmLT5wcml2X2RhdGE7Ci0gICAgaW50IGk7Ci0KLSAgICBudXRfbXV4ZXJfdW5pbml0X3Jlb3JkZXIocHJpdi0+bnV0KTsKLSAgICBhdmlvX2ZsdXNoKGJjKTsKLQotICAgIGZvcihpID0gMDsgcHJpdi0+c1tpXS50eXBlICE9IC0xOyBpKysgKSBhdl9mcmVlcCgmcHJpdi0+c1tpXS5mb3VyY2MpOwotICAgIGF2X2ZyZWVwKCZwcml2LT5zKTsKLQotICAgIHJldHVybiAwOwotfQotCi1BVk91dHB1dEZvcm1hdCBmZl9saWJudXRfbXV4ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgICAgID0gImxpYm51dCIsCi0gICAgLmxvbmdfbmFtZSAgICAgICAgID0gIm51dCBmb3JtYXQiLAotICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJ2aWRlby94LW51dCIsCi0gICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm51dCIsCi0gICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE5VVENvbnRleHQpLAotICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1ZPUkJJUywKLSAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKLSAgICAud3JpdGVfaGVhZGVyICAgICAgPSBudXRfd3JpdGVfaGVhZGVyLAotICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG51dF93cml0ZV9wYWNrZXQsCi0gICAgLndyaXRlX3RyYWlsZXIgICAgID0gbnV0X3dyaXRlX3RyYWlsZXIsCi0gICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfR0xPQkFMSEVBREVSLAotfTsKLSNlbmRpZiAvKiBDT05GSUdfTElCTlVUX01VWEVSICovCi0KLXN0YXRpYyBpbnQgbnV0X3Byb2JlKEFWUHJvYmVEYXRhICpwKSB7Ci0gICAgaWYgKCFtZW1jbXAocC0+YnVmLCBJRF9TVFJJTkcsIElEX0xFTkdUSCkpIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKLQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgc2l6ZV90IGF2X3JlYWQodm9pZCAqIGgsIHNpemVfdCBsZW4sIHVpbnQ4X3QgKiBidWYpIHsKLSAgICBBVklPQ29udGV4dCAqIGJjID0gaDsKLSAgICByZXR1cm4gYXZpb19yZWFkKGJjLCBidWYsIGxlbik7Ci19Ci0KLXN0YXRpYyBvZmZfdCBhdl9zZWVrKHZvaWQgKiBoLCBpbnQ2NF90IHBvcywgaW50IHdoZW5jZSkgewotICAgIEFWSU9Db250ZXh0ICogYmMgPSBoOwotICAgIGlmICh3aGVuY2UgPT0gU0VFS19FTkQpIHsKLSAgICAgICAgcG9zID0gYXZpb19zaXplKGJjKSArIHBvczsKLSAgICAgICAgd2hlbmNlID0gU0VFS19TRVQ7Ci0gICAgfQotICAgIHJldHVybiBhdmlvX3NlZWsoYmMsIHBvcywgd2hlbmNlKTsKLX0KLQotc3RhdGljIGludCBudXRfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICogYXZmKSB7Ci0gICAgTlVUQ29udGV4dCAqIHByaXYgPSBhdmYtPnByaXZfZGF0YTsKLSAgICBBVklPQ29udGV4dCAqIGJjID0gYXZmLT5wYjsKLSAgICBudXRfZGVtdXhlcl9vcHRzX3R0IGRvcHRzID0gewotICAgICAgICAuaW5wdXQgPSB7Ci0gICAgICAgICAgICAucHJpdiA9IGJjLAotICAgICAgICAgICAgLnNlZWsgPSBhdl9zZWVrLAotICAgICAgICAgICAgLnJlYWQgPSBhdl9yZWFkLAotICAgICAgICAgICAgLmVvZiA9IE5VTEwsCi0gICAgICAgICAgICAuZmlsZV9wb3MgPSAwLAotICAgICAgICB9LAotICAgICAgICAuYWxsb2MgPSB7IGF2X21hbGxvYywgYXZfcmVhbGxvYywgYXZfZnJlZSB9LAotICAgICAgICAucmVhZF9pbmRleCA9IDEsCi0gICAgICAgIC5jYWNoZV9zeW5jcG9pbnRzID0gMSwKLSAgICB9OwotICAgIG51dF9jb250ZXh0X3R0ICogbnV0ID0gcHJpdi0+bnV0ID0gbnV0X2RlbXV4ZXJfaW5pdCgmZG9wdHMpOwotICAgIG51dF9zdHJlYW1faGVhZGVyX3R0ICogczsKLSAgICBpbnQgcmV0LCBpOwotCi0gICAgaWYoIW51dCkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgaWYgKChyZXQgPSBudXRfcmVhZF9oZWFkZXJzKG51dCwgJnMsIE5VTEwpKSkgewotICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICIgTlVUIGVycm9yOiAlc1xuIiwgbnV0X2Vycm9yKHJldCkpOwotICAgICAgICBudXRfZGVtdXhlcl91bmluaXQobnV0KTsKLSAgICAgICAgcHJpdi0+bnV0ID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXYtPnMgPSBzOwotCi0gICAgZm9yIChpID0gMDsgc1tpXS50eXBlICE9IC0xICYmIGkgPCAyOyBpKyspIHsKLSAgICAgICAgQVZTdHJlYW0gKiBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZmLCBOVUxMKTsKLSAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgaWYgKCFzdCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IHNbaV0uZm91cmNjX2xlbiAmJiBqIDwgODsgaisrKSBzdC0+Y29kZWMtPmNvZGVjX3RhZyB8PSBzW2ldLmZvdXJjY1tqXTw8KGoqOCk7Ci0KLSAgICAgICAgc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXMgPSBzW2ldLmRlY29kZV9kZWxheTsKLQotICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gc1tpXS5jb2RlY19zcGVjaWZpY19sZW47Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICBpZihmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSl7Ci0gICAgICAgICAgICAgICAgbnV0X2RlbXV4ZXJfdW5pbml0KG51dCk7Ci0gICAgICAgICAgICAgICAgcHJpdi0+bnV0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBzW2ldLmNvZGVjX3NwZWNpZmljLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKLSAgICAgICAgfQotCi0gICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXZmLT5zdHJlYW1zW2ldLCA2MCwgc1tpXS50aW1lX2Jhc2UubnVtLCBzW2ldLnRpbWVfYmFzZS5kZW4pOwotICAgICAgICBzdC0+c3RhcnRfdGltZSA9IDA7Ci0gICAgICAgIHN0LT5kdXJhdGlvbiA9IHNbaV0ubWF4X3B0czsKLQotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKG51dF90YWdzLCBzdC0+Y29kZWMtPmNvZGVjX3RhZyk7Ci0KLSAgICAgICAgc3dpdGNoKHNbaV0udHlwZSkgewotICAgICAgICBjYXNlIE5VVF9BVURJT19DTEFTUzoKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfd2F2X3RhZ3MsIHN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKLQotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IHNbaV0uY2hhbm5lbF9jb3VudDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzW2ldLnNhbXBsZXJhdGVfbnVtIC8gc1tpXS5zYW1wbGVyYXRlX2Rlbm9tOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTlVUX1ZJREVPX0NMQVNTOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgc3QtPmNvZGVjLT5jb2RlY190YWcpOwotCi0gICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoID0gc1tpXS53aWR0aDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gc1tpXS5oZWlnaHQ7Ci0gICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBzW2ldLnNhbXBsZV93aWR0aDsKLSAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IHNbaV0uc2FtcGxlX2hlaWdodDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY29kZWM/IVxuIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbnV0X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqIGF2ZiwgQVZQYWNrZXQgKiBwa3QpIHsKLSAgICBOVVRDb250ZXh0ICogcHJpdiA9IGF2Zi0+cHJpdl9kYXRhOwotICAgIG51dF9wYWNrZXRfdHQgcGQ7Ci0gICAgaW50IHJldDsKLQotICAgIHJldCA9IG51dF9yZWFkX25leHRfcGFja2V0KHByaXYtPm51dCwgJnBkKTsKLQotICAgIGlmIChyZXQgfHwgYXZfbmV3X3BhY2tldChwa3QsIHBkLmxlbikgPCAwKSB7Ci0gICAgICAgIGlmIChyZXQgIT0gTlVUX0VSUl9FT0YpCi0gICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICIgTlVUIGVycm9yOiAlc1xuIiwgbnV0X2Vycm9yKHJldCkpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaWYgKHBkLmZsYWdzICYgTlVUX0ZMQUdfS0VZKSBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKLSAgICBwa3QtPnB0cyA9IHBkLnB0czsKLSAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHBkLnN0cmVhbTsKLSAgICBwa3QtPnBvcyA9IGF2aW9fdGVsbChhdmYtPnBiKTsKLQotICAgIHJldCA9IG51dF9yZWFkX2ZyYW1lKHByaXYtPm51dCwgJnBkLmxlbiwgcGt0LT5kYXRhKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbnV0X3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKiBhdmYsIGludCBzdHJlYW1faW5kZXgsIGludDY0X3QgdGFyZ2V0X3RzLCBpbnQgZmxhZ3MpIHsKLSAgICBOVVRDb250ZXh0ICogcHJpdiA9IGF2Zi0+cHJpdl9kYXRhOwotICAgIGludCBhY3RpdmVfc3RyZWFtc1tdID0geyBzdHJlYW1faW5kZXgsIC0xIH07Ci0gICAgZG91YmxlIHRpbWVfcG9zID0gdGFyZ2V0X3RzICogcHJpdi0+c1tzdHJlYW1faW5kZXhdLnRpbWVfYmFzZS5udW0gLyAoZG91YmxlKXByaXYtPnNbc3RyZWFtX2luZGV4XS50aW1lX2Jhc2UuZGVuOwotCi0gICAgaWYgKG51dF9zZWVrKHByaXYtPm51dCwgdGltZV9wb3MsIDIqIShmbGFncyAmIEFWU0VFS19GTEFHX0JBQ0tXQVJEKSwgYWN0aXZlX3N0cmVhbXMpKSByZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBudXRfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpIHsKLSAgICBOVVRDb250ZXh0ICogcHJpdiA9IHMtPnByaXZfZGF0YTsKLQotICAgIG51dF9kZW11eGVyX3VuaW5pdChwcml2LT5udXQpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLUFWSW5wdXRGb3JtYXQgZmZfbGlibnV0X2RlbXV4ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgID0gImxpYm51dCIsCi0gICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk5VVCBmb3JtYXQiKSwKLSAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoTlVUQ29udGV4dCksCi0gICAgLnJlYWRfcHJvYmUgICAgID0gbnV0X3Byb2JlLAotICAgIC5yZWFkX2hlYWRlciAgICA9IG51dF9yZWFkX2hlYWRlciwKLSAgICAucmVhZF9wYWNrZXQgICAgPSBudXRfcmVhZF9wYWNrZXQsCi0gICAgLnJlYWRfY2xvc2UgICAgID0gbnV0X3JlYWRfY2xvc2UsCi0gICAgLnJlYWRfc2VlayAgICAgID0gbnV0X3JlYWRfc2VlaywKLSAgICAuZXh0ZW5zaW9ucyAgICAgPSAibnV0IiwKLX07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9saWJvcGVubXB0LmMgYi9saWJhdmZvcm1hdC9saWJvcGVubXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMzNDI3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2xpYm9wZW5tcHQuYwpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIFRyYWNrZWQgTU9EIGRlbXV4ZXIgKGxpYm9wZW5tcHQpCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgSm9zaCBkZSBLb2NrCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaWJvcGVubXB0L2xpYm9wZW5tcHQuaD4KKyNpbmNsdWRlIDxsaWJvcGVubXB0L2xpYm9wZW5tcHRfc3RyZWFtX2NhbGxiYWNrc19maWxlLmg+CisjaW5jbHVkZSA8bGlib3Blbm1wdC9saWJvcGVubXB0X3ZlcnNpb24uaD4KKy8qIFNoaW1zIHRvIHN1cHBvcnQgbGlib3Blbm1wdCA8IDAuMy4wIChhcyBkb2N1bWVudGVkIGJ5IGxpYm9wZW5tcHQpICovCisjaWYgIWRlZmluZWQoT1BFTk1QVF9BUElfVkVSU0lPTl9NQUtFKQorI2RlZmluZSBPUEVOTVBUX0FQSV9WRVJTSU9OX01BS0UobWFqb3IsIG1pbm9yLCBwYXRjaCkgKCgobWFqb3IpPDwyNCl8KChtaW5vcik8PDE2KXwoKHBhdGNoKTw8MCkpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChPUEVOTVBUX0FQSV9WRVJTSU9OX0FUX0xFQVNUKQorI2RlZmluZSBPUEVOTVBUX0FQSV9WRVJTSU9OX0FUX0xFQVNUKG1ham9yLCBtaW5vciwgcGF0Y2gpIChPUEVOTVBUX0FQSV9WRVJTSU9OID49IE9QRU5NUFRfQVBJX1ZFUlNJT05fTUFLRSgobWFqb3IpLCAobWlub3IpLCAocGF0Y2gpKSkKKyNlbmRpZgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgT3Blbk1QVENvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIG9wZW5tcHRfbW9kdWxlICptb2R1bGU7CisKKyAgICBpbnQgY2hhbm5lbHM7CisgICAgZG91YmxlIGR1cmF0aW9uOworICAgIC8qIG9wdGlvbnMgKi8KKyAgICBpbnQgc2FtcGxlX3JhdGU7CisgICAgaW50NjRfdCBsYXlvdXQ7CisgICAgaW50IHN1YnNvbmc7Cit9IE9wZW5NUFRDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihPcGVuTVBUQ29udGV4dCwgeCkKKyNkZWZpbmUgQSBBVl9PUFRfRkxBR19BVURJT19QQVJBTQorI2RlZmluZSBEIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInNhbXBsZV9yYXRlIiwgInNldCBzYW1wbGUgcmF0ZSIsICAgIE9GRlNFVChzYW1wbGVfcmF0ZSksIEFWX09QVF9UWVBFX0lOVCwgICAgICAgICAgICB7IC5pNjQgPSA0ODAwMCB9LCAgICAgICAgICAgICAgIDEwMDAsIElOVF9NQVgsICAgQSB8IEQgfSwKKyAgICB7ICJsYXlvdXQiLCAgICAgICJzZXQgY2hhbm5lbCBsYXlvdXQiLCBPRkZTRVQobGF5b3V0KSwgICAgICBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgeyAuaTY0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTyB9LCAwLCAgICBJTlQ2NF9NQVgsIEEgfCBEIH0sCisgICAgeyAic3Vic29uZyIsICAgICAic2V0IHN1YnNvbmciLCAgICAgICAgT0ZGU0VUKHN1YnNvbmcpLCAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgICAgICAgIHsgLmk2NCA9IC0yIH0sICAgICAgICAgICAgICAgICAgLTIsICAgSU5UX01BWCwgICBBIHwgRCwgInN1YnNvbmcifSwKKyAgICB7ICJhbGwiLCAgICAgICAgICJhbGwiLCAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICAgICAgICAgeyAuaTY0ID0gLTF9LCAgICAgICAgICAgICAgICAgICAwLCAgICAwLCAgICAgICAgIEEgfCBELCAic3Vic29uZyIgfSwKKyAgICB7ICJhdXRvIiwgICAgICAgICJhdXRvIiwgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICAgICAgICAgeyAuaTY0ID0gLTJ9LCAgICAgICAgICAgICAgICAgICAwLCAgICAwLCAgICAgICAgIEEgfCBELCAic3Vic29uZyIgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIHZvaWQgb3Blbm1wdF9sb2dmdW5jKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIHZvaWQgKnVzZXJkYXRhKQoreworICAgIGludCBsZXZlbCA9IEFWX0xPR19JTkZPOworICAgIGlmIChzdHJzdHIobWVzc2FnZSwgIkVSUk9SIikgIT0gTlVMTCkgeworICAgICAgICBsZXZlbCA9IEFWX0xPR19FUlJPUjsKKyAgICB9CisgICAgYXZfbG9nKHVzZXJkYXRhLCBsZXZlbCwgIiVzXG4iLCBtZXNzYWdlKTsKK30KKworI2RlZmluZSBhZGRfbWV0YShzLCBuYW1lLCBtZXRhKSAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbWV0YTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVswXSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIG5hbWUsIHZhbHVlLCAwKTsgXAorICAgIG9wZW5tcHRfZnJlZV9zdHJpbmcodmFsdWUpOyAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKQorCitzdGF0aWMgaW50IHJlYWRfaGVhZGVyX29wZW5tcHQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBPcGVuTVBUQ29udGV4dCAqb3Blbm1wdCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQ2NF90IHNpemU7CisgICAgY2hhciAqYnVmOworI2lmIE9QRU5NUFRfQVBJX1ZFUlNJT05fQVRfTEVBU1QoMCwzLDApCisgICAgaW50IGVycm9yOworI2VuZGlmCisgICAgaW50IHJldDsKKworICAgIHNpemUgPSBhdmlvX3NpemUocy0+cGIpOworICAgIGlmIChzaXplIDw9IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGJ1ZiA9IGF2X21hbGxvYyhzaXplKTsKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzaXplID0gYXZpb19yZWFkKHMtPnBiLCBidWYsIHNpemUpOworICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVhZGluZyBpbnB1dCBidWZmZXIgZmFpbGVkLlxuIik7CisgICAgICAgIGF2X2ZyZWVwKCZidWYpOworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyNpZiBPUEVOTVBUX0FQSV9WRVJTSU9OX0FUX0xFQVNUKDAsMywwKQorICAgIGVycm9yID0gT1BFTk1QVF9FUlJPUl9PSzsKKyAgICBvcGVubXB0LT5tb2R1bGUgPSBvcGVubXB0X21vZHVsZV9jcmVhdGVfZnJvbV9tZW1vcnkyKGJ1Ziwgc2l6ZSwgb3Blbm1wdF9sb2dmdW5jLCBzLCBOVUxMLCBOVUxMLCAmZXJyb3IsIE5VTEwsIE5VTEwpOworICAgIGF2X2ZyZWVwKCZidWYpOworICAgIGlmICghb3Blbm1wdC0+bW9kdWxlKSB7CisgICAgICAgIGlmIChlcnJvciA9PSBPUEVOTVBUX0VSUk9SX09VVF9PRl9NRU1PUlkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBlbHNlIGlmIChlcnJvciA+PSBPUEVOTVBUX0VSUk9SX0dFTkVSQUwpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisjZWxzZQorICAgIG9wZW5tcHQtPm1vZHVsZSA9IG9wZW5tcHRfbW9kdWxlX2NyZWF0ZV9mcm9tX21lbW9yeShidWYsIHNpemUsIG9wZW5tcHRfbG9nZnVuYywgcywgTlVMTCk7CisgICAgYXZfZnJlZXAoJmJ1Zik7CisgICAgaWYgKCFvcGVubXB0LT5tb2R1bGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyNlbmRpZgorCisgICAgb3Blbm1wdC0+Y2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMob3Blbm1wdC0+bGF5b3V0KTsKKworICAgIGlmIChvcGVubXB0LT5zdWJzb25nID49IG9wZW5tcHRfbW9kdWxlX2dldF9udW1fc3Vic29uZ3Mob3Blbm1wdC0+bW9kdWxlKSkgeworICAgICAgICBvcGVubXB0X21vZHVsZV9kZXN0cm95KG9wZW5tcHQtPm1vZHVsZSk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN1YnNvbmcgaW5kZXg6ICVkXG4iLCBvcGVubXB0LT5zdWJzb25nKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBpZiAob3Blbm1wdC0+c3Vic29uZyAhPSAtMikgeworICAgICAgICBpZiAob3Blbm1wdC0+c3Vic29uZyA+PSAwKSB7CisgICAgICAgICAgICBhdl9kaWN0X3NldF9pbnQoJnMtPm1ldGFkYXRhLCAidHJhY2siLCBvcGVubXB0LT5zdWJzb25nICsgMSwgMCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gb3Blbm1wdF9tb2R1bGVfc2VsZWN0X3N1YnNvbmcob3Blbm1wdC0+bW9kdWxlLCBvcGVubXB0LT5zdWJzb25nKTsKKyAgICAgICAgaWYgKCFyZXQpeworICAgICAgICAgICAgb3Blbm1wdF9tb2R1bGVfZGVzdHJveShvcGVubXB0LT5tb2R1bGUpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBzZWxlY3QgcmVxdWVzdGVkIHN1YnNvbmc6ICVkIiwgb3Blbm1wdC0+c3Vic29uZyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgb3Blbm1wdC0+ZHVyYXRpb24gPSBvcGVubXB0X21vZHVsZV9nZXRfZHVyYXRpb25fc2Vjb25kcyhvcGVubXB0LT5tb2R1bGUpOworCisgICAgYWRkX21ldGEocywgImFydGlzdCIsICBvcGVubXB0X21vZHVsZV9nZXRfbWV0YWRhdGEob3Blbm1wdC0+bW9kdWxlLCAiYXJ0aXN0IikpOworICAgIGFkZF9tZXRhKHMsICJ0aXRsZSIsICAgb3Blbm1wdF9tb2R1bGVfZ2V0X21ldGFkYXRhKG9wZW5tcHQtPm1vZHVsZSwgInRpdGxlIikpOworICAgIGFkZF9tZXRhKHMsICJlbmNvZGVyIiwgb3Blbm1wdF9tb2R1bGVfZ2V0X21ldGFkYXRhKG9wZW5tcHQtPm1vZHVsZSwgInRyYWNrZXIiKSk7CisgICAgYWRkX21ldGEocywgImNvbW1lbnQiLCBvcGVubXB0X21vZHVsZV9nZXRfbWV0YWRhdGEob3Blbm1wdC0+bW9kdWxlLCAibWVzc2FnZSIpKTsKKyAgICBhZGRfbWV0YShzLCAiZGF0ZSIsICAgIG9wZW5tcHRfbW9kdWxlX2dldF9tZXRhZGF0YShvcGVubXB0LT5tb2R1bGUsICJkYXRlIikpOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpIHsKKyAgICAgICAgb3Blbm1wdF9tb2R1bGVfZGVzdHJveShvcGVubXB0LT5tb2R1bGUpOworICAgICAgICBvcGVubXB0LT5tb2R1bGUgPSBOVUxMOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgQVZfVElNRV9CQVNFKTsKKyAgICBzdC0+ZHVyYXRpb24gPSBsbHJpbnQob3Blbm1wdC0+ZHVyYXRpb24qQVZfVElNRV9CQVNFKTsKKworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX05FKEFWX0NPREVDX0lEX1BDTV9GMzJCRSwgQVZfQ09ERUNfSURfUENNX0YzMkxFKTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gb3Blbm1wdC0+Y2hhbm5lbHM7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IG9wZW5tcHQtPnNhbXBsZV9yYXRlOworCisgICAgcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQVVESU9fUEtUX1NJWkUgMjA0OAorCitzdGF0aWMgaW50IHJlYWRfcGFja2V0X29wZW5tcHQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIE9wZW5NUFRDb250ZXh0ICpvcGVubXB0ID0gcy0+cHJpdl9kYXRhOworICAgIGludCBuX3NhbXBsZXMgPSBBVURJT19QS1RfU0laRSAvIChvcGVubXB0LT5jaGFubmVscyA/IG9wZW5tcHQtPmNoYW5uZWxzKjQgOiA0KTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgQVVESU9fUEtUX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBzd2l0Y2ggKG9wZW5tcHQtPmNoYW5uZWxzKSB7CisgICAgY2FzZSAxOgorICAgICAgICByZXQgPSBvcGVubXB0X21vZHVsZV9yZWFkX2Zsb2F0X21vbm8ob3Blbm1wdC0+bW9kdWxlLCBvcGVubXB0LT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fc2FtcGxlcywgKGZsb2F0ICopcGt0LT5kYXRhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICByZXQgPSBvcGVubXB0X21vZHVsZV9yZWFkX2ludGVybGVhdmVkX2Zsb2F0X3N0ZXJlbyhvcGVubXB0LT5tb2R1bGUsIG9wZW5tcHQtPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3NhbXBsZXMsIChmbG9hdCAqKXBrdC0+ZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgICAgcmV0ID0gb3Blbm1wdF9tb2R1bGVfcmVhZF9pbnRlcmxlYXZlZF9mbG9hdF9xdWFkKG9wZW5tcHQtPm1vZHVsZSwgb3Blbm1wdC0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX3NhbXBsZXMsIChmbG9hdCAqKXBrdC0+ZGF0YSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHM6ICVkIiwgb3Blbm1wdC0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChyZXQgPCAxKSB7CisgICAgICAgIHBrdC0+c2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisKKyAgICBwa3QtPnNpemUgPSByZXQgKiAob3Blbm1wdC0+Y2hhbm5lbHMgKiA0KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWRfY2xvc2Vfb3Blbm1wdChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgT3Blbk1QVENvbnRleHQgKm9wZW5tcHQgPSBzLT5wcml2X2RhdGE7CisgICAgb3Blbm1wdF9tb2R1bGVfZGVzdHJveShvcGVubXB0LT5tb2R1bGUpOworICAgIG9wZW5tcHQtPm1vZHVsZSA9IE5VTEw7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9zZWVrX29wZW5tcHQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2lkeCwgaW50NjRfdCB0cywgaW50IGZsYWdzKQoreworICAgIE9wZW5NUFRDb250ZXh0ICpvcGVubXB0ID0gcy0+cHJpdl9kYXRhOworICAgIG9wZW5tcHRfbW9kdWxlX3NldF9wb3NpdGlvbl9zZWNvbmRzKG9wZW5tcHQtPm1vZHVsZSwgKGRvdWJsZSl0cy9BVl9USU1FX0JBU0UpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2JlX29wZW5tcHRfZXh0ZW5zaW9uKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IGNoYXIgKmV4dDsKKyAgICBpZiAocC0+ZmlsZW5hbWUpIHsKKyAgICAgICAgZXh0ID0gc3RycmNocihwLT5maWxlbmFtZSwgJy4nKTsKKyAgICAgICAgaWYgKGV4dCAmJiBzdHJsZW4oZXh0ICsgMSkgPiAwKSB7CisgICAgICAgICAgICBleHQrKzsgIC8qIHNraXAgJy4nICovCisgICAgICAgICAgICBpZiAob3Blbm1wdF9pc19leHRlbnNpb25fc3VwcG9ydGVkKGV4dCkgPT0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wcm9iZV9vcGVubXB0KEFWUHJvYmVEYXRhICpwKQoreworI2lmIE9QRU5NUFRfQVBJX1ZFUlNJT05fQVRfTEVBU1QoMCwzLDApCisgICAgaW50IHByb2JlX3Jlc3VsdDsKKyAgICBpZiAocC0+YnVmICYmIHAtPmJ1Zl9zaXplID4gMCkgeworICAgICAgICBwcm9iZV9yZXN1bHQgPSBvcGVubXB0X3Byb2JlX2ZpbGVfaGVhZGVyX3dpdGhvdXRfZmlsZXNpemUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEVOTVBUX1BST0JFX0ZJTEVfSEVBREVSX0ZMQUdTX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5idWYsIHAtPmJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5tcHRfbG9nZnVuYywgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgICAgICAgIGlmIChwcm9iZV9yZXN1bHQgPT0gT1BFTk1QVF9QUk9CRV9GSUxFX0hFQURFUl9SRVNVTFRfU1VDQ0VTUykgeworICAgICAgICAgICAgLyogQXMgcHJvYmluZyBoZXJlIHJlbGllcyBvbiBjb2RlIGV4dGVybmFsIHRvIEZGbXBlZywgZG8gbm90IHJldHVybgorICAgICAgICAgICAgICogQVZQUk9CRV9TQ09SRV9NQVggaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBpbXBhY3QgaW4gdGhlIHJhcmUKKyAgICAgICAgICAgICAqIGNhc2VzIG9mIGZhbHNlIHBvc2l0aXZlcy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUlNRSArIDE7CisgICAgICAgIH0gZWxzZSBpZiAocHJvYmVfcmVzdWx0ID09IE9QRU5NUFRfUFJPQkVfRklMRV9IRUFERVJfUkVTVUxUX1dBTlRNT1JFREFUQSkgeworICAgICAgICAgICAgaWYgKHByb2JlX29wZW5tcHRfZXh0ZW5zaW9uKHApID4gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX1JFVFJZOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocC0+YnVmX3NpemUgPj0gb3Blbm1wdF9wcm9iZV9maWxlX2hlYWRlcl9nZXRfcmVjb21tZW5kZWRfc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFdlIGhhdmUgYWxyZWFkeSByZWNlaXZlZCB0aGUgcmVjb21tZW5kZWQgYW1vdW50IG9mIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICogYW5kIHN0aWxsIGNhbm5vdCBkZWNpZGUuIFJldHVybiBhIHJhdGhlciBsb3cgc2NvcmUuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9SRVRSWSAvIDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZpbGUgZXh0ZW5zaW9uIGlzIHVua25vd24gYW5kIHdlIGhhdmUgdmVyeSBmZXcgZGF0YQorICAgICAgICAgICAgICAgICAgICAgKiBieXRlcyBhdmFpbGFibGUuIGxpYm9wZW5tcHQgY2Fubm90IGRlY2lkZSBhbnl0aGluZyBoZXJlLAorICAgICAgICAgICAgICAgICAgICAgKiBhbmQgcmV0dXJuaW5nIGFueSBzY29yZSA+IDAgd291bGQgcmVzdWx0IGluIHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAgICAgICAgICogcHJvYmluZyBvZiByYW5kb20gZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwcm9iZV9yZXN1bHQgPT0gT1BFTk1QVF9QUk9CRV9GSUxFX0hFQURFUl9SRVNVTFRfRkFJTFVSRSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAvKiBmb3Igb2xkZXIgbGlib3Blbm1wdCwgZmFsbCBiYWNrIHRvIGZpbGUgZXh0ZW5zaW9uIHByb2JpbmcgKi8KKyAgICByZXR1cm4gcHJvYmVfb3Blbm1wdF9leHRlbnNpb24ocCk7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGNsYXNzX29wZW5tcHQgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGlib3Blbm1wdCIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVklucHV0Rm9ybWF0IGZmX2xpYm9wZW5tcHRfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAibGlib3Blbm1wdCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRyYWNrZXIgZm9ybWF0cyAobGlib3Blbm1wdCkiKSwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoT3Blbk1QVENvbnRleHQpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IHJlYWRfcHJvYmVfb3Blbm1wdCwKKyAgICAucmVhZF9oZWFkZXIgICAgPSByZWFkX2hlYWRlcl9vcGVubXB0LAorICAgIC5yZWFkX3BhY2tldCAgICA9IHJlYWRfcGFja2V0X29wZW5tcHQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gcmVhZF9jbG9zZV9vcGVubXB0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IHJlYWRfc2Vla19vcGVubXB0LAorICAgIC5wcml2X2NsYXNzICAgICA9ICZjbGFzc19vcGVubXB0LAorI2lmIE9QRU5NUFRfQVBJX1ZFUlNJT05fQVRfTEVBU1QoMCwzLDApCisgICAgLmV4dGVuc2lvbnMgICAgID0gIjY2OSxhbWYsYW1zLGRibSxkaWdpLGRtZixkc20sZHRtLGZhcixnZG0saWNlLGltZixpdCxqMmIsbTE1LG1kbCxtZWQsbW1jbXAsbW1zLG1vMyxtb2QsbXB0bSxtdDIsbXRtLG5zdCxva3QscGxtLHBwbSxwc20scHQzNixwdG0sczNtLHNmeCxzZngyLHN0MjYsc3RrLHN0bSxzdHAsdWx0LHVteCx3b3cseG0seHBrIiwKKyNlbHNlCisgICAgLmV4dGVuc2lvbnMgICAgID0gIjY2OSxhbWYsYW1zLGRibSxkaWdpLGRtZixkc20sZmFyLGdkbSxpY2UsaW1mLGl0LGoyYixtMTUsbWRsLG1lZCxtbWNtcCxtbXMsbW8zLG1vZCxtcHRtLG10MixtdG0sbnN0LG9rdCxwbG0scHBtLHBzbSxwdDM2LHB0bSxzM20sc2Z4LHNmeDIsc3QyNixzdGssc3RtLHVsdCx1bXgsd293LHhtLHhwayIsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9saWJydG1wLmMgYi9saWJhdmZvcm1hdC9saWJydG1wLmMKaW5kZXggYmZhOWE3MS4uNDMwMTNlNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbGlicnRtcC5jCisrKyBiL2xpYmF2Zm9ybWF0L2xpYnJ0bXAuYwpAQCAtMTkzLDYgKzE5Myw4IEBACiAKICAgICAgICAgICAgIGlmIChzZXApCiAgICAgICAgICAgICAgICAgcCA9IHNlcCArIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGN0eC0+cGxheXBhdGgpIHsKQEAgLTIzNyw3ICsyMzksMTAgQEAKICNpZiBDT05GSUdfTkVUV09SSwogICAgIGlmIChjdHgtPmJ1ZmZlcl9zaXplID49IDAgJiYgKGZsYWdzICYgQVZJT19GTEFHX1dSSVRFKSkgewogICAgICAgICBpbnQgdG1wID0gY3R4LT5idWZmZXJfc2l6ZTsKLSAgICAgICAgc2V0c29ja29wdChyLT5tX3NiLnNiX3NvY2tldCwgU09MX1NPQ0tFVCwgU09fU05EQlVGLCAmdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgIGlmIChzZXRzb2Nrb3B0KHItPm1fc2Iuc2Jfc29ja2V0LCBTT0xfU09DS0VULCBTT19TTkRCVUYsICZ0bXAsIHNpemVvZih0bXApKSkgeworICAgICAgICAgICAgcmMgPSBBVkVSUk9SX0VYVEVSTkFMOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CiAgICAgfQogI2VuZGlmCiAKQEAgLTI1Niw3ICsyNjEsMTAgQEAKICAgICBMaWJSVE1QQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOwogICAgIFJUTVAgKnIgPSAmY3R4LT5ydG1wOwogCi0gICAgcmV0dXJuIFJUTVBfV3JpdGUociwgYnVmLCBzaXplKTsKKyAgICBpbnQgcmV0ID0gUlRNUF9Xcml0ZShyLCBidWYsIHNpemUpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBydG1wX3JlYWQoVVJMQ29udGV4dCAqcywgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKQEAgLTI2NCw3ICsyNzIsMTAgQEAKICAgICBMaWJSVE1QQ29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOwogICAgIFJUTVAgKnIgPSAmY3R4LT5ydG1wOwogCi0gICAgcmV0dXJuIFJUTVBfUmVhZChyLCBidWYsIHNpemUpOworICAgIGludCByZXQgPSBSVE1QX1JlYWQociwgYnVmLCBzaXplKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcnRtcF9yZWFkX3BhdXNlKFVSTENvbnRleHQgKnMsIGludCBwYXVzZSkKQEAgLTMzNyw3ICszNDgsNyBAQAogfTsKIAogUlRNUF9DTEFTUyhydG1wKQotVVJMUHJvdG9jb2wgZmZfbGlicnRtcF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX2xpYnJ0bXBfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAicnRtcCIsCiAgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBydG1wX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSBydG1wX3JlYWQsCkBAIC0zNTIsNyArMzYzLDcgQEAKIH07CiAKIFJUTVBfQ0xBU1MocnRtcHQpCi1VUkxQcm90b2NvbCBmZl9saWJydG1wdF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX2xpYnJ0bXB0X3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgICAgID0gInJ0bXB0IiwKICAgICAudXJsX29wZW4gICAgICAgICAgICA9IHJ0bXBfb3BlbiwKICAgICAudXJsX3JlYWQgICAgICAgICAgICA9IHJ0bXBfcmVhZCwKQEAgLTM2Nyw3ICszNzgsNyBAQAogfTsKIAogUlRNUF9DTEFTUyhydG1wZSkKLVVSTFByb3RvY29sIGZmX2xpYnJ0bXBlX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfbGlicnRtcGVfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAicnRtcGUiLAogICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gcnRtcF9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gcnRtcF9yZWFkLApAQCAtMzgyLDcgKzM5Myw3IEBACiB9OwogCiBSVE1QX0NMQVNTKHJ0bXB0ZSkKLVVSTFByb3RvY29sIGZmX2xpYnJ0bXB0ZV9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX2xpYnJ0bXB0ZV9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJydG1wdGUiLAogICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gcnRtcF9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gcnRtcF9yZWFkLApAQCAtMzk3LDcgKzQwOCw3IEBACiB9OwogCiBSVE1QX0NMQVNTKHJ0bXBzKQotVVJMUHJvdG9jb2wgZmZfbGlicnRtcHNfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9saWJydG1wc19wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJydG1wcyIsCiAgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBydG1wX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSBydG1wX3JlYWQsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9saWJzbWJjbGllbnQuYyBiL2xpYmF2Zm9ybWF0L2xpYnNtYmNsaWVudC5jCmluZGV4IDg0ZmVmN2YuLjMyODU4NjggMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2xpYnNtYmNsaWVudC5jCisrKyBiL2xpYmF2Zm9ybWF0L2xpYnNtYmNsaWVudC5jCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICByZXR1cm4gYnl0ZXNfcmVhZDsKKyAgICByZXR1cm4gYnl0ZXNfcmVhZCA/IGJ5dGVzX3JlYWQgOiBBVkVSUk9SX0VPRjsKIH0KIAogc3RhdGljIGludCBsaWJzbWJjX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCkBAIC0zNjUsNyArMzY1LDcgQEAKICAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi1VUkxQcm90b2NvbCBmZl9saWJzbWJjbGllbnRfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9saWJzbWJjbGllbnRfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAic21iIiwKICAgICAudXJsX29wZW4gICAgICAgICAgICA9IGxpYnNtYmNfb3BlbiwKICAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGxpYnNtYmNfcmVhZCwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2xpYnNydC5jIGIvbGliYXZmb3JtYXQvbGlic3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5NTI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L2xpYnNydC5jCkBAIC0wLDAgKzEsNTQ2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIEhhaXZpc2lvbiBPcGVuIFNSVCAoU2VjdXJlIFJlbGlhYmxlIFRyYW5zcG9ydCkgcHJvdG9jb2wKKyAqLworCisjaW5jbHVkZSA8c3J0L3NydC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAib3Nfc3VwcG9ydC5oIgorI2luY2x1ZGUgInVybC5oIgorCitlbnVtIFNSVE1vZGUgeworICAgIFNSVF9NT0RFX0NBTExFUiA9IDAsCisgICAgU1JUX01PREVfTElTVEVORVIgPSAxLAorICAgIFNSVF9NT0RFX1JFTkRFWlZPVVMgPSAyCit9OworCit0eXBlZGVmIHN0cnVjdCBTUlRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgZmQ7CisgICAgaW50IGVpZDsKKyAgICBpbnQ2NF90IHJ3X3RpbWVvdXQ7CisgICAgaW50NjRfdCBsaXN0ZW5fdGltZW91dDsKKyAgICBpbnQgcmVjdl9idWZmZXJfc2l6ZTsKKyAgICBpbnQgc2VuZF9idWZmZXJfc2l6ZTsKKworICAgIGludDY0X3QgbWF4Ync7CisgICAgaW50IHBia2V5bGVuOworICAgIGNoYXIgKnBhc3NwaHJhc2U7CisgICAgaW50IG1zczsKKyAgICBpbnQgZmZzOworICAgIGludCBpcHR0bDsKKyAgICBpbnQgaXB0b3M7CisgICAgaW50NjRfdCBpbnB1dGJ3OworICAgIGludCBvaGVhZGJ3OworICAgIGludDY0X3QgdHNicGRkZWxheTsKKyAgICBpbnQgdGxwa3Rkcm9wOworICAgIGludCBuYWtyZXBvcnQ7CisgICAgaW50NjRfdCBjb25uZWN0X3RpbWVvdXQ7CisgICAgZW51bSBTUlRNb2RlIG1vZGU7Cit9IFNSVENvbnRleHQ7CisKKyNkZWZpbmUgRCBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTQorI2RlZmluZSBFIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihTUlRDb250ZXh0LCB4KQorc3RhdGljIGNvbnN0IEFWT3B0aW9uIGxpYnNydF9vcHRpb25zW10gPSB7CisgICAgeyAicndfdGltZW91dCIsICAgICAiVGltZW91dCBvZiBzb2NrZXQgSS9PIG9wZXJhdGlvbnMiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocndfdGltZW91dCksICAgICAgIEFWX09QVF9UWVBFX0lOVDY0LCB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UNjRfTUFYLCAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ICJsaXN0ZW5fdGltZW91dCIsICJDb25uZWN0aW9uIGF3YWl0aW5nIHRpbWVvdXQiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChsaXN0ZW5fdGltZW91dCksICAgQVZfT1BUX1RZUEVfSU5UNjQsIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlQ2NF9NQVgsIC5mbGFncyA9IER8RSB9LAorICAgIHsgInNlbmRfYnVmZmVyX3NpemUiLCAiU29ja2V0IHNlbmQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHNlbmRfYnVmZmVyX3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsICAgLmZsYWdzID0gRHxFIH0sCisgICAgeyAicmVjdl9idWZmZXJfc2l6ZSIsICJTb2NrZXQgcmVjZWl2ZSBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQocmVjdl9idWZmZXJfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UX01BWCwgICAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ICJtYXhidyIsICAgICAgICAgICJNYXhpbXVtIGJhbmR3aWR0aCAoYnl0ZXMgcGVyIHNlY29uZCkgdGhhdCB0aGUgY29ubmVjdGlvbiBjYW4gdXNlIiwgICAgIE9GRlNFVChtYXhidyksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5UNjQsICAgIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlQ2NF9NQVgsIC5mbGFncyA9IER8RSB9LAorICAgIHsgInBia2V5bGVuIiwgICAgICAgIkNyeXB0byBrZXkgbGVuIGluIGJ5dGVzIHsxNiwyNCwzMn0gRGVmYXVsdDogMTYgKDEyOC1iaXQpIiwgICAgICAgICAgICAgT0ZGU0VUKHBia2V5bGVuKSwgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDMyLCAgICAgICAgLmZsYWdzID0gRHxFIH0sCisgICAgeyAicGFzc3BocmFzZSIsICAgICAiQ3J5cHRvIFBCS0RGMiBQYXNzcGhyYXNlIHNpemVbMCwxMC4uNjRdIDA6ZGlzYWJsZSBjcnlwdG8iLCAgICAgICAgICAgICBPRkZTRVQocGFzc3BocmFzZSksICAgICAgIEFWX09QVF9UWVBFX1NUUklORywgICB7IC5zdHIgPSBOVUxMIH0sICAgICAgICAgICAgICAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ICJtc3MiLCAgICAgICAgICAgICJUaGUgTWF4aW11bSBTZWdtZW50IFNpemUiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChtc3MpLCAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAxNTAwLCAgICAgIC5mbGFncyA9IER8RSB9LAorICAgIHsgImZmcyIsICAgICAgICAgICAgIkZsaWdodCBmbGFnIHNpemUgKHdpbmRvdyBzaXplKSAoaW4gYnl0ZXMpIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGZmcyksICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIElOVF9NQVgsICAgLmZsYWdzID0gRHxFIH0sCisgICAgeyAiaXB0dGwiLCAgICAgICAgICAiSVAgVGltZSBUbyBMaXZlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoaXB0dGwpLCAgICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMjU1LCAgICAgICAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ICJpcHRvcyIsICAgICAgICAgICJJUCBUeXBlIG9mIFNlcnZpY2UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChpcHRvcyksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgIHsgLmk2NCA9IC0xIH0sIC0xLCAyNTUsICAgICAgIC5mbGFncyA9IER8RSB9LAorICAgIHsgImlucHV0YnciLCAgICAgICAgIkVzdGltYXRlZCBpbnB1dCBzdHJlYW0gcmF0ZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGlucHV0YncpLCAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQ2NCwgICAgeyAuaTY0ID0gLTEgfSwgLTEsIElOVDY0X01BWCwgLmZsYWdzID0gRHxFIH0sCisgICAgeyAib2hlYWRidyIsICAgICAgICAiTWF4QlcgY2VpbGluZyBiYXNlZCBvbiAlIG92ZXIgaW5wdXQgc3RyZWFtIHJhdGUiLCAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQob2hlYWRidyksICAgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMTAwLCAgICAgICAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ICJ0c2JwZGRlbGF5IiwgICAgICJUc2JQZCByZWNlaXZlciBkZWxheSB0byBhYnNvcmIgYnVyc3Qgb2YgbWlzc2VkIHBhY2tldCByZXRyYW5zbWlzc2lvbiIsIE9GRlNFVCh0c2JwZGRlbGF5KSwgICAgICAgQVZfT1BUX1RZUEVfSU5UNjQsIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlQ2NF9NQVgsIC5mbGFncyA9IER8RSB9LAorICAgIHsgInRscGt0ZHJvcCIsICAgICAgIkVuYWJsZSByZWNlaXZlciBwa3QgZHJvcCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKHRscGt0ZHJvcCksICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsICAgICAgICAgLmZsYWdzID0gRHxFIH0sCisgICAgeyAibmFrcmVwb3J0IiwgICAgICAiRW5hYmxlIHJlY2VpdmVyIHRvIHNlbmQgcGVyaW9kaWMgTkFLIHJlcG9ydHMiLCAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobmFrcmVwb3J0KSwgICAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7IC5pNjQgPSAtMSB9LCAtMSwgMSwgICAgICAgICAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ICJjb25uZWN0X3RpbWVvdXQiLCAiQ29ubmVjdCB0aW1lb3V0LiBDYWxsZXIgZGVmYXVsdDogMzAwMCwgcmVuZGV6dm91cyAoeCAxMCkiLCAgICAgICAgICAgIE9GRlNFVChjb25uZWN0X3RpbWVvdXQpLCAgQVZfT1BUX1RZUEVfSU5UNjQsIHsgLmk2NCA9IC0xIH0sIC0xLCBJTlQ2NF9NQVgsIC5mbGFncyA9IER8RSB9LAorICAgIHsgIm1vZGUiLCAgICAgICAgICAgIkNvbm5lY3Rpb24gbW9kZSAoY2FsbGVyLCBsaXN0ZW5lciwgcmVuZGV6dm91cykiLCAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKG1vZGUpLCAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgeyAuaTY0ID0gU1JUX01PREVfQ0FMTEVSIH0sIFNSVF9NT0RFX0NBTExFUiwgU1JUX01PREVfUkVOREVaVk9VUywgLmZsYWdzID0gRHxFLCAibW9kZSIgfSwKKyAgICB7ICJjYWxsZXIiLCAgICAgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCAgeyAuaTY0ID0gU1JUX01PREVfQ0FMTEVSIH0sICAgICBJTlRfTUlOLCBJTlRfTUFYLCAuZmxhZ3MgPSBEfEUsICJtb2RlIiB9LAorICAgIHsgImxpc3RlbmVyIiwgICAgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsICB7IC5pNjQgPSBTUlRfTU9ERV9MSVNURU5FUiB9LCAgIElOVF9NSU4sIElOVF9NQVgsIC5mbGFncyA9IER8RSwgIm1vZGUiIH0sCisgICAgeyAicmVuZGV6dm91cyIsICAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgIHsgLmk2NCA9IFNSVF9NT0RFX1JFTkRFWlZPVVMgfSwgSU5UX01JTiwgSU5UX01BWCwgLmZsYWdzID0gRHxFLCAibW9kZSIgfSwKKyAgICB7IE5VTEwgfQorfTsKKworc3RhdGljIGludCBsaWJzcnRfbmV0ZXJybm8oVVJMQ29udGV4dCAqaCkKK3sKKyAgICBpbnQgZXJyID0gc3J0X2dldGxhc3RlcnJvcihOVUxMKTsKKyAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIHNydF9nZXRsYXN0ZXJyb3Jfc3RyKCkpOworICAgIGlmIChlcnIgPT0gU1JUX0VBU1lOQ1JDVikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKKyAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworfQorCitzdGF0aWMgaW50IGxpYnNydF9zb2NrZXRfbm9uYmxvY2soaW50IHNvY2tldCwgaW50IGVuYWJsZSkKK3sKKyAgICBpbnQgcmV0ID0gc3J0X3NldHNvY2tvcHQoc29ja2V0LCAwLCBTUlRPX1NORFNZTiwgJmVuYWJsZSwgc2l6ZW9mKGVuYWJsZSkpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIHJldHVybiBzcnRfc2V0c29ja29wdChzb2NrZXQsIDAsIFNSVE9fUkNWU1lOLCAmZW5hYmxlLCBzaXplb2YoZW5hYmxlKSk7Cit9CisKK3N0YXRpYyBpbnQgbGlic3J0X25ldHdvcmtfd2FpdF9mZChVUkxDb250ZXh0ICpoLCBpbnQgZWlkLCBpbnQgZmQsIGludCB3cml0ZSkKK3sKKyAgICBpbnQgcmV0LCBsZW4gPSAxOworICAgIGludCBtb2RlcyA9IHdyaXRlID8gU1JUX0VQT0xMX09VVCA6IFNSVF9FUE9MTF9JTjsKKyAgICBTUlRTT0NLRVQgcmVhZHlbMV07CisKKyAgICBpZiAoc3J0X2Vwb2xsX2FkZF91c29jayhlaWQsIGZkLCAmbW9kZXMpIDwgMCkKKyAgICAgICAgcmV0dXJuIGxpYnNydF9uZXRlcnJubyhoKTsKKyAgICBpZiAod3JpdGUpIHsKKyAgICAgICAgcmV0ID0gc3J0X2Vwb2xsX3dhaXQoZWlkLCAwLCAwLCByZWFkeSwgJmxlbiwgUE9MTElOR19USU1FLCAwLCAwLCAwLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBzcnRfZXBvbGxfd2FpdChlaWQsIHJlYWR5LCAmbGVuLCAwLCAwLCBQT0xMSU5HX1RJTUUsIDAsIDAsIDAsIDApOworICAgIH0KKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBpZiAoc3J0X2dldGxhc3RlcnJvcihOVUxMKSA9PSBTUlRfRVRJTUVPVVQpCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVBR0FJTik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldCA9IGxpYnNydF9uZXRlcnJubyhoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSAwOworICAgIH0KKyAgICBpZiAoc3J0X2Vwb2xsX3JlbW92ZV91c29jayhlaWQsIGZkKSA8IDApCisgICAgICAgIHJldHVybiBsaWJzcnRfbmV0ZXJybm8oaCk7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogVE9ETyBkZS1kdXBsaWNhdGUgY29kZSBmcm9tIGZmX25ldHdvcmtfd2FpdF9mZF90aW1lb3V0KCkgKi8KKworc3RhdGljIGludCBsaWJzcnRfbmV0d29ya193YWl0X2ZkX3RpbWVvdXQoVVJMQ29udGV4dCAqaCwgaW50IGVpZCwgaW50IGZkLCBpbnQgd3JpdGUsIGludDY0X3QgdGltZW91dCwgQVZJT0ludGVycnVwdENCICppbnRfY2IpCit7CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IHdhaXRfc3RhcnQgPSAwOworCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdChpbnRfY2IpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKKyAgICAgICAgcmV0ID0gbGlic3J0X25ldHdvcmtfd2FpdF9mZChoLCBlaWQsIGZkLCB3cml0ZSk7CisgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUihFQUdBSU4pKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgICBpZiAoIXdhaXRfc3RhcnQpCisgICAgICAgICAgICAgICAgd2FpdF9zdGFydCA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF2X2dldHRpbWVfcmVsYXRpdmUoKSAtIHdhaXRfc3RhcnQgPiB0aW1lb3V0KQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVUSU1FRE9VVCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgbGlic3J0X2xpc3RlbihpbnQgZWlkLCBpbnQgZmQsIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90IGFkZHJsZW4sIFVSTENvbnRleHQgKmgsIGludCB0aW1lb3V0KQoreworICAgIGludCByZXQ7CisgICAgaW50IHJldXNlID0gMTsKKyAgICBpZiAoc3J0X3NldHNvY2tvcHQoZmQsIFNPTF9TT0NLRVQsIFNSVE9fUkVVU0VBRERSLCAmcmV1c2UsIHNpemVvZihyZXVzZSkpKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfV0FSTklORywgInNldHNvY2tvcHQoU1JUT19SRVVTRUFERFIpIGZhaWxlZFxuIik7CisgICAgfQorICAgIHJldCA9IHNydF9iaW5kKGZkLCBhZGRyLCBhZGRybGVuKTsKKyAgICBpZiAocmV0KQorICAgICAgICByZXR1cm4gbGlic3J0X25ldGVycm5vKGgpOworCisgICAgcmV0ID0gc3J0X2xpc3RlbihmZCwgMSk7CisgICAgaWYgKHJldCkKKyAgICAgICAgcmV0dXJuIGxpYnNydF9uZXRlcnJubyhoKTsKKworICAgIHdoaWxlICgocmV0ID0gbGlic3J0X25ldHdvcmtfd2FpdF9mZF90aW1lb3V0KGgsIGVpZCwgZmQsIDEsIHRpbWVvdXQsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2spKSkgeworICAgICAgICBzd2l0Y2ggKHJldCkgeworICAgICAgICBjYXNlIEFWRVJST1IoRVRJTUVET1VUKToKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IHNydF9hY2NlcHQoZmQsIE5VTEwsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gbGlic3J0X25ldGVycm5vKGgpOworICAgIGlmIChsaWJzcnRfc29ja2V0X25vbmJsb2NrKHJldCwgMSkgPCAwKQorICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0RFQlVHLCAibGlic3J0X3NvY2tldF9ub25ibG9jayBmYWlsZWRcbiIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsaWJzcnRfbGlzdGVuX2Nvbm5lY3QoaW50IGVpZCwgaW50IGZkLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIHNvY2tsZW5fdCBhZGRybGVuLCBpbnQgdGltZW91dCwgVVJMQ29udGV4dCAqaCwgaW50IHdpbGxfdHJ5X25leHQpCit7CisgICAgaW50IHJldDsKKworICAgIGlmIChsaWJzcnRfc29ja2V0X25vbmJsb2NrKGZkLCAxKSA8IDApCisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfREVCVUcsICJmZl9zb2NrZXRfbm9uYmxvY2sgZmFpbGVkXG4iKTsKKworICAgIHdoaWxlICgocmV0ID0gc3J0X2Nvbm5lY3QoZmQsIGFkZHIsIGFkZHJsZW4pKSkgeworICAgICAgICByZXQgPSBsaWJzcnRfbmV0ZXJybm8oaCk7CisgICAgICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgQVZFUlJPUihFSU5UUik6CisgICAgICAgICAgICBpZiAoZmZfY2hlY2tfaW50ZXJydXB0KCZoLT5pbnRlcnJ1cHRfY2FsbGJhY2spKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgY2FzZSBBVkVSUk9SKEVJTlBST0dSRVNTKToKKyAgICAgICAgY2FzZSBBVkVSUk9SKEVBR0FJTik6CisgICAgICAgICAgICByZXQgPSBsaWJzcnRfbmV0d29ya193YWl0X2ZkX3RpbWVvdXQoaCwgZWlkLCBmZCwgMSwgdGltZW91dCwgJmgtPmludGVycnVwdF9jYWxsYmFjayk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0ID0gc3J0X2dldGxhc3RlcnJvcihOVUxMKTsKKyAgICAgICAgICAgIHNydF9jbGVhcmxhc3RlcnJvcigpOworICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgY2hhciBidWZbMTI4XTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKHJldCk7CisgICAgICAgICAgICAgICAgYXZfc3RyZXJyb3IocmV0LCBidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICBpZiAod2lsbF90cnlfbmV4dCkKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbm5lY3Rpb24gdG8gJXMgZmFpbGVkICglcyksIHRyeWluZyBuZXh0IGFkZHJlc3NcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5maWxlbmFtZSwgYnVmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJDb25uZWN0aW9uIHRvICVzIGZhaWxlZDogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5maWxlbmFtZSwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsaWJzcnRfc2V0c29ja29wdChVUkxDb250ZXh0ICpoLCBpbnQgZmQsIFNSVF9TT0NLT1BUIG9wdG5hbWUsIGNvbnN0IGNoYXIgKiBvcHRuYW1lc3RyLCBjb25zdCB2b2lkICogb3B0dmFsLCBpbnQgb3B0bGVuKQoreworICAgIGlmIChzcnRfc2V0c29ja29wdChmZCwgMCwgb3B0bmFtZSwgb3B0dmFsLCBvcHRsZW4pIDwgMCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHRvIHNldCBvcHRpb24gJXMgb24gc29ja2V0OiAlc1xuIiwgb3B0bmFtZXN0ciwgc3J0X2dldGxhc3RlcnJvcl9zdHIoKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiAtIFRoZSAiUE9TVCIgb3B0aW9ucyBjYW4gYmUgYWx0ZXJlZCBhbnkgdGltZSBvbiBhIGNvbm5lY3RlZCBzb2NrZXQuCisgICAgIFRoZXkgTUFZIGhhdmUgYWxzbyBzb21lIG1lYW5pbmcgd2hlbiBzZXQgcHJpb3IgdG8gY29ubmVjdGluZzsgc3VjaAorICAgICBvcHRpb24gaXMgU1JUT19SQ1ZTWU4sIHdoaWNoIG1ha2VzIGNvbm5lY3QvYWNjZXB0IGNhbGwgYXN5bmNocm9ub3VzLgorICAgICBCZWNhdXNlIG9mIHRoYXQgdGhpcyBvcHRpb24gaXMgdHJlYXRlZCBzcGVjaWFsIHdheSBpbiB0aGlzIGFwcC4gKi8KK3N0YXRpYyBpbnQgbGlic3J0X3NldF9vcHRpb25zX3Bvc3QoVVJMQ29udGV4dCAqaCwgaW50IGZkKQoreworICAgIFNSVENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisKKyAgICBpZiAoKHMtPmlucHV0YncgPj0gMCAmJiBsaWJzcnRfc2V0c29ja29wdChoLCBmZCwgU1JUT19JTlBVVEJXLCAiU1JUT19JTlBVVEJXIiwgJnMtPmlucHV0YncsIHNpemVvZihzLT5pbnB1dGJ3KSkgPCAwKSB8fAorICAgICAgICAocy0+b2hlYWRidyA+PSAwICYmIGxpYnNydF9zZXRzb2Nrb3B0KGgsIGZkLCBTUlRPX09IRUFEQlcsICJTUlRPX09IRUFEQlciLCAmcy0+b2hlYWRidywgc2l6ZW9mKHMtPm9oZWFkYncpKSA8IDApKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiAtIFRoZSAiUFJFIiBvcHRpb25zIG11c3QgYmUgc2V0IHByaW9yIHRvIGNvbm5lY3RpbmcgYW5kIGNhbid0IGJlIGFsdGVyZWQKKyAgICAgb24gYSBjb25uZWN0ZWQgc29ja2V0LCBob3dldmVyIGlmIHNldCBvbiBhIGxpc3RlbmluZyBzb2NrZXQsIHRoZXkgYXJlCisgICAgIGRlcml2ZWQgYnkgYWNjZXB0LWVkIHNvY2tldC4gKi8KK3N0YXRpYyBpbnQgbGlic3J0X3NldF9vcHRpb25zX3ByZShVUkxDb250ZXh0ICpoLCBpbnQgZmQpCit7CisgICAgU1JUQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgeWVzID0gMTsKKyAgICBpbnQgdHNicGRkZWxheSA9IHMtPnRzYnBkZGVsYXkgLyAxMDAwOworICAgIGludCBjb25uZWN0X3RpbWVvdXQgPSBzLT5jb25uZWN0X3RpbWVvdXQ7CisKKyAgICBpZiAoKHMtPm1vZGUgPT0gU1JUX01PREVfUkVOREVaVk9VUyAmJiBsaWJzcnRfc2V0c29ja29wdChoLCBmZCwgU1JUT19SRU5ERVpWT1VTLCAiU1JUT19SRU5ERVpWT1VTIiwgJnllcywgc2l6ZW9mKHllcykpIDwgMCkgfHwKKyAgICAgICAgKHMtPm1heGJ3ID49IDAgJiYgbGlic3J0X3NldHNvY2tvcHQoaCwgZmQsIFNSVE9fTUFYQlcsICJTUlRPX01BWEJXIiwgJnMtPm1heGJ3LCBzaXplb2Yocy0+bWF4YncpKSA8IDApIHx8CisgICAgICAgIChzLT5wYmtleWxlbiA+PSAwICYmIGxpYnNydF9zZXRzb2Nrb3B0KGgsIGZkLCBTUlRPX1BCS0VZTEVOLCAiU1JUT19QQktFWUxFTiIsICZzLT5wYmtleWxlbiwgc2l6ZW9mKHMtPnBia2V5bGVuKSkgPCAwKSB8fAorICAgICAgICAocy0+cGFzc3BocmFzZSAmJiBsaWJzcnRfc2V0c29ja29wdChoLCBmZCwgU1JUT19QQVNTUEhSQVNFLCAiU1JUT19QQVNTUEhSQVNFIiwgJnMtPnBhc3NwaHJhc2UsIHNpemVvZihzLT5wYXNzcGhyYXNlKSkgPCAwKSB8fAorICAgICAgICAocy0+bXNzID49IDAgJiYgbGlic3J0X3NldHNvY2tvcHQoaCwgZmQsIFNSVE9fTVNTLCAiU1JUT19NTVMiLCAmcy0+bXNzLCBzaXplb2Yocy0+bXNzKSkgPCAwKSB8fAorICAgICAgICAocy0+ZmZzID49IDAgJiYgbGlic3J0X3NldHNvY2tvcHQoaCwgZmQsIFNSVE9fRkMsICJTUlRPX0ZDIiwgJnMtPmZmcywgc2l6ZW9mKHMtPmZmcykpIDwgMCkgfHwKKyAgICAgICAgKHMtPmlwdHRsID49IDAgJiYgbGlic3J0X3NldHNvY2tvcHQoaCwgZmQsIFNSVE9fSVBUVEwsICJTUlRPX1VQVFRMIiwgJnMtPmlwdHRsLCBzaXplb2Yocy0+aXB0dGwpKSA8IDApIHx8CisgICAgICAgIChzLT5pcHRvcyA+PSAwICYmIGxpYnNydF9zZXRzb2Nrb3B0KGgsIGZkLCBTUlRPX0lQVE9TLCAiU1JUT19JUFRPUyIsICZzLT5pcHRvcywgc2l6ZW9mKHMtPmlwdG9zKSkgPCAwKSB8fAorICAgICAgICAodHNicGRkZWxheSA+PSAwICYmIGxpYnNydF9zZXRzb2Nrb3B0KGgsIGZkLCBTUlRPX1RTQlBEREVMQVksICJTUlRPX1RTQlBERUxBWSIsICZ0c2JwZGRlbGF5LCBzaXplb2YodHNicGRkZWxheSkpIDwgMCkgfHwKKyAgICAgICAgKHMtPnRscGt0ZHJvcCA+PSAwICYmIGxpYnNydF9zZXRzb2Nrb3B0KGgsIGZkLCBTUlRPX1RMUEtURFJPUCwgIlNSVE9fVExQS0RST1AiLCAmcy0+dGxwa3Rkcm9wLCBzaXplb2Yocy0+dGxwa3Rkcm9wKSkgPCAwKSB8fAorICAgICAgICAocy0+bmFrcmVwb3J0ID49IDAgJiYgbGlic3J0X3NldHNvY2tvcHQoaCwgZmQsIFNSVE9fTkFLUkVQT1JULCAiU1JUT19OQUtSRVBPUlQiLCAmcy0+bmFrcmVwb3J0LCBzaXplb2Yocy0+bmFrcmVwb3J0KSkgPCAwKSB8fAorICAgICAgICAoY29ubmVjdF90aW1lb3V0ID49IDAgJiYgbGlic3J0X3NldHNvY2tvcHQoaCwgZmQsIFNSVE9fQ09OTlRJTUVPLCAiU1JUT19DT05OVElNRU8iLCAmY29ubmVjdF90aW1lb3V0LCBzaXplb2YoY29ubmVjdF90aW1lb3V0KSkgPDAgKSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGxpYnNydF9zZXR1cChVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncykKK3sKKyAgICBzdHJ1Y3QgYWRkcmluZm8gaGludHMgPSB7IDAgfSwgKmFpLCAqY3VyX2FpOworICAgIGludCBwb3J0LCBmZCA9IC0xOworICAgIFNSVENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgY29uc3QgY2hhciAqcDsKKyAgICBjaGFyIGJ1ZlsyNTZdOworICAgIGludCByZXQ7CisgICAgY2hhciBob3N0bmFtZVsxMDI0XSxwcm90b1sxMDI0XSxwYXRoWzEwMjRdOworICAgIGNoYXIgcG9ydHN0clsxMF07CisgICAgaW50IG9wZW5fdGltZW91dCA9IDUwMDAwMDA7CisgICAgaW50IGVpZDsKKworICAgIGVpZCA9IHNydF9lcG9sbF9jcmVhdGUoKTsKKyAgICBpZiAoZWlkIDwgMCkKKyAgICAgICAgcmV0dXJuIGxpYnNydF9uZXRlcnJubyhoKTsKKyAgICBzLT5laWQgPSBlaWQ7CisKKyAgICBhdl91cmxfc3BsaXQocHJvdG8sIHNpemVvZihwcm90byksIE5VTEwsIDAsIGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpLAorICAgICAgICAmcG9ydCwgcGF0aCwgc2l6ZW9mKHBhdGgpLCB1cmkpOworICAgIGlmIChzdHJjbXAocHJvdG8sICJzcnQiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICBpZiAocG9ydCA8PSAwIHx8IHBvcnQgPj0gNjU1MzYpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlBvcnQgbWlzc2luZyBpbiB1cmlcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBwID0gc3RyY2hyKHVyaSwgJz8nKTsKKyAgICBpZiAocCkgeworICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAidGltZW91dCIsIHApKSB7CisgICAgICAgICAgICBzLT5yd190aW1lb3V0ID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJsaXN0ZW5fdGltZW91dCIsIHApKSB7CisgICAgICAgICAgICBzLT5saXN0ZW5fdGltZW91dCA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocy0+cndfdGltZW91dCA+PSAwKSB7CisgICAgICAgIG9wZW5fdGltZW91dCA9IGgtPnJ3X3RpbWVvdXQgPSBzLT5yd190aW1lb3V0OworICAgIH0KKyAgICBoaW50cy5haV9mYW1pbHkgPSBBRl9VTlNQRUM7CisgICAgaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOworICAgIHNucHJpbnRmKHBvcnRzdHIsIHNpemVvZihwb3J0c3RyKSwgIiVkIiwgcG9ydCk7CisgICAgaWYgKHMtPm1vZGUgPT0gU1JUX01PREVfTElTVEVORVIpCisgICAgICAgIGhpbnRzLmFpX2ZsYWdzIHw9IEFJX1BBU1NJVkU7CisgICAgcmV0ID0gZ2V0YWRkcmluZm8oaG9zdG5hbWVbMF0gPyBob3N0bmFtZSA6IE5VTEwsIHBvcnRzdHIsICZoaW50cywgJmFpKTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgaG9zdG5hbWUgJXM6ICVzXG4iLAorICAgICAgICAgICAgICAgaG9zdG5hbWUsIGdhaV9zdHJlcnJvcihyZXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBjdXJfYWkgPSBhaTsKKworIHJlc3RhcnQ6CisKKyAgICBmZCA9IHNydF9zb2NrZXQoY3VyX2FpLT5haV9mYW1pbHksIGN1cl9haS0+YWlfc29ja3R5cGUsIDApOworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0ID0gbGlic3J0X25ldGVycm5vKGgpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKChyZXQgPSBsaWJzcnRfc2V0X29wdGlvbnNfcHJlKGgsIGZkKSkgPCAwKSB7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICAvKiBTZXQgdGhlIHNvY2tldCdzIHNlbmQgb3IgcmVjZWl2ZSBidWZmZXIgc2l6ZXMsIGlmIHNwZWNpZmllZC4KKyAgICAgICBJZiB1bnNwZWNpZmllZCBvciBzZXR0aW5nIGZhaWxzLCBzeXN0ZW0gZGVmYXVsdCBpcyB1c2VkLiAqLworICAgIGlmIChzLT5yZWN2X2J1ZmZlcl9zaXplID4gMCkgeworICAgICAgICBzcnRfc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU1JUT19VRFBfUkNWQlVGLCAmcy0+cmVjdl9idWZmZXJfc2l6ZSwgc2l6ZW9mIChzLT5yZWN2X2J1ZmZlcl9zaXplKSk7CisgICAgfQorICAgIGlmIChzLT5zZW5kX2J1ZmZlcl9zaXplID4gMCkgeworICAgICAgICBzcnRfc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU1JUT19VRFBfU05EQlVGLCAmcy0+c2VuZF9idWZmZXJfc2l6ZSwgc2l6ZW9mIChzLT5zZW5kX2J1ZmZlcl9zaXplKSk7CisgICAgfQorICAgIGlmIChzLT5tb2RlID09IFNSVF9NT0RFX0xJU1RFTkVSKSB7CisgICAgICAgIC8vIG11bHRpLWNsaWVudAorICAgICAgICBpZiAoKHJldCA9IGxpYnNydF9saXN0ZW4ocy0+ZWlkLCBmZCwgY3VyX2FpLT5haV9hZGRyLCBjdXJfYWktPmFpX2FkZHJsZW4sIGgsIG9wZW5fdGltZW91dCAvIDEwMDApKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWwxOworICAgICAgICBmZCA9IHJldDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocy0+bW9kZSA9PSBTUlRfTU9ERV9SRU5ERVpWT1VTKSB7CisgICAgICAgICAgICByZXQgPSBzcnRfYmluZChmZCwgY3VyX2FpLT5haV9hZGRyLCBjdXJfYWktPmFpX2FkZHJsZW4pOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWwxOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChyZXQgPSBsaWJzcnRfbGlzdGVuX2Nvbm5lY3Qocy0+ZWlkLCBmZCwgY3VyX2FpLT5haV9hZGRyLCBjdXJfYWktPmFpX2FkZHJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuX3RpbWVvdXQgLyAxMDAwLCBoLCAhIWN1cl9haS0+YWlfbmV4dCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VYSVQpCisgICAgICAgICAgICAgICAgZ290byBmYWlsMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChyZXQgPSBsaWJzcnRfc2V0X29wdGlvbnNfcG9zdChoLCBmZCkpIDwgMCkgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaC0+aXNfc3RyZWFtZWQgPSAxOworICAgIHMtPmZkID0gZmQ7CisKKyAgICBmcmVlYWRkcmluZm8oYWkpOworICAgIHJldHVybiAwOworCisgZmFpbDoKKyAgICBpZiAoY3VyX2FpLT5haV9uZXh0KSB7CisgICAgICAgIC8qIFJldHJ5IHdpdGggdGhlIG5leHQgc29ja2FkZHIgKi8KKyAgICAgICAgY3VyX2FpID0gY3VyX2FpLT5haV9uZXh0OworICAgICAgICBpZiAoZmQgPj0gMCkKKyAgICAgICAgICAgIHNydF9jbG9zZShmZCk7CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGdvdG8gcmVzdGFydDsKKyAgICB9CisgZmFpbDE6CisgICAgaWYgKGZkID49IDApCisgICAgICAgIHNydF9jbG9zZShmZCk7CisgICAgZnJlZWFkZHJpbmZvKGFpKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxpYnNydF9vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzKQoreworICAgIFNSVENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgY29uc3QgY2hhciAqIHA7CisgICAgY2hhciBidWZbMjU2XTsKKworICAgIGlmIChzcnRfc3RhcnR1cCgpIDwgMCkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIC8qIFNSVCBvcHRpb25zIChzcnQvc3J0LmgpICovCisgICAgcCA9IHN0cmNocih1cmksICc/Jyk7CisgICAgaWYgKHApIHsKKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgIm1heGJ3IiwgcCkpIHsKKyAgICAgICAgICAgIHMtPm1heGJ3ID0gc3RydG9sbChidWYsIE5VTEwsIDApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJwYmtleWxlbiIsIHApKSB7CisgICAgICAgICAgICBzLT5wYmtleWxlbiA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAicGFzc3BocmFzZSIsIHApKSB7CisgICAgICAgICAgICBzLT5wYXNzcGhyYXNlID0gYXZfc3RybmR1cChidWYsIHN0cmxlbihidWYpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAibXNzIiwgcCkpIHsKKyAgICAgICAgICAgIHMtPm1zcyA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiZmZzIiwgcCkpIHsKKyAgICAgICAgICAgIHMtPmZmcyA9IHN0cnRvbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiaXB0dGwiLCBwKSkgeworICAgICAgICAgICAgcy0+aXB0dGwgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImlwdG9zIiwgcCkpIHsKKyAgICAgICAgICAgIHMtPmlwdG9zID0gc3RydG9sKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJpbnB1dGJ3IiwgcCkpIHsKKyAgICAgICAgICAgIHMtPmlucHV0YncgPSBzdHJ0b2xsKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJvaGVhZGJ3IiwgcCkpIHsKKyAgICAgICAgICAgIHMtPm9oZWFkYncgPSBzdHJ0b2xsKGJ1ZiwgTlVMTCwgMTApOworICAgICAgICB9CisgICAgICAgIGlmIChhdl9maW5kX2luZm9fdGFnKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0c2JwZGRlbGF5IiwgcCkpIHsKKyAgICAgICAgICAgIHMtPnRzYnBkZGVsYXkgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgInRscGt0ZHJvcCIsIHApKSB7CisgICAgICAgICAgICBzLT50bHBrdGRyb3AgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgIm5ha3JlcG9ydCIsIHApKSB7CisgICAgICAgICAgICBzLT5uYWtyZXBvcnQgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImNvbm5lY3RfdGltZW91dCIsIHApKSB7CisgICAgICAgICAgICBzLT5jb25uZWN0X3RpbWVvdXQgPSBzdHJ0b2woYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgIm1vZGUiLCBwKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoYnVmLCAiY2FsbGVyIikpIHsKKyAgICAgICAgICAgICAgICBzLT5tb2RlID0gU1JUX01PREVfQ0FMTEVSOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGJ1ZiwgImxpc3RlbmVyIikpIHsKKyAgICAgICAgICAgICAgICBzLT5tb2RlID0gU1JUX01PREVfTElTVEVORVI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYnVmLCAicmVuZGV6dm91cyIpKSB7CisgICAgICAgICAgICAgICAgcy0+bW9kZSA9IFNSVF9NT0RFX1JFTkRFWlZPVVM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGxpYnNydF9zZXR1cChoLCB1cmksIGZsYWdzKTsKK30KKworc3RhdGljIGludCBsaWJzcnRfcmVhZChVUkxDb250ZXh0ICpoLCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFNSVENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICghKGgtPmZsYWdzICYgQVZJT19GTEFHX05PTkJMT0NLKSkgeworICAgICAgICByZXQgPSBsaWJzcnRfbmV0d29ya193YWl0X2ZkX3RpbWVvdXQoaCwgcy0+ZWlkLCBzLT5mZCwgMCwgaC0+cndfdGltZW91dCwgJmgtPmludGVycnVwdF9jYWxsYmFjayk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHNydF9yZWN2bXNnKHMtPmZkLCBidWYsIHNpemUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHJldCA9IGxpYnNydF9uZXRlcnJubyhoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxpYnNydF93cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFNSVENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmICghKGgtPmZsYWdzICYgQVZJT19GTEFHX05PTkJMT0NLKSkgeworICAgICAgICByZXQgPSBsaWJzcnRfbmV0d29ya193YWl0X2ZkX3RpbWVvdXQoaCwgcy0+ZWlkLCBzLT5mZCwgMSwgaC0+cndfdGltZW91dCwgJmgtPmludGVycnVwdF9jYWxsYmFjayk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldCA9IHNydF9zZW5kbXNnKHMtPmZkLCBidWYsIHNpemUsIC0xLCAwKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXQgPSBsaWJzcnRfbmV0ZXJybm8oaCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsaWJzcnRfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBTUlRDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworCisgICAgc3J0X2Nsb3NlKHMtPmZkKTsKKworICAgIHNydF9lcG9sbF9yZWxlYXNlKHMtPmVpZCk7CisKKyAgICBzcnRfY2xlYW51cCgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGlic3J0X2dldF9maWxlX2hhbmRsZShVUkxDb250ZXh0ICpoKQoreworICAgIFNSVENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIHMtPmZkOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyBsaWJzcnRfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAibGlic3J0IiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gbGlic3J0X29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitjb25zdCBVUkxQcm90b2NvbCBmZl9saWJzcnRfcHJvdG9jb2wgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAic3J0IiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICA9IGxpYnNydF9vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gbGlic3J0X3JlYWQsCisgICAgLnVybF93cml0ZSAgICAgICAgICAgPSBsaWJzcnRfd3JpdGUsCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgPSBsaWJzcnRfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSBsaWJzcnRfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKFNSVENvbnRleHQpLAorICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKKyAgICAucHJpdl9kYXRhX2NsYXNzICAgICA9ICZsaWJzcnRfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbGlic3NoLmMgYi9saWJhdmZvcm1hdC9saWJzc2guYwppbmRleCAzYzA1NmY4Li4yMTQ3NGYwIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9saWJzc2guYworKysgYi9saWJhdmZvcm1hdC9saWJzc2guYwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIWF1dGhvcml6ZWQgJiYgKGF1dGhfbWV0aG9kcyAmIFNTSF9BVVRIX01FVEhPRF9QQVNTV09SRCkpIHsKKyAgICBpZiAoIWF1dGhvcml6ZWQgJiYgcGFzc3dvcmQgJiYgKGF1dGhfbWV0aG9kcyAmIFNTSF9BVVRIX01FVEhPRF9QQVNTV09SRCkpIHsKICAgICAgICAgaWYgKHNzaF91c2VyYXV0aF9wYXNzd29yZChsaWJzc2gtPnNlc3Npb24sIE5VTEwsIHBhc3N3b3JkKSA9PSBTU0hfQVVUSF9TVUNDRVNTKSB7CiAgICAgICAgICAgICBhdl9sb2cobGlic3NoLCBBVl9MT0dfREVCVUcsICJBdXRoZW50aWNhdGlvbiBzdWNjZXNzZnVsIHdpdGggcGFzc3dvcmQuXG4iKTsKICAgICAgICAgICAgIGF1dGhvcml6ZWQgPSAxOwpAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgICAgIGF2X2xvZyhsaWJzc2gsIEFWX0xPR19FUlJPUiwgIlJlYWQgZXJyb3IuXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKICAgICB9Ci0gICAgcmV0dXJuIGJ5dGVzX3JlYWQ7CisgICAgcmV0dXJuIGJ5dGVzX3JlYWQgPyBieXRlc19yZWFkIDogQVZFUlJPUl9FT0Y7CiB9CiAKIHN0YXRpYyBpbnQgbGlic3NoX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCkBAIC00ODksNyArNDg5LDcgQEAKICAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi1VUkxQcm90b2NvbCBmZl9saWJzc2hfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9saWJzc2hfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAic2Z0cCIsCiAgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBsaWJzc2hfb3BlbiwKICAgICAudXJsX3JlYWQgICAgICAgICAgICA9IGxpYnNzaF9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbG1sbTQuYyBiL2xpYmF2Zm9ybWF0L2xtbG00LmMKaW5kZXggODk5ZjQ0OS4uZDBjZjhmZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbG1sbTQuYworKysgYi9saWJhdmZvcm1hdC9sbWxtNC5jCkBAIC02NSwxNSArNjUsMTUgQEAKIAogICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01QRUc0OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NUEVHNDsKICAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxMDAxLCAzMDAwMCk7CiAKICAgICBpZiAoIShzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCkpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NUDI7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01QMjsKICAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOwogCiAgICAgLyogdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2xvYXNkZWMuYyBiL2xpYmF2Zm9ybWF0L2xvYXNkZWMuYwppbmRleCBjNDE4MDliLi43MDQ0MDU1IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9sb2FzZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvbG9hc2RlYy5jCkBAIC03Myw4ICs3Myw4IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOwogICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKIAogICAgIC8vTENNIG9mIGFsbCBwb3NzaWJsZSBBQUMgc2FtcGxlIHJhdGVzCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9scmNkZWMuYyBiL2xpYmF2Zm9ybWF0L2xyY2RlYy5jCmluZGV4IGQzNjU1ZmMuLmY0ZTlhNGUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2xyY2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2xyY2RlYy5jCkBAIC0xNjUsOCArMTY1LDggQEAKICAgICB9CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDApOwogICAgIGxyYy0+dHNfb2Zmc2V0ID0gMDsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVEVYVDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVEVYVDsKICAgICBhdl9icHJpbnRfaW5pdCgmbGluZSwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKIAogICAgIHdoaWxlKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CkBAIC0yMTIsNiArMjEyLDcgQEAKICAgICB9CiAgICAgZmZfc3VidGl0bGVzX3F1ZXVlX2ZpbmFsaXplKHMsICZscmMtPnEpOwogICAgIGZmX21ldGFkYXRhX2NvbnZfY3R4KHMsIE5VTEwsIGZmX2xyY19tZXRhZGF0YV9jb252KTsKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmxpbmUsIE5VTEwpOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9scmNlbmMuYyBiL2xpYmF2Zm9ybWF0L2xyY2VuYy5jCmluZGV4IGIzMTZjY2QuLmM1ZmRhNjQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2xyY2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2xyY2VuYy5jCkBAIC0zOSwxOSArMzksMjAgQEAKICAgICBjb25zdCBBVkRpY3Rpb25hcnlFbnRyeSAqbWV0YWRhdGFfaXRlbTsKIAogICAgIGlmKHMtPm5iX3N0cmVhbXMgIT0gMSB8fAotICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIkxSQyBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIHN1YnRpdGxlIHN0cmVhbS5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KLSAgICBpZihzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfU1VCUklQICYmCi0gICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1RFWFQpIHsKKyAgICBpZihzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfU1VCUklQICYmCisgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1RFWFQpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHN1YnRpdGxlIGNvZGVjOiAlc1xuIiwKLSAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUocy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkKSk7CisgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY19pZCkpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDY0LCAxLCAxMDApOwogCisgICAgZmZfc3RhbmRhcmRpemVfY3JlYXRpb25fdGltZShzKTsKICAgICBmZl9tZXRhZGF0YV9jb252X2N0eChzLCBmZl9scmNfbWV0YWRhdGFfY29udiwgTlVMTCk7CiAgICAgaWYoIShzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QpKSB7IC8vIGF2b2lkIGJyZWFraW5nIHJlZ3Jlc3Npb24gdGVzdHMKICAgICAgICAgLyogTFJDIHByb3ZpZGVzIGEgbWV0YWRhdGEgc2xvdCBmb3Igc3BlY2lmeWluZyBlbmNvZGVyIHZlcnNpb24KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L2x2ZmRlYy5jIGIvbGliYXZmb3JtYXQvbHZmZGVjLmMKaW5kZXggODFhZWM1OS4uYjhhZjI1NiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbHZmZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvbHZmZGVjLmMKQEAgLTYyLDE0ICs2MiwxNCBAQAogICAgICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CiAgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIDQpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKICAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBhdmlvX3JsMzIocy0+cGIpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcpOwogICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDEwMDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUtUQUcoJzAnLCAnMScsICdmJywgJ20nKToKQEAgLTc3LDE0ICs3NywxNCBAQAogICAgICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IGF2aW9fcmwxNihzLT5wYik7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19ybDE2KHMtPnBiKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMTYocy0+cGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgPSBhdmlvX3JsMTYocy0+cGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGF2aW9fcmwxNihzLT5wYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19ybDE2KHMtPnBiKTsKICAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgOCk7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcjgocy0+cGIpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY193YXZfdGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3I4KHMtPnBiKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfd2F2X3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKTsKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCAxMDAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDA6CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9seGZkZWMuYyBiL2xpYmF2Zm9ybWF0L2x4ZmRlYy5jCmluZGV4IGMwMGI0YmQuLjliM2ViNmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L2x4ZmRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L2x4ZmRlYy5jCkBAIC0xNzgsMjUgKzE3OCwyNCBAQAogCiAgICAgICAgIC8vc2V0IGNvZGVjIGJhc2VkIG9uIHNwZWNpZmllZCBhdWRpbyBiaXRkZXB0aAogICAgICAgICAvL3dlIG9ubHkgc3VwcG9ydCB0aWdodGx5IHBhY2tlZCAxNi0sIDIwLSwgMjQtIGFuZCAzMi1iaXQgUENNIGF0IHRoZSBtb21lbnQKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAoYXVkaW9fZm9ybWF0ID4+IDYpICYgMHgzRjsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAoYXVkaW9fZm9ybWF0ID4+IDYpICYgMHgzRjsKIAotICAgICAgICBpZiAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgIT0gKGF1ZGlvX2Zvcm1hdCAmIDB4M0YpKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJvbmx5IHRpZ2h0bHkgcGFja2VkIFBDTSBjdXJyZW50bHkgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlICE9IChhdWRpb19mb3JtYXQgJiAweDNGKSkgeworICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIk5vdCB0aWdodGx5IHBhY2tlZCBQQ00iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgfQogCi0gICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKLSAgICAgICAgY2FzZSAxNjogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRV9QTEFOQVI7IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX0xYRjsgICBicmVhazsKLSAgICAgICAgY2FzZSAyNDogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMjRMRV9QTEFOQVI7IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkxFX1BMQU5BUjsgYnJlYWs7CisgICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKKyAgICAgICAgY2FzZSAxNjogc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRV9QTEFOQVI7IGJyZWFrOworICAgICAgICBjYXNlIDIwOiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX0xYRjsgICBicmVhazsKKyAgICAgICAgY2FzZSAyNDogc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMjRMRV9QTEFOQVI7IGJyZWFrOworICAgICAgICBjYXNlIDMyOiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkxFX1BMQU5BUjsgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgIm9ubHkgMTYtLCAyMC0sIDI0LSBhbmQgMzItYml0IFBDTSBjdXJyZW50bHkgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKHMsICJQQ00gbm90IDE2LSwgMjAtLCAyNC0gb3IgMzItYml0cyIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9CiAKLSAgICAgICAgc2FtcGxlcyA9IHRyYWNrX3NpemUgKiA4IC8gc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgICAgIHNhbXBsZXMgPSB0cmFja19zaXplICogOCAvIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwogCiAgICAgICAgIC8vdXNlIGF1ZGlvIHBhY2tldCBzaXplIHRvIGRldGVybWluZSB2aWRlbyBzdGFuZGFyZAogICAgICAgICAvL2ZvciBOVFNDIHdlIGhhdmUgb25lIDgwMDgtc2FtcGxlIGF1ZGlvIGZyYW1lIHBlciBmaXZlIHZpZGVvIGZyYW1lcwpAQCAtMjU3LDExICsyNTYsMTEgQEAKICAgICBleHBpcmF0aW9uX2RhdGUgICAgICAgPSBBVl9STDE2KCZoZWFkZXJfZGF0YVs1OF0pOwogICAgIGRpc2tfcGFyYW1zICAgICAgICAgICA9IEFWX1JMMzIoJmhlYWRlcl9kYXRhWzExNl0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICA9IDEwMDAwMDAgKiAoKHZpZGVvX3BhcmFtcyA+PiAxNCkgJiAweEZGKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSB2aWRlb19wYXJhbXMgJiAweEY7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGx4Zl90YWdzLCBzdC0+Y29kZWMtPmNvZGVjX3RhZyk7Ci0gICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgID0gMTAwMDAwMCAqICgodmlkZW9fcGFyYW1zID4+IDE0KSAmIDB4RkYpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICA9IHZpZGVvX3BhcmFtcyAmIDB4RjsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQobHhmX3RhZ3MsIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKTsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgICAgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOwogCiAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInJlY29yZDogJXggPSAlaS0lMDJpLSUwMmlcbiIsCiAgICAgICAgICAgIHJlY29yZF9kYXRlLCAxOTAwICsgKHJlY29yZF9kYXRlICYgMHg3RiksIChyZWNvcmRfZGF0ZSA+PiA3KSAmIDB4RiwKQEAgLTI3OCwxMSArMjc3LDExIEBACiAgICAgICAgIGlmICghKHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKSkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBMWEZfU0FNUExFUkFURTsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGx4Zi0+Y2hhbm5lbHM7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBMWEZfU0FNUExFUkFURTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGx4Zi0+Y2hhbm5lbHM7CiAKLSAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgfQogCiAgICAgYXZpb19za2lwKHMtPnBiLCBseGYtPmV4dGVuZGVkX3NpemUpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbTR2ZGVjLmMgYi9saWJhdmZvcm1hdC9tNHZkZWMuYwppbmRleCBkOGVlNTMwLi4yMjBkYWViIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tNHZkZWMuYworKysgYi9saWJhdmZvcm1hdC9tNHZkZWMuYwpAQCAtMjIsMTMgKzIyLDE5IEBACiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJyYXdkZWMuaCIKIAotI2RlZmluZSBWSVNVQUxfT0JKRUNUX1NUQVJUX0NPREUgICAgICAgMHgwMDAwMDFiNQotI2RlZmluZSBWT1BfU1RBUlRfQ09ERSAgICAgICAgICAgICAgICAgMHgwMDAwMDFiNgorI2RlZmluZSBWT1NfU1RBUlRDT0RFICAgICAgICAweDFCMAorI2RlZmluZSBVU0VSX0RBVEFfU1RBUlRDT0RFICAweDFCMgorI2RlZmluZSBHT1BfU1RBUlRDT0RFICAgICAgICAweDFCMworI2RlZmluZSBWSVNVQUxfT0JKX1NUQVJUQ09ERSAweDFCNQorI2RlZmluZSBWT1BfU1RBUlRDT0RFICAgICAgICAweDFCNgorI2RlZmluZSBTTElDRV9TVEFSVENPREUgICAgICAweDFCNworI2RlZmluZSBFWFRfU1RBUlRDT0RFICAgICAgICAweDFCOAogCiBzdGF0aWMgaW50IG1wZWc0dmlkZW9fcHJvYmUoQVZQcm9iZURhdGEgKnByb2JlX3BhY2tldCkKIHsKICAgICB1aW50MzJfdCB0ZW1wX2J1ZmZlciA9IC0xOwogICAgIGludCBWTyA9IDAsIFZPTCA9IDAsIFZPUCA9IDAsIFZJU08gPSAwLCByZXMgPSAwOworICAgIGludCByZXNfbWFpbiA9IDA7CiAgICAgaW50IGk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcHJvYmVfcGFja2V0LT5idWZfc2l6ZTsgaSsrKSB7CkBAIC0zOCwyMSArNDQsMzIgQEAKICAgICAgICAgaWYgKHRlbXBfYnVmZmVyIDwgMikKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmICh0ZW1wX2J1ZmZlciA9PSBWT1BfU1RBUlRfQ09ERSkKKyAgICAgICAgaWYgKHRlbXBfYnVmZmVyID09IFZPUF9TVEFSVENPREUpCiAgICAgICAgICAgICBWT1ArKzsKLSAgICAgICAgZWxzZSBpZiAodGVtcF9idWZmZXIgPT0gVklTVUFMX09CSkVDVF9TVEFSVF9DT0RFKQorICAgICAgICBlbHNlIGlmICh0ZW1wX2J1ZmZlciA9PSBWSVNVQUxfT0JKX1NUQVJUQ09ERSkKICAgICAgICAgICAgIFZJU08rKzsKICAgICAgICAgZWxzZSBpZiAodGVtcF9idWZmZXIgPj0gMHgxMDAgJiYgdGVtcF9idWZmZXIgPCAweDEyMCkKICAgICAgICAgICAgIFZPKys7CiAgICAgICAgIGVsc2UgaWYgKHRlbXBfYnVmZmVyID49IDB4MTIwICYmIHRlbXBfYnVmZmVyIDwgMHgxMzApCiAgICAgICAgICAgICBWT0wrKzsKKyAgICAgICAgZWxzZSBpZiAodGVtcF9idWZmZXIgPT0gU0xJQ0VfU1RBUlRDT0RFIHx8IHRlbXBfYnVmZmVyID09IEVYVF9TVEFSVENPREUpCisgICAgICAgICAgICByZXNfbWFpbisrOwogICAgICAgICBlbHNlIGlmICghKDB4MUFGIDwgdGVtcF9idWZmZXIgJiYgdGVtcF9idWZmZXIgPCAweDFCNykgJiYKICAgICAgICAgICAgICAgICAgISgweDFCOSA8IHRlbXBfYnVmZmVyICYmIHRlbXBfYnVmZmVyIDwgMHgxQzQpKQogICAgICAgICAgICAgcmVzKys7CiAgICAgfQogCisgICAgLy8gcmVzX21haW4gcmVwZXNlbnRzIHRoZSByZXNlcnZlZCBjb2RlcyB3aXRoaW4gdGhlICJtYWluIiBwcm9maWxlLCB0aGV5IGFyZQorICAgIC8vIGFkZGVkIHRvIHRoZSByZXNlcnZlZCBvbmVzIGlmIGl0IGFwcGVhcnMgdGhhdCB0aGlzIGlzIGEgIm1haW4iIHByb2ZpbGUKKyAgICAvLyBzdHJlYW0KKyAgICBpZiAocmVzX21haW4gJiYgMipyZXNfbWFpbiA8IFZPUCkKKyAgICAgICAgcmVzICs9IHJlc19tYWluOworCiAgICAgaWYgKFZPUCA+PSBWSVNPICYmIFZPUCA+PSBWT0wgJiYgVk8gPj0gVk9MICYmIFZPTCA+IDAgJiYgcmVzID09IDApCiAgICAgICAgIHJldHVybiBWT1ArVk8gPiA0ID8gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gOiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTi8yOworCisgICAgaWYgKFZPUCA+PSBWSVNPICYmIFZPUCA+PSBWT0wgJiYgVk8gPj0gVk9MICYmIFZPTCA+IDAgJiYgVk9QK1ZPID4gNCkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OLzEwOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tYXRyb3NrYS5jIGIvbGliYXZmb3JtYXQvbWF0cm9za2EuYwppbmRleCBmYWE2NjJkLi45NGNjYmVjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tYXRyb3NrYS5jCisrKyBiL2xpYmF2Zm9ybWF0L21hdHJvc2thLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogTWF0cm9za2EgY29tbW9uIGRhdGEKLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA0IFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTM1LDcgKzM1LDcgQEAKICAgICB7IkFfRkxBQyIgICAgICAgICAgICwgQVZfQ09ERUNfSURfRkxBQ30sCiAgICAgeyJBX01MUCIgICAgICAgICAgICAsIEFWX0NPREVDX0lEX01MUH0sCiAgICAgeyJBX01QRUcvTDIiICAgICAgICAsIEFWX0NPREVDX0lEX01QMn0sCi0gICAgeyJBX01QRUcvTDEiICAgICAgICAsIEFWX0NPREVDX0lEX01QMn0sCisgICAgeyJBX01QRUcvTDEiICAgICAgICAsIEFWX0NPREVDX0lEX01QMX0sCiAgICAgeyJBX01QRUcvTDMiICAgICAgICAsIEFWX0NPREVDX0lEX01QM30sCiAgICAgeyJBX09QVVMiICAgICAgICAgICAsIEFWX0NPREVDX0lEX09QVVN9LAogICAgIHsiQV9PUFVTL0VYUEVSSU1FTlRBTCIsQVZfQ09ERUNfSURfT1BVU30sCkBAIC00OCw2ICs0OCw3IEBACiAgICAgeyJBX1BDTS9JTlQvTElUIiAgICAsIEFWX0NPREVDX0lEX1BDTV9TMjRMRX0sCiAgICAgeyJBX1BDTS9JTlQvTElUIiAgICAsIEFWX0NPREVDX0lEX1BDTV9TMzJMRX0sCiAgICAgeyJBX1BDTS9JTlQvTElUIiAgICAsIEFWX0NPREVDX0lEX1BDTV9VOH0sCisgICAgeyJBX1FVSUNLVElNRS9RRE1DIiAsIEFWX0NPREVDX0lEX1FETUN9LAogICAgIHsiQV9RVUlDS1RJTUUvUURNMiIgLCBBVl9DT0RFQ19JRF9RRE0yfSwKICAgICB7IkFfUkVBTC8xNF80IiAgICAgICwgQVZfQ09ERUNfSURfUkFfMTQ0fSwKICAgICB7IkFfUkVBTC8yOF84IiAgICAgICwgQVZfQ09ERUNfSURfUkFfMjg4fSwKQEAgLTc0LDggKzc1LDExIEBACiAgICAgeyJTX1ZPQlNVQiIgICAgICAgICAsIEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRX0sCiAgICAgeyJTX0RWQlNVQiIgICAgICAgICAsIEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRX0sCiAgICAgeyJTX0hETVYvUEdTIiAgICAgICAsIEFWX0NPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFfSwKKyAgICB7IlNfSERNVi9URVhUU1QiICAgICwgQVZfQ09ERUNfSURfSERNVl9URVhUX1NVQlRJVExFfSwKIAorICAgIHsiVl9BVjEiICAgICAgICAgICAgLCBBVl9DT0RFQ19JRF9BVjF9LAogICAgIHsiVl9ESVJBQyIgICAgICAgICAgLCBBVl9DT0RFQ19JRF9ESVJBQ30sCisgICAgeyJWX0ZGVjEiICAgICAgICAgICAsIEFWX0NPREVDX0lEX0ZGVjF9LAogICAgIHsiVl9NSlBFRyIgICAgICAgICAgLCBBVl9DT0RFQ19JRF9NSlBFR30sCiAgICAgeyJWX01QRUcxIiAgICAgICAgICAsIEFWX0NPREVDX0lEX01QRUcxVklERU99LAogICAgIHsiVl9NUEVHMiIgICAgICAgICAgLCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPfSwKQEAgLTE1MCwyNiArMTU0LDEzIEBACiAKIGludCBmZl9ta3Zfc3RlcmVvM2RfY29udihBVlN0cmVhbSAqc3QsIE1hdHJvc2thVmlkZW9TdGVyZW9Nb2RlVHlwZSBzdGVyZW9fbW9kZSkKIHsKLSAgICBBVlBhY2tldFNpZGVEYXRhICpzZCwgKnRtcDsKICAgICBBVlN0ZXJlbzNEICpzdGVyZW87CisgICAgaW50IHJldDsKIAogICAgIHN0ZXJlbyA9IGF2X3N0ZXJlbzNkX2FsbG9jKCk7CiAgICAgaWYgKCFzdGVyZW8pCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICB0bXAgPSBhdl9yZWFsbG9jX2FycmF5KHN0LT5zaWRlX2RhdGEsIHN0LT5uYl9zaWRlX2RhdGEgKyAxLCBzaXplb2YoKnRtcCkpOwotICAgIGlmICghdG1wKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZzdGVyZW8pOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLSAgICBzdC0+c2lkZV9kYXRhID0gdG1wOwotICAgIHN0LT5uYl9zaWRlX2RhdGErKzsKLQotICAgIHNkID0gJnN0LT5zaWRlX2RhdGFbc3QtPm5iX3NpZGVfZGF0YSAtIDFdOwotICAgIHNkLT50eXBlID0gQVZfUEtUX0RBVEFfU1RFUkVPM0Q7Ci0gICAgc2QtPmRhdGEgPSAodWludDhfdCAqKXN0ZXJlbzsKLSAgICBzZC0+c2l6ZSA9IHNpemVvZigqc3RlcmVvKTsKLQogICAgIC8vIG5vdGU6IHRoZSBtaXNzaW5nIGJyZWFrcyBhcmUgaW50ZW50aW9uYWwKICAgICBzd2l0Y2ggKHN0ZXJlb19tb2RlKSB7CiAgICAgY2FzZSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfTU9OTzoKQEAgLTIwNyw1ICsxOTgsMTIgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgcmV0ID0gYXZfc3RyZWFtX2FkZF9zaWRlX2RhdGEoc3QsIEFWX1BLVF9EQVRBX1NURVJFTzNELCAodWludDhfdCAqKXN0ZXJlbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnN0ZXJlbykpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzdGVyZW8pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbWF0cm9za2EuaCBiL2xpYmF2Zm9ybWF0L21hdHJvc2thLmgKaW5kZXggYTY1NGUwYy4uODNjODI0NiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbWF0cm9za2EuaAorKysgYi9saWJhdmZvcm1hdC9tYXRyb3NrYS5oCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIE1hdHJvc2thIGNvbnN0YW50cwotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNCBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtMTE5LDEwICsxMTksNDYgQEAKICNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BSIDB4NTRERAogI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0RJU1BMQVlVTklUIDB4NTRCMgogI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0ZMQUdJTlRFUkxBQ0VEIDB4OUEKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9GSUVMRE9SREVSIDB4OUQKICNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9TVEVSRU9NT0RFIDB4NTNCOAogI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0FMUEhBTU9ERSAweDUzQzAKICNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9BU1BFQ1RSQVRJTyAweDU0QjMKICNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUlNQQUNFIDB4MkVCNTI0CisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1IgMHg1NUIwCisKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUk1BVFJJWENPRUZGIDB4NTVCMQorI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0NPTE9SQklUU1BFUkNIQU5ORUwgMHg1NUIyCisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JDSFJPTUFTVUJIT1JaIDB4NTVCMworI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0NPTE9SQ0hST01BU1VCVkVSVCAweDU1QjQKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUkNCU1VCSE9SWiAweDU1QjUKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUkNCU1VCVkVSVCAweDU1QjYKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUkNIUk9NQVNJVElOR0hPUlogMHg1NUI3CisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JDSFJPTUFTSVRJTkdWRVJUIDB4NTVCOAorI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0NPTE9SUkFOR0UgMHg1NUI5CisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JUUkFOU0ZFUkNIQVJBQ1RFUklTVElDUyAweDU1QkEKKworI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0NPTE9SUFJJTUFSSUVTIDB4NTVCQgorI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFYQ0xMIDB4NTVCQworI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFYRkFMTCAweDU1QkQKKworI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFTVEVSSU5HTUVUQSAweDU1RDAKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUl9SWCAweDU1RDEKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUl9SWSAweDU1RDIKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUl9HWCAweDU1RDMKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUl9HWSAweDU1RDQKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUl9CWCAweDU1RDUKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUl9CWSAweDU1RDYKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUl9XSElURVggMHg1NUQ3CisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfV0hJVEVZIDB4NTVEOAorI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT0NPTE9SX0xVTUlOQU5DRU1BWCAweDU1RDkKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9DT0xPUl9MVU1JTkFOQ0VNSU4gMHg1NURBCisKKyNkZWZpbmUgTUFUUk9TS0FfSURfVklERU9QUk9KRUNUSU9OIDB4NzY3MAorI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT1BST0pFQ1RJT05UWVBFIDB4NzY3MQorI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT1BST0pFQ1RJT05QUklWQVRFIDB4NzY3MgorI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT1BST0pFQ1RJT05QT1NFWUFXIDB4NzY3MworI2RlZmluZSBNQVRST1NLQV9JRF9WSURFT1BST0pFQ1RJT05QT1NFUElUQ0ggMHg3Njc0CisjZGVmaW5lIE1BVFJPU0tBX0lEX1ZJREVPUFJPSkVDVElPTlBPU0VST0xMIDB4NzY3NQogCiAvKiBJRHMgaW4gdGhlIHRyYWNrYXVkaW8gbWFzdGVyICovCiAjZGVmaW5lIE1BVFJPU0tBX0lEX0FVRElPU0FNUExJTkdGUkVRIDB4QjUKQEAgLTI0Nyw2ICsyODMsMjEgQEAKIH0gTWF0cm9za2FUcmFja0VuY29kaW5nQ29tcEFsZ287CiAKIHR5cGVkZWYgZW51bSB7CisgICAgTUFUUk9TS0FfVklERU9fSU5URVJMQUNFX0ZMQUdfVU5ERVRFUk1JTkVEID0gMCwKKyAgICBNQVRST1NLQV9WSURFT19JTlRFUkxBQ0VfRkxBR19JTlRFUkxBQ0VEICAgPSAxLAorICAgIE1BVFJPU0tBX1ZJREVPX0lOVEVSTEFDRV9GTEFHX1BST0dSRVNTSVZFICA9IDIKK30gTWF0cm9za2FWaWRlb0ludGVybGFjZUZsYWc7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUFUUk9TS0FfVklERU9fRklFTERPUkRFUl9QUk9HUkVTU0lWRSAgPSAwLAorICAgIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfVU5ERVRFUk1JTkVEID0gMiwKKyAgICBNQVRST1NLQV9WSURFT19GSUVMRE9SREVSX1RUICAgICAgICAgICA9IDEsCisgICAgTUFUUk9TS0FfVklERU9fRklFTERPUkRFUl9CQiAgICAgICAgICAgPSA2LAorICAgIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfVEIgICAgICAgICAgID0gOSwKKyAgICBNQVRST1NLQV9WSURFT19GSUVMRE9SREVSX0JUICAgICAgICAgICA9IDE0LAorfSBNYXRyb3NrYVZpZGVvRmllbGRPcmRlcjsKKwordHlwZWRlZiBlbnVtIHsKICAgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX01PTk8gICAgICAgICAgICAgICA9IDAsCiAgIE1BVFJPU0tBX1ZJREVPX1NURVJFT01PREVfVFlQRV9MRUZUX1JJR0hUICAgICAgICAgPSAxLAogICBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfQk9UVE9NX1RPUCAgICAgICAgID0gMiwKQEAgLTI2NSw2ICszMTYsMzUgQEAKICAgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX05CLAogfSBNYXRyb3NrYVZpZGVvU3RlcmVvTW9kZVR5cGU7CiAKK3R5cGVkZWYgZW51bSB7CisgIE1BVFJPU0tBX1ZJREVPX0RJU1BMQVlVTklUX1BJWEVMUyAgICAgID0gMCwKKyAgTUFUUk9TS0FfVklERU9fRElTUExBWVVOSVRfQ0VOVElNRVRFUlMgPSAxLAorICBNQVRST1NLQV9WSURFT19ESVNQTEFZVU5JVF9JTkNIRVMgICAgICA9IDIsCisgIE1BVFJPU0tBX1ZJREVPX0RJU1BMQVlVTklUX0RBUiAgICAgICAgID0gMywKKyAgTUFUUk9TS0FfVklERU9fRElTUExBWVVOSVRfVU5LTk9XTiAgICAgPSA0LAorfSBNYXRyb3NrYVZpZGVvRGlzcGxheVVuaXQ7CisKK3R5cGVkZWYgZW51bSB7CisgIE1BVFJPU0tBX0NPTE9VUl9DSFJPTUFTSVRJTkdIT1JaX1VOREVURVJNSU5FRCAgICAgPSAwLAorICBNQVRST1NLQV9DT0xPVVJfQ0hST01BU0lUSU5HSE9SWl9MRUZUICAgICAgICAgICAgID0gMSwKKyAgTUFUUk9TS0FfQ09MT1VSX0NIUk9NQVNJVElOR0hPUlpfSEFMRiAgICAgICAgICAgICA9IDIsCisgIE1BVFJPU0tBX0NPTE9VUl9DSFJPTUFTSVRJTkdIT1JaX05CCit9IE1hdHJvc2thQ29sb3VyQ2hyb21hU2l0aW5nSG9yejsKKwordHlwZWRlZiBlbnVtIHsKKyAgTUFUUk9TS0FfQ09MT1VSX0NIUk9NQVNJVElOR1ZFUlRfVU5ERVRFUk1JTkVEICAgICA9IDAsCisgIE1BVFJPU0tBX0NPTE9VUl9DSFJPTUFTSVRJTkdWRVJUX1RPUCAgICAgICAgICAgICAgPSAxLAorICBNQVRST1NLQV9DT0xPVVJfQ0hST01BU0lUSU5HVkVSVF9IQUxGICAgICAgICAgICAgID0gMiwKKyAgTUFUUk9TS0FfQ09MT1VSX0NIUk9NQVNJVElOR1ZFUlRfTkIKK30gTWF0cm9za2FDb2xvdXJDaHJvbWFTaXRpbmdWZXJ0OworCit0eXBlZGVmIGVudW0geworICBNQVRST1NLQV9WSURFT19QUk9KRUNUSU9OX1RZUEVfUkVDVEFOR1VMQVIgICAgICAgID0gMCwKKyAgTUFUUk9TS0FfVklERU9fUFJPSkVDVElPTl9UWVBFX0VRVUlSRUNUQU5HVUxBUiAgICA9IDEsCisgIE1BVFJPU0tBX1ZJREVPX1BST0pFQ1RJT05fVFlQRV9DVUJFTUFQICAgICAgICAgICAgPSAyLAorICBNQVRST1NLQV9WSURFT19QUk9KRUNUSU9OX1RZUEVfTUVTSCAgICAgICAgICAgICAgID0gMywKK30gTWF0cm9za2FWaWRlb1Byb2plY3Rpb25UeXBlOworCiAvKgogICogTWF0cm9za2EgQ29kZWMgSURzLCBzdHJpbmdzCiAgKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21hdHJvc2thZGVjLmMgYi9saWJhdmZvcm1hdC9tYXRyb3NrYWRlYy5jCmluZGV4IGQ3ODgyMzIuLjM3YzlhMWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L21hdHJvc2thZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvbWF0cm9za2FkZWMuYwpAQCAtMzksOSArMzksMTEgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2x6by5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGltZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zcGhlcmljYWwuaCIKIAogI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvZmxhYy5oIgpAQCAtODcsNiArODksNyBAQAogICAgIGludCBsaXN0X2VsZW1fc2l6ZTsKICAgICBpbnQgZGF0YV9vZmZzZXQ7CiAgICAgdW5pb24geworICAgICAgICBpbnQ2NF90ICAgICBpOwogICAgICAgICB1aW50NjRfdCAgICB1OwogICAgICAgICBkb3VibGUgICAgICBmOwogICAgICAgICBjb25zdCBjaGFyICpzOwpAQCAtMTAxLDYgKzEwNCw3IEBACiAKIHR5cGVkZWYgc3RydWN0IEVibWxCaW4gewogICAgIGludCAgICAgIHNpemU7CisgICAgQVZCdWZmZXJSZWYgKmJ1ZjsKICAgICB1aW50OF90ICpkYXRhOwogICAgIGludDY0X3QgIHBvczsKIH0gRWJtbEJpbjsKQEAgLTEzMCw2ICsxMzQsNDQgQEAKICAgICBNYXRyb3NrYVRyYWNrRW5jcnlwdGlvbiBlbmNyeXB0aW9uOwogfSBNYXRyb3NrYVRyYWNrRW5jb2Rpbmc7CiAKK3R5cGVkZWYgc3RydWN0IE1hdHJvc2thTWFzdGVyaW5nTWV0YSB7CisgICAgZG91YmxlIHJfeDsKKyAgICBkb3VibGUgcl95OworICAgIGRvdWJsZSBnX3g7CisgICAgZG91YmxlIGdfeTsKKyAgICBkb3VibGUgYl94OworICAgIGRvdWJsZSBiX3k7CisgICAgZG91YmxlIHdoaXRlX3g7CisgICAgZG91YmxlIHdoaXRlX3k7CisgICAgZG91YmxlIG1heF9sdW1pbmFuY2U7CisgICAgZG91YmxlIG1pbl9sdW1pbmFuY2U7Cit9IE1hdHJvc2thTWFzdGVyaW5nTWV0YTsKKwordHlwZWRlZiBzdHJ1Y3QgTWF0cm9za2FUcmFja1ZpZGVvQ29sb3IgeworICAgIHVpbnQ2NF90IG1hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdWludDY0X3QgYml0c19wZXJfY2hhbm5lbDsKKyAgICB1aW50NjRfdCBjaHJvbWFfc3ViX2hvcno7CisgICAgdWludDY0X3QgY2hyb21hX3N1Yl92ZXJ0OworICAgIHVpbnQ2NF90IGNiX3N1Yl9ob3J6OworICAgIHVpbnQ2NF90IGNiX3N1Yl92ZXJ0OworICAgIHVpbnQ2NF90IGNocm9tYV9zaXRpbmdfaG9yejsKKyAgICB1aW50NjRfdCBjaHJvbWFfc2l0aW5nX3ZlcnQ7CisgICAgdWludDY0X3QgcmFuZ2U7CisgICAgdWludDY0X3QgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHVpbnQ2NF90IHByaW1hcmllczsKKyAgICB1aW50NjRfdCBtYXhfY2xsOworICAgIHVpbnQ2NF90IG1heF9mYWxsOworICAgIE1hdHJvc2thTWFzdGVyaW5nTWV0YSBtYXN0ZXJpbmdfbWV0YTsKK30gTWF0cm9za2FUcmFja1ZpZGVvQ29sb3I7CisKK3R5cGVkZWYgc3RydWN0IE1hdHJvc2thVHJhY2tWaWRlb1Byb2plY3Rpb24geworICAgIHVpbnQ2NF90IHR5cGU7CisgICAgRWJtbEJpbiBwcml2YXRlOworICAgIGRvdWJsZSB5YXc7CisgICAgZG91YmxlIHBpdGNoOworICAgIGRvdWJsZSByb2xsOworfSBNYXRyb3NrYVRyYWNrVmlkZW9Qcm9qZWN0aW9uOworCiB0eXBlZGVmIHN0cnVjdCBNYXRyb3NrYVRyYWNrVmlkZW8gewogICAgIGRvdWJsZSAgIGZyYW1lX3JhdGU7CiAgICAgdWludDY0X3QgZGlzcGxheV93aWR0aDsKQEAgLTEzNyw4ICsxNzksMTMgQEAKICAgICB1aW50NjRfdCBwaXhlbF93aWR0aDsKICAgICB1aW50NjRfdCBwaXhlbF9oZWlnaHQ7CiAgICAgRWJtbEJpbiBjb2xvcl9zcGFjZTsKKyAgICB1aW50NjRfdCBkaXNwbGF5X3VuaXQ7CisgICAgdWludDY0X3QgaW50ZXJsYWNlZDsKKyAgICB1aW50NjRfdCBmaWVsZF9vcmRlcjsKICAgICB1aW50NjRfdCBzdGVyZW9fbW9kZTsKICAgICB1aW50NjRfdCBhbHBoYV9tb2RlOworICAgIEVibWxMaXN0IGNvbG9yOworICAgIE1hdHJvc2thVHJhY2tWaWRlb1Byb2plY3Rpb24gcHJvamVjdGlvbjsKIH0gTWF0cm9za2FUcmFja1ZpZGVvOwogCiB0eXBlZGVmIHN0cnVjdCBNYXRyb3NrYVRyYWNrQXVkaW8gewpAQCAtMTg1LDExICsyMzIsMTUgQEAKICAgICBNYXRyb3NrYVRyYWNrT3BlcmF0aW9uIG9wZXJhdGlvbjsKICAgICBFYm1sTGlzdCBlbmNvZGluZ3M7CiAgICAgdWludDY0X3QgY29kZWNfZGVsYXk7CisgICAgdWludDY0X3QgY29kZWNfZGVsYXlfaW5fdHJhY2tfdGI7CiAKICAgICBBVlN0cmVhbSAqc3RyZWFtOwogICAgIGludDY0X3QgZW5kX3RpbWVjb2RlOwogICAgIGludCBtc19jb21wYXQ7CiAgICAgdWludDY0X3QgbWF4X2Jsb2NrX2FkZGl0aW9uYWxfaWQ7CisKKyAgICB1aW50MzJfdCBwYWxldHRlW0FWUEFMRVRURV9DT1VOVF07CisgICAgaW50IGhhc19wYWxldHRlOwogfSBNYXRyb3NrYVRyYWNrOwogCiB0eXBlZGVmIHN0cnVjdCBNYXRyb3NrYUF0dGFjaG1lbnQgewpAQCAtMjg4LDkgKzMzOSw4IEBACiAgICAgaW50NjRfdCBzZWdtZW50X3N0YXJ0OwogCiAgICAgLyogdGhlIHBhY2tldCBxdWV1ZSAqLwotICAgIEFWUGFja2V0ICoqcGFja2V0czsKLSAgICBpbnQgbnVtX3BhY2tldHM7Ci0gICAgQVZQYWNrZXQgKnByZXZfcGt0OworICAgIEFWUGFja2V0TGlzdCAqcXVldWU7CisgICAgQVZQYWNrZXRMaXN0ICpxdWV1ZV9lbmQ7CiAKICAgICBpbnQgZG9uZTsKIApAQCAtMzEyLDExICszNjIsMTEgQEAKICAgICAvKiBGaWxlIGhhcyBTU0Egc3VidGl0bGVzIHdoaWNoIHByZXZlbnQgaW5jcmVtZW50YWwgY2x1c3RlciBwYXJzaW5nLiAqLwogICAgIGludCBjb250YWluc19zc2E7CiAKLSAgICAvKiBXZWJNIERBU0ggTWFuaWZlc3QgbGl2ZSBmbGFnLyAqLworICAgIC8qIFdlYk0gREFTSCBNYW5pZmVzdCBsaXZlIGZsYWcgKi8KICAgICBpbnQgaXNfbGl2ZTsKIAotICAgIHVpbnQzMl90IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKLSAgICBpbnQgaGFzX3BhbGV0dGU7CisgICAgLyogQmFuZHdpZHRoIHZhbHVlIGZvciBXZWJNIERBU0ggTWFuaWZlc3QgKi8KKyAgICBpbnQgYmFuZHdpZHRoOwogfSBNYXRyb3NrYURlbXV4Q29udGV4dDsKIAogdHlwZWRlZiBzdHJ1Y3QgTWF0cm9za2FCbG9jayB7CkBAIC0zNTYsNiArNDA2LDQ3IEBACiAgICAgeyAwIH0KIH07CiAKK3N0YXRpYyBjb25zdCBFYm1sU3ludGF4IG1hdHJvc2thX21hc3RlcmluZ19tZXRhW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SX1JYLCBFQk1MX0ZMT0FULCAwLCBvZmZzZXRvZihNYXRyb3NrYU1hc3RlcmluZ01ldGEsIHJfeCksIHsgLmY9LTEgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUl9SWSwgRUJNTF9GTE9BVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FNYXN0ZXJpbmdNZXRhLCByX3kpLCB7IC5mPS0xIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfR1gsIEVCTUxfRkxPQVQsIDAsIG9mZnNldG9mKE1hdHJvc2thTWFzdGVyaW5nTWV0YSwgZ194KSwgeyAuZj0tMSB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SX0dZLCBFQk1MX0ZMT0FULCAwLCBvZmZzZXRvZihNYXRyb3NrYU1hc3RlcmluZ01ldGEsIGdfeSksIHsgLmY9LTEgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUl9CWCwgRUJNTF9GTE9BVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FNYXN0ZXJpbmdNZXRhLCBiX3gpLCB7IC5mPS0xIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfQlksIEVCTUxfRkxPQVQsIDAsIG9mZnNldG9mKE1hdHJvc2thTWFzdGVyaW5nTWV0YSwgYl95KSwgeyAuZj0tMSB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SX1dISVRFWCwgRUJNTF9GTE9BVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FNYXN0ZXJpbmdNZXRhLCB3aGl0ZV94KSwgeyAuZj0tMSB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SX1dISVRFWSwgRUJNTF9GTE9BVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FNYXN0ZXJpbmdNZXRhLCB3aGl0ZV95KSwgeyAuZj0tMSB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SX0xVTUlOQU5DRU1JTiwgRUJNTF9GTE9BVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FNYXN0ZXJpbmdNZXRhLCBtaW5fbHVtaW5hbmNlKSwgeyAuZj0tMSB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SX0xVTUlOQU5DRU1BWCwgRUJNTF9GTE9BVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FNYXN0ZXJpbmdNZXRhLCBtYXhfbHVtaW5hbmNlKSwgeyAuZj0tMSB9IH0sCisgICAgeyAwIH0KK307CisKK3N0YXRpYyBjb25zdCBFYm1sU3ludGF4IG1hdHJvc2thX3RyYWNrX3ZpZGVvX2NvbG9yW10gPSB7CisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFUUklYQ09FRkYsICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Db2xvciwgbWF0cml4X2NvZWZmaWNpZW50cyksIHsgLnUgPSBBVkNPTF9TUENfVU5TUEVDSUZJRUQgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUkJJVFNQRVJDSEFOTkVMLCAgIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvQ29sb3IsIGJpdHNfcGVyX2NoYW5uZWwpLCB7IC51PTAgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUkNIUk9NQVNVQkhPUlosICAgIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvQ29sb3IsIGNocm9tYV9zdWJfaG9yeiksIHsgLnU9MCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SQ0hST01BU1VCVkVSVCwgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Db2xvciwgY2hyb21hX3N1Yl92ZXJ0KSwgeyAudT0wIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JDQlNVQkhPUlosICAgICAgICBFQk1MX1VJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tWaWRlb0NvbG9yLCBjYl9zdWJfaG9yeiksIHsgLnU9MCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SQ0JTVUJWRVJULCAgICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Db2xvciwgY2Jfc3ViX3ZlcnQpLCB7IC51PTAgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUkNIUk9NQVNJVElOR0hPUlosIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvQ29sb3IsIGNocm9tYV9zaXRpbmdfaG9yeiksIHsgLnUgPSBNQVRST1NLQV9DT0xPVVJfQ0hST01BU0lUSU5HSE9SWl9VTkRFVEVSTUlORUQgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUkNIUk9NQVNJVElOR1ZFUlQsIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvQ29sb3IsIGNocm9tYV9zaXRpbmdfdmVydCksIHsgLnUgPSBNQVRST1NLQV9DT0xPVVJfQ0hST01BU0lUSU5HVkVSVF9VTkRFVEVSTUlORUQgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUlJBTkdFLCAgICAgICAgICAgIEVCTUxfVUlOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvQ29sb3IsIHJhbmdlKSwgeyAudSA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JUUkFOU0ZFUkNIQVJBQ1RFUklTVElDUywgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Db2xvciwgdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzKSwgeyAudSA9IEFWQ09MX1RSQ19VTlNQRUNJRklFRCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SUFJJTUFSSUVTLCAgICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Db2xvciwgcHJpbWFyaWVzKSwgeyAudSA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFYQ0xMLCAgICAgICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Db2xvciwgbWF4X2NsbCksIHsgLnU9MCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFYRkFMTCwgICAgICAgICAgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Db2xvciwgbWF4X2ZhbGwpLCB7IC51PTAgfSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUk1BU1RFUklOR01FVEEsICAgIEVCTUxfTkVTVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvQ29sb3IsIG1hc3RlcmluZ19tZXRhKSwgeyAubiA9IG1hdHJvc2thX21hc3RlcmluZ19tZXRhIH0gfSwKKyAgICB7IDAgfQorfTsKKworc3RhdGljIGNvbnN0IEVibWxTeW50YXggbWF0cm9za2FfdHJhY2tfdmlkZW9fcHJvamVjdGlvbltdID0geworICAgIHsgTUFUUk9TS0FfSURfVklERU9QUk9KRUNUSU9OVFlQRSwgICAgICAgIEVCTUxfVUlOVCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tWaWRlb1Byb2plY3Rpb24sIHR5cGUpLCB7IC51ID0gTUFUUk9TS0FfVklERU9fUFJPSkVDVElPTl9UWVBFX1JFQ1RBTkdVTEFSIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPUFJPSkVDVElPTlBSSVZBVEUsICAgICBFQk1MX0JJTiwgICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Qcm9qZWN0aW9uLCBwcml2YXRlKSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9QUk9KRUNUSU9OUE9TRVlBVywgICAgIEVCTUxfRkxPQVQsIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tWaWRlb1Byb2plY3Rpb24sIHlhdyksIHsgLmY9MC4wIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPUFJPSkVDVElPTlBPU0VQSVRDSCwgICBFQk1MX0ZMT0FULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Qcm9qZWN0aW9uLCBwaXRjaCksIHsgLmY9MC4wIH0gfSwKKyAgICB7IE1BVFJPU0tBX0lEX1ZJREVPUFJPSkVDVElPTlBPU0VST0xMLCAgICBFQk1MX0ZMT0FULCAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW9Qcm9qZWN0aW9uLCByb2xsKSwgeyAuZj0wLjAgfSB9LAorICAgIHsgMCB9Cit9OworCiBzdGF0aWMgY29uc3QgRWJtbFN5bnRheCBtYXRyb3NrYV90cmFja192aWRlb1tdID0gewogICAgIHsgTUFUUk9TS0FfSURfVklERU9GUkFNRVJBVEUsICAgICAgRUJNTF9GTE9BVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvLCBmcmFtZV9yYXRlKSB9LAogICAgIHsgTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEgsICAgRUJNTF9VSU5ULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvLCBkaXNwbGF5X3dpZHRoKSwgeyAudT0tMSB9IH0sCkBAIC0zNjQsMTIgKzQ1NSwxNSBAQAogICAgIHsgTUFUUk9TS0FfSURfVklERU9QSVhFTEhFSUdIVCwgICAgRUJNTF9VSU5ULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvLCBwaXhlbF9oZWlnaHQpIH0sCiAgICAgeyBNQVRST1NLQV9JRF9WSURFT0NPTE9SU1BBQ0UsICAgICBFQk1MX0JJTiwgICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIGNvbG9yX3NwYWNlKSB9LAogICAgIHsgTUFUUk9TS0FfSURfVklERU9BTFBIQU1PREUsICAgICAgRUJNTF9VSU5ULCAgMCwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvLCBhbHBoYV9tb2RlKSB9LAorICAgIHsgTUFUUk9TS0FfSURfVklERU9DT0xPUiwgICAgICAgICAgRUJNTF9ORVNULCAgc2l6ZW9mKE1hdHJvc2thVHJhY2tWaWRlb0NvbG9yKSwgb2Zmc2V0b2YoTWF0cm9za2FUcmFja1ZpZGVvLCBjb2xvciksIHsgLm4gPSBtYXRyb3NrYV90cmFja192aWRlb19jb2xvciB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT1BST0pFQ1RJT04sICAgICBFQk1MX05FU1QsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIHByb2plY3Rpb24pLCB7IC5uID0gbWF0cm9za2FfdHJhY2tfdmlkZW9fcHJvamVjdGlvbiB9IH0sCiAgICAgeyBNQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUEIsICAgICBFQk1MX05PTkUgfSwKICAgICB7IE1BVFJPU0tBX0lEX1ZJREVPUElYRUxDUk9QVCwgICAgIEVCTUxfTk9ORSB9LAogICAgIHsgTUFUUk9TS0FfSURfVklERU9QSVhFTENST1BMLCAgICAgRUJNTF9OT05FIH0sCiAgICAgeyBNQVRST1NLQV9JRF9WSURFT1BJWEVMQ1JPUFIsICAgICBFQk1MX05PTkUgfSwKLSAgICB7IE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWVVOSVQsICAgIEVCTUxfTk9ORSB9LAotICAgIHsgTUFUUk9TS0FfSURfVklERU9GTEFHSU5URVJMQUNFRCwgRUJNTF9OT05FIH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0RJU1BMQVlVTklULCAgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIGRpc3BsYXlfdW5pdCksIHsgLnU9IE1BVFJPU0tBX1ZJREVPX0RJU1BMQVlVTklUX1BJWEVMUyB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0ZMQUdJTlRFUkxBQ0VELCBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIGludGVybGFjZWQpLCAgeyAudSA9IE1BVFJPU0tBX1ZJREVPX0lOVEVSTEFDRV9GTEFHX1VOREVURVJNSU5FRCB9IH0sCisgICAgeyBNQVRST1NLQV9JRF9WSURFT0ZJRUxET1JERVIsICAgICBFQk1MX1VJTlQsICAwLCBvZmZzZXRvZihNYXRyb3NrYVRyYWNrVmlkZW8sIGZpZWxkX29yZGVyKSwgeyAudSA9IE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfVU5ERVRFUk1JTkVEIH0gfSwKICAgICB7IE1BVFJPU0tBX0lEX1ZJREVPU1RFUkVPTU9ERSwgICAgIEVCTUxfVUlOVCwgIDAsIG9mZnNldG9mKE1hdHJvc2thVHJhY2tWaWRlbywgc3RlcmVvX21vZGUpLCB7IC51ID0gTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX05CIH0gfSwKICAgICB7IE1BVFJPU0tBX0lEX1ZJREVPQVNQRUNUUkFUSU8sICAgIEVCTUxfTk9ORSB9LAogICAgIHsgMCB9CkBAIC02MDYsNyArNzAwLDcgQEAKICAgICB7IE1BVFJPU0tBX0lEX1NJTVBMRUJMT0NLLCAgICBFQk1MX0JJTiwgIDAsIG9mZnNldG9mKE1hdHJvc2thQmxvY2ssIGJpbikgfSwKICAgICB7IE1BVFJPU0tBX0lEX0JMT0NLRFVSQVRJT04sICBFQk1MX1VJTlQsIDAsIG9mZnNldG9mKE1hdHJvc2thQmxvY2ssIGR1cmF0aW9uKSB9LAogICAgIHsgTUFUUk9TS0FfSURfRElTQ0FSRFBBRERJTkcsIEVCTUxfU0lOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FCbG9jaywgZGlzY2FyZF9wYWRkaW5nKSB9LAotICAgIHsgTUFUUk9TS0FfSURfQkxPQ0tSRUZFUkVOQ0UsIEVCTUxfU0lOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FCbG9jaywgcmVmZXJlbmNlKSB9LAorICAgIHsgTUFUUk9TS0FfSURfQkxPQ0tSRUZFUkVOQ0UsIEVCTUxfU0lOVCwgMCwgb2Zmc2V0b2YoTWF0cm9za2FCbG9jaywgcmVmZXJlbmNlKSwgeyAuaSA9IElOVDY0X01JTiB9IH0sCiAgICAgeyBNQVRST1NLQV9JRF9DT0RFQ1NUQVRFLCAgICAgRUJNTF9OT05FIH0sCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgRUJNTF9VSU5ULCAwLCBvZmZzZXRvZihNYXRyb3NrYUJsb2NrLCBub25fc2ltcGxlKSwgeyAudSA9IDEgfSB9LAogICAgIHsgMCB9CkBAIC02NjQsMTYgKzc1OCwyMSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWF0cm9za2FfZG9jdHlwZXNbXSA9IHsgIm1hdHJvc2thIiwgIndlYm0iIH07CiAKK3N0YXRpYyBpbnQgbWF0cm9za2FfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpOworCiBzdGF0aWMgaW50IG1hdHJvc2thX3Jlc3luYyhNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsIGludDY0X3QgbGFzdF9wb3MpCiB7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gbWF0cm9za2EtPmN0eC0+cGI7CisgICAgaW50NjRfdCByZXQ7CiAgICAgdWludDMyX3QgaWQ7CiAgICAgbWF0cm9za2EtPmN1cnJlbnRfaWQgPSAwOwogICAgIG1hdHJvc2thLT5udW1fbGV2ZWxzID0gMDsKIAogICAgIC8qIHNlZWsgdG8gbmV4dCBwb3NpdGlvbiB0byByZXN5bmMgZnJvbSAqLwotICAgIGlmIChhdmlvX3NlZWsocGIsIGxhc3RfcG9zICsgMSwgU0VFS19TRVQpIDwgMCkKLSAgICAgICAgZ290byBlb2Y7CisgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocGIsIGxhc3RfcG9zICsgMSwgU0VFS19TRVQpKSA8IDApIHsKKyAgICAgICAgbWF0cm9za2EtPmRvbmUgPSAxOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KIAogICAgIGlkID0gYXZpb19yYjMyKHBiKTsKIApAQCAtNjg5LDcgKzc4OCw2IEBACiAgICAgICAgIGlkID0gKGlkIDw8IDgpIHwgYXZpb19yOChwYik7CiAgICAgfQogCi1lb2Y6CiAgICAgbWF0cm9za2EtPmRvbmUgPSAxOwogICAgIHJldHVybiBBVkVSUk9SX0VPRjsKIH0KQEAgLTg2NSwxNCArOTYzLDE5IEBACiAgKi8KIHN0YXRpYyBpbnQgZWJtbF9yZWFkX2JpbmFyeShBVklPQ29udGV4dCAqcGIsIGludCBsZW5ndGgsIEVibWxCaW4gKmJpbikKIHsKLSAgICBhdl9mYXN0X3BhZGRlZF9tYWxsb2MoJmJpbi0+ZGF0YSwgJmJpbi0+c2l6ZSwgbGVuZ3RoKTsKLSAgICBpZiAoIWJpbi0+ZGF0YSkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpbnQgcmV0OwogCisgICAgcmV0ID0gYXZfYnVmZmVyX3JlYWxsb2MoJmJpbi0+YnVmLCBsZW5ndGggKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBtZW1zZXQoYmluLT5idWYtPmRhdGEgKyBsZW5ndGgsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworCisgICAgYmluLT5kYXRhID0gYmluLT5idWYtPmRhdGE7CiAgICAgYmluLT5zaXplID0gbGVuZ3RoOwogICAgIGJpbi0+cG9zICA9IGF2aW9fdGVsbChwYik7CiAgICAgaWYgKGF2aW9fcmVhZChwYiwgYmluLT5kYXRhLCBsZW5ndGgpICE9IGxlbmd0aCkgewotICAgICAgICBhdl9mcmVlcCgmYmluLT5kYXRhKTsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZiaW4tPmJ1Zik7CisgICAgICAgIGJpbi0+ZGF0YSA9IE5VTEw7CiAgICAgICAgIGJpbi0+c2l6ZSA9IDA7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAgICAgfQpAQCAtOTc3LDYgKzEwODAsOSBAQAogCiAgICAgZm9yIChpID0gMDsgc3ludGF4W2ldLmlkOyBpKyspCiAgICAgICAgIHN3aXRjaCAoc3ludGF4W2ldLnR5cGUpIHsKKyAgICAgICAgY2FzZSBFQk1MX1NJTlQ6CisgICAgICAgICAgICAqKGludDY0X3QgKikgKChjaGFyICopIGRhdGEgKyBzeW50YXhbaV0uZGF0YV9vZmZzZXQpID0gc3ludGF4W2ldLmRlZi5pOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRUJNTF9VSU5UOgogICAgICAgICAgICAgKih1aW50NjRfdCAqKSAoKGNoYXIgKikgZGF0YSArIHN5bnRheFtpXS5kYXRhX29mZnNldCkgPSBzeW50YXhbaV0uZGVmLnU7CiAgICAgICAgICAgICBicmVhazsKQEAgLTExNTIsNyArMTI1OCw3IEBACiAgICAgICAgICAgICBhdl9mcmVlcChkYXRhX29mZik7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBFQk1MX0JJTjoKLSAgICAgICAgICAgIGF2X2ZyZWVwKCYoKEVibWxCaW4gKikgZGF0YV9vZmYpLT5kYXRhKTsKKyAgICAgICAgICAgIGF2X2J1ZmZlcl91bnJlZigmKChFYm1sQmluICopIGRhdGFfb2ZmKS0+YnVmKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEVCTUxfTEVWRUwxOgogICAgICAgICBjYXNlIEVCTUxfTkVTVDoKQEAgLTExNjMsNiArMTI2OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICBqKyssIHB0ciArPSBzeW50YXhbaV0ubGlzdF9lbGVtX3NpemUpCiAgICAgICAgICAgICAgICAgICAgIGVibWxfZnJlZShzeW50YXhbaV0uZGVmLm4sIHB0cik7CiAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmxpc3QtPmVsZW0pOworICAgICAgICAgICAgICAgIGxpc3QtPm5iX2VsZW0gPSAwOwogICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgZWJtbF9mcmVlKHN5bnRheFtpXS5kZWYubiwgZGF0YV9vZmYpOwogICAgICAgICBkZWZhdWx0OgpAQCAtMTI2MCw3ICsxMzY3LDcgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogCiAgICAgICAgIHBrdF9zaXplID0gaXNpemUgKyBoZWFkZXJfc2l6ZTsKLSAgICAgICAgcGt0X2RhdGEgPSBhdl9tYWxsb2MocGt0X3NpemUpOworICAgICAgICBwa3RfZGF0YSA9IGF2X21hbGxvYyhwa3Rfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgICAgICBpZiAoIXBrdF9kYXRhKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIApAQCAtMTI3Miw3ICsxMzc5LDggQEAKICAgICBjYXNlIE1BVFJPU0tBX1RSQUNLX0VOQ09ESU5HX0NPTVBfTFpPOgogICAgICAgICBkbyB7CiAgICAgICAgICAgICBvbGVuICAgICAgID0gcGt0X3NpemUgKj0gMzsKLSAgICAgICAgICAgIG5ld3BrdGRhdGEgPSBhdl9yZWFsbG9jKHBrdF9kYXRhLCBwa3Rfc2l6ZSArIEFWX0xaT19PVVRQVVRfUEFERElORyk7CisgICAgICAgICAgICBuZXdwa3RkYXRhID0gYXZfcmVhbGxvYyhwa3RfZGF0YSwgcGt0X3NpemUgKyBBVl9MWk9fT1VUUFVUX1BBRERJTkcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgICAgICAgICAgaWYgKCFuZXdwa3RkYXRhKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgICAgIGdvdG8gZmFpbGVkOwpAQCAtMTI5Nyw3ICsxNDA1LDcgQEAKICAgICAgICAgenN0cmVhbS5hdmFpbF9pbiA9IGlzaXplOwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBwa3Rfc2l6ZSAgKj0gMzsKLSAgICAgICAgICAgIG5ld3BrdGRhdGEgPSBhdl9yZWFsbG9jKHBrdF9kYXRhLCBwa3Rfc2l6ZSk7CisgICAgICAgICAgICBuZXdwa3RkYXRhID0gYXZfcmVhbGxvYyhwa3RfZGF0YSwgcGt0X3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKICAgICAgICAgICAgIGlmICghbmV3cGt0ZGF0YSkgewogICAgICAgICAgICAgICAgIGluZmxhdGVFbmQoJnpzdHJlYW0pOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFWRVJST1IoRU5PTUVNKTsKQEAgLTEzMzAsNyArMTQzOCw3IEBACiAgICAgICAgIGJ6c3RyZWFtLmF2YWlsX2luID0gaXNpemU7CiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIHBrdF9zaXplICAqPSAzOwotICAgICAgICAgICAgbmV3cGt0ZGF0YSA9IGF2X3JlYWxsb2MocGt0X2RhdGEsIHBrdF9zaXplKTsKKyAgICAgICAgICAgIG5ld3BrdGRhdGEgPSBhdl9yZWFsbG9jKHBrdF9kYXRhLCBwa3Rfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgICAgICAgICAgaWYgKCFuZXdwa3RkYXRhKSB7CiAgICAgICAgICAgICAgICAgQloyX2J6RGVjb21wcmVzc0VuZCgmYnpzdHJlYW0pOwogICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFWRVJST1IoRU5PTUVNKTsKQEAgLTEzNTcsNiArMTQ2NSw4IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAorICAgIG1lbXNldChwa3RfZGF0YSArIHBrdF9zaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKwogICAgICpidWYgICAgICA9IHBrdF9kYXRhOwogICAgICpidWZfc2l6ZSA9IHBrdF9zaXplOwogICAgIHJldHVybiAwOwpAQCAtMTUxNyw3ICsxNjI3LDcgQEAKICAgICBpbnQgaTsKIAogICAgIC8vIHdlIHNob3VsZCBub3QgZG8gYW55IHNlZWtpbmcgaW4gdGhlIHN0cmVhbWluZyBjYXNlCi0gICAgaWYgKCFtYXRyb3NrYS0+Y3R4LT5wYi0+c2Vla2FibGUpCisgICAgaWYgKCEobWF0cm9za2EtPmN0eC0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpKQogICAgICAgICByZXR1cm47CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgc2Vla2hlYWRfbGlzdC0+bmJfZWxlbTsgaSsrKSB7CkBAIC0xNjIwLDEzICsxNzMwLDggQEAKIAogc3RhdGljIHZvaWQgbWF0cm9za2FfbWV0YWRhdGFfY3JlYXRpb25fdGltZShBVkRpY3Rpb25hcnkgKiptZXRhZGF0YSwgaW50NjRfdCBkYXRlX3V0YykKIHsKLSAgICBjaGFyIGJ1ZmZlclszMl07CiAgICAgLyogQ29udmVydCB0byBzZWNvbmRzIGFuZCBhZGp1c3QgYnkgbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiAyMDAxLTAxLTAxIGFuZCBFcG9jaCAqLwotICAgIHRpbWVfdCBjcmVhdGlvbl90aW1lID0gZGF0ZV91dGMgLyAxMDAwMDAwMDAwICsgOTc4MzA3MjAwOwotICAgIHN0cnVjdCB0bSB0bXBidWYsICpwdG0gPSBnbXRpbWVfcigmY3JlYXRpb25fdGltZSwgJnRtcGJ1Zik7Ci0gICAgaWYgKCFwdG0pIHJldHVybjsKLSAgICBpZiAoc3RyZnRpbWUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVZLSVtLSVkICVIOiVNOiVTIiwgcHRtKSkKLSAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsICJjcmVhdGlvbl90aW1lIiwgYnVmZmVyLCAwKTsKKyAgICBhdnByaXZfZGljdF9zZXRfdGltZXN0YW1wKG1ldGFkYXRhLCAiY3JlYXRpb25fdGltZSIsIGRhdGVfdXRjIC8gMTAwMCArIDk3ODMwNzIwMDAwMDAwMExMKTsKIH0KIAogc3RhdGljIGludCBtYXRyb3NrYV9wYXJzZV9mbGFjKEFWRm9ybWF0Q29udGV4dCAqcywKQEAgLTE2NzIsNyArMTc3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIG9mIFdBVkVGT1JNQVRFWFRFTlNJQkxFX0NIQU5ORUxfTUFTS1xuIik7CiAgICAgICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBtYXNrOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gbWFzazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmZGljdCk7CiAgICAgICAgIH0KQEAgLTE2ODQsNyArMTc4OSwzNSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBta3Zfc3RlcmVvX21vZGVfZGlzcGxheV9tdWwoaW50IHN0ZXJlb19tb2RlLCBpbnQgKmhfd2lkdGgsIGludCAqaF9oZWlnaHQpCitzdGF0aWMgaW50IG1rdl9maWVsZF9vcmRlcihNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsIGludDY0X3QgZmllbGRfb3JkZXIpCit7CisgICAgaW50IG1ham9yLCBtaW5vciwgbWljcm8sIGJ0dGIgPSAwOworCisgICAgLyogd29ya2Fyb3VuZCBhIGJ1ZyBpbiBvdXIgTWF0cm9za2EgbXV4ZXIsIGludHJvZHVjZWQgaW4gdmVyc2lvbiA1Ny4zNiBhbG9uZ3NpZGUKKyAgICAgKiB0aGlzIGZ1bmN0aW9uLCBhbmQgZml4ZWQgaW4gNTcuNTIgKi8KKyAgICBpZiAobWF0cm9za2EtPm11eGluZ2FwcCAmJiBzc2NhbmYobWF0cm9za2EtPm11eGluZ2FwcCwgIkxhdmYlZC4lZC4lZCIsICZtYWpvciwgJm1pbm9yLCAmbWljcm8pID09IDMpCisgICAgICAgIGJ0dGIgPSAobWFqb3IgPT0gNTcgJiYgbWlub3IgPj0gMzYgJiYgbWlub3IgPD0gNTEgJiYgbWljcm8gPj0gMTAwKTsKKworICAgIHN3aXRjaCAoZmllbGRfb3JkZXIpIHsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfUFJPR1JFU1NJVkU6CisgICAgICAgIHJldHVybiBBVl9GSUVMRF9QUk9HUkVTU0lWRTsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfVU5ERVRFUk1JTkVEOgorICAgICAgICByZXR1cm4gQVZfRklFTERfVU5LTk9XTjsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfVFQ6CisgICAgICAgIHJldHVybiBBVl9GSUVMRF9UVDsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfQkI6CisgICAgICAgIHJldHVybiBBVl9GSUVMRF9CQjsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfQlQ6CisgICAgICAgIHJldHVybiBidHRiID8gQVZfRklFTERfVEIgOiBBVl9GSUVMRF9CVDsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfVEI6CisgICAgICAgIHJldHVybiBidHRiID8gQVZfRklFTERfQlQgOiBBVl9GSUVMRF9UQjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZfRklFTERfVU5LTk9XTjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1rdl9zdGVyZW9fbW9kZV9kaXNwbGF5X211bChpbnQgc3RlcmVvX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpoX3dpZHRoLCBpbnQgKmhfaGVpZ2h0KQogewogICAgIHN3aXRjaCAoc3RlcmVvX21vZGUpIHsKICAgICAgICAgY2FzZSBNQVRST1NLQV9WSURFT19TVEVSRU9NT0RFX1RZUEVfTU9OTzoKQEAgLTE3MDgsNiArMTg0MSwxOTkgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBpbnQgbWt2X3BhcnNlX3ZpZGVvX2NvbG9yKEFWU3RyZWFtICpzdCwgY29uc3QgTWF0cm9za2FUcmFjayAqdHJhY2spIHsKKyAgICBjb25zdCBNYXRyb3NrYVRyYWNrVmlkZW9Db2xvciAqY29sb3IgPSB0cmFjay0+dmlkZW8uY29sb3IuZWxlbTsKKyAgICBjb25zdCBNYXRyb3NrYU1hc3RlcmluZ01ldGEgKm1hc3RlcmluZ19tZXRhOworICAgIGludCBoYXNfbWFzdGVyaW5nX3ByaW1hcmllcywgaGFzX21hc3RlcmluZ19sdW1pbmFuY2U7CisKKyAgICBpZiAoIXRyYWNrLT52aWRlby5jb2xvci5uYl9lbGVtKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG1hc3RlcmluZ19tZXRhID0gJmNvbG9yLT5tYXN0ZXJpbmdfbWV0YTsKKyAgICAvLyBNYXN0ZXJpbmcgcHJpbWFyaWVzIGFyZSBDSUUgMTkzMSBjb29yZHMsIGFuZCBtdXN0IGJlID4gMC4KKyAgICBoYXNfbWFzdGVyaW5nX3ByaW1hcmllcyA9CisgICAgICAgIG1hc3RlcmluZ19tZXRhLT5yX3ggPiAwICYmIG1hc3RlcmluZ19tZXRhLT5yX3kgPiAwICYmCisgICAgICAgIG1hc3RlcmluZ19tZXRhLT5nX3ggPiAwICYmIG1hc3RlcmluZ19tZXRhLT5nX3kgPiAwICYmCisgICAgICAgIG1hc3RlcmluZ19tZXRhLT5iX3ggPiAwICYmIG1hc3RlcmluZ19tZXRhLT5iX3kgPiAwICYmCisgICAgICAgIG1hc3RlcmluZ19tZXRhLT53aGl0ZV94ID4gMCAmJiBtYXN0ZXJpbmdfbWV0YS0+d2hpdGVfeSA+IDA7CisgICAgaGFzX21hc3RlcmluZ19sdW1pbmFuY2UgPSBtYXN0ZXJpbmdfbWV0YS0+bWF4X2x1bWluYW5jZSA+IDA7CisKKyAgICBpZiAoY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHMgIT0gQVZDT0xfU1BDX1JFU0VSVkVEKQorICAgICAgICBzdC0+Y29kZWNwYXItPmNvbG9yX3NwYWNlID0gY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHM7CisgICAgaWYgKGNvbG9yLT5wcmltYXJpZXMgIT0gQVZDT0xfUFJJX1JFU0VSVkVEICYmCisgICAgICAgIGNvbG9yLT5wcmltYXJpZXMgIT0gQVZDT0xfUFJJX1JFU0VSVkVEMCkKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2xvcl9wcmltYXJpZXMgPSBjb2xvci0+cHJpbWFyaWVzOworICAgIGlmIChjb2xvci0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzICE9IEFWQ09MX1RSQ19SRVNFUlZFRCAmJgorICAgICAgICBjb2xvci0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzICE9IEFWQ09MX1RSQ19SRVNFUlZFRDApCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29sb3JfdHJjID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICBpZiAoY29sb3ItPnJhbmdlICE9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEICYmCisgICAgICAgIGNvbG9yLT5yYW5nZSA8PSBBVkNPTF9SQU5HRV9KUEVHKQorICAgICAgICBzdC0+Y29kZWNwYXItPmNvbG9yX3JhbmdlID0gY29sb3ItPnJhbmdlOworICAgIGlmIChjb2xvci0+Y2hyb21hX3NpdGluZ19ob3J6ICE9IE1BVFJPU0tBX0NPTE9VUl9DSFJPTUFTSVRJTkdIT1JaX1VOREVURVJNSU5FRCAmJgorICAgICAgICBjb2xvci0+Y2hyb21hX3NpdGluZ192ZXJ0ICE9IE1BVFJPU0tBX0NPTE9VUl9DSFJPTUFTSVRJTkdWRVJUX1VOREVURVJNSU5FRCAmJgorICAgICAgICBjb2xvci0+Y2hyb21hX3NpdGluZ19ob3J6ICA8IE1BVFJPU0tBX0NPTE9VUl9DSFJPTUFTSVRJTkdIT1JaX05CICYmCisgICAgICAgIGNvbG9yLT5jaHJvbWFfc2l0aW5nX3ZlcnQgIDwgTUFUUk9TS0FfQ09MT1VSX0NIUk9NQVNJVElOR1ZFUlRfTkIpIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaHJvbWFfbG9jYXRpb24gPQorICAgICAgICAgICAgYXZjb2RlY19jaHJvbWFfcG9zX3RvX2VudW0oKGNvbG9yLT5jaHJvbWFfc2l0aW5nX2hvcnogLSAxKSA8PCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbG9yLT5jaHJvbWFfc2l0aW5nX3ZlcnQgLSAxKSA8PCA3KTsKKyAgICB9CisgICAgaWYgKGNvbG9yLT5tYXhfY2xsICYmIGNvbG9yLT5tYXhfZmFsbCkgeworICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIEFWQ29udGVudExpZ2h0TWV0YWRhdGEgKm1ldGFkYXRhID0gYXZfY29udGVudF9saWdodF9tZXRhZGF0YV9hbGxvYygmc2l6ZSk7CisgICAgICAgIGlmICghbWV0YWRhdGEpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByZXQgPSBhdl9zdHJlYW1fYWRkX3NpZGVfZGF0YShzdCwgQVZfUEtUX0RBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKiltZXRhZGF0YSwgc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmbWV0YWRhdGEpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBtZXRhZGF0YS0+TWF4Q0xMICA9IGNvbG9yLT5tYXhfY2xsOworICAgICAgICBtZXRhZGF0YS0+TWF4RkFMTCA9IGNvbG9yLT5tYXhfZmFsbDsKKyAgICB9CisKKyAgICBpZiAoaGFzX21hc3RlcmluZ19wcmltYXJpZXMgfHwgaGFzX21hc3RlcmluZ19sdW1pbmFuY2UpIHsKKyAgICAgICAgLy8gVXNlIHNpbWlsYXIgcmF0aW9uYWxzIGFzIG90aGVyIHN0YW5kYXJkcy4KKyAgICAgICAgY29uc3QgaW50IGNocm9tYV9kZW4gPSA1MDAwMDsKKyAgICAgICAgY29uc3QgaW50IGx1bWFfZGVuID0gMTAwMDA7CisgICAgICAgIEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhICptZXRhZGF0YSA9CisgICAgICAgICAgICAoQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEqKSBhdl9zdHJlYW1fbmV3X3NpZGVfZGF0YSgKKyAgICAgICAgICAgICAgICBzdCwgQVZfUEtUX0RBVEFfTUFTVEVSSU5HX0RJU1BMQVlfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhKSk7CisgICAgICAgIGlmICghbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KG1ldGFkYXRhLCAwLCBzaXplb2YoQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEpKTsKKyAgICAgICAgaWYgKGhhc19tYXN0ZXJpbmdfcHJpbWFyaWVzKSB7CisgICAgICAgICAgICBtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMF1bMF0gPSBhdl9tYWtlX3EoCisgICAgICAgICAgICAgICAgcm91bmQobWFzdGVyaW5nX21ldGEtPnJfeCAqIGNocm9tYV9kZW4pLCBjaHJvbWFfZGVuKTsKKyAgICAgICAgICAgIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1swXVsxXSA9IGF2X21ha2VfcSgKKyAgICAgICAgICAgICAgICByb3VuZChtYXN0ZXJpbmdfbWV0YS0+cl95ICogY2hyb21hX2RlbiksIGNocm9tYV9kZW4pOworICAgICAgICAgICAgbWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzFdWzBdID0gYXZfbWFrZV9xKAorICAgICAgICAgICAgICAgIHJvdW5kKG1hc3RlcmluZ19tZXRhLT5nX3ggKiBjaHJvbWFfZGVuKSwgY2hyb21hX2Rlbik7CisgICAgICAgICAgICBtZXRhZGF0YS0+ZGlzcGxheV9wcmltYXJpZXNbMV1bMV0gPSBhdl9tYWtlX3EoCisgICAgICAgICAgICAgICAgcm91bmQobWFzdGVyaW5nX21ldGEtPmdfeSAqIGNocm9tYV9kZW4pLCBjaHJvbWFfZGVuKTsKKyAgICAgICAgICAgIG1ldGFkYXRhLT5kaXNwbGF5X3ByaW1hcmllc1syXVswXSA9IGF2X21ha2VfcSgKKyAgICAgICAgICAgICAgICByb3VuZChtYXN0ZXJpbmdfbWV0YS0+Yl94ICogY2hyb21hX2RlbiksIGNocm9tYV9kZW4pOworICAgICAgICAgICAgbWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzJdWzFdID0gYXZfbWFrZV9xKAorICAgICAgICAgICAgICAgIHJvdW5kKG1hc3RlcmluZ19tZXRhLT5iX3kgKiBjaHJvbWFfZGVuKSwgY2hyb21hX2Rlbik7CisgICAgICAgICAgICBtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMF0gPSBhdl9tYWtlX3EoCisgICAgICAgICAgICAgICAgcm91bmQobWFzdGVyaW5nX21ldGEtPndoaXRlX3ggKiBjaHJvbWFfZGVuKSwgY2hyb21hX2Rlbik7CisgICAgICAgICAgICBtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMV0gPSBhdl9tYWtlX3EoCisgICAgICAgICAgICAgICAgcm91bmQobWFzdGVyaW5nX21ldGEtPndoaXRlX3kgKiBjaHJvbWFfZGVuKSwgY2hyb21hX2Rlbik7CisgICAgICAgICAgICBtZXRhZGF0YS0+aGFzX3ByaW1hcmllcyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhc19tYXN0ZXJpbmdfbHVtaW5hbmNlKSB7CisgICAgICAgICAgICBtZXRhZGF0YS0+bWF4X2x1bWluYW5jZSA9IGF2X21ha2VfcSgKKyAgICAgICAgICAgICAgICByb3VuZChtYXN0ZXJpbmdfbWV0YS0+bWF4X2x1bWluYW5jZSAqIGx1bWFfZGVuKSwgbHVtYV9kZW4pOworICAgICAgICAgICAgbWV0YWRhdGEtPm1pbl9sdW1pbmFuY2UgPSBhdl9tYWtlX3EoCisgICAgICAgICAgICAgICAgcm91bmQobWFzdGVyaW5nX21ldGEtPm1pbl9sdW1pbmFuY2UgKiBsdW1hX2RlbiksIGx1bWFfZGVuKTsKKyAgICAgICAgICAgIG1ldGFkYXRhLT5oYXNfbHVtaW5hbmNlID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBta3ZfcGFyc2VfdmlkZW9fcHJvamVjdGlvbihBVlN0cmVhbSAqc3QsIGNvbnN0IE1hdHJvc2thVHJhY2sgKnRyYWNrKSB7CisgICAgQVZTcGhlcmljYWxNYXBwaW5nICpzcGhlcmljYWw7CisgICAgZW51bSBBVlNwaGVyaWNhbFByb2plY3Rpb24gcHJvamVjdGlvbjsKKyAgICBzaXplX3Qgc3BoZXJpY2FsX3NpemU7CisgICAgdWludDMyX3QgbCA9IDAsIHQgPSAwLCByID0gMCwgYiA9IDA7CisgICAgdWludDMyX3QgcGFkZGluZyA9IDA7CisgICAgaW50IHJldDsKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCB0cmFjay0+dmlkZW8ucHJvamVjdGlvbi5wcml2YXRlLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICB0cmFjay0+dmlkZW8ucHJvamVjdGlvbi5wcml2YXRlLnNpemUpOworCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYikgIT0gMCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIHNwaGVyaWNhbCBtZXRhZGF0YVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJ5dGVzdHJlYW0yX3NraXAoJmdiLCAzKTsgLy8gZmxhZ3MKKworICAgIHN3aXRjaCAodHJhY2stPnZpZGVvLnByb2plY3Rpb24udHlwZSkgeworICAgIGNhc2UgTUFUUk9TS0FfVklERU9fUFJPSkVDVElPTl9UWVBFX0VRVUlSRUNUQU5HVUxBUjoKKyAgICAgICAgaWYgKHRyYWNrLT52aWRlby5wcm9qZWN0aW9uLnByaXZhdGUuc2l6ZSA9PSAyMCkgeworICAgICAgICAgICAgdCA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisgICAgICAgICAgICBiID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzIoJmdiKTsKKyAgICAgICAgICAgIGwgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICAgICAgciA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKCZnYik7CisKKyAgICAgICAgICAgIGlmIChiID49IFVJTlRfTUFYIC0gdCB8fCByID49IFVJTlRfTUFYIC0gbCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJvdW5kaW5nIHJlY3RhbmdsZSBjb29yZGluYXRlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICIlIlBSSXUzMiIsJSJQUkl1MzIiLCUiUFJJdTMyIiwlIlBSSXUzMiJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGwsIHQsIHIsIGIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT52aWRlby5wcm9qZWN0aW9uLnByaXZhdGUuc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBzcGhlcmljYWwgbWV0YWRhdGFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICBpZiAobCB8fCB0IHx8IHIgfHwgYikKKyAgICAgICAgICAgIHByb2plY3Rpb24gPSBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSX1RJTEU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByb2plY3Rpb24gPSBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE1BVFJPU0tBX1ZJREVPX1BST0pFQ1RJT05fVFlQRV9DVUJFTUFQOgorICAgICAgICBpZiAodHJhY2stPnZpZGVvLnByb2plY3Rpb24ucHJpdmF0ZS5zaXplIDwgNCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcHJvamVjdGlvbiBwcml2YXRlIHByb3BlcnRpZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnZpZGVvLnByb2plY3Rpb24ucHJpdmF0ZS5zaXplID09IDEyKSB7CisgICAgICAgICAgICB1aW50MzJfdCBsYXlvdXQgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICAgICAgaWYgKGxheW91dCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIlVua25vd24gc3BoZXJpY2FsIGN1YmVtYXAgbGF5b3V0ICUiUFJJdTMyIlxuIiwgbGF5b3V0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2plY3Rpb24gPSBBVl9TUEhFUklDQUxfQ1VCRU1BUDsKKyAgICAgICAgICAgIHBhZGRpbmcgPSBieXRlc3RyZWFtMl9nZXRfYmUzMigmZ2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gc3BoZXJpY2FsIG1ldGFkYXRhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTUFUUk9TS0FfVklERU9fUFJPSkVDVElPTl9UWVBFX1JFQ1RBTkdVTEFSOgorICAgICAgICAvKiBObyBTcGhlcmljYWwgbWV0YWRhdGEgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgIlVua25vd24gc3BoZXJpY2FsIG1ldGFkYXRhIHR5cGUgJSJQUkl1NjQiXG4iLAorICAgICAgICAgICAgICAgdHJhY2stPnZpZGVvLnByb2plY3Rpb24udHlwZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHNwaGVyaWNhbCA9IGF2X3NwaGVyaWNhbF9hbGxvYygmc3BoZXJpY2FsX3NpemUpOworICAgIGlmICghc3BoZXJpY2FsKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc3BoZXJpY2FsLT5wcm9qZWN0aW9uID0gcHJvamVjdGlvbjsKKworICAgIHNwaGVyaWNhbC0+eWF3ICAgPSAoaW50MzJfdCkgKHRyYWNrLT52aWRlby5wcm9qZWN0aW9uLnlhdyAgICogKDEgPDwgMTYpKTsKKyAgICBzcGhlcmljYWwtPnBpdGNoID0gKGludDMyX3QpICh0cmFjay0+dmlkZW8ucHJvamVjdGlvbi5waXRjaCAqICgxIDw8IDE2KSk7CisgICAgc3BoZXJpY2FsLT5yb2xsICA9IChpbnQzMl90KSAodHJhY2stPnZpZGVvLnByb2plY3Rpb24ucm9sbCAgKiAoMSA8PCAxNikpOworCisgICAgc3BoZXJpY2FsLT5wYWRkaW5nID0gcGFkZGluZzsKKworICAgIHNwaGVyaWNhbC0+Ym91bmRfbGVmdCAgID0gbDsKKyAgICBzcGhlcmljYWwtPmJvdW5kX3RvcCAgICA9IHQ7CisgICAgc3BoZXJpY2FsLT5ib3VuZF9yaWdodCAgPSByOworICAgIHNwaGVyaWNhbC0+Ym91bmRfYm90dG9tID0gYjsKKworICAgIHJldCA9IGF2X3N0cmVhbV9hZGRfc2lkZV9kYXRhKHN0LCBBVl9QS1RfREFUQV9TUEhFUklDQUwsICh1aW50OF90ICopc3BoZXJpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwaGVyaWNhbF9zaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9mcmVlcCgmc3BoZXJpY2FsKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBnZXRfcXRfY29kZWMoTWF0cm9za2FUcmFjayAqdHJhY2ssIHVpbnQzMl90ICpmb3VyY2MsIGVudW0gQVZDb2RlY0lEICpjb2RlY19pZCkKIHsKICAgICBjb25zdCBBVkNvZGVjVGFnICpjb2RlY190YWdzOwpAQCAtMTcxOSwxMiArMjA0NSwxMyBAQAogICAgICAqIGJ5IGV4cGFuZGluZy9zaGlmdGluZyB0aGUgZGF0YSBieSA0IGJ5dGVzIGFuZCBzdG9yaW5nIHRoZSBkYXRhCiAgICAgICogc2l6ZSBhdCB0aGUgc3RhcnQuICovCiAgICAgaWYgKGZmX2NvZGVjX2dldF9pZChjb2RlY190YWdzLCBBVl9STDMyKHRyYWNrLT5jb2RlY19wcml2LmRhdGEpKSkgewotICAgICAgICB1aW50OF90ICpwID0gYXZfcmVhbGxvYyh0cmFjay0+Y29kZWNfcHJpdi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplICsgNCk7Ci0gICAgICAgIGlmICghcCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIG1lbW1vdmUocCArIDQsIHAsIHRyYWNrLT5jb2RlY19wcml2LnNpemUpOwotICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5kYXRhID0gcDsKKyAgICAgICAgaW50IHJldCA9IGF2X2J1ZmZlcl9yZWFsbG9jKCZ0cmFjay0+Y29kZWNfcHJpdi5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplICsgNCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuZGF0YSA9IHRyYWNrLT5jb2RlY19wcml2LmJ1Zi0+ZGF0YTsKKyAgICAgICAgbWVtbW92ZSh0cmFjay0+Y29kZWNfcHJpdi5kYXRhICsgNCwgdHJhY2stPmNvZGVjX3ByaXYuZGF0YSwgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSk7CiAgICAgICAgIHRyYWNrLT5jb2RlY19wcml2LnNpemUgKz0gNDsKICAgICAgICAgQVZfV0IzMih0cmFjay0+Y29kZWNfcHJpdi5kYXRhLCB0cmFjay0+Y29kZWNfcHJpdi5zaXplKTsKICAgICB9CkBAIC0xNzc4LDggKzIxMDUsMTYgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICh0cmFjay0+dHlwZSA9PSBNQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICBpZiAoIXRyYWNrLT5kZWZhdWx0X2R1cmF0aW9uICYmIHRyYWNrLT52aWRlby5mcmFtZV9yYXRlID4gMCkKLSAgICAgICAgICAgICAgICB0cmFjay0+ZGVmYXVsdF9kdXJhdGlvbiA9IDEwMDAwMDAwMDAgLyB0cmFjay0+dmlkZW8uZnJhbWVfcmF0ZTsKKyAgICAgICAgICAgIGlmICghdHJhY2stPmRlZmF1bHRfZHVyYXRpb24gJiYgdHJhY2stPnZpZGVvLmZyYW1lX3JhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgZG91YmxlIGRlZmF1bHRfZHVyYXRpb24gPSAxMDAwMDAwMDAwIC8gdHJhY2stPnZpZGVvLmZyYW1lX3JhdGU7CisgICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRfZHVyYXRpb24gPiBVSU5UNjRfTUFYIHx8IGRlZmF1bHRfZHVyYXRpb24gPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBmcmFtZSByYXRlICVlLiBDYW5ub3QgY2FsY3VsYXRlIGRlZmF1bHQgZHVyYXRpb24uXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT52aWRlby5mcmFtZV9yYXRlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZGVmYXVsdF9kdXJhdGlvbiA9IGRlZmF1bHRfZHVyYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT52aWRlby5kaXNwbGF5X3dpZHRoID09IC0xKQogICAgICAgICAgICAgICAgIHRyYWNrLT52aWRlby5kaXNwbGF5X3dpZHRoID0gdHJhY2stPnZpZGVvLnBpeGVsX3dpZHRoOwogICAgICAgICAgICAgaWYgKHRyYWNrLT52aWRlby5kaXNwbGF5X2hlaWdodCA9PSAtMSkKQEAgLTE4MzcsOCArMjE3MiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBkZWNvZGUgY29kZWMgcHJpdmF0ZSBkYXRhXG4iKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoY29kZWNfcHJpdiAhPSB0cmFjay0+Y29kZWNfcHJpdi5kYXRhKQotICAgICAgICAgICAgICAgICAgICBhdl9mcmVlKGNvZGVjX3ByaXYpOworICAgICAgICAgICAgICAgIGlmIChjb2RlY19wcml2ICE9IHRyYWNrLT5jb2RlY19wcml2LmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZ0cmFjay0+Y29kZWNfcHJpdi5idWYpOworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmNvZGVjX3ByaXYuZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuYnVmID0gYXZfYnVmZmVyX2NyZWF0ZSh0cmFjay0+Y29kZWNfcHJpdi5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrLT5jb2RlY19wcml2LmJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ0cmFjay0+Y29kZWNfcHJpdi5kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE4ODEsMTEgKzIyMjcsMTEgQEAKICAgICAgICAgICAgIGZmaW9faW5pdF9jb250ZXh0KCZiLCB0cmFjay0+Y29kZWNfcHJpdi5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICAgICAgICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgJmIsIHN0LT5jb2RlYywgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSwgMCk7CisgICAgICAgICAgICByZXQgPSBmZl9nZXRfd2F2X2hlYWRlcihzLCAmYiwgc3QtPmNvZGVjcGFyLCB0cmFjay0+Y29kZWNfcHJpdi5zaXplLCAwKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICBjb2RlY19pZCAgICAgICAgID0gc3QtPmNvZGVjLT5jb2RlY19pZDsKLSAgICAgICAgICAgIGZvdXJjYyAgICAgICAgICAgPSBzdC0+Y29kZWMtPmNvZGVjX3RhZzsKKyAgICAgICAgICAgIGNvZGVjX2lkICAgICAgICAgPSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkOworICAgICAgICAgICAgZm91cmNjICAgICAgICAgICA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnOwogICAgICAgICAgICAgZXh0cmFkYXRhX29mZnNldCA9IEZGTUlOKHRyYWNrLT5jb2RlY19wcml2LnNpemUsIDE4KTsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHRyYWNrLT5jb2RlY19pZCwgIkFfUVVJQ0tUSU1FIikKICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWxseSAzNiwgYnV0IGFsbG93IG5vbmNvbXBsaWFudCBwcml2YXRlIGRhdGEgKi8KQEAgLTE5MTksMjAgKzIyNjUsMTcgQEAKICAgICAgICAgICAgICAgICBmb3VyY2MgPSBNS1RBRygnUycsJ1YnLCdRJywnMycpOwogICAgICAgICAgICAgICAgIGNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGZvdXJjYyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgewotICAgICAgICAgICAgICAgIGNoYXIgYnVmWzMyXTsKLSAgICAgICAgICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyhidWYsIHNpemVvZihidWYpLCBmb3VyY2MpOworICAgICAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCiAgICAgICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIm1vdiBGb3VyQ0Mgbm90IGZvdW5kICVzLlxuIiwgYnVmKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIm1vdiBGb3VyQ0Mgbm90IGZvdW5kICVzLlxuIiwgYXZfZm91cmNjMnN0cihmb3VyY2MpKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+Y29kZWNfcHJpdi5zaXplID49IDg2KSB7CiAgICAgICAgICAgICAgICAgYml0X2RlcHRoID0gQVZfUkIxNih0cmFjay0+Y29kZWNfcHJpdi5kYXRhICsgODIpOwogICAgICAgICAgICAgICAgIGZmaW9faW5pdF9jb250ZXh0KCZiLCB0cmFjay0+Y29kZWNfcHJpdi5kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5jb2RlY19wcml2LnNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKGZmX2dldF9xdHBhbGV0dGUoY29kZWNfaWQsICZiLCBtYXRyb3NrYS0+cGFsZXR0ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmZfZ2V0X3F0cGFsZXR0ZShjb2RlY19pZCwgJmIsIHRyYWNrLT5wYWxldHRlKSkgewogICAgICAgICAgICAgICAgICAgICBiaXRfZGVwdGggJj0gMHgxRjsKLSAgICAgICAgICAgICAgICAgICAgbWF0cm9za2EtPmhhc19wYWxldHRlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPmhhc19wYWxldHRlID0gMTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFKSB7CkBAIC0yMDUwLDIyICsyMzkzLDIyIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPmF1ZGlvLmNvZGVkX2ZyYW1lc2l6ZSA8PSAwIHx8CiAgICAgICAgICAgICAgICAgdHJhY2stPmF1ZGlvLnN1Yl9wYWNrZXRfaCAgICA8PSAwIHx8CiAgICAgICAgICAgICAgICAgdHJhY2stPmF1ZGlvLmZyYW1lX3NpemUgICAgICA8PSAwIHx8Ci0gICAgICAgICAgICAgICAgdHJhY2stPmF1ZGlvLnN1Yl9wYWNrZXRfc2l6ZSA8PSAwKQorICAgICAgICAgICAgICAgIHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X3NpemUgPD0gMCAmJiBjb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9TSVBSKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgdHJhY2stPmF1ZGlvLmJ1ZiA9IGF2X21hbGxvY19hcnJheSh0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+YXVkaW8uZnJhbWVfc2l6ZSk7CiAgICAgICAgICAgICBpZiAoIXRyYWNrLT5hdWRpby5idWYpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQV8yODgpIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gdHJhY2stPmF1ZGlvLmNvZGVkX2ZyYW1lc2l6ZTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gdHJhY2stPmF1ZGlvLmNvZGVkX2ZyYW1lc2l6ZTsKICAgICAgICAgICAgICAgICB0cmFjay0+Y29kZWNfcHJpdi5zaXplID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NJUFIgJiYgZmxhdm9yIDwgNCkgewogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHNpcHJfYml0X3JhdGVbNF0gPSB7IDY1MDQsIDg0OTYsIDUwMDAsIDE2MDAwIH07CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X3NpemUgPSBmZl9zaXByX3N1YnBrX3NpemVbZmxhdm9yXTsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICAgICAgICA9IHNpcHJfYml0X3JhdGVbZmxhdm9yXTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICAgICAgICA9IHNpcHJfYml0X3JhdGVbZmxhdm9yXTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X3NpemU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IHRyYWNrLT5hdWRpby5zdWJfcGFja2V0X3NpemU7CiAgICAgICAgICAgICAgICAgZXh0cmFkYXRhX29mZnNldCAgICAgICA9IDc4OwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMQUMgJiYgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSkgewpAQCAtMjA3NCw2ICsyNDE3LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfSBlbHNlIGlmIChjb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QUk9SRVMgJiYgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSA9PSA0KSB7CiAgICAgICAgICAgICBmb3VyY2MgPSBBVl9STDMyKHRyYWNrLT5jb2RlY19wcml2LmRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQOSAmJiB0cmFjay0+Y29kZWNfcHJpdi5zaXplKSB7CisgICAgICAgICAgICAvKiB3ZSBkb24ndCBuZWVkIGFueSB2YWx1ZSBzdG9yZWQgaW4gQ29kZWNQcml2YXRlLgorICAgICAgICAgICAgICAgbWFrZSBzdXJlIHRoYXQgaXQncyBub3QgZXhwb3J0ZWQgYXMgZXh0cmFkYXRhLiAqLworICAgICAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSAtPSBleHRyYWRhdGFfb2Zmc2V0OwogCkBAIC0yMDg3LDExICsyNDM0LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCAqIDEwMDAgKiAxMDAwKTsgICAgLyogNjQgYml0IHB0cyBpbiBucyAqLwogCiAgICAgICAgIC8qIGNvbnZlcnQgdGhlIGRlbGF5IGZyb20gbnMgdG8gdGhlIHRyYWNrIHRpbWViYXNlICovCi0gICAgICAgIHRyYWNrLT5jb2RlY19kZWxheSA9IGF2X3Jlc2NhbGVfcSh0cmFjay0+Y29kZWNfZGVsYXksCisgICAgICAgIHRyYWNrLT5jb2RlY19kZWxheV9pbl90cmFja190YiA9IGF2X3Jlc2NhbGVfcSh0cmFjay0+Y29kZWNfZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7IDEsIDEwMDAwMDAwMDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UpOwogCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBjb2RlY19pZDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGNvZGVjX2lkOwogCiAgICAgICAgIGlmIChzdHJjbXAodHJhY2stPmxhbmd1YWdlLCAidW5kIikpCiAgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCB0cmFjay0+bGFuZ3VhZ2UsIDApOwpAQCAtMjEwMiwxNCArMjQ0OSwxNCBAQAogICAgICAgICBpZiAodHJhY2stPmZsYWdfZm9yY2VkKQogICAgICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uIHw9IEFWX0RJU1BPU0lUSU9OX0ZPUkNFRDsKIAotICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgIGlmICghc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpIHsKICAgICAgICAgICAgIGlmIChleHRyYWRhdGEpIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSAgICAgID0gZXh0cmFkYXRhOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBleHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSAgICAgID0gZXh0cmFkYXRhOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSBleHRyYWRhdGFfc2l6ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmNvZGVjX3ByaXYuZGF0YSAmJiB0cmFjay0+Y29kZWNfcHJpdi5zaXplID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCB0cmFjay0+Y29kZWNfcHJpdi5zaXplKSkKKyAgICAgICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgdHJhY2stPmNvZGVjX3ByaXYuc2l6ZSkpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgIG1lbWNweShzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmNvZGVjX3ByaXYuZGF0YSArIGV4dHJhZGF0YV9vZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5jb2RlY19wcml2LnNpemUpOwogICAgICAgICAgICAgfQpAQCAtMjEyMCwyMiArMjQ2NywyOSBAQAogICAgICAgICAgICAgaW50IGRpc3BsYXlfd2lkdGhfbXVsICA9IDE7CiAgICAgICAgICAgICBpbnQgZGlzcGxheV9oZWlnaHRfbXVsID0gMTsKIAotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgID0gZm91cmNjOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gZm91cmNjOwogICAgICAgICAgICAgaWYgKGJpdF9kZXB0aCA+PSAwKQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYml0X2RlcHRoOwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgID0gdHJhY2stPnZpZGVvLnBpeGVsX3dpZHRoOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gdHJhY2stPnZpZGVvLnBpeGVsX2hlaWdodDsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJpdF9kZXB0aDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IHRyYWNrLT52aWRlby5waXhlbF93aWR0aDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IHRyYWNrLT52aWRlby5waXhlbF9oZWlnaHQ7CisKKyAgICAgICAgICAgIGlmICh0cmFjay0+dmlkZW8uaW50ZXJsYWNlZCA9PSBNQVRST1NLQV9WSURFT19JTlRFUkxBQ0VfRkxBR19JTlRFUkxBQ0VEKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZmllbGRfb3JkZXIgPSBta3ZfZmllbGRfb3JkZXIobWF0cm9za2EsIHRyYWNrLT52aWRlby5maWVsZF9vcmRlcik7CisgICAgICAgICAgICBlbHNlIGlmICh0cmFjay0+dmlkZW8uaW50ZXJsYWNlZCA9PSBNQVRST1NLQV9WSURFT19JTlRFUkxBQ0VfRkxBR19QUk9HUkVTU0lWRSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZpZWxkX29yZGVyID0gQVZfRklFTERfUFJPR1JFU1NJVkU7CiAKICAgICAgICAgICAgIGlmICh0cmFjay0+dmlkZW8uc3RlcmVvX21vZGUgJiYgdHJhY2stPnZpZGVvLnN0ZXJlb19tb2RlIDwgTUFUUk9TS0FfVklERU9fU1RFUkVPTU9ERV9UWVBFX05CKQogICAgICAgICAgICAgICAgIG1rdl9zdGVyZW9fbW9kZV9kaXNwbGF5X211bCh0cmFjay0+dmlkZW8uc3RlcmVvX21vZGUsICZkaXNwbGF5X3dpZHRoX211bCwgJmRpc3BsYXlfaGVpZ2h0X211bCk7CiAKLSAgICAgICAgICAgIGF2X3JlZHVjZSgmc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAotICAgICAgICAgICAgICAgICAgICAgICZzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgKiB0cmFjay0+dmlkZW8uZGlzcGxheV93aWR0aCAgKiBkaXNwbGF5X3dpZHRoX211bCwKLSAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICAqIHRyYWNrLT52aWRlby5kaXNwbGF5X2hlaWdodCAqIGRpc3BsYXlfaGVpZ2h0X211bCwKLSAgICAgICAgICAgICAgICAgICAgICAyNTUpOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSEVWQykKKyAgICAgICAgICAgIGlmICh0cmFjay0+dmlkZW8uZGlzcGxheV91bml0IDwgTUFUUk9TS0FfVklERU9fRElTUExBWVVOSVRfVU5LTk9XTikgeworICAgICAgICAgICAgICAgIGF2X3JlZHVjZSgmc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAqIHRyYWNrLT52aWRlby5kaXNwbGF5X3dpZHRoICAqIGRpc3BsYXlfd2lkdGhfbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICAqIHRyYWNrLT52aWRlby5kaXNwbGF5X2hlaWdodCAqIGRpc3BsYXlfaGVpZ2h0X211bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjU1KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0hFVkMpCiAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7CiAKICAgICAgICAgICAgIGlmICh0cmFjay0+ZGVmYXVsdF9kdXJhdGlvbikgewpAQCAtMjE3NywzMCArMjUzMSwzOSBAQAogICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBta3ZfcGFyc2VfdmlkZW9fY29sb3Ioc3QsIHRyYWNrKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICByZXQgPSBta3ZfcGFyc2VfdmlkZW9fcHJvamVjdGlvbihzdCwgdHJhY2spOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+dHlwZSA9PSBNQVRST1NLQV9UUkFDS19UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IGZvdXJjYzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSB0cmFjay0+YXVkaW8ub3V0X3NhbXBsZXJhdGU7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gdHJhY2stPmF1ZGlvLmNoYW5uZWxzOwotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHRyYWNrLT5hdWRpby5iaXRkZXB0aDsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMykKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgID0gZm91cmNjOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHRyYWNrLT5hdWRpby5vdXRfc2FtcGxlcmF0ZTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSB0cmFjay0+YXVkaW8uY2hhbm5lbHM7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gdHJhY2stPmF1ZGlvLmJpdGRlcHRoOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzIHx8CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NTFAgfHwKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RSVUVIRCkKICAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKLSAgICAgICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUFDKQorICAgICAgICAgICAgZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9BQUMpCiAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7CiAgICAgICAgICAgICBpZiAodHJhY2stPmNvZGVjX2RlbGF5ID4gMCkgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZGVsYXkgPSBhdl9yZXNjYWxlX3EodHJhY2stPmNvZGVjX2RlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlfSk7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5pbml0aWFsX3BhZGRpbmcgPSBhdl9yZXNjYWxlX3EodHJhY2stPmNvZGVjX2RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAgOiBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlfSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAodHJhY2stPnNlZWtfcHJlcm9sbCA+IDApIHsKLSAgICAgICAgICAgICAgICBhdl9jb2RlY19zZXRfc2Vla19wcmVyb2xsKHN0LT5jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcSh0cmFjay0+c2Vla19wcmVyb2xsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwMDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZX0pKTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNlZWtfcHJlcm9sbCA9IGF2X3Jlc2NhbGVfcSh0cmFjay0+c2Vla19wcmVyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwMDAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZX0pOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dFQlZUVCkgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwogCiAgICAgICAgICAgICBpZiAoIXN0cmNtcCh0cmFjay0+Y29kZWNfaWQsICJEX1dFQlZUVC9DQVBUSU9OUyIpKSB7CiAgICAgICAgICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uIHw9IEFWX0RJU1BPU0lUSU9OX0NBUFRJT05TOwpAQCAtMjIxMCw4ICsyNTczLDggQEAKICAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fTUVUQURBVEE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnR5cGUgPT0gTUFUUk9TS0FfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVNTKQorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVNTKQogICAgICAgICAgICAgICAgIG1hdHJvc2thLT5jb250YWluc19zc2EgPSAxOwogICAgICAgICB9CiAgICAgfQpAQCAtMjI0NCwxMCArMjYwNyw5IEBACiAgICAgICAgIGVibWwubWF4X3NpemUgICAgICAgID4gc2l6ZW9mKHVpbnQ2NF90KSAgfHwKICAgICAgICAgZWJtbC5pZF9sZW5ndGggICAgICAgPiBzaXplb2YodWludDMyX3QpICB8fAogICAgICAgICBlYm1sLmRvY3R5cGVfdmVyc2lvbiA+IDMpIHsKLSAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJFQk1MIGhlYWRlciB1c2luZyB1bnN1cHBvcnRlZCBmZWF0dXJlc1xuIgotICAgICAgICAgICAgICAgIihFQk1MIHZlcnNpb24gJSJQUkl1NjQiLCBkb2N0eXBlICVzLCBkb2MgdmVyc2lvbiAlIlBSSXU2NCIpXG4iLAotICAgICAgICAgICAgICAgZWJtbC52ZXJzaW9uLCBlYm1sLmRvY3R5cGUsIGVibWwuZG9jdHlwZV92ZXJzaW9uKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUobWF0cm9za2EtPmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVCTUwgdmVyc2lvbiAlIlBSSXU2NCIsIGRvY3R5cGUgJXMsIGRvYyB2ZXJzaW9uICUiUFJJdTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYm1sLnZlcnNpb24sIGVibWwuZG9jdHlwZSwgZWJtbC5kb2N0eXBlX3ZlcnNpb24pOwogICAgICAgICBlYm1sX2ZyZWUoZWJtbF9zeW50YXgsICZlYm1sKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0gZWxzZSBpZiAoZWJtbC5kb2N0eXBlX3ZlcnNpb24gPT0gMykgewpAQCAtMjI3NSw3ICsyNjM3LDcgQEAKICAgICB3aGlsZSAocmVzICE9IDEpIHsKICAgICAgICAgcmVzID0gbWF0cm9za2FfcmVzeW5jKG1hdHJvc2thLCBwb3MpOwogICAgICAgICBpZiAocmVzIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIHBvcyA9IGF2aW9fdGVsbChtYXRyb3NrYS0+Y3R4LT5wYik7CiAgICAgICAgIHJlcyA9IGVibWxfcGFyc2UobWF0cm9za2EsIG1hdHJvc2thX3NlZ21lbnQsIG1hdHJvc2thKTsKICAgICB9CkBAIC0yMjk0LDcgKzI2NTYsNyBAQAogCiAgICAgcmVzID0gbWF0cm9za2FfcGFyc2VfdHJhY2tzKHMpOwogICAgIGlmIChyZXMgPCAwKQotICAgICAgICByZXR1cm4gcmVzOworICAgICAgICBnb3RvIGZhaWw7CiAKICAgICBhdHRhY2htZW50cyA9IGF0dGFjaG1lbnRzX2xpc3QtPmVsZW07CiAgICAgZm9yIChqID0gMDsgaiA8IGF0dGFjaG1lbnRzX2xpc3QtPm5iX2VsZW07IGorKykgewpAQCAtMjMwNywyMSArMjY2OSwyMSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImZpbGVuYW1lIiwgYXR0YWNobWVudHNbal0uZmlsZW5hbWUsIDApOwogICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgIm1pbWV0eXBlIiwgYXR0YWNobWVudHNbal0ubWltZSwgMCk7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTk9ORTsKIAogICAgICAgICAgICAgZm9yIChpID0gMDsgZmZfbWt2X2ltYWdlX21pbWVfdGFnc1tpXS5pZCAhPSBBVl9DT0RFQ19JRF9OT05FOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jbXAoZmZfbWt2X2ltYWdlX21pbWVfdGFnc1tpXS5zdHIsIGF0dGFjaG1lbnRzW2pdLm1pbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihmZl9ta3ZfaW1hZ2VfbWltZV90YWdzW2ldLnN0cikpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9ta3ZfaW1hZ2VfbWltZV90YWdzW2ldLmlkOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gZmZfbWt2X2ltYWdlX21pbWVfdGFnc1tpXS5pZDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBhdHRhY2htZW50c1tqXS5zdHJlYW0gPSBzdDsKIAotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSkgewotICAgICAgICAgICAgICAgIHN0LT5kaXNwb3NpdGlvbiAgICAgIHw9IEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQzsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uICAgICAgICAgfD0gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKIAogICAgICAgICAgICAgICAgIGF2X2luaXRfcGFja2V0KCZzdC0+YXR0YWNoZWRfcGljKTsKICAgICAgICAgICAgICAgICBpZiAoKHJlcyA9IGF2X25ld19wYWNrZXQoJnN0LT5hdHRhY2hlZF9waWMsIGF0dGFjaG1lbnRzW2pdLmJpbi5zaXplKSkgPCAwKQpAQCAtMjMzMCwxNiArMjY5MiwxNiBAQAogICAgICAgICAgICAgICAgIHN0LT5hdHRhY2hlZF9waWMuc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwogICAgICAgICAgICAgICAgIHN0LT5hdHRhY2hlZF9waWMuZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVDsKLSAgICAgICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgYXR0YWNobWVudHNbal0uYmluLnNpemUpKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UOworICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBhdHRhY2htZW50c1tqXS5iaW4uc2l6ZSkpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgYXR0YWNobWVudHNbal0uYmluLmRhdGEsCisgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBhdHRhY2htZW50c1tqXS5iaW4uZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHNbal0uYmluLnNpemUpOwogCiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgZmZfbWt2X21pbWVfdGFnc1tpXS5pZCAhPSBBVl9DT0RFQ19JRF9OT05FOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGZmX21rdl9taW1lX3RhZ3NbaV0uc3RyLCBhdHRhY2htZW50c1tqXS5taW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oZmZfbWt2X21pbWVfdGFnc1tpXS5zdHIpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX21rdl9taW1lX3RhZ3NbaV0uaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gZmZfbWt2X21pbWVfdGFnc1tpXS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjM2OCw2ICsyNzMwLDkgQEAKICAgICBtYXRyb3NrYV9jb252ZXJ0X3RhZ3Mocyk7CiAKICAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgbWF0cm9za2FfcmVhZF9jbG9zZShzKTsKKyAgICByZXR1cm4gcmVzOwogfQogCiAvKgpAQCAtMjM3NywzMiArMjc0MiwyMSBAQAogc3RhdGljIGludCBtYXRyb3NrYV9kZWxpdmVyX3BhY2tldChNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgaWYgKG1hdHJvc2thLT5udW1fcGFja2V0cyA+IDApIHsKLSAgICAgICAgbWVtY3B5KHBrdCwgbWF0cm9za2EtPnBhY2tldHNbMF0sIHNpemVvZihBVlBhY2tldCkpOwotICAgICAgICBhdl9mcmVlcCgmbWF0cm9za2EtPnBhY2tldHNbMF0pOwotICAgICAgICBpZiAobWF0cm9za2EtPmhhc19wYWxldHRlKSB7CisgICAgaWYgKG1hdHJvc2thLT5xdWV1ZSkgeworICAgICAgICBNYXRyb3NrYVRyYWNrICp0cmFja3MgPSBtYXRyb3NrYS0+dHJhY2tzLmVsZW07CisgICAgICAgIE1hdHJvc2thVHJhY2sgKnRyYWNrOworCisgICAgICAgIGZmX3BhY2tldF9saXN0X2dldCgmbWF0cm9za2EtPnF1ZXVlLCAmbWF0cm9za2EtPnF1ZXVlX2VuZCwgcGt0KTsKKyAgICAgICAgdHJhY2sgPSAmdHJhY2tzW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgaWYgKHRyYWNrLT5oYXNfcGFsZXR0ZSkgewogICAgICAgICAgICAgdWludDhfdCAqcGFsID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCBBVlBBTEVUVEVfU0laRSk7CiAgICAgICAgICAgICBpZiAoIXBhbCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYXBwZW5kIHBhbGV0dGUgdG8gcGFja2V0XG4iKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHBhbCwgbWF0cm9za2EtPnBhbGV0dGUsIEFWUEFMRVRURV9TSVpFKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocGFsLCB0cmFjay0+cGFsZXR0ZSwgQVZQQUxFVFRFX1NJWkUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWF0cm9za2EtPmhhc19wYWxldHRlID0gMDsKKyAgICAgICAgICAgIHRyYWNrLT5oYXNfcGFsZXR0ZSA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1hdHJvc2thLT5udW1fcGFja2V0cyA+IDEpIHsKLSAgICAgICAgICAgIHZvaWQgKm5ld3BhY2tldHM7Ci0gICAgICAgICAgICBtZW1tb3ZlKCZtYXRyb3NrYS0+cGFja2V0c1swXSwgJm1hdHJvc2thLT5wYWNrZXRzWzFdLAotICAgICAgICAgICAgICAgICAgICAobWF0cm9za2EtPm51bV9wYWNrZXRzIC0gMSkgKiBzaXplb2YoQVZQYWNrZXQgKikpOwotICAgICAgICAgICAgbmV3cGFja2V0cyA9IGF2X3JlYWxsb2MobWF0cm9za2EtPnBhY2tldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0cm9za2EtPm51bV9wYWNrZXRzIC0gMSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEFWUGFja2V0ICopKTsKLSAgICAgICAgICAgIGlmIChuZXdwYWNrZXRzKQotICAgICAgICAgICAgICAgIG1hdHJvc2thLT5wYWNrZXRzID0gbmV3cGFja2V0czsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZtYXRyb3NrYS0+cGFja2V0cyk7Ci0gICAgICAgICAgICBtYXRyb3NrYS0+cHJldl9wa3QgPSBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIG1hdHJvc2thLT5udW1fcGFja2V0cy0tOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKQEAgLTI0MTQsMTYgKzI3NjgsNyBAQAogICovCiBzdGF0aWMgdm9pZCBtYXRyb3NrYV9jbGVhcl9xdWV1ZShNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EpCiB7Ci0gICAgbWF0cm9za2EtPnByZXZfcGt0ID0gTlVMTDsKLSAgICBpZiAobWF0cm9za2EtPnBhY2tldHMpIHsKLSAgICAgICAgaW50IG47Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCBtYXRyb3NrYS0+bnVtX3BhY2tldHM7IG4rKykgewotICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKG1hdHJvc2thLT5wYWNrZXRzW25dKTsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZtYXRyb3NrYS0+cGFja2V0c1tuXSk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfZnJlZXAoJm1hdHJvc2thLT5wYWNrZXRzKTsKLSAgICAgICAgbWF0cm9za2EtPm51bV9wYWNrZXRzID0gMDsKLSAgICB9CisgICAgZmZfcGFja2V0X2xpc3RfZnJlZSgmbWF0cm9za2EtPnF1ZXVlLCAmbWF0cm9za2EtPnF1ZXVlX2VuZCk7CiB9CiAKIHN0YXRpYyBpbnQgbWF0cm9za2FfcGFyc2VfbGFjZXMoTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thLCB1aW50OF90ICoqYnVmLApAQCAtMjU0MCw3ICsyODg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgaW50IHNpemUsIHVpbnQ2NF90IHRpbWVjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcykKIHsKLSAgICBpbnQgYSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgaW50IGEgPSBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduOwogICAgIGludCBzcHMgPSB0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9zaXplOwogICAgIGludCBjZnMgPSB0cmFjay0+YXVkaW8uY29kZWRfZnJhbWVzaXplOwogICAgIGludCBoICAgPSB0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9oOwpAQCAtMjU1MSw3ICsyODk2LDcgQEAKICAgICBpZiAoIXRyYWNrLT5hdWRpby5wa3RfY250KSB7CiAgICAgICAgIGlmICh0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9jbnQgPT0gMCkKICAgICAgICAgICAgIHRyYWNrLT5hdWRpby5idWZfdGltZWNvZGUgPSB0aW1lY29kZTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFfMjg4KSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBXzI4OCkgewogICAgICAgICAgICAgaWYgKHNpemUgPCBjZnMgKiBoIC8gMikgewogICAgICAgICAgICAgICAgIGF2X2xvZyhtYXRyb3NrYS0+Y3R4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICJDb3JydXB0IGludDQgUk0tc3R5bGUgYXVkaW8gcGFja2V0IHNpemVcbiIpOwpAQCAtMjU2MCw3ICsyOTA1LDcgQEAKICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBoIC8gMjsgeCsrKQogICAgICAgICAgICAgICAgIG1lbWNweSh0cmFjay0+YXVkaW8uYnVmICsgeCAqIDIgKiB3ICsgeSAqIGNmcywKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIHggKiBjZnMsIGNmcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TSVBSKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TSVBSKSB7CiAgICAgICAgICAgICBpZiAoc2l6ZSA8IHcpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cobWF0cm9za2EtPmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiQ29ycnVwdCBzaXByIFJNLXN0eWxlIGF1ZGlvIHBhY2tldCBzaXplXG4iKTsKQEAgLTI1ODAsNyArMjkyNSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoKyt0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9jbnQgPj0gaCkgewotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU0lQUikKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NJUFIpCiAgICAgICAgICAgICAgICAgZmZfcm1fcmVvcmRlcl9zaXByX2RhdGEodHJhY2stPmF1ZGlvLmJ1ZiwgaCwgdyk7CiAgICAgICAgICAgICB0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9jbnQgPSAwOwogICAgICAgICAgICAgdHJhY2stPmF1ZGlvLnBrdF9jbnQgICAgICAgID0gaCAqIHcgLyBhOwpAQCAtMjU4OSwxMyArMjkzNCwxMCBAQAogCiAgICAgd2hpbGUgKHRyYWNrLT5hdWRpby5wa3RfY250KSB7CiAgICAgICAgIGludCByZXQ7Ci0gICAgICAgIEFWUGFja2V0ICpwa3QgPSBhdl9tYWxsb2N6KHNpemVvZihBVlBhY2tldCkpOwotICAgICAgICBpZiAoIXBrdCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIEFWUGFja2V0IHBrdGwsICpwa3QgPSAmcGt0bDsKIAogICAgICAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgYSk7CiAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9mcmVlKHBrdCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsCkBAIC0yNjA1LDcgKzI5NDcsMTEgQEAKICAgICAgICAgdHJhY2stPmF1ZGlvLmJ1Zl90aW1lY29kZSA9IEFWX05PUFRTX1ZBTFVFOwogICAgICAgICBwa3QtPnBvcyAgICAgICAgICAgICAgICAgID0gcG9zOwogICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCAgICAgICAgID0gc3QtPmluZGV4OwotICAgICAgICBkeW5hcnJheV9hZGQoJm1hdHJvc2thLT5wYWNrZXRzLCAmbWF0cm9za2EtPm51bV9wYWNrZXRzLCBwa3QpOworICAgICAgICByZXQgPSBmZl9wYWNrZXRfbGlzdF9wdXQoJm1hdHJvc2thLT5xdWV1ZSwgJm1hdHJvc2thLT5xdWV1ZV9lbmQsIHBrdCwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTI2MjIsMTAgKzI5NjgsMTAgQEAKICAgICB1aW50MTZfdCB2ZXI7CiAgICAgaW50IHJldCwgb2Zmc2V0ID0gMDsKIAotICAgIGlmIChzcmNsZW4gPCAxMiB8fCB0cmFjay0+c3RyZWFtLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPCAyKQorICAgIGlmIChzcmNsZW4gPCAxMiB8fCB0cmFjay0+c3RyZWFtLT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPCAyKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIHZlciA9IEFWX1JMMTYodHJhY2stPnN0cmVhbS0+Y29kZWMtPmV4dHJhZGF0YSk7CisgICAgdmVyID0gQVZfUkwxNih0cmFjay0+c3RyZWFtLT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKIAogICAgIHNhbXBsZXMgPSBBVl9STDMyKHNyYyk7CiAgICAgc3JjICAgICs9IDQ7CkBAIC0yNjU4LDcgKzMwMDQsNyBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAKLSAgICAgICAgdG1wID0gYXZfcmVhbGxvYyhkc3QsIGRzdGxlbiArIGJsb2Nrc2l6ZSArIDMyKTsKKyAgICAgICAgdG1wID0gYXZfcmVhbGxvYyhkc3QsIGRzdGxlbiArIGJsb2Nrc2l6ZSArIDMyICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CiAgICAgICAgIGlmICghdG1wKSB7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CkBAIC0yNjgyLDYgKzMwMjgsOCBAQAogICAgICAgICBvZmZzZXQgKz0gYmxvY2tzaXplICsgMzI7CiAgICAgfQogCisgICAgbWVtc2V0KGRzdCArIGRzdGxlbiwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisKICAgICAqcGRzdCA9IGRzdDsKICAgICAqc2l6ZSA9IGRzdGxlbjsKIApAQCAtMjY5Miw2ICszMDQwLDMwIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBtYXRyb3NrYV9wYXJzZV9wcm9yZXMoTWF0cm9za2FUcmFjayAqdHJhY2ssIHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipwZHN0LCBpbnQgKnNpemUpCit7CisgICAgdWludDhfdCAqZHN0ID0gc3JjOworICAgIGludCBkc3RsZW4gPSAqc2l6ZTsKKworICAgIGlmIChBVl9SQjMyKCZzcmNbNF0pICE9IE1LQkVUQUcoJ2knLCAnYycsICdwJywgJ2YnKSkgeworICAgICAgICBkc3QgPSBhdl9tYWxsb2MoZHN0bGVuICsgOCArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIWRzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgQVZfV0IzMihkc3QsIGRzdGxlbik7CisgICAgICAgIEFWX1dCMzIoZHN0ICsgNCwgTUtCRVRBRygnaScsICdjJywgJ3AnLCAnZicpKTsKKyAgICAgICAgbWVtY3B5KGRzdCArIDgsIHNyYywgZHN0bGVuKTsKKyAgICAgICAgbWVtc2V0KGRzdCArIDggKyBkc3RsZW4sIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBkc3RsZW4gKz0gODsKKyAgICB9CisKKyAgICAqcGRzdCA9IGRzdDsKKyAgICAqc2l6ZSA9IGRzdGxlbjsKKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG1hdHJvc2thX3BhcnNlX3dlYnZ0dChNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyb3NrYVRyYWNrICp0cmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwKQEAgLTI3MDAsNyArMzA3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBkdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zKQogewotICAgIEFWUGFja2V0ICpwa3Q7CisgICAgQVZQYWNrZXQgcGt0bCwgKnBrdCA9ICZwa3RsOwogICAgIHVpbnQ4X3QgKmlkLCAqc2V0dGluZ3MsICp0ZXh0LCAqYnVmOwogICAgIGludCBpZF9sZW4sIHNldHRpbmdzX2xlbiwgdGV4dF9sZW47CiAgICAgdWludDhfdCAqcCwgKnE7CkBAIC0yNzU3LDEzICszMTI5LDkgQEAKICAgICBpZiAodGV4dF9sZW4gPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBwa3QgPSBhdl9tYWxsb2N6KHNpemVvZigqcGt0KSk7Ci0gICAgaWYgKCFwa3QpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgZXJyID0gYXZfbmV3X3BhY2tldChwa3QsIHRleHRfbGVuKTsKICAgICBpZiAoZXJyIDwgMCkgewotICAgICAgICBhdl9mcmVlKHBrdCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKGVycik7CisgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCiAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgdGV4dCwgdGV4dF9sZW4pOwpAQCAtMjc3Myw3ICszMTQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfV0VCVlRUX0lERU5USUZJRVIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkX2xlbik7CiAgICAgICAgIGlmICghYnVmKSB7Ci0gICAgICAgICAgICBhdl9mcmVlKHBrdCk7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KGJ1ZiwgaWQsIGlkX2xlbik7CkBAIC0yNzg0LDcgKzMxNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QS1RfREFUQV9XRUJWVFRfU0VUVElOR1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzX2xlbik7CiAgICAgICAgIGlmICghYnVmKSB7Ci0gICAgICAgICAgICBhdl9mcmVlKHBrdCk7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KGJ1Ziwgc2V0dGluZ3MsIHNldHRpbmdzX2xlbik7CkBAIC0yODAyLDE1ICszMTcwLDE4IEBACiAgICAgcGt0LT5kdXJhdGlvbiA9IGR1cmF0aW9uOwogICAgIHBrdC0+cG9zID0gcG9zOwogCi0gICAgZHluYXJyYXlfYWRkKCZtYXRyb3NrYS0+cGFja2V0cywgJm1hdHJvc2thLT5udW1fcGFja2V0cywgcGt0KTsKLSAgICBtYXRyb3NrYS0+cHJldl9wa3QgPSBwa3Q7CisgICAgZXJyID0gZmZfcGFja2V0X2xpc3RfcHV0KCZtYXRyb3NrYS0+cXVldWUsICZtYXRyb3NrYS0+cXVldWVfZW5kLCBwa3QsIDApOworICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1hdHJvc2thX3BhcnNlX2ZyYW1lKE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cm9za2FUcmFjayAqdHJhY2ssIEFWU3RyZWFtICpzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZGF0YSwgaW50IHBrdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqYnVmLCB1aW50OF90ICpkYXRhLCBpbnQgcGt0X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVjb2RlLCB1aW50NjRfdCBsYWNlX2R1cmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcywgaW50IGlzX2tleWZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICphZGRpdGlvbmFsLCB1aW50NjRfdCBhZGRpdGlvbmFsX2lkLCBpbnQgYWRkaXRpb25hbF9zaXplLApAQCAtMjgxOCw4ICszMTg5LDggQEAKIHsKICAgICBNYXRyb3NrYVRyYWNrRW5jb2RpbmcgKmVuY29kaW5ncyA9IHRyYWNrLT5lbmNvZGluZ3MuZWxlbTsKICAgICB1aW50OF90ICpwa3RfZGF0YSA9IGRhdGE7Ci0gICAgaW50IG9mZnNldCA9IDAsIHJlczsKLSAgICBBVlBhY2tldCAqcGt0OworICAgIGludCByZXM7CisgICAgQVZQYWNrZXQgcGt0bCwgKnBrdCA9ICZwa3RsOwogCiAgICAgaWYgKGVuY29kaW5ncyAmJiAhZW5jb2RpbmdzLT50eXBlICYmIGVuY29kaW5ncy0+c2NvcGUgJiAxKSB7CiAgICAgICAgIHJlcyA9IG1hdHJvc2thX2RlY29kZV9idWZmZXIoJnBrdF9kYXRhLCAmcGt0X3NpemUsIHRyYWNrKTsKQEAgLTI4MjcsNyArMzE5OCw3IEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dBVlBBQ0spIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XQVZQQUNLKSB7CiAgICAgICAgIHVpbnQ4X3QgKnd2X2RhdGE7CiAgICAgICAgIHJlcyA9IG1hdHJvc2thX3BhcnNlX3dhdnBhY2sodHJhY2ssIHBrdF9kYXRhLCAmd3ZfZGF0YSwgJnBrdF9zaXplKTsKICAgICAgICAgaWYgKHJlcyA8IDApIHsKQEAgLTI4NDAsMzQgKzMyMTEsMzMgQEAKICAgICAgICAgcGt0X2RhdGEgPSB3dl9kYXRhOwogICAgIH0KIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BST1JFUyAmJgotICAgICAgICBBVl9SQjMyKCZkYXRhWzRdKSAhPSBNS0JFVEFHKCdpJywgJ2MnLCAncCcsICdmJykpCi0gICAgICAgIG9mZnNldCA9IDg7Ci0KLSAgICBwa3QgPSBhdl9tYWxsb2N6KHNpemVvZihBVlBhY2tldCkpOwotICAgIGlmICghcGt0KSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUFJPUkVTKSB7CisgICAgICAgIHVpbnQ4X3QgKnByX2RhdGE7CisgICAgICAgIHJlcyA9IG1hdHJvc2thX3BhcnNlX3Byb3Jlcyh0cmFjaywgcGt0X2RhdGEsICZwcl9kYXRhLCAmcGt0X3NpemUpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKG1hdHJvc2thLT5jdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBhIHByb3JlcyBibG9jay5cbiIpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CiAgICAgICAgIGlmIChwa3RfZGF0YSAhPSBkYXRhKQogICAgICAgICAgICAgYXZfZnJlZXAoJnBrdF9kYXRhKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgcGt0X2RhdGEgPSBwcl9kYXRhOwogICAgIH0KLSAgICAvKiBYWFg6IHByZXZlbnQgZGF0YSBjb3B5Li4uICovCi0gICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCBwa3Rfc2l6ZSArIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgIGF2X2ZyZWUocGt0KTsKKworICAgIGF2X2luaXRfcGFja2V0KHBrdCk7CisgICAgaWYgKHBrdF9kYXRhICE9IGRhdGEpCisgICAgICAgIHBrdC0+YnVmID0gYXZfYnVmZmVyX2NyZWF0ZShwa3RfZGF0YSwgcGt0X3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgMCk7CisgICAgZWxzZQorICAgICAgICBwa3QtPmJ1ZiA9IGF2X2J1ZmZlcl9yZWYoYnVmKTsKKworICAgIGlmICghcGt0LT5idWYpIHsKICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUFJPUkVTICYmIG9mZnNldCA9PSA4KSB7Ci0gICAgICAgIHVpbnQ4X3QgKmJ1ZiA9IHBrdC0+ZGF0YTsKLSAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmYnVmLCBwa3Rfc2l6ZSk7Ci0gICAgICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJmJ1ZiwgTUtCRVRBRygnaScsICdjJywgJ3AnLCAnZicpKTsKLSAgICB9Ci0KLSAgICBtZW1jcHkocGt0LT5kYXRhICsgb2Zmc2V0LCBwa3RfZGF0YSwgcGt0X3NpemUpOwotCi0gICAgaWYgKHBrdF9kYXRhICE9IGRhdGEpCi0gICAgICAgIGF2X2ZyZWVwKCZwa3RfZGF0YSk7Ci0KKyAgICBwa3QtPmRhdGEgICAgICAgICA9IHBrdF9kYXRhOworICAgIHBrdC0+c2l6ZSAgICAgICAgID0gcGt0X3NpemU7CiAgICAgcGt0LT5mbGFncyAgICAgICAgPSBpc19rZXlmcmFtZTsKICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKIApAQCAtMjg3Nyw3ICszMjQ3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbF9zaXplICsgOCk7CiAgICAgICAgIGlmICghc2lkZV9kYXRhKSB7CiAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKLSAgICAgICAgICAgIGF2X2ZyZWUocGt0KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0KICAgICAgICAgQVZfV0I2NChzaWRlX2RhdGEsIGFkZGl0aW9uYWxfaWQpOwpAQCAtMjg5MCwxMyArMzI1OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCk7CiAgICAgICAgIGlmICghc2lkZV9kYXRhKSB7CiAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKLSAgICAgICAgICAgIGF2X2ZyZWUocGt0KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0KLSAgICAgICAgQVZfV0wzMihzaWRlX2RhdGEsIDApOwotICAgICAgICBBVl9XTDMyKHNpZGVfZGF0YSArIDQsIGF2X3Jlc2NhbGVfcShkaXNjYXJkX3BhZGRpbmcsCisgICAgICAgIGRpc2NhcmRfcGFkZGluZyA9IGF2X3Jlc2NhbGVfcShkaXNjYXJkX3BhZGRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwMDAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGV9KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlfSk7CisgICAgICAgIGlmIChkaXNjYXJkX3BhZGRpbmcgPiAwKSB7CisgICAgICAgICAgICBBVl9XTDMyKHNpZGVfZGF0YSArIDQsIGRpc2NhcmRfcGFkZGluZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBVl9XTDMyKHNpZGVfZGF0YSwgLWRpc2NhcmRfcGFkZGluZyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAodHJhY2stPm1zX2NvbXBhdCkKQEAgLTI5MDgsMTQgKzMyODAsMTcgQEAKIAogI2lmIEZGX0FQSV9DT05WRVJHRU5DRV9EVVJBVElPTgogRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NVQlJJUCkgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NVQlJJUCkgewogICAgICAgICBwa3QtPmNvbnZlcmdlbmNlX2R1cmF0aW9uID0gbGFjZV9kdXJhdGlvbjsKICAgICB9CiBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICNlbmRpZgogCi0gICAgZHluYXJyYXlfYWRkKCZtYXRyb3NrYS0+cGFja2V0cywgJm1hdHJvc2thLT5udW1fcGFja2V0cywgcGt0KTsKLSAgICBtYXRyb3NrYS0+cHJldl9wa3QgPSBwa3Q7CisgICAgcmVzID0gZmZfcGFja2V0X2xpc3RfcHV0KCZtYXRyb3NrYS0+cXVldWUsICZtYXRyb3NrYS0+cXVldWVfZW5kLCBwa3QsIDApOworICAgIGlmIChyZXMgPCAwKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KIAogICAgIHJldHVybiAwOwogCkBAIC0yOTI1LDcgKzMzMDAsNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXRpYyBpbnQgbWF0cm9za2FfcGFyc2VfYmxvY2soTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thLCB1aW50OF90ICpkYXRhLAorc3RhdGljIGludCBtYXRyb3NrYV9wYXJzZV9ibG9jayhNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EsIEFWQnVmZmVyUmVmICpidWYsIHVpbnQ4X3QgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQ2NF90IHBvcywgdWludDY0X3QgY2x1c3Rlcl90aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBibG9ja19kdXJhdGlvbiwgaW50IGlzX2tleWZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICphZGRpdGlvbmFsLCB1aW50NjRfdCBhZGRpdGlvbmFsX2lkLCBpbnQgYWRkaXRpb25hbF9zaXplLApAQCAtMjk2OSwxOCArMzM0NCwyMyBAQAogCiAgICAgaWYgKGNsdXN0ZXJfdGltZSAhPSAodWludDY0X3QpIC0xICYmCiAgICAgICAgIChibG9ja190aW1lID49IDAgfHwgY2x1c3Rlcl90aW1lID49IC1ibG9ja190aW1lKSkgewotICAgICAgICB0aW1lY29kZSA9IGNsdXN0ZXJfdGltZSArIGJsb2NrX3RpbWUgLSB0cmFjay0+Y29kZWNfZGVsYXk7CisgICAgICAgIHRpbWVjb2RlID0gY2x1c3Rlcl90aW1lICsgYmxvY2tfdGltZSAtIHRyYWNrLT5jb2RlY19kZWxheV9pbl90cmFja190YjsKICAgICAgICAgaWYgKHRyYWNrLT50eXBlID09IE1BVFJPU0tBX1RSQUNLX1RZUEVfU1VCVElUTEUgJiYKICAgICAgICAgICAgIHRpbWVjb2RlIDwgdHJhY2stPmVuZF90aW1lY29kZSkKICAgICAgICAgICAgIGlzX2tleWZyYW1lID0gMDsgIC8qIG92ZXJsYXBwaW5nIHN1YnRpdGxlcyBhcmUgbm90IGtleSBmcmFtZSAqLwotICAgICAgICBpZiAoaXNfa2V5ZnJhbWUpCisgICAgICAgIGlmIChpc19rZXlmcmFtZSkgeworICAgICAgICAgICAgZmZfcmVkdWNlX2luZGV4KG1hdHJvc2thLT5jdHgsIHN0LT5pbmRleCk7CiAgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIGNsdXN0ZXJfcG9zLCB0aW1lY29kZSwgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklOREVYX0tFWUZSQU1FKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtYXRyb3NrYS0+c2tpcF90b19rZXlmcmFtZSAmJgogICAgICAgICB0cmFjay0+dHlwZSAhPSBNQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgIGlmICh0aW1lY29kZSA8IG1hdHJvc2thLT5za2lwX3RvX3RpbWVjb2RlKQorICAgICAgICAvLyBDb21wYXJlIHNpZ25lZCB0aW1lY29kZXMuIFRpbWVjb2RlIG1heSBiZSBuZWdhdGl2ZSBkdWUgdG8gY29kZWMgZGVsYXkKKyAgICAgICAgLy8gb2Zmc2V0LiBXZSBkb24ndCBzdXBwb3J0IHRpbWVzdGFtcHMgZ3JlYXRlciB0aGFuIGludDY0X3QgYW55d2F5IC0gc2VlCisgICAgICAgIC8vIEFWUGFja2V0J3MgcHRzLgorICAgICAgICBpZiAoKGludDY0X3QpdGltZWNvZGUgPCAoaW50NjRfdCltYXRyb3NrYS0+c2tpcF90b190aW1lY29kZSkKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIGlmIChpc19rZXlmcmFtZSkKICAgICAgICAgICAgIG1hdHJvc2thLT5za2lwX3RvX2tleWZyYW1lID0gMDsKQEAgLTI5OTgsOCArMzM3OCw4IEBACiAKICAgICBpZiAodHJhY2stPmF1ZGlvLnNhbXBsZXJhdGUgPT0gODAwMCkgewogICAgICAgICAvLyBJZiB0aGlzIGlzIG5lZWRlZCBmb3IgbW9yZSBjb2RlY3MsIHRoZW4gYWRkIHRoZW0gaGVyZQotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKLSAgICAgICAgICAgIGlmICh0cmFjay0+YXVkaW8uc2FtcGxlcmF0ZSAhPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIHx8ICFzdC0+Y29kZWMtPmZyYW1lX3NpemUpCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMykgeworICAgICAgICAgICAgaWYgKHRyYWNrLT5hdWRpby5zYW1wbGVyYXRlICE9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgfHwgIXN0LT5jb2RlY3Bhci0+ZnJhbWVfc2l6ZSkKICAgICAgICAgICAgICAgICB0cnVzdF9kZWZhdWx0X2R1cmF0aW9uID0gMDsKICAgICAgICAgfQogICAgIH0KQEAgLTMwMTksMTggKzMzOTksMTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBXzI4OCB8fAotICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQ09PSyAgIHx8Ci0gICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TSVBSICAgfHwKLSAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FUUkFDMykgJiYKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gJiYgdHJhY2stPmF1ZGlvLnN1Yl9wYWNrZXRfc2l6ZSkgeworICAgICAgICBpZiAoKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFfMjg4IHx8CisgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9DT09LICAgfHwKKyAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NJUFIgICB8fAorICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVRSQUMzKSAmJgorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAmJiB0cmFjay0+YXVkaW8uc3ViX3BhY2tldF9zaXplKSB7CiAgICAgICAgICAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV9ybV9hdWRpbyhtYXRyb3NrYSwgdHJhY2ssIHN0LCBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFjZV9zaXplW25dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZWNvZGUsIHBvcyk7CiAgICAgICAgICAgICBpZiAocmVzKQogICAgICAgICAgICAgICAgIGdvdG8gZW5kOwogCi0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XRUJWVFQpIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dFQlZUVCkgewogICAgICAgICAgICAgcmVzID0gbWF0cm9za2FfcGFyc2Vfd2VidnR0KG1hdHJvc2thLCB0cmFjaywgc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgbGFjZV9zaXplW25dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVjb2RlLCBsYWNlX2R1cmF0aW9uLApAQCAtMzAzOCw3ICszNDE4LDcgQEAKICAgICAgICAgICAgIGlmIChyZXMpCiAgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV9mcmFtZShtYXRyb3NrYSwgdHJhY2ssIHN0LCBkYXRhLCBsYWNlX3NpemVbbl0sCisgICAgICAgICAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV9mcmFtZShtYXRyb3NrYSwgdHJhY2ssIHN0LCBidWYsIGRhdGEsIGxhY2Vfc2l6ZVtuXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVjb2RlLCBsYWNlX2R1cmF0aW9uLCBwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbiA/IGlzX2tleWZyYW1lIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwsIGFkZGl0aW9uYWxfaWQsIGFkZGl0aW9uYWxfc2l6ZSwKQEAgLTMwNzQsNyArMzQ1NCw2IEBACiAgICAgICAgIG1lbXNldCgmbWF0cm9za2EtPmN1cnJlbnRfY2x1c3RlciwgMCwgc2l6ZW9mKE1hdHJvc2thQ2x1c3RlcikpOwogICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyX251bV9ibG9ja3MgPSAwOwogICAgICAgICBtYXRyb3NrYS0+Y3VycmVudF9jbHVzdGVyX3BvcyAgICAgICAgPSBhdmlvX3RlbGwobWF0cm9za2EtPmN0eC0+cGIpOwotICAgICAgICBtYXRyb3NrYS0+cHJldl9wa3QgICAgICAgICAgICAgICAgICAgPSBOVUxMOwogICAgICAgICAvKiBzaXplb2YgdGhlIElEIHdoaWNoIHdhcyBhbHJlYWR5IHJlYWQgKi8KICAgICAgICAgaWYgKG1hdHJvc2thLT5jdXJyZW50X2lkKQogICAgICAgICAgICAgbWF0cm9za2EtPmN1cnJlbnRfY2x1c3Rlcl9wb3MgLT0gNDsKQEAgLTMwOTcsMTIgKzM0NzYsMTIgQEAKICAgICAgICAgbWF0cm9za2EtPmN1cnJlbnRfY2x1c3Rlcl9udW1fYmxvY2tzID0gYmxvY2tzX2xpc3QtPm5iX2VsZW07CiAgICAgICAgIGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGJsb2Nrc19saXN0LT5uYl9lbGVtIC0gMTsKICAgICAgICAgaWYgKGJsb2Nrc1tpXS5iaW4uc2l6ZSA+IDAgJiYgYmxvY2tzW2ldLmJpbi5kYXRhKSB7Ci0gICAgICAgICAgICBpbnQgaXNfa2V5ZnJhbWUgPSBibG9ja3NbaV0ubm9uX3NpbXBsZSA/ICFibG9ja3NbaV0ucmVmZXJlbmNlIDogLTE7CisgICAgICAgICAgICBpbnQgaXNfa2V5ZnJhbWUgPSBibG9ja3NbaV0ubm9uX3NpbXBsZSA/IGJsb2Nrc1tpXS5yZWZlcmVuY2UgPT0gSU5UNjRfTUlOIDogLTE7CiAgICAgICAgICAgICB1aW50OF90KiBhZGRpdGlvbmFsID0gYmxvY2tzW2ldLmFkZGl0aW9uYWwuc2l6ZSA+IDAgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2ldLmFkZGl0aW9uYWwuZGF0YSA6IE5VTEw7CiAgICAgICAgICAgICBpZiAoIWJsb2Nrc1tpXS5ub25fc2ltcGxlKQogICAgICAgICAgICAgICAgIGJsb2Nrc1tpXS5kdXJhdGlvbiA9IDA7Ci0gICAgICAgICAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV9ibG9jayhtYXRyb3NrYSwgYmxvY2tzW2ldLmJpbi5kYXRhLAorICAgICAgICAgICAgcmVzID0gbWF0cm9za2FfcGFyc2VfYmxvY2sobWF0cm9za2EsIGJsb2Nrc1tpXS5iaW4uYnVmLCBibG9ja3NbaV0uYmluLmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NbaV0uYmluLnNpemUsIGJsb2Nrc1tpXS5iaW4ucG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cm9za2EtPmN1cnJlbnRfY2x1c3Rlci50aW1lY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc1tpXS5kdXJhdGlvbiwgaXNfa2V5ZnJhbWUsCkBAIC0zMTI3LDcgKzM1MDYsNiBAQAogICAgIGlmICghbWF0cm9za2EtPmNvbnRhaW5zX3NzYSkKICAgICAgICAgcmV0dXJuIG1hdHJvc2thX3BhcnNlX2NsdXN0ZXJfaW5jcmVtZW50YWwobWF0cm9za2EpOwogICAgIHBvcyA9IGF2aW9fdGVsbChtYXRyb3NrYS0+Y3R4LT5wYik7Ci0gICAgbWF0cm9za2EtPnByZXZfcGt0ID0gTlVMTDsKICAgICBpZiAobWF0cm9za2EtPmN1cnJlbnRfaWQpCiAgICAgICAgIHBvcyAtPSA0OyAgLyogc2l6ZW9mIHRoZSBJRCB3aGljaCB3YXMgYWxyZWFkeSByZWFkICovCiAgICAgcmVzICAgICAgICAgPSBlYm1sX3BhcnNlKG1hdHJvc2thLCBtYXRyb3NrYV9jbHVzdGVycywgJmNsdXN0ZXIpOwpAQCAtMzEzNSw4ICszNTEzLDggQEAKICAgICBibG9ja3MgICAgICA9IGJsb2Nrc19saXN0LT5lbGVtOwogICAgIGZvciAoaSA9IDA7IGkgPCBibG9ja3NfbGlzdC0+bmJfZWxlbTsgaSsrKQogICAgICAgICBpZiAoYmxvY2tzW2ldLmJpbi5zaXplID4gMCAmJiBibG9ja3NbaV0uYmluLmRhdGEpIHsKLSAgICAgICAgICAgIGludCBpc19rZXlmcmFtZSA9IGJsb2Nrc1tpXS5ub25fc2ltcGxlID8gIWJsb2Nrc1tpXS5yZWZlcmVuY2UgOiAtMTsKLSAgICAgICAgICAgIHJlcyA9IG1hdHJvc2thX3BhcnNlX2Jsb2NrKG1hdHJvc2thLCBibG9ja3NbaV0uYmluLmRhdGEsCisgICAgICAgICAgICBpbnQgaXNfa2V5ZnJhbWUgPSBibG9ja3NbaV0ubm9uX3NpbXBsZSA/IGJsb2Nrc1tpXS5yZWZlcmVuY2UgPT0gSU5UNjRfTUlOIDogLTE7CisgICAgICAgICAgICByZXMgPSBtYXRyb3NrYV9wYXJzZV9ibG9jayhtYXRyb3NrYSwgYmxvY2tzW2ldLmJpbi5idWYsIGJsb2Nrc1tpXS5iaW4uZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc1tpXS5iaW4uc2l6ZSwgYmxvY2tzW2ldLmJpbi5wb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLnRpbWVjb2RlLCBibG9ja3NbaV0uZHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19rZXlmcmFtZSwgTlVMTCwgMCwgMCwgcG9zLApAQCAtMzE0OSwxMyArMzUyNywxNCBAQAogc3RhdGljIGludCBtYXRyb3NrYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgTWF0cm9za2FEZW11eENvbnRleHQgKm1hdHJvc2thID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQgPSAwOwogCiAgICAgd2hpbGUgKG1hdHJvc2thX2RlbGl2ZXJfcGFja2V0KG1hdHJvc2thLCBwa3QpKSB7CiAgICAgICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKG1hdHJvc2thLT5jdHgtPnBiKTsKICAgICAgICAgaWYgKG1hdHJvc2thLT5kb25lKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IEFWRVJST1JfRU9GOwogICAgICAgICBpZiAobWF0cm9za2FfcGFyc2VfY2x1c3RlcihtYXRyb3NrYSkgPCAwKQotICAgICAgICAgICAgbWF0cm9za2FfcmVzeW5jKG1hdHJvc2thLCBwb3MpOworICAgICAgICAgICAgcmV0ID0gbWF0cm9za2FfcmVzeW5jKG1hdHJvc2thLCBwb3MpOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtMzE2Nyw3ICszNTQ2LDcgQEAKICAgICBNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EgPSBzLT5wcml2X2RhdGE7CiAgICAgTWF0cm9za2FUcmFjayAqdHJhY2tzID0gTlVMTDsKICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07Ci0gICAgaW50IGksIGluZGV4LCBpbmRleF9zdWIsIGluZGV4X21pbjsKKyAgICBpbnQgaSwgaW5kZXgsIGluZGV4X21pbjsKIAogICAgIC8qIFBhcnNlIHRoZSBDVUVTIG5vdyBzaW5jZSB3ZSBuZWVkIHRoZSBpbmRleCBkYXRhIHRvIHNlZWsuICovCiAgICAgaWYgKG1hdHJvc2thLT5jdWVzX3BhcnNpbmdfZGVmZXJyZWQgPiAwKSB7CkBAIC0zMjAxLDE4ICszNTgwLDYgQEAKICAgICAgICAgdHJhY2tzW2ldLmF1ZGlvLnN1Yl9wYWNrZXRfY250ID0gMDsKICAgICAgICAgdHJhY2tzW2ldLmF1ZGlvLmJ1Zl90aW1lY29kZSAgID0gQVZfTk9QVFNfVkFMVUU7CiAgICAgICAgIHRyYWNrc1tpXS5lbmRfdGltZWNvZGUgICAgICAgICA9IDA7Ci0gICAgICAgIGlmICh0cmFja3NbaV0udHlwZSA9PSBNQVRST1NLQV9UUkFDS19UWVBFX1NVQlRJVExFICYmCi0gICAgICAgICAgICB0cmFja3NbaV0uc3RyZWFtICYmCi0gICAgICAgICAgICB0cmFja3NbaV0uc3RyZWFtLT5kaXNjYXJkICE9IEFWRElTQ0FSRF9BTEwpIHsKLSAgICAgICAgICAgIGluZGV4X3N1YiA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoCi0gICAgICAgICAgICAgICAgdHJhY2tzW2ldLnN0cmVhbSwgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICBBVlNFRUtfRkxBR19CQUNLV0FSRCk7Ci0gICAgICAgICAgICB3aGlsZSAoaW5kZXhfc3ViID49IDAgJiYKLSAgICAgICAgICAgICAgICAgIGluZGV4X21pbiA+IDAgJiYKLSAgICAgICAgICAgICAgICAgIHRyYWNrc1tpXS5zdHJlYW0tPmluZGV4X2VudHJpZXNbaW5kZXhfc3ViXS5wb3MgPCBzdC0+aW5kZXhfZW50cmllc1tpbmRleF9taW5dLnBvcyAmJgotICAgICAgICAgICAgICAgICAgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhdLnRpbWVzdGFtcCAtIHRyYWNrc1tpXS5zdHJlYW0tPmluZGV4X2VudHJpZXNbaW5kZXhfc3ViXS50aW1lc3RhbXAgPCAzMDAwMDAwMDAwMCAvIG1hdHJvc2thLT50aW1lX3NjYWxlKQotICAgICAgICAgICAgICAgIGluZGV4X21pbi0tOwotICAgICAgICB9CiAgICAgfQogCiAgICAgYXZpb19zZWVrKHMtPnBiLCBzdC0+aW5kZXhfZW50cmllc1tpbmRleF9taW5dLnBvcywgU0VFS19TRVQpOwpAQCAtMzI2NSw3ICszNjMyLDcgQEAKICAgICBpbnQ2NF90IGVuZF9vZmZzZXQ7CiB9IEN1ZURlc2M7CiAKLS8qIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgYWxsIHRoZSBDdWVzIGFuZCByZXR1cm5zIHRoZSBDdWVEZXNjIGNvcnJlc3BvbmRpbmcgdGhlCisvKiBUaGlzIGZ1bmN0aW9uIHNlYXJjaGVzIGFsbCB0aGUgQ3VlcyBhbmQgcmV0dXJucyB0aGUgQ3VlRGVzYyBjb3JyZXNwb25kaW5nIHRvCiAgKiB0aGUgdGltZXN0YW1wIHRzLiBSZXR1cm5lZCBDdWVEZXNjIHdpbGwgYmUgc3VjaCB0aGF0IHN0YXJ0X3RpbWVfbnMgPD0gdHMgPAogICogZW5kX3RpbWVfbnMuIEFsbCA0IGZpZWxkcyB3aWxsIGJlIHNldCB0byAtMSBpZiB0cyA+PSBmaWxlJ3MgZHVyYXRpb24uCiAgKi8KQEAgLTMzMjMsMTAgKzM2OTAsMTAgQEAKICAgICAgICAgbWF0cm9za2EtPmN1cnJlbnRfaWQgPSAwOwogICAgICAgICBtYXRyb3NrYV9jbGVhcl9xdWV1ZShtYXRyb3NrYSk7CiAgICAgICAgIGlmIChtYXRyb3NrYV9wYXJzZV9jbHVzdGVyKG1hdHJvc2thKSA8IDAgfHwKLSAgICAgICAgICAgIG1hdHJvc2thLT5udW1fcGFja2V0cyA8PSAwKSB7CisgICAgICAgICAgICAhbWF0cm9za2EtPnF1ZXVlKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBwa3QgPSBtYXRyb3NrYS0+cGFja2V0c1swXTsKKyAgICAgICAgcGt0ID0gJm1hdHJvc2thLT5xdWV1ZS0+cGt0OwogICAgICAgICBjbHVzdGVyX3BvcyArPSBjbHVzdGVyX2xlbmd0aCArIDEyOyAvLyAxMiBpcyB0aGUgb2Zmc2V0IG9mIHRoZSBjbHVzdGVyIGlkIGFuZCBsZW5ndGguCiAgICAgICAgIGlmICghKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSB7CiAgICAgICAgICAgICBydiA9IDA7CkBAIC0zNTA1LDcgKzM4NzIsNyBAQAogICAgIHJldHVybiAoaW50NjRfdCliYW5kd2lkdGg7CiB9CiAKLXN0YXRpYyBpbnQgd2VibV9kYXNoX21hbmlmZXN0X2N1ZXMoQVZGb3JtYXRDb250ZXh0ICpzKQorc3RhdGljIGludCB3ZWJtX2Rhc2hfbWFuaWZlc3RfY3VlcyhBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3QgaW5pdF9yYW5nZSkKIHsKICAgICBNYXRyb3NrYURlbXV4Q29udGV4dCAqbWF0cm9za2EgPSBzLT5wcml2X2RhdGE7CiAgICAgRWJtbExpc3QgKnNlZWtoZWFkX2xpc3QgPSAmbWF0cm9za2EtPnNlZWtoZWFkOwpAQCAtMzUxMyw2ICszODgwLDcgQEAKICAgICBjaGFyICpidWY7CiAgICAgaW50NjRfdCBjdWVzX3N0YXJ0ID0gLTEsIGN1ZXNfZW5kID0gLTEsIGJlZm9yZV9wb3MsIGJhbmR3aWR0aDsKICAgICBpbnQgaTsKKyAgICBpbnQgZW5kID0gMDsKIAogICAgIC8vIGRldGVybWluZSBjdWVzIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zCiAgICAgZm9yIChpID0gMDsgaSA8IHNlZWtoZWFkX2xpc3QtPm5iX2VsZW07IGkrKykKQEAgLTM1NDQsNiArMzkxMiwxMSBAQAogICAgIC8vIGN1ZXMgZW5kCiAgICAgYXZfZGljdF9zZXRfaW50KCZzLT5zdHJlYW1zWzBdLT5tZXRhZGF0YSwgQ1VFU19FTkQsIGN1ZXNfZW5kLCAwKTsKIAorICAgIC8vIGlmIHRoZSBmaWxlIGhhcyBjdWVzIGF0IHRoZSBzdGFydCwgZml4IHVwIHRoZSBpbml0IHJhbmdlIHNvIHRodAorICAgIC8vIGl0IGRvZXMgbm90IGluY2x1ZGUgaXQKKyAgICBpZiAoY3Vlc19zdGFydCA8PSBpbml0X3JhbmdlKQorICAgICAgICBhdl9kaWN0X3NldF9pbnQoJnMtPnN0cmVhbXNbMF0tPm1ldGFkYXRhLCBJTklUSUFMSVpBVElPTl9SQU5HRSwgY3Vlc19zdGFydCAtIDEsIDApOworCiAgICAgLy8gYmFuZHdpZHRoCiAgICAgYmFuZHdpZHRoID0gd2VibV9kYXNoX21hbmlmZXN0X2NvbXB1dGVfYmFuZHdpZHRoKHMsIGN1ZXNfc3RhcnQpOwogICAgIGlmIChiYW5kd2lkdGggPCAwKSByZXR1cm4gLTE7CkBAIC0zNTU4LDEwICszOTMxLDE4IEBACiAgICAgaWYgKCFidWYpIHJldHVybiAtMTsKICAgICBzdHJjcHkoYnVmLCAiIik7CiAgICAgZm9yIChpID0gMDsgaSA8IHMtPnN0cmVhbXNbMF0tPm5iX2luZGV4X2VudHJpZXM7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWYsIChpICsgMSkgKiAyMCAqIHNpemVvZihjaGFyKSwKLSAgICAgICAgICAgICAgICAgIiVzJSIgUFJJZDY0LCBidWYsIHMtPnN0cmVhbXNbMF0tPmluZGV4X2VudHJpZXNbaV0udGltZXN0YW1wKTsKLSAgICAgICAgaWYgKGkgIT0gcy0+c3RyZWFtc1swXS0+bmJfaW5kZXhfZW50cmllcyAtIDEpCisgICAgICAgIGludCByZXQgPSBzbnByaW50ZihidWYgKyBlbmQsIDIwICogc2l6ZW9mKGNoYXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUiIFBSSWQ2NCwgcy0+c3RyZWFtc1swXS0+aW5kZXhfZW50cmllc1tpXS50aW1lc3RhbXApOworICAgICAgICBpZiAocmV0IDw9IDAgfHwgKHJldCA9PSAyMCAmJiBpID09ICBzLT5zdHJlYW1zWzBdLT5uYl9pbmRleF9lbnRyaWVzIC0gMSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0aW1lc3RhbXAgdG9vIGxvbmcuXG4iKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGVuZCArPSByZXQ7CisgICAgICAgIGlmIChpICE9IHMtPnN0cmVhbXNbMF0tPm5iX2luZGV4X2VudHJpZXMgLSAxKSB7CiAgICAgICAgICAgICBzdHJuY2F0KGJ1ZiwgIiwiLCBzaXplb2YoY2hhcikpOworICAgICAgICAgICAgZW5kKys7CisgICAgICAgIH0KICAgICB9CiAgICAgYXZfZGljdF9zZXQoJnMtPnN0cmVhbXNbMF0tPm1ldGFkYXRhLCBDVUVfVElNRVNUQU1QUywgYnVmLCAwKTsKICAgICBhdl9mcmVlKGJ1Zik7CkBAIC0zNTczLDEyICszOTU0LDE4IEBACiB7CiAgICAgY2hhciAqYnVmOwogICAgIGludCByZXQgPSBtYXRyb3NrYV9yZWFkX2hlYWRlcihzKTsKKyAgICBpbnQ2NF90IGluaXRfcmFuZ2U7CiAgICAgTWF0cm9za2FUcmFjayAqdHJhY2tzOwogICAgIE1hdHJvc2thRGVtdXhDb250ZXh0ICptYXRyb3NrYSA9IHMtPnByaXZfZGF0YTsKICAgICBpZiAocmV0KSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBmaWxlIGhlYWRlcnNcbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQorICAgIGlmICghcy0+bmJfc3RyZWFtcykgeworICAgICAgICBtYXRyb3NrYV9yZWFkX2Nsb3NlKHMpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gc3RyZWFtcyBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KIAogICAgIGlmICghbWF0cm9za2EtPmlzX2xpdmUpIHsKICAgICAgICAgYnVmID0gYXZfYXNwcmludGYoIiVnIiwgbWF0cm9za2EtPmR1cmF0aW9uKTsKQEAgLTM1ODgsMTkgKzM5NzUsMzMgQEAKIAogICAgICAgICAvLyBpbml0aWFsaXphdGlvbiByYW5nZQogICAgICAgICAvLyA1IGlzIHRoZSBvZmZzZXQgb2YgQ2x1c3RlciBJRC4KLSAgICAgICAgYXZfZGljdF9zZXRfaW50KCZzLT5zdHJlYW1zWzBdLT5tZXRhZGF0YSwgSU5JVElBTElaQVRJT05fUkFOR0UsIGF2aW9fdGVsbChzLT5wYikgLSA1LCAwKTsKKyAgICAgICAgaW5pdF9yYW5nZSA9IGF2aW9fdGVsbChzLT5wYikgLSA1OworICAgICAgICBhdl9kaWN0X3NldF9pbnQoJnMtPnN0cmVhbXNbMF0tPm1ldGFkYXRhLCBJTklUSUFMSVpBVElPTl9SQU5HRSwgaW5pdF9yYW5nZSwgMCk7CiAgICAgfQogCiAgICAgLy8gYmFzZW5hbWUgb2YgdGhlIGZpbGUKLSAgICBidWYgPSBzdHJyY2hyKHMtPmZpbGVuYW1lLCAnLycpOwotICAgIGF2X2RpY3Rfc2V0KCZzLT5zdHJlYW1zWzBdLT5tZXRhZGF0YSwgRklMRU5BTUUsIGJ1ZiA/ICsrYnVmIDogcy0+ZmlsZW5hbWUsIDApOworICAgIGJ1ZiA9IHN0cnJjaHIocy0+dXJsLCAnLycpOworICAgIGF2X2RpY3Rfc2V0KCZzLT5zdHJlYW1zWzBdLT5tZXRhZGF0YSwgRklMRU5BTUUsIGJ1ZiA/ICsrYnVmIDogcy0+dXJsLCAwKTsKIAogICAgIC8vIHRyYWNrIG51bWJlcgogICAgIHRyYWNrcyA9IG1hdHJvc2thLT50cmFja3MuZWxlbTsKICAgICBhdl9kaWN0X3NldF9pbnQoJnMtPnN0cmVhbXNbMF0tPm1ldGFkYXRhLCBUUkFDS19OVU1CRVIsIHRyYWNrc1swXS5udW0sIDApOwogCiAgICAgLy8gcGFyc2UgdGhlIGN1ZXMgYW5kIHBvcHVsYXRlIEN1ZSByZWxhdGVkIGZpZWxkcwotICAgIHJldHVybiBtYXRyb3NrYS0+aXNfbGl2ZSA/IDAgOiB3ZWJtX2Rhc2hfbWFuaWZlc3RfY3VlcyhzKTsKKyAgICBpZiAoIW1hdHJvc2thLT5pc19saXZlKSB7CisgICAgICAgIHJldCA9IHdlYm1fZGFzaF9tYW5pZmVzdF9jdWVzKHMsIGluaXRfcmFuZ2UpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgQ3Vlc1xuIik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXNlIHRoZSBiYW5kd2lkdGggZnJvbSB0aGUgY29tbWFuZCBsaW5lIGlmIGl0IHdhcyBwcm92aWRlZAorICAgIGlmIChtYXRyb3NrYS0+YmFuZHdpZHRoID4gMCkgeworICAgICAgICBhdl9kaWN0X3NldF9pbnQoJnMtPnN0cmVhbXNbMF0tPm1ldGFkYXRhLCBCQU5EV0lEVEgsCisgICAgICAgICAgICAgICAgICAgICAgICBtYXRyb3NrYS0+YmFuZHdpZHRoLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgd2VibV9kYXNoX21hbmlmZXN0X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKQEAgLTM2MTEsNiArNDAxMiw3IEBACiAjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihNYXRyb3NrYURlbXV4Q29udGV4dCwgeCkKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CiAgICAgeyAibGl2ZSIsICJmbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgaW5wdXQgaXMgYSBsaXZlIGZpbGUgdGhhdCBvbmx5IGhhcyB0aGUgaGVhZGVycy4iLCBPRkZTRVQoaXNfbGl2ZSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIDAsIDEsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCisgICAgeyAiYmFuZHdpZHRoIiwgImJhbmR3aWR0aCBvZiB0aGlzIHN0cmVhbSB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIERBU0ggbWFuaWZlc3QuIiwgT0ZGU0VUKGJhbmR3aWR0aCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKICAgICB7IE5VTEwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21hdHJvc2thZW5jLmMgYi9saWJhdmZvcm1hdC9tYXRyb3NrYWVuYy5jCmluZGV4IGY0MjQzNGIuLjU5NTBiNGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L21hdHJvc2thZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvbWF0cm9za2FlbmMuYwpAQCAtMzcsMTIgKzM3LDE1IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZmxvYXQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKQEAgLTkwLDkgKzkzLDIyIEBACiB0eXBlZGVmIHN0cnVjdCBta3ZfdHJhY2sgewogICAgIGludCAgICAgICAgICAgICB3cml0ZV9kdHM7CiAgICAgaW50ICAgICAgICAgICAgIGhhc19jdWU7CisgICAgaW50ICAgICAgICAgICAgIHNhbXBsZV9yYXRlOworICAgIGludDY0X3QgICAgICAgICBzYW1wbGVfcmF0ZV9vZmZzZXQ7CisgICAgaW50NjRfdCAgICAgICAgIGNvZGVjcHJpdl9vZmZzZXQ7CiAgICAgaW50NjRfdCAgICAgICAgIHRzX29mZnNldDsKIH0gbWt2X3RyYWNrOwogCit0eXBlZGVmIHN0cnVjdCBta3ZfYXR0YWNobWVudCB7CisgICAgaW50ICAgICAgICAgICAgIHN0cmVhbV9pZHg7CisgICAgdWludDMyX3QgICAgICAgIGZpbGV1aWQ7Cit9IG1rdl9hdHRhY2htZW50OworCit0eXBlZGVmIHN0cnVjdCBta3ZfYXR0YWNobWVudHMgeworICAgIG1rdl9hdHRhY2htZW50ICAqZW50cmllczsKKyAgICBpbnQgICAgICAgICAgICAgbnVtX2VudHJpZXM7Cit9IG1rdl9hdHRhY2htZW50czsKKwogI2RlZmluZSBNT0RFX01BVFJPU0tBdjIgMHgwMQogI2RlZmluZSBNT0RFX1dFQk0gICAgICAgMHgwMgogCkBAIC0xMDQsNiArMTIwLDEyIEBACiAgICAgY29uc3QgQVZDbGFzcyAgKmNsYXNzOwogICAgIGludCAgICAgICAgICAgICBtb2RlOwogICAgIEFWSU9Db250ZXh0ICAgKmR5bl9iYzsKKyAgICBBVklPQ29udGV4dCAgICAgKnRhZ3NfYmM7CisgICAgZWJtbF9tYXN0ZXIgICAgIHRhZ3M7CisgICAgQVZJT0NvbnRleHQgICAgICppbmZvX2JjOworICAgIGVibWxfbWFzdGVyICAgICBpbmZvOworICAgIEFWSU9Db250ZXh0ICAgICAqdHJhY2tzX2JjOworICAgIGVibWxfbWFzdGVyICAgICB0cmFja3NfbWFzdGVyOwogICAgIGVibWxfbWFzdGVyICAgICBzZWdtZW50OwogICAgIGludDY0X3QgICAgICAgICBzZWdtZW50X29mZnNldDsKICAgICBlYm1sX21hc3RlciAgICAgY2x1c3RlcjsKQEAgLTExNCwxMCArMTM2LDEyIEBACiAgICAgbWt2X3NlZWtoZWFkICAgICptYWluX3NlZWtoZWFkOwogICAgIG1rdl9jdWVzICAgICAgICAqY3VlczsKICAgICBta3ZfdHJhY2sgICAgICAgKnRyYWNrczsKKyAgICBta3ZfYXR0YWNobWVudHMgKmF0dGFjaG1lbnRzOwogCiAgICAgQVZQYWNrZXQgICAgICAgIGN1cl9hdWRpb19wa3Q7CiAKICAgICBpbnQgaGF2ZV9hdHRhY2htZW50czsKKyAgICBpbnQgaGF2ZV92aWRlbzsKIAogICAgIGludCByZXNlcnZlX2N1ZXNfc3BhY2U7CiAgICAgaW50IGNsdXN0ZXJfc2l6ZV9saW1pdDsKQEAgLTEyNiw2ICsxNTAsNyBAQAogICAgIGludCBpc19kYXNoOwogICAgIGludCBkYXNoX3RyYWNrX251bWJlcjsKICAgICBpbnQgaXNfbGl2ZTsKKyAgICBpbnQgd3JpdGVfY3JjOwogCiAgICAgdWludDMyX3QgY2hhcHRlcl9pZF9vZmZzZXQ7CiAgICAgaW50IHdyb3RlX2NoYXB0ZXJzOwpAQCAtMjc3LDcgKzMwMiw3IEBACiAgICAgLy8gc2l6ZSB3ZSBuZWVkIHRvIHJlc2VydmUgc28gMiBjYXNlcywgd2UgdXNlIDggYnl0ZXMgdG8gc3RvcmUgdGhlCiAgICAgLy8gc2l6ZSBpZiBwb3NzaWJsZSwgMSBieXRlIG90aGVyd2lzZQogICAgIGlmIChzaXplIDwgMTApCi0gICAgICAgIHB1dF9lYm1sX251bShwYiwgc2l6ZSAtIDEsIDApOworICAgICAgICBwdXRfZWJtbF9udW0ocGIsIHNpemUgLSAyLCAwKTsKICAgICBlbHNlCiAgICAgICAgIHB1dF9lYm1sX251bShwYiwgc2l6ZSAtIDksIDgpOwogICAgIGZmaW9fZmlsbChwYiwgMCwgY3VycmVudHBvcyArIHNpemUgLSBhdmlvX3RlbGwocGIpKTsKQEAgLTMwMiw2ICszMjcsNjQgQEAKICAgICBhdmlvX3NlZWsocGIsIHBvcywgU0VFS19TRVQpOwogfQogCitzdGF0aWMgaW50IHN0YXJ0X2VibWxfbWFzdGVyX2NyYzMyKEFWSU9Db250ZXh0ICpwYiwgQVZJT0NvbnRleHQgKipkeW5fY3AsIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYm1sX21hc3RlciAqbWFzdGVyLCB1bnNpZ25lZCBpbnQgZWxlbWVudGlkLCB1aW50NjRfdCBleHBlY3RlZHNpemUpCit7CisgICAgaW50IHJldDsKKworICAgIGlmICgocmV0ID0gYXZpb19vcGVuX2R5bl9idWYoZHluX2NwKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CisgICAgICAgICptYXN0ZXIgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgZWxlbWVudGlkLCBleHBlY3RlZHNpemUpOworICAgICAgICBpZiAobWt2LT53cml0ZV9jcmMgJiYgbWt2LT5tb2RlICE9IE1PREVfV0VCTSkKKyAgICAgICAgICAgIHB1dF9lYm1sX3ZvaWQoKmR5bl9jcCwgNik7IC8qIFJlc2VydmUgc3BhY2UgZm9yIENSQzMyIHNvIHBvc2l0aW9uL3NpemUgY2FsY3VsYXRpb25zIHVzaW5nIGF2aW9fdGVsbCgpIHRha2UgaXQgaW50byBhY2NvdW50ICovCisgICAgfSBlbHNlCisgICAgICAgICptYXN0ZXIgPSBzdGFydF9lYm1sX21hc3RlcigqZHluX2NwLCBlbGVtZW50aWQsIGV4cGVjdGVkc2l6ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZW5kX2VibWxfbWFzdGVyX2NyYzMyKEFWSU9Db250ZXh0ICpwYiwgQVZJT0NvbnRleHQgKipkeW5fY3AsIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVibWxfbWFzdGVyIG1hc3RlcikKK3sKKyAgICB1aW50OF90ICpidWYsIGNyY1s0XTsKKyAgICBpbnQgc2l6ZSwgc2tpcCA9IDA7CisKKyAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKKyAgICAgICAgc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZigqZHluX2NwLCAmYnVmKTsKKyAgICAgICAgaWYgKG1rdi0+d3JpdGVfY3JjICYmIG1rdi0+bW9kZSAhPSBNT0RFX1dFQk0pIHsKKyAgICAgICAgICAgIHNraXAgPSA2OyAvKiBTa2lwIHJlc2VydmVkIDYtYnl0ZSBsb25nIHZvaWQgZWxlbWVudCBmcm9tIHRoZSBkeW5hbWljIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIEFWX1dMMzIoY3JjLCBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRV9MRSksIFVJTlQzMl9NQVgsIGJ1ZiArIHNraXAsIHNpemUgLSBza2lwKSBeIFVJTlQzMl9NQVgpOworICAgICAgICAgICAgcHV0X2VibWxfYmluYXJ5KHBiLCBFQk1MX0lEX0NSQzMyLCBjcmMsIHNpemVvZihjcmMpKTsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3dyaXRlKHBiLCBidWYgKyBza2lwLCBzaXplIC0gc2tpcCk7CisgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgbWFzdGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbmRfZWJtbF9tYXN0ZXIoKmR5bl9jcCwgbWFzdGVyKTsKKyAgICAgICAgc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZigqZHluX2NwLCAmYnVmKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgYnVmLCBzaXplKTsKKyAgICB9CisgICAgYXZfZnJlZShidWYpOworICAgICpkeW5fY3AgPSBOVUxMOworfQorCisvKioKKyogQ29tcGxldGUgZWJtbCBtYXN0ZXIgd2hpdGhvdXQgZGVzdHJveWluZyB0aGUgYnVmZmVyLCBhbGxvd2luZyBmb3IgbGF0ZXIgdXBkYXRlcworKi8KK3N0YXRpYyB2b2lkIGVuZF9lYm1sX21hc3Rlcl9jcmMzMl9wcmVsaW1pbmFyeShBVklPQ29udGV4dCAqcGIsIEFWSU9Db250ZXh0ICoqZHluX2NwLCBNYXRyb3NrYU11eENvbnRleHQgKm1rdiwKKyAgICBlYm1sX21hc3RlciBtYXN0ZXIpCit7CisgICAgaWYgKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CisKKyAgICAgICAgdWludDhfdCAqYnVmOworICAgICAgICBpbnQgc2l6ZSA9IGF2aW9fZ2V0X2R5bl9idWYoKmR5bl9jcCwgJmJ1Zik7CisKKyAgICAgICAgYXZpb193cml0ZShwYiwgYnVmLCBzaXplKTsKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBtYXN0ZXIpOworICAgIH0KK30KKwogc3RhdGljIHZvaWQgcHV0X3hpcGhfc2l6ZShBVklPQ29udGV4dCAqcGIsIGludCBzaXplKQogewogICAgIGZmaW9fZmlsbChwYiwgMjU1LCBzaXplIC8gMjU1KTsKQEAgLTMxMiw2ICszOTUsMjMgQEAKICAqIEZyZWUgdGhlIG1lbWJlcnMgYWxsb2NhdGVkIGluIHRoZSBtdXggY29udGV4dC4KICAqLwogc3RhdGljIHZvaWQgbWt2X2ZyZWUoTWF0cm9za2FNdXhDb250ZXh0ICpta3YpIHsKKyAgICB1aW50OF90KiBidWY7CisgICAgaWYgKG1rdi0+ZHluX2JjKSB7CisgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1Zihta3YtPmR5bl9iYywgJmJ1Zik7CisgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICB9CisgICAgaWYgKG1rdi0+aW5mb19iYykgeworICAgICAgICBhdmlvX2Nsb3NlX2R5bl9idWYobWt2LT5pbmZvX2JjLCAmYnVmKTsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgIH0KKyAgICBpZiAobWt2LT50cmFja3NfYmMpIHsKKyAgICAgICAgYXZpb19jbG9zZV9keW5fYnVmKG1rdi0+dHJhY2tzX2JjLCAmYnVmKTsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgIH0KKyAgICBpZiAobWt2LT50YWdzX2JjKSB7CisgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1Zihta3YtPnRhZ3NfYmMsICZidWYpOworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgfQogICAgIGlmIChta3YtPm1haW5fc2Vla2hlYWQpIHsKICAgICAgICAgYXZfZnJlZXAoJm1rdi0+bWFpbl9zZWVraGVhZC0+ZW50cmllcyk7CiAgICAgICAgIGF2X2ZyZWVwKCZta3YtPm1haW5fc2Vla2hlYWQpOwpAQCAtMzIwLDYgKzQyMCwxMCBAQAogICAgICAgICBhdl9mcmVlcCgmbWt2LT5jdWVzLT5lbnRyaWVzKTsKICAgICAgICAgYXZfZnJlZXAoJm1rdi0+Y3Vlcyk7CiAgICAgfQorICAgIGlmIChta3YtPmF0dGFjaG1lbnRzKSB7CisgICAgICAgIGF2X2ZyZWVwKCZta3YtPmF0dGFjaG1lbnRzLT5lbnRyaWVzKTsKKyAgICAgICAgYXZfZnJlZXAoJm1rdi0+YXR0YWNobWVudHMpOworICAgIH0KICAgICBhdl9mcmVlcCgmbWt2LT50cmFja3MpOwogICAgIGF2X2ZyZWVwKCZta3YtPnN0cmVhbV9kdXJhdGlvbnMpOwogICAgIGF2X2ZyZWVwKCZta3YtPnN0cmVhbV9kdXJhdGlvbl9vZmZzZXRzKTsKQEAgLTM0OCw5ICs0NTIsOSBAQAogICAgIGlmIChudW1lbGVtZW50cyA+IDApIHsKICAgICAgICAgbmV3X3NlZWtoZWFkLT5maWxlcG9zID0gYXZpb190ZWxsKHBiKTsKICAgICAgICAgLy8gMjEgYnl0ZXMgbWF4IGZvciBhIHNlZWsgZW50cnksIDEwIGJ5dGVzIG1heCBmb3IgdGhlIFNlZWtIZWFkIElECi0gICAgICAgIC8vIGFuZCBzaXplLCBhbmQgMyBieXRlcyB0byBndWFyYW50ZWUgdGhhdCBhbiBFQk1MIHZvaWQgZWxlbWVudAotICAgICAgICAvLyB3aWxsIGZpdCBhZnRlcndhcmRzCi0gICAgICAgIG5ld19zZWVraGVhZC0+cmVzZXJ2ZWRfc2l6ZSA9IG51bWVsZW1lbnRzICogTUFYX1NFRUtFTlRSWV9TSVpFICsgMTM7CisgICAgICAgIC8vIGFuZCBzaXplLCA2IGJ5dGVzIGZvciBhIENSQzMyIGVsZW1lbnQsIGFuZCAzIGJ5dGVzIHRvIGd1YXJhbnRlZQorICAgICAgICAvLyB0aGF0IGFuIEVCTUwgdm9pZCBlbGVtZW50IHdpbGwgZml0IGFmdGVyd2FyZHMKKyAgICAgICAgbmV3X3NlZWtoZWFkLT5yZXNlcnZlZF9zaXplID0gbnVtZWxlbWVudHMgKiBNQVhfU0VFS0VOVFJZX1NJWkUgKyAxOTsKICAgICAgICAgbmV3X3NlZWtoZWFkLT5tYXhfZW50cmllcyAgID0gbnVtZWxlbWVudHM7CiAgICAgICAgIHB1dF9lYm1sX3ZvaWQocGIsIG5ld19zZWVraGVhZC0+cmVzZXJ2ZWRfc2l6ZSk7CiAgICAgfQpAQCAtMzg3LDYgKzQ5MSw3IEBACiAgKi8KIHN0YXRpYyBpbnQ2NF90IG1rdl93cml0ZV9zZWVraGVhZChBVklPQ29udGV4dCAqcGIsIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2KQogeworICAgIEFWSU9Db250ZXh0ICpkeW5fY3A7CiAgICAgbWt2X3NlZWtoZWFkICpzZWVraGVhZCA9IG1rdi0+bWFpbl9zZWVraGVhZDsKICAgICBlYm1sX21hc3RlciBtZXRhc2Vlaywgc2Vla2VudHJ5OwogICAgIGludDY0X3QgY3VycmVudHBvczsKQEAgLTQwMSwyMCArNTA2LDI1IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtZXRhc2VlayA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9TRUVLSEVBRCwgc2Vla2hlYWQtPnJlc2VydmVkX3NpemUpOworICAgIGlmIChzdGFydF9lYm1sX21hc3Rlcl9jcmMzMihwYiwgJmR5bl9jcCwgbWt2LCAmbWV0YXNlZWssIE1BVFJPU0tBX0lEX1NFRUtIRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVraGVhZC0+cmVzZXJ2ZWRfc2l6ZSkgPCAwKSB7CisgICAgICAgIGN1cnJlbnRwb3MgPSAtMTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKwogICAgIGZvciAoaSA9IDA7IGkgPCBzZWVraGVhZC0+bnVtX2VudHJpZXM7IGkrKykgewogICAgICAgICBta3Zfc2Vla2hlYWRfZW50cnkgKmVudHJ5ID0gJnNlZWtoZWFkLT5lbnRyaWVzW2ldOwogCi0gICAgICAgIHNlZWtlbnRyeSA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9TRUVLRU5UUlksIE1BWF9TRUVLRU5UUllfU0laRSk7CisgICAgICAgIHNlZWtlbnRyeSA9IHN0YXJ0X2VibWxfbWFzdGVyKGR5bl9jcCwgTUFUUk9TS0FfSURfU0VFS0VOVFJZLCBNQVhfU0VFS0VOVFJZX1NJWkUpOwogCi0gICAgICAgIHB1dF9lYm1sX2lkKHBiLCBNQVRST1NLQV9JRF9TRUVLSUQpOwotICAgICAgICBwdXRfZWJtbF9udW0ocGIsIGVibWxfaWRfc2l6ZShlbnRyeS0+ZWxlbWVudGlkKSwgMCk7Ci0gICAgICAgIHB1dF9lYm1sX2lkKHBiLCBlbnRyeS0+ZWxlbWVudGlkKTsKKyAgICAgICAgcHV0X2VibWxfaWQoZHluX2NwLCBNQVRST1NLQV9JRF9TRUVLSUQpOworICAgICAgICBwdXRfZWJtbF9udW0oZHluX2NwLCBlYm1sX2lkX3NpemUoZW50cnktPmVsZW1lbnRpZCksIDApOworICAgICAgICBwdXRfZWJtbF9pZChkeW5fY3AsIGVudHJ5LT5lbGVtZW50aWQpOwogCi0gICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1NFRUtQT1NJVElPTiwgZW50cnktPnNlZ21lbnRwb3MpOwotICAgICAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIHNlZWtlbnRyeSk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9TRUVLUE9TSVRJT04sIGVudHJ5LT5zZWdtZW50cG9zKTsKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyKGR5bl9jcCwgc2Vla2VudHJ5KTsKICAgICB9Ci0gICAgZW5kX2VibWxfbWFzdGVyKHBiLCBtZXRhc2Vlayk7CisgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyKHBiLCAmZHluX2NwLCBta3YsIG1ldGFzZWVrKTsKIAogICAgIGlmIChzZWVraGVhZC0+cmVzZXJ2ZWRfc2l6ZSA+IDApIHsKICAgICAgICAgdWludDY0X3QgcmVtYWluaW5nID0gc2Vla2hlYWQtPmZpbGVwb3MgKyBzZWVraGVhZC0+cmVzZXJ2ZWRfc2l6ZSAtIGF2aW9fdGVsbChwYik7CkBAIC00NjUsMTMgKzU3NSwxNiBAQAogCiBzdGF0aWMgaW50NjRfdCBta3Zfd3JpdGVfY3VlcyhBVkZvcm1hdENvbnRleHQgKnMsIG1rdl9jdWVzICpjdWVzLCBta3ZfdHJhY2sgKnRyYWNrcywgaW50IG51bV90cmFja3MpCiB7Ci0gICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKmR5bl9jcCwgKnBiID0gcy0+cGI7CiAgICAgZWJtbF9tYXN0ZXIgY3Vlc19lbGVtZW50OwogICAgIGludDY0X3QgY3VycmVudHBvczsKLSAgICBpbnQgaSwgajsKKyAgICBpbnQgaSwgaiwgcmV0OwogCiAgICAgY3VycmVudHBvcyA9IGF2aW9fdGVsbChwYik7Ci0gICAgY3Vlc19lbGVtZW50ID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX0NVRVMsIDApOworICAgIHJldCA9IHN0YXJ0X2VibWxfbWFzdGVyX2NyYzMyKHBiLCAmZHluX2NwLCBta3YsICZjdWVzX2VsZW1lbnQsIE1BVFJPU0tBX0lEX0NVRVMsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgZm9yIChpID0gMDsgaSA8IGN1ZXMtPm51bV9lbnRyaWVzOyBpKyspIHsKICAgICAgICAgZWJtbF9tYXN0ZXIgY3VlcG9pbnQsIHRyYWNrX3Bvc2l0aW9uczsKQEAgLTQ4NSwxNCArNTk4LDE0IEBACiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWVzLT5udW1fZW50cmllcyAtIGkgJiYgZW50cnlbal0ucHRzID09IHB0czsgaisrKSB7CiAgICAgICAgICAgICBpbnQgdHJhY2tudW0gPSBlbnRyeVtqXS5zdHJlYW1faWR4OwogICAgICAgICAgICAgYXZfYXNzZXJ0MCh0cmFja251bT49MCAmJiB0cmFja251bTxudW1fdHJhY2tzKTsKLSAgICAgICAgICAgIGlmICh0cmFja3NbdHJhY2tudW1dLmhhc19jdWUgJiYgcy0+c3RyZWFtc1t0cmFja251bV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgICAgIGlmICh0cmFja3NbdHJhY2tudW1dLmhhc19jdWUgJiYgcy0+c3RyZWFtc1t0cmFja251bV0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIHRyYWNrc1t0cmFja251bV0uaGFzX2N1ZSA9IDE7CiAgICAgICAgICAgICBjdHBfbmIgKys7CiAgICAgICAgIH0KIAotICAgICAgICBjdWVwb2ludCA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9QT0lOVEVOVFJZLCBNQVhfQ1VFUE9JTlRfU0laRShjdHBfbmIpKTsKLSAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ1VFVElNRSwgcHRzKTsKKyAgICAgICAgY3VlcG9pbnQgPSBzdGFydF9lYm1sX21hc3RlcihkeW5fY3AsIE1BVFJPU0tBX0lEX1BPSU5URU5UUlksIE1BWF9DVUVQT0lOVF9TSVpFKGN0cF9uYikpOworICAgICAgICBwdXRfZWJtbF91aW50KGR5bl9jcCwgTUFUUk9TS0FfSURfQ1VFVElNRSwgcHRzKTsKIAogICAgICAgICAvLyBwdXQgYWxsIHRoZSBlbnRyaWVzIGZyb20gZGlmZmVyZW50IHRyYWNrcyB0aGF0IGhhdmUgdGhlIGV4YWN0IHNhbWUKICAgICAgICAgLy8gdGltZXN0YW1wIGludG8gdGhlIHNhbWUgQ3VlUG9pbnQKQEAgLTUwMSwzOCArNjE0LDM4IEBACiAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdWVzLT5udW1fZW50cmllcyAtIGkgJiYgZW50cnlbal0ucHRzID09IHB0czsgaisrKSB7CiAgICAgICAgICAgICBpbnQgdHJhY2tudW0gPSBlbnRyeVtqXS5zdHJlYW1faWR4OwogICAgICAgICAgICAgYXZfYXNzZXJ0MCh0cmFja251bT49MCAmJiB0cmFja251bTxudW1fdHJhY2tzKTsKLSAgICAgICAgICAgIGlmICh0cmFja3NbdHJhY2tudW1dLmhhc19jdWUgJiYgcy0+c3RyZWFtc1t0cmFja251bV0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgICAgIGlmICh0cmFja3NbdHJhY2tudW1dLmhhc19jdWUgJiYgcy0+c3RyZWFtc1t0cmFja251bV0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIHRyYWNrc1t0cmFja251bV0uaGFzX2N1ZSA9IDE7Ci0gICAgICAgICAgICB0cmFja19wb3NpdGlvbnMgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQ1VFVFJBQ0tQT1NJVElPTiwgTUFYX0NVRVRSQUNLUE9TX1NJWkUpOwotICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ1VFVFJBQ0sgICAgICAgICAgICwgZW50cnlbal0udHJhY2tudW0gICApOwotICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ1VFQ0xVU1RFUlBPU0lUSU9OICwgZW50cnlbal0uY2x1c3Rlcl9wb3MpOwotICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ1VFUkVMQVRJVkVQT1NJVElPTiwgZW50cnlbal0ucmVsYXRpdmVfcG9zKTsKKyAgICAgICAgICAgIHRyYWNrX3Bvc2l0aW9ucyA9IHN0YXJ0X2VibWxfbWFzdGVyKGR5bl9jcCwgTUFUUk9TS0FfSURfQ1VFVFJBQ0tQT1NJVElPTiwgTUFYX0NVRVRSQUNLUE9TX1NJWkUpOworICAgICAgICAgICAgcHV0X2VibWxfdWludChkeW5fY3AsIE1BVFJPU0tBX0lEX0NVRVRSQUNLICAgICAgICAgICAsIGVudHJ5W2pdLnRyYWNrbnVtICAgKTsKKyAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9DVUVDTFVTVEVSUE9TSVRJT04gLCBlbnRyeVtqXS5jbHVzdGVyX3Bvcyk7CisgICAgICAgICAgICBwdXRfZWJtbF91aW50KGR5bl9jcCwgTUFUUk9TS0FfSURfQ1VFUkVMQVRJVkVQT1NJVElPTiwgZW50cnlbal0ucmVsYXRpdmVfcG9zKTsKICAgICAgICAgICAgIGlmIChlbnRyeVtqXS5kdXJhdGlvbiAhPSAtMSkKLSAgICAgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9DVUVEVVJBVElPTiAgICAsIGVudHJ5W2pdLmR1cmF0aW9uKTsKLSAgICAgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgdHJhY2tfcG9zaXRpb25zKTsKKyAgICAgICAgICAgICAgICBwdXRfZWJtbF91aW50KGR5bl9jcCwgTUFUUk9TS0FfSURfQ1VFRFVSQVRJT04gICAgLCBlbnRyeVtqXS5kdXJhdGlvbik7CisgICAgICAgICAgICBlbmRfZWJtbF9tYXN0ZXIoZHluX2NwLCB0cmFja19wb3NpdGlvbnMpOwogICAgICAgICB9CiAgICAgICAgIGkgKz0gaiAtIDE7Ci0gICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgY3VlcG9pbnQpOworICAgICAgICBlbmRfZWJtbF9tYXN0ZXIoZHluX2NwLCBjdWVwb2ludCk7CiAgICAgfQotICAgIGVuZF9lYm1sX21hc3RlcihwYiwgY3Vlc19lbGVtZW50KTsKKyAgICBlbmRfZWJtbF9tYXN0ZXJfY3JjMzIocGIsICZkeW5fY3AsIG1rdiwgY3Vlc19lbGVtZW50KTsKIAogICAgIHJldHVybiBjdXJyZW50cG9zOwogfQogCi1zdGF0aWMgaW50IHB1dF94aXBoX2NvZGVjcHJpdihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmNvZGVjKQorc3RhdGljIGludCBwdXRfeGlwaF9jb2RlY3ByaXYoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpCiB7CiAgICAgY29uc3QgdWludDhfdCAqaGVhZGVyX3N0YXJ0WzNdOwogICAgIGludCBoZWFkZXJfbGVuWzNdOwogICAgIGludCBmaXJzdF9oZWFkZXJfc2l6ZTsKICAgICBpbnQgajsKIAotICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTKQorICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZPUkJJUykKICAgICAgICAgZmlyc3RfaGVhZGVyX3NpemUgPSAzMDsKICAgICBlbHNlCiAgICAgICAgIGZpcnN0X2hlYWRlcl9zaXplID0gNDI7CiAKLSAgICBpZiAoYXZwcml2X3NwbGl0X3hpcGhfaGVhZGVycyhjb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUsCisgICAgaWYgKGF2cHJpdl9zcGxpdF94aXBoX2hlYWRlcnMocGFyLT5leHRyYWRhdGEsIHBhci0+ZXh0cmFkYXRhX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9oZWFkZXJfc2l6ZSwgaGVhZGVyX3N0YXJ0LCBoZWFkZXJfbGVuKSA8IDApIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkV4dHJhZGF0YSBjb3JydXB0LlxuIik7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTU0OCwyMiArNjYxLDIyIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHV0X3d2X2NvZGVjcHJpdihBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICpjb2RlYykKK3N0YXRpYyBpbnQgcHV0X3d2X2NvZGVjcHJpdihBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpCiB7Ci0gICAgaWYgKGNvZGVjLT5leHRyYWRhdGEgJiYgY29kZWMtPmV4dHJhZGF0YV9zaXplID09IDIpCi0gICAgICAgIGF2aW9fd3JpdGUocGIsIGNvZGVjLT5leHRyYWRhdGEsIDIpOworICAgIGlmIChwYXItPmV4dHJhZGF0YSAmJiBwYXItPmV4dHJhZGF0YV9zaXplID09IDIpCisgICAgICAgIGF2aW9fd3JpdGUocGIsIHBhci0+ZXh0cmFkYXRhLCAyKTsKICAgICBlbHNlCiAgICAgICAgIGF2aW9fd2wxNihwYiwgMHg0MDMpOyAvLyBmYWxsYmFjayB0byB0aGUgdmVyc2lvbiBtZW50aW9uZWQgaW4gbWF0cm9za2Egc3BlY3MKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBwdXRfZmxhY19jb2RlY3ByaXYoQVZGb3JtYXRDb250ZXh0ICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJT0NvbnRleHQgKnBiLCBBVkNvZGVjQ29udGV4dCAqY29kZWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpCiB7Ci0gICAgaW50IHdyaXRlX2NvbW1lbnQgPSAoY29kZWMtPmNoYW5uZWxfbGF5b3V0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgIShjb2RlYy0+Y2hhbm5lbF9sYXlvdXQgJiB+MHgzZmZmZlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAhZmZfZmxhY19pc19uYXRpdmVfbGF5b3V0KGNvZGVjLT5jaGFubmVsX2xheW91dCkpOwotICAgIGludCByZXQgPSBmZl9mbGFjX3dyaXRlX2hlYWRlcihwYiwgY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplLAorICAgIGludCB3cml0ZV9jb21tZW50ID0gKHBhci0+Y2hhbm5lbF9sYXlvdXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhKHBhci0+Y2hhbm5lbF9sYXlvdXQgJiB+MHgzZmZmZlVMTCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAhZmZfZmxhY19pc19uYXRpdmVfbGF5b3V0KHBhci0+Y2hhbm5lbF9sYXlvdXQpKTsKKyAgICBpbnQgcmV0ID0gZmZfZmxhY193cml0ZV9oZWFkZXIocGIsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhd3JpdGVfY29tbWVudCk7CiAKICAgICBpZiAocmV0IDwgMCkKQEAgLTU3Niw3ICs2ODksNyBAQAogICAgICAgICB1aW50OF90IGJ1ZlszMl0sICpkYXRhLCAqcDsKICAgICAgICAgaW50NjRfdCBsZW47CiAKLSAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjB4JSJQUkl4NjQsIGNvZGVjLT5jaGFubmVsX2xheW91dCk7CisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUiUFJJeDY0LCBwYXItPmNoYW5uZWxfbGF5b3V0KTsKICAgICAgICAgYXZfZGljdF9zZXQoJmRpY3QsICJXQVZFRk9STUFURVhURU5TSUJMRV9DSEFOTkVMX01BU0siLCBidWYsIDApOwogCiAgICAgICAgIGxlbiA9IGZmX3ZvcmJpc2NvbW1lbnRfbGVuZ3RoKGRpY3QsIHZlbmRvcik7CkBAIC02MDQsNjYgKzcxNyw4OCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF9hYWNfc2FtcGxlX3JhdGVzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZDb2RlY0NvbnRleHQgKmNvZGVjLAorc3RhdGljIGludCBnZXRfYWFjX3NhbXBsZV9yYXRlcyhBVkZvcm1hdENvbnRleHQgKnMsIHVpbnQ4X3QgKmV4dHJhZGF0YSwgaW50IGV4dHJhZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNhbXBsZV9yYXRlLCBpbnQgKm91dHB1dF9zYW1wbGVfcmF0ZSkKIHsKICAgICBNUEVHNEF1ZGlvQ29uZmlnIG1wNGFjOworICAgIGludCByZXQ7CiAKLSAgICBpZiAoYXZwcml2X21wZWc0YXVkaW9fZ2V0X2NvbmZpZygmbXA0YWMsIGNvZGVjLT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplICogOCwgMSkgPCAwKSB7CisgICAgcmV0ID0gYXZwcml2X21wZWc0YXVkaW9fZ2V0X2NvbmZpZygmbXA0YWMsIGV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZGF0YV9zaXplICogOCwgMSk7CisgICAgLyogRG9uJ3QgYWJvcnQgaWYgdGhlIGZhaWx1cmUgaXMgYmVjYXVzZSBvZiBtaXNzaW5nIGV4dHJhZGF0YS4gQXNzdW1lIGluIHRoYXQKKyAgICAgKiBjYXNlIGEgYml0c3RyZWFtIGZpbHRlciB3aWxsIHByb3ZpZGUgdGhlIG11eGVyIHdpdGggdGhlIGV4dHJhZGF0YSBpbiB0aGUKKyAgICAgKiBmaXJzdCBwYWNrZXQuCisgICAgICogQWJvcnQgaG93ZXZlciBpZiBzLT5wYiBpcyBub3Qgc2Vla2FibGUsIGFzIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIHNlZWsgYmFjaworICAgICAqIHRvIHdyaXRlIHRoZSBzYW1wbGUgcmF0ZSBlbGVtZW50cyBvbmNlIHRoZSBleHRyYWRhdGEgc2hvd3MgdXAsIGFueXdheS4gKi8KKyAgICBpZiAocmV0IDwgMCAmJiAoZXh0cmFkYXRhX3NpemUgfHwgIShzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBBQUMgZXh0cmFkYXRhLCB1bmFibGUgdG8gZGV0ZXJtaW5lIHNhbXBsZXJhdGUuXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICAqc2FtcGxlX3JhdGUgICAgICAgID0gbXA0YWMuc2FtcGxlX3JhdGU7Ci0gICAgKm91dHB1dF9zYW1wbGVfcmF0ZSA9IG1wNGFjLmV4dF9zYW1wbGVfcmF0ZTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAvKiBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGlsZSB3cml0aW5nIHRoZQorICAgICAgICAgKiBoZWFkZXIgYW5kIG5vIGV4dHJhZGF0YSBpcyBhdmFpbGFibGUuIFRoZSBzcGFjZSBmb3IgdGhpcyBlbGVtZW50IGhhcworICAgICAgICAgKiB0byBiZSByZXNlcnZlZCBmb3Igd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZ2FpbiBhZnRlciB0aGUKKyAgICAgICAgICogZXh0cmFkYXRhIHNob3dzIHVwIGluIHRoZSBmaXJzdCBwYWNrZXQsIGFzIHRoZXJlJ3Mgbm8gd2F5IHRvIGtub3cgaWYKKyAgICAgICAgICogb3V0cHV0X3NhbXBsZV9yYXRlIHdpbGwgYmUgZGlmZmVyZW50IHRoYW4gc2FtcGxlX3JhdGUgb3Igbm90LiAqLworICAgICAgICAqb3V0cHV0X3NhbXBsZV9yYXRlID0gKnNhbXBsZV9yYXRlOworICAgIH0gZWxzZSB7CisgICAgICAgICpzYW1wbGVfcmF0ZSAgICAgICAgPSBtcDRhYy5zYW1wbGVfcmF0ZTsKKyAgICAgICAgKm91dHB1dF9zYW1wbGVfcmF0ZSA9IG1wNGFjLmV4dF9zYW1wbGVfcmF0ZTsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbWt2X3dyaXRlX25hdGl2ZV9jb2RlY3ByaXZhdGUoQVZGb3JtYXRDb250ZXh0ICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMsCitzdGF0aWMgaW50IG1rdl93cml0ZV9uYXRpdmVfY29kZWNwcml2YXRlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVklPQ29udGV4dCAqZHluX2NwKQogewotICAgIHN3aXRjaCAoY29kZWMtPmNvZGVjX2lkKSB7CisgICAgc3dpdGNoIChwYXItPmNvZGVjX2lkKSB7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9WT1JCSVM6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9USEVPUkE6Ci0gICAgICAgIHJldHVybiBwdXRfeGlwaF9jb2RlY3ByaXYocywgZHluX2NwLCBjb2RlYyk7CisgICAgICAgIHJldHVybiBwdXRfeGlwaF9jb2RlY3ByaXYocywgZHluX2NwLCBwYXIpOwogICAgIGNhc2UgQVZfQ09ERUNfSURfRkxBQzoKLSAgICAgICAgcmV0dXJuIHB1dF9mbGFjX2NvZGVjcHJpdihzLCBkeW5fY3AsIGNvZGVjKTsKKyAgICAgICAgcmV0dXJuIHB1dF9mbGFjX2NvZGVjcHJpdihzLCBkeW5fY3AsIHBhcik7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9XQVZQQUNLOgotICAgICAgICByZXR1cm4gcHV0X3d2X2NvZGVjcHJpdihkeW5fY3AsIGNvZGVjKTsKKyAgICAgICAgcmV0dXJuIHB1dF93dl9jb2RlY3ByaXYoZHluX2NwLCBwYXIpOwogICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKLSAgICAgICAgcmV0dXJuIGZmX2lzb21fd3JpdGVfYXZjYyhkeW5fY3AsIGNvZGVjLT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgcmV0dXJuIGZmX2lzb21fd3JpdGVfYXZjYyhkeW5fY3AsIHBhci0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgIGNhc2UgQVZfQ09ERUNfSURfSEVWQzoKLSAgICAgICAgZmZfaXNvbV93cml0ZV9odmNjKGR5bl9jcCwgY29kZWMtPmV4dHJhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSwgMCk7CisgICAgICAgIGZmX2lzb21fd3JpdGVfaHZjYyhkeW5fY3AsIHBhci0+ZXh0cmFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSwgMCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIGNhc2UgQVZfQ09ERUNfSURfQUxBQzoKLSAgICAgICAgaWYgKGNvZGVjLT5leHRyYWRhdGFfc2l6ZSA8IDM2KSB7CisgICAgICAgIGlmIChwYXItPmV4dHJhZGF0YV9zaXplIDwgMzYpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXh0cmFkYXRhIGZvdW5kLCBBTEFDIGV4cGVjdHMgYSAzNi1ieXRlICIKICAgICAgICAgICAgICAgICAgICAiUXVpY2tUaW1lIGF0b20uIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBhdmlvX3dyaXRlKGR5bl9jcCwgY29kZWMtPmV4dHJhZGF0YSArIDEyLAotICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgLSAxMik7CisgICAgICAgICAgICBhdmlvX3dyaXRlKGR5bl9jcCwgcGFyLT5leHRyYWRhdGEgKyAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSAtIDEyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BQUM6CisgICAgICAgIGlmIChwYXItPmV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgYXZpb193cml0ZShkeW5fY3AsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHV0X2VibWxfdm9pZChwYiwgTUFYX1BDRV9TSVpFICsgMiArIDQpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BST1JFUyAmJgotICAgICAgICAgICAgZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGNvZGVjLT5jb2RlY190YWcpID09IEFWX0NPREVDX0lEX1BST1JFUykgewotICAgICAgICAgICAgYXZpb193bDMyKGR5bl9jcCwgY29kZWMtPmNvZGVjX3RhZyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZWMtPmV4dHJhZGF0YV9zaXplICYmIGNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9UVEEpCi0gICAgICAgICAgICBhdmlvX3dyaXRlKGR5bl9jcCwgY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUFJPUkVTICYmCisgICAgICAgICAgICBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfbW92dmlkZW9fdGFncywgcGFyLT5jb2RlY190YWcpID09IEFWX0NPREVDX0lEX1BST1JFUykgeworICAgICAgICAgICAgYXZpb193bDMyKGR5bl9jcCwgcGFyLT5jb2RlY190YWcpOworICAgICAgICB9IGVsc2UgaWYgKHBhci0+ZXh0cmFkYXRhX3NpemUgJiYgcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9UVEEpCisgICAgICAgICAgICBhdmlvX3dyaXRlKGR5bl9jcCwgcGFyLT5leHRyYWRhdGEsIHBhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1rdl93cml0ZV9jb2RlY3ByaXZhdGUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjLCBpbnQgbmF0aXZlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdF9pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYXRpdmVfaWQsIGludCBxdF9pZCkKIHsKICAgICBBVklPQ29udGV4dCAqZHluX2NwOwogICAgIHVpbnQ4X3QgKmNvZGVjcHJpdjsKQEAgLTY3NCw1MiArODA5LDUwIEBACiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBpZiAobmF0aXZlX2lkKSB7Ci0gICAgICAgIHJldCA9IG1rdl93cml0ZV9uYXRpdmVfY29kZWNwcml2YXRlKHMsIGNvZGVjLCBkeW5fY3ApOwotICAgIH0gZWxzZSBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIHJldCA9IG1rdl93cml0ZV9uYXRpdmVfY29kZWNwcml2YXRlKHMsIHBiLCBwYXIsIGR5bl9jcCk7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgIGlmIChxdF9pZCkgewotICAgICAgICAgICAgaWYgKCFjb2RlYy0+Y29kZWNfdGFnKQotICAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY190YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkKTsKLSAgICAgICAgICAgIGlmIChjb2RlYy0+ZXh0cmFkYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICBpZiAoICAgZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGNvZGVjLT5jb2RlY190YWcpID09IGNvZGVjLT5jb2RlY19pZAotICAgICAgICAgICAgICAgICAgICAmJiBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfbW92dmlkZW9fdGFncywgQVZfUkwzMihjb2RlYy0+ZXh0cmFkYXRhICsgNCkpICE9IGNvZGVjLT5jb2RlY19pZAotICAgICAgICAgICAgICAgICkgewotICAgICAgICAgICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgICAgICAgICAgYXZpb193YjMyKGR5bl9jcCwgMHg1YSArIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGF2aW9fd2wzMihkeW5fY3AsIGNvZGVjLT5jb2RlY190YWcpOwotICAgICAgICAgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCAweDVhIC0gODsgaSsrKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZpb193OChkeW5fY3AsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdmlvX3dyaXRlKGR5bl9jcCwgY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICghcGFyLT5jb2RlY190YWcpCisgICAgICAgICAgICAgICAgcGFyLT5jb2RlY190YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5jb2RlY19pZCk7CisgICAgICAgICAgICBpZiAoICAgZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIHBhci0+Y29kZWNfdGFnKSA9PSBwYXItPmNvZGVjX2lkCisgICAgICAgICAgICAgICAgJiYgKCFwYXItPmV4dHJhZGF0YV9zaXplIHx8IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19tb3Z2aWRlb190YWdzLCBBVl9STDMyKHBhci0+ZXh0cmFkYXRhICsgNCkpICE9IHBhci0+Y29kZWNfaWQpCisgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBhdmlvX3diMzIoZHluX2NwLCAweDVhICsgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgYXZpb193bDMyKGR5bl9jcCwgcGFyLT5jb2RlY190YWcpOworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IDB4NWEgLSA4OyBpKyspCisgICAgICAgICAgICAgICAgICAgIGF2aW9fdzgoZHluX2NwLCAwKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fd3JpdGUoZHluX2NwLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoIWZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfYm1wX3RhZ3MsIGNvZGVjLT5jb2RlY19pZCkpCisgICAgICAgICAgICBpZiAoIWZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfYm1wX3RhZ3MsIHBhci0+Y29kZWNfaWQpKQogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImNvZGVjICVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBmb3JtYXRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoY29kZWMtPmNvZGVjX2lkKSk7CisgICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUocGFyLT5jb2RlY19pZCkpOwogCi0gICAgICAgICAgICBpZiAoIWNvZGVjLT5jb2RlY190YWcpCi0gICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3RhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfYm1wX3RhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkKTsKLSAgICAgICAgICAgIGlmICghY29kZWMtPmNvZGVjX3RhZyAmJiBjb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKKyAgICAgICAgICAgIGlmICghcGFyLT5jb2RlY190YWcpCisgICAgICAgICAgICAgICAgcGFyLT5jb2RlY190YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX2JtcF90YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGlmICghcGFyLT5jb2RlY190YWcgJiYgcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9SQVdWSURFTykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBibXAgY29kZWMgdGFnIGZvdW5kIGZvciBjb2RlYyAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShjb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShwYXItPmNvZGVjX2lkKSk7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBmZl9wdXRfYm1wX2hlYWRlcihkeW5fY3AsIGNvZGVjLCBmZl9jb2RlY19ibXBfdGFncywgMCwgMCk7CisgICAgICAgICAgICBmZl9wdXRfYm1wX2hlYWRlcihkeW5fY3AsIHBhciwgMCwgMCk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICB1bnNpZ25lZCBpbnQgdGFnOwotICAgICAgICB0YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX3dhdl90YWdzLCBjb2RlYy0+Y29kZWNfaWQpOworICAgICAgICB0YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX3dhdl90YWdzLCBwYXItPmNvZGVjX2lkKTsKICAgICAgICAgaWYgKCF0YWcpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyB3YXYgY29kZWMgdGFnIGZvdW5kIGZvciBjb2RlYyAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKGNvZGVjLT5jb2RlY19pZCkpOworICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUocGFyLT5jb2RlY19pZCkpOwogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9Ci0gICAgICAgIGlmICghY29kZWMtPmNvZGVjX3RhZykKLSAgICAgICAgICAgIGNvZGVjLT5jb2RlY190YWcgPSB0YWc7CisgICAgICAgIGlmICghcGFyLT5jb2RlY190YWcpCisgICAgICAgICAgICBwYXItPmNvZGVjX3RhZyA9IHRhZzsKIAotICAgICAgICBmZl9wdXRfd2F2X2hlYWRlcihkeW5fY3AsIGNvZGVjLCBGRl9QVVRfV0FWX0hFQURFUl9GT1JDRV9XQVZFRk9STUFURVgpOworICAgICAgICBmZl9wdXRfd2F2X2hlYWRlcihzLCBkeW5fY3AsIHBhciwgRkZfUFVUX1dBVl9IRUFERVJfRk9SQ0VfV0FWRUZPUk1BVEVYKTsKICAgICB9CiAKICAgICBjb2RlY3ByaXZfc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fY3AsICZjb2RlY3ByaXYpOwpAQCAtNzMwLDYgKzg2MywyMTEgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG1rdl93cml0ZV92aWRlb19jb2xvcihBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIEFWU3RyZWFtICpzdCkgeworICAgIEFWSU9Db250ZXh0ICpkeW5fY3A7CisgICAgdWludDhfdCAqY29sb3JpbmZvX3B0cjsKKyAgICBpbnQgc2lkZV9kYXRhX3NpemUgPSAwOworICAgIGludCByZXQsIGNvbG9yaW5mb19zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKnNpZGVfZGF0YTsKKworICAgIHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fY3ApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKHBhci0+Y29sb3JfdHJjICE9IEFWQ09MX1RSQ19VTlNQRUNJRklFRCAmJgorICAgICAgICBwYXItPmNvbG9yX3RyYyA8IEFWQ09MX1RSQ19OQikgeworICAgICAgICBwdXRfZWJtbF91aW50KGR5bl9jcCwgTUFUUk9TS0FfSURfVklERU9DT0xPUlRSQU5TRkVSQ0hBUkFDVEVSSVNUSUNTLAorICAgICAgICAgICAgICAgICAgICAgIHBhci0+Y29sb3JfdHJjKTsKKyAgICB9CisgICAgaWYgKHBhci0+Y29sb3Jfc3BhY2UgIT0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEICYmCisgICAgICAgIHBhci0+Y29sb3Jfc3BhY2UgPCBBVkNPTF9TUENfTkIpIHsKKyAgICAgICAgcHV0X2VibWxfdWludChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JNQVRSSVhDT0VGRiwgcGFyLT5jb2xvcl9zcGFjZSk7CisgICAgfQorICAgIGlmIChwYXItPmNvbG9yX3ByaW1hcmllcyAhPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQgJiYKKyAgICAgICAgcGFyLT5jb2xvcl9wcmltYXJpZXMgPCBBVkNPTF9QUklfTkIpIHsKKyAgICAgICAgcHV0X2VibWxfdWludChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JQUklNQVJJRVMsIHBhci0+Y29sb3JfcHJpbWFyaWVzKTsKKyAgICB9CisgICAgaWYgKHBhci0+Y29sb3JfcmFuZ2UgIT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQgJiYKKyAgICAgICAgcGFyLT5jb2xvcl9yYW5nZSA8IEFWQ09MX1JBTkdFX05CKSB7CisgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT0NPTE9SUkFOR0UsIHBhci0+Y29sb3JfcmFuZ2UpOworICAgIH0KKyAgICBpZiAocGFyLT5jaHJvbWFfbG9jYXRpb24gIT0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEICYmCisgICAgICAgIHBhci0+Y2hyb21hX2xvY2F0aW9uIDw9IEFWQ0hST01BX0xPQ19UT1ApIHsKKyAgICAgICAgaW50IHhwb3MsIHlwb3M7CisKKyAgICAgICAgYXZjb2RlY19lbnVtX3RvX2Nocm9tYV9wb3MoJnhwb3MsICZ5cG9zLCBwYXItPmNocm9tYV9sb2NhdGlvbik7CisgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT0NPTE9SQ0hST01BU0lUSU5HSE9SWiwgKHhwb3MgPj4gNykgKyAxKTsKKyAgICAgICAgcHV0X2VibWxfdWludChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JDSFJPTUFTSVRJTkdWRVJULCAoeXBvcyA+PiA3KSArIDEpOworICAgIH0KKworICAgIHNpZGVfZGF0YSA9IGF2X3N0cmVhbV9nZXRfc2lkZV9kYXRhKHN0LCBBVl9QS1RfREFUQV9DT05URU5UX0xJR0hUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWRlX2RhdGFfc2l6ZSk7CisgICAgaWYgKHNpZGVfZGF0YV9zaXplKSB7CisgICAgICAgIGNvbnN0IEFWQ29udGVudExpZ2h0TWV0YWRhdGEgKm1ldGFkYXRhID0KKyAgICAgICAgICAgIChjb25zdCBBVkNvbnRlbnRMaWdodE1ldGFkYXRhKilzaWRlX2RhdGE7CisgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFYQ0xMLCAgbWV0YWRhdGEtPk1heENMTCk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFYRkFMTCwgbWV0YWRhdGEtPk1heEZBTEwpOworICAgIH0KKworICAgIHNpZGVfZGF0YSA9IGF2X3N0cmVhbV9nZXRfc2lkZV9kYXRhKHN0LCBBVl9QS1RfREFUQV9NQVNURVJJTkdfRElTUExBWV9NRVRBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lkZV9kYXRhX3NpemUpOworICAgIGlmIChzaWRlX2RhdGFfc2l6ZSA9PSBzaXplb2YoQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEpKSB7CisgICAgICAgIGVibWxfbWFzdGVyIG1ldGFfZWxlbWVudCA9IHN0YXJ0X2VibWxfbWFzdGVyKAorICAgICAgICAgICAgZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT0NPTE9STUFTVEVSSU5HTUVUQSwgMCk7CisgICAgICAgIGNvbnN0IEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhICptZXRhZGF0YSA9CisgICAgICAgICAgICAoY29uc3QgQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEqKXNpZGVfZGF0YTsKKyAgICAgICAgaWYgKG1ldGFkYXRhLT5oYXNfcHJpbWFyaWVzKSB7CisgICAgICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfUlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzBdWzBdKSk7CisgICAgICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzBdWzFdKSk7CisgICAgICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfR1gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzFdWzBdKSk7CisgICAgICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfR1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzFdWzFdKSk7CisgICAgICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfQlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzJdWzBdKSk7CisgICAgICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfQlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPmRpc3BsYXlfcHJpbWFyaWVzWzJdWzFdKSk7CisgICAgICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPQ09MT1JfV0hJVEVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfcTJkKG1ldGFkYXRhLT53aGl0ZV9wb2ludFswXSkpOworICAgICAgICAgICAgcHV0X2VibWxfZmxvYXQoZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT0NPTE9SX1dISVRFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3EyZChtZXRhZGF0YS0+d2hpdGVfcG9pbnRbMV0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWV0YWRhdGEtPmhhc19sdW1pbmFuY2UpIHsKKyAgICAgICAgICAgIHB1dF9lYm1sX2Zsb2F0KGR5bl9jcCwgTUFUUk9TS0FfSURfVklERU9DT0xPUl9MVU1JTkFOQ0VNQVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPm1heF9sdW1pbmFuY2UpKTsKKyAgICAgICAgICAgIHB1dF9lYm1sX2Zsb2F0KGR5bl9jcCwgTUFUUk9TS0FfSURfVklERU9DT0xPUl9MVU1JTkFOQ0VNSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQobWV0YWRhdGEtPm1pbl9sdW1pbmFuY2UpKTsKKyAgICAgICAgfQorICAgICAgICBlbmRfZWJtbF9tYXN0ZXIoZHluX2NwLCBtZXRhX2VsZW1lbnQpOworICAgIH0KKworICAgIGNvbG9yaW5mb19zaXplID0gYXZpb19jbG9zZV9keW5fYnVmKGR5bl9jcCwgJmNvbG9yaW5mb19wdHIpOworICAgIGlmIChjb2xvcmluZm9fc2l6ZSkgeworICAgICAgICBlYm1sX21hc3RlciBjb2xvcmluZm8gPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfVklERU9DT0xPUiwgY29sb3JpbmZvX3NpemUpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCBjb2xvcmluZm9fcHRyLCBjb2xvcmluZm9fc2l6ZSk7CisgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgY29sb3JpbmZvKTsKKyAgICB9CisgICAgYXZfZnJlZShjb2xvcmluZm9fcHRyKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBta3Zfd3JpdGVfdmlkZW9fcHJvamVjdGlvbihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0KQoreworICAgIEFWSU9Db250ZXh0IGI7CisgICAgQVZJT0NvbnRleHQgKmR5bl9jcDsKKyAgICBpbnQgc2lkZV9kYXRhX3NpemUgPSAwOworICAgIGludCByZXQsIHByb2plY3Rpb25fc2l6ZTsKKyAgICB1aW50OF90ICpwcm9qZWN0aW9uX3B0cjsKKyAgICB1aW50OF90IHByaXZhdGVbMjBdOworCisgICAgY29uc3QgQVZTcGhlcmljYWxNYXBwaW5nICpzcGhlcmljYWwgPQorICAgICAgICAoY29uc3QgQVZTcGhlcmljYWxNYXBwaW5nICopYXZfc3RyZWFtX2dldF9zaWRlX2RhdGEoc3QsIEFWX1BLVF9EQVRBX1NQSEVSSUNBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWRlX2RhdGFfc2l6ZSk7CisKKyAgICBpZiAoIXNpZGVfZGF0YV9zaXplKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldCA9IGF2aW9fb3Blbl9keW5fYnVmKCZkeW5fY3ApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc3dpdGNoIChzcGhlcmljYWwtPnByb2plY3Rpb24pIHsKKyAgICBjYXNlIEFWX1NQSEVSSUNBTF9FUVVJUkVDVEFOR1VMQVI6CisgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT1BST0pFQ1RJT05UWVBFLAorICAgICAgICAgICAgICAgICAgICAgIE1BVFJPU0tBX1ZJREVPX1BST0pFQ1RJT05fVFlQRV9FUVVJUkVDVEFOR1VMQVIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NQSEVSSUNBTF9FUVVJUkVDVEFOR1VMQVJfVElMRToKKyAgICAgICAgZmZpb19pbml0X2NvbnRleHQoJmIsIHByaXZhdGUsIDIwLCAxLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgcHV0X2VibWxfdWludChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPUFJPSkVDVElPTlRZUEUsCisgICAgICAgICAgICAgICAgICAgICAgTUFUUk9TS0FfVklERU9fUFJPSkVDVElPTl9UWVBFX0VRVUlSRUNUQU5HVUxBUik7CisgICAgICAgIGF2aW9fd2IzMigmYiwgMCk7IC8vIHZlcnNpb24gKyBmbGFncworICAgICAgICBhdmlvX3diMzIoJmIsIHNwaGVyaWNhbC0+Ym91bmRfdG9wKTsKKyAgICAgICAgYXZpb193YjMyKCZiLCBzcGhlcmljYWwtPmJvdW5kX2JvdHRvbSk7CisgICAgICAgIGF2aW9fd2IzMigmYiwgc3BoZXJpY2FsLT5ib3VuZF9sZWZ0KTsKKyAgICAgICAgYXZpb193YjMyKCZiLCBzcGhlcmljYWwtPmJvdW5kX3JpZ2h0KTsKKyAgICAgICAgcHV0X2VibWxfYmluYXJ5KGR5bl9jcCwgTUFUUk9TS0FfSURfVklERU9QUk9KRUNUSU9OUFJJVkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUsIGF2aW9fdGVsbCgmYikpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NQSEVSSUNBTF9DVUJFTUFQOgorICAgICAgICBmZmlvX2luaXRfY29udGV4dCgmYiwgcHJpdmF0ZSwgMTIsIDEsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOworICAgICAgICBwdXRfZWJtbF91aW50KGR5bl9jcCwgTUFUUk9TS0FfSURfVklERU9QUk9KRUNUSU9OVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICBNQVRST1NLQV9WSURFT19QUk9KRUNUSU9OX1RZUEVfQ1VCRU1BUCk7CisgICAgICAgIGF2aW9fd2IzMigmYiwgMCk7IC8vIHZlcnNpb24gKyBmbGFncworICAgICAgICBhdmlvX3diMzIoJmIsIDApOyAvLyBsYXlvdXQKKyAgICAgICAgYXZpb193YjMyKCZiLCBzcGhlcmljYWwtPnBhZGRpbmcpOworICAgICAgICBwdXRfZWJtbF9iaW5hcnkoZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT1BST0pFQ1RJT05QUklWQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSwgYXZpb190ZWxsKCZiKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVua25vd24gcHJvamVjdGlvbiB0eXBlXG4iKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKHNwaGVyaWNhbC0+eWF3KQorICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPUFJPSkVDVElPTlBPU0VZQVcsCisgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHNwaGVyaWNhbC0+eWF3ICAgLyAoMSA8PCAxNikpOworICAgIGlmIChzcGhlcmljYWwtPnBpdGNoKQorICAgICAgICBwdXRfZWJtbF9mbG9hdChkeW5fY3AsIE1BVFJPU0tBX0lEX1ZJREVPUFJPSkVDVElPTlBPU0VQSVRDSCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgc3BoZXJpY2FsLT5waXRjaCAvICgxIDw8IDE2KSk7CisgICAgaWYgKHNwaGVyaWNhbC0+cm9sbCkKKyAgICAgICAgcHV0X2VibWxfZmxvYXQoZHluX2NwLCBNQVRST1NLQV9JRF9WSURFT1BST0pFQ1RJT05QT1NFUk9MTCwKKyAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgc3BoZXJpY2FsLT5yb2xsICAvICgxIDw8IDE2KSk7CisKK2VuZDoKKyAgICBwcm9qZWN0aW9uX3NpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYoZHluX2NwLCAmcHJvamVjdGlvbl9wdHIpOworICAgIGlmIChwcm9qZWN0aW9uX3NpemUpIHsKKyAgICAgICAgZWJtbF9tYXN0ZXIgcHJvamVjdGlvbiA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUk9TS0FfSURfVklERU9QUk9KRUNUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbl9zaXplKTsKKyAgICAgICAgYXZpb193cml0ZShwYiwgcHJvamVjdGlvbl9wdHIsIHByb2plY3Rpb25fc2l6ZSk7CisgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgcHJvamVjdGlvbik7CisgICAgfQorICAgIGF2X2ZyZWVwKCZwcm9qZWN0aW9uX3B0cik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWt2X3dyaXRlX2ZpZWxkX29yZGVyKEFWSU9Db250ZXh0ICpwYiwgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkZpZWxkT3JkZXIgZmllbGRfb3JkZXIpCit7CisgICAgc3dpdGNoIChmaWVsZF9vcmRlcikgeworICAgIGNhc2UgQVZfRklFTERfVU5LTk9XTjoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9GSUVMRF9QUk9HUkVTU0lWRToKKyAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVklERU9GTEFHSU5URVJMQUNFRCwKKyAgICAgICAgICAgICAgICAgICAgICBNQVRST1NLQV9WSURFT19JTlRFUkxBQ0VfRkxBR19QUk9HUkVTU0lWRSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfRklFTERfVFQ6CisgICAgY2FzZSBBVl9GSUVMRF9CQjoKKyAgICBjYXNlIEFWX0ZJRUxEX1RCOgorICAgIGNhc2UgQVZfRklFTERfQlQ6CisgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPRkxBR0lOVEVSTEFDRUQsCisgICAgICAgICAgICAgICAgICAgICAgTUFUUk9TS0FfVklERU9fSU5URVJMQUNFX0ZMQUdfSU5URVJMQUNFRCk7CisgICAgICAgIGlmIChtb2RlICE9IE1PREVfV0VCTSkgeworICAgICAgICAgICAgc3dpdGNoIChmaWVsZF9vcmRlcikgeworICAgICAgICAgICAgY2FzZSBBVl9GSUVMRF9UVDoKKyAgICAgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0ZJRUxET1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRST1NLQV9WSURFT19GSUVMRE9SREVSX1RUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQVZfRklFTERfQkI6CisgICAgICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVklERU9GSUVMRE9SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFUUk9TS0FfVklERU9fRklFTERPUkRFUl9CQik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX0ZJRUxEX1RCOgorICAgICAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPRklFTERPUkRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BVFJPU0tBX1ZJREVPX0ZJRUxET1JERVJfVEIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBVl9GSUVMRF9CVDoKKyAgICAgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0ZJRUxET1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVRST1NLQV9WSURFT19GSUVMRE9SREVSX0JUKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KIAogc3RhdGljIGludCBta3Zfd3JpdGVfc3RlcmVvX21vZGUoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIGludCBtb2RlLCBpbnQgKmhfd2lkdGgsIGludCAqaF9oZWlnaHQpCkBAIC04MzMsMzAgKzExNzEsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpLCBBVklPQ29udGV4dCAqcGIsIGludCBkZWZhdWx0X3N0cmVhbV9leGlzdHMpCiB7CiAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzdC0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKICAgICBlYm1sX21hc3RlciBzdWJpbmZvLCB0cmFjazsKICAgICBpbnQgbmF0aXZlX2lkID0gMDsKICAgICBpbnQgcXRfaWQgPSAwOwotICAgIGludCBiaXRfZGVwdGggPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGNvZGVjLT5jb2RlY19pZCk7Ci0gICAgaW50IHNhbXBsZV9yYXRlID0gY29kZWMtPnNhbXBsZV9yYXRlOworICAgIGludCBiaXRfZGVwdGggPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHBhci0+Y29kZWNfaWQpOworICAgIGludCBzYW1wbGVfcmF0ZSA9IHBhci0+c2FtcGxlX3JhdGU7CiAgICAgaW50IG91dHB1dF9zYW1wbGVfcmF0ZSA9IDA7CiAgICAgaW50IGRpc3BsYXlfd2lkdGhfZGl2ID0gMTsKICAgICBpbnQgZGlzcGxheV9oZWlnaHRfZGl2ID0gMTsKICAgICBpbnQgaiwgcmV0OwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWc7CiAKLSAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQpIHsKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UKSB7CiAgICAgICAgIG1rdi0+aGF2ZV9hdHRhY2htZW50cyA9IDE7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGlmICghYml0X2RlcHRoICYmIGNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2KQotICAgICAgICBiaXRfZGVwdGggPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShjb2RlYy0+c2FtcGxlX2ZtdCkgPDwgMzsKLSAgICBpZiAoIWJpdF9kZXB0aCkKLSAgICAgICAgYml0X2RlcHRoID0gY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBpZiAoIWJpdF9kZXB0aCAmJiBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0FEUENNX0c3MjYpIHsKKyAgICAgICAgICAgIGlmIChwYXItPmJpdHNfcGVyX3Jhd19zYW1wbGUpCisgICAgICAgICAgICAgICAgYml0X2RlcHRoID0gcGFyLT5iaXRzX3Blcl9yYXdfc2FtcGxlOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJpdF9kZXB0aCA9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHBhci0+Zm9ybWF0KSA8PCAzOworICAgICAgICB9CisgICAgICAgIGlmICghYml0X2RlcHRoKQorICAgICAgICAgICAgYml0X2RlcHRoID0gcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgfQogCi0gICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKLSAgICAgICAgcmV0ID0gZ2V0X2FhY19zYW1wbGVfcmF0ZXMocywgY29kZWMsICZzYW1wbGVfcmF0ZSwgJm91dHB1dF9zYW1wbGVfcmF0ZSk7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgIHJldCA9IGdldF9hYWNfc2FtcGxlX3JhdGVzKHMsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplLCAmc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfc2FtcGxlX3JhdGUpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtODcxLDcgKzEyMTYsNyBAQAogICAgIGlmICgodGFnID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAidGl0bGUiLCBOVUxMLCAwKSkpCiAgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfVFJBQ0tOQU1FLCB0YWctPnZhbHVlKTsKICAgICB0YWcgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIE5VTEwsIDApOwotICAgIGlmIChta3YtPm1vZGUgIT0gTU9ERV9XRUJNIHx8IGNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XRUJWVFQpIHsKKyAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSB8fCBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dFQlZUVCkgewogICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX1RSQUNLTEFOR1VBR0UsIHRhZyAmJiB0YWctPnZhbHVlID8gdGFnLT52YWx1ZToidW5kIik7CiAgICAgfSBlbHNlIGlmICh0YWcgJiYgdGFnLT52YWx1ZSkgewogICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX1RSQUNLTEFOR1VBR0UsIHRhZy0+dmFsdWUpOwpAQCAtODg1LDcgKzEyMzAsNyBAQAogICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9GT1JDRUQpCiAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1RSQUNLRkxBR0ZPUkNFRCwgMSk7CiAKLSAgICBpZiAobWt2LT5tb2RlID09IE1PREVfV0VCTSAmJiBjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV0VCVlRUKSB7CisgICAgaWYgKG1rdi0+bW9kZSA9PSBNT0RFX1dFQk0gJiYgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XRUJWVFQpIHsKICAgICAgICAgY29uc3QgY2hhciAqY29kZWNfaWQ7CiAgICAgICAgIGlmIChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9DQVBUSU9OUykgewogICAgICAgICAgICAgY29kZWNfaWQgPSAiRF9XRUJWVFQvQ0FQVElPTlMiOwpAQCAtOTA0LDE0ICsxMjQ5LDE1IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gbG9vayBmb3IgYSBjb2RlYyBJRCBzdHJpbmcgc3BlY2lmaWMgdG8gbWt2IHRvIHVzZSwKICAgICAgICAgLy8gaWYgbm9uZSBhcmUgZm91bmQsIHVzZSBBVkkgY29kZXMKLSAgICAgICAgZm9yIChqID0gMDsgZmZfbWt2X2NvZGVjX3RhZ3Nbal0uaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoZmZfbWt2X2NvZGVjX3RhZ3Nbal0uaWQgPT0gY29kZWMtPmNvZGVjX2lkKSB7Ci0gICAgICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9DT0RFQ0lELCBmZl9ta3ZfY29kZWNfdGFnc1tqXS5zdHIpOwotICAgICAgICAgICAgICAgIG5hdGl2ZV9pZCA9IDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1JBV1ZJREVPIHx8IHBhci0+Y29kZWNfdGFnKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBmZl9ta3ZfY29kZWNfdGFnc1tqXS5pZCAhPSBBVl9DT0RFQ19JRF9OT05FOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmZfbWt2X2NvZGVjX3RhZ3Nbal0uaWQgPT0gcGFyLT5jb2RlY19pZCAmJiBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0ZGVjEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9DT0RFQ0lELCBmZl9ta3ZfY29kZWNfdGFnc1tqXS5zdHIpOworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaWQgPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTyAmJiAhY29kZWMtPmNvZGVjX3RhZykgeworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1rdi0+YWxsb3dfcmF3X3ZmdykgewogICAgICAgICAgICAgICAgIG5hdGl2ZV9pZCA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtOTIyLDUwICsxMjY4LDUxIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIGNvZGVjLT5pbml0aWFsX3BhZGRpbmcgJiYgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKLSAgICAgICAgaW50NjRfdCBjb2RlY2RlbGF5ID0gYXZfcmVzY2FsZV9xKGNvZGVjLT5pbml0aWFsX3BhZGRpbmcsCisgICAgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgcGFyLT5pbml0aWFsX3BhZGRpbmcgJiYgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTKSB7CisgICAgICAgIGludDY0X3QgY29kZWNkZWxheSA9IGF2X3Jlc2NhbGVfcShwYXItPmluaXRpYWxfcGFkZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgNDgwMDAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgMTAwMDAwMDAwMCB9KTsKICAgICAgICAgaWYgKGNvZGVjZGVsYXkgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW5pdGlhbCBwYWRkaW5nIGlzIGludmFsaWRcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQotLy8gICAgICAgICBta3YtPnRyYWNrc1tpXS50c19vZmZzZXQgPSBhdl9yZXNjYWxlX3EoY29kZWMtPmluaXRpYWxfcGFkZGluZywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgY29kZWMtPnNhbXBsZV9yYXRlIH0sCisvLyAgICAgICAgIG1rdi0+dHJhY2tzW2ldLnRzX29mZnNldCA9IGF2X3Jlc2NhbGVfcShwYXItPmluaXRpYWxfcGFkZGluZywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXsgMSwgcGFyLT5zYW1wbGVfcmF0ZSB9LAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSk7CiAKICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ09ERUNERUxBWSwgY29kZWNkZWxheSk7CiAgICAgfQotICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfU0VFS1BSRVJPTEwsIE9QVVNfU0VFS19QUkVST0xMKTsKICAgICB9CiAKLSAgICBpZiAobWt2LT5tb2RlID09IE1PREVfV0VCTSAmJiAhKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV0VCVlRUKSkgeworICAgIGlmIChta3YtPm1vZGUgPT0gTU9ERV9XRUJNICYmICEocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA5IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dFQlZUVCkpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJPbmx5IFZQOCBvciBWUDkgdmlkZW8gYW5kIFZvcmJpcyBvciBPcHVzIGF1ZGlvIGFuZCBXZWJWVFQgc3VidGl0bGVzIGFyZSBzdXBwb3J0ZWQgZm9yIFdlYk0uXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgc3dpdGNoIChwYXItPmNvZGVjX3R5cGUpIHsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKKyAgICAgICAgbWt2LT5oYXZlX3ZpZGVvID0gMTsKICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVFJBQ0tUWVBFLCBNQVRST1NLQV9UUkFDS19UWVBFX1ZJREVPKTsKIAogICAgICAgICBpZiggICBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtID4gMCAmJiBzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuID4gMAotICAgICAgICAgICAmJiBhdl9jbXBfcShhdl9pbnZfcShzdC0+YXZnX2ZyYW1lX3JhdGUpLCBjb2RlYy0+dGltZV9iYXNlKSA+IDApCisgICAgICAgICAgICYmIGF2X2NtcF9xKGF2X2ludl9xKHN0LT5hdmdfZnJhbWVfcmF0ZSksIHN0LT50aW1lX2Jhc2UpID4gMCkKICAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1RSQUNLREVGQVVMVERVUkFUSU9OLCAxMDAwMDAwMDAwTEwgKiBzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuIC8gc3QtPmF2Z19mcmFtZV9yYXRlLm51bSk7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1RSQUNLREVGQVVMVERVUkFUSU9OLCAxMDAwMDAwMDAwTEwgKiBjb2RlYy0+dGltZV9iYXNlLm51bSAvIGNvZGVjLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1RSQUNLREVGQVVMVERVUkFUSU9OLCAxMDAwMDAwMDAwTEwgKiBzdC0+dGltZV9iYXNlLm51bSAvIHN0LT50aW1lX2Jhc2UuZGVuKTsKIAogICAgICAgICBpZiAoIW5hdGl2ZV9pZCAmJgotICAgICAgICAgICAgZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19tb3Z2aWRlb190YWdzLCBjb2RlYy0+Y29kZWNfaWQpICYmCi0gICAgICAgICAgICAoKCFmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX2JtcF90YWdzLCAgIGNvZGVjLT5jb2RlY19pZCkgJiYgY29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB8fAotICAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlExIHx8Ci0gICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NWUTMgfHwKLSAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQ0lORVBBSykpCisgICAgICAgICAgICBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIHBhci0+Y29kZWNfaWQpICYmCisgICAgICAgICAgICAoKCFmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX2JtcF90YWdzLCAgIHBhci0+Y29kZWNfaWQpICYmIHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHx8CisgICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlExIHx8CisgICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TVlEzIHx8CisgICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9DSU5FUEFLKSkKICAgICAgICAgICAgIHF0X2lkID0gMTsKIAogICAgICAgICBpZiAocXRfaWQpCkBAIC05NzgsOSArMTMyNSwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgc3ViaW5mbyA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9UUkFDS1ZJREVPLCAwKTsKLSAgICAgICAgLy8gWFhYOiBpbnRlcmxhY2UgZmxhZz8KLSAgICAgICAgcHV0X2VibWxfdWludCAocGIsIE1BVFJPU0tBX0lEX1ZJREVPUElYRUxXSURUSCAsIGNvZGVjLT53aWR0aCk7Ci0gICAgICAgIHB1dF9lYm1sX3VpbnQgKHBiLCBNQVRST1NLQV9JRF9WSURFT1BJWEVMSEVJR0hULCBjb2RlYy0+aGVpZ2h0KTsKKworICAgICAgICBwdXRfZWJtbF91aW50IChwYiwgTUFUUk9TS0FfSURfVklERU9QSVhFTFdJRFRIICwgcGFyLT53aWR0aCk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQgKHBiLCBNQVRST1NLQV9JRF9WSURFT1BJWEVMSEVJR0hULCBwYXItPmhlaWdodCk7CisKKyAgICAgICAgbWt2X3dyaXRlX2ZpZWxkX29yZGVyKHBiLCBta3YtPm1vZGUsIHBhci0+ZmllbGRfb3JkZXIpOwogCiAgICAgICAgIC8vIGNoZWNrIGJvdGggc2lkZSBkYXRhIGFuZCBtZXRhZGF0YSBmb3Igc3RlcmVvIGluZm9ybWF0aW9uLAogICAgICAgICAvLyB3cml0ZSB0aGUgcmVzdWx0IHRvIHRoZSBiaXRzdHJlYW0gaWYgYW55IGlzIGZvdW5kCkBAIC05OTIsMzAgKzEzNDEsNDkgQEAKIAogICAgICAgICBpZiAoKCh0YWcgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJhbHBoYV9tb2RlIiwgTlVMTCwgMCkpICYmIGF0b2kodGFnLT52YWx1ZSkpIHx8CiAgICAgICAgICAgICAoKHRhZyA9IGF2X2RpY3RfZ2V0KCBzLT5tZXRhZGF0YSwgImFscGhhX21vZGUiLCBOVUxMLCAwKSkgJiYgYXRvaSh0YWctPnZhbHVlKSkgfHwKLSAgICAgICAgICAgIChjb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKSkgeworICAgICAgICAgICAgKHBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWQTQyMFApKSB7CiAgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0FMUEhBTU9ERSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyB3cml0ZSBEaXNwbGF5V2lkdGggYW5kIERpc3BsYXlIZWlnaHQsIHRoZXkgY29udGFpbiB0aGUgc2l6ZSBvZgogICAgICAgICAvLyBhIHNpbmdsZSBzb3VyY2UgdmlldyBhbmQvb3IgdGhlIGRpc3BsYXkgYXNwZWN0IHJhdGlvCiAgICAgICAgIGlmIChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pIHsKLSAgICAgICAgICAgIGludDY0X3QgZF93aWR0aCA9IGF2X3Jlc2NhbGUoY29kZWMtPndpZHRoLCBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgICAgICBpbnQ2NF90IGRfd2lkdGggPSBhdl9yZXNjYWxlKHBhci0+d2lkdGgsIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKICAgICAgICAgICAgIGlmIChkX3dpZHRoID4gSU5UX01BWCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPdmVyZmxvdyBpbiBkaXNwbGF5IHdpZHRoXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEggLCBkX3dpZHRoIC8gZGlzcGxheV93aWR0aF9kaXYpOwotICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVklERU9ESVNQTEFZSEVJR0hULCBjb2RlYy0+aGVpZ2h0IC8gZGlzcGxheV9oZWlnaHRfZGl2KTsKKyAgICAgICAgICAgIGlmIChkX3dpZHRoICE9IHBhci0+d2lkdGggfHwgZGlzcGxheV93aWR0aF9kaXYgIT0gMSB8fCBkaXNwbGF5X2hlaWdodF9kaXYgIT0gMSkgeworICAgICAgICAgICAgICAgIGlmIChta3YtPm1vZGUgPT0gTU9ERV9XRUJNIHx8IGRpc3BsYXlfd2lkdGhfZGl2ICE9IDEgfHwgZGlzcGxheV9oZWlnaHRfZGl2ICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVklERU9ESVNQTEFZV0lEVEggLCBkX3dpZHRoIC8gZGlzcGxheV93aWR0aF9kaXYpOworICAgICAgICAgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0RJU1BMQVlIRUlHSFQsIHBhci0+aGVpZ2h0IC8gZGlzcGxheV9oZWlnaHRfZGl2KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIGRpc3BsYXlfYXNwZWN0X3JhdGlvOworICAgICAgICAgICAgICAgICAgICBhdl9yZWR1Y2UoJmRpc3BsYXlfYXNwZWN0X3JhdGlvLm51bSwgJmRpc3BsYXlfYXNwZWN0X3JhdGlvLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+d2lkdGggICogKGludDY0X3Qpc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5oZWlnaHQgKiAoaW50NjRfdClzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI0ICogMTAyNCk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWVdJRFRILCAgZGlzcGxheV9hc3BlY3RfcmF0aW8ubnVtKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVklERU9ESVNQTEFZSEVJR0hULCBkaXNwbGF5X2FzcGVjdF9yYXRpby5kZW4pOworICAgICAgICAgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0RJU1BMQVlVTklULCBNQVRST1NLQV9WSURFT19ESVNQTEFZVU5JVF9EQVIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChkaXNwbGF5X3dpZHRoX2RpdiAhPSAxIHx8IGRpc3BsYXlfaGVpZ2h0X2RpdiAhPSAxKSB7Ci0gICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0RJU1BMQVlXSURUSCAsIGNvZGVjLT53aWR0aCAvIGRpc3BsYXlfd2lkdGhfZGl2KTsKLSAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVCwgY29kZWMtPmhlaWdodCAvIGRpc3BsYXlfaGVpZ2h0X2Rpdik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWVdJRFRIICwgcGFyLT53aWR0aCAvIGRpc3BsYXlfd2lkdGhfZGl2KTsKKyAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1ZJREVPRElTUExBWUhFSUdIVCwgcGFyLT5oZWlnaHQgLyBkaXNwbGF5X2hlaWdodF9kaXYpOworICAgICAgICB9IGVsc2UgaWYgKG1rdi0+bW9kZSAhPSBNT0RFX1dFQk0pCisgICAgICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9WSURFT0RJU1BMQVlVTklULCBNQVRST1NLQV9WSURFT19ESVNQTEFZVU5JVF9VTktOT1dOKTsKIAotICAgICAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjb2xvcl9zcGFjZSA9IGF2X2xlMm5lMzIoY29kZWMtPmNvZGVjX3RhZyk7CisgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgICAgICAgICB1aW50MzJfdCBjb2xvcl9zcGFjZSA9IGF2X2xlMm5lMzIocGFyLT5jb2RlY190YWcpOwogICAgICAgICAgICAgcHV0X2VibWxfYmluYXJ5KHBiLCBNQVRST1NLQV9JRF9WSURFT0NPTE9SU1BBQ0UsICZjb2xvcl9zcGFjZSwgc2l6ZW9mKGNvbG9yX3NwYWNlKSk7CiAgICAgICAgIH0KLQorICAgICAgICByZXQgPSBta3Zfd3JpdGVfdmlkZW9fY29sb3IocGIsIHBhciwgc3QpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldCA9IG1rdl93cml0ZV92aWRlb19wcm9qZWN0aW9uKHMsIHBiLCBzdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBzdWJpbmZvKTsKICAgICAgICAgYnJlYWs7CiAKQEAgLTEwMjcsNyArMTM5NSw5IEBACiAgICAgICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX0NPREVDSUQsICJBX01TL0FDTSIpOwogCiAgICAgICAgIHN1YmluZm8gPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfVFJBQ0tBVURJTywgMCk7Ci0gICAgICAgIHB1dF9lYm1sX3VpbnQgIChwYiwgTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUyAgICAsIGNvZGVjLT5jaGFubmVscyk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQgIChwYiwgTUFUUk9TS0FfSURfQVVESU9DSEFOTkVMUyAgICAsIHBhci0+Y2hhbm5lbHMpOworCisgICAgICAgIG1rdi0+dHJhY2tzW2ldLnNhbXBsZV9yYXRlX29mZnNldCA9IGF2aW9fdGVsbChwYik7CiAgICAgICAgIHB1dF9lYm1sX2Zsb2F0IChwYiwgTUFUUk9TS0FfSURfQVVESU9TQU1QTElOR0ZSRVEsIHNhbXBsZV9yYXRlKTsKICAgICAgICAgaWYgKG91dHB1dF9zYW1wbGVfcmF0ZSkKICAgICAgICAgICAgIHB1dF9lYm1sX2Zsb2F0KHBiLCBNQVRST1NLQV9JRF9BVURJT09VVFNBTVBMSU5HRlJFUSwgb3V0cHV0X3NhbXBsZV9yYXRlKTsKQEAgLTEwMzgsMTEgKzE0MDgsMTEgQEAKIAogICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgogICAgICAgICBpZiAoIW5hdGl2ZV9pZCkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlN1YnRpdGxlIGNvZGVjICVkIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBjb2RlYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlN1YnRpdGxlIGNvZGVjICVkIGlzIG5vdCBzdXBwb3J0ZWQuXG4iLCBwYXItPmNvZGVjX2lkKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSB8fCBjb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV0VCVlRUKQorICAgICAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSB8fCBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dFQlZUVCkKICAgICAgICAgICAgIG5hdGl2ZV9pZCA9IE1BVFJPU0tBX1RSQUNLX1RZUEVfU1VCVElUTEU7CiAKICAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfVFJBQ0tUWVBFLCBuYXRpdmVfaWQpOwpAQCAtMTA1Miw4ICsxNDIyLDkgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSB8fCBjb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV0VCVlRUKSB7Ci0gICAgICAgIHJldCA9IG1rdl93cml0ZV9jb2RlY3ByaXZhdGUocywgcGIsIGNvZGVjLCBuYXRpdmVfaWQsIHF0X2lkKTsKKyAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSB8fCBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dFQlZUVCkgeworICAgICAgICBta3YtPnRyYWNrc1tpXS5jb2RlY3ByaXZfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgcmV0ID0gbWt2X3dyaXRlX2NvZGVjcHJpdmF0ZShzLCBwYiwgcGFyLCBuYXRpdmVfaWQsIHF0X2lkKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEwNjcsMzEgKzE0MzgsMzggQEAKIHsKICAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKLSAgICBlYm1sX21hc3RlciB0cmFja3M7CiAgICAgaW50IGksIHJldCwgZGVmYXVsdF9zdHJlYW1fZXhpc3RzID0gMDsKIAogICAgIHJldCA9IG1rdl9hZGRfc2Vla2hlYWRfZW50cnkobWt2LT5tYWluX3NlZWtoZWFkLCBNQVRST1NLQV9JRF9UUkFDS1MsIGF2aW9fdGVsbChwYikpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgdHJhY2tzID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX1RSQUNLUywgMCk7CisgICAgcmV0ID0gc3RhcnRfZWJtbF9tYXN0ZXJfY3JjMzIocGIsICZta3YtPnRyYWNrc19iYywgbWt2LCAmbWt2LT50cmFja3NfbWFzdGVyLCBNQVRST1NLQV9JRF9UUkFDS1MsIDApOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICBkZWZhdWx0X3N0cmVhbV9leGlzdHMgfD0gc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fREVGQVVMVDsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICByZXQgPSBta3Zfd3JpdGVfdHJhY2socywgbWt2LCBpLCBwYiwgZGVmYXVsdF9zdHJlYW1fZXhpc3RzKTsKKyAgICAgICAgcmV0ID0gbWt2X3dyaXRlX3RyYWNrKHMsIG1rdiwgaSwgbWt2LT50cmFja3NfYmMsIGRlZmF1bHRfc3RyZWFtX2V4aXN0cyk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9Ci0gICAgZW5kX2VibWxfbWFzdGVyKHBiLCB0cmFja3MpOworCisgICAgaWYgKChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgJiYgIW1rdi0+aXNfbGl2ZSkKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyX3ByZWxpbWluYXJ5KHBiLCAmbWt2LT50cmFja3NfYmMsIG1rdiwgbWt2LT50cmFja3NfbWFzdGVyKTsKKyAgICBlbHNlCisgICAgICAgIGVuZF9lYm1sX21hc3Rlcl9jcmMzMihwYiwgJm1rdi0+dHJhY2tzX2JjLCBta3YsIG1rdi0+dHJhY2tzX21hc3Rlcik7CisKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBta3Zfd3JpdGVfY2hhcHRlcnMoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOwotICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOworICAgIEFWSU9Db250ZXh0ICpkeW5fY3AsICpwYiA9IHMtPnBiOwogICAgIGVibWxfbWFzdGVyIGNoYXB0ZXJzLCBlZGl0aW9uZW50cnk7CiAgICAgQVZSYXRpb25hbCBzY2FsZSA9IHsxLCAxRTl9OwogICAgIGludCBpLCByZXQ7CkBAIC0xMTAyLDEwICsxNDgwLDE0IEBACiAgICAgcmV0ID0gbWt2X2FkZF9zZWVraGVhZF9lbnRyeShta3YtPm1haW5fc2Vla2hlYWQsIE1BVFJPU0tBX0lEX0NIQVBURVJTLCBhdmlvX3RlbGwocGIpKTsKICAgICBpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKIAotICAgIGNoYXB0ZXJzICAgICA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9DSEFQVEVSUyAgICAsIDApOwotICAgIGVkaXRpb25lbnRyeSA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9FRElUSU9ORU5UUlksIDApOwotICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0VESVRJT05GTEFHREVGQVVMVCwgMSk7Ci0gICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfRURJVElPTkZMQUdISURERU4gLCAwKTsKKyAgICByZXQgPSBzdGFydF9lYm1sX21hc3Rlcl9jcmMzMihwYiwgJmR5bl9jcCwgbWt2LCAmY2hhcHRlcnMsIE1BVFJPU0tBX0lEX0NIQVBURVJTLCAwKTsKKyAgICBpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKKworICAgIGVkaXRpb25lbnRyeSA9IHN0YXJ0X2VibWxfbWFzdGVyKGR5bl9jcCwgTUFUUk9TS0FfSURfRURJVElPTkVOVFJZLCAwKTsKKyAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSkgeworICAgICAgICBwdXRfZWJtbF91aW50KGR5bl9jcCwgTUFUUk9TS0FfSURfRURJVElPTkZMQUdERUZBVUxULCAxKTsKKyAgICAgICAgcHV0X2VibWxfdWludChkeW5fY3AsIE1BVFJPU0tBX0lEX0VESVRJT05GTEFHSElEREVOICwgMCk7CisgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFwdGVyczsgaSsrKSB7CiAgICAgICAgIGVibWxfbWFzdGVyIGNoYXB0ZXJhdG9tLCBjaGFwdGVyZGlzcGxheTsKICAgICAgICAgQVZDaGFwdGVyICpjICAgICA9IHMtPmNoYXB0ZXJzW2ldOwpAQCAtMTExOSwyMiArMTUwMSwyNCBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KIAotICAgICAgICBjaGFwdGVyYXRvbSA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9DSEFQVEVSQVRPTSwgMCk7Ci0gICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0NIQVBURVJVSUQsIGMtPmlkICsgbWt2LT5jaGFwdGVyX2lkX29mZnNldCk7Ci0gICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RBUlQsIGNoYXB0ZXJzdGFydCk7Ci0gICAgICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX0NIQVBURVJUSU1FRU5ELCBjaGFwdGVyZW5kKTsKLSAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdISURERU4gLCAwKTsKLSAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdFTkFCTEVELCAxKTsKLSAgICAgICAgaWYgKCh0ID0gYXZfZGljdF9nZXQoYy0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKSkgewotICAgICAgICAgICAgY2hhcHRlcmRpc3BsYXkgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQ0hBUFRFUkRJU1BMQVksIDApOwotICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9DSEFQU1RSSU5HLCB0LT52YWx1ZSk7Ci0gICAgICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX0NIQVBMQU5HICAsICJ1bmQiKTsKLSAgICAgICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgY2hhcHRlcmRpc3BsYXkpOworICAgICAgICBjaGFwdGVyYXRvbSA9IHN0YXJ0X2VibWxfbWFzdGVyKGR5bl9jcCwgTUFUUk9TS0FfSURfQ0hBUFRFUkFUT00sIDApOworICAgICAgICBwdXRfZWJtbF91aW50KGR5bl9jcCwgTUFUUk9TS0FfSURfQ0hBUFRFUlVJRCwgYy0+aWQgKyBta3YtPmNoYXB0ZXJfaWRfb2Zmc2V0KTsKKyAgICAgICAgcHV0X2VibWxfdWludChkeW5fY3AsIE1BVFJPU0tBX0lEX0NIQVBURVJUSU1FU1RBUlQsIGNoYXB0ZXJzdGFydCk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9DSEFQVEVSVElNRUVORCwgY2hhcHRlcmVuZCk7CisgICAgICAgIGlmIChta3YtPm1vZGUgIT0gTU9ERV9XRUJNKSB7CisgICAgICAgICAgICBwdXRfZWJtbF91aW50KGR5bl9jcCwgTUFUUk9TS0FfSURfQ0hBUFRFUkZMQUdISURERU4gLCAwKTsKKyAgICAgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9DSEFQVEVSRkxBR0VOQUJMRUQsIDEpOwogICAgICAgICB9Ci0gICAgICAgIGVuZF9lYm1sX21hc3RlcihwYiwgY2hhcHRlcmF0b20pOworICAgICAgICBpZiAoKHQgPSBhdl9kaWN0X2dldChjLT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCkpKSB7CisgICAgICAgICAgICBjaGFwdGVyZGlzcGxheSA9IHN0YXJ0X2VibWxfbWFzdGVyKGR5bl9jcCwgTUFUUk9TS0FfSURfQ0hBUFRFUkRJU1BMQVksIDApOworICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKGR5bl9jcCwgTUFUUk9TS0FfSURfQ0hBUFNUUklORywgdC0+dmFsdWUpOworICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKGR5bl9jcCwgTUFUUk9TS0FfSURfQ0hBUExBTkcgICwgInVuZCIpOworICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyKGR5bl9jcCwgY2hhcHRlcmRpc3BsYXkpOworICAgICAgICB9CisgICAgICAgIGVuZF9lYm1sX21hc3RlcihkeW5fY3AsIGNoYXB0ZXJhdG9tKTsKICAgICB9Ci0gICAgZW5kX2VibWxfbWFzdGVyKHBiLCBlZGl0aW9uZW50cnkpOwotICAgIGVuZF9lYm1sX21hc3RlcihwYiwgY2hhcHRlcnMpOworICAgIGVuZF9lYm1sX21hc3RlcihkeW5fY3AsIGVkaXRpb25lbnRyeSk7CisgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyKHBiLCAmZHluX2NwLCBta3YsIGNoYXB0ZXJzKTsKIAogICAgIG1rdi0+d3JvdGVfY2hhcHRlcnMgPSAxOwogICAgIHJldHVybiAwOwpAQCAtMTE1MSw3ICsxNTM1LDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIGlmICgocCA9IHN0cnJjaHIocCwgJy0nKSkgJiYKLSAgICAgICAgKGxhbmcgPSBhdl9jb252ZXJ0X2xhbmdfdG8ocCArIDEsIEFWX0xBTkdfSVNPNjM5XzJfQklCTCkpKQorICAgICAgICAobGFuZyA9IGZmX2NvbnZlcnRfbGFuZ190byhwICsgMSwgQVZfTEFOR19JU082MzlfMl9CSUJMKSkpCiAgICAgICAgICpwID0gMDsKIAogICAgIHAgPSBrZXk7CkBAIC0xMTc4LDYgKzE1NjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVsZW1lbnRpZCwgdW5zaWduZWQgaW50IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVibWxfbWFzdGVyICp0YWdzLCBlYm1sX21hc3RlciogdGFnKQogeworICAgIEFWSU9Db250ZXh0ICpwYjsKICAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKICAgICBlYm1sX21hc3RlciB0YXJnZXRzOwogICAgIGludCByZXQ7CkBAIC0xMTg2LDIwICsxNTcxLDM2IEBACiAgICAgICAgIHJldCA9IG1rdl9hZGRfc2Vla2hlYWRfZW50cnkobWt2LT5tYWluX3NlZWtoZWFkLCBNQVRST1NLQV9JRF9UQUdTLCBhdmlvX3RlbGwocy0+cGIpKTsKICAgICAgICAgaWYgKHJldCA8IDApIHJldHVybiByZXQ7CiAKLSAgICAgICAgKnRhZ3MgPSBzdGFydF9lYm1sX21hc3RlcihzLT5wYiwgTUFUUk9TS0FfSURfVEFHUywgMCk7CisgICAgICAgIHN0YXJ0X2VibWxfbWFzdGVyX2NyYzMyKHMtPnBiLCAmbWt2LT50YWdzX2JjLCBta3YsIHRhZ3MsIE1BVFJPU0tBX0lEX1RBR1MsIDApOwogICAgIH0KKyAgICBwYiA9IG1rdi0+dGFnc19iYzsKIAotICAgICp0YWcgICAgID0gc3RhcnRfZWJtbF9tYXN0ZXIocy0+cGIsIE1BVFJPU0tBX0lEX1RBRywgICAgICAgIDApOwotICAgIHRhcmdldHMgPSBzdGFydF9lYm1sX21hc3RlcihzLT5wYiwgTUFUUk9TS0FfSURfVEFHVEFSR0VUUywgMCk7CisgICAgKnRhZyAgICAgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfVEFHLCAgICAgICAwKTsKKyAgICB0YXJnZXRzID0gc3RhcnRfZWJtbF9tYXN0ZXIocGIsIE1BVFJPU0tBX0lEX1RBR1RBUkdFVFMsIDApOwogICAgIGlmIChlbGVtZW50aWQpCi0gICAgICAgIHB1dF9lYm1sX3VpbnQocy0+cGIsIGVsZW1lbnRpZCwgdWlkKTsKLSAgICBlbmRfZWJtbF9tYXN0ZXIocy0+cGIsIHRhcmdldHMpOworICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBlbGVtZW50aWQsIHVpZCk7CisgICAgZW5kX2VibWxfbWFzdGVyKHBiLCB0YXJnZXRzKTsKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBta3ZfY2hlY2tfdGFnX25hbWUoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGVsZW1lbnRpZCkKK3sKKyAgICByZXR1cm4gYXZfc3RyY2FzZWNtcChuYW1lLCAidGl0bGUiKSAmJgorICAgICAgICAgICBhdl9zdHJjYXNlY21wKG5hbWUsICJzdGVyZW9fbW9kZSIpICYmCisgICAgICAgICAgIGF2X3N0cmNhc2VjbXAobmFtZSwgImNyZWF0aW9uX3RpbWUiKSAmJgorICAgICAgICAgICBhdl9zdHJjYXNlY21wKG5hbWUsICJlbmNvZGluZ190b29sIikgJiYKKyAgICAgICAgICAgYXZfc3RyY2FzZWNtcChuYW1lLCAiZHVyYXRpb24iKSAmJgorICAgICAgICAgICAoZWxlbWVudGlkICE9IE1BVFJPU0tBX0lEX1RBR1RBUkdFVFNfVFJBQ0tVSUQgfHwKKyAgICAgICAgICAgIGF2X3N0cmNhc2VjbXAobmFtZSwgImxhbmd1YWdlIikpICYmCisgICAgICAgICAgIChlbGVtZW50aWQgIT0gTUFUUk9TS0FfSURfVEFHVEFSR0VUU19BVFRBQ0hVSUQgfHwKKyAgICAgICAgICAgIChhdl9zdHJjYXNlY21wKG5hbWUsICJmaWxlbmFtZSIpICYmCisgICAgICAgICAgICAgYXZfc3RyY2FzZWNtcChuYW1lLCAibWltZXR5cGUiKSkpOworfQorCiBzdGF0aWMgaW50IG1rdl93cml0ZV90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkRpY3Rpb25hcnkgKm0sIHVuc2lnbmVkIGludCBlbGVtZW50aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHVpZCwgZWJtbF9tYXN0ZXIgKnRhZ3MpCiB7CisgICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7CiAgICAgZWJtbF9tYXN0ZXIgdGFnOwogICAgIGludCByZXQ7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOwpAQCAtMTIwOSwyOCArMTYxMCwyMyBAQAogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQobSwgIiIsIHQsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKSB7Ci0gICAgICAgIGlmIChhdl9zdHJjYXNlY21wKHQtPmtleSwgInRpdGxlIikgJiYKLSAgICAgICAgICAgIGF2X3N0cmNhc2VjbXAodC0+a2V5LCAic3RlcmVvX21vZGUiKSAmJgotICAgICAgICAgICAgYXZfc3RyY2FzZWNtcCh0LT5rZXksICJjcmVhdGlvbl90aW1lIikgJiYKLSAgICAgICAgICAgIGF2X3N0cmNhc2VjbXAodC0+a2V5LCAiZW5jb2RpbmdfdG9vbCIpICYmCi0gICAgICAgICAgICAoZWxlbWVudGlkICE9IE1BVFJPU0tBX0lEX1RBR1RBUkdFVFNfVFJBQ0tVSUQgfHwKLSAgICAgICAgICAgICBhdl9zdHJjYXNlY21wKHQtPmtleSwgImxhbmd1YWdlIikpKSB7Ci0gICAgICAgICAgICByZXQgPSBta3Zfd3JpdGVfc2ltcGxldGFnKHMtPnBiLCB0KTsKKyAgICAgICAgaWYgKG1rdl9jaGVja190YWdfbmFtZSh0LT5rZXksIGVsZW1lbnRpZCkpIHsKKyAgICAgICAgICAgIHJldCA9IG1rdl93cml0ZV9zaW1wbGV0YWcobWt2LT50YWdzX2JjLCB0KTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBlbmRfZWJtbF9tYXN0ZXIocy0+cGIsIHRhZyk7CisgICAgZW5kX2VibWxfbWFzdGVyKG1rdi0+dGFnc19iYywgdGFnKTsKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBta3ZfY2hlY2tfdGFnKEFWRGljdGlvbmFyeSAqbSkKK3N0YXRpYyBpbnQgbWt2X2NoZWNrX3RhZyhBVkRpY3Rpb25hcnkgKm0sIHVuc2lnbmVkIGludCBlbGVtZW50aWQpCiB7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQgPSBOVUxMOwogCiAgICAgd2hpbGUgKCh0ID0gYXZfZGljdF9nZXQobSwgIiIsIHQsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQotICAgICAgICBpZiAoYXZfc3RyY2FzZWNtcCh0LT5rZXksICJ0aXRsZSIpICYmIGF2X3N0cmNhc2VjbXAodC0+a2V5LCAic3RlcmVvX21vZGUiKSkKKyAgICAgICAgaWYgKG1rdl9jaGVja190YWdfbmFtZSh0LT5rZXksIGVsZW1lbnRpZCkpCiAgICAgICAgICAgICByZXR1cm4gMTsKIAogICAgIHJldHVybiAwOwpAQCAtMTIzOSw2NCArMTYzNSw5MyBAQAogc3RhdGljIGludCBta3Zfd3JpdGVfdGFncyhBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7Ci0gICAgZWJtbF9tYXN0ZXIgdGFncyA9IHswfTsKICAgICBpbnQgaSwgcmV0OwogCiAgICAgZmZfbWV0YWRhdGFfY29udl9jdHgocywgZmZfbWt2X21ldGFkYXRhX2NvbnYsIE5VTEwpOwogCi0gICAgaWYgKG1rdl9jaGVja190YWcocy0+bWV0YWRhdGEpKSB7Ci0gICAgICAgIHJldCA9IG1rdl93cml0ZV90YWcocywgcy0+bWV0YWRhdGEsIDAsIDAsICZ0YWdzKTsKKyAgICBpZiAobWt2X2NoZWNrX3RhZyhzLT5tZXRhZGF0YSwgMCkpIHsKKyAgICAgICAgcmV0ID0gbWt2X3dyaXRlX3RhZyhzLCBzLT5tZXRhZGF0YSwgMCwgMCwgJm1rdi0+dGFncyk7CiAgICAgICAgIGlmIChyZXQgPCAwKSByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKIAotICAgICAgICBpZiAoIW1rdl9jaGVja190YWcoc3QtPm1ldGFkYXRhKSkKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIHJldCA9IG1rdl93cml0ZV90YWcocywgc3QtPm1ldGFkYXRhLCBNQVRST1NLQV9JRF9UQUdUQVJHRVRTX1RSQUNLVUlELCBpICsgMSwgJnRhZ3MpOworICAgICAgICBpZiAoIW1rdl9jaGVja190YWcoc3QtPm1ldGFkYXRhLCBNQVRST1NLQV9JRF9UQUdUQVJHRVRTX1RSQUNLVUlEKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHJldCA9IG1rdl93cml0ZV90YWcocywgc3QtPm1ldGFkYXRhLCBNQVRST1NLQV9JRF9UQUdUQVJHRVRTX1RSQUNLVUlELCBpICsgMSwgJm1rdi0+dGFncyk7CiAgICAgICAgIGlmIChyZXQgPCAwKSByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGlmICghbWt2LT5pc19saXZlKSB7CisgICAgaWYgKChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgJiYgIW1rdi0+aXNfbGl2ZSkgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBBVklPQ29udGV4dCAqcGI7CisgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICAgICAgZWJtbF9tYXN0ZXIgdGFnX3RhcmdldDsKICAgICAgICAgICAgIGVibWxfbWFzdGVyIHRhZzsKIAotICAgICAgICAgICAgbWt2X3dyaXRlX3RhZ190YXJnZXRzKHMsIE1BVFJPU0tBX0lEX1RBR1RBUkdFVFNfVFJBQ0tVSUQsIGkgKyAxLCAmdGFncywgJnRhZ190YXJnZXQpOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgdGFnID0gc3RhcnRfZWJtbF9tYXN0ZXIocy0+cGIsIE1BVFJPU0tBX0lEX1NJTVBMRVRBRywgMCk7Ci0gICAgICAgICAgICBwdXRfZWJtbF9zdHJpbmcocy0+cGIsIE1BVFJPU0tBX0lEX1RBR05BTUUsICJEVVJBVElPTiIpOwotICAgICAgICAgICAgbWt2LT5zdHJlYW1fZHVyYXRpb25fb2Zmc2V0c1tpXSA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgICAgICBta3Zfd3JpdGVfdGFnX3RhcmdldHMocywgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19UUkFDS1VJRCwgaSArIDEsICZta3YtPnRhZ3MsICZ0YWdfdGFyZ2V0KTsKKyAgICAgICAgICAgIHBiID0gbWt2LT50YWdzX2JjOworCisgICAgICAgICAgICB0YWcgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfU0lNUExFVEFHLCAwKTsKKyAgICAgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfVEFHTkFNRSwgIkRVUkFUSU9OIik7CisgICAgICAgICAgICBta3YtPnN0cmVhbV9kdXJhdGlvbl9vZmZzZXRzW2ldID0gYXZpb190ZWxsKHBiKTsKIAogICAgICAgICAgICAgLy8gUmVzZXJ2ZSBzcGFjZSB0byB3cml0ZSBkdXJhdGlvbiBhcyBhIDIwLWJ5dGUgc3RyaW5nLgogICAgICAgICAgICAgLy8gMiAoZWJtbCBpZCkgKyAxIChkYXRhIHNpemUpICsgMjAgKGRhdGEpCi0gICAgICAgICAgICBwdXRfZWJtbF92b2lkKHMtPnBiLCAyMyk7Ci0gICAgICAgICAgICBlbmRfZWJtbF9tYXN0ZXIocy0+cGIsIHRhZyk7Ci0gICAgICAgICAgICBlbmRfZWJtbF9tYXN0ZXIocy0+cGIsIHRhZ190YXJnZXQpOworICAgICAgICAgICAgcHV0X2VibWxfdm9pZChwYiwgMjMpOworICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCB0YWcpOworICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCB0YWdfdGFyZ2V0KTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9jaGFwdGVyczsgaSsrKSB7Ci0gICAgICAgIEFWQ2hhcHRlciAqY2ggPSBzLT5jaGFwdGVyc1tpXTsKKyAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhcHRlcnM7IGkrKykgeworICAgICAgICAgICAgQVZDaGFwdGVyICpjaCA9IHMtPmNoYXB0ZXJzW2ldOwogCi0gICAgICAgIGlmICghbWt2X2NoZWNrX3RhZyhjaC0+bWV0YWRhdGEpKQotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIW1rdl9jaGVja190YWcoY2gtPm1ldGFkYXRhLCBNQVRST1NLQV9JRF9UQUdUQVJHRVRTX0NIQVBURVJVSUQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIHJldCA9IG1rdl93cml0ZV90YWcocywgY2gtPm1ldGFkYXRhLCBNQVRST1NLQV9JRF9UQUdUQVJHRVRTX0NIQVBURVJVSUQsIGNoLT5pZCArIG1rdi0+Y2hhcHRlcl9pZF9vZmZzZXQsICZ0YWdzKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHJldHVybiByZXQ7CisgICAgICAgICAgICByZXQgPSBta3Zfd3JpdGVfdGFnKHMsIGNoLT5tZXRhZGF0YSwgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19DSEFQVEVSVUlELCBjaC0+aWQgKyBta3YtPmNoYXB0ZXJfaWRfb2Zmc2V0LCAmbWt2LT50YWdzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAodGFncy5wb3MpCi0gICAgICAgIGVuZF9lYm1sX21hc3RlcihzLT5wYiwgdGFncyk7CisgICAgaWYgKG1rdi0+aGF2ZV9hdHRhY2htZW50cyAmJiBta3YtPm1vZGUgIT0gTU9ERV9XRUJNKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBta3YtPmF0dGFjaG1lbnRzLT5udW1fZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICBta3ZfYXR0YWNobWVudCAqYXR0YWNobWVudCA9ICZta3YtPmF0dGFjaG1lbnRzLT5lbnRyaWVzW2ldOworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1thdHRhY2htZW50LT5zdHJlYW1faWR4XTsKKworICAgICAgICAgICAgaWYgKCFta3ZfY2hlY2tfdGFnKHN0LT5tZXRhZGF0YSwgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19BVFRBQ0hVSUQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICByZXQgPSBta3Zfd3JpdGVfdGFnKHMsIHN0LT5tZXRhZGF0YSwgTUFUUk9TS0FfSURfVEFHVEFSR0VUU19BVFRBQ0hVSUQsIGF0dGFjaG1lbnQtPmZpbGV1aWQsICZta3YtPnRhZ3MpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChta3YtPnRhZ3MucG9zKSB7CisgICAgICAgIGlmICgocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmICFta3YtPmlzX2xpdmUpCisgICAgICAgICAgICBlbmRfZWJtbF9tYXN0ZXJfY3JjMzJfcHJlbGltaW5hcnkocy0+cGIsICZta3YtPnRhZ3NfYmMsIG1rdiwgbWt2LT50YWdzKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyKHMtPnBiLCAmbWt2LT50YWdzX2JjLCBta3YsIG1rdi0+dGFncyk7CisgICAgfQogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1rdl93cml0ZV9hdHRhY2htZW50cyhBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZJT0NvbnRleHQgKmR5bl9jcCwgKnBiID0gcy0+cGI7CiAgICAgZWJtbF9tYXN0ZXIgYXR0YWNobWVudHM7CiAgICAgQVZMRkcgYzsKICAgICBpbnQgaSwgcmV0OwpAQCAtMTMwNCw0MyArMTcyOSw1NCBAQAogICAgIGlmICghbWt2LT5oYXZlX2F0dGFjaG1lbnRzKQogICAgICAgICByZXR1cm4gMDsKIAorICAgIG1rdi0+YXR0YWNobWVudHMgPSBhdl9tYWxsb2N6KHNpemVvZigqbWt2LT5hdHRhY2htZW50cykpOworICAgIGlmICghbWt2LT5hdHRhY2htZW50cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKwogICAgIGF2X2xmZ19pbml0KCZjLCBhdl9nZXRfcmFuZG9tX3NlZWQoKSk7CiAKICAgICByZXQgPSBta3ZfYWRkX3NlZWtoZWFkX2VudHJ5KG1rdi0+bWFpbl9zZWVraGVhZCwgTUFUUk9TS0FfSURfQVRUQUNITUVOVFMsIGF2aW9fdGVsbChwYikpOwogICAgIGlmIChyZXQgPCAwKSByZXR1cm4gcmV0OwogCi0gICAgYXR0YWNobWVudHMgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQVRUQUNITUVOVFMsIDApOworICAgIHJldCA9IHN0YXJ0X2VibWxfbWFzdGVyX2NyYzMyKHBiLCAmZHluX2NwLCBta3YsICZhdHRhY2htZW50cywgTUFUUk9TS0FfSURfQVRUQUNITUVOVFMsIDApOworICAgIGlmIChyZXQgPCAwKSByZXR1cm4gcmV0OwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICBlYm1sX21hc3RlciBhdHRhY2hlZF9maWxlOworICAgICAgICBta3ZfYXR0YWNobWVudCAqYXR0YWNobWVudCA9IG1rdi0+YXR0YWNobWVudHMtPmVudHJpZXM7CiAgICAgICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0OwogICAgICAgICBjb25zdCBjaGFyICptaW1ldHlwZSA9IE5VTEw7Ci0gICAgICAgIHVpbnQ2NF90IGZpbGV1aWQ7CisgICAgICAgIHVpbnQzMl90IGZpbGV1aWQ7CiAKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCkKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGF0dGFjaGVkX2ZpbGUgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQVRUQUNIRURGSUxFLCAwKTsKKyAgICAgICAgYXR0YWNobWVudCA9IGF2X3JlYWxsb2NfYXJyYXkoYXR0YWNobWVudCwgbWt2LT5hdHRhY2htZW50cy0+bnVtX2VudHJpZXMgKyAxLCBzaXplb2YobWt2X2F0dGFjaG1lbnQpKTsKKyAgICAgICAgaWYgKCFhdHRhY2htZW50KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWt2LT5hdHRhY2htZW50cy0+ZW50cmllcyA9IGF0dGFjaG1lbnQ7CisKKyAgICAgICAgYXR0YWNoZWRfZmlsZSA9IHN0YXJ0X2VibWxfbWFzdGVyKGR5bl9jcCwgTUFUUk9TS0FfSURfQVRUQUNIRURGSUxFLCAwKTsKIAogICAgICAgICBpZiAodCA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgInRpdGxlIiwgTlVMTCwgMCkpCi0gICAgICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX0ZJTEVERVNDLCB0LT52YWx1ZSk7CisgICAgICAgICAgICBwdXRfZWJtbF9zdHJpbmcoZHluX2NwLCBNQVRST1NLQV9JRF9GSUxFREVTQywgdC0+dmFsdWUpOwogICAgICAgICBpZiAoISh0ID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAiZmlsZW5hbWUiLCBOVUxMLCAwKSkpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBdHRhY2htZW50IHN0cmVhbSAlZCBoYXMgbm8gZmlsZW5hbWUgdGFnLlxuIiwgaSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9Ci0gICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfRklMRU5BTUUsIHQtPnZhbHVlKTsKKyAgICAgICAgcHV0X2VibWxfc3RyaW5nKGR5bl9jcCwgTUFUUk9TS0FfSURfRklMRU5BTUUsIHQtPnZhbHVlKTsKICAgICAgICAgaWYgKHQgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJtaW1ldHlwZSIsIE5VTEwsIDApKQogICAgICAgICAgICAgbWltZXR5cGUgPSB0LT52YWx1ZTsKLSAgICAgICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FICkgeworICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkUgKSB7CiAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGZmX21rdl9taW1lX3RhZ3NbaV0uaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChmZl9ta3ZfbWltZV90YWdzW2ldLmlkID09IHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmZfbWt2X21pbWVfdGFnc1tpXS5pZCA9PSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlID0gZmZfbWt2X21pbWVfdGFnc1tpXS5zdHI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAoaSA9IDA7IGZmX21rdl9pbWFnZV9taW1lX3RhZ3NbaV0uaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsgaSsrKQotICAgICAgICAgICAgICAgIGlmIChmZl9ta3ZfaW1hZ2VfbWltZV90YWdzW2ldLmlkID09IHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmZfbWt2X2ltYWdlX21pbWVfdGFnc1tpXS5pZCA9PSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlID0gZmZfbWt2X2ltYWdlX21pbWVfdGFnc1tpXS5zdHI7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTEzNTcsMzEgKzE3OTMsNTggQEAKICAgICAgICAgICAgIGlmICghc2hhKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBhdl9zaGFfaW5pdChzaGEsIDE2MCk7Ci0gICAgICAgICAgICBhdl9zaGFfdXBkYXRlKHNoYSwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgYXZfc2hhX3VwZGF0ZShzaGEsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgICAgIGF2X3NoYV9maW5hbChzaGEsIGRpZ2VzdCk7CiAgICAgICAgICAgICBhdl9mcmVlKHNoYSk7Ci0gICAgICAgICAgICBmaWxldWlkID0gQVZfUkw2NChkaWdlc3QpOworICAgICAgICAgICAgZmlsZXVpZCA9IEFWX1JMMzIoZGlnZXN0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbGV1aWQgPSBhdl9sZmdfZ2V0KCZjKTsKICAgICAgICAgfQotICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJVc2luZyAlLjE2IlBSSXg2NCIgZm9yIGF0dGFjaG1lbnQgJWRcbiIsCi0gICAgICAgICAgICAgICBmaWxldWlkLCBpKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiVXNpbmcgJS44IlBSSXgzMiIgZm9yIGF0dGFjaG1lbnQgJWRcbiIsCisgICAgICAgICAgICAgICBmaWxldWlkLCBta3YtPmF0dGFjaG1lbnRzLT5udW1fZW50cmllcyk7CiAKLSAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9GSUxFTUlNRVRZUEUsIG1pbWV0eXBlKTsKLSAgICAgICAgcHV0X2VibWxfYmluYXJ5KHBiLCBNQVRST1NLQV9JRF9GSUxFREFUQSwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICBwdXRfZWJtbF91aW50KHBiLCBNQVRST1NLQV9JRF9GSUxFVUlELCBmaWxldWlkKTsKLSAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBhdHRhY2hlZF9maWxlKTsKKyAgICAgICAgcHV0X2VibWxfc3RyaW5nKGR5bl9jcCwgTUFUUk9TS0FfSURfRklMRU1JTUVUWVBFLCBtaW1ldHlwZSk7CisgICAgICAgIHB1dF9lYm1sX2JpbmFyeShkeW5fY3AsIE1BVFJPU0tBX0lEX0ZJTEVEQVRBLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIHB1dF9lYm1sX3VpbnQoZHluX2NwLCBNQVRST1NLQV9JRF9GSUxFVUlELCBmaWxldWlkKTsKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyKGR5bl9jcCwgYXR0YWNoZWRfZmlsZSk7CisKKyAgICAgICAgbWt2LT5hdHRhY2htZW50cy0+ZW50cmllc1tta3YtPmF0dGFjaG1lbnRzLT5udW1fZW50cmllc10uc3RyZWFtX2lkeCA9IGk7CisgICAgICAgIG1rdi0+YXR0YWNobWVudHMtPmVudHJpZXNbbWt2LT5hdHRhY2htZW50cy0+bnVtX2VudHJpZXMrK10uZmlsZXVpZCAgPSBmaWxldWlkOwogICAgIH0KLSAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIGF0dGFjaG1lbnRzKTsKKyAgICBlbmRfZWJtbF9tYXN0ZXJfY3JjMzIocGIsICZkeW5fY3AsIG1rdiwgYXR0YWNobWVudHMpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQ2NF90IGdldF9tZXRhZGF0YV9kdXJhdGlvbihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGkgPSAwOworICAgIGludDY0X3QgbWF4ID0gMDsKKyAgICBpbnQ2NF90IHVzOworCisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmV4cGxpY2l0RHVyYXRpb24gPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIkRVUkFUSU9OIiwgTlVMTCwgMCk7CisgICAgaWYgKGV4cGxpY2l0RHVyYXRpb24gJiYgKGF2X3BhcnNlX3RpbWUoJnVzLCBleHBsaWNpdER1cmF0aW9uLT52YWx1ZSwgMSkgPT0gMCkgJiYgdXMgPiAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJnZXRfbWV0YWRhdGFfZHVyYXRpb24gZm91bmQgZHVyYXRpb24gaW4gY29udGV4dCBtZXRhZGF0YTogJSIgUFJJZDY0ICJcbiIsIHVzKTsKKyAgICAgICAgcmV0dXJuIHVzOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaW50NjRfdCB1czsKKyAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmR1cmF0aW9uID0gYXZfZGljdF9nZXQocy0+c3RyZWFtc1tpXS0+bWV0YWRhdGEsICJEVVJBVElPTiIsIE5VTEwsIDApOworCisgICAgICAgIGlmIChkdXJhdGlvbiAmJiAoYXZfcGFyc2VfdGltZSgmdXMsIGR1cmF0aW9uLT52YWx1ZSwgMSkgPT0gMCkpCisgICAgICAgICAgICBtYXggPSBGRk1BWChtYXgsIHVzKTsKKyAgICB9CisKKyAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiZ2V0X21ldGFkYXRhX2R1cmF0aW9uIHJldHVybmVkOiAlIiBQUklkNjQgIlxuIiwgbWF4KTsKKyAgICByZXR1cm4gbWF4OworfQorCiBzdGF0aWMgaW50IG1rdl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIGVibWxfbWFzdGVyIGVibWxfaGVhZGVyLCBzZWdtZW50X2luZm87CisgICAgZWJtbF9tYXN0ZXIgZWJtbF9oZWFkZXI7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRhZzsKICAgICBpbnQgcmV0LCBpLCB2ZXJzaW9uID0gMjsKICAgICBpbnQ2NF90IGNyZWF0aW9uX3RpbWU7CkBAIC0xMzk3LDE4ICsxODYwLDcgQEAKICAgICAgICAgdmVyc2lvbiA9IDQ7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVRSQUMzIHx8Ci0gICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQ09PSyB8fAotICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBXzI4OCB8fAotICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NJUFIgfHwKLSAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjEwIHx8Ci0gICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYyMCkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiVGhlIE1hdHJvc2thIG11eGVyIGRvZXMgbm90IHlldCBzdXBwb3J0IG11eGluZyAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY19pZCkpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUyB8fAorICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMgfHwKICAgICAgICAgICAgIGF2X2RpY3RfZ2V0KHMtPnN0cmVhbXNbaV0tPm1ldGFkYXRhLCAic3RlcmVvX21vZGUiLCBOVUxMLCAwKSB8fAogICAgICAgICAgICAgYXZfZGljdF9nZXQocy0+c3RyZWFtc1tpXS0+bWV0YWRhdGEsICJhbHBoYV9tb2RlIiwgTlVMTCwgMCkpCiAgICAgICAgICAgICB2ZXJzaW9uID0gNDsKQEAgLTE0NDYsMjUgKzE4OTgsMzIgQEAKICAgICByZXQgPSBta3ZfYWRkX3NlZWtoZWFkX2VudHJ5KG1rdi0+bWFpbl9zZWVraGVhZCwgTUFUUk9TS0FfSURfSU5GTywgYXZpb190ZWxsKHBiKSk7CiAgICAgaWYgKHJldCA8IDApIGdvdG8gZmFpbDsKIAotICAgIHNlZ21lbnRfaW5mbyA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9JTkZPLCAwKTsKKyAgICByZXQgPSBzdGFydF9lYm1sX21hc3Rlcl9jcmMzMihwYiwgJm1rdi0+aW5mb19iYywgbWt2LCAmbWt2LT5pbmZvLCBNQVRST1NLQV9JRF9JTkZPLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBwYiA9IG1rdi0+aW5mb19iYzsKKwogICAgIHB1dF9lYm1sX3VpbnQocGIsIE1BVFJPU0tBX0lEX1RJTUVDT0RFU0NBTEUsIDEwMDAwMDApOwogICAgIGlmICgodGFnID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKSkKICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9USVRMRSwgdGFnLT52YWx1ZSk7CiAgICAgaWYgKCEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKSkgewotICAgICAgICB1aW50MzJfdCBzZWdtZW50X3VpZFs0XTsKLSAgICAgICAgQVZMRkcgbGZnOwotCi0gICAgICAgIGF2X2xmZ19pbml0KCZsZmcsIGF2X2dldF9yYW5kb21fc2VlZCgpKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgc2VnbWVudF91aWRbaV0gPSBhdl9sZmdfZ2V0KCZsZmcpOwotCiAgICAgICAgIHB1dF9lYm1sX3N0cmluZyhwYiwgTUFUUk9TS0FfSURfTVVYSU5HQVBQLCBMSUJBVkZPUk1BVF9JREVOVCk7CiAgICAgICAgIGlmICgodGFnID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJlbmNvZGluZ190b29sIiwgTlVMTCwgMCkpKQogICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9XUklUSU5HQVBQLCB0YWctPnZhbHVlKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcHV0X2VibWxfc3RyaW5nKHBiLCBNQVRST1NLQV9JRF9XUklUSU5HQVBQLCBMSUJBVkZPUk1BVF9JREVOVCk7Ci0gICAgICAgIHB1dF9lYm1sX2JpbmFyeShwYiwgTUFUUk9TS0FfSURfU0VHTUVOVFVJRCwgc2VnbWVudF91aWQsIDE2KTsKKworICAgICAgICBpZiAobWt2LT5tb2RlICE9IE1PREVfV0VCTSkgeworICAgICAgICAgICAgdWludDMyX3Qgc2VnbWVudF91aWRbNF07CisgICAgICAgICAgICBBVkxGRyBsZmc7CisKKyAgICAgICAgICAgIGF2X2xmZ19pbml0KCZsZmcsIGF2X2dldF9yYW5kb21fc2VlZCgpKTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgICAgICBzZWdtZW50X3VpZFtpXSA9IGF2X2xmZ19nZXQoJmxmZyk7CisKKyAgICAgICAgICAgIHB1dF9lYm1sX2JpbmFyeShwYiwgTUFUUk9TS0FfSURfU0VHTUVOVFVJRCwgc2VnbWVudF91aWQsIDE2KTsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmlkZW50ID0gIkxhdmYiOwogICAgICAgICBwdXRfZWJtbF9zdHJpbmcocGIsIE1BVFJPU0tBX0lEX01VWElOR0FQUCAsIGlkZW50KTsKQEAgLTE0ODMsMTMgKzE5NDIsMzMgQEAKICAgICBta3YtPmR1cmF0aW9uID0gMDsKICAgICBta3YtPmR1cmF0aW9uX29mZnNldCA9IGF2aW9fdGVsbChwYik7CiAgICAgaWYgKCFta3YtPmlzX2xpdmUpIHsKLSAgICAgICAgcHV0X2VibWxfdm9pZChwYiwgMTEpOyAgICAgICAgICAgICAgLy8gYXNzdW1lcyBkb3VibGUtcHJlY2lzaW9uIGZsb2F0IHRvIGJlIHdyaXR0ZW4KKyAgICAgICAgaW50NjRfdCBtZXRhZGF0YV9kdXJhdGlvbiA9IGdldF9tZXRhZGF0YV9kdXJhdGlvbihzKTsKKworICAgICAgICBpZiAocy0+ZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICBpbnQ2NF90IHNjYWxlZER1cmF0aW9uID0gYXZfcmVzY2FsZShzLT5kdXJhdGlvbiwgMTAwMCwgQVZfVElNRV9CQVNFKTsKKyAgICAgICAgICAgIHB1dF9lYm1sX2Zsb2F0KHBiLCBNQVRST1NLQV9JRF9EVVJBVElPTiwgc2NhbGVkRHVyYXRpb24pOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIldyaXRlIGVhcmx5IGR1cmF0aW9uIGZyb20gcmVjb3JkaW5nIHRpbWUgPSAlIiBQUkl1NjQgIlxuIiwgc2NhbGVkRHVyYXRpb24pOworICAgICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhX2R1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgaW50NjRfdCBzY2FsZWREdXJhdGlvbiA9IGF2X3Jlc2NhbGUobWV0YWRhdGFfZHVyYXRpb24sIDEwMDAsIEFWX1RJTUVfQkFTRSk7CisgICAgICAgICAgICBwdXRfZWJtbF9mbG9hdChwYiwgTUFUUk9TS0FfSURfRFVSQVRJT04sIHNjYWxlZER1cmF0aW9uKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJXcml0ZSBlYXJseSBkdXJhdGlvbiBmcm9tIG1ldGFkYXRhID0gJSIgUFJJdTY0ICJcbiIsIHNjYWxlZER1cmF0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHB1dF9lYm1sX3ZvaWQocGIsIDExKTsgICAgICAgICAgICAgIC8vIGFzc3VtZXMgZG91YmxlLXByZWNpc2lvbiBmbG9hdCB0byBiZSB3cml0dGVuCisgICAgICAgIH0KICAgICB9Ci0gICAgZW5kX2VibWxfbWFzdGVyKHBiLCBzZWdtZW50X2luZm8pOworICAgIGlmICgocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmICFta3YtPmlzX2xpdmUpCisgICAgICAgIGVuZF9lYm1sX21hc3Rlcl9jcmMzMl9wcmVsaW1pbmFyeShzLT5wYiwgJm1rdi0+aW5mb19iYywgbWt2LCBta3YtPmluZm8pOworICAgIGVsc2UKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyKHMtPnBiLCAmbWt2LT5pbmZvX2JjLCBta3YsIG1rdi0+aW5mbyk7CisgICAgcGIgPSBzLT5wYjsKIAogICAgIC8vIGluaXRpYWxpemUgc3RyZWFtX2R1cmF0aW9uIGZpZWxkcwogICAgIG1rdi0+c3RyZWFtX2R1cmF0aW9ucyA9IGF2X21hbGxvY3oocy0+bmJfc3RyZWFtcyAqIHNpemVvZihpbnQ2NF90KSk7CiAgICAgbWt2LT5zdHJlYW1fZHVyYXRpb25fb2Zmc2V0cyA9IGF2X21hbGxvY3oocy0+bmJfc3RyZWFtcyAqIHNpemVvZihpbnQ2NF90KSk7CisgICAgaWYgKCFta3YtPnN0cmVhbV9kdXJhdGlvbnMgfHwgIW1rdi0+c3RyZWFtX2R1cmF0aW9uX29mZnNldHMpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQogCiAgICAgcmV0ID0gbWt2X3dyaXRlX3RyYWNrcyhzKTsKICAgICBpZiAocmV0IDwgMCkKQEAgLTE0OTgsMjEgKzE5NzcsMjEgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfY2hhcHRlcnM7IGkrKykKICAgICAgICAgbWt2LT5jaGFwdGVyX2lkX29mZnNldCA9IEZGTUFYKG1rdi0+Y2hhcHRlcl9pZF9vZmZzZXQsIDFMTCAtIHMtPmNoYXB0ZXJzW2ldLT5pZCk7CiAKKyAgICByZXQgPSBta3Zfd3JpdGVfY2hhcHRlcnMocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKwogICAgIGlmIChta3YtPm1vZGUgIT0gTU9ERV9XRUJNKSB7Ci0gICAgICAgIHJldCA9IG1rdl93cml0ZV9jaGFwdGVycyhzKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICAgICAgcmV0ID0gbWt2X3dyaXRlX3RhZ3Mocyk7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotCiAgICAgICAgIHJldCA9IG1rdl93cml0ZV9hdHRhY2htZW50cyhzKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCi0gICAgaWYgKCFzLT5wYi0+c2Vla2FibGUgJiYgIW1rdi0+aXNfbGl2ZSkKKyAgICByZXQgPSBta3Zfd3JpdGVfdGFncyhzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKCEocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmICFta3YtPmlzX2xpdmUpCiAgICAgICAgIG1rdl93cml0ZV9zZWVraGVhZChwYiwgbWt2KTsKIAogICAgIG1rdi0+Y3VlcyA9IG1rdl9zdGFydF9jdWVzKG1rdi0+c2VnbWVudF9vZmZzZXQpOwpAQCAtMTUyMCw4ICsxOTk5LDEwIEBACiAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KLSAgICBpZiAocGItPnNlZWthYmxlICYmIG1rdi0+cmVzZXJ2ZV9jdWVzX3NwYWNlKSB7CisgICAgaWYgKChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgJiYgbWt2LT5yZXNlcnZlX2N1ZXNfc3BhY2UpIHsKICAgICAgICAgbWt2LT5jdWVzX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgICAgIGlmIChta3YtPnJlc2VydmVfY3Vlc19zcGFjZSA9PSAxKQorICAgICAgICAgICAgbWt2LT5yZXNlcnZlX2N1ZXNfc3BhY2UrKzsKICAgICAgICAgcHV0X2VibWxfdm9pZChwYiwgbWt2LT5yZXNlcnZlX2N1ZXNfc3BhY2UpOwogICAgIH0KIApAQCAtMTUzMyw3ICsyMDE0LDcgQEAKIAogICAgIC8vIHN0YXJ0IGEgbmV3IGNsdXN0ZXIgZXZlcnkgNSBNQiBvciA1IHNlYywgb3IgMzJrIC8gMSBzZWMgZm9yIHN0cmVhbWluZyBvcgogICAgIC8vIGFmdGVyIDRrIGFuZCBvbiBhIGtleWZyYW1lCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBpZiAobWt2LT5jbHVzdGVyX3RpbWVfbGltaXQgPCAwKQogICAgICAgICAgICAgbWt2LT5jbHVzdGVyX3RpbWVfbGltaXQgPSA1MDAwOwogICAgICAgICBpZiAobWt2LT5jbHVzdGVyX3NpemVfbGltaXQgPCAwKQpAQCAtMTYxOSw3ICsyMTAwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmxvY2tpZCwgQVZQYWNrZXQgKnBrdCwgaW50IGtleWZyYW1lKQogewogICAgIE1hdHJvc2thTXV4Q29udGV4dCAqbWt2ID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjcGFyOwogICAgIHVpbnQ4X3QgKmRhdGEgPSBOVUxMLCAqc2lkZV9kYXRhID0gTlVMTDsKICAgICBpbnQgb2Zmc2V0ID0gMCwgc2l6ZSA9IHBrdC0+c2l6ZSwgc2lkZV9kYXRhX3NpemUgPSAwOwogICAgIGludDY0X3QgdHMgPSBta3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF0ud3JpdGVfZHRzID8gcGt0LT5kdHMgOiBwa3QtPnB0czsKQEAgLTE2MjgsMTggKzIxMDksMjAgQEAKICAgICB1aW50OF90IHRyYWNrX251bWJlciA9IChta3YtPmlzX2Rhc2ggPyBta3YtPmRhc2hfdHJhY2tfbnVtYmVyIDogKHBrdC0+c3RyZWFtX2luZGV4ICsgMSkpOwogICAgIGVibWxfbWFzdGVyIGJsb2NrX2dyb3VwLCBibG9ja19hZGRpdGlvbnMsIGJsb2NrX21vcmU7CiAKKyAgICB0cyArPSBta3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF0udHNfb2Zmc2V0OworCiAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIldyaXRpbmcgYmxvY2sgYXQgb2Zmc2V0ICUiIFBSSXU2NCAiLCBzaXplICVkLCAiCiAgICAgICAgICAgICJwdHMgJSIgUFJJZDY0ICIsIGR0cyAlIiBQUklkNjQgIiwgZHVyYXRpb24gJSIgUFJJZDY0ICIsIGtleWZyYW1lICVkXG4iLAogICAgICAgICAgICBhdmlvX3RlbGwocGIpLCBwa3QtPnNpemUsIHBrdC0+cHRzLCBwa3QtPmR0cywgcGt0LT5kdXJhdGlvbiwKICAgICAgICAgICAga2V5ZnJhbWUgIT0gMCk7Ci0gICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYKLSAgICAgICAgKEFWX1JCMjQoY29kZWMtPmV4dHJhZGF0YSkgPT0gMSB8fCBBVl9SQjMyKGNvZGVjLT5leHRyYWRhdGEpID09IDEpKQorICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYgcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYKKyAgICAgICAgKEFWX1JCMjQocGFyLT5leHRyYWRhdGEpID09IDEgfHwgQVZfUkIzMihwYXItPmV4dHJhZGF0YSkgPT0gMSkpCiAgICAgICAgIGZmX2F2Y19wYXJzZV9uYWxfdW5pdHNfYnVmKHBrdC0+ZGF0YSwgJmRhdGEsICZzaXplKTsKLSAgICBlbHNlIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQyAmJiBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPiA2ICYmCi0gICAgICAgICAgICAgKEFWX1JCMjQoY29kZWMtPmV4dHJhZGF0YSkgPT0gMSB8fCBBVl9SQjMyKGNvZGVjLT5leHRyYWRhdGEpID09IDEpKQorICAgIGVsc2UgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQyAmJiBwYXItPmV4dHJhZGF0YV9zaXplID4gNiAmJgorICAgICAgICAgICAgIChBVl9SQjI0KHBhci0+ZXh0cmFkYXRhKSA9PSAxIHx8IEFWX1JCMzIocGFyLT5leHRyYWRhdGEpID09IDEpKQogICAgICAgICAvKiBleHRyYWRhdGEgaXMgQW5uZXggQiwgYXNzdW1lIHRoZSBiaXRzdHJlYW0gaXMgdG9vIGFuZCBjb252ZXJ0IGl0ICovCiAgICAgICAgIGZmX2hldmNfYW5uZXhiMm1wNF9idWYocGt0LT5kYXRhLCAmZGF0YSwgJnNpemUsIDAsIE5VTEwpOwotICAgIGVsc2UgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XQVZQQUNLKSB7CisgICAgZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XQVZQQUNLKSB7CiAgICAgICAgIGludCByZXQgPSBta3Zfc3RyaXBfd2F2cGFjayhwa3QtPmRhdGEsICZkYXRhLCAmc2l6ZSk7CiAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc3RyaXBwaW5nIGEgV2F2UGFjayBwYWNrZXQuXG4iKTsKQEAgLTE2NDgsNyArMjEzMSw3IEBACiAgICAgfSBlbHNlCiAgICAgICAgIGRhdGEgPSBwa3QtPmRhdGE7CiAKLSAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BST1JFUyAmJiBzaXplID49IDgpIHsKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QUk9SRVMgJiYgc2l6ZSA+PSA4KSB7CiAgICAgICAgIC8qIE1hdHJvc2thIHNwZWNpZmljYXRpb24gcmVxdWlyZXMgdG8gcmVtb3ZlIHRoZSBmaXJzdCBRdWlja1RpbWUgYXRvbQogICAgICAgICAgKi8KICAgICAgICAgc2l6ZSAgLT0gODsKQEAgLTE2NjEsNyArMjE0NCw3IEBACiAKICAgICBpZiAoc2lkZV9kYXRhICYmIHNpZGVfZGF0YV9zaXplID49IDEwKSB7CiAgICAgICAgIGRpc2NhcmRfcGFkZGluZyA9IGF2X3Jlc2NhbGVfcShBVl9STDMyKHNpZGVfZGF0YSArIDQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIGNvZGVjLT5zYW1wbGVfcmF0ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgcGFyLT5zYW1wbGVfcmF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgMTAwMDAwMDAwMH0pOwogICAgIH0KIApAQCAtMTc1Miw0OCArMjIzNSwxMDYgQEAKICAgICByZXR1cm4gcGt0LT5kdXJhdGlvbjsKIH0KIAotc3RhdGljIHZvaWQgbWt2X2ZsdXNoX2R5bmJ1ZihBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7Ci0gICAgaW50IGJ1ZnNpemU7Ci0gICAgdWludDhfdCAqZHluX2J1ZjsKLQotICAgIGlmICghbWt2LT5keW5fYmMpCi0gICAgICAgIHJldHVybjsKLQotICAgIGJ1ZnNpemUgPSBhdmlvX2Nsb3NlX2R5bl9idWYobWt2LT5keW5fYmMsICZkeW5fYnVmKTsKLSAgICBhdmlvX3dyaXRlKHMtPnBiLCBkeW5fYnVmLCBidWZzaXplKTsKLSAgICBhdl9mcmVlKGR5bl9idWYpOwotICAgIG1rdi0+ZHluX2JjID0gTlVMTDsKLX0KLQogc3RhdGljIHZvaWQgbWt2X3N0YXJ0X25ld19jbHVzdGVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKLSAgICBBVklPQ29udGV4dCAqcGI7CiAKLSAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7Ci0gICAgICAgIHBiID0gcy0+cGI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcGIgPSBta3YtPmR5bl9iYzsKKyAgICBlbmRfZWJtbF9tYXN0ZXJfY3JjMzIocy0+cGIsICZta3YtPmR5bl9iYywgbWt2LCBta3YtPmNsdXN0ZXIpOworICAgIG1rdi0+Y2x1c3Rlcl9wb3MgPSAtMTsKKyAgICBpZiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiU3RhcnRpbmcgbmV3IGNsdXN0ZXIgYXQgb2Zmc2V0ICUiIFBSSXU2NCAiIGJ5dGVzLCAiCisgICAgICAgICAgICAgICAicHRzICUiIFBSSXU2NCAiZHRzICUiIFBSSXU2NCAiXG4iLAorICAgICAgICAgICAgICAgYXZpb190ZWxsKHMtPnBiKSwgcGt0LT5wdHMsIHBrdC0+ZHRzKTsKKyAgICBlbHNlCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJTdGFydGluZyBuZXcgY2x1c3RlciwgIgorICAgICAgICAgICAgICAgInB0cyAlIiBQUkl1NjQgImR0cyAlIiBQUkl1NjQgIlxuIiwKKyAgICAgICAgICAgICAgIHBrdC0+cHRzLCBwa3QtPmR0cyk7CisgICAgYXZpb19mbHVzaChzLT5wYik7Cit9CisKK3N0YXRpYyBpbnQgbWt2X2NoZWNrX25ld19leHRyYV9kYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKKyAgICBta3ZfdHJhY2sgKnRyYWNrICAgICAgICA9ICZta3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF07CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciAgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+Y29kZWNwYXI7CisgICAgdWludDhfdCAqc2lkZV9kYXRhOworICAgIGludCBzaWRlX2RhdGFfc2l6ZSA9IDAsIHJldDsKKworICAgIHNpZGVfZGF0YSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lkZV9kYXRhX3NpemUpOworCisgICAgc3dpdGNoIChwYXItPmNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9BQUM6CisgICAgICAgIGlmIChzaWRlX2RhdGFfc2l6ZSAmJiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmICFta3YtPmlzX2xpdmUpIHsKKyAgICAgICAgICAgIGludCBmaWxsZXIsIG91dHB1dF9zYW1wbGVfcmF0ZSA9IDA7CisgICAgICAgICAgICBpbnQ2NF90IGN1cnBvczsKKyAgICAgICAgICAgIHJldCA9IGdldF9hYWNfc2FtcGxlX3JhdGVzKHMsIHNpZGVfZGF0YSwgc2lkZV9kYXRhX3NpemUsICZ0cmFjay0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0X3NhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBpZiAoIW91dHB1dF9zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgICAgICBvdXRwdXRfc2FtcGxlX3JhdGUgPSB0cmFjay0+c2FtcGxlX3JhdGU7IC8vIFNwYWNlIGlzIGFscmVhZHkgcmVzZXJ2ZWQsIHNvIGl0J3MgdGhpcyBvciBhIHZvaWQgZWxlbWVudC4KKyAgICAgICAgICAgIGF2X2ZyZWVwKCZwYXItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICByZXQgPSBmZl9hbGxvY19leHRyYWRhdGEocGFyLCBzaWRlX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgbWVtY3B5KHBhci0+ZXh0cmFkYXRhLCBzaWRlX2RhdGEsIHNpZGVfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGN1cnBvcyA9IGF2aW9fdGVsbChta3YtPnRyYWNrc19iYyk7CisgICAgICAgICAgICBhdmlvX3NlZWsobWt2LT50cmFja3NfYmMsIHRyYWNrLT5jb2RlY3ByaXZfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICBta3Zfd3JpdGVfY29kZWNwcml2YXRlKHMsIG1rdi0+dHJhY2tzX2JjLCBwYXIsIDEsIDApOworICAgICAgICAgICAgZmlsbGVyID0gTUFYX1BDRV9TSVpFICsgMiArIDQgLSAoYXZpb190ZWxsKG1rdi0+dHJhY2tzX2JjKSAtIHRyYWNrLT5jb2RlY3ByaXZfb2Zmc2V0KTsKKyAgICAgICAgICAgIGlmIChmaWxsZXIpCisgICAgICAgICAgICAgICAgcHV0X2VibWxfdm9pZChta3YtPnRyYWNrc19iYywgZmlsbGVyKTsKKyAgICAgICAgICAgIGF2aW9fc2Vlayhta3YtPnRyYWNrc19iYywgdHJhY2stPnNhbXBsZV9yYXRlX29mZnNldCwgU0VFS19TRVQpOworICAgICAgICAgICAgcHV0X2VibWxfZmxvYXQobWt2LT50cmFja3NfYmMsIE1BVFJPU0tBX0lEX0FVRElPU0FNUExJTkdGUkVRLCB0cmFjay0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgcHV0X2VibWxfZmxvYXQobWt2LT50cmFja3NfYmMsIE1BVFJPU0tBX0lEX0FVRElPT1VUU0FNUExJTkdGUkVRLCBvdXRwdXRfc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZpb19zZWVrKG1rdi0+dHJhY2tzX2JjLCBjdXJwb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgfSBlbHNlIGlmICghcGFyLT5leHRyYWRhdGFfc2l6ZSAmJiAhdHJhY2stPnNhbXBsZV9yYXRlKSB7CisgICAgICAgICAgICAvLyBObyBleHRyYWRhdGEgKGNvZGVjcGFyIG9yIHBhY2tldCBzaWRlIGRhdGEpLgorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgQUFDIGV4dHJhZGF0YSwgdW5hYmxlIHRvIGRldGVybWluZSBzYW1wbGVyYXRlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfRkxBQzoKKyAgICAgICAgaWYgKHNpZGVfZGF0YV9zaXplICYmIChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgJiYgIW1rdi0+aXNfbGl2ZSkgeworICAgICAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmNvZGVjcHJpdl9wYXI7CisgICAgICAgICAgICBpbnQ2NF90IGN1cnBvczsKKyAgICAgICAgICAgIGlmIChzaWRlX2RhdGFfc2l6ZSAhPSBwYXItPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgRkxBQyBTVFJFQU1JTkZPIG1ldGFkYXRhIGZvciBvdXRwdXQgc3RyZWFtICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjcHJpdl9wYXIgPSBhdmNvZGVjX3BhcmFtZXRlcnNfYWxsb2MoKTsKKyAgICAgICAgICAgIGlmICghY29kZWNwcml2X3BhcikKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkoY29kZWNwcml2X3BhciwgcGFyKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2ZyZWUoJmNvZGVjcHJpdl9wYXIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoY29kZWNwcml2X3Bhci0+ZXh0cmFkYXRhLCBzaWRlX2RhdGEsIHNpZGVfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGN1cnBvcyA9IGF2aW9fdGVsbChta3YtPnRyYWNrc19iYyk7CisgICAgICAgICAgICBhdmlvX3NlZWsobWt2LT50cmFja3NfYmMsIHRyYWNrLT5jb2RlY3ByaXZfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgICAgICBta3Zfd3JpdGVfY29kZWNwcml2YXRlKHMsIG1rdi0+dHJhY2tzX2JjLCBjb2RlY3ByaXZfcGFyLCAxLCAwKTsKKyAgICAgICAgICAgIGF2aW9fc2Vlayhta3YtPnRyYWNrc19iYywgY3VycG9zLCBTRUVLX1NFVCk7CisgICAgICAgICAgICBhdmNvZGVjX3BhcmFtZXRlcnNfZnJlZSgmY29kZWNwcml2X3Bhcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHNpZGVfZGF0YV9zaXplKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIklnbm9yaW5nIG5ldyBleHRyYWRhdGEgaW4gYSBwYWNrZXQgZm9yIHN0cmVhbSAlZC5cbiIsIHBrdC0+c3RyZWFtX2luZGV4KTsKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKLSAgICAgICAgICAgICJTdGFydGluZyBuZXcgY2x1c3RlciBhdCBvZmZzZXQgJSIgUFJJdTY0ICIgYnl0ZXMsICIKLSAgICAgICAgICAgICJwdHMgJSIgUFJJdTY0ICJkdHMgJSIgUFJJdTY0ICJcbiIsCi0gICAgICAgICAgICBhdmlvX3RlbGwocGIpLCBwa3QtPnB0cywgcGt0LT5kdHMpOwotICAgIGVuZF9lYm1sX21hc3RlcihwYiwgbWt2LT5jbHVzdGVyKTsKLSAgICBta3YtPmNsdXN0ZXJfcG9zID0gLTE7Ci0gICAgaWYgKG1rdi0+ZHluX2JjKQotICAgICAgICBta3ZfZmx1c2hfZHluYnVmKHMpOwotICAgIGF2aW9fZmx1c2gocy0+cGIpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1rdl93cml0ZV9wYWNrZXRfaW50ZXJuYWwoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBpbnQgYWRkX2N1ZSkKIHsKICAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgICAgICAgICA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyAgID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjcGFyOwogICAgIGludCBrZXlmcmFtZSAgICAgICAgICAgID0gISEocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSk7CiAgICAgaW50IGR1cmF0aW9uICAgICAgICAgICAgPSBwa3QtPmR1cmF0aW9uOwogICAgIGludCByZXQ7CkBAIC0xODE1LDM0ICsyMzU2LDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXMtPnBiLT5zZWVrYWJsZSkgewotICAgICAgICBpZiAoIW1rdi0+ZHluX2JjKSB7Ci0gICAgICAgICAgICByZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmbWt2LT5keW5fYmMpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gZHluYW1pYyBidWZmZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcGIgPSBta3YtPmR5bl9iYzsKLSAgICB9Ci0KICAgICBpZiAobWt2LT5jbHVzdGVyX3BvcyA9PSAtMSkgewogICAgICAgICBta3YtPmNsdXN0ZXJfcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKLSAgICAgICAgbWt2LT5jbHVzdGVyICAgICA9IHN0YXJ0X2VibWxfbWFzdGVyKHBiLCBNQVRST1NLQV9JRF9DTFVTVEVSLCAwKTsKLSAgICAgICAgcHV0X2VibWxfdWludChwYiwgTUFUUk9TS0FfSURfQ0xVU1RFUlRJTUVDT0RFLCBGRk1BWCgwLCB0cykpOworICAgICAgICByZXQgPSBzdGFydF9lYm1sX21hc3Rlcl9jcmMzMihzLT5wYiwgJm1rdi0+ZHluX2JjLCBta3YsICZta3YtPmNsdXN0ZXIsIE1BVFJPU0tBX0lEX0NMVVNURVIsIDApOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHB1dF9lYm1sX3VpbnQobWt2LT5keW5fYmMsIE1BVFJPU0tBX0lEX0NMVVNURVJUSU1FQ09ERSwgRkZNQVgoMCwgdHMpKTsKICAgICAgICAgbWt2LT5jbHVzdGVyX3B0cyA9IEZGTUFYKDAsIHRzKTsKICAgICB9CisgICAgcGIgPSBta3YtPmR5bl9iYzsKIAotICAgIHJlbGF0aXZlX3BhY2tldF9wb3MgPSBhdmlvX3RlbGwocy0+cGIpIC0gbWt2LT5jbHVzdGVyLnBvczsKKyAgICByZWxhdGl2ZV9wYWNrZXRfcG9zID0gYXZpb190ZWxsKHBiKTsKIAotICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICBpZiAocGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgewogICAgICAgICBta3Zfd3JpdGVfYmxvY2socywgcGIsIE1BVFJPU0tBX0lEX1NJTVBMRUJMT0NLLCBwa3QsIGtleWZyYW1lKTsKLSAgICAgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmJiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGtleWZyYW1lIHx8IGFkZF9jdWUpKSB7CisgICAgICAgIGlmICgocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGtleWZyYW1lIHx8IGFkZF9jdWUpKSB7CiAgICAgICAgICAgICByZXQgPSBta3ZfYWRkX2N1ZXBvaW50KG1rdi0+Y3VlcywgcGt0LT5zdHJlYW1faW5kZXgsIGRhc2hfdHJhY2tudW0sIHRzLCBta3YtPmNsdXN0ZXJfcG9zLCByZWxhdGl2ZV9wYWNrZXRfcG9zLCAtMSk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV0VCVlRUKSB7CisgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dFQlZUVCkgewogICAgICAgICAgICAgZHVyYXRpb24gPSBta3Zfd3JpdGVfdnR0X2Jsb2NrcyhzLCBwYiwgcGt0KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVibWxfbWFzdGVyIGJsb2NrZ3JvdXAgPSBzdGFydF9lYm1sX21hc3RlcihwYiwgTUFUUk9TS0FfSURfQkxPQ0tHUk9VUCwKQEAgLTE4NjIsNyArMjM5NSw3IEBACiAgICAgICAgICAgICBlbmRfZWJtbF9tYXN0ZXIocGIsIGJsb2NrZ3JvdXApOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgICAgICBpZiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgICAgIHJldCA9IG1rdl9hZGRfY3VlcG9pbnQobWt2LT5jdWVzLCBwa3QtPnN0cmVhbV9pbmRleCwgZGFzaF90cmFja251bSwgdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1rdi0+Y2x1c3Rlcl9wb3MsIHJlbGF0aXZlX3BhY2tldF9wb3MsIGR1cmF0aW9uKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtMTg4MiwxMyArMjQxNSwxNyBAQAogc3RhdGljIGludCBta3Zfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBNYXRyb3NrYU11eENvbnRleHQgKm1rdiA9IHMtPnByaXZfZGF0YTsKLSAgICBpbnQgY29kZWNfdHlwZSAgICAgICAgICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYy0+Y29kZWNfdHlwZTsKKyAgICBpbnQgY29kZWNfdHlwZSAgICAgICAgICA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZTsKICAgICBpbnQga2V5ZnJhbWUgICAgICAgICAgICA9ICEhKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpOwogICAgIGludCBjbHVzdGVyX3NpemU7CiAgICAgaW50NjRfdCBjbHVzdGVyX3RpbWU7CiAgICAgaW50IHJldDsKICAgICBpbnQgc3RhcnRfbmV3X2NsdXN0ZXI7CiAKKyAgICByZXQgPSBta3ZfY2hlY2tfbmV3X2V4dHJhX2RhdGEocywgcGt0KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKwogICAgIGlmIChta3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF0ud3JpdGVfZHRzKQogICAgICAgICBjbHVzdGVyX3RpbWUgPSBwa3QtPmR0cyAtIG1rdi0+Y2x1c3Rlcl9wdHM7CiAgICAgZWxzZQpAQCAtMTg5NywxMSArMjQzNCw3IEBACiAKICAgICAvLyBzdGFydCBhIG5ldyBjbHVzdGVyIGV2ZXJ5IDUgTUIgb3IgNSBzZWMsIG9yIDMyayAvIDEgc2VjIGZvciBzdHJlYW1pbmcgb3IKICAgICAvLyBhZnRlciA0ayBhbmQgb24gYSBrZXlmcmFtZQotICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKLSAgICAgICAgY2x1c3Rlcl9zaXplID0gYXZpb190ZWxsKHMtPnBiKSAtIG1rdi0+Y2x1c3Rlcl9wb3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgY2x1c3Rlcl9zaXplID0gYXZpb190ZWxsKG1rdi0+ZHluX2JjKTsKLSAgICB9CisgICAgY2x1c3Rlcl9zaXplID0gYXZpb190ZWxsKG1rdi0+ZHluX2JjKTsKIAogICAgIGlmIChta3YtPmlzX2Rhc2ggJiYgY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgLy8gV2ViTSBEQVNIIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgdGhlIGZpcnN0IGJsb2NrIG9mIGV2ZXJ5IGNsdXN0ZXIKQEAgLTE5MjcsNiArMjQ2MCwxMSBAQAogICAgICAgICBta3Zfc3RhcnRfbmV3X2NsdXN0ZXIocywgcGt0KTsKICAgICB9CiAKKyAgICBpZiAoIW1rdi0+Y2x1c3Rlcl9wb3MpCisgICAgICAgIGF2aW9fd3JpdGVfbWFya2VyKHMtPnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3EocGt0LT5kdHMsIHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZnJhbWUgJiYgKG1rdi0+aGF2ZV92aWRlbyA/IGNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIDogMSkgPyBBVklPX0RBVEFfTUFSS0VSX1NZTkNfUE9JTlQgOiBBVklPX0RBVEFfTUFSS0VSX0JPVU5EQVJZX1BPSU5UKTsKKwogICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgYW4gYXVkaW8gcGFja2V0IGNhY2hlZAogICAgIGlmIChta3YtPmN1cl9hdWRpb19wa3Quc2l6ZSA+IDApIHsKICAgICAgICAgLy8gZm9yIERBU0ggYXVkaW8sIGEgQ3VlUG9pbnQgaGFzIHRvIGJlIGFkZGVkIHdoZW4gdGhlcmUgaXMgYSBuZXcgY2x1c3Rlci4KQEAgLTE5NTIsMjAgKzI0OTAsMTcgQEAKIHN0YXRpYyBpbnQgbWt2X3dyaXRlX2ZsdXNoX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgTWF0cm9za2FNdXhDb250ZXh0ICpta3YgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZJT0NvbnRleHQgKnBiOwotICAgIGlmIChzLT5wYi0+c2Vla2FibGUpCi0gICAgICAgIHBiID0gcy0+cGI7Ci0gICAgZWxzZQotICAgICAgICBwYiA9IG1rdi0+ZHluX2JjOworCiAgICAgaWYgKCFwa3QpIHsKICAgICAgICAgaWYgKG1rdi0+Y2x1c3Rlcl9wb3MgIT0gLTEpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgIkZsdXNoaW5nIGNsdXN0ZXIgYXQgb2Zmc2V0ICUiIFBSSXU2NCAiIGJ5dGVzXG4iLAotICAgICAgICAgICAgICAgICAgIGF2aW9fdGVsbChwYikpOwotICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBta3YtPmNsdXN0ZXIpOworICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyKHMtPnBiLCAmbWt2LT5keW5fYmMsIG1rdiwgbWt2LT5jbHVzdGVyKTsKICAgICAgICAgICAgIG1rdi0+Y2x1c3Rlcl9wb3MgPSAtMTsKLSAgICAgICAgICAgIGlmIChta3YtPmR5bl9iYykKLSAgICAgICAgICAgICAgICBta3ZfZmx1c2hfZHluYnVmKHMpOworICAgICAgICAgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKQorICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgICAgICJGbHVzaGluZyBjbHVzdGVyIGF0IG9mZnNldCAlIiBQUkl1NjQgIiBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZpb190ZWxsKHMtPnBiKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkZsdXNoaW5nIGNsdXN0ZXJcbiIpOwogICAgICAgICAgICAgYXZpb19mbHVzaChzLT5wYik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIDE7CkBAIC0xOTkyLDE5ICsyNTI3LDE1IEBACiAgICAgfQogCiAgICAgaWYgKG1rdi0+ZHluX2JjKSB7Ci0gICAgICAgIGVuZF9lYm1sX21hc3Rlcihta3YtPmR5bl9iYywgbWt2LT5jbHVzdGVyKTsKLSAgICAgICAgbWt2X2ZsdXNoX2R5bmJ1ZihzKTsKLSAgICB9IGVsc2UgaWYgKG1rdi0+Y2x1c3Rlcl9wb3MgIT0gLTEpIHsKLSAgICAgICAgZW5kX2VibWxfbWFzdGVyKHBiLCBta3YtPmNsdXN0ZXIpOworICAgICAgICBlbmRfZWJtbF9tYXN0ZXJfY3JjMzIocGIsICZta3YtPmR5bl9iYywgbWt2LCBta3YtPmNsdXN0ZXIpOwogICAgIH0KIAotICAgIGlmIChta3YtPm1vZGUgIT0gTU9ERV9XRUJNKSB7Ci0gICAgICAgIHJldCA9IG1rdl93cml0ZV9jaGFwdGVycyhzKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KKyAgICByZXQgPSBta3Zfd3JpdGVfY2hhcHRlcnMocyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICBpZiAocGItPnNlZWthYmxlKSB7CisKKyAgICBpZiAoKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJiAhbWt2LT5pc19saXZlKSB7CiAgICAgICAgIGlmIChta3YtPmN1ZXMtPm51bV9lbnRyaWVzKSB7CiAgICAgICAgICAgICBpZiAobWt2LT5yZXNlcnZlX2N1ZXNfc3BhY2UpIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1ZXNfZW5kOwpAQCAtMjA0MiwzMCArMjU3Myw0MyBAQAogICAgICAgICAvLyB1cGRhdGUgdGhlIGR1cmF0aW9uCiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJlbmQgZHVyYXRpb24gPSAlIiBQUkl1NjQgIlxuIiwgbWt2LT5kdXJhdGlvbik7CiAgICAgICAgIGN1cnJlbnRwb3MgPSBhdmlvX3RlbGwocGIpOwotICAgICAgICBhdmlvX3NlZWsocGIsIG1rdi0+ZHVyYXRpb25fb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgICAgIHB1dF9lYm1sX2Zsb2F0KHBiLCBNQVRST1NLQV9JRF9EVVJBVElPTiwgbWt2LT5kdXJhdGlvbik7CisgICAgICAgIGF2aW9fc2Vlayhta3YtPmluZm9fYmMsIG1rdi0+ZHVyYXRpb25fb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICAgIHB1dF9lYm1sX2Zsb2F0KG1rdi0+aW5mb19iYywgTUFUUk9TS0FfSURfRFVSQVRJT04sIG1rdi0+ZHVyYXRpb24pOworICAgICAgICBhdmlvX3NlZWsocGIsIG1rdi0+aW5mby5wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyKHBiLCAmbWt2LT5pbmZvX2JjLCBta3YsIG1rdi0+aW5mbyk7CisKKyAgICAgICAgLy8gd3JpdGUgdHJhY2tzIG1hc3RlcgorICAgICAgICBhdmlvX3NlZWsocGIsIG1rdi0+dHJhY2tzX21hc3Rlci5wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyKHBiLCAmbWt2LT50cmFja3NfYmMsIG1rdiwgbWt2LT50cmFja3NfbWFzdGVyKTsKIAogICAgICAgICAvLyB1cGRhdGUgc3RyZWFtIGR1cmF0aW9ucwotICAgICAgICBpZiAobWt2LT5zdHJlYW1fZHVyYXRpb25zKSB7CisgICAgICAgIGlmICghbWt2LT5pc19saXZlICYmIG1rdi0+c3RyZWFtX2R1cmF0aW9ucykgewogICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBpbnQ2NF90IGN1cnIgPSBhdmlvX3RlbGwobWt2LT50YWdzX2JjKTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyArK2kpIHsKICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIGRvdWJsZSBkdXJhdGlvbl9zZWMgPSBta3YtPnN0cmVhbV9kdXJhdGlvbnNbaV0gKiBhdl9xMmQoc3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgICAgICAgICAgY2hhciBkdXJhdGlvbl9zdHJpbmdbMjBdID0gIiI7CiAKLSAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAic3RyZWFtICVkIGVuZCBkdXJhdGlvbiA9ICUiIFBSSXU2NCAiXG4iLCBpLAotICAgICAgICAgICAgICAgICAgICAgICBta3YtPnN0cmVhbV9kdXJhdGlvbnNbaV0pOworICAgICAgICAgICAgICAgIGlmIChta3YtPnN0cmVhbV9kdXJhdGlvbl9vZmZzZXRzW2ldID4gMCkgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHVyYXRpb25fc2VjID0gbWt2LT5zdHJlYW1fZHVyYXRpb25zW2ldICogYXZfcTJkKHN0LT50aW1lX2Jhc2UpOworICAgICAgICAgICAgICAgICAgICBjaGFyIGR1cmF0aW9uX3N0cmluZ1syMF0gPSAiIjsKIAotICAgICAgICAgICAgICAgIGlmICghbWt2LT5pc19saXZlICYmIG1rdi0+c3RyZWFtX2R1cmF0aW9uX29mZnNldHNbaV0gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgbWt2LT5zdHJlYW1fZHVyYXRpb25fb2Zmc2V0c1tpXSwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAic3RyZWFtICVkIGVuZCBkdXJhdGlvbiA9ICUiIFBSSXU2NCAiXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWt2LT5zdHJlYW1fZHVyYXRpb25zW2ldKTsKKworICAgICAgICAgICAgICAgICAgICBhdmlvX3NlZWsobWt2LT50YWdzX2JjLCBta3YtPnN0cmVhbV9kdXJhdGlvbl9vZmZzZXRzW2ldLCBTRUVLX1NFVCk7CiAKICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoZHVyYXRpb25fc3RyaW5nLCAyMCwgIiUwMmQ6JTAyZDolMDEyLjlmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgZHVyYXRpb25fc2VjIC8gMzYwMCwgKChpbnQpIGR1cmF0aW9uX3NlYyAvIDYwKSAlIDYwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbW9kKGR1cmF0aW9uX3NlYywgNjApKTsKIAotICAgICAgICAgICAgICAgICAgICBwdXRfZWJtbF9iaW5hcnkocGIsIE1BVFJPU0tBX0lEX1RBR1NUUklORywgZHVyYXRpb25fc3RyaW5nLCAyMCk7CisgICAgICAgICAgICAgICAgICAgIHB1dF9lYm1sX2JpbmFyeShta3YtPnRhZ3NfYmMsIE1BVFJPU0tBX0lEX1RBR1NUUklORywgZHVyYXRpb25fc3RyaW5nLCAyMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZpb19zZWVrKG1rdi0+dGFnc19iYywgY3VyciwgU0VFS19TRVQpOworICAgICAgICB9CisgICAgICAgIGlmIChta3YtPnRhZ3MucG9zICYmICFta3YtPmlzX2xpdmUpIHsKKyAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgbWt2LT50YWdzLnBvcywgU0VFS19TRVQpOworICAgICAgICAgICAgZW5kX2VibWxfbWFzdGVyX2NyYzMyKHBiLCAmbWt2LT50YWdzX2JjLCBta3YsIG1rdi0+dGFncyk7CiAgICAgICAgIH0KIAogICAgICAgICBhdmlvX3NlZWsocGIsIGN1cnJlbnRwb3MsIFNFRUtfU0VUKTsKQEAgLTIxMDAsNiArMjY0NCwyNyBAQAogewogICAgIGludCBpOwogCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgPiBNQVhfVFJBQ0tTKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiQXQgbW9zdCAlZCBzdHJlYW1zIGFyZSBzdXBwb3J0ZWQgZm9yIG11eGluZyBpbiBNYXRyb3NrYVxuIiwKKyAgICAgICAgICAgICAgIE1BWF9UUkFDS1MpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BVFJBQzMgfHwKKyAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9DT09LIHx8CisgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFfMjg4IHx8CisgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU0lQUiB8fAorICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMTAgfHwKKyAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjIwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJUaGUgTWF0cm9za2EgbXV4ZXIgZG9lcyBub3QgeWV0IHN1cHBvcnQgbXV4aW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUocy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX2lkKSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAocy0+YXZvaWRfbmVnYXRpdmVfdHMgPCAwKSB7CiAgICAgICAgIHMtPmF2b2lkX25lZ2F0aXZlX3RzID0gMTsKICAgICAgICAgcy0+aW50ZXJuYWwtPmF2b2lkX25lZ2F0aXZlX3RzX3VzZV9wdHMgPSAxOwpAQCAtMjExOCw5ICsyNjgzLDEyIEBACiAgICAgaW50IHJldCA9IDE7CiAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CiAgICAgICAgIGlmIChwa3QtPnNpemUgPiAyICYmIChBVl9SQjE2KHBrdC0+ZGF0YSkgJiAweGZmZjApID09IDB4ZmZmMCkKICAgICAgICAgICAgIHJldCA9IGZmX3N0cmVhbV9hZGRfYml0c3RyZWFtX2ZpbHRlcihzdCwgImFhY19hZHRzdG9hc2MiLCBOVUxMKTsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA5KSB7CisgICAgICAgIHJldCA9IGZmX3N0cmVhbV9hZGRfYml0c3RyZWFtX2ZpbHRlcihzdCwgInZwOV9zdXBlcmZyYW1lIiwgTlVMTCk7CisgICAgfQogCiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTIxMzMsNiArMjcwMSw3IEBACiAgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsIDB4RkZGRkZGRkYgfSwKICAgICB7IEFWX0NPREVDX0lEX1BDTV9TMjRCRSwgMHhGRkZGRkZGRiB9LAogICAgIHsgQVZfQ09ERUNfSURfUENNX1MzMkJFLCAweEZGRkZGRkZGIH0sCisgICAgeyBBVl9DT0RFQ19JRF9RRE1DLCAgICAgIDB4RkZGRkZGRkYgfSwKICAgICB7IEFWX0NPREVDX0lEX1FETTIsICAgICAgMHhGRkZGRkZGRiB9LAogICAgIHsgQVZfQ09ERUNfSURfUkFfMTQ0LCAgICAweEZGRkZGRkZGIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9SQV8yODgsICAgIDB4RkZGRkZGRkYgfSwKQEAgLTIxNjYsNiArMjczNSw3IEBACiAgICAgeyAiZGFzaF90cmFja19udW1iZXIiLCAiVHJhY2sgbnVtYmVyIGZvciB0aGUgREFTSCBzdHJlYW0iLCBPRkZTRVQoZGFzaF90cmFja19udW1iZXIpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IDEgfSwgMCwgMTI3LCBGTEFHUyB9LAogICAgIHsgImxpdmUiLCAiV3JpdGUgZmlsZXMgYXNzdW1pbmcgaXQgaXMgYSBsaXZlIHN0cmVhbS4iLCBPRkZTRVQoaXNfbGl2ZSksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDAgfSwgMCwgMSwgRkxBR1MgfSwKICAgICB7ICJhbGxvd19yYXdfdmZ3IiwgImFsbG93IFJBVyBWRlcgbW9kZSIsIE9GRlNFVChhbGxvd19yYXdfdmZ3KSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAwLCAxLCBGTEFHUyB9LAorICAgIHsgIndyaXRlX2NyYzMyIiwgIndyaXRlIGEgQ1JDMzIgZWxlbWVudCBpbnNpZGUgZXZlcnkgTGV2ZWwgMSBlbGVtZW50IiwgT0ZGU0VUKHdyaXRlX2NyYyksIEFWX09QVF9UWVBFX0JPT0wsIHsgLmk2NCA9IDEgfSwgMCwgMSwgRkxBR1MgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21kNWVuYy5jIGIvbGliYXZmb3JtYXQvbWQ1ZW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MzNiZTQuLjAwMDAwMDAKLS0tIGEvbGliYXZmb3JtYXQvbWQ1ZW5jLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoKLSAqIE1ENSBlbmNvZGVyIChmb3IgY29kZWMvZm9ybWF0IHRlc3RpbmcpCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDkgUmVpbWFyIETDtmZmaW5nZXIsIGJhc2VkIG9uIGNyY2VuYyAoYykgMjAwMiBGYWJyaWNlIEJlbGxhcmQKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9oYXNoLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImF2Zm9ybWF0LmgiCi0jaW5jbHVkZSAiaW50ZXJuYWwuaCIKLQotc3RydWN0IE1ENUNvbnRleHQgewotICAgIGNvbnN0IEFWQ2xhc3MgKmF2Y2xhc3M7Ci0gICAgc3RydWN0IEFWSGFzaENvbnRleHQgKmhhc2g7Ci0gICAgY2hhciAqaGFzaF9uYW1lOwotICAgIGludCBmb3JtYXRfdmVyc2lvbjsKLX07Ci0KLXN0YXRpYyB2b2lkIG1kNV9maW5pc2goc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgY2hhciAqYnVmKQotewotICAgIHN0cnVjdCBNRDVDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwotICAgIHVpbnQ4X3QgbWQ1W0FWX0hBU0hfTUFYX1NJWkVdOwotICAgIGludCBpLCBvZmZzZXQgPSBzdHJsZW4oYnVmKTsKLSAgICBpbnQgbGVuID0gYXZfaGFzaF9nZXRfc2l6ZShjLT5oYXNoKTsKLSAgICBhdl9hc3NlcnQwKGxlbiA+IDAgJiYgbGVuIDw9IHNpemVvZihtZDUpKTsKLSAgICBhdl9oYXNoX2ZpbmFsKGMtPmhhc2gsIG1kNSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZiArIG9mZnNldCwgMywgIiUwMiJQUkl4OCwgbWQ1W2ldKTsKLSAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgfQotICAgIGJ1ZltvZmZzZXRdID0gJ1xuJzsKLSAgICBidWZbb2Zmc2V0KzFdID0gMDsKLQotICAgIGF2aW9fd3JpdGUocy0+cGIsIGJ1Ziwgc3RybGVuKGJ1ZikpOwotICAgIGF2aW9fZmx1c2gocy0+cGIpOwotfQotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihzdHJ1Y3QgTUQ1Q29udGV4dCwgeCkKLSNkZWZpbmUgRU5DIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gaGFzaF9vcHRpb25zW10gPSB7Ci0gICAgeyAiaGFzaCIsICJzZXQgaGFzaCB0byB1c2UiLCBPRkZTRVQoaGFzaF9uYW1lKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJtZDUifSwgMCwgMCwgRU5DIH0sCi0gICAgeyAiZm9ybWF0X3ZlcnNpb24iLCAiZmlsZSBmb3JtYXQgdmVyc2lvbiIsIE9GRlNFVChmb3JtYXRfdmVyc2lvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAxfSwgMSwgMSwgRU5DIH0sCi0gICAgeyBOVUxMIH0sCi19OwotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyBtZDVlbmNfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiaGFzaCBlbmNvZGVyIGNsYXNzIiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gaGFzaF9vcHRpb25zLAotICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAotfTsKLQotI2lmIENPTkZJR19NRDVfTVVYRVIKLXN0YXRpYyBpbnQgd3JpdGVfaGVhZGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7Ci0gICAgaW50IHJlcyA9IGF2X2hhc2hfYWxsb2MoJmMtPmhhc2gsIGMtPmhhc2hfbmFtZSk7Ci0gICAgaWYgKHJlcyA8IDApCi0gICAgICAgIHJldHVybiByZXM7Ci0gICAgYXZfaGFzaF9pbml0KGMtPmhhc2gpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdyaXRlX3BhY2tldChzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQotewotICAgIHN0cnVjdCBNRDVDb250ZXh0ICpjID0gcy0+cHJpdl9kYXRhOwotICAgIGF2X2hhc2hfdXBkYXRlKGMtPmhhc2gsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB3cml0ZV90cmFpbGVyKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBhdl9zdHJsY3B5KGJ1ZiwgYXZfaGFzaF9nZXRfbmFtZShjLT5oYXNoKSwgc2l6ZW9mKGJ1ZikgLSAyMDApOwotICAgIGF2X3N0cmxjYXQoYnVmLCAiPSIsIHNpemVvZihidWYpIC0gMjAwKTsKLQotICAgIG1kNV9maW5pc2gocywgYnVmKTsKLQotICAgIGF2X2hhc2hfZnJlZXAoJmMtPmhhc2gpOwotICAgIHJldHVybiAwOwotfQotCi1BVk91dHB1dEZvcm1hdCBmZl9tZDVfbXV4ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgICAgID0gIm1kNSIsCi0gICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk1ENSB0ZXN0aW5nIiksCi0gICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKHN0cnVjdCBNRDVDb250ZXh0KSwKLSAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCi0gICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCi0gICAgLndyaXRlX2hlYWRlciAgICAgID0gd3JpdGVfaGVhZGVyLAotICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHdyaXRlX3BhY2tldCwKLSAgICAud3JpdGVfdHJhaWxlciAgICAgPSB3cml0ZV90cmFpbGVyLAotICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX1ZBUklBQkxFX0ZQUyB8IEFWRk1UX1RTX05PTlNUUklDVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgQVZGTVRfVFNfTkVHQVRJVkUsCi0gICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1kNWVuY19jbGFzcywKLX07Ci0jZW5kaWYKLQotI2lmIENPTkZJR19GUkFNRU1ENV9NVVhFUgotc3RhdGljIGludCBmcmFtZW1kNV93cml0ZV9oZWFkZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKLXsKLSAgICBzdHJ1Y3QgTUQ1Q29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKLSAgICBpbnQgcmVzID0gYXZfaGFzaF9hbGxvYygmYy0+aGFzaCwgYy0+aGFzaF9uYW1lKTsKLSAgICBpZiAocmVzIDwgMCkKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNmb3JtYXQ6IGZyYW1lIGNoZWNrc3Vtc1xuIik7Ci0gICAgYXZpb19wcmludGYocy0+cGIsICIjdmVyc2lvbjogJWRcbiIsIGMtPmZvcm1hdF92ZXJzaW9uKTsKLSAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNoYXNoOiAlc1xuIiwgYXZfaGFzaF9nZXRfbmFtZShjLT5oYXNoKSk7Ci0gICAgZmZfZnJhbWVoYXNoX3dyaXRlX2hlYWRlcihzKTsKLSAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaFxuIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZnJhbWVtZDVfd3JpdGVfcGFja2V0KHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCi17Ci0gICAgc3RydWN0IE1ENUNvbnRleHQgKmMgPSBzLT5wcml2X2RhdGE7Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBhdl9oYXNoX2luaXQoYy0+aGFzaCk7Ci0gICAgYXZfaGFzaF91cGRhdGUoYy0+aGFzaCwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOwotCi0gICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDY0LCAiJWQsICUxMCJQUklkNjQiLCAlMTAiUFJJZDY0IiwgJTgiUFJJZDY0IiwgJThkLCAiLAotICAgICAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4LCBwa3QtPmR0cywgcGt0LT5wdHMsIHBrdC0+ZHVyYXRpb24sIHBrdC0+c2l6ZSk7Ci0gICAgbWQ1X2ZpbmlzaChzLCBidWYpOwotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGZyYW1lbWQ1X3dyaXRlX3RyYWlsZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKLXsKLSAgICBzdHJ1Y3QgTUQ1Q29udGV4dCAqYyA9IHMtPnByaXZfZGF0YTsKLSAgICBhdl9oYXNoX2ZyZWVwKCZjLT5oYXNoKTsKLSAgICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGNvbnN0IEFWQ2xhc3MgZnJhbWVtZDVfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiZnJhbWUgaGFzaCBlbmNvZGVyIGNsYXNzIiwKLSAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAotICAgIC5vcHRpb24gICAgID0gaGFzaF9vcHRpb25zLAotICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAotfTsKLQotQVZPdXRwdXRGb3JtYXQgZmZfZnJhbWVtZDVfbXV4ZXIgPSB7Ci0gICAgLm5hbWUgICAgICAgICAgICAgID0gImZyYW1lbWQ1IiwKLSAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiUGVyLWZyYW1lIE1ENSB0ZXN0aW5nIiksCi0gICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKHN0cnVjdCBNRDVDb250ZXh0KSwKLSAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUsCi0gICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU8sCi0gICAgLndyaXRlX2hlYWRlciAgICAgID0gZnJhbWVtZDVfd3JpdGVfaGVhZGVyLAotICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZyYW1lbWQ1X3dyaXRlX3BhY2tldCwKLSAgICAud3JpdGVfdHJhaWxlciAgICAgPSBmcmFtZW1kNV93cml0ZV90cmFpbGVyLAotICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX1ZBUklBQkxFX0ZQUyB8IEFWRk1UX1RTX05PTlNUUklDVCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgQVZGTVRfVFNfTkVHQVRJVkUsCi0gICAgLnByaXZfY2xhc3MgICAgICAgID0gJmZyYW1lbWQ1X2NsYXNzLAotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbWQ1cHJvdG8uYyBiL2xpYmF2Zm9ybWF0L21kNXByb3RvLmMKaW5kZXggOWEwOTJlNC4uMGUwNGI5MCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbWQ1cHJvdG8uYworKysgYi9saWJhdmZvcm1hdC9tZDVwcm90by5jCkBAIC03MSw3ICs3MSw3IEBACiAgICAgaWYgKCpmaWxlbmFtZSkgewogICAgICAgICBlcnIgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmb3V0LCBmaWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcm90b2NvbF93aGl0ZWxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaCk7CiAgICAgICAgIGlmIChlcnIpCiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICBlcnIgPSBmZnVybF93cml0ZShvdXQsIGJ1ZiwgaSoyKzEpOwpAQCAtODcsNyArODcsNyBAQAogfQogCiAKLVVSTFByb3RvY29sIGZmX21kNV9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX21kNV9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJtZDUiLAogICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gbWQ1X29wZW4sCiAgICAgLnVybF93cml0ZSAgICAgICAgICAgPSBtZDVfd3JpdGUsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tZ3N0cy5jIGIvbGliYXZmb3JtYXQvbWdzdHMuYwppbmRleCA4Y2JjOTUyLi4wNzIwZGU4IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tZ3N0cy5jCisrKyBiL2xpYmF2Zm9ybWF0L21nc3RzLmMKQEAgLTU1LDEzICs1NSwxMyBAQAogICAgIHN0LT5uYl9mcmFtZXMgID0KICAgICBzdC0+ZHVyYXRpb24gICA9IGF2aW9fcmIzMihwYik7CiAgICAgZnBzID0gYXZfZDJxKGF2X2ludDJmbG9hdChhdmlvX3JiMzIocGIpKSwgSU5UX01BWCk7Ci0gICAgc3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JiMzIocGIpOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gYXZpb19yYjMyKHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPndpZHRoICA9IGF2aW9fcmIzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBhdmlvX3JiMzIocGIpOwogICAgIGF2aW9fc2tpcChwYiwgMTIpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBhdmlvX3JiMzIocGIpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSBhdmlvX3JiMzIocGIpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcpOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBmcHMuZGVuLCBmcHMubnVtKTsKICAgICBhdmlvX3NraXAocGIsIDIwKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbWljcm9kdmRkZWMuYyBiL2xpYmF2Zm9ybWF0L21pY3JvZHZkZGVjLmMKaW5kZXggNzI3ZmY5NC4uYzJmMWFjNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbWljcm9kdmRkZWMuYworKysgYi9saWJhdmZvcm1hdC9taWNyb2R2ZGRlYy5jCkBAIC0xMTQsMTEgKzExNCwxMSBAQAogICAgICAgICAgICAgICAgIGhhc19yZWFsX2ZwcyA9IDE7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhICYmIHNzY2FuZihsaW5lLCAie0RFRkFVTFR9e30lYyIsICZjKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgPSBhdl9zdHJkdXAobGluZSArIDExKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSAmJiBzc2NhbmYobGluZSwgIntERUZBVUxUfXt9JWMiLCAmYykgPT0gMSkgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhID0gYXZfc3RyZHVwKGxpbmUgKyAxMSk7CisgICAgICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gc3RybGVuKHN0LT5jb2RlYy0+ZXh0cmFkYXRhKSArIDE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IHN0cmxlbihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgKyAxOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNTAsOCArMTUwLDggQEAKICAgICAgICAgcHRzX2luZm8gPSBtaWNyb2R2ZC0+ZnJhbWVfcmF0ZTsKICAgICB9CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHB0c19pbmZvLmRlbiwgcHRzX2luZm8ubnVtKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTUlDUk9EVkQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01JQ1JPRFZEOwogICAgIHJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9taWNyb2R2ZGVuYy5jIGIvbGliYXZmb3JtYXQvbWljcm9kdmRlbmMuYwppbmRleCA0ZDg0Mzg0Li4wNGY0NzViIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9taWNyb2R2ZGVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L21pY3JvZHZkZW5jLmMKQEAgLTI1LDIxICsyNSwyMSBAQAogCiBzdGF0aWMgaW50IG1pY3JvZHZkX3dyaXRlX2hlYWRlcihzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOwotICAgIEFWUmF0aW9uYWwgdGIgPSBhdmN0eC0+dGltZV9iYXNlOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKKyAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZSA9IHMtPnN0cmVhbXNbMF0tPmF2Z19mcmFtZV9yYXRlOwogCi0gICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSB8fCBhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTUlDUk9EVkQpIHsKKyAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxIHx8IHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTUlDUk9EVkQpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkV4YWN0bHkgb25lIE1pY3JvRFZEIHN0cmVhbSBpcyBuZWVkZWQuXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhICYmIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA+IDApIHsKKyAgICBpZiAocGFyLT5leHRyYWRhdGEgJiYgcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDApIHsKICAgICAgICAgYXZpb193cml0ZShzLT5wYiwgIntERUZBVUxUfXt9IiwgMTEpOwotICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBhdmN0eC0+ZXh0cmFkYXRhLCBhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAgICAgICAgIGF2aW9fZmx1c2gocy0+cGIpOwogICAgIH0KIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1swXSwgNjQsIHRiLm51bSwgdGIuZGVuKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDY0LCBmcmFtZXJhdGUubnVtLCBmcmFtZXJhdGUuZGVuKTsKICAgICByZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbWoya2RlYy5jIGIvbGliYXZmb3JtYXQvbWoya2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYjk0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9tajJrZGVjLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIE1KUEVHIDIwMDAgRGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDE2IFN0w6VsZSBLcmlzdG9mZmVyc2VuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJyYXdkZWMuaCIKKworI2lmIENPTkZJR19NSlBFR18yMDAwX0RFTVVYRVIKK3N0YXRpYyBpbnQgbWpwZWcyMDAwX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNvbnN0IHVpbnQ4X3QgKmIgPSBwLT5idWY7CisgICAgaW50IGksIG1hcmtlciwgbWFya2VyX3NpemU7CisgICAgaW50IGZyYW1lcyA9IDAsIGludmFsaWQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IHAtPmJ1Zl9zaXplIC0gNTsgaSsrKSB7CisgICAgICAgIGlmIChBVl9SQjMyKGIpID09IDB4ZmY0ZmZmNTEpeworICAgICAgICAgICAgbWFya2VyX3NpemUgPSBBVl9SQjE2KGIrNCk7CisgICAgICAgICAgICBpZiAobWFya2VyX3NpemUgKyBpIDwgcC0+YnVmX3NpemUgLSA0KSB7CisgICAgICAgICAgICAgICAgbWFya2VyID0gQVZfUkI4KGIrNCttYXJrZXJfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKG1hcmtlciA9PSAweGZmKQorICAgICAgICAgICAgICAgICAgICBmcmFtZXMrKzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGludmFsaWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiICs9IDE7CisgICAgfQorICAgIGlmIChpbnZhbGlkKjQgKyAxIDwgZnJhbWVzKSB7CisgICAgICAgIGlmIChpbnZhbGlkID09IDAgJiYgZnJhbWVzID4gMikKKyAgICAgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDI7CisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDQ7CisgICAgfQorICAgIHJldHVybiAwOworfQorRkZfREVGX1JBV1ZJREVPX0RFTVVYRVIyKG1qcGVnXzIwMDAsICJyYXcgTUpQRUcgMjAwMCB2aWRlbyIsIG1qcGVnMjAwMF9wcm9iZSwgImoyayIsIEFWX0NPREVDX0lEX0pQRUcyMDAwLCBBVkZNVF9HRU5FUklDX0lOREVYfEFWRk1UX05PVElNRVNUQU1QUykKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbWx2ZGVjLmMgYi9saWJhdmZvcm1hdC9tbHZkZWMuYwppbmRleCAyODhiMmExLi5kZWQ4MTk2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tbHZkZWMuYworKysgYi9saWJhdmZvcm1hdC9tbHZkZWMuYwpAQCAtNzcsNyArNzcsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCByZWFkX3N0cmluZyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVklPQ29udGV4dCAqcGIsIGNvbnN0IGNoYXIgKnRhZywgaW50IHNpemUpCitzdGF0aWMgdm9pZCByZWFkX3N0cmluZyhBVkZvcm1hdENvbnRleHQgKmF2Y3R4LCBBVklPQ29udGV4dCAqcGIsIGNvbnN0IGNoYXIgKnRhZywgdW5zaWduZWQgc2l6ZSkKIHsKICAgICBjaGFyICogdmFsdWUgPSBhdl9tYWxsb2Moc2l6ZSArIDEpOwogICAgIGlmICghdmFsdWUpIHsKQEAgLTEzMCwzMiArMTMwLDMyIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgc2l6ZSAtPSAxNjsKICAgICAgICAgaWYgKHZzdCAmJiB0eXBlID09IE1LVEFHKCdSJywnQScsJ1cnLCdJJykgJiYgc2l6ZSA+PSAxNjQpIHsKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPndpZHRoICA9IGF2aW9fcmwxNihwYik7Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JsMTYocGIpOwotICAgICAgICAgICAgcmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZSh2c3QtPmNvZGVjLT53aWR0aCwgdnN0LT5jb2RlYy0+aGVpZ2h0LCAwLCBhdmN0eCk7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT53aWR0aCAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUodnN0LT5jb2RlY3Bhci0+d2lkdGgsIHZzdC0+Y29kZWNwYXItPmhlaWdodCwgMCwgYXZjdHgpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIGlmIChhdmlvX3JsMzIocGIpICE9IDEpCiAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAicmF3IGFwaSB2ZXJzaW9uIik7CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDIwKTsgLy8gcG9pbnRlciwgd2lkdGgsIGhlaWdodCwgcGl0Y2gsIGZyYW1lX3NpemUKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmwzMihwYik7Ci0gICAgICAgICAgICBpZiAodnN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDwgMCB8fAotICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA+IChJTlRfTUFYIC0gNykgLyAodnN0LT5jb2RlYy0+d2lkdGggKiB2c3QtPmNvZGVjLT5oZWlnaHQpKSB7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgaWYgKHZzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA8IDAgfHwKKyAgICAgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPiAoSU5UX01BWCAtIDcpIC8gKHZzdC0+Y29kZWNwYXItPndpZHRoICogdnN0LT5jb2RlY3Bhci0+aGVpZ2h0KSkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBiaXRzX3Blcl9jb2RlZF9zYW1wbGUgJWQgKHNpemU6ICVkeCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdnN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT53aWR0aCwgdnN0LT5jb2RlYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT53aWR0aCwgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgOCArIDE2ICsgMjQpOyAvLyBibGFja19sZXZlbCwgd2hpdGVfbGV2ZWwsIHh5d2gsIGFjdGl2ZV9hcmVhLCBleHBvc3VyZV9iaWFzCiAgICAgICAgICAgICBpZiAoYXZpb19ybDMyKHBiKSAhPSAweDIwMTAxMDApIC8qIFJHR0IgKi8KICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJjZmFfcGF0dGVybiIpOwogICAgICAgICAgICAgYXZpb19za2lwKHBiLCA4MCk7IC8vIGNhbGlicmF0aW9uX2lsbHVtaW5hbnQxLCBjb2xvcl9tYXRyaXgxLCBkeW5hbWljX3JhbmdlCi0gICAgICAgICAgICB2c3QtPmNvZGVjLT5waXhfZm10ICA9IEFWX1BJWF9GTVRfQkFZRVJfUkdHQjE2TEU7Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgPSBNS1RBRygnQicsICdJJywgJ1QnLCAxNik7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5mb3JtYXQgICAgPSBBVl9QSVhfRk1UX0JBWUVSX1JHR0IxNkxFOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gTUtUQUcoJ0InLCAnSScsICdUJywgMTYpOwogICAgICAgICAgICAgc2l6ZSAtPSAxNjQ7CiAgICAgICAgIH0gZWxzZSBpZiAoYXN0ICYmIHR5cGUgPT0gTUtUQUcoJ1cnLCAnQScsICdWJywgJ0knKSAmJiBzaXplID49IDE2KSB7Ci0gICAgICAgICAgICByZXQgPSBmZl9nZXRfd2F2X2hlYWRlcihhdmN0eCwgcGIsIGFzdC0+Y29kZWMsIDE2LCAwKTsKKyAgICAgICAgICAgIHJldCA9IGZmX2dldF93YXZfaGVhZGVyKGF2Y3R4LCBwYiwgYXN0LT5jb2RlY3BhciwgMTYsIDApOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIHNpemUgLT0gMTY7CkBAIC0yNDIsNyArMjQyLDggQEAKICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1LVEFHKCdOJywnVScsJ0wnLCdMJykpIHsKICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1LVEFHKCdNJywnTCcsJ1YnLCdJJykpIHsgLyogb2NjdXJzIHdoZW4gTUxWIGFuZCBNbm4gZmlsZXMgYXJlIGNvbmNhdGVuYXRlZCAqLwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgInVuc3VwcG9ydGVkIHRhZyAlYyVjJWMlYywgc2l6ZSAldVxuIiwgdHlwZSYweEZGLCAodHlwZT4+OCkmMHhGRiwgKHR5cGU+PjE2KSYweEZGLCAodHlwZT4+MjQpJjB4RkYsIHNpemUpOworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfSU5GTywgInVuc3VwcG9ydGVkIHRhZyAlcywgc2l6ZSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKHR5cGUpLCBzaXplKTsKICAgICAgICAgfQogICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOwogICAgIH0KQEAgLTI4NiwyMyArMjg3LDIzIEBACiAgICAgICAgIHZzdC0+bmJfZnJhbWVzID0gbmJfdmlkZW9fZnJhbWVzOwogICAgICAgICBpZiAoKG1sdi0+Y2xhc3NbMF0gJiAoTUxWX0NMQVNTX0ZMQUdfREVMVEF8TUxWX0NMQVNTX0ZMQUdfTFpNQSkpKQogICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiY29tcHJlc3Npb24iKTsKLSAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKICAgICAgICAgc3dpdGNoIChtbHYtPmNsYXNzWzBdICYgfihNTFZfQ0xBU1NfRkxBR19ERUxUQXxNTFZfQ0xBU1NfRkxBR19MWk1BKSkgewogICAgICAgICBjYXNlIE1MVl9WSURFT19DTEFTU19SQVc6Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1MVl9WSURFT19DTEFTU19ZVVY6Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5waXhfZm10ICA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1MVl9WSURFT19DTEFTU19KUEVHOgotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NSlBFRzsKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01KUEVHOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1MVl9WSURFT19DTEFTU19IMjY0OgotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IMjY0OwotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSDI2NDsKKyAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInVua25vd24gdmlkZW8gY2xhc3MiKTsKQEAgLTMyMCw4ICszMjEsOCBAQAogICAgICAgICBpZiAoKG1sdi0+Y2xhc3NbMV0gJiB+TUxWX0NMQVNTX0ZMQUdfTFpNQSkgIT0gTUxWX0FVRElPX0NMQVNTX1dBVikKICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgInVua25vd24gYXVkaW8gY2xhc3MiKTsKIAotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzMsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDMzLCAxLCBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgfQogCiAgICAgaWYgKHZzdCkgewpAQCAtMzQxLDkgKzM0Miw5IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICAvKiBzY2FuIHNlY29uZGFyeSBmaWxlcyAqLwotICAgIGlmIChzdHJsZW4oYXZjdHgtPmZpbGVuYW1lKSA+IDIpIHsKKyAgICBpZiAoc3RybGVuKGF2Y3R4LT51cmwpID4gMikgewogICAgICAgICBpbnQgaTsKLSAgICAgICAgY2hhciAqZmlsZW5hbWUgPSBhdl9zdHJkdXAoYXZjdHgtPmZpbGVuYW1lKTsKKyAgICAgICAgY2hhciAqZmlsZW5hbWUgPSBhdl9zdHJkdXAoYXZjdHgtPnVybCk7CiAKICAgICAgICAgaWYgKCFmaWxlbmFtZSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC00MTMsMTUgKzQxNCwxNSBAQAogICAgIGlmIChzaXplIDwgMTYpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGF2aW9fc2tpcChwYiwgMTIpOyAvL3RpbWVzdGFtcCwgZnJhbWVOdW1iZXIKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKICAgICAgICAgYXZpb19za2lwKHBiLCA4KTsgLy8gY3JvcFBvc1gsIGNyb3BQb3NZLCBwYW5Qb3NYLCBwYW5Qb3NZCiAgICAgc3BhY2UgPSBhdmlvX3JsMzIocGIpOwogICAgIGF2aW9fc2tpcChwYiwgc3BhY2UpOwogCiAgICAgaWYgKChtbHYtPmNsYXNzW3N0LT5pZF0gJiAoTUxWX0NMQVNTX0ZMQUdfREVMVEF8TUxWX0NMQVNTX0ZMQUdfTFpNQSkpKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOwotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIChzdC0+Y29kZWMtPndpZHRoICogc3QtPmNvZGVjLT5oZWlnaHQgKiBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSArIDcpID4+IDMpOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIChzdC0+Y29kZWNwYXItPndpZHRoICogc3QtPmNvZGVjcGFyLT5oZWlnaHQgKiBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSArIDcpID4+IDMpOwogICAgIH0gZWxzZSB7IC8vIEFWTUVESUFfVFlQRV9BVURJTwogICAgICAgICBpZiAoc3BhY2UgPiBVSU5UX01BWCAtIDI0IHx8IHNpemUgPCAoMjQgKyBzcGFjZSkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTQ0OSw3ICs0NTAsNyBAQAogICAgIGlmICgoZmxhZ3MgJiBBVlNFRUtfRkxBR19GUkFNRSkgfHwgKGZsYWdzICYgQVZTRUVLX0ZMQUdfQllURSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAKLSAgICBpZiAoIWF2Y3R4LT5wYi0+c2Vla2FibGUpCisgICAgaWYgKCEoYXZjdHgtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAogICAgIG1sdi0+cHRzID0gdGltZXN0YW1wOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbW0uYyBiL2xpYmF2Zm9ybWF0L21tLmMKaW5kZXggODFhZTFhNS4uOGExMzgyZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbW0uYworKysgYi9saWJhdmZvcm1hdC9tbS5jCkBAIC0xMDksMTEgKzEwOSwxMSBAQAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTU1WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KLSAgICBzdC0+Y29kZWMtPndpZHRoID0gd2lkdGg7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NTVZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggPSB3aWR0aDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IGhlaWdodDsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgZnJhbWVfcmF0ZSk7CiAKICAgICAvKiBhdWRpbyBzdHJlYW0gKi8KQEAgLTEyMSwxMiArMTIxLDEyIEBACiAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAvKiBubyBmb3VyY2MgKi8KLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAvKiBubyBmb3VyY2MgKi8KKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCA4MDAwKTsgLyogODAwMCBoeiAqLwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbW1mLmMgYi9saWJhdmZvcm1hdC9tbWYuYwppbmRleCBjMmFjZWM5Li4xMzkzNjI3IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tbWYuYworKysgYi9saWJhdmZvcm1hdC9tbWYuYwpAQCAtNzMsMTQgKzczLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICJWTjpMYXZmLCIgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAiVk46IkxJQkFWRk9STUFUX0lERU5UIiwiOwogCi0gICAgcmF0ZSA9IG1tZl9yYXRlX2NvZGUocy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICByYXRlID0gbW1mX3JhdGVfY29kZShzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIGlmIChyYXRlIDwgMCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJWQsIHN1cHBvcnRlZCBhcmUgNDAwMCwgODAwMCwgMTEwMjUsIDIyMDUwIGFuZCA0NDEwMFxuIiwKLSAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIG1tZi0+c3RlcmVvID0gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNoYW5uZWxzID4gMTsKKyAgICBtbWYtPnN0ZXJlbyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jaGFubmVscyA+IDE7CiAgICAgaWYgKG1tZi0+c3RlcmVvICYmCiAgICAgICAgIHMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJZYW1haGEgU01BRiBzdGVyZW8gaXMgZXhwZXJpbWVudGFsLCAiCkBAIC0xMjEsNyArMTIxLDcgQEAKIAogICAgIG1tZi0+YXdhcG9zID0gZmZfc3RhcnRfdGFnKHBiLCAiQXdhXHgwMSIpOwogCi0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zWzBdLCA2NCwgMSwgcy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDY0LCAxLCBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgYXZpb19mbHVzaChwYik7CiAKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgIGludDY0X3QgcG9zLCBzaXplOwogICAgIGludCBnYXRldGltZTsKIAotICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICBpZiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgLyogRmlsbCBpbiBsZW5ndGggZmllbGRzICovCiAgICAgICAgIGVuZF90YWdfYmUocGIsIG1tZi0+YXdhcG9zKTsKICAgICAgICAgZW5kX3RhZ19iZShwYiwgbW1mLT5hdHJwb3MpOwpAQCAtMTYyLDcgKzE2Miw3IEBACiAgICAgICAgIC8qICJwbGF5IHdhdiIgKi8KICAgICAgICAgYXZpb193OChwYiwgMCk7IC8qIHN0YXJ0IHRpbWUgKi8KICAgICAgICAgYXZpb193OChwYiwgKG1tZi0+c3RlcmVvIDw8IDYpIHwgMSk7IC8qIChjaGFubmVsIDw8IDYpIHwgd2F2ZW51bSAqLwotICAgICAgICBnYXRldGltZSA9IHNpemUgKiA1MDAgLyBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgIGdhdGV0aW1lID0gc2l6ZSAqIDUwMCAvIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgcHV0X3Zhcmxlbmd0aChwYiwgZ2F0ZXRpbWUpOyAvKiBkdXJhdGlvbiAqLwogCiAgICAgICAgIC8qICJub3AiICovCkBAIC0yNjIsMTYgKzI2MiwxNiBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX0FEUENNX1lBTUFIQTsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICAgICAgICA9IHJhdGU7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgICAgICAgPSAocGFyYW1zID4+IDcpICsgMTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ICAgICAgICA9IHBhcmFtcyA+PiA3ID8gQVZfQ0hfTEFZT1VUX1NURVJFTyA6IEFWX0NIX0xBWU9VVF9NT05POwotICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gNDsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICAgICAgICA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9ZQU1BSEE7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSByYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gKHBhcmFtcyA+PiA3KSArIDE7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCAgICAgICAgPSBwYXJhbXMgPj4gNyA/IEFWX0NIX0xBWU9VVF9TVEVSRU8gOiBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDQ7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICAgICAgICAgICAgPSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwogCi0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbW1zLmMgYi9saWJhdmZvcm1hdC9tbXMuYwppbmRleCA4MDdhYWRlLi43NjhmZGE2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tbXMuYworKysgYi9saWJhdmZvcm1hdC9tbXMuYwpAQCAtOTQsMjQgKzk0LDI2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAocCwgZmZfYXNmX3N0cmVhbV9oZWFkZXIsIHNpemVvZihmZl9hc2ZfZ3VpZCkpKSB7Ci0gICAgICAgICAgICBmbGFncyAgICAgPSBBVl9STDE2KHAgKyBzaXplb2YoZmZfYXNmX2d1aWQpKjMgKyAyNCk7Ci0gICAgICAgICAgICBzdHJlYW1faWQgPSBmbGFncyAmIDB4N0Y7Ci0gICAgICAgICAgICAvL1RoZSBzZWNvbmQgY29uZGl0aW9uIGlzIGZvciBjaGVja2luZyBDU19QS1RfU1RSRUFNX0lEX1JFUVVFU1QgcGFja2V0IHNpemUsCi0gICAgICAgICAgICAvL3dlIGNhbiBjYWxjdWF0ZSB0aGUgcGFja2V0IHNpemUgYnkgc3RyZWFtX251bS4KLSAgICAgICAgICAgIC8vUGxlYXNlIHNlZSBmdW5jdGlvbiBzZW5kX3N0cmVhbV9zZWxlY3Rpb25fcmVxdWVzdCgpLgotICAgICAgICAgICAgaWYgKG1tcy0+c3RyZWFtX251bSA8IE1NU19NQVhfU1RSRUFNUyAmJgotICAgICAgICAgICAgICAgICAgICA0NiArIG1tcy0+c3RyZWFtX251bSAqIDYgPCBzaXplb2YobW1zLT5vdXRfYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIG1tcy0+c3RyZWFtcyA9IGF2X2Zhc3RfcmVhbGxvYyhtbXMtPnN0cmVhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtbXMtPm5iX3N0cmVhbXNfYWxsb2NhdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW1zLT5zdHJlYW1fbnVtICsgMSkgKiBzaXplb2YoTU1TU3RyZWFtKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtbXMtPnN0cmVhbXMpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgbW1zLT5zdHJlYW1zW21tcy0+c3RyZWFtX251bV0uaWQgPSBzdHJlYW1faWQ7Ci0gICAgICAgICAgICAgICAgbW1zLT5zdHJlYW1fbnVtKys7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJDb3JydXB0IHN0cmVhbSAodG9vIG1hbnkgQS9WIHN0cmVhbXMpXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGlmIChlbmQgLSBwID49IChzaXplb2YoZmZfYXNmX2d1aWQpICogMyArIDI2KSkgeworICAgICAgICAgICAgICAgIGZsYWdzICAgICA9IEFWX1JMMTYocCArIHNpemVvZihmZl9hc2ZfZ3VpZCkqMyArIDI0KTsKKyAgICAgICAgICAgICAgICBzdHJlYW1faWQgPSBmbGFncyAmIDB4N0Y7CisgICAgICAgICAgICAgICAgLy9UaGUgc2Vjb25kIGNvbmRpdGlvbiBpcyBmb3IgY2hlY2tpbmcgQ1NfUEtUX1NUUkVBTV9JRF9SRVFVRVNUIHBhY2tldCBzaXplLAorICAgICAgICAgICAgICAgIC8vd2UgY2FuIGNhbGN1bGF0ZSB0aGUgcGFja2V0IHNpemUgYnkgc3RyZWFtX251bS4KKyAgICAgICAgICAgICAgICAvL1BsZWFzZSBzZWUgZnVuY3Rpb24gc2VuZF9zdHJlYW1fc2VsZWN0aW9uX3JlcXVlc3QoKS4KKyAgICAgICAgICAgICAgICBpZiAobW1zLT5zdHJlYW1fbnVtIDwgTU1TX01BWF9TVFJFQU1TICYmCisgICAgICAgICAgICAgICAgICAgICAgICA0NiArIG1tcy0+c3RyZWFtX251bSAqIDYgPCBzaXplb2YobW1zLT5vdXRfYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICBtbXMtPnN0cmVhbXMgPSBhdl9mYXN0X3JlYWxsb2MobW1zLT5zdHJlYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1tcy0+bmJfc3RyZWFtc19hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW1zLT5zdHJlYW1fbnVtICsgMSkgKiBzaXplb2YoTU1TU3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbW1zLT5zdHJlYW1zKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgbW1zLT5zdHJlYW1zW21tcy0+c3RyZWFtX251bV0uaWQgPSBzdHJlYW1faWQ7CisgICAgICAgICAgICAgICAgICAgIG1tcy0+c3RyZWFtX251bSsrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29ycnVwdCBzdHJlYW0gKHRvbyBtYW55IEEvViBzdHJlYW1zKVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKHAsIGZmX2FzZl9leHRfc3RyZWFtX2hlYWRlciwgc2l6ZW9mKGZmX2FzZl9ndWlkKSkpIHsKICAgICAgICAgICAgIGlmIChlbmQgLSBwID49IDg4KSB7CkBAIC0xNDMsNiArMTQ1LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChwLCBmZl9hc2ZfaGVhZDFfZ3VpZCwgc2l6ZW9mKGZmX2FzZl9ndWlkKSkpIHsKICAgICAgICAgICAgIGNodW5rc2l6ZSA9IDQ2OyAvLyBzZWUgcmVmZXJlbmNlcyBbMl0gc2VjdGlvbiAzLjQuIFRoaXMgc2hvdWxkIGJlIHNldCA0Ni4KKyAgICAgICAgICAgIGlmIChjaHVua3NpemUgPiBlbmQgLSBwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIkNvcnJ1cHQgc3RyZWFtIChoZWFkZXIgY2h1bmtzaXplICUiUFJJZDY0IiBpcyBpbnZhbGlkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBwICs9IGNodW5rc2l6ZTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tbXNoLmMgYi9saWJhdmZvcm1hdC9tbXNoLmMKaW5kZXggMTZmMDdmZS4uMTNjMGZmZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbW1zaC5jCisrKyBiL2xpYmF2Zm9ybWF0L21tc2guYwpAQCAtNDEsNyArNDEsNyBAQAogLy8gc2VlIFJlZiAyLjIuMS44CiAjZGVmaW5lIFVTRVJBR0VOVCAgIlVzZXItQWdlbnQ6IE5TUGxheWVyLzQuMS4wLjM4NTZcclxuIgogLy8gc2VlIFJlZiAyLjIuMS40LjMzCi0vLyB0aGUgZ3VpZCB2YWx1ZSBjYW4gYmUgY2hhbmdlZCB0byBhbnkgdmFsaWQgdmFsdWUuCisvLyB0aGUgR1VJRCB2YWx1ZSBjYW4gYmUgY2hhbmdlZCB0byBhbnkgdmFsaWQgdmFsdWUuCiAjZGVmaW5lIENMSUVOVEdVSUQgIlByYWdtYTogeENsaWVudEdVSUQ9e2M3N2U3NDAwLTczOGEtMTFkMi05YWRkLTAwMjBhZjBhMzI3OH1cclxuIgogCiAvLyBzZWUgUmVmIDIuMi4zIGZvciBwYWNrZXQgdHlwZSBkZWZpbmU6CkBAIC0yNDYsNiArMjQ2LDE0IEBACiAgICAgICAgICAgICAgaG9zdCwgcG9ydCwgbW1zaC0+cmVxdWVzdF9zZXErKyk7CiAgICAgYXZfb3B0X3NldChtbXMtPm1tc19oZC0+cHJpdl9kYXRhLCAiaGVhZGVycyIsIGhlYWRlcnMsIDApOwogCisgICAgaWYgKCFtbXMtPm1tc19oZC0+cHJvdG9jb2xfd2hpdGVsaXN0ICYmIGgtPnByb3RvY29sX3doaXRlbGlzdCkgeworICAgICAgICBtbXMtPm1tc19oZC0+cHJvdG9jb2xfd2hpdGVsaXN0ID0gYXZfc3RyZHVwKGgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgIGlmICghbW1zLT5tbXNfaGQtPnByb3RvY29sX3doaXRlbGlzdCkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCiAgICAgZXJyID0gZmZ1cmxfY29ubmVjdChtbXMtPm1tc19oZCwgTlVMTCk7CiAgICAgaWYgKGVycikgewogICAgICAgICBnb3RvIGZhaWw7CkBAIC00MDEsNyArNDA5LDcgQEAKICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogfQogCi1VUkxQcm90b2NvbCBmZl9tbXNoX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfbW1zaF9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAibW1zaCIsCiAgICAgLnVybF9vcGVuICAgICAgID0gbW1zaF9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICA9IG1tc2hfcmVhZCwKQEAgLTQxMCw0ICs0MTgsNSBAQAogICAgIC51cmxfcmVhZF9zZWVrICA9IG1tc2hfcmVhZF9zZWVrLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihNTVNIQ29udGV4dCksCiAgICAgLmZsYWdzICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKKyAgICAuZGVmYXVsdF93aGl0ZWxpc3QgPSAiaHR0cCx0Y3AiLAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21tc3QuYyBiL2xpYmF2Zm9ybWF0L21tc3QuYwppbmRleCAyMWNmMmE2Li5hOTdjMmUwIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tbXN0LmMKKysrIGIvbGliYXZmb3JtYXQvbW1zdC5jCkBAIC00MjcsNyArNDI3LDcgQEAKICAgICBpbnQgcmV0OwogICAgIE1NU0NvbnRleHQgKm1tcyA9ICZtbXN0LT5tbXM7CiAgICAgLy8gU3Vic2NyaWJlck5hbWUgaXMgZGVmaW5lZCBpbiBNUyBzcGVjaWZpY2F0aW9uIGxpbmtlZCBiZWxvdy4KLSAgICAvLyBUaGUgZ3VpZCB2YWx1ZSBjYW4gYmUgYW55IHZhbGlkIHZhbHVlLgorICAgIC8vIFRoZSBHVUlEIHZhbHVlIGNhbiBiZSBhbnkgdmFsaWQgdmFsdWUuCiAgICAgLy8gaHR0cDovL2Rvd25sb2FkLm1pY3Jvc29mdC5jb20vCiAgICAgLy8gZG93bmxvYWQvOS81L0UvOTVFRjY2QUYtOTAyNi00QkIwLUE0MUQtQTRGODE4MDJEOTJDLyU1Qk1TLVdNU1AlNUQucGRmCiAgICAgc25wcmludGYoZGF0YV9zdHJpbmcsIHNpemVvZihkYXRhX3N0cmluZyksCkBAIC01MjQsMTMgKzUyNCwxMyBAQAogICAgICAgICAgICAgc2l6ZW9mKG1tc3QtPnBhdGgpLCB1cmkpOwogCiAgICAgaWYocG9ydDwwKQotICAgICAgICBwb3J0ID0gMTc1NTsgLy8gZGVmYXV0IG1tcyBwcm90b2NvbCBwb3J0CisgICAgICAgIHBvcnQgPSAxNzU1OyAvLyBkZWZhdWx0IE1NUyBwcm90b2NvbCBwb3J0CiAKICAgICAvLyBlc3RhYmxpc2ggdGNwIGNvbm5lY3Rpb24uCiAgICAgZmZfdXJsX2pvaW4odGNwbmFtZSwgc2l6ZW9mKHRjcG5hbWUpLCAidGNwIiwgTlVMTCwgbW1zdC0+aG9zdCwgcG9ydCwgTlVMTCk7CiAgICAgZXJyID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJm1tcy0+bW1zX2hkLCB0Y3BuYW1lLCBBVklPX0ZMQUdfUkVBRF9XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpOwogICAgIGlmIChlcnIpCiAgICAgICAgIGdvdG8gZmFpbDsKIApAQCAtNjI5LDcgKzYyOSw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotVVJMUHJvdG9jb2wgZmZfbW1zdF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX21tc3RfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gIm1tc3QiLAogICAgIC51cmxfb3BlbiAgICAgICA9IG1tc19vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICA9IG1tc19yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbW92LmMgYi9saWJhdmZvcm1hdC9tb3YuYwppbmRleCAxNDllM2I0Li43YTM0YTIyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tb3YuYworKysgYi9saWJhdmZvcm1hdC9tb3YuYwpAQCAtMzQsMTUgKzM0LDIxIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9kaXNwbGF5LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYWVzX2N0ci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3NoYS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zcGhlcmljYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc3RlcmVvM2QuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGltZWNvZGUuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2FjM3RhYi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZmxhYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbXBlZ2F1ZGlvZGVjaGVhZGVyLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKQEAgLTY4LDYgKzc0LDggQEAKIAogc3RhdGljIGludCBtb3ZfcmVhZF9kZWZhdWx0KE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKTsKIHN0YXRpYyBpbnQgbW92X3JlYWRfbWZyYShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqZik7CitzdGF0aWMgaW50NjRfdCBhZGRfY3R0c19lbnRyeShNT1ZTdHRzKiogY3R0c19kYXRhLCB1bnNpZ25lZCBpbnQqIGN0dHNfY291bnQsIHVuc2lnbmVkIGludCogYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBkdXJhdGlvbik7CiAKIHN0YXRpYyBpbnQgbW92X21ldGFkYXRhX3RyYWNrX29yX2Rpc2NfbnVtYmVyKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbiwgY29uc3QgY2hhciAqa2V5KQpAQCAtMTU2LDcgKzE2NCwxMSBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgIHVpbnQ4X3QgdCwgYyA9IGF2aW9fcjgocGIpOwotICAgICAgICBpZiAoYyA8IDB4ODAgJiYgcCA8IGVuZCkKKworICAgICAgICBpZiAocCA+PSBlbmQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoYyA8IDB4ODApCiAgICAgICAgICAgICAqcCsrID0gYzsKICAgICAgICAgZWxzZSBpZiAocCA8IGVuZCkKICAgICAgICAgICAgIFBVVF9VVEY4KG1hY190b191bmljb2RlW2MtMHg4MF0sIHQsIGlmIChwIDwgZW5kKSAqcCsrID0gdDspOwpAQCAtMjA5LDEyICsyMjEsMTMgQEAKICAgICBzdC0+YXR0YWNoZWRfcGljLnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKICAgICBzdC0+YXR0YWNoZWRfcGljLmZsYWdzICAgICAgIHw9IEFWX1BLVF9GTEFHX0tFWTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBpZDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gaWQ7CiAKICAgICByZXR1cm4gMDsKIH0KIAorLy8gM0dQUCBUUyAyNi4yNDQKIHN0YXRpYyBpbnQgbW92X21ldGFkYXRhX2xvY2koTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCB1bnNpZ25lZCBsZW4pCiB7CiAgICAgY2hhciBsYW5ndWFnZVs0XSA9IHsgMCB9OwpAQCAtMjQyLDcgKzI1NSw4IEBACiAgICAgbGVuIC09IDE7CiAKICAgICBpZiAobGVuIDwgMTIpIHsKLSAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJubyBzcGFjZSBmb3IgY29vcmRpbmF0ZXMgbGVmdCAoJWQpXG4iLCBsZW4pOworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJsb2NpIHRvbyBzaG9ydCAoJXUgYnl0ZXMgbGVmdCwgbmVlZCBhdCBsZWFzdCAlZClcbiIsIGxlbiwgMTIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAgICAgbG9uZ2l0dWRlID0gKChpbnQzMl90KSBhdmlvX3JiMzIocGIpKSAvIChmbG9hdCkgKDEgPDwgMTYpOwpAQCAtMjY0LDYgKzI3OCwyMyBAQAogICAgIHJldHVybiBhdl9kaWN0X3NldCgmYy0+ZmMtPm1ldGFkYXRhLCBrZXksIGJ1ZiwgMCk7CiB9CiAKK3N0YXRpYyBpbnQgbW92X21ldGFkYXRhX2htbXQoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCB1bnNpZ25lZCBsZW4pCit7CisgICAgaW50IGksIG5faG1tdDsKKworICAgIGlmIChsZW4gPCAyKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoYy0+aWdub3JlX2NoYXB0ZXJzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIG5faG1tdCA9IGF2aW9fcmIzMihwYik7CisgICAgZm9yIChpID0gMDsgaSA8IG5faG1tdCAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspIHsKKyAgICAgICAgaW50IG1vbWVudF90aW1lID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYXZwcml2X25ld19jaGFwdGVyKGMtPmZjLCBpLCBhdl9tYWtlX3EoMSwgMTAwMCksIG1vbWVudF90aW1lLCBBVl9OT1BUU19WQUxVRSwgTlVMTCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG1vdl9yZWFkX3VkdGFfc3RyaW5nKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQogewogICAgIGNoYXIgdG1wX2tleVs1XTsKQEAgLTI5NCwxNCArMzI1LDE5IEBACiAgICAgICAgIHBhcnNlID0gbW92X21ldGFkYXRhX3RyYWNrX29yX2Rpc2NfbnVtYmVyOyBicmVhazsKICAgICBjYXNlIE1LVEFHKCAnZScsJ2cnLCdpJywnZCcpOiBrZXkgPSAiZXBpc29kZV91aWQiOwogICAgICAgICBwYXJzZSA9IG1vdl9tZXRhZGF0YV9pbnQ4X25vX3BhZGRpbmc7IGJyZWFrOworICAgIGNhc2UgTUtUQUcoICdGJywnSScsJ1InLCdNJyk6IGtleSA9ICJmaXJtd2FyZSI7IHJhdyA9IDE7IGJyZWFrOwogICAgIGNhc2UgTUtUQUcoICdnJywnbicsJ3InLCdlJyk6IGtleSA9ICJnZW5yZSI7CiAgICAgICAgIHBhcnNlID0gbW92X21ldGFkYXRhX2ducmU7IGJyZWFrOwogICAgIGNhc2UgTUtUQUcoICdoJywnZCcsJ3YnLCdkJyk6IGtleSA9ICJoZF92aWRlbyI7CiAgICAgICAgIHBhcnNlID0gbW92X21ldGFkYXRhX2ludDhfbm9fcGFkZGluZzsgYnJlYWs7CisgICAgY2FzZSBNS1RBRyggJ0gnLCdNJywnTScsJ1QnKToKKyAgICAgICAgcmV0dXJuIG1vdl9tZXRhZGF0YV9obW10KGMsIHBiLCBhdG9tLnNpemUpOwogICAgIGNhc2UgTUtUQUcoICdrJywnZScsJ3knLCd3Jyk6IGtleSA9ICJrZXl3b3JkcyI7ICBicmVhazsKICAgICBjYXNlIE1LVEFHKCAnbCcsJ2QnLCdlJywncycpOiBrZXkgPSAic3lub3BzaXMiOyAgYnJlYWs7CiAgICAgY2FzZSBNS1RBRyggJ2wnLCdvJywnYycsJ2knKToKICAgICAgICAgcmV0dXJuIG1vdl9tZXRhZGF0YV9sb2NpKGMsIHBiLCBhdG9tLnNpemUpOworICAgIGNhc2UgTUtUQUcoICdtJywnYScsJ24nLCd1Jyk6IGtleSA9ICJtYWtlIjsgYnJlYWs7CisgICAgY2FzZSBNS1RBRyggJ20nLCdvJywnZCcsJ2wnKToga2V5ID0gIm1vZGVsIjsgYnJlYWs7CiAgICAgY2FzZSBNS1RBRyggJ3AnLCdjJywncycsJ3QnKToga2V5ID0gInBvZGNhc3QiOwogICAgICAgICBwYXJzZSA9IG1vdl9tZXRhZGF0YV9pbnQ4X25vX3BhZGRpbmc7IGJyZWFrOwogICAgIGNhc2UgTUtUQUcoICdwJywnZycsJ2EnLCdwJyk6IGtleSA9ICJnYXBsZXNzX3BsYXliYWNrIjsKQEAgLTM3NiwxNSArNDEyLDE5IEBACiAgICAgICAgICAgICAgICAgaW50IHJldCA9IG1vdl9yZWFkX2NvdnIoYywgcGIsIGRhdGFfdHlwZSwgc3RyX3NpemUpOwogICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcGFyc2luZyBjb3ZlciBhcnQuXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXRvbS5zaXplIC09IHN0cl9zaXplOworICAgICAgICAgICAgICAgIGlmIChhdG9tLnNpemUgPiA4KQorICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFrZXkgJiYgYy0+Zm91bmRfaGRscl9tZHRhICYmIGMtPm1ldGFfa2V5cykgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4ID0gQVZfUkIzMigmYXRvbS50eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBjLT5tZXRhX2tleXNfY291bnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCBjLT5tZXRhX2tleXNfY291bnQgJiYgaW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGtleSA9IGMtPm1ldGFfa2V5c1tpbmRleF07CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgaW5kZXggb2YgJ2RhdGEnIGlzIG91dCBvZiByYW5nZTogJWQgPj0gJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBpbmRleCBvZiAnZGF0YScgaXMgb3V0IG9mIHJhbmdlOiAlIlBSSWQzMiIgPCAxIG9yID49ICVkLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBjLT5tZXRhX2tleXNfY291bnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTQxMyw5ICs0NTMsOSBAQAogICAgIGlmIChhdG9tLnNpemUgPCAwIHx8IHN0cl9zaXplID49IElOVF9NQVgvMikKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICAvLyBBbGxvY2F0ZXMgZW5vdWdoIHNwYWNlIGlmIGRhdGFfdHlwZSBpcyBhIGZsb2F0MzIgbnVtYmVyLCBvdGhlcndpc2UKKyAgICAvLyBBbGxvY2F0ZXMgZW5vdWdoIHNwYWNlIGlmIGRhdGFfdHlwZSBpcyBhIGludDMyIG9yIGZsb2F0MzIgbnVtYmVyLCBvdGhlcndpc2UKICAgICAvLyB3b3JzdC1jYXNlIHJlcXVpcmVtZW50IGZvciBvdXRwdXQgc3RyaW5nIGluIGNhc2Ugb2YgdXRmOCBjb2RlZCBpbnB1dAotICAgIG51bSA9IChkYXRhX3R5cGUgPT0gMjMpOworICAgIG51bSA9IChkYXRhX3R5cGUgPj0gMjEgJiYgZGF0YV90eXBlIDw9IDIzKTsKICAgICBzdHJfc2l6ZV9hbGxvYyA9IChudW0gPyA1MTIgOiAocmF3ID8gc3RyX3NpemUgOiBzdHJfc2l6ZSAqIDIpKSArIDE7CiAgICAgc3RyID0gYXZfbWFsbG9jeihzdHJfc2l6ZV9hbGxvYyk7CiAgICAgaWYgKCFzdHIpCkBAIC00MjYsNiArNDY2LDM4IEBACiAgICAgZWxzZSB7CiAgICAgICAgIGlmICghcmF3ICYmIChkYXRhX3R5cGUgPT0gMyB8fCAoZGF0YV90eXBlID09IDAgJiYgKGxhbmdjb2RlIDwgMHg0MDAgfHwgbGFuZ2NvZGUgPT0gMHg3ZmZmKSkpKSB7IC8vIE1BQyBFbmNvZGVkCiAgICAgICAgICAgICBtb3ZfcmVhZF9tYWNfc3RyaW5nKGMsIHBiLCBzdHJfc2l6ZSwgc3RyLCBzdHJfc2l6ZV9hbGxvYyk7CisgICAgICAgIH0gZWxzZSBpZiAoZGF0YV90eXBlID09IDIxKSB7IC8vIEJFIHNpZ25lZCBpbnRlZ2VyLCB2YXJpYWJsZSBzaXplCisgICAgICAgICAgICBpbnQgdmFsID0gMDsKKyAgICAgICAgICAgIGlmIChzdHJfc2l6ZSA9PSAxKQorICAgICAgICAgICAgICAgIHZhbCA9IChpbnQ4X3QpYXZpb19yOChwYik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJfc2l6ZSA9PSAyKQorICAgICAgICAgICAgICAgIHZhbCA9IChpbnQxNl90KWF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJfc2l6ZSA9PSAzKQorICAgICAgICAgICAgICAgIHZhbCA9ICgoaW50MzJfdCkoYXZpb19yYjI0KHBiKTw8OCkpPj44OworICAgICAgICAgICAgZWxzZSBpZiAoc3RyX3NpemUgPT0gNCkKKyAgICAgICAgICAgICAgICB2YWwgPSAoaW50MzJfdClhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgaWYgKHNucHJpbnRmKHN0ciwgc3RyX3NpemVfYWxsb2MsICIlZCIsIHZhbCkgPj0gc3RyX3NpemVfYWxsb2MpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzdG9yZSB0aGUgbnVtYmVyICglZCkgaW4gc3RyaW5nLlxuIiwgdmFsKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHN0cik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGF0YV90eXBlID09IDIyKSB7IC8vIEJFIHVuc2lnbmVkIGludGVnZXIsIHZhcmlhYmxlIHNpemUKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCB2YWwgPSAwOworICAgICAgICAgICAgaWYgKHN0cl9zaXplID09IDEpCisgICAgICAgICAgICAgICAgdmFsID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJfc2l6ZSA9PSAyKQorICAgICAgICAgICAgICAgIHZhbCA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJfc2l6ZSA9PSAzKQorICAgICAgICAgICAgICAgIHZhbCA9IGF2aW9fcmIyNChwYik7CisgICAgICAgICAgICBlbHNlIGlmIChzdHJfc2l6ZSA9PSA0KQorICAgICAgICAgICAgICAgIHZhbCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBpZiAoc25wcmludGYoc3RyLCBzdHJfc2l6ZV9hbGxvYywgIiV1IiwgdmFsKSA+PSBzdHJfc2l6ZV9hbGxvYykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHN0b3JlIHRoZSBudW1iZXIgKCV1KSBpbiBzdHJpbmcuXG4iLCB2YWwpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoc3RyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChkYXRhX3R5cGUgPT0gMjMgJiYgc3RyX3NpemUgPj0gNCkgeyAgLy8gQkUgZmxvYXQzMgogICAgICAgICAgICAgZmxvYXQgdmFsID0gYXZfaW50MmZsb2F0KGF2aW9fcmIzMihwYikpOwogICAgICAgICAgICAgaWYgKHNucHJpbnRmKHN0ciwgc3RyX3NpemVfYWxsb2MsICIlZiIsIHZhbCkgPj0gc3RyX3NpemVfYWxsb2MpIHsKQEAgLTQ1NSw5ICs1MjcsNiBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAibGFuZyBcIiUzc1wiICIsIGxhbmd1YWdlKTsKLSAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInRhZyBcIiVzXCIgdmFsdWUgXCIlc1wiIGF0b20gXCIlLjRzXCIgJWQgJSJQUklkNjQiXG4iLAotICAgICAgICAgICAga2V5LCBzdHIsIChjaGFyKikmYXRvbS50eXBlLCBzdHJfc2l6ZV9hbGxvYywgYXRvbS5zaXplKTsKIAogICAgIGF2X2ZyZWVwKCZzdHIpOwogICAgIHJldHVybiAwOwpAQCAtNTE1LDkgKzU4NCwxMSBAQAogCiAgICAgYXZpb19yYjMyKHBiKTsgLy8gdmVyc2lvbiArIGZsYWdzCiAgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7Ci0gICAgaWYgKGVudHJpZXMgPiAgKGF0b20uc2l6ZSAtIDEpIC8gTUlOX0RBVEFfRU5UUllfQk9YX1NJWkUgKyAxIHx8CisgICAgaWYgKCFlbnRyaWVzIHx8CisgICAgICAgIGVudHJpZXMgPiAgKGF0b20uc2l6ZSAtIDEpIC8gTUlOX0RBVEFfRU5UUllfQk9YX1NJWkUgKyAxIHx8CiAgICAgICAgIGVudHJpZXMgPj0gVUlOVF9NQVggLyBzaXplb2YoKnNjLT5kcmVmcykpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIHNjLT5kcmVmc19jb3VudCA9IDA7CiAgICAgYXZfZnJlZShzYy0+ZHJlZnMpOwogICAgIHNjLT5kcmVmc19jb3VudCA9IDA7CiAgICAgc2MtPmRyZWZzID0gYXZfbWFsbG9jeihlbnRyaWVzICogc2l6ZW9mKCpzYy0+ZHJlZnMpKTsKQEAgLTUzNSw3ICs2MDYsNiBAQAogCiAgICAgICAgIGRyZWYtPnR5cGUgPSBhdmlvX3JsMzIocGIpOwogICAgICAgICBhdmlvX3JiMzIocGIpOyAvLyB2ZXJzaW9uICsgZmxhZ3MKLSAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJ0eXBlICUuNHMgc2l6ZSAlZFxuIiwgKGNoYXIqKSZkcmVmLT50eXBlLCBzaXplKTsKIAogICAgICAgICBpZiAoZHJlZi0+dHlwZSA9PSBNS1RBRygnYScsJ2wnLCdpJywncycpICYmIHNpemUgPiAxNTApIHsKICAgICAgICAgICAgIC8qIG1hY2ludG9zaCBhbGlhcyByZWNvcmQgKi8KQEAgLTU5Nyw2ICs2NjcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoZHJlZi0+cGF0aCwgZHJlZi0+cGF0aCt2b2x1bWVfbGVuLCBsZW4pOwogICAgICAgICAgICAgICAgICAgICAgICAgZHJlZi0+cGF0aFtsZW5dID0gMDsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyB0cmltIHN0cmluZyBvZiBhbnkgZW5kaW5nIHplcm9zCisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGxlbiAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHJlZi0+cGF0aFtqXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkcmVmLT5wYXRoW2pdID09ICc6JyB8fCBkcmVmLT5wYXRoW2pdID09IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJlZi0+cGF0aFtqXSA9ICcvJzsKQEAgLTYyMSw3ICs2OTgsNyBAQAogICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIGxlbik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19ERUJVRywgIlVua25vd24gZHJlZiB0eXBlIDB4MDgleCBzaXplICVkXG4iLAorICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsICJVbmtub3duIGRyZWYgdHlwZSAweCUwOCJQUkl4MzIiIHNpemUgJSJQUkl1MzIiXG4iLAogICAgICAgICAgICAgICAgICAgIGRyZWYtPnR5cGUsIHNpemUpOwogICAgICAgICAgICAgZW50cmllcy0tOwogICAgICAgICAgICAgaS0tOwpAQCAtNjM1LDcgKzcxMiw3IEBACiB7CiAgICAgQVZTdHJlYW0gKnN0OwogICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgdWludDMyX3QgYXZfdW51c2VkIGN0eXBlOworICAgIHVpbnQzMl90IGN0eXBlOwogICAgIGludDY0X3QgdGl0bGVfc2l6ZTsKICAgICBjaGFyICp0aXRsZV9zdHI7CiAgICAgaW50IHJldDsKQEAgLTY0Nyw4ICs3MjQsOCBAQAogICAgIGN0eXBlID0gYXZpb19ybDMyKHBiKTsKICAgICB0eXBlID0gYXZpb19ybDMyKHBiKTsgLyogY29tcG9uZW50IHN1YnR5cGUgKi8KIAotICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAiY3R5cGU9ICUuNHMgKDB4JTA4eClcbiIsIChjaGFyKikmY3R5cGUsIGN0eXBlKTsKLSAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInN0eXBlPSAlLjRzXG4iLCAoY2hhciopJnR5cGUpOworICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAiY3R5cGU9JXNcbiIsIGF2X2ZvdXJjYzJzdHIoY3R5cGUpKTsKKyAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInN0eXBlPSVzXG4iLCBhdl9mb3VyY2Myc3RyKHR5cGUpKTsKIAogICAgIGlmIChjLT50cmFrX2luZGV4IDwgMCkgeyAgLy8gbWV0YSBub3QgaW5zaWRlIGEgdHJhawogICAgICAgICBpZiAodHlwZSA9PSBNS1RBRygnbScsJ2QnLCd0JywnYScpKSB7CkBAIC02NjAsMTMgKzczNywxMyBAQAogICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV07CiAKICAgICBpZiAgICAgKHR5cGUgPT0gTUtUQUcoJ3YnLCdpJywnZCcsJ2UnKSkKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CiAgICAgZWxzZSBpZiAodHlwZSA9PSBNS1RBRygncycsJ28nLCd1JywnbicpKQotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKICAgICBlbHNlIGlmICh0eXBlID09IE1LVEFHKCdtJywnMScsJ2EnLCcgJykpCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDI7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDI7CiAgICAgZWxzZSBpZiAoKHR5cGUgPT0gTUtUQUcoJ3MnLCd1JywnYicsJ3AnKSkgfHwgKHR5cGUgPT0gTUtUQUcoJ2MnLCdsJywnYycsJ3AnKSkpCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwogCiAgICAgYXZpb19yYjMyKHBiKTsgLyogY29tcG9uZW50ICBtYW51ZmFjdHVyZSAqLwogICAgIGF2aW9fcmIzMihwYik7IC8qIGNvbXBvbmVudCBmbGFncyAqLwpAQCAtNjc0LDYgKzc1MSw4IEBACiAKICAgICB0aXRsZV9zaXplID0gYXRvbS5zaXplIC0gMjQ7CiAgICAgaWYgKHRpdGxlX3NpemUgPiAwKSB7CisgICAgICAgIGlmICh0aXRsZV9zaXplID4gRkZNSU4oSU5UX01BWCwgU0laRV9NQVgtMSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgdGl0bGVfc3RyID0gYXZfbWFsbG9jKHRpdGxlX3NpemUgKyAxKTsgLyogQWRkIG51bGwgdGVybWluYXRvciAqLwogICAgICAgICBpZiAoIXRpdGxlX3N0cikKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC02OTQsMjggKzc3Myw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBmZl9tb3ZfcmVhZF9lc2RzKEFWRm9ybWF0Q29udGV4dCAqZmMsIEFWSU9Db250ZXh0ICpwYikKLXsKLSAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgaW50IHRhZzsKLQotICAgIGlmIChmYy0+bmJfc3RyZWFtcyA8IDEpCi0gICAgICAgIHJldHVybiAwOwotICAgIHN0ID0gZmMtPnN0cmVhbXNbZmMtPm5iX3N0cmVhbXMtMV07Ci0KLSAgICBhdmlvX3JiMzIocGIpOyAvKiB2ZXJzaW9uICsgZmxhZ3MgKi8KLSAgICBmZl9tcDRfcmVhZF9kZXNjcihmYywgcGIsICZ0YWcpOwotICAgIGlmICh0YWcgPT0gTVA0RVNEZXNjclRhZykgewotICAgICAgICBmZl9tcDRfcGFyc2VfZXNfZGVzY3IocGIsIE5VTEwpOwotICAgIH0gZWxzZQotICAgICAgICBhdmlvX3JiMTYocGIpOyAvKiBJRCAqLwotCi0gICAgZmZfbXA0X3JlYWRfZGVzY3IoZmMsIHBiLCAmdGFnKTsKLSAgICBpZiAodGFnID09IE1QNERlY0NvbmZpZ0Rlc2NyVGFnKQotICAgICAgICBmZl9tcDRfcmVhZF9kZWNfY29uZmlnX2Rlc2NyKGZjLCBzdCwgcGIpOwotICAgIHJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IG1vdl9yZWFkX2VzZHMoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCiB7CiAgICAgcmV0dXJuIGZmX21vdl9yZWFkX2VzZHMoYy0+ZmMsIHBiKTsKQEAgLTc0MCwxNSArNzk3LDE5IEBACiAgICAgYnNtb2QgPSAoYWMzaW5mbyA+PiAxNCkgJiAweDc7CiAgICAgYWNtb2QgPSAoYWMzaW5mbyA+PiAxMSkgJiAweDc7CiAgICAgbGZlb24gPSAoYWMzaW5mbyA+PiAxMCkgJiAweDE7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyA9ICgoaW50W10pezIsMSwyLDMsMyw0LDQsNX0pW2FjbW9kXSArIGxmZW9uOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBhdnByaXZfYWMzX2NoYW5uZWxfbGF5b3V0X3RhYlthY21vZF07CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9ICgoaW50W10pezIsMSwyLDMsMyw0LDQsNX0pW2FjbW9kXSArIGxmZW9uOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBhdnByaXZfYWMzX2NoYW5uZWxfbGF5b3V0X3RhYlthY21vZF07CiAgICAgaWYgKGxmZW9uKQotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0IHw9IEFWX0NIX0xPV19GUkVRVUVOQ1k7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgfD0gQVZfQ0hfTE9XX0ZSRVFVRU5DWTsKICAgICAqYXN0ID0gYnNtb2Q7Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPiAxICYmIGJzbW9kID09IDB4NykKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IDEgJiYgYnNtb2QgPT0gMHg3KQogICAgICAgICAqYXN0ID0gQVZfQVVESU9fU0VSVklDRV9UWVBFX0tBUkFPS0U7CiAKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorICAgIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICAgICBzdC0+Y29kZWMtPmF1ZGlvX3NlcnZpY2VfdHlwZSA9ICphc3Q7CisgICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKIAogICAgIHJldHVybiAwOwogfQpAQCAtNzc2LDE1ICs4MzcsMTkgQEAKICAgICBic21vZCA9IChlYWMzaW5mbyA+PiAxMikgJiAweDFmOwogICAgIGFjbW9kID0gKGVhYzNpbmZvID4+ICA5KSAmIDB4NzsKICAgICBsZmVvbiA9IChlYWMzaW5mbyA+PiAgOCkgJiAweDE7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IGF2cHJpdl9hYzNfY2hhbm5lbF9sYXlvdXRfdGFiW2FjbW9kXTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gYXZwcml2X2FjM19jaGFubmVsX2xheW91dF90YWJbYWNtb2RdOwogICAgIGlmIChsZmVvbikKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCB8PSBBVl9DSF9MT1dfRlJFUVVFTkNZOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgfD0gQVZfQ0hfTE9XX0ZSRVFVRU5DWTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQpOwogICAgICphc3QgPSBic21vZDsKLSAgICBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA+IDEgJiYgYnNtb2QgPT0gMHg3KQorICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzID4gMSAmJiBic21vZCA9PSAweDcpCiAgICAgICAgICphc3QgPSBBVl9BVURJT19TRVJWSUNFX1RZUEVfS0FSQU9LRTsKIAorI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIHN0LT5jb2RlYy0+YXVkaW9fc2VydmljZV90eXBlID0gKmFzdDsKKyAgICBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC03OTgsNyArODYzLDcgQEAKICAgICB1aW50MzJfdCBjaGFubmVsX2xheW91dF9jb2RlID0gMDsKICAgICBHZXRCaXRDb250ZXh0IGdiOwogCi0gICAgYnVmID0gYXZfbWFsbG9jKGRkdHNfc2l6ZSArIEZGX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGJ1ZiA9IGF2X21hbGxvYyhkZHRzX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKICAgICBpZiAoIWJ1ZikgewogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KQEAgLTgxMCwxOSArODc1LDI1IEBACiAgICAgaW5pdF9nZXRfYml0cygmZ2IsIGJ1ZiwgOCpkZHRzX3NpemUpOwogCiAgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkgeworICAgICAgICBhdl9mcmVlKGJ1Zik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOwogCi0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGdldF9iaXRzX2xvbmcoJmdiLCAzMik7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGdldF9iaXRzX2xvbmcoJmdiLCAzMik7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPD0gMCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2FtcGxlIHJhdGUgJWRcbiIsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KICAgICBza2lwX2JpdHNfbG9uZygmZ2IsIDMyKTsgLyogbWF4IGJpdHJhdGUgKi8KLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gZ2V0X2JpdHNfbG9uZygmZ2IsIDMyKTsKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGdldF9iaXRzKCZnYiwgOCk7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IGdldF9iaXRzX2xvbmcoJmdiLCAzMik7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBnZXRfYml0cygmZ2IsIDgpOwogICAgIGZyYW1lX2R1cmF0aW9uX2NvZGUgPSBnZXRfYml0cygmZ2IsIDIpOwogICAgIHNraXBfYml0cygmZ2IsIDMwKTsgLyogdmFyaW91cyBmaWVsZHMgKi8KICAgICBjaGFubmVsX2xheW91dF9jb2RlID0gZ2V0X2JpdHMoJmdiLCAxNik7CiAKLSAgICBzdC0+Y29kZWMtPmZyYW1lX3NpemUgPQorICAgIHN0LT5jb2RlY3Bhci0+ZnJhbWVfc2l6ZSA9CiAgICAgICAgICAgICAoZnJhbWVfZHVyYXRpb25fY29kZSA9PSAwKSA/IDUxMiA6CiAgICAgICAgICAgICAoZnJhbWVfZHVyYXRpb25fY29kZSA9PSAxKSA/IDEwMjQgOgogICAgICAgICAgICAgKGZyYW1lX2R1cmF0aW9uX2NvZGUgPT0gMikgPyAyMDQ4IDoKQEAgLTgzMSw3ICs5MDIsNyBAQAogICAgIGlmIChjaGFubmVsX2xheW91dF9jb2RlID4gMHhmZikgewogICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgRFRTIGF1ZGlvIGNoYW5uZWwgbGF5b3V0Iik7CiAgICAgfQotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPQorICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPQogICAgICAgICAgICAgKChjaGFubmVsX2xheW91dF9jb2RlICYgMHgxKSA/IEFWX0NIX0ZST05UX0NFTlRFUiA6IDApIHwKICAgICAgICAgICAgICgoY2hhbm5lbF9sYXlvdXRfY29kZSAmIDB4MikgPyBBVl9DSF9GUk9OVF9MRUZUIDogMCkgfAogICAgICAgICAgICAgKChjaGFubmVsX2xheW91dF9jb2RlICYgMHgyKSA/IEFWX0NIX0ZST05UX1JJR0hUIDogMCkgfApAQCAtODM5LDcgKzkxMCw4IEBACiAgICAgICAgICAgICAoKGNoYW5uZWxfbGF5b3V0X2NvZGUgJiAweDQpID8gQVZfQ0hfU0lERV9SSUdIVCA6IDApIHwKICAgICAgICAgICAgICgoY2hhbm5lbF9sYXlvdXRfY29kZSAmIDB4OCkgPyBBVl9DSF9MT1dfRlJFUVVFTkNZIDogMCk7CiAKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQpOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCk7CisgICAgYXZfZnJlZShidWYpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC04NzIsNyArOTQ0LDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKIAotICAgIGlmICgocmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIoYy0+ZmMsIHBiLCBzdC0+Y29kZWMsIGF0b20uc2l6ZSwgMCkpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX2dldF93YXZfaGVhZGVyKGMtPmZjLCBwYiwgc3QtPmNvZGVjcGFyLCBhdG9tLnNpemUsIDApKSA8IDApCiAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJnZXRfd2F2X2hlYWRlciBmYWlsZWRcbiIpOwogCiAgICAgcmV0dXJuIHJldDsKQEAgLTk0NSw3ICsxMDE3LDcgQEAKIAogICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0lORk8sICJbYWF4XSBmaWxlIGNoZWNrc3VtID09ICIpOyAvLyByZXF1aXJlZCBieSBleHRlcm5hbCB0b29scwogICAgIGZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKQotICAgICAgICBhdl9sb2coc2hhLCBBVl9MT0dfSU5GTywgIiUwMngiLCBmaWxlX2NoZWNrc3VtW2ldKTsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfSU5GTywgIiUwMngiLCBmaWxlX2NoZWNrc3VtW2ldKTsKICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19JTkZPLCAiXG4iKTsKIAogICAgIC8qIHZlcmlmeSBhY3RpdmF0aW9uIGRhdGEgKi8KQEAgLTEwODAsMTEgKzExNTIsMjI4IEBACiAgICAgcmV0dXJuIDA7IC8qIG5vdyBnbyBmb3IgbWRhdCAqLwogfQogCitzdGF0aWMgTU9WRnJhZ21lbnRTdHJlYW1JbmZvICogZ2V0X2ZyYWdfc3RyZWFtX2luZm8oCisgICAgTU9WRnJhZ21lbnRJbmRleCAqZnJhZ19pbmRleCwKKyAgICBpbnQgaW5kZXgsCisgICAgaW50IGlkKQoreworICAgIGludCBpOworICAgIE1PVkZyYWdtZW50SW5kZXhJdGVtICogaXRlbTsKKworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZnJhZ19pbmRleC0+bmJfaXRlbXMpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGl0ZW0gPSAmZnJhZ19pbmRleC0+aXRlbVtpbmRleF07CisgICAgZm9yIChpID0gMDsgaSA8IGl0ZW0tPm5iX3N0cmVhbV9pbmZvOyBpKyspCisgICAgICAgIGlmIChpdGVtLT5zdHJlYW1faW5mb1tpXS5pZCA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiAmaXRlbS0+c3RyZWFtX2luZm9baV07CisKKyAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZyYWdfc3RyZWFtKE1PVkZyYWdtZW50SW5kZXggKmZyYWdfaW5kZXgsIGludCBpZCkKK3sKKyAgICBpbnQgaTsKKyAgICBNT1ZGcmFnbWVudEluZGV4SXRlbSAqIGl0ZW07CisKKyAgICBpZiAoZnJhZ19pbmRleC0+Y3VycmVudCA8IDAgfHwKKyAgICAgICAgZnJhZ19pbmRleC0+Y3VycmVudCA+PSBmcmFnX2luZGV4LT5uYl9pdGVtcykKKyAgICAgICAgcmV0dXJuOworCisgICAgaXRlbSA9ICZmcmFnX2luZGV4LT5pdGVtW2ZyYWdfaW5kZXgtPmN1cnJlbnRdOworICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtLT5uYl9zdHJlYW1faW5mbzsgaSsrKQorICAgICAgICBpZiAoaXRlbS0+c3RyZWFtX2luZm9baV0uaWQgPT0gaWQpIHsKKyAgICAgICAgICAgIGl0ZW0tPmN1cnJlbnQgPSBpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAvLyBpZCBub3QgZm91bmQuICBUaGlzIHNob3VsZG4ndCBoYXBwZW4uCisgICAgaXRlbS0+Y3VycmVudCA9IC0xOworfQorCitzdGF0aWMgTU9WRnJhZ21lbnRTdHJlYW1JbmZvICogZ2V0X2N1cnJlbnRfZnJhZ19zdHJlYW1faW5mbygKKyAgICBNT1ZGcmFnbWVudEluZGV4ICpmcmFnX2luZGV4KQoreworICAgIE1PVkZyYWdtZW50SW5kZXhJdGVtICppdGVtOworICAgIGlmIChmcmFnX2luZGV4LT5jdXJyZW50IDwgMCB8fAorICAgICAgICBmcmFnX2luZGV4LT5jdXJyZW50ID49IGZyYWdfaW5kZXgtPm5iX2l0ZW1zKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGl0ZW0gPSAmZnJhZ19pbmRleC0+aXRlbVtmcmFnX2luZGV4LT5jdXJyZW50XTsKKyAgICBpZiAoaXRlbS0+Y3VycmVudCA+PSAwICYmIGl0ZW0tPmN1cnJlbnQgPCBpdGVtLT5uYl9zdHJlYW1faW5mbykKKyAgICAgICAgcmV0dXJuICZpdGVtLT5zdHJlYW1faW5mb1tpdGVtLT5jdXJyZW50XTsKKworICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbgorICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHNlYXJjaF9mcmFnX21vb2Zfb2Zmc2V0KE1PVkZyYWdtZW50SW5kZXggKmZyYWdfaW5kZXgsIGludDY0X3Qgb2Zmc2V0KQoreworICAgIGludCBhLCBiLCBtOworICAgIGludDY0X3QgbW9vZl9vZmZzZXQ7CisKKyAgICAvLyBPcHRpbWl6ZSBmb3IgYXBwZW5kaW5nIG5ldyBlbnRyaWVzCisgICAgaWYgKCFmcmFnX2luZGV4LT5uYl9pdGVtcyB8fAorICAgICAgICBmcmFnX2luZGV4LT5pdGVtW2ZyYWdfaW5kZXgtPm5iX2l0ZW1zIC0gMV0ubW9vZl9vZmZzZXQgPCBvZmZzZXQpCisgICAgICAgIHJldHVybiBmcmFnX2luZGV4LT5uYl9pdGVtczsKKworICAgIGEgPSAtMTsKKyAgICBiID0gZnJhZ19pbmRleC0+bmJfaXRlbXM7CisKKyAgICB3aGlsZSAoYiAtIGEgPiAxKSB7CisgICAgICAgIG0gPSAoYSArIGIpID4+IDE7CisgICAgICAgIG1vb2Zfb2Zmc2V0ID0gZnJhZ19pbmRleC0+aXRlbVttXS5tb29mX29mZnNldDsKKyAgICAgICAgaWYgKG1vb2Zfb2Zmc2V0ID49IG9mZnNldCkKKyAgICAgICAgICAgIGIgPSBtOworICAgICAgICBpZiAobW9vZl9vZmZzZXQgPD0gb2Zmc2V0KQorICAgICAgICAgICAgYSA9IG07CisgICAgfQorICAgIHJldHVybiBiOworfQorCitzdGF0aWMgaW50NjRfdCBnZXRfc3RyZWFtX2luZm9fdGltZShNT1ZGcmFnbWVudFN0cmVhbUluZm8gKiBmcmFnX3N0cmVhbV9pbmZvKQoreworCisgICAgaWYgKGZyYWdfc3RyZWFtX2luZm8pIHsKKyAgICAgICAgaWYgKGZyYWdfc3RyZWFtX2luZm8tPnNpZHhfcHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgcmV0dXJuIGZyYWdfc3RyZWFtX2luZm8tPnNpZHhfcHRzOworICAgICAgICBpZiAoZnJhZ19zdHJlYW1faW5mby0+Zmlyc3RfdGZyYV9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICByZXR1cm4gZnJhZ19zdHJlYW1faW5mby0+Zmlyc3RfdGZyYV9wdHM7CisgICAgICAgIGlmIChmcmFnX3N0cmVhbV9pbmZvLT50ZmR0X2R0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHJldHVybiBmcmFnX3N0cmVhbV9pbmZvLT50ZmR0X2R0czsKKyAgICB9CisgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworfQorCitzdGF0aWMgaW50NjRfdCBnZXRfZnJhZ190aW1lKE1PVkZyYWdtZW50SW5kZXggKmZyYWdfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50IHRyYWNrX2lkKQoreworICAgIE1PVkZyYWdtZW50U3RyZWFtSW5mbyAqIGZyYWdfc3RyZWFtX2luZm87CisgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgaW50IGk7CisKKyAgICBpZiAodHJhY2tfaWQgPj0gMCkgeworICAgICAgICBmcmFnX3N0cmVhbV9pbmZvID0gZ2V0X2ZyYWdfc3RyZWFtX2luZm8oZnJhZ19pbmRleCwgaW5kZXgsIHRyYWNrX2lkKTsKKyAgICAgICAgcmV0dXJuIGZyYWdfc3RyZWFtX2luZm8tPnNpZHhfcHRzOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFnX2luZGV4LT5pdGVtW2luZGV4XS5uYl9zdHJlYW1faW5mbzsgaSsrKSB7CisgICAgICAgIGZyYWdfc3RyZWFtX2luZm8gPSAmZnJhZ19pbmRleC0+aXRlbVtpbmRleF0uc3RyZWFtX2luZm9baV07CisgICAgICAgIHRpbWVzdGFtcCA9IGdldF9zdHJlYW1faW5mb190aW1lKGZyYWdfc3RyZWFtX2luZm8pOworICAgICAgICBpZiAodGltZXN0YW1wICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcDsKKyAgICB9CisgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOworfQorCitzdGF0aWMgaW50IHNlYXJjaF9mcmFnX3RpbWVzdGFtcChNT1ZGcmFnbWVudEluZGV4ICpmcmFnX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBpbnQ2NF90IHRpbWVzdGFtcCkKK3sKKyAgICBpbnQgYSwgYiwgbTsKKyAgICBpbnQ2NF90IGZyYWdfdGltZTsKKyAgICBpbnQgaWQgPSAtMTsKKworICAgIGlmIChzdCkgeworICAgICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIHJlZmVyZW5jZWQgYnkgYW55IHNpZHgsIGxpbWl0IHRoZSBzZWFyY2gKKyAgICAgICAgLy8gdG8gZnJhZ21lbnRzIHRoYXQgcmVmZXJlbmNlZCB0aGlzIHN0cmVhbSBpbiB0aGUgc2lkeAorICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGlmIChzYy0+aGFzX3NpZHgpCisgICAgICAgICAgICBpZCA9IHN0LT5pZDsKKyAgICB9CisKKyAgICBhID0gLTE7CisgICAgYiA9IGZyYWdfaW5kZXgtPm5iX2l0ZW1zOworCisgICAgd2hpbGUgKGIgLSBhID4gMSkgeworICAgICAgICBtID0gKGEgKyBiKSA+PiAxOworICAgICAgICBmcmFnX3RpbWUgPSBnZXRfZnJhZ190aW1lKGZyYWdfaW5kZXgsIG0sIGlkKTsKKyAgICAgICAgaWYgKGZyYWdfdGltZSAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgaWYgKGZyYWdfdGltZSA+PSB0aW1lc3RhbXApCisgICAgICAgICAgICAgICAgYiA9IG07CisgICAgICAgICAgICBpZiAoZnJhZ190aW1lIDw9IHRpbWVzdGFtcCkKKyAgICAgICAgICAgICAgICBhID0gbTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYTsKK30KKworc3RhdGljIGludCB1cGRhdGVfZnJhZ19pbmRleChNT1ZDb250ZXh0ICpjLCBpbnQ2NF90IG9mZnNldCkKK3sKKyAgICBpbnQgaW5kZXgsIGk7CisgICAgTU9WRnJhZ21lbnRJbmRleEl0ZW0gKiBpdGVtOworICAgIE1PVkZyYWdtZW50U3RyZWFtSW5mbyAqIGZyYWdfc3RyZWFtX2luZm87CisKKyAgICAvLyBJZiBtb29mX29mZnNldCBhbHJlYWR5IGV4aXN0cyBpbiBmcmFnX2luZGV4LCByZXR1cm4gaW5kZXggdG8gaXQKKyAgICBpbmRleCA9IHNlYXJjaF9mcmFnX21vb2Zfb2Zmc2V0KCZjLT5mcmFnX2luZGV4LCBvZmZzZXQpOworICAgIGlmIChpbmRleCA8IGMtPmZyYWdfaW5kZXgubmJfaXRlbXMgJiYKKyAgICAgICAgYy0+ZnJhZ19pbmRleC5pdGVtW2luZGV4XS5tb29mX29mZnNldCA9PSBvZmZzZXQpCisgICAgICAgIHJldHVybiBpbmRleDsKKworICAgIC8vIG9mZnNldCBpcyBub3QgeWV0IGluIGZyYWcgaW5kZXguCisgICAgLy8gSW5zZXJ0IG5ldyBpdGVtIGF0IGluZGV4IChzb3J0ZWQgYnkgbW9vZiBvZmZzZXQpCisgICAgaXRlbSA9IGF2X2Zhc3RfcmVhbGxvYyhjLT5mcmFnX2luZGV4Lml0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmYy0+ZnJhZ19pbmRleC5hbGxvY2F0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjLT5mcmFnX2luZGV4Lm5iX2l0ZW1zICsgMSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpjLT5mcmFnX2luZGV4Lml0ZW0pKTsKKyAgICBpZighaXRlbSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGMtPmZyYWdfaW5kZXguaXRlbSA9IGl0ZW07CisKKyAgICBmcmFnX3N0cmVhbV9pbmZvID0gYXZfcmVhbGxvY19hcnJheShOVUxMLCBjLT5mYy0+bmJfc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKml0ZW0tPnN0cmVhbV9pbmZvKSk7CisgICAgaWYgKCFmcmFnX3N0cmVhbV9pbmZvKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYy0+ZmMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAvLyBBdm9pZCBidWlsZGluZyBmcmFnIGluZGV4IGlmIHN0cmVhbXMgbGFjayB0cmFjayBpZC4KKyAgICAgICAgaWYgKGMtPmZjLT5zdHJlYW1zW2ldLT5pZCA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBmcmFnX3N0cmVhbV9pbmZvW2ldLmlkID0gYy0+ZmMtPnN0cmVhbXNbaV0tPmlkOworICAgICAgICBmcmFnX3N0cmVhbV9pbmZvW2ldLnNpZHhfcHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgIGZyYWdfc3RyZWFtX2luZm9baV0udGZkdF9kdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgZnJhZ19zdHJlYW1faW5mb1tpXS5maXJzdF90ZnJhX3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBmcmFnX3N0cmVhbV9pbmZvW2ldLmluZGV4X2VudHJ5ID0gLTE7CisgICAgfQorCisgICAgaWYgKGluZGV4IDwgYy0+ZnJhZ19pbmRleC5uYl9pdGVtcykKKyAgICAgICAgbWVtbW92ZShjLT5mcmFnX2luZGV4Lml0ZW0gKyBpbmRleCArIDEsIGMtPmZyYWdfaW5kZXguaXRlbSArIGluZGV4LAorICAgICAgICAgICAgICAgIChjLT5mcmFnX2luZGV4Lm5iX2l0ZW1zIC0gaW5kZXgpICogc2l6ZW9mKCpjLT5mcmFnX2luZGV4Lml0ZW0pKTsKKworICAgIGl0ZW0gPSAmYy0+ZnJhZ19pbmRleC5pdGVtW2luZGV4XTsKKyAgICBpdGVtLT5oZWFkZXJzX3JlYWQgPSAwOworICAgIGl0ZW0tPmN1cnJlbnQgPSAwOworICAgIGl0ZW0tPm5iX3N0cmVhbV9pbmZvID0gYy0+ZmMtPm5iX3N0cmVhbXM7CisgICAgaXRlbS0+bW9vZl9vZmZzZXQgPSBvZmZzZXQ7CisgICAgaXRlbS0+c3RyZWFtX2luZm8gPSBmcmFnX3N0cmVhbV9pbmZvOworICAgIGMtPmZyYWdfaW5kZXgubmJfaXRlbXMrKzsKKworICAgIHJldHVybiBpbmRleDsKK30KKworc3RhdGljIHZvaWQgZml4X2ZyYWdfaW5kZXhfZW50cmllcyhNT1ZGcmFnbWVudEluZGV4ICpmcmFnX2luZGV4LCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwgaW50IGVudHJpZXMpCit7CisgICAgaW50IGk7CisgICAgTU9WRnJhZ21lbnRTdHJlYW1JbmZvICogZnJhZ19zdHJlYW1faW5mbzsKKworICAgIGlmIChpbmRleCA8IDApCisgICAgICAgIHJldHVybjsKKyAgICBmb3IgKGkgPSBpbmRleDsgaSA8IGZyYWdfaW5kZXgtPm5iX2l0ZW1zOyBpKyspIHsKKyAgICAgICAgZnJhZ19zdHJlYW1faW5mbyA9IGdldF9mcmFnX3N0cmVhbV9pbmZvKGZyYWdfaW5kZXgsIGksIGlkKTsKKyAgICAgICAgaWYgKGZyYWdfc3RyZWFtX2luZm8gJiYgZnJhZ19zdHJlYW1faW5mby0+aW5kZXhfZW50cnkgPj0gMCkKKyAgICAgICAgICAgIGZyYWdfc3RyZWFtX2luZm8tPmluZGV4X2VudHJ5ICs9IGVudHJpZXM7CisgICAgfQorfQorCiBzdGF0aWMgaW50IG1vdl9yZWFkX21vb2YoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCiB7CisgICAgLy8gU2V0IGJ5IG1vdl9yZWFkX3RmaGQoKS4gbW92X3JlYWRfdHJ1bigpIHdpbGwgcmVqZWN0IGZpbGVzIG1pc3NpbmcgdGZoZC4KKyAgICBjLT5mcmFnbWVudC5mb3VuZF90ZmhkID0gMDsKKwogICAgIGlmICghYy0+aGFzX2xvb2tlZF9mb3JfbWZyYSAmJiBjLT51c2VfbWZyYV9mb3IgPiAwKSB7CiAgICAgICAgIGMtPmhhc19sb29rZWRfZm9yX21mcmEgPSAxOwotICAgICAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICAgICAgaW50IHJldDsKICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1ZFUkJPU0UsICJzdHJlYW0gaGFzIG1vb2YgYm94ZXMsIHdpbGwgbG9vayAiCiAgICAgICAgICAgICAgICAgICAgICJmb3IgYSBtZnJhXG4iKTsKQEAgLTEwOTksMjIgKzEzODgsMjIgQEAKICAgICB9CiAgICAgYy0+ZnJhZ21lbnQubW9vZl9vZmZzZXQgPSBjLT5mcmFnbWVudC5pbXBsaWNpdF9vZmZzZXQgPSBhdmlvX3RlbGwocGIpIC0gODsKICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgIm1vb2Ygb2Zmc2V0ICUiUFJJeDY0IlxuIiwgYy0+ZnJhZ21lbnQubW9vZl9vZmZzZXQpOworICAgIGMtPmZyYWdfaW5kZXguY3VycmVudCA9IHVwZGF0ZV9mcmFnX2luZGV4KGMsIGMtPmZyYWdtZW50Lm1vb2Zfb2Zmc2V0KTsKICAgICByZXR1cm4gbW92X3JlYWRfZGVmYXVsdChjLCBwYiwgYXRvbSk7CiB9CiAKIHN0YXRpYyB2b2lkIG1vdl9tZXRhZGF0YV9jcmVhdGlvbl90aW1lKEFWRGljdGlvbmFyeSAqKm1ldGFkYXRhLCBpbnQ2NF90IHRpbWUpCiB7Ci0gICAgY2hhciBidWZmZXJbMzJdOwogICAgIGlmICh0aW1lKSB7Ci0gICAgICAgIHN0cnVjdCB0bSAqcHRtLCB0bWJ1ZjsKLSAgICAgICAgdGltZV90IHRpbWV0OwogICAgICAgICBpZih0aW1lID49IDIwODI4NDQ4MDApCiAgICAgICAgICAgICB0aW1lIC09IDIwODI4NDQ4MDA7ICAvKiBzZWNvbmRzIGJldHdlZW4gMTkwNC0wMS0wMSBhbmQgRXBvY2ggKi8KLSAgICAgICAgdGltZXQgPSB0aW1lOwotICAgICAgICBwdG0gPSBnbXRpbWVfcigmdGltZXQsICZ0bWJ1Zik7Ci0gICAgICAgIGlmICghcHRtKSByZXR1cm47Ci0gICAgICAgIGlmIChzdHJmdGltZShidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJVktJW0tJWQgJUg6JU06JVMiLCBwdG0pKQotICAgICAgICAgICAgYXZfZGljdF9zZXQobWV0YWRhdGEsICJjcmVhdGlvbl90aW1lIiwgYnVmZmVyLCAwKTsKKworICAgICAgICBpZiAoKGludDY0X3QpKHRpbWUgKiAxMDAwMDAwVUxMKSAvIDEwMDAwMDAgIT0gdGltZSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgImNyZWF0aW9uX3RpbWUgaXMgbm90IHJlcHJlc2VudGFibGVcbiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYXZwcml2X2RpY3Rfc2V0X3RpbWVzdGFtcChtZXRhZGF0YSwgImNyZWF0aW9uX3RpbWUiLCB0aW1lICogMTAwMDAwMCk7CiAgICAgfQogfQogCkBAIC0xMTUzLDYgKzE0NDIsMTAgQEAKICAgICBtb3ZfbWV0YWRhdGFfY3JlYXRpb25fdGltZSgmc3QtPm1ldGFkYXRhLCBjcmVhdGlvbl90aW1lKTsKIAogICAgIHNjLT50aW1lX3NjYWxlID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoc2MtPnRpbWVfc2NhbGUgPD0gMCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgbWRoZCB0aW1lIHNjYWxlICVkLCBkZWZhdWx0aW5nIHRvIDFcbiIsIHNjLT50aW1lX3NjYWxlKTsKKyAgICAgICAgc2MtPnRpbWVfc2NhbGUgPSAxOworICAgIH0KICAgICBzdC0+ZHVyYXRpb24gPSAodmVyc2lvbiA9PSAxKSA/IGF2aW9fcmI2NChwYikgOiBhdmlvX3JiMzIocGIpOyAvKiBkdXJhdGlvbiAqLwogCiAgICAgbGFuZyA9IGF2aW9fcmIxNihwYik7IC8qIGxhbmd1YWdlICovCkBAIC0xMTY1LDYgKzE0NTgsNyBAQAogCiBzdGF0aWMgaW50IG1vdl9yZWFkX212aGQoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCiB7CisgICAgaW50IGk7CiAgICAgaW50NjRfdCBjcmVhdGlvbl90aW1lOwogICAgIGludCB2ZXJzaW9uID0gYXZpb19yOChwYik7IC8qIHZlcnNpb24gKi8KICAgICBhdmlvX3JiMjQocGIpOyAvKiBmbGFncyAqLwpAQCAtMTE3OCw3ICsxNDcyLDEwIEBACiAgICAgfQogICAgIG1vdl9tZXRhZGF0YV9jcmVhdGlvbl90aW1lKCZjLT5mYy0+bWV0YWRhdGEsIGNyZWF0aW9uX3RpbWUpOwogICAgIGMtPnRpbWVfc2NhbGUgPSBhdmlvX3JiMzIocGIpOyAvKiB0aW1lIHNjYWxlICovCi0KKyAgICBpZiAoYy0+dGltZV9zY2FsZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBtdmhkIHRpbWUgc2NhbGUgJWQsIGRlZmF1bHRpbmcgdG8gMVxuIiwgYy0+dGltZV9zY2FsZSk7CisgICAgICAgIGMtPnRpbWVfc2NhbGUgPSAxOworICAgIH0KICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInRpbWUgc2NhbGUgPSAlaVxuIiwgYy0+dGltZV9zY2FsZSk7CiAKICAgICBjLT5kdXJhdGlvbiA9ICh2ZXJzaW9uID09IDEpID8gYXZpb19yYjY0KHBiKSA6IGF2aW9fcmIzMihwYik7IC8qIGR1cmF0aW9uICovCkBAIC0xMTkyLDcgKzE0ODksMTIgQEAKIAogICAgIGF2aW9fc2tpcChwYiwgMTApOyAvKiByZXNlcnZlZCAqLwogCi0gICAgYXZpb19za2lwKHBiLCAzNik7IC8qIGRpc3BsYXkgbWF0cml4ICovCisgICAgLyogbW92aWUgZGlzcGxheSBtYXRyaXgsIHN0b3JlIGl0IGluIG1haW4gY29udGV4dCBhbmQgdXNlIGl0IGxhdGVyIG9uICovCisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBjLT5tb3ZpZV9kaXNwbGF5X21hdHJpeFtpXVswXSA9IGF2aW9fcmIzMihwYik7IC8vIDE2LjE2IGZpeGVkIHBvaW50CisgICAgICAgIGMtPm1vdmllX2Rpc3BsYXlfbWF0cml4W2ldWzFdID0gYXZpb19yYjMyKHBiKTsgLy8gMTYuMTYgZml4ZWQgcG9pbnQKKyAgICAgICAgYy0+bW92aWVfZGlzcGxheV9tYXRyaXhbaV1bMl0gPSBhdmlvX3JiMzIocGIpOyAvLyAgMi4zMCBmaXhlZCBwb2ludAorICAgIH0KIAogICAgIGF2aW9fcmIzMihwYik7IC8qIHByZXZpZXcgdGltZSAqLwogICAgIGF2aW9fcmIzMihwYik7IC8qIHByZXZpZXcgZHVyYXRpb24gKi8KQEAgLTEyMTcsMTggKzE1MTksMTggQEAKICAgICBsaXR0bGVfZW5kaWFuID0gYXZpb19yYjE2KHBiKSAmIDB4RkY7CiAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJlbmRhICVkXG4iLCBsaXR0bGVfZW5kaWFuKTsKICAgICBpZiAobGl0dGxlX2VuZGlhbiA9PSAxKSB7Ci0gICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzI0QkU6Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MyNExFOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMjRMRTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMzJCRToKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkxFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0YzMkJFOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9GMzJMRTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fRjMyTEU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fRjY0QkU6Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX0Y2NExFOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9GNjRMRTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMjcwLDQxICsxNTcyLDIxIEBACiAgICAgICAgIHVpbnQ4X3QgY29sb3JfcmFuZ2UgPSBhdmlvX3I4KHBiKSA+PiA3OwogICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgIiBmdWxsICUiUFJJdTgiIiwgY29sb3JfcmFuZ2UpOwogICAgICAgICBpZiAoY29sb3JfcmFuZ2UpCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9KUEVHOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfTVBFRzsKLSAgICAgICAgLyogMTQ0OTYtMTIgcmVmZXJlbmNlcyBKUEVHIFhSIHNwZWNzIChyYXRoZXIgdGhhbiB0aGUgbW9yZSBjb21wbGV0ZQotICAgICAgICAgKiAyMzAwMS04KSBzbyBzb21lIGFkanVzdGluZyBpcyByZXF1aXJlZCAqLwotICAgICAgICBpZiAoY29sb3JfcHJpbWFyaWVzID49IEFWQ09MX1BSSV9GSUxNKQotICAgICAgICAgICAgY29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX1VOU1BFQ0lGSUVEOwotICAgICAgICBpZiAoKGNvbG9yX3RyYyA+PSBBVkNPTF9UUkNfTElORUFSICYmCi0gICAgICAgICAgICAgY29sb3JfdHJjIDw9IEFWQ09MX1RSQ19MT0dfU1FSVCkgfHwKLSAgICAgICAgICAgIGNvbG9yX3RyYyA+PSBBVkNPTF9UUkNfQlQyMDIwXzEwKQotICAgICAgICAgICAgY29sb3JfdHJjID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEOwotICAgICAgICBpZiAoY29sb3JfbWF0cml4ID49IEFWQ09MX1NQQ19CVDIwMjBfTkNMKQotICAgICAgICAgICAgY29sb3JfbWF0cml4ID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEOwotICAgICAgICBzdC0+Y29kZWMtPmNvbG9yX3ByaW1hcmllcyA9IGNvbG9yX3ByaW1hcmllczsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2xvcl90cmMgPSBjb2xvcl90cmM7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29sb3JzcGFjZSA9IGNvbG9yX21hdHJpeDsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGNvbG9yX3BhcmFtZXRlcl90eXBlLCAibmNsYyIsIDQpKSB7Ci0gICAgICAgIC8qIGNvbG9yIHByaW1hcmllcywgVGFibGUgNC00ICovCi0gICAgICAgIHN3aXRjaCAoY29sb3JfcHJpbWFyaWVzKSB7Ci0gICAgICAgIGNhc2UgMTogc3QtPmNvZGVjLT5jb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfQlQ3MDk7IGJyZWFrOwotICAgICAgICBjYXNlIDU6IHN0LT5jb2RlYy0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX1NNUFRFMTcwTTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogc3QtPmNvZGVjLT5jb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfU01QVEUyNDBNOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICAvKiBjb2xvciB0cmFuc2ZlciwgVGFibGUgNC01ICovCi0gICAgICAgIHN3aXRjaCAoY29sb3JfdHJjKSB7Ci0gICAgICAgIGNhc2UgMTogc3QtPmNvZGVjLT5jb2xvcl90cmMgPSBBVkNPTF9UUkNfQlQ3MDk7IGJyZWFrOwotICAgICAgICBjYXNlIDc6IHN0LT5jb2RlYy0+Y29sb3JfdHJjID0gQVZDT0xfVFJDX1NNUFRFMjQwTTsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLyogY29sb3IgbWF0cml4LCBUYWJsZSA0LTYgKi8KLSAgICAgICAgc3dpdGNoIChjb2xvcl9tYXRyaXgpIHsKLSAgICAgICAgY2FzZSAxOiBzdC0+Y29kZWMtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7IGJyZWFrOwotICAgICAgICBjYXNlIDY6IHN0LT5jb2RlYy0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19CVDQ3MEJHOyBicmVhazsKLSAgICAgICAgY2FzZSA3OiBzdC0+Y29kZWMtPmNvbG9yc3BhY2UgPSBBVkNPTF9TUENfU01QVEUyNDBNOyBicmVhazsKLSAgICAgICAgfQorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX01QRUc7CiAgICAgfQorCisgICAgaWYgKCFhdl9jb2xvcl9wcmltYXJpZXNfbmFtZShjb2xvcl9wcmltYXJpZXMpKQorICAgICAgICBjb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfVU5TUEVDSUZJRUQ7CisgICAgaWYgKCFhdl9jb2xvcl90cmFuc2Zlcl9uYW1lKGNvbG9yX3RyYykpCisgICAgICAgIGNvbG9yX3RyYyA9IEFWQ09MX1RSQ19VTlNQRUNJRklFRDsKKyAgICBpZiAoIWF2X2NvbG9yX3NwYWNlX25hbWUoY29sb3JfbWF0cml4KSkKKyAgICAgICAgY29sb3JfbWF0cml4ID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEOworCisgICAgc3QtPmNvZGVjcGFyLT5jb2xvcl9wcmltYXJpZXMgPSBjb2xvcl9wcmltYXJpZXM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2xvcl90cmMgICAgICAgPSBjb2xvcl90cmM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2xvcl9zcGFjZSAgICAgPSBjb2xvcl9tYXRyaXg7CiAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJcbiIpOwogCiAgICAgcmV0dXJuIDA7CkBAIC0xMzM5LDI4ICsxNjIxLDI4IEBACiAgICAgaWYgKGRlY29kZWRfZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVU5LTk9XTiAmJiBtb3ZfZmllbGRfb3JkZXIpIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlVua25vd24gTU9WIGZpZWxkIG9yZGVyIDB4JTA0eFxuIiwgbW92X2ZpZWxkX29yZGVyKTsKICAgICB9Ci0gICAgc3QtPmNvZGVjLT5maWVsZF9vcmRlciA9IGRlY29kZWRfZmllbGRfb3JkZXI7CisgICAgc3QtPmNvZGVjcGFyLT5maWVsZF9vcmRlciA9IGRlY29kZWRfZmllbGRfb3JkZXI7CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtb3ZfcmVhbGxvY19leHRyYWRhdGEoQVZDb2RlY0NvbnRleHQgKmNvZGVjLCBNT1ZBdG9tIGF0b20pCitzdGF0aWMgaW50IG1vdl9yZWFsbG9jX2V4dHJhZGF0YShBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBNT1ZBdG9tIGF0b20pCiB7CiAgICAgaW50IGVyciA9IDA7Ci0gICAgdWludDY0X3Qgc2l6ZSA9ICh1aW50NjRfdCljb2RlYy0+ZXh0cmFkYXRhX3NpemUgKyBhdG9tLnNpemUgKyA4ICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRTsKKyAgICB1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KXBhci0+ZXh0cmFkYXRhX3NpemUgKyBhdG9tLnNpemUgKyA4ICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRTsKICAgICBpZiAoc2l6ZSA+IElOVF9NQVggfHwgKHVpbnQ2NF90KWF0b20uc2l6ZSA+IElOVF9NQVgpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIGlmICgoZXJyID0gYXZfcmVhbGxvY3AoJmNvZGVjLT5leHRyYWRhdGEsIHNpemUpKSA8IDApIHsKLSAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZwYXItPmV4dHJhZGF0YSwgc2l6ZSkpIDwgMCkgeworICAgICAgICBwYXItPmV4dHJhZGF0YV9zaXplID0gMDsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9Ci0gICAgY29kZWMtPmV4dHJhZGF0YV9zaXplID0gc2l6ZSAtIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkU7CisgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IHNpemUgLSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFOwogICAgIHJldHVybiAwOwogfQogCiAvKiBSZWFkIGEgd2hvbGUgYXRvbSBpbnRvIHRoZSBleHRyYWRhdGEgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBhdG9tIHJlYWQsIHBvc3NpYmx5IHRydW5jYXRlZCBpZiAhPSBhdG9tLnNpemUgKi8KIHN0YXRpYyBpbnQ2NF90IG1vdl9yZWFkX2F0b21faW50b19leHRyYWRhdGEoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjLCB1aW50OF90ICpidWYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgdWludDhfdCAqYnVmKQogewogICAgIGludDY0X3QgcmVzdWx0ID0gYXRvbS5zaXplOwogICAgIGludCBlcnI7CkBAIC0xMzY5LDE4ICsxNjUxLDE4IEBACiAgICAgQVZfV0wzMihidWYgKyA0LCBhdG9tLnR5cGUpOwogICAgIGVyciA9IGZmaW9fcmVhZF9zaXplKHBiLCBidWYgKyA4LCBhdG9tLnNpemUpOwogICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSAtPSBhdG9tLnNpemU7CisgICAgICAgIHBhci0+ZXh0cmFkYXRhX3NpemUgLT0gYXRvbS5zaXplOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0gZWxzZSBpZiAoZXJyIDwgYXRvbS5zaXplKSB7CiAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJ0cnVuY2F0ZWQgZXh0cmFkYXRhXG4iKTsKLSAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplIC09IGF0b20uc2l6ZSAtIGVycjsKKyAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSAtPSBhdG9tLnNpemUgLSBlcnI7CiAgICAgICAgIHJlc3VsdCA9IGVycjsKICAgICB9CiAgICAgbWVtc2V0KGJ1ZiArIDggKyBlcnIsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8qIEZJWE1FIG1vZGlmeSBxZG0yL3N2cTMvaDI2NCBkZWNvZGVycyB0byB0YWtlIGZ1bGwgYXRvbSBhcyBleHRyYWRhdGEgKi8KKy8qIEZJWE1FIG1vZGlmeSBRRE0yL1NWUTMvSC4yNjQgZGVjb2RlcnMgdG8gdGFrZSBmdWxsIGF0b20gYXMgZXh0cmFkYXRhICovCiBzdGF0aWMgaW50IG1vdl9yZWFkX2V4dHJhZGF0YShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKQogewpAQCAtMTM5MiwxNSArMTY3NCwxNSBAQAogICAgICAgICByZXR1cm4gMDsKICAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gY29kZWNfaWQpCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gY29kZWNfaWQpCiAgICAgICAgIHJldHVybiAwOyAvKiB1bmV4cGVjdGVkIGNvZGVjX2lkIC0gZG9uJ3QgbWVzcyB3aXRoIGV4dHJhZGF0YSAqLwogCi0gICAgb3JpZ2luYWxfc2l6ZSA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemU7Ci0gICAgZXJyID0gbW92X3JlYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgYXRvbSk7CisgICAgb3JpZ2luYWxfc2l6ZSA9IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemU7CisgICAgZXJyID0gbW92X3JlYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgYXRvbSk7CiAgICAgaWYgKGVycikKICAgICAgICAgcmV0dXJuIGVycjsKIAotICAgIGVyciA9ICBtb3ZfcmVhZF9hdG9tX2ludG9fZXh0cmFkYXRhKGMsIHBiLCBhdG9tLCBzdC0+Y29kZWMsICBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIG9yaWdpbmFsX3NpemUpOworICAgIGVyciA9ICBtb3ZfcmVhZF9hdG9tX2ludG9fZXh0cmFkYXRhKGMsIHBiLCBhdG9tLCBzdC0+Y29kZWNwYXIsICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIG9yaWdpbmFsX3NpemUpOwogICAgIGlmIChlcnIgPCAwKQogICAgICAgICByZXR1cm4gZXJyOwogICAgIHJldHVybiAwOyAvLyBOb3RlOiB0aGlzIGlzIHRoZSBvcmlnaW5hbCBiZWhhdmlvciB0byBpZ25vcmUgdHJ1bmNhdGlvbi4KQEAgLTE0NDAsMTAgKzE3MjIsMTAgQEAKICAgICBpbnQgcmV0ID0gbW92X3JlYWRfZXh0cmFkYXRhKGMsIHBiLCBhdG9tLCBBVl9DT0RFQ19JRF9UQVJHQV9ZMjE2KTsKIAogICAgIGlmICghcmV0ICYmIGMtPmZjLT5uYl9zdHJlYW1zID49IDEpIHsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMtMV0tPmNvZGVjOwotICAgICAgICBpZiAoYXZjdHgtPmV4dHJhZGF0YV9zaXplID49IDQwKSB7Ci0gICAgICAgICAgICBhdmN0eC0+aGVpZ2h0ID0gQVZfUkIxNigmYXZjdHgtPmV4dHJhZGF0YVszNl0pOwotICAgICAgICAgICAgYXZjdHgtPndpZHRoICA9IEFWX1JCMTYoJmF2Y3R4LT5leHRyYWRhdGFbMzhdKTsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdLT5jb2RlY3BhcjsKKyAgICAgICAgaWYgKHBhci0+ZXh0cmFkYXRhX3NpemUgPj0gNDApIHsKKyAgICAgICAgICAgIHBhci0+aGVpZ2h0ID0gQVZfUkIxNigmcGFyLT5leHRyYWRhdGFbMzZdKTsKKyAgICAgICAgICAgIHBhci0+d2lkdGggID0gQVZfUkIxNigmcGFyLT5leHRyYWRhdGFbMzhdKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0OwpAQCAtMTQ1MiwxNSArMTczNCwzOCBAQAogc3RhdGljIGludCBtb3ZfcmVhZF9hcmVzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQogewogICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA+PSAxKSB7Ci0gICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdLT5jb2RlYzsKLSAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnVicsICdpJywgJ24nKSAmJgotICAgICAgICAgICAgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdLT5jb2RlY3BhcjsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfdGFnID09IE1LVEFHKCdBJywgJ1YnLCAnaScsICduJykgJiYKKyAgICAgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJgogICAgICAgICAgICAgYXRvbS5zaXplID4gMTEpIHsKKyAgICAgICAgICAgIGludCBjaWQ7CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDEwKTsKKyAgICAgICAgICAgIGNpZCA9IGF2aW9fcmIxNihwYik7CiAgICAgICAgICAgICAvKiBGb3IgQVZJRCBBVkNJNTAsIGZvcmNlIHdpZHRoIG9mIDE0NDAgdG8gYmUgYWJsZSB0byBzZWxlY3QgdGhlIGNvcnJlY3QgU1BTIGFuZCBQUFMgKi8KLSAgICAgICAgICAgIGlmIChhdmlvX3JiMTYocGIpID09IDB4ZDRkKQotICAgICAgICAgICAgICAgIGNvZGVjLT53aWR0aCA9IDE0NDA7CisgICAgICAgICAgICBpZiAoY2lkID09IDB4ZDRkIHx8IGNpZCA9PSAweGQ0ZSkKKyAgICAgICAgICAgICAgICBwYXItPndpZHRoID0gMTQ0MDsKICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9IGVsc2UgaWYgKChwYXItPmNvZGVjX3RhZyA9PSBNS1RBRygnQScsICdWJywgJ2QnLCAnMScpIHx8CisgICAgICAgICAgICAgICAgICAgIHBhci0+Y29kZWNfdGFnID09IE1LVEFHKCdBJywgJ1YnLCAnaicsICcyJykgfHwKKyAgICAgICAgICAgICAgICAgICAgcGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ0EnLCAnVicsICdkJywgJ24nKSkgJiYKKyAgICAgICAgICAgICAgICAgICBhdG9tLnNpemUgPj0gMjQpIHsKKyAgICAgICAgICAgIGludCBudW0sIGRlbjsKKyAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMTIpOworICAgICAgICAgICAgbnVtID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIGRlbiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBpZiAobnVtIDw9IDAgfHwgZGVuIDw9IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBzd2l0Y2ggKGF2aW9fcmIzMihwYikpIHsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBpZiAoZGVuID49IElOVF9NQVggLyAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBkZW4gKj0gMjsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXS0+ZGlzcGxheV9hc3BlY3RfcmF0aW8ubnVtID0gbnVtOworICAgICAgICAgICAgICAgIGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdLT5kaXNwbGF5X2FzcGVjdF9yYXRpby5kZW4gPSBkZW47CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xNDczLDI4ICsxNzc4LDI4IEBACiAgICAgaW50IGxlbmd0aCA9IDA7CiAgICAgdWludDY0X3Qgb3JpZ2luYWxfc2l6ZTsKICAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPj0gMSkgewotICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXS0+Y29kZWM7Ci0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdLT5jb2RlY3BhcjsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICBpZiAoYXRvbS5zaXplID09IDE2KSB7Ci0gICAgICAgICAgICBvcmlnaW5hbF9zaXplID0gY29kZWMtPmV4dHJhZGF0YV9zaXplOwotICAgICAgICAgICAgcmV0ID0gbW92X3JlYWxsb2NfZXh0cmFkYXRhKGNvZGVjLCBhdG9tKTsKKyAgICAgICAgICAgIG9yaWdpbmFsX3NpemUgPSBwYXItPmV4dHJhZGF0YV9zaXplOworICAgICAgICAgICAgcmV0ID0gbW92X3JlYWxsb2NfZXh0cmFkYXRhKHBhciwgYXRvbSk7CiAgICAgICAgICAgICBpZiAoIXJldCkgewotICAgICAgICAgICAgICAgIGxlbmd0aCA9ICBtb3ZfcmVhZF9hdG9tX2ludG9fZXh0cmFkYXRhKGMsIHBiLCBhdG9tLCBjb2RlYywgY29kZWMtPmV4dHJhZGF0YSArIG9yaWdpbmFsX3NpemUpOworICAgICAgICAgICAgICAgIGxlbmd0aCA9ICBtb3ZfcmVhZF9hdG9tX2ludG9fZXh0cmFkYXRhKGMsIHBiLCBhdG9tLCBwYXIsIHBhci0+ZXh0cmFkYXRhICsgb3JpZ2luYWxfc2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSBhdG9tLnNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCByYW5nZV92YWx1ZSA9IGNvZGVjLT5leHRyYWRhdGFbb3JpZ2luYWxfc2l6ZSArIDE5XTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCByYW5nZV92YWx1ZSA9IHBhci0+ZXh0cmFkYXRhW29yaWdpbmFsX3NpemUgKyAxOV07CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocmFuZ2VfdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfTVBFRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+Y29sb3JfcmFuZ2UgPSBBVkNPTF9SQU5HRV9NUEVHOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5jb2xvcl9yYW5nZSA9IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmNvbG9yX3JhbmdlID0gQVZDT0xfUkFOR0VfSlBFRzsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLCAiaWdub3JlZCB1bmtub3duIGFjbHIgdmFsdWUgKCVkKVxuIiwgcmFuZ2VfdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmZfZGxvZyhjLCAiY29sb3JfcmFuZ2U6ICVkXG4iLCBjb2RlYy0+Y29sb3JfcmFuZ2UpOworICAgICAgICAgICAgICAgICAgICBmZl9kbG9nKGMsICJjb2xvcl9yYW5nZTogJWRcbiIsIHBhci0+Y29sb3JfcmFuZ2UpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAvKiBGb3Igc29tZSByZWFzb24gdGhlIHdob2xlIGF0b20gd2FzIG5vdCBhZGRlZCB0byB0aGUgZXh0cmFkYXRhICovCiAgICAgICAgICAgICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiYWNsciBub3QgZGVjb2RlZCAtIGluY29tcGxldGUgYXRvbVxuIik7CkBAIC0xNTI3LDE2ICsxODMyLDE2IEBACiAgICAgaWYgKCh1aW50NjRfdClhdG9tLnNpemUgPiAoMTw8MzApKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1FETTIgfHwKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE1DIHx8Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVgpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yIHx8CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUURNQyB8fAorICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NQRUVYKSB7CiAgICAgICAgIC8vIHBhc3MgYWxsIGZybWEgYXRvbSB0byBjb2RlYywgbmVlZGVkIGF0IGxlYXN0IGZvciBRRE1DIGFuZCBRRE0yCi0gICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgICAgIHJldCA9IGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgYXRvbS5zaXplKTsKKyAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICAgICAgcmV0ID0gZmZfZ2V0X2V4dHJhZGF0YShjLT5mYywgc3QtPmNvZGVjcGFyLCBwYiwgYXRvbS5zaXplKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0gZWxzZSBpZiAoYXRvbS5zaXplID4gOCkgeyAvKiB0byByZWFkIGZybWEsIGVzZHMgYXRvbXMgKi8KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUxBQyAmJiBhdG9tLnNpemUgPj0gMjQpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUxBQyAmJiBhdG9tLnNpemUgPj0gMjQpIHsKICAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcjsKICAgICAgICAgICAgIHJldCA9IGZmaW9fZW5zdXJlX3NlZWtiYWNrKHBiLCA4KTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtMTU0OCwxNiArMTg1MywxNiBAQAogICAgICAgICAgICAgICAgICYmIGJ1ZmZlciA+PiAzMiA+PSA4KSB7CiAgICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAtOCk7CiAgICAgICAgICAgICAgICAgYXRvbS5zaXplICs9IDg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKSB7CiAjZGVmaW5lIEFMQUNfRVhUUkFEQVRBX1NJWkUgMzYKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooQUxBQ19FWFRSQURBVEFfU0laRSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgICAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KEFMQUNfRVhUUkFEQVRBX1NJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBBTEFDX0VYVFJBREFUQV9TSVpFOwotICAgICAgICAgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgICAgLCBBTEFDX0VYVFJBREFUQV9TSVpFKTsKLSAgICAgICAgICAgICAgICBBVl9XQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgNCwgTUtUQUcoJ2EnLCdsJywnYScsJ2MnKSk7Ci0gICAgICAgICAgICAgICAgQVZfV0I2NChzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDEyLCBidWZmZXIpOwotICAgICAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAyMCwgMTYpOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSBBTEFDX0VYVFJBREFUQV9TSVpFOworICAgICAgICAgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgICAgLCBBTEFDX0VYVFJBREFUQV9TSVpFKTsKKyAgICAgICAgICAgICAgICBBVl9XQjMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgNCwgTUtUQUcoJ2EnLCdsJywnYScsJ2MnKSk7CisgICAgICAgICAgICAgICAgQVZfV0I2NChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDEyLCBidWZmZXIpOworICAgICAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAyMCwgMTYpOwogICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgYXRvbS5zaXplIC0gMjQpOwogICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgfQpAQCAtMTU5NCwxMiArMTg5OSwxMiBAQAogICAgICAgICBpZiAodHlwZSA9PSBNS1RBRygnZicsJ2knLCdlJywnbCcpICYmIHNpemUgPT0gYXRvbS5zaXplKQogICAgICAgICAgICAgcmV0dXJuIG1vdl9yZWFkX2RlZmF1bHQoYywgcGIsIGF0b20pOwogICAgIH0KLSAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA+IDEgJiYgc3QtPmNvZGVjLT5leHRyYWRhdGEpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDEgJiYgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpIHsKICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLCAiaWdub3JpbmcgbXVsdGlwbGUgZ2xibFxuIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgIHJldCA9IGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgYXRvbS5zaXplKTsKKyAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgIHJldCA9IGZmX2dldF9leHRyYWRhdGEoYy0+ZmMsIHN0LT5jb2RlY3BhciwgcGIsIGF0b20uc2l6ZSk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTE2MjQsOCArMTkyOSw4IEBACiAgICAgICAgIHJldHVybiAwOwogCiAgICAgYXZpb19zZWVrKHBiLCA2LCBTRUVLX0NVUik7Ci0gICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICByZXQgPSBmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGF0b20uc2l6ZSAtIDcpOworICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgcmV0ID0gZmZfZ2V0X2V4dHJhZGF0YShjLT5mYywgc3QtPmNvZGVjcGFyLCBwYiwgYXRvbS5zaXplIC0gNyk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKQEAgLTE2NTIsOCArMTk1Nyw4IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgYXZpb19za2lwKHBiLCA0MCk7Ci0gICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICByZXQgPSBmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIGF0b20uc2l6ZSAtIDQwKTsKKyAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgIHJldCA9IGZmX2dldF9leHRyYWRhdGEoYy0+ZmMsIHN0LT5jb2RlY3BhciwgcGIsIGF0b20uc2l6ZSAtIDQwKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtMTY5OSwyNiArMjAwNCwxNCBAQAogCiAgICAgc2MtPmNodW5rX2NvdW50ID0gaTsKIAotICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAicmVhY2hlZCBlb2YsIGNvcnJ1cHRlZCBTVENPIGF0b21cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qKgotICogQ29tcHV0ZSBjb2RlYyBpZCBmb3IgJ2xwY20nIHRhZy4KLSAqIFNlZSBDb3JlQXVkaW9UeXBlcyBhbmQgQXVkaW9TdHJlYW1CYXNpY0Rlc2NyaXB0aW9uIGF0IEFwcGxlLgotICovCi1lbnVtIEFWQ29kZWNJRCBmZl9tb3ZfZ2V0X2xwY21fY29kZWNfaWQoaW50IGJwcywgaW50IGZsYWdzKQotewotICAgIC8qIGxwY20gZmxhZ3M6Ci0gICAgICogMHgxID0gZmxvYXQKLSAgICAgKiAweDIgPSBiaWctZW5kaWFuCi0gICAgICogMHg0ID0gc2lnbmVkCi0gICAgICovCi0gICAgcmV0dXJuIGZmX2dldF9wY21fY29kZWNfaWQoYnBzLCBmbGFncyAmIDEsIGZsYWdzICYgMiwgZmxhZ3MgJiA0ID8gLTEgOiAwKTsKLX0KLQogc3RhdGljIGludCBtb3ZfY29kZWNfaWQoQVZTdHJlYW0gKnN0LCB1aW50MzJfdCBmb3JtYXQpCiB7CiAgICAgaW50IGlkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdmF1ZGlvX3RhZ3MsIGZvcm1hdCk7CkBAIC0xNzI4LDI2ICsyMDIxLDI2IEBACiAgICAgICAgICAoZm9ybWF0ICYgMHhGRkZGKSA9PSAnVCcgKyAoJ1MnIDw8IDgpKSkKICAgICAgICAgaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfd2F2X3RhZ3MsIGF2X2Jzd2FwMzIoZm9ybWF0KSAmIDB4RkZGRik7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyAmJiBpZCA+IDApIHsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyAmJgotICAgICAgICAgICAgICAgLyogc2tpcCBvbGQgYXNmIG1wZWc0IHRhZyAqLworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGlkID4gMCkgeworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICAgICAvKiBza2lwIG9sZCBBU0YgTVBFRy00IHRhZyAqLwogICAgICAgICAgICAgICAgZm9ybWF0ICYmIGZvcm1hdCAhPSBNS1RBRygnbScsJ3AnLCc0JywncycpKSB7CiAgICAgICAgIGlkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGZvcm1hdCk7CiAgICAgICAgIGlmIChpZCA8PSAwKQogICAgICAgICAgICAgaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIGZvcm1hdCk7CiAgICAgICAgIGlmIChpZCA+IDApCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSB8fAotICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSAmJgotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpKSB7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSB8fAorICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSAmJgorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpKSB7CiAgICAgICAgICAgICBpZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19tb3ZzdWJ0aXRsZV90YWdzLCBmb3JtYXQpOwogICAgICAgICAgICAgaWYgKGlkID4gMCkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBmb3JtYXQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBmb3JtYXQ7CiAKICAgICByZXR1cm4gaWQ7CiB9CkBAIC0xNzU1LDcgKzIwNDgsNyBAQAogc3RhdGljIHZvaWQgbW92X3BhcnNlX3N0c2RfdmlkZW8oTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0LCBNT1ZTdHJlYW1Db250ZXh0ICpzYykKIHsKLSAgICB1aW50OF90IGNvZGVjX25hbWVbMzJdOworICAgIHVpbnQ4X3QgY29kZWNfbmFtZVszMl0gPSB7IDAgfTsKICAgICBpbnQ2NF90IHN0c2Rfc3RhcnQ7CiAgICAgdW5zaWduZWQgaW50IGxlbjsKIApAQCAtMTc2OSw4ICsyMDYyLDggQEAKICAgICBhdmlvX3JiMzIocGIpOyAvKiB0ZW1wb3JhbCBxdWFsaXR5ICovCiAgICAgYXZpb19yYjMyKHBiKTsgLyogc3BhdGlhbCBxdWFsaXR5ICovCiAKLSAgICBzdC0+Y29kZWMtPndpZHRoICA9IGF2aW9fcmIxNihwYik7IC8qIHdpZHRoICovCi0gICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOyAvKiBoZWlnaHQgKi8KKyAgICBzdC0+Y29kZWNwYXItPndpZHRoICA9IGF2aW9fcmIxNihwYik7IC8qIHdpZHRoICovCisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOyAvKiBoZWlnaHQgKi8KIAogICAgIGF2aW9fcmIzMihwYik7IC8qIGhvcml6IHJlc29sdXRpb24gKi8KICAgICBhdmlvX3JiMzIocGIpOyAvKiB2ZXJ0IHJlc29sdXRpb24gKi8KQEAgLTE3ODgsMjIgKzIwODEsMjIgQEAKICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImVuY29kZXIiLCBjb2RlY19uYW1lLCAwKTsKIAogICAgIC8qIGNvZGVjX3RhZyBZVjEyIHRyaWdnZXJzIGFuIFVWIHN3YXAgaW4gcmF3ZGVjLmMgKi8KLSAgICBpZiAoIW1lbWNtcChjb2RlY19uYW1lLCAiUGxhbmFyIFknQ2JDciA4LWJpdCA0OjI6MCIsIDI1KSkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IE1LVEFHKCdJJywgJzQnLCAnMicsICcwJyk7Ci0gICAgICAgIHN0LT5jb2RlYy0+d2lkdGggJj0gfjE7Ci0gICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICY9IH4xOworICAgIGlmICghc3RybmNtcChjb2RlY19uYW1lLCAiUGxhbmFyIFknQ2JDciA4LWJpdCA0OjI6MCIsIDI1KSkgeworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IE1LVEFHKCdJJywgJzQnLCAnMicsICcwJyk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggJj0gfjE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICY9IH4xOwogICAgIH0KLSAgICAvKiBGbGFzaCBNZWRpYSBTZXJ2ZXIgdXNlcyB0YWcgSDI2MyB3aXRoIFNvcmVuc29uIFNwYXJrICovCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCdIJywnMicsJzYnLCczJykgJiYKLSAgICAgICAgIW1lbWNtcChjb2RlY19uYW1lLCAiU29yZW5zb24gSDI2MyIsIDEzKSkKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMVjE7CisgICAgLyogRmxhc2ggTWVkaWEgU2VydmVyIHVzZXMgdGFnIEguMjYzIHdpdGggU29yZW5zb24gU3BhcmsgKi8KKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ0gnLCcyJywnNicsJzMnKSAmJgorICAgICAgICAhc3RybmNtcChjb2RlY19uYW1lLCAiU29yZW5zb24gSDI2MyIsIDEzKSkKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMVjE7CiAKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmIxNihwYik7IC8qIGRlcHRoICovCisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JiMTYocGIpOyAvKiBkZXB0aCAqLwogCiAgICAgYXZpb19zZWVrKHBiLCBzdHNkX3N0YXJ0LCBTRUVLX1NFVCk7CiAKLSAgICBpZiAoZmZfZ2V0X3F0cGFsZXR0ZShzdC0+Y29kZWMtPmNvZGVjX2lkLCBwYiwgc2MtPnBhbGV0dGUpKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICY9IDB4MUY7CisgICAgaWYgKGZmX2dldF9xdHBhbGV0dGUoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCwgcGIsIHNjLT5wYWxldHRlKSkgeworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAmPSAweDFGOwogICAgICAgICBzYy0+aGFzX3BhbGV0dGUgPSAxOwogICAgIH0KIH0KQEAgLTE4MTgsMTQgKzIxMTEsMTQgQEAKICAgICBhdmlvX3JiMTYocGIpOyAvKiByZXZpc2lvbiBsZXZlbCAqLwogICAgIGF2aW9fcmIzMihwYik7IC8qIHZlbmRvciAqLwogCi0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgICAgICAgPSBhdmlvX3JiMTYocGIpOyAvKiBjaGFubmVsIGNvdW50ICovCi0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JiMTYocGIpOyAvKiBzYW1wbGUgc2l6ZSAqLwotICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAiYXVkaW8gY2hhbm5lbHMgJWRcbiIsIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gYXZpb19yYjE2KHBiKTsgLyogY2hhbm5lbCBjb3VudCAqLworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19yYjE2KHBiKTsgLyogc2FtcGxlIHNpemUgKi8KKyAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgImF1ZGlvIGNoYW5uZWxzICVkXG4iLCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKIAogICAgIHNjLT5hdWRpb19jaWQgPSBhdmlvX3JiMTYocGIpOwogICAgIGF2aW9fcmIxNihwYik7IC8qIHBhY2tldCBzaXplID0gMCAqLwogCi0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9ICgoYXZpb19yYjMyKHBiKSA+PiAxNikpOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSAoKGF2aW9fcmIzMihwYikgPj4gMTYpKTsKIAogICAgIC8vIFJlYWQgUVQgdmVyc2lvbiAxIGZpZWxkcy4gSW4gdmVyc2lvbiAwIHRoZXNlIGRvIG5vdCBleGlzdC4KICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInZlcnNpb24gPSVkLCBpc29tID0lZFxuIiwgdmVyc2lvbiwgYy0+aXNvbSk7CkBAIC0xODM5LDIyICsyMTMyLDIyIEBACiAgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBieXRlcyBwZXIgc2FtcGxlICovCiAgICAgICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAyKSB7CiAgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBzaXplb2Ygc3RydWN0IG9ubHkgKi8KLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdl9pbnQyZG91YmxlKGF2aW9fcmI2NChwYikpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBhdmlvX3JiMzIocGIpOwogICAgICAgICAgICAgYXZpb19yYjMyKHBiKTsgLyogYWx3YXlzIDB4N0YwMDAwMDAgKi8KLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19yYjMyKHBiKTsKIAogICAgICAgICAgICAgZmxhZ3MgPSBhdmlvX3JiMzIocGIpOyAvKiBscGNtIGZvcm1hdCBzcGVjaWZpYyBmbGFnICovCiAgICAgICAgICAgICBzYy0+Ynl0ZXNfcGVyX2ZyYW1lICAgPSBhdmlvX3JiMzIocGIpOwogICAgICAgICAgICAgc2MtPnNhbXBsZXNfcGVyX2ZyYW1lID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBNS1RBRygnbCcsJ3AnLCdjJywnbScpKQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPQotICAgICAgICAgICAgICAgICAgICBmZl9tb3ZfZ2V0X2xwY21fY29kZWNfaWQoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ2wnLCdwJywnYycsJ20nKSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0KKyAgICAgICAgICAgICAgICAgICAgZmZfbW92X2dldF9scGNtX2NvZGVjX2lkKHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwogICAgICAgICB9CiAgICAgICAgIGlmICh2ZXJzaW9uID09IDAgfHwgKHZlcnNpb24gPT0gMSAmJiBzYy0+YXVkaW9fY2lkICE9IC0yKSkgewogICAgICAgICAgICAgLyogY2FuJ3QgY29ycmVjdGx5IGhhbmRsZSB2YXJpYWJsZSBzaXplZCBwYWNrZXQgYXMgYXVkaW8gdW5pdCAqLwotICAgICAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKICAgICAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVAyOgogICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDM6CiAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CkBAIC0xODY0LDQzICsyMTU3LDQzIEBACiAgICAgfQogCiAgICAgaWYgKHNjLT5mb3JtYXQgPT0gMCkgewotICAgICAgICBpZiAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gOCkKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBtb3ZfY29kZWNfaWQoc3QsIE1LVEFHKCdyJywnYScsJ3cnLCcgJykpOwotICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBtb3ZfY29kZWNfaWQoc3QsIE1LVEFHKCd0JywndycsJ28nLCdzJykpOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gOCkKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBtb3ZfY29kZWNfaWQoc3QsIE1LVEFHKCdyJywnYScsJ3cnLCcgJykpOworICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBtb3ZfY29kZWNfaWQoc3QsIE1LVEFHKCd0JywndycsJ28nLCdzJykpOwogICAgIH0KIAotICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgIHN3aXRjaCAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkgewogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M4OgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1U4OgotICAgICAgICBpZiAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRToKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDgpCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1M4OwotICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAyNCkKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFID8KKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDgpCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1M4OworICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAyNCkKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFID8KICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9QQ01fUzI0QkUgOiBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7Ci0gICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDMyKQotICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFID8KKyAgICAgICAgZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMzIpCisgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2QkUgPwogICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX1BDTV9TMzJCRSA6IEFWX0NPREVDX0lEX1BDTV9TMzJMRTsKICAgICAgICAgYnJlYWs7CiAgICAgLyogc2V0IHZhbHVlcyBmb3Igb2xkIGZvcm1hdCBiZWZvcmUgc3RzZCB2ZXJzaW9uIDEgYXBwZWFyZWQgKi8KICAgICBjYXNlIEFWX0NPREVDX0lEX01BQ0UzOgogICAgICAgICBzYy0+c2FtcGxlc19wZXJfZnJhbWUgPSA2OwotICAgICAgICBzYy0+Ynl0ZXNfcGVyX2ZyYW1lICAgPSAyICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgc2MtPmJ5dGVzX3Blcl9mcmFtZSAgID0gMiAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfTUFDRTY6CiAgICAgICAgIHNjLT5zYW1wbGVzX3Blcl9mcmFtZSA9IDY7Ci0gICAgICAgIHNjLT5ieXRlc19wZXJfZnJhbWUgICA9IDEgKiBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICBzYy0+Ynl0ZXNfcGVyX2ZyYW1lICAgPSAxICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQ6CiAgICAgICAgIHNjLT5zYW1wbGVzX3Blcl9mcmFtZSA9IDY0OwotICAgICAgICBzYy0+Ynl0ZXNfcGVyX2ZyYW1lICAgPSAzNCAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgIHNjLT5ieXRlc19wZXJfZnJhbWUgICA9IDM0ICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9HU006CiAgICAgICAgIHNjLT5zYW1wbGVzX3Blcl9mcmFtZSA9IDE2MDsKQEAgLTE5MTAsMTAgKzIyMDMsMTAgQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgYml0c19wZXJfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICBiaXRzX3Blcl9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogICAgIGlmIChiaXRzX3Blcl9zYW1wbGUpIHsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIHNjLT5zYW1wbGVfc2l6ZSA9IChiaXRzX3Blcl9zYW1wbGUgPj4gMykgKiBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJpdHNfcGVyX3NhbXBsZTsKKyAgICAgICAgc2MtPnNhbXBsZV9zaXplID0gKGJpdHNfcGVyX3NhbXBsZSA+PiAzKSAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAgICAgfQogfQogCkBAIC0xOTI1LDEwICsyMjE4LDEwIEBACiAgICAgLy8gY29sb3IsIGZvbnRzLCBhbmQgZGVmYXVsdCBzdHlsZXMsIHNvIGZha2UgYW4gYXRvbSB0byByZWFkIGl0CiAgICAgTU9WQXRvbSBmYWtlX2F0b20gPSB7IC5zaXplID0gc2l6ZSB9OwogICAgIC8vIG1wNHMgY29udGFpbnMgYSByZWd1bGFyIGVzZHMgYXRvbQotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyAhPSBBVl9STDMyKCJtcDRzIikpCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICE9IEFWX1JMMzIoIm1wNHMiKSkKICAgICAgICAgbW92X3JlYWRfZ2xibChjLCBwYiwgZmFrZV9hdG9tKTsKLSAgICBzdC0+Y29kZWMtPndpZHRoICA9IHNjLT53aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHNjLT5oZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSBzYy0+d2lkdGg7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBzYy0+aGVpZ2h0OwogfQogCiBzdGF0aWMgdWludDMyX3QgeXV2X3RvX3JnYmEodWludDMyX3QgeWNiY3IpCkBAIC0xOTUwLDE1ICsyMjQzLDE1IEBACiBzdGF0aWMgaW50IG1vdl9yZXdyaXRlX2R2ZF9zdWJfZXh0cmFkYXRhKEFWU3RyZWFtICpzdCkKIHsKICAgICBjaGFyIGJ1ZlsyNTZdID0gezB9OwotICAgIHVpbnQ4X3QgKnNyYyA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhOworICAgIHVpbnQ4X3QgKnNyYyA9IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhOwogICAgIGludCBpOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgIT0gNjQpCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgIT0gNjQpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+d2lkdGggPiAwICYmICBzdC0+Y29kZWMtPmhlaWdodCA+IDApCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+d2lkdGggPiAwICYmICBzdC0+Y29kZWNwYXItPmhlaWdodCA+IDApCiAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJzaXplOiAlZHglZFxuIiwKLSAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHQpOworICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoLCBzdC0+Y29kZWNwYXItPmhlaWdodCk7CiAgICAgYXZfc3RybGNhdChidWYsICJwYWxldHRlOiAiLCBzaXplb2YoYnVmKSk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewpAQCAtMTk3MSwxMyArMjI2NCwxMyBAQAogICAgIGlmIChhdl9zdHJsY2F0KGJ1ZiwgIlxuIiwgc2l6ZW9mKGJ1ZikpID49IHNpemVvZihidWYpKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHN0cmxlbihidWYpICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSkKKyAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihzdHJsZW4oYnVmKSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IHN0cmxlbihidWYpOwotICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgYnVmLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gc3RybGVuKGJ1Zik7CisgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBidWYsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xOTg4LDM5ICsyMjgxLDQ4IEBACiB7CiAgICAgaW50IHJldDsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBNS1RBRygndCcsJ20nLCdjJywnZCcpKSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykpIHsKICAgICAgICAgaWYgKChpbnQpc2l6ZSAhPSBzaXplKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICAgICByZXQgPSBmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIHNpemUpOworICAgICAgICByZXQgPSBmZl9nZXRfZXh0cmFkYXRhKGMtPmZjLCBzdC0+Y29kZWNwYXIsIHBiLCBzaXplKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBpZiAoc2l6ZSA+IDE2KSB7CiAgICAgICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICp0bWNkX2N0eCA9IHN0LT5wcml2X2RhdGE7CiAgICAgICAgICAgICBpbnQgdmFsOwotICAgICAgICAgICAgdmFsID0gQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDQpOworICAgICAgICAgICAgdmFsID0gQVZfUkIzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDQpOwogICAgICAgICAgICAgdG1jZF9jdHgtPnRtY2RfZmxhZ3MgPSB2YWw7Ci0gICAgICAgICAgICBpZiAodmFsICYgMSkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmZsYWdzMiB8PSBBVl9DT0RFQ19GTEFHMl9EUk9QX0ZSQU1FX1RJTUVDT0RFOwotICAgICAgICAgICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuID0gc3QtPmNvZGVjLT5leHRyYWRhdGFbMTZdOyAvKiBudW1iZXIgb2YgZnJhbWUgKi8KLSAgICAgICAgICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlLm51bSA9IDE7CisgICAgICAgICAgICBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtID0gc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMTZdOyAvKiBudW1iZXIgb2YgZnJhbWUgKi8KKyAgICAgICAgICAgIHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4gPSAxOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZSA9IGF2X2ludl9xKHN0LT5hdmdfZnJhbWVfcmF0ZSk7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogICAgICAgICAgICAgLyogYWRqdXN0IGZvciBwZXIgZnJhbWUgZHVyIGluIGNvdW50ZXIgbW9kZSAqLwogICAgICAgICAgICAgaWYgKHRtY2RfY3R4LT50bWNkX2ZsYWdzICYgMHgwMDA4KSB7Ci0gICAgICAgICAgICAgICAgaW50IHRpbWVzY2FsZSA9IEFWX1JCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA4KTsKLSAgICAgICAgICAgICAgICBpbnQgZnJhbWVkdXIgPSBBVl9SQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMTIpOworICAgICAgICAgICAgICAgIGludCB0aW1lc2NhbGUgPSBBVl9SQjMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgOCk7CisgICAgICAgICAgICAgICAgaW50IGZyYW1lZHVyID0gQVZfUkIzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDEyKTsKKyAgICAgICAgICAgICAgICBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtICo9IHRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuICo9IGZyYW1lZHVyOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuICo9IHRpbWVzY2FsZTsKICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0gKj0gZnJhbWVkdXI7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHNpemUgPiAzMCkgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbiA9IEFWX1JCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAxOCk7IC8qIG5hbWUgYXRvbSBsZW5ndGggKi8KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBVl9SQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMjIpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbiA9IEFWX1JCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAxOCk7IC8qIG5hbWUgYXRvbSBsZW5ndGggKi8KKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBBVl9SQjMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMjIpOwogICAgICAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gQVZfUkIzMigibmFtZSIpICYmIChpbnQ2NF90KXNpemUgPj0gKGludDY0X3QpbGVuICsgMTgpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3RyX3NpemUgPSBBVl9SQjE2KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMjYpOyAvKiBzdHJpbmcgbGVuZ3RoICovCisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHN0cl9zaXplID0gQVZfUkIxNihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDI2KTsgLyogc3RyaW5nIGxlbmd0aCAqLwogICAgICAgICAgICAgICAgICAgICBpZiAoc3RyX3NpemUgPiAwICYmIHNpemUgPj0gKGludClzdHJfc2l6ZSArIDI2KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpyZWVsX25hbWUgPSBhdl9tYWxsb2Moc3RyX3NpemUgKyAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVlbF9uYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocmVlbF9uYW1lLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDMwLCBzdHJfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocmVlbF9uYW1lLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDMwLCBzdHJfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZWVsX25hbWVbc3RyX3NpemVdID0gMDsgLyogQWRkIG51bGwgdGVybWluYXRvciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9uJ3QgYWRkIHJlZWxfbmFtZSBpZiBlbXRweSBzdHJpbmcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqcmVlbF9uYW1lID09IDApIHsKQEAgLTIwNDIsMTIgKzIzNDQsMTIgQEAKIHN0YXRpYyBpbnQgbW92X2ZpbmFsaXplX3N0c2RfY29kZWMoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIE1PVlN0cmVhbUNvbnRleHQgKnNjKQogewotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCi0gICAgICAgICFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICYmIHNjLT50aW1lX3NjYWxlID4gMSkKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNjLT50aW1lX3NjYWxlOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICYmIHNjLT50aW1lX3NjYWxlID4gMSkKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHNjLT50aW1lX3NjYWxlOwogCiAgICAgLyogc3BlY2lhbCBjb2RlYyBwYXJhbWV0ZXJzIGhhbmRsaW5nICovCi0gICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAjaWYgQ09ORklHX0RWX0RFTVVYRVIKICAgICBjYXNlIEFWX0NPREVDX0lEX0RWQVVESU86CiAgICAgICAgIGMtPmR2X2ZjdHggPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7CkBAIC0yMDYxLDMzICsyMzYzLDMzIEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CiAgICAgICAgIHNjLT5kdl9hdWRpb19jb250YWluZXIgPSAxOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOwogICAgICAgICBicmVhazsKICNlbmRpZgogICAgIC8qIG5vIGlmZGVmIHNpbmNlIHBhcmFtZXRlcnMgYXJlIGFsd2F5cyB0aG9zZSAqLwogICAgIGNhc2UgQVZfQ09ERUNfSURfUUNFTFA6Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKICAgICAgICAgLy8gZm9yY2Ugc2FtcGxlIHJhdGUgZm9yIHFjZWxwIHdoZW4gbm90IHN0b3JlZCBpbiBtb3YKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnICE9IE1LVEFHKCdRJywnYycsJ2wnLCdwJykpCi0gICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICE9IE1LVEFHKCdRJywnYycsJ2wnLCdwJykpCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gODAwMDsKICAgICAgICAgLy8gRklYTUU6IFdoeSBpcyB0aGUgZm9sbG93aW5nIG5lZWRlZCBmb3Igc29tZSBmaWxlcz8KICAgICAgICAgc2MtPnNhbXBsZXNfcGVyX2ZyYW1lID0gMTYwOwogICAgICAgICBpZiAoIXNjLT5ieXRlc19wZXJfZnJhbWUpCiAgICAgICAgICAgICBzYy0+Ynl0ZXNfcGVyX2ZyYW1lID0gMzU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfQU1SX05COgotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gMTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IDE7CiAgICAgICAgIC8qIGZvcmNlIHNhbXBsZSByYXRlIGZvciBhbXIsIHN0c2QgaW4gM2dwIGRvZXMgbm90IHN0b3JlIHNhbXBsZSByYXRlICovCi0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA4MDAwOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gODAwMDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BTVJfV0I6Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSAxOwotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSAxOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gMTYwMDA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfTVAyOgogICAgIGNhc2UgQVZfQ09ERUNfSURfTVAzOgogICAgICAgICAvKiBmb3JjZSB0eXBlIGFmdGVyIHN0c2QgZm9yIG0xYSBoZGxyICovCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0dTTToKICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX01TOgpAQCAtMjA5NiwxOCArMjM5OCwyMCBAQAogICAgIGNhc2UgQVZfQ09ERUNfSURfTUFDRTM6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9NQUNFNjoKICAgICBjYXNlIEFWX0NPREVDX0lEX1FETTI6Ci0gICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBzYy0+Ynl0ZXNfcGVyX2ZyYW1lOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gc2MtPmJ5dGVzX3Blcl9mcmFtZTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BTEFDOgotICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9PSAzNikgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IEFWX1JCOCAoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAyMSk7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gQVZfUkIzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDMyKTsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPT0gMzYpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBBVl9SQjggKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMjEpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IEFWX1JCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAzMik7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BQzM6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9FQUMzOgogICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKICAgICBjYXNlIEFWX0NPREVDX0lEX1ZDMToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZQODoKKyAgICBjYXNlIEFWX0NPREVDX0lEX1ZQOToKICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC0yMTI0LDYgKzI0MjgsMTIgQEAKIAogICAgIGlmIChjb2RlY190YWcgJiYKICAgICAgICAgIChjb2RlY190YWcgIT0gZm9ybWF0ICYmCisgICAgICAgICAgLy8gQVZJRCAxOjEgc2FtcGxlcyB3aXRoIGRpZmZlcmluZyBkYXRhIGZvcm1hdCBhbmQgY29kZWMgdGFnIGV4aXN0CisgICAgICAgICAgKGNvZGVjX3RhZyAhPSBBVl9STDMyKCJBVjF4IikgfHwgZm9ybWF0ICE9IEFWX1JMMzIoIkFWdXAiKSkgJiYKKyAgICAgICAgICAvLyBwcm9yZXMgaXMgYWxsb3dlZCB0byBoYXZlIGRpZmZlcmluZyBkYXRhIGZvcm1hdCBhbmQgY29kZWMgdGFnCisgICAgICAgICAgY29kZWNfdGFnICE9IEFWX1JMMzIoImFwY24iKSAmJiBjb2RlY190YWcgIT0gQVZfUkwzMigiYXBjaCIpICYmCisgICAgICAgICAgLy8gc28gaXMgZHYgKHNpZ2gpCisgICAgICAgICAgY29kZWNfdGFnICE9IEFWX1JMMzIoImR2cHAiKSAmJiBjb2RlY190YWcgIT0gQVZfUkwzMigiZHZjcCIpICYmCiAgICAgICAgICAgKGMtPmZjLT52aWRlb19jb2RlY19pZCA/IHZpZGVvX2NvZGVjX2lkICE9IGMtPmZjLT52aWRlb19jb2RlY19pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb2RlY190YWcgIT0gTUtUQUcoJ2onLCdwJywnZScsJ2cnKSkpKSB7CiAgICAgICAgIC8qIE11bHRpcGxlIGZvdXJjYywgd2Ugc2tpcCBKUEVHLiBUaGlzIGlzIG5vdCBjb3JyZWN0LCB3ZSBzaG91bGQKQEAgLTIxMzQsMTEgKzI0NDQsNiBAQAogICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOwogICAgICAgICByZXR1cm4gMTsKICAgICB9Ci0gICAgaWYgKCBjb2RlY190YWcgPT0gQVZfUkwzMigiYXZjMSIpIHx8Ci0gICAgICAgICBjb2RlY190YWcgPT0gQVZfUkwzMigiaHZjMSIpIHx8Ci0gICAgICAgICBjb2RlY190YWcgPT0gQVZfUkwzMigiaGV2MSIpCi0gICAgKQotICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiQ29uY2F0ZW5hdGVkIEguMjY0IG9yIEguMjY1IG1pZ2h0IG5vdCBwbGF5IGNvcnJlY3RseS5cbiIpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yMTQ5LDggKzI0NTQsNyBAQAogICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOwogICAgIGludCBwc2V1ZG9fc3RyZWFtX2lkOwogCi0gICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgYXZfYXNzZXJ0MCAoYy0+ZmMtPm5iX3N0cmVhbXMgPj0gMSk7CiAgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKICAgICBzYyA9IHN0LT5wcml2X2RhdGE7CiAKQEAgLTIxNjIsNDEgKzI0NjYsNDcgQEAKICAgICAgICAgaW50IHJldCwgZHJlZl9pZCA9IDE7CiAgICAgICAgIE1PVkF0b20gYSA9IHsgQVZfUkwzMigic3RzZCIpIH07CiAgICAgICAgIGludDY0X3Qgc3RhcnRfcG9zID0gYXZpb190ZWxsKHBiKTsKLSAgICAgICAgaW50NjRfdCBzaXplID0gYXZpb19yYjMyKHBiKTsgLyogc2l6ZSAqLworICAgICAgICBpbnQ2NF90IHNpemUgICAgPSBhdmlvX3JiMzIocGIpOyAvKiBzaXplICovCiAgICAgICAgIHVpbnQzMl90IGZvcm1hdCA9IGF2aW9fcmwzMihwYik7IC8qIGRhdGEgZm9ybWF0ICovCiAKICAgICAgICAgaWYgKHNpemUgPj0gMTYpIHsKICAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIHJlc2VydmVkICovCiAgICAgICAgICAgICBhdmlvX3JiMTYocGIpOyAvKiByZXNlcnZlZCAqLwogICAgICAgICAgICAgZHJlZl9pZCA9IGF2aW9fcmIxNihwYik7Ci0gICAgICAgIH1lbHNlIGlmIChzaXplIDw9IDcpewotICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHNpemUgJSJQUklkNjQiIGluIHN0c2RcbiIsIHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKHNpemUgPD0gNykgeworICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgImludmFsaWQgc2l6ZSAlIlBSSWQ2NCIgaW4gc3RzZFxuIiwgc2l6ZSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtb3Zfc2tpcF9tdWx0aXBsZV9zdHNkKGMsIHBiLCBzdC0+Y29kZWMtPmNvZGVjX3RhZywgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC0gKGF2aW9fdGVsbChwYikgLSBzdGFydF9wb3MpKSkKKyAgICAgICAgaWYgKG1vdl9za2lwX211bHRpcGxlX3N0c2QoYywgcGIsIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnLCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLSAoYXZpb190ZWxsKHBiKSAtIHN0YXJ0X3BvcykpKSB7CisgICAgICAgICAgICBzYy0+c3RzZF9jb3VudCsrOwogICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotICAgICAgICBzYy0+cHNldWRvX3N0cmVhbV9pZCA9IHN0LT5jb2RlYy0+Y29kZWNfdGFnID8gLTEgOiBwc2V1ZG9fc3RyZWFtX2lkOworICAgICAgICBzYy0+cHNldWRvX3N0cmVhbV9pZCA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID8gLTEgOiBwc2V1ZG9fc3RyZWFtX2lkOwogICAgICAgICBzYy0+ZHJlZl9pZD0gZHJlZl9pZDsKICAgICAgICAgc2MtPmZvcm1hdCA9IGZvcm1hdDsKIAogICAgICAgICBpZCA9IG1vdl9jb2RlY19pZChzdCwgZm9ybWF0KTsKIAogICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwKLSAgICAgICAgICAgICAgICJzaXplPSUiUFJJZDY0IiA0Q0M9ICVjJWMlYyVjLzB4JTA4eCBjb2RlY190eXBlPSVkXG4iLCBzaXplLAotICAgICAgICAgICAgICAgIChmb3JtYXQgPj4gMCkgJiAweGZmLCAoZm9ybWF0ID4+IDgpICYgMHhmZiwgKGZvcm1hdCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgIChmb3JtYXQgPj4gMjQpICYgMHhmZiwgZm9ybWF0LCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICAgICAgICAgInNpemU9JSJQUklkNjQiIDRDQz0lcyBjb2RlY190eXBlPSVkXG4iLCBzaXplLAorICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cihmb3JtYXQpLCBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpOwogCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGU9PUFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGlkOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlPT1BVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBpZDsKICAgICAgICAgICAgIG1vdl9wYXJzZV9zdHNkX3ZpZGVvKGMsIHBiLCBzdCwgc2MpOwotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZT09QVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gaWQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlPT1BVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBpZDsKICAgICAgICAgICAgIG1vdl9wYXJzZV9zdHNkX2F1ZGlvKGMsIHBiLCBzdCwgc2MpOwotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZT09QVZNRURJQV9UWVBFX1NVQlRJVExFKXsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBpZDsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgcmF0ZSAlZFxuIiwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlPT1BVk1FRElBX1RZUEVfU1VCVElUTEUpeworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGlkOwogICAgICAgICAgICAgbW92X3BhcnNlX3N0c2Rfc3VidGl0bGUoYywgcGIsIHN0LCBzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLSAoYXZpb190ZWxsKHBiKSAtIHN0YXJ0X3BvcykpOwogICAgICAgICB9IGVsc2UgewpAQCAtMjIxMiwyMyArMjUyMiw5MyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0gZWxzZSBpZiAoYS5zaXplID4gMCkKICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgYS5zaXplKTsKKworICAgICAgICBpZiAoc2MtPmV4dHJhZGF0YSAmJiBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgaW50IGV4dHJhX3NpemUgPSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplOworCisgICAgICAgICAgICAvKiBNb3ZlIHRoZSBjdXJyZW50IHN0cmVhbSBleHRyYWRhdGEgdG8gdGhlIHN0cmVhbSBjb250ZXh0IG9uZS4gKi8KKyAgICAgICAgICAgIHNjLT5leHRyYWRhdGFfc2l6ZVtwc2V1ZG9fc3RyZWFtX2lkXSA9IGV4dHJhX3NpemU7CisgICAgICAgICAgICBzYy0+ZXh0cmFkYXRhW3BzZXVkb19zdHJlYW1faWRdID0gYXZfbWFsbG9jKGV4dHJhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgIGlmICghc2MtPmV4dHJhZGF0YVtwc2V1ZG9fc3RyZWFtX2lkXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbWVtY3B5KHNjLT5leHRyYWRhdGFbcHNldWRvX3N0cmVhbV9pZF0sIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBleHRyYV9zaXplKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgfQorICAgICAgICBzYy0+c3RzZF9jb3VudCsrOwogICAgIH0KIAotICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAicmVhY2hlZCBlb2YsIGNvcnJ1cHRlZCBTVFNEIGF0b21cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQogCi0gICAgcmV0dXJuIG1vdl9maW5hbGl6ZV9zdHNkX2NvZGVjKGMsIHBiLCBzdCwgc2MpOworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1vdl9yZWFkX3N0c2QoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCiB7Ci0gICAgaW50IGVudHJpZXM7CisgICAgQVZTdHJlYW0gKnN0OworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIGludCByZXQsIGVudHJpZXM7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zIC0gMV07CisgICAgc2MgPSBzdC0+cHJpdl9kYXRhOwogCiAgICAgYXZpb19yOChwYik7IC8qIHZlcnNpb24gKi8KICAgICBhdmlvX3JiMjQocGIpOyAvKiBmbGFncyAqLwogICAgIGVudHJpZXMgPSBhdmlvX3JiMzIocGIpOwogCi0gICAgcmV0dXJuIGZmX21vdl9yZWFkX3N0c2RfZW50cmllcyhjLCBwYiwgZW50cmllcyk7CisgICAgLyogRWFjaCBlbnRyeSBjb250YWlucyBhIHNpemUgKDQgYnl0ZXMpIGFuZCBmb3JtYXQgKDQgYnl0ZXMpLiAqLworICAgIGlmIChlbnRyaWVzIDw9IDAgfHwgZW50cmllcyA+IGF0b20uc2l6ZSAvIDgpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIFNUU0QgZW50cmllcyAlZFxuIiwgZW50cmllcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIGlmIChzYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkR1cGxpY2F0ZSBzdHNkIGZvdW5kIGluIHRoaXMgdHJhY2suXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogUHJlcGFyZSBzcGFjZSBmb3IgaG9zdGluZyBtdWx0aXBsZSBleHRyYWRhdGEuICovCisgICAgc2MtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3pfYXJyYXkoZW50cmllcywgc2l6ZW9mKCpzYy0+ZXh0cmFkYXRhKSk7CisgICAgaWYgKCFzYy0+ZXh0cmFkYXRhKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc2MtPmV4dHJhZGF0YV9zaXplID0gYXZfbWFsbG9jel9hcnJheShlbnRyaWVzLCBzaXplb2YoKnNjLT5leHRyYWRhdGFfc2l6ZSkpOworICAgIGlmICghc2MtPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IGZmX21vdl9yZWFkX3N0c2RfZW50cmllcyhjLCBwYiwgZW50cmllcyk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8qIFJlc3RvcmUgYmFjayB0aGUgcHJpbWFyeSBleHRyYWRhdGEuICovCisgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gc2MtPmV4dHJhZGF0YV9zaXplWzBdOworICAgIGlmIChzYy0+ZXh0cmFkYXRhX3NpemVbMF0pIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHNjLT5leHRyYWRhdGFfc2l6ZVswXSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBzYy0+ZXh0cmFkYXRhWzBdLCBzYy0+ZXh0cmFkYXRhX3NpemVbMF0pOworICAgIH0KKworICAgIHJldHVybiBtb3ZfZmluYWxpemVfc3RzZF9jb2RlYyhjLCBwYiwgc3QsIHNjKTsKK2ZhaWw6CisgICAgaWYgKHNjLT5leHRyYWRhdGEpIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzYy0+c3RzZF9jb3VudDsgaisrKQorICAgICAgICAgICAgYXZfZnJlZXAoJnNjLT5leHRyYWRhdGFbal0pOworICAgIH0KKworICAgIGF2X2ZyZWVwKCZzYy0+ZXh0cmFkYXRhKTsKKyAgICBhdl9mcmVlcCgmc2MtPmV4dHJhZGF0YV9zaXplKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IG1vdl9yZWFkX3N0c2MoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCkBAIC0yMjQ2LDggKzI2MjYsMTAgQEAKICAgICBhdmlvX3JiMjQocGIpOyAvKiBmbGFncyAqLwogCiAgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKCh1aW50NjRfdCllbnRyaWVzICogMTIgKyA0ID4gYXRvbS5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAidHJhY2tbJWldLnN0c2MuZW50cmllcyA9ICVpXG4iLCBjLT5mYy0+bmJfc3RyZWFtcy0xLCBlbnRyaWVzKTsKKyAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInRyYWNrWyV1XS5zdHNjLmVudHJpZXMgPSAldVxuIiwgYy0+ZmMtPm5iX3N0cmVhbXMgLSAxLCBlbnRyaWVzKTsKIAogICAgIGlmICghZW50cmllcykKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMjY2LDEzICsyNjQ4LDU5IEBACiAgICAgfQogCiAgICAgc2MtPnN0c2NfY291bnQgPSBpOworICAgIGZvciAoaSA9IHNjLT5zdHNjX2NvdW50IC0gMTsgaSA8IFVJTlRfTUFYOyBpLS0pIHsKKyAgICAgICAgaW50NjRfdCBmaXJzdF9taW4gPSBpICsgMTsKKyAgICAgICAgaWYgKChpKzEgPCBzYy0+c3RzY19jb3VudCAmJiBzYy0+c3RzY19kYXRhW2ldLmZpcnN0ID49IHNjLT5zdHNjX2RhdGFbaSsxXS5maXJzdCkgfHwKKyAgICAgICAgICAgIChpID4gMCAmJiBzYy0+c3RzY19kYXRhW2ldLmZpcnN0IDw9IHNjLT5zdHNjX2RhdGFbaS0xXS5maXJzdCkgfHwKKyAgICAgICAgICAgIHNjLT5zdHNjX2RhdGFbaV0uZmlyc3QgPCBmaXJzdF9taW4gfHwKKyAgICAgICAgICAgIHNjLT5zdHNjX2RhdGFbaV0uY291bnQgPCAxIHx8CisgICAgICAgICAgICBzYy0+c3RzY19kYXRhW2ldLmlkIDwgMSkgeworICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIlNUU0MgZW50cnkgJWQgaXMgaW52YWxpZCAoZmlyc3Q9JWQgY291bnQ9JWQgaWQ9JWQpXG4iLCBpLCBzYy0+c3RzY19kYXRhW2ldLmZpcnN0LCBzYy0+c3RzY19kYXRhW2ldLmNvdW50LCBzYy0+c3RzY19kYXRhW2ldLmlkKTsKKyAgICAgICAgICAgIGlmIChpKzEgPj0gc2MtPnN0c2NfY291bnQpIHsKKyAgICAgICAgICAgICAgICBzYy0+c3RzY19kYXRhW2ldLmZpcnN0ID0gRkZNQVgoc2MtPnN0c2NfZGF0YVtpXS5maXJzdCwgZmlyc3RfbWluKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgc2MtPnN0c2NfZGF0YVtpXS5maXJzdCA8PSBzYy0+c3RzY19kYXRhW2ktMV0uZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIHNjLT5zdHNjX2RhdGFbaV0uZmlyc3QgPSBGRk1JTihzYy0+c3RzY19kYXRhW2ktMV0uZmlyc3QgKyAxTEwsIElOVF9NQVgpOworICAgICAgICAgICAgICAgIHNjLT5zdHNjX2RhdGFbaV0uY291bnQgPSBGRk1BWChzYy0+c3RzY19kYXRhW2ldLmNvdW50LCAxKTsKKyAgICAgICAgICAgICAgICBzYy0+c3RzY19kYXRhW2ldLmlkICAgID0gRkZNQVgoc2MtPnN0c2NfZGF0YVtpXS5pZCwgMSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9hc3NlcnQwKHNjLT5zdHNjX2RhdGFbaSsxXS5maXJzdCA+PSAyKTsKKyAgICAgICAgICAgIC8vIFdlIHJlcGxhY2UgdGhpcyBlbnRyeSBieSB0aGUgbmV4dCB2YWxpZAorICAgICAgICAgICAgc2MtPnN0c2NfZGF0YVtpXS5maXJzdCA9IHNjLT5zdHNjX2RhdGFbaSsxXS5maXJzdCAtIDE7CisgICAgICAgICAgICBzYy0+c3RzY19kYXRhW2ldLmNvdW50ID0gc2MtPnN0c2NfZGF0YVtpKzFdLmNvdW50OworICAgICAgICAgICAgc2MtPnN0c2NfZGF0YVtpXS5pZCAgICA9IHNjLT5zdHNjX2RhdGFbaSsxXS5pZDsKKyAgICAgICAgfQorICAgIH0KIAotICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAicmVhY2hlZCBlb2YsIGNvcnJ1cHRlZCBTVFNDIGF0b21cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IG1vdl9zdHNjX2luZGV4X3ZhbGlkKHVuc2lnbmVkIGludCBpbmRleCwgdW5zaWduZWQgaW50IGNvdW50KQoreworICAgIHJldHVybiBpbmRleCA8IGNvdW50IC0gMTsKK30KKworLyogQ29tcHV0ZSB0aGUgc2FtcGxlcyB2YWx1ZSBmb3IgdGhlIHN0c2MgZW50cnkgYXQgdGhlIGdpdmVuIGluZGV4LiAqLworc3RhdGljIGlubGluZSBpbnQ2NF90IG1vdl9nZXRfc3RzY19zYW1wbGVzKE1PVlN0cmVhbUNvbnRleHQgKnNjLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisgICAgaW50IGNodW5rX2NvdW50OworCisgICAgaWYgKG1vdl9zdHNjX2luZGV4X3ZhbGlkKGluZGV4LCBzYy0+c3RzY19jb3VudCkpCisgICAgICAgIGNodW5rX2NvdW50ID0gc2MtPnN0c2NfZGF0YVtpbmRleCArIDFdLmZpcnN0IC0gc2MtPnN0c2NfZGF0YVtpbmRleF0uZmlyc3Q7CisgICAgZWxzZSB7CisgICAgICAgIC8vIFZhbGlkYXRpb24gZm9yIHN0c2MgLyBzdGNvICBoYXBwZW5zIGVhcmxpZXIgaW4gbW92X3JlYWRfc3RzYyArIG1vdl9yZWFkX3RyYWsuCisgICAgICAgIGF2X2Fzc2VydDAoc2MtPnN0c2NfZGF0YVtpbmRleF0uZmlyc3QgPD0gc2MtPmNodW5rX2NvdW50KTsKKyAgICAgICAgY2h1bmtfY291bnQgPSBzYy0+Y2h1bmtfY291bnQgLSAoc2MtPnN0c2NfZGF0YVtpbmRleF0uZmlyc3QgLSAxKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2MtPnN0c2NfZGF0YVtpbmRleF0uY291bnQgKiAoaW50NjRfdCljaHVua19jb3VudDsKK30KKwogc3RhdGljIGludCBtb3ZfcmVhZF9zdHBzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQogewogICAgIEFWU3RyZWFtICpzdDsKQEAgLTIyOTcsMTMgKzI3MjUsMTQgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzICYmICFwYi0+ZW9mX3JlYWNoZWQ7IGkrKykgewogICAgICAgICBzYy0+c3Rwc19kYXRhW2ldID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgLy9hdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInN0cHMgJWRcbiIsIHNjLT5zdHBzX2RhdGFbaV0pOwogICAgIH0KIAogICAgIHNjLT5zdHBzX2NvdW50ID0gaTsKIAotICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAicmVhY2hlZCBlb2YsIGNvcnJ1cHRlZCBTVFBTIGF0b21cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yMzI0LDEyICsyNzUzLDEyIEBACiAKICAgICBlbnRyaWVzID0gYXZpb19yYjMyKHBiKTsKIAotICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAia2V5ZnJhbWVfY291bnQgPSAlZFxuIiwgZW50cmllcyk7CisgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJrZXlmcmFtZV9jb3VudCA9ICV1XG4iLCBlbnRyaWVzKTsKIAogICAgIGlmICghZW50cmllcykKICAgICB7CiAgICAgICAgIHNjLT5rZXlmcmFtZV9hYnNlbnQgPSAxOwotICAgICAgICBpZiAoIXN0LT5uZWVkX3BhcnNpbmcgJiYgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgaWYgKCFzdC0+bmVlZF9wYXJzaW5nICYmIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMjM0NSwxMyArMjc3NCwxNCBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXMgJiYgIXBiLT5lb2ZfcmVhY2hlZDsgaSsrKSB7CiAgICAgICAgIHNjLT5rZXlmcmFtZXNbaV0gPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAvL2F2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAia2V5ZnJhbWVzW109JWRcbiIsIHNjLT5rZXlmcmFtZXNbaV0pOwogICAgIH0KIAogICAgIHNjLT5rZXlmcmFtZV9jb3VudCA9IGk7CiAKLSAgICBpZiAocGItPmVvZl9yZWFjaGVkKQorICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgInJlYWNoZWQgZW9mLCBjb3JydXB0ZWQgU1RTUyBhdG9tXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQpAQCAtMjM4NiwxNCArMjgxNiwxNCBAQAogICAgIH0KICAgICBlbnRyaWVzID0gYXZpb19yYjMyKHBiKTsKIAotICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAic2FtcGxlX3NpemUgPSAlZCBzYW1wbGVfY291bnQgPSAlZFxuIiwgc2MtPnNhbXBsZV9zaXplLCBlbnRyaWVzKTsKKyAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInNhbXBsZV9zaXplID0gJXUgc2FtcGxlX2NvdW50ID0gJXVcbiIsIHNjLT5zYW1wbGVfc2l6ZSwgZW50cmllcyk7CiAKICAgICBzYy0+c2FtcGxlX2NvdW50ID0gZW50cmllczsKICAgICBpZiAoc2FtcGxlX3NpemUpCiAgICAgICAgIHJldHVybiAwOwogCiAgICAgaWYgKGZpZWxkX3NpemUgIT0gNCAmJiBmaWVsZF9zaXplICE9IDggJiYgZmllbGRfc2l6ZSAhPSAxNiAmJiBmaWVsZF9zaXplICE9IDMyKSB7Ci0gICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgZmllbGQgc2l6ZSAlZFxuIiwgZmllbGRfc2l6ZSk7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgZmllbGQgc2l6ZSAldVxuIiwgZmllbGRfc2l6ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIApAQCAtMjQzNSw4ICsyODY1LDEwIEBACiAKICAgICBhdl9mcmVlKGJ1Zik7CiAKLSAgICBpZiAocGItPmVvZl9yZWFjaGVkKQorICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgInJlYWNoZWQgZW9mLCBjb3JydXB0ZWQgU1RTWiBhdG9tXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KIAogICAgIHJldHVybiAwOwogfQpAQCAtMjQ0NSw3ICsyODc3LDcgQEAKIHsKICAgICBBVlN0cmVhbSAqc3Q7CiAgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7Ci0gICAgdW5zaWduZWQgaW50IGksIGVudHJpZXM7CisgICAgdW5zaWduZWQgaW50IGksIGVudHJpZXMsIGFsbG9jX3NpemUgPSAwOwogICAgIGludDY0X3QgZHVyYXRpb249MDsKICAgICBpbnQ2NF90IHRvdGFsX3NhbXBsZV9jb3VudD0wOwogCkBAIC0yNDU4LDI4ICsyODkwLDMzIEBACiAgICAgYXZpb19yYjI0KHBiKTsgLyogZmxhZ3MgKi8KICAgICBlbnRyaWVzID0gYXZpb19yYjMyKHBiKTsKIAotICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAidHJhY2tbJWldLnN0dHMuZW50cmllcyA9ICVpXG4iLAorICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAidHJhY2tbJXVdLnN0dHMuZW50cmllcyA9ICV1XG4iLAogICAgICAgICAgICAgYy0+ZmMtPm5iX3N0cmVhbXMtMSwgZW50cmllcyk7CiAKICAgICBpZiAoc2MtPnN0dHNfZGF0YSkKICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIkR1cGxpY2F0ZWQgU1RUUyBhdG9tXG4iKTsKLSAgICBhdl9mcmVlKHNjLT5zdHRzX2RhdGEpOworICAgIGF2X2ZyZWVwKCZzYy0+c3R0c19kYXRhKTsKICAgICBzYy0+c3R0c19jb3VudCA9IDA7Ci0gICAgc2MtPnN0dHNfZGF0YSA9IGF2X21hbGxvY19hcnJheShlbnRyaWVzLCBzaXplb2YoKnNjLT5zdHRzX2RhdGEpKTsKLSAgICBpZiAoIXNjLT5zdHRzX2RhdGEpCisgICAgaWYgKGVudHJpZXMgPj0gSU5UX01BWCAvIHNpemVvZigqc2MtPnN0dHNfZGF0YSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspIHsKICAgICAgICAgaW50IHNhbXBsZV9kdXJhdGlvbjsKLSAgICAgICAgaW50IHNhbXBsZV9jb3VudDsKKyAgICAgICAgdW5zaWduZWQgaW50IHNhbXBsZV9jb3VudDsKKyAgICAgICAgdW5zaWduZWQgaW50IG1pbl9lbnRyaWVzID0gRkZNSU4oRkZNQVgoaSArIDEsIDEwMjQgKiAxMDI0KSwgZW50cmllcyk7CisgICAgICAgIE1PVlN0dHMgKnN0dHNfZGF0YSA9IGF2X2Zhc3RfcmVhbGxvYyhzYy0+c3R0c19kYXRhLCAmYWxsb2Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9lbnRyaWVzICogc2l6ZW9mKCpzYy0+c3R0c19kYXRhKSk7CisgICAgICAgIGlmICghc3R0c19kYXRhKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmc2MtPnN0dHNfZGF0YSk7CisgICAgICAgICAgICBzYy0+c3R0c19jb3VudCA9IDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIHNjLT5zdHRzX2NvdW50ID0gbWluX2VudHJpZXM7CisgICAgICAgIHNjLT5zdHRzX2RhdGEgPSBzdHRzX2RhdGE7CiAKICAgICAgICAgc2FtcGxlX2NvdW50PWF2aW9fcmIzMihwYik7CiAgICAgICAgIHNhbXBsZV9kdXJhdGlvbiA9IGF2aW9fcmIzMihwYik7CiAKLSAgICAgICAgaWYgKHNhbXBsZV9jb3VudCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGVfY291bnQ9JWRcbiIsIHNhbXBsZV9jb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQogICAgICAgICBzYy0+c3R0c19kYXRhW2ldLmNvdW50PSBzYW1wbGVfY291bnQ7CiAgICAgICAgIHNjLT5zdHRzX2RhdGFbaV0uZHVyYXRpb249IHNhbXBsZV9kdXJhdGlvbjsKIApAQCAtMjQ5MiwxNyArMjkyOSwyNCBAQAogICAgICAgICAgICAgJiYgdG90YWxfc2FtcGxlX2NvdW50ID4gMTAwCiAgICAgICAgICAgICAmJiBzYW1wbGVfZHVyYXRpb24vMTAgPiBkdXJhdGlvbiAvIHRvdGFsX3NhbXBsZV9jb3VudCkKICAgICAgICAgICAgIHNhbXBsZV9kdXJhdGlvbiA9IGR1cmF0aW9uIC8gdG90YWxfc2FtcGxlX2NvdW50OwotICAgICAgICBkdXJhdGlvbis9KGludDY0X3Qpc2FtcGxlX2R1cmF0aW9uKnNhbXBsZV9jb3VudDsKKyAgICAgICAgZHVyYXRpb24rPShpbnQ2NF90KXNhbXBsZV9kdXJhdGlvbioodWludDY0X3Qpc2FtcGxlX2NvdW50OwogICAgICAgICB0b3RhbF9zYW1wbGVfY291bnQrPXNhbXBsZV9jb3VudDsKICAgICB9CiAKICAgICBzYy0+c3R0c19jb3VudCA9IGk7CiAKLSAgICBzYy0+ZHVyYXRpb25fZm9yX2ZwcyAgKz0gZHVyYXRpb247Ci0gICAgc2MtPm5iX2ZyYW1lc19mb3JfZnBzICs9IHRvdGFsX3NhbXBsZV9jb3VudDsKKyAgICBpZiAoZHVyYXRpb24gPiAwICYmCisgICAgICAgIGR1cmF0aW9uIDw9IElOVDY0X01BWCAtIHNjLT5kdXJhdGlvbl9mb3JfZnBzICYmCisgICAgICAgIHRvdGFsX3NhbXBsZV9jb3VudCA8PSBJTlQ2NF9NQVggLSBzYy0+bmJfZnJhbWVzX2Zvcl9mcHMKKyAgICApIHsKKyAgICAgICAgc2MtPmR1cmF0aW9uX2Zvcl9mcHMgICs9IGR1cmF0aW9uOworICAgICAgICBzYy0+bmJfZnJhbWVzX2Zvcl9mcHMgKz0gdG90YWxfc2FtcGxlX2NvdW50OworICAgIH0KIAotICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAicmVhY2hlZCBlb2YsIGNvcnJ1cHRlZCBTVFRTIGF0b21cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQogCiAgICAgc3QtPm5iX2ZyYW1lcz0gdG90YWxfc2FtcGxlX2NvdW50OwogICAgIGlmIChkdXJhdGlvbikKQEAgLTI1MjYsNyArMjk3MCw3IEBACiB7CiAgICAgQVZTdHJlYW0gKnN0OwogICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOwotICAgIHVuc2lnbmVkIGludCBpLCBlbnRyaWVzOworICAgIHVuc2lnbmVkIGludCBpLCBlbnRyaWVzLCBjdHRzX2NvdW50ID0gMDsKIAogICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMjUzNywxNCArMjk4MSwxNCBAQAogICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCiAgICAgZW50cmllcyA9IGF2aW9fcmIzMihwYik7CiAKLSAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInRyYWNrWyVpXS5jdHRzLmVudHJpZXMgPSAlaVxuIiwgYy0+ZmMtPm5iX3N0cmVhbXMtMSwgZW50cmllcyk7CisgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJ0cmFja1sldV0uY3R0cy5lbnRyaWVzID0gJXVcbiIsIGMtPmZjLT5uYl9zdHJlYW1zIC0gMSwgZW50cmllcyk7CiAKICAgICBpZiAoIWVudHJpZXMpCiAgICAgICAgIHJldHVybiAwOwogICAgIGlmIChlbnRyaWVzID49IFVJTlRfTUFYIC8gc2l6ZW9mKCpzYy0+Y3R0c19kYXRhKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgYXZfZnJlZXAoJnNjLT5jdHRzX2RhdGEpOwotICAgIHNjLT5jdHRzX2RhdGEgPSBhdl9yZWFsbG9jKE5VTEwsIGVudHJpZXMgKiBzaXplb2YoKnNjLT5jdHRzX2RhdGEpKTsKKyAgICBzYy0+Y3R0c19kYXRhID0gYXZfZmFzdF9yZWFsbG9jKE5VTEwsICZzYy0+Y3R0c19hbGxvY2F0ZWRfc2l6ZSwgZW50cmllcyAqIHNpemVvZigqc2MtPmN0dHNfZGF0YSkpOwogICAgIGlmICghc2MtPmN0dHNfZGF0YSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIApAQCAtMjU1Miw4ICsyOTk2LDE1IEBACiAgICAgICAgIGludCBjb3VudCAgICA9YXZpb19yYjMyKHBiKTsKICAgICAgICAgaW50IGR1cmF0aW9uID1hdmlvX3JiMzIocGIpOwogCi0gICAgICAgIHNjLT5jdHRzX2RhdGFbaV0uY291bnQgICA9IGNvdW50OwotICAgICAgICBzYy0+Y3R0c19kYXRhW2ldLmR1cmF0aW9uPSBkdXJhdGlvbjsKKyAgICAgICAgaWYgKGNvdW50IDw9IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLAorICAgICAgICAgICAgICAgICAgICJpZ25vcmluZyBDVFRTIGVudHJ5IHdpdGggY291bnQ9JWQgZHVyYXRpb249JWRcbiIsCisgICAgICAgICAgICAgICAgICAgY291bnQsIGR1cmF0aW9uKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYWRkX2N0dHNfZW50cnkoJnNjLT5jdHRzX2RhdGEsICZjdHRzX2NvdW50LCAmc2MtPmN0dHNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBkdXJhdGlvbik7CiAKICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJjb3VudD0lZCwgZHVyYXRpb249JWRcbiIsCiAgICAgICAgICAgICAgICAgY291bnQsIGR1cmF0aW9uKTsKQEAgLTI1NjksMTAgKzMwMjAsMTIgQEAKICAgICAgICAgICAgIG1vdl91cGRhdGVfZHRzX3NoaWZ0KHNjLCBkdXJhdGlvbik7CiAgICAgfQogCi0gICAgc2MtPmN0dHNfY291bnQgPSBpOworICAgIHNjLT5jdHRzX2NvdW50ID0gY3R0c19jb3VudDsKIAotICAgIGlmIChwYi0+ZW9mX3JlYWNoZWQpCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAicmVhY2hlZCBlb2YsIGNvcnJ1cHRlZCBDVFRTIGF0b21cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQogCiAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJkdHMgc2hpZnQgJWRcbiIsIHNjLT5kdHNfc2hpZnQpOwogCkBAIC0yNjE4LDcgKzMwNzEsNjQwIEBACiAKICAgICBzYy0+cmFwX2dyb3VwX2NvdW50ID0gaTsKIAotICAgIHJldHVybiBwYi0+ZW9mX3JlYWNoZWQgPyBBVkVSUk9SX0VPRiA6IDA7CisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAicmVhY2hlZCBlb2YsIGNvcnJ1cHRlZCBTQkdQIGF0b21cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogR2V0IGl0aCBlZGl0IGxpc3QgZW50cnkgKG1lZGlhIHRpbWUsIGR1cmF0aW9uKS4KKyAqLworc3RhdGljIGludCBnZXRfZWRpdF9saXN0X2VudHJ5KE1PVkNvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNT1ZTdHJlYW1Db250ZXh0ICptc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGVkaXRfbGlzdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICplZGl0X2xpc3RfbWVkaWFfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICplZGl0X2xpc3RfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBnbG9iYWxfdGltZXNjYWxlKQoreworICAgIGlmIChlZGl0X2xpc3RfaW5kZXggPT0gbXNjLT5lbHN0X2NvdW50KSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAqZWRpdF9saXN0X21lZGlhX3RpbWUgPSBtc2MtPmVsc3RfZGF0YVtlZGl0X2xpc3RfaW5kZXhdLnRpbWU7CisgICAgKmVkaXRfbGlzdF9kdXJhdGlvbiA9IG1zYy0+ZWxzdF9kYXRhW2VkaXRfbGlzdF9pbmRleF0uZHVyYXRpb247CisKKyAgICAvKiBkdXJhdGlvbiBpcyBpbiBnbG9iYWwgdGltZXNjYWxlIHVuaXRzO2NvbnZlcnQgdG8gbXNjIHRpbWVzY2FsZSAqLworICAgIGlmIChnbG9iYWxfdGltZXNjYWxlID09IDApIHsKKyAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShtb3YtPmZjLCAiU3VwcG9ydCBmb3IgbXZoZC50aW1lc2NhbGUgPSAwIHdpdGggZWRpdGxpc3RzIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgKmVkaXRfbGlzdF9kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoKmVkaXRfbGlzdF9kdXJhdGlvbiwgbXNjLT50aW1lX3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aW1lc2NhbGUpOworICAgIHJldHVybiAxOworfQorCisvKioKKyAqIEZpbmQgdGhlIGNsb3Nlc3QgcHJldmlvdXMgZnJhbWUgdG8gdGhlIHRpbWVzdGFtcF9wdHMsIGluIGVfb2xkIGluZGV4CisgKiBlbnRyaWVzLiBTZWFyY2hpbmcgZm9yIGp1c3QgYW55IGZyYW1lIC8ganVzdCBrZXkgZnJhbWVzIGNhbiBiZSBjb250cm9sbGVkIGJ5CisgKiBsYXN0IGFyZ3VtZW50ICdmbGFnJy4KKyAqIE5vdGUgdGhhdCBpZiBjdHRzX2RhdGEgaXMgbm90IE5VTEwsIHdlIHdpbGwgYWx3YXlzIHNlYXJjaCBmb3IgYSBrZXkgZnJhbWUKKyAqIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgJ2ZsYWcnLiBJZiB3ZSBkb24ndCBmaW5kIGFueSBrZXlmcmFtZSwgd2Ugd2lsbAorICogcmV0dXJuIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgdmlkZW8uCisgKgorICogSGVyZSB0aGUgdGltZXN0YW1wX3B0cyBpcyBjb25zaWRlcmVkIHRvIGJlIGEgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBhbmQKKyAqIHRoZSB0aW1lc3RhbXAgb2YgaW5kZXggZW50cmllcyBhcmUgY29uc2lkZXJlZCB0byBiZSBkZWNvZGluZyB0aW1lc3RhbXBzLgorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsIGluIGZpbmRpbmcgYSBmcmFtZSwgZWxzZSByZXR1cm5zIC0xLgorICogUGxhY2VzIHRoZSBmb3VuZCBpbmRleCBjb3JyZXNwb25kaW5nIG91dHB1dCBhcmcuCisgKgorICogSWYgY3R0c19vbGQgaXMgbm90IE5VTEwsIHRoZW4gcmVmaW5lcyB0aGUgc2VhcmNoZWQgZW50cnkgYnkgc2VhcmNoaW5nCisgKiBiYWNrd2FyZHMgZnJvbSB0aGUgZm91bmQgdGltZXN0YW1wLCB0byBmaW5kIHRoZSBmcmFtZSB3aXRoIGNvcnJlY3QgUFRTLgorICoKKyAqIFBsYWNlcyB0aGUgZm91bmQgY3R0c19pbmRleCBhbmQgY3R0c19zYW1wbGUgaW4gY29ycmVzcG9uZGluZyBvdXRwdXQgYXJncy4KKyAqLworc3RhdGljIGludCBmaW5kX3ByZXZfY2xvc2VzdF9pbmRleChBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSW5kZXhFbnRyeSAqZV9vbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9vbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVlN0dHMqIGN0dHNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjdHRzX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcF9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogY3R0c19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogY3R0c19zYW1wbGUpCit7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqbXNjID0gc3QtPnByaXZfZGF0YTsKKyAgICBBVkluZGV4RW50cnkgKmVfa2VlcCA9IHN0LT5pbmRleF9lbnRyaWVzOworICAgIGludCBuYl9rZWVwID0gc3QtPm5iX2luZGV4X2VudHJpZXM7CisgICAgaW50NjRfdCBpID0gMDsKKyAgICBpbnQ2NF90IGluZGV4X2N0dHNfY291bnQ7CisKKyAgICBhdl9hc3NlcnQwKGluZGV4KTsKKworICAgIC8vIElmIGR0c19zaGlmdCA+IDAsIHRoZW4gYWxsIHRoZSBpbmRleCB0aW1lc3RhbXBzIHdpbGwgaGF2ZSB0byBiZSBvZmZzZXQgYnkKKyAgICAvLyBhdCBsZWFzdCBkdHNfc2hpZnQgYW1vdW50IHRvIG9idGFpbiBQVFMuCisgICAgLy8gSGVuY2Ugd2UgZGVjcmVtZW50IHRoZSBzZWFyY2hlZCB0aW1lc3RhbXBfcHRzIGJ5IGR0c19zaGlmdCB0byBmaW5kIHRoZSBjbG9zZXN0IGluZGV4IGVsZW1lbnQuCisgICAgaWYgKG1zYy0+ZHRzX3NoaWZ0ID4gMCkgeworICAgICAgICB0aW1lc3RhbXBfcHRzIC09IG1zYy0+ZHRzX3NoaWZ0OworICAgIH0KKworICAgIHN0LT5pbmRleF9lbnRyaWVzID0gZV9vbGQ7CisgICAgc3QtPm5iX2luZGV4X2VudHJpZXMgPSBuYl9vbGQ7CisgICAgKmluZGV4ID0gYXZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcChzdCwgdGltZXN0YW1wX3B0cywgZmxhZyB8IEFWU0VFS19GTEFHX0JBQ0tXQVJEKTsKKworICAgIC8vIEtlZXAgZ29pbmcgYmFja3dhcmRzIGluIHRoZSBpbmRleCBlbnRyaWVzIHVudGlsIHRoZSB0aW1lc3RhbXAgaXMgdGhlIHNhbWUuCisgICAgaWYgKCppbmRleCA+PSAwKSB7CisgICAgICAgIGZvciAoaSA9ICppbmRleDsgaSA+IDAgJiYgZV9vbGRbaV0udGltZXN0YW1wID09IGVfb2xkW2kgLSAxXS50aW1lc3RhbXA7CisgICAgICAgICAgICAgaS0tKSB7CisgICAgICAgICAgICBpZiAoKGZsYWcgJiBBVlNFRUtfRkxBR19BTlkpIHx8CisgICAgICAgICAgICAgICAgKGVfb2xkW2kgLSAxXS5mbGFncyAmIEFWSU5ERVhfS0VZRlJBTUUpKSB7CisgICAgICAgICAgICAgICAgKmluZGV4ID0gaSAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZlIENUVFMgdGhlbiByZWZpbmUgdGhlIHNlYXJjaCwgYnkgc2VhcmNoaW5nIGJhY2t3YXJkcyBvdmVyIFBUUworICAgIC8vIGNvbXB1dGVkIGJ5IGFkZGluZyBjb3JyZXNwb25kaW5nIENUVFMgZHVyYXRpb25zIHRvIGluZGV4IHRpbWVzdGFtcHMuCisgICAgaWYgKGN0dHNfZGF0YSAmJiAqaW5kZXggPj0gMCkgeworICAgICAgICBhdl9hc3NlcnQwKGN0dHNfaW5kZXgpOworICAgICAgICBhdl9hc3NlcnQwKGN0dHNfc2FtcGxlKTsKKyAgICAgICAgLy8gRmluZCBvdXQgdGhlIGN0dHNfaW5kZXggZm9yIHRoZSBmb3VuZCBmcmFtZS4KKyAgICAgICAgKmN0dHNfaW5kZXggPSAwOworICAgICAgICAqY3R0c19zYW1wbGUgPSAwOworICAgICAgICBmb3IgKGluZGV4X2N0dHNfY291bnQgPSAwOyBpbmRleF9jdHRzX2NvdW50IDwgKmluZGV4OyBpbmRleF9jdHRzX2NvdW50KyspIHsKKyAgICAgICAgICAgIGlmICgqY3R0c19pbmRleCA8IGN0dHNfY291bnQpIHsKKyAgICAgICAgICAgICAgICAoKmN0dHNfc2FtcGxlKSsrOworICAgICAgICAgICAgICAgIGlmIChjdHRzX2RhdGFbKmN0dHNfaW5kZXhdLmNvdW50ID09ICpjdHRzX3NhbXBsZSkgeworICAgICAgICAgICAgICAgICAgICAoKmN0dHNfaW5kZXgpKys7CisgICAgICAgICAgICAgICAgICAgICpjdHRzX3NhbXBsZSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCppbmRleCA+PSAwICYmICgqY3R0c19pbmRleCkgPj0gMCAmJiAoKmN0dHNfaW5kZXgpIDwgY3R0c19jb3VudCkgeworICAgICAgICAgICAgLy8gRmluZCBhICJrZXkgZnJhbWUiIHdpdGggUFRTIDw9IHRpbWVzdGFtcF9wdHMgKFNvIHRoYXQgd2UgY2FuIGRlY29kZSBCLWZyYW1lcyBjb3JyZWN0bHkpLgorICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBhZGQgZHRzX3NoaWZ0IHRvIHRoZSB0aW1lc3RhbXAgaGVyZSBiZWNhc2UgdGltZXN0YW1wX3B0cyBoYXMgYWxyZWFkeSBiZWVuCisgICAgICAgICAgICAvLyBjb21wZW5zYXRlZCBieSBkdHNfc2hpZnQgYWJvdmUuCisgICAgICAgICAgICBpZiAoKGVfb2xkWyppbmRleF0udGltZXN0YW1wICsgY3R0c19kYXRhWypjdHRzX2luZGV4XS5kdXJhdGlvbikgPD0gdGltZXN0YW1wX3B0cyAmJgorICAgICAgICAgICAgICAgIChlX29sZFsqaW5kZXhdLmZsYWdzICYgQVZJTkRFWF9LRVlGUkFNRSkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKCppbmRleCktLTsKKyAgICAgICAgICAgIGlmICgqY3R0c19zYW1wbGUgPT0gMCkgeworICAgICAgICAgICAgICAgICgqY3R0c19pbmRleCktLTsKKyAgICAgICAgICAgICAgICBpZiAoKmN0dHNfaW5kZXggPj0gMCkKKyAgICAgICAgICAgICAgICAgICpjdHRzX3NhbXBsZSA9IGN0dHNfZGF0YVsqY3R0c19pbmRleF0uY291bnQgLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAoKmN0dHNfc2FtcGxlKS0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogcmVzdG9yZSBBVlN0cmVhbSBzdGF0ZSovCisgICAgc3QtPmluZGV4X2VudHJpZXMgPSBlX2tlZXA7CisgICAgc3QtPm5iX2luZGV4X2VudHJpZXMgPSBuYl9rZWVwOworICAgIHJldHVybiAqaW5kZXggPj0gMCA/IDAgOiAtMTsKK30KKworLyoqCisgKiBBZGQgaW5kZXggZW50cnkgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLCB0byB0aGUgZW5kIG9mIHN0LT5pbmRleF9lbnRyaWVzLgorICogUmV0dXJucyB0aGUgbmV3IHNpemUgc3QtPmluZGV4X2VudHJpZXMgaWYgc3VjY2Vzc2Z1bCwgZWxzZSByZXR1cm5zIC0xLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBmZl9hZGRfaW5kZXhfZW50cnkgaW4gbGliYXZmb3JtYXQvdXRpbHMuYworICogZXhjZXB0IHRoYXQgaGVyZSB3ZSBhcmUgYWx3YXlzIHVuY29uZGl0aW9uYWxseSBhZGRpbmcgYW4gaW5kZXggZW50cnkgdG8KKyAqIHRoZSBlbmQsIGluc3RlYWQgb2Ygc2VhcmNoaW5nIHRoZSBlbnRyaWVzIGxpc3QgYW5kIHNraXBwaW5nIHRoZSBhZGQgaWYKKyAqIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGVudHJ5IHdpdGggdGhlIHNhbWUgdGltZXN0YW1wLgorICogVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgbW92X2ZpeF9pbmRleCBjYWxscyB0aGlzIGZ1bmMgd2l0aCB0aGUgc2FtZQorICogdW5pbmNyZW1lbnRlZCB0aW1lc3RhbXAgZm9yIHN1Y2Nlc3NpdmUgZGlzY2FyZGVkIGZyYW1lcy4KKyAqLworc3RhdGljIGludDY0X3QgYWRkX2luZGV4X2VudHJ5KEFWU3RyZWFtICpzdCwgaW50NjRfdCBwb3MsIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBpbnQgZGlzdGFuY2UsIGludCBmbGFncykKK3sKKyAgICBBVkluZGV4RW50cnkgKmVudHJpZXMsICppZTsKKyAgICBpbnQ2NF90IGluZGV4ID0gLTE7CisgICAgY29uc3Qgc2l6ZV90IG1pbl9zaXplX25lZWRlZCA9IChzdC0+bmJfaW5kZXhfZW50cmllcyArIDEpICogc2l6ZW9mKEFWSW5kZXhFbnRyeSk7CisKKyAgICAvLyBEb3VibGUgdGhlIGFsbG9jYXRpb24gZWFjaCB0aW1lLCB0byBsb3dlciBtZW1vcnkgZnJhZ21lbnRhdGlvbi4KKyAgICAvLyBBbm90aGVyIGRpZmZlcmVuY2UgZnJvbSBmZl9hZGRfaW5kZXhfZW50cnkgZnVuY3Rpb24uCisgICAgY29uc3Qgc2l6ZV90IHJlcXVlc3RlZF9zaXplID0KKyAgICAgICAgbWluX3NpemVfbmVlZGVkID4gc3QtPmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUgPworICAgICAgICBGRk1BWChtaW5fc2l6ZV9uZWVkZWQsIDIgKiBzdC0+aW5kZXhfZW50cmllc19hbGxvY2F0ZWRfc2l6ZSkgOgorICAgICAgICBtaW5fc2l6ZV9uZWVkZWQ7CisKKyAgICBpZigodW5zaWduZWQpc3QtPm5iX2luZGV4X2VudHJpZXMgKyAxID49IFVJTlRfTUFYIC8gc2l6ZW9mKEFWSW5kZXhFbnRyeSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGVudHJpZXMgPSBhdl9mYXN0X3JlYWxsb2Moc3QtPmluZGV4X2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3QtPmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfc2l6ZSk7CisgICAgaWYoIWVudHJpZXMpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHN0LT5pbmRleF9lbnRyaWVzPSBlbnRyaWVzOworCisgICAgaW5kZXg9IHN0LT5uYl9pbmRleF9lbnRyaWVzKys7CisgICAgaWU9ICZlbnRyaWVzW2luZGV4XTsKKworICAgIGllLT5wb3MgPSBwb3M7CisgICAgaWUtPnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICBpZS0+bWluX2Rpc3RhbmNlPSBkaXN0YW5jZTsKKyAgICBpZS0+c2l6ZT0gc2l6ZTsKKyAgICBpZS0+ZmxhZ3MgPSBmbGFnczsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKy8qKgorICogUmV3cml0ZSB0aW1lc3RhbXBzIG9mIGluZGV4IGVudHJpZXMgaW4gdGhlIHJhbmdlIFtlbmRfaW5kZXggLSBmcmFtZV9kdXJhdGlvbl9idWZmZXJfc2l6ZSwgZW5kX2luZGV4KQorICogYnkgc3VidHJhY3RpbmcgZW5kX3RzIHN1Y2Nlc3NpdmVseSBieSB0aGUgYW1vdW50cyBnaXZlbiBpbiBmcmFtZV9kdXJhdGlvbl9idWZmZXIuCisgKi8KK3N0YXRpYyB2b2lkIGZpeF9pbmRleF9lbnRyeV90aW1lc3RhbXBzKEFWU3RyZWFtKiBzdCwgaW50IGVuZF9pbmRleCwgaW50NjRfdCBlbmRfdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90KiBmcmFtZV9kdXJhdGlvbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfZHVyYXRpb25fYnVmZmVyX3NpemUpIHsKKyAgICBpbnQgaSA9IDA7CisgICAgYXZfYXNzZXJ0MChlbmRfaW5kZXggPj0gMCAmJiBlbmRfaW5kZXggPD0gc3QtPm5iX2luZGV4X2VudHJpZXMpOworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZV9kdXJhdGlvbl9idWZmZXJfc2l6ZTsgaSsrKSB7CisgICAgICAgIGVuZF90cyAtPSBmcmFtZV9kdXJhdGlvbl9idWZmZXJbZnJhbWVfZHVyYXRpb25fYnVmZmVyX3NpemUgLSAxIC0gaV07CisgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzW2VuZF9pbmRleCAtIDEgLSBpXS50aW1lc3RhbXAgPSBlbmRfdHM7CisgICAgfQorfQorCisvKioKKyAqIEFwcGVuZCBhIG5ldyBjdHRzIGVudHJ5IHRvIGN0dHNfZGF0YS4KKyAqIFJldHVybnMgdGhlIG5ldyBjdHRzX2NvdW50IGlmIHN1Y2Nlc3NmdWwsIGVsc2UgcmV0dXJucyAtMS4KKyAqLworc3RhdGljIGludDY0X3QgYWRkX2N0dHNfZW50cnkoTU9WU3R0cyoqIGN0dHNfZGF0YSwgdW5zaWduZWQgaW50KiBjdHRzX2NvdW50LCB1bnNpZ25lZCBpbnQqIGFsbG9jYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgZHVyYXRpb24pCit7CisgICAgTU9WU3R0cyAqY3R0c19idWZfbmV3OworICAgIGNvbnN0IHNpemVfdCBtaW5fc2l6ZV9uZWVkZWQgPSAoKmN0dHNfY291bnQgKyAxKSAqIHNpemVvZihNT1ZTdHRzKTsKKyAgICBjb25zdCBzaXplX3QgcmVxdWVzdGVkX3NpemUgPQorICAgICAgICBtaW5fc2l6ZV9uZWVkZWQgPiAqYWxsb2NhdGVkX3NpemUgPworICAgICAgICBGRk1BWChtaW5fc2l6ZV9uZWVkZWQsIDIgKiAoKmFsbG9jYXRlZF9zaXplKSkgOgorICAgICAgICBtaW5fc2l6ZV9uZWVkZWQ7CisKKyAgICBpZigodW5zaWduZWQpKCpjdHRzX2NvdW50KSA+PSBVSU5UX01BWCAvIHNpemVvZihNT1ZTdHRzKSAtIDEpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGN0dHNfYnVmX25ldyA9IGF2X2Zhc3RfcmVhbGxvYygqY3R0c19kYXRhLCBhbGxvY2F0ZWRfc2l6ZSwgcmVxdWVzdGVkX3NpemUpOworCisgICAgaWYoIWN0dHNfYnVmX25ldykKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgKmN0dHNfZGF0YSA9IGN0dHNfYnVmX25ldzsKKworICAgIGN0dHNfYnVmX25ld1sqY3R0c19jb3VudF0uY291bnQgPSBjb3VudDsKKyAgICBjdHRzX2J1Zl9uZXdbKmN0dHNfY291bnRdLmR1cmF0aW9uID0gZHVyYXRpb247CisKKyAgICAqY3R0c19jb3VudCA9ICgqY3R0c19jb3VudCkgKyAxOworICAgIHJldHVybiAqY3R0c19jb3VudDsKK30KKworI2RlZmluZSBNQVhfUkVPUkRFUl9ERUxBWSAxNgorc3RhdGljIHZvaWQgbW92X2VzdGltYXRlX3ZpZGVvX2RlbGF5KE1PVkNvbnRleHQgKmMsIEFWU3RyZWFtKiBzdCkgeworICAgIE1PVlN0cmVhbUNvbnRleHQgKm1zYyA9IHN0LT5wcml2X2RhdGE7CisgICAgaW50IGluZDsKKyAgICBpbnQgY3R0c19pbmQgPSAwOworICAgIGludCBjdHRzX3NhbXBsZSA9IDA7CisgICAgaW50NjRfdCBwdHNfYnVmW01BWF9SRU9SREVSX0RFTEFZICsgMV07IC8vIENpcmN1bGFyIGJ1ZmZlciB0byBzb3J0IHB0cy4KKyAgICBpbnQgYnVmX3N0YXJ0ID0gMDsKKyAgICBpbnQgaiwgciwgbnVtX3N3YXBzOworCisgICAgZm9yIChqID0gMDsgaiA8IE1BWF9SRU9SREVSX0RFTEFZICsgMTsgaisrKQorICAgICAgICBwdHNfYnVmW2pdID0gSU5UNjRfTUlOOworCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+dmlkZW9fZGVsYXkgPD0gMCAmJiBtc2MtPmN0dHNfZGF0YSAmJgorICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT52aWRlb19kZWxheSA9IDA7CisgICAgICAgIGZvcihpbmQgPSAwOyBpbmQgPCBzdC0+bmJfaW5kZXhfZW50cmllcyAmJiBjdHRzX2luZCA8IG1zYy0+Y3R0c19jb3VudDsgKytpbmQpIHsKKyAgICAgICAgICAgIC8vIFBvaW50IGogdG8gdGhlIGxhc3QgZWxlbSBvZiB0aGUgYnVmZmVyIGFuZCBpbnNlcnQgdGhlIGN1cnJlbnQgcHRzIHRoZXJlLgorICAgICAgICAgICAgaiA9IGJ1Zl9zdGFydDsKKyAgICAgICAgICAgIGJ1Zl9zdGFydCA9IChidWZfc3RhcnQgKyAxKTsKKyAgICAgICAgICAgIGlmIChidWZfc3RhcnQgPT0gTUFYX1JFT1JERVJfREVMQVkgKyAxKQorICAgICAgICAgICAgICAgIGJ1Zl9zdGFydCA9IDA7CisKKyAgICAgICAgICAgIHB0c19idWZbal0gPSBzdC0+aW5kZXhfZW50cmllc1tpbmRdLnRpbWVzdGFtcCArIG1zYy0+Y3R0c19kYXRhW2N0dHNfaW5kXS5kdXJhdGlvbjsKKworICAgICAgICAgICAgLy8gVGhlIHRpbWVzdGFtcHMgdGhhdCBhcmUgYWxyZWFkeSBpbiB0aGUgc29ydGVkIGJ1ZmZlciwgYW5kIGFyZSBncmVhdGVyIHRoYW4gdGhlCisgICAgICAgICAgICAvLyBjdXJyZW50IHB0cywgYXJlIGV4YWN0bHkgdGhlIHRpbWVzdGFtcHMgdGhhdCBuZWVkIHRvIGJlIGJ1ZmZlcmVkIHRvIG91dHB1dCBQVFMKKyAgICAgICAgICAgIC8vIGluIGNvcnJlY3Qgc29ydGVkIG9yZGVyLgorICAgICAgICAgICAgLy8gSGVuY2UgdGhlIHZpZGVvIGRlbGF5ICh3aGljaCBpcyB0aGUgYnVmZmVyIHNpemUgdXNlZCB0byBzb3J0IERUUyBhbmQgb3V0cHV0IFBUUyksCisgICAgICAgICAgICAvLyBjYW4gYmUgY29tcHV0ZWQgYXMgdGhlIG1heGltdW0gbm8uIG9mIHN3YXBzIGFueSBwYXJ0aWN1bGFyIHRpbWVzdGFtcCBuZWVkcyB0bworICAgICAgICAgICAgLy8gZ28gdGhyb3VnaCwgdG8ga2VlcCB0aGlzIGJ1ZmZlciBpbiBzb3J0ZWQgb3JkZXIuCisgICAgICAgICAgICBudW1fc3dhcHMgPSAwOworICAgICAgICAgICAgd2hpbGUgKGogIT0gYnVmX3N0YXJ0KSB7CisgICAgICAgICAgICAgICAgciA9IGogLSAxOworICAgICAgICAgICAgICAgIGlmIChyIDwgMCkgciA9IE1BWF9SRU9SREVSX0RFTEFZOworICAgICAgICAgICAgICAgIGlmIChwdHNfYnVmW2pdIDwgcHRzX2J1ZltyXSkgeworICAgICAgICAgICAgICAgICAgICBGRlNXQVAoaW50NjRfdCwgcHRzX2J1ZltqXSwgcHRzX2J1ZltyXSk7CisgICAgICAgICAgICAgICAgICAgICsrbnVtX3N3YXBzOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBqID0gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+dmlkZW9fZGVsYXkgPSBGRk1BWChzdC0+Y29kZWNwYXItPnZpZGVvX2RlbGF5LCBudW1fc3dhcHMpOworCisgICAgICAgICAgICBjdHRzX3NhbXBsZSsrOworICAgICAgICAgICAgaWYgKGN0dHNfc2FtcGxlID09IG1zYy0+Y3R0c19kYXRhW2N0dHNfaW5kXS5jb3VudCkgeworICAgICAgICAgICAgICAgIGN0dHNfaW5kKys7CisgICAgICAgICAgICAgICAgY3R0c19zYW1wbGUgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiU2V0dGluZyBjb2RlY3Bhci0+ZGVsYXkgdG8gJWQgZm9yIHN0cmVhbSBzdDogJWRcbiIsCisgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnZpZGVvX2RlbGF5LCBzdC0+aW5kZXgpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgbW92X2N1cnJlbnRfc2FtcGxlX2luYyhNT1ZTdHJlYW1Db250ZXh0ICpzYykKK3sKKyAgICBzYy0+Y3VycmVudF9zYW1wbGUrKzsKKyAgICBzYy0+Y3VycmVudF9pbmRleCsrOworICAgIGlmIChzYy0+aW5kZXhfcmFuZ2VzICYmCisgICAgICAgIHNjLT5jdXJyZW50X2luZGV4ID49IHNjLT5jdXJyZW50X2luZGV4X3JhbmdlLT5lbmQgJiYKKyAgICAgICAgc2MtPmN1cnJlbnRfaW5kZXhfcmFuZ2UtPmVuZCkgeworICAgICAgICBzYy0+Y3VycmVudF9pbmRleF9yYW5nZSsrOworICAgICAgICBzYy0+Y3VycmVudF9pbmRleCA9IHNjLT5jdXJyZW50X2luZGV4X3JhbmdlLT5zdGFydDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1vdl9jdXJyZW50X3NhbXBsZV9kZWMoTU9WU3RyZWFtQ29udGV4dCAqc2MpCit7CisgICAgc2MtPmN1cnJlbnRfc2FtcGxlLS07CisgICAgc2MtPmN1cnJlbnRfaW5kZXgtLTsKKyAgICBpZiAoc2MtPmluZGV4X3JhbmdlcyAmJgorICAgICAgICBzYy0+Y3VycmVudF9pbmRleCA8IHNjLT5jdXJyZW50X2luZGV4X3JhbmdlLT5zdGFydCAmJgorICAgICAgICBzYy0+Y3VycmVudF9pbmRleF9yYW5nZSA+IHNjLT5pbmRleF9yYW5nZXMpIHsKKyAgICAgICAgc2MtPmN1cnJlbnRfaW5kZXhfcmFuZ2UtLTsKKyAgICAgICAgc2MtPmN1cnJlbnRfaW5kZXggPSBzYy0+Y3VycmVudF9pbmRleF9yYW5nZS0+ZW5kIC0gMTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG1vdl9jdXJyZW50X3NhbXBsZV9zZXQoTU9WU3RyZWFtQ29udGV4dCAqc2MsIGludCBjdXJyZW50X3NhbXBsZSkKK3sKKyAgICBpbnQ2NF90IHJhbmdlX3NpemU7CisKKyAgICBzYy0+Y3VycmVudF9zYW1wbGUgPSBjdXJyZW50X3NhbXBsZTsKKyAgICBzYy0+Y3VycmVudF9pbmRleCA9IGN1cnJlbnRfc2FtcGxlOworICAgIGlmICghc2MtPmluZGV4X3JhbmdlcykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzYy0+Y3VycmVudF9pbmRleF9yYW5nZSA9IHNjLT5pbmRleF9yYW5nZXM7CisgICAgICAgIHNjLT5jdXJyZW50X2luZGV4X3JhbmdlLT5lbmQ7CisgICAgICAgIHNjLT5jdXJyZW50X2luZGV4X3JhbmdlKyspIHsKKyAgICAgICAgcmFuZ2Vfc2l6ZSA9IHNjLT5jdXJyZW50X2luZGV4X3JhbmdlLT5lbmQgLSBzYy0+Y3VycmVudF9pbmRleF9yYW5nZS0+c3RhcnQ7CisgICAgICAgIGlmIChyYW5nZV9zaXplID4gY3VycmVudF9zYW1wbGUpIHsKKyAgICAgICAgICAgIHNjLT5jdXJyZW50X2luZGV4ID0gc2MtPmN1cnJlbnRfaW5kZXhfcmFuZ2UtPnN0YXJ0ICsgY3VycmVudF9zYW1wbGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50X3NhbXBsZSAtPSByYW5nZV9zaXplOworICAgIH0KK30KKworLyoqCisgKiBGaXggc3QtPmluZGV4X2VudHJpZXMsIHNvIHRoYXQgaXQgY29udGFpbnMgb25seSB0aGUgZW50cmllcyAoYW5kIHRoZSBlbnRyaWVzCisgKiB3aGljaCBhcmUgbmVlZGVkIHRvIGRlY29kZSB0aGVtKSB0aGF0IGZhbGwgaW4gdGhlIGVkaXQgbGlzdCB0aW1lIHJhbmdlcy4KKyAqIEFsc28gZml4ZXMgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIGluZGV4IGVudHJpZXMgdG8gbWF0Y2ggdGhlIHRpbWVsaW5lCisgKiBzcGVjaWZpZWQgdGhlIGVkaXQgbGlzdHMuCisgKi8KK3N0YXRpYyB2b2lkIG1vdl9maXhfaW5kZXgoTU9WQ29udGV4dCAqbW92LCBBVlN0cmVhbSAqc3QpCit7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqbXNjID0gc3QtPnByaXZfZGF0YTsKKyAgICBBVkluZGV4RW50cnkgKmVfb2xkID0gc3QtPmluZGV4X2VudHJpZXM7CisgICAgaW50IG5iX29sZCA9IHN0LT5uYl9pbmRleF9lbnRyaWVzOworICAgIGNvbnN0IEFWSW5kZXhFbnRyeSAqZV9vbGRfZW5kID0gZV9vbGQgKyBuYl9vbGQ7CisgICAgY29uc3QgQVZJbmRleEVudHJ5ICpjdXJyZW50ID0gTlVMTDsKKyAgICBNT1ZTdHRzICpjdHRzX2RhdGFfb2xkID0gbXNjLT5jdHRzX2RhdGE7CisgICAgaW50NjRfdCBjdHRzX2luZGV4X29sZCA9IDA7CisgICAgaW50NjRfdCBjdHRzX3NhbXBsZV9vbGQgPSAwOworICAgIGludDY0X3QgY3R0c19jb3VudF9vbGQgPSBtc2MtPmN0dHNfY291bnQ7CisgICAgaW50NjRfdCBlZGl0X2xpc3RfbWVkaWFfdGltZSA9IDA7CisgICAgaW50NjRfdCBlZGl0X2xpc3RfZHVyYXRpb24gPSAwOworICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb24gPSAwOworICAgIGludDY0X3QgZWRpdF9saXN0X2R0c19jb3VudGVyID0gMDsKKyAgICBpbnQ2NF90IGVkaXRfbGlzdF9kdHNfZW50cnlfZW5kID0gMDsKKyAgICBpbnQ2NF90IGVkaXRfbGlzdF9zdGFydF9jdHRzX3NhbXBsZSA9IDA7CisgICAgaW50NjRfdCBjdXJyX2N0czsKKyAgICBpbnQ2NF90IGN1cnJfY3R0cyA9IDA7CisgICAgaW50NjRfdCBlbXB0eV9lZGl0c19zdW1fZHVyYXRpb24gPSAwOworICAgIGludDY0X3QgZWRpdF9saXN0X2luZGV4ID0gMDsKKyAgICBpbnQ2NF90IGluZGV4OworICAgIGludCBmbGFnczsKKyAgICBpbnQ2NF90IHN0YXJ0X2R0cyA9IDA7CisgICAgaW50NjRfdCBlZGl0X2xpc3Rfc3RhcnRfZW5jb3VudGVyZWQgPSAwOworICAgIGludDY0X3Qgc2VhcmNoX3RpbWVzdGFtcCA9IDA7CisgICAgaW50NjRfdCogZnJhbWVfZHVyYXRpb25fYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgbnVtX2Rpc2NhcmRlZF9iZWdpbiA9IDA7CisgICAgaW50IGZpcnN0X25vbl96ZXJvX2F1ZGlvX2VkaXQgPSAtMTsKKyAgICBpbnQgcGFja2V0X3NraXBfc2FtcGxlcyA9IDA7CisgICAgTU9WSW5kZXhSYW5nZSAqY3VycmVudF9pbmRleF9yYW5nZTsKKyAgICBpbnQgaTsKKyAgICBpbnQgZm91bmRfa2V5ZnJhbWVfYWZ0ZXJfZWRpdCA9IDA7CisKKyAgICBpZiAoIW1zYy0+ZWxzdF9kYXRhIHx8IG1zYy0+ZWxzdF9jb3VudCA8PSAwIHx8IG5iX29sZCA8PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZSB0aGUgaW5kZXggcmFuZ2VzIGFycmF5CisgICAgbXNjLT5pbmRleF9yYW5nZXMgPSBhdl9tYWxsb2MoKG1zYy0+ZWxzdF9jb3VudCArIDEpICogc2l6ZW9mKG1zYy0+aW5kZXhfcmFuZ2VzWzBdKSk7CisgICAgaWYgKCFtc2MtPmluZGV4X3JhbmdlcykgeworICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIGluZGV4IHJhbmdlcyBidWZmZXJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1zYy0+Y3VycmVudF9pbmRleF9yYW5nZSA9IG1zYy0+aW5kZXhfcmFuZ2VzOworICAgIGN1cnJlbnRfaW5kZXhfcmFuZ2UgPSBtc2MtPmluZGV4X3JhbmdlcyAtIDE7CisKKyAgICAvLyBDbGVhbiBBVlN0cmVhbSBmcm9tIHRyYWNlcyBvZiBvbGQgaW5kZXgKKyAgICBzdC0+aW5kZXhfZW50cmllcyA9IE5VTEw7CisgICAgc3QtPmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUgPSAwOworICAgIHN0LT5uYl9pbmRleF9lbnRyaWVzID0gMDsKKworICAgIC8vIENsZWFuIGN0dHMgZmllbGRzIG9mIE1PVlN0cmVhbUNvbnRleHQKKyAgICBtc2MtPmN0dHNfZGF0YSA9IE5VTEw7CisgICAgbXNjLT5jdHRzX2NvdW50ID0gMDsKKyAgICBtc2MtPmN0dHNfaW5kZXggPSAwOworICAgIG1zYy0+Y3R0c19zYW1wbGUgPSAwOworICAgIG1zYy0+Y3R0c19hbGxvY2F0ZWRfc2l6ZSA9IDA7CisKKyAgICAvLyBSZWluaXRpYWxpemUgbWluX2NvcnJlY3RlZF9wdHMgc28gdGhhdCBpdCBjYW4gYmUgY29tcHV0ZWQgYWdhaW4uCisgICAgbXNjLT5taW5fY29ycmVjdGVkX3B0cyA9IC0xOworCisgICAgLy8gSWYgdGhlIGR0c19zaGlmdCBpcyBwb3NpdGl2ZSAoaW4gY2FzZSBvZiBuZWdhdGl2ZSBjdHRzIHZhbHVlcyBpbiBtb3YpLAorICAgIC8vIHRoZW4gbmVnYXRlIHRoZSBEVFMgYnkgZHRzX3NoaWZ0CisgICAgaWYgKG1zYy0+ZHRzX3NoaWZ0ID4gMCkgeworICAgICAgICBlZGl0X2xpc3RfZHRzX2VudHJ5X2VuZCAtPSBtc2MtPmR0c19zaGlmdDsKKyAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19ERUJVRywgIlNoaWZ0aW5nIERUUyBieSAlZCBiZWNhdXNlIG9mIG5lZ2F0aXZlIENUVFMuXG4iLCBtc2MtPmR0c19zaGlmdCk7CisgICAgfQorCisgICAgc3RhcnRfZHRzID0gZWRpdF9saXN0X2R0c19lbnRyeV9lbmQ7CisKKyAgICB3aGlsZSAoZ2V0X2VkaXRfbGlzdF9lbnRyeShtb3YsIG1zYywgZWRpdF9saXN0X2luZGV4LCAmZWRpdF9saXN0X21lZGlhX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVkaXRfbGlzdF9kdXJhdGlvbiwgbW92LT50aW1lX3NjYWxlKSkgeworICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX0RFQlVHLCAiUHJvY2Vzc2luZyBzdDogJWQsIGVkaXQgbGlzdCAlIlBSSWQ2NCIgLSBtZWRpYSB0aW1lOiAlIlBSSWQ2NCIsIGR1cmF0aW9uOiAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICBzdC0+aW5kZXgsIGVkaXRfbGlzdF9pbmRleCwgZWRpdF9saXN0X21lZGlhX3RpbWUsIGVkaXRfbGlzdF9kdXJhdGlvbik7CisgICAgICAgIGVkaXRfbGlzdF9pbmRleCsrOworICAgICAgICBlZGl0X2xpc3RfZHRzX2NvdW50ZXIgPSBlZGl0X2xpc3RfZHRzX2VudHJ5X2VuZDsKKyAgICAgICAgZWRpdF9saXN0X2R0c19lbnRyeV9lbmQgKz0gZWRpdF9saXN0X2R1cmF0aW9uOworICAgICAgICBudW1fZGlzY2FyZGVkX2JlZ2luID0gMDsKKyAgICAgICAgaWYgKGVkaXRfbGlzdF9tZWRpYV90aW1lID09IC0xKSB7CisgICAgICAgICAgICBlbXB0eV9lZGl0c19zdW1fZHVyYXRpb24gKz0gZWRpdF9saXN0X2R1cmF0aW9uOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYSBub24tbmVnYXRpdmUgZWRpdCBsaXN0IHJlc2V0IHRoZSBza2lwX3NhbXBsZXMvc3RhcnRfcGFkIGZpZWxkcyBhbmQgc2V0IHRoZW0KKyAgICAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSBlZGl0IGxpc3QgYmVsb3cuCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoZmlyc3Rfbm9uX3plcm9fYXVkaW9fZWRpdCA8IDApIHsKKyAgICAgICAgICAgICAgICBmaXJzdF9ub25femVyb19hdWRpb19lZGl0ID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmlyc3Rfbm9uX3plcm9fYXVkaW9fZWRpdCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaXJzdF9ub25femVyb19hdWRpb19lZGl0ID4gMCkKKyAgICAgICAgICAgICAgICBzdC0+c2tpcF9zYW1wbGVzID0gbXNjLT5zdGFydF9wYWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gV2hpbGUgcmVvcmRlcmluZyBmcmFtZSBpbmRleCBhY2NvcmRpbmcgdG8gZWRpdCBsaXN0IHdlIG11c3QgaGFuZGxlIHByb3Blcmx5CisgICAgICAgIC8vIHRoZSBzY2VuYXJpbyB3aGVuIGVkaXQgbGlzdCBlbnRyeSBzdGFydHMgZnJvbSBub25lIGtleSBmcmFtZS4KKyAgICAgICAgLy8gV2UgZmluZCBjbG9zZXN0IHByZXZpb3VzIGtleSBmcmFtZSBhbmQgcHJlc2VydmUgaXQgYW5kIGNvbnNlcXVlbnQgZnJhbWVzIGluIGluZGV4LgorICAgICAgICAvLyBBbGwgZnJhbWVzIHdoaWNoIGFyZSBvdXRzaWRlIGVkaXQgbGlzdCBlbnRyeSB0aW1lIGJvdW5kYXJpZXMgd2lsbCBiZSBkcm9wcGVkIGFmdGVyIGRlY29kaW5nLgorICAgICAgICBzZWFyY2hfdGltZXN0YW1wID0gZWRpdF9saXN0X21lZGlhX3RpbWU7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICAvLyBBdWRpbyBkZWNvZGVycyBsaWtlIEFBQyBuZWVkIG5lZWQgYSBkZWNvZGVyIGRlbGF5IHNhbXBsZXMgcHJldmlvdXMgdG8gdGhlIGN1cnJlbnQgc2FtcGxlLAorICAgICAgICAgICAgLy8gdG8gY29ycmVjdGx5IGRlY29kZSB0aGlzIGZyYW1lLiBIZW5jZSBmb3IgYXVkaW8gd2Ugc2VlayB0byBhIGZyYW1lIDEgc2VjLiBiZWZvcmUgdGhlCisgICAgICAgICAgICAvLyBlZGl0X2xpc3RfbWVkaWFfdGltZSB0byBjb3ZlciB0aGUgZGVjb2RlciBkZWxheS4KKyAgICAgICAgICAgIHNlYXJjaF90aW1lc3RhbXAgPSBGRk1BWChzZWFyY2hfdGltZXN0YW1wIC0gbXNjLT50aW1lX3NjYWxlLCBlX29sZFswXS50aW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbmRfcHJldl9jbG9zZXN0X2luZGV4KHN0LCBlX29sZCwgbmJfb2xkLCBjdHRzX2RhdGFfb2xkLCBjdHRzX2NvdW50X29sZCwgc2VhcmNoX3RpbWVzdGFtcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwgJmN0dHNfaW5kZXhfb2xkLCAmY3R0c19zYW1wbGVfb2xkKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAic3Q6ICVkIGVkaXQgbGlzdDogJSJQUklkNjQiIE1pc3Npbmcga2V5IGZyYW1lIHdoaWxlIHNlYXJjaGluZyBmb3IgdGltZXN0YW1wOiAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICAgICAgc3QtPmluZGV4LCBlZGl0X2xpc3RfaW5kZXgsIHNlYXJjaF90aW1lc3RhbXApOworICAgICAgICAgICAgaWYgKGZpbmRfcHJldl9jbG9zZXN0X2luZGV4KHN0LCBlX29sZCwgbmJfb2xkLCBjdHRzX2RhdGFfb2xkLCBjdHRzX2NvdW50X29sZCwgc2VhcmNoX3RpbWVzdGFtcCwgQVZTRUVLX0ZMQUdfQU5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmRleCwgJmN0dHNfaW5kZXhfb2xkLCAmY3R0c19zYW1wbGVfb2xkKSA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICJzdDogJWQgZWRpdCBsaXN0ICUiUFJJZDY0IiBDYW5ub3QgZmluZCBhbiBpbmRleCBlbnRyeSBiZWZvcmUgdGltZXN0YW1wOiAlIlBSSWQ2NCIuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzdC0+aW5kZXgsIGVkaXRfbGlzdF9pbmRleCwgc2VhcmNoX3RpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgaW5kZXggPSAwOworICAgICAgICAgICAgICAgIGN0dHNfaW5kZXhfb2xkID0gMDsKKyAgICAgICAgICAgICAgICBjdHRzX3NhbXBsZV9vbGQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGN1cnJlbnQgPSBlX29sZCArIGluZGV4OworICAgICAgICBlZGl0X2xpc3Rfc3RhcnRfY3R0c19zYW1wbGUgPSBjdHRzX3NhbXBsZV9vbGQ7CisKKyAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGluZGV4IGFuZCBhcnJhbmdlIGl0IGFjY29yZGluZyB0byBlZGl0IGxpc3QKKyAgICAgICAgZWRpdF9saXN0X3N0YXJ0X2VuY291bnRlcmVkID0gMDsKKyAgICAgICAgZm91bmRfa2V5ZnJhbWVfYWZ0ZXJfZWRpdCA9IDA7CisgICAgICAgIGZvciAoOyBjdXJyZW50IDwgZV9vbGRfZW5kOyBjdXJyZW50KyssIGluZGV4KyspIHsKKyAgICAgICAgICAgIC8vIGNoZWNrICBpZiBmcmFtZSBvdXRzaWRlIGVkaXQgbGlzdCBtYXJrIGl0IGZvciBkaXNjYXJkCisgICAgICAgICAgICBmcmFtZV9kdXJhdGlvbiA9IChjdXJyZW50ICsgMSA8ICBlX29sZF9lbmQpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjdXJyZW50ICsgMSktPnRpbWVzdGFtcCAtIGN1cnJlbnQtPnRpbWVzdGFtcCkgOiBlZGl0X2xpc3RfZHVyYXRpb247CisKKyAgICAgICAgICAgIGZsYWdzID0gY3VycmVudC0+ZmxhZ3M7CisKKyAgICAgICAgICAgIC8vIGZyYW1lcyAocHRzKSBiZWZvcmUgb3IgYWZ0ZXIgZWRpdCBsaXN0CisgICAgICAgICAgICBjdXJyX2N0cyA9IGN1cnJlbnQtPnRpbWVzdGFtcCArIG1zYy0+ZHRzX3NoaWZ0OworICAgICAgICAgICAgY3Vycl9jdHRzID0gMDsKKworICAgICAgICAgICAgaWYgKGN0dHNfZGF0YV9vbGQgJiYgY3R0c19pbmRleF9vbGQgPCBjdHRzX2NvdW50X29sZCkgeworICAgICAgICAgICAgICAgIGN1cnJfY3R0cyA9IGN0dHNfZGF0YV9vbGRbY3R0c19pbmRleF9vbGRdLmR1cmF0aW9uOworICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfREVCVUcsICJzdHRzOiAlIlBSSWQ2NCIgY3R0czogJSJQUklkNjQiLCBjdHRzX2luZGV4OiAlIlBSSWQ2NCIsIGN0dHNfY291bnQ6ICUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY3Vycl9jdHMsIGN1cnJfY3R0cywgY3R0c19pbmRleF9vbGQsIGN0dHNfY291bnRfb2xkKTsKKyAgICAgICAgICAgICAgICBjdXJyX2N0cyArPSBjdXJyX2N0dHM7CisgICAgICAgICAgICAgICAgY3R0c19zYW1wbGVfb2xkKys7CisgICAgICAgICAgICAgICAgaWYgKGN0dHNfc2FtcGxlX29sZCA9PSBjdHRzX2RhdGFfb2xkW2N0dHNfaW5kZXhfb2xkXS5jb3VudCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkX2N0dHNfZW50cnkoJm1zYy0+Y3R0c19kYXRhLCAmbXNjLT5jdHRzX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1zYy0+Y3R0c19hbGxvY2F0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0dHNfZGF0YV9vbGRbY3R0c19pbmRleF9vbGRdLmNvdW50IC0gZWRpdF9saXN0X3N0YXJ0X2N0dHNfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R0c19kYXRhX29sZFtjdHRzX2luZGV4X29sZF0uZHVyYXRpb24pID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFkZCBDVFRTIGVudHJ5ICUiUFJJZDY0IiAtIHslIlBSSWQ2NCIsICVkfVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHRzX2luZGV4X29sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHRzX2RhdGFfb2xkW2N0dHNfaW5kZXhfb2xkXS5jb3VudCAtIGVkaXRfbGlzdF9zdGFydF9jdHRzX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHRzX2RhdGFfb2xkW2N0dHNfaW5kZXhfb2xkXS5kdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjdHRzX2luZGV4X29sZCsrOworICAgICAgICAgICAgICAgICAgICBjdHRzX3NhbXBsZV9vbGQgPSAwOworICAgICAgICAgICAgICAgICAgICBlZGl0X2xpc3Rfc3RhcnRfY3R0c19zYW1wbGUgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGN1cnJfY3RzIDwgZWRpdF9saXN0X21lZGlhX3RpbWUgfHwgY3Vycl9jdHMgPj0gKGVkaXRfbGlzdF9kdXJhdGlvbiArIGVkaXRfbGlzdF9tZWRpYV90aW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVk9SQklTICYmCisgICAgICAgICAgICAgICAgICAgIGN1cnJfY3RzIDwgZWRpdF9saXN0X21lZGlhX3RpbWUgJiYgY3Vycl9jdHMgKyBmcmFtZV9kdXJhdGlvbiA+IGVkaXRfbGlzdF9tZWRpYV90aW1lICYmCisgICAgICAgICAgICAgICAgICAgIGZpcnN0X25vbl96ZXJvX2F1ZGlvX2VkaXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhY2tldF9za2lwX3NhbXBsZXMgPSBlZGl0X2xpc3RfbWVkaWFfdGltZSAtIGN1cnJfY3RzOworICAgICAgICAgICAgICAgICAgICBzdC0+c2tpcF9zYW1wbGVzICs9IHBhY2tldF9za2lwX3NhbXBsZXM7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2hpZnQgdGhlIGluZGV4IGVudHJ5IHRpbWVzdGFtcCBieSBwYWNrZXRfc2tpcF9zYW1wbGVzIHRvIGJlIGNvcnJlY3QuCisgICAgICAgICAgICAgICAgICAgIGVkaXRfbGlzdF9kdHNfY291bnRlciAtPSBwYWNrZXRfc2tpcF9zYW1wbGVzOworICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdF9saXN0X3N0YXJ0X2VuY291bnRlcmVkID09IDApICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlZGl0X2xpc3Rfc3RhcnRfZW5jb3VudGVyZWQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSB0aW1lc3RhbXBzIHN0cmljdGx5IG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBmb3IgYXVkaW8sIGJ5IHJld3JpdGluZyB0aW1lc3RhbXBzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzY2FyZGVkIHBhY2tldHMuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVfZHVyYXRpb25fYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4X2luZGV4X2VudHJ5X3RpbWVzdGFtcHMoc3QsIHN0LT5uYl9pbmRleF9lbnRyaWVzLCBlZGl0X2xpc3RfZHRzX2NvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVfZHVyYXRpb25fYnVmZmVyLCBudW1fZGlzY2FyZGVkX2JlZ2luKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmZnJhbWVfZHVyYXRpb25fYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfREVCVUcsICJza2lwICVkIGF1ZGlvIHNhbXBsZXMgZnJvbSBjdXJyX2N0czogJSJQUklkNjQiXG4iLCBwYWNrZXRfc2tpcF9zYW1wbGVzLCBjdXJyX2N0cyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gQVZJTkRFWF9ESVNDQVJEX0ZSQU1FOworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX0RFQlVHLCAiZHJvcCBhIGZyYW1lIGF0IGN1cnJfY3RzOiAlIlBSSWQ2NCIgQCAlIlBSSWQ2NCJcbiIsIGN1cnJfY3RzLCBpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgZWRpdF9saXN0X3N0YXJ0X2VuY291bnRlcmVkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kaXNjYXJkZWRfYmVnaW4rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2R1cmF0aW9uX2J1ZmZlciA9IGF2X3JlYWxsb2MoZnJhbWVfZHVyYXRpb25fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZGlzY2FyZGVkX2JlZ2luICogc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZnJhbWVfZHVyYXRpb25fYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCByZWFsbG9jYXRlIGZyYW1lIGR1cmF0aW9uIGJ1ZmZlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9kdXJhdGlvbl9idWZmZXJbbnVtX2Rpc2NhcmRlZF9iZWdpbiAtIDFdID0gZnJhbWVfZHVyYXRpb247CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBza2lwX3NhbXBsZXMgZm9yIHRoZSBmaXJzdCBub24temVybyBhdWRpbyBlZGl0IGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaXJzdF9ub25femVyb19hdWRpb19lZGl0ID4gMCAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1ZPUkJJUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5za2lwX3NhbXBsZXMgKz0gZnJhbWVfZHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChtc2MtPm1pbl9jb3JyZWN0ZWRfcHRzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtc2MtPm1pbl9jb3JyZWN0ZWRfcHRzID0gZWRpdF9saXN0X2R0c19jb3VudGVyICsgY3Vycl9jdHRzICsgbXNjLT5kdHNfc2hpZnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbXNjLT5taW5fY29ycmVjdGVkX3B0cyA9IEZGTUlOKG1zYy0+bWluX2NvcnJlY3RlZF9wdHMsIGVkaXRfbGlzdF9kdHNfY291bnRlciArIGN1cnJfY3R0cyArIG1zYy0+ZHRzX3NoaWZ0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVkaXRfbGlzdF9zdGFydF9lbmNvdW50ZXJlZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVkaXRfbGlzdF9zdGFydF9lbmNvdW50ZXJlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgIC8vIE1ha2UgdGltZXN0YW1wcyBzdHJpY3RseSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgZm9yIGF1ZGlvLCBieSByZXdyaXRpbmcgdGltZXN0YW1wcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgLy8gZGlzY2FyZGVkIHBhY2tldHMuCisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIGZyYW1lX2R1cmF0aW9uX2J1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZml4X2luZGV4X2VudHJ5X3RpbWVzdGFtcHMoc3QsIHN0LT5uYl9pbmRleF9lbnRyaWVzLCBlZGl0X2xpc3RfZHRzX2NvdW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZV9kdXJhdGlvbl9idWZmZXIsIG51bV9kaXNjYXJkZWRfYmVnaW4pOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmZyYW1lX2R1cmF0aW9uX2J1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhZGRfaW5kZXhfZW50cnkoc3QsIGN1cnJlbnQtPnBvcywgZWRpdF9saXN0X2R0c19jb3VudGVyLCBjdXJyZW50LT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LT5taW5fZGlzdGFuY2UsIGZsYWdzKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWRkIGluZGV4IGVudHJ5XG4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpbmRleCByYW5nZXMgYXJyYXkKKyAgICAgICAgICAgIGlmIChjdXJyZW50X2luZGV4X3JhbmdlIDwgbXNjLT5pbmRleF9yYW5nZXMgfHwgaW5kZXggIT0gY3VycmVudF9pbmRleF9yYW5nZS0+ZW5kKSB7CisgICAgICAgICAgICAgICAgY3VycmVudF9pbmRleF9yYW5nZSsrOworICAgICAgICAgICAgICAgIGN1cnJlbnRfaW5kZXhfcmFuZ2UtPnN0YXJ0ID0gaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50X2luZGV4X3JhbmdlLT5lbmQgPSBpbmRleCArIDE7CisKKyAgICAgICAgICAgIC8vIE9ubHkgc3RhcnQgaW5jcmVtZW50aW5nIERUUyBpbiBmcmFtZV9kdXJhdGlvbiBhbW91bnRzLCB3aGVuIHdlIGVuY291bnRlciBhIGZyYW1lIGluIGVkaXQgbGlzdC4KKyAgICAgICAgICAgIGlmIChlZGl0X2xpc3Rfc3RhcnRfZW5jb3VudGVyZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgZWRpdF9saXN0X2R0c19jb3VudGVyID0gZWRpdF9saXN0X2R0c19jb3VudGVyICsgZnJhbWVfZHVyYXRpb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJyZWFrIHdoZW4gZm91bmQgZmlyc3Qga2V5IGZyYW1lIGFmdGVyIGVkaXQgZW50cnkgY29tcGxldGlvbgorICAgICAgICAgICAgaWYgKChjdXJyX2N0cyArIGZyYW1lX2R1cmF0aW9uID49IChlZGl0X2xpc3RfZHVyYXRpb24gKyBlZGl0X2xpc3RfbWVkaWFfdGltZSkpICYmCisgICAgICAgICAgICAgICAgKChmbGFncyAmIEFWSU5ERVhfS0VZRlJBTUUpIHx8ICgoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykpKSkgeworICAgICAgICAgICAgICAgIGlmIChjdHRzX2RhdGFfb2xkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgQ1RUUyBhbmQgdGhpcyBpcyB0aGUgZmlyc3Qga2V5ZnJhbWUgYWZ0ZXIgZWRpdCBlbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3Igb25lIG1vcmUsIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUgdHJhaWxpbmcgQi1mcmFtZXMgYWZ0ZXIgdGhpcyBJLWZyYW1lCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgZG8gYmVsb25nIHRvIHRoZSBlZGl0LgorICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyAmJiBmb3VuZF9rZXlmcmFtZV9hZnRlcl9lZGl0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kX2tleWZyYW1lX2FmdGVyX2VkaXQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0dHNfc2FtcGxlX29sZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkX2N0dHNfZW50cnkoJm1zYy0+Y3R0c19kYXRhLCAmbXNjLT5jdHRzX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2MtPmN0dHNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R0c19zYW1wbGVfb2xkIC0gZWRpdF9saXN0X3N0YXJ0X2N0dHNfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0dHNfZGF0YV9vbGRbY3R0c19pbmRleF9vbGRdLmR1cmF0aW9uKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWRkIENUVFMgZW50cnkgJSJQUklkNjQiIC0geyUiUFJJZDY0IiwgJWR9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHRzX2luZGV4X29sZCwgY3R0c19zYW1wbGVfb2xkIC0gZWRpdF9saXN0X3N0YXJ0X2N0dHNfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHRzX2RhdGFfb2xkW2N0dHNfaW5kZXhfb2xkXS5kdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgdGhlcmUgYXJlIGVtcHR5IGVkaXRzLCB0aGVuIG1zYy0+bWluX2NvcnJlY3RlZF9wdHMgbWlnaHQgYmUgcG9zaXRpdmUKKyAgICAvLyBpbnRlbnRpb25hbGx5LiBTbyB3ZSBzdWJ0cmFjdCB0aGUgc3VtIGR1cmF0aW9uIG9mIGVtdHB5IGVkaXRzIGhlcmUuCisgICAgbXNjLT5taW5fY29ycmVjdGVkX3B0cyAtPSBlbXB0eV9lZGl0c19zdW1fZHVyYXRpb247CisKKyAgICAvLyBJZiB0aGUgbWluaW11bSBwdHMgdHVybnMgb3V0IHRvIGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIGFmdGVyIGZpeGluZyB0aGUgaW5kZXgsIHRoZW4gd2Ugc3VidHJhY3QgdGhlCisgICAgLy8gZHRzIGJ5IHRoYXQgYW1vdW50IHRvIG1ha2UgdGhlIGZpcnN0IHB0cyB6ZXJvLgorICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIG1zYy0+bWluX2NvcnJlY3RlZF9wdHMgPiAwKSB7CisgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfREVCVUcsICJPZmZzZXQgRFRTIGJ5ICUiUFJJZDY0IiB0byBtYWtlIGZpcnN0IHB0cyB6ZXJvLlxuIiwgbXNjLT5taW5fY29ycmVjdGVkX3B0cyk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+bmJfaW5kZXhfZW50cmllczsgKytpKSB7CisgICAgICAgICAgICBzdC0+aW5kZXhfZW50cmllc1tpXS50aW1lc3RhbXAgLT0gbXNjLT5taW5fY29ycmVjdGVkX3B0czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSBhdiBzdHJlYW0gbGVuZ3RoCisgICAgc3QtPmR1cmF0aW9uID0gZWRpdF9saXN0X2R0c19lbnRyeV9lbmQgLSBzdGFydF9kdHM7CisgICAgbXNjLT5zdGFydF9wYWQgPSBzdC0+c2tpcF9zYW1wbGVzOworCisgICAgLy8gRnJlZSB0aGUgb2xkIGluZGV4IGFuZCB0aGUgb2xkIENUVFMgc3RydWN0dXJlcworICAgIGF2X2ZyZWUoZV9vbGQpOworICAgIGF2X2ZyZWUoY3R0c19kYXRhX29sZCk7CisgICAgYXZfZnJlZXAoJmZyYW1lX2R1cmF0aW9uX2J1ZmZlcik7CisKKyAgICAvLyBOdWxsIHRlcm1pbmF0ZSB0aGUgaW5kZXggcmFuZ2VzIGFycmF5CisgICAgY3VycmVudF9pbmRleF9yYW5nZSsrOworICAgIGN1cnJlbnRfaW5kZXhfcmFuZ2UtPnN0YXJ0ID0gMDsKKyAgICBjdXJyZW50X2luZGV4X3JhbmdlLT5lbmQgPSAwOworICAgIG1zYy0+Y3VycmVudF9pbmRleCA9IG1zYy0+aW5kZXhfcmFuZ2VzWzBdLnN0YXJ0OwogfQogCiBzdGF0aWMgdm9pZCBtb3ZfYnVpbGRfaW5kZXgoTU9WQ29udGV4dCAqbW92LCBBVlN0cmVhbSAqc3QpCkBAIC0yNjMyLDkgKzM3MTgsMTEgQEAKICAgICB1bnNpZ25lZCBpbnQgc3Rwc19pbmRleCA9IDA7CiAgICAgdW5zaWduZWQgaW50IGksIGo7CiAgICAgdWludDY0X3Qgc3RyZWFtX3NpemUgPSAwOworICAgIE1PVlN0dHMgKmN0dHNfZGF0YV9vbGQgPSBzYy0+Y3R0c19kYXRhOworICAgIHVuc2lnbmVkIGludCBjdHRzX2NvdW50X29sZCA9IHNjLT5jdHRzX2NvdW50OwogCiAgICAgaWYgKHNjLT5lbHN0X2NvdW50KSB7Ci0gICAgICAgIGludCBpLCBlZGl0X3N0YXJ0X2luZGV4ID0gMCwgdW5zdXBwb3J0ZWQgPSAwOworICAgICAgICBpbnQgaSwgZWRpdF9zdGFydF9pbmRleCA9IDAsIG11bHRpcGxlX2VkaXRzID0gMDsKICAgICAgICAgaW50NjRfdCBlbXB0eV9kdXJhdGlvbiA9IDA7IC8vIGVtcHR5IGR1cmF0aW9uIG9mIHRoZSBmaXJzdCBlZGl0IGxpc3QgZW50cnkKICAgICAgICAgaW50NjRfdCBzdGFydF90aW1lID0gMDsgLy8gc3RhcnQgdGltZSBvZiB0aGUgbWVkaWEKIApAQCAtMjY0NywzMSArMzczNSwzMyBAQAogICAgICAgICAgICAgICAgIGVkaXRfc3RhcnRfaW5kZXggPSAxOwogICAgICAgICAgICAgfSBlbHNlIGlmIChpID09IGVkaXRfc3RhcnRfaW5kZXggJiYgZS0+dGltZSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgc3RhcnRfdGltZSA9IGUtPnRpbWU7Ci0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG11bHRpcGxlX2VkaXRzID0gMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAodW5zdXBwb3J0ZWQpCisKKyAgICAgICAgaWYgKG11bHRpcGxlX2VkaXRzICYmICFtb3YtPmFkdmFuY2VkX2VkaXRsaXN0KQogICAgICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19XQVJOSU5HLCAibXVsdGlwbGUgZWRpdCBsaXN0IGVudHJpZXMsICIKLSAgICAgICAgICAgICAgICAgICAiYS92IGRlc3luYyBtaWdodCBvY2N1ciwgcGF0Y2ggd2VsY29tZVxuIik7CisgICAgICAgICAgICAgICAgICAgIlVzZSAtYWR2YW5jZWRfZWRpdGxpc3QgdG8gY29ycmVjdGx5IGRlY29kZSBvdGhlcndpc2UgIgorICAgICAgICAgICAgICAgICAgICJhL3YgZGVzeW5jIG1pZ2h0IG9jY3VyXG4iKTsKIAogICAgICAgICAvKiBhZGp1c3QgZmlyc3QgZHRzIGFjY29yZGluZyB0byBlZGl0IGxpc3QgKi8KICAgICAgICAgaWYgKChlbXB0eV9kdXJhdGlvbiB8fCBzdGFydF90aW1lKSAmJiBtb3YtPnRpbWVfc2NhbGUgPiAwKSB7CiAgICAgICAgICAgICBpZiAoZW1wdHlfZHVyYXRpb24pCiAgICAgICAgICAgICAgICAgZW1wdHlfZHVyYXRpb24gPSBhdl9yZXNjYWxlKGVtcHR5X2R1cmF0aW9uLCBzYy0+dGltZV9zY2FsZSwgbW92LT50aW1lX3NjYWxlKTsKICAgICAgICAgICAgIHNjLT50aW1lX29mZnNldCA9IHN0YXJ0X3RpbWUgLSBlbXB0eV9kdXJhdGlvbjsKLSAgICAgICAgICAgIGN1cnJlbnRfZHRzID0gLXNjLT50aW1lX29mZnNldDsKLSAgICAgICAgICAgIGlmIChzYy0+Y3R0c19jb3VudD4wICYmIHNjLT5zdHRzX2NvdW50PjAgJiYKLSAgICAgICAgICAgICAgICBzYy0+Y3R0c19kYXRhWzBdLmR1cmF0aW9uIC8gRkZNQVgoc2MtPnN0dHNfZGF0YVswXS5kdXJhdGlvbiwgMSkgPiAxNikgewotICAgICAgICAgICAgICAgIC8qIG1vcmUgdGhhbiAxNiBmcmFtZXMgZGVsYXksIGR0cyBhcmUgbGlrZWx5IHdyb25nCi0gICAgICAgICAgICAgICAgICAgdGhpcyBoYXBwZW5zIHdpdGggZmlsZXMgY3JlYXRlZCBieSBpTW92aWUgKi8KLSAgICAgICAgICAgICAgICBzYy0+d3JvbmdfZHRzID0gMTsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhhc19iX2ZyYW1lcyA9IDE7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBzYy0+bWluX2NvcnJlY3RlZF9wdHMgPSBzdGFydF90aW1lOworICAgICAgICAgICAgaWYgKCFtb3YtPmFkdmFuY2VkX2VkaXRsaXN0KQorICAgICAgICAgICAgICAgIGN1cnJlbnRfZHRzID0gLXNjLT50aW1lX29mZnNldDsKICAgICAgICAgfQorCisgICAgICAgIGlmICghbXVsdGlwbGVfZWRpdHMgJiYgIW1vdi0+YWR2YW5jZWRfZWRpdGxpc3QgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmIHN0YXJ0X3RpbWUgPiAwKQorICAgICAgICAgICAgc2MtPnN0YXJ0X3BhZCA9IHN0YXJ0X3RpbWU7CiAgICAgfQogCiAgICAgLyogb25seSB1c2Ugb2xkIHVuY29tcHJlc3NlZCBhdWRpbyBjaHVuayBkZW11eGluZyB3aGVuIHN0dHMgc3BlY2lmaWVzIGl0ICovCi0gICAgaWYgKCEoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgIGlmICghKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKICAgICAgICAgICBzYy0+c3R0c19jb3VudCA9PSAxICYmIHNjLT5zdHRzX2RhdGFbMF0uZHVyYXRpb24gPT0gMSkpIHsKICAgICAgICAgdW5zaWduZWQgaW50IGN1cnJlbnRfc2FtcGxlID0gMDsKICAgICAgICAgdW5zaWduZWQgaW50IHN0dHNfc2FtcGxlID0gMDsKQEAgLTI2OTksMTAgKzM3ODksMzUgQEAKICAgICAgICAgfQogICAgICAgICBzdC0+aW5kZXhfZW50cmllc19hbGxvY2F0ZWRfc2l6ZSA9IChzdC0+bmJfaW5kZXhfZW50cmllcyArIHNjLT5zYW1wbGVfY291bnQpICogc2l6ZW9mKCpzdC0+aW5kZXhfZW50cmllcyk7CiAKKyAgICAgICAgaWYgKGN0dHNfZGF0YV9vbGQpIHsKKyAgICAgICAgICAgIC8vIEV4cGFuZCBjdHRzIGVudHJpZXMgc3VjaCB0aGF0IHdlIGhhdmUgYSAxLTEgbWFwcGluZyB3aXRoIHNhbXBsZXMKKyAgICAgICAgICAgIGlmIChzYy0+c2FtcGxlX2NvdW50ID49IFVJTlRfTUFYIC8gc2l6ZW9mKCpzYy0+Y3R0c19kYXRhKSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzYy0+Y3R0c19jb3VudCA9IDA7CisgICAgICAgICAgICBzYy0+Y3R0c19hbGxvY2F0ZWRfc2l6ZSA9IDA7CisgICAgICAgICAgICBzYy0+Y3R0c19kYXRhID0gYXZfZmFzdF9yZWFsbG9jKE5VTEwsICZzYy0+Y3R0c19hbGxvY2F0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5zYW1wbGVfY291bnQgKiBzaXplb2YoKnNjLT5jdHRzX2RhdGEpKTsKKyAgICAgICAgICAgIGlmICghc2MtPmN0dHNfZGF0YSkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUoY3R0c19kYXRhX29sZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1zZXQoKHVpbnQ4X3QqKShzYy0+Y3R0c19kYXRhKSwgMCwgc2MtPmN0dHNfYWxsb2NhdGVkX3NpemUpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R0c19jb3VudF9vbGQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5jdHRzX2NvdW50IDwgc2MtPnNhbXBsZV9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjdHRzX2RhdGFfb2xkW2ldLmNvdW50ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmN0dHNfY291bnQgPCBzYy0+c2FtcGxlX2NvdW50OyBqKyspCisgICAgICAgICAgICAgICAgICAgIGFkZF9jdHRzX2VudHJ5KCZzYy0+Y3R0c19kYXRhLCAmc2MtPmN0dHNfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYy0+Y3R0c19hbGxvY2F0ZWRfc2l6ZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R0c19kYXRhX29sZFtpXS5kdXJhdGlvbik7CisgICAgICAgICAgICBhdl9mcmVlKGN0dHNfZGF0YV9vbGQpOworICAgICAgICB9CisKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjLT5jaHVua19jb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBpbnQ2NF90IG5leHRfb2Zmc2V0ID0gaSsxIDwgc2MtPmNodW5rX2NvdW50ID8gc2MtPmNodW5rX29mZnNldHNbaSsxXSA6IElOVDY0X01BWDsKICAgICAgICAgICAgIGN1cnJlbnRfb2Zmc2V0ID0gc2MtPmNodW5rX29mZnNldHNbaV07Ci0gICAgICAgICAgICB3aGlsZSAoc3RzY19pbmRleCArIDEgPCBzYy0+c3RzY19jb3VudCAmJgorICAgICAgICAgICAgd2hpbGUgKG1vdl9zdHNjX2luZGV4X3ZhbGlkKHN0c2NfaW5kZXgsIHNjLT5zdHNjX2NvdW50KSAmJgogICAgICAgICAgICAgICAgIGkgKyAxID09IHNjLT5zdHNjX2RhdGFbc3RzY19pbmRleCArIDFdLmZpcnN0KQogICAgICAgICAgICAgICAgIHN0c2NfaW5kZXgrKzsKIApAQCAtMjc0MywyMyArMzg1OCwyOCBAQAogICAgICAgICAgICAgICAgIGlmIChzYy0+a2V5ZnJhbWVfYWJzZW50CiAgICAgICAgICAgICAgICAgICAgICYmICFzYy0+c3Rwc19jb3VudAogICAgICAgICAgICAgICAgICAgICAmJiAhcmFwX2dyb3VwX3ByZXNlbnQKLSAgICAgICAgICAgICAgICAgICAgJiYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gfHwgKGk9PTAgJiYgaj09MCkpKQorICAgICAgICAgICAgICAgICAgICAmJiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyB8fCAoaT09MCAmJiBqPT0wKSkpCiAgICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZSA9IDE7CiAgICAgICAgICAgICAgICAgaWYgKGtleWZyYW1lKQogICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IDA7CiAgICAgICAgICAgICAgICAgc2FtcGxlX3NpemUgPSBzYy0+c3Rzel9zYW1wbGVfc2l6ZSA+IDAgPyBzYy0+c3Rzel9zYW1wbGVfc2l6ZSA6IHNjLT5zYW1wbGVfc2l6ZXNbY3VycmVudF9zYW1wbGVdOwogICAgICAgICAgICAgICAgIGlmIChzYy0+cHNldWRvX3N0cmVhbV9pZCA9PSAtMSB8fAogICAgICAgICAgICAgICAgICAgIHNjLT5zdHNjX2RhdGFbc3RzY19pbmRleF0uaWQgLSAxID09IHNjLT5wc2V1ZG9fc3RyZWFtX2lkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFWSW5kZXhFbnRyeSAqZSA9ICZzdC0+aW5kZXhfZW50cmllc1tzdC0+bmJfaW5kZXhfZW50cmllcysrXTsKKyAgICAgICAgICAgICAgICAgICAgQVZJbmRleEVudHJ5ICplOworICAgICAgICAgICAgICAgICAgICBpZiAoc2FtcGxlX3NpemUgPiAweDNGRkZGRkZGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX0VSUk9SLCAiU2FtcGxlIHNpemUgJXUgaXMgdG9vIGxhcmdlXG4iLCBzYW1wbGVfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZSA9ICZzdC0+aW5kZXhfZW50cmllc1tzdC0+bmJfaW5kZXhfZW50cmllcysrXTsKICAgICAgICAgICAgICAgICAgICAgZS0+cG9zID0gY3VycmVudF9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgIGUtPnRpbWVzdGFtcCA9IGN1cnJlbnRfZHRzOwogICAgICAgICAgICAgICAgICAgICBlLT5zaXplID0gc2FtcGxlX3NpemU7CiAgICAgICAgICAgICAgICAgICAgIGUtPm1pbl9kaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgICAgICAgICAgICAgICAgICBlLT5mbGFncyA9IGtleWZyYW1lID8gQVZJTkRFWF9LRVlGUkFNRSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfVFJBQ0UsICJBVkluZGV4IHN0cmVhbSAlZCwgc2FtcGxlICVkLCBvZmZzZXQgJSJQUkl4NjQiLCBkdHMgJSJQUklkNjQiLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpemUgJWQsIGRpc3RhbmNlICVkLCBrZXlmcmFtZSAlZFxuIiwgc3QtPmluZGV4LCBjdXJyZW50X3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19UUkFDRSwgIkFWSW5kZXggc3RyZWFtICVkLCBzYW1wbGUgJXUsIG9mZnNldCAlIlBSSXg2NCIsIGR0cyAlIlBSSWQ2NCIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSAldSwgZGlzdGFuY2UgJXUsIGtleWZyYW1lICVkXG4iLCBzdC0+aW5kZXgsIGN1cnJlbnRfc2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb2Zmc2V0LCBjdXJyZW50X2R0cywgc2FtcGxlX3NpemUsIGRpc3RhbmNlLCBrZXlmcmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIHN0LT5uYl9pbmRleF9lbnRyaWVzIDwgMTAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBzdC0+bmJfaW5kZXhfZW50cmllcyA8IDEwMCkKICAgICAgICAgICAgICAgICAgICAgICAgIGZmX3JmcHNfYWRkX2ZyYW1lKG1vdi0+ZmMsIHN0LCBjdXJyZW50X2R0cyk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNzk2LDEwICszOTE2LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHN0LT5kdXJhdGlvbiA+IDApCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3RyZWFtX3NpemUqOCpzYy0+dGltZV9zY2FsZS9zdC0+ZHVyYXRpb247CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gc3RyZWFtX3NpemUqOCpzYy0+dGltZV9zY2FsZS9zdC0+ZHVyYXRpb247CiAgICAgfSBlbHNlIHsKICAgICAgICAgdW5zaWduZWQgY2h1bmtfc2FtcGxlcywgdG90YWwgPSAwOwogCisgICAgICAgIGlmICghc2MtPmNodW5rX2NvdW50KQorICAgICAgICAgICAgcmV0dXJuOworCiAgICAgICAgIC8vIGNvbXB1dGUgdG90YWwgY2h1bmsgY291bnQKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjLT5zdHNjX2NvdW50OyBpKyspIHsKICAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50LCBjaHVua19jb3VudDsKQEAgLTI4MjAsMTQgKzM5NDMsMTQgQEAKICAgICAgICAgICAgICAgICBjb3VudCA9IChjaHVua19zYW1wbGVzKzEwMjMpIC8gMTAyNDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGkgPCBzYy0+c3RzY19jb3VudCAtIDEpCisgICAgICAgICAgICBpZiAobW92X3N0c2NfaW5kZXhfdmFsaWQoaSwgc2MtPnN0c2NfY291bnQpKQogICAgICAgICAgICAgICAgIGNodW5rX2NvdW50ID0gc2MtPnN0c2NfZGF0YVtpKzFdLmZpcnN0IC0gc2MtPnN0c2NfZGF0YVtpXS5maXJzdDsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBjaHVua19jb3VudCA9IHNjLT5jaHVua19jb3VudCAtIChzYy0+c3RzY19kYXRhW2ldLmZpcnN0IC0gMSk7CiAgICAgICAgICAgICB0b3RhbCArPSBjaHVua19jb3VudCAqIGNvdW50OwogICAgICAgICB9CiAKLSAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19UUkFDRSwgImNodW5rIGNvdW50ICVkXG4iLCB0b3RhbCk7CisgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfVFJBQ0UsICJjaHVuayBjb3VudCAldVxuIiwgdG90YWwpOwogICAgICAgICBpZiAodG90YWwgPj0gVUlOVF9NQVggLyBzaXplb2YoKnN0LT5pbmRleF9lbnRyaWVzKSAtIHN0LT5uYl9pbmRleF9lbnRyaWVzKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBpZiAoYXZfcmVhbGxvY3BfYXJyYXkoJnN0LT5pbmRleF9lbnRyaWVzLApAQCAtMjg0MSw3ICszOTY0LDcgQEAKICAgICAgICAgLy8gcG9wdWxhdGUgaW5kZXgKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNjLT5jaHVua19jb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBjdXJyZW50X29mZnNldCA9IHNjLT5jaHVua19vZmZzZXRzW2ldOwotICAgICAgICAgICAgaWYgKHN0c2NfaW5kZXggKyAxIDwgc2MtPnN0c2NfY291bnQgJiYKKyAgICAgICAgICAgIGlmIChtb3Zfc3RzY19pbmRleF92YWxpZChzdHNjX2luZGV4LCBzYy0+c3RzY19jb3VudCkgJiYKICAgICAgICAgICAgICAgICBpICsgMSA9PSBzYy0+c3RzY19kYXRhW3N0c2NfaW5kZXggKyAxXS5maXJzdCkKICAgICAgICAgICAgICAgICBzdHNjX2luZGV4Kys7CiAgICAgICAgICAgICBjaHVua19zYW1wbGVzID0gc2MtPnN0c2NfZGF0YVtzdHNjX2luZGV4XS5jb3VudDsKQEAgLTI4NzIsNyArMzk5NSwxMSBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdC0+bmJfaW5kZXhfZW50cmllcyA+PSB0b3RhbCkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX0VSUk9SLCAid3JvbmcgY2h1bmsgY291bnQgJWRcbiIsIHRvdGFsKTsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19FUlJPUiwgIndyb25nIGNodW5rIGNvdW50ICV1XG4iLCB0b3RhbCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiAweDNGRkZGRkZGKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfRVJST1IsICJTYW1wbGUgc2l6ZSAldSBpcyB0b28gbGFyZ2VcbiIsIHNpemUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGUgPSAmc3QtPmluZGV4X2VudHJpZXNbc3QtPm5iX2luZGV4X2VudHJpZXMrK107CkBAIC0yODgxLDkgKzQwMDgsOSBAQAogICAgICAgICAgICAgICAgIGUtPnNpemUgPSBzaXplOwogICAgICAgICAgICAgICAgIGUtPm1pbl9kaXN0YW5jZSA9IDA7CiAgICAgICAgICAgICAgICAgZS0+ZmxhZ3MgPSBBVklOREVYX0tFWUZSQU1FOwotICAgICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfVFJBQ0UsICJBVkluZGV4IHN0cmVhbSAlZCwgY2h1bmsgJWQsIG9mZnNldCAlIlBSSXg2NCIsIGR0cyAlIlBSSWQ2NCIsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJzaXplICVkLCBkdXJhdGlvbiAlZFxuIiwgc3QtPmluZGV4LCBpLCBjdXJyZW50X29mZnNldCwgY3VycmVudF9kdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBzYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX1RSQUNFLCAiQVZJbmRleCBzdHJlYW0gJWQsIGNodW5rICV1LCBvZmZzZXQgJSJQUkl4NjQiLCBkdHMgJSJQUklkNjQiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJzaXplICV1LCBkdXJhdGlvbiAldVxuIiwgc3QtPmluZGV4LCBpLCBjdXJyZW50X29mZnNldCwgY3VycmVudF9kdHMsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHNhbXBsZXMpOwogCiAgICAgICAgICAgICAgICAgY3VycmVudF9vZmZzZXQgKz0gc2l6ZTsKICAgICAgICAgICAgICAgICBjdXJyZW50X2R0cyArPSBzYW1wbGVzOwpAQCAtMjg5MSw2ICs0MDE4LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKKyAgICBpZiAoIW1vdi0+aWdub3JlX2VkaXRsaXN0ICYmIG1vdi0+YWR2YW5jZWRfZWRpdGxpc3QpIHsKKyAgICAgICAgLy8gRml4IGluZGV4IGFjY29yZGluZyB0byBlZGl0IGxpc3RzLgorICAgICAgICBtb3ZfZml4X2luZGV4KG1vdiwgc3QpOworICAgIH0KKworICAgIG1vdl9lc3RpbWF0ZV92aWRlb19kZWxheShtb3YsIHN0KTsKIH0KIAogc3RhdGljIGludCB0ZXN0X3NhbWVfb3JpZ2luKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqcmVmKSB7CkBAIC0zMDEyLDEyICs0MTQ2LDEyIEBACiAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYy0+ZmMsIE5VTEwpOwogICAgIGlmICghc3QpIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmlkID0gYy0+ZmMtPm5iX3N0cmVhbXM7CisgICAgc3QtPmlkID0gLTE7CiAgICAgc2MgPSBhdl9tYWxsb2N6KHNpemVvZihNT1ZTdHJlYW1Db250ZXh0KSk7CiAgICAgaWYgKCFzYykgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIHN0LT5wcml2X2RhdGEgPSBzYzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKICAgICBzYy0+ZmZpbmRleCA9IHN0LT5pbmRleDsKICAgICBjLT50cmFrX2luZGV4ID0gc3QtPmluZGV4OwogCkBAIC0zMDI2LDEzICs0MTYwLDI2IEBACiAKICAgICBjLT50cmFrX2luZGV4ID0gLTE7CiAKKyAgICAvLyBIZXJlIHN0c2MgcmVmZXJzIHRvIGEgY2h1bmsgbm90IGRlc2NyaWJlZCBpbiBzdGNvLiBUaGlzIGlzIHRlY2huaWNhbGx5IGludmFsaWQsCisgICAgLy8gYnV0IHdlIGNhbiBvdmVybG9vayBpdCAoY2xlYXJpbmcgc3RzYykgd2hlbmV2ZXIgc3R0c19jb3VudCA9PSAwIChpbmRpY2F0aW5nIG5vIHNhbXBsZXMpLgorICAgIGlmICghc2MtPmNodW5rX2NvdW50ICYmICFzYy0+c3R0c19jb3VudCAmJiBzYy0+c3RzY19jb3VudCkgeworICAgICAgICBzYy0+c3RzY19jb3VudCA9IDA7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+c3RzY19kYXRhKTsKKyAgICB9CisKICAgICAvKiBzYW5pdHkgY2hlY2tzICovCi0gICAgaWYgKHNjLT5jaHVua19jb3VudCAmJiAoIXNjLT5zdHRzX2NvdW50IHx8ICFzYy0+c3RzY19jb3VudCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICghc2MtPnNhbXBsZV9zaXplICYmICFzYy0+c2FtcGxlX2NvdW50KSkpIHsKKyAgICBpZiAoKHNjLT5jaHVua19jb3VudCAmJiAoIXNjLT5zdHRzX2NvdW50IHx8ICFzYy0+c3RzY19jb3VudCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICghc2MtPnNhbXBsZV9zaXplICYmICFzYy0+c2FtcGxlX2NvdW50KSkpIHx8CisgICAgICAgICghc2MtPmNodW5rX2NvdW50ICYmIHNjLT5zYW1wbGVfY291bnQpKSB7CiAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAic3RyZWFtICVkLCBtaXNzaW5nIG1hbmRhdG9yeSBhdG9tcywgYnJva2VuIGhlYWRlclxuIiwKICAgICAgICAgICAgICAgIHN0LT5pbmRleCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KKyAgICBpZiAoc2MtPnN0c2NfY291bnQgJiYgc2MtPnN0c2NfZGF0YVsgc2MtPnN0c2NfY291bnQgLSAxIF0uZmlyc3QgPiBzYy0+Y2h1bmtfY291bnQpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJzdHJlYW0gJWQsIGNvbnRyYWRpY3Rpb25hcnkgU1RTQyBhbmQgU1RDT1xuIiwKKyAgICAgICAgICAgICAgIHN0LT5pbmRleCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KIAogICAgIGZpeF90aW1lc2NhbGUoYywgc2MpOwogCkBAIC0zMDQzLDcgKzQxOTAsNyBAQAogICAgIGlmIChzYy0+ZHJlZl9pZC0xIDwgc2MtPmRyZWZzX2NvdW50ICYmIHNjLT5kcmVmc1tzYy0+ZHJlZl9pZC0xXS5wYXRoKSB7CiAgICAgICAgIE1PVkRyZWYgKmRyZWYgPSAmc2MtPmRyZWZzW3NjLT5kcmVmX2lkIC0gMV07CiAgICAgICAgIGlmIChjLT5lbmFibGVfZHJlZnMpIHsKLSAgICAgICAgICAgIGlmIChtb3Zfb3Blbl9kcmVmKGMsICZzYy0+cGIsIGMtPmZjLT5maWxlbmFtZSwgZHJlZikgPCAwKQorICAgICAgICAgICAgaWYgKG1vdl9vcGVuX2RyZWYoYywgJnNjLT5wYiwgYy0+ZmMtPnVybCwgZHJlZikgPCAwKQogICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtICVkLCBlcnJvciBvcGVuaW5nIGFsaWFzOiBwYXRoPSclcycsIGRpcj0nJXMnLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlbmFtZT0nJXMnLCB2b2x1bWU9JyVzJywgbmx2bF9mcm9tPSVkLCBubHZsX3RvPSVkXG4iLApAQCAtMzA2MywxMiArNDIxMCwxMiBAQAogICAgICAgICBzYy0+cGJfaXNfY29waWVkID0gMTsKICAgICB9CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICBpZiAoIXN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAmJiBzdC0+Y29kZWMtPndpZHRoICYmIHN0LT5jb2RlYy0+aGVpZ2h0ICYmCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKCFzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gJiYgc3QtPmNvZGVjcGFyLT53aWR0aCAmJiBzdC0+Y29kZWNwYXItPmhlaWdodCAmJgogICAgICAgICAgICAgc2MtPmhlaWdodCAmJiBzYy0+d2lkdGggJiYKLSAgICAgICAgICAgIChzdC0+Y29kZWMtPndpZHRoICE9IHNjLT53aWR0aCB8fCBzdC0+Y29kZWMtPmhlaWdodCAhPSBzYy0+aGVpZ2h0KSkgewotICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9kMnEoKChkb3VibGUpc3QtPmNvZGVjLT5oZWlnaHQgKiBzYy0+d2lkdGgpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKXN0LT5jb2RlYy0+d2lkdGggKiBzYy0+aGVpZ2h0KSwgSU5UX01BWCk7CisgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT53aWR0aCAhPSBzYy0+d2lkdGggfHwgc3QtPmNvZGVjcGFyLT5oZWlnaHQgIT0gc2MtPmhlaWdodCkpIHsKKyAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfZDJxKCgoZG91YmxlKXN0LT5jb2RlY3Bhci0+aGVpZ2h0ICogc2MtPndpZHRoKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSlzdC0+Y29kZWNwYXItPndpZHRoICogc2MtPmhlaWdodCksIElOVF9NQVgpOwogICAgICAgICB9CiAKICNpZiBGRl9BUElfUl9GUkFNRV9SQVRFCkBAIC0zMDc5LDE0ICs0MjI2LDE0IEBACiAgICAgfQogCiAgICAgLy8gZG9uZSBmb3IgYWk1cSwgYWk1MiwgYWk1NSwgYWkxcSwgYWkxMiBhbmQgYWkxNS4KLSAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgJiYgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmCi0gICAgICAgIFRBR19JU19BVkNJKHN0LT5jb2RlYy0+Y29kZWNfdGFnKSkgeworICAgIGlmICghc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQgJiYKKyAgICAgICAgVEFHX0lTX0FWQ0koc3QtPmNvZGVjcGFyLT5jb2RlY190YWcpKSB7CiAgICAgICAgIHJldCA9IGZmX2dlbmVyYXRlX2F2Y2lfZXh0cmFkYXRhKHN0KTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgIHN3aXRjaCAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkgewogI2lmIENPTkZJR19IMjYxX0RFQ09ERVIKICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjE6CiAjZW5kaWYKQEAgLTMwOTYsMjEgKzQyNDMsMjAgQEAKICNpZiBDT05GSUdfTVBFRzRfREVDT0RFUgogICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzQ6CiAjZW5kaWYKLSAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IDA7IC8qIGxldCBkZWNvZGVyIGluaXQgd2lkdGgvaGVpZ2h0ICovCi0gICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0PSAwOworICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoID0gMDsgLyogbGV0IGRlY29kZXIgaW5pdCB3aWR0aC9oZWlnaHQgKi8KKyAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQ9IDA7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIC8vIElmIHRoZSBkdXJhdGlvbiBvZiB0aGUgbXAzIHBhY2tldHMgaXMgbm90IGNvbnN0YW50LCB0aGVuIHRoZXkgY291bGQgbmVlZCBhIHBhcnNlcgotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMwogICAgICAgICAmJiBzYy0+c3R0c19jb3VudCA+IDMKICAgICAgICAgJiYgc2MtPnN0dHNfY291bnQqMTAgPiBzdC0+bmJfZnJhbWVzCi0gICAgICAgICYmIHNjLT50aW1lX3NjYWxlID09IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgJiYgc2MtPnRpbWVfc2NhbGUgPT0gc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSkgewogICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgfQogICAgIC8qIERvIG5vdCBuZWVkIHRob3NlIGFueW1vcmUuICovCiAgICAgYXZfZnJlZXAoJnNjLT5jaHVua19vZmZzZXRzKTsKLSAgICBhdl9mcmVlcCgmc2MtPnN0c2NfZGF0YSk7CiAgICAgYXZfZnJlZXAoJnNjLT5zYW1wbGVfc2l6ZXMpOwogICAgIGF2X2ZyZWVwKCZzYy0+a2V5ZnJhbWVzKTsKICAgICBhdl9mcmVlcCgmc2MtPnN0dHNfZGF0YSk7CkBAIC0zMTQwLDkgKzQyODYsOSBAQAogCiAgICAgYXZpb19za2lwKHBiLCA0KTsKICAgICBjb3VudCA9IGF2aW9fcmIzMihwYik7Ci0gICAgaWYgKGNvdW50ID4gVUlOVF9NQVggLyBzaXplb2YoKmMtPm1ldGFfa2V5cykpIHsKKyAgICBpZiAoY291bnQgPiBVSU5UX01BWCAvIHNpemVvZigqYy0+bWV0YV9rZXlzKSAtIDEpIHsKICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiVGhlICdrZXlzJyBhdG9tIHdpdGggdGhlIGludmFsaWQga2V5IGNvdW50OiAlZFxuIiwgY291bnQpOworICAgICAgICAgICAgICAgIlRoZSAna2V5cycgYXRvbSB3aXRoIHRoZSBpbnZhbGlkIGtleSBjb3VudDogJSJQUkl1MzIiXG4iLCBjb3VudCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIApAQCAtMzE1Niw3ICs0MzAyLDggQEAKICAgICAgICAgdWludDMyX3QgdHlwZSA9IGF2aW9fcmwzMihwYik7CiAgICAgICAgIGlmIChrZXlfc2l6ZSA8IDgpIHsKICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJUaGUga2V5IyAlZCBpbiBtZXRhIGhhcyBpbnZhbGlkIHNpemU6ICVkXG4iLCBpLCBrZXlfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIlRoZSBrZXkjICUiUFJJdTMyIiBpbiBtZXRhIGhhcyBpbnZhbGlkIHNpemU6IgorICAgICAgICAgICAgICAgICAgICIlIlBSSXUzMiJcbiIsIGksIGtleV9zaXplKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgICAgIGtleV9zaXplIC09IDg7CkBAIC0zMTcyLDExICs0MzE5LDEyIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbW92X3JlYWRfY3VzdG9tXzJwbHVzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUpCitzdGF0aWMgaW50IG1vdl9yZWFkX2N1c3RvbShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKIHsKLSAgICBpbnQ2NF90IGVuZCA9IGF2aW9fdGVsbChwYikgKyBzaXplOwotICAgIHVpbnQ4X3QgKmtleSA9IE5VTEwsICp2YWwgPSBOVUxMOworICAgIGludDY0X3QgZW5kID0gYXZpb190ZWxsKHBiKSArIGF0b20uc2l6ZTsKKyAgICB1aW50OF90ICprZXkgPSBOVUxMLCAqdmFsID0gTlVMTCwgKm1lYW4gPSBOVUxMOwogICAgIGludCBpOworICAgIGludCByZXQgPSAwOwogICAgIEFWU3RyZWFtICpzdDsKICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKIApAQCAtMzE4NSwxMCArNDMzMyw5IEBACiAgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKICAgICBzYyA9IHN0LT5wcml2X2RhdGE7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgICB1aW50OF90ICoqcDsKICAgICAgICAgdWludDMyX3QgbGVuLCB0YWc7Ci0gICAgICAgIGludCByZXQ7CiAKICAgICAgICAgaWYgKGVuZCAtIGF2aW9fdGVsbChwYikgPD0gMTIpCiAgICAgICAgICAgICBicmVhazsKQEAgLTMyMDEsNyArNDM0OCw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgbGVuIC09IDEyOwogCi0gICAgICAgIGlmICh0YWcgPT0gTUtUQUcoJ24nLCAnYScsICdtJywgJ2UnKSkKKyAgICAgICAgaWYgKHRhZyA9PSBNS1RBRygnbScsICdlJywgJ2EnLCAnbicpKQorICAgICAgICAgICAgcCA9ICZtZWFuOworICAgICAgICBlbHNlIGlmICh0YWcgPT0gTUtUQUcoJ24nLCAnYScsICdtJywgJ2UnKSkKICAgICAgICAgICAgIHAgPSAma2V5OwogICAgICAgICBlbHNlIGlmICh0YWcgPT0gTUtUQUcoJ2QnLCAnYScsICd0JywgJ2EnKSAmJiBsZW4gPiA0KSB7CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOwpAQCAtMzIxMSwxNyArNDM2MCwxOSBAQAogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgKnAgPSBhdl9tYWxsb2MobGVuICsgMSk7Ci0gICAgICAgIGlmICghKnApCisgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICAgIHJldCA9IGZmaW9fcmVhZF9zaXplKHBiLCAqcCwgbGVuKTsKICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgIGF2X2ZyZWVwKHApOwotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgICgqcClbbGVuXSA9IDA7CiAgICAgfQogCi0gICAgaWYgKGtleSAmJiB2YWwpIHsKKyAgICBpZiAobWVhbiAmJiBrZXkgJiYgdmFsKSB7CiAgICAgICAgIGlmIChzdHJjbXAoa2V5LCAiaVR1blNNUEIiKSA9PSAwKSB7CiAgICAgICAgICAgICBpbnQgcHJpbWluZywgcmVtYWluZGVyLCBzYW1wbGVzOwogICAgICAgICAgICAgaWYoc3NjYW5mKHZhbCwgIiUqWCAlWCAlWCAlWCIsICZwcmltaW5nLCAmcmVtYWluZGVyLCAmc2FtcGxlcykgPT0gMyl7CkBAIC0zMjM0LDQ0ICs0Mzg1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0RPTlRfU1RSRFVQX0tFWSB8IEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKICAgICAgICAgICAgIGtleSA9IHZhbCA9IE5VTEw7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19WRVJCT1NFLAorICAgICAgICAgICAgICAgIlVuaGFuZGxlZCBvciBtYWxmb3JtZWQgY3VzdG9tIG1ldGFkYXRhIG9mIHNpemUgJSJQUklkNjQiXG4iLCBhdG9tLnNpemUpOwogICAgIH0KIAogICAgIGF2aW9fc2VlayhwYiwgZW5kLCBTRUVLX1NFVCk7CiAgICAgYXZfZnJlZXAoJmtleSk7CiAgICAgYXZfZnJlZXAoJnZhbCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbW92X3JlYWRfY3VzdG9tKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQotewotICAgIGludDY0X3QgZW5kID0gYXZpb190ZWxsKHBiKSArIGF0b20uc2l6ZTsKLSAgICB1aW50MzJfdCB0YWcsIGxlbjsKLQotICAgIGlmIChhdG9tLnNpemUgPCA4KQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBsZW4gPSBhdmlvX3JiMzIocGIpOwotICAgIHRhZyA9IGF2aW9fcmwzMihwYik7Ci0KLSAgICBpZiAobGVuID4gYXRvbS5zaXplKQotICAgICAgICBnb3RvIGZhaWw7Ci0KLSAgICBpZiAodGFnID09IE1LVEFHKCdtJywgJ2UnLCAnYScsICduJykgJiYgbGVuID4gMTIpIHsKLSAgICAgICAgdWludDhfdCBkb21haW5bMTI4XTsKLSAgICAgICAgaW50IGRvbWFpbl9sZW47Ci0KLSAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLy8gZmxhZ3MKLSAgICAgICAgbGVuIC09IDEyOwotCi0gICAgICAgIGRvbWFpbl9sZW4gPSBhdmlvX2dldF9zdHIocGIsIGxlbiwgZG9tYWluLCBzaXplb2YoZG9tYWluKSk7Ci0gICAgICAgIGF2aW9fc2tpcChwYiwgbGVuIC0gZG9tYWluX2xlbik7Ci0gICAgICAgIHJldHVybiBtb3ZfcmVhZF9jdXN0b21fMnBsdXMoYywgcGIsIGVuZCAtIGF2aW9fdGVsbChwYikpOwotICAgIH0KLQotZmFpbDoKLSAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19WRVJCT1NFLAotICAgICAgICAgICAiVW5oYW5kbGVkIG9yIG1hbGZvcm1lZCBjdXN0b20gbWV0YWRhdGEgb2Ygc2l6ZSAlIlBSSWQ2NCJcbiIsIGF0b20uc2l6ZSk7Ci0gICAgcmV0dXJuIDA7CisgICAgYXZfZnJlZXAoJm1lYW4pOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbW92X3JlYWRfbWV0YShNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKQEAgLTMyODgsMTIgKzQ0MTEsMjIgQEAKICAgICByZXR1cm4gMDsKIH0KIAorLy8gcmV0dXJuIDEgd2hlbiBtYXRyaXggaXMgaWRlbnRpdHksIDAgb3RoZXJ3aXNlCisjZGVmaW5lIElTX01BVFJJWF9JREVOVChtYXRyaXgpICAgICAgICAgICAgXAorICAgICggKG1hdHJpeClbMF1bMF0gPT0gKDEgPDwgMTYpICYmICAgICAgIFwKKyAgICAgIChtYXRyaXgpWzFdWzFdID09ICgxIDw8IDE2KSAmJiAgICAgICBcCisgICAgICAobWF0cml4KVsyXVsyXSA9PSAoMSA8PCAzMCkgJiYgICAgICAgXAorICAgICAhKG1hdHJpeClbMF1bMV0gJiYgIShtYXRyaXgpWzBdWzJdICYmIFwKKyAgICAgIShtYXRyaXgpWzFdWzBdICYmICEobWF0cml4KVsxXVsyXSAmJiBcCisgICAgICEobWF0cml4KVsyXVswXSAmJiAhKG1hdHJpeClbMl1bMV0pCisKIHN0YXRpYyBpbnQgbW92X3JlYWRfdGtoZChNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKIHsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgaiwgZTsKICAgICBpbnQgd2lkdGg7CiAgICAgaW50IGhlaWdodDsKICAgICBpbnQgZGlzcGxheV9tYXRyaXhbM11bM107CisgICAgaW50IHJlc19kaXNwbGF5X21hdHJpeFszXVszXSA9IHsgeyAwIH0gfTsKICAgICBBVlN0cmVhbSAqc3Q7CiAgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CiAgICAgaW50IHZlcnNpb247CkBAIC0zMzA0LDYgKzQ0MzcsMTEgQEAKICAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zLTFdOwogICAgIHNjID0gc3QtPnByaXZfZGF0YTsKIAorICAgIC8vIEVhY2ggc3RyZWFtICh0cmFrKSBzaG91bGQgaGF2ZSBleGFjdGx5IDEgdGtoZC4gVGhpcyBjYXRjaGVzIGJhZCBmaWxlcyBhbmQKKyAgICAvLyBhdm9pZHMgY29ycnVwdGluZyBBVlN0cmVhbXMgbWFwcGVkIHRvIGFuIGVhcmxpZXIgdGtoZC4KKyAgICBpZiAoc3QtPmlkICE9IC0xKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKICAgICBmbGFncyA9IGF2aW9fcmIyNChwYik7CiAgICAgc3QtPmRpc3Bvc2l0aW9uIHw9IChmbGFncyAmIE1PVl9US0hEX0ZMQUdfRU5BQkxFRCkgPyBBVl9ESVNQT1NJVElPTl9ERUZBVUxUIDogMDsKQEAgLTMzNDMsMTUgKzQ0ODEsMjAgQEAKICAgICBzYy0+d2lkdGggPSB3aWR0aCA+PiAxNjsKICAgICBzYy0+aGVpZ2h0ID0gaGVpZ2h0ID4+IDE2OwogCi0gICAgLy8gc2F2ZSB0aGUgbWF0cml4IGFuZCBhZGQgcm90YXRlIG1ldGFkYXRhIHdoZW4gaXQgaXMgbm90IHRoZSBkZWZhdWx0Ci0gICAgLy8gaWRlbnRpdHkKLSAgICBpZiAoZGlzcGxheV9tYXRyaXhbMF1bMF0gIT0gKDEgPDwgMTYpIHx8Ci0gICAgICAgIGRpc3BsYXlfbWF0cml4WzFdWzFdICE9ICgxIDw8IDE2KSB8fAotICAgICAgICBkaXNwbGF5X21hdHJpeFsyXVsyXSAhPSAoMSA8PCAzMCkgfHwKLSAgICAgICAgZGlzcGxheV9tYXRyaXhbMF1bMV0gfHwgZGlzcGxheV9tYXRyaXhbMF1bMl0gfHwKLSAgICAgICAgZGlzcGxheV9tYXRyaXhbMV1bMF0gfHwgZGlzcGxheV9tYXRyaXhbMV1bMl0gfHwKLSAgICAgICAgZGlzcGxheV9tYXRyaXhbMl1bMF0gfHwgZGlzcGxheV9tYXRyaXhbMl1bMV0pIHsKLSAgICAgICAgaW50IGksIGo7CisgICAgLy8gYXBwbHkgdGhlIG1vb3YgZGlzcGxheSBtYXRyaXggKGFmdGVyIHRoZSB0a2hkIG9uZSkKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGludCBzaFszXSA9IHsgMTYsIDE2LCAzMCB9OworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7CisgICAgICAgICAgICBmb3IgKGUgPSAwOyBlIDwgMzsgZSsrKSB7CisgICAgICAgICAgICAgICAgcmVzX2Rpc3BsYXlfbWF0cml4W2ldW2pdICs9CisgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdCkgZGlzcGxheV9tYXRyaXhbaV1bZV0gKgorICAgICAgICAgICAgICAgICAgICAgYy0+bW92aWVfZGlzcGxheV9tYXRyaXhbZV1bal0pID4+IHNoW2VdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gc2F2ZSB0aGUgbWF0cml4IHdoZW4gaXQgaXMgbm90IHRoZSBkZWZhdWx0IGlkZW50aXR5CisgICAgaWYgKCFJU19NQVRSSVhfSURFTlQocmVzX2Rpc3BsYXlfbWF0cml4KSkgewogICAgICAgICBkb3VibGUgcm90YXRlOwogCiAgICAgICAgIGF2X2ZyZWVwKCZzYy0+ZGlzcGxheV9tYXRyaXgpOwpAQCAtMzM2MSw4ICs0NTA0LDkgQEAKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgICAgICBzYy0+ZGlzcGxheV9tYXRyaXhbaSAqIDMgKyBqXSA9IGRpc3BsYXlfbWF0cml4W2ldW2pdOworICAgICAgICAgICAgICAgIHNjLT5kaXNwbGF5X21hdHJpeFtpICogMyArIGpdID0gcmVzX2Rpc3BsYXlfbWF0cml4W2ldW2pdOwogCisjaWYgRkZfQVBJX09MRF9ST1RBVEVfQVBJCiAgICAgICAgIHJvdGF0ZSA9IGF2X2Rpc3BsYXlfcm90YXRpb25fZ2V0KHNjLT5kaXNwbGF5X21hdHJpeCk7CiAgICAgICAgIGlmICghaXNuYW4ocm90YXRlKSkgewogICAgICAgICAgICAgY2hhciByb3RhdGVfYnVmWzY0XTsKQEAgLTMzNzIsNiArNDUxNiw3IEBACiAgICAgICAgICAgICBzbnByaW50Zihyb3RhdGVfYnVmLCBzaXplb2Yocm90YXRlX2J1ZiksICIlZyIsIHJvdGF0ZSk7CiAgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAicm90YXRlIiwgcm90YXRlX2J1ZiwgMCk7CiAgICAgICAgIH0KKyNlbmRpZgogICAgIH0KIAogICAgIC8vIHRyYW5zZm9ybSB0aGUgZGlzcGxheSB3aWR0aC9oZWlnaHQgYWNjb3JkaW5nIHRvIHRoZSBtYXRyaXgKQEAgLTMzODAsNyArNDUyNSw4IEBACiAgICAgICAgIGRvdWJsZSBkaXNwX3RyYW5zZm9ybVsyXTsKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICAgICAgZGlzcF90cmFuc2Zvcm1baV0gPSBoeXBvdChkaXNwbGF5X21hdHJpeFtpXVswXSwgZGlzcGxheV9tYXRyaXhbaV1bMV0pOworICAgICAgICAgICAgZGlzcF90cmFuc2Zvcm1baV0gPSBoeXBvdChzYy0+ZGlzcGxheV9tYXRyaXhbMCArIGldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy0+ZGlzcGxheV9tYXRyaXhbMyArIGldKTsKIAogICAgICAgICBpZiAoZGlzcF90cmFuc2Zvcm1bMF0gPiAwICAgICAgICYmIGRpc3BfdHJhbnNmb3JtWzFdID4gMCAmJgogICAgICAgICAgICAgZGlzcF90cmFuc2Zvcm1bMF0gPCAoMTw8MjQpICYmIGRpc3BfdHJhbnNmb3JtWzFdIDwgKDE8PDI0KSAmJgpAQCAtMzM5Niw4ICs0NTQyLDkgQEAKIHsKICAgICBNT1ZGcmFnbWVudCAqZnJhZyA9ICZjLT5mcmFnbWVudDsKICAgICBNT1ZUcmFja0V4dCAqdHJleCA9IE5VTEw7Ci0gICAgTU9WRnJhZ21lbnRJbmRleCogaW5kZXggPSBOVUxMOwotICAgIGludCBmbGFncywgdHJhY2tfaWQsIGksIGZvdW5kID0gMDsKKyAgICBpbnQgZmxhZ3MsIHRyYWNrX2lkLCBpOworCisgICAgYy0+ZnJhZ21lbnQuZm91bmRfdGZoZCA9IDE7CiAKICAgICBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLwogICAgIGZsYWdzID0gYXZpb19yYjI0KHBiKTsKQEAgLTM0MDYsNiArNDU1Myw3IEBACiAgICAgaWYgKCF0cmFja19pZCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgZnJhZy0+dHJhY2tfaWQgPSB0cmFja19pZDsKKyAgICBzZXRfZnJhZ19zdHJlYW0oJmMtPmZyYWdfaW5kZXgsIHRyYWNrX2lkKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dHJleF9jb3VudDsgaSsrKQogICAgICAgICBpZiAoYy0+dHJleF9kYXRhW2ldLnRyYWNrX2lkID09IGZyYWctPnRyYWNrX2lkKSB7CiAgICAgICAgICAgICB0cmV4ID0gJmMtPnRyZXhfZGF0YVtpXTsKQEAgLTM0MjcsNDEgKzQ1NzUsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgIGF2aW9fcmIzMihwYikgOiB0cmV4LT5zaXplOwogICAgIGZyYWctPmZsYWdzICAgID0gZmxhZ3MgJiBNT1ZfVEZIRF9ERUZBVUxUX0ZMQUdTID8KICAgICAgICAgICAgICAgICAgICAgIGF2aW9fcmIzMihwYikgOiB0cmV4LT5mbGFnczsKLSAgICBmcmFnLT50aW1lICAgICA9IEFWX05PUFRTX1ZBTFVFOwotICAgIGZvciAoaSA9IDA7IGkgPCBjLT5mcmFnbWVudF9pbmRleF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBqOwotICAgICAgICBNT1ZGcmFnbWVudEluZGV4KiBjYW5kaWRhdGUgPSBjLT5mcmFnbWVudF9pbmRleF9kYXRhW2ldOwotICAgICAgICBpZiAoY2FuZGlkYXRlLT50cmFja19pZCA9PSBmcmFnLT50cmFja19pZCkgewotICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsCi0gICAgICAgICAgICAgICAgICAgImZvdW5kIGZyYWdtZW50IGluZGV4IGZvciB0cmFjayAldVxuIiwgZnJhZy0+dHJhY2tfaWQpOwotICAgICAgICAgICAgaW5kZXggPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICBmb3IgKGogPSBpbmRleC0+Y3VycmVudF9pdGVtOyBqIDwgaW5kZXgtPml0ZW1fY291bnQ7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChmcmFnLT5pbXBsaWNpdF9vZmZzZXQgPT0gaW5kZXgtPml0ZW1zW2pdLm1vb2Zfb2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZm91bmQgZnJhZ21lbnQgaW5kZXggZW50cnkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgdHJhY2sgJXUgYW5kIG1vb2Zfb2Zmc2V0ICUiUFJJZDY0IlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnLT50cmFja19pZCwgaW5kZXgtPml0ZW1zW2pdLm1vb2Zfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgZnJhZy0+dGltZSA9IGluZGV4LT5pdGVtc1tqXS50aW1lOwotICAgICAgICAgICAgICAgICAgICBpbmRleC0+Y3VycmVudF9pdGVtID0gaiArIDE7Ci0gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZvdW5kKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpbmRleCAmJiAhZm91bmQpIHsKLSAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsICJ0cmFjayAldSBoYXMgYSBmcmFnbWVudCBpbmRleCBidXQgIgotICAgICAgICAgICAgICAgIml0IGRvZXNuJ3QgaGF2ZSBhbiAoaW4tb3JkZXIpIGVudHJ5IGZvciBtb29mX29mZnNldCAiCi0gICAgICAgICAgICAgICAiJSJQUklkNjQiXG4iLCBmcmFnLT50cmFja19pZCwgZnJhZy0+aW1wbGljaXRfb2Zmc2V0KTsKLSAgICB9CiAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJmcmFnIGZsYWdzIDB4JXhcbiIsIGZyYWctPmZsYWdzKTsKKwogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IG1vdl9yZWFkX2NoYXAoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCiB7Ci0gICAgYy0+Y2hhcHRlcl90cmFjayA9IGF2aW9fcmIzMihwYik7CisgICAgdW5zaWduZWQgaSwgbnVtOworICAgIHZvaWQgKm5ld190cmFja3M7CisKKyAgICBudW0gPSBhdG9tLnNpemUgLyA0OworICAgIGlmICghKG5ld190cmFja3MgPSBhdl9tYWxsb2NfYXJyYXkobnVtLCBzaXplb2YoaW50KSkpKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZfZnJlZShjLT5jaGFwdGVyX3RyYWNrcyk7CisgICAgYy0+Y2hhcHRlcl90cmFja3MgPSBuZXdfdHJhY2tzOworICAgIGMtPm5iX2NoYXB0ZXJfdHJhY2tzID0gbnVtOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bSAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspCisgICAgICAgIGMtPmNoYXB0ZXJfdHJhY2tzW2ldID0gYXZpb19yYjMyKHBiKTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0zNDk3LDYgKzQ2MzEsOCBAQAogICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CiAgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CiAgICAgaW50IHZlcnNpb24sIGk7CisgICAgTU9WRnJhZ21lbnRTdHJlYW1JbmZvICogZnJhZ19zdHJlYW1faW5mbzsKKyAgICBpbnQ2NF90IGJhc2VfbWVkaWFfZGVjb2RlX3RpbWU7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+ZmMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpZiAoYy0+ZmMtPnN0cmVhbXNbaV0tPmlkID09IGZyYWctPnRyYWNrX2lkKSB7CkBAIC0zNTA1LDE5ICs0NjQxLDI1IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFzdCkgewotICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgdHJhY2sgaWQgJWRcbiIsIGZyYWctPnRyYWNrX2lkKTsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIHRyYWNrIGlkICV1XG4iLCBmcmFnLT50cmFja19pZCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBzYyA9IHN0LT5wcml2X2RhdGE7Ci0gICAgaWYgKHNjLT5wc2V1ZG9fc3RyZWFtX2lkICsgMSAhPSBmcmFnLT5zdHNkX2lkKQorICAgIGlmIChzYy0+cHNldWRvX3N0cmVhbV9pZCArIDEgIT0gZnJhZy0+c3RzZF9pZCAmJiBzYy0+cHNldWRvX3N0cmVhbV9pZCAhPSAtMSkKICAgICAgICAgcmV0dXJuIDA7CiAgICAgdmVyc2lvbiA9IGF2aW9fcjgocGIpOwogICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCiAgICAgaWYgKHZlcnNpb24pIHsKLSAgICAgICAgc2MtPnRyYWNrX2VuZCA9IGF2aW9fcmI2NChwYik7CisgICAgICAgIGJhc2VfbWVkaWFfZGVjb2RlX3RpbWUgPSBhdmlvX3JiNjQocGIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNjLT50cmFja19lbmQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBiYXNlX21lZGlhX2RlY29kZV90aW1lID0gYXZpb19yYjMyKHBiKTsKICAgICB9CisKKyAgICBmcmFnX3N0cmVhbV9pbmZvID0gZ2V0X2N1cnJlbnRfZnJhZ19zdHJlYW1faW5mbygmYy0+ZnJhZ19pbmRleCk7CisgICAgaWYgKGZyYWdfc3RyZWFtX2luZm8pCisgICAgICAgIGZyYWdfc3RyZWFtX2luZm8tPnRmZHRfZHRzID0gYmFzZV9tZWRpYV9kZWNvZGVfdGltZTsKKyAgICBzYy0+dHJhY2tfZW5kID0gYmFzZV9tZWRpYV9kZWNvZGVfdGltZTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0zNTI4LDEwICs0NjcwLDIxIEBACiAgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CiAgICAgTU9WU3R0cyAqY3R0c19kYXRhOwogICAgIHVpbnQ2NF90IG9mZnNldDsKLSAgICBpbnQ2NF90IGR0czsKKyAgICBpbnQ2NF90IGR0cywgcHRzID0gQVZfTk9QVFNfVkFMVUU7CiAgICAgaW50IGRhdGFfb2Zmc2V0ID0gMDsKICAgICB1bnNpZ25lZCBlbnRyaWVzLCBmaXJzdF9zYW1wbGVfZmxhZ3MgPSBmcmFnLT5mbGFnczsKLSAgICBpbnQgZmxhZ3MsIGRpc3RhbmNlLCBpLCBlcnI7CisgICAgaW50IGZsYWdzLCBkaXN0YW5jZSwgaTsKKyAgICBpbnQ2NF90IHByZXZfZHRzID0gQVZfTk9QVFNfVkFMVUU7CisgICAgaW50IG5leHRfZnJhZ19pbmRleCA9IC0xLCBpbmRleF9lbnRyeV9wb3M7CisgICAgc2l6ZV90IHJlcXVlc3RlZF9zaXplOworICAgIHNpemVfdCBvbGRfY3R0c19hbGxvY2F0ZWRfc2l6ZTsKKyAgICBBVkluZGV4RW50cnkgKm5ld19lbnRyaWVzOworICAgIE1PVkZyYWdtZW50U3RyZWFtSW5mbyAqIGZyYWdfc3RyZWFtX2luZm87CisKKyAgICBpZiAoIWZyYWctPmZvdW5kX3RmaGQpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJ0cnVuIHRyYWNrIGlkIHVua25vd24sIG5vIHRmaGQgd2FzIGZvdW5kXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IGMtPmZjLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgaWYgKGMtPmZjLT5zdHJlYW1zW2ldLT5pZCA9PSBmcmFnLT50cmFja19pZCkgewpAQCAtMzU0MCwxMDggKzQ2OTMsMjQxIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKCFzdCkgewotICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgdHJhY2sgaWQgJWRcbiIsIGZyYWctPnRyYWNrX2lkKTsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIHRyYWNrIGlkICV1XG4iLCBmcmFnLT50cmFja19pZCk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBzYyA9IHN0LT5wcml2X2RhdGE7CiAgICAgaWYgKHNjLT5wc2V1ZG9fc3RyZWFtX2lkKzEgIT0gZnJhZy0+c3RzZF9pZCAmJiBzYy0+cHNldWRvX3N0cmVhbV9pZCAhPSAtMSkKICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBGaW5kIHRoZSBuZXh0IGZyYWdfaW5kZXggaW5kZXggdGhhdCBoYXMgYSB2YWxpZCBpbmRleF9lbnRyeSBmb3IKKyAgICAvLyB0aGUgY3VycmVudCB0cmFja19pZC4KKyAgICAvLworICAgIC8vIEEgdmFsaWQgaW5kZXhfZW50cnkgbWVhbnMgdGhlIHRydW4gZm9yIHRoZSBmcmFnbWVudCB3YXMgcmVhZAorICAgIC8vIGFuZCBpdCdzIHNhbXBsZXMgYXJlIGluIGluZGV4X2VudHJpZXMgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgorICAgIC8vIE5ldyBpbmRleCBlbnRyaWVzIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBpbmRleF9lbnRyeSBmb3VuZC4KKyAgICBpbmRleF9lbnRyeV9wb3MgPSBzdC0+bmJfaW5kZXhfZW50cmllczsKKyAgICBmb3IgKGkgPSBjLT5mcmFnX2luZGV4LmN1cnJlbnQgKyAxOyBpIDwgYy0+ZnJhZ19pbmRleC5uYl9pdGVtczsgaSsrKSB7CisgICAgICAgIGZyYWdfc3RyZWFtX2luZm8gPSBnZXRfZnJhZ19zdHJlYW1faW5mbygmYy0+ZnJhZ19pbmRleCwgaSwgZnJhZy0+dHJhY2tfaWQpOworICAgICAgICBpZiAoZnJhZ19zdHJlYW1faW5mbyAmJiBmcmFnX3N0cmVhbV9pbmZvLT5pbmRleF9lbnRyeSA+PSAwKSB7CisgICAgICAgICAgICBuZXh0X2ZyYWdfaW5kZXggPSBpOworICAgICAgICAgICAgaW5kZXhfZW50cnlfcG9zID0gZnJhZ19zdHJlYW1faW5mby0+aW5kZXhfZW50cnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9hc3NlcnQwKGluZGV4X2VudHJ5X3BvcyA8PSBzdC0+bmJfaW5kZXhfZW50cmllcyk7CisKICAgICBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLwogICAgIGZsYWdzID0gYXZpb19yYjI0KHBiKTsKICAgICBlbnRyaWVzID0gYXZpb19yYjMyKHBiKTsKLSAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgImZsYWdzIDB4JXggZW50cmllcyAlZFxuIiwgZmxhZ3MsIGVudHJpZXMpOworICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAiZmxhZ3MgMHgleCBlbnRyaWVzICV1XG4iLCBmbGFncywgZW50cmllcyk7CiAKLSAgICAvKiBBbHdheXMgYXNzdW1lIHRoZSBwcmVzZW5jZSBvZiBjb21wb3NpdGlvbiB0aW1lIG9mZnNldHMuCi0gICAgICogV2l0aG91dCB0aGlzIGFzc3VtcHRpb24sIGZvciBpbnN0YW5jZSwgd2UgY2Fubm90IGRlYWwgd2l0aCBhIHRyYWNrIGluIGZyYWdtZW50ZWQgbW92aWVzIHRoYXQgbWVldCB0aGUgZm9sbG93aW5nLgotICAgICAqICAxKSBpbiB0aGUgaW5pdGlhbCBtb3ZpZSwgdGhlcmUgYXJlIG5vIHNhbXBsZXMuCi0gICAgICogIDIpIGluIHRoZSBmaXJzdCBtb3ZpZSBmcmFnbWVudCwgdGhlcmUgaXMgb25seSBvbmUgc2FtcGxlIHdpdGhvdXQgY29tcG9zaXRpb24gdGltZSBvZmZzZXQuCi0gICAgICogIDMpIGluIHRoZSBzdWJzZXF1ZW50IG1vdmllIGZyYWdtZW50cywgdGhlcmUgYXJlIHNhbXBsZXMgd2l0aCBjb21wb3NpdGlvbiB0aW1lIG9mZnNldC4gKi8KLSAgICBpZiAoIXNjLT5jdHRzX2NvdW50ICYmIHNjLT5zYW1wbGVfY291bnQpCi0gICAgewotICAgICAgICAvKiBDb21wbGVtZW50IGN0dHMgdGFibGUgaWYgbW9vdiBhdG9tIGRvZXNuJ3QgaGF2ZSBjdHRzIGF0b20uICovCi0gICAgICAgIGN0dHNfZGF0YSA9IGF2X3JlYWxsb2MoTlVMTCwgc2l6ZW9mKCpzYy0+Y3R0c19kYXRhKSk7Ci0gICAgICAgIGlmICghY3R0c19kYXRhKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgc2MtPmN0dHNfZGF0YSA9IGN0dHNfZGF0YTsKLSAgICAgICAgc2MtPmN0dHNfZGF0YVtzYy0+Y3R0c19jb3VudF0uY291bnQgPSBzYy0+c2FtcGxlX2NvdW50OwotICAgICAgICBzYy0+Y3R0c19kYXRhW3NjLT5jdHRzX2NvdW50XS5kdXJhdGlvbiA9IDA7Ci0gICAgICAgIHNjLT5jdHRzX2NvdW50Kys7Ci0gICAgfQogICAgIGlmICgodWludDY0X3QpZW50cmllcytzYy0+Y3R0c19jb3VudCA+PSBVSU5UX01BWC9zaXplb2YoKnNjLT5jdHRzX2RhdGEpKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwX2FycmF5KCZzYy0+Y3R0c19kYXRhLCBlbnRyaWVzICsgc2MtPmN0dHNfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnNjLT5jdHRzX2RhdGEpKSkgPCAwKSB7Ci0gICAgICAgIHNjLT5jdHRzX2NvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9CiAgICAgaWYgKGZsYWdzICYgTU9WX1RSVU5fREFUQV9PRkZTRVQpICAgICAgICBkYXRhX29mZnNldCAgICAgICAgPSBhdmlvX3JiMzIocGIpOwogICAgIGlmIChmbGFncyAmIE1PVl9UUlVOX0ZJUlNUX1NBTVBMRV9GTEFHUykgZmlyc3Rfc2FtcGxlX2ZsYWdzID0gYXZpb19yYjMyKHBiKTsKLSAgICBkdHMgICAgPSBzYy0+dHJhY2tfZW5kIC0gc2MtPnRpbWVfb2Zmc2V0OwotICAgIG9mZnNldCA9IGZyYWctPmJhc2VfZGF0YV9vZmZzZXQgKyBkYXRhX29mZnNldDsKKworICAgIGZyYWdfc3RyZWFtX2luZm8gPSBnZXRfY3VycmVudF9mcmFnX3N0cmVhbV9pbmZvKCZjLT5mcmFnX2luZGV4KTsKKyAgICBpZiAoZnJhZ19zdHJlYW1faW5mbykKKyAgICB7CisgICAgICAgIGlmIChmcmFnX3N0cmVhbV9pbmZvLT5maXJzdF90ZnJhX3B0cyAhPSBBVl9OT1BUU19WQUxVRSAmJgorICAgICAgICAgICAgYy0+dXNlX21mcmFfZm9yID09IEZGX01PVl9GTEFHX01GUkFfUFRTKSB7CisgICAgICAgICAgICBwdHMgPSBmcmFnX3N0cmVhbV9pbmZvLT5maXJzdF90ZnJhX3B0czsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZm91bmQgbWZyYSB0aW1lICUiUFJJZDY0CisgICAgICAgICAgICAgICAgICAgICIsIHVzaW5nIGl0IGZvciBwdHNcbiIsIHB0cyk7CisgICAgICAgIH0gZWxzZSBpZiAoZnJhZ19zdHJlYW1faW5mby0+c2lkeF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBzaWR4IGVhcmxpZXN0X3ByZXNlbnRhdGlvbl90aW1lIGlzICpQVFMqLCBzLmIuCisgICAgICAgICAgICAvLyBwdHMgPSBmcmFnX3N0cmVhbV9pbmZvLT5zaWR4X3B0czsKKyAgICAgICAgICAgIGR0cyA9IGZyYWdfc3RyZWFtX2luZm8tPnNpZHhfcHRzIC0gc2MtPnRpbWVfb2Zmc2V0OworICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsICJmb3VuZCBzaWR4IHRpbWUgJSJQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgIiwgdXNpbmcgaXQgZm9yIHB0c1xuIiwgcHRzKTsKKyAgICAgICAgfSBlbHNlIGlmIChmcmFnX3N0cmVhbV9pbmZvLT50ZmR0X2R0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgZHRzID0gZnJhZ19zdHJlYW1faW5mby0+dGZkdF9kdHMgLSBzYy0+dGltZV9vZmZzZXQ7CisgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19ERUJVRywgImZvdW5kIHRmZHQgdGltZSAlIlBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAiLCB1c2luZyBpdCBmb3IgZHRzXG4iLCBkdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHRzID0gc2MtPnRyYWNrX2VuZCAtIHNjLT50aW1lX29mZnNldDsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZm91bmQgdHJhY2sgZW5kIHRpbWUgJSJQUklkNjQKKyAgICAgICAgICAgICAgICAgICAgIiwgdXNpbmcgaXQgZm9yIGR0c1xuIiwgZHRzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGR0cyA9IHNjLT50cmFja19lbmQgLSBzYy0+dGltZV9vZmZzZXQ7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZm91bmQgdHJhY2sgZW5kIHRpbWUgJSJQUklkNjQKKyAgICAgICAgICAgICAgICAiLCB1c2luZyBpdCBmb3IgZHRzXG4iLCBkdHMpOworICAgIH0KKyAgICBvZmZzZXQgICA9IGZyYWctPmJhc2VfZGF0YV9vZmZzZXQgKyBkYXRhX29mZnNldDsKICAgICBkaXN0YW5jZSA9IDA7CiAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJmaXJzdCBzYW1wbGUgZmxhZ3MgMHgleFxuIiwgZmlyc3Rfc2FtcGxlX2ZsYWdzKTsKKworICAgIC8vIHJlYWxsb2Mgc3BhY2UgZm9yIG5ldyBpbmRleCBlbnRyaWVzCisgICAgaWYoKHVpbnQ2NF90KXN0LT5uYl9pbmRleF9lbnRyaWVzICsgZW50cmllcyA+PSBVSU5UX01BWCAvIHNpemVvZihBVkluZGV4RW50cnkpKSB7CisgICAgICAgIGVudHJpZXMgPSBVSU5UX01BWCAvIHNpemVvZihBVkluZGV4RW50cnkpIC0gc3QtPm5iX2luZGV4X2VudHJpZXM7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFkZCBpbmRleCBlbnRyeVxuIik7CisgICAgfQorICAgIGlmIChlbnRyaWVzIDw9IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHJlcXVlc3RlZF9zaXplID0gKHN0LT5uYl9pbmRleF9lbnRyaWVzICsgZW50cmllcykgKiBzaXplb2YoQVZJbmRleEVudHJ5KTsKKyAgICBuZXdfZW50cmllcyA9IGF2X2Zhc3RfcmVhbGxvYyhzdC0+aW5kZXhfZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3QtPmluZGV4X2VudHJpZXNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkX3NpemUpOworICAgIGlmKCFuZXdfZW50cmllcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzdC0+aW5kZXhfZW50cmllcz0gbmV3X2VudHJpZXM7CisKKyAgICByZXF1ZXN0ZWRfc2l6ZSA9IChzdC0+bmJfaW5kZXhfZW50cmllcyArIGVudHJpZXMpICogc2l6ZW9mKCpzYy0+Y3R0c19kYXRhKTsKKyAgICBvbGRfY3R0c19hbGxvY2F0ZWRfc2l6ZSA9IHNjLT5jdHRzX2FsbG9jYXRlZF9zaXplOworICAgIGN0dHNfZGF0YSA9IGF2X2Zhc3RfcmVhbGxvYyhzYy0+Y3R0c19kYXRhLCAmc2MtPmN0dHNfYWxsb2NhdGVkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZF9zaXplKTsKKyAgICBpZiAoIWN0dHNfZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzYy0+Y3R0c19kYXRhID0gY3R0c19kYXRhOworCisgICAgLy8gSW4gY2FzZSB0aGVyZSB3ZXJlIHNhbXBsZXMgd2l0aG91dCBjdHRzIGVudHJpZXMsIGVuc3VyZSB0aGV5IGdldAorICAgIC8vIHplcm8gdmFsdWVkIGVudHJpZXMuIFRoaXMgZW5zdXJlcyBjbGlwcyB3aGljaCBtaXggYm94ZXMgd2l0aCBhbmQKKyAgICAvLyB3aXRob3V0IGN0dHMgZW50cmllcyBkb24ndCBwaWNrdXAgdW5pbml0aWFsaXplZCBkYXRhLgorICAgIG1lbXNldCgodWludDhfdCopKHNjLT5jdHRzX2RhdGEpICsgb2xkX2N0dHNfYWxsb2NhdGVkX3NpemUsIDAsCisgICAgICAgICAgIHNjLT5jdHRzX2FsbG9jYXRlZF9zaXplIC0gb2xkX2N0dHNfYWxsb2NhdGVkX3NpemUpOworCisgICAgaWYgKGluZGV4X2VudHJ5X3BvcyA8IHN0LT5uYl9pbmRleF9lbnRyaWVzKSB7CisgICAgICAgIC8vIE1ha2UgaG9sZSBpbiBpbmRleF9lbnRyaWVzIGFuZCBjdHRzX2RhdGEgZm9yIG5ldyBzYW1wbGVzCisgICAgICAgIG1lbW1vdmUoc3QtPmluZGV4X2VudHJpZXMgKyBpbmRleF9lbnRyeV9wb3MgKyBlbnRyaWVzLAorICAgICAgICAgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzICsgaW5kZXhfZW50cnlfcG9zLAorICAgICAgICAgICAgICAgIHNpemVvZigqc3QtPmluZGV4X2VudHJpZXMpICoKKyAgICAgICAgICAgICAgICAoc3QtPm5iX2luZGV4X2VudHJpZXMgLSBpbmRleF9lbnRyeV9wb3MpKTsKKyAgICAgICAgbWVtbW92ZShzYy0+Y3R0c19kYXRhICsgaW5kZXhfZW50cnlfcG9zICsgZW50cmllcywKKyAgICAgICAgICAgICAgICBzYy0+Y3R0c19kYXRhICsgaW5kZXhfZW50cnlfcG9zLAorICAgICAgICAgICAgICAgIHNpemVvZigqc2MtPmN0dHNfZGF0YSkgKiAoc2MtPmN0dHNfY291bnQgLSBpbmRleF9lbnRyeV9wb3MpKTsKKyAgICAgICAgaWYgKGluZGV4X2VudHJ5X3BvcyA8IHNjLT5jdXJyZW50X3NhbXBsZSkgeworICAgICAgICAgICAgc2MtPmN1cnJlbnRfc2FtcGxlICs9IGVudHJpZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdC0+bmJfaW5kZXhfZW50cmllcyArPSBlbnRyaWVzOworICAgIHNjLT5jdHRzX2NvdW50ID0gc3QtPm5iX2luZGV4X2VudHJpZXM7CisKKyAgICAvLyBSZWNvcmQgdGhlIGluZGV4X2VudHJ5IHBvc2l0aW9uIGluIGZyYWdfaW5kZXggb2YgdGhpcyBmcmFnbWVudAorICAgIGlmIChmcmFnX3N0cmVhbV9pbmZvKQorICAgICAgICBmcmFnX3N0cmVhbV9pbmZvLT5pbmRleF9lbnRyeSA9IGluZGV4X2VudHJ5X3BvczsKKworICAgIGlmIChpbmRleF9lbnRyeV9wb3MgPiAwKQorICAgICAgICBwcmV2X2R0cyA9IHN0LT5pbmRleF9lbnRyaWVzW2luZGV4X2VudHJ5X3Bvcy0xXS50aW1lc3RhbXA7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAmJiAhcGItPmVvZl9yZWFjaGVkOyBpKyspIHsKICAgICAgICAgdW5zaWduZWQgc2FtcGxlX3NpemUgPSBmcmFnLT5zaXplOwogICAgICAgICBpbnQgc2FtcGxlX2ZsYWdzID0gaSA/IGZyYWctPmZsYWdzIDogZmlyc3Rfc2FtcGxlX2ZsYWdzOwogICAgICAgICB1bnNpZ25lZCBzYW1wbGVfZHVyYXRpb24gPSBmcmFnLT5kdXJhdGlvbjsKKyAgICAgICAgdW5zaWduZWQgY3R0c19kdXJhdGlvbiA9IDA7CiAgICAgICAgIGludCBrZXlmcmFtZSA9IDA7CisgICAgICAgIGludCBpbmRleF9lbnRyeV9mbGFncyA9IDA7CiAKICAgICAgICAgaWYgKGZsYWdzICYgTU9WX1RSVU5fU0FNUExFX0RVUkFUSU9OKSBzYW1wbGVfZHVyYXRpb24gPSBhdmlvX3JiMzIocGIpOwogICAgICAgICBpZiAoZmxhZ3MgJiBNT1ZfVFJVTl9TQU1QTEVfU0laRSkgICAgIHNhbXBsZV9zaXplICAgICA9IGF2aW9fcmIzMihwYik7CiAgICAgICAgIGlmIChmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9GTEFHUykgICAgc2FtcGxlX2ZsYWdzICAgID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgc2MtPmN0dHNfZGF0YVtzYy0+Y3R0c19jb3VudF0uY291bnQgPSAxOwotICAgICAgICBzYy0+Y3R0c19kYXRhW3NjLT5jdHRzX2NvdW50XS5kdXJhdGlvbiA9IChmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9DVFMpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpb19yYjMyKHBiKSA6IDA7Ci0gICAgICAgIG1vdl91cGRhdGVfZHRzX3NoaWZ0KHNjLCBzYy0+Y3R0c19kYXRhW3NjLT5jdHRzX2NvdW50XS5kdXJhdGlvbik7Ci0gICAgICAgIGlmIChmcmFnLT50aW1lICE9IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgICAgICBpZiAoYy0+dXNlX21mcmFfZm9yID09IEZGX01PVl9GTEFHX01GUkFfUFRTKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBwdHMgPSBmcmFnLT50aW1lOwotICAgICAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0RFQlVHLCAiZm91bmQgZnJhZyB0aW1lICUiUFJJZDY0Ci0gICAgICAgICAgICAgICAgICAgICAgICAiIHNjLT5kdHNfc2hpZnQgJWQgY3R0cy5kdXJhdGlvbiAlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgc2MtPnRpbWVfb2Zmc2V0ICUiUFJJZDY0IiBmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9DVFMgJWRcbiIsIHB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5kdHNfc2hpZnQsIHNjLT5jdHRzX2RhdGFbc2MtPmN0dHNfY291bnRdLmR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgc2MtPnRpbWVfb2Zmc2V0LCBmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9DVFMpOwotICAgICAgICAgICAgICAgIGR0cyA9IHB0cyAtIHNjLT5kdHNfc2hpZnQ7Ci0gICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgTU9WX1RSVU5fU0FNUExFX0NUUykgewotICAgICAgICAgICAgICAgICAgICBkdHMgLT0gc2MtPmN0dHNfZGF0YVtzYy0+Y3R0c19jb3VudF0uZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZHRzIC09IHNjLT50aW1lX29mZnNldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsICJjYWxjdWxhdGVkIGludG8gZHRzICUiUFJJZDY0IlxuIiwgZHRzKTsKKyAgICAgICAgaWYgKGZsYWdzICYgTU9WX1RSVU5fU0FNUExFX0NUUykgICAgICBjdHRzX2R1cmF0aW9uICAgPSBhdmlvX3JiMzIocGIpOworCisgICAgICAgIG1vdl91cGRhdGVfZHRzX3NoaWZ0KHNjLCBjdHRzX2R1cmF0aW9uKTsKKyAgICAgICAgaWYgKHB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgZHRzID0gcHRzIC0gc2MtPmR0c19zaGlmdDsKKyAgICAgICAgICAgIGlmIChmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9DVFMpIHsKKyAgICAgICAgICAgICAgICBkdHMgLT0gY3R0c19kdXJhdGlvbjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZHRzID0gZnJhZy0+dGltZTsKLSAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19ERUJVRywgImZvdW5kIGZyYWcgdGltZSAlIlBSSWQ2NAotICAgICAgICAgICAgICAgICAgICAgICAgIiwgdXNpbmcgaXQgZm9yIGR0c1xuIiwgZHRzKTsKKyAgICAgICAgICAgICAgICBkdHMgLT0gc2MtPnRpbWVfb2Zmc2V0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJhZy0+dGltZSA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAgICAgInB0cyAlIlBSSWQ2NCIgY2FsY3VsYXRlZCBkdHMgJSJQUklkNjQKKyAgICAgICAgICAgICAgICAgICAiIHNjLT5kdHNfc2hpZnQgJWQgY3R0cy5kdXJhdGlvbiAlZCIKKyAgICAgICAgICAgICAgICAgICAiIHNjLT50aW1lX29mZnNldCAlIlBSSWQ2NAorICAgICAgICAgICAgICAgICAgICIgZmxhZ3MgJiBNT1ZfVFJVTl9TQU1QTEVfQ1RTICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHB0cywgZHRzLAorICAgICAgICAgICAgICAgICAgIHNjLT5kdHNfc2hpZnQsIGN0dHNfZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgc2MtPnRpbWVfb2Zmc2V0LCBmbGFncyAmIE1PVl9UUlVOX1NBTVBMRV9DVFMpOworICAgICAgICAgICAgcHRzID0gQVZfTk9QVFNfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgc2MtPmN0dHNfY291bnQrKzsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCiAgICAgICAgICAgICBrZXlmcmFtZSA9IDE7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGtleWZyYW1lID0KICAgICAgICAgICAgICAgICAhKHNhbXBsZV9mbGFncyAmIChNT1ZfRlJBR19TQU1QTEVfRkxBR19JU19OT05fU1lOQyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9WX0ZSQUdfU0FNUExFX0ZMQUdfREVQRU5EU19ZRVMpKTsKLSAgICAgICAgaWYgKGtleWZyYW1lKQorICAgICAgICBpZiAoa2V5ZnJhbWUpIHsKICAgICAgICAgICAgIGRpc3RhbmNlID0gMDsKLSAgICAgICAgZXJyID0gYXZfYWRkX2luZGV4X2VudHJ5KHN0LCBvZmZzZXQsIGR0cywgc2FtcGxlX3NpemUsIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZnJhbWUgPyBBVklOREVYX0tFWUZSQU1FIDogMCk7Ci0gICAgICAgIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhZGQgaW5kZXggZW50cnlcbiIpOworICAgICAgICAgICAgaW5kZXhfZW50cnlfZmxhZ3MgfD0gQVZJTkRFWF9LRVlGUkFNRTsKICAgICAgICAgfQorICAgICAgICAvLyBGcmFnbWVudHMgY2FuIG92ZXJsYXAgaW4gdGltZS4gIERpc2NhcmQgb3ZlcmxhcHBpbmcgZnJhbWVzIGFmdGVyCisgICAgICAgIC8vIGRlY29kaW5nLgorICAgICAgICBpZiAocHJldl9kdHMgPj0gZHRzKQorICAgICAgICAgICAgaW5kZXhfZW50cnlfZmxhZ3MgfD0gQVZJTkRFWF9ESVNDQVJEX0ZSQU1FOworCisgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzW2luZGV4X2VudHJ5X3Bvc10ucG9zID0gb2Zmc2V0OworICAgICAgICBzdC0+aW5kZXhfZW50cmllc1tpbmRleF9lbnRyeV9wb3NdLnRpbWVzdGFtcCA9IGR0czsKKyAgICAgICAgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhfZW50cnlfcG9zXS5zaXplPSBzYW1wbGVfc2l6ZTsKKyAgICAgICAgc3QtPmluZGV4X2VudHJpZXNbaW5kZXhfZW50cnlfcG9zXS5taW5fZGlzdGFuY2U9IGRpc3RhbmNlOworICAgICAgICBzdC0+aW5kZXhfZW50cmllc1tpbmRleF9lbnRyeV9wb3NdLmZsYWdzID0gaW5kZXhfZW50cnlfZmxhZ3M7CisKKyAgICAgICAgc2MtPmN0dHNfZGF0YVtpbmRleF9lbnRyeV9wb3NdLmNvdW50ID0gMTsKKyAgICAgICAgc2MtPmN0dHNfZGF0YVtpbmRleF9lbnRyeV9wb3NdLmR1cmF0aW9uID0gY3R0c19kdXJhdGlvbjsKKyAgICAgICAgaW5kZXhfZW50cnlfcG9zKys7CisKICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJBVkluZGV4IHN0cmVhbSAlZCwgc2FtcGxlICVkLCBvZmZzZXQgJSJQUkl4NjQiLCBkdHMgJSJQUklkNjQiLCAiCi0gICAgICAgICAgICAgICAgInNpemUgJWQsIGRpc3RhbmNlICVkLCBrZXlmcmFtZSAlZFxuIiwgc3QtPmluZGV4LCBzYy0+c2FtcGxlX2NvdW50K2ksCi0gICAgICAgICAgICAgICAgb2Zmc2V0LCBkdHMsIHNhbXBsZV9zaXplLCBkaXN0YW5jZSwga2V5ZnJhbWUpOworICAgICAgICAgICAgICAgICJzaXplICV1LCBkaXN0YW5jZSAlZCwga2V5ZnJhbWUgJWRcbiIsIHN0LT5pbmRleCwKKyAgICAgICAgICAgICAgICBpbmRleF9lbnRyeV9wb3MsIG9mZnNldCwgZHRzLCBzYW1wbGVfc2l6ZSwgZGlzdGFuY2UsIGtleWZyYW1lKTsKICAgICAgICAgZGlzdGFuY2UrKzsKICAgICAgICAgZHRzICs9IHNhbXBsZV9kdXJhdGlvbjsKICAgICAgICAgb2Zmc2V0ICs9IHNhbXBsZV9zaXplOwogICAgICAgICBzYy0+ZGF0YV9zaXplICs9IHNhbXBsZV9zaXplOwotICAgICAgICBzYy0+ZHVyYXRpb25fZm9yX2ZwcyArPSBzYW1wbGVfZHVyYXRpb247Ci0gICAgICAgIHNjLT5uYl9mcmFtZXNfZm9yX2ZwcyArKzsKKworICAgICAgICBpZiAoc2FtcGxlX2R1cmF0aW9uIDw9IElOVDY0X01BWCAtIHNjLT5kdXJhdGlvbl9mb3JfZnBzICYmCisgICAgICAgICAgICAxIDw9IElOVDY0X01BWCAtIHNjLT5uYl9mcmFtZXNfZm9yX2ZwcworICAgICAgICApIHsKKyAgICAgICAgICAgIHNjLT5kdXJhdGlvbl9mb3JfZnBzICs9IHNhbXBsZV9kdXJhdGlvbjsKKyAgICAgICAgICAgIHNjLT5uYl9mcmFtZXNfZm9yX2ZwcyArKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA8IGVudHJpZXMpIHsKKyAgICAgICAgLy8gRU9GIGZvdW5kIGJlZm9yZSByZWFkaW5nIGFsbCBlbnRyaWVzLiAgRml4IHRoZSBob2xlIHRoaXMgd291bGQKKyAgICAgICAgLy8gbGVhdmUgaW4gaW5kZXhfZW50cmllcyBhbmQgY3R0c19kYXRhCisgICAgICAgIGludCBnYXAgPSBlbnRyaWVzIC0gaTsKKyAgICAgICAgbWVtbW92ZShzdC0+aW5kZXhfZW50cmllcyArIGluZGV4X2VudHJ5X3BvcywKKyAgICAgICAgICAgICAgICBzdC0+aW5kZXhfZW50cmllcyArIGluZGV4X2VudHJ5X3BvcyArIGdhcCwKKyAgICAgICAgICAgICAgICBzaXplb2YoKnN0LT5pbmRleF9lbnRyaWVzKSAqCisgICAgICAgICAgICAgICAgKHN0LT5uYl9pbmRleF9lbnRyaWVzIC0gKGluZGV4X2VudHJ5X3BvcyArIGdhcCkpKTsKKyAgICAgICAgbWVtbW92ZShzYy0+Y3R0c19kYXRhICsgaW5kZXhfZW50cnlfcG9zLAorICAgICAgICAgICAgICAgIHNjLT5jdHRzX2RhdGEgKyBpbmRleF9lbnRyeV9wb3MgKyBnYXAsCisgICAgICAgICAgICAgICAgc2l6ZW9mKCpzYy0+Y3R0c19kYXRhKSAqCisgICAgICAgICAgICAgICAgKHNjLT5jdHRzX2NvdW50IC0gKGluZGV4X2VudHJ5X3BvcyArIGdhcCkpKTsKKworICAgICAgICBzdC0+bmJfaW5kZXhfZW50cmllcyAtPSBnYXA7CisgICAgICAgIHNjLT5jdHRzX2NvdW50IC09IGdhcDsKKyAgICAgICAgaWYgKGluZGV4X2VudHJ5X3BvcyA8IHNjLT5jdXJyZW50X3NhbXBsZSkgeworICAgICAgICAgICAgc2MtPmN1cnJlbnRfc2FtcGxlIC09IGdhcDsKKyAgICAgICAgfQorICAgICAgICBlbnRyaWVzID0gaTsKICAgICB9CiAKLSAgICBpZiAocGItPmVvZl9yZWFjaGVkKQorICAgIC8vIFRoZSBlbmQgb2YgdGhpcyBuZXcgZnJhZ21lbnQgbWF5IG92ZXJsYXAgaW4gdGltZSB3aXRoIHRoZSBzdGFydAorICAgIC8vIG9mIHRoZSBuZXh0IGZyYWdtZW50IGluIGluZGV4X2VudHJpZXMuIE1hcmsgdGhlIHNhbXBsZXMgaW4gdGhlIG5leHQKKyAgICAvLyBmcmFnbWVudCB0aGF0IG92ZXJsYXAgd2l0aCBBVklOREVYX0RJU0NBUkRfRlJBTUUKKyAgICBwcmV2X2R0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIGlmIChpbmRleF9lbnRyeV9wb3MgPiAwKQorICAgICAgICBwcmV2X2R0cyA9IHN0LT5pbmRleF9lbnRyaWVzW2luZGV4X2VudHJ5X3Bvcy0xXS50aW1lc3RhbXA7CisgICAgZm9yIChpID0gaW5kZXhfZW50cnlfcG9zOyBpIDwgc3QtPm5iX2luZGV4X2VudHJpZXM7IGkrKykgeworICAgICAgICBpZiAocHJldl9kdHMgPCBzdC0+aW5kZXhfZW50cmllc1tpXS50aW1lc3RhbXApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3QtPmluZGV4X2VudHJpZXNbaV0uZmxhZ3MgfD0gQVZJTkRFWF9ESVNDQVJEX0ZSQU1FOworICAgIH0KKworICAgIC8vIElmIGEgaG9sZSB3YXMgY3JlYXRlZCB0byBpbnNlcnQgdGhlIG5ldyBpbmRleF9lbnRyaWVzIGludG8sCisgICAgLy8gdGhlIGluZGV4X2VudHJ5IHJlY29yZGVkIGZvciBhbGwgc3Vic2VxdWVudCBtb29mIG11c3QKKyAgICAvLyBiZSBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW5zZXJ0ZWQuCisgICAgZml4X2ZyYWdfaW5kZXhfZW50cmllcygmYy0+ZnJhZ19pbmRleCwgbmV4dF9mcmFnX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZy0+dHJhY2tfaWQsIGVudHJpZXMpOworCisgICAgaWYgKHBiLT5lb2ZfcmVhY2hlZCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAicmVhY2hlZCBlb2YsIGNvcnJ1cHRlZCBUUlVOIGF0b21cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQogCiAgICAgZnJhZy0+aW1wbGljaXRfb2Zmc2V0ID0gb2Zmc2V0OwogCkBAIC0zNjU0LDE5ICs0OTQwLDE4IEBACiAKIHN0YXRpYyBpbnQgbW92X3JlYWRfc2lkeChNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKIHsKLSAgICBpbnQ2NF90IG9mZnNldCA9IGF2aW9fdGVsbChwYikgKyBhdG9tLnNpemUsIHB0czsKKyAgICBpbnQ2NF90IG9mZnNldCA9IGF2aW9fdGVsbChwYikgKyBhdG9tLnNpemUsIHB0cywgdGltZXN0YW1wOwogICAgIHVpbnQ4X3QgdmVyc2lvbjsKLSAgICB1bnNpZ25lZCBpLCB0cmFja19pZDsKKyAgICB1bnNpZ25lZCBpLCBqLCB0cmFja19pZCwgaXRlbV9jb3VudDsKICAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOwotICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOwotICAgIE1PVkZyYWdtZW50SW5kZXggKmluZGV4ID0gTlVMTDsKLSAgICBNT1ZGcmFnbWVudEluZGV4ICoqdG1wOworICAgIEFWU3RyZWFtICpyZWZfc3QgPSBOVUxMOworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjLCAqcmVmX3NjID0gTlVMTDsKICAgICBBVlJhdGlvbmFsIHRpbWVzY2FsZTsKIAogICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKICAgICBpZiAodmVyc2lvbiA+IDEpIHsKICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGMtPmZjLCAic2lkeCB2ZXJzaW9uICV1IiwgdmVyc2lvbik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgYXZpb19yYjI0KHBiKTsgLy8gZmxhZ3MKQEAgLTM2NzksMTQgKzQ5NjQsMTkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoIXN0KSB7Ci0gICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGZpbmQgY29ycmVzcG9uZGluZyB0cmFjayBpZCAlZFxuIiwgdHJhY2tfaWQpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgImNvdWxkIG5vdCBmaW5kIGNvcnJlc3BvbmRpbmcgdHJhY2sgaWQgJWRcbiIsIHRyYWNrX2lkKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgc2MgPSBzdC0+cHJpdl9kYXRhOwogCiAgICAgdGltZXNjYWxlID0gYXZfbWFrZV9xKDEsIGF2aW9fcmIzMihwYikpOwogCisgICAgaWYgKHRpbWVzY2FsZS5kZW4gPD0gMCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2lkeCB0aW1lc2NhbGUgMS8lZFxuIiwgdGltZXNjYWxlLmRlbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIGlmICh2ZXJzaW9uID09IDApIHsKICAgICAgICAgcHRzID0gYXZpb19yYjMyKHBiKTsKICAgICAgICAgb2Zmc2V0ICs9IGF2aW9fcmIzMihwYik7CkBAIC0zNjk3LDUzICs0OTg3LDU5IEBACiAKICAgICBhdmlvX3JiMTYocGIpOyAvLyByZXNlcnZlZAogCi0gICAgaW5kZXggPSBhdl9tYWxsb2N6KHNpemVvZihNT1ZGcmFnbWVudEluZGV4KSk7Ci0gICAgaWYgKCFpbmRleCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBpdGVtX2NvdW50ID0gYXZpb19yYjE2KHBiKTsKIAotICAgIGluZGV4LT50cmFja19pZCA9IHRyYWNrX2lkOwotCi0gICAgaW5kZXgtPml0ZW1fY291bnQgPSBhdmlvX3JiMTYocGIpOwotICAgIGluZGV4LT5pdGVtcyA9IGF2X21hbGxvY3pfYXJyYXkoaW5kZXgtPml0ZW1fY291bnQsIHNpemVvZihNT1ZGcmFnbWVudEluZGV4SXRlbSkpOwotCi0gICAgaWYgKCFpbmRleC0+aXRlbXMpIHsKLSAgICAgICAgYXZfZnJlZXAoJmluZGV4KTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgaW5kZXgtPml0ZW1fY291bnQ7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtX2NvdW50OyBpKyspIHsKKyAgICAgICAgaW50IGluZGV4OworICAgICAgICBNT1ZGcmFnbWVudFN0cmVhbUluZm8gKiBmcmFnX3N0cmVhbV9pbmZvOwogICAgICAgICB1aW50MzJfdCBzaXplID0gYXZpb19yYjMyKHBiKTsKICAgICAgICAgdWludDMyX3QgZHVyYXRpb24gPSBhdmlvX3JiMzIocGIpOwogICAgICAgICBpZiAoc2l6ZSAmIDB4ODAwMDAwMDApIHsKICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShjLT5mYywgInNpZHggcmVmZXJlbmNlX3R5cGUgMSIpOwotICAgICAgICAgICAgYXZfZnJlZXAoJmluZGV4LT5pdGVtcyk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmaW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9CiAgICAgICAgIGF2aW9fcmIzMihwYik7IC8vIHNhcF9mbGFncwotICAgICAgICBpbmRleC0+aXRlbXNbaV0ubW9vZl9vZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIGluZGV4LT5pdGVtc1tpXS50aW1lID0gYXZfcmVzY2FsZV9xKHB0cywgc3QtPnRpbWVfYmFzZSwgdGltZXNjYWxlKTsKKyAgICAgICAgdGltZXN0YW1wID0gYXZfcmVzY2FsZV9xKHB0cywgc3QtPnRpbWVfYmFzZSwgdGltZXNjYWxlKTsKKworICAgICAgICBpbmRleCA9IHVwZGF0ZV9mcmFnX2luZGV4KGMsIG9mZnNldCk7CisgICAgICAgIGZyYWdfc3RyZWFtX2luZm8gPSBnZXRfZnJhZ19zdHJlYW1faW5mbygmYy0+ZnJhZ19pbmRleCwgaW5kZXgsIHRyYWNrX2lkKTsKKyAgICAgICAgaWYgKGZyYWdfc3RyZWFtX2luZm8pCisgICAgICAgICAgICBmcmFnX3N0cmVhbV9pbmZvLT5zaWR4X3B0cyA9IHRpbWVzdGFtcDsKKwogICAgICAgICBvZmZzZXQgKz0gc2l6ZTsKICAgICAgICAgcHRzICs9IGR1cmF0aW9uOwogICAgIH0KIAogICAgIHN0LT5kdXJhdGlvbiA9IHNjLT50cmFja19lbmQgPSBwdHM7CiAKLSAgICB0bXAgPSBhdl9yZWFsbG9jX2FycmF5KGMtPmZyYWdtZW50X2luZGV4X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5mcmFnbWVudF9pbmRleF9jb3VudCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTU9WRnJhZ21lbnRJbmRleCopKTsKLSAgICBpZiAoIXRtcCkgewotICAgICAgICBhdl9mcmVlcCgmaW5kZXgtPml0ZW1zKTsKLSAgICAgICAgYXZfZnJlZXAoJmluZGV4KTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBzYy0+aGFzX3NpZHggPSAxOworCisgICAgaWYgKG9mZnNldCA9PSBhdmlvX3NpemUocGIpKSB7CisgICAgICAgIC8vIEZpbmQgZmlyc3QgZW50cnkgaW4gZnJhZ21lbnQgaW5kZXggdGhhdCBjYW1lIGZyb20gYW4gc2lkeC4KKyAgICAgICAgLy8gVGhpcyB3aWxsIHByZXR0eSBtdWNoIGFsd2F5cyBiZSB0aGUgZmlyc3QgZW50cnkuCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT5mcmFnX2luZGV4Lm5iX2l0ZW1zOyBpKyspIHsKKyAgICAgICAgICAgIE1PVkZyYWdtZW50SW5kZXhJdGVtICogaXRlbSA9ICZjLT5mcmFnX2luZGV4Lml0ZW1baV07CisgICAgICAgICAgICBmb3IgKGogPSAwOyByZWZfc3QgPT0gTlVMTCAmJiBqIDwgaXRlbS0+bmJfc3RyZWFtX2luZm87IGorKykgeworICAgICAgICAgICAgICAgIE1PVkZyYWdtZW50U3RyZWFtSW5mbyAqIHNpOworICAgICAgICAgICAgICAgIHNpID0gJml0ZW0tPnN0cmVhbV9pbmZvW2pdOworICAgICAgICAgICAgICAgIGlmIChzaS0+c2lkeF9wdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVmX3N0ID0gYy0+ZmMtPnN0cmVhbXNbal07CisgICAgICAgICAgICAgICAgICAgIHJlZl9zYyA9IHJlZl9zdC0+cHJpdl9kYXRhOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlZl9zdCkgZm9yIChpID0gMDsgaSA8IGMtPmZjLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgICAgICBpZiAoIXNjLT5oYXNfc2lkeCkgeworICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IHNjLT50cmFja19lbmQgPSBhdl9yZXNjYWxlKHJlZl9zdC0+ZHVyYXRpb24sIHNjLT50aW1lX3NjYWxlLCByZWZfc2MtPnRpbWVfc2NhbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYy0+ZnJhZ19pbmRleC5jb21wbGV0ZSA9IDE7CiAgICAgfQogCi0gICAgYy0+ZnJhZ21lbnRfaW5kZXhfZGF0YSA9IHRtcDsKLSAgICBjLT5mcmFnbWVudF9pbmRleF9kYXRhW2MtPmZyYWdtZW50X2luZGV4X2NvdW50KytdID0gaW5kZXg7Ci0KLSAgICBpZiAob2Zmc2V0ID09IGF2aW9fc2l6ZShwYikpCi0gICAgICAgIGMtPmZyYWdtZW50X2luZGV4X2NvbXBsZXRlID0gMTsKLQogICAgIHJldHVybiAwOwogfQogCkBAIC0zODA0LDYgKzUxMDAsNyBAQAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGZyZWVfYW5kX3JldHVybjsKIAorICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgaWYgKHVuY29tcHJlc3MgKG1vb3ZfZGF0YSwgKHVMb25nZiAqKSAmbW9vdl9sZW4sIChjb25zdCBCeXRlZiAqKWNtb3ZfZGF0YSwgY21vdl9sZW4pICE9IFpfT0spCiAgICAgICAgIGdvdG8gZnJlZV9hbmRfcmV0dXJuOwogICAgIGlmIChmZmlvX2luaXRfY29udGV4dCgmY3R4LCBtb292X2RhdGEsIG1vb3ZfbGVuLCAwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSAhPSAwKQpAQCAtMzgyNyw2ICs1MTI0LDcgQEAKIHsKICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKICAgICBpbnQgaSwgZWRpdF9jb3VudCwgdmVyc2lvbjsKKyAgICBpbnQ2NF90IGVsc3RfZW50cnlfc2l6ZTsKIAogICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEgfHwgYy0+aWdub3JlX2VkaXRsaXN0KQogICAgICAgICByZXR1cm4gMDsKQEAgLTM4MzUsNiArNTEzMywyMSBAQAogICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsgLyogdmVyc2lvbiAqLwogICAgIGF2aW9fcmIyNChwYik7IC8qIGZsYWdzICovCiAgICAgZWRpdF9jb3VudCA9IGF2aW9fcmIzMihwYik7IC8qIGVudHJpZXMgKi8KKyAgICBhdG9tLnNpemUgLT0gODsKKworICAgIGVsc3RfZW50cnlfc2l6ZSA9IHZlcnNpb24gPT0gMSA/IDIwIDogMTI7CisgICAgaWYgKGF0b20uc2l6ZSAhPSBlZGl0X2NvdW50ICogZWxzdF9lbnRyeV9zaXplKSB7CisgICAgICAgIGlmIChjLT5mYy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID49IEZGX0NPTVBMSUFOQ0VfU1RSSUNUKSB7CisgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZWRpdCBsaXN0IGVudHJ5X2NvdW50OiAlZCBmb3IgZWxzdCBhdG9tIG9mIHNpemU6ICUiUFJJZDY0IiBieXRlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgZWRpdF9jb3VudCwgYXRvbS5zaXplICsgOCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVkaXRfY291bnQgPSBhdG9tLnNpemUgLyBlbHN0X2VudHJ5X3NpemU7CisgICAgICAgICAgICBpZiAoZWRpdF9jb3VudCAqIGVsc3RfZW50cnlfc2l6ZSAhPSBhdG9tLnNpemUpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiRUxTVCBhdG9tIG9mICUiUFJJZDY0IiBieXRlcywgYmlnZ2VyIHRoYW4gJWQgZW50cmllcy4iLCBhdG9tLnNpemUsIGVkaXRfY291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiAgICAgaWYgKCFlZGl0X2NvdW50KQogICAgICAgICByZXR1cm4gMDsKQEAgLTM4NDYsMjAgKzUxNTksMzAgQEAKICAgICBpZiAoIXNjLT5lbHN0X2RhdGEpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInRyYWNrWyVpXS5lZGl0X2NvdW50ID0gJWlcbiIsIGMtPmZjLT5uYl9zdHJlYW1zLTEsIGVkaXRfY291bnQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBlZGl0X2NvdW50ICYmICFwYi0+ZW9mX3JlYWNoZWQ7IGkrKykgeworICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAidHJhY2tbJXVdLmVkaXRfY291bnQgPSAlaVxuIiwgYy0+ZmMtPm5iX3N0cmVhbXMgLSAxLCBlZGl0X2NvdW50KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZWRpdF9jb3VudCAmJiBhdG9tLnNpemUgPiAwICYmICFwYi0+ZW9mX3JlYWNoZWQ7IGkrKykgewogICAgICAgICBNT1ZFbHN0ICplID0gJnNjLT5lbHN0X2RhdGFbaV07CiAKICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewogICAgICAgICAgICAgZS0+ZHVyYXRpb24gPSBhdmlvX3JiNjQocGIpOwogICAgICAgICAgICAgZS0+dGltZSAgICAgPSBhdmlvX3JiNjQocGIpOworICAgICAgICAgICAgYXRvbS5zaXplIC09IDE2OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZS0+ZHVyYXRpb24gPSBhdmlvX3JiMzIocGIpOyAvKiBzZWdtZW50IGR1cmF0aW9uICovCiAgICAgICAgICAgICBlLT50aW1lICAgICA9IChpbnQzMl90KWF2aW9fcmIzMihwYik7IC8qIG1lZGlhIHRpbWUgKi8KKyAgICAgICAgICAgIGF0b20uc2l6ZSAtPSA4OwogICAgICAgICB9CiAgICAgICAgIGUtPnJhdGUgPSBhdmlvX3JiMzIocGIpIC8gNjU1MzYuMDsKKyAgICAgICAgYXRvbS5zaXplIC09IDQ7CiAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1RSQUNFLCAiZHVyYXRpb249JSJQUklkNjQiIHRpbWU9JSJQUklkNjQiIHJhdGU9JWZcbiIsCi0gICAgICAgICAgICAgICAgZS0+ZHVyYXRpb24sIGUtPnRpbWUsIGUtPnJhdGUpOworICAgICAgICAgICAgICAgZS0+ZHVyYXRpb24sIGUtPnRpbWUsIGUtPnJhdGUpOworCisgICAgICAgIGlmIChlLT50aW1lIDwgMCAmJiBlLT50aW1lICE9IC0xICYmCisgICAgICAgICAgICBjLT5mYy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID49IEZGX0NPTVBMSUFOQ0VfU1RSSUNUKSB7CisgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIlRyYWNrICVkLCBlZGl0ICVkOiBJbnZhbGlkIGVkaXQgbGlzdCBtZWRpYSB0aW1lPSUiUFJJZDY0IlxuIiwKKyAgICAgICAgICAgICAgICAgICBjLT5mYy0+bmJfc3RyZWFtcy0xLCBpLCBlLT50aW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CiAgICAgfQogICAgIHNjLT5lbHN0X2NvdW50ID0gaTsKIApAQCAtMzg3Nyw5ICs1MjAwLDQzOSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1vdl9yZWFkX3ZwY2MoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCB2ZXJzaW9uLCBjb2xvcl9yYW5nZSwgY29sb3JfcHJpbWFyaWVzLCBjb2xvcl90cmMsIGNvbG9yX3NwYWNlOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcyAtIDFdOworCisgICAgaWYgKGF0b20uc2l6ZSA8IDUpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJFbXB0eSBWUCBDb2RlYyBDb25maWd1cmF0aW9uIGJveFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAodmVyc2lvbiAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJVbnN1cHBvcnRlZCBWUCBDb2RlYyBDb25maWd1cmF0aW9uIGJveCB2ZXJzaW9uICVkXG4iLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGF2aW9fc2tpcChwYiwgMyk7IC8qIGZsYWdzICovCisKKyAgICBhdmlvX3NraXAocGIsIDIpOyAvKiBwcm9maWxlICsgbGV2ZWwgKi8KKyAgICBjb2xvcl9yYW5nZSAgICAgPSBhdmlvX3I4KHBiKTsgLyogYml0RGVwdGgsIGNocm9tYVN1YnNhbXBsaW5nLCB2aWRlb0Z1bGxSYW5nZUZsYWcgKi8KKyAgICBjb2xvcl9wcmltYXJpZXMgPSBhdmlvX3I4KHBiKTsKKyAgICBjb2xvcl90cmMgICAgICAgPSBhdmlvX3I4KHBiKTsKKyAgICBjb2xvcl9zcGFjZSAgICAgPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAoYXZpb19yYjE2KHBiKSkgLyogY29kZWNJbnRpYWxpemF0aW9uRGF0YVNpemUgKi8KKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAoIWF2X2NvbG9yX3ByaW1hcmllc19uYW1lKGNvbG9yX3ByaW1hcmllcykpCisgICAgICAgIGNvbG9yX3ByaW1hcmllcyA9IEFWQ09MX1BSSV9VTlNQRUNJRklFRDsKKyAgICBpZiAoIWF2X2NvbG9yX3RyYW5zZmVyX25hbWUoY29sb3JfdHJjKSkKKyAgICAgICAgY29sb3JfdHJjID0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEOworICAgIGlmICghYXZfY29sb3Jfc3BhY2VfbmFtZShjb2xvcl9zcGFjZSkpCisgICAgICAgIGNvbG9yX3NwYWNlID0gQVZDT0xfU1BDX1VOU1BFQ0lGSUVEOworCisgICAgc3QtPmNvZGVjcGFyLT5jb2xvcl9yYW5nZSAgICAgPSAoY29sb3JfcmFuZ2UgJiAxKSA/IEFWQ09MX1JBTkdFX0pQRUcgOiBBVkNPTF9SQU5HRV9NUEVHOworICAgIHN0LT5jb2RlY3Bhci0+Y29sb3JfcHJpbWFyaWVzID0gY29sb3JfcHJpbWFyaWVzOworICAgIHN0LT5jb2RlY3Bhci0+Y29sb3JfdHJjICAgICAgID0gY29sb3JfdHJjOworICAgIHN0LT5jb2RlY3Bhci0+Y29sb3Jfc3BhY2UgICAgID0gY29sb3Jfc3BhY2U7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9zbWRtKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIGNvbnN0IGludCBjaHJvbWFfZGVuID0gNTAwMDA7CisgICAgY29uc3QgaW50IGx1bWFfZGVuID0gMTAwMDA7CisgICAgaW50IGksIGosIHZlcnNpb247CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHNjID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMgLSAxXS0+cHJpdl9kYXRhOworCisgICAgaWYgKGF0b20uc2l6ZSA8IDUpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJFbXB0eSBNYXN0ZXJpbmcgRGlzcGxheSBNZXRhZGF0YSBib3hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICB2ZXJzaW9uID0gYXZpb19yOChwYik7CisgICAgaWYgKHZlcnNpb24pIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIE1hc3RlcmluZyBEaXNwbGF5IE1ldGFkYXRhIGJveCB2ZXJzaW9uICVkXG4iLCB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGF2aW9fc2tpcChwYiwgMyk7IC8qIGZsYWdzICovCisKKyAgICBzYy0+bWFzdGVyaW5nID0gYXZfbWFzdGVyaW5nX2Rpc3BsYXlfbWV0YWRhdGFfYWxsb2MoKTsKKyAgICBpZiAoIXNjLT5tYXN0ZXJpbmcpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorICAgICAgICAgICAgc2MtPm1hc3RlcmluZy0+ZGlzcGxheV9wcmltYXJpZXNbaV1bal0gPQorICAgICAgICAgICAgICAgIGF2X21ha2VfcShscmludCgoKGRvdWJsZSlhdmlvX3JiMTYocGIpIC8gKDEgPDwgMTYpKSAqIGNocm9tYV9kZW4pLCBjaHJvbWFfZGVuKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorICAgICAgICBzYy0+bWFzdGVyaW5nLT53aGl0ZV9wb2ludFtpXSA9CisgICAgICAgICAgICBhdl9tYWtlX3EobHJpbnQoKChkb3VibGUpYXZpb19yYjE2KHBiKSAvICgxIDw8IDE2KSkgKiBjaHJvbWFfZGVuKSwgY2hyb21hX2Rlbik7CisgICAgc2MtPm1hc3RlcmluZy0+bWF4X2x1bWluYW5jZSA9CisgICAgICAgIGF2X21ha2VfcShscmludCgoKGRvdWJsZSlhdmlvX3JiMzIocGIpIC8gKDEgPDwgIDgpKSAqIGx1bWFfZGVuKSwgbHVtYV9kZW4pOworICAgIHNjLT5tYXN0ZXJpbmctPm1pbl9sdW1pbmFuY2UgPQorICAgICAgICBhdl9tYWtlX3EobHJpbnQoKChkb3VibGUpYXZpb19yYjMyKHBiKSAvICgxIDw8IDE0KSkgKiBsdW1hX2RlbiksIGx1bWFfZGVuKTsKKworICAgIHNjLT5tYXN0ZXJpbmctPmhhc19wcmltYXJpZXMgPSAxOworICAgIHNjLT5tYXN0ZXJpbmctPmhhc19sdW1pbmFuY2UgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3JlYWRfbWRjdihNT1ZDb250ZXh0ICpjLCBBVklPQ29udGV4dCAqcGIsIE1PVkF0b20gYXRvbSkKK3sKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICBjb25zdCBpbnQgbWFwcGluZ1szXSA9IHsxLCAyLCAwfTsKKyAgICBjb25zdCBpbnQgY2hyb21hX2RlbiA9IDUwMDAwOworICAgIGNvbnN0IGludCBsdW1hX2RlbiA9IDEwMDAwOworICAgIGludCBpOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBzYyA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zIC0gMV0tPnByaXZfZGF0YTsKKworICAgIGlmIChhdG9tLnNpemUgPCAyNCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgTWFzdGVyaW5nIERpc3BsYXkgQ29sb3IgVm9sdW1lIGJveFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHNjLT5tYXN0ZXJpbmcgPSBhdl9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YV9hbGxvYygpOworICAgIGlmICghc2MtPm1hc3RlcmluZykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IGogPSBtYXBwaW5nW2ldOworICAgICAgICBzYy0+bWFzdGVyaW5nLT5kaXNwbGF5X3ByaW1hcmllc1tqXVswXSA9IGF2X21ha2VfcShhdmlvX3JiMTYocGIpLCBjaHJvbWFfZGVuKTsKKyAgICAgICAgc2MtPm1hc3RlcmluZy0+ZGlzcGxheV9wcmltYXJpZXNbal1bMV0gPSBhdl9tYWtlX3EoYXZpb19yYjE2KHBiKSwgY2hyb21hX2Rlbik7CisgICAgfQorICAgIHNjLT5tYXN0ZXJpbmctPndoaXRlX3BvaW50WzBdID0gYXZfbWFrZV9xKGF2aW9fcmIxNihwYiksIGNocm9tYV9kZW4pOworICAgIHNjLT5tYXN0ZXJpbmctPndoaXRlX3BvaW50WzFdID0gYXZfbWFrZV9xKGF2aW9fcmIxNihwYiksIGNocm9tYV9kZW4pOworCisgICAgc2MtPm1hc3RlcmluZy0+bWF4X2x1bWluYW5jZSA9IGF2X21ha2VfcShhdmlvX3JiMzIocGIpLCBsdW1hX2Rlbik7CisgICAgc2MtPm1hc3RlcmluZy0+bWluX2x1bWluYW5jZSA9IGF2X21ha2VfcShhdmlvX3JiMzIocGIpLCBsdW1hX2Rlbik7CisKKyAgICBzYy0+bWFzdGVyaW5nLT5oYXNfbHVtaW5hbmNlID0gMTsKKyAgICBzYy0+bWFzdGVyaW5nLT5oYXNfcHJpbWFyaWVzID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX2NvbGwoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CisgICAgaW50IHZlcnNpb247CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHNjID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMgLSAxXS0+cHJpdl9kYXRhOworCisgICAgaWYgKGF0b20uc2l6ZSA8IDUpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJFbXB0eSBDb250ZW50IExpZ2h0IExldmVsIGJveFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAodmVyc2lvbikgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgQ29udGVudCBMaWdodCBMZXZlbCBib3ggdmVyc2lvbiAlZFxuIiwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdmlvX3NraXAocGIsIDMpOyAvKiBmbGFncyAqLworCisgICAgc2MtPmNvbGwgPSBhdl9jb250ZW50X2xpZ2h0X21ldGFkYXRhX2FsbG9jKCZzYy0+Y29sbF9zaXplKTsKKyAgICBpZiAoIXNjLT5jb2xsKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc2MtPmNvbGwtPk1heENMTCAgPSBhdmlvX3JiMTYocGIpOworICAgIHNjLT5jb2xsLT5NYXhGQUxMID0gYXZpb19yYjE2KHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX2NsbGkoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHNjID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMgLSAxXS0+cHJpdl9kYXRhOworCisgICAgaWYgKGF0b20uc2l6ZSA8IDQpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJFbXB0eSBDb250ZW50IExpZ2h0IExldmVsIEluZm8gYm94XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc2MtPmNvbGwgPSBhdl9jb250ZW50X2xpZ2h0X21ldGFkYXRhX2FsbG9jKCZzYy0+Y29sbF9zaXplKTsKKyAgICBpZiAoIXNjLT5jb2xsKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc2MtPmNvbGwtPk1heENMTCAgPSBhdmlvX3JiMTYocGIpOworICAgIHNjLT5jb2xsLT5NYXhGQUxMID0gYXZpb19yYjE2KHBiKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1vdl9yZWFkX3N0M2QoTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIGVudW0gQVZTdGVyZW8zRFR5cGUgdHlwZTsKKyAgICBpbnQgbW9kZTsKKworICAgIGlmIChjLT5mYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcyAtIDFdOworICAgIHNjID0gc3QtPnByaXZfZGF0YTsKKworICAgIGlmIChhdG9tLnNpemUgPCA1KSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiRW1wdHkgc3RlcmVvc2NvcGljIHZpZGVvIGJveFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICBhdmlvX3NraXAocGIsIDQpOyAvKiB2ZXJzaW9uICsgZmxhZ3MgKi8KKworICAgIG1vZGUgPSBhdmlvX3I4KHBiKTsKKyAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIHR5cGUgPSBBVl9TVEVSRU8zRF8yRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICB0eXBlID0gQVZfU1RFUkVPM0RfVE9QQk9UVE9NOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHR5cGUgPSBBVl9TVEVSRU8zRF9TSURFQllTSURFOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiVW5rbm93biBzdDNkIG1vZGUgdmFsdWUgJWRcbiIsIG1vZGUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzYy0+c3RlcmVvM2QgPSBhdl9zdGVyZW8zZF9hbGxvYygpOworICAgIGlmICghc2MtPnN0ZXJlbzNkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgc2MtPnN0ZXJlbzNkLT50eXBlID0gdHlwZTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9zdjNkKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKKyAgICBpbnQgc2l6ZSwgdmVyc2lvbiwgbGF5b3V0OworICAgIGludDMyX3QgeWF3LCBwaXRjaCwgcm9sbDsKKyAgICB1aW50MzJfdCBsID0gMCwgdCA9IDAsIHIgPSAwLCBiID0gMDsKKyAgICB1aW50MzJfdCB0YWcsIHBhZGRpbmcgPSAwOworICAgIGVudW0gQVZTcGhlcmljYWxQcm9qZWN0aW9uIHByb2plY3Rpb247CisKKyAgICBpZiAoYy0+ZmMtPm5iX3N0cmVhbXMgPCAxKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHN0ID0gYy0+ZmMtPnN0cmVhbXNbYy0+ZmMtPm5iX3N0cmVhbXMgLSAxXTsKKyAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXRvbS5zaXplIDwgOCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIkVtcHR5IHNwaGVyaWNhbCB2aWRlbyBib3hcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoc2l6ZSA8PSAxMiB8fCBzaXplID4gYXRvbS5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHRhZyAhPSBNS1RBRygncycsJ3YnLCdoJywnZCcpKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiTWlzc2luZyBzcGhlcmljYWwgdmlkZW8gaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAodmVyc2lvbiAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIHNwaGVyaWNhbCB2ZXJzaW9uICVkXG4iLAorICAgICAgICAgICAgICAgdmVyc2lvbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdmlvX3NraXAocGIsIDMpOyAvKiBmbGFncyAqLworICAgIGF2aW9fc2tpcChwYiwgc2l6ZSAtIDEyKTsgLyogbWV0YWRhdGFfc291cmNlICovCisKKyAgICBzaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoc2l6ZSA+IGF0b20uc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICh0YWcgIT0gTUtUQUcoJ3AnLCdyJywnbycsJ2onKSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcHJvamVjdGlvbiBib3hcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICBpZiAoc2l6ZSA+IGF0b20uc2l6ZSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB0YWcgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICh0YWcgIT0gTUtUQUcoJ3AnLCdyJywnaCcsJ2QnKSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIk1pc3NpbmcgcHJvamVjdGlvbiBoZWFkZXIgYm94XG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAodmVyc2lvbiAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsICJVbmtub3duIHNwaGVyaWNhbCB2ZXJzaW9uICVkXG4iLAorICAgICAgICAgICAgICAgdmVyc2lvbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdmlvX3NraXAocGIsIDMpOyAvKiBmbGFncyAqLworCisgICAgLyogMTYuMTYgZml4ZWQgcG9pbnQgKi8KKyAgICB5YXcgICA9IGF2aW9fcmIzMihwYik7CisgICAgcGl0Y2ggPSBhdmlvX3JiMzIocGIpOworICAgIHJvbGwgID0gYXZpb19yYjMyKHBiKTsKKworICAgIHNpemUgPSBhdmlvX3JiMzIocGIpOworICAgIGlmIChzaXplID4gYXRvbS5zaXplKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CisgICAgdmVyc2lvbiA9IGF2aW9fcjgocGIpOworICAgIGlmICh2ZXJzaW9uICE9IDApIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIlVua25vd24gc3BoZXJpY2FsIHZlcnNpb24gJWRcbiIsCisgICAgICAgICAgICAgICB2ZXJzaW9uKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGF2aW9fc2tpcChwYiwgMyk7IC8qIGZsYWdzICovCisgICAgc3dpdGNoICh0YWcpIHsKKyAgICBjYXNlIE1LVEFHKCdjJywnYicsJ20nLCdwJyk6CisgICAgICAgIGxheW91dCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGlmIChsYXlvdXQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGN1YmVtYXAgbGF5b3V0ICVkXG4iLCBsYXlvdXQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcHJvamVjdGlvbiA9IEFWX1NQSEVSSUNBTF9DVUJFTUFQOworICAgICAgICBwYWRkaW5nID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBNS1RBRygnZScsJ3EnLCd1JywnaScpOgorICAgICAgICB0ID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgYiA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGwgPSBhdmlvX3JiMzIocGIpOworICAgICAgICByID0gYXZpb19yYjMyKHBiKTsKKworICAgICAgICBpZiAoYiA+PSBVSU5UX01BWCAtIHQgfHwgciA+PSBVSU5UX01BWCAtIGwpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJvdW5kaW5nIHJlY3RhbmdsZSBjb29yZGluYXRlcyAiCisgICAgICAgICAgICAgICAgICAgIiUiUFJJdTMyIiwlIlBSSXUzMiIsJSJQUkl1MzIiLCUiUFJJdTMyIlxuIiwgbCwgdCwgciwgYik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsIHx8IHQgfHwgciB8fCBiKQorICAgICAgICAgICAgcHJvamVjdGlvbiA9IEFWX1NQSEVSSUNBTF9FUVVJUkVDVEFOR1VMQVJfVElMRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJvamVjdGlvbiA9IEFWX1NQSEVSSUNBTF9FUVVJUkVDVEFOR1VMQVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBwcm9qZWN0aW9uIHR5cGU6ICVzXG4iLCBhdl9mb3VyY2Myc3RyKHRhZykpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzYy0+c3BoZXJpY2FsID0gYXZfc3BoZXJpY2FsX2FsbG9jKCZzYy0+c3BoZXJpY2FsX3NpemUpOworICAgIGlmICghc2MtPnNwaGVyaWNhbCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHNjLT5zcGhlcmljYWwtPnByb2plY3Rpb24gPSBwcm9qZWN0aW9uOworCisgICAgc2MtPnNwaGVyaWNhbC0+eWF3ICAgPSB5YXc7CisgICAgc2MtPnNwaGVyaWNhbC0+cGl0Y2ggPSBwaXRjaDsKKyAgICBzYy0+c3BoZXJpY2FsLT5yb2xsICA9IHJvbGw7CisKKyAgICBzYy0+c3BoZXJpY2FsLT5wYWRkaW5nID0gcGFkZGluZzsKKworICAgIHNjLT5zcGhlcmljYWwtPmJvdW5kX2xlZnQgICA9IGw7CisgICAgc2MtPnNwaGVyaWNhbC0+Ym91bmRfdG9wICAgID0gdDsKKyAgICBzYy0+c3BoZXJpY2FsLT5ib3VuZF9yaWdodCAgPSByOworICAgIHNjLT5zcGhlcmljYWwtPmJvdW5kX2JvdHRvbSA9IGI7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcGFyc2VfdXVpZF9zcGhlcmljYWwoTU9WU3RyZWFtQ29udGV4dCAqc2MsIEFWSU9Db250ZXh0ICpwYiwgc2l6ZV90IGxlbikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICB1aW50OF90ICpidWZmZXIgPSBhdl9tYWxsb2MobGVuICsgMSk7CisgICAgY29uc3QgY2hhciAqdmFsOworCisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYnVmZmVyW2xlbl0gPSAnXDAnOworCisgICAgcmV0ID0gZmZpb19yZWFkX3NpemUocGIsIGJ1ZmZlciwgbGVuKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICAvKiBDaGVjayBmb3IgbWFuZGF0b3J5IGtleXMgYW5kIHZhbHVlcywgdHJ5IHRvIHN1cHBvcnQgWE1MIGFzIGJlc3QtZWZmb3J0ICovCisgICAgaWYgKCFzYy0+c3BoZXJpY2FsICYmCisgICAgICAgIGF2X3N0cmlzdHIoYnVmZmVyLCAiPEdTcGhlcmljYWw6U3RpdGNoaW5nU29mdHdhcmU+IikgJiYKKyAgICAgICAgKHZhbCA9IGF2X3N0cmlzdHIoYnVmZmVyLCAiPEdTcGhlcmljYWw6U3BoZXJpY2FsPiIpKSAmJgorICAgICAgICBhdl9zdHJpc3RyKHZhbCwgInRydWUiKSAmJgorICAgICAgICAodmFsID0gYXZfc3RyaXN0cihidWZmZXIsICI8R1NwaGVyaWNhbDpTdGl0Y2hlZD4iKSkgJiYKKyAgICAgICAgYXZfc3RyaXN0cih2YWwsICJ0cnVlIikgJiYKKyAgICAgICAgKHZhbCA9IGF2X3N0cmlzdHIoYnVmZmVyLCAiPEdTcGhlcmljYWw6UHJvamVjdGlvblR5cGU+IikpICYmCisgICAgICAgIGF2X3N0cmlzdHIodmFsLCAiZXF1aXJlY3Rhbmd1bGFyIikpIHsKKyAgICAgICAgc2MtPnNwaGVyaWNhbCA9IGF2X3NwaGVyaWNhbF9hbGxvYygmc2MtPnNwaGVyaWNhbF9zaXplKTsKKyAgICAgICAgaWYgKCFzYy0+c3BoZXJpY2FsKQorICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgc2MtPnNwaGVyaWNhbC0+cHJvamVjdGlvbiA9IEFWX1NQSEVSSUNBTF9FUVVJUkVDVEFOR1VMQVI7CisKKyAgICAgICAgaWYgKGF2X3N0cmlzdHIoYnVmZmVyLCAiPEdTcGhlcmljYWw6U3RlcmVvTW9kZT4iKSAmJiAhc2MtPnN0ZXJlbzNkKSB7CisgICAgICAgICAgICBlbnVtIEFWU3RlcmVvM0RUeXBlIG1vZGU7CisKKyAgICAgICAgICAgIGlmIChhdl9zdHJpc3RyKGJ1ZmZlciwgImxlZnQtcmlnaHQiKSkKKyAgICAgICAgICAgICAgICBtb2RlID0gQVZfU1RFUkVPM0RfU0lERUJZU0lERTsKKyAgICAgICAgICAgIGVsc2UgaWYgKGF2X3N0cmlzdHIoYnVmZmVyLCAidG9wLWJvdHRvbSIpKQorICAgICAgICAgICAgICAgIG1vZGUgPSBBVl9TVEVSRU8zRF9UT1BCT1RUT007CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbW9kZSA9IEFWX1NURVJFTzNEXzJEOworCisgICAgICAgICAgICBzYy0+c3RlcmVvM2QgPSBhdl9zdGVyZW8zZF9hbGxvYygpOworICAgICAgICAgICAgaWYgKCFzYy0+c3RlcmVvM2QpCisgICAgICAgICAgICAgICAgZ290byBvdXQ7CisKKyAgICAgICAgICAgIHNjLT5zdGVyZW8zZC0+dHlwZSA9IG1vZGU7CisgICAgICAgIH0KKworICAgICAgICAvKiBvcmllbnRhdGlvbiAqLworICAgICAgICB2YWwgPSBhdl9zdHJpc3RyKGJ1ZmZlciwgIjxHU3BoZXJpY2FsOkluaXRpYWxWaWV3SGVhZGluZ0RlZ3JlZXM+Iik7CisgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgICBzYy0+c3BoZXJpY2FsLT55YXcgPSBzdHJ0b2wodmFsLCBOVUxMLCAxMCkgKiAoMSA8PCAxNik7CisgICAgICAgIHZhbCA9IGF2X3N0cmlzdHIoYnVmZmVyLCAiPEdTcGhlcmljYWw6SW5pdGlhbFZpZXdQaXRjaERlZ3JlZXM+Iik7CisgICAgICAgIGlmICh2YWwpCisgICAgICAgICAgICBzYy0+c3BoZXJpY2FsLT5waXRjaCA9IHN0cnRvbCh2YWwsIE5VTEwsIDEwKSAqICgxIDw8IDE2KTsKKyAgICAgICAgdmFsID0gYXZfc3RyaXN0cihidWZmZXIsICI8R1NwaGVyaWNhbDpJbml0aWFsVmlld1JvbGxEZWdyZWVzPiIpOworICAgICAgICBpZiAodmFsKQorICAgICAgICAgICAgc2MtPnNwaGVyaWNhbC0+cm9sbCA9IHN0cnRvbCh2YWwsIE5VTEwsIDEwKSAqICgxIDw8IDE2KTsKKyAgICB9CisKK291dDoKKyAgICBhdl9mcmVlKGJ1ZmZlcik7CisgICAgcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBtb3ZfcmVhZF91dWlkKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQogewotICAgIGludCByZXQ7CisgICAgQVZTdHJlYW0gKnN0OworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIGludDY0X3QgcmV0OwogICAgIHVpbnQ4X3QgdXVpZFsxNl07CiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdXVpZF9pc21sX21hbmlmZXN0W10gPSB7CiAgICAgICAgIDB4YTUsIDB4ZDQsIDB4MGIsIDB4MzAsIDB4ZTgsIDB4MTQsIDB4MTEsIDB4ZGQsCkBAIC0zODg5LDEwICs1NjQyLDE5IEBACiAgICAgICAgIDB4YmUsIDB4N2EsIDB4Y2YsIDB4Y2IsIDB4OTcsIDB4YTksIDB4NDIsIDB4ZTgsCiAgICAgICAgIDB4OWMsIDB4NzEsIDB4OTksIDB4OTQsIDB4OTEsIDB4ZTMsIDB4YWYsIDB4YWMKICAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHV1aWRfc3BoZXJpY2FsW10gPSB7CisgICAgICAgIDB4ZmYsIDB4Y2MsIDB4ODIsIDB4NjMsIDB4ZjgsIDB4NTUsIDB4NGEsIDB4OTMsCisgICAgICAgIDB4ODgsIDB4MTQsIDB4NTgsIDB4N2EsIDB4MDIsIDB4NTIsIDB4MWYsIDB4ZGQsCisgICAgfTsKIAotICAgIGlmIChhdG9tLnNpemUgPCBzaXplb2YodXVpZCkgfHwgYXRvbS5zaXplID09IElOVDY0X01BWCkKKyAgICBpZiAoYXRvbS5zaXplIDwgc2l6ZW9mKHV1aWQpIHx8IGF0b20uc2l6ZSA+PSBGRk1JTihJTlRfTUFYLCBTSVpFX01BWCkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcyAtIDFdOworICAgIHNjID0gc3QtPnByaXZfZGF0YTsKKwogICAgIHJldCA9IGF2aW9fcmVhZChwYiwgdXVpZCwgc2l6ZW9mKHV1aWQpKTsKICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMzk0NiwyNSArNTcwOCwzNyBAQAogICAgIH0gZWxzZSBpZiAoIW1lbWNtcCh1dWlkLCB1dWlkX3htcCwgc2l6ZW9mKHV1aWQpKSkgewogICAgICAgICB1aW50OF90ICpidWZmZXI7CiAgICAgICAgIHNpemVfdCBsZW4gPSBhdG9tLnNpemUgLSBzaXplb2YodXVpZCk7Ci0KLSAgICAgICAgYnVmZmVyID0gYXZfbWFsbG9jeihsZW4gKyAxKTsKLSAgICAgICAgaWYgKCFidWZmZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBidWZmZXIsIGxlbik7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBhdl9mcmVlKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBsZW4pIHsKLSAgICAgICAgICAgIGF2X2ZyZWUoYnVmZmVyKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9CiAgICAgICAgIGlmIChjLT5leHBvcnRfeG1wKSB7CisgICAgICAgICAgICBidWZmZXIgPSBhdl9tYWxsb2N6KGxlbiArIDEpOworICAgICAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBidWZmZXIsIGxlbik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZShidWZmZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnVmZmVyW2xlbl0gPSAnXDAnOwogICAgICAgICAgICAgYXZfZGljdF9zZXQoJmMtPmZjLT5tZXRhZGF0YSwgInhtcCIsIGJ1ZmZlciwgMCk7CisgICAgICAgICAgICBhdl9mcmVlKGJ1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBza2lwIGFsbCB1dWlkIGF0b20sIHdoaWNoIG1ha2VzIGl0IGZhc3QgZm9yIGxvbmcgdXVpZC14bXAgZmlsZQorICAgICAgICAgICAgcmV0ID0gYXZpb19za2lwKHBiLCBsZW4pOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQotICAgICAgICBhdl9mcmVlKGJ1ZmZlcik7CisgICAgfSBlbHNlIGlmICghbWVtY21wKHV1aWQsIHV1aWRfc3BoZXJpY2FsLCBzaXplb2YodXVpZCkpKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBhdG9tLnNpemUgLSBzaXplb2YodXVpZCk7CisgICAgICAgIHJldCA9IG1vdl9wYXJzZV91dWlkX3NwaGVyaWNhbChzYywgcGIsIGxlbik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgaWYgKCFzYy0+c3BoZXJpY2FsKQorICAgICAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfV0FSTklORywgIkludmFsaWQgc3BoZXJpY2FsIG1ldGFkYXRhIGZvdW5kXG4iKTsKICAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDAwNywxNSArNTc4MSwxNSBAQAogICAgIGNhc2UgTUtUQUcoJ2UnLCduJywnYycsJ3YnKTogICAgICAgIC8vIGVuY3J5cHRlZCB2aWRlbwogICAgIGNhc2UgTUtUQUcoJ2UnLCduJywnYycsJ2EnKTogICAgICAgIC8vIGVuY3J5cHRlZCBhdWRpbwogICAgICAgICBpZCA9IG1vdl9jb2RlY19pZChzdCwgZm9ybWF0KTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSAmJgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBpZCkgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FICYmCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IGlkKSB7CiAgICAgICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICJpZ25vcmluZyAnZnJtYScgYXRvbSBvZiAnJS40cycsIHN0cmVhbSBoYXMgY29kZWMgaWQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgKGNoYXIqKSZmb3JtYXQsIHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgICAgICAgIChjaGFyKikmZm9ybWF0LCBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGlkOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gaWQ7CiAgICAgICAgIHNjLT5mb3JtYXQgPSBmb3JtYXQ7CiAgICAgICAgIGJyZWFrOwogCkBAIC00MDUzLDggKzU4MjcsOCBAQAogCiAgICAgYXZpb19yYjMyKHBiKTsgICAgICAgIC8qIGVudHJpZXMgKi8KIAotICAgIGlmIChhdG9tLnNpemUgPCA4KSB7Ci0gICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAic2VuYyBhdG9tIHNpemUgJSJQUklkNjQiIHRvbyBzbWFsbFxuIiwgYXRvbS5zaXplKTsKKyAgICBpZiAoYXRvbS5zaXplIDwgOCB8fCBhdG9tLnNpemUgPiBGRk1JTihJTlRfTUFYLCBTSVpFX01BWCkpIHsKKyAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfRVJST1IsICJzZW5jIGF0b20gc2l6ZSAlIlBSSWQ2NCIgaW52YWxpZFxuIiwgYXRvbS5zaXplKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCkBAIC00MDY3LDggKzU4NDEsOCBAQAogICAgIH0KIAogICAgIHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX2VuZCA9IHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvICsgYXV4aWxpYXJ5X2luZm9fc2l6ZTsKLQogICAgIHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX3BvcyA9IHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvOworICAgIHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX2luZGV4ID0gMDsKIAogICAgIGlmIChhdmlvX3JlYWQocGIsIHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvLCBhdXhpbGlhcnlfaW5mb19zaXplKSAhPSBhdXhpbGlhcnlfaW5mb19zaXplKSB7CiAgICAgICAgIGF2X2xvZyhjLT5mYywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIHRvIHJlYWQgdGhlIGF1eGlsaWFyeSBpbmZvIik7CkBAIC00MDg0LDEyICs1ODU4LDE0OCBAQAogICAgIHJldHVybiBhdl9hZXNfY3RyX2luaXQoc2MtPmNlbmMuYWVzX2N0ciwgYy0+ZGVjcnlwdGlvbl9rZXkpOwogfQogCi1zdGF0aWMgaW50IGNlbmNfZmlsdGVyKE1PVkNvbnRleHQgKmMsIE1PVlN0cmVhbUNvbnRleHQgKnNjLCB1aW50OF90ICppbnB1dCwgaW50IHNpemUpCitzdGF0aWMgaW50IG1vdl9yZWFkX3NhaXooTU9WQ29udGV4dCAqYywgQVZJT0NvbnRleHQgKnBiLCBNT1ZBdG9tIGF0b20pCit7CisgICAgQVZTdHJlYW0gKnN0OworICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOworICAgIHNpemVfdCBkYXRhX3NpemU7CisgICAgaW50IGF0b21faGVhZGVyX3NpemU7CisgICAgaW50IGZsYWdzOworCisgICAgaWYgKGMtPmRlY3J5cHRpb25fa2V5X2xlbiA9PSAwIHx8IGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdCA9IGMtPmZjLT5zdHJlYW1zW2MtPmZjLT5uYl9zdHJlYW1zIC0gMV07CisgICAgc2MgPSBzdC0+cHJpdl9kYXRhOworCisgICAgaWYgKHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX3NpemVzIHx8IHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX2RlZmF1bHRfc2l6ZSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgImR1cGxpY2F0ZSBzYWl6IGF0b21cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBhdG9tX2hlYWRlcl9zaXplID0gOTsKKworICAgIGF2aW9fcjgocGIpOyAvKiB2ZXJzaW9uICovCisgICAgZmxhZ3MgPSBhdmlvX3JiMjQocGIpOworCisgICAgaWYgKChmbGFncyAmIDB4MDEpICE9IDApIHsKKyAgICAgICAgYXRvbV9oZWFkZXJfc2l6ZSArPSA4OworCisgICAgICAgIGF2aW9fcmIzMihwYik7ICAgIC8qIGluZm8gdHlwZSAqLworICAgICAgICBhdmlvX3JiMzIocGIpOyAgICAvKiBpbmZvIHR5cGUgcGFyYW0gKi8KKyAgICB9CisKKyAgICBzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mb19kZWZhdWx0X3NpemUgPSBhdmlvX3I4KHBiKTsKKyAgICBhdmlvX3JiMzIocGIpOyAgICAvKiBlbnRyaWVzICovCisKKyAgICBpZiAoYXRvbS5zaXplIDw9IGF0b21faGVhZGVyX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGF0b20uc2l6ZSA+IEZGTUlOKElOVF9NQVgsIFNJWkVfTUFYKSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgInNhaXogYXRvbSBhdXhpbGlhcnlfaW5mb19zaXplcyBzaXplICUiUFJJZDY0IiBpbnZhbGlkXG4iLCBhdG9tLnNpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICAvKiBzYXZlIHRoZSBhdXhpbGlhcnkgaW5mbyBzaXplcyBhcyBpcyAqLworICAgIGRhdGFfc2l6ZSA9IGF0b20uc2l6ZSAtIGF0b21faGVhZGVyX3NpemU7CisKKyAgICBzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mb19zaXplcyA9IGF2X21hbGxvYyhkYXRhX3NpemUpOworICAgIGlmICghc2MtPmNlbmMuYXV4aWxpYXJ5X2luZm9fc2l6ZXMpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mb19zaXplc19jb3VudCA9IGRhdGFfc2l6ZTsKKworICAgIGlmIChhdmlvX3JlYWQocGIsIHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX3NpemVzLCBkYXRhX3NpemUpICE9IGRhdGFfc2l6ZSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgImZhaWxlZCB0byByZWFkIHRoZSBhdXhpbGlhcnkgaW5mbyBzaXplcyIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9kZmxhKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgbGFzdCwgdHlwZSwgc2l6ZSwgcmV0OworICAgIHVpbnQ4X3QgYnVmWzRdOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKworICAgIGlmICgodWludDY0X3QpYXRvbS5zaXplID4gKDE8PDMwKSB8fCBhdG9tLnNpemUgPCA0MikKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBDaGVjayBGbGFjU3BlY2lmaWNCb3ggdmVyc2lvbi4gKi8KKyAgICBpZiAoYXZpb19yOChwYikgIT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmlvX3JiMjQocGIpOyAvKiBGbGFncyAqLworCisgICAgYXZpb19yZWFkKHBiLCBidWYsIHNpemVvZihidWYpKTsKKyAgICBmbGFjX3BhcnNlX2Jsb2NrX2hlYWRlcihidWYsICZsYXN0LCAmdHlwZSwgJnNpemUpOworCisgICAgaWYgKHR5cGUgIT0gRkxBQ19NRVRBREFUQV9UWVBFX1NUUkVBTUlORk8gfHwgc2l6ZSAhPSBGTEFDX1NUUkVBTUlORk9fU0laRSkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgIlNUUkVBTUlORk8gbXVzdCBiZSBmaXJzdCBGTEFDTWV0YWRhdGFCbG9ja1xuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKworICAgIHJldCA9IGZmX2dldF9leHRyYWRhdGEoYy0+ZmMsIHN0LT5jb2RlY3BhciwgcGIsIHNpemUpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCFsYXN0KQorICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19XQVJOSU5HLCAibm9uLVNUUkVBTUlORk8gRkxBQ01ldGFkYXRhQmxvY2socykgaWdub3JlZFxuIik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3Zfc2Vla19hdXhpbGlhcnlfaW5mbyhNT1ZDb250ZXh0ICpjLCBNT1ZTdHJlYW1Db250ZXh0ICpzYywgaW50NjRfdCBpbmRleCkKK3sKKyAgICBzaXplX3QgYXV4aWxpYXJ5X2luZm9fc2Vla19vZmZzZXQgPSAwOworICAgIGludCBpOworCisgICAgaWYgKHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX2RlZmF1bHRfc2l6ZSkgeworICAgICAgICBhdXhpbGlhcnlfaW5mb19zZWVrX29mZnNldCA9IChzaXplX3Qpc2MtPmNlbmMuYXV4aWxpYXJ5X2luZm9fZGVmYXVsdF9zaXplICogaW5kZXg7CisgICAgfSBlbHNlIGlmIChzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mb19zaXplcykgeworICAgICAgICBpZiAoaW5kZXggPiBzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mb19zaXplc19jb3VudCkgeworICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgImN1cnJlbnQgc2FtcGxlICUiUFJJZDY0IiBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBhdXhpbGlhcnkgaW5mbyBzYW1wbGUgc2l6ZXMgJSJTSVpFX1NQRUNJRklFUiJcbiIsCisgICAgICAgICAgICAgICAgaW5kZXgsIHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX3NpemVzX2NvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKKyAgICAgICAgICAgIGF1eGlsaWFyeV9pbmZvX3NlZWtfb2Zmc2V0ICs9IHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX3NpemVzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1eGlsaWFyeV9pbmZvX3NlZWtfb2Zmc2V0ID4gc2MtPmNlbmMuYXV4aWxpYXJ5X2luZm9fZW5kIC0gc2MtPmNlbmMuYXV4aWxpYXJ5X2luZm8pIHsKKyAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgImF1eGlsaWFyeSBpbmZvIG9mZnNldCAlIlNJWkVfU1BFQ0lGSUVSIiBncmVhdGVyIHRoYW4gYXV4aWxpYXJ5IGluZm8gc2l6ZSAlIlNJWkVfU1BFQ0lGSUVSIlxuIiwKKyAgICAgICAgICAgIGF1eGlsaWFyeV9pbmZvX3NlZWtfb2Zmc2V0LCAoc2l6ZV90KShzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mb19lbmQgLSBzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mbykpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICBzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mb19wb3MgPSBzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mbyArIGF1eGlsaWFyeV9pbmZvX3NlZWtfb2Zmc2V0OworICAgIHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX2luZGV4ID0gaW5kZXg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2VuY19maWx0ZXIoTU9WQ29udGV4dCAqYywgTU9WU3RyZWFtQ29udGV4dCAqc2MsIGludDY0X3QgaW5kZXgsIHVpbnQ4X3QgKmlucHV0LCBpbnQgc2l6ZSkKIHsKICAgICB1aW50MzJfdCBlbmNyeXB0ZWRfYnl0ZXM7CiAgICAgdWludDE2X3Qgc3Vic2FtcGxlX2NvdW50OwogICAgIHVpbnQxNl90IGNsZWFyX2J5dGVzOwogICAgIHVpbnQ4X3QqIGlucHV0X2VuZCA9IGlucHV0ICsgc2l6ZTsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGluZGV4ICE9IHNjLT5jZW5jLmF1eGlsaWFyeV9pbmZvX2luZGV4KSB7CisgICAgICAgIHJldCA9IG1vdl9zZWVrX2F1eGlsaWFyeV9pbmZvKGMsIHNjLCBpbmRleCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQogCiAgICAgLyogcmVhZCB0aGUgaXYgKi8KICAgICBpZiAoQUVTX0NUUl9JVl9TSVpFID4gc2MtPmNlbmMuYXV4aWxpYXJ5X2luZm9fZW5kIC0gc2MtPmNlbmMuYXV4aWxpYXJ5X2luZm9fcG9zKSB7CkBAIC00MTQ3LDYgKzYwNTcsNTUgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCisgICAgc2MtPmNlbmMuYXV4aWxpYXJ5X2luZm9faW5kZXgrKzsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3ZfcmVhZF9kb3BzKE1PVkNvbnRleHQgKmMsIEFWSU9Db250ZXh0ICpwYiwgTU9WQXRvbSBhdG9tKQoreworICAgIGNvbnN0IGludCBPUFVTX1NFRUtfUFJFUk9MTF9NUyA9IDgwOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpbnQxNl90IHByZV9za2lwOworCisgICAgaWYgKGMtPmZjLT5uYl9zdHJlYW1zIDwgMSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgc3QgPSBjLT5mYy0+c3RyZWFtc1tjLT5mYy0+bmJfc3RyZWFtcy0xXTsKKworICAgIGlmICgodWludDY0X3QpYXRvbS5zaXplID4gKDE8PDMwKSB8fCBhdG9tLnNpemUgPCAxMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAvKiBDaGVjayBPcHVzU3BlY2lmaWNCb3ggdmVyc2lvbi4gKi8KKyAgICBpZiAoYXZpb19yOChwYikgIT0gMCkgeworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIE9wdXNTcGVjaWZpY0JveCB2ZXJzaW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogT3B1c1NwZWNpZmljQm94IHNpemUgcGx1cyBtYWdpYyBmb3IgT2dnIE9wdXNIZWFkIGhlYWRlci4gKi8KKyAgICBzaXplID0gYXRvbS5zaXplICsgODsKKworICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBzaXplKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIEFWX1dMMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIE1LVEFHKCdPJywncCcsJ3UnLCdzJykpOworICAgIEFWX1dMMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyA0LCBNS1RBRygnSCcsJ2UnLCdhJywnZCcpKTsKKyAgICBBVl9XQjgoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyA4LCAxKTsgLyogT3B1c0hlYWQgdmVyc2lvbiAqLworICAgIGF2aW9fcmVhZChwYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyA5LCBzaXplIC0gOSk7CisKKyAgICAvKiBPcHVzU3BlY2lmaWNCb3ggaXMgc3RvcmVkIGluIGJpZy1lbmRpYW4sIGJ1dCBPcHVzSGVhZCBpcworICAgICAgIGxpdHRsZS1lbmRpYW47IGFzaWRlIGZyb20gdGhlIHByZWNlZWRpbmcgbWFnaWMgYW5kIHZlcnNpb24gdGhleSdyZQorICAgICAgIG90aGVyd2lzZSBjdXJyZW50bHkgaWRlbnRpY2FsLiAgRGF0YSBhZnRlciBvdXRwdXQgZ2FpbiBhdCBvZmZzZXQgMTYKKyAgICAgICBkb2Vzbid0IG5lZWQgdG8gYmUgYnl0ZXdhcHBlZC4gKi8KKyAgICBwcmVfc2tpcCA9IEFWX1JCMTYoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAxMCk7CisgICAgQVZfV0wxNihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDEwLCBwcmVfc2tpcCk7CisgICAgQVZfV0wzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDEyLCBBVl9SQjMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMTIpKTsKKyAgICBBVl9XTDE2KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMTYsIEFWX1JCMTYoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAxNikpOworCisgICAgc3QtPmNvZGVjcGFyLT5pbml0aWFsX3BhZGRpbmcgPSBwcmVfc2tpcDsKKyAgICBzdC0+Y29kZWNwYXItPnNlZWtfcHJlcm9sbCA9IGF2X3Jlc2NhbGVfcShPUFVTX1NFRUtfUFJFUk9MTF9NUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgMTAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpezEsIDQ4MDAwfSk7CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNDIyNyw2ICs2MTg2LDE2IEBACiB7IE1LVEFHKCdzJywnaScsJ24nLCdmJyksIG1vdl9yZWFkX2RlZmF1bHQgfSwKIHsgTUtUQUcoJ2YnLCdyJywnbScsJ2EnKSwgbW92X3JlYWRfZnJtYSB9LAogeyBNS1RBRygncycsJ2UnLCduJywnYycpLCBtb3ZfcmVhZF9zZW5jIH0sCit7IE1LVEFHKCdzJywnYScsJ2knLCd6JyksIG1vdl9yZWFkX3NhaXogfSwKK3sgTUtUQUcoJ2QnLCdmJywnTCcsJ2EnKSwgbW92X3JlYWRfZGZsYSB9LAoreyBNS1RBRygncycsJ3QnLCczJywnZCcpLCBtb3ZfcmVhZF9zdDNkIH0sIC8qIHN0ZXJlb3Njb3BpYyAzRCB2aWRlbyBib3ggKi8KK3sgTUtUQUcoJ3MnLCd2JywnMycsJ2QnKSwgbW92X3JlYWRfc3YzZCB9LCAvKiBzcGhlcmljYWwgdmlkZW8gYm94ICovCit7IE1LVEFHKCdkJywnTycsJ3AnLCdzJyksIG1vdl9yZWFkX2RvcHMgfSwKK3sgTUtUQUcoJ1MnLCdtJywnRCcsJ20nKSwgbW92X3JlYWRfc21kbSB9LAoreyBNS1RBRygnQycsJ28nLCdMJywnTCcpLCBtb3ZfcmVhZF9jb2xsIH0sCit7IE1LVEFHKCd2JywncCcsJ2MnLCdDJyksIG1vdl9yZWFkX3ZwY2MgfSwKK3sgTUtUQUcoJ20nLCdkJywnYycsJ3YnKSwgbW92X3JlYWRfbWRjdiB9LAoreyBNS1RBRygnYycsJ2wnLCdsJywnaScpLCBtb3ZfcmVhZF9jbGxpIH0sCiB7IDAsIE5VTEwgfQogfTsKIApAQCAtNDI0NCw3ICs2MjEzLDcgQEAKIAogICAgIGlmIChhdG9tLnNpemUgPCAwKQogICAgICAgICBhdG9tLnNpemUgPSBJTlQ2NF9NQVg7Ci0gICAgd2hpbGUgKHRvdGFsX3NpemUgKyA4IDw9IGF0b20uc2l6ZSAmJiAhYXZpb19mZW9mKHBiKSkgeworICAgIHdoaWxlICh0b3RhbF9zaXplIDw9IGF0b20uc2l6ZSAtIDggJiYgIWF2aW9fZmVvZihwYikpIHsKICAgICAgICAgaW50ICgqcGFyc2UpKE1PVkNvbnRleHQqLCBBVklPQ29udGV4dCosIE1PVkF0b20pID0gTlVMTDsKICAgICAgICAgYS5zaXplID0gYXRvbS5zaXplOwogICAgICAgICBhLnR5cGU9MDsKQEAgLTQyNTMsNiArNjIyMiw3IEBACiAgICAgICAgICAgICBhLnR5cGUgPSBhdmlvX3JsMzIocGIpOwogICAgICAgICAgICAgaWYgKGEudHlwZSA9PSBNS1RBRygnZicsJ3InLCdlJywnZScpICYmCiAgICAgICAgICAgICAgICAgYS5zaXplID49IDggJiYKKyAgICAgICAgICAgICAgICBjLT5mYy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlIDwgRkZfQ09NUExJQU5DRV9TVFJJQ1QgJiYKICAgICAgICAgICAgICAgICBjLT5tb292X3JldHJ5KSB7CiAgICAgICAgICAgICAgICAgdWludDhfdCBidWZbOF07CiAgICAgICAgICAgICAgICAgdWludDMyX3QgKnR5cGUgPSAodWludDMyX3QgKilidWYgKyAxOwpAQCAtNDI4Miw4ICs2MjUyLDggQEAKICAgICAgICAgICAgICAgICB0b3RhbF9zaXplICs9IDg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgYXZfbG9nKGMtPmZjLCBBVl9MT0dfVFJBQ0UsICJ0eXBlOiAlMDh4ICclLjRzJyBwYXJlbnQ6JyUuNHMnIHN6OiAlIlBSSWQ2NCIgJSJQUklkNjQiICUiUFJJZDY0IlxuIiwKLSAgICAgICAgICAgICAgICBhLnR5cGUsIChjaGFyKikmYS50eXBlLCAoY2hhciopJmF0b20udHlwZSwgYS5zaXplLCB0b3RhbF9zaXplLCBhdG9tLnNpemUpOworICAgICAgICBhdl9sb2coYy0+ZmMsIEFWX0xPR19UUkFDRSwgInR5cGU6JyVzJyBwYXJlbnQ6JyVzJyBzejogJSJQUklkNjQiICUiUFJJZDY0IiAlIlBSSWQ2NCJcbiIsCisgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKGEudHlwZSksIGF2X2ZvdXJjYzJzdHIoYXRvbS50eXBlKSwgYS5zaXplLCB0b3RhbF9zaXplLCBhdG9tLnNpemUpOwogICAgICAgICBpZiAoYS5zaXplID09IDApIHsKICAgICAgICAgICAgIGEuc2l6ZSA9IGF0b20uc2l6ZSAtIHRvdGFsX3NpemUgKyA4OwogICAgICAgICB9CkBAIC00MzIyLDkgKzYyOTIsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYy0+Zm91bmRfbW9vdiAmJiBjLT5mb3VuZF9tZGF0ICYmCi0gICAgICAgICAgICAgICAgKCghcGItPnNlZWthYmxlIHx8IGMtPmZjLT5mbGFncyAmIEFWRk1UX0ZMQUdfSUdOSURYIHx8IGMtPmZyYWdtZW50X2luZGV4X2NvbXBsZXRlKSB8fAorICAgICAgICAgICAgICAgICgoIShwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgfHwgYy0+ZmMtPmZsYWdzICYgQVZGTVRfRkxBR19JR05JRFggfHwgYy0+ZnJhZ19pbmRleC5jb21wbGV0ZSkgfHwKICAgICAgICAgICAgICAgICAgc3RhcnRfcG9zICsgYS5zaXplID09IGF2aW9fc2l6ZShwYikpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFwYi0+c2Vla2FibGUgfHwgYy0+ZmMtPmZsYWdzICYgQVZGTVRfRkxBR19JR05JRFggfHwgYy0+ZnJhZ21lbnRfaW5kZXhfY29tcGxldGUpCisgICAgICAgICAgICAgICAgaWYgKCEocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHx8IGMtPmZjLT5mbGFncyAmIEFWRk1UX0ZMQUdfSUdOSURYIHx8IGMtPmZyYWdfaW5kZXguY29tcGxldGUpCiAgICAgICAgICAgICAgICAgICAgIGMtPm5leHRfcm9vdF9hdG9tID0gc3RhcnRfcG9zICsgYS5zaXplOwogICAgICAgICAgICAgICAgIGMtPmF0b21fZGVwdGggLS07CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC00NDM3LDc1ICs2NDA3LDEwMiBAQAogc3RhdGljIHZvaWQgbW92X3JlYWRfY2hhcHRlcnMoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIE1PVkNvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKLSAgICBBVlN0cmVhbSAqc3QgPSBOVUxMOworICAgIEFWU3RyZWFtICpzdDsKICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKICAgICBpbnQ2NF90IGN1cl9wb3M7Ci0gICAgaW50IGk7CisgICAgaW50IGksIGo7CisgICAgaW50IGNoYXB0ZXJfdHJhY2s7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQotICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+aWQgPT0gbW92LT5jaGFwdGVyX3RyYWNrKSB7Ci0gICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIGlmICghc3QpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJlZmVyZW5jZWQgUVQgY2hhcHRlciB0cmFjayBub3QgZm91bmRcbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3QtPmRpc2NhcmQgPSBBVkRJU0NBUkRfQUxMOwotICAgIHNjID0gc3QtPnByaXZfZGF0YTsKLSAgICBjdXJfcG9zID0gYXZpb190ZWxsKHNjLT5wYik7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPm5iX2luZGV4X2VudHJpZXM7IGkrKykgewotICAgICAgICBBVkluZGV4RW50cnkgKnNhbXBsZSA9ICZzdC0+aW5kZXhfZW50cmllc1tpXTsKLSAgICAgICAgaW50NjRfdCBlbmQgPSBpKzEgPCBzdC0+bmJfaW5kZXhfZW50cmllcyA/IHN0LT5pbmRleF9lbnRyaWVzW2krMV0udGltZXN0YW1wIDogc3QtPmR1cmF0aW9uOwotICAgICAgICB1aW50OF90ICp0aXRsZTsKLSAgICAgICAgdWludDE2X3QgY2g7Ci0gICAgICAgIGludCBsZW4sIHRpdGxlX2xlbjsKLQotICAgICAgICBpZiAoZW5kIDwgc2FtcGxlLT50aW1lc3RhbXApIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgImlnbm9yaW5nIHN0cmVhbSBkdXJhdGlvbiB3aGljaCBpcyBzaG9ydGVyIHRoYW4gY2hhcHRlcnNcbiIpOwotICAgICAgICAgICAgZW5kID0gQVZfTk9QVFNfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoYXZpb19zZWVrKHNjLT5wYiwgc2FtcGxlLT5wb3MsIFNFRUtfU0VUKSAhPSBzYW1wbGUtPnBvcykgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNoYXB0ZXIgJWQgbm90IGZvdW5kIGluIGZpbGVcbiIsIGkpOwotICAgICAgICAgICAgZ290byBmaW5pc2g7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0aGUgZmlyc3QgdHdvIGJ5dGVzIGFyZSB0aGUgbGVuZ3RoIG9mIHRoZSB0aXRsZQotICAgICAgICBsZW4gPSBhdmlvX3JiMTYoc2MtPnBiKTsKLSAgICAgICAgaWYgKGxlbiA+IHNhbXBsZS0+c2l6ZS0yKQorICAgIGZvciAoaiA9IDA7IGogPCBtb3YtPm5iX2NoYXB0ZXJfdHJhY2tzOyBqKyspIHsKKyAgICAgICAgY2hhcHRlcl90cmFjayA9IG1vdi0+Y2hhcHRlcl90cmFja3Nbal07CisgICAgICAgIHN0ID0gTlVMTDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5pZCA9PSBjaGFwdGVyX3RyYWNrKSB7CisgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoIXN0KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVmZXJlbmNlZCBRVCBjaGFwdGVyIHRyYWNrIG5vdCBmb3VuZFxuIik7CiAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgdGl0bGVfbGVuID0gMipsZW4gKyAxOwotICAgICAgICBpZiAoISh0aXRsZSA9IGF2X21hbGxvY3oodGl0bGVfbGVuKSkpCi0gICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgfQogCi0gICAgICAgIC8vIFRoZSBzYW1wbGVzIGNvdWxkIHRoZW9yZXRpY2FsbHkgYmUgaW4gYW55IGVuY29kaW5nIGlmIHRoZXJlJ3MgYW4gZW5jZAotICAgICAgICAvLyBhdG9tIGZvbGxvd2luZywgYnV0IGluIHByYWN0aWNlIGFyZSBvbmx5IHV0Zi04IG9yIHV0Zi0xNiwgZGlzdGluZ3Vpc2hlZAotICAgICAgICAvLyBpbnN0ZWFkIGJ5IHRoZSBwcmVzZW5jZSBvZiBhIEJPTQotICAgICAgICBpZiAoIWxlbikgewotICAgICAgICAgICAgdGl0bGVbMF0gPSAwOworICAgICAgICBzYyA9IHN0LT5wcml2X2RhdGE7CisgICAgICAgIGN1cl9wb3MgPSBhdmlvX3RlbGwoc2MtPnBiKTsKKworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uIHw9IEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQyB8IEFWX0RJU1BPU0lUSU9OX1RJTUVEX1RIVU1CTkFJTFM7CisgICAgICAgICAgICBpZiAoc3QtPm5iX2luZGV4X2VudHJpZXMpIHsKKyAgICAgICAgICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgZmlyc3QgZnJhbWUsIGlmIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgQVZQYWNrZXQgcGt0OworICAgICAgICAgICAgICAgIEFWSW5kZXhFbnRyeSAqc2FtcGxlID0gJnN0LT5pbmRleF9lbnRyaWVzWzBdOworICAgICAgICAgICAgICAgIGlmIChhdmlvX3NlZWsoc2MtPnBiLCBzYW1wbGUtPnBvcywgU0VFS19TRVQpICE9IHNhbXBsZS0+cG9zKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmV0cmlldmUgZmlyc3QgZnJhbWVcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoYXZfZ2V0X3BhY2tldChzYy0+cGIsICZwa3QsIHNhbXBsZS0+c2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgICAgICAgICAgICAgIHN0LT5hdHRhY2hlZF9waWMgICAgICAgICAgICAgID0gcGt0OworICAgICAgICAgICAgICAgIHN0LT5hdHRhY2hlZF9waWMuc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OworICAgICAgICAgICAgICAgIHN0LT5hdHRhY2hlZF9waWMuZmxhZ3MgICAgICAgfD0gQVZfUEtUX0ZMQUdfS0VZOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2ggPSBhdmlvX3JiMTYoc2MtPnBiKTsKLSAgICAgICAgICAgIGlmIChjaCA9PSAweGZlZmYpCi0gICAgICAgICAgICAgICAgYXZpb19nZXRfc3RyMTZiZShzYy0+cGIsIGxlbiwgdGl0bGUsIHRpdGxlX2xlbik7Ci0gICAgICAgICAgICBlbHNlIGlmIChjaCA9PSAweGZmZmUpCi0gICAgICAgICAgICAgICAgYXZpb19nZXRfc3RyMTZsZShzYy0+cGIsIGxlbiwgdGl0bGUsIHRpdGxlX2xlbik7Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBVl9XQjE2KHRpdGxlLCBjaCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAxIHx8IGxlbiA9PSAyKQotICAgICAgICAgICAgICAgICAgICB0aXRsZVtsZW5dID0gMDsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGF2aW9fZ2V0X3N0cihzYy0+cGIsIElOVF9NQVgsIHRpdGxlICsgMiwgbGVuIC0gMSk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9CSU5fREFUQTsKKyAgICAgICAgICAgIHN0LT5kaXNjYXJkID0gQVZESVNDQVJEX0FMTDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+bmJfaW5kZXhfZW50cmllczsgaSsrKSB7CisgICAgICAgICAgICAgICAgQVZJbmRleEVudHJ5ICpzYW1wbGUgPSAmc3QtPmluZGV4X2VudHJpZXNbaV07CisgICAgICAgICAgICAgICAgaW50NjRfdCBlbmQgPSBpKzEgPCBzdC0+bmJfaW5kZXhfZW50cmllcyA/IHN0LT5pbmRleF9lbnRyaWVzW2krMV0udGltZXN0YW1wIDogc3QtPmR1cmF0aW9uOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRpdGxlOworICAgICAgICAgICAgICAgIHVpbnQxNl90IGNoOworICAgICAgICAgICAgICAgIGludCBsZW4sIHRpdGxlX2xlbjsKKworICAgICAgICAgICAgICAgIGlmIChlbmQgPCBzYW1wbGUtPnRpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyBzdHJlYW0gZHVyYXRpb24gd2hpY2ggaXMgc2hvcnRlciB0aGFuIGNoYXB0ZXJzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gQVZfTk9QVFNfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGF2aW9fc2VlayhzYy0+cGIsIHNhbXBsZS0+cG9zLCBTRUVLX1NFVCkgIT0gc2FtcGxlLT5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNoYXB0ZXIgJWQgbm90IGZvdW5kIGluIGZpbGVcbiIsIGkpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgdHdvIGJ5dGVzIGFyZSB0aGUgbGVuZ3RoIG9mIHRoZSB0aXRsZQorICAgICAgICAgICAgICAgIGxlbiA9IGF2aW9fcmIxNihzYy0+cGIpOworICAgICAgICAgICAgICAgIGlmIChsZW4gPiBzYW1wbGUtPnNpemUtMikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdGl0bGVfbGVuID0gMipsZW4gKyAxOworICAgICAgICAgICAgICAgIGlmICghKHRpdGxlID0gYXZfbWFsbG9jeih0aXRsZV9sZW4pKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisKKyAgICAgICAgICAgICAgICAvLyBUaGUgc2FtcGxlcyBjb3VsZCB0aGVvcmV0aWNhbGx5IGJlIGluIGFueSBlbmNvZGluZyBpZiB0aGVyZSdzIGFuIGVuY2QKKyAgICAgICAgICAgICAgICAvLyBhdG9tIGZvbGxvd2luZywgYnV0IGluIHByYWN0aWNlIGFyZSBvbmx5IHV0Zi04IG9yIHV0Zi0xNiwgZGlzdGluZ3Vpc2hlZAorICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgYnkgdGhlIHByZXNlbmNlIG9mIGEgQk9NCisgICAgICAgICAgICAgICAgaWYgKCFsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgdGl0bGVbMF0gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoID0gYXZpb19yYjE2KHNjLT5wYik7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAweGZlZmYpCisgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX2dldF9zdHIxNmJlKHNjLT5wYiwgbGVuLCB0aXRsZSwgdGl0bGVfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gMHhmZmZlKQorICAgICAgICAgICAgICAgICAgICAgICAgYXZpb19nZXRfc3RyMTZsZShzYy0+cGIsIGxlbiwgdGl0bGUsIHRpdGxlX2xlbik7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0IxNih0aXRsZSwgY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAxIHx8IGxlbiA9PSAyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlW2xlbl0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2aW9fZ2V0X3N0cihzYy0+cGIsIElOVF9NQVgsIHRpdGxlICsgMiwgbGVuIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBhdnByaXZfbmV3X2NoYXB0ZXIocywgaSwgc3QtPnRpbWVfYmFzZSwgc2FtcGxlLT50aW1lc3RhbXAsIGVuZCwgdGl0bGUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ0aXRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBhdnByaXZfbmV3X2NoYXB0ZXIocywgaSwgc3QtPnRpbWVfYmFzZSwgc2FtcGxlLT50aW1lc3RhbXAsIGVuZCwgdGl0bGUpOwotICAgICAgICBhdl9mcmVlcCgmdGl0bGUpOwotICAgIH0KIGZpbmlzaDoKLSAgICBhdmlvX3NlZWsoc2MtPnBiLCBjdXJfcG9zLCBTRUVLX1NFVCk7CisgICAgICAgIGF2aW9fc2VlayhzYy0+cGIsIGN1cl9wb3MsIFNFRUtfU0VUKTsKKyAgICB9CiB9CiAKIHN0YXRpYyBpbnQgcGFyc2VfdGltZWNvZGVfaW5fZnJhbWVudW1fZm9ybWF0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LApAQCAtNDUxMyw4ICs2NTEwLDcgQEAKIHsKICAgICBBVlRpbWVjb2RlIHRjOwogICAgIGNoYXIgYnVmW0FWX1RJTUVDT0RFX1NUUl9TSVpFXTsKLSAgICBBVlJhdGlvbmFsIHJhdGUgPSB7c3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuLAotICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW19OworICAgIEFWUmF0aW9uYWwgcmF0ZSA9IHN0LT5hdmdfZnJhbWVfcmF0ZTsKICAgICBpbnQgcmV0ID0gYXZfdGltZWNvZGVfaW5pdCgmdGMsIHJhdGUsIGZsYWdzLCAwLCBzKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTQ1MjMsNiArNjUxOSwzMSBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IG1vdl9yZWFkX3J0bWRfdHJhY2soQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCit7CisgICAgTU9WU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOworICAgIGNoYXIgYnVmW0FWX1RJTUVDT0RFX1NUUl9TSVpFXTsKKyAgICBpbnQ2NF90IGN1cl9wb3MgPSBhdmlvX3RlbGwoc2MtPnBiKTsKKyAgICBpbnQgaGgsIG1tLCBzcywgZmYsIGRyb3A7CisKKyAgICBpZiAoIXN0LT5uYl9pbmRleF9lbnRyaWVzKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBhdmlvX3NlZWsoc2MtPnBiLCBzdC0+aW5kZXhfZW50cmllcy0+cG9zLCBTRUVLX1NFVCk7CisgICAgYXZpb19za2lwKHMtPnBiLCAxMyk7CisgICAgaGggPSBhdmlvX3I4KHMtPnBiKTsKKyAgICBtbSA9IGF2aW9fcjgocy0+cGIpOworICAgIHNzID0gYXZpb19yOChzLT5wYik7CisgICAgZHJvcCA9IGF2aW9fcjgocy0+cGIpOworICAgIGZmID0gYXZpb19yOChzLT5wYik7CisgICAgc25wcmludGYoYnVmLCBBVl9USU1FQ09ERV9TVFJfU0laRSwgIiUwMmQ6JTAyZDolMDJkJWMlMDJkIiwKKyAgICAgICAgICAgICBoaCwgbW0sIHNzLCBkcm9wID8gJzsnIDogJzonLCBmZik7CisgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgYnVmLCAwKTsKKworICAgIGF2aW9fc2VlayhzYy0+cGIsIGN1cl9wb3MsIFNFRUtfU0VUKTsKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBtb3ZfcmVhZF90aW1lY29kZV90cmFjayhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKIHsKICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CkBAIC00NTg1LDkgKzY2MDYsMjIgQEAKICAgICAgICAgYXZfZnJlZXAoJnNjLT5lbHN0X2RhdGEpOwogICAgICAgICBhdl9mcmVlcCgmc2MtPnJhcF9ncm91cCk7CiAgICAgICAgIGF2X2ZyZWVwKCZzYy0+ZGlzcGxheV9tYXRyaXgpOworICAgICAgICBhdl9mcmVlcCgmc2MtPmluZGV4X3Jhbmdlcyk7CisKKyAgICAgICAgaWYgKHNjLT5leHRyYWRhdGEpCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2MtPnN0c2RfY291bnQ7IGorKykKKyAgICAgICAgICAgICAgICBhdl9mcmVlKHNjLT5leHRyYWRhdGFbal0pOworICAgICAgICBhdl9mcmVlcCgmc2MtPmV4dHJhZGF0YSk7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+ZXh0cmFkYXRhX3NpemUpOwogCiAgICAgICAgIGF2X2ZyZWVwKCZzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mbyk7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+Y2VuYy5hdXhpbGlhcnlfaW5mb19zaXplcyk7CiAgICAgICAgIGF2X2Flc19jdHJfZnJlZShzYy0+Y2VuYy5hZXNfY3RyKTsKKworICAgICAgICBhdl9mcmVlcCgmc2MtPnN0ZXJlbzNkKTsKKyAgICAgICAgYXZfZnJlZXAoJnNjLT5zcGhlcmljYWwpOworICAgICAgICBhdl9mcmVlcCgmc2MtPm1hc3RlcmluZyk7CisgICAgICAgIGF2X2ZyZWVwKCZzYy0+Y29sbCk7CiAgICAgfQogCiAgICAgaWYgKG1vdi0+ZHZfZGVtdXgpIHsKQEAgLTQ2MDUsMTQgKzY2MzksMTMgQEAKICAgICBhdl9mcmVlcCgmbW92LT50cmV4X2RhdGEpOwogICAgIGF2X2ZyZWVwKCZtb3YtPmJpdHJhdGVzKTsKIAotICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPmZyYWdtZW50X2luZGV4X2NvdW50OyBpKyspIHsKLSAgICAgICAgTU9WRnJhZ21lbnRJbmRleCogaW5kZXggPSBtb3YtPmZyYWdtZW50X2luZGV4X2RhdGFbaV07Ci0gICAgICAgIGF2X2ZyZWVwKCZpbmRleC0+aXRlbXMpOwotICAgICAgICBhdl9mcmVlcCgmbW92LT5mcmFnbWVudF9pbmRleF9kYXRhW2ldKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5mcmFnX2luZGV4Lm5iX2l0ZW1zOyBpKyspIHsKKyAgICAgICAgYXZfZnJlZXAoJm1vdi0+ZnJhZ19pbmRleC5pdGVtW2ldLnN0cmVhbV9pbmZvKTsKICAgICB9Ci0gICAgYXZfZnJlZXAoJm1vdi0+ZnJhZ21lbnRfaW5kZXhfZGF0YSk7CisgICAgYXZfZnJlZXAoJm1vdi0+ZnJhZ19pbmRleC5pdGVtKTsKIAogICAgIGF2X2ZyZWVwKCZtb3YtPmFlc19kZWNyeXB0KTsKKyAgICBhdl9mcmVlcCgmbW92LT5jaGFwdGVyX3RyYWNrcyk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTQ2MjUsNyArNjY1OCw3IEBACiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKIAotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgogICAgICAgICAgICAgc2MtPnRpbWVjb2RlX3RyYWNrID09IHRtY2RfaWQpCiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICB9CkBAIC00NjQwLDcgKzY2NzMsNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKIAotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190YWcgID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykgJiYKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICA9PSBNS1RBRygndCcsJ20nLCdjJywnZCcpICYmCiAgICAgICAgICAgICAhdG1jZF9pc19yZWZlcmVuY2VkKHMsIGkgKyAxKSkgewogICAgICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRjciA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCk7CiAgICAgICAgICAgICBpZiAodGNyKSB7CkBAIC00NjUzLDQ0ICs2Njg2LDMwIEBACiAKIHN0YXRpYyBpbnQgcmVhZF90ZnJhKE1PVkNvbnRleHQgKm1vdiwgQVZJT0NvbnRleHQgKmYpCiB7Ci0gICAgTU9WRnJhZ21lbnRJbmRleCogaW5kZXggPSBOVUxMOwogICAgIGludCB2ZXJzaW9uLCBmaWVsZGxlbmd0aCwgaSwgajsKICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChmKTsKICAgICB1aW50MzJfdCBzaXplID0gYXZpb19yYjMyKGYpOwotICAgIHZvaWQgKnRtcDsKKyAgICB1bnNpZ25lZCB0cmFja19pZCwgaXRlbV9jb3VudDsKIAogICAgIGlmIChhdmlvX3JiMzIoZikgIT0gTUtCRVRBRygndCcsICdmJywgJ3InLCAnYScpKSB7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX1ZFUkJPU0UsICJmb3VuZCB0ZnJhXG4iKTsKLSAgICBpbmRleCA9IGF2X21hbGxvY3ooc2l6ZW9mKE1PVkZyYWdtZW50SW5kZXgpKTsKLSAgICBpZiAoIWluZGV4KSB7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotCi0gICAgdG1wID0gYXZfcmVhbGxvY19hcnJheShtb3YtPmZyYWdtZW50X2luZGV4X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YtPmZyYWdtZW50X2luZGV4X2NvdW50ICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihNT1ZGcmFnbWVudEluZGV4KikpOwotICAgIGlmICghdG1wKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZpbmRleCk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgfQotICAgIG1vdi0+ZnJhZ21lbnRfaW5kZXhfZGF0YSA9IHRtcDsKLSAgICBtb3YtPmZyYWdtZW50X2luZGV4X2RhdGFbbW92LT5mcmFnbWVudF9pbmRleF9jb3VudCsrXSA9IGluZGV4OwogCiAgICAgdmVyc2lvbiA9IGF2aW9fcjgoZik7CiAgICAgYXZpb19yYjI0KGYpOwotICAgIGluZGV4LT50cmFja19pZCA9IGF2aW9fcmIzMihmKTsKKyAgICB0cmFja19pZCA9IGF2aW9fcmIzMihmKTsKICAgICBmaWVsZGxlbmd0aCA9IGF2aW9fcmIzMihmKTsKLSAgICBpbmRleC0+aXRlbV9jb3VudCA9IGF2aW9fcmIzMihmKTsKLSAgICBpbmRleC0+aXRlbXMgPSBhdl9tYWxsb2N6X2FycmF5KAotICAgICAgICAgICAgaW5kZXgtPml0ZW1fY291bnQsIHNpemVvZihNT1ZGcmFnbWVudEluZGV4SXRlbSkpOwotICAgIGlmICghaW5kZXgtPml0ZW1zKSB7Ci0gICAgICAgIGluZGV4LT5pdGVtX2NvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IGluZGV4LT5pdGVtX2NvdW50OyBpKyspIHsKKyAgICBpdGVtX2NvdW50ID0gYXZpb19yYjMyKGYpOworICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtX2NvdW50OyBpKyspIHsKICAgICAgICAgaW50NjRfdCB0aW1lLCBvZmZzZXQ7CisgICAgICAgIGludCBpbmRleDsKKyAgICAgICAgTU9WRnJhZ21lbnRTdHJlYW1JbmZvICogZnJhZ19zdHJlYW1faW5mbzsKKworICAgICAgICBpZiAoYXZpb19mZW9mKGYpKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgIHRpbWUgICA9IGF2aW9fcmI2NChmKTsKICAgICAgICAgICAgIG9mZnNldCA9IGF2aW9fcmI2NChmKTsKQEAgLTQ2OTgsOCArNjcxNywxNiBAQAogICAgICAgICAgICAgdGltZSAgID0gYXZpb19yYjMyKGYpOwogICAgICAgICAgICAgb2Zmc2V0ID0gYXZpb19yYjMyKGYpOwogICAgICAgICB9Ci0gICAgICAgIGluZGV4LT5pdGVtc1tpXS50aW1lID0gdGltZTsKLSAgICAgICAgaW5kZXgtPml0ZW1zW2ldLm1vb2Zfb2Zmc2V0ID0gb2Zmc2V0OworCisgICAgICAgIC8vIFRoZSBmaXJzdCBzYW1wbGUgb2YgZWFjaCBzdHJlYW0gaW4gYSBmcmFnbWVudCBpcyBhbHdheXMgYSByYW5kb20KKyAgICAgICAgLy8gYWNjZXNzIHNhbXBsZS4gIFNvIGl0J3MgZW50cnkgaW4gdGhlIHRmcmEgY2FuIGJlIHVzZWQgYXMgdGhlCisgICAgICAgIC8vIGluaXRpYWwgUFRTIG9mIHRoZSBmcmFnbWVudC4KKyAgICAgICAgaW5kZXggPSB1cGRhdGVfZnJhZ19pbmRleChtb3YsIG9mZnNldCk7CisgICAgICAgIGZyYWdfc3RyZWFtX2luZm8gPSBnZXRfZnJhZ19zdHJlYW1faW5mbygmbW92LT5mcmFnX2luZGV4LCBpbmRleCwgdHJhY2tfaWQpOworICAgICAgICBpZiAoZnJhZ19zdHJlYW1faW5mbyAmJgorICAgICAgICAgICAgZnJhZ19zdHJlYW1faW5mby0+Zmlyc3RfdGZyYV9wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBmcmFnX3N0cmVhbV9pbmZvLT5maXJzdF90ZnJhX3B0cyA9IHRpbWU7CisKICAgICAgICAgZm9yIChqID0gMDsgaiA8ICgoZmllbGRsZW5ndGggPj4gNCkgJiAzKSArIDE7IGorKykKICAgICAgICAgICAgIGF2aW9fcjgoZik7CiAgICAgICAgIGZvciAoaiA9IDA7IGogPCAoKGZpZWxkbGVuZ3RoID4+IDIpICYgMykgKyAxOyBqKyspCkBAIC00Nzc0LDIxICs2ODAxLDIxIEBACiAgICAgbW92LT5mYyA9IHM7CiAgICAgbW92LT50cmFrX2luZGV4ID0gLTE7CiAgICAgLyogLm1vdiBhbmQgLm1wNCBhcmVuJ3Qgc3RyZWFtYWJsZSBhbnl3YXkgKG9ubHkgcHJvZ3Jlc3NpdmUgZG93bmxvYWQgaWYgbW9vdiBpcyBiZWZvcmUgbWRhdCkgKi8KLSAgICBpZiAocGItPnNlZWthYmxlKQorICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkKICAgICAgICAgYXRvbS5zaXplID0gYXZpb19zaXplKHBiKTsKICAgICBlbHNlCiAgICAgICAgIGF0b20uc2l6ZSA9IElOVDY0X01BWDsKIAogICAgIC8qIGNoZWNrIE1PViBoZWFkZXIgKi8KICAgICBkbyB7Ci0gICAgaWYgKG1vdi0+bW9vdl9yZXRyeSkKLSAgICAgICAgYXZpb19zZWVrKHBiLCAwLCBTRUVLX1NFVCk7Ci0gICAgaWYgKChlcnIgPSBtb3ZfcmVhZF9kZWZhdWx0KG1vdiwgcGIsIGF0b20pKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImVycm9yIHJlYWRpbmcgaGVhZGVyXG4iKTsKLSAgICAgICAgbW92X3JlYWRfY2xvc2Uocyk7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIH0gd2hpbGUgKHBiLT5zZWVrYWJsZSAmJiAhbW92LT5mb3VuZF9tb292ICYmICFtb3YtPm1vb3ZfcmV0cnkrKyk7CisgICAgICAgIGlmIChtb3YtPm1vb3ZfcmV0cnkpCisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIDAsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKChlcnIgPSBtb3ZfcmVhZF9kZWZhdWx0KG1vdiwgcGIsIGF0b20pKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJlcnJvciByZWFkaW5nIGhlYWRlclxuIik7CisgICAgICAgICAgICBtb3ZfcmVhZF9jbG9zZShzKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmICFtb3YtPmZvdW5kX21vb3YgJiYgIW1vdi0+bW9vdl9yZXRyeSsrKTsKICAgICBpZiAoIW1vdi0+Zm91bmRfbW9vdikgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibW9vdiBhdG9tIG5vdCBmb3VuZFxuIik7CiAgICAgICAgIG1vdl9yZWFkX2Nsb3NlKHMpOwpAQCAtNDc5NiwxMiArNjgyMywxNSBAQAogICAgIH0KICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX1RSQUNFLCAib25fcGFyc2VfZXhpdF9vZmZzZXQ9JSJQUklkNjQiXG4iLCBhdmlvX3RlbGwocGIpKTsKIAotICAgIGlmIChwYi0+c2Vla2FibGUpIHsKLSAgICAgICAgaWYgKG1vdi0+Y2hhcHRlcl90cmFjayA+IDAgJiYgIW1vdi0+aWdub3JlX2NoYXB0ZXJzKQorICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgeworICAgICAgICBpZiAobW92LT5uYl9jaGFwdGVyX3RyYWNrcyA+IDAgJiYgIW1vdi0+aWdub3JlX2NoYXB0ZXJzKQogICAgICAgICAgICAgbW92X3JlYWRfY2hhcHRlcnMocyk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCi0gICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJ0bWNkIikpCisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJ0bWNkIikpIHsKICAgICAgICAgICAgICAgICBtb3ZfcmVhZF90aW1lY29kZV90cmFjayhzLCBzLT5zdHJlYW1zW2ldKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJydG1kIikpIHsKKyAgICAgICAgICAgICAgICBtb3ZfcmVhZF9ydG1kX3RyYWNrKHMsIHMtPnN0cmVhbXNbaV0pOworICAgICAgICAgICAgfQogICAgIH0KIAogICAgIC8qIGNvcHkgdGltZWNvZGUgbWV0YWRhdGEgZnJvbSB0bWNkIHRyYWNrcyB0byB0aGUgcmVsYXRlZCB2aWRlbyBzdHJlYW1zICovCkBAIC00ODI5LDI1ICs2ODU5LDI1IEBACiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKICAgICAgICAgZml4X3RpbWVzY2FsZShtb3YsIHNjKTsKLSAgICAgICAgaWYoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJiBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICBpZihzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CiAgICAgICAgICAgICBzdC0+c2tpcF9zYW1wbGVzID0gc2MtPnN0YXJ0X3BhZDsKICAgICAgICAgfQotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBzYy0+bmJfZnJhbWVzX2Zvcl9mcHMgPiAwICYmIHNjLT5kdXJhdGlvbl9mb3JfZnBzID4gMCkKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc2MtPm5iX2ZyYW1lc19mb3JfZnBzID4gMCAmJiBzYy0+ZHVyYXRpb25fZm9yX2ZwcyA+IDApCiAgICAgICAgICAgICBhdl9yZWR1Y2UoJnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0sICZzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuLAogICAgICAgICAgICAgICAgICAgICAgIHNjLT50aW1lX3NjYWxlKihpbnQ2NF90KXNjLT5uYl9mcmFtZXNfZm9yX2Zwcywgc2MtPmR1cmF0aW9uX2Zvcl9mcHMsIElOVF9NQVgpOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+d2lkdGggPD0gMCB8fCBzdC0+Y29kZWMtPmhlaWdodCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgPSBzYy0+d2lkdGg7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBzYy0+aGVpZ2h0OworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+d2lkdGggPD0gMCB8fCBzdC0+Y29kZWNwYXItPmhlaWdodCA8PSAwKSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSBzYy0+d2lkdGg7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBzYy0+aGVpZ2h0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUpIHsKICAgICAgICAgICAgICAgICBpZiAoKGVyciA9IG1vdl9yZXdyaXRlX2R2ZF9zdWJfZXh0cmFkYXRhKHN0KSkgPCAwKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChtb3YtPmhhbmRicmFrZV92ZXJzaW9uICYmCiAgICAgICAgICAgICBtb3YtPmhhbmRicmFrZV92ZXJzaW9uIDw9IDEwMDAwMDAqMCArIDEwMDAqMTAgKyAyICYmICAvLyAwLjEwLjIKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMwogICAgICAgICApIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVkVSQk9TRSwgIkZvcmNpbmcgZnVsbCBwYXJzaW5nIGZvciBtcDMgc3RyZWFtXG4iKTsKICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwpAQCAtNDg1OCw4ICs2ODg4LDE1IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7Ci0gICAgICAgICAgICBpZiAoc3QtPmR1cmF0aW9uID4gMCkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc2MtPmRhdGFfc2l6ZSAqIDggKiBzYy0+dGltZV9zY2FsZSAvIHN0LT5kdXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChzdC0+ZHVyYXRpb24gPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNjLT5kYXRhX3NpemUgPiBJTlQ2NF9NQVggLyBzYy0+dGltZV9zY2FsZSAvIDgpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk92ZXJmbG93IGR1cmluZyBiaXQgcmF0ZSBjYWxjdWxhdGlvbiAlIlBSSWQ2NCIgKiA4ICogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy0+ZGF0YV9zaXplLCBzYy0+dGltZV9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIG1vdl9yZWFkX2Nsb3NlKHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IHNjLT5kYXRhX3NpemUgKiA4ICogc2MtPnRpbWVfc2NhbGUgLyBzdC0+ZHVyYXRpb247CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ4NjgsNyArNjkwNSwxMyBAQAogICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKICAgICAgICAgICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKICAgICAgICAgICAgIGlmIChzYy0+ZHVyYXRpb25fZm9yX2ZwcyA+IDApIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc2MtPmRhdGFfc2l6ZSAqIDggKiBzYy0+dGltZV9zY2FsZSAvCisgICAgICAgICAgICAgICAgaWYgKHNjLT5kYXRhX3NpemUgPiBJTlQ2NF9NQVggLyBzYy0+dGltZV9zY2FsZSAvIDgpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk92ZXJmbG93IGR1cmluZyBiaXQgcmF0ZSBjYWxjdWxhdGlvbiAlIlBSSWQ2NCIgKiA4ICogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzYy0+ZGF0YV9zaXplLCBzYy0+dGltZV9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIG1vdl9yZWFkX2Nsb3NlKHMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IHNjLT5kYXRhX3NpemUgKiA4ICogc2MtPnRpbWVfc2NhbGUgLwogICAgICAgICAgICAgICAgICAgICBzYy0+ZHVyYXRpb25fZm9yX2ZwczsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDg3Niw3ICs2OTE5LDcgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPmJpdHJhdGVzX2NvdW50ICYmIGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgaWYgKG1vdi0+Yml0cmF0ZXNbaV0pIHsKLSAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5iaXRfcmF0ZSA9IG1vdi0+Yml0cmF0ZXNbaV07CisgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBtb3YtPmJpdHJhdGVzW2ldOwogICAgICAgICB9CiAgICAgfQogCkBAIC00ODg2LDcgKzY5MjksNyBAQAogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CiAKLSAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpIHsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CiAgICAgICAgICAgICBlcnIgPSBmZl9yZXBsYXlnYWluX2V4cG9ydChzdCwgcy0+bWV0YWRhdGEpOwogICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKQEAgLTQ4OTYsMjcgKzY5MzksNTggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKICAgICAgICAgICAgIGlmIChzYy0+ZGlzcGxheV9tYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBBVlBhY2tldFNpZGVEYXRhICpzZCwgKnRtcDsKKyAgICAgICAgICAgICAgICBlcnIgPSBhdl9zdHJlYW1fYWRkX3NpZGVfZGF0YShzdCwgQVZfUEtUX0RBVEFfRElTUExBWU1BVFJJWCwgKHVpbnQ4X3QqKXNjLT5kaXNwbGF5X21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoaW50MzJfdCkgKiA5KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKIAotICAgICAgICAgICAgICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoc3QtPnNpZGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5uYl9zaWRlX2RhdGEgKyAxLCBzaXplb2YoKnRtcCkpOwotICAgICAgICAgICAgICAgIGlmICghdG1wKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgICAgICAgICAgICAgc3QtPnNpZGVfZGF0YSA9IHRtcDsKLSAgICAgICAgICAgICAgICBzdC0+bmJfc2lkZV9kYXRhKys7Ci0KLSAgICAgICAgICAgICAgICBzZCA9ICZzdC0+c2lkZV9kYXRhW3N0LT5uYl9zaWRlX2RhdGEgLSAxXTsKLSAgICAgICAgICAgICAgICBzZC0+dHlwZSA9IEFWX1BLVF9EQVRBX0RJU1BMQVlNQVRSSVg7Ci0gICAgICAgICAgICAgICAgc2QtPnNpemUgPSBzaXplb2YoaW50MzJfdCkgKiA5OwotICAgICAgICAgICAgICAgIHNkLT5kYXRhID0gKHVpbnQ4X3QqKXNjLT5kaXNwbGF5X21hdHJpeDsKICAgICAgICAgICAgICAgICBzYy0+ZGlzcGxheV9tYXRyaXggPSBOVUxMOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNjLT5zdGVyZW8zZCkgeworICAgICAgICAgICAgICAgIGVyciA9IGF2X3N0cmVhbV9hZGRfc2lkZV9kYXRhKHN0LCBBVl9QS1RfREFUQV9TVEVSRU8zRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKXNjLT5zdGVyZW8zZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnNjLT5zdGVyZW8zZCkpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgICAgICAgICAgc2MtPnN0ZXJlbzNkID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzYy0+c3BoZXJpY2FsKSB7CisgICAgICAgICAgICAgICAgZXJyID0gYXZfc3RyZWFtX2FkZF9zaWRlX2RhdGEoc3QsIEFWX1BLVF9EQVRBX1NQSEVSSUNBTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKXNjLT5zcGhlcmljYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPnNwaGVyaWNhbF9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKworICAgICAgICAgICAgICAgIHNjLT5zcGhlcmljYWwgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNjLT5tYXN0ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhdl9zdHJlYW1fYWRkX3NpZGVfZGF0YShzdCwgQVZfUEtUX0RBVEFfTUFTVEVSSU5HX0RJU1BMQVlfTUVUQURBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QgKilzYy0+bWFzdGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqc2MtPm1hc3RlcmluZykpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgICAgICAgICAgc2MtPm1hc3RlcmluZyA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2MtPmNvbGwpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhdl9zdHJlYW1fYWRkX3NpZGVfZGF0YShzdCwgQVZfUEtUX0RBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCAqKXNjLT5jb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5jb2xsX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworCisgICAgICAgICAgICAgICAgc2MtPmNvbGwgPSBOVUxMOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgZmZfY29uZmlndXJlX2J1ZmZlcnNfZm9yX2luZGV4KHMsIEFWX1RJTUVfQkFTRSk7CiAKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5mcmFnX2luZGV4Lm5iX2l0ZW1zOyBpKyspCisgICAgICAgIGlmIChtb3YtPmZyYWdfaW5kZXguaXRlbVtpXS5tb29mX29mZnNldCA8PSBtb3YtPmZyYWdtZW50Lm1vb2Zfb2Zmc2V0KQorICAgICAgICAgICAgbW92LT5mcmFnX2luZGV4Lml0ZW1baV0uaGVhZGVyc19yZWFkID0gMTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC00OTMyLDggKzcwMDYsOCBAQAogICAgICAgICAgICAgQVZJbmRleEVudHJ5ICpjdXJyZW50X3NhbXBsZSA9ICZhdnN0LT5pbmRleF9lbnRyaWVzW21zYy0+Y3VycmVudF9zYW1wbGVdOwogICAgICAgICAgICAgaW50NjRfdCBkdHMgPSBhdl9yZXNjYWxlKGN1cnJlbnRfc2FtcGxlLT50aW1lc3RhbXAsIEFWX1RJTUVfQkFTRSwgbXNjLT50aW1lX3NjYWxlKTsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJzdHJlYW0gJWQsIHNhbXBsZSAlZCwgZHRzICUiUFJJZDY0IlxuIiwgaSwgbXNjLT5jdXJyZW50X3NhbXBsZSwgZHRzKTsKLSAgICAgICAgICAgIGlmICghc2FtcGxlIHx8ICghcy0+cGItPnNlZWthYmxlICYmIGN1cnJlbnRfc2FtcGxlLT5wb3MgPCBzYW1wbGUtPnBvcykgfHwKLSAgICAgICAgICAgICAgICAocy0+cGItPnNlZWthYmxlICYmCisgICAgICAgICAgICBpZiAoIXNhbXBsZSB8fCAoIShzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgJiYgY3VycmVudF9zYW1wbGUtPnBvcyA8IHNhbXBsZS0+cG9zKSB8fAorICAgICAgICAgICAgICAgICgocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmCiAgICAgICAgICAgICAgICAgICgobXNjLT5wYiAhPSBzLT5wYiAmJiBkdHMgPCBiZXN0X2R0cykgfHwgKG1zYy0+cGIgPT0gcy0+cGIgJiYKICAgICAgICAgICAgICAgICAgKChGRkFCUyhiZXN0X2R0cyAtIGR0cykgPD0gQVZfVElNRV9CQVNFICYmIGN1cnJlbnRfc2FtcGxlLT5wb3MgPCBzYW1wbGUtPnBvcykgfHwKICAgICAgICAgICAgICAgICAgIChGRkFCUyhiZXN0X2R0cyAtIGR0cykgPiBBVl9USU1FX0JBU0UgJiYgZHRzIDwgYmVzdF9kdHMpKSkpKSkgewpAQCAtNDk1Myw1OCArNzAyNyw3MSBAQAogICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IG1vdl9zd2l0Y2hfcm9vdChBVkZvcm1hdENvbnRleHQgKnMsIGludDY0X3QgdGFyZ2V0KQorc3RhdGljIGludCBtb3Zfc3dpdGNoX3Jvb3QoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IHRhcmdldCwgaW50IGluZGV4KQogeworICAgIGludCByZXQ7CiAgICAgTU9WQ29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOwotICAgIGludCBpLCBqOwotICAgIGludCBhbHJlYWR5X3JlYWQgPSAwOwogCisgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBtb3YtPmZyYWdfaW5kZXgubmJfaXRlbXMpCisgICAgICAgIHRhcmdldCA9IG1vdi0+ZnJhZ19pbmRleC5pdGVtW2luZGV4XS5tb29mX29mZnNldDsKICAgICBpZiAoYXZpb19zZWVrKHMtPnBiLCB0YXJnZXQsIFNFRUtfU0VUKSAhPSB0YXJnZXQpIHsKICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19FUlJPUiwgInJvb3QgYXRvbSBvZmZzZXQgMHglIlBSSXg2NCI6IHBhcnRpYWwgZmlsZVxuIiwgdGFyZ2V0KTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgbW92LT5uZXh0X3Jvb3RfYXRvbSA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5mcmFnbWVudF9pbmRleF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIE1PVkZyYWdtZW50SW5kZXggKmluZGV4ID0gbW92LT5mcmFnbWVudF9pbmRleF9kYXRhW2ldOwotICAgICAgICBpbnQgZm91bmQgPSAwOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5kZXgtPml0ZW1fY291bnQ7IGorKykgewotICAgICAgICAgICAgTU9WRnJhZ21lbnRJbmRleEl0ZW0gKml0ZW0gPSAmaW5kZXgtPml0ZW1zW2pdOwotICAgICAgICAgICAgaWYgKGZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgbW92LT5uZXh0X3Jvb3RfYXRvbSA9IGl0ZW0tPm1vb2Zfb2Zmc2V0OwotICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBBZHZhbmNlIHRvIG5leHQgaW5kZXggaW4gb3V0ZXIgbG9vcAotICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLT5tb29mX29mZnNldCA9PSB0YXJnZXQpIHsKLSAgICAgICAgICAgICAgICBpbmRleC0+Y3VycmVudF9pdGVtID0gRkZNSU4oaiwgaW5kZXgtPmN1cnJlbnRfaXRlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0tPmhlYWRlcnNfcmVhZCkKLSAgICAgICAgICAgICAgICAgICAgYWxyZWFkeV9yZWFkID0gMTsKLSAgICAgICAgICAgICAgICBpdGVtLT5oZWFkZXJzX3JlYWQgPSAxOwotICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWZvdW5kKQotICAgICAgICAgICAgaW5kZXgtPmN1cnJlbnRfaXRlbSA9IDA7CisgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBtb3YtPmZyYWdfaW5kZXgubmJfaXRlbXMpCisgICAgICAgIGluZGV4ID0gc2VhcmNoX2ZyYWdfbW9vZl9vZmZzZXQoJm1vdi0+ZnJhZ19pbmRleCwgdGFyZ2V0KTsKKyAgICBpZiAoaW5kZXggPCBtb3YtPmZyYWdfaW5kZXgubmJfaXRlbXMpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgMSA8IG1vdi0+ZnJhZ19pbmRleC5uYl9pdGVtcykKKyAgICAgICAgICAgIG1vdi0+bmV4dF9yb290X2F0b20gPSBtb3YtPmZyYWdfaW5kZXguaXRlbVtpbmRleCArIDFdLm1vb2Zfb2Zmc2V0OworICAgICAgICBpZiAobW92LT5mcmFnX2luZGV4Lml0ZW1baW5kZXhdLmhlYWRlcnNfcmVhZCkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBtb3YtPmZyYWdfaW5kZXguaXRlbVtpbmRleF0uaGVhZGVyc19yZWFkID0gMTsKICAgICB9CiAKLSAgICBpZiAoYWxyZWFkeV9yZWFkKQotICAgICAgICByZXR1cm4gMDsKLQogICAgIG1vdi0+Zm91bmRfbWRhdCA9IDA7CiAKLSAgICBpZiAobW92X3JlYWRfZGVmYXVsdChtb3YsIHMtPnBiLCAoTU9WQXRvbSl7IEFWX1JMMzIoInJvb3QiKSwgSU5UNjRfTUFYIH0pIDwgMCB8fAotICAgICAgICBhdmlvX2Zlb2Yocy0+cGIpKQorICAgIHJldCA9IG1vdl9yZWFkX2RlZmF1bHQobW92LCBzLT5wYiwgKE1PVkF0b20peyBBVl9STDMyKCJyb290IiksIElOVDY0X01BWCB9KTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoYXZpb19mZW9mKHMtPnBiKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJyZWFkIGZyYWdtZW50cywgb2Zmc2V0IDB4JSJQUkl4NjQiXG4iLCBhdmlvX3RlbGwocy0+cGIpKTsKIAogICAgIHJldHVybiAxOwogfQogCitzdGF0aWMgaW50IG1vdl9jaGFuZ2VfZXh0cmFkYXRhKE1PVlN0cmVhbUNvbnRleHQgKnNjLCBBVlBhY2tldCAqcGt0KQoreworICAgIHVpbnQ4X3QgKnNpZGUsICpleHRyYWRhdGE7CisgICAgaW50IGV4dHJhZGF0YV9zaXplOworCisgICAgLyogU2F2ZSB0aGUgY3VycmVudCBpbmRleC4gKi8KKyAgICBzYy0+bGFzdF9zdHNkX2luZGV4ID0gc2MtPnN0c2NfZGF0YVtzYy0+c3RzY19pbmRleF0uaWQgLSAxOworCisgICAgLyogTm90aWZ5IHRoZSBkZWNvZGVyIHRoYXQgZXh0cmFkYXRhIGNoYW5nZWQuICovCisgICAgZXh0cmFkYXRhX3NpemUgPSBzYy0+ZXh0cmFkYXRhX3NpemVbc2MtPmxhc3Rfc3RzZF9pbmRleF07CisgICAgZXh0cmFkYXRhID0gc2MtPmV4dHJhZGF0YVtzYy0+bGFzdF9zdHNkX2luZGV4XTsKKyAgICBpZiAoZXh0cmFkYXRhX3NpemUgPiAwICYmIGV4dHJhZGF0YSkgeworICAgICAgICBzaWRlID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgaWYgKCFzaWRlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHNpZGUsIGV4dHJhZGF0YSwgZXh0cmFkYXRhX3NpemUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IG1vdl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgTU9WQ29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOwogICAgIE1PVlN0cmVhbUNvbnRleHQgKnNjOwogICAgIEFWSW5kZXhFbnRyeSAqc2FtcGxlOwogICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CisgICAgaW50NjRfdCBjdXJyZW50X2luZGV4OwogICAgIGludCByZXQ7CiAgICAgbW92LT5mYyA9IHM7CiAgcmV0cnk6CkBAIC01MDEyLDEzICs3MDk5LDE0IEBACiAgICAgaWYgKCFzYW1wbGUgfHwgKG1vdi0+bmV4dF9yb290X2F0b20gJiYgc2FtcGxlLT5wb3MgPiBtb3YtPm5leHRfcm9vdF9hdG9tKSkgewogICAgICAgICBpZiAoIW1vdi0+bmV4dF9yb290X2F0b20pCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Ci0gICAgICAgIGlmICgocmV0ID0gbW92X3N3aXRjaF9yb290KHMsIG1vdi0+bmV4dF9yb290X2F0b20pKSA8IDApCisgICAgICAgIGlmICgocmV0ID0gbW92X3N3aXRjaF9yb290KHMsIG1vdi0+bmV4dF9yb290X2F0b20sIC0xKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgZ290byByZXRyeTsKICAgICB9CiAgICAgc2MgPSBzdC0+cHJpdl9kYXRhOwogICAgIC8qIG11c3QgYmUgZG9uZSBqdXN0IGJlZm9yZSByZWFkaW5nLCB0byBhdm9pZCBpbmZpbml0ZSBsb29wIG9uIHNhbXBsZSAqLwotICAgIHNjLT5jdXJyZW50X3NhbXBsZSsrOworICAgIGN1cnJlbnRfaW5kZXggPSBzYy0+Y3VycmVudF9pbmRleDsKKyAgICBtb3ZfY3VycmVudF9zYW1wbGVfaW5jKHNjKTsKIAogICAgIGlmIChtb3YtPm5leHRfcm9vdF9hdG9tKSB7CiAgICAgICAgIHNhbXBsZS0+cG9zID0gRkZNSU4oc2FtcGxlLT5wb3MsIG1vdi0+bmV4dF9yb290X2F0b20pOwpAQCAtNTAzMCwxMiArNzExOCwyMiBAQAogICAgICAgICBpZiAocmV0NjQgIT0gc2FtcGxlLT5wb3MpIHsKICAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfRVJST1IsICJzdHJlYW0gJWQsIG9mZnNldCAweCUiUFJJeDY0IjogcGFydGlhbCBmaWxlXG4iLAogICAgICAgICAgICAgICAgICAgIHNjLT5mZmluZGV4LCBzYW1wbGUtPnBvcyk7Ci0gICAgICAgICAgICBzYy0+Y3VycmVudF9zYW1wbGUgLT0gc2hvdWxkX3JldHJ5KHNjLT5wYiwgcmV0NjQpOworICAgICAgICAgICAgaWYgKHNob3VsZF9yZXRyeShzYy0+cGIsIHJldDY0KSkgeworICAgICAgICAgICAgICAgIG1vdl9jdXJyZW50X3NhbXBsZV9kZWMoc2MpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KKworICAgICAgICBpZiggc3QtPmRpc2NhcmQgPT0gQVZESVNDQVJEX05PTktFWSAmJiAwPT0oc2FtcGxlLT5mbGFncyAmIEFWSU5ERVhfS0VZRlJBTUUpICkgeworICAgICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19ERUJVRywgIk5vbmtleSBmcmFtZSBmcm9tIHN0cmVhbSAlZCBkaXNjYXJkZWQgZHVlIHRvIEFWRElTQ0FSRF9OT05LRVlcbiIsIHNjLT5mZmluZGV4KTsKKyAgICAgICAgICAgIGdvdG8gcmV0cnk7CisgICAgICAgIH0KKwogICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHNjLT5wYiwgcGt0LCBzYW1wbGUtPnNpemUpOwogICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgc2MtPmN1cnJlbnRfc2FtcGxlIC09IHNob3VsZF9yZXRyeShzYy0+cGIsIHJldCk7CisgICAgICAgICAgICBpZiAoc2hvdWxkX3JldHJ5KHNjLT5wYiwgcmV0KSkgeworICAgICAgICAgICAgICAgIG1vdl9jdXJyZW50X3NhbXBsZV9kZWMoc2MpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAoc2MtPmhhc19wYWxldHRlKSB7CkBAIC01MDU5LDEwICs3MTU3LDE3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogI2VuZGlmCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMyAmJiAhc3QtPm5lZWRfcGFyc2luZyAmJiBwa3QtPnNpemUgPiA0KSB7CisgICAgICAgICAgICBpZiAoZmZfbXBhX2NoZWNrX2hlYWRlcihBVl9SQjMyKHBrdC0+ZGF0YSkpIDwgMCkKKyAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc2MtPmZmaW5kZXg7CiAgICAgcGt0LT5kdHMgPSBzYW1wbGUtPnRpbWVzdGFtcDsKKyAgICBpZiAoc2FtcGxlLT5mbGFncyAmIEFWSU5ERVhfRElTQ0FSRF9GUkFNRSkgeworICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0RJU0NBUkQ7CisgICAgfQogICAgIGlmIChzYy0+Y3R0c19kYXRhICYmIHNjLT5jdHRzX2luZGV4IDwgc2MtPmN0dHNfY291bnQpIHsKICAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0cyArIHNjLT5kdHNfc2hpZnQgKyBzYy0+Y3R0c19kYXRhW3NjLT5jdHRzX2luZGV4XS5kdXJhdGlvbjsKICAgICAgICAgLyogdXBkYXRlIGN0dHMgY29udGV4dCAqLwpAQCAtNTA3MiwxMiArNzE3NywxMiBAQAogICAgICAgICAgICAgc2MtPmN0dHNfaW5kZXgrKzsKICAgICAgICAgICAgIHNjLT5jdHRzX3NhbXBsZSA9IDA7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHNjLT53cm9uZ19kdHMpCi0gICAgICAgICAgICBwa3QtPmR0cyA9IEFWX05PUFRTX1ZBTFVFOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludDY0X3QgbmV4dF9kdHMgPSAoc2MtPmN1cnJlbnRfc2FtcGxlIDwgc3QtPm5iX2luZGV4X2VudHJpZXMpID8KICAgICAgICAgICAgIHN0LT5pbmRleF9lbnRyaWVzW3NjLT5jdXJyZW50X3NhbXBsZV0udGltZXN0YW1wIDogc3QtPmR1cmF0aW9uOwotICAgICAgICBwa3QtPmR1cmF0aW9uID0gbmV4dF9kdHMgLSBwa3QtPmR0czsKKworICAgICAgICBpZiAobmV4dF9kdHMgPj0gcGt0LT5kdHMpCisgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gbmV4dF9kdHMgLSBwa3QtPmR0czsKICAgICAgICAgcGt0LT5wdHMgPSBwa3QtPmR0czsKICAgICB9CiAgICAgaWYgKHN0LT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwpCkBAIC01MDg1LDExICs3MTkwLDMwIEBACiAgICAgcGt0LT5mbGFncyB8PSBzYW1wbGUtPmZsYWdzICYgQVZJTkRFWF9LRVlGUkFNRSA/IEFWX1BLVF9GTEFHX0tFWSA6IDA7CiAgICAgcGt0LT5wb3MgPSBzYW1wbGUtPnBvczsKIAorICAgIC8qIE11bHRpcGxlIHN0c2QgaGFuZGxpbmcuICovCisgICAgaWYgKHNjLT5zdHNjX2RhdGEpIHsKKyAgICAgICAgLyogS2VlcCB0cmFjayBvZiB0aGUgc3RzYyBpbmRleCBmb3IgdGhlIGdpdmVuIHNhbXBsZSwgdGhlbiBjaGVjaworICAgICAgICAqIGlmIHRoZSBzdHNkIGluZGV4IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IHVzZWQgb25lLiAqLworICAgICAgICBzYy0+c3RzY19zYW1wbGUrKzsKKyAgICAgICAgaWYgKG1vdl9zdHNjX2luZGV4X3ZhbGlkKHNjLT5zdHNjX2luZGV4LCBzYy0+c3RzY19jb3VudCkgJiYKKyAgICAgICAgICAgIG1vdl9nZXRfc3RzY19zYW1wbGVzKHNjLCBzYy0+c3RzY19pbmRleCkgPT0gc2MtPnN0c2Nfc2FtcGxlKSB7CisgICAgICAgICAgICBzYy0+c3RzY19pbmRleCsrOworICAgICAgICAgICAgc2MtPnN0c2Nfc2FtcGxlID0gMDsKKyAgICAgICAgLyogRG8gbm90IGNoZWNrIGluZGV4ZXMgYWZ0ZXIgYSBzd2l0Y2guICovCisgICAgICAgIH0gZWxzZSBpZiAoc2MtPnN0c2NfZGF0YVtzYy0+c3RzY19pbmRleF0uaWQgPiAwICYmCisgICAgICAgICAgICAgICAgICAgc2MtPnN0c2NfZGF0YVtzYy0+c3RzY19pbmRleF0uaWQgLSAxIDwgc2MtPnN0c2RfY291bnQgJiYKKyAgICAgICAgICAgICAgICAgICBzYy0+c3RzY19kYXRhW3NjLT5zdHNjX2luZGV4XS5pZCAtIDEgIT0gc2MtPmxhc3Rfc3RzZF9pbmRleCkgeworICAgICAgICAgICAgcmV0ID0gbW92X2NoYW5nZV9leHRyYWRhdGEoc2MsIHBrdCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKG1vdi0+YWF4X21vZGUpCiAgICAgICAgIGFheF9maWx0ZXIocGt0LT5kYXRhLCBwa3QtPnNpemUsIG1vdik7CiAKICAgICBpZiAoc2MtPmNlbmMuYWVzX2N0cikgewotICAgICAgICByZXQgPSBjZW5jX2ZpbHRlcihtb3YsIHNjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgIHJldCA9IGNlbmNfZmlsdGVyKG1vdiwgc2MsIGN1cnJlbnRfaW5kZXgsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKICAgICAgICAgaWYgKHJldCkgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQpAQCAtNTEwMSwyNCArNzIyNSwxOCBAQAogc3RhdGljIGludCBtb3Zfc2Vla19mcmFnbWVudChBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgaW50NjRfdCB0aW1lc3RhbXApCiB7CiAgICAgTU9WQ29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOwotICAgIGludCBpLCBqOworICAgIGludCBpbmRleDsKIAotICAgIGlmICghbW92LT5mcmFnbWVudF9pbmRleF9jb21wbGV0ZSkKKyAgICBpZiAoIW1vdi0+ZnJhZ19pbmRleC5jb21wbGV0ZSkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5mcmFnbWVudF9pbmRleF9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChtb3YtPmZyYWdtZW50X2luZGV4X2RhdGFbaV0tPnRyYWNrX2lkID09IHN0LT5pZCkgewotICAgICAgICAgICAgTU9WRnJhZ21lbnRJbmRleCAqaW5kZXggPSBtb3YtPmZyYWdtZW50X2luZGV4X2RhdGFbaV07Ci0gICAgICAgICAgICBmb3IgKGogPSBpbmRleC0+aXRlbV9jb3VudCAtIDE7IGogPj0gMDsgai0tKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4LT5pdGVtc1tqXS50aW1lIDw9IHRpbWVzdGFtcCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgtPml0ZW1zW2pdLmhlYWRlcnNfcmVhZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb3Zfc3dpdGNoX3Jvb3QocywgaW5kZXgtPml0ZW1zW2pdLm1vb2Zfb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgaW5kZXggPSBzZWFyY2hfZnJhZ190aW1lc3RhbXAoJm1vdi0+ZnJhZ19pbmRleCwgc3QsIHRpbWVzdGFtcCk7CisgICAgaWYgKGluZGV4IDwgMCkKKyAgICAgICAgaW5kZXggPSAwOworICAgIGlmICghbW92LT5mcmFnX2luZGV4Lml0ZW1baW5kZXhdLmhlYWRlcnNfcmVhZCkKKyAgICAgICAgcmV0dXJuIG1vdl9zd2l0Y2hfcm9vdChzLCAtMSwgaW5kZXgpOworICAgIGlmIChpbmRleCArIDEgPCBtb3YtPmZyYWdfaW5kZXgubmJfaXRlbXMpCisgICAgICAgIG1vdi0+bmV4dF9yb290X2F0b20gPSBtb3YtPmZyYWdfaW5kZXguaXRlbVtpbmRleCArIDFdLm1vb2Zfb2Zmc2V0OwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC01MTI2LDEwICs3MjQ0LDE0IEBACiBzdGF0aWMgaW50IG1vdl9zZWVrX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKIHsKICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7Ci0gICAgaW50IHNhbXBsZSwgdGltZV9zYW1wbGU7Ci0gICAgaW50IGk7CisgICAgaW50IHNhbXBsZSwgdGltZV9zYW1wbGUsIHJldDsKKyAgICB1bnNpZ25lZCBpbnQgaTsKIAotICAgIGludCByZXQgPSBtb3Zfc2Vla19mcmFnbWVudChzLCBzdCwgdGltZXN0YW1wKTsKKyAgICAvLyBIZXJlIHdlIGNvbnNpZGVyIHRpbWVzdGFtcCB0byBiZSBQVFMsIGhlbmNlIHRyeSB0byBvZmZzZXQgaXQgc28gdGhhdCB3ZQorICAgIC8vIGNhbiBzZWFyY2ggb3ZlciB0aGUgRFRTIHRpbWVsaW5lLgorICAgIHRpbWVzdGFtcCAtPSAoc2MtPm1pbl9jb3JyZWN0ZWRfcHRzICsgc2MtPmR0c19zaGlmdCk7CisKKyAgICByZXQgPSBtb3Zfc2Vla19mcmFnbWVudChzLCBzdCwgdGltZXN0YW1wKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtNTEzOSw3ICs3MjYxLDcgQEAKICAgICAgICAgc2FtcGxlID0gMDsKICAgICBpZiAoc2FtcGxlIDwgMCkgLyogbm90IHN1cmUgd2hhdCB0byBkbyAqLwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBzYy0+Y3VycmVudF9zYW1wbGUgPSBzYW1wbGU7CisgICAgbW92X2N1cnJlbnRfc2FtcGxlX3NldChzYywgc2FtcGxlKTsKICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAic3RyZWFtICVkLCBmb3VuZCBzYW1wbGUgJWRcbiIsIHN0LT5pbmRleCwgc2MtPmN1cnJlbnRfc2FtcGxlKTsKICAgICAvKiBhZGp1c3QgY3R0cyBpbmRleCAqLwogICAgIGlmIChzYy0+Y3R0c19kYXRhKSB7CkBAIC01MTU0LDYgKzcyNzYsMjAgQEAKICAgICAgICAgICAgIHRpbWVfc2FtcGxlID0gbmV4dDsKICAgICAgICAgfQogICAgIH0KKworICAgIC8qIGFkanVzdCBzdHNkIGluZGV4ICovCisgICAgdGltZV9zYW1wbGUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBzYy0+c3RzY19jb3VudDsgaSsrKSB7CisgICAgICAgIGludDY0X3QgbmV4dCA9IHRpbWVfc2FtcGxlICsgbW92X2dldF9zdHNjX3NhbXBsZXMoc2MsIGkpOworICAgICAgICBpZiAobmV4dCA+IHNjLT5jdXJyZW50X3NhbXBsZSkgeworICAgICAgICAgICAgc2MtPnN0c2NfaW5kZXggPSBpOworICAgICAgICAgICAgc2MtPnN0c2Nfc2FtcGxlID0gc2MtPmN1cnJlbnRfc2FtcGxlIC0gdGltZV9zYW1wbGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBhdl9hc3NlcnQwKG5leHQgPT0gKGludCluZXh0KTsKKyAgICAgICAgdGltZV9zYW1wbGUgPSBuZXh0OworICAgIH0KKwogICAgIHJldHVybiBzYW1wbGU7CiB9CiAKQEAgLTUxOTMsNyArNzMyOSw3IEBACiAgICAgICAgICAgICBNT1ZTdHJlYW1Db250ZXh0ICpzYzsKICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKICAgICAgICAgICAgIHNjID0gc3QtPnByaXZfZGF0YTsKLSAgICAgICAgICAgIHNjLT5jdXJyZW50X3NhbXBsZSA9IDA7CisgICAgICAgICAgICBtb3ZfY3VycmVudF9zYW1wbGVfc2V0KHNjLCAwKTsKICAgICAgICAgfQogICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgTU9WU3RyZWFtQ29udGV4dCAqc2M7CkBAIC01MjAzLDcgKzczMzksNyBAQAogICAgICAgICAgICAgc2MgPSBzdC0+cHJpdl9kYXRhOwogICAgICAgICAgICAgaWYgKHNjLT5mZmluZGV4ID09IHN0cmVhbV9pbmRleCAmJiBzYy0+Y3VycmVudF9zYW1wbGUgPT0gc2FtcGxlKQogICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgc2MtPmN1cnJlbnRfc2FtcGxlKys7CisgICAgICAgICAgICBtb3ZfY3VycmVudF9zYW1wbGVfaW5jKHNjKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTUyMjAsNyArNzM1NiwxMSBAQAogICAgICAgICAiU2VlayBlYWNoIHN0cmVhbSBpbmRpdmlkdWFsbHkgdG8gdGhlIHRvIHRoZSBjbG9zZXN0IHBvaW50IiwKICAgICAgICAgT0ZGU0VUKHNlZWtfaW5kaXZpZHVhbGx5KSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMSB9LAogICAgICAgICAwLCAxLCBGTEFHU30sCi0gICAgeyJpZ25vcmVfZWRpdGxpc3QiLCAiIiwgT0ZGU0VUKGlnbm9yZV9lZGl0bGlzdCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sCisgICAgeyJpZ25vcmVfZWRpdGxpc3QiLCAiSWdub3JlIHRoZSBlZGl0IGxpc3QgYXRvbS4iLCBPRkZTRVQoaWdub3JlX2VkaXRsaXN0KSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwKKyAgICAgICAgMCwgMSwgRkxBR1N9LAorICAgIHsiYWR2YW5jZWRfZWRpdGxpc3QiLAorICAgICAgICAiTW9kaWZ5IHRoZSBBVkluZGV4IGFjY29yZGluZyB0byB0aGUgZWRpdGxpc3RzLiBVc2UgdGhpcyBvcHRpb24gdG8gZGVjb2RlIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIGVkaXRzLiIsCisgICAgICAgIE9GRlNFVChhZHZhbmNlZF9lZGl0bGlzdCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMX0sCiAgICAgICAgIDAsIDEsIEZMQUdTfSwKICAgICB7Imlnbm9yZV9jaGFwdGVycyIsICIiLCBPRkZTRVQoaWdub3JlX2NoYXB0ZXJzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwKICAgICAgICAgMCwgMSwgRkxBR1N9LApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbW92X2NoYW4uYyBiL2xpYmF2Zm9ybWF0L21vdl9jaGFuLmMKaW5kZXggY2JhMDdjNS4uMzI0ZGQ1ZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbW92X2NoYW4uYworKysgYi9saWJhdmZvcm1hdC9tb3ZfY2hhbi5jCkBAIC01NTcsOCArNTU3LDkgQEAKICAgICBiaXRtYXAgICAgID0gYXZpb19yYjMyKHBiKTsKICAgICBudW1fZGVzY3IgID0gYXZpb19yYjMyKHBiKTsKIAotICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJjaGFuOiBsYXlvdXQ9JXUgYml0bWFwPSV1IG51bV9kZXNjcj0ldVxuIiwKLSAgICAgICAgICAgIGxheW91dF90YWcsIGJpdG1hcCwgbnVtX2Rlc2NyKTsKKyAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiY2hhbjogbGF5b3V0PSUiUFJJdTMyIiAiCisgICAgICAgICAgICJiaXRtYXA9JSJQUkl1MzIiIG51bV9kZXNjcj0lIlBSSXUzMiJcbiIsCisgICAgICAgICAgIGxheW91dF90YWcsIGJpdG1hcCwgbnVtX2Rlc2NyKTsKIAogICAgIGlmIChzaXplIDwgMTJVTEwgKyBudW1fZGVzY3IgKiAyMFVMTCkKICAgICAgICAgcmV0dXJuIDA7CkBAIC01ODgsOSArNTg5LDkgQEAKICAgICB9CiAgICAgaWYgKGxheW91dF90YWcgPT0gMCkgewogICAgICAgICBpZiAobGFiZWxfbWFzaykKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBsYWJlbF9tYXNrOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IGxhYmVsX21hc2s7CiAgICAgfSBlbHNlCi0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBmZl9tb3ZfZ2V0X2NoYW5uZWxfbGF5b3V0KGxheW91dF90YWcsIGJpdG1hcCk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBmZl9tb3ZfZ2V0X2NoYW5uZWxfbGF5b3V0KGxheW91dF90YWcsIGJpdG1hcCk7CiAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gMTIpOwogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tb3ZfZXNkcy5jIGIvbGliYXZmb3JtYXQvbW92X2VzZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDQ0ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvbW92X2VzZHMuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW8uaCIKKyNpbmNsdWRlICJpc29tLmgiCisKK2ludCBmZl9tb3ZfcmVhZF9lc2RzKEFWRm9ybWF0Q29udGV4dCAqZmMsIEFWSU9Db250ZXh0ICpwYikKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IHRhZywgcmV0ID0gMDsKKworICAgIGlmIChmYy0+bmJfc3RyZWFtcyA8IDEpCisgICAgICAgIHJldHVybiAwOworICAgIHN0ID0gZmMtPnN0cmVhbXNbZmMtPm5iX3N0cmVhbXMtMV07CisKKyAgICBhdmlvX3JiMzIocGIpOyAvKiB2ZXJzaW9uICsgZmxhZ3MgKi8KKyAgICBmZl9tcDRfcmVhZF9kZXNjcihmYywgcGIsICZ0YWcpOworICAgIGlmICh0YWcgPT0gTVA0RVNEZXNjclRhZykgeworICAgICAgICBmZl9tcDRfcGFyc2VfZXNfZGVzY3IocGIsIE5VTEwpOworICAgIH0gZWxzZQorICAgICAgICBhdmlvX3JiMTYocGIpOyAvKiBJRCAqLworCisgICAgZmZfbXA0X3JlYWRfZGVzY3IoZmMsIHBiLCAmdGFnKTsKKyAgICBpZiAodGFnID09IE1QNERlY0NvbmZpZ0Rlc2NyVGFnKQorICAgICAgICByZXQgPSBmZl9tcDRfcmVhZF9kZWNfY29uZmlnX2Rlc2NyKGZjLCBzdCwgcGIpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21vdmVuYy10ZXN0LmMgYi9saWJhdmZvcm1hdC9tb3ZlbmMtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzY5Yzc2Li4wMDAwMDAwCi0tLSBhL2xpYmF2Zm9ybWF0L21vdmVuYy10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxNSBNYXJ0aW4gU3RvcnNqbwotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21kNS5oIgotCi0jaW5jbHVkZSAiYXZmb3JtYXQuaCIKLQotI2lmIEhBVkVfVU5JU1REX0gKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWYgIUhBVkVfR0VUT1BUCi0jaW5jbHVkZSAiY29tcGF0L2dldG9wdC5jIgotI2VuZGlmCi0KLSNkZWZpbmUgSEFTSF9TSVpFIDE2Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGgyNjRfZXh0cmFkYXRhW10gPSB7Ci0gICAgMHgwMSwgMHg0ZCwgMHg0MCwgMHgxZSwgMHhmZiwgMHhlMSwgMHgwMCwgMHgwMiwgMHg2NywgMHg0ZCwgMHgwMSwgMHgwMCwgMHgwMiwgMHg2OCwgMHhlZgotfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGFhY19leHRyYWRhdGFbXSA9IHsKLSAgICAweDEyLCAweDEwCi19OwotCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmb3JtYXQgPSAibXA0IjsKLUFWRm9ybWF0Q29udGV4dCAqY3R4OwotdWludDhfdCBpb2J1ZlszMjc2OF07Ci1BVkRpY3Rpb25hcnkgKm9wdHM7Ci0KLWludCB3cml0ZV9maWxlOwotY29uc3QgY2hhciAqY3VyX25hbWU7Ci1GSUxFKiBvdXQ7Ci1pbnQgb3V0X3NpemU7Ci1zdHJ1Y3QgQVZNRDUqIG1kNTsKLXVpbnQ4X3QgaGFzaFtIQVNIX1NJWkVdOwotCi1BVlN0cmVhbSAqdmlkZW9fc3QsICphdWRpb19zdDsKLWludDY0X3QgYXVkaW9fZHRzLCB2aWRlb19kdHM7Ci0KLWludCBiZnJhbWVzOwotaW50NjRfdCBkdXJhdGlvbjsKLWludDY0X3QgYXVkaW9fZHVyYXRpb247Ci1pbnQgZnJhbWVzOwotaW50IGdvcF9zaXplOwotaW50NjRfdCBuZXh0X3BfcHRzOwotZW51bSBBVlBpY3R1cmVUeXBlIGxhc3RfcGljdHVyZTsKLWludCBza2lwX3dyaXRlOwotaW50IHNraXBfd3JpdGVfYXVkaW87Ci1pbnQgY2xlYXJfZHVyYXRpb247Ci0KLWludCBudW1fd2FybmluZ3M7Ci0KLWludCBjaGVja19mYXVsdHM7Ci0KLQotc3RhdGljIHZvaWQgY291bnRfd2FybmluZ3Modm9pZCAqYXZjbCwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmwpCi17Ci0gICAgaWYgKGxldmVsID09IEFWX0xPR19XQVJOSU5HKQotICAgICAgICBudW1fd2FybmluZ3MrKzsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9jb3VudF93YXJuaW5ncyh2b2lkKQotewotICAgIGF2X2xvZ19zZXRfY2FsbGJhY2soY291bnRfd2FybmluZ3MpOwotICAgIG51bV93YXJuaW5ncyA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc2V0X2NvdW50X3dhcm5pbmdzKHZvaWQpCi17Ci0gICAgYXZfbG9nX3NldF9jYWxsYmFjayhhdl9sb2dfZGVmYXVsdF9jYWxsYmFjayk7Ci19Ci0KLXN0YXRpYyBpbnQgaW9fd3JpdGUodm9pZCAqb3BhcXVlLCB1aW50OF90ICpidWYsIGludCBzaXplKQotewotICAgIG91dF9zaXplICs9IHNpemU7Ci0gICAgYXZfbWQ1X3VwZGF0ZShtZDUsIGJ1Ziwgc2l6ZSk7Ci0gICAgaWYgKG91dCkKLSAgICAgICAgZndyaXRlKGJ1ZiwgMSwgc2l6ZSwgb3V0KTsKLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3RhdGljIHZvaWQgaW5pdF9vdXQoY29uc3QgY2hhciAqbmFtZSkKLXsKLSAgICBjaGFyIGJ1ZlsxMDBdOwotICAgIGN1cl9uYW1lID0gbmFtZTsKLSAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJXMuJXMiLCBjdXJfbmFtZSwgZm9ybWF0KTsKLQotICAgIGF2X21kNV9pbml0KG1kNSk7Ci0gICAgaWYgKHdyaXRlX2ZpbGUpIHsKLSAgICAgICAgb3V0ID0gZm9wZW4oYnVmLCAid2IiKTsKLSAgICAgICAgaWYgKCFvdXQpCi0gICAgICAgICAgICBwZXJyb3IoYnVmKTsKLSAgICB9Ci0gICAgb3V0X3NpemUgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBjbG9zZV9vdXQodm9pZCkKLXsKLSAgICBpbnQgaTsKLSAgICBhdl9tZDVfZmluYWwobWQ1LCBoYXNoKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyBpKyspCi0gICAgICAgIHByaW50ZigiJTAyeCIsIGhhc2hbaV0pOwotICAgIHByaW50ZigiICVkICVzXG4iLCBvdXRfc2l6ZSwgY3VyX25hbWUpOwotICAgIGlmIChvdXQpCi0gICAgICAgIGZjbG9zZShvdXQpOwotICAgIG91dCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX2Z1bmMoaW50IHZhbHVlLCBpbnQgbGluZSwgY29uc3QgY2hhciAqbXNnLCAuLi4pCi17Ci0gICAgaWYgKCF2YWx1ZSkgewotICAgICAgICB2YV9saXN0IGFwOwotICAgICAgICB2YV9zdGFydChhcCwgbXNnKTsKLSAgICAgICAgcHJpbnRmKCIlZDogIiwgbGluZSk7Ci0gICAgICAgIHZwcmludGYobXNnLCBhcCk7Ci0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgY2hlY2tfZmF1bHRzKys7Ci0gICAgICAgIHZhX2VuZChhcCk7Ci0gICAgfQotfQotI2RlZmluZSBjaGVjayh2YWx1ZSwgLi4uKSBjaGVja19mdW5jKHZhbHVlLCBfX0xJTkVfXywgX19WQV9BUkdTX18pCi0KLXN0YXRpYyB2b2lkIGluaXRfZnBzKGludCBiZiwgaW50IGF1ZGlvX3ByZXJvbGwsIGludCBmcHMpCi17Ci0gICAgQVZTdHJlYW0gKnN0OwotICAgIGN0eCA9IGF2Zm9ybWF0X2FsbG9jX2NvbnRleHQoKTsKLSAgICBpZiAoIWN0eCkKLSAgICAgICAgZXhpdCgxKTsKLSAgICBjdHgtPm9mb3JtYXQgPSBhdl9ndWVzc19mb3JtYXQoZm9ybWF0LCBOVUxMLCBOVUxMKTsKLSAgICBpZiAoIWN0eC0+b2Zvcm1hdCkKLSAgICAgICAgZXhpdCgxKTsKLSAgICBjdHgtPnBiID0gYXZpb19hbGxvY19jb250ZXh0KGlvYnVmLCBzaXplb2YoaW9idWYpLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwsIE5VTEwsIGlvX3dyaXRlLCBOVUxMKTsKLSAgICBpZiAoIWN0eC0+cGIpCi0gICAgICAgIGV4aXQoMSk7Ci0gICAgY3R4LT5mbGFncyB8PSBBVkZNVF9GTEFHX0JJVEVYQUNUOwotCi0gICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGN0eCwgTlVMTCk7Ci0gICAgaWYgKCFzdCkKLSAgICAgICAgZXhpdCgxKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0gyNjQ7Ci0gICAgc3QtPmNvZGVjLT53aWR0aCA9IDY0MDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IDQ4MDsKLSAgICBzdC0+dGltZV9iYXNlLm51bSA9IDE7Ci0gICAgc3QtPnRpbWVfYmFzZS5kZW4gPSAzMDsKLSAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gc2l6ZW9mKGgyNjRfZXh0cmFkYXRhKTsKLSAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGlmICghc3QtPmNvZGVjLT5leHRyYWRhdGEpCi0gICAgICAgIGV4aXQoMSk7Ci0gICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBoMjY0X2V4dHJhZGF0YSwgc2l6ZW9mKGgyNjRfZXh0cmFkYXRhKSk7Ci0gICAgdmlkZW9fc3QgPSBzdDsKLQotICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIE5VTEwpOwotICAgIGlmICghc3QpCi0gICAgICAgIGV4aXQoMSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQUM7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAyOwotICAgIHN0LT50aW1lX2Jhc2UubnVtID0gMTsKLSAgICBzdC0+dGltZV9iYXNlLmRlbiA9IDQ0MTAwOwotICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBzaXplb2YoYWFjX2V4dHJhZGF0YSk7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQotICAgICAgICBleGl0KDEpOwotICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgYWFjX2V4dHJhZGF0YSwgc2l6ZW9mKGFhY19leHRyYWRhdGEpKTsKLSAgICBhdWRpb19zdCA9IHN0OwotCi0gICAgaWYgKGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihjdHgsICZvcHRzKSA8IDApCi0gICAgICAgIGV4aXQoMSk7Ci0gICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKLQotICAgIGZyYW1lcyA9IDA7Ci0gICAgZ29wX3NpemUgPSAzMDsKLSAgICBkdXJhdGlvbiA9IHZpZGVvX3N0LT50aW1lX2Jhc2UuZGVuIC8gZnBzOwotICAgIGF1ZGlvX2R1cmF0aW9uID0gMTAyNExMICogYXVkaW9fc3QtPnRpbWVfYmFzZS5kZW4gLyBhdWRpb19zdC0+Y29kZWMtPnNhbXBsZV9yYXRlOwotICAgIGlmIChhdWRpb19wcmVyb2xsKQotICAgICAgICBhdWRpb19wcmVyb2xsID0gMjA0OExMICogYXVkaW9fc3QtPnRpbWVfYmFzZS5kZW4gLyBhdWRpb19zdC0+Y29kZWMtPnNhbXBsZV9yYXRlOwotCi0gICAgYmZyYW1lcyA9IGJmOwotICAgIHZpZGVvX2R0cyA9IGJmcmFtZXMgPyAtZHVyYXRpb24gOiAwOwotICAgIGF1ZGlvX2R0cyA9IC1hdWRpb19wcmVyb2xsOwotfQotCi1zdGF0aWMgdm9pZCBpbml0KGludCBiZiwgaW50IGF1ZGlvX3ByZXJvbGwpCi17Ci0gICAgaW5pdF9mcHMoYmYsIGF1ZGlvX3ByZXJvbGwsIDMwKTsKLX0KLQotc3RhdGljIHZvaWQgbXV4X2ZyYW1lcyhpbnQgbikKLXsKLSAgICBpbnQgZW5kX2ZyYW1lcyA9IGZyYW1lcyArIG47Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQVZQYWNrZXQgcGt0OwotICAgICAgICB1aW50OF90IHBrdGRhdGFbOF0gPSB7IDAgfTsKLSAgICAgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7Ci0KLSAgICAgICAgaWYgKGF2X2NvbXBhcmVfdHMoYXVkaW9fZHRzLCBhdWRpb19zdC0+dGltZV9iYXNlLCB2aWRlb19kdHMsIHZpZGVvX3N0LT50aW1lX2Jhc2UpIDwgMCkgewotICAgICAgICAgICAgcGt0LmR0cyA9IHBrdC5wdHMgPSBhdWRpb19kdHM7Ci0gICAgICAgICAgICBwa3Quc3RyZWFtX2luZGV4ID0gMTsKLSAgICAgICAgICAgIHBrdC5kdXJhdGlvbiA9IGF1ZGlvX2R1cmF0aW9uOwotICAgICAgICAgICAgYXVkaW9fZHRzICs9IGF1ZGlvX2R1cmF0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZyYW1lcyA9PSBlbmRfZnJhbWVzKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgcGt0LmR0cyA9IHZpZGVvX2R0czsKLSAgICAgICAgICAgIHBrdC5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICAgICAgcGt0LmR1cmF0aW9uID0gZHVyYXRpb247Ci0gICAgICAgICAgICBpZiAoKGZyYW1lcyAlIGdvcF9zaXplKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGt0LmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKLSAgICAgICAgICAgICAgICBsYXN0X3BpY3R1cmUgPSBBVl9QSUNUVVJFX1RZUEVfSTsKLSAgICAgICAgICAgICAgICBwa3QucHRzID0gcGt0LmR0cyArIGR1cmF0aW9uOwotICAgICAgICAgICAgICAgIHZpZGVvX2R0cyA9IHBrdC5wdHM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChsYXN0X3BpY3R1cmUgPT0gQVZfUElDVFVSRV9UWVBFX1ApIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdF9waWN0dXJlID0gQVZfUElDVFVSRV9UWVBFX0I7Ci0gICAgICAgICAgICAgICAgICAgIHBrdC5wdHMgPSBwa3QuZHRzOwotICAgICAgICAgICAgICAgICAgICB2aWRlb19kdHMgPSBuZXh0X3BfcHRzOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGxhc3RfcGljdHVyZSA9IEFWX1BJQ1RVUkVfVFlQRV9QOwotICAgICAgICAgICAgICAgICAgICBpZiAoKChmcmFtZXMgKyAxKSAlIGdvcF9zaXplKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwa3QucHRzID0gcGt0LmR0cyArIGR1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fZHRzID0gcGt0LnB0czsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcF9wdHMgPSBwa3QucHRzID0gcGt0LmR0cyArIDIgKiBkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2R0cyArPSBkdXJhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYmZyYW1lcykKLSAgICAgICAgICAgICAgICBwa3QucHRzID0gcGt0LmR0czsKLSAgICAgICAgICAgIGZyYW1lcysrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNsZWFyX2R1cmF0aW9uKQotICAgICAgICAgICAgcGt0LmR1cmF0aW9uID0gMDsKLSAgICAgICAgQVZfV0IzMihwa3RkYXRhICsgNCwgcGt0LnB0cyk7Ci0gICAgICAgIHBrdC5kYXRhID0gcGt0ZGF0YTsKLSAgICAgICAgcGt0LnNpemUgPSA4OwotICAgICAgICBpZiAoc2tpcF93cml0ZSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoc2tpcF93cml0ZV9hdWRpbyAmJiBwa3Quc3RyZWFtX2luZGV4ID09IDEpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCAmcGt0KTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG11eF9nb3BzKGludCBuKQotewotICAgIG11eF9mcmFtZXMoZ29wX3NpemUgKiBuKTsKLX0KLQotc3RhdGljIHZvaWQgc2tpcF9nb3BzKGludCBuKQotewotICAgIHNraXBfd3JpdGUgPSAxOwotICAgIG11eF9nb3BzKG4pOwotICAgIHNraXBfd3JpdGUgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBzaWduYWxfaW5pdF90cyh2b2lkKQotewotICAgIEFWUGFja2V0IHBrdDsKLSAgICBhdl9pbml0X3BhY2tldCgmcGt0KTsKLSAgICBwa3Quc2l6ZSA9IDA7Ci0gICAgcGt0LmRhdGEgPSBOVUxMOwotCi0gICAgcGt0LnN0cmVhbV9pbmRleCA9IDA7Ci0gICAgcGt0LmR0cyA9IHZpZGVvX2R0czsKLSAgICBwa3QucHRzID0gMDsKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsICZwa3QpOwotCi0gICAgcGt0LnN0cmVhbV9pbmRleCA9IDE7Ci0gICAgcGt0LmR0cyA9IHBrdC5wdHMgPSBhdWRpb19kdHM7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCAmcGt0KTsKLX0KLQotc3RhdGljIHZvaWQgZmluaXNoKHZvaWQpCi17Ci0gICAgYXZfd3JpdGVfdHJhaWxlcihjdHgpOwotICAgIGF2X2ZyZWUoY3R4LT5wYik7Ci0gICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KGN0eCk7Ci0gICAgY3R4ID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgaGVscCh2b2lkKQotewotICAgIHByaW50ZigibW92ZW5jLXRlc3QgWy13XVxuIgotICAgICAgICAgICAiLXcgICAgICAgICAgd3JpdGUgb3V0cHV0IGludG8gZmlsZXNcbiIpOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGM7Ci0gICAgdWludDhfdCBoZWFkZXJbSEFTSF9TSVpFXTsKLSAgICB1aW50OF90IGNvbnRlbnRbSEFTSF9TSVpFXTsKLSAgICBpbnQgZW1wdHlfbW9vdl9wb3M7Ci0gICAgaW50IHByZXZfcG9zOwotCi0gICAgZm9yICg7OykgewotICAgICAgICBjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ3aCIpOwotICAgICAgICBpZiAoYyA9PSAtMSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgY2FzZSAndyc6Ci0gICAgICAgICAgICB3cml0ZV9maWxlID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICBjYXNlICdoJzoKLSAgICAgICAgICAgIGhlbHAoKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXZfcmVnaXN0ZXJfYWxsKCk7Ci0KLSAgICBtZDUgPSBhdl9tZDVfYWxsb2MoKTsKLSAgICBpZiAoIW1kNSkKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAvLyBXcml0ZSBhIGZyYWdtZW50ZWQgZmlsZSB3aXRoIGFuIGluaXRpYWwgbW9vdiB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHNvbWUKLSAgICAvLyBzYW1wbGVzLiBPbmUgbW9vdittZGF0IHdpdGggMSBzZWNvbmQgb2YgZGF0YSBhbmQgb25lIG1vb2YrbWRhdCB3aXRoIDEKLSAgICAvLyBzZWNvbmQgb2YgZGF0YS4KLSAgICBpbml0X291dCgibm9uLWVtcHR5LW1vb3YiKTsKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUiLCAwKTsKLSAgICBpbml0KDAsIDApOwotICAgIG11eF9nb3BzKDIpOwotICAgIGZpbmlzaCgpOwotICAgIGNsb3NlX291dCgpOwotCi0gICAgLy8gV3JpdGUgYSBzaW1pbGFyIGZpbGUsIGJ1dCB3aXRoIGItZnJhbWVzIGFuZCBhdWRpbyBwcmVyb2xsLCBoYW5kbGVkCi0gICAgLy8gdmlhIGFuIGVkaXQgbGlzdC4KLSAgICBpbml0X291dCgibm9uLWVtcHR5LW1vb3YtZWxzdCIpOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZSIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidXNlX2VkaXRsaXN0IiwgIjEiLCAwKTsKLSAgICBpbml0KDEsIDEpOwotICAgIG11eF9nb3BzKDIpOwotICAgIGZpbmlzaCgpOwotICAgIGNsb3NlX291dCgpOwotCi0gICAgLy8gVXNlIGItZnJhbWVzIGJ1dCBubyBhdWRpby1wcmVyb2xsLCBidXQgd2l0aG91dCBhbiBlZGl0IGxpc3QuCi0gICAgLy8gRHVlIHRvIGF2b2lkX25lZ2F0aXZlX3RzID09IEFWRk1UX0FWT0lEX05FR19UU19NQUtFX1pFUk8sIHRoZSBkdHMKLSAgICAvLyBvZiB0aGUgZmlyc3QgYXVkaW8gcGFja2V0IGlzID4gMCwgYnV0IGl0IGlzIHNldCB0byB6ZXJvIHNpbmNlIGVkaXQKLSAgICAvLyBsaXN0cyBhcmVuJ3QgdXNlZCwgaW5jcmVhc2luZyB0aGUgZHVyYXRpb24gb2YgdGhlIGZpcnN0IHBhY2tldCBpbnN0ZWFkLgotICAgIGluaXRfb3V0KCJub24tZW1wdHktbW9vdi1uby1lbHN0Iik7Ci0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lIiwgMCk7Ci0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJ1c2VfZWRpdGxpc3QiLCAiMCIsIDApOwotICAgIGluaXQoMSwgMCk7Ci0gICAgbXV4X2dvcHMoMik7Ci0gICAgZmluaXNoKCk7Ci0gICAgY2xvc2Vfb3V0KCk7Ci0KLSAgICBmb3JtYXQgPSAiaXNtdiI7Ci0gICAgLy8gV3JpdGUgYW4gSVNNViwgd2l0aCBiLWZyYW1lcyBhbmQgYXVkaW8gcHJlcm9sbC4KLSAgICBpbml0X291dCgiaXNtdiIpOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZSIsIDApOwotICAgIGluaXQoMSwgMSk7Ci0gICAgbXV4X2dvcHMoMik7Ci0gICAgZmluaXNoKCk7Ci0gICAgY2xvc2Vfb3V0KCk7Ci0gICAgZm9ybWF0ID0gIm1wNCI7Ci0KLSAgICAvLyBBbiBpbml0aWFsIG1vb3YgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYW55IHNhbXBsZXMsIGZvbGxvd2VkIGJ5IHR3bwotICAgIC8vIG1vb2YrbWRhdCBwYWlycy4KLSAgICBpbml0X291dCgiZW1wdHktbW9vdiIpOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZStlbXB0eV9tb292IiwgMCk7Ci0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJ1c2VfZWRpdGxpc3QiLCAiMCIsIDApOwotICAgIGluaXQoMCwgMCk7Ci0gICAgbXV4X2dvcHMoMik7Ci0gICAgZmluaXNoKCk7Ci0gICAgY2xvc2Vfb3V0KCk7Ci0gICAgbWVtY3B5KGNvbnRlbnQsIGhhc2gsIEhBU0hfU0laRSk7Ci0KLSAgICAvLyBTaW1pbGFyIHRvIHRoZSBwcmV2aW91cyBvbmUsIGJ1dCB3aXRoIGlucHV0IHRoYXQgZG9lc24ndCBzdGFydCBhdAotICAgIC8vIHB0cy9kdHMgMC4gYXZvaWRfbmVnYXRpdmVfdHMgYmVoYXZlcyBpbiB0aGUgc2FtZSB3YXkgYXMKLSAgICAvLyBpbiBub24tZW1wdHktbW9vdi1uby1lbHN0IGFib3ZlLgotICAgIGluaXRfb3V0KCJlbXB0eS1tb292LW5vLWVsc3QiKTsKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUrZW1wdHlfbW9vdiIsIDApOwotICAgIGluaXQoMSwgMCk7Ci0gICAgbXV4X2dvcHMoMik7Ci0gICAgZmluaXNoKCk7Ci0gICAgY2xvc2Vfb3V0KCk7Ci0KLSAgICAvLyBTYW1lIGFzIHRoZSBwcmV2aW91cyBvbmUsIGJ1dCBkaXNhYmxlIGF2b2lkX25lZ2F0aXZlX3RzICh3aGljaAotICAgIC8vIHdvdWxkIHJlcXVpcmUgdXNpbmcgYW4gZWRpdCBsaXN0LCBidXQgd2l0aCBlbXB0eV9tb292LCBvbmUgY2FuJ3QKLSAgICAvLyB3cml0ZSBhIHNlbnNpYmxlIGVkaXQgbGlzdCwgd2hlbiB0aGUgc3RhcnQgdGltZXN0YW1wcyBhcmVuJ3Qga25vd24pLgotICAgIC8vIFRoaXMgc2hvdWxkIHRyaWdnZXIgYSB3YXJuaW5nIC0gd2UgY2hlY2sgdGhhdCB0aGUgd2FybmluZyBpcyBwcm9kdWNlZC4KLSAgICBpbml0X2NvdW50X3dhcm5pbmdzKCk7Ci0gICAgaW5pdF9vdXQoImVtcHR5LW1vb3Ytbm8tZWxzdC1uby1hZGp1c3QiKTsKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUrZW1wdHlfbW9vdiIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAiYXZvaWRfbmVnYXRpdmVfdHMiLCAiMCIsIDApOwotICAgIGluaXQoMSwgMCk7Ci0gICAgbXV4X2dvcHMoMik7Ci0gICAgZmluaXNoKCk7Ci0gICAgY2xvc2Vfb3V0KCk7Ci0KLSAgICByZXNldF9jb3VudF93YXJuaW5ncygpOwotICAgIGNoZWNrKG51bV93YXJuaW5ncyA+IDAsICJObyB3YXJuaW5ncyBwcmludGVkIGZvciB1bmhhbmRsZWQgc3RhcnQgb2Zmc2V0Iik7Ci0KLSAgICAvLyBWZXJpZnkgdGhhdCBkZWxheV9tb292IHByb2R1Y2VzIHRoZSBzYW1lIGFzIGVtcHR5X21vb3YgZm9yCi0gICAgLy8gc2ltcGxlIGlucHV0Ci0gICAgaW5pdF9vdXQoImRlbGF5LW1vb3YiKTsKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUrZGVsYXlfbW9vdiIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidXNlX2VkaXRsaXN0IiwgIjAiLCAwKTsKLSAgICBpbml0KDAsIDApOwotICAgIG11eF9nb3BzKDIpOwotICAgIGZpbmlzaCgpOwotICAgIGNsb3NlX291dCgpOwotICAgIGNoZWNrKCFtZW1jbXAoaGFzaCwgY29udGVudCwgSEFTSF9TSVpFKSwgImRlbGF5X21vb3YgZGlmZmVycyBmcm9tIGVtcHR5X21vb3YiKTsKLQotICAgIC8vIFRlc3Qgd3JpdGluZyBjb250ZW50IHRoYXQgcmVxdWlyZXMgYW4gZWRpdCBsaXN0IHVzaW5nIGRlbGF5X21vb3YKLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbHN0Iik7Ci0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lK2RlbGF5X21vb3YiLCAwKTsKLSAgICBpbml0KDEsIDEpOwotICAgIG11eF9nb3BzKDIpOwotICAgIGZpbmlzaCgpOwotICAgIGNsb3NlX291dCgpOwotCi0gICAgLy8gVGVzdCB3cml0aW5nIGEgZmlsZSB3aXRoIG9uZSB0cmFjayBsYWNraW5nIHBhY2tldHMsIHdpdGggZGVsYXlfbW9vdi4KLSAgICBza2lwX3dyaXRlX2F1ZGlvID0gMTsKLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbXB0eS10cmFjayIpOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZStkZWxheV9tb292IiwgMCk7Ci0gICAgaW5pdCgwLCAwKTsKLSAgICBtdXhfZ29wcygyKTsKLSAgICAvLyBUaGUgYXV0b21hdGljIGZsdXNoaW5nIHNob3VsZG4ndCBvdXRwdXQgYW55dGhpbmcsIHNpbmNlIHdlJ3JlIHN0aWxsCi0gICAgLy8gd2FpdGluZyBmb3IgZGF0YSBmb3Igc29tZSB0cmFja3MKLSAgICBjaGVjayhvdXRfc2l6ZSA9PSAwLCAiZGVsYXlfbW9vdiBmbHVzaGVkIHByZW1hdHVyZWx5Iik7Ci0gICAgLy8gV2hlbiBjbG9zZWQgKG9yIG1hbnVhbGx5IGZsdXNoZWQpLCBhbGwgdGhlIHdyaXR0ZW4gZGF0YSBzaG91bGQgc3RpbGwKLSAgICAvLyBiZSBvdXRwdXQuCi0gICAgZmluaXNoKCk7Ci0gICAgY2xvc2Vfb3V0KCk7Ci0gICAgY2hlY2sob3V0X3NpemUgPiAwLCAiZGVsYXlfbW9vdiBkaWRuJ3Qgb3V0cHV0IGFueXRoaW5nIik7Ci0KLSAgICAvLyBDaGVjayB0aGF0IG1hbnVhbGx5IGZsdXNoaW5nIHN0aWxsIG91dHB1dHMgdGhpbmdzIGFzIGV4cGVjdGVkLiBUaGlzCi0gICAgLy8gcHJvZHVjZXMgdHdvIGZyYWdtZW50cywgd2hpbGUgdGhlIG9uZSBhYm92ZSBwcm9kdWNlcyBvbmx5IG9uZS4KLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbXB0eS10cmFjay1mbHVzaCIpOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19jdXN0b20rZGVsYXlfbW9vdiIsIDApOwotICAgIGluaXQoMCwgMCk7Ci0gICAgbXV4X2dvcHMoMSk7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gRm9yY2Ugd3JpdGluZyB0aGUgbW9vdgotICAgIGNoZWNrKG91dF9zaXplID4gMCwgIk5vIG1vb3Ygd3JpdHRlbiIpOwotICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7Ci0gICAgbXV4X2dvcHMoMSk7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsKLSAgICBmaW5pc2goKTsKLSAgICBjbG9zZV9vdXQoKTsKLQotICAgIHNraXBfd3JpdGVfYXVkaW8gPSAwOwotCi0KLQotICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBoZWFkZXIgd3JpdHRlbiBieSBkZWxheV9tb292IHdoZW4gbWFudWFsbHkgZmx1c2hlZAotICAgIC8vIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIGJ5IGVtcHR5X21vb3YuCi0gICAgaW5pdF9vdXQoImVtcHR5LW1vb3YtaGVhZGVyIik7Ci0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lK2VtcHR5X21vb3YiLCAwKTsKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgInVzZV9lZGl0bGlzdCIsICIwIiwgMCk7Ci0gICAgaW5pdCgwLCAwKTsKLSAgICBjbG9zZV9vdXQoKTsKLSAgICBtZW1jcHkoaGVhZGVyLCBoYXNoLCBIQVNIX1NJWkUpOwotICAgIGluaXRfb3V0KCJlbXB0eS1tb292LWNvbnRlbnQiKTsKLSAgICBtdXhfZ29wcygyKTsKLSAgICAvLyBXcml0dGVuIDIgc2Vjb25kcyBvZiBjb250ZW50LCB3aXRoIGFuIGF1dG9tYXRpYyBmbHVzaCBhZnRlciAxIHNlY29uZC4KLSAgICBjaGVjayhvdXRfc2l6ZSA+IDAsICJObyBhdXRvbWF0aWMgZmx1c2g/Iik7Ci0gICAgZW1wdHlfbW9vdl9wb3MgPSBwcmV2X3BvcyA9IG91dF9zaXplOwotICAgIC8vIE1hbnVhbGx5IGZsdXNoIHRoZSBzZWNvbmQgZnJhZ21lbnQKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOwotICAgIGNoZWNrKG91dF9zaXplID4gcHJldl9wb3MsICJObyBzZWNvbmQgZnJhZ21lbnQgZmx1c2hlZD8iKTsKLSAgICBwcmV2X3BvcyA9IG91dF9zaXplOwotICAgIC8vIENoZWNrIHRoYXQgYW4gZXh0cmEgZmx1c2ggZG9lc24ndCBvdXRwdXQgYW55IG1vcmUgZGF0YQotICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7Ci0gICAgY2hlY2sob3V0X3NpemUgPT0gcHJldl9wb3MsICJNb3JlIGRhdGEgd3JpdHRlbj8iKTsKLSAgICBjbG9zZV9vdXQoKTsKLSAgICBtZW1jcHkoY29udGVudCwgaGFzaCwgSEFTSF9TSVpFKTsKLSAgICAvLyBJZ25vcmUgdGhlIHRyYWlsZXIgd3JpdHRlbiBoZXJlCi0gICAgZmluaXNoKCk7Ci0KLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1oZWFkZXIiKTsKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2RlbGF5X21vb3YiLCAwKTsKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgInVzZV9lZGl0bGlzdCIsICIwIiwgMCk7Ci0gICAgaW5pdCgwLCAwKTsKLSAgICBjaGVjayhvdXRfc2l6ZSA9PSAwLCAiT3V0cHV0IHdyaXR0ZW4gZHVyaW5nIGluaXQgd2l0aCBkZWxheV9tb292Iik7Ci0gICAgbXV4X2dvcHMoMSk7IC8vIFdyaXRlIDEgc2Vjb25kIG9mIGNvbnRlbnQKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBGb3JjZSB3cml0aW5nIHRoZSBtb292Ci0gICAgY2xvc2Vfb3V0KCk7Ci0gICAgY2hlY2soIW1lbWNtcChoYXNoLCBoZWFkZXIsIEhBU0hfU0laRSksICJkZWxheV9tb292IGhlYWRlciBkaWZmZXJzIGZyb20gZW1wdHlfbW9vdiIpOwotICAgIGluaXRfb3V0KCJkZWxheS1tb292LWNvbnRlbnQiKTsKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBGbHVzaCB0aGUgZmlyc3QgZnJhZ21lbnQKLSAgICBjaGVjayhvdXRfc2l6ZSA9PSBlbXB0eV9tb292X3BvcywgIk1hbnVhbGx5IGZsdXNoZWQgY29udGVudCBkaWZmZXJzIGZyb20gYXV0b21hdGljYWxseSBmbHVzaGVkLCAlZCB2cyAlZCIsIG91dF9zaXplLCBlbXB0eV9tb292X3Bvcyk7Ci0gICAgbXV4X2dvcHMoMSk7IC8vIFdyaXRlIHRoZSByZXN0IG9mIHRoZSBjb250ZW50Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gRmx1c2ggdGhlIHNlY29uZCBmcmFnbWVudAotICAgIGNsb3NlX291dCgpOwotICAgIGNoZWNrKCFtZW1jbXAoaGFzaCwgY29udGVudCwgSEFTSF9TSVpFKSwgImRlbGF5X21vb3YgY29udGVudCBkaWZmZXJzIGZyb20gZW1wdHlfbW9vdiIpOwotICAgIGZpbmlzaCgpOwotCi0KLSAgICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gcHJvZHVjZSBhbiBpZGVudGljYWwgc2Vjb25kIGZyYWdtZW50IHdpdGhvdXQKLSAgICAvLyB3cml0aW5nIHRoZSBmaXJzdCBvbmUuIEZpcnN0IHdyaXRlIHRoZSByZWZlcmVuY2UgZnJhZ21lbnRzIHRoYXQKLSAgICAvLyB3ZSB3YW50IHRvIHJlcHJvZHVjZS4KLSAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2VtcHR5X21vb3YrZGFzaCIsIDApOwotICAgIGluaXQoMCwgMCk7Ci0gICAgbXV4X2dvcHMoMSk7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBmaXJzdCBmcmFnbWVudAotICAgIGluaXRfb3V0KCJlbXB0eS1tb292LXNlY29uZC1mcmFnIik7Ci0gICAgbXV4X2dvcHMoMSk7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBzZWNvbmQgZnJhZ21lbnQKLSAgICBjbG9zZV9vdXQoKTsKLSAgICBtZW1jcHkoY29udGVudCwgaGFzaCwgSEFTSF9TSVpFKTsKLSAgICBmaW5pc2goKTsKLQotICAgIC8vIFByb2R1Y2UgdGhlIHNhbWUgc2Vjb25kIGZyYWdtZW50IHdpdGhvdXQgYWN0dWFsbHkgd3JpdGluZyB0aGUgZmlyc3QKLSAgICAvLyBvbmUgYmVmb3JlLgotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19jdXN0b20rZW1wdHlfbW9vditkYXNoK2ZyYWdfZGlzY29udCIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAiZnJhZ21lbnRfaW5kZXgiLCAiMiIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAiYXZvaWRfbmVnYXRpdmVfdHMiLCAiMCIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidXNlX2VkaXRsaXN0IiwgIjAiLCAwKTsKLSAgICBpbml0KDAsIDApOwotICAgIHNraXBfZ29wcygxKTsKLSAgICBpbml0X291dCgiZW1wdHktbW9vdi1zZWNvbmQtZnJhZy1kaXNjb250Iik7Ci0gICAgbXV4X2dvcHMoMSk7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBzZWNvbmQgZnJhZ21lbnQKLSAgICBjbG9zZV9vdXQoKTsKLSAgICBjaGVjayghbWVtY21wKGhhc2gsIGNvbnRlbnQsIEhBU0hfU0laRSksICJkaXNjb250aW51b3VzbHkgd3JpdHRlbiBmcmFnbWVudCBkaWZmZXJzIik7Ci0gICAgZmluaXNoKCk7Ci0KLSAgICAvLyBQcm9kdWNlIHRoZSBzYW1lIHRoaW5nIGJ5IHVzaW5nIGRlbGF5X21vb3YsIHdoaWNoIHJlcXVpcmVzIGEgc2xpZ2h0bHkKLSAgICAvLyBkaWZmZXJlbnQgY2FsbCBzZXF1ZW5jZS4KLSAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2RlbGF5X21vb3YrZGFzaCtmcmFnX2Rpc2NvbnQiLCAwKTsKLSAgICBhdl9kaWN0X3NldCgmb3B0cywgImZyYWdtZW50X2luZGV4IiwgIjIiLCAwKTsKLSAgICBpbml0KDAsIDApOwotICAgIHNraXBfZ29wcygxKTsKLSAgICBtdXhfZ29wcygxKTsKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBPdXRwdXQgdGhlIG1vb3YKLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1zZWNvbmQtZnJhZy1kaXNjb250Iik7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBzZWNvbmQgZnJhZ21lbnQKLSAgICBjbG9zZV9vdXQoKTsKLSAgICBjaGVjayghbWVtY21wKGhhc2gsIGNvbnRlbnQsIEhBU0hfU0laRSksICJkaXNjb250aW51b3VzbHkgd3JpdHRlbiBmcmFnbWVudCBkaWZmZXJzIik7Ci0gICAgZmluaXNoKCk7Ci0KLQotICAgIC8vIFRlc3QgZGlzY29udGlub3VzbHkgd3JpdHRlbiBmcmFnbWVudHMgd2l0aCBiLWZyYW1lcyAod2hlcmUgdGhlCi0gICAgLy8gYXNzdW1wdGlvbiBvZiBzdGFydGluZyBhdCBwdHM9MCB3b3JrcykgYnV0IG5vdCB3aXRoIGF1ZGlvIHByZXJvbGwKLSAgICAvLyAod2hpY2ggY2FuJ3QgYmUgZ3Vlc3NlZCkuCi0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2N1c3RvbStkZWxheV9tb292K2Rhc2giLCAwKTsKLSAgICBpbml0KDEsIDApOwotICAgIG11eF9nb3BzKDEpOwotICAgIGluaXRfb3V0KCJkZWxheS1tb292LWVsc3QtaW5pdCIpOwotICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgbW9vdgotICAgIGNsb3NlX291dCgpOwotICAgIG1lbWNweShoZWFkZXIsIGhhc2gsIEhBU0hfU0laRSk7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBmaXJzdCBmcmFnbWVudAotICAgIGluaXRfb3V0KCJkZWxheS1tb292LWVsc3Qtc2Vjb25kLWZyYWciKTsKLSAgICBtdXhfZ29wcygxKTsKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBPdXRwdXQgdGhlIHNlY29uZCBmcmFnbWVudAotICAgIGNsb3NlX291dCgpOwotICAgIG1lbWNweShjb250ZW50LCBoYXNoLCBIQVNIX1NJWkUpOwotICAgIGZpbmlzaCgpOwotCi0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2N1c3RvbStkZWxheV9tb292K2Rhc2grZnJhZ19kaXNjb250IiwgMCk7Ci0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJmcmFnbWVudF9pbmRleCIsICIyIiwgMCk7Ci0gICAgaW5pdCgxLCAwKTsKLSAgICBza2lwX2dvcHMoMSk7Ci0gICAgbXV4X2dvcHMoMSk7IC8vIFdyaXRlIHRoZSBzZWNvbmQgZnJhZ21lbnQKLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbHN0LWluaXQtZGlzY29udCIpOwotICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgbW9vdgotICAgIGNsb3NlX291dCgpOwotICAgIGNoZWNrKCFtZW1jbXAoaGFzaCwgaGVhZGVyLCBIQVNIX1NJWkUpLCAiZGlzY29udGludW91c2x5IHdyaXR0ZW4gaGVhZGVyIGRpZmZlcnMiKTsKLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbHN0LXNlY29uZC1mcmFnLWRpc2NvbnQiKTsKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBPdXRwdXQgdGhlIHNlY29uZCBmcmFnbWVudAotICAgIGNsb3NlX291dCgpOwotICAgIGNoZWNrKCFtZW1jbXAoaGFzaCwgY29udGVudCwgSEFTSF9TSVpFKSwgImRpc2NvbnRpbnVvdXNseSB3cml0dGVuIGZyYWdtZW50IGRpZmZlcnMiKTsKLSAgICBmaW5pc2goKTsKLQotCi0gICAgLy8gVGVzdCBkaXNjb250aW5vdXNseSB3cml0dGVuIGZyYWdtZW50cyB3aXRoIGItZnJhbWVzIGFuZCBhdWRpbyBwcmVyb2xsLAotICAgIC8vIHByb3Blcmx5IHNpZ25hbGVkLgotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19jdXN0b20rZGVsYXlfbW9vditkYXNoIiwgMCk7Ci0gICAgaW5pdCgxLCAxKTsKLSAgICBtdXhfZ29wcygxKTsKLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbHN0LXNpZ25hbC1pbml0Iik7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBtb292Ci0gICAgY2xvc2Vfb3V0KCk7Ci0gICAgbWVtY3B5KGhlYWRlciwgaGFzaCwgSEFTSF9TSVpFKTsKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBPdXRwdXQgdGhlIGZpcnN0IGZyYWdtZW50Ci0gICAgaW5pdF9vdXQoImRlbGF5LW1vb3YtZWxzdC1zaWduYWwtc2Vjb25kLWZyYWciKTsKLSAgICBtdXhfZ29wcygxKTsKLSAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBPdXRwdXQgdGhlIHNlY29uZCBmcmFnbWVudAotICAgIGNsb3NlX291dCgpOwotICAgIG1lbWNweShjb250ZW50LCBoYXNoLCBIQVNIX1NJWkUpOwotICAgIGZpbmlzaCgpOwotCi0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2N1c3RvbStkZWxheV9tb292K2Rhc2grZnJhZ19kaXNjb250IiwgMCk7Ci0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJmcmFnbWVudF9pbmRleCIsICIyIiwgMCk7Ci0gICAgaW5pdCgxLCAxKTsKLSAgICBzaWduYWxfaW5pdF90cygpOwotICAgIHNraXBfZ29wcygxKTsKLSAgICBtdXhfZ29wcygxKTsgLy8gV3JpdGUgdGhlIHNlY29uZCBmcmFnbWVudAotICAgIGluaXRfb3V0KCJkZWxheS1tb292LWVsc3Qtc2lnbmFsLWluaXQtZGlzY29udCIpOwotICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgbW9vdgotICAgIGNsb3NlX291dCgpOwotICAgIGNoZWNrKCFtZW1jbXAoaGFzaCwgaGVhZGVyLCBIQVNIX1NJWkUpLCAiZGlzY29udGludW91c2x5IHdyaXR0ZW4gaGVhZGVyIGRpZmZlcnMiKTsKLSAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbHN0LXNpZ25hbC1zZWNvbmQtZnJhZy1kaXNjb250Iik7Ci0gICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBzZWNvbmQgZnJhZ21lbnQKLSAgICBjbG9zZV9vdXQoKTsKLSAgICBjaGVjayghbWVtY21wKGhhc2gsIGNvbnRlbnQsIEhBU0hfU0laRSksICJkaXNjb250aW51b3VzbHkgd3JpdHRlbiBmcmFnbWVudCBkaWZmZXJzIik7Ci0gICAgZmluaXNoKCk7Ci0KLQotICAgIC8vIFRlc3QgVkZSIGNvbnRlbnQsIHdpdGggc2lkeCBhdG9tcyAod2hpY2ggZGVjbGFyZSB0aGUgcHRzIGR1cmF0aW9uCi0gICAgLy8gb2YgYSBmcmFnbWVudCwgZm9yY2luZyBvdmVycmlkaW5nIHRoZSBzdGFydCBwdHMgb2YgdGhlIG5leHQgb25lKS4KLSAgICAvLyBIZXJlLCB0aGUgZnJhZ21lbnQgZHVyYXRpb24gaW4gcHRzIGlzIHNpZ25pZmljYW50bHkgZGlmZmVyZW50IGZyb20KLSAgICAvLyB0aGUgZHVyYXRpb24gaW4gZHRzLiBUaGUgdmlkZW8gc3RyZWFtIHN0YXJ0cyBhdCBkdHM9LTEwLHB0cz0wLCBhbmQKLSAgICAvLyB0aGUgc2Vjb25kIGZyYWdtZW50IHN0YXJ0cyBhdCBkdHM9MTU1LHB0cz0xNTYuIFRoZSB0cnVuIGR1cmF0aW9uIHN1bQotICAgIC8vIG9mIHRoZSBmaXJzdCBmcmFnbWVudCBpcyAxNjUsIHdoaWNoIGFsc28gaXMgd3JpdHRlbiBhcwotICAgIC8vIGJhc2VNZWRpYURlY29kZVRpbWUgaW4gdGhlIHRmZHQgaW4gdGhlIHNlY29uZCBmcmFnbWVudC4gVGhlIHNpZHggZm9yCi0gICAgLy8gdGhlIGZpcnN0IGZyYWdtZW50IHNheXMgZWFybGllc3RfcHJlc2VudGF0aW9uX3RpbWUgPSAwIGFuZAotICAgIC8vIHN1YnNlZ21lbnRfZHVyYXRpb24gPSAxNTYsIHdoaWNoIGFsc28gbWF0Y2hlcyB0aGUgc2lkeCBpbiB0aGUgc2Vjb25kCi0gICAgLy8gZnJhZ21lbnQuIEZvciB0aGUgYXVkaW8gc3RyZWFtLCB0aGUgcHRzIGFuZCBkdHMgZHVyYXRpb25zIGFsc28gZG9uJ3QKLSAgICAvLyBtYXRjaCAtIHRoZSBpbnB1dCBzdHJlYW0gc3RhcnRzIGF0IHB0cz0tMjA0OCwgYnV0IHRoYXQgcGFydCBpcyBleGNsdWRlZAotICAgIC8vIGJ5IHRoZSBlZGl0IGxpc3QuCi0gICAgaW5pdF9vdXQoInZmciIpOwotICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZStkZWxheV9tb292K2Rhc2giLCAwKTsKLSAgICBpbml0X2ZwcygxLCAxLCAzKTsKLSAgICBtdXhfZnJhbWVzKGdvcF9zaXplLzIpOwotICAgIGR1cmF0aW9uIC89IDEwOwotICAgIG11eF9mcmFtZXMoZ29wX3NpemUvMik7Ci0gICAgbXV4X2dvcHMoMSk7Ci0gICAgZmluaXNoKCk7Ci0gICAgY2xvc2Vfb3V0KCk7Ci0KLSAgICAvLyBUZXN0IFZGUiBjb250ZW50LCB3aXRoIGNsZWFyZWQgZHVyYXRpb24gZmllbGRzLiBJbiB0aGVzZSBjYXNlcywKLSAgICAvLyB0aGUgbXV4ZXIgbXVzdCBndWVzcyB0aGUgZHVyYXRpb24gb2YgdGhlIGxhc3QgcGFja2V0IG9mIGVhY2gKLSAgICAvLyBmcmFnbWVudC4gQXMgbG9uZyBhcyB0aGUgZnJhbWVyYXRlIGRvZXNuJ3QgdmFyeSAodG9vIG11Y2gpIGF0IHRoZQotICAgIC8vIGZyYWdtZW50IGVkZ2UsIGl0IHdvcmtzIGp1c3QgZmluZS4gQWRkaXRpb25hbGx5LCB3aGVuIGF1dG9tYXRpY2FsbHkKLSAgICAvLyBjdXR0aW5nIGZyYWdtZW50cywgdGhlIG11eGVyIGFscmVhZHkga25vdyB0aGUgdGltZXN0YW1wcyBvZiB0aGUgbmV4dAotICAgIC8vIHBhY2tldCBmb3Igb25lIHN0cmVhbSAoaW4gbW9zdCBjYXNlcyB0aGUgdmlkZW8gc3RyZWFtKSwgYXZvaWRpbmcKLSAgICAvLyBoYXZpbmcgdG8gdXNlIGd1ZXNzZXMgZm9yIHRoYXQgb25lLgotICAgIGluaXRfY291bnRfd2FybmluZ3MoKTsKLSAgICBjbGVhcl9kdXJhdGlvbiA9IDE7Ci0gICAgaW5pdF9vdXQoInZmci1ub2R1cmF0aW9uIik7Ci0gICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lK2RlbGF5X21vb3YrZGFzaCIsIDApOwotICAgIGluaXRfZnBzKDEsIDEsIDMpOwotICAgIG11eF9mcmFtZXMoZ29wX3NpemUvMik7Ci0gICAgZHVyYXRpb24gLz0gMTA7Ci0gICAgbXV4X2ZyYW1lcyhnb3Bfc2l6ZS8yKTsKLSAgICBtdXhfZ29wcygxKTsKLSAgICBmaW5pc2goKTsKLSAgICBjbG9zZV9vdXQoKTsKLSAgICBjbGVhcl9kdXJhdGlvbiA9IDA7Ci0gICAgcmVzZXRfY291bnRfd2FybmluZ3MoKTsKLSAgICBjaGVjayhudW1fd2FybmluZ3MgPiAwLCAiTm8gd2FybmluZ3MgcHJpbnRlZCBmb3IgZmlsbGVkIGluIGR1cmF0aW9ucyIpOwotCi0gICAgYXZfZnJlZShtZDUpOwotCi0gICAgcmV0dXJuIGNoZWNrX2ZhdWx0cyA+IDAgPyAxIDogMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21vdmVuYy5jIGIvbGliYXZmb3JtYXQvbW92ZW5jLmMKaW5kZXggYjljMGY3YS4uNDE1NjM3ZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbW92ZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvbW92ZW5jLmMKQEAgLTMxLDggKzMxLDEyIEBACiAjaW5jbHVkZSAiYXZpby5oIgogI2luY2x1ZGUgImlzb20uaCIKICNpbmNsdWRlICJhdmMuaCIKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2FjM19wYXJzZXIuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FjM19wYXJzZXJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2RueGhkZGF0YS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZmxhYy5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL3B1dF9iaXRzLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy92YzFfY29tbW9uLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9yYXcuaCIKQEAgLTQ0LDExICs0OCwxMyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3N0ZXJlbzNkLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NvbG9yX3V0aWxzLmgiCiAjaW5jbHVkZSAiaGV2Yy5oIgogI2luY2x1ZGUgInJ0cGVuYy5oIgogI2luY2x1ZGUgIm1vdl9jaGFuLmgiCisjaW5jbHVkZSAidnBjYy5oIgogCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewogICAgIHsgIm1vdmZsYWdzIiwgIk1PViBtdXhlciBmbGFncyIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIGZsYWdzKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gMH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCkBAIC01Niw2ICs2Miw3IEBACiAgICAgeyAibW9vdl9zaXplIiwgIm1heGltdW0gbW9vdiBzaXplIHNvIGl0IGNhbiBiZSBwbGFjZWQgYXQgdGhlIGJlZ2luIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgcmVzZXJ2ZWRfbW9vdl9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgMCB9LAogICAgIHsgImVtcHR5X21vb3YiLCAiTWFrZSB0aGUgaW5pdGlhbCBtb292IGF0b20gZW1wdHkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19FTVBUWV9NT09WfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtb3ZmbGFncyIgfSwKICAgICB7ICJmcmFnX2tleWZyYW1lIiwgIkZyYWdtZW50IGF0IHZpZGVvIGtleWZyYW1lcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX0ZSQUdfS0VZRlJBTUV9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1vdmZsYWdzIiB9LAorICAgIHsgImZyYWdfZXZlcnlfZnJhbWUiLCAiRnJhZ21lbnQgYXQgZXZlcnkgZnJhbWUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19GUkFHX0VWRVJZX0ZSQU1FfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtb3ZmbGFncyIgfSwKICAgICB7ICJzZXBhcmF0ZV9tb29mIiwgIldyaXRlIHNlcGFyYXRlIG1vb2YvbWRhdCBhdG9tcyBmb3IgZWFjaCB0cmFjayIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX1NFUEFSQVRFX01PT0Z9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1vdmZsYWdzIiB9LAogICAgIHsgImZyYWdfY3VzdG9tIiwgIkZsdXNoIGZyYWdtZW50cyBvbiBjYWxsZXIgcmVxdWVzdHMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19GUkFHX0NVU1RPTX0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCiAgICAgeyAiaXNtbCIsICJDcmVhdGUgYSBsaXZlIHNtb290aCBzdHJlYW1pbmcgZmVlZCAoZm9yIHB1c2hpbmcgdG8gYSBwdWJsaXNoaW5nIHBvaW50KSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX0lTTUx9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1vdmZsYWdzIiB9LApAQCAtNjksNiArNzYsOSBAQAogICAgIHsgImdsb2JhbF9zaWR4IiwgIldyaXRlIGEgZ2xvYmFsIHNpZHggaW5kZXggYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfTU9WX0ZMQUdfR0xPQkFMX1NJRFh9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1vdmZsYWdzIiB9LAogICAgIHsgIndyaXRlX2NvbHIiLCAiV3JpdGUgY29sciBhdG9tIChFeHBlcmltZW50YWwsIG1heSBiZSByZW5hbWVkIG9yIGNoYW5nZWQsIGRvIG5vdCB1c2UgZnJvbSBzY3JpcHRzKSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX1dSSVRFX0NPTFJ9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1vdmZsYWdzIiB9LAogICAgIHsgIndyaXRlX2dhbWEiLCAiV3JpdGUgZGVwcmVjYXRlZCBnYW1hIGF0b20iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19XUklURV9HQU1BfSwgSU5UX01JTiwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtb3ZmbGFncyIgfSwKKyAgICB7ICJ1c2VfbWV0YWRhdGFfdGFncyIsICJVc2UgbWR0YSBhdG9tIGZvciBtZXRhZGF0YS4iLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19VU0VfTURUQX0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgeyAic2tpcF90cmFpbGVyIiwgIlNraXAgd3JpdGluZyB0aGUgbWZyYS90ZnJhL21mcm8gdHJhaWxlciBmb3IgZnJhZ21lbnRlZCBmaWxlcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX01PVl9GTEFHX1NLSVBfVFJBSUxFUn0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCisgICAgeyAibmVnYXRpdmVfY3RzX29mZnNldHMiLCAiVXNlIG5lZ2F0aXZlIENUUyBvZmZzZXRzIChyZWR1Y2luZyB0aGUgbmVlZCBmb3IgZWRpdCBsaXN0cykiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9NT1ZfRkxBR19ORUdBVElWRV9DVFNfT0ZGU0VUU30sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAibW92ZmxhZ3MiIH0sCiAgICAgRkZfUlRQX0ZMQUdfT1BUUyhNT1ZNdXhDb250ZXh0LCBydHBfZmxhZ3MpLAogICAgIHsgInNraXBfaW9kcyIsICJTa2lwIHdyaXRpbmcgaW9kcyBhdG9tLiIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIGlvZHNfc2tpcCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMX0sIDAsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKICAgICB7ICJpb2RzX2F1ZGlvX3Byb2ZpbGUiLCAiaW9kcyBhdWRpbyBwcm9maWxlIGF0b20uIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgaW9kc19hdWRpb19wcm9maWxlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIDI1NSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LApAQCAtODMsOSArOTMsMTEgQEAKICAgICB7ICJmcmFnbWVudF9pbmRleCIsICJGcmFnbWVudCBudW1iZXIgb2YgdGhlIG5leHQgZnJhZ21lbnQiLCBvZmZzZXRvZihNT1ZNdXhDb250ZXh0LCBmcmFnbWVudHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMX0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKICAgICB7ICJtb3ZfZ2FtbWEiLCAiZ2FtbWEgdmFsdWUgZm9yIGdhbWEgYXRvbSIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIGdhbW1hKSwgQVZfT1BUX1RZUEVfRkxPQVQsIHsuZGJsID0gMC4wIH0sIDAuMCwgMTAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKICAgICB7ICJmcmFnX2ludGVybGVhdmUiLCAiSW50ZXJsZWF2ZSBzYW1wbGVzIHdpdGhpbiBmcmFnbWVudHMgKG1heCBudW1iZXIgb2YgY29uc2VjdXRpdmUgc2FtcGxlcywgbG93ZXIgaXMgdGlnaHRlciBpbnRlcmxlYXZpbmcsIGJ1dCB3aXRoIG1vcmUgb3ZlcmhlYWQpIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgZnJhZ19pbnRlcmxlYXZlKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAotICAgIHsgImVuY3J5cHRpb25fc2NoZW1lIiwgICAgIkNvbmZpZ3VyZXMgdGhlIGVuY3J5cHRpb24gc2NoZW1lLCBhbGxvd2VkIHZhbHVlcyBhcmUgbm9uZSwgY2VuYy1hZXMtY3RyIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgZW5jcnlwdGlvbl9zY2hlbWVfc3RyKSwgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIC5mbGFncyA9IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAudW5pdCA9ICJtb3ZmbGFncyIgfSwKLSAgICB7ICJlbmNyeXB0aW9uX2tleSIsICJUaGUgbWVkaWEgZW5jcnlwdGlvbiBrZXkgKGhleCkiLCBvZmZzZXRvZihNT1ZNdXhDb250ZXh0LCBlbmNyeXB0aW9uX2tleSksIEFWX09QVF9UWVBFX0JJTkFSWSwgLmZsYWdzID0gQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sIC51bml0ID0gIm1vdmZsYWdzIiB9LAotICAgIHsgImVuY3J5cHRpb25fa2lkIiwgIlRoZSBtZWRpYSBlbmNyeXB0aW9uIGtleSBpZGVudGlmaWVyIChoZXgpIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgZW5jcnlwdGlvbl9raWQpLCBBVl9PUFRfVFlQRV9CSU5BUlksIC5mbGFncyA9IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAudW5pdCA9ICJtb3ZmbGFncyIgfSwKKyAgICB7ICJlbmNyeXB0aW9uX3NjaGVtZSIsICAgICJDb25maWd1cmVzIHRoZSBlbmNyeXB0aW9uIHNjaGVtZSwgYWxsb3dlZCB2YWx1ZXMgYXJlIG5vbmUsIGNlbmMtYWVzLWN0ciIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIGVuY3J5cHRpb25fc2NoZW1lX3N0ciksICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAuZmxhZ3MgPSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgImVuY3J5cHRpb25fa2V5IiwgIlRoZSBtZWRpYSBlbmNyeXB0aW9uIGtleSAoaGV4KSIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIGVuY3J5cHRpb25fa2V5KSwgQVZfT1BUX1RZUEVfQklOQVJZLCAuZmxhZ3MgPSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgImVuY3J5cHRpb25fa2lkIiwgIlRoZSBtZWRpYSBlbmNyeXB0aW9uIGtleSBpZGVudGlmaWVyIChoZXgpIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgZW5jcnlwdGlvbl9raWQpLCBBVl9PUFRfVFlQRV9CSU5BUlksIC5mbGFncyA9IEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCisgICAgeyAidXNlX3N0cmVhbV9pZHNfYXNfdHJhY2tfaWRzIiwgInVzZSBzdHJlYW0gaWRzIGFzIHRyYWNrIGlkcyIsIG9mZnNldG9mKE1PVk11eENvbnRleHQsIHVzZV9zdHJlYW1faWRzX2FzX3RyYWNrX2lkcyksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIDAsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICB7ICJ3cml0ZV90bWNkIiwgImZvcmNlIG9yIGRpc2FibGUgd3JpdGluZyB0bWNkIiwgb2Zmc2V0b2YoTU9WTXV4Q29udGV4dCwgd3JpdGVfdG1jZCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gLTF9LCAtMSwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LAogICAgIHsgTlVMTCB9LAogfTsKIApAQCAtMTI4LDYgKzE0MCwyMiBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGlzX2NvdmVyX2ltYWdlKGNvbnN0IEFWU3RyZWFtICpzdCkKK3sKKyAgICAvKiBFZy4gQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDIHwgQVZfRElTUE9TSVRJT05fVElNRURfVEhVTUJOQUlMUworICAgICAqIGlzIGVuY29kZWQgYXMgc3BhcnNlIHZpZGVvIHRyYWNrICovCisgICAgcmV0dXJuIHN0ICYmIHN0LT5kaXNwb3NpdGlvbiA9PSBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUM7Cit9CisKK3N0YXRpYyBpbnQgcnRwX2hpbnRpbmdfbmVlZGVkKGNvbnN0IEFWU3RyZWFtICpzdCkKK3sKKyAgICAvKiBBZGQgaGludCB0cmFja3MgZm9yIGVhY2ggcmVhbCBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtICovCisgICAgaWYgKGlzX2NvdmVyX2ltYWdlKHN0KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTzsKK30KKwogLyogQ2h1bmsgb2Zmc2V0IGF0b20gKi8KIHN0YXRpYyBpbnQgbW92X3dyaXRlX3N0Y29fdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQogewpAQCAtMjQxLDYgKzI2OSwzMCBAQAogICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKIH0KIAorLyogU2FtcGxlIGRlcGVuZGVuY3kgYXRvbSAqLworc3RhdGljIGludCBtb3Zfd3JpdGVfc2R0cF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCit7CisgICAgaW50IGk7CisgICAgdWludDhfdCBsZWFkaW5nLCBkZXBlbmRlbnQsIHJlZmVyZW5jZSwgcmVkdW5kYW5jeTsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLy8gc2l6ZQorICAgIGZmaW9fd2ZvdXJjYyhwYiwgInNkdHAiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvLyB2ZXJzaW9uICYgZmxhZ3MKKyAgICBmb3IgKGkgPSAwOyBpIDwgdHJhY2stPmVudHJ5OyBpKyspIHsKKyAgICAgICAgZGVwZW5kZW50ID0gTU9WX1NBTVBMRV9ERVBFTkRFTkNZX1lFUzsKKyAgICAgICAgbGVhZGluZyA9IHJlZmVyZW5jZSA9IHJlZHVuZGFuY3kgPSBNT1ZfU0FNUExFX0RFUEVOREVOQ1lfVU5LTk9XTjsKKyAgICAgICAgaWYgKHRyYWNrLT5jbHVzdGVyW2ldLmZsYWdzICYgTU9WX0RJU1BPU0FCTEVfU0FNUExFKSB7CisgICAgICAgICAgICByZWZlcmVuY2UgPSBNT1ZfU0FNUExFX0RFUEVOREVOQ1lfTk87CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNrLT5jbHVzdGVyW2ldLmZsYWdzICYgTU9WX1NZTkNfU0FNUExFKSB7CisgICAgICAgICAgICBkZXBlbmRlbnQgPSBNT1ZfU0FNUExFX0RFUEVOREVOQ1lfTk87CisgICAgICAgIH0KKyAgICAgICAgYXZpb193OChwYiwgKGxlYWRpbmcgPDwgNikgICB8IChkZXBlbmRlbnQgPDwgNCkgfAorICAgICAgICAgICAgICAgICAgICAocmVmZXJlbmNlIDw8IDIpIHwgcmVkdW5kYW5jeSk7CisgICAgfQorICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKwogc3RhdGljIGludCBtb3Zfd3JpdGVfYW1yX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKIHsKICAgICBhdmlvX3diMzIocGIsIDB4MTEpOyAvKiBzaXplICovCkBAIC0zMzQsMjMgKzM4NiwyMiBAQAogI2lmIENPTkZJR19BQzNfUEFSU0VSCiBzdGF0aWMgaW50IGhhbmRsZV9lYWMzKE1PVk11eENvbnRleHQgKm1vdiwgQVZQYWNrZXQgKnBrdCwgTU9WVHJhY2sgKnRyYWNrKQogewotICAgIEdldEJpdENvbnRleHQgZ2JjOwotICAgIEFDM0hlYWRlckluZm8gdG1wLCAqaGRyID0gJnRtcDsKKyAgICBBQzNIZWFkZXJJbmZvICpoZHIgPSBOVUxMOwogICAgIHN0cnVjdCBlYWMzX2luZm8gKmluZm87Ci0gICAgaW50IG51bV9ibG9ja3M7CisgICAgaW50IG51bV9ibG9ja3MsIHJldDsKIAogICAgIGlmICghdHJhY2stPmVhYzNfcHJpdiAmJiAhKHRyYWNrLT5lYWMzX3ByaXYgPSBhdl9tYWxsb2N6KHNpemVvZigqaW5mbykpKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBpbmZvID0gdHJhY2stPmVhYzNfcHJpdjsKIAotICAgIGluaXRfZ2V0X2JpdHMoJmdiYywgcGt0LT5kYXRhLCBwa3QtPnNpemUgKiA4KTsKLSAgICBpZiAoYXZwcml2X2FjM19wYXJzZV9oZWFkZXIoJmdiYywgJmhkcikgPCAwKSB7CisgICAgaWYgKGF2cHJpdl9hYzNfcGFyc2VfaGVhZGVyKCZoZHIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKSA8IDApIHsKICAgICAgICAgLyogZHJvcCB0aGUgcGFja2V0cyB1bnRpbCB3ZSBzZWUgYSBnb29kIG9uZSAqLwogICAgICAgICBpZiAoIXRyYWNrLT5lbnRyeSkgewotICAgICAgICAgICAgYXZfbG9nKG1vdiwgQVZfTE9HX1dBUk5JTkcsICJEcm9wcGluZyBpbnZhbGlkIHBhY2tldCBmcm9tIHN0YXJ0IG9mIHRoZSBzdHJlYW1cbiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX1dBUk5JTkcsICJEcm9wcGluZyBpbnZhbGlkIHBhY2tldCBmcm9tIHN0YXJ0IG9mIHRoZSBzdHJlYW1cbiIpOworICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKICAgICBpbmZvLT5kYXRhX3JhdGUgPSBGRk1BWChpbmZvLT5kYXRhX3JhdGUsIGhkci0+Yml0X3JhdGUgLyAxMDAwKTsKQEAgLTM1OCwyNSArNDA5LDM2IEBACiAKICAgICBpZiAoIWluZm8tPmVjM19kb25lKSB7CiAgICAgICAgIC8qIEFDLTMgc3Vic3RyZWFtIG11c3QgYmUgdGhlIGZpcnN0IG9uZSAqLwotICAgICAgICBpZiAoaGRyLT5iaXRzdHJlYW1faWQgPD0gMTAgJiYgaGRyLT5zdWJzdHJlYW1pZCAhPSAwKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgaWYgKGhkci0+Yml0c3RyZWFtX2lkIDw9IDEwICYmIGhkci0+c3Vic3RyZWFtaWQgIT0gMCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KIAogICAgICAgICAvKiB0aGlzIHNob3VsZCBhbHdheXMgYmUgdGhlIGNhc2UsIGdpdmVuIHRoYXQgb3VyIEFDLTMgcGFyc2VyCiAgICAgICAgICAqIGNvbmNhdGVuYXRlcyBkZXBlbmRlbnQgZnJhbWVzIHRvIHRoZWlyIGluZGVwZW5kZW50IHBhcmVudCAqLwogICAgICAgICBpZiAoaGRyLT5mcmFtZV90eXBlID09IEVBQzNfRlJBTUVfVFlQRV9JTkRFUEVOREVOVCkgewogICAgICAgICAgICAgLyogc3Vic3RyZWFtIGlkcyBtdXN0IGJlIGluY3JlbWVudGFsICovCi0gICAgICAgICAgICBpZiAoaGRyLT5zdWJzdHJlYW1pZCA+IGluZm8tPm51bV9pbmRfc3ViICsgMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgaWYgKGhkci0+c3Vic3RyZWFtaWQgPiBpbmZvLT5udW1faW5kX3N1YiArIDEpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChoZHItPnN1YnN0cmVhbWlkID09IGluZm8tPm51bV9pbmRfc3ViICsgMSkgewogICAgICAgICAgICAgICAgIC8vaW5mby0+bnVtX2luZF9zdWIrKzsKLSAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUodHJhY2stPmVuYywgIk11bHRpcGxlIGluZGVwZW5kZW50IHN1YnN0cmVhbXMiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKG1vdi0+ZmMsICJNdWx0aXBsZSBpbmRlcGVuZGVudCBzdWJzdHJlYW1zIik7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGhkci0+c3Vic3RyZWFtaWQgPCBpbmZvLT5udW1faW5kX3N1YiB8fAogICAgICAgICAgICAgICAgICAgICAgICBoZHItPnN1YnN0cmVhbWlkID09IDAgJiYgaW5mby0+c3Vic3RyZWFtWzBdLmJzaWQpIHsKICAgICAgICAgICAgICAgICBpbmZvLT5lYzNfZG9uZSA9IDE7CiAgICAgICAgICAgICAgICAgZ290byBjb25jYXRlbmF0ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChoZHItPnN1YnN0cmVhbWlkICE9IDApIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUobW92LT5mYywgIk11bHRpcGxlIG5vbiBFQUMzIGluZGVwZW5kZW50IHN1YnN0cmVhbXMiKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIGZpbGwgdGhlIGluZm8gbmVlZGVkIGZvciB0aGUgImRlYzMiIGF0b20gKi8KQEAgLTM5MiwxNiArNDU0LDIwIEBACiAgICAgICAgICAgICBpbnQgcGFyZW50ID0gaGRyLT5zdWJzdHJlYW1pZDsKIAogICAgICAgICAgICAgd2hpbGUgKGN1bXVsX3NpemUgIT0gcGt0LT5zaXplKSB7CisgICAgICAgICAgICAgICAgR2V0Qml0Q29udGV4dCBnYmM7CiAgICAgICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0cygmZ2JjLCBwa3QtPmRhdGEgKyBjdW11bF9zaXplLCAocGt0LT5zaXplIC0gY3VtdWxfc2l6ZSkgKiA4KTsKLSAgICAgICAgICAgICAgICBpZiAoYXZwcml2X2FjM19wYXJzZV9oZWFkZXIoJmdiYywgJmhkcikgPCAwKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICBpZiAoaGRyLT5mcmFtZV90eXBlICE9IEVBQzNfRlJBTUVfVFlQRV9ERVBFTkRFTlQpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICAgICAgY3VtdWxfc2l6ZSArPSBoZHItPmZyYW1lX3NpemU7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZwcml2X2FjM19wYXJzZV9oZWFkZXIoJmhkciwgcGt0LT5kYXRhICsgY3VtdWxfc2l6ZSwgcGt0LT5zaXplIC0gY3VtdWxfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIGlmIChoZHItPmZyYW1lX3R5cGUgIT0gRUFDM19GUkFNRV9UWVBFX0RFUEVOREVOVCkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpbmZvLT5zdWJzdHJlYW1bcGFyZW50XS5udW1fZGVwX3N1YisrOworICAgICAgICAgICAgICAgIHJldCAvPSA4OwogCiAgICAgICAgICAgICAgICAgLyogaGVhZGVyIGlzIHBhcnNlZCB1cCB0byBsZmVvbiwgYnV0IGN1c3RvbSBjaGFubmVsIG1hcCBtYXkgYmUgbmVlZGVkICovCisgICAgICAgICAgICAgICAgaW5pdF9nZXRfYml0czgoJmdiYywgcGt0LT5kYXRhICsgY3VtdWxfc2l6ZSArIHJldCwgcGt0LT5zaXplIC0gY3VtdWxfc2l6ZSAtIHJldCk7CiAgICAgICAgICAgICAgICAgLyogc2tpcCBic2lkICovCiAgICAgICAgICAgICAgICAgc2tpcF9iaXRzKCZnYmMsIDUpOwogICAgICAgICAgICAgICAgIC8qIHNraXAgdm9sdW1lIGNvbnRyb2wgcGFyYW1zICovCkBAIC00MTYsNDEgKzQ4Miw0NiBAQAogICAgICAgICAgICAgICAgICAgICBpbmZvLT5zdWJzdHJlYW1bcGFyZW50XS5jaGFuX2xvYyB8PSAoZ2V0X2JpdHMoJmdiYywgMTYpID4+IDUpICYgMHgxZjsKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGluZm8tPnN1YnN0cmVhbVtwYXJlbnRdLmNoYW5fbG9jIHw9IGhkci0+Y2hhbm5lbF9tb2RlOworICAgICAgICAgICAgICAgIGN1bXVsX3NpemUgKz0gaGRyLT5mcmFtZV9zaXplOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiBjb25jYXRlbmF0ZToKLSAgICBpZiAoIWluZm8tPm51bV9ibG9ja3MgJiYgbnVtX2Jsb2NrcyA9PSA2KQotICAgICAgICByZXR1cm4gcGt0LT5zaXplOwotICAgIGVsc2UgaWYgKGluZm8tPm51bV9ibG9ja3MgKyBudW1fYmxvY2tzID4gNikKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKCFpbmZvLT5udW1fYmxvY2tzICYmIG51bV9ibG9ja3MgPT0gNikgeworICAgICAgICByZXQgPSBwa3QtPnNpemU7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKyAgICBlbHNlIGlmIChpbmZvLT5udW1fYmxvY2tzICsgbnVtX2Jsb2NrcyA+IDYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQogCiAgICAgaWYgKCFpbmZvLT5udW1fYmxvY2tzKSB7Ci0gICAgICAgIGludCByZXQ7Ci0gICAgICAgIGlmICgocmV0ID0gYXZfY29weV9wYWNrZXQoJmluZm8tPnBrdCwgcGt0KSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgaW5mby0+bnVtX2Jsb2NrcyA9IG51bV9ibG9ja3M7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXQgPSBhdl9wYWNrZXRfcmVmKCZpbmZvLT5wa3QsIHBrdCk7CisgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgaW5mby0+bnVtX2Jsb2NrcyA9IG51bV9ibG9ja3M7CisgICAgICAgIGdvdG8gZW5kOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCByZXQ7CiAgICAgICAgIGlmICgocmV0ID0gYXZfZ3Jvd19wYWNrZXQoJmluZm8tPnBrdCwgcGt0LT5zaXplKSkgPCAwKQotICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICBtZW1jcHkoaW5mby0+cGt0LmRhdGEgKyBpbmZvLT5wa3Quc2l6ZSAtIHBrdC0+c2l6ZSwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOwogICAgICAgICBpbmZvLT5udW1fYmxvY2tzICs9IG51bV9ibG9ja3M7CiAgICAgICAgIGluZm8tPnBrdC5kdXJhdGlvbiArPSBwa3QtPmR1cmF0aW9uOwogICAgICAgICBpZiAoKHJldCA9IGF2X2NvcHlfcGFja2V0X3NpZGVfZGF0YSgmaW5mby0+cGt0LCBwa3QpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgICAgIGlmIChpbmZvLT5udW1fYmxvY2tzICE9IDYpCi0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKLSAgICAgICAgaWYgKChyZXQgPSBhdl9jb3B5X3BhY2tldChwa3QsICZpbmZvLT5wa3QpKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJmluZm8tPnBrdCk7CisgICAgICAgIGF2X3BhY2tldF9tb3ZlX3JlZihwa3QsICZpbmZvLT5wa3QpOwogICAgICAgICBpbmZvLT5udW1fYmxvY2tzID0gMDsKICAgICB9CisgICAgcmV0ID0gcGt0LT5zaXplOwogCi0gICAgcmV0dXJuIHBrdC0+c2l6ZTsKK2VuZDoKKyAgICBhdl9mcmVlKGhkcik7CisKKyAgICByZXR1cm4gcmV0OwogfQogI2VuZGlmCiAKQEAgLTUxMyw4ICs1ODQsOCBAQAogICovCiBzdGF0aWMgaW50IG1vdl93cml0ZV9leHRyYWRhdGFfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQogewotICAgIGF2aW9fd3JpdGUocGIsIHRyYWNrLT5lbmMtPmV4dHJhZGF0YSwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhX3NpemUpOwotICAgIHJldHVybiB0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZTsKKyAgICBhdmlvX3dyaXRlKHBiLCB0cmFjay0+cGFyLT5leHRyYWRhdGEsIHRyYWNrLT5wYXItPmV4dHJhZGF0YV9zaXplKTsKKyAgICByZXR1cm4gdHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemU7CiB9CiAKIHN0YXRpYyBpbnQgbW92X3dyaXRlX2VuZGFfdGFnKEFWSU9Db250ZXh0ICpwYikKQEAgLTU3MywxOCArNjQ0LDE4IEBACiAgICAgcHV0X2Rlc2NyKHBiLCAweDA0LCAxMyArIGRlY29kZXJfc3BlY2lmaWNfaW5mb19sZW4pOwogCiAgICAgLy8gT2JqZWN0IHR5cGUgaW5kaWNhdGlvbgotICAgIGlmICgodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAyIHx8Ci0gICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpICYmCi0gICAgICAgIHRyYWNrLT5lbmMtPnNhbXBsZV9yYXRlID4gMjQwMDApCisgICAgaWYgKCh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIgfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMykgJiYKKyAgICAgICAgdHJhY2stPnBhci0+c2FtcGxlX3JhdGUgPiAyNDAwMCkKICAgICAgICAgYXZpb193OChwYiwgMHg2Qik7IC8vIDExMTcyLTMKICAgICBlbHNlCi0gICAgICAgIGF2aW9fdzgocGIsIGZmX2NvZGVjX2dldF90YWcoZmZfbXA0X29ial90eXBlLCB0cmFjay0+ZW5jLT5jb2RlY19pZCkpOworICAgICAgICBhdmlvX3c4KHBiLCBmZl9jb2RlY19nZXRfdGFnKGZmX21wNF9vYmpfdHlwZSwgdHJhY2stPnBhci0+Y29kZWNfaWQpKTsKIAogICAgIC8vIHRoZSBmb2xsb3dpbmcgZmllbGRzIGlzIG1hZGUgb2YgNiBiaXRzIHRvIGlkZW50aWZ5IHRoZSBzdHJlYW10eXBlICg0IGZvciB2aWRlbywgNSBmb3IgYXVkaW8pCiAgICAgLy8gcGx1cyAxIGJpdCB0byBpbmRpY2F0ZSB1cHN0cmVhbSBhbmQgMSBiaXQgc2V0IHRvIDEgKHJlc2VydmVkKQotICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUpCisgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRSkKICAgICAgICAgYXZpb193OChwYiwgKDB4MzggPDwgMikgfCAxKTsgLy8gZmxhZ3MgKD0gTmVyb1N1YnBpY1N0cmVhbSkKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgYXZpb193OChwYiwgMHgxNSk7IC8vIGZsYWdzICg9IEF1ZGlvc3RyZWFtKQogICAgIGVsc2UKICAgICAgICAgYXZpb193OChwYiwgMHgxMSk7IC8vIGZsYWdzICg9IFZpc3VhbHN0cmVhbSkKQEAgLTU5NSw3ICs2NjYsNyBAQAogICAgIGF2aW9fd2IyNChwYiwgcHJvcHMgPyBwcm9wcy0+YnVmZmVyX3NpemUgLyA4IDogMCk7IC8vIEJ1ZmZlcnNpemUgREIKIAogICAgIGF2Z19iaXRyYXRlID0gY29tcHV0ZV9hdmdfYml0cmF0ZSh0cmFjayk7Ci0gICAgYXZpb193YjMyKHBiLCBwcm9wcyA/IEZGTUFYMyhwcm9wcy0+bWF4X2JpdHJhdGUsIHByb3BzLT5hdmdfYml0cmF0ZSwgYXZnX2JpdHJhdGUpIDogRkZNQVgodHJhY2stPmVuYy0+Yml0X3JhdGUsIGF2Z19iaXRyYXRlKSk7IC8vIG1heGJpdHJhdGUgKEZJWE1FIHNob3VsZCBiZSBtYXggcmF0ZSBpbiBhbnkgMSBzZWMgd2luZG93KQorICAgIGF2aW9fd2IzMihwYiwgcHJvcHMgPyBGRk1BWDMocHJvcHMtPm1heF9iaXRyYXRlLCBwcm9wcy0+YXZnX2JpdHJhdGUsIGF2Z19iaXRyYXRlKSA6IEZGTUFYKHRyYWNrLT5wYXItPmJpdF9yYXRlLCBhdmdfYml0cmF0ZSkpOyAvLyBtYXhiaXRyYXRlIChGSVhNRSBzaG91bGQgYmUgbWF4IHJhdGUgaW4gYW55IDEgc2VjIHdpbmRvdykKICAgICBhdmlvX3diMzIocGIsIGF2Z19iaXRyYXRlKTsKIAogICAgIGlmICh0cmFjay0+dm9zX2xlbikgewpAQCAtNjI2LDM5ICs2OTcsODIgQEAKICAgICAgICAgICAgY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0Y2NEJFOwogfQogCi1zdGF0aWMgaW50IG1vdl93cml0ZV9tc190YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCitzdGF0aWMgaW50IG1vdl93cml0ZV9tc190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKIHsKICAgICBpbnQgcmV0OwogICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKICAgICBhdmlvX3diMzIocGIsIDApOwogICAgIGF2aW9fd2wzMihwYiwgdHJhY2stPnRhZyk7IC8vIHN0b3JlIGl0IGJ5dGVzd2FwcGVkCi0gICAgdHJhY2stPmVuYy0+Y29kZWNfdGFnID0gYXZfYnN3YXAxNih0cmFjay0+dGFnID4+IDE2KTsKLSAgICBpZiAoKHJldCA9IGZmX3B1dF93YXZfaGVhZGVyKHBiLCB0cmFjay0+ZW5jLCAwKSkgPCAwKQorICAgIHRyYWNrLT5wYXItPmNvZGVjX3RhZyA9IGF2X2Jzd2FwMTYodHJhY2stPnRhZyA+PiAxNik7CisgICAgaWYgKChyZXQgPSBmZl9wdXRfd2F2X2hlYWRlcihzLCBwYiwgdHJhY2stPnBhciwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKICAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7CiB9CiAKLXN0YXRpYyBpbnQgbW92X3dyaXRlX3dmZXhfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQorc3RhdGljIGludCBtb3Zfd3JpdGVfd2ZleF90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKIHsKICAgICBpbnQgcmV0OwogICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKICAgICBhdmlvX3diMzIocGIsIDApOwogICAgIGZmaW9fd2ZvdXJjYyhwYiwgIndmZXgiKTsKLSAgICBpZiAoKHJldCA9IGZmX3B1dF93YXZfaGVhZGVyKHBiLCB0cmFjay0+ZW5jLCBGRl9QVVRfV0FWX0hFQURFUl9GT1JDRV9XQVZFRk9STUFURVgpKSA8IDApCisgICAgaWYgKChyZXQgPSBmZl9wdXRfd2F2X2hlYWRlcihzLCBwYiwgdHJhY2stPnN0LT5jb2RlY3BhciwgRkZfUFVUX1dBVl9IRUFERVJfRk9SQ0VfV0FWRUZPUk1BVEVYKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKIH0KIAotc3RhdGljIGludCBtb3Zfd3JpdGVfY2hhbl90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCitzdGF0aWMgaW50IG1vdl93cml0ZV9kZmxhX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBmZmlvX3dmb3VyY2MocGIsICJkZkxhIik7CisgICAgYXZpb193OChwYiwgMCk7IC8qIHZlcnNpb24gKi8KKyAgICBhdmlvX3diMjQocGIsIDApOyAvKiBmbGFncyAqLworCisgICAgLyogRXhwZWN0IHRoZSBlbmNvZGVyIHRvIHBhc3MgYSBNRVRBREFUQV9CTE9DS19UWVBFX1NUUkVBTUlORk8uICovCisgICAgaWYgKHRyYWNrLT5wYXItPmV4dHJhZGF0YV9zaXplICE9IEZMQUNfU1RSRUFNSU5GT19TSVpFKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIC8qIFRPRE86IFdyaXRlIG90aGVyIE1FVEFEQVRBX0JMT0NLX1RZUEVzIGlmIHRoZSBlbmNvZGVyIG1ha2VzIHRoZW0gYXZhaWxhYmxlLiAqLworICAgIGF2aW9fdzgocGIsIDEgPDwgNyB8IEZMQUNfTUVUQURBVEFfVFlQRV9TVFJFQU1JTkZPKTsgLyogTGFzdE1ldGFkYXRhQmxvY2tGbGFnIDw8IDcgfCBCbG9ja1R5cGUgKi8KKyAgICBhdmlvX3diMjQocGIsIHRyYWNrLT5wYXItPmV4dHJhZGF0YV9zaXplKTsgLyogTGVuZ3RoICovCisgICAgYXZpb193cml0ZShwYiwgdHJhY2stPnBhci0+ZXh0cmFkYXRhLCB0cmFjay0+cGFyLT5leHRyYWRhdGFfc2l6ZSk7IC8qIEJsb2NrRGF0YVtMZW5ndGhdICovCisKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2RvcHNfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImRPcHMiKTsKKyAgICBhdmlvX3c4KHBiLCAwKTsgLyogVmVyc2lvbiAqLworICAgIGlmICh0cmFjay0+cGFyLT5leHRyYWRhdGFfc2l6ZSA8IDE5KSB7CisgICAgICAgIGF2X2xvZyhwYiwgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBleHRyYWRhdGEgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKyAgICAvKiBleHRyYWRhdGEgY29udGFpbnMgYW4gT2dnIE9wdXNIZWFkLCBvdGhlciB0aGFuIGJ5dGUtb3JkZXJpbmcgYW5kCisgICAgICAgT3B1c0hlYWQncyBwcmVjZWVkaW5nIG1hZ2ljL3ZlcnNpb24sIE9wdXNTcGVjaWZpY0JveCBpcyBjdXJyZW50bHkKKyAgICAgICBpZGVudGljYWwuICovCisgICAgYXZpb193OChwYiwgQVZfUkI4KHRyYWNrLT5wYXItPmV4dHJhZGF0YSArIDkpKTsgLyogT3VwdXRDaGFubmVsQ291bnQgKi8KKyAgICBhdmlvX3diMTYocGIsIEFWX1JMMTYodHJhY2stPnBhci0+ZXh0cmFkYXRhICsgMTApKTsgLyogUHJlU2tpcCAqLworICAgIGF2aW9fd2IzMihwYiwgQVZfUkwzMih0cmFjay0+cGFyLT5leHRyYWRhdGEgKyAxMikpOyAvKiBJbnB1dFNhbXBsZVJhdGUgKi8KKyAgICBhdmlvX3diMTYocGIsIEFWX1JMMTYodHJhY2stPnBhci0+ZXh0cmFkYXRhICsgMTYpKTsgLyogT3V0cHV0R2FpbiAqLworICAgIC8qIFdyaXRlIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgb3V0IHdpdGhvdXQgYnl0ZS1zd2FwcGluZy4gKi8KKyAgICBhdmlvX3dyaXRlKHBiLCB0cmFjay0+cGFyLT5leHRyYWRhdGEgKyAxOCwgdHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemUgLSAxOCk7CisKKyAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2NoYW5fdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgdWludDMyX3QgbGF5b3V0X3RhZywgYml0bWFwOwogICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKIAotICAgIGxheW91dF90YWcgPSBmZl9tb3ZfZ2V0X2NoYW5uZWxfbGF5b3V0X3RhZyh0cmFjay0+ZW5jLT5jb2RlY19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y2hhbm5lbF9sYXlvdXQsCisgICAgbGF5b3V0X3RhZyA9IGZmX21vdl9nZXRfY2hhbm5lbF9sYXlvdXRfdGFnKHRyYWNrLT5wYXItPmNvZGVjX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5jaGFubmVsX2xheW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpdG1hcCk7CiAgICAgaWYgKCFsYXlvdXRfdGFnKSB7Ci0gICAgICAgIGF2X2xvZyh0cmFjay0+ZW5jLCBBVl9MT0dfV0FSTklORywgIm5vdCB3cml0aW5nICdjaGFuJyB0YWcgZHVlIHRvICIKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAibm90IHdyaXRpbmcgJ2NoYW4nIHRhZyBkdWUgdG8gIgogICAgICAgICAgICAgICAgImxhY2sgb2YgY2hhbm5lbCBpbmZvcm1hdGlvblxuIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTY3Nyw0MSArNzkxLDQxIEBACiAgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOwogfQogCi1zdGF0aWMgaW50IG1vdl93cml0ZV93YXZlX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3dhdmVfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOwogCiAgICAgYXZpb193YjMyKHBiLCAwKTsgICAgIC8qIHNpemUgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJ3YXZlIik7CiAKLSAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUURNMikgeworICAgIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9RRE0yKSB7CiAgICAgYXZpb193YjMyKHBiLCAxMik7ICAgIC8qIHNpemUgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJmcm1hIik7CiAgICAgYXZpb193bDMyKHBiLCB0cmFjay0+dGFnKTsKICAgICB9CiAKLSAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgewogICAgICAgICAvKiB1c2VsZXNzIGF0b20gbmVlZGVkIGJ5IG1wbGF5ZXIsIGlwb2QsIG5vdCBuZWVkZWQgYnkgcXVpY2t0aW1lICovCiAgICAgICAgIGF2aW9fd2IzMihwYiwgMTIpOyAvKiBzaXplICovCiAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1wNGEiKTsKICAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKICAgICAgICAgbW92X3dyaXRlX2VzZHNfdGFnKHBiLCB0cmFjayk7Ci0gICAgfSBlbHNlIGlmIChtb3ZfcGNtX2xlX2d0MTYodHJhY2stPmVuYy0+Y29kZWNfaWQpKSAgeworICAgIH0gZWxzZSBpZiAobW92X3BjbV9sZV9ndDE2KHRyYWNrLT5wYXItPmNvZGVjX2lkKSkgIHsKICAgICAgIG1vdl93cml0ZV9lbmRhX3RhZyhwYik7Ci0gICAgfSBlbHNlIGlmIChtb3ZfcGNtX2JlX2d0MTYodHJhY2stPmVuYy0+Y29kZWNfaWQpKSAgeworICAgIH0gZWxzZSBpZiAobW92X3BjbV9iZV9ndDE2KHRyYWNrLT5wYXItPmNvZGVjX2lkKSkgIHsKICAgICAgIG1vdl93cml0ZV9lbmRhX3RhZ19iZShwYik7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVJfTkIpIHsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgewogICAgICAgICBtb3Zfd3JpdGVfYW1yX3RhZyhwYiwgdHJhY2spOwotICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKICAgICAgICAgbW92X3dyaXRlX2FjM190YWcocGIsIHRyYWNrKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0VBQzMpIHsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0VBQzMpIHsKICAgICAgICAgbW92X3dyaXRlX2VhYzNfdGFnKHBiLCB0cmFjayk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTEFDIHx8Ci0gICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yKSB7CisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTEFDIHx8CisgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yKSB7CiAgICAgICAgIG1vdl93cml0ZV9leHRyYWRhdGFfdGFnKHBiLCB0cmFjayk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9NUyB8fAotICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVikgewotICAgICAgICBtb3Zfd3JpdGVfbXNfdGFnKHBiLCB0cmFjayk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9NUyB8fAorICAgICAgICAgICAgICAgdHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVikgeworICAgICAgICBtb3Zfd3JpdGVfbXNfdGFnKHMsIHBiLCB0cmFjayk7CiAgICAgfQogCiAgICAgYXZpb193YjMyKHBiLCA4KTsgICAgIC8qIHNpemUgKi8KQEAgLTg4MCw3ICs5OTQsNyBAQAogewogICAgIGludCBpLCBmaXJzdF9kdXJhdGlvbjsKIAotLy8gcmV0dXJuIHRyYWNrLT5lbmMtPmZyYW1lX3NpemU7CisvLyByZXR1cm4gdHJhY2stPnBhci0+ZnJhbWVfc2l6ZTsKIAogICAgIC8qIHVzZSAxIGZvciByYXcgUENNICovCiAgICAgaWYgKCF0cmFjay0+YXVkaW9fdmJyKQpAQCAtODk3LDIyICsxMDExLDIyIEBACiAgICAgcmV0dXJuIGZpcnN0X2R1cmF0aW9uOwogfQogCi1zdGF0aWMgaW50IG1vdl93cml0ZV9hdWRpb190YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsIE1PVlRyYWNrICp0cmFjaykKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2F1ZGlvX3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOwogICAgIGludCB2ZXJzaW9uID0gMDsKICAgICB1aW50MzJfdCB0YWcgPSB0cmFjay0+dGFnOwogCiAgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WKSB7Ci0gICAgICAgIGlmICh0cmFjay0+dGltZXNjYWxlID4gVUlOVDE2X01BWCkgewotICAgICAgICAgICAgaWYgKG1vdl9nZXRfbHBjbV9mbGFncyh0cmFjay0+ZW5jLT5jb2RlY19pZCkpCisgICAgICAgIGlmICh0cmFjay0+dGltZXNjYWxlID4gVUlOVDE2X01BWCB8fCAhdHJhY2stPnBhci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgICAgIGlmIChtb3ZfZ2V0X2xwY21fZmxhZ3ModHJhY2stPnBhci0+Y29kZWNfaWQpKQogICAgICAgICAgICAgICAgIHRhZyA9IEFWX1JMMzIoImxwY20iKTsKICAgICAgICAgICAgIHZlcnNpb24gPSAyOwotICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5hdWRpb192YnIgfHwgbW92X3BjbV9sZV9ndDE2KHRyYWNrLT5lbmMtPmNvZGVjX2lkKSB8fAotICAgICAgICAgICAgICAgICAgIG1vdl9wY21fYmVfZ3QxNih0cmFjay0+ZW5jLT5jb2RlY19pZCkgfHwKLSAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9NUyB8fAotICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYgfHwKLSAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmF1ZGlvX3ZiciB8fCBtb3ZfcGNtX2xlX2d0MTYodHJhY2stPnBhci0+Y29kZWNfaWQpIHx8CisgICAgICAgICAgICAgICAgICAgbW92X3BjbV9iZV9ndDE2KHRyYWNrLT5wYXItPmNvZGVjX2lkKSB8fAorICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX01TIHx8CisgICAgICAgICAgICAgICAgICAgdHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBViB8fAorICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1FETTIpIHsKICAgICAgICAgICAgIHZlcnNpb24gPSAxOwogICAgICAgICB9CiAgICAgfQpAQCAtOTM5LDc2ICsxMDUzLDkyIEBACiAgICAgICAgIGF2aW9fd2IxNihwYiwgMCk7CiAgICAgICAgIGF2aW9fd2IzMihwYiwgMHgwMDAxMDAwMCk7CiAgICAgICAgIGF2aW9fd2IzMihwYiwgNzIpOwotICAgICAgICBhdmlvX3diNjQocGIsIGF2X2RvdWJsZTJpbnQodHJhY2stPmVuYy0+c2FtcGxlX3JhdGUpKTsKLSAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT5jaGFubmVscyk7CisgICAgICAgIGF2aW9fd2I2NChwYiwgYXZfZG91YmxlMmludCh0cmFjay0+cGFyLT5zYW1wbGVfcmF0ZSkpOworICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5wYXItPmNoYW5uZWxzKTsKICAgICAgICAgYXZpb193YjMyKHBiLCAweDdGMDAwMDAwKTsKLSAgICAgICAgYXZpb193YjMyKHBiLCBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHRyYWNrLT5lbmMtPmNvZGVjX2lkKSk7Ci0gICAgICAgIGF2aW9fd2IzMihwYiwgbW92X2dldF9scGNtX2ZsYWdzKHRyYWNrLT5lbmMtPmNvZGVjX2lkKSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZSh0cmFjay0+cGFyLT5jb2RlY19pZCkpOworICAgICAgICBhdmlvX3diMzIocGIsIG1vdl9nZXRfbHBjbV9mbGFncyh0cmFjay0+cGFyLT5jb2RlY19pZCkpOwogICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5zYW1wbGVfc2l6ZSk7CiAgICAgICAgIGF2aW9fd2IzMihwYiwgZ2V0X3NhbXBsZXNfcGVyX3BhY2tldCh0cmFjaykpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PVikgewotICAgICAgICAgICAgYXZpb193YjE2KHBiLCB0cmFjay0+ZW5jLT5jaGFubmVscyk7Ci0gICAgICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1U4IHx8Ci0gICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1M4KQorICAgICAgICAgICAgYXZpb193YjE2KHBiLCB0cmFjay0+cGFyLT5jaGFubmVscyk7CisgICAgICAgICAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1U4IHx8CisgICAgICAgICAgICAgICAgdHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1M4KQogICAgICAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgOCk7IC8qIGJpdHMgcGVyIHNhbXBsZSAqLwotICAgICAgICAgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fRzcyNikKLSAgICAgICAgICAgICAgICBhdmlvX3diMTYocGIsIHRyYWNrLT5lbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2KQorICAgICAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgdHJhY2stPnBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBhdmlvX3diMTYocGIsIDE2KTsKICAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgdHJhY2stPmF1ZGlvX3ZiciA/IC0yIDogMCk7IC8qIGNvbXByZXNzaW9uIElEICovCiAgICAgICAgIH0gZWxzZSB7IC8qIHJlc2VydmVkIGZvciBtcDQvM2dwICovCi0gICAgICAgICAgICBhdmlvX3diMTYocGIsIDIpOwotICAgICAgICAgICAgYXZpb193YjE2KHBiLCAxNik7CisgICAgICAgICAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxBQyB8fAorICAgICAgICAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKKyAgICAgICAgICAgICAgICBhdmlvX3diMTYocGIsIHRyYWNrLT5wYXItPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZpb193YjE2KHBiLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFDKSB7CisgICAgICAgICAgICAgICAgYXZpb193YjE2KHBiLCB0cmFjay0+cGFyLT5iaXRzX3Blcl9yYXdfc2FtcGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZpb193YjE2KHBiLCAxNik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdmlvX3diMTYocGIsIDApOwogICAgICAgICB9CiAKICAgICAgICAgYXZpb193YjE2KHBiLCAwKTsgLyogcGFja2V0IHNpemUgKD0gMCkgKi8KLSAgICAgICAgYXZpb193YjE2KHBiLCB0cmFjay0+ZW5jLT5zYW1wbGVfcmF0ZSA8PSBVSU5UMTZfTUFYID8KLSAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5zYW1wbGVfcmF0ZSA6IDApOworICAgICAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgNDgwMDApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhdmlvX3diMTYocGIsIHRyYWNrLT5wYXItPnNhbXBsZV9yYXRlIDw9IFVJTlQxNl9NQVggPworICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5zYW1wbGVfcmF0ZSA6IDApOwogICAgICAgICBhdmlvX3diMTYocGIsIDApOyAvKiBSZXNlcnZlZCAqLwogICAgIH0KIAogICAgIGlmICh2ZXJzaW9uID09IDEpIHsgLyogU291bmREZXNjcmlwdGlvbiBWMSBleHRlbmRlZCBpbmZvICovCi0gICAgICAgIGlmIChtb3ZfcGNtX2xlX2d0MTYodHJhY2stPmVuYy0+Y29kZWNfaWQpIHx8Ci0gICAgICAgICAgICBtb3ZfcGNtX2JlX2d0MTYodHJhY2stPmVuYy0+Y29kZWNfaWQpKQorICAgICAgICBpZiAobW92X3BjbV9sZV9ndDE2KHRyYWNrLT5wYXItPmNvZGVjX2lkKSB8fAorICAgICAgICAgICAgbW92X3BjbV9iZV9ndDE2KHRyYWNrLT5wYXItPmNvZGVjX2lkKSkKICAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMSk7IC8qICBtdXN0IGJlIDEgZm9yICB1bmNvbXByZXNzZWQgZm9ybWF0cyAqLwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbmMtPmZyYW1lX3NpemUpOyAvKiBTYW1wbGVzIHBlciBwYWNrZXQgKi8KLSAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+c2FtcGxlX3NpemUgLyB0cmFjay0+ZW5jLT5jaGFubmVscyk7IC8qIEJ5dGVzIHBlciBwYWNrZXQgKi8KKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnBhci0+ZnJhbWVfc2l6ZSk7IC8qIFNhbXBsZXMgcGVyIHBhY2tldCAqLworICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5zYW1wbGVfc2l6ZSAvIHRyYWNrLT5wYXItPmNoYW5uZWxzKTsgLyogQnl0ZXMgcGVyIHBhY2tldCAqLwogICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5zYW1wbGVfc2l6ZSk7IC8qIEJ5dGVzIHBlciBmcmFtZSAqLwogICAgICAgICBhdmlvX3diMzIocGIsIDIpOyAvKiBCeXRlcyBwZXIgc2FtcGxlICovCiAgICAgfQogCiAgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WICYmCi0gICAgICAgICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgICAgICAgICAgIHx8Ci0gICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMgICAgICAgICAgIHx8Ci0gICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzICAgICAgICAgIHx8Ci0gICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVJfTkIgICAgICAgIHx8Ci0gICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTEFDICAgICAgICAgIHx8Ci0gICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9NUyAgICAgIHx8Ci0gICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWIHx8Ci0gICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9RRE0yICAgICAgICAgIHx8Ci0gICAgICAgICAobW92X3BjbV9sZV9ndDE2KHRyYWNrLT5lbmMtPmNvZGVjX2lkKSAmJiB2ZXJzaW9uPT0xKSB8fAotICAgICAgICAgKG1vdl9wY21fYmVfZ3QxNih0cmFjay0+ZW5jLT5jb2RlY19pZCkgJiYgdmVyc2lvbj09MSkpKQotICAgICAgICBtb3Zfd3JpdGVfd2F2ZV90YWcocGIsIHRyYWNrKTsKKyAgICAgICAgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAgICAgICAgICAgfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMyAgICAgICAgICAgfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0VBQzMgICAgICAgICAgfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQiAgICAgICAgfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FMQUMgICAgICAgICAgfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX01TICAgICAgfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYgfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1FETTIgICAgICAgICAgfHwKKyAgICAgICAgIChtb3ZfcGNtX2xlX2d0MTYodHJhY2stPnBhci0+Y29kZWNfaWQpICYmIHZlcnNpb249PTEpIHx8CisgICAgICAgICAobW92X3BjbV9iZV9ndDE2KHRyYWNrLT5wYXItPmNvZGVjX2lkKSAmJiB2ZXJzaW9uPT0xKSkpCisgICAgICAgIG1vdl93cml0ZV93YXZlX3RhZyhzLCBwYiwgdHJhY2spOwogICAgIGVsc2UgaWYgKHRyYWNrLT50YWcgPT0gTUtUQUcoJ20nLCdwJywnNCcsJ2EnKSkKICAgICAgICAgbW92X3dyaXRlX2VzZHNfdGFnKHBiLCB0cmFjayk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKQorICAgIGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikKICAgICAgICAgbW92X3dyaXRlX2Ftcl90YWcocGIsIHRyYWNrKTsKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpCisgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKQogICAgICAgICBtb3Zfd3JpdGVfYWMzX3RhZyhwYiwgdHJhY2spOwotICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0VBQzMpCisgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRUFDMykKICAgICAgICAgbW92X3dyaXRlX2VhYzNfdGFnKHBiLCB0cmFjayk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUxBQykKKyAgICBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTEFDKQogICAgICAgICBtb3Zfd3JpdGVfZXh0cmFkYXRhX3RhZyhwYiwgdHJhY2spOwotICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVBSTykKLSAgICAgICAgbW92X3dyaXRlX3dmZXhfdGFnKHBiLCB0cmFjayk7CisgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01BUFJPKQorICAgICAgICBtb3Zfd3JpdGVfd2ZleF90YWcocywgcGIsIHRyYWNrKTsKKyAgICBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFDKQorICAgICAgICBtb3Zfd3JpdGVfZGZsYV90YWcocGIsIHRyYWNrKTsKKyAgICBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTKQorICAgICAgICBtb3Zfd3JpdGVfZG9wc190YWcocGIsIHRyYWNrKTsKICAgICBlbHNlIGlmICh0cmFjay0+dm9zX2xlbiA+IDApCiAgICAgICAgIG1vdl93cml0ZV9nbGJsX3RhZyhwYiwgdHJhY2spOwogCi0gICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WICYmIHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQotICAgICAgICBtb3Zfd3JpdGVfY2hhbl90YWcocGIsIHRyYWNrKTsKKyAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YgJiYgdHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgIG1vdl93cml0ZV9jaGFuX3RhZyhzLCBwYiwgdHJhY2spOwogCiAgICAgaWYgKG1vdi0+ZW5jcnlwdGlvbl9zY2hlbWUgIT0gTU9WX0VOQ19OT05FKSB7CiAgICAgICAgIGZmX21vdl9jZW5jX3dyaXRlX3NpbmZfdGFnKHRyYWNrLCBwYiwgbW92LT5lbmNyeXB0aW9uX2tpZCk7CkBAIC0xMDM5LDEzICsxMTY5LDI4IEBACiAgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOwogfQogCitzdGF0aWMgaW50IG1vdl93cml0ZV92cGNjX3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAidnBjQyIpOworICAgIGF2aW9fdzgocGIsIDEpOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb193YjI0KHBiLCAwKTsgLyogZmxhZ3MgKi8KKyAgICBmZl9pc29tX3dyaXRlX3ZwY2MocywgcGIsIHRyYWNrLT5wYXIpOworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKwogc3RhdGljIGludCBtb3Zfd3JpdGVfaHZjY190YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOwogCiAgICAgYXZpb193YjMyKHBiLCAwKTsKICAgICBmZmlvX3dmb3VyY2MocGIsICJodmNDIik7Ci0gICAgZmZfaXNvbV93cml0ZV9odmNjKHBiLCB0cmFjay0+dm9zX2RhdGEsIHRyYWNrLT52b3NfbGVuLCAwKTsKKyAgICBpZiAodHJhY2stPnRhZyA9PSBNS1RBRygnaCcsJ3YnLCdjJywnMScpKQorICAgICAgICBmZl9pc29tX3dyaXRlX2h2Y2MocGIsIHRyYWNrLT52b3NfZGF0YSwgdHJhY2stPnZvc19sZW4sIDEpOworICAgIGVsc2UKKyAgICAgICAgZmZfaXNvbV93cml0ZV9odmNjKHBiLCB0cmFjay0+dm9zX2RhdGEsIHRyYWNrLT52b3NfbGVuLCAwKTsKICAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7CiB9CiAKQEAgLTEwNTUsMTMgKzEyMDAsMTAgQEAKICAgICBpbnQgaTsKICAgICBpbnQgaW50ZXJsYWNlZDsKICAgICBpbnQgY2lkOworICAgIGludCBkaXNwbGF5X3dpZHRoID0gdHJhY2stPnBhci0+d2lkdGg7CiAKICAgICBpZiAodHJhY2stPnZvc19kYXRhICYmIHRyYWNrLT52b3NfbGVuID4gMHgyOSkgewotICAgICAgICBpZiAodHJhY2stPnZvc19kYXRhWzBdID09IDB4MDAgJiYKLSAgICAgICAgICAgIHRyYWNrLT52b3NfZGF0YVsxXSA9PSAweDAwICYmCi0gICAgICAgICAgICB0cmFjay0+dm9zX2RhdGFbMl0gPT0gMHgwMiAmJgotICAgICAgICAgICAgdHJhY2stPnZvc19kYXRhWzNdID09IDB4ODAgJiYKLSAgICAgICAgICAgICh0cmFjay0+dm9zX2RhdGFbNF0gPT0gMHgwMSB8fCB0cmFjay0+dm9zX2RhdGFbNF0gPT0gMHgwMikpIHsKKyAgICAgICAgaWYgKGZmX2RueGhkX3BhcnNlX2hlYWRlcl9wcmVmaXgodHJhY2stPnZvc19kYXRhKSAhPSAwKSB7CiAgICAgICAgICAgICAvKiBsb29rcyBsaWtlIGEgRE54SEQgYml0IHN0cmVhbSAqLwogICAgICAgICAgICAgaW50ZXJsYWNlZCA9ICh0cmFjay0+dm9zX2RhdGFbNV0gJiAyKTsKICAgICAgICAgICAgIGNpZCA9IEFWX1JCMzIodHJhY2stPnZvc19kYXRhICsgMHgyOCk7CkBAIC0xMDc4LDE0ICsxMjIwLDI2IEBACiAgICAgZmZpb193Zm91cmNjKHBiLCAiQUNMUiIpOwogICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkFDTFIiKTsKICAgICBmZmlvX3dmb3VyY2MocGIsICIwMDAxIik7Ci0gICAgaWYgKHRyYWNrLT5lbmMtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX01QRUcgfHwgLyogTGVnYWwgcmFuZ2UgKDE2LTIzNSkgKi8KLSAgICAgICAgdHJhY2stPmVuYy0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQpIHsKKyAgICBpZiAodHJhY2stPnBhci0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfTVBFRyB8fCAvKiBMZWdhbCByYW5nZSAoMTYtMjM1KSAqLworICAgICAgICB0cmFjay0+cGFyLT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9VTlNQRUNJRklFRCkgewogICAgICAgICBhdmlvX3diMzIocGIsIDEpOyAvKiBDb3JyZXNwb25kcyB0byA3MDkgaW4gb2ZmaWNpYWwgZW5jb2RlciAqLwogICAgIH0gZWxzZSB7IC8qIEZ1bGwgcmFuZ2UgKDAtMjU1KSAqLwogICAgICAgICBhdmlvX3diMzIocGIsIDIpOyAvKiBDb3JyZXNwb25kcyB0byBSR0IgaW4gb2ZmaWNpYWwgZW5jb2RlciAqLwogICAgIH0KICAgICBhdmlvX3diMzIocGIsIDApOyAvKiB1bmtub3duICovCiAKKyAgICBpZiAodHJhY2stPnRhZyA9PSBNS1RBRygnQScsJ1YnLCdkJywnaCcpKSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgMzIpOworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJBREhSIik7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgIjAwMDEiKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCBjaWQpOworICAgICAgICBhdmlvX3diMzIocGIsIDApOyAvKiB1bmtub3duICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgMSk7IC8qIHVua25vd24gKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogdW5rbm93biAqLworICAgICAgICBhdmlvX3diMzIocGIsIDApOyAvKiB1bmtub3duICovCisgICAgICAgIHJldHVybiAwOworICAgIH0KKwogICAgIGF2aW9fd2IzMihwYiwgMjQpOyAvKiBzaXplICovCiAgICAgZmZpb193Zm91cmNjKHBiLCAiQVBSRyIpOwogICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkFQUkciKTsKQEAgLTEwOTgsMTggKzEyNTIsMjEgQEAKICAgICBmZmlvX3dmb3VyY2MocGIsICJBUkVTIik7CiAgICAgZmZpb193Zm91cmNjKHBiLCAiMDAwMSIpOwogICAgIGF2aW9fd2IzMihwYiwgY2lkKTsgLyogZG54aGQgY2lkLCBzb21lIGlkID8gKi8KLSAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbmMtPndpZHRoKTsKKyAgICBpZiAoICAgdHJhY2stPnBhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPiAwCisgICAgICAgICYmIHRyYWNrLT5wYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID4gMCkKKyAgICAgICAgZGlzcGxheV93aWR0aCA9IGRpc3BsYXlfd2lkdGggKiB0cmFjay0+cGFyLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAvIHRyYWNrLT5wYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuOworICAgIGF2aW9fd2IzMihwYiwgZGlzcGxheV93aWR0aCk7CiAgICAgLyogdmFsdWVzIGJlbG93IGFyZSBiYXNlZCBvbiBzYW1wbGVzIGNyZWF0ZWQgd2l0aCBxdWlja3RpbWUgYW5kIGF2aWQgY29kZWNzICovCiAgICAgaWYgKGludGVybGFjZWQpIHsKLSAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT5oZWlnaHQgLyAyKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+cGFyLT5oZWlnaHQgLyAyKTsKICAgICAgICAgYXZpb193YjMyKHBiLCAyKTsgLyogdW5rbm93biAqLwogICAgICAgICBhdmlvX3diMzIocGIsIDApOyAvKiB1bmtub3duICovCiAgICAgICAgIGF2aW9fd2IzMihwYiwgNCk7IC8qIHVua25vd24gKi8KICAgICB9IGVsc2UgewotICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbmMtPmhlaWdodCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnBhci0+aGVpZ2h0KTsKICAgICAgICAgYXZpb193YjMyKHBiLCAxKTsgLyogdW5rbm93biAqLwogICAgICAgICBhdmlvX3diMzIocGIsIDApOyAvKiB1bmtub3duICovCi0gICAgICAgIGlmICh0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkKKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPmhlaWdodCA9PSAxMDgwKQogICAgICAgICAgICAgYXZpb193YjMyKHBiLCA1KTsgLyogdW5rbm93biAqLwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBhdmlvX3diMzIocGIsIDYpOyAvKiB1bmtub3duICovCkBAIC0xMTI1LDgxICsxMjgyLDMwIEBACiB7CiAgICAgYXZpb193YjMyKHBiLCAxMik7CiAgICAgZmZpb193Zm91cmNjKHBiLCAiRHB4RSIpOwotICAgIGlmICh0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSA+PSAxMiAmJgotICAgICAgICAhbWVtY21wKCZ0cmFjay0+ZW5jLT5leHRyYWRhdGFbNF0sICJEcHhFIiwgNCkpIHsKLSAgICAgICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT5leHRyYWRhdGFbMTFdKTsKKyAgICBpZiAodHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemUgPj0gMTIgJiYKKyAgICAgICAgIW1lbWNtcCgmdHJhY2stPnBhci0+ZXh0cmFkYXRhWzRdLCAiRHB4RSIsIDQpKSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnBhci0+ZXh0cmFkYXRhWzExXSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZpb193YjMyKHBiLCAxKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXA0X2dldF9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCi17Ci0gICAgaW50IHRhZyA9IHRyYWNrLT5lbmMtPmNvZGVjX3RhZzsKLQotICAgIGlmICghZmZfY29kZWNfZ2V0X3RhZyhmZl9tcDRfb2JqX3R5cGUsIHRyYWNrLT5lbmMtPmNvZGVjX2lkKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAgICAgICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSAgICAgIHRhZyA9IE1LVEFHKCdhJywndicsJ2MnLCcxJyk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQykgICAgICB0YWcgPSBNS1RBRygnaCcsJ2UnLCd2JywnMScpOwotICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMykgICAgICAgdGFnID0gTUtUQUcoJ2EnLCdjJywnLScsJzMnKTsKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzKSAgICAgIHRhZyA9IE1LVEFHKCdlJywnYycsJy0nLCczJyk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRElSQUMpICAgICB0YWcgPSBNS1RBRygnZCcsJ3InLCdhJywnYycpOwotICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01PVl9URVhUKSAgdGFnID0gTUtUQUcoJ3QnLCd4JywnMycsJ2cnKTsKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEpICAgICAgIHRhZyA9IE1LVEFHKCd2JywnYycsJy0nLCcxJyk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pICB0YWcgPSBNS1RBRygnbScsJ3AnLCc0JywndicpOwotICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSAgdGFnID0gTUtUQUcoJ20nLCdwJywnNCcsJ2EnKTsKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUpICB0YWcgPSBNS1RBRygnbScsJ3AnLCc0JywncycpOwotCi0gICAgcmV0dXJuIHRhZzsKLX0KLQotc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgY29kZWNfaXBvZF90YWdzW10gPSB7Ci0gICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgTUtUQUcoJ2EnLCd2JywnYycsJzEnKSB9LAotICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgIE1LVEFHKCdtJywncCcsJzQnLCd2JykgfSwKLSAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgICBNS1RBRygnbScsJ3AnLCc0JywnYScpIH0sCi0gICAgeyBBVl9DT0RFQ19JRF9BTEFDLCAgICAgTUtUQUcoJ2EnLCdsJywnYScsJ2MnKSB9LAotICAgIHsgQVZfQ09ERUNfSURfQUMzLCAgICAgIE1LVEFHKCdhJywnYycsJy0nLCczJykgfSwKLSAgICB7IEFWX0NPREVDX0lEX01PVl9URVhULCBNS1RBRygndCcsJ3gnLCczJywnZycpIH0sCi0gICAgeyBBVl9DT0RFQ19JRF9NT1ZfVEVYVCwgTUtUQUcoJ3QnLCdlJywneCcsJ3QnKSB9LAotICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAotfTsKLQotc3RhdGljIGludCBpcG9kX2dldF9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCi17Ci0gICAgaW50IHRhZyA9IHRyYWNrLT5lbmMtPmNvZGVjX3RhZzsKLQotICAgIC8vIGtlZXAgb3JpZ2luYWwgdGFnIGZvciBzdWJzLCBpcG9kIHN1cHBvcnRzIGJvdGggZm9ybWF0cwotICAgIGlmICghKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICYmCi0gICAgICAgICAgKHRhZyA9PSBNS1RBRygndCcsICd4JywgJzMnLCAnZycpIHx8Ci0gICAgICAgICAgIHRhZyA9PSBNS1RBRygndCcsICdlJywgJ3gnLCAndCcpKSkpCi0gICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoY29kZWNfaXBvZF90YWdzLCB0cmFjay0+ZW5jLT5jb2RlY19pZCk7Ci0KLSAgICBpZiAoIWF2X21hdGNoX2V4dChzLT5maWxlbmFtZSwgIm00YSIpICYmCi0gICAgICAgICFhdl9tYXRjaF9leHQocy0+ZmlsZW5hbWUsICJtNGIiKSAmJgotICAgICAgICAhYXZfbWF0Y2hfZXh0KHMtPmZpbGVuYW1lLCAibTR2IikpCi0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIldhcm5pbmcsIGV4dGVuc2lvbiBpcyBub3QgLm00YSwgLm00diBub3IgIC5tNGIgIgotICAgICAgICAgICAgICAgIlF1aWNrdGltZS9JcG9kIG1pZ2h0IG5vdCBwbGF5IHRoZSBmaWxlXG4iKTsKLQotICAgIHJldHVybiB0YWc7Ci19Ci0KIHN0YXRpYyBpbnQgbW92X2dldF9kdl9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgaW50IHRhZzsKIAotICAgIGlmICh0cmFjay0+ZW5jLT53aWR0aCA9PSA3MjApIHsgLyogU0QgKi8KLSAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmhlaWdodCA9PSA0ODApIHsgLyogTlRTQyAqLwotICAgICAgICAgICAgaWYgICh0cmFjay0+ZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgdGFnID0gTUtUQUcoJ2QnLCd2JywnNScsJ24nKTsKKyAgICBpZiAodHJhY2stPnBhci0+d2lkdGggPT0gNzIwKSB7IC8qIFNEICovCisgICAgICAgIGlmICh0cmFjay0+cGFyLT5oZWlnaHQgPT0gNDgwKSB7IC8qIE5UU0MgKi8KKyAgICAgICAgICAgIGlmICAodHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgdGFnID0gTUtUQUcoJ2QnLCd2JywnNScsJ24nKTsKICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IE1LVEFHKCdkJywndicsJ2MnLCcgJyk7Ci0gICAgICAgfWVsc2UgaWYgKHRyYWNrLT5lbmMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQKSB0YWcgPSBNS1RBRygnZCcsJ3YnLCc1JywncCcpOwotICAgICAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgdGFnID0gTUtUQUcoJ2QnLCd2JywnYycsJ3AnKTsKKyAgICAgICB9ZWxzZSBpZiAodHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgdGFnID0gTUtUQUcoJ2QnLCd2JywnNScsJ3AnKTsKKyAgICAgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgdGFnID0gTUtUQUcoJ2QnLCd2JywnYycsJ3AnKTsKICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9IE1LVEFHKCdkJywndicsJ3AnLCdwJyk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5oZWlnaHQgPT0gNzIwKSB7IC8qIEhEIDcyMCBsaW5lICovCisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5oZWlnaHQgPT0gNzIwKSB7IC8qIEhEIDcyMCBsaW5lICovCiAgICAgICAgIGlmICAodHJhY2stPnN0LT50aW1lX2Jhc2UuZGVuID09IDUwKSAgICAgICAgICAgICAgICB0YWcgPSBNS1RBRygnZCcsJ3YnLCdoJywncScpOwogICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnID0gTUtUQUcoJ2QnLCd2JywnaCcsJ3AnKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmhlaWdodCA9PSAxMDgwKSB7IC8qIEhEIDEwODAgbGluZSAqLworICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+aGVpZ2h0ID09IDEwODApIHsgLyogSEQgMTA4MCBsaW5lICovCiAgICAgICAgIGlmICAodHJhY2stPnN0LT50aW1lX2Jhc2UuZGVuID09IDI1KSAgICAgICAgICAgICAgICB0YWcgPSBNS1RBRygnZCcsJ3YnLCdoJywnNScpOwogICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnID0gTUtUQUcoJ2QnLCd2JywnaCcsJzYnKTsKICAgICB9IGVsc2UgewpAQCAtMTIxMiwyOSArMTMxOCw0MyBAQAogCiBzdGF0aWMgQVZSYXRpb25hbCBmaW5kX2ZwcyhBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKIHsKLSAgICBBVlJhdGlvbmFsIHJhdGUgPSB7c3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuLCBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW19OwotICAgIC8qIGlmIHRoZSBjb2RlYyB0aW1lIGJhc2UgbWFrZXMgbm8gc2Vuc2UsIHRyeSB0byBmYWxsYmFjayBvbiBzdHJlYW0gZnJhbWUgcmF0ZSAqLworICAgIEFWUmF0aW9uYWwgcmF0ZSA9IHN0LT5hdmdfZnJhbWVfcmF0ZTsKKworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIHJhdGUgPSBhdl9pbnZfcShzdC0+Y29kZWMtPnRpbWVfYmFzZSk7CiAgICAgaWYgKGF2X3RpbWVjb2RlX2NoZWNrX2ZyYW1lX3JhdGUocmF0ZSkgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJ0aW1lY29kZTogdGJjPSVkLyVkIGludmFsaWQsIGZhbGxiYWNrIG9uICVkLyVkXG4iLAogICAgICAgICAgICAgICAgcmF0ZS5udW0sIHJhdGUuZGVuLCBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtLCBzdC0+YXZnX2ZyYW1lX3JhdGUuZGVuKTsKICAgICAgICAgcmF0ZSA9IHN0LT5hdmdfZnJhbWVfcmF0ZTsKICAgICB9CisgICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKIAogICAgIHJldHVybiByYXRlOwogfQogCitzdGF0aWMgaW50IGRlZmluZWRfZnJhbWVfcmF0ZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCkKK3sKKyAgICBBVlJhdGlvbmFsIHJhdGlvbmFsX2ZyYW1lcmF0ZSA9IGZpbmRfZnBzKHMsIHN0KTsKKyAgICBpbnQgcmF0ZSA9IDA7CisgICAgaWYgKHJhdGlvbmFsX2ZyYW1lcmF0ZS5kZW4gIT0gMCkKKyAgICAgICAgcmF0ZSA9IGF2X3EyZChyYXRpb25hbF9mcmFtZXJhdGUpOworICAgIHJldHVybiByYXRlOworfQorCiBzdGF0aWMgaW50IG1vdl9nZXRfbXBlZzJfeGRjYW1fY29kZWNfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgTU9WVHJhY2sgKnRyYWNrKQogewotICAgIGludCB0YWcgPSB0cmFjay0+ZW5jLT5jb2RlY190YWc7Ci0gICAgaW50IGludGVybGFjZWQgPSB0cmFjay0+ZW5jLT5maWVsZF9vcmRlciA+IEFWX0ZJRUxEX1BST0dSRVNTSVZFOworICAgIGludCB0YWcgPSB0cmFjay0+cGFyLT5jb2RlY190YWc7CisgICAgaW50IGludGVybGFjZWQgPSB0cmFjay0+cGFyLT5maWVsZF9vcmRlciA+IEFWX0ZJRUxEX1BST0dSRVNTSVZFOwogICAgIEFWU3RyZWFtICpzdCA9IHRyYWNrLT5zdDsKLSAgICBpbnQgcmF0ZSA9IGF2X3EyZChmaW5kX2ZwcyhzLCBzdCkpOworICAgIGludCByYXRlID0gZGVmaW5lZF9mcmFtZV9yYXRlKHMsIHN0KTsKIAogICAgIGlmICghdGFnKQogICAgICAgICB0YWcgPSBNS1RBRygnbScsICcyJywgJ3YnLCAnMScpOyAvL2ZhbGxiYWNrIHRhZwogCi0gICAgaWYgKHRyYWNrLT5lbmMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQKSB7Ci0gICAgICAgIGlmICh0cmFjay0+ZW5jLT53aWR0aCA9PSAxMjgwICYmIHRyYWNrLT5lbmMtPmhlaWdodCA9PSA3MjApIHsKKyAgICBpZiAodHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkgeworICAgICAgICBpZiAodHJhY2stPnBhci0+d2lkdGggPT0gMTI4MCAmJiB0cmFjay0+cGFyLT5oZWlnaHQgPT0gNzIwKSB7CiAgICAgICAgICAgICBpZiAoIWludGVybGFjZWQpIHsKICAgICAgICAgICAgICAgICBpZiAgICAgIChyYXRlID09IDI0KSB0YWcgPSBNS1RBRygneCcsJ2QnLCd2JywnNCcpOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCc1Jyk7CkBAIC0xMjQyLDcgKzEzNjIsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gNTApIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCdhJyk7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSA2MCkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJzknKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT53aWR0aCA9PSAxNDQwICYmIHRyYWNrLT5lbmMtPmhlaWdodCA9PSAxMDgwKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+d2lkdGggPT0gMTQ0MCAmJiB0cmFjay0+cGFyLT5oZWlnaHQgPT0gMTA4MCkgewogICAgICAgICAgICAgaWYgKCFpbnRlcmxhY2VkKSB7CiAgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNCkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJzYnKTsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygneCcsJ2QnLCd2JywnNycpOwpAQCAtMTI1MSw3ICsxMzcxLDcgQEAKICAgICAgICAgICAgICAgICBpZiAgICAgIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygneCcsJ2QnLCd2JywnMycpOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMzApIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCcyJyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTkyMCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPndpZHRoID09IDE5MjAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDEwODApIHsKICAgICAgICAgICAgIGlmICghaW50ZXJsYWNlZCkgewogICAgICAgICAgICAgICAgIGlmICAgICAgKHJhdGUgPT0gMjQpIHRhZyA9IE1LVEFHKCd4JywnZCcsJ3YnLCdkJyk7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAyNSkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJ2UnKTsKQEAgLTEyNjEsOCArMTM4MSw4IEBACiAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAzMCkgdGFnID0gTUtUQUcoJ3gnLCdkJywndicsJ2InKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlApIHsKLSAgICAgICAgaWYgKHRyYWNrLT5lbmMtPndpZHRoID09IDEyODAgJiYgdHJhY2stPmVuYy0+aGVpZ2h0ID09IDcyMCkgeworICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgeworICAgICAgICBpZiAodHJhY2stPnBhci0+d2lkdGggPT0gMTI4MCAmJiB0cmFjay0+cGFyLT5oZWlnaHQgPT0gNzIwKSB7CiAgICAgICAgICAgICBpZiAoIWludGVybGFjZWQpIHsKICAgICAgICAgICAgICAgICBpZiAgICAgIChyYXRlID09IDI0KSB0YWcgPSBNS1RBRygneCcsJ2QnLCc1JywnNCcpOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gMjUpIHRhZyA9IE1LVEFHKCd4JywnZCcsJzUnLCc1Jyk7CkBAIC0xMjcwLDcgKzEzOTAsNyBAQAogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gNTApIHRhZyA9IE1LVEFHKCd4JywnZCcsJzUnLCdhJyk7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSA2MCkgdGFnID0gTUtUQUcoJ3gnLCdkJywnNScsJzknKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT53aWR0aCA9PSAxOTIwICYmIHRyYWNrLT5lbmMtPmhlaWdodCA9PSAxMDgwKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+d2lkdGggPT0gMTkyMCAmJiB0cmFjay0+cGFyLT5oZWlnaHQgPT0gMTA4MCkgewogICAgICAgICAgICAgaWYgKCFpbnRlcmxhY2VkKSB7CiAgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNCkgdGFnID0gTUtUQUcoJ3gnLCdkJywnNScsJ2QnKTsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygneCcsJ2QnLCc1JywnZScpOwpAQCAtMTI4NywxNiArMTQwNywxNiBAQAogCiBzdGF0aWMgaW50IG1vdl9nZXRfaDI2NF9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCiB7Ci0gICAgaW50IHRhZyA9IHRyYWNrLT5lbmMtPmNvZGVjX3RhZzsKLSAgICBpbnQgaW50ZXJsYWNlZCA9IHRyYWNrLT5lbmMtPmZpZWxkX29yZGVyID4gQVZfRklFTERfUFJPR1JFU1NJVkU7CisgICAgaW50IHRhZyA9IHRyYWNrLT5wYXItPmNvZGVjX3RhZzsKKyAgICBpbnQgaW50ZXJsYWNlZCA9IHRyYWNrLT5wYXItPmZpZWxkX29yZGVyID4gQVZfRklFTERfUFJPR1JFU1NJVkU7CiAgICAgQVZTdHJlYW0gKnN0ID0gdHJhY2stPnN0OwotICAgIGludCByYXRlID0gYXZfcTJkKGZpbmRfZnBzKHMsIHN0KSk7CisgICAgaW50IHJhdGUgPSBkZWZpbmVkX2ZyYW1lX3JhdGUocywgc3QpOwogCiAgICAgaWYgKCF0YWcpCiAgICAgICAgIHRhZyA9IE1LVEFHKCdhJywgJ3YnLCAnYycsICdpJyk7IC8vZmFsbGJhY2sgdGFnCiAKLSAgICBpZiAodHJhY2stPmVuYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAxMCkgewotICAgICAgICBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gOTYwICYmIHRyYWNrLT5lbmMtPmhlaWdodCA9PSA3MjApIHsKKyAgICBpZiAodHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUDEwKSB7CisgICAgICAgIGlmICh0cmFjay0+cGFyLT53aWR0aCA9PSA5NjAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDcyMCkgewogICAgICAgICAgICAgaWYgKCFpbnRlcmxhY2VkKSB7CiAgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnNScsJ3AnKTsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygnYScsJ2knLCc1JywncScpOwpAQCAtMTMwNCw3ICsxNDI0LDcgQEAKICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDUwKSB0YWcgPSBNS1RBRygnYScsJ2knLCc1JywncScpOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gNjApIHRhZyA9IE1LVEFHKCdhJywnaScsJzUnLCdwJyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTQ0MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPndpZHRoID09IDE0NDAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDEwODApIHsKICAgICAgICAgICAgIGlmICghaW50ZXJsYWNlZCkgewogICAgICAgICAgICAgICAgIGlmICAgICAgKHJhdGUgPT0gMjQpIHRhZyA9IE1LVEFHKCdhJywnaScsJzUnLCczJyk7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAyNSkgdGFnID0gTUtUQUcoJ2EnLCdpJywnNScsJzInKTsKQEAgLTEzMTQsOCArMTQzNCw4IEBACiAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSA2MCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnNScsJzYnKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlAxMCkgewotICAgICAgICBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTI4MCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gNzIwKSB7CisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQMTApIHsKKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPndpZHRoID09IDEyODAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDcyMCkgewogICAgICAgICAgICAgaWYgKCFpbnRlcmxhY2VkKSB7CiAgICAgICAgICAgICAgICAgaWYgICAgICAocmF0ZSA9PSAyNCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnMScsJ3AnKTsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDI1KSB0YWcgPSBNS1RBRygnYScsJ2knLCcxJywncScpOwpAQCAtMTMyMyw3ICsxNDQzLDcgQEAKICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDUwKSB0YWcgPSBNS1RBRygnYScsJ2knLCcxJywncScpOwogICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhdGUgPT0gNjApIHRhZyA9IE1LVEFHKCdhJywnaScsJzEnLCdwJyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+d2lkdGggPT0gMTkyMCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPndpZHRoID09IDE5MjAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDEwODApIHsKICAgICAgICAgICAgIGlmICghaW50ZXJsYWNlZCkgewogICAgICAgICAgICAgICAgIGlmICAgICAgKHJhdGUgPT0gMjQpIHRhZyA9IE1LVEFHKCdhJywnaScsJzEnLCczJyk7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSAyNSkgdGFnID0gTUtUQUcoJ2EnLCdpJywnMScsJzInKTsKQEAgLTEzMzMsOSArMTQ1Myw5IEBACiAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmF0ZSA9PSA1MCkgdGFnID0gTUtUQUcoJ2EnLCdpJywnMScsJzUnKTsKICAgICAgICAgICAgICAgICBlbHNlIGlmIChyYXRlID09IDYwKSB0YWcgPSBNS1RBRygnYScsJ2knLCcxJywnNicpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKCAgIHRyYWNrLT5lbmMtPndpZHRoID09IDQwOTYgJiYgdHJhY2stPmVuYy0+aGVpZ2h0ID09IDIxNjAKLSAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+ZW5jLT53aWR0aCA9PSAzODQwICYmIHRyYWNrLT5lbmMtPmhlaWdodCA9PSAyMTYwCi0gICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPmVuYy0+d2lkdGggPT0gMjA0OCAmJiB0cmFjay0+ZW5jLT5oZWlnaHQgPT0gMTA4MCkgeworICAgICAgICB9IGVsc2UgaWYgKCAgIHRyYWNrLT5wYXItPndpZHRoID09IDQwOTYgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDIxNjAKKyAgICAgICAgICAgICAgICAgICB8fCB0cmFjay0+cGFyLT53aWR0aCA9PSAzODQwICYmIHRyYWNrLT5wYXItPmhlaWdodCA9PSAyMTYwCisgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPnBhci0+d2lkdGggPT0gMjA0OCAmJiB0cmFjay0+cGFyLT5oZWlnaHQgPT0gMTA4MCkgewogICAgICAgICAgICAgdGFnID0gTUtUQUcoJ2EnLCdpJywndicsJ3gnKTsKICAgICAgICAgfQogICAgIH0KQEAgLTEzNjUsOTIgKzE0ODUsOTIgQEAKICAgICB7IEFWX1BJWF9GTVRfUkdCNDhCRSwgTUtUQUcoJ2InLCc0JywnOCcsJ3InKSwgNDggfSwKIH07CiAKK3N0YXRpYyBpbnQgbW92X2dldF9kbnhoZF9jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCit7CisgIGludCB0YWcgPSBNS1RBRygnQScsJ1YnLCdkJywnbicpOworICBpZiAodHJhY2stPnBhci0+cHJvZmlsZSAhPSBGRl9QUk9GSUxFX1VOS05PV04gJiYKKyAgICAgIHRyYWNrLT5wYXItPnByb2ZpbGUgIT0gRkZfUFJPRklMRV9ETlhIRCkKKyAgICAgIHRhZyA9IE1LVEFHKCdBJywnVicsJ2QnLCdoJyk7CisgIHJldHVybiB0YWc7Cit9CisKIHN0YXRpYyBpbnQgbW92X2dldF9yYXd2aWRlb19jb2RlY190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBNT1ZUcmFjayAqdHJhY2spCiB7Ci0gICAgaW50IHRhZyA9IHRyYWNrLT5lbmMtPmNvZGVjX3RhZzsKKyAgICBpbnQgdGFnID0gdHJhY2stPnBhci0+Y29kZWNfdGFnOwogICAgIGludCBpOwogICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OwogCiAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKG1vdl9waXhfZm10X3RhZ3MpOyBpKyspIHsKLSAgICAgICAgaWYgKHRyYWNrLT5lbmMtPnBpeF9mbXQgPT0gbW92X3BpeF9mbXRfdGFnc1tpXS5waXhfZm10KSB7CisgICAgICAgIGlmICh0cmFjay0+cGFyLT5mb3JtYXQgPT0gbW92X3BpeF9mbXRfdGFnc1tpXS5waXhfZm10KSB7CiAgICAgICAgICAgICB0YWcgPSBtb3ZfcGl4X2ZtdF90YWdzW2ldLnRhZzsKLSAgICAgICAgICAgIHRyYWNrLT5lbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IG1vdl9waXhfZm10X3RhZ3NbaV0uYnBzOwotICAgICAgICAgICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3RhZyA9PSBtb3ZfcGl4X2ZtdF90YWdzW2ldLnRhZykKKyAgICAgICAgICAgIHRyYWNrLT5wYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IG1vdl9waXhfZm10X3RhZ3NbaV0uYnBzOworICAgICAgICAgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3RhZyA9PSBtb3ZfcGl4X2ZtdF90YWdzW2ldLnRhZykKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAogICAgIHBpeF9mbXQgPSBhdnByaXZfZmluZF9waXhfZm10KGF2cHJpdl9waXhfZm10X2Jwc19tb3YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOwogICAgIGlmICh0YWcgPT0gTUtUQUcoJ3InLCdhJywndycsJyAnKSAmJgotICAgICAgICB0cmFjay0+ZW5jLT5waXhfZm10ICE9IHBpeF9mbXQgJiYKLSAgICAgICAgdHJhY2stPmVuYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUpCisgICAgICAgIHRyYWNrLT5wYXItPmZvcm1hdCAhPSBwaXhfZm10ICYmCisgICAgICAgIHRyYWNrLT5wYXItPmZvcm1hdCAhPSBBVl9QSVhfRk1UX0dSQVk4ICYmCisgICAgICAgIHRyYWNrLT5wYXItPmZvcm1hdCAhPSBBVl9QSVhfRk1UX05PTkUpCiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICIlcyByYXd2aWRlbyBjYW5ub3QgYmUgd3JpdHRlbiB0byBtb3YsIG91dHB1dCBmaWxlIHdpbGwgYmUgdW5yZWFkYWJsZVxuIiwKLSAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUodHJhY2stPmVuYy0+cGl4X2ZtdCkpOworICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZSh0cmFjay0+cGFyLT5mb3JtYXQpKTsKICAgICByZXR1cm4gdGFnOwogfQogCiBzdGF0aWMgaW50IG1vdl9nZXRfY29kZWNfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgTU9WVHJhY2sgKnRyYWNrKQogewotICAgIGludCB0YWcgPSB0cmFjay0+ZW5jLT5jb2RlY190YWc7CisgICAgaW50IHRhZyA9IHRyYWNrLT5wYXItPmNvZGVjX3RhZzsKIAogICAgIGlmICghdGFnIHx8IChzLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPj0gRkZfQ09NUExJQU5DRV9OT1JNQUwgJiYKLSAgICAgICAgICAgICAgICAgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8gfHwKLSAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPIHx8Ci0gICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzIHx8Ci0gICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8Ci0gICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPIHx8Ci0gICAgICAgICAgICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHRyYWNrLT5lbmMtPmNvZGVjX2lkKSkpKSB7IC8vIHBjbSBhdWRpbwotICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZWSURFTykKKyAgICAgICAgICAgICAgICAgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8gfHwKKyAgICAgICAgICAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPIHx8CisgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzIHx8CisgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0IHx8CisgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ETlhIRCB8fAorICAgICAgICAgICAgICAgICAgdHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTyB8fAorICAgICAgICAgICAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZSh0cmFjay0+cGFyLT5jb2RlY19pZCkpKSkgeyAvLyBwY20gYXVkaW8KKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8pCiAgICAgICAgICAgICB0YWcgPSBtb3ZfZ2V0X2R2X2NvZGVjX3RhZyhzLCB0cmFjayk7Ci0gICAgICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKQorICAgICAgICBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTykKICAgICAgICAgICAgIHRhZyA9IG1vdl9nZXRfcmF3dmlkZW9fY29kZWNfdGFnKHMsIHRyYWNrKTsKLSAgICAgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykKKyAgICAgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykKICAgICAgICAgICAgIHRhZyA9IG1vdl9nZXRfbXBlZzJfeGRjYW1fY29kZWNfdGFnKHMsIHRyYWNrKTsKLSAgICAgICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkKKyAgICAgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkKICAgICAgICAgICAgIHRhZyA9IG1vdl9nZXRfaDI2NF9jb2RlY190YWcocywgdHJhY2spOwotICAgICAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICAgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19tb3Z2aWRlb190YWdzLCB0cmFjay0+ZW5jLT5jb2RlY19pZCk7CisgICAgICAgIGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ROWEhEKQorICAgICAgICAgICAgdGFnID0gbW92X2dldF9kbnhoZF9jb2RlY190YWcocywgdHJhY2spOworICAgICAgICBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19tb3Z2aWRlb190YWdzLCB0cmFjay0+cGFyLT5jb2RlY19pZCk7CiAgICAgICAgICAgICBpZiAoIXRhZykgeyAvLyBpZiBubyBtYWMgZmNjIGZvdW5kLCB0cnkgd2l0aCBNaWNyb3NvZnQgdGFncwotICAgICAgICAgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfYm1wX3RhZ3MsIHRyYWNrLT5lbmMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgICAgICB0YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX2JtcF90YWdzLCB0cmFjay0+cGFyLT5jb2RlY19pZCk7CiAgICAgICAgICAgICAgICAgaWYgKHRhZykKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVXNpbmcgTVMgc3R5bGUgdmlkZW8gY29kZWMgdGFnLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGZpbGUgbWF5IGJlIHVucGxheWFibGUhXG4iKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICAgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY19tb3ZhdWRpb190YWdzLCB0cmFjay0+ZW5jLT5jb2RlY19pZCk7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfbW92YXVkaW9fdGFncywgdHJhY2stPnBhci0+Y29kZWNfaWQpOwogICAgICAgICAgICAgaWYgKCF0YWcpIHsgLy8gaWYgbm8gbWFjIGZjYyBmb3VuZCwgdHJ5IHdpdGggTWljcm9zb2Z0IHRhZ3MKLSAgICAgICAgICAgICAgICBpbnQgbXNfdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhmZl9jb2RlY193YXZfdGFncywgdHJhY2stPmVuYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgICAgIGludCBtc190YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX3dhdl90YWdzLCB0cmFjay0+cGFyLT5jb2RlY19pZCk7CiAgICAgICAgICAgICAgICAgaWYgKG1zX3RhZykgewogICAgICAgICAgICAgICAgICAgICB0YWcgPSBNS1RBRygnbScsICdzJywgKChtc190YWcgPj4gOCkgJiAweGZmKSwgKG1zX3RhZyAmIDB4ZmYpKTsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVXNpbmcgTVMgc3R5bGUgYXVkaW8gY29kZWMgdGFnLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIGZpbGUgbWF5IGJlIHVucGxheWFibGUhXG4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCi0gICAgICAgICAgICB0YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX21vdnN1YnRpdGxlX3RhZ3MsIHRyYWNrLT5lbmMtPmNvZGVjX2lkKTsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfbW92c3VidGl0bGVfdGFncywgdHJhY2stPnBhci0+Y29kZWNfaWQpOwogICAgIH0KIAogICAgIHJldHVybiB0YWc7CiB9CiAKLXN0YXRpYyBjb25zdCBBVkNvZGVjVGFnIGNvZGVjXzNncF90YWdzW10gPSB7Ci0gICAgeyBBVl9DT0RFQ19JRF9IMjYzLCAgICAgTUtUQUcoJ3MnLCcyJywnNicsJzMnKSB9LAotICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgIE1LVEFHKCdhJywndicsJ2MnLCcxJykgfSwKLSAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICBNS1RBRygnbScsJ3AnLCc0JywndicpIH0sCi0gICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgICAgTUtUQUcoJ20nLCdwJywnNCcsJ2EnKSB9LAotICAgIHsgQVZfQ09ERUNfSURfQU1SX05CLCAgIE1LVEFHKCdzJywnYScsJ20nLCdyJykgfSwKLSAgICB7IEFWX0NPREVDX0lEX0FNUl9XQiwgICBNS1RBRygncycsJ2EnLCd3JywnYicpIH0sCi0gICAgeyBBVl9DT0RFQ19JRF9NT1ZfVEVYVCwgTUtUQUcoJ3QnLCd4JywnMycsJ2cnKSB9LAotICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAotfTsKLQotc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgY29kZWNfZjR2X3RhZ3NbXSA9IHsgLy8gWFhYOiBhZGQgR0lGL1BORy9KUEVHPwotICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICBNS1RBRygnLicsJ20nLCdwJywnMycpIH0sCi0gICAgeyBBVl9DT0RFQ19JRF9BQUMsICAgIE1LVEFHKCdtJywncCcsJzQnLCdhJykgfSwKLSAgICB7IEFWX0NPREVDX0lEX0gyNjQsICAgTUtUQUcoJ2EnLCd2JywnYycsJzEnKSB9LAotICAgIHsgQVZfQ09ERUNfSURfVlA2QSwgICBNS1RBRygnVicsJ1AnLCc2JywnQScpIH0sCi0gICAgeyBBVl9DT0RFQ19JRF9WUDZGLCAgIE1LVEFHKCdWJywnUCcsJzYnLCdGJykgfSwKK3N0YXRpYyBjb25zdCBBVkNvZGVjVGFnIGNvZGVjX2NvdmVyX2ltYWdlX3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgMHhEIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QTkcsICAgIDB4RSB9LAorICAgIHsgQVZfQ09ERUNfSURfQk1QLCAgICAweDFCIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAwIH0sCiB9OwogCkBAIC0xNDU4LDE4ICsxNTc4LDI0IEBACiB7CiAgICAgaW50IHRhZzsKIAorICAgIGlmIChpc19jb3Zlcl9pbWFnZSh0cmFjay0+c3QpKQorICAgICAgICByZXR1cm4gZmZfY29kZWNfZ2V0X3RhZyhjb2RlY19jb3Zlcl9pbWFnZV90YWdzLCB0cmFjay0+cGFyLT5jb2RlY19pZCk7CisKICAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NUDQgfHwgdHJhY2stPm1vZGUgPT0gTU9ERV9QU1ApCi0gICAgICAgIHRhZyA9IG1wNF9nZXRfY29kZWNfdGFnKHMsIHRyYWNrKTsKLSAgICBlbHNlIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX0lTTSkgewotICAgICAgICB0YWcgPSBtcDRfZ2V0X2NvZGVjX3RhZyhzLCB0cmFjayk7Ci0gICAgICAgIGlmICghdGFnICYmIHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVBSTykKLSAgICAgICAgICAgIHRhZyA9IE1LVEFHKCd3JywgJ20nLCAnYScsICcgJyk7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX0lQT0QpCi0gICAgICAgIHRhZyA9IGlwb2RfZ2V0X2NvZGVjX3RhZyhzLCB0cmFjayk7Ci0gICAgZWxzZSBpZiAodHJhY2stPm1vZGUgJiBNT0RFXzNHUCkKLSAgICAgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhjb2RlY18zZ3BfdGFncywgdHJhY2stPmVuYy0+Y29kZWNfaWQpOworICAgICAgICB0YWcgPSB0cmFjay0+cGFyLT5jb2RlY190YWc7CisgICAgZWxzZSBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9JU00pCisgICAgICAgIHRhZyA9IHRyYWNrLT5wYXItPmNvZGVjX3RhZzsKKyAgICBlbHNlIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX0lQT0QpIHsKKyAgICAgICAgaWYgKCFhdl9tYXRjaF9leHQocy0+dXJsLCAibTRhIikgJiYKKyAgICAgICAgICAgICFhdl9tYXRjaF9leHQocy0+dXJsLCAibTR2IikgJiYKKyAgICAgICAgICAgICFhdl9tYXRjaF9leHQocy0+dXJsLCAibTRiIikpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJXYXJuaW5nLCBleHRlbnNpb24gaXMgbm90IC5tNGEgbm9yIC5tNHYgIgorICAgICAgICAgICAgICAgICAgICJRdWlja3RpbWUvSXBvZCBtaWdodCBub3QgcGxheSB0aGUgZmlsZVxuIik7CisgICAgICAgIHRhZyA9IHRyYWNrLT5wYXItPmNvZGVjX3RhZzsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tb2RlICYgTU9ERV8zR1ApCisgICAgICAgIHRhZyA9IHRyYWNrLT5wYXItPmNvZGVjX3RhZzsKICAgICBlbHNlIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX0Y0VikKLSAgICAgICAgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyhjb2RlY19mNHZfdGFncywgdHJhY2stPmVuYy0+Y29kZWNfaWQpOworICAgICAgICB0YWcgPSB0cmFjay0+cGFyLT5jb2RlY190YWc7CiAgICAgZWxzZQogICAgICAgICB0YWcgPSBtb3ZfZ2V0X2NvZGVjX3RhZyhzLCB0cmFjayk7CiAKQEAgLTE0OTYsMTEgKzE2MjIsMTEgQEAKICAgICAweDAwMDAsIDB4MDEwMCwgMHgwMjAxLCAweDAyMDYsIDB4MDIwOSwgMHgwMjBlCiB9OwogCi1zdGF0aWMgaW50IG1vdl93cml0ZV9maWVsX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2ZpZWxfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrLCBpbnQgZmllbGRfb3JkZXIpCiB7CiAgICAgdW5zaWduZWQgbW92X2ZpZWxkX29yZGVyID0gMDsKLSAgICBpZiAodHJhY2stPmVuYy0+ZmllbGRfb3JkZXIgPCBGRl9BUlJBWV9FTEVNUyhmaWVsX2RhdGEpKQotICAgICAgICBtb3ZfZmllbGRfb3JkZXIgPSBmaWVsX2RhdGFbdHJhY2stPmVuYy0+ZmllbGRfb3JkZXJdOworICAgIGlmIChmaWVsZF9vcmRlciA8IEZGX0FSUkFZX0VMRU1TKGZpZWxfZGF0YSkpCisgICAgICAgIG1vdl9maWVsZF9vcmRlciA9IGZpZWxfZGF0YVtmaWVsZF9vcmRlcl07CiAgICAgZWxzZQogICAgICAgICByZXR1cm4gMDsKICAgICBhdmlvX3diMzIocGIsIDEwKTsKQEAgLTE1MTgsMTkgKzE2NDQsMTIyIEBACiAgICAgYXZpb193YjE2KHBiLCAwKTsgICAgLyogUmVzZXJ2ZWQgKi8KICAgICBhdmlvX3diMTYocGIsIDEpOyAgICAvKiBEYXRhLXJlZmVyZW5jZSBpbmRleCAqLwogCi0gICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRSkKKyAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFKQogICAgICAgICBtb3Zfd3JpdGVfZXNkc190YWcocGIsIHRyYWNrKTsKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSkKLSAgICAgICAgYXZpb193cml0ZShwYiwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhLCB0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgZWxzZSBpZiAodHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemUpCisgICAgICAgIGF2aW9fd3JpdGUocGIsIHRyYWNrLT5wYXItPmV4dHJhZGF0YSwgdHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemUpOwogCiAgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOwogfQogCitzdGF0aWMgaW50IG1vdl93cml0ZV9zdDNkX3RhZyhBVklPQ29udGV4dCAqcGIsIEFWU3RlcmVvM0QgKnN0ZXJlb18zZCkKK3sKKyAgICBpbnQ4X3Qgc3RlcmVvX21vZGU7CisKKyAgICBpZiAoc3RlcmVvXzNkLT5mbGFncyAhPSAwKSB7CisgICAgICAgIGF2X2xvZyhwYiwgQVZfTE9HX1dBUk5JTkcsICJVbnN1cHBvcnRlZCBzdGVyZW9fM2QgZmxhZ3MgJXguIHN0M2Qgbm90IHdyaXR0ZW4uXG4iLCBzdGVyZW9fM2QtPmZsYWdzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3dpdGNoIChzdGVyZW9fM2QtPnR5cGUpIHsKKyAgICBjYXNlIEFWX1NURVJFTzNEXzJEOgorICAgICAgICBzdGVyZW9fbW9kZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfVE9QQk9UVE9NOgorICAgICAgICBzdGVyZW9fbW9kZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1RFUkVPM0RfU0lERUJZU0lERToKKyAgICAgICAgc3RlcmVvX21vZGUgPSAyOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhdl9sb2cocGIsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgc3RlcmVvXzNkIHR5cGUgJXMuIHN0M2Qgbm90IHdyaXR0ZW4uXG4iLCBhdl9zdGVyZW8zZF90eXBlX25hbWUoc3RlcmVvXzNkLT50eXBlKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhdmlvX3diMzIocGIsIDEzKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInN0M2QiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiB2ZXJzaW9uID0gMCAmIGZsYWdzID0gMCAqLworICAgIGF2aW9fdzgocGIsIHN0ZXJlb19tb2RlKTsKKyAgICByZXR1cm4gMTM7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3N2M2RfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBBVlNwaGVyaWNhbE1hcHBpbmcgKnNwaGVyaWNhbF9tYXBwaW5nKQoreworICAgIGludDY0X3Qgc3YzZF9wb3MsIHN2aGRfcG9zLCBwcm9qX3BvczsKKyAgICBjb25zdCBjaGFyKiBtZXRhZGF0YV9zb3VyY2UgPSBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QgPyAiTGF2ZiIgOiBMSUJBVkZPUk1BVF9JREVOVDsKKworICAgIGlmIChzcGhlcmljYWxfbWFwcGluZy0+cHJvamVjdGlvbiAhPSBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSICYmCisgICAgICAgIHNwaGVyaWNhbF9tYXBwaW5nLT5wcm9qZWN0aW9uICE9IEFWX1NQSEVSSUNBTF9FUVVJUkVDVEFOR1VMQVJfVElMRSAmJgorICAgICAgICBzcGhlcmljYWxfbWFwcGluZy0+cHJvamVjdGlvbiAhPSBBVl9TUEhFUklDQUxfQ1VCRU1BUCkgeworICAgICAgICBhdl9sb2cocGIsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgcHJvamVjdGlvbiAlZC4gc3YzZCBub3Qgd3JpdHRlbi5cbiIsIHNwaGVyaWNhbF9tYXBwaW5nLT5wcm9qZWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc3YzZF9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAic3YzZCIpOworCisgICAgc3ZoZF9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAic3ZoZCIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHZlcnNpb24gPSAwICYgZmxhZ3MgPSAwICovCisgICAgYXZpb19wdXRfc3RyKHBiLCBtZXRhZGF0YV9zb3VyY2UpOworICAgIHVwZGF0ZV9zaXplKHBiLCBzdmhkX3Bvcyk7CisKKyAgICBwcm9qX3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInByb2oiKTsKKworICAgIGF2aW9fd2IzMihwYiwgMjQpOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAicHJoZCIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHZlcnNpb24gPSAwICYgZmxhZ3MgPSAwICovCisgICAgYXZpb193YjMyKHBiLCBzcGhlcmljYWxfbWFwcGluZy0+eWF3KTsKKyAgICBhdmlvX3diMzIocGIsIHNwaGVyaWNhbF9tYXBwaW5nLT5waXRjaCk7CisgICAgYXZpb193YjMyKHBiLCBzcGhlcmljYWxfbWFwcGluZy0+cm9sbCk7CisKKyAgICBzd2l0Y2ggKHNwaGVyaWNhbF9tYXBwaW5nLT5wcm9qZWN0aW9uKSB7CisgICAgY2FzZSBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSOgorICAgIGNhc2UgQVZfU1BIRVJJQ0FMX0VRVUlSRUNUQU5HVUxBUl9USUxFOgorICAgICAgICBhdmlvX3diMzIocGIsIDI4KTsgICAgLyogc2l6ZSAqLworICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJlcXVpIik7CisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHZlcnNpb24gPSAwICYgZmxhZ3MgPSAwICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgc3BoZXJpY2FsX21hcHBpbmctPmJvdW5kX3RvcCk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc3BoZXJpY2FsX21hcHBpbmctPmJvdW5kX2JvdHRvbSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc3BoZXJpY2FsX21hcHBpbmctPmJvdW5kX2xlZnQpOworICAgICAgICBhdmlvX3diMzIocGIsIHNwaGVyaWNhbF9tYXBwaW5nLT5ib3VuZF9yaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU1BIRVJJQ0FMX0NVQkVNQVA6CisgICAgICAgIGF2aW9fd2IzMihwYiwgMjApOyAgICAvKiBzaXplICovCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImNibXAiKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogdmVyc2lvbiA9IDAgJiBmbGFncyA9IDAgKi8KKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogbGF5b3V0ICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgc3BoZXJpY2FsX21hcHBpbmctPnBhZGRpbmcpOyAvKiBwYWRkaW5nICovCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB1cGRhdGVfc2l6ZShwYiwgcHJval9wb3MpOworCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBzdjNkX3Bvcyk7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2NsYXBfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGF2aW9fd2IzMihwYiwgNDApOworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImNsYXAiKTsKKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5wYXItPndpZHRoKTsgLyogYXBlcnR1cmVXaWR0aF9OICovCisgICAgYXZpb193YjMyKHBiLCAxKTsgLyogYXBlcnR1cmVXaWR0aF9EICg9IDEpICovCisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+aGVpZ2h0KTsgLyogYXBlcnR1cmVIZWlnaHRfTiAqLworICAgIGF2aW9fd2IzMihwYiwgMSk7IC8qIGFwZXJ0dXJlSGVpZ2h0X0QgKD0gMSkgKi8KKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBob3Jpek9mZl9OICg9IDApICovCisgICAgYXZpb193YjMyKHBiLCAxKTsgLyogaG9yaXpPZmZfRCAoPSAxKSAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHZlcnRPZmZfTiAoPSAwKSAqLworICAgIGF2aW9fd2IzMihwYiwgMSk7IC8qIHZlcnRPZmZfRCAoPSAxKSAqLworICAgIHJldHVybiA0MDsKK30KKwogc3RhdGljIGludCBtb3Zfd3JpdGVfcGFzcF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgQVZSYXRpb25hbCBzYXI7Ci0gICAgYXZfcmVkdWNlKCZzYXIubnVtLCAmc2FyLmRlbiwgdHJhY2stPmVuYy0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCi0gICAgICAgICAgICAgIHRyYWNrLT5lbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuLCBJTlRfTUFYKTsKKyAgICBhdl9yZWR1Y2UoJnNhci5udW0sICZzYXIuZGVuLCB0cmFjay0+cGFyLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKKyAgICAgICAgICAgICAgdHJhY2stPnBhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sIElOVF9NQVgpOwogCiAgICAgYXZpb193YjMyKHBiLCAxNik7CiAgICAgZmZpb193Zm91cmNjKHBiLCAicGFzcCIpOwpAQCAtMTU0NCwxMyArMTc3MywxMyBAQAogICAgIHVpbnQzMl90IGdhbWEgPSAwOwogICAgIGlmIChnYW1tYSA8PSAwLjApCiAgICAgewotICAgICAgICBnYW1tYSA9IGF2cHJpdl9nZXRfZ2FtbWFfZnJvbV90cmModHJhY2stPmVuYy0+Y29sb3JfdHJjKTsKKyAgICAgICAgZ2FtbWEgPSBhdnByaXZfZ2V0X2dhbW1hX2Zyb21fdHJjKHRyYWNrLT5wYXItPmNvbG9yX3RyYyk7CiAgICAgfQogICAgIGF2X2xvZyhwYiwgQVZfTE9HX0RFQlVHLCAiZ2FtbWEgdmFsdWUgJWdcbiIsIGdhbW1hKTsKIAogICAgIGlmIChnYW1tYSA+IDFlLTYpIHsKICAgICAgICAgZ2FtYSA9ICh1aW50MzJfdClscmludCgoZG91YmxlKSgxPDwxNikgKiBnYW1tYSk7Ci0gICAgICAgIGF2X2xvZyhwYiwgQVZfTE9HX0RFQlVHLCAid3JpdGluZyBnYW1hIHZhbHVlICVkXG4iLCBnYW1hKTsKKyAgICAgICAgYXZfbG9nKHBiLCBBVl9MT0dfREVCVUcsICJ3cml0aW5nIGdhbWEgdmFsdWUgJSJQUklkMzIiXG4iLCBnYW1hKTsKIAogICAgICAgICBhdl9hc3NlcnQwKHRyYWNrLT5tb2RlID09IE1PREVfTU9WKTsKICAgICAgICAgYXZpb193YjMyKHBiLCAxMik7CkBAIC0xNTY5LDMyICsxNzk4LDMyIEBACiAgICAgLy8gUmVmIChNT1YpOiBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9tYWMvdGVjaG5vdGVzL3RuMjE2Mi9faW5kZXguaHRtbCMvL2FwcGxlX3JlZi9kb2MvdWlkL0RUUzQwMDEzMDcwLUNIMS1UTlRBRzkKICAgICAvLyBSZWYgKE1QNCk6IElTTy9JRUMgMTQ0OTYtMTI6MjAxMgogCi0gICAgaWYgKHRyYWNrLT5lbmMtPmNvbG9yX3ByaW1hcmllcyA9PSBBVkNPTF9QUklfVU5TUEVDSUZJRUQgJiYKLSAgICAgICAgdHJhY2stPmVuYy0+Y29sb3JfdHJjID09IEFWQ09MX1RSQ19VTlNQRUNJRklFRCAmJgotICAgICAgICB0cmFjay0+ZW5jLT5jb2xvcnNwYWNlID09IEFWQ09MX1NQQ19VTlNQRUNJRklFRCkgewotICAgICAgICBpZiAoKHRyYWNrLT5lbmMtPndpZHRoID49IDE5MjAgJiYgdHJhY2stPmVuYy0+aGVpZ2h0ID49IDEwODApCi0gICAgICAgICAgfHwgKHRyYWNrLT5lbmMtPndpZHRoID09IDEyODAgJiYgdHJhY2stPmVuYy0+aGVpZ2h0ID09IDcyMCkpIHsKKyAgICBpZiAodHJhY2stPnBhci0+Y29sb3JfcHJpbWFyaWVzID09IEFWQ09MX1BSSV9VTlNQRUNJRklFRCAmJgorICAgICAgICB0cmFjay0+cGFyLT5jb2xvcl90cmMgPT0gQVZDT0xfVFJDX1VOU1BFQ0lGSUVEICYmCisgICAgICAgIHRyYWNrLT5wYXItPmNvbG9yX3NwYWNlID09IEFWQ09MX1NQQ19VTlNQRUNJRklFRCkgeworICAgICAgICBpZiAoKHRyYWNrLT5wYXItPndpZHRoID49IDE5MjAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID49IDEwODApCisgICAgICAgICAgfHwgKHRyYWNrLT5wYXItPndpZHRoID09IDEyODAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDcyMCkpIHsKICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgImNvbG9yIHByaW1hcmllcyB1bnNwZWNpZmllZCwgYXNzdW1pbmcgYnQ3MDlcbiIpOwotICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX0JUNzA5OwotICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPndpZHRoID09IDcyMCAmJiB0cmFjay0+aGVpZ2h0ID09IDU3NikgeworICAgICAgICAgICAgdHJhY2stPnBhci0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX0JUNzA5OworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPndpZHRoID09IDcyMCAmJiB0cmFjay0+aGVpZ2h0ID09IDU3NikgewogICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiY29sb3IgcHJpbWFyaWVzIHVuc3BlY2lmaWVkLCBhc3N1bWluZyBidDQ3MGJnXG4iKTsKLSAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvbG9yX3ByaW1hcmllcyA9IEFWQ09MX1BSSV9CVDQ3MEJHOwotICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPndpZHRoID09IDcyMCAmJgorICAgICAgICAgICAgdHJhY2stPnBhci0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX0JUNDcwQkc7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+d2lkdGggPT0gNzIwICYmCiAgICAgICAgICAgICAgICAgICAgKHRyYWNrLT5oZWlnaHQgPT0gNDg2IHx8IHRyYWNrLT5oZWlnaHQgPT0gNDgwKSkgewogICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiY29sb3IgcHJpbWFyaWVzIHVuc3BlY2lmaWVkLCBhc3N1bWluZyBzbXB0ZTE3MFxuIik7Ci0gICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2xvcl9wcmltYXJpZXMgPSBBVkNPTF9QUklfU01QVEUxNzBNOworICAgICAgICAgICAgdHJhY2stPnBhci0+Y29sb3JfcHJpbWFyaWVzID0gQVZDT0xfUFJJX1NNUFRFMTcwTTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgImNvbG9yIHByaW1hcmllcyB1bnNwZWNpZmllZCwgdW5hYmxlIHRvIGFzc3VtZSBhbnl0aGluZ1xuIik7CiAgICAgICAgIH0KLSAgICAgICAgc3dpdGNoICh0cmFjay0+ZW5jLT5jb2xvcl9wcmltYXJpZXMpIHsKKyAgICAgICAgc3dpdGNoICh0cmFjay0+cGFyLT5jb2xvcl9wcmltYXJpZXMpIHsKICAgICAgICAgY2FzZSBBVkNPTF9QUklfQlQ3MDk6Ci0gICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2xvcl90cmMgPSBBVkNPTF9UUkNfQlQ3MDk7Ci0gICAgICAgICAgICB0cmFjay0+ZW5jLT5jb2xvcnNwYWNlID0gQVZDT0xfU1BDX0JUNzA5OworICAgICAgICAgICAgdHJhY2stPnBhci0+Y29sb3JfdHJjID0gQVZDT0xfVFJDX0JUNzA5OworICAgICAgICAgICAgdHJhY2stPnBhci0+Y29sb3Jfc3BhY2UgPSBBVkNPTF9TUENfQlQ3MDk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVkNPTF9QUklfU01QVEUxNzBNOgogICAgICAgICBjYXNlIEFWQ09MX1BSSV9CVDQ3MEJHOgotICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29sb3JfdHJjID0gQVZDT0xfVFJDX0JUNzA5OwotICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29sb3JzcGFjZSA9IEFWQ09MX1NQQ19TTVBURTE3ME07CisgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2xvcl90cmMgPSBBVkNPTF9UUkNfQlQ3MDk7CisgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2xvcl9zcGFjZSA9IEFWQ09MX1NQQ19TTVBURTE3ME07CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTE2MDgsMjkgKzE4MzcsMzYgQEAKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAibmNseCIpOwogICAgIGVsc2UKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAibmNsYyIpOwotICAgIHN3aXRjaCAodHJhY2stPmVuYy0+Y29sb3JfcHJpbWFyaWVzKSB7CisgICAgc3dpdGNoICh0cmFjay0+cGFyLT5jb2xvcl9wcmltYXJpZXMpIHsKICAgICBjYXNlIEFWQ09MX1BSSV9CVDcwOTogICAgIGF2aW9fd2IxNihwYiwgMSk7IGJyZWFrOworICAgIGNhc2UgQVZDT0xfUFJJX0JUNDcwQkc6ICAgYXZpb193YjE2KHBiLCA1KTsgYnJlYWs7CiAgICAgY2FzZSBBVkNPTF9QUklfU01QVEUxNzBNOgogICAgIGNhc2UgQVZDT0xfUFJJX1NNUFRFMjQwTTogYXZpb193YjE2KHBiLCA2KTsgYnJlYWs7Ci0gICAgY2FzZSBBVkNPTF9QUklfQlQ0NzBCRzogICBhdmlvX3diMTYocGIsIDUpOyBicmVhazsKKyAgICBjYXNlIEFWQ09MX1BSSV9CVDIwMjA6ICAgIGF2aW9fd2IxNihwYiwgOSk7IGJyZWFrOworICAgIGNhc2UgQVZDT0xfUFJJX1NNUFRFNDMxOiAgYXZpb193YjE2KHBiLCAxMSk7IGJyZWFrOworICAgIGNhc2UgQVZDT0xfUFJJX1NNUFRFNDMyOiAgYXZpb193YjE2KHBiLCAxMik7IGJyZWFrOwogICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgYXZpb193YjE2KHBiLCAyKTsKICAgICB9Ci0gICAgc3dpdGNoICh0cmFjay0+ZW5jLT5jb2xvcl90cmMpIHsKLSAgICBjYXNlIEFWQ09MX1RSQ19CVDcwOTogICAgIGF2aW9fd2IxNihwYiwgMSk7IGJyZWFrOwotICAgIGNhc2UgQVZDT0xfVFJDX1NNUFRFMTcwTTogYXZpb193YjE2KHBiLCAxKTsgYnJlYWs7IC8vIHJlbWFwcGVkCi0gICAgY2FzZSBBVkNPTF9UUkNfU01QVEUyNDBNOiBhdmlvX3diMTYocGIsIDcpOyBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgMik7CisgICAgc3dpdGNoICh0cmFjay0+cGFyLT5jb2xvcl90cmMpIHsKKyAgICBjYXNlIEFWQ09MX1RSQ19CVDcwOTogICAgICAgIGF2aW9fd2IxNihwYiwgMSk7IGJyZWFrOworICAgIGNhc2UgQVZDT0xfVFJDX1NNUFRFMTcwTTogICAgYXZpb193YjE2KHBiLCAxKTsgYnJlYWs7IC8vIHJlbWFwcGVkCisgICAgY2FzZSBBVkNPTF9UUkNfU01QVEUyNDBNOiAgICBhdmlvX3diMTYocGIsIDcpOyBicmVhazsKKyAgICBjYXNlIEFWQ09MX1RSQ19TTVBURVNUMjA4NDogIGF2aW9fd2IxNihwYiwgMTYpOyBicmVhazsKKyAgICBjYXNlIEFWQ09MX1RSQ19TTVBURTQyODogICAgIGF2aW9fd2IxNihwYiwgMTcpOyBicmVhazsKKyAgICBjYXNlIEFWQ09MX1RSQ19BUklCX1NURF9CNjc6IGF2aW9fd2IxNihwYiwgMTgpOyBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgMik7CiAgICAgfQotICAgIHN3aXRjaCAodHJhY2stPmVuYy0+Y29sb3JzcGFjZSkgewotICAgIGNhc2UgQVZDT0xfU1BDX0JUNzA5OiAgICAgYXZpb193YjE2KHBiLCAxKTsgYnJlYWs7CisgICAgc3dpdGNoICh0cmFjay0+cGFyLT5jb2xvcl9zcGFjZSkgeworICAgIGNhc2UgQVZDT0xfU1BDX0JUNzA5OiAgICAgIGF2aW9fd2IxNihwYiwgMSk7IGJyZWFrOwogICAgIGNhc2UgQVZDT0xfU1BDX0JUNDcwQkc6Ci0gICAgY2FzZSBBVkNPTF9TUENfU01QVEUxNzBNOiBhdmlvX3diMTYocGIsIDYpOyBicmVhazsKLSAgICBjYXNlIEFWQ09MX1NQQ19TTVBURTI0ME06IGF2aW9fd2IxNihwYiwgNyk7IGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgYXZpb193YjE2KHBiLCAyKTsKKyAgICBjYXNlIEFWQ09MX1NQQ19TTVBURTE3ME06ICBhdmlvX3diMTYocGIsIDYpOyBicmVhazsKKyAgICBjYXNlIEFWQ09MX1NQQ19TTVBURTI0ME06ICBhdmlvX3diMTYocGIsIDcpOyBicmVhazsKKyAgICBjYXNlIEFWQ09MX1NQQ19CVDIwMjBfTkNMOiBhdmlvX3diMTYocGIsIDkpOyBicmVhazsKKyAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICBhdmlvX3diMTYocGIsIDIpOwogICAgIH0KIAogICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01QNCkgewotICAgICAgICBpbnQgZnVsbF9yYW5nZSA9IHRyYWNrLT5lbmMtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUc7CisgICAgICAgIGludCBmdWxsX3JhbmdlID0gdHJhY2stPnBhci0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRzsKICAgICAgICAgYXZpb193OChwYiwgZnVsbF9yYW5nZSA8PCA3KTsKICAgICAgICAgcmV0dXJuIDE5OwogICAgIH0gZWxzZSB7CkBAIC0xNjQxLDI2ICsxODc3LDI2IEBACiBzdGF0aWMgdm9pZCBmaW5kX2NvbXByZXNzb3IoY2hhciAqIGNvbXByZXNzb3JfbmFtZSwgaW50IGxlbiwgTU9WVHJhY2sgKnRyYWNrKQogewogICAgIEFWRGljdGlvbmFyeUVudHJ5ICplbmNvZGVyOwotICAgIGludCB4ZGNhbV9yZXMgPSAgKHRyYWNrLT5lbmMtPndpZHRoID09IDEyODAgJiYgdHJhY2stPmVuYy0+aGVpZ2h0ID09IDcyMCkKLSAgICAgICAgICAgICAgICAgIHx8ICh0cmFjay0+ZW5jLT53aWR0aCA9PSAxNDQwICYmIHRyYWNrLT5lbmMtPmhlaWdodCA9PSAxMDgwKQotICAgICAgICAgICAgICAgICAgfHwgKHRyYWNrLT5lbmMtPndpZHRoID09IDE5MjAgJiYgdHJhY2stPmVuYy0+aGVpZ2h0ID09IDEwODApOworICAgIGludCB4ZGNhbV9yZXMgPSAgKHRyYWNrLT5wYXItPndpZHRoID09IDEyODAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDcyMCkKKyAgICAgICAgICAgICAgICAgIHx8ICh0cmFjay0+cGFyLT53aWR0aCA9PSAxNDQwICYmIHRyYWNrLT5wYXItPmhlaWdodCA9PSAxMDgwKQorICAgICAgICAgICAgICAgICAgfHwgKHRyYWNrLT5wYXItPndpZHRoID09IDE5MjAgJiYgdHJhY2stPnBhci0+aGVpZ2h0ID09IDEwODApOwogCiAgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WICYmCiAgICAgICAgIChlbmNvZGVyID0gYXZfZGljdF9nZXQodHJhY2stPnN0LT5tZXRhZGF0YSwgImVuY29kZXIiLCBOVUxMLCAwKSkpIHsKICAgICAgICAgYXZfc3RybGNweShjb21wcmVzc29yX25hbWUsIGVuY29kZXItPnZhbHVlLCAzMik7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmIHhkY2FtX3JlcykgewotICAgICAgICBpbnQgaW50ZXJsYWNlZCA9IHRyYWNrLT5lbmMtPmZpZWxkX29yZGVyID4gQVZfRklFTERfUFJPR1JFU1NJVkU7CisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICYmIHhkY2FtX3JlcykgeworICAgICAgICBpbnQgaW50ZXJsYWNlZCA9IHRyYWNrLT5wYXItPmZpZWxkX29yZGVyID4gQVZfRklFTERfUFJPR1JFU1NJVkU7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHRyYWNrLT5zdDsKLSAgICAgICAgaW50IHJhdGUgPSBhdl9xMmQoZmluZF9mcHMoTlVMTCwgc3QpKTsKKyAgICAgICAgaW50IHJhdGUgPSBkZWZpbmVkX2ZyYW1lX3JhdGUoTlVMTCwgc3QpOwogICAgICAgICBhdl9zdHJsY2F0Zihjb21wcmVzc29yX25hbWUsIGxlbiwgIlhEQ0FNIik7Ci0gICAgICAgIGlmICh0cmFjay0+ZW5jLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgeworICAgICAgICBpZiAodHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIyUCkgewogICAgICAgICAgICAgYXZfc3RybGNhdGYoY29tcHJlc3Nvcl9uYW1lLCBsZW4sICIgSEQ0MjIiKTsKLSAgICAgICAgfSBlbHNlIGlmKHRyYWNrLT5lbmMtPndpZHRoID09IDE0NDApIHsKKyAgICAgICAgfSBlbHNlIGlmKHRyYWNrLT5wYXItPndpZHRoID09IDE0NDApIHsKICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGNvbXByZXNzb3JfbmFtZSwgbGVuLCAiIEhEIik7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgYXZfc3RybGNhdGYoY29tcHJlc3Nvcl9uYW1lLCBsZW4sICIgRVgiKTsKIAotICAgICAgICBhdl9zdHJsY2F0Zihjb21wcmVzc29yX25hbWUsIGxlbiwgIiAlZCVjIiwgdHJhY2stPmVuYy0+aGVpZ2h0LCBpbnRlcmxhY2VkID8gJ2knIDogJ3AnKTsKKyAgICAgICAgYXZfc3RybGNhdGYoY29tcHJlc3Nvcl9uYW1lLCBsZW4sICIgJWQlYyIsIHRyYWNrLT5wYXItPmhlaWdodCwgaW50ZXJsYWNlZCA/ICdpJyA6ICdwJyk7CiAKICAgICAgICAgYXZfc3RybGNhdGYoY29tcHJlc3Nvcl9uYW1lLCBsZW4sICIlZCIsIHJhdGUgKiAoaW50ZXJsYWNlZCArIDEpKTsKICAgICB9CkBAIC0xNjcyLDYgKzE5MDgsMTMgQEAKICAgICBjaGFyIGNvbXByZXNzb3JfbmFtZVszMl0gPSB7IDAgfTsKICAgICBpbnQgYXZpZCA9IDA7CiAKKyAgICBpbnQgdW5jb21wcmVzc2VkX3ljYmNyID0gKCh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTyAmJiB0cmFjay0+cGFyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9VWVZZNDIyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPICYmIHRyYWNrLT5wYXItPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVWVY0MjIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgdHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVjMwOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1Y0MDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICB0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WNDEwCisgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgdHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVjIxMCk7CisKICAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCiAgICAgaWYgKG1vdi0+ZW5jcnlwdGlvbl9zY2hlbWUgIT0gTU9WX0VOQ19OT05FKSB7CiAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImVuY3YiKTsKQEAgLTE2ODIsMTEgKzE5MjUsMTUgQEAKICAgICBhdmlvX3diMTYocGIsIDApOyAvKiBSZXNlcnZlZCAqLwogICAgIGF2aW9fd2IxNihwYiwgMSk7IC8qIERhdGEtcmVmZXJlbmNlIGluZGV4ICovCiAKLSAgICBhdmlvX3diMTYocGIsIDApOyAvKiBDb2RlYyBzdHJlYW0gdmVyc2lvbiAqLworICAgIGlmICh1bmNvbXByZXNzZWRfeWNiY3IpIHsKKyAgICAgICAgYXZpb193YjE2KHBiLCAyKTsgLyogQ29kZWMgc3RyZWFtIHZlcnNpb24gKi8KKyAgICB9IGVsc2UgeworICAgICAgICBhdmlvX3diMTYocGIsIDApOyAvKiBDb2RlYyBzdHJlYW0gdmVyc2lvbiAqLworICAgIH0KICAgICBhdmlvX3diMTYocGIsIDApOyAvKiBDb2RlYyBzdHJlYW0gcmV2aXNpb24gKD0wKSAqLwogICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PVikgewogICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJGRk1QIik7IC8qIFZlbmRvciAqLwotICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUkFXVklERU8pIHsKKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPIHx8IHVuY29tcHJlc3NlZF95Y2JjcikgewogICAgICAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogVGVtcG9yYWwgUXVhbGl0eSAqLwogICAgICAgICAgICAgYXZpb193YjMyKHBiLCAweDQwMCk7IC8qIFNwYXRpYWwgUXVhbGl0eSA9IGxvc3NsZXNzKi8KICAgICAgICAgfSBlbHNlIHsKQEAgLTE2OTgsNyArMTk0NSw3IEBACiAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIFJlc2VydmVkICovCiAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIFJlc2VydmVkICovCiAgICAgfQotICAgIGF2aW9fd2IxNihwYiwgdHJhY2stPmVuYy0+d2lkdGgpOyAvKiBWaWRlbyB3aWR0aCAqLworICAgIGF2aW9fd2IxNihwYiwgdHJhY2stPnBhci0+d2lkdGgpOyAvKiBWaWRlbyB3aWR0aCAqLwogICAgIGF2aW9fd2IxNihwYiwgdHJhY2stPmhlaWdodCk7IC8qIFZpZGVvIGhlaWdodCAqLwogICAgIGF2aW9fd2IzMihwYiwgMHgwMDQ4MDAwMCk7IC8qIEhvcml6b250YWwgcmVzb2x1dGlvbiA3MmRwaSAqLwogICAgIGF2aW9fd2IzMihwYiwgMHgwMDQ4MDAwMCk7IC8qIFZlcnRpY2FsIHJlc29sdXRpb24gNzJkcGkgKi8KQEAgLTE3MTAsNDUgKzE5NTcsODEgQEAKICAgICBhdmlvX3c4KHBiLCBzdHJsZW4oY29tcHJlc3Nvcl9uYW1lKSk7CiAgICAgYXZpb193cml0ZShwYiwgY29tcHJlc3Nvcl9uYW1lLCAzMSk7CiAKLSAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YgJiYgdHJhY2stPmVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQotICAgICAgICBhdmlvX3diMTYocGIsIHRyYWNrLT5lbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WICYmCisgICAgICAgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1Y0MTAgfHwgdHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVjIxMCkpCisgICAgICAgIGF2aW9fd2IxNihwYiwgMHgxOCk7CisgICAgZWxzZSBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YgJiYgdHJhY2stPnBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQorICAgICAgICBhdmlvX3diMTYocGIsIHRyYWNrLT5wYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSB8CisgICAgICAgICAgICAgICAgICAodHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfR1JBWTggPyAweDIwIDogMCkpOwogICAgIGVsc2UKICAgICAgICAgYXZpb193YjE2KHBiLCAweDE4KTsgLyogUmVzZXJ2ZWQgKi8KLSAgICBhdmlvX3diMTYocGIsIDB4ZmZmZik7IC8qIFJlc2VydmVkICovCisKKyAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YgJiYgdHJhY2stPnBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfUEFMOCkgeworICAgICAgICBpbnQgcGFsX3NpemUgPSAxIDw8IHRyYWNrLT5wYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGF2aW9fd2IxNihwYiwgMCk7ICAgICAgICAgICAgIC8qIENvbG9yIHRhYmxlIElEICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAgICAgIC8qIENvbG9yIHRhYmxlIHNlZWQgKi8KKyAgICAgICAgYXZpb193YjE2KHBiLCAweDgwMDApOyAgICAgICAgLyogQ29sb3IgdGFibGUgZmxhZ3MgKi8KKyAgICAgICAgYXZpb193YjE2KHBiLCBwYWxfc2l6ZSAtIDEpOyAgLyogQ29sb3IgdGFibGUgc2l6ZSAoemVyby1yZWxhdGl2ZSkgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhbF9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJnYiA9IHRyYWNrLT5wYWxldHRlW2ldOworICAgICAgICAgICAgdWludDE2X3QgciA9IChyZ2IgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgIHVpbnQxNl90IGcgPSAocmdiID4+IDgpICAmIDB4ZmY7CisgICAgICAgICAgICB1aW50MTZfdCBiID0gcmdiICAgICAgICAgJiAweGZmOworICAgICAgICAgICAgYXZpb193YjE2KHBiLCAwKTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgKHIgPDwgOCkgfCByKTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgKGcgPDwgOCkgfCBnKTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgKGIgPDwgOCkgfCBiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBhdmlvX3diMTYocGIsIDB4ZmZmZik7IC8qIFJlc2VydmVkICovCisKICAgICBpZiAodHJhY2stPnRhZyA9PSBNS1RBRygnbScsJ3AnLCc0JywndicpKQogICAgICAgICBtb3Zfd3JpdGVfZXNkc190YWcocGIsIHRyYWNrKTsKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzKQorICAgIGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjMpCiAgICAgICAgIG1vdl93cml0ZV9kMjYzX3RhZyhwYik7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVZVSSB8fAotICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1ZRMykgeworICAgIGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FWVUkgfHwKKyAgICAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NWUTMpIHsKICAgICAgICAgbW92X3dyaXRlX2V4dHJhZGF0YV90YWcocGIsIHRyYWNrKTsKICAgICAgICAgYXZpb193YjMyKHBiLCAwKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ROWEhEKSB7CisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ETlhIRCkgewogICAgICAgICBtb3Zfd3JpdGVfYXZpZF90YWcocGIsIHRyYWNrKTsKICAgICAgICAgYXZpZCA9IDE7Ci0gICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDKQorICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQykKICAgICAgICAgbW92X3dyaXRlX2h2Y2NfdGFnKHBiLCB0cmFjayk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJiAhVEFHX0lTX0FWQ0kodHJhY2stPnRhZykpIHsKKyAgICBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmICFUQUdfSVNfQVZDSSh0cmFjay0+dGFnKSkgewogICAgICAgICBtb3Zfd3JpdGVfYXZjY190YWcocGIsIHRyYWNrKTsKICAgICAgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfSVBPRCkKICAgICAgICAgICAgIG1vdl93cml0ZV91dWlkX3RhZ19pcG9kKHBiKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSAmJiB0cmFjay0+dm9zX2xlbiA+IDApCisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpIHsKKyAgICAgICAgbW92X3dyaXRlX3ZwY2NfdGFnKG1vdi0+ZmMsIHBiLCB0cmFjayk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEgJiYgdHJhY2stPnZvc19sZW4gPiAwKQogICAgICAgICBtb3Zfd3JpdGVfZHZjMV90YWcocGIsIHRyYWNrKTsKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZGIHx8Ci0gICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2QSkgeworICAgIGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkYgfHwKKyAgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDZBKSB7CiAgICAgICAgIC8qIERvbid0IHdyaXRlIGFueSBwb3RlbnRpYWwgZXh0cmFkYXRhIGhlcmUgLSB0aGUgY3JvcHBpbmcKICAgICAgICAgICogaXMgc2lnbmFsbGVkIHZpYSB0aGUgbm9ybWFsIHdpZHRoL2hlaWdodCBmaWVsZHMuICovCi0gICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SMTBLKSB7Ci0gICAgICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY190YWcgPT0gTUtUQUcoJ1InLCcxJywnMCcsJ2snKSkKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1IxMEspIHsKKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3RhZyA9PSBNS1RBRygnUicsJzEnLCcwJywnaycpKQogICAgICAgICAgICAgbW92X3dyaXRlX2RweGVfdGFnKHBiLCB0cmFjayk7CiAgICAgfSBlbHNlIGlmICh0cmFjay0+dm9zX2xlbiA+IDApCiAgICAgICAgIG1vdl93cml0ZV9nbGJsX3RhZyhwYiwgdHJhY2spOwogCi0gICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0gyNjQgJiYKLSAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzQgJiYKLSAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfRE5YSEQpCi0gICAgICAgIGlmICh0cmFjay0+ZW5jLT5maWVsZF9vcmRlciAhPSBBVl9GSUVMRF9VTktOT1dOKQotICAgICAgICAgICAgbW92X3dyaXRlX2ZpZWxfdGFnKHBiLCB0cmFjayk7CisgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0gyNjQgJiYKKyAgICAgICAgdHJhY2stPnBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzQgJiYKKyAgICAgICAgdHJhY2stPnBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfRE5YSEQpIHsKKyAgICAgICAgaW50IGZpZWxkX29yZGVyID0gdHJhY2stPnBhci0+ZmllbGRfb3JkZXI7CisKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorICAgIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBpZiAoZmllbGRfb3JkZXIgIT0gdHJhY2stPnN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgJiYgdHJhY2stPnN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgIT0gQVZfRklFTERfVU5LTk9XTikKKyAgICAgICAgZmllbGRfb3JkZXIgPSB0cmFjay0+c3QtPmNvZGVjLT5maWVsZF9vcmRlcjsKKyAgICBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgICAgIGlmIChmaWVsZF9vcmRlciAhPSBBVl9GSUVMRF9VTktOT1dOKQorICAgICAgICAgICAgbW92X3dyaXRlX2ZpZWxfdGFnKHBiLCB0cmFjaywgZmllbGRfb3JkZXIpOworICAgIH0KIAogICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfV1JJVEVfR0FNQSkgewogICAgICAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YpCkBAIC0xNzYzLDExICsyMDQ2LDI0IEBACiAgICAgICAgICAgICBhdl9sb2cobW92LT5mYywgQVZfTE9HX1dBUk5JTkcsICJOb3Qgd3JpdGluZyAnY29scicgYXRvbS4gRm9ybWF0IGlzIG5vdCBNT1Ygb3IgTVA0LlxuIik7CiAgICAgfQogCi0gICAgaWYgKHRyYWNrLT5lbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuICYmIHRyYWNrLT5lbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmCi0gICAgICAgIHRyYWNrLT5lbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuICE9IHRyYWNrLT5lbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKSB7CisgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTVA0ICYmIG1vdi0+ZmMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8PSBGRl9DT01QTElBTkNFX1VOT0ZGSUNJQUwpIHsKKyAgICAgICAgQVZTdGVyZW8zRCogc3RlcmVvXzNkID0gKEFWU3RlcmVvM0QqKSBhdl9zdHJlYW1fZ2V0X3NpZGVfZGF0YSh0cmFjay0+c3QsIEFWX1BLVF9EQVRBX1NURVJFTzNELCBOVUxMKTsKKyAgICAgICAgQVZTcGhlcmljYWxNYXBwaW5nKiBzcGhlcmljYWxfbWFwcGluZyA9IChBVlNwaGVyaWNhbE1hcHBpbmcqKWF2X3N0cmVhbV9nZXRfc2lkZV9kYXRhKHRyYWNrLT5zdCwgQVZfUEtUX0RBVEFfU1BIRVJJQ0FMLCBOVUxMKTsKKworICAgICAgICBpZiAoc3RlcmVvXzNkKQorICAgICAgICAgICAgbW92X3dyaXRlX3N0M2RfdGFnKHBiLCBzdGVyZW9fM2QpOworICAgICAgICBpZiAoc3BoZXJpY2FsX21hcHBpbmcpCisgICAgICAgICAgICBtb3Zfd3JpdGVfc3YzZF90YWcobW92LT5mYywgcGIsIHNwaGVyaWNhbF9tYXBwaW5nKTsKKyAgICB9CisKKyAgICBpZiAodHJhY2stPnBhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4gJiYgdHJhY2stPnBhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0pIHsKICAgICAgICAgbW92X3dyaXRlX3Bhc3BfdGFnKHBiLCB0cmFjayk7CiAgICAgfQogCisgICAgaWYgKHVuY29tcHJlc3NlZF95Y2Jjcil7CisgICAgICAgIG1vdl93cml0ZV9jbGFwX3RhZyhwYiwgdHJhY2spOworICAgIH0KKwogICAgIGlmIChtb3YtPmVuY3J5cHRpb25fc2NoZW1lICE9IE1PVl9FTkNfTk9ORSkgewogICAgICAgICBmZl9tb3ZfY2VuY193cml0ZV9zaW5mX3RhZyh0cmFjaywgcGIsIG1vdi0+ZW5jcnlwdGlvbl9raWQpOwogICAgIH0KQEAgLTE4MjMsMTAgKzIxMTksMjUgQEAKIHsKICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CiAjaWYgMQotICAgIGludCBmcmFtZV9kdXJhdGlvbiA9IGF2X3Jlc2NhbGUodHJhY2stPnRpbWVzY2FsZSwgdHJhY2stPmVuYy0+dGltZV9iYXNlLm51bSwgdHJhY2stPmVuYy0+dGltZV9iYXNlLmRlbik7Ci0gICAgaW50IG5iX2ZyYW1lcyA9IFJPVU5ERURfRElWKHRyYWNrLT5lbmMtPnRpbWVfYmFzZS5kZW4sIHRyYWNrLT5lbmMtPnRpbWVfYmFzZS5udW0pOworICAgIGludCBmcmFtZV9kdXJhdGlvbjsKKyAgICBpbnQgbmJfZnJhbWVzOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKIAorICAgIGlmICghdHJhY2stPnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0gfHwgIXRyYWNrLT5zdC0+YXZnX2ZyYW1lX3JhdGUuZGVuKSB7CisjaWYgRkZfQVBJX0xBVkZfQVZDVFgKKyAgICBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIGZyYW1lX2R1cmF0aW9uID0gYXZfcmVzY2FsZSh0cmFjay0+dGltZXNjYWxlLCB0cmFjay0+c3QtPmNvZGVjLT50aW1lX2Jhc2UubnVtLCB0cmFjay0+c3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgbmJfZnJhbWVzICAgICAgPSBST1VOREVEX0RJVih0cmFjay0+c3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuLCB0cmFjay0+c3QtPmNvZGVjLT50aW1lX2Jhc2UubnVtKTsKKyAgICBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbHNlCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJhdmdfZnJhbWVfcmF0ZSBub3Qgc2V0IGZvciB0bWNkIHRyYWNrLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBmcmFtZV9kdXJhdGlvbiA9IGF2X3Jlc2NhbGUodHJhY2stPnRpbWVzY2FsZSwgdHJhY2stPnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0sIHRyYWNrLT5zdC0+YXZnX2ZyYW1lX3JhdGUuZGVuKTsKKyAgICAgICAgbmJfZnJhbWVzICAgICAgPSBST1VOREVEX0RJVih0cmFjay0+c3QtPmF2Z19mcmFtZV9yYXRlLmRlbiwgdHJhY2stPnN0LT5hdmdfZnJhbWVfcmF0ZS5udW0pOworICAgIH0KKwogICAgIGlmIChuYl9mcmFtZXMgPiAyNTUpIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImZwcyAlZCBpcyB0b28gbGFyZ2VcbiIsIG5iX2ZyYW1lcyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC0xODQzLDEwICsyMTU0LDggQEAKICAgICBhdmlvX3c4KHBiLCBuYl9mcmFtZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwogICAgIGF2aW9fdzgocGIsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLwogCi0gICAgaWYgKHRyYWNrLT5zdCkKLSAgICAgICAgdCA9IGF2X2RpY3RfZ2V0KHRyYWNrLT5zdC0+bWV0YWRhdGEsICJyZWVsX25hbWUiLCBOVUxMLCAwKTsKLQotICAgIGlmICh0ICYmIHV0ZjhsZW4odC0+dmFsdWUpKQorICAgIHQgPSBhdl9kaWN0X2dldCh0cmFjay0+c3QtPm1ldGFkYXRhLCAicmVlbF9uYW1lIiwgTlVMTCwgMCk7CisgICAgaWYgKHQgJiYgdXRmOGxlbih0LT52YWx1ZSkgJiYgdHJhY2stPm1vZGUgIT0gTU9ERV9NUDQpCiAgICAgICAgIG1vdl93cml0ZV9zb3VyY2VfcmVmZXJlbmNlX3RhZyhwYiwgdHJhY2ssIHQtPnZhbHVlKTsKICAgICBlbHNlCiAgICAgICAgIGF2aW9fd2IxNihwYiwgMCk7IC8qIHplcm8gc2l6ZSAqLwpAQCAtMTg1NiwzNCArMjE2NSw0OSBAQAogICAgIGZmaW9fd2ZvdXJjYyhwYiwgInRtY2QiKTsgICAgICAgICAgICAgICAvKiBEYXRhIGZvcm1hdCAqLwogICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCAqLwogICAgIGF2aW9fd2IzMihwYiwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBEYXRhIHJlZmVyZW5jZSBpbmRleCAqLwotICAgIGlmICh0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSkKLSAgICAgICAgYXZpb193cml0ZShwYiwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhLCB0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgaWYgKHRyYWNrLT5wYXItPmV4dHJhZGF0YV9zaXplKQorICAgICAgICBhdmlvX3dyaXRlKHBiLCB0cmFjay0+cGFyLT5leHRyYWRhdGEsIHRyYWNrLT5wYXItPmV4dHJhZGF0YV9zaXplKTsKICNlbmRpZgogICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKIH0KIAotc3RhdGljIGludCBtb3Zfd3JpdGVfc3RzZF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsIE1PVlRyYWNrICp0cmFjaykKK3N0YXRpYyBpbnQgbW92X3dyaXRlX2dwbWRfdGFnKEFWSU9Db250ZXh0ICpwYiwgY29uc3QgTU9WVHJhY2sgKnRyYWNrKQoreworICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiZ3BtZCIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIFJlc2VydmVkICovCisgICAgYXZpb193YjE2KHBiLCAwKTsgLyogUmVzZXJ2ZWQgKi8KKyAgICBhdmlvX3diMTYocGIsIDEpOyAvKiBEYXRhLXJlZmVyZW5jZSBpbmRleCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIFJlc2VydmVkICovCisgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOworfQorCitzdGF0aWMgaW50IG1vdl93cml0ZV9zdHNkX3RhZyhBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOwogICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJzdHNkIik7CiAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogdmVyc2lvbiAmIGZsYWdzICovCiAgICAgYXZpb193YjMyKHBiLCAxKTsgLyogZW50cnkgY291bnQgKi8KLSAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICBtb3Zfd3JpdGVfdmlkZW9fdGFnKHBiLCBtb3YsIHRyYWNrKTsKLSAgICBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKLSAgICAgICAgbW92X3dyaXRlX2F1ZGlvX3RhZyhwYiwgbW92LCB0cmFjayk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCisgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgICAgIG1vdl93cml0ZV9hdWRpb190YWcocywgcGIsIG1vdiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKQogICAgICAgICBtb3Zfd3JpdGVfc3VidGl0bGVfdGFnKHBiLCB0cmFjayk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdGFnID09IE1LVEFHKCdyJywndCcsJ3AnLCcgJykpCisgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfdGFnID09IE1LVEFHKCdyJywndCcsJ3AnLCcgJykpCiAgICAgICAgIG1vdl93cml0ZV9ydHBfdGFnKHBiLCB0cmFjayk7Ci0gICAgZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdGFnID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykpCisgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfdGFnID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykpCiAgICAgICAgIG1vdl93cml0ZV90bWNkX3RhZyhwYiwgdHJhY2spOworICAgIGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3RhZyA9PSBNS1RBRygnZycsJ3AnLCdtJywnZCcpKQorICAgICAgICBtb3Zfd3JpdGVfZ3BtZF90YWcocGIsIHRyYWNrKTsKICAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7CiB9CiAKLXN0YXRpYyBpbnQgbW92X3dyaXRlX2N0dHNfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQorc3RhdGljIGludCBtb3Zfd3JpdGVfY3R0c190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKIHsKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CiAgICAgTU9WU3R0cyAqY3R0c19lbnRyaWVzOwogICAgIHVpbnQzMl90IGVudHJpZXMgPSAwOwogICAgIHVpbnQzMl90IGF0b21fc2l6ZTsKQEAgLTE5MDcsNyArMjIzMSwxMSBAQAogICAgIGF0b21fc2l6ZSA9IDE2ICsgKGVudHJpZXMgKiA4KTsKICAgICBhdmlvX3diMzIocGIsIGF0b21fc2l6ZSk7IC8qIHNpemUgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJjdHRzIik7Ci0gICAgYXZpb193YjMyKHBiLCAwKTsgLyogdmVyc2lvbiAmIGZsYWdzICovCisgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19ORUdBVElWRV9DVFNfT0ZGU0VUUykKKyAgICAgICAgYXZpb193OChwYiwgMSk7IC8qIHZlcnNpb24gKi8KKyAgICBlbHNlCisgICAgICAgIGF2aW9fdzgocGIsIDApOyAvKiB2ZXJzaW9uICovCisgICAgYXZpb193YjI0KHBiLCAwKTsgLyogZmxhZ3MgKi8KICAgICBhdmlvX3diMzIocGIsIGVudHJpZXMpOyAvKiBlbnRyeSBjb3VudCAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKICAgICAgICAgYXZpb193YjMyKHBiLCBjdHRzX2VudHJpZXNbaV0uY291bnQpOwpAQCAtMTkyNSw3ICsyMjUzLDcgQEAKICAgICB1aW50MzJfdCBhdG9tX3NpemU7CiAgICAgaW50IGk7CiAKLSAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgIXRyYWNrLT5hdWRpb192YnIpIHsKKyAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgIXRyYWNrLT5hdWRpb192YnIpIHsKICAgICAgICAgc3R0c19lbnRyaWVzID0gYXZfbWFsbG9jKHNpemVvZigqc3R0c19lbnRyaWVzKSk7IC8qIG9uZSBlbnRyeSAqLwogICAgICAgICBpZiAoIXN0dHNfZW50cmllcykKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC0xOTc4LDMzICsyMzA2LDEzMyBAQAogICAgIHJldHVybiAyODsKIH0KIAotc3RhdGljIGludCBtb3Zfd3JpdGVfc3RibF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsIE1PVlRyYWNrICp0cmFjaykKK3N0YXRpYyBpbnQgbW92X3ByZXJvbGxfd3JpdGVfc3RibF9hdG9tcyhBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKK3sKKyAgICBzdHJ1Y3Qgc2dwZF9lbnRyeSB7CisgICAgICAgIGludCBjb3VudDsKKyAgICAgICAgaW50MTZfdCByb2xsX2Rpc3RhbmNlOworICAgICAgICBpbnQgZ3JvdXBfZGVzY3JpcHRpb25faW5kZXg7CisgICAgfTsKKworICAgIHN0cnVjdCBzZ3BkX2VudHJ5ICpzZ3BkX2VudHJpZXMgPSBOVUxMOworICAgIGludCBlbnRyaWVzID0gLTE7CisgICAgaW50IGdyb3VwID0gMDsKKyAgICBpbnQgaSwgajsKKworICAgIGNvbnN0IGludCBPUFVTX1NFRUtfUFJFUk9MTF9NUyA9IDgwOworICAgIGludCByb2xsX3NhbXBsZXMgPSBhdl9yZXNjYWxlX3EoT1BVU19TRUVLX1BSRVJPTExfTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgMTAwMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZSYXRpb25hbCl7MSwgNDgwMDB9KTsKKworICAgIGlmICghdHJhY2stPmVudHJ5KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNncGRfZW50cmllcyA9IGF2X21hbGxvY19hcnJheSh0cmFjay0+ZW50cnksIHNpemVvZigqc2dwZF9lbnRyaWVzKSk7CisgICAgaWYgKCFzZ3BkX2VudHJpZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9hc3NlcnQwKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMgfHwgdHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKTsKKworICAgIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0cmFjay0+ZW50cnk7IGkrKykgeworICAgICAgICAgICAgaW50IHJvbGxfc2FtcGxlc19yZW1haW5pbmcgPSByb2xsX3NhbXBsZXM7CisgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSAwOworICAgICAgICAgICAgZm9yIChqID0gaSAtIDE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICAgICAgcm9sbF9zYW1wbGVzX3JlbWFpbmluZyAtPSBnZXRfY2x1c3Rlcl9kdXJhdGlvbih0cmFjaywgaik7CisgICAgICAgICAgICAgICAgZGlzdGFuY2UrKzsKKyAgICAgICAgICAgICAgICBpZiAocm9sbF9zYW1wbGVzX3JlbWFpbmluZyA8PSAwKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFdlIGRvbid0IGhhdmUgZW5vdWdoIHByZWNlZWRpbmcgc2FtcGxlcyB0byBjb21wdXRlIGEgdmFsaWQKKyAgICAgICAgICAgICAgIHJvbGxfZGlzdGFuY2UgaGVyZSwgc28gdGhpcyBzYW1wbGUgY2FuJ3QgYmUgaW5kZXBlbmRlbnRseQorICAgICAgICAgICAgICAgZGVjb2RlZC4gKi8KKyAgICAgICAgICAgIGlmIChyb2xsX3NhbXBsZXNfcmVtYWluaW5nID4gMCkKKyAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IDA7CisgICAgICAgICAgICAvKiBWZXJpZnkgZGlzdGFuY2UgaXMgYSBtaW5pbXVtIG9mIDIgKDYwbXMpIHBhY2tldHMgYW5kIGEgbWF4aW11bSBvZgorICAgICAgICAgICAgICAgMzIgKDIuNW1zKSBwYWNrZXRzLiAqLworICAgICAgICAgICAgYXZfYXNzZXJ0MChkaXN0YW5jZSA9PSAwIHx8IChkaXN0YW5jZSA+PSAyICYmIGRpc3RhbmNlIDw9IDMyKSk7CisgICAgICAgICAgICBpZiAoaSAmJiBkaXN0YW5jZSA9PSBzZ3BkX2VudHJpZXNbZW50cmllc10ucm9sbF9kaXN0YW5jZSkgeworICAgICAgICAgICAgICAgIHNncGRfZW50cmllc1tlbnRyaWVzXS5jb3VudCsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbnRyaWVzKys7CisgICAgICAgICAgICAgICAgc2dwZF9lbnRyaWVzW2VudHJpZXNdLmNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBzZ3BkX2VudHJpZXNbZW50cmllc10ucm9sbF9kaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAgICAgIHNncGRfZW50cmllc1tlbnRyaWVzXS5ncm91cF9kZXNjcmlwdGlvbl9pbmRleCA9IGRpc3RhbmNlID8gKytncm91cCA6IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlbnRyaWVzKys7CisgICAgICAgIHNncGRfZW50cmllc1tlbnRyaWVzXS5jb3VudCA9IHRyYWNrLT5zYW1wbGVfY291bnQ7CisgICAgICAgIHNncGRfZW50cmllc1tlbnRyaWVzXS5yb2xsX2Rpc3RhbmNlID0gMTsKKyAgICAgICAgc2dwZF9lbnRyaWVzW2VudHJpZXNdLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4ID0gKytncm91cDsKKyAgICB9CisgICAgZW50cmllcysrOworCisgICAgaWYgKCFncm91cCkgeworICAgICAgICBhdl9mcmVlKHNncGRfZW50cmllcyk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIFdyaXRlIHNncGQgdGFnICovCisgICAgYXZpb193YjMyKHBiLCAyNCArIChncm91cCAqIDIpKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgInNncGQiKTsKKyAgICBhdmlvX3diMzIocGIsIDEgPDwgMjQpOyAvKiBmdWxsYm94ICovCisgICAgZmZpb193Zm91cmNjKHBiLCAicm9sbCIpOworICAgIGF2aW9fd2IzMihwYiwgMik7IC8qIGRlZmF1bHRfbGVuZ3RoICovCisgICAgYXZpb193YjMyKHBiLCBncm91cCk7IC8qIGVudHJ5X2NvdW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworICAgICAgICBpZiAoc2dwZF9lbnRyaWVzW2ldLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4KSB7CisgICAgICAgICAgICBhdmlvX3diMTYocGIsIC1zZ3BkX2VudHJpZXNbaV0ucm9sbF9kaXN0YW5jZSk7IC8qIHJvbGxfZGlzdGFuY2UgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFdyaXRlIHNiZ3AgdGFnICovCisgICAgYXZpb193YjMyKHBiLCAyMCArIChlbnRyaWVzICogOCkpOyAvKiBzaXplICovCisgICAgZmZpb193Zm91cmNjKHBiLCAic2JncCIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIGZ1bGxib3ggKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJyb2xsIik7CisgICAgYXZpb193YjMyKHBiLCBlbnRyaWVzKTsgLyogZW50cnlfY291bnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc2dwZF9lbnRyaWVzW2ldLmNvdW50KTsgLyogc2FtcGxlX2NvdW50ICovCisgICAgICAgIGF2aW9fd2IzMihwYiwgc2dwZF9lbnRyaWVzW2ldLmdyb3VwX2Rlc2NyaXB0aW9uX2luZGV4KTsgLyogZ3JvdXBfZGVzY3JpcHRpb25faW5kZXggKi8KKyAgICB9CisKKyAgICBhdl9mcmVlKHNncGRfZW50cmllcyk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3N0YmxfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsIE1PVlRyYWNrICp0cmFjaykKIHsKICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CiAgICAgaW50IHJldDsKIAogICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJzdGJsIik7Ci0gICAgbW92X3dyaXRlX3N0c2RfdGFnKHBiLCBtb3YsIHRyYWNrKTsKKyAgICBtb3Zfd3JpdGVfc3RzZF90YWcocywgcGIsIG1vdiwgdHJhY2spOwogICAgIG1vdl93cml0ZV9zdHRzX3RhZyhwYiwgdHJhY2spOwotICAgIGlmICgodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKLSAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX3RhZyA9PSBNS1RBRygncicsJ3QnLCdwJywnICcpKSAmJgorICAgIGlmICgodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKKyAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX3RhZyA9PSBNS1RBRygncicsJ3QnLCdwJywnICcpKSAmJgogICAgICAgICB0cmFjay0+aGFzX2tleWZyYW1lcyAmJiB0cmFjay0+aGFzX2tleWZyYW1lcyA8IHRyYWNrLT5lbnRyeSkKICAgICAgICAgbW92X3dyaXRlX3N0c3NfdGFnKHBiLCB0cmFjaywgTU9WX1NZTkNfU0FNUExFKTsKKyAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgdHJhY2stPmhhc19kaXNwb3NhYmxlKQorICAgICAgICBtb3Zfd3JpdGVfc2R0cF90YWcocGIsIHRyYWNrKTsKICAgICBpZiAodHJhY2stPm1vZGUgPT0gTU9ERV9NT1YgJiYgdHJhY2stPmZsYWdzICYgTU9WX1RSQUNLX1NUUFMpCiAgICAgICAgIG1vdl93cml0ZV9zdHNzX3RhZyhwYiwgdHJhY2ssIE1PVl9QQVJUSUFMX1NZTkNfU0FNUExFKTsKLSAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKKyAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKICAgICAgICAgdHJhY2stPmZsYWdzICYgTU9WX1RSQUNLX0NUVFMgJiYgdHJhY2stPmVudHJ5KSB7CiAKLSAgICAgICAgaWYgKChyZXQgPSBtb3Zfd3JpdGVfY3R0c190YWcocGIsIHRyYWNrKSkgPCAwKQorICAgICAgICBpZiAoKHJldCA9IG1vdl93cml0ZV9jdHRzX3RhZyhzLCBwYiwgdHJhY2spKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBtb3Zfd3JpdGVfc3RzY190YWcocGIsIHRyYWNrKTsKICAgICBtb3Zfd3JpdGVfc3Rzel90YWcocGIsIHRyYWNrKTsKICAgICBtb3Zfd3JpdGVfc3Rjb190YWcocGIsIHRyYWNrKTsKLSAgICBpZiAobW92LT5lbmNyeXB0aW9uX3NjaGVtZSA9PSBNT1ZfRU5DX0NFTkNfQUVTX0NUUikgeworICAgIGlmICh0cmFjay0+Y2VuYy5hZXNfY3RyKSB7CiAgICAgICAgIGZmX21vdl9jZW5jX3dyaXRlX3N0YmxfYXRvbXMoJnRyYWNrLT5jZW5jLCBwYik7CiAgICAgfQorICAgIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTIHx8IHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICBtb3ZfcHJlcm9sbF93cml0ZV9zdGJsX2F0b21zKHBiLCB0cmFjayk7CisgICAgfQogICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKIH0KIApAQCAtMjA4MywxMiArMjUxMSwxOCBAQAogICAgIGF2aW9fd2IxNihwYiwgMHgwMDAwKTsKICAgICB9CiAKLSAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdGFnID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykpIHsKKyAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfdGFnID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykpIHsKICAgICAgICAgaW50NjRfdCB0bWNkX3BvcyA9IGF2aW9fdGVsbChwYik7CiAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgKi8KICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAidG1jZCIpOwogICAgICAgICBtb3Zfd3JpdGVfdGNtaV90YWcocGIsIHRyYWNrKTsKICAgICAgICAgdXBkYXRlX3NpemUocGIsIHRtY2RfcG9zKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3RhZyA9PSBNS1RBRygnZycsJ3AnLCdtJywnZCcpKSB7CisgICAgICAgIGludDY0X3QgZ3BtZF9wb3MgPSBhdmlvX3RlbGwocGIpOworICAgICAgICBhdmlvX3diMzIocGIsIDApOyAvKiBzaXplICovCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImdwbWQiKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogdmVyc2lvbiAqLworICAgICAgICB1cGRhdGVfc2l6ZShwYiwgZ3BtZF9wb3MpOwogICAgIH0KICAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7CiB9CkBAIC0yMTE4LDcgKzI1NTIsNyBAQAogICAgICAgICAgICB0cmFjay0+dGFnID09IE1LVEFHKCdjJywnNicsJzAnLCc4Jyk7CiB9CiAKLXN0YXRpYyBpbnQgbW92X3dyaXRlX2hkbHJfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WVHJhY2sgKnRyYWNrKQorc3RhdGljIGludCBtb3Zfd3JpdGVfaGRscl90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIE1PVlRyYWNrICp0cmFjaykKIHsKICAgICBjb25zdCBjaGFyICpoZGxyLCAqZGVzY3IgPSBOVUxMLCAqaGRscl90eXBlID0gTlVMTDsKICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CkBAIC0yMTI5LDEzICsyNTYzLDEzIEBACiAKICAgICBpZiAodHJhY2spIHsKICAgICAgICAgaGRsciA9ICh0cmFjay0+bW9kZSA9PSBNT0RFX01PVikgPyAibWhsciIgOiAiXDBcMFwwXDAiOwotICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBoZGxyX3R5cGUgPSAidmlkZSI7CiAgICAgICAgICAgICBkZXNjciAgICAgPSAiVmlkZW9IYW5kbGVyIjsKLSAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgICAgICBoZGxyX3R5cGUgPSAic291biI7CiAgICAgICAgICAgICBkZXNjciAgICAgPSAiU291bmRIYW5kbGVyIjsKLSAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CiAgICAgICAgICAgICBpZiAoaXNfY2xjcF90cmFjayh0cmFjaykpIHsKICAgICAgICAgICAgICAgICBoZGxyX3R5cGUgPSAiY2xjcCI7CiAgICAgICAgICAgICAgICAgZGVzY3IgPSAiQ2xvc2VkQ2FwdGlvbkhhbmRsZXIiOwpAQCAtMjE0OSwyMCArMjU4MywxOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlc2NyID0gIlN1YnRpdGxlSGFuZGxlciI7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdGFnID09IE1LVEFHKCdyJywndCcsJ3AnLCcgJykpIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ3InLCd0JywncCcsJyAnKSkgewogICAgICAgICAgICAgaGRscl90eXBlID0gImhpbnQiOwogICAgICAgICAgICAgZGVzY3IgICAgID0gIkhpbnRIYW5kbGVyIjsKLSAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY190YWcgPT0gTUtUQUcoJ3QnLCdtJywnYycsJ2QnKSkgeworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3RhZyA9PSBNS1RBRygndCcsJ20nLCdjJywnZCcpKSB7CiAgICAgICAgICAgICBoZGxyX3R5cGUgPSAidG1jZCI7CiAgICAgICAgICAgICBkZXNjciA9ICJUaW1lQ29kZUhhbmRsZXIiOworICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3RhZyA9PSBNS1RBRygnZycsJ3AnLCdtJywnZCcpKSB7CisgICAgICAgICAgICBoZGxyX3R5cGUgPSAibWV0YSI7CisgICAgICAgICAgICBkZXNjciA9ICJHb1BybyBNRVQiOyAvLyBHb1BybyBNZXRhZGF0YQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2hhciB0YWdfYnVmWzMyXTsKLSAgICAgICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKHRhZ19idWYsIHNpemVvZih0YWdfYnVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX3RhZyk7Ci0KLSAgICAgICAgICAgIGF2X2xvZyh0cmFjay0+ZW5jLCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAiVW5rbm93biBobGRyX3R5cGUgZm9yICVzIC8gMHglMDRYLCB3cml0aW5nIGR1bW15IHZhbHVlc1xuIiwKLSAgICAgICAgICAgICAgICAgICB0YWdfYnVmLCB0cmFjay0+ZW5jLT5jb2RlY190YWcpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICJVbmtub3duIGhsZHJfdHlwZSBmb3IgJXMsIHdyaXRpbmcgZHVtbXkgdmFsdWVzXG4iLAorICAgICAgICAgICAgICAgICAgIGF2X2ZvdXJjYzJzdHIodHJhY2stPnBhci0+Y29kZWNfdGFnKSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHRyYWNrLT5zdCkgewogICAgICAgICAgICAgLy8gaGRsci5uYW1lIGlzIHVzZWQgYnkgc29tZSBwbGF5ZXJzIHRvIGlkZW50aWZ5IHRoZSBjb250ZW50IHRpdGxlCkBAIC0yMjA2LDE4ICsyNjM5LDE4IEBACiAgICAgcmV0dXJuIDI4OwogfQogCi1zdGF0aWMgaW50IG1vdl93cml0ZV9taW5mX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwgTU9WVHJhY2sgKnRyYWNrKQorc3RhdGljIGludCBtb3Zfd3JpdGVfbWluZl90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwgTU9WVHJhY2sgKnRyYWNrKQogewogICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKICAgICBpbnQgcmV0OwogCiAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLwogICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1pbmYiKTsKLSAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICBtb3Zfd3JpdGVfdm1oZF90YWcocGIpOwotICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgIGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQogICAgICAgICBtb3Zfd3JpdGVfc21oZF90YWcocGIpOwotICAgIGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKICAgICAgICAgaWYgKHRyYWNrLT50YWcgPT0gTUtUQUcoJ3QnLCdlJywneCcsJ3QnKSB8fCBpc19jbGNwX3RyYWNrKHRyYWNrKSkgewogICAgICAgICAgICAgbW92X3dyaXRlX2dtaGRfdGFnKHBiLCB0cmFjayk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yMjI2LDEyICsyNjU5LDE3IEBACiAgICAgfSBlbHNlIGlmICh0cmFjay0+dGFnID09IE1LVEFHKCdyJywndCcsJ3AnLCcgJykpIHsKICAgICAgICAgbW92X3dyaXRlX2htaGRfdGFnKHBiKTsKICAgICB9IGVsc2UgaWYgKHRyYWNrLT50YWcgPT0gTUtUQUcoJ3QnLCdtJywnYycsJ2QnKSkgeworICAgICAgICBpZiAodHJhY2stPm1vZGUgIT0gTU9ERV9NT1YpCisgICAgICAgICAgICBtb3Zfd3JpdGVfbm1oZF90YWcocGIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtb3Zfd3JpdGVfZ21oZF90YWcocGIsIHRyYWNrKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT50YWcgPT0gTUtUQUcoJ2cnLCdwJywnbScsJ2QnKSkgewogICAgICAgICBtb3Zfd3JpdGVfZ21oZF90YWcocGIsIHRyYWNrKTsKICAgICB9CiAgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WKSAvKiBGSVhNRTogV2h5IGRvIGl0IGZvciBNT0RFX01PViBvbmx5ID8gKi8KLSAgICAgICAgbW92X3dyaXRlX2hkbHJfdGFnKHBiLCBOVUxMKTsKKyAgICAgICAgbW92X3dyaXRlX2hkbHJfdGFnKHMsIHBiLCBOVUxMKTsKICAgICBtb3Zfd3JpdGVfZGluZl90YWcocGIpOwotICAgIGlmICgocmV0ID0gbW92X3dyaXRlX3N0YmxfdGFnKHBiLCBtb3YsIHRyYWNrKSkgPCAwKQorICAgIGlmICgocmV0ID0gbW92X3dyaXRlX3N0YmxfdGFnKHMsIHBiLCBtb3YsIHRyYWNrKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKIH0KQEAgLTIyNzUsOCArMjcxMyw4IEBACiAgICAgcmV0dXJuIDMyOwogfQogCi1zdGF0aWMgaW50IG1vdl93cml0ZV9tZGlhX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVlRyYWNrICp0cmFjaykKK3N0YXRpYyBpbnQgbW92X3dyaXRlX21kaWFfdGFnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9WTXV4Q29udGV4dCAqbW92LCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOwogICAgIGludCByZXQ7CkBAIC0yMjg0LDggKzI3MjIsOCBAQAogICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJtZGlhIik7CiAgICAgbW92X3dyaXRlX21kaGRfdGFnKHBiLCBtb3YsIHRyYWNrKTsKLSAgICBtb3Zfd3JpdGVfaGRscl90YWcocGIsIHRyYWNrKTsKLSAgICBpZiAoKHJldCA9IG1vdl93cml0ZV9taW5mX3RhZyhwYiwgbW92LCB0cmFjaykpIDwgMCkKKyAgICBtb3Zfd3JpdGVfaGRscl90YWcocywgcGIsIHRyYWNrKTsKKyAgICBpZiAoKHJldCA9IG1vdl93cml0ZV9taW5mX3RhZyhzLCBwYiwgbW92LCB0cmFjaykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKICAgICByZXR1cm4gdXBkYXRlX3NpemUocGIsIHBvcyk7CiB9CkBAIC0yMzI1LDcgKzI3NjMsNyBAQAogICAgICAgICBpZiAobW92LT5wZXJfc3RyZWFtX2dyb3VwaW5nKQogICAgICAgICAgICAgZ3JvdXAgPSBzdC0+aW5kZXg7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdyb3VwID0gc3QtPmNvZGVjLT5jb2RlY190eXBlOworICAgICAgICAgICAgZ3JvdXAgPSBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGU7CiAKICAgICAgICAgZGlzcGxheV9tYXRyaXggPSAodWludDMyX3QqKWF2X3N0cmVhbV9nZXRfc2lkZV9kYXRhKHN0LCBBVl9QS1RfREFUQV9ESVNQTEFZTUFUUklYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRpc3BsYXlfbWF0cml4X3NpemUpOwpAQCAtMjM2NCw0NiArMjgwMiw1OCBAQAogICAgIGF2aW9fd2IxNihwYiwgMCk7IC8qIGxheWVyICovCiAgICAgYXZpb193YjE2KHBiLCBncm91cCk7IC8qIGFsdGVybmF0ZSBncm91cCkgKi8KICAgICAvKiBWb2x1bWUsIG9ubHkgZm9yIGF1ZGlvICovCi0gICAgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgIGlmICh0cmFjay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgYXZpb193YjE2KHBiLCAweDAxMDApOwogICAgIGVsc2UKICAgICAgICAgYXZpb193YjE2KHBiLCAwKTsKICAgICBhdmlvX3diMTYocGIsIDApOyAvKiByZXNlcnZlZCAqLwogCiAgICAgLyogTWF0cml4IHN0cnVjdHVyZSAqLworI2lmIEZGX0FQSV9PTERfUk9UQVRFX0FQSQogICAgIGlmIChzdCAmJiBzdC0+bWV0YWRhdGEpIHsKICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnJvdCA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgInJvdGF0ZSIsIE5VTEwsIDApOwogICAgICAgICByb3RhdGlvbiA9IChyb3QgJiYgcm90LT52YWx1ZSkgPyBhdG9pKHJvdC0+dmFsdWUpIDogMDsKICAgICB9CisjZW5kaWYKICAgICBpZiAoZGlzcGxheV9tYXRyaXgpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykKICAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgZGlzcGxheV9tYXRyaXhbaV0pOworI2lmIEZGX0FQSV9PTERfUk9UQVRFX0FQSQogICAgIH0gZWxzZSBpZiAocm90YXRpb24gPT0gOTApIHsKLSAgICAgICAgd3JpdGVfbWF0cml4KHBiLCAgMCwgIDEsIC0xLCAgMCwgdHJhY2stPmVuYy0+aGVpZ2h0LCAwKTsKKyAgICAgICAgd3JpdGVfbWF0cml4KHBiLCAgMCwgIDEsIC0xLCAgMCwgdHJhY2stPnBhci0+aGVpZ2h0LCAwKTsKICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uID09IDE4MCkgewotICAgICAgICB3cml0ZV9tYXRyaXgocGIsIC0xLCAgMCwgIDAsIC0xLCB0cmFjay0+ZW5jLT53aWR0aCwgdHJhY2stPmVuYy0+aGVpZ2h0KTsKKyAgICAgICAgd3JpdGVfbWF0cml4KHBiLCAtMSwgIDAsICAwLCAtMSwgdHJhY2stPnBhci0+d2lkdGgsIHRyYWNrLT5wYXItPmhlaWdodCk7CiAgICAgfSBlbHNlIGlmIChyb3RhdGlvbiA9PSAyNzApIHsKLSAgICAgICAgd3JpdGVfbWF0cml4KHBiLCAgMCwgLTEsICAxLCAgMCwgMCwgdHJhY2stPmVuYy0+d2lkdGgpOworICAgICAgICB3cml0ZV9tYXRyaXgocGIsICAwLCAtMSwgIDEsICAwLCAwLCB0cmFjay0+cGFyLT53aWR0aCk7CisjZW5kaWYKICAgICB9IGVsc2UgewogICAgICAgICB3cml0ZV9tYXRyaXgocGIsICAxLCAgMCwgIDAsICAxLCAwLCAwKTsKICAgICB9CiAgICAgLyogVHJhY2sgd2lkdGggYW5kIGhlaWdodCwgZm9yIHZpc3VhbCBvbmx5ICovCi0gICAgaWYgKHN0ICYmICh0cmFjay0+ZW5jLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAotICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpKSB7CisgICAgaWYgKHN0ICYmICh0cmFjay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAorICAgICAgICAgICAgICAgdHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpKSB7CisgICAgICAgIGludDY0X3QgdHJhY2tfd2lkdGhfMTYxNjsKICAgICAgICAgaWYgKHRyYWNrLT5tb2RlID09IE1PREVfTU9WKSB7Ci0gICAgICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbmMtPndpZHRoIDw8IDE2KTsKLSAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPmhlaWdodCA8PCAxNik7CisgICAgICAgICAgICB0cmFja193aWR0aF8xNjE2ID0gdHJhY2stPnBhci0+d2lkdGggKiAweDEwMDAwVUxMOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50NjRfdCB0cmFja193aWR0aF8xNjE2ID0gYXZfcmVzY2FsZShzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPndpZHRoICogMHgxMDAwMExMLAorICAgICAgICAgICAgdHJhY2tfd2lkdGhfMTYxNiA9IGF2X3Jlc2NhbGUoc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT53aWR0aCAqIDB4MTAwMDBMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKICAgICAgICAgICAgIGlmICghdHJhY2tfd2lkdGhfMTYxNiB8fAotICAgICAgICAgICAgICAgIHRyYWNrLT5oZWlnaHQgIT0gdHJhY2stPmVuYy0+aGVpZ2h0IHx8CisgICAgICAgICAgICAgICAgdHJhY2stPmhlaWdodCAhPSB0cmFjay0+cGFyLT5oZWlnaHQgfHwKICAgICAgICAgICAgICAgICB0cmFja193aWR0aF8xNjE2ID4gVUlOVDMyX01BWCkKLSAgICAgICAgICAgICAgICB0cmFja193aWR0aF8xNjE2ID0gdHJhY2stPmVuYy0+d2lkdGggKiAweDEwMDAwVTsKLSAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2tfd2lkdGhfMTYxNik7Ci0gICAgICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5oZWlnaHQgKiAweDEwMDAwVSk7CisgICAgICAgICAgICAgICAgdHJhY2tfd2lkdGhfMTYxNiA9IHRyYWNrLT5wYXItPndpZHRoICogMHgxMDAwMFVMTDsKICAgICAgICAgfQorICAgICAgICBpZiAodHJhY2tfd2lkdGhfMTYxNiA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhtb3YtPmZjLCBBVl9MT0dfV0FSTklORywgInRyYWNrIHdpZHRoIGlzIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICB0cmFja193aWR0aF8xNjE2ID0gMDsKKyAgICAgICAgfQorICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrX3dpZHRoXzE2MTYpOworICAgICAgICBpZiAodHJhY2stPmhlaWdodCA+IDB4RkZGRikgeworICAgICAgICAgICAgYXZfbG9nKG1vdi0+ZmMsIEFWX0xPR19XQVJOSU5HLCAidHJhY2sgaGVpZ2h0IGlzIHRvbyBsYXJnZVxuIik7CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIDApOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPmhlaWdodCAqIDB4MTAwMDBVKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdmlvX3diMzIocGIsIDApOwogICAgICAgICBhdmlvX3diMzIocGIsIDApOwpAQCAtMjQxMyw4ICsyODYzLDggQEAKIAogc3RhdGljIGludCBtb3Zfd3JpdGVfdGFwdF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCiB7Ci0gICAgaW50MzJfdCB3aWR0aCA9IGF2X3Jlc2NhbGUodHJhY2stPmVuYy0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIHRyYWNrLT5lbmMtPndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICBpbnQzMl90IHdpZHRoID0gYXZfcmVzY2FsZSh0cmFjay0+cGFyLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwgdHJhY2stPnBhci0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnBhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pOwogCiAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOwogCkBAIC0yNDI1LDE5ICsyODc1LDE5IEBACiAgICAgZmZpb193Zm91cmNjKHBiLCAiY2xlZiIpOwogICAgIGF2aW9fd2IzMihwYiwgMCk7CiAgICAgYXZpb193YjMyKHBiLCB3aWR0aCA8PCAxNik7Ci0gICAgYXZpb193YjMyKHBiLCB0cmFjay0+ZW5jLT5oZWlnaHQgPDwgMTYpOworICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPnBhci0+aGVpZ2h0IDw8IDE2KTsKIAogICAgIGF2aW9fd2IzMihwYiwgMjApOwogICAgIGZmaW9fd2ZvdXJjYyhwYiwgInByb2YiKTsKICAgICBhdmlvX3diMzIocGIsIDApOwogICAgIGF2aW9fd2IzMihwYiwgd2lkdGggPDwgMTYpOwotICAgIGF2aW9fd2IzMihwYiwgdHJhY2stPmVuYy0+aGVpZ2h0IDw8IDE2KTsKKyAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5wYXItPmhlaWdodCA8PCAxNik7CiAKICAgICBhdmlvX3diMzIocGIsIDIwKTsKICAgICBmZmlvX3dmb3VyY2MocGIsICJlbm9mIik7CiAgICAgYXZpb193YjMyKHBiLCAwKTsKLSAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbmMtPndpZHRoIDw8IDE2KTsKLSAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5lbmMtPmhlaWdodCA8PCAxNik7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+cGFyLT53aWR0aCA8PCAxNik7CisgICAgYXZpb193YjMyKHBiLCB0cmFjay0+cGFyLT5oZWlnaHQgPDwgMTYpOwogCiAgICAgcmV0dXJuIHVwZGF0ZV9zaXplKHBiLCBwb3MpOwogfQpAQCAtMjQ4Niw3ICsyOTM2LDcgQEAKICAgICAgICAgLyogSW4gdGhlIHBvc2l0aXZlIGRlbGF5IGNhc2UsIHRoZSBkZWxheSBpbmNsdWRlcyB0aGUgY3RzCiAgICAgICAgICAqIG9mZnNldCwgYW5kIHRoZSBzZWNvbmQgZWRpdCBsaXN0IGVudHJ5IGJlbG93IHRyaW1zIG91dAogICAgICAgICAgKiB0aGUgc2FtZSBhbW91bnQgZnJvbSB0aGUgYWN0dWFsIGNvbnRlbnQuIFRoaXMgbWFrZXMgc3VyZQotICAgICAgICAgKiB0aGF0IHRoZSBvZmZzZXR0ZWQgbGFzdCBzYW1wbGUgaXMgaW5jbHVkZWQgaW4gdGhlIGVkaXQKKyAgICAgICAgICogdGhhdCB0aGUgb2Zmc2V0IGxhc3Qgc2FtcGxlIGlzIGluY2x1ZGVkIGluIHRoZSBlZGl0CiAgICAgICAgICAqIGxpc3QgZHVyYXRpb24gYXMgd2VsbC4gKi8KICAgICAgICAgaWYgKHZlcnNpb24gPT0gMSkgewogICAgICAgICAgICAgYXZpb193YjY0KHBiLCBkZWxheSk7CkBAIC0yNDk5LDcgKzI5NDksNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8qIEF2b2lkIGFjY2lkZW50YWxseSBlbmRpbmcgdXAgd2l0aCBzdGFydF9jdCA9IC0xIHdoaWNoIGhhcyBnb3QgYQogICAgICAgICAgKiBzcGVjaWFsIG1lYW5pbmcuIE5vcm1hbGx5IHN0YXJ0X2N0IHNob3VsZCBlbmQgdXAgcG9zaXRpdmUgb3IgemVybwotICAgICAgICAgKiBoZXJlLCBidXQgdXNlIEZGTUlOIGluIGNhc2UgZHRzIGlzIGEgYSBzbWFsbCBwb3NpdGl2ZSBpbnRlZ2VyCisgICAgICAgICAqIGhlcmUsIGJ1dCB1c2UgRkZNSU4gaW4gY2FzZSBkdHMgaXMgYSBzbWFsbCBwb3NpdGl2ZSBpbnRlZ2VyCiAgICAgICAgICAqIHJvdW5kZWQgdG8gMCB3aGVuIHJlcHJlc2VudGVkIGluIE1PVl9USU1FU0NBTEUgdW5pdHMuICovCiAgICAgICAgIGF2X2Fzc2VydDAoYXZfcmVzY2FsZV9ybmQoc3RhcnRfZHRzLCBNT1ZfVElNRVNDQUxFLCB0cmFjay0+dGltZXNjYWxlLCBBVl9ST1VORF9ET1dOKSA8PSAwKTsKICAgICAgICAgc3RhcnRfY3QgID0gLUZGTUlOKHN0YXJ0X2R0cywgMCk7CkBAIC0yNjA2LDcgKzMwNTYsNyBAQAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgaWYgKG1vdi0+bW9kZSAmIE1PREVfTVA0KQorICAgIGlmIChtb3YtPm1vZGUgJiAoTU9ERV9NUDR8TU9ERV9NT1YpKQogICAgICAgICBtb3Zfd3JpdGVfdHJhY2tfbWV0YWRhdGEocGJfYnVmLCBzdCwgIm5hbWUiLCAidGl0bGUiKTsKIAogICAgIGlmICgoc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZihwYl9idWYsICZidWYpKSA+IDApIHsKQEAgLTI2MTksNyArMzA2OSw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbW92X3dyaXRlX3RyYWtfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAorc3RhdGljIGludCBtb3Zfd3JpdGVfdHJha190YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1PVlRyYWNrICp0cmFjaywgQVZTdHJlYW0gKnN0KQogewogICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKQEAgLTI2NDksMTQgKzMwOTksMTQgQEAKICAgICBpZiAodHJhY2stPnRyZWZfdGFnKQogICAgICAgICBtb3Zfd3JpdGVfdHJlZl90YWcocGIsIHRyYWNrKTsKIAotICAgIGlmICgocmV0ID0gbW92X3dyaXRlX21kaWFfdGFnKHBiLCBtb3YsIHRyYWNrKSkgPCAwKQorICAgIGlmICgocmV0ID0gbW92X3dyaXRlX21kaWFfdGFnKHMsIHBiLCBtb3YsIHRyYWNrKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX1BTUCkKICAgICAgICAgbW92X3dyaXRlX3V1aWRfdGFnX3BzcChwYiwgdHJhY2spOyAvLyBQU1AgTW92aWVzIHJlcXVpcmUgdGhpcyB1dWlkIGJveAogICAgIGlmICh0cmFjay0+dGFnID09IE1LVEFHKCdyJywndCcsJ3AnLCcgJykpCiAgICAgICAgIG1vdl93cml0ZV91ZHRhX3NkcChwYiwgdHJhY2spOwogICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PVikgewotICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBkb3VibGUgc2FtcGxlX2FzcGVjdF9yYXRpbyA9IGF2X3EyZChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyk7CiAgICAgICAgICAgICBpZiAoc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmIDEuMCAhPSBzYW1wbGVfYXNwZWN0X3JhdGlvKSB7CiAgICAgICAgICAgICAgICAgbW92X3dyaXRlX3RhcHRfdGFnKHBiLCB0cmFjayk7CkBAIC0yNjgwLDggKzMxMzAsOCBAQAogICAgIGludCB2aWRlb19wcm9maWxlID0gbW92LT5pb2RzX3ZpZGVvX3Byb2ZpbGU7CiAgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIGlmIChtb3YtPnRyYWNrc1tpXS5lbnRyeSA+IDAgfHwgbW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0VNUFRZX01PT1YpIHsKLSAgICAgICAgICAgIGhhc19hdWRpbyB8PSBtb3YtPnRyYWNrc1tpXS5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICAgICAgaGFzX3ZpZGVvIHw9IG1vdi0+dHJhY2tzW2ldLmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICBoYXNfYXVkaW8gfD0gbW92LT50cmFja3NbaV0ucGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIGhhc192aWRlbyB8PSBtb3YtPnRyYWNrc1tpXS5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChhdWRpb19wcm9maWxlIDwgMCkKQEAgLTI4MzUsMTYgKzMyODUsMTcgQEAKICAgICByZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIGludCBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9uZ19zdHlsZSkKK3N0YXRpYyBBVkRpY3Rpb25hcnlFbnRyeSAqZ2V0X21ldGFkYXRhX2xhbmcoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcsIGludCAqbGFuZykKIHsKLSAgICBpbnQgbCwgbGFuZyA9IDAsIGxlbiwgbGVuMjsKKyAgICBpbnQgbCwgbGVuLCBsZW4yOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0LCAqdDIgPSBOVUxMOwogICAgIGNoYXIgdGFnMlsxNl07CiAKKyAgICAqbGFuZyA9IDA7CisKICAgICBpZiAoISh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsIHRhZywgTlVMTCwgMCkpKQotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKICAgICBsZW4gPSBzdHJsZW4odC0+a2V5KTsKICAgICBzbnByaW50Zih0YWcyLCBzaXplb2YodGFnMiksICIlcy0iLCB0YWcpOwpAQCAtMjg1MiwxMCArMzMwMywyMSBAQAogICAgICAgICBsZW4yID0gc3RybGVuKHQyLT5rZXkpOwogICAgICAgICBpZiAobGVuMiA9PSBsZW4gKyA0ICYmICFzdHJjbXAodC0+dmFsdWUsIHQyLT52YWx1ZSkKICAgICAgICAgICAgICYmIChsID0gZmZfbW92X2lzbzYzOV90b19sYW5nKCZ0Mi0+a2V5W2xlbjIgLSAzXSwgMSkpID49IDApIHsKLSAgICAgICAgICAgIGxhbmcgPSBsOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAqbGFuZyA9IGw7CisgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gdDsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9uZ19zdHlsZSkKK3sKKyAgICBpbnQgbGFuZzsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IGdldF9tZXRhZGF0YV9sYW5nKHMsIHRhZywgJmxhbmcpOworICAgIGlmICghdCkKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgcmV0dXJuIG1vdl93cml0ZV9zdHJpbmdfdGFnKHBiLCBuYW1lLCB0LT52YWx1ZSwgbGFuZywgbG9uZ19zdHlsZSk7CiB9CiAKQEAgLTI4NzcsNiArMzMzOSw1NyBAQAogICAgIHJldHVybiBzaXplOwogfQogCisvKiAzR1BQIFRTIDI2LjI0NCAqLworc3RhdGljIGludCBtb3Zfd3JpdGVfbG9jaV90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIpCit7CisgICAgaW50IGxhbmc7CisgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworICAgIGRvdWJsZSBsYXRpdHVkZSwgbG9uZ2l0dWRlLCBhbHRpdHVkZTsKKyAgICBpbnQzMl90IGxhdGl0dWRlX2ZpeCwgbG9uZ2l0dWRlX2ZpeCwgYWx0aXR1ZGVfZml4OworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gZ2V0X21ldGFkYXRhX2xhbmcocywgImxvY2F0aW9uIiwgJmxhbmcpOworICAgIGNvbnN0IGNoYXIgKnB0ciwgKnBsYWNlID0gIiI7CisgICAgY2hhciAqZW5kOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphc3Ryb25vbWljYWxfYm9keSA9ICJlYXJ0aCI7CisgICAgaWYgKCF0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIHB0ciA9IHQtPnZhbHVlOworICAgIGxvbmdpdHVkZSA9IHN0cnRvZChwdHIsICZlbmQpOworICAgIGlmIChlbmQgPT0gcHRyKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIm1hbGZvcm1lZCBsb2NhdGlvbiBtZXRhZGF0YVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBwdHIgPSBlbmQ7CisgICAgbGF0aXR1ZGUgPSBzdHJ0b2QocHRyLCAmZW5kKTsKKyAgICBpZiAoZW5kID09IHB0cikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJtYWxmb3JtZWQgbG9jYXRpb24gbWV0YWRhdGFcbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcHRyID0gZW5kOworICAgIGFsdGl0dWRlID0gc3RydG9kKHB0ciwgJmVuZCk7CisgICAgLyogSWYgbm8gYWx0aXR1ZGUgd2FzIHByZXNlbnQsIHRoZSBkZWZhdWx0IDAgc2hvdWxkIGJlIGZpbmUgKi8KKyAgICBpZiAoKmVuZCA9PSAnLycpCisgICAgICAgIHBsYWNlID0gZW5kICsgMTsKKworICAgIGxhdGl0dWRlX2ZpeCAgPSAoaW50MzJfdCkgKCgxIDw8IDE2KSAqIGxhdGl0dWRlKTsKKyAgICBsb25naXR1ZGVfZml4ID0gKGludDMyX3QpICgoMSA8PCAxNikgKiBsb25naXR1ZGUpOworICAgIGFsdGl0dWRlX2ZpeCAgPSAoaW50MzJfdCkgKCgxIDw8IDE2KSAqIGFsdGl0dWRlKTsKKworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImxvY2kiKTsgLyogdHlwZSAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7ICAgICAgICAgLyogdmVyc2lvbiArIGZsYWdzICovCisgICAgYXZpb193YjE2KHBiLCBsYW5nKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBwbGFjZSwgc3RybGVuKHBsYWNlKSArIDEpOworICAgIGF2aW9fdzgocGIsIDApOyAgICAgICAgICAgLyogcm9sZSBvZiBwbGFjZSAoMCA9PSBzaG9vdGluZyBsb2NhdGlvbiwgMSA9PSByZWFsIGxvY2F0aW9uLCAyID09IGZpY3Rpb25hbCBsb2NhdGlvbikgKi8KKyAgICBhdmlvX3diMzIocGIsIGxhdGl0dWRlX2ZpeCk7CisgICAgYXZpb193YjMyKHBiLCBsb25naXR1ZGVfZml4KTsKKyAgICBhdmlvX3diMzIocGIsIGFsdGl0dWRlX2ZpeCk7CisgICAgYXZpb193cml0ZShwYiwgYXN0cm9ub21pY2FsX2JvZHksIHN0cmxlbihhc3Ryb25vbWljYWxfYm9keSkgKyAxKTsKKyAgICBhdmlvX3c4KHBiLCAwKTsgICAgICAgICAgIC8qIGFkZGl0aW9uYWwgbm90ZXMsIG51bGwgdGVybWluYXRlZCBzdHJpbmcgKi8KKworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKwogLyogaVR1bmVzIHRyYWNrIG9yIGRpc2MgbnVtYmVyICovCiBzdGF0aWMgaW50IG1vdl93cml0ZV90cmtuX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGRpc2MpCkBAIC0yOTMyLDYgKzM0NDUsMzMgQEAKICAgICByZXR1cm4gc2l6ZTsKIH0KIAorc3RhdGljIGludCBtb3Zfd3JpdGVfY292cihBVklPQ29udGV4dCAqcGIsIEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwb3MgPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBNT1ZUcmFjayAqdHJrID0gJm1vdi0+dHJhY2tzW2ldOworCisgICAgICAgIGlmICghaXNfY292ZXJfaW1hZ2UodHJrLT5zdCkgfHwgdHJrLT5jb3Zlcl9pbWFnZS5zaXplIDw9IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIXBvcykgeworICAgICAgICAgICAgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJjb3ZyIik7CisgICAgICAgIH0KKyAgICAgICAgYXZpb193YjMyKHBiLCAxNiArIHRyay0+Y292ZXJfaW1hZ2Uuc2l6ZSk7CisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImRhdGEiKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCB0cmstPnRhZyk7CisgICAgICAgIGF2aW9fd2IzMihwYiAsIDApOworICAgICAgICBhdmlvX3dyaXRlKHBiLCB0cmstPmNvdmVyX2ltYWdlLmRhdGEsIHRyay0+Y292ZXJfaW1hZ2Uuc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIHBvcyA/IHVwZGF0ZV9zaXplKHBiLCBwb3MpIDogMDsKK30KKwogLyogaVR1bmVzIG1ldGEgZGF0YSBsaXN0ICovCiBzdGF0aWMgaW50IG1vdl93cml0ZV9pbHN0X3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqcykKQEAgLTI5NTEsNyArMzQ5MSw3IEBACiAgICAgfQogICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxY210IiwgImNvbW1lbnQiICAsIDEpOwogICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxZ2VuIiwgImdlbnJlIiAgICAsIDEpOwotICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxY3B5IiwgImNvcHlyaWdodCIsIDEpOworICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJjcHJ0IiwgICAgImNvcHlyaWdodCIsIDEpOwogICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxZ3JwIiwgImdyb3VwaW5nIiAsIDEpOwogICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJcMjUxbHlyIiwgImx5cmljcyIgICAsIDEpOwogICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGIsICJkZXNjIiwgICAgImRlc2NyaXB0aW9uIiwxKTsKQEAgLTI5NTksMTkgKzM0OTksODUgQEAKICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiLCAidHZzaCIsICAgICJzaG93IiAgICAgLCAxKTsKICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiLCAidHZlbiIsICAgICJlcGlzb2RlX2lkIiwxKTsKICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiLCAidHZubiIsICAgICJuZXR3b3JrIiAgLCAxKTsKKyAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiLCAia2V5dyIsICAgICJrZXl3b3JkcyIgICwgMSk7CiAgICAgbW92X3dyaXRlX2ludDhfbWV0YWRhdGEgIChzLCBwYiwgInR2ZXMiLCAgICAiZXBpc29kZV9zb3J0Iiw0KTsKICAgICBtb3Zfd3JpdGVfaW50OF9tZXRhZGF0YSAgKHMsIHBiLCAidHZzbiIsICAgICJzZWFzb25fbnVtYmVyIiw0KTsKICAgICBtb3Zfd3JpdGVfaW50OF9tZXRhZGF0YSAgKHMsIHBiLCAic3RpayIsICAgICJtZWRpYV90eXBlIiwxKTsKICAgICBtb3Zfd3JpdGVfaW50OF9tZXRhZGF0YSAgKHMsIHBiLCAiaGR2ZCIsICAgICJoZF92aWRlbyIsICAxKTsKICAgICBtb3Zfd3JpdGVfaW50OF9tZXRhZGF0YSAgKHMsIHBiLCAicGdhcCIsICAgICJnYXBsZXNzX3BsYXliYWNrIiwxKTsKICAgICBtb3Zfd3JpdGVfaW50OF9tZXRhZGF0YSAgKHMsIHBiLCAiY3BpbCIsICAgICJjb21waWxhdGlvbiIsIDEpOworICAgIG1vdl93cml0ZV9jb3ZyKHBiLCBzKTsKICAgICBtb3Zfd3JpdGVfdHJrbl90YWcocGIsIG1vdiwgcywgMCk7IC8vIHRyYWNrIG51bWJlcgogICAgIG1vdl93cml0ZV90cmtuX3RhZyhwYiwgbW92LCBzLCAxKTsgLy8gZGlzYyBudW1iZXIKICAgICBtb3Zfd3JpdGVfdG1wb190YWcocGIsIHMpOwogICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKIH0KIAotLyogaVR1bmVzIG1ldGEgZGF0YSB0YWcgKi8KK3N0YXRpYyBpbnQgbW92X3dyaXRlX21kdGFfaGRscl90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBhdmlvX3diMzIocGIsIDMzKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImhkbHIiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgZmZpb193Zm91cmNjKHBiLCAibWR0YSIpOworICAgIGF2aW9fd2IzMihwYiwgMCk7CisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworICAgIGF2aW9fdzgocGIsIDApOworICAgIHJldHVybiAzMzsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfbWR0YV9rZXlzX3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaW50NjRfdCBjdXJwb3MsIGVudHJ5X3BvczsKKyAgICBpbnQgY291bnQgPSAwOworCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImtleXMiKTsKKyAgICBhdmlvX3diMzIocGIsIDApOworICAgIGVudHJ5X3BvcyA9IGF2aW9fdGVsbChwYik7CisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogZW50cnkgY291bnQgKi8KKworICAgIHdoaWxlICh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSB7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc3RybGVuKHQtPmtleSkgKyA4KTsKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAibWR0YSIpOworICAgICAgICBhdmlvX3dyaXRlKHBiLCB0LT5rZXksIHN0cmxlbih0LT5rZXkpKTsKKyAgICAgICAgY291bnQgKz0gMTsKKyAgICB9CisgICAgY3VycG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBhdmlvX3NlZWsocGIsIGVudHJ5X3BvcywgU0VFS19TRVQpOworICAgIGF2aW9fd2IzMihwYiwgY291bnQpOyAvLyByZXdyaXRlIGVudHJ5IGNvdW50CisgICAgYXZpb19zZWVrKHBiLCBjdXJwb3MsIFNFRUtfU0VUKTsKKworICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfbWR0YV9pbHN0X3RhZyhBVklPQ29udGV4dCAqcGIsIE1PVk11eENvbnRleHQgKm1vdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChwYik7CisgICAgaW50IGNvdW50ID0gMTsgLyoga2V5cyBhcmUgMS1pbmRleCBiYXNlZCAqLworCisgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgImlsc3QiKTsKKworICAgIHdoaWxlICh0ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCB0LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSB7CisgICAgICAgIGludDY0X3QgZW50cnlfcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLworICAgICAgICBhdmlvX3diMzIocGIsIGNvdW50KTsgLyoga2V5ICovCisgICAgICAgIG1vdl93cml0ZV9zdHJpbmdfZGF0YV90YWcocGIsIHQtPnZhbHVlLCAwLCAxKTsKKyAgICAgICAgdXBkYXRlX3NpemUocGIsIGVudHJ5X3Bvcyk7CisgICAgICAgIGNvdW50ICs9IDE7CisgICAgfQorICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKK30KKworLyogbWV0YSBkYXRhIHRhZ3MgKi8KIHN0YXRpYyBpbnQgbW92X3dyaXRlX21ldGFfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzKQogewpAQCAtMjk4MCw4ICszNTg2LDE2IEBACiAgICAgYXZpb193YjMyKHBiLCAwKTsgLyogc2l6ZSAqLwogICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1ldGEiKTsKICAgICBhdmlvX3diMzIocGIsIDApOwotICAgIG1vdl93cml0ZV9pdHVuZXNfaGRscl90YWcocGIsIG1vdiwgcyk7Ci0gICAgbW92X3dyaXRlX2lsc3RfdGFnKHBiLCBtb3YsIHMpOworICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfVVNFX01EVEEpIHsKKyAgICAgICAgbW92X3dyaXRlX21kdGFfaGRscl90YWcocGIsIG1vdiwgcyk7CisgICAgICAgIG1vdl93cml0ZV9tZHRhX2tleXNfdGFnKHBiLCBtb3YsIHMpOworICAgICAgICBtb3Zfd3JpdGVfbWR0YV9pbHN0X3RhZyhwYiwgbW92LCBzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8qIGlUdW5lcyBtZXRhZGF0YSB0YWcgKi8KKyAgICAgICAgbW92X3dyaXRlX2l0dW5lc19oZGxyX3RhZyhwYiwgbW92LCBzKTsKKyAgICAgICAgbW92X3dyaXRlX2lsc3RfdGFnKHBiLCBtb3YsIHMpOworICAgIH0KICAgICBzaXplID0gdXBkYXRlX3NpemUocGIsIHBvcyk7CiAgICAgcmV0dXJuIHNpemU7CiB9CkBAIC0zMDkyLDcgKzM3MDYsOCBAQAogICAgICAgICBtb3Zfd3JpdGVfM2dwX3VkdGFfdGFnKHBiX2J1ZiwgcywgImFsYm0iLCAiYWxidW0iKTsKICAgICAgICAgbW92X3dyaXRlXzNncF91ZHRhX3RhZyhwYl9idWYsIHMsICJjcHJ0IiwgImNvcHlyaWdodCIpOwogICAgICAgICBtb3Zfd3JpdGVfM2dwX3VkdGFfdGFnKHBiX2J1ZiwgcywgInlycmMiLCAiZGF0ZSIpOwotICAgIH0gZWxzZSBpZiAobW92LT5tb2RlID09IE1PREVfTU9WKSB7IC8vIHRoZSB0aXRsZSBmaWVsZCBicmVha3MgZ3RrcG9kIHdpdGggbXA0IGFuZCBteSBzdXNwaWNpb24gaXMgdGhhdCBzdHVmZiBpcyBub3QgdmFsaWQgaW4gbXA0CisgICAgICAgIG1vdl93cml0ZV9sb2NpX3RhZyhzLCBwYl9idWYpOworICAgIH0gZWxzZSBpZiAobW92LT5tb2RlID09IE1PREVfTU9WICYmICEobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX1VTRV9NRFRBKSkgeyAvLyB0aGUgdGl0bGUgZmllbGQgYnJlYWtzIGd0a3BvZCB3aXRoIG1wNCBhbmQgbXkgc3VzcGljaW9uIGlzIHRoYXQgc3R1ZmYgaXMgbm90IHZhbGlkIGluIG1wNAogICAgICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiX2J1ZiwgIlwyNTFBUlQiLCAiYXJ0aXN0IiwgICAgICAwKTsKICAgICAgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYl9idWYsICJcMjUxbmFtIiwgInRpdGxlIiwgICAgICAgMCk7CiAgICAgICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGJfYnVmLCAiXDI1MWF1dCIsICJhdXRob3IiLCAgICAgIDApOwpAQCAtMzEwOCwxMCArMzcyMywxMiBAQAogICAgICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiX2J1ZiwgIlwyNTFtYWsiLCAibWFrZSIsICAgICAgICAwKTsKICAgICAgICAgbW92X3dyaXRlX3N0cmluZ19tZXRhZGF0YShzLCBwYl9idWYsICJcMjUxbW9kIiwgIm1vZGVsIiwgICAgICAgMCk7CiAgICAgICAgIG1vdl93cml0ZV9zdHJpbmdfbWV0YWRhdGEocywgcGJfYnVmLCAiXDI1MXh5eiIsICJsb2NhdGlvbiIsICAgIDApOworICAgICAgICBtb3Zfd3JpdGVfc3RyaW5nX21ldGFkYXRhKHMsIHBiX2J1ZiwgIlwyNTFrZXkiLCAia2V5d29yZHMiLCAgICAwKTsKICAgICAgICAgbW92X3dyaXRlX3Jhd19tZXRhZGF0YV90YWcocywgcGJfYnVmLCAiWE1QXyIsICJ4bXAiKTsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBpVHVuZXMgbWV0YSBkYXRhICovCiAgICAgICAgIG1vdl93cml0ZV9tZXRhX3RhZyhwYl9idWYsIG1vdiwgcyk7CisgICAgICAgIG1vdl93cml0ZV9sb2NpX3RhZyhzLCBwYl9idWYpOwogICAgIH0KIAogICAgIGlmIChzLT5uYl9jaGFwdGVycyAmJiAhKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19ESVNBQkxFX0NIUEwpKQpAQCAtMzIwMSw2ICszODE4LDUyIEBACiAgICAgfQogfQogCisvKioKKyAqIEFzc2lnbiB0cmFjayBpZHMuIElmIG9wdGlvbiAidXNlX3N0cmVhbV9pZHNfYXNfdHJhY2tfaWRzIiBpcyBzZXQsCisgKiB0aGUgc3RyZWFtIGlkcyBhcmUgdXNlZCBhcyB0cmFjayBpZHMuCisgKgorICogVGhpcyBhc3N1bWVzIG1vdi0+dHJhY2tzIGFuZCBzLT5zdHJlYW1zIGFyZSBpbiB0aGUgc2FtZSBvcmRlciBhbmQKKyAqIHRoZXJlIGFyZSBubyBnYXBzIGluIGVpdGhlciBvZiB0aGVtIChzbyBtb3YtPnRyYWNrc1tuXSByZWZlcnMgdG8KKyAqIHMtPnN0cmVhbXNbbl0pLgorICoKKyAqIEFzIGFuIGV4Y2VwdGlvbiwgdGhlcmUgY2FuIGJlIG1vcmUgZW50cmllcyBpbgorICogcy0+c3RyZWFtcyB0aGFuIGluIG1vdi0+dHJhY2tzLCBpbiB3aGljaCBjYXNlIG5ldyB0cmFjayBpZHMgYXJlCisgKiBnZW5lcmF0ZWQgKHN0YXJ0aW5nIGFmdGVyIHRoZSBsYXJnZXN0IGZvdW5kIHN0cmVhbSBpZCkuCisgKi8KK3N0YXRpYyBpbnQgbW92X3NldHVwX3RyYWNrX2lkcyhNT1ZNdXhDb250ZXh0ICptb3YsIEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChtb3YtPnRyYWNrX2lkc19vaykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAobW92LT51c2Vfc3RyZWFtX2lkc19hc190cmFja19pZHMpIHsKKyAgICAgICAgaW50IG5leHRfZ2VuZXJhdGVkX3RyYWNrX2lkID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmlkID4gbmV4dF9nZW5lcmF0ZWRfdHJhY2tfaWQpCisgICAgICAgICAgICAgICAgbmV4dF9nZW5lcmF0ZWRfdHJhY2tfaWQgPSBzLT5zdHJlYW1zW2ldLT5pZDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1vdi0+dHJhY2tzW2ldLmVudHJ5IDw9IDAgJiYgIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBtb3YtPnRyYWNrc1tpXS50cmFja19pZCA9IGkgPj0gcy0+bmJfc3RyZWFtcyA/ICsrbmV4dF9nZW5lcmF0ZWRfdHJhY2tfaWQgOiBzLT5zdHJlYW1zW2ldLT5pZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgaWYgKG1vdi0+dHJhY2tzW2ldLmVudHJ5IDw9IDAgJiYgIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBtb3YtPnRyYWNrc1tpXS50cmFja19pZCA9IGkgKyAxOworICAgICAgICB9CisgICAgfQorCisgICAgbW92LT50cmFja19pZHNfb2sgPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbW92X3dyaXRlX21vb3ZfdGFnKEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGb3JtYXRDb250ZXh0ICpzKQogewpAQCAtMzIwOSwxMiArMzg3MiwxMyBAQAogICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgcGxhY2Vob2xkZXIqLwogICAgIGZmaW9fd2ZvdXJjYyhwYiwgIm1vb3YiKTsKIAorICAgIG1vdl9zZXR1cF90cmFja19pZHMobW92LCBzKTsKKwogICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpZiAobW92LT50cmFja3NbaV0uZW50cnkgPD0gMCAmJiAhKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19GUkFHTUVOVCkpCiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBtb3YtPnRyYWNrc1tpXS50aW1lICAgICA9IG1vdi0+dGltZTsKLSAgICAgICAgbW92LT50cmFja3NbaV0udHJhY2tfaWQgPSBpICsgMTsKIAogICAgICAgICBpZiAobW92LT50cmFja3NbaV0uZW50cnkpCiAgICAgICAgICAgICBidWlsZF9jaHVua3MoJm1vdi0+dHJhY2tzW2ldKTsKQEAgLTMyMzAsNyArMzg5NCw3IEBACiAgICAgICAgIGlmICh0cmFjay0+dGFnID09IE1LVEFHKCdyJywndCcsJ3AnLCcgJykpIHsKICAgICAgICAgICAgIHRyYWNrLT50cmVmX3RhZyA9IE1LVEFHKCdoJywnaScsJ24nLCd0Jyk7CiAgICAgICAgICAgICB0cmFjay0+dHJlZl9pZCA9IG1vdi0+dHJhY2tzW3RyYWNrLT5zcmNfdHJhY2tdLnRyYWNrX2lkOwotICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKICAgICAgICAgICAgIGludCAqIGZhbGxiYWNrLCBzaXplOwogICAgICAgICAgICAgZmFsbGJhY2sgPSAoaW50Kilhdl9zdHJlYW1fZ2V0X3NpZGVfZGF0YSh0cmFjay0+c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BLVF9EQVRBX0ZBTExCQUNLX1RSQUNLLApAQCAtMzI2MCw3ICszOTI0LDcgQEAKICAgICAgICAgbW92X3dyaXRlX2lvZHNfdGFnKHBiLCBtb3YpOwogICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpZiAobW92LT50cmFja3NbaV0uZW50cnkgPiAwIHx8IG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19GUkFHTUVOVCkgewotICAgICAgICAgICAgaW50IHJldCA9IG1vdl93cml0ZV90cmFrX3RhZyhwYiwgbW92LCAmKG1vdi0+dHJhY2tzW2ldKSwgaSA8IHMtPm5iX3N0cmVhbXMgPyBzLT5zdHJlYW1zW2ldIDogTlVMTCk7CisgICAgICAgICAgICBpbnQgcmV0ID0gbW92X3dyaXRlX3RyYWtfdGFnKHMsIHBiLCBtb3YsICYobW92LT50cmFja3NbaV0pLCBpIDwgcy0+bmJfc3RyZWFtcyA/IHMtPnN0cmVhbXNbaV0gOiBOVUxMKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KQEAgLTMyOTUsMTAgKzM5NTksMTMgQEAKICAgICBhdmlvX3ByaW50ZihwYiwgIjxwYXJhbSBuYW1lPVwiJXNcIiB2YWx1ZT1cIiVzXCIgdmFsdWV0eXBlPVwiZGF0YVwiLz5cbiIsIG5hbWUsIGJ1Zik7CiB9CiAKLXN0YXRpYyBpbnQgbW92X3dyaXRlX2lzbWxfbWFuaWZlc3QoQVZJT0NvbnRleHQgKnBiLCBNT1ZNdXhDb250ZXh0ICptb3YpCitzdGF0aWMgaW50IG1vdl93cml0ZV9pc21sX21hbmlmZXN0KEFWSU9Db250ZXh0ICpwYiwgTU9WTXV4Q29udGV4dCAqbW92LCBBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOwogICAgIGludCBpOworICAgIGludDY0X3QgbWFuaWZlc3RfYml0X3JhdGUgPSAwOworICAgIEFWQ1BCUHJvcGVydGllcyAqcHJvcHMgPSBOVUxMOworCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgdXVpZFtdID0gewogICAgICAgICAweGE1LCAweGQ0LCAweDBiLCAweDMwLCAweGU4LCAweDE0LCAweDExLCAweGRkLAogICAgICAgICAweGJhLCAweDJmLCAweDA4LCAweDAwLCAweDIwLCAweDBjLCAweDlhLCAweDY2CkBAIC0zMzE4LDQ4ICszOTg1LDgwIEBACiAgICAgYXZpb19wcmludGYocGIsICI8L2hlYWQ+XG4iKTsKICAgICBhdmlvX3ByaW50ZihwYiwgIjxib2R5PlxuIik7CiAgICAgYXZpb19wcmludGYocGIsICI8c3dpdGNoPlxuIik7CisKKyAgICBtb3Zfc2V0dXBfdHJhY2tfaWRzKG1vdiwgcyk7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgTU9WVHJhY2sgKnRyYWNrID0gJm1vdi0+dHJhY2tzW2ldOwogICAgICAgICBjb25zdCBjaGFyICp0eXBlOwotICAgICAgICAvKiB0cmFjay0+dHJhY2tfaWQgaXMgaW5pdGlhbGl6ZWQgaW4gd3JpdGVfbW9vdiwgYW5kIHRodXMgaXNuJ3Qga25vd24KLSAgICAgICAgICogaGVyZSB5ZXQgKi8KLSAgICAgICAgaW50IHRyYWNrX2lkID0gaSArIDE7CisgICAgICAgIGludCB0cmFja19pZCA9IHRyYWNrLT50cmFja19pZDsKKyAgICAgICAgY2hhciB0cmFja19uYW1lX2J1ZlszMl0gPSB7IDAgfTsKIAotICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gdHJhY2stPnN0OworICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqbGFuZyA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgTlVMTCwwKTsKKworICAgICAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgIWlzX2NvdmVyX2ltYWdlKHN0KSkgewogICAgICAgICAgICAgdHlwZSA9ICJ2aWRlbyI7Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICAgICAgdHlwZSA9ICJhdWRpbyI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorCisgICAgICAgIHByb3BzID0gKEFWQ1BCUHJvcGVydGllcyopYXZfc3RyZWFtX2dldF9zaWRlX2RhdGEodHJhY2stPnN0LCBBVl9QS1RfREFUQV9DUEJfUFJPUEVSVElFUywgTlVMTCk7CisKKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPmJpdF9yYXRlKSB7CisgICAgICAgICAgICBtYW5pZmVzdF9iaXRfcmF0ZSA9IHRyYWNrLT5wYXItPmJpdF9yYXRlOworICAgICAgICB9IGVsc2UgaWYgKHByb3BzKSB7CisgICAgICAgICAgICBtYW5pZmVzdF9iaXRfcmF0ZSA9IHByb3BzLT5tYXhfYml0cmF0ZTsKKyAgICAgICAgfQorCiAgICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiPCVzIHN5c3RlbUJpdHJhdGU9XCIlIlBSSWQ2NCJcIj5cbiIsIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXRyYWNrLT5lbmMtPmJpdF9yYXRlKTsKLSAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAic3lzdGVtQml0cmF0ZSIsIHRyYWNrLT5lbmMtPmJpdF9yYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgbWFuaWZlc3RfYml0X3JhdGUpOworICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJzeXN0ZW1CaXRyYXRlIiwgbWFuaWZlc3RfYml0X3JhdGUpOwogICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJ0cmFja0lEIiwgdHJhY2tfaWQpOwotICAgICAgICBpZiAodHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgIHBhcmFtX3dyaXRlX3N0cmluZyhwYiwgInN5c3RlbUxhbmd1YWdlIiwgbGFuZyA/IGxhbmctPnZhbHVlIDogInVuZCIpOworCisgICAgICAgIC8qIEJ1aWxkIHRyYWNrIG5hbWUgcGllY2UgYnkgcGllY2U6ICovCisgICAgICAgIC8qIDEuIHRyYWNrIHR5cGUgKi8KKyAgICAgICAgYXZfc3RybGNhdCh0cmFja19uYW1lX2J1ZiwgdHlwZSwgc2l6ZW9mKHRyYWNrX25hbWVfYnVmKSk7CisgICAgICAgIC8qIDIuIHRyYWNrIGxhbmd1YWdlLCBpZiBhdmFpbGFibGUgKi8KKyAgICAgICAgaWYgKGxhbmcpCisgICAgICAgICAgICBhdl9zdHJsY2F0Zih0cmFja19uYW1lX2J1Ziwgc2l6ZW9mKHRyYWNrX25hbWVfYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJfJXMiLCBsYW5nLT52YWx1ZSk7CisgICAgICAgIC8qIDMuIHNwZWNpYWwgdHlwZSBzdWZmaXggKi8KKyAgICAgICAgLyogIl9jYyIgPSBjbG9zZWQgY2FwdGlvbnMsICJfYWQiID0gYXVkaW9fZGVzY3JpcHRpb24gKi8KKyAgICAgICAgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQpCisgICAgICAgICAgICBhdl9zdHJsY2F0KHRyYWNrX25hbWVfYnVmLCAiX2NjIiwgc2l6ZW9mKHRyYWNrX25hbWVfYnVmKSk7CisgICAgICAgIGVsc2UgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX1ZJU1VBTF9JTVBBSVJFRCkKKyAgICAgICAgICAgIGF2X3N0cmxjYXQodHJhY2tfbmFtZV9idWYsICJfYWQiLCBzaXplb2YodHJhY2tfbmFtZV9idWYpKTsKKworICAgICAgICBwYXJhbV93cml0ZV9zdHJpbmcocGIsICJ0cmFja05hbWUiLCB0cmFja19uYW1lX2J1Zik7CisKKyAgICAgICAgaWYgKHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0cjsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHRyYWNrLT5lbmMtPmV4dHJhZGF0YV9zaXplOwotICAgICAgICAgICAgICAgIGlmICghZmZfYXZjX3dyaXRlX2FubmV4Yl9leHRyYWRhdGEodHJhY2stPmVuYy0+ZXh0cmFkYXRhLCAmcHRyLAorICAgICAgICAgICAgICAgIGludCBzaXplID0gdHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemU7CisgICAgICAgICAgICAgICAgaWYgKCFmZl9hdmNfd3JpdGVfYW5uZXhiX2V4dHJhZGF0YSh0cmFjay0+cGFyLT5leHRyYWRhdGEsICZwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgcGFyYW1fd3JpdGVfaGV4KHBiLCAiQ29kZWNQcml2YXRlRGF0YSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPyBwdHIgOiB0cmFjay0+ZW5jLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPyBwdHIgOiB0cmFjay0+cGFyLT5leHRyYWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKICAgICAgICAgICAgICAgICAgICAgYXZfZnJlZShwdHIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwYXJhbV93cml0ZV9zdHJpbmcocGIsICJGb3VyQ0MiLCAiSDI2NCIpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxKSB7CiAgICAgICAgICAgICAgICAgcGFyYW1fd3JpdGVfc3RyaW5nKHBiLCAiRm91ckNDIiwgIldWQzEiKTsKLSAgICAgICAgICAgICAgICBwYXJhbV93cml0ZV9oZXgocGIsICJDb2RlY1ByaXZhdGVEYXRhIiwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgcGFyYW1fd3JpdGVfaGV4KHBiLCAiQ29kZWNQcml2YXRlRGF0YSIsIHRyYWNrLT5wYXItPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiTWF4V2lkdGgiLCB0cmFjay0+ZW5jLT53aWR0aCk7Ci0gICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJNYXhIZWlnaHQiLCB0cmFjay0+ZW5jLT5oZWlnaHQpOwotICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiRGlzcGxheVdpZHRoIiwgdHJhY2stPmVuYy0+d2lkdGgpOwotICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiRGlzcGxheUhlaWdodCIsIHRyYWNrLT5lbmMtPmhlaWdodCk7CisgICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJNYXhXaWR0aCIsIHRyYWNrLT5wYXItPndpZHRoKTsKKyAgICAgICAgICAgIHBhcmFtX3dyaXRlX2ludChwYiwgIk1heEhlaWdodCIsIHRyYWNrLT5wYXItPmhlaWdodCk7CisgICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJEaXNwbGF5V2lkdGgiLCB0cmFjay0+cGFyLT53aWR0aCk7CisgICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJEaXNwbGF5SGVpZ2h0IiwgdHJhY2stPnBhci0+aGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICh0cmFjay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHRyYWNrLT5lbmMtPnByb2ZpbGUpCisgICAgICAgICAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0cmFjay0+cGFyLT5wcm9maWxlKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBGRl9QUk9GSUxFX0FBQ19IRV9WMjoKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtX3dyaXRlX3N0cmluZyhwYiwgIkZvdXJDQyIsICJBQUNQIik7CkBAIC0zMzcwLDE4ICs0MDY5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbV93cml0ZV9zdHJpbmcocGIsICJGb3VyQ0MiLCAiQUFDTCIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01BUFJPKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVBSTykgewogICAgICAgICAgICAgICAgIHBhcmFtX3dyaXRlX3N0cmluZyhwYiwgIkZvdXJDQyIsICJXTUFQIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXJhbV93cml0ZV9oZXgocGIsICJDb2RlY1ByaXZhdGVEYXRhIiwgdHJhY2stPmVuYy0+ZXh0cmFkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHBhcmFtX3dyaXRlX2hleChwYiwgIkNvZGVjUHJpdmF0ZURhdGEiLCB0cmFjay0+cGFyLT5leHRyYWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiQXVkaW9UYWciLCBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX3dhdl90YWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX2lkKSk7Ci0gICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJDaGFubmVscyIsIHRyYWNrLT5lbmMtPmNoYW5uZWxzKTsKLSAgICAgICAgICAgIHBhcmFtX3dyaXRlX2ludChwYiwgIlNhbXBsaW5nUmF0ZSIsIHRyYWNrLT5lbmMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2RlY19pZCkpOworICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiQ2hhbm5lbHMiLCB0cmFjay0+cGFyLT5jaGFubmVscyk7CisgICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJTYW1wbGluZ1JhdGUiLCB0cmFjay0+cGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICBwYXJhbV93cml0ZV9pbnQocGIsICJCaXRzUGVyU2FtcGxlIiwgMTYpOwotICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiUGFja2V0U2l6ZSIsIHRyYWNrLT5lbmMtPmJsb2NrX2FsaWduID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZW5jLT5ibG9ja19hbGlnbiA6IDQpOworICAgICAgICAgICAgcGFyYW1fd3JpdGVfaW50KHBiLCAiUGFja2V0U2l6ZSIsIHRyYWNrLT5wYXItPmJsb2NrX2FsaWduID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5ibG9ja19hbGlnbiA6IDQpOwogICAgICAgICB9CiAgICAgICAgIGF2aW9fcHJpbnRmKHBiLCAiPC8lcz5cbiIsIHR5cGUpOwogICAgIH0KQEAgLTM0NTgsNyArNDE1Nyw3IEBACiAgICAgICAgICAgICB0cmFjay0+ZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPSBnZXRfc2FtcGxlX2ZsYWdzKHRyYWNrLCAmdHJhY2stPmNsdXN0ZXJbMV0pOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICB0cmFjay0+ZGVmYXVsdF9zYW1wbGVfZmxhZ3MgPQotICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8KKyAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyA/CiAgICAgICAgICAgICAgICAgKE1PVl9GUkFHX1NBTVBMRV9GTEFHX0RFUEVORFNfWUVTIHwgTU9WX0ZSQUdfU0FNUExFX0ZMQUdfSVNfTk9OX1NZTkMpIDoKICAgICAgICAgICAgICAgICBNT1ZfRlJBR19TQU1QTEVfRkxBR19ERVBFTkRTX05POwogICAgICAgICBhdmlvX3diMzIocGIsIHRyYWNrLT5kZWZhdWx0X3NhbXBsZV9mbGFncyk7CkBAIC0zNDkxLDcgKzQxOTAsMTAgQEAKIAogICAgIGF2aW9fd2IzMihwYiwgMCk7IC8qIHNpemUgcGxhY2Vob2xkZXIgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJ0cnVuIik7Ci0gICAgYXZpb193OChwYiwgMCk7IC8qIHZlcnNpb24gKi8KKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX05FR0FUSVZFX0NUU19PRkZTRVRTKQorICAgICAgICBhdmlvX3c4KHBiLCAxKTsgLyogdmVyc2lvbiAqLworICAgIGVsc2UKKyAgICAgICAgYXZpb193OChwYiwgMCk7IC8qIHZlcnNpb24gKi8KICAgICBhdmlvX3diMjQocGIsIGZsYWdzKTsKIAogICAgIGF2aW9fd2IzMihwYiwgZW5kIC0gZmlyc3QpOyAvKiBzYW1wbGUgY291bnQgKi8KQEAgLTM2MzAsNiArNDMzMiwyMCBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBtb3ZfcHJ1bmVfZnJhZ19pbmZvKE1PVk11eENvbnRleHQgKm1vdiwgaW50IHRyYWNrcywgaW50IG1heCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbW92LT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgTU9WVHJhY2sgKnRyYWNrID0gJm1vdi0+dHJhY2tzW2ldOworICAgICAgICBpZiAoKHRyYWNrcyA+PSAwICYmIGkgIT0gdHJhY2tzKSB8fCAhdHJhY2stPmVudHJ5KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmICh0cmFjay0+bmJfZnJhZ19pbmZvID4gbWF4KSB7CisgICAgICAgICAgICBtZW1tb3ZlKHRyYWNrLT5mcmFnX2luZm8sIHRyYWNrLT5mcmFnX2luZm8gKyAodHJhY2stPm5iX2ZyYWdfaW5mbyAtIG1heCksIG1heCAqIHNpemVvZigqdHJhY2stPmZyYWdfaW5mbykpOworICAgICAgICAgICAgdHJhY2stPm5iX2ZyYWdfaW5mbyA9IG1heDsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdGljIGludCBtb3Zfd3JpdGVfdGZkdF90YWcoQVZJT0NvbnRleHQgKnBiLCBNT1ZUcmFjayAqdHJhY2spCiB7CiAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOwpAQCAtMzgxNSw4ICs0NTMxLDE2IEBACiAgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19EQVNIICYmICEobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0dMT0JBTF9TSURYKSkKICAgICAgICAgbW92X3dyaXRlX3NpZHhfdGFncyhwYiwgbW92LCB0cmFja3MsIG1vb2Zfc2l6ZSArIDggKyBtZGF0X3NpemUpOwogCi0gICAgaWYgKChyZXQgPSBtb3ZfYWRkX3RmcmFfZW50cmllcyhwYiwgbW92LCB0cmFja3MsIG1vb2Zfc2l6ZSArIDggKyBtZGF0X3NpemUpKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19HTE9CQUxfU0lEWCB8fAorICAgICAgICAhKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19TS0lQX1RSQUlMRVIpIHx8CisgICAgICAgIG1vdi0+aXNtX2xvb2thaGVhZCkgeworICAgICAgICBpZiAoKHJldCA9IG1vdl9hZGRfdGZyYV9lbnRyaWVzKHBiLCBtb3YsIHRyYWNrcywgbW9vZl9zaXplICsgOCArIG1kYXRfc2l6ZSkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICghKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19HTE9CQUxfU0lEWCkgJiYKKyAgICAgICAgICAgIG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19TS0lQX1RSQUlMRVIpIHsKKyAgICAgICAgICAgIG1vdl9wcnVuZV9mcmFnX2luZm8obW92LCB0cmFja3MsIG1vdi0+aXNtX2xvb2thaGVhZCArIDEpOworICAgICAgICB9CisgICAgfQogCiAgICAgcmV0dXJuIG1vdl93cml0ZV9tb29mX3RhZ19pbnRlcm5hbChwYiwgbW92LCB0cmFja3MsIG1vb2Zfc2l6ZSk7CiB9CkBAIC0zODkzLDkgKzQ2MTcsMTEgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGlmIChpc19jb3Zlcl9pbWFnZShzdCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgICAgICBoYXNfdmlkZW8gPSAxOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQogICAgICAgICAgICAgaGFzX2gyNjQgPSAxOwogICAgIH0KIApAQCAtMzkxNCw2ICs0NjQwLDggQEAKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiTVNOViIpOwogICAgIGVsc2UgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX01QNCAmJiBtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfREVGQVVMVF9CQVNFX01PT0YpCiAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImlzbzUiKTsgLy8gUmVxdWlyZWQgd2hlbiB1c2luZyBkZWZhdWx0LWJhc2UtaXMtbW9vZgorICAgIGVsc2UgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX01QNCAmJiBtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfTkVHQVRJVkVfQ1RTX09GRlNFVFMpCisgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImlzbzQiKTsKICAgICBlbHNlIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9NUDQpCiAgICAgICAgIGZmaW9fd2ZvdXJjYyhwYiwgImlzb20iKTsKICAgICBlbHNlIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9JUE9EKQpAQCAtMzk1OCwxNiArNDY4NiwyMiBAQAogICAgIHJldHVybiB1cGRhdGVfc2l6ZShwYiwgcG9zKTsKIH0KIAotc3RhdGljIHZvaWQgbW92X3dyaXRlX3V1aWRwcm9mX3RhZyhBVklPQ29udGV4dCAqcGIsIEFWRm9ybWF0Q29udGV4dCAqcykKK3N0YXRpYyBpbnQgbW92X3dyaXRlX3V1aWRwcm9mX3RhZyhBVklPQ29udGV4dCAqcGIsIEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBBVlN0cmVhbSAgICAgICAqdmlkZW9fc3QgICAgPSBzLT5zdHJlYW1zWzBdOwotICAgIEFWQ29kZWNDb250ZXh0ICp2aWRlb19jb2RlYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOwotICAgIEFWQ29kZWNDb250ZXh0ICphdWRpb19jb2RlYyA9IHMtPnN0cmVhbXNbMV0tPmNvZGVjOwotICAgIGludCBhdWRpb19yYXRlID0gYXVkaW9fY29kZWMtPnNhbXBsZV9yYXRlOwotICAgIC8vIFRPRE86IHNob3VsZCBiZSBhdmdfZnJhbWVfcmF0ZQotICAgIGludCBmcmFtZV9yYXRlID0gKCh2aWRlb19zdC0+dGltZV9iYXNlLmRlbikgKiAoMHgxMDAwMCkpIC8gKHZpZGVvX3N0LT50aW1lX2Jhc2UubnVtKTsKLSAgICBpbnQgYXVkaW9fa2JpdHJhdGUgPSBhdWRpb19jb2RlYy0+Yml0X3JhdGUgLyAxMDAwOwotICAgIGludCB2aWRlb19rYml0cmF0ZSA9IEZGTUlOKHZpZGVvX2NvZGVjLT5iaXRfcmF0ZSAvIDEwMDAsIDgwMCAtIGF1ZGlvX2tiaXRyYXRlKTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqdmlkZW9fcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmF1ZGlvX3BhciA9IHMtPnN0cmVhbXNbMV0tPmNvZGVjcGFyOworICAgIGludCBhdWRpb19yYXRlID0gYXVkaW9fcGFyLT5zYW1wbGVfcmF0ZTsKKyAgICBpbnQ2NF90IGZyYW1lX3JhdGUgPSB2aWRlb19zdC0+YXZnX2ZyYW1lX3JhdGUuZGVuID8KKyAgICAgICAgICAgICAgICAgICAgICAgICh2aWRlb19zdC0+YXZnX2ZyYW1lX3JhdGUubnVtICogMHgxMDAwMExMKSAvIHZpZGVvX3N0LT5hdmdfZnJhbWVfcmF0ZS5kZW4gOgorICAgICAgICAgICAgICAgICAgICAgICAgMDsKKyAgICBpbnQgYXVkaW9fa2JpdHJhdGUgPSBhdWRpb19wYXItPmJpdF9yYXRlIC8gMTAwMDsKKyAgICBpbnQgdmlkZW9fa2JpdHJhdGUgPSBGRk1JTih2aWRlb19wYXItPmJpdF9yYXRlIC8gMTAwMCwgODAwIC0gYXVkaW9fa2JpdHJhdGUpOworCisgICAgaWYgKGZyYW1lX3JhdGUgPCAwIHx8IGZyYW1lX3JhdGUgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZyYW1lIHJhdGUgJWYgb3V0c2lkZSBzdXBwb3J0ZWQgcmFuZ2VcbiIsIGZyYW1lX3JhdGUgLyAoZG91YmxlKTB4MTAwMDApOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KIAogICAgIGF2aW9fd2IzMihwYiwgMHg5NCk7IC8qIHNpemUgKi8KICAgICBmZmlvX3dmb3VyY2MocGIsICJ1dWlkIik7CkBAIC0zOTk2LDEzICs0NzMwLDEzIEBACiAgICAgYXZpb193YjMyKHBiLCBhdWRpb19rYml0cmF0ZSk7CiAgICAgYXZpb193YjMyKHBiLCBhdWRpb19rYml0cmF0ZSk7CiAgICAgYXZpb193YjMyKHBiLCBhdWRpb19yYXRlKTsKLSAgICBhdmlvX3diMzIocGIsIGF1ZGlvX2NvZGVjLT5jaGFubmVscyk7CisgICAgYXZpb193YjMyKHBiLCBhdWRpb19wYXItPmNoYW5uZWxzKTsKIAogICAgIGF2aW9fd2IzMihwYiwgMHgzNCk7ICAvKiBzaXplICovCiAgICAgZmZpb193Zm91cmNjKHBiLCAiVlBSRiIpOyAgIC8qIHZpZGVvICovCiAgICAgYXZpb193YjMyKHBiLCAweDApOwogICAgIGF2aW9fd2IzMihwYiwgMHgxKTsgICAgLyogVHJhY2tJRCAqLwotICAgIGlmICh2aWRlb19jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgIGlmICh2aWRlb19wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKICAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiYXZjMSIpOwogICAgICAgICBhdmlvX3diMTYocGIsIDB4MDE0RCk7CiAgICAgICAgIGF2aW9fd2IxNihwYiwgMHgwMDE1KTsKQEAgLTQwMTYsOSArNDc1MCwxMSBAQAogICAgIGF2aW9fd2IzMihwYiwgdmlkZW9fa2JpdHJhdGUpOwogICAgIGF2aW9fd2IzMihwYiwgZnJhbWVfcmF0ZSk7CiAgICAgYXZpb193YjMyKHBiLCBmcmFtZV9yYXRlKTsKLSAgICBhdmlvX3diMTYocGIsIHZpZGVvX2NvZGVjLT53aWR0aCk7Ci0gICAgYXZpb193YjE2KHBiLCB2aWRlb19jb2RlYy0+aGVpZ2h0KTsKKyAgICBhdmlvX3diMTYocGIsIHZpZGVvX3Bhci0+d2lkdGgpOworICAgIGF2aW9fd2IxNihwYiwgdmlkZW9fcGFyLT5oZWlnaHQpOwogICAgIGF2aW9fd2IzMihwYiwgMHgwMTAwMDEpOyAvKiA/ICovCisKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtb3Zfd3JpdGVfaWRlbnRpZmljYXRpb24oQVZJT0NvbnRleHQgKnBiLCBBVkZvcm1hdENvbnRleHQgKnMpCkBAIC00MDMxLDkgKzQ3NjcsMTEgQEAKICAgICAgICAgaW50IHZpZGVvX3N0cmVhbXNfbmIgPSAwLCBhdWRpb19zdHJlYW1zX25iID0gMCwgb3RoZXJfc3RyZWFtc19uYiA9IDA7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgICAgIGlmIChpc19jb3Zlcl9pbWFnZShzdCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKICAgICAgICAgICAgICAgICB2aWRlb19zdHJlYW1zX25iKys7Ci0gICAgICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1zX25iKys7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgb3RoZXJfc3RyZWFtc19uYisrOwpAQCAtNDA0Myw3ICs0NzgxLDcgQEAKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJQU1AgbW9kZSBuZWVkIG9uZSB2aWRlbyBhbmQgb25lIGF1ZGlvIHN0cmVhbVxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9Ci0gICAgICAgIG1vdl93cml0ZV91dWlkcHJvZl90YWcocGIsIHMpOworICAgICAgICByZXR1cm4gbW92X3dyaXRlX3V1aWRwcm9mX3RhZyhwYiwgcyk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtNDE2MSwxMCArNDg5OSwzMiBAQAogICAgIGludCBpLCBmaXJzdF90cmFjayA9IC0xOwogICAgIGludDY0X3QgbWRhdF9zaXplID0gMDsKICAgICBpbnQgcmV0OworICAgIGludCBoYXNfdmlkZW8gPSAwLCBzdGFydHNfd2l0aF9rZXkgPSAwLCBmaXJzdF92aWRlb190cmFjayA9IDE7CiAKICAgICBpZiAoIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQpKQogICAgICAgICByZXR1cm4gMDsKIAorICAgIC8vIFRyeSB0byBmaWxsIGluIHRoZSBkdXJhdGlvbiBvZiB0aGUgbGFzdCBwYWNrZXQgaW4gZWFjaCBzdHJlYW0KKyAgICAvLyBmcm9tIHF1ZXVlZCBwYWNrZXRzIGluIHRoZSBpbnRlcmxlYXZlIHF1ZXVlcy4gSWYgdGhlIGZsdXNoaW5nCisgICAgLy8gb2YgZnJhZ21lbnRzIHdhcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSBieSBhbiBBVlBhY2tldCwgd2UKKyAgICAvLyBhbHJlYWR5IGhhdmUgcmVsaWFibGUgaW5mbyBmb3IgdGhlIGVuZCBvZiB0aGF0IHRyYWNrLCBidXQgb3RoZXIKKyAgICAvLyB0cmFja3MgbWF5IG5lZWQgdG8gYmUgZmlsbGVkIGluLgorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgTU9WVHJhY2sgKnRyYWNrID0gJm1vdi0+dHJhY2tzW2ldOworICAgICAgICBpZiAoIXRyYWNrLT5lbmRfcmVsaWFibGUpIHsKKyAgICAgICAgICAgIEFWUGFja2V0IHBrdDsKKyAgICAgICAgICAgIGlmICghZmZfaW50ZXJsZWF2ZWRfcGVlayhzLCBpLCAmcGt0LCAxKSkgeworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+ZHRzX3NoaWZ0ICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICBwa3QuZHRzICs9IHRyYWNrLT5kdHNfc2hpZnQ7CisgICAgICAgICAgICAgICAgdHJhY2stPnRyYWNrX2R1cmF0aW9uID0gcGt0LmR0cyAtIHRyYWNrLT5zdGFydF9kdHM7CisgICAgICAgICAgICAgICAgaWYgKHBrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmRfcHRzID0gcGt0LnB0czsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5lbmRfcHRzID0gcGt0LmR0czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBNT1ZUcmFjayAqdHJhY2sgPSAmbW92LT50cmFja3NbaV07CiAgICAgICAgIGlmICh0cmFjay0+ZW50cnkgPD0gMSkKQEAgLTQxOTgsNyArNDk1OCw3IEBACiAgICAgICAgIGludCBidWZfc2l6ZSwgbW9vdl9zaXplOwogCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgICAgIGlmICghbW92LT50cmFja3NbaV0uZW50cnkpCisgICAgICAgICAgICBpZiAoIW1vdi0+dHJhY2tzW2ldLmVudHJ5ICYmICFpc19jb3Zlcl9pbWFnZShtb3YtPnRyYWNrc1tpXS5zdCkpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIC8qIERvbid0IHdyaXRlIHRoZSBpbml0aWFsIG1vb3YgdW5sZXNzIGFsbCB0cmFja3MgaGF2ZSBkYXRhICovCiAgICAgICAgIGlmIChpIDwgbW92LT5uYl9zdHJlYW1zICYmICFmb3JjZSkKQEAgLTQyMDgsNiArNDk2OCw3IEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykKICAgICAgICAgICAgIG1vdi0+dHJhY2tzW2ldLmRhdGFfb2Zmc2V0ID0gcG9zICsgbW9vdl9zaXplICsgODsKIAorICAgICAgICBhdmlvX3dyaXRlX21hcmtlcihzLT5wYiwgQVZfTk9QVFNfVkFMVUUsIEFWSU9fREFUQV9NQVJLRVJfSEVBREVSKTsKICAgICAgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19ERUxBWV9NT09WKQogICAgICAgICAgICAgbW92X3dyaXRlX2lkZW50aWZpY2F0aW9uKHMtPnBiLCBzKTsKICAgICAgICAgaWYgKChyZXQgPSBtb3Zfd3JpdGVfbW9vdl90YWcocy0+cGIsIG1vdiwgcykpIDwgMCkKQEAgLTQyMzksNiArNTAwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YtPnRyYWNrc1tpXS50cmFja19kdXJhdGlvbiAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3YtPnRyYWNrc1tpXS5jbHVzdGVyWzBdLmR0czsKICAgICAgICAgICAgIG1vdi0+dHJhY2tzW2ldLmVudHJ5ID0gMDsKKyAgICAgICAgICAgIG1vdi0+dHJhY2tzW2ldLmVuZF9yZWxpYWJsZSA9IDA7CiAgICAgICAgIH0KICAgICAgICAgYXZpb19mbHVzaChzLT5wYik7CiAgICAgICAgIHJldHVybiAwOwpAQCAtNDI2Myw2ICs1MDI1LDE0IEBACiAgICAgICAgICAgICB0cmFjay0+ZGF0YV9vZmZzZXQgPSAwOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICB0cmFjay0+ZGF0YV9vZmZzZXQgPSBtZGF0X3NpemU7CisgICAgICAgIGlmICh0cmFjay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgaGFzX3ZpZGVvID0gMTsKKyAgICAgICAgICAgIGlmIChmaXJzdF92aWRlb190cmFjaykgeworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+ZW50cnkpCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0c193aXRoX2tleSA9IHRyYWNrLT5jbHVzdGVyWzBdLmZsYWdzICYgTU9WX1NZTkNfU0FNUExFOworICAgICAgICAgICAgICAgIGZpcnN0X3ZpZGVvX3RyYWNrID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAoIXRyYWNrLT5lbnRyeSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBpZiAodHJhY2stPm1kYXRfYnVmKQpAQCAtNDI3NCw2ICs1MDQ0LDEwIEBACiAgICAgaWYgKCFtZGF0X3NpemUpCiAgICAgICAgIHJldHVybiAwOwogCisgICAgYXZpb193cml0ZV9tYXJrZXIocy0+cGIsCisgICAgICAgICAgICAgICAgICAgICAgYXZfcmVzY2FsZShtb3YtPnRyYWNrc1tmaXJzdF90cmFja10uY2x1c3RlclswXS5kdHMsIEFWX1RJTUVfQkFTRSwgbW92LT50cmFja3NbZmlyc3RfdHJhY2tdLnRpbWVzY2FsZSksCisgICAgICAgICAgICAgICAgICAgICAgKGhhc192aWRlbyA/IHN0YXJ0c193aXRoX2tleSA6IG1vdi0+dHJhY2tzW2ZpcnN0X3RyYWNrXS5jbHVzdGVyWzBdLmZsYWdzICYgTU9WX1NZTkNfU0FNUExFKSA/IEFWSU9fREFUQV9NQVJLRVJfU1lOQ19QT0lOVCA6IEFWSU9fREFUQV9NQVJLRVJfQk9VTkRBUllfUE9JTlQpOworCiAgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIE1PVlRyYWNrICp0cmFjayA9ICZtb3YtPnRyYWNrc1tpXTsKICAgICAgICAgaW50IGJ1Zl9zaXplLCB3cml0ZV9tb29mID0gMSwgbW9vZl90cmFja3MgPSAtMTsKQEAgLTQzMDYsNiArNTA4MCw3IEBACiAgICAgICAgICAgICB0cmFjay0+ZnJhZ19zdGFydCArPSBkdXJhdGlvbjsKICAgICAgICAgdHJhY2stPmVudHJ5ID0gMDsKICAgICAgICAgdHJhY2stPmVudHJpZXNfZmx1c2hlZCA9IDA7CisgICAgICAgIHRyYWNrLT5lbmRfcmVsaWFibGUgPSAwOwogICAgICAgICBpZiAoIW1vdi0+ZnJhZ19pbnRlcmxlYXZlKSB7CiAgICAgICAgICAgICBpZiAoIXRyYWNrLT5tZGF0X2J1ZikKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQzNDIsMzEgKzUxMTcsNTggQEAKICAgICByZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGNoZWNrX3BrdChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgTU9WTXV4Q29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOworICAgIE1PVlRyYWNrICp0cmsgPSAmbW92LT50cmFja3NbcGt0LT5zdHJlYW1faW5kZXhdOworICAgIGludDY0X3QgcmVmOworICAgIHVpbnQ2NF90IGR1cmF0aW9uOworCisgICAgaWYgKHRyay0+ZW50cnkpIHsKKyAgICAgICAgcmVmID0gdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnkgLSAxXS5kdHM7CisgICAgfSBlbHNlIGlmICggICB0cmstPnN0YXJ0X2R0cyAhPSBBVl9OT1BUU19WQUxVRQorICAgICAgICAgICAgICAgJiYgIXRyay0+ZnJhZ19kaXNjb250KSB7CisgICAgICAgIHJlZiA9IHRyay0+c3RhcnRfZHRzICsgdHJrLT50cmFja19kdXJhdGlvbjsKKyAgICB9IGVsc2UKKyAgICAgICAgcmVmID0gcGt0LT5kdHM7IC8vIFNraXAgdGVzdHMgZm9yIHRoZSBmaXJzdCBwYWNrZXQKKworICAgIGlmICh0cmstPmR0c19zaGlmdCAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAvKiBXaXRoIG5lZ2F0aXZlIENUUyBvZmZzZXRzIHdlIGhhdmUgc2V0IGFuIG9mZnNldCB0byB0aGUgRFRTLAorICAgICAgICAgKiByZXZlcnNlIHRoaXMgZm9yIHRoZSBjaGVjay4gKi8KKyAgICAgICAgcmVmIC09IHRyay0+ZHRzX3NoaWZ0OworICAgIH0KKworICAgIGR1cmF0aW9uID0gcGt0LT5kdHMgLSByZWY7CisgICAgaWYgKHBrdC0+ZHRzIDwgcmVmIHx8IGR1cmF0aW9uID49IElOVF9NQVgpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFwcGxpY2F0aW9uIHByb3ZpZGVkIGR1cmF0aW9uOiAlIlBSSWQ2NCIgLyB0aW1lc3RhbXA6ICUiUFJJZDY0IiBpcyBvdXQgb2YgcmFuZ2UgZm9yIG1vdi9tcDQgZm9ybWF0XG4iLAorICAgICAgICAgICAgZHVyYXRpb24sIHBrdC0+ZHRzCisgICAgICAgICk7CisKKyAgICAgICAgcGt0LT5kdHMgPSByZWYgKyAxOworICAgICAgICBwa3QtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIH0KKworICAgIGlmIChwa3QtPmR1cmF0aW9uIDwgMCB8fCBwa3QtPmR1cmF0aW9uID4gSU5UX01BWCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQXBwbGljYXRpb24gcHJvdmlkZWQgZHVyYXRpb246ICUiUFJJZDY0IiBpcyBpbnZhbGlkXG4iLCBwa3QtPmR1cmF0aW9uKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIGludCBmZl9tb3Zfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgTU9WVHJhY2sgKnRyayA9ICZtb3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF07Ci0gICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHRyay0+ZW5jOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSB0cmstPnBhcjsKICAgICB1bnNpZ25lZCBpbnQgc2FtcGxlc19pbl9jaHVuayA9IDA7CiAgICAgaW50IHNpemUgPSBwa3QtPnNpemUsIHJldCA9IDA7CiAgICAgdWludDhfdCAqcmVmb3JtYXR0ZWRfZGF0YSA9IE5VTEw7CiAKLSAgICBpZiAodHJrLT5lbnRyeSkgewotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gcGt0LT5kdHMgLSB0cmstPmNsdXN0ZXJbdHJrLT5lbnRyeSAtIDFdLmR0czsKLSAgICAgICAgaWYgKGR1cmF0aW9uIDwgMCB8fCBkdXJhdGlvbiA+IElOVF9NQVgpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBcHBsaWNhdGlvbiBwcm92aWRlZCBkdXJhdGlvbjogJSJQUklkNjQiIC8gdGltZXN0YW1wOiAlIlBSSWQ2NCIgaXMgb3V0IG9mIHJhbmdlIGZvciBtb3YvbXA0IGZvcm1hdFxuIiwKLSAgICAgICAgICAgICAgICBkdXJhdGlvbiwgcGt0LT5kdHMKLSAgICAgICAgICAgICk7CisgICAgcmV0ID0gY2hlY2tfcGt0KHMsIHBrdCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICAgICAgICAgIHBrdC0+ZHRzID0gdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnkgLSAxXS5kdHMgKyAxOwotICAgICAgICAgICAgcGt0LT5wdHMgPSBBVl9OT1BUU19WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGt0LT5kdXJhdGlvbiA8IDAgfHwgcGt0LT5kdXJhdGlvbiA+IElOVF9NQVgpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFwcGxpY2F0aW9uIHByb3ZpZGVkIGR1cmF0aW9uOiAlIlBSSWQ2NCIgaXMgaW52YWxpZFxuIiwgcGt0LT5kdXJhdGlvbik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQogICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR01FTlQpIHsKICAgICAgICAgaW50IHJldDsKICAgICAgICAgaWYgKG1vdi0+bW9vdl93cml0dGVuIHx8IG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19FTVBUWV9NT09WKSB7CkBAIC00MzkxLDcgKzUxOTMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKSB7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKSB7CiAgICAgICAgIC8qIFdlIG11c3QgZmluZCBvdXQgaG93IG1hbnkgQU1SIGJsb2NrcyB0aGVyZSBhcmUgaW4gb25lIHBhY2tldCAqLwogICAgICAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgcGFja2VkX3NpemVbMTZdID0KICAgICAgICAgICAgIHsxMywgMTQsIDE2LCAxOCwgMjAsIDIxLCAyNywgMzIsIDYsIDAsIDAsIDAsIDAsIDAsIDAsIDF9OwpAQCAtNDQwNSwyOCArNTIwNywzMyBAQAogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImZhdGFsIGVycm9yLCBpbnB1dCBpcyBub3QgYSBzaW5nbGUgcGFja2V0LCBpbXBsZW1lbnQgYSBBVlBhcnNlciBmb3IgaXRcbiIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX01TIHx8Ci0gICAgICAgICAgICAgICBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYpIHsKLSAgICAgICAgc2FtcGxlc19pbl9jaHVuayA9IGVuYy0+ZnJhbWVfc2l6ZTsKKyAgICB9IGVsc2UgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fTVMgfHwKKyAgICAgICAgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVikgeworICAgICAgICBzYW1wbGVzX2luX2NodW5rID0gdHJrLT5wYXItPmZyYW1lX3NpemU7CiAgICAgfSBlbHNlIGlmICh0cmstPnNhbXBsZV9zaXplKQogICAgICAgICBzYW1wbGVzX2luX2NodW5rID0gc2l6ZSAvIHRyay0+c2FtcGxlX3NpemU7CiAgICAgZWxzZQogICAgICAgICBzYW1wbGVzX2luX2NodW5rID0gMTsKIAorICAgIGlmIChzYW1wbGVzX2luX2NodW5rIDwgMSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmF0YWwgZXJyb3IsIGlucHV0IHBhY2tldCBjb250YWlucyBubyBzYW1wbGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKwogICAgIC8qIGNvcHkgZXh0cmFkYXRhIGlmIGl0IGV4aXN0cyAqLwotICAgIGlmICh0cmstPnZvc19sZW4gPT0gMCAmJiBlbmMtPmV4dHJhZGF0YV9zaXplID4gMCAmJgorICAgIGlmICh0cmstPnZvc19sZW4gPT0gMCAmJiBwYXItPmV4dHJhZGF0YV9zaXplID4gMCAmJgogICAgICAgICAhVEFHX0lTX0FWQ0kodHJrLT50YWcpICYmCi0gICAgICAgIChlbmMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0ROWEhEKSkgewotICAgICAgICB0cmstPnZvc19sZW4gID0gZW5jLT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfRE5YSEQpKSB7CisgICAgICAgIHRyay0+dm9zX2xlbiAgPSBwYXItPmV4dHJhZGF0YV9zaXplOwogICAgICAgICB0cmstPnZvc19kYXRhID0gYXZfbWFsbG9jKHRyay0+dm9zX2xlbik7CiAgICAgICAgIGlmICghdHJrLT52b3NfZGF0YSkgewogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgZ290byBlcnI7CiAgICAgICAgIH0KLSAgICAgICAgbWVtY3B5KHRyay0+dm9zX2RhdGEsIGVuYy0+ZXh0cmFkYXRhLCB0cmstPnZvc19sZW4pOworICAgICAgICBtZW1jcHkodHJrLT52b3NfZGF0YSwgcGFyLT5leHRyYWRhdGEsIHRyay0+dm9zX2xlbik7CiAgICAgfQogCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmIHBrdC0+c2l6ZSA+IDIgJiYKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYgcGt0LT5zaXplID4gMiAmJgogICAgICAgICAoQVZfUkIxNihwa3QtPmRhdGEpICYgMHhmZmYwKSA9PSAweGZmZjApIHsKICAgICAgICAgaWYgKCFzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+bmJfZnJhbWVzKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTWFsZm9ybWVkIEFBQyBiaXRzdHJlYW0gZGV0ZWN0ZWQ6ICIKQEAgLTQ0MzYsMTUgKzUyNDMsMTUgQEAKICAgICAgICAgfQogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJhYWMgYml0c3RyZWFtIGVycm9yXG4iKTsKICAgICB9Ci0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJiB0cmstPnZvc19sZW4gPiAwICYmICoodWludDhfdCAqKXRyay0+dm9zX2RhdGEgIT0gMSAmJiAhVEFHX0lTX0FWQ0kodHJrLT50YWcpKSB7Ci0gICAgICAgIC8qIGZyb20geDI2NCBvciBmcm9tIGJ5dGVzdHJlYW0gaDI2NCAqLwotICAgICAgICAvKiBuYWwgcmVmb3JtYXRpbmcgbmVlZGVkICovCisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJiB0cmstPnZvc19sZW4gPiAwICYmICoodWludDhfdCAqKXRyay0+dm9zX2RhdGEgIT0gMSAmJiAhVEFHX0lTX0FWQ0kodHJrLT50YWcpKSB7CisgICAgICAgIC8qIGZyb20geDI2NCBvciBmcm9tIGJ5dGVzdHJlYW0gSC4yNjQgKi8KKyAgICAgICAgLyogTkFMIHJlZm9ybWF0dGluZyBuZWVkZWQgKi8KICAgICAgICAgaWYgKHRyay0+aGludF90cmFjayA+PSAwICYmIHRyay0+aGludF90cmFjayA8IG1vdi0+bmJfc3RyZWFtcykgewogICAgICAgICAgICAgZmZfYXZjX3BhcnNlX25hbF91bml0c19idWYocGt0LT5kYXRhLCAmcmVmb3JtYXR0ZWRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplKTsKICAgICAgICAgICAgIGF2aW9fd3JpdGUocGIsIHJlZm9ybWF0dGVkX2RhdGEsIHNpemUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1vdi0+ZW5jcnlwdGlvbl9zY2hlbWUgPT0gTU9WX0VOQ19DRU5DX0FFU19DVFIpIHsKKyAgICAgICAgICAgIGlmICh0cmstPmNlbmMuYWVzX2N0cikgewogICAgICAgICAgICAgICAgIHNpemUgPSBmZl9tb3ZfY2VuY19hdmNfcGFyc2VfbmFsX3VuaXRzKCZ0cmstPmNlbmMsIHBiLCBwa3QtPmRhdGEsIHNpemUpOwogICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMCkgewogICAgICAgICAgICAgICAgICAgICByZXQgPSBzaXplOwpAQCAtNDQ1NCw3ICs1MjYxLDcgQEAKICAgICAgICAgICAgICAgICBzaXplID0gZmZfYXZjX3BhcnNlX25hbF91bml0cyhwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hFVkMgJiYgdHJrLT52b3NfbGVuID4gNiAmJgorICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDICYmIHRyay0+dm9zX2xlbiA+IDYgJiYKICAgICAgICAgICAgICAgIChBVl9SQjI0KHRyay0+dm9zX2RhdGEpID09IDEgfHwgQVZfUkIzMih0cmstPnZvc19kYXRhKSA9PSAxKSkgewogICAgICAgICAvKiBleHRyYWRhdGEgaXMgQW5uZXggQiwgYXNzdW1lIHRoZSBiaXRzdHJlYW0gaXMgdG9vIGFuZCBjb252ZXJ0IGl0ICovCiAgICAgICAgIGlmICh0cmstPmhpbnRfdHJhY2sgPj0gMCAmJiB0cmstPmhpbnRfdHJhY2sgPCBtb3YtPm5iX3N0cmVhbXMpIHsKQEAgLTQ0NjQsNyArNTI3MSw3IEBACiAgICAgICAgICAgICBzaXplID0gZmZfaGV2Y19hbm5leGIybXA0KHBiLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwgMCwgTlVMTCk7CiAgICAgICAgIH0KICNpZiBDT05GSUdfQUMzX1BBUlNFUgotICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzKSB7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0VBQzMpIHsKICAgICAgICAgc2l6ZSA9IGhhbmRsZV9lYWMzKG1vdiwgcGt0LCB0cmspOwogICAgICAgICBpZiAoc2l6ZSA8IDApCiAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKQEAgLTQ0NzMsOSArNTI4MCw5IEBACiAgICAgICAgIGF2aW9fd3JpdGUocGIsIHBrdC0+ZGF0YSwgc2l6ZSk7CiAjZW5kaWYKICAgICB9IGVsc2UgewotICAgICAgICBpZiAobW92LT5lbmNyeXB0aW9uX3NjaGVtZSA9PSBNT1ZfRU5DX0NFTkNfQUVTX0NUUikgewotICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCAmJiBlbmMtPmV4dHJhZGF0YV9zaXplID4gNCkgewotICAgICAgICAgICAgICAgIGludCBuYWxfc2l6ZV9sZW5ndGggPSAoZW5jLT5leHRyYWRhdGFbNF0gJiAweDMpICsgMTsKKyAgICAgICAgaWYgKHRyay0+Y2VuYy5hZXNfY3RyKSB7CisgICAgICAgICAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmIHBhci0+ZXh0cmFkYXRhX3NpemUgPiA0KSB7CisgICAgICAgICAgICAgICAgaW50IG5hbF9zaXplX2xlbmd0aCA9IChwYXItPmV4dHJhZGF0YVs0XSAmIDB4MykgKyAxOwogICAgICAgICAgICAgICAgIHJldCA9IGZmX21vdl9jZW5jX2F2Y193cml0ZV9uYWxfdW5pdHMocywgJnRyay0+Y2VuYywgbmFsX3NpemVfbGVuZ3RoLCBwYiwgcGt0LT5kYXRhLCBzaXplKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gZmZfbW92X2NlbmNfd3JpdGVfcGFja2V0KCZ0cmstPmNlbmMsIHBiLCBwa3QtPmRhdGEsIHNpemUpOwpAQCAtNDQ4OSw4ICs1Mjk2LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICgoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ETlhIRCB8fAotICAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpICYmICF0cmstPnZvc19sZW4pIHsKKyAgICBpZiAoKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRE5YSEQgfHwKKyAgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSAmJiAhdHJrLT52b3NfbGVuKSB7CiAgICAgICAgIC8qIGNvcHkgZnJhbWUgdG8gY3JlYXRlIG5lZWRlZCBhdG9tcyAqLwogICAgICAgICB0cmstPnZvc19sZW4gID0gc2l6ZTsKICAgICAgICAgdHJrLT52b3NfZGF0YSA9IGF2X21hbGxvYyhzaXplKTsKQEAgLTQ1MjcsNyArNTMzNCw4IEBACiAgICAgICAgICAgICAvKiBXZSBhbHNvIG1heSBoYXZlIHdyaXR0ZW4gdGhlIHB0cyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZHVyYXRpb24KICAgICAgICAgICAgICAqIGluIHNpZHgvdGZyZi90ZnhkIHRhZ3M7IG1ha2Ugc3VyZSB0aGUgc2lkeCBwdHMgYW5kIGR1cmF0aW9uIG1hdGNoIHVwIHdpdGgKICAgICAgICAgICAgICAqIHRoZSBuZXh0IGZyYWdtZW50LiBUaGlzIG1lYW5zIHRoZSBjdHMgb2YgdGhlIGZpcnN0IHNhbXBsZSBtdXN0Ci0gICAgICAgICAgICAgKiBiZSB0aGUgc2FtZSBpbiBhbGwgZnJhZ21lbnRzLiAqLworICAgICAgICAgICAgICogYmUgdGhlIHNhbWUgaW4gYWxsIGZyYWdtZW50cywgdW5sZXNzIGVuZF9wdHMgd2FzIHVwZGF0ZWQgYnkKKyAgICAgICAgICAgICAqIHRoZSBwYWNrZXQgY2F1c2luZyB0aGUgZnJhZ21lbnQgdG8gYmUgd3JpdHRlbi4gKi8KICAgICAgICAgICAgIGlmICgobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0RBU0ggJiYgIShtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfR0xPQkFMX1NJRFgpKSB8fAogICAgICAgICAgICAgICAgIG1vdi0+bW9kZSA9PSBNT0RFX0lTTSkKICAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzICsgdHJrLT5lbmRfcHRzIC0gdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmR0czsKQEAgLTQ1OTQsMTAgKzU0MDIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmstPmNsdXN0ZXJbdHJrLT5lbnRyeV0uY3RzICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmR1cmF0aW9uKTsKIAotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSkgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSkgewogICAgICAgICBtb3ZfcGFyc2VfdmMxX2ZyYW1lKHBrdCwgdHJrKTsKICAgICB9IGVsc2UgaWYgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpIHsKLSAgICAgICAgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX01PViAmJiBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYKKyAgICAgICAgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX01PViAmJiBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gJiYKICAgICAgICAgICAgIHRyay0+ZW50cnkgPiAwKSB7IC8vIGZvcmNlIHN5bmMgc2FtcGxlIGZvciB0aGUgZmlyc3Qga2V5IGZyYW1lCiAgICAgICAgICAgICBtb3ZfcGFyc2VfbXBlZzJfZnJhbWUocGt0LCAmdHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmZsYWdzKTsKICAgICAgICAgICAgIGlmICh0cmstPmNsdXN0ZXJbdHJrLT5lbnRyeV0uZmxhZ3MgJiBNT1ZfUEFSVElBTF9TWU5DX1NBTVBMRSkKQEAgLTQ2MDgsNiArNTQxNiwxMCBAQAogICAgICAgICBpZiAodHJrLT5jbHVzdGVyW3Ryay0+ZW50cnldLmZsYWdzICYgTU9WX1NZTkNfU0FNUExFKQogICAgICAgICAgICAgdHJrLT5oYXNfa2V5ZnJhbWVzKys7CiAgICAgfQorICAgIGlmIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfRElTUE9TQUJMRSkgeworICAgICAgICB0cmstPmNsdXN0ZXJbdHJrLT5lbnRyeV0uZmxhZ3MgfD0gTU9WX0RJU1BPU0FCTEVfU0FNUExFOworICAgICAgICB0cmstPmhhc19kaXNwb3NhYmxlKys7CisgICAgfQogICAgIHRyay0+ZW50cnkrKzsKICAgICB0cmstPnNhbXBsZV9jb3VudCArPSBzYW1wbGVzX2luX2NodW5rOwogICAgIG1vdi0+bWRhdF9zaXplICAgICs9IHNpemU7CkBAIC00NjI3LDEwICs1NDM5LDE0IEBACiB7CiAgICAgICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKICAgICAgICAgTU9WVHJhY2sgKnRyayA9ICZtb3YtPnRyYWNrc1twa3QtPnN0cmVhbV9pbmRleF07Ci0gICAgICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSB0cmstPmVuYzsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHRyay0+cGFyOwogICAgICAgICBpbnQ2NF90IGZyYWdfZHVyYXRpb24gPSAwOwogICAgICAgICBpbnQgc2l6ZSA9IHBrdC0+c2l6ZTsKIAorICAgICAgICBpbnQgcmV0ID0gY2hlY2tfcGt0KHMsIHBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKwogICAgICAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdfRElTQ09OVCkgewogICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQpAQCAtNDYzOCw2ICs1NDU0LDMwIEBACiAgICAgICAgICAgICBtb3YtPmZsYWdzICY9IH5GRl9NT1ZfRkxBR19GUkFHX0RJU0NPTlQ7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX05FR0FUSVZFX0NUU19PRkZTRVRTKSB7CisgICAgICAgICAgICBpZiAodHJrLT5kdHNfc2hpZnQgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgdHJrLT5kdHNfc2hpZnQgPSBwa3QtPnB0cyAtIHBrdC0+ZHRzOworICAgICAgICAgICAgcGt0LT5kdHMgKz0gdHJrLT5kdHNfc2hpZnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QNEFMUyB8fAorICAgICAgICAgICAgdHJrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyB8fAorICAgICAgICAgICAgdHJrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMQUMpIHsKKyAgICAgICAgICAgIGludCBzaWRlX3NpemUgPSAwOworICAgICAgICAgICAgdWludDhfdCAqc2lkZSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwgQVZfUEtUX0RBVEFfTkVXX0VYVFJBREFUQSwgJnNpZGVfc2l6ZSk7CisgICAgICAgICAgICBpZiAoc2lkZSAmJiBzaWRlX3NpemUgPiAwICYmIChzaWRlX3NpemUgIT0gcGFyLT5leHRyYWRhdGFfc2l6ZSB8fCBtZW1jbXAoc2lkZSwgcGFyLT5leHRyYWRhdGEsIHNpZGVfc2l6ZSkpKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqbmV3ZXh0cmEgPSBhdl9tYWxsb2N6KHNpZGVfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgIGlmICghbmV3ZXh0cmEpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgYXZfZnJlZShwYXItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGEgPSBuZXdleHRyYTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocGFyLT5leHRyYWRhdGEsIHNpZGUsIHNpZGVfc2l6ZSk7CisgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IHNpZGVfc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAoIXBrdC0+c2l6ZSkgLy8gRmx1c2ggcGFja2V0CisgICAgICAgICAgICAgICAgICAgIG1vdi0+bmVlZF9yZXdyaXRlX2V4dHJhZGF0YSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpZiAoIXBrdC0+c2l6ZSkgewogICAgICAgICAgICAgaWYgKHRyay0+c3RhcnRfZHRzID09IEFWX05PUFRTX1ZBTFVFICYmIHRyay0+ZnJhZ19kaXNjb250KSB7CiAgICAgICAgICAgICAgICAgdHJrLT5zdGFydF9kdHMgPSBwa3QtPmR0czsKQEAgLTQ2NTgsMTUgKzU0OTgsMjAgQEAKICAgICAgICAgICAgICBmcmFnX2R1cmF0aW9uID49IG1vdi0+bWF4X2ZyYWdtZW50X2R1cmF0aW9uKSB8fAogICAgICAgICAgICAgIChtb3YtPm1heF9mcmFnbWVudF9zaXplICYmIG1vdi0+bWRhdF9zaXplICsgc2l6ZSA+PSBtb3YtPm1heF9mcmFnbWVudF9zaXplKSB8fAogICAgICAgICAgICAgIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR19LRVlGUkFNRSAmJgotICAgICAgICAgICAgICBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCi0gICAgICAgICAgICAgIHRyay0+ZW50cnkgJiYgcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkpIHsKKyAgICAgICAgICAgICAgcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgICB0cmstPmVudHJ5ICYmIHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpIHx8CisgICAgICAgICAgICAgIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRlJBR19FVkVSWV9GUkFNRSkpIHsKICAgICAgICAgICAgIGlmIChmcmFnX2R1cmF0aW9uID49IG1vdi0+bWluX2ZyYWdtZW50X2R1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBkdXJhdGlvbiBvZiB0aGlzIHRyYWNrIHRvIGxpbmUgdXAgd2l0aCB0aGUgbmV4dAogICAgICAgICAgICAgICAgIC8vIHNhbXBsZSBpbiB0aGlzIHRyYWNrLiBUaGlzIGF2b2lkcyByZWx5aW5nIG9uIEFWUGFja2V0CiAgICAgICAgICAgICAgICAgLy8gZHVyYXRpb24sIGJ1dCBvbmx5IGhlbHBzIGZvciB0aGlzIHBhcnRpY3VsYXIgdHJhY2ssIG5vdAogICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgb3RoZXIgb25lcyB0aGF0IGFyZSBmbHVzaGVkIGF0IHRoZSBzYW1lIHRpbWUuCiAgICAgICAgICAgICAgICAgdHJrLT50cmFja19kdXJhdGlvbiA9IHBrdC0+ZHRzIC0gdHJrLT5zdGFydF9kdHM7Ci0gICAgICAgICAgICAgICAgdHJrLT5lbmRfcHRzID0gcGt0LT5wdHM7CisgICAgICAgICAgICAgICAgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICB0cmstPmVuZF9wdHMgPSBwa3QtPnB0czsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHRyay0+ZW5kX3B0cyA9IHBrdC0+ZHRzOworICAgICAgICAgICAgICAgIHRyay0+ZW5kX3JlbGlhYmxlID0gMTsKICAgICAgICAgICAgICAgICBtb3ZfYXV0b19mbHVzaF9mcmFnbWVudChzLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDY5NywxMiArNTU0MiwzMiBAQAogCiBzdGF0aWMgaW50IG1vdl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQogeworICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKKyAgICBNT1ZUcmFjayAqdHJrOworCiAgICAgaWYgKCFwa3QpIHsKICAgICAgICAgbW92X2ZsdXNoX2ZyYWdtZW50KHMsIDEpOwogICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICB0cmsgPSAmbW92LT50cmFja3NbcGt0LT5zdHJlYW1faW5kZXhdOworCisgICAgaWYgKGlzX2NvdmVyX2ltYWdlKHRyay0+c3QpKSB7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgaWYgKHRyay0+c3QtPm5iX2ZyYW1lcyA+PSAxKSB7CisgICAgICAgICAgICBpZiAodHJrLT5zdC0+bmJfZnJhbWVzID09IDEpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiR290IG1vcmUgdGhhbiBvbmUgcGljdHVyZSBpbiBzdHJlYW0gJWQsIgorICAgICAgICAgICAgICAgICAgICAgICAiIGlnbm9yaW5nLlxuIiwgcGt0LT5zdHJlYW1faW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHJldCA9IGF2X3BhY2tldF9yZWYoJnRyay0+Y292ZXJfaW1hZ2UsIHBrdCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaW50IGk7Ci0gICAgICAgIE1PVk11eENvbnRleHQgKm1vdiA9IHMtPnByaXZfZGF0YTsKIAogICAgICAgICBpZiAoIXBrdC0+c2l6ZSkKICAgICAgICAgICAgIHJldHVybiBtb3Zfd3JpdGVfc2luZ2xlX3BhY2tldChzLCBwa3QpOyAvKiBQYXNzdGhyb3VnaC4gKi8KQEAgLTQ3MzAsNyArNTU5NSw3IEBACiAgICAgICAgICAgICBNT1ZUcmFjayAqdHJrID0gJm1vdi0+dHJhY2tzW2ldOwogICAgICAgICAgICAgaW50IHJldDsKIAotICAgICAgICAgICAgaWYgKHRyay0+ZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NT1ZfVEVYVCAmJgorICAgICAgICAgICAgaWYgKHRyay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NT1ZfVEVYVCAmJgogICAgICAgICAgICAgICAgIHRyay0+dHJhY2tfZHVyYXRpb24gPCBwa3QtPmR0cyAmJgogICAgICAgICAgICAgICAgICh0cmstPmVudHJ5ID09IDAgfHwgIXRyay0+bGFzdF9zYW1wbGVfaXNfc3VidGl0bGVfZW5kKSkgewogICAgICAgICAgICAgICAgIHJldCA9IG1vdl93cml0ZV9zdWJ0aXRsZV9lbmRfcGFja2V0KHMsIGksIHRyay0+dHJhY2tfZHVyYXRpb24pOwpAQCAtNDczOSw2ICs1NjA0LDM4IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBpZiAodHJrLT5tb2RlID09IE1PREVfTU9WICYmIHRyay0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgQVZQYWNrZXQgKm9wa3QgPSBwa3Q7CisgICAgICAgICAgICBpbnQgcmVzaHVmZmxlX3JldCwgcmV0OworICAgICAgICAgICAgaWYgKHRyay0+aXNfdW5hbGlnbmVkX3F0X3JnYikgeworICAgICAgICAgICAgICAgIGludDY0X3QgYnBjID0gdHJrLT5wYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAhPSAxNSA/IHRyay0+cGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgOiAxNjsKKyAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfc3RyaWRlID0gKCh0cmstPnBhci0+d2lkdGggKiBicGMgKyAxNSkgPj4gNCkqMjsKKyAgICAgICAgICAgICAgICByZXNodWZmbGVfcmV0ID0gZmZfcmVzaHVmZmxlX3Jhd19yZ2IocywgJnBrdCwgdHJrLT5wYXIsIGV4cGVjdGVkX3N0cmlkZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc2h1ZmZsZV9yZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzaHVmZmxlX3JldDsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHJlc2h1ZmZsZV9yZXQgPSAwOworICAgICAgICAgICAgaWYgKHRyay0+cGFyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9QQUw4ICYmICF0cmstPnBhbF9kb25lKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfZ2V0X3BhY2tldF9wYWxldHRlKHMsIG9wa3QsIHJlc2h1ZmZsZV9yZXQsIHRyay0+cGFsZXR0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICBpZiAocmV0KQorICAgICAgICAgICAgICAgICAgICB0cmstPnBhbF9kb25lKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRyay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTyAmJgorICAgICAgICAgICAgICAgICAgICAgICAodHJrLT5wYXItPmZvcm1hdCA9PSBBVl9QSVhfRk1UX0dSQVk4IHx8CisgICAgICAgICAgICAgICAgICAgICAgIHRyay0+cGFyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0spKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBrdC0+c2l6ZTsgaSsrKQorICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGFbaV0gPSB+cGt0LT5kYXRhW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc2h1ZmZsZV9yZXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBtb3Zfd3JpdGVfc2luZ2xlX3BhY2tldChzLCBwa3QpOworZmFpbDoKKyAgICAgICAgICAgICAgICBpZiAocmVzaHVmZmxlX3JldCkKKyAgICAgICAgICAgICAgICAgICAgYXZfcGFja2V0X2ZyZWUoJnBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIHJldHVybiBtb3Zfd3JpdGVfc2luZ2xlX3BhY2tldChzLCBwa3QpOwogICAgIH0KIH0KQEAgLTQ3NTcsMTYgKzU2NTQsMTYgQEAKICAgICB0cmFjay0+bW9kZSA9IG1vdi0+bW9kZTsKICAgICB0cmFjay0+dGFnID0gTUtUQUcoJ3QnLCdlJywneCcsJ3QnKTsKICAgICB0cmFjay0+dGltZXNjYWxlID0gTU9WX1RJTUVTQ0FMRTsKLSAgICB0cmFjay0+ZW5jID0gYXZjb2RlY19hbGxvY19jb250ZXh0MyhOVUxMKTsKLSAgICBpZiAoIXRyYWNrLT5lbmMpCisgICAgdHJhY2stPnBhciA9IGF2Y29kZWNfcGFyYW1ldGVyc19hbGxvYygpOworICAgIGlmICghdHJhY2stPnBhcikKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB0cmFjay0+ZW5jLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CiAjaWYgMAogICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJlcXVpcmVkIHRvIG1ha2UgUVQgcmVjb2duaXplIHRoZSBjaGFwdGVyIHRyYWNrCiAgICAgdWludDhfdCBjaGFwdGVyX3Byb3BlcnRpZXNbNDNdID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCB9OwotICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEodHJhY2stPmVuYywgc2l6ZW9mKGNoYXB0ZXJfcHJvcGVydGllcykpKQorICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEodHJhY2stPnBhciwgc2l6ZW9mKGNoYXB0ZXJfcHJvcGVydGllcykpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIG1lbWNweSh0cmFjay0+ZW5jLT5leHRyYWRhdGEsIGNoYXB0ZXJfcHJvcGVydGllcywgc2l6ZW9mKGNoYXB0ZXJfcHJvcGVydGllcykpOworICAgIG1lbWNweSh0cmFjay0+cGFyLT5leHRyYWRhdGEsIGNoYXB0ZXJfcHJvcGVydGllcywgc2l6ZW9mKGNoYXB0ZXJfcHJvcGVydGllcykpOwogI2Vsc2UKICAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJnBiKSA+PSAwKSB7CiAgICAgICAgIGludCBzaXplOwpAQCAtNDgwNSw4ICs1NzAyLDggQEAKICAgICAgICAgYXZpb193OChwYiwgMHgwMCk7ICAgLy8gZm9udCBuYW1lIGxlbmd0aAogCiAgICAgICAgIGlmICgoc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZihwYiwgJmJ1ZikpID4gMCkgewotICAgICAgICAgICAgdHJhY2stPmVuYy0+ZXh0cmFkYXRhID0gYnVmOwotICAgICAgICAgICAgdHJhY2stPmVuYy0+ZXh0cmFkYXRhX3NpemUgPSBzaXplOworICAgICAgICAgICAgdHJhY2stPnBhci0+ZXh0cmFkYXRhID0gYnVmOworICAgICAgICAgICAgdHJhY2stPnBhci0+ZXh0cmFkYXRhX3NpemUgPSBzaXplOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXZfZnJlZXAoJmJ1Zik7CiAgICAgICAgIH0KQEAgLTQ4MjIsNyArNTcxOSw3IEBACiAgICAgICAgIHBrdC5kdXJhdGlvbiA9IGVuZCAtIHBrdC5kdHM7CiAKICAgICAgICAgaWYgKCh0ID0gYXZfZGljdF9nZXQoYy0+bWV0YWRhdGEsICJ0aXRsZSIsIE5VTEwsIDApKSkgewotICAgICAgICAgICAgY29uc3QgY2hhciBlbmNkWzEyXSA9IHsKKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGVuY2RbMTJdID0gewogICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsCiAgICAgICAgICAgICAgICAgJ2UnLCAgJ24nLCAgJ2MnLCAgJ2QnLAogICAgICAgICAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAgfTsKQEAgLTQ4NDIsMjEgKzU3MzksMjUgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBtb3ZfY3JlYXRlX3RpbWVjb2RlX3RyYWNrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGluZGV4LCBpbnQgc3JjX2luZGV4LCBjb25zdCBjaGFyICp0Y3N0cikKKworc3RhdGljIGludCBtb3ZfY2hlY2tfdGltZWNvZGVfdHJhY2soQVZGb3JtYXRDb250ZXh0ICpzLCBBVlRpbWVjb2RlICp0YywgaW50IHNyY19pbmRleCwgY29uc3QgY2hhciAqdGNzdHIpCit7CisgICAgaW50IHJldDsKKworICAgIC8qIGNvbXB1dGUgdGhlIGZyYW1lIG51bWJlciAqLworICAgIHJldCA9IGF2X3RpbWVjb2RlX2luaXRfZnJvbV9zdHJpbmcodGMsIGZpbmRfZnBzKHMsICBzLT5zdHJlYW1zW3NyY19pbmRleF0pLCB0Y3N0ciwgcyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtb3ZfY3JlYXRlX3RpbWVjb2RlX3RyYWNrKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGluZGV4LCBpbnQgc3JjX2luZGV4LCBBVlRpbWVjb2RlIHRjKQogewogICAgIGludCByZXQ7CiAgICAgTU9WTXV4Q29udGV4dCAqbW92ICA9IHMtPnByaXZfZGF0YTsKICAgICBNT1ZUcmFjayAqdHJhY2sgICAgID0gJm1vdi0+dHJhY2tzW2luZGV4XTsKICAgICBBVlN0cmVhbSAqc3JjX3N0ICAgID0gcy0+c3RyZWFtc1tzcmNfaW5kZXhdOwotICAgIEFWVGltZWNvZGUgdGM7CiAgICAgQVZQYWNrZXQgcGt0ICAgID0gey5zdHJlYW1faW5kZXggPSBpbmRleCwgLmZsYWdzID0gQVZfUEtUX0ZMQUdfS0VZLCAuc2l6ZSA9IDR9OwogICAgIEFWUmF0aW9uYWwgcmF0ZSA9IGZpbmRfZnBzKHMsIHNyY19zdCk7CiAKLSAgICAvKiBjb21wdXRlIHRoZSBmcmFtZSBudW1iZXIgKi8KLSAgICByZXQgPSBhdl90aW1lY29kZV9pbml0X2Zyb21fc3RyaW5nKCZ0YywgcmF0ZSwgdGNzdHIsIHMpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCiAgICAgLyogdG1jZCB0cmFjayBiYXNlZCBvbiB2aWRlbyBzdHJlYW0gKi8KICAgICB0cmFjay0+bW9kZSAgICAgID0gbW92LT5tb2RlOwogICAgIHRyYWNrLT50YWcgICAgICAgPSBNS1RBRygndCcsJ20nLCdjJywnZCcpOwpAQCAtNDg2OSwxMiArNTc3MCwxMiBAQAogICAgIHRyYWNrLT5zdCA9IHNyY19zdDsKIAogICAgIC8qIGVuY29kZSBjb250ZXh0OiB0bWNkIGRhdGEgc3RyZWFtICovCi0gICAgdHJhY2stPmVuYyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCk7Ci0gICAgaWYgKCF0cmFjay0+ZW5jKQorICAgIHRyYWNrLT5wYXIgPSBhdmNvZGVjX3BhcmFtZXRlcnNfYWxsb2MoKTsKKyAgICBpZiAoIXRyYWNrLT5wYXIpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgdHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOwotICAgIHRyYWNrLT5lbmMtPmNvZGVjX3RhZyAgPSB0cmFjay0+dGFnOwotICAgIHRyYWNrLT5lbmMtPnRpbWVfYmFzZSAgPSBhdl9pbnZfcShyYXRlKTsKKyAgICB0cmFjay0+cGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgdHJhY2stPnBhci0+Y29kZWNfdGFnICA9IHRyYWNrLT50YWc7CisgICAgdHJhY2stPnN0LT5hdmdfZnJhbWVfcmF0ZSA9IGF2X2ludl9xKHJhdGUpOwogCiAgICAgLyogdGhlIHRtY2QgdHJhY2sganVzdCBjb250YWlucyBvbmUgcGFja2V0IHdpdGggdGhlIGZyYW1lIG51bWJlciAqLwogICAgIHBrdC5kYXRhID0gYXZfbWFsbG9jKHBrdC5zaXplKTsKQEAgLTQ5MTIsMTUgKzU4MTMsMTYgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CiAKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA8PSBBVk1FRElBX1RZUEVfVU5LTk9XTiB8fAotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID49IEFWTUVESUFfVFlQRV9OQikKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA8PSBBVk1FRElBX1RZUEVfVU5LTk9XTiB8fAorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID49IEFWTUVESUFfVFlQRV9OQiB8fAorICAgICAgICAgICAgaXNfY292ZXJfaW1hZ2Uoc3QpKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgaWYgKGZpcnN0W3N0LT5jb2RlYy0+Y29kZWNfdHlwZV0gPCAwKQotICAgICAgICAgICAgZmlyc3Rbc3QtPmNvZGVjLT5jb2RlY190eXBlXSA9IGk7CisgICAgICAgIGlmIChmaXJzdFtzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGVdIDwgMCkKKyAgICAgICAgICAgIGZpcnN0W3N0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZV0gPSBpOwogICAgICAgICBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fREVGQVVMVCkgewogICAgICAgICAgICAgbW92LT50cmFja3NbaV0uZmxhZ3MgfD0gTU9WX1RSQUNLX0VOQUJMRUQ7Ci0gICAgICAgICAgICBlbmFibGVkW3N0LT5jb2RlYy0+Y29kZWNfdHlwZV0rKzsKKyAgICAgICAgICAgIGVuYWJsZWRbc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlXSsrOwogICAgICAgICB9CiAgICAgfQogCkBAIC00OTQ0LDE4ICs1ODQ2LDE5IEBACiAgICAgaW50IGk7CiAKICAgICBpZiAobW92LT5jaGFwdGVyX3RyYWNrKSB7Ci0gICAgICAgIGlmIChtb3YtPnRyYWNrc1ttb3YtPmNoYXB0ZXJfdHJhY2tdLmVuYykKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZtb3YtPnRyYWNrc1ttb3YtPmNoYXB0ZXJfdHJhY2tdLmVuYy0+ZXh0cmFkYXRhKTsKLSAgICAgICAgYXZfZnJlZXAoJm1vdi0+dHJhY2tzW21vdi0+Y2hhcHRlcl90cmFja10uZW5jKTsKKyAgICAgICAgaWYgKG1vdi0+dHJhY2tzW21vdi0+Y2hhcHRlcl90cmFja10ucGFyKQorICAgICAgICAgICAgYXZfZnJlZXAoJm1vdi0+dHJhY2tzW21vdi0+Y2hhcHRlcl90cmFja10ucGFyLT5leHRyYWRhdGEpOworICAgICAgICBhdl9mcmVlcCgmbW92LT50cmFja3NbbW92LT5jaGFwdGVyX3RyYWNrXS5wYXIpOwogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpZiAobW92LT50cmFja3NbaV0udGFnID09IE1LVEFHKCdyJywndCcsJ3AnLCcgJykpCiAgICAgICAgICAgICBmZl9tb3ZfY2xvc2VfaGludGluZygmbW92LT50cmFja3NbaV0pOwogICAgICAgICBlbHNlIGlmIChtb3YtPnRyYWNrc1tpXS50YWcgPT0gTUtUQUcoJ3QnLCdtJywnYycsJ2QnKSAmJiBtb3YtPm5iX21ldGFfdG1jZCkKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZtb3YtPnRyYWNrc1tpXS5lbmMpOworICAgICAgICAgICAgYXZfZnJlZXAoJm1vdi0+dHJhY2tzW2ldLnBhcik7CiAgICAgICAgIGF2X2ZyZWVwKCZtb3YtPnRyYWNrc1tpXS5jbHVzdGVyKTsKICAgICAgICAgYXZfZnJlZXAoJm1vdi0+dHJhY2tzW2ldLmZyYWdfaW5mbyk7CisgICAgICAgIGF2X3BhY2tldF91bnJlZigmbW92LT50cmFja3NbaV0uY292ZXJfaW1hZ2UpOwogCiAgICAgICAgIGlmIChtb3YtPnRyYWNrc1tpXS52b3NfbGVuKQogICAgICAgICAgICAgYXZfZnJlZXAoJm1vdi0+dHJhY2tzW2ldLnZvc19kYXRhKTsKQEAgLTQ5ODgsNyArNTg5MSw3IEBACiAgICAgaW50IGksIHdpZHRoID0gNzIwLCBoZWlnaHQgPSA0ODA7CiAgICAgaW50IGhhdmVfcGFsZXR0ZSA9IDAsIGhhdmVfc2l6ZSA9IDA7CiAgICAgdWludDMyX3QgcGFsZXR0ZVsxNl07Ci0gICAgY2hhciAqY3VyID0gc3QtPmNvZGVjLT5leHRyYWRhdGE7CisgICAgY2hhciAqY3VyID0gc3QtPmNvZGVjcGFyLT5leHRyYWRhdGE7CiAKICAgICB3aGlsZSAoY3VyICYmICpjdXIpIHsKICAgICAgICAgaWYgKHN0cm5jbXAoInBhbGV0dGU6IiwgY3VyLCA4KSA9PSAwKSB7CkBAIC01MDI1LDE4ICs1OTI4LDE3IEBACiAgICAgICAgIH0KICAgICAgICAgdHJhY2stPnZvc19sZW4gPSAxNiAqIDQ7CiAgICAgfQotICAgIHN0LT5jb2RlYy0+d2lkdGggPSB3aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHRyYWNrLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IHdpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gdHJhY2stPmhlaWdodCA9IGhlaWdodDsKIAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG1vdl93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQorc3RhdGljIGludCBtb3ZfaW5pdChBVkZvcm1hdENvbnRleHQgKnMpCiB7Ci0gICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgTU9WTXV4Q29udGV4dCAqbW92ID0gcy0+cHJpdl9kYXRhOwotICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0LCAqZ2xvYmFsX3RjciA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAidGltZWNvZGUiLCBOVUxMLCAwKTsKLSAgICBpbnQgaSwgcmV0LCBoaW50X3RyYWNrID0gMCwgdG1jZF90cmFjayA9IDA7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmdsb2JhbF90Y3IgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCk7CisgICAgaW50IGksIHJldDsKIAogICAgIG1vdi0+ZmMgPSBzOwogCkBAIC01MDYxLDcgKzU5NjMsOCBAQAogICAgIGlmIChtb3YtPm1heF9mcmFnbWVudF9kdXJhdGlvbiB8fCBtb3YtPm1heF9mcmFnbWVudF9zaXplIHx8CiAgICAgICAgIG1vdi0+ZmxhZ3MgJiAoRkZfTU9WX0ZMQUdfRU1QVFlfTU9PViB8CiAgICAgICAgICAgICAgICAgICAgICAgRkZfTU9WX0ZMQUdfRlJBR19LRVlGUkFNRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgRkZfTU9WX0ZMQUdfRlJBR19DVVNUT00pKQorICAgICAgICAgICAgICAgICAgICAgIEZGX01PVl9GTEFHX0ZSQUdfQ1VTVE9NIHwKKyAgICAgICAgICAgICAgICAgICAgICBGRl9NT1ZfRkxBR19GUkFHX0VWRVJZX0ZSQU1FKSkKICAgICAgICAgbW92LT5mbGFncyB8PSBGRl9NT1ZfRkxBR19GUkFHTUVOVDsKIAogICAgIC8qIFNldCBvdGhlciBpbXBsaWNpdCBmbGFncyBpbW1lZGlhdGVseSAqLwpAQCAtNTA3Miw2ICs1OTc1LDExIEBACiAgICAgICAgIG1vdi0+ZmxhZ3MgfD0gRkZfTU9WX0ZMQUdfRlJBR01FTlQgfCBGRl9NT1ZfRkxBR19FTVBUWV9NT09WIHwKICAgICAgICAgICAgICAgICAgICAgICBGRl9NT1ZfRkxBR19ERUZBVUxUX0JBU0VfTU9PRjsKIAorICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfRU1QVFlfTU9PViAmJiBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQVVUT19CU0YpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiRW1wdHkgTU9PViBlbmFibGVkOyBkaXNhYmxpbmcgYXV0b21hdGljIGJpdHN0cmVhbSBmaWx0ZXJpbmdcbiIpOworICAgICAgICBzLT5mbGFncyAmPSB+QVZGTVRfRkxBR19BVVRPX0JTRjsKKyAgICB9CisKICAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZBU1RTVEFSVCkgewogICAgICAgICBtb3YtPnJlc2VydmVkX21vb3Zfc2l6ZSA9IC0xOwogICAgIH0KQEAgLTUxMTIsNDkgKzYwMjAsNDIgQEAKIAogICAgIC8qIE5vbi1zZWVrYWJsZSBvdXRwdXQgaXMgb2sgaWYgdXNpbmcgZnJhZ21lbnRhdGlvbi4gSWYgaXNtX2xvb2thaGVhZAogICAgICAqIGlzIGVuYWJsZWQsIHdlIGRvbid0IHN1cHBvcnQgbm9uLXNlZWthYmxlIG91dHB1dCBhdCBhbGwuICovCi0gICAgaWYgKCFzLT5wYi0+c2Vla2FibGUgJiYKKyAgICBpZiAoIShzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgJiYKICAgICAgICAgKCEobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZSQUdNRU5UKSB8fCBtb3YtPmlzbV9sb29rYWhlYWQpKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJtdXhlciBkb2VzIG5vdCBzdXBwb3J0IG5vbiBzZWVrYWJsZSBvdXRwdXRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAotICAgIGlmICghKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19ERUxBWV9NT09WKSkgewotICAgICAgICBpZiAoKHJldCA9IG1vdl93cml0ZV9pZGVudGlmaWNhdGlvbihwYiwgcykpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCiAgICAgbW92LT5uYl9zdHJlYW1zID0gcy0+bmJfc3RyZWFtczsKICAgICBpZiAobW92LT5tb2RlICYgKE1PREVfTVA0fE1PREVfTU9WfE1PREVfSVBPRCkgJiYgcy0+bmJfY2hhcHRlcnMpCiAgICAgICAgIG1vdi0+Y2hhcHRlcl90cmFjayA9IG1vdi0+bmJfc3RyZWFtcysrOwogCiAgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19SVFBfSElOVCkgewotICAgICAgICAvKiBBZGQgaGludCB0cmFja3MgZm9yIGVhY2ggYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSAqLwotICAgICAgICBoaW50X3RyYWNrID0gbW92LT5uYl9zdHJlYW1zOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBpZiAocnRwX2hpbnRpbmdfbmVlZGVkKHMtPnN0cmVhbXNbaV0pKQogICAgICAgICAgICAgICAgIG1vdi0+bmJfc3RyZWFtcysrOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX01PVikgewotICAgICAgICB0bWNkX3RyYWNrID0gbW92LT5uYl9zdHJlYW1zOwotCisgICAgaWYgKCAgIG1vdi0+d3JpdGVfdG1jZCA9PSAtMSAmJiAobW92LT5tb2RlID09IE1PREVfTU9WIHx8IG1vdi0+bW9kZSA9PSBNT0RFX01QNCkKKyAgICAgICAgfHwgbW92LT53cml0ZV90bWNkID09IDEpIHsKICAgICAgICAgLyogKzEgdG1jZCB0cmFjayBmb3IgZWFjaCB2aWRlbyBzdHJlYW0gd2l0aCBhIHRpbWVjb2RlICovCiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgotICAgICAgICAgICAgICAgIChnbG9iYWxfdGNyIHx8IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCkpKQotICAgICAgICAgICAgICAgIG1vdi0+bmJfbWV0YV90bWNkKys7CisgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdCA9IGdsb2JhbF90Y3I7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgICAgICAgICAgICAgICh0IHx8ICh0PWF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgInRpbWVjb2RlIiwgTlVMTCwgMCkpKSkgeworICAgICAgICAgICAgICAgIEFWVGltZWNvZGUgdGM7CisgICAgICAgICAgICAgICAgcmV0ID0gbW92X2NoZWNrX3RpbWVjb2RlX3RyYWNrKHMsICZ0YywgaSwgdC0+dmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgbW92LT5uYl9tZXRhX3RtY2QrKzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qIGNoZWNrIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB0bWNkIHRyYWNrIHRvIHJlbXV4ICovCiAgICAgICAgIGlmIChtb3YtPm5iX21ldGFfdG1jZCkgewogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCd0JywnbScsJ2MnLCdkJykpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ3QnLCdtJywnYycsJ2QnKSkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJZb3UgcmVxdWVzdGVkIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgdGltZWNvZGUgdHJhY2sgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvIHRpbWVjb2RlIG1ldGFkYXRhIGFyZSBub3cgaWdub3JlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgIG1vdi0+bmJfbWV0YV90bWNkID0gMDsKQEAgLTUxNzgsMjEgKzYwNzksMTggQEAKICAgICAgICAgICAgIGlmIChtb3YtPmVuY3J5cHRpb25fa2V5X2xlbiAhPSBBRVNfQ1RSX0tFWV9TSVpFKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZW5jcnlwdGlvbiBrZXkgbGVuICVkIGV4cGVjdGVkICVkXG4iLAogICAgICAgICAgICAgICAgICAgICBtb3YtPmVuY3J5cHRpb25fa2V5X2xlbiwgQUVTX0NUUl9LRVlfU0laRSk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1vdi0+ZW5jcnlwdGlvbl9raWRfbGVuICE9IENFTkNfS0lEX1NJWkUpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBlbmNyeXB0aW9uIGtpZCBsZW4gJWQgZXhwZWN0ZWQgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgIG1vdi0+ZW5jcnlwdGlvbl9raWRfbGVuLCBDRU5DX0tJRF9TSVpFKTsKLSAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGVuY3J5cHRpb24gc2NoZW1lICVzXG4iLAogICAgICAgICAgICAgICAgIG1vdi0+ZW5jcnlwdGlvbl9zY2hlbWVfc3RyKTsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MjAyLDcgKzYxMDAsNyBAQAogICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqbGFuZyA9IGF2X2RpY3RfZ2V0KHN0LT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgTlVMTCwwKTsKIAogICAgICAgICB0cmFjay0+c3QgID0gc3Q7Ci0gICAgICAgIHRyYWNrLT5lbmMgPSBzdC0+Y29kZWM7CisgICAgICAgIHRyYWNrLT5wYXIgPSBzdC0+Y29kZWNwYXI7CiAgICAgICAgIHRyYWNrLT5sYW5ndWFnZSA9IGZmX21vdl9pc282MzlfdG9fbGFuZyhsYW5nP2xhbmctPnZhbHVlOiJ1bmQiLCBtb3YtPm1vZGUhPU1PREVfTU9WKTsKICAgICAgICAgaWYgKHRyYWNrLT5sYW5ndWFnZSA8IDApCiAgICAgICAgICAgICB0cmFjay0+bGFuZ3VhZ2UgPSAwOwpAQCAtNTIxMSw5ICs2MTA5LDggQEAKICAgICAgICAgaWYgKCF0cmFjay0+dGFnKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGZpbmQgdGFnIGZvciBjb2RlYyAlcyBpbiBzdHJlYW0gIyVkLCAiCiAgICAgICAgICAgICAgICAgICAgImNvZGVjIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIGNvbnRhaW5lclxuIiwKLSAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlYy0+Y29kZWNfaWQpLCBpKTsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSwgaSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAgICAgICAgIC8qIElmIGhpbnRpbmcgb2YgdGhpcyB0cmFjayBpcyBlbmFibGVkIGJ5IGEgbGF0ZXIgaGludCB0cmFjaywKICAgICAgICAgICogdGhpcyBpcyB1cGRhdGVkLiAqLwpAQCAtNTIyMSwxNCArNjExOCwxNCBAQAogICAgICAgICB0cmFjay0+c3RhcnRfZHRzICA9IEFWX05PUFRTX1ZBTFVFOwogICAgICAgICB0cmFjay0+c3RhcnRfY3RzICA9IEFWX05PUFRTX1ZBTFVFOwogICAgICAgICB0cmFjay0+ZW5kX3B0cyAgICA9IEFWX05PUFRTX1ZBTFVFOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICB0cmFjay0+ZHRzX3NoaWZ0ICA9IEFWX05PUFRTX1ZBTFVFOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewogICAgICAgICAgICAgaWYgKHRyYWNrLT50YWcgPT0gTUtUQUcoJ20nLCd4JywnMycsJ3AnKSB8fCB0cmFjay0+dGFnID09IE1LVEFHKCdtJywneCcsJzMnLCduJykgfHwKICAgICAgICAgICAgICAgICB0cmFjay0+dGFnID09IE1LVEFHKCdtJywneCcsJzQnLCdwJykgfHwgdHJhY2stPnRhZyA9PSBNS1RBRygnbScsJ3gnLCc0JywnbicpIHx8CiAgICAgICAgICAgICAgICAgdHJhY2stPnRhZyA9PSBNS1RBRygnbScsJ3gnLCc1JywncCcpIHx8IHRyYWNrLT50YWcgPT0gTUtUQUcoJ20nLCd4JywnNScsJ24nKSkgewotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPndpZHRoICE9IDcyMCB8fCAoc3QtPmNvZGVjLT5oZWlnaHQgIT0gNjA4ICYmIHN0LT5jb2RlYy0+aGVpZ2h0ICE9IDUxMikpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT53aWR0aCAhPSA3MjAgfHwgKHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICE9IDYwOCAmJiBzdC0+Y29kZWNwYXItPmhlaWdodCAhPSA1MTIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJELTEwL0lNWCBtdXN0IHVzZSA3MjB4NjA4IG9yIDcyMHg1MTIgdmlkZW8gcmVzb2x1dGlvblxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHJhY2stPmhlaWdodCA9IHRyYWNrLT50YWcgPj4gMjQgPT0gJ24nID8gNDg2IDogNTc2OwogICAgICAgICAgICAgfQpAQCAtNTIzOSw2MCArNjEzNiwxMDAgQEAKICAgICAgICAgICAgICAgICB3aGlsZSh0cmFjay0+dGltZXNjYWxlIDwgMTAwMDApCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgKj0gMjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPndpZHRoID4gNjU1MzUgfHwgc3QtPmNvZGVjLT5oZWlnaHQgPiA2NTUzNSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJSZXNvbHV0aW9uICVkeCVkIHRvbyBsYXJnZSBmb3IgbW92L21wNFxuIiwgc3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHQpOwotICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+d2lkdGggPiA2NTUzNSB8fCBzdC0+Y29kZWNwYXItPmhlaWdodCA+IDY1NTM1KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJlc29sdXRpb24gJWR4JWQgdG9vIGxhcmdlIGZvciBtb3YvbXA0XG4iLCBzdC0+Y29kZWNwYXItPndpZHRoLCBzdC0+Y29kZWNwYXItPmhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PViAmJiB0cmFjay0+dGltZXNjYWxlID4gMTAwMDAwKQogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkcgY29kZWMgdGltZWJhc2UgaXMgdmVyeSBoaWdoLiBJZiBkdXJhdGlvbiBpcyB0b28gbG9uZyxcbiIKICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgbWF5IG5vdCBiZSBwbGF5YWJsZSBieSBxdWlja3RpbWUuIFNwZWNpZnkgYSBzaG9ydGVyIHRpbWViYXNlXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICJvciBjaG9vc2UgZGlmZmVyZW50IGNvbnRhaW5lci5cbiIpOwotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmZyYW1lX3NpemUgJiYgIWF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCkpIHsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bW9kZSA9PSBNT0RFX01PViAmJgorICAgICAgICAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPICYmCisgICAgICAgICAgICAgICAgdHJhY2stPnRhZyA9PSBNS1RBRygncicsJ2EnLCd3JywnICcpKSB7CisgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQgPSB0cmFjay0+cGFyLT5mb3JtYXQ7CisgICAgICAgICAgICAgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FICYmIHRyYWNrLT5wYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxKQorICAgICAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9NT05PV0hJVEU7CisgICAgICAgICAgICAgICAgdHJhY2stPmlzX3VuYWxpZ25lZF9xdF9yZ2IgPQorICAgICAgICAgICAgICAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjI0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMjQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfR1JBWTggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA5KSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tb2RlICE9IE1PREVfTVA0KSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJWUDkgb25seSBzdXBwb3J0ZWQgaW4gTVA0LlxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BVjEpIHsKKyAgICAgICAgICAgICAgICAvKiBzcGVjIGlzIG5vdCBmaW5pc2hlZCwgc28gZm9yYmlkIGZvciBub3cgKi8KKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQVYxIG11eGluZyBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4KSB7CisgICAgICAgICAgICAgICAgLyogYWx0cmVmIGZyYW1lcyBoYW5kbGluZyBpcyBub3QgZGVmaW5lZCBpbiB0aGUgc3BlYyBhcyBvZiB2ZXJzaW9uIHYxLjAsCisgICAgICAgICAgICAgICAgICogc28ganVzdCBmb3JiaWQgbXV4aW5nIFZQOCBzdHJlYW1zIGFsdG9nZXRoZXIgdW50aWwgYSBuZXcgdmVyc2lvbiBkb2VzICovCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlZQOCBtdXhpbmcgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZnJhbWVfc2l6ZSAmJiAhYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInRyYWNrICVkOiBjb2RlYyBmcmFtZSBzaXplIGlzIG5vdCBzZXRcbiIsIGkpOwogICAgICAgICAgICAgICAgIHRyYWNrLT5hdWRpb192YnIgPSAxOwotICAgICAgICAgICAgfWVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fTVMgfHwKLSAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBViB8fAotICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9JTEJDKXsKLSAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pIHsKKyAgICAgICAgICAgIH1lbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX01TIHx8CisgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYgfHwKKyAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSUxCQyl7CisgICAgICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0cmFjayAlZDogY29kZWMgYmxvY2sgYWxpZ24gaXMgbm90IHNldCBmb3IgYWRwY21cbiIsIGkpOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVfc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247Ci0gICAgICAgICAgICB9ZWxzZSBpZiAoc3QtPmNvZGVjLT5mcmFtZV9zaXplID4gMSl7IC8qIGFzc3VtZSBjb21wcmVzc2VkIGF1ZGlvICovCisgICAgICAgICAgICAgICAgdHJhY2stPnNhbXBsZV9zaXplID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbjsKKyAgICAgICAgICAgIH1lbHNlIGlmIChzdC0+Y29kZWNwYXItPmZyYW1lX3NpemUgPiAxKXsgLyogYXNzdW1lIGNvbXByZXNzZWQgYXVkaW8gKi8KICAgICAgICAgICAgICAgICB0cmFjay0+YXVkaW9fdmJyID0gMTsKICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVfc2l6ZSA9IChhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpID4+IDMpICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICB0cmFjay0+c2FtcGxlX3NpemUgPSAoYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSA+PiAzKSAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9JTEJDIHx8Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUVQpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0lMQkMgfHwKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9RVCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5hdWRpb192YnIgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRyYWNrLT5tb2RlICE9IE1PREVfTU9WICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPmVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzICYmIHRyYWNrLT50aW1lc2NhbGUgPCAxNjAwMCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMyAmJiB0cmFjay0+dGltZXNjYWxlIDwgMTYwMDApIHsKICAgICAgICAgICAgICAgICBpZiAocy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID49IEZGX0NPTVBMSUFOQ0VfTk9STUFMKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0cmFjayAlZDogbXV4aW5nIG1wMyBhdCAlZGh6IGlzIG5vdCBzdGFuZGFyZCwgdG8gbXV4IGFueXdheSBzZXQgc3RyaWN0IHRvIC0xXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgdHJhY2stPmVuYy0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpLCB0cmFjay0+cGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAidHJhY2sgJWQ6IG11eGluZyBtcDMgYXQgJWRoeiBpcyBub3Qgc3RhbmRhcmQgaW4gTVA0XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgdHJhY2stPmVuYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgdHJhY2stPnBhci0+c2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxBQyB8fAorICAgICAgICAgICAgICAgIHRyYWNrLT5wYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2stPm1vZGUgIT0gTU9ERV9NUDQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiVzIG9ubHkgc3VwcG9ydGVkIGluIE1QNC5cbiIsIGF2Y29kZWNfZ2V0X25hbWUodHJhY2stPnBhci0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW4gTVA0IHN1cHBvcnQgaXMgZXhwZXJpbWVudGFsLCBhZGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIictc3RyaWN0ICVkJyBpZiB5b3Ugd2FudCB0byB1c2UgaXQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZSh0cmFjay0+cGFyLT5jb2RlY19pZCksIEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhQRVJJTUVOVEFMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CiAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gc3QtPnRpbWVfYmFzZS5kZW47Ci0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKSB7CiAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gc3QtPnRpbWVfYmFzZS5kZW47CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gTU9WX1RJTUVTQ0FMRTsKICAgICAgICAgfQogICAgICAgICBpZiAoIXRyYWNrLT5oZWlnaHQpCi0gICAgICAgICAgICB0cmFjay0+aGVpZ2h0ID0gc3QtPmNvZGVjLT5oZWlnaHQ7CisgICAgICAgICAgICB0cmFjay0+aGVpZ2h0ID0gc3QtPmNvZGVjcGFyLT5oZWlnaHQ7CiAgICAgICAgIC8qIFRoZSBpc20gc3BlY2lmaWMgdGltZXNjYWxlIGlzbid0IG1hbmRhdG9yeSwgYnV0IGlzIGFzc3VtZWQgYnkKICAgICAgICAgICogc29tZSB0b29scywgc3VjaCBhcyBtcDRzcGxpdC4gKi8KICAgICAgICAgaWYgKG1vdi0+bW9kZSA9PSBNT0RFX0lTTSkKQEAgLTUzMDAsMzcgKzYyMzcsNTkgQEAKIAogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgdHJhY2stPnRpbWVzY2FsZSk7CiAKLSAgICAgICAgLyogY29weSBleHRyYWRhdGEgaWYgaXQgZXhpc3RzICovCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUpCi0gICAgICAgICAgICAgICAgbW92X2NyZWF0ZV9kdmRfc3ViX2RlY29kZXJfc3BlY2lmaWNfaW5mbyh0cmFjaywgc3QpOwotICAgICAgICAgICAgZWxzZSBpZiAoIVRBR19JU19BVkNJKHRyYWNrLT50YWcpICYmIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfRE5YSEQpIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+dm9zX2xlbiAgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplOwotICAgICAgICAgICAgICAgIHRyYWNrLT52b3NfZGF0YSA9IGF2X21hbGxvYyh0cmFjay0+dm9zX2xlbik7Ci0gICAgICAgICAgICAgICAgaWYgKCF0cmFjay0+dm9zX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkodHJhY2stPnZvc19kYXRhLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwgdHJhY2stPnZvc19sZW4pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KICAgICAgICAgaWYgKG1vdi0+ZW5jcnlwdGlvbl9zY2hlbWUgPT0gTU9WX0VOQ19DRU5DX0FFU19DVFIpIHsKICAgICAgICAgICAgIHJldCA9IGZmX21vdl9jZW5jX2luaXQoJnRyYWNrLT5jZW5jLCBtb3YtPmVuY3J5cHRpb25fa2V5LAotICAgICAgICAgICAgICAgIHRyYWNrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQsIHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFjay0+cGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0LCBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QpOworICAgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfQogCisgICAgZW5hYmxlX3RyYWNrcyhzKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtb3Zfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBNT1ZNdXhDb250ZXh0ICptb3YgPSBzLT5wcml2X2RhdGE7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnQsICpnbG9iYWxfdGNyID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJ0aW1lY29kZSIsIE5VTEwsIDApOworICAgIGludCBpLCByZXQsIGhpbnRfdHJhY2sgPSAwLCB0bWNkX3RyYWNrID0gMCwgbmJfdHJhY2tzID0gcy0+bmJfc3RyZWFtczsKKworICAgIGlmIChtb3YtPm1vZGUgJiAoTU9ERV9NUDR8TU9ERV9NT1Z8TU9ERV9JUE9EKSAmJiBzLT5uYl9jaGFwdGVycykKKyAgICAgICAgbmJfdHJhY2tzKys7CisKKyAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX1JUUF9ISU5UKSB7CisgICAgICAgIGhpbnRfdHJhY2sgPSBuYl90cmFja3M7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCisgICAgICAgICAgICBpZiAocnRwX2hpbnRpbmdfbmVlZGVkKHMtPnN0cmVhbXNbaV0pKQorICAgICAgICAgICAgICAgIG5iX3RyYWNrcysrOworICAgIH0KKworICAgIGlmIChtb3YtPm1vZGUgPT0gTU9ERV9NT1YgfHwgbW92LT5tb2RlID09IE1PREVfTVA0KQorICAgICAgICB0bWNkX3RyYWNrID0gbmJfdHJhY2tzOworCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpbnQgajsKICAgICAgICAgQVZTdHJlYW0gKnN0PSBzLT5zdHJlYW1zW2ldOwogICAgICAgICBNT1ZUcmFjayAqdHJhY2s9ICZtb3YtPnRyYWNrc1tpXTsKIAotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fAotICAgICAgICAgICAgdHJhY2stPmVuYy0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUX01PTk8pCisgICAgICAgIC8qIGNvcHkgZXh0cmFkYXRhIGlmIGl0IGV4aXN0cyAqLworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFKQorICAgICAgICAgICAgICAgIG1vdl9jcmVhdGVfZHZkX3N1Yl9kZWNvZGVyX3NwZWNpZmljX2luZm8odHJhY2ssIHN0KTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFUQUdfSVNfQVZDSSh0cmFjay0+dGFnKSAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0ROWEhEKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPnZvc19sZW4gID0gc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICB0cmFjay0+dm9zX2RhdGEgPSBhdl9tYWxsb2ModHJhY2stPnZvc19sZW4pOworICAgICAgICAgICAgICAgIGlmICghdHJhY2stPnZvc19kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lbWNweSh0cmFjay0+dm9zX2RhdGEsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCB0cmFjay0+dm9zX2xlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fAorICAgICAgICAgICAgdHJhY2stPnBhci0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUX01PTk8pCiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfc3RyZWFtczsgaisrKSB7CkBAIC01MzM5LDggKzYyOTgsOCBAQAogICAgICAgICAgICAgaWYgKGogPT0gaSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgaWYgKHN0ai0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPIHx8Ci0gICAgICAgICAgICAgICAgdHJhY2tqLT5lbmMtPmNoYW5uZWxfbGF5b3V0ICE9IEFWX0NIX0xBWU9VVF9NT05PIHx8CisgICAgICAgICAgICBpZiAoc3RqLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8gfHwKKyAgICAgICAgICAgICAgICB0cmFja2otPnBhci0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUX01PTk8gfHwKICAgICAgICAgICAgICAgICB0cmFja2otPmxhbmd1YWdlICE9IHRyYWNrLT5sYW5ndWFnZSB8fAogICAgICAgICAgICAgICAgIHRyYWNrai0+dGFnICE9IHRyYWNrLT50YWcKICAgICAgICAgICAgICkKQEAgLTUzNDksOCArNjMwOCwxMCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZW5hYmxlX3RyYWNrcyhzKTsKLQorICAgIGlmICghKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19ERUxBWV9NT09WKSkgeworICAgICAgICBpZiAoKHJldCA9IG1vdl93cml0ZV9pZGVudGlmaWNhdGlvbihwYiwgcykpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQogCiAgICAgaWYgKG1vdi0+cmVzZXJ2ZWRfbW9vdl9zaXplKXsKICAgICAgICAgbW92LT5yZXNlcnZlZF9oZWFkZXJfcG9zID0gYXZpb190ZWxsKHBiKTsKQEAgLTUzNjEsNyArNjMyMiw4IEBACiAgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19GUkFHTUVOVCkgewogICAgICAgICAvKiBJZiBubyBmcmFnbWVudGF0aW9uIG9wdGlvbnMgaGF2ZSBiZWVuIHNldCwgc2V0IGEgZGVmYXVsdC4gKi8KICAgICAgICAgaWYgKCEobW92LT5mbGFncyAmIChGRl9NT1ZfRkxBR19GUkFHX0tFWUZSQU1FIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRl9NT1ZfRkxBR19GUkFHX0NVU1RPTSkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfTU9WX0ZMQUdfRlJBR19DVVNUT00gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX01PVl9GTEFHX0ZSQUdfRVZFUllfRlJBTUUpKSAmJgogICAgICAgICAgICAgIW1vdi0+bWF4X2ZyYWdtZW50X2R1cmF0aW9uICYmICFtb3YtPm1heF9mcmFnbWVudF9zaXplKQogICAgICAgICAgICAgbW92LT5mbGFncyB8PSBGRl9NT1ZfRkxBR19GUkFHX0tFWUZSQU1FOwogICAgIH0gZWxzZSB7CkBAIC01Mzc2LDE2ICs2MzM4LDEzIEBACiAKICAgICBpZiAobW92LT5jaGFwdGVyX3RyYWNrKQogICAgICAgICBpZiAoKHJldCA9IG1vdl9jcmVhdGVfY2hhcHRlcl90cmFjayhzLCBtb3YtPmNoYXB0ZXJfdHJhY2spKSA8IDApCi0gICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfUlRQX0hJTlQpIHsKLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGludCB0cmFja3MgZm9yIGVhY2ggYXVkaW8gYW5kIHZpZGVvIHN0cmVhbSAqLwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gfHwKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAocnRwX2hpbnRpbmdfbmVlZGVkKHMtPnN0cmVhbXNbaV0pKSB7CiAgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBmZl9tb3ZfaW5pdF9oaW50aW5nKHMsIGhpbnRfdHJhY2ssIGkpKSA8IDApCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgaGludF90cmFjaysrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01Mzk3LDEzICs2MzU2LDE2IEBACiAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICAgICAgdCA9IGdsb2JhbF90Y3I7CiAKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgICAgIEFWVGltZWNvZGUgdGM7CiAgICAgICAgICAgICAgICAgaWYgKCF0KQogICAgICAgICAgICAgICAgICAgICB0ID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCAidGltZWNvZGUiLCBOVUxMLCAwKTsKICAgICAgICAgICAgICAgICBpZiAoIXQpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gbW92X2NyZWF0ZV90aW1lY29kZV90cmFjayhzLCB0bWNkX3RyYWNrLCBpLCB0LT52YWx1ZSkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAobW92X2NoZWNrX3RpbWVjb2RlX3RyYWNrKHMsICZ0YywgaSwgdC0+dmFsdWUpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBtb3ZfY3JlYXRlX3RpbWVjb2RlX3RyYWNrKHMsIHRtY2RfdHJhY2ssIGksIHRjKSkgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgIHRtY2RfdHJhY2srKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTQxMiw3ICs2Mzc0LDcgQEAKICAgICBhdmlvX2ZsdXNoKHBiKTsKIAogICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfSVNNTCkKLSAgICAgICAgbW92X3dyaXRlX2lzbWxfbWFuaWZlc3QocGIsIG1vdik7CisgICAgICAgIG1vdl93cml0ZV9pc21sX21hbmlmZXN0KHBiLCBtb3YsIHMpOwogCiAgICAgaWYgKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19FTVBUWV9NT09WICYmCiAgICAgICAgICEobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0RFTEFZX01PT1YpKSB7CkBAIC01NDI1LDkgKzYzODcsNiBAQAogICAgIH0KIAogICAgIHJldHVybiAwOwotIGVycm9yOgotICAgIG1vdl9mcmVlKHMpOwotICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgZ2V0X21vb3Zfc2l6ZShBVkZvcm1hdENvbnRleHQgKnMpCkBAIC01NTI4LDEwICs2NDg3LDEwIEBACiAgICAgICogd3JpdGluZywgc28gd2UgcmUtb3BlbiB0aGUgc2FtZSBvdXRwdXQsIGJ1dCBmb3IgcmVhZGluZy4gSXQgYWxzbyBhdm9pZHMKICAgICAgKiBhIHJlYWQvc2Vlay93cml0ZS9zZWVrIGJhY2sgYW5kIGZvcnRoLiAqLwogICAgIGF2aW9fZmx1c2gocy0+cGIpOwotICAgIHJldCA9IHMtPmlvX29wZW4ocywgJnJlYWRfcGIsIHMtPmZpbGVuYW1lLCBBVklPX0ZMQUdfUkVBRCwgTlVMTCk7CisgICAgcmV0ID0gcy0+aW9fb3BlbihzLCAmcmVhZF9wYiwgcy0+dXJsLCBBVklPX0ZMQUdfUkVBRCwgTlVMTCk7CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byByZS1vcGVuICVzIG91dHB1dCBmaWxlIGZvciAiCi0gICAgICAgICAgICAgICAidGhlIHNlY29uZCBwYXNzIChmYXN0c3RhcnQpXG4iLCBzLT5maWxlbmFtZSk7CisgICAgICAgICAgICAgICAidGhlIHNlY29uZCBwYXNzIChmYXN0c3RhcnQpXG4iLCBzLT51cmwpOwogICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKQEAgLTU1NzUsMTMgKzY1MzQsMjcgQEAKICAgICBpbnQgaTsKICAgICBpbnQ2NF90IG1vb3ZfcG9zOwogCisgICAgaWYgKG1vdi0+bmVlZF9yZXdyaXRlX2V4dHJhZGF0YSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBNT1ZUcmFjayAqdHJhY2sgPSAmbW92LT50cmFja3NbaV07CisgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gdHJhY2stPnBhcjsKKworICAgICAgICAgICAgdHJhY2stPnZvc19sZW4gID0gcGFyLT5leHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgICAgIHRyYWNrLT52b3NfZGF0YSA9IGF2X21hbGxvYyh0cmFjay0+dm9zX2xlbik7CisgICAgICAgICAgICBpZiAoIXRyYWNrLT52b3NfZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbWVtY3B5KHRyYWNrLT52b3NfZGF0YSwgcGFyLT5leHRyYWRhdGEsIHRyYWNrLT52b3NfbGVuKTsKKyAgICAgICAgfQorICAgICAgICBtb3YtPm5lZWRfcmV3cml0ZV9leHRyYWRhdGEgPSAwOworICAgIH0KKwogICAgIC8qCiAgICAgICogQmVmb3JlIGFjdHVhbGx5IHdyaXRpbmcgdGhlIHRyYWlsZXIsIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubwogICAgICAqIGRhbmdsaW5nIHN1YnRpdGxlcywgdGhhdCBuZWVkIGEgdGVybWluYXRpbmcgc2FtcGxlLgogICAgICAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBtb3YtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBNT1ZUcmFjayAqdHJrID0gJm1vdi0+dHJhY2tzW2ldOwotICAgICAgICBpZiAodHJrLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01PVl9URVhUICYmCisgICAgICAgIGlmICh0cmstPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTU9WX1RFWFQgJiYKICAgICAgICAgICAgICF0cmstPmxhc3Rfc2FtcGxlX2lzX3N1YnRpdGxlX2VuZCkgewogICAgICAgICAgICAgbW92X3dyaXRlX3N1YnRpdGxlX2VuZF9wYWNrZXQocywgaSwgdHJrLT50cmFja19kdXJhdGlvbik7CiAgICAgICAgICAgICB0cmstPmxhc3Rfc2FtcGxlX2lzX3N1YnRpdGxlX2VuZCA9IDE7CkBAIC01NTk1LDcgKzY1NjgsNyBAQAogICAgICAgICBpZiAobW92LT5tb2RlICYgKE1PREVfTVA0fE1PREVfTU9WfE1PREVfSVBPRCkgJiYgcy0+bmJfY2hhcHRlcnMpIHsKICAgICAgICAgICAgIG1vdi0+Y2hhcHRlcl90cmFjayA9IG1vdi0+bmJfc3RyZWFtcysrOwogICAgICAgICAgICAgaWYgKChyZXMgPSBtb3ZfY3JlYXRlX2NoYXB0ZXJfdHJhY2socywgbW92LT5jaGFwdGVyX3RyYWNrKSkgPCAwKQotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTYyMCwyMCArNjU5MywxOSBAQAogICAgICAgICBpZiAobW92LT5mbGFncyAmIEZGX01PVl9GTEFHX0ZBU1RTVEFSVCkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiU3RhcnRpbmcgc2Vjb25kIHBhc3M6IG1vdmluZyB0aGUgbW9vdiBhdG9tIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGVcbiIpOwogICAgICAgICAgICAgcmVzID0gc2hpZnRfZGF0YShzKTsKLSAgICAgICAgICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgbW92LT5yZXNlcnZlZF9oZWFkZXJfcG9zLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICAgICAgaWYgKChyZXMgPSBtb3Zfd3JpdGVfbW9vdl90YWcocGIsIG1vdiwgcykpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBhdmlvX3NlZWsocGIsIG1vdi0+cmVzZXJ2ZWRfaGVhZGVyX3BvcywgU0VFS19TRVQpOworICAgICAgICAgICAgaWYgKChyZXMgPSBtb3Zfd3JpdGVfbW9vdl90YWcocGIsIG1vdiwgcykpIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9IGVsc2UgaWYgKG1vdi0+cmVzZXJ2ZWRfbW9vdl9zaXplID4gMCkgewogICAgICAgICAgICAgaW50NjRfdCBzaXplOwogICAgICAgICAgICAgaWYgKChyZXMgPSBtb3Zfd3JpdGVfbW9vdl90YWcocGIsIG1vdiwgcykpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICBzaXplID0gbW92LT5yZXNlcnZlZF9tb292X3NpemUgLSAoYXZpb190ZWxsKHBiKSAtIG1vdi0+cmVzZXJ2ZWRfaGVhZGVyX3Bvcyk7CiAgICAgICAgICAgICBpZiAoc2l6ZSA8IDgpewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJyZXNlcnZlZF9tb292X3NpemUgaXMgdG9vIHNtYWxsLCBuZWVkZWQgJSJQUklkNjQiIGFkZGl0aW9uYWxcbiIsIDgtc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFSU5WQUwpOwotICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgc2l6ZSk7CiAgICAgICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJmcmVlIik7CkBAIC01NjQxLDcgKzY2MTMsNyBAQAogICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBtb292X3BvcywgU0VFS19TRVQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKChyZXMgPSBtb3Zfd3JpdGVfbW9vdl90YWcocGIsIG1vdiwgcykpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgcmVzID0gMDsKICAgICB9IGVsc2UgewpAQCAtNTY0OSwyNiArNjYyMSwxMDkgQEAKICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vdi0+bmJfc3RyZWFtczsgaSsrKQogICAgICAgICAgICBtb3YtPnRyYWNrc1tpXS5kYXRhX29mZnNldCA9IDA7CiAgICAgICAgIGlmIChtb3YtPmZsYWdzICYgRkZfTU9WX0ZMQUdfR0xPQkFMX1NJRFgpIHsKKyAgICAgICAgICAgIGludDY0X3QgZW5kOwogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAiU3RhcnRpbmcgc2Vjb25kIHBhc3M6IGluc2VydGluZyBzaWR4IGF0b21zXG4iKTsKICAgICAgICAgICAgIHJlcyA9IHNoaWZ0X2RhdGEocyk7Ci0gICAgICAgICAgICBpZiAocmVzID09IDApIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGVuZCA9IGF2aW9fdGVsbChwYik7Ci0gICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBtb3YtPnJlc2VydmVkX2hlYWRlcl9wb3MsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgICAgICBtb3Zfd3JpdGVfc2lkeF90YWdzKHBiLCBtb3YsIC0xLCAwKTsKLSAgICAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIGVuZCwgU0VFS19TRVQpOwotICAgICAgICAgICAgICAgIG1vdl93cml0ZV9tZnJhX3RhZyhwYiwgbW92KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICBlbmQgPSBhdmlvX3RlbGwocGIpOworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBtb3YtPnJlc2VydmVkX2hlYWRlcl9wb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIG1vdl93cml0ZV9zaWR4X3RhZ3MocGIsIG1vdiwgLTEsIDApOworICAgICAgICAgICAgYXZpb19zZWVrKHBiLCBlbmQsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGVfbWFya2VyKHMtPnBiLCBBVl9OT1BUU19WQUxVRSwgQVZJT19EQVRBX01BUktFUl9UUkFJTEVSKTsKKyAgICAgICAgICAgIG1vdl93cml0ZV9tZnJhX3RhZyhwYiwgbW92KTsKKyAgICAgICAgfSBlbHNlIGlmICghKG1vdi0+ZmxhZ3MgJiBGRl9NT1ZfRkxBR19TS0lQX1RSQUlMRVIpKSB7CisgICAgICAgICAgICBhdmlvX3dyaXRlX21hcmtlcihzLT5wYiwgQVZfTk9QVFNfVkFMVUUsIEFWSU9fREFUQV9NQVJLRVJfVFJBSUxFUik7CiAgICAgICAgICAgICBtb3Zfd3JpdGVfbWZyYV90YWcocGIsIG1vdik7CiAgICAgICAgIH0KICAgICB9CiAKLWVycm9yOgotICAgIG1vdl9mcmVlKHMpOwotCiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdGljIGludCBtb3ZfY2hlY2tfYml0c3RyZWFtKHN0cnVjdCBBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IEFWUGFja2V0ICpwa3QpCit7CisgICAgaW50IHJldCA9IDE7CisgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CisKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgaWYgKHBrdC0+c2l6ZSA+IDIgJiYgKEFWX1JCMTYocGt0LT5kYXRhKSAmIDB4ZmZmMCkgPT0gMHhmZmYwKQorICAgICAgICAgICAgcmV0ID0gZmZfc3RyZWFtX2FkZF9iaXRzdHJlYW1fZmlsdGVyKHN0LCAiYWFjX2FkdHN0b2FzYyIsIE5VTEwpOworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDkpIHsKKyAgICAgICAgcmV0ID0gZmZfc3RyZWFtX2FkZF9iaXRzdHJlYW1fZmlsdGVyKHN0LCAidnA5X3N1cGVyZnJhbWUiLCBOVUxMKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBjb2RlY18zZ3BfdGFnc1tdID0geworICAgIHsgQVZfQ09ERUNfSURfSDI2MywgICAgIE1LVEFHKCdzJywnMicsJzYnLCczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0gyNjQsICAgICBNS1RBRygnYScsJ3YnLCdjJywnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgTUtUQUcoJ20nLCdwJywnNCcsJ3YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICAgIE1LVEFHKCdtJywncCcsJzQnLCdhJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FNUl9OQiwgICBNS1RBRygncycsJ2EnLCdtJywncicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTVJfV0IsICAgTUtUQUcoJ3MnLCdhJywndycsJ2InKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTU9WX1RFWFQsIE1LVEFHKCd0JywneCcsJzMnLCdnJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUsIDAgfSwKK307CisKK2NvbnN0IEFWQ29kZWNUYWcgY29kZWNfbXA0X3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX01QRUc0ICAgICAgICwgTUtUQUcoJ20nLCAncCcsICc0JywgJ3YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2NCAgICAgICAgLCBNS1RBRygnYScsICd2JywgJ2MnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0ICAgICAgICAsIE1LVEFHKCdhJywgJ3YnLCAnYycsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0hFVkMgICAgICAgICwgTUtUQUcoJ2gnLCAnZScsICd2JywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSEVWQyAgICAgICAgLCBNS1RBRygnaCcsICd2JywgJ2MnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPICAsIE1LVEFHKCdtJywgJ3AnLCAnNCcsICd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8gICwgTUtUQUcoJ20nLCAncCcsICc0JywgJ3YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUpQRUcgICAgICAgLCBNS1RBRygnbScsICdwJywgJzQnLCAndicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QTkcgICAgICAgICAsIE1LVEFHKCdtJywgJ3AnLCAnNCcsICd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0pQRUcyMDAwICAgICwgTUtUQUcoJ20nLCAncCcsICc0JywgJ3YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVkMxICAgICAgICAgLCBNS1RBRygndicsICdjJywgJy0nLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9ESVJBQyAgICAgICAsIE1LVEFHKCdkJywgJ3InLCAnYScsICdjJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1RTQ0MyICAgICAgICwgTUtUQUcoJ20nLCAncCcsICc0JywgJ3YnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA5ICAgICAgICAgLCBNS1RBRygndicsICdwJywgJzAnLCAnOScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BQUMgICAgICAgICAsIE1LVEFHKCdtJywgJ3AnLCAnNCcsICdhJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QNEFMUyAgICAgICwgTUtUQUcoJ20nLCAncCcsICc0JywgJ2EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVAzICAgICAgICAgLCBNS1RBRygnbScsICdwJywgJzQnLCAnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUDIgICAgICAgICAsIE1LVEFHKCdtJywgJ3AnLCAnNCcsICdhJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FDMyAgICAgICAgICwgTUtUQUcoJ2EnLCAnYycsICctJywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRUFDMyAgICAgICAgLCBNS1RBRygnZScsICdjJywgJy0nLCAnMycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EVFMgICAgICAgICAsIE1LVEFHKCdtJywgJ3AnLCAnNCcsICdhJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0ZMQUMgICAgICAgICwgTUtUQUcoJ2YnLCAnTCcsICdhJywgJ0MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfT1BVUyAgICAgICAgLCBNS1RBRygnTycsICdwJywgJ3UnLCAncycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9WT1JCSVMgICAgICAsIE1LVEFHKCdtJywgJ3AnLCAnNCcsICdhJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1FDRUxQICAgICAgICwgTUtUQUcoJ20nLCAncCcsICc0JywgJ2EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRVZSQyAgICAgICAgLCBNS1RBRygnbScsICdwJywgJzQnLCAnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEUsIE1LVEFHKCdtJywgJ3AnLCAnNCcsICdzJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01PVl9URVhUICAgICwgTUtUQUcoJ3QnLCAneCcsICczJywgJ2cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSAgICAgICAgLCAgICAwIH0sCit9OworCitjb25zdCBBVkNvZGVjVGFnIGNvZGVjX2lzbV90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9XTUFQUk8gICAgICAsIE1LVEFHKCd3JywgJ20nLCAnYScsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX05PTkUgICAgICAgICwgICAgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgY29kZWNfaXBvZF90YWdzW10gPSB7CisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgICAgTUtUQUcoJ2EnLCd2JywnYycsJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgIE1LVEFHKCdtJywncCcsJzQnLCd2JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgICBNS1RBRygnbScsJ3AnLCc0JywnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BTEFDLCAgICAgTUtUQUcoJ2EnLCdsJywnYScsJ2MnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQUMzLCAgICAgIE1LVEFHKCdhJywnYycsJy0nLCczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01PVl9URVhULCBNS1RBRygndCcsJ3gnLCczJywnZycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NT1ZfVEVYVCwgTUtUQUcoJ3QnLCdlJywneCcsJ3QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IEFWQ29kZWNUYWcgY29kZWNfZjR2X3RhZ3NbXSA9IHsKKyAgICB7IEFWX0NPREVDX0lEX01QMywgICAgTUtUQUcoJy4nLCdtJywncCcsJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICBNS1RBRygnbScsJ3AnLCc0JywnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9IMjY0LCAgIE1LVEFHKCdhJywndicsJ2MnLCcxJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1ZQNkEsICAgTUtUQUcoJ1YnLCdQJywnNicsJ0EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVlA2RiwgICBNS1RBRygnVicsJ1AnLCc2JywnRicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9OT05FLCAwIH0sCit9OworCiAjaWYgQ09ORklHX01PVl9NVVhFUgogTU9WX0NMQVNTKG1vdikKIEFWT3V0cHV0Rm9ybWF0IGZmX21vdl9tdXhlciA9IHsKQEAgLTU2NzksMTMgKzY3MzQsMTYgQEAKICAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCiAgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQ09ORklHX0xJQlgyNjRfRU5DT0RFUiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfSDI2NCA6IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC5pbml0ICAgICAgICAgICAgICA9IG1vdl9pbml0LAogICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1vdl93cml0ZV9oZWFkZXIsCiAgICAgLndyaXRlX3BhY2tldCAgICAgID0gbW92X3dyaXRlX3BhY2tldCwKICAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtb3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZGVpbml0ICAgICAgICAgICAgPSBtb3ZfZnJlZSwKICAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9BTExPV19GTFVTSCB8IEFWRk1UX1RTX05FR0FUSVZFLAogICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7CiAgICAgICAgIGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsIGZmX2NvZGVjX21vdmF1ZGlvX3RhZ3MsIDAKICAgICB9LAorICAgIC5jaGVja19iaXRzdHJlYW0gICA9IG1vdl9jaGVja19iaXRzdHJlYW0sCiAgICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1vdl9tdXhlcl9jbGFzcywKIH07CiAjZW5kaWYKQEAgLTU2OTgsMTEgKzY3NTYsMTQgQEAKICAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTU9WTXV4Q29udGV4dCksCiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQU1SX05CLAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0gyNjMsCisgICAgLmluaXQgICAgICAgICAgICAgID0gbW92X2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgICAgID0gbW92X3dyaXRlX2hlYWRlciwKICAgICAud3JpdGVfcGFja2V0ICAgICAgPSBtb3Zfd3JpdGVfcGFja2V0LAogICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1vdl93cml0ZV90cmFpbGVyLAorICAgIC5kZWluaXQgICAgICAgICAgICA9IG1vdl9mcmVlLAogICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX0FMTE9XX0ZMVVNIIHwgQVZGTVRfVFNfTkVHQVRJVkUsCiAgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgY29kZWNfM2dwX3RhZ3MsIDAgfSwKKyAgICAuY2hlY2tfYml0c3RyZWFtICAgPSBtb3ZfY2hlY2tfYml0c3RyZWFtLAogICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZ0Z3BfbXV4ZXJfY2xhc3MsCiB9OwogI2VuZGlmCkBAIC01NzE3LDExICs2Nzc4LDE0IEBACiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IENPTkZJR19MSUJYMjY0X0VOQ09ERVIgPwogICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX0gyNjQgOiBBVl9DT0RFQ19JRF9NUEVHNCwKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSBtb3ZfaW5pdCwKICAgICAud3JpdGVfaGVhZGVyICAgICAgPSBtb3Zfd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG1vdl93cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgICAgID0gbW92X3dyaXRlX3RyYWlsZXIsCisgICAgLmRlaW5pdCAgICAgICAgICAgID0gbW92X2ZyZWUsCiAgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfR0xPQkFMSEVBREVSIHwgQVZGTVRfQUxMT1dfRkxVU0ggfCBBVkZNVF9UU19ORUdBVElWRSwKLSAgICAuY29kZWNfdGFnICAgICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10peyBmZl9tcDRfb2JqX3R5cGUsIDAgfSwKKyAgICAuY29kZWNfdGFnICAgICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10peyBjb2RlY19tcDRfdGFncywgMCB9LAorICAgIC5jaGVja19iaXRzdHJlYW0gICA9IG1vdl9jaGVja19iaXRzdHJlYW0sCiAgICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1wNF9tdXhlcl9jbGFzcywKIH07CiAjZW5kaWYKQEAgLTU3MzUsMTEgKzY3OTksMTQgQEAKICAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCiAgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQ09ORklHX0xJQlgyNjRfRU5DT0RFUiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfSDI2NCA6IEFWX0NPREVDX0lEX01QRUc0LAorICAgIC5pbml0ICAgICAgICAgICAgICA9IG1vdl9pbml0LAogICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG1vdl93cml0ZV9oZWFkZXIsCiAgICAgLndyaXRlX3BhY2tldCAgICAgID0gbW92X3dyaXRlX3BhY2tldCwKICAgICAud3JpdGVfdHJhaWxlciAgICAgPSBtb3Zfd3JpdGVfdHJhaWxlciwKKyAgICAuZGVpbml0ICAgICAgICAgICAgPSBtb3ZfZnJlZSwKICAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9HTE9CQUxIRUFERVIgfCBBVkZNVF9BTExPV19GTFVTSCB8IEFWRk1UX1RTX05FR0FUSVZFLAotICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGZmX21wNF9vYmpfdHlwZSwgMCB9LAorICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGNvZGVjX21wNF90YWdzLCAwIH0sCisgICAgLmNoZWNrX2JpdHN0cmVhbSAgID0gbW92X2NoZWNrX2JpdHN0cmVhbSwKICAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmcHNwX211eGVyX2NsYXNzLAogfTsKICNlbmRpZgpAQCAtNTc1MiwxMSArNjgxOSwxNCBAQAogICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihNT1ZNdXhDb250ZXh0KSwKICAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BTVJfTkIsCiAgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfSDI2MywKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSBtb3ZfaW5pdCwKICAgICAud3JpdGVfaGVhZGVyICAgICAgPSBtb3Zfd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG1vdl93cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgICAgID0gbW92X3dyaXRlX3RyYWlsZXIsCisgICAgLmRlaW5pdCAgICAgICAgICAgID0gbW92X2ZyZWUsCiAgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfR0xPQkFMSEVBREVSIHwgQVZGTVRfQUxMT1dfRkxVU0ggfCBBVkZNVF9UU19ORUdBVElWRSwKICAgICAuY29kZWNfdGFnICAgICAgICAgPSAoY29uc3QgQVZDb2RlY1RhZyogY29uc3QgW10peyBjb2RlY18zZ3BfdGFncywgMCB9LAorICAgIC5jaGVja19iaXRzdHJlYW0gICA9IG1vdl9jaGVja19iaXRzdHJlYW0sCiAgICAgLnByaXZfY2xhc3MgICAgICAgID0gJnRnMl9tdXhlcl9jbGFzcywKIH07CiAjZW5kaWYKQEAgLTU3NjYsMTUgKzY4MzYsMTggQEAKICAgICAubmFtZSAgICAgICAgICAgICAgPSAiaXBvZCIsCiAgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoImlQb2QgSC4yNjQgTVA0IChNUEVHLTQgUGFydCAxNCkiKSwKICAgICAubWltZV90eXBlICAgICAgICAgPSAidmlkZW8vbXA0IiwKLSAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAibTR2LG00YSIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gIm00dixtNGEsbTRiIiwKICAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTU9WTXV4Q29udGV4dCksCiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLmluaXQgICAgICAgICAgICAgID0gbW92X2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgICAgID0gbW92X3dyaXRlX2hlYWRlciwKICAgICAud3JpdGVfcGFja2V0ICAgICAgPSBtb3Zfd3JpdGVfcGFja2V0LAogICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1vdl93cml0ZV90cmFpbGVyLAorICAgIC5kZWluaXQgICAgICAgICAgICA9IG1vdl9mcmVlLAogICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX0FMTE9XX0ZMVVNIIHwgQVZGTVRfVFNfTkVHQVRJVkUsCiAgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgY29kZWNfaXBvZF90YWdzLCAwIH0sCisgICAgLmNoZWNrX2JpdHN0cmVhbSAgID0gbW92X2NoZWNrX2JpdHN0cmVhbSwKICAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmaXBvZF9tdXhlcl9jbGFzcywKIH07CiAjZW5kaWYKQEAgLTU3ODgsMTEgKzY4NjEsMTUgQEAKICAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTU9WTXV4Q29udGV4dCksCiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLmluaXQgICAgICAgICAgICAgID0gbW92X2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgICAgID0gbW92X3dyaXRlX2hlYWRlciwKICAgICAud3JpdGVfcGFja2V0ICAgICAgPSBtb3Zfd3JpdGVfcGFja2V0LAogICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1vdl93cml0ZV90cmFpbGVyLAorICAgIC5kZWluaXQgICAgICAgICAgICA9IG1vdl9mcmVlLAogICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX0FMTE9XX0ZMVVNIIHwgQVZGTVRfVFNfTkVHQVRJVkUsCi0gICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfbXA0X29ial90eXBlLCAwIH0sCisgICAgLmNvZGVjX3RhZyAgICAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsKKyAgICAgICAgY29kZWNfbXA0X3RhZ3MsIGNvZGVjX2lzbV90YWdzLCAwIH0sCisgICAgLmNoZWNrX2JpdHN0cmVhbSAgID0gbW92X2NoZWNrX2JpdHN0cmVhbSwKICAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmaXNtdl9tdXhlcl9jbGFzcywKIH07CiAjZW5kaWYKQEAgLTU4MDYsMTEgKzY4ODMsMTQgQEAKICAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoTU9WTXV4Q29udGV4dCksCiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQUFDLAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0gyNjQsCisgICAgLmluaXQgICAgICAgICAgICAgID0gbW92X2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgICAgID0gbW92X3dyaXRlX2hlYWRlciwKICAgICAud3JpdGVfcGFja2V0ICAgICAgPSBtb3Zfd3JpdGVfcGFja2V0LAogICAgIC53cml0ZV90cmFpbGVyICAgICA9IG1vdl93cml0ZV90cmFpbGVyLAorICAgIC5kZWluaXQgICAgICAgICAgICA9IG1vdl9mcmVlLAogICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX0dMT0JBTEhFQURFUiB8IEFWRk1UX0FMTE9XX0ZMVVNILAogICAgIC5jb2RlY190YWcgICAgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGNvZGVjX2Y0dl90YWdzLCAwIH0sCisgICAgLmNoZWNrX2JpdHN0cmVhbSAgID0gbW92X2NoZWNrX2JpdHN0cmVhbSwKICAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmZjR2X211eGVyX2NsYXNzLAogfTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbW92ZW5jLmggYi9saWJhdmZvcm1hdC9tb3ZlbmMuaAppbmRleCBkZWI5MGZlLi5jOWI0MDcyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tb3ZlbmMuaAorKysgYi9saWJhdmZvcm1hdC9tb3ZlbmMuaApAQCAtNTMsNiArNTMsNyBAQAogICAgIGludCAgICAgICAgICBjdHM7CiAjZGVmaW5lIE1PVl9TWU5DX1NBTVBMRSAgICAgICAgIDB4MDAwMQogI2RlZmluZSBNT1ZfUEFSVElBTF9TWU5DX1NBTVBMRSAweDAwMDIKKyNkZWZpbmUgTU9WX0RJU1BPU0FCTEVfU0FNUExFICAgMHgwMDA0CiAgICAgdWludDMyX3QgICAgIGZsYWdzOwogfSBNT1ZJZW50cnk7CiAKQEAgLTg5LDYgKzkwLDcgQEAKICAgICBsb25nICAgICAgICBzYW1wbGVfc2l6ZTsKICAgICBsb25nICAgICAgICBjaHVua0NvdW50OwogICAgIGludCAgICAgICAgIGhhc19rZXlmcmFtZXM7CisgICAgaW50ICAgICAgICAgaGFzX2Rpc3Bvc2FibGU7CiAjZGVmaW5lIE1PVl9UUkFDS19DVFRTICAgICAgICAgMHgwMDAxCiAjZGVmaW5lIE1PVl9UUkFDS19TVFBTICAgICAgICAgMHgwMDAyCiAjZGVmaW5lIE1PVl9UUkFDS19FTkFCTEVEICAgICAgMHgwMDA0CkBAIC0xMDEsNyArMTAzLDcgQEAKICAgICBpbnQgICAgICAgICB0cmFja19pZDsKICAgICBpbnQgICAgICAgICB0YWc7IC8vLzwgc3RzZCBmb3VyY2MKICAgICBBVlN0cmVhbSAgICAgICAgKnN0OwotICAgIEFWQ29kZWNDb250ZXh0ICplbmM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBpbnQgbXVsdGljaGFubmVsX2FzX21vbm87CiAKICAgICBpbnQgICAgICAgICB2b3NfbGVuOwpAQCAtMTE1LDYgKzExNyw4IEBACiAgICAgaW50NjRfdCAgICAgc3RhcnRfZHRzOwogICAgIGludDY0X3QgICAgIHN0YXJ0X2N0czsKICAgICBpbnQ2NF90ICAgICBlbmRfcHRzOworICAgIGludCAgICAgICAgIGVuZF9yZWxpYWJsZTsKKyAgICBpbnQ2NF90ICAgICBkdHNfc2hpZnQ7CiAKICAgICBpbnQgICAgICAgICBoaW50X3RyYWNrOyAgIC8vLzwgdGhlIHRyYWNrIHRoYXQgaGludHMgdGhpcyB0cmFjaywgLTEgaWYgbm8gaGludCB0cmFjayBpcyBzZXQKICAgICBpbnQgICAgICAgICBzcmNfdHJhY2s7ICAgIC8vLzwgdGhlIHRyYWNrIHRoYXQgdGhpcyBoaW50IChvciB0bWNkKSB0cmFjayBkZXNjcmliZXMKQEAgLTEyOCw2ICsxMzIsNyBAQAogICAgIHVpbnQzMl90ICAgIGRlZmF1bHRfc2l6ZTsKIAogICAgIEhpbnRTYW1wbGVRdWV1ZSBzYW1wbGVfcXVldWU7CisgICAgQVZQYWNrZXQgY292ZXJfaW1hZ2U7CiAKICAgICBBVklPQ29udGV4dCAqbWRhdF9idWY7CiAgICAgaW50NjRfdCAgICAgZGF0YV9vZmZzZXQ7CkBAIC0xNTIsNiArMTU3LDExIEBACiAgICAgdm9pZCAgICAgICAqZWFjM19wcml2OwogCiAgICAgTU9WTXV4Q2VuY0NvbnRleHQgY2VuYzsKKworICAgIHVpbnQzMl90IHBhbGV0dGVbQVZQQUxFVFRFX0NPVU5UXTsKKyAgICBpbnQgcGFsX2RvbmU7CisKKyAgICBpbnQgaXNfdW5hbGlnbmVkX3F0X3JnYjsKIH0gTU9WVHJhY2s7CiAKIHR5cGVkZWYgZW51bSB7CkBAIC0yMDksNiArMjE5LDExIEBACiAgICAgdWludDhfdCAqZW5jcnlwdGlvbl9raWQ7CiAgICAgaW50IGVuY3J5cHRpb25fa2lkX2xlbjsKIAorICAgIGludCBuZWVkX3Jld3JpdGVfZXh0cmFkYXRhOworCisgICAgaW50IHVzZV9zdHJlYW1faWRzX2FzX3RyYWNrX2lkczsKKyAgICBpbnQgdHJhY2tfaWRzX29rOworICAgIGludCB3cml0ZV90bWNkOwogfSBNT1ZNdXhDb250ZXh0OwogCiAjZGVmaW5lIEZGX01PVl9GTEFHX1JUUF9ISU5UICAgICAgICAgICAgICAoMSA8PCAgMCkKQEAgLTIyOCw2ICsyNDMsMTAgQEAKICNkZWZpbmUgRkZfTU9WX0ZMQUdfR0xPQkFMX1NJRFggICAgICAgICAgICgxIDw8IDE0KQogI2RlZmluZSBGRl9NT1ZfRkxBR19XUklURV9DT0xSICAgICAgICAgICAgKDEgPDwgMTUpCiAjZGVmaW5lIEZGX01PVl9GTEFHX1dSSVRFX0dBTUEgICAgICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgRkZfTU9WX0ZMQUdfVVNFX01EVEEgICAgICAgICAgICAgICgxIDw8IDE3KQorI2RlZmluZSBGRl9NT1ZfRkxBR19TS0lQX1RSQUlMRVIgICAgICAgICAgKDEgPDwgMTgpCisjZGVmaW5lIEZGX01PVl9GTEFHX05FR0FUSVZFX0NUU19PRkZTRVRTICAoMSA8PCAxOSkKKyNkZWZpbmUgRkZfTU9WX0ZMQUdfRlJBR19FVkVSWV9GUkFNRSAgICAgICgxIDw8IDIwKQogCiBpbnQgZmZfbW92X3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpOwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tb3ZlbmNoaW50LmMgYi9saWJhdmZvcm1hdC9tb3ZlbmNoaW50LmMKaW5kZXggOWU2NjdlZC4uOTY0MDI2ZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbW92ZW5jaGludC5jCisrKyBiL2xpYmF2Zm9ybWF0L21vdmVuY2hpbnQuYwpAQCAtMzcsMTEgKzM3LDExIEBACiAgICAgdHJhY2stPnRhZyA9IE1LVEFHKCdyJywndCcsJ3AnLCcgJyk7CiAgICAgdHJhY2stPnNyY190cmFjayA9IHNyY19pbmRleDsKIAotICAgIHRyYWNrLT5lbmMgPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOwotICAgIGlmICghdHJhY2stPmVuYykKKyAgICB0cmFjay0+cGFyID0gYXZjb2RlY19wYXJhbWV0ZXJzX2FsbG9jKCk7CisgICAgaWYgKCF0cmFjay0+cGFyKQogICAgICAgICBnb3RvIGZhaWw7Ci0gICAgdHJhY2stPmVuYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOwotICAgIHRyYWNrLT5lbmMtPmNvZGVjX3RhZyAgPSB0cmFjay0+dGFnOworICAgIHRyYWNrLT5wYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICB0cmFjay0+cGFyLT5jb2RlY190YWcgID0gdHJhY2stPnRhZzsKIAogICAgIHJldCA9IGZmX3J0cF9jaGFpbl9tdXhfb3BlbigmdHJhY2stPnJ0cF9jdHgsIHMsIHNyY19zdCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRQX01BWF9QQUNLRVRfU0laRSwgc3JjX2luZGV4KTsKQEAgLTU4LDcgKzU4LDcgQEAKIGZhaWw6CiAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAogICAgICAgICAgICAiVW5hYmxlIHRvIGluaXRpYWxpemUgaGludGluZyBvZiBzdHJlYW0gJWRcbiIsIHNyY19pbmRleCk7Ci0gICAgYXZfZnJlZXAoJnRyYWNrLT5lbmMpOworICAgIGF2Y29kZWNfcGFyYW1ldGVyc19mcmVlKCZ0cmFjay0+cGFyKTsKICAgICAvKiBTZXQgYSBkZWZhdWx0IHRpbWVzY2FsZSwgdG8gYXZvaWQgY3Jhc2hlcyBpbiBhdl9kdW1wX2Zvcm1hdCAqLwogICAgIHRyYWNrLT50aW1lc2NhbGUgPSA5MDAwMDsKICAgICByZXR1cm4gcmV0OwpAQCAtNDYwLDcgKzQ2MCw3IEBACiB7CiAgICAgQVZGb3JtYXRDb250ZXh0ICpydHBfY3R4ID0gdHJhY2stPnJ0cF9jdHg7CiAKLSAgICBhdl9mcmVlcCgmdHJhY2stPmVuYyk7CisgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2ZyZWUoJnRyYWNrLT5wYXIpOwogICAgIHNhbXBsZV9xdWV1ZV9mcmVlKCZ0cmFjay0+c2FtcGxlX3F1ZXVlKTsKICAgICBpZiAoIXJ0cF9jdHgpCiAgICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21wM2RlYy5jIGIvbGliYXZmb3JtYXQvbXAzZGVjLmMKaW5kZXggYzc2YjIxZS4uYTc2ZmUzMiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbXAzZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvbXAzZGVjLmMKQEAgLTU3LDYgKzU3LDExIEBACiAgICAgaW50IGlzX2NicjsKIH0gTVAzRGVjQ29udGV4dDsKIAorZW51bSBDaGVja1JldCB7CisgICAgQ0hFQ0tfV1JPTkdfSEVBREVSID0gLTEsCisgICAgQ0hFQ0tfU0VFS19GQUlMRUQgID0gLTIsCit9OworCiBzdGF0aWMgaW50IGNoZWNrKEFWSU9Db250ZXh0ICpwYiwgaW50NjRfdCBwb3MsIHVpbnQzMl90ICpoZWFkZXIpOwogCiAvKiBtcDMgcmVhZCAqLwpAQCAtNjQsNiArNjksNyBAQAogc3RhdGljIGludCBtcDNfcmVhZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKIHsKICAgICBpbnQgbWF4X2ZyYW1lcywgZmlyc3RfZnJhbWVzID0gMDsKKyAgICBpbnQgd2hvbGVfdXNlZCA9IDA7CiAgICAgaW50IGZyYW1lcywgcmV0OwogICAgIHVpbnQzMl90IGhlYWRlcjsKICAgICBjb25zdCB1aW50OF90ICpidWYsICpidWYwLCAqYnVmMiwgKmVuZDsKQEAgLTg4LDggKzk0LDExIEBACiAgICAgICAgICAgICBidWYyICs9IGguZnJhbWVfc2l6ZTsKICAgICAgICAgfQogICAgICAgICBtYXhfZnJhbWVzID0gRkZNQVgobWF4X2ZyYW1lcywgZnJhbWVzKTsKLSAgICAgICAgaWYoYnVmID09IGJ1ZjApCisgICAgICAgIGlmKGJ1ZiA9PSBidWYwKSB7CiAgICAgICAgICAgICBmaXJzdF9mcmFtZXM9IGZyYW1lczsKKyAgICAgICAgICAgIGlmIChidWYyID09IGVuZCArIHNpemVvZih1aW50MzJfdCkpCisgICAgICAgICAgICAgICAgd2hvbGVfdXNlZCA9IDE7CisgICAgICAgIH0KICAgICB9CiAgICAgLy8ga2VlcCB0aGlzIGluIHN5bmMgd2l0aCBhYzMgcHJvYmUsIGJvdGggbmVlZCB0byBhdm9pZAogICAgIC8vIGlzc3VlcyB3aXRoIE1QRUctZmlsZXMhCkBAIC05OCw2ICsxMDcsNyBAQAogICAgIGVsc2UgaWYobWF4X2ZyYW1lcz49NCAmJiBtYXhfZnJhbWVzID49IHAtPmJ1Zl9zaXplLzEwMDAwKSByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyOwogICAgIGVsc2UgaWYoZmZfaWQzdjJfbWF0Y2goYnVmMCwgSUQzdjJfREVGQVVMVF9NQUdJQykgJiYgMipmZl9pZDN2Ml90YWdfbGVuKGJ1ZjApID49IHAtPmJ1Zl9zaXplKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHAtPmJ1Zl9zaXplIDwgUFJPQkVfQlVGX01BWCA/IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC8gNCA6IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OIC0gMjsKKyAgICBlbHNlIGlmKGZpcnN0X2ZyYW1lcyA+IDEgJiYgd2hvbGVfdXNlZCkgcmV0dXJuIDU7CiAgICAgZWxzZSBpZihtYXhfZnJhbWVzPj0xICYmIG1heF9mcmFtZXMgPj0gcC0+YnVmX3NpemUvMTAwMDApIHJldHVybiAxOwogICAgIGVsc2UgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAvL21wZWdwc19tcDNfdW5yZWNvZ25pemVkX2Zvcm1hdC5tcGcgaGFzIG1heF9mcmFtZXM9MwpAQCAtMTMyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBBRGVjb2RlSGVhZGVyICpjLCB1aW50MzJfdCBzcGYpCiB7CiAjZGVmaW5lIExBU1RfQklUUyhrLCBuKSAoKGspICYgKCgxIDw8IChuKSkgLSAxKSkKLSNkZWZpbmUgTUlERExFX0JJVFMoaywgbSwgbikgTEFTVF9CSVRTKChrKSA+PiAobSksICgobikgLSAobSkpKQorI2RlZmluZSBNSURETEVfQklUUyhrLCBtLCBuKSBMQVNUX0JJVFMoKGspID4+IChtKSwgKChuKSAtIChtKSArIDEpKQogCiAgICAgdWludDE2X3QgY3JjOwogICAgIHVpbnQzMl90IHY7CkBAIC0zMjYsNyArMzM2LDcgQEAKICAgICAgICAgc3QtPmR1cmF0aW9uID0gYXZfcmVzY2FsZV9xKG1wMy0+ZnJhbWVzLCAoQVZSYXRpb25hbCl7c3BmLCBjLnNhbXBsZV9yYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UpOwogICAgIGlmIChtcDMtPmhlYWRlcl9maWxlc2l6ZSAmJiBtcDMtPmZyYW1lcyAmJiAhbXAzLT5pc19jYnIpCi0gICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBhdl9yZXNjYWxlKG1wMy0+aGVhZGVyX2ZpbGVzaXplLCA4ICogYy5zYW1wbGVfcmF0ZSwgbXAzLT5mcmFtZXMgKiAoaW50NjRfdClzcGYpOworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gYXZfcmVzY2FsZShtcDMtPmhlYWRlcl9maWxlc2l6ZSwgOCAqIGMuc2FtcGxlX3JhdGUsIG1wMy0+ZnJhbWVzICogKGludDY0X3Qpc3BmKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMzM5LDEyICszNDksMTUgQEAKICAgICBpbnQgcmV0OwogICAgIGludCBpOwogCisgICAgcy0+bWV0YWRhdGEgPSBzLT5pbnRlcm5hbC0+aWQzdjJfbWV0YTsKKyAgICBzLT5pbnRlcm5hbC0+aWQzdjJfbWV0YSA9IE5VTEw7CisKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVAzOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVAzOwogICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CiAKQEAgLTM1Nyw3ICszNzAsNyBAQAogICAgIGlmICghYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKQogICAgICAgICBmZl9pZDN2MV9yZWFkKHMpOwogCi0gICAgaWYocy0+cGItPnNlZWthYmxlKQorICAgIGlmKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKQogICAgICAgICBtcDMtPmZpbGVzaXplID0gYXZpb19zaXplKHMtPnBiKTsKIAogICAgIGlmIChtcDNfcGFyc2VfdmJyX3RhZ3Mocywgc3QsIG9mZikgPCAwKQpAQCAtMzc1LDE3ICszODgsMzAgQEAKICAgICAgICAgICAgIGZmaW9fZW5zdXJlX3NlZWtiYWNrKHMtPnBiLCBpICsgMTAyNCArIDQpOwogICAgICAgICBmcmFtZV9zaXplID0gY2hlY2socy0+cGIsIG9mZiArIGksICZoZWFkZXIpOwogICAgICAgICBpZiAoZnJhbWVfc2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgb2ZmLCBTRUVLX1NFVCk7CisgICAgICAgICAgICByZXQgPSBhdmlvX3NlZWsocy0+cGIsIG9mZiwgU0VFS19TRVQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIGZmaW9fZW5zdXJlX3NlZWtiYWNrKHMtPnBiLCBpICsgMTAyNCArIGZyYW1lX3NpemUgKyA0KTsKLSAgICAgICAgICAgIGlmIChjaGVjayhzLT5wYiwgb2ZmICsgaSArIGZyYW1lX3NpemUsICZoZWFkZXIyKSA+PSAwICYmCisgICAgICAgICAgICByZXQgPSBjaGVjayhzLT5wYiwgb2ZmICsgaSArIGZyYW1lX3NpemUsICZoZWFkZXIyKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCAmJgogICAgICAgICAgICAgICAgIChoZWFkZXIgJiBTQU1FX0hFQURFUl9NQVNLKSA9PSAoaGVhZGVyMiAmIFNBTUVfSEVBREVSX01BU0spKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIlNraXBwaW5nICVkIGJ5dGVzIG9mIGp1bmsgYXQgJSJQUklkNjQiLlxuIiwgaSwgb2ZmKTsKLSAgICAgICAgICAgICAgICBhdmlvX3NlZWsocy0+cGIsIG9mZiArIGksIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgaSA+IDAgPyBBVl9MT0dfSU5GTyA6IEFWX0xPR19WRVJCT1NFLCAiU2tpcHBpbmcgJWQgYnl0ZXMgb2YganVuayBhdCAlIlBSSWQ2NCIuXG4iLCBpLCBvZmYpOworICAgICAgICAgICAgICAgIHJldCA9IGF2aW9fc2VlayhzLT5wYiwgb2ZmICsgaSwgU0VFS19TRVQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPT0gQ0hFQ0tfU0VFS19GQUlMRUQpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBmcmFtZSBzaXplICglZCk6IENvdWxkIG5vdCBzZWVrIHRvICUiUFJJZDY0Ii5cbiIsIGZyYW1lX3NpemUsIG9mZiArIGkgKyBmcmFtZV9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZyYW1lX3NpemUgPT0gQ0hFQ0tfU0VFS19GQUlMRUQpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBmcmFtZSBzaXplOiBDb3VsZCBub3Qgc2VlayB0byAlIlBSSWQ2NCIuXG4iLCAoaW50NjRfdCkgKGkgKyAxMDI0ICsgZnJhbWVfc2l6ZSArIDQpKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KLSAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBvZmYsIFNFRUtfU0VUKTsKKyAgICAgICAgcmV0ID0gYXZpb19zZWVrKHMtPnBiLCBvZmYsIFNFRUtfU0VUKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIC8vIHRoZSBzZWVrIGluZGV4IGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIHhpbmcgdmJyIGhlYWRlcnMKQEAgLTQyNywxNiArNDUzLDIyIEBACiBzdGF0aWMgaW50IGNoZWNrKEFWSU9Db250ZXh0ICpwYiwgaW50NjRfdCBwb3MsIHVpbnQzMl90ICpyZXRfaGVhZGVyKQogewogICAgIGludDY0X3QgcmV0ID0gYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKTsKKyAgICB1aW50OF90IGhlYWRlcl9idWZbNF07CiAgICAgdW5zaWduZWQgaGVhZGVyOwogICAgIE1QQURlY29kZUhlYWRlciBzZDsKICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0dXJuIENIRUNLX1NFRUtfRkFJTEVEOwogCi0gICAgaGVhZGVyID0gYXZpb19yYjMyKHBiKTsKKyAgICByZXQgPSBhdmlvX3JlYWQocGIsICZoZWFkZXJfYnVmWzBdLCA0KTsKKyAgICAvKiBXZSBzaG91bGQgYWx3YXlzIGZpbmQgZm91ciBieXRlcyBmb3IgYSB2YWxpZCBtcGEgaGVhZGVyLiAqLworICAgIGlmIChyZXQgPCA0KQorICAgICAgICByZXR1cm4gQ0hFQ0tfU0VFS19GQUlMRUQ7CisKKyAgICBoZWFkZXIgPSBBVl9SQjMyKCZoZWFkZXJfYnVmWzBdKTsKICAgICBpZiAoZmZfbXBhX2NoZWNrX2hlYWRlcihoZWFkZXIpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICByZXR1cm4gQ0hFQ0tfV1JPTkdfSEVBREVSOwogICAgIGlmIChhdnByaXZfbXBlZ2F1ZGlvX2RlY29kZV9oZWFkZXIoJnNkLCBoZWFkZXIpID09IDEpCi0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIENIRUNLX1dST05HX0hFQURFUjsKIAogICAgIGlmIChyZXRfaGVhZGVyKQogICAgICAgICAqcmV0X2hlYWRlciA9IGhlYWRlcjsKQEAgLTQ2OCwxMSArNTAwLDE3IEBACiAKICAgICAgICAgZm9yKGo9MDsgajxNSU5fVkFMSUQ7IGorKykgewogICAgICAgICAgICAgcmV0ID0gY2hlY2socy0+cGIsIHBvcywgTlVMTCk7Ci0gICAgICAgICAgICBpZihyZXQgPCAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgaWYgKCh0YXJnZXRfcG9zIC0gcG9zKSpkaXIgPD0gMCAmJiBhYnMoTUlOX1ZBTElELzItaikgPCBzY29yZSkgeworICAgICAgICAgICAgaWYocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gQ0hFQ0tfV1JPTkdfSEVBREVSKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IENIRUNLX1NFRUtfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3Qgc2VlayB0byAlIlBSSWQ2NCIuXG4iLCBwb3MpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgodGFyZ2V0X3BvcyAtIHBvcykqZGlyIDw9IDAgJiYgRkZBQlMoTUlOX1ZBTElELzItaikgPCBzY29yZSkgewogICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSA9IHBvczsKLSAgICAgICAgICAgICAgICBzY29yZSA9IGFicyhNSU5fVkFMSUQvMi1qKTsKKyAgICAgICAgICAgICAgICBzY29yZSA9IEZGQUJTKE1JTl9WQUxJRC8yLWopOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcG9zICs9IHJldDsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXAzZW5jLmMgYi9saWJhdmZvcm1hdC9tcDNlbmMuYwppbmRleCA3MWY1MTc4Li5kZDY2MmY1IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tcDNlbmMuYworKysgYi9saWJhdmZvcm1hdC9tcDNlbmMuYwpAQCAtMTExLDYgKzExMSw4IEBACiAgICAgdWludDY0X3QgYmFnW1hJTkdfTlVNX0JBR1NdOwogICAgIGludCBpbml0aWFsX2JpdHJhdGU7CiAgICAgaW50IGhhc192YXJpYWJsZV9iaXRyYXRlOworICAgIGludCBkZWxheTsKKyAgICBpbnQgcGFkZGluZzsKIAogICAgIC8qIGluZGV4IG9mIHRoZSBhdWRpbyBzdHJlYW0gKi8KICAgICBpbnQgYXVkaW9fc3RyZWFtX2lkeDsKQEAgLTEyOSw3ICsxMzEsNyBAQAogc3RhdGljIGludCBtcDNfd3JpdGVfeGluZyhBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgTVAzQ29udGV4dCAgICAgICAqbXAzID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbbXAzLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbbXAzLT5hdWRpb19zdHJlYW1faWR4XS0+Y29kZWNwYXI7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmVuYyA9IGF2X2RpY3RfZ2V0KHMtPnN0cmVhbXNbbXAzLT5hdWRpb19zdHJlYW1faWR4XS0+bWV0YWRhdGEsICJlbmNvZGVyIiwgTlVMTCwgMCk7CiAgICAgQVZJT0NvbnRleHQgKmR5bl9jdHg7CiAgICAgaW50MzJfdCAgICAgICAgaGVhZGVyOwpAQCAtMTQyLDE1ICsxNDQsMTUgQEAKICAgICBpbnQgdmVyID0gMDsKICAgICBpbnQgYnl0ZXNfbmVlZGVkOwogCi0gICAgaWYgKCFzLT5wYi0+c2Vla2FibGUgfHwgIW1wMy0+d3JpdGVfeGluZykKKyAgICBpZiAoIShzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgfHwgIW1wMy0+d3JpdGVfeGluZykKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoYXZwcml2X21wYV9mcmVxX3RhYik7IGkrKykgewogICAgICAgICBjb25zdCB1aW50MTZfdCBiYXNlX2ZyZXEgPSBhdnByaXZfbXBhX2ZyZXFfdGFiW2ldOwogCi0gICAgICAgIGlmICAgICAgKGNvZGVjLT5zYW1wbGVfcmF0ZSA9PSBiYXNlX2ZyZXEpICAgICB2ZXIgPSAweDM7IC8vIE1QRUcgMQotICAgICAgICBlbHNlIGlmIChjb2RlYy0+c2FtcGxlX3JhdGUgPT0gYmFzZV9mcmVxIC8gMikgdmVyID0gMHgyOyAvLyBNUEVHIDIKLSAgICAgICAgZWxzZSBpZiAoY29kZWMtPnNhbXBsZV9yYXRlID09IGJhc2VfZnJlcSAvIDQpIHZlciA9IDB4MDsgLy8gTVBFRyAyLjUKKyAgICAgICAgaWYgICAgICAocGFyLT5zYW1wbGVfcmF0ZSA9PSBiYXNlX2ZyZXEpICAgICB2ZXIgPSAweDM7IC8vIE1QRUcgMQorICAgICAgICBlbHNlIGlmIChwYXItPnNhbXBsZV9yYXRlID09IGJhc2VfZnJlcSAvIDIpIHZlciA9IDB4MjsgLy8gTVBFRyAyCisgICAgICAgIGVsc2UgaWYgKHBhci0+c2FtcGxlX3JhdGUgPT0gYmFzZV9mcmVxIC8gNCkgdmVyID0gMHgwOyAvLyBNUEVHIDIuNQogICAgICAgICBlbHNlIGNvbnRpbnVlOwogCiAgICAgICAgIHNyYXRlX2lkeCA9IGk7CkBAIC0xNjEsNyArMTYzLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHN3aXRjaCAoY29kZWMtPmNoYW5uZWxzKSB7CisgICAgc3dpdGNoIChwYXItPmNoYW5uZWxzKSB7CiAgICAgY2FzZSAxOiAgY2hhbm5lbHMgPSBNUEFfTU9OTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICBjYXNlIDI6ICBjaGFubmVscyA9IE1QQV9TVEVSRU87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6IGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIG51bWJlciBvZiBjaGFubmVscywgIgpAQCAtMTc3LDcgKzE3OSw3IEBACiAKICAgICBmb3IgKGJpdHJhdGVfaWR4ID0gMTsgYml0cmF0ZV9pZHggPCAxNTsgYml0cmF0ZV9pZHgrKykgewogICAgICAgICBpbnQgYml0X3JhdGUgPSAxMDAwICogYXZwcml2X21wYV9iaXRyYXRlX3RhYlt2ZXIgIT0gM11bMyAtIDFdW2JpdHJhdGVfaWR4XTsKLSAgICAgICAgaW50IGVycm9yICAgID0gRkZBQlMoYml0X3JhdGUgLSBjb2RlYy0+Yml0X3JhdGUpOworICAgICAgICBpbnQgZXJyb3IgICAgPSBGRkFCUyhiaXRfcmF0ZSAtIHBhci0+Yml0X3JhdGUpOwogCiAgICAgICAgIGlmIChlcnJvciA8IGJlc3RfYml0cmF0ZV9lcnJvcikgewogICAgICAgICAgICAgYmVzdF9iaXRyYXRlX2Vycm9yID0gZXJyb3I7CkBAIC0yNDcsMTIgKzI0OSw3IEBACiAgICAgZmZpb19maWxsKGR5bl9jdHgsIDAsIDgpOyAvLyBlbXB0eSByZXBsYXlnYWluIGZpZWxkcwogICAgIGF2aW9fdzgoZHluX2N0eCwgMCk7ICAgICAgLy8gdW5rbm93biBlbmNvZGluZyBmbGFncwogICAgIGF2aW9fdzgoZHluX2N0eCwgMCk7ICAgICAgLy8gdW5rbm93biBhYnIvbWluaW1hbCBiaXRyYXRlCi0KLSAgICAvLyBlbmNvZGVyIGRlbGF5Ci0gICAgaWYgKGNvZGVjLT5pbml0aWFsX3BhZGRpbmcgLSA1MjggLSAxID49IDEgPDwgMTIpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVG9vIG1hbnkgc2FtcGxlcyBvZiBpbml0aWFsIHBhZGRpbmcuXG4iKTsKLSAgICB9Ci0gICAgYXZpb193YjI0KGR5bl9jdHgsIEZGTUFYKGNvZGVjLT5pbml0aWFsX3BhZGRpbmcgLSA1MjggLSAxLCAwKTw8MTIpOworICAgIGF2aW9fd2IyNChkeW5fY3R4LCAwKTsgICAgLy8gZW1wdHkgZW5jb2RlciBkZWxheS9wYWRkaW5nCiAKICAgICBhdmlvX3c4KGR5bl9jdHgsICAgMCk7IC8vIG1pc2MKICAgICBhdmlvX3c4KGR5bl9jdHgsICAgMCk7IC8vIG1wM2dhaW4KQEAgLTMyMiw3ICszMTksNyBAQAogICAgICAgICAgICAgaWYgKChtcGFoLmJpdF9yYXRlID09IDApIHx8IChtcDMtPmluaXRpYWxfYml0cmF0ZSAhPSBtcGFoLmJpdF9yYXRlKSkKICAgICAgICAgICAgICAgICBtcDMtPmhhc192YXJpYWJsZV9iaXRyYXRlID0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkF1ZGlvIHBhY2tldCBvZiBzaXplICVkIChzdGFydGluZyB3aXRoICUwOFguLi4pICIKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkF1ZGlvIHBhY2tldCBvZiBzaXplICVkIChzdGFydGluZyB3aXRoICUwOCJQUklYMzIiLi4uKSAiCiAgICAgICAgICAgICAgICAgICAgImlzIGludmFsaWQsIHdyaXRpbmcgaXQgYW55d2F5LlxuIiwgcGt0LT5zaXplLCBoKTsKICAgICAgICAgfQogCkBAIC0zNDUsMTAgKzM0MiwyNCBAQAogI2VuZGlmCiAKICAgICAgICAgaWYgKG1wMy0+eGluZ19vZmZzZXQpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnNpZGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBpbnQgc2lkZV9kYXRhX3NpemUgPSAwOworCiAgICAgICAgICAgICBtcDNfeGluZ19hZGRfZnJhbWUobXAzLCBwa3QpOwogICAgICAgICAgICAgbXAzLT5hdWRpb19zaXplICs9IHBrdC0+c2l6ZTsKICAgICAgICAgICAgIG1wMy0+YXVkaW9fY3JjICAgPSBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMTZfQU5TSV9MRSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wMy0+YXVkaW9fY3JjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisKKyAgICAgICAgICAgIHNpZGVfZGF0YSA9IGF2X3BhY2tldF9nZXRfc2lkZV9kYXRhKHBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BLVF9EQVRBX1NLSVBfU0FNUExFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWRlX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAoc2lkZV9kYXRhICYmIHNpZGVfZGF0YV9zaXplID49IDEwKSB7CisgICAgICAgICAgICAgICAgbXAzLT5wYWRkaW5nID0gRkZNQVgoQVZfUkwzMihzaWRlX2RhdGEgKyA0KSArIDUyOCArIDEsIDApOworICAgICAgICAgICAgICAgIGlmICghbXAzLT5kZWxheSkKKyAgICAgICAgICAgICAgICAgICAgbXAzLT5kZWxheSA9ICBGRk1BWChBVl9STDMyKHNpZGVfZGF0YSkgLSA1MjggLSAxLCAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXAzLT5wYWRkaW5nID0gMDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMzU4LDIwICszNjksMTggQEAKIHN0YXRpYyBpbnQgbXAzX3F1ZXVlX2ZsdXNoKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBNUDNDb250ZXh0ICptcDMgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZQYWNrZXRMaXN0ICpwa3RsOworICAgIEFWUGFja2V0IHBrdDsKICAgICBpbnQgcmV0ID0gMCwgd3JpdGUgPSAxOwogCiAgICAgZmZfaWQzdjJfZmluaXNoKCZtcDMtPmlkMywgcy0+cGIsIHMtPm1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nKTsKICAgICBtcDNfd3JpdGVfeGluZyhzKTsKIAotICAgIHdoaWxlICgocGt0bCA9IG1wMy0+cXVldWUpKSB7Ci0gICAgICAgIGlmICh3cml0ZSAmJiAocmV0ID0gbXAzX3dyaXRlX2F1ZGlvX3BhY2tldChzLCAmcGt0bC0+cGt0KSkgPCAwKQorICAgIHdoaWxlIChtcDMtPnF1ZXVlKSB7CisgICAgICAgIGZmX3BhY2tldF9saXN0X2dldCgmbXAzLT5xdWV1ZSwgJm1wMy0+cXVldWVfZW5kLCAmcGt0KTsKKyAgICAgICAgaWYgKHdyaXRlICYmIChyZXQgPSBtcDNfd3JpdGVfYXVkaW9fcGFja2V0KHMsICZwa3QpKSA8IDApCiAgICAgICAgICAgICB3cml0ZSA9IDA7Ci0gICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0bC0+cGt0KTsKLSAgICAgICAgbXAzLT5xdWV1ZSA9IHBrdGwtPm5leHQ7Ci0gICAgICAgIGF2X2ZyZWVwKCZwa3RsKTsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwogICAgIH0KLSAgICBtcDMtPnF1ZXVlX2VuZCA9IE5VTEw7CiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtNDIyLDYgKzQzMSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLyogd3JpdGUgZW5jb2RlciBkZWxheS9wYWRkaW5nICovCisgICAgaWYgKG1wMy0+ZGVsYXkgPj0gMSA8PCAxMikgeworICAgICAgICBtcDMtPmRlbGF5ID0gKDEgPDwgMTIpIC0gMTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVG9vIG1hbnkgc2FtcGxlcyBvZiBpbml0aWFsIHBhZGRpbmcuXG4iKTsKKyAgICB9CisgICAgaWYgKG1wMy0+cGFkZGluZyA+PSAxIDw8IDEyKSB7CisgICAgICAgIG1wMy0+cGFkZGluZyA9ICgxIDw8IDEyKSAtIDE7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlRvbyBtYW55IHNhbXBsZXMgb2YgdHJhaWxpbmcgcGFkZGluZy5cbiIpOworICAgIH0KKyAgICBBVl9XQjI0KG1wMy0+eGluZ19mcmFtZSArIG1wMy0+eGluZ19vZmZzZXQgKyAxNDEsIChtcDMtPmRlbGF5IDw8IDEyKSArIG1wMy0+cGFkZGluZyk7CisKICAgICBBVl9XQjMyKG1wMy0+eGluZ19mcmFtZSArIG1wMy0+eGluZ19vZmZzZXQgKyBYSU5HX1NJWkUgLSA4LCBtcDMtPmF1ZGlvX3NpemUpOwogICAgIEFWX1dCMTYobXAzLT54aW5nX2ZyYW1lICsgbXAzLT54aW5nX29mZnNldCArIFhJTkdfU0laRSAtIDQsIG1wMy0+YXVkaW9fY3JjKTsKIApAQCAtNDY4LDIxICs0ODgsNiBAQAogICAgIHJldHVybiAtMTsKIH0KIAotI2lmIENPTkZJR19NUDJfTVVYRVIKLUFWT3V0cHV0Rm9ybWF0IGZmX21wMl9tdXhlciA9IHsKLSAgICAubmFtZSAgICAgICAgICAgICAgPSAibXAyIiwKLSAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAyIChNUEVHIGF1ZGlvIGxheWVyIDIpIiksCi0gICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL21wZWciLAotICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtcDIsbTJhLG1wYSIsCi0gICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTVAyLAotICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCi0gICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKLSAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCi19OwotI2VuZGlmCi0KLSNpZiBDT05GSUdfTVAzX01VWEVSCi0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CiAgICAgeyAiaWQzdjJfdmVyc2lvbiIsICJTZWxlY3QgSUQzdjIgdmVyc2lvbiB0byB3cml0ZS4gQ3VycmVudGx5IDMgYW5kIDQgYXJlIHN1cHBvcnRlZC4iLAogICAgICAgb2Zmc2V0b2YoTVAzQ29udGV4dCwgaWQzdjJfdmVyc2lvbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSA0fSwgMCwgNCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU19LApAQCAtNTA3LDI2ICs1MTIsMTQgQEAKICAgICBpZiAocGt0LT5zdHJlYW1faW5kZXggPT0gbXAzLT5hdWRpb19zdHJlYW1faWR4KSB7CiAgICAgICAgIGlmIChtcDMtPnBpY3NfdG9fd3JpdGUpIHsKICAgICAgICAgICAgIC8qIGJ1ZmZlciBhdWRpbyBwYWNrZXRzIHVudGlsIHdlIGdldCBhbGwgdGhlIHBpY3R1cmVzICovCi0gICAgICAgICAgICBBVlBhY2tldExpc3QgKnBrdGwgPSBhdl9tYWxsb2N6KHNpemVvZigqcGt0bCkpOwotICAgICAgICAgICAgaW50IHJldDsKLSAgICAgICAgICAgIGlmICghcGt0bCkgeworICAgICAgICAgICAgaW50IHJldCA9IGZmX3BhY2tldF9saXN0X3B1dCgmbXAzLT5xdWV1ZSwgJm1wMy0+cXVldWVfZW5kLCBwa3QsIEZGX1BBQ0tFVExJU1RfRkxBR19SRUZfUEFDS0VUKTsKKworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBidWZmZXIgYXVkaW8uIFNraXBwaW5nIHBpY3R1cmUgc3RyZWFtc1xuIik7CiAgICAgICAgICAgICAgICAgbXAzLT5waWNzX3RvX3dyaXRlID0gMDsKICAgICAgICAgICAgICAgICBtcDNfcXVldWVfZmx1c2gocyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1wM193cml0ZV9hdWRpb19wYWNrZXQocywgcGt0KTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0ID0gYXZfY29weV9wYWNrZXQoJnBrdGwtPnBrdCwgcGt0KTsKLSAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZXAoJnBrdGwpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtcDMtPnF1ZXVlX2VuZCkKLSAgICAgICAgICAgICAgICBtcDMtPnF1ZXVlX2VuZC0+bmV4dCA9IHBrdGw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbXAzLT5xdWV1ZSA9IHBrdGw7Ci0gICAgICAgICAgICBtcDMtPnF1ZXVlX2VuZCA9IHBrdGw7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgcmV0dXJuIG1wM193cml0ZV9hdWRpb19wYWNrZXQocywgcGt0KTsKICAgICB9IGVsc2UgewpAQCAtNTc1LDE0ICs1NjgsMTQgQEAKICAgICBtcDMtPmF1ZGlvX3N0cmVhbV9pZHggPSAtMTsKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBpZiAobXAzLT5hdWRpb19zdHJlYW1faWR4ID49IDAgfHwgc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9NUDMpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGlmIChtcDMtPmF1ZGlvX3N0cmVhbV9pZHggPj0gMCB8fCBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX01QMykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIGF1ZGlvIHN0cmVhbS4gRXhhY3RseSBvbmUgTVAzICIKICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvIHN0cmVhbSBpcyByZXF1aXJlZC5cbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtcDMtPmF1ZGlvX3N0cmVhbV9pZHggPSBpOwotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBhdWRpbyBzdHJlYW1zIGFuZCBwaWN0dXJlcyBhcmUgYWxsb3dlZCBpbiBNUDMuXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KQEAgLTYzMCw0ICs2MjMsMyBAQAogICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKICAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmbXAzX211eGVyX2NsYXNzLAogfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXBjLmMgYi9saWJhdmZvcm1hdC9tcGMuYwppbmRleCBkMGMxYjg1Li5hZjMzMzc0IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tcGMuYworKysgYi9saWJhdmZvcm1hdC9tcGMuYwpAQCAtMjAsNyArMjAsNyBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYXBldGFnLmgiCkBAIC04OSwyMiArODksMjIgQEAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01VU0VQQUNLNzsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMjsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVVTRVBBQ0s3OworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSAyOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7CiAKLSAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIHMtPnBiLCAxNikgPCAwKQorICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsIHN0LT5jb2RlY3Bhciwgcy0+cGIsIDE2KSA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IG1wY19yYXRlW3N0LT5jb2RlYy0+ZXh0cmFkYXRhWzJdICYgM107Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIE1QQ19GUkFNRVNJWkUsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBtcGNfcmF0ZVtzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsyXSAmIDNdOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCBNUENfRlJBTUVTSVpFLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKICAgICAvKiBzY2FuIGZvciBzZWVrcG9pbnRzICovCiAgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOwogICAgIHN0LT5kdXJhdGlvbiA9IGMtPmZjb3VudDsKIAogICAgIC8qIHRyeSB0byByZWFkIEFQRSB0YWdzICovCi0gICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgIGlmIChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CiAgICAgICAgIGZmX2FwZV9wYXJzZV90YWcocyk7CiAgICAgICAgIGlmICghYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXBjOC5jIGIvbGliYXZmb3JtYXQvbXBjOC5jCmluZGV4IGJmNTk3YjguLjc5ZTVmNmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L21wYzguYworKysgYi9saWJhdmZvcm1hdC9tcGM4LmMKQEAgLTIzOSw3ICsyMzksNyBAQAogICAgIGF2aW9fc2tpcChwYiwgNCk7IC8vQ1JDCiAgICAgYy0+dmVyID0gYXZpb19yOChwYik7CiAgICAgaWYoYy0+dmVyICE9IDgpewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBzdHJlYW0gdmVyc2lvbiAlZFxuIiwgYy0+dmVyKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIlN0cmVhbSB2ZXJzaW9uICVkIiwgYy0+dmVyKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KICAgICBjLT5zYW1wbGVzID0gZmZpb19yZWFkX3ZhcmxlbihwYik7CkBAIC0yNDgsMjMgKzI0OCwyMyBAQAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVVTRVBBQ0s4OwotICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NVVNFUEFDSzg7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKIAotICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIDIpIDwgMCkKKyAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzLCBzdC0+Y29kZWNwYXIsIHBiLCAyKSA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gKHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzFdID4+IDQpICsgMTsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gbXBjOF9yYXRlW3N0LT5jb2RlYy0+ZXh0cmFkYXRhWzBdID4+IDVdOwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxMTUyICA8PCAoc3QtPmNvZGVjLT5leHRyYWRhdGFbMV0mMykqMiwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxXSA+PiA0KSArIDE7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IG1wYzhfcmF0ZVtzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVswXSA+PiA1XTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMTE1MiAgPDwgKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzFdJjMpKjIsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIHN0LT5zdGFydF90aW1lID0gMDsKLSAgICBzdC0+ZHVyYXRpb24gPSBjLT5zYW1wbGVzIC8gKDExNTIgPDwgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzFdJjMpKjIpOworICAgIHN0LT5kdXJhdGlvbiA9IGMtPnNhbXBsZXMgLyAoMTE1MiA8PCAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMV0mMykqMik7CiAgICAgc2l6ZSAtPSBhdmlvX3RlbGwocGIpIC0gcG9zOwogICAgIGlmIChzaXplID4gMCkKICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplKTsKIAotICAgIGlmIChwYi0+c2Vla2FibGUpIHsKKyAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgaW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocy0+cGIpOwogICAgICAgICBjLT5hcGV0YWdfc3RhcnQgPSBmZl9hcGVfcGFyc2VfdGFnKHMpOwogICAgICAgICBhdmlvX3NlZWsocy0+cGIsIHBvcywgU0VFS19TRVQpOwpAQCAtMjk3LDcgKzI5Nyw3IEBACiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgICAgICBpZih0YWcgPT0gVEFHX1NUUkVBTUVORCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAgICAgICAgIG1wYzhfaGFuZGxlX2NodW5rKHMsIHRhZywgcG9zLCBzaXplKTsKICAgICB9CiAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXBlZy5jIGIvbGliYXZmb3JtYXQvbXBlZy5jCmluZGV4IDY5Njg1Y2YuLjhhZTQ3NDAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L21wZWcuYworKysgYi9saWJhdmZvcm1hdC9tcGVnLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogTVBFRzEvMiBkZW11eGVyCisgKiBNUEVHLTEvMiBkZW11eGVyCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgRmFicmljZSBCZWxsYXJkCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm1wZWcuaCIKIApAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gLyAyOyAvLyAxIG1vcmUgdGhhbiAubXBnCiAgICAgaWYgKCghIXZpZCBeICEhYXVkaW8pICYmIChhdWRpbyA+IDQgfHwgdmlkID4gMSkgJiYgIXN5cyAmJgogICAgICAgICAhcHNwYWNrICYmIHAtPmJ1Zl9zaXplID4gMjA0OCAmJiB2aWQgKyBhdWRpbyA+IGludmFsaWQpIC8qIFBFUyBzdHJlYW0gKi8KLSAgICAgICAgcmV0dXJuIChhdWRpbyA+IDEyIHx8IHZpZCA+IDMgKyAyICogaW52YWxpZCkgPyBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDIKKyAgICAgICAgcmV0dXJuIChhdWRpbyA+IDEyIHx8IHZpZCA+IDYgKyAyICogaW52YWxpZCkgPyBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiArIDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTiAvIDI7CiAKICAgICAvLyAwMi1QZW5ndWluLmZsYWMgaGFzIHN5czowIHByaXYxOjAgcHNwYWNrOjAgdmlkOjAgYXVkaW86MQpAQCAtMTI4LDYgKzEyOSw3IEBACiAgICAgaW50IHNvZmRlYzsKICAgICBpbnQgZHZkOwogICAgIGludCBpbWtoX2NjdHY7CisgICAgaW50IHJhd19hYzM7CiAjaWYgQ09ORklHX1ZPQlNVQl9ERU1VWEVSCiAgICAgQVZGb3JtYXRDb250ZXh0ICpzdWJfY3R4OwogICAgIEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSBxWzMyXTsKQEAgLTEzOCw3ICsxNDAsNyBAQAogc3RhdGljIGludCBtcGVncHNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIE1wZWdEZW11eENvbnRleHQgKm0gPSBzLT5wcml2X2RhdGE7Ci0gICAgY2hhciBidWZmZXJbN107CisgICAgY2hhciBidWZmZXJbN10gPSB7IDAgfTsKICAgICBpbnQ2NF90IGxhc3RfcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKIAogICAgIG0tPmhlYWRlcl9zdGF0ZSA9IDB4ZmY7CkBAIC0zNzEsNyArMzczLDcgQEAKICAgICAgICAgICAgIGdvdG8gZXJyb3JfcmVkbzsKICAgICAgICAgYyA9IGF2aW9fcjgocy0+cGIpOwogICAgICAgICBsZW4tLTsKLSAgICAgICAgLyogWFhYOiBmb3IgbXBlZzEsIHNob3VsZCB0ZXN0IG9ubHkgYml0IDcgKi8KKyAgICAgICAgLyogWFhYOiBmb3IgTVBFRy0xLCBzaG91bGQgdGVzdCBvbmx5IGJpdCA3ICovCiAgICAgICAgIGlmIChjICE9IDB4ZmYpCiAgICAgICAgICAgICBicmVhazsKICAgICB9CkBAIC00NDIsOCArNDQ0LDI0IEBACiAgICAgfQogCiAgICAgaWYgKHN0YXJ0Y29kZSA9PSBQUklWQVRFX1NUUkVBTV8xKSB7CisgICAgICAgIGludCByZXQgPSBmZmlvX2Vuc3VyZV9zZWVrYmFjayhzLT5wYiwgMik7CisKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCiAgICAgICAgIHN0YXJ0Y29kZSA9IGF2aW9fcjgocy0+cGIpOwotICAgICAgICBsZW4tLTsKKyAgICAgICAgbS0+cmF3X2FjMyA9IDA7CisgICAgICAgIGlmIChzdGFydGNvZGUgPT0gMHgwYikgeworICAgICAgICAgICAgaWYgKGF2aW9fcjgocy0+cGIpID09IDB4NzcpIHsKKyAgICAgICAgICAgICAgICBzdGFydGNvZGUgPSAweDgwOworICAgICAgICAgICAgICAgIG0tPnJhd19hYzMgPSAxOworICAgICAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgLTIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxlbi0tOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChsZW4gPCAwKQogICAgICAgICBnb3RvIGVycm9yX3JlZG87CkBAIC00NTEsNyArNDY5LDcgQEAKICAgICAgICAgaW50IGk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgIGlmIChzdGFydGNvZGUgPT0gcy0+c3RyZWFtc1tpXS0+aWQgJiYKLSAgICAgICAgICAgICAgICBzLT5wYi0+c2Vla2FibGUgLyogaW5kZXggdXNlbGVzcyBvbiBzdHJlYW1zIGFueXdheSAqLykgeworICAgICAgICAgICAgICAgIChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgLyogaW5kZXggdXNlbGVzcyBvbiBzdHJlYW1zIGFueXdheSAqLykgewogICAgICAgICAgICAgICAgIGZmX3JlZHVjZV9pbmRleChzLCBpKTsKICAgICAgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkocy0+c3RyZWFtc1tpXSwgKnBwb3MsIGR0cywgMCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZJTkRFWF9LRVlGUkFNRSAvKiBGSVhNRSBrZXlmcmFtZT8gKi8pOwpAQCAtNDg2LDE0ICs1MDQsMTYgQEAKICAgICAgICAgaWYgKGxlbiA8IDQpCiAgICAgICAgICAgICBnb3RvIHNraXA7CiAKLSAgICAgICAgLyogYXVkaW86IHNraXAgaGVhZGVyICovCi0gICAgICAgIGF2aW9fcjgocy0+cGIpOwotICAgICAgICBscGNtX2hlYWRlcl9sZW4gPSBhdmlvX3JiMTYocy0+cGIpOwotICAgICAgICBsZW4gLT0gMzsKLSAgICAgICAgaWYgKHN0YXJ0Y29kZSA+PSAweGIwICYmIHN0YXJ0Y29kZSA8PSAweGJmKSB7Ci0gICAgICAgICAgICAvKiBNTFAvVHJ1ZUhEIGF1ZGlvIGhhcyBhIDQtYnl0ZSBoZWFkZXIgKi8KKyAgICAgICAgaWYgKCFtLT5yYXdfYWMzKSB7CisgICAgICAgICAgICAvKiBhdWRpbzogc2tpcCBoZWFkZXIgKi8KICAgICAgICAgICAgIGF2aW9fcjgocy0+cGIpOwotICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICBscGNtX2hlYWRlcl9sZW4gPSBhdmlvX3JiMTYocy0+cGIpOworICAgICAgICAgICAgbGVuIC09IDM7CisgICAgICAgICAgICBpZiAoc3RhcnRjb2RlID49IDB4YjAgJiYgc3RhcnRjb2RlIDw9IDB4YmYpIHsKKyAgICAgICAgICAgICAgICAvKiBNTFAvVHJ1ZUhEIGF1ZGlvIGhhcyBhIDQtYnl0ZSBoZWFkZXIgKi8KKyAgICAgICAgICAgICAgICBhdmlvX3I4KHMtPnBiKTsKKyAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNTY4LDcgKzU4OCw3IEBACiAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFRTOwogICAgIH0gZWxzZSBpZiAoc3RhcnRjb2RlID49IDB4YTAgJiYgc3RhcnRjb2RlIDw9IDB4YWYpIHsKICAgICAgICAgdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIGlmIChscGNtX2hlYWRlcl9sZW4gPT0gNikgeworICAgICAgICBpZiAobHBjbV9oZWFkZXJfbGVuID49IDYgJiYgc3RhcnRjb2RlID09IDB4YTEpIHsKICAgICAgICAgICAgIGNvZGVjX2lkID0gQVZfQ09ERUNfSURfTUxQOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fRFZEOwpAQCAtNTk3LDEzICs2MTcsMTMgQEAKICAgICBpZiAoIXN0KQogICAgICAgICBnb3RvIHNraXA7CiAgICAgc3QtPmlkICAgICAgICAgICAgICAgID0gc3RhcnRjb2RlOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IHR5cGU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gY29kZWNfaWQ7Ci0gICAgaWYgKCAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX01VTEFXCi0gICAgICAgIHx8IHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0FMQVcpIHsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gdHlwZTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBjb2RlY19pZDsKKyAgICBpZiAoICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fTVVMQVcKKyAgICAgICAgfHwgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fQUxBVykgeworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gODAwMDsKICAgICB9CiAgICAgc3QtPnJlcXVlc3RfcHJvYmUgICAgID0gcmVxdWVzdF9wcm9iZTsKICAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwpAQCAtNjEyLDcgKzYzMiw3IEBACiAgICAgaWYgKHN0LT5kaXNjYXJkID49IEFWRElTQ0FSRF9BTEwpCiAgICAgICAgIGdvdG8gc2tpcDsKICAgICBpZiAoc3RhcnRjb2RlID49IDB4YTAgJiYgc3RhcnRjb2RlIDw9IDB4YWYpIHsKLSAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01MUCkgeworICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUxQKSB7CiAgICAgICAgICAgICBpZiAobGVuIDwgNikKICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIDYpOwpAQCAtNzAzLDcgKzcyMyw3IEBACiAKICAgICBpZiAoIXZvYnN1Yi0+c3ViX25hbWUpIHsKICAgICAgICAgY2hhciAqZXh0OwotICAgICAgICB2b2JzdWItPnN1Yl9uYW1lID0gYXZfc3RyZHVwKHMtPmZpbGVuYW1lKTsKKyAgICAgICAgdm9ic3ViLT5zdWJfbmFtZSA9IGF2X3N0cmR1cChzLT51cmwpOwogICAgICAgICBpZiAoIXZvYnN1Yi0+c3ViX25hbWUpIHsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZW5kOwpAQCAtNzE4LDcgKzczOCw3IEBACiAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgfQogICAgICAgICBtZW1jcHkoZXh0LCAhc3RybmNtcChleHQsICJJRFgiLCAzKSA/ICJTVUIiIDogInN1YiIsIDMpOwotICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJJRFgvU1VCOiAlcyAtPiAlc1xuIiwgcy0+ZmlsZW5hbWUsIHZvYnN1Yi0+c3ViX25hbWUpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJJRFgvU1VCOiAlcyAtPiAlc1xuIiwgcy0+dXJsLCB2b2JzdWItPnN1Yl9uYW1lKTsKICAgICB9CiAKICAgICBpZiAoIShpZm9ybWF0ID0gYXZfZmluZF9pbnB1dF9mb3JtYXQoIm1wZWciKSkpIHsKQEAgLTczMiw3ICs3NTIsNyBAQAogICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKLSAgICBpZiAoKHJldCA9IGZmX2NvcHlfd2hpdGVsaXN0cyh2b2JzdWItPnN1Yl9jdHgsIHMpKSA8IDApCisgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlYmxhY2tsaXN0cyh2b2JzdWItPnN1Yl9jdHgsIHMpKSA8IDApCiAgICAgICAgIGdvdG8gZW5kOwogCiAgICAgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmdm9ic3ViLT5zdWJfY3R4LCB2b2JzdWItPnN1Yl9uYW1lLCBpZm9ybWF0LCBOVUxMKTsKQEAgLTc5MSw4ICs4MTEsOCBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgc3QtPmlkID0gc3RyZWFtX2lkOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9EVkRfU1VCVElUTEU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0RWRF9TVUJUSVRMRTsKICAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMCk7CiAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgaWQsIDApOwogICAgICAgICAgICAgICAgIGlmIChhbHRbMF0pCkBAIC04NjksOCArODg5LDggQEAKICAgICBhdl9icHJpbnRfZmluYWxpemUoJmhlYWRlciwgJmhlYWRlcl9zdHIpOwogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN1Yl9zdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgIHN1Yl9zdC0+Y29kZWMtPmV4dHJhZGF0YSAgICAgID0gYXZfc3RyZHVwKGhlYWRlcl9zdHIpOwotICAgICAgICBzdWJfc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IGhlYWRlci5sZW47CisgICAgICAgIHN1Yl9zdC0+Y29kZWNwYXItPmV4dHJhZGF0YSAgICAgID0gYXZfc3RyZHVwKGhlYWRlcl9zdHIpOworICAgICAgICBzdWJfc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IGhlYWRlci5sZW47CiAgICAgfQogICAgIGF2X2ZyZWUoaGVhZGVyX3N0cik7CiAKQEAgLTg4NCw3ICs5MDQsNyBAQAogICAgIEZGRGVtdXhTdWJ0aXRsZXNRdWV1ZSAqcTsKICAgICBBVklPQ29udGV4dCAqcGIgPSB2b2JzdWItPnN1Yl9jdHgtPnBiOwogICAgIGludCByZXQsIHBzaXplLCB0b3RhbF9yZWFkID0gMCwgaTsKLSAgICBBVlBhY2tldCBpZHhfcGt0OworICAgIEFWUGFja2V0IGlkeF9wa3QgPSB7IDAgfTsKIAogICAgIGludDY0X3QgbWluX3RzID0gSU5UNjRfTUFYOwogICAgIGludCBzaWQgPSAwOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXBlZy5oIGIvbGliYXZmb3JtYXQvbXBlZy5oCmluZGV4IGI0MzUxN2MuLjYxN2UzNmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L21wZWcuaAorKysgYi9saWJhdmZvcm1hdC9tcGVnLmgKQEAgLTEsNSArMSw1IEBACiAvKgotICogTVBFRzEvMiBtdXhlciBhbmQgZGVtdXhlciBjb21tb24gZGVmaW5lcworICogTVBFRy0xLzIgbXV4ZXIgYW5kIGRlbXV4ZXIgY29tbW9uIGRlZmluZXMKICAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwMSwgMjAwMiBGYWJyaWNlIEJlbGxhcmQKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tcGVnZW5jLmMgYi9saWJhdmZvcm1hdC9tcGVnZW5jLmMKaW5kZXggMmUwOTU0OS4uNGM2ZmE2NyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbXBlZ2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L21wZWdlbmMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBNUEVHMS8yIG11eGVyCisgKiBNUEVHLTEvMiBtdXhlcgogICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDAxLCAyMDAyIEZhYnJpY2UgQmVsbGFyZAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KQEAgLTE1MSw3ICsxNTEsNyBAQAogICAgICAgICBwdXRfYml0cygmcGIsIDEsIDEpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8qIHZhcmlhYmxlIGJpdHJhdGUgKi8KLSAgICAgICAgcHV0X2JpdHMoJnBiLCAxLCAwKTsgLyogbm9uIGNvbnN0cmFpbnRlZCBiaXQgc3RyZWFtICovCisgICAgICAgIHB1dF9iaXRzKCZwYiwgMSwgMCk7IC8qIG5vbmNvbnN0cmFpbmVkIGJpdHN0cmVhbSAqLwogICAgIH0KIAogICAgIGlmIChzLT5pc192Y2QgfHwgcy0+aXNfZHZkKSB7CkBAIC0zNDgsMzUgKzM0OCw1MCBAQAogCiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCA5MDAwMCk7CiAKLSAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpIHsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CiAgICAgICAgICAgICBpZiAoIXMtPmlzX21wZWcyICYmCi0gICAgICAgICAgICAgICAgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzIHx8Ci0gICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFRTIHx8Ci0gICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkJFKSkKKyAgICAgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMgfHwKKyAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVFMgfHwKKyAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2QkUgfHwKKyAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fRFZEKSkKICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgaW4gTVBFRy0xIHN5c3RlbSBzdHJlYW1zIGlzIG5vdCB3aWRlbHkgc3VwcG9ydGVkLCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc2lkZXIgdXNpbmcgdGhlIHZvYiBvciB0aGUgZHZkIG11eGVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBmb3JjZSBhIE1QRUctMiBwcm9ncmFtIHN0cmVhbS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlYy0+Y29kZWNfaWQpKTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSk7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKICAgICAgICAgICAgICAgICBzdHJlYW0tPmlkID0gYWMzX2lkKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFRTKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFRTKSB7CiAgICAgICAgICAgICAgICAgc3RyZWFtLT5pZCA9IGR0c19pZCsrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZCRSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZCRSB8fAorICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9EVkQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgIT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSAxNiBiaXQgTFBDTSBzdHJlYW1zIGNhbiBiZSBtdXhlZC5cbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN0cmVhbS0+aWQgPSBscGNtX2lkKys7CiAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobHBjbV9mcmVxX3RhYltqXSA9PSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKQorICAgICAgICAgICAgICAgICAgICBpZiAobHBjbV9mcmVxX3RhYltqXSA9PSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChqID09IDQpCisgICAgICAgICAgICAgICAgaWYgKGogPT0gNCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc3I7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2FtcGxpbmcgcmF0ZSBmb3IgUENNIHN0cmVhbS5cbiIpOworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfSU5GTywgIkFsbG93ZWQgc2FtcGxpbmcgcmF0ZXM6Iik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc3IgPSAwOyBzciA8IDQ7IHNyKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0lORk8sICIgJWQiLCBscGNtX2ZyZXFfdGFiW3NyXSk7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiXG4iKTsKICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID4gOCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQXQgbW9zdCA4IGNoYW5uZWxzIGFsbG93ZWQgZm9yIExQQ00gc3RyZWFtcy5cbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHN0cmVhbS0+bHBjbV9oZWFkZXJbMF0gPSAweDBjOwotICAgICAgICAgICAgICAgIHN0cmVhbS0+bHBjbV9oZWFkZXJbMV0gPSAoc3QtPmNvZGVjLT5jaGFubmVscyAtIDEpIHwgKGogPDwgNCk7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5scGNtX2hlYWRlclsxXSA9IChzdC0+Y29kZWNwYXItPmNoYW5uZWxzIC0gMSkgfCAoaiA8PCA0KTsKICAgICAgICAgICAgICAgICBzdHJlYW0tPmxwY21faGVhZGVyWzJdID0gMHg4MDsKLSAgICAgICAgICAgICAgICBzdHJlYW0tPmxwY21fYWxpZ24gICAgID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIDI7CisgICAgICAgICAgICAgICAgc3RyZWFtLT5scGNtX2FsaWduICAgICA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiAyOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBzdHJlYW0tPmlkID0gbXBhX2lkKys7CiAgICAgICAgICAgICB9CkBAIC0zODcsNyArNDAyLDcgQEAKICAgICAgICAgICAgIHMtPmF1ZGlvX2JvdW5kKys7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQorICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkKICAgICAgICAgICAgICAgICBzdHJlYW0tPmlkID0gaDI2NF9pZCsrOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHN0cmVhbS0+aWQgPSBtcHZfaWQrKzsKQEAgLTM5Nyw3ICs0MTIsNyBAQAogICAgICAgICAgICAgICAgIHN0cmVhbS0+bWF4X2J1ZmZlcl9zaXplID0gNiAqIDEwMjQgKyBwcm9wcy0+YnVmZmVyX3NpemUgLyA4OwogICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICJWQlYgYnVmZmVyIHNpemUgbm90IHNldCwgdXNpbmcgZGVmYXVsdCBzaXplIG9mIDEzMEtCXG4iCisgICAgICAgICAgICAgICAgICAgICAgICJWQlYgYnVmZmVyIHNpemUgbm90IHNldCwgdXNpbmcgZGVmYXVsdCBzaXplIG9mIDIzMEtCXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICJJZiB5b3Ugd2FudCB0aGUgbXBlZyBmaWxlIHRvIGJlIGNvbXBsaWFudCB0byBzb21lIHNwZWNpZmljYXRpb25cbiIKICAgICAgICAgICAgICAgICAgICAgICAgIkxpa2UgRFZELCBWQ0Qgb3Igb3RoZXJzLCBtYWtlIHN1cmUgeW91IHNldCB0aGUgY29ycmVjdCBidWZmZXIgc2l6ZVxuIik7CiAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgcHJvYmFibHkgdG9vIHNtYWxsIGFzIGRlZmF1bHQKQEAgLTQxNSw3ICs0MzAsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1lZGlhIHR5cGUgJXMgZm9yIG91dHB1dCBzdHJlYW0gIyVkXG4iLAotICAgICAgICAgICAgICAgICAgIGF2X2dldF9tZWRpYV90eXBlX3N0cmluZyhzdC0+Y29kZWMtPmNvZGVjX3R5cGUpLCBpKTsKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlKSwgaSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAgICAgICAgIHN0cmVhbS0+ZmlmbyA9IGF2X2ZpZm9fYWxsb2MoMTYpOwpAQCAtNDM1LDcgKzQ1MCw3IEBACiAgICAgICAgIGlmIChwcm9wcykKICAgICAgICAgICAgIGNvZGVjX3JhdGUgPSBwcm9wcy0+bWF4X2JpdHJhdGU7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNvZGVjX3JhdGUgPSBzdC0+Y29kZWMtPmJpdF9yYXRlOworICAgICAgICAgICAgY29kZWNfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+Yml0X3JhdGU7CiAKICAgICAgICAgaWYgKCFjb2RlY19yYXRlKQogICAgICAgICAgICAgY29kZWNfcmF0ZSA9ICgxIDw8IDIxKSAqIDggKiA1MCAvIGN0eC0+bmJfc3RyZWFtczsKQEAgLTQ0NCw3ICs0NTksNyBAQAogCiAgICAgICAgIGlmICgoc3RyZWFtLT5pZCAmIDB4ZTApID09IEFVRElPX0lEKQogICAgICAgICAgICAgYXVkaW9fYml0cmF0ZSArPSBjb2RlY19yYXRlOwotICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICAgICAgdmlkZW9fYml0cmF0ZSArPSBjb2RlY19yYXRlOwogICAgIH0KIApAQCAtOTg0LDcgKzk5OSw3IEBACiAgICAgICAgIC8qIGZvciBzdWJ0aXRsZSwgYSBzaW5nbGUgUEVTIHBhY2tldCBtdXN0IGJlIGdlbmVyYXRlZCwKICAgICAgICAgICogc28gd2UgZmx1c2ggYWZ0ZXIgZXZlcnkgc2luZ2xlIHN1YnRpdGxlIHBhY2tldCAqLwogICAgICAgICBpZiAocy0+cGFja2V0X3NpemUgPiBhdmFpbF9kYXRhICYmICFmbHVzaAotICAgICAgICAgICAgJiYgc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkKKyAgICAgICAgICAgICYmIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfU1VCVElUTEUpCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgaWYgKGF2YWlsX2RhdGEgPT0gMCkKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTExNSw3ICsxMTMwLDcgQEAKICAgICBpbnQ2NF90IHB0cywgZHRzOwogICAgIFBhY2tldERlc2MgKnBrdF9kZXNjOwogICAgIGludCBwcmVsb2FkOwotICAgIGNvbnN0IGludCBpc19pZnJhbWUgPSBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgY29uc3QgaW50IGlzX2lmcmFtZSA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpOwogCiAgICAgcHJlbG9hZCA9IGF2X3Jlc2NhbGUocy0+cHJlbG9hZCwgOTAwMDAsIEFWX1RJTUVfQkFTRSk7CkBAIC0xMTQ2LDggKzExNjEsMjMgQEAKICAgICAgICAgc3RyZWFtLT5uZXh0X3BhY2tldCA9ICZzdHJlYW0tPnByZW11eF9wYWNrZXQ7CiAgICAgKnN0cmVhbS0+bmV4dF9wYWNrZXQgICAgID0KICAgICBwa3RfZGVzYyAgICAgICAgICAgICAgICAgPSBhdl9tYWxsb2N6KHNpemVvZihQYWNrZXREZXNjKSk7CisgICAgaWYgKCFwa3RfZGVzYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBwa3RfZGVzYy0+cHRzICAgICAgICAgICAgPSBwdHM7CiAgICAgcGt0X2Rlc2MtPmR0cyAgICAgICAgICAgID0gZHRzOworCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0RWRCkgeworICAgICAgICBpZiAoc2l6ZSA8IDMpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFja2V0IHNpemUgJWRcbiIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNraXAgZmlyc3QgMyBieXRlcyBvZiBwYWNrZXQgZGF0YSwgd2hpY2ggY29tcHJpc2UgUENNIGhlYWRlcgorICAgICAgICAgICBhbmQgd2lsbCBiZSB3cml0dGVuIGZyZXNoIGJ5IHRoaXMgbXV4ZXIuICovCisgICAgICAgIGJ1ZiArPSAzOworICAgICAgICBzaXplIC09IDM7CisgICAgfQorCiAgICAgcGt0X2Rlc2MtPnVud3JpdHRlbl9zaXplID0KICAgICBwa3RfZGVzYy0+c2l6ZSAgICAgICAgICAgPSBzaXplOwogICAgIGlmICghc3RyZWFtLT5wcmVkZWNvZGVfcGFja2V0KQpAQCAtMTE5MCw3ICsxMjIwLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIC8qIEVuZCBoZWFkZXIgYWNjb3JkaW5nIHRvIE1QRUcxIHN5c3RlbXMgc3RhbmRhcmQuIFdlIGRvIG5vdCB3cml0ZQorICAgIC8qIEVuZCBoZWFkZXIgYWNjb3JkaW5nIHRvIE1QRUctMSBzeXN0ZW1zIHN0YW5kYXJkLiBXZSBkbyBub3Qgd3JpdGUKICAgICAgKiBpdCBhcyBpdCBpcyB1c3VhbGx5IG5vdCBuZWVkZWQgYnkgZGVjb2RlcnMgYW5kIGJlY2F1c2UgaXQKICAgICAgKiBjb21wbGljYXRlcyBNUEVHIHN0cmVhbSBjb25jYXRlbmF0aW9uLiAqLwogICAgIC8vIGF2aW9fd2IzMihjdHgtPnBiLCBJU09fMTExNzJfRU5EX0NPREUpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXBlZ3RzLmMgYi9saWJhdmZvcm1hdC9tcGVndHMuYwppbmRleCAyMjg3NGU2Li45MmJhY2E2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tcGVndHMuYworKysgYi9saWJhdmZvcm1hdC9tcGVndHMuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBNUEVHMiB0cmFuc3BvcnQgc3RyZWFtIChha2EgRFZCKSBkZW11eGVyCisgKiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSAoYWthIERWQikgZGVtdXhlcgogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMgRmFicmljZSBCZWxsYXJkCiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgpAQCAtMzgsOCArMzgsOCBAQAogI2luY2x1ZGUgIm1wZWcuaCIKICNpbmNsdWRlICJpc29tLmgiCiAKLS8qIG1heGltdW0gc2l6ZSBpbiB3aGljaCB3ZSBsb29rIGZvciBzeW5jaHJvbmlzYXRpb24gaWYKLSAqIHN5bmNocm9uaXNhdGlvbiBpcyBsb3N0ICovCisvKiBtYXhpbXVtIHNpemUgaW4gd2hpY2ggd2UgbG9vayBmb3Igc3luY2hyb25pemF0aW9uIGlmCisgKiBzeW5jaHJvbml6YXRpb24gaXMgbG9zdCAqLwogI2RlZmluZSBNQVhfUkVTWU5DX1NJWkUgNjU1MzYKIAogI2RlZmluZSBNQVhfUEVTX1BBWUxPQUQgMjAwICogMTAyNApAQCAtMTcwLDggKzE3MCw4IEBACiAgICAgIHsuaTY0ID0gMX0sIDAsIDEsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNIH0sCiAgICAgeyJ0c19wYWNrZXRzaXplIiwgIm91dHB1dCBvcHRpb24gY2FycnlpbmcgdGhlIHJhdyBwYWNrZXQgc2l6ZSIsIG9mZnNldG9mKE1wZWdUU0NvbnRleHQsIHJhd19wYWNrZXRfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwKICAgICAgey5pNjQgPSAwfSwgMCwgMCwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfCBBVl9PUFRfRkxBR19FWFBPUlQgfCBBVl9PUFRfRkxBR19SRUFET05MWSB9LAotICAgIHsic2Nhbl9hbGxfcG10cyIsICAgInNjYW4gYW5kIGNvbWJpbmUgYWxsIFBNVHMiLCBvZmZzZXRvZihNcGVnVFNDb250ZXh0LCBzY2FuX2FsbF9wbXRzKSwgQVZfT1BUX1RZUEVfQk9PTCwKLSAgICAgeyAuaTY0ID0gIC0xfSwgLTEsIDEsICBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSB9LAorICAgIHsic2Nhbl9hbGxfcG10cyIsICJzY2FuIGFuZCBjb21iaW5lIGFsbCBQTVRzIiwgb2Zmc2V0b2YoTXBlZ1RTQ29udGV4dCwgc2Nhbl9hbGxfcG10cyksIEFWX09QVF9UWVBFX0JPT0wsCisgICAgIHsuaTY0ID0gLTF9LCAtMSwgMSwgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0gfSwKICAgICB7InNraXBfY2hhbmdlcyIsICJza2lwIGNoYW5naW5nIC8gYWRkaW5nIHN0cmVhbXMgLyBwcm9ncmFtcyIsIG9mZnNldG9mKE1wZWdUU0NvbnRleHQsIHNraXBfY2hhbmdlcyksIEFWX09QVF9UWVBFX0JPT0wsCiAgICAgIHsuaTY0ID0gMH0sIDAsIDEsIDAgfSwKICAgICB7InNraXBfY2xlYXIiLCAic2tpcCBjbGVhcmluZyBwcm9ncmFtcyIsIG9mZnNldG9mKE1wZWdUU0NvbnRleHQsIHNraXBfY2xlYXIpLCBBVl9PUFRfVFlQRV9CT09MLApAQCAtMjM1LDYgKzIzNSw3IEBACiAgICAgaW50IHRvdGFsX3NpemU7CiAgICAgaW50IHBlc19oZWFkZXJfc2l6ZTsKICAgICBpbnQgZXh0ZW5kZWRfc3RyZWFtX2lkOworICAgIHVpbnQ4X3Qgc3RyZWFtX2lkOwogICAgIGludDY0X3QgcHRzLCBkdHM7CiAgICAgaW50NjRfdCB0c19wYWNrZXRfcG9zOyAvKio8IHBvc2l0aW9uIG9mIGZpcnN0IFRTIHBhY2tldCBvZiB0aGlzIFBFUyBwYWNrZXQgKi8KICAgICB1aW50OF90IGhlYWRlcltNQVhfUEVTX0hFQURFUl9TSVpFXTsKQEAgLTM5MCw3ICszOTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBpbnQgaXNfc3RhcnQpCiB7CiAgICAgTXBlZ1RTU2VjdGlvbkZpbHRlciAqdHNzID0gJnRzczEtPnUuc2VjdGlvbl9maWx0ZXI7Ci0gICAgaW50IGxlbjsKKyAgICB1aW50OF90ICpjdXJfc2VjdGlvbl9idWYgPSBOVUxMOworICAgIGludCBsZW4sIG9mZnNldDsKIAogICAgIGlmIChpc19zdGFydCkgewogICAgICAgICBtZW1jcHkodHNzLT5zZWN0aW9uX2J1ZiwgYnVmLCBidWZfc2l6ZSk7CkBAIC00MDAsNDIgKzQwMiw1NCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICh0c3MtPmVuZF9vZl9zZWN0aW9uX3JlYWNoZWQpCiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGxlbiA9IDQwOTYgLSB0c3MtPnNlY3Rpb25faW5kZXg7CisgICAgICAgIGxlbiA9IE1BWF9TRUNUSU9OX1NJWkUgLSB0c3MtPnNlY3Rpb25faW5kZXg7CiAgICAgICAgIGlmIChidWZfc2l6ZSA8IGxlbikKICAgICAgICAgICAgIGxlbiA9IGJ1Zl9zaXplOwogICAgICAgICBtZW1jcHkodHNzLT5zZWN0aW9uX2J1ZiArIHRzcy0+c2VjdGlvbl9pbmRleCwgYnVmLCBsZW4pOwogICAgICAgICB0c3MtPnNlY3Rpb25faW5kZXggKz0gbGVuOwogICAgIH0KIAotICAgIC8qIGNvbXB1dGUgc2VjdGlvbiBsZW5ndGggaWYgcG9zc2libGUgKi8KLSAgICBpZiAodHNzLT5zZWN0aW9uX2hfc2l6ZSA9PSAtMSAmJiB0c3MtPnNlY3Rpb25faW5kZXggPj0gMykgewotICAgICAgICBsZW4gPSAoQVZfUkIxNih0c3MtPnNlY3Rpb25fYnVmICsgMSkgJiAweGZmZikgKyAzOwotICAgICAgICBpZiAobGVuID4gNDA5NikKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgdHNzLT5zZWN0aW9uX2hfc2l6ZSA9IGxlbjsKLSAgICB9Ci0KLSAgICBpZiAodHNzLT5zZWN0aW9uX2hfc2l6ZSAhPSAtMSAmJgotICAgICAgICB0c3MtPnNlY3Rpb25faW5kZXggPj0gdHNzLT5zZWN0aW9uX2hfc2l6ZSkgewotICAgICAgICBpbnQgY3JjX3ZhbGlkID0gMTsKLSAgICAgICAgdHNzLT5lbmRfb2Zfc2VjdGlvbl9yZWFjaGVkID0gMTsKLQotICAgICAgICBpZiAodHNzLT5jaGVja19jcmMpIHsKLSAgICAgICAgICAgIGNyY192YWxpZCA9ICFhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRSksIC0xLCB0c3MtPnNlY3Rpb25fYnVmLCB0c3MtPnNlY3Rpb25faF9zaXplKTsKLSAgICAgICAgICAgIGlmICh0c3MtPnNlY3Rpb25faF9zaXplID49IDQpCi0gICAgICAgICAgICAgICAgdHNzLT5jcmMgPSBBVl9SQjMyKHRzcy0+c2VjdGlvbl9idWYgKyB0c3MtPnNlY3Rpb25faF9zaXplIC0gNCk7Ci0KLSAgICAgICAgICAgIGlmIChjcmNfdmFsaWQpIHsKLSAgICAgICAgICAgICAgICB0cy0+Y3JjX3ZhbGlkaXR5WyB0c3MxLT5waWQgXSA9IDEwMDsKLSAgICAgICAgICAgIH1lbHNlIGlmICh0cy0+Y3JjX3ZhbGlkaXR5WyB0c3MxLT5waWQgXSA+IC0xMCkgewotICAgICAgICAgICAgICAgIHRzLT5jcmNfdmFsaWRpdHlbIHRzczEtPnBpZCBdLS07Ci0gICAgICAgICAgICB9ZWxzZQotICAgICAgICAgICAgICAgIGNyY192YWxpZCA9IDI7CisgICAgb2Zmc2V0ID0gMDsKKyAgICBjdXJfc2VjdGlvbl9idWYgPSB0c3MtPnNlY3Rpb25fYnVmOworICAgIHdoaWxlIChjdXJfc2VjdGlvbl9idWYgLSB0c3MtPnNlY3Rpb25fYnVmIDwgTUFYX1NFQ1RJT05fU0laRSAmJiBjdXJfc2VjdGlvbl9idWZbMF0gIT0gMHhmZikgeworICAgICAgICAvKiBjb21wdXRlIHNlY3Rpb24gbGVuZ3RoIGlmIHBvc3NpYmxlICovCisgICAgICAgIGlmICh0c3MtPnNlY3Rpb25faF9zaXplID09IC0xICYmIHRzcy0+c2VjdGlvbl9pbmRleCAtIG9mZnNldCA+PSAzKSB7CisgICAgICAgICAgICBsZW4gPSAoQVZfUkIxNihjdXJfc2VjdGlvbl9idWYgKyAxKSAmIDB4ZmZmKSArIDM7CisgICAgICAgICAgICBpZiAobGVuID4gTUFYX1NFQ1RJT05fU0laRSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB0c3MtPnNlY3Rpb25faF9zaXplID0gbGVuOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjcmNfdmFsaWQpIHsKLSAgICAgICAgICAgIHRzcy0+c2VjdGlvbl9jYih0c3MxLCB0c3MtPnNlY3Rpb25fYnVmLCB0c3MtPnNlY3Rpb25faF9zaXplKTsKLSAgICAgICAgICAgIGlmIChjcmNfdmFsaWQgIT0gMSkKLSAgICAgICAgICAgICAgICB0c3MtPmxhc3RfdmVyID0gLTE7CisKKyAgICAgICAgaWYgKHRzcy0+c2VjdGlvbl9oX3NpemUgIT0gLTEgJiYKKyAgICAgICAgICAgIHRzcy0+c2VjdGlvbl9pbmRleCA+PSBvZmZzZXQgKyB0c3MtPnNlY3Rpb25faF9zaXplKSB7CisgICAgICAgICAgICBpbnQgY3JjX3ZhbGlkID0gMTsKKyAgICAgICAgICAgIHRzcy0+ZW5kX29mX3NlY3Rpb25fcmVhY2hlZCA9IDE7CisKKyAgICAgICAgICAgIGlmICh0c3MtPmNoZWNrX2NyYykgeworICAgICAgICAgICAgICAgIGNyY192YWxpZCA9ICFhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRSksIC0xLCBjdXJfc2VjdGlvbl9idWYsIHRzcy0+c2VjdGlvbl9oX3NpemUpOworICAgICAgICAgICAgICAgIGlmICh0c3MtPnNlY3Rpb25faF9zaXplID49IDQpCisgICAgICAgICAgICAgICAgICAgIHRzcy0+Y3JjID0gQVZfUkIzMihjdXJfc2VjdGlvbl9idWYgKyB0c3MtPnNlY3Rpb25faF9zaXplIC0gNCk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3JjX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgICAgIHRzLT5jcmNfdmFsaWRpdHlbIHRzczEtPnBpZCBdID0gMTAwOworICAgICAgICAgICAgICAgIH1lbHNlIGlmICh0cy0+Y3JjX3ZhbGlkaXR5WyB0c3MxLT5waWQgXSA+IC0xMCkgeworICAgICAgICAgICAgICAgICAgICB0cy0+Y3JjX3ZhbGlkaXR5WyB0c3MxLT5waWQgXS0tOworICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgICAgIGNyY192YWxpZCA9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY3JjX3ZhbGlkKSB7CisgICAgICAgICAgICAgICAgdHNzLT5zZWN0aW9uX2NiKHRzczEsIGN1cl9zZWN0aW9uX2J1ZiwgdHNzLT5zZWN0aW9uX2hfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGNyY192YWxpZCAhPSAxKQorICAgICAgICAgICAgICAgICAgICB0c3MtPmxhc3RfdmVyID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cl9zZWN0aW9uX2J1ZiArPSB0c3MtPnNlY3Rpb25faF9zaXplOworICAgICAgICAgICAgb2Zmc2V0ICs9IHRzcy0+c2VjdGlvbl9oX3NpemU7CisgICAgICAgICAgICB0c3MtPnNlY3Rpb25faF9zaXplID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0c3MtPnNlY3Rpb25faF9zaXplID0gLTE7CisgICAgICAgICAgICB0c3MtPmVuZF9vZl9zZWN0aW9uX3JlYWNoZWQgPSAwOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC00NDUsNyArNDU5LDcgQEAKIHsKICAgICBNcGVnVFNGaWx0ZXIgKmZpbHRlcjsKIAotICAgIGF2X2xvZyh0cy0+c3RyZWFtLCBBVl9MT0dfVFJBQ0UsICJGaWx0ZXI6IHBpZD0weCV4XG4iLCBwaWQpOworICAgIGF2X2xvZyh0cy0+c3RyZWFtLCBBVl9MT0dfVFJBQ0UsICJGaWx0ZXI6IHBpZD0weCV4IHR5cGU9JWRcbiIsIHBpZCwgdHlwZSk7CiAKICAgICBpZiAocGlkID49IE5CX1BJRF9NQVggfHwgdHMtPnBpZHNbcGlkXSkKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC00NzcsNyArNDkxLDcgQEAKICAgICBzZWMgPSAmZmlsdGVyLT51LnNlY3Rpb25fZmlsdGVyOwogICAgIHNlYy0+c2VjdGlvbl9jYiAgPSBzZWN0aW9uX2NiOwogICAgIHNlYy0+b3BhcXVlICAgICAgPSBvcGFxdWU7Ci0gICAgc2VjLT5zZWN0aW9uX2J1ZiA9IGF2X21hbGxvYyhNQVhfU0VDVElPTl9TSVpFKTsKKyAgICBzZWMtPnNlY3Rpb25fYnVmID0gYXZfbWFsbG9jeihNQVhfU0VDVElPTl9TSVpFKTsKICAgICBzZWMtPmNoZWNrX2NyYyAgID0gY2hlY2tfY3JjOwogICAgIHNlYy0+bGFzdF92ZXIgICAgPSAtMTsKIApAQCAtNTMwLDcgKzU0NCw3IEBACiAgICAgdHMtPnBpZHNbcGlkXSA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgYW5hbHl6ZShjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLCBpbnQgcGFja2V0X3NpemUsIGludCAqaW5kZXgsCitzdGF0aWMgaW50IGFuYWx5emUoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSwgaW50IHBhY2tldF9zaXplLAogICAgICAgICAgICAgICAgICAgIGludCBwcm9iZSkKIHsKICAgICBpbnQgc3RhdFtUU19NQVhfUEFDS0VUX1NJWkVdOwpAQCAtNTQxLDE1ICs1NTUsMTYgQEAKICAgICBtZW1zZXQoc3RhdCwgMCwgcGFja2V0X3NpemUgKiBzaXplb2YoKnN0YXQpKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzaXplIC0gMzsgaSsrKSB7Ci0gICAgICAgIGlmIChidWZbaV0gPT0gMHg0NyAmJgotICAgICAgICAgICAgKCFwcm9iZSB8fCAoIShidWZbaSArIDFdICYgMHg4MCkgJiYgYnVmW2kgKyAzXSAhPSAweDQ3KSkpIHsKLSAgICAgICAgICAgIGludCB4ID0gaSAlIHBhY2tldF9zaXplOwotICAgICAgICAgICAgc3RhdFt4XSsrOwotICAgICAgICAgICAgc3RhdF9hbGwrKzsKLSAgICAgICAgICAgIGlmIChzdGF0W3hdID4gYmVzdF9zY29yZSkgewotICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzdGF0W3hdOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgKmluZGV4ID0geDsKKyAgICAgICAgaWYgKGJ1ZltpXSA9PSAweDQ3KSB7CisgICAgICAgICAgICBpbnQgcGlkID0gQVZfUkIxNihidWYrMSkgJiAweDFGRkY7CisgICAgICAgICAgICBpbnQgYXNjID0gYnVmW2kgKyAzXSAmIDB4MzA7CisgICAgICAgICAgICBpZiAoIXByb2JlIHx8IHBpZCA9PSAweDFGRkYgfHwgYXNjKSB7CisgICAgICAgICAgICAgICAgaW50IHggPSBpICUgcGFja2V0X3NpemU7CisgICAgICAgICAgICAgICAgc3RhdFt4XSsrOworICAgICAgICAgICAgICAgIHN0YXRfYWxsKys7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRbeF0gPiBiZXN0X3Njb3JlKSB7CisgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzdGF0W3hdOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTU2NSw5ICs1ODAsOSBAQAogICAgIGlmIChzaXplIDwgKFRTX0ZFQ19QQUNLRVRfU0laRSAqIDUgKyAxKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBzY29yZSAgICAgID0gYW5hbHl6ZShidWYsIHNpemUsIFRTX1BBQ0tFVF9TSVpFLCAgICAgIE5VTEwsIDApOwotICAgIGR2aHNfc2NvcmUgPSBhbmFseXplKGJ1Ziwgc2l6ZSwgVFNfRFZIU19QQUNLRVRfU0laRSwgTlVMTCwgMCk7Ci0gICAgZmVjX3Njb3JlICA9IGFuYWx5emUoYnVmLCBzaXplLCBUU19GRUNfUEFDS0VUX1NJWkUsICBOVUxMLCAwKTsKKyAgICBzY29yZSAgICAgID0gYW5hbHl6ZShidWYsIHNpemUsIFRTX1BBQ0tFVF9TSVpFLCAgICAgIDApOworICAgIGR2aHNfc2NvcmUgPSBhbmFseXplKGJ1Ziwgc2l6ZSwgVFNfRFZIU19QQUNLRVRfU0laRSwgMCk7CisgICAgZmVjX3Njb3JlICA9IGFuYWx5emUoYnVmLCBzaXplLCBUU19GRUNfUEFDS0VUX1NJWkUsICAwKTsKICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1RSQUNFLCAic2NvcmU6ICVkLCBkdmhzX3Njb3JlOiAlZCwgZmVjX3Njb3JlOiAlZCBcbiIsCiAgICAgICAgICAgICBzY29yZSwgZHZoc19zY29yZSwgZmVjX3Njb3JlKTsKIApAQCAtNjk4LDYgKzcxMyw3IEBACiAgICAgeyAweDExLCBBVk1FRElBX1RZUEVfQVVESU8sIEFWX0NPREVDX0lEX0FBQ19MQVRNICAgfSwgLyogTEFUTSBzeW50YXggKi8KICNlbmRpZgogICAgIHsgMHgxYiwgQVZNRURJQV9UWVBFX1ZJREVPLCBBVl9DT0RFQ19JRF9IMjY0ICAgICAgIH0sCisgICAgeyAweDFjLCBBVk1FRElBX1RZUEVfQVVESU8sIEFWX0NPREVDX0lEX0FBQyAgICAgICAgfSwKICAgICB7IDB4MjAsIEFWTUVESUFfVFlQRV9WSURFTywgQVZfQ09ERUNfSURfSDI2NCAgICAgICB9LAogICAgIHsgMHgyMSwgQVZNRURJQV9UWVBFX1ZJREVPLCBBVl9DT0RFQ19JRF9KUEVHMjAwMCAgIH0sCiAgICAgeyAweDI0LCBBVk1FRElBX1RZUEVfVklERU8sIEFWX0NPREVDX0lEX0hFVkMgICAgICAgfSwKQEAgLTcyMiw2ICs3MzgsMTIgQEAKICAgICB7IDAgfSwKIH07CiAKKy8qIFNDVEUgdHlwZXMgKi8KK3N0YXRpYyBjb25zdCBTdHJlYW1UeXBlIFNDVEVfdHlwZXNbXSA9IHsKKyAgICB7IDB4ODYsIEFWTUVESUFfVFlQRV9EQVRBLCAgQVZfQ09ERUNfSURfU0NURV8zNSAgICB9LAorICAgIHsgMCB9LAorfTsKKwogLyogQVRTQyA/ICovCiBzdGF0aWMgY29uc3QgU3RyZWFtVHlwZSBNSVNDX3R5cGVzW10gPSB7CiAgICAgeyAweDgxLCBBVk1FRElBX1RZUEVfQVVESU8sIEFWX0NPREVDX0lEX0FDMyB9LApAQCAtNzM2LDggKzc1OCwxMCBAQAogICAgIHsgTUtUQUcoJ0QnLCAnVCcsICdTJywgJzEnKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9EVFMgICB9LAogICAgIHsgTUtUQUcoJ0QnLCAnVCcsICdTJywgJzInKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9EVFMgICB9LAogICAgIHsgTUtUQUcoJ0QnLCAnVCcsICdTJywgJzMnKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9EVFMgICB9LAorICAgIHsgTUtUQUcoJ0UnLCAnQScsICdDJywgJzMnKSwgQVZNRURJQV9UWVBFX0FVRElPLCBBVl9DT0RFQ19JRF9FQUMzICB9LAogICAgIHsgTUtUQUcoJ0gnLCAnRScsICdWJywgJ0MnKSwgQVZNRURJQV9UWVBFX1ZJREVPLCBBVl9DT0RFQ19JRF9IRVZDICB9LAogICAgIHsgTUtUQUcoJ0snLCAnTCcsICdWJywgJ0EnKSwgQVZNRURJQV9UWVBFX0RBVEEsICBBVl9DT0RFQ19JRF9TTVBURV9LTFYgfSwKKyAgICB7IE1LVEFHKCdJJywgJ0QnLCAnMycsICcgJyksIEFWTUVESUFfVFlQRV9EQVRBLCAgQVZfQ09ERUNfSURfVElNRURfSUQzIH0sCiAgICAgeyBNS1RBRygnVicsICdDJywgJy0nLCAnMScpLCBBVk1FRElBX1RZUEVfVklERU8sIEFWX0NPREVDX0lEX1ZDMSAgIH0sCiAgICAgeyBNS1RBRygnTycsICdwJywgJ3UnLCAncycpLCBBVk1FRElBX1RZUEVfQVVESU8sIEFWX0NPREVDX0lEX09QVVMgIH0sCiAgICAgeyAwIH0sCkBAIC03NjMsMTYgKzc4NywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1UeXBlICp0eXBlcykKIHsKLSAgICBpZiAoYXZjb2RlY19pc19vcGVuKHN0LT5jb2RlYykpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgImNhbm5vdCBzZXQgc3RyZWFtIGluZm8sIGNvZGVjIGlzIG9wZW5cbiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCiAgICAgZm9yICg7IHR5cGVzLT5zdHJlYW1fdHlwZTsgdHlwZXMrKykKICAgICAgICAgaWYgKHN0cmVhbV90eXBlID09IHR5cGVzLT5zdHJlYW1fdHlwZSkgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gdHlwZXMtPmNvZGVjX3R5cGU7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSB0eXBlcy0+Y29kZWNfaWQ7Ci0gICAgICAgICAgICBzdC0+cmVxdWVzdF9wcm9iZSAgICAgPSAwOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSB0eXBlcy0+Y29kZWNfdHlwZSB8fAorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAhPSB0eXBlcy0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSB0eXBlcy0+Y29kZWNfdHlwZTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSB0eXBlcy0+Y29kZWNfaWQ7CisgICAgICAgICAgICAgICAgc3QtPmludGVybmFsLT5uZWVkX2NvbnRleHRfdXBkYXRlID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlICAgICAgICA9IDA7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIH0KQEAgLTc4MCwxOCArODAzLDE5IEBACiBzdGF0aWMgaW50IG1wZWd0c19zZXRfc3RyZWFtX2luZm8oQVZTdHJlYW0gKnN0LCBQRVNDb250ZXh0ICpwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyZWFtX3R5cGUsIHVpbnQzMl90IHByb2dfcmVnX2Rlc2MpCiB7Ci0gICAgaW50IG9sZF9jb2RlY190eXBlID0gc3QtPmNvZGVjLT5jb2RlY190eXBlOwotICAgIGludCBvbGRfY29kZWNfaWQgID0gc3QtPmNvZGVjLT5jb2RlY19pZDsKKyAgICBpbnQgb2xkX2NvZGVjX3R5cGUgPSBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGU7CisgICAgaW50IG9sZF9jb2RlY19pZCAgID0gc3QtPmNvZGVjcGFyLT5jb2RlY19pZDsKKyAgICBpbnQgb2xkX2NvZGVjX3RhZyAgPSBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZzsKIAotICAgIGlmIChhdmNvZGVjX2lzX29wZW4oc3QtPmNvZGVjKSkgewotICAgICAgICBhdl9sb2cocGVzLT5zdHJlYW0sIEFWX0xPR19ERUJVRywgImNhbm5vdCBzZXQgc3RyZWFtIGluZm8sIGNvZGVjIGlzIG9wZW5cbiIpOworICAgIGlmIChhdmNvZGVjX2lzX29wZW4oc3QtPmludGVybmFsLT5hdmN0eCkpIHsKKyAgICAgICAgYXZfbG9nKHBlcy0+c3RyZWFtLCBBVl9MT0dfREVCVUcsICJjYW5ub3Qgc2V0IHN0cmVhbSBpbmZvLCBpbnRlcm5hbCBjb2RlYyBpcyBvcGVuXG4iKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIDkwMDAwKTsKICAgICBzdC0+cHJpdl9kYXRhICAgICAgICAgPSBwZXM7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTk9ORTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9OT05FOwogICAgIHN0LT5uZWVkX3BhcnNpbmcgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgcGVzLT5zdCAgICAgICAgICA9IHN0OwogICAgIHBlcy0+c3RyZWFtX3R5cGUgPSBzdHJlYW1fdHlwZTsKQEAgLTgwMCwxNCArODI0LDE0IEBACiAgICAgICAgICAgICJzdHJlYW09JWQgc3RyZWFtX3R5cGU9JXggcGlkPSV4IHByb2dfcmVnX2Rlc2M9JS40c1xuIiwKICAgICAgICAgICAgc3QtPmluZGV4LCBwZXMtPnN0cmVhbV90eXBlLCBwZXMtPnBpZCwgKGNoYXIgKikmcHJvZ19yZWdfZGVzYyk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IHBlcy0+c3RyZWFtX3R5cGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBwZXMtPnN0cmVhbV90eXBlOwogCiAgICAgbXBlZ3RzX2ZpbmRfc3RyZWFtX3R5cGUoc3QsIHBlcy0+c3RyZWFtX3R5cGUsIElTT190eXBlcyk7Ci0gICAgaWYgKHBlcy0+c3RyZWFtX3R5cGUgPT0gNCkKKyAgICBpZiAocGVzLT5zdHJlYW1fdHlwZSA9PSA0IHx8IHBlcy0+c3RyZWFtX3R5cGUgPT0gMHgwZikKICAgICAgICAgc3QtPnJlcXVlc3RfcHJvYmUgPSA1MDsKICAgICBpZiAoKHByb2dfcmVnX2Rlc2MgPT0gQVZfUkwzMigiSERNViIpIHx8CiAgICAgICAgICBwcm9nX3JlZ19kZXNjID09IEFWX1JMMzIoIkhEUFIiKSkgJiYKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgewogICAgICAgICBtcGVndHNfZmluZF9zdHJlYW1fdHlwZShzdCwgcGVzLT5zdHJlYW1fdHlwZSwgSERNVl90eXBlcyk7CiAgICAgICAgIGlmIChwZXMtPnN0cmVhbV90eXBlID09IDB4ODMpIHsKICAgICAgICAgICAgIC8vIEhETVYgVHJ1ZUhEIHN0cmVhbXMgYWxzbyBjb250YWluIGFuIEFDMyBjb2RlZCB2ZXJzaW9uIG9mIHRoZQpAQCAtODI4LDI4ICs4NTIsMzMgQEAKICAgICAgICAgICAgIHN1Yl9zdC0+aWQgPSBwZXMtPnBpZDsKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3ViX3N0LCAzMywgMSwgOTAwMDApOwogICAgICAgICAgICAgc3ViX3N0LT5wcml2X2RhdGEgICAgICAgICA9IHN1Yl9wZXM7Ci0gICAgICAgICAgICBzdWJfc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICAgICAgc3ViX3N0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FDMzsKKyAgICAgICAgICAgIHN1Yl9zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdWJfc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQUMzOwogICAgICAgICAgICAgc3ViX3N0LT5uZWVkX3BhcnNpbmcgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgICAgICAgICBzdWJfcGVzLT5zdWJfc3QgICAgICAgICAgID0gcGVzLT5zdWJfc3QgPSBzdWJfc3Q7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQogICAgICAgICBtcGVndHNfZmluZF9zdHJlYW1fdHlwZShzdCwgcGVzLT5zdHJlYW1fdHlwZSwgTUlTQ190eXBlcyk7Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICA9IG9sZF9jb2RlY19pZDsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gb2xkX2NvZGVjX3R5cGU7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICA9IG9sZF9jb2RlY19pZDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gb2xkX2NvZGVjX3R5cGU7CiAgICAgfQotICAgIGlmICgoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FIHx8CisgICAgaWYgKChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUgfHwKICAgICAgICAgICAgIChzdC0+cmVxdWVzdF9wcm9iZSA+IDAgJiYgc3QtPnJlcXVlc3RfcHJvYmUgPCBBVlBST0JFX1NDT1JFX1NUUkVBTV9SRVRSWSAvIDUpKSAmJgotICAgICAgICAhYXZjb2RlY19pc19vcGVuKHN0LT5jb2RlYykgJiYKICAgICAgICAgc3QtPnByb2JlX3BhY2tldHMgPiAwICYmCiAgICAgICAgIHN0cmVhbV90eXBlID09IFNUUkVBTV9UWVBFX1BSSVZBVEVfREFUQSkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQklOX0RBVEE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9CSU5fREFUQTsKICAgICAgICAgc3QtPnJlcXVlc3RfcHJvYmUgPSBBVlBST0JFX1NDT1JFX1NUUkVBTV9SRVRSWSAvIDU7CiAgICAgfQogCisgICAgLyogcXVldWUgYSBjb250ZXh0IHVwZGF0ZSBpZiBwcm9wZXJ0aWVzIGNoYW5nZWQgKi8KKyAgICBpZiAob2xkX2NvZGVjX3R5cGUgIT0gc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlIHx8CisgICAgICAgIG9sZF9jb2RlY19pZCAgICE9IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICB8fAorICAgICAgICBvbGRfY29kZWNfdGFnICAhPSBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZykKKyAgICAgICAgc3QtPmludGVybmFsLT5uZWVkX2NvbnRleHRfdXBkYXRlID0gMTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC04NjIsOSArODkxLDE4IEBACiAgICAgYXZfYnVmZmVyX3VucmVmKCZwZXMtPmJ1ZmZlcik7CiB9CiAKLXN0YXRpYyB2b2lkIG5ld19wZXNfcGFja2V0KFBFU0NvbnRleHQgKnBlcywgQVZQYWNrZXQgKnBrdCkKK3N0YXRpYyB2b2lkIG5ld19kYXRhX3BhY2tldChjb25zdCB1aW50OF90ICpidWZmZXIsIGludCBsZW4sIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgYXZfaW5pdF9wYWNrZXQocGt0KTsKKyAgICBwa3QtPmRhdGEgPSAodWludDhfdCAqKWJ1ZmZlcjsKKyAgICBwa3QtPnNpemUgPSBsZW47Cit9CisKK3N0YXRpYyBpbnQgbmV3X3Blc19wYWNrZXQoUEVTQ29udGV4dCAqcGVzLCBBVlBhY2tldCAqcGt0KQoreworICAgIHVpbnQ4X3QgKnNkOworCisgICAgYXZfaW5pdF9wYWNrZXQocGt0KTsKIAogICAgIHBrdC0+YnVmICA9IHBlcy0+YnVmZmVyOwogICAgIHBrdC0+ZGF0YSA9IHBlcy0+YnVmZmVyLT5kYXRhOwpAQCAtODkxLDYgKzkyOSwxMyBAQAogCiAgICAgcGVzLT5idWZmZXIgPSBOVUxMOwogICAgIHJlc2V0X3Blc19wYWNrZXRfc3RhdGUocGVzKTsKKworICAgIHNkID0gYXZfcGFja2V0X25ld19zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9NUEVHVFNfU1RSRUFNX0lELCAxKTsKKyAgICBpZiAoIXNkKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICpzZCA9IHBlcy0+c3RyZWFtX2lkOworCisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1aW50NjRfdCBnZXRfdHM2NChHZXRCaXRDb250ZXh0ICpnYiwgaW50IGJpdHMpCkBAIC05NzksMTQgKzEwMjQsMTYgQEAKICAgICBQRVNDb250ZXh0ICpwZXMgICA9IGZpbHRlci0+dS5wZXNfZmlsdGVyLm9wYXF1ZTsKICAgICBNcGVnVFNDb250ZXh0ICp0cyA9IHBlcy0+dHM7CiAgICAgY29uc3QgdWludDhfdCAqcDsKLSAgICBpbnQgbGVuLCBjb2RlOworICAgIGludCByZXQsIGxlbiwgY29kZTsKIAogICAgIGlmICghdHMtPnBrdCkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBpZiAoaXNfc3RhcnQpIHsKICAgICAgICAgaWYgKHBlcy0+c3RhdGUgPT0gTVBFR1RTX1BBWUxPQUQgJiYgcGVzLT5kYXRhX2luZGV4ID4gMCkgewotICAgICAgICAgICAgbmV3X3Blc19wYWNrZXQocGVzLCB0cy0+cGt0KTsKKyAgICAgICAgICAgIHJldCA9IG5ld19wZXNfcGFja2V0KHBlcywgdHMtPnBrdCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgdHMtPnN0b3BfcGFyc2UgPSAxOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzZXRfcGVzX3BhY2tldF9zdGF0ZShwZXMpOwpAQCAtMTAxMCwxMCArMTA1NywxMSBAQAogICAgICAgICAgICAgICAgICAqIGRlY2lkZSAqLwogICAgICAgICAgICAgICAgIGlmIChwZXMtPmhlYWRlclswXSA9PSAweDAwICYmIHBlcy0+aGVhZGVyWzFdID09IDB4MDAgJiYKICAgICAgICAgICAgICAgICAgICAgcGVzLT5oZWFkZXJbMl0gPT0gMHgwMSkgewotICAgICAgICAgICAgICAgICAgICAvKiBpdCBtdXN0IGJlIGFuIG1wZWcyIFBFUyBzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogaXQgbXVzdCBiZSBhbiBNUEVHLTIgUEVTIHN0cmVhbSAqLwogICAgICAgICAgICAgICAgICAgICBjb2RlID0gcGVzLT5oZWFkZXJbM10gfCAweDEwMDsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHBlcy0+c3RyZWFtLCBBVl9MT0dfVFJBQ0UsICJwaWQ9JXggcGVzX2NvZGU9JSN4XG4iLCBwZXMtPnBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgcGVzLT5zdHJlYW1faWQgPSBwZXMtPmhlYWRlclszXTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoKHBlcy0+c3QgJiYgcGVzLT5zdC0+ZGlzY2FyZCA9PSBBVkRJU0NBUkRfQUxMICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCFwZXMtPnN1Yl9zdCB8fApAQCAtMTA1MCw3ICsxMDk4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgIT0gMHgxZmYgJiYgY29kZSAhPSAweDFmMiAmJiAvKiBwcm9ncmFtX3N0cmVhbV9kaXJlY3RvcnksIERTTUNDX3N0cmVhbSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAhPSAweDFmOCkgeyAgICAgICAgICAgICAgICAgIC8qIElUVS1UIFJlYy4gSC4yMjIuMSB0eXBlIEUgc3RyZWFtICovCiAgICAgICAgICAgICAgICAgICAgICAgICBwZXMtPnN0YXRlID0gTVBFR1RTX1BFU0hFQURFUjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZXMtPnN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSAmJiAhcGVzLT5zdC0+cmVxdWVzdF9wcm9iZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlcy0+c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FICYmICFwZXMtPnN0LT5yZXF1ZXN0X3Byb2JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHBlcy0+c3RyZWFtLCBBVl9MT0dfVFJBQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGlkPSV4IHN0cmVhbV90eXBlPSV4IHByb2JpbmdcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXMtPnBpZCwKQEAgLTExNDcsOCArMTE5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplIC09IDU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICggICBwZXMtPnRzLT5maXhfdGVsZXRleHRfcHRzCi0gICAgICAgICAgICAgICAgICAgICYmICggICBwZXMtPnN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBwZXMtPnN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFKQorICAgICAgICAgICAgICAgICAgICAmJiAoICAgcGVzLT5zdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWQl9URUxFVEVYVAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGVzLT5zdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRSkKICAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgIEFWUHJvZ3JhbSAqcCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgocCA9IGF2X2ZpbmRfcHJvZ3JhbV9mcm9tX3N0cmVhbShwZXMtPnN0cmVhbSwgcCwgcGVzLT5zdC0+aW5kZXgpKSkgewpAQCAtMTE2NCw3ICsxMjEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHAtPm5iX3N0cmVhbV9pbmRleGVzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqcHN0ID0gcGVzLT5zdHJlYW0tPnN0cmVhbXNbcC0+c3RyZWFtX2luZGV4W2ldXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdCA9IHBzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTE3OCwxMCArMTIyNiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5zdC0+cHRzX3dyYXBfYmVoYXZpb3IgPSBzdC0+cHRzX3dyYXBfYmVoYXZpb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVzLT5kdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgcGVzLT5kdHMgPCBwY3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXMtPnB0cyA9IHBlcy0+ZHRzID0gcGNyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXMtPnN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcy0+c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkJfVEVMRVRFWFQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5kdHMgPiBwY3IgKyAzNjU0ICsgOTAwMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+cHRzID0gcGVzLT5kdHMgPSBwY3IgKyAzNjU0ICsgOTAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVzLT5zdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWQl9TVUJUSVRMRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXMtPnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+ZHRzID4gcGNyICsgMTAqOTAwMDApIHsgLy8xMHNlYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcy0+cHRzID0gcGVzLT5kdHMgPSBwY3IgKyAzNjU0ICsgOTAwMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTExOTcsNyArMTI0NSw5IEBACiAgICAgICAgICAgICBpZiAocGVzLT5idWZmZXIpIHsKICAgICAgICAgICAgICAgICBpZiAocGVzLT5kYXRhX2luZGV4ID4gMCAmJgogICAgICAgICAgICAgICAgICAgICBwZXMtPmRhdGFfaW5kZXggKyBidWZfc2l6ZSA+IHBlcy0+dG90YWxfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBuZXdfcGVzX3BhY2tldChwZXMsIHRzLT5wa3QpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXdfcGVzX3BhY2tldChwZXMsIHRzLT5wa3QpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgICAgIHBlcy0+dG90YWxfc2l6ZSA9IE1BWF9QRVNfUEFZTE9BRDsKICAgICAgICAgICAgICAgICAgICAgcGVzLT5idWZmZXIgPSBhdl9idWZmZXJfYWxsb2MocGVzLT50b3RhbF9zaXplICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CkBAIC0xMjIwLDcgKzEyNzAsOSBAQAogICAgICAgICAgICAgICAgIGlmICghdHMtPnN0b3BfcGFyc2UgJiYgcGVzLT50b3RhbF9zaXplIDwgTUFYX1BFU19QQVlMT0FEICYmCiAgICAgICAgICAgICAgICAgICAgIHBlcy0+cGVzX2hlYWRlcl9zaXplICsgcGVzLT5kYXRhX2luZGV4ID09IHBlcy0+dG90YWxfc2l6ZSArIFBFU19TVEFSVF9TSVpFKSB7CiAgICAgICAgICAgICAgICAgICAgIHRzLT5zdG9wX3BhcnNlID0gMTsKLSAgICAgICAgICAgICAgICAgICAgbmV3X3Blc19wYWNrZXQocGVzLCB0cy0+cGt0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gbmV3X3Blc19wYWNrZXQocGVzLCB0cy0+cGt0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ1Zl9zaXplID0gMDsKQEAgLTEzNDIsNiArMTM5NCw4IEBACiBzdGF0aWMgaW50IHBhcnNlX01QNEVTRGVzY3JUYWcoTVA0RGVzY3JQYXJzZUNvbnRleHQgKmQsIGludDY0X3Qgb2ZmLCBpbnQgbGVuKQogewogICAgIGludCBlc19pZCA9IDA7CisgICAgaW50IHJldCAgID0gMDsKKwogICAgIGlmIChkLT5kZXNjcl9jb3VudCA+PSBkLT5tYXhfZGVzY3JfY291bnQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGZmX21wNF9wYXJzZV9lc19kZXNjcigmZC0+cGIsICZlc19pZCk7CkBAIC0xMzQ5LDEyICsxNDAzLDEzIEBACiAKICAgICBkLT5hY3RpdmVfZGVzY3ItPmVzX2lkID0gZXNfaWQ7CiAgICAgdXBkYXRlX29mZnNldHMoJmQtPnBiLCAmb2ZmLCAmbGVuKTsKLSAgICBwYXJzZV9tcDRfZGVzY3IoZCwgb2ZmLCBsZW4sIE1QNERlY0NvbmZpZ0Rlc2NyVGFnKTsKKyAgICBpZiAoKHJldCA9IHBhcnNlX21wNF9kZXNjcihkLCBvZmYsIGxlbiwgTVA0RGVjQ29uZmlnRGVzY3JUYWcpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CiAgICAgdXBkYXRlX29mZnNldHMoJmQtPnBiLCAmb2ZmLCAmbGVuKTsKICAgICBpZiAobGVuID4gMCkKLSAgICAgICAgcGFyc2VfbXA0X2Rlc2NyKGQsIG9mZiwgbGVuLCBNUDRTTERlc2NyVGFnKTsKKyAgICAgICAgcmV0ID0gcGFyc2VfbXA0X2Rlc2NyKGQsIG9mZiwgbGVuLCBNUDRTTERlc2NyVGFnKTsKICAgICBkLT5hY3RpdmVfZGVzY3IgPSBOVUxMOwotICAgIHJldHVybiAwOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcGFyc2VfTVA0RGVjQ29uZmlnRGVzY3JUYWcoTVA0RGVzY3JQYXJzZUNvbnRleHQgKmQsIGludDY0X3Qgb2ZmLApAQCAtMTM3OCw2ICsxNDMzLDE0IEBACiAgICAgaWYgKCFkZXNjcikKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKKyNkZWZpbmUgUjhfQ0hFQ0tfQ0xJUF9NQVgoZHN0LCBtYXh2KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVzY3ItPnNsLmRzdCA9IGF2aW9fcjgoJmQtPnBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChkZXNjci0+c2wuZHN0ID4gbWF4dikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVzY3ItPnNsLmRzdCA9IG1heHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKICAgICBwcmVkZWZpbmVkID0gYXZpb19yOCgmZC0+cGIpOwogICAgIGlmICghcHJlZGVmaW5lZCkgewogICAgICAgICBpbnQgbGVuZ3RoczsKQEAgLTEzOTAsMTQgKzE0NTMsOSBAQAogICAgICAgICBkZXNjci0+c2wudXNlX2lkbGUgICAgICAgID0gISEoZmxhZ3MgJiAweDAyKTsKICAgICAgICAgZGVzY3ItPnNsLnRpbWVzdGFtcF9yZXMgICA9IGF2aW9fcmIzMigmZC0+cGIpOwogICAgICAgICBhdmlvX3JiMzIoJmQtPnBiKTsKLSAgICAgICAgZGVzY3ItPnNsLnRpbWVzdGFtcF9sZW4gICAgICA9IGF2aW9fcjgoJmQtPnBiKTsKLSAgICAgICAgaWYgKGRlc2NyLT5zbC50aW1lc3RhbXBfbGVuID4gNjQpIHsKLSAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShOVUxMLCAidGltZXN0YW1wX2xlbiA+IDY0Iik7Ci0gICAgICAgICAgICBkZXNjci0+c2wudGltZXN0YW1wX2xlbiA9IDY0OwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwotICAgICAgICB9Ci0gICAgICAgIGRlc2NyLT5zbC5vY3JfbGVuICAgICAgICAgICAgPSBhdmlvX3I4KCZkLT5wYik7Ci0gICAgICAgIGRlc2NyLT5zbC5hdV9sZW4gICAgICAgICAgICAgPSBhdmlvX3I4KCZkLT5wYik7CisgICAgICAgIFI4X0NIRUNLX0NMSVBfTUFYKHRpbWVzdGFtcF9sZW4sIDYzKTsKKyAgICAgICAgUjhfQ0hFQ0tfQ0xJUF9NQVgob2NyX2xlbiwgICAgICAgNjMpOworICAgICAgICBSOF9DSEVDS19DTElQX01BWChhdV9sZW4sICAgICAgICAzMSk7CiAgICAgICAgIGRlc2NyLT5zbC5pbnN0X2JpdHJhdGVfbGVuICAgPSBhdmlvX3I4KCZkLT5wYik7CiAgICAgICAgIGxlbmd0aHMgICAgICAgICAgICAgICAgICAgICAgPSBhdmlvX3JiMTYoJmQtPnBiKTsKICAgICAgICAgZGVzY3ItPnNsLmRlZ3JfcHJpb3JfbGVuICAgICA9IGxlbmd0aHMgPj4gMTI7CkBAIC0xNDE1LDYgKzE0NzMsOCBAQAogewogICAgIGludCB0YWc7CiAgICAgaW50IGxlbjEgPSBmZl9tcDRfcmVhZF9kZXNjcihkLT5zLCAmZC0+cGIsICZ0YWcpOworICAgIGludCByZXQgPSAwOworCiAgICAgdXBkYXRlX29mZnNldHMoJmQtPnBiLCAmb2ZmLCAmbGVuKTsKICAgICBpZiAobGVuIDwgMCB8fCBsZW4xID4gbGVuIHx8IGxlbjEgPD0gMCkgewogICAgICAgICBhdl9sb2coZC0+cywgQVZfTE9HX0VSUk9SLApAQCAtMTQyNSwzMCArMTQ4NSwzMiBAQAogCiAgICAgaWYgKGQtPmxldmVsKysgPj0gTUFYX0xFVkVMKSB7CiAgICAgICAgIGF2X2xvZyhkLT5zLCBBVl9MT0dfRVJST1IsICJNYXhpbXVtIE1QNCBkZXNjcmlwdG9yIGxldmVsIGV4Y2VlZGVkXG4iKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgZ290byBkb25lOwogICAgIH0KIAogICAgIGlmICh0YXJnZXRfdGFnICYmIHRhZyAhPSB0YXJnZXRfdGFnKSB7CiAgICAgICAgIGF2X2xvZyhkLT5zLCBBVl9MT0dfRVJST1IsICJGb3VuZCB0YWcgJXggZXhwZWN0ZWQgJXhcbiIsIHRhZywKICAgICAgICAgICAgICAgIHRhcmdldF90YWcpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCiAgICAgc3dpdGNoICh0YWcpIHsKICAgICBjYXNlIE1QNElPRGVzY3JUYWc6Ci0gICAgICAgIHBhcnNlX01QNElPRGVzY3JUYWcoZCwgb2ZmLCBsZW4xKTsKKyAgICAgICAgcmV0ID0gcGFyc2VfTVA0SU9EZXNjclRhZyhkLCBvZmYsIGxlbjEpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1QNE9EZXNjclRhZzoKLSAgICAgICAgcGFyc2VfTVA0T0Rlc2NyVGFnKGQsIG9mZiwgbGVuMSk7CisgICAgICAgIHJldCA9IHBhcnNlX01QNE9EZXNjclRhZyhkLCBvZmYsIGxlbjEpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1QNEVTRGVzY3JUYWc6Ci0gICAgICAgIHBhcnNlX01QNEVTRGVzY3JUYWcoZCwgb2ZmLCBsZW4xKTsKKyAgICAgICAgcmV0ID0gcGFyc2VfTVA0RVNEZXNjclRhZyhkLCBvZmYsIGxlbjEpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1QNERlY0NvbmZpZ0Rlc2NyVGFnOgotICAgICAgICBwYXJzZV9NUDREZWNDb25maWdEZXNjclRhZyhkLCBvZmYsIGxlbjEpOworICAgICAgICByZXQgPSBwYXJzZV9NUDREZWNDb25maWdEZXNjclRhZyhkLCBvZmYsIGxlbjEpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIE1QNFNMRGVzY3JUYWc6Ci0gICAgICAgIHBhcnNlX01QNFNMRGVzY3JUYWcoZCwgb2ZmLCBsZW4xKTsKKyAgICAgICAgcmV0ID0gcGFyc2VfTVA0U0xEZXNjclRhZyhkLCBvZmYsIGxlbjEpOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTE0NTYsNyArMTUxOCw3IEBACiBkb25lOgogICAgIGQtPmxldmVsLS07CiAgICAgYXZpb19zZWVrKCZkLT5wYiwgb2ZmICsgbGVuMSwgU0VFS19TRVQpOwotICAgIHJldHVybiAwOworICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgbXA0X3JlYWRfaW9kcyhBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgdW5zaWduZWQgc2l6ZSwKQEAgLTE1MzksMjAgKzE2MDEsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wNF9kZXNjcltpXS5kZWNfY29uZmlnX2Rlc2NyX2xlbiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgICAgICAgICAgZmZfbXA0X3JlYWRfZGVjX2NvbmZpZ19kZXNjcihzLCBzdCwgJnBiKTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJgotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPiAwKQorICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDApCiAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IDA7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA+IDApCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0ICYmCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDApCiAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IDA7CiAKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IGF2Y29kZWNfZ2V0X3R5cGUoc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBhdmNvZGVjX2dldF90eXBlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOworICAgICAgICAgICAgc3QtPmludGVybmFsLT5uZWVkX2NvbnRleHRfdXBkYXRlID0gMTsKICAgICAgICAgfQogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgbXA0X2Rlc2NyX2NvdW50OyBpKyspCiAgICAgICAgIGF2X2ZyZWUobXA0X2Rlc2NyW2ldLmRlY19jb25maWdfZGVzY3IpOwogfQogCitzdGF0aWMgdm9pZCBzY3RlX2RhdGFfY2IoTXBlZ1RTRmlsdGVyICpmaWx0ZXIsIGNvbnN0IHVpbnQ4X3QgKnNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgIGludCBzZWN0aW9uX2xlbikKK3sKKyAgICBBVlByb2dyYW0gKnByZyA9IE5VTEw7CisgICAgTXBlZ1RTQ29udGV4dCAqdHMgPSBmaWx0ZXItPnUuc2VjdGlvbl9maWx0ZXIub3BhcXVlOworCisgICAgaW50IGlkeCA9IGZmX2ZpbmRfc3RyZWFtX2luZGV4KHRzLT5zdHJlYW0sIGZpbHRlci0+cGlkKTsKKyAgICBpZiAoaWR4IDwgMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgbmV3X2RhdGFfcGFja2V0KHNlY3Rpb24sIHNlY3Rpb25fbGVuLCB0cy0+cGt0KTsKKyAgICB0cy0+cGt0LT5zdHJlYW1faW5kZXggPSBpZHg7CisgICAgcHJnID0gYXZfZmluZF9wcm9ncmFtX2Zyb21fc3RyZWFtKHRzLT5zdHJlYW0sIE5VTEwsIGlkeCk7CisgICAgaWYgKHByZyAmJiBwcmctPnBjcl9waWQgIT0gLTEgJiYgcHJnLT5kaXNjYXJkICE9IEFWRElTQ0FSRF9BTEwpIHsKKyAgICAgICAgTXBlZ1RTRmlsdGVyICpmID0gdHMtPnBpZHNbcHJnLT5wY3JfcGlkXTsKKyAgICAgICAgaWYgKGYgJiYgZi0+bGFzdF9wY3IgIT0gLTEpCisgICAgICAgICAgICB0cy0+cGt0LT5wdHMgPSB0cy0+cGt0LT5kdHMgPSBmLT5sYXN0X3Bjci8zMDA7CisgICAgfQorICAgIHRzLT5zdG9wX3BhcnNlID0gMTsKKworfQorCiBzdGF0aWMgY29uc3QgdWludDhfdCBvcHVzX2NvdXBsZWRfc3RyZWFtX2NudFs5XSA9IHsKICAgICAxLCAwLCAxLCAxLCAyLCAyLCAyLCAzLCAzCiB9OwpAQCAtMTU5NCw3ICsxNjc5LDcgQEAKIAogICAgIGF2X2xvZyhmYywgQVZfTE9HX1RSQUNFLCAidGFnOiAweCUwMnggbGVuPSVkXG4iLCBkZXNjX3RhZywgZGVzY19sZW4pOwogCi0gICAgaWYgKChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUgfHwgc3QtPnJlcXVlc3RfcHJvYmUgPiAwKSAmJgorICAgIGlmICgoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FIHx8IHN0LT5yZXF1ZXN0X3Byb2JlID4gMCkgJiYKICAgICAgICAgc3RyZWFtX3R5cGUgPT0gU1RSRUFNX1RZUEVfUFJJVkFURV9EQVRBKQogICAgICAgICBtcGVndHNfZmluZF9zdHJlYW1fdHlwZShzdCwgZGVzY190YWcsIERFU0NfdHlwZXMpOwogCkBAIC0xNjEzLDEwICsxNjk4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXA0X2Rlc2NyW2ldLmRlY19jb25maWdfZGVzY3JfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgICAgICAgICAgICAgIGZmX21wNF9yZWFkX2RlY19jb25maWdfZGVzY3IoZmMsIHN0LCAmcGIpOwotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJgotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID4gMCkKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzRTWVNURU1TKQorICAgICAgICAgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNFNZU1RFTVMpCiAgICAgICAgICAgICAgICAgICAgIG1wZWd0c19vcGVuX3NlY3Rpb25fZmlsdGVyKHRzLCBwaWQsIG00c2xfY2IsIHRzLCAxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC0xNjI0LDggKzE3MTEsOCBAQAogICAgICAgICBpZiAoZ2V0MTYocHAsIGRlc2NfZW5kKSA8IDApCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgaWYgKG1wNF9kZXNjcl9jb3VudCA+IDAgJiYKLSAgICAgICAgICAgIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQ19MQVRNIHx8Ci0gICAgICAgICAgICAgKHN0LT5yZXF1ZXN0X3Byb2JlID09IDAgJiYgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB8fAorICAgICAgICAgICAgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDX0xBVE0gfHwKKyAgICAgICAgICAgICAoc3QtPnJlcXVlc3RfcHJvYmUgPT0gMCAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHx8CiAgICAgICAgICAgICAgc3QtPnJlcXVlc3RfcHJvYmUgPiAwKSAmJgogICAgICAgICAgICAgbXA0X2Rlc2NyLT5kZWNfY29uZmlnX2Rlc2NyX2xlbiAmJiBtcDRfZGVzY3ItPmVzX2lkID09IHBpZCkgewogICAgICAgICAgICAgQVZJT0NvbnRleHQgcGI7CkBAIC0xNjMzLDEwICsxNzIwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRfZGVzY3ItPmRlY19jb25maWdfZGVzY3JfbGVuLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgICBmZl9tcDRfcmVhZF9kZWNfY29uZmlnX2Rlc2NyKGZjLCBzdCwgJnBiKTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQyAmJgotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPiAwKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID4gMCkgewogICAgICAgICAgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlID0gc3QtPm5lZWRfcGFyc2luZyA9IDA7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTY1MiwxNiArMTc0MCwxNiBAQAogICAgICAgICAgICAgICAgIC8qIDQgYnl0ZXMgcGVyIGxhbmd1YWdlIGNvZGUgKDMgYnl0ZXMpIHdpdGggY29tbWEgb3IgTlVMIGJ5dGUgc2hvdWxkIGZpdCBsYW5ndWFnZSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKGxhbmd1YWdlX2NvdW50IDw9IHNpemVvZihsYW5ndWFnZSkgLyA0KTsKIAotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBsYW5ndWFnZV9jb3VudCAqIDIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIGxhbmd1YWdlX2NvdW50ICogMikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplIDwgbGFuZ3VhZ2VfY291bnQgKiAyKQotICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplIDwgbGFuZ3VhZ2VfY291bnQgKiAyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgICAgICAgICAgICAgZXh0cmFkYXRhID0gc3QtPmNvZGVjLT5leHRyYWRhdGE7CisgICAgICAgICAgICAgICAgZXh0cmFkYXRhID0gc3QtPmNvZGVjcGFyLT5leHRyYWRhdGE7CiAKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGFuZ3VhZ2VfY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVtpICogNCArIDBdID0gZ2V0OChwcCwgZGVzY19lbmQpOwpAQCAtMTY3Nyw2ICsxNzY1LDcgQEAKIAogICAgICAgICAgICAgICAgIGxhbmd1YWdlW2kgKiA0IC0gMV0gPSAwOwogICAgICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIGxhbmd1YWdlLCAwKTsKKyAgICAgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTcwMiwxNiArMTc5MSwxNiBAQAogICAgICAgICAgICAgICAgIC8qIDQgYnl0ZXMgcGVyIGxhbmd1YWdlIGNvZGUgKDMgYnl0ZXMpIHdpdGggY29tbWEgb3IgTlVMIGJ5dGUgc2hvdWxkIGZpdCBsYW5ndWFnZSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKGxhbmd1YWdlX2NvdW50IDw9IHNpemVvZihsYW5ndWFnZSkgLyA0KTsKIAotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBsYW5ndWFnZV9jb3VudCAqIDUpKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIGxhbmd1YWdlX2NvdW50ICogNSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA8IGxhbmd1YWdlX2NvdW50ICogNSkKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA8IGxhbmd1YWdlX2NvdW50ICogNSkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICAgICAgICAgICAgICBleHRyYWRhdGEgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YTsKKyAgICAgICAgICAgICAgICBleHRyYWRhdGEgPSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YTsKIAogICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsYW5ndWFnZV9jb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlW2kgKiA0ICsgMF0gPSBnZXQ4KHBwLCBkZXNjX2VuZCk7CkBAIC0xNzQwLDYgKzE4MjksNyBAQAogCiAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbaSAqIDQgLSAxXSA9IDA7CiAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgbGFuZ3VhZ2UsIDApOworICAgICAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+bmVlZF9jb250ZXh0X3VwZGF0ZSA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC0xNzYzLDE0ICsxODUzLDE5IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKGkgJiYgbGFuZ3VhZ2VbMF0pIHsKICAgICAgICAgICAgIGxhbmd1YWdlW2kgLSAxXSA9IDA7Ci0gICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCBsYW5ndWFnZSwgMCk7CisgICAgICAgICAgICAvKiBkb24ndCBvdmVyd3JpdGUgbGFuZ3VhZ2UsIGFzIGl0IG1heSBhbHJlYWR5IGhhdmUgYmVlbiBzZXQgYnkKKyAgICAgICAgICAgICAqIGFub3RoZXIsIG1vcmUgc3BlY2lmaWMgZGVzY3JpcHRvciAoZS5nLiBzdXBwbGVtZW50YXJ5IGF1ZGlvKSAqLworICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgImxhbmd1YWdlIiwgbGFuZ3VhZ2UsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHgwNTogLyogcmVnaXN0cmF0aW9uIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBieXRlc3RyZWFtX2dldF9sZTMyKHBwKTsKLSAgICAgICAgYXZfbG9nKGZjLCBBVl9MT0dfVFJBQ0UsICJyZWdfZGVzYz0lLjRzXG4iLCAoY2hhciAqKSZzdC0+Y29kZWMtPmNvZGVjX3RhZyk7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUgfHwgc3QtPnJlcXVlc3RfcHJvYmUgPiAwKQotICAgICAgICAgICAgbXBlZ3RzX2ZpbmRfc3RyZWFtX3R5cGUoc3QsIHN0LT5jb2RlYy0+Y29kZWNfdGFnLCBSRUdEX3R5cGVzKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBieXRlc3RyZWFtX2dldF9sZTMyKHBwKTsKKyAgICAgICAgYXZfbG9nKGZjLCBBVl9MT0dfVFJBQ0UsICJyZWdfZGVzYz0lLjRzXG4iLCAoY2hhciAqKSZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyk7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUgfHwgc3QtPnJlcXVlc3RfcHJvYmUgPiAwKSB7CisgICAgICAgICAgICBtcGVndHNfZmluZF9zdHJlYW1fdHlwZShzdCwgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcsIFJFR0RfdHlwZXMpOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID09IE1LVEFHKCdCJywgJ1MnLCAnUycsICdEJykpCisgICAgICAgICAgICAgICAgc3QtPnJlcXVlc3RfcHJvYmUgPSA1MDsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIDB4NTI6IC8qIHN0cmVhbSBpZGVudGlmaWVyIGRlc2NyaXB0b3IgKi8KICAgICAgICAgc3QtPnN0cmVhbV9pZGVudGlmaWVyID0gMSArIGdldDgocHAsIGRlc2NfZW5kKTsKQEAgLTE3NzksMzkgKzE4NzQsNzYgQEAKICAgICAgICAgaWYgKGdldDE2KHBwLCBkZXNjX2VuZCkgPT0gMHhGRkZGKQogICAgICAgICAgICAgKnBwICs9IDQ7CiAgICAgICAgIGlmIChnZXQ4KHBwLCBkZXNjX2VuZCkgPT0gMHhGRikgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBieXRlc3RyZWFtX2dldF9sZTMyKHBwKTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCi0gICAgICAgICAgICAgICAgbXBlZ3RzX2ZpbmRfc3RyZWFtX3R5cGUoc3QsIHN0LT5jb2RlYy0+Y29kZWNfdGFnLCBNRVRBREFUQV90eXBlcyk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIocHApOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgICAgICBtcGVndHNfZmluZF9zdHJlYW1fdHlwZShzdCwgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcsIE1FVEFEQVRBX3R5cGVzKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIDB4N2Y6IC8qIERWQiBleHRlbnNpb24gZGVzY3JpcHRvciAqLwogICAgICAgICBleHRfZGVzY190YWcgPSBnZXQ4KHBwLCBkZXNjX2VuZCk7CiAgICAgICAgIGlmIChleHRfZGVzY190YWcgPCAwKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMgJiYKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUyAmJgogICAgICAgICAgICAgZXh0X2Rlc2NfdGFnID09IDB4ODApIHsgLyogVXNlciBkZWZpbmVkIChwcm92aXNpb25hbCBPcHVzKSAqLwotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSkgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihzaXplb2Yob3B1c19kZWZhdWx0X2V4dHJhZGF0YSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKQorICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihzaXplb2Yob3B1c19kZWZhdWx0X2V4dHJhZGF0YSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IHNpemVvZihvcHVzX2RlZmF1bHRfZXh0cmFkYXRhKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIG9wdXNfZGVmYXVsdF9leHRyYWRhdGEsIHNpemVvZihvcHVzX2RlZmF1bHRfZXh0cmFkYXRhKSk7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IHNpemVvZihvcHVzX2RlZmF1bHRfZXh0cmFkYXRhKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIG9wdXNfZGVmYXVsdF9leHRyYWRhdGEsIHNpemVvZihvcHVzX2RlZmF1bHRfZXh0cmFkYXRhKSk7CiAKICAgICAgICAgICAgICAgICBjaGFubmVsX2NvbmZpZ19jb2RlID0gZ2V0OChwcCwgZGVzY19lbmQpOwogICAgICAgICAgICAgICAgIGlmIChjaGFubmVsX2NvbmZpZ19jb2RlIDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxfY29uZmlnX2NvZGUgPD0gMHg4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzldICA9IGNoYW5uZWxzID0gY2hhbm5lbF9jb25maWdfY29kZSA/IGNoYW5uZWxfY29uZmlnX2NvZGUgOiAyOwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsxOF0gPSBjaGFubmVsX2NvbmZpZ19jb2RlID8gKGNoYW5uZWxzID4gMikgOiAvKiBEdWFsIE1vbm8gKi8gMjU1OwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsxOV0gPSBvcHVzX3N0cmVhbV9jbnRbY2hhbm5lbF9jb25maWdfY29kZV07Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzIwXSA9IG9wdXNfY291cGxlZF9zdHJlYW1fY250W2NoYW5uZWxfY29uZmlnX2NvZGVdOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhWzIxXSwgb3B1c19jaGFubmVsX21hcFtjaGFubmVscyAtIDFdLCBjaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzldICA9IGNoYW5uZWxzID0gY2hhbm5lbF9jb25maWdfY29kZSA/IGNoYW5uZWxfY29uZmlnX2NvZGUgOiAyOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxOF0gPSBjaGFubmVsX2NvbmZpZ19jb2RlID8gKGNoYW5uZWxzID4gMikgOiAvKiBEdWFsIE1vbm8gKi8gMjU1OworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxOV0gPSBvcHVzX3N0cmVhbV9jbnRbY2hhbm5lbF9jb25maWdfY29kZV07CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzIwXSA9IG9wdXNfY291cGxlZF9zdHJlYW1fY250W2NoYW5uZWxfY29uZmlnX2NvZGVdOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzIxXSwgb3B1c19jaGFubmVsX21hcFtjaGFubmVscyAtIDFdLCBjaGFubmVscyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGZjLCAiT3B1cyBpbiBNUEVHLVRTIC0gY2hhbm5lbF9jb25maWdfY29kZSA+IDB4OCIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICAgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChleHRfZGVzY190YWcgPT0gMHgwNikgeyAvKiBzdXBwbGVtZW50YXJ5IGF1ZGlvIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgIGludCBmbGFnczsKKworICAgICAgICAgICAgaWYgKGRlc2NfbGVuIDwgMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGZsYWdzID0gZ2V0OChwcCwgZGVzY19lbmQpOworCisgICAgICAgICAgICBpZiAoKGZsYWdzICYgMHg4MCkgPT0gMCkgLyogbWl4X3R5cGUgKi8KKyAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fREVQRU5ERU5UOworCisgICAgICAgICAgICBzd2l0Y2ggKChmbGFncyA+PiAyKSAmIDB4MUYpIHsgLyogZWRpdG9yaWFsX2NsYXNzaWZpY2F0aW9uICovCisgICAgICAgICAgICBjYXNlIDB4MDE6CisgICAgICAgICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uIHw9IEFWX0RJU1BPU0lUSU9OX1ZJU1VBTF9JTVBBSVJFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwMjoKKyAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fSEVBUklOR19JTVBBSVJFRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMHgwMzoKKyAgICAgICAgICAgICAgICBzdC0+ZGlzcG9zaXRpb24gfD0gQVZfRElTUE9TSVRJT05fVklTVUFMX0lNUEFJUkVEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmxhZ3MgJiAweDAxKSB7IC8qIGxhbmd1YWdlX2NvZGVfcHJlc2VudCAqLworICAgICAgICAgICAgICAgIGlmIChkZXNjX2xlbiA8IDQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIGxhbmd1YWdlWzBdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgIGxhbmd1YWdlWzFdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgIGxhbmd1YWdlWzJdID0gZ2V0OChwcCwgZGVzY19lbmQpOworICAgICAgICAgICAgICAgIGxhbmd1YWdlWzNdID0gMDsKKworICAgICAgICAgICAgICAgIC8qIFRoaXMgbGFuZ3VhZ2UgYWx3YXlzIGhhcyB0byBvdmVycmlkZSBhIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgICogSVNPIDYzOSBsYW5ndWFnZSBkZXNjcmlwdG9yIGxhbmd1YWdlICovCisgICAgICAgICAgICAgICAgaWYgKGxhbmd1YWdlWzBdKQorICAgICAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAibGFuZ3VhZ2UiLCBsYW5ndWFnZSwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC0xODIyLDYgKzE5NTQsMTIgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpc19wZXNfc3RyZWFtKGludCBzdHJlYW1fdHlwZSwgdWludDMyX3QgcHJvZ19yZWdfZGVzYykKK3sKKyAgICByZXR1cm4gIShzdHJlYW1fdHlwZSA9PSAweDEzIHx8CisgICAgICAgICAgICAgKHN0cmVhbV90eXBlID09IDB4ODYgJiYgcHJvZ19yZWdfZGVzYyA9PSBBVl9STDMyKCJDVUVJIikpICk7Cit9CisKIHN0YXRpYyB2b2lkIHBtdF9jYihNcGVnVFNGaWx0ZXIgKmZpbHRlciwgY29uc3QgdWludDhfdCAqc2VjdGlvbiwgaW50IHNlY3Rpb25fbGVuKQogewogICAgIE1wZWdUU0NvbnRleHQgKnRzID0gZmlsdGVyLT51LnNlY3Rpb25fZmlsdGVyLm9wYXF1ZTsKQEAgLTE4NDUsMTQgKzE5ODMsMTQgQEAKICAgICBwID0gc2VjdGlvbjsKICAgICBpZiAocGFyc2Vfc2VjdGlvbl9oZWFkZXIoaCwgJnAsIHBfZW5kKSA8IDApCiAgICAgICAgIHJldHVybjsKKyAgICBpZiAoaC0+dGlkICE9IFBNVF9USUQpCisgICAgICAgIHJldHVybjsKICAgICBpZiAoc2tpcF9pZGVudGljYWwoaCwgdHNzZikpCiAgICAgICAgIHJldHVybjsKIAotICAgIGF2X2xvZyh0cy0+c3RyZWFtLCBBVl9MT0dfVFJBQ0UsICJzaWQ9MHgleCBzZWNfbnVtPSVkLyVkIHZlcnNpb249JWRcbiIsCi0gICAgICAgICAgICBoLT5pZCwgaC0+c2VjX251bSwgaC0+bGFzdF9zZWNfbnVtLCBoLT52ZXJzaW9uKTsKKyAgICBhdl9sb2codHMtPnN0cmVhbSwgQVZfTE9HX1RSQUNFLCAic2lkPTB4JXggc2VjX251bT0lZC8lZCB2ZXJzaW9uPSVkIHRpZD0lZFxuIiwKKyAgICAgICAgICAgIGgtPmlkLCBoLT5zZWNfbnVtLCBoLT5sYXN0X3NlY19udW0sIGgtPnZlcnNpb24sIGgtPnRpZCk7CiAKLSAgICBpZiAoaC0+dGlkICE9IFBNVF9USUQpCi0gICAgICAgIHJldHVybjsKICAgICBpZiAoIXRzLT5zY2FuX2FsbF9wbXRzICYmIHRzLT5za2lwX2NoYW5nZXMpCiAgICAgICAgIHJldHVybjsKIApAQCAtMTkyOSw3ICsyMDY3LDcgQEAKICAgICAgICAgICAgICAgICBwZXMtPnN0LT5pZCA9IHBlcy0+cGlkOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3QgPSBwZXMtPnN0OwotICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbV90eXBlICE9IDB4MTMpIHsKKyAgICAgICAgfSBlbHNlIGlmIChpc19wZXNfc3RyZWFtKHN0cmVhbV90eXBlLCBwcm9nX3JlZ19kZXNjKSkgewogICAgICAgICAgICAgaWYgKHRzLT5waWRzW3BpZF0pCiAgICAgICAgICAgICAgICAgbXBlZ3RzX2Nsb3NlX2ZpbHRlcih0cywgdHMtPnBpZHNbcGlkXSk7IC8vIHdyb25nbHkgYWRkZWQgc2R0IGZpbHRlciBwcm9iYWJseQogICAgICAgICAgICAgcGVzID0gYWRkX3Blc19zdHJlYW0odHMsIHBpZCwgcGNyX3BpZCk7CkBAIC0xOTQ4LDcgKzIwODYsMTEgQEAKICAgICAgICAgICAgICAgICBpZiAoIXN0KQogICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICAgICAgICAgICBzdC0+aWQgPSBwaWQ7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbV90eXBlID09IDB4ODYgJiYgcHJvZ19yZWdfZGVzYyA9PSBBVl9STDMyKCJDVUVJIikpIHsKKyAgICAgICAgICAgICAgICAgICAgbXBlZ3RzX2ZpbmRfc3RyZWFtX3R5cGUoc3QsIHN0cmVhbV90eXBlLCBTQ1RFX3R5cGVzKTsKKyAgICAgICAgICAgICAgICAgICAgbXBlZ3RzX29wZW5fc2VjdGlvbl9maWx0ZXIodHMsIHBpZCwgc2N0ZV9kYXRhX2NiLCB0cywgMSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTE5NzksNyArMjEyMSw3IEBACiAgICAgICAgICAgICAgICAgc3RyZWFtX3R5cGUgPT0gMHg4MyAmJiBwZXMtPnN1Yl9zdCkgewogICAgICAgICAgICAgICAgIGF2X3Byb2dyYW1fYWRkX3N0cmVhbV9pbmRleCh0cy0+c3RyZWFtLCBoLT5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVzLT5zdWJfc3QtPmluZGV4KTsKLSAgICAgICAgICAgICAgICBwZXMtPnN1Yl9zdC0+Y29kZWMtPmNvZGVjX3RhZyA9IHN0LT5jb2RlYy0+Y29kZWNfdGFnOworICAgICAgICAgICAgICAgIHBlcy0+c3ViX3N0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gc3QtPmNvZGVjcGFyLT5jb2RlY190YWc7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcCA9IGRlc2NfbGlzdF9lbmQ7CkBAIC0yMjA1LDYgKzIzNDcsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChwYWNrZXRbMV0gJiAweDgwKSB7CisgICAgICAgIGF2X2xvZyh0cy0+c3RyZWFtLCBBVl9MT0dfREVCVUcsICJQYWNrZXQgaGFkIFRFSSBmbGFnIHNldDsgbWFya2luZyBhcyBjb3JydXB0XG4iKTsKKyAgICAgICAgaWYgKHRzcy0+dHlwZSA9PSBNUEVHVFNfUEVTKSB7CisgICAgICAgICAgICBQRVNDb250ZXh0ICpwYyA9IHRzcy0+dS5wZXNfZmlsdGVyLm9wYXF1ZTsKKyAgICAgICAgICAgIHBjLT5mbGFncyB8PSBBVl9QS1RfRkxBR19DT1JSVVBUOworICAgICAgICB9CisgICAgfQorCiAgICAgcCA9IHBhY2tldCArIDQ7CiAgICAgaWYgKGhhc19hZGFwdGF0aW9uKSB7CiAgICAgICAgIGludDY0X3QgcGNyX2g7CkBAIC0yMjYzLDcgKzI0MTMsOCBAQAogICAgICAgICAgICAgICAgIGludCB0eXBlcyA9IDA7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRzLT5zdHJlYW0tPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QgPSB0cy0+c3RyZWFtLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgICAgICB0eXBlcyB8PSAxPDxzdC0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIHw9IDE8PHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKCh0eXBlcyAmICgxPDxBVk1FRElBX1RZUEVfQVVESU8pICYmIHR5cGVzICYgKDE8PEFWTUVESUFfVFlQRV9WSURFTykpIHx8IHBvcyA+IDEwMDAwMCkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2codHMtPnN0cmVhbSwgQVZfTE9HX0RFQlVHLCAiQWxsIHByb2dyYW1zIGhhdmUgcG10LCBoZWFkZXJzIGZvdW5kXG4iKTsKQEAgLTIzMjAsMTEgKzI0NzEsMjAgQEAKIAogLyogWFhYOiB0cnkgdG8gZmluZCBhIGJldHRlciBzeW5jaHJvIG92ZXIgc2V2ZXJhbCBwYWNrZXRzICh1c2UKICAqIGdldF9wYWNrZXRfc2l6ZSgpID8pICovCi1zdGF0aWMgaW50IG1wZWd0c19yZXN5bmMoQVZGb3JtYXRDb250ZXh0ICpzKQorc3RhdGljIGludCBtcGVndHNfcmVzeW5jKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHNlZWtiYWNrLCBjb25zdCB1aW50OF90ICpjdXJyZW50X3BhY2tldCkKIHsKICAgICBNcGVnVFNDb250ZXh0ICp0cyA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBpbnQgYywgaTsKKyAgICB1aW50NjRfdCBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgYXZpb19zZWVrKHBiLCAtRkZNSU4oc2Vla2JhY2ssIHBvcyksIFNFRUtfQ1VSKTsKKworICAgIC8vU3BlY2lhbCBjYXNlIGZvciBmaWxlcyBsaWtlIDAxYzU2YjBkYzEudHMKKyAgICBpZiAoY3VycmVudF9wYWNrZXRbMF0gPT0gMHg4MCAmJiBjdXJyZW50X3BhY2tldFsxMl0gPT0gMHg0NykgeworICAgICAgICBhdmlvX3NlZWsocGIsIDEyLCBTRUVLX0NVUik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCB0cy0+cmVzeW5jX3NpemU7IGkrKykgewogICAgICAgICBjID0gYXZpb19yOChwYik7CkBAIC0yMzU2LDEwICsyNTE2LDggQEAKICAgICAgICAgLyogY2hlY2sgcGFja2V0IHN5bmMgYnl0ZSAqLwogICAgICAgICBpZiAoKCpkYXRhKVswXSAhPSAweDQ3KSB7CiAgICAgICAgICAgICAvKiBmaW5kIGEgbmV3IHBhY2tldCBzdGFydCAqLwotICAgICAgICAgICAgdWludDY0X3QgcG9zID0gYXZpb190ZWxsKHBiKTsKLSAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgLUZGTUlOKHJhd19wYWNrZXRfc2l6ZSwgcG9zKSwgU0VFS19DVVIpOwogCi0gICAgICAgICAgICBpZiAobXBlZ3RzX3Jlc3luYyhzKSA8IDApCisgICAgICAgICAgICBpZiAobXBlZ3RzX3Jlc3luYyhzLCByYXdfcGFja2V0X3NpemUsICpkYXRhKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTI0NDEsMTQgKzI1OTksMTQgQEAKICNkZWZpbmUgQ0hFQ0tfQ09VTlQgMTAKICNkZWZpbmUgQ0hFQ0tfQkxPQ0sgMTAwCiAKLSAgICBpZiAoY2hlY2tfY291bnQgPCBDSEVDS19DT1VOVCkKKyAgICBpZiAoIWNoZWNrX2NvdW50KQogICAgICAgICByZXR1cm4gMDsKIAogICAgIGZvciAoaSA9IDA7IGk8Y2hlY2tfY291bnQ7IGkrPUNIRUNLX0JMT0NLKSB7CiAgICAgICAgIGludCBsZWZ0ID0gRkZNSU4oY2hlY2tfY291bnQgLSBpLCBDSEVDS19CTE9DSyk7Ci0gICAgICAgIGludCBzY29yZSAgICAgID0gYW5hbHl6ZShwLT5idWYgKyBUU19QQUNLRVRfU0laRSAgICAgKmksIFRTX1BBQ0tFVF9TSVpFICAgICAqbGVmdCwgVFNfUEFDS0VUX1NJWkUgICAgICwgTlVMTCwgMSk7Ci0gICAgICAgIGludCBkdmhzX3Njb3JlID0gYW5hbHl6ZShwLT5idWYgKyBUU19EVkhTX1BBQ0tFVF9TSVpFKmksIFRTX0RWSFNfUEFDS0VUX1NJWkUqbGVmdCwgVFNfRFZIU19QQUNLRVRfU0laRSwgTlVMTCwgMSk7Ci0gICAgICAgIGludCBmZWNfc2NvcmUgID0gYW5hbHl6ZShwLT5idWYgKyBUU19GRUNfUEFDS0VUX1NJWkUgKmksIFRTX0ZFQ19QQUNLRVRfU0laRSAqbGVmdCwgVFNfRkVDX1BBQ0tFVF9TSVpFICwgTlVMTCwgMSk7CisgICAgICAgIGludCBzY29yZSAgICAgID0gYW5hbHl6ZShwLT5idWYgKyBUU19QQUNLRVRfU0laRSAgICAgKmksIFRTX1BBQ0tFVF9TSVpFICAgICAqbGVmdCwgVFNfUEFDS0VUX1NJWkUgICAgICwgMSk7CisgICAgICAgIGludCBkdmhzX3Njb3JlID0gYW5hbHl6ZShwLT5idWYgKyBUU19EVkhTX1BBQ0tFVF9TSVpFKmksIFRTX0RWSFNfUEFDS0VUX1NJWkUqbGVmdCwgVFNfRFZIU19QQUNLRVRfU0laRSwgMSk7CisgICAgICAgIGludCBmZWNfc2NvcmUgID0gYW5hbHl6ZShwLT5idWYgKyBUU19GRUNfUEFDS0VUX1NJWkUgKmksIFRTX0ZFQ19QQUNLRVRfU0laRSAqbGVmdCwgVFNfRkVDX1BBQ0tFVF9TSVpFICwgMSk7CiAgICAgICAgIHNjb3JlID0gRkZNQVgzKHNjb3JlLCBkdmhzX3Njb3JlLCBmZWNfc2NvcmUpOwogICAgICAgICBzdW1zY29yZSArPSBzY29yZTsKICAgICAgICAgbWF4c2NvcmUgPSBGRk1BWChtYXhzY29yZSwgc2NvcmUpOwpAQCAtMjQ1OSwxMCArMjYxNywxNyBAQAogCiAgICAgZmZfZGxvZygwLCAiVFMgc2NvcmU6ICVkICVkXG4iLCBzdW1zY29yZSwgbWF4c2NvcmUpOwogCi0gICAgaWYgICAgICAoc3Vtc2NvcmUgPiA2KSByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggICArIHN1bXNjb3JlIC0gQ0hFQ0tfQ09VTlQ7Ci0gICAgZWxzZSBpZiAobWF4c2NvcmUgPiA2KSByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVgvMiArIHN1bXNjb3JlIC0gQ0hFQ0tfQ09VTlQ7Ci0gICAgZWxzZQorICAgIGlmICAgICAgICAoY2hlY2tfY291bnQgPiBDSEVDS19DT1VOVCAmJiBzdW1zY29yZSA+IDYpIHsKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYICAgKyBzdW1zY29yZSAtIENIRUNLX0NPVU5UOworICAgIH0gZWxzZSBpZiAoY2hlY2tfY291bnQgPj0gQ0hFQ0tfQ09VTlQgJiYgc3Vtc2NvcmUgPiA2KSB7CisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWC8yICsgc3Vtc2NvcmUgLSBDSEVDS19DT1VOVDsKKyAgICB9IGVsc2UgaWYgKGNoZWNrX2NvdW50ID49IENIRUNLX0NPVU5UICYmIG1heHNjb3JlID4gNikgeworICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVgvMiArIHN1bXNjb3JlIC0gQ0hFQ0tfQ09VTlQ7CisgICAgfSBlbHNlIGlmIChzdW1zY29yZSA+IDYpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogfQogCiAvKiByZXR1cm4gdGhlIDkwa0h6IFBDUiBhbmQgdGhlIGV4dGVuc2lvbiBmb3IgdGhlIDI3TUh6IFBDUi4gcmV0dXJuCkBAIC0yNDk5LDcgKzI2NjQsNyBAQAogICAgICAqIHByb2JlIGJ1ZmZlciB1c3VhbGx5IGlzIGJpZyBlbm91Z2guIE9ubHkgd2FybiBpZiB0aGUgc2VlayBmYWlsZWQKICAgICAgKiBvbiBmaWxlcyB3aGVyZSB0aGUgc2VlayBzaG91bGQgd29yay4gKi8KICAgICBpZiAoYXZpb19zZWVrKHBiLCBwb3MsIFNFRUtfU0VUKSA8IDApCi0gICAgICAgIGF2X2xvZyhzLCBwYi0+c2Vla2FibGUgPyBBVl9MT0dfRVJST1IgOiBBVl9MT0dfSU5GTywgIlVuYWJsZSB0byBzZWVrIGJhY2sgdG8gdGhlIHN0YXJ0XG4iKTsKKyAgICAgICAgYXZfbG9nKHMsIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgPyBBVl9MT0dfRVJST1IgOiBBVl9MT0dfSU5GTywgIlVuYWJsZSB0byBzZWVrIGJhY2sgdG8gdGhlIHN0YXJ0XG4iKTsKIH0KIAogc3RhdGljIGludCBtcGVndHNfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQpAQCAtMjUxMCw2ICsyNjc1LDggQEAKICAgICBpbnQgbGVuOwogICAgIGludDY0X3QgcG9zLCBwcm9iZXNpemUgPSBzLT5wcm9iZXNpemU7CiAKKyAgICBzLT5pbnRlcm5hbC0+cHJlZmVyX2NvZGVjX2ZyYW1lcmF0ZSA9IDE7CisKICAgICBpZiAoZmZpb19lbnN1cmVfc2Vla2JhY2socGIsIHByb2Jlc2l6ZSkgPCAwKQogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVycyBmb3Igc2Vla2JhY2tcbiIpOwogCkBAIC0yNTU2LDggKzI3MjMsOCBAQAogICAgICAgICBpZiAoIXN0KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjAsIDEsIDI3MDAwMDAwKTsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01QRUcyVFM7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NUEVHMlRTOwogCiAgICAgICAgIC8qIHdlIGl0ZXJhdGUgdW50aWwgd2UgZmluZCB0d28gUENScyB0byBlc3RpbWF0ZSB0aGUgYml0cmF0ZSAqLwogICAgICAgICBwY3JfcGlkICAgID0gLTE7CkBAIC0yNTc1LDggKzI3NDIsMTcgQEAKICAgICAgICAgICAgICAgICBwYWNrZXRfY291bnRbbmJfcGNyc10gPSBuYl9wYWNrZXRzOwogICAgICAgICAgICAgICAgIHBjcnNbbmJfcGNyc10gPSBwY3JfaCAqIDMwMCArIHBjcl9sOwogICAgICAgICAgICAgICAgIG5iX3BjcnMrKzsKLSAgICAgICAgICAgICAgICBpZiAobmJfcGNycyA+PSAyKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobmJfcGNycyA+PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwY3JzWzFdIC0gcGNyc1swXSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBkaWZmZXJlbmNlIG5lZWRzIHRvIGJlIHBvc2l0aXZlIHRvIG1ha2Ugc2Vuc2UgZm9yIGJpdHJhdGUgY29tcHV0YXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHRzLT5zdHJlYW0sIEFWX0xPR19XQVJOSU5HLCAiaW52YWxpZCBwY3IgcGFpciAlIlBSSWQ2NCIgPj0gJSJQUklkNjQiXG4iLCBwY3JzWzBdLCBwY3JzWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjcnNbMF0gPSBwY3JzWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0X2NvdW50WzBdID0gcGFja2V0X2NvdW50WzFdOworICAgICAgICAgICAgICAgICAgICAgICAgbmJfcGNycy0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBmaW5pc2hlZF9yZWFkaW5nX3BhY2tldChzLCB0cy0+cmF3X3BhY2tldF9zaXplKTsKICAgICAgICAgICAgIH0KQEAgLTI1ODgsNyArMjc2NCw3IEBACiAgICAgICAgIHRzLT5wY3JfaW5jciA9IChwY3JzWzFdIC0gcGNyc1swXSkgLyAocGFja2V0X2NvdW50WzFdIC0gcGFja2V0X2NvdW50WzBdKTsKICAgICAgICAgdHMtPmN1cl9wY3IgID0gcGNyc1swXSAtIHRzLT5wY3JfaW5jciAqIHBhY2tldF9jb3VudFswXTsKICAgICAgICAgcy0+Yml0X3JhdGUgID0gVFNfUEFDS0VUX1NJWkUgKiA4ICogMjcwMDAwMDBMTCAvIHRzLT5wY3JfaW5jcjsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHMtPmJpdF9yYXRlOworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gcy0+Yml0X3JhdGU7CiAgICAgICAgIHN0LT5zdGFydF90aW1lICAgICAgPSB0cy0+Y3VyX3BjcjsKICAgICAgICAgYXZfbG9nKHRzLT5zdHJlYW0sIEFWX0xPR19UUkFDRSwgInN0YXJ0PSUwLjNmIHBjcj0lMC4zZiBpbmNyPSVkXG4iLAogICAgICAgICAgICAgICAgIHN0LT5zdGFydF90aW1lIC8gMTAwMDAwMC4wLCBwY3JzWzBdIC8gMjdlNiwgdHMtPnBjcl9pbmNyKTsKQEAgLTI2NjMsNyArMjgzOSw5IEBACiAgICAgICAgICAgICBpZiAodHMtPnBpZHNbaV0gJiYgdHMtPnBpZHNbaV0tPnR5cGUgPT0gTVBFR1RTX1BFUykgewogICAgICAgICAgICAgICAgIFBFU0NvbnRleHQgKnBlcyA9IHRzLT5waWRzW2ldLT51LnBlc19maWx0ZXIub3BhcXVlOwogICAgICAgICAgICAgICAgIGlmIChwZXMtPnN0YXRlID09IE1QRUdUU19QQVlMT0FEICYmIHBlcy0+ZGF0YV9pbmRleCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbmV3X3Blc19wYWNrZXQocGVzLCBwa3QpOworICAgICAgICAgICAgICAgICAgICByZXQgPSBuZXdfcGVzX3BhY2tldChwZXMsIHBrdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICAgICAgcGVzLT5zdGF0ZSA9IE1QRUdUU19TS0lQOwogICAgICAgICAgICAgICAgICAgICByZXQgPSAwOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI3MTIsOCArMjg5MCw3IEBACiAgICAgICAgIGlmIChhdmlvX3JlYWQocy0+cGIsIGJ1ZiwgVFNfUEFDS0VUX1NJWkUpICE9IFRTX1BBQ0tFVF9TSVpFKQogICAgICAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOwogICAgICAgICBpZiAoYnVmWzBdICE9IDB4NDcpIHsKLSAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgLVRTX1BBQ0tFVF9TSVpFLCBTRUVLX0NVUik7Ci0gICAgICAgICAgICBpZiAobXBlZ3RzX3Jlc3luYyhzKSA8IDApCisgICAgICAgICAgICBpZiAobXBlZ3RzX3Jlc3luYyhzLCBUU19QQUNLRVRfU0laRSwgYnVmKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOwogICAgICAgICAgICAgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXBlZ3RzLmggYi9saWJhdmZvcm1hdC9tcGVndHMuaAppbmRleCAwY2RiYzc2Li4yNzJlMmJlIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tcGVndHMuaAorKysgYi9saWJhdmZvcm1hdC9tcGVndHMuaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBNUEVHMiB0cmFuc3BvcnQgc3RyZWFtIGRlZmluZXMKKyAqIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtIGRlZmluZXMKICAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCkBAIC01MSw2ICs1MSw3IEBACiAjZGVmaW5lIFNUUkVBTV9UWVBFX0FVRElPX0FBQyAgICAgICAweDBmCiAjZGVmaW5lIFNUUkVBTV9UWVBFX0FVRElPX0FBQ19MQVRNICAweDExCiAjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX01QRUc0ICAgICAweDEwCisjZGVmaW5lIFNUUkVBTV9UWVBFX01FVEFEQVRBICAgICAgICAweDE1CiAjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX0gyNjQgICAgICAweDFiCiAjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX0hFVkMgICAgICAweDI0CiAjZGVmaW5lIFNUUkVBTV9UWVBFX1ZJREVPX0NBVlMgICAgICAweDQyCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tcGVndHNlbmMuYyBiL2xpYmF2Zm9ybWF0L21wZWd0c2VuYy5jCmluZGV4IDc2NTY3MjAuLjhiMDczNmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L21wZWd0c2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L21wZWd0c2VuYy5jCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QRUcyIHRyYW5zcG9ydCBzdHJlYW0gKGFrYSBEVkIpIG11eGVyCisgKiBNUEVHLTIgdHJhbnNwb3J0IHN0cmVhbSAoYWthIERWQikgbXV4ZXIKICAqIENvcHlyaWdodCAoYykgMjAwMyBGYWJyaWNlIEJlbGxhcmQKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCkBAIC0zOCwyNCArMzgsMjggQEAKIAogLyogd3JpdGUgRFZCIFNJIHNlY3Rpb25zICovCiAKKyNkZWZpbmUgRFZCX1BSSVZBVEVfTkVUV09SS19TVEFSVCAweGZmMDEKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIG1wZWd0cyBzZWN0aW9uIHdyaXRlciAqLwogCiB0eXBlZGVmIHN0cnVjdCBNcGVnVFNTZWN0aW9uIHsKICAgICBpbnQgcGlkOwogICAgIGludCBjYzsKKyAgICBpbnQgZGlzY29udGludWl0eTsKICAgICB2b2lkICgqd3JpdGVfcGFja2V0KShzdHJ1Y3QgTXBlZ1RTU2VjdGlvbiAqcywgY29uc3QgdWludDhfdCAqcGFja2V0KTsKICAgICB2b2lkICpvcGFxdWU7CiB9IE1wZWdUU1NlY3Rpb247CiAKIHR5cGVkZWYgc3RydWN0IE1wZWdUU1NlcnZpY2UgewotICAgIE1wZWdUU1NlY3Rpb24gcG10OyAvKiBNUEVHMiBwbXQgdGFibGUgY29udGV4dCAqLworICAgIE1wZWdUU1NlY3Rpb24gcG10OyAvKiBNUEVHLTIgUE1UIHRhYmxlIGNvbnRleHQgKi8KICAgICBpbnQgc2lkOyAgICAgICAgICAgLyogc2VydmljZSBJRCAqLwogICAgIGNoYXIgKm5hbWU7CiAgICAgY2hhciAqcHJvdmlkZXJfbmFtZTsKICAgICBpbnQgcGNyX3BpZDsKICAgICBpbnQgcGNyX3BhY2tldF9jb3VudDsKICAgICBpbnQgcGNyX3BhY2tldF9wZXJpb2Q7CisgICAgQVZQcm9ncmFtICpwcm9ncmFtOwogfSBNcGVnVFNTZXJ2aWNlOwogCiAvLyBzZXJ2aWNlX3R5cGUgdmFsdWVzIGFzIGRlZmluZWQgaW4gRVRTSSAzMDAgNDY4CkBAIC02NiwxMiArNzAsMTMgQEAKICAgICBNUEVHVFNfU0VSVklDRV9UWVBFX0FEVkFOQ0VEX0NPREVDX0RJR0lUQUxfUkFESU8gPSAweDBBLAogICAgIE1QRUdUU19TRVJWSUNFX1RZUEVfTVBFRzJfRElHSVRBTF9IRFRWICAgICAgICAgICA9IDB4MTEsCiAgICAgTVBFR1RTX1NFUlZJQ0VfVFlQRV9BRFZBTkNFRF9DT0RFQ19ESUdJVEFMX1NEVFYgID0gMHgxNiwKLSAgICBNUEVHVFNfU0VSVklDRV9UWVBFX0FEVkFOQ0VEX0NPREVDX0RJR0lUQUxfSERUViAgPSAweDE5CisgICAgTVBFR1RTX1NFUlZJQ0VfVFlQRV9BRFZBTkNFRF9DT0RFQ19ESUdJVEFMX0hEVFYgID0gMHgxOSwKKyAgICBNUEVHVFNfU0VSVklDRV9UWVBFX0hFVkNfRElHSVRBTF9IRFRWICAgICAgICAgICAgPSAweDFGLAogfTsKIHR5cGVkZWYgc3RydWN0IE1wZWdUU1dyaXRlIHsKICAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKLSAgICBNcGVnVFNTZWN0aW9uIHBhdDsgLyogTVBFRzIgcGF0IHRhYmxlICovCi0gICAgTXBlZ1RTU2VjdGlvbiBzZHQ7IC8qIE1QRUcyIHNkdCB0YWJsZSBjb250ZXh0ICovCisgICAgTXBlZ1RTU2VjdGlvbiBwYXQ7IC8qIE1QRUctMiBQQVQgdGFibGUgKi8KKyAgICBNcGVnVFNTZWN0aW9uIHNkdDsgLyogTVBFRy0yIFNEVCB0YWJsZSBjb250ZXh0ICovCiAgICAgTXBlZ1RTU2VydmljZSAqKnNlcnZpY2VzOwogICAgIGludCBzZHRfcGFja2V0X2NvdW50OwogICAgIGludCBzZHRfcGFja2V0X3BlcmlvZDsKQEAgLTEwMCw2ICsxMDUsNyBAQAogI2RlZmluZSBNUEVHVFNfRkxBR19BQUNfTEFUTSAgICAgICAgMHgwMgogI2RlZmluZSBNUEVHVFNfRkxBR19QQVRfUE1UX0FUX0ZSQU1FUyAgICAgICAgICAgMHgwNAogI2RlZmluZSBNUEVHVFNfRkxBR19TWVNURU1fQiAgICAgICAgMHgwOAorI2RlZmluZSBNUEVHVFNfRkxBR19ESVNDT05UICAgICAgICAgMHgxMAogICAgIGludCBmbGFnczsKICAgICBpbnQgY29weXRzOwogICAgIGludCB0YWJsZXNfdmVyc2lvbjsKQEAgLTE0OSw2ICsxNTUsMTIgQEAKICAgICAgICAgKnErKyAgPSBzLT5waWQ7CiAgICAgICAgIHMtPmNjID0gcy0+Y2MgKyAxICYgMHhmOwogICAgICAgICAqcSsrICA9IDB4MTAgfCBzLT5jYzsKKyAgICAgICAgaWYgKHMtPmRpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgICAgIHFbLTFdIHw9IDB4MjA7CisgICAgICAgICAgICAqcSsrID0gMTsKKyAgICAgICAgICAgICpxKysgPSAweDgwOworICAgICAgICAgICAgcy0+ZGlzY29udGludWl0eSA9IDA7CisgICAgICAgIH0KICAgICAgICAgaWYgKGZpcnN0KQogICAgICAgICAgICAgKnErKyA9IDA7IC8qIDAgb2Zmc2V0ICovCiAgICAgICAgIGxlbjEgPSBUU19QQUNLRVRfU0laRSAtIChxIC0gcGFja2V0KTsKQEAgLTIxOSw2ICsyMzEsNyBAQAogICAgIHN0cnVjdCBNcGVnVFNTZXJ2aWNlICpzZXJ2aWNlOwogICAgIGludCBwaWQ7IC8qIHN0cmVhbSBhc3NvY2lhdGVkIHBpZCAqLwogICAgIGludCBjYzsKKyAgICBpbnQgZGlzY29udGludWl0eTsKICAgICBpbnQgcGF5bG9hZF9zaXplOwogICAgIGludCBmaXJzdF9wdHNfY2hlY2s7IC8vLzwgZmlyc3QgcHRzIGNoZWNrIG5lZWRlZAogICAgIGludCBwcmV2X3BheWxvYWRfa2V5OwpAQCAtMjUxLDYgKzI2NCwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBxIC0gZGF0YSk7CiB9CiAKKy8qIE5PVEU6ICFzdHIgaXMgYWNjZXB0ZWQgZm9yIGFuIGVtcHR5IHN0cmluZyAqLworc3RhdGljIHZvaWQgcHV0c3RyOCh1aW50OF90ICoqcV9wdHIsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHdyaXRlX2xlbikKK3sKKyAgICB1aW50OF90ICpxOworICAgIGludCBsZW47CisKKyAgICBxID0gKnFfcHRyOworICAgIGlmICghc3RyKQorICAgICAgICBsZW4gPSAwOworICAgIGVsc2UKKyAgICAgICAgbGVuID0gc3RybGVuKHN0cik7CisgICAgaWYgKHdyaXRlX2xlbikKKyAgICAgICAgKnErKyA9IGxlbjsKKyAgICBpZiAoIXN0cikgeworICAgICAgICAqcV9wdHIgPSBxOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1lbWNweShxLCBzdHIsIGxlbik7CisgICAgcSAgICAgKz0gbGVuOworICAgICpxX3B0ciA9IHE7Cit9CisKIHN0YXRpYyBpbnQgbXBlZ3RzX3dyaXRlX3BtdChBVkZvcm1hdENvbnRleHQgKnMsIE1wZWdUU1NlcnZpY2UgKnNlcnZpY2UpCiB7CiAgICAgTXBlZ1RTV3JpdGUgKnRzID0gcy0+cHJpdl9kYXRhOwpAQCAtMjc1LDE1ICszMTAsMTIgQEAKICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmxhbmcgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIE5VTEwsIDApOwogCiAgICAgICAgIGlmIChzLT5uYl9wcm9ncmFtcykgewotICAgICAgICAgICAgaW50IGosIGssIGZvdW5kID0gMDsKKyAgICAgICAgICAgIGludCBrLCBmb3VuZCA9IDA7CisgICAgICAgICAgICBBVlByb2dyYW0gKnByb2dyYW0gPSBzZXJ2aWNlLT5wcm9ncmFtOwogCi0gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+bmJfcHJvZ3JhbXM7IGorKykKLSAgICAgICAgICAgICAgICBpZiAocy0+cHJvZ3JhbXNbal0tPmlkID09IHNlcnZpY2UtPnNpZCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcy0+cHJvZ3JhbXNbal0tPm5iX3N0cmVhbV9pbmRleGVzOyBrKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocy0+cHJvZ3JhbXNbal0tPnN0cmVhbV9pbmRleFtrXSA9PSBpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHByb2dyYW0tPm5iX3N0cmVhbV9pbmRleGVzOyBrKyspCisgICAgICAgICAgICAgICAgaWYgKHByb2dyYW0tPnN0cmVhbV9pbmRleFtrXSA9PSBpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yOTUsNyArMzI3LDcgQEAKICAgICAgICAgICAgIGVyciA9IDE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfTVBFRzFWSURFTzoKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOgogICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9WSURFT19NUEVHMjsKQEAgLTMyMCw3ICszNTIsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QMjoKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDM6Ci0gICAgICAgICAgICBzdHJlYW1fdHlwZSA9IFNUUkVBTV9UWVBFX0FVRElPX01QRUcxOworICAgICAgICAgICAgaWYgKCAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPiAwCisgICAgICAgICAgICAgICAgJiYgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA8IDMyMDAwKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9BVURJT19NUEVHMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9BVURJT19NUEVHMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FBQzoKICAgICAgICAgICAgIHN0cmVhbV90eXBlID0gKHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX0FBQ19MQVRNKQpAQCAtMzQ5LDYgKzM4Niw5IEBACiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfT1BVUzoKICAgICAgICAgICAgIHN0cmVhbV90eXBlID0gU1RSRUFNX1RZUEVfUFJJVkFURV9EQVRBOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVElNRURfSUQzOgorICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9NRVRBREFUQTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3RyZWFtX3R5cGUgPSBTVFJFQU1fVFlQRV9QUklWQVRFX0RBVEE7CiAgICAgICAgICAgICBicmVhazsKQEAgLTM2MCwxOSArNDAwLDE5IEBACiAgICAgICAgIHEgKz0gMjsgLyogcGF0Y2hlZCBhZnRlciAqLwogCiAgICAgICAgIC8qIHdyaXRlIG9wdGlvbmFsIGRlc2NyaXB0b3JzIGhlcmUgKi8KLSAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpIHsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZD09QVZfQ09ERUNfSURfQUMzICYmICh0cy0+ZmxhZ3MgJiBNUEVHVFNfRkxBR19TWVNURU1fQikpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9BQzMgJiYgKHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX1NZU1RFTV9CKSkgewogICAgICAgICAgICAgICAgICpxKys9MHg2YTsgLy8gQUMzIGRlc2NyaXB0b3Igc2VlIEEwMzggRFZCIFNJCiAgICAgICAgICAgICAgICAgKnErKz0xOyAvLyAxIGJ5dGUsIGFsbCBmbGFncyBzZXRzIHRvIDAKICAgICAgICAgICAgICAgICAqcSsrPTA7IC8vIG9taXQgYWxsIGZpZWxkcy4uLgogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX0VBQzMgJiYgKHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX1NZU1RFTV9CKSkgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX0VBQzMgJiYgKHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX1NZU1RFTV9CKSkgewogICAgICAgICAgICAgICAgICpxKys9MHg3YTsgLy8gRUFDMyBkZXNjcmlwdG9yIHNlZSBBMDM4IERWQiBTSQogICAgICAgICAgICAgICAgICpxKys9MTsgLy8gMSBieXRlLCBhbGwgZmxhZ3Mgc2V0cyB0byAwCiAgICAgICAgICAgICAgICAgKnErKz0wOyAvLyBvbWl0IGFsbCBmaWVsZHMuLi4KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9TMzAyTSkgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQ9PUFWX0NPREVDX0lEX1MzMDJNKSB7CiAgICAgICAgICAgICAgICAgKnErKyA9IDB4MDU7IC8qIE1QRUctMiByZWdpc3RyYXRpb24gZGVzY3JpcHRvciovCiAgICAgICAgICAgICAgICAgKnErKyA9IDQ7CiAgICAgICAgICAgICAgICAgKnErKyA9ICdCJzsKQEAgLTM4MCw3ICs0MjAsNyBAQAogICAgICAgICAgICAgICAgICpxKysgPSAnUyc7CiAgICAgICAgICAgICAgICAgKnErKyA9ICdEJzsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkPT1BVl9DT0RFQ19JRF9PUFVTKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZD09QVZfQ09ERUNfSURfT1BVUykgewogICAgICAgICAgICAgICAgIC8qIDYgYnl0ZXMgcmVnaXN0cmF0aW9uIGRlc2NyaXB0b3IsIDQgYnl0ZXMgT3B1cyBhdWRpbyBkZXNjcmlwdG9yICovCiAgICAgICAgICAgICAgICAgaWYgKHEgLSBkYXRhID4gU0VDVElPTl9MRU5HVEggLSA2IC0gNCkgewogICAgICAgICAgICAgICAgICAgICBlcnIgPSAxOwpAQCAtMzk4LDEyICs0MzgsMTIgQEAKICAgICAgICAgICAgICAgICAqcSsrID0gMjsKICAgICAgICAgICAgICAgICAqcSsrID0gMHg4MDsKIAotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YSAmJiBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID49IDE5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YVsxOF0gPT0gMCAmJiBzdC0+Y29kZWMtPmNoYW5uZWxzIDw9IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgJiYgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA+PSAxOSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMThdID09IDAgJiYgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA8PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSVFAgbWFwcGluZyBmYW1pbHkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBzdC0+Y29kZWMtPmNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzE4XSA9PSAxICYmIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPD0gOCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPj0gMjEgKyBzdC0+Y29kZWMtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxOF0gPT0gMSAmJiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzIDw9IDggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID49IDIxICsgc3QtPmNvZGVjcGFyLT5jaGFubmVscykgewogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgY291cGxlZF9zdHJlYW1fY291bnRzWzldID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDEsIDEsIDIsIDIsIDIsIDMsIDMKICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC00MjksMTQgKzQ2OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZvcmJpcyBtYXBwaW5nIGZhbWlseSAqLwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFbMTldID09IHN0LT5jb2RlYy0+Y2hhbm5lbHMgLSBjb3VwbGVkX3N0cmVhbV9jb3VudHNbc3QtPmNvZGVjLT5jaGFubmVsc10gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsyMF0gPT0gY291cGxlZF9zdHJlYW1fY291bnRzW3N0LT5jb2RlYy0+Y2hhbm5lbHNdICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY21wKCZzdC0+Y29kZWMtPmV4dHJhZGF0YVsyMV0sIGNoYW5uZWxfbWFwX2Fbc3QtPmNvZGVjLT5jaGFubmVscy0xXSwgc3QtPmNvZGVjLT5jaGFubmVscykgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBzdC0+Y29kZWMtPmNoYW5uZWxzOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID49IDIgJiYgc3QtPmNvZGVjLT5leHRyYWRhdGFbMTldID09IHN0LT5jb2RlYy0+Y2hhbm5lbHMgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbMjBdID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY21wKCZzdC0+Y29kZWMtPmV4dHJhZGF0YVsyMV0sIGNoYW5uZWxfbWFwX2Jbc3QtPmNvZGVjLT5jaGFubmVscy0xXSwgc3QtPmNvZGVjLT5jaGFubmVscykgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBzdC0+Y29kZWMtPmNoYW5uZWxzIHwgMHg4MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxOV0gPT0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAtIGNvdXBsZWRfc3RyZWFtX2NvdW50c1tzdC0+Y29kZWNwYXItPmNoYW5uZWxzXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzIwXSA9PSBjb3VwbGVkX3N0cmVhbV9jb3VudHNbc3QtPmNvZGVjcGFyLT5jaGFubmVsc10gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzIxXSwgY2hhbm5lbF9tYXBfYVtzdC0+Y29kZWNwYXItPmNoYW5uZWxzLTFdLCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPj0gMiAmJiBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsxOV0gPT0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsyMF0gPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzIxXSwgY2hhbm5lbF9tYXBfYltzdC0+Y29kZWNwYXItPmNoYW5uZWxzLTFdLCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgfCAweDgwOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVbnN1cHBvcnRlZCwgY291bGQgd3JpdGUgYW4gZXh0ZW5kZWQgZGVzY3JpcHRvciBoZXJlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIE9wdXMgVm9yYmlzLXN0eWxlIGNoYW5uZWwgbWFwcGluZyIpOwpAQCAtNDQ0LDEyICs0ODQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVuc3VwcG9ydGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgT3B1cyBjaGFubmVsIG1hcHBpbmcgZm9yIGZhbWlseSAlZCIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzE4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgT3B1cyBjaGFubmVsIG1hcHBpbmcgZm9yIGZhbWlseSAlZCIsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzE4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gMHhmZjsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA8PSAyKSB7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzIDw9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIFJUUCBtYXBwaW5nIGZhbWlseSAqLwotICAgICAgICAgICAgICAgICAgICAqcSsrID0gc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgKnErKyA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyogVW5zdXBwb3J0ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIE9wdXMgY2hhbm5lbCBtYXBwaW5nIik7CkBAIC01MDAsNyArNTQwLDcgQEAKICAgICAgICAgICAgY29uc3QgY2hhciBkZWZhdWx0X2xhbmd1YWdlW10gPSAidW5kIjsKICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZ3VhZ2UgPSBsYW5nICYmIHN0cmxlbihsYW5nLT52YWx1ZSkgPj0gMyA/IGxhbmctPnZhbHVlIDogZGVmYXVsdF9sYW5ndWFnZTsKIAotICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkJfU1VCVElUTEUpIHsKKyAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFKSB7CiAgICAgICAgICAgICAgICB1aW50OF90ICpsZW5fcHRyOwogICAgICAgICAgICAgICAgaW50IGV4dHJhZGF0YV9jb3BpZWQgPSAwOwogCkBAIC01MTksOSArNTU5LDkgQEAKICAgICAgICAgICAgICAgICAgICBpZiAoKmxhbmd1YWdlICE9ICdcMCcpCiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlKys7CiAKLSAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAtIGV4dHJhZGF0YV9jb3BpZWQgPj0gNSkgewotICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gc3QtPmNvZGVjLT5leHRyYWRhdGFbZXh0cmFkYXRhX2NvcGllZCArIDRdOyAvKiBzdWJ0aXRsaW5nX3R5cGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgZXh0cmFkYXRhX2NvcGllZCwgNCk7IC8qIGNvbXBvc2l0aW9uX3BhZ2VfaWQgYW5kIGFuY2lsbGFyeV9wYWdlX2lkICovCisgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgLSBleHRyYWRhdGFfY29waWVkID49IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgKnErKyA9IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhW2V4dHJhZGF0YV9jb3BpZWQgKyA0XTsgLyogc3VidGl0bGluZ190eXBlICovCisgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShxLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIGV4dHJhZGF0YV9jb3BpZWQsIDQpOyAvKiBjb21wb3NpdGlvbl9wYWdlX2lkIGFuZCBhbmNpbGxhcnlfcGFnZV9pZCAqLwogICAgICAgICAgICAgICAgICAgICAgICBleHRyYWRhdGFfY29waWVkICs9IDU7CiAgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gNDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTI5LDkgKzU2OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAqIDB4MTAgLSBub3JtYWwgd2l0aCBubyBtb25pdG9yIGFzcGVjdCByYXRpbyBjcml0aWNhbGl0eQogICAgICAgICAgICAgICAgICAgICAgICAgKiAweDIwIC0gZm9yIHRoZSBoYXJkIG9mIGhlYXJpbmcgd2l0aCBubyBtb25pdG9yIGFzcGVjdCByYXRpbyBjcml0aWNhbGl0eSAqLwogICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQpID8gMHgyMCA6IDB4MTA7Ci0gICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9PSA0KSAmJiAoZXh0cmFkYXRhX2NvcGllZCA9PSAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPT0gNCkgJiYgKGV4dHJhZGF0YV9jb3BpZWQgPT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgb2Ygb2xkIDQtYnl0ZSBleHRyYWRhdGEgZm9ybWF0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocSwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIDQpOyAvKiBjb21wb3NpdGlvbl9wYWdlX2lkIGFuZCBhbmNpbGxhcnlfcGFnZV9pZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHEsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCA0KTsgLyogY29tcG9zaXRpb25fcGFnZV9pZCBhbmQgYW5jaWxsYXJ5X3BhZ2VfaWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZGF0YV9jb3BpZWQgKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gNDsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTU0Miw3ICs1ODIsNyBAQAogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAqbGVuX3B0ciA9IHEgLSBsZW5fcHRyIC0gMTsKLSAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWQl9URUxFVEVYVCkgeworICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUKSB7CiAgICAgICAgICAgICAgICB1aW50OF90ICpsZW5fcHRyID0gTlVMTDsKICAgICAgICAgICAgICAgIGludCBleHRyYWRhdGFfY29waWVkID0gMDsKIApAQCAtNTU4LDggKzU5OCw4IEBACiAgICAgICAgICAgICAgICAgICAgaWYgKCpsYW5ndWFnZSAhPSAnXDAnKQogICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZSsrOwogCi0gICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgLSAxID4gZXh0cmFkYXRhX2NvcGllZCkgewotICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkocSwgc3QtPmNvZGVjLT5leHRyYWRhdGEgKyBleHRyYWRhdGFfY29waWVkLCAyKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSAtIDEgPiBleHRyYWRhdGFfY29waWVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShxLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIGV4dHJhZGF0YV9jb3BpZWQsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICBleHRyYWRhdGFfY29waWVkICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHEgKz0gMjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTk0LDEzICs2MzQsMjMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9EQVRBOgotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU01QVEVfS0xWKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TTVBURV9LTFYpIHsKICAgICAgICAgICAgICAgICAqcSsrID0gMHgwNTsgLyogTVBFRy0yIHJlZ2lzdHJhdGlvbiBkZXNjcmlwdG9yICovCiAgICAgICAgICAgICAgICAgKnErKyA9IDQ7CiAgICAgICAgICAgICAgICAgKnErKyA9ICdLJzsKICAgICAgICAgICAgICAgICAqcSsrID0gJ0wnOwogICAgICAgICAgICAgICAgICpxKysgPSAnVic7CiAgICAgICAgICAgICAgICAgKnErKyA9ICdBJzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9USU1FRF9JRDMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcgPSAiSUQzICI7CisgICAgICAgICAgICAgICAgKnErKyA9IDB4MjY7IC8qIG1ldGFkYXRhIGRlc2NyaXB0b3IgKi8KKyAgICAgICAgICAgICAgICAqcSsrID0gMTM7CisgICAgICAgICAgICAgICAgcHV0MTYoJnEsIDB4ZmZmZik7ICAgIC8qIG1ldGFkYXRhIGFwcGxpY2F0aW9uIGZvcm1hdCAqLworICAgICAgICAgICAgICAgIHB1dHN0cjgoJnEsIHRhZywgMCk7CisgICAgICAgICAgICAgICAgKnErKyA9IDB4ZmY7ICAgICAgICAvKiBtZXRhZGF0YSBmb3JtYXQgKi8KKyAgICAgICAgICAgICAgICBwdXRzdHI4KCZxLCB0YWcsIDApOworICAgICAgICAgICAgICAgICpxKysgPSAwOyAgICAgICAgICAgIC8qIG1ldGFkYXRhIHNlcnZpY2UgSUQgKi8KKyAgICAgICAgICAgICAgICAqcSsrID0gMHhGOyAgICAgICAgICAvKiBtZXRhZGF0YV9sb2NhdG9yX3JlY29yZF9mbGFnfE1QRUdfY2FycmlhZ2VfZmxhZ3N8cmVzZXJ2ZWQgKi8KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02MjEsMjMgKzY3MSw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qIE5PVEU6ICFzdHIgaXMgYWNjZXB0ZWQgZm9yIGFuIGVtcHR5IHN0cmluZyAqLwotc3RhdGljIHZvaWQgcHV0c3RyOCh1aW50OF90ICoqcV9wdHIsIGNvbnN0IGNoYXIgKnN0cikKLXsKLSAgICB1aW50OF90ICpxOwotICAgIGludCBsZW47Ci0KLSAgICBxID0gKnFfcHRyOwotICAgIGlmICghc3RyKQotICAgICAgICBsZW4gPSAwOwotICAgIGVsc2UKLSAgICAgICAgbGVuID0gc3RybGVuKHN0cik7Ci0gICAgKnErKyA9IGxlbjsKLSAgICBtZW1jcHkocSwgc3RyLCBsZW4pOwotICAgIHEgICAgICs9IGxlbjsKLSAgICAqcV9wdHIgPSBxOwotfQotCiBzdGF0aWMgdm9pZCBtcGVndHNfd3JpdGVfc2R0KEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBNcGVnVFNXcml0ZSAqdHMgPSBzLT5wcml2X2RhdGE7CkBAIC02NjIsOCArNjk1LDggQEAKICAgICAgICAgZGVzY19sZW5fcHRyID0gcTsKICAgICAgICAgcSsrOwogICAgICAgICAqcSsrICAgICAgICAgPSB0cy0+c2VydmljZV90eXBlOwotICAgICAgICBwdXRzdHI4KCZxLCBzZXJ2aWNlLT5wcm92aWRlcl9uYW1lKTsKLSAgICAgICAgcHV0c3RyOCgmcSwgc2VydmljZS0+bmFtZSk7CisgICAgICAgIHB1dHN0cjgoJnEsIHNlcnZpY2UtPnByb3ZpZGVyX25hbWUsIDEpOworICAgICAgICBwdXRzdHI4KCZxLCBzZXJ2aWNlLT5uYW1lLCAxKTsKICAgICAgICAgZGVzY19sZW5fcHRyWzBdID0gcSAtIGRlc2NfbGVuX3B0ciAtIDE7CiAKICAgICAgICAgLyogZmlsbCBkZXNjcmlwdG9yIGxlbmd0aCAqLwpAQCAtNzY2LDYgKzc5OSw3IEBACiAgICAgICAgIHNlcnZpY2UtPnBtdC53cml0ZV9wYWNrZXQgPSBzZWN0aW9uX3dyaXRlX3BhY2tldDsKICAgICAgICAgc2VydmljZS0+cG10Lm9wYXF1ZSAgICAgICA9IHM7CiAgICAgICAgIHNlcnZpY2UtPnBtdC5jYyAgICAgICAgICAgPSAxNTsKKyAgICAgICAgc2VydmljZS0+cG10LmRpc2NvbnRpbnVpdHk9IHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX0RJU0NPTlQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3Byb2dyYW1zOyBpKyspIHsKICAgICAgICAgICAgIEFWUHJvZ3JhbSAqcHJvZ3JhbSA9IHMtPnByb2dyYW1zW2ldOwpAQCAtNzg0LDYgKzgxOCw4IEBACiAgICAgICAgICAgICBzZXJ2aWNlLT5wbXQud3JpdGVfcGFja2V0ID0gc2VjdGlvbl93cml0ZV9wYWNrZXQ7CiAgICAgICAgICAgICBzZXJ2aWNlLT5wbXQub3BhcXVlICAgICAgID0gczsKICAgICAgICAgICAgIHNlcnZpY2UtPnBtdC5jYyAgICAgICAgICAgPSAxNTsKKyAgICAgICAgICAgIHNlcnZpY2UtPnBtdC5kaXNjb250aW51aXR5PSB0cy0+ZmxhZ3MgJiBNUEVHVFNfRkxBR19ESVNDT05UOworICAgICAgICAgICAgc2VydmljZS0+cHJvZ3JhbSAgICAgICAgICA9IHByb2dyYW07CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc5MSwxMSArODI3LDEzIEBACiAgICAgLyogSW5pdGlhbGl6ZSBhdCAxNSBzbyB0aGF0IGl0IHdyYXBzIGFuZCBpcyBlcXVhbCB0byAwIGZvciB0aGUKICAgICAgKiBmaXJzdCBwYWNrZXQgd2Ugd3JpdGUuICovCiAgICAgdHMtPnBhdC5jYyAgICAgICAgICAgPSAxNTsKKyAgICB0cy0+cGF0LmRpc2NvbnRpbnVpdHk9IHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX0RJU0NPTlQ7CiAgICAgdHMtPnBhdC53cml0ZV9wYWNrZXQgPSBzZWN0aW9uX3dyaXRlX3BhY2tldDsKICAgICB0cy0+cGF0Lm9wYXF1ZSAgICAgICA9IHM7CiAKICAgICB0cy0+c2R0LnBpZCAgICAgICAgICA9IFNEVF9QSUQ7CiAgICAgdHMtPnNkdC5jYyAgICAgICAgICAgPSAxNTsKKyAgICB0cy0+c2R0LmRpc2NvbnRpbnVpdHk9IHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX0RJU0NPTlQ7CiAgICAgdHMtPnNkdC53cml0ZV9wYWNrZXQgPSBzZWN0aW9uX3dyaXRlX3BhY2tldDsKICAgICB0cy0+c2R0Lm9wYXF1ZSAgICAgICA9IHM7CiAKQEAgLTgwNyw2ICs4NDUsNyBAQAogCiAgICAgLyogYXNzaWduIHBpZHMgdG8gZWFjaCBzdHJlYW0gKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWUHJvZ3JhbSAqcHJvZ3JhbTsKICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOwogCiAgICAgICAgIHRzX3N0ID0gYXZfbWFsbG9jeihzaXplb2YoTXBlZ1RTV3JpdGVTdHJlYW0pKTsKQEAgLTgyNCw2ICs4NjMsMTcgQEAKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQorCisgICAgICAgIHByb2dyYW0gPSBhdl9maW5kX3Byb2dyYW1fZnJvbV9zdHJlYW0ocywgTlVMTCwgaSk7CisgICAgICAgIGlmIChwcm9ncmFtKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdHMtPm5iX3NlcnZpY2VzOyBqKyspIHsKKyAgICAgICAgICAgICAgICBpZiAodHMtPnNlcnZpY2VzW2pdLT5wcm9ncmFtID09IHByb2dyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmljZSA9IHRzLT5zZXJ2aWNlc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgdHNfc3QtPnNlcnZpY2UgPSBzZXJ2aWNlOwogICAgICAgICAvKiBNUEVHIHBpZCB2YWx1ZXMgPCAxNiBhcmUgcmVzZXJ2ZWQuIEFwcGxpY2F0aW9ucyB3aGljaCBzZXQgc3QtPmlkIGluCiAgICAgICAgICAqIHRoaXMgcmFuZ2UgYXJlIGFzc2lnbmVkIGEgY2FsY3VsYXRlZCBwaWQuICovCkBAIC04NTQsMTQgKzkwNCwxNSBAQAogICAgICAgICB0c19zdC0+cGF5bG9hZF9kdHMgICAgID0gQVZfTk9QVFNfVkFMVUU7CiAgICAgICAgIHRzX3N0LT5maXJzdF9wdHNfY2hlY2sgPSAxOwogICAgICAgICB0c19zdC0+Y2MgICAgICAgICAgICAgID0gMTU7CisgICAgICAgIHRzX3N0LT5kaXNjb250aW51aXR5ICAgPSB0cy0+ZmxhZ3MgJiBNUEVHVFNfRkxBR19ESVNDT05UOwogICAgICAgICAvKiB1cGRhdGUgUENSIHBpZCBieSB1c2luZyB0aGUgZmlyc3QgdmlkZW8gc3RyZWFtICovCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCiAgICAgICAgICAgICBzZXJ2aWNlLT5wY3JfcGlkID09IDB4MWZmZikgewogICAgICAgICAgICAgc2VydmljZS0+cGNyX3BpZCA9IHRzX3N0LT5waWQ7CiAgICAgICAgICAgICBwY3Jfc3QgICAgICAgICAgID0gc3Q7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDICYmCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID4gMCkgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPiAwKSB7CiAgICAgICAgICAgICBBVlN0cmVhbSAqYXN0OwogICAgICAgICAgICAgdHNfc3QtPmFtdXggPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7CiAgICAgICAgICAgICBpZiAoIXRzX3N0LT5hbXV4KSB7CkBAIC04NzksNyArOTMwLDcgQEAKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQoYXN0LT5jb2RlYywgc3QtPmNvZGVjKTsKKyAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KGFzdC0+Y29kZWNwYXIsIHN0LT5jb2RlY3Bhcik7CiAgICAgICAgICAgICBpZiAocmV0ICE9IDApCiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgYXN0LT50aW1lX2Jhc2UgPSBzdC0+dGltZV9iYXNlOwpAQCAtODg3LDggKzkzOCw4IEBACiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykgewotICAgICAgICAgICAgdHNfc3QtPm9wdXNfcGVuZGluZ190cmltX3N0YXJ0ID0gc3QtPmNvZGVjLT5pbml0aWFsX3BhZGRpbmcgKiA0ODAwMCAvIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKKyAgICAgICAgICAgIHRzX3N0LT5vcHVzX3BlbmRpbmdfdHJpbV9zdGFydCA9IHN0LT5jb2RlY3Bhci0+aW5pdGlhbF9wYWRkaW5nICogNDgwMDAgLyBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOwogICAgICAgICB9CiAgICAgfQogCkBAIC05MTYsMTQgKzk2NywxNSBAQAogICAgICAgICAvKiBBcmJpdHJhcnkgdmFsdWVzLCBQQVQvUE1UIHdpbGwgYWxzbyBiZSB3cml0dGVuIG9uIHZpZGVvIGtleSBmcmFtZXMgKi8KICAgICAgICAgdHMtPnNkdF9wYWNrZXRfcGVyaW9kID0gMjAwOwogICAgICAgICB0cy0+cGF0X3BhY2tldF9wZXJpb2QgPSA0MDsKLSAgICAgICAgaWYgKHBjcl9zdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBpZiAoIXBjcl9zdC0+Y29kZWMtPmZyYW1lX3NpemUpIHsKKyAgICAgICAgaWYgKHBjcl9zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpbnQgZnJhbWVfc2l6ZSA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbjIocGNyX3N0LT5jb2RlY3BhciwgMCk7CisgICAgICAgICAgICBpZiAoIWZyYW1lX3NpemUpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJmcmFtZSBzaXplIG5vdCBzZXRcbiIpOwogICAgICAgICAgICAgICAgIHNlcnZpY2UtPnBjcl9wYWNrZXRfcGVyaW9kID0KLSAgICAgICAgICAgICAgICAgICAgcGNyX3N0LT5jb2RlYy0+c2FtcGxlX3JhdGUgLyAoMTAgKiA1MTIpOworICAgICAgICAgICAgICAgICAgICBwY3Jfc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAvICgxMCAqIDUxMik7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNlcnZpY2UtPnBjcl9wYWNrZXRfcGVyaW9kID0KLSAgICAgICAgICAgICAgICAgICAgcGNyX3N0LT5jb2RlYy0+c2FtcGxlX3JhdGUgLyAoMTAgKiBwY3Jfc3QtPmNvZGVjLT5mcmFtZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgcGNyX3N0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgLyAoMTAgKiBmcmFtZV9zaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIG1heCBkZWx0YSBQQ1IgMC4xcwpAQCAtOTYwLDcgKzEwMTIsNyBAQAogICAgICAgICAgICB0cy0+c2R0X3BhY2tldF9wZXJpb2QsIHRzLT5wYXRfcGFja2V0X3BlcmlvZCk7CiAKICAgICBpZiAodHMtPm0ydHNfbW9kZSA9PSAtMSkgewotICAgICAgICBpZiAoYXZfbWF0Y2hfZXh0KHMtPmZpbGVuYW1lLCAibTJ0cyIpKSB7CisgICAgICAgIGlmIChhdl9tYXRjaF9leHQocy0+dXJsLCAibTJ0cyIpKSB7CiAgICAgICAgICAgICB0cy0+bTJ0c19tb2RlID0gMTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRzLT5tMnRzX21vZGUgPSAwOwpAQCAtOTc0LDcgKzEwMjYsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLS8qIHNlbmQgU0RULCBQQVQgYW5kIFBNVCB0YWJsZXMgcmVndWxhcnkgKi8KKy8qIHNlbmQgU0RULCBQQVQgYW5kIFBNVCB0YWJsZXMgcmVndWxhcmx5ICovCiBzdGF0aWMgdm9pZCByZXRyYW5zbWl0X3NpX2luZm8oQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZm9yY2VfcGF0LCBpbnQ2NF90IGR0cykKIHsKICAgICBNcGVnVFNXcml0ZSAqdHMgPSBzLT5wcml2X2RhdGE7CkBAIC0xMDQ4LDYgKzExMDAsMTAgQEAKICAgICAvKiBDb250aW51aXR5IENvdW50IGZpZWxkIGRvZXMgbm90IGluY3JlbWVudCAoc2VlIDEzODE4LTEgc2VjdGlvbiAyLjQuMy4zKSAqLwogICAgICpxKysgPSBUU19QQUNLRVRfU0laRSAtIDU7IC8qIEFkYXB0YXRpb24gRmllbGQgTGVuZ3RoICovCiAgICAgKnErKyA9IDB4MTA7ICAgICAgICAgICAgICAgLyogQWRhcHRhdGlvbiBmbGFnczogUENSIHByZXNlbnQgKi8KKyAgICBpZiAodHNfc3QtPmRpc2NvbnRpbnVpdHkpIHsKKyAgICAgICAgcVstMV0gfD0gMHg4MDsKKyAgICAgICAgdHNfc3QtPmRpc2NvbnRpbnVpdHkgPSAwOworICAgIH0KIAogICAgIC8qIFBDUiBjb2RlZCBpbnRvIDYgYnl0ZXMgKi8KICAgICBxICs9IHdyaXRlX3Bjcl9iaXRzKHEsIGdldF9wY3IodHMsIHMtPnBiKSk7CkBAIC0xMTExLDcgKzExNjcsNyBAQAogICogTk9URTogJ3BheWxvYWQnIGNvbnRhaW5zIGEgY29tcGxldGUgUEVTIHBheWxvYWQuICovCiBzdGF0aWMgdm9pZCBtcGVndHNfd3JpdGVfcGVzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpwYXlsb2FkLCBpbnQgcGF5bG9hZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHB0cywgaW50NjRfdCBkdHMsIGludCBrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzLCBpbnQ2NF90IGR0cywgaW50IGtleSwgaW50IHN0cmVhbV9pZCkKIHsKICAgICBNcGVnVFNXcml0ZVN0cmVhbSAqdHNfc3QgPSBzdC0+cHJpdl9kYXRhOwogICAgIE1wZWdUU1dyaXRlICp0cyA9IHMtPnByaXZfZGF0YTsKQEAgLTExMjEsMTAgKzExNzcsMTAgQEAKICAgICBpbnQgYWZjX2xlbiwgc3R1ZmZpbmdfbGVuOwogICAgIGludDY0X3QgcGNyID0gLTE7IC8qIGF2b2lkIHdhcm5pbmcgKi8KICAgICBpbnQ2NF90IGRlbGF5ID0gYXZfcmVzY2FsZShzLT5tYXhfZGVsYXksIDkwMDAwLCBBVl9USU1FX0JBU0UpOwotICAgIGludCBmb3JjZV9wYXQgPSBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGtleSAmJiAhdHNfc3QtPnByZXZfcGF5bG9hZF9rZXk7CisgICAgaW50IGZvcmNlX3BhdCA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYga2V5ICYmICF0c19zdC0+cHJldl9wYXlsb2FkX2tleTsKIAotICAgIGF2X2Fzc2VydDAodHNfc3QtPnBheWxvYWQgIT0gYnVmIHx8IHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pOwotICAgIGlmICh0cy0+ZmxhZ3MgJiBNUEVHVFNfRkxBR19QQVRfUE1UX0FUX0ZSQU1FUyAmJiBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgYXZfYXNzZXJ0MCh0c19zdC0+cGF5bG9hZCAhPSBidWYgfHwgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9WSURFTyk7CisgICAgaWYgKHRzLT5mbGFncyAmIE1QRUdUU19GTEFHX1BBVF9QTVRfQVRfRlJBTUVTICYmIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgZm9yY2VfcGF0ID0gMTsKICAgICB9CiAKQEAgLTExNjUsNiArMTIyMSwxMSBAQAogICAgICAgICAqcSsrICAgICAgPSB0c19zdC0+cGlkOwogICAgICAgICB0c19zdC0+Y2MgPSB0c19zdC0+Y2MgKyAxICYgMHhmOwogICAgICAgICAqcSsrICAgICAgPSAweDEwIHwgdHNfc3QtPmNjOyAvLyBwYXlsb2FkIGluZGljYXRvciArIENDCisgICAgICAgIGlmICh0c19zdC0+ZGlzY29udGludWl0eSkgeworICAgICAgICAgICAgc2V0X2FmX2ZsYWcoYnVmLCAweDgwKTsKKyAgICAgICAgICAgIHEgPSBnZXRfdHNfcGF5bG9hZF9zdGFydChidWYpOworICAgICAgICAgICAgdHNfc3QtPmRpc2NvbnRpbnVpdHkgPSAwOworICAgICAgICB9CiAgICAgICAgIGlmIChrZXkgJiYgaXNfc3RhcnQgJiYgcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CiAgICAgICAgICAgICAvLyBzZXQgUmFuZG9tIEFjY2VzcyBmb3Iga2V5IGZyYW1lcwogICAgICAgICAgICAgaWYgKHRzX3N0LT5waWQgPT0gdHNfc3QtPnNlcnZpY2UtPnBjcl9waWQpCkBAIC0xMTk0LDI2ICsxMjU1LDM0IEBACiAgICAgICAgICAgICAqcSsrID0gMHgwMTsKICAgICAgICAgICAgIGlzX2R2Yl9zdWJ0aXRsZSA9IDA7CiAgICAgICAgICAgICBpc19kdmJfdGVsZXRleHQgPSAwOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ESVJBQykKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRElSQUMpCiAgICAgICAgICAgICAgICAgICAgICpxKysgPSAweGZkOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgKnErKyA9IDB4ZTA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAyIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpKSB7CiAgICAgICAgICAgICAgICAgKnErKyA9IDB4YzA7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzICYmCisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzICYmCiAgICAgICAgICAgICAgICAgICAgICAgICB0cy0+bTJ0c19tb2RlKSB7CiAgICAgICAgICAgICAgICAgKnErKyA9IDB4ZmQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSAmJgorICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1RJTUVEX0lEMykgeworICAgICAgICAgICAgICAgICpxKysgPSAweGJkOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEpIHsKKyAgICAgICAgICAgICAgICAqcSsrID0gc3RyZWFtX2lkICE9IC0xID8gc3RyZWFtX2lkIDogMHhmYzsKKworICAgICAgICAgICAgICAgIGlmIChzdHJlYW1faWQgPT0gMHhiZCkgLyogYXN5bmNocm9ub3VzIEtMViAqLworICAgICAgICAgICAgICAgICAgICBwdHMgPSBkdHMgPSBBVl9OT1BUU19WQUxVRTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgKnErKyA9IDB4YmQ7Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpc19kdmJfc3VidGl0bGUgPSAxOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUKSB7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVkJfVEVMRVRFWFQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2R2Yl90ZWxldGV4dCA9IDE7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xMjI4LDggKzEyOTcsOCBAQAogICAgICAgICAgICAgICAgIGhlYWRlcl9sZW4gKz0gNTsKICAgICAgICAgICAgICAgICBmbGFncyAgICAgIHw9IDB4NDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRElSQUMpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ESVJBQykgewogICAgICAgICAgICAgICAgIC8qIHNldCBQRVNfZXh0ZW5zaW9uX2ZsYWcgKi8KICAgICAgICAgICAgICAgICBwZXNfZXh0ZW5zaW9uID0gMTsKICAgICAgICAgICAgICAgICBmbGFncyAgICAgICAgfD0gMHgwMTsKQEAgLTEyNDMsOCArMTMxMiw4IEBACiAgICAgICAgICAgICAgKiBvdGhlcndpc2UgaXQgd2lsbCBub3QgcGxheSBzb3VuZCBvbiBibHUtcmF5CiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmICh0cy0+bTJ0c19tb2RlICYmCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzZXQgUEVTX2V4dGVuc2lvbl9mbGFnICovCiAgICAgICAgICAgICAgICAgICAgICAgICBwZXNfZXh0ZW5zaW9uID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IDB4MDE7CkBAIC0xMjYyLDE0ICsxMzMxLDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobGVuID4gMHhmZmZmKQogICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICBpZiAodHMtPm9taXRfdmlkZW9fcGVzX2xlbmd0aCAmJiBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBpZiAodHMtPm9taXRfdmlkZW9fcGVzX2xlbmd0aCAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICAgICAgbGVuID0gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpxKysgPSBsZW4gPj4gODsKICAgICAgICAgICAgICpxKysgPSBsZW47CiAgICAgICAgICAgICB2YWwgID0gMHg4MDsKICAgICAgICAgICAgIC8qIGRhdGEgYWxpZ25tZW50IGluZGljYXRvciBpcyByZXF1aXJlZCBmb3Igc3VidGl0bGUgYW5kIGRhdGEgc3RyZWFtcyAqLwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUgfHwgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKQorICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUgfHwgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKQogICAgICAgICAgICAgICAgIHZhbCB8PSAweDA0OwogICAgICAgICAgICAgKnErKyA9IHZhbDsKICAgICAgICAgICAgICpxKysgPSBmbGFnczsKQEAgLTEyODIsNyArMTM1MSw3IEBACiAgICAgICAgICAgICAgICAgd3JpdGVfcHRzKHEsIDEsIGR0cyk7CiAgICAgICAgICAgICAgICAgcSArPSA1OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBlc19leHRlbnNpb24gJiYgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ESVJBQykgeworICAgICAgICAgICAgaWYgKHBlc19leHRlbnNpb24gJiYgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ESVJBQykgewogICAgICAgICAgICAgICAgIGZsYWdzID0gMHgwMTsgIC8qIHNldCBQRVNfZXh0ZW5zaW9uX2ZsYWdfMiAqLwogICAgICAgICAgICAgICAgICpxKysgID0gZmxhZ3M7CiAgICAgICAgICAgICAgICAgKnErKyAgPSAweDgwIHwgMHgwMTsgLyogbWFya2VyIGJpdCArIGV4dGVuc2lvbiBsZW5ndGggKi8KQEAgLTEyOTMsNyArMTM2Miw3IEBACiAgICAgICAgICAgICAvKiBGb3IgQmx1LXJheSBBQzMgQXVkaW8gU2V0dGluZyBleHRlbmRlZCBmbGFncyAqLwogICAgICAgICAgIGlmICh0cy0+bTJ0c19tb2RlICYmCiAgICAgICAgICAgICAgIHBlc19leHRlbnNpb24gJiYKLSAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKKyAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IDB4MDE7IC8qIHNldCBQRVNfZXh0ZW5zaW9uX2ZsYWdfMiAqLwogICAgICAgICAgICAgICAgICAgICAgICpxKysgPSBmbGFnczsKICAgICAgICAgICAgICAgICAgICAgICAqcSsrID0gMHg4MCB8IDB4MDE7IC8qIG1hcmtlciBiaXQgKyBleHRlbnNpb24gbGVuZ3RoICovCkBAIC0xMzY4LDcgKzE0MzcsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiSC4yNjQgYml0c3RyZWFtIGVycm9yLCBzdGFydGNvZGUgbWlzc2luZywgc2l6ZSAlZCIsIHBrdC0+c2l6ZSk7Ci0gICAgICAgIGlmIChwa3QtPnNpemUpIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIiBkYXRhICUwOFgiLCBBVl9SQjMyKHBrdC0+ZGF0YSkpOworICAgICAgICBpZiAocGt0LT5zaXplKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiIGRhdGEgJTA4IlBSSVgzMiwgQVZfUkIzMihwa3QtPmRhdGEpKTsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiXG4iKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0xMzgyLDcgKzE0NTIsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkhFVkMgYml0c3RyZWFtIGVycm9yLCBzdGFydGNvZGUgbWlzc2luZywgc2l6ZSAlZCIsIHBrdC0+c2l6ZSk7Ci0gICAgICAgIGlmIChwa3QtPnNpemUpIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIiBkYXRhICUwOFgiLCBBVl9SQjMyKHBrdC0+ZGF0YSkpOworICAgICAgICBpZiAocGt0LT5zaXplKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiIGRhdGEgJTA4IlBSSVgzMiwgQVZfUkIzMihwa3QtPmRhdGEpKTsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiXG4iKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CkBAIC0xNDUxLDYgKzE1MjIsMTUgQEAKICAgICBjb25zdCBpbnQ2NF90IGRlbGF5ID0gYXZfcmVzY2FsZShzLT5tYXhfZGVsYXksIDkwMDAwLCBBVl9USU1FX0JBU0UpICogMjsKICAgICBpbnQ2NF90IGR0cyA9IHBrdC0+ZHRzLCBwdHMgPSBwa3QtPnB0czsKICAgICBpbnQgb3B1c19zYW1wbGVzID0gMDsKKyAgICBpbnQgc2lkZV9kYXRhX3NpemU7CisgICAgY2hhciAqc2lkZV9kYXRhID0gTlVMTDsKKyAgICBpbnQgc3RyZWFtX2lkID0gLTE7CisKKyAgICBzaWRlX2RhdGEgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUEtUX0RBVEFfTVBFR1RTX1NUUkVBTV9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2lkZV9kYXRhX3NpemUpOworICAgIGlmIChzaWRlX2RhdGEpCisgICAgICAgIHN0cmVhbV9pZCA9IHNpZGVfZGF0YVswXTsKIAogICAgIGlmICh0cy0+cmVlbWl0X3BhdF9wbXQpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLApAQCAtMTQ3OCwyMCArMTU1OCwyMCBAQAogICAgIH0KICAgICB0c19zdC0+Zmlyc3RfcHRzX2NoZWNrID0gMDsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnAgPSBidWYsICpidWZfZW5kID0gcCArIHNpemU7CiAgICAgICAgIHVpbnQzMl90IHN0YXRlID0gLTE7Ci0gICAgICAgIGludCBleHRyYWRkID0gKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpID8gc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA6IDA7CisgICAgICAgIGludCBleHRyYWRkID0gKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpID8gc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA6IDA7CiAgICAgICAgIGludCByZXQgPSBmZl9jaGVja19oMjY0X3N0YXJ0Y29kZShzLCBzdCwgcGt0KTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgIGlmIChleHRyYWRkICYmIEFWX1JCMjQoc3QtPmNvZGVjLT5leHRyYWRhdGEpID4gMSkKKyAgICAgICAgaWYgKGV4dHJhZGQgJiYgQVZfUkIyNChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgPiAxKQogICAgICAgICAgICAgZXh0cmFkZCA9IDA7CiAKICAgICAgICAgZG8gewogICAgICAgICAgICAgcCA9IGF2cHJpdl9maW5kX3N0YXJ0X2NvZGUocCwgYnVmX2VuZCwgJnN0YXRlKTsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJuYWwgJWRcbiIsIHN0YXRlICYgMHgxZik7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAibmFsICUiUFJJZDMyIlxuIiwgc3RhdGUgJiAweDFmKTsKICAgICAgICAgICAgIGlmICgoc3RhdGUgJiAweDFmKSA9PSA3KQogICAgICAgICAgICAgICAgIGV4dHJhZGQgPSAwOwogICAgICAgICB9IHdoaWxlIChwIDwgYnVmX2VuZCAmJiAoc3RhdGUgJiAweDFmKSAhPSA5ICYmCkBAIC0xNTAzLDcgKzE1ODMsNyBAQAogICAgICAgICAgICAgZGF0YSA9IGF2X21hbGxvYyhwa3QtPnNpemUgKyA2ICsgZXh0cmFkZCk7CiAgICAgICAgICAgICBpZiAoIWRhdGEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIG1lbWNweShkYXRhICsgNiwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIGV4dHJhZGQpOworICAgICAgICAgICAgbWVtY3B5KGRhdGEgKyA2LCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgZXh0cmFkZCk7CiAgICAgICAgICAgICBtZW1jcHkoZGF0YSArIDYgKyBleHRyYWRkLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CiAgICAgICAgICAgICBBVl9XQjMyKGRhdGEsIDB4MDAwMDAwMDEpOwogICAgICAgICAgICAgZGF0YVs0XSA9IDB4MDk7CkBAIC0xNTExLDcgKzE1OTEsNyBAQAogICAgICAgICAgICAgYnVmICAgICA9IGRhdGE7CiAgICAgICAgICAgICBzaXplICAgID0gcGt0LT5zaXplICsgNiArIGV4dHJhZGQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgewogICAgICAgICBpZiAocGt0LT5zaXplIDwgMikgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFBQyBwYWNrZXQgdG9vIHNob3J0XG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtMTU0NCwxMSArMTYyNCw0MSBAQAogICAgICAgICAgICAgYnVmICAgICAgICAgICAgID0gZGF0YTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IRVZDKSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hFVkMpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcCA9IGJ1ZiwgKmJ1Zl9lbmQgPSBwICsgc2l6ZTsKKyAgICAgICAgdWludDMyX3Qgc3RhdGUgPSAtMTsKKyAgICAgICAgaW50IGV4dHJhZGQgPSAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgPyBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplIDogMDsKICAgICAgICAgaW50IHJldCA9IGNoZWNrX2hldmNfc3RhcnRjb2RlKHMsIHN0LCBwa3QpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKKworICAgICAgICBpZiAoZXh0cmFkZCAmJiBBVl9SQjI0KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKSA+IDEpCisgICAgICAgICAgICBleHRyYWRkID0gMDsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBwID0gYXZwcml2X2ZpbmRfc3RhcnRfY29kZShwLCBidWZfZW5kLCAmc3RhdGUpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgIm5hbCAlIlBSSWQzMiJcbiIsIChzdGF0ZSAmIDB4N2UpPj4xKTsKKyAgICAgICAgICAgIGlmICgoc3RhdGUgJiAweDdlKSA9PSAyKjMyKQorICAgICAgICAgICAgICAgIGV4dHJhZGQgPSAwOworICAgICAgICB9IHdoaWxlIChwIDwgYnVmX2VuZCAmJiAoc3RhdGUgJiAweDdlKSAhPSAyKjM1ICYmCisgICAgICAgICAgICAgICAgIChzdGF0ZSAmIDB4N2UpID49IDIqMzIpOworCisgICAgICAgIGlmICgoc3RhdGUgJiAweDdlKSA8IDIqMTYgJiYgKHN0YXRlICYgMHg3ZSkgPj0gMioyNCkKKyAgICAgICAgICAgIGV4dHJhZGQgPSAwOworICAgICAgICBpZiAoKHN0YXRlICYgMHg3ZSkgIT0gMiozNSkgeyAvLyBBVUQgTkFMCisgICAgICAgICAgICBkYXRhID0gYXZfbWFsbG9jKHBrdC0+c2l6ZSArIDcgKyBleHRyYWRkKTsKKyAgICAgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgbWVtY3B5KGRhdGEgKyA3LCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgZXh0cmFkZCk7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSArIDcgKyBleHRyYWRkLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgICAgICAgICBBVl9XQjMyKGRhdGEsIDB4MDAwMDAwMDEpOworICAgICAgICAgICAgZGF0YVs0XSA9IDIqMzU7CisgICAgICAgICAgICBkYXRhWzVdID0gMTsKKyAgICAgICAgICAgIGRhdGFbNl0gPSAweDUwOyAvLyBhbnkgc2xpY2UgdHlwZSAoMHg0KSArIHJic3Agc3RvcCBvbmUgYml0CisgICAgICAgICAgICBidWYgICAgID0gZGF0YTsKKyAgICAgICAgICAgIHNpemUgICAgPSBwa3QtPnNpemUgKyA3ICsgZXh0cmFkZDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTKSB7CiAgICAgICAgIGlmIChwa3QtPnNpemUgPCAyKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT3B1cyBwYWNrZXQgdG9vIHNob3J0XG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtMTU2OSw3ICsxNjc5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWRlX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChzaWRlX2RhdGEgJiYgc2lkZV9kYXRhX3NpemUgPj0gMTApIHsKLSAgICAgICAgICAgICAgICB0cmltX2VuZCA9IEFWX1JMMzIoc2lkZV9kYXRhICsgNCkgKiA0ODAwMCAvIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgdHJpbV9lbmQgPSBBVl9STDMyKHNpZGVfZGF0YSArIDQpICogNDgwMDAgLyBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjdHJsX2hlYWRlcl9zaXplID0gcGt0LT5zaXplICsgMiArIHBrdC0+c2l6ZSAvIDI1NSArIDE7CkBAIC0xNjI5LDggKzE3MzksOCBAQAogICAgICAgICAgICAgaWYgKCAgIHRzX3N0Mi0+cGF5bG9hZF9zaXplCiAgICAgICAgICAgICAgICAmJiAodHNfc3QyLT5wYXlsb2FkX2R0cyA9PSBBVl9OT1BUU19WQUxVRSB8fCBkdHMgLSB0c19zdDItPnBheWxvYWRfZHRzID4gZGVsYXkvMikpIHsKICAgICAgICAgICAgICAgICBtcGVndHNfd3JpdGVfcGVzKHMsIHN0MiwgdHNfc3QyLT5wYXlsb2FkLCB0c19zdDItPnBheWxvYWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNfc3QyLT5wYXlsb2FkX3B0cywgdHNfc3QyLT5wYXlsb2FkX2R0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNfc3QyLT5wYXlsb2FkX2ZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzX3N0Mi0+cGF5bG9hZF9wdHMsIHRzX3N0Mi0+cGF5bG9hZF9kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c19zdDItPnBheWxvYWRfZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVksIHN0cmVhbV9pZCk7CiAgICAgICAgICAgICAgICAgdHNfc3QyLT5wYXlsb2FkX3NpemUgPSAwOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNjQzLDE2ICsxNzUzLDE2IEBACiAgICAgICAgIHRzX3N0LT5vcHVzX3F1ZXVlZF9zYW1wbGVzICsgb3B1c19zYW1wbGVzID49IDU3NjAgLyogMTIwbXMgKi8pKSB7CiAgICAgICAgIG1wZWd0c193cml0ZV9wZXMocywgc3QsIHRzX3N0LT5wYXlsb2FkLCB0c19zdC0+cGF5bG9hZF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgIHRzX3N0LT5wYXlsb2FkX3B0cywgdHNfc3QtPnBheWxvYWRfZHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRzX3N0LT5wYXlsb2FkX2ZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICB0c19zdC0+cGF5bG9hZF9mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSwgc3RyZWFtX2lkKTsKICAgICAgICAgdHNfc3QtPnBheWxvYWRfc2l6ZSA9IDA7CiAgICAgICAgIHRzX3N0LT5vcHVzX3F1ZXVlZF9zYW1wbGVzID0gMDsKICAgICB9CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fCBzaXplID4gdHMtPnBlc19wYXlsb2FkX3NpemUpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fCBzaXplID4gdHMtPnBlc19wYXlsb2FkX3NpemUpIHsKICAgICAgICAgYXZfYXNzZXJ0MCghdHNfc3QtPnBheWxvYWRfc2l6ZSk7CiAgICAgICAgIC8vIGZvciB2aWRlbyBhbmQgc3VidGl0bGUsIHdyaXRlIGEgc2luZ2xlIHBlcyBwYWNrZXQKICAgICAgICAgbXBlZ3RzX3dyaXRlX3BlcyhzLCBzdCwgYnVmLCBzaXplLCBwdHMsIGR0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZLCBzdHJlYW1faWQpOwogICAgICAgICB0c19zdC0+b3B1c19xdWV1ZWRfc2FtcGxlcyA9IDA7CiAgICAgICAgIGF2X2ZyZWUoZGF0YSk7CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTY4NCw3ICsxNzk0LDcgQEAKICAgICAgICAgaWYgKHRzX3N0LT5wYXlsb2FkX3NpemUgPiAwKSB7CiAgICAgICAgICAgICBtcGVndHNfd3JpdGVfcGVzKHMsIHN0LCB0c19zdC0+cGF5bG9hZCwgdHNfc3QtPnBheWxvYWRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNfc3QtPnBheWxvYWRfcHRzLCB0c19zdC0+cGF5bG9hZF9kdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzX3N0LT5wYXlsb2FkX2ZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNfc3QtPnBheWxvYWRfZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVksIC0xKTsKICAgICAgICAgICAgIHRzX3N0LT5wYXlsb2FkX3NpemUgPSAwOwogICAgICAgICAgICAgdHNfc3QtPm9wdXNfcXVldWVkX3NhbXBsZXMgPSAwOwogICAgICAgICB9CkBAIC0xNzQxLDEzICsxODUxLDE3IEBACiAgICAgaW50IHJldCA9IDE7CiAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgewogICAgICAgICBpZiAocGt0LT5zaXplID49IDUgJiYgQVZfUkIzMihwa3QtPmRhdGEpICE9IDB4MDAwMDAwMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUkIyNChwa3QtPmRhdGEpICE9IDB4MDAwMDAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZfUkIyNChwa3QtPmRhdGEpICE9IDB4MDAwMDAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVswXSA9PSAxKSkpCiAgICAgICAgICAgICByZXQgPSBmZl9zdHJlYW1fYWRkX2JpdHN0cmVhbV9maWx0ZXIoc3QsICJoMjY0X21wNHRvYW5uZXhiIiwgTlVMTCk7Ci0gICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0hFVkMpIHsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSEVWQykgewogICAgICAgICBpZiAocGt0LT5zaXplID49IDUgJiYgQVZfUkIzMihwa3QtPmRhdGEpICE9IDB4MDAwMDAwMSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUkIyNChwa3QtPmRhdGEpICE9IDB4MDAwMDAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQVZfUkIyNChwa3QtPmRhdGEpICE9IDB4MDAwMDAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVswXSA9PSAxKSkpCiAgICAgICAgICAgICByZXQgPSBmZl9zdHJlYW1fYWRkX2JpdHN0cmVhbV9maWx0ZXIoc3QsICJoZXZjX21wNHRvYW5uZXhiIiwgTlVMTCk7CiAgICAgfQogCkBAIC0xNzYwLDcgKzE4NzQsNyBAQAogICAgICAgeyAuaTY0ID0gMHgwMDAxIH0sIDB4MDAwMSwgMHhmZmZmLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAogICAgIHsgIm1wZWd0c19vcmlnaW5hbF9uZXR3b3JrX2lkIiwgIlNldCBvcmlnaW5hbF9uZXR3b3JrX2lkIGZpZWxkLiIsCiAgICAgICBvZmZzZXRvZihNcGVnVFNXcml0ZSwgb3JpZ2luYWxfbmV0d29ya19pZCksIEFWX09QVF9UWVBFX0lOVCwKLSAgICAgIHsgLmk2NCA9IDB4MDAwMSB9LCAweDAwMDEsIDB4ZmZmZiwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICAgIHsgLmk2NCA9IERWQl9QUklWQVRFX05FVFdPUktfU1RBUlQgfSwgMHgwMDAxLCAweGZmZmYsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCiAgICAgeyAibXBlZ3RzX3NlcnZpY2VfaWQiLCAiU2V0IHNlcnZpY2VfaWQgZmllbGQuIiwKICAgICAgIG9mZnNldG9mKE1wZWdUU1dyaXRlLCBzZXJ2aWNlX2lkKSwgQVZfT1BUX1RZUEVfSU5ULAogICAgICAgeyAuaTY0ID0gMHgwMDAxIH0sIDB4MDAwMSwgMHhmZmZmLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LApAQCAtMTc4OCwxMiArMTkwMiwxNSBAQAogICAgIHsgImFkdmFuY2VkX2NvZGVjX2RpZ2l0YWxfaGR0diIsICJBZHZhbmNlZCBDb2RlYyBEaWdpdGFsIEhEVFYuIiwKICAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBNUEVHVFNfU0VSVklDRV9UWVBFX0FEVkFOQ0VEX0NPREVDX0RJR0lUQUxfSERUViB9LCAweDAxLCAweGZmLAogICAgICAgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtcGVndHNfc2VydmljZV90eXBlIiB9LAorICAgIHsgImhldmNfZGlnaXRhbF9oZHR2IiwgIkhFVkMgRGlnaXRhbCBUZWxldmlzaW9uIFNlcnZpY2UuIiwKKyAgICAgIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBNUEVHVFNfU0VSVklDRV9UWVBFX0hFVkNfRElHSVRBTF9IRFRWIH0sIDB4MDEsIDB4ZmYsCisgICAgICBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1wZWd0c19zZXJ2aWNlX3R5cGUiIH0sCiAgICAgeyAibXBlZ3RzX3BtdF9zdGFydF9waWQiLCAiU2V0IHRoZSBmaXJzdCBwaWQgb2YgdGhlIFBNVC4iLAogICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIHBtdF9zdGFydF9waWQpLCBBVl9PUFRfVFlQRV9JTlQsCiAgICAgICB7IC5pNjQgPSAweDEwMDAgfSwgMHgwMDEwLCAweDFmMDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCiAgICAgeyAibXBlZ3RzX3N0YXJ0X3BpZCIsICJTZXQgdGhlIGZpcnN0IHBpZC4iLAogICAgICAgb2Zmc2V0b2YoTXBlZ1RTV3JpdGUsIHN0YXJ0X3BpZCksIEFWX09QVF9UWVBFX0lOVCwKLSAgICAgIHsgLmk2NCA9IDB4MDEwMCB9LCAweDAwMjAsIDB4MGYwMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKKyAgICAgIHsgLmk2NCA9IDB4MDEwMCB9LCAweDAwMTAsIDB4MGYwMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKICAgICB7ICJtcGVndHNfbTJ0c19tb2RlIiwgIkVuYWJsZSBtMnRzIG1vZGUuIiwKICAgICAgIG9mZnNldG9mKE1wZWdUU1dyaXRlLCBtMnRzX21vZGUpLCBBVl9PUFRfVFlQRV9CT09MLAogICAgICAgeyAuaTY0ID0gLTEgfSwgLTEsIDEsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNIH0sCkBAIC0xODE4LDYgKzE5MzUsOSBAQAogICAgIHsgInN5c3RlbV9iIiwgIkNvbmZvcm0gdG8gU3lzdGVtIEIgKERWQikgaW5zdGVhZCBvZiBTeXN0ZW0gQSAoQVRTQykiLAogICAgICAgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IE1QRUdUU19GTEFHX1NZU1RFTV9CIH0sIDAsIElOVF9NQVgsCiAgICAgICBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgIm1wZWd0c19mbGFncyIgfSwKKyAgICB7ICJpbml0aWFsX2Rpc2NvbnRpbnVpdHkiLCAiTWFyayBpbml0aWFsIHBhY2tldHMgYXMgZGlzY29udGludW91cyIsCisgICAgICAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gTVBFR1RTX0ZMQUdfRElTQ09OVCB9LCAwLCBJTlRfTUFYLAorICAgICAgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICJtcGVndHNfZmxhZ3MiIH0sCiAgICAgLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgIHsgInJlc2VuZF9oZWFkZXJzIiwgIlJlZW1pdCBQQVQvUE1UIGJlZm9yZSB3cml0aW5nIHRoZSBuZXh0IHBhY2tldCIsCiAgICAgICBvZmZzZXRvZihNcGVnVFNXcml0ZSwgcmVlbWl0X3BhdF9wbXQpLCBBVl9PUFRfVFlQRV9JTlQsCkBAIC0xODMxLDcgKzE5NTEsNyBAQAogICAgIHsgIm9taXRfdmlkZW9fcGVzX2xlbmd0aCIsICJPbWl0IHRoZSBQRVMgcGFja2V0IGxlbmd0aCBmb3IgdmlkZW8gcGFja2V0cyIsCiAgICAgICBvZmZzZXRvZihNcGVnVFNXcml0ZSwgb21pdF92aWRlb19wZXNfbGVuZ3RoKSwgQVZfT1BUX1RZUEVfQk9PTCwKICAgICAgIHsgLmk2NCA9IDEgfSwgMCwgMSwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKLSAgICB7ICJwY3JfcGVyaW9kIiwgIlBDUiByZXRyYW5zbWlzc2lvbiB0aW1lIiwKKyAgICB7ICJwY3JfcGVyaW9kIiwgIlBDUiByZXRyYW5zbWlzc2lvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyIsCiAgICAgICBvZmZzZXRvZihNcGVnVFNXcml0ZSwgcGNyX3BlcmlvZCksIEFWX09QVF9UWVBFX0lOVCwKICAgICAgIHsgLmk2NCA9IFBDUl9SRVRSQU5TX1RJTUUgfSwgMCwgSU5UX01BWCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKICAgICB7ICJwYXRfcGVyaW9kIiwgIlBBVC9QTVQgcmV0cmFuc21pc3Npb24gdGltZSBsaW1pdCBpbiBzZWNvbmRzIiwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21wanBlZy5jIGIvbGliYXZmb3JtYXQvbXBqcGVnLmMKaW5kZXggMzkwNGNjYi4uODBmODNjNSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbXBqcGVnLmMKKysrIGIvbGliYXZmb3JtYXQvbXBqcGVnLmMKQEAgLTIzLDcgKzIzLDcgQEAKIAogLyogTXVsdGlwYXJ0IEpQRUcgKi8KIAotI2RlZmluZSBCT1VOREFSWV9UQUcgImZmc2VydmVyIgorI2RlZmluZSBCT1VOREFSWV9UQUcgImZmbXBlZyIKIAogdHlwZWRlZiBzdHJ1Y3QgTVBKUEVHQ29udGV4dCB7CiAgICAgQVZDbGFzcyAqY2xhc3M7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tcGpwZWdkZWMuYyBiL2xpYmF2Zm9ybWF0L21wanBlZ2RlYy5jCmluZGV4IDdhNmJiZTQuLjgzYWE3MGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L21wanBlZ2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L21wanBlZ2RlYy5jCkBAIC0xMjQsOSArMTI0LDkgQEAKICAgICBpZiAoIXBiKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIHJldCA9IChwYXJzZV9tdWx0aXBhcnRfaGVhZGVyKHBiLCAmc2l6ZSwgIi0tIiwgTlVMTCkgPiAwKSA/IEFWUFJPQkVfU0NPUkVfTUFYIDogMDsKKyAgICByZXQgPSAocGFyc2VfbXVsdGlwYXJ0X2hlYWRlcihwYiwgJnNpemUsICItLSIsIE5VTEwpID49IDApID8gQVZQUk9CRV9TQ09SRV9NQVggOiAwOwogCi0gICAgYXZfZnJlZShwYik7CisgICAgYXZpb19jb250ZXh0X2ZyZWUoJnBiKTsKIAogICAgIHJldHVybiByZXQ7CiB9CkBAIC0xNTEsOCArMTUxLDggQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01KUEVHOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NSlBFRzsKIAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDYwLCAxLCAyNSk7CiAKQEAgLTIwMSw3ICsyMDEsNyBAQAogICAgICAgICBpZiAobG9nX2N0eCkKICAgICAgICAgYXZfbG9nKGxvZ19jdHgsCiAgICAgICAgICAgICBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAiRXhwZWN0ZWQgYm91bmRhcnkgJyVzJyBub3QgZm91bmQsIGluc3RlYWQgZm91bmQgYSBsaW5lIG9mICV6dSBieXRlc1xuIiwKKyAgICAgICAgICAgICJFeHBlY3RlZCBib3VuZGFyeSAnJXMnIG5vdCBmb3VuZCwgaW5zdGVhZCBmb3VuZCBhIGxpbmUgb2YgJSJTSVpFX1NQRUNJRklFUiIgYnl0ZXNcbiIsCiAgICAgICAgICAgICBleHBlY3RlZF9ib3VuZGFyeSwKICAgICAgICAgICAgIHN0cmxlbihsaW5lKSk7CiAKQEAgLTM5OCw3ICszOTgsOCBAQAogICAgIC5yZWFkX2hlYWRlciAgICAgICA9IG1wanBlZ19yZWFkX2hlYWRlciwKICAgICAucmVhZF9wYWNrZXQgICAgICAgPSBtcGpwZWdfcmVhZF9wYWNrZXQsCiAgICAgLnJlYWRfY2xvc2UgICAgICAgID0gbXBqcGVnX3JlYWRfY2xvc2UsCi0gICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1wanBlZ19kZW11eGVyX2NsYXNzCisgICAgLnByaXZfY2xhc3MgICAgICAgID0gJm1wanBlZ19kZW11eGVyX2NsYXNzLAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKIH07CiAKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXBsMmRlYy5jIGIvbGliYXZmb3JtYXQvbXBsMmRlYy5jCmluZGV4IDgxY2MwYmIuLmRmY2RmNWEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L21wbDJkZWMuYworKysgYi9saWJhdmZvcm1hdC9tcGwyZGVjLmMKQEAgLTIzLDYgKzIzLDggQEAKICAqIE1QTDIgc3VidGl0bGVzIGZvcm1hdCBkZW11eGVyCiAgKi8KIAorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdWJ0aXRsZXMuaCIKQEAgLTM5LDYgKzQxLDkgQEAKICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwdHIgPSBwLT5idWY7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyX2VuZCA9IHB0ciArIHAtPmJ1Zl9zaXplOwogCisgICAgaWYgKEFWX1JCMjQocHRyKSA9PSAweGVmYmJiZikKKyAgICAgICAgcHRyICs9IDM7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgIGlmIChzc2NhbmYocHRyLCAiWyUiU0NOZDY0Il1bJSJTQ05kNjQiXSVjIiwgJnN0YXJ0LCAmZW5kLCAmYykgIT0gMyAmJgogICAgICAgICAgICAgc3NjYW5mKHB0ciwgIlslIlNDTmQ2NCJdW10lYyIsICAgICAgICAgICZzdGFydCwgICAgICAgJmMpICE9IDIpCkBAIC04MCw4ICs4NSwxMSBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTVBMMjsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTVBMMjsKKworICAgIGlmIChhdmlvX3JiMjQocy0+cGIpICE9IDB4ZWZiYmJmKQorICAgICAgICBhdmlvX3NlZWsocy0+cGIsIC0zLCBTRUVLX0NVUik7CiAKICAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikpIHsKICAgICAgICAgY2hhciBsaW5lWzQwOTZdOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXBzdWJkZWMuYyBiL2xpYmF2Zm9ybWF0L21wc3ViZGVjLmMKaW5kZXggYzVhNTBlYy4uMTIzNmVmYSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbXBzdWJkZWMuYworKysgYi9saWJhdmZvcm1hdC9tcHN1YmRlYy5jCkBAIC0xMDAsOCArMTAwLDggQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBwdHNfaW5mby5kZW4sIHB0c19pbmZvLm51bSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RFWFQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RFWFQ7CiAKICAgICBmZl9zdWJ0aXRsZXNfcXVldWVfZmluYWxpemUocywgJm1wc3ViLT5xKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXNmLmMgYi9saWJhdmZvcm1hdC9tc2YuYwppbmRleCA3M2E1YTAxLi42YmQxOGYyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tc2YuYworKysgYi9saWJhdmZvcm1hdC9tc2YuYwpAQCAtMzQsMTMgKzM0LDE3IEBACiAgICAgaWYgKEFWX1JCMzIocC0+YnVmKzE2KSA8PSAwKQogICAgICAgICByZXR1cm4gMDsKIAorICAgIGlmIChBVl9SQjMyKHAtPmJ1Zis0KSA+IDE2KQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVggLyA1OyAvL3Vuc3VwcG9ydGVkIC8gdW5rbm93biBjb2RlYworCiAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gMyAqIDI7CiB9CiAKIHN0YXRpYyBpbnQgbXNmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKLSAgICB1bnNpZ25lZCBjb2RlYywgYWxpZ24sIHNpemU7CisgICAgdW5zaWduZWQgY29kZWMsIHNpemU7CiAgICAgQVZTdHJlYW0gKnN0OworICAgIGludCByZXQ7CiAKICAgICBhdmlvX3NraXAocy0+cGIsIDQpOwogCkBAIC00OCw0MSArNTIsNTIgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgIGNvZGVjICAgICAgICAgICAgICAgICAgPSBhdmlvX3JiMzIocy0+cGIpOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3JiMzIocy0+cGIpOwotICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzIDw9IDAgfHwgc3QtPmNvZGVjLT5jaGFubmVscyA+PSBJTlRfTUFYIC8gMTAyNCkKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA8PSAwIHx8IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPj0gSU5UX01BWCAvIDEwMjQpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIHNpemUgPSBhdmlvX3JiMzIocy0+cGIpOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocy0+cGIpOwotICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIDw9IDApCisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgYWxpZ24gPSBhdmlvX3JiMzIocy0+cGIpIDsKLSAgICBpZiAoYWxpZ24gPiBJTlRfTUFYIC8gc3QtPmNvZGVjLT5jaGFubmVscykKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IGFsaWduOworICAgIC8vIGF2aW9fcmIzMihzLT5wYik7IC8qIGJ5dGUgZmxhZ3Mgd2l0aCBlbmNvZGVyIGluZm8gKi8KICAgICBzd2l0Y2ggKGNvZGVjKSB7Ci0gICAgY2FzZSAwOiBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOyBicmVhazsKLSAgICBjYXNlIDM6IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSAxNiAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fUFNYOyBicmVhazsKKyAgICBjYXNlIDA6IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7IGJyZWFrOworICAgIGNhc2UgMTogc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsgYnJlYWs7CisgICAgY2FzZSAzOiBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMTYgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX1BTWDsgYnJlYWs7CisgICAgY2FzZSA0OgorICAgIGNhc2UgNToKKyAgICBjYXNlIDY6IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAoY29kZWMgPT0gNCA/IDk2IDogY29kZWMgPT0gNSA/IDE1MiA6IDE5MikgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgICAgICAgICAgcmV0ID0gZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMTQpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIG1lbXNldChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgMCwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBBVl9XTDE2KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCAxKTsgLyogdmVyc2lvbiAqLworICAgICAgICAgICAgQVZfV0wxNihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSsyLCAyMDQ4ICogc3QtPmNvZGVjcGFyLT5jaGFubmVscyk7IC8qIHVua25vd24gc2l6ZSAqLworICAgICAgICAgICAgQVZfV0wxNihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSs2LCBjb2RlYyA9PSA0ID8gMSA6IDApOyAvKiBqb2ludCBzdGVyZW8gKi8KKyAgICAgICAgICAgIEFWX1dMMTYoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGErOCwgY29kZWMgPT0gNCA/IDEgOiAwKTsgLyogam9pbnQgc3RlcmVvIChyZXBlYXQ/KSAqLworICAgICAgICAgICAgQVZfV0wxNihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSsxMCwgMSk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQVRSQUMzOyAgICBicmVhazsKICAgICBjYXNlIDc6IHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDM7ICAgICAgIGJyZWFrOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QMzsgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiQ29kZWMgJWQiLCBjb2RlYyk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQotICAgIHN0LT5kdXJhdGlvbiA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihzdC0+Y29kZWMsIHNpemUpOworICAgIHN0LT5kdXJhdGlvbiA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbjIoc3QtPmNvZGVjcGFyLCBzaXplKTsKICAgICBhdmlvX3NraXAocy0+cGIsIDB4NDAgLSBhdmlvX3RlbGwocy0+cGIpKTsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbXNmX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAKLSAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBjb2RlYy0+YmxvY2tfYWxpZ24gPyBjb2RlYy0+YmxvY2tfYWxpZ24gOiAxMDI0ICogY29kZWMtPmNoYW5uZWxzKTsKKyAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBwYXItPmJsb2NrX2FsaWduID8gcGFyLT5ibG9ja19hbGlnbiA6IDEwMjQgKiBwYXItPmNoYW5uZWxzKTsKIH0KIAogQVZJbnB1dEZvcm1hdCBmZl9tc2ZfZGVtdXhlciA9IHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L21zbndjX3RjcC5jIGIvbGliYXZmb3JtYXQvbXNud2NfdGNwLmMKaW5kZXggNWFiZjAwNi4uM2M3M2FjNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbXNud2NfdGNwLmMKKysrIGIvbGliYXZmb3JtYXQvbXNud2NfdGNwLmMKQEAgLTc0LDE3ICs3NCwxNyBAQAogc3RhdGljIGludCBtc253Y190Y3BfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpjdHgpCiB7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gY3R4LT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBBVlN0cmVhbSAqc3Q7CiAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oY3R4LCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgY29kZWMgICAgICAgICAgICAgPSBzdC0+Y29kZWM7Ci0gICAgY29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgY29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NSU1JQzsKLSAgICBjb2RlYy0+Y29kZWNfdGFnICA9IE1LVEFHKCdNJywgJ0wnLCAnMicsICcwJyk7CisgICAgcGFyICAgICAgICAgICAgID0gc3QtPmNvZGVjcGFyOworICAgIHBhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NSU1JQzsKKyAgICBwYXItPmNvZGVjX3RhZyAgPSBNS1RBRygnTScsICdMJywgJzInLCAnMCcpOwogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDEwMDApOwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tdGFmLmMgYi9saWJhdmZvcm1hdC9tdGFmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1YzJhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L210YWYuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogTVRBRiBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IG10YWZfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKHAtPmJ1Zl9zaXplIDwgMHg0NCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoQVZfUkwzMihwLT5idWYpICE9IE1LVEFHKCdNJywnVCcsJ0EnLCdGJykgfHwKKyAgICAgICAgQVZfUkwzMihwLT5idWYgKyAweDQwKSAhPSBNS1RBRygnSCcsJ0UnLCdBJywnRCcpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKK30KKworc3RhdGljIGludCBtdGFmX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgc3RyZWFtX2NvdW50OworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZpb19za2lwKHMtPnBiLCAweDVjKTsKKyAgICBzdC0+ZHVyYXRpb24gPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGF2aW9fc2tpcChzLT5wYiwgMSk7CisgICAgc3RyZWFtX2NvdW50ID0gYXZpb19yOChzLT5wYik7CisgICAgaWYgKCFzdHJlYW1fY291bnQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fTVRBRjsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gMiAqIHN0cmVhbV9jb3VudDsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDB4MTEwICogc3QtPmNvZGVjcGFyLT5jaGFubmVscyAvIDI7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworCisgICAgYXZpb19zZWVrKHMtPnBiLCAweDgwMCwgU0VFS19TRVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRhZl9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOworCisgICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgcGFyLT5ibG9ja19hbGlnbik7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbXRhZl9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJtdGFmIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiS29uYW1pIFBTMiBNVEFGIiksCisgICAgLnJlYWRfcHJvYmUgICAgID0gbXRhZl9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBtdGFmX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IG10YWZfcmVhZF9wYWNrZXQsCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm10YWYiLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L210di5jIGIvbGliYXZmb3JtYXQvbXR2LmMKaW5kZXggYTkxZTRjOC4uZGNmNGFhNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbXR2LmMKKysrIGIvbGliYXZmb3JtYXQvbXR2LmMKQEAgLTE2NSwxMyArMTY1LDEzIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgbXR2LT52aWRlb19mcHMpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU87Ci0gICAgc3QtPmNvZGVjLT5waXhfZm10ICAgICAgICAgPSBBVl9QSVhfRk1UX1JHQjU2NUJFOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICAgICAgID0gbXR2LT5pbWdfd2lkdGg7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgICAgICAgPSBtdHYtPmltZ19oZWlnaHQ7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGEgICAgICAgPSBhdl9zdHJkdXAoIkJvdHRvbVVwIik7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAgPSA5OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgICAgICAgICAgPSBBVl9QSVhfRk1UX1JHQjU2NUJFOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICAgICAgID0gbXR2LT5pbWdfd2lkdGg7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgICAgICAgPSBtdHYtPmltZ19oZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgICAgICAgPSBhdl9zdHJkdXAoIkJvdHRvbVVwIik7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSAgPSA5OwogCiAgICAgLy8gYXVkaW8gLSBtcDMKIApAQCAtMTgwLDEwICsxODAsMTAgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBNVFZfQVVESU9fU0FNUExJTkdfUkFURSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9NUDM7Ci0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICAgICAgPSBtdHYtPmF1ZGlvX2JyOwotICAgIHN0LT5uZWVkX3BhcnNpbmcgICAgICAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgICA9IEFWX0NPREVDX0lEX01QMzsKKyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlICAgICAgICA9IG10di0+YXVkaW9fYnI7CisgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgICAgICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwogCiAgICAgLy8gSnVtcCBvdmVyIGhlYWRlcgogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tdXN4LmMgYi9saWJhdmZvcm1hdC9tdXN4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmNmMzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L211c3guYwpAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIE1VU1ggZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDE2IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitzdGF0aWMgaW50IG11c3hfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKG1lbWNtcChwLT5idWYsICJNVVNYIiwgNCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gNSAqIDI7Cit9CisKK3N0YXRpYyBpbnQgbXVzeF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgdW5zaWduZWQgdHlwZSwgdmVyc2lvbiwgY29kaW5nLCBvZmZzZXQ7CisgICAgQVZTdHJlYW0gKnN0OworCisgICAgYXZpb19za2lwKHMtPnBiLCA4KTsKKyAgICB2ZXJzaW9uID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBpZiAodmVyc2lvbiAhPSAxMCAmJgorICAgICAgICB2ZXJzaW9uICE9IDYgJiYKKyAgICAgICAgdmVyc2lvbiAhPSA1ICYmCisgICAgICAgIHZlcnNpb24gIT0gNCAmJgorICAgICAgICB2ZXJzaW9uICE9IDIwMSkgeworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlVuc3VwcG9ydGVkIHZlcnNpb246ICVkIiwgdmVyc2lvbik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKHZlcnNpb24gPT0gMjAxKSB7CisgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgOCk7CisgICAgICAgIG9mZnNldCA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9QU1g7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSAyOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gMzIwMDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAweDgwICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKKyAgICB9ICBlbHNlIGlmICh2ZXJzaW9uID09IDEwKSB7CisgICAgICAgIHR5cGUgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBvZmZzZXQgPSAweDgwMDsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgTUtUQUcoJ1AnLCAnUycsICczJywgJ18nKToKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSAyOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwOworICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCA0NCk7CisgICAgICAgICAgICBjb2RpbmcgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICAgICAgaWYgKGNvZGluZyA9PSBNS1RBRygnRCcsICdBJywgJ1QnLCAnNCcpIHx8CisgICAgICAgICAgICAgICAgY29kaW5nID09IE1LVEFHKCdEJywgJ0EnLCAnVCcsICc4JykpIHsKKyAgICAgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIDQpOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPD0gMCB8fAorICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID4gSU5UX01BWCAvIDB4MjApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0RBVDQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMHgyMCAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnVycsICdJJywgJ0knLCAnXycpOgorICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCA0NCk7CisgICAgICAgICAgICBjb2RpbmcgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICAgICAgaWYgKGNvZGluZyAhPSBNS1RBRygnRCcsICdBJywgJ1QnLCAnNCcpICYmCisgICAgICAgICAgICAgICAgY29kaW5nICE9IE1LVEFHKCdEJywgJ0EnLCAnVCcsICc4JykpIHsKKyAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlVuc3VwcG9ydGVkIGNvZGluZzogJVgiLCBjb2RpbmcpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfREFUNDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA8PSAwIHx8CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IElOVF9NQVggLyAweDIwKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMHgyMCAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnWCcsICdFJywgJ18nLCAnXycpOgorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9EQVQ0OworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IDI7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gMzIwMDA7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMHgyMCAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS1RBRygnUCcsICdTJywgJ1AnLCAnXycpOgorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX1BTWDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSAyOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDMyNzY4OworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDB4ODAgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtUQUcoJ1AnLCAnUycsICcyJywgJ18nKToKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9QU1g7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gMjsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSAzMjAwMDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAweDgwICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJVbnN1cHBvcnRlZCB0eXBlOiAlWCIsIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDYgfHwgdmVyc2lvbiA9PSA1IHx8IHZlcnNpb24gPT0gNCkgeworICAgICAgICB0eXBlID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgYXZpb19za2lwKHMtPnBiLCAyMCk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSAyOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBNS1RBRygnRycsICdDJywgJ18nLCAnXycpOgorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9EQVQ0OworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDB4MjAgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDMyMDAwOworICAgICAgICAgICAgb2Zmc2V0ID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdQJywgJ1MnLCAnMicsICdfJyk6CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fUFNYOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDB4ODAgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDMyMDAwOworICAgICAgICAgICAgb2Zmc2V0ID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LVEFHKCdYJywgJ0InLCAnXycsICdfJyk6CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX0RBVDQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMHgyMCAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gNDQxMDA7CisgICAgICAgICAgICBvZmZzZXQgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlVuc3VwcG9ydGVkIHR5cGU6ICVYIiwgdHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBhdl9hc3NlcnQwKDApOworICAgIH0KKworICAgIGF2aW9fc2VlayhzLT5wYiwgb2Zmc2V0LCBTRUVLX1NFVCk7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdXN4X3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisKKyAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBwYXItPmJsb2NrX2FsaWduKTsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9tdXN4X2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm11c3giLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJFdXJvY29tIE1VU1giKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBtdXN4X3Byb2JlLAorICAgIC5yZWFkX2hlYWRlciAgICA9IG11c3hfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gbXVzeF9yZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAibXVzeCIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXV4LmMgYi9saWJhdmZvcm1hdC9tdXguYwppbmRleCA3ODljODExLi5hMTNmMGUzIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tdXguYworKysgYi9saWJhdmZvcm1hdC9tdXguYwpAQCAtMTE3LDI0ICsxMTcsMjQgQEAKIAogZW51bSBBVkNocm9tYUxvY2F0aW9uIGZmX2Nob29zZV9jaHJvbWFfbG9jYXRpb24oQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gc3QtPmNvZGVjOwotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGF2Y3R4LT5waXhfZm10KTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3QtPmNvZGVjcGFyOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqcGl4X2Rlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBhci0+Zm9ybWF0KTsKIAotICAgIGlmIChhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbiAhPSBBVkNIUk9NQV9MT0NfVU5TUEVDSUZJRUQpCi0gICAgICAgIHJldHVybiBhdmN0eC0+Y2hyb21hX3NhbXBsZV9sb2NhdGlvbjsKKyAgICBpZiAocGFyLT5jaHJvbWFfbG9jYXRpb24gIT0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEKQorICAgICAgICByZXR1cm4gcGFyLT5jaHJvbWFfbG9jYXRpb247CiAKICAgICBpZiAocGl4X2Rlc2MpIHsKICAgICAgICAgaWYgKHBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBBVkNIUk9NQV9MT0NfVE9QTEVGVDsKICAgICAgICAgfSBlbHNlIGlmIChwaXhfZGVzYy0+bG9nMl9jaHJvbWFfdyA9PSAxICYmIHBpeF9kZXNjLT5sb2cyX2Nocm9tYV9oID09IDEpIHsKLSAgICAgICAgICAgIGlmIChhdmN0eC0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVU5LTk9XTiB8fCBhdmN0eC0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfUFJPR1JFU1NJVkUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY19pZCkgeworICAgICAgICAgICAgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVU5LTk9XTiB8fCBwYXItPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1BST0dSRVNTSVZFKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NSlBFRzoKICAgICAgICAgICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcxVklERU86IHJldHVybiBBVkNIUk9NQV9MT0NfQ0VOVEVSOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdmN0eC0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVU5LTk9XTiB8fCBhdmN0eC0+ZmllbGRfb3JkZXIgIT0gQVZfRklFTERfUFJPR1JFU1NJVkUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5jb2RlY19pZCkgeworICAgICAgICAgICAgaWYgKHBhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfVU5LTk9XTiB8fCBwYXItPmZpZWxkX29yZGVyICE9IEFWX0ZJRUxEX1BST0dSRVNTSVZFKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOiByZXR1cm4gQVZDSFJPTUFfTE9DX0xFRlQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTg2LDggKzE4NiwxNiBAQAogICAgIH0gZWxzZQogICAgICAgICBzLT5wcml2X2RhdGEgPSBOVUxMOwogCi0gICAgaWYgKGZpbGVuYW1lKQorICAgIGlmIChmaWxlbmFtZSkgeworI2lmIEZGX0FQSV9GT1JNQVRfRklMRU5BTUUKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICAgICAgICAgYXZfc3RybGNweShzLT5maWxlbmFtZSwgZmlsZW5hbWUsIHNpemVvZihzLT5maWxlbmFtZSkpOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICAgICAgaWYgKCEocy0+dXJsID0gYXZfc3RyZHVwKGZpbGVuYW1lKSkpCisgICAgICAgICAgICBnb3RvIG5vbWVtOworCisgICAgfQogICAgICphdmN0eCA9IHM7CiAgICAgcmV0dXJuIDA7CiBub21lbToKQEAgLTIxNCwxMiArMjIyLDEyIEBACiAgICAgZm9yIChuID0gMDsgcy0+b2Zvcm1hdC0+Y29kZWNfdGFnW25dOyBuKyspIHsKICAgICAgICAgYXZjdGFnID0gcy0+b2Zvcm1hdC0+Y29kZWNfdGFnW25dOwogICAgICAgICB3aGlsZSAoYXZjdGFnLT5pZCAhPSBBVl9DT0RFQ19JRF9OT05FKSB7Ci0gICAgICAgICAgICBpZiAoYXZwcml2X3RvdXBwZXI0KGF2Y3RhZy0+dGFnKSA9PSBhdnByaXZfdG91cHBlcjQoc3QtPmNvZGVjLT5jb2RlY190YWcpKSB7CisgICAgICAgICAgICBpZiAoYXZwcml2X3RvdXBwZXI0KGF2Y3RhZy0+dGFnKSA9PSBhdnByaXZfdG91cHBlcjQoc3QtPmNvZGVjcGFyLT5jb2RlY190YWcpKSB7CiAgICAgICAgICAgICAgICAgaWQgPSBhdmN0YWctPmlkOwotICAgICAgICAgICAgICAgIGlmIChpZCA9PSBzdC0+Y29kZWMtPmNvZGVjX2lkKQorICAgICAgICAgICAgICAgIGlmIChpZCA9PSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhdmN0YWctPmlkID09IHN0LT5jb2RlYy0+Y29kZWNfaWQpCisgICAgICAgICAgICBpZiAoYXZjdGFnLT5pZCA9PSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKQogICAgICAgICAgICAgICAgIHRhZyA9IGF2Y3RhZy0+dGFnOwogICAgICAgICAgICAgYXZjdGFnKys7CiAgICAgICAgIH0KQEAgLTIzNyw3ICsyNDUsNyBAQAogICAgIGludCByZXQgPSAwLCBpOwogICAgIEFWU3RyZWFtICpzdDsKICAgICBBVkRpY3Rpb25hcnkgKnRtcCA9IE5VTEw7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gTlVMTDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gTlVMTDsKICAgICBBVk91dHB1dEZvcm1hdCAqb2YgPSBzLT5vZm9ybWF0OwogICAgIGNvbnN0IEFWQ29kZWNEZXNjcmlwdG9yICpkZXNjOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICplOwpAQCAtMjUxLDIzICsyNTksMjkgQEAKICAgICAgICAgKHJldCA9IGF2X29wdF9zZXRfZGljdDIocy0+cHJpdl9kYXRhLCAmdG1wLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKKyNpZiBGRl9BUElfRk9STUFUX0ZJTEVOQU1FCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgaWYgKCFzLT51cmwgJiYgIShzLT51cmwgPSBhdl9zdHJkdXAocy0+ZmlsZW5hbWUpKSkgeworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZWxzZQorICAgIGlmICghcy0+dXJsICYmICEocy0+dXJsID0gYXZfc3RyZHVwKCIiKSkpIHsKKyNlbmRpZgorICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIGlmIChzLT5uYl9zdHJlYW1zICYmIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfQklURVhBQ1QpIHsKICAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKSkgewotI2lmIEZGX0FQSV9MQVZGX0JJVEVYQUNUCi0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgIlNldHRpbmcgdGhlIEFWRm9ybWF0Q29udGV4dCB0byBiaXRleGFjdCBtb2RlLCBiZWNhdXNlICIKLSAgICAgICAgICAgICAgICAgICAidGhlIEFWQ29kZWNDb250ZXh0IGlzIGluIHRoYXQgbW9kZS4gVGhpcyBiZWhhdmlvciB3aWxsICIKLSAgICAgICAgICAgICAgICAgICAiY2hhbmdlIGluIHRoZSBmdXR1cmUuIFRvIGtlZXAgdGhlIGN1cnJlbnQgYmVoYXZpb3IsIHNldCAiCi0gICAgICAgICAgICAgICAgICAgIkFWRm9ybWF0Q29udGV4dC5mbGFncyB8PSBBVkZNVF9GTEFHX0JJVEVYQUNULlxuIik7Ci0gICAgICAgICAgICBzLT5mbGFncyB8PSBBVkZNVF9GTEFHX0JJVEVYQUNUOwotI2Vsc2UKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAiVGhlIEFWRm9ybWF0Q29udGV4dCBpcyBub3QgaW4gc2V0IHRvIGJpdGV4YWN0IG1vZGUsIG9ubHkgIgogICAgICAgICAgICAgICAgICAgICJ0aGUgQVZDb2RlY0NvbnRleHQuIElmIHRoaXMgaXMgbm90IGludGVuZGVkLCBzZXQgIgogICAgICAgICAgICAgICAgICAgICJBVkZvcm1hdENvbnRleHQuZmxhZ3MgfD0gQVZGTVRfRkxBR19CSVRFWEFDVC5cbiIpOwotI2VuZGlmCiAgICAgICAgIH0KICAgICB9CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogCiAgICAgLy8gc29tZSBzYW5pdHkgY2hlY2tzCiAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPT0gMCAmJiAhKG9mLT5mbGFncyAmIEFWRk1UX05PU1RSRUFNUykpIHsKQEAgLTI3Nyw1OCArMjkxLDYxIEBACiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBzdCAgICA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgIGNvZGVjID0gc3QtPmNvZGVjOworICAgICAgICBzdCAgPSBzLT5zdHJlYW1zW2ldOworICAgICAgICBwYXIgPSBzdC0+Y29kZWNwYXI7CiAKLSNpZiBGRl9BUElfTEFWRl9DT0RFQ19UQgorI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCiBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCi0gICAgICAgIGlmICghc3QtPnRpbWVfYmFzZS5udW0gJiYgY29kZWMtPnRpbWVfYmFzZS5udW0pIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVzaW5nIEFWU3RyZWFtLmNvZGVjLnRpbWVfYmFzZSBhcyBhICIKLSAgICAgICAgICAgICAgICAgICAidGltZWJhc2UgaGludCB0byB0aGUgbXV4ZXIgaXMgZGVwcmVjYXRlZC4gU2V0ICIKLSAgICAgICAgICAgICAgICAgICAiQVZTdHJlYW0udGltZV9iYXNlIGluc3RlYWQuXG4iKTsKLSAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBjb2RlYy0+dGltZV9iYXNlLm51bSwgY29kZWMtPnRpbWVfYmFzZS5kZW4pOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9VTktOT1dOICYmCisgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgIT0gQVZNRURJQV9UWVBFX1VOS05PV04pIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVzaW5nIEFWU3RyZWFtLmNvZGVjIHRvIHBhc3MgY29kZWMgIgorICAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXJzIHRvIG11eGVycyBpcyBkZXByZWNhdGVkLCB1c2UgQVZTdHJlYW0uY29kZWNwYXIgIgorICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkLlxuIik7CisgICAgICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfZnJvbV9jb250ZXh0KHN0LT5jb2RlY3Bhciwgc3QtPmNvZGVjKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAjZW5kaWYKIAogICAgICAgICBpZiAoIXN0LT50aW1lX2Jhc2UubnVtKSB7CiAgICAgICAgICAgICAvKiBmYWxsIGJhY2sgb24gdGhlIGRlZmF1bHQgdGltZWJhc2UgdmFsdWVzICovCi0gICAgICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIGNvZGVjLT5zYW1wbGVfcmF0ZSkKLSAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgY29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHBhci0+c2FtcGxlX3JhdGUpCisgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHBhci0+c2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCA5MDAwMCk7CiAgICAgICAgIH0KIAotICAgICAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgICAgIHN3aXRjaCAocGFyLT5jb2RlY190eXBlKSB7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgaWYgKGNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgICAgICAgICBpZiAocGFyLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInNhbXBsZSByYXRlIG5vdCBzZXRcbiIpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWNvZGVjLT5ibG9ja19hbGlnbikKLSAgICAgICAgICAgICAgICBjb2RlYy0+YmxvY2tfYWxpZ24gPSBjb2RlYy0+Y2hhbm5lbHMgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoY29kZWMtPmNvZGVjX2lkKSA+PiAzOworICAgICAgICAgICAgaWYgKCFwYXItPmJsb2NrX2FsaWduKQorICAgICAgICAgICAgICAgIHBhci0+YmxvY2tfYWxpZ24gPSBwYXItPmNoYW5uZWxzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShwYXItPmNvZGVjX2lkKSA+PiAzOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgaWYgKChjb2RlYy0+d2lkdGggPD0gMCB8fCBjb2RlYy0+aGVpZ2h0IDw9IDApICYmCisgICAgICAgICAgICBpZiAoKHBhci0+d2lkdGggPD0gMCB8fCBwYXItPmhlaWdodCA8PSAwKSAmJgogICAgICAgICAgICAgICAgICEob2YtPmZsYWdzICYgQVZGTVRfTk9ESU1FTlNJT05TKSkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJkaW1lbnNpb25zIG5vdCBzZXRcbiIpOwogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXZfY21wX3Eoc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8sIGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvKQotICAgICAgICAgICAgICAgICYmIGZhYnMoYXZfcTJkKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvKSAtIGF2X3EyZChjb2RlYy0+c2FtcGxlX2FzcGVjdF9yYXRpbykpID4gMC4wMDQqYXZfcTJkKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvKQorICAgICAgICAgICAgaWYgKGF2X2NtcF9xKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLCBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8pCisgICAgICAgICAgICAgICAgJiYgZmFicyhhdl9xMmQoc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8pIC0gYXZfcTJkKHBhci0+c2FtcGxlX2FzcGVjdF9yYXRpbykpID4gMC4wMDQqYXZfcTJkKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvKQogICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgaWYgKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSAwICYmCiAgICAgICAgICAgICAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBhci0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFzcGVjdCByYXRpbyBtaXNtYXRjaCBiZXR3ZWVuIG11eGVyICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoJWQvJWQpIGFuZCBlbmNvZGVyIGxheWVyICglZC8lZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbik7CiAgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgICAgIH0KQEAgLTMzNiwzNiArMzUzLDM0IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgIGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KHBhci0+Y29kZWNfaWQpOwogICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfUkVPUkRFUikKICAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+cmVvcmRlciA9IDE7CiAKICAgICAgICAgaWYgKG9mLT5jb2RlY190YWcpIHsKLSAgICAgICAgICAgIGlmICggICBjb2RlYy0+Y29kZWNfdGFnCi0gICAgICAgICAgICAgICAgJiYgY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPCi0gICAgICAgICAgICAgICAgJiYgKCAgIGF2X2NvZGVjX2dldF90YWcob2YtPmNvZGVjX3RhZywgY29kZWMtPmNvZGVjX2lkKSA9PSAwCi0gICAgICAgICAgICAgICAgICAgIHx8IGF2X2NvZGVjX2dldF90YWcob2YtPmNvZGVjX3RhZywgY29kZWMtPmNvZGVjX2lkKSA9PSBNS1RBRygncicsICdhJywgJ3cnLCAnICcpKQorICAgICAgICAgICAgaWYgKCAgIHBhci0+Y29kZWNfdGFnCisgICAgICAgICAgICAgICAgJiYgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTworICAgICAgICAgICAgICAgICYmICggICBhdl9jb2RlY19nZXRfdGFnKG9mLT5jb2RlY190YWcsIHBhci0+Y29kZWNfaWQpID09IDAKKyAgICAgICAgICAgICAgICAgICAgfHwgYXZfY29kZWNfZ2V0X3RhZyhvZi0+Y29kZWNfdGFnLCBwYXItPmNvZGVjX2lkKSA9PSBNS1RBRygncicsICdhJywgJ3cnLCAnICcpKQogICAgICAgICAgICAgICAgICYmICF2YWxpZGF0ZV9jb2RlY190YWcocywgc3QpKSB7CiAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgcmF3dmlkZW8gZW5jb2Rpbmcgc3lzdGVtIGVuZHMgdXAgc2V0dGluZwogICAgICAgICAgICAgICAgIC8vIHRoZSB3cm9uZyBjb2RlY190YWcgZm9yIGF2aS9tb3YsIHdlIG92ZXJyaWRlIGl0IGhlcmUKLSAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgICAgICAgICBwYXItPmNvZGVjX3RhZyA9IDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3RhZykgeworICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfdGFnKSB7CiAgICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZV9jb2RlY190YWcocywgc3QpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgdGFnYnVmWzMyXSwgdGFnYnVmMlszMl07Ci0gICAgICAgICAgICAgICAgICAgIGF2X2dldF9jb2RlY190YWdfc3RyaW5nKHRhZ2J1Ziwgc2l6ZW9mKHRhZ2J1ZiksIGNvZGVjLT5jb2RlY190YWcpOwotICAgICAgICAgICAgICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyh0YWdidWYyLCBzaXplb2YodGFnYnVmMiksIGF2X2NvZGVjX2dldF90YWcocy0+b2Zvcm1hdC0+Y29kZWNfdGFnLCBjb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgb3RhZyA9IGF2X2NvZGVjX2dldF90YWcocy0+b2Zvcm1hdC0+Y29kZWNfdGFnLCBwYXItPmNvZGVjX2lkKTsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYWcgJXMvMHglMDh4IGluY29tcGF0aWJsZSB3aXRoIG91dHB1dCBjb2RlYyBpZCAnJWQnICglcylcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdidWYsIGNvZGVjLT5jb2RlY190YWcsIGNvZGVjLT5jb2RlY19pZCwgdGFnYnVmMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGFnICVzIGluY29tcGF0aWJsZSB3aXRoIG91dHB1dCBjb2RlYyBpZCAnJWQnICglcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKHBhci0+Y29kZWNfdGFnKSwgcGFyLT5jb2RlY19pZCwgYXZfZm91cmNjMnN0cihvdGFnKSk7CiAgICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfdGFnID0gYXZfY29kZWNfZ2V0X3RhZyhvZi0+Y29kZWNfdGFnLCBjb2RlYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgICAgIHBhci0+Y29kZWNfdGFnID0gYXZfY29kZWNfZ2V0X3RhZyhvZi0+Y29kZWNfdGFnLCBwYXItPmNvZGVjX2lkKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCkKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCkKICAgICAgICAgICAgIHMtPmludGVybmFsLT5uYl9pbnRlcmxlYXZlZF9zdHJlYW1zKys7CiAgICAgfQogCkBAIC0zOTksOSArNDE0LDEzIEBACiAgICAgICAgICAqb3B0aW9ucyA9IHRtcDsKICAgICB9CiAKLSAgICBpZiAocy0+b2Zvcm1hdC0+aW5pdCAmJiAocmV0ID0gcy0+b2Zvcm1hdC0+aW5pdChzKSkgPCAwKSB7Ci0gICAgICAgIHMtPm9mb3JtYXQtPmRlaW5pdChzKTsKLSAgICAgICAgZ290byBmYWlsOworICAgIGlmIChzLT5vZm9ybWF0LT5pbml0KSB7CisgICAgICAgIGlmICgocmV0ID0gcy0+b2Zvcm1hdC0+aW5pdChzKSkgPCAwKSB7CisgICAgICAgICAgICBpZiAocy0+b2Zvcm1hdC0+ZGVpbml0KQorICAgICAgICAgICAgICAgIHMtPm9mb3JtYXQtPmRlaW5pdChzKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldCA9PSAwOwogICAgIH0KIAogICAgIHJldHVybiAwOwpAQCAtNDIxLDU0ICs0NDAsMzAgQEAKICAgICAgICAgaW50NjRfdCBkZW4gPSBBVl9OT1BUU19WQUxVRTsKICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOwogCi0gICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlKSB7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICAgICAgZGVuID0gKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5udW0gKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgZGVuID0gKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5udW0gKiBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgZGVuID0gKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5udW0gKiBzdC0+Y29kZWMtPnRpbWVfYmFzZS5kZW47CisgICAgICAgICAgICBkZW4gPSAoaW50NjRfdClzdC0+dGltZV9iYXNlLm51bSAqIHN0LT50aW1lX2Jhc2UuZGVuOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghc3QtPnByaXZfcHRzKQotICAgICAgICAgICAgc3QtPnByaXZfcHRzID0gYXZfbWFsbG9jeihzaXplb2YoKnN0LT5wcml2X3B0cykpOwotICAgICAgICBpZiAoIXN0LT5wcml2X3B0cykKKyAgICAgICAgaWYgKCFzdC0+aW50ZXJuYWwtPnByaXZfcHRzKQorICAgICAgICAgICAgc3QtPmludGVybmFsLT5wcml2X3B0cyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpzdC0+aW50ZXJuYWwtPnByaXZfcHRzKSk7CisgICAgICAgIGlmICghc3QtPmludGVybmFsLT5wcml2X3B0cykKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICAgICAgaWYgKGRlbiAhPSBBVl9OT1BUU19WQUxVRSkgewogICAgICAgICAgICAgaWYgKGRlbiA8PSAwKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgICAgICAgICBmcmFjX2luaXQoc3QtPnByaXZfcHRzLCAwLCAwLCBkZW4pOworICAgICAgICAgICAgZnJhY19pbml0KHN0LT5pbnRlcm5hbC0+cHJpdl9wdHMsIDAsIDAsIGRlbik7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0KLSAgICBpZiAoKHJldCA9IGluaXRfbXV4ZXIocywgb3B0aW9ucykpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLQotICAgIGlmIChzLT5vZm9ybWF0LT53cml0ZV9oZWFkZXIgJiYgIXMtPm9mb3JtYXQtPmNoZWNrX2JpdHN0cmVhbSkgewotICAgICAgICByZXQgPSBzLT5vZm9ybWF0LT53cml0ZV9oZWFkZXIocyk7Ci0gICAgICAgIGlmIChyZXQgPj0gMCAmJiBzLT5wYiAmJiBzLT5wYi0+ZXJyb3IgPCAwKQotICAgICAgICAgICAgcmV0ID0gcy0+cGItPmVycm9yOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmIChzLT5mbHVzaF9wYWNrZXRzICYmIHMtPnBiICYmIHMtPnBiLT5lcnJvciA+PSAwICYmIHMtPmZsYWdzICYgQVZGTVRfRkxBR19GTFVTSF9QQUNLRVRTKQotICAgICAgICAgICAgYXZpb19mbHVzaChzLT5wYik7Ci0gICAgICAgIHMtPmludGVybmFsLT5oZWFkZXJfd3JpdHRlbiA9IDE7Ci0gICAgfQotCi0gICAgaWYgKChyZXQgPSBpbml0X3B0cyhzKSkgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotCiAgICAgaWYgKHMtPmF2b2lkX25lZ2F0aXZlX3RzIDwgMCkgewogICAgICAgICBhdl9hc3NlcnQyKHMtPmF2b2lkX25lZ2F0aXZlX3RzID09IEFWRk1UX0FWT0lEX05FR19UU19BVVRPKTsKICAgICAgICAgaWYgKHMtPm9mb3JtYXQtPmZsYWdzICYgKEFWRk1UX1RTX05FR0FUSVZFIHwgQVZGTVRfTk9USU1FU1RBTVBTKSkgewpAQCAtNDgwLDYgKzQ3NSw3MiBAQAogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBmbHVzaF9pZl9uZWVkZWQoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGlmIChzLT5wYiAmJiBzLT5wYi0+ZXJyb3IgPj0gMCkgeworICAgICAgICBpZiAocy0+Zmx1c2hfcGFja2V0cyA9PSAxIHx8IHMtPmZsYWdzICYgQVZGTVRfRkxBR19GTFVTSF9QQUNLRVRTKQorICAgICAgICAgICAgYXZpb19mbHVzaChzLT5wYik7CisgICAgICAgIGVsc2UgaWYgKHMtPmZsdXNoX3BhY2tldHMgJiYgIShzLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PRklMRSkpCisgICAgICAgICAgICBhdmlvX3dyaXRlX21hcmtlcihzLT5wYiwgQVZfTk9QVFNfVkFMVUUsIEFWSU9fREFUQV9NQVJLRVJfRkxVU0hfUE9JTlQpOworICAgIH0KK30KKworaW50IGF2Zm9ybWF0X2luaXRfb3V0cHV0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICgocmV0ID0gaW5pdF9tdXhlcihzLCBvcHRpb25zKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcy0+aW50ZXJuYWwtPmluaXRpYWxpemVkID0gMTsKKyAgICBzLT5pbnRlcm5hbC0+c3RyZWFtc19pbml0aWFsaXplZCA9IHJldDsKKworICAgIGlmIChzLT5vZm9ybWF0LT5pbml0ICYmIHJldCkgeworICAgICAgICBpZiAoKHJldCA9IGluaXRfcHRzKHMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIHJldHVybiBBVlNUUkVBTV9JTklUX0lOX0lOSVRfT1VUUFVUOworICAgIH0KKworICAgIHJldHVybiBBVlNUUkVBTV9JTklUX0lOX1dSSVRFX0hFQURFUjsKK30KKworaW50IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCit7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGFscmVhZHlfaW5pdGlhbGl6ZWQgPSBzLT5pbnRlcm5hbC0+aW5pdGlhbGl6ZWQ7CisgICAgaW50IHN0cmVhbXNfYWxyZWFkeV9pbml0aWFsaXplZCA9IHMtPmludGVybmFsLT5zdHJlYW1zX2luaXRpYWxpemVkOworCisgICAgaWYgKCFhbHJlYWR5X2luaXRpYWxpemVkKQorICAgICAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X2luaXRfb3V0cHV0KHMsIG9wdGlvbnMpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgaWYgKCEocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpICYmIHMtPnBiKQorICAgICAgICBhdmlvX3dyaXRlX21hcmtlcihzLT5wYiwgQVZfTk9QVFNfVkFMVUUsIEFWSU9fREFUQV9NQVJLRVJfSEVBREVSKTsKKyAgICBpZiAocy0+b2Zvcm1hdC0+d3JpdGVfaGVhZGVyKSB7CisgICAgICAgIHJldCA9IHMtPm9mb3JtYXQtPndyaXRlX2hlYWRlcihzKTsKKyAgICAgICAgaWYgKHJldCA+PSAwICYmIHMtPnBiICYmIHMtPnBiLT5lcnJvciA8IDApCisgICAgICAgICAgICByZXQgPSBzLT5wYi0+ZXJyb3I7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBmbHVzaF9pZl9uZWVkZWQocyk7CisgICAgfQorICAgIGlmICghKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSAmJiBzLT5wYikKKyAgICAgICAgYXZpb193cml0ZV9tYXJrZXIocy0+cGIsIEFWX05PUFRTX1ZBTFVFLCBBVklPX0RBVEFfTUFSS0VSX1VOS05PV04pOworCisgICAgaWYgKCFzLT5pbnRlcm5hbC0+c3RyZWFtc19pbml0aWFsaXplZCkgeworICAgICAgICBpZiAoKHJldCA9IGluaXRfcHRzKHMpKSA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIHN0cmVhbXNfYWxyZWFkeV9pbml0aWFsaXplZDsKKworZmFpbDoKKyAgICBpZiAocy0+b2Zvcm1hdC0+ZGVpbml0KQorICAgICAgICBzLT5vZm9ybWF0LT5kZWluaXQocyk7CisgICAgcmV0dXJuIHJldDsKK30KKwogI2RlZmluZSBBVl9QS1RfRkxBR19VTkNPREVEX0ZSQU1FIDB4MjAwMAogCiAvKiBOb3RlOiB1c2luZyBzaXplb2YoQVZGcmFtZSkgZnJvbSBvdXRzaWRlIGxhdnUgaXMgdW5zYWZlIGluIGdlbmVyYWwsIGJ1dApAQCAtNDg5LDE2ICs1NTAsMTggQEAKICNkZWZpbmUgVU5DT0RFRF9GUkFNRV9QQUNLRVRfU0laRSAoSU5UX01JTiAvIDMgKiAyICsgKGludClzaXplb2YoQVZGcmFtZSkpCiAKIAotI2lmIEZGX0FQSV9DT01QVVRFX1BLVF9GSUVMRFMyCisjaWYgRkZfQVBJX0NPTVBVVEVfUEtUX0ZJRUxEUzIgJiYgRkZfQVBJX0xBVkZfQVZDVFgKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKIC8vRklYTUUgbWVyZ2Ugd2l0aCBjb21wdXRlX3BrdF9maWVsZHMKIHN0YXRpYyBpbnQgY29tcHV0ZV9tdXhlcl9wa3RfZmllbGRzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0KQogewotICAgIGludCBkZWxheSA9IEZGTUFYKHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzLCBzdC0+Y29kZWMtPm1heF9iX2ZyYW1lcyA+IDApOworICAgIGludCBkZWxheSA9IEZGTUFYKHN0LT5jb2RlY3Bhci0+dmlkZW9fZGVsYXksIHN0LT5pbnRlcm5hbC0+YXZjdHgtPm1heF9iX2ZyYW1lcyA+IDApOwogICAgIGludCBudW0sIGRlbiwgaTsKICAgICBpbnQgZnJhbWVfc2l6ZTsKIAogICAgIGlmICghcy0+aW50ZXJuYWwtPm1pc3NpbmdfdHNfd2FybmluZyAmJgogICAgICAgICAhKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9USU1FU1RBTVBTKSAmJgorICAgICAgICAoIShzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9BVFRBQ0hFRF9QSUMpIHx8IChzdC0+ZGlzcG9zaXRpb24gJiBBVl9ESVNQT1NJVElPTl9USU1FRF9USFVNQk5BSUxTKSkgJiYKICAgICAgICAgKHBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFIHx8IHBrdC0+ZHRzID09IEFWX05PUFRTX1ZBTFVFKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAiVGltZXN0YW1wcyBhcmUgdW5zZXQgaW4gYSBwYWNrZXQgZm9yIHN0cmVhbSAlZC4gIgpAQCAtNTExLDcgKzU3NCw3IEBACiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJjb21wdXRlX211eGVyX3BrdF9maWVsZHM6IHB0czolcyBkdHM6JXMgY3VyX2R0czolcyBiOiVkIHNpemU6JWQgc3Q6JWRcbiIsCiAgICAgICAgICAgICBhdl90czJzdHIocGt0LT5wdHMpLCBhdl90czJzdHIocGt0LT5kdHMpLCBhdl90czJzdHIoc3QtPmN1cl9kdHMpLCBkZWxheSwgcGt0LT5zaXplLCBwa3QtPnN0cmVhbV9pbmRleCk7CiAKLSAgICBpZiAocGt0LT5kdXJhdGlvbiA8IDAgJiYgc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgIGlmIChwa3QtPmR1cmF0aW9uIDwgMCAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlBhY2tldCB3aXRoIGludmFsaWQgZHVyYXRpb24gJSJQUklkNjQiIGluIHN0cmVhbSAlZFxuIiwKICAgICAgICAgICAgICAgIHBrdC0+ZHVyYXRpb24sIHBrdC0+c3RyZWFtX2luZGV4KTsKICAgICAgICAgcGt0LT5kdXJhdGlvbiA9IDA7CkBAIC01MzcsNyArNjAwLDcgQEAKICAgICAgICAgfQogICAgICAgICBwa3QtPmR0cyA9CiAvLyAgICAgICAgcGt0LT5wdHM9IHN0LT5jdXJfZHRzOwotICAgICAgICAgICAgcGt0LT5wdHMgPSBzdC0+cHJpdl9wdHMtPnZhbDsKKyAgICAgICAgICAgIHBrdC0+cHRzID0gc3QtPmludGVybmFsLT5wcml2X3B0cy0+dmFsOwogICAgIH0KIAogICAgIC8vY2FsY3VsYXRlIGR0cyBmcm9tIHB0cwpAQCAtNTUzLDcgKzYxNiw4IEBACiAKICAgICBpZiAoc3QtPmN1cl9kdHMgJiYgc3QtPmN1cl9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKICAgICAgICAgKCghKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfVFNfTk9OU1RSSUNUKSAmJgotICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfU1VCVElUTEUgJiYKKyAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICYmCisgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9EQVRBICYmCiAgICAgICAgICAgc3QtPmN1cl9kdHMgPj0gcGt0LT5kdHMpIHx8IHN0LT5jdXJfZHRzID4gcGt0LT5kdHMpKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24gcHJvdmlkZWQgaW52YWxpZCwgbm9uIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBkdHMgdG8gbXV4ZXIgaW4gc3RyZWFtICVkOiAlcyA+PSAlc1xuIiwKQEAgLTU3MywxMCArNjM3LDEwIEBACiAgICAgICAgICAgICBhdl90czJzdHIocGt0LT5wdHMpLCBhdl90czJzdHIocGt0LT5kdHMpKTsKIAogICAgIHN0LT5jdXJfZHRzID0gcGt0LT5kdHM7Ci0gICAgc3QtPnByaXZfcHRzLT52YWwgPSBwa3QtPmR0czsKKyAgICBzdC0+aW50ZXJuYWwtPnByaXZfcHRzLT52YWwgPSBwa3QtPmR0czsKIAogICAgIC8qIHVwZGF0ZSBwdHMgKi8KLSAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSkgeworICAgIHN3aXRjaCAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlKSB7CiAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CiAgICAgICAgIGZyYW1lX3NpemUgPSAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX1VOQ09ERURfRlJBTUUpID8KICAgICAgICAgICAgICAgICAgICAgICgoQVZGcmFtZSAqKXBrdC0+ZGF0YSktPm5iX3NhbXBsZXMgOgpAQCAtNTg1LDE2ICs2NDksMTcgQEAKICAgICAgICAgLyogSEFDSy9GSVhNRSwgd2Ugc2tpcCB0aGUgaW5pdGlhbCAwIHNpemUgcGFja2V0cyBhcyB0aGV5IGFyZSBtb3N0CiAgICAgICAgICAqIGxpa2VseSBlcXVhbCB0byB0aGUgZW5jb2RlciBkZWxheSwgYnV0IGl0IHdvdWxkIGJlIGJldHRlciBpZiB3ZQogICAgICAgICAgKiBoYWQgdGhlIHJlYWwgdGltZXN0YW1wcyBmcm9tIHRoZSBlbmNvZGVyICovCi0gICAgICAgIGlmIChmcmFtZV9zaXplID49IDAgJiYgKHBrdC0+c2l6ZSB8fCBzdC0+cHJpdl9wdHMtPm51bSAhPSBzdC0+cHJpdl9wdHMtPmRlbiA+PiAxIHx8IHN0LT5wcml2X3B0cy0+dmFsKSkgewotICAgICAgICAgICAgZnJhY19hZGQoc3QtPnByaXZfcHRzLCAoaW50NjRfdClzdC0+dGltZV9iYXNlLmRlbiAqIGZyYW1lX3NpemUpOworICAgICAgICBpZiAoZnJhbWVfc2l6ZSA+PSAwICYmIChwa3QtPnNpemUgfHwgc3QtPmludGVybmFsLT5wcml2X3B0cy0+bnVtICE9IHN0LT5pbnRlcm5hbC0+cHJpdl9wdHMtPmRlbiA+PiAxIHx8IHN0LT5pbnRlcm5hbC0+cHJpdl9wdHMtPnZhbCkpIHsKKyAgICAgICAgICAgIGZyYWNfYWRkKHN0LT5pbnRlcm5hbC0+cHJpdl9wdHMsIChpbnQ2NF90KXN0LT50aW1lX2Jhc2UuZGVuICogZnJhbWVfc2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgIGZyYWNfYWRkKHN0LT5wcml2X3B0cywgKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5kZW4gKiBzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0pOworICAgICAgICBmcmFjX2FkZChzdC0+aW50ZXJuYWwtPnByaXZfcHRzLCAoaW50NjRfdClzdC0+dGltZV9iYXNlLmRlbiAqIHN0LT50aW1lX2Jhc2UubnVtKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiAwOwogfQorRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAjZW5kaWYKIAogLyoqCkBAIC02MDgsOCArNjczLDE0IEBACiAgKi8KIHN0YXRpYyBpbnQgd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBpbnQgcmV0LCBkaWRfc3BsaXQ7CisgICAgaW50IHJldDsKKyAgICBpbnQ2NF90IHB0c19iYWNrdXAsIGR0c19iYWNrdXA7CiAKKyAgICBwdHNfYmFja3VwID0gcGt0LT5wdHM7CisgICAgZHRzX2JhY2t1cCA9IHBrdC0+ZHRzOworCisgICAgLy8gSWYgdGhlIHRpbWVzdGFtcCBvZmZzZXR0aW5nIGJlbG93IGlzIGFkanVzdGVkLCBhZGp1c3QKKyAgICAvLyBmZl9pbnRlcmxlYXZlZF9wZWVrIHNpbWlsYXJseS4KICAgICBpZiAocy0+b3V0cHV0X3RzX29mZnNldCkgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSBhdl9yZXNjYWxlX3Eocy0+b3V0cHV0X3RzX29mZnNldCwgQVZfVElNRV9CQVNFX1EsIHN0LT50aW1lX2Jhc2UpOwpAQCAtNjQ5LDcgKzcyMCw3IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiZmFpbGVkIHRvIGF2b2lkIG5lZ2F0aXZlICIKICAgICAgICAgICAgICAgICAgICAgInB0cyAlcyBpbiBzdHJlYW0gJWQuXG4iCiAgICAgICAgICAgICAgICAgICAgICJUcnkgLWF2b2lkX25lZ2F0aXZlX3RzIDEgYXMgYSBwb3NzaWJsZSB3b3JrYXJvdW5kLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+ZHRzKSwKKyAgICAgICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+cHRzKSwKICAgICAgICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXgKICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgfQpAQCAtNjY3LDE5ICs3MzgsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgZGlkX3NwbGl0ID0gYXZfcGFja2V0X3NwbGl0X3NpZGVfZGF0YShwa3QpOwotCi0gICAgaWYgKCFzLT5pbnRlcm5hbC0+aGVhZGVyX3dyaXR0ZW4gJiYgcy0+b2Zvcm1hdC0+d3JpdGVfaGVhZGVyKSB7Ci0gICAgICAgIHJldCA9IHMtPm9mb3JtYXQtPndyaXRlX2hlYWRlcihzKTsKLSAgICAgICAgaWYgKHJldCA+PSAwICYmIHMtPnBiICYmIHMtPnBiLT5lcnJvciA8IDApCi0gICAgICAgICAgICByZXQgPSBzLT5wYi0+ZXJyb3I7Ci0gICAgICAgIGlmIChyZXQgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICBpZiAocy0+Zmx1c2hfcGFja2V0cyAmJiBzLT5wYiAmJiBzLT5wYi0+ZXJyb3IgPj0gMCAmJiBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfRkxVU0hfUEFDS0VUUykKLSAgICAgICAgICAgIGF2aW9fZmx1c2gocy0+cGIpOwotICAgICAgICBzLT5pbnRlcm5hbC0+aGVhZGVyX3dyaXR0ZW4gPSAxOwotICAgIH0KLQogICAgIGlmICgocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX1VOQ09ERURfRlJBTUUpKSB7CiAgICAgICAgIEFWRnJhbWUgKmZyYW1lID0gKEFWRnJhbWUgKilwa3QtPmRhdGE7CiAgICAgICAgIGF2X2Fzc2VydDAocGt0LT5zaXplID09IFVOQ09ERURfRlJBTUVfUEFDS0VUX1NJWkUpOwpAQCAtNjkwLDE1ICs3NDgsMTUgQEAKICAgICB9CiAKICAgICBpZiAocy0+cGIgJiYgcmV0ID49IDApIHsKLSAgICAgICAgaWYgKHMtPmZsdXNoX3BhY2tldHMgJiYgcy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0ZMVVNIX1BBQ0tFVFMpCi0gICAgICAgICAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICAgICAgZmx1c2hfaWZfbmVlZGVkKHMpOwogICAgICAgICBpZiAocy0+cGItPmVycm9yIDwgMCkKICAgICAgICAgICAgIHJldCA9IHMtPnBiLT5lcnJvcjsKICAgICB9CiAKLWZhaWw6Ci0gICAgaWYgKGRpZF9zcGxpdCkKLSAgICAgICAgYXZfcGFja2V0X21lcmdlX3NpZGVfZGF0YShwa3QpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIHBrdC0+cHRzID0gcHRzX2JhY2t1cDsKKyAgICAgICAgcGt0LT5kdHMgPSBkdHNfYmFja3VwOworICAgIH0KIAogICAgIHJldHVybiByZXQ7CiB9CkBAIC03MTQsNyArNzcyLDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKLSAgICBpZiAocy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UKSB7CisgICAgaWYgKHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVjZWl2ZWQgYSBwYWNrZXQgZm9yIGFuIGF0dGFjaG1lbnQgc3RyZWFtLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQpAQCAtNzMwLDcgKzc4OCw3IEBACiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKLSNpZiAhRkZfQVBJX0NPTVBVVEVfUEtUX0ZJRUxEUzIKKyNpZiAhRkZfQVBJX0NPTVBVVEVfUEtUX0ZJRUxEUzIgfHwgIUZGX0FQSV9MQVZGX0FWQ1RYCiAgICAgLyogc2FuaXRpemUgdGhlIHRpbWVzdGFtcHMgKi8KICAgICBpZiAoIShzLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PVElNRVNUQU1QUykpIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF07CkBAIC03NzQsNiArODMyLDQ5IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgZG9fcGFja2V0X2F1dG9fYnNmKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkgeworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgIGludCBpLCByZXQ7CisKKyAgICBpZiAoIShzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQVVUT19CU0YpKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGlmIChzLT5vZm9ybWF0LT5jaGVja19iaXRzdHJlYW0pIHsKKyAgICAgICAgaWYgKCFzdC0+aW50ZXJuYWwtPmJpdHN0cmVhbV9jaGVja2VkKSB7CisgICAgICAgICAgICBpZiAoKHJldCA9IHMtPm9mb3JtYXQtPmNoZWNrX2JpdHN0cmVhbShzLCBwa3QpKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJldCA9PSAxKQorICAgICAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+Yml0c3RyZWFtX2NoZWNrZWQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHN0LT5pbnRlcm5hbC0+bmJfYnNmY3M7IGkrKykgeworICAgICAgICBBVkJTRkNvbnRleHQgKmN0eCA9IHN0LT5pbnRlcm5hbC0+YnNmY3NbaV07CisgICAgICAgIC8vIFRPRE86IHdoZW4gYW55IGJpdHN0cmVhbSBmaWx0ZXIgcmVxdWlyZXMgZmx1c2hpbmcgYXQgRU9GLCB3ZSdsbCBuZWVkIHRvCisgICAgICAgIC8vIGZsdXNoIGVhY2ggc3RyZWFtJ3MgQlNGIGNoYWluIG9uIHdyaXRlX3RyYWlsZXIuCisgICAgICAgIGlmICgocmV0ID0gYXZfYnNmX3NlbmRfcGFja2V0KGN0eCwgcGt0KSkgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gc2VuZCBwYWNrZXQgdG8gZmlsdGVyICVzIGZvciBzdHJlYW0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGN0eC0+ZmlsdGVyLT5uYW1lLCBwa3QtPnN0cmVhbV9pbmRleCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHdoZW4gYW55IGF1dG9tYXRpY2FsbHktYWRkZWQgYml0c3RyZWFtIGZpbHRlciBpcyBnZW5lcmF0aW5nIG11bHRpcGxlCisgICAgICAgIC8vIG91dHB1dCBwYWNrZXRzIGZvciBhIHNpbmdsZSBpbnB1dCBvbmUsIHdlJ2xsIG5lZWQgdG8gY2FsbCB0aGlzIGluIGEgbG9vcAorICAgICAgICAvLyBhbmQgd3JpdGUgZWFjaCBvdXRwdXQgcGFja2V0LgorICAgICAgICBpZiAoKHJldCA9IGF2X2JzZl9yZWNlaXZlX3BhY2tldChjdHgsIHBrdCkpIDwgMCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikgfHwgcmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHNlbmQgcGFja2V0IHRvIGZpbHRlciAlcyBmb3Igc3RyZWFtICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBjdHgtPmZpbHRlci0+bmFtZSwgcGt0LT5zdHJlYW1faW5kZXgpOworICAgICAgICAgICAgaWYgKHMtPmVycm9yX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKIGludCBhdl93cml0ZV9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgaW50IHJldDsKQEAgLTc4NSw4ICs4ODYsNyBAQAogICAgIGlmICghcGt0KSB7CiAgICAgICAgIGlmIChzLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX0FMTE9XX0ZMVVNIKSB7CiAgICAgICAgICAgICByZXQgPSBzLT5vZm9ybWF0LT53cml0ZV9wYWNrZXQocywgTlVMTCk7Ci0gICAgICAgICAgICBpZiAocy0+Zmx1c2hfcGFja2V0cyAmJiBzLT5wYiAmJiBzLT5wYi0+ZXJyb3IgPj0gMCAmJiBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfRkxVU0hfUEFDS0VUUykKLSAgICAgICAgICAgICAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKyAgICAgICAgICAgIGZsdXNoX2lmX25lZWRlZChzKTsKICAgICAgICAgICAgIGlmIChyZXQgPj0gMCAmJiBzLT5wYiAmJiBzLT5wYi0+ZXJyb3IgPCAwKQogICAgICAgICAgICAgICAgIHJldCA9IHMtPnBiLT5lcnJvcjsKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC03OTQsNyArODk0LDExIEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotI2lmIEZGX0FQSV9DT01QVVRFX1BLVF9GSUVMRFMyCisgICAgcmV0ID0gZG9fcGFja2V0X2F1dG9fYnNmKHMsIHBrdCk7CisgICAgaWYgKHJldCA8PSAwKQorICAgICAgICByZXR1cm4gcmV0OworCisjaWYgRkZfQVBJX0NPTVBVVEVfUEtUX0ZJRUxEUzIgJiYgRkZfQVBJX0xBVkZfQVZDVFgKICAgICByZXQgPSBjb21wdXRlX211eGVyX3BrdF9maWVsZHMocywgcy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0sIHBrdCk7CiAKICAgICBpZiAocmV0IDwgMCAmJiAhKHMtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9USU1FU1RBTVBTKSkKQEAgLTg1Miw3ICs5NTYsNyBAQAogICAgICAgICAgICAgc3QtPmludGVybGVhdmVyX2NodW5rX3NpemUgICAgICA9IDA7CiAgICAgICAgICAgICB0aGlzX3BrdGwtPnBrdC5mbGFncyB8PSBDSFVOS19TVEFSVDsKICAgICAgICAgICAgIGlmIChtYXggJiYgc3QtPmludGVybGVhdmVyX2NodW5rX2R1cmF0aW9uID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBzeW5jb2Zmc2V0ID0gKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pKm1heC8yOworICAgICAgICAgICAgICAgIGludDY0X3Qgc3luY29mZnNldCA9IChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSptYXgvMjsKICAgICAgICAgICAgICAgICBpbnQ2NF90IHN5bmN0byA9IGF2X3Jlc2NhbGUocGt0LT5kdHMgKyBzeW5jb2Zmc2V0LCAxLCBtYXgpKm1heCAtIHN5bmNvZmZzZXQ7CiAKICAgICAgICAgICAgICAgICBzdC0+aW50ZXJsZWF2ZXJfY2h1bmtfZHVyYXRpb24gKz0gKHBrdC0+ZHRzIC0gc3luY3RvKS84IC0gbWF4OwpAQCAtODk3LDEyICsxMDAxLDEyIEBACiAgICAgQVZTdHJlYW0gKnN0MiA9IHMtPnN0cmVhbXNbbmV4dC0+c3RyZWFtX2luZGV4XTsKICAgICBpbnQgY29tcCAgICAgID0gYXZfY29tcGFyZV90cyhuZXh0LT5kdHMsIHN0Mi0+dGltZV9iYXNlLCBwa3QtPmR0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlKTsKLSAgICBpZiAocy0+YXVkaW9fcHJlbG9hZCAmJiAoKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pICE9IChzdDItPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykpKSB7Ci0gICAgICAgIGludDY0X3QgdHMgPSBhdl9yZXNjYWxlX3EocGt0IC0+ZHRzLCBzdCAtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpIC0gcy0+YXVkaW9fcHJlbG9hZCooc3QgLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pOwotICAgICAgICBpbnQ2NF90IHRzMj0gYXZfcmVzY2FsZV9xKG5leHQtPmR0cywgc3QyLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKSAtIHMtPmF1ZGlvX3ByZWxvYWQqKHN0Mi0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKTsKKyAgICBpZiAocy0+YXVkaW9fcHJlbG9hZCAmJiAoKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pICE9IChzdDItPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykpKSB7CisgICAgICAgIGludDY0X3QgdHMgPSBhdl9yZXNjYWxlX3EocGt0IC0+ZHRzLCBzdCAtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpIC0gcy0+YXVkaW9fcHJlbG9hZCooc3QgLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pOworICAgICAgICBpbnQ2NF90IHRzMj0gYXZfcmVzY2FsZV9xKG5leHQtPmR0cywgc3QyLT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKSAtIHMtPmF1ZGlvX3ByZWxvYWQqKHN0Mi0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKTsKICAgICAgICAgaWYgKHRzID09IHRzMikgewotICAgICAgICAgICAgdHM9ICggcGt0IC0+ZHRzKiBzdC0+dGltZV9iYXNlLm51bSpBVl9USU1FX0JBU0UgLSBzLT5hdWRpb19wcmVsb2FkKihpbnQ2NF90KShzdCAtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykqIHN0LT50aW1lX2Jhc2UuZGVuKSpzdDItPnRpbWVfYmFzZS5kZW4KLSAgICAgICAgICAgICAgIC0oIG5leHQtPmR0cypzdDItPnRpbWVfYmFzZS5udW0qQVZfVElNRV9CQVNFIC0gcy0+YXVkaW9fcHJlbG9hZCooaW50NjRfdCkoc3QyLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pKnN0Mi0+dGltZV9iYXNlLmRlbikqIHN0LT50aW1lX2Jhc2UuZGVuOworICAgICAgICAgICAgdHM9ICggcGt0IC0+ZHRzKiBzdC0+dGltZV9iYXNlLm51bSpBVl9USU1FX0JBU0UgLSBzLT5hdWRpb19wcmVsb2FkKihpbnQ2NF90KShzdCAtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykqIHN0LT50aW1lX2Jhc2UuZGVuKSpzdDItPnRpbWVfYmFzZS5kZW4KKyAgICAgICAgICAgICAgIC0oIG5leHQtPmR0cypzdDItPnRpbWVfYmFzZS5udW0qQVZfVElNRV9CQVNFIC0gcy0+YXVkaW9fcHJlbG9hZCooaW50NjRfdCkoc3QyLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pKnN0Mi0+dGltZV9iYXNlLmRlbikqIHN0LT50aW1lX2Jhc2UuZGVuOwogICAgICAgICAgICAgdHMyPTA7CiAgICAgICAgIH0KICAgICAgICAgY29tcD0gKHRzPnRzMikgLSAodHM8dHMyKTsKQEAgLTkyMCw2ICsxMDI0LDcgQEAKICAgICBpbnQgc3RyZWFtX2NvdW50ID0gMDsKICAgICBpbnQgbm9uaW50ZXJsZWF2ZWRfY291bnQgPSAwOwogICAgIGludCBpLCByZXQ7CisgICAgaW50IGVvZiA9IGZsdXNoOwogCiAgICAgaWYgKHBrdCkgewogICAgICAgICBpZiAoKHJldCA9IGZmX2ludGVybGVhdmVfYWRkX3BhY2tldChzLCBwa3QsIGludGVybGVhdmVfY29tcGFyZV9kdHMpKSA8IDApCkBAIC05MjksOSArMTAzNCw5IEBACiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+bGFzdF9pbl9wYWNrZXRfYnVmZmVyKSB7CiAgICAgICAgICAgICArK3N0cmVhbV9jb3VudDsKLSAgICAgICAgfSBlbHNlIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVRUQUNITUVOVCAmJgotICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WUDggJiYKLSAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVlA5KSB7CisgICAgICAgIH0gZWxzZSBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FUVEFDSE1FTlQgJiYKKyAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVlA4ICYmCisgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1ZQOSkgewogICAgICAgICAgICAgKytub25pbnRlcmxlYXZlZF9jb3VudDsKICAgICAgICAgfQogICAgIH0KQEAgLTk3Miw2ICsxMDc3LDQ0IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXIgJiYKKyAgICAgICAgZW9mICYmCisgICAgICAgIChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfU0hPUlRFU1QpICYmCisgICAgICAgIHMtPmludGVybmFsLT5zaG9ydGVzdF9lbmQgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgQVZQYWNrZXQgKnRvcF9wa3QgPSAmcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXItPnBrdDsKKworICAgICAgICBzLT5pbnRlcm5hbC0+c2hvcnRlc3RfZW5kID0gYXZfcmVzY2FsZV9xKHRvcF9wa3QtPmR0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbdG9wX3BrdC0+c3RyZWFtX2luZGV4XS0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworICAgIH0KKworICAgIGlmIChzLT5pbnRlcm5hbC0+c2hvcnRlc3RfZW5kICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHdoaWxlIChzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcikgeworICAgICAgICAgICAgQVZQYWNrZXQgKnRvcF9wa3QgPSAmcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXItPnBrdDsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdDsKKyAgICAgICAgICAgIGludDY0X3QgdG9wX2R0cyA9IGF2X3Jlc2NhbGVfcSh0b3BfcGt0LT5kdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1t0b3BfcGt0LT5zdHJlYW1faW5kZXhdLT50aW1lX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworCisgICAgICAgICAgICBpZiAocy0+aW50ZXJuYWwtPnNob3J0ZXN0X2VuZCArIDEgPj0gdG9wX2R0cykKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgcGt0bCA9IHMtPmludGVybmFsLT5wYWNrZXRfYnVmZmVyOworICAgICAgICAgICAgc3QgICA9IHMtPnN0cmVhbXNbcGt0bC0+cGt0LnN0cmVhbV9pbmRleF07CisKKyAgICAgICAgICAgIHMtPmludGVybmFsLT5wYWNrZXRfYnVmZmVyID0gcGt0bC0+bmV4dDsKKyAgICAgICAgICAgIGlmICghcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXIpCisgICAgICAgICAgICAgICAgcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXJfZW5kID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKHN0LT5sYXN0X2luX3BhY2tldF9idWZmZXIgPT0gcGt0bCkKKyAgICAgICAgICAgICAgICBzdC0+bGFzdF9pbl9wYWNrZXRfYnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3RsLT5wa3QpOworICAgICAgICAgICAgYXZfZnJlZXAoJnBrdGwpOworICAgICAgICAgICAgZmx1c2ggPSAwOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKHN0cmVhbV9jb3VudCAmJiBmbHVzaCkgewogICAgICAgICBBVlN0cmVhbSAqc3Q7CiAgICAgICAgIHBrdGwgPSBzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcjsKQEAgLTk5Myw2ICsxMTM2LDMyIEBACiAgICAgfQogfQogCitpbnQgZmZfaW50ZXJsZWF2ZWRfcGVlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0LCBpbnQgYWRkX29mZnNldCkKK3sKKyAgICBBVlBhY2tldExpc3QgKnBrdGwgPSBzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcjsKKyAgICB3aGlsZSAocGt0bCkgeworICAgICAgICBpZiAocGt0bC0+cGt0LnN0cmVhbV9pbmRleCA9PSBzdHJlYW0pIHsKKyAgICAgICAgICAgICpwa3QgPSBwa3RsLT5wa3Q7CisgICAgICAgICAgICBpZiAoYWRkX29mZnNldCkgeworICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0ID0gc3QtPm11eF90c19vZmZzZXQ7CisKKyAgICAgICAgICAgICAgICBpZiAocy0+b3V0cHV0X3RzX29mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGF2X3Jlc2NhbGVfcShzLT5vdXRwdXRfdHNfb2Zmc2V0LCBBVl9USU1FX0JBU0VfUSwgc3QtPnRpbWVfYmFzZSk7CisKKyAgICAgICAgICAgICAgICBpZiAocGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgIHBrdC0+ZHRzICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgIHBrdC0+cHRzICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHBrdGwgPSBwa3RsLT5uZXh0OworICAgIH0KKyAgICByZXR1cm4gQVZFUlJPUihFTk9FTlQpOworfQorCiAvKioKICAqIEludGVybGVhdmUgYW4gQVZQYWNrZXQgY29ycmVjdGx5IHNvIGl0IGNhbiBiZSBtdXhlZC4KICAqIEBwYXJhbSBvdXQgdGhlIGludGVybGVhdmVkIHBhY2tldCB3aWxsIGJlIG91dHB1dCBoZXJlCkBAIC0xMDI0LDExICsxMTkzLDE3IEBACiAgICAgaWYgKHBrdCkgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKIAorICAgICAgICByZXQgPSBkb19wYWNrZXRfYXV0b19ic2YocywgcGt0KTsKKyAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGVsc2UgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKICAgICAgICAgaWYgKHMtPmRlYnVnICYgRkZfRkRFQlVHX1RTKQogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgImF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lIHNpemU6JWQgZHRzOiVzIHB0czolc1xuIiwKICAgICAgICAgICAgICAgICBwa3QtPnNpemUsIGF2X3RzMnN0cihwa3QtPmR0cyksIGF2X3RzMnN0cihwa3QtPnB0cykpOwogCi0jaWYgRkZfQVBJX0NPTVBVVEVfUEtUX0ZJRUxEUzIKKyNpZiBGRl9BUElfQ09NUFVURV9QS1RfRklFTERTMiAmJiBGRl9BUElfTEFWRl9BVkNUWAogICAgICAgICBpZiAoKHJldCA9IGNvbXB1dGVfbXV4ZXJfcGt0X2ZpZWxkcyhzLCBzdCwgcGt0KSkgPCAwICYmICEocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT1RJTUVTVEFNUFMpKQogICAgICAgICAgICAgZ290byBmYWlsOwogI2VuZGlmCkBAIC0xMDM3LDE3ICsxMjEyLDYgQEAKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQotCi0gICAgICAgIGlmIChzLT5vZm9ybWF0LT5jaGVja19iaXRzdHJlYW0pIHsKLSAgICAgICAgICAgIGlmICghc3QtPmludGVybmFsLT5iaXRzdHJlYW1fY2hlY2tlZCkgewotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcy0+b2Zvcm1hdC0+Y2hlY2tfYml0c3RyZWFtKHMsIHBrdCkpIDwgMCkKLSAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJldCA9PSAxKQotICAgICAgICAgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPmJpdHN0cmVhbV9jaGVja2VkID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGF2X2FwcGx5X2JpdHN0cmVhbV9maWx0ZXJzKHN0LT5jb2RlYywgcGt0LCBzdC0+aW50ZXJuYWwtPmJzZmMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJhdl9pbnRlcmxlYXZlZF93cml0ZV9mcmFtZSBGTFVTSFxuIik7CiAgICAgICAgIGZsdXNoID0gMTsKQEAgLTExMDQsMjggKzEyNjgsMjMgQEAKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBpZiAoIXMtPmludGVybmFsLT5oZWFkZXJfd3JpdHRlbiAmJiBzLT5vZm9ybWF0LT53cml0ZV9oZWFkZXIpIHsKLSAgICAgICAgcmV0ID0gcy0+b2Zvcm1hdC0+d3JpdGVfaGVhZGVyKHMpOwotICAgICAgICBpZiAocmV0ID49IDAgJiYgcy0+cGIgJiYgcy0+cGItPmVycm9yIDwgMCkKLSAgICAgICAgICAgIHJldCA9IHMtPnBiLT5lcnJvcjsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGlmIChzLT5mbHVzaF9wYWNrZXRzICYmIHMtPnBiICYmIHMtPnBiLT5lcnJvciA+PSAwICYmIHMtPmZsYWdzICYgQVZGTVRfRkxBR19GTFVTSF9QQUNLRVRTKQotICAgICAgICAgICAgYXZpb19mbHVzaChzLT5wYik7Ci0gICAgICAgIHMtPmludGVybmFsLT5oZWFkZXJfd3JpdHRlbiA9IDE7Ci0gICAgfQotCiBmYWlsOgotICAgIGlmICgocy0+aW50ZXJuYWwtPmhlYWRlcl93cml0dGVuIHx8ICFzLT5vZm9ybWF0LT53cml0ZV9oZWFkZXIpICYmIHMtPm9mb3JtYXQtPndyaXRlX3RyYWlsZXIpCisgICAgaWYgKHMtPm9mb3JtYXQtPndyaXRlX3RyYWlsZXIpIHsKKyAgICAgICAgaWYgKCEocy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpICYmIHMtPnBiKQorICAgICAgICAgICAgYXZpb193cml0ZV9tYXJrZXIocy0+cGIsIEFWX05PUFRTX1ZBTFVFLCBBVklPX0RBVEFfTUFSS0VSX1RSQUlMRVIpOwogICAgICAgICBpZiAocmV0ID49IDApIHsKICAgICAgICAgcmV0ID0gcy0+b2Zvcm1hdC0+d3JpdGVfdHJhaWxlcihzKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHMtPm9mb3JtYXQtPndyaXRlX3RyYWlsZXIocyk7CiAgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAocy0+b2Zvcm1hdC0+ZGVpbml0KQogICAgICAgICBzLT5vZm9ybWF0LT5kZWluaXQocyk7CiAKKyAgICBzLT5pbnRlcm5hbC0+aW5pdGlhbGl6ZWQgPQorICAgIHMtPmludGVybmFsLT5zdHJlYW1zX2luaXRpYWxpemVkID0gMDsKKwogICAgIGlmIChzLT5wYikKICAgICAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKICAgICBpZiAocmV0ID09IDApCkBAIC0xMTk2LDcgKzEzNTUsNyBAQAogICAgICAgICBwa3Quc2l6ZSAgICAgICAgID0gVU5DT0RFRF9GUkFNRV9QQUNLRVRfU0laRTsKICAgICAgICAgcGt0LnB0cyAgICAgICAgICA9CiAgICAgICAgIHBrdC5kdHMgICAgICAgICAgPSBmcmFtZS0+cHRzOwotICAgICAgICBwa3QuZHVyYXRpb24gICAgID0gYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbihmcmFtZSk7CisgICAgICAgIHBrdC5kdXJhdGlvbiAgICAgPSBmcmFtZS0+cGt0X2R1cmF0aW9uOwogICAgICAgICBwa3Quc3RyZWFtX2luZGV4ID0gc3RyZWFtX2luZGV4OwogICAgICAgICBwa3QuZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfVU5DT0RFRF9GUkFNRTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9tdmRlYy5jIGIvbGliYXZmb3JtYXQvbXZkZWMuYwppbmRleCA3YWE2NDUyLi5mYTU5NjE3IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tdmRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L212ZGVjLmMKQEAgLTEwNiw5ICsxMDYsOSBAQAogICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIkNoYW5uZWwgY291bnQgJWQgaW52YWxpZC5cbiIsIGNoYW5uZWxzKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSBjaGFubmVsczsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPT0gMSkgPyBBVl9DSF9MQVlPVVRfTU9OTwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IGNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9PSAxKSA/IEFWX0NIX0xBWU9VVF9NT05PCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVZfQ0hfTEFZT1VUX1NURVJFTzsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTU2LDEwICsxNTYsMTAgQEAKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIk5VTV9DSEFOTkVMUyIpKSB7CiAgICAgICAgIHJldHVybiBzZXRfY2hhbm5lbHMoYXZjdHgsIHN0LCB2YXJfcmVhZF9pbnQocGIsIHNpemUpKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlNBTVBMRV9SQVRFIikpIHsKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHZhcl9yZWFkX2ludChwYiwgc2l6ZSk7Ci0gICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHZhcl9yZWFkX2ludChwYiwgc2l6ZSk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMzLCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobmFtZSwgIlNBTVBMRV9XSURUSCIpKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gdmFyX3JlYWRfaW50KHBiLCBzaXplKSAqIDg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gdmFyX3JlYWRfaW50KHBiLCBzaXplKSAqIDg7CiAgICAgfSBlbHNlCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCkBAIC0xODEsMTYgKzE4MSwxNiBAQAogICAgICAgICBpZiAoIXN0cikKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBpZiAoIXN0cmNtcChzdHIsICIxIikpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NVkMxOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01WQzE7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICIyIikpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCAgPSBBVl9QSVhfRk1UX0FCR1I7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfQUJHUjsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIjMiKSkgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NHSVJMRTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TR0lSTEU7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICIxMCIpKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTUpQRUc7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTUpQRUc7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJNVkMyIikpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NVkMyOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01WQzI7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsICJWaWRlbyBjb21wcmVzc2lvbiAlcyIsIHN0cik7CiAgICAgICAgIH0KQEAgLTIwMCwxOCArMjAwLDE4IEBACiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBmcHMuZGVuLCBmcHMubnVtKTsKICAgICAgICAgc3QtPmF2Z19mcmFtZV9yYXRlID0gZnBzOwogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiSEVJR0hUIikpIHsKLSAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSB2YXJfcmVhZF9pbnQocGIsIHNpemUpOworICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IHZhcl9yZWFkX2ludChwYiwgc2l6ZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJQSVhFTF9BU1BFQ1QiKSkgewogICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHZhcl9yZWFkX2Zsb2F0KHBiLCBzaXplKTsKICAgICAgICAgYXZfcmVkdWNlKCZzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICZzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCiAgICAgICAgICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0sIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiwKICAgICAgICAgICAgICAgICAgIElOVF9NQVgpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiV0lEVEgiKSkgewotICAgICAgICBzdC0+Y29kZWMtPndpZHRoID0gdmFyX3JlYWRfaW50KHBiLCBzaXplKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IHZhcl9yZWFkX2ludChwYiwgc2l6ZSk7CiAgICAgfSBlbHNlIGlmICghc3RyY21wKG5hbWUsICJPUklFTlRBVElPTiIpKSB7CiAgICAgICAgIGlmICh2YXJfcmVhZF9pbnQocGIsIHNpemUpID09IDExMDEpIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgPSBhdl9zdHJkdXAoIkJvdHRvbVVwIik7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gOTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICAgICAgPSBhdl9zdHJkdXAoIkJvdHRvbVVwIik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gOTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiUV9TUEFUSUFMIikgfHwgIXN0cmNtcChuYW1lLCAiUV9URU1QT1JBTCIpKSB7CiAgICAgICAgIHZhcl9yZWFkX21ldGFkYXRhKGF2Y3R4LCBuYW1lLCBzaXplKTsKQEAgLTIyNyw3ICsyMjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCpwYXJzZSkoQVZGb3JtYXRDb250ZXh0ICphdmN0eCwgQVZTdHJlYW0gKnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgaW50IHNpemUpKQogewotICAgIGludCBjb3VudCwgaTsKKyAgICB1bnNpZ25lZCBjb3VudDsKKyAgICBpbnQgaTsKKwogICAgIEFWSU9Db250ZXh0ICpwYiA9IGF2Y3R4LT5wYjsKICAgICBhdmlvX3NraXAocGIsIDQpOwogICAgIGNvdW50ID0gYXZpb19yYjMyKHBiKTsKQEAgLTIzNSw2ICsyMzcsMTAgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICBjaGFyIG5hbWVbMTddOwogICAgICAgICBpbnQgc2l6ZTsKKworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKwogICAgICAgICBhdmlvX3JlYWQocGIsIG5hbWUsIDE2KTsKICAgICAgICAgbmFtZVtzaXplb2YobmFtZSkgLSAxXSA9IDA7CiAgICAgICAgIHNpemUgPSBhdmlvX3JiMzIocGIpOwpAQCAtMjU5LDggKzI2NSw4IEBACiAgICAgICAgIHVpbnQzMl90IHNpemUgPSBhdmlvX3JiMzIocGIpOwogICAgICAgICBhdmlvX3NraXAocGIsIDgpOwogICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIHBvcywgdGltZXN0YW1wLCBzaXplLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgIHRpbWVzdGFtcCArPSBzaXplIC8gKHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiAyKTsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCArPSBzaXplIC8gKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiAyKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRpbWVzdGFtcCsrOwogICAgICAgICB9CkBAIC0yOTMsMzcgKzI5OSw0MSBAQAogICAgICAgICBpZiAoIXZzdCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgMSwgMTUpOwotICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwogICAgICAgICB2c3QtPmF2Z19mcmFtZV9yYXRlICAgID0gYXZfaW52X3EodnN0LT50aW1lX2Jhc2UpOwogICAgICAgICB2c3QtPm5iX2ZyYW1lcyAgICAgICAgID0gYXZpb19yYjMyKHBiKTsKICAgICAgICAgdiA9IGF2aW9fcmIzMihwYik7CiAgICAgICAgIHN3aXRjaCAodikgewogICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01WQzE7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01WQzE7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgdnN0LT5jb2RlYy0+cGl4X2ZtdCAgPSBBVl9QSVhfRk1UX0FSR0I7Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9BUkdCOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKGF2Y3R4LCAiVmlkZW8gY29tcHJlc3Npb24gJWkiLCB2KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7Ci0gICAgICAgIHZzdC0+Y29kZWMtPndpZHRoICAgICA9IGF2aW9fcmIzMihwYik7Ci0gICAgICAgIHZzdC0+Y29kZWMtPmhlaWdodCAgICA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDA7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICAgICA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPmhlaWdodCAgICA9IGF2aW9fcmIzMihwYik7CiAgICAgICAgIGF2aW9fc2tpcChwYiwgMTIpOwogCi0gICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKICAgICAgICAgYXN0LT5uYl9mcmFtZXMgICAgICAgICAgPSB2c3QtPm5iX2ZyYW1lczsKLSAgICAgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocGIpOwotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzMsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBpZiAoYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPD0gMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlICVkXG4iLCBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzMsIDEsIGFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKICAgICAgICAgaWYgKHNldF9jaGFubmVscyhhdmN0eCwgYXN0LCBhdmlvX3JiMzIocGIpKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgICAgICB2ID0gYXZpb19yYjMyKHBiKTsKICAgICAgICAgaWYgKHYgPT0gQVVESU9fRk9STUFUX1NJR05FRCkgewotICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7CisgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShhdmN0eCwgIkF1ZGlvIGNvbXByZXNzaW9uIChmb3JtYXQgJWkpIiwgdik7CiAgICAgICAgIH0KQEAgLTMzOCwxMCArMzQ4LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCBwb3MgICA9IGF2aW9fcmIzMihwYik7CiAgICAgICAgICAgICB1aW50MzJfdCBhc2l6ZSA9IGF2aW9fcmIzMihwYik7CiAgICAgICAgICAgICB1aW50MzJfdCB2c2l6ZSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7CiAgICAgICAgICAgICBhdl9hZGRfaW5kZXhfZW50cnkoYXN0LCBwb3MsIHRpbWVzdGFtcCwgYXNpemUsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOwogICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHZzdCwgcG9zICsgYXNpemUsIGksIHZzaXplLCAwLCBBVklOREVYX0tFWUZSQU1FKTsKLSAgICAgICAgICAgIHRpbWVzdGFtcCArPSBhc2l6ZSAvIChhc3QtPmNvZGVjLT5jaGFubmVscyAqIDIpOworICAgICAgICAgICAgdGltZXN0YW1wICs9IGFzaXplIC8gKGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogMik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCF2ZXJzaW9uICYmIGF2aW9fcmIxNihwYikgPT0gMykgewogICAgICAgICBhdmlvX3NraXAocGIsIDQpOwpAQCAtMzU2LDIxICszNjgsMjEgQEAKICAgICAgICAgICAgIGFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOwogICAgICAgICAgICAgaWYgKCFhc3QpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgICAgICAgICAgaWYgKChyZWFkX3RhYmxlKGF2Y3R4LCBhc3QsIHBhcnNlX2F1ZGlvX3ZhcikpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgaWYgKG12LT5hY29tcHJlc3Npb24gPT0gMTAwICYmCiAgICAgICAgICAgICAgICAgbXYtPmFmb3JtYXQgPT0gQVVESU9fRk9STUFUX1NJR05FRCAmJgotICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikgewotICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikgeworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkJFOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBdWRpbyBjb21wcmVzc2lvbiAlaSAoZm9ybWF0ICVpLCBzciAlaSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi0+YWNvbXByZXNzaW9uLCBtdi0+YWZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKLSAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFzdC0+Y29kZWMtPmNoYW5uZWxzIDw9IDApIHsKKyAgICAgICAgICAgIGlmIChhc3QtPmNvZGVjcGFyLT5jaGFubmVscyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJObyB2YWxpZCBjaGFubmVsIGNvdW50IGZvdW5kLlxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9CkBAIC0zODMsNyArMzk1LDcgQEAKICAgICAgICAgICAgIHZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0oYXZjdHgsIE5VTEwpOwogICAgICAgICAgICAgaWYgKCF2c3QpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwogICAgICAgICAgICAgaWYgKChyZXQgPSByZWFkX3RhYmxlKGF2Y3R4LCB2c3QsIHBhcnNlX3ZpZGVvX3ZhcikpPDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQpAQCAtNDE3LDcgKzQyOSw3IEBACiAgICAgICAgIGlmIChpbmRleC0+cG9zID4gcG9zKQogICAgICAgICAgICAgYXZpb19za2lwKHBiLCBpbmRleC0+cG9zIC0gcG9zKTsKICAgICAgICAgZWxzZSBpZiAoaW5kZXgtPnBvcyA8IHBvcykgewotICAgICAgICAgICAgaWYgKCFwYi0+c2Vla2FibGUpCisgICAgICAgICAgICBpZiAoIShwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKICAgICAgICAgICAgIHJldCA9IGF2aW9fc2VlayhwYiwgaW5kZXgtPnBvcywgU0VFS19TRVQpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCkBAIC00NTksNyArNDcxLDcgQEAKICAgICBpZiAoKGZsYWdzICYgQVZTRUVLX0ZMQUdfRlJBTUUpIHx8IChmbGFncyAmIEFWU0VFS19GTEFHX0JZVEUpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwogCi0gICAgaWYgKCFhdmN0eC0+cGItPnNlZWthYmxlKQorICAgIGlmICghKGF2Y3R4LT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAKICAgICBmcmFtZSA9IGF2X2luZGV4X3NlYXJjaF90aW1lc3RhbXAoc3QsIHRpbWVzdGFtcCwgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbXZpLmMgYi9saWJhdmZvcm1hdC9tdmkuYwppbmRleCBhN2NmY2I5Li45ZjkwZmFmIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9tdmkuYworKysgYi9saWJhdmZvcm1hdC9tdmkuYwpAQCAtNTQsMTggKzU0LDE4IEBACiAgICAgaWYgKCF2c3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHZzdC0+Y29kZWMsIDIpKQorICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEodnN0LT5jb2RlY3BhciwgMikpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICB2ZXJzaW9uICAgICAgICAgICAgICAgICAgPSBhdmlvX3I4KHBiKTsKLSAgICB2c3QtPmNvZGVjLT5leHRyYWRhdGFbMF0gPSBhdmlvX3I4KHBiKTsKLSAgICB2c3QtPmNvZGVjLT5leHRyYWRhdGFbMV0gPSBhdmlvX3I4KHBiKTsKKyAgICB2c3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMF0gPSBhdmlvX3I4KHBiKTsKKyAgICB2c3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMV0gPSBhdmlvX3I4KHBiKTsKICAgICBmcmFtZXNfY291bnQgICAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOwogICAgIG1zZWNzX3Blcl9mcmFtZSAgICAgICAgICA9IGF2aW9fcmwzMihwYik7Ci0gICAgdnN0LT5jb2RlYy0+d2lkdGggICAgICAgID0gYXZpb19ybDE2KHBiKTsKLSAgICB2c3QtPmNvZGVjLT5oZWlnaHQgICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICAgICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICAgID0gYXZpb19ybDE2KHBiKTsKICAgICBhdmlvX3I4KHBiKTsKLSAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgPSBhdmlvX3JsMTYocGIpOworICAgIGFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICA9IGF2aW9fcmwxNihwYik7CiAgICAgbXZpLT5hdWRpb19kYXRhX3NpemUgICAgID0gYXZpb19ybDMyKHBiKTsKICAgICBhdmlvX3I4KHBiKTsKICAgICBwbGF5ZXJfdmVyc2lvbiAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOwpAQCAtODAsMjAgKzgwLDIwIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOwotICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7Ci0gICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgID0gMTsKLSAgICBhc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgPSBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OwotICAgIGFzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICA9IGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICogODsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgNjQsIDEsIGFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKKyAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgICA9IDE7CisgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICBhc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICAgICAgPSBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAqIDg7CiAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgNjQsIG1zZWNzX3Blcl9mcmFtZSwgMTAwMDAwMCk7CiAgICAgdnN0LT5hdmdfZnJhbWVfcmF0ZSAgICA9IGF2X2ludl9xKHZzdC0+dGltZV9iYXNlKTsKLSAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NT1RJT05QSVhFTFM7CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTU9USU9OUElYRUxTOwogCi0gICAgbXZpLT5nZXRfaW50ID0gKHZzdC0+Y29kZWMtPndpZHRoICogdnN0LT5jb2RlYy0+aGVpZ2h0IDwgKDEgPDwgMTYpKSA/IGF2aW9fcmwxNiA6IGF2aW9fcmwyNDsKKyAgICBtdmktPmdldF9pbnQgPSAodnN0LT5jb2RlY3Bhci0+d2lkdGggKiB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgPCAoMSA8PCAxNikpID8gYXZpb19ybDE2IDogYXZpb19ybDI0OwogCiAgICAgbXZpLT5hdWRpb19mcmFtZV9zaXplICAgPSAoKHVpbnQ2NF90KW12aS0+YXVkaW9fZGF0YV9zaXplIDw8IE1WSV9GUkFDX0JJVFMpIC8gZnJhbWVzX2NvdW50OwogICAgIGlmIChtdmktPmF1ZGlvX2ZyYW1lX3NpemUgPD0gMSA8PCBNVklfRlJBQ19CSVRTIC0gMSkgewpAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIG12aS0+YXVkaW9fc2l6ZV9jb3VudGVyID0gKGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICogODMwIC8gbXZpLT5hdWRpb19mcmFtZV9zaXplIC0gMSkgKiBtdmktPmF1ZGlvX2ZyYW1lX3NpemU7CisgICAgbXZpLT5hdWRpb19zaXplX2NvdW50ZXIgPSAoYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKiA4MzAgLyBtdmktPmF1ZGlvX2ZyYW1lX3NpemUgLSAxKSAqIG12aS0+YXVkaW9fZnJhbWVfc2l6ZTsKICAgICBtdmktPmF1ZGlvX3NpemVfbGVmdCAgICA9IG12aS0+YXVkaW9fZGF0YV9zaXplOwogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9teGYuYyBiL2xpYmF2Zm9ybWF0L214Zi5jCmluZGV4IDRkNzdhZGEuLmE5MDk0MDEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L214Zi5jCisrKyBiL2xpYmF2Zm9ybWF0L214Zi5jCkBAIC00MSw3ICs0MSw3IEBACiAgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwNCwweDAyLDB4MDAgfSwgMTQsIEFWX0NPREVDX0lEX01QRUcyVklERU8gfSwgLyogNDIyUEBITCBJLUZyYW1lICovCiAgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgyMCwweDAyLDB4MDMgfSwgMTQsICAgICAgQVZfQ09ERUNfSURfTVBFRzQgfSwgLyogWERDQU0gcHJveHlfcGFsMDMwOTI2Lm14ZiAqLwogICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAyLDB4MDEsMHgwMiwweDAwIH0sIDEzLCAgICBBVl9DT0RFQ19JRF9EVlZJREVPIH0sIC8qIERWMjUgSUVDIFBBTCAqLwotICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDcsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAzLDB4MDEsMHgwMSwweDAwIH0sIDE0LCAgIEFWX0NPREVDX0lEX0pQRUcyMDAwIH0sIC8qIEpQRUcyMDAwIENvZGVzdHJlYW0gKi8KKyAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDA3LDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMywweDAxLDB4MDEsMHgwMCB9LCAxNCwgICBBVl9DT0RFQ19JRF9KUEVHMjAwMCB9LCAvKiBKUEVHIDIwMDAgY29kZSBzdHJlYW0gKi8KICAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwNCwweDAxLDB4MDAsMHgwMCB9LCAxNCwgICAgICAgIEFWX0NPREVDX0lEX1ZDMSB9LCAvKiBWQzEgU1BATEwgKi8KICAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwNCwweDAyLDB4MDAsMHgwMCB9LCAxNCwgICAgICAgIEFWX0NPREVDX0lEX1ZDMSB9LCAvKiBWQzEgU1BATUwgKi8KICAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwNCwweDAzLDB4MDAsMHgwMCB9LCAxNCwgICAgICAgIEFWX0NPREVDX0lEX1ZDMSB9LCAvKiBWQzEgTVBATEwgKi8KQEAgLTUyLDggKzUyLDggQEAKICAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwNCwweDA4LDB4MDAsMHgwMCB9LCAxNCwgICAgICAgIEFWX0NPREVDX0lEX1ZDMSB9LCAvKiBWQzEgQVBATDIgKi8KICAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwNCwweDA5LDB4MDAsMHgwMCB9LCAxNCwgICAgICAgIEFWX0NPREVDX0lEX1ZDMSB9LCAvKiBWQzEgQVBATDMgKi8KICAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwNCwweDBBLDB4MDAsMHgwMCB9LCAxNCwgICAgICAgIEFWX0NPREVDX0lEX1ZDMSB9LCAvKiBWQzEgQVBATDQgKi8KLSAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDEsMHg3RiwweDAwLDB4MDAsMHgwMCB9LCAxMywgICBBVl9DT0RFQ19JRF9SQVdWSURFTyB9LCAvKiBVbmNvbXByZXNzZWQgKi8KLSAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyLDB4MDEsMHgwMCB9LCAxNSwgICBBVl9DT0RFQ19JRF9SQVdWSURFTyB9LCAvKiBVbmNvbXByZXNzZWQgNDIyIDgtYml0ICovCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAxLDB4N0YsMHgwMCwweDAwLDB4MDAgfSwgMTMsICAgQVZfQ09ERUNfSURfUkFXVklERU8gfSwgLyogdW5jb21wcmVzc2VkICovCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwQSwweDA0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwMiwweDAxLDB4MDAgfSwgMTUsICAgQVZfQ09ERUNfSURfUkFXVklERU8gfSwgLyogdW5jb21wcmVzc2VkIDQyMiA4LWJpdCAqLwogICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDcxLDB4MDAsMHgwMCwweDAwIH0sIDEzLCAgICAgIEFWX0NPREVDX0lEX0ROWEhEIH0sIC8qIFNNUFRFIFZDLTMvRE54SEQgKi8KICAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMywweDAyLDB4MDAsMHgwMCB9LCAxNCwgICAgICBBVl9DT0RFQ19JRF9ETlhIRCB9LCAvKiBTTVBURSBWQy0zL0ROeEhEICovCiAgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBFLDB4MDQsMHgwMiwweDAxLDB4MDIsMHgwNCwweDAxLDB4MDAgfSwgMTYsICAgICAgQVZfQ09ERUNfSURfRE5YSEQgfSwgLyogU01QVEUgVkMtMy9ETnhIRCBMZWdhY3kgQXZpZCBNZWRpYSBDb21wb3NlciBNWEYgKi8KQEAgLTYxLDkgKzYxLDEwIEBACiAgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwQSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgzMSwweDExLDB4MDEgfSwgMTQsICAgICAgIEFWX0NPREVDX0lEX0gyNjQgfSwgLyogSC4yNjQvTVBFRy00IEFWQyBTUFMvUFBTIGluLWJhbmQgKi8KICAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBBLDB4MDQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMSB9LCAxNiwgICAgICAgQVZfQ09ERUNfSURfVjIxMCB9LCAvKiBWMjEwICovCiAgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBFLDB4MDQsMHgwMiwweDAxLDB4MDIsMHgxMSwweDAwLDB4MDAgfSwgMTQsICAgICBBVl9DT0RFQ19JRF9QUk9SRVMgfSwgLyogQXZpZCBNQzcgUHJvUmVzICovCisgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwRCwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDMsMHgwNiwweDAwLDB4MDAgfSwgMTQsICAgICBBVl9DT0RFQ19JRF9QUk9SRVMgfSwgLyogQXBwbGUgUHJvUmVzICovCiAgICAgLyogU291bmRFc3NlbmNlQ29tcHJlc3Npb24gKi8KLSAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAzLDB4MDQsMHgwMiwweDAyLDB4MDIsMHgwMywweDAzLDB4MDEsMHgwMCB9LCAxNCwgICAgICAgIEFWX0NPREVDX0lEX0FBQyB9LCAvKiBNUEVHMiBBQUMgQURUUyAobGVnYWN5KSAqLwotICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAyLDB4MDIsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwIH0sIDEzLCAgQVZfQ09ERUNfSURfUENNX1MxNkxFIH0sIC8qIFVuY29tcHJlc3NlZCAqLworICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAyLDB4MDIsMHgwMiwweDAzLDB4MDMsMHgwMSwweDAwIH0sIDE0LCAgICAgICAgQVZfQ09ERUNfSURfQUFDIH0sIC8qIE1QRUctMiBBQUMgQURUUyAobGVnYWN5KSAqLworICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAyLDB4MDIsMHgwMSwweDAwLDB4MDAsMHgwMCwweDAwIH0sIDEzLCAgQVZfQ09ERUNfSURfUENNX1MxNkxFIH0sIC8qIHVuY29tcHJlc3NlZCAqLwogICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAyLDB4MDIsMHgwMSwweDdGLDB4MDAsMHgwMCwweDAwIH0sIDEzLCAgQVZfQ09ERUNfSURfUENNX1MxNkxFIH0sCiAgICAgeyB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwNywweDA0LDB4MDIsMHgwMiwweDAxLDB4N0UsMHgwMCwweDAwLDB4MDAgfSwgMTMsICBBVl9DT0RFQ19JRF9QQ01fUzE2QkUgfSwgLyogRnJvbSBPbW5lb24gTVhGIGZpbGUgKi8KICAgICB7IHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDA0LDB4MDQsMHgwMiwweDAyLDB4MDIsMHgwMywweDAxLDB4MDEsMHgwMCB9LCAxNSwgICBBVl9DT0RFQ19JRF9QQ01fQUxBVyB9LCAvKiBYRENBTSBQcm94eSBDMDAyM1MwMS5teGYgKi8KQEAgLTEzNiw2ICsxMzcsNyBAQAogICAgIHsgeyAxMDAxLCA2MDAwMCB9LCB7IDgwMSwgIDgwMSwgIDgwMSwgIDgwMSwgIDgwMCwgIDAgfSB9LCAvLyBOVFNDIDU5Ljk0CiAgICAgeyB7IDEsIDI1IH0sICAgICAgIHsgMTkyMCwgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCB9IH0sIC8vIFBBTCAyNQogICAgIHsgeyAxLCA1MCB9LCAgICAgICB7IDk2MCwgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAgfSB9LCAvLyBQQUwgNTAKKyAgICB7IHsgMSwgNjAgfSwgICAgICAgeyA4MDAsICAwLCAgICAwLCAgICAwLCAgICAwLCAgICAwIH0gfSwKIH07CiAKIHN0YXRpYyBjb25zdCBBVlJhdGlvbmFsIG14Zl90aW1lX2Jhc2VbXSA9IHsKQEAgLTE0NSw2ICsxNDcsNyBAQAogICAgIHsgMTAwMSwgNjAwMDAgfSwKICAgICB7IDEsIDI1IH0sCiAgICAgeyAxLCA1MCB9LAorICAgIHsgMSwgNjAgfSwKICAgICB7IDAsIDB9CiB9OwogCkBAIC0xNTQsNyArMTU3LDcgQEAKICAgICBpbnQgaWR4ID0gYXZfZmluZF9uZWFyZXN0X3FfaWR4KHRpbWVfYmFzZSwgbXhmX3RpbWVfYmFzZSk7CiAgICAgQVZSYXRpb25hbCBkaWZmID0gYXZfc3ViX3EodGltZV9iYXNlLCBteGZfdGltZV9iYXNlW2lkeF0pOwogCi0gICAgZGlmZi5udW0gPSBhYnMoZGlmZi5udW0pOworICAgIGRpZmYubnVtID0gRkZBQlMoZGlmZi5udW0pOwogCiAgICAgaWYgKGF2X2NtcF9xKGRpZmYsIChBVlJhdGlvbmFsKXsxLCAxMDAwfSkgPj0gMCkKICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9teGYuaCBiL2xpYmF2Zm9ybWF0L214Zi5oCmluZGV4IGYzZGIxZjkuLmZmY2M0MjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L214Zi5oCisrKyBiL2xpYmF2Zm9ybWF0L214Zi5oCkBAIC00NSw5ICs0NSw5IEBACiAgICAgU3ViRGVzY3JpcHRvciwKICAgICBJbmRleFRhYmxlU2VnbWVudCwKICAgICBFc3NlbmNlQ29udGFpbmVyRGF0YSwKLSAgICBUeXBlQm90dG9tLC8vIGFkZCBtZXRhZGF0YSB0eXBlIGJlZm9yZSB0aGlzCiAgICAgRXNzZW5jZUdyb3VwLAogICAgIFRhZ2dlZFZhbHVlLAorICAgIFRhcGVEZXNjcmlwdG9yLAogfTsKIAogZW51bSBNWEZGcmFtZUxheW91dCB7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9teGZkZWMuYyBiL2xpYmF2Zm9ybWF0L214ZmRlYy5jCmluZGV4IGY0MjIyZmMuLmM3OGUyNzIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L214ZmRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L214ZmRlYy5jCkBAIC01MCw2ICs1MCw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgpAQCAtOTAsNiArOTEsNyBAQAogICAgIGludDY0X3QgaW5kZXhfYnl0ZV9jb3VudDsKICAgICBpbnQgcGFja19sZW5ndGg7CiAgICAgaW50NjRfdCBwYWNrX29mczsgICAgICAgICAgICAgICAvLy88IGFic29sdXRlIG9mZnNldCBvZiBwYWNrIGluIGZpbGUsIGluY2x1ZGluZyBydW4taW4KKyAgICBpbnQ2NF90IGJvZHlfb2Zmc2V0OwogfSBNWEZQYXJ0aXRpb247CiAKIHR5cGVkZWYgc3RydWN0IE1YRkNyeXB0b0NvbnRleHQgewpAQCAtMTAxLDYgKzEwMyw3IEBACiB0eXBlZGVmIHN0cnVjdCBNWEZTdHJ1Y3R1cmFsQ29tcG9uZW50IHsKICAgICBVSUQgdWlkOwogICAgIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGU7CisgICAgVUlEIHNvdXJjZV9wYWNrYWdlX3VsOwogICAgIFVJRCBzb3VyY2VfcGFja2FnZV91aWQ7CiAgICAgVUlEIGRhdGFfZGVmaW5pdGlvbl91bDsKICAgICBpbnQ2NF90IGR1cmF0aW9uOwpAQCAtMTU0LDExICsxNTcsMTQgQEAKICAgICBNWEZTZXF1ZW5jZSAqc2VxdWVuY2U7IC8qIG1hbmRhdG9yeSwgYW5kIG9ubHkgb25lICovCiAgICAgVUlEIHNlcXVlbmNlX3JlZjsKICAgICBpbnQgdHJhY2tfaWQ7CisgICAgY2hhciAqbmFtZTsKICAgICB1aW50OF90IHRyYWNrX251bWJlcls0XTsKICAgICBBVlJhdGlvbmFsIGVkaXRfcmF0ZTsKICAgICBpbnQgaW50cmFfb25seTsKICAgICB1aW50NjRfdCBzYW1wbGVfY291bnQ7CiAgICAgaW50NjRfdCBvcmlnaW5hbF9kdXJhdGlvbjsgLyogc3QtPmR1cmF0aW9uIGluIFNhbXBsZVJhdGUvRWRpdFJhdGUgdW5pdHMgKi8KKyAgICBpbnQgaW5kZXhfc2lkOworICAgIGludCBib2R5X3NpZDsKIH0gTVhGVHJhY2s7CiAKIHR5cGVkZWYgc3RydWN0IE1YRkRlc2NyaXB0b3IgewpAQCAtMTcyLDggKzE3OCwxMCBAQAogICAgIGludCB3aWR0aDsKICAgICBpbnQgaGVpZ2h0OyAvKiBGaWVsZCBoZWlnaHQsIG5vdCBmcmFtZSBoZWlnaHQgKi8KICAgICBpbnQgZnJhbWVfbGF5b3V0OyAvKiBTZWUgTVhGRnJhbWVMYXlvdXQgZW51bSAqLwotI2RlZmluZSBNWEZfVEZGIDEKLSNkZWZpbmUgTVhGX0JGRiAyCisgICAgaW50IHZpZGVvX2xpbmVfbWFwWzJdOworI2RlZmluZSBNWEZfRklFTERfRE9NSU5BTkNFX0RFRkFVTFQgMAorI2RlZmluZSBNWEZfRklFTERfRE9NSU5BTkNFX0ZGIDEgLyogY29kZWQgZmlyc3QsIGRpc3BsYXllZCBmaXJzdCAqLworI2RlZmluZSBNWEZfRklFTERfRE9NSU5BTkNFX0ZMIDIgLyogY29kZWQgZmlyc3QsIGRpc3BsYXllZCBsYXN0ICovCiAgICAgaW50IGZpZWxkX2RvbWluYW5jZTsKICAgICBpbnQgY2hhbm5lbHM7CiAgICAgaW50IGJpdHNfcGVyX3NhbXBsZTsKQEAgLTIxOCw2ICsyMjYsMTUgQEAKICAgICBpbnQgY29tbWVudF9jb3VudDsKIH0gTVhGUGFja2FnZTsKIAordHlwZWRlZiBzdHJ1Y3QgTVhGRXNzZW5jZUNvbnRhaW5lckRhdGEgeworICAgIFVJRCB1aWQ7CisgICAgZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgdHlwZTsKKyAgICBVSUQgcGFja2FnZV91aWQ7CisgICAgVUlEIHBhY2thZ2VfdWw7CisgICAgaW50IGluZGV4X3NpZDsKKyAgICBpbnQgYm9keV9zaWQ7Cit9IE1YRkVzc2VuY2VDb250YWluZXJEYXRhOworCiB0eXBlZGVmIHN0cnVjdCBNWEZNZXRhZGF0YVNldCB7CiAgICAgVUlEIHVpZDsKICAgICBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlOwpAQCAtMjQyLDYgKzI1OSw4IEBACiAgICAgTVhGT1Agb3A7CiAgICAgVUlEICpwYWNrYWdlc19yZWZzOwogICAgIGludCBwYWNrYWdlc19jb3VudDsKKyAgICBVSUQgKmVzc2VuY2VfY29udGFpbmVyX2RhdGFfcmVmczsKKyAgICBpbnQgZXNzZW5jZV9jb250YWluZXJfZGF0YV9jb3VudDsKICAgICBNWEZNZXRhZGF0YVNldCAqKm1ldGFkYXRhX3NldHM7CiAgICAgaW50IG1ldGFkYXRhX3NldHNfY291bnQ7CiAgICAgQVZGb3JtYXRDb250ZXh0ICpmYzsKQEAgLTI1Niw3ICsyNzUsNyBAQAogICAgIGludCBwYXJzaW5nX2JhY2t3YXJkOwogICAgIGludDY0X3QgbGFzdF9mb3J3YXJkX3RlbGw7CiAgICAgaW50IGxhc3RfZm9yd2FyZF9wYXJ0aXRpb247Ci0gICAgaW50IGN1cnJlbnRfZWRpdF91bml0OworICAgIGludDY0X3QgY3VycmVudF9lZGl0X3VuaXQ7CiAgICAgaW50IG5iX2luZGV4X3RhYmxlczsKICAgICBNWEZJbmRleFRhYmxlICppbmRleF90YWJsZXM7CiAgICAgaW50IGVkaXRfdW5pdHNfcGVyX3BhY2tldDsgICAgICAvLy88IGhvdyBtYW55IGVkaXQgdW5pdHMgdG8gcmVhZCBhdCBhIHRpbWUgKFBDTSwgT1BBdG9tKQpAQCAtMjgzLDcgKzMwMiw5IEBACiBzdGF0aWMgY29uc3QgdWludDhfdCBteGZfaGVhZGVyX3BhcnRpdGlvbl9wYWNrX2tleVtdICAgICAgID0geyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHgwNSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MDIgfTsKIHN0YXRpYyBjb25zdCB1aW50OF90IG14Zl9lc3NlbmNlX2VsZW1lbnRfa2V5W10gICAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxIH07CiBzdGF0aWMgY29uc3QgdWludDhfdCBteGZfYXZpZF9lc3NlbmNlX2VsZW1lbnRfa2V5W10gICAgICAgID0geyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDEsMHgwMiwweDAxLDB4MDEsMHgwZSwweDA0LDB4MDMsMHgwMSB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXhmX3N5c3RlbV9pdGVtX2tleVtdICAgICAgICAgICAgICAgICA9IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4MDUsMHgwMSwweDAxLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgwNCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgbXhmX2Nhbm9wdXNfZXNzZW5jZV9lbGVtZW50X2tleVtdICAgICA9IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDBhLDB4MGUsMHgwZiwweDAzLDB4MDEgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9zeXN0ZW1faXRlbV9rZXlfY3BbXSAgICAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDA1LDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDQgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IG14Zl9zeXN0ZW1faXRlbV9rZXlfZ2NbXSAgICAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MTQgfTsKIHN0YXRpYyBjb25zdCB1aW50OF90IG14Zl9rbHZfa2V5W10gICAgICAgICAgICAgICAgICAgICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQgfTsKIC8qIGNvbXBsZXRlIGtleXMgdG8gbWF0Y2ggKi8KIHN0YXRpYyBjb25zdCB1aW50OF90IG14Zl9jcnlwdG9fc291cmNlX2NvbnRhaW5lcl91bFtdICAgICAgPSB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAxLDB4MDEsMHgwOSwweDA2LDB4MDEsMHgwMSwweDAyLDB4MDIsMHgwMCwweDAwLDB4MDAgfTsKQEAgLTMyNCw2ICszNDUsOSBAQAogICAgICAgICBhdl9mcmVlcCgmKChNWEZUYWdnZWRWYWx1ZSAqKSpjdHgpLT5uYW1lKTsKICAgICAgICAgYXZfZnJlZXAoJigoTVhGVGFnZ2VkVmFsdWUgKikqY3R4KS0+dmFsdWUpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIFRyYWNrOgorICAgICAgICBhdl9mcmVlcCgmKChNWEZUcmFjayAqKSpjdHgpLT5uYW1lKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBJbmRleFRhYmxlU2VnbWVudDoKICAgICAgICAgc2VnID0gKE1YRkluZGV4VGFibGVTZWdtZW50ICopKmN0eDsKICAgICAgICAgYXZfZnJlZXAoJnNlZy0+dGVtcG9yYWxfb2Zmc2V0X2VudHJpZXMpOwpAQCAtMzc1LDIwICszOTksNDMgQEAKICAgICByZXR1cm4ga2x2LT5sZW5ndGggPT0gLTEgPyAtMSA6IDA7CiB9CiAKLXN0YXRpYyBpbnQgbXhmX2dldF9zdHJlYW1faW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzLCBLTFZQYWNrZXQgKmtsdikKK3N0YXRpYyBpbnQgbXhmX2dldF9zdHJlYW1faW5kZXgoQVZGb3JtYXRDb250ZXh0ICpzLCBLTFZQYWNrZXQgKmtsdiwgaW50IGJvZHlfc2lkKQogewogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBNWEZUcmFjayAqdHJhY2sgPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CiAgICAgICAgIC8qIFNNUFRFIDM3OU0gNy4zICovCi0gICAgICAgIGlmICghbWVtY21wKGtsdi0+a2V5ICsgc2l6ZW9mKG14Zl9lc3NlbmNlX2VsZW1lbnRfa2V5KSwgdHJhY2stPnRyYWNrX251bWJlciwgc2l6ZW9mKHRyYWNrLT50cmFja19udW1iZXIpKSkKKyAgICAgICAgaWYgKHRyYWNrICYmICghYm9keV9zaWQgfHwgIXRyYWNrLT5ib2R5X3NpZCB8fCB0cmFjay0+Ym9keV9zaWQgPT0gYm9keV9zaWQpICYmICFtZW1jbXAoa2x2LT5rZXkgKyBzaXplb2YobXhmX2Vzc2VuY2VfZWxlbWVudF9rZXkpLCB0cmFjay0+dHJhY2tfbnVtYmVyLCBzaXplb2YodHJhY2stPnRyYWNrX251bWJlcikpKQogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgfQogICAgIC8qIHJldHVybiAwIGlmIG9ubHkgb25lIHN0cmVhbSwgZm9yIE9QIEF0b20gZmlsZXMgd2l0aCAwIGFzIHRyYWNrIG51bWJlciAqLwogICAgIHJldHVybiBzLT5uYl9zdHJlYW1zID09IDEgPyAwIDogLTE7CiB9CiAKK3N0YXRpYyBpbnQgZmluZF9ib2R5X3NpZF9ieV9vZmZzZXQoTVhGQ29udGV4dCAqbXhmLCBpbnQ2NF90IG9mZnNldCkKK3sKKyAgICAvLyB3ZSBsb29rIGZvciBwYXJ0aXRpb24gd2hlcmUgdGhlIG9mZnNldCBpcyBwbGFjZWQKKyAgICBpbnQgYSwgYiwgbTsKKyAgICBpbnQ2NF90IHRoaXNfcGFydGl0aW9uOworCisgICAgYSA9IC0xOworICAgIGIgPSBteGYtPnBhcnRpdGlvbnNfY291bnQ7CisKKyAgICB3aGlsZSAoYiAtIGEgPiAxKSB7CisgICAgICAgIG0gICAgICAgICA9IChhICsgYikgPj4gMTsKKyAgICAgICAgdGhpc19wYXJ0aXRpb24gPSBteGYtPnBhcnRpdGlvbnNbbV0udGhpc19wYXJ0aXRpb247CisgICAgICAgIGlmICh0aGlzX3BhcnRpdGlvbiA8PSBvZmZzZXQpCisgICAgICAgICAgICBhID0gbTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYiA9IG07CisgICAgfQorCisgICAgaWYgKGEgPT0gLTEpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiBteGYtPnBhcnRpdGlvbnNbYV0uYm9keV9zaWQ7Cit9CisKIC8qIFhYWDogdXNlIEFWQml0U3RyZWFtRmlsdGVyICovCiBzdGF0aWMgaW50IG14Zl9nZXRfZDEwX2FlczNfcGFja2V0KEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0LCBpbnQ2NF90IGxlbmd0aCkKIHsKQEAgLTQwNCwxNSArNDUxLDE1IEBACiAgICAgZGF0YV9wdHIgPSBwa3QtPmRhdGE7CiAgICAgZW5kX3B0ciA9IHBrdC0+ZGF0YSArIGxlbmd0aDsKICAgICBidWZfcHRyID0gcGt0LT5kYXRhICsgNDsgLyogc2tpcCBTTVBURSAzMzFNIGhlYWRlciAqLwotICAgIGZvciAoOyBlbmRfcHRyIC0gYnVmX3B0ciA+PSBzdC0+Y29kZWMtPmNoYW5uZWxzICogNDsgKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+Y29kZWMtPmNoYW5uZWxzOyBpKyspIHsKKyAgICBmb3IgKDsgZW5kX3B0ciAtIGJ1Zl9wdHIgPj0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIDQ7ICkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPmNvZGVjcGFyLT5jaGFubmVsczsgaSsrKSB7CiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGUgPSBieXRlc3RyZWFtX2dldF9sZTMyKCZidWZfcHRyKTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAyNCkKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAyNCkKICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTI0KCZkYXRhX3B0ciwgKHNhbXBsZSA+PiA0KSAmIDB4ZmZmZmZmKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZkYXRhX3B0ciwgKHNhbXBsZSA+PiAxMikgJiAweGZmZmYpOwogICAgICAgICB9Ci0gICAgICAgIGJ1Zl9wdHIgKz0gMzIgLSBzdC0+Y29kZWMtPmNoYW5uZWxzKjQ7IC8vIGFsd2F5cyA4IGNoYW5uZWxzIHN0b3JlZCBTTVBURSAzMzFNCisgICAgICAgIGJ1Zl9wdHIgKz0gMzIgLSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKjQ7IC8vIGFsd2F5cyA4IGNoYW5uZWxzIHN0b3JlZCBTTVBURSAzMzFNCiAgICAgfQogICAgIGF2X3Nocmlua19wYWNrZXQocGt0LCBkYXRhX3B0ciAtIHBrdC0+ZGF0YSk7CiAgICAgcmV0dXJuIDA7CkBAIC00MzAsNiArNDc3LDcgQEAKICAgICB1aW50OF90IGl2ZWNbMTZdOwogICAgIHVpbnQ4X3QgdG1wYnVmWzE2XTsKICAgICBpbnQgaW5kZXg7CisgICAgaW50IGJvZHlfc2lkOwogCiAgICAgaWYgKCFteGYtPmFlc2MgJiYgcy0+a2V5ICYmIHMtPmtleWxlbiA9PSAxNikgewogICAgICAgICBteGYtPmFlc2MgPSBhdl9hZXNfYWxsb2MoKTsKQEAgLTQ0Nyw3ICs0OTUsOSBAQAogICAgIGF2aW9fcmVhZChwYiwga2x2LT5rZXksIDE2KTsKICAgICBpZiAoIUlTX0tMVl9LRVkoa2x2LCBteGZfZXNzZW5jZV9lbGVtZW50X2tleSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIGluZGV4ID0gbXhmX2dldF9zdHJlYW1faW5kZXgocywga2x2KTsKKworICAgIGJvZHlfc2lkID0gZmluZF9ib2R5X3NpZF9ieV9vZmZzZXQobXhmLCBrbHYtPm9mZnNldCk7CisgICAgaW5kZXggPSBteGZfZ2V0X3N0cmVhbV9pbmRleChzLCBrbHYsIGJvZHlfc2lkKTsKICAgICBpZiAoaW5kZXggPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAvLyBzb3VyY2Ugc2l6ZQpAQCAtNDkxLDcgKzU0MSw3IEBACiAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShwYiwgIlByaW1lciBwYWNrIGl0ZW0gbGVuZ3RoICVkIiwgaXRlbV9sZW4pOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQotICAgIGlmIChpdGVtX251bSA+IDY1NTM2KSB7CisgICAgaWYgKGl0ZW1fbnVtID4gNjU1MzYgfHwgaXRlbV9udW0gPCAwKSB7CiAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfRVJST1IsICJpdGVtX251bSAlZCBpcyB0b28gbGFyZ2VcbiIsIGl0ZW1fbnVtKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtNTE1LDYgKzU2NSw5IEBACiAgICAgdWludDY0X3QgZm9vdGVyX3BhcnRpdGlvbjsKICAgICB1aW50MzJfdCBuYl9lc3NlbmNlX2NvbnRhaW5lcnM7CiAKKyAgICBpZiAobXhmLT5wYXJ0aXRpb25zX2NvdW50ID49IElOVF9NQVggLyAyKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIHRtcF9wYXJ0ID0gYXZfcmVhbGxvY19hcnJheShteGYtPnBhcnRpdGlvbnMsIG14Zi0+cGFydGl0aW9uc19jb3VudCArIDEsIHNpemVvZigqbXhmLT5wYXJ0aXRpb25zKSk7CiAgICAgaWYgKCF0bXBfcGFydCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTU2Myw3ICs2MTYsNyBAQAogICAgIHBhcnRpdGlvbi0+aGVhZGVyX2J5dGVfY291bnQgPSBhdmlvX3JiNjQocGIpOwogICAgIHBhcnRpdGlvbi0+aW5kZXhfYnl0ZV9jb3VudCA9IGF2aW9fcmI2NChwYik7CiAgICAgcGFydGl0aW9uLT5pbmRleF9zaWQgPSBhdmlvX3JiMzIocGIpOwotICAgIGF2aW9fc2tpcChwYiwgOCk7CisgICAgcGFydGl0aW9uLT5ib2R5X29mZnNldCA9IGF2aW9fcmI2NChwYik7CiAgICAgcGFydGl0aW9uLT5ib2R5X3NpZCA9IGF2aW9fcmIzMihwYik7CiAgICAgaWYgKGF2aW9fcmVhZChwYiwgb3AsIHNpemVvZihVSUQpKSAhPSBzaXplb2YoVUlEKSkgewogICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHJlYWRpbmcgVUlEXG4iKTsKQEAgLTU5MSw3ICs2NDQsNyBAQAogICAgICAgICAgICAgICAgcGFydGl0aW9uLT5wcmV2aW91c19wYXJ0aXRpb24pOwogICAgIH0KIAotICAgIC8qIHNvbWUgZmlsZXMgZG9uJ3RoYXZlIEZvb3RlclBhcnRpdGlvbiBzZXQgaW4gZXZlcnkgcGFydGl0aW9uICovCisgICAgLyogc29tZSBmaWxlcyBkb24ndCBoYXZlIEZvb3RlclBhcnRpdGlvbiBzZXQgaW4gZXZlcnkgcGFydGl0aW9uICovCiAgICAgaWYgKGZvb3Rlcl9wYXJ0aXRpb24pIHsKICAgICAgICAgaWYgKG14Zi0+Zm9vdGVyX3BhcnRpdGlvbiAmJiBteGYtPmZvb3Rlcl9wYXJ0aXRpb24gIT0gZm9vdGVyX3BhcnRpdGlvbikgewogICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwKQEAgLTcwMyw2ICs3NTYsNDEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgbXhmX3JlYWRfdXRmMTZfc3RyaW5nKEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUsIGNoYXIqKiBzdHIsIGludCBiZSkKK3sKKyAgICBpbnQgcmV0OworICAgIHNpemVfdCBidWZfc2l6ZTsKKworICAgIGlmIChzaXplIDwgMCB8fCBzaXplID4gSU5UX01BWC8yKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgYnVmX3NpemUgPSBzaXplICsgc2l6ZSAvIDIgKyAxOworICAgICpzdHIgPSBhdl9tYWxsb2MoYnVmX3NpemUpOworICAgIGlmICghKnN0cikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmIChiZSkKKyAgICAgICAgcmV0ID0gYXZpb19nZXRfc3RyMTZiZShwYiwgc2l6ZSwgKnN0ciwgYnVmX3NpemUpOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gYXZpb19nZXRfc3RyMTZsZShwYiwgc2l6ZSwgKnN0ciwgYnVmX3NpemUpOworCisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfZnJlZXAoc3RyKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFJFQURfU1RSMTYodHlwZSwgYmlnX2VuZGlhbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgbXhmX3JlYWRfdXRmMTYgIyMgdHlwZSAjI19zdHJpbmcoQVZJT0NvbnRleHQgKnBiLCBpbnQgc2l6ZSwgY2hhcioqIHN0cikgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCityZXR1cm4gbXhmX3JlYWRfdXRmMTZfc3RyaW5nKHBiLCBzaXplLCBzdHIsIGJpZ19lbmRpYW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KK1JFQURfU1RSMTYoYmUsIDEpCitSRUFEX1NUUjE2KGxlLCAwKQorI3VuZGVmIFJFQURfU1RSMTYKKwogc3RhdGljIGludCBteGZfcmVhZF9jb250ZW50X3N0b3JhZ2Uodm9pZCAqYXJnLCBBVklPQ29udGV4dCAqcGIsIGludCB0YWcsIGludCBzaXplLCBVSUQgdWlkLCBpbnQ2NF90IGtsdl9vZmZzZXQpCiB7CiAgICAgTVhGQ29udGV4dCAqbXhmID0gYXJnOwpAQCAtNzEyLDYgKzgwMCw5IEBACiAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX1ZFUkJPU0UsICJNdWx0aXBsZSBwYWNrYWdlc19yZWZzXG4iKTsKICAgICAgICAgYXZfZnJlZShteGYtPnBhY2thZ2VzX3JlZnMpOwogICAgICAgICByZXR1cm4gbXhmX3JlYWRfc3Ryb25nX3JlZl9hcnJheShwYiwgJm14Zi0+cGFja2FnZXNfcmVmcywgJm14Zi0+cGFja2FnZXNfY291bnQpOworICAgIGNhc2UgMHgxOTAyOgorICAgICAgICBhdl9mcmVlKG14Zi0+ZXNzZW5jZV9jb250YWluZXJfZGF0YV9yZWZzKTsKKyAgICAgICAgcmV0dXJuIG14Zl9yZWFkX3N0cm9uZ19yZWZfYXJyYXkocGIsICZteGYtPmVzc2VuY2VfY29udGFpbmVyX2RhdGFfcmVmcywgJm14Zi0+ZXNzZW5jZV9jb250YWluZXJfZGF0YV9jb3VudCk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpAQCAtNzI4LDcgKzgxOSw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHgxMTAxOgogICAgICAgICAvKiBVTUlELCBvbmx5IGdldCBsYXN0IDE2IGJ5dGVzICovCi0gICAgICAgIGF2aW9fc2tpcChwYiwgMTYpOworICAgICAgICBhdmlvX3JlYWQocGIsIHNvdXJjZV9jbGlwLT5zb3VyY2VfcGFja2FnZV91bCwgMTYpOwogICAgICAgICBhdmlvX3JlYWQocGIsIHNvdXJjZV9jbGlwLT5zb3VyY2VfcGFja2FnZV91aWQsIDE2KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAweDExMDI6CkBAIC03NzYsNiArODY3LDkgQEAKICAgICBjYXNlIDB4NDgwNDoKICAgICAgICAgYXZpb19yZWFkKHBiLCB0cmFjay0+dHJhY2tfbnVtYmVyLCA0KTsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAweDQ4MDI6CisgICAgICAgIG14Zl9yZWFkX3V0ZjE2YmVfc3RyaW5nKHBiLCBzaXplLCAmdHJhY2stPm5hbWUpOworICAgICAgICBicmVhazsKICAgICBjYXNlIDB4NGIwMToKICAgICAgICAgdHJhY2stPmVkaXRfcmF0ZS5udW0gPSBhdmlvX3JiMzIocGIpOwogICAgICAgICB0cmFjay0+ZWRpdF9yYXRlLmRlbiA9IGF2aW9fcmIzMihwYik7CkBAIC04MjEsNDEgKzkxNSw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG14Zl9yZWFkX3V0ZjE2X3N0cmluZyhBVklPQ29udGV4dCAqcGIsIGludCBzaXplLCBjaGFyKiogc3RyLCBpbnQgYmUpCi17Ci0gICAgaW50IHJldDsKLSAgICBzaXplX3QgYnVmX3NpemU7Ci0KLSAgICBpZiAoc2l6ZSA8IDApCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0KLSAgICBidWZfc2l6ZSA9IHNpemUgKyBzaXplIC8gMiArIDE7Ci0gICAgKnN0ciA9IGF2X21hbGxvYyhidWZfc2l6ZSk7Ci0gICAgaWYgKCEqc3RyKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgaWYgKGJlKQotICAgICAgICByZXQgPSBhdmlvX2dldF9zdHIxNmJlKHBiLCBzaXplLCAqc3RyLCBidWZfc2l6ZSk7Ci0gICAgZWxzZQotICAgICAgICByZXQgPSBhdmlvX2dldF9zdHIxNmxlKHBiLCBzaXplLCAqc3RyLCBidWZfc2l6ZSk7Ci0KLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9mcmVlcChzdHIpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgUkVBRF9TVFIxNih0eXBlLCBiaWdfZW5kaWFuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGludCBteGZfcmVhZF91dGYxNiAjIyB0eXBlICMjX3N0cmluZyhBVklPQ29udGV4dCAqcGIsIGludCBzaXplLCBjaGFyKiogc3RyKSBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXJldHVybiBteGZfcmVhZF91dGYxNl9zdHJpbmcocGIsIHNpemUsIHN0ciwgYmlnX2VuZGlhbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotUkVBRF9TVFIxNihiZSwgMSkKLVJFQURfU1RSMTYobGUsIDApCi0jdW5kZWYgUkVBRF9TVFIxNgotCiBzdGF0aWMgaW50IG14Zl9yZWFkX3BhY2thZ2Uodm9pZCAqYXJnLCBBVklPQ29udGV4dCAqcGIsIGludCB0YWcsIGludCBzaXplLCBVSUQgdWlkLCBpbnQ2NF90IGtsdl9vZmZzZXQpCiB7CiAgICAgTVhGUGFja2FnZSAqcGFja2FnZSA9IGFyZzsKQEAgLTg4MCw2ICs5MzksMjUgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBteGZfcmVhZF9lc3NlbmNlX2NvbnRhaW5lcl9kYXRhKHZvaWQgKmFyZywgQVZJT0NvbnRleHQgKnBiLCBpbnQgdGFnLCBpbnQgc2l6ZSwgVUlEIHVpZCwgaW50NjRfdCBrbHZfb2Zmc2V0KQoreworICAgIE1YRkVzc2VuY2VDb250YWluZXJEYXRhICplc3NlbmNlX2RhdGEgPSBhcmc7CisgICAgc3dpdGNoKHRhZykgeworICAgICAgICBjYXNlIDB4MjcwMToKKyAgICAgICAgICAgIC8qIGxpbmtlZCBwYWNrYWdlIHVtaWQgVU1JRCAqLworICAgICAgICAgICAgYXZpb19yZWFkKHBiLCBlc3NlbmNlX2RhdGEtPnBhY2thZ2VfdWwsIDE2KTsKKyAgICAgICAgICAgIGF2aW9fcmVhZChwYiwgZXNzZW5jZV9kYXRhLT5wYWNrYWdlX3VpZCwgMTYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzZjA2OgorICAgICAgICAgICAgZXNzZW5jZV9kYXRhLT5pbmRleF9zaWQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgzZjA3OgorICAgICAgICAgICAgZXNzZW5jZV9kYXRhLT5ib2R5X3NpZCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbXhmX3JlYWRfaW5kZXhfZW50cnlfYXJyYXkoQVZJT0NvbnRleHQgKnBiLCBNWEZJbmRleFRhYmxlU2VnbWVudCAqc2VnbWVudCkKIHsKICAgICBpbnQgaSwgbGVuZ3RoOwpAQCAtODg3LDYgKzk2NSw4IEBACiAgICAgc2VnbWVudC0+bmJfaW5kZXhfZW50cmllcyA9IGF2aW9fcmIzMihwYik7CiAKICAgICBsZW5ndGggPSBhdmlvX3JiMzIocGIpOworICAgIGlmKHNlZ21lbnQtPm5iX2luZGV4X2VudHJpZXMgJiYgbGVuZ3RoIDwgMTEpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgaWYgKCEoc2VnbWVudC0+dGVtcG9yYWxfb2Zmc2V0X2VudHJpZXM9YXZfY2FsbG9jKHNlZ21lbnQtPm5iX2luZGV4X2VudHJpZXMsIHNpemVvZigqc2VnbWVudC0+dGVtcG9yYWxfb2Zmc2V0X2VudHJpZXMpKSkgfHwKICAgICAgICAgIShzZWdtZW50LT5mbGFnX2VudHJpZXMgICAgICAgICAgPSBhdl9jYWxsb2Moc2VnbWVudC0+bmJfaW5kZXhfZW50cmllcywgc2l6ZW9mKCpzZWdtZW50LT5mbGFnX2VudHJpZXMpKSkgfHwKQEAgLTg5Nyw2ICs5NzcsOCBAQAogICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBzZWdtZW50LT5uYl9pbmRleF9lbnRyaWVzOyBpKyspIHsKKyAgICAgICAgaWYoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBzZWdtZW50LT50ZW1wb3JhbF9vZmZzZXRfZW50cmllc1tpXSA9IGF2aW9fcjgocGIpOwogICAgICAgICBhdmlvX3I4KHBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogS2V5RnJhbWVPZmZzZXQgKi8KICAgICAgICAgc2VnbWVudC0+ZmxhZ19lbnRyaWVzW2ldID0gYXZpb19yOChwYik7CkBAIC05NjYsNiArMTA0OCw4IEBACiBzdGF0aWMgaW50IG14Zl9yZWFkX2dlbmVyaWNfZGVzY3JpcHRvcih2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCB1aWQsIGludDY0X3Qga2x2X29mZnNldCkKIHsKICAgICBNWEZEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gYXJnOworICAgIGludCBlbnRyeV9jb3VudCwgZW50cnlfc2l6ZTsKKwogICAgIHN3aXRjaCh0YWcpIHsKICAgICBjYXNlIDB4M0YwMToKICAgICAgICAgcmV0dXJuIG14Zl9yZWFkX3N0cm9uZ19yZWZfYXJyYXkocGIsICZkZXNjcmlwdG9yLT5zdWJfZGVzY3JpcHRvcnNfcmVmcywKQEAgLTk5NCw2ICsxMDc4LDIxIEBACiAgICAgY2FzZSAweDMyMEM6CiAgICAgICAgIGRlc2NyaXB0b3ItPmZyYW1lX2xheW91dCA9IGF2aW9fcjgocGIpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIDB4MzIwRDoKKyAgICAgICAgZW50cnlfY291bnQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICBlbnRyeV9zaXplID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgaWYgKGVudHJ5X3NpemUgPT0gNCkgeworICAgICAgICAgICAgaWYgKGVudHJ5X2NvdW50ID4gMCkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT52aWRlb19saW5lX21hcFswXSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+dmlkZW9fbGluZV9tYXBbMF0gPSAwOworICAgICAgICAgICAgaWYgKGVudHJ5X2NvdW50ID4gMSkKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT52aWRlb19saW5lX21hcFsxXSA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+dmlkZW9fbGluZV9tYXBbMV0gPSAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIlZpZGVvTGluZU1hcCBlbGVtZW50IHNpemUgJWQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWRcbiIsIGVudHJ5X3NpemUpOworICAgICAgICBicmVhazsKICAgICBjYXNlIDB4MzIwRToKICAgICAgICAgZGVzY3JpcHRvci0+YXNwZWN0X3JhdGlvLm51bSA9IGF2aW9fcmIzMihwYik7CiAgICAgICAgIGRlc2NyaXB0b3ItPmFzcGVjdF9yYXRpby5kZW4gPSBhdmlvX3JiMzIocGIpOwpAQCAtMTEyMiwyNiArMTIyMSwyOCBAQAogc3RhdGljIGNvbnN0IE1YRkNvZGVjVUwgbXhmX3BpY3R1cmVfZXNzZW5jZV9jb250YWluZXJfdWxzW10gPSB7CiAgICAgLy8gdmlkZW8gZXNzZW5jZSBjb250YWluZXIgdWxzCiAgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwNywweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwYywweDAxLDB4MDAgfSwgMTQsICAgQVZfQ09ERUNfSURfSlBFRzIwMDAgfSwKLSAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAyLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDEwLDB4NjAsMHgwMSB9LCAxNCwgICAgICAgQVZfQ09ERUNfSURfSDI2NCB9LCAvKiBIMjY0IEZyYW1lIHdyYXBwZWQgKi8KLSAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAyLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDEyLDB4MDEsMHgwMCB9LCAxNCwgICAgICAgIEFWX0NPREVDX0lEX1ZDMSB9LCAvKiBWQy0xIEZyYW1lIHdyYXBwZWQgKi8KLSAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAyLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDA0LDB4NjAsMHgwMSB9LCAxNCwgQVZfQ09ERUNfSURfTVBFRzJWSURFTyB9LCAvKiBNUEVHLUVTIEZyYW1lIHdyYXBwZWQgKi8KKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAyLDB4MGQsMHgwMSwweDAzLDB4MDEsMHgwMiwweDEwLDB4NjAsMHgwMSB9LCAxNCwgICAgICAgQVZfQ09ERUNfSURfSDI2NCB9LCAvKiBILjI2NCBmcmFtZSB3cmFwcGVkICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMiwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgxMiwweDAxLDB4MDAgfSwgMTQsICAgICAgICBBVl9DT0RFQ19JRF9WQzEgfSwgLyogVkMtMSBmcmFtZSB3cmFwcGVkICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMiwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwNCwweDYwLDB4MDEgfSwgMTQsIEFWX0NPREVDX0lEX01QRUcyVklERU8gfSwgLyogTVBFRy1FUyBmcmFtZSB3cmFwcGVkICovCiAgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwMSwweDA0LDB4MDEgfSwgMTQsIEFWX0NPREVDX0lEX01QRUcyVklERU8gfSwgLyogVHlwZSBELTEwIG1hcHBpbmcgb2YgNDBNYnBzIDUyNS82MC1JICovCiAgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwMiwweDQxLDB4MDEgfSwgMTQsICAgIEFWX0NPREVDX0lEX0RWVklERU8gfSwgLyogRFYgNjI1IDI1bWJwcyAqLwotICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDUsMHgwMCwweDAwIH0sIDE0LCAgIEFWX0NPREVDX0lEX1JBV1ZJREVPIH0sIC8qIFVuY29tcHJlc3NlZCBQaWN0dXJlICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwNSwweDAwLDB4MDAgfSwgMTQsICAgQVZfQ09ERUNfSURfUkFXVklERU8gfSwgLyogdW5jb21wcmVzc2VkIHBpY3R1cmUgKi8KKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBhLDB4MGUsMHgwZiwweDAzLDB4MDEsMHgwMiwweDIwLDB4MDEsMHgwMSB9LCAxNSwgICAgIEFWX0NPREVDX0lEX0hRX0hRQSB9LAorICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MGEsMHgwZSwweDBmLDB4MDMsMHgwMSwweDAyLDB4MjAsMHgwMiwweDAxIH0sIDE1LCAgICAgICAgQVZfQ09ERUNfSURfSFFYIH0sCiAgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMSwweDAxLDB4MDEsMHhmZiwweDRiLDB4NDYsMHg0MSwweDQxLDB4MDAsMHgwZCwweDRkLDB4NGYgfSwgMTQsICAgQVZfQ09ERUNfSURfUkFXVklERU8gfSwgLyogTGVnYWN5ID8/IFVuY29tcHJlc3NlZCBQaWN0dXJlICovCiAgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgIDAsICAgICAgQVZfQ09ERUNfSURfTk9ORSB9LAogfTsKIAogLyogRUMgVUxzIGZvciBpbnRyYS1vbmx5IGZvcm1hdHMgKi8KIHN0YXRpYyBjb25zdCBNWEZDb2RlY1VMIG14Zl9pbnRyYV9vbmx5X2Vzc2VuY2VfY29udGFpbmVyX3Vsc1tdID0gewotICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwMCwweDAwIH0sIDE0LCBBVl9DT0RFQ19JRF9NUEVHMlZJREVPIH0sIC8qIE1YRi1HQyBTTVBURSBELTEwIE1hcHBpbmdzICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwMSwweDAwLDB4MDAgfSwgMTQsIEFWX0NPREVDX0lEX01QRUcyVklERU8gfSwgLyogTVhGLUdDIFNNUFRFIEQtMTAgbWFwcGluZ3MgKi8KICAgICB7IHsgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCB9LCAgMCwgICAgICAgQVZfQ09ERUNfSURfTk9ORSB9LAogfTsKIAogLyogaW50cmEtb25seSBQaWN0dXJlRXNzZW5jZUNvZGluZyBVTHMsIHdoZXJlIG5vIGNvcnJlc3BvbmRpbmcgRUMgVUwgZXhpc3RzICovCiBzdGF0aWMgY29uc3QgTVhGQ29kZWNVTCBteGZfaW50cmFfb25seV9waWN0dXJlX2Vzc2VuY2VfY29kaW5nX3Vsc1tdID0gewogICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MEEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MzIsMHgwMCwweDAwIH0sIDE0LCAgICAgICBBVl9DT0RFQ19JRF9IMjY0IH0sIC8qIEguMjY0L01QRUctNCBBVkMgSW50cmEgUHJvZmlsZXMgKi8KLSAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDA3LDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMywweDAxLDB4MDEsMHgwMCB9LCAxNCwgICBBVl9DT0RFQ19JRF9KUEVHMjAwMCB9LCAvKiBKUEVHMjAwMCBDb2Rlc3RyZWFtICovCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwNywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDMsMHgwMSwweDAxLDB4MDAgfSwgMTQsICAgQVZfQ09ERUNfSURfSlBFRzIwMDAgfSwgLyogSlBFRyAyMDAwIGNvZGUgc3RyZWFtICovCiAgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgIDAsICAgICAgIEFWX0NPREVDX0lEX05PTkUgfSwKIH07CiAKQEAgLTExNjAsNyArMTI2MSw3IEBACiAgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMiwweDBkLDB4MDEsMHgwMywweDAxLDB4MDIsMHgwNCwweDQwLDB4MDEgfSwgMTQsICAgICAgIEFWX0NPREVDX0lEX01QMiB9LCAvKiBNUEVHLUVTIEZyYW1lIHdyYXBwZWQsIDB4NDAgPz8/IHN0cmVhbSBpZCAqLwogICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwZCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDEsMHgwMSwweDAxIH0sIDE0LCBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgfSwgLyogRC0xMCBNYXBwaW5nIDUwTWJwcyBQQUwgRXh0ZW5kZWQgVGVtcGxhdGUgKi8KICAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAxLDB4MDEsMHgwMSwweGZmLDB4NGIsMHg0NiwweDQxLDB4NDEsMHgwMCwweDBkLDB4NGQsMHg0RiB9LCAxNCwgQVZfQ09ERUNfSURfUENNX1MxNkxFIH0sIC8qIDAwMDFHTDAwLk1YRi5BMS5teGZfb3BhdG9tLm14ZiAqLwotICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDMsMHgwNCwweDAyLDB4MDIsMHgwMiwweDAzLDB4MDMsMHgwMSwweDAwIH0sIDE0LCAgICAgICBBVl9DT0RFQ19JRF9BQUMgfSwgLyogTVBFRzIgQUFDIEFEVFMgKGxlZ2FjeSkgKi8KKyAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAzLDB4MDQsMHgwMiwweDAyLDB4MDIsMHgwMywweDAzLDB4MDEsMHgwMCB9LCAxNCwgICAgICAgQVZfQ09ERUNfSURfQUFDIH0sIC8qIE1QRUctMiBBQUMgQURUUyAobGVnYWN5KSAqLwogICAgIHsgeyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwIH0sICAwLCAgICAgIEFWX0NPREVDX0lEX05PTkUgfSwKIH07CiAKQEAgLTExNjksNyArMTI3MCw3IEBACiAgICAgeyB7IDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAgfSwgIDAsIEFWX0NPREVDX0lEX05PTkUgfSwKIH07CiAKLXN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBteGZfZGF0YV9lc3NlbmNlX2Rlc2NyaXB0b3JbXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXhmX2RhdGFfZXNzZW5jZV9kZXNjcmlwdG9yW10gPSB7CiAgICAgInZiaV92YW5jX3NtcHRlXzQzNk0iLAogfTsKIApAQCAtMTIxMiw5ICsxMzEzLDE1IEBACiAgICAgICAgICAgICAgKiBXZSB3YW50IHRoZSBzbWFsbGVzdCB2YWx1ZXMgZm9yIHRoZSBrZXlzIHRoYW4gd2hhdCB3ZSBjdXJyZW50bHkgaGF2ZSwgdW5sZXNzIHRoaXMgaXMgdGhlIGZpcnN0IHN1Y2ggZW50cnkgdGhpcyB0aW1lIGFyb3VuZC4KICAgICAgICAgICAgICAqIElmIHdlIGNvbWUgYWNyb3NzIGFuIGVudHJ5IHdpdGggdGhlIHNhbWUgSW5kZXhTdGFydFBvc2l0aW9uIGJ1dCBsYXJnZXIgSW5kZXhEdXJhdGlvbiwgdGhlbiB3ZSdsbCBwcmVmZXIgaXQgb3ZlciB0aGUgb25lIHdlIGN1cnJlbnRseSBoYXZlLgogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoKGkgPT0gMCAgICAgfHwgcy0+Ym9keV9zaWQgPiBsYXN0X2JvZHlfc2lkIHx8IHMtPmluZGV4X3NpZCA+IGxhc3RfaW5kZXhfc2lkIHx8IHMtPmluZGV4X3N0YXJ0X3Bvc2l0aW9uID4gbGFzdF9pbmRleF9zdGFydCkgJiYKLSAgICAgICAgICAgICAgICAoYmVzdCA9PSAtMSB8fCBzLT5ib2R5X3NpZCA8IGJlc3RfYm9keV9zaWQgfHwgcy0+aW5kZXhfc2lkIDwgYmVzdF9pbmRleF9zaWQgfHwgcy0+aW5kZXhfc3RhcnRfcG9zaXRpb24gPCBiZXN0X2luZGV4X3N0YXJ0IHx8Ci0gICAgICAgICAgICAgICAgKHMtPmluZGV4X3N0YXJ0X3Bvc2l0aW9uID09IGJlc3RfaW5kZXhfc3RhcnQgJiYgcy0+aW5kZXhfZHVyYXRpb24gPiBiZXN0X2luZGV4X2R1cmF0aW9uKSkpIHsKKyAgICAgICAgICAgIGlmICgoaSA9PSAwIHx8CisgICAgICAgICAgICAgICAgIHMtPmJvZHlfc2lkID4gIGxhc3RfYm9keV9zaWQgfHwKKyAgICAgICAgICAgICAgICAgcy0+Ym9keV9zaWQgPT0gbGFzdF9ib2R5X3NpZCAmJiBzLT5pbmRleF9zaWQgPiAgbGFzdF9pbmRleF9zaWQgfHwKKyAgICAgICAgICAgICAgICAgcy0+Ym9keV9zaWQgPT0gbGFzdF9ib2R5X3NpZCAmJiBzLT5pbmRleF9zaWQgPT0gbGFzdF9pbmRleF9zaWQgJiYgcy0+aW5kZXhfc3RhcnRfcG9zaXRpb24gPiBsYXN0X2luZGV4X3N0YXJ0KSAmJgorICAgICAgICAgICAgICAgIChiZXN0ID09IC0xIHx8CisgICAgICAgICAgICAgICAgIHMtPmJvZHlfc2lkIDwgIGJlc3RfYm9keV9zaWQgfHwKKyAgICAgICAgICAgICAgICAgcy0+Ym9keV9zaWQgPT0gYmVzdF9ib2R5X3NpZCAmJiBzLT5pbmRleF9zaWQgPCAgYmVzdF9pbmRleF9zaWQgfHwKKyAgICAgICAgICAgICAgICAgcy0+Ym9keV9zaWQgPT0gYmVzdF9ib2R5X3NpZCAmJiBzLT5pbmRleF9zaWQgPT0gYmVzdF9pbmRleF9zaWQgJiYgcy0+aW5kZXhfc3RhcnRfcG9zaXRpb24gPCAgYmVzdF9pbmRleF9zdGFydCB8fAorICAgICAgICAgICAgICAgICBzLT5ib2R5X3NpZCA9PSBiZXN0X2JvZHlfc2lkICYmIHMtPmluZGV4X3NpZCA9PSBiZXN0X2luZGV4X3NpZCAmJiBzLT5pbmRleF9zdGFydF9wb3NpdGlvbiA9PSBiZXN0X2luZGV4X3N0YXJ0ICYmIHMtPmluZGV4X2R1cmF0aW9uID4gYmVzdF9pbmRleF9kdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICBiZXN0ICAgICAgICAgICAgID0gajsKICAgICAgICAgICAgICAgICBiZXN0X2JvZHlfc2lkICAgID0gcy0+Ym9keV9zaWQ7CiAgICAgICAgICAgICAgICAgYmVzdF9pbmRleF9zaWQgICA9IHMtPmluZGV4X3NpZDsKQEAgLTEyNDMsMjYgKzEzNTAsMzggQEAKICAqLwogc3RhdGljIGludCBteGZfYWJzb2x1dGVfYm9keXNpZF9vZmZzZXQoTVhGQ29udGV4dCAqbXhmLCBpbnQgYm9keV9zaWQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90ICpvZmZzZXRfb3V0KQogewotICAgIGludCB4OwotICAgIGludDY0X3Qgb2Zmc2V0X2luID0gb2Zmc2V0OyAgICAgLyogZm9yIGxvZ2dpbmcgKi8KKyAgICBNWEZQYXJ0aXRpb24gKmxhc3RfcCA9IE5VTEw7CisgICAgaW50IGEsIGIsIG0sIG0wOwogCi0gICAgZm9yICh4ID0gMDsgeCA8IG14Zi0+cGFydGl0aW9uc19jb3VudDsgeCsrKSB7Ci0gICAgICAgIE1YRlBhcnRpdGlvbiAqcCA9ICZteGYtPnBhcnRpdGlvbnNbeF07CisgICAgaWYgKG9mZnNldCA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAKLSAgICAgICAgaWYgKHAtPmJvZHlfc2lkICE9IGJvZHlfc2lkKQotICAgICAgICAgICAgY29udGludWU7CisgICAgYSA9IC0xOworICAgIGIgPSBteGYtPnBhcnRpdGlvbnNfY291bnQ7CiAKLSAgICAgICAgaWYgKG9mZnNldCA8IHAtPmVzc2VuY2VfbGVuZ3RoIHx8ICFwLT5lc3NlbmNlX2xlbmd0aCkgewotICAgICAgICAgICAgKm9mZnNldF9vdXQgPSBwLT5lc3NlbmNlX29mZnNldCArIG9mZnNldDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9CisgICAgd2hpbGUgKGIgLSBhID4gMSkgeworICAgICAgICBtMCA9IG0gPSAoYSArIGIpID4+IDE7CiAKLSAgICAgICAgb2Zmc2V0IC09IHAtPmVzc2VuY2VfbGVuZ3RoOworICAgICAgICB3aGlsZSAobSA8IGIgJiYgbXhmLT5wYXJ0aXRpb25zW21dLmJvZHlfc2lkICE9IGJvZHlfc2lkKQorICAgICAgICAgICAgbSsrOworCisgICAgICAgIGlmIChtIDwgYiAmJiBteGYtPnBhcnRpdGlvbnNbbV0uYm9keV9vZmZzZXQgPD0gb2Zmc2V0KQorICAgICAgICAgICAgYSA9IG07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGIgPSBtMDsKKyAgICB9CisKKyAgICBpZiAoYSA+PSAwKQorICAgICAgICBsYXN0X3AgPSAmbXhmLT5wYXJ0aXRpb25zW2FdOworCisgICAgaWYgKGxhc3RfcCAmJiAoIWxhc3RfcC0+ZXNzZW5jZV9sZW5ndGggfHwgbGFzdF9wLT5lc3NlbmNlX2xlbmd0aCA+IChvZmZzZXQgLSBsYXN0X3AtPmJvZHlfb2Zmc2V0KSkpIHsKKyAgICAgICAgKm9mZnNldF9vdXQgPSBsYXN0X3AtPmVzc2VuY2Vfb2Zmc2V0ICsgKG9mZnNldCAtIGxhc3RfcC0+Ym9keV9vZmZzZXQpOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAiZmFpbGVkIHRvIGZpbmQgYWJzb2x1dGUgb2Zmc2V0IG9mICUiUFJJWDY0IiBpbiBCb2R5U0lEICVpIC0gcGFydGlhbCBmaWxlP1xuIiwKLSAgICAgICAgICAgb2Zmc2V0X2luLCBib2R5X3NpZCk7CisgICAgICAgICAgIG9mZnNldCwgYm9keV9zaWQpOwogCiAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiB9CkBAIC0xNDk5LDYgKzE2MTgsNyBAQAogCiAgICAgZm9yIChpID0gaiA9IDA7IGogPCBteGYtPm5iX2luZGV4X3RhYmxlczsgaSArPSBteGYtPmluZGV4X3RhYmxlc1tqKytdLm5iX3NlZ21lbnRzKSB7CiAgICAgICAgIE1YRkluZGV4VGFibGUgKnQgPSAmbXhmLT5pbmRleF90YWJsZXNbal07CisgICAgICAgIE1YRlRyYWNrICpteGZfdHJhY2sgPSBOVUxMOwogCiAgICAgICAgIHQtPnNlZ21lbnRzID0gYXZfbWFsbG9jel9hcnJheSh0LT5uYl9zZWdtZW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqdC0+c2VnbWVudHMpKTsKQEAgLTE1MjEsNiArMTY0MSwxNCBAQAogICAgICAgICBpZiAoKHJldCA9IG14Zl9jb21wdXRlX3B0c2VzX2Zha2VfaW5kZXgobXhmLCB0KSkgPCAwKQogICAgICAgICAgICAgZ290byBmaW5pc2hfZGVjb2RpbmdfaW5kZXg7CiAKKyAgICAgICAgZm9yIChrID0gMDsgayA8IG14Zi0+ZmMtPm5iX3N0cmVhbXM7IGsrKykgeworICAgICAgICAgICAgTVhGVHJhY2sgKnRyYWNrID0gbXhmLT5mYy0+c3RyZWFtc1trXS0+cHJpdl9kYXRhOworICAgICAgICAgICAgaWYgKHRyYWNrICYmIHRyYWNrLT5pbmRleF9zaWQgPT0gdC0+aW5kZXhfc2lkKSB7CisgICAgICAgICAgICAgICAgbXhmX3RyYWNrID0gdHJhY2s7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICAvKiBmaXggemVybyBJbmRleER1cmF0aW9ucyAqLwogICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdC0+bmJfc2VnbWVudHM7IGsrKykgewogICAgICAgICAgICAgaWYgKHQtPnNlZ21lbnRzW2tdLT5pbmRleF9kdXJhdGlvbikKQEAgLTE1MzAsNyArMTY1OCw3IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19XQVJOSU5HLCAiSW5kZXhTSUQgJWkgc2VnbWVudCAlaSBoYXMgemVybyBJbmRleER1cmF0aW9uIGFuZCB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgc2VnbWVudFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgdC0+aW5kZXhfc2lkLCBrKTsKIAotICAgICAgICAgICAgaWYgKG14Zi0+ZmMtPm5iX3N0cmVhbXMgPD0gMCkgeworICAgICAgICAgICAgaWYgKCFteGZfdHJhY2spIHsKICAgICAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX1dBUk5JTkcsICJubyBzdHJlYW1zP1xuIik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNTM4LDcgKzE2NjYsNyBAQAogICAgICAgICAgICAgLyogYXNzdW1lIHRoZSBmaXJzdCBzdHJlYW0ncyBkdXJhdGlvbiBpcyByZWFzb25hYmxlCiAgICAgICAgICAgICAgKiBsZWF2ZSBpbmRleF9kdXJhdGlvbiA9IDAgb24gZnVydGhlciBzZWdtZW50cyBpbiBjYXNlIHdlIGhhdmUgYW55ICh1bmxpa2VseSkKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgdC0+c2VnbWVudHNba10tPmluZGV4X2R1cmF0aW9uID0gbXhmLT5mYy0+c3RyZWFtc1swXS0+ZHVyYXRpb247CisgICAgICAgICAgICB0LT5zZWdtZW50c1trXS0+aW5kZXhfZHVyYXRpb24gPSBteGZfdHJhY2stPm9yaWdpbmFsX2R1cmF0aW9uOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjM3LDcgKzE3NjUsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgTVhGUGFja2FnZSogbXhmX3Jlc29sdmVfc291cmNlX3BhY2thZ2UoTVhGQ29udGV4dCAqbXhmLCBVSUQgcGFja2FnZV91aWQpCitzdGF0aWMgTVhGUGFja2FnZSogbXhmX3Jlc29sdmVfc291cmNlX3BhY2thZ2UoTVhGQ29udGV4dCAqbXhmLCBVSUQgcGFja2FnZV91bCwgVUlEIHBhY2thZ2VfdWlkKQogewogICAgIE1YRlBhY2thZ2UgKnBhY2thZ2UgPSBOVUxMOwogICAgIGludCBpOwpAQCAtMTY0Nyw3ICsxNzc1LDcgQEAKICAgICAgICAgaWYgKCFwYWNrYWdlKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgaWYgKCFtZW1jbXAocGFja2FnZS0+cGFja2FnZV91aWQsIHBhY2thZ2VfdWlkLCAxNikpCisgICAgICAgIGlmICghbWVtY21wKHBhY2thZ2UtPnBhY2thZ2VfdWwsIHBhY2thZ2VfdWwsIDE2KSAmJiAhbWVtY21wKHBhY2thZ2UtPnBhY2thZ2VfdWlkLCBwYWNrYWdlX3VpZCwgMTYpKQogICAgICAgICAgICAgcmV0dXJuIHBhY2thZ2U7CiAgICAgfQogICAgIHJldHVybiBOVUxMOwpAQCAtMTY5Niw3ICsxODI0LDcgQEAKICAgICAgICAgaWYgKCFjb21wb25lbnQpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBpZiAoIShwYWNrYWdlID0gbXhmX3Jlc29sdmVfc291cmNlX3BhY2thZ2UobXhmLCBjb21wb25lbnQtPnNvdXJjZV9wYWNrYWdlX3VpZCkpKQorICAgICAgICBpZiAoIShwYWNrYWdlID0gbXhmX3Jlc29sdmVfc291cmNlX3BhY2thZ2UobXhmLCBjb21wb25lbnQtPnNvdXJjZV9wYWNrYWdlX3VsLCBjb21wb25lbnQtPnNvdXJjZV9wYWNrYWdlX3VpZCkpKQogICAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgZGVzY3JpcHRvciA9IG14Zl9yZXNvbHZlX3N0cm9uZ19yZWYobXhmLCAmcGFja2FnZS0+ZGVzY3JpcHRvcl9yZWYsIERlc2NyaXB0b3IpOwpAQCAtMTc2Miw3ICsxODkwLDcgQEAKICAgICAgICAgaWYgKCFzb3VyY2VjbGlwKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgaWYgKCEocGh5c2ljYWxfcGFja2FnZSA9IG14Zl9yZXNvbHZlX3NvdXJjZV9wYWNrYWdlKG14Ziwgc291cmNlY2xpcC0+c291cmNlX3BhY2thZ2VfdWlkKSkpCisgICAgICAgIGlmICghKHBoeXNpY2FsX3BhY2thZ2UgPSBteGZfcmVzb2x2ZV9zb3VyY2VfcGFja2FnZShteGYsIHNvdXJjZWNsaXAtPnNvdXJjZV9wYWNrYWdlX3VsLCBzb3VyY2VjbGlwLT5zb3VyY2VfcGFja2FnZV91aWQpKSkKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIG14Zl9hZGRfdW1pZF9tZXRhZGF0YSgmc3QtPm1ldGFkYXRhLCAicmVlbF91bWlkIiwgcGh5c2ljYWxfcGFja2FnZSk7CkBAIC0xODE2LDYgKzE5NDQsNDQgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBteGZfYWRkX21ldGFkYXRhX3N0cmVhbShNWEZDb250ZXh0ICpteGYsIE1YRlRyYWNrICp0cmFjaykKK3sKKyAgICBNWEZTdHJ1Y3R1cmFsQ29tcG9uZW50ICpjb21wb25lbnQgPSBOVUxMOworICAgIGNvbnN0IE1YRkNvZGVjVUwgKmNvZGVjX3VsID0gTlVMTDsKKyAgICBNWEZQYWNrYWdlIHRtcF9wYWNrYWdlOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgajsKKworICAgIGZvciAoaiA9IDA7IGogPCB0cmFjay0+c2VxdWVuY2UtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudDsgaisrKSB7CisgICAgICAgIGNvbXBvbmVudCA9IG14Zl9yZXNvbHZlX3NvdXJjZWNsaXAobXhmLCAmdHJhY2stPnNlcXVlbmNlLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmc1tqXSk7CisgICAgICAgIGlmICghY29tcG9uZW50KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIWNvbXBvbmVudCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0obXhmLT5mYywgTlVMTCk7CisgICAgaWYgKCFzdCkgeworICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGFsbG9jYXRlIG1ldGFkYXRhIHN0cmVhbVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7CisgICAgc3QtPmlkID0gdHJhY2stPnRyYWNrX2lkOworCisgICAgbWVtY3B5KCZ0bXBfcGFja2FnZS5wYWNrYWdlX3VsLCBjb21wb25lbnQtPnNvdXJjZV9wYWNrYWdlX3VsLCAxNik7CisgICAgbWVtY3B5KCZ0bXBfcGFja2FnZS5wYWNrYWdlX3VpZCwgY29tcG9uZW50LT5zb3VyY2VfcGFja2FnZV91aWQsIDE2KTsKKyAgICBteGZfYWRkX3VtaWRfbWV0YWRhdGEoJnN0LT5tZXRhZGF0YSwgImZpbGVfcGFja2FnZV91bWlkIiwgJnRtcF9wYWNrYWdlKTsKKyAgICBpZiAodHJhY2stPm5hbWUgJiYgdHJhY2stPm5hbWVbMF0pCisgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJ0cmFja19uYW1lIiwgdHJhY2stPm5hbWUsIDApOworCisgICAgY29kZWNfdWwgPSBteGZfZ2V0X2NvZGVjX3VsKGZmX214Zl9kYXRhX2RlZmluaXRpb25fdWxzLCAmdHJhY2stPnNlcXVlbmNlLT5kYXRhX2RlZmluaXRpb25fdWwpOworICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJkYXRhX3R5cGUiLCBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoY29kZWNfdWwtPmlkKSwgMCk7CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgbXhmX3BhcnNlX3N0cnVjdHVyYWxfbWV0YWRhdGEoTVhGQ29udGV4dCAqbXhmKQogewogICAgIE1YRlBhY2thZ2UgKm1hdGVyaWFsX3BhY2thZ2UgPSBOVUxMOwpAQCAtMTg4NCwxNiArMjA1MCwyMCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgLyogVE9ETzogaGFuZGxlIG11bHRpcGxlIHNvdXJjZSBjbGlwcyAqLworICAgICAgICAvKiBUT0RPOiBoYW5kbGUgbXVsdGlwbGUgc291cmNlIGNsaXBzLCBvbmx5IGZpbmRzIGZpcnN0IHZhbGlkIHNvdXJjZSBjbGlwICovCisgICAgICAgIGlmKG1hdGVyaWFsX3RyYWNrLT5zZXF1ZW5jZS0+c3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50ID4gMSkKKyAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfV0FSTklORywgIm1hdGVyaWFsIHRyYWNrICVkOiBoYXMgJWQgY29tcG9uZW50c1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWF0ZXJpYWxfdHJhY2stPnRyYWNrX2lkLCBtYXRlcmlhbF90cmFjay0+c2VxdWVuY2UtPnN0cnVjdHVyYWxfY29tcG9uZW50c19jb3VudCk7CisKICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1hdGVyaWFsX3RyYWNrLT5zZXF1ZW5jZS0+c3RydWN0dXJhbF9jb21wb25lbnRzX2NvdW50OyBqKyspIHsKICAgICAgICAgICAgIGNvbXBvbmVudCA9IG14Zl9yZXNvbHZlX3NvdXJjZWNsaXAobXhmLCAmbWF0ZXJpYWxfdHJhY2stPnNlcXVlbmNlLT5zdHJ1Y3R1cmFsX2NvbXBvbmVudHNfcmVmc1tqXSk7CiAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgICAgc291cmNlX3BhY2thZ2UgPSBteGZfcmVzb2x2ZV9zb3VyY2VfcGFja2FnZShteGYsIGNvbXBvbmVudC0+c291cmNlX3BhY2thZ2VfdWlkKTsKKyAgICAgICAgICAgIHNvdXJjZV9wYWNrYWdlID0gbXhmX3Jlc29sdmVfc291cmNlX3BhY2thZ2UobXhmLCBjb21wb25lbnQtPnNvdXJjZV9wYWNrYWdlX3VsLCBjb21wb25lbnQtPnNvdXJjZV9wYWNrYWdlX3VpZCk7CiAgICAgICAgICAgICBpZiAoIXNvdXJjZV9wYWNrYWdlKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19UUkFDRSwgIm1hdGVyaWFsIHRyYWNrICVkOiBubyBjb3JyZXNwb25kaW5nIHNvdXJjZSBwYWNrYWdlIGZvdW5kXG4iLCBtYXRlcmlhbF90cmFjay0+dHJhY2tfaWQpOwotICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNvdXJjZV9wYWNrYWdlLT50cmFja3NfY291bnQ7IGsrKykgewogICAgICAgICAgICAgICAgIGlmICghKHRlbXBfdHJhY2sgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJnNvdXJjZV9wYWNrYWdlLT50cmFja3NfcmVmc1trXSwgVHJhY2spKSkgewpAQCAtMTkxMCw5ICsyMDgwLDI5IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgIm1hdGVyaWFsIHRyYWNrICVkOiBubyBjb3JyZXNwb25kaW5nIHNvdXJjZSB0cmFjayBmb3VuZFxuIiwgbWF0ZXJpYWxfdHJhY2stPnRyYWNrX2lkKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG14Zi0+ZXNzZW5jZV9jb250YWluZXJfZGF0YV9jb3VudDsgaysrKSB7CisgICAgICAgICAgICAgICAgTVhGRXNzZW5jZUNvbnRhaW5lckRhdGEgKmVzc2VuY2VfZGF0YTsKKworICAgICAgICAgICAgICAgIGlmICghKGVzc2VuY2VfZGF0YSA9IG14Zl9yZXNvbHZlX3N0cm9uZ19yZWYobXhmLCAmbXhmLT5lc3NlbmNlX2NvbnRhaW5lcl9kYXRhX3JlZnNba10sIEVzc2VuY2VDb250YWluZXJEYXRhKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19UUkFDRSwgImNvdWxkIG5vdCByZXNvbHZlIGVzc2VuY2UgY29udGFpbmVyIGRhdGEgc3Ryb25nIHJlZlxuIik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1lbWNtcChjb21wb25lbnQtPnNvdXJjZV9wYWNrYWdlX3VsLCBlc3NlbmNlX2RhdGEtPnBhY2thZ2VfdWwsIHNpemVvZihVSUQpKSAmJiAhbWVtY21wKGNvbXBvbmVudC0+c291cmNlX3BhY2thZ2VfdWlkLCBlc3NlbmNlX2RhdGEtPnBhY2thZ2VfdWlkLCBzaXplb2YoVUlEKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc291cmNlX3RyYWNrLT5ib2R5X3NpZCA9IGVzc2VuY2VfZGF0YS0+Ym9keV9zaWQ7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZV90cmFjay0+aW5kZXhfc2lkID0gZXNzZW5jZV9kYXRhLT5pbmRleF9zaWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoc291cmNlX3RyYWNrICYmIGNvbXBvbmVudCkKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoIXNvdXJjZV90cmFjayB8fCAhY29tcG9uZW50KQorICAgICAgICBpZiAoIXNvdXJjZV90cmFjayB8fCAhY29tcG9uZW50IHx8ICFzb3VyY2VfcGFja2FnZSkgeworICAgICAgICAgICAgaWYoKHJldCA9IG14Zl9hZGRfbWV0YWRhdGFfc3RyZWFtKG14ZiwgbWF0ZXJpYWxfdHJhY2spKSkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWxfYW5kX2ZyZWU7CiAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmICghKHNvdXJjZV90cmFjay0+c2VxdWVuY2UgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJnNvdXJjZV90cmFjay0+c2VxdWVuY2VfcmVmLCBTZXF1ZW5jZSkpKSB7CiAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IHJlc29sdmUgc291cmNlIHRyYWNrIHNlcXVlbmNlIHN0cm9uZyByZWZcbiIpOwpAQCAtMTkzMyw3ICsyMTIzLDcgQEAKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZmFpbF9hbmRfZnJlZTsKICAgICAgICAgfQotICAgICAgICBzdC0+aWQgPSBzb3VyY2VfdHJhY2stPnRyYWNrX2lkOworICAgICAgICBzdC0+aWQgPSBtYXRlcmlhbF90cmFjay0+dHJhY2tfaWQ7CiAgICAgICAgIHN0LT5wcml2X2RhdGEgPSBzb3VyY2VfdHJhY2s7CiAKICAgICAgICAgc291cmNlX3BhY2thZ2UtPmRlc2NyaXB0b3IgPSBteGZfcmVzb2x2ZV9zdHJvbmdfcmVmKG14ZiwgJnNvdXJjZV9wYWNrYWdlLT5kZXNjcmlwdG9yX3JlZiwgQW55VHlwZSk7CkBAIC0xOTY2LDcgKzIxNTYsNyBAQAogCiAgICAgICAgIFBSSU5UX0tFWShteGYtPmZjLCAiZGF0YSBkZWZpbml0aW9uICAgdWwiLCBzb3VyY2VfdHJhY2stPnNlcXVlbmNlLT5kYXRhX2RlZmluaXRpb25fdWwpOwogICAgICAgICBjb2RlY191bCA9IG14Zl9nZXRfY29kZWNfdWwoZmZfbXhmX2RhdGFfZGVmaW5pdGlvbl91bHMsICZzb3VyY2VfdHJhY2stPnNlcXVlbmNlLT5kYXRhX2RlZmluaXRpb25fdWwpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBjb2RlY191bC0+aWQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IGNvZGVjX3VsLT5pZDsKIAogICAgICAgICBpZiAoIWRlc2NyaXB0b3IpIHsKICAgICAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfSU5GTywgInNvdXJjZSB0cmFjayAlZDogc3RyZWFtICVkLCBubyBkZXNjcmlwdG9yIGZvdW5kXG4iLCBzb3VyY2VfdHJhY2stPnRyYWNrX2lkLCBzdC0+aW5kZXgpOwpAQCAtMTk5MCwxNCArMjE4MCwxNCBAQAogCiAgICAgICAgIC8qIFRPRE86IGRyb3AgUGljdHVyZUVzc2VuY2VDb2RpbmcgYW5kIFNvdW5kRXNzZW5jZUNvbXByZXNzaW9uLCBvbmx5IGNoZWNrIEVzc2VuY2VDb250YWluZXIgKi8KICAgICAgICAgY29kZWNfdWwgPSBteGZfZ2V0X2NvZGVjX3VsKGZmX214Zl9jb2RlY191bHMsICZkZXNjcmlwdG9yLT5lc3NlbmNlX2NvZGVjX3VsKTsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IChlbnVtIEFWQ29kZWNJRCljb2RlY191bC0+aWQ7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IChlbnVtIEFWQ29kZWNJRCljb2RlY191bC0+aWQ7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKICAgICAgICAgICAgIGNvZGVjX3VsID0gbXhmX2dldF9jb2RlY191bChmZl9teGZfY29kZWNfdWxzLCAmZGVzY3JpcHRvci0+Y29kZWNfdWwpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IChlbnVtIEFWQ29kZWNJRCljb2RlY191bC0+aWQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gKGVudW0gQVZDb2RlY0lEKWNvZGVjX3VsLT5pZDsKICAgICAgICAgfQogCiAgICAgICAgIGF2X2xvZyhteGYtPmZjLCBBVl9MT0dfVkVSQk9TRSwgIiVzOiBVbml2ZXJzYWwgTGFiZWw6ICIsCi0gICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkpOwogICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMTY7IGsrKykgewogICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19WRVJCT1NFLCAiJS4yeCIsCiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZXNzZW5jZV9jb2RlY191bFtrXSk7CkBAIC0yMDA5LDE5ICsyMTk5LDIxIEBACiAgICAgICAgIG14Zl9hZGRfdW1pZF9tZXRhZGF0YSgmc3QtPm1ldGFkYXRhLCAiZmlsZV9wYWNrYWdlX3VtaWQiLCBzb3VyY2VfcGFja2FnZSk7CiAgICAgICAgIGlmIChzb3VyY2VfcGFja2FnZS0+bmFtZSAmJiBzb3VyY2VfcGFja2FnZS0+bmFtZVswXSkKICAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJmaWxlX3BhY2thZ2VfbmFtZSIsIHNvdXJjZV9wYWNrYWdlLT5uYW1lLCAwKTsKKyAgICAgICAgaWYgKG1hdGVyaWFsX3RyYWNrLT5uYW1lICYmIG1hdGVyaWFsX3RyYWNrLT5uYW1lWzBdKQorICAgICAgICAgICAgYXZfZGljdF9zZXQoJnN0LT5tZXRhZGF0YSwgInRyYWNrX25hbWUiLCBtYXRlcmlhbF90cmFjay0+bmFtZSwgMCk7CiAKICAgICAgICAgbXhmX3BhcnNlX3BoeXNpY2FsX3NvdXJjZV9wYWNrYWdlKG14Ziwgc291cmNlX3RyYWNrLCBzdCk7CiAKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgICAgIHNvdXJjZV90cmFjay0+aW50cmFfb25seSA9IG14Zl9pc19pbnRyYV9vbmx5KGRlc2NyaXB0b3IpOwogICAgICAgICAgICAgY29udGFpbmVyX3VsID0gbXhmX2dldF9jb2RlY191bChteGZfcGljdHVyZV9lc3NlbmNlX2NvbnRhaW5lcl91bHMsIGVzc2VuY2VfY29udGFpbmVyX3VsKTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGNvbnRhaW5lcl91bC0+aWQ7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoID0gZGVzY3JpcHRvci0+d2lkdGg7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGRlc2NyaXB0b3ItPmhlaWdodDsgLyogRmllbGQgaGVpZ2h0LCBub3QgZnJhbWUgaGVpZ2h0ICovCisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBjb250YWluZXJfdWwtPmlkOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IGRlc2NyaXB0b3ItPndpZHRoOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBkZXNjcmlwdG9yLT5oZWlnaHQ7IC8qIEZpZWxkIGhlaWdodCwgbm90IGZyYW1lIGhlaWdodCAqLwogICAgICAgICAgICAgc3dpdGNoIChkZXNjcmlwdG9yLT5mcmFtZV9sYXlvdXQpIHsKICAgICAgICAgICAgICAgICBjYXNlIEZ1bGxGcmFtZToKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZpZWxkX29yZGVyID0gQVZfRklFTERfUFJPR1JFU1NJVkU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgT25lRmllbGQ6CiAgICAgICAgICAgICAgICAgICAgIC8qIEV2ZXJ5IG90aGVyIGxpbmUgaXMgc3RvcmVkIGFuZCBuZWVkcyB0byBiZSBkdXBsaWNhdGVkLiAqLwpAQCAtMjAzMiw0NCArMjIyNCw3MCBAQAogICAgICAgICAgICAgICAgIGNhc2UgTWl4ZWRGaWVsZHM6CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU2VnbWVudGVkRnJhbWU6Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9QUk9HUkVTU0lWRTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1BST0dSRVNTSVZFOwogICAgICAgICAgICAgICAgIGNhc2UgU2VwYXJhdGVGaWVsZHM6Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVzY3JpcHRvci0+ZmllbGRfZG9taW5hbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVhGX1RGRjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9UVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1YRl9CRkY6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmZpZWxkX29yZGVyID0gQVZfRklFTERfQkI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShteGYtPmZjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWVsZCBkb21pbmFuY2UgJWQgc3VwcG9ydCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZmllbGRfZG9taW5hbmNlKTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyB3ZSBhbHJlYWR5IGhhdmUgbWFueSBzYW1wbGVzIHdpdGggZmllbGRfZG9taW5hbmNlID09IHVua25vd24KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0RFQlVHLCAidmlkZW9fbGluZV9tYXA6ICglZCwgJWQpLCBmaWVsZF9kb21pbmFuY2U6ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+dmlkZW9fbGluZV9tYXBbMF0sIGRlc2NyaXB0b3ItPnZpZGVvX2xpbmVfbWFwWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZmllbGRfZG9taW5hbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkZXNjcmlwdG9yLT52aWRlb19saW5lX21hcFswXSA+IDApICYmIChkZXNjcmlwdG9yLT52aWRlb19saW5lX21hcFsxXSA+IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRlY3QgY29kZWQgZmllbGQgb3JkZXIgZnJvbSBWaWRlb0xpbmVNYXA6CisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgKGV2ZW4sIGV2ZW4pID0+IGJvdHRvbSBmaWVsZCBjb2RlZCBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICogIChldmVuLCBvZGQpICA9PiB0b3AgZmllbGQgY29kZWQgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAqICAob2RkLCBldmVuKSAgPT4gdG9wIGZpZWxkIGNvZGVkIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgKiAgKG9kZCwgb2RkKSAgID0+IGJvdHRvbSBmaWVsZCBjb2RlZCBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRlc2NyaXB0b3ItPnZpZGVvX2xpbmVfbWFwWzBdICsgZGVzY3JpcHRvci0+dmlkZW9fbGluZV9tYXBbMV0pICUgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVzY3JpcHRvci0+ZmllbGRfZG9taW5hbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVhGX0ZJRUxEX0RPTUlOQU5DRV9ERUZBVUxUOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1YRl9GSUVMRF9ET01JTkFOQ0VfRkY6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZpZWxkX29yZGVyID0gQVZfRklFTERfVFQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNWEZfRklFTERfRE9NSU5BTkNFX0ZMOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX1RCOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUobXhmLT5mYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmllbGQgZG9taW5hbmNlICVkIHN1cHBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmZpZWxkX2RvbWluYW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlc2NyaXB0b3ItPmZpZWxkX2RvbWluYW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1YRl9GSUVMRF9ET01JTkFOQ0VfREVGQVVMVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNWEZfRklFTERfRE9NSU5BTkNFX0ZGOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5maWVsZF9vcmRlciA9IEFWX0ZJRUxEX0JCOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVhGX0ZJRUxEX0RPTUlOQU5DRV9GTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZmllbGRfb3JkZXIgPSBBVl9GSUVMRF9CVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKG14Zi0+ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpZWxkIGRvbWluYW5jZSAlZCBzdXBwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5maWVsZF9kb21pbmFuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvKiBUdXJuIGZpZWxkIGhlaWdodCBpbnRvIGZyYW1lIGhlaWdodC4gKi8KLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgKj0gMjsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgKj0gMjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19JTkZPLCAiVW5rbm93biBmcmFtZSBsYXlvdXQgdHlwZTogJWRcbiIsIGRlc2NyaXB0b3ItPmZyYW1lX2xheW91dCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTykgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IGRlc2NyaXB0b3ItPnBpeF9mbXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPKSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBkZXNjcmlwdG9yLT5waXhfZm10OworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmZvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgcGl4X2ZtdF91bCA9IG14Zl9nZXRfY29kZWNfdWwoZmZfbXhmX3BpeGVsX2Zvcm1hdF91bHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yLT5lc3NlbmNlX2NvZGVjX3VsKTsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gKGVudW0gQVZQaXhlbEZvcm1hdClwaXhfZm10X3VsLT5pZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gbXhmX2dldF9jb2RlY191bChmZl9teGZfY29kZWNfdGFnX3VscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY3JpcHRvci0+ZXNzZW5jZV9jb2RlY191bCktPmlkOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmNvZGVjX3RhZykgeworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IChlbnVtIEFWUGl4ZWxGb3JtYXQpcGl4X2ZtdF91bC0+aWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmZvcm1hdD09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBteGZfZ2V0X2NvZGVjX3VsKGZmX214Zl9jb2RlY190YWdfdWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yLT5lc3NlbmNlX2NvZGVjX3VsKS0+aWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCBmaWxlcyBjcmVhdGVkIGJlZm9yZSBSUDIyNHYxMCBieSBkZWZhdWx0aW5nIHRvIFVZVlk0MjIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdWJzYW1wbGluZyBpcyA0OjI6MiBhbmQgY29tcG9uZW50IGRlcHRoIGlzIDgtYml0ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3ItPmhvcml6X3N1YnNhbXBsaW5nID09IDIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+dmVydF9zdWJzYW1wbGluZyA9PSAxICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmNvbXBvbmVudF9kZXB0aCA9PSA4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfVVlWWTQyMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1VZVlk0MjI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC0yMDg0LDE2ICsyMzAyLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+YXNwZWN0X3JhdGlvLm51bSAmJiBkZXNjcmlwdG9yLT5hc3BlY3RfcmF0aW8uZGVuKQogICAgICAgICAgICAgICAgIHN0LT5kaXNwbGF5X2FzcGVjdF9yYXRpbyA9IGRlc2NyaXB0b3ItPmFzcGVjdF9yYXRpbzsKLSAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICAgICAgY29udGFpbmVyX3VsID0gbXhmX2dldF9jb2RlY191bChteGZfc291bmRfZXNzZW5jZV9jb250YWluZXJfdWxzLCBlc3NlbmNlX2NvbnRhaW5lcl91bCk7CiAgICAgICAgICAgICAvKiBPbmx5IG92ZXJ3cml0ZSBleGlzdGluZyBjb2RlYyBJRCBpZiBpdCBpcyB1bnNldCBvciBBLWxhdywgd2hpY2ggaXMgdGhlIGRlZmF1bHQgYWNjb3JkaW5nIHRvIFNNUFRFIFJQIDIyNC4gKi8KLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUgfHwgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0FMQVcgJiYgKGVudW0gQVZDb2RlY0lEKWNvbnRhaW5lcl91bC0+aWQgIT0gQVZfQ09ERUNfSURfTk9ORSkpCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IChlbnVtIEFWQ29kZWNJRCljb250YWluZXJfdWwtPmlkOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGRlc2NyaXB0b3ItPmNoYW5uZWxzOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBkZXNjcmlwdG9yLT5iaXRzX3Blcl9zYW1wbGU7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FIHx8IChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9BTEFXICYmIChlbnVtIEFWQ29kZWNJRCljb250YWluZXJfdWwtPmlkICE9IEFWX0NPREVDX0lEX05PTkUpKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSAoZW51bSBBVkNvZGVjSUQpY29udGFpbmVyX3VsLT5pZDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBkZXNjcmlwdG9yLT5jaGFubmVsczsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gZGVzY3JpcHRvci0+Yml0c19wZXJfc2FtcGxlOwogCiAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci0+c2FtcGxlX3JhdGUuZGVuID4gMCkgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBkZXNjcmlwdG9yLT5zYW1wbGVfcmF0ZS5udW0gLyBkZXNjcmlwdG9yLT5zYW1wbGVfcmF0ZS5kZW47CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGRlc2NyaXB0b3ItPnNhbXBsZV9yYXRlLm51bSAvIGRlc2NyaXB0b3ItPnNhbXBsZV9yYXRlLmRlbjsKICAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgZGVzY3JpcHRvci0+c2FtcGxlX3JhdGUuZGVuLCBkZXNjcmlwdG9yLT5zYW1wbGVfcmF0ZS5udW0pOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX1dBUk5JTkcsICJpbnZhbGlkIHNhbXBsZSByYXRlICglZC8lZCkgIgpAQCAtMjExMCwyMCArMjMyOCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlKTsKIAogICAgICAgICAgICAgLyogVE9ETzogaW1wbGVtZW50IEFWX0NPREVDX0lEX1JBV0FVRElPICovCi0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZMRSkgewogICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLT5iaXRzX3Blcl9zYW1wbGUgPiAxNiAmJiBkZXNjcmlwdG9yLT5iaXRzX3Blcl9zYW1wbGUgPD0gMjQpCi0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEU7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVzY3JpcHRvci0+Yml0c19wZXJfc2FtcGxlID09IDMyKQotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkxFOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZCRSkgeworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkxFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZCRSkgewogICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLT5iaXRzX3Blcl9zYW1wbGUgPiAxNiAmJiBkZXNjcmlwdG9yLT5iaXRzX3Blcl9zYW1wbGUgPD0gMjQpCi0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0QkU7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzI0QkU7CiAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVzY3JpcHRvci0+Yml0c19wZXJfc2FtcGxlID09IDMyKQotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkJFOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMikgeworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MzMkJFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMikgewogICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSkgeworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSkgewogICAgICAgICAgICAgaW50IGNvZGVjX2lkID0gbXhmX2dldF9jb2RlY191bChteGZfZGF0YV9lc3NlbmNlX2NvbnRhaW5lcl91bHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzc2VuY2VfY29udGFpbmVyX3VsKS0+aWQ7CiAgICAgICAgICAgICBpZiAoY29kZWNfaWQgPj0gMCAmJgpAQCAtMjEzMywxOSArMjM1MSwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChkZXNjcmlwdG9yLT5leHRyYWRhdGEpIHsKLSAgICAgICAgICAgIGlmICghZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgZGVzY3JpcHRvci0+ZXh0cmFkYXRhX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBkZXNjcmlwdG9yLT5leHRyYWRhdGEsIGRlc2NyaXB0b3ItPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICghZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgZGVzY3JpcHRvci0+ZXh0cmFkYXRhX3NpemUpKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBkZXNjcmlwdG9yLT5leHRyYWRhdGEsIGRlc2NyaXB0b3ItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKICAgICAgICAgICAgIGludCBjb2RlZF93aWR0aCA9IG14Zl9nZXRfY29kZWNfdWwobXhmX2ludHJhX29ubHlfcGljdHVyZV9jb2RlZF93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3ItPmVzc2VuY2VfY29kZWNfdWwpLT5pZDsKICAgICAgICAgICAgIGlmIChjb2RlZF93aWR0aCkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoID0gY29kZWRfd2lkdGg7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IGNvZGVkX3dpZHRoOwogICAgICAgICAgICAgcmV0ID0gZmZfZ2VuZXJhdGVfYXZjaV9leHRyYWRhdGEoc3QpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9EQVRBICYmICgqZXNzZW5jZV9jb250YWluZXJfdWwpWzE1XSA+IDB4MDEpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfREFUQSAmJiAoKmVzc2VuY2VfY29udGFpbmVyX3VsKVsxNV0gPiAweDAxKSB7CiAgICAgICAgICAgICAvKiBUT0RPOiBkZWNvZGUgdGltZXN0YW1wcyAqLwogICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX1RJTUVTVEFNUFM7CiAgICAgICAgIH0KQEAgLTIxNTYsNyArMjM3NCw3IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBteGZfdGltZXN0YW1wX3RvX3N0cih1aW50NjRfdCB0aW1lc3RhbXAsIGNoYXIgKipzdHIpCitzdGF0aWMgaW50NjRfdCBteGZfdGltZXN0YW1wX3RvX2ludDY0KHVpbnQ2NF90IHRpbWVzdGFtcCkKIHsKICAgICBzdHJ1Y3QgdG0gdGltZSA9IHsgMCB9OwogICAgIHRpbWUudG1feWVhciA9ICh0aW1lc3RhbXAgPj4gNDgpIC0gMTkwMDsKQEAgLTIxNzUsMTMgKzIzOTMsNyBAQAogICAgIHRpbWUudG1fbWluICA9IGF2X2NsaXAodGltZS50bV9taW4sICAwLCA1OSk7CiAgICAgdGltZS50bV9zZWMgID0gYXZfY2xpcCh0aW1lLnRtX3NlYywgIDAsIDU5KTsKIAotICAgICpzdHIgPSBhdl9tYWxsb2N6KDMyKTsKLSAgICBpZiAoISpzdHIpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgaWYgKCFzdHJmdGltZSgqc3RyLCAzMiwgIiVZLSVtLSVkICVIOiVNOiVTIiwgJnRpbWUpKQotICAgICAgICAoKnN0cilbMF0gPSAnXDAnOwotCi0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIChpbnQ2NF90KWF2X3RpbWVnbSgmdGltZSkgKiAxMDAwMDAwOwogfQogCiAjZGVmaW5lIFNFVF9TVFJfTUVUQURBVEEocGIsIG5hbWUsIHN0cikgZG8geyBcCkBAIC0yMTk5LDkgKzI0MTEsOCBAQAogCiAjZGVmaW5lIFNFVF9UU19NRVRBREFUQShwYiwgbmFtZSwgdmFyLCBzdHIpIGRvIHsgXAogICAgIHZhciA9IGF2aW9fcmI2NChwYik7IFwKLSAgICBpZiAoKHJldCA9IG14Zl90aW1lc3RhbXBfdG9fc3RyKHZhciwgJnN0cikpIDwgMCkgXAorICAgIGlmICgocmV0ID0gYXZwcml2X2RpY3Rfc2V0X3RpbWVzdGFtcCgmcy0+bWV0YWRhdGEsIG5hbWUsIG14Zl90aW1lc3RhbXBfdG9faW50NjQodmFyKSkgPCAwKSkgXAogICAgICAgICByZXR1cm4gcmV0OyBcCi0gICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCBuYW1lLCBzdHIsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsgXAogfSB3aGlsZSAoMCkKIAogc3RhdGljIGludCBteGZfcmVhZF9pZGVudGlmaWNhdGlvbl9tZXRhZGF0YSh2b2lkICphcmcsIEFWSU9Db250ZXh0ICpwYiwgaW50IHRhZywgaW50IHNpemUsIFVJRCBfdWlkLCBpbnQ2NF90IGtsdl9vZmZzZXQpCkBAIC0yMjkwLDYgKzI1MDEsNyBAQAogICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwYywweDAwIH0sIG14Zl9yZWFkX3B1bGxkb3duX2NvbXBvbmVudCwgc2l6ZW9mKE1YRlB1bGxkb3duQ29tcG9uZW50KSwgUHVsbGRvd25Db21wb25lbnQgfSwKICAgICB7IHsgMHgwNiwweDBlLDB4MmIsMHgzNCwweDAyLDB4NTMsMHgwMSwweDAxLDB4MGQsMHgwMSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDAsMHgwMCB9LCBteGZfcmVhZF9jcnlwdG9ncmFwaGljX2NvbnRleHQsIHNpemVvZihNWEZDcnlwdG9Db250ZXh0KSwgQ3J5cHRvQ29udGV4dCB9LAogICAgIHsgeyAweDA2LDB4MGUsMHgyYiwweDM0LDB4MDIsMHg1MywweDAxLDB4MDEsMHgwZCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MTAsMHgwMSwweDAwIH0sIG14Zl9yZWFkX2luZGV4X3RhYmxlX3NlZ21lbnQsIHNpemVvZihNWEZJbmRleFRhYmxlU2VnbWVudCksIEluZGV4VGFibGVTZWdtZW50IH0sCisgICAgeyB7IDB4MDYsMHgwZSwweDJiLDB4MzQsMHgwMiwweDUzLDB4MDEsMHgwMSwweDBkLDB4MDEsMHgwMSwweDAxLDB4MDEsMHgwMSwweDIzLDB4MDAgfSwgbXhmX3JlYWRfZXNzZW5jZV9jb250YWluZXJfZGF0YSwgc2l6ZW9mKE1YRkVzc2VuY2VDb250YWluZXJEYXRhKSwgRXNzZW5jZUNvbnRhaW5lckRhdGEgfSwKICAgICB7IHsgMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCB9LCBOVUxMLCAwLCBBbnlUeXBlIH0sCiB9OwogCkBAIC0yNDgzLDcgKzI2OTUsNyBAQAogICAgICAgICAvKiByZW1lbWJlciB3aGVyZSB3ZSB3ZXJlIHNvIHdlIGRvbid0IGVuZCB1cCBzZWVraW5nIGZ1cnRoZXIgYmFjayB0aGFuIHRoaXMgKi8KICAgICAgICAgbXhmLT5sYXN0X2ZvcndhcmRfdGVsbCA9IGF2aW9fdGVsbChwYik7CiAKLSAgICAgICAgaWYgKCFwYi0+c2Vla2FibGUpIHsKKyAgICAgICAgaWYgKCEocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpKSB7CiAgICAgICAgICAgICBhdl9sb2cobXhmLT5mYywgQVZfTE9HX0lORk8sICJmaWxlIGlzIG5vdCBzZWVrYWJsZSAtIG5vdCBwYXJzaW5nIEZvb3RlclBhcnRpdGlvblxuIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KQEAgLTI1NjAsNiArMjc3MiwyMSBAQAogICAgIHJldHVybiBjb2RlY19pZCA+PSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgJiYgY29kZWNfaWQgPCBBVl9DT0RFQ19JRF9QQ01fUzI0REFVRDsKIH0KIAorc3RhdGljIEFWU3RyZWFtKiBteGZfZ2V0X29wYXRvbV9zdHJlYW0oTVhGQ29udGV4dCAqbXhmKQoreworICAgIGludCBpOworCisgICAgaWYgKG14Zi0+b3AgIT0gT1BBdG9tKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBteGYtPmZjLT5uYl9zdHJlYW1zOyBpKyspIHsKKyAgICAgICAgaWYgKG14Zi0+ZmMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9EQVRBKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiBteGYtPmZjLT5zdHJlYW1zW2ldOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKwogLyoqCiAgKiBEZWFsIHdpdGggdGhlIGNhc2Ugd2hlcmUgZm9yIHNvbWUgYXVkaW8gYXRvbXMgRWRpdFVuaXRCeXRlQ291bnQgaXMKICAqIHZlcnkgc21hbGwgKDIsIDQuLikuIEluIHRob3NlIGNhc2VzIHdlIHNob3VsZCByZWFkIG1vcmUgdGhhbiBvbmUKQEAgLTI1NjgsMTYgKzI3OTUsMTcgQEAKIHN0YXRpYyB2b2lkIG14Zl9oYW5kbGVfc21hbGxfZXViYyhBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOworICAgIE1YRlRyYWNrICp0cmFjazsKIAogICAgIC8qIGFzc3VtaW5nIG5vbi1PUEF0b20gPT0gZnJhbWUgd3JhcHBlZAogICAgICAqIG5vIHNhbmUgd3JpdGVyIHdvdWxkIHdyYXAgMiBieXRlIFBDTSBwYWNrZXRzIHdpdGggMjAgYnl0ZSBoZWFkZXJzLi4gKi8KLSAgICBpZiAobXhmLT5vcCAhPSBPUEF0b20pCisgICAgQVZTdHJlYW0gKnN0ID0gbXhmX2dldF9vcGF0b21fc3RyZWFtKG14Zik7CisgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuOwogCiAgICAgLyogZXhwZWN0IFBDTSB3aXRoIGV4YWN0bHkgb25lIGluZGV4IHRhYmxlIHNlZ21lbnQgYW5kIGEgc21hbGwgKDwgMzIpIEVVQkMgKi8KLSAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fAotICAgICAgICAhaXNfcGNtKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCkgICAgICAgICAgICAgICAgfHwKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyAgICAgICAgIHx8CisgICAgICAgICFpc19wY20oc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkgICAgICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICBteGYtPm5iX2luZGV4X3RhYmxlcyAhPSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgbXhmLT5pbmRleF90YWJsZXNbMF0ubmJfc2VnbWVudHMgIT0gMSAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgIG14Zi0+aW5kZXhfdGFibGVzWzBdLnNlZ21lbnRzWzBdLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCA+PSAzMikKQEAgLTI1ODcsNyArMjgxNSw4IEBACiAgICAgLyogVE9ETzogV2UgY291bGQgY29tcHV0ZSB0aGlzIGZyb20gdGhlIHJhdGlvIGJldHdlZW4gdGhlIGF1ZGlvCiAgICAgICogICAgICAgYW5kIHZpZGVvIGVkaXQgcmF0ZXMgZm9yIDQ4IGtIeiBOVFNDIHdlIGNvdWxkIHVzZSB0aGUKICAgICAgKiAgICAgICAxODAyLTE4MDItMTgwMi0xODAyLTE4MDEgcGF0dGVybi4gKi8KLSAgICBteGYtPmVkaXRfdW5pdHNfcGVyX3BhY2tldCA9IDE5MjA7CisgICAgdHJhY2sgPSBzdC0+cHJpdl9kYXRhOworICAgIG14Zi0+ZWRpdF91bml0c19wZXJfcGFja2V0ID0gRkZNQVgoMSwgdHJhY2stPmVkaXRfcmF0ZS5udW0gLyB0cmFjay0+ZWRpdF9yYXRlLmRlbiAvIDI1KTsKIH0KIAogLyoqCkBAIC0yNjAyLDExICsyODMxLDEyIEBACiAgICAgaW50IGVzc2VuY2VfcGFydGl0aW9uX2NvdW50ID0gMDsKICAgICBpbnQgaSwgcmV0OwogCi0gICAgaWYgKG14Zi0+b3AgIT0gT1BBdG9tKQorICAgIHN0ID0gbXhmX2dldF9vcGF0b21fc3RyZWFtKG14Zik7CisgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAvKiBUT0RPOiBzdXBwb3J0IHJhdyB2aWRlbyB3aXRob3V0IGEgaW5kZXggaWYgdGhleSBleGlzdCAqLwotICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEgfHwgcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPIHx8ICFpc19wY20ocy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkKSkKKyAgICAvKiBUT0RPOiBzdXBwb3J0IHJhdyB2aWRlbyB3aXRob3V0IGFuIGluZGV4IGlmIHRoZXkgZXhpc3QgKi8KKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTyB8fCAhaXNfcGNtKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIC8qIGNoZWNrIGlmIGZpbGUgYWxyZWFkeSBoYXMgYSBJbmRleFRhYmxlU2VnbWVudCAqLwpAQCAtMjYzNywxMCArMjg2Nyw5IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgc3QgPSBzLT5zdHJlYW1zWzBdOwogICAgIHNlZ21lbnQtPnR5cGUgPSBJbmRleFRhYmxlU2VnbWVudDsKICAgICAvKiBzdHJlYW0gd2lsbCBiZSB0cmVhdGVkIGFzIHNtYWxsIEVkaXRVbml0Qnl0ZUNvdW50ICovCi0gICAgc2VnbWVudC0+ZWRpdF91bml0X2J5dGVfY291bnQgPSAoYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMpID4+IDM7CisgICAgc2VnbWVudC0+ZWRpdF91bml0X2J5dGVfY291bnQgPSAoYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpID4+IDM7CiAgICAgc2VnbWVudC0+aW5kZXhfc3RhcnRfcG9zaXRpb24gPSAwOwogICAgIHNlZ21lbnQtPmluZGV4X2R1cmF0aW9uID0gcy0+c3RyZWFtc1swXS0+ZHVyYXRpb247CiAgICAgc2VnbWVudC0+aW5kZXhfc2lkID0gcC0+aW5kZXhfc2lkOwpAQCAtMjY1NSw3ICsyODg0LDcgQEAKICAgICBpbnQ2NF90IGZpbGVfc2l6ZSwgbWF4X3JpcF9sZW5ndGgsIG1pbl9yaXBfbGVuZ3RoOwogICAgIEtMVlBhY2tldCBrbHY7CiAKLSAgICBpZiAoIXMtPnBiLT5zZWVrYWJsZSkKKyAgICBpZiAoIShzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpCiAgICAgICAgIHJldHVybjsKIAogICAgIGZpbGVfc2l6ZSA9IGF2aW9fc2l6ZShzLT5wYik7CkBAIC0yNzM1LDcgKzI5NjQsOCBAQAogICAgICAgICBpZiAoSVNfS0xWX0tFWShrbHYua2V5LCBteGZfZW5jcnlwdGVkX3RyaXBsZXRfa2V5KSB8fAogICAgICAgICAgICAgSVNfS0xWX0tFWShrbHYua2V5LCBteGZfZXNzZW5jZV9lbGVtZW50X2tleSkgfHwKICAgICAgICAgICAgIElTX0tMVl9LRVkoa2x2LmtleSwgbXhmX2F2aWRfZXNzZW5jZV9lbGVtZW50X2tleSkgfHwKLSAgICAgICAgICAgIElTX0tMVl9LRVkoa2x2LmtleSwgbXhmX3N5c3RlbV9pdGVtX2tleSkpIHsKKyAgICAgICAgICAgIElTX0tMVl9LRVkoa2x2LmtleSwgbXhmX3N5c3RlbV9pdGVtX2tleV9jcCkgfHwKKyAgICAgICAgICAgIElTX0tMVl9LRVkoa2x2LmtleSwgbXhmX3N5c3RlbV9pdGVtX2tleV9nYykpIHsKIAogICAgICAgICAgICAgaWYgKCFteGYtPmN1cnJlbnRfcGFydGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKG14Zi0+ZmMsIEFWX0xPR19FUlJPUiwgImZvdW5kIGVzc2VuY2UgcHJpb3IgdG8gZmlyc3QgUGFydGl0aW9uUGFja1xuIik7CkBAIC0yNzQ5LDggKzI5NzksOCBAQAogICAgICAgICAgICAgICAgICAqICAgICAgIGZvciBPUEF0b20gd2Ugc3RpbGwgbmVlZCB0aGUgYWN0dWFsIGVzc2VuY2Vfb2Zmc2V0IHRob3VnaCAodGhlIEtMJ3MgbGVuZ3RoIGNhbiB2YXJ5KQogICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgIGludDY0X3Qgb3AxYV9lc3NlbmNlX29mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgIHJvdW5kX3RvX2thZyhteGYtPmN1cnJlbnRfcGFydGl0aW9uLT50aGlzX3BhcnRpdGlvbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5wYWNrX2xlbmd0aCwgICAgICAgbXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+a2FnX3NpemUpICsKKyAgICAgICAgICAgICAgICAgICAgbXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+dGhpc19wYXJ0aXRpb24gKworICAgICAgICAgICAgICAgICAgICByb3VuZF90b19rYWcobXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+cGFja19sZW5ndGgsICAgICAgIG14Zi0+Y3VycmVudF9wYXJ0aXRpb24tPmthZ19zaXplKSArCiAgICAgICAgICAgICAgICAgICAgIHJvdW5kX3RvX2thZyhteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5oZWFkZXJfYnl0ZV9jb3VudCwgbXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+a2FnX3NpemUpICsKICAgICAgICAgICAgICAgICAgICAgcm91bmRfdG9fa2FnKG14Zi0+Y3VycmVudF9wYXJ0aXRpb24tPmluZGV4X2J5dGVfY291bnQsICBteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5rYWdfc2l6ZSk7CiAKQEAgLTI3NjIsNyArMjk5MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICBteGYtPmN1cnJlbnRfcGFydGl0aW9uLT5lc3NlbmNlX2xlbmd0aCA9IGtsdi5sZW5ndGg7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLyogTk9URTogb3AxYV9lc3NlbmNlX29mZnNldCBtYXkgYmUgbGVzcyB0aGFuIHRvIGtsdi5vZmZzZXQgKEMwMDIzUzAxLm14ZikgICovCi0gICAgICAgICAgICAgICAgICAgIG14Zi0+Y3VycmVudF9wYXJ0aXRpb24tPmVzc2VuY2Vfb2Zmc2V0ID0gb3AxYV9lc3NlbmNlX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKElTX0tMVl9LRVkoa2x2LmtleSwgbXhmX3N5c3RlbV9pdGVtX2tleV9jcCkgfHwgSVNfS0xWX0tFWShrbHYua2V5LCBteGZfc3lzdGVtX2l0ZW1fa2V5X2djKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG14Zi0+Y3VycmVudF9wYXJ0aXRpb24tPmVzc2VuY2Vfb2Zmc2V0ID0ga2x2Lm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbXhmLT5jdXJyZW50X3BhcnRpdGlvbi0+ZXNzZW5jZV9vZmZzZXQgPSBvcDFhX2Vzc2VuY2Vfb2Zmc2V0OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMjgzMyw2ICszMDY2LDQyIEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIE1YRkluZGV4VGFibGUgKm14Zl9maW5kX2luZGV4X3RhYmxlKE1YRkNvbnRleHQgKm14ZiwgaW50IGluZGV4X3NpZCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbXhmLT5uYl9pbmRleF90YWJsZXM7IGkrKykKKyAgICAgICAgaWYgKG14Zi0+aW5kZXhfdGFibGVzW2ldLmluZGV4X3NpZCA9PSBpbmRleF9zaWQpCisgICAgICAgICAgICByZXR1cm4gJm14Zi0+aW5kZXhfdGFibGVzW2ldOworICAgIHJldHVybiBOVUxMOworfQorCisvKiBHZXQgdGhlIGVkaXQgdW5pdCBvZiB0aGUgbmV4dCBwYWNrZXQgZnJvbSBjdXJyZW50X29mZnNldCBpbiBhIHRyYWNrLiBUaGUgcmV0dXJuZWQgZWRpdCB1bml0IGNhbiBiZSBvcmlnaW5hbF9kdXJhdGlvbiBhcyB3ZWxsISAqLworc3RhdGljIGludCBteGZfZ2V0X25leHRfdHJhY2tfZWRpdF91bml0KE1YRkNvbnRleHQgKm14ZiwgTVhGVHJhY2sgKnRyYWNrLCBpbnQ2NF90IGN1cnJlbnRfb2Zmc2V0LCBpbnQ2NF90ICplZGl0X3VuaXRfb3V0KQoreworICAgIGludDY0X3QgYSwgYiwgbSwgb2Zmc2V0OworICAgIE1YRkluZGV4VGFibGUgKnQgPSBteGZfZmluZF9pbmRleF90YWJsZShteGYsIHRyYWNrLT5pbmRleF9zaWQpOworCisgICAgaWYgKCF0IHx8IHRyYWNrLT5vcmlnaW5hbF9kdXJhdGlvbiA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBhID0gLTE7CisgICAgYiA9IHRyYWNrLT5vcmlnaW5hbF9kdXJhdGlvbjsKKworICAgIHdoaWxlIChiIC0gYSA+IDEpIHsKKyAgICAgICAgbSA9IChhICsgYikgPj4gMTsKKyAgICAgICAgaWYgKG14Zl9lZGl0X3VuaXRfYWJzb2x1dGVfb2Zmc2V0KG14ZiwgdCwgbSwgTlVMTCwgJm9mZnNldCwgMCkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAob2Zmc2V0IDwgY3VycmVudF9vZmZzZXQpCisgICAgICAgICAgICBhID0gbTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYiA9IG07CisgICAgfQorCisgICAgKmVkaXRfdW5pdF9vdXQgPSBiOworCisgICAgcmV0dXJuIDA7Cit9CisKIC8qKgogICogU2V0cyBteGYtPmN1cnJlbnRfZWRpdF91bml0IGJhc2VkIG9uIHdoYXQgb2Zmc2V0IHdlJ3JlIGN1cnJlbnRseSBhdC4KICAqIEByZXR1cm4gbmV4dF9vZnMgaWYgT0ssIDwwIG9uIGVycm9yCkBAIC0yODUwLDcgKzMxMTksNyBAQAogICAgIC8qIGZpbmQgbXhmLT5jdXJyZW50X2VkaXRfdW5pdCBzbyB0aGF0IHRoZSBuZXh0IGVkaXQgdW5pdCBzdGFydHMgYWhlYWQgb2YgY3VycmVudF9vZmZzZXQgKi8KICAgICB3aGlsZSAobXhmLT5jdXJyZW50X2VkaXRfdW5pdCA+PSAwKSB7CiAgICAgICAgIGlmIChteGZfZWRpdF91bml0X2Fic29sdXRlX29mZnNldChteGYsIHQsIG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgKyAxLCBOVUxMLCAmbmV4dF9vZnMsIDApIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIHJldHVybiAtMjsKIAogICAgICAgICBpZiAobmV4dF9vZnMgPD0gbGFzdF9vZnMpIHsKICAgICAgICAgICAgIC8qIGxhcmdlIG5leHRfb2ZzIGRpZG4ndCBjaGFuZ2Ugb3IgY3VycmVudF9lZGl0X3VuaXQgd3JhcHBlZApAQCAtMjkxNSwyMiArMzE4NCw0OCBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG14Zl9zZXRfYXVkaW9fcHRzKE1YRkNvbnRleHQgKm14ZiwgQVZDb2RlY0NvbnRleHQgKmNvZGVjLAorc3RhdGljIGludCBteGZfc2V0X2F1ZGlvX3B0cyhNWEZDb250ZXh0ICpteGYsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgTVhGVHJhY2sgKnRyYWNrID0gbXhmLT5mYy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPnByaXZfZGF0YTsKLSAgICBpbnQ2NF90IGJpdHNfcGVyX3NhbXBsZSA9IGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgaW50NjRfdCBiaXRzX3Blcl9zYW1wbGUgPSBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKIAogICAgIGlmICghYml0c19wZXJfc2FtcGxlKQotICAgICAgICBiaXRzX3Blcl9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgIGJpdHNfcGVyX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUocGFyLT5jb2RlY19pZCk7CiAKICAgICBwa3QtPnB0cyA9IHRyYWNrLT5zYW1wbGVfY291bnQ7CiAKLSAgICBpZiAoICAgY29kZWMtPmNoYW5uZWxzIDw9IDAKKyAgICBpZiAoICAgcGFyLT5jaGFubmVscyA8PSAwCiAgICAgICAgIHx8IGJpdHNfcGVyX3NhbXBsZSA8PSAwCi0gICAgICAgIHx8IGNvZGVjLT5jaGFubmVscyAqIChpbnQ2NF90KWJpdHNfcGVyX3NhbXBsZSA8IDgpCisgICAgICAgIHx8IHBhci0+Y2hhbm5lbHMgKiAoaW50NjRfdCliaXRzX3Blcl9zYW1wbGUgPCA4KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIHRyYWNrLT5zYW1wbGVfY291bnQgKz0gcGt0LT5zaXplIC8gKGNvZGVjLT5jaGFubmVscyAqIChpbnQ2NF90KWJpdHNfcGVyX3NhbXBsZSAvIDgpOworICAgIHRyYWNrLT5zYW1wbGVfY291bnQgKz0gcGt0LT5zaXplIC8gKHBhci0+Y2hhbm5lbHMgKiAoaW50NjRfdCliaXRzX3Blcl9zYW1wbGUgLyA4KTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteGZfc2V0X3B0cyhNWEZDb250ZXh0ICpteGYsIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwgaW50NjRfdCBuZXh0X29mcykKK3sKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3QtPmNvZGVjcGFyOworICAgIE1YRlRyYWNrICp0cmFjayA9IHN0LT5wcml2X2RhdGE7CisKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiAobmV4dF9vZnMgPj0gMCB8fCBuZXh0X29mcyA9PSAtMiAmJiBzdC0+ZHVyYXRpb24gPT0gbXhmLT5jdXJyZW50X2VkaXRfdW5pdCArIDEpKSB7CisgICAgICAgIC8qIG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgZ29vZCAtIHNlZSBpZiB3ZSBoYXZlIGFuCisgICAgICAgICAqIGluZGV4IHRhYmxlIHRvIGRlcml2ZSB0aW1lc3RhbXBzIGZyb20gKi8KKyAgICAgICAgTVhGSW5kZXhUYWJsZSAqdCA9ICZteGYtPmluZGV4X3RhYmxlc1swXTsKKworICAgICAgICBpZiAobXhmLT5uYl9pbmRleF90YWJsZXMgPj0gMSAmJiBteGYtPmN1cnJlbnRfZWRpdF91bml0IDwgdC0+bmJfcHRzZXMpIHsKKyAgICAgICAgICAgIHBrdC0+ZHRzID0gbXhmLT5jdXJyZW50X2VkaXRfdW5pdCArIHQtPmZpcnN0X2R0czsKKyAgICAgICAgICAgIHBrdC0+cHRzID0gdC0+cHRzZXNbbXhmLT5jdXJyZW50X2VkaXRfdW5pdF07CisgICAgICAgIH0gZWxzZSBpZiAodHJhY2sgJiYgdHJhY2stPmludHJhX29ubHkpIHsKKyAgICAgICAgICAgIC8qIGludHJhLW9ubHkgLT4gUFRTID0gRWRpdFVuaXQuCisgICAgICAgICAgICAgKiBsZXQgdXRpbHMuYyBmaWd1cmUgb3V0IERUUyBzaW5jZSBpdCBjYW4gYmUgPCBQVFMgaWYgbG93X2RlbGF5ID0gMCAoU29ueSBJTVgzMCkgKi8KKyAgICAgICAgICAgIHBrdC0+cHRzID0gbXhmLT5jdXJyZW50X2VkaXRfdW5pdDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBpbnQgcmV0ID0gbXhmX3NldF9hdWRpb19wdHMobXhmLCBwYXIsIHBrdCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI5NTIsMTIgKzMyNDcsMTIgQEAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIGlmIChJU19LTFZfS0VZKGtsdi5rZXksIG14Zl9lc3NlbmNlX2VsZW1lbnRfa2V5KSB8fAorICAgICAgICAgICAgSVNfS0xWX0tFWShrbHYua2V5LCBteGZfY2Fub3B1c19lc3NlbmNlX2VsZW1lbnRfa2V5KSB8fAogICAgICAgICAgICAgSVNfS0xWX0tFWShrbHYua2V5LCBteGZfYXZpZF9lc3NlbmNlX2VsZW1lbnRfa2V5KSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gbXhmX2dldF9zdHJlYW1faW5kZXgocywgJmtsdik7CisgICAgICAgICAgICBpbnQgYm9keV9zaWQgPSBmaW5kX2JvZHlfc2lkX2J5X29mZnNldChteGYsIGtsdi5vZmZzZXQpOworICAgICAgICAgICAgaW50IGluZGV4ID0gbXhmX2dldF9zdHJlYW1faW5kZXgocywgJmtsdiwgYm9keV9zaWQpOwogICAgICAgICAgICAgaW50NjRfdCBuZXh0X29mcywgbmV4dF9rbHY7CiAgICAgICAgICAgICBBVlN0cmVhbSAqc3Q7Ci0gICAgICAgICAgICBNWEZUcmFjayAqdHJhY2s7Ci0gICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CiAKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLApAQCAtMjk2Nyw3ICszMjYyLDYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2luZGV4XTsKLSAgICAgICAgICAgIHRyYWNrID0gc3QtPnByaXZfZGF0YTsKIAogICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaW5kZXhdLT5kaXNjYXJkID09IEFWRElTQ0FSRF9BTEwpCiAgICAgICAgICAgICAgICAgZ290byBza2lwOwpAQCAtMjk4MCw3ICszMjc0LDcgQEAKICAgICAgICAgICAgICAgICAgKiB0cnVuY2F0ZSB0aGUgcGFja2V0IHNpbmNlIGl0J3MgcHJvYmFibHkgdmVyeSBsYXJnZSAoPjIgR2lCIGlzIGNvbW1vbikgKi8KICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9QQXRvbSBtaXNpbnRlcnByZXRlZCBhcyBPUDFhPyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLTFYgZm9yIGVkaXQgdW5pdCAlaSBleHRlbmRpbmcgaW50byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLTFYgZm9yIGVkaXQgdW5pdCAlIlBSSWQ2NCIgZXh0ZW5kaW5nIGludG8gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmV4dCBlZGl0IHVuaXQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteGYtPmN1cnJlbnRfZWRpdF91bml0KTsKICAgICAgICAgICAgICAgICBrbHYubGVuZ3RoID0gbmV4dF9vZnMgLSBhdmlvX3RlbGwocy0+cGIpOwpAQCAtMzAwMiwyNiArMzI5Niw5IEBACiAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IGluZGV4OwogICAgICAgICAgICAgcGt0LT5wb3MgPSBrbHYub2Zmc2V0OwogCi0gICAgICAgICAgICBjb2RlYyA9IHN0LT5jb2RlYzsKLQotICAgICAgICAgICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBuZXh0X29mcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLyogbXhmLT5jdXJyZW50X2VkaXRfdW5pdCBnb29kIC0gc2VlIGlmIHdlIGhhdmUgYW4KLSAgICAgICAgICAgICAgICAgKiBpbmRleCB0YWJsZSB0byBkZXJpdmUgdGltZXN0YW1wcyBmcm9tICovCi0gICAgICAgICAgICAgICAgTVhGSW5kZXhUYWJsZSAqdCA9ICZteGYtPmluZGV4X3RhYmxlc1swXTsKLQotICAgICAgICAgICAgICAgIGlmIChteGYtPm5iX2luZGV4X3RhYmxlcyA+PSAxICYmIG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgPCB0LT5uYl9wdHNlcykgewotICAgICAgICAgICAgICAgICAgICBwa3QtPmR0cyA9IG14Zi0+Y3VycmVudF9lZGl0X3VuaXQgKyB0LT5maXJzdF9kdHM7Ci0gICAgICAgICAgICAgICAgICAgIHBrdC0+cHRzID0gdC0+cHRzZXNbbXhmLT5jdXJyZW50X2VkaXRfdW5pdF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aW50cmFfb25seSkgewotICAgICAgICAgICAgICAgICAgICAvKiBpbnRyYS1vbmx5IC0+IFBUUyA9IEVkaXRVbml0LgotICAgICAgICAgICAgICAgICAgICAgKiBsZXQgdXRpbHMuYyBmaWd1cmUgb3V0IERUUyBzaW5jZSBpdCBjYW4gYmUgPCBQVFMgaWYgbG93X2RlbGF5ID0gMCAoU29ueSBJTVgzMCkgKi8KLSAgICAgICAgICAgICAgICAgICAgcGt0LT5wdHMgPSBteGYtPmN1cnJlbnRfZWRpdF91bml0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gbXhmX3NldF9hdWRpb19wdHMobXhmLCBjb2RlYywgcGt0KTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IG14Zl9zZXRfcHRzKG14Ziwgc3QsIHBrdCwgbmV4dF9vZnMpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgICAgICAgICAgLyogc2VlayBmb3IgdHJ1bmNhdGVkIHBhY2tldHMgKi8KICAgICAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgbmV4dF9rbHYsIFNFRUtfU0VUKTsKQEAgLTMwNDEsMjQgKzMzMTgsMjcgQEAKICAgICBpbnQ2NF90IHJldDY0LCBwb3MsIG5leHRfcG9zOwogICAgIEFWU3RyZWFtICpzdDsKICAgICBNWEZJbmRleFRhYmxlICp0OworICAgIE1YRlRyYWNrICp0cmFjazsKICAgICBpbnQgZWRpdF91bml0czsKIAogICAgIGlmIChteGYtPm9wICE9IE9QQXRvbSkKICAgICAgICAgcmV0dXJuIG14Zl9yZWFkX3BhY2tldF9vbGQocywgcGt0KTsKIAogICAgIC8vIElmIHdlIGhhdmUgbm8gc3RyZWFtcyB0aGVuIHdlIGJhc2ljYWxseSBhcmUgYXQgRU9GCi0gICAgaWYgKHMtPm5iX3N0cmVhbXMgPCAxKQorICAgIHN0ID0gbXhmX2dldF9vcGF0b21fc3RyZWFtKG14Zik7CisgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwogCisgICAgdHJhY2sgPSBzdC0+cHJpdl9kYXRhOworCiAgICAgLyogT1BBdG9tIC0gY2xpcCB3cmFwcGVkIGRlbXV4aW5nICovCiAgICAgLyogTk9URTogbXhmX3JlYWRfaGVhZGVyKCkgbWFrZXMgc3VyZSBuYl9pbmRleF90YWJsZXMgPiAwIGZvciBPUEF0b20gKi8KLSAgICBzdCA9IHMtPnN0cmVhbXNbMF07CiAgICAgdCA9ICZteGYtPmluZGV4X3RhYmxlc1swXTsKIAotICAgIGlmIChteGYtPmN1cnJlbnRfZWRpdF91bml0ID49IHN0LT5kdXJhdGlvbikKKyAgICBpZiAobXhmLT5jdXJyZW50X2VkaXRfdW5pdCA+PSB0cmFjay0+b3JpZ2luYWxfZHVyYXRpb24pCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKIAotICAgIGVkaXRfdW5pdHMgPSBGRk1JTihteGYtPmVkaXRfdW5pdHNfcGVyX3BhY2tldCwgc3QtPmR1cmF0aW9uIC0gbXhmLT5jdXJyZW50X2VkaXRfdW5pdCk7CisgICAgZWRpdF91bml0cyA9IEZGTUlOKG14Zi0+ZWRpdF91bml0c19wZXJfcGFja2V0LCB0cmFjay0+b3JpZ2luYWxfZHVyYXRpb24gLSBteGYtPmN1cnJlbnRfZWRpdF91bml0KTsKIAogICAgIGlmICgocmV0ID0gbXhmX2VkaXRfdW5pdF9hYnNvbHV0ZV9vZmZzZXQobXhmLCB0LCBteGYtPmN1cnJlbnRfZWRpdF91bml0LCBOVUxMLCAmcG9zLCAxKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMzA4MiwxNyArMzM2MiwxMSBAQAogICAgIGlmICgoc2l6ZSA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSkpIDwgMCkKICAgICAgICAgcmV0dXJuIHNpemU7CiAKLSAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiB0LT5wdHNlcyAmJgotICAgICAgICBteGYtPmN1cnJlbnRfZWRpdF91bml0ID49IDAgJiYgbXhmLT5jdXJyZW50X2VkaXRfdW5pdCA8IHQtPm5iX3B0c2VzKSB7Ci0gICAgICAgIHBrdC0+ZHRzID0gbXhmLT5jdXJyZW50X2VkaXRfdW5pdCArIHQtPmZpcnN0X2R0czsKLSAgICAgICAgcGt0LT5wdHMgPSB0LT5wdHNlc1tteGYtPmN1cnJlbnRfZWRpdF91bml0XTsKLSAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgaW50IHJldCA9IG14Zl9zZXRfYXVkaW9fcHRzKG14Ziwgc3QtPmNvZGVjLCBwa3QpOwotICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQorICAgIHJldCA9IG14Zl9zZXRfcHRzKG14Ziwgc3QsIHBrdCwgbmV4dF9wb3MpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgbXhmLT5jdXJyZW50X2VkaXRfdW5pdCArPSBlZGl0X3VuaXRzOwogCkBAIC0zMTA1LDYgKzMzNzksNyBAQAogICAgIGludCBpOwogCiAgICAgYXZfZnJlZXAoJm14Zi0+cGFja2FnZXNfcmVmcyk7CisgICAgYXZfZnJlZXAoJm14Zi0+ZXNzZW5jZV9jb250YWluZXJfZGF0YV9yZWZzKTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspCiAgICAgICAgIHMtPnN0cmVhbXNbaV0tPnByaXZfZGF0YSA9IE5VTEw7CkBAIC0zMTY3LDI2ICszNDQyLDQzIEBACiAgICAgTVhGSW5kZXhUYWJsZSAqdDsKICAgICBNWEZUcmFjayAqc291cmNlX3RyYWNrID0gc3QtPnByaXZfZGF0YTsKIAorICAgIGlmKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSkKKyAgICAgICAgcmV0dXJuIDA7CisKICAgICAvKiBpZiBhdWRpbyB0aGVuIHRydW5jYXRlIHNhbXBsZV90aW1lIHRvIEVkaXRSYXRlICovCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pCiAgICAgICAgIHNhbXBsZV90aW1lID0gYXZfcmVzY2FsZV9xKHNhbXBsZV90aW1lLCBzdC0+dGltZV9iYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9pbnZfcShzb3VyY2VfdHJhY2stPmVkaXRfcmF0ZSkpOwogCiAgICAgaWYgKG14Zi0+bmJfaW5kZXhfdGFibGVzIDw9IDApIHsKLSAgICBpZiAoIXMtPmJpdF9yYXRlKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBpZiAoc2FtcGxlX3RpbWUgPCAwKQotICAgICAgICBzYW1wbGVfdGltZSA9IDA7Ci0gICAgc2Vjb25kcyA9IGF2X3Jlc2NhbGUoc2FtcGxlX3RpbWUsIHN0LT50aW1lX2Jhc2UubnVtLCBzdC0+dGltZV9iYXNlLmRlbik7CisgICAgICAgIGlmICghcy0+Yml0X3JhdGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgaWYgKHNhbXBsZV90aW1lIDwgMCkKKyAgICAgICAgICAgIHNhbXBsZV90aW1lID0gMDsKKyAgICAgICAgc2Vjb25kcyA9IGF2X3Jlc2NhbGUoc2FtcGxlX3RpbWUsIHN0LT50aW1lX2Jhc2UubnVtLCBzdC0+dGltZV9iYXNlLmRlbik7CiAKLSAgICBzZWVrcG9zID0gYXZpb19zZWVrKHMtPnBiLCAocy0+Yml0X3JhdGUgKiBzZWNvbmRzKSA+PiAzLCBTRUVLX1NFVCk7Ci0gICAgaWYgKHNlZWtwb3MgPCAwKQotICAgICAgICByZXR1cm4gc2Vla3BvczsKKyAgICAgICAgc2Vla3BvcyA9IGF2aW9fc2VlayhzLT5wYiwgKHMtPmJpdF9yYXRlICogc2Vjb25kcykgPj4gMywgU0VFS19TRVQpOworICAgICAgICBpZiAoc2Vla3BvcyA8IDApCisgICAgICAgICAgICByZXR1cm4gc2Vla3BvczsKIAotICAgIGZmX3VwZGF0ZV9jdXJfZHRzKHMsIHN0LCBzYW1wbGVfdGltZSk7Ci0gICAgbXhmLT5jdXJyZW50X2VkaXRfdW5pdCA9IHNhbXBsZV90aW1lOworICAgICAgICBmZl91cGRhdGVfY3VyX2R0cyhzLCBzdCwgc2FtcGxlX3RpbWUpOworICAgICAgICBteGYtPmN1cnJlbnRfZWRpdF91bml0ID0gc2FtcGxlX3RpbWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgdCA9ICZteGYtPmluZGV4X3RhYmxlc1swXTsKKyAgICAgICAgaWYgKHQtPmluZGV4X3NpZCAhPSBzb3VyY2VfdHJhY2stPmluZGV4X3NpZCkgeworICAgICAgICAgICAgLyogSWYgdGhlIGZpcnN0IGluZGV4IHRhYmxlIGRvZXMgbm90IGJlbG9uZyB0byB0aGUgc3RyZWFtLCB0aGVuIGZpbmQgYSBzdHJlYW0gd2hpY2ggZG9lcyBiZWxvbmcgdG8gdGhlIGluZGV4IHRhYmxlICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICAgICAgTVhGVHJhY2sgKm5ld19zb3VyY2VfdHJhY2sgPSBzLT5zdHJlYW1zW2ldLT5wcml2X2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKG5ld19zb3VyY2VfdHJhY2sgJiYgbmV3X3NvdXJjZV90cmFjay0+aW5kZXhfc2lkID09IHQtPmluZGV4X3NpZCkgeworICAgICAgICAgICAgICAgICAgICBzYW1wbGVfdGltZSA9IGF2X3Jlc2NhbGVfcShzYW1wbGVfdGltZSwgbmV3X3NvdXJjZV90cmFjay0+ZWRpdF9yYXRlLCBzb3VyY2VfdHJhY2stPmVkaXRfcmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZV90cmFjayA9IG5ld19zb3VyY2VfdHJhY2s7CisgICAgICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gcy0+bmJfc3RyZWFtcykKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogCiAgICAgICAgIC8qIGNsYW1wIGFib3ZlIHplcm8sIGVsc2UgZmZfaW5kZXhfc2VhcmNoX3RpbWVzdGFtcCgpIHJldHVybnMgbmVnYXRpdmUKICAgICAgICAgICogdGhpcyBhbHNvIG1lYW5zIHdlIGFsbG93IHNlZWtpbmcgYmVmb3JlIHRoZSBzdGFydCAqLwpAQCAtMzIyNiwxMyArMzUxOCwxOSBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKmN1cl9zdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgIE1YRlRyYWNrICpjdXJfdHJhY2sgPSBjdXJfc3QtPnByaXZfZGF0YTsKLSAgICAgICAgdWludDY0X3QgY3VycmVudF9zYW1wbGVfY291bnQgPSAwOwotICAgICAgICBpZiAoY3VyX3N0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgIHJldCA9IG14Zl9jb21wdXRlX3NhbXBsZV9jb3VudChteGYsIGksICZjdXJyZW50X3NhbXBsZV9jb3VudCk7Ci0gICAgICAgICAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotCi0gICAgICAgICAgICBjdXJfdHJhY2stPnNhbXBsZV9jb3VudCA9IGN1cnJlbnRfc2FtcGxlX2NvdW50OworICAgICAgICBpZiAoY3VyX3N0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGludDY0X3QgdHJhY2tfZWRpdF91bml0OworICAgICAgICAgICAgaWYgKHN0ICE9IGN1cl9zdCAmJiBteGZfZ2V0X25leHRfdHJhY2tfZWRpdF91bml0KG14ZiwgY3VyX3RyYWNrLCBzZWVrcG9zLCAmdHJhY2tfZWRpdF91bml0KSA+PSAwKSB7CisgICAgICAgICAgICAgICAgY3VyX3RyYWNrLT5zYW1wbGVfY291bnQgPSBhdl9yZXNjYWxlX3EodHJhY2tfZWRpdF91bml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2ludl9xKGN1cl90cmFjay0+ZWRpdF9yYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfc3QtPnRpbWVfYmFzZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGN1cnJlbnRfc2FtcGxlX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICByZXQgPSBteGZfY29tcHV0ZV9zYW1wbGVfY291bnQobXhmLCBpLCAmY3VycmVudF9zYW1wbGVfY291bnQpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIGN1cl90cmFjay0+c2FtcGxlX2NvdW50ID0gY3VycmVudF9zYW1wbGVfY291bnQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9teGZlbmMuYyBiL2xpYmF2Zm9ybWF0L214ZmVuYy5jCmluZGV4IGNkMTNmODkuLjNiYjcwMzIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L214ZmVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L214ZmVuYy5jCkBAIC0yMSw3ICsyMSw3IEBACiAgKi8KIAogLyoKLSAqIHNpZ25hbF9zdGFuZGFyZCwgY29sb3Jfc2l0aW5nLCBzdG9yZV91c2VyX2NvbW1lbnRzIGFuZCBrbHZfZmlsbF9rZXkgdmVyc2lvbgorICogc2lnbmFsX3N0YW5kYXJkLCBjb2xvcl9zaXRpbmcsIHN0b3JlX3VzZXJfY29tbWVudHMsIHNhbXBsZSByYXRlIGFuZCBrbHZfZmlsbF9rZXkgdmVyc2lvbgogICogZml4ZXMgc3BvbnNvcmVkIGJ5IE5PQSBHbWJICiAgKi8KIApAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9kbnhoZGRhdGEuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2R2X3Byb2ZpbGUuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2gyNjQuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCiAjaW5jbHVkZSAiYXVkaW9pbnRlcmxlYXZlLmgiCkBAIC0xMDAsMTcgKzEwMSw2NSBAQAogICAgIHZvaWQgKCp3cml0ZV9kZXNjKShBVkZvcm1hdENvbnRleHQgKiwgQVZTdHJlYW0gKik7CiB9IE1YRkNvbnRhaW5lckVzc2VuY2VFbnRyeTsKIAordHlwZWRlZiBzdHJ1Y3QgTVhGUGFja2FnZSB7CisgICAgY2hhciAqbmFtZTsKKyAgICBlbnVtIE1YRk1ldGFkYXRhU2V0VHlwZSB0eXBlOworICAgIGludCBpbnN0YW5jZTsKKyAgICBzdHJ1Y3QgTVhGUGFja2FnZSAqcmVmOworfSBNWEZQYWNrYWdlOworCitlbnVtIFVMSW5kZXggeworICAgIElOREVYX01QRUcyID0gMCwKKyAgICBJTkRFWF9BRVMzLAorICAgIElOREVYX1dBViwKKyAgICBJTkRFWF9EMTBfNjI1XzUwXzUwX1ZJREVPLAorICAgIElOREVYX0QxMF82MjVfNTBfNTBfQVVESU8sCisgICAgSU5ERVhfRDEwXzUyNV82MF81MF9WSURFTywKKyAgICBJTkRFWF9EMTBfNTI1XzYwXzUwX0FVRElPLAorICAgIElOREVYX0QxMF82MjVfNTBfNDBfVklERU8sCisgICAgSU5ERVhfRDEwXzYyNV81MF80MF9BVURJTywKKyAgICBJTkRFWF9EMTBfNTI1XzYwXzQwX1ZJREVPLAorICAgIElOREVYX0QxMF81MjVfNjBfNDBfQVVESU8sCisgICAgSU5ERVhfRDEwXzYyNV81MF8zMF9WSURFTywKKyAgICBJTkRFWF9EMTBfNjI1XzUwXzMwX0FVRElPLAorICAgIElOREVYX0QxMF81MjVfNjBfMzBfVklERU8sCisgICAgSU5ERVhfRDEwXzUyNV82MF8zMF9BVURJTywKKyAgICBJTkRFWF9EViwKKyAgICBJTkRFWF9EVjI1XzUyNV82MCwKKyAgICBJTkRFWF9EVjI1XzYyNV81MCwKKyAgICBJTkRFWF9EVjI1XzUyNV82MF9JRUMsCisgICAgSU5ERVhfRFYyNV82MjVfNTBfSUVDLAorICAgIElOREVYX0RWNTBfNTI1XzYwLAorICAgIElOREVYX0RWNTBfNjI1XzUwLAorICAgIElOREVYX0RWMTAwXzEwODBfNjAsCisgICAgSU5ERVhfRFYxMDBfMTA4MF81MCwKKyAgICBJTkRFWF9EVjEwMF83MjBfNjAsCisgICAgSU5ERVhfRFYxMDBfNzIwXzUwLAorICAgIElOREVYX0ROWEhEXzEwODBwXzEwYml0X0hJR0gsCisgICAgSU5ERVhfRE5YSERfMTA4MHBfOGJpdF9NRURJVU0sCisgICAgSU5ERVhfRE5YSERfMTA4MHBfOGJpdF9ISUdILAorICAgIElOREVYX0ROWEhEXzEwODBpXzEwYml0X0hJR0gsCisgICAgSU5ERVhfRE5YSERfMTA4MGlfOGJpdF9NRURJVU0sCisgICAgSU5ERVhfRE5YSERfMTA4MGlfOGJpdF9ISUdILAorICAgIElOREVYX0ROWEhEXzcyMHBfMTBiaXQsCisgICAgSU5ERVhfRE5YSERfNzIwcF84Yml0X0hJR0gsCisgICAgSU5ERVhfRE5YSERfNzIwcF84Yml0X01FRElVTSwKKyAgICBJTkRFWF9ETlhIRF83MjBwXzhiaXRfTE9XLAorICAgIElOREVYX0pQRUcyMDAwLAorICAgIElOREVYX0gyNjQsCit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgICBlbnVtIEFWQ29kZWNJRCBpZDsKLSAgICBpbnQgaW5kZXg7CisgICAgZW51bSBVTEluZGV4IGluZGV4OwogfSBteGZfZXNzZW5jZV9tYXBwaW5nc1tdID0gewotICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgMCB9LAotICAgIHsgQVZfQ09ERUNfSURfUENNX1MyNExFLCAgMSB9LAotICAgIHsgQVZfQ09ERUNfSURfUENNX1MxNkxFLCAgMSB9LAotICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAxNSB9LAotICAgIHsgQVZfQ09ERUNfSURfRE5YSEQsICAgICAyNCB9LAotICAgIHsgQVZfQ09ERUNfSURfSlBFRzIwMDAsICAzNCB9LAotICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgICAzNSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgSU5ERVhfTVBFRzIgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMjRMRSwgIElOREVYX0FFUzMgfSwKKyAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZMRSwgIElOREVYX0FFUzMgfSwKKyAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sICAgIElOREVYX0RWIH0sCisgICAgeyBBVl9DT0RFQ19JRF9ETlhIRCwgICAgICBJTkRFWF9ETlhIRF8xMDgwcF8xMGJpdF9ISUdIIH0sCisgICAgeyBBVl9DT0RFQ19JRF9KUEVHMjAwMCwgICBJTkRFWF9KUEVHMjAwMCB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2NCwgICAgICAgSU5ERVhfSDI2NCB9LAogICAgIHsgQVZfQ09ERUNfSURfTk9ORSB9CiB9OwogCkBAIC0xOTIsNiArMjQxLDcgQEAKICAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxOCwweDAxLDB4MDEsMHgwMCB9LAogICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAyLDB4MDAsMHgwMCwweDAwIH0sCiAgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCisKICAgICAvLyBEVjI1IDUyNS82MAogICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDIsMHg0MCwweDAxIH0sCiAgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MTgsMHgwMSwweDAxLDB4MDAgfSwKQEAgLTIwMiw3ICsyNTIsMTkgQEAKICAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDAxLDB4MDIsMHgwMSwweDAxLDB4MEQsMHgwMSwweDAzLDB4MDEsMHgxOCwweDAxLDB4MDEsMHgwMCB9LAogICAgICAgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAyLDB4MDIsMHgwMiwweDAwIH0sCiAgICAgICBteGZfd3JpdGVfY2RjaV9kZXNjIH0sCi0gICAgLy8gRFY1MCA1MjUvNjAKKworICAgIC8vIElFQyBEVjI1IDUyNS82MAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDIsMHgwMSwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MTgsMHgwMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDEsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorICAgIC8vIElFQyBEVjI1IDYyNS81MAorICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDIsMHgwMiwweDAxIH0sCisgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MTgsMHgwMSwweDAxLDB4MDAgfSwKKyAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMiwweDAxLDB4MDIsMHgwMCB9LAorICAgICAgbXhmX3dyaXRlX2NkY2lfZGVzYyB9LAorCisgICAgICAvLyBEVjUwIDUyNS82MAogICAgIHsgeyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MDEsMHgwRCwweDAxLDB4MDMsMHgwMSwweDAyLDB4MDIsMHg1MCwweDAxIH0sCiAgICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwMSwweDAyLDB4MDEsMHgwMSwweDBELDB4MDEsMHgwMywweDAxLDB4MTgsMHgwMSwweDAxLDB4MDAgfSwKICAgICAgIHsgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDAxLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMiwweDAyLDB4MDMsMHgwMCB9LApAQCAtMzI1LDYgKzM4Nyw3IEBACiAgICAgdWludDMyX3QgdGFnZ2VkX3ZhbHVlX2NvdW50OwogICAgIEFWUmF0aW9uYWwgYXVkaW9fZWRpdF9yYXRlOwogICAgIGludCBzdG9yZV91c2VyX2NvbW1lbnRzOworICAgIGludCB0cmFja19pbnN0YW5jZV9jb3VudDsgLy8gdXNlZCB0byBnZW5lcmF0ZSBNWEZUcmFjayB1dWlkcwogfSBNWEZDb250ZXh0OwogCiBzdGF0aWMgY29uc3QgdWludDhfdCB1dWlkX2Jhc2VbXSAgICAgICAgICAgID0geyAweEFELDB4QUIsMHg0NCwweDI0LDB4MmYsMHgyNSwweDRkLDB4YzcsMHg5MiwweGZmLDB4MjksMHhiZCB9OwpAQCAtMzUyLDYgKzQxNSw3IEBACiAKIC8qKgogICogU01QVEUgUlAyMTAgaHR0cDovL3d3dy5zbXB0ZS1yYS5vcmcvbWRkL2luZGV4Lmh0bWwKKyAqICAgICAgICAgICAgIGh0dHBzOi8vc21wdGUtcmEub3JnL3NpdGVzL2RlZmF1bHQvZmlsZXMvTGFiZWxzLnhtbAogICovCiBzdGF0aWMgY29uc3QgTVhGTG9jYWxUYWdQYWlyIG14Zl9sb2NhbF90YWdfYmF0Y2hbXSA9IHsKICAgICAvLyBwcmVmYWNlIHNldApAQCAtNjcxLDcgKzczNSw3IEBACiAgICAgICAgICAgICBzaXplICs9IDI7CiAgICAgICAgIGNvbnRpbnVlOwogaW52YWxpZDoKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFpZCBVVEY4IHNlcXVlbmNlIGluIG14Zl91dGYxNmxlblxuXG4iKTsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgVVRGOCBzZXF1ZW5jZSBpbiBteGZfdXRmMTZsZW5cblxuIik7CiAgICAgfQogICAgIHNpemUgKz0gMTsKICAgICByZXR1cm4gc2l6ZTsKQEAgLTc1MiwxMyArODE2LDE0IEBACiAgICAgYXZpb193YjY0KHBiLCBteGYtPnRpbWVzdGFtcCk7CiB9CiAKLXN0YXRpYyB2b2lkIG14Zl93cml0ZV9jb250ZW50X3N0b3JhZ2UoQVZGb3JtYXRDb250ZXh0ICpzKQorc3RhdGljIHZvaWQgbXhmX3dyaXRlX2NvbnRlbnRfc3RvcmFnZShBVkZvcm1hdENvbnRleHQgKnMsIE1YRlBhY2thZ2UgKnBhY2thZ2VzLCBpbnQgcGFja2FnZV9jb3VudCkKIHsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBpbnQgaTsKIAogICAgIG14Zl93cml0ZV9tZXRhZGF0YV9rZXkocGIsIDB4MDExODAwKTsKICAgICBQUklOVF9LRVkocywgImNvbnRlbnQgc3RvcmFnZSBrZXkiLCBwYi0+YnVmX3B0ciAtIDE2KTsKLSAgICBrbHZfZW5jb2RlX2Jlcl9sZW5ndGgocGIsIDkyKTsKKyAgICBrbHZfZW5jb2RlX2Jlcl9sZW5ndGgocGIsIDYwICsgKDE2ICogcGFja2FnZV9jb3VudCkpOwogCiAgICAgLy8gd3JpdGUgdWlkCiAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4M0MwQSk7CkBAIC03NjYsMTAgKzgzMSwxMSBAQAogICAgIFBSSU5UX0tFWShzLCAiY29udGVudCBzdG9yYWdlIHVpZCIsIHBiLT5idWZfcHRyIC0gMTYpOwogCiAgICAgLy8gd3JpdGUgcGFja2FnZSByZWZlcmVuY2UKLSAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiAqIDIgKyA4LCAweDE5MDEpOwotICAgIG14Zl93cml0ZV9yZWZzX2NvdW50KHBiLCAyKTsKLSAgICBteGZfd3JpdGVfdXVpZChwYiwgTWF0ZXJpYWxQYWNrYWdlLCAwKTsKLSAgICBteGZfd3JpdGVfdXVpZChwYiwgU291cmNlUGFja2FnZSwgMCk7CisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYgKiBwYWNrYWdlX2NvdW50ICsgOCwgMHgxOTAxKTsKKyAgICBteGZfd3JpdGVfcmVmc19jb3VudChwYiwgcGFja2FnZV9jb3VudCk7CisgICAgZm9yIChpID0gMDsgaSA8IHBhY2thZ2VfY291bnQ7IGkrKykgeworICAgICAgICBteGZfd3JpdGVfdXVpZChwYiwgcGFja2FnZXNbaV0udHlwZSwgcGFja2FnZXNbaV0uaW5zdGFuY2UpOworICAgIH0KIAogICAgIC8vIHdyaXRlIGVzc2VuY2UgY29udGFpbmVyIGRhdGEKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4ICsgMTYsIDB4MTkwMik7CkBAIC03NzcsNyArODQzLDcgQEAKICAgICBteGZfd3JpdGVfdXVpZChwYiwgRXNzZW5jZUNvbnRhaW5lckRhdGEsIDApOwogfQogCi1zdGF0aWMgdm9pZCBteGZfd3JpdGVfdHJhY2soQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGUpCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfdHJhY2soQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIE1YRlBhY2thZ2UgKnBhY2thZ2UpCiB7CiAgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwpAQCAtNzg5LDcgKzg1NSw3IEBACiAKICAgICAvLyB3cml0ZSB0cmFjayB1aWQKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQzBBKTsKLSAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSA9PSBNYXRlcmlhbFBhY2thZ2UgPyBUcmFjayA6IFRyYWNrICsgVHlwZUJvdHRvbSwgc3QtPmluZGV4KTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgVHJhY2ssIG14Zi0+dHJhY2tfaW5zdGFuY2VfY291bnQpOwogICAgIFBSSU5UX0tFWShzLCAidHJhY2sgdWlkIiwgcGItPmJ1Zl9wdHIgLSAxNik7CiAKICAgICAvLyB3cml0ZSB0cmFjayBpZApAQCAtNzk4LDE0ICs4NjQsMTUgQEAKIAogICAgIC8vIHdyaXRlIHRyYWNrIG51bWJlcgogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4NDgwNCk7Ci0gICAgaWYgKHR5cGUgPT0gTWF0ZXJpYWxQYWNrYWdlKQorICAgIGlmIChwYWNrYWdlLT50eXBlID09IE1hdGVyaWFsUGFja2FnZSkKICAgICAgICAgYXZpb193YjMyKHBiLCAwKTsgLy8gdHJhY2sgbnVtYmVyIG9mIG1hdGVyaWFsIHBhY2thZ2UgaXMgMAogICAgIGVsc2UKICAgICAgICAgYXZpb193cml0ZShwYiwgc2MtPnRyYWNrX2Vzc2VuY2VfZWxlbWVudF9rZXkgKyAxMiwgNCk7CiAKKyAgICAvLyB3cml0ZSBlZGl0IHJhdGUKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4LCAweDRCMDEpOwogCi0gICAgaWYgKHN0ID09IG14Zi0+dGltZWNvZGVfdHJhY2sgJiYgcy0+b2Zvcm1hdCA9PSAmZmZfbXhmX29wYXRvbV9tdXhlcil7CisgICAgaWYgKHN0ID09IG14Zi0+dGltZWNvZGVfdHJhY2sgJiYgcy0+b2Zvcm1hdCA9PSAmZmZfbXhmX29wYXRvbV9tdXhlcikgewogICAgICAgICBhdmlvX3diMzIocGIsIG14Zi0+dGMucmF0ZS5udW0pOwogICAgICAgICBhdmlvX3diMzIocGIsIG14Zi0+dGMucmF0ZS5kZW4pOwogICAgIH0gZWxzZSB7CkBAIC04MTksNyArODg2LDcgQEAKIAogICAgIC8vIHdyaXRlIHNlcXVlbmNlIHJlZnMKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHg0ODAzKTsKLSAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSA9PSBNYXRlcmlhbFBhY2thZ2UgPyBTZXF1ZW5jZTogU2VxdWVuY2UgKyBUeXBlQm90dG9tLCBzdC0+aW5kZXgpOworICAgIG14Zl93cml0ZV91dWlkKHBiLCBTZXF1ZW5jZSwgbXhmLT50cmFja19pbnN0YW5jZV9jb3VudCk7CiB9CiAKIHN0YXRpYyBjb25zdCB1aW50OF90IHNtcHRlXzEybV90aW1lY29kZV90cmFja19kYXRhX3VsW10gPSB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMSwweDAxLDB4MDMsMHgwMiwweDAxLDB4MDEsMHgwMCwweDAwLDB4MDAgfTsKQEAgLTgzNCwyMSArOTAxLDIxIEBACiAgICAgaWYgKHN0ID09IG14Zi0+dGltZWNvZGVfdHJhY2spCiAgICAgICAgIGF2aW9fd3JpdGUocGIsIHNtcHRlXzEybV90aW1lY29kZV90cmFja19kYXRhX3VsLCAxNik7CiAgICAgZWxzZSB7Ci0gICAgICAgIGNvbnN0IE1YRkNvZGVjVUwgKmRhdGFfZGVmX3VsID0gbXhmX2dldF9kYXRhX2RlZmluaXRpb25fdWwoc3QtPmNvZGVjLT5jb2RlY190eXBlKTsKKyAgICAgICAgY29uc3QgTVhGQ29kZWNVTCAqZGF0YV9kZWZfdWwgPSBteGZfZ2V0X2RhdGFfZGVmaW5pdGlvbl91bChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpOwogICAgICAgICBhdmlvX3dyaXRlKHBiLCBkYXRhX2RlZl91bC0+dWlkLCAxNik7CiAgICAgfQogCiAgICAgLy8gd3JpdGUgZHVyYXRpb24KICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4LCAweDAyMDIpOwogCi0gICAgaWYgKHN0ICE9IG14Zi0+dGltZWNvZGVfdHJhY2sgJiYgcy0+b2Zvcm1hdCA9PSAmZmZfbXhmX29wYXRvbV9tdXhlciAmJiBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKXsKKyAgICBpZiAoc3QgIT0gbXhmLT50aW1lY29kZV90cmFjayAmJiBzLT5vZm9ybWF0ID09ICZmZl9teGZfb3BhdG9tX211eGVyICYmIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKICAgICAgICAgYXZpb193YjY0KHBiLCBteGYtPmJvZHlfb2Zmc2V0IC8gbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZpb193YjY0KHBiLCBteGYtPmR1cmF0aW9uKTsKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIG14Zl93cml0ZV9zZXF1ZW5jZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgdHlwZSkKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9zZXF1ZW5jZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgTVhGUGFja2FnZSAqcGFja2FnZSkKIHsKICAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CkBAIC04NTksNyArOTI2LDcgQEAKICAgICBrbHZfZW5jb2RlX2Jlcl9sZW5ndGgocGIsIDgwKTsKIAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDNDMEEpOwotICAgIG14Zl93cml0ZV91dWlkKHBiLCB0eXBlID09IE1hdGVyaWFsUGFja2FnZSA/IFNlcXVlbmNlOiBTZXF1ZW5jZSArIFR5cGVCb3R0b20sIHN0LT5pbmRleCk7CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIFNlcXVlbmNlLCBteGYtPnRyYWNrX2luc3RhbmNlX2NvdW50KTsKIAogICAgIFBSSU5UX0tFWShzLCAic2VxdWVuY2UgdWlkIiwgcGItPmJ1Zl9wdHIgLSAxNik7CiAgICAgbXhmX3dyaXRlX2NvbW1vbl9maWVsZHMocywgc3QpOwpAQCAtODcxLDEyICs5MzgsMTEgQEAKICAgICAgICAgY29tcG9uZW50ID0gVGltZWNvZGVDb21wb25lbnQ7CiAgICAgZWxzZQogICAgICAgICBjb21wb25lbnQgPSBTb3VyY2VDbGlwOwotICAgIGlmICh0eXBlID09IFNvdXJjZVBhY2thZ2UpCi0gICAgICAgIGNvbXBvbmVudCArPSBUeXBlQm90dG9tOwotICAgIG14Zl93cml0ZV91dWlkKHBiLCBjb21wb25lbnQsIHN0LT5pbmRleCk7CisKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgY29tcG9uZW50LCBteGYtPnRyYWNrX2luc3RhbmNlX2NvdW50KTsKIH0KIAotc3RhdGljIHZvaWQgbXhmX3dyaXRlX3RpbWVjb2RlX2NvbXBvbmVudChBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgZW51bSBNWEZNZXRhZGF0YVNldFR5cGUgdHlwZSkKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV90aW1lY29kZV9jb21wb25lbnQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIE1YRlBhY2thZ2UgKnBhY2thZ2UpCiB7CiAgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwpAQCAtODg2LDggKzk1Miw3IEBACiAKICAgICAvLyBVSUQKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQzBBKTsKLSAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSA9PSBNYXRlcmlhbFBhY2thZ2UgPyBUaW1lY29kZUNvbXBvbmVudCA6Ci0gICAgICAgICAgICAgICAgICAgVGltZWNvZGVDb21wb25lbnQgKyBUeXBlQm90dG9tLCBzdC0+aW5kZXgpOworICAgIG14Zl93cml0ZV91dWlkKHBiLCBUaW1lY29kZUNvbXBvbmVudCwgbXhmLT50cmFja19pbnN0YW5jZV9jb3VudCk7CiAKICAgICBteGZfd3JpdGVfY29tbW9uX2ZpZWxkcyhzLCBzdCk7CiAKQEAgLTkwNCw4ICs5NjksOSBAQAogICAgIGF2aW9fdzgocGIsICEhKG14Zi0+dGMuZmxhZ3MgJiBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSkpOwogfQogCi1zdGF0aWMgdm9pZCBteGZfd3JpdGVfc3RydWN0dXJhbF9jb21wb25lbnQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGUpCitzdGF0aWMgdm9pZCBteGZfd3JpdGVfc3RydWN0dXJhbF9jb21wb25lbnQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsIE1YRlBhY2thZ2UgKnBhY2thZ2UpCiB7CisgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogICAgIGludCBpOwogCkBAIC05MTUsNyArOTgxLDcgQEAKIAogICAgIC8vIHdyaXRlIHVpZAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDNDMEEpOwotICAgIG14Zl93cml0ZV91dWlkKHBiLCB0eXBlID09IE1hdGVyaWFsUGFja2FnZSA/IFNvdXJjZUNsaXA6IFNvdXJjZUNsaXAgKyBUeXBlQm90dG9tLCBzdC0+aW5kZXgpOworICAgIG14Zl93cml0ZV91dWlkKHBiLCBTb3VyY2VDbGlwLCBteGYtPnRyYWNrX2luc3RhbmNlX2NvdW50KTsKIAogICAgIFBSSU5UX0tFWShzLCAic3RydWN0dXJhbCBjb21wb25lbnQgdWlkIiwgcGItPmJ1Zl9wdHIgLSAxNik7CiAgICAgbXhmX3dyaXRlX2NvbW1vbl9maWVsZHMocywgc3QpOwpAQCAtOTI2LDIwICs5OTIsMzMgQEAKIAogICAgIC8vIHdyaXRlIHNvdXJjZSBwYWNrYWdlIHVpZCwgZW5kIG9mIHRoZSByZWZlcmVuY2UKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAzMiwgMHgxMTAxKTsKLSAgICBpZiAodHlwZSA9PSBTb3VyY2VQYWNrYWdlKSB7CisgICAgaWYgKCFwYWNrYWdlLT5yZWYpIHsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgICAgICAgIGF2aW9fd2I2NChwYiwgMCk7CiAgICAgfSBlbHNlCi0gICAgICAgIG14Zl93cml0ZV91bWlkKHMsIDEpOworICAgICAgICBteGZfd3JpdGVfdW1pZChzLCBwYWNrYWdlLT5yZWYtPmluc3RhbmNlKTsKIAogICAgIC8vIHdyaXRlIHNvdXJjZSB0cmFjayBpZAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4MTEwMik7Ci0gICAgaWYgKHR5cGUgPT0gU291cmNlUGFja2FnZSkKKyAgICBpZiAocGFja2FnZS0+dHlwZSA9PSBTb3VyY2VQYWNrYWdlICYmICFwYWNrYWdlLT5yZWYpCiAgICAgICAgIGF2aW9fd2IzMihwYiwgMCk7CiAgICAgZWxzZQogICAgICAgICBhdmlvX3diMzIocGIsIHN0LT5pbmRleCsyKTsKIH0KIAorc3RhdGljIHZvaWQgbXhmX3dyaXRlX3RhcGVfZGVzY3JpcHRvcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisKKyAgICBteGZfd3JpdGVfbWV0YWRhdGFfa2V5KHBiLCAweDAxMmUwMCk7CisgICAgUFJJTlRfS0VZKHMsICJ0YXBlIGRlc2NyaXB0b3Iga2V5IiwgcGItPmJ1Zl9wdHIgLSAxNik7CisgICAga2x2X2VuY29kZV9iZXJfbGVuZ3RoKHBiLCAyMCk7CisgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMTYsIDB4M0MwQSk7CisgICAgbXhmX3dyaXRlX3V1aWQocGIsIFRhcGVEZXNjcmlwdG9yLCAwKTsKKyAgICBQUklOVF9LRVkocywgInRhcGVfZGVzYyB1aWQiLCBwYi0+YnVmX3B0ciAtIDE2KTsKK30KKworCiBzdGF0aWMgdm9pZCBteGZfd3JpdGVfbXVsdGlfZGVzY3JpcHRvcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgTVhGQ29udGV4dCAqbXhmID0gcy0+cHJpdl9kYXRhOwpAQCAtOTkzLDggKzEwNzIsMTkgQEAKICAgICBhdmlvX3diMzIocGIsIHN0LT5pbmRleCsyKTsKIAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDgsIDB4MzAwMSk7Ci0gICAgYXZpb193YjMyKHBiLCBteGYtPnRpbWVfYmFzZS5kZW4pOwotICAgIGF2aW9fd2IzMihwYiwgbXhmLT50aW1lX2Jhc2UubnVtKTsKKyAgICBpZiAocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX2QxMF9tdXhlcikgeworICAgICAgICBhdmlvX3diMzIocGIsIG14Zi0+dGltZV9iYXNlLmRlbik7CisgICAgICAgIGF2aW9fd2IzMihwYiwgbXhmLT50aW1lX2Jhc2UubnVtKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgfHwKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MyNExFKSB7CisgICAgICAgICAgICBhdmlvX3diMzIocGIsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZpb193YjMyKHBiLCAxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgbXhmLT50aW1lX2Jhc2UuZGVuKTsKKyAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgbXhmLT50aW1lX2Jhc2UubnVtKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDMwMDQpOwogICAgIGF2aW9fd3JpdGUocGIsIG14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHNbc2MtPmluZGV4XS5jb250YWluZXJfdWwsIDE2KTsKQEAgLTEwMTAsNyArMTEwMCw3IEBACiB7CiAgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIGludCBzdG9yZWRfaGVpZ2h0ID0gKHN0LT5jb2RlYy0+aGVpZ2h0KzE1KS8xNioxNjsKKyAgICBpbnQgc3RvcmVkX2hlaWdodCA9IChzdC0+Y29kZWNwYXItPmhlaWdodCsxNSkvMTYqMTY7CiAgICAgaW50IGRpc3BsYXlfaGVpZ2h0OwogICAgIGludCBmMSwgZjI7CiAgICAgdW5zaWduZWQgZGVzY19zaXplID0gc2l6ZSs4KzgrOCs4KzgrOCs4KzUrMTYrNCsxMisyMCs1OwpAQCAtMTAyMiwyNyArMTExMiwyNyBAQAogICAgIG14Zl93cml0ZV9nZW5lcmljX2Rlc2Mocywgc3QsIGtleSwgZGVzY19zaXplKTsKIAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4MzIwMyk7Ci0gICAgYXZpb193YjMyKHBiLCBzdC0+Y29kZWMtPndpZHRoKTsKKyAgICBhdmlvX3diMzIocGIsIHN0LT5jb2RlY3Bhci0+d2lkdGgpOwogCiAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzMjAyKTsKICAgICBhdmlvX3diMzIocGIsIHN0b3JlZF9oZWlnaHQ+PnNjLT5pbnRlcmxhY2VkKTsKIAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4MzIwOSk7Ci0gICAgYXZpb193YjMyKHBiLCBzdC0+Y29kZWMtPndpZHRoKTsKKyAgICBhdmlvX3diMzIocGIsIHN0LT5jb2RlY3Bhci0+d2lkdGgpOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+aGVpZ2h0ID09IDYwOCkgLy8gUEFMICsgVkJJCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID09IDYwOCkgLy8gUEFMICsgVkJJCiAgICAgICAgIGRpc3BsYXlfaGVpZ2h0ID0gNTc2OwotICAgIGVsc2UgaWYgKHN0LT5jb2RlYy0+aGVpZ2h0ID09IDUxMikgIC8vIE5UU0MgKyBWQkkKKyAgICBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmhlaWdodCA9PSA1MTIpICAvLyBOVFNDICsgVkJJCiAgICAgICAgIGRpc3BsYXlfaGVpZ2h0ID0gNDg2OwogICAgIGVsc2UKLSAgICAgICAgZGlzcGxheV9oZWlnaHQgPSBzdC0+Y29kZWMtPmhlaWdodDsKKyAgICAgICAgZGlzcGxheV9oZWlnaHQgPSBzdC0+Y29kZWNwYXItPmhlaWdodDsKIAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4MzIwOCk7CiAgICAgYXZpb193YjMyKHBiLCBkaXNwbGF5X2hlaWdodD4+c2MtPmludGVybGFjZWQpOwogCiAgICAgLy8gcHJlc2VudGF0aW9uIFkgb2Zmc2V0CiAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzMjBCKTsKLSAgICBhdmlvX3diMzIocGIsIChzdC0+Y29kZWMtPmhlaWdodCAtIGRpc3BsYXlfaGVpZ2h0KT4+c2MtPmludGVybGFjZWQpOworICAgIGF2aW9fd2IzMihwYiwgKHN0LT5jb2RlY3Bhci0+aGVpZ2h0IC0gZGlzcGxheV9oZWlnaHQpPj5zYy0+aW50ZXJsYWNlZCk7CiAKICAgICAvLyBjb21wb25lbnQgZGVwdGgKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA0LCAweDMzMDEpOwpAQCAtMTA2NiwxMCArMTE1NiwxMCBAQAogICAgIGF2aW9fdzgocGIsIHNjLT5pbnRlcmxhY2VkKTsKIAogICAgIC8vIHZpZGVvIGxpbmUgbWFwCi0gICAgc3dpdGNoIChzdC0+Y29kZWMtPmhlaWdodCkgewotICAgIGNhc2UgIDU3NjogZjEgPSAyMzsgZjIgPSBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0RWVklERU8gPyAzMzUgOiAzMzY7IGJyZWFrOworICAgIHN3aXRjaCAoc3QtPmNvZGVjcGFyLT5oZWlnaHQpIHsKKyAgICBjYXNlICA1NzY6IGYxID0gMjM7IGYyID0gc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVlZJREVPID8gMzM1IDogMzM2OyBicmVhazsKICAgICBjYXNlICA2MDg6IGYxID0gIDc7IGYyID0gMzIwOyBicmVhazsKLSAgICBjYXNlICA0ODA6IGYxID0gMjA7IGYyID0gc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVlZJREVPID8gMjg1IDogMjgzOyBicmVhazsKKyAgICBjYXNlICA0ODA6IGYxID0gMjA7IGYyID0gc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVlZJREVPID8gMjg1IDogMjgzOyBicmVhazsKICAgICBjYXNlICA1MTI6IGYxID0gIDc7IGYyID0gMjcwOyBicmVhazsKICAgICBjYXNlICA3MjA6IGYxID0gMjY7IGYyID0gICAwOyBicmVhazsgLy8gcHJvZ3Jlc3NpdmUKICAgICBjYXNlIDEwODA6IGYxID0gMjE7IGYyID0gNTg0OyBicmVhazsKQEAgLTExMTEsOSArMTIwMSw5IEBACiB7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgTVhGU3RyZWFtQ29udGV4dCAqc2MgPSBzdC0+cHJpdl9kYXRhOwotICAgIGludCBwcm9maWxlX2FuZF9sZXZlbCA9IChzdC0+Y29kZWMtPnByb2ZpbGU8PDQpIHwgc3QtPmNvZGVjLT5sZXZlbDsKKyAgICBpbnQgcHJvZmlsZV9hbmRfbGV2ZWwgPSAoc3QtPmNvZGVjcGFyLT5wcm9maWxlPDw0KSB8IHN0LT5jb2RlY3Bhci0+bGV2ZWw7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSDI2NCkgewogICAgICAgICBteGZfd3JpdGVfY2RjaV9jb21tb24ocywgc3QsIG14Zl9tcGVndmlkZW9fZGVzY3JpcHRvcl9rZXksIDgrNSk7CiAKICAgICAgICAgLy8gYml0IHJhdGUKQEAgLTExMjIsNyArMTIxMiw3IEBACiAKICAgICAgICAgLy8gcHJvZmlsZSBhbmQgbGV2ZWwKICAgICAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgMSwgMHg4MDA3KTsKLSAgICAgICAgaWYgKCFzdC0+Y29kZWMtPnByb2ZpbGUpCisgICAgICAgIGlmICghc3QtPmNvZGVjcGFyLT5wcm9maWxlKQogICAgICAgICAgICAgcHJvZmlsZV9hbmRfbGV2ZWwgfD0gMHg4MDsgLy8gZXNjYXBlIGJpdAogICAgICAgICBhdmlvX3c4KHBiLCBwcm9maWxlX2FuZF9sZXZlbCk7CiAgICAgfSBlbHNlIHsKQEAgLTExNDIsNyArMTIzMiw3IEBACiAKICAgICBteGZfd3JpdGVfZ2VuZXJpY19kZXNjKHMsIHN0LCBrZXksIHNpemUrZHVyYXRpb25fc2l6ZSs1KzEyKzgrOCk7CiAKLSAgICBpZiAoZHVyYXRpb25fc2l6ZSA+IDApeworICAgIGlmIChkdXJhdGlvbl9zaXplID4gMCkgewogICAgICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4LCAweDMwMDIpOwogICAgICAgICBhdmlvX3diNjQocGIsIG14Zi0+Ym9keV9vZmZzZXQgLyBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50KTsKICAgICB9CkBAIC0xMTUzLDI4ICsxMjQzLDI2IEBACiAKICAgICAvLyB3cml0ZSBhdWRpbyBzYW1wbGluZyByYXRlCiAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgOCwgMHgzRDAzKTsKLSAgICBhdmlvX3diMzIocGIsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgYXZpb193YjMyKHBiLCAxKTsKIAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDQsIDB4M0QwNyk7CiAgICAgaWYgKG14Zi0+Y2hhbm5lbF9jb3VudCA9PSAtMSkgewotICAgICAgICBpZiAoc2hvd193YXJuaW5ncyAmJiAocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX2QxMF9tdXhlcikgJiYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gNCkgJiYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gOCkpCisgICAgICAgIGlmIChzaG93X3dhcm5pbmdzICYmIChzLT5vZm9ybWF0ID09ICZmZl9teGZfZDEwX211eGVyKSAmJiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyAhPSA0KSAmJiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyAhPSA4KSkKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgc2hhbGwgYmUgNCBvciA4IDogdGhlIG91dHB1dCB3aWxsIG5vdCBjb21wbHkgdG8gTVhGIEQtMTAgc3BlY3MsIHVzZSAtZDEwX2NoYW5uZWxjb3VudCB0byBmaXggdGhpc1xuIik7Ci0gICAgICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjLT5jaGFubmVscyk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjcGFyLT5jaGFubmVscyk7CiAgICAgfSBlbHNlIGlmIChzLT5vZm9ybWF0ID09ICZmZl9teGZfZDEwX211eGVyKSB7Ci0gICAgICAgIGlmIChzaG93X3dhcm5pbmdzICYmIChteGYtPmNoYW5uZWxfY291bnQgPCBzdC0+Y29kZWMtPmNoYW5uZWxzKSkKKyAgICAgICAgaWYgKHNob3dfd2FybmluZ3MgJiYgKG14Zi0+Y2hhbm5lbF9jb3VudCA8IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpKQogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiZDEwX2NoYW5uZWxjb3VudCA8IGFjdHVhbCBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgOiBzb21lIGNoYW5uZWxzIHdpbGwgYmUgZGlzY2FyZGVkXG4iKTsKICAgICAgICAgaWYgKHNob3dfd2FybmluZ3MgJiYgKG14Zi0+Y2hhbm5lbF9jb3VudCAhPSA0KSAmJiAobXhmLT5jaGFubmVsX2NvdW50ICE9IDgpKQogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiZDEwX2NoYW5uZWxjb3VudCBzaGFsbCBiZSBzZXQgdG8gNCBvciA4IDogdGhlIG91dHB1dCB3aWxsIG5vdCBjb21wbHkgdG8gTVhGIEQtMTAgc3BlY3NcbiIpOwogICAgICAgICBhdmlvX3diMzIocGIsIG14Zi0+Y2hhbm5lbF9jb3VudCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHNob3dfd2FybmluZ3MgJiYgbXhmLT5jaGFubmVsX2NvdW50ICE9IC0xICYmIHMtPm9mb3JtYXQgIT0gJmZmX214Zl9vcGF0b21fbXV4ZXIpCi0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiLWQxMF9jaGFubmVsY291bnQgcmVxdWlyZXMgTVhGIEQtMTAgYW5kIHdpbGwgYmUgaWdub3JlZFxuIik7Ci0gICAgICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjLT5jaGFubmVscyk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgc3QtPmNvZGVjcGFyLT5jaGFubmVscyk7CiAgICAgfQogCiAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzRDAxKTsKLSAgICBhdmlvX3diMzIocGIsIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCkpOworICAgIGF2aW9fd2IzMihwYiwgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSk7CiB9CiAKIHN0YXRpYyB2b2lkIG14Zl93cml0ZV93YXZfY29tbW9uKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBjb25zdCBVSUQga2V5LCB1bnNpZ25lZCBzaXplKQpAQCAtMTE4NCwxMSArMTI3MiwxMSBAQAogICAgIG14Zl93cml0ZV9nZW5lcmljX3NvdW5kX2NvbW1vbihzLCBzdCwga2V5LCBzaXplKzYrOCk7CiAKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAyLCAweDNEMEEpOwotICAgIGF2aW9fd2IxNihwYiwgc3QtPmNvZGVjLT5ibG9ja19hbGlnbik7CisgICAgYXZpb193YjE2KHBiLCBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKTsKIAogICAgIC8vIGF2ZyBieXRlcyBwZXIgc2VjCiAgICAgbXhmX3dyaXRlX2xvY2FsX3RhZyhwYiwgNCwgMHgzRDA5KTsKLSAgICBhdmlvX3diMzIocGIsIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24qc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZpb193YjMyKHBiLCBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKnN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogfQogCiBzdGF0aWMgdm9pZCBteGZfd3JpdGVfd2F2X2Rlc2MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCkBAIC0xMjU1LDE1ICsxMzQzLDE1IEBACiAgICAgcmV0dXJuIGNvdW50OwogfQogCi1zdGF0aWMgdm9pZCBteGZfd3JpdGVfcGFja2FnZShBVkZvcm1hdENvbnRleHQgKnMsIGVudW0gTVhGTWV0YWRhdGFTZXRUeXBlIHR5cGUsIGNvbnN0IGNoYXIgKnBhY2thZ2VfbmFtZSkKK3N0YXRpYyB2b2lkIG14Zl93cml0ZV9wYWNrYWdlKEFWRm9ybWF0Q29udGV4dCAqcywgTVhGUGFja2FnZSAqcGFja2FnZSkKIHsKICAgICBNWEZDb250ZXh0ICpteGYgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgaW50IGksIHRyYWNrX2NvdW50ID0gcy0+bmJfc3RyZWFtcysxOwotICAgIGludCBuYW1lX3NpemUgPSBteGZfdXRmMTZfbG9jYWxfdGFnX2xlbmd0aChwYWNrYWdlX25hbWUpOworICAgIGludCBuYW1lX3NpemUgPSBteGZfdXRmMTZfbG9jYWxfdGFnX2xlbmd0aChwYWNrYWdlLT5uYW1lKTsKICAgICBpbnQgdXNlcl9jb21tZW50X2NvdW50ID0gMDsKIAotICAgIGlmICh0eXBlID09IE1hdGVyaWFsUGFja2FnZSkgeworICAgIGlmIChwYWNrYWdlLT50eXBlID09IE1hdGVyaWFsUGFja2FnZSkgewogICAgICAgICBpZiAobXhmLT5zdG9yZV91c2VyX2NvbW1lbnRzKQogICAgICAgICAgICAgdXNlcl9jb21tZW50X2NvdW50ID0gbXhmX3dyaXRlX3VzZXJfY29tbWVudHMocywgcy0+bWV0YWRhdGEpOwogICAgICAgICBteGZfd3JpdGVfbWV0YWRhdGFfa2V5KHBiLCAweDAxMzYwMCk7CkBAIC0xMjc3LDE4ICsxMzY1LDE4IEBACiAKICAgICAvLyB3cml0ZSB1aWQKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHgzQzBBKTsKLSAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSwgMCk7Ci0gICAgYXZfbG9nKHMsQVZfTE9HX0RFQlVHLCAicGFja2FnZSB0eXBlOiVkXG4iLCB0eXBlKTsKKyAgICBteGZfd3JpdGVfdXVpZChwYiwgcGFja2FnZS0+dHlwZSwgcGFja2FnZS0+aW5zdGFuY2UpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJwYWNrYWdlIHR5cGU6JWRcbiIsIHBhY2thZ2UtPnR5cGUpOwogICAgIFBSSU5UX0tFWShzLCAicGFja2FnZSB1aWQiLCBwYi0+YnVmX3B0ciAtIDE2KTsKIAogICAgIC8vIHdyaXRlIHBhY2thZ2UgdW1pZAogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDMyLCAweDQ0MDEpOwotICAgIG14Zl93cml0ZV91bWlkKHMsIHR5cGUgPT0gU291cmNlUGFja2FnZSk7CisgICAgbXhmX3dyaXRlX3VtaWQocywgcGFja2FnZS0+aW5zdGFuY2UpOwogICAgIFBSSU5UX0tFWShzLCAicGFja2FnZSB1bWlkIHNlY29uZCBwYXJ0IiwgcGItPmJ1Zl9wdHIgLSAxNik7CiAKICAgICAvLyBwYWNrYWdlIG5hbWUKICAgICBpZiAobmFtZV9zaXplKQotICAgICAgICBteGZfd3JpdGVfbG9jYWxfdGFnX3V0ZjE2KHBiLCAweDQ0MDIsIHBhY2thZ2VfbmFtZSk7CisgICAgICAgIG14Zl93cml0ZV9sb2NhbF90YWdfdXRmMTYocGIsIDB4NDQwMiwgcGFja2FnZS0+bmFtZSk7CiAKICAgICAvLyBwYWNrYWdlIGNyZWF0aW9uIGRhdGUKICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCA4LCAweDQ0MDUpOwpAQCAtMTMwMSwxMCArMTM4OSw5IEBACiAgICAgLy8gd3JpdGUgdHJhY2sgcmVmcwogICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIHRyYWNrX2NvdW50KjE2ICsgOCwgMHg0NDAzKTsKICAgICBteGZfd3JpdGVfcmVmc19jb3VudChwYiwgdHJhY2tfY291bnQpOwotICAgIG14Zl93cml0ZV91dWlkKHBiLCB0eXBlID09IE1hdGVyaWFsUGFja2FnZSA/IFRyYWNrIDoKLSAgICAgICAgICAgICAgICAgICBUcmFjayArIFR5cGVCb3R0b20sIC0xKTsgLy8gdGltZWNvZGUgdHJhY2sKLSAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQotICAgICAgICBteGZfd3JpdGVfdXVpZChwYiwgdHlwZSA9PSBNYXRlcmlhbFBhY2thZ2UgPyBUcmFjayA6IFRyYWNrICsgVHlwZUJvdHRvbSwgaSk7CisgICAgLy8gdGhlc2UgYXJlIHRoZSB1dWlkcyBvZiB0aGUgdHJhY2tzIHRoZSB3aWxsIGJlIHdyaXR0ZW4gaW4gbXhmX3dyaXRlX3RyYWNrCisgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrX2NvdW50OyBpKyspCisgICAgICAgIG14Zl93cml0ZV91dWlkKHBiLCBUcmFjaywgIG14Zi0+dHJhY2tfaW5zdGFuY2VfY291bnQgKyBpKTsKIAogICAgIC8vIHdyaXRlIHVzZXIgY29tbWVudCByZWZzCiAgICAgaWYgKG14Zi0+c3RvcmVfdXNlcl9jb21tZW50cykgewpAQCAtMTMxNSwyNyArMTQwMiw0MSBAQAogICAgIH0KIAogICAgIC8vIHdyaXRlIG11bHRpcGxlIGRlc2NyaXB0b3IgcmVmZXJlbmNlCi0gICAgaWYgKHR5cGUgPT0gU291cmNlUGFja2FnZSkgeworICAgIGlmIChwYWNrYWdlLT50eXBlID09IFNvdXJjZVBhY2thZ2UgJiYgcGFja2FnZS0+aW5zdGFuY2UgPT0gMSkgewogICAgICAgICBteGZfd3JpdGVfbG9jYWxfdGFnKHBiLCAxNiwgMHg0NzAxKTsKICAgICAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPiAxKSB7CiAgICAgICAgICAgICBteGZfd3JpdGVfdXVpZChwYiwgTXVsdGlwbGVEZXNjcmlwdG9yLCAwKTsKICAgICAgICAgICAgIG14Zl93cml0ZV9tdWx0aV9kZXNjcmlwdG9yKHMpOwogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgIG14Zl93cml0ZV91dWlkKHBiLCBTdWJEZXNjcmlwdG9yLCAwKTsKKyAgICB9IGVsc2UgaWYgKHBhY2thZ2UtPnR5cGUgPT0gU291cmNlUGFja2FnZSAmJiBwYWNrYWdlLT5pbnN0YW5jZSA9PSAyKSB7CisgICAgICAgIG14Zl93cml0ZV9sb2NhbF90YWcocGIsIDE2LCAweDQ3MDEpOworICAgICAgICBteGZfd3JpdGVfdXVpZChwYiwgVGFwZURlc2NyaXB0b3IsIDApOworICAgICAgICBteGZfd3JpdGVfdGFwZV9kZXNjcmlwdG9yKHMpOwogICAgIH0KIAorICAgIC8qCisgICAgICogZm9yIGV2ZXJ5IDEgdHJhY2sgaW4gYSBwYWNrYWdlIHRoZXJlIGlzIDEgc2VxdWVuY2UgYW5kIDEgY29tcG9uZW50LgorICAgICAqIGFsbCAzIG9mIHRoZXNlIGVsZW1lbnRzIHNoYXJlIHRoZSBzYW1lIGluc3RhbmNlIG51bWJlciBmb3IgZ2VuZXJhdGluZworICAgICAqIHRoZXJlIGluc3RhbmNlIHV1aWRzLiBteGYtPnRyYWNrX2luc3RhbmNlX2NvdW50IHN0b3JlcyB0aGlzIHZhbHVlLgorICAgICAqIG14Zi0+dHJhY2tfaW5zdGFuY2VfY291bnQgaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgYSBncm91cCBvZiBhbGwgMyBvZgorICAgICAqIHRoZXNlIGVsZW1lbnRzIGFyZSB3cml0dGVuLgorICAgICAqLworCiAgICAgLy8gd3JpdGUgdGltZWNvZGUgdHJhY2sKLSAgICBteGZfd3JpdGVfdHJhY2socywgbXhmLT50aW1lY29kZV90cmFjaywgdHlwZSk7Ci0gICAgbXhmX3dyaXRlX3NlcXVlbmNlKHMsIG14Zi0+dGltZWNvZGVfdHJhY2ssIHR5cGUpOwotICAgIG14Zl93cml0ZV90aW1lY29kZV9jb21wb25lbnQocywgbXhmLT50aW1lY29kZV90cmFjaywgdHlwZSk7CisgICAgbXhmX3dyaXRlX3RyYWNrKHMsIG14Zi0+dGltZWNvZGVfdHJhY2ssIHBhY2thZ2UpOworICAgIG14Zl93cml0ZV9zZXF1ZW5jZShzLCBteGYtPnRpbWVjb2RlX3RyYWNrLCBwYWNrYWdlKTsKKyAgICBteGZfd3JpdGVfdGltZWNvZGVfY29tcG9uZW50KHMsIG14Zi0+dGltZWNvZGVfdHJhY2ssIHBhY2thZ2UpOworICAgIG14Zi0+dHJhY2tfaW5zdGFuY2VfY291bnQrKzsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgbXhmX3dyaXRlX3RyYWNrKHMsIHN0LCB0eXBlKTsKLSAgICAgICAgbXhmX3dyaXRlX3NlcXVlbmNlKHMsIHN0LCB0eXBlKTsKLSAgICAgICAgbXhmX3dyaXRlX3N0cnVjdHVyYWxfY29tcG9uZW50KHMsIHN0LCB0eXBlKTsKKyAgICAgICAgbXhmX3dyaXRlX3RyYWNrKHMsIHN0LCBwYWNrYWdlKTsKKyAgICAgICAgbXhmX3dyaXRlX3NlcXVlbmNlKHMsIHN0LCBwYWNrYWdlKTsKKyAgICAgICAgbXhmX3dyaXRlX3N0cnVjdHVyYWxfY29tcG9uZW50KHMsIHN0LCBwYWNrYWdlKTsKKyAgICAgICAgbXhmLT50cmFja19pbnN0YW5jZV9jb3VudCsrOwogCi0gICAgICAgIGlmICh0eXBlID09IFNvdXJjZVBhY2thZ2UpIHsKKyAgICAgICAgaWYgKHBhY2thZ2UtPnR5cGUgPT0gU291cmNlUGFja2FnZSAmJiBwYWNrYWdlLT5pbnN0YW5jZSA9PSAxKSB7CiAgICAgICAgICAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CiAgICAgICAgICAgICBteGZfZXNzZW5jZV9jb250YWluZXJfdWxzW3NjLT5pbmRleF0ud3JpdGVfZGVzYyhzLCBzdCk7CiAgICAgICAgIH0KQEAgLTEzNjYsMzMgKzE0NjcsNDkgQEAKIAogc3RhdGljIGludCBteGZfd3JpdGVfaGVhZGVyX21ldGFkYXRhX3NldHMoQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIGNvbnN0IGNoYXIgKm1hdGVyaWFsX3BhY2thZ2VfbmFtZSA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciAqZmlsZV9wYWNrYWdlX25hbWUgPSBOVUxMOworICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZW50cnkgPSBOVUxMOwogICAgIEFWU3RyZWFtICpzdCA9IE5VTEw7CiAgICAgaW50IGk7CisgICAgTVhGUGFja2FnZSBwYWNrYWdlc1szXSA9IHt7MH19OworICAgIGludCBwYWNrYWdlX2NvdW50ID0gMjsKKyAgICBwYWNrYWdlc1swXS50eXBlID0gTWF0ZXJpYWxQYWNrYWdlOworICAgIHBhY2thZ2VzWzFdLnR5cGUgPSBTb3VyY2VQYWNrYWdlOworICAgIHBhY2thZ2VzWzFdLmluc3RhbmNlID0gMTsKKyAgICBwYWNrYWdlc1swXS5yZWYgPSAmcGFja2FnZXNbMV07CisKIAogICAgIGlmIChlbnRyeSA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAibWF0ZXJpYWxfcGFja2FnZV9uYW1lIiwgTlVMTCwgMCkpCi0gICAgICAgbWF0ZXJpYWxfcGFja2FnZV9uYW1lID0gZW50cnktPnZhbHVlOworICAgICAgIHBhY2thZ2VzWzBdLm5hbWUgPSBlbnRyeS0+dmFsdWU7CiAKICAgICBpZiAoZW50cnkgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgImZpbGVfcGFja2FnZV9uYW1lIiwgTlVMTCwgMCkpIHsKLSAgICAgICAgZmlsZV9wYWNrYWdlX25hbWUgPSBlbnRyeS0+dmFsdWU7CisgICAgICAgIHBhY2thZ2VzWzFdLm5hbWUgPSBlbnRyeS0+dmFsdWU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogY2hlY2sgaWYgYW55IG9mIHRoZSBzdHJlYW1zIGNvbnRhaW4gYSBmaWxlX3BhY2thZ2VfbmFtZSAqLwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgICAgICBpZiAoZW50cnkgPSBhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICJmaWxlX3BhY2thZ2VfbmFtZSIsIE5VTEwsIDApKSB7Ci0gICAgICAgICAgICAgICAgZmlsZV9wYWNrYWdlX25hbWUgPSBlbnRyeS0+dmFsdWU7CisgICAgICAgICAgICAgICAgcGFja2FnZXNbMV0ubmFtZSA9IGVudHJ5LT52YWx1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAorICAgIGVudHJ5ID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJyZWVsX25hbWUiLCBOVUxMLCAwKTsKKyAgICBpZiAoZW50cnkpIHsKKyAgICAgICAgcGFja2FnZXNbMl0ubmFtZSA9IGVudHJ5LT52YWx1ZTsKKyAgICAgICAgcGFja2FnZXNbMl0udHlwZSA9IFNvdXJjZVBhY2thZ2U7CisgICAgICAgIHBhY2thZ2VzWzJdLmluc3RhbmNlID0gMjsKKyAgICAgICAgcGFja2FnZXNbMV0ucmVmID0gJnBhY2thZ2VzWzJdOworICAgICAgICBwYWNrYWdlX2NvdW50ID0gMzsKKyAgICB9CisKICAgICBteGZfd3JpdGVfcHJlZmFjZShzKTsKICAgICBteGZfd3JpdGVfaWRlbnRpZmljYXRpb24ocyk7Ci0gICAgbXhmX3dyaXRlX2NvbnRlbnRfc3RvcmFnZShzKTsKLSAgICBteGZfd3JpdGVfcGFja2FnZShzLCBNYXRlcmlhbFBhY2thZ2UsIG1hdGVyaWFsX3BhY2thZ2VfbmFtZSk7Ci0gICAgbXhmX3dyaXRlX3BhY2thZ2UocywgU291cmNlUGFja2FnZSwgZmlsZV9wYWNrYWdlX25hbWUpOworICAgIG14Zl93cml0ZV9jb250ZW50X3N0b3JhZ2UocywgcGFja2FnZXMsIHBhY2thZ2VfY291bnQpOworICAgIG14Zi0+dHJhY2tfaW5zdGFuY2VfY291bnQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBwYWNrYWdlX2NvdW50OyBpKyspCisgICAgICAgIG14Zl93cml0ZV9wYWNrYWdlKHMsICZwYWNrYWdlc1tpXSk7CiAgICAgbXhmX3dyaXRlX2Vzc2VuY2VfY29udGFpbmVyX2RhdGEocyk7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNDk2LDcgKzE2MTMsNyBAQAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXhmLT5lZGl0X3VuaXRzX2NvdW50OyBpKyspIHsKICAgICAgICAgICAgIGludCB0ZW1wb3JhbF9vZmZzZXQgPSAwOwogCi0gICAgICAgICAgICBpZiAoIShteGYtPmluZGV4X2VudHJpZXNbaV0uZmxhZ3MgJiAweDMzKSkgeyAvLyBJIGZyYW1lCisgICAgICAgICAgICBpZiAoIShteGYtPmluZGV4X2VudHJpZXNbaV0uZmxhZ3MgJiAweDMzKSkgeyAvLyBJLWZyYW1lCiAgICAgICAgICAgICAgICAgbXhmLT5sYXN0X2tleV9pbmRleCA9IGtleV9pbmRleDsKICAgICAgICAgICAgICAgICBrZXlfaW5kZXggPSBpOwogICAgICAgICAgICAgfQpAQCAtMTUyMyw3ICsxNjQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgbXhmLT5sYXN0X2tleV9pbmRleCA9IGtleV9pbmRleDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCEobXhmLT5pbmRleF9lbnRyaWVzW2ldLmZsYWdzICYgMHgzMykgJiYgLy8gSSBmcmFtZQorICAgICAgICAgICAgaWYgKCEobXhmLT5pbmRleF9lbnRyaWVzW2ldLmZsYWdzICYgMHgzMykgJiYgLy8gSS1mcmFtZQogICAgICAgICAgICAgICAgIG14Zi0+aW5kZXhfZW50cmllc1tpXS5mbGFncyAmIDB4NDAgJiYgIXRlbXBvcmFsX29mZnNldCkKICAgICAgICAgICAgICAgICBteGYtPmluZGV4X2VudHJpZXNbaV0uZmxhZ3MgfD0gMHg4MDsgLy8gcmFuZG9tIGFjY2VzcwogICAgICAgICAgICAgYXZpb193OChwYiwgbXhmLT5pbmRleF9lbnRyaWVzW2ldLmZsYWdzKTsKQEAgLTE2ODEsMzcgKzE3OTgsMzcgQEAKIAogICAgIHN3aXRjaCAoY2lkKSB7CiAgICAgY2FzZSAxMjM1OgotICAgICAgICBzYy0+aW5kZXggPSAyNDsKKyAgICAgICAgc2MtPmluZGV4ID0gSU5ERVhfRE5YSERfMTA4MHBfMTBiaXRfSElHSDsKICAgICAgICAgc2MtPmNvbXBvbmVudF9kZXB0aCA9IDEwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDEyMzc6Ci0gICAgICAgIHNjLT5pbmRleCA9IDI1OworICAgICAgICBzYy0+aW5kZXggPSBJTkRFWF9ETlhIRF8xMDgwcF84Yml0X01FRElVTTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxMjM4OgotICAgICAgICBzYy0+aW5kZXggPSAyNjsKKyAgICAgICAgc2MtPmluZGV4ID0gSU5ERVhfRE5YSERfMTA4MHBfOGJpdF9ISUdIOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDEyNDE6Ci0gICAgICAgIHNjLT5pbmRleCA9IDI3OworICAgICAgICBzYy0+aW5kZXggPSBJTkRFWF9ETlhIRF8xMDgwaV8xMGJpdF9ISUdIOwogICAgICAgICBzYy0+Y29tcG9uZW50X2RlcHRoID0gMTA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTI0MjoKLSAgICAgICAgc2MtPmluZGV4ID0gMjg7CisgICAgICAgIHNjLT5pbmRleCA9IElOREVYX0ROWEhEXzEwODBpXzhiaXRfTUVESVVNOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDEyNDM6Ci0gICAgICAgIHNjLT5pbmRleCA9IDI5OworICAgICAgICBzYy0+aW5kZXggPSBJTkRFWF9ETlhIRF8xMDgwaV84Yml0X0hJR0g7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTI1MDoKLSAgICAgICAgc2MtPmluZGV4ID0gMzA7CisgICAgICAgIHNjLT5pbmRleCA9IElOREVYX0ROWEhEXzcyMHBfMTBiaXQ7CiAgICAgICAgIHNjLT5jb21wb25lbnRfZGVwdGggPSAxMDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxMjUxOgotICAgICAgICBzYy0+aW5kZXggPSAzMTsKKyAgICAgICAgc2MtPmluZGV4ID0gSU5ERVhfRE5YSERfNzIwcF84Yml0X0hJR0g7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTI1MjoKLSAgICAgICAgc2MtPmluZGV4ID0gMzI7CisgICAgICAgIHNjLT5pbmRleCA9IElOREVYX0ROWEhEXzcyMHBfOGJpdF9NRURJVU07CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTI1MzoKLSAgICAgICAgc2MtPmluZGV4ID0gMzM7CisgICAgICAgIHNjLT5pbmRleCA9IElOREVYX0ROWEhEXzcyMHBfOGJpdF9MT1c7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE3MjAsNyArMTgzNyw3IEBACiAgICAgc2MtPmNvZGVjX3VsID0gJm14Zl9lc3NlbmNlX2NvbnRhaW5lcl91bHNbc2MtPmluZGV4XS5jb2RlY191bDsKICAgICBzYy0+YXNwZWN0X3JhdGlvID0gKEFWUmF0aW9uYWwpeyAxNiwgOSB9OwogCi0gICAgaWYocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX29wYXRvbV9tdXhlcil7CisgICAgaWYgKHMtPm9mb3JtYXQgPT0gJmZmX214Zl9vcGF0b21fbXV4ZXIpIHsKICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCA9IGZyYW1lX3NpemU7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTE3MjksMTAgKzE4NDYsMTAgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgIE1YRlN0cmVhbUNvbnRleHQgKnNjID0gc3QtPnByaXZfZGF0YTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKICAgICAgICAgICAgIG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgKz0gMTYgKyA0ICsgc2MtPmFpYy5zYW1wbGVzWzBdKnNjLT5haWMuc2FtcGxlX3NpemU7CiAgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICs9IGtsdl9maWxsX3NpemUobXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgICAgIG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgKz0gMTYgKyA0ICsgZnJhbWVfc2l6ZTsKICAgICAgICAgICAgIG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQgKz0ga2x2X2ZpbGxfc2l6ZShteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50KTsKICAgICAgICAgfQpAQCAtMTc0Nyw2ICsxODY0LDcgQEAKICAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7CiAgICAgdWludDhfdCAqdnNfcGFjaywgKnZzY19wYWNrOwogICAgIGludCBpLCB1bF9pbmRleCwgZnJhbWVfc2l6ZSwgc3R5cGUsIHBhbDsKKyAgICBjb25zdCBBVkRWUHJvZmlsZSAqcHJvZmlsZTsKIAogICAgIGlmIChteGYtPmhlYWRlcl93cml0dGVuKQogICAgICAgICByZXR1cm4gMTsKQEAgLTE3NTUsMTUgKzE4NzMsMTggQEAKICAgICBpZiAocGt0LT5zaXplIDwgMTIwMDAwKQogICAgICAgICByZXR1cm4gLTE7CiAKKyAgICBwcm9maWxlID0gYXZfZHZfZnJhbWVfcHJvZmlsZShOVUxMLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisKICAgICB2c19wYWNrICA9IHBrdC0+ZGF0YSArIDgwKjUgKyA0ODsKICAgICB2c2NfcGFjayA9IHBrdC0+ZGF0YSArIDgwKjUgKyA1MzsKICAgICBzdHlwZSAgICA9IHZzX3BhY2tbM10gJiAweDFmOwogICAgIHBhbCAgICAgID0gKHZzX3BhY2tbM10gPj4gNSkgJiAweDE7CiAKLSAgICBpZiAoKHZzX3BhY2tbMl0gJiAweDA3KSA9PSAweDAyKQorICAgIGlmICgodnNjX3BhY2tbMl0gJiAweDA3KSA9PSAweDAyKSB7CiAgICAgICAgIHNjLT5hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDE2LCA5IH07Ci0gICAgZWxzZQorICAgIH0gZWxzZSB7CiAgICAgICAgIHNjLT5hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDQsIDMgfTsKKyAgICB9CiAKICAgICBzYy0+aW50ZXJsYWNlZCA9ICh2c2NfcGFja1szXSA+PiA0KSAmIDB4MDE7CiAgICAgLy8gVE9ETzogZml4IGR2IGVuY29kZXIgdG8gc2V0IHByb3BlciBGRi9GUyB2YWx1ZSBpbiBWU0MgcGFjawpAQCAtMTc3Miw3ICsxODkzLDcgQEAKIAogICAgIHN3aXRjaCAoc3R5cGUpIHsKICAgICBjYXNlIDB4MTg6IC8vIERWMTAwIDcyMHAKLSAgICAgICAgdWxfaW5kZXggPSA2ICsgcGFsOworICAgICAgICB1bF9pbmRleCA9IElOREVYX0RWMTAwXzcyMF81MCArIHBhbDsKICAgICAgICAgZnJhbWVfc2l6ZSA9IHBhbCA/IDI4ODAwMCA6IDI0MDAwMDsKICAgICAgICAgaWYgKHNjLT5pbnRlcmxhY2VkKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAic291cmNlIG1hcmtlZCBhcyBpbnRlcmxhY2VkIGJ1dCBjb2RlYyBwcm9maWxlIGlzIHByb2dyZXNzaXZlXG4iKTsKQEAgLTE3ODAsMTkgKzE5MDEsMjQgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIDB4MTQ6IC8vIERWMTAwIDEwODBpCi0gICAgICAgIHVsX2luZGV4ID0gNCArIHBhbDsKKyAgICAgICAgdWxfaW5kZXggPSBJTkRFWF9EVjEwMF8xMDgwXzUwICsgcGFsOwogICAgICAgICBmcmFtZV9zaXplID0gcGFsID8gNTc2MDAwIDogNDgwMDAwOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDB4MDQ6IC8vIERWNTAKLSAgICAgICAgdWxfaW5kZXggPSAyICsgcGFsOworICAgICAgICB1bF9pbmRleCA9IElOREVYX0RWNTBfNTI1XzYwICsgcGFsOwogICAgICAgICBmcmFtZV9zaXplID0gcGFsID8gMjg4MDAwIDogMjQwMDAwOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OiAvLyBEVjI1Ci0gICAgICAgIHVsX2luZGV4ID0gMCArIHBhbDsKKyAgICAgICAgaWYgKHByb2ZpbGUgJiYgcHJvZmlsZS0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAgJiYgcGFsKSB7CisgICAgICAgICAgICB1bF9pbmRleCA9IElOREVYX0RWMjVfNTI1XzYwX0lFQyArIHBhbDsKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSBwYWwgPyAxNDQwMDAgOiAxMjAwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1bF9pbmRleCA9IElOREVYX0RWMjVfNTI1XzYwICsgcGFsOwogICAgICAgICBmcmFtZV9zaXplID0gcGFsID8gMTQ0MDAwIDogMTIwMDAwOwogICAgIH0KIAotICAgIHNjLT5pbmRleCA9IHVsX2luZGV4ICsgMTY7CisgICAgc2MtPmluZGV4ID0gdWxfaW5kZXg7CiAgICAgc2MtPmNvZGVjX3VsID0gICZteGZfZXNzZW5jZV9jb250YWluZXJfdWxzW3NjLT5pbmRleF0uY29kZWNfdWw7CiAKICAgICBpZihzLT5vZm9ybWF0ID09ICZmZl9teGZfb3BhdG9tX211eGVyKSB7CkBAIC0xODA0LDEwICsxOTMwLDEwIEBACiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOwogICAgICAgICBNWEZTdHJlYW1Db250ZXh0ICpzYyA9IHN0LT5wcml2X2RhdGE7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICs9IDE2ICsgNCArIHNjLT5haWMuc2FtcGxlc1swXSpzYy0+YWljLnNhbXBsZV9zaXplOwogICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCArPSBrbHZfZmlsbF9zaXplKG14Zi0+ZWRpdF91bml0X2J5dGVfY291bnQpOwotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICs9IDE2ICsgNCArIGZyYW1lX3NpemU7CiAgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICs9IGtsdl9maWxsX3NpemUobXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCk7CiAgICAgICAgIH0KQEAgLTE4MjIsNiArMTk0OCw3IEBACiAgICAgaW50IHByb2ZpbGU7CiAgICAgdWludDhfdCBpbnRlcmxhY2VkOwogfSBteGZfaDI2NF9jb2RlY191bHNbXSA9IHsKKyAgICB7eyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MGEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MzEsMHgxMSwweDAxIH0sICAgICAgMCwgIDY2LCAwIH0sIC8vIEFWQyBCYXNlbGluZSwgVW5jb25zdHJhaW5lZCBDb2RpbmcKICAgICB7eyAweDA2LDB4MEUsMHgyQiwweDM0LDB4MDQsMHgwMSwweDAxLDB4MGEsMHgwNCwweDAxLDB4MDIsMHgwMiwweDAxLDB4MzIsMHgyMCwweDAxIH0sICAgICAgMCwgMTEwLCAwIH0sIC8vIEFWQyBIaWdoIDEwIEludHJhCiAgICAge3sgMHgwNiwweDBFLDB4MkIsMHgzNCwweDA0LDB4MDEsMHgwMSwweDBhLDB4MDQsMHgwMSwweDAyLDB4MDIsMHgwMSwweDMyLDB4MjEsMHgwMSB9LCAyMzI5NjAsICAgMCwgMSB9LCAvLyBBVkMgSW50cmEgNTAgMTA4MGk2MAogICAgIHt7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwYSwweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgzMiwweDIxLDB4MDIgfSwgMjgxMDg4LCAgIDAsIDEgfSwgLy8gQVZDIEludHJhIDUwIDEwODBpNTAKQEAgLTE4NjAsMTEgKzE5ODcsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAtLWJ1ZjsKICAgICAgICAgc3dpdGNoIChzdGF0ZSAmIDB4MWYpIHsKLSAgICAgICAgY2FzZSBOQUxfU1BTOgotICAgICAgICAgICAgc3QtPmNvZGVjLT5wcm9maWxlID0gYnVmWzFdOworICAgICAgICBjYXNlIEgyNjRfTkFMX1NQUzoKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+cHJvZmlsZSA9IGJ1ZlsxXTsKICAgICAgICAgICAgIGUtPmZsYWdzIHw9IDB4NDA7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOQUxfUFBTOgorICAgICAgICBjYXNlIEgyNjRfTkFMX1BQUzoKICAgICAgICAgICAgIGlmIChlLT5mbGFncyAmIDB4NDApIHsgLy8gc2VxdWVuY2UgaGVhZGVyIHByZXNlbnQKICAgICAgICAgICAgICAgICBlLT5mbGFncyB8PSAweDgwOyAvLyByYW5kb20gYWNjZXNzCiAgICAgICAgICAgICAgICAgZXh0cmFfc2l6ZSA9IDA7CkBAIC0xODgxLDcgKzIwMDgsNyBAQAogCiAgICAgc2MtPmFzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsgMTYsIDkgfTsgLy8gMTY6OSBpcyBtYW5kYXRvcnkgZm9yIGJyb2FkY2FzdCBIRAogICAgIHNjLT5jb21wb25lbnRfZGVwdGggPSAxMDsgLy8gQVZDIEludHJhIGlzIGFsd2F5cyAxMCBCaXQKLSAgICBzYy0+aW50ZXJsYWNlZCA9IHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgIT0gQVZfRklFTERfUFJPR1JFU1NJVkUgPyAxIDogMDsKKyAgICBzYy0+aW50ZXJsYWNlZCA9IHN0LT5jb2RlY3Bhci0+ZmllbGRfb3JkZXIgIT0gQVZfRklFTERfUFJPR1JFU1NJVkUgPyAxIDogMDsKICAgICBpZiAoc2MtPmludGVybGFjZWQpCiAgICAgICAgIHNjLT5maWVsZF9kb21pbmFuY2UgPSAxOyAvLyB0b3AgZmllbGQgZmlyc3QgaXMgbWFuZGF0b3J5IGZvciBBVkMgSW50cmEKIApAQCAtMTg5MSw3ICsyMDE4LDcgQEAKICAgICAgICAgaWYgKGZyYW1lX3NpemUgPT0gbXhmX2gyNjRfY29kZWNfdWxzW2ldLmZyYW1lX3NpemUgJiYgc2MtPmludGVybGFjZWQgPT0gbXhmX2gyNjRfY29kZWNfdWxzW2ldLmludGVybGFjZWQpIHsKICAgICAgICAgICAgIHNjLT5jb2RlY191bCA9ICZteGZfaDI2NF9jb2RlY191bHNbaV0udWlkOwogICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5wcm9maWxlID09IG14Zl9oMjY0X2NvZGVjX3Vsc1tpXS5wcm9maWxlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5wcm9maWxlID09IG14Zl9oMjY0X2NvZGVjX3Vsc1tpXS5wcm9maWxlKSB7CiAgICAgICAgICAgICBzYy0+Y29kZWNfdWwgPSAmbXhmX2gyNjRfY29kZWNfdWxzW2ldLnVpZDsKICAgICAgICAgICAgIHVpZF9mb3VuZCA9IDE7CiAgICAgICAgIH0KQEAgLTE5MTgsMjEgKzIwNDUsMjEgQEAKICAgICB7IDB4MDYsMHgwRSwweDJCLDB4MzQsMHgwNCwweDAxLDB4MDEsMHgwMywweDA0LDB4MDEsMHgwMiwweDAyLDB4MDEsMHgwNSwweDAzLDB4MDAgfSwgLy8gTVBASC0xNCBMb25nIEdPUAogfTsKIAotc3RhdGljIGNvbnN0IFVJRCAqbXhmX2dldF9tcGVnMl9jb2RlY191bChBVkNvZGVjQ29udGV4dCAqYXZjdHgpCitzdGF0aWMgY29uc3QgVUlEICpteGZfZ2V0X21wZWcyX2NvZGVjX3VsKEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpCiB7CiAgICAgaW50IGxvbmdfZ29wID0gMTsKIAotICAgIGlmIChhdmN0eC0+cHJvZmlsZSA9PSA0KSB7IC8vIE1haW4KLSAgICAgICAgaWYgKGF2Y3R4LT5sZXZlbCA9PSA4KSAvLyBNYWluCisgICAgaWYgKHBhci0+cHJvZmlsZSA9PSA0KSB7IC8vIE1haW4KKyAgICAgICAgaWYgKHBhci0+bGV2ZWwgPT0gOCkgLy8gTWFpbgogICAgICAgICAgICAgcmV0dXJuICZteGZfbXBlZzJfY29kZWNfdWxzWzArbG9uZ19nb3BdOwotICAgICAgICBlbHNlIGlmIChhdmN0eC0+bGV2ZWwgPT0gNCkgLy8gSGlnaAorICAgICAgICBlbHNlIGlmIChwYXItPmxldmVsID09IDQpIC8vIEhpZ2gKICAgICAgICAgICAgIHJldHVybiAmbXhmX21wZWcyX2NvZGVjX3Vsc1s0K2xvbmdfZ29wXTsKLSAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmxldmVsID09IDYpIC8vIEhpZ2ggMTQKKyAgICAgICAgZWxzZSBpZiAocGFyLT5sZXZlbCA9PSA2KSAvLyBIaWdoIDE0CiAgICAgICAgICAgICByZXR1cm4gJm14Zl9tcGVnMl9jb2RlY191bHNbOCtsb25nX2dvcF07Ci0gICAgfSBlbHNlIGlmIChhdmN0eC0+cHJvZmlsZSA9PSAwKSB7IC8vIDQyMgotICAgICAgICBpZiAoYXZjdHgtPmxldmVsID09IDUpIC8vIE1haW4KKyAgICB9IGVsc2UgaWYgKHBhci0+cHJvZmlsZSA9PSAwKSB7IC8vIDQyMgorICAgICAgICBpZiAocGFyLT5sZXZlbCA9PSA1KSAvLyBNYWluCiAgICAgICAgICAgICByZXR1cm4gJm14Zl9tcGVnMl9jb2RlY191bHNbMitsb25nX2dvcF07Ci0gICAgICAgIGVsc2UgaWYgKGF2Y3R4LT5sZXZlbCA9PSAyKSAvLyBIaWdoCisgICAgICAgIGVsc2UgaWYgKHBhci0+bGV2ZWwgPT0gMikgLy8gSGlnaAogICAgICAgICAgICAgcmV0dXJuICZteGZfbXBlZzJfY29kZWNfdWxzWzYrbG9uZ19nb3BdOwogICAgIH0KICAgICByZXR1cm4gTlVMTDsKQEAgLTE5NDksOCArMjA3Niw4IEBACiAgICAgICAgIGMgPSAoYzw8OCkgKyBwa3QtPmRhdGFbaV07CiAgICAgICAgIGlmIChjID09IDB4MWI1KSB7CiAgICAgICAgICAgICBpZiAoKHBrdC0+ZGF0YVtpKzFdICYgMHhmMCkgPT0gMHgxMCkgeyAvLyBzZXEgZXh0Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5wcm9maWxlID0gcGt0LT5kYXRhW2krMV0gJiAweDA3OwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+bGV2ZWwgICA9IHBrdC0+ZGF0YVtpKzJdID4+IDQ7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5wcm9maWxlID0gcGt0LT5kYXRhW2krMV0gJiAweDA3OworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+bGV2ZWwgICA9IHBrdC0+ZGF0YVtpKzJdID4+IDQ7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgKyA1IDwgcGt0LT5zaXplICYmIChwa3QtPmRhdGFbaSsxXSAmIDB4ZjApID09IDB4ODApIHsgLy8gcGljdCBjb2RpbmcgZXh0CiAgICAgICAgICAgICAgICAgc2MtPmludGVybGFjZWQgPSAhKHBrdC0+ZGF0YVtpKzVdICYgMHg4MCk7IC8vIHByb2dyZXNzaXZlIGZyYW1lCiAgICAgICAgICAgICAgICAgaWYgKHNjLT5pbnRlcmxhY2VkKQpAQCAtMTk3MSwxNSArMjA5OCwxNSBAQAogICAgICAgICAgICAgY2FzZSA0OiAgc2MtPmFzcGVjdF9yYXRpbyA9IChBVlJhdGlvbmFsKXsyMjEsMTAwfTsgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGF2X3JlZHVjZSgmc2MtPmFzcGVjdF9yYXRpby5udW0sICZzYy0+YXNwZWN0X3JhdGlvLmRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHQsIDEwMjQqMTAyNCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGgsIHN0LT5jb2RlY3Bhci0+aGVpZ2h0LCAxMDI0KjEwMjQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGMgPT0gMHgxMDApIHsgLy8gcGljCiAgICAgICAgICAgICBpbnQgcGljdF90eXBlID0gKHBrdC0+ZGF0YVtpKzJdPj4zKSAmIDB4MDc7CiAgICAgICAgICAgICBlLT50ZW1wb3JhbF9yZWYgPSAocGt0LT5kYXRhW2krMV08PDIpIHwgKHBrdC0+ZGF0YVtpKzJdPj42KTsKLSAgICAgICAgICAgIGlmIChwaWN0X3R5cGUgPT0gMikgeyAvLyBQIGZyYW1lCisgICAgICAgICAgICBpZiAocGljdF90eXBlID09IDIpIHsgLy8gUC1mcmFtZQogICAgICAgICAgICAgICAgIGUtPmZsYWdzIHw9IDB4MjI7Ci0gICAgICAgICAgICAgICAgc2MtPmNsb3NlZF9nb3AgPSAwOyAvLyByZXNldCBjbG9zZWQgZ29wLCBkb24ndCBtYXR0ZXIgYW55bW9yZQotICAgICAgICAgICAgfSBlbHNlIGlmIChwaWN0X3R5cGUgPT0gMykgeyAvLyBCIGZyYW1lCisgICAgICAgICAgICAgICAgc2MtPmNsb3NlZF9nb3AgPSAwOyAvLyByZXNldCBjbG9zZWQgR09QLCBkb24ndCBtYXR0ZXIgYW55bW9yZQorICAgICAgICAgICAgfSBlbHNlIGlmIChwaWN0X3R5cGUgPT0gMykgeyAvLyBCLWZyYW1lCiAgICAgICAgICAgICAgICAgaWYgKHNjLT5jbG9zZWRfZ29wKQogICAgICAgICAgICAgICAgICAgICBlLT5mbGFncyB8PSAweDEzOyAvLyBvbmx5IGJhY2t3YXJkIHByZWRpY3Rpb24KICAgICAgICAgICAgICAgICBlbHNlCkBAIC0xOTkyLDcgKzIxMTksNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChzLT5vZm9ybWF0ICE9ICZmZl9teGZfZDEwX211eGVyKQotICAgICAgICBzYy0+Y29kZWNfdWwgPSBteGZfZ2V0X21wZWcyX2NvZGVjX3VsKHN0LT5jb2RlYyk7CisgICAgICAgIHNjLT5jb2RlY191bCA9IG14Zl9nZXRfbXBlZzJfY29kZWNfdWwoc3QtPmNvZGVjcGFyKTsKICAgICByZXR1cm4gISFzYy0+Y29kZWNfdWw7CiB9CiAKQEAgLTIwNDYsNyArMjE3Myw3IEBACiAgICAgaWYgKCFzLT5uYl9zdHJlYW1zKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBpZiAocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX29wYXRvbV9tdXhlciAmJiBzLT5uYl9zdHJlYW1zICE9MSl7CisgICAgaWYgKHMtPm9mb3JtYXQgPT0gJmZmX214Zl9vcGF0b21fbXV4ZXIgJiYgcy0+bmJfc3RyZWFtcyAhPTEpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgc3RyZWFtIGZvciBteGYgb3BhdG9tXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTIwNjEsMTMgKzIxODgsMTMgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIHN0LT5wcml2X2RhdGEgPSBzYzsKIAotICAgICAgICBpZiAoKChpID09IDApIF4gKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pKSAmJiBzLT5vZm9ybWF0ICE9ICZmZl9teGZfb3BhdG9tX211eGVyKSB7CisgICAgICAgIGlmICgoKGkgPT0gMCkgXiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykpICYmIHMtPm9mb3JtYXQgIT0gJmZmX214Zl9vcGF0b21fbXV4ZXIpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0aGVyZSBtdXN0IGJlIGV4YWN0bHkgb25lIHZpZGVvIHN0cmVhbSBhbmQgaXQgbXVzdCBiZSB0aGUgZmlyc3Qgb25lXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKnBpeF9kZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzdC0+Y29kZWMtPnBpeF9mbXQpOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoc3QtPmNvZGVjcGFyLT5mb3JtYXQpOwogICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIGJlIGF2Z19mcmFtZV9yYXRlCiAgICAgICAgICAgICBBVlJhdGlvbmFsIHJhdGUsIHRiYyA9IHN0LT50aW1lX2Jhc2U7CiAgICAgICAgICAgICAvLyBEZWZhdWx0IGNvbXBvbmVudCBkZXB0aCB0byA4CkBAIC0yMDk5LDE4ICsyMjI2LDIyIEBACiAgICAgICAgICAgICBpZigocmV0ID0gbXhmX2luaXRfdGltZWNvZGUocywgc3QsIHJhdGUpKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICAgICAgc2MtPnZpZGVvX2JpdF9yYXRlID0gc3QtPmNvZGVjLT5iaXRfcmF0ZSA/IHN0LT5jb2RlYy0+Yml0X3JhdGUgOiBzdC0+Y29kZWMtPnJjX21heF9yYXRlOworICAgICAgICAgICAgc2MtPnZpZGVvX2JpdF9yYXRlID0gc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZTsKICAgICAgICAgICAgIGlmIChzLT5vZm9ybWF0ID09ICZmZl9teGZfZDEwX211eGVyKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZXJyb3IgTVhGIEQtMTAgb25seSBzdXBwb3J0IE1QRUctMiBWaWRlb1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmICgoc2MtPnZpZGVvX2JpdF9yYXRlID09IDUwMDAwMDAwKSAmJiAobXhmLT50aW1lX2Jhc2UuZGVuID09IDI1KSkgewotICAgICAgICAgICAgICAgICAgICBzYy0+aW5kZXggPSAzOworICAgICAgICAgICAgICAgICAgICBzYy0+aW5kZXggPSBJTkRFWF9EMTBfNjI1XzUwXzUwX1ZJREVPOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHNjLT52aWRlb19iaXRfcmF0ZSA9PSA0OTk5OTg0MCB8fCBzYy0+dmlkZW9fYml0X3JhdGUgPT0gNTAwMDAwMDApICYmIChteGYtPnRpbWVfYmFzZS5kZW4gIT0gMjUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjLT5pbmRleCA9IDU7CisgICAgICAgICAgICAgICAgICAgIHNjLT5pbmRleCA9IElOREVYX0QxMF81MjVfNjBfNTBfVklERU87CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzYy0+dmlkZW9fYml0X3JhdGUgPT0gNDAwMDAwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG14Zi0+dGltZV9iYXNlLmRlbiA9PSAyNSkgc2MtPmluZGV4ID0gNzsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmluZGV4ID0gOTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG14Zi0+dGltZV9iYXNlLmRlbiA9PSAyNSkgc2MtPmluZGV4ID0gSU5ERVhfRDEwXzYyNV81MF80MF9WSURFTzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmluZGV4ID0gSU5ERVhfRDEwXzUyNV82MF80MF9WSURFTzsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNjLT52aWRlb19iaXRfcmF0ZSA9PSAzMDAwMDAwMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobXhmLT50aW1lX2Jhc2UuZGVuID09IDI1KSBzYy0+aW5kZXggPSAxMTsKLSAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgc2MtPmluZGV4ID0gMTM7CisgICAgICAgICAgICAgICAgICAgIGlmIChteGYtPnRpbWVfYmFzZS5kZW4gPT0gMjUpIHNjLT5pbmRleCA9IElOREVYX0QxMF82MjVfNTBfMzBfVklERU87CisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIHNjLT5pbmRleCA9IElOREVYX0QxMF81MjVfNjBfMzBfVklERU87CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImVycm9yIE1YRiBELTEwIG9ubHkgc3VwcG9ydCAzMC80MC81MCBtYml0L3NcbiIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC0yMTI3LDM3ICsyMjU4LDM3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobXhmLT5zaWduYWxfc3RhbmRhcmQgPj0gMCkKICAgICAgICAgICAgICAgICBzYy0+c2lnbmFsX3N0YW5kYXJkID0gbXhmLT5zaWduYWxfc3RhbmRhcmQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgIT0gNDgwMDApIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAhPSA0ODAwMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJvbmx5IDQ4a2h6IGlzIGltcGxlbWVudGVkXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICBpZiAocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX2QxMF9tdXhlcikgewogICAgICAgICAgICAgICAgIGlmIChzdC0+aW5kZXggIT0gMSkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTVhGIEQtMTAgb25seSBzdXBwb3J0IG9uZSBhdWRpbyB0cmFja1xuIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1MxNkxFICYmCi0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1MyNExFKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1MxNkxFICYmCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1MyNExFKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNWEYgRC0xMCBvbmx5IHN1cHBvcnQgMTYgb3IgMjQgYml0cyBsZSBhdWRpb1xuIik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHNjLT5pbmRleCA9ICgoTVhGU3RyZWFtQ29udGV4dCopcy0+c3RyZWFtc1swXS0+cHJpdl9kYXRhKS0+aW5kZXggKyAxOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5vZm9ybWF0ID09ICZmZl9teGZfb3BhdG9tX211eGVyKSB7CiAgICAgICAgICAgICAgICAgQVZSYXRpb25hbCB0YmMgPSBhdl9pbnZfcShteGYtPmF1ZGlvX2VkaXRfcmF0ZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgJiYKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEUpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEUgJiYKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9QQ01fUzI0TEUpIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk9ubHkgcGNtX3MxNmxlIGFuZCBwY21fczI0bGUgYXVkaW8gY29kZWNzIGFyZSBpbXBsZW1lbnRlZFxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gMSkgeworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzICE9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk1YRiBPUEF0b20gb25seSBzdXBwb3J0cyBzaW5nbGUgY2hhbm5lbCBhdWRpb1xuIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgc3BmID0gZmZfbXhmX2dldF9zYW1wbGVzX3Blcl9mcmFtZShzLCB0YmMpOwotICAgICAgICAgICAgICAgIGlmICghc3BmKXsKKyAgICAgICAgICAgICAgICBpZiAoIXNwZikgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgdGltZWNvZGUgZnJhbWUgcmF0ZSAlZC8lZFxuIiwgdGJjLmRlbiwgdGJjLm51bSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjE2NywxNSArMjI5OCwxNSBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgICAgICAgICAgbXhmLT50aW1lY29kZV9iYXNlID0gKHRiYy5kZW4gKyB0YmMubnVtLzIpIC8gdGJjLm51bTsKLSAgICAgICAgICAgICAgICBteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ID0gKGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCkgKiBzdC0+Y29kZWMtPmNoYW5uZWxzKSA+PiAzOwotICAgICAgICAgICAgICAgIHNjLT5pbmRleCA9IDI7CisgICAgICAgICAgICAgICAgbXhmLT5lZGl0X3VuaXRfYnl0ZV9jb3VudCA9IChhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpICogc3QtPmNvZGVjcGFyLT5jaGFubmVscykgPj4gMzsKKyAgICAgICAgICAgICAgICBzYy0+aW5kZXggPSBJTkRFWF9XQVY7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG14Zi0+c2xpY2VfY291bnQgPSAxOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFzYy0+aW5kZXgpIHsKLSAgICAgICAgICAgIHNjLT5pbmRleCA9IG14Zl9nZXRfZXNzZW5jZV9jb250YWluZXJfdWxfaW5kZXgoc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgICAgICBzYy0+aW5kZXggPSBteGZfZ2V0X2Vzc2VuY2VfY29udGFpbmVyX3VsX2luZGV4KHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogICAgICAgICAgICAgaWYgKHNjLT5pbmRleCA9PSAtMSkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0cmFjayAlZDogY291bGQgbm90IGZpbmQgZXNzZW5jZSBjb250YWluZXIgdWwsICIKICAgICAgICAgICAgICAgICAgICAgICAgImNvZGVjIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIGNvbnRhaW5lclxuIiwgaSk7CkBAIC0yMzA5LDcgKzI0NDAsNyBAQAogewogICAgIE1YRkNvbnRleHQgKm14ZiA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKLSAgICBpbnQgZnJhbWVfc2l6ZSA9IHBrdC0+c2l6ZSAvIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgaW50IGZyYW1lX3NpemUgPSBwa3QtPnNpemUgLyBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduOwogICAgIHVpbnQ4X3QgKnNhbXBsZXMgPSBwa3QtPmRhdGE7CiAgICAgdWludDhfdCAqZW5kID0gcGt0LT5kYXRhICsgcGt0LT5zaXplOwogICAgIGludCBpOwpAQCAtMjMxOCwxMiArMjQ0OSwxMiBAQAogCiAgICAgYXZpb193OChwYiwgKGZyYW1lX3NpemUgPT0gMTkyMCA/IDAgOiAobXhmLT5lZGl0X3VuaXRzX2NvdW50LTEpICUgNSArIDEpKTsKICAgICBhdmlvX3dsMTYocGIsIGZyYW1lX3NpemUpOwotICAgIGF2aW9fdzgocGIsICgxPDxzdC0+Y29kZWMtPmNoYW5uZWxzKS0xKTsKKyAgICBhdmlvX3c4KHBiLCAoMTw8c3QtPmNvZGVjcGFyLT5jaGFubmVscyktMSk7CiAKICAgICB3aGlsZSAoc2FtcGxlcyA8IGVuZCkgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPmNvZGVjLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMjRMRSkgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MyNExFKSB7CiAgICAgICAgICAgICAgICAgc2FtcGxlID0gQVZfUkwyNChzYW1wbGVzKTw8IDQ7CiAgICAgICAgICAgICAgICAgc2FtcGxlcyArPSAzOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI0MDYsMjIgKzI1MzcsMjIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7CiAgICAgICAgIGlmICghbXhmX3BhcnNlX21wZWcyX2ZyYW1lKHMsIHN0LCBwa3QsICZpZSkpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb3VsZCBub3QgZ2V0IG1wZWcyIHByb2ZpbGUgYW5kIGxldmVsXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ETlhIRCkgeworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ETlhIRCkgewogICAgICAgICBpZiAoIW14Zl9wYXJzZV9kbnhoZF9mcmFtZShzLCBzdCwgcGt0KSkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImNvdWxkIG5vdCBnZXQgZG54aGQgcHJvZmlsZVxuIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRFZWSURFTykgeworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9EVlZJREVPKSB7CiAgICAgICAgIGlmICghbXhmX3BhcnNlX2R2X2ZyYW1lKHMsIHN0LCBwa3QpKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGdldCBkdiBwcm9maWxlXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKICAgICAgICAgaWYgKCFteGZfcGFyc2VfaDI2NF9mcmFtZShzLCBzdCwgcGt0LCAmaWUpKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiY291bGQgbm90IGdldCBoMjY0IHByb2ZpbGVcbiIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjQ0Nyw3ICsyNTc4LDcgQEAKICAgICBpZiAoc3QtPmluZGV4ID09IDApIHsKICAgICAgICAgaWYgKCFteGYtPmVkaXRfdW5pdF9ieXRlX2NvdW50ICYmCiAgICAgICAgICAgICAoIW14Zi0+ZWRpdF91bml0c19jb3VudCB8fCBteGYtPmVkaXRfdW5pdHNfY291bnQgPiBFRElUX1VOSVRTX1BFUl9CT0RZKSAmJgotICAgICAgICAgICAgIShpZS5mbGFncyAmIDB4MzMpKSB7IC8vIEkgZnJhbWUsIEdvcCBzdGFydAorICAgICAgICAgICAgIShpZS5mbGFncyAmIDB4MzMpKSB7IC8vIEktZnJhbWUsIEdPUCBzdGFydAogICAgICAgICAgICAgbXhmX3dyaXRlX2tsdl9maWxsKHMpOwogICAgICAgICAgICAgaWYgKChlcnIgPSBteGZfd3JpdGVfcGFydGl0aW9uKHMsIDEsIDIsIGJvZHlfcGFydGl0aW9uX2tleSwgMCkpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMjQ3Nyw3ICsyNjA4LDcgQEAKICAgICBteGZfd3JpdGVfa2x2X2ZpbGwocyk7CiAgICAgYXZpb193cml0ZShwYiwgc2MtPnRyYWNrX2Vzc2VuY2VfZWxlbWVudF9rZXksIDE2KTsgLy8gd3JpdGUga2V5CiAgICAgaWYgKHMtPm9mb3JtYXQgPT0gJmZmX214Zl9kMTBfbXV4ZXIpIHsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICAgICAgbXhmX3dyaXRlX2QxMF92aWRlb19wYWNrZXQocywgc3QsIHBrdCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIG14Zl93cml0ZV9kMTBfYXVkaW9fcGFja2V0KHMsIHN0LCBwa3QpOwpAQCAtMjU0OSw4ICsyNjgwLDggQEAKICAgICBteGZfd3JpdGVfa2x2X2ZpbGwocyk7CiAgICAgbXhmX3dyaXRlX3JhbmRvbV9pbmRleF9wYWNrKHMpOwogCi0gICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgewotICAgICAgICBpZiAocy0+b2Zvcm1hdCA9PSAmZmZfbXhmX29wYXRvbV9tdXhlcil7CisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CisgICAgICAgIGlmIChzLT5vZm9ybWF0ID09ICZmZl9teGZfb3BhdG9tX211eGVyKSB7CiAgICAgICAgICAgICAvKiByZXdyaXRlIGJvZHkgcGFydGl0aW9uIHRvIHVwZGF0ZSBsZW5ndGhzICovCiAgICAgICAgICAgICBhdmlvX3NlZWsocGIsIG14Zi0+Ym9keV9wYXJ0aXRpb25fb2Zmc2V0WzBdLCBTRUVLX1NFVCk7CiAgICAgICAgICAgICBpZiAoKGVyciA9IG14Zl93cml0ZV9vcGF0b21fYm9keV9wYXJ0aXRpb24ocykpIDwgMCkKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L214Zy5jIGIvbGliYXZmb3JtYXQvbXhnLmMKaW5kZXggNDVjYzViNS4uZmU1ODc5ZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbXhnLmMKKysrIGIvbGliYXZmb3JtYXQvbXhnLmMKQEAgLTQ4LDIwICs0OCwyMCBAQAogICAgIHZpZGVvX3N0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXZpZGVvX3N0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHZpZGVvX3N0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICB2aWRlb19zdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVhQRUc7CisgICAgdmlkZW9fc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHZpZGVvX3N0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NWFBFRzsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZpZGVvX3N0LCA2NCwgMSwgMTAwMDAwMCk7CiAKICAgICBhdWRpb19zdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFhdWRpb19zdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBhdWRpb19zdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgYXVkaW9fc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9BTEFXOwotICAgIGF1ZGlvX3N0LT5jb2RlYy0+Y2hhbm5lbHMgPSAxOwotICAgIGF1ZGlvX3N0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICBhdWRpb19zdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKLSAgICBhdWRpb19zdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7Ci0gICAgYXVkaW9fc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IDE7CisgICAgYXVkaW9fc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGF1ZGlvX3N0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fQUxBVzsKKyAgICBhdWRpb19zdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKKyAgICBhdWRpb19zdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgYXVkaW9fc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgYXVkaW9fc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OworICAgIGF1ZGlvX3N0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAxOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXVkaW9fc3QsIDY0LCAxLCAxMDAwMDAwKTsKIAogICAgIG14Zy0+c29pX3B0ciA9IG14Zy0+YnVmZmVyX3B0ciA9IG14Zy0+YnVmZmVyID0gMDsKQEAgLTE2OSwxMSArMTY5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHNpemUgPSBteGctPmJ1ZmZlcl9wdHIgLSBteGctPnNvaV9wdHI7CisgICAgICAgICAgICAgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHNpemUpOworICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIG14Zy0+c29pX3B0ciwgc2l6ZSk7CisKICAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gbXhnLT5kdHM7CiAgICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOwotICAgICAgICAgICAgICAgIHBrdC0+YnVmICA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcGt0LT5zaXplID0gbXhnLT5idWZmZXJfcHRyIC0gbXhnLT5zb2lfcHRyOwotICAgICAgICAgICAgICAgIHBrdC0+ZGF0YSA9IG14Zy0+c29pX3B0cjsKIAogICAgICAgICAgICAgICAgIGlmIChteGctPnNvaV9wdHIgLSBteGctPmJ1ZmZlciA+IG14Zy0+Y2FjaGVfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobXhnLT5jYWNoZV9zaXplID4gMCkgewpAQCAtMjA2LDEyICsyMDksMTQgQEAKICAgICAgICAgICAgICAgICBteGctPmJ1ZmZlcl9wdHIgKz0gc2l6ZTsKIAogICAgICAgICAgICAgICAgIGlmIChtYXJrZXIgPT0gQVBQMTMgJiYgc2l6ZSA+PSAxNikgeyAvKiBhdWRpbyBkYXRhICovCisgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2X25ld19wYWNrZXQocGt0LCBzaXplIC0gMTQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHN0YXJ0bWFya2VyX3B0ciArIDE2LCBzaXplIC0gMTQpOworCiAgICAgICAgICAgICAgICAgICAgIC8qIHRpbWUgKEdNVCkgb2YgZmlyc3Qgc2FtcGxlIGluIHVzZWMgc2luY2UgMTk3MCwgbGl0dGxlLWVuZGlhbiAqLwogICAgICAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gQVZfUkw2NChzdGFydG1hcmtlcl9wdHIgKyA4KTsKICAgICAgICAgICAgICAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAxOwotICAgICAgICAgICAgICAgICAgICBwa3QtPmJ1ZiAgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICBwa3QtPnNpemUgPSBzaXplIC0gMTQ7Ci0gICAgICAgICAgICAgICAgICAgIHBrdC0+ZGF0YSA9IHN0YXJ0bWFya2VyX3B0ciArIDE2OwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydG1hcmtlcl9wdHIgLSBteGctPmJ1ZmZlciA+IG14Zy0+Y2FjaGVfc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG14Zy0+Y2FjaGVfc2l6ZSA+IDApIHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L25jZGVjLmMgYi9saWJhdmZvcm1hdC9uY2RlYy5jCmluZGV4IDc0NWJhNjEuLjhjYWRjYzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L25jZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvbmNkZWMuYwpAQCAtNTEsOCArNTEsOCBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTVBFRzQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01QRUc0OwogICAgIHN0LT5uZWVkX3BhcnNpbmcgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L25ldHdvcmsuYyBiL2xpYmF2Zm9ybWF0L25ldHdvcmsuYwppbmRleCAyZmIxYzhiLi5kNWM4MmU5IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9uZXR3b3JrLmMKKysrIGIvbGliYXZmb3JtYXQvbmV0d29yay5jCkBAIC0yOSw0MSArMjksMzYgQEAKIAogaW50IGZmX3Rsc19pbml0KHZvaWQpCiB7Ci0jaWYgQ09ORklHX1RMU19PUEVOU1NMX1BST1RPQ09MCisjaWYgQ09ORklHX1RMU19QUk9UT0NPTAorI2lmIENPTkZJR19PUEVOU1NMCiAgICAgaW50IHJldDsKICAgICBpZiAoKHJldCA9IGZmX29wZW5zc2xfaW5pdCgpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAjZW5kaWYKLSNpZiBDT05GSUdfVExTX0dOVVRMU19QUk9UT0NPTAorI2lmIENPTkZJR19HTlVUTFMKICAgICBmZl9nbnV0bHNfaW5pdCgpOwogI2VuZGlmCisjZW5kaWYKICAgICByZXR1cm4gMDsKIH0KIAogdm9pZCBmZl90bHNfZGVpbml0KHZvaWQpCiB7Ci0jaWYgQ09ORklHX1RMU19PUEVOU1NMX1BST1RPQ09MCisjaWYgQ09ORklHX1RMU19QUk9UT0NPTAorI2lmIENPTkZJR19PUEVOU1NMCiAgICAgZmZfb3BlbnNzbF9kZWluaXQoKTsKICNlbmRpZgotI2lmIENPTkZJR19UTFNfR05VVExTX1BST1RPQ09MCisjaWYgQ09ORklHX0dOVVRMUwogICAgIGZmX2dudXRsc19kZWluaXQoKTsKICNlbmRpZgorI2VuZGlmCiB9CiAKLWludCBmZl9uZXR3b3JrX2luaXRlZF9nbG9iYWxseTsKLQogaW50IGZmX25ldHdvcmtfaW5pdCh2b2lkKQogewogI2lmIEhBVkVfV0lOU09DSzJfSAogICAgIFdTQURBVEEgd3NhRGF0YTsKLSNlbmRpZgogCi0gICAgaWYgKCFmZl9uZXR3b3JrX2luaXRlZF9nbG9iYWxseSkKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiVXNpbmcgbmV0d29yayBwcm90b2NvbHMgd2l0aG91dCBnbG9iYWwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXR3b3JrIGluaXRpYWxpemF0aW9uLiBQbGVhc2UgdXNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXZmb3JtYXRfbmV0d29ya19pbml0KCksIHRoaXMgd2lsbCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlY29tZSBtYW5kYXRvcnkgbGF0ZXIuXG4iKTsKLSNpZiBIQVZFX1dJTlNPQ0syX0gKICAgICBpZiAoV1NBU3RhcnR1cChNQUtFV09SRCgxLDEpLCAmd3NhRGF0YSkpCiAgICAgICAgIHJldHVybiAwOwogI2VuZGlmCkBAIC05OSw2ICs5NCwyNCBAQAogICAgIH0KIH0KIAoraW50IGZmX25ldHdvcmtfc2xlZXBfaW50ZXJydXB0aWJsZShpbnQ2NF90IHRpbWVvdXQsIEFWSU9JbnRlcnJ1cHRDQiAqaW50X2NiKQoreworICAgIGludDY0X3Qgd2FpdF9zdGFydCA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludDY0X3QgdGltZV9sZWZ0OworCisgICAgICAgIGlmIChmZl9jaGVja19pbnRlcnJ1cHQoaW50X2NiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisKKyAgICAgICAgdGltZV9sZWZ0ID0gdGltZW91dCAtIChhdl9nZXR0aW1lX3JlbGF0aXZlKCkgLSB3YWl0X3N0YXJ0KTsKKyAgICAgICAgaWYgKHRpbWVfbGVmdCA8PSAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRVRJTUVET1VUKTsKKworICAgICAgICBhdl91c2xlZXAoRkZNSU4odGltZV9sZWZ0LCBQT0xMSU5HX1RJTUUgKiAxMDAwKSk7CisgICAgfQorfQorCiB2b2lkIGZmX25ldHdvcmtfY2xvc2Uodm9pZCkKIHsKICNpZiBIQVZFX1dJTlNPQ0syX0gKQEAgLTE1OSw3ICsxNzIsNyBAQAogICAgIGlmICghcmV0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFVElNRURPVVQpOwogICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CisgICAgICAgIHJldHVybiBmZl9uZXRlcnJubygpOwogICAgIHJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L25ldHdvcmsuaCBiL2xpYmF2Zm9ybWF0L25ldHdvcmsuaAppbmRleCBmODNjNzk2Li5lM2ZkYTRkIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9uZXR3b3JrLmgKKysrIGIvbGliYXZmb3JtYXQvbmV0d29yay5oCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgogI2luY2x1ZGUgPG5ldGRiLmg+CiAKICNkZWZpbmUgZmZfbmV0ZXJybm8oKSBBVkVSUk9SKGVycm5vKQpAQCAtNzQsNyArNzUsNiBAQAogCiBpbnQgZmZfc29ja2V0X25vbmJsb2NrKGludCBzb2NrZXQsIGludCBlbmFibGUpOwogCi1leHRlcm4gaW50IGZmX25ldHdvcmtfaW5pdGVkX2dsb2JhbGx5OwogaW50IGZmX25ldHdvcmtfaW5pdCh2b2lkKTsKIHZvaWQgZmZfbmV0d29ya19jbG9zZSh2b2lkKTsKIApAQCAtOTUsNyArOTUsMTQgQEAKICAqLwogaW50IGZmX25ldHdvcmtfd2FpdF9mZF90aW1lb3V0KGludCBmZCwgaW50IHdyaXRlLCBpbnQ2NF90IHRpbWVvdXQsIEFWSU9JbnRlcnJ1cHRDQiAqaW50X2NiKTsKIAotaW50IGZmX2luZXRfYXRvbiAoY29uc3QgY2hhciAqIHN0ciwgc3RydWN0IGluX2FkZHIgKiBhZGQpOworLyoqCisgKiBXYWl0cyBmb3IgdXAgdG8gJ3RpbWVvdXQnIG1pY3Jvc2Vjb25kcy4gSWYgdGhlIHVzZXJ0J3MgaW50X2NiIGlzIHNldCBhbmQKKyAqIHRyaWdnZXJlZCwgcmV0dXJuIGJlZm9yZSB0aGF0LgorICogQHRpbWVvdXQgVGltZW91dCBpbiBtaWNyb3NlY29uZHMuIE1heWJlIGhhdmUgbG93ZXIgYWN0dWFsIHByZWNpc2lvbi4KKyAqIEBwYXJhbSBpbnRfY2IgSW50ZXJydXB0IGNhbGxiYWNrLCBpcyBjaGVja2VkIHJlZ3VsYXJseS4KKyAqIEByZXR1cm4gQVZFUlJPUihFVElNRURPVVQpIGlmIHRpbWVvdXQgZXhwaXJ0ZWQsIEFWRVJST1JfRVhJVCBpZiBpbnRlcnJ1cHRlZCBieSBpbnRfY2IKKyAqLworaW50IGZmX25ldHdvcmtfc2xlZXBfaW50ZXJydXB0aWJsZShpbnQ2NF90IHRpbWVvdXQsIEFWSU9JbnRlcnJ1cHRDQiAqaW50X2NiKTsKIAogI2lmICFIQVZFX1NUUlVDVF9TT0NLQUREUl9TVE9SQUdFCiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSB7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9uaXN0c3BoZXJlZGVjLmMgYi9saWJhdmZvcm1hdC9uaXN0c3BoZXJlZGVjLmMKaW5kZXggMmYxN2Y5ZS4uNTVmMjJlYiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbmlzdHNwaGVyZWRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L25pc3RzcGhlcmVkZWMuYwpAQCAtMzQsNyArMzQsNyBAQAogCiBzdGF0aWMgaW50IG5pc3RfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIGNoYXIgYnVmZmVyWzMyXSwgY29kaW5nWzMyXSA9ICJwY20iLCBmb3JtYXRbMzJdID0gIjAxIjsKKyAgICBjaGFyIGJ1ZmZlclsyNTZdLCBjb2RpbmdbMzJdID0gInBjbSIsIGZvcm1hdFszMl0gPSAiMDEiOwogICAgIGludCBicHMgPSAwLCBiZSA9IDA7CiAgICAgaW50MzJfdCBoZWFkZXJfc2l6ZSA9IC0xOwogICAgIEFWU3RyZWFtICpzdDsKQEAgLTQzLDcgKzQzLDcgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKIAogICAgIGZmX2dldF9saW5lKHMtPnBiLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKICAgICBmZl9nZXRfbGluZShzLT5wYiwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CkBAIC01OCwyNCArNTgsMjkgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgIGlmICghbWVtY21wKGJ1ZmZlciwgImVuZF9oZWFkIiwgOCkpIHsKLSAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHMgPDwgMzsKKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHMgPDwgMzsKIAogICAgICAgICAgICAgaWYgKCFhdl9zdHJjYXNlY21wKGNvZGluZywgInBjbSIpKSB7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2dldF9wY21fY29kZWNfaWQoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYmUsIDB4RkZGRik7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2dldF9wY21fY29kZWNfaWQoc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGJlLCAweEZGRkYpOwogICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjb2RpbmcsICJhbGF3IikpIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX0FMQVc7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9BTEFXOwogICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChjb2RpbmcsICJ1bGF3IikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIWF2X3N0cmNhc2VjbXAoY29kaW5nLCAibXUtbGF3IikpIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX01VTEFXOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFhdl9zdHJuY2FzZWNtcChjb2RpbmcsICJwY20sZW1iZWRkZWQtc2hvcnRlbiIsIDIwKSkgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TSE9SVEVOOworICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCAxKSkKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbMF0gPSAxOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNvZGluZyAlcyIsIGNvZGluZyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAotICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVscyAvIDg7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzIC8gODsKIAogICAgICAgICAgICAgaWYgKGF2aW9fdGVsbChzLT5wYikgPiBoZWFkZXJfc2l6ZSkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTg0LDcgKzg5LDcgQEAKIAogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWZmZXIsICJjaGFubmVsX2NvdW50IiwgMTMpKSB7Ci0gICAgICAgICAgICBzc2NhbmYoYnVmZmVyLCAiJSpzICUqcyAlIlNDTmQzMiwgJnN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgc3NjYW5mKGJ1ZmZlciwgIiUqcyAlKnMgJXUiLCAmc3QtPmNvZGVjcGFyLT5jaGFubmVscyk7CiAgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWZmZXIsICJzYW1wbGVfYnl0ZV9mb3JtYXQiLCAxOCkpIHsKICAgICAgICAgICAgIHNzY2FuZihidWZmZXIsICIlKnMgJSpzICUzMXMiLCBmb3JtYXQpOwogCkBAIC05Miw2ICs5Nyw4IEBACiAgICAgICAgICAgICAgICAgYmUgPSAwOwogICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChmb3JtYXQsICIxMCIpKSB7CiAgICAgICAgICAgICAgICAgYmUgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICghYXZfc3RyY2FzZWNtcChmb3JtYXQsICJtdS1sYXciKSkgeworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fTVVMQVc7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cmNhc2VjbXAoZm9ybWF0LCAiMSIpKSB7CiAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJzYW1wbGUgYnl0ZSBmb3JtYXQgJXMiLCBmb3JtYXQpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKQEAgLTEwMSwxNCArMTA4LDE0IEBACiAgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWZmZXIsICJzYW1wbGVfY291bnQiLCAxMikpIHsKICAgICAgICAgICAgIHNzY2FuZihidWZmZXIsICIlKnMgJSpzICUiU0NOZDY0LCAmc3QtPmR1cmF0aW9uKTsKICAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKGJ1ZmZlciwgInNhbXBsZV9uX2J5dGVzIiwgMTQpKSB7Ci0gICAgICAgICAgICBzc2NhbmYoYnVmZmVyLCAiJSpzICUqcyAlIlNDTmQzMiwgJmJwcyk7CisgICAgICAgICAgICBzc2NhbmYoYnVmZmVyLCAiJSpzICUqcyAlZCIsICZicHMpOwogICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoYnVmZmVyLCAic2FtcGxlX3JhdGUiLCAxMSkpIHsKLSAgICAgICAgICAgIHNzY2FuZihidWZmZXIsICIlKnMgJSpzICUiU0NOZDMyLCAmc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBzc2NhbmYoYnVmZmVyLCAiJSpzICUqcyAlZCIsICZzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKICAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKGJ1ZmZlciwgInNhbXBsZV9zaWdfYml0cyIsIDE1KSkgewotICAgICAgICAgICAgc3NjYW5mKGJ1ZmZlciwgIiUqcyAlKnMgJSJTQ05kMzIsICZzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICBzc2NhbmYoYnVmZmVyLCAiJSpzICUqcyAlZCIsICZzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjaGFyIGtleVszMl0sIHZhbHVlWzMyXTsKLSAgICAgICAgICAgIGlmIChzc2NhbmYoYnVmZmVyLCAiJTMxcyAlKnMgJTMxcyIsIGtleSwgdmFsdWUpID09IDMpIHsKKyAgICAgICAgICAgIGlmIChzc2NhbmYoYnVmZmVyLCAiJTMxcyAlKnMgJTMxcyIsIGtleSwgdmFsdWUpID09IDIpIHsKICAgICAgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIGtleSwgdmFsdWUsIEFWX0RJQ1RfQVBQRU5EKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBwYXJzZSAnJXMnIGFzIG1ldGFkYXRhXG4iLCBidWZmZXIpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvbm9wcm94eS10ZXN0LmMgYi9saWJhdmZvcm1hdC9ub3Byb3h5LXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDUyNDc2NC4uMDAwMDAwMAotLS0gYS9saWJhdmZvcm1hdC9ub3Byb3h5LXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMgTWFydGluIFN0b3Jzam8KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgIm5ldHdvcmsuaCIKLQotc3RhdGljIHZvaWQgdGVzdChjb25zdCBjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpob3N0KQotewotICAgIGludCByZXMgPSBmZl9odHRwX21hdGNoX25vX3Byb3h5KHBhdHRlcm4sIGhvc3QpOwotICAgIHByaW50ZigiVGhlIHBhdHRlcm4gXCIlc1wiICVzIHRoZSBob3N0bmFtZSAlc1xuIiwKLSAgICAgICAgICAgcGF0dGVybiA/IHBhdHRlcm4gOiAiKG51bGwpIiwgcmVzID8gIm1hdGNoZXMiIDogImRvZXMgbm90IG1hdGNoIiwKLSAgICAgICAgICAgaG9zdCk7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgdGVzdChOVUxMLCAiZG9tYWluLmNvbSIpOwotICAgIHRlc3QoImV4YW1wbGUuY29tIGRvbWFpbi5jb20iLCAiZG9tYWluLmNvbSIpOwotICAgIHRlc3QoImV4YW1wbGUuY29tIG90aGVyLmNvbSIsICJkb21haW4uY29tIik7Ci0gICAgdGVzdCgiZXhhbXBsZS5jb20sZG9tYWluLmNvbSIsICJkb21haW4uY29tIik7Ci0gICAgdGVzdCgiZXhhbXBsZS5jb20sZG9tYWluLmNvbSIsICJvdGhlcmRvbWFpbi5jb20iKTsKLSAgICB0ZXN0KCJleGFtcGxlLmNvbSwgKi5kb21haW4uY29tIiwgInN1Yi5kb21haW4uY29tIik7Ci0gICAgdGVzdCgiZXhhbXBsZS5jb20sICouZG9tYWluLmNvbSIsICJkb21haW4uY29tIik7Ci0gICAgdGVzdCgiZXhhbXBsZS5jb20sIC5kb21haW4uY29tIiwgImRvbWFpbi5jb20iKTsKLSAgICB0ZXN0KCIqIiwgImRvbWFpbi5jb20iKTsKLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L25zcGRlYy5jIGIvbGliYXZmb3JtYXQvbnNwZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjNzQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L25zcGRlYy5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogTlNQIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicGNtLmgiCisKK3N0YXRpYyBpbnQgbnNwX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChBVl9SQjMyKHAtPmJ1ZikgPT0gQVZfUkIzMigiRk9STSIpICYmCisgICAgICAgIEFWX1JCMzIocC0+YnVmICsgNCkgPT0gQVZfUkIzMigiRFMxNiIpKQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbnNwX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpbnQgY2hhbm5lbHMgPSAwLCByYXRlID0gMDsKKyAgICB1aW50MzJfdCBjaHVuaywgc2l6ZTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50NjRfdCBwb3M7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIDEyKTsKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgeworICAgICAgICBjaGFyIHZhbHVlWzEwMjRdOworCisgICAgICAgIGNodW5rID0gYXZpb19yYjMyKHMtPnBiKTsKKyAgICAgICAgc2l6ZSAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICBwb3MgICA9IGF2aW9fdGVsbChzLT5wYik7CisKKyAgICAgICAgc3dpdGNoIChjaHVuaykgeworICAgICAgICBjYXNlIE1LQkVUQUcoJ0gnLCAnRScsICdEJywgJ1InKToKKyAgICAgICAgY2FzZSBNS0JFVEFHKCdIJywgJ0QnLCAnUicsICc4Jyk6CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDMyKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCAyMCk7CisgICAgICAgICAgICByYXRlID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgc2l6ZSAtIChhdmlvX3RlbGwocy0+cGIpIC0gcG9zKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNS0JFVEFHKCdOJywgJ08nLCAnVCcsICdFJyk6CisgICAgICAgICAgICBhdmlvX2dldF9zdHIocy0+cGIsIHNpemUsIHZhbHVlLCBzaXplb2YodmFsdWUpKTsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgIkNvbW1lbnQiLCB2YWx1ZSwgMCk7CisgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIHNpemUgJiAxKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnRCcsICdBJywgJ0InKToKKyAgICAgICAgICAgIGNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnRCcsICdfJywgJzInKToKKyAgICAgICAgY2FzZSBNS0JFVEFHKCdTJywgJ0QnLCAnXycsICczJyk6CisgICAgICAgIGNhc2UgTUtCRVRBRygnUycsICdEJywgJ18nLCAnNCcpOgorICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnRCcsICdfJywgJzUnKToKKyAgICAgICAgY2FzZSBNS0JFVEFHKCdTJywgJ0QnLCAnXycsICc2Jyk6CisgICAgICAgIGNhc2UgTUtCRVRBRygnUycsICdEJywgJ18nLCAnNycpOgorICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnRCcsICdfJywgJzgnKToKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIlVuc3VwcG9ydGVkIGNodW5rIVxuIik7CisgICAgICAgIGNhc2UgTUtCRVRBRygnUycsICdEJywgJ0EnLCAnXycpOgorICAgICAgICBjYXNlIE1LQkVUQUcoJ1MnLCAnRCcsICdfJywgJ0EnKToKKyAgICAgICAgICAgIGNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNoYW5uZWxzKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gY2hhbm5lbHM7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHJhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMiAqIGNoYW5uZWxzOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfbnNwX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gIm5zcCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIkNvbXB1dGVyaXplZCBTcGVlY2ggTGFiIE5TUCIpLAorICAgIC5yZWFkX3Byb2JlICAgICA9IG5zcF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBuc3BfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gZmZfcGNtX3JlYWRfcGFja2V0LAorICAgIC5yZWFkX3NlZWsgICAgICA9IGZmX3BjbV9yZWFkX3NlZWssCisgICAgLmV4dGVuc2lvbnMgICAgID0gIm5zcCIsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0VORVJJQ19JTkRFWCwKK307CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9uc3ZkZWMuYyBiL2xpYmF2Zm9ybWF0L25zdmRlYy5jCmluZGV4IDk1ZmFiNjQuLjkyZjdkMTcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L25zdmRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L25zdmRlYy5jCkBAIC01NywxNCArNTcsMTQgQEAKICAqICh0aGF0IGlzIHRoZSBvZmZzZXQgb2YgdGhlIGRhdGEgdGFibGUgYWZ0ZXIgdGhlIGhlYWRlcikuCiAgKiBBZnRlciBjaGVja2luZyBhbGwgc2FtcGxlcyBmcm9tIChTMSkgYWxsIGNvbmZpcm1zIHRoaXMuCiAgKgotICogVGhlbiwgYWJvdXQgTlNWZlsxMi0xNV0sIGZhc3Rlci5uc2YgaGFzIDE3OTcwMC4gV2hlbiB2ZWl3aW5nIGl0IGluIFZMQywKKyAqIFRoZW4sIGFib3V0IE5TVmZbMTItMTVdLCBmYXN0ZXIubnNmIGhhcyAxNzk3MDAuIFdoZW4gdmlld2luZyBpdCBpbiBWTEMsCiAgKiBJIG5vdGljZWQgdGhlcmUgd2FzIGFib3V0IDEgTlZTcyBjaHVuay9zLCBzbyBJIHJhbgogICogc3RyaW5ncyBmYXN0ZXIubnN2IHwgZ3JlcCBOU1ZzIHwgd2MgLWwKICAqIHdoaWNoIGdhdmUgbWUgMTgwLiBUaGF0IGxlYWRzIG1lIHRvIHRoaW5rIHRoYXQgTlNWZlsxMi0xNV0gbWlnaHQgYmUgdGhlCiAgKiBmaWxlIGxlbmd0aCBpbiBtaWxsaXNlY29uZHMuCiAgKiBMZXQncyB0cnkgdGhhdDoKICAqIGZvciBmIGluICoubnN2OyBkbyBIVElNRT0iJChvZCAtdCB4NCAiJGYiIHwgaGVhZCAtMSB8IHNlZCAncy8uKiAvLycpIjsgZWNobyAiJyRmJyAkKCgweCRIVElNRSkpcyA9ICQoKDB4JEhUSU1FLzEwMDAvNjApKTokKCgweCRIVElNRS8xMDAwJTYwKSkiOyBkb25lCi0gKiBleGNlcHQgZm9yIG5zdHJhaWxlciAod2hpY2ggZG9lc24ndCBoYXZlIGFuIE5TVmYgaGVhZGVyKSwgaXQgcmVwcG9ydHMgY29ycmVjdCB0aW1lLgorICogZXhjZXB0IGZvciBuc3Z0cmFpbGVyICh3aGljaCBkb2Vzbid0IGhhdmUgYW4gTlNWZiBoZWFkZXIpLCBpdCByZXBvcnRzIGNvcnJlY3QgdGltZS4KICAqCiAgKiBuc3Z0cmFpbGVyLm5zdiAoUzEpIGRvZXMgbm90IGhhdmUgYW55IE5TVmYgaGVhZGVyLCBvbmx5IE5TVnMgY2h1bmtzLAogICogc28gdGhlIGhlYWRlciBzZWVtcyB0byBub3QgYmUgbWFuZGF0b3J5LiAoZm9yIHN0cmVhbWluZykuCkBAIC0xNzYsNyArMTc2LDcgQEAKICAgICBpbnQxNl90IGF2c3luYzsKICAgICBBVlJhdGlvbmFsIGZyYW1lcmF0ZTsKICAgICB1aW50MzJfdCAqbnN2c190aW1lc3RhbXBzOwotICAgIC8vRFZEZW11eENvbnRleHQqIGR2X2RlbXV4OworICAgIGludCBuc3ZmOwogfSBOU1ZDb250ZXh0OwogCiBzdGF0aWMgY29uc3QgQVZDb2RlY1RhZyBuc3ZfY29kZWNfdmlkZW9fdGFnc1tdID0gewpAQCAtMjEyLDEzICsyMTIsNiBAQAogLy9zdGF0aWMgaW50IG5zdl9sb2FkX2luZGV4KEFWRm9ybWF0Q29udGV4dCAqcyk7CiBzdGF0aWMgaW50IG5zdl9yZWFkX2NodW5rKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGZpbGxfaGVhZGVyKTsKIAotI2RlZmluZSBwcmludF90YWcoc3RyLCB0YWcsIHNpemUpICAgICAgIFwKLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1RSQUNFLCAiJXM6IHRhZz0lYyVjJWMlY1xuIiwgXAotICAgICAgICAgICAgc3RyLCB0YWcgJiAweGZmLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICh0YWcgPj4gOCkgJiAweGZmLCAgICAgICAgICBcCi0gICAgICAgICAgICAodGFnID4+IDE2KSAmIDB4ZmYsICAgICAgICAgXAotICAgICAgICAgICAgKHRhZyA+PiAyNCkgJiAweGZmKTsKLQogLyogdHJ5IHRvIGZpbmQgc29tZXRoaW5nIHdlIHJlY29nbml6ZSwgYW5kIHNldCB0aGUgc3RhdGUgYWNjb3JkaW5nbHkgKi8KIHN0YXRpYyBpbnQgbnN2X3Jlc3luYyhBVkZvcm1hdENvbnRleHQgKnMpCiB7CkBAIC0yMjcsMTAgKzIyMCw2IEBACiAgICAgdWludDMyX3QgdiA9IDA7CiAgICAgaW50IGk7CiAKLSAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiJXMoKSwgb2Zmc2V0ID0gJSJQUklkNjQiLCBzdGF0ZSA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGF2aW9fdGVsbChwYiksIG5zdi0+c3RhdGUpOwotCi0gICAgLy9uc3YtPnN0YXRlID0gTlNWX1VOU1lOQzsKLQogICAgIGZvciAoaSA9IDA7IGkgPCBOU1ZfTUFYX1JFU1lOQzsgaSsrKSB7CiAgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiTlNWIEVPRlxuIik7CkBAIC0yNDAsNyArMjI5LDcgQEAKICAgICAgICAgdiA8PD0gODsKICAgICAgICAgdiB8PSBhdmlvX3I4KHBiKTsKICAgICAgICAgaWYgKGkgPCA4KSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiTlNWIHJlc3luYzogWyVkXSA9ICUwMnhcbiIsIGksIHYgJiAweDBGRik7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiTlNWIHJlc3luYzogWyVkXSA9ICUwMiJQUkl4MzIiXG4iLCBpLCB2ICYgMHgwRkYpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCh2ICYgMHgwMDAwZmZmZikgPT0gMHhlZmJlKSB7IC8qIEJFRUYgKi8KQEAgLTI3NiwxNiArMjY1LDE5IEBACiAgICAgaW50IHRhYmxlX2VudHJpZXM7CiAgICAgaW50IHRhYmxlX2VudHJpZXNfdXNlZDsKIAotICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwotCiAgICAgbnN2LT5zdGF0ZSA9IE5TVl9VTlNZTkM7IC8qIGluIGNhc2Ugd2UgZmFpbCAqLwogCisgICAgaWYgKG5zdi0+bnN2ZikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiTXVsdGlwbGUgTlNWZlxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBuc3YtPm5zdmYgPSAxOworCiAgICAgc2l6ZSA9IGF2aW9fcmwzMihwYik7CiAgICAgaWYgKHNpemUgPCAyOCkKICAgICAgICAgcmV0dXJuIC0xOwogICAgIG5zdi0+TlNWZl9lbmQgPSBzaXplOwogCi0gICAgLy9zLT5maWxlX3NpemUgPSAodWludDMyX3QpYXZpb19ybDMyKHBiKTsKICAgICBmaWxlX3NpemUgPSAodWludDMyX3QpYXZpb19ybDMyKHBiKTsKICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiTlNWIE5TVmYgY2h1bmtfc2l6ZSAldVxuIiwgc2l6ZSk7CiAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgIk5TViBOU1ZmIGZpbGVfc2l6ZSAldVxuIiwgZmlsZV9zaXplKTsKQEAgLTM1MCw4ICszNDIsMTEgQEAKICAgICAgICAgaWYgKCFuc3YtPm5zdnNfZmlsZV9vZmZzZXQpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgIGZvcihpPTA7aTx0YWJsZV9lbnRyaWVzX3VzZWQ7aSsrKQorICAgICAgICBmb3IoaT0wO2k8dGFibGVfZW50cmllc191c2VkO2krKykgeworICAgICAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBuc3YtPm5zdnNfZmlsZV9vZmZzZXRbaV0gPSBhdmlvX3JsMzIocGIpICsgc2l6ZTsKKyAgICAgICAgfQogCiAgICAgICAgIGlmKHRhYmxlX2VudHJpZXMgPiB0YWJsZV9lbnRyaWVzX3VzZWQgJiYKICAgICAgICAgICAgYXZpb19ybDMyKHBiKSA9PSBNS1RBRygnVCcsJ08nLCdDJywnMicpKSB7CkBAIC0zODQsNyArMzc5LDYgQEAKICAgICBpbnQgaTsKICAgICBBVlN0cmVhbSAqc3Q7CiAgICAgTlNWU3RyZWFtICpuc3Q7Ci0gICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7CiAKICAgICB2dGFnID0gYXZpb19ybDMyKHBiKTsKICAgICBhdGFnID0gYXZpb19ybDMyKHBiKTsKQEAgLTQxMyw4ICs0MDcsNiBAQAogICAgIG5zdi0+YXZzeW5jID0gYXZpb19ybDE2KHBiKTsKICAgICBuc3YtPmZyYW1lcmF0ZSA9IGZyYW1lcmF0ZTsKIAotICAgIHByaW50X3RhZygiTlNWIE5TVnMgdnRhZyIsIHZ0YWcsIDApOwotICAgIHByaW50X3RhZygiTlNWIE5TVnMgYXRhZyIsIGF0YWcsIDApOwogICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJOU1YgTlNWcyB2c2l6ZSAlZHglZFxuIiwgdndpZHRoLCB2aGVpZ2h0KTsKIAogICAgIC8qIFhYWCBjaGFuZ2UgdG8gYXAgIT0gTlVMTCA/ICovCkBAIC00MzQsMTIgKzQyNiwxMiBAQAogICAgICAgICAgICAgaWYgKCFuc3QpCiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgc3QtPnByaXZfZGF0YSA9IG5zdDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gdnRhZzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQobnN2X2NvZGVjX3ZpZGVvX3RhZ3MsIHZ0YWcpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IHZ3aWR0aDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gdmhlaWdodDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMjQ7IC8qIGRlcHRoIFhYWCAqLworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSB2dGFnOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChuc3ZfY29kZWNfdmlkZW9fdGFncywgdnRhZyk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoID0gdndpZHRoOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSB2aGVpZ2h0OworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAyNDsgLyogZGVwdGggWFhYICovCiAKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBmcmFtZXJhdGUuZGVuLCBmcmFtZXJhdGUubnVtKTsKICAgICAgICAgICAgIHN0LT5zdGFydF90aW1lID0gMDsKQEAgLTQ2NSw5ICs0NTcsOSBAQAogICAgICAgICAgICAgaWYgKCFuc3QpCiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgc3QtPnByaXZfZGF0YSA9IG5zdDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gYXRhZzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQobnN2X2NvZGVjX2F1ZGlvX3RhZ3MsIGF0YWcpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBhdGFnOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChuc3ZfY29kZWNfYXVkaW9fdGFncywgYXRhZyk7CiAKICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOyAvKiBmb3IgUENNIHdlIHdpbGwgcmVhZCBhIGNodW5rIGxhdGVyIGFuZCBwdXQgY29ycmVjdCBpbmZvICovCiAKQEAgLTQ5Niw5ICs0ODgsNiBAQAogICAgIE5TVkNvbnRleHQgKm5zdiA9IHMtPnByaXZfZGF0YTsKICAgICBpbnQgaSwgZXJyOwogCi0gICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgIiVzKClcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgImZpbGVuYW1lICclcydcbiIsIHMtPmZpbGVuYW1lKTsKLQogICAgIG5zdi0+c3RhdGUgPSBOU1ZfVU5TWU5DOwogICAgIG5zdi0+YWhlYWRbMF0uZGF0YSA9IG5zdi0+YWhlYWRbMV0uZGF0YSA9IE5VTEw7CiAKQEAgLTU0MSw4ICs1MzAsNiBAQAogICAgIHVpbnQxNl90IGF1eHNpemU7CiAgICAgaW50IHJldDsKIAotICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICIlcyglZClcbiIsIF9fRlVOQ1RJT05fXywgZmlsbF9oZWFkZXIpOwotCiAgICAgaWYgKG5zdi0+YWhlYWRbMF0uZGF0YSB8fCBuc3YtPmFoZWFkWzFdLmRhdGEpCiAgICAgICAgIHJldHVybiAwOyAvLy0xOyAvKiBoZXkhIGVhdCB3aGF0IHlvdSd2ZSBpbiB5b3VyIHBsYXRlIGZpcnN0ISAqLwogCkBAIC01NjYsMjAgKzU1MywxNCBAQAogICAgIGFzaXplID0gYXZpb19ybDE2KHBiKTsKICAgICB2c2l6ZSA9ICh2c2l6ZSA8PCA0KSB8IChhdXhjb3VudCA+PiA0KTsKICAgICBhdXhjb3VudCAmPSAweDBmOwotICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJOU1YgQ0hVTksgJWQgYXV4LCAldSBieXRlcyB2aWRlbywgJWQgYnl0ZXMgYXVkaW9cbiIsIGF1eGNvdW50LCB2c2l6ZSwgYXNpemUpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJOU1YgQ0hVTksgJWQgYXV4LCAlIlBSSXUzMiIgYnl0ZXMgdmlkZW8sICVkIGJ5dGVzIGF1ZGlvXG4iLCBhdXhjb3VudCwgdnNpemUsIGFzaXplKTsKICAgICAvKiBza2lwIGF1eCBzdHVmZiAqLwogICAgIGZvciAoaSA9IDA7IGkgPCBhdXhjb3VudDsgaSsrKSB7CiAgICAgICAgIHVpbnQzMl90IGF2X3VudXNlZCBhdXh0YWc7CiAgICAgICAgIGF1eHNpemUgPSBhdmlvX3JsMTYocGIpOwogICAgICAgICBhdXh0YWcgPSBhdmlvX3JsMzIocGIpOwotICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiTlNWIGF1eCBkYXRhOiAnJWMlYyVjJWMnLCAlZCBieXRlc1xuIiwKLSAgICAgICAgICAgICAgKGF1eHRhZyAmIDB4MGZmKSwKLSAgICAgICAgICAgICAgKChhdXh0YWcgPj4gOCkgJiAweDBmZiksCi0gICAgICAgICAgICAgICgoYXV4dGFnID4+IDE2KSAmIDB4MGZmKSwKLSAgICAgICAgICAgICAgKChhdXh0YWcgPj4gMjQpICYgMHgwZmYpLAotICAgICAgICAgICAgICBhdXhzaXplKTsKICAgICAgICAgYXZpb19za2lwKHBiLCBhdXhzaXplKTsKLSAgICAgICAgdnNpemUgLT0gYXV4c2l6ZSArIHNpemVvZih1aW50MTZfdCkgKyBzaXplb2YodWludDMyX3QpOyAvKiB0aGF0J3MgYmVjb21pbmcgYnJhaW5kZWFkICovCisgICAgICAgIHZzaXplIC09IGF1eHNpemUgKyBzaXplb2YodWludDE2X3QpICsgc2l6ZW9mKHVpbnQzMl90KTsgLyogdGhhdCdzIGJlY29taW5nIGJyYWluLWRlYWQgKi8KICAgICB9CiAKICAgICBpZiAoYXZpb19mZW9mKHBiKSkKQEAgLTYxNCw3ICs1OTUsNyBAQAogICAgICAgICBwa3QgPSAmbnN2LT5haGVhZFtOU1ZfU1RfQVVESU9dOwogICAgICAgICAvKiByZWFkIHJhdyBhdWRpbyBzcGVjaWZpYyBoZWFkZXIgb24gdGhlIGZpcnN0IGF1ZGlvIGNodW5rLi4uICovCiAgICAgICAgIC8qIG9uIEFMTCBhdWRpbyBjaHVua3MgPz8gc2VlbXMgc28hICovCi0gICAgICAgIGlmIChhc2l6ZSAmJiBzdFtOU1ZfU1RfQVVESU9dLT5jb2RlYy0+Y29kZWNfdGFnID09IE1LVEFHKCdQJywgJ0MnLCAnTScsICcgJykvKiAmJiBmaWxsX2hlYWRlciovKSB7CisgICAgICAgIGlmIChhc2l6ZSAmJiBzdFtOU1ZfU1RfQVVESU9dLT5jb2RlY3Bhci0+Y29kZWNfdGFnID09IE1LVEFHKCdQJywgJ0MnLCAnTScsICcgJykvKiAmJiBmaWxsX2hlYWRlciovKSB7CiAgICAgICAgICAgICB1aW50OF90IGJwczsKICAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbHM7CiAgICAgICAgICAgICB1aW50MTZfdCBzYW1wbGVyYXRlOwpAQCAtNjMyLDExICs2MTMsMTEgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnBzIC89IGNoYW5uZWxzOyAvLyA/Pz8KICAgICAgICAgICAgICAgICBpZiAoYnBzID09IDgpCi0gICAgICAgICAgICAgICAgICAgIHN0W05TVl9TVF9BVURJT10tPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgICAgICAgICAgICAgc3RbTlNWX1NUX0FVRElPXS0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OwogICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUgLz0gNDsvKiBVR0ggPz8/IFhYWCAqLwogICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgICAgICBzdFtOU1ZfU1RfQVVESU9dLT5jb2RlYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKLSAgICAgICAgICAgICAgICBzdFtOU1ZfU1RfQVVESU9dLT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzYW1wbGVyYXRlOworICAgICAgICAgICAgICAgIHN0W05TVl9TVF9BVURJT10tPmNvZGVjcGFyLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICAgICAgICAgIHN0W05TVl9TVF9BVURJT10tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZXJhdGU7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgIk5TViBSQVdBVURJTzogYnBzICVkLCBuY2hhbiAlZCwgc3JhdGUgJWRcbiIsIGJwcywgY2hhbm5lbHMsIHNhbXBsZXJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02NjQsOCArNjQ1LDYgQEAKICAgICBOU1ZDb250ZXh0ICpuc3YgPSBzLT5wcml2X2RhdGE7CiAgICAgaW50IGksIGVyciA9IDA7CiAKLSAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKLQogICAgIC8qIGluIGNhc2Ugd2UgZG9uJ3QgYWxyZWFkeSBoYXZlIHNvbWV0aGluZyB0byBlYXQgLi4uICovCiAgICAgaWYgKCFuc3YtPmFoZWFkWzBdLmRhdGEgJiYgIW5zdi0+YWhlYWRbMV0uZGF0YSkKICAgICAgICAgZXJyID0gbnN2X3JlYWRfY2h1bmsocywgMCk7CkBAIC02NzUsNyArNjU0LDYgQEAKICAgICAvKiBub3cgcGljayBvbmUgb2YgdGhlIHBsYXRlcyAqLwogICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKICAgICAgICAgaWYgKG5zdi0+YWhlYWRbaV0uZGF0YSkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgIiVzOiB1c2luZyBjYWNoZWQgcGFja2V0WyVkXVxuIiwgX19GVU5DVElPTl9fLCBpKTsKICAgICAgICAgICAgIC8qIGF2b2lkIHRoZSBjb3N0IG9mIG5ld19wYWNrZXQgKyBtZW1jcHkoLT5kYXRhKSAqLwogICAgICAgICAgICAgbWVtY3B5KHBrdCwgJm5zdi0+YWhlYWRbaV0sIHNpemVvZihBVlBhY2tldCkpOwogICAgICAgICAgICAgbnN2LT5haGVhZFtpXS5kYXRhID0gTlVMTDsgLyogd2UgYXRlIHRoYXQgb25lICovCkBAIC02ODMsNyArNjYxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qIHRoaXMgcmVzdGF1cmFudCBpcyBub3QgYXBwcm92aXNpb25uZWQgOl5dICovCisgICAgLyogdGhpcyByZXN0YXVyYW50IGlzIG5vdCBwcm92aXNpb25lZCA6Xl0gKi8KICAgICByZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L251dC5jIGIvbGliYXZmb3JtYXQvbnV0LmMKaW5kZXggZjQ5MDFlNi4uNTkyZmU0ZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbnV0LmMKKysrIGIvbGliYXZmb3JtYXQvbnV0LmMKQEAgLTI3LDcgKzI3LDYgQEAKIAogY29uc3QgQVZDb2RlY1RhZyBmZl9udXRfc3VidGl0bGVfdGFnc1tdID0gewogICAgIHsgQVZfQ09ERUNfSURfVEVYVCwgICAgICAgICAgICAgTUtUQUcoJ1UnLCAnVCcsICdGJywgJzgnKSB9LAotICAgIHsgQVZfQ09ERUNfSURfU1NBLCAgICAgICAgICAgICAgTUtUQUcoJ1MnLCAnUycsICdBJywgIDAgKSB9LAogICAgIHsgQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFLCAgICAgTUtUQUcoJ0QnLCAnVicsICdEJywgJ1MnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFLCAgICAgTUtUQUcoJ0QnLCAnVicsICdCJywgJ1MnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfRFZCX1RFTEVURVhULCAgICAgTUtUQUcoJ0QnLCAnVicsICdCJywgJ1QnKSB9LApAQCAtNDMsNiArNDIsNyBAQAogICAgIHsgQVZfQ09ERUNfSURfR0lGLCAgICAgICAgICAgICAgTUtUQUcoJ0cnLCAnSScsICdGJywgIDAgKSB9LAogICAgIHsgQVZfQ09ERUNfSURfWEZBQ0UsICAgICAgICAgICAgTUtUQUcoJ1gnLCAnRicsICdBJywgJ0MnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfVlA5LCAgICAgICAgICAgICAgTUtUQUcoJ1YnLCAnUCcsICc5JywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSEVWQywgICAgICAgICAgICAgTUtUQUcoJ0gnLCAnRScsICdWJywgJ0MnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ1InLCAnRycsICdCJywgMTUgKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ0InLCAnRycsICdSJywgMTUgKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ1InLCAnRycsICdCJywgMTYgKSB9LApAQCAtMTQzLDYgKzE0Myw4IEBACiAgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnWScsICc0JywgICAwLCAgMTApIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMCwgICAgMCwgJzQnLCAnWScpIH0sCiAKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzEnLCAgIDAsICAxMikgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDEyLCAgICAwLCAnMScsICdZJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzEnLCAgIDAsICAxNikgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2LCAgICAwLCAnMScsICdZJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdZJywgJzQnLCAgMTEsICAxNikgfSwKQEAgLTE2NSw2ICsxNjcsMTUgQEAKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdHJywgJzMnLCAgIDAsICAxNikgfSwKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKDE2LCAgICAwLCAnMycsICdHJykgfSwKIAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICAgICAgTUtUQUcoJ0cnLCAnNCcsICAgMCwgICA4KSB9LAorCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnRycsICc0JywgMDAgLCAxMCApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMCAsIDAwICwgJzQnLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnRycsICc0JywgMDAgLCAxMiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxMiAsIDAwICwgJzQnLCAnRycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygnRycsICc0JywgMDAgLCAxNiApIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygxNiAsIDAwICwgJzQnLCAnRycpIH0sCisKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgICAgIE1LVEFHKCdYJywgJ1knLCAnWicgLCAzNiApIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgICAgICBNS1RBRygzNiAsICdaJyAsICdZJywgJ1gnKSB9LAogCkBAIC0xOTEsNiArMjAyLDcgQEAKICAgICB7IEFWX0NPREVDX0lEX1BDTV9BTEFXLCAgICAgICAgIE1LVEFHKCdBJywgJ0wnLCAnQScsICdXJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1BDTV9NVUxBVywgICAgICAgIE1LVEFHKCdVJywgJ0wnLCAnQScsICdXJykgfSwKICAgICB7IEFWX0NPREVDX0lEX01QMywgICAgICAgICAgICAgIE1LVEFHKCdNJywgJ1AnLCAnMycsICcgJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX09QVVMsICAgICAgICAgICAgIE1LVEFHKCdPJywgJ3AnLCAndScsICdzJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1dBVlBBQ0ssICAgICAgICAgIE1LVEFHKCd3JywgJ3YnLCAncCcsICdrJykgfSwKICAgICB7IEFWX0NPREVDX0lEX05PTkUsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgfQogfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L251dGRlYy5jIGIvbGliYXZmb3JtYXQvbnV0ZGVjLmMKaW5kZXggNGRmNmE1Ny4uMjc0NDBjOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbnV0ZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvbnV0ZGVjLmMKQEAgLTg2LDQ2ICs4NiwxMCBAQAogICAgIH0KIH0KIAotI2lmZGVmIFRSQUNFCi1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IGdldF92X3RyYWNlKEFWSU9Db250ZXh0ICpiYywgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCi17Ci0gICAgdWludDY0X3QgdiA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOwotCi0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgImdldF92ICU1IlBSSWQ2NCIgLyAlIlBSSVg2NCIgaW4gJXMgJXM6JWRcbiIsCi0gICAgICAgICAgIHYsIHYsIGZpbGUsIGZ1bmMsIGxpbmUpOwotICAgIHJldHVybiB2OwotfQotCi1zdGF0aWMgaW5saW5lIGludDY0X3QgZ2V0X3NfdHJhY2UoQVZJT0NvbnRleHQgKmJjLCBjb25zdCBjaGFyICpmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZ1bmMsIGludCBsaW5lKQotewotICAgIGludDY0X3QgdiA9IGdldF9zKGJjKTsKLQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJnZXRfcyAlNSJQUklkNjQiIC8gJSJQUklYNjQiIGluICVzICVzOiVkXG4iLAotICAgICAgICAgICB2LCB2LCBmaWxlLCBmdW5jLCBsaW5lKTsKLSAgICByZXR1cm4gdjsKLX0KLQotc3RhdGljIGlubGluZSB1aW50NjRfdCBnZXRfNGNjX3RyYWNlKEFWSU9Db250ZXh0ICpiYywgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmZ1bmMsIGludCBsaW5lKQotewotICAgIHVpbnQ2NF90IHYgPSBnZXRfZm91cmNjKGJjKTsKLQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfREVCVUcsICJnZXRfZm91cmNjICU1IlBSSWQ2NCIgLyAlIlBSSVg2NCIgaW4gJXMgJXM6JWRcbiIsCi0gICAgICAgICAgIHYsIHYsIGZpbGUsIGZ1bmMsIGxpbmUpOwotICAgIHJldHVybiB2OwotfQotI2RlZmluZSBmZmlvX3JlYWRfdmFybGVuKGJjKSBnZXRfdl90cmFjZShiYywgIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKLSNkZWZpbmUgZ2V0X3MoYmMpICAgICAgICAgICAgZ2V0X3NfdHJhY2UoYmMsICBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCi0jZGVmaW5lIGdldF9mb3VyY2MoYmMpICAgICAgIGdldF80Y2NfdHJhY2UoYmMsIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKLSNlbmRpZgotCiBzdGF0aWMgaW50IGdldF9wYWNrZXRoZWFkZXIoTlVUQ29udGV4dCAqbnV0LCBBVklPQ29udGV4dCAqYmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbGN1bGF0ZV9jaGVja3N1bSwgdWludDY0X3Qgc3RhcnRjb2RlKQogewogICAgIGludDY0X3Qgc2l6ZTsKLS8vICAgIHN0YXJ0ID0gYXZpb190ZWxsKGJjKSAtIDg7CiAKICAgICBzdGFydGNvZGUgPSBhdl9iZTJuZTY0KHN0YXJ0Y29kZSk7CiAgICAgc3RhcnRjb2RlID0gZmZfY3JjMDRDMTFEQjdfdXBkYXRlKDAsICh1aW50OF90KikgJnN0YXJ0Y29kZSwgOCk7CkBAIC0yMzgsNyArMjAyLDcgQEAKICAgICBlbmQgKz0gYXZpb190ZWxsKGJjKTsKIAogICAgIG51dC0+dmVyc2lvbiA9IGZmaW9fcmVhZF92YXJsZW4oYmMpOwotICAgIGlmIChudXQtPnZlcnNpb24gPCBOVVRfTUlOX1ZFUlNJT04gJiYKKyAgICBpZiAobnV0LT52ZXJzaW9uIDwgTlVUX01JTl9WRVJTSU9OIHx8CiAgICAgICAgIG51dC0+dmVyc2lvbiA+IE5VVF9NQVhfVkVSU0lPTikgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVmVyc2lvbiAlZCBub3Qgc3VwcG9ydGVkLlxuIiwKICAgICAgICAgICAgICAgIG51dC0+dmVyc2lvbik7CkBAIC00MTUsMTEgKzM3OSwxMSBAQAogCiAgICAgY2xhc3MgICAgICAgICAgICAgICAgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKICAgICB0bXAgICAgICAgICAgICAgICAgICA9IGdldF9mb3VyY2MoYmMpOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gdG1wOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gdG1wOwogICAgIHN3aXRjaCAoY2xhc3MpIHsKICAgICBjYXNlIDA6Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gYXZfY29kZWNfZ2V0X2lkKChjb25zdCBBVkNvZGVjVGFnICogY29uc3QgW10pIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBhdl9jb2RlY19nZXRfaWQoKGNvbnN0IEFWQ29kZWNUYWcgKiBjb25zdCBbXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX251dF92aWRlb190YWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NvZGVjX2JtcF90YWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2NvZGVjX21vdnZpZGVvX3RhZ3MsCkBAIC00MjgsOCArMzkyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMToKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBhdl9jb2RlY19nZXRfaWQoKGNvbnN0IEFWQ29kZWNUYWcgKiBjb25zdCBbXSkgeworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IGF2X2NvZGVjX2dldF9pZCgoY29uc3QgQVZDb2RlY1RhZyAqIGNvbnN0IFtdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbnV0X2F1ZGlvX3RhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfY29kZWNfd2F2X3RhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZfbnV0X2F1ZGlvX2V4dHJhX3RhZ3MsCkBAIC00MzgsMTggKzQwMiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyOgotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9udXRfc3VidGl0bGVfdGFncywgdG1wKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfbnV0X3N1YnRpdGxlX3RhZ3MsIHRtcCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMzoKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9udXRfZGF0YV90YWdzLCB0bXApOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX251dF9kYXRhX3RhZ3MsIHRtcCk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIHN0cmVhbSBjbGFzcyAoJWQpXG4iLCBjbGFzcyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgfQotICAgIGlmIChjbGFzcyA8IDMgJiYgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgIGlmIChjbGFzcyA8IDMgJiYgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIlVua25vd24gY29kZWMgdGFnICcweCUwNHgnIGZvciBzdHJlYW0gbnVtYmVyICVkXG4iLAogICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkgdG1wLCBzdHJlYW1faWQpOwpAQCAtNDU4LDE4ICs0MjIsMTggQEAKICAgICBHRVRfVihzdGMtPm1zYl9wdHNfc2hpZnQsIHRtcCA8IDE2KTsKICAgICBzdGMtPm1heF9wdHNfZGlzdGFuY2UgPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKICAgICBHRVRfVihzdGMtPmRlY29kZV9kZWxheSwgdG1wIDwgMTAwMCk7IC8vIHNhbml0eSBsaW1pdCwgcmFpc2UgdGhpcyBpZiBNb29yZSdzIGxhdyBpcyB0cnVlCi0gICAgc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXMgPSBzdGMtPmRlY29kZV9kZWxheTsKKyAgICBzdC0+Y29kZWNwYXItPnZpZGVvX2RlbGF5ID0gc3RjLT5kZWNvZGVfZGVsYXk7CiAgICAgZmZpb19yZWFkX3ZhcmxlbihiYyk7IC8vIHN0cmVhbSBmbGFncwogCi0gICAgR0VUX1Yoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSwgdG1wIDwgKDEgPDwgMzApKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgewotICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIGJjLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSA8IDApCisgICAgR0VUX1Yoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSwgdG1wIDwgKDEgPDwgMzApKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzLCBzdC0+Y29kZWNwYXIsIGJjLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgIEdFVF9WKHN0LT5jb2RlYy0+d2lkdGgsICB0bXAgPiAwKTsKLSAgICAgICAgR0VUX1Yoc3QtPmNvZGVjLT5oZWlnaHQsIHRtcCA+IDApOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIEdFVF9WKHN0LT5jb2RlY3Bhci0+d2lkdGgsICB0bXAgPiAwKTsKKyAgICAgICAgR0VUX1Yoc3QtPmNvZGVjcGFyLT5oZWlnaHQsIHRtcCA+IDApOwogICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBmZmlvX3JlYWRfdmFybGVuKGJjKTsKICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gZmZpb19yZWFkX3ZhcmxlbihiYyk7CiAgICAgICAgIGlmICgoIXN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSkgIT0gKCFzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5kZW4pKSB7CkBAIC00NzksMTAgKzQ0MywxMCBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgICAgIGZmaW9fcmVhZF92YXJsZW4oYmMpOyAvKiBjc3AgdHlwZSAqLwotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICBHRVRfVihzdC0+Y29kZWMtPnNhbXBsZV9yYXRlLCB0bXAgPiAwKTsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgR0VUX1Yoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSwgdG1wID4gMCk7CiAgICAgICAgIGZmaW9fcmVhZF92YXJsZW4oYmMpOyAvLyBzYW1wbGVyYXRlX2RlbgotICAgICAgICBHRVRfVihzdC0+Y29kZWMtPmNoYW5uZWxzLCB0bXAgPiAwKTsKKyAgICAgICAgR0VUX1Yoc3QtPmNvZGVjcGFyLT5jaGFubmVscywgdG1wID4gMCk7CiAgICAgfQogICAgIGlmIChza2lwX3Jlc2VydmVkKGJjLCBlbmQpIHx8IGZmaW9fZ2V0X2NoZWNrc3VtKGJjKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLApAQCAtNDk1LDkgKzQ1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGMtPnRpbWVfYmFzZS0+ZGVuKTsKICAgICByZXR1cm4gMDsKIGZhaWw6Ci0gICAgaWYgKHN0ICYmIHN0LT5jb2RlYykgewotICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICBpZiAoc3QgJiYgc3QtPmNvZGVjcGFyKSB7CisgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSAwOwogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQpAQCAtODc2LDcgKzg0MCw3IEBACiAKICAgICBzLT5pbnRlcm5hbC0+ZGF0YV9vZmZzZXQgPSBwb3MgLSA4OwogCi0gICAgaWYgKGJjLT5zZWVrYWJsZSkgeworICAgIGlmIChiYy0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBpbnQ2NF90IG9yaWdfcG9zID0gYXZpb190ZWxsKGJjKTsKICAgICAgICAgZmluZF9hbmRfZGVjb2RlX2luZGV4KG51dCk7CiAgICAgICAgIGF2aW9fc2VlayhiYywgb3JpZ19wb3MsIFNFRUtfU0VUKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L251dGVuYy5jIGIvbGliYXZmb3JtYXQvbnV0ZW5jLmMKaW5kZXggYjY1ODJlZi4uZTlhM2JiNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbnV0ZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvbnV0ZW5jLmMKQEAgLTM1LDMyICszNSwzMiBAQAogI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKICNpbmNsdWRlICJyaWZmLmgiCiAKLXN0YXRpYyBpbnQgZmluZF9leHBlY3RlZF9oZWFkZXIoQVZDb2RlY0NvbnRleHQgKmMsIGludCBzaXplLCBpbnQga2V5X2ZyYW1lLAorc3RhdGljIGludCBmaW5kX2V4cGVjdGVkX2hlYWRlcihBVkNvZGVjUGFyYW1ldGVycyAqcCwgaW50IHNpemUsIGludCBrZXlfZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb3V0WzY0XSkKIHsKLSAgICBpbnQgc2FtcGxlX3JhdGUgPSBjLT5zYW1wbGVfcmF0ZTsKKyAgICBpbnQgc2FtcGxlX3JhdGUgPSBwLT5zYW1wbGVfcmF0ZTsKIAogICAgIGlmIChzaXplID4gNDA5NikKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBBVl9XQjI0KG91dCwgMSk7CiAKLSAgICBpZiAoYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKKyAgICBpZiAocC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpIHsKICAgICAgICAgaWYgKGtleV9mcmFtZSkgewogICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBvdXRbM10gPSAweEI2OwogICAgICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8gfHwKLSAgICAgICAgICAgICAgIGMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pIHsKKyAgICB9IGVsc2UgaWYgKHAtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcxVklERU8gfHwKKyAgICAgICAgICAgICAgIHAtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8pIHsKICAgICAgICAgcmV0dXJuIDM7Ci0gICAgfSBlbHNlIGlmIChjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgfSBlbHNlIGlmIChwLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CiAgICAgICAgIHJldHVybiAzOwotICAgIH0gZWxzZSBpZiAoYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzIHx8Ci0gICAgICAgICAgICAgICBjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIpIHsKKyAgICB9IGVsc2UgaWYgKHAtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMyB8fAorICAgICAgICAgICAgICAgcC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAyKSB7CiAgICAgICAgIGludCBsc2YsIG1wZWcyNSwgc2FtcGxlX3JhdGVfaW5kZXgsIGJpdHJhdGVfaW5kZXgsIGZyYW1lX3NpemU7Ci0gICAgICAgIGludCBsYXllciAgICAgICAgICAgPSBjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMgPyAzIDogMjsKKyAgICAgICAgaW50IGxheWVyICAgICAgICAgICA9IHAtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMyA/IDMgOiAyOwogICAgICAgICB1bnNpZ25lZCBpbnQgaGVhZGVyID0gMHhGRkYwMDAwMDsKIAogICAgICAgICBsc2YgICAgICAgICAgID0gc2FtcGxlX3JhdGUgPCAoMjQwMDAgKyAzMjAwMCkgLyAyOwpAQCAtMTAyLDEyICsxMDIsMTMgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBmaW5kX2hlYWRlcl9pZHgoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjQ29udGV4dCAqYywgaW50IHNpemUsIGludCBmcmFtZV90eXBlKQorc3RhdGljIGludCBmaW5kX2hlYWRlcl9pZHgoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjUGFyYW1ldGVycyAqcCwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfdHlwZSkKIHsKICAgICBOVVRDb250ZXh0ICpudXQgPSBzLT5wcml2X2RhdGE7CiAgICAgdWludDhfdCBvdXRbNjRdOwogICAgIGludCBpOwotICAgIGludCBsZW4gPSBmaW5kX2V4cGVjdGVkX2hlYWRlcihjLCBzaXplLCBmcmFtZV90eXBlLCBvdXQpOworICAgIGludCBsZW4gPSBmaW5kX2V4cGVjdGVkX2hlYWRlcihwLCBzaXplLCBmcmFtZV90eXBlLCBvdXQpOwogCiAgICAgZm9yIChpID0gMTsgaSA8IG51dC0+aGVhZGVyX2NvdW50OyBpKyspIHsKICAgICAgICAgaWYgKGxlbiA9PSBudXQtPmhlYWRlcl9sZW5baV0gJiYgIW1lbWNtcChvdXQsIG51dC0+aGVhZGVyW2ldLCBsZW4pKSB7CkBAIC0xNjcsMTggKzE2OCwxOCBAQAogICAgIGZvciAoc3RyZWFtX2lkID0gMDsgc3RyZWFtX2lkIDwgcy0+bmJfc3RyZWFtczsgc3RyZWFtX2lkKyspIHsKICAgICAgICAgaW50IHN0YXJ0MiA9IHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAqIHN0cmVhbV9pZCAgICAgICAvIHMtPm5iX3N0cmVhbXM7CiAgICAgICAgIGludCBlbmQyICAgPSBzdGFydCArIChlbmQgLSBzdGFydCkgKiAoc3RyZWFtX2lkICsgMSkgLyBzLT5uYl9zdHJlYW1zOwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zW3N0cmVhbV9pZF0tPmNvZGVjOwotICAgICAgICBpbnQgaXNfYXVkaW8gICAgICAgICAgPSBjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgICAgICAgID0gcy0+c3RyZWFtc1tzdHJlYW1faWRdLT5jb2RlY3BhcjsKKyAgICAgICAgaW50IGlzX2F1ZGlvICAgICAgICAgICAgICAgICAgPSBwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgICAgICBpbnQgaW50cmFfb25seSAgICAgICAgPSAvKmNvZGVjLT5pbnRyYV9vbmx5IHx8ICovIGlzX2F1ZGlvOwogICAgICAgICBpbnQgcHJlZF9jb3VudDsKICAgICAgICAgaW50IGZyYW1lX3NpemUgPSAwOwogCi0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgIGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oY29kZWMsIDApOwotICAgICAgICAgICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WT1JCSVMgJiYgIWZyYW1lX3NpemUpCisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBmcmFtZV9zaXplID0gYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uMihwYXIsIDApOworICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTICYmICFmcmFtZV9zaXplKQogICAgICAgICAgICAgICAgIGZyYW1lX3NpemUgPSA2NDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFWUmF0aW9uYWwgZiA9IGF2X2Rpdl9xKGNvZGVjLT50aW1lX2Jhc2UsICpudXQtPnN0cmVhbVtzdHJlYW1faWRdLnRpbWVfYmFzZSk7CisgICAgICAgICAgICBBVlJhdGlvbmFsIGYgPSBhdl9kaXZfcShhdl9pbnZfcShzLT5zdHJlYW1zW3N0cmVhbV9pZF0tPmF2Z19mcmFtZV9yYXRlKSwgKm51dC0+c3RyZWFtW3N0cmVhbV9pZF0udGltZV9iYXNlKTsKICAgICAgICAgICAgIGlmIChmLmRlbiA9PSAxICYmIGYubnVtPjApCiAgICAgICAgICAgICAgICAgZnJhbWVfc2l6ZSA9IGYubnVtOwogICAgICAgICB9CkBAIC0xOTMsNyArMTk0LDcgQEAKICAgICAgICAgICAgICAgICBmdC0+c3RyZWFtX2lkID0gc3RyZWFtX2lkOwogICAgICAgICAgICAgICAgIGZ0LT5zaXplX211bCAgPSAxOwogICAgICAgICAgICAgICAgIGlmIChpc19hdWRpbykKLSAgICAgICAgICAgICAgICAgICAgZnQtPmhlYWRlcl9pZHggPSBmaW5kX2hlYWRlcl9pZHgocywgY29kZWMsIC0xLCBrZXlfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICBmdC0+aGVhZGVyX2lkeCA9IGZpbmRfaGVhZGVyX2lkeChzLCBwYXIsIC0xLCBrZXlfZnJhbWUpOwogICAgICAgICAgICAgICAgIHN0YXJ0MisrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMDEsOSArMjAyLDE2IEBACiAgICAgICAgIGtleV9mcmFtZSA9IGludHJhX29ubHk7CiAjaWYgMQogICAgICAgICBpZiAoaXNfYXVkaW8pIHsKLSAgICAgICAgICAgIGludCBmcmFtZV9ieXRlcyA9IGNvZGVjLT5mcmFtZV9zaXplICogKGludDY0X3QpY29kZWMtPmJpdF9yYXRlIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4ICogY29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGludCBmcmFtZV9ieXRlczsKICAgICAgICAgICAgIGludCBwdHM7CisKKyAgICAgICAgICAgIGlmIChwYXItPmJsb2NrX2FsaWduID4gMCkgeworICAgICAgICAgICAgICAgIGZyYW1lX2J5dGVzID0gcGFyLT5ibG9ja19hbGlnbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHBhciwgMCk7CisgICAgICAgICAgICAgICAgZnJhbWVfYnl0ZXMgPSBmcmFtZV9zaXplICogKGludDY0X3QpcGFyLT5iaXRfcmF0ZSAvICg4ICogcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGZvciAocHRzID0gMDsgcHRzIDwgMjsgcHRzKyspIHsKICAgICAgICAgICAgICAgICBmb3IgKHByZWQgPSAwOyBwcmVkIDwgMjsgcHJlZCsrKSB7CiAgICAgICAgICAgICAgICAgICAgIEZyYW1lQ29kZSAqZnQgID0gJm51dC0+ZnJhbWVfY29kZVtzdGFydDJdOwpAQCAtMjEyLDcgKzIyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGZ0LT5zaXplX211bCAgID0gZnJhbWVfYnl0ZXMgKyAyOwogICAgICAgICAgICAgICAgICAgICBmdC0+c2l6ZV9sc2IgICA9IGZyYW1lX2J5dGVzICsgcHJlZDsKICAgICAgICAgICAgICAgICAgICAgZnQtPnB0c19kZWx0YSAgPSBwdHMgKiBmcmFtZV9zaXplOwotICAgICAgICAgICAgICAgICAgICBmdC0+aGVhZGVyX2lkeCA9IGZpbmRfaGVhZGVyX2lkeChzLCBjb2RlYywgZnJhbWVfYnl0ZXMgKyBwcmVkLCBrZXlfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICBmdC0+aGVhZGVyX2lkeCA9IGZpbmRfaGVhZGVyX2lkeChzLCBwYXIsIGZyYW1lX2J5dGVzICsgcHJlZCwga2V5X2ZyYW1lKTsKICAgICAgICAgICAgICAgICAgICAgc3RhcnQyKys7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjI2LDE0ICsyMzQsMTQgQEAKICAgICAgICAgfQogI2VuZGlmCiAKLSAgICAgICAgaWYgKGNvZGVjLT5oYXNfYl9mcmFtZXMpIHsKKyAgICAgICAgaWYgKHBhci0+dmlkZW9fZGVsYXkpIHsKICAgICAgICAgICAgIHByZWRfY291bnQgICAgPSA1OwogICAgICAgICAgICAgcHJlZF90YWJsZVswXSA9IC0yOwogICAgICAgICAgICAgcHJlZF90YWJsZVsxXSA9IC0xOwogICAgICAgICAgICAgcHJlZF90YWJsZVsyXSA9IDE7CiAgICAgICAgICAgICBwcmVkX3RhYmxlWzNdID0gMzsKICAgICAgICAgICAgIHByZWRfdGFibGVbNF0gPSA0OwotICAgICAgICB9IGVsc2UgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WT1JCSVMpIHsKKyAgICAgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZPUkJJUykgewogICAgICAgICAgICAgcHJlZF9jb3VudCAgICA9IDM7CiAgICAgICAgICAgICBwcmVkX3RhYmxlWzBdID0gMjsKICAgICAgICAgICAgIHByZWRfdGFibGVbMV0gPSA5OwpAQCAtMjU5LDcgKzI2Nyw3IEBACiAgICAgICAgICAgICAgICAgZnQtPnNpemVfbHNiICA9IGluZGV4IC0gc3RhcnQzOwogICAgICAgICAgICAgICAgIGZ0LT5wdHNfZGVsdGEgPSBwcmVkX3RhYmxlW3ByZWRdOwogICAgICAgICAgICAgICAgIGlmIChpc19hdWRpbykKLSAgICAgICAgICAgICAgICAgICAgZnQtPmhlYWRlcl9pZHggPSBmaW5kX2hlYWRlcl9pZHgocywgY29kZWMsIC0xLCBrZXlfZnJhbWUpOworICAgICAgICAgICAgICAgICAgICBmdC0+aGVhZGVyX2lkeCA9IGZpbmRfaGVhZGVyX2lkeChzLCBwYXIsIC0xLCBrZXlfZnJhbWUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMjkxLDI1ICsyOTksNiBAQAogICAgIGZmX3B1dF92KGJjLCAyICogRkZBQlModmFsKSAtICh2YWwgPiAwKSk7CiB9CiAKLSNpZmRlZiBUUkFDRQotc3RhdGljIGlubGluZSB2b2lkIGZmX3B1dF92X3RyYWNlKEFWSU9Db250ZXh0ICpiYywgdWludDY0X3QgdiwgY29uc3QgY2hhciAqZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKLXsKLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiZmZfcHV0X3YgJTUiUFJJZDY0IiAvICUiUFJJWDY0IiBpbiAlcyAlczolZFxuIiwgdiwgdiwgZmlsZSwgZnVuYywgbGluZSk7Ci0KLSAgICBmZl9wdXRfdihiYywgdik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfc190cmFjZShBVklPQ29udGV4dCAqYmMsIGludDY0X3QgdiwgY29uc3QgY2hhciAqZmlsZSwgY29uc3QgY2hhciAqZnVuYywgaW50IGxpbmUpCi17Ci0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgInB1dF9zICU1IlBSSWQ2NCIgLyAlIlBSSVg2NCIgaW4gJXMgJXM6JWRcbiIsIHYsIHYsIGZpbGUsIGZ1bmMsIGxpbmUpOwotCi0gICAgcHV0X3MoYmMsIHYpOwotfQotI2RlZmluZSBmZl9wdXRfdihiYywgdikgIGZmX3B1dF92X3RyYWNlKGJjLCB2LCBfX0ZJTEVfXywgX19QUkVUVFlfRlVOQ1RJT05fXywgX19MSU5FX18pCi0jZGVmaW5lIHB1dF9zKGJjLCB2KSAgcHV0X3NfdHJhY2UoYmMsIHYsIF9fRklMRV9fLCBfX1BSRVRUWV9GVU5DVElPTl9fLCBfX0xJTkVfXykKLSNlbmRpZgotCiAvL0ZJWE1FIHJlbW92ZSBjYWxjdWxhdGVfY2hlY2tzdW0KIHN0YXRpYyB2b2lkIHB1dF9wYWNrZXQoTlVUQ29udGV4dCAqbnV0LCBBVklPQ29udGV4dCAqYmMsIEFWSU9Db250ZXh0ICpkeW5fYmMsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWxjdWxhdGVfY2hlY2tzdW0sIHVpbnQ2NF90IHN0YXJ0Y29kZSkKQEAgLTQxOCwxOCArNDA3LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIGludCBpKQogewogICAgIE5VVENvbnRleHQgKm51dCAgICAgICA9IGF2Y3R4LT5wcml2X2RhdGE7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3QtPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzdC0+Y29kZWNwYXI7CiAKICAgICBmZl9wdXRfdihiYywgaSk7Ci0gICAgc3dpdGNoIChjb2RlYy0+Y29kZWNfdHlwZSkgeworICAgIHN3aXRjaCAocGFyLT5jb2RlY190eXBlKSB7CiAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86ICAgIGZmX3B1dF92KGJjLCAwKTsgYnJlYWs7CiAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86ICAgIGZmX3B1dF92KGJjLCAxKTsgYnJlYWs7CiAgICAgY2FzZSBBVk1FRElBX1RZUEVfU1VCVElUTEU6IGZmX3B1dF92KGJjLCAyKTsgYnJlYWs7CiAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIGZmX3B1dF92KGJjLCAzKTsgYnJlYWs7CiAgICAgfQogICAgIGZmX3B1dF92KGJjLCA0KTsKLSAgICBpZiAoY29kZWMtPmNvZGVjX3RhZykgewotICAgICAgICBhdmlvX3dsMzIoYmMsIGNvZGVjLT5jb2RlY190YWcpOworCisgICAgaWYgKHBhci0+Y29kZWNfdGFnKSB7CisgICAgICAgIGF2aW9fd2wzMihiYywgcGFyLT5jb2RlY190YWcpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2X2xvZyhhdmN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gY29kZWMgdGFnIGRlZmluZWQgZm9yIHN0cmVhbSAlZFxuIiwgaSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC00MzgsMjEgKzQyOCwyMSBAQAogICAgIGZmX3B1dF92KGJjLCBudXQtPnN0cmVhbVtpXS50aW1lX2Jhc2UgLSBudXQtPnRpbWVfYmFzZSk7CiAgICAgZmZfcHV0X3YoYmMsIG51dC0+c3RyZWFtW2ldLm1zYl9wdHNfc2hpZnQpOwogICAgIGZmX3B1dF92KGJjLCBudXQtPnN0cmVhbVtpXS5tYXhfcHRzX2Rpc3RhbmNlKTsKLSAgICBmZl9wdXRfdihiYywgY29kZWMtPmhhc19iX2ZyYW1lcyk7CisgICAgZmZfcHV0X3YoYmMsIHBhci0+dmlkZW9fZGVsYXkpOwogICAgIGF2aW9fdzgoYmMsIDApOyAvKiBmbGFnczogMHgxIC0gZml4ZWRfZnBzLCAweDIgLSBpbmRleF9wcmVzZW50ICovCiAKLSAgICBmZl9wdXRfdihiYywgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKLSAgICBhdmlvX3dyaXRlKGJjLCBjb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgIGZmX3B1dF92KGJjLCBwYXItPmV4dHJhZGF0YV9zaXplKTsKKyAgICBhdmlvX3dyaXRlKGJjLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAKLSAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgc3dpdGNoIChwYXItPmNvZGVjX3R5cGUpIHsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgICAgZmZfcHV0X3YoYmMsIGNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGZmX3B1dF92KGJjLCBwYXItPnNhbXBsZV9yYXRlKTsKICAgICAgICAgZmZfcHV0X3YoYmMsIDEpOwotICAgICAgICBmZl9wdXRfdihiYywgY29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgZmZfcHV0X3YoYmMsIHBhci0+Y2hhbm5lbHMpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgZmZfcHV0X3YoYmMsIGNvZGVjLT53aWR0aCk7Ci0gICAgICAgIGZmX3B1dF92KGJjLCBjb2RlYy0+aGVpZ2h0KTsKKyAgICAgICAgZmZfcHV0X3YoYmMsIHBhci0+d2lkdGgpOworICAgICAgICBmZl9wdXRfdihiYywgcGFyLT5oZWlnaHQpOwogCiAgICAgICAgIGlmIChzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPD0gMCB8fAogICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuIDw9IDApIHsKQEAgLTQ4OSw2ICs0NzksNyBAQAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCisgICAgZmZfc3RhbmRhcmRpemVfY3JlYXRpb25fdGltZShzKTsKICAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChzLT5tZXRhZGF0YSwgIiIsIHQsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQogICAgICAgICBjb3VudCArPSBhZGRfaW5mbyhkeW5fYmMsIHQtPmtleSwgdC0+dmFsdWUpOwogCkBAIC01MjIsMTIgKzUxMywxMiBAQAogICAgICAgICBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgZmZfbnV0X2Rpc3Bvc2l0aW9uc1tpXS5mbGFnKQogICAgICAgICAgICAgY291bnQgKz0gYWRkX2luZm8oZHluX2JjLCAiRGlzcG9zaXRpb24iLCBmZl9udXRfZGlzcG9zaXRpb25zW2ldLnN0cik7CiAgICAgfQotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgdWludDhfdCBidWZbMjU2XTsKICAgICAgICAgaWYgKHN0LT5yX2ZyYW1lX3JhdGUubnVtPjAgJiYgc3QtPnJfZnJhbWVfcmF0ZS5kZW4+MCkKICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZC8lZCIsIHN0LT5yX2ZyYW1lX3JhdGUubnVtLCBzdC0+cl9mcmFtZV9yYXRlLmRlbik7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZC8lZCIsIHN0LT5jb2RlYy0+dGltZV9iYXNlLmRlbiwgc3QtPmNvZGVjLT50aW1lX2Jhc2UubnVtKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZC8lZCIsIHN0LT5hdmdfZnJhbWVfcmF0ZS5udW0sIHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4pOwogICAgICAgICBjb3VudCArPSBhZGRfaW5mbyhkeW5fYmMsICJyX2ZyYW1lX3JhdGUiLCBidWYpOwogICAgIH0KICAgICBkeW5fc2l6ZSA9IGF2aW9fY2xvc2VfZHluX2J1ZihkeW5fYmMsICZkeW5fYnVmKTsKQEAgLTcyMiw4ICs3MTMsOCBAQAogICAgICAgICBBVlJhdGlvbmFsIHRpbWVfYmFzZTsKICAgICAgICAgZmZfcGFyc2Vfc3BlY2lmaWNfcGFyYW1zKHN0LCAmdGltZV9iYXNlLmRlbiwgJnNzaXplLCAmdGltZV9iYXNlLm51bSk7CiAKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkgewotICAgICAgICAgICAgdGltZV9iYXNlID0gKEFWUmF0aW9uYWwpIHsxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlfTsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICAgICAgdGltZV9iYXNlID0gKEFWUmF0aW9uYWwpIHsxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlfTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHRpbWVfYmFzZSA9IGZmX2Nob29zZV90aW1lYmFzZShzLCBzdCwgNDgwMDApOwogICAgICAgICB9CkBAIC0xMTgxLDcgKzExNzIsNyBAQAogCiAgICAgcmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJmR5bl9iYyk7CiAgICAgaWYgKHJldCA+PSAwICYmIG51dC0+c3BfY291bnQpIHsKLSAgICAgICAgYXZfYXNzZXJ0MShudXQtPndyaXRlX2luZGV4KTsKKyAgICAgICAgYXZfYXNzZXJ0MShudXQtPndyaXRlX2luZGV4KTsgLy8gc3BfY291bnQgc2hvdWxkIGJlIDAgaWYgbm8gaW5kZXggaXMgZ29pbmcgdG8gYmUgd3JpdHRlbgogICAgICAgICB3cml0ZV9pbmRleChudXQsIGR5bl9iYyk7CiAgICAgICAgIHB1dF9wYWNrZXQobnV0LCBiYywgZHluX2JjLCAxLCBJTkRFWF9TVEFSVENPREUpOwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L251di5jIGIvbGliYXZmb3JtYXQvbnV2LmMKaW5kZXggYzMwZGE2MC4uOWJkZWE0YSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvbnV2LmMKKysrIGIvbGliYXZmb3JtYXQvbnV2LmMKQEAgLTY2LDcgKzY2LDcgQEAKICAqIEBwYXJhbSBteXRoIHNldCBpZiB0aGlzIGlzIGEgTXl0aFRWVmlkZW8gZm9ybWF0IGZpbGUKICAqIEByZXR1cm4gMCBvciBBVkVSUk9SIGNvZGUKICAqLwotc3RhdGljIGludCBnZXRfY29kZWNfZGF0YShBVklPQ29udGV4dCAqcGIsIEFWU3RyZWFtICp2c3QsCitzdGF0aWMgaW50IGdldF9jb2RlY19kYXRhKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBBVlN0cmVhbSAqdnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqYXN0LCBpbnQgbXl0aCkKIHsKICAgICBudXZfZnJhbWV0eXBlIGZyYW1ldHlwZTsKQEAgLTgzLDExICs4MywxMSBAQAogICAgICAgICAgICAgYXZpb19za2lwKHBiLCA2KTsKICAgICAgICAgICAgIHNpemUgPSBQS1RTSVpFKGF2aW9fcmwzMihwYikpOwogICAgICAgICAgICAgaWYgKHZzdCAmJiBzdWJ0eXBlID09ICdSJykgewotICAgICAgICAgICAgICAgIGlmICh2c3QtPmNvZGVjLT5leHRyYWRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ2c3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHZzdC0+Y29kZWMsIHBiLCBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgaWYgKGZmX2dldF9leHRyYWRhdGEoTlVMTCwgdnN0LT5jb2RlY3BhciwgcGIsIHNpemUpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgICAgICBzaXplID0gMDsKICAgICAgICAgICAgICAgICBpZiAoIW15dGgpCkBAIC0xMDEsMzIgKzEwMSwzNiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgYXZpb19ybDMyKHBiKTsgLy8gdmVyc2lvbgogICAgICAgICAgICAgaWYgKHZzdCkgewotICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IGF2aW9fcmwzMihwYik7Ci0gICAgICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPQotICAgICAgICAgICAgICAgICAgICBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHZzdC0+Y29kZWMtPmNvZGVjX3RhZyA9PSBNS1RBRygnUicsICdKJywgJ1AnLCAnRycpKQotICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05VVjsKKyAgICAgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0KKyAgICAgICAgICAgICAgICAgICAgZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLCB2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcpOworICAgICAgICAgICAgICAgIGlmICh2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gTUtUQUcoJ1InLCAnSicsICdQJywgJ0cnKSkKKyAgICAgICAgICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OVVY7CiAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOwogCiAgICAgICAgICAgICBpZiAoYXN0KSB7CiAgICAgICAgICAgICAgICAgaW50IGlkOwogCi0gICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKLSAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOwotICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmwzMihwYik7Ci0gICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKLSAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSAwOworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgICAgICAgICAgICA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICBpZiAoYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgcmF0ZSAlZFxuIiwgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ICAgICAgICA9IDA7CiAKLSAgICAgICAgICAgICAgICBpZCA9IGZmX3dhdl9jb2RlY19nZXRfaWQoYXN0LT5jb2RlYy0+Y29kZWNfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICAgICAgICAgIGlkID0gZmZfd2F2X2NvZGVjX2dldF9pZChhc3QtPmNvZGVjcGFyLT5jb2RlY190YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CiAgICAgICAgICAgICAgICAgaWYgKGlkID09IEFWX0NPREVDX0lEX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWQgPSBmZl9jb2RlY19nZXRfaWQobnV2X2F1ZGlvX3RhZ3MsIGFzdC0+Y29kZWMtPmNvZGVjX3RhZyk7CisgICAgICAgICAgICAgICAgICAgIGlkID0gZmZfY29kZWNfZ2V0X2lkKG51dl9hdWRpb190YWdzLCBhc3QtPmNvZGVjcGFyLT5jb2RlY190YWcpOwogICAgICAgICAgICAgICAgICAgICBpZiAoaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBmZl9nZXRfcGNtX2NvZGVjX2lkKGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gZmZfZ2V0X3BjbV9jb2RlY19pZChhc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgfjEpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IGlkOworICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gaWQ7CiAKICAgICAgICAgICAgICAgICBhc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgICAgICAgICB9IGVsc2UKQEAgLTE5NSwxNSArMTk5LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBjdHgtPnZfaWQgPSB2c3QtPmluZGV4OwogCi0gICAgICAgIHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUod2lkdGgsIGhlaWdodCwgMCwgY3R4KTsKKyAgICAgICAgcmV0ID0gYXZfaW1hZ2VfY2hlY2tfc2l6ZSh3aWR0aCwgaGVpZ2h0LCAwLCBzKTsKICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfTlVWOwotICAgICAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgICAgICAgICAgICAgPSB3aWR0aDsKLSAgICAgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICAgICAgICAgICAgID0gaGVpZ2h0OwotICAgICAgICB2c3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxMDsKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9OVVY7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICAgICAgICAgICAgICAgICA9IHdpZHRoOworICAgICAgICB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgICAgICAgICAgICAgPSBoZWlnaHQ7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDEwOwogICAgICAgICB2c3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gICAgICAgICAgPSBhdl9kMnEoYXNwZWN0ICogaGVpZ2h0IC8gd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCk7CiAjaWYgRkZfQVBJX1JfRlJBTUVfUkFURQpAQCAtMjIwLDIyICsyMjQsMjIgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGN0eC0+YV9pZCA9IGFzdC0+aW5kZXg7CiAKLSAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICAgICAgICA9IDI7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ICAgICAgICA9IEFWX0NIX0xBWU9VVF9TVEVSRU87Ci0gICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICAgICAgICA9IDQ0MTAwOwotICAgICAgICBhc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICAgICAgICAgICAgPSAyICogMiAqIDQ0MTAwICogODsKLSAgICAgICAgYXN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gICAgICAgICAgID0gMiAqIDI7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgICAgICAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gMjsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgICAgICAgID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gNDQxMDA7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdF9yYXRlICAgICAgICAgICAgICA9IDIgKiAyICogNDQxMDAgKiA4OworICAgICAgICBhc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAgICAgICAgICAgPSAyICogMjsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7CiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCAzMiwgMSwgMTAwMCk7CiAgICAgfSBlbHNlCiAgICAgICAgIGN0eC0+YV9pZCA9IC0xOwogCi0gICAgaWYgKChyZXQgPSBnZXRfY29kZWNfZGF0YShwYiwgdnN0LCBhc3QsIGlzX215dGh0dikpIDwgMCkKKyAgICBpZiAoKHJldCA9IGdldF9jb2RlY19kYXRhKHMsIHBiLCB2c3QsIGFzdCwgaXNfbXl0aHR2KSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCi0gICAgY3R4LT5ydGpwZ192aWRlbyA9IHZzdCAmJiB2c3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OVVY7CisgICAgY3R4LT5ydGpwZ192aWRlbyA9IHZzdCAmJiB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OVVY7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L29nZ2RlYy5jIGIvbGliYXZmb3JtYXQvb2dnZGVjLmMKaW5kZXggMmQ5OWI0YS4uMjdkMTZhMyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb2dnZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvb2dnZGVjLmMKQEAgLTYxLDcgKzYxLDIyIEBACiAKIHN0YXRpYyBpbnQ2NF90IG9nZ19jYWxjX3B0cyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgsIGludDY0X3QgKmR0cyk7CiBzdGF0aWMgaW50IG9nZ19uZXdfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqcywgdWludDMyX3Qgc2VyaWFsKTsKLXN0YXRpYyBpbnQgb2dnX3Jlc3RvcmUoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgZGlzY2FyZCk7CitzdGF0aWMgaW50IG9nZ19yZXN0b3JlKEFWRm9ybWF0Q29udGV4dCAqcyk7CisKK3N0YXRpYyB2b2lkIGZyZWVfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGkpCit7CisgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOworICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpzdHJlYW0gPSAmb2dnLT5zdHJlYW1zW2ldOworCisgICAgYXZfZnJlZXAoJnN0cmVhbS0+YnVmKTsKKyAgICBpZiAoc3RyZWFtLT5jb2RlYyAmJgorICAgICAgICBzdHJlYW0tPmNvZGVjLT5jbGVhbnVwKSB7CisgICAgICAgIHN0cmVhbS0+Y29kZWMtPmNsZWFudXAocywgaSk7CisgICAgfQorCisgICAgYXZfZnJlZXAoJnN0cmVhbS0+cHJpdmF0ZSk7CisgICAgYXZfZnJlZXAoJnN0cmVhbS0+bmV3X21ldGFkYXRhKTsKK30KIAogLy9GSVhNRSBXZSBjb3VsZCBhdm9pZCBzb21lIHN0cnVjdHVyZSBkdXBsaWNhdGlvbgogc3RhdGljIGludCBvZ2dfc2F2ZShBVkZvcm1hdENvbnRleHQgKnMpCkBAIC05NSwxMiArMTEwLDEyIEBACiAgICAgb2dnLT5zdGF0ZSA9IG9zdDsKIAogICAgIGlmIChyZXQgPCAwKQotICAgICAgICBvZ2dfcmVzdG9yZShzLCAwKTsKKyAgICAgICAgb2dnX3Jlc3RvcmUocyk7CiAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG9nZ19yZXN0b3JlKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IGRpc2NhcmQpCitzdGF0aWMgaW50IG9nZ19yZXN0b3JlKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBzdHJ1Y3Qgb2dnICpvZ2cgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKmJjID0gcy0+cGI7CkBAIC0xMTIsMTAgKzEyNywxNSBAQAogCiAgICAgb2dnLT5zdGF0ZSA9IG9zdC0+bmV4dDsKIAotICAgIGlmICghZGlzY2FyZCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2dnLT5uc3RyZWFtczsgaSsrKSB7CisgICAgICAgICAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqc3RyZWFtID0gJm9nZy0+c3RyZWFtc1tpXTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdHJlYW0tPmJ1Zik7CisgICAgICAgICAgICBhdl9mcmVlcCgmc3RyZWFtLT5uZXdfbWV0YWRhdGEpOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBvZ2ctPm5zdHJlYW1zOyBpKyspCi0gICAgICAgICAgICBhdl9mcmVlcCgmb2dnLT5zdHJlYW1zW2ldLmJ1Zik7CisgICAgICAgICAgICBpZiAoaSA+PSBvc3QtPm5zdHJlYW1zIHx8ICFvc3QtPnN0cmVhbXNbaV0ucHJpdmF0ZSkgeworICAgICAgICAgICAgICAgIGZyZWVfc3RyZWFtKHMsIGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgYXZpb19zZWVrKGJjLCBvc3QtPnBvcywgU0VFS19TRVQpOwogICAgICAgICBvZ2ctPnBhZ2VfcG9zID0gLTE7CkBAIC0xMjgsNyArMTQ4LDYgQEAKICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICBtZW1jcHkob2dnLT5zdHJlYW1zLCBvc3QtPnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgb3N0LT5uc3RyZWFtcyAqIHNpemVvZigqb2dnLT5zdHJlYW1zKSk7Ci0gICAgfQogCiAgICAgYXZfZnJlZShvc3QpOwogCkBAIC0xOTMsNyArMjEyLDcgQEAKICAgICBjb25zdCBzdHJ1Y3Qgb2dnX2NvZGVjICpjb2RlYzsKICAgICBpbnQgaSA9IDA7CiAKLSAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CiAgICAgICAgIHVpbnQ4X3QgbWFnaWNbOF07CiAgICAgICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKHMtPnBiKTsKICAgICAgICAgYXZpb19za2lwKHMtPnBiLCBuc2Vncyk7CkBAIC0zMzksNyArMzU4LDcgQEAKICAgICAgICAgICAgIHN5bmNbKHNwICsgMikgJiAzXSA9PSAnZycgJiYgc3luY1soc3AgKyAzKSAmIDNdID09ICdTJykKICAgICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGlmKCFpICYmIGJjLT5zZWVrYWJsZSAmJiBvZ2ctPnBhZ2VfcG9zID4gMCkgeworICAgICAgICBpZighaSAmJiAoYmMtPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmIG9nZy0+cGFnZV9wb3MgPiAwKSB7CiAgICAgICAgICAgICBtZW1zZXQoc3luYywgMCwgNCk7CiAgICAgICAgICAgICBhdmlvX3NlZWsoYmMsIG9nZy0+cGFnZV9wb3MrNCwgU0VFS19TRVQpOwogICAgICAgICAgICAgb2dnLT5wYWdlX3BvcyA9IC0xOwpAQCAtNTI3LDcgKzU0NiwxMSBAQAogICAgIG9zLT5pbmNvbXBsZXRlID0gMDsKIAogICAgIGlmIChvcy0+aGVhZGVyKSB7Ci0gICAgICAgIG9zLT5oZWFkZXIgPSBvcy0+Y29kZWMtPmhlYWRlcihzLCBpZHgpOworICAgICAgICBpZiAoKHJldCA9IG9zLT5jb2RlYy0+aGVhZGVyKHMsIGlkeCkpIDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkhlYWRlciBwcm9jZXNzaW5nIGZhaWxlZDogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIG9zLT5oZWFkZXIgPSByZXQ7CiAgICAgICAgIGlmICghb3MtPmhlYWRlcikgewogICAgICAgICAgICAgb3MtPnNlZ3AgID0gc2VncDsKICAgICAgICAgICAgIG9zLT5wc2l6ZSA9IHBzaXplOwpAQCAtNTU4LDggKzU4MSwxMiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG9zLT5wZmxhZ3MgICAgPSAwOwogICAgICAgICBvcy0+cGR1cmF0aW9uID0gMDsKLSAgICAgICAgaWYgKG9zLT5jb2RlYyAmJiBvcy0+Y29kZWMtPnBhY2tldCkKLSAgICAgICAgICAgIG9zLT5jb2RlYy0+cGFja2V0KHMsIGlkeCk7CisgICAgICAgIGlmIChvcy0+Y29kZWMgJiYgb3MtPmNvZGVjLT5wYWNrZXQpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gb3MtPmNvZGVjLT5wYWNrZXQocywgaWR4KSkgPCAwKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlBhY2tldCBwcm9jZXNzaW5nIGZhaWxlZDogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICBpZiAoc2lkKQogICAgICAgICAgICAgKnNpZCA9IGlkeDsKICAgICAgICAgaWYgKGRzdGFydCkKQEAgLTU5Nyw3ICs2MjQsNyBAQAogICAgIGludDY0X3Qgc2l6ZSwgZW5kOwogICAgIGludCBzdHJlYW1zX2xlZnQ9MDsKIAotICAgIGlmICghcy0+cGItPnNlZWthYmxlKQorICAgIGlmICghKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKICAgICAgICAgcmV0dXJuIDA7CiAKIC8vIGFscmVhZHkgc2V0CkBAIC02MzEsNyArNjU4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG9nZ19yZXN0b3JlKHMsIDApOworICAgIG9nZ19yZXN0b3JlKHMpOwogCiAgICAgcmV0ID0gb2dnX3NhdmUocyk7CiAgICAgaWYgKHJldCA8IDApCkBAIC02NDMsNiArNjcwLDggQEAKICAgICAgICAgaW50NjRfdCBwdHM7CiAgICAgICAgIGlmIChpIDwgMCkgY29udGludWU7CiAgICAgICAgIHB0cyA9IG9nZ19jYWxjX3B0cyhzLCBpLCBOVUxMKTsKKyAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmIChwdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcy0+c3RyZWFtc1tpXS0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSAmJiAhb2dnLT5zdHJlYW1zW2ldLmdvdF9zdGFydCkgewogICAgICAgICAgICAgcy0+c3RyZWFtc1tpXS0+ZHVyYXRpb24gLT0gcHRzOwogICAgICAgICAgICAgb2dnLT5zdHJlYW1zW2ldLmdvdF9zdGFydD0gMTsKQEAgLTY1Miw3ICs2ODEsNyBAQAogICAgICAgICAgICAgc3RyZWFtc19sZWZ0LS07CiAgICAgICAgIH0KICAgICB9Ci0gICAgb2dnX3Jlc3RvcmUgKHMsIDApOworICAgIG9nZ19yZXN0b3JlIChzKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtNjYzLDEzICs2OTIsNyBAQAogICAgIGludCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IG9nZy0+bnN0cmVhbXM7IGkrKykgewotICAgICAgICBhdl9mcmVlcCgmb2dnLT5zdHJlYW1zW2ldLmJ1Zik7Ci0gICAgICAgIGlmIChvZ2ctPnN0cmVhbXNbaV0uY29kZWMgJiYKLSAgICAgICAgICAgIG9nZy0+c3RyZWFtc1tpXS5jb2RlYy0+Y2xlYW51cCkgewotICAgICAgICAgICAgb2dnLT5zdHJlYW1zW2ldLmNvZGVjLT5jbGVhbnVwKHMsIGkpOwotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyZWVwKCZvZ2ctPnN0cmVhbXNbaV0ucHJpdmF0ZSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZvZ2ctPnN0cmVhbXNbaV0ubmV3X21ldGFkYXRhKTsKKyAgICAgICAgZnJlZV9zdHJlYW0ocywgaSk7CiAgICAgfQogCiAgICAgb2dnLT5uc3RyZWFtcyA9IDA7CkBAIC03MDEsMTMgKzcyNCwxNiBAQAogICAgICAgICBpZiAob2dnLT5zdHJlYW1zW2ldLmhlYWRlciA8IDApIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJIZWFkZXIgcGFyc2luZyBmYWlsZWQgZm9yIHN0cmVhbSAlZFxuIiwgaSk7CiAgICAgICAgICAgICBvZ2ctPnN0cmVhbXNbaV0uY29kZWMgPSBOVUxMOworICAgICAgICAgICAgYXZfZnJlZXAoJm9nZy0+c3RyZWFtc1tpXS5wcml2YXRlKTsKICAgICAgICAgfSBlbHNlIGlmIChvcy0+Y29kZWMgJiYgb3MtPm5iX2hlYWRlciA8IG9zLT5jb2RlYy0+bmJfaGVhZGVyKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgIkhlYWRlcnMgbWlzbWF0Y2ggZm9yIHN0cmVhbSAlZDogIgogICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCAlZCByZWNlaXZlZCAlZC5cbiIsCiAgICAgICAgICAgICAgICAgICAgaSwgb3MtPmNvZGVjLT5uYl9oZWFkZXIsIG9zLT5uYl9oZWFkZXIpOwotICAgICAgICAgICAgaWYgKHMtPmVycm9yX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgIGlmIChzLT5lcnJvcl9yZWNvZ25pdGlvbiAmIEFWX0VGX0VYUExPREUpIHsKKyAgICAgICAgICAgICAgICBvZ2dfcmVhZF9jbG9zZShzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAob3MtPnN0YXJ0X2dyYW51bGUgIT0gT0dHX05PR1JBTlVMRV9WQUxVRSkKICAgICAgICAgICAgIG9zLT5sYXN0cHRzID0gcy0+c3RyZWFtc1tpXS0+c3RhcnRfdGltZSA9CkBAIC03NjAsNyArNzg2LDcgQEAKICAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CiAgICAgaW50IGludmFsaWQgPSAwOwogICAgIGlmIChwc2l6ZSkgewotICAgICAgICBzd2l0Y2ggKHMtPnN0cmVhbXNbaWR4XS0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgICAgIHN3aXRjaCAocy0+c3RyZWFtc1tpZHhdLT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9USEVPUkE6CiAgICAgICAgICAgICBpbnZhbGlkID0gISEob3MtPnBmbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgIT0gIShvcy0+YnVmW3BzdGFydF0gJiAweDQwKTsKICAgICAgICAgYnJlYWs7CkBAIC04NjQsNyArODkwLDcgQEAKICAgICAgICAgICAgJiYgIW9nZ19wYWNrZXQocywgJmksICZwc3RhcnQsICZwc2l6ZSwgcG9zX2FyZykpIHsKICAgICAgICAgaWYgKGkgPT0gc3RyZWFtX2luZGV4KSB7CiAgICAgICAgICAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBzdHJlYW1faW5kZXg7Ci0gICAgICAgICAgICAvLyBEbyBub3QgdHJ1c3QgdGhlIGxhc3QgdGltZXN0YW1wcyBvZiBhIG9nbSB2aWRlbworICAgICAgICAgICAgLy8gRG8gbm90IHRydXN0IHRoZSBsYXN0IHRpbWVzdGFtcHMgb2YgYW4gb2dtIHZpZGVvCiAgICAgICAgICAgICBpZiAoICAgIChvcy0+ZmxhZ3MgJiBPR0dfRkxBR19FT1MpCiAgICAgICAgICAgICAgICAgJiYgIShvcy0+ZmxhZ3MgJiBPR0dfRkxBR19CT1MpCiAgICAgICAgICAgICAgICAgJiYgb3MtPmNvZGVjID09ICZmZl9vZ21fdmlkZW9fY29kZWMpCkBAIC05MDMsNyArOTI5LDcgQEAKIAogICAgIC8vIFRyeSBzZWVraW5nIHRvIGEga2V5ZnJhbWUgZmlyc3QuIElmIHRoaXMgZmFpbHMgKHZlcnkgcG9zc2libGUpLAogICAgIC8vIGF2X3NlZWtfZnJhbWUgd2lsbCBmYWxsIGJhY2sgdG8gaWdub3Jpbmcga2V5ZnJhbWVzCi0gICAgaWYgKHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPCisgICAgaWYgKHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPCiAgICAgICAgICYmICEoZmxhZ3MgJiBBVlNFRUtfRkxBR19BTlkpKQogICAgICAgICBvcy0+a2V5ZnJhbWVfc2VlayA9IDE7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L29nZ2RlYy5oIGIvbGliYXZmb3JtYXQvb2dnZGVjLmgKaW5kZXggZDdhZjFjZi4uNGEyYjZkZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb2dnZGVjLmgKKysrIGIvbGliYXZmb3JtYXQvb2dnZGVjLmgKQEAgLTE2Miw2ICsxNjIsMTEgQEAKICAgICAgICAgaWYgKGR0cykKICAgICAgICAgICAgICpkdHMgPSBwdHM7CiAgICAgfQorICAgIGlmIChwdHMgPiBJTlQ2NF9NQVggJiYgcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIC8vIFRoZSByZXR1cm4gdHlwZSBpcyB1bnNpZ25lZCwgd2UgdGh1cyBjYW5ub3QgcmV0dXJuIG5lZ2F0aXZlIHB0cworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwdHMgJSJQUklkNjQiXG4iLCBwdHMpOworICAgICAgICBwdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICB9CiAKICAgICByZXR1cm4gcHRzOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvb2dnZW5jLmMgYi9saWJhdmZvcm1hdC9vZ2dlbmMuYwppbmRleCA0OTA3NTEyLi4xMGM0ZWRhIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9vZ2dlbmMuYworKysgYi9saWJhdmZvcm1hdC9vZ2dlbmMuYwpAQCAtNTQsNiArNTQsOCBAQAogICAgIGludCBrZmdzaGlmdDsKICAgICBpbnQ2NF90IGxhc3Rfa2ZfcHRzOwogICAgIGludCB2cmV2OworICAgIC8qIGZvciBWUDggZ3JhbnVsZSAqLworICAgIGludCBpc3ZwODsKICAgICBpbnQgZW9zOwogICAgIHVuc2lnbmVkIHBhZ2VfY291bnQ7IC8vLzwgbnVtYmVyIG9mIHBhZ2UgYnVmZmVyZWQKICAgICBPR0dQYWdlIHBhZ2U7IC8vLzwgY3VycmVudCBwYWdlCkBAIC0xNDYsNyArMTQ4LDggQEAKIAogc3RhdGljIGludCBvZ2dfa2V5X2dyYW51bGUoT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtLCBpbnQ2NF90IGdyYW51bGUpCiB7Ci0gICAgcmV0dXJuIG9nZ3N0cmVhbS0+a2Znc2hpZnQgJiYgIShncmFudWxlICYgKCgxPDxvZ2dzdHJlYW0tPmtmZ3NoaWZ0KS0xKSk7CisgICAgcmV0dXJuIChvZ2dzdHJlYW0tPmtmZ3NoaWZ0ICYmICEoZ3JhbnVsZSAmICgoMTw8b2dnc3RyZWFtLT5rZmdzaGlmdCktMSkpKSB8fAorICAgICAgICAgICAob2dnc3RyZWFtLT5pc3ZwOCAgICAmJiAhKChncmFudWxlID4+IDMpICYgMHgwN2ZmZmZmZikpOwogfQogCiBzdGF0aWMgaW50NjRfdCBvZ2dfZ3JhbnVsZV90b190aW1lc3RhbXAoT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtLCBpbnQ2NF90IGdyYW51bGUpCkBAIC0xNTQsNiArMTU3LDggQEAKICAgICBpZiAob2dnc3RyZWFtLT5rZmdzaGlmdCkKICAgICAgICAgcmV0dXJuIChncmFudWxlPj5vZ2dzdHJlYW0tPmtmZ3NoaWZ0KSArCiAgICAgICAgICAgICAoZ3JhbnVsZSAmICgoMTw8b2dnc3RyZWFtLT5rZmdzaGlmdCktMSkpOworICAgIGVsc2UgaWYgKG9nZ3N0cmVhbS0+aXN2cDgpCisgICAgICAgIHJldHVybiBncmFudWxlID4+IDMyOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuIGdyYW51bGU7CiB9CkBAIC0xOTMsNyArMTk4LDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBsLT5wYWdlID0gb2dnc3RyZWFtLT5wYWdlOwogCi0gICAgb2dnc3RyZWFtLT5wYWdlLnN0YXJ0X2dyYW51bGUgPSBvZ2dzdHJlYW0tPnBhZ2UuZ3JhbnVsZTsKKyAgICBvZ2dzdHJlYW0tPnBhZ2Uuc3RhcnRfZ3JhbnVsZSA9IG9nZ19ncmFudWxlX3RvX3RpbWVzdGFtcChvZ2dzdHJlYW0sIG9nZ3N0cmVhbS0+cGFnZS5ncmFudWxlKTsKICAgICBvZ2dzdHJlYW0tPnBhZ2VfY291bnQrKzsKICAgICBvZ2dfcmVzZXRfY3VyX3BhZ2Uob2dnc3RyZWFtKTsKIApAQCAtMjE5LDExICsyMjQsMTEgQEAKICAgICBpbnQgaSwgc2VnbWVudHMsIGxlbiwgZmx1c2ggPSAwOwogCiAgICAgLy8gSGFuZGxlcyBWRlIgYnkgZmx1c2hpbmcgcGFnZSBiZWNhdXNlIHRoaXMgZnJhbWUgbmVlZHMgdG8gaGF2ZSBhIHRpbWVzdGFtcAotICAgIC8vIEZvciB0aGVvcmEsIGtleWZyYW1lcyBhbHNvIG5lZWQgdG8gaGF2ZSBhIHRpbWVzdGFtcCB0byBjb3JyZWN0bHkgbWFyaworICAgIC8vIEZvciB0aGVvcmEgYW5kIFZQOCwga2V5ZnJhbWVzIGFsc28gbmVlZCB0byBoYXZlIGEgdGltZXN0YW1wIHRvIGNvcnJlY3RseSBtYXJrCiAgICAgLy8gdGhlbSBhcyBzdWNoLCBvdGhlcndpc2Ugc2Vla2luZyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSBhdCB0aGUgdmVyeQogICAgIC8vIGxlYXN0IHdpdGggb2xkIGxpYm9nZyB2ZXJzaW9ucy4KICAgICAvLyBEbyBub3QgdHJ5IHRvIGZsdXNoIGhlYWRlciBwYWNrZXRzIHRob3VnaCwgdGhhdCB3aWxsIGNyZWF0ZSBicm9rZW4gZmlsZXMuCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVEhFT1JBICYmICFoZWFkZXIgJiYKKyAgICBpZiAoKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVEhFT1JBIHx8IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4KSAmJiAhaGVhZGVyICYmCiAgICAgICAgIChvZ2dfZ3JhbnVsZV90b190aW1lc3RhbXAob2dnc3RyZWFtLCBncmFudWxlKSA+CiAgICAgICAgICBvZ2dfZ3JhbnVsZV90b190aW1lc3RhbXAob2dnc3RyZWFtLCBvZ2dzdHJlYW0tPmxhc3RfZ3JhbnVsZSkgKyAxIHx8CiAgICAgICAgICBvZ2dfa2V5X2dyYW51bGUob2dnc3RyZWFtLCBncmFudWxlKSkpIHsKQEAgLTI2NSw4ICsyNzAsOCBAQAogCiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0ID0gYXZfcmVzY2FsZV9xKHBhZ2UtPnN0YXJ0X2dyYW51bGUsIHN0LT50aW1lX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RKTsKLSAgICAgICAgICAgIGludDY0X3QgbmV4dCAgPSBhdl9yZXNjYWxlX3EocGFnZS0+Z3JhbnVsZSwgc3QtPnRpbWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfVElNRV9CQVNFX1EpOworICAgICAgICAgICAgaW50NjRfdCBuZXh0ICA9IGF2X3Jlc2NhbGVfcShvZ2dfZ3JhbnVsZV90b190aW1lc3RhbXAob2dnc3RyZWFtLCBwYWdlLT5ncmFudWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOwogCiAgICAgICAgICAgICBpZiAocGFnZS0+c2VnbWVudHNfY291bnQgPT0gMjU1KSB7CiAgICAgICAgICAgICAgICAgb2dnX2J1ZmZlcl9wYWdlKHMsIG9nZ3N0cmVhbSk7CkBAIC0zMTEsMTMgKzMxNiwxMyBAQAogICAgIHJldHVybiBwMDsKIH0KIAotc3RhdGljIGludCBvZ2dfYnVpbGRfZmxhY19oZWFkZXJzKEFWQ29kZWNDb250ZXh0ICphdmN0eCwKK3N0YXRpYyBpbnQgb2dnX2J1aWxkX2ZsYWNfaGVhZGVycyhBVkNvZGVjUGFyYW1ldGVycyAqcGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9HR1N0cmVhbUNvbnRleHQgKm9nZ3N0cmVhbSwgaW50IGJpdGV4YWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm0pCiB7CiAgICAgdWludDhfdCAqcDsKIAotICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPCBGTEFDX1NUUkVBTUlORk9fU0laRSkKKyAgICBpZiAocGFyLT5leHRyYWRhdGFfc2l6ZSA8IEZMQUNfU1RSRUFNSU5GT19TSVpFKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCiAgICAgLy8gZmlyc3QgcGFja2V0OiBTVFJFQU1JTkZPCkBAIC0zMzQsNyArMzM5LDcgQEAKICAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnAsICJmTGFDIiwgNCk7CiAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMHgwMCk7IC8vIHN0cmVhbWluZm8KICAgICBieXRlc3RyZWFtX3B1dF9iZTI0KCZwLCAzNCk7Ci0gICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwLCBhdmN0eC0+ZXh0cmFkYXRhLCBGTEFDX1NUUkVBTUlORk9fU0laRSk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwLCBwYXItPmV4dHJhZGF0YSwgRkxBQ19TVFJFQU1JTkZPX1NJWkUpOwogCiAgICAgLy8gc2Vjb25kIHBhY2tldDogVm9yYmlzQ29tbWVudAogICAgIHAgPSBvZ2dfd3JpdGVfdm9yYmlzY29tbWVudCg0LCBiaXRleGFjdCwgJm9nZ3N0cmVhbS0+aGVhZGVyX2xlblsxXSwgbSwgMCk7CkBAIC0zNDksMTMgKzM1NCwxMyBAQAogCiAjZGVmaW5lIFNQRUVYX0hFQURFUl9TSVpFIDgwCiAKLXN0YXRpYyBpbnQgb2dnX2J1aWxkX3NwZWV4X2hlYWRlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorc3RhdGljIGludCBvZ2dfYnVpbGRfc3BlZXhfaGVhZGVycyhBVkNvZGVjUGFyYW1ldGVycyAqcGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0sIGludCBiaXRleGFjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqbSkKIHsKICAgICB1aW50OF90ICpwOwogCi0gICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IFNQRUVYX0hFQURFUl9TSVpFKQorICAgIGlmIChwYXItPmV4dHJhZGF0YV9zaXplIDwgU1BFRVhfSEVBREVSX1NJWkUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgLy8gZmlyc3QgcGFja2V0OiBTcGVleCBoZWFkZXIKQEAgLTM2NCw3ICszNjksNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIG9nZ3N0cmVhbS0+aGVhZGVyWzBdID0gcDsKICAgICBvZ2dzdHJlYW0tPmhlYWRlcl9sZW5bMF0gPSBTUEVFWF9IRUFERVJfU0laRTsKLSAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnAsIGF2Y3R4LT5leHRyYWRhdGEsIFNQRUVYX0hFQURFUl9TSVpFKTsKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnAsIHBhci0+ZXh0cmFkYXRhLCBTUEVFWF9IRUFERVJfU0laRSk7CiAgICAgQVZfV0wzMigmb2dnc3RyZWFtLT5oZWFkZXJbMF1bNjhdLCAwKTsgIC8vIHNldCBleHRyYV9oZWFkZXJzIHRvIDAKIAogICAgIC8vIHNlY29uZCBwYWNrZXQ6IFZvcmJpc0NvbW1lbnQKQEAgLTM3OCwyMiArMzgzLDIyIEBACiAKICNkZWZpbmUgT1BVU19IRUFERVJfU0laRSAxOQogCi1zdGF0aWMgaW50IG9nZ19idWlsZF9vcHVzX2hlYWRlcnMoQVZDb2RlY0NvbnRleHQgKmF2Y3R4LAorc3RhdGljIGludCBvZ2dfYnVpbGRfb3B1c19oZWFkZXJzKEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtLCBpbnQgYml0ZXhhY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqbSkKIHsKICAgICB1aW50OF90ICpwOwogCi0gICAgaWYgKGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA8IE9QVVNfSEVBREVSX1NJWkUpCisgICAgaWYgKHBhci0+ZXh0cmFkYXRhX3NpemUgPCBPUFVTX0hFQURFUl9TSVpFKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIC8qIGZpcnN0IHBhY2tldDogT3B1cyBoZWFkZXIgKi8KLSAgICBwID0gYXZfbWFsbG9jeihhdmN0eC0+ZXh0cmFkYXRhX3NpemUpOworICAgIHAgPSBhdl9tYWxsb2N6KHBhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgIGlmICghcCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBvZ2dzdHJlYW0tPmhlYWRlclswXSA9IHA7Ci0gICAgb2dnc3RyZWFtLT5oZWFkZXJfbGVuWzBdID0gYXZjdHgtPmV4dHJhZGF0YV9zaXplOwotICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgYXZjdHgtPmV4dHJhZGF0YSwgYXZjdHgtPmV4dHJhZGF0YV9zaXplKTsKKyAgICBvZ2dzdHJlYW0tPmhlYWRlcl9sZW5bMF0gPSBwYXItPmV4dHJhZGF0YV9zaXplOworICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgcGFyLT5leHRyYWRhdGEsIHBhci0+ZXh0cmFkYXRhX3NpemUpOwogCiAgICAgLyogc2Vjb25kIHBhY2tldDogVm9yYmlzQ29tbWVudCAqLwogICAgIHAgPSBvZ2dfd3JpdGVfdm9yYmlzY29tbWVudCg4LCBiaXRleGFjdCwgJm9nZ3N0cmVhbS0+aGVhZGVyX2xlblsxXSwgbSwgMCk7CkBAIC00MDUsNiArNDEwLDU3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgVlA4X0hFQURFUl9TSVpFIDI2CisKK3N0YXRpYyBpbnQgb2dnX2J1aWxkX3ZwOF9oZWFkZXJzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtLCBpbnQgYml0ZXhhY3QpCit7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKKyAgICB1aW50OF90ICpwOworCisgICAgLyogZmlyc3QgcGFja2V0OiBWUDggaGVhZGVyICovCisgICAgcCA9IGF2X21hbGxvY3ooVlA4X0hFQURFUl9TSVpFKTsKKyAgICBpZiAoIXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgb2dnc3RyZWFtLT5oZWFkZXJbMF0gPSBwOworICAgIG9nZ3N0cmVhbS0+aGVhZGVyX2xlblswXSA9IFZQOF9IRUFERVJfU0laRTsKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCAweDRmKTsgLy8gSERSSUQKKyAgICBieXRlc3RyZWFtX3B1dF9idWZmZXIoJnAsICJWUDgwIiwgNCk7IC8vIElkZW50aWZpZXIKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCAxKTsgLy8gSERSVFlQCisgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMSk7IC8vIFZNQUoKKyAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCAwKTsgLy8gVk1JTgorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnAsIHBhci0+d2lkdGgpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnAsIHBhci0+aGVpZ2h0KTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTI0KCZwLCBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtKTsKKyAgICBieXRlc3RyZWFtX3B1dF9iZTI0KCZwLCBwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuKTsKKyAgICBpZiAoc3QtPnJfZnJhbWVfcmF0ZS5udW0gPiAwICYmIHN0LT5yX2ZyYW1lX3JhdGUuZGVuID4gMCkgeworICAgICAgICAvLyBPZ2dWUDggcmVxdWlyZXMgcHRzIHRvIGluY3JlYXNlIGJ5IDEgcGVyIHZpc2libGUgZnJhbWUsIHNvIHVzZSB0aGUgbGVhc3QgY29tbW9uCisgICAgICAgIC8vIG11bHRpcGxlIGZyYW1lcmF0ZSBpZiBhdmFpbGFibGUuCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJDaGFuZ2luZyB0aW1lIGJhc2UgZnJvbSAlZC8lZCB0byAlZC8lZFxuIiwKKyAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UubnVtLCBzdC0+dGltZV9iYXNlLmRlbiwKKyAgICAgICAgICAgICAgIHN0LT5yX2ZyYW1lX3JhdGUuZGVuLCBzdC0+cl9mcmFtZV9yYXRlLm51bSk7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBzdC0+cl9mcmFtZV9yYXRlLmRlbiwgc3QtPnJfZnJhbWVfcmF0ZS5udW0pOworICAgIH0KKyAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCBzdC0+dGltZV9iYXNlLmRlbik7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgc3QtPnRpbWVfYmFzZS5udW0pOworCisgICAgLyogb3B0aW9uYWwgc2Vjb25kIHBhY2tldDogVm9yYmlzQ29tbWVudCAqLworICAgIGlmIChhdl9kaWN0X2dldChzdC0+bWV0YWRhdGEsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSB7CisgICAgICAgIHAgPSBvZ2dfd3JpdGVfdm9yYmlzY29tbWVudCg3LCBiaXRleGFjdCwgJm9nZ3N0cmVhbS0+aGVhZGVyX2xlblsxXSwgJnN0LT5tZXRhZGF0YSwgMCk7CisgICAgICAgIGlmICghcCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG9nZ3N0cmVhbS0+aGVhZGVyWzFdID0gcDsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgMHg0Zik7IC8vIEhEUklECisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J1ZmZlcigmcCwgIlZQODAiLCA0KTsgLy8gSWRlbnRpZmllcgorICAgICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCAyKTsgLy8gSERSVFlQCisgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2J5dGUoJnAsIDB4MjApOworICAgIH0KKworICAgIG9nZ3N0cmVhbS0+aXN2cDggPSAxOworCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIG9nZ193cml0ZV9wYWdlcyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBmbHVzaCkKIHsKICAgICBPR0dDb250ZXh0ICpvZ2cgPSBzLT5wcml2X2RhdGE7CkBAIC00MjcsNyArNDgzLDcgQEAKICAgICBvZ2ctPnBhZ2VfbGlzdCA9IHA7CiB9CiAKLXN0YXRpYyBpbnQgb2dnX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCitzdGF0aWMgaW50IG9nZ19pbml0KEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBPR0dDb250ZXh0ICpvZ2cgPSBzLT5wcml2X2RhdGE7CiAgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtID0gTlVMTDsKQEAgLTQ0MCwyNCArNDk2LDI2IEBACiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgIHVuc2lnbmVkIHNlcmlhbF9udW0gPSBpICsgb2dnLT5zZXJpYWxfb2Zmc2V0OwogCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9PUFVTKQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykKICAgICAgICAgICAgICAgICAvKiBPcHVzIHJlcXVpcmVzIGEgZml4ZWQgNDhrSHogY2xvY2sgKi8KICAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgNDgwMDApOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WT1JCSVMgJiYKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEhFT1JBICYmCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1NQRUVYICAmJgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9GTEFDICAgJiYKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfT1BVUykgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9WT1JCSVMgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVEhFT1JBICYmCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1NQRUVYICAmJgorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9GTEFDICAgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfT1BVUyAgICYmCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1ZQOCkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjIGlkIGluIHN0cmVhbSAlZFxuIiwgaSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSB8fCAhc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICBpZiAoKCFzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSB8fCAhc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSkgJiYKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfVlA4KSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gZXh0cmFkYXRhIHByZXNlbnRcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KQEAgLTQ4MSw4ICs1MzksOCBAQAogICAgICAgICBhdl9kaWN0X2NvcHkoJnN0LT5tZXRhZGF0YSwgcy0+bWV0YWRhdGEsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOwogCiAgICAgICAgIHN0LT5wcml2X2RhdGEgPSBvZ2dzdHJlYW07Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMQUMpIHsKLSAgICAgICAgICAgIGludCBlcnIgPSBvZ2dfYnVpbGRfZmxhY19oZWFkZXJzKHN0LT5jb2RlYywgb2dnc3RyZWFtLAorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFDKSB7CisgICAgICAgICAgICBpbnQgZXJyID0gb2dnX2J1aWxkX2ZsYWNfaGVhZGVycyhzdC0+Y29kZWNwYXIsIG9nZ3N0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZsYWdzICYgQVZGTVRfRkxBR19CSVRFWEFDVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdC0+bWV0YWRhdGEpOwogICAgICAgICAgICAgaWYgKGVycikgewpAQCAtNDkwLDggKzU0OCw4IEBACiAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOwogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9TUEVFWCkgewotICAgICAgICAgICAgaW50IGVyciA9IG9nZ19idWlsZF9zcGVleF9oZWFkZXJzKHN0LT5jb2RlYywgb2dnc3RyZWFtLAorICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVgpIHsKKyAgICAgICAgICAgIGludCBlcnIgPSBvZ2dfYnVpbGRfc3BlZXhfaGVhZGVycyhzdC0+Y29kZWNwYXIsIG9nZ3N0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0LT5tZXRhZGF0YSk7CiAgICAgICAgICAgICBpZiAoZXJyKSB7CkBAIC00OTksOCArNTU3LDggQEAKICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPnByaXZfZGF0YSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMpIHsKLSAgICAgICAgICAgIGludCBlcnIgPSBvZ2dfYnVpbGRfb3B1c19oZWFkZXJzKHN0LT5jb2RlYywgb2dnc3RyZWFtLAorICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykgeworICAgICAgICAgICAgaW50IGVyciA9IG9nZ19idWlsZF9vcHVzX2hlYWRlcnMoc3QtPmNvZGVjcGFyLCBvZ2dzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3QtPm1ldGFkYXRhKTsKICAgICAgICAgICAgIGlmIChlcnIpIHsKQEAgLTUwOCwxNCArNTY2LDIyIEBACiAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOwogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WUDgpIHsKKyAgICAgICAgICAgIGludCBlcnIgPSBvZ2dfYnVpbGRfdnA4X2hlYWRlcnMocywgc3QsIG9nZ3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0JJVEVYQUNUKTsKKyAgICAgICAgICAgIGlmIChlcnIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBWUDggaGVhZGVyc1xuIik7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aW50OF90ICpwOwotICAgICAgICAgICAgY29uc3QgY2hhciAqY3N0ciA9IHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTID8gInZvcmJpcyIgOiAidGhlb3JhIjsKLSAgICAgICAgICAgIGludCBoZWFkZXJfdHlwZSA9IHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTID8gMyA6IDB4ODE7Ci0gICAgICAgICAgICBpbnQgZnJhbWluZ19iaXQgPSBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZPUkJJUyA/IDEgOiAwOworICAgICAgICAgICAgY29uc3QgY2hhciAqY3N0ciA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTID8gInZvcmJpcyIgOiAidGhlb3JhIjsKKyAgICAgICAgICAgIGludCBoZWFkZXJfdHlwZSA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTID8gMyA6IDB4ODE7CisgICAgICAgICAgICBpbnQgZnJhbWluZ19iaXQgPSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZPUkJJUyA/IDEgOiAwOwogCi0gICAgICAgICAgICBpZiAoYXZwcml2X3NwbGl0X3hpcGhfaGVhZGVycyhzdC0+Y29kZWMtPmV4dHJhZGF0YSwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WT1JCSVMgPyAzMCA6IDQyLAorICAgICAgICAgICAgaWYgKGF2cHJpdl9zcGxpdF94aXBoX2hlYWRlcnMoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVk9SQklTID8gMzAgOiA0MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKilvZ2dzdHJlYW0tPmhlYWRlciwgb2dnc3RyZWFtLT5oZWFkZXJfbGVuKSA8IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXh0cmFkYXRhIGNvcnJ1cHRlZFxuIik7CiAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5wcml2X2RhdGEpOwpAQCAtNTMyLDcgKzU5OCwxNSBAQAogICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnl0ZSgmcCwgaGVhZGVyX3R5cGUpOwogICAgICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfYnVmZmVyKCZwLCBjc3RyLCA2KTsKIAotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVEhFT1JBKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9USEVPUkEpIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVuID0gQVZfUkIzMihvZ2dzdHJlYW0tPmhlYWRlclswXSArIDIyKSwgbnVtID0gQVZfUkIzMihvZ2dzdHJlYW0tPmhlYWRlclswXSArIDI2KTsKKyAgICAgICAgICAgICAgICAvKiBNYWtlIHN1cmUgdG8gdXNlIHRpbWUgYmFzZSBzdG9yZWQgaW4gdGhlIFRoZW9yYSBzdHJlYW0gaGVhZGVyIHRvIHdyaXRlCisgICAgICAgICAgICAgICAgICAgY29ycmVjdCB0aW1lc3RhbXBzICovCisgICAgICAgICAgICAgICAgaWYgKHN0LT50aW1lX2Jhc2UubnVtICE9IG51bSB8fCBzdC0+dGltZV9iYXNlLmRlbiAhPSBkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkNoYW5naW5nIHRpbWUgYmFzZSBmcm9tICVkLyVkIHRvICVkLyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZS5udW0sIHN0LT50aW1lX2Jhc2UuZGVuLCBudW0sIGRlbik7CisgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBudW0sIGRlbik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8qKiBLRkdTSElGVCBpcyB0aGUgd2lkdGggb2YgdGhlIGxlc3Mgc2lnbmlmaWNhbnQgc2VjdGlvbiBvZiB0aGUgZ3JhbnVsZSBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICBUaGUgbGVzcyBzaWduaWZpY2FudCBzZWN0aW9uIGlzIHRoZSBmcmFtZSBjb3VudCBzaW5jZSB0aGUgbGFzdCBrZXlmcmFtZSAqLwogICAgICAgICAgICAgICAgIG9nZ3N0cmVhbS0+a2Znc2hpZnQgPSAoKG9nZ3N0cmVhbS0+aGVhZGVyWzBdWzQwXSYzKTw8Myl8KG9nZ3N0cmVhbS0+aGVhZGVyWzBdWzQxXT4+NSk7CkBAIC01NDMsOCArNjE3LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvZ2dfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0gPSBOVUxMOworICAgIGludCBpLCBqOworCiAgICAgZm9yIChqID0gMDsgaiA8IHMtPm5iX3N0cmVhbXM7IGorKykgewotICAgICAgICBPR0dTdHJlYW1Db250ZXh0ICpvZ2dzdHJlYW0gPSBzLT5zdHJlYW1zW2pdLT5wcml2X2RhdGE7CisgICAgICAgIG9nZ3N0cmVhbSA9IHMtPnN0cmVhbXNbal0tPnByaXZfZGF0YTsKICAgICAgICAgb2dnX2J1ZmZlcl9kYXRhKHMsIHMtPnN0cmVhbXNbal0sIG9nZ3N0cmVhbS0+aGVhZGVyWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgb2dnc3RyZWFtLT5oZWFkZXJfbGVuWzBdLCAwLCAxKTsKICAgICAgICAgb2dnc3RyZWFtLT5wYWdlLmZsYWdzIHw9IDI7IC8vIGJvcwpAQCAtNTUyLDcgKzYzNCw3IEBACiAgICAgfQogICAgIGZvciAoaiA9IDA7IGogPCBzLT5uYl9zdHJlYW1zOyBqKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tqXTsKLSAgICAgICAgT0dHU3RyZWFtQ29udGV4dCAqb2dnc3RyZWFtID0gc3QtPnByaXZfZGF0YTsKKyAgICAgICAgb2dnc3RyZWFtID0gc3QtPnByaXZfZGF0YTsKICAgICAgICAgZm9yIChpID0gMTsgaSA8IDM7IGkrKykgewogICAgICAgICAgICAgaWYgKG9nZ3N0cmVhbS0+aGVhZGVyX2xlbltpXSkKICAgICAgICAgICAgICAgICBvZ2dfYnVmZmVyX2RhdGEocywgc3QsIG9nZ3N0cmVhbS0+aGVhZGVyW2ldLApAQCAtNTc1LDcgKzY1Nyw3IEBACiAgICAgaW50IHJldDsKICAgICBpbnQ2NF90IGdyYW51bGU7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9USEVPUkEpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9USEVPUkEpIHsKICAgICAgICAgaW50NjRfdCBwdHMgPSBvZ2dzdHJlYW0tPnZyZXYgPCAxID8gcGt0LT5wdHMgOiBwa3QtPnB0cyArIHBrdC0+ZHVyYXRpb247CiAgICAgICAgIGludCBwZnJhbWVfY291bnQ7CiAgICAgICAgIGlmIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKQpAQCAtNTg3LDEyICs2NjksMjMgQEAKICAgICAgICAgICAgIHBmcmFtZV9jb3VudCA9IDA7CiAgICAgICAgIH0KICAgICAgICAgZ3JhbnVsZSA9IChvZ2dzdHJlYW0tPmxhc3Rfa2ZfcHRzPDxvZ2dzdHJlYW0tPmtmZ3NoaWZ0KSB8IHBmcmFtZV9jb3VudDsKLSAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykKICAgICAgICAgZ3JhbnVsZSA9IHBrdC0+cHRzICsgcGt0LT5kdXJhdGlvbiArCi0gICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3Eoc3QtPmNvZGVjLT5pbml0aWFsX3BhZGRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIH0sCisgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlX3Eoc3QtPmNvZGVjcGFyLT5pbml0aWFsX3BhZGRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpeyAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSk7Ci0gICAgZWxzZQorICAgIGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4KSB7CisgICAgICAgIGludDY0X3QgcHRzLCBpbnZjbnQsIGRpc3Q7CisgICAgICAgIGludCB2aXNpYmxlOworCisgICAgICAgIHZpc2libGUgPSAocGt0LT5kYXRhWzBdID4+IDQpICYgMTsKKyAgICAgICAgcHRzICAgICA9IHBrdC0+cHRzICsgcGt0LT5kdXJhdGlvbjsKKyAgICAgICAgaW52Y250ICA9IChvZ2dzdHJlYW0tPmxhc3RfZ3JhbnVsZSA+PiAzMCkgJiAzOworICAgICAgICBpbnZjbnQgID0gdmlzaWJsZSA/IDMgOiAoaW52Y250ID09IDMgPyAwIDogaW52Y250ICsgMSk7CisgICAgICAgIGRpc3QgICAgPSAocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0tFWSkgPyAwIDogKChvZ2dzdHJlYW0tPmxhc3RfZ3JhbnVsZSA+PiAzKSAmIDB4MDdmZmZmZmYpICsgMTsKKworICAgICAgICBncmFudWxlID0gKHB0cyA8PCAzMikgfCAoaW52Y250IDw8IDMwKSB8IChkaXN0IDw8IDMpOworICAgIH0gZWxzZQogICAgICAgICBncmFudWxlID0gcGt0LT5wdHMgKyBwa3QtPmR1cmF0aW9uOwogCiAgICAgaWYgKG9nZ3N0cmVhbS0+cGFnZS5zdGFydF9ncmFudWxlID09IEFWX05PUFRTX1ZBTFVFKQpAQCAtNjQwLDE4ICs3MzMsMjcgQEAKIAogICAgIG9nZ193cml0ZV9wYWdlcyhzLCAxKTsKIAorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBvZ2dfZnJlZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50IGk7CisKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgIE9HR1N0cmVhbUNvbnRleHQgKm9nZ3N0cmVhbSA9IHN0LT5wcml2X2RhdGE7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMQUMgfHwKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfU1BFRVggfHwKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfT1BVUykgeworICAgICAgICBpZiAoIW9nZ3N0cmVhbSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTEFDIHx8CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NQRUVYIHx8CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX09QVVMgfHwKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA4KSB7CiAgICAgICAgICAgICBhdl9mcmVlcCgmb2dnc3RyZWFtLT5oZWFkZXJbMF0pOwogICAgICAgICB9CiAgICAgICAgIGF2X2ZyZWVwKCZvZ2dzdHJlYW0tPmhlYWRlclsxXSk7CiAgICAgICAgIGF2X2ZyZWVwKCZzdC0+cHJpdl9kYXRhKTsKICAgICB9Ci0gICAgcmV0dXJuIDA7CiB9CiAKICNpZiBDT05GSUdfT0dHX01VWEVSCkBAIC02NjAsNyArNzYyLDEwIEBACiAgICAgLm5hbWUgICAgICAgICAgICAgID0gIm9nZyIsCiAgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIk9nZyIpLAogICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhcHBsaWNhdGlvbi9vZ2ciLAotICAgIC5leHRlbnNpb25zICAgICAgICA9ICJvZ2csb2d2IgorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJvZ2ciCisjaWYgIUNPTkZJR19PR1ZfTVVYRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiLG9ndiIKKyNlbmRpZgogI2lmICFDT05GSUdfU1BYX01VWEVSCiAgICAgICAgICAgICAgICAgICAgICAgICAgIixzcHgiCiAjZW5kaWYKQEAgLTY3MiwxMCArNzc3LDEyIEBACiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQ09ORklHX0xJQlZPUkJJU19FTkNPREVSID8KICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9WT1JCSVMgOiBBVl9DT0RFQ19JRF9GTEFDLAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1RIRU9SQSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSBvZ2dfaW5pdCwKICAgICAud3JpdGVfaGVhZGVyICAgICAgPSBvZ2dfd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG9nZ193cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgICAgID0gb2dnX3dyaXRlX3RyYWlsZXIsCi0gICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfVFNfTkVHQVRJVkUgfCBBVkZNVF9BTExPV19GTFVTSCwKKyAgICAuZGVpbml0ICAgICAgICAgICAgPSBvZ2dfZnJlZSwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19ORUdBVElWRSB8IEFWRk1UX1RTX05PTlNUUklDVCB8IEFWRk1UX0FMTE9XX0ZMVVNILAogICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZvZ2dfbXV4ZXJfY2xhc3MsCiB9OwogI2VuZGlmCkBAIC02ODgsMTYgKzc5NSwzOSBAQAogICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby9vZ2ciLAogICAgIC5leHRlbnNpb25zICAgICAgICA9ICJvZ2EiLAogICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihPR0dDb250ZXh0KSwKLSAgICAuYXVkaW9fY29kZWMgICAgICAgPSBDT05GSUdfTElCVk9SQklTX0VOQ09ERVIgPwotICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NPREVDX0lEX1ZPUkJJUyA6IEFWX0NPREVDX0lEX0ZMQUMsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfRkxBQywKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSBvZ2dfaW5pdCwKICAgICAud3JpdGVfaGVhZGVyICAgICAgPSBvZ2dfd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG9nZ193cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgICAgID0gb2dnX3dyaXRlX3RyYWlsZXIsCisgICAgLmRlaW5pdCAgICAgICAgICAgID0gb2dnX2ZyZWUsCiAgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfVFNfTkVHQVRJVkUgfCBBVkZNVF9BTExPV19GTFVTSCwKICAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmb2dhX211eGVyX2NsYXNzLAogfTsKICNlbmRpZgogCisjaWYgQ09ORklHX09HVl9NVVhFUgorT0dHX0NMQVNTKG9ndiwgT2dnIHZpZGVvKQorQVZPdXRwdXRGb3JtYXQgZmZfb2d2X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJvZ3YiLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJPZ2cgVmlkZW8iKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAidmlkZW8vb2dnIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAib2d2IiwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoT0dHQ29udGV4dCksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQ09ORklHX0xJQlZPUkJJU19FTkNPREVSID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DT0RFQ19JRF9WT1JCSVMgOiBBVl9DT0RFQ19JRF9GTEFDLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IENPTkZJR19MSUJUSEVPUkFfRU5DT0RFUiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ09ERUNfSURfVEhFT1JBIDogQVZfQ09ERUNfSURfVlA4LAorICAgIC5pbml0ICAgICAgICAgICAgICA9IG9nZ19pbml0LAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG9nZ193cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gb2dnX3dyaXRlX3BhY2tldCwKKyAgICAud3JpdGVfdHJhaWxlciAgICAgPSBvZ2dfd3JpdGVfdHJhaWxlciwKKyAgICAuZGVpbml0ICAgICAgICAgICAgPSBvZ2dfZnJlZSwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19ORUdBVElWRSB8IEFWRk1UX1RTX05PTlNUUklDVCB8IEFWRk1UX0FMTE9XX0ZMVVNILAorICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZvZ3ZfbXV4ZXJfY2xhc3MsCit9OworI2VuZGlmCisKICNpZiBDT05GSUdfU1BYX01VWEVSCiBPR0dfQ0xBU1Moc3B4LCBPZ2cgU3BlZXgpCiBBVk91dHB1dEZvcm1hdCBmZl9zcHhfbXV4ZXIgPSB7CkBAIC03MDcsOSArODM3LDExIEBACiAgICAgLmV4dGVuc2lvbnMgICAgICAgID0gInNweCIsCiAgICAgLnByaXZfZGF0YV9zaXplICAgID0gc2l6ZW9mKE9HR0NvbnRleHQpLAogICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1NQRUVYLAorICAgIC5pbml0ICAgICAgICAgICAgICA9IG9nZ19pbml0LAogICAgIC53cml0ZV9oZWFkZXIgICAgICA9IG9nZ193cml0ZV9oZWFkZXIsCiAgICAgLndyaXRlX3BhY2tldCAgICAgID0gb2dnX3dyaXRlX3BhY2tldCwKICAgICAud3JpdGVfdHJhaWxlciAgICAgPSBvZ2dfd3JpdGVfdHJhaWxlciwKKyAgICAuZGVpbml0ICAgICAgICAgICAgPSBvZ2dfZnJlZSwKICAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9UU19ORUdBVElWRSB8IEFWRk1UX0FMTE9XX0ZMVVNILAogICAgIC5wcml2X2NsYXNzICAgICAgICA9ICZzcHhfbXV4ZXJfY2xhc3MsCiB9OwpAQCAtNzI0LDkgKzg1NiwxMSBAQAogICAgIC5leHRlbnNpb25zICAgICAgICA9ICJvcHVzIiwKICAgICAucHJpdl9kYXRhX3NpemUgICAgPSBzaXplb2YoT0dHQ29udGV4dCksCiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfT1BVUywKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSBvZ2dfaW5pdCwKICAgICAud3JpdGVfaGVhZGVyICAgICAgPSBvZ2dfd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICAgICA9IG9nZ193cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgICAgID0gb2dnX3dyaXRlX3RyYWlsZXIsCisgICAgLmRlaW5pdCAgICAgICAgICAgID0gb2dnX2ZyZWUsCiAgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfVFNfTkVHQVRJVkUgfCBBVkZNVF9BTExPV19GTFVTSCwKICAgICAucHJpdl9jbGFzcyAgICAgICAgPSAmb3B1c19tdXhlcl9jbGFzcywKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9vZ2dwYXJzZWNlbHQuYyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlY2VsdC5jCmluZGV4IDJjMGM1MTEuLjljNDM4YTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29nZ3BhcnNlY2VsdC5jCisrKyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlY2VsdC5jCkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIHByaXYgPSBhdl9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBvZ2djZWx0X3ByaXZhdGUpKTsKICAgICAgICAgaWYgKCFwcml2KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDIgKiBzaXplb2YodWludDMyX3QpKSA8IDApIHsKKyAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIDIgKiBzaXplb2YodWludDMyX3QpKSA8IDApIHsKICAgICAgICAgICAgIGF2X2ZyZWUocHJpdik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9CkBAIC01OSwxNyArNTksMjIgQEAKICAgICAgICAgb3ZlcmxhcCAgICAgICAgICA9IEFWX1JMMzIocCArIDQ4KTsKICAgICAgICAgLyogdW51c2VkIGJ5dGVzIHBlciBwYWNrZXQgZmllbGQgc2tpcHBlZCAqLwogICAgICAgICBleHRyYV9oZWFkZXJzICAgID0gQVZfUkwzMihwICsgNTYpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgID0gQVZfQ09ERUNfSURfQ0VMVDsKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICA9IHNhbXBsZV9yYXRlOwotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gbmJfY2hhbm5lbHM7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9DRUxUOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgID0gc2FtcGxlX3JhdGU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSBuYl9jaGFubmVsczsKICAgICAgICAgaWYgKHNhbXBsZV9yYXRlKQogICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNhbXBsZV9yYXRlKTsKLSAgICAgICAgcHJpdi0+ZXh0cmFfaGVhZGVyc19sZWZ0ICA9IDEgKyBleHRyYV9oZWFkZXJzOwotICAgICAgICBhdl9mcmVlKG9zLT5wcml2YXRlKTsKKworICAgICAgICBpZiAob3MtPnByaXZhdGUpIHsKKyAgICAgICAgICAgIGF2X2ZyZWUocHJpdik7CisgICAgICAgICAgICBwcml2ID0gb3MtPnByaXZhdGU7CisgICAgICAgIH0KICAgICAgICAgb3MtPnByaXZhdGUgPSBwcml2OwotICAgICAgICBBVl9XTDMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMCwgb3ZlcmxhcCk7Ci0gICAgICAgIEFWX1dMMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA0LCB2ZXJzaW9uKTsKKyAgICAgICAgcHJpdi0+ZXh0cmFfaGVhZGVyc19sZWZ0ICA9IDEgKyBleHRyYV9oZWFkZXJzOworCisgICAgICAgIEFWX1dMMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAwLCBvdmVybGFwKTsKKyAgICAgICAgQVZfV0wzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDQsIHZlcnNpb24pOwogICAgICAgICByZXR1cm4gMTsKICAgICB9IGVsc2UgaWYgKHByaXYgJiYgcHJpdi0+ZXh0cmFfaGVhZGVyc19sZWZ0KSB7CiAgICAgICAgIC8qIEV4dHJhIGhlYWRlcnMgKHZvcmJpc2NvbW1lbnQpICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9vZ2dwYXJzZWRhYWxhLmMgYi9saWJhdmZvcm1hdC9vZ2dwYXJzZWRhYWxhLmMKaW5kZXggMzY1MWNhMS4uZTk0NDQ3MCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb2dncGFyc2VkYWFsYS5jCisrKyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlZGFhbGEuYwpAQCAtODQsNyArODQsNyBAQAogICAgIHN0cnVjdCBvZ2cgKm9nZyAgICAgICAgPSBzLT5wcml2X2RhdGE7CiAgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zICA9IG9nZy0+c3RyZWFtcyArIGlkeDsKICAgICBBVlN0cmVhbSAqc3QgICAgICAgICAgID0gcy0+c3RyZWFtc1tpZHhdOwotICAgIGludCBjZHMgICAgICAgICAgICAgICAgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICsgb3MtPnBzaXplICsgMjsKKyAgICBpbnQgY2RzICAgICAgICAgICAgICAgID0gc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSArIG9zLT5wc2l6ZSArIDI7CiAgICAgRGFhbGFJbmZvSGVhZGVyICpoZHIgICA9IG9zLT5wcml2YXRlOwogCiAgICAgaWYgKCEob3MtPmJ1Zltvcy0+cHN0YXJ0XSAmIDB4ODApKQpAQCAtMTA2LDggKzEwNiw4IEBACiAgICAgICAgIGhkci0+dmVyc2lvbl9taW4gPSBieXRlc3RyZWFtMl9nZXRfYnl0ZSgmZ2IpOwogICAgICAgICBoZHItPnZlcnNpb25fc3ViID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoJmdiKTsKIAotICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9IGJ5dGVzdHJlYW0yX2dldF9uZTMyKCZnYik7Ci0gICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gYnl0ZXN0cmVhbTJfZ2V0X25lMzIoJmdiKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSBieXRlc3RyZWFtMl9nZXRfbmUzMigmZ2IpOworICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9uZTMyKCZnYik7CiAKICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtID0gYnl0ZXN0cmVhbTJfZ2V0X25lMzIoJmdiKTsKICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8uZGVuID0gYnl0ZXN0cmVhbTJfZ2V0X25lMzIoJmdiKTsKQEAgLTEyNiw2ICsxMjYsNyBAQAogICAgICAgICBpZiAoaGRyLT5ncHNoaWZ0ID49IDMyKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVG9vIGxhcmdlIGdwc2hpZnQgJWQgKD49IDMyKS5cbiIsCiAgICAgICAgICAgICAgICAgICAgaGRyLT5ncHNoaWZ0KTsKKyAgICAgICAgICAgIGhkci0+Z3BzaGlmdCA9IDA7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogICAgICAgICBoZHItPmdwbWFzayAgPSAoMVUgPDwgaGRyLT5ncHNoaWZ0KSAtIDE7CkBAIC0xNDYsMTMgKzE0NywxMyBAQAogICAgICAgICAgICAgaGRyLT5mb3JtYXQueWRlY1tpXSA9IGJ5dGVzdHJlYW0yX2dldF9ieXRlKCZnYik7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoKHN0LT5jb2RlYy0+cGl4X2ZtdCA9IGRhYWxhX21hdGNoX3BpeF9mbXQoJmhkci0+Zm9ybWF0KSkgPCAwKQorICAgICAgICBpZiAoKHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID0gZGFhbGFfbWF0Y2hfcGl4X2ZtdCgmaGRyLT5mb3JtYXQpKSA8IDApCiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0IC0gJWkgJWlcbiIsCiAgICAgICAgICAgICAgICAgICAgaGRyLT5mb3JtYXQuZGVwdGgsIGhkci0+Zm9ybWF0LnBsYW5lcyk7CiAKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfREFBTEE7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfREFBTEE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgICAgID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKIAogICAgICAgICBoZHItPmluaXRfZCA9IDE7CiAgICAgICAgIGJyZWFrOwpAQCAtMTczLDE4ICsxNzQsMTggQEAKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEsCisgICAgaWYgKChlcnIgPSBhdl9yZWFsbG9jcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZHMgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSkgPCAwKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gMDsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBtZW1zZXQoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyBjZHMsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGNkcCAgICA9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZTsKKyAgICBtZW1zZXQoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyBjZHMsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGNkcCAgICA9IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZTsKICAgICAqY2RwKysgPSBvcy0+cHNpemUgPj4gODsKICAgICAqY2RwKysgPSBvcy0+cHNpemUgJiAweGZmOwogICAgIG1lbWNweShjZHAsIG9zLT5idWYgKyBvcy0+cHN0YXJ0LCBvcy0+cHNpemUpOwotICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSBjZHM7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IGNkczsKIAogICAgIHJldHVybiAxOwogfQpAQCAtMjE3LDYgKzIxOCw3IEBACiAgICAgaW50IHNlZywgZHVyYXRpb24gPSAxOwogICAgIHN0cnVjdCBvZ2cgKm9nZyA9IHMtPnByaXZfZGF0YTsKICAgICBzdHJ1Y3Qgb2dnX3N0cmVhbSAqb3MgPSBvZ2ctPnN0cmVhbXMgKyBpZHg7CisgICAgaW50NjRfdCBwdHM7CiAKICAgICAvKgogICAgICAqIGZpcnN0IHBhY2tldCBoYW5kbGluZzogaGVyZSB3ZSBwYXJzZSB0aGUgZHVyYXRpb24gb2YgZWFjaCBwYWNrZXQgaW4gdGhlCkBAIC0yMjksMTAgKzIzMSwxMyBAQAogICAgICAgICAgICAgaWYgKG9zLT5zZWdtZW50c1tzZWddIDwgMjU1KQogICAgICAgICAgICAgICAgIGR1cmF0aW9uKys7CiAKLSAgICAgICAgb3MtPmxhc3RwdHMgPSBvcy0+bGFzdGR0cyA9IGRhYWxhX2dwdG9wdHMocywgaWR4LCBvcy0+Z3JhbnVsZSwgTlVMTCkgLSBkdXJhdGlvbjsKKyAgICAgICAgcHRzID0gZGFhbGFfZ3B0b3B0cyhzLCBpZHgsIG9zLT5ncmFudWxlLCBOVUxMKTsKKyAgICAgICAgaWYgKHB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHB0cyAtPSBkdXJhdGlvbjsKKyAgICAgICAgb3MtPmxhc3RwdHMgPSBvcy0+bGFzdGR0cyA9IHB0czsKICAgICAgICAgaWYocy0+c3RyZWFtc1tpZHhdLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSB7CiAgICAgICAgICAgICBzLT5zdHJlYW1zW2lkeF0tPnN0YXJ0X3RpbWUgPSBvcy0+bGFzdHB0czsKLSAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2lkeF0tPmR1cmF0aW9uKQorICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaWR4XS0+ZHVyYXRpb24gIT0gQVZfTk9QVFNfVkFMVUUpCiAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tpZHhdLT5kdXJhdGlvbiAtPSBzLT5zdHJlYW1zW2lkeF0tPnN0YXJ0X3RpbWU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9vZ2dwYXJzZWRpcmFjLmMgYi9saWJhdmZvcm1hdC9vZ2dwYXJzZWRpcmFjLmMKaW5kZXggM2U1ZTM5My4uNzRiOWJhNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb2dncGFyc2VkaXJhYy5jCisrKyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlZGlyYWMuYwpAQCAtMzQsMzUgKzM0LDM1IEBACiAgICAgaW50IHJldDsKIAogICAgIC8vIGFscmVhZHkgcGFyc2VkIHRoZSBoZWFkZXIKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ESVJBQykKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9ESVJBQykKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICByZXQgPSBhdl9kaXJhY19wYXJzZV9zZXF1ZW5jZV9oZWFkZXIoJmRzaCwgb3MtPmJ1ZiArIG9zLT5wc3RhcnQgKyAxMywgKG9zLT5wc2l6ZSAtIDEzKSwgcyk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgICA9IEFWX0NPREVDX0lEX0RJUkFDOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICAgICAgID0gZHNoLT53aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgICAgICA9IGRzaC0+aGVpZ2h0OwotICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCAgICAgICAgID0gZHNoLT5waXhfZm10OwotICAgIHN0LT5jb2RlYy0+Y29sb3JfcmFuZ2UgICAgID0gZHNoLT5jb2xvcl9yYW5nZTsKLSAgICBzdC0+Y29kZWMtPmNvbG9yX3RyYyAgICAgICA9IGRzaC0+Y29sb3JfdHJjOwotICAgIHN0LT5jb2RlYy0+Y29sb3JfcHJpbWFyaWVzID0gZHNoLT5jb2xvcl9wcmltYXJpZXM7Ci0gICAgc3QtPmNvZGVjLT5jb2xvcnNwYWNlICAgICAgPSBkc2gtPmNvbG9yc3BhY2U7Ci0gICAgc3QtPmNvZGVjLT5wcm9maWxlICAgICAgICAgPSBkc2gtPnByb2ZpbGU7Ci0gICAgc3QtPmNvZGVjLT5sZXZlbCAgICAgICAgICAgPSBkc2gtPmxldmVsOwotICAgIGlmIChhdl9pbWFnZV9jaGVja19zYXIoc3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHQsIGRzaC0+c2FtcGxlX2FzcGVjdF9yYXRpbykgPj0gMCkKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgICA9IEFWX0NPREVDX0lEX0RJUkFDOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICAgICAgID0gZHNoLT53aWR0aDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgICAgICA9IGRzaC0+aGVpZ2h0OworICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICAgICAgID0gZHNoLT5waXhfZm10OworICAgIHN0LT5jb2RlY3Bhci0+Y29sb3JfcmFuZ2UgICAgID0gZHNoLT5jb2xvcl9yYW5nZTsKKyAgICBzdC0+Y29kZWNwYXItPmNvbG9yX3RyYyAgICAgICA9IGRzaC0+Y29sb3JfdHJjOworICAgIHN0LT5jb2RlY3Bhci0+Y29sb3JfcHJpbWFyaWVzID0gZHNoLT5jb2xvcl9wcmltYXJpZXM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2xvcl9zcGFjZSAgICAgPSBkc2gtPmNvbG9yc3BhY2U7CisgICAgc3QtPmNvZGVjcGFyLT5wcm9maWxlICAgICAgICAgPSBkc2gtPnByb2ZpbGU7CisgICAgc3QtPmNvZGVjcGFyLT5sZXZlbCAgICAgICAgICAgPSBkc2gtPmxldmVsOworICAgIGlmIChhdl9pbWFnZV9jaGVja19zYXIoc3QtPmNvZGVjcGFyLT53aWR0aCwgc3QtPmNvZGVjcGFyLT5oZWlnaHQsIGRzaC0+c2FtcGxlX2FzcGVjdF9yYXRpbykgPj0gMCkKICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBkc2gtPnNhbXBsZV9hc3BlY3RfcmF0aW87CiAKLSAgICAvLyBkaXJhYyBpbiBvZ2cgYWx3YXlzIHN0b3JlcyB0aW1lc3RhbXBzIGFzIHRob3VnaCB0aGUgdmlkZW8gd2VyZSBpbnRlcmxhY2VkCisgICAgLy8gRGlyYWMgaW4gT2dnIGFsd2F5cyBzdG9yZXMgdGltZXN0YW1wcyBhcyB0aG91Z2ggdGhlIHZpZGVvIHdlcmUgaW50ZXJsYWNlZAogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBkc2gtPmZyYW1lcmF0ZS5kZW4sIDIgKiBkc2gtPmZyYW1lcmF0ZS5udW0pOwogCiAgICAgYXZfZnJlZXAoJmRzaCk7CiAgICAgcmV0dXJuIDE7CiB9CiAKLS8vIHZhcmlvdXMgdW5kb2N1bWVudCB0aGluZ3M6IGdyYW51bGUgaXMgc2lnbmVkIChvbmx5IGZvciBkaXJhYyEpCisvLyB2YXJpb3VzIHVuZG9jdW1lbnRlZCB0aGluZ3M6IGdyYW51bGUgaXMgc2lnbmVkIChvbmx5IGZvciBEaXJhYyEpCiBzdGF0aWMgdWludDY0X3QgZGlyYWNfZ3B0b3B0cyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBpZHgsIHVpbnQ2NF90IGdyYW51bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpkdHNfb3V0KQogewpAQCAtOTMsOCArOTMsOCBAQAogICAgIGlmIChidWZbMF0gIT0gJ0snKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRElSQUM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9ESVJBQzsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgQVZfUkIzMihidWYrMTIpLCBBVl9SQjMyKGJ1Zis4KSk7CiAgICAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9vZ2dwYXJzZWZsYWMuYyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlZmxhYy5jCmluZGV4IGM3ZmI0NDYuLmI1ZjE0MTYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29nZ3BhcnNlZmxhYy5jCisrKyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlZmxhYy5jCkBAIC01NywxNSArNTcsMTUgQEAKICAgICAgICAgaWYgKGdldF9iaXRzX2xvbmcoJmdiLCAzMikgIT0gRkxBQ19TVFJFQU1JTkZPX1NJWkUpCiAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxBQzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRkxBQzsKICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7CiAKLSAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIEZMQUNfU1RSRUFNSU5GT19TSVpFKSA8IDApCisgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBGTEFDX1NUUkVBTUlORk9fU0laRSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBzdHJlYW1pbmZvX3N0YXJ0LCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBzdHJlYW1pbmZvX3N0YXJ0LCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKTsKIAotICAgICAgICBzYW1wbGVyYXRlID0gQVZfUkIyNChzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDEwKSA+PiA0OworICAgICAgICBzYW1wbGVyYXRlID0gQVZfUkIyNChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDEwKSA+PiA0OwogICAgICAgICBpZiAoIXNhbXBsZXJhdGUpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIApAQCAtODQsMjggKzg0LDQ1IEBACiAgICAgQVZTdHJlYW0gKnN0ID0gcy0+c3RyZWFtc1tpZHhdOwogICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKICAgICBBVkNvZGVjUGFyc2VyQ29udGV4dCAqcGFyc2VyID0gYXZfcGFyc2VyX2luaXQoQVZfQ09ERUNfSURfRkxBQyk7Ci0gICAgaW50IHNpemU7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4OworICAgIGludCBzaXplLCByZXQ7CiAgICAgdWludDhfdCAqZGF0YTsKIAogICAgIGlmICghcGFyc2VyKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0ZMQUM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9GTEFDOworCisgICAgYXZjdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworICAgIGlmICghYXZjdHgpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoYXZjdHgsIHN0LT5jb2RlY3Bhcik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKIAogICAgIHBhcnNlci0+ZmxhZ3MgPSBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVM7Ci0gICAgYXZfcGFyc2VyX3BhcnNlMihwYXJzZXIsIHN0LT5jb2RlYywKKyAgICBhdl9wYXJzZXJfcGFyc2UyKHBhcnNlciwgYXZjdHgsCiAgICAgICAgICAgICAgICAgICAgICAmZGF0YSwgJnNpemUsIG9zLT5idWYgKyBvcy0+cHN0YXJ0LCBvcy0+cHNpemUsCiAgICAgICAgICAgICAgICAgICAgICBBVl9OT1BUU19WQUxVRSwgQVZfTk9QVFNfVkFMVUUsIC0xKTsKIAogICAgIGF2X3BhcnNlcl9jbG9zZShwYXJzZXIpOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpIHsKLSAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGlmIChhdmN0eC0+c2FtcGxlX3JhdGUpIHsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGF2Y3R4LT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdmN0eCk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdmN0eCk7CiAgICAgcmV0dXJuIDE7CitmYWlsOgorICAgIGF2X3BhcnNlcl9jbG9zZShwYXJzZXIpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZhdmN0eCk7CisgICAgcmV0dXJuIHJldDsKIH0KIAogY29uc3Qgc3RydWN0IG9nZ19jb2RlYyBmZl9mbGFjX2NvZGVjID0gewpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvb2dncGFyc2VvZ20uYyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlb2dtLmMKaW5kZXggZDYzYzgzYi4uYTA3NDUzNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb2dncGFyc2VvZ20uYworKysgYi9saWJhdmZvcm1hdC9vZ2dwYXJzZW9nbS5jCkBAIC0yMywxMCArMjMsMTEgQEAKICoqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorCiAjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCisKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAib2dnZGVjLmgiCkBAIC01MiwyOCArNTMsMjggQEAKIAogICAgICAgICBpZiAoYnl0ZXN0cmVhbTJfcGVla19ieXRlKCZwKSA9PSAndicpewogICAgICAgICAgICAgaW50IHRhZzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnAsIDgpOwogICAgICAgICAgICAgdGFnID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnApOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgdGFnKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gdGFnOwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzQpCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLCB0YWcpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSB0YWc7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHNCkKICAgICAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKICAgICAgICAgfSBlbHNlIGlmIChieXRlc3RyZWFtMl9wZWVrX2J5dGUoJnApID09ICd0JykgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RFWFQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfVEVYVDsKICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnAsIDEyKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYWNpZFs1XSA9IHsgMCB9OwogICAgICAgICAgICAgaW50IGNpZDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnAsIDgpOwogICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcCwgYWNpZCwgNCk7CiAgICAgICAgICAgICBhY2lkWzRdID0gMDsKICAgICAgICAgICAgIGNpZCA9IHN0cnRvbChhY2lkLCBOVUxMLCAxNik7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX3dhdl90YWdzLCBjaWQpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY193YXZfdGFncywgY2lkKTsKICAgICAgICAgICAgIC8vIG91ciBwYXJzZXIgY29tcGxldGVseSBicmVha3MgQUFDIGluIE9nZwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUFDKQorICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQUFDKQogICAgICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwogICAgICAgICB9CiAKQEAgLTg5LDI1ICs5MCwyOCBAQAogICAgICAgICBieXRlc3RyZWFtMl9za2lwKCZwLCA0KTsgICAgLyogZGVmYXVsdF9sZW4gKi8KICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcCgmcCwgOCk7ICAgIC8qIGJ1ZmZlcnNpemUgKyBiaXRzX3Blcl9zYW1wbGUgKi8KIAotICAgICAgICBpZihzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKXsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcCk7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZwKTsKKyAgICAgICAgaWYoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyl7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJnApOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmcCk7CiAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgdGltZV91bml0LCBzcHUgKiAxMDAwMDAwMCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMTYoJnApOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IGJ5dGVzdHJlYW0yX2dldF9sZTE2KCZwKTsKICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnAsIDIpOyAvKiBibG9ja19hbGlnbiAqLwotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZwKSAqIDg7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc3B1ICogMTAwMDAwMDAgLyB0aW1lX3VuaXQ7Ci0gICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+PSA1NiAmJiBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IGJ5dGVzdHJlYW0yX2dldF9sZTMyKCZwKSAqIDg7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gc3B1ICogMTAwMDAwMDAgLyB0aW1lX3VuaXQ7CisgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA+PSA1NiAmJiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgewogICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoJnAsIDQpOwogICAgICAgICAgICAgICAgIHNpemUgLT0gNDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChzaXplID4gNTIpIHsKLSAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgPD0gNTIpOwogICAgICAgICAgICAgICAgIHNpemUgLT0gNTI7Ci0gICAgICAgICAgICAgICAgZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcCwgc3QtPmNvZGVjLT5leHRyYWRhdGEsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdCgmcCkgPCBzaXplKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBzaXplKSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfZ2V0X2J1ZmZlcigmcCwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChieXRlc3RyZWFtMl9wZWVrX2J5dGUoJnApID09IDMpIHsKQEAgLTE0MSwyMCArMTQ1LDIwIEBACiAgICAgICAgIGlmIChvcy0+cHNpemUgPCAxODQpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIEFWX1JMMzIocCArIDY4KSk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19ibXBfdGFncywgQVZfUkwzMihwICsgNjgpKTsKICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIEFWX1JMNjQocCArIDE2NCksIDEwMDAwMDAwKTsKLSAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IEFWX1JMMzIocCArIDE3Nik7Ci0gICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gQVZfUkwzMihwICsgMTgwKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IEFWX1JMMzIocCArIDE3Nik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gQVZfUkwzMihwICsgMTgwKTsKICAgICB9IGVsc2UgaWYodCA9PSAweDA1NTg5ZjgxKXsKICAgICAgICAgaWYgKG9zLT5wc2l6ZSA8IDEzNikKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY193YXZfdGFncywgQVZfUkwxNihwICsgMTI0KSk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBBVl9STDE2KHAgKyAxMjYpOwotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gQVZfUkwzMihwICsgMTI4KTsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IEFWX1JMMzIocCArIDEzMikgKiA4OworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfd2F2X3RhZ3MsIEFWX1JMMTYocCArIDEyNCkpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gQVZfUkwxNihwICsgMTI2KTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IEFWX1JMMzIocCArIDEyOCk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBBVl9STDMyKHAgKyAxMzIpICogODsKICAgICB9CiAKICAgICByZXR1cm4gMTsKQEAgLTE3MiwxMSArMTc2LDE0IEBACiAgICAgICAgIG9zLT5wZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwogCiAgICAgbGIgPSAoKCpwICYgMikgPDwgMSkgfCAoKCpwID4+IDYpICYgMyk7CisgICAgaWYgKG9zLT5wc2l6ZSA8IGxiICsgMSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKICAgICBvcy0+cHN0YXJ0ICs9IGxiICsgMTsKICAgICBvcy0+cHNpemUgLT0gbGIgKyAxOwogCiAgICAgd2hpbGUgKGxiLS0pCi0gICAgICAgIG9zLT5wZHVyYXRpb24gKz0gcFtsYisxXSA8PCAobGIqOCk7CisgICAgICAgIG9zLT5wZHVyYXRpb24gKz0gKHVpbnQ2NF90KXBbbGIrMV0gPDwgKGxiKjgpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9vZ2dwYXJzZW9wdXMuYyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlb3B1cy5jCmluZGV4IGM4YjAyZmEuLmNkMzRjZjIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29nZ3BhcnNlb3B1cy5jCisrKyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNlb3B1cy5jCkBAIC01MiwyNCArNTIsMjUgQEAKICAgICBpZiAob3MtPmZsYWdzICYgT0dHX0ZMQUdfQk9TKSB7CiAgICAgICAgIGlmIChvcy0+cHNpemUgPCBPUFVTX0hFQURfU0laRSB8fCAoQVZfUkw4KHBhY2tldCArIDgpICYgMHhGMCkgIT0gMCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX09QVVM7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICA9IEFWX1JMOCAocGFja2V0ICsgOSk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfT1BVUzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgID0gQVZfUkw4KHBhY2tldCArIDkpOworCiAgICAgICAgIHByaXYtPnByZV9za2lwICAgICAgICA9IEFWX1JMMTYocGFja2V0ICsgMTApOwotICAgICAgICBzdC0+Y29kZWMtPmRlbGF5ICAgICAgPSBwcml2LT5wcmVfc2tpcDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5pbml0aWFsX3BhZGRpbmcgPSBwcml2LT5wcmVfc2tpcDsKICAgICAgICAgLypvcmlnX3NhbXBsZV9yYXRlICAgID0gQVZfUkwzMihwYWNrZXQgKyAxMik7Ki8KICAgICAgICAgLypnYWluICAgICAgICAgICAgICAgID0gQVZfUkwxNihwYWNrZXQgKyAxNik7Ki8KICAgICAgICAgLypjaGFubmVsX21hcCAgICAgICAgID0gQVZfUkw4IChwYWNrZXQgKyAxOCk7Ki8KIAotICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgb3MtPnBzaXplKSkKKyAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIG9zLT5wc2l6ZSkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgcGFja2V0LCBvcy0+cHNpemUpOworICAgICAgICBtZW1jcHkoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHBhY2tldCwgb3MtPnBzaXplKTsKIAotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gNDgwMDA7Ci0gICAgICAgIGF2X2NvZGVjX3NldF9zZWVrX3ByZXJvbGwoc3QtPmNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGUoT1BVU19TRUVLX1BSRVJPTExfTVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlLCAxMDAwKSk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zZWVrX3ByZXJvbGwgPSBhdl9yZXNjYWxlKE9QVVNfU0VFS19QUkVST0xMX01TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSwgMTAwMCk7CiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCA0ODAwMCk7CiAgICAgICAgIHByaXYtPm5lZWRfY29tbWVudHMgPSAxOwogICAgICAgICByZXR1cm4gMTsKQEAgLTExNyw2ICsxMTgsMTAgQEAKIAogICAgIGlmICghb3MtPnBzaXplKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAob3MtPmdyYW51bGUgPiAoMUxMIDw8IDYyKSkgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBodWdlIGdyYW51bGUgcG9zICUiUFJJZDY0ICJcbiIsIG9zLT5ncmFudWxlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQogCiAgICAgaWYgKCghb3MtPmxhc3RwdHMgfHwgb3MtPmxhc3RwdHMgPT0gQVZfTk9QVFNfVkFMVUUpICYmICEob3MtPmZsYWdzICYgT0dHX0ZMQUdfRU9TKSkgewogICAgICAgICBpbnQgc2VnLCBkOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvb2dncGFyc2Vza2VsZXRvbi5jIGIvbGliYXZmb3JtYXQvb2dncGFyc2Vza2VsZXRvbi5jCmluZGV4IDZjMjEwNWYuLjUzMmZhNmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29nZ3BhcnNlc2tlbGV0b24uYworKysgYi9saWJhdmZvcm1hdC9vZ2dwYXJzZXNrZWxldG9uLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAgICB1aW50NjRfdCBzdGFydF9ncmFudWxlOwogICAgIGludCB0YXJnZXRfaWR4LCBzdGFydF90aW1lOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CiAKICAgICBpZiAoKG9zLT5mbGFncyAmIE9HR19GTEFHX0VPUykgJiYgb3MtPnBzaXplID09IDApCiAgICAgICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvb2dncGFyc2VzcGVleC5jIGIvbGliYXZmb3JtYXQvb2dncGFyc2VzcGVleC5jCmluZGV4IGM4NmIxMjcuLjI3ZmM5OTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29nZ3BhcnNlc3BlZXguYworKysgYi9saWJhdmZvcm1hdC9vZ2dwYXJzZXNwZWV4LmMKQEAgLTIzLDExICsyMywxMyBAQAogKiovCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KKwogI2luY2x1ZGUgImxpYmF2dXRpbC9ic3dhcC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgotI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgIm9nZ2RlYy5oIgpAQCAtNTcsMzMgKzU5LDQ0IEBACiAKICAgICBpZiAoc3B4cC0+c2VxID09IDApIHsKICAgICAgICAgaW50IGZyYW1lc19wZXJfcGFja2V0OwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TUEVFWDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfU1BFRVg7CiAKICAgICAgICAgaWYgKG9zLT5wc2l6ZSA8IDY4KSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAic3BlZXggcGFja2V0IHRvbyBzbWFsbFxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogCi0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBBVl9STDMyKHAgKyAzNik7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBBVl9STDMyKHAgKyA0OCk7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzIDwgMSB8fCBzdC0+Y29kZWMtPmNoYW5uZWxzID4gMikgeworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gQVZfUkwzMihwICsgMzYpOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBzYW1wbGUgcmF0ZSAlZFxuIiwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gQVZfUkwzMihwICsgNDgpOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA8IDEgfHwgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IDIpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIGNoYW5uZWwgY291bnQuIFNwZWV4IG11c3QgYmUgbW9ubyBvciBzdGVyZW8uXG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBzdC0+Y29kZWMtPmNoYW5uZWxzID09IDEgPyBBVl9DSF9MQVlPVVRfTU9OTyA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9PSAxID8gQVZfQ0hfTEFZT1VUX01PTk8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTzsKIAogICAgICAgICBzcHhwLT5wYWNrZXRfc2l6ZSAgPSBBVl9STDMyKHAgKyA1Nik7CiAgICAgICAgIGZyYW1lc19wZXJfcGFja2V0ICA9IEFWX1JMMzIocCArIDY0KTsKKyAgICAgICAgaWYgKHNweHAtPnBhY2tldF9zaXplIDwgMCB8fAorICAgICAgICAgICAgZnJhbWVzX3Blcl9wYWNrZXQgPCAwIHx8CisgICAgICAgICAgICBzcHhwLT5wYWNrZXRfc2l6ZSAqIChpbnQ2NF90KWZyYW1lc19wZXJfcGFja2V0ID4gSU5UMzJfTUFYIC8gMjU2KSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBwYWNrZXRfc2l6ZSwgZnJhbWVzX3Blcl9wYWNrZXQgJWQgJWRcbiIsIHNweHAtPnBhY2tldF9zaXplLCBmcmFtZXNfcGVyX3BhY2tldCk7CisgICAgICAgICAgICBzcHhwLT5wYWNrZXRfc2l6ZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQogICAgICAgICBpZiAoZnJhbWVzX3Blcl9wYWNrZXQpCiAgICAgICAgICAgICBzcHhwLT5wYWNrZXRfc2l6ZSAqPSBmcmFtZXNfcGVyX3BhY2tldDsKIAotICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgb3MtPnBzaXplKSA8IDApCisgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBvcy0+cHNpemUpIDwgMCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSwgcCwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIG1lbWNweShzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgcCwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAKLSAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgfSBlbHNlCiAgICAgICAgIGZmX3ZvcmJpc19zdHJlYW1fY29tbWVudChzLCBzdCwgcCwgb3MtPnBzaXplKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvb2dncGFyc2V0aGVvcmEuYyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNldGhlb3JhLmMKaW5kZXggNWYwNTdjMy4uYjBjMGVkYyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb2dncGFyc2V0aGVvcmEuYworKysgYi9saWJhdmZvcm1hdC9vZ2dwYXJzZXRoZW9yYS5jCkBAIC00MSw3ICs0MSw3IEBACiAgICAgc3RydWN0IG9nZ19zdHJlYW0gKm9zID0gb2dnLT5zdHJlYW1zICsgaWR4OwogICAgIEFWU3RyZWFtICpzdCAgICAgICAgICA9IHMtPnN0cmVhbXNbaWR4XTsKICAgICBUaGVvcmFQYXJhbXMgKnRocCAgICAgPSBvcy0+cHJpdmF0ZTsKLSAgICBpbnQgY2RzICAgICAgICAgICAgICAgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICsgb3MtPnBzaXplICsgMjsKKyAgICBpbnQgY2RzICAgICAgICAgICAgICAgPSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICsgb3MtPnBzaXplICsgMjsKICAgICBpbnQgZXJyOwogICAgIHVpbnQ4X3QgKmNkcDsKIApAQCAtNzIsOCArNzIsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKICAgICAgICAgfQogCi0gICAgICAgIHN0LT5jb2RlYy0+d2lkdGggID0gZ2V0X2JpdHMoJmdiLCAxNikgPDwgNDsKLSAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBnZXRfYml0cygmZ2IsIDE2KSA8PCA0OworICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICA9IGdldF9iaXRzKCZnYiwgMTYpIDw8IDQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gZ2V0X2JpdHMoJmdiLCAxNikgPDwgNDsKIAogICAgICAgICBpZiAodGhwLT52ZXJzaW9uID49IDB4MDMwNDAwKQogICAgICAgICAgICAgc2tpcF9iaXRzKCZnYiwgMTAwKTsKQEAgLTgxLDEwICs4MSwxMCBAQAogICAgICAgICBpZiAodGhwLT52ZXJzaW9uID49IDB4MDMwMjAwKSB7CiAgICAgICAgICAgICBpbnQgd2lkdGggID0gZ2V0X2JpdHNfbG9uZygmZ2IsIDI0KTsKICAgICAgICAgICAgIGludCBoZWlnaHQgPSBnZXRfYml0c19sb25nKCZnYiwgMjQpOwotICAgICAgICAgICAgaWYgKHdpZHRoICA8PSBzdC0+Y29kZWMtPndpZHRoICAmJiB3aWR0aCAgPiBzdC0+Y29kZWMtPndpZHRoICAtIDE2ICYmCi0gICAgICAgICAgICAgICAgaGVpZ2h0IDw9IHN0LT5jb2RlYy0+aGVpZ2h0ICYmIGhlaWdodCA+IHN0LT5jb2RlYy0+aGVpZ2h0IC0gMTYpIHsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPndpZHRoICA9IHdpZHRoOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgaWYgKHdpZHRoICA8PSBzdC0+Y29kZWNwYXItPndpZHRoICAmJiB3aWR0aCAgPiBzdC0+Y29kZWNwYXItPndpZHRoICAtIDE2ICYmCisgICAgICAgICAgICAgICAgaGVpZ2h0IDw9IHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICYmIGhlaWdodCA+IHN0LT5jb2RlY3Bhci0+aGVpZ2h0IC0gMTYpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICA9IHdpZHRoOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gaGVpZ2h0OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBza2lwX2JpdHMoJmdiLCAxNik7CkBAIC0xMTAsOCArMTEwLDggQEAKICAgICAgICAgdGhwLT5ncHNoaWZ0ID0gZ2V0X2JpdHMoJmdiLCA1KTsKICAgICAgICAgdGhwLT5ncG1hc2sgID0gKDFVIDw8IHRocC0+Z3BzaGlmdCkgLSAxOwogCi0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVEhFT1JBOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RIRU9SQTsKICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUzsKICAgICB9CiAgICAgYnJlYWs7CkBAIC0xMjYsMTggKzEyNiwxOCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSwKKyAgICBpZiAoKGVyciA9IGF2X3JlYWxsb2NwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNkcyArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpKSA8IDApIHsKLSAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSAwOwogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICBtZW1zZXQoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyBjZHMsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIG1lbXNldChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIGNkcywgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CiAKLSAgICBjZHAgICAgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YSArIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgY2RwICAgID0gc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplOwogICAgICpjZHArKyA9IG9zLT5wc2l6ZSA+PiA4OwogICAgICpjZHArKyA9IG9zLT5wc2l6ZSAmIDB4ZmY7CiAgICAgbWVtY3B5KGNkcCwgb3MtPmJ1ZiArIG9zLT5wc3RhcnQsIG9zLT5wc2l6ZSk7Ci0gICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IGNkczsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gY2RzOwogCiAgICAgcmV0dXJuIDE7CiB9CkBAIC0xODEsNiArMTgxLDcgQEAKIAogICAgIGlmICgoIW9zLT5sYXN0cHRzIHx8IG9zLT5sYXN0cHRzID09IEFWX05PUFRTX1ZBTFVFKSAmJiAhKG9zLT5mbGFncyAmIE9HR19GTEFHX0VPUykpIHsKICAgICAgICAgaW50IHNlZzsKKyAgICAgICAgaW50NjRfdCBwdHM7CiAKICAgICAgICAgZHVyYXRpb24gPSAxOwogICAgICAgICBmb3IgKHNlZyA9IG9zLT5zZWdwOyBzZWcgPCBvcy0+bnNlZ3M7IHNlZysrKSB7CkBAIC0xODgsNyArMTg5LDEwIEBACiAgICAgICAgICAgICAgICAgZHVyYXRpb24gKys7CiAgICAgICAgIH0KIAotICAgICAgICBvcy0+bGFzdHB0cyA9IG9zLT5sYXN0ZHRzICAgPSB0aGVvcmFfZ3B0b3B0cyhzLCBpZHgsIG9zLT5ncmFudWxlLCBOVUxMKSAtIGR1cmF0aW9uOworICAgICAgICBwdHMgPSB0aGVvcmFfZ3B0b3B0cyhzLCBpZHgsIG9zLT5ncmFudWxlLCBOVUxMKTsKKyAgICAgICAgaWYgKHB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgICAgIHB0cyAtPSBkdXJhdGlvbjsKKyAgICAgICAgb3MtPmxhc3RwdHMgPSBvcy0+bGFzdGR0cyA9IHB0czsKICAgICAgICAgaWYocy0+c3RyZWFtc1tpZHhdLT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSB7CiAgICAgICAgICAgICBzLT5zdHJlYW1zW2lkeF0tPnN0YXJ0X3RpbWUgPSBvcy0+bGFzdHB0czsKICAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2lkeF0tPmR1cmF0aW9uID4gMCkKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L29nZ3BhcnNldm9yYmlzLmMgYi9saWJhdmZvcm1hdC9vZ2dwYXJzZXZvcmJpcy5jCmluZGV4IGI5NmJlOTguLmJjZmQyNDYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29nZ3BhcnNldm9yYmlzLmMKKysrIGIvbGliYXZmb3JtYXQvb2dncGFyc2V2b3JiaXMuYwpAQCAtMjgsOSArMjgsMTAgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYmFzZTY0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKKwogI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgotI2luY2x1ZGUgImxpYmF2Y29kZWMvZ2V0X2JpdHMuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL3ZvcmJpc19wYXJzZXIuaCIKKwogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiZmxhY19waWN0dXJlLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKQEAgLTE1Miw4ICsxNTMsOCBAQAogICAgICAgICAgICAgICogcmVjb21tZW5kZWQgd2F5IG9mIGVtYmVkZGluZyBjb3ZlciBhcnQgd2l0aGluIFZvcmJpc0NvbW1lbnRzLiIKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKCFzdHJjbXAodHQsICJNRVRBREFUQV9CTE9DS19QSUNUVVJFIikgJiYgcGFyc2VfcGljdHVyZSkgewotICAgICAgICAgICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgICAgICAgY2hhciAqcGljdCA9IGF2X21hbGxvYyh2bCk7CisgICAgICAgICAgICAgICAgaW50IHJldCwgbGVuID0gQVZfQkFTRTY0X0RFQ09ERV9TSVpFKHZsKTsKKyAgICAgICAgICAgICAgICBjaGFyICpwaWN0ID0gYXZfbWFsbG9jKGxlbik7CiAKICAgICAgICAgICAgICAgICBpZiAoIXBpY3QpIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGFzLCBBVl9MT0dfV0FSTklORywgIm91dC1vZi1tZW1vcnkgZXJyb3IuIFNraXBwaW5nIGNvdmVyIGFydCBibG9jay5cbiIpOwpAQCAtMTYxLDEwICsxNjIsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmN0KTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gYXZfYmFzZTY0X2RlY29kZShwaWN0LCBjdCwgdmwpKSA+IDApCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IGZmX2ZsYWNfcGFyc2VfcGljdHVyZShhcywgcGljdCwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9iYXNlNjRfZGVjb2RlKHBpY3QsIGN0LCBsZW4pOwogICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZ0dCk7CiAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJmN0KTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gZmZfZmxhY19wYXJzZV9waWN0dXJlKGFzLCBwaWN0LCByZXQpOwogICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZwaWN0KTsKICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2coYXMsIEFWX0xPR19XQVJOSU5HLCAiRmFpbGVkIHRvIHBhcnNlIGNvdmVyIGFydCBibG9jay5cbiIpOwpAQCAtMjI4LDYgKzIzMCwxMCBAQAogCiAgICAgbGVuID0gcHJpdi0+bGVuWzBdICsgcHJpdi0+bGVuWzFdICsgcHJpdi0+bGVuWzJdOwogICAgIGJ1Zl9sZW4gPSBsZW4gKyBsZW4gLyAyNTUgKyA2NDsKKworICAgIGlmICgqYnVmKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKwogICAgIHB0ciA9ICpidWYgPSBhdl9yZWFsbG9jKE5VTEwsIGJ1Zl9sZW4pOwogICAgIGlmICghcHRyKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpAQCAtMzE1LDcgKzMyMSw3IEBACiAgICAgaWYgKHByaXYtPnBhY2tldFtwa3RfdHlwZSA+PiAxXSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgaWYgKHBrdF90eXBlID4gMSAmJiAhcHJpdi0+cGFja2V0WzBdIHx8IHBrdF90eXBlID4gMyAmJiAhcHJpdi0+cGFja2V0WzFdKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgcmV0dXJuIHByaXYtPnZwID8gMCA6IEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBwcml2LT5sZW5bcGt0X3R5cGUgPj4gMV0gICAgPSBvcy0+cHNpemU7CiAgICAgcHJpdi0+cGFja2V0W3BrdF90eXBlID4+IDFdID0gYXZfbWFsbG9jeihvcy0+cHNpemUpOwpAQCAtMzM1LDE0ICszNDEsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgICAgIGNoYW5uZWxzID0gYnl0ZXN0cmVhbV9nZXRfYnl0ZSgmcCk7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzICYmIGNoYW5uZWxzICE9IHN0LT5jb2RlYy0+Y2hhbm5lbHMpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgJiYgY2hhbm5lbHMgIT0gc3QtPmNvZGVjcGFyLT5jaGFubmVscykgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNoYW5uZWwgY2hhbmdlIGlzIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICB9Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IGNoYW5uZWxzOwogICAgICAgICBzcmF0ZSAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbV9nZXRfbGUzMigmcCk7CiAgICAgICAgIHAgKz0gNDsgLy8gc2tpcCBtYXhpbXVtIGJpdHJhdGUKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJnApOyAvLyBub21pbmFsIGJpdHJhdGUKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IGJ5dGVzdHJlYW1fZ2V0X2xlMzIoJnApOyAvLyBub21pbmFsIGJpdHJhdGUKICAgICAgICAgcCArPSA0OyAvLyBza2lwIG1pbmltdW0gYml0cmF0ZQogCiAgICAgICAgIGJsb2Nrc2l6ZSA9IGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJnApOwpAQCAtMzU3LDExICszNjMsMTEgQEAKICAgICAgICAgaWYgKGJ5dGVzdHJlYW1fZ2V0X2J5dGUoJnApICE9IDEpIC8qIGZyYW1pbmdfZmxhZyAqLwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9WT1JCSVM7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVk9SQklTOwogCiAgICAgICAgIGlmIChzcmF0ZSA+IDApIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzcmF0ZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG9zLT5idWZbb3MtPnBzdGFydF0gPT0gMykgewpAQCAtMzgxLDE3ICszODcsMTcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCByZXQgPSBmaXh1cF92b3JiaXNfaGVhZGVycyhzLCBwcml2LCAmc3QtPmNvZGVjLT5leHRyYWRhdGEpOworICAgICAgICBpbnQgcmV0ID0gZml4dXBfdm9yYmlzX2hlYWRlcnMocywgcHJpdiwgJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDA7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9Ci0gICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSByZXQ7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSByZXQ7CiAKLSAgICAgICAgcHJpdi0+dnAgPSBhdl92b3JiaXNfcGFyc2VfaW5pdChzdC0+Y29kZWMtPmV4dHJhZGF0YSwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIHByaXYtPnZwID0gYXZfdm9yYmlzX3BhcnNlX2luaXQoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgICAgICBpZiAoIXByaXYtPnZwKSB7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDA7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvb2dncGFyc2V2cDguYyBiL2xpYmF2Zm9ybWF0L29nZ3BhcnNldnA4LmMKaW5kZXggN2FlZDhhYi4uYjc2YWM3MSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb2dncGFyc2V2cDguYworKysgYi9saWJhdmZvcm1hdC9vZ2dwYXJzZXZwOC5jCkBAIC01MSwxNiArNTEsMTYgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAKLSAgICAgICAgc3QtPmNvZGVjLT53aWR0aCAgICAgICAgICAgID0gQVZfUkIxNihwICsgIDgpOwotICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgICAgICAgPSBBVl9SQjE2KHAgKyAxMCk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICAgICA9IEFWX1JCMTYocCArICA4KTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgICAgID0gQVZfUkIxNihwICsgMTApOwogICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpby5udW0gPSBBVl9SQjI0KHAgKyAxMik7CiAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLmRlbiA9IEFWX1JCMjQocCArIDE1KTsKICAgICAgICAgZnJhbWVyYXRlLm51bSAgICAgICAgICAgICAgID0gQVZfUkIzMihwICsgMTgpOwogICAgICAgICBmcmFtZXJhdGUuZGVuICAgICAgICAgICAgICAgPSBBVl9SQjMyKHAgKyAyMik7CiAKICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIGZyYW1lcmF0ZS5kZW4sIGZyYW1lcmF0ZS5udW0pOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1ZQODsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9WUDg7CiAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgICAgICA9IEFWU1RSRUFNX1BBUlNFX0hFQURFUlM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMHgwMjoKQEAgLTgyLDcgKzgyLDExIEBACiAgICAgc3RydWN0IG9nZyAqb2dnID0gcy0+cHJpdl9kYXRhOwogICAgIHN0cnVjdCBvZ2dfc3RyZWFtICpvcyA9IG9nZy0+c3RyZWFtcyArIGlkeDsKIAotICAgIHVpbnQ2NF90IHB0cyAgPSAoZ3JhbnVsZSA+PiAzMik7CisgICAgaW50IGludmNudCAgICA9ICEoKGdyYW51bGUgPj4gMzApICYgMyk7CisgICAgLy8gSWYgcGFnZSBncmFudWxlIGlzIHRoYXQgb2YgYW4gaW52aXNpYmxlIHZwOCBmcmFtZSwgaXRzIHB0cyB3aWxsIGJlCisgICAgLy8gdGhhdCBvZiB0aGUgZW5kIG9mIHRoZSBuZXh0IHZpc2libGUgZnJhbWUuIFdlIHN1YnRyYWN0IDEgZm9yIHRob3NlCisgICAgLy8gdG8gcHJldmVudCBtZXNzaW5nIHVwIHB0cyBjYWxjdWxhdGlvbnMuCisgICAgdWludDY0X3QgcHRzICA9IChncmFudWxlID4+IDMyKSAtIGludmNudDsKICAgICB1aW50MzJfdCBkaXN0ID0gKGdyYW51bGUgPj4gIDMpICYgMHgwN2ZmZmZmZjsKIAogICAgIGlmICghZGlzdCkKQEAgLTEyMSw3ICsxMjUsNyBAQAogICAgICAgICBvcy0+bGFzdGR0cyA9IHZwOF9ncHRvcHRzKHMsIGlkeCwgb3MtPmdyYW51bGUsIE5VTEwpIC0gZHVyYXRpb247CiAgICAgICAgIGlmKHMtPnN0cmVhbXNbaWR4XS0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkgewogICAgICAgICAgICAgcy0+c3RyZWFtc1tpZHhdLT5zdGFydF90aW1lID0gb3MtPmxhc3RwdHM7Ci0gICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpZHhdLT5kdXJhdGlvbikKKyAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2lkeF0tPmR1cmF0aW9uICYmIHMtPnN0cmVhbXNbaWR4XS0+ZHVyYXRpb24gIT0gQVZfTk9QVFNfVkFMVUUpCiAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tpZHhdLT5kdXJhdGlvbiAtPSBzLT5zdHJlYW1zW2lkeF0tPnN0YXJ0X3RpbWU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9vbWEuYyBiL2xpYmF2Zm9ybWF0L29tYS5jCmluZGV4IDI3MDI4NjcuLmY3YWUzYzkgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29tYS5jCisrKyBiL2xpYmF2Zm9ybWF0L29tYS5jCkBAIC0yNiwxMCArMjYsMTIgQEAKIGNvbnN0IHVpbnQxNl90IGZmX29tYV9zcmF0ZV90YWJbOF0gPSB7IDMyMCwgNDQxLCA0ODAsIDg4MiwgOTYwLCAwIH07CiAKIGNvbnN0IEFWQ29kZWNUYWcgZmZfb21hX2NvZGVjX3RhZ3NbXSA9IHsKLSAgICB7IEFWX0NPREVDX0lEX0FUUkFDMywgICAgICBPTUFfQ09ERUNJRF9BVFJBQzMgIH0sCi0gICAgeyBBVl9DT0RFQ19JRF9BVFJBQzNQLCAgICAgT01BX0NPREVDSURfQVRSQUMzUCB9LAotICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICAgIE9NQV9DT0RFQ0lEX01QMyAgICAgfSwKLSAgICB7IEFWX0NPREVDX0lEX1BDTV9TMTZCRSwgICBPTUFfQ09ERUNJRF9MUENNICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BVFJBQzMsICAgICAgT01BX0NPREVDSURfQVRSQUMzICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BVFJBQzNQLCAgICAgT01BX0NPREVDSURfQVRSQUMzUCAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUDMsICAgICAgICAgT01BX0NPREVDSURfTVAzICAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzE2QkUsICAgT01BX0NPREVDSURfTFBDTSAgICAgIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BVFJBQzNQQUwsICAgT01BX0NPREVDSURfQVRSQUMzUEFMIH0sCisgICAgeyBBVl9DT0RFQ19JRF9BVFJBQzNBTCwgICAgT01BX0NPREVDSURfQVRSQUMzQUwgIH0sCiAgICAgeyAwIH0sCiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9vbWEuaCBiL2xpYmF2Zm9ybWF0L29tYS5oCmluZGV4IGUyYTE4N2IuLjM2ZmQwMTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29tYS5oCisrKyBiL2xpYmF2Zm9ybWF0L29tYS5oCkBAIC0zNSw2ICszNSw4IEBACiAgICAgT01BX0NPREVDSURfTVAzICAgICA9IDMsCiAgICAgT01BX0NPREVDSURfTFBDTSAgICA9IDQsCiAgICAgT01BX0NPREVDSURfV01BICAgICA9IDUsCisgICAgT01BX0NPREVDSURfQVRSQUMzUEFMID0gMzMsCisgICAgT01BX0NPREVDSURfQVRSQUMzQUwgID0gMzQsCiB9OwogCiBleHRlcm4gY29uc3QgdWludDE2X3QgZmZfb21hX3NyYXRlX3RhYls4XTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L29tYWRlYy5jIGIvbGliYXZmb3JtYXQvb21hZGVjLmMKaW5kZXggMTMyOTkyZC4uNDIzZDUyYiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb21hZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvb21hZGVjLmMKQEAgLTc1LDYgKzc1LDggQEAKICAgICB1aW50OF90IGVfdmFsWzhdOwogICAgIHVpbnQ4X3QgaXZbOF07CiAgICAgc3RydWN0IEFWREVTICphdl9kZXM7CisKKyAgICBpbnQgKCpyZWFkX3BhY2tldCkoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KTsKIH0gT01BQ29udGV4dDsKIAogc3RhdGljIHZvaWQgaGV4X2xvZyhBVkZvcm1hdENvbnRleHQgKnMsIGludCBsZXZlbCwKQEAgLTMwMiwxMzggKzMwNCwxMiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG9tYV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCi17Ci0gICAgaW50ICAgICByZXQsIGZyYW1lc2l6ZSwganNmbGFnLCBzYW1wbGVyYXRlOwotICAgIHVpbnQzMl90IGNvZGVjX3BhcmFtcywgY2hhbm5lbF9pZDsKLSAgICBpbnQxNl90IGVpZDsKLSAgICB1aW50OF90IGJ1ZltFQTNfSEVBREVSX1NJWkVdOwotICAgIHVpbnQ4X3QgKmVkYXRhOwotICAgIEFWU3RyZWFtICpzdDsKLSAgICBJRDN2MkV4dHJhTWV0YSAqZXh0cmFfbWV0YSA9IE5VTEw7Ci0gICAgT01BQ29udGV4dCAqb2MgPSBzLT5wcml2X2RhdGE7Ci0KLSAgICBmZl9pZDN2Ml9yZWFkKHMsIElEM3YyX0VBM19NQUdJQywgJmV4dHJhX21ldGEsIDApOwotICAgIHJldCA9IGF2aW9fcmVhZChzLT5wYiwgYnVmLCBFQTNfSEVBREVSX1NJWkUpOwotICAgIGlmIChyZXQgPCBFQTNfSEVBREVSX1NJWkUpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChtZW1jbXAoYnVmLCAoKGNvbnN0IHVpbnQ4X3RbXSl7J0UnLCAnQScsICczJ30pLCAzKSB8fAotICAgICAgICBidWZbNF0gIT0gMCB8fCBidWZbNV0gIT0gRUEzX0hFQURFUl9TSVpFKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDb3VsZG4ndCBmaW5kIHRoZSBFQTMgaGVhZGVyICFcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9Ci0KLSAgICBvYy0+Y29udGVudF9zdGFydCA9IGF2aW9fdGVsbChzLT5wYik7Ci0KLSAgICAvKiBlbmNyeXB0ZWQgZmlsZSAqLwotICAgIGVpZCA9IEFWX1JCMTYoJmJ1Zls2XSk7Ci0gICAgaWYgKGVpZCAhPSAtMSAmJiBlaWQgIT0gLTEyOCAmJiBkZWNyeXB0X2luaXQocywgZXh0cmFfbWV0YSwgYnVmKSA8IDApIHsKLSAgICAgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZleHRyYV9tZXRhKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmZXh0cmFfbWV0YSk7Ci0KLSAgICBjb2RlY19wYXJhbXMgPSBBVl9SQjI0KCZidWZbMzNdKTsKLQotICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKLSAgICBpZiAoIXN0KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotCi0gICAgc3QtPnN0YXJ0X3RpbWUgPSAwOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBidWZbMzJdOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9vbWFfY29kZWNfdGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcpOwotCi0gICAgc3dpdGNoIChidWZbMzJdKSB7Ci0gICAgY2FzZSBPTUFfQ09ERUNJRF9BVFJBQzM6Ci0gICAgICAgIHNhbXBsZXJhdGUgPSBmZl9vbWFfc3JhdGVfdGFiWyhjb2RlY19wYXJhbXMgPj4gMTMpICYgN10gKiAxMDA7Ci0gICAgICAgIGlmICghc2FtcGxlcmF0ZSkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzYW1wbGVyYXRlICE9IDQ0MTAwKQotICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJTYW1wbGUgcmF0ZSAlZCIsIHNhbXBsZXJhdGUpOwotCi0gICAgICAgIGZyYW1lc2l6ZSA9IChjb2RlY19wYXJhbXMgJiAweDNGRikgKiA4OwotCi0gICAgICAgIC8qIGdldCBzdGVyZW8gY29kaW5nIG1vZGUsIDEgZm9yIGpvaW50LXN0ZXJlbyAqLwotICAgICAgICBqc2ZsYWcgPSAoY29kZWNfcGFyYW1zID4+IDE3KSAmIDE7Ci0KLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IDI7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlcmF0ZTsKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSAgICA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBmcmFtZXNpemUgKiA4IC8gMTAyNDsKLQotICAgICAgICAvKiBmYWtlIHRoZSBBVFJBQzMgZXh0cmFkYXRhCi0gICAgICAgICAqICh3YXYgZm9ybWF0LCBtYWtlcyBzdHJlYW0gY29weSB0byB3YXYgd29yaykgKi8KLSAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDE0KSkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICAgICAgZWRhdGEgPSBzdC0+Y29kZWMtPmV4dHJhZGF0YTsKLSAgICAgICAgQVZfV0wxNigmZWRhdGFbMF0sICAxKTsgICAgICAgICAgICAgLy8gYWx3YXlzIDEKLSAgICAgICAgQVZfV0wzMigmZWRhdGFbMl0sICBzYW1wbGVyYXRlKTsgICAgLy8gc2FtcGxlcyByYXRlCi0gICAgICAgIEFWX1dMMTYoJmVkYXRhWzZdLCAganNmbGFnKTsgICAgICAgIC8vIGNvZGluZyBtb2RlCi0gICAgICAgIEFWX1dMMTYoJmVkYXRhWzhdLCAganNmbGFnKTsgICAgICAgIC8vIGNvZGluZyBtb2RlCi0gICAgICAgIEFWX1dMMTYoJmVkYXRhWzEwXSwgMSk7ICAgICAgICAgICAgIC8vIGFsd2F5cyAxCi0gICAgICAgIC8vIEFWX1dMMTYoJmVkYXRhWzEyXSwgMCk7ICAgICAgICAgIC8vIGFsd2F5cyAwCi0KLSAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE9NQV9DT0RFQ0lEX0FUUkFDM1A6Ci0gICAgICAgIGNoYW5uZWxfaWQgPSAoY29kZWNfcGFyYW1zID4+IDEwKSAmIDc7Ci0gICAgICAgIGlmICghY2hhbm5lbF9pZCkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBBVFJBQy1YIGNoYW5uZWwgaWQ6ICUiUFJJdTMyIlxuIiwgY2hhbm5lbF9pZCk7Ci0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgfQotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gZmZfb21hX2NoaWRfdG9fbmF0aXZlX2xheW91dFtjaGFubmVsX2lkIC0gMV07Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSBmZl9vbWFfY2hpZF90b19udW1fY2hhbm5lbHNbY2hhbm5lbF9pZCAtIDFdOwotICAgICAgICBmcmFtZXNpemUgPSAoKGNvZGVjX3BhcmFtcyAmIDB4M0ZGKSAqIDgpICsgODsKLSAgICAgICAgc2FtcGxlcmF0ZSA9IGZmX29tYV9zcmF0ZV90YWJbKGNvZGVjX3BhcmFtcyA+PiAxMykgJiA3XSAqIDEwMDsKLSAgICAgICAgaWYgKCFzYW1wbGVyYXRlKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIH0KLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZXJhdGU7Ci0gICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgICAgPSBzYW1wbGVyYXRlICogZnJhbWVzaXplICogOCAvIDIwNDg7Ci0gICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzYW1wbGVyYXRlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPTUFfQ09ERUNJRF9NUDM6Ci0gICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKLSAgICAgICAgZnJhbWVzaXplID0gMTAyNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBPTUFfQ09ERUNJRF9MUENNOgotICAgICAgICAvKiBQQ00gNDQuMSBrSHogMTYgYml0IHN0ZXJlbyBiaWctZW5kaWFuICovCi0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSAyOwotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotICAgICAgICBmcmFtZXNpemUgPSAxMDI0OwotICAgICAgICAvKiBiaXQgcmF0ZSA9IHNhbXBsZSByYXRlIHggUENNIGJsb2NrIGFsaWduICg9IDQpIHggOCAqLwotICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIDMyOwotICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9Ci0gICAgICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpOwotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBjb2RlYyAlZCFcbiIsIGJ1ZlszMl0pOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwotICAgIH0KLQotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBmcmFtZXNpemU7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IG9tYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCitzdGF0aWMgaW50IHJlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBPTUFDb250ZXh0ICpvYyAgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZTdHJlYW0gKnN0ICAgID0gcy0+c3RyZWFtc1swXTsKLSAgICBpbnQgcGFja2V0X3NpemUgPSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOwotICAgIGludCBieXRlX3JhdGUgICA9IHN0LT5jb2RlYy0+Yml0X3JhdGUgPj4gMzsKKyAgICBpbnQgcGFja2V0X3NpemUgPSBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduOworICAgIGludCBieXRlX3JhdGUgICA9IHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPj4gMzsKICAgICBpbnQ2NF90IHBvcyAgICAgPSBhdmlvX3RlbGwocy0+cGIpOwogICAgIGludCByZXQgICAgICAgICA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgcGFja2V0X3NpemUpOwogCkBAIC00NjYsNiArMzQyLDIwMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgYWFsX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgaW50IHJldCwgcHRzOworICAgIGludCBwYWNrZXRfc2l6ZTsKKyAgICB1bnNpZ25lZCB0YWc7CisKKyAgICBpZiAoYXZpb19mZW9mKHMtPnBiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgdGFnID0gYXZpb19yYjI0KHMtPnBiKTsKKyAgICBpZiAodGFnID09IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICBlbHNlIGlmICh0YWcgIT0gTUtCRVRBRygwLCdCJywnTCcsJ0snKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmlvX3NraXAocy0+cGIsIDEpOworICAgIHBhY2tldF9zaXplID0gYXZpb19yYjE2KHMtPnBiKTsKKyAgICBhdmlvX3NraXAocy0+cGIsIDIpOworICAgIHB0cyA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgYXZpb19za2lwKHMtPnBiLCAxMik7CisgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBwYWNrZXRfc2l6ZSk7CisgICAgaWYgKHJldCA8IHBhY2tldF9zaXplKQorICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0NPUlJVUFQ7CisKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHBrdC0+cG9zID0gcG9zOworICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVRSQUMzQUwpIHsKKyAgICAgICAgcGt0LT5kdXJhdGlvbiA9IDEwMjQ7CisgICAgICAgIHBrdC0+cHRzID0gcHRzICogMTAyNExMOworICAgIH0gZWxzZSB7CisgICAgICAgIHBrdC0+ZHVyYXRpb24gPSAyMDQ4OworICAgICAgICBwa3QtPnB0cyA9IHB0cyAqIDIwNDhMTDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG9tYV9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50ICAgICByZXQsIGZyYW1lc2l6ZSwganNmbGFnLCBzYW1wbGVyYXRlOworICAgIHVpbnQzMl90IGNvZGVjX3BhcmFtcywgY2hhbm5lbF9pZDsKKyAgICBpbnQxNl90IGVpZDsKKyAgICB1aW50OF90IGJ1ZltFQTNfSEVBREVSX1NJWkVdOworICAgIHVpbnQ4X3QgKmVkYXRhOworICAgIEFWU3RyZWFtICpzdDsKKyAgICBJRDN2MkV4dHJhTWV0YSAqZXh0cmFfbWV0YSA9IE5VTEw7CisgICAgT01BQ29udGV4dCAqb2MgPSBzLT5wcml2X2RhdGE7CisKKyAgICBmZl9pZDN2Ml9yZWFkKHMsIElEM3YyX0VBM19NQUdJQywgJmV4dHJhX21ldGEsIDApOworICAgIGlmICgocmV0ID0gZmZfaWQzdjJfcGFyc2VfY2hhcHRlcnMocywgJmV4dHJhX21ldGEpKSA8IDApIHsKKyAgICAgICAgZmZfaWQzdjJfZnJlZV9leHRyYV9tZXRhKCZleHRyYV9tZXRhKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSBhdmlvX3JlYWQocy0+cGIsIGJ1ZiwgRUEzX0hFQURFUl9TSVpFKTsKKyAgICBpZiAocmV0IDwgRUEzX0hFQURFUl9TSVpFKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZiAobWVtY21wKGJ1ZiwgKChjb25zdCB1aW50OF90W10peydFJywgJ0EnLCAnMyd9KSwgMykgfHwKKyAgICAgICAgYnVmWzRdICE9IDAgfHwgYnVmWzVdICE9IEVBM19IRUFERVJfU0laRSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGRuJ3QgZmluZCB0aGUgRUEzIGhlYWRlciAhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgb2MtPmNvbnRlbnRfc3RhcnQgPSBhdmlvX3RlbGwocy0+cGIpOworCisgICAgLyogZW5jcnlwdGVkIGZpbGUgKi8KKyAgICBlaWQgPSBBVl9SQjE2KCZidWZbNl0pOworICAgIGlmIChlaWQgIT0gLTEgJiYgZWlkICE9IC0xMjggJiYgZGVjcnlwdF9pbml0KHMsIGV4dHJhX21ldGEsIGJ1ZikgPCAwKSB7CisgICAgICAgIGZmX2lkM3YyX2ZyZWVfZXh0cmFfbWV0YSgmZXh0cmFfbWV0YSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmZl9pZDN2Ml9mcmVlX2V4dHJhX21ldGEoJmV4dHJhX21ldGEpOworCisgICAgY29kZWNfcGFyYW1zID0gQVZfUkIyNCgmYnVmWzMzXSk7CisKKyAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHN0LT5zdGFydF90aW1lID0gMDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gYnVmWzMyXTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfb21hX2NvZGVjX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKTsKKworICAgIG9jLT5yZWFkX3BhY2tldCA9IHJlYWRfcGFja2V0OworCisgICAgc3dpdGNoIChidWZbMzJdKSB7CisgICAgY2FzZSBPTUFfQ09ERUNJRF9BVFJBQzM6CisgICAgICAgIHNhbXBsZXJhdGUgPSBmZl9vbWFfc3JhdGVfdGFiWyhjb2RlY19wYXJhbXMgPj4gMTMpICYgN10gKiAxMDA7CisgICAgICAgIGlmICghc2FtcGxlcmF0ZSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHNhbXBsZSByYXRlXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIGlmIChzYW1wbGVyYXRlICE9IDQ0MTAwKQorICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJTYW1wbGUgcmF0ZSAlZCIsIHNhbXBsZXJhdGUpOworCisgICAgICAgIGZyYW1lc2l6ZSA9IChjb2RlY19wYXJhbXMgJiAweDNGRikgKiA4OworCisgICAgICAgIC8qIGdldCBzdGVyZW8gY29kaW5nIG1vZGUsIDEgZm9yIGpvaW50LXN0ZXJlbyAqLworICAgICAgICBqc2ZsYWcgPSAoY29kZWNfcGFyYW1zID4+IDE3KSAmIDE7CisKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IDI7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gc2FtcGxlcmF0ZTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICA9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKiBmcmFtZXNpemUgLyAoMTAyNCAvIDgpOworCisgICAgICAgIC8qIGZha2UgdGhlIEFUUkFDMyBleHRyYWRhdGEKKyAgICAgICAgICogKHdhdiBmb3JtYXQsIG1ha2VzIHN0cmVhbSBjb3B5IHRvIHdhdiB3b3JrKSAqLworICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMTQpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBlZGF0YSA9IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhOworICAgICAgICBBVl9XTDE2KCZlZGF0YVswXSwgIDEpOyAgICAgICAgICAgICAvLyBhbHdheXMgMQorICAgICAgICBBVl9XTDMyKCZlZGF0YVsyXSwgIHNhbXBsZXJhdGUpOyAgICAvLyBzYW1wbGVzIHJhdGUKKyAgICAgICAgQVZfV0wxNigmZWRhdGFbNl0sICBqc2ZsYWcpOyAgICAgICAgLy8gY29kaW5nIG1vZGUKKyAgICAgICAgQVZfV0wxNigmZWRhdGFbOF0sICBqc2ZsYWcpOyAgICAgICAgLy8gY29kaW5nIG1vZGUKKyAgICAgICAgQVZfV0wxNigmZWRhdGFbMTBdLCAxKTsgICAgICAgICAgICAgLy8gYWx3YXlzIDEKKyAgICAgICAgLy8gQVZfV0wxNigmZWRhdGFbMTJdLCAwKTsgICAgICAgICAgLy8gYWx3YXlzIDAKKworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01BX0NPREVDSURfQVRSQUMzUDoKKyAgICAgICAgY2hhbm5lbF9pZCA9IChjb2RlY19wYXJhbXMgPj4gMTApICYgNzsKKyAgICAgICAgaWYgKCFjaGFubmVsX2lkKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEFUUkFDLVggY2hhbm5lbCBpZDogJSJQUkl1MzIiXG4iLCBjaGFubmVsX2lkKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBmZl9vbWFfY2hpZF90b19uYXRpdmVfbGF5b3V0W2NoYW5uZWxfaWQgLSAxXTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IGZmX29tYV9jaGlkX3RvX251bV9jaGFubmVsc1tjaGFubmVsX2lkIC0gMV07CisgICAgICAgIGZyYW1lc2l6ZSA9ICgoY29kZWNfcGFyYW1zICYgMHgzRkYpICogOCkgKyA4OworICAgICAgICBzYW1wbGVyYXRlID0gZmZfb21hX3NyYXRlX3RhYlsoY29kZWNfcGFyYW1zID4+IDEzKSAmIDddICogMTAwOworICAgICAgICBpZiAoIXNhbXBsZXJhdGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gc2FtcGxlcmF0ZTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICA9IHNhbXBsZXJhdGUgKiBmcmFtZXNpemUgLyAoMjA0OCAvIDgpOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc2FtcGxlcmF0ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01BX0NPREVDSURfTVAzOgorICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisgICAgICAgIGZyYW1lc2l6ZSA9IDEwMjQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01BX0NPREVDSURfTFBDTToKKyAgICAgICAgLyogUENNIDQ0LjEga0h6IDE2IGJpdCBzdGVyZW8gYmlnLWVuZGlhbiAqLworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMjsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA0NDEwMDsKKyAgICAgICAgZnJhbWVzaXplID0gMTAyNDsKKyAgICAgICAgLyogYml0IHJhdGUgPSBzYW1wbGUgcmF0ZSB4IFBDTSBibG9jayBhbGlnbiAoPSA0KSB4IDggKi8KKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKiAzMjsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPQorICAgICAgICAgICAgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NQV9DT0RFQ0lEX0FUUkFDM0FMOgorICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gMjsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA0NDEwMDsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDQ0MTAwKTsKKyAgICAgICAgb2MtPnJlYWRfcGFja2V0ID0gYWFsX3JlYWRfcGFja2V0OworICAgICAgICBmcmFtZXNpemUgPSA0MDk2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NQV9DT0RFQ0lEX0FUUkFDM1BBTDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gNDQxMDA7CisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCA0NDEwMCk7CisgICAgICAgIG9jLT5yZWFkX3BhY2tldCA9IGFhbF9yZWFkX3BhY2tldDsKKyAgICAgICAgZnJhbWVzaXplID0gNDA5NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjICVkIVxuIiwgYnVmWzMyXSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IGZyYW1lc2l6ZTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9tYV9yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgT01BQ29udGV4dCAqb2MgID0gcy0+cHJpdl9kYXRhOworICAgIHJldHVybiBvYy0+cmVhZF9wYWNrZXQocywgcGt0KTsKK30KKwogc3RhdGljIGludCBvbWFfcmVhZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKIHsKICAgICBjb25zdCB1aW50OF90ICpidWYgPSBwLT5idWY7CkBAIC00OTEsOCArNTY0LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9pbmRleCwgaW50NjRfdCB0aW1lc3RhbXAsIGludCBmbGFncykKIHsKICAgICBPTUFDb250ZXh0ICpvYyA9IHMtPnByaXZfZGF0YTsKLSAgICBpbnQ2NF90IGVyciA9IGZmX3BjbV9yZWFkX3NlZWsocywgc3RyZWFtX2luZGV4LCB0aW1lc3RhbXAsIGZsYWdzKTsKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIGludDY0X3QgZXJyOwogCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVRSQUMzUEFMIHx8CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQVRSQUMzQUwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGVyciA9IGZmX3BjbV9yZWFkX3NlZWsocywgc3RyZWFtX2luZGV4LCB0aW1lc3RhbXAsIGZsYWdzKTsKICAgICBpZiAoIW9jLT5lbmNyeXB0ZWQpCiAgICAgICAgIHJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L29tYWVuYy5jIGIvbGliYXZmb3JtYXQvb21hZW5jLmMKaW5kZXggZmUwNjY5Zi4uNzk1MjgwOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb21hZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvb21hZW5jLmMKQEAgLTMwLDIxICszMCwyMSBAQAogc3RhdGljIGF2X2NvbGQgaW50IG9tYV93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIGludCBpOwotICAgIEFWQ29kZWNDb250ZXh0ICpmb3JtYXQ7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBpbnQgc3JhdGVfaW5kZXg7CiAgICAgaW50IGlzam9pbnRzdGVyZW87CiAKLSAgICBmb3JtYXQgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKICAgICAvKiBjaGVjayBmb3Igc3VwcG9ydCBvZiB0aGUgZm9ybWF0IGZpcnN0ICovCiAKICAgICBmb3IgKHNyYXRlX2luZGV4ID0gMDsgOyBzcmF0ZV9pbmRleCsrKSB7CiAgICAgICAgIGlmIChmZl9vbWFfc3JhdGVfdGFiW3NyYXRlX2luZGV4XSA9PSAwKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU2FtcGxlIHJhdGUgJWQgbm90IHN1cHBvcnRlZCBpbiBPcGVuTUcgYXVkaW9cbiIsCi0gICAgICAgICAgICAgICAgICAgZm9ybWF0LT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgICAgcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGZmX29tYV9zcmF0ZV90YWJbc3JhdGVfaW5kZXhdICogMTAwID09IGZvcm1hdC0+c2FtcGxlX3JhdGUpCisgICAgICAgIGlmIChmZl9vbWFfc3JhdGVfdGFiW3NyYXRlX2luZGV4XSAqIDEwMCA9PSBwYXItPnNhbXBsZV9yYXRlKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC01OCwxNiArNTgsMTYgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQogICAgICAgICBhdmlvX3dsMzIocy0+cGIsIDApOyAgICAgICAgLyogUGFkZGluZyArIERSTSBpZCAqLwogCi0gICAgc3dpdGNoKGZvcm1hdC0+Y29kZWNfdGFnKSB7CisgICAgc3dpdGNoIChwYXItPmNvZGVjX3RhZykgewogICAgIGNhc2UgT01BX0NPREVDSURfQVRSQUMzOgotICAgICAgICBpZiAoZm9ybWF0LT5jaGFubmVscyAhPSAyKSB7CisgICAgICAgIGlmIChwYXItPmNoYW5uZWxzICE9IDIpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJBVFJBQzMgaW4gT01BIGlzIG9ubHkgc3VwcG9ydGVkIHdpdGggMiBjaGFubmVsc1xuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChmb3JtYXQtPmV4dHJhZGF0YV9zaXplID09IDE0KSAvKiBXQVYgZm9ybWF0IGV4dHJhZGF0YSAqLwotICAgICAgICAgICAgaXNqb2ludHN0ZXJlbyA9IGZvcm1hdC0+ZXh0cmFkYXRhWzZdICE9IDA7Ci0gICAgICAgIGVsc2UgaWYoZm9ybWF0LT5leHRyYWRhdGFfc2l6ZSA9PSAxMCkgLyogUk0gZm9ybWF0IGV4dHJhZGF0YSAqLwotICAgICAgICAgICAgaXNqb2ludHN0ZXJlbyA9IGZvcm1hdC0+ZXh0cmFkYXRhWzhdID09IDB4MTI7CisgICAgICAgIGlmIChwYXItPmV4dHJhZGF0YV9zaXplID09IDE0KSAvKiBXQVYgZm9ybWF0IGV4dHJhZGF0YSAqLworICAgICAgICAgICAgaXNqb2ludHN0ZXJlbyA9IHBhci0+ZXh0cmFkYXRhWzZdICE9IDA7CisgICAgICAgIGVsc2UgaWYocGFyLT5leHRyYWRhdGFfc2l6ZSA9PSAxMCkgLyogUk0gZm9ybWF0IGV4dHJhZGF0YSAqLworICAgICAgICAgICAgaXNqb2ludHN0ZXJlbyA9IHBhci0+ZXh0cmFkYXRhWzhdID09IDB4MTI7CiAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFUUkFDMzogVW5zdXBwb3J0ZWQgZXh0cmFkYXRhIHNpemVcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKQEAgLTc1LDE3ICs3NSwxNyBAQAogICAgICAgICBhdmlvX3diMzIocy0+cGIsIChPTUFfQ09ERUNJRF9BVFJBQzMgPDwgMjQpIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNqb2ludHN0ZXJlbyA8PCAxNykgfAogICAgICAgICAgICAgICAgICAgICAgICAgIChzcmF0ZV9pbmRleCA8PCAxMykgfAotICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQtPmJsb2NrX2FsaWduLzgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAocGFyLT5ibG9ja19hbGlnbi84KSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgT01BX0NPREVDSURfQVRSQUMzUDoKICAgICAgICAgYXZpb193YjMyKHMtPnBiLCAoT01BX0NPREVDSURfQVRSQUMzUCA8PCAyNCkgfAogICAgICAgICAgICAgICAgICAgICAgICAgIChzcmF0ZV9pbmRleCA8PCAxMykgfAotICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQtPmNoYW5uZWxzIDw8IDEwKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdC0+YmxvY2tfYWxpZ24vOCAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAocGFyLT5jaGFubmVscyA8PCAxMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIChwYXItPmJsb2NrX2FsaWduLzggLSAxKSk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBjb2RlYyB0YWcgJWQgZm9yIHdyaXRlXG4iLAotICAgICAgICAgICAgICAgZm9ybWF0LT5jb2RlY190YWcpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY29kZWMgdGFnICVzIGZvciB3cml0ZVxuIiwKKyAgICAgICAgICAgICAgIGF2X2ZvdXJjYzJzdHIocGFyLT5jb2RlY190YWcpKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAgICAgZm9yIChpID0gMDsgaSA8IChFQTNfSEVBREVSX1NJWkUgLSAzNikvNDsgaSsrKQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvb3B0aW9ucy5jIGIvbGliYXZmb3JtYXQvb3B0aW9ucy5jCmluZGV4IDhmZTAwMTcuLmMxODhjMjMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L29wdGlvbnMuYworKysgYi9saWJhdmZvcm1hdC9vcHRpb25zLmMKQEAgLTEwMiw2ICsxMDIsMTggQEAKIHN0YXRpYyBpbnQgaW9fb3Blbl9kZWZhdWx0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKipwYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwgaW50IGZsYWdzLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQogeworICAgIGludCBsb2dsZXZlbDsKKworICAgIGlmICghc3RyY21wKHVybCwgcy0+dXJsKSB8fAorICAgICAgICBzLT5pZm9ybWF0ICYmICFzdHJjbXAocy0+aWZvcm1hdC0+bmFtZSwgImltYWdlMiIpIHx8CisgICAgICAgIHMtPm9mb3JtYXQgJiYgIXN0cmNtcChzLT5vZm9ybWF0LT5uYW1lLCAiaW1hZ2UyIikKKyAgICApIHsKKyAgICAgICAgbG9nbGV2ZWwgPSBBVl9MT0dfREVCVUc7CisgICAgfSBlbHNlCisgICAgICAgIGxvZ2xldmVsID0gQVZfTE9HX0lORk87CisKKyAgICBhdl9sb2cocywgbG9nbGV2ZWwsICJPcGVuaW5nIFwnJXNcJyBmb3IgJXNcbiIsIHVybCwgZmxhZ3MgJiBBVklPX0ZMQUdfV1JJVEUgPyAid3JpdGluZyIgOiAicmVhZGluZyIpOworCiAjaWYgRkZfQVBJX09MRF9PUEVOX0NBTExCQUNLUwogRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIGlmIChzLT5vcGVuX2NiKQpAQCAtMTA5LDcgKzEyMSw3IEBACiBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICNlbmRpZgogCi0gICAgcmV0dXJuIGZmaW9fb3Blbl93aGl0ZWxpc3QocGIsIHVybCwgZmxhZ3MsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIG9wdGlvbnMsIHMtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgcmV0dXJuIGZmaW9fb3Blbl93aGl0ZWxpc3QocGIsIHVybCwgZmxhZ3MsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIG9wdGlvbnMsIHMtPnByb3RvY29sX3doaXRlbGlzdCwgcy0+cHJvdG9jb2xfYmxhY2tsaXN0KTsKIH0KIAogc3RhdGljIHZvaWQgaW9fY2xvc2VfZGVmYXVsdChBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYikKQEAgLTE0Myw2ICsxNTUsNyBAQAogICAgIH0KICAgICBpYy0+aW50ZXJuYWwtPm9mZnNldCA9IEFWX05PUFRTX1ZBTFVFOwogICAgIGljLT5pbnRlcm5hbC0+cmF3X3BhY2tldF9idWZmZXJfcmVtYWluaW5nX3NpemUgPSBSQVdfUEFDS0VUX0JVRkZFUl9TSVpFOworICAgIGljLT5pbnRlcm5hbC0+c2hvcnRlc3RfZW5kID0gQVZfTk9QVFNfVkFMVUU7CiAKICAgICByZXR1cm4gaWM7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9vcHRpb25zX3RhYmxlLmggYi9saWJhdmZvcm1hdC9vcHRpb25zX3RhYmxlLmgKaW5kZXggODkyNmZlNS4uN2M0ZDg0NyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvb3B0aW9uc190YWJsZS5oCisrKyBiL2xpYmF2Zm9ybWF0L29wdGlvbnNfdGFibGUuaApAQCAtMzksNyArMzksNyBAQAogeyJwcm9iZXNpemUiLCAic2V0IHByb2Jpbmcgc2l6ZSIsIE9GRlNFVChwcm9iZXNpemUpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSA1MDAwMDAwIH0sIDMyLCBJTlQ2NF9NQVgsIER9LAogeyJmb3JtYXRwcm9iZXNpemUiLCAibnVtYmVyIG9mIGJ5dGVzIHRvIHByb2JlIGZpbGUgZm9ybWF0IiwgT0ZGU0VUKGZvcm1hdF9wcm9iZXNpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gUFJPQkVfQlVGX01BWH0sIDAsIElOVF9NQVgtMSwgRH0sCiB7InBhY2tldHNpemUiLCAic2V0IHBhY2tldCBzaXplIiwgT0ZGU0VUKHBhY2tldF9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IERFRkFVTFQgfSwgMCwgSU5UX01BWCwgRX0sCi17ImZmbGFncyIsIE5VTEwsIE9GRlNFVChmbGFncyksIEFWX09QVF9UWVBFX0ZMQUdTLCB7Lmk2NCA9IEFWRk1UX0ZMQUdfRkxVU0hfUEFDS0VUUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBEfEUsICJmZmxhZ3MifSwKK3siZmZsYWdzIiwgTlVMTCwgT0ZGU0VUKGZsYWdzKSwgQVZfT1BUX1RZUEVfRkxBR1MsIHsuaTY0ID0gQVZGTVRfRkxBR19BVVRPX0JTRiB9LCBJTlRfTUlOLCBJTlRfTUFYLCBEfEUsICJmZmxhZ3MifSwKIHsiZmx1c2hfcGFja2V0cyIsICJyZWR1Y2UgdGhlIGxhdGVuY3kgYnkgZmx1c2hpbmcgb3V0IHBhY2tldHMgaW1tZWRpYXRlbHkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9GTEFHX0ZMVVNIX1BBQ0tFVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgRSwgImZmbGFncyJ9LAogeyJpZ25pZHgiLCAiaWdub3JlIGluZGV4IiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19JR05JRFggfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LAogeyJnZW5wdHMiLCAiZ2VuZXJhdGUgcHRzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19HRU5QVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LApAQCAtNDgsMTIgKzQ4LDE2IEBACiB7ImlnbmR0cyIsICJpZ25vcmUgZHRzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19JR05EVFMgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LAogeyJkaXNjYXJkY29ycnVwdCIsICJkaXNjYXJkIGNvcnJ1cHRlZCBmcmFtZXMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9GTEFHX0RJU0NBUkRfQ09SUlVQVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBELCAiZmZsYWdzIn0sCiB7InNvcnRkdHMiLCAidHJ5IHRvIGludGVybGVhdmUgb3V0cHV0dGVkIHBhY2tldHMgYnkgZHRzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19TT1JUX0RUUyB9LCBJTlRfTUlOLCBJTlRfTUFYLCBELCAiZmZsYWdzIn0sCi17ImtlZXBzaWRlIiwgImRvbid0IG1lcmdlIHNpZGUgZGF0YSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWRk1UX0ZMQUdfS0VFUF9TSURFX0RBVEEgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImZmbGFncyJ9LAorI2lmIEZGX0FQSV9MQVZGX0tFRVBTSURFX0ZMQUcKK3sia2VlcHNpZGUiLCAiZGVwcmVjYXRlZCwgZG9lcyBub3RoaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19LRUVQX1NJREVfREFUQSB9LCBJTlRfTUlOLCBJTlRfTUFYLCBELCAiZmZsYWdzIn0sCisjZW5kaWYKIHsiZmFzdHNlZWsiLCAiZmFzdCBidXQgaW5hY2N1cmF0ZSBzZWVrcyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWRk1UX0ZMQUdfRkFTVF9TRUVLIH0sIElOVF9NSU4sIElOVF9NQVgsIEQsICJmZmxhZ3MifSwKIHsibGF0bSIsICJlbmFibGUgUlRQIE1QNEEtTEFUTSBwYXlsb2FkIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gQVZGTVRfRkxBR19NUDRBX0xBVE0gfSwgSU5UX01JTiwgSU5UX01BWCwgRSwgImZmbGFncyJ9LAogeyJub2J1ZmZlciIsICJyZWR1Y2UgdGhlIGxhdGVuY3kgaW50cm9kdWNlZCBieSBvcHRpb25hbCBidWZmZXJpbmciLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBBVkZNVF9GTEFHX05PQlVGRkVSIH0sIDAsIElOVF9NQVgsIEQsICJmZmxhZ3MifSwKLXsic2VlazJhbnkiLCAiYWxsb3cgc2Vla2luZyB0byBub24ta2V5ZnJhbWVzIG9uIGRlbXV4ZXIgbGV2ZWwgd2hlbiBzdXBwb3J0ZWQiLCBPRkZTRVQoc2VlazJhbnkpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDAgfSwgMCwgMSwgRH0sCiB7ImJpdGV4YWN0IiwgImRvIG5vdCB3cml0ZSByYW5kb20vdm9sYXRpbGUgZGF0YSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVkZNVF9GTEFHX0JJVEVYQUNUIH0sIDAsIDAsIEUsICJmZmxhZ3MiIH0sCit7InNob3J0ZXN0IiwgInN0b3AgbXV4aW5nIHdpdGggdGhlIHNob3J0ZXN0IHN0cmVhbSIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVkZNVF9GTEFHX1NIT1JURVNUIH0sIDAsIDAsIEUsICJmZmxhZ3MiIH0sCit7ImF1dG9ic2YiLCAiYWRkIG5lZWRlZCBic2ZzIGF1dG9tYXRpY2FsbHkiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZGTVRfRkxBR19BVVRPX0JTRiB9LCAwLCAwLCBFLCAiZmZsYWdzIiB9LAoreyJzZWVrMmFueSIsICJhbGxvdyBzZWVraW5nIHRvIG5vbi1rZXlmcmFtZXMgb24gZGVtdXhlciBsZXZlbCB3aGVuIHN1cHBvcnRlZCIsIE9GRlNFVChzZWVrMmFueSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMCB9LCAwLCAxLCBEfSwKIHsiYW5hbHl6ZWR1cmF0aW9uIiwgInNwZWNpZnkgaG93IG1hbnkgbWljcm9zZWNvbmRzIGFyZSBhbmFseXplZCB0byBwcm9iZSB0aGUgaW5wdXQiLCBPRkZTRVQobWF4X2FuYWx5emVfZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9JTlQ2NCwgey5pNjQgPSAwIH0sIDAsIElOVDY0X01BWCwgRH0sCiB7ImNyeXB0b2tleSIsICJkZWNyeXB0aW9uIGtleSIsIE9GRlNFVChrZXkpLCBBVl9PUFRfVFlQRV9CSU5BUlksIHsuZGJsID0gMH0sIDAsIDAsIER9LAogeyJpbmRleG1lbSIsICJtYXggbWVtb3J5IHVzZWQgZm9yIHRpbWVzdGFtcCBpbmRleCAocGVyIHN0cmVhbSkiLCBPRkZTRVQobWF4X2luZGV4X3NpemUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMTw8MjAgfSwgMCwgSU5UX01BWCwgRH0sCkBAIC03OCwxNSArODIsMTYgQEAKIHsiY2FyZWZ1bCIsICAgICJjb25zaWRlciB0aGluZ3MgdGhhdCB2aW9sYXRlIHRoZSBzcGVjLCBhcmUgZmFzdCB0byBjaGVjayBhbmQgaGF2ZSBub3QgYmVlbiBzZWVuIGluIHRoZSB3aWxkIGFzIGVycm9ycyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0VGX0NBUkVGVUwgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImVycl9kZXRlY3QifSwKIHsiY29tcGxpYW50IiwgICJjb25zaWRlciBhbGwgc3BlYyBub24gY29tcGxpYW5jaWVzIGFzIGVycm9ycyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0VGX0NPTVBMSUFOVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBELCAiZXJyX2RldGVjdCJ9LAogeyJhZ2dyZXNzaXZlIiwgImNvbnNpZGVyIHRoaW5ncyB0aGF0IGEgc2FuZSBlbmNvZGVyIHNob3VsZG4ndCBkbyBhcyBhbiBlcnJvciIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEFWX0VGX0FHR1JFU1NJVkUgfSwgSU5UX01JTiwgSU5UX01BWCwgRCwgImVycl9kZXRlY3QifSwKLXsidXNlX3dhbGxjbG9ja19hc190aW1lc3RhbXBzIiwgInVzZSB3YWxsY2xvY2sgYXMgdGltZXN0YW1wcyIsIE9GRlNFVCh1c2Vfd2FsbGNsb2NrX2FzX3RpbWVzdGFtcHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gMH0sIDAsIElOVF9NQVgtMSwgRH0sCit7InVzZV93YWxsY2xvY2tfYXNfdGltZXN0YW1wcyIsICJ1c2Ugd2FsbGNsb2NrIGFzIHRpbWVzdGFtcHMiLCBPRkZTRVQodXNlX3dhbGxjbG9ja19hc190aW1lc3RhbXBzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgRH0sCiB7InNraXBfaW5pdGlhbF9ieXRlcyIsICJzZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgYmVmb3JlIHJlYWRpbmcgaGVhZGVyIGFuZCBmcmFtZXMiLCBPRkZTRVQoc2tpcF9pbml0aWFsX2J5dGVzKSwgQVZfT1BUX1RZUEVfSU5UNjQsIHsuaTY0ID0gMH0sIDAsIElOVDY0X01BWC0xLCBEfSwKIHsiY29ycmVjdF90c19vdmVyZmxvdyIsICJjb3JyZWN0IHNpbmdsZSB0aW1lc3RhbXAgb3ZlcmZsb3dzIiwgT0ZGU0VUKGNvcnJlY3RfdHNfb3ZlcmZsb3cpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDF9LCAwLCAxLCBEfSwKLXsiZmx1c2hfcGFja2V0cyIsICJlbmFibGUgZmx1c2hpbmcgb2YgdGhlIEkvTyBjb250ZXh0IGFmdGVyIGVhY2ggcGFja2V0IiwgT0ZGU0VUKGZsdXNoX3BhY2tldHMpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDF9LCAwLCAxLCBFfSwKK3siZmx1c2hfcGFja2V0cyIsICJlbmFibGUgZmx1c2hpbmcgb2YgdGhlIEkvTyBjb250ZXh0IGFmdGVyIGVhY2ggcGFja2V0IiwgT0ZGU0VUKGZsdXNoX3BhY2tldHMpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCAtMSwgMSwgRX0sCiB7Im1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nIiwgInNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgd3JpdHRlbiBhcyBwYWRkaW5nIGluIGEgbWV0YWRhdGEgaGVhZGVyIiwgT0ZGU0VUKG1ldGFkYXRhX2hlYWRlcl9wYWRkaW5nKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IC0xfSwgLTEsIElOVF9NQVgsIEV9LAogeyJvdXRwdXRfdHNfb2Zmc2V0IiwgInNldCBvdXRwdXQgdGltZXN0YW1wIG9mZnNldCIsIE9GRlNFVChvdXRwdXRfdHNfb2Zmc2V0KSwgQVZfT1BUX1RZUEVfRFVSQVRJT04sIHsuaTY0ID0gMH0sIC1JTlQ2NF9NQVgsIElOVDY0X01BWCwgRX0sCiB7Im1heF9pbnRlcmxlYXZlX2RlbHRhIiwgIm1heGltdW0gYnVmZmVyaW5nIGR1cmF0aW9uIGZvciBpbnRlcmxlYXZpbmciLCBPRkZTRVQobWF4X2ludGVybGVhdmVfZGVsdGEpLCBBVl9PUFRfVFlQRV9JTlQ2NCwgeyAuaTY0ID0gMTAwMDAwMDAgfSwgMCwgSU5UNjRfTUFYLCBFIH0sCiB7ImZfc3RyaWN0IiwgImhvdyBzdHJpY3RseSB0byBmb2xsb3cgdGhlIHN0YW5kYXJkcyAoZGVwcmVjYXRlZDsgdXNlIHN0cmljdCwgc2F2ZSB2aWEgYXZjb252KSIsIE9GRlNFVChzdHJpY3Rfc3RkX2NvbXBsaWFuY2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBEfEUsICJzdHJpY3QifSwKIHsic3RyaWN0IiwgImhvdyBzdHJpY3RseSB0byBmb2xsb3cgdGhlIHN0YW5kYXJkcyIsIE9GRlNFVChzdHJpY3Rfc3RkX2NvbXBsaWFuY2UpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gREVGQVVMVCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBEfEUsICJzdHJpY3QifSwKK3sidmVyeSIsICJzdHJpY3RseSBjb25mb3JtIHRvIGEgb2xkZXIgbW9yZSBzdHJpY3QgdmVyc2lvbiBvZiB0aGUgc3BlYyBvciByZWZlcmVuY2Ugc29mdHdhcmUiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9DT01QTElBTkNFX1ZFUllfU1RSSUNUIH0sIElOVF9NSU4sIElOVF9NQVgsIER8RSwgInN0cmljdCJ9LAogeyJzdHJpY3QiLCAic3RyaWN0bHkgY29uZm9ybSB0byBhbGwgdGhlIHRoaW5ncyBpbiB0aGUgc3BlYyBubyBtYXR0ZXIgd2hhdCB0aGUgY29uc2VxdWVuY2VzIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfQ09NUExJQU5DRV9TVFJJQ1QgfSwgSU5UX01JTiwgSU5UX01BWCwgRHxFLCAic3RyaWN0In0sCiB7Im5vcm1hbCIsIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPTVBMSUFOQ0VfTk9STUFMIH0sIElOVF9NSU4sIElOVF9NQVgsIER8RSwgInN0cmljdCJ9LAogeyJ1bm9mZmljaWFsIiwgImFsbG93IHVub2ZmaWNpYWwgZXh0ZW5zaW9ucyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX0NPTVBMSUFOQ0VfVU5PRkZJQ0lBTCB9LCBJTlRfTUlOLCBJTlRfTUFYLCBEfEUsICJzdHJpY3QifSwKQEAgLTEwMSw2ICsxMDYsOCBAQAogeyJjb2RlY193aGl0ZWxpc3QiLCAiTGlzdCBvZiBkZWNvZGVycyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIHVzZWQiLCBPRkZTRVQoY29kZWNfd2hpdGVsaXN0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEQgfSwKIHsiZm9ybWF0X3doaXRlbGlzdCIsICJMaXN0IG9mIGRlbXV4ZXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCIsIE9GRlNFVChmb3JtYXRfd2hpdGVsaXN0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICBDSEFSX01JTiwgQ0hBUl9NQVgsIEQgfSwKIHsicHJvdG9jb2xfd2hpdGVsaXN0IiwgIkxpc3Qgb2YgcHJvdG9jb2xzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZCIsIE9GRlNFVChwcm90b2NvbF93aGl0ZWxpc3QpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgIENIQVJfTUlOLCBDSEFSX01BWCwgRCB9LAoreyJwcm90b2NvbF9ibGFja2xpc3QiLCAiTGlzdCBvZiBwcm90b2NvbHMgdGhhdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgdXNlZCIsIE9GRlNFVChwcm90b2NvbF9ibGFja2xpc3QpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgLnN0ciA9IE5VTEwgfSwgIENIQVJfTUlOLCBDSEFSX01BWCwgRCB9LAoreyJtYXhfc3RyZWFtcyIsICJtYXhpbXVtIG51bWJlciBvZiBzdHJlYW1zIiwgT0ZGU0VUKG1heF9zdHJlYW1zKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAxMDAwIH0sIDAsIElOVF9NQVgsIEQgfSwKIHtOVUxMfSwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L29zX3N1cHBvcnQuYyBiL2xpYmF2Zm9ybWF0L29zX3N1cHBvcnQuYwppbmRleCA4NmQwYjhmLi4wOTlkN2I1IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9vc19zdXBwb3J0LmMKKysrIGIvbGliYXZmb3JtYXQvb3Nfc3VwcG9ydC5jCkBAIC00Niw3ICs0Niw3IEBACiAjaWYgIUhBVkVfSU5FVF9BVE9OCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKLWludCBmZl9pbmV0X2F0b24oY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgaW5fYWRkciAqYWRkKQorc3RhdGljIGludCBpbmV0X2F0b24oY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgaW5fYWRkciAqYWRkKQogewogICAgIHVuc2lnbmVkIGludCBhZGQxID0gMCwgYWRkMiA9IDAsIGFkZDMgPSAwLCBhZGQ0ID0gMDsKIApAQCAtNjAsMTEgKzYwLDYgQEAKIAogICAgIHJldHVybiAxOwogfQotI2Vsc2UKLWludCBmZl9pbmV0X2F0b24oY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgaW5fYWRkciAqYWRkKQotewotICAgIHJldHVybiBpbmV0X2F0b24oc3RyLCBhZGQpOwotfQogI2VuZGlmIC8qICFIQVZFX0lORVRfQVRPTiAqLwogCiAjaWYgIUhBVkVfR0VUQUREUklORk8KQEAgLTc1LDE2ICs3MCw2IEBACiAgICAgc3RydWN0IGFkZHJpbmZvICphaTsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbjsKIAotI2lmIEhBVkVfV0lOU09DSzJfSAotICAgIGludCAoV1NBQVBJICp3aW5fZ2V0YWRkcmluZm8pKGNvbnN0IGNoYXIgKm5vZGUsIGNvbnN0IGNoYXIgKnNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGFkZHJpbmZvICpoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYWRkcmluZm8gKipyZXMpOwotICAgIEhNT0RVTEUgd3MybW9kID0gR2V0TW9kdWxlSGFuZGxlKCJ3czJfMzIuZGxsIik7Ci0gICAgd2luX2dldGFkZHJpbmZvID0gR2V0UHJvY0FkZHJlc3Mod3MybW9kLCAiZ2V0YWRkcmluZm8iKTsKLSAgICBpZiAod2luX2dldGFkZHJpbmZvKQotICAgICAgICByZXR1cm4gd2luX2dldGFkZHJpbmZvKG5vZGUsIHNlcnZpY2UsIGhpbnRzLCByZXMpOwotI2VuZGlmIC8qIEhBVkVfV0lOU09DSzJfSCAqLwotCiAgICAgKnJlcyA9IE5VTEw7CiAgICAgc2luICA9IGF2X21hbGxvY3ooc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbikpOwogICAgIGlmICghc2luKQpAQCAtOTIsNyArNzcsNyBAQAogICAgIHNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CiAKICAgICBpZiAobm9kZSkgewotICAgICAgICBpZiAoIWZmX2luZXRfYXRvbihub2RlLCAmc2luLT5zaW5fYWRkcikpIHsKKyAgICAgICAgaWYgKCFpbmV0X2F0b24obm9kZSwgJnNpbi0+c2luX2FkZHIpKSB7CiAgICAgICAgICAgICBpZiAoaGludHMgJiYgKGhpbnRzLT5haV9mbGFncyAmIEFJX05VTUVSSUNIT1NUKSkgewogICAgICAgICAgICAgICAgIGF2X2ZyZWUoc2luKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRUFJX0ZBSUw7CkBAIC0xNDgsMTcgKzEzMyw2IEBACiAKIHZvaWQgZmZfZnJlZWFkZHJpbmZvKHN0cnVjdCBhZGRyaW5mbyAqcmVzKQogewotI2lmIEhBVkVfV0lOU09DSzJfSAotICAgIHZvaWQgKFdTQUFQSSAqd2luX2ZyZWVhZGRyaW5mbykoc3RydWN0IGFkZHJpbmZvICpyZXMpOwotICAgIEhNT0RVTEUgd3MybW9kID0gR2V0TW9kdWxlSGFuZGxlKCJ3czJfMzIuZGxsIik7Ci0gICAgd2luX2ZyZWVhZGRyaW5mbyA9ICh2b2lkIChXU0FBUEkgKikoc3RydWN0IGFkZHJpbmZvICpyZXMpKQotICAgICAgICAgICAgICAgICAgICAgICBHZXRQcm9jQWRkcmVzcyh3czJtb2QsICJmcmVlYWRkcmluZm8iKTsKLSAgICBpZiAod2luX2ZyZWVhZGRyaW5mbykgewotICAgICAgICB3aW5fZnJlZWFkZHJpbmZvKHJlcyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYgLyogSEFWRV9XSU5TT0NLMl9IICovCi0KICAgICBhdl9mcmVlcCgmcmVzLT5haV9jYW5vbm5hbWUpOwogICAgIGF2X2ZyZWVwKCZyZXMtPmFpX2FkZHIpOwogICAgIGF2X2ZyZWVwKCZyZXMpOwpAQCAtMTcwLDE2ICsxNDQsNiBAQAogewogICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhOwogCi0jaWYgSEFWRV9XSU5TT0NLMl9ICi0gICAgaW50IChXU0FBUEkgKndpbl9nZXRuYW1laW5mbykoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSwgc29ja2xlbl90IHNhbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmhvc3QsIERXT1JEIGhvc3RsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqc2VydiwgRFdPUkQgc2VydmxlbiwgaW50IGZsYWdzKTsKLSAgICBITU9EVUxFIHdzMm1vZCA9IEdldE1vZHVsZUhhbmRsZSgid3MyXzMyLmRsbCIpOwotICAgIHdpbl9nZXRuYW1laW5mbyA9IEdldFByb2NBZGRyZXNzKHdzMm1vZCwgImdldG5hbWVpbmZvIik7Ci0gICAgaWYgKHdpbl9nZXRuYW1laW5mbykKLSAgICAgICAgcmV0dXJuIHdpbl9nZXRuYW1laW5mbyhzYSwgc2FsZW4sIGhvc3QsIGhvc3RsZW4sIHNlcnYsIHNlcnZsZW4sIGZsYWdzKTsKLSNlbmRpZiAvKiBIQVZFX1dJTlNPQ0syX0ggKi8KLQogICAgIGlmIChzYS0+c2FfZmFtaWx5ICE9IEFGX0lORVQpCiAgICAgICAgIHJldHVybiBFQUlfRkFNSUxZOwogICAgIGlmICghaG9zdCAmJiAhc2VydikKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L29zX3N1cHBvcnQuaCBiL2xpYmF2Zm9ybWF0L29zX3N1cHBvcnQuaAppbmRleCBhMzMyOTExLi43YTU2ZGM5IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9vc19zdXBwb3J0LmgKKysrIGIvbGliYXZmb3JtYXQvb3Nfc3VwcG9ydC5oCkBAIC00MCw3ICs0MCw3IEBACiAjZW5kaWYKICNlbmRpZgogCi0jaWYgZGVmaW5lZChfV0lOMzIpICYmICFkZWZpbmVkKF9fTUlOR1czMkNFX18pCisjaWZkZWYgX1dJTjMyCiAjICBpbmNsdWRlIDxmY250bC5oPgogIyAgaWZkZWYgbHNlZWsKICMgICB1bmRlZiBsc2VlawpAQCAtNTQsNyArNTQsNyBAQAogIyAgIHVuZGVmIGZzdGF0CiAjICBlbmRpZgogIyAgZGVmaW5lIGZzdGF0KGYscykgX2ZzdGF0aTY0KChmKSwgKHMpKQotI2VuZGlmIC8qIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJDRV9fKSAqLworI2VuZGlmIC8qIGRlZmluZWQoX1dJTjMyKSAqLwogCiAKICNpZmRlZiBfX0FORFJPSURfXwpAQCAtNzYsNyArNzYsNyBAQAogICAgIHJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChfX09TMl9fKSB8fCBkZWZpbmVkKF9fUGxhbjlfXykKKyNpZiBkZWZpbmVkKF9fT1MyX18pCiAjZGVmaW5lIFNIVVRfUkQgMAogI2RlZmluZSBTSFVUX1dSIDEKICNkZWZpbmUgU0hVVF9SRFdSIDIKQEAgLTEzOSwyNSArMTM5LDExIEBACiAjZW5kaWYgLyogSEFWRV9QT0xMX0ggKi8KICNlbmRpZiAvKiBDT05GSUdfTkVUV09SSyAqLwogCi0jaWYgZGVmaW5lZChfX01JTkdXMzJDRV9fKQotI2RlZmluZSBta2RpcihhLCBiKSBfbWtkaXIoYSkKLSNlbGlmIGRlZmluZWQoX1dJTjMyKQorI2lmZGVmIF9XSU4zMgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgImxpYmF2dXRpbC93Y2hhcl9maWxlbmFtZS5oIgogCi0jaWZkZWYgV0lOQVBJX0ZBTUlMWQotI2luY2x1ZGUgPHdpbmFwaWZhbWlseS5oPgotLy8gSWYgYSBXSU5BUElfRkFNSUxZIGlzIGRlZmluZWQsIGNoZWNrIHRoYXQgdGhlIGRlc2t0b3AgQVBJIHN1YnNldAotLy8gaXMgZW5hYmxlZAotI2lmIFdJTkFQSV9GQU1JTFlfUEFSVElUSU9OKFdJTkFQSV9QQVJUSVRJT05fREVTS1RPUCkKLSNkZWZpbmUgVVNFX01PVkVGSUxFRVhBCi0jZW5kaWYKLSNlbHNlCi0vLyBJZiBubyBXSU5BUElfRkFNSUxZIGlzIGRlZmluZWQsIGFzc3VtZSB0aGUgZnVsbCBBUEkgc3Vic2V0Ci0jZGVmaW5lIFVTRV9NT1ZFRklMRUVYQQotI2VuZGlmCi0KICNkZWZpbmUgREVGX0ZTX0ZVTkNUSU9OKG5hbWUsIHdmdW5jLCBhZnVuYykgICAgICAgICAgICAgICBcCiBzdGF0aWMgaW5saW5lIGludCB3aW4zMl8jI25hbWUoY29uc3QgY2hhciAqZmlsZW5hbWVfdXRmOCkgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE4Miw2ICsxNjgsMjkgQEAKIERFRl9GU19GVU5DVElPTihta2RpciwgIF93bWtkaXIsICBfbWtkaXIpCiBERUZfRlNfRlVOQ1RJT04ocm1kaXIsICBfd3JtZGlyICwgX3JtZGlyKQogCisjZGVmaW5lIERFRl9GU19GVU5DVElPTjIobmFtZSwgd2Z1bmMsIGFmdW5jLCBwYXJ0eXBlKSAgICAgXAorc3RhdGljIGlubGluZSBpbnQgd2luMzJfIyNuYW1lKGNvbnN0IGNoYXIgKmZpbGVuYW1lX3V0ZjgsIHBhcnR5cGUgcGFyKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdjaGFyX3QgKmZpbGVuYW1lX3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh1dGY4dG93Y2hhcihmaWxlbmFtZV91dGY4LCAmZmlsZW5hbWVfdykpICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFmaWxlbmFtZV93KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBnb3RvIGZhbGxiYWNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0ID0gd2Z1bmMoZmlsZW5hbWVfdywgcGFyKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF2X2ZyZWUoZmlsZW5hbWVfdyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gcmV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZmFsbGJhY2s6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaWxlbmFtZSBtYXkgYmUgYmUgaW4gQ1BfQUNQICovICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGFmdW5jKGZpbGVuYW1lX3V0ZjgsIHBhcik7ICAgICAgICAgICAgICAgICAgICAgXAorfQorCitERUZfRlNfRlVOQ1RJT04yKGFjY2VzcywgX3dhY2Nlc3MsIF9hY2Nlc3MsIGludCkKK0RFRl9GU19GVU5DVElPTjIoc3RhdCwgX3dzdGF0aTY0LCBfc3RhdGk2NCwgc3RydWN0IHN0YXQqKQorCiBzdGF0aWMgaW5saW5lIGludCB3aW4zMl9yZW5hbWUoY29uc3QgY2hhciAqc3JjX3V0ZjgsIGNvbnN0IGNoYXIgKmRlc3RfdXRmOCkKIHsKICAgICB3Y2hhcl90ICpzcmNfdywgKmRlc3RfdzsKQEAgLTIwOSw3ICsyMTgsNyBAQAogCiBmYWxsYmFjazoKICAgICAvKiBmaWxlbmFtZSBtYXkgYmUgYmUgaW4gQ1BfQUNQICovCi0jaWZkZWYgVVNFX01PVkVGSUxFRVhBCisjaWYgIUhBVkVfVVdQCiAgICAgcmV0ID0gTW92ZUZpbGVFeEEoc3JjX3V0ZjgsIGRlc3RfdXRmOCwgTU9WRUZJTEVfUkVQTEFDRV9FWElTVElORyk7CiAgICAgaWYgKHJldCkKICAgICAgICAgZXJybm8gPSBFUEVSTTsKQEAgLTIzMSw2ICsyNDAsNyBAQAogI2RlZmluZSByZW5hbWUgICAgICB3aW4zMl9yZW5hbWUKICNkZWZpbmUgcm1kaXIgICAgICAgd2luMzJfcm1kaXIKICNkZWZpbmUgdW5saW5rICAgICAgd2luMzJfdW5saW5rCisjZGVmaW5lIGFjY2VzcyAgICAgIHdpbjMyX2FjY2VzcwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcGFmLmMgYi9saWJhdmZvcm1hdC9wYWYuYwppbmRleCA0ZmM1MDA2Li5mYTMwY2RkIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9wYWYuYworKysgYi9saWJhdmZvcm1hdC9wYWYuYwpAQCAtMTA0LDEzICsxMDQsMTMgQEAKICAgICBwLT5uYl9mcmFtZXMgICAgPSBhdmlvX3JsMzIocGIpOwogICAgIGF2aW9fc2tpcChwYiwgNCk7CiAKLSAgICB2c3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JsMzIocGIpOwotICAgIHZzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CisgICAgdnN0LT5jb2RlY3Bhci0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKKyAgICB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBhdmlvX3JsMzIocGIpOwogICAgIGF2aW9fc2tpcChwYiwgNCk7CiAKLSAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9QQUZfVklERU87CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gMDsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUEFGX1ZJREVPOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgMSwgMTApOwogCiAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKQEAgLTExOCwxMiArMTE4LDEyIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBhc3QtPnN0YXJ0X3RpbWUgICAgICAgICAgICA9IDA7Ci0gICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgYXN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgPSAwOwotICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgID0gQVZfQ09ERUNfSURfUEFGX0FVRElPOwotICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICBhc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87Ci0gICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgPSAyMjA1MDsKKyAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICAgICA9IDA7CisgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9QQUZfQVVESU87CisgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICA9IDIyMDUwOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgMjIwNTApOwogCiAgICAgcC0+YnVmZmVyX3NpemUgICAgPSBhdmlvX3JsMzIocGIpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcGNtLmMgYi9saWJhdmZvcm1hdC9wY20uYwppbmRleCBmNjIwNzVmLi43NjdiYmQwIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9wY20uYworKysgYi9saWJhdmZvcm1hdC9wY20uYwpAQCAtMjgsMTMgKzI4LDIwIEBACiAKIGludCBmZl9wY21fcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQogeworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKICAgICBpbnQgcmV0LCBzaXplOwogCi0gICAgc2l6ZT0gUkFXX1NBTVBMRVMqcy0+c3RyZWFtc1swXS0+Y29kZWMtPmJsb2NrX2FsaWduOwotICAgIGlmIChzaXplIDw9IDApCisgICAgaWYgKHBhci0+YmxvY2tfYWxpZ24gPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIAotICAgIHJldD0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBzaXplKTsKKyAgICAvKgorICAgICAqIENvbXB1dGUgcmVhZCBzaXplIHRvIGNvbXBsZXRlIGEgcmVhZCBldmVyeSA2Mm1zLgorICAgICAqIENsYW1wIHRvIFJBV19TQU1QTEVTIGlmIGxhcmdlci4KKyAgICAgKi8KKyAgICBzaXplID0gRkZNQVgocGFyLT5zYW1wbGVfcmF0ZS8yNSwgMSk7CisgICAgc2l6ZSA9IEZGTUlOKHNpemUsIFJBV19TQU1QTEVTKSAqIHBhci0+YmxvY2tfYWxpZ247CisKKyAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOwogCiAgICAgcGt0LT5mbGFncyAmPSB+QVZfUEtUX0ZMQUdfQ09SUlVQVDsKICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CkBAIC01MSwxMCArNTgsMTAgQEAKIAogICAgIHN0ID0gcy0+c3RyZWFtc1swXTsKIAotICAgIGJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA/IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gOgotICAgICAgICAoYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMpID4+IDM7Ci0gICAgYnl0ZV9yYXRlID0gc3QtPmNvZGVjLT5iaXRfcmF0ZSA/IHN0LT5jb2RlYy0+Yml0X3JhdGUgPj4gMyA6Ci0gICAgICAgIGJsb2NrX2FsaWduICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICBibG9ja19hbGlnbiA9IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPyBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduIDoKKyAgICAgICAgKGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCkgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKSA+PiAzOworICAgIGJ5dGVfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPyBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID4+IDMgOgorICAgICAgICBibG9ja19hbGlnbiAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGU7CiAKICAgICBpZiAoYmxvY2tfYWxpZ24gPD0gMCB8fCBieXRlX3JhdGUgPD0gMCkKICAgICAgICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcGNtZGVjLmMgYi9saWJhdmZvcm1hdC9wY21kZWMuYwppbmRleCAyNTg0YzMzLi5kMGNlZWE2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9wY21kZWMuYworKysgYi9saWJhdmZvcm1hdC9wY21kZWMuYwpAQCAtMzYsMjYgKzM2LDU3IEBACiB7CiAgICAgUENNQXVkaW9EZW11eGVyQ29udGV4dCAqczEgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZTdHJlYW0gKnN0OworICAgIHVpbnQ4X3QgKm1pbWVfdHlwZSA9IE5VTEw7CiAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzMS0+c2FtcGxlX3JhdGU7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IHMxLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHMxLT5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gczEtPmNoYW5uZWxzOwogCi0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPQotICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgIGF2X29wdF9nZXQocy0+cGIsICJtaW1lX3R5cGUiLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOLCAmbWltZV90eXBlKTsKKyAgICBpZiAobWltZV90eXBlICYmIHMtPmlmb3JtYXQtPm1pbWVfdHlwZSkgeworICAgICAgICBpbnQgcmF0ZSA9IDAsIGNoYW5uZWxzID0gMDsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihzLT5pZm9ybWF0LT5taW1lX3R5cGUpOworICAgICAgICBpZiAoIXN0cm5jbXAocy0+aWZvcm1hdC0+bWltZV90eXBlLCBtaW1lX3R5cGUsIGxlbikpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKm9wdGlvbnMgPSBtaW1lX3R5cGUgKyBsZW47CisgICAgICAgICAgICBsZW4gPSBzdHJsZW4obWltZV90eXBlKTsKKyAgICAgICAgICAgIHdoaWxlIChvcHRpb25zIDwgbWltZV90eXBlICsgbGVuKSB7CisgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHN0cnN0cihvcHRpb25zLCAiOyIpOworICAgICAgICAgICAgICAgIGlmICghb3B0aW9ucysrKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAoIXJhdGUpCisgICAgICAgICAgICAgICAgICAgIHNzY2FuZihvcHRpb25zLCAiIHJhdGU9JWQiLCAgICAgJnJhdGUpOworICAgICAgICAgICAgICAgIGlmICghY2hhbm5lbHMpCisgICAgICAgICAgICAgICAgICAgIHNzY2FuZihvcHRpb25zLCAiIGNoYW5uZWxzPSVkIiwgJmNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyYXRlIDw9IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBzYW1wbGVfcmF0ZSBmb3VuZCBpbiBtaW1lX3R5cGUgXCIlc1wiXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBtaW1lX3R5cGUpOworICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZtaW1lX3R5cGUpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHJhdGU7CisgICAgICAgICAgICBpZiAoY2hhbm5lbHMgPiAwKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlcCgmbWltZV90eXBlKTsKIAotICAgIGF2X2Fzc2VydDAoc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPiAwKTsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9CisgICAgICAgIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCk7CiAKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0KLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzIC8gODsKKyAgICBhdl9hc3NlcnQwKHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID4gMCk7CiAKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjcGFyLT5jaGFubmVscyAvIDg7CisKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTY1LDcgKzk2LDcgQEAKICAgICB7IE5VTEwgfSwKIH07CiAKLSNkZWZpbmUgUENNREVGKG5hbWVfLCBsb25nX25hbWVfLCBleHQsIGNvZGVjKSAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgUENNREVGKG5hbWVfLCBsb25nX25hbWVfLCBleHQsIGNvZGVjLCAuLi4pICAgICAgICAgIFwKIHN0YXRpYyBjb25zdCBBVkNsYXNzIG5hbWVfICMjIF9kZW11eGVyX2NsYXNzID0geyAgICAgICAgICAgIFwKICAgICAuY2xhc3NfbmFtZSA9ICNuYW1lXyAiIGRlbXV4ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLCAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTgzLDYgKzExNCw3IEBACiAgICAgLmV4dGVuc2lvbnMgICAgID0gZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgLnJhd19jb2RlY19pZCAgID0gY29kZWMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgLnByaXZfY2xhc3MgICAgID0gJm5hbWVfICMjIF9kZW11eGVyX2NsYXNzLCAgICAgICAgICAgICBcCisgICAgX19WQV9BUkdTX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9OwogCiBQQ01ERUYoZjY0YmUsICJQQ00gNjQtYml0IGZsb2F0aW5nLXBvaW50IGJpZy1lbmRpYW4iLApAQCAtMTEzLDcgKzE0NSw3IEBACiAgICAgICAgQVZfTkUoInN3IiwgTlVMTCksIEFWX0NPREVDX0lEX1BDTV9TMTZCRSkKIAogUENNREVGKHMxNmxlLCAiUENNIHNpZ25lZCAxNi1iaXQgbGl0dGxlLWVuZGlhbiIsCi0gICAgICAgQVZfTkUoTlVMTCwgInN3IiksIEFWX0NPREVDX0lEX1BDTV9TMTZMRSkKKyAgICAgICBBVl9ORShOVUxMLCAic3ciKSwgQVZfQ09ERUNfSURfUENNX1MxNkxFLCAubWltZV90eXBlID0gImF1ZGlvL0wxNiIsKQogCiBQQ01ERUYoczgsICJQQ00gc2lnbmVkIDgtYml0IiwKICAgICAgICAic2IiLCBBVl9DT0RFQ19JRF9QQ01fUzgpCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9wanNkZWMuYyBiL2xpYmF2Zm9ybWF0L3Bqc2RlYy5jCmluZGV4IGE4OGQ1MzMuLmJiNTg3YjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Bqc2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3Bqc2RlYy5jCkBAIC03MCw4ICs3MCw4IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTApOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9QSlM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1BKUzsKIAogICAgIHdoaWxlICghYXZpb19mZW9mKHMtPnBiKSkgewogICAgICAgICBjaGFyIGxpbmVbNDA5Nl07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9wbXBkZWMuYyBiL2xpYmF2Zm9ybWF0L3BtcGRlYy5jCmluZGV4IGVjOTY2YjMuLjBlODBhMDkgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3BtcGRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3BtcGRlYy5jCkBAIC01NCwyMiArNTQsMjIgQEAKICAgICBBVlN0cmVhbSAqdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXZzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CiAgICAgYXZpb19za2lwKHBiLCA4KTsKICAgICBzd2l0Y2ggKGF2aW9fcmwzMihwYikpIHsKICAgICBjYXNlIDA6Ci0gICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVBFRzQ7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVBFRzQ7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMToKLSAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IMjY0OworICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0gyNjQ7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCB2aWRlbyBmb3JtYXRcbiIpOwogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgaW5kZXhfY250ID0gYXZpb19ybDMyKHBiKTsKLSAgICB2c3QtPmNvZGVjLT53aWR0aCAgPSBhdmlvX3JsMzIocGIpOwotICAgIHZzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CisgICAgaW5kZXhfY250ICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICB2c3QtPmNvZGVjcGFyLT53aWR0aCAgPSBhdmlvX3JsMzIocGIpOworICAgIHZzdC0+Y29kZWNwYXItPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CiAKICAgICB0Yl9udW0gPSBhdmlvX3JsMzIocGIpOwogICAgIHRiX2RlbiA9IGF2aW9fcmwzMihwYik7CkBAIC0xMTcsMTAgKzExNywxMCBAQAogICAgICAgICBBVlN0cmVhbSAqYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICAgICAgaWYgKCFhc3QpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IGF1ZGlvX2NvZGVjX2lkOwotICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyA9IGNoYW5uZWxzOwotICAgICAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNyYXRlOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBhdWRpb19jb2RlY19pZDsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDMyLCAxLCBzcmF0ZSk7CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcHJvbXBlZy5jIGIvbGliYXZmb3JtYXQvcHJvbXBlZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzBhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9wcm9tcGVnLmMKQEAgLTAsMCArMSw0ODEgQEAKKy8qCisgKiBQcm8tTVBFRyBDb2RlIG9mIFByYWN0aWNlICMzIFJlbGVhc2UgMiBGRUMKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNb2JpYmFzZSwgRnJhbmNlIChodHRwOi8vd3d3Lm1vYmliYXNlLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogUHJvLU1QRUcgQ29kZSBvZiBQcmFjdGljZSAjMyBSZWxlYXNlIDIgRkVDIHByb3RvY29sCisgKiBAYXV0aG9yIFZsYWQgVGFyY2EgPHZsYWQudGFyY2FAZ21haWwuY29tPgorICovCisKKy8qCisgKiBSZW1pbmRlcjoKKworIFtSRkMgMjczM10gRkVDIFBhY2tldCBTdHJ1Y3R1cmUKKworICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgUlRQIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBGRUMgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIEZFQyBQYXlsb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKworIFtSRkMgMzU1MF0gUlRQIGhlYWRlcgorCisgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHxWPTJ8UHxYfCAgQ0MgICB8TXwgICAgIFBUICAgICAgfCAgICAgICBzZXF1ZW5jZSBudW1iZXIgICAgICAgICB8CisgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB8ICAgICAgICAgICBzeW5jaHJvbml6YXRpb24gc291cmNlIChTU1JDKSBpZGVudGlmaWVyICAgICAgICAgICAgfAorICAgKz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSs9Kz0rPSsKKyAgIHwgICAgICAgICAgICBjb250cmlidXRpbmcgc291cmNlIChDU1JDKSBpZGVudGlmaWVycyAgICAgICAgICAgICB8CisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworIFtSRkMgMzU1MF0gUlRQIGhlYWRlciBleHRlbnNpb24gKGFmdGVyIENTUkMpCisKKyAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgfCAgICAgIGRlZmluZWQgYnkgcHJvZmlsZSAgICAgICB8ICAgICAgICAgICBsZW5ndGggICAgICAgICAgICAgIHwKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB8ICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyIGV4dGVuc2lvbiAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKyBbUHJvLU1QRUcgQ09QM10gRkVDIEhlYWRlcgorCisgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgfCAgICAgIFNOQmFzZSBsb3cgYml0cyAgICAgICAgICB8ICAgICAgICBsZW5ndGggcmVjb3ZlcnkgICAgICAgIHwKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICB8RXwgUFQgcmVjb3ZlcnkgfCAgICAgICAgICAgICAgICAgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFRTIHJlY292ZXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgfFh8RHx0eXBlIHxpbmRleHwgICAgb2Zmc2V0ICAgICB8ICAgICAgTkEgICAgICAgfFNOQmFzZSBleHQgYml0c3wKKyAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAidXJsLmgiCisKKyNkZWZpbmUgUFJPTVBFR19SVFBfUFQgMHg2MAorI2RlZmluZSBQUk9NUEVHX0ZFQ19DT0wgMHgwCisjZGVmaW5lIFBST01QRUdfRkVDX1JPVyAweDEKKwordHlwZWRlZiBzdHJ1Y3QgUHJvbXBlZ0ZlYyB7CisgICAgdWludDE2X3Qgc247CisgICAgdWludDMyX3QgdHM7CisgICAgdWludDhfdCAqYml0c3RyaW5nOworfSBQcm9tcGVnRmVjOworCit0eXBlZGVmIHN0cnVjdCBQcm9tcGVnQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgVVJMQ29udGV4dCAqZmVjX2NvbF9oZCwgKmZlY19yb3dfaGQ7CisgICAgUHJvbXBlZ0ZlYyAqKmZlY19hcnIsICoqZmVjX2NvbF90bXAsICoqZmVjX2NvbCwgKmZlY19yb3c7CisgICAgaW50IHR0bDsKKyAgICB1aW50OF90IGwsIGQ7CisgICAgdWludDhfdCAqcnRwX2J1ZjsKKyAgICB1aW50MTZfdCBydHBfY29sX3NuLCBydHBfcm93X3NuOworICAgIHVpbnQxNl90IGxlbmd0aF9yZWNvdmVyeTsKKyAgICBpbnQgcGFja2V0X3NpemU7CisgICAgaW50IHBhY2tldF9pZHgsIHBhY2tldF9pZHhfbWF4OworICAgIGludCBmZWNfYXJyX2xlbjsKKyAgICBpbnQgYml0c3RyaW5nX3NpemU7CisgICAgaW50IHJ0cF9idWZfc2l6ZTsKKyAgICBpbnQgaW5pdDsKKyAgICBpbnQgZmlyc3Q7Cit9IFByb21wZWdDb250ZXh0OworCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihQcm9tcGVnQ29udGV4dCwgeCkKKyNkZWZpbmUgRSBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTQorCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgIHsgInR0bCIsICAgIlRpbWUgdG8gbGl2ZSAoaW4gbWlsbGlzZWNvbmRzLCBtdWx0aWNhc3Qgb25seSkiLCBPRkZTRVQodHRsKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAtMSwgSU5UX01BWCwgLmZsYWdzID0gRSB9LAorICAgIHsgImwiLCAiRkVDIEwiLCBPRkZTRVQobCksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gIDUgfSwgNCwgMjAsIC5mbGFncyA9IEUgfSwKKyAgICB7ICJkIiwgIkZFQyBEIiwgT0ZGU0VUKGQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9ICA1IH0sIDQsIDIwLCAuZmxhZ3MgPSBFIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHByb21wZWdfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAicHJvbXBlZyIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICA9IG9wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgdm9pZCB4b3JfZmFzdChjb25zdCB1aW50OF90ICppbjEsIGNvbnN0IHVpbnQ4X3QgKmluMiwgdWludDhfdCAqb3V0LCBpbnQgc2l6ZSkgeworICAgIGludCBpLCBuLCBzOworCisjaWYgSEFWRV9GQVNUXzY0QklUCisgICAgdWludDY0X3QgdjEsIHYyOworCisgICAgbiA9IHNpemUgLyBzaXplb2YgKHVpbnQ2NF90KTsKKyAgICBzID0gbiAqIHNpemVvZiAodWludDY0X3QpOworCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICB2MSA9IEFWX1JONjRBKGluMSk7CisgICAgICAgIHYyID0gQVZfUk42NEEoaW4yKTsKKyAgICAgICAgQVZfV042NEEob3V0LCB2MSBeIHYyKTsKKyAgICAgICAgaW4xICs9IDg7CisgICAgICAgIGluMiArPSA4OworICAgICAgICBvdXQgKz0gODsKKyAgICB9CisjZWxzZQorICAgIHVpbnQzMl90IHYxLCB2MjsKKworICAgIG4gPSBzaXplIC8gc2l6ZW9mICh1aW50MzJfdCk7CisgICAgcyA9IG4gKiBzaXplb2YgKHVpbnQzMl90KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgdjEgPSBBVl9STjMyQShpbjEpOworICAgICAgICB2MiA9IEFWX1JOMzJBKGluMik7CisgICAgICAgIEFWX1dOMzJBKG91dCwgdjEgXiB2Mik7CisgICAgICAgIGluMSArPSA0OworICAgICAgICBpbjIgKz0gNDsKKyAgICAgICAgb3V0ICs9IDQ7CisgICAgfQorI2VuZGlmCisKKyAgICBuID0gc2l6ZSAtIHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIG91dFtpXSA9IGluMVtpXSBeIGluMltpXTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcHJvbXBlZ19jcmVhdGVfYml0c3RyaW5nKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgIHVpbnQ4X3QgKipiaXRzdHJpbmcpIHsKKyAgICBQcm9tcGVnQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICB1aW50OF90ICpiOworCisgICAgaWYgKHNpemUgPCAxMiB8fCAoYnVmWzBdICYgMHhjMCkgIT0gMHg4MCB8fCAoYnVmWzFdICYgMHg3ZikgIT0gMHgyMSkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc3RyZWFtIGZvcm1hdCAoZXhwZWN0ZWQgTVBFRy1UUyBvdmVyIFJUUClcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoc2l6ZSAhPSBzLT5wYWNrZXRfc2l6ZSkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiVGhlIFJUUCBwYWNrZXQgc2l6ZSBtdXN0IGJlIGNvbnN0YW50IChzZXQgcGt0X3NpemUpXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICAqYml0c3RyaW5nID0gYXZfbWFsbG9jKHMtPmJpdHN0cmluZ19zaXplKTsKKyAgICBpZiAoISpiaXRzdHJpbmcpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgYml0c3RyaW5nIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorICAgIGIgPSAqYml0c3RyaW5nOworCisgICAgLy8gUCwgWCwgQ0MKKyAgICBiWzBdID0gYnVmWzBdICYgMHgzZjsKKyAgICAvLyBNLCBQVAorICAgIGJbMV0gPSBidWZbMV07CisgICAgLy8gVGltZXN0YW1wCisgICAgYlsyXSA9IGJ1Zls0XTsKKyAgICBiWzNdID0gYnVmWzVdOworICAgIGJbNF0gPSBidWZbNl07CisgICAgYls1XSA9IGJ1Zls3XTsKKyAgICAvKgorICAgICAqIGxlbmd0aF9yZWNvdmVyeTogdGhlIHVuc2lnbmVkIG5ldHdvcmstb3JkZXJlZCBzdW0gb2YgbGVuZ3RocyBvZiBDU1JDLAorICAgICAqIHBhZGRpbmcsIGV4dGVuc2lvbiBhbmQgbWVkaWEgcGF5bG9hZAorICAgICAqLworICAgIEFWX1dCMTYoYiArIDYsIHMtPmxlbmd0aF9yZWNvdmVyeSk7CisgICAgLy8gUGF5bG9hZAorICAgIG1lbWNweShiICsgOCwgYnVmICsgMTIsIHMtPmxlbmd0aF9yZWNvdmVyeSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9tcGVnX3dyaXRlX2ZlYyhVUkxDb250ZXh0ICpoLCBQcm9tcGVnRmVjICpmZWMsIHVpbnQ4X3QgdHlwZSkgeworICAgIFByb21wZWdDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIFVSTENvbnRleHQgKmhkOworICAgIHVpbnQ4X3QgKmJ1ZiA9IHMtPnJ0cF9idWY7IC8vIHplcm8tZmlsbGVkCisgICAgdWludDhfdCAqYiA9IGZlYy0+Yml0c3RyaW5nOworICAgIHVpbnQxNl90IHNuOworICAgIGludCByZXQ7CisKKyAgICBzbiA9IHR5cGUgPT0gUFJPTVBFR19GRUNfQ09MID8gKytzLT5ydHBfY29sX3NuIDogKytzLT5ydHBfcm93X3NuOworCisgICAgLy8gViwgUCwgWCwgQ0MKKyAgICBidWZbMF0gPSAweDgwIHwgKGJbMF0gJiAweDNmKTsKKyAgICAvLyBNLCBQVAorICAgIGJ1ZlsxXSA9IChiWzFdICYgMHg4MCkgfCBQUk9NUEVHX1JUUF9QVDsKKyAgICAvLyBTTgorICAgIEFWX1dCMTYoYnVmICsgMiwgc24pOworICAgIC8vIFRTCisgICAgQVZfV0IzMihidWYgKyA0LCBmZWMtPnRzKTsKKyAgICAvLyBDU1JDPTAKKyAgICAvL0FWX1dCMzIoYnVmICsgOCwgMCk7CisgICAgLy8gU05CYXNlIGxvdyBiaXRzCisgICAgQVZfV0IxNihidWYgKyAxMiwgZmVjLT5zbik7CisgICAgLy8gTGVuZ3RoIHJlY292ZXJ5CisgICAgYnVmWzE0XSA9IGJbNl07CisgICAgYnVmWzE1XSA9IGJbN107CisgICAgLy8gRT0xLCBQVCByZWNvdmVyeQorICAgIGJ1ZlsxNl0gPSAweDgwIHwgYlsxXTsKKyAgICAvLyBNYXNrPTAKKyAgICAvL2J1ZlsxN10gPSAweDA7CisgICAgLy9idWZbMThdID0gMHgwOworICAgIC8vYnVmWzE5XSA9IDB4MDsKKyAgICAvLyBUUyByZWNvdmVyeQorICAgIGJ1ZlsyMF0gPSBiWzJdOworICAgIGJ1ZlsyMV0gPSBiWzNdOworICAgIGJ1ZlsyMl0gPSBiWzRdOworICAgIGJ1ZlsyM10gPSBiWzVdOworICAgIC8vIFg9MCwgRCwgdHlwZT0wLCBpbmRleD0wCisgICAgYnVmWzI0XSA9IHR5cGUgPT0gUFJPTVBFR19GRUNfQ09MID8gMHgwIDogMHg0MDsKKyAgICAvLyBvZmZzZXQKKyAgICBidWZbMjVdID0gdHlwZSA9PSBQUk9NUEVHX0ZFQ19DT0wgPyBzLT5sIDogMHgxOworICAgIC8vIE5BCisgICAgYnVmWzI2XSA9IHR5cGUgPT0gUFJPTVBFR19GRUNfQ09MID8gcy0+ZCA6IHMtPmw7CisgICAgLy8gU05CYXNlIGV4dCBiaXRzPTAKKyAgICAvL2J1ZlsyN10gPSAweDA7CisgICAgLy8gUGF5bG9hZAorICAgIG1lbWNweShidWYgKyAyOCwgYiArIDgsIHMtPmxlbmd0aF9yZWNvdmVyeSk7CisKKyAgICBoZCA9IHR5cGUgPT0gUFJPTVBFR19GRUNfQ09MID8gcy0+ZmVjX2NvbF9oZCA6IHMtPmZlY19yb3dfaGQ7CisgICAgcmV0ID0gZmZ1cmxfd3JpdGUoaGQsIGJ1Ziwgcy0+cnRwX2J1Zl9zaXplKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHByb21wZWdfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncykgeworICAgIFByb21wZWdDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIEFWRGljdGlvbmFyeSAqdWRwX29wdHMgPSBOVUxMOworICAgIGludCBydHBfcG9ydDsKKyAgICBjaGFyIGhvc3RuYW1lWzI1Nl07CisgICAgY2hhciBidWZbMTAyNF07CisKKyAgICBzLT5mZWNfY29sX2hkID0gTlVMTDsKKyAgICBzLT5mZWNfcm93X2hkID0gTlVMTDsKKworICAgIGlmIChzLT5sICogcy0+ZCA+IDEwMCkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiTCAqIEQgbXVzdCBiZSA8PSAxMDBcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0bmFtZSwgc2l6ZW9mIChob3N0bmFtZSksICZydHBfcG9ydCwKKyAgICAgICAgICAgIE5VTEwsIDAsIHVyaSk7CisKKyAgICBpZiAocnRwX3BvcnQgPCAxIHx8IHJ0cF9wb3J0ID4gVUlOVDE2X01BWCAtIDQpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgUlRQIGJhc2UgcG9ydCAlZFxuIiwgcnRwX3BvcnQpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmIChzLT50dGwgPiAwKSB7CisgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mIChidWYpLCAiJWQiLCBzLT50dGwpOworICAgICAgICBhdl9kaWN0X3NldCgmdWRwX29wdHMsICJ0dGwiLCBidWYsIDApOworICAgIH0KKworICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mIChidWYpLCAidWRwIiwgTlVMTCwgaG9zdG5hbWUsIHJ0cF9wb3J0ICsgMiwgTlVMTCk7CisgICAgaWYgKGZmdXJsX29wZW5fd2hpdGVsaXN0KCZzLT5mZWNfY29sX2hkLCBidWYsIGZsYWdzLCAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLAorICAgICAgICAgICAgJnVkcF9vcHRzLCBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaCkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgZmZfdXJsX2pvaW4oYnVmLCBzaXplb2YgKGJ1ZiksICJ1ZHAiLCBOVUxMLCBob3N0bmFtZSwgcnRwX3BvcnQgKyA0LCBOVUxMKTsKKyAgICBpZiAoZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJnMtPmZlY19yb3dfaGQsIGJ1ZiwgZmxhZ3MsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssCisgICAgICAgICAgICAmdWRwX29wdHMsIGgtPnByb3RvY29sX3doaXRlbGlzdCwgaC0+cHJvdG9jb2xfYmxhY2tsaXN0LCBoKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGgtPm1heF9wYWNrZXRfc2l6ZSA9IHMtPmZlY19jb2xfaGQtPm1heF9wYWNrZXRfc2l6ZTsKKyAgICBzLT5pbml0ID0gMTsKKworICAgIGF2X2RpY3RfZnJlZSgmdWRwX29wdHMpOworICAgIGF2X2xvZyhoLCBBVl9MT0dfSU5GTywgIlByb01QRUcgQ29QIzMtUjIgRkVDIEw9JWQgRD0lZFxuIiwgcy0+bCwgcy0+ZCk7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZmZ1cmxfY2xvc2VwKCZzLT5mZWNfY29sX2hkKTsKKyAgICBmZnVybF9jbG9zZXAoJnMtPmZlY19yb3dfaGQpOworICAgIGF2X2RpY3RfZnJlZSgmdWRwX29wdHMpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvbXBlZ19pbml0KFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpIHsKKyAgICBQcm9tcGVnQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICB1aW50MzJfdCBzZWVkOworICAgIGludCBpOworCisgICAgcy0+ZmVjX2FyciA9IE5VTEw7CisgICAgcy0+cnRwX2J1ZiA9IE5VTEw7CisKKyAgICBpZiAoc2l6ZSA8IDEyIHx8IHNpemUgPiBVSU5UMTZfTUFYICsgMTIpIHsKKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgUlRQIHBhY2tldCBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcy0+cGFja2V0X2lkeCA9IDA7CisgICAgcy0+cGFja2V0X2lkeF9tYXggPSBzLT5sICogcy0+ZDsKKyAgICBzLT5wYWNrZXRfc2l6ZSA9IHNpemU7CisgICAgcy0+bGVuZ3RoX3JlY292ZXJ5ID0gc2l6ZSAtIDEyOworICAgIHMtPnJ0cF9idWZfc2l6ZSA9IDI4ICsgcy0+bGVuZ3RoX3JlY292ZXJ5OyAvLyAxMiArIDE2OiBSVFAgKyBGRUMgaGVhZGVycworICAgIHMtPmJpdHN0cmluZ19zaXplID0gOCArIHMtPmxlbmd0aF9yZWNvdmVyeTsgLy8gODogUCwgWCwgQ0MsIE0sIFBULCBTTiwgVFMKKyAgICBzLT5mZWNfYXJyX2xlbiA9IDEgKyAyICogcy0+bDsgLy8gcm93ICsgY29sdW1uIHRtcCArIGNvbHVtbiBvdXQKKworICAgIGlmIChoLT5mbGFncyAmIEFWRk1UX0ZMQUdfQklURVhBQ1QpIHsKKyAgICAgICAgcy0+cnRwX2NvbF9zbiA9IDA7CisgICAgICAgIHMtPnJ0cF9yb3dfc24gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlZWQgPSBhdl9nZXRfcmFuZG9tX3NlZWQoKTsKKyAgICAgICAgcy0+cnRwX2NvbF9zbiA9IHNlZWQgJiAweDBmZmY7CisgICAgICAgIHMtPnJ0cF9yb3dfc24gPSAoc2VlZCA+PiAxNikgJiAweDBmZmY7CisgICAgfQorCisgICAgcy0+ZmVjX2FyciA9IGF2X21hbGxvY19hcnJheShzLT5mZWNfYXJyX2xlbiwgc2l6ZW9mIChQcm9tcGVnRmVjKikpOworICAgIGlmICghcy0+ZmVjX2FycikgeworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mZWNfYXJyX2xlbjsgaSsrKSB7CisgICAgICAgIHMtPmZlY19hcnJbaV0gPSBhdl9tYWxsb2Moc2l6ZW9mIChQcm9tcGVnRmVjKSk7CisgICAgICAgIGlmICghcy0+ZmVjX2FycltpXSkgeworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHMtPmZlY19hcnJbaV0tPmJpdHN0cmluZyA9IGF2X21hbGxvY19hcnJheShzLT5iaXRzdHJpbmdfc2l6ZSwgc2l6ZW9mICh1aW50OF90KSk7CisgICAgICAgIGlmICghcy0+ZmVjX2FycltpXS0+Yml0c3RyaW5nKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+ZmVjX2FycltpXSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisgICAgcy0+ZmVjX3JvdyA9ICpzLT5mZWNfYXJyOworICAgIHMtPmZlY19jb2wgPSBzLT5mZWNfYXJyICsgMTsKKyAgICBzLT5mZWNfY29sX3RtcCA9IHMtPmZlY19hcnIgKyAxICsgcy0+bDsKKworICAgIHMtPnJ0cF9idWYgPSBhdl9tYWxsb2NfYXJyYXkocy0+cnRwX2J1Zl9zaXplLCBzaXplb2YgKHVpbnQ4X3QpKTsKKyAgICBpZiAoIXMtPnJ0cF9idWYpIHsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBtZW1zZXQocy0+cnRwX2J1ZiwgMCwgcy0+cnRwX2J1Zl9zaXplKTsKKworICAgIHMtPmluaXQgPSAwOworICAgIHMtPmZpcnN0ID0gMTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIEZFQyBidWZmZXJcbiIpOworICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Cit9CisKK3N0YXRpYyBpbnQgcHJvbXBlZ193cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKSB7CisgICAgUHJvbXBlZ0NvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7CisgICAgUHJvbXBlZ0ZlYyAqZmVjX3RtcDsKKyAgICB1aW50OF90ICpiaXRzdHJpbmcgPSBOVUxMOworICAgIGludCBjb2xfaWR4LCBjb2xfb3V0X2lkeCwgcm93X2lkeDsKKyAgICBpbnQgcmV0LCB3cml0dGVuID0gMDsKKworICAgIGlmIChzLT5pbml0ICYmICgocmV0ID0gcHJvbXBlZ19pbml0KGgsIGJ1Ziwgc2l6ZSkpIDwgMCkpCisgICAgICAgIGdvdG8gZW5kOworCisgICAgaWYgKChyZXQgPSBwcm9tcGVnX2NyZWF0ZV9iaXRzdHJpbmcoaCwgYnVmLCBzaXplLCAmYml0c3RyaW5nKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIGNvbF9pZHggPSBzLT5wYWNrZXRfaWR4ICUgcy0+bDsKKyAgICByb3dfaWR4ID0gcy0+cGFja2V0X2lkeCAvIHMtPmwgJSBzLT5kOworCisgICAgLy8gRkVDJyAocm93KSBzZW5kIGJsb2NrLWFsaWduZWQsIHhvcgorICAgIGlmIChjb2xfaWR4ID09IDApIHsKKyAgICAgICAgaWYgKCFzLT5maXJzdCB8fCBzLT5wYWNrZXRfaWR4ID4gMCkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBwcm9tcGVnX3dyaXRlX2ZlYyhoLCBzLT5mZWNfcm93LCBQUk9NUEVHX0ZFQ19ST1cpKSA8IDApCisgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICB3cml0dGVuICs9IHJldDsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocy0+ZmVjX3Jvdy0+Yml0c3RyaW5nLCBiaXRzdHJpbmcsIHMtPmJpdHN0cmluZ19zaXplKTsKKyAgICAgICAgcy0+ZmVjX3Jvdy0+c24gPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgICAgICBzLT5mZWNfcm93LT50cyA9IEFWX1JCMzIoYnVmICsgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgeG9yX2Zhc3Qocy0+ZmVjX3Jvdy0+Yml0c3RyaW5nLCBiaXRzdHJpbmcsIHMtPmZlY19yb3ctPmJpdHN0cmluZywKKyAgICAgICAgICAgICAgICBzLT5iaXRzdHJpbmdfc2l6ZSk7CisgICAgfQorCisgICAgLy8gRkVDIChjb2x1bW4pIHhvcgorICAgIGlmIChyb3dfaWR4ID09IDApIHsKKyAgICAgICAgaWYgKCFzLT5maXJzdCkgeworICAgICAgICAgICAgLy8gc3dhcCBmZWNfY29sIGFuZCBmZWNfY29sX3RtcAorICAgICAgICAgICAgZmVjX3RtcCA9IHMtPmZlY19jb2xbY29sX2lkeF07CisgICAgICAgICAgICBzLT5mZWNfY29sW2NvbF9pZHhdID0gcy0+ZmVjX2NvbF90bXBbY29sX2lkeF07CisgICAgICAgICAgICBzLT5mZWNfY29sX3RtcFtjb2xfaWR4XSA9IGZlY190bXA7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHMtPmZlY19jb2xfdG1wW2NvbF9pZHhdLT5iaXRzdHJpbmcsIGJpdHN0cmluZywgcy0+Yml0c3RyaW5nX3NpemUpOworICAgICAgICBzLT5mZWNfY29sX3RtcFtjb2xfaWR4XS0+c24gPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgICAgICBzLT5mZWNfY29sX3RtcFtjb2xfaWR4XS0+dHMgPSBBVl9SQjMyKGJ1ZiArIDQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHhvcl9mYXN0KHMtPmZlY19jb2xfdG1wW2NvbF9pZHhdLT5iaXRzdHJpbmcsIGJpdHN0cmluZywKKyAgICAgICAgICAgICAgICBzLT5mZWNfY29sX3RtcFtjb2xfaWR4XS0+Yml0c3RyaW5nLCBzLT5iaXRzdHJpbmdfc2l6ZSk7CisgICAgfQorCisgICAgLy8gRkVDIChjb2x1bW4pIHNlbmQgYmxvY2stYWxpZ25lZAorICAgIGlmICghcy0+Zmlyc3QgJiYgcy0+cGFja2V0X2lkeCAlIHMtPmQgPT0gMCkgeworICAgICAgICBjb2xfb3V0X2lkeCA9IHMtPnBhY2tldF9pZHggLyBzLT5kOworICAgICAgICBpZiAoKHJldCA9IHByb21wZWdfd3JpdGVfZmVjKGgsIHMtPmZlY19jb2xbY29sX291dF9pZHhdLCBQUk9NUEVHX0ZFQ19DT0wpKSA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgd3JpdHRlbiArPSByZXQ7CisgICAgfQorCisgICAgaWYgKCsrcy0+cGFja2V0X2lkeCA+PSBzLT5wYWNrZXRfaWR4X21heCkgeworICAgICAgICBzLT5wYWNrZXRfaWR4ID0gMDsKKyAgICAgICAgaWYgKHMtPmZpcnN0KQorICAgICAgICAgICAgcy0+Zmlyc3QgPSAwOworICAgIH0KKworICAgIHJldCA9IHdyaXR0ZW47CisKK2VuZDoKKyAgICBhdl9mcmVlKGJpdHN0cmluZyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwcm9tcGVnX2Nsb3NlKFVSTENvbnRleHQgKmgpIHsKKyAgICBQcm9tcGVnQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKworICAgIGZmdXJsX2Nsb3NlcCgmcy0+ZmVjX2NvbF9oZCk7CisgICAgZmZ1cmxfY2xvc2VwKCZzLT5mZWNfcm93X2hkKTsKKworICAgIGlmIChzLT5mZWNfYXJyKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5mZWNfYXJyX2xlbjsgaSsrKSB7CisgICAgICAgICAgICBhdl9mcmVlKHMtPmZlY19hcnJbaV0tPmJpdHN0cmluZyk7CisgICAgICAgICAgICBhdl9mcmVlcCgmcy0+ZmVjX2FycltpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZXAoJnMtPmZlY19hcnIpOworICAgIH0KKyAgICBhdl9mcmVlcCgmcy0+cnRwX2J1Zik7CisKKyAgICByZXR1cm4gMDsKK30KKworY29uc3QgVVJMUHJvdG9jb2wgZmZfcHJvbXBlZ19wcm90b2NvbCA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgICAgICA9ICJwcm9tcGVnIiwKKyAgICAudXJsX29wZW4gICAgICAgICAgICAgICAgICA9IHByb21wZWdfb3BlbiwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICAgICAgICA9IHByb21wZWdfd3JpdGUsCisgICAgLnVybF9jbG9zZSAgICAgICAgICAgICAgICAgPSBwcm9tcGVnX2Nsb3NlLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgICAgICAgID0gc2l6ZW9mKFByb21wZWdDb250ZXh0KSwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCisgICAgLnByaXZfZGF0YV9jbGFzcyAgICAgICAgICAgPSAmcHJvbXBlZ19jbGFzcywKK307CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9wcm90b2NvbHMuYyBiL2xpYmF2Zm9ybWF0L3Byb3RvY29scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOTU2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9wcm90b2NvbHMuYwpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlICJ1cmwuaCIKKworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2FzeW5jX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2JsdXJheV9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9jYWNoZV9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9jb25jYXRfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfY3J5cHRvX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2RhdGFfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfZmZydG1wY3J5cHRfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfZmZydG1waHR0cF9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9maWxlX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2Z0cF9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9nb3BoZXJfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfaGxzX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2h0dHBfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfaHR0cHByb3h5X3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2h0dHBzX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2ljZWNhc3RfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfbW1zaF9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9tbXN0X3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX21kNV9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9waXBlX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX3Byb21wZWdfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfcnRtcF9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9ydG1wZV9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9ydG1wc19wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9ydG1wdF9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9ydG1wdGVfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfcnRtcHRzX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX3J0cF9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9zY3RwX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX3NydHBfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfc3ViZmlsZV9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl90ZWVfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfdGNwX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX3Rsc19wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl91ZHBfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfdWRwbGl0ZV9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl91bml4X3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2xpYnJ0bXBfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfbGlicnRtcGVfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfbGlicnRtcHNfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfbGlicnRtcHRfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfbGlicnRtcHRlX3Byb3RvY29sOworZXh0ZXJuIGNvbnN0IFVSTFByb3RvY29sIGZmX2xpYnNydF9wcm90b2NvbDsKK2V4dGVybiBjb25zdCBVUkxQcm90b2NvbCBmZl9saWJzc2hfcHJvdG9jb2w7CitleHRlcm4gY29uc3QgVVJMUHJvdG9jb2wgZmZfbGlic21iY2xpZW50X3Byb3RvY29sOworCisjaW5jbHVkZSAibGliYXZmb3JtYXQvcHJvdG9jb2xfbGlzdC5jIgorCitjb25zdCBBVkNsYXNzICpmZl91cmxjb250ZXh0X2NoaWxkX2NsYXNzX25leHQoY29uc3QgQVZDbGFzcyAqcHJldikKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIGZpbmQgdGhlIHByb3RvY29sIHRoYXQgY29ycmVzcG9uZHMgdG8gcHJldiAqLworICAgIGZvciAoaSA9IDA7IHByZXYgJiYgdXJsX3Byb3RvY29sc1tpXTsgaSsrKSB7CisgICAgICAgIGlmICh1cmxfcHJvdG9jb2xzW2ldLT5wcml2X2RhdGFfY2xhc3MgPT0gcHJldikgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBmaW5kIG5leHQgcHJvdG9jb2wgd2l0aCBwcml2IG9wdGlvbnMgKi8KKyAgICBmb3IgKDsgdXJsX3Byb3RvY29sc1tpXTsgaSsrKQorICAgICAgICBpZiAodXJsX3Byb3RvY29sc1tpXS0+cHJpdl9kYXRhX2NsYXNzKQorICAgICAgICAgICAgcmV0dXJuIHVybF9wcm90b2NvbHNbaV0tPnByaXZfZGF0YV9jbGFzczsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitjb25zdCBjaGFyICphdmlvX2VudW1fcHJvdG9jb2xzKHZvaWQgKipvcGFxdWUsIGludCBvdXRwdXQpCit7CisgICAgY29uc3QgVVJMUHJvdG9jb2wgKipwID0gKm9wYXF1ZTsKKworICAgIHAgPSBwID8gcCArIDEgOiB1cmxfcHJvdG9jb2xzOworICAgICpvcGFxdWUgPSBwOworICAgIGlmICghKnApIHsKKyAgICAgICAgKm9wYXF1ZSA9IE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBpZiAoKG91dHB1dCAmJiAoKnApLT51cmxfd3JpdGUpIHx8ICghb3V0cHV0ICYmICgqcCktPnVybF9yZWFkKSkKKyAgICAgICAgcmV0dXJuICgqcCktPm5hbWU7CisgICAgcmV0dXJuIGF2aW9fZW51bV9wcm90b2NvbHMob3BhcXVlLCBvdXRwdXQpOworfQorCitjb25zdCBVUkxQcm90b2NvbCAqKmZmdXJsX2dldF9wcm90b2NvbHMoY29uc3QgY2hhciAqd2hpdGVsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJsYWNrbGlzdCkKK3sKKyAgICBjb25zdCBVUkxQcm90b2NvbCAqKnJldDsKKyAgICBpbnQgaSwgcmV0X2lkeCA9IDA7CisKKyAgICByZXQgPSBhdl9tYWxsb2N6X2FycmF5KEZGX0FSUkFZX0VMRU1TKHVybF9wcm90b2NvbHMpLCBzaXplb2YoKnJldCkpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaSA9IDA7IHVybF9wcm90b2NvbHNbaV07IGkrKykgeworICAgICAgICBjb25zdCBVUkxQcm90b2NvbCAqdXAgPSB1cmxfcHJvdG9jb2xzW2ldOworCisgICAgICAgIGlmICh3aGl0ZWxpc3QgJiYgKndoaXRlbGlzdCAmJiAhYXZfbWF0Y2hfbmFtZSh1cC0+bmFtZSwgd2hpdGVsaXN0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYmxhY2tsaXN0ICYmICpibGFja2xpc3QgJiYgYXZfbWF0Y2hfbmFtZSh1cC0+bmFtZSwgYmxhY2tsaXN0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHJldFtyZXRfaWR4KytdID0gdXA7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3BzeHN0ci5jIGIvbGliYXZmb3JtYXQvcHN4c3RyLmMKaW5kZXggYjU3OTgxYS4uZjdiOTQ5NSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcHN4c3RyLmMKKysrIGIvbGliYXZmb3JtYXQvcHN4c3RyLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogU29ueSBQbGF5c3RhdGlvbiAoUFNYKSBTVFIgRmlsZSBEZW11eGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTEwNCwxMyArMTA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICYmIHNlY3Rvcl9jb3VudCpWSURFT19EQVRBX0NIVU5LX1NJWkUgPj1mcmFtZV9zaXplKSl7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qc3QtPmNvZGVjLT53aWR0aCAgICAgID0gQVZfUkwxNigmc2VjdG9yWzB4MjhdKTsKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBBVl9STDE2KCZzZWN0b3JbMHgyQV0pOyovCi0KLS8vICAgICAgICAgICAgICAgICBpZiAoY3VycmVudF9zZWN0b3IgPT0gc2VjdG9yX2NvdW50LTEpIHsKLSAgICAgICAgICAgICAgICAgICAgdmlkKys7Ci0vLyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZpZCsrOwogCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTIwNSwxMSArMTk5LDExIEBACiAKICAgICAgICAgICAgICAgICAgICAgc3RyLT5jaGFubmVsc1tjaGFubmVsXS52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CiAKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NREVDOwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSAwOyAgLyogbm8gZm91cmNjICovCi0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IEFWX1JMMTYoJnNlY3RvclsweDI4XSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IEFWX1JMMTYoJnNlY3RvclsweDJBXSk7CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTURFQzsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gMDsgIC8qIG5vIGZvdXJjYyAqLworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSBBVl9STDE2KCZzZWN0b3JbMHgyOF0pOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgICAgPSBBVl9STDE2KCZzZWN0b3JbMHgyQV0pOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8qIGlmIHRoaXMgaXMgdGhlIGZpcnN0IHNlY3RvciBvZiB0aGUgZnJhbWUsIGFsbG9jYXRlIGEgcGt0ICovCkBAIC0yMTcsNyArMjExLDcgQEAKIAogICAgICAgICAgICAgICAgIGlmKHBrdC0+c2l6ZSAhPSBzZWN0b3JfY291bnQqVklERU9fREFUQV9DSFVOS19TSVpFKXsKICAgICAgICAgICAgICAgICAgICAgaWYocGt0LT5kYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm1pc3NtYXRjaGluZyBzZWN0b3JfY291bnRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm1pc21hdGNoaW5nIHNlY3Rvcl9jb3VudFxuIik7CiAgICAgICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOwogICAgICAgICAgICAgICAgICAgICBpZiAoYXZfbmV3X3BhY2tldChwa3QsIHNlY3Rvcl9jb3VudCpWSURFT19EQVRBX0NIVU5LX1NJWkUpKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKQEAgLTI1NCwyMiArMjQ4LDIyIEBACiAKICAgICAgICAgICAgICAgICBzdHItPmNoYW5uZWxzW2NoYW5uZWxdLmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKIAotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX1hBOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnICAgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fWEE7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgICA9IDA7ICAvKiBubyBmb3VyY2MgKi8KICAgICAgICAgICAgICAgICBpZiAoZm10ICYgMSkgewotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gKGZtdCY0KT8xODkwMDozNzgwMDsKLSAgICAgICAgICAgIC8vICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSAwOyAvL0ZJWE1FOwotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSAxMjg7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IChmbXQmNCk/MTg5MDA6Mzc4MDA7CisgICAgICAgICAgICAvLyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gMDsgLy9GSVhNRTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMTI4OwogCi0gICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDE4ICogMjI0IC8gc3QtPmNvZGVjLT5jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxOCAqIDIyNCAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKICAgICAgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwa3QgPSByZXRfcGt0OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcHZhLmMgYi9saWJhdmZvcm1hdC9wdmEuYwppbmRleCA5MDBhZDYxLi4wNGFlOGUyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9wdmEuYworKysgYi9saWJhdmZvcm1hdC9wdmEuYwpAQCAtNTksMTYgKzU5LDE2IEBACiAKICAgICBpZiAoIShzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCkpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPOwogICAgIHN0LT5uZWVkX3BhcnNpbmcgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDkwMDAwKTsKICAgICBhdl9hZGRfaW5kZXhfZW50cnkoc3QsIDAsIDAsIDAsIDAsIEFWSU5ERVhfS0VZRlJBTUUpOwogCiAgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTVAyOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9NUDI7CiAgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMywgMSwgOTAwMDApOwogICAgIGF2X2FkZF9pbmRleF9lbnRyeShzdCwgMCwgMCwgMCwgMCwgQVZJTkRFWF9LRVlGUkFNRSk7CkBAIC0xMzQsNiArMTM0LDEwIEBACiAgICAgICAgICAgICBwZXNfZmxhZ3MgICAgICAgICAgICAgID0gYXZpb19yYjE2KHBiKTsKICAgICAgICAgICAgIHBlc19oZWFkZXJfZGF0YV9sZW5ndGggPSBhdmlvX3I4KHBiKTsKIAorICAgICAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmIChwZXNfc2lnbmFsICE9IDEgfHwgcGVzX2hlYWRlcl9kYXRhX2xlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcHZhX2xvZyhzLCBBVl9MT0dfV0FSTklORywgImV4cGVjdGVkIG5vbiBlbXB0eSBzaWduYWxlZCBQRVMgcGFja2V0LCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ5aW5nIHRvIHJlY292ZXJcbiIpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcHZmZGVjLmMgYi9saWJhdmZvcm1hdC9wdmZkZWMuYwppbmRleCBjNjc4MDQ2Li5jNjY1MmI5IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9wdmZkZWMuYworKysgYi9saWJhdmZvcm1hdC9wdmZkZWMuYwpAQCAtMTksNiArMTksNyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2ludGVybmFsLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInBjbS5oIgpAQCAtNDQsMjEgKzQ1LDIyIEBACiAgICAgICAgICAgICAgICAmYnBzKSAhPSAzKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIGlmIChjaGFubmVscyA8PSAwIHx8IGJwcyA8PSAwIHx8IHNhbXBsZV9yYXRlIDw9IDApCisgICAgaWYgKGNoYW5uZWxzIDw9IDAgfHwgY2hhbm5lbHMgPiBGRl9TQU5FX05CX0NIQU5ORUxTIHx8CisgICAgICAgIGJwcyA8PSAwIHx8IGJwcyA+IElOVF9NQVggLyBGRl9TQU5FX05CX0NIQU5ORUxTIHx8IHNhbXBsZV9yYXRlIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IGZmX2dldF9wY21fY29kZWNfaWQoYnBzLCAwLCAxLCAweEZGRkYpOwotICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnBzOwotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBicHMgKiBzdC0+Y29kZWMtPmNoYW5uZWxzIC8gODsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IGZmX2dldF9wY21fY29kZWNfaWQoYnBzLCAwLCAxLCAweEZGRkYpOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnBzOworICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBicHMgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzIC8gODsKIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3FjcC5jIGIvbGliYXZmb3JtYXQvcWNwLmMKaW5kZXggYWQ0YThhZS4uYjg0MmUyNiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcWNwLmMKKysrIGIvbGliYXZmb3JtYXQvcWNwLmMKQEAgLTEwMSwyOSArMTAxLDI5IEBACiAgICAgYXZpb19yYjMyKHBiKTsgICAgICAgICAgICAgICAgICAgIC8vICJSSUZGIgogICAgIGF2aW9fc2tpcChwYiwgNCArIDggKyA0ICsgMSArIDEpOyAgICAvLyBmaWxlc2l6ZSArICJRTENNZm10ICIgKyBjaHVuay1zaXplICsgbWFqb3ItdmVyc2lvbiArIG1pbm9yLXZlcnNpb24KIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgPSAxOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CiAgICAgYXZpb19yZWFkKHBiLCBidWYsIDE2KTsKICAgICBpZiAoaXNfcWNlbHBfMTNrX2d1aWQoYnVmKSkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUUNFTFA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9RQ0VMUDsKICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoYnVmLCBndWlkX2V2cmMsIDE2KSkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRVZSQzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0VWUkM7CiAgICAgfSBlbHNlIGlmICghbWVtY21wKGJ1ZiwgZ3VpZF9zbXYsIDE2KSkgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfU01WOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfU01WOwogICAgIH0gZWxzZSBpZiAoIW1lbWNtcChidWYsIGd1aWRfNGd2LCAxNikpIHsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEXzRHVjsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEXzRHVjsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBjb2RlYyBHVUlEICJGRl9QUklfR1VJRCIuXG4iLAogICAgICAgICAgICAgICAgRkZfQVJHX0dVSUQoYnVmKSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBhdmlvX3NraXAocGIsIDIgKyA4MCk7IC8vIGNvZGVjLXZlcnNpb24gKyBjb2RlYy1uYW1lCi0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGF2aW9fcmwxNihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IGF2aW9fcmwxNihwYik7CiAKICAgICBzLT5wYWNrZXRfc2l6ZSA9IGF2aW9fcmwxNihwYik7CiAgICAgYXZpb19za2lwKHBiLCAyKTsgLy8gYmxvY2stc2l6ZQotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMTYocGIpOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMTYocGIpOwogICAgIGF2aW9fc2tpcChwYiwgMik7IC8vIHNhbXBsZS1zaXplCiAKICAgICBtZW1zZXQoYy0+cmF0ZXNfcGVyX21vZGUsIC0xLCBzaXplb2YoYy0+cmF0ZXNfcGVyX21vZGUpKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3F0cGFsZXR0ZS5jIGIvbGliYXZmb3JtYXQvcXRwYWxldHRlLmMKaW5kZXggNjY2YzZiNy4uNjgzM2YwYyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcXRwYWxldHRlLmMKKysrIGIvbGliYXZmb3JtYXQvcXRwYWxldHRlLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICAgICAvKiBJZiB0aGUgZGVwdGggaXMgMSwgMiwgNCwgb3IgOCBicHAsIGZpbGUgaXMgcGFsZXR0aXplZC4gKi8KICAgICBpZiAoKGJpdF9kZXB0aCA9PSAxIHx8IGJpdF9kZXB0aCA9PSAyIHx8IGJpdF9kZXB0aCA9PSA0IHx8IGJpdF9kZXB0aCA9PSA4KSkgewogICAgICAgICB1aW50MzJfdCBjb2xvcl9jb3VudCwgY29sb3Jfc3RhcnQsIGNvbG9yX2VuZDsKLSAgICAgICAgdWludDMyX3QgYSwgciwgZywgYjsKKyAgICAgICAgdWludDMyX3QgciwgZywgYjsKIAogICAgICAgICAvKiBJZ25vcmUgdGhlIGdyZXlzY2FsZSBiaXQgZm9yIDEtYml0IHZpZGVvIGFuZCBzYW1wbGUKICAgICAgICAgICogZGVzY3JpcHRpb25zIGNvbnRhaW5pbmcgYSBjb2xvciB0YWJsZS4gKi8KQEAgLTk0LDE3ICs5NCwxNyBAQAogICAgICAgICAgICAgY29sb3JfZW5kID0gYXZpb19yYjE2KHBiKTsKICAgICAgICAgICAgIGlmICgoY29sb3Jfc3RhcnQgPD0gMjU1KSAmJiAoY29sb3JfZW5kIDw9IDI1NSkpIHsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSBjb2xvcl9zdGFydDsgaSA8PSBjb2xvcl9lbmQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAvKiBlYWNoIEEsIFIsIEcsIG9yIEIgY29tcG9uZW50IGlzIDE2IGJpdHM7Ci0gICAgICAgICAgICAgICAgICAgICAqIG9ubHkgdXNlIHRoZSB0b3AgOCBiaXRzICovCi0gICAgICAgICAgICAgICAgICAgIGEgPSBhdmlvX3I4KHBiKTsKLSAgICAgICAgICAgICAgICAgICAgYXZpb19yOChwYik7CisgICAgICAgICAgICAgICAgICAgIC8qIEVhY2ggY29sb3IgaXMgbWFkZSBvZiBmb3VyIHVuc2lnbmVkIDE2IGJpdCBpbnRlZ2Vycy4gVGhlCisgICAgICAgICAgICAgICAgICAgICAqIGZpcnN0IGludGVnZXIgaXMgMCwgdGhlIHJlbWFpbmluZyBpbnRlZ2VycyBhcmUgdGhlIHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGdyZWVuIGFuZCB0aGUgYmx1ZSB2YWx1ZXMuIFdlIG9ubHkgdXNlIHRoZSB0b3AgOCBiaXQuICovCisgICAgICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMik7CiAgICAgICAgICAgICAgICAgICAgIHIgPSBhdmlvX3I4KHBiKTsKICAgICAgICAgICAgICAgICAgICAgYXZpb19yOChwYik7CiAgICAgICAgICAgICAgICAgICAgIGcgPSBhdmlvX3I4KHBiKTsKICAgICAgICAgICAgICAgICAgICAgYXZpb19yOChwYik7CiAgICAgICAgICAgICAgICAgICAgIGIgPSBhdmlvX3I4KHBiKTsKICAgICAgICAgICAgICAgICAgICAgYXZpb19yOChwYik7Ci0gICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSAoYSA8PCAyNCApIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7CisgICAgICAgICAgICAgICAgICAgIHBhbGV0dGVbaV0gPSAoMHhGRlUgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCAoYik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yM2QuYyBiL2xpYmF2Zm9ybWF0L3IzZC5jCmluZGV4IDk0YzMwMTUuLjFmNTNkODQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3IzZC5jCisrKyBiL2xpYmF2Zm9ybWF0L3IzZC5jCkBAIC02Miw4ICs2Miw4IEBACiAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSlBFRzIwMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9KUEVHMjAwMDsKIAogICAgIHRtcCAgPSBhdmlvX3I4KHMtPnBiKTsgLy8gbWFqb3IgdmVyc2lvbgogICAgIHRtcDIgPSBhdmlvX3I4KHMtPnBiKTsgLy8gbWlub3IgdmVyc2lvbgpAQCAtODAsOCArODAsOCBAQAogCiAgICAgYXZpb19za2lwKHMtPnBiLCAzMik7IC8vIHVua25vd24KIAotICAgIHN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19yYjMyKHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gYXZpb19yYjMyKHMtPnBiKTsKIAogICAgIHRtcCA9IGF2aW9fcmIxNihzLT5wYik7IC8vIHVua25vd24KICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAidW5rbm93bjIgJWRcbiIsIHRtcCk7CkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICBhdl9kaWN0X3NldCgmc3QtPm1ldGFkYXRhLCAiZmlsZW5hbWUiLCBmaWxlbmFtZSwgMCk7CiAKICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiZmlsZW5hbWUgJXNcbiIsIGZpbGVuYW1lKTsKLSAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAicmVzb2x1dGlvbiAlZHglZFxuIiwgc3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHQpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJyZXNvbHV0aW9uICVkeCVkXG4iLCBzdC0+Y29kZWNwYXItPndpZHRoLCBzdC0+Y29kZWNwYXItPmhlaWdodCk7CiAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgInRpbWVzY2FsZSAlZFxuIiwgc3QtPnRpbWVfYmFzZS5kZW4pOwogICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICJmcmFtZSByYXRlICVkLyVkXG4iLAogICAgICAgICAgICAgZnJhbWVyYXRlLm51bSwgZnJhbWVyYXRlLmRlbik7CkBAIC0xODYsNyArMTg2LDcgQEAKIAogICAgIHMtPmludGVybmFsLT5kYXRhX29mZnNldCA9IGF2aW9fdGVsbChzLT5wYik7CiAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgImRhdGEgb2Zmc2V0ICUjIlBSSXg2NCJcbiIsIHMtPmludGVybmFsLT5kYXRhX29mZnNldCk7Ci0gICAgaWYgKCFzLT5wYi0+c2Vla2FibGUpCisgICAgaWYgKCEocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpKQogICAgICAgICByZXR1cm4gMDsKICAgICAvLyBmaW5kIFJFT0IvUkVPRi9SRU9TIHRvIGxvYWQgaW5kZXgKICAgICBhdmlvX3NlZWsocy0+cGIsIGF2aW9fc2l6ZShzLT5wYiktNDgtOCwgU0VFS19TRVQpOwpAQCAtMjg0LDkgKzI4NCw5IEBACiAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJCRTsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IHIzZC0+YXVkaW9fY2hhbm5lbHM7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJCRTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IHIzZC0+YXVkaW9fY2hhbm5lbHM7CiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UuZGVuKTsKICAgICB9IGVsc2UgewogICAgICAgICBzdCA9IHMtPnN0cmVhbXNbMV07CkBAIC0yOTQsOCArMjk0LDggQEAKIAogICAgIGR0cyA9IGF2aW9fcmIzMihzLT5wYik7CiAKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHMtPnBiKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihzLT5wYik7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPD0gMCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQmFkIHNhbXBsZSByYXRlXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtMzI2LDEwICszMjYsMTAgQEAKIAogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKICAgICBwa3QtPmR0cyA9IGR0czsKLSAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkKLSAgICAgICAgcGt0LT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoc2FtcGxlcywgc3QtPnRpbWVfYmFzZS5kZW4sIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKQorICAgICAgICBwa3QtPmR1cmF0aW9uID0gYXZfcmVzY2FsZShzYW1wbGVzLCBzdC0+dGltZV9iYXNlLmRlbiwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgInBrdCBkdHMgJSJQUklkNjQiIGR1cmF0aW9uICUiUFJJZDY0IiBzYW1wbGVzICVkIHNhbXBsZSByYXRlICVkXG4iLAotICAgICAgICAgICAgcGt0LT5kdHMsIHBrdC0+ZHVyYXRpb24sIHNhbXBsZXMsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgcGt0LT5kdHMsIHBrdC0+ZHVyYXRpb24sIHNhbXBsZXMsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yYXdkZWMuYyBiL2xpYmF2Zm9ybWF0L3Jhd2RlYy5jCmluZGV4IDM1YWQxMTguLmIzOGE0YjUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Jhd2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3Jhd2RlYy5jCkBAIC00Myw3ICs0Myw3IEBACiAKICAgICBwa3QtPnBvcz0gYXZpb190ZWxsKHMtPnBiKTsKICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7Ci0gICAgcmV0ID0gZmZpb19yZWFkX3BhcnRpYWwocy0+cGIsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgcmV0ID0gYXZpb19yZWFkX3BhcnRpYWwocy0+cGIsIHBrdC0+ZGF0YSwgc2l6ZSk7CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC01Nyw4ICs1Nyw4IEBACiAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gcy0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkOwogICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CiAgICAgLyogdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gKi8KQEAgLTgwLDEyICs4MCwxMSBAQAogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CiAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOwogCi0gICAgc3QtPmNvZGVjLT5mcmFtZXJhdGUgPSBzMS0+ZnJhbWVyYXRlOwotICAgIHN0LT5jb2RlYy0+dGltZV9iYXNlID0gYXZfaW52X3EoczEtPmZyYW1lcmF0ZSk7CisgICAgc3QtPmludGVybmFsLT5hdmN0eC0+ZnJhbWVyYXRlID0gczEtPmZyYW1lcmF0ZTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTIwMDAwMCk7CiAKIGZhaWw6CkBAIC05Nyw4ICs5Niw4IEBACiAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBzLT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IHMtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xMDgsNyArMTA3LDcgQEAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKEZGUmF3VmlkZW9EZW11eGVyQ29udGV4dCwgeCkKICNkZWZpbmUgREVDIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNCiBjb25zdCBBVk9wdGlvbiBmZl9yYXd2aWRlb19vcHRpb25zW10gPSB7Ci0gICAgeyAiZnJhbWVyYXRlIiwgIiIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCAwLCBERUN9LAorICAgIHsgImZyYW1lcmF0ZSIsICIiLCBPRkZTRVQoZnJhbWVyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgSU5UX01BWCwgREVDfSwKICAgICB7IE5VTEwgfSwKIH07CiAKQEAgLTEzMSw3ICsxMzAsNyBAQAogICAgIGludCBuYl9pbnZhbGlkID0gMDsKICAgICBpbnQgbmJfZnJhbWVzID0gMDsKIAotICAgIGZvciAoaT0wOyBpPHAtPmJ1Zl9zaXplLTI7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBwLT5idWZfc2l6ZSAtIDE7IGkrKykgewogICAgICAgICBpbnQgYzsKICAgICAgICAgaWYgKHAtPmJ1ZltpXSAhPSAweEZGKQogICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yYXdlbmMuYyBiL2xpYmF2Zm9ybWF0L3Jhd2VuYy5jCmluZGV4IDM1OGVlNGUuLjgwOWNhMjMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Jhd2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3Jhd2VuYy5jCkBAIC0yMCw4ICsyMCwxMSBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgInJhd2VuYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCiAKIGludCBmZl9yYXdfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKQEAgLTYwLDExICs2MywxMSBAQAogc3RhdGljIGludCBhZHhfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBpbnQ2NF90IGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7Ci0gICAgICAgIHVpbnQ2NF90IHNhbXBsZV9jb3VudCA9IChmaWxlX3NpemUgLSAzNikgLyBhdmN0eC0+Y2hhbm5lbHMgLyAxOCAqIDMyOworICAgICAgICB1aW50NjRfdCBzYW1wbGVfY291bnQgPSAoZmlsZV9zaXplIC0gMzYpIC8gcGFyLT5jaGFubmVscyAvIDE4ICogMzI7CiAgICAgICAgIGlmIChzYW1wbGVfY291bnQgPD0gVUlOVDMyX01BWCkgewogICAgICAgICAgICAgYXZpb19zZWVrKHBiLCAxMiwgU0VFS19TRVQpOwogICAgICAgICAgICAgYXZpb193YjMyKHBiLCBzYW1wbGVfY291bnQpOwpAQCAtODgsNiArOTEsMzIgQEAKIH07CiAjZW5kaWYKIAorI2lmIENPTkZJR19BUFRYX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9hcHR4X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJhcHR4IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IGFwdFggKEF1ZGlvIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBmb3IgQmx1ZXRvb3RoKSIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJhcHR4IiwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BUFRYLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19BUFRYX0hEX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9hcHR4X2hkX211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJhcHR4X2hkIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IGFwdFggSEQgKEF1ZGlvIFByb2Nlc3NpbmcgVGVjaG5vbG9neSBmb3IgQmx1ZXRvb3RoKSIpLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJhcHR4aGQiLAorICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0FQVFhfSEQsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSBmb3JjZV9vbmVfc3RyZWFtLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IGZmX3Jhd193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9USU1FU1RBTVBTLAorfTsKKyNlbmRpZgorCiAjaWYgQ09ORklHX0NBVlNWSURFT19NVVhFUgogQVZPdXRwdXRGb3JtYXQgZmZfY2F2c3ZpZGVvX211eGVyID0gewogICAgIC5uYW1lICAgICAgICAgICAgICA9ICJjYXZzdmlkZW8iLApAQCAtMTAxLDYgKzEzMCwxOSBAQAogfTsKICNlbmRpZgogCisjaWYgQ09ORklHX0NPREVDMlJBV19NVVhFUgorQVZPdXRwdXRGb3JtYXQgZmZfY29kZWMycmF3X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJjb2RlYzJyYXciLAorICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgY29kZWMyIG11eGVyIiksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQ09ERUMyLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworCiAjaWYgQ09ORklHX0RBVEFfTVVYRVIKIEFWT3V0cHV0Rm9ybWF0IGZmX2RhdGFfbXV4ZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgID0gImRhdGEiLApAQCAtMTI4LDcgKzE3MCw3IEBACiBBVk91dHB1dEZvcm1hdCBmZl9kbnhoZF9tdXhlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgPSAiZG54aGQiLAogICAgIC5sb25nX25hbWUgICAgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJyYXcgRE54SEQgKFNNUFRFIFZDLTMpIiksCi0gICAgLmV4dGVuc2lvbnMgICAgICAgID0gImRueGhkIiwKKyAgICAuZXh0ZW5zaW9ucyAgICAgICAgPSAiZG54aGQsZG54aHIiLAogICAgIC5hdWRpb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCiAgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfRE5YSEQsCiAgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKQEAgLTE5Myw2ICsyMzUsNDQgQEAKIH07CiAjZW5kaWYKIAorI2lmIENPTkZJR19HNzI2X01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9nNzI2X211eGVyID0geworICAgIC5uYW1lICAgICAgICAgICAgICA9ICJnNzI2IiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IGJpZy1lbmRpYW4gRy43MjYgKFwibGVmdC1qdXN0aWZpZWRcIikiKSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2LAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19HNzI2TEVfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2c3MjZsZV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiZzcyNmxlIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IGxpdHRsZS1lbmRpYW4gRy43MjYgKFwicmlnaHQtanVzdGlmaWVkXCIpIiksCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfQURQQ01fRzcyNkxFLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKworI2lmIENPTkZJR19HU01fTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX2dzbV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAiZ3NtIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IEdTTSIpLAorICAgIC5taW1lX3R5cGUgICAgICAgICA9ICJhdWRpby94LWdzbSIsCisgICAgLmV4dGVuc2lvbnMgICAgICAgID0gImdzbSIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfR1NNLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKKyAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKK307CisjZW5kaWYKKwogI2lmIENPTkZJR19IMjYxX01VWEVSCiBBVk91dHB1dEZvcm1hdCBmZl9oMjYxX211eGVyID0gewogICAgIC5uYW1lICAgICAgICAgICAgICA9ICJoMjYxIiwKQEAgLTIyMiw2ICszMDIsMTUgQEAKICNlbmRpZgogCiAjaWYgQ09ORklHX0gyNjRfTVVYRVIKK3N0YXRpYyBpbnQgaDI2NF9jaGVja19iaXRzdHJlYW0oc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOworICAgIGlmIChwa3QtPnNpemUgPj0gNSAmJiBBVl9SQjMyKHBrdC0+ZGF0YSkgIT0gMHgwMDAwMDAxICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1JCMjQocGt0LT5kYXRhKSAhPSAweDAwMDAwMSkKKyAgICAgICAgcmV0dXJuIGZmX3N0cmVhbV9hZGRfYml0c3RyZWFtX2ZpbHRlcihzdCwgImgyNjRfbXA0dG9hbm5leGIiLCBOVUxMKTsKKyAgICByZXR1cm4gMTsKK30KKwogQVZPdXRwdXRGb3JtYXQgZmZfaDI2NF9tdXhlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgPSAiaDI2NCIsCiAgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBILjI2NCB2aWRlbyIpLApAQCAtMjMwLDExICszMTksMjEgQEAKICAgICAudmlkZW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LAogICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZvcmNlX29uZV9zdHJlYW0sCiAgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuY2hlY2tfYml0c3RyZWFtICAgPSBoMjY0X2NoZWNrX2JpdHN0cmVhbSwKICAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCiB9OwogI2VuZGlmCiAKICNpZiBDT05GSUdfSEVWQ19NVVhFUgorc3RhdGljIGludCBoZXZjX2NoZWNrX2JpdHN0cmVhbShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbMF07CisgICAgaWYgKHBrdC0+c2l6ZSA+PSA1ICYmIEFWX1JCMzIocGt0LT5kYXRhKSAhPSAweDAwMDAwMDEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUkIyNChwa3QtPmRhdGEpICE9IDB4MDAwMDAxKQorICAgICAgICByZXR1cm4gZmZfc3RyZWFtX2FkZF9iaXRzdHJlYW1fZmlsdGVyKHN0LCAiaGV2Y19tcDR0b2FubmV4YiIsIE5VTEwpOworICAgIHJldHVybiAxOworfQorCiBBVk91dHB1dEZvcm1hdCBmZl9oZXZjX211eGVyID0gewogICAgIC5uYW1lICAgICAgICAgICAgICA9ICJoZXZjIiwKICAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgicmF3IEhFVkMgdmlkZW8iKSwKQEAgLTI0Myw2ICszNDIsNyBAQAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCiAgICAgLndyaXRlX2hlYWRlciAgICAgID0gZm9yY2Vfb25lX3N0cmVhbSwKICAgICAud3JpdGVfcGFja2V0ICAgICAgPSBmZl9yYXdfd3JpdGVfcGFja2V0LAorICAgIC5jaGVja19iaXRzdHJlYW0gICA9IGhldmNfY2hlY2tfYml0c3RyZWFtLAogICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX05PVElNRVNUQU1QUywKIH07CiAjZW5kaWYKQEAgLTMwMCw2ICs0MDAsMTkgQEAKIH07CiAjZW5kaWYKIAorI2lmIENPTkZJR19NUDJfTVVYRVIKK0FWT3V0cHV0Rm9ybWF0IGZmX21wMl9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgICAgPSAibXAyIiwKKyAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTVAyIChNUEVHIGF1ZGlvIGxheWVyIDIpIiksCisgICAgLm1pbWVfdHlwZSAgICAgICAgID0gImF1ZGlvL21wZWciLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJtcDIsbTJhLG1wYSIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTVAyLAorICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX05PTkUsCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OworI2VuZGlmCisKICNpZiBDT05GSUdfTVBFRzFWSURFT19NVVhFUgogQVZPdXRwdXRGb3JtYXQgZmZfbXBlZzF2aWRlb19tdXhlciA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgPSAibXBlZzF2aWRlbyIsCkBAIC0zMzksNiArNDUyLDE5IEBACiB9OwogI2VuZGlmCiAKKyNpZiBDT05GSUdfU0JDX01VWEVSCitBVk91dHB1dEZvcm1hdCBmZl9zYmNfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gInNiYyIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBTQkMiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXVkaW8veC1zYmMiLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJzYmMsbXNiYyIsCisgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfU0JDLAorICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZvcmNlX29uZV9zdHJlYW0sCisgICAgLndyaXRlX3BhY2tldCAgICAgID0gZmZfcmF3X3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT1RJTUVTVEFNUFMsCit9OworI2VuZGlmCisKICNpZiBDT05GSUdfVFJVRUhEX01VWEVSCiBBVk91dHB1dEZvcm1hdCBmZl90cnVlaGRfbXV4ZXIgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgID0gInRydWVoZCIsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yYXd1dGlscy5jIGIvbGliYXZmb3JtYXQvcmF3dXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY0MTJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvcmF3dXRpbHMuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogUmF3IHZpZGVvIHV0aWxzCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorCitpbnQgZmZfcmVzaHVmZmxlX3Jhd19yZ2IoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqKnBwa3QsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIGludCBleHBlY3RlZF9zdHJpZGUpCit7CisgICAgaW50IHJldDsKKyAgICBBVlBhY2tldCAqcGt0ID0gKnBwa3Q7CisgICAgaW50NjRfdCBicGMgPSBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAhPSAxNSA/IHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDogMTY7CisgICAgaW50IG1pbl9zdHJpZGUgPSAocGFyLT53aWR0aCAqIGJwYyArIDcpID4+IDM7CisgICAgaW50IHdpdGhfcGFsX3NpemUgPSBtaW5fc3RyaWRlICogcGFyLT5oZWlnaHQgKyAxMDI0OworICAgIGludCBjb250YWluc19wYWwgPSBicGMgPT0gOCAmJiBwa3QtPnNpemUgPT0gd2l0aF9wYWxfc2l6ZTsKKyAgICBpbnQgc2l6ZSA9IGNvbnRhaW5zX3BhbCA/IG1pbl9zdHJpZGUgKiBwYXItPmhlaWdodCA6IHBrdC0+c2l6ZTsKKyAgICBpbnQgc3RyaWRlID0gc2l6ZSAvIHBhci0+aGVpZ2h0OworICAgIGludCBwYWRkaW5nID0gZXhwZWN0ZWRfc3RyaWRlIC0gRkZNSU4oZXhwZWN0ZWRfc3RyaWRlLCBzdHJpZGUpOworICAgIGludCB5OworICAgIEFWUGFja2V0ICpuZXdfcGt0OworCisgICAgaWYgKHBrdC0+c2l6ZSA9PSBleHBlY3RlZF9zdHJpZGUgKiBwYXItPmhlaWdodCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHNpemUgIT0gc3RyaWRlICogcGFyLT5oZWlnaHQpCisgICAgICAgIHJldHVybiAwOworCisgICAgbmV3X3BrdCA9IGF2X3BhY2tldF9hbGxvYygpOworICAgIGlmICghbmV3X3BrdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldCA9IGF2X25ld19wYWNrZXQobmV3X3BrdCwgZXhwZWN0ZWRfc3RyaWRlICogcGFyLT5oZWlnaHQpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSBhdl9wYWNrZXRfY29weV9wcm9wcyhuZXdfcGt0LCBwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmb3IgKHkgPSAwOyB5PHBhci0+aGVpZ2h0OyB5KyspIHsKKyAgICAgICAgbWVtY3B5KG5ld19wa3QtPmRhdGEgKyB5KmV4cGVjdGVkX3N0cmlkZSwgcGt0LT5kYXRhICsgeSpzdHJpZGUsIEZGTUlOKGV4cGVjdGVkX3N0cmlkZSwgc3RyaWRlKSk7CisgICAgICAgIG1lbXNldChuZXdfcGt0LT5kYXRhICsgeSpleHBlY3RlZF9zdHJpZGUgKyBleHBlY3RlZF9zdHJpZGUgLSBwYWRkaW5nLCAwLCBwYWRkaW5nKTsKKyAgICB9CisKKyAgICAqcHBrdCA9IG5ld19wa3Q7CisgICAgcmV0dXJuIDEgKyBjb250YWluc19wYWw7CitmYWlsOgorICAgIGF2X3BhY2tldF9mcmVlKCZuZXdfcGt0KTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yYXd2aWRlb2RlYy5jIGIvbGliYXZmb3JtYXQvcmF3dmlkZW9kZWMuYwppbmRleCA5MWJkYmEwLi44YmRlMjJjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9yYXd2aWRlb2RlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3Jhd3ZpZGVvZGVjLmMKQEAgLTQ1LDkgKzQ1LDkgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBjdHgtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gY3R4LT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CiAKICAgICBpZiAoKHBpeF9mbXQgPSBhdl9nZXRfcGl4X2ZtdChzLT5waXhlbF9mb3JtYXQpKSA9PSBBVl9QSVhfRk1UX05PTkUpIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gc3VjaCBwaXhlbCBmb3JtYXQ6ICVzLlxuIiwKQEAgLTU3LDE0ICs1NywxNCBAQAogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHMtPmZyYW1lcmF0ZS5kZW4sIHMtPmZyYW1lcmF0ZS5udW0pOwogCi0gICAgc3QtPmNvZGVjLT53aWR0aCAgPSBzLT53aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHMtPmhlaWdodDsKLSAgICBzdC0+Y29kZWMtPnBpeF9mbXQgPSBwaXhfZm10OwotICAgIHBhY2tldF9zaXplID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKHN0LT5jb2RlYy0+cGl4X2ZtdCwgcy0+d2lkdGgsIHMtPmhlaWdodCwgMSk7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSBzLT53aWR0aDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IHMtPmhlaWdodDsKKyAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IHBpeF9mbXQ7CisgICAgcGFja2V0X3NpemUgPSBhdl9pbWFnZV9nZXRfYnVmZmVyX3NpemUoc3QtPmNvZGVjcGFyLT5mb3JtYXQsIHMtPndpZHRoLCBzLT5oZWlnaHQsIDEpOwogICAgIGlmIChwYWNrZXRfc2l6ZSA8IDApCiAgICAgICAgIHJldHVybiBwYWNrZXRfc2l6ZTsKICAgICBjdHgtPnBhY2tldF9zaXplID0gcGFja2V0X3NpemU7Ci0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGF2X3Jlc2NhbGVfcShjdHgtPnBhY2tldF9zaXplLAorICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBhdl9yZXNjYWxlX3EoY3R4LT5wYWNrZXRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXs4LDF9LCBzdC0+dGltZV9iYXNlKTsKIAogICAgIHJldHVybiAwOwpAQCAtODksNyArODksNyBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIHJhd3ZpZGVvX29wdGlvbnNbXSA9IHsKICAgICB7ICJ2aWRlb19zaXplIiwgInNldCBmcmFtZSBzaXplIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgREVDIH0sCiAgICAgeyAicGl4ZWxfZm9ybWF0IiwgInNldCBwaXhlbCBmb3JtYXQiLCBPRkZTRVQocGl4ZWxfZm9ybWF0KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9ICJ5dXY0MjBwIn0sIDAsIDAsIERFQyB9LAotICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgZnJhbWUgcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCAwLCBERUMgfSwKKyAgICB7ICJmcmFtZXJhdGUiLCAic2V0IGZyYW1lIHJhdGUiLCBPRkZTRVQoZnJhbWVyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgSU5UX01BWCwgREVDIH0sCiAgICAgeyBOVUxMIH0sCiB9OwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yZHQuYyBiL2xpYmF2Zm9ybWF0L3JkdC5jCmluZGV4IGMzYWMxOTguLjYwYzM2ZjAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3JkdC5jCisrKyBiL2xpYmF2Zm9ybWF0L3JkdC5jCkBAIC00NCw3ICs0NCw3IEBACiAgICAgICogaW4gdGhlIEFWRm9ybWF0Q29udGV4dCwgYW5kIHRoaXMgdmFyaWFibGUgcG9pbnRzIHRvIHRoZSBvZmZzZXQgaW4KICAgICAgKiB0aGF0IGFycmF5IHN1Y2ggdGhhdCB0aGUgZmlyc3QgaXMgdGhlIGZpcnN0IHN0cmVhbSBvZiB0aGlzIHNldC4gKi8KICAgICBBVlN0cmVhbSAqKnN0cmVhbXM7Ci0gICAgaW50IG5fc3RyZWFtczsgLyoqPCBzdHJlYW1zIHdpdGggaWRlbnRpZmljYWwgY29udGVudCBpbiB0aGlzIHNldCAqLworICAgIGludCBuX3N0cmVhbXM7IC8qKjwgc3RyZWFtcyB3aXRoIGlkZW50aWNhbCBjb250ZW50IGluIHRoaXMgc2V0ICovCiAgICAgdm9pZCAqZHluYW1pY19wcm90b2NvbF9jb250ZXh0OwogICAgIER5bmFtaWNQYXlsb2FkUGFja2V0SGFuZGxlclByb2MgcGFyc2VfcGFja2V0OwogICAgIHVpbnQzMl90IHByZXZfdGltZXN0YW1wOwpAQCAtNTMsNyArNTMsNyBAQAogCiBSRFREZW11eENvbnRleHQgKgogZmZfcmR0X3BhcnNlX29wZW4oQVZGb3JtYXRDb250ZXh0ICppYywgaW50IGZpcnN0X3N0cmVhbV9vZl9zZXRfaWR4LAotICAgICAgICAgICAgICAgICAgdm9pZCAqcHJpdl9kYXRhLCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyKQorICAgICAgICAgICAgICAgICAgdm9pZCAqcHJpdl9kYXRhLCBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyKQogewogICAgIFJEVERlbXV4Q29udGV4dCAqcyA9IGF2X21hbGxvY3ooc2l6ZW9mKFJEVERlbXV4Q29udGV4dCkpOwogICAgIGlmICghcykKQEAgLTMwOSw3ICszMDksNyBAQAogICAgICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIGlmIChyZXMgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgewogICAgICAgICAgICAgICAgIG1lbWNweSAocmR0LT5idWZmZXIsIGJ1ZiArIHBvcywgbGVuIC0gcG9zKTsKICAgICAgICAgICAgICAgICByZHQtPnJtY3R4LT5wYiA9IGF2aW9fYWxsb2NfY29udGV4dCAocmR0LT5idWZmZXIsIGxlbiAtIHBvcywgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKQEAgLTMyMiw4ICszMjIsOCBAQAogICAgICAgICAgICAgZmZfcm1fcmV0cmlldmVfY2FjaGUgKHJkdC0+cm1jdHgsIHJkdC0+cm1jdHgtPnBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LCByZHQtPnJtc3Rbc3QtPmluZGV4XSwgcGt0KTsKICAgICAgICAgaWYgKHJkdC0+YXVkaW9fcGt0X2NudCA9PSAwICYmCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZyZHQtPnJtY3R4LT5wYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykKKyAgICAgICAgICAgIGF2aW9fY29udGV4dF9mcmVlKCZyZHQtPnJtY3R4LT5wYik7CiAgICAgfQogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwogICAgIHBrdC0+cHRzID0gKnRpbWVzdGFtcDsKQEAgLTQ0OCw3ICs0NDgsNyBAQAogewogICAgIGRvIHsKICAgICAgICAgLyogY2FuIGJlIGVpdGhlciBhdmVyYWdlYmFuZHdpZHRoPSBvciBBdmVyYWdlQmFuZHdpZHRoPSAqLwotICAgICAgICBpZiAoc3NjYW5mKHAsICIgJSoxW0FhXXZlcmFnZSUqMVtCYl1hbmR3aWR0aD0lIlNDTmQ2NCwgJnN0LT5jb2RlYy0+Yml0X3JhdGUpID09IDEpCisgICAgICAgIGlmIChzc2NhbmYocCwgIiAlKjFbQWFddmVyYWdlJSoxW0JiXWFuZHdpZHRoPSUiU0NOZDY0LCAmc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSkgPT0gMSkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBpZiAoIShwID0gc3RyY2hyKHAsICcsJykpIHx8IHAgPiBlbmQpCiAgICAgICAgICAgICBwID0gZW5kOwpAQCAtNDY0LDcgKzQ2NCw3IEBACiAgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgc3QtPmlkID0gb3JpZ19zdC0+aWQ7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gb3JpZ19zdC0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gb3JpZ19zdC0+Y29kZWNwYXItPmNvZGVjX3R5cGU7CiAgICAgc3QtPmZpcnN0X2R0cyAgICAgICAgID0gb3JpZ19zdC0+Zmlyc3RfZHRzOwogCiAgICAgcmV0dXJuIHN0OwpAQCAtNTMxLDcgKzUzMSw3IEBACiAgICAgaWYgKCFyZHQtPnJtY3R4KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlbGlzdHMocmR0LT5ybWN0eCwgcykpIDwgMCkKKyAgICBpZiAoKHJldCA9IGZmX2NvcHlfd2hpdGVibGFja2xpc3RzKHJkdC0+cm1jdHgsIHMpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICByZXR1cm4gYXZmb3JtYXRfb3Blbl9pbnB1dCgmcmR0LT5ybWN0eCwgIiIsICZmZl9yZHRfZGVtdXhlciwgTlVMTCk7CkBAIC01NTQsNyArNTU0LDcgQEAKIH0KIAogI2RlZmluZSBSRFRfSEFORExFUihuLCBzLCB0KSBcCi1zdGF0aWMgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciByZHRfICMjIG4gIyMgX2hhbmRsZXIgPSB7IFwKK1JUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcmR0XyAjIyBuICMjIF9oYW5kbGVyID0geyBcCiAgICAgLmVuY19uYW1lICAgICAgICAgPSBzLCBcCiAgICAgLmNvZGVjX3R5cGUgICAgICAgPSB0LCBcCiAgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLCBcCkBAIC01NzAsMTAgKzU3MCwzIEBACiBSRFRfSEFORExFUih2aWRlbywgICAgICAieC1wbi1yZWFsdmlkZW8iLCAgICAgICAgICAgICAgICBBVk1FRElBX1RZUEVfVklERU8pOwogUkRUX0hBTkRMRVIoYXVkaW8sICAgICAgIngtcG4tcmVhbGF1ZGlvIiwgICAgICAgICAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPKTsKIAotdm9pZCBmZl9yZWdpc3Rlcl9yZHRfZHluYW1pY19wYXlsb2FkX2hhbmRsZXJzKHZvaWQpCi17Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJnJkdF92aWRlb19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmcmR0X2F1ZGlvX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZyZHRfbGl2ZV92aWRlb19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmcmR0X2xpdmVfYXVkaW9faGFuZGxlcik7Ci19CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yZHQuaCBiL2xpYmF2Zm9ybWF0L3JkdC5oCmluZGV4IGNlNjAyNmYuLjY3ZmIzMDggMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3JkdC5oCisrKyBiL2xpYmF2Zm9ybWF0L3JkdC5oCkBAIC00MSw3ICs0MSw3IEBACiBSRFREZW11eENvbnRleHQgKmZmX3JkdF9wYXJzZV9vcGVuKEFWRm9ybWF0Q29udGV4dCAqaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaXJzdF9zdHJlYW1fb2Zfc2V0X2lkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHJpdl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlcik7CiB2b2lkIGZmX3JkdF9wYXJzZV9jbG9zZShSRFREZW11eENvbnRleHQgKnMpOwogCiAvKioKQEAgLTYwLDExICs2MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjaGFsbGVuZ2UpOwogCiAvKioKLSAqIFJlZ2lzdGVyIFJEVC1yZWxhdGVkIGR5bmFtaWMgcGF5bG9hZCBoYW5kbGVycyB3aXRoIG91ciBjYWNoZS4KLSAqLwotdm9pZCBmZl9yZWdpc3Rlcl9yZHRfZHluYW1pY19wYXlsb2FkX2hhbmRsZXJzKHZvaWQpOwotCi0vKioKICAqIEFkZCBzdWJzY3JpcHRpb24gaW5mb3JtYXRpb24gdG8gU3Vic2NyaWJlIHBhcmFtZXRlciBzdHJpbmcuCiAgKgogICogQHBhcmFtIGNtZCBzdHJpbmcgdG8gd3JpdGUgdGhlIHN1YnNjcmlwdGlvbiBpbmZvcm1hdGlvbiBpbnRvLgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcmVhbHRleHRkZWMuYyBiL2xpYmF2Zm9ybWF0L3JlYWx0ZXh0ZGVjLmMKaW5kZXggZjEzMzIxYy4uNjE4ZDRmNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcmVhbHRleHRkZWMuYworKysgYi9saWJhdmZvcm1hdC9yZWFsdGV4dGRlYy5jCkBAIC03MCw4ICs3MCw4IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfUkVBTFRFWFQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1JFQUxURVhUOwogCiAgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKIApAQCAtODksMTIgKzg5LDEyIEBACiAKICAgICAgICAgICAgIGlmIChwKQogICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gcmVhZF90cyhwKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhID0gYXZfc3RyZHVwKGJ1Zi5zdHIpOwotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgPSBhdl9zdHJkdXAoYnVmLnN0cik7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IGJ1Zi5sZW4gKyAxOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA9IGJ1Zi5sZW4gKyAxOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyogaWYgd2UganVzdCByZWFkIGEgPHRpbWU+IHRhZywgaW50cm9kdWNlIGEgbmV3IGV2ZW50LCBvdGhlcndpc2UgbWVyZ2UKICAgICAgICAgICAgICAqIHdpdGggdGhlIHByZXZpb3VzIG9uZSAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcmVkc3BhcmsuYyBiL2xpYmF2Zm9ybWF0L3JlZHNwYXJrLmMKaW5kZXggNWNlYTZlOS4uYzI0NzA0NiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcmVkc3BhcmsuYworKysgYi9saWJhdmZvcm1hdC9yZWRzcGFyay5jCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogI2RlZmluZSBIRUFERVJfU0laRSA0MDk2CisjZGVmaW5lIHJvbCh2YWx1ZSwgYml0cykgKCgodmFsdWUpIDw8IChiaXRzKSkgfCAoKHZhbHVlKSA+PiAoMzIgLSAoYml0cykpKSkKIAogdHlwZWRlZiBzdHJ1Y3QgUmVkU3BhcmtDb250ZXh0IHsKICAgICBpbnQgICAgICAgICBzYW1wbGVzX2NvdW50OwpAQCAtMzgsMTEgKzM5LDEzIEBACiAKICAgICAvKiBEZWNyeXB0IGZpcnN0IDggYnl0ZXMgb2YgdGhlIGhlYWRlciAqLwogICAgIGRhdGEgPSBBVl9SQjMyKHAtPmJ1Zik7Ci0gICAgZGF0YSA9IGRhdGEgXiAoa2V5ID0gZGF0YSBeIDB4NTI2NTY0NTMpOworICAgIGtleSAgPSBkYXRhIF4gMHg1MjY1NjQ1MzsKKyAgICBkYXRhIF49IGtleTsKICAgICBBVl9XQjMyKGhlYWRlciwgZGF0YSk7Ci0gICAga2V5ID0gKGtleSA8PCAxMSkgfCAoa2V5ID4+IDIxKTsKKyAgICBrZXkgPSByb2woa2V5LCAxMSk7CiAKLSAgICBkYXRhID0gQVZfUkIzMihwLT5idWYgKyA0KSBeICgoKGtleSA8PCAzKSB8IChrZXkgPj4gMjkpKSArIGtleSk7CisgICAga2V5ICs9IHJvbChrZXksIDMpOworICAgIGRhdGEgPSBBVl9SQjMyKHAtPmJ1ZiArIDQpIF4ga2V5OwogICAgIEFWX1dCMzIoaGVhZGVyICsgNCwgZGF0YSk7CiAKICAgICBpZiAoQVZfUkI2NChoZWFkZXIpID09IEFWX1JCNjQoIlJlZFNwYXJrIikpCkBAIC01NSw5MiArNTgsODEgQEAKIHsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBSZWRTcGFya0NvbnRleHQgKnJlZHNwYXJrID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyOwogICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKICAgICBpbnQgaSwgY29lZl9vZmYsIHJldCA9IDA7CiAgICAgdWludDMyX3Qga2V5LCBkYXRhOwotICAgIHVpbnQ4X3QgKmhlYWRlciwgKnBiYzsKKyAgICB1aW50OF90IGhlYWRlcltIRUFERVJfU0laRV07CiAgICAgQVZTdHJlYW0gKnN0OwogCiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgY29kZWMgPSBzdC0+Y29kZWM7Ci0KLSAgICBoZWFkZXIgPSBhdl9tYWxsb2MoSEVBREVSX1NJWkUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKLSAgICBpZiAoIWhlYWRlcikKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBwYmMgPSBoZWFkZXI7CisgICAgcGFyID0gc3QtPmNvZGVjcGFyOwogCiAgICAgLyogRGVjcnlwdCBoZWFkZXIgKi8KICAgICBkYXRhID0gYXZpb19yYjMyKHBiKTsKLSAgICBkYXRhID0gZGF0YSBeIChrZXkgPSBkYXRhIF4gMHg1MjY1NjQ1Myk7Ci0gICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcGJjLCBkYXRhKTsKLSAgICBrZXkgPSAoa2V5IDw8IDExKSB8IChrZXkgPj4gMjEpOworICAgIGtleSAgPSBkYXRhIF4gMHg1MjY1NjQ1MzsKKyAgICBkYXRhIF49IGtleTsKKyAgICBBVl9XQjMyKGhlYWRlciwgZGF0YSk7CisgICAga2V5ID0gcm9sKGtleSwgMTEpOwogCiAgICAgZm9yIChpID0gNDsgaSA8IEhFQURFUl9TSVpFOyBpICs9IDQpIHsKLSAgICAgICAgZGF0YSA9IGF2aW9fcmIzMihwYikgXiAoa2V5ID0gKChrZXkgPDwgMykgfCAoa2V5ID4+IDI5KSkgKyBrZXkpOwotICAgICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwYmMsIGRhdGEpOworICAgICAgICBrZXkgKz0gcm9sKGtleSwgMyk7CisgICAgICAgIGRhdGEgPSBhdmlvX3JiMzIocGIpIF4ga2V5OworICAgICAgICBBVl9XQjMyKGhlYWRlciArIGksIGRhdGEpOwogICAgIH0KIAotICAgIGNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX1RIUDsKLSAgICBjb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX1RIUDsKKyAgICBwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwogCiAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBoZWFkZXIsIEhFQURFUl9TSVpFKTsKICAgICBieXRlc3RyZWFtMl9zZWVrKCZnYmMsIDB4M2MsIFNFRUtfU0VUKTsKLSAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiYyk7Ci0gICAgaWYgKGNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwIHx8IGNvZGVjLT5zYW1wbGVfcmF0ZSA+IDk2MDAwKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlOiAlZFxuIiwgY29kZWMtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgZ290byBmYWlsOworICAgIHBhci0+c2FtcGxlX3JhdGUgPSBieXRlc3RyZWFtMl9nZXRfYmUzMnUoJmdiYyk7CisgICAgaWYgKHBhci0+c2FtcGxlX3JhdGUgPD0gMCB8fCBwYXItPnNhbXBsZV9yYXRlID4gOTYwMDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2FtcGxlIHJhdGU6ICVkXG4iLCBwYXItPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgc3QtPmR1cmF0aW9uID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMzJ1KCZnYmMpICogMTQ7CiAgICAgcmVkc3BhcmstPnNhbXBsZXNfY291bnQgPSAwOwogICAgIGJ5dGVzdHJlYW0yX3NraXB1KCZnYmMsIDEwKTsKLSAgICBjb2RlYy0+Y2hhbm5lbHMgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiYyk7Ci0gICAgaWYgKCFjb2RlYy0+Y2hhbm5lbHMpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgZ290byBmYWlsOworICAgIHBhci0+Y2hhbm5lbHMgPSBieXRlc3RyZWFtMl9nZXRfYnl0ZXUoJmdiYyk7CisgICAgaWYgKCFwYXItPmNoYW5uZWxzKSB7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGNvZWZfb2ZmID0gMHg1NCArIGNvZGVjLT5jaGFubmVscyAqIDg7CisgICAgY29lZl9vZmYgPSAweDU0ICsgcGFyLT5jaGFubmVscyAqIDg7CiAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRldSgmZ2JjKSkgLy8gTG9vcCBmbGFnCiAgICAgICAgIGNvZWZfb2ZmICs9IDE2OwogCi0gICAgaWYgKGNvZWZfb2ZmICsgY29kZWMtPmNoYW5uZWxzICogKDMyICsgMTQpID4gSEVBREVSX1NJWkUpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgZ290byBmYWlsOworICAgIGlmIChjb2VmX29mZiArIHBhci0+Y2hhbm5lbHMgKiAoMzIgKyAxNCkgPiBIRUFERVJfU0laRSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKGNvZGVjLCAzMiAqIGNvZGVjLT5jaGFubmVscykpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShwYXIsIDMyICogcGFyLT5jaGFubmVscykpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCiAgICAgLyogR2V0IHRoZSBBRFBDTSB0YWJsZSAqLwogICAgIGJ5dGVzdHJlYW0yX3NlZWsoJmdiYywgY29lZl9vZmYsIFNFRUtfU0VUKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmNoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9idWZmZXJ1KCZnYmMsIGNvZGVjLT5leHRyYWRhdGEgKyBpICogMzIsIDMyKSAhPSAzMikgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcGFyLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnVmZmVydSgmZ2JjLCBwYXItPmV4dHJhZGF0YSArIGkgKiAzMiwgMzIpICE9IDMyKSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgfQogICAgICAgICBieXRlc3RyZWFtMl9za2lwdSgmZ2JjLCAxNCk7CiAgICAgfQogCi0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGNvZGVjLT5zYW1wbGVfcmF0ZSk7Ci0KLWZhaWw6Ci0gICAgYXZfZnJlZShoZWFkZXIpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIHJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgcmVkc3BhcmtfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKICAgICBSZWRTcGFya0NvbnRleHQgKnJlZHNwYXJrID0gcy0+cHJpdl9kYXRhOwotICAgIHVpbnQzMl90IHNpemUgPSA4ICogY29kZWMtPmNoYW5uZWxzOworICAgIHVpbnQzMl90IHNpemUgPSA4ICogcGFyLT5jaGFubmVsczsKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKGF2aW9fZmVvZihzLT5wYikgfHwgcmVkc3BhcmstPnNhbXBsZXNfY291bnQgPT0gcy0+c3RyZWFtc1swXS0+ZHVyYXRpb24pCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yaWZmLmMgYi9saWJhdmZvcm1hdC9yaWZmLmMKaW5kZXggY2Y1YTJmZi4uODkxMTcyNSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcmlmZi5jCisrKyBiL2xpYmF2Zm9ybWF0L3JpZmYuYwpAQCAtNTYsNiArNTYsNyBAQAogICAgIHsgQVZfQ09ERUNfSURfSDI2M0ksICAgICAgICBNS1RBRygnSScsICcyJywgJzYnLCAnMycpIH0sIC8qIEludGVsIEguMjYzICovCiAgICAgeyBBVl9DT0RFQ19JRF9IMjYxLCAgICAgICAgIE1LVEFHKCdIJywgJzInLCAnNicsICcxJykgfSwKICAgICB7IEFWX0NPREVDX0lEX0gyNjMsICAgICAgICAgTUtUQUcoJ1UnLCAnMicsICc2JywgJzMnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfSDI2MywgICAgICAgICBNS1RBRygnVicsICdTJywgJ00nLCAnNCcpIH0sIC8qIG5lZWRzIC12ZiBpbD1sPWk6Yz1pICovCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHNCwgICAgICAgIE1LVEFHKCdGJywgJ00nLCAnUCcsICc0JykgfSwKICAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ0QnLCAnSScsICdWJywgJ1gnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRCcsICdYJywgJzUnLCAnMCcpIH0sCkBAIC0xMTMsNiArMTE0LDcgQEAKICAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ0cnLCAnTCcsICdWJywgJzQnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTVBFRzQsICAgICAgICBNS1RBRygnRycsICdNJywgJ1AnLCAnNCcpIH0sIC8qIEdlb1Zpc2lvbiBjYW1lcmEgKi8KICAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ00nLCAnTicsICdNJywgJzQnKSB9LCAvKiBNYXJjaCBOZXR3b3JrcyBEVlIgKi8KKyAgICB7IEFWX0NPREVDX0lEX01QRUc0LCAgICAgICAgTUtUQUcoJ0cnLCAnVCcsICdNJywgJzQnKSB9LCAvKiBUZWxlZmFjdG9yICovCiAgICAgeyBBVl9DT0RFQ19JRF9NU01QRUc0VjMsICAgIE1LVEFHKCdNJywgJ1AnLCAnNCcsICczJykgfSwKICAgICB7IEFWX0NPREVDX0lEX01TTVBFRzRWMywgICAgTUtUQUcoJ0QnLCAnSScsICdWJywgJzMnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTVNNUEVHNFYzLCAgICBNS1RBRygnTScsICdQJywgJ0cnLCAnMycpIH0sCkBAIC0xNTEsNyArMTUzLDYgQEAKICAgICB7IEFWX0NPREVDX0lEX0RWVklERU8sICAgICAgTUtUQUcoJ1MnLCAnTCcsICdEJywgJ1YnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfRFZWSURFTywgICAgICBNS1RBRygnQScsICdWJywgJ2QnLCAnMScpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHMVZJREVPLCAgIE1LVEFHKCdtJywgJ3AnLCAnZycsICcxJykgfSwKLSAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sICAgTUtUQUcoJ20nLCAncCcsICdnJywgJzInKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgICBNS1RBRygnbScsICdwJywgJ2cnLCAnMicpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAgIE1LVEFHKCdNJywgJ1AnLCAnRScsICdHJykgfSwKICAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sICAgTUtUQUcoJ1AnLCAnSScsICdNJywgJzEnKSB9LApAQCAtMTY4LDYgKzE2OSw5IEBACiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAgIE1LVEFHKCdFJywgJ00nLCAnMicsICdWJykgfSwKICAgICAvKiBNYXRyb3ggTVBFRy0yIGludHJhLW9ubHkgKi8KICAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAgTUtUQUcoJ00nLCAnNycsICcwJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgICBNS1RBRygnTScsICc3JywgJzAnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAgIE1LVEFHKCdNJywgJzcnLCAnMCcsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01QRUcyVklERU8sICAgTUtUQUcoJ00nLCAnNycsICcwJywgJzQnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTVBFRzJWSURFTywgICBNS1RBRygnTScsICc3JywgJzAnLCAnNScpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9NUEVHMlZJREVPLCAgIE1LVEFHKCdtJywgJ3AnLCAnZycsICd2JykgfSwKICAgICB7IEFWX0NPREVDX0lEX01QRUcxVklERU8sICAgTUtUQUcoJ0InLCAnVycsICcxJywgJzAnKSB9LApAQCAtMTc3LDYgKzE4MSw3IEBACiAgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAgIE1LVEFHKCdMJywgJ0onLCAnUCcsICdHJykgfSwKICAgICB7IEFWX0NPREVDX0lEX01KUEVHLCAgICAgICAgTUtUQUcoJ2QnLCAnbScsICdiJywgJzEnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTUpQRUcsICAgICAgICBNS1RBRygnbScsICdqJywgJ3AnLCAnYScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAgIE1LVEFHKCdKJywgJ1InLCAnMicsICc0JykgfSwgLyogUXVhZHJveCBNanBlZyAqLwogICAgIHsgQVZfQ09ERUNfSURfTEpQRUcsICAgICAgICBNS1RBRygnTCcsICdKJywgJ1AnLCAnRycpIH0sCiAgICAgLyogUGVnYXN1cyBsb3NzbGVzcyBKUEVHICovCiAgICAgeyBBVl9DT0RFQ19JRF9NSlBFRywgICAgICAgIE1LVEFHKCdKJywgJ1AnLCAnRycsICdMJykgfSwKQEAgLTI3OCw2ICsyODMsMTQgQEAKICAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ0knLCAnNCcsICdBJywgJ0InKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnSScsICc0JywgJ0YnLCAnTCcpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdJJywgJzQnLCAnRicsICdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ0knLCAnMCcsICdDJywgJ0wnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnSScsICcwJywgJ0MnLCAnQicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdJJywgJzInLCAnQycsICdMJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ0knLCAnMicsICdDJywgJ0InKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnSScsICc0JywgJ0MnLCAnTCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9SQVdWSURFTywgICAgIE1LVEFHKCdJJywgJzQnLCAnQycsICdCJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1JBV1ZJREVPLCAgICAgTUtUQUcoJ0knLCAnMCcsICdGJywgJ0wnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfUkFXVklERU8sICAgICBNS1RBRygnSScsICcwJywgJ0YnLCAnQicpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9GUldVLCAgICAgICAgIE1LVEFHKCdGJywgJ1InLCAnVycsICdVJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1IxMEssICAgICAgICAgTUtUQUcoJ1InLCAnMScsICcwJywgJ2snKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUjIxMCwgICAgICAgICBNS1RBRygncicsICcyJywgJzEnLCAnMCcpIH0sCkBAIC0zNTEsNiArMzY0LDcgQEAKICAgICB7IEFWX0NPREVDX0lEX0ZSQVBTLCAgICAgICAgTUtUQUcoJ0YnLCAnUCcsICdTJywgJzEnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfVEhFT1JBLCAgICAgICBNS1RBRygndCcsICdoJywgJ2UnLCAnbycpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9UUlVFTU9USU9OMiwgIE1LVEFHKCdUJywgJ00nLCAnMicsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1RSVUVNT1RJT04yUlQsTUtUQUcoJ1QnLCAnUicsICcyJywgJzAnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfQ1NDRCwgICAgICAgICBNS1RBRygnQycsICdTJywgJ0MnLCAnRCcpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9aTUJWLCAgICAgICAgIE1LVEFHKCdaJywgJ00nLCAnQicsICdWJykgfSwKICAgICB7IEFWX0NPREVDX0lEX0tNVkMsICAgICAgICAgTUtUQUcoJ0snLCAnTScsICdWJywgJ0MnKSB9LApAQCAtMzgyLDEwICszOTYsMjAgQEAKICAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnTCcsICdSJywgJ0cnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfVVRWSURFTywgICAgICBNS1RBRygnVScsICdMJywgJ1knLCAnMCcpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9VVFZJREVPLCAgICAgIE1LVEFHKCdVJywgJ0wnLCAnWScsICcyJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnTCcsICdZJywgJzQnKSB9LAogICAgIC8qIFV0IFZpZGVvIHZlcnNpb24gMTMuMC4xIEJULjcwOSBjb2RlY3MgKi8KICAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnTCcsICdIJywgJzAnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfVVRWSURFTywgICAgICBNS1RBRygnVScsICdMJywgJ0gnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9VVFZJREVPLCAgICAgIE1LVEFHKCdVJywgJ0wnLCAnSCcsICc0JykgfSwKICAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnUScsICdZJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVVRWSURFTywgICAgICBNS1RBRygnVScsICdRJywgJ1InLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9VVFZJREVPLCAgICAgIE1LVEFHKCdVJywgJ1EnLCAnUicsICdHJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnTScsICdZJywgJzInKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVVRWSURFTywgICAgICBNS1RBRygnVScsICdNJywgJ0gnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9VVFZJREVPLCAgICAgIE1LVEFHKCdVJywgJ00nLCAnWScsICc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1VUVklERU8sICAgICAgTUtUQUcoJ1UnLCAnTScsICdIJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfVVRWSURFTywgICAgICBNS1RBRygnVScsICdNJywgJ1InLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9VVFZJREVPLCAgICAgIE1LVEFHKCdVJywgJ00nLCAnUicsICdHJykgfSwKICAgICB7IEFWX0NPREVDX0lEX1ZCTEUsICAgICAgICAgTUtUQUcoJ1YnLCAnQicsICdMJywgJ0UnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfRVNDQVBFMTMwLCAgICBNS1RBRygnRScsICcxJywgJzMnLCAnMCcpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9EWFRPUlksICAgICAgIE1LVEFHKCd4JywgJ3QnLCAnbycsICdyJykgfSwKQEAgLTQxNCw2ICs0MzgsMzcgQEAKICAgICB7IEFWX0NPREVDX0lEX1JTQ0MsICAgICAgICAgTUtUQUcoJ1InLCAnUycsICdDJywgJ0MnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfUlNDQywgICAgICAgICBNS1RBRygnSScsICdTJywgJ0MnLCAnQycpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9DRkhELCAgICAgICAgIE1LVEFHKCdDJywgJ0YnLCAnSCcsICdEJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX00xMDEsICAgICAgICAgTUtUQUcoJ00nLCAnMScsICcwJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTTEwMSwgICAgICAgICBNS1RBRygnTScsICcxJywgJzAnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgICAgIE1LVEFHKCdNJywgJ0EnLCAnRycsICdZJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCAgICAgTUtUQUcoJ00nLCAnOCcsICdSJywgJ0cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFHSUNZVVYsICAgICBNS1RBRygnTScsICc4JywgJ1InLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgICAgIE1LVEFHKCdNJywgJzgnLCAnRycsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCAgICAgTUtUQUcoJ00nLCAnOCcsICdZJywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFHSUNZVVYsICAgICBNS1RBRygnTScsICc4JywgJ1knLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgICAgIE1LVEFHKCdNJywgJzgnLCAnWScsICc0JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCAgICAgTUtUQUcoJ00nLCAnOCcsICdZJywgJ0EnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFHSUNZVVYsICAgICBNS1RBRygnTScsICcwJywgJ1InLCAnQScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgICAgIE1LVEFHKCdNJywgJzAnLCAnUicsICdHJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCAgICAgTUtUQUcoJ00nLCAnMCcsICdHJywgJzAnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfTUFHSUNZVVYsICAgICBNS1RBRygnTScsICcwJywgJ1knLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NQUdJQ1lVViwgICAgIE1LVEFHKCdNJywgJzInLCAnUicsICdBJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX01BR0lDWVVWLCAgICAgTUtUQUcoJ00nLCAnMicsICdSJywgJ0cnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfWUxDLCAgICAgICAgICBNS1RBRygnWScsICdMJywgJ0MnLCAnMCcpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TUEVFREhRLCAgICAgIE1LVEFHKCdTJywgJ0gnLCAnUScsICcwJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NQRUVESFEsICAgICAgTUtUQUcoJ1MnLCAnSCcsICdRJywgJzEnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfU1BFRURIUSwgICAgICBNS1RBRygnUycsICdIJywgJ1EnLCAnMicpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TUEVFREhRLCAgICAgIE1LVEFHKCdTJywgJ0gnLCAnUScsICczJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NQRUVESFEsICAgICAgTUtUQUcoJ1MnLCAnSCcsICdRJywgJzQnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfU1BFRURIUSwgICAgICBNS1RBRygnUycsICdIJywgJ1EnLCAnNScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TUEVFREhRLCAgICAgIE1LVEFHKCdTJywgJ0gnLCAnUScsICc3JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NQRUVESFEsICAgICAgTUtUQUcoJ1MnLCAnSCcsICdRJywgJzknKSB9LAorICAgIHsgQVZfQ09ERUNfSURfRk1WQywgICAgICAgICBNS1RBRygnRicsICdNJywgJ1YnLCAnQycpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9TQ1BSLCAgICAgICAgIE1LVEFHKCdTJywgJ0MnLCAnUCcsICdSJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0NMRUFSVklERU8sICAgTUtUQUcoJ1UnLCAnQycsICdPJywgJ0QnKSB9LAorICAgIHsgQVZfQ09ERUNfSURfQVYxLCAgICAgICAgICBNS1RBRygnQScsICdWJywgJzAnLCAnMScpIH0sCisgICAgeyBBVl9DT0RFQ19JRF9NU0NDLCAgICAgICAgIE1LVEFHKCdNJywgJ1MnLCAnQycsICdDJykgfSwKKyAgICB7IEFWX0NPREVDX0lEX1NSR0MsICAgICAgICAgTUtUQUcoJ1MnLCAnUicsICdHJywgJ0MnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfTk9ORSwgICAgICAgICAwIH0KIH07CiAKQEAgLTQyMyw2ICs0NzgsNyBAQAogICAgIHsgQVZfQ09ERUNfSURfUENNX1U4LCAgICAgICAgICAweDAwMDEgfSwKICAgICB7IEFWX0NPREVDX0lEX1BDTV9TMjRMRSwgICAgICAgMHgwMDAxIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9QQ01fUzMyTEUsICAgICAgIDB4MDAwMSB9LAorICAgIHsgQVZfQ09ERUNfSURfUENNX1M2NExFLCAgICAgICAweDAwMDEgfSwKICAgICB7IEFWX0NPREVDX0lEX0FEUENNX01TLCAgICAgICAgMHgwMDAyIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9QQ01fRjMyTEUsICAgICAgIDB4MDAwMyB9LAogICAgIC8qIG11c3QgY29tZSBhZnRlciBmMzJsZSBpbiB0aGlzIGxpc3QgKi8KQEAgLTQ0Miw2ICs0OTgsOCBAQAogICAgIHsgQVZfQ09ERUNfSURfQU1SX05CLCAgICAgICAgICAweDAwMzggfSwgIC8qIHJvZ3VlIGZvcm1hdCBudW1iZXIgKi8KICAgICB7IEFWX0NPREVDX0lEX0c3MjNfMSwgICAgICAgICAgMHgwMDQyIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2LCAgICAgIDB4MDA0NSB9LAorICAgIHsgQVZfQ09ERUNfSURfQURQQ01fRzcyNiwgICAgICAweDAwMTQgfSwgIC8qIGc3MjMgQW50ZXggKi8KKyAgICB7IEFWX0NPREVDX0lEX0FEUENNX0c3MjYsICAgICAgMHgwMDQwIH0sICAvKiBnNzIxIEFudGV4ICovCiAgICAgeyBBVl9DT0RFQ19JRF9NUDIsICAgICAgICAgICAgIDB4MDA1MCB9LAogICAgIHsgQVZfQ09ERUNfSURfTVAzLCAgICAgICAgICAgICAweDAwNTUgfSwKICAgICB7IEFWX0NPREVDX0lEX0FNUl9OQiwgICAgICAgICAgMHgwMDU3IH0sCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yaWZmLmggYi9saWJhdmZvcm1hdC9yaWZmLmgKaW5kZXggM2I1N2JiNC4uMzIzYWEzOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcmlmZi5oCisrKyBiL2xpYmF2Zm9ybWF0L3JpZmYuaApAQCAtNDEsMTEgKzQxLDEyIEBACiAvKioKICAqIFJlYWQgQklUTUFQSU5GT0hFQURFUiBzdHJ1Y3R1cmUgYW5kIHNldCBBVlN0cmVhbSBjb2RlYyB3aWR0aCwgaGVpZ2h0IGFuZAogICogYml0c19wZXJfZW5jb2RlZF9zYW1wbGUgZmllbGRzLiBEb2VzIG5vdCByZWFkIGV4dHJhZGF0YS4KKyAqIFdyaXRlcyB0aGUgc2l6ZSBvZiB0aGUgQk1QIGZpbGUgdG8gKnNpemUuCiAgKiBAcmV0dXJuIGNvZGVjIHRhZwogICovCi1pbnQgZmZfZ2V0X2JtcF9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBBVlN0cmVhbSAqc3QsIHVuc2lnbmVkICplc2l6ZSk7CitpbnQgZmZfZ2V0X2JtcF9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBBVlN0cmVhbSAqc3QsIHVpbnQzMl90ICpzaXplKTsKIAotdm9pZCBmZl9wdXRfYm1wX2hlYWRlcihBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICplbmMsIGNvbnN0IEFWQ29kZWNUYWcgKnRhZ3MsIGludCBmb3JfYXNmLCBpbnQgaWdub3JlX2V4dHJhZGF0YSk7Cit2b2lkIGZmX3B1dF9ibXBfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgaW50IGZvcl9hc2YsIGludCBpZ25vcmVfZXh0cmFkYXRhKTsKIAogLyoqCiAgKiBUZWxsIGZmX3B1dF93YXZfaGVhZGVyKCkgdG8gdXNlIFdBVkVGT1JNQVRFWCBldmVuIGZvciBQQ00gY29kZWNzLgpAQCAtNjQsMTAgKzY1LDEwIEBACiAgKgogICogQHJldHVybiB0aGUgc2l6ZSBvciAtMSBvbiBlcnJvcgogICovCi1pbnQgZmZfcHV0X3dhdl9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBBVkNvZGVjQ29udGV4dCAqZW5jLCBpbnQgZmxhZ3MpOworaW50IGZmX3B1dF93YXZfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBpbnQgZmxhZ3MpOwogCiBlbnVtIEFWQ29kZWNJRCBmZl93YXZfY29kZWNfZ2V0X2lkKHVuc2lnbmVkIGludCB0YWcsIGludCBicHMpOwotaW50IGZmX2dldF93YXZfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZJT0NvbnRleHQgKnBiLCBBVkNvZGVjQ29udGV4dCAqY29kZWMsIGludCBzaXplLCBpbnQgYmlnX2VuZGlhbik7CitpbnQgZmZfZ2V0X3dhdl9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIGludCBzaXplLCBpbnQgYmlnX2VuZGlhbik7CiAKIGV4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX2JtcF90YWdzW107IC8vIGV4cG9zZWQgdGhyb3VnaCBhdmZvcm1hdF9nZXRfcmlmZl92aWRlb190YWdzKCkKIGV4dGVybiBjb25zdCBBVkNvZGVjVGFnIGZmX2NvZGVjX3dhdl90YWdzW107CkBAIC0xMDksNiArMTEwLDggQEAKICAgICAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweEFBLCAweDAwLCAweDM4LCAweDlCLCAweDcxCiAjZGVmaW5lIEZGX0FNQklTT05JQ19CQVNFX0dVSUQgXAogICAgIDB4MjEsIDB4MDcsIDB4RDMsIDB4MTEsIDB4ODYsIDB4NDQsIDB4QzgsIDB4QzEsIDB4Q0EsIDB4MDAsIDB4MDAsIDB4MDAKKyNkZWZpbmUgRkZfQlJPS0VOX0JBU0VfR1VJRCBcCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhBQQogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgZmZfZ3VpZGNtcChjb25zdCB2b2lkICpnMSwgY29uc3Qgdm9pZCAqZzIpCiB7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yaWZmZGVjLmMgYi9saWJhdmZvcm1hdC9yaWZmZGVjLmMKaW5kZXggZDdiODFhMC4uYjQ0OGY5MSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcmlmZmRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3JpZmZkZWMuYwpAQCAtNTgsMjcgKzU4LDMwIEBACiAgKiBhbiBvcGVuZW5kZWQgc3RydWN0dXJlLgogICovCiAKLXN0YXRpYyB2b2lkIHBhcnNlX3dhdmVmb3JtYXRleChBVklPQ29udGV4dCAqcGIsIEFWQ29kZWNDb250ZXh0ICpjKQorc3RhdGljIHZvaWQgcGFyc2Vfd2F2ZWZvcm1hdGV4KEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcikKIHsKICAgICBmZl9hc2ZfZ3VpZCBzdWJmb3JtYXQ7Ci0gICAgaW50IGJwcyA9IGF2aW9fcmwxNihwYik7Ci0gICAgaWYgKGJwcykKLSAgICAgICAgYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnBzOworICAgIGludCBicHM7CiAKLSAgICBjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSBhdmlvX3JsMzIocGIpOyAvKiBkd0NoYW5uZWxNYXNrICovCisgICAgYnBzID0gYXZpb19ybDE2KHBiKTsKKyAgICBpZiAoYnBzKQorICAgICAgICBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGJwczsKKyAgICBwYXItPmNoYW5uZWxfbGF5b3V0ICAgICAgICA9IGF2aW9fcmwzMihwYik7IC8qIGR3Q2hhbm5lbE1hc2sgKi8KIAogICAgIGZmX2dldF9ndWlkKHBiLCAmc3ViZm9ybWF0KTsKICAgICBpZiAoIW1lbWNtcChzdWJmb3JtYXQgKyA0LAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90W10peyBGRl9BTUJJU09OSUNfQkFTRV9HVUlEIH0sIDEyKSB8fAogICAgICAgICAhbWVtY21wKHN1YmZvcm1hdCArIDQsCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3RbXSl7IEZGX0JST0tFTl9CQVNFX0dVSUQgfSwgMTIpIHx8CisgICAgICAgICFtZW1jbXAoc3ViZm9ybWF0ICsgNCwKICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdFtdKXsgRkZfTUVESUFTVUJUWVBFX0JBU0VfR1VJRCB9LCAxMikpIHsKLSAgICAgICAgYy0+Y29kZWNfdGFnID0gQVZfUkwzMihzdWJmb3JtYXQpOwotICAgICAgICBjLT5jb2RlY19pZCAgPSBmZl93YXZfY29kZWNfZ2V0X2lkKGMtPmNvZGVjX3RhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICBwYXItPmNvZGVjX3RhZyA9IEFWX1JMMzIoc3ViZm9ybWF0KTsKKyAgICAgICAgcGFyLT5jb2RlY19pZCAgPSBmZl93YXZfY29kZWNfZ2V0X2lkKHBhci0+Y29kZWNfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ3VpZF9nZXRfaWQoZmZfY29kZWNfd2F2X2d1aWRzLCBzdWJmb3JtYXQpOwotICAgICAgICBpZiAoIWMtPmNvZGVjX2lkKQotICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICBwYXItPmNvZGVjX2lkID0gZmZfY29kZWNfZ3VpZF9nZXRfaWQoZmZfY29kZWNfd2F2X2d1aWRzLCBzdWJmb3JtYXQpOworICAgICAgICBpZiAoIXBhci0+Y29kZWNfaWQpCisgICAgICAgICAgICBhdl9sb2cocGIsIEFWX0xPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICJ1bmtub3duIHN1YmZvcm1hdDoiRkZfUFJJX0dVSUQiXG4iLAogICAgICAgICAgICAgICAgICAgIEZGX0FSR19HVUlEKHN1YmZvcm1hdCkpOwogICAgIH0KQEAgLTg2LDY0ICs4OSw2NCBAQAogCiAvKiAiYmlnX2VuZGlhbiIgdmFsdWVzIGFyZSBuZWVkZWQgZm9yIFJJRlggZmlsZSBmb3JtYXQgKi8KIGludCBmZl9nZXRfd2F2X2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwKLSAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMsIGludCBzaXplLCBpbnQgYmlnX2VuZGlhbikKKyAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBpbnQgc2l6ZSwgaW50IGJpZ19lbmRpYW4pCiB7CiAgICAgaW50IGlkOwogICAgIHVpbnQ2NF90IGJpdHJhdGUgPSAwOwogCiAgICAgaWYgKHNpemUgPCAxNCkgewotICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUoY29kZWMsICJ3YXYgaGVhZGVyIHNpemUgPCAxNCIpOworICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIndhdiBoZWFkZXIgc2l6ZSA8IDE0Iik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgIGlmICghYmlnX2VuZGlhbikgewogICAgICAgICBpZCAgICAgICAgICAgICAgICAgPSBhdmlvX3JsMTYocGIpOwogICAgICAgICBpZiAoaWQgIT0gMHgwMTY1KSB7Ci0gICAgICAgICAgICBjb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3JsMTYocGIpOwotICAgICAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHBiKTsKKyAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgICAgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihwYik7CiAgICAgICAgICAgICBiaXRyYXRlICAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpICogOExMOwotICAgICAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gYXZpb19ybDE2KHBiKTsKKyAgICAgICAgICAgIHBhci0+YmxvY2tfYWxpZ24gPSBhdmlvX3JsMTYocGIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWQgICAgICAgICAgICAgICAgID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgY29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHBiKTsKKyAgICAgICAgcGFyLT5jaGFubmVscyAgICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocGIpOwogICAgICAgICBiaXRyYXRlICAgICAgICAgICAgPSBhdmlvX3JiMzIocGIpICogOExMOwotICAgICAgICBjb2RlYy0+YmxvY2tfYWxpZ24gPSBhdmlvX3JiMTYocGIpOworICAgICAgICBwYXItPmJsb2NrX2FsaWduID0gYXZpb19yYjE2KHBiKTsKICAgICB9CiAgICAgaWYgKHNpemUgPT0gMTQpIHsgIC8qIFdlJ3JlIGRlYWxpbmcgd2l0aCBwbGFpbiB2YW5pbGxhIFdBVkVGT1JNQVQgKi8KLSAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7CisgICAgICAgIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIWJpZ19lbmRpYW4pIHsKLSAgICAgICAgICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMTYocGIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmIxNihwYik7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGlkID09IDB4RkZGRSkgewotICAgICAgICBjb2RlYy0+Y29kZWNfdGFnID0gMDsKKyAgICAgICAgcGFyLT5jb2RlY190YWcgPSAwOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvZGVjLT5jb2RlY190YWcgPSBpZDsKLSAgICAgICAgY29kZWMtPmNvZGVjX2lkICA9IGZmX3dhdl9jb2RlY19nZXRfaWQoaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICBwYXItPmNvZGVjX3RhZyA9IGlkOworICAgICAgICBwYXItPmNvZGVjX2lkICA9IGZmX3dhdl9jb2RlY19nZXRfaWQoaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CiAgICAgfQogICAgIGlmIChzaXplID49IDE4ICYmIGlkICE9IDB4MDE2NSkgeyAgLyogV2UncmUgb2J2aW91c2x5IGRlYWxpbmcgd2l0aCBXQVZFRk9STUFURVggKi8KICAgICAgICAgaW50IGNiU2l6ZSA9IGF2aW9fcmwxNihwYik7IC8qIGNiU2l6ZSAqLwogICAgICAgICBpZiAoYmlnX2VuZGlhbikgewotICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoY29kZWMsICJXQVZFRk9STUFURVggc3VwcG9ydCBmb3IgUklGWCBmaWxlc1xuIik7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLCAiV0FWRUZPUk1BVEVYIHN1cHBvcnQgZm9yIFJJRlggZmlsZXMiKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgfQogICAgICAgICBzaXplICAtPSAxODsKICAgICAgICAgY2JTaXplID0gRkZNSU4oc2l6ZSwgY2JTaXplKTsKICAgICAgICAgaWYgKGNiU2l6ZSA+PSAyMiAmJiBpZCA9PSAweGZmZmUpIHsgLyogV0FWRUZPUk1BVEVYVEVOU0lCTEUgKi8KLSAgICAgICAgICAgIHBhcnNlX3dhdmVmb3JtYXRleChwYiwgY29kZWMpOworICAgICAgICAgICAgcGFyc2Vfd2F2ZWZvcm1hdGV4KHBiLCBwYXIpOwogICAgICAgICAgICAgY2JTaXplIC09IDIyOwogICAgICAgICAgICAgc2l6ZSAgIC09IDIyOwogICAgICAgICB9CiAgICAgICAgIGlmIChjYlNpemUgPiAwKSB7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmY29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShjb2RlYywgcGIsIGNiU2l6ZSkgPCAwKQorICAgICAgICAgICAgYXZfZnJlZXAoJnBhci0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsIHBhciwgcGIsIGNiU2l6ZSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBzaXplIC09IGNiU2l6ZTsKICAgICAgICAgfQpAQCAtMTU1LDM1ICsxNTgsMzUgQEAKICAgICAgICAgaW50IG5iX3N0cmVhbXMsIGk7CiAKICAgICAgICAgc2l6ZSAtPSA0OwotICAgICAgICBhdl9mcmVlcCgmY29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKGNvZGVjLCBwYiwgc2l6ZSkgPCAwKQorICAgICAgICBhdl9mcmVlcCgmcGFyLT5leHRyYWRhdGEpOworICAgICAgICBpZiAoZmZfZ2V0X2V4dHJhZGF0YShzLCBwYXIsIHBiLCBzaXplKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBuYl9zdHJlYW1zICAgICAgICAgPSBBVl9STDE2KGNvZGVjLT5leHRyYWRhdGEgKyA0KTsKLSAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID0gQVZfUkwzMihjb2RlYy0+ZXh0cmFkYXRhICsgMTIpOwotICAgICAgICBjb2RlYy0+Y2hhbm5lbHMgICAgPSAwOworICAgICAgICBuYl9zdHJlYW1zICAgICAgICAgPSBBVl9STDE2KHBhci0+ZXh0cmFkYXRhICsgNCk7CisgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgICA9IEFWX1JMMzIocGFyLT5leHRyYWRhdGEgKyAxMik7CisgICAgICAgIHBhci0+Y2hhbm5lbHMgICAgICA9IDA7CiAgICAgICAgIGJpdHJhdGUgICAgICAgICAgICA9IDA7CiAgICAgICAgIGlmIChzaXplIDwgOCArIG5iX3N0cmVhbXMgKiAyMCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc3RyZWFtczsgaSsrKQotICAgICAgICAgICAgY29kZWMtPmNoYW5uZWxzICs9IGNvZGVjLT5leHRyYWRhdGFbOCArIGkgKiAyMCArIDE3XTsKKyAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgKz0gcGFyLT5leHRyYWRhdGFbOCArIGkgKiAyMCArIDE3XTsKICAgICB9CiAKLSAgICBjb2RlYy0+Yml0X3JhdGUgPSBiaXRyYXRlOworICAgIHBhci0+Yml0X3JhdGUgPSBiaXRyYXRlOwogCi0gICAgaWYgKGNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgaWYgKHBhci0+c2FtcGxlX3JhdGUgPD0gMCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkludmFsaWQgc2FtcGxlIHJhdGU6ICVkXG4iLCBjb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIkludmFsaWQgc2FtcGxlIHJhdGU6ICVkXG4iLCBwYXItPnNhbXBsZV9yYXRlKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDX0xBVE0pIHsKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUNfTEFUTSkgewogICAgICAgICAvKiBDaGFubmVscyBhbmQgc2FtcGxlX3JhdGUgdmFsdWVzIGFyZSB0aG9zZSBwcmlvciB0byBhcHBseWluZyBTQlIKICAgICAgICAgICogYW5kL29yIFBTLiAqLwotICAgICAgICBjb2RlYy0+Y2hhbm5lbHMgICAgPSAwOwotICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSAwOworICAgICAgICBwYXItPmNoYW5uZWxzICAgID0gMDsKKyAgICAgICAgcGFyLT5zYW1wbGVfcmF0ZSA9IDA7CiAgICAgfQogICAgIC8qIG92ZXJyaWRlIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSBmb3IgRy43MjYgKi8KLSAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0c3MjYgJiYgY29kZWMtPnNhbXBsZV9yYXRlKQotICAgICAgICBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gY29kZWMtPmJpdF9yYXRlIC8gY29kZWMtPnNhbXBsZV9yYXRlOworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0c3MjYgJiYgcGFyLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBwYXItPmJpdF9yYXRlIC8gcGFyLT5zYW1wbGVfcmF0ZTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjA1LDE2ICsyMDgsMTcgQEAKICAgICByZXR1cm4gaWQ7CiB9CiAKLWludCBmZl9nZXRfYm1wX2hlYWRlcihBVklPQ29udGV4dCAqcGIsIEFWU3RyZWFtICpzdCwgdW5zaWduZWQgKmVzaXplKQoraW50IGZmX2dldF9ibXBfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgQVZTdHJlYW0gKnN0LCB1aW50MzJfdCAqc2l6ZSkKIHsKICAgICBpbnQgdGFnMTsKLSAgICBpZihlc2l6ZSkgKmVzaXplICA9IGF2aW9fcmwzMihwYik7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICBhdmlvX3JsMzIocGIpOwotICAgIHN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IChpbnQzMl90KWF2aW9fcmwzMihwYik7CisgICAgdWludDMyX3Qgc2l6ZV8gPSBhdmlvX3JsMzIocGIpOworICAgIGlmIChzaXplKQorICAgICAgICAqc2l6ZSA9IHNpemVfOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggID0gYXZpb19ybDMyKHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IChpbnQzMl90KWF2aW9fcmwzMihwYik7CiAgICAgYXZpb19ybDE2KHBiKTsgLyogcGxhbmVzICovCi0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdmlvX3JsMTYocGIpOyAvKiBkZXB0aCAqLwotICAgIHRhZzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcmwxNihwYik7IC8qIGRlcHRoICovCisgICAgdGFnMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBhdmlvX3JsMzIocGIpOwogICAgIGF2aW9fcmwzMihwYik7IC8qIEltYWdlU2l6ZSAqLwogICAgIGF2aW9fcmwzMihwYik7IC8qIFhQZWxzUGVyTWV0ZXIgKi8KICAgICBhdmlvX3JsMzIocGIpOyAvKiBZUGVsc1Blck1ldGVyICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yaWZmZW5jLmMgYi9saWJhdmZvcm1hdC9yaWZmZW5jLmMKaW5kZXggY2ViMjdmMi4uYzA0ZDU1YyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcmlmZmVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3JpZmZlbmMuYwpAQCAtNTEsNyArNTEsOCBAQAogCiAvKiBXQVZFRk9STUFURVggaGVhZGVyICovCiAvKiByZXR1cm5zIHRoZSBzaXplIG9yIC0xIG9uIGVycm9yICovCi1pbnQgZmZfcHV0X3dhdl9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBBVkNvZGVjQ29udGV4dCAqZW5jLCBpbnQgZmxhZ3MpCitpbnQgZmZfcHV0X3dhdl9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgaW50IGZsYWdzKQogewogICAgIGludCBicHMsIGJsa2FsaWduLCBieXRlc3BlcnNlYywgZnJhbWVfc2l6ZTsKICAgICBpbnQgaGRyc2l6ZTsKQEAgLTYxLDg5ICs2Miw5MSBAQAogICAgIHVpbnQ4X3QgKnJpZmZfZXh0cmFkYXRhICAgICAgID0gdGVtcDsKICAgICB1aW50OF90ICpyaWZmX2V4dHJhZGF0YV9zdGFydCA9IHRlbXA7CiAKLSAgICBpZiAoIWVuYy0+Y29kZWNfdGFnIHx8IGVuYy0+Y29kZWNfdGFnID4gMHhmZmZmKQorICAgIGlmICghcGFyLT5jb2RlY190YWcgfHwgcGFyLT5jb2RlY190YWcgPiAweGZmZmYpCiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIC8qIFdlIHVzZSB0aGUga25vd24gY29uc3RhbnQgZnJhbWUgc2l6ZSBmb3IgdGhlIGNvZGVjIGlmIGtub3duLCBvdGhlcndpc2UKICAgICAgKiBmYWxsIGJhY2sgb24gdXNpbmcgQVZDb2RlY0NvbnRleHQuZnJhbWVfc2l6ZSwgd2hpY2ggaXMgbm90IGFzIHJlbGlhYmxlCiAgICAgICogZm9yIGluZGljYXRpbmcgcGFja2V0IGR1cmF0aW9uLiAqLwotICAgIGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oZW5jLCBlbmMtPmJsb2NrX2FsaWduKTsKKyAgICBmcmFtZV9zaXplID0gYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uMihwYXIsIHBhci0+YmxvY2tfYWxpZ24pOwogCi0gICAgd2F2ZWZvcm1hdGV4dGVuc2libGUgPSAoZW5jLT5jaGFubmVscyA+IDIgJiYgZW5jLT5jaGFubmVsX2xheW91dCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+c2FtcGxlX3JhdGUgPiA0ODAwMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9FQUMzIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGVuYy0+Y29kZWNfaWQpID4gMTY7CisgICAgd2F2ZWZvcm1hdGV4dGVuc2libGUgPSAocGFyLT5jaGFubmVscyA+IDIgJiYgcGFyLT5jaGFubmVsX2xheW91dCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgPT0gMSAmJiBwYXItPmNoYW5uZWxfbGF5b3V0ICYmIHBhci0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUX01PTk8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgPT0gMiAmJiBwYXItPmNoYW5uZWxfbGF5b3V0ICYmIHBhci0+Y2hhbm5lbF9sYXlvdXQgIT0gQVZfQ0hfTEFZT1VUX1NURVJFTyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5zYW1wbGVfcmF0ZSA+IDQ4MDAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0VBQzMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUocGFyLT5jb2RlY19pZCkgPiAxNjsKIAogICAgIGlmICh3YXZlZm9ybWF0ZXh0ZW5zaWJsZSkKICAgICAgICAgYXZpb193bDE2KHBiLCAweGZmZmUpOwogICAgIGVsc2UKLSAgICAgICAgYXZpb193bDE2KHBiLCBlbmMtPmNvZGVjX3RhZyk7CisgICAgICAgIGF2aW9fd2wxNihwYiwgcGFyLT5jb2RlY190YWcpOwogCi0gICAgYXZpb193bDE2KHBiLCBlbmMtPmNoYW5uZWxzKTsKLSAgICBhdmlvX3dsMzIocGIsIGVuYy0+c2FtcGxlX3JhdGUpOwotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FUUkFDMyB8fAotICAgICAgICBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0c3MjNfMSB8fAotICAgICAgICBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMiAgICB8fAotICAgICAgICBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMyAgICB8fAotICAgICAgICBlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0dTTV9NUykgeworICAgIGF2aW9fd2wxNihwYiwgcGFyLT5jaGFubmVscyk7CisgICAgYXZpb193bDMyKHBiLCBwYXItPnNhbXBsZV9yYXRlKTsKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BVFJBQzMgfHwKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HNzIzXzEgfHwKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIgICAgfHwKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMgICAgfHwKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HU01fTVMpIHsKICAgICAgICAgYnBzID0gMDsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIShicHMgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGVuYy0+Y29kZWNfaWQpKSkgewotICAgICAgICAgICAgaWYgKGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQotICAgICAgICAgICAgICAgIGJwcyA9IGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworICAgICAgICBpZiAoIShicHMgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKHBhci0+Y29kZWNfaWQpKSkgeworICAgICAgICAgICAgaWYgKHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlKQorICAgICAgICAgICAgICAgIGJwcyA9IHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGJwcyA9IDE2OyAgLy8gZGVmYXVsdCB0byAxNgogICAgICAgICB9CiAgICAgfQotICAgIGlmIChicHMgIT0gZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgJiYgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKLSAgICAgICAgYXZfbG9nKGVuYywgQVZfTE9HX1dBUk5JTkcsCisgICAgaWYgKGJwcyAhPSBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAmJiBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAicmVxdWVzdGVkIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSAoJWQpICIKICAgICAgICAgICAgICAgICJhbmQgYWN0dWFsbHkgc3RvcmVkICglZCkgZGlmZmVyXG4iLAotICAgICAgICAgICAgICAgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsIGJwcyk7CisgICAgICAgICAgICAgICBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSwgYnBzKTsKICAgICB9CiAKLSAgICBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIpIHsKLSAgICAgICAgYmxrYWxpZ24gPSAoMTQ0ICogZW5jLT5iaXRfcmF0ZSAtIDEpL2VuYy0+c2FtcGxlX3JhdGUgKyAxOwotICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpIHsKLSAgICAgICAgYmxrYWxpZ24gPSA1NzYgKiAoZW5jLT5zYW1wbGVfcmF0ZSA8PSAoMjQwMDAgKyAzMjAwMCkvMiA/IDEgOiAyKTsKLSAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAyKSB7CisgICAgICAgIGJsa2FsaWduID0gKDE0NCAqIHBhci0+Yml0X3JhdGUgLSAxKS9wYXItPnNhbXBsZV9yYXRlICsgMTsKKyAgICB9IGVsc2UgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSB7CisgICAgICAgIGJsa2FsaWduID0gNTc2ICogKHBhci0+c2FtcGxlX3JhdGUgPD0gKDI0MDAwICsgMzIwMDApLzIgPyAxIDogMik7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMykgewogICAgICAgICBibGthbGlnbiA9IDM4NDA7ICAgICAgICAgICAgICAgIC8qIG1heGltdW0gYnl0ZXMgcGVyIGZyYW1lICovCi0gICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgewotICAgICAgICBibGthbGlnbiA9IDc2OCAqIGVuYy0+Y2hhbm5lbHM7IC8qIG1heGltdW0gYnl0ZXMgcGVyIGZyYW1lICovCi0gICAgfSBlbHNlIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0c3MjNfMSkgeworICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgYmxrYWxpZ24gPSA3NjggKiBwYXItPmNoYW5uZWxzOyAvKiBtYXhpbXVtIGJ5dGVzIHBlciBmcmFtZSAqLworICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HNzIzXzEpIHsKICAgICAgICAgYmxrYWxpZ24gPSAyNDsKLSAgICB9IGVsc2UgaWYgKGVuYy0+YmxvY2tfYWxpZ24gIT0gMCkgeyAvKiBzcGVjaWZpZWQgYnkgdGhlIGNvZGVjICovCi0gICAgICAgIGJsa2FsaWduID0gZW5jLT5ibG9ja19hbGlnbjsKKyAgICB9IGVsc2UgaWYgKHBhci0+YmxvY2tfYWxpZ24gIT0gMCkgeyAvKiBzcGVjaWZpZWQgYnkgdGhlIGNvZGVjICovCisgICAgICAgIGJsa2FsaWduID0gcGFyLT5ibG9ja19hbGlnbjsKICAgICB9IGVsc2UKLSAgICAgICAgYmxrYWxpZ24gPSBicHMgKiBlbmMtPmNoYW5uZWxzIC8gYXZfZ2NkKDgsIGJwcyk7Ci0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1U4IHx8Ci0gICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MyNExFIHx8Ci0gICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MzMkxFIHx8Ci0gICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0YzMkxFIHx8Ci0gICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0Y2NExFIHx8Ci0gICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKSB7Ci0gICAgICAgIGJ5dGVzcGVyc2VjID0gZW5jLT5zYW1wbGVfcmF0ZSAqIGJsa2FsaWduOwotICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HNzIzXzEpIHsKKyAgICAgICAgYmxrYWxpZ24gPSBicHMgKiBwYXItPmNoYW5uZWxzIC8gYXZfZ2NkKDgsIGJwcyk7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1U4IHx8CisgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MyNExFIHx8CisgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MzMkxFIHx8CisgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0YzMkxFIHx8CisgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX0Y2NExFIHx8CisgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKSB7CisgICAgICAgIGJ5dGVzcGVyc2VjID0gcGFyLT5zYW1wbGVfcmF0ZSAqIGJsa2FsaWduOworICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HNzIzXzEpIHsKICAgICAgICAgYnl0ZXNwZXJzZWMgPSA4MDA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYnl0ZXNwZXJzZWMgPSBlbmMtPmJpdF9yYXRlIC8gODsKKyAgICAgICAgYnl0ZXNwZXJzZWMgPSBwYXItPmJpdF9yYXRlIC8gODsKICAgICB9CiAgICAgYXZpb193bDMyKHBiLCBieXRlc3BlcnNlYyk7IC8qIGJ5dGVzIHBlciBzZWNvbmQgKi8KICAgICBhdmlvX3dsMTYocGIsIGJsa2FsaWduKTsgICAgLyogYmxvY2sgYWxpZ24gKi8KICAgICBhdmlvX3dsMTYocGIsIGJwcyk7ICAgICAgICAgLyogYml0cyBwZXIgc2FtcGxlICovCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSB7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSB7CiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnJpZmZfZXh0cmFkYXRhLCAxKTsgICAgLyogd0lEICovCiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnJpZmZfZXh0cmFkYXRhLCAyKTsgICAgLyogZmR3RmxhZ3MgKi8KICAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIDExNTIpOyAvKiBuQmxvY2tTaXplICovCiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnJpZmZfZXh0cmFkYXRhLCAxKTsgICAgLyogbkZyYW1lc1BlckJsb2NrICovCiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnJpZmZfZXh0cmFkYXRhLCAxMzkzKTsgLyogbkNvZGVjRGVsYXkgKi8KLSAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAyKSB7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMikgewogICAgICAgICAvKiBmd0hlYWRMYXllciAqLwogICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZyaWZmX2V4dHJhZGF0YSwgMik7CiAgICAgICAgIC8qIGR3SGVhZEJpdHJhdGUgKi8KLSAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUzMigmcmlmZl9leHRyYWRhdGEsIGVuYy0+Yml0X3JhdGUpOworICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZyaWZmX2V4dHJhZGF0YSwgcGFyLT5iaXRfcmF0ZSk7CiAgICAgICAgIC8qIGZ3SGVhZE1vZGUgKi8KLSAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIGVuYy0+Y2hhbm5lbHMgPT0gMiA/IDEgOiA4KTsKKyAgICAgICAgYnl0ZXN0cmVhbV9wdXRfbGUxNigmcmlmZl9leHRyYWRhdGEsIHBhci0+Y2hhbm5lbHMgPT0gMiA/IDEgOiA4KTsKICAgICAgICAgLyogZndIZWFkTW9kZUV4dCAqLwogICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTE2KCZyaWZmX2V4dHJhZGF0YSwgMCk7CiAgICAgICAgIC8qIHdIZWFkRW1waGFzaXMgKi8KQEAgLTE1NCw0MCArMTU3LDQwIEBACiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnJpZmZfZXh0cmFkYXRhLCAwKTsKICAgICAgICAgLyogZHdQVFNIaWdoICovCiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMzIoJnJpZmZfZXh0cmFkYXRhLCAwKTsKLSAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRzcyM18xKSB7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0c3MjNfMSkgewogICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZyaWZmX2V4dHJhZGF0YSwgMHg5YWNlMDAwMik7IC8qIGV4dHJhZGF0YSBuZWVkZWQgZm9yIG1zYWNtIGc3MjMuMSBjb2RlYyAqLwogICAgICAgICBieXRlc3RyZWFtX3B1dF9sZTMyKCZyaWZmX2V4dHJhZGF0YSwgMHhhZWEyZjczMik7CiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnJpZmZfZXh0cmFkYXRhLCAweGFjZGUpOwotICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HU01fTVMgfHwKLSAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVikgeworICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9HU01fTVMgfHwKKyAgICAgICAgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBVikgewogICAgICAgICAvKiB3U2FtcGxlc1BlckJsb2NrICovCiAgICAgICAgIGJ5dGVzdHJlYW1fcHV0X2xlMTYoJnJpZmZfZXh0cmFkYXRhLCBmcmFtZV9zaXplKTsKLSAgICB9IGVsc2UgaWYgKGVuYy0+ZXh0cmFkYXRhX3NpemUpIHsKLSAgICAgICAgcmlmZl9leHRyYWRhdGFfc3RhcnQgPSBlbmMtPmV4dHJhZGF0YTsKLSAgICAgICAgcmlmZl9leHRyYWRhdGEgICAgICAgPSBlbmMtPmV4dHJhZGF0YSArIGVuYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgfSBlbHNlIGlmIChwYXItPmV4dHJhZGF0YV9zaXplKSB7CisgICAgICAgIHJpZmZfZXh0cmFkYXRhX3N0YXJ0ID0gcGFyLT5leHRyYWRhdGE7CisgICAgICAgIHJpZmZfZXh0cmFkYXRhICAgICAgID0gcGFyLT5leHRyYWRhdGEgKyBwYXItPmV4dHJhZGF0YV9zaXplOwogICAgIH0KICAgICAvKiB3cml0ZSBXQVZFRk9STUFURVhURU5TSUJMRSBleHRlbnNpb25zICovCiAgICAgaWYgKHdhdmVmb3JtYXRleHRlbnNpYmxlKSB7CiAgICAgICAgIGludCB3cml0ZV9jaGFubmVsX21hc2sgPSAhKGZsYWdzICYgRkZfUFVUX1dBVl9IRUFERVJfU0tJUF9DSEFOTkVMTUFTSykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8IEZGX0NPTVBMSUFOQ0VfTk9STUFMIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jaGFubmVsX2xheW91dCA8IDB4NDAwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA8IEZGX0NPTVBMSUFOQ0VfTk9STUFMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyLT5jaGFubmVsX2xheW91dCA8IDB4NDAwMDApOwogICAgICAgICAvKiAyMiBpcyBXQVZFRk9STUFURVhURU5TSUJMRSBzaXplICovCiAgICAgICAgIGF2aW9fd2wxNihwYiwgcmlmZl9leHRyYWRhdGEgLSByaWZmX2V4dHJhZGF0YV9zdGFydCArIDIyKTsKICAgICAgICAgLyogVmFsaWRCaXRzUGVyU2FtcGxlIHx8IFNhbXBsZXNQZXJCbG9jayB8fCBSZXNlcnZlZCAqLwogICAgICAgICBhdmlvX3dsMTYocGIsIGJwcyk7CiAgICAgICAgIC8qIGR3Q2hhbm5lbE1hc2sgKi8KLSAgICAgICAgYXZpb193bDMyKHBiLCB3cml0ZV9jaGFubmVsX21hc2sgPyBlbmMtPmNoYW5uZWxfbGF5b3V0IDogMCk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgd3JpdGVfY2hhbm5lbF9tYXNrID8gcGFyLT5jaGFubmVsX2xheW91dCA6IDApOwogICAgICAgICAvKiBHVUlEICsgbmV4dCAzICovCi0gICAgICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0VBQzMpIHsKLSAgICAgICAgICAgIGZmX3B1dF9ndWlkKHBiLCBmZl9nZXRfY29kZWNfZ3VpZChlbmMtPmNvZGVjX2lkLCBmZl9jb2RlY193YXZfZ3VpZHMpKTsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRUFDMykgeworICAgICAgICAgICAgZmZfcHV0X2d1aWQocGIsIGZmX2dldF9jb2RlY19ndWlkKHBhci0+Y29kZWNfaWQsIGZmX2NvZGVjX3dhdl9ndWlkcykpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgYXZpb193bDMyKHBiLCBwYXItPmNvZGVjX3RhZyk7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgMHgwMDEwMDAwMCk7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgMHhBQTAwMDA4MCk7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgMHg3MTlCMzgwMCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKChmbGFncyAmIEZGX1BVVF9XQVZfSEVBREVSX0ZPUkNFX1dBVkVGT1JNQVRFWCkgfHwKLSAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfdGFnICE9IDB4MDAwMSAvKiBQQ00gKi8gfHwKKyAgICAgICAgICAgICAgIHBhci0+Y29kZWNfdGFnICE9IDB4MDAwMSAvKiBQQ00gKi8gfHwKICAgICAgICAgICAgICAgIHJpZmZfZXh0cmFkYXRhIC0gcmlmZl9leHRyYWRhdGFfc3RhcnQpIHsKICAgICAgICAgLyogV0FWRUZPUk1BVEVYICovCiAgICAgICAgIGF2aW9fd2wxNihwYiwgcmlmZl9leHRyYWRhdGEgLSByaWZmX2V4dHJhZGF0YV9zdGFydCk7IC8qIGNiU2l6ZSAqLwpAQCAtMjAzLDY1ICsyMDYsODYgQEAKIH0KIAogLyogQklUTUFQSU5GT0hFQURFUiBoZWFkZXIgKi8KLXZvaWQgZmZfcHV0X2JtcF9oZWFkZXIoQVZJT0NvbnRleHQgKnBiLCBBVkNvZGVjQ29udGV4dCAqZW5jLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkNvZGVjVGFnICp0YWdzLCBpbnQgZm9yX2FzZiwgaW50IGlnbm9yZV9leHRyYWRhdGEpCit2b2lkIGZmX3B1dF9ibXBfaGVhZGVyKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcl9hc2YsIGludCBpZ25vcmVfZXh0cmFkYXRhKQogewotICAgIGludCBrZWVwX2hlaWdodCA9IGVuYy0+ZXh0cmFkYXRhX3NpemUgPj0gOSAmJgotICAgICAgICAgICAgICAgICAgICAgICFtZW1jbXAoZW5jLT5leHRyYWRhdGEgKyBlbmMtPmV4dHJhZGF0YV9zaXplIC0gOSwgIkJvdHRvbVVwIiwgOSk7Ci0gICAgaW50IGV4dHJhZGF0YV9zaXplID0gZW5jLT5leHRyYWRhdGFfc2l6ZSAtIDkqa2VlcF9oZWlnaHQ7CisgICAgaW50IGtlZXBfaGVpZ2h0ID0gcGFyLT5leHRyYWRhdGFfc2l6ZSA+PSA5ICYmCisgICAgICAgICAgICAgICAgICAgICAgIW1lbWNtcChwYXItPmV4dHJhZGF0YSArIHBhci0+ZXh0cmFkYXRhX3NpemUgLSA5LCAiQm90dG9tVXAiLCA5KTsKKyAgICBpbnQgZXh0cmFkYXRhX3NpemUgPSBwYXItPmV4dHJhZGF0YV9zaXplIC0gOSprZWVwX2hlaWdodDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCA9IHBhci0+Zm9ybWF0OworICAgIGludCBwYWxfYXZpOwogCi0gICAgLyogc2l6ZSAqLwotICAgIGF2aW9fd2wzMihwYiwgNDAgKyAoaWdub3JlX2V4dHJhZGF0YSA/IDAgOmV4dHJhZGF0YV9zaXplKSk7Ci0gICAgYXZpb193bDMyKHBiLCBlbmMtPndpZHRoKTsKKyAgICBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUgJiYgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMSkKKyAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfTU9OT1dISVRFOworICAgIHBhbF9hdmkgPSAhZm9yX2FzZiAmJgorICAgICAgICAgICAgICAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDggfHwKKyAgICAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEUgfHwKKyAgICAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0spOworCisgICAgLyogU2l6ZSAobm90IGluY2x1ZGluZyB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgdGFibGUgb3IgY29sb3IgbWFza3MpICovCisgICAgYXZpb193bDMyKHBiLCA0MCArIChpZ25vcmVfZXh0cmFkYXRhIHx8IHBhbF9hdmkgPyAwIDogZXh0cmFkYXRhX3NpemUpKTsKKyAgICBhdmlvX3dsMzIocGIsIHBhci0+d2lkdGgpOwogICAgIC8vV2UgYWx3YXlzIHN0b3JlIFJHQiBUb3BEb3duCi0gICAgYXZpb193bDMyKHBiLCBlbmMtPmNvZGVjX3RhZyB8fCBrZWVwX2hlaWdodCA/IGVuYy0+aGVpZ2h0IDogLWVuYy0+aGVpZ2h0KTsKKyAgICBhdmlvX3dsMzIocGIsIHBhci0+Y29kZWNfdGFnIHx8IGtlZXBfaGVpZ2h0ID8gcGFyLT5oZWlnaHQgOiAtcGFyLT5oZWlnaHQpOwogICAgIC8qIHBsYW5lcyAqLwogICAgIGF2aW9fd2wxNihwYiwgMSk7CiAgICAgLyogZGVwdGggKi8KLSAgICBhdmlvX3dsMTYocGIsIGVuYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID8gZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgOiAyNCk7CisgICAgYXZpb193bDE2KHBiLCBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA/IHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDogMjQpOwogICAgIC8qIGNvbXByZXNzaW9uIHR5cGUgKi8KLSAgICBhdmlvX3dsMzIocGIsIGVuYy0+Y29kZWNfdGFnKTsKLSAgICBhdmlvX3dsMzIocGIsIChlbmMtPndpZHRoICogZW5jLT5oZWlnaHQgKiAoZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPyBlbmMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA6IDI0KSs3KSAvIDgpOworICAgIGF2aW9fd2wzMihwYiwgcGFyLT5jb2RlY190YWcpOworICAgIGF2aW9fd2wzMihwYiwgKHBhci0+d2lkdGggKiBwYXItPmhlaWdodCAqIChwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA/IHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlIDogMjQpKzcpIC8gOCk7CiAgICAgYXZpb193bDMyKHBiLCAwKTsKICAgICBhdmlvX3dsMzIocGIsIDApOwotICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgLyogTnVtYmVyIG9mIGNvbG9yIGluZGljZXMgaW4gdGhlIGNvbG9yIHRhYmxlIHRoYXQgYXJlIHVzZWQuCisgICAgICogQSB2YWx1ZSBvZiAwIG1lYW5zIDJeYmlCaXRDb3VudCBpbmRpY2VzLCBidXQgdGhpcyBkb2Vzbid0IHdvcmsKKyAgICAgKiB3aXRoIFdpbmRvd3MgTWVkaWEgUGxheWVyIGFuZCBmaWxlcyBjb250YWluaW5nIHh4cGMgY2h1bmtzLiAqLworICAgIGF2aW9fd2wzMihwYiwgcGFsX2F2aSA/IDEgPDwgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgOiAwKTsKICAgICBhdmlvX3dsMzIocGIsIDApOwogCiAgICAgaWYgKCFpZ25vcmVfZXh0cmFkYXRhKSB7Ci0gICAgICAgIGF2aW9fd3JpdGUocGIsIGVuYy0+ZXh0cmFkYXRhLCBleHRyYWRhdGFfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKCFmb3JfYXNmICYmIGV4dHJhZGF0YV9zaXplICYgMSkKLSAgICAgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgICAgICBpZiAocGFyLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgcGFyLT5leHRyYWRhdGEsIGV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGlmICghZm9yX2FzZiAmJiBleHRyYWRhdGFfc2l6ZSAmIDEpCisgICAgICAgICAgICAgICAgYXZpb193OChwYiwgMCk7CisgICAgICAgIH0gZWxzZSBpZiAocGFsX2F2aSkgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMSA8PCBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6ZSAxIGJwcCBwYWxldHRlIHRvIGJsYWNrICYgd2hpdGUgKi8KKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwICYmIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEUpCisgICAgICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMHhmZmZmZmYpOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKGkgPT0gMSAmJiBwaXhfZm10ID09IEFWX1BJWF9GTVRfTU9OT0JMQUNLKQorICAgICAgICAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIDB4ZmZmZmZmKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgZmZfcGFyc2Vfc3BlY2lmaWNfcGFyYW1zKEFWU3RyZWFtICpzdCwgaW50ICphdV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICphdV9zc2l6ZSwgaW50ICphdV9zY2FsZSkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzdC0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKICAgICBpbnQgZ2NkOwogICAgIGludCBhdWRpb19mcmFtZV9zaXplOwogCi0gICAgLyogV2UgdXNlIHRoZSBrbm93biBjb25zdGFudCBmcmFtZSBzaXplIGZvciB0aGUgY29kZWMgaWYga25vd24sIG90aGVyd2lzZQotICAgICAqIGZhbGwgYmFjayBvbiB1c2luZyBBVkNvZGVjQ29udGV4dC5mcmFtZV9zaXplLCB3aGljaCBpcyBub3QgYXMgcmVsaWFibGUKLSAgICAgKiBmb3IgaW5kaWNhdGluZyBwYWNrZXQgZHVyYXRpb24uICovCi0gICAgYXVkaW9fZnJhbWVfc2l6ZSA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihjb2RlYywgMCk7CisgICAgYXVkaW9fZnJhbWVfc2l6ZSA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbjIocGFyLCAwKTsKICAgICBpZiAoIWF1ZGlvX2ZyYW1lX3NpemUpCi0gICAgICAgIGF1ZGlvX2ZyYW1lX3NpemUgPSBjb2RlYy0+ZnJhbWVfc2l6ZTsKKyAgICAgICAgYXVkaW9fZnJhbWVfc2l6ZSA9IHBhci0+ZnJhbWVfc2l6ZTsKIAotICAgICphdV9zc2l6ZSA9IGNvZGVjLT5ibG9ja19hbGlnbjsKLSAgICBpZiAoYXVkaW9fZnJhbWVfc2l6ZSAmJiBjb2RlYy0+c2FtcGxlX3JhdGUpIHsKKyAgICAqYXVfc3NpemUgPSBwYXItPmJsb2NrX2FsaWduOworICAgIGlmIChhdWRpb19mcmFtZV9zaXplICYmIHBhci0+c2FtcGxlX3JhdGUpIHsKICAgICAgICAgKmF1X3NjYWxlID0gYXVkaW9fZnJhbWVfc2l6ZTsKLSAgICAgICAgKmF1X3JhdGUgID0gY29kZWMtPnNhbXBsZV9yYXRlOwotICAgIH0gZWxzZSBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8Ci0gICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSB8fAotICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICphdV9yYXRlICA9IHBhci0+c2FtcGxlX3JhdGU7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICAgICAgICBwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEgfHwKKyAgICAgICAgICAgICAgIHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKICAgICAgICAgKmF1X3NjYWxlID0gc3QtPnRpbWVfYmFzZS5udW07CiAgICAgICAgICphdV9yYXRlICA9IHN0LT50aW1lX2Jhc2UuZGVuOwogICAgIH0gZWxzZSB7Ci0gICAgICAgICphdV9zY2FsZSA9IGNvZGVjLT5ibG9ja19hbGlnbiA/IGNvZGVjLT5ibG9ja19hbGlnbiAqIDggOiA4OwotICAgICAgICAqYXVfcmF0ZSAgPSBjb2RlYy0+Yml0X3JhdGUgPyBjb2RlYy0+Yml0X3JhdGUgOgotICAgICAgICAgICAgICAgICAgICA4ICogY29kZWMtPnNhbXBsZV9yYXRlOworICAgICAgICAqYXVfc2NhbGUgPSBwYXItPmJsb2NrX2FsaWduID8gcGFyLT5ibG9ja19hbGlnbiAqIDggOiA4OworICAgICAgICAqYXVfcmF0ZSAgPSBwYXItPmJpdF9yYXRlID8gcGFyLT5iaXRfcmF0ZSA6CisgICAgICAgICAgICAgICAgICAgIDggKiBwYXItPnNhbXBsZV9yYXRlOwogICAgIH0KICAgICBnY2QgICAgICAgID0gYXZfZ2NkKCphdV9zY2FsZSwgKmF1X3JhdGUpOwogICAgICphdV9zY2FsZSAvPSBnY2Q7CkBAIC0yODIsNyArMzA2LDggQEAKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIgcmlmZl90YWdzW11bNV0gPSB7Ci0gICAgIklBUkwiLCAiSUFSVCIsICJJQ01TIiwgIklDTVQiLCAiSUNPUCIsICJJQ1JEIiwgIklDUlAiLCAiSURJTSIsICJJRFBJIiwKKyAgICAiSUFSTCIsICJJQVJUIiwgIklBUzEiLCAiSUFTMiIsICJJQVMzIiwgIklBUzQiLCAiSUFTNSIsICJJQVM2IiwgIklBUzciLAorICAgICJJQVM4IiwgIklBUzkiLCAiSUNNUyIsICJJQ01UIiwgIklDT1AiLCAiSUNSRCIsICJJQ1JQIiwgIklESU0iLCAiSURQSSIsCiAgICAgIklFTkciLCAiSUdOUiIsICJJS0VZIiwgIklMR1QiLCAiSUxORyIsICJJTUVEIiwgIklOQU0iLCAiSVBMVCIsICJJUFJEIiwKICAgICAiSVBSVCIsICJJVFJLIiwgIklTQkoiLCAiSVNGVCIsICJJU0hQIiwgIklTTVAiLCAiSVNSQyIsICJJU1JGIiwgIklUQ0giLAogICAgIHsgMCB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ybDIuYyBiL2xpYmF2Zm9ybWF0L3JsMi5jCmluZGV4IDUwMTcwMTYuLmViMTY4MmQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3JsMi5jCisrKyBiL2xpYmF2Zm9ybWF0L3JsMi5jCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgICBpZihiYWNrX3NpemUgPiBJTlRfTUFYLzIgIHx8IGZyYW1lX2NvdW50ID4gSU5UX01BWCAvIHNpemVvZih1aW50MzJfdCkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgYXZpb19za2lwKHBiLCAyKTsgICAgICAgICAvKiBlbmNvZGluZyBtZW50b2QgKi8KKyAgICBhdmlvX3NraXAocGIsIDIpOyAgICAgICAgIC8qIGVuY29kaW5nIG1ldGhvZCAqLwogICAgIHNvdW5kX3JhdGUgPSBhdmlvX3JsMTYocGIpOwogICAgIHJhdGUgPSBhdmlvX3JsMTYocGIpOwogICAgIGNoYW5uZWxzID0gYXZpb19ybDE2KHBiKTsKQEAgLTExNSwxOSArMTE1LDE5IEBACiAgICAgaWYoIXN0KQogICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkwyOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLwotICAgIHN0LT5jb2RlYy0+d2lkdGggPSAzMjA7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgPSAyMDA7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9STDI7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IDMyMDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IDIwMDsKIAogICAgIC8qKiBhbGxvY2F0ZSBhbmQgZmlsbCBleHRyYWRhdGEgKi8KLSAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID0gRVhUUkFEQVRBMV9TSVpFOworICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSBFWFRSQURBVEExX1NJWkU7CiAKICAgICBpZihzaWduYXR1cmUgPT0gUkxWM19UQUcgJiYgYmFja19zaXplID4gMCkKLSAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSArPSBiYWNrX3NpemU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKz0gYmFja19zaXplOwogCi0gICAgaWYoZmZfZ2V0X2V4dHJhZGF0YShzdC0+Y29kZWMsIHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSA8IDApCisgICAgaWYoZmZfZ2V0X2V4dHJhZGF0YShzLCBzdC0+Y29kZWNwYXIsIHBiLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKSA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICAvKiogc2V0dXAgYXVkaW8gc3RyZWFtIGlmIHByZXNlbnQgKi8KQEAgLTE0MywxNiArMTQzLDE2IEBACiAgICAgICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAxOwotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gY2hhbm5lbHM7Ci0gICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHJhdGU7Ci0gICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKLSAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKgotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgLyA4OworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSByYXRlOworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICoKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gODsKICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwzMiwxLHJhdGUpOwogICAgIH0KIApAQCAtMTcwLDEyICsxNzAsMjEgQEAKICAgICB9CiAKICAgICAvKiogcmVhZCBvZmZzZXQgYW5kIHNpemUgdGFibGVzICovCi0gICAgZm9yKGk9MDsgaSA8IGZyYW1lX2NvdW50O2krKykKKyAgICBmb3IoaT0wOyBpIDwgZnJhbWVfY291bnQ7aSsrKSB7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGNodW5rX3NpemVbaV0gPSBhdmlvX3JsMzIocGIpOwotICAgIGZvcihpPTA7IGkgPCBmcmFtZV9jb3VudDtpKyspCisgICAgfQorICAgIGZvcihpPTA7IGkgPCBmcmFtZV9jb3VudDtpKyspIHsKKyAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgY2h1bmtfb2Zmc2V0W2ldID0gYXZpb19ybDMyKHBiKTsKLSAgICBmb3IoaT0wOyBpIDwgZnJhbWVfY291bnQ7aSsrKQorICAgIH0KKyAgICBmb3IoaT0wOyBpIDwgZnJhbWVfY291bnQ7aSsrKSB7CisgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIGF1ZGlvX3NpemVbaV0gPSBhdmlvX3JsMzIocGIpICYgMHhGRkZGOworICAgIH0KIAogICAgIC8qKiBidWlsZCB0aGUgc2FtcGxlIGluZGV4ICovCiAgICAgZm9yKGk9MDtpPGZyYW1lX2NvdW50O2krKyl7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ybS5jIGIvbGliYXZmb3JtYXQvcm0uYwppbmRleCAwNTkxYTE3Li41MmM3Y2NjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ybS5jCisrKyBiL2xpYmF2Zm9ybWF0L3JtLmMKQEAgLTQzLDUgKzQzLDYgQEAKICAgICB7IEFWX0NPREVDX0lEX0FBQywgICAgTUtUQUcoJ3InLCdhJywnYScsJ2MnKSB9LAogICAgIHsgQVZfQ09ERUNfSURfQUFDLCAgICBNS1RBRygncicsJ2EnLCdjJywncCcpIH0sCiAgICAgeyBBVl9DT0RFQ19JRF9SQUxGLCAgIE1LVEFHKCdMJywnUycsJ0QnLCc6JykgfSwKKyAgICB7IEFWX0NPREVDX0lEX0NMRUFSVklERU8sIE1LVEFHKCdDJywnTCcsJ1YnLCcxJykgfSwKICAgICB7IEFWX0NPREVDX0lEX05PTkUgfSwKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ybWRlYy5jIGIvbGliYXZmb3JtYXQvcm1kZWMuYwppbmRleCAxYTYxYjEwLi5mMjZjNWI0IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ybWRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3JtZGVjLmMKQEAgLTcwLDE2ICs3MCwxMCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3N0cmwoQVZJT0NvbnRleHQgKnBiLCBjaGFyICpidWYsIGludCBidWZfc2l6ZSwgaW50IGxlbikKIHsKLSAgICBpbnQgaTsKLSAgICBjaGFyICpxLCByOworICAgIGludCByZWFkID0gYXZpb19nZXRfc3RyKHBiLCBsZW4sIGJ1ZiwgYnVmX3NpemUpOwogCi0gICAgcSA9IGJ1ZjsKLSAgICBmb3IoaT0wO2k8bGVuO2krKykgewotICAgICAgICByID0gYXZpb19yOChwYik7Ci0gICAgICAgIGlmIChpIDwgYnVmX3NpemUgLSAxKQotICAgICAgICAgICAgKnErKyA9IHI7Ci0gICAgfQotICAgIGlmIChidWZfc2l6ZSA+IDApICpxID0gJ1wwJzsKKyAgICBpZiAocmVhZCA+IDApCisgICAgICAgIGF2aW9fc2tpcChwYiwgbGVuIC0gcmVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdldF9zdHI4KEFWSU9Db250ZXh0ICpwYiwgY2hhciAqYnVmLCBpbnQgYnVmX3NpemUpCkBAIC04NywxMyArODEsMTMgQEAKICAgICBnZXRfc3RybChwYiwgYnVmLCBidWZfc2l6ZSwgYXZpb19yOChwYikpOwogfQogCi1zdGF0aWMgaW50IHJtX3JlYWRfZXh0cmFkYXRhKEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY0NvbnRleHQgKmF2Y3R4LCB1bnNpZ25lZCBzaXplKQorc3RhdGljIGludCBybV9yZWFkX2V4dHJhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICpwYiwgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgdW5zaWduZWQgc2l6ZSkKIHsKICAgICBpZiAoc2l6ZSA+PSAxPDwyNCkgewotICAgICAgICBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgImV4dHJhZGF0YSBzaXplICV1IHRvbyBsYXJnZVxuIiwgc2l6ZSk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJleHRyYWRhdGEgc2l6ZSAldSB0b28gbGFyZ2VcbiIsIHNpemUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKGF2Y3R4LCBwYiwgc2l6ZSkgPCAwKQorICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsIHBhciwgcGIsIHNpemUpIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICByZXR1cm4gMDsKIH0KQEAgLTEwNSw4ICs5OSwxMCBAQAogCiAgICAgZm9yIChpPTA7IGk8RkZfQVJSQVlfRUxFTVMoZmZfcm1fbWV0YWRhdGEpOyBpKyspIHsKICAgICAgICAgaW50IGxlbiA9IHdpZGUgPyBhdmlvX3JiMTYocGIpIDogYXZpb19yOChwYik7Ci0gICAgICAgIGdldF9zdHJsKHBiLCBidWYsIHNpemVvZihidWYpLCBsZW4pOwotICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIGZmX3JtX21ldGFkYXRhW2ldLCBidWYsIDApOworICAgICAgICBpZiAobGVuID4gMCkgeworICAgICAgICAgICAgZ2V0X3N0cmwocGIsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIGxlbik7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmcy0+bWV0YWRhdGEsIGZmX3JtX21ldGFkYXRhW2ldLCBidWYsIDApOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xNTAsMTIgKzE0NiwxMiBAQAogICAgICAgICBpZiAoKHN0YXJ0cG9zICsgaGVhZGVyX3NpemUpID4gYXZpb190ZWxsKHBiKSkKICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgaGVhZGVyX3NpemUgKyBzdGFydHBvcyAtIGF2aW9fdGVsbChwYikpOwogICAgICAgICBpZiAoYnl0ZXNfcGVyX21pbnV0ZSkKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSA4TEwgKiBieXRlc19wZXJfbWludXRlIC8gNjA7Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSA4MDAwOwotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gMTsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQV8xNDQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gOExMICogYnl0ZXNfcGVyX21pbnV0ZSAvIDYwOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gODAwMDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFfMTQ0OwogICAgICAgICBhc3QtPmRlaW50X2lkID0gREVJTlRfSURfSU5UMDsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgZmxhdm9yLCBzdWJfcGFja2V0X2gsIGNvZGVkX2ZyYW1lc2l6ZSwgc3ViX3BhY2tldF9zaXplOwpAQCAtMTczLDE5ICsxNjksMTkgQEAKICAgICAgICAgYnl0ZXNfcGVyX21pbnV0ZSA9IGF2aW9fcmIzMihwYik7CiAgICAgICAgIGlmICh2ZXJzaW9uID09IDQpIHsKICAgICAgICAgICAgIGlmIChieXRlc19wZXJfbWludXRlKQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSA4TEwgKiBieXRlc19wZXJfbWludXRlIC8gNjA7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IDhMTCAqIGJ5dGVzX3Blcl9taW51dGUgLyA2MDsKICAgICAgICAgfQogICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiA/Pz8gKi8KICAgICAgICAgYXN0LT5zdWJfcGFja2V0X2ggPSBzdWJfcGFja2V0X2ggPSBhdmlvX3JiMTYocGIpOyAvKiAxICovCi0gICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ249IGF2aW9fcmIxNihwYik7IC8qIGZyYW1lIHNpemUgKi8KKyAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbj0gYXZpb19yYjE2KHBiKTsgLyogZnJhbWUgc2l6ZSAqLwogICAgICAgICBhc3QtPnN1Yl9wYWNrZXRfc2l6ZSA9IHN1Yl9wYWNrZXRfc2l6ZSA9IGF2aW9fcmIxNihwYik7IC8qIHN1YiBwYWNrZXQgc2l6ZSAqLwogICAgICAgICBhdmlvX3JiMTYocGIpOyAvKiA/Pz8gKi8KICAgICAgICAgaWYgKHZlcnNpb24gPT0gNSkgewogICAgICAgICAgICAgYXZpb19yYjE2KHBiKTsgYXZpb19yYjE2KHBiKTsgYXZpb19yYjE2KHBiKTsKICAgICAgICAgfQotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIxNihwYik7CiAgICAgICAgIGF2aW9fcmIzMihwYik7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBhdmlvX3JiMTYocGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gYXZpb19yYjE2KHBiKTsKICAgICAgICAgaWYgKHZlcnNpb24gPT0gNSkgewogICAgICAgICAgICAgYXN0LT5kZWludF9pZCA9IGF2aW9fcmwzMihwYik7CiAgICAgICAgICAgICBhdmlvX3JlYWQocGIsIGJ1ZiwgNCk7CkBAIC0xOTYsMTkgKzE5MiwyMCBAQAogICAgICAgICAgICAgYXN0LT5kZWludF9pZCA9IEFWX1JMMzIoYnVmKTsKICAgICAgICAgICAgIGdldF9zdHI4KHBiLCBidWYsIHNpemVvZihidWYpKTsgLyogZGVzYyAqLwogICAgICAgICB9Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgID0gQVZfUkwzMihidWYpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfcm1fY29kZWNfdGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSBBVl9STDMyKGJ1Zik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9ybV9jb2RlY190YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcpOwogCi0gICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9BQzM6CiAgICAgICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfRlVMTDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1JBXzI4ODoKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemU9IDA7Ci0gICAgICAgICAgICBhc3QtPmF1ZGlvX2ZyYW1lc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gY29kZWRfZnJhbWVzaXplOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZT0gMDsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgICAgICBhc3QtPmF1ZGlvX2ZyYW1lc2l6ZSA9IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ247CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gY29kZWRfZnJhbWVzaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQ09PSzoKICAgICAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTOwpAQCAtMjI3LDIyICsyMjQsMjMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGFzdC0+YXVkaW9fZnJhbWVzaXplID0gc3QtPmNvZGVjLT5ibG9ja19hbGlnbjsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NJUFIpIHsKKyAgICAgICAgICAgIGFzdC0+YXVkaW9fZnJhbWVzaXplID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbjsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1NJUFIpIHsKICAgICAgICAgICAgICAgICBpZiAoZmxhdm9yID4gMykgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiYmFkIFNJUFIgZmlsZSBmbGF2b3IgJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3IpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBmZl9zaXByX3N1YnBrX3NpemVbZmxhdm9yXTsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gZmZfc2lwcl9zdWJwa19zaXplW2ZsYXZvcl07CisgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZihzdWJfcGFja2V0X3NpemUgPD0gMCl7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJzdWJfcGFja2V0X3NpemUgaXMgaW52YWxpZFxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IGFzdC0+c3ViX3BhY2tldF9zaXplOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBhc3QtPnN1Yl9wYWNrZXRfc2l6ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgocmV0ID0gcm1fcmVhZF9leHRyYWRhdGEocGIsIHN0LT5jb2RlYywgY29kZWNkYXRhX2xlbmd0aCkpIDwgMCkKKyAgICAgICAgICAgIGlmICgocmV0ID0gcm1fcmVhZF9leHRyYWRhdGEocywgcGIsIHN0LT5jb2RlY3BhciwgY29kZWNkYXRhX2xlbmd0aCkpIDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgICAgICBicmVhazsKQEAgLTI1Nyw3ICsyNTUsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGNvZGVjZGF0YV9sZW5ndGggPj0gMSkgewogICAgICAgICAgICAgICAgIGF2aW9fcjgocGIpOwotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcm1fcmVhZF9leHRyYWRhdGEocGIsIHN0LT5jb2RlYywgY29kZWNkYXRhX2xlbmd0aCAtIDEpKSA8IDApCisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBybV9yZWFkX2V4dHJhZGF0YShzLCBwYiwgc3QtPmNvZGVjcGFyLCBjb2RlY2RhdGFfbGVuZ3RoIC0gMSkpIDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjkyLDkgKzI5MCw5IEBACiAgICAgICAgIGlmIChhc3QtPmRlaW50X2lkID09IERFSU5UX0lEX0lOVDQgfHwKICAgICAgICAgICAgIGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfR0VOUiB8fAogICAgICAgICAgICAgYXN0LT5kZWludF9pZCA9PSBERUlOVF9JRF9TSVBSKSB7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA8PSAwIHx8CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA8PSAwIHx8CiAgICAgICAgICAgICAgICAgYXN0LT5hdWRpb19mcmFtZXNpemUgKiBzdWJfcGFja2V0X2ggPiAodW5zaWduZWQpSU5UX01BWCB8fAotICAgICAgICAgICAgICAgIGFzdC0+YXVkaW9fZnJhbWVzaXplICogc3ViX3BhY2tldF9oIDwgc3QtPmNvZGVjLT5ibG9ja19hbGlnbikKKyAgICAgICAgICAgICAgICBhc3QtPmF1ZGlvX2ZyYW1lc2l6ZSAqIHN1Yl9wYWNrZXRfaCA8IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBpZiAoYXZfbmV3X3BhY2tldCgmYXN0LT5wa3QsIGFzdC0+YXVkaW9fZnJhbWVzaXplICogc3ViX3BhY2tldF9oKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTMzNCwxMyArMzMyLDEzIEBACiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfSBlbHNlIGlmICh2ID09IE1LQkVUQUcoJ0wnLCAnUycsICdEJywgJzonKSkgewogICAgICAgICBhdmlvX3NlZWsocGIsIC00LCBTRUVLX0NVUik7Ci0gICAgICAgIGlmICgocmV0ID0gcm1fcmVhZF9leHRyYWRhdGEocGIsIHN0LT5jb2RlYywgY29kZWNfZGF0YV9zaXplKSkgPCAwKQorICAgICAgICBpZiAoKHJldCA9IHJtX3JlYWRfZXh0cmFkYXRhKHMsIHBiLCBzdC0+Y29kZWNwYXIsIGNvZGVjX2RhdGFfc2l6ZSkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBBVl9STDMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX3JtX2NvZGVjX3RhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gQVZfUkwzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9ybV9jb2RlY190YWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcpOwogICAgIH0gZWxzZSBpZihtaW1lICYmICFzdHJjbXAobWltZSwgImxvZ2ljYWwtZmlsZWluZm8iKSl7CiAgICAgICAgIGludCBzdHJlYW1fY291bnQsIHJ1bGVfY291bnQsIHByb3BlcnR5X2NvdW50LCBpOwogICAgICAgICBmZl9mcmVlX3N0cmVhbShzLCBzdCk7CkBAIC0zNzUsMjEgKzM3MywyMiBAQAogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgJTA4eFxuIiwgdik7CiAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgIH0KLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBhdmlvX3JsMzIocGIpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICA9IGZmX2NvZGVjX2dldF9pZChmZl9ybV9jb2RlY190YWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyk7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfVFJBQ0UsICIlWCAlWFxuIiwgc3QtPmNvZGVjLT5jb2RlY190YWcsIE1LVEFHKCdSJywgJ1YnLCAnMicsICcwJykpOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IGF2aW9fcmwzMihwYik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgID0gZmZfY29kZWNfZ2V0X2lkKGZmX3JtX2NvZGVjX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgIiUiUFJJWDMyIiAlWFxuIiwKKyAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnLCBNS1RBRygnUicsICdWJywgJzInLCAnMCcpKTsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKICAgICAgICAgICAgIGdvdG8gZmFpbDE7Ci0gICAgICAgIHN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMTYocGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gYXZpb19yYjE2KHBiKTsKICAgICAgICAgYXZpb19za2lwKHBiLCAyKTsgLy8gbG9va3MgbGlrZSBiaXRzIHBlciBzYW1wbGUKICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsgLy8gYWx3YXlzIHplcm8/Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwogICAgICAgICBzdC0+bmVlZF9wYXJzaW5nID0gQVZTVFJFQU1fUEFSU0VfVElNRVNUQU1QUzsKICAgICAgICAgZnBzID0gYXZpb19yYjMyKHBiKTsKIAotICAgICAgICBpZiAoKHJldCA9IHJtX3JlYWRfZXh0cmFkYXRhKHBiLCBzdC0+Y29kZWMsIGNvZGVjX2RhdGFfc2l6ZSAtIChhdmlvX3RlbGwocGIpIC0gY29kZWNfcG9zKSkpIDwgMCkKKyAgICAgICAgaWYgKChyZXQgPSBybV9yZWFkX2V4dHJhZGF0YShzLCBwYiwgc3QtPmNvZGVjcGFyLCBjb2RlY19kYXRhX3NpemUgLSAoYXZpb190ZWxsKHBiKSAtIGNvZGVjX3BvcykpKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgICAgIGlmIChmcHMgPiAwKSB7CkBAIC01MTEsMTAgKzUxMCwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdDItPmlkID0gc3QtPmlkICsgKGk8PDE2KTsKLSAgICAgICAgICAgIHN0Mi0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5iaXRfcmF0ZTsKKyAgICAgICAgICAgIHN0Mi0+Y29kZWNwYXItPmJpdF9yYXRlID0gc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZTsKICAgICAgICAgICAgIHN0Mi0+c3RhcnRfdGltZSA9IHN0LT5zdGFydF90aW1lOwogICAgICAgICAgICAgc3QyLT5kdXJhdGlvbiAgID0gc3QtPmR1cmF0aW9uOwotICAgICAgICAgICAgc3QyLT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOworICAgICAgICAgICAgc3QyLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOwogICAgICAgICAgICAgc3QyLT5wcml2X2RhdGEgPSBmZl9ybV9hbGxvY19ybXN0cmVhbSgpOwogICAgICAgICAgICAgaWYgKCFzdDItPnByaXZfZGF0YSkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpAQCAtNTIzLDcgKzUyMiw3IEBACiAKICAgICAgICAgc2l6ZTIgPSBhdmlvX3JiMzIocGIpOwogICAgICAgICByZXQgPSBmZl9ybV9yZWFkX21kcHJfY29kZWNkYXRhKHMsIHMtPnBiLCBzdDIsIHN0Mi0+cHJpdl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUyLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplMiwgTlVMTCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC01NjIsMTMgKzU2MSw4IEBACiAgICAgICAgIHRhZyA9IGF2aW9fcmwzMihwYik7CiAgICAgICAgIHRhZ19zaXplID0gYXZpb19yYjMyKHBiKTsKICAgICAgICAgYXZpb19yYjE2KHBiKTsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgInRhZz0lYyVjJWMlYyAoJTA4eCkgc2l6ZT0lZFxuIiwKLSAgICAgICAgICAgICAgICAodGFnICAgICAgKSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgKHRhZyA+PiAgOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICh0YWcgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAodGFnID4+IDI0KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgdGFnLAotICAgICAgICAgICAgICAgIHRhZ19zaXplKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19UUkFDRSwgInRhZz0lcyBzaXplPSVkXG4iLAorICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cih0YWcpLCB0YWdfc2l6ZSk7CiAgICAgICAgIGlmICh0YWdfc2l6ZSA8IDEwICYmIHRhZyAhPSBNS1RBRygnRCcsICdBJywgJ1QnLCAnQScpKQogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICBzd2l0Y2godGFnKSB7CkBAIC01OTgsNyArNTkyLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0LT5pZCA9IGF2aW9fcmIxNihwYik7CiAgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBtYXggYml0IHJhdGUgKi8KLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBhdmlvX3JiMzIocGIpOyAvKiBiaXQgcmF0ZSAqLworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IGF2aW9fcmIzMihwYik7IC8qIGJpdCByYXRlICovCiAgICAgICAgICAgICBhdmlvX3JiMzIocGIpOyAvKiBtYXggcGFja2V0IHNpemUgKi8KICAgICAgICAgICAgIGF2aW9fcmIzMihwYik7IC8qIGF2ZyBwYWNrZXQgc2l6ZSAqLwogICAgICAgICAgICAgc3RhcnRfdGltZSA9IGF2aW9fcmIzMihwYik7IC8qIHN0YXJ0IHRpbWUgKi8KQEAgLTYxMCw3ICs2MDQsNyBAQAogICAgICAgICAgICAgICAgIHMtPmR1cmF0aW9uID0gQVZfTk9QVFNfVkFMVUU7CiAgICAgICAgICAgICBnZXRfc3RyOChwYiwgYnVmLCBzaXplb2YoYnVmKSk7IC8qIGRlc2MgKi8KICAgICAgICAgICAgIGdldF9zdHI4KHBiLCBtaW1lLCBzaXplb2YobWltZSkpOyAvKiBtaW1ldHlwZSAqLwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0RBVEE7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfREFUQTsKICAgICAgICAgICAgIHN0LT5wcml2X2RhdGEgPSBmZl9ybV9hbGxvY19ybXN0cmVhbSgpOwogICAgICAgICAgICAgaWYgKCFzdC0+cHJpdl9kYXRhKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CkBAIC02NDksNyArNjQzLDggQEAKIAogICAgIGlmICghZGF0YV9vZmYpCiAgICAgICAgIGRhdGFfb2ZmID0gYXZpb190ZWxsKHBiKSAtIDE4OwotICAgIGlmIChpbmR4X29mZiAmJiBwYi0+c2Vla2FibGUgJiYgIShzLT5mbGFncyAmIEFWRk1UX0ZMQUdfSUdOSURYKSAmJgorICAgIGlmIChpbmR4X29mZiAmJiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpICYmCisgICAgICAgICEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0lHTklEWCkgJiYKICAgICAgICAgYXZpb19zZWVrKHBiLCBpbmR4X29mZiwgU0VFS19TRVQpID49IDApIHsKICAgICAgICAgcm1fcmVhZF9pbmRleChzKTsKICAgICAgICAgYXZpb19zZWVrKHBiLCBkYXRhX29mZiArIDE4LCBTRUVLX1NFVCk7CkBAIC04NjQsNyArODU5LDcgQEAKICAgICB1aW50OF90ICpwdHI7CiAgICAgaW50IGo7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQzMpIHsKICAgICAgICAgcHRyID0gcGt0LT5kYXRhOwogICAgICAgICBmb3IgKGo9MDtqPHBrdC0+c2l6ZTtqKz0yKSB7CiAgICAgICAgICAgICBGRlNXQVAoaW50LCBwdHJbMF0sIHB0clsxXSk7CkBAIC04OTEsMTIgKzg4NiwxMiBAQAogICAgIFJNRGVtdXhDb250ZXh0ICpybSA9IHMtPnByaXZfZGF0YTsKICAgICBpbnQgcmV0OwogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewogICAgICAgICBybS0+Y3VycmVudF9zdHJlYW09IHN0LT5pZDsKICAgICAgICAgcmV0ID0gcm1fYXNzZW1ibGVfdmlkZW9fZnJhbWUocywgcGIsIHJtLCBhc3QsIHBrdCwgbGVuLCBzZXEsICZ0aW1lc3RhbXApOwogICAgICAgICBpZihyZXQpCiAgICAgICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IC0xOyAvL2dvdCBwYXJ0aWFsIGZyYW1lIG9yIGVycm9yCi0gICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CiAgICAgICAgIGlmICgoYXN0LT5kZWludF9pZCA9PSBERUlOVF9JRF9HRU5SKSB8fAogICAgICAgICAgICAgKGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfSU5UNCkgfHwKICAgICAgICAgICAgIChhc3QtPmRlaW50X2lkID09IERFSU5UX0lEX1NJUFIpKSB7CkBAIC05MzMsNyArOTI4LDExIEBACiAKICAgICAgICAgICAgICBhc3QtPnN1Yl9wYWNrZXRfY250ID0gMDsKICAgICAgICAgICAgICBybS0+YXVkaW9fc3RyZWFtX251bSA9IHN0LT5pbmRleDsKLSAgICAgICAgICAgICBybS0+YXVkaW9fcGt0X2NudCA9IGggKiB3IC8gc3QtPmNvZGVjLT5ibG9ja19hbGlnbjsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduIDw9IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBibG9jayBhbGlnbm1lbnQgJWRcbiIsIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgIHJtLT5hdWRpb19wa3RfY250ID0gaCAqIHcgLyBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduOwogICAgICAgICB9IGVsc2UgaWYgKChhc3QtPmRlaW50X2lkID09IERFSU5UX0lEX1ZCUkYpIHx8CiAgICAgICAgICAgICAgICAgICAgKGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfVkJSUykpIHsKICAgICAgICAgICAgIGludCB4OwpAQCAtOTQ3LDM1ICs5NDYsMjQgQEAKICAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgocmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBsZW4pKSA8IDApCisgICAgICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGxlbik7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgcm1fYWMzX3N3YXBfYnl0ZXMoc3QsIHBrdCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBpZiAoKHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgbGVuKSkgPCAwKQorICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIGxlbik7CisgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKIAotI2lmIDAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICBpZihzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMjApewotICAgICAgICAgICAgaW50IHNlcT0gMTI4Kihwa3QtPmRhdGFbMl0mMHg3RikgKyAocGt0LT5kYXRhWzNdPj4xKTsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICIlZCAlIlBSSWQ2NCIgJWRcbiIsICp0aW1lc3RhbXAsICp0aW1lc3RhbXAqNTEyTEwvMjUsIHNlcSk7Ci0KLSAgICAgICAgICAgIHNlcSB8PSAodGltZXN0YW1wJn4weDNGRkYpOwotICAgICAgICAgICAgaWYoc2VxIC0gdGltZXN0YW1wID4gIDB4MjAwMCkgc2VxIC09IDB4NDAwMDsKLSAgICAgICAgICAgIGlmKHNlcSAtIHRpbWVzdGFtcCA8IC0weDIwMDApIHNlcSArPSAweDQwMDA7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQogICAgIHBrdC0+cHRzID0gdGltZXN0YW1wOwogICAgIGlmIChmbGFncyAmIDIpCiAgICAgICAgIHBrdC0+ZmxhZ3MgfD0gQVZfUEtUX0ZMQUdfS0VZOwogCi0gICAgcmV0dXJuIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gPyBybS0+YXVkaW9fcGt0X2NudCA6IDA7CisgICAgcmV0dXJuIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gPyBybS0+YXVkaW9fcGt0X2NudCA6IDA7CiB9CiAKIGludApAQCAtOTgzLDIxICs5NzEsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIFJNU3RyZWFtICphc3QsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgUk1EZW11eENvbnRleHQgKnJtID0gcy0+cHJpdl9kYXRhOworICAgIGludCByZXQ7CiAKICAgICBhdl9hc3NlcnQwIChybS0+YXVkaW9fcGt0X2NudCA+IDApOwogCiAgICAgaWYgKGFzdC0+ZGVpbnRfaWQgPT0gREVJTlRfSURfVkJSRiB8fAogICAgICAgICBhc3QtPmRlaW50X2lkID09IERFSU5UX0lEX1ZCUlMpIHsKLSAgICAgICAgaW50IHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgYXN0LT5zdWJfcGFja2V0X2xlbmd0aHNbYXN0LT5zdWJfcGFja2V0X2NudCAtIHJtLT5hdWRpb19wa3RfY250XSk7CisgICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgYXN0LT5zdWJfcGFja2V0X2xlbmd0aHNbYXN0LT5zdWJfcGFja2V0X2NudCAtIHJtLT5hdWRpb19wa3RfY250XSk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9IGVsc2UgewotICAgICAgICBpbnQgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pOworICAgICAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbik7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgYXN0LT5wa3QuZGF0YSArIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gKiAvL0ZJWE1FIGF2b2lkIHRoaXMKLSAgICAgICAgICAgICAgIChhc3QtPnN1Yl9wYWNrZXRfaCAqIGFzdC0+YXVkaW9fZnJhbWVzaXplIC8gc3QtPmNvZGVjLT5ibG9ja19hbGlnbiAtIHJtLT5hdWRpb19wa3RfY250KSwKLSAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pOworICAgICAgICBtZW1jcHkocGt0LT5kYXRhLCBhc3QtPnBrdC5kYXRhICsgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAqIC8vRklYTUUgYXZvaWQgdGhpcworICAgICAgICAgICAgICAgKGFzdC0+c3ViX3BhY2tldF9oICogYXN0LT5hdWRpb19mcmFtZXNpemUgLyBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduIC0gcm0tPmF1ZGlvX3BrdF9jbnQpLAorICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbik7CiAgICAgfQogICAgIHJtLT5hdWRpb19wa3RfY250LS07CiAgICAgaWYgKChwa3QtPnB0cyA9IGFzdC0+YXVkaW90aW1lc3RhbXApICE9IEFWX05PUFRTX1ZBTFVFKSB7CkBAIC0xMDQzLDcgKzEwMzIsOSBAQAogICAgICAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChsZW4gPD0gMCB8fCBhdmlvX2Zlb2Yocy0+cGIpKQorICAgICAgICAgICAgaWYgKGF2aW9fZmVvZihzLT5wYikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgICAgICAgICAgaWYgKGxlbiA8PSAwKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAKICAgICAgICAgICAgIHJlcyA9IGZmX3JtX3BhcnNlX3BhY2tldCAocywgcy0+cGIsIHN0LCBzdC0+cHJpdl9kYXRhLCBsZW4sIHBrdCwKQEAgLTExMTQsNyArMTEwNSw3IEBACiAgICAgICAgICAgICByZXR1cm4gQVZfTk9QVFNfVkFMVUU7CiAKICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleDJdOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewogICAgICAgICAgICAgaD0gYXZpb19yOChzLT5wYik7IGxlbi0tOwogICAgICAgICAgICAgaWYoIShoICYgMHg0MCkpewogICAgICAgICAgICAgICAgIHNlcSA9IGF2aW9fcjgocy0+cGIpOyBsZW4tLTsKQEAgLTEyMzEsOCArMTIyMiwxMSBAQAogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIiVzID0gJyVzJ1xuIiwga2V5LCB2YWwpOwogICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gNCkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIiVzID0gJzB4Iiwga2V5KTsKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworICAgICAgICAgICAgICAgIGlmIChhdmlvX2Zlb2YocGIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJVgiLCBhdmlvX3I4KHBiKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJ1xuIik7CiAgICAgICAgIH0gZWxzZSBpZiAobGVuID09IDQgJiYgdHlwZSA9PSAzICYmICFzdHJuY21wKGtleSwgIlN0cmVhbUNvdW50IiwgdGxlbikpIHsKICAgICAgICAgICAgIG5iX3N0cmVhbXMgPSB2YWx1ZSA9IGF2aW9fcmIzMihwYik7CkBAIC0xMjc1LDYgKzEyNjksOCBAQAogICAgICAgICAgICAgICAgIGlmIChhdmlvX3JiMzIocGIpID09IE1LQkVUQUcoJ00nLCAnTCcsICdUJywgJ0knKSkgewogICAgICAgICAgICAgICAgICAgICByZXQgPSBybV9yZWFkX211bHRpKHMsIHBiLCBzdCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICAgICAgYXZpb19zZWVrKHBiLCAtNCwgU0VFS19DVVIpOwogICAgICAgICAgICAgICAgICAgICByZXQgPSBmZl9ybV9yZWFkX21kcHJfY29kZWNkYXRhKHMsIHBiLCBzdCwgc3QtPnByaXZfZGF0YSwgbGVuLCBOVUxMKTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ybWVuYy5jIGIvbGliYXZmb3JtYXQvcm1lbmMuYwppbmRleCAzM2VhZjYzLi4zYmZmNGRhIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ybWVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3JtZW5jLmMKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBpbnQgbmJfZnJhbWVzOyAgICAvKiBjdXJyZW50IGZyYW1lIG51bWJlciAqLwogICAgIGludCB0b3RhbF9mcmFtZXM7IC8qIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgKi8KICAgICBpbnQgbnVtOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKIH0gU3RyZWFtSW5mbzsKIAogdHlwZWRlZiBzdHJ1Y3QgUk1NdXhDb250ZXh0IHsKQEAgLTcyLDE0ICs3MiwxMiBAQAogICAgIFJNTXV4Q29udGV4dCAqcm0gPSBjdHgtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcyA9IGN0eC0+cGI7CiAgICAgU3RyZWFtSW5mbyAqc3RyZWFtOwotICAgIHVuc2lnbmVkIGNoYXIgKmRhdGFfb2Zmc2V0X3B0ciwgKnN0YXJ0X3B0cjsKICAgICBjb25zdCBjaGFyICpkZXNjLCAqbWltZXR5cGU7CiAgICAgaW50IG5iX3BhY2tldHMsIHBhY2tldF90b3RhbF9zaXplLCBwYWNrZXRfbWF4X3NpemUsIHNpemUsIHBhY2tldF9hdmdfc2l6ZSwgaTsKLSAgICBpbnQgYml0X3JhdGUsIHYsIGR1cmF0aW9uLCBmbGFncywgZGF0YV9wb3M7CisgICAgaW50IGJpdF9yYXRlLCB2LCBkdXJhdGlvbiwgZmxhZ3M7CisgICAgaW50IGRhdGFfb2Zmc2V0OwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWc7CiAKLSAgICBzdGFydF9wdHIgPSBzLT5idWZfcHRyOwotCiAgICAgZmZpb193Zm91cmNjKHMsICIuUk1GIik7CiAgICAgYXZpb193YjMyKHMsMTgpOyAvKiBoZWFkZXIgc2l6ZSAqLwogICAgIGF2aW9fd2IxNihzLDApOwpAQCAtMTE5LDExICsxMTcsMTEgQEAKICAgICBhdmlvX3diMzIocywgQlVGRkVSX0RVUkFUSU9OKTsgICAgICAgICAgIC8qIHByZXJvbGwgKi8KICAgICBhdmlvX3diMzIocywgaW5kZXhfcG9zKTsgICAgICAgICAgIC8qIGluZGV4IG9mZnNldCAqLwogICAgIC8qIGNvbXB1dGF0aW9uIG9mIGRhdGEgdGhlIGRhdGEgb2Zmc2V0ICovCi0gICAgZGF0YV9vZmZzZXRfcHRyID0gcy0+YnVmX3B0cjsKKyAgICBkYXRhX29mZnNldCA9IGF2aW9fdGVsbChzKTsKICAgICBhdmlvX3diMzIocywgMCk7ICAgICAgICAgICAvKiBkYXRhIG9mZnNldCA6IHdpbGwgYmUgcGF0Y2hlZCBhZnRlciAqLwogICAgIGF2aW9fd2IxNihzLCBjdHgtPm5iX3N0cmVhbXMpOyAgICAvKiBudW0gc3RyZWFtcyAqLwogICAgIGZsYWdzID0gMSB8IDI7IC8qIHNhdmUgYWxsb3dlZCAmIHBlcmZlY3QgcGxheSAqLwotICAgIGlmICghcy0+c2Vla2FibGUpCisgICAgaWYgKCEocy0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpCiAgICAgICAgIGZsYWdzIHw9IDQ7IC8qIGxpdmUgYnJvYWRjYXN0ICovCiAgICAgYXZpb193YjE2KHMsIGZsYWdzKTsKIApAQCAtMTQ3LDcgKzE0NSw3IEBACiAKICAgICAgICAgc3RyZWFtID0gJnJtLT5zdHJlYW1zW2ldOwogCi0gICAgICAgIGlmIChzdHJlYW0tPmVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgaWYgKHN0cmVhbS0+cGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICAgICAgZGVzYyA9ICJUaGUgQXVkaW8gU3RyZWFtIjsKICAgICAgICAgICAgIG1pbWV0eXBlID0gImF1ZGlvL3gtcG4tcmVhbGF1ZGlvIjsKICAgICAgICAgICAgIGNvZGVjX2RhdGFfc2l6ZSA9IDczOwpAQCAtMTc1LDcgKzE3Myw3IEBACiAgICAgICAgIGF2aW9fd2IzMihzLCAwKTsgICAgICAgICAgIC8qIHN0YXJ0IHRpbWUgKi8KICAgICAgICAgYXZpb193YjMyKHMsIEJVRkZFUl9EVVJBVElPTik7ICAgICAgICAgICAvKiBwcmVyb2xsICovCiAgICAgICAgIC8qIGR1cmF0aW9uICovCi0gICAgICAgIGlmICghcy0+c2Vla2FibGUgfHwgIXN0cmVhbS0+dG90YWxfZnJhbWVzKQorICAgICAgICBpZiAoIShzLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB8fCAhc3RyZWFtLT50b3RhbF9mcmFtZXMpCiAgICAgICAgICAgICBhdmlvX3diMzIocywgKGludCkoMzYwMCAqIDEwMDApKTsKICAgICAgICAgZWxzZQogICAgICAgICAgICAgYXZpb193YjMyKHMsIGF2X3Jlc2NhbGVfcV9ybmQoc3RyZWFtLT50b3RhbF9mcmFtZXMsIChBVlJhdGlvbmFsKXsxMDAwLCAxfSwgIHN0cmVhbS0+ZnJhbWVfcmF0ZSwgQVZfUk9VTkRfWkVSTykpOwpAQCAtMTgzLDExICsxODEsMTEgQEAKICAgICAgICAgcHV0X3N0cjgocywgbWltZXR5cGUpOwogICAgICAgICBhdmlvX3diMzIocywgY29kZWNfZGF0YV9zaXplKTsKIAotICAgICAgICBpZiAoc3RyZWFtLT5lbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGlmIChzdHJlYW0tPnBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKICAgICAgICAgICAgIGludCBjb2RlZF9mcmFtZV9zaXplLCBmc2NvZGUsIHNhbXBsZV9yYXRlOwotICAgICAgICAgICAgaW50IGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oc3RyZWFtLT5lbmMsIDApOwotICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSBzdHJlYW0tPmVuYy0+c2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBjb2RlZF9mcmFtZV9zaXplID0gKHN0cmVhbS0+ZW5jLT5iaXRfcmF0ZSAqCisgICAgICAgICAgICBpbnQgZnJhbWVfc2l6ZSA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbjIoc3RyZWFtLT5wYXIsIDApOworICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSBzdHJlYW0tPnBhci0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBjb2RlZF9mcmFtZV9zaXplID0gKHN0cmVhbS0+cGFyLT5iaXRfcmF0ZSAqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX3NpemUpIC8gKDggKiBzYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICAvKiBhdWRpbyBjb2RlYyBpbmZvICovCiAgICAgICAgICAgICBhdmlvX3dyaXRlKHMsICIucmEiLCAzKTsKQEAgLTIyMiwxOSArMjIwLDE5IEBACiAgICAgICAgICAgICAgICAgY29kZWRfZnJhbWVfc2l6ZS0tOwogICAgICAgICAgICAgYXZpb193YjMyKHMsIGNvZGVkX2ZyYW1lX3NpemUpOyAvKiBmcmFtZSBsZW5ndGggKi8KICAgICAgICAgICAgIGF2aW9fd2IzMihzLCAweDUxNTQwKTsgLyogdW5rbm93biAqLwotICAgICAgICAgICAgYXZpb193YjMyKHMsIHN0cmVhbS0+ZW5jLT5iaXRfcmF0ZSAvIDggKiA2MCk7IC8qIGJ5dGVzIHBlciBtaW51dGUgKi8KLSAgICAgICAgICAgIGF2aW9fd2IzMihzLCBzdHJlYW0tPmVuYy0+Yml0X3JhdGUgLyA4ICogNjApOyAvKiBieXRlcyBwZXIgbWludXRlICovCisgICAgICAgICAgICBhdmlvX3diMzIocywgc3RyZWFtLT5wYXItPmJpdF9yYXRlIC8gOCAqIDYwKTsgLyogYnl0ZXMgcGVyIG1pbnV0ZSAqLworICAgICAgICAgICAgYXZpb193YjMyKHMsIHN0cmVhbS0+cGFyLT5iaXRfcmF0ZSAvIDggKiA2MCk7IC8qIGJ5dGVzIHBlciBtaW51dGUgKi8KICAgICAgICAgICAgIGF2aW9fd2IxNihzLCAweDAxKTsKICAgICAgICAgICAgIC8qIGZyYW1lIGxlbmd0aCA6IHNlZW1zIHRvIGJlIHZlcnkgaW1wb3J0YW50ICovCiAgICAgICAgICAgICBhdmlvX3diMTYocywgY29kZWRfZnJhbWVfc2l6ZSk7CiAgICAgICAgICAgICBhdmlvX3diMzIocywgMCk7IC8qIHVua25vd24gKi8KLSAgICAgICAgICAgIGF2aW9fd2IxNihzLCBzdHJlYW0tPmVuYy0+c2FtcGxlX3JhdGUpOyAvKiBzYW1wbGUgcmF0ZSAqLworICAgICAgICAgICAgYXZpb193YjE2KHMsIHN0cmVhbS0+cGFyLT5zYW1wbGVfcmF0ZSk7IC8qIHNhbXBsZSByYXRlICovCiAgICAgICAgICAgICBhdmlvX3diMzIocywgMHgxMCk7IC8qIHVua25vd24gKi8KLSAgICAgICAgICAgIGF2aW9fd2IxNihzLCBzdHJlYW0tPmVuYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgYXZpb193YjE2KHMsIHN0cmVhbS0+cGFyLT5jaGFubmVscyk7CiAgICAgICAgICAgICBwdXRfc3RyOChzLCAiSW50MCIpOyAvKiBjb2RlYyBuYW1lICovCi0gICAgICAgICAgICBpZiAoc3RyZWFtLT5lbmMtPmNvZGVjX3RhZykgeworICAgICAgICAgICAgaWYgKHN0cmVhbS0+cGFyLT5jb2RlY190YWcpIHsKICAgICAgICAgICAgICAgICBhdmlvX3c4KHMsIDQpOyAvKiB0YWcgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgYXZpb193bDMyKHMsIHN0cmVhbS0+ZW5jLT5jb2RlY190YWcpOworICAgICAgICAgICAgICAgIGF2aW9fd2wzMihzLCBzdHJlYW0tPnBhci0+Y29kZWNfdGFnKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjb2RlYyB0YWdcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKQEAgLTI0NywyMSArMjQ1LDI3IEBACiAgICAgICAgICAgICAvKiB2aWRlbyBjb2RlYyBpbmZvICovCiAgICAgICAgICAgICBhdmlvX3diMzIocywzNCk7IC8qIHNpemUgKi8KICAgICAgICAgICAgIGZmaW9fd2ZvdXJjYyhzLCAiVklETyIpOwotICAgICAgICAgICAgaWYoc3RyZWFtLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMTApCisgICAgICAgICAgICBpZihzdHJlYW0tPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYxMCkKICAgICAgICAgICAgICAgICBmZmlvX3dmb3VyY2MocywiUlYxMCIpOwogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIGZmaW9fd2ZvdXJjYyhzLCJSVjIwIik7Ci0gICAgICAgICAgICBhdmlvX3diMTYocywgc3RyZWFtLT5lbmMtPndpZHRoKTsKLSAgICAgICAgICAgIGF2aW9fd2IxNihzLCBzdHJlYW0tPmVuYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihzLCBzdHJlYW0tPnBhci0+d2lkdGgpOworICAgICAgICAgICAgYXZpb193YjE2KHMsIHN0cmVhbS0+cGFyLT5oZWlnaHQpOworCisgICAgICAgICAgICBpZiAoc3RyZWFtLT5mcmFtZV9yYXRlLm51bSAvIHN0cmVhbS0+ZnJhbWVfcmF0ZS5kZW4gPiA2NTUzNSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGcmFtZSByYXRlICVkIGlzIHRvbyBoaWdoXG4iLCBzdHJlYW0tPmZyYW1lX3JhdGUubnVtIC8gc3RyZWFtLT5mcmFtZV9yYXRlLmRlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgYXZpb193YjE2KHMsIHN0cmVhbS0+ZnJhbWVfcmF0ZS5udW0gLyBzdHJlYW0tPmZyYW1lX3JhdGUuZGVuKTsgLyogZnJhbWVzIHBlciBzZWNvbmRzID8gKi8KICAgICAgICAgICAgIGF2aW9fd2IzMihzLDApOyAgICAgLyogdW5rbm93biBtZWFuaW5nICovCiAgICAgICAgICAgICBhdmlvX3diMTYocywgc3RyZWFtLT5mcmFtZV9yYXRlLm51bSAvIHN0cmVhbS0+ZnJhbWVfcmF0ZS5kZW4pOyAgLyogdW5rbm93biBtZWFuaW5nICovCiAgICAgICAgICAgICBhdmlvX3diMzIocywwKTsgICAgIC8qIHVua25vd24gbWVhbmluZyAqLwogICAgICAgICAgICAgYXZpb193YjE2KHMsIDgpOyAgICAvKiB1bmtub3duIG1lYW5pbmcgKi8KLSAgICAgICAgICAgIC8qIFNlZW1zIHRvIGJlIHRoZSBjb2RlYyB2ZXJzaW9uOiBvbmx5IHVzZSBiYXNpYyBIMjYzLiBUaGUgbmV4dAotICAgICAgICAgICAgICAgdmVyc2lvbnMgc2VlbXMgdG8gYWRkIGEgZGlmZmVudGlhbCBEQyBjb2RpbmcgYXMgaW4KLSAgICAgICAgICAgICAgIE1QRUcuLi4gbm90aGluZyBuZXcgdW5kZXIgdGhlIHN1biAqLwotICAgICAgICAgICAgaWYoc3RyZWFtLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWMTApCisgICAgICAgICAgICAvKiBTZWVtcyB0byBiZSB0aGUgY29kZWMgdmVyc2lvbjogb25seSB1c2UgYmFzaWMgSC4yNjMuIFRoZSBuZXh0CisgICAgICAgICAgICAgICB2ZXJzaW9ucyBzZWVtcyB0byBhZGQgYSBkaWZmZXJlbnRpYWwgREMgY29kaW5nIGFzIGluCisgICAgICAgICAgICAgICBNUEVHLi4uIG5vdGhpbmcgbmV3IHVuZGVyIHRoZSBzdW4uICovCisgICAgICAgICAgICBpZihzdHJlYW0tPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYxMCkKICAgICAgICAgICAgICAgICBhdmlvX3diMzIocywweDEwMDAwMDAwKTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBhdmlvX3diMzIocywweDIwMTAzMDAxKTsKQEAgLTI3MCwxMiArMjc0LDExIEBACiAgICAgfQogCiAgICAgLyogcGF0Y2ggZGF0YSBvZmZzZXQgZmllbGQgKi8KLSAgICBkYXRhX3BvcyA9IHMtPmJ1Zl9wdHIgLSBzdGFydF9wdHI7Ci0gICAgcm0tPmRhdGFfcG9zID0gZGF0YV9wb3M7Ci0gICAgZGF0YV9vZmZzZXRfcHRyWzBdID0gZGF0YV9wb3MgPj4gMjQ7Ci0gICAgZGF0YV9vZmZzZXRfcHRyWzFdID0gZGF0YV9wb3MgPj4gMTY7Ci0gICAgZGF0YV9vZmZzZXRfcHRyWzJdID0gZGF0YV9wb3MgPj4gODsKLSAgICBkYXRhX29mZnNldF9wdHJbM10gPSBkYXRhX3BvczsKKyAgICBybS0+ZGF0YV9wb3MgPSBhdmlvX3RlbGwocyk7CisgICAgaWYgKGF2aW9fc2VlayhzLCBkYXRhX29mZnNldCwgU0VFS19TRVQpID49IDApIHsKKyAgICAgICAgYXZpb193YjMyKHMsIHJtLT5kYXRhX3Bvcyk7CisgICAgICAgIGF2aW9fc2VlayhzLCBybS0+ZGF0YV9wb3MsIFNFRUtfU0VUKTsKKyAgICB9CiAKICAgICAvKiBkYXRhIHN0cmVhbSAqLwogICAgIGZmaW9fd2ZvdXJjYyhzLCAiREFUQSIpOwpAQCAtMzEyLDcgKzMxNSw3IEBACiAgICAgUk1NdXhDb250ZXh0ICpybSA9IHMtPnByaXZfZGF0YTsKICAgICBTdHJlYW1JbmZvICpzdHJlYW07CiAgICAgaW50IG47Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXI7CiAKICAgICBpZiAocy0+bmJfc3RyZWFtcyA+IDIpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkF0IG1vc3QgMiBzdHJlYW1zIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBtdXhpbmcgaW4gUk1cbiIpOwpAQCAtMzI0LDE4ICszMjcsMTggQEAKICAgICAgICAgaW50IGZyYW1lX3NpemU7CiAKICAgICAgICAgcy0+c3RyZWFtc1tuXS0+aWQgPSBuOwotICAgICAgICBjb2RlYyA9IHMtPnN0cmVhbXNbbl0tPmNvZGVjOworICAgICAgICBwYXIgPSBzLT5zdHJlYW1zW25dLT5jb2RlY3BhcjsKICAgICAgICAgc3RyZWFtID0gJnJtLT5zdHJlYW1zW25dOwogICAgICAgICBtZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoU3RyZWFtSW5mbykpOwogICAgICAgICBzdHJlYW0tPm51bSA9IG47Ci0gICAgICAgIHN0cmVhbS0+Yml0X3JhdGUgPSBjb2RlYy0+Yml0X3JhdGU7Ci0gICAgICAgIHN0cmVhbS0+ZW5jID0gY29kZWM7CisgICAgICAgIHN0cmVhbS0+Yml0X3JhdGUgPSBwYXItPmJpdF9yYXRlOworICAgICAgICBzdHJlYW0tPnBhciA9IHBhcjsKIAotICAgICAgICBzd2l0Y2goY29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChwYXItPmNvZGVjX3R5cGUpIHsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CiAgICAgICAgICAgICBybS0+YXVkaW9fc3RyZWFtID0gc3RyZWFtOwotICAgICAgICAgICAgZnJhbWVfc2l6ZSA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihjb2RlYywgMCk7Ci0gICAgICAgICAgICBzdHJlYW0tPmZyYW1lX3JhdGUgPSAoQVZSYXRpb25hbCl7Y29kZWMtPnNhbXBsZV9yYXRlLCBmcmFtZV9zaXplfTsKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHBhciwgMCk7CisgICAgICAgICAgICBzdHJlYW0tPmZyYW1lX3JhdGUgPSAoQVZSYXRpb25hbCl7cGFyLT5zYW1wbGVfcmF0ZSwgZnJhbWVfc2l6ZX07CiAgICAgICAgICAgICAvKiBYWFg6IGR1bW15IHZhbHVlcyAqLwogICAgICAgICAgICAgc3RyZWFtLT5wYWNrZXRfbWF4X3NpemUgPSAxMDI0OwogICAgICAgICAgICAgc3RyZWFtLT5uYl9wYWNrZXRzID0gMDsKQEAgLTM3MCw3ICszNzMsNyBAQAogCiAgICAgd3JpdGVfcGFja2V0X2hlYWRlcihzLCBzdHJlYW0sIHNpemUsICEhKGZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSk7CiAKLSAgICBpZiAoc3RyZWFtLT5lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FDMykgeworICAgIGlmIChzdHJlYW0tPnBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUMzKSB7CiAgICAgICAgIC8qIGZvciBBQy0zLCB0aGUgd29yZHMgc2VlbSB0byBiZSByZXZlcnNlZCAqLwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSAyKSB7CiAgICAgICAgICAgICBhdmlvX3c4KHBiLCBidWZbaSArIDFdKTsKQEAgLTM5NCw3ICszOTcsNiBAQAogCiAgICAgLyogV2VsbCwgSSBzcGVudCBzb21lIHRpbWUgZmluZGluZyB0aGUgbWVhbmluZyBvZiB0aGVzZSBiaXRzLiBJIGFtCiAgICAgICAgbm90IHN1cmUgSSB1bmRlcnN0b29kIGV2ZXJ5dGhpbmcsIGJ1dCBpdCB3b3JrcyAhISAqLwotI2lmIDEKICAgICBpZiAoc2l6ZSA+IE1BWF9QQUNLRVRfU0laRSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTXV4aW5nIHBhY2tldHMgbGFyZ2VyIHRoYW4gNjQga0IgKCVkKSBpcyBub3Qgc3VwcG9ydGVkXG4iLCBzaXplKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwpAQCAtNDAyLDcgKzQwNCw3IEBACiAgICAgd3JpdGVfcGFja2V0X2hlYWRlcihzLCBzdHJlYW0sIHNpemUgKyA3ICsgKHNpemUgPj0gMHg0MDAwKSo0LCBrZXlfZnJhbWUpOwogICAgIC8qIGJpdCA3OiAnMScgaWYgZmluYWwgcGFja2V0IG9mIGEgZnJhbWUgY29udmVydGVkIGluIHNldmVyYWwgcGFja2V0cyAqLwogICAgIGF2aW9fdzgocGIsIDB4ODEpOwotICAgIC8qIGJpdCA3OiAnMScgaWYgSSBmcmFtZS4gYml0cyA2Li4wIDogc2VxdWVuY2UgbnVtYmVyIGluIGN1cnJlbnQKKyAgICAvKiBiaXQgNzogJzEnIGlmIEktZnJhbWUuIGJpdHMgNi4uMCA6IHNlcXVlbmNlIG51bWJlciBpbiBjdXJyZW50CiAgICAgICAgZnJhbWUgc3RhcnRpbmcgZnJvbSAxICovCiAgICAgaWYgKGtleV9mcmFtZSkgewogICAgICAgICBhdmlvX3c4KHBiLCAweDgxKTsKQEAgLTQxNiwxMyArNDE4LDYgQEAKICAgICAgICAgYXZpb193YjE2KHBiLCAweDQwMDAgfCBzaXplKTsgLyogdG90YWwgZnJhbWUgc2l6ZSAqLwogICAgICAgICBhdmlvX3diMTYocGIsIDB4NDAwMCB8IHNpemUpOyAvKiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb3IgdGhlIGVuZCAqLwogICAgIH0KLSNlbHNlCi0gICAgLyogZnVsbCBmcmFtZSAqLwotICAgIHdyaXRlX3BhY2tldF9oZWFkZXIocywgc2l6ZSArIDYpOwotICAgIGF2aW9fdzgocGIsIDB4YzApOwotICAgIGF2aW9fd2IxNihwYiwgMHg0MDAwICsgc2l6ZSk7IC8qIHRvdGFsIGZyYW1lIHNpemUgKi8KLSAgICBhdmlvX3diMTYocGIsIDB4NDAwMCArIHBhY2tldF9udW1iZXIgKiAxMjYpOyAvKiBwb3NpdGlvbiBpbiBzdHJlYW0gKi8KLSNlbmRpZgogICAgIGF2aW9fdzgocGIsIHN0cmVhbS0+bmJfZnJhbWVzICYgMHhmZik7CiAKICAgICBhdmlvX3dyaXRlKHBiLCBidWYsIHNpemUpOwpAQCAtNDMzLDcgKzQyOCw3IEBACiAKIHN0YXRpYyBpbnQgcm1fd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBpZiAocy0+c3RyZWFtc1twa3QtPnN0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlID09CisgICAgaWYgKHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PQogICAgICAgICBBVk1FRElBX1RZUEVfQVVESU8pCiAgICAgICAgIHJldHVybiBybV93cml0ZV9hdWRpbyhzLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwgcGt0LT5mbGFncyk7CiAgICAgZWxzZQpAQCAtNDQ2LDcgKzQ0MSw3IEBACiAgICAgaW50IGRhdGFfc2l6ZSwgaW5kZXhfcG9zLCBpOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogCi0gICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgIGlmIChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICAvKiBlbmQgb2YgZmlsZTogZmluaXNoIHRvIHdyaXRlIGhlYWRlciAqLwogICAgICAgICBpbmRleF9wb3MgPSBhdmlvX3RlbGwocGIpOwogICAgICAgICBkYXRhX3NpemUgPSBpbmRleF9wb3MgLSBybS0+ZGF0YV9wb3M7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ycGwuYyBiL2xpYmF2Zm9ybWF0L3JwbC5jCmluZGV4IDc2YzM4NWIuLmQzNzM2MDAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3JwbC5jCisrKyBiL2xpYmF2Zm9ybWF0L3JwbC5jCkBAIC0xNDUsMzQgKzE0NSwzNCBAQAogICAgIHZzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCF2c3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyAgICAgICA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gdmlkZW8gZm9ybWF0Ci0gICAgdnN0LT5jb2RlYy0+d2lkdGggICAgICAgICAgID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyB2aWRlbyB3aWR0aAotICAgIHZzdC0+Y29kZWMtPmhlaWdodCAgICAgICAgICA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gdmlkZW8gaGVpZ2h0Ci0gICAgdnN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyB2aWRlbyBiaXRzIHBlciBzYW1wbGUKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgICAgID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyB2aWRlbyBmb3JtYXQKKyAgICB2c3QtPmNvZGVjcGFyLT53aWR0aCAgICAgICAgICAgPSByZWFkX2xpbmVfYW5kX2ludChwYiwgJmVycm9yKTsgIC8vIHZpZGVvIHdpZHRoCisgICAgdnN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICAgICAgID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyB2aWRlbyBoZWlnaHQKKyAgICB2c3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSByZWFkX2xpbmVfYW5kX2ludChwYiwgJmVycm9yKTsgIC8vIHZpZGVvIGJpdHMgcGVyIHNhbXBsZQogICAgIGVycm9yIHw9IHJlYWRfbGluZShwYiwgbGluZSwgc2l6ZW9mKGxpbmUpKTsgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gZnJhbWVzIHBlciBzZWNvbmQKICAgICBmcHMgPSByZWFkX2ZwcyhsaW5lLCAmZXJyb3IpOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMiwgZnBzLmRlbiwgZnBzLm51bSk7CiAKICAgICAvLyBGaWd1cmUgb3V0IHRoZSB2aWRlbyBjb2RlYwotICAgIHN3aXRjaCAodnN0LT5jb2RlYy0+Y29kZWNfdGFnKSB7CisgICAgc3dpdGNoICh2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcpIHsKICNpZiAwCiAgICAgICAgIGNhc2UgMTIyOgotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9FU0NBUEUxMjI7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0VTQ0FQRTEyMjsKICAgICAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAgICAgICAgIGNhc2UgMTI0OgotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9FU0NBUEUxMjQ7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0VTQ0FQRTEyNDsKICAgICAgICAgICAgIC8vIFRoZSBoZWFkZXIgaXMgd3JvbmcgaGVyZSwgYXQgbGVhc3Qgc29tZXRpbWVzCi0gICAgICAgICAgICB2c3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMTMwOgotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9FU0NBUEUxMzA7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0VTQ0FQRTEzMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIlZpZGVvIGZvcm1hdCAlaSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcpOwotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIlZpZGVvIGZvcm1hdCAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZykpOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOwogICAgIH0KIAogICAgIC8vIEF1ZGlvIGhlYWRlcnMKQEAgLTE4NCw1NyArMTg0LDU3IEBACiAgICAgICAgIGFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgICAgIGlmICghYXN0KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgICAgICAgPSBhdWRpb19mb3JtYXQ7Ci0gICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgICA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gYXVkaW8gYml0cmF0ZQotICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICAgPSByZWFkX2xpbmVfYW5kX2ludChwYiwgJmVycm9yKTsgIC8vIG51bWJlciBvZiBhdWRpbyBjaGFubmVscwotICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSByZWFkX2xpbmVfYW5kX2ludChwYiwgJmVycm9yKTsgIC8vIGF1ZGlvIGJpdHMgcGVyIHNhbXBsZQorICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgICAgICA9IGF1ZGlvX2Zvcm1hdDsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyBhdWRpbyBiaXRyYXRlCisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgICA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gYXVkaW8gYml0cyBwZXIgc2FtcGxlCiAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBzYW1wbGUgdXNlcyAwIGZvciBBRFBDTSwgd2hpY2ggaXMgcmVhbGx5IDQgYml0cwogICAgICAgICAvLyBwZXIgc2FtcGxlLgotICAgICAgICBpZiAoYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDApCi0gICAgICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OworICAgICAgICBpZiAoYXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDApCisgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OwogCi0gICAgICAgIGFzdC0+Y29kZWMtPmJpdF9yYXRlID0gYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAKLSAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9OT05FOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX05PTkU7CiAgICAgICAgIHN3aXRjaCAoYXVkaW9fZm9ybWF0KSB7CiAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaWYgKGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSAxNikgeworICAgICAgICAgICAgICAgIGlmIChhc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMTYpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gMTYtYml0IGF1ZGlvIGlzIGFsd2F5cyBzaWduZWQKLSAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CisgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIHNvbWUgb3RoZXIgZm9ybWF0cyBsaXN0ZWQgYXMgbGVnYWwgcGVyIHRoZSBzcGVjOwogICAgICAgICAgICAgICAgIC8vIHNhbXBsZXMgbmVlZGVkLgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICAgICAgICAgaWYgKGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4KSB7CisgICAgICAgICAgICAgICAgaWYgKGFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9PSA4KSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBzYW1wbGVzIHdpdGggdGhpcyBraW5kIG9mIGF1ZGlvIHRoYXQgSSBoYXZlCiAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBhbGwgdW5zaWduZWQuCi0gICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgICAgICAgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gNCkgewotICAgICAgICAgICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9FQV9TRUFEOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfRUFfU0VBRDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChhc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICBpZiAoYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKICAgICAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiQXVkaW8gZm9ybWF0ICUiUFJJZDMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdCk7Ci0gICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCAzMiwgMSwgYXN0LT5jb2RlYy0+Yml0X3JhdGUpOworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzIsIDEsIGFzdC0+Y29kZWNwYXItPmJpdF9yYXRlKTsKICAgICB9IGVsc2UgewogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgICAgICAgZXJyb3IgfD0gcmVhZF9saW5lKHBiLCBsaW5lLCBzaXplb2YobGluZSkpOwogICAgIH0KIAogICAgIHJwbC0+ZnJhbWVzX3Blcl9jaHVuayA9IHJlYWRfbGluZV9hbmRfaW50KHBiLCAmZXJyb3IpOyAgLy8gdmlkZW8gZnJhbWVzIHBlciBjaHVuawotICAgIGlmIChycGwtPmZyYW1lc19wZXJfY2h1bmsgPiAxICYmIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyAhPSAxMjQpCisgICAgaWYgKHJwbC0+ZnJhbWVzX3Blcl9jaHVuayA+IDEgJiYgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICE9IDEyNCkKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIkRvbid0IGtub3cgaG93IHRvIHNwbGl0IGZyYW1lcyBmb3IgdmlkZW8gZm9ybWF0ICVpLiAiCi0gICAgICAgICAgICAgICAiVmlkZW8gc3RyZWFtIHdpbGwgYmUgYnJva2VuIVxuIiwgdnN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgICAgICJEb24ndCBrbm93IGhvdyB0byBzcGxpdCBmcmFtZXMgZm9yIHZpZGVvIGZvcm1hdCAlcy4gIgorICAgICAgICAgICAgICAgIlZpZGVvIHN0cmVhbSB3aWxsIGJlIGJyb2tlbiFcbiIsIGF2X2ZvdXJjYzJzdHIodnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKSk7CiAKICAgICBudW1iZXJfb2ZfY2h1bmtzID0gcmVhZF9saW5lX2FuZF9pbnQocGIsICZlcnJvcik7ICAvLyBudW1iZXIgb2YgY2h1bmtzIGluIHRoZSBmaWxlCiAgICAgLy8gVGhlIG51bWJlciBpbiB0aGUgaGVhZGVyIGlzIGFjdHVhbGx5IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjaHVuay4KQEAgLTI5Niw4ICsyOTYsOCBAQAogICAgICAgICBpZiAoYXZpb19zZWVrKHBiLCBpbmRleF9lbnRyeS0+cG9zLCBTRUVLX1NFVCkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAotICAgIGlmIChzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgotICAgICAgICBzdHJlYW0tPmNvZGVjLT5jb2RlY190YWcgPT0gMTI0KSB7CisgICAgaWYgKHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3RhZyA9PSAxMjQpIHsKICAgICAgICAgLy8gV2UgaGF2ZSB0byBzcGxpdCBFc2NhcGUgMTI0IGZyYW1lcyBiZWNhdXNlIHRoZXJlIGFyZQogICAgICAgICAvLyBtdWx0aXBsZSBmcmFtZXMgcGVyIGNodW5rIGluIEVzY2FwZSAxMjQgc2FtcGxlcy4KICAgICAgICAgdWludDMyX3QgZnJhbWVfc2l6ZTsKQEAgLTMzMiw3ICszMzIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBpZiAoc3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgICAgIC8vIGZyYW1lc19wZXJfY2h1bmsgc2hvdWxkIGFsd2F5cyBiZSBvbmUgaGVyZTsgdGhlIGhlYWRlcgogICAgICAgICAgICAgLy8gcGFyc2luZyB3aWxsIHdhcm4gaWYgaXQgaXNuJ3QuCiAgICAgICAgICAgICBwa3QtPmR1cmF0aW9uID0gcnBsLT5mcmFtZXNfcGVyX2NodW5rOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnNkLmMgYi9saWJhdmZvcm1hdC9yc2QuYwppbmRleCBkZDFmMzcyLi4xYzk5ZjhjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9yc2QuYworKysgYi9saWJhdmZvcm1hdC9yc2QuYwpAQCAtNTYsNyArNTYsNyBAQAogewogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogICAgIGludCBpLCByZXQsIHZlcnNpb24sIHN0YXJ0ID0gMHg4MDA7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXI7CiAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKIAogICAgIGlmICghc3QpCkBAIC02NSwxNiArNjUsMTQgQEAKICAgICBhdmlvX3NraXAocGIsIDMpOyAvLyAiUlNEIgogICAgIHZlcnNpb24gPSBhdmlvX3I4KHBiKSAtICcwJzsKIAotICAgIGNvZGVjID0gc3QtPmNvZGVjOwotICAgIGNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIGNvZGVjLT5jb2RlY190YWcgID0gYXZpb19ybDMyKHBiKTsKLSAgICBjb2RlYy0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChyc2RfdGFncywgY29kZWMtPmNvZGVjX3RhZyk7Ci0gICAgaWYgKCFjb2RlYy0+Y29kZWNfaWQpIHsKLSAgICAgICAgY2hhciB0YWdfYnVmWzMyXTsKLQotICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyh0YWdfYnVmLCBzaXplb2YodGFnX2J1ZiksIGNvZGVjLT5jb2RlY190YWcpOworICAgIHBhciA9IHN0LT5jb2RlY3BhcjsKKyAgICBwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgcGFyLT5jb2RlY190YWcgID0gYXZpb19ybDMyKHBiKTsKKyAgICBwYXItPmNvZGVjX2lkICAgPSBmZl9jb2RlY19nZXRfaWQocnNkX3RhZ3MsIHBhci0+Y29kZWNfdGFnKTsKKyAgICBpZiAoIXBhci0+Y29kZWNfaWQpIHsKKyAgICAgICAgY29uc3QgY2hhciAqdGFnX2J1ZiA9IGF2X2ZvdXJjYzJzdHIocGFyLT5jb2RlY190YWcpOwogICAgICAgICBmb3IgKGk9MDsgaSA8IEZGX0FSUkFZX0VMRU1TKHJzZF91bnN1cHBvcnRlZF90YWdzKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3RhZyA9PSByc2RfdW5zdXBwb3J0ZWRfdGFnc1tpXSkgeworICAgICAgICAgICAgaWYgKHBhci0+Y29kZWNfdGFnID09IHJzZF91bnN1cHBvcnRlZF90YWdzW2ldKSB7CiAgICAgICAgICAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJDb2RlYyB0YWc6ICVzIiwgdGFnX2J1Zik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICAgICAgfQpAQCAtODMsNDMgKzgxLDQ1IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGNvZGVjLT5jaGFubmVscyA9IGF2aW9fcmwzMihwYik7Ci0gICAgaWYgKCFjb2RlYy0+Y2hhbm5lbHMpCisgICAgcGFyLT5jaGFubmVscyA9IGF2aW9fcmwzMihwYik7CisgICAgaWYgKHBhci0+Y2hhbm5lbHMgPD0gMCB8fCBwYXItPmNoYW5uZWxzID4gSU5UX01BWCAvIDM2KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjaGFubmVsczogJWRcbiIsIHBhci0+Y2hhbm5lbHMpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CiAKICAgICBhdmlvX3NraXAocGIsIDQpOyAvLyBCaXQgZGVwdGgKLSAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOwotICAgIGlmICghY29kZWMtPnNhbXBsZV9yYXRlKQorICAgIHBhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOworICAgIGlmICghcGFyLT5zYW1wbGVfcmF0ZSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBhdmlvX3NraXAocGIsIDQpOyAvLyBVbmtub3duCiAKLSAgICBzd2l0Y2ggKGNvZGVjLT5jb2RlY19pZCkgeworICAgIHN3aXRjaCAocGFyLT5jb2RlY19pZCkgewogICAgIGNhc2UgQVZfQ09ERUNfSURfWE1BMjoKLSAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gMjA0ODsKLSAgICAgICAgZmZfYWxsb2NfZXh0cmFkYXRhKGNvZGVjLCAzNCk7Ci0gICAgICAgIGlmICghY29kZWMtPmV4dHJhZGF0YSkKKyAgICAgICAgcGFyLT5ibG9ja19hbGlnbiA9IDIwNDg7CisgICAgICAgIGZmX2FsbG9jX2V4dHJhZGF0YShwYXIsIDM0KTsKKyAgICAgICAgaWYgKCFwYXItPmV4dHJhZGF0YSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIG1lbXNldChjb2RlYy0+ZXh0cmFkYXRhLCAwLCAzNCk7CisgICAgICAgIG1lbXNldChwYXItPmV4dHJhZGF0YSwgMCwgMzQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1BTWDoKLSAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gMTYgKiBjb2RlYy0+Y2hhbm5lbHM7Ci0gICAgICAgIGlmIChwYi0+c2Vla2FibGUpCi0gICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oY29kZWMsIGF2aW9fc2l6ZShwYikgLSBzdGFydCk7CisgICAgICAgIHBhci0+YmxvY2tfYWxpZ24gPSAxNiAqIHBhci0+Y2hhbm5lbHM7CisgICAgICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkKKyAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbjIocGFyLCBhdmlvX3NpemUocGIpIC0gc3RhcnQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0lNQV9SQUQ6Ci0gICAgICAgIGNvZGVjLT5ibG9ja19hbGlnbiA9IDIwICogY29kZWMtPmNoYW5uZWxzOwotICAgICAgICBpZiAocGItPnNlZWthYmxlKQotICAgICAgICAgICAgc3QtPmR1cmF0aW9uID0gYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKGNvZGVjLCBhdmlvX3NpemUocGIpIC0gc3RhcnQpOworICAgICAgICBwYXItPmJsb2NrX2FsaWduID0gMjAgKiBwYXItPmNoYW5uZWxzOworICAgICAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpCisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHBhciwgYXZpb19zaXplKHBiKSAtIHN0YXJ0KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWOgogICAgICAgICBpZiAodmVyc2lvbiA9PSAyKQogICAgICAgICAgICAgc3RhcnQgPSBhdmlvX3JsMzIocGIpOwogCi0gICAgICAgIGNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OwotICAgICAgICBjb2RlYy0+YmxvY2tfYWxpZ24gPSAzNiAqIGNvZGVjLT5jaGFubmVsczsKLSAgICAgICAgaWYgKHBiLT5zZWVrYWJsZSkKLSAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihjb2RlYywgYXZpb19zaXplKHBiKSAtIHN0YXJ0KTsKKyAgICAgICAgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OworICAgICAgICBwYXItPmJsb2NrX2FsaWduID0gMzYgKiBwYXItPmNoYW5uZWxzOworICAgICAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpCisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHBhciwgYXZpb19zaXplKHBiKSAtIHN0YXJ0KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9USFBfTEU6CiAgICAgICAgIC8qIFJTRDNHQURQIGlzIG1vbm8sIHNvIG9ubHkgYWxsb2MgZW5vdWdoIG1lbW9yeQpAQCAtMTI3LDQ5ICsxMjcsNDkgQEAKIAogICAgICAgICBzdGFydCA9IGF2aW9fcmwzMihwYik7CiAKLSAgICAgICAgaWYgKChyZXQgPSBmZl9nZXRfZXh0cmFkYXRhKGNvZGVjLCBzLT5wYiwgMzIpKSA8IDApCisgICAgICAgIGlmICgocmV0ID0gZmZfZ2V0X2V4dHJhZGF0YShzLCBwYXIsIHMtPnBiLCAzMikpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmIChwYi0+c2Vla2FibGUpCi0gICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24oY29kZWMsIGF2aW9fc2l6ZShwYikgLSBzdGFydCk7CisgICAgICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkKKyAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbjIocGFyLCBhdmlvX3NpemUocGIpIC0gc3RhcnQpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX1RIUDoKLSAgICAgICAgY29kZWMtPmJsb2NrX2FsaWduID0gOCAqIGNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgcGFyLT5ibG9ja19hbGlnbiA9IDggKiBwYXItPmNoYW5uZWxzOwogICAgICAgICBhdmlvX3NraXAocy0+cGIsIDB4MUE0IC0gYXZpb190ZWxsKHMtPnBiKSk7CiAKLSAgICAgICAgaWYgKChyZXQgPSBmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAzMiAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMpKSA8IDApCisgICAgICAgIGlmICgocmV0ID0gZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMzIgKiBwYXItPmNoYW5uZWxzKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPmNvZGVjLT5jaGFubmVsczsgaSsrKSB7Ci0gICAgICAgICAgICBhdmlvX3JlYWQocy0+cGIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMzIgKiBpLCAzMik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXItPmNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgIGF2aW9fcmVhZChzLT5wYiwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAzMiAqIGksIDMyKTsKICAgICAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgOCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHBiLT5zZWVrYWJsZSkKLSAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IChhdmlvX3NpemUocGIpIC0gc3RhcnQpIC8gKDggKiBzdC0+Y29kZWMtPmNoYW5uZWxzKSAqIDE0OworICAgICAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpCisgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSAoYXZpb19zaXplKHBiKSAtIHN0YXJ0KSAvICg4ICogcGFyLT5jaGFubmVscykgKiAxNDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU6CiAgICAgICAgIGlmICh2ZXJzaW9uICE9IDQpCiAgICAgICAgICAgICBzdGFydCA9IGF2aW9fcmwzMihwYik7CiAKLSAgICAgICAgaWYgKHBiLT5zZWVrYWJsZSkKLSAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IChhdmlvX3NpemUocGIpIC0gc3RhcnQpIC8gMiAvIGNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgaWYgKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKQorICAgICAgICAgICAgc3QtPmR1cmF0aW9uID0gKGF2aW9fc2l6ZShwYikgLSBzdGFydCkgLyAyIC8gcGFyLT5jaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgYXZpb19za2lwKHBiLCBzdGFydCAtIGF2aW9fdGVsbChwYikpOwotICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWE1BMikgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1hNQTIpIHsKICAgICAgICAgYXZpb19za2lwKHBiLCBhdmlvX3JiMzIocGIpICsgYXZpb19yYjMyKHBiKSk7CiAgICAgICAgIHN0LT5kdXJhdGlvbiA9IGF2aW9fcmIzMihwYik7CiAgICAgfQogCi0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHBhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcnNkX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgaW50IHJldCwgc2l6ZSA9IDEwMjQ7CiAgICAgaW50NjRfdCBwb3M7CiAKQEAgLTE3NywyMCArMTc3LDIwIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKIAogICAgIHBvcyA9IGF2aW9fdGVsbChzLT5wYik7Ci0gICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfUkFEIHx8Ci0gICAgICAgIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9QU1ggICAgIHx8Ci0gICAgICAgIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfV0FWIHx8Ci0gICAgICAgIGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YTUEyKSB7Ci0gICAgICAgIHJldCA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgY29kZWMtPmJsb2NrX2FsaWduKTsKLSAgICB9IGVsc2UgaWYgKGNvZGVjLT5jb2RlY190YWcgPT0gTUtUQUcoJ1cnLCdBJywnRCcsJ1AnKSAmJgotICAgICAgICAgICAgICAgY29kZWMtPmNoYW5uZWxzID4gMSkgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9SQUQgfHwKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BRFBDTV9QU1ggICAgIHx8CisgICAgICAgIHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dBViB8fAorICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1hNQTIpIHsKKyAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBwYXItPmJsb2NrX2FsaWduKTsKKyAgICB9IGVsc2UgaWYgKHBhci0+Y29kZWNfdGFnID09IE1LVEFHKCdXJywnQScsJ0QnLCdQJykgJiYKKyAgICAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgPiAxKSB7CiAgICAgICAgIGludCBpLCBjaDsKIAotICAgICAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgY29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICAgICAgcmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIHBhci0+YmxvY2tfYWxpZ24pOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNvZGVjLT5jaGFubmVsczsgY2grKykgeworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgcGFyLT5jaGFubmVsczsgY2grKykgewogICAgICAgICAgICAgICAgIHBrdC0+ZGF0YVtjaCAqIDggKyBpICogMiArIDBdID0gYXZpb19yOChzLT5wYik7CiAgICAgICAgICAgICAgICAgcGt0LT5kYXRhW2NoICogOCArIGkgKiAyICsgMV0gPSBhdmlvX3I4KHMtPnBiKTsKICAgICAgICAgICAgIH0KQEAgLTIwMCw3ICsyMDAsNyBAQAogICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOwogICAgIH0KIAotICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWE1BMiAmJiBwa3QtPnNpemUgPj0gMSkKKyAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YTUEyICYmIHBrdC0+c2l6ZSA+PSAxKQogICAgICAgICBwa3QtPmR1cmF0aW9uID0gKHBrdC0+ZGF0YVswXSA+PiAyKSAqIDUxMjsKIAogICAgIHBrdC0+cG9zID0gcG9zOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnNvZGVjLmMgYi9saWJhdmZvcm1hdC9yc29kZWMuYwppbmRleCA2ZTNlYTBhLi5iMmQ5YTdjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9yc29kZWMuYworKysgYi9saWJhdmZvcm1hdC9yc29kZWMuYwpAQCAtNTksMTMgKzU5LDEzIEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKICAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgICA9IChzaXplICogOCkgLyBicHM7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgICAgPSBpZDsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgICA9IGNvZGVjOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgID0gMTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgPSByYXRlOwotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgICA9IGlkOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgID0gY29kZWM7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgPSAxOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICA9IHJhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAgPSAxOwogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHJhdGUpOwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9yc29lbmMuYyBiL2xpYmF2Zm9ybWF0L3Jzb2VuYy5jCmluZGV4IDZkYTk1OTQuLmUzNGUyYzYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Jzb2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3Jzb2VuYy5jCkBAIC0yOCwzNiArMjgsMzYgQEAKIHN0YXRpYyBpbnQgcnNvX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgQVZJT0NvbnRleHQgICpwYiAgPSBzLT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogCi0gICAgaWYgKCFlbmMtPmNvZGVjX3RhZykKKyAgICBpZiAoIXBhci0+Y29kZWNfdGFnKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgIGlmIChlbmMtPmNoYW5uZWxzICE9IDEpIHsKKyAgICBpZiAocGFyLT5jaGFubmVscyAhPSAxKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJSU08gb25seSBzdXBwb3J0cyBtb25vXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKCFzLT5wYi0+c2Vla2FibGUpIHsKKyAgICBpZiAoIShzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIm11eGVyIGRvZXMgbm90IHN1cHBvcnQgbm9uIHNlZWthYmxlIG91dHB1dFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAogICAgIC8qIFhYWDogZmluZCBsZWdhbCBzYW1wbGUgcmF0ZXMgKGlmIGFueSkgKi8KLSAgICBpZiAoZW5jLT5zYW1wbGVfcmF0ZSA+PSAxdTw8MTYpIHsKKyAgICBpZiAocGFyLT5zYW1wbGVfcmF0ZSA+PSAxdTw8MTYpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlNhbXBsZSByYXRlIG11c3QgYmUgPCA2NTUzNlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkFEUENNIGluIFJTTyBub3QgaW1wbGVtZW50ZWRcbiIpOworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XQVYpIHsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIkFEUENNIGluIFJTTyIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgfQogCiAgICAgLyogZm9ybWF0IGhlYWRlciAqLwotICAgIGF2aW9fd2IxNihwYiwgZW5jLT5jb2RlY190YWcpOyAgIC8qIGNvZGVjIElEICovCisgICAgYXZpb193YjE2KHBiLCBwYXItPmNvZGVjX3RhZyk7ICAgLyogY29kZWMgSUQgKi8KICAgICBhdmlvX3diMTYocGIsIDApOyAgICAgICAgICAgICAgICAvKiBkYXRhIHNpemUsIHdpbGwgYmUgd3JpdHRlbiBhdCBFT0YgKi8KLSAgICBhdmlvX3diMTYocGIsIGVuYy0+c2FtcGxlX3JhdGUpOworICAgIGF2aW9fd2IxNihwYiwgcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgYXZpb193YjE2KHBiLCAweDAwMDApOyAgICAgICAgICAgLyogcGxheSBtb2RlID8gKDB4MDAwMCA9IGRvbid0IGxvb3ApICovCiAKICAgICBhdmlvX2ZsdXNoKHBiKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0bXBjcnlwdC5jIGIvbGliYXZmb3JtYXQvcnRtcGNyeXB0LmMKaW5kZXggODExYzc0Yy4uYzQxYWU0MyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRtcGNyeXB0LmMKKysrIGIvbGliYXZmb3JtYXQvcnRtcGNyeXB0LmMKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgIC8qIG9wZW4gdGhlIHRjcCBvciBmZnJ0bXBodHRwIGNvbm5lY3Rpb24gKi8KICAgICBpZiAoKHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZydC0+c3RyZWFtLCB1cmwsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByb3RvY29sX3doaXRlbGlzdCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpKSA8IDApIHsKICAgICAgICAgcnRtcGVfY2xvc2UoaCk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMzI1LDcgKzMyNSw3IEBACiAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi1VUkxQcm90b2NvbCBmZl9mZnJ0bXBjcnlwdF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX2ZmcnRtcGNyeXB0X3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgPSAiZmZydG1wY3J5cHQiLAogICAgIC51cmxfb3BlbiAgICAgICAgPSBydG1wZV9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICAgPSBydG1wZV9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRtcGRoLmMgYi9saWJhdmZvcm1hdC9ydG1wZGguYwppbmRleCA0MmFkNzJjLi44ZWIwODgyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydG1wZGguYworKysgYi9saWJhdmZvcm1hdC9ydG1wZGguYwpAQCAtMjYsMTAgKzI2LDE4IEBACiAgKiBSVE1QIERpZmZpZS1IZWxsbWFubiB1dGlsaXRpZXMKICAqLwogCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJydG1wZGguaCIKKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Vycm9yLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9yYW5kb21fc2VlZC5oIgogCisjaW5jbHVkZSAicnRtcGRoLmgiCisKICNkZWZpbmUgUDEwMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgIkZGRkZGRkZGRkZGRkZGRkZDOTBGREFBMjIxNjhDMjM0QzRDNjYyOEI4MERDMUNEMSIgXAogICAgICIyOTAyNEUwODhBNjdDQzc0MDIwQkJFQTYzQjEzOUIyMjUxNEEwODc5OEUzNDA0REQiIFwKQEAgLTQ2LDcgKzU0LDYgQEAKICAgICAiRjcxQzM1RkRBRDQ0Q0ZEMkQ3NEY5MjA4QkUyNThGRjMyNDk0MzMyOEY2NzMyOUMwIiBcCiAgICAgIkZGRkZGRkZGRkZGRkZGRkYiCiAKLSNpZiBDT05GSUdfR01QIHx8IENPTkZJR19HQ1JZUFQKICNpZiBDT05GSUdfR01QCiAjZGVmaW5lIGJuX25ldyhibikgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTg1LDcgKzkyLDYgQEAKICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICByZXQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCi0jZGVmaW5lIGJuX21vZGV4cChibiwgeSwgcSwgcCkgICAgICBtcHpfcG93bShibiwgeSwgcSwgcCkKICNkZWZpbmUgYm5fcmFuZG9tKGJuLCBudW1fYml0cykgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaW50IGJpdHMgPSBudW1fYml0czsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTk2LDYgKzEwMiwxMSBAQAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBtcHpfZmRpdl9yXzJleHAoYm4sIGJuLCBudW1fYml0cyk7ICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCitzdGF0aWMgaW50IGJuX21vZGV4cChGRkJpZ051bSBibiwgRkZCaWdOdW0geSwgRkZCaWdOdW0gcSwgRkZCaWdOdW0gcCkKK3sKKyAgICBtcHpfcG93bShibiwgeSwgcSwgcCk7CisgICAgcmV0dXJuIDA7Cit9CiAjZWxpZiBDT05GSUdfR0NSWVBUCiAjZGVmaW5lIGJuX25ldyhibikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTExNywxMyArMTI4LDQyIEBACiAjZGVmaW5lIGJuX2JuMmJpbihibiwgYnVmLCBsZW4pICAgICBnY3J5X21waV9wcmludChHQ1JZTVBJX0ZNVF9VU0csIGJ1ZiwgbGVuLCBOVUxMLCBibikKICNkZWZpbmUgYm5fYmluMmJuKGJuLCBidWYsIGxlbikgICAgIGdjcnlfbXBpX3NjYW4oJmJuLCBHQ1JZTVBJX0ZNVF9VU0csIGJ1ZiwgbGVuLCBOVUxMKQogI2RlZmluZSBibl9oZXgyYm4oYm4sIGJ1ZiwgcmV0KSAgICAgcmV0ID0gKGdjcnlfbXBpX3NjYW4oJmJuLCBHQ1JZTVBJX0ZNVF9IRVgsIGJ1ZiwgMCwgMCkgPT0gMCkKLSNkZWZpbmUgYm5fbW9kZXhwKGJuLCB5LCBxLCBwKSAgICAgIGdjcnlfbXBpX3Bvd20oYm4sIHksIHEsIHApCiAjZGVmaW5lIGJuX3JhbmRvbShibiwgbnVtX2JpdHMpICAgICBnY3J5X21waV9yYW5kb21pemUoYm4sIG51bV9iaXRzLCBHQ1JZX1dFQUtfUkFORE9NKQorc3RhdGljIGludCBibl9tb2RleHAoRkZCaWdOdW0gYm4sIEZGQmlnTnVtIHksIEZGQmlnTnVtIHEsIEZGQmlnTnVtIHApCit7CisgICAgZ2NyeV9tcGlfcG93bShibiwgeSwgcSwgcCk7CisgICAgcmV0dXJuIDA7Cit9CisjZWxpZiBDT05GSUdfT1BFTlNTTAorI2RlZmluZSBibl9uZXcoYm4pICAgICAgICAgICAgICAgICAgYm4gPSBCTl9uZXcoKQorI2RlZmluZSBibl9mcmVlKGJuKSAgICAgICAgICAgICAgICAgQk5fZnJlZShibikKKyNkZWZpbmUgYm5fc2V0X3dvcmQoYm4sIHcpICAgICAgICAgIEJOX3NldF93b3JkKGJuLCB3KQorI2RlZmluZSBibl9jbXAoYSwgYikgICAgICAgICAgICAgICAgQk5fY21wKGEsIGIpCisjZGVmaW5lIGJuX2NvcHkodG8sIGZyb20pICAgICAgICAgICBCTl9jb3B5KHRvLCBmcm9tKQorI2RlZmluZSBibl9zdWJfd29yZChibiwgdykgICAgICAgICAgQk5fc3ViX3dvcmQoYm4sIHcpCisjZGVmaW5lIGJuX2NtcF8xKGJuKSAgICAgICAgICAgICAgICBCTl9jbXAoYm4sIEJOX3ZhbHVlX29uZSgpKQorI2RlZmluZSBibl9udW1fYnl0ZXMoYm4pICAgICAgICAgICAgQk5fbnVtX2J5dGVzKGJuKQorI2RlZmluZSBibl9ibjJiaW4oYm4sIGJ1ZiwgbGVuKSAgICAgQk5fYm4yYmluKGJuLCBidWYpCisjZGVmaW5lIGJuX2JpbjJibihibiwgYnVmLCBsZW4pICAgICBibiA9IEJOX2JpbjJibihidWYsIGxlbiwgMCkKKyNkZWZpbmUgYm5faGV4MmJuKGJuLCBidWYsIHJldCkgICAgIHJldCA9IEJOX2hleDJibigmYm4sIGJ1ZikKKyNkZWZpbmUgYm5fcmFuZG9tKGJuLCBudW1fYml0cykgICAgIEJOX3JhbmQoYm4sIG51bV9iaXRzLCAwLCAwKQorc3RhdGljIGludCBibl9tb2RleHAoRkZCaWdOdW0gYm4sIEZGQmlnTnVtIHksIEZGQmlnTnVtIHEsIEZGQmlnTnVtIHApCit7CisgICAgQk5fQ1RYICpjdHggPSBCTl9DVFhfbmV3KCk7CisgICAgaWYgKCFjdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaWYgKCFCTl9tb2RfZXhwKGJuLCB5LCBxLCBwLCBjdHgpKSB7CisgICAgICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIEJOX0NUWF9mcmVlKGN0eCk7CisgICAgcmV0dXJuIDA7Cit9CiAjZW5kaWYKIAogI2RlZmluZSBNQVhfQllURVMgMTgwMDAKIAotI2RlZmluZSBkaF9uZXcoKSAgICAgICAgICAgICAgICAgICAgYXZfbWFsbG9jKHNpemVvZihGRl9ESCkpCisjZGVmaW5lIGRoX25ldygpICAgICAgICAgICAgICAgICAgICBhdl9tYWxsb2N6KHNpemVvZihGRl9ESCkpCiAKIHN0YXRpYyBGRkJpZ051bSBkaF9nZW5lcmF0ZV9rZXkoRkZfREggKmRoKQogewpAQCAtMTQ0LDcgKzE4NCw4IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGJuX21vZGV4cChkaC0+cHViX2tleSwgZGgtPmcsIGRoLT5wcml2X2tleSwgZGgtPnApOworICAgIGlmIChibl9tb2RleHAoZGgtPnB1Yl9rZXksIGRoLT5nLCBkaC0+cHJpdl9rZXksIGRoLT5wKSA8IDApCisgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgcmV0dXJuIGRoLT5wdWJfa2V5OwogfQpAQCAtMTUzLDEyICsxOTQsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2VjcmV0X2tleV9sZW4sIHVpbnQ4X3QgKnNlY3JldF9rZXkpCiB7CiAgICAgRkZCaWdOdW0gazsKKyAgICBpbnQgcmV0OwogCiAgICAgYm5fbmV3KGspOwogICAgIGlmICghaykKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgYm5fbW9kZXhwKGssIHB1Yl9rZXlfYm4sIGRoLT5wcml2X2tleSwgZGgtPnApOworICAgIGlmICgocmV0ID0gYm5fbW9kZXhwKGssIHB1Yl9rZXlfYm4sIGRoLT5wcml2X2tleSwgZGgtPnApKSA8IDApIHsKKyAgICAgICAgYm5fZnJlZShrKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CiAgICAgYm5fYm4yYmluKGssIHNlY3JldF9rZXksIHNlY3JldF9rZXlfbGVuKTsKICAgICBibl9mcmVlKGspOwogCkBAIC0xNzYsNDggKzIyMSw2IEBACiAgICAgYm5fZnJlZShkaC0+cHJpdl9rZXkpOwogICAgIGF2X2ZyZWUoZGgpOwogfQotI2VsaWYgQ09ORklHX09QRU5TU0wKLSNkZWZpbmUgYm5fbmV3KGJuKSAgICAgICAgICAgICAgICAgIGJuID0gQk5fbmV3KCkKLSNkZWZpbmUgYm5fZnJlZShibikgICAgICAgICAgICAgICAgIEJOX2ZyZWUoYm4pCi0jZGVmaW5lIGJuX3NldF93b3JkKGJuLCB3KSAgICAgICAgICBCTl9zZXRfd29yZChibiwgdykKLSNkZWZpbmUgYm5fY21wKGEsIGIpICAgICAgICAgICAgICAgIEJOX2NtcChhLCBiKQotI2RlZmluZSBibl9jb3B5KHRvLCBmcm9tKSAgICAgICAgICAgQk5fY29weSh0bywgZnJvbSkKLSNkZWZpbmUgYm5fc3ViX3dvcmQoYm4sIHcpICAgICAgICAgIEJOX3N1Yl93b3JkKGJuLCB3KQotI2RlZmluZSBibl9jbXBfMShibikgICAgICAgICAgICAgICAgQk5fY21wKGJuLCBCTl92YWx1ZV9vbmUoKSkKLSNkZWZpbmUgYm5fbnVtX2J5dGVzKGJuKSAgICAgICAgICAgIEJOX251bV9ieXRlcyhibikKLSNkZWZpbmUgYm5fYm4yYmluKGJuLCBidWYsIGxlbikgICAgIEJOX2JuMmJpbihibiwgYnVmKQotI2RlZmluZSBibl9iaW4yYm4oYm4sIGJ1ZiwgbGVuKSAgICAgYm4gPSBCTl9iaW4yYm4oYnVmLCBsZW4sIDApCi0jZGVmaW5lIGJuX2hleDJibihibiwgYnVmLCByZXQpICAgICByZXQgPSBCTl9oZXgyYm4oJmJuLCBidWYpCi0jZGVmaW5lIGJuX21vZGV4cChibiwgeSwgcSwgcCkgICAgICAgICAgICAgICBcCi0gICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJOX0NUWCAqY3R4ID0gQk5fQ1RYX25ldygpOyAgICAgICAgICBcCi0gICAgICAgIGlmICghY3R4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOyAgICAgICAgICBcCi0gICAgICAgIGlmICghQk5fbW9kX2V4cChibiwgeSwgcSwgcCwgY3R4KSkgeyBcCi0gICAgICAgICAgICBCTl9DVFhfZnJlZShjdHgpOyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOyAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEJOX0NUWF9mcmVlKGN0eCk7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBkaF9uZXcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREhfbmV3KCkKLSNkZWZpbmUgZGhfZ2VuZXJhdGVfa2V5KGRoKSAgICAgICAgICAgICAgICAgICAgIERIX2dlbmVyYXRlX2tleShkaCkKLQotc3RhdGljIGludCBkaF9jb21wdXRlX2tleShGRl9ESCAqZGgsIEZGQmlnTnVtIHB1Yl9rZXlfYm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlY3JldF9rZXlfbGVuLCB1aW50OF90ICpzZWNyZXRfa2V5KQotewotICAgIGlmIChzZWNyZXRfa2V5X2xlbiA8IERIX3NpemUoZGgpKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIHJldHVybiBESF9jb21wdXRlX2tleShzZWNyZXRfa2V5LCBwdWJfa2V5X2JuLCBkaCk7Ci19Ci0KLXZvaWQgZmZfZGhfZnJlZShGRl9ESCAqZGgpCi17Ci0gICAgaWYgKCFkaCkKLSAgICAgICAgcmV0dXJuOwotICAgIERIX2ZyZWUoZGgpOwotfQotI2VuZGlmCiAKIHN0YXRpYyBpbnQgZGhfaXNfdmFsaWRfcHVibGljX2tleShGRkJpZ051bSB5LCBGRkJpZ051bSBwLCBGRkJpZ051bSBxKQogewpAQCAtMjQ2LDggKzI0OSwxMCBAQAogICAgICAqIHJhbmRvbSBkYXRhLgogICAgICAqLwogICAgIC8qIHkgbXVzdCBmdWxmaWxsIHlecSBtb2QgcCA9IDEgKi8KLSAgICBibl9tb2RleHAoYm4sIHksIHEsIHApOworICAgIGlmICgocmV0ID0gYm5fbW9kZXhwKGJuLCB5LCBxLCBwKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CiAKKyAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgaWYgKGJuX2NtcF8xKGJuKSkKICAgICAgICAgZ290byBmYWlsOwogCkBAIC0zNjEsMTQyICszNjYsMyBAQAogCiAgICAgcmV0dXJuIHJldDsKIH0KLQotI2lmZGVmIFRFU1QKLXN0YXRpYyBpbnQgdGVzdF9yYW5kb21fc2hhcmVkX3NlY3JldCh2b2lkKQotewotICAgIEZGX0RIICpwZWVyMSA9IE5VTEwsICpwZWVyMiA9IE5VTEw7Ci0gICAgaW50IHJldDsKLSAgICB1aW50OF90IHB1YmtleTFbMTI4XSwgcHVia2V5MlsxMjhdOwotICAgIHVpbnQ4X3Qgc2hhcmVka2V5MVsxMjhdLCBzaGFyZWRrZXkyWzEyOF07Ci0KLSAgICBwZWVyMSA9IGZmX2RoX2luaXQoMTAyNCk7Ci0gICAgcGVlcjIgPSBmZl9kaF9pbml0KDEwMjQpOwotICAgIGlmICghcGVlcjEgfHwgIXBlZXIyKSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBmYWlsOwotICAgIH0KLSAgICBpZiAoKHJldCA9IGZmX2RoX2dlbmVyYXRlX3B1YmxpY19rZXkocGVlcjEpKSA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBpZiAoKHJldCA9IGZmX2RoX2dlbmVyYXRlX3B1YmxpY19rZXkocGVlcjIpKSA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBpZiAoKHJldCA9IGZmX2RoX3dyaXRlX3B1YmxpY19rZXkocGVlcjEsIHB1YmtleTEsIHNpemVvZihwdWJrZXkxKSkpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotICAgIGlmICgocmV0ID0gZmZfZGhfd3JpdGVfcHVibGljX2tleShwZWVyMiwgcHVia2V5Miwgc2l6ZW9mKHB1YmtleTIpKSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgaWYgKChyZXQgPSBmZl9kaF9jb21wdXRlX3NoYXJlZF9zZWNyZXRfa2V5KHBlZXIxLCBwdWJrZXkyLCBzaXplb2YocHVia2V5MiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZGtleTEsIHNpemVvZihzaGFyZWRrZXkxKSkpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotICAgIGlmICgocmV0ID0gZmZfZGhfY29tcHV0ZV9zaGFyZWRfc2VjcmV0X2tleShwZWVyMiwgcHVia2V5MSwgc2l6ZW9mKHB1YmtleTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRrZXkyLCBzaXplb2Yoc2hhcmVka2V5MikpKSA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBpZiAobWVtY21wKHNoYXJlZGtleTEsIHNoYXJlZGtleTIsIHNpemVvZihzaGFyZWRrZXkxKSkpIHsKLSAgICAgICAgcHJpbnRmKCJNaXNtYXRjaGVkIGdlbmVyYXRlZCBzaGFyZWQga2V5XG4iKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIkdlbmVyYXRlZCBzaGFyZWQga2V5IG9rXG4iKTsKLSAgICB9Ci1mYWlsOgotICAgIGZmX2RoX2ZyZWUocGVlcjEpOwotICAgIGZmX2RoX2ZyZWUocGVlcjIpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpwcml2YXRlX2tleSA9Ci0gICAgIjk3NkMxOEZDQURDMjU1QjQ1NjU2NEY3NEYzRUVEQTU5RDI4QUY2Qjc0NEQ3NDNGMjM1N0JGRDI0MDQ3OTdFRjg5NkVGMUEiCi0gICAgIjdDMUNCRUFBQTNBQjYwQUYzMTkyRDE4OUNGRjNGOTkxQzlDQkJGRDc4MTE5RkNBMjE4MTM4NEI5NDAxMTk0M0I2RDZGMjgiCi0gICAgIjlFMUI3MDhFMkQxQTBDNzc3MTE2OTI5M0YwM0RBMjdFNTYxRjE1RjE2RjBBQzlCQzg1OEM3N0E4MEZBOThGRDA4OEEyMzIiCi0gICAgIjE5RDA4QkU2RjE2NURFMEIwMjAzNEIxODcwNTgyOUZBRDBBQ0IyNkE1Qjc1RUYiOwotc3RhdGljIGNvbnN0IGNoYXIgKnB1YmxpY19rZXkgPQotICAgICJGMjcyRUNGODM2MjI1N0M1RDJDM0NDMjIyOUNGOUMwQTAzMjI1QkMxMDlCMURCQzc2QTY4QzM5NEYyNTZBQ0EzRUY1RjY0IgotICAgICJGQzI3MEMyNjM4MkJGMzE1QzE5RTk3QTc2MTA0QTcxNkZDOTk4QTY1MUU4NjEwQTNBRTZDRjY1RDhGQUU1RDNGMzJFRUEwIgotICAgICIwQjMyQ0I5NjA5QjQ5NDExNkE4MjVENzE0MkQxN0I4OEUzRDIwRUREOTg3NDNERTI5Q0YzN0EyM0E5RjZBNThCOTYwNTkxIgotICAgICIzMTU3RDU5NjVGQ0I0NkREQTczQTFGMDhERDg5N0JBRTg4REZFNkZDOTM3Q0JBIjsKLXN0YXRpYyBjb25zdCB1aW50OF90IHB1YmxpY19rZXlfYmluW10gPSB7Ci0gICAgMHhmMiwgMHg3MiwgMHhlYywgMHhmOCwgMHgzNiwgMHgyMiwgMHg1NywgMHhjNSwgMHhkMiwgMHhjMywgMHhjYywgMHgyMiwKLSAgICAweDI5LCAweGNmLCAweDljLCAweDBhLCAweDAzLCAweDIyLCAweDViLCAweGMxLCAweDA5LCAweGIxLCAweGRiLCAweGM3LAotICAgIDB4NmEsIDB4NjgsIDB4YzMsIDB4OTQsIDB4ZjIsIDB4NTYsIDB4YWMsIDB4YTMsIDB4ZWYsIDB4NWYsIDB4NjQsIDB4ZmMsCi0gICAgMHgyNywgMHgwYywgMHgyNiwgMHgzOCwgMHgyYiwgMHhmMywgMHgxNSwgMHhjMSwgMHg5ZSwgMHg5NywgMHhhNywgMHg2MSwKLSAgICAweDA0LCAweGE3LCAweDE2LCAweGZjLCAweDk5LCAweDhhLCAweDY1LCAweDFlLCAweDg2LCAweDEwLCAweGEzLCAweGFlLAotICAgIDB4NmMsIDB4ZjYsIDB4NWQsIDB4OGYsIDB4YWUsIDB4NWQsIDB4M2YsIDB4MzIsIDB4ZWUsIDB4YTAsIDB4MGIsIDB4MzIsCi0gICAgMHhjYiwgMHg5NiwgMHgwOSwgMHhiNCwgMHg5NCwgMHgxMSwgMHg2YSwgMHg4MiwgMHg1ZCwgMHg3MSwgMHg0MiwgMHhkMSwKLSAgICAweDdiLCAweDg4LCAweGUzLCAweGQyLCAweDBlLCAweGRkLCAweDk4LCAweDc0LCAweDNkLCAweGUyLCAweDljLCAweGYzLAotICAgIDB4N2EsIDB4MjMsIDB4YTksIDB4ZjYsIDB4YTUsIDB4OGIsIDB4OTYsIDB4MDUsIDB4OTEsIDB4MzEsIDB4NTcsIDB4ZDUsCi0gICAgMHg5NiwgMHg1ZiwgMHhjYiwgMHg0NiwgMHhkZCwgMHhhNywgMHgzYSwgMHgxZiwgMHgwOCwgMHhkZCwgMHg4OSwgMHg3YiwKLSAgICAweGFlLCAweDg4LCAweGRmLCAweGU2LCAweGZjLCAweDkzLCAweDdjLCAweGJhCi19Owotc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGVlcl9wdWJsaWNfa2V5W10gPSB7Ci0gICAgMHg1OCwgMHg2NiwgMHgwNSwgMHg0OSwgMHg5NCwgMHgyMywgMHgyYiwgMHg2NiwgMHg1MiwgMHgxMywgMHhmZiwgMHg0NiwKLSAgICAweGYyLCAweGIzLCAweDc5LCAweGE5LCAweGVlLCAweGFlLCAweDFhLCAweDEzLCAweGYwLCAweDcxLCAweDUyLCAweGZiLAotICAgIDB4OTMsIDB4NGUsIDB4ZWUsIDB4OTcsIDB4MDUsIDB4NzMsIDB4NTAsIDB4N2QsIDB4YWYsIDB4MDIsIDB4MDcsIDB4NzIsCi0gICAgMHhhYywgMHhkYywgMHhhMywgMHg5NSwgMHg3OCwgMHhlZSwgMHg5YSwgMHgxOSwgMHg3MSwgMHg3ZSwgMHg5OSwgMHg5ZiwKLSAgICAweDJhLCAweGQ0LCAweGIzLCAweGUyLCAweDBjLCAweDFkLCAweDFhLCAweDc4LCAweDRjLCAweGRlLCAweGYxLCAweGFkLAotICAgIDB4YjQsIDB4NjAsIDB4YTgsIDB4NTEsIDB4YWMsIDB4NzEsIDB4ZWMsIDB4ODYsIDB4NzAsIDB4YTIsIDB4NjMsIDB4MzYsCi0gICAgMHg5MiwgMHg3YywgMHhlMywgMHg4NywgMHhlZSwgMHhlNCwgMHhmMSwgMHg2MiwgMHgyNCwgMHg3NCwgMHhiNCwgMHgwNCwKLSAgICAweGZhLCAweDVjLCAweGRmLCAweGJhLCAweGZhLCAweGEzLCAweGMyLCAweGJiLCAweDYyLCAweDI3LCAweGQwLCAweGY0LAotICAgIDB4ZTQsIDB4NDMsIDB4ZGEsIDB4OGEsIDB4ODgsIDB4NjksIDB4NjAsIDB4ZTIsIDB4ZGIsIDB4NzUsIDB4MmEsIDB4OTgsCi0gICAgMHg5ZCwgMHhiNSwgMHg1MCwgMHhlMywgMHg5OSwgMHhkYSwgMHhlMCwgMHhhNiwgMHgxNCwgMHhjOSwgMHg4MCwgMHgxMiwKLSAgICAweGY5LCAweDNjLCAweGFjLCAweDA2LCAweDAyLCAweDdhLCAweGRlLCAweDc0Ci19Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2hhcmVkX3NlY3JldFtdID0gewotICAgIDB4YjIsIDB4ZWIsIDB4Y2IsIDB4NzEsIDB4ZjMsIDB4NjEsIDB4ZmIsIDB4NWIsIDB4NGUsIDB4NWMsIDB4NGMsIDB4Y2YsCi0gICAgMHg1YywgMHgwOCwgMHg1ZiwgMHg5NiwgMHgyNiwgMHg3NywgMHgxZCwgMHgzMSwgMHhmMSwgMHhlMSwgMHhmNywgMHg0YiwKLSAgICAweDkyLCAweGFjLCAweDgyLCAweDJhLCAweDg4LCAweGM3LCAweDgzLCAweGUxLCAweGM3LCAweGYzLCAweGQzLCAweDFhLAotICAgIDB4N2QsIDB4YzgsIDB4MzEsIDB4ZTMsIDB4OTcsIDB4ZTQsIDB4ZWMsIDB4MzEsIDB4MGUsIDB4OGYsIDB4NzMsIDB4MWEsCi0gICAgMHhlNCwgMHhmNiwgMHhkOCwgMHhjOCwgMHg5NCwgMHhmZiwgMHhhMCwgMHgwMywgMHg4NCwgMHgwMywgMHgwZiwgMHhhNSwKLSAgICAweDMwLCAweDVkLCAweDY3LCAweGUwLCAweDdhLCAweDNiLCAweDVmLCAweGVkLCAweDRjLCAweGY1LCAweGJjLCAweDE4LAotICAgIDB4ZWEsIDB4ZDQsIDB4NzcsIDB4YTksIDB4MDcsIDB4YjMsIDB4NTQsIDB4MGIsIDB4MDIsIDB4ZDksIDB4YzYsIDB4YjgsCi0gICAgMHg2NiwgMHg1ZSwgMHhlYywgMHhhNCwgMHhjZCwgMHg0NywgMHhlZCwgMHhjOSwgMHgzOCwgMHhjNiwgMHg5MSwgMHgwOCwKLSAgICAweGYzLCAweDg1LCAweDliLCAweDY5LCAweDE2LCAweDc4LCAweDBkLCAweGI3LCAweDc0LCAweDUxLCAweGFhLCAweDViLAotICAgIDB4NGQsIDB4NzQsIDB4ZTQsIDB4MjksIDB4MmUsIDB4OWUsIDB4OGUsIDB4ZjcsIDB4ZTUsIDB4NDIsIDB4ODMsIDB4YjAsCi0gICAgMHg2NSwgMHhiMCwgMHhjZSwgMHhjNiwgMHhiMiwgMHg4ZiwgMHg1YiwgMHhiMAotfTsKLQotc3RhdGljIGludCB0ZXN0X3JlZl9kYXRhKHZvaWQpCi17Ci0gICAgRkZfREggKmRoOwotICAgIGludCByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgdWludDhfdCBwdWJrZXlfdGVzdFsxMjhdOwotICAgIHVpbnQ4X3Qgc2hhcmVka2V5X3Rlc3RbMTI4XTsKLQotICAgIGRoID0gZmZfZGhfaW5pdCgxMDI0KTsKLSAgICBpZiAoIWRoKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgYm5faGV4MmJuKGRoLT5wcml2X2tleSwgcHJpdmF0ZV9rZXksIHJldCk7Ci0gICAgaWYgKCFyZXQpCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBibl9oZXgyYm4oZGgtPnB1Yl9rZXksIHB1YmxpY19rZXksIHJldCk7Ci0gICAgaWYgKCFyZXQpCi0gICAgICAgIGdvdG8gZmFpbDsKLSAgICBpZiAoKHJldCA9IGZmX2RoX3dyaXRlX3B1YmxpY19rZXkoZGgsIHB1YmtleV90ZXN0LCBzaXplb2YocHVia2V5X3Rlc3QpKSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgaWYgKG1lbWNtcChwdWJrZXlfdGVzdCwgcHVibGljX2tleV9iaW4sIHNpemVvZihwdWJrZXlfdGVzdCkpKSB7Ci0gICAgICAgIHByaW50ZigiTWlzbWF0Y2hlZCBnZW5lcmF0ZWQgcHVibGljIGtleVxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgICAgIGdvdG8gZmFpbDsKLSAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIkdlbmVyYXRlZCBwdWJsaWMga2V5IG9rXG4iKTsKLSAgICB9Ci0gICAgaWYgKChyZXQgPSBmZl9kaF9jb21wdXRlX3NoYXJlZF9zZWNyZXRfa2V5KGRoLCBwZWVyX3B1YmxpY19rZXksIHNpemVvZihwZWVyX3B1YmxpY19rZXkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRrZXlfdGVzdCwgc2l6ZW9mKHNoYXJlZGtleV90ZXN0KSkpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOwotICAgIGlmIChtZW1jbXAoc2hhcmVkX3NlY3JldCwgc2hhcmVka2V5X3Rlc3QsIHNpemVvZihzaGFyZWRrZXlfdGVzdCkpKSB7Ci0gICAgICAgIHByaW50ZigiTWlzbWF0Y2hlZCBnZW5lcmF0ZWQgc2hhcmVkIGtleVxuIik7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJHZW5lcmF0ZWQgc2hhcmVkIGtleSBva1xuIik7Ci0gICAgfQotZmFpbDoKLSAgICBmZl9kaF9mcmVlKGRoKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGlmICh0ZXN0X3JhbmRvbV9zaGFyZWRfc2VjcmV0KCkgPCAwKQotICAgICAgICByZXR1cm4gMTsKLSAgICBpZiAodGVzdF9yZWZfZGF0YSgpIDwgMCkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0bXBkaC5oIGIvbGliYXZmb3JtYXQvcnRtcGRoLmgKaW5kZXggOTViMjYyMC4uMTg4YWFkNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRtcGRoLmgKKysrIGIvbGliYXZmb3JtYXQvcnRtcGRoLmgKQEAgLTIyLDEwICsyMiwxMCBAQAogI2lmbmRlZiBBVkZPUk1BVF9SVE1QREhfSAogI2RlZmluZSBBVkZPUk1BVF9SVE1QREhfSAogCi0jaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwogI2luY2x1ZGUgImNvbmZpZy5oIgogCi0jaWYgQ09ORklHX0dNUCB8fCBDT05GSUdfR0NSWVBUCiAjaWYgQ09ORklHX0dNUAogI2luY2x1ZGUgPGdtcC5oPgogCkBAIC0zNCw2ICszNCwxMiBAQAogI2luY2x1ZGUgPGdjcnlwdC5oPgogCiB0eXBlZGVmIGdjcnlfbXBpX3QgRkZCaWdOdW07CisKKyNlbGlmIENPTkZJR19PUEVOU1NMCisjaW5jbHVkZSA8b3BlbnNzbC9ibi5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZGguaD4KKwordHlwZWRlZiBCSUdOVU0gKkZGQmlnTnVtOwogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IEZGX0RIIHsKQEAgLTQ0LDEzICs1MCw2IEBACiAgICAgbG9uZyBsZW5ndGg7CiB9IEZGX0RIOwogCi0jZWxpZiBDT05GSUdfT1BFTlNTTAotI2luY2x1ZGUgPG9wZW5zc2wvYm4uaD4KLSNpbmNsdWRlIDxvcGVuc3NsL2RoLmg+Ci0KLXR5cGVkZWYgQklHTlVNICpGRkJpZ051bTsKLXR5cGVkZWYgREggRkZfREg7Ci0jZW5kaWYKIAogLyoqCiAgKiBJbml0aWFsaXplIGEgRGlmZmllLUhlbGxtYW5uIGNvbnRleHQuCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydG1wZGlnZXN0LmMgYi9saWJhdmZvcm1hdC9ydG1wZGlnZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliMTE3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L3J0bXBkaWdlc3QuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogUlRNUCBuZXR3b3JrIHByb3RvY29sCisgKiBDb3B5cmlnaHQgKGMpIDIwMDkgS29uc3RhbnRpbiBTaGlzaGtvdgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBSVE1QIHByb3RvY29sIGRpZ2VzdAorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9obWFjLmgiCisKKyNpbmNsdWRlICJydG1wLmgiCisKK2ludCBmZl9ydG1wX2NhbGNfZGlnZXN0KGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbiwgaW50IGdhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwgaW50IGtleWxlbiwgdWludDhfdCAqZHN0KQoreworICAgIEFWSE1BQyAqaG1hYzsKKworICAgIGhtYWMgPSBhdl9obWFjX2FsbG9jKEFWX0hNQUNfU0hBMjU2KTsKKyAgICBpZiAoIWhtYWMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdl9obWFjX2luaXQoaG1hYywga2V5LCBrZXlsZW4pOworICAgIGlmIChnYXAgPD0gMCkgeworICAgICAgICBhdl9obWFjX3VwZGF0ZShobWFjLCBzcmMsIGxlbik7CisgICAgfSBlbHNlIHsgLy9za2lwIDMyIGJ5dGVzIHVzZWQgZm9yIHN0b3JpbmcgZGlnZXN0CisgICAgICAgIGF2X2htYWNfdXBkYXRlKGhtYWMsIHNyYywgZ2FwKTsKKyAgICAgICAgYXZfaG1hY191cGRhdGUoaG1hYywgc3JjICsgZ2FwICsgMzIsIGxlbiAtIGdhcCAtIDMyKTsKKyAgICB9CisgICAgYXZfaG1hY19maW5hbChobWFjLCBkc3QsIDMyKTsKKworICAgIGF2X2htYWNfZnJlZShobWFjKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgZmZfcnRtcF9jYWxjX2RpZ2VzdF9wb3MoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgb2ZmLCBpbnQgbW9kX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkX3ZhbCkKK3sKKyAgICBpbnQgaSwgZGlnZXN0X3BvcyA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICBkaWdlc3RfcG9zICs9IGJ1ZltpICsgb2ZmXTsKKyAgICBkaWdlc3RfcG9zID0gZGlnZXN0X3BvcyAlIG1vZF92YWwgKyBhZGRfdmFsOworCisgICAgcmV0dXJuIGRpZ2VzdF9wb3M7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydG1waHR0cC5jIGIvbGliYXZmb3JtYXQvcnRtcGh0dHAuYwppbmRleCA4ZWQ1ZWIxLi5lZjYxNDZjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydG1waHR0cC5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0bXBodHRwLmMKQEAgLTEyOSw3ICsxMjksNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAocnQtPm5iX2J5dGVzX3JlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAvKiBXYWl0IDUwbXMgYmVmb3JlIHJldHJ5aW5nIHRvIHJlYWQgYSBzZXJ2ZXIgcmVwbHkgaW4KLSAgICAgICAgICAgICAgICAgICAgICogb3JkZXIgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgaWRsZSByZXF1ZXRzLiAqLworICAgICAgICAgICAgICAgICAgICAgKiBvcmRlciB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBpZGxlIHJlcXVlc3RzLiAqLwogICAgICAgICAgICAgICAgICAgICBhdl91c2xlZXAoNTAwMDApOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjA4LDcgKzIwOCw3IEBACiAgICAgfQogCiAgICAgLyogYWxsb2MgdGhlIGh0dHAgY29udGV4dCAqLwotICAgIGlmICgocmV0ID0gZmZ1cmxfYWxsb2MoJnJ0LT5zdHJlYW0sIHVybCwgQVZJT19GTEFHX1JFQURfV1JJVEUsIE5VTEwpKSA8IDApCisgICAgaWYgKChyZXQgPSBmZnVybF9hbGxvYygmcnQtPnN0cmVhbSwgdXJsLCBBVklPX0ZMQUdfUkVBRF9XUklURSwgJmgtPmludGVycnVwdF9jYWxsYmFjaykpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCiAgICAgLyogc2V0IG9wdGlvbnMgKi8KQEAgLTIyMCw2ICsyMjAsMTQgQEAKICAgICBhdl9vcHRfc2V0KHJ0LT5zdHJlYW0tPnByaXZfZGF0YSwgIm11bHRpcGxlX3JlcXVlc3RzIiwgIjEiLCAwKTsKICAgICBhdl9vcHRfc2V0X2JpbihydC0+c3RyZWFtLT5wcml2X2RhdGEsICJwb3N0X2RhdGEiLCAiIiwgMSwgMCk7CiAKKyAgICBpZiAoIXJ0LT5zdHJlYW0tPnByb3RvY29sX3doaXRlbGlzdCAmJiBoLT5wcm90b2NvbF93aGl0ZWxpc3QpIHsKKyAgICAgICAgcnQtPnN0cmVhbS0+cHJvdG9jb2xfd2hpdGVsaXN0ID0gYXZfc3RyZHVwKGgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgIGlmICghcnQtPnN0cmVhbS0+cHJvdG9jb2xfd2hpdGVsaXN0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiBvcGVuIHRoZSBodHRwIGNvbnRleHQgKi8KICAgICBpZiAoKHJldCA9IGZmdXJsX2Nvbm5lY3QocnQtPnN0cmVhbSwgTlVMTCkpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwpAQCAtMjY1LDcgKzI3Myw3IEBACiAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi1VUkxQcm90b2NvbCBmZl9mZnJ0bXBodHRwX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfZmZydG1waHR0cF9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAiZmZydG1waHR0cCIsCiAgICAgLnVybF9vcGVuICAgICAgID0gcnRtcF9odHRwX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgID0gcnRtcF9odHRwX3JlYWQsCkBAIC0yNzQsNCArMjgyLDUgQEAKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoUlRNUF9IVFRQQ29udGV4dCksCiAgICAgLmZsYWdzICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKICAgICAucHJpdl9kYXRhX2NsYXNzPSAmZmZydG1waHR0cF9jbGFzcywKKyAgICAuZGVmYXVsdF93aGl0ZWxpc3QgPSAiaHR0cHMsaHR0cCx0Y3AsdGxzIiwKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydG1wcGt0LmMgYi9saWJhdmZvcm1hdC9ydG1wcGt0LmMKaW5kZXggMGQ2OTNjMi4uMWVlYWUxNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRtcHBrdC5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0bXBwa3QuYwpAQCAtMjM1LDYgKzIzNSwxNCBAQAogICAgIGlmIChoZHIgIT0gUlRNUF9QU19UV0VMVkVCWVRFUykKICAgICAgICAgdGltZXN0YW1wICs9IHByZXZfcGt0W2NoYW5uZWxfaWRdLnRpbWVzdGFtcDsKIAorICAgIGlmIChwcmV2X3BrdFtjaGFubmVsX2lkXS5yZWFkICYmIHNpemUgIT0gcHJldl9wa3RbY2hhbm5lbF9pZF0uc2l6ZSkgeworICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiUlRNUCBwYWNrZXQgc2l6ZSBtaXNtYXRjaCAlZCAhPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgcHJldl9wa3RbY2hhbm5lbF9pZF0uc2l6ZSk7CisgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnByZXZfcGt0W2NoYW5uZWxfaWRdKTsKKyAgICAgICAgcHJldl9wa3RbY2hhbm5lbF9pZF0ucmVhZCA9IDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIGlmICghcHJldl9wa3RbY2hhbm5lbF9pZF0ucmVhZCkgewogICAgICAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZShwLCBjaGFubmVsX2lkLCB0eXBlLCB0aW1lc3RhbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpKSA8IDApCkBAIC00MjUsMTA1ICs0MzMsMTUwIEBACiAgICAgcGt0LT5zaXplID0gMDsKIH0KIAotaW50IGZmX2FtZl90YWdfc2l6ZShjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCB1aW50OF90ICpkYXRhX2VuZCkKK3N0YXRpYyBpbnQgYW1mX3RhZ19za2lwKEdldEJ5dGVDb250ZXh0ICpnYikKIHsKLSAgICBjb25zdCB1aW50OF90ICpiYXNlID0gZGF0YTsKICAgICBBTUZEYXRhVHlwZSB0eXBlOwogICAgIHVuc2lnbmVkIG5iICAgPSAtMTsKICAgICBpbnQgcGFyc2Vfa2V5ID0gMTsKIAotICAgIGlmIChkYXRhID49IGRhdGFfZW5kKQorICAgIGlmIChieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPCAxKQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3dpdGNoICgodHlwZSA9ICpkYXRhKyspKSB7Ci0gICAgY2FzZSBBTUZfREFUQV9UWVBFX05VTUJFUjogICAgICByZXR1cm4gOTsKLSAgICBjYXNlIEFNRl9EQVRBX1RZUEVfQk9PTDogICAgICAgIHJldHVybiAyOwotICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9TVFJJTkc6ICAgICAgcmV0dXJuIDMgKyBBVl9SQjE2KGRhdGEpOwotICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9MT05HX1NUUklORzogcmV0dXJuIDUgKyBBVl9SQjMyKGRhdGEpOwotICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9OVUxMOiAgICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBBTUZfREFUQV9UWVBFX0RBVEU6ICAgICAgICByZXR1cm4gMTE7CisKKyAgICB0eXBlID0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworICAgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9OVU1CRVI6CisgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9iZTY0KGdiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX0JPT0w6CisgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX1NUUklORzoKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX0xPTkdfU1RSSU5HOgorICAgICAgICBieXRlc3RyZWFtMl9za2lwKGdiLCBieXRlc3RyZWFtMl9nZXRfYmUzMihnYikpOworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFNRl9EQVRBX1RZUEVfTlVMTDoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX0RBVEU6CisgICAgICAgIGJ5dGVzdHJlYW0yX3NraXAoZ2IsIDEwKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgY2FzZSBBTUZfREFUQV9UWVBFX0FSUkFZOgogICAgICAgICBwYXJzZV9rZXkgPSAwOwogICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9NSVhFREFSUkFZOgotICAgICAgICBuYiA9IGJ5dGVzdHJlYW1fZ2V0X2JlMzIoJmRhdGEpOworICAgICAgICBuYiA9IGJ5dGVzdHJlYW0yX2dldF9iZTMyKGdiKTsKICAgICBjYXNlIEFNRl9EQVRBX1RZUEVfT0JKRUNUOgogICAgICAgICB3aGlsZSAobmItLSA+IDAgfHwgdHlwZSAhPSBBTUZfREFUQV9UWVBFX0FSUkFZKSB7CiAgICAgICAgICAgICBpbnQgdDsKICAgICAgICAgICAgIGlmIChwYXJzZV9rZXkpIHsKLSAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmRhdGEpOworICAgICAgICAgICAgICAgIGludCBzaXplID0gYnl0ZXN0cmVhbTJfZ2V0X2JlMTYoZ2IpOwogICAgICAgICAgICAgICAgIGlmICghc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IGRhdGFfZW5kIC0gZGF0YSkKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICBkYXRhICs9IHNpemU7CisgICAgICAgICAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgc2l6ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0ID0gZmZfYW1mX3RhZ19zaXplKGRhdGEsIGRhdGFfZW5kKTsKLSAgICAgICAgICAgIGlmICh0IDwgMCB8fCB0ID49IGRhdGFfZW5kIC0gZGF0YSkKKyAgICAgICAgICAgIHQgPSBhbWZfdGFnX3NraXAoZ2IpOworICAgICAgICAgICAgaWYgKHQgPCAwIHx8IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8PSAwKQogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGRhdGEgKz0gdDsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZGF0YSAtIGJhc2U7Ci0gICAgY2FzZSBBTUZfREFUQV9UWVBFX09CSkVDVF9FTkQ6ICByZXR1cm4gMTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBBTUZfREFUQV9UWVBFX09CSkVDVF9FTkQ6ICByZXR1cm4gMDsKICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiB9CiAKLWludCBmZl9hbWZfZ2V0X2ZpZWxkX3ZhbHVlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGFfZW5kLAoraW50IGZmX2FtZl90YWdfc2l6ZShjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCB1aW50OF90ICpkYXRhX2VuZCkKK3sKKyAgICBHZXRCeXRlQ29udGV4dCBnYjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKGRhdGEgPj0gZGF0YV9lbmQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBkYXRhLCBkYXRhX2VuZCAtIGRhdGEpOworCisgICAgcmV0ID0gYW1mX3RhZ19za2lwKCZnYik7CisgICAgaWYgKHJldCA8IDAgfHwgYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoJmdiKSA8PSAwKQorICAgICAgICByZXR1cm4gLTE7CisgICAgYXZfYXNzZXJ0MChieXRlc3RyZWFtMl90ZWxsKCZnYikgPj0gMCAmJiBieXRlc3RyZWFtMl90ZWxsKCZnYikgPD0gZGF0YV9lbmQgLSBkYXRhKTsKKyAgICByZXR1cm4gYnl0ZXN0cmVhbTJfdGVsbCgmZ2IpOworfQorCitzdGF0aWMgaW50IGFtZl9nZXRfZmllbGRfdmFsdWUyKEdldEJ5dGVDb250ZXh0ICpnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm5hbWUsIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zaXplKQogewogICAgIGludCBuYW1lbGVuID0gc3RybGVuKG5hbWUpOwogICAgIGludCBsZW47CiAKLSAgICB3aGlsZSAoKmRhdGEgIT0gQU1GX0RBVEFfVFlQRV9PQkpFQ1QgJiYgZGF0YSA8IGRhdGFfZW5kKSB7Ci0gICAgICAgIGxlbiA9IGZmX2FtZl90YWdfc2l6ZShkYXRhLCBkYXRhX2VuZCk7Ci0gICAgICAgIGlmIChsZW4gPCAwKQotICAgICAgICAgICAgbGVuID0gZGF0YV9lbmQgLSBkYXRhOwotICAgICAgICBkYXRhICs9IGxlbjsKKyAgICB3aGlsZSAoYnl0ZXN0cmVhbTJfcGVla19ieXRlKGdiKSAhPSBBTUZfREFUQV9UWVBFX09CSkVDVCAmJiBieXRlc3RyZWFtMl9nZXRfYnl0ZXNfbGVmdChnYikgPiAwKSB7CisgICAgICAgIGludCByZXQgPSBhbWZfdGFnX3NraXAoZ2IpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKGRhdGFfZW5kIC0gZGF0YSA8IDMpCisgICAgaWYgKGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8IDMpCiAgICAgICAgIHJldHVybiAtMTsKLSAgICBkYXRhKys7CisgICAgYnl0ZXN0cmVhbTJfZ2V0X2J5dGUoZ2IpOworCiAgICAgZm9yICg7OykgewotICAgICAgICBpbnQgc2l6ZSA9IGJ5dGVzdHJlYW1fZ2V0X2JlMTYoJmRhdGEpOworICAgICAgICBpbnQgc2l6ZSA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiKTsKICAgICAgICAgaWYgKCFzaXplKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IGRhdGFfZW5kIC0gZGF0YSkKKyAgICAgICAgaWYgKHNpemUgPCAwIHx8IHNpemUgPj0gYnl0ZXN0cmVhbTJfZ2V0X2J5dGVzX2xlZnQoZ2IpKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBkYXRhICs9IHNpemU7Ci0gICAgICAgIGlmIChzaXplID09IG5hbWVsZW4gJiYgIW1lbWNtcChkYXRhLXNpemUsIG5hbWUsIG5hbWVsZW4pKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCpkYXRhKyspIHsKKyAgICAgICAgYnl0ZXN0cmVhbTJfc2tpcChnYiwgc2l6ZSk7CisgICAgICAgIGlmIChzaXplID09IG5hbWVsZW4gJiYgIW1lbWNtcChnYi0+YnVmZmVyLXNpemUsIG5hbWUsIG5hbWVsZW4pKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGJ5dGVzdHJlYW0yX2dldF9ieXRlKGdiKSkgewogICAgICAgICAgICAgY2FzZSBBTUZfREFUQV9UWVBFX05VTUJFUjoKLSAgICAgICAgICAgICAgICBzbnByaW50Zihkc3QsIGRzdF9zaXplLCAiJWciLCBhdl9pbnQyZG91YmxlKEFWX1JCNjQoZGF0YSkpKTsKKyAgICAgICAgICAgICAgICBzbnByaW50Zihkc3QsIGRzdF9zaXplLCAiJWciLCBhdl9pbnQyZG91YmxlKGJ5dGVzdHJlYW0yX2dldF9iZTY0KGdiKSkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBTUZfREFUQV9UWVBFX0JPT0w6Ci0gICAgICAgICAgICAgICAgc25wcmludGYoZHN0LCBkc3Rfc2l6ZSwgIiVzIiwgKmRhdGEgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKyAgICAgICAgICAgICAgICBzbnByaW50Zihkc3QsIGRzdF9zaXplLCAiJXMiLCBieXRlc3RyZWFtMl9nZXRfYnl0ZShnYikgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQU1GX0RBVEFfVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgICAgICAgbGVuID0gYnl0ZXN0cmVhbV9nZXRfYmUxNigmZGF0YSk7Ci0gICAgICAgICAgICAgICAgYXZfc3RybGNweShkc3QsIGRhdGEsIEZGTUlOKGxlbisxLCBkc3Rfc2l6ZSkpOworICAgICAgICAgICAgICAgIGxlbiA9IGJ5dGVzdHJlYW0yX2dldF9iZTE2KGdiKTsKKyAgICAgICAgICAgICAgICBpZiAoZHN0X3NpemUgPCAxKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaWYgKGRzdF9zaXplIDwgbGVuICsgMSkKKyAgICAgICAgICAgICAgICAgICAgbGVuID0gZHN0X3NpemUgLSAxOworICAgICAgICAgICAgICAgIGJ5dGVzdHJlYW0yX2dldF9idWZmZXIoZ2IsIGRzdCwgbGVuKTsKKyAgICAgICAgICAgICAgICBkc3RbbGVuXSA9IDA7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGxlbiA9IGZmX2FtZl90YWdfc2l6ZShkYXRhLCBkYXRhX2VuZCk7Ci0gICAgICAgIGlmIChsZW4gPCAwIHx8IGxlbiA+PSBkYXRhX2VuZCAtIGRhdGEpCisgICAgICAgIGxlbiA9IGFtZl90YWdfc2tpcChnYik7CisgICAgICAgIGlmIChsZW4gPCAwIHx8IGJ5dGVzdHJlYW0yX2dldF9ieXRlc19sZWZ0KGdiKSA8PSAwKQogICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBkYXRhICs9IGxlbjsKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQogCitpbnQgZmZfYW1mX2dldF9maWVsZF92YWx1ZShjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCB1aW50OF90ICpkYXRhX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm5hbWUsIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zaXplKQoreworICAgIEdldEJ5dGVDb250ZXh0IGdiOworCisgICAgaWYgKGRhdGEgPj0gZGF0YV9lbmQpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGJ5dGVzdHJlYW0yX2luaXQoJmdiLCBkYXRhLCBkYXRhX2VuZCAtIGRhdGEpOworCisgICAgcmV0dXJuIGFtZl9nZXRfZmllbGRfdmFsdWUyKCZnYiwgbmFtZSwgZHN0LCBkc3Rfc2l6ZSk7Cit9CisKIHN0YXRpYyBjb25zdCBjaGFyKiBydG1wX3BhY2tldF90eXBlKGludCB0eXBlKQogewogICAgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgUlRNUF9QVF9DSFVOS19TSVpFOiAgICAgcmV0dXJuICJjaHVuayBzaXplIjsKICAgICBjYXNlIFJUTVBfUFRfQllURVNfUkVBRDogICAgIHJldHVybiAiYnl0ZXMgcmVhZCI7Ci0gICAgY2FzZSBSVE1QX1BUX1BJTkc6ICAgICAgICAgICByZXR1cm4gInBpbmciOwotICAgIGNhc2UgUlRNUF9QVF9TRVJWRVJfQlc6ICAgICAgcmV0dXJuICJzZXJ2ZXIgYmFuZHdpZHRoIjsKLSAgICBjYXNlIFJUTVBfUFRfQ0xJRU5UX0JXOiAgICAgIHJldHVybiAiY2xpZW50IGJhbmR3aWR0aCI7CisgICAgY2FzZSBSVE1QX1BUX1VTRVJfQ09OVFJPTDogICByZXR1cm4gInVzZXIgY29udHJvbCI7CisgICAgY2FzZSBSVE1QX1BUX1dJTkRPV19BQ0tfU0laRTogcmV0dXJuICJ3aW5kb3cgYWNrbm93bGVkZ2VtZW50IHNpemUiOworICAgIGNhc2UgUlRNUF9QVF9TRVRfUEVFUl9CVzogICAgcmV0dXJuICJzZXQgcGVlciBiYW5kd2lkdGgiOwogICAgIGNhc2UgUlRNUF9QVF9BVURJTzogICAgICAgICAgcmV0dXJuICJhdWRpbyBwYWNrZXQiOwogICAgIGNhc2UgUlRNUF9QVF9WSURFTzogICAgICAgICAgcmV0dXJuICJ2aWRlbyBwYWNrZXQiOwogICAgIGNhc2UgUlRNUF9QVF9GTEVYX1NUUkVBTTogICAgcmV0dXJuICJGbGV4IHNoYXJlZCBzdHJlYW0iOwpAQCAtNjIxLDEwICs2NzQsMTAgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIHNyYyArPSBzejsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAocC0+dHlwZSA9PSBSVE1QX1BUX1NFUlZFUl9CVyl7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIlNlcnZlciBCVyA9ICVkXG4iLCBBVl9SQjMyKHAtPmRhdGEpKTsKLSAgICB9IGVsc2UgaWYgKHAtPnR5cGUgPT0gUlRNUF9QVF9DTElFTlRfQlcpewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJDbGllbnQgQlcgPSAlZFxuIiwgQVZfUkIzMihwLT5kYXRhKSk7CisgICAgfSBlbHNlIGlmIChwLT50eXBlID09IFJUTVBfUFRfV0lORE9XX0FDS19TSVpFKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgIldpbmRvdyBhY2tub3dsZWRnZW1lbnQgc2l6ZSA9ICVkXG4iLCBBVl9SQjMyKHAtPmRhdGEpKTsKKyAgICB9IGVsc2UgaWYgKHAtPnR5cGUgPT0gUlRNUF9QVF9TRVRfUEVFUl9CVykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfREVCVUcsICJTZXQgUGVlciBCVyA9ICVkXG4iLCBBVl9SQjMyKHAtPmRhdGEpKTsKICAgICB9IGVsc2UgaWYgKHAtPnR5cGUgIT0gUlRNUF9QVF9BVURJTyAmJiBwLT50eXBlICE9IFJUTVBfUFRfVklERU8gJiYgcC0+dHlwZSAhPSBSVE1QX1BUX01FVEFEQVRBKSB7CiAgICAgICAgIGludCBpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcC0+c2l6ZTsgaSsrKQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRtcHBrdC5oIGIvbGliYXZmb3JtYXQvcnRtcHBrdC5oCmluZGV4IGEwODJiNDUuLmViNjhmMWQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0bXBwa3QuaAorKysgYi9saWJhdmZvcm1hdC9ydG1wcGt0LmgKQEAgLTQ3LDkgKzQ3LDkgQEAKIHR5cGVkZWYgZW51bSBSVE1QUGFja2V0VHlwZSB7CiAgICAgUlRNUF9QVF9DSFVOS19TSVpFICAgPSAgMSwgIC8vLzwgY2h1bmsgc2l6ZSBjaGFuZ2UKICAgICBSVE1QX1BUX0JZVEVTX1JFQUQgICA9ICAzLCAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgcmVhZAotICAgIFJUTVBfUFRfUElORywgICAgICAgICAgICAgICAvLy88IHBpbmcKLSAgICBSVE1QX1BUX1NFUlZFUl9CVywgICAgICAgICAgLy8vPCBzZXJ2ZXIgYmFuZHdpZHRoCi0gICAgUlRNUF9QVF9DTElFTlRfQlcsICAgICAgICAgIC8vLzwgY2xpZW50IGJhbmR3aWR0aAorICAgIFJUTVBfUFRfVVNFUl9DT05UUk9MLCAgICAgICAvLy88IHVzZXIgY29udHJvbAorICAgIFJUTVBfUFRfV0lORE9XX0FDS19TSVpFLCAgICAvLy88IHdpbmRvdyBhY2tub3dsZWRnZW1lbnQgc2l6ZQorICAgIFJUTVBfUFRfU0VUX1BFRVJfQlcsICAgICAgICAvLy88IHBlZXIgYmFuZHdpZHRoCiAgICAgUlRNUF9QVF9BVURJTyAgICAgICAgPSAgOCwgIC8vLzwgYXVkaW8gcGFja2V0CiAgICAgUlRNUF9QVF9WSURFTywgICAgICAgICAgICAgIC8vLzwgdmlkZW8gcGFja2V0CiAgICAgUlRNUF9QVF9GTEVYX1NUUkVBTSAgPSAxNSwgIC8vLzwgRmxleCBzaGFyZWQgc3RyZWFtCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydG1wcHJvdG8uYyBiL2xpYmF2Zm9ybWF0L3J0bXBwcm90by5jCmluZGV4IGE1NDg1YWIuLmI3NDFlNDIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0bXBwcm90by5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0bXBwcm90by5jCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAibGliYXZjb2RlYy9ieXRlc3RyZWFtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Jhc2U2NC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9obWFjLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGZsb2F0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9tZDUuaCIKQEAgLTkzLDkgKzkyLDkgQEAKICAgICBpbnQgICAgICAgICAgIGZsdl9vZmY7ICAgICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gY3VycmVudCBidWZmZXIKICAgICBpbnQgICAgICAgICAgIGZsdl9uYl9wYWNrZXRzOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBmbHYgcGFja2V0cyBwdWJsaXNoZWQKICAgICBSVE1QUGFja2V0ICAgIG91dF9wa3Q7ICAgICAgICAgICAgICAgICAgICAvLy88IHJ0bXAgcGFja2V0LCBjcmVhdGVkIGZyb20gZmx2IGEvdiBvciBtZXRhZGF0YSAoZm9yIG91dHB1dCkKLSAgICB1aW50MzJfdCAgICAgIGNsaWVudF9yZXBvcnRfc2l6ZTsgICAgICAgICAvLy88IG51bWJlciBvZiBieXRlcyBhZnRlciB3aGljaCBjbGllbnQgc2hvdWxkIHJlcG9ydCB0byBzZXJ2ZXIKLSAgICB1aW50MzJfdCAgICAgIGJ5dGVzX3JlYWQ7ICAgICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gc2VydmVyCi0gICAgdWludDMyX3QgICAgICBsYXN0X2J5dGVzX3JlYWQ7ICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBsYXN0IHJlcG9ydGVkIHRvIHNlcnZlcgorICAgIHVpbnQzMl90ICAgICAgcmVjZWl2ZV9yZXBvcnRfc2l6ZTsgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJ5dGVzIGFmdGVyIHdoaWNoIHdlIHNob3VsZCByZXBvcnQgdGhlIG51bWJlciBvZiByZWNlaXZlZCBieXRlcyB0byB0aGUgcGVlcgorICAgIHVpbnQ2NF90ICAgICAgYnl0ZXNfcmVhZDsgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSBzZXJ2ZXIKKyAgICB1aW50NjRfdCAgICAgIGxhc3RfYnl0ZXNfcmVhZDsgICAgICAgICAgICAvLy88IG51bWJlciBvZiBieXRlcyByZWFkIGxhc3QgcmVwb3J0ZWQgdG8gc2VydmVyCiAgICAgdWludDMyX3QgICAgICBsYXN0X3RpbWVzdGFtcDsgICAgICAgICAgICAgLy8vPCBsYXN0IHRpbWVzdGFtcCByZWNlaXZlZCBpbiBhIHBhY2tldAogICAgIGludCAgICAgICAgICAgc2tpcF9ieXRlczsgICAgICAgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgZnJvbSB0aGUgaW5wdXQgRkxWIHN0cmVhbSBpbiB0aGUgbmV4dCB3cml0ZSBjYWxsCiAgICAgaW50ICAgICAgICAgICBoYXNfYXVkaW87ICAgICAgICAgICAgICAgICAgLy8vPCBwcmVzZW5jZSBvZiBhdWRpbyBkYXRhCkBAIC0xMTQsNyArMTEzLDcgQEAKICAgICBjaGFyICAgICAgICAgIHN3ZnZlcmlmaWNhdGlvbls0Ml07ICAgICAgICAvLy88IGhhc2ggb2YgdGhlIFNXRiB2ZXJpZmljYXRpb24KICAgICBjaGFyKiAgICAgICAgIHBhZ2V1cmw7ICAgICAgICAgICAgICAgICAgICAvLy88IHVybCBvZiB0aGUgd2ViIHBhZ2UKICAgICBjaGFyKiAgICAgICAgIHN1YnNjcmliZTsgICAgICAgICAgICAgICAgICAvLy88IG5hbWUgb2YgbGl2ZSBzdHJlYW0gdG8gc3Vic2NyaWJlCi0gICAgaW50ICAgICAgICAgICBzZXJ2ZXJfYnc7ICAgICAgICAgICAgICAgICAgLy8vPCBzZXJ2ZXIgYmFuZHdpZHRoCisgICAgaW50ICAgICAgICAgICBtYXhfc2VudF91bmFja2VkOyAgICAgICAgICAgLy8vPCBtYXggdW5hY2tlZCBzZW50IGJ5dGVzCiAgICAgaW50ICAgICAgICAgICBjbGllbnRfYnVmZmVyX3RpbWU7ICAgICAgICAgLy8vPCBjbGllbnQgYnVmZmVyIHRpbWUgaW4gbXMKICAgICBpbnQgICAgICAgICAgIGZsdXNoX2ludGVydmFsOyAgICAgICAgICAgICAvLy88IG51bWJlciBvZiBwYWNrZXRzIGZsdXNoZWQgaW4gdGhlIHNhbWUgcmVxdWVzdCAoUlRNUFQgb25seSkKICAgICBpbnQgICAgICAgICAgIGVuY3J5cHRlZDsgICAgICAgICAgICAgICAgICAvLy88IHVzZSBhbiBlbmNyeXB0ZWQgY29ubmVjdGlvbiAoUlRNUEUgb25seSkKQEAgLTE1Niw2ICsxNTUsOCBAQAogfTsKIAogc3RhdGljIGludCBoYW5kbGVfY2h1bmtfc2l6ZShVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpOworc3RhdGljIGludCBoYW5kbGVfd2luZG93X2Fja19zaXplKFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCk7CitzdGF0aWMgaW50IGhhbmRsZV9zZXRfcGVlcl9idyhVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpOwogCiBzdGF0aWMgaW50IGFkZF90cmFja2VkX21ldGhvZChSVE1QQ29udGV4dCAqcnQsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBpZCkKIHsKQEAgLTMzOSw5ICszNDAsMTIgQEAKICAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcCwgImZsYXNoVmVyIik7CiAgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgcnQtPmZsYXNodmVyKTsKIAotICAgIGlmIChydC0+c3dmdXJsKSB7CisgICAgaWYgKHJ0LT5zd2Z1cmwgfHwgcnQtPnN3ZnZlcmlmeSkgewogICAgICAgICBmZl9hbWZfd3JpdGVfZmllbGRfbmFtZSgmcCwgInN3ZlVybCIpOwotICAgICAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCBydC0+c3dmdXJsKTsKKyAgICAgICAgaWYgKHJ0LT5zd2Z1cmwpCisgICAgICAgICAgICBmZl9hbWZfd3JpdGVfc3RyaW5nKCZwLCBydC0+c3dmdXJsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcCwgcnQtPnN3ZnZlcmlmeSk7CiAgICAgfQogCiAgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnAsICJ0Y1VybCIpOwpAQCAtMzk5LDYgKzQwMyw5IEBACiAgICAgcmV0dXJuIHJ0bXBfc2VuZF9wYWNrZXQocnQsICZwa3QsIDEpOwogfQogCisKKyNkZWZpbmUgUlRNUF9DVFJMX0FCT1JUX01FU1NBR0UgICgyKQorCiBzdGF0aWMgaW50IHJlYWRfY29ubmVjdChVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQpCiB7CiAgICAgUlRNUFBhY2tldCBwa3QgPSB7IDAgfTsKQEAgLTQxMSwxOCArNDE4LDQyIEBACiAgICAgdWludDhfdCB0bXBzdHJbMjU2XTsKICAgICBHZXRCeXRlQ29udGV4dCBnYmM7CiAKLSAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X3JlYWQocnQtPnN0cmVhbSwgJnBrdCwgcnQtPmluX2NodW5rX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydC0+cHJldl9wa3RbMF0sICZydC0+bmJfcHJldl9wa3RbMF0pKSA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICBpZiAocGt0LnR5cGUgPT0gUlRNUF9QVF9DSFVOS19TSVpFKSB7Ci0gICAgICAgIGlmICgocmV0ID0gaGFuZGxlX2NodW5rX3NpemUocywgJnBrdCkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0KLSAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcGt0KTsKKyAgICAvLyBoYW5kbGUgUlRNUCBQcm90b2NvbCBDb250cm9sIE1lc3NhZ2VzCisgICAgZm9yICg7OykgewogICAgICAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X3JlYWQocnQtPnN0cmVhbSwgJnBrdCwgcnQtPmluX2NodW5rX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzBdLCAmcnQtPm5iX3ByZXZfcGt0WzBdKSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKKyNpZmRlZiBERUJVRworICAgICAgICBmZl9ydG1wX3BhY2tldF9kdW1wKHMsICZwa3QpOworI2VuZGlmCisgICAgICAgIGlmIChwa3QudHlwZSA9PSBSVE1QX1BUX0NIVU5LX1NJWkUpIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gaGFuZGxlX2NodW5rX3NpemUocywgJnBrdCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwa3QudHlwZSA9PSBSVE1QX0NUUkxfQUJPUlRfTUVTU0FHRSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInJlY2VpdmVkIGFib3J0IG1lc3NhZ2VcbiIpOworICAgICAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcGt0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIH0gZWxzZSBpZiAocGt0LnR5cGUgPT0gUlRNUF9QVF9CWVRFU19SRUFEKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAicmVjZWl2ZWQgYWNrbm93bGVkZ2VtZW50XG4iKTsKKyAgICAgICAgfSBlbHNlIGlmIChwa3QudHlwZSA9PSBSVE1QX1BUX1dJTkRPV19BQ0tfU0laRSkgeworICAgICAgICAgICAgaWYgKChyZXQgPSBoYW5kbGVfd2luZG93X2Fja19zaXplKHMsICZwa3QpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZwa3QpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocGt0LnR5cGUgPT0gUlRNUF9QVF9TRVRfUEVFUl9CVykgeworICAgICAgICAgICAgaWYgKChyZXQgPSBoYW5kbGVfc2V0X3BlZXJfYncocywgJnBrdCkpIDwgMCkgeworICAgICAgICAgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnBrdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChwa3QudHlwZSA9PSBSVE1QX1BUX0lOVk9LRSkgeworICAgICAgICAgICAgLy8gcmVjZWl2ZWQgUlRNUCBDb21tYW5kIE1lc3NhZ2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVua25vd24gY29udHJvbCBtZXNzYWdlIHR5cGUgKCVkKVxuIiwgcGt0LnR5cGUpOworICAgICAgICB9CisgICAgICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnBrdCk7CiAgICAgfQogCiAgICAgY3AgPSBwa3QuZGF0YTsKQEAgLTQ1MSwyNCArNDgyLDI4IEBACiAgICAgICAgICAgICAgICB0bXBzdHIsIHJ0LT5hcHApOwogICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnBrdCk7CiAKLSAgICAvLyBTZW5kIFdpbmRvdyBBY2tub3dsZWRnZW1lbnQgU2l6ZSAoYXMgZGVmaW5lZCBpbiBzcGVmaWNpY2F0aW9uKQorICAgIC8vIFNlbmQgV2luZG93IEFja25vd2xlZGdlbWVudCBTaXplIChhcyBkZWZpbmVkIGluIHNwZWNpZmljYXRpb24pCiAgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9ORVRXT1JLX0NIQU5ORUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9QVF9TRVJWRVJfQlcsIDAsIDQpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9QVF9XSU5ET1dfQUNLX1NJWkUsIDAsIDQpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgcCA9IHBrdC5kYXRhOwotICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnAsIHJ0LT5zZXJ2ZXJfYncpOworICAgIC8vIEluZm9ybSB0aGUgcGVlciBhYm91dCBob3cgb2Z0ZW4gd2Ugd2FudCBhY2tub3dsZWRnZW1lbnRzIGFib3V0IHdoYXQKKyAgICAvLyB3ZSBzZW5kLiAoV2UgZG9uJ3QgY2hlY2sgZm9yIHRoZSBhY2tub3dsZWRnZW1lbnRzIGN1cnJlbnRseS4pCisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgcnQtPm1heF9zZW50X3VuYWNrZWQpOwogICAgIHBrdC5zaXplID0gcCAtIHBrdC5kYXRhOwogICAgIHJldCA9IGZmX3J0bXBfcGFja2V0X3dyaXRlKHJ0LT5zdHJlYW0sICZwa3QsIHJ0LT5vdXRfY2h1bmtfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcnQtPnByZXZfcGt0WzFdLCAmcnQtPm5iX3ByZXZfcGt0WzFdKTsKICAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZwa3QpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwotICAgIC8vIFNlbmQgUGVlciBCYW5kd2lkdGgKKyAgICAvLyBTZXQgUGVlciBCYW5kd2lkdGgKICAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX05FVFdPUktfQ0hBTk5FTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1BUX0NMSUVOVF9CVywgMCwgNSkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1BUX1NFVF9QRUVSX0JXLCAwLCA1KSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIHAgPSBwa3QuZGF0YTsKLSAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCBydC0+c2VydmVyX2J3KTsKKyAgICAvLyBUZWxsIHRoZSBwZWVyIHRvIG9ubHkgc2VuZCB0aGlzIG1hbnkgYnl0ZXMgdW5sZXNzIGl0IGdldHMgYWNrbm93bGVkZ2VtZW50cy4KKyAgICAvLyBUaGlzIGNvdWxkIGJlIGFueSBhcmJpdHJhcnkgdmFsdWUgd2Ugd2FudCBoZXJlLgorICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnAsIHJ0LT5tYXhfc2VudF91bmFja2VkKTsKICAgICBieXRlc3RyZWFtX3B1dF9ieXRlKCZwLCAyKTsgLy8gZHluYW1pYwogICAgIHBrdC5zaXplID0gcCAtIHBrdC5kYXRhOwogICAgIHJldCA9IGZmX3J0bXBfcGFja2V0X3dyaXRlKHJ0LT5zdHJlYW0sICZwa3QsIHJ0LT5vdXRfY2h1bmtfc2l6ZSwKQEAgLTQ3NywxNCArNTEyLDE0IEBACiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKLSAgICAvLyBQaW5nIHJlcXVlc3QKKyAgICAvLyBVc2VyIGNvbnRyb2wKICAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX05FVFdPUktfQ0hBTk5FTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1BUX1BJTkcsIDAsIDYpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRNUF9QVF9VU0VSX0NPTlRST0wsIDAsIDYpKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBwID0gcGt0LmRhdGE7CiAgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcCwgMCk7IC8vIDAgLT4gU3RyZWFtIEJlZ2luCi0gICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgMCk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUzMigmcCwgMCk7IC8vIFN0cmVhbSAwCiAgICAgcmV0ID0gZmZfcnRtcF9wYWNrZXRfd3JpdGUocnQtPnN0cmVhbSwgJnBrdCwgcnQtPm91dF9jaHVua19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZydC0+cHJldl9wa3RbMV0sICZydC0+bmJfcHJldl9wa3RbMV0pOwogICAgIGZmX3J0bXBfcGFja2V0X2Rlc3Ryb3koJnBrdCk7CkBAIC00OTIsNyArNTI3LDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIC8vIENodW5rIHNpemUKLSAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX1NZU1RFTV9DSEFOTkVMLAorICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfTkVUV09SS19DSEFOTkVMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUTVBfUFRfQ0hVTktfU0laRSwgMCwgNCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtNTgxLDcgKzYxNiw3IEBACiAKIC8qKgogICogR2VuZXJhdGUgJ0ZDUHVibGlzaCcgY2FsbCBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLiBJdCBzaG91bGQgbWFrZQotICogdGhlIHNlcnZlciBwcmVhcGFyZSBmb3IgcmVjZWl2aW5nIG1lZGlhIHN0cmVhbXMuCisgKiB0aGUgc2VydmVyIHByZXBhcmUgZm9yIHJlY2VpdmluZyBtZWRpYSBzdHJlYW1zLgogICovCiBzdGF0aWMgaW50IGdlbl9mY3B1Ymxpc2hfc3RyZWFtKFVSTENvbnRleHQgKnMsIFJUTVBDb250ZXh0ICpydCkKIHsKQEAgLTcxMCwxMiArNzQ1LDEyIEBACiAgICAgdWludDhfdCAqcDsKICAgICBpbnQgcmV0OwogCi0gICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9ORVRXT1JLX0NIQU5ORUwsIFJUTVBfUFRfUElORywKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX05FVFdPUktfQ0hBTk5FTCwgUlRNUF9QVF9VU0VSX0NPTlRST0wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMTApKSA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBwID0gcGt0LmRhdGE7Ci0gICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcCwgMyk7CisgICAgYnl0ZXN0cmVhbV9wdXRfYmUxNigmcCwgMyk7IC8vIFNldEJ1ZmZlciBMZW5ndGgKICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCBydC0+c3RyZWFtX2lkKTsKICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCBydC0+Y2xpZW50X2J1ZmZlcl90aW1lKTsKIApAQCAtODQyLDEyICs4NzcsMTIgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9ORVRXT1JLX0NIQU5ORUwsIFJUTVBfUFRfUElORywKKyAgICBpZiAoKHJldCA9IGZmX3J0bXBfcGFja2V0X2NyZWF0ZSgmcGt0LCBSVE1QX05FVFdPUktfQ0hBTk5FTCxSVE1QX1BUX1VTRVJfQ09OVFJPTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcGt0LT50aW1lc3RhbXAgKyAxLCA2KSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgcCA9IHBrdC5kYXRhOwotICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnAsIDcpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMTYoJnAsIDcpOyAvLyBQaW5nUmVzcG9uc2UKICAgICBieXRlc3RyZWFtX3B1dF9iZTMyKCZwLCBBVl9SQjMyKHBwa3QtPmRhdGErMikpOwogCiAgICAgcmV0dXJuIHJ0bXBfc2VuZF9wYWNrZXQocnQsICZwa3QsIDApOwpAQCAtODYzLDcgKzg5OCw3IEBACiAgICAgaW50IHJldDsKIAogICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJTZW5kaW5nIFNXRiB2ZXJpZmljYXRpb24uLi5cbiIpOwotICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfTkVUV09SS19DSEFOTkVMLCBSVE1QX1BUX1BJTkcsCisgICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9ORVRXT1JLX0NIQU5ORUwsIFJUTVBfUFRfVVNFUl9DT05UUk9MLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQ0KSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCkBAIC04NzUsMjAgKzkxMCwyMCBAQAogfQogCiAvKioKLSAqIEdlbmVyYXRlIHNlcnZlciBiYW5kd2lkdGggbWVzc2FnZSBhbmQgc2VuZCBpdCB0byB0aGUgc2VydmVyLgorICogR2VuZXJhdGUgd2luZG93IGFja25vd2xlZGdlbWVudCBzaXplIG1lc3NhZ2UgYW5kIHNlbmQgaXQgdG8gdGhlIHNlcnZlci4KICAqLwotc3RhdGljIGludCBnZW5fc2VydmVyX2J3KFVSTENvbnRleHQgKnMsIFJUTVBDb250ZXh0ICpydCkKK3N0YXRpYyBpbnQgZ2VuX3dpbmRvd19hY2tfc2l6ZShVUkxDb250ZXh0ICpzLCBSVE1QQ29udGV4dCAqcnQpCiB7CiAgICAgUlRNUFBhY2tldCBwa3Q7CiAgICAgdWludDhfdCAqcDsKICAgICBpbnQgcmV0OwogCi0gICAgaWYgKChyZXQgPSBmZl9ydG1wX3BhY2tldF9jcmVhdGUoJnBrdCwgUlRNUF9ORVRXT1JLX0NIQU5ORUwsIFJUTVBfUFRfU0VSVkVSX0JXLAorICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZwa3QsIFJUTVBfTkVUV09SS19DSEFOTkVMLCBSVE1QX1BUX1dJTkRPV19BQ0tfU0laRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA0KSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgcCA9IHBrdC5kYXRhOwotICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnAsIHJ0LT5zZXJ2ZXJfYncpOworICAgIGJ5dGVzdHJlYW1fcHV0X2JlMzIoJnAsIHJ0LT5tYXhfc2VudF91bmFja2VkKTsKIAogICAgIHJldHVybiBydG1wX3NlbmRfcGFja2V0KHJ0LCAmcGt0LCAwKTsKIH0KQEAgLTk1Myw0MSArOTg4LDYgQEAKICAgICByZXR1cm4gcnRtcF9zZW5kX3BhY2tldChydCwgJnBrdCwgMSk7CiB9CiAKLWludCBmZl9ydG1wX2NhbGNfZGlnZXN0KGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbiwgaW50IGdhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwgaW50IGtleWxlbiwgdWludDhfdCAqZHN0KQotewotICAgIEFWSE1BQyAqaG1hYzsKLQotICAgIGhtYWMgPSBhdl9obWFjX2FsbG9jKEFWX0hNQUNfU0hBMjU2KTsKLSAgICBpZiAoIWhtYWMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0KLSAgICBhdl9obWFjX2luaXQoaG1hYywga2V5LCBrZXlsZW4pOwotICAgIGlmIChnYXAgPD0gMCkgewotICAgICAgICBhdl9obWFjX3VwZGF0ZShobWFjLCBzcmMsIGxlbik7Ci0gICAgfSBlbHNlIHsgLy9za2lwIDMyIGJ5dGVzIHVzZWQgZm9yIHN0b3JpbmcgZGlnZXN0Ci0gICAgICAgIGF2X2htYWNfdXBkYXRlKGhtYWMsIHNyYywgZ2FwKTsKLSAgICAgICAgYXZfaG1hY191cGRhdGUoaG1hYywgc3JjICsgZ2FwICsgMzIsIGxlbiAtIGdhcCAtIDMyKTsKLSAgICB9Ci0gICAgYXZfaG1hY19maW5hbChobWFjLCBkc3QsIDMyKTsKLQotICAgIGF2X2htYWNfZnJlZShobWFjKTsKLQotICAgIHJldHVybiAwOwotfQotCi1pbnQgZmZfcnRtcF9jYWxjX2RpZ2VzdF9wb3MoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgb2ZmLCBpbnQgbW9kX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWRkX3ZhbCkKLXsKLSAgICBpbnQgaSwgZGlnZXN0X3BvcyA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICBkaWdlc3RfcG9zICs9IGJ1ZltpICsgb2ZmXTsKLSAgICBkaWdlc3RfcG9zID0gZGlnZXN0X3BvcyAlIG1vZF92YWwgKyBhZGRfdmFsOwotCi0gICAgcmV0dXJuIGRpZ2VzdF9wb3M7Ci19Ci0KIC8qKgogICogUHV0IEhNQUMtU0hBMiBkaWdlc3Qgb2YgcGFja2V0IGRhdGEgKGV4Y2VwdCBmb3IgdGhlIGJ5dGVzIHdoZXJlIHRoaXMgZGlnZXN0CiAgKiB3aWxsIGJlIHN0b3JlZCkgaW50byB0aGF0IHBhY2tldC4KQEAgLTExMTEsNyArMTExMSw3IEBACiB7CiAgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOwogICAgIHVpbnQ4X3QgKmluX2RhdGEgPSBOVUxMLCAqb3V0X2RhdGEgPSBOVUxMLCAqc3dmZGF0YTsKLSAgICBpbnQ2NF90IGluX3NpemUsIG91dF9zaXplOworICAgIGludDY0X3QgaW5fc2l6ZTsKICAgICBVUkxDb250ZXh0ICpzdHJlYW07CiAgICAgY2hhciBzd2ZoYXNoWzMyXTsKICAgICBpbnQgc3dmc2l6ZTsKQEAgLTExMjAsNyArMTEyMCw3IEBACiAgICAgLyogR2V0IHRoZSBTV0YgcGxheWVyIGZpbGUuICovCiAgICAgaWYgKChyZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmc3RyZWFtLCBydC0+c3dmdmVyaWZ5LCBBVklPX0ZMQUdfUkVBRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm90b2NvbF93aGl0ZWxpc3QpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb3RvY29sX3doaXRlbGlzdCwgcy0+cHJvdG9jb2xfYmxhY2tsaXN0LCBzKSkgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJDYW5ub3Qgb3BlbiBjb25uZWN0aW9uICVzLlxuIiwgcnQtPnN3ZnZlcmlmeSk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CkBAIC0xMTQ0LDYgKzExNDQsOCBAQAogICAgIH0KIAogICAgIGlmICghbWVtY21wKGluX2RhdGEsICJDV1MiLCAzKSkgeworI2lmIENPTkZJR19aTElCCisgICAgICAgIGludDY0X3Qgb3V0X3NpemU7CiAgICAgICAgIC8qIERlY29tcHJlc3MgdGhlIFNXRiBwbGF5ZXIgZmlsZSB1c2luZyBabGliLiAqLwogICAgICAgICBpZiAoIShvdXRfZGF0YSA9IGF2X21hbGxvYyg4KSkpIHsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKQEAgLTExNTMsMTggKzExNTUsMTcgQEAKICAgICAgICAgbWVtY3B5KG91dF9kYXRhLCBpbl9kYXRhLCA4KTsKICAgICAgICAgb3V0X3NpemUgPSA4OwogCi0jaWYgQ09ORklHX1pMSUIKICAgICAgICAgaWYgKChyZXQgPSBydG1wX3VuY29tcHJlc3Nfc3dmcGxheWVyKGluX2RhdGEgKyA4LCBpbl9zaXplIC0gOCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfZGF0YSwgJm91dF9zaXplKSkgPCAwKQogICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBzd2ZzaXplID0gb3V0X3NpemU7CisgICAgICAgIHN3ZmRhdGEgPSBvdXRfZGF0YTsKICNlbHNlCiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiWmxpYiBpcyByZXF1aXJlZCBmb3IgZGVjb21wcmVzc2luZyB0aGUgU1dGIHBsYXllciBmaWxlLlxuIik7CiAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgZ290byBmYWlsOwogI2VuZGlmCi0gICAgICAgIHN3ZnNpemUgPSBvdXRfc2l6ZTsKLSAgICAgICAgc3dmZGF0YSA9IG91dF9kYXRhOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN3ZnNpemUgPSBpbl9zaXplOwogICAgICAgICBzd2ZkYXRhID0gaW5fZGF0YTsKQEAgLTE1MjAsMTkgKzE1MjEsMTkgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYW5kbGVfcGluZyhVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpCitzdGF0aWMgaW50IGhhbmRsZV91c2VyX2NvbnRyb2woVVJMQ29udGV4dCAqcywgUlRNUFBhY2tldCAqcGt0KQogewogICAgIFJUTVBDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKICAgICBpbnQgdCwgcmV0OwogCiAgICAgaWYgKHBrdC0+c2l6ZSA8IDIpIHsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRvbyBzaG9ydCBwaW5nIHBhY2tldCAoJWQpXG4iLAorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IHVzZXIgY29udHJvbCBwYWNrZXQgKCVkKVxuIiwKICAgICAgICAgICAgICAgIHBrdC0+c2l6ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAogICAgIHQgPSBBVl9SQjE2KHBrdC0+ZGF0YSk7Ci0gICAgaWYgKHQgPT0gNikgeworICAgIGlmICh0ID09IDYpIHsgLy8gUGluZ1JlcXVlc3QKICAgICAgICAgaWYgKChyZXQgPSBnZW5fcG9uZyhzLCBydCwgcGt0KSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9IGVsc2UgaWYgKHQgPT0gMjYpIHsKQEAgLTE1NDcsNDggKzE1NDgsNTUgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYW5kbGVfY2xpZW50X2J3KFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCkKK3N0YXRpYyBpbnQgaGFuZGxlX3NldF9wZWVyX2J3KFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCkKIHsKICAgICBSVE1QQ29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CiAKICAgICBpZiAocGt0LT5zaXplIDwgNCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNsaWVudCBiYW5kd2lkdGggcmVwb3J0IHBhY2tldCBpcyBsZXNzIHRoYW4gNCBieXRlcyBsb25nICglZClcbiIsCisgICAgICAgICAgICAgICAiUGVlciBiYW5kd2lkdGggcGFja2V0IGlzIGxlc3MgdGhhbiA0IGJ5dGVzIGxvbmcgKCVkKVxuIiwKICAgICAgICAgICAgICAgIHBrdC0+c2l6ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIHJ0LT5jbGllbnRfcmVwb3J0X3NpemUgPSBBVl9SQjMyKHBrdC0+ZGF0YSk7Ci0gICAgaWYgKHJ0LT5jbGllbnRfcmVwb3J0X3NpemUgPD0gMCkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IGNsaWVudCBiYW5kd2lkdGggJWRcbiIsCi0gICAgICAgICAgICAgICAgcnQtPmNsaWVudF9yZXBvcnRfc2l6ZSk7CisgICAgLy8gV2UgY3VycmVudGx5IGRvbid0IGNoZWNrIGhvdyBtdWNoIHRoZSBwZWVyIGhhcyBhY2tub3dsZWRnZWQgb2YKKyAgICAvLyB3aGF0IHdlIGhhdmUgc2VudC4gVG8gZG8gdGhhdCBwcm9wZXJseSwgd2Ugc2hvdWxkIGNhbGwKKyAgICAvLyBnZW5fd2luZG93X2Fja19zaXplIGhlcmUsIHRvIHRlbGwgdGhlIHBlZXIgdGhhdCB3ZSB3YW50IGFuCisgICAgLy8gYWNrbm93bGVkZ2VtZW50IHdpdGggKGF0IGxlYXN0KSB0aGF0IGludGVydmFsLgorICAgIHJ0LT5tYXhfc2VudF91bmFja2VkID0gQVZfUkIzMihwa3QtPmRhdGEpOworICAgIGlmIChydC0+bWF4X3NlbnRfdW5hY2tlZCA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3Qgc2V0IHBlZXIgYmFuZHdpZHRoICVkXG4iLAorICAgICAgICAgICAgICAgcnQtPm1heF9zZW50X3VuYWNrZWQpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAogICAgIH0KLSAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiQ2xpZW50IGJhbmR3aWR0aCA9ICVkXG4iLCBydC0+Y2xpZW50X3JlcG9ydF9zaXplKTsKLSAgICBydC0+Y2xpZW50X3JlcG9ydF9zaXplID4+PSAxOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJNYXggc2VudCwgdW5hY2tlZCA9ICVkXG4iLCBydC0+bWF4X3NlbnRfdW5hY2tlZCk7CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBoYW5kbGVfc2VydmVyX2J3KFVSTENvbnRleHQgKnMsIFJUTVBQYWNrZXQgKnBrdCkKK3N0YXRpYyBpbnQgaGFuZGxlX3dpbmRvd19hY2tfc2l6ZShVUkxDb250ZXh0ICpzLCBSVE1QUGFja2V0ICpwa3QpCiB7CiAgICAgUlRNUENvbnRleHQgKnJ0ID0gcy0+cHJpdl9kYXRhOwogCiAgICAgaWYgKHBrdC0+c2l6ZSA8IDQpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJUb28gc2hvcnQgc2VydmVyIGJhbmR3aWR0aCByZXBvcnQgcGFja2V0ICglZClcbiIsCisgICAgICAgICAgICAgICAiVG9vIHNob3J0IHdpbmRvdyBhY2tub3dsZWRnZW1lbnQgc2l6ZSBwYWNrZXQgKCVkKVxuIiwKICAgICAgICAgICAgICAgIHBrdC0+c2l6ZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIHJ0LT5zZXJ2ZXJfYncgPSBBVl9SQjMyKHBrdC0+ZGF0YSk7Ci0gICAgaWYgKHJ0LT5zZXJ2ZXJfYncgPD0gMCkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IHNlcnZlciBiYW5kd2lkdGggJWRcbiIsCi0gICAgICAgICAgICAgICBydC0+c2VydmVyX2J3KTsKKyAgICBydC0+cmVjZWl2ZV9yZXBvcnRfc2l6ZSA9IEFWX1JCMzIocGt0LT5kYXRhKTsKKyAgICBpZiAocnQtPnJlY2VpdmVfcmVwb3J0X3NpemUgPD0gMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IHdpbmRvdyBhY2tub3dsZWRnZW1lbnQgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgIHJ0LT5yZWNlaXZlX3JlcG9ydF9zaXplKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQotICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJTZXJ2ZXIgYmFuZHdpZHRoID0gJWRcbiIsIHJ0LT5zZXJ2ZXJfYncpOworICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJXaW5kb3cgYWNrbm93bGVkZ2VtZW50IHNpemUgPSAlZFxuIiwgcnQtPnJlY2VpdmVfcmVwb3J0X3NpemUpOworICAgIC8vIFNlbmQgYW4gQWNrbm93bGVkZ2VtZW50IHBhY2tldCBhZnRlciByZWNlaXZpbmcgaGFsZiB0aGUgbWF4aW11bQorICAgIC8vIHNpemUsIHRvIG1ha2Ugc3VyZSB0aGUgcGVlciBjYW4ga2VlcCBvbiBzZW5kaW5nIHdpdGhvdXQgd2FpdGluZworICAgIC8vIGZvciBhY2tub3dsZWRnZW1lbnRzLgorICAgIHJ0LT5yZWNlaXZlX3JlcG9ydF9zaXplID4+PSAxOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xODMwLDcgKzE4MzgsNyBAQAogCiAgICAgLy8gU2VuZCBTdHJlYW0gQmVnaW4gMQogICAgIGlmICgocmV0ID0gZmZfcnRtcF9wYWNrZXRfY3JlYXRlKCZzcGt0LCBSVE1QX05FVFdPUktfQ0hBTk5FTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1BUX1BJTkcsIDAsIDYpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVE1QX1BUX1VTRVJfQ09OVFJPTCwgMCwgNikpIDwgMCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGNyZWF0ZSByZXNwb25zZSBwYWNrZXRcbiIpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTE4ODAsOSArMTg4OCw2IEBACiAgICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcHAsIHN0YXR1c21zZyk7CiAgICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnBwLCAiZGV0YWlscyIpOwogICAgIGZmX2FtZl93cml0ZV9zdHJpbmcoJnBwLCBmaWxlbmFtZSk7Ci0gICAgZmZfYW1mX3dyaXRlX2ZpZWxkX25hbWUoJnBwLCAiY2xpZW50aWQiKTsKLSAgICBzbnByaW50ZihzdGF0dXNtc2csIHNpemVvZihzdGF0dXNtc2cpLCAiJXMiLCBMSUJBVkZPUk1BVF9JREVOVCk7Ci0gICAgZmZfYW1mX3dyaXRlX3N0cmluZygmcHAsIHN0YXR1c21zZyk7CiAgICAgZmZfYW1mX3dyaXRlX29iamVjdF9lbmQoJnBwKTsKIAogICAgIHNwa3Quc2l6ZSA9IHBwIC0gc3BrdC5kYXRhOwpAQCAtMTg5Nyw3ICsxOTAyLDcgQEAKIHsKICAgICBSVE1QQ29udGV4dCAqcnQgPSBzLT5wcml2X2RhdGE7CiAgICAgZG91YmxlIHNlcW51bTsKLSAgICBjaGFyIGZpbGVuYW1lWzY0XTsKKyAgICBjaGFyIGZpbGVuYW1lWzEyOF07CiAgICAgY2hhciBjb21tYW5kWzY0XTsKICAgICBpbnQgc3RyaW5nbGVuOwogICAgIGNoYXIgKnBjaGFyOwpAQCAtMTkyNCw2ICsxOTI5LDEzIEBACiAgICAgICAgICFzdHJjbXAoY29tbWFuZCwgInB1Ymxpc2giKSkgewogICAgICAgICByZXQgPSBmZl9hbWZfcmVhZF9zdHJpbmcoJmdiYywgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmlsZW5hbWUpLCAmc3RyaW5nbGVuKTsKKyAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVJTlZBTCkpCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBwYXJzZSBzdHJlYW0gbmFtZSAtIG5hbWUgdG9vIGxvbmc/XG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIHBhcnNlIHN0cmVhbSBuYW1lXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICAgICAgLy8gY2hlY2sgd2l0aCB1cmwKICAgICAgICAgaWYgKHMtPmZpbGVuYW1lKSB7CiAgICAgICAgICAgICBwY2hhciA9IHN0cnJjaHIocy0+ZmlsZW5hbWUsICcvJyk7CkBAIC0yMDAwLDcgKzIwMTIsNyBAQAogICogc3VjY2Vzc2Z1bCByZXNwb25zZSwgd2Ugd2lsbCByZXR1cm4gc2V0IHRoZSB2YWx1ZSB0byBudW1iZXIgKG90aGVyd2lzZSBudW1iZXIKICAqIHdpbGwgbm90IGJlIGNoYW5nZWQpLgogICoKLSAqIEByZXR1cm4gMCBpZiByZWFkaW5nIHRoZSB2YWx1ZSBzdWNjZWVkcywgbmVnYXRpdmUgdmFsdWUgb3RoZXJ3aXNzCisgKiBAcmV0dXJuIDAgaWYgcmVhZGluZyB0aGUgdmFsdWUgc3VjY2VlZHMsIG5lZ2F0aXZlIHZhbHVlIG90aGVyd2lzZQogICovCiBzdGF0aWMgaW50IHJlYWRfbnVtYmVyX3Jlc3VsdChSVE1QUGFja2V0ICpwa3QsIGRvdWJsZSAqbnVtYmVyKQogewpAQCAtMjAyMyw3ICsyMDM1LDcgQEAKICAgICAvLyBWYWx1ZSAzLzQ6IE51bGwKICAgICBpZiAoZmZfYW1mX3JlYWRfbnVsbCgmZ2JjKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgLy8gVmFsdWUgNC80OiBUaGUgcmVzb25zZSBhcyBBTUZfTlVNQkVSCisgICAgLy8gVmFsdWUgNC80OiBUaGUgcmVzcG9uc2UgYXMgQU1GX05VTUJFUgogICAgIGlmIChmZl9hbWZfcmVhZF9udW1iZXIoJmdiYywgJm51bWJ1ZmZlcikpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGVsc2UKQEAgLTIwNTQsNyArMjA2Niw3IEBACiAgICAgICAgICAgICBpZiAoKHJldCA9IGdlbl9mY3B1Ymxpc2hfc3RyZWFtKHMsIHJ0KSkgPCAwKQogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICgocmV0ID0gZ2VuX3NlcnZlcl9idyhzLCBydCkpIDwgMCkKKyAgICAgICAgICAgIGlmICgocmV0ID0gZ2VuX3dpbmRvd19hY2tfc2l6ZShzLCBydCkpIDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KIApAQCAtMjMwMywxNiArMjMxNSwxNiBAQAogICAgICAgICBpZiAoKHJldCA9IGhhbmRsZV9jaHVua19zaXplKHMsIHBrdCkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlRNUF9QVF9QSU5HOgotICAgICAgICBpZiAoKHJldCA9IGhhbmRsZV9waW5nKHMsIHBrdCkpIDwgMCkKKyAgICBjYXNlIFJUTVBfUFRfVVNFUl9DT05UUk9MOgorICAgICAgICBpZiAoKHJldCA9IGhhbmRsZV91c2VyX2NvbnRyb2wocywgcGt0KSkgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBSVE1QX1BUX0NMSUVOVF9CVzoKLSAgICAgICAgaWYgKChyZXQgPSBoYW5kbGVfY2xpZW50X2J3KHMsIHBrdCkpIDwgMCkKKyAgICBjYXNlIFJUTVBfUFRfU0VUX1BFRVJfQlc6CisgICAgICAgIGlmICgocmV0ID0gaGFuZGxlX3NldF9wZWVyX2J3KHMsIHBrdCkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgUlRNUF9QVF9TRVJWRVJfQlc6Ci0gICAgICAgIGlmICgocmV0ID0gaGFuZGxlX3NlcnZlcl9idyhzLCBwa3QpKSA8IDApCisgICAgY2FzZSBSVE1QX1BUX1dJTkRPV19BQ0tfU0laRToKKyAgICAgICAgaWYgKChyZXQgPSBoYW5kbGVfd2luZG93X2Fja19zaXplKHMsIHBrdCkpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgUlRNUF9QVF9JTlZPS0U6CkBAIC0yNDE3LDEwICsyNDI5LDEyIEBACiAgICAgICAgIHJ0LT5sYXN0X3RpbWVzdGFtcCA9IHJwa3QudGltZXN0YW1wOwogCiAgICAgICAgIHJ0LT5ieXRlc19yZWFkICs9IHJldDsKLSAgICAgICAgaWYgKHJ0LT5ieXRlc19yZWFkIC0gcnQtPmxhc3RfYnl0ZXNfcmVhZCA+IHJ0LT5jbGllbnRfcmVwb3J0X3NpemUpIHsKKyAgICAgICAgaWYgKHJ0LT5ieXRlc19yZWFkIC0gcnQtPmxhc3RfYnl0ZXNfcmVhZCA+IHJ0LT5yZWNlaXZlX3JlcG9ydF9zaXplKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiU2VuZGluZyBieXRlcyByZWFkIHJlcG9ydFxuIik7Ci0gICAgICAgICAgICBpZiAoKHJldCA9IGdlbl9ieXRlc19yZWFkKHMsIHJ0LCBycGt0LnRpbWVzdGFtcCArIDEpKSA8IDApCisgICAgICAgICAgICBpZiAoKHJldCA9IGdlbl9ieXRlc19yZWFkKHMsIHJ0LCBycGt0LnRpbWVzdGFtcCArIDEpKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmZl9ydG1wX3BhY2tldF9kZXN0cm95KCZycGt0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQogICAgICAgICAgICAgcnQtPmxhc3RfYnl0ZXNfcmVhZCA9IHJ0LT5ieXRlc19yZWFkOwogICAgICAgICB9CiAKQEAgLTI0NzAsNyArMjQ4NCw3IEBACiAgICAgICAgIH0gZWxzZSBpZiAocnBrdC50eXBlID09IFJUTVBfUFRfTUVUQURBVEEpIHsKICAgICAgICAgICAgIHJldCA9IGhhbmRsZV9tZXRhZGF0YShydCwgJnJwa3QpOwogICAgICAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcnBrdCk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KICAgICAgICAgZmZfcnRtcF9wYWNrZXRfZGVzdHJveSgmcnBrdCk7CiAgICAgfQpAQCAtMjUxNCw3ICsyNTI4LDcgQEAKICAqLwogc3RhdGljIGludCBpbmplY3RfZmFrZV9kdXJhdGlvbl9tZXRhZGF0YShSVE1QQ29udGV4dCAqcnQpCiB7Ci0gICAgLy8gV2UgbmVlZCB0byBpbnNlcnQgdGhlIG1ldGRhdGEgcGFja2V0IGRpcmVjdGx5IGFmdGVyIHRoZSBGTFYKKyAgICAvLyBXZSBuZWVkIHRvIGluc2VydCB0aGUgbWV0YWRhdGEgcGFja2V0IGRpcmVjdGx5IGFmdGVyIHRoZSBGTFYKICAgICAvLyBoZWFkZXIsIGkuZS4gd2UgbmVlZCB0byBtb3ZlIGFsbCBvdGhlciBhbHJlYWR5IHJlYWQgZGF0YSBieSB0aGUKICAgICAvLyBzaXplIG9mIG91ciBmYWtlIG1ldGFkYXRhIHBhY2tldC4KIApAQCAtMjU3NSwxNCArMjU4OSwxMyBAQAogICogICAgICAgICAgICAgYW5kICdwbGF5cGF0aCcgaXMgYSBmaWxlIG5hbWUgKHRoZSByZXN0IG9mIHRoZSBwYXRoLAogICogICAgICAgICAgICAgbWF5IGJlIHByZWZpeGVkIHdpdGggIm1wNDoiKQogICovCi1zdGF0aWMgaW50IHJ0bXBfb3BlbihVUkxDb250ZXh0ICpzLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncykKK3N0YXRpYyBpbnQgcnRtcF9vcGVuKFVSTENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzLCBBVkRpY3Rpb25hcnkgKipvcHRzKQogewogICAgIFJUTVBDb250ZXh0ICpydCA9IHMtPnByaXZfZGF0YTsKICAgICBjaGFyIHByb3RvWzhdLCBob3N0bmFtZVsyNTZdLCBwYXRoWzEwMjRdLCBhdXRoWzEwMF0sICpmbmFtZTsKICAgICBjaGFyICpvbGRfYXBwLCAqcW1hcmssICpuLCBmbmFtZV9idWZmZXJbMTAyNF07CiAgICAgdWludDhfdCBidWZbMjA0OF07CiAgICAgaW50IHBvcnQ7Ci0gICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gTlVMTDsKICAgICBpbnQgcmV0OwogCiAgICAgaWYgKHJ0LT5saXN0ZW5fdGltZW91dCA+IDApCkBAIC0yNjE5LDcgKzI2MzIsNyBAQAogICAgIH0KICAgICBpZiAoIXN0cmNtcChwcm90bywgInJ0bXB0IikgfHwgIXN0cmNtcChwcm90bywgInJ0bXB0cyIpKSB7CiAgICAgICAgIGlmICghc3RyY21wKHByb3RvLCAicnRtcHRzIikpCi0gICAgICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgImZmcnRtcGh0dHBfdGxzIiwgIjEiLCAxKTsKKyAgICAgICAgICAgIGF2X2RpY3Rfc2V0KG9wdHMsICJmZnJ0bXBodHRwX3RscyIsICIxIiwgMSk7CiAKICAgICAgICAgLyogb3BlbiB0aGUgaHR0cCB0dW5uZWxpbmcgY29ubmVjdGlvbiAqLwogICAgICAgICBmZl91cmxfam9pbihidWYsIHNpemVvZihidWYpLCAiZmZydG1waHR0cCIsIE5VTEwsIGhvc3RuYW1lLCBwb3J0LCBOVUxMKTsKQEAgLTI2MzAsNyArMjY0Myw3IEBACiAgICAgICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ0bHMiLCBOVUxMLCBob3N0bmFtZSwgcG9ydCwgTlVMTCk7CiAgICAgfSBlbHNlIGlmICghc3RyY21wKHByb3RvLCAicnRtcGUiKSB8fCAoIXN0cmNtcChwcm90bywgInJ0bXB0ZSIpKSkgewogICAgICAgICBpZiAoIXN0cmNtcChwcm90bywgInJ0bXB0ZSIpKQotICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJmZnJ0bXBjcnlwdF90dW5uZWxpbmciLCAiMSIsIDEpOworICAgICAgICAgICAgYXZfZGljdF9zZXQob3B0cywgImZmcnRtcGNyeXB0X3R1bm5lbGluZyIsICIxIiwgMSk7CiAKICAgICAgICAgLyogb3BlbiB0aGUgZW5jcnlwdGVkIGNvbm5lY3Rpb24gKi8KICAgICAgICAgZmZfdXJsX2pvaW4oYnVmLCBzaXplb2YoYnVmKSwgImZmcnRtcGNyeXB0IiwgTlVMTCwgaG9zdG5hbWUsIHBvcnQsIE5VTEwpOwpAQCAtMjY0OSw4ICsyNjYyLDggQEAKIAogcmVjb25uZWN0OgogICAgIGlmICgocmV0ID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJnJ0LT5zdHJlYW0sIGJ1ZiwgQVZJT19GTEFHX1JFQURfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb3RvY29sX3doaXRlbGlzdCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb3RvY29sX3doaXRlbGlzdCwgcy0+cHJvdG9jb2xfYmxhY2tsaXN0LCBzKSkgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhzICwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IG9wZW4gY29ubmVjdGlvbiAlc1xuIiwgYnVmKTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KQEAgLTI3ODIsMTMgKzI3OTUsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHJ0LT5jbGllbnRfcmVwb3J0X3NpemUgPSAxMDQ4NTc2OworICAgIHJ0LT5yZWNlaXZlX3JlcG9ydF9zaXplID0gMTA0ODU3NjsKICAgICBydC0+Ynl0ZXNfcmVhZCA9IDA7CiAgICAgcnQtPmhhc19hdWRpbyA9IDA7CiAgICAgcnQtPmhhc192aWRlbyA9IDA7CiAgICAgcnQtPnJlY2VpdmVkX21ldGFkYXRhID0gMDsKICAgICBydC0+bGFzdF9ieXRlc19yZWFkID0gMDsKLSAgICBydC0+c2VydmVyX2J3ID0gMjUwMDAwMDsKKyAgICBydC0+bWF4X3NlbnRfdW5hY2tlZCA9IDI1MDAwMDA7CiAgICAgcnQtPmR1cmF0aW9uID0gMDsKIAogICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJQcm90byA9ICVzLCBwYXRoID0gJXMsIGFwcCA9ICVzLCBmbmFtZSA9ICVzXG4iLApAQCAtMjg2Nyw3ICsyODgwLDcgQEAKICAgICByZXR1cm4gMDsKIAogZmFpbDoKLSAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgIGF2X2RpY3RfZnJlZShvcHRzKTsKICAgICBydG1wX2Nsb3NlKHMpOwogICAgIHJldHVybiByZXQ7CiB9CkBAIC0zMTEwLDkgKzMxMjMsOSBAQAogICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULCAgICAgICAgIFwKIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotVVJMUHJvdG9jb2wgZmZfIyNmbGF2b3IjI19wcm90b2NvbCA9IHsgICAgICAgICAgIFwKK2NvbnN0IFVSTFByb3RvY29sIGZmXyMjZmxhdm9yIyNfcHJvdG9jb2wgPSB7ICAgICBcCiAgICAgLm5hbWUgICAgICAgICAgID0gI2ZsYXZvciwgICAgICAgICAgICAgICAgICAgXAotICAgIC51cmxfb3BlbiAgICAgICA9IHJ0bXBfb3BlbiwgICAgICAgICAgICAgICAgIFwKKyAgICAudXJsX29wZW4yICAgICAgPSBydG1wX29wZW4sICAgICAgICAgICAgICAgICBcCiAgICAgLnVybF9yZWFkICAgICAgID0gcnRtcF9yZWFkLCAgICAgICAgICAgICAgICAgXAogICAgIC51cmxfcmVhZF9zZWVrICA9IHJ0bXBfc2VlaywgICAgICAgICAgICAgICAgIFwKICAgICAudXJsX3JlYWRfcGF1c2UgPSBydG1wX3BhdXNlLCAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHAuYyBiL2xpYmF2Zm9ybWF0L3J0cC5jCmluZGV4IDRkNDEzNTAuLjQ3NDVlNTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cC5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cC5jCkBAIC02OCwxOSArNjgsMTkgQEAKICAgey0xLCAiIiwgICAgICAgICAgIEFWTUVESUFfVFlQRV9VTktOT1dOLCBBVl9DT0RFQ19JRF9OT05FLCAtMSwgLTF9CiB9OwogCi1pbnQgZmZfcnRwX2dldF9jb2RlY19pbmZvKEFWQ29kZWNDb250ZXh0ICpjb2RlYywgaW50IHBheWxvYWRfdHlwZSkKK2ludCBmZl9ydHBfZ2V0X2NvZGVjX2luZm8oQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgaW50IHBheWxvYWRfdHlwZSkKIHsKICAgICBpbnQgaSA9IDA7CiAKICAgICBmb3IgKGkgPSAwOyBydHBfcGF5bG9hZF90eXBlc1tpXS5wdCA+PSAwOyBpKyspCiAgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5wdCA9PSBwYXlsb2FkX3R5cGUpIHsKICAgICAgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPSBydHBfcGF5bG9hZF90eXBlc1tpXS5jb2RlY190eXBlOwotICAgICAgICAgICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmNvZGVjX2lkOworICAgICAgICAgICAgICAgIHBhci0+Y29kZWNfdHlwZSA9IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmNvZGVjX3R5cGU7CisgICAgICAgICAgICAgICAgcGFyLT5jb2RlY19pZCA9IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmNvZGVjX2lkOwogICAgICAgICAgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5hdWRpb19jaGFubmVscyA+IDApCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjLT5jaGFubmVscyA9IHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmF1ZGlvX2NoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICBwYXItPmNoYW5uZWxzID0gcnRwX3BheWxvYWRfdHlwZXNbaV0uYXVkaW9fY2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgaWYgKHJ0cF9wYXlsb2FkX3R5cGVzW2ldLmNsb2NrX3JhdGUgPiAwKQotICAgICAgICAgICAgICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUgPSBydHBfcGF5bG9hZF90eXBlc1tpXS5jbG9ja19yYXRlOworICAgICAgICAgICAgICAgICAgICBwYXItPnNhbXBsZV9yYXRlID0gcnRwX3BheWxvYWRfdHlwZXNbaV0uY2xvY2tfcmF0ZTsKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODgsNyArODgsNyBAQAogfQogCiBpbnQgZmZfcnRwX2dldF9wYXlsb2FkX3R5cGUoQVZGb3JtYXRDb250ZXh0ICpmbXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjLCBpbnQgaWR4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIGludCBpZHgpCiB7CiAgICAgaW50IGk7CiAgICAgQVZPdXRwdXRGb3JtYXQgKm9mbXQgPSBmbXQgPyBmbXQtPm9mb3JtYXQgOiBOVUxMOwpAQCAtMTAzLDI3ICsxMDMsMjcgQEAKIAogICAgIC8qIHN0YXRpYyBwYXlsb2FkIHR5cGUgKi8KICAgICBmb3IgKGkgPSAwOyBydHBfcGF5bG9hZF90eXBlc1tpXS5wdCA+PSAwOyArK2kpCi0gICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5jb2RlY19pZCA9PSBjb2RlYy0+Y29kZWNfaWQpIHsKLSAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2MyAmJiAoIWZtdCB8fCAhZm10LT5vZm9ybWF0IHx8CisgICAgICAgIGlmIChydHBfcGF5bG9hZF90eXBlc1tpXS5jb2RlY19pZCA9PSBwYXItPmNvZGVjX2lkKSB7CisgICAgICAgICAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzICYmICghZm10IHx8ICFmbXQtPm9mb3JtYXQgfHwKICAgICAgICAgICAgICAgICAhZm10LT5vZm9ybWF0LT5wcml2X2NsYXNzIHx8ICFmbXQtPnByaXZfZGF0YSB8fAogICAgICAgICAgICAgICAgICFhdl9vcHRfZmxhZ19pc19zZXQoZm10LT5wcml2X2RhdGEsICJydHBmbGFncyIsICJyZmMyMTkwIikpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgLyogRzcyMiBoYXMgODAwMCBhcyBub21pbmFsIHJhdGUgZXZlbiBpZiB0aGUgc2FtcGxlIHJhdGUgaXMgMTYwMDAsCiAgICAgICAgICAgICAgKiBzZWUgc2VjdGlvbiA0LjUuMiBpbiBSRkMgMzU1MS4gKi8KLSAgICAgICAgICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQURQQ01fRzcyMiAmJgotICAgICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfcmF0ZSA9PSAxNjAwMCAmJiBjb2RlYy0+Y2hhbm5lbHMgPT0gMSkKKyAgICAgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FEUENNX0c3MjIgJiYKKyAgICAgICAgICAgICAgICBwYXItPnNhbXBsZV9yYXRlID09IDE2MDAwICYmIHBhci0+Y2hhbm5lbHMgPT0gMSkKICAgICAgICAgICAgICAgICByZXR1cm4gcnRwX3BheWxvYWRfdHlwZXNbaV0ucHQ7Ci0gICAgICAgICAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgogICAgICAgICAgICAgICAgICgocnRwX3BheWxvYWRfdHlwZXNbaV0uY2xvY2tfcmF0ZSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfcmF0ZSAhPSBydHBfcGF5bG9hZF90eXBlc1tpXS5jbG9ja19yYXRlKSB8fAorICAgICAgICAgICAgICAgICAgcGFyLT5zYW1wbGVfcmF0ZSAhPSBydHBfcGF5bG9hZF90eXBlc1tpXS5jbG9ja19yYXRlKSB8fAogICAgICAgICAgICAgICAgICAocnRwX3BheWxvYWRfdHlwZXNbaV0uYXVkaW9fY2hhbm5lbHMgPiAwICYmCi0gICAgICAgICAgICAgICAgICBjb2RlYy0+Y2hhbm5lbHMgIT0gcnRwX3BheWxvYWRfdHlwZXNbaV0uYXVkaW9fY2hhbm5lbHMpKSkKKyAgICAgICAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgIT0gcnRwX3BheWxvYWRfdHlwZXNbaV0uYXVkaW9fY2hhbm5lbHMpKSkKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIHJldHVybiBydHBfcGF5bG9hZF90eXBlc1tpXS5wdDsKICAgICAgICAgfQogCiAgICAgaWYgKGlkeCA8IDApCi0gICAgICAgIGlkeCA9IGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgaWR4ID0gcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTzsKIAogICAgIC8qIGR5bmFtaWMgcGF5bG9hZCB0eXBlICovCiAgICAgcmV0dXJuIFJUUF9QVF9QUklWQVRFICsgaWR4OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwLmggYi9saWJhdmZvcm1hdC9ydHAuaAppbmRleCA2NmE0ZjNhLi41NDUxMmM2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHAuaAorKysgYi9saWJhdmZvcm1hdC9ydHAuaApAQCAtMzIsMTEgKzMyLDExIEBACiAgKiBUaGUgZm9ybWF0IGNvbnRleHQgcHJpdmF0ZSBvcHRpb24gcGF5bG9hZF90eXBlIG92ZXJyaWRlcyBib3RoLgogICoKICAqIEBwYXJhbSBmbXQgICBUaGUgY29udGV4dCBvZiB0aGUgZm9ybWF0Ci0gKiBAcGFyYW0gY29kZWMgVGhlIGNvbnRleHQgb2YgdGhlIGNvZGVjCisgKiBAcGFyYW0gcGFyICAgVGhlIGNvZGVjIHBhcmFtZXRlcnMKICAqIEBwYXJhbSBpZHggICBUaGUgc3RyZWFtIGluZGV4CiAgKiBAcmV0dXJuIFRoZSBwYXlsb2FkIHR5cGUgKHRoZSAnUFQnIGZpZWxkIGluIHRoZSBSVFAgaGVhZGVyKS4KICAqLwotaW50IGZmX3J0cF9nZXRfcGF5bG9hZF90eXBlKEFWRm9ybWF0Q29udGV4dCAqZm10LCBBVkNvZGVjQ29udGV4dCAqY29kZWMsCitpbnQgZmZfcnRwX2dldF9wYXlsb2FkX3R5cGUoQVZGb3JtYXRDb250ZXh0ICpmbXQsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCk7CiAKIC8qKgpAQCAtNDYsMTIgKzQ2LDEyIEBACiAgKiBpbmZvcm1hdGlvbiBkZXBlbmRpbmcgb24gdGhlIHBheWxvYWQgdHlwZTsgZm9yIGF1ZGlvIGNvZGVjcywgdGhlCiAgKiBjaGFubmVscyBhbmQgc2FtcGxlX3JhdGUgZmllbGRzIGFyZSBhbHNvIGZpbGxlZC4KICAqCi0gKiBAcGFyYW0gY29kZWMgVGhlIGNvbnRleHQgb2YgdGhlIGNvZGVjCisgKiBAcGFyYW0gcGFyIFRoZSBjb2RlYyBwYXJhbWV0ZXJzCiAgKiBAcGFyYW0gcGF5bG9hZF90eXBlIFRoZSBwYXlsb2FkIHR5cGUgKHRoZSAnUFQnIGZpZWxkIGluIHRoZSBSVFAgaGVhZGVyKQogICogQHJldHVybiBJbiBjYXNlIG9mIHVua25vd24gcGF5bG9hZCB0eXBlIG9yIGR5bmFtaWMgcGF5bG9hZCB0eXBlLCBhCiAgKiBuZWdhdGl2ZSB2YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAwIGlzIHJldHVybmVkCiAgKi8KLWludCBmZl9ydHBfZ2V0X2NvZGVjX2luZm8oQVZDb2RlY0NvbnRleHQgKmNvZGVjLCBpbnQgcGF5bG9hZF90eXBlKTsKK2ludCBmZl9ydHBfZ2V0X2NvZGVjX2luZm8oQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgaW50IHBheWxvYWRfdHlwZSk7CiAKIC8qKgogICogUmV0dXJuIHRoZSBlbmNvZGluZyBuYW1lIChhcyBkZWZpbmVkIGluCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBkZWMuYyBiL2xpYmF2Zm9ybWF0L3J0cGRlYy5jCmluZGV4IGMzZTUwZDQuLmU3NWEzNGMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlYy5jCkBAIC0yMSw4ICsyMSw5IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWUuaCIKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2dldF9iaXRzLmgiCisKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgIm5ldHdvcmsuaCIKICNpbmNsdWRlICJzcnRwLmgiCkBAIC0zMiw2ICszMywxMiBAQAogCiAjZGVmaW5lIE1JTl9GRUVEQkFDS19JTlRFUlZBTCAyMDAwMDAgLyogMjAwIG1zIGluIHVzICovCiAKK3N0YXRpYyBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGwyNF9keW5hbWljX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgPSAiTDI0IiwKKyAgICAuY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKKyAgICAuY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1BDTV9TMjRCRSwKK307CisKIHN0YXRpYyBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGdzbV9keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmVuY19uYW1lICAgPSAiR1NNIiwKICAgICAuY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywKQEAgLTYyLDgxICs2OSwxMDQgQEAKICAgICAuY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RFWFQsCiB9OwogCi1zdGF0aWMgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqcnRwX2ZpcnN0X2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyID0gTlVMTDsKK2V4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3JkdF92aWRlb19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcmR0X2F1ZGlvX2hhbmRsZXI7CitleHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9yZHRfbGl2ZV92aWRlb19oYW5kbGVyOworZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcmR0X2xpdmVfYXVkaW9faGFuZGxlcjsKIAotdm9pZCBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcihSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyKQorc3RhdGljIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKnJ0cF9keW5hbWljX3Byb3RvY29sX2hhbmRsZXJfbGlzdFtdID0geworICAgIC8qIHJ0cCAqLworICAgICZmZl9hYzNfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9hbXJfbmJfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9hbXJfd2JfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9kdl9keW5hbWljX2hhbmRsZXIsCisgICAgJmZmX2c3MjZfMTZfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9nNzI2XzI0X2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfZzcyNl8zMl9keW5hbWljX2hhbmRsZXIsCisgICAgJmZmX2c3MjZfNDBfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9nNzI2bGVfMTZfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9nNzI2bGVfMjRfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9nNzI2bGVfMzJfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9nNzI2bGVfNDBfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9oMjYxX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfaDI2M18xOTk4X2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfaDI2M18yMDAwX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfaDI2M19yZmMyMTkwX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfaDI2NF9keW5hbWljX2hhbmRsZXIsCisgICAgJmZmX2hldmNfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9pbGJjX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfanBlZ19keW5hbWljX2hhbmRsZXIsCisgICAgJmZmX21wNGFfbGF0bV9keW5hbWljX2hhbmRsZXIsCisgICAgJmZmX21wNHZfZXNfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9tcGVnX2F1ZGlvX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfbXBlZ19hdWRpb19yb2J1c3RfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl9tcGVnX3ZpZGVvX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfbXBlZzRfZ2VuZXJpY19keW5hbWljX2hhbmRsZXIsCisgICAgJmZmX21wZWd0c19keW5hbWljX2hhbmRsZXIsCisgICAgJmZmX21zX3J0cF9hc2ZfcGZhX2hhbmRsZXIsCisgICAgJmZmX21zX3J0cF9hc2ZfcGZ2X2hhbmRsZXIsCisgICAgJmZmX3FjZWxwX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfcWRtMl9keW5hbWljX2hhbmRsZXIsCisgICAgJmZmX3F0X3J0cF9hdWRfaGFuZGxlciwKKyAgICAmZmZfcXRfcnRwX3ZpZF9oYW5kbGVyLAorICAgICZmZl9xdWlja3RpbWVfcnRwX2F1ZF9oYW5kbGVyLAorICAgICZmZl9xdWlja3RpbWVfcnRwX3ZpZF9oYW5kbGVyLAorICAgICZmZl9yZmM0MTc1X3J0cF9oYW5kbGVyLAorICAgICZmZl9zdnEzX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfdGhlb3JhX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmZmZfdmMyaHFfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl92b3JiaXNfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl92cDhfZHluYW1pY19oYW5kbGVyLAorICAgICZmZl92cDlfZHluYW1pY19oYW5kbGVyLAorICAgICZnc21fZHluYW1pY19oYW5kbGVyLAorICAgICZsMjRfZHluYW1pY19oYW5kbGVyLAorICAgICZvcHVzX2R5bmFtaWNfaGFuZGxlciwKKyAgICAmcmVhbG1lZGlhX21wM19keW5hbWljX2hhbmRsZXIsCisgICAgJnNwZWV4X2R5bmFtaWNfaGFuZGxlciwKKyAgICAmdDE0MF9keW5hbWljX2hhbmRsZXIsCisgICAgLyogcmR0ICovCisgICAgJmZmX3JkdF92aWRlb19oYW5kbGVyLAorICAgICZmZl9yZHRfYXVkaW9faGFuZGxlciwKKyAgICAmZmZfcmR0X2xpdmVfdmlkZW9faGFuZGxlciwKKyAgICAmZmZfcmR0X2xpdmVfYXVkaW9faGFuZGxlciwKKyAgICBOVUxMLAorfTsKKworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqZmZfcnRwX2hhbmRsZXJfaXRlcmF0ZSh2b2lkICoqb3BhcXVlKQogewotICAgIGhhbmRsZXItPm5leHQgPSBydHBfZmlyc3RfZHluYW1pY19wYXlsb2FkX2hhbmRsZXI7Ci0gICAgcnRwX2ZpcnN0X2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyID0gaGFuZGxlcjsKKyAgICB1aW50cHRyX3QgaSA9ICh1aW50cHRyX3QpKm9wYXF1ZTsKKyAgICBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpyID0gcnRwX2R5bmFtaWNfcHJvdG9jb2xfaGFuZGxlcl9saXN0W2ldOworCisgICAgaWYgKHIpCisgICAgICAgICpvcGFxdWUgPSAodm9pZCopKGkgKyAxKTsKKworICAgIHJldHVybiByOwogfQogCi12b2lkIGZmX3JlZ2lzdGVyX3J0cF9keW5hbWljX3BheWxvYWRfaGFuZGxlcnModm9pZCkKLXsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfYWMzX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2Ftcl9uYl9keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9hbXJfd2JfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfZHZfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfZzcyNl8xNl9keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9nNzI2XzI0X2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2c3MjZfMzJfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfZzcyNl80MF9keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9oMjYxX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2gyNjNfMTk5OF9keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9oMjYzXzIwMDBfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfaDI2M19yZmMyMTkwX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2gyNjRfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfaGV2Y19keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9pbGJjX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX2pwZWdfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfbXA0YV9sYXRtX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX21wNHZfZXNfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfbXBlZ19hdWRpb19keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9tcGVnX2F1ZGlvX3JvYnVzdF9keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9tcGVnX3ZpZGVvX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX21wZWc0X2dlbmVyaWNfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfbXBlZ3RzX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX21zX3J0cF9hc2ZfcGZhX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9tc19ydHBfYXNmX3Bmdl9oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfcWNlbHBfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfcWRtMl9keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9xdF9ydHBfYXVkX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9xdF9ydHBfdmlkX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl9xdWlja3RpbWVfcnRwX2F1ZF9oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfcXVpY2t0aW1lX3J0cF92aWRfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX3N2cTNfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfdGhlb3JhX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmZmX3ZvcmJpc19keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZmZl92cDhfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmZmZfdnA5X2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJmdzbV9keW5hbWljX2hhbmRsZXIpOwotICAgIGZmX3JlZ2lzdGVyX2R5bmFtaWNfcGF5bG9hZF9oYW5kbGVyKCZvcHVzX2R5bmFtaWNfaGFuZGxlcik7Ci0gICAgZmZfcmVnaXN0ZXJfZHluYW1pY19wYXlsb2FkX2hhbmRsZXIoJnJlYWxtZWRpYV9tcDNfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmc3BlZXhfZHluYW1pY19oYW5kbGVyKTsKLSAgICBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcigmdDE0MF9keW5hbWljX2hhbmRsZXIpOwotfQotCi1SVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpmZl9ydHBfaGFuZGxlcl9maW5kX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSwKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmZmX3J0cF9oYW5kbGVyX2ZpbmRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgY29kZWNfdHlwZSkKIHsKLSAgICBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyOwotICAgIGZvciAoaGFuZGxlciA9IHJ0cF9maXJzdF9keW5hbWljX3BheWxvYWRfaGFuZGxlcjsKLSAgICAgICAgIGhhbmRsZXI7IGhhbmRsZXIgPSBoYW5kbGVyLT5uZXh0KQorICAgIHZvaWQgKmkgPSAwOworICAgIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXI7CisgICAgd2hpbGUgKGhhbmRsZXIgPSBmZl9ydHBfaGFuZGxlcl9pdGVyYXRlKCZpKSkgewogICAgICAgICBpZiAoaGFuZGxlci0+ZW5jX25hbWUgJiYKICAgICAgICAgICAgICFhdl9zdHJjYXNlY21wKG5hbWUsIGhhbmRsZXItPmVuY19uYW1lKSAmJgogICAgICAgICAgICAgY29kZWNfdHlwZSA9PSBoYW5kbGVyLT5jb2RlY190eXBlKQogICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXI7CisgICAgfQogICAgIHJldHVybiBOVUxMOwogfQogCi1SVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpmZl9ydHBfaGFuZGxlcl9maW5kX2J5X2lkKGludCBpZCwKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmZmX3J0cF9oYW5kbGVyX2ZpbmRfYnlfaWQoaW50IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIGNvZGVjX3R5cGUpCiB7Ci0gICAgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlcjsKLSAgICBmb3IgKGhhbmRsZXIgPSBydHBfZmlyc3RfZHluYW1pY19wYXlsb2FkX2hhbmRsZXI7Ci0gICAgICAgICBoYW5kbGVyOyBoYW5kbGVyID0gaGFuZGxlci0+bmV4dCkKKyAgICB2b2lkICppID0gMDsKKyAgICBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyOworICAgIHdoaWxlIChoYW5kbGVyID0gZmZfcnRwX2hhbmRsZXJfaXRlcmF0ZSgmaSkpIHsKICAgICAgICAgaWYgKGhhbmRsZXItPnN0YXRpY19wYXlsb2FkX2lkICYmIGhhbmRsZXItPnN0YXRpY19wYXlsb2FkX2lkID09IGlkICYmCiAgICAgICAgICAgICBjb2RlY190eXBlID09IGhhbmRsZXItPmNvZGVjX3R5cGUpCiAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTE1MCw4ICsxODAsNyBAQAogICAgICAgICBzd2l0Y2ggKGJ1ZlsxXSkgewogICAgICAgICBjYXNlIFJUQ1BfU1I6CiAgICAgICAgICAgICBpZiAocGF5bG9hZF9sZW4gPCAyMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGxlbmd0aCBmb3IgUlRDUCBTUiBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIGF2X2xvZyhzLT5pYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBSVENQIFNSIHBhY2tldCBsZW5ndGhcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogCkBAIC01MDQsNyArNTMzLDcgQEAKIAogLyoqCiAgKiBvcGVuIGEgbmV3IFJUUCBwYXJzZSBjb250ZXh0IGZvciBzdHJlYW0gJ3N0Jy4gJ3N0JyBjYW4gYmUgTlVMTCBmb3IKLSAqIE1QRUcyLVRTIHN0cmVhbXMuCisgKiBNUEVHLTIgVFMgc3RyZWFtcy4KICAqLwogUlRQRGVtdXhDb250ZXh0ICpmZl9ydHBfcGFyc2Vfb3BlbihBVkZvcm1hdENvbnRleHQgKnMxLCBBVlN0cmVhbSAqc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXlsb2FkX3R5cGUsIGludCBxdWV1ZV9zaXplKQpAQCAtNTIxLDE3ICs1NTAsMTcgQEAKICAgICBzLT5zdCAgICAgICAgICAgICAgICAgID0gc3Q7CiAgICAgcy0+cXVldWVfc2l6ZSAgICAgICAgICA9IHF1ZXVlX3NpemU7CiAKLSAgICBhdl9sb2cocy0+c3QgPyBzLT5zdC0+Y29kZWMgOiBOVUxMLCBBVl9MT0dfVkVSQk9TRSwKLSAgICAgICAgICAgICJzZXR0aW5nIGppdHRlciBidWZmZXIgc2l6ZSB0byAlZFxuIiwgcy0+cXVldWVfc2l6ZSk7CisgICAgYXZfbG9nKHMtPmljLCBBVl9MT0dfVkVSQk9TRSwgInNldHRpbmcgaml0dGVyIGJ1ZmZlciBzaXplIHRvICVkXG4iLAorICAgICAgICAgICBzLT5xdWV1ZV9zaXplKTsKIAogICAgIHJ0cF9pbml0X3N0YXRpc3RpY3MoJnMtPnN0YXRpc3RpY3MsIDApOwogICAgIGlmIChzdCkgewotICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyMjoKICAgICAgICAgICAgIC8qIEFjY29yZGluZyB0byBSRkMgMzU1MSwgdGhlIHN0cmVhbSBjbG9jayByYXRlIGlzIDgwMDAKICAgICAgICAgICAgICAqIGV2ZW4gaWYgdGhlIHNhbXBsZSByYXRlIGlzIDE2MDAwLiAqLwotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPT0gODAwMCkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gMTYwMDA7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9PSA4MDAwKQorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSAxNjAwMDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYnJlYWs7CkBAIC01NDMsNyArNTcyLDcgQEAKIH0KIAogdm9pZCBmZl9ydHBfcGFyc2Vfc2V0X2R5bmFtaWNfcHJvdG9jb2woUlRQRGVtdXhDb250ZXh0ICpzLCBQYXlsb2FkQ29udGV4dCAqY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXIpCiB7CiAgICAgcy0+ZHluYW1pY19wcm90b2NvbF9jb250ZXh0ID0gY3R4OwogICAgIHMtPmhhbmRsZXIgICAgICAgICAgICAgICAgICA9IGhhbmRsZXI7CkBAIC02MjMsNyArNjUyLDcgQEAKICAgICBzdCA9IHMtPnN0OwogICAgIC8vIG9ubHkgZG8gc29tZXRoaW5nIHdpdGggdGhpcyBpZiBhbGwgdGhlIHJ0cCBjaGVja3MgcGFzcy4uLgogICAgIGlmICghcnRwX3ZhbGlkX3BhY2tldF9pbl9zZXF1ZW5jZSgmcy0+c3RhdGlzdGljcywgc2VxKSkgewotICAgICAgICBhdl9sb2coc3QgPyBzdC0+Y29kZWMgOiBOVUxMLCBBVl9MT0dfRVJST1IsCisgICAgICAgIGF2X2xvZyhzLT5pYywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIlJUUDogUFQ9JTAyeDogYmFkIGNzZXEgJTA0eCBleHBlY3RlZD0lMDR4XG4iLAogICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBzZXEsICgocy0+c2VxICsgMSkgJiAweGZmZmYpKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNzM3LDcgKzc2Niw3IEBACiAgICAgICAgIHJldHVybiAtMTsKIAogICAgIGlmICghaGFzX25leHRfcGFja2V0KHMpKQotICAgICAgICBhdl9sb2cocy0+c3QgPyBzLT5zdC0+Y29kZWMgOiBOVUxMLCBBVl9MT0dfV0FSTklORywKKyAgICAgICAgYXZfbG9nKHMtPmljLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICJSVFA6IG1pc3NlZCAlZCBwYWNrZXRzXG4iLCBzLT5xdWV1ZS0+c2VxIC0gcy0+c2VxIC0gMSk7CiAKICAgICAvKiBQYXJzZSB0aGUgZmlyc3QgcGFja2V0IGluIHRoZSBxdWV1ZSwgYW5kIGRlcXVldWUgaXQgKi8KQEAgLTgwNCw3ICs4MzMsNyBAQAogICAgICAgICBpbnQxNl90IGRpZmYgPSBzZXEgLSBzLT5zZXE7CiAgICAgICAgIGlmIChkaWZmIDwgMCkgewogICAgICAgICAgICAgLyogUGFja2V0IG9sZGVyIHRoYW4gdGhlIHByZXZpb3VzbHkgZW1pdHRlZCBvbmUsIGRyb3AgKi8KLSAgICAgICAgICAgIGF2X2xvZyhzLT5zdCA/IHMtPnN0LT5jb2RlYyA6IE5VTEwsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgYXZfbG9nKHMtPmljLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAiUlRQOiBkcm9wcGluZyBvbGQgcGFja2V0IHJlY2VpdmVkIHRvbyBsYXRlXG4iKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfSBlbHNlIGlmIChkaWZmIDw9IDEpIHsKQEAgLTgyMCw4ICs4NDksNyBAQAogICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBmaXJzdCBlbnF1ZXVlZCBwYWNrZXQgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwsCiAgICAgICAgICAgICAgKiBldmVuIGlmIHdlJ3JlIG1pc3Npbmcgc29tZXRoaW5nICovCiAgICAgICAgICAgICBpZiAocy0+cXVldWVfbGVuID49IHMtPnF1ZXVlX3NpemUpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocy0+c3QgPyBzLT5zdC0+Y29kZWMgOiBOVUxMLCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgImppdHRlciBidWZmZXIgZnVsbFxuIik7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMtPmljLCBBVl9MT0dfV0FSTklORywgImppdHRlciBidWZmZXIgZnVsbFxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJ0cF9wYXJzZV9xdWV1ZWRfcGFja2V0KHMsIHBrdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gLTE7CkBAIC04NDYsNyArODc0LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIHJ2ID0gcnRwX3BhcnNlX29uZV9wYWNrZXQocywgcGt0LCBidWZwdHIsIGxlbik7CiAgICAgcy0+cHJldl9yZXQgPSBydjsKLSAgICB3aGlsZSAocnYgPT0gQVZFUlJPUihFQUdBSU4pICYmIGhhc19uZXh0X3BhY2tldChzKSkKKyAgICB3aGlsZSAocnYgPCAwICYmIGhhc19uZXh0X3BhY2tldChzKSkKICAgICAgICAgcnYgPSBydHBfcGFyc2VfcXVldWVkX3BhY2tldChzLCBwa3QpOwogICAgIHJldHVybiBydiA/IHJ2IDogaGFzX25leHRfcGFja2V0KHMpOwogfQpAQCAtODcxLDcgKzg5OSw3IEBACiAgICAgaW50IHZhbHVlX3NpemUgPSBzdHJsZW4ocCkgKyAxOwogCiAgICAgaWYgKCEodmFsdWUgPSBhdl9tYWxsb2ModmFsdWVfc2l6ZSkpKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWxsb2NhdGUgZGF0YSBmb3IgRk1UUC5cbiIpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRhdGEgZm9yIEZNVFAuXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlYy5oIGIvbGliYXZmb3JtYXQvcnRwZGVjLmgKaW5kZXggNzc1OTZiNi4uNWE0N2Q2ZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjLmgKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjLmgKQEAgLTQzLDcgKzQzLDcgQEAKIFJUUERlbXV4Q29udGV4dCAqZmZfcnRwX3BhcnNlX29wZW4oQVZGb3JtYXRDb250ZXh0ICpzMSwgQVZTdHJlYW0gKnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZF90eXBlLCBpbnQgcXVldWVfc2l6ZSk7CiB2b2lkIGZmX3J0cF9wYXJzZV9zZXRfZHluYW1pY19wcm90b2NvbChSVFBEZW11eENvbnRleHQgKnMsIFBheWxvYWRDb250ZXh0ICpjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXIpOwogdm9pZCBmZl9ydHBfcGFyc2Vfc2V0X2NyeXB0byhSVFBEZW11eENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnN1aXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbXMpOwogaW50IGZmX3J0cF9wYXJzZV9wYWNrZXQoUlRQRGVtdXhDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LApAQCAtMTkyLDEwICsxOTIsMzEgQEAKICAgICBQYXlsb2FkQ29udGV4dCAqZHluYW1pY19wcm90b2NvbF9jb250ZXh0OwogfTsKIAotdm9pZCBmZl9yZWdpc3Rlcl9keW5hbWljX3BheWxvYWRfaGFuZGxlcihSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyKTsKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmZmX3J0cF9oYW5kbGVyX2ZpbmRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lLAorLyoqCisgKiBJdGVyYXRlIG92ZXIgYWxsIHJlZ2lzdGVyZWQgcnRwIGR5bmFtaWMgcHJvdG9jb2wgaGFuZGxlcnMuCisgKgorICogQHBhcmFtIG9wYXF1ZSBhIHBvaW50ZXIgd2hlcmUgbGliYXZmb3JtYXQgd2lsbCBzdG9yZSB0aGUgaXRlcmF0aW9uIHN0YXRlLiBNdXN0CisgKiAgICAgICAgICAgICAgIHBvaW50IHRvIE5VTEwgdG8gc3RhcnQgdGhlIGl0ZXJhdGlvbi4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXh0IHJlZ2lzdGVyZWQgcnRwIGR5bmFtaWMgcHJvdG9jb2wgaGFuZGxlciBvciBOVUxMIHdoZW4gdGhlIGl0ZXJhdGlvbiBpcworICogICAgICAgICBmaW5pc2hlZAorICovCitjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpmZl9ydHBfaGFuZGxlcl9pdGVyYXRlKHZvaWQgKipvcGFxdWUpOworLyoqCisgKiBGaW5kIGEgcmVnaXN0ZXJlZCBydHAgZHluYW1pYyBwcm90b2NvbCBoYW5kbGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICoKKyAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHJlcXVlc3RlZCBydHAgZHluYW1pYyBwcm90b2NvbCBoYW5kbGVyCisgKiBAcmV0dXJuIEEgcnRwIGR5bmFtaWMgcHJvdG9jb2wgaGFuZGxlciBpZiBvbmUgd2FzIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAqLworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqZmZfcnRwX2hhbmRsZXJfZmluZF9ieV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgY29kZWNfdHlwZSk7Ci1SVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpmZl9ydHBfaGFuZGxlcl9maW5kX2J5X2lkKGludCBpZCwKKy8qKgorICogRmluZCBhIHJlZ2lzdGVyZWQgcnRwIGR5bmFtaWMgcHJvdG9jb2wgaGFuZGxlciB3aXRoIGEgbWF0Y2hpbmcgY29kZWMgSUQuCisgKgorICogQHBhcmFtIGlkIEFWQ29kZWNJRCBvZiB0aGUgcmVxdWVzdGVkIHJ0cCBkeW5hbWljIHByb3RvY29sIGhhbmRsZXIuCisgKiBAcmV0dXJuIEEgcnRwIGR5bmFtaWMgcHJvdG9jb2wgaGFuZGxlciBpZiBvbmUgd2FzIGZvdW5kLCBOVUxMIG90aGVyd2lzZS4KKyAqLworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqZmZfcnRwX2hhbmRsZXJfZmluZF9ieV9pZChpbnQgaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIGNvZGVjX3R5cGUpOwogCiAvKiBmcm9tIHJ0c3AuYywgYnV0IHVzZWQgYnkgcnRwIGR5bmFtaWMgcHJvdG9jb2wgaGFuZGxlcnMuICovCkBAIC0yMDksOCArMjMwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXR0ciwgY29uc3QgY2hhciAqdmFsdWUpKTsKIAotdm9pZCBmZl9yZWdpc3Rlcl9ydHBfZHluYW1pY19wYXlsb2FkX2hhbmRsZXJzKHZvaWQpOwotCiAvKioKICAqIENsb3NlIHRoZSBkeW5hbWljIGJ1ZmZlciBhbmQgbWFrZSBhIHBhY2tldCBmcm9tIGl0LgogICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBkZWNfYWMzLmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfYWMzLmMKaW5kZXggNDhiMmQ5Yy4uNTZhMzc5ZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjX2FjMy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19hYzMuYwpAQCAtMTIyLDcgKzEyMiw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYWMzX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYWMzX2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICAgID0gImFjMyIsCiAgICAgLmNvZGVjX3R5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAuY29kZWNfaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUMzLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX2Ftci5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX2Ftci5jCmluZGV4IDg0OGRiOWQuLjM1ZDMyMjIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19hbXIuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfYW1yLmMKQEAgLTU1LDIwICs1NSwyMCBAQAogICAgIGNvbnN0IHVpbnQ4X3QgKnNwZWVjaF9kYXRhOwogICAgIHVpbnQ4X3QgKnB0cjsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikgewogICAgICAgICBmcmFtZV9zaXplcyA9IGZyYW1lX3NpemVzX25iOwotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BTVJfV0IpIHsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX1dCKSB7CiAgICAgICAgIGZyYW1lX3NpemVzID0gZnJhbWVfc2l6ZXNfd2I7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQmFkIGNvZGVjIElEXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgIT0gMSkgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzICE9IDEpIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiT25seSBtb25vIEFNUiBpcyBzdXBwb3J0ZWRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKIAogICAgIC8qIFRoZSBBTVIgUlRQIHBhY2tldCBjb25zaXN0cyBvZiBvbmUgaGVhZGVyIGJ5dGUsIGZvbGxvd2VkCiAgICAgICogYnkgb25lIFRPQyBieXRlIGZvciBlYWNoIEFNUiBmcmFtZSBpbiB0aGUgcGFja2V0LCBmb2xsb3dlZApAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYW1yX25iX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYW1yX25iX2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICA9ICJBTVIiLAogICAgIC5jb2RlY190eXBlICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfQU1SX05CLApAQCAtMTkyLDcgKzE5Miw3IEBACiAgICAgLnBhcnNlX3BhY2tldCAgICAgPSBhbXJfaGFuZGxlX3BhY2tldCwKIH07CiAKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYW1yX3diX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYW1yX3diX2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICA9ICJBTVItV0IiLAogICAgIC5jb2RlY190eXBlICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfQU1SX1dCLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX2FzZi5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX2FzZi5jCmluZGV4IDJiMWRkZjEuLjU0ZmZlZjYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19hc2YuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfYXNmLmMKQEAgLTEwMSw3ICsxMDEsNyBAQAogewogICAgIGludCByZXQgPSAwOwogICAgIGlmIChhdl9zdHJzdGFydChwLCAicGdtcHU6ZGF0YTphcHBsaWNhdGlvbi92bmQubXMud21zLWhkci5hc2Z2MTtiYXNlNjQsIiwgJnApKSB7Ci0gICAgICAgIEFWSU9Db250ZXh0IHBiOworICAgICAgICBBVklPQ29udGV4dCBwYiA9IHsgMCB9OwogICAgICAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOwogICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOwogICAgICAgICBpbnQgbGVuID0gc3RybGVuKHApICogNiAvIDg7CkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgcnQtPmFzZl9jdHgtPnBiICAgICAgPSAmcGI7CiAgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibm9fcmVzeW5jX3NlYXJjaCIsICIxIiwgMCk7CiAKLSAgICAgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlbGlzdHMocnQtPmFzZl9jdHgsIHMpKSA8IDApIHsKKyAgICAgICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlYmxhY2tsaXN0cyhydC0+YXNmX2N0eCwgcykpIDwgMCkgewogICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KQEAgLTEzOSwxMiArMTM5LDEyIEBACiAgICAgICAgIHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJnJ0LT5hc2ZfY3R4LCAiIiwgaWZvcm1hdCwgJm9wdHMpOwogICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwogICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICAgICAgYXZfZnJlZShwYi5idWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBhdl9kaWN0X2NvcHkoJnMtPm1ldGFkYXRhLCBydC0+YXNmX2N0eC0+bWV0YWRhdGEsIDApOwogICAgICAgICBydC0+YXNmX3BiX3BvcyA9IGF2aW9fdGVsbCgmcGIpOwotICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgIGF2X2ZyZWUocGIuYnVmZmVyKTsKICAgICAgICAgcnQtPmFzZl9jdHgtPnBiID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIHJldDsKQEAgLTE2NSwxMiArMTY1LDEwIEBACiAKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBydC0+YXNmX2N0eC0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+aWQgPT0gcnQtPmFzZl9jdHgtPnN0cmVhbXNbaV0tPmlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjID0KLSAgICAgICAgICAgICAgICAgICAgICAgICpydC0+YXNmX2N0eC0+c3RyZWFtc1tpXS0+Y29kZWM7CisgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5hc2ZfY3R4LT5zdHJlYW1zW2ldLT5jb2RlY3Bhcik7CiAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+bmVlZF9wYXJzaW5nID0KICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5hc2ZfY3R4LT5zdHJlYW1zW2ldLT5uZWVkX3BhcnNpbmc7Ci0gICAgICAgICAgICAgICAgICAgIHJ0LT5hc2ZfY3R4LT5zdHJlYW1zW2ldLT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICBydC0+YXNmX2N0eC0+c3RyZWFtc1tpXS0+Y29kZWMtPmV4dHJhZGF0YSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdLCAzMiwgMSwgMTAwMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CkBAIC0zMDIsNyArMzAwLDcgQEAKIH0KIAogI2RlZmluZSBSVFBfQVNGX0hBTkRMRVIobiwgcywgdCkgXAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tc19ydHBfICMjIG4gIyMgX2hhbmRsZXIgPSB7IFwKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXNfcnRwXyAjIyBuICMjIF9oYW5kbGVyID0geyBcCiAgICAgLmVuY19uYW1lICAgICAgICAgPSBzLCBcCiAgICAgLmNvZGVjX3R5cGUgICAgICAgPSB0LCBcCiAgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLCBcCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBkZWNfZHYuYyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19kdi5jCmluZGV4IGRlOTlkMjcuLjUzYTU4NTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19kdi5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19kdi5jCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9kdl9keW5hbWljX2hhbmRsZXIgPSB7Citjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2R2X2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICA9ICJEViIsCiAgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9EVlZJREVPLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX2Zvcm1hdHMuaCBiL2xpYmF2Zm9ybWF0L3J0cGRlY19mb3JtYXRzLmgKaW5kZXggNTBhMmY0Yy4uZGFkMmI4YSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjX2Zvcm1hdHMuaAorKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfZm9ybWF0cy5oCkBAIC00NSw0MyArNDUsNDkgQEAKIGludCBmZl9oMjY0X2hhbmRsZV9mcmFnX3BhY2tldChBVlBhY2tldCAqcGt0LCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2JpdCwgY29uc3QgdWludDhfdCAqbmFsX2hlYWRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmFsX2hlYWRlcl9sZW4pOwotdm9pZCBmZl9oMjY0X3BhcnNlX2ZyYW1lc2l6ZShBVkNvZGVjQ29udGV4dCAqY29kZWMsIGNvbnN0IGNoYXIgKnApOwordm9pZCBmZl9oMjY0X3BhcnNlX2ZyYW1lc2l6ZShBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBjb25zdCBjaGFyICpwKTsKIAotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYWMzX2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2Ftcl9uYl9keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9hbXJfd2JfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZHZfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZzcyNl8xNl9keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9nNzI2XzI0X2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2c3MjZfMzJfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZzcyNl80MF9keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYxX2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2gyNjNfMTk5OF9keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYzXzIwMDBfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2M19yZmMyMTkwX2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2gyNjRfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaGV2Y19keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9pbGJjX2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2pwZWdfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXA0YV9sYXRtX2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wNHZfZXNfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXBlZ19hdWRpb19keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVnX2F1ZGlvX3JvYnVzdF9keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVnX3ZpZGVvX2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWc0X2dlbmVyaWNfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXBlZ3RzX2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21zX3J0cF9hc2ZfcGZhX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tc19ydHBfYXNmX3Bmdl9oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcWNlbHBfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcWRtMl9keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xdF9ydHBfYXVkX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xdF9ydHBfdmlkX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xdWlja3RpbWVfcnRwX2F1ZF9oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcXVpY2t0aW1lX3J0cF92aWRfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3N2cTNfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfdGhlb3JhX2R5bmFtaWNfaGFuZGxlcjsKLWV4dGVybiBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3ZvcmJpc19keW5hbWljX2hhbmRsZXI7Ci1leHRlcm4gUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92cDhfZHluYW1pY19oYW5kbGVyOwotZXh0ZXJuIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfdnA5X2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2FjM19keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9hbXJfbmJfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfYW1yX3diX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2R2X2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2c3MjZfMTZfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZzcyNl8yNF9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9nNzI2XzMyX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2c3MjZfNDBfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZzcyNmxlXzE2X2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2c3MjZsZV8yNF9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9nNzI2bGVfMzJfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZzcyNmxlXzQwX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2gyNjFfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2M18xOTk4X2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2gyNjNfMjAwMF9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYzX3JmYzIxOTBfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2NF9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oZXZjX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2lsYmNfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfanBlZ19keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcDRhX2xhdG1fZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXA0dl9lc19keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVnX2F1ZGlvX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWdfYXVkaW9fcm9idXN0X2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWdfdmlkZW9fZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXBlZzRfZ2VuZXJpY19keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVndHNfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXNfcnRwX2FzZl9wZmFfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21zX3J0cF9hc2ZfcGZ2X2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xY2VscF9keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xZG0yX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3F0X3J0cF9hdWRfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3F0X3J0cF92aWRfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3F1aWNrdGltZV9ydHBfYXVkX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xdWlja3RpbWVfcnRwX3ZpZF9oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfcmZjNDE3NV9ydHBfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3N2cTNfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfdGhlb3JhX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3ZjMmhxX2R5bmFtaWNfaGFuZGxlcjsKK2V4dGVybiBjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3ZvcmJpc19keW5hbWljX2hhbmRsZXI7CitleHRlcm4gY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92cDhfZHluYW1pY19oYW5kbGVyOworZXh0ZXJuIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfdnA5X2R5bmFtaWNfaGFuZGxlcjsKIAogI2VuZGlmIC8qIEFWRk9STUFUX1JUUERFQ19GT1JNQVRTX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY19nNzI2LmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfZzcyNi5jCmluZGV4IDdlOWVmNTYuLjg5YWZkNTggMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19nNzI2LmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjX2c3MjYuYwpAQCAtMjcsMTkgKzI3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhKSBcCiB7IFwKICAgICBBVlN0cmVhbSAqc3RyZWFtID0gcy0+c3RyZWFtc1tzdF9pbmRleF07IFwKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzdHJlYW0tPmNvZGVjOyBcCisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0cmVhbS0+Y29kZWNwYXI7IFwKIFwKLSAgICBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYml0cmF0ZS84OyBcCi0gICAgY29kZWMtPmJpdF9yYXRlID0gY29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIGNvZGVjLT5zYW1wbGVfcmF0ZTsgXAorICAgIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYml0cmF0ZS84OyBcCisgICAgcGFyLT5iaXRfcmF0ZSA9IHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogcGFyLT5zYW1wbGVfcmF0ZTsgXAogXAogICAgIHJldHVybiAwOyBcCiB9IFwKIFwKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZzcyNl8gIyMgYml0cmF0ZSAjIyBfZHluYW1pY19oYW5kbGVyID0geyBcCi0gICAgLmVuY19uYW1lICAgPSAiRzcyNi0iICNiaXRyYXRlLCBcCitjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2c3MjZfICMjIGJpdHJhdGUgIyMgX2R5bmFtaWNfaGFuZGxlciA9IHsgXAorICAgIC5lbmNfbmFtZSAgID0gIkFBTDItRzcyNi0iICNiaXRyYXRlLCBcCiAgICAgLmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU8sIFwKICAgICAuY29kZWNfaWQgICA9IEFWX0NPREVDX0lEX0FEUENNX0c3MjYsIFwKICAgICAuaW5pdCAgICAgICA9IGc3MjZfICMjIGJpdHJhdGUgIyMgX2luaXQsIFwKK307IFwKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfZzcyNmxlXyAjIyBiaXRyYXRlICMjIF9keW5hbWljX2hhbmRsZXIgPSB7IFwKKyAgICAuZW5jX25hbWUgICA9ICJHNzI2LSIgI2JpdHJhdGUsIFwKKyAgICAuY29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTywgXAorICAgIC5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfQURQQ01fRzcyNkxFLCBcCisgICAgLmluaXQgICAgICAgPSBnNzI2XyAjIyBiaXRyYXRlICMjIF9pbml0LCBcCiB9CiAKIFJUUF9HNzI2X0hBTkRMRVIoMTYpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjEuYyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19oMjYxLmMKaW5kZXggOTcyOWYyMS4uYTEwMjkwOSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjEuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfaDI2MS5jCkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjYxX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2MV9keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmVuY19uYW1lICAgICAgICAgID0gIkgyNjEiLAogICAgIC5jb2RlY190eXBlICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuY29kZWNfaWQgICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjYxLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjMuYyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19oMjYzLmMKaW5kZXggOTdhYTRhZC4uOWI3MWVkNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjMuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfaDI2My5jCkBAIC04OSw3ICs4OSw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2M18xOTk4X2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2M18xOTk4X2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICA9ICJIMjYzLTE5OTgiLAogICAgIC5jb2RlY190eXBlICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2MywKQEAgLTk3LDcgKzk3LDcgQEAKICAgICAucGFyc2VfcGFja2V0ICAgICA9IGZmX2gyNjNfaGFuZGxlX3BhY2tldCwKIH07CiAKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2M18yMDAwX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2M18yMDAwX2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICA9ICJIMjYzLTIwMDAiLAogICAgIC5jb2RlY190eXBlICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfSDI2MywKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY19oMjYzX3JmYzIxOTAuYyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19oMjYzX3JmYzIxOTAuYwppbmRleCAzMzcxMmU3Li5hMGY1ODdmIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBkZWNfaDI2M19yZmMyMTkwLmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjNfcmZjMjE5MC5jCkBAIC0xMDcsNyArMTA3LDcgQEAKICAgICAgICAgICAgIC8qIEludmFsaWQgc3JjIGZvciB0aGlzIGZvcm1hdCwgYW5kIGJpdHMgdGhhdCBzaG91bGQgYmUgemVybwogICAgICAgICAgICAgICogYWNjb3JkaW5nIHRvIFJGQyAyMTkwIGFyZW4ndCB6ZXJvLiAqLwogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgIkludGVycHJldGluZyBIMjYzIFJUUCBkYXRhIGFzIFJGQyAyNDI5LzQ2MjkgZXZlbiB0aG91Z2ggIgorICAgICAgICAgICAgICAgICAgICJJbnRlcnByZXRpbmcgSC4yNjMgUlRQIGRhdGEgYXMgUkZDIDI0MjkvNDYyOSBldmVuIHRob3VnaCAiCiAgICAgICAgICAgICAgICAgICAgInNpZ25hbGxlZCB3aXRoIGEgc3RhdGljIHBheWxvYWQgdHlwZS5cbiIpOwogICAgICAgICAgICAgZGF0YS0+bmV3Zm9ybWF0ID0gMTsKICAgICAgICAgICAgIHJldHVybiBmZl9oMjYzX2hhbmRsZV9wYWNrZXQoY3R4LCBkYXRhLCBzdCwgcGt0LCB0aW1lc3RhbXAsIGJ1ZiwKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1SVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2gyNjNfcmZjMjE5MF9keW5hbWljX2hhbmRsZXIgPSB7Citjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2gyNjNfcmZjMjE5MF9keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmNvZGVjX3R5cGUgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5jb2RlY19pZCAgICAgICAgICA9IEFWX0NPREVDX0lEX0gyNjMsCiAgICAgLm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTCwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY19oMjY0LmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfaDI2NC5jCmluZGV4IGIzOTliZTQuLmE3ODUxMjAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19oMjY0LmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjX2gyNjQuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBSVFAgSDI2NCBQcm90b2NvbCAoUkZDMzk4NCkKKyAqIFJUUCBILjI2NCBQcm90b2NvbCAoUkZDMzk4NCkKICAqIENvcHlyaWdodCAoYykgMjAwNiBSeWFuIE1hcnRlbGwKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCkBAIC0xNDYsNyArMTQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKmgyNjRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXR0ciwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3RyZWFtLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3RyZWFtLT5jb2RlY3BhcjsKIAogICAgIGlmICghc3RyY21wKGF0dHIsICJwYWNrZXRpemF0aW9uLW1vZGUiKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiUlRQIFBhY2tldGl6YXRpb24gTW9kZTogJWRcbiIsIGF0b2kodmFsdWUpKTsKQEAgLTE2NiwxOCArMTY2LDIyIEBACiAgICAgICAgICAgICBwYXJzZV9wcm9maWxlX2xldmVsX2lkKHMsIGgyNjRfZGF0YSwgdmFsdWUpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLCAic3Byb3AtcGFyYW1ldGVyLXNldHMiKSkgewogICAgICAgICBpbnQgcmV0OwotICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOwotICAgICAgICBhdl9mcmVlcCgmY29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgICAgIHJldCA9IGZmX2gyNjRfcGFyc2Vfc3Byb3BfcGFyYW1ldGVyX3NldHMocywgJmNvZGVjLT5leHRyYWRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjLT5leHRyYWRhdGFfc2l6ZSwgdmFsdWUpOworICAgICAgICBpZiAoKnZhbHVlID09IDAgfHwgdmFsdWVbc3RybGVuKHZhbHVlKSAtIDFdID09ICcsJykgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiTWlzc2luZyBQUFMgaW4gc3Byb3AtcGFyYW1ldGVyLXNldHMsIGlnbm9yaW5nXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHBhci0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICBhdl9mcmVlcCgmcGFyLT5leHRyYWRhdGEpOworICAgICAgICByZXQgPSBmZl9oMjY0X3BhcnNlX3Nwcm9wX3BhcmFtZXRlcl9zZXRzKHMsICZwYXItPmV4dHJhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyLT5leHRyYWRhdGFfc2l6ZSwgdmFsdWUpOwogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiRXh0cmFkYXRhIHNldCB0byAlcCAoc2l6ZTogJWQpXG4iLAotICAgICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YSwgY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgZmZfaDI2NF9wYXJzZV9mcmFtZXNpemUoQVZDb2RlY0NvbnRleHQgKmNvZGVjLCBjb25zdCBjaGFyICpwKQordm9pZCBmZl9oMjY0X3BhcnNlX2ZyYW1lc2l6ZShBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBjb25zdCBjaGFyICpwKQogewogICAgIGNoYXIgYnVmMVs1MF07CiAgICAgY2hhciAqZHN0ID0gYnVmMTsKQEAgLTE5NSw4ICsxOTksOCBAQAogCiAgICAgLy8gYT0nZnJhbWVzaXplOjk2IDMyMC0yNDAnCiAgICAgLy8gc2V0IG91ciBwYXJhbWV0ZXJzCi0gICAgY29kZWMtPndpZHRoICAgPSBhdG9pKGJ1ZjEpOwotICAgIGNvZGVjLT5oZWlnaHQgID0gYXRvaShwICsgMSk7IC8vIHNraXAgdGhlIC0KKyAgICBwYXItPndpZHRoICAgPSBhdG9pKGJ1ZjEpOworICAgIHBhci0+aGVpZ2h0ICA9IGF0b2kocCArIDEpOyAvLyBza2lwIHRoZSAtCiB9CiAKIGludCBmZl9oMjY0X2hhbmRsZV9hZ2dyZWdhdGVkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKmRhdGEsIEFWUGFja2V0ICpwa3QsCkBAIC0yODUsNyArMjg5LDcgQEAKICAgICB1aW50OF90IGZ1X2luZGljYXRvciwgZnVfaGVhZGVyLCBzdGFydF9iaXQsIG5hbF90eXBlLCBuYWw7CiAKICAgICBpZiAobGVuIDwgMykgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgZGF0YSBmb3IgRlUtQSBIMjY0IFJUUCBwYWNrZXRcbiIpOworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgZGF0YSBmb3IgRlUtQSBILjI2NCBSVFAgcGFja2V0XG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCkBAIC0zMTUsMTQgKzMxOSwxNCBAQAogICAgIGludCByZXN1bHQgPSAwOwogCiAgICAgaWYgKCFsZW4pIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRW1wdHkgSDI2NCBSVFAgcGFja2V0XG4iKTsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRW1wdHkgSC4yNjQgUlRQIHBhY2tldFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KICAgICBuYWwgID0gYnVmWzBdOwogICAgIHR5cGUgPSBuYWwgJiAweDFmOwogCi0gICAgLyogU2ltcGxpZnkgdGhlIGNhc2UgKHRoZXNlIGFyZSBhbGwgdGhlIG5hbCB0eXBlcyB1c2VkIGludGVybmFsbHkgYnkKLSAgICAgKiB0aGUgaDI2NCBjb2RlYykuICovCisgICAgLyogU2ltcGxpZnkgdGhlIGNhc2UgKHRoZXNlIGFyZSBhbGwgdGhlIE5BTCB0eXBlcyB1c2VkIGludGVybmFsbHkgYnkKKyAgICAgKiB0aGUgSC4yNjQgY29kZWMpLiAqLwogICAgIGlmICh0eXBlID49IDEgJiYgdHlwZSA8PSAyMykKICAgICAgICAgdHlwZSA9IDE7CiAgICAgc3dpdGNoICh0eXBlKSB7CkBAIC0zNDcsMTAgKzM1MSw4IEBACiAgICAgY2FzZSAyNjogICAgICAgICAgICAgICAgICAgLy8gTVRBUC0xNgogICAgIGNhc2UgMjc6ICAgICAgICAgICAgICAgICAgIC8vIE1UQVAtMjQKICAgICBjYXNlIDI5OiAgICAgICAgICAgICAgICAgICAvLyBGVS1CCi0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJVbmhhbmRsZWQgdHlwZSAoJWQpIChTZWUgUkZDIGZvciBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzKVxuIiwKLSAgICAgICAgICAgICAgIHR5cGUpOwotICAgICAgICByZXN1bHQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGN0eCwgIlJUUCBILjI2NCBOQUwgdW5pdCB0eXBlICVkIiwgdHlwZSk7CisgICAgICAgIHJlc3VsdCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMjg6ICAgICAgICAgICAgICAgICAgIC8vIEZVLUEgKGZyYWdtZW50ZWQgbmFsKQpAQCAtMzk2LDcgKzM5OCw3IEBACiAgICAgc3RyZWFtID0gcy0+c3RyZWFtc1tzdF9pbmRleF07CiAKICAgICBpZiAoYXZfc3Ryc3RhcnQocCwgImZyYW1lc2l6ZToiLCAmcCkpIHsKLSAgICAgICAgZmZfaDI2NF9wYXJzZV9mcmFtZXNpemUoc3RyZWFtLT5jb2RlYywgcCk7CisgICAgICAgIGZmX2gyNjRfcGFyc2VfZnJhbWVzaXplKHN0cmVhbS0+Y29kZWNwYXIsIHApOwogICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQocCwgImZtdHA6IiwgJnApKSB7CiAgICAgICAgIHJldHVybiBmZl9wYXJzZV9mbXRwKHMsIHN0cmVhbSwgaDI2NF9kYXRhLCBwLCBzZHBfcGFyc2VfZm10cF9jb25maWdfaDI2NCk7CiAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChwLCAiY2xpcHJlY3Q6IiwgJnApKSB7CkBAIC00MDYsNyArNDA4LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oMjY0X2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaDI2NF9keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmVuY19uYW1lICAgICAgICAgPSAiSDI2NCIsCiAgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9IMjY0LApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX2hldmMuYyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19oZXZjLmMKaW5kZXggMWYwOWEwOC4uNWEwNmIyMyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjX2hldmMuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfaGV2Yy5jCkBAIC0xNyw3ICsxNyw2IEBACiAgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKgogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKQEAgLTEzMiw0MSArMTMxLDQxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkQ29udGV4dCAqaGV2Y19kYXRhLCBjb25zdCBjaGFyICpsaW5lKQogewogICAgIEFWU3RyZWFtICpjdXJyZW50X3N0cmVhbTsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcjsKICAgICBjb25zdCBjaGFyICpzZHBfbGluZV9wdHIgPSBsaW5lOwogCiAgICAgaWYgKHN0X2luZGV4IDwgMCkKICAgICAgICAgcmV0dXJuIDA7CiAKICAgICBjdXJyZW50X3N0cmVhbSA9IGN0eC0+c3RyZWFtc1tzdF9pbmRleF07Ci0gICAgY29kZWMgID0gY3VycmVudF9zdHJlYW0tPmNvZGVjOworICAgIHBhciAgPSBjdXJyZW50X3N0cmVhbS0+Y29kZWNwYXI7CiAKICAgICBpZiAoYXZfc3Ryc3RhcnQoc2RwX2xpbmVfcHRyLCAiZnJhbWVzaXplOiIsICZzZHBfbGluZV9wdHIpKSB7Ci0gICAgICAgIGZmX2gyNjRfcGFyc2VfZnJhbWVzaXplKGNvZGVjLCBzZHBfbGluZV9wdHIpOworICAgICAgICBmZl9oMjY0X3BhcnNlX2ZyYW1lc2l6ZShwYXIsIHNkcF9saW5lX3B0cik7CiAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChzZHBfbGluZV9wdHIsICJmbXRwOiIsICZzZHBfbGluZV9wdHIpKSB7CiAgICAgICAgIGludCByZXQgPSBmZl9wYXJzZV9mbXRwKGN0eCwgY3VycmVudF9zdHJlYW0sIGhldmNfZGF0YSwgc2RwX2xpbmVfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZjX3NkcF9wYXJzZV9mbXRwX2NvbmZpZyk7CiAgICAgICAgIGlmIChoZXZjX2RhdGEtPnZwc19zaXplIHx8IGhldmNfZGF0YS0+c3BzX3NpemUgfHwKICAgICAgICAgICAgIGhldmNfZGF0YS0+cHBzX3NpemUgfHwgaGV2Y19kYXRhLT5zZWlfc2l6ZSkgewotICAgICAgICAgICAgYXZfZnJlZXAoJmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YV9zaXplID0gaGV2Y19kYXRhLT52cHNfc2l6ZSArIGhldmNfZGF0YS0+c3BzX3NpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV2Y19kYXRhLT5wcHNfc2l6ZSArIGhldmNfZGF0YS0+c2VpX3NpemU7Ci0gICAgICAgICAgICBjb2RlYy0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKGNvZGVjLT5leHRyYWRhdGFfc2l6ZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgICAgICAgICAgaWYgKCFjb2RlYy0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICBhdl9mcmVlcCgmcGFyLT5leHRyYWRhdGEpOworICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IGhldmNfZGF0YS0+dnBzX3NpemUgKyBoZXZjX2RhdGEtPnNwc19zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXZjX2RhdGEtPnBwc19zaXplICsgaGV2Y19kYXRhLT5zZWlfc2l6ZTsKKyAgICAgICAgICAgIHBhci0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jKHBhci0+ZXh0cmFkYXRhX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CisgICAgICAgICAgICBpZiAoIXBhci0+ZXh0cmFkYXRhKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgIGNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGludCBwb3MgPSAwOwotICAgICAgICAgICAgICAgIG1lbWNweShjb2RlYy0+ZXh0cmFkYXRhICsgcG9zLCBoZXZjX2RhdGEtPnZwcywgaGV2Y19kYXRhLT52cHNfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBhci0+ZXh0cmFkYXRhICsgcG9zLCBoZXZjX2RhdGEtPnZwcywgaGV2Y19kYXRhLT52cHNfc2l6ZSk7CiAgICAgICAgICAgICAgICAgcG9zICs9IGhldmNfZGF0YS0+dnBzX3NpemU7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjLT5leHRyYWRhdGEgKyBwb3MsIGhldmNfZGF0YS0+c3BzLCBoZXZjX2RhdGEtPnNwc19zaXplKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocGFyLT5leHRyYWRhdGEgKyBwb3MsIGhldmNfZGF0YS0+c3BzLCBoZXZjX2RhdGEtPnNwc19zaXplKTsKICAgICAgICAgICAgICAgICBwb3MgKz0gaGV2Y19kYXRhLT5zcHNfc2l6ZTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWMtPmV4dHJhZGF0YSArIHBvcywgaGV2Y19kYXRhLT5wcHMsIGhldmNfZGF0YS0+cHBzX3NpemUpOworICAgICAgICAgICAgICAgIG1lbWNweShwYXItPmV4dHJhZGF0YSArIHBvcywgaGV2Y19kYXRhLT5wcHMsIGhldmNfZGF0YS0+cHBzX3NpemUpOwogICAgICAgICAgICAgICAgIHBvcyArPSBoZXZjX2RhdGEtPnBwc19zaXplOwotICAgICAgICAgICAgICAgIG1lbWNweShjb2RlYy0+ZXh0cmFkYXRhICsgcG9zLCBoZXZjX2RhdGEtPnNlaSwgaGV2Y19kYXRhLT5zZWlfc2l6ZSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBhci0+ZXh0cmFkYXRhICsgcG9zLCBoZXZjX2RhdGEtPnNlaSwgaGV2Y19kYXRhLT5zZWlfc2l6ZSk7CiAgICAgICAgICAgICAgICAgcG9zICs9IGhldmNfZGF0YS0+c2VpX3NpemU7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGNvZGVjLT5leHRyYWRhdGEgKyBwb3MsIDAsIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgICAgIG1lbXNldChwYXItPmV4dHJhZGF0YSArIHBvcywgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGF2X2ZyZWVwKCZoZXZjX2RhdGEtPnZwcyk7CkBAIC0zNDgsNyArMzQ3LDcgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1SVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX2hldmNfZHluYW1pY19oYW5kbGVyID0geworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9oZXZjX2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICA9ICJIMjY1IiwKICAgICAuY29kZWNfdHlwZSAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuY29kZWNfaWQgICAgICAgICA9IEFWX0NPREVDX0lEX0hFVkMsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBkZWNfaWxiYy5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX2lsYmMuYwppbmRleCA4MjEwOWUxLi45MDk0ZjJjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBkZWNfaWxiYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19pbGJjLmMKQEAgLTMxLDEwICszMSwxMCBAQAogICAgICAgICBpbnQgbW9kZSA9IGF0b2kodmFsdWUpOwogICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgIHN0cmVhbS0+Y29kZWMtPmJsb2NrX2FsaWduID0gMzg7CisgICAgICAgICAgICBzdHJlYW0tPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDM4OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICBzdHJlYW0tPmNvZGVjLT5ibG9ja19hbGlnbiA9IDUwOworICAgICAgICAgICAgc3RyZWFtLT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSA1MDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGlMQkMgbW9kZSAlZFxuIiwgbW9kZSk7CkBAIC01OCw3ICs1OCw3IEBACiAgICAgICAgIGludCByZXQgPSBmZl9wYXJzZV9mbXRwKHMsIHN0LCBkYXRhLCBwLCBpbGJjX3BhcnNlX2ZtdHApOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGlmICghc3QtPmNvZGVjLT5ibG9ja19hbGlnbikgeworICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJObyBpTEJDIG1vZGUgc2V0XG4iKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIH0KQEAgLTY2LDcgKzY2LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9pbGJjX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfaWxiY19keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmVuY19uYW1lICAgICAgICAgPSAiaUxCQyIsCiAgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9JTEJDLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX2pwZWcuYyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19qcGVnLmMKaW5kZXggZjNhMjA2MC4uOTMxNDYzYyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjX2pwZWcuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfanBlZy5jCkBAIC0xOTMsMTYgKzE5MywxNyBAQAogewogICAgIGludCBmYWN0b3IgPSBxOwogICAgIGludCBpOworICAgIHVpbnQxNl90IFM7CiAKICAgICBmYWN0b3IgPSBhdl9jbGlwKHEsIDEsIDk5KTsKIAogICAgIGlmIChxIDwgNTApCi0gICAgICAgIHEgPSA1MDAwIC8gZmFjdG9yOworICAgICAgICBTID0gNTAwMCAvIGZhY3RvcjsKICAgICBlbHNlCi0gICAgICAgIHEgPSAyMDAgLSBmYWN0b3IgKiAyOworICAgICAgICBTID0gMjAwIC0gZmFjdG9yICogMjsKIAogICAgIGZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgewotICAgICAgICBpbnQgdmFsID0gKGRlZmF1bHRfcXVhbnRpemVyc1tpXSAqIHEgKyA1MCkgLyAxMDA7CisgICAgICAgIGludCB2YWwgPSAoZGVmYXVsdF9xdWFudGl6ZXJzW2ldICogUyArIDUwKSAvIDEwMDsKIAogICAgICAgICAvKiBMaW1pdCB0aGUgcXVhbnRpemVycyB0byAxIDw9IHEgPD0gMjU1LiAqLwogICAgICAgICB2YWwgPSBhdl9jbGlwKHZhbCwgMSwgMjU1KTsKQEAgLTI0Niw3ICsyNDcsNyBAQAogICAgICAgICB0eXBlICY9IH4weDQwOwogICAgIH0KICAgICBpZiAodHlwZSA+IDEpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5pbXBsZW1lbnRlZCBSVFAvSlBFRyB0eXBlICVkXG4iLCB0eXBlKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoY3R4LCAiUlRQL0pQRUcgdHlwZSAlIlBSSXU4LCB0eXBlKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KIApAQCAtMzc4LDcgKzM3OSw3IEBACiAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9qcGVnX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfanBlZ19keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmVuY19uYW1lICAgICAgICAgID0gIkpQRUciLAogICAgIC5jb2RlY190eXBlICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuY29kZWNfaWQgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NSlBFRywKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY19sYXRtLmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfbGF0bS5jCmluZGV4IGFlYmJhNTcuLjkwODdkNmIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19sYXRtLmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjX2xhdG0uYwpAQCAtMTA5LDE5ICsxMDksMTkgQEAKICAgICBudW1fbGF5ZXJzICAgICAgICA9IGdldF9iaXRzKCZnYiwgMyk7CiAgICAgaWYgKGF1ZGlvX211eF92ZXJzaW9uICE9IDAgfHwgc2FtZV90aW1lX2ZyYW1pbmcgIT0gMSB8fCBudW1fcHJvZ3JhbXMgIT0gMCB8fAogICAgICAgICBudW1fbGF5ZXJzICE9IDApIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgTEFUTSBjb25maWcgKCVkLCVkLCVkLCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tdXhfdmVyc2lvbiwgc2FtZV90aW1lX2ZyYW1pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Byb2dyYW1zLCBudW1fbGF5ZXJzKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoTlVMTCwgIkxBVE0gY29uZmlnICglZCwlZCwlZCwlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19tdXhfdmVyc2lvbiwgc2FtZV90aW1lX2ZyYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wcm9ncmFtcywgbnVtX2xheWVycyk7CiAgICAgICAgIHJldCA9IEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgICAgICBnb3RvIGVuZDsKICAgICB9Ci0gICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgKGdldF9iaXRzX2xlZnQoJmdiKSArIDcpLzgpKSB7CisgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgKGdldF9iaXRzX2xlZnQoJmdiKSArIDcpLzgpKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgZ290byBlbmQ7CiAgICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplOyBpKyspCi0gICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhW2ldID0gZ2V0X2JpdHMoJmdiLCA4KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZTsgaSsrKQorICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVtpXSA9IGdldF9iaXRzKCZnYiwgOCk7CiAKIGVuZDoKICAgICBhdl9mcmVlKGNvbmZpZyk7CkBAIC0xNjIsNyArMTYyLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcDRhX2xhdG1fZHluYW1pY19oYW5kbGVyID0geworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcDRhX2xhdG1fZHluYW1pY19oYW5kbGVyID0gewogICAgIC5lbmNfbmFtZSAgICAgICAgICAgPSAiTVA0QS1MQVRNIiwKICAgICAuY29kZWNfdHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgIC5jb2RlY19pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9BQUMsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBkZWNfbXBhX3JvYnVzdC5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX21wYV9yb2J1c3QuYwppbmRleCA4NmM4OTU4Li5mNDcxNmVkIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBkZWNfbXBhX3JvYnVzdC5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19tcGFfcm9idXN0LmMKQEAgLTE4OSw3ICsxODksNyBAQAogICAgIHJldHVybiAwOwogfQogCi1SVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWdfYXVkaW9fcm9idXN0X2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXBlZ19hdWRpb19yb2J1c3RfZHluYW1pY19oYW5kbGVyID0gewogICAgIC5lbmNfbmFtZSAgICAgICAgICA9ICJtcGEtcm9idXN0IiwKICAgICAuY29kZWNfdHlwZSAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgLmNvZGVjX2lkICAgICAgICAgID0gQVZfQ09ERUNfSURfTVAzQURVLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX21wZWcxMi5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX21wZWcxMi5jCmluZGV4IGU2MTg1ZWEuLjQzZDlkNTggMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19tcGVnMTIuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfbXBlZzEyLmMKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBoICAgID0gQVZfUkIzMihidWYpOwogICAgIGJ1ZiArPSA0OwogICAgIGxlbiAtPSA0OwotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIGggJiAoMSA8PCAyNikpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBoICYgKDEgPDwgMjYpKSB7CiAgICAgICAgIC8qIE1QRUctMiAqLwogICAgICAgICBpZiAobGVuIDw9IDQpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTQ4LDcgKzQ4LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVnX2F1ZGlvX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXBlZ19hdWRpb19keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmNvZGVjX3R5cGUgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgIC5jb2RlY19pZCAgICAgICAgICA9IEFWX0NPREVDX0lEX01QMywKICAgICAubmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMLApAQCAtNTYsNyArNTYsNyBAQAogICAgIC5zdGF0aWNfcGF5bG9hZF9pZCA9IDE0LAogfTsKIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVnX3ZpZGVvX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXBlZ192aWRlb19keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmNvZGVjX3R5cGUgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5jb2RlY19pZCAgICAgICAgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU8sCiAgICAgLm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTCwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY19tcGVnNC5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX21wZWc0LmMKaW5kZXggNzBlNTFmOC4uNGY3MDU5OSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjX21wZWc0LmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjX21wZWc0LmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogLyoqCiAgKiBAZmlsZQotICogQGJyaWVmIE1QRUc0IC8gUlRQIENvZGUKKyAqIEBicmllZiBNUEVHLTQgLyBSVFAgQ29kZQogICogQGF1dGhvciBGYWJyaWNlIEJlbGxhcmQKICAqIEBhdXRob3IgUm9tYWluIERlZ2V6CiAgKi8KQEAgLTk3LDE0ICs5NywxNCBAQAogICAgIGF2X2ZyZWVwKCZkYXRhLT5tb2RlKTsKIH0KIAotc3RhdGljIGludCBwYXJzZV9mbXRwX2NvbmZpZyhBVkNvZGVjQ29udGV4dCAqY29kZWMsIGNvbnN0IGNoYXIgKnZhbHVlKQorc3RhdGljIGludCBwYXJzZV9mbXRwX2NvbmZpZyhBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBjb25zdCBjaGFyICp2YWx1ZSkKIHsKICAgICAvKiBkZWNvZGUgdGhlIGhleGEgZW5jb2RlZCBwYXJhbWV0ZXIgKi8KICAgICBpbnQgbGVuID0gZmZfaGV4X3RvX2RhdGEoTlVMTCwgdmFsdWUpOwotICAgIGF2X2ZyZWVwKCZjb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKGNvZGVjLCBsZW4pKQorICAgIGF2X2ZyZWVwKCZwYXItPmV4dHJhZGF0YSk7CisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShwYXIsIGxlbikpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgZmZfaGV4X3RvX2RhdGEoY29kZWMtPmV4dHJhZGF0YSwgdmFsdWUpOworICAgIGZmX2hleF90b19kYXRhKHBhci0+ZXh0cmFkYXRhLCB2YWx1ZSk7CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTI3NCwyNiArMjc0LDM3IEBACiAgICAgICAgICAgICAgICAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSwgUGF5bG9hZENvbnRleHQgKmRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXR0ciwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3RyZWFtLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3RyZWFtLT5jb2RlY3BhcjsKICAgICBpbnQgcmVzLCBpOwogCiAgICAgaWYgKCFzdHJjbXAoYXR0ciwgImNvbmZpZyIpKSB7Ci0gICAgICAgIHJlcyA9IHBhcnNlX2ZtdHBfY29uZmlnKGNvZGVjLCB2YWx1ZSk7CisgICAgICAgIHJlcyA9IHBhcnNlX2ZtdHBfY29uZmlnKHBhciwgdmFsdWUpOwogCiAgICAgICAgIGlmIChyZXMgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICBpZiAoY29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgewogICAgICAgICAvKiBMb29raW5nIGZvciBhIGtub3duIGF0dHJpYnV0ZSAqLwogICAgICAgICBmb3IgKGkgPSAwOyBhdHRyX25hbWVzW2ldLnN0cjsgKytpKSB7CiAgICAgICAgICAgICBpZiAoIWF2X3N0cmNhc2VjbXAoYXR0ciwgYXR0cl9uYW1lc1tpXS5zdHIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGF0dHJfbmFtZXNbaV0udHlwZSA9PSBBVFRSX05BTUVfVFlQRV9JTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9IGF0b2kodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsID4gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAlcyBmaWVsZCBzaXplIGlzIGludmFsaWQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLCB2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgKihpbnQgKikoKGNoYXIgKilkYXRhKwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9uYW1lc1tpXS5vZmZzZXQpID0gYXRvaSh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdHRyX25hbWVzW2ldLnR5cGUgPT0gQVRUUl9OQU1FX1RZUEVfU1RSKQorICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9uYW1lc1tpXS5vZmZzZXQpID0gdmFsOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXR0cl9uYW1lc1tpXS50eXBlID09IEFUVFJfTkFNRV9UWVBFX1NUUikgeworICAgICAgICAgICAgICAgICAgICBjaGFyICp2YWwgPSBhdl9zdHJkdXAodmFsdWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICAgICAgICAgICooY2hhciAqKikoKGNoYXIgKilkYXRhKwotICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9uYW1lc1tpXS5vZmZzZXQpID0gYXZfc3RyZHVwKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJfbmFtZXNbaV0ub2Zmc2V0KSA9IHZhbDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTQsNyArMzI1LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcDR2X2VzX2R5bmFtaWNfaGFuZGxlciA9IHsKK2NvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXA0dl9lc19keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmVuY19uYW1lICAgICAgICAgICA9ICJNUDRWLUVTIiwKICAgICAuY29kZWNfdHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAogICAgIC5jb2RlY19pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9NUEVHNCwKQEAgLTMyMyw3ICszMzQsNyBAQAogICAgIC5wYXJzZV9zZHBfYV9saW5lICAgPSBwYXJzZV9zZHBfbGluZSwKIH07CiAKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfbXBlZzRfZ2VuZXJpY19keW5hbWljX2hhbmRsZXIgPSB7Citjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX21wZWc0X2dlbmVyaWNfZHluYW1pY19oYW5kbGVyID0gewogICAgIC5lbmNfbmFtZSAgICAgICAgICAgPSAibXBlZzQtZ2VuZXJpYyIsCiAgICAgLmNvZGVjX3R5cGUgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTywKICAgICAuY29kZWNfaWQgICAgICAgICAgID0gQVZfQ09ERUNfSURfQUFDLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX21wZWd0cy5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX21wZWd0cy5jCmluZGV4IDViZjBmMTguLjQwNTI3MWYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19tcGVndHMuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfbXBlZ3RzLmMKQEAgLTg5LDcgKzg5LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVndHNfZHluYW1pY19oYW5kbGVyID0geworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9tcGVndHNfZHluYW1pY19oYW5kbGVyID0gewogICAgIC5jb2RlY190eXBlICAgICAgICA9IEFWTUVESUFfVFlQRV9EQVRBLAogICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihQYXlsb2FkQ29udGV4dCksCiAgICAgLnBhcnNlX3BhY2tldCAgICAgID0gbXBlZ3RzX2hhbmRsZV9wYWNrZXQsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBkZWNfcWNlbHAuYyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19xY2VscC5jCmluZGV4IDQxY2M4MjYuLjM0ODVjMjcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19xY2VscC5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlY19xY2VscC5jCkBAIC0yMDksNyArMjA5LDcgQEAKICAgICAgICAgcmV0dXJuIHJldHVybl9zdG9yZWRfZnJhbWUoY3R4LCBkYXRhLCBzdCwgcGt0LCB0aW1lc3RhbXAsIGJ1ZiwgbGVuKTsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xY2VscF9keW5hbWljX2hhbmRsZXIgPSB7Citjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3FjZWxwX2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICAgID0gIngtUHVyZXZvaWNlIiwKICAgICAuY29kZWNfdHlwZSAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPLAogICAgIC5jb2RlY19pZCAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9RQ0VMUCwKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY19xZG0yLmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfcWRtMi5jCmluZGV4IDIyYjQxOWUuLmZhMmIxYjkgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19xZG0yLmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjX3FkbTIuYwpAQCAtMTA0LDE4ICsxMDQsMTggQEAKICAgICAgICAgICAgIGNhc2UgNDogLyogc3RyZWFtIHdpdGggZXh0cmFkYXRhICovCiAgICAgICAgICAgICAgICAgaWYgKGl0ZW1fbGVuIDwgMzApCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDI2ICsgaXRlbV9sZW4pKSB7CisgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMjYgKyBpdGVtX2xlbikpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQVZfV0IzMihzdC0+Y29kZWMtPmV4dHJhZGF0YSwgMTIpOwotICAgICAgICAgICAgICAgIG1lbWNweShzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDQsICJmcm1hIiwgNCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgOCwgIlFETTIiLCA0KTsKLSAgICAgICAgICAgICAgICBBVl9XQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMTIsIDYgKyBpdGVtX2xlbik7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMTYsICJRRENBIiwgNCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMjAsIHAgKyAyLCBpdGVtX2xlbiAtIDIpOwotICAgICAgICAgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAxOCArIGl0ZW1fbGVuLCA4KTsKLSAgICAgICAgICAgICAgICBBVl9XQjMyKHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMjIgKyBpdGVtX2xlbiwgMCk7CisgICAgICAgICAgICAgICAgQVZfV0IzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgMTIpOworICAgICAgICAgICAgICAgIG1lbWNweShzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDQsICJmcm1hIiwgNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgOCwgIlFETTIiLCA0KTsKKyAgICAgICAgICAgICAgICBBVl9XQjMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMTIsIDYgKyBpdGVtX2xlbik7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMTYsICJRRENBIiwgNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMjAsIHAgKyAyLCBpdGVtX2xlbiAtIDIpOworICAgICAgICAgICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgKyAxOCArIGl0ZW1fbGVuLCA4KTsKKyAgICAgICAgICAgICAgICBBVl9XQjMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMjIgKyBpdGVtX2xlbiwgMCk7CiAKICAgICAgICAgICAgICAgICBxZG0tPmJsb2NrX3NpemUgPSBBVl9SQjMyKHAgKyAyNik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yNjUsOSArMjY1LDkgQEAKICAgICAgICAgICAgICAqIGNhcnJpZWQgd2l0aGluIHRoZSBSVFAgc3RyZWFtLCBub3QgU0RQLiBIZXJlLAogICAgICAgICAgICAgICogYnkgc2V0dGluZyBjb2RlY19pZCB0byBBVl9DT0RFQ19JRF9RRE0yLCB3ZSBhcmUgc2lnbmFsbGluZwogICAgICAgICAgICAgICogdG8gdGhlIGRlY29kZXIgdGhhdCBpdCBpcyBPSyB0byBpbml0aWFsaXplLiAqLwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1FETTI7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUURNMjsKICAgICAgICAgfQotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKIAogICAgICAgICAvKiBzdWJwYWNrZXRzICovCkBAIC0yOTgsNyArMjk4LDcgQEAKICAgICByZXR1cm4gKHFkbS0+Y2FjaGUgPiAwKSA/IDEgOiAwOwogfQogCi1SVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3FkbTJfZHluYW1pY19oYW5kbGVyID0geworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl9xZG0yX2R5bmFtaWNfaGFuZGxlciA9IHsKICAgICAuZW5jX25hbWUgICAgICAgICA9ICJYLVFETSIsCiAgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZGVjX3F0LmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfcXQuYwppbmRleCAyZDFiNThlLi43N2EzY2U0IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBkZWNfcXQuYworKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfcXQuYwpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICBpZiAocG9zICsgMTIgPiBsZW4pCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgICAgICBza2lwX2JpdHMoJmdiLCAyKTsgLy8gaGFzIG5vbi1JIGZyYW1lczoxLCBpcyBzcGFyc2U6MQorICAgICAgICBza2lwX2JpdHMoJmdiLCAyKTsgLy8gaGFzIG5vbi1JLWZyYW1lczoxLCBpcyBzcGFyc2U6MQogICAgICAgICBpc19zdGFydCAgPSBnZXRfYml0czEoJmdiKTsKICAgICAgICAgaXNfZmluaXNoID0gZ2V0X2JpdHMxKCZnYik7CiAgICAgICAgIGlmICghaXNfc3RhcnQgfHwgIWlzX2ZpbmlzaCkgewpAQCAtMTA2LDkgKzEwNiw5IEBACiAKICAgICAgICAgYXZpb19zZWVrKCZwYiwgcG9zICsgNCwgU0VFS19TRVQpOwogICAgICAgICB0YWcgPSBhdmlvX3JsMzIoJnBiKTsKLSAgICAgICAgaWYgKChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgIGlmICgoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgogICAgICAgICAgICAgICAgICB0YWcgIT0gTUtUQUcoJ3YnLCdpJywnZCcsJ2UnKSkgfHwKLSAgICAgICAgICAgIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgogICAgICAgICAgICAgICAgICB0YWcgIT0gTUtUQUcoJ3MnLCdvJywndScsJ24nKSkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIGF2aW9fcmIzMigmcGIpKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY19yZmM0MTc1LmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfcmZjNDE3NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YzYyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9ydHBkZWNfcmZjNDE3NS5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogUlRQIERlcGFja2V0aXphdGlvbiBvZiBSQVcgdmlkZW8gKFRSLTAzKQorICogQ29weXJpZ2h0IChjKSAyMDE2IFNhdm9pci1mYWlyZSBMaW51eCwgSW5jCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qIERldmVsb3BtZW50IHNwb25zb3JlZCBieSBDQkMvUmFkaW8tQ2FuYWRhICovCisKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicnRwZGVjX2Zvcm1hdHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIGNoYXIgKnNhbXBsaW5nOworICAgIGludCBkZXB0aDsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKworICAgIHVpbnQ4X3QgKmZyYW1lOworICAgIHVuc2lnbmVkIGludCBmcmFtZV9zaXplOworICAgIHVuc2lnbmVkIGludCBwZ3JvdXA7IC8qIHNpemUgb2YgdGhlIHBpeGVsIGdyb3VwIGluIGJ5dGVzICovCisgICAgdW5zaWduZWQgaW50IHhpbmM7CisKKyAgICB1aW50MzJfdCB0aW1lc3RhbXA7Cit9OworCitzdGF0aWMgaW50IHJmYzQxNzVfcGFyc2VfZm9ybWF0KEFWU3RyZWFtICpzdHJlYW0sIFBheWxvYWRDb250ZXh0ICpkYXRhKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgaW50IGJpdHNfcGVyX3NhbXBsZSA9IDA7CisgICAgaW50IHRhZyA9IDA7CisKKyAgICBpZiAoIXN0cm5jbXAoZGF0YS0+c2FtcGxpbmcsICJZQ2JDci00OjI6MiIsIDExKSkgeworICAgICAgICB0YWcgPSBNS1RBRygnVScsICdZJywgJ1YnLCAnWScpOworICAgICAgICBkYXRhLT54aW5jID0gMjsKKworICAgICAgICBpZiAoZGF0YS0+ZGVwdGggPT0gOCkgeworICAgICAgICAgICAgZGF0YS0+cGdyb3VwID0gNDsKKyAgICAgICAgICAgIGJpdHNfcGVyX3NhbXBsZSA9IDE2OworICAgICAgICAgICAgcGl4Zm10ID0gQVZfUElYX0ZNVF9VWVZZNDIyOworICAgICAgICB9IGVsc2UgaWYgKGRhdGEtPmRlcHRoID09IDEwKSB7CisgICAgICAgICAgICBkYXRhLT5wZ3JvdXAgPSA1OworICAgICAgICAgICAgYml0c19wZXJfc2FtcGxlID0gMjA7CisgICAgICAgICAgICBwaXhmbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlAxMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgc3RyZWFtLT5jb2RlY3Bhci0+Zm9ybWF0ID0gcGl4Zm10OworICAgIHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IHRhZzsKKyAgICBzdHJlYW0tPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBiaXRzX3Blcl9zYW1wbGU7CisgICAgZGF0YS0+ZnJhbWVfc2l6ZSA9IGRhdGEtPndpZHRoICogZGF0YS0+aGVpZ2h0ICogZGF0YS0+cGdyb3VwIC8gZGF0YS0+eGluYzsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJmYzQxNzVfcGFyc2VfZm10cChBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXlsb2FkQ29udGV4dCAqZGF0YSwgY29uc3QgY2hhciAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworICAgIGlmICghc3RybmNtcChhdHRyLCAid2lkdGgiLCA1KSkKKyAgICAgICAgZGF0YS0+d2lkdGggPSBhdG9pKHZhbHVlKTsKKyAgICBlbHNlIGlmICghc3RybmNtcChhdHRyLCAiaGVpZ2h0IiwgNikpCisgICAgICAgIGRhdGEtPmhlaWdodCA9IGF0b2kodmFsdWUpOworICAgIGVsc2UgaWYgKCFzdHJuY21wKGF0dHIsICJzYW1wbGluZyIsIDgpKQorICAgICAgICBkYXRhLT5zYW1wbGluZyA9IGF2X3N0cmR1cCh2YWx1ZSk7CisgICAgZWxzZSBpZiAoIXN0cm5jbXAoYXR0ciwgImRlcHRoIiwgNSkpCisgICAgICAgIGRhdGEtPmRlcHRoID0gYXRvaSh2YWx1ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmM0MTc1X3BhcnNlX3NkcF9saW5lKEFWRm9ybWF0Q29udGV4dCAqcywgaW50IHN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBheWxvYWRDb250ZXh0ICpkYXRhLCBjb25zdCBjaGFyICpsaW5lKQoreworICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICBpZiAoc3RfaW5kZXggPCAwKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChhdl9zdHJzdGFydChsaW5lLCAiZm10cDoiLCAmcCkpIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0cmVhbSA9IHMtPnN0cmVhbXNbc3RfaW5kZXhdOworICAgICAgICBpbnQgcmV0ID0gZmZfcGFyc2VfZm10cChzLCBzdHJlYW0sIGRhdGEsIHAsIHJmYzQxNzVfcGFyc2VfZm10cCk7CisKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisKKyAgICAgICAgaWYgKCFkYXRhLT5zYW1wbGluZyB8fCAhZGF0YS0+ZGVwdGggfHwgIWRhdGEtPndpZHRoIHx8ICFkYXRhLT5oZWlnaHQpCisgICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICAgc3RyZWFtLT5jb2RlY3Bhci0+d2lkdGggPSBkYXRhLT53aWR0aDsKKyAgICAgICAgc3RyZWFtLT5jb2RlY3Bhci0+aGVpZ2h0ID0gZGF0YS0+aGVpZ2h0OworCisgICAgICAgIHJldCA9IHJmYzQxNzVfcGFyc2VfZm9ybWF0KHN0cmVhbSwgZGF0YSk7CisgICAgICAgIGF2X2ZyZWVwKCZkYXRhLT5zYW1wbGluZyk7CisKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZmM0MTc1X2ZpbmFsaXplX3BhY2tldChQYXlsb2FkQ29udGV4dCAqZGF0YSwgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9pbmRleCkKK3sKKyAgIGludCByZXQ7CisKKyAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc3RyZWFtX2luZGV4OworICAgcmV0ID0gYXZfcGFja2V0X2Zyb21fZGF0YShwa3QsIGRhdGEtPmZyYW1lLCBkYXRhLT5mcmFtZV9zaXplKTsKKyAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgYXZfZnJlZXAoJmRhdGEtPmZyYW1lKTsKKyAgIH0KKworICAgZGF0YS0+ZnJhbWUgPSBOVUxMOworCisgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJmYzQxNzVfaGFuZGxlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKmN0eCwgUGF5bG9hZENvbnRleHQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsIHVpbnQzMl90ICp0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICogYnVmLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc2VxLCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGxlbmd0aCwgbGluZSwgb2Zmc2V0LCBjb250OworICAgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlcnMgPSBidWYgKyAyOyAvKiBza2lwIGV4dGVuZGVkIHNlcW51bSAqLworICAgIGNvbnN0IHVpbnQ4X3QgKnBheWxvYWQgPSBidWYgKyAyOworICAgIGludCBwYXlsb2FkX2xlbiA9IGxlbiAtIDI7CisgICAgaW50IG1pc3NlZF9sYXN0X3BhY2tldCA9IDA7CisKKyAgICB1aW50OF90ICpkZXN0OworCisgICAgaWYgKCp0aW1lc3RhbXAgIT0gZGF0YS0+dGltZXN0YW1wKSB7CisgICAgICAgIGlmIChkYXRhLT5mcmFtZSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGlmIHdlJ3JlIGhlcmUsIGl0IG1lYW5zIHRoYXQgdHdvIFJUUCBwYWNrZXRzIGRpZG4ndCBoYXZlIHRoZQorICAgICAgICAgICAgICogc2FtZSB0aW1lc3RhbXAsIHdoaWNoIGlzIGEgc2lnbiB0aGF0IHRoZXkgd2VyZSBwYWNrZXRzIGZyb20gdHdvCisgICAgICAgICAgICAgKiBkaWZmZXJlbnQgZnJhbWVzLCBidXQgd2UgZGlkbid0IGdldCB0aGUgZmxhZyBSVFBfRkxBR19NQVJLRVIgb24KKyAgICAgICAgICAgICAqIHRoZSBmaXJzdCBvbmUgb2YgdGhlc2UgZnJhbWVzIChsYXN0IHBhY2tldCBvZiBhIGZyYW1lKS4KKyAgICAgICAgICAgICAqIEZpbmFsaXplIHRoZSBwcmV2aW91cyBmcmFtZSBhbnl3YXkgYnkgZmlsbGluZyB0aGUgQVZQYWNrZXQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk1pc3NlZCBwcmV2aW91cyBSVFAgTWFya2VyXG4iKTsKKyAgICAgICAgICAgIG1pc3NlZF9sYXN0X3BhY2tldCA9IDE7CisgICAgICAgICAgICByZmM0MTc1X2ZpbmFsaXplX3BhY2tldChkYXRhLCBwa3QsIHN0LT5pbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBkYXRhLT5mcmFtZSA9IGF2X21hbGxvYyhkYXRhLT5mcmFtZV9zaXplKTsKKworICAgICAgICBkYXRhLT50aW1lc3RhbXAgPSAqdGltZXN0YW1wOworCisgICAgICAgIGlmICghZGF0YS0+ZnJhbWUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk91dCBvZiBtZW1vcnkuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIGxvb2tzIGZvciB0aGUgJ0NvbnRpbnVhdGlvbiBiaXQnIGluIHNjYW4gbGluZXMnIGhlYWRlcnMKKyAgICAgKiB0byBmaW5kIHdoZXJlIGRhdGEgc3RhcnQKKyAgICAgKi8KKyAgICBkbyB7CisgICAgICAgIGlmIChwYXlsb2FkX2xlbiA8IDYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBjb250ID0gcGF5bG9hZFs0XSAmIDB4ODA7CisgICAgICAgIHBheWxvYWQgKz0gNjsKKyAgICAgICAgcGF5bG9hZF9sZW4gLT0gNjsKKyAgICB9IHdoaWxlIChjb250KTsKKworICAgIC8qIGFuZCBub3cgaXRlcmF0ZSBvdmVyIGV2ZXJ5IHNjYW4gbGluZXMgKi8KKyAgICBkbyB7CisgICAgICAgIGludCBjb3B5X29mZnNldDsKKworICAgICAgICBpZiAocGF5bG9hZF9sZW4gPCBkYXRhLT5wZ3JvdXApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBsZW5ndGggPSAoaGVhZGVyc1swXSA8PCA4KSB8IGhlYWRlcnNbMV07CisgICAgICAgIGxpbmUgPSAoKGhlYWRlcnNbMl0gJiAweDdmKSA8PCA4KSB8IGhlYWRlcnNbM107CisgICAgICAgIG9mZnNldCA9ICgoaGVhZGVyc1s0XSAmIDB4N2YpIDw8IDgpIHwgaGVhZGVyc1s1XTsKKyAgICAgICAgY29udCA9IGhlYWRlcnNbNF0gJiAweDgwOworICAgICAgICBoZWFkZXJzICs9IDY7CisKKyAgICAgICAgaWYgKGxlbmd0aCAlIGRhdGEtPnBncm91cCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGlmIChsZW5ndGggPiBwYXlsb2FkX2xlbikKKyAgICAgICAgICAgIGxlbmd0aCA9IHBheWxvYWRfbGVuOworCisgICAgICAgIC8qIHByZXZlbnQgaWxsLWZvcm1lZCBwYWNrZXRzIHRvIHdyaXRlIGFmdGVyIGJ1ZmZlcidzIGVuZCAqLworICAgICAgICBjb3B5X29mZnNldCA9IChsaW5lICogZGF0YS0+d2lkdGggKyBvZmZzZXQpICogZGF0YS0+cGdyb3VwIC8gZGF0YS0+eGluYzsKKyAgICAgICAgaWYgKGNvcHlfb2Zmc2V0ICsgbGVuZ3RoID4gZGF0YS0+ZnJhbWVfc2l6ZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgICAgIGRlc3QgPSBkYXRhLT5mcmFtZSArIGNvcHlfb2Zmc2V0OworICAgICAgICBtZW1jcHkoZGVzdCwgcGF5bG9hZCwgbGVuZ3RoKTsKKworICAgICAgICBwYXlsb2FkICs9IGxlbmd0aDsKKyAgICAgICAgcGF5bG9hZF9sZW4gLT0gbGVuZ3RoOworICAgIH0gd2hpbGUgKGNvbnQpOworCisgICAgaWYgKChmbGFncyAmIFJUUF9GTEFHX01BUktFUikpIHsKKyAgICAgICAgcmV0dXJuIHJmYzQxNzVfZmluYWxpemVfcGFja2V0KGRhdGEsIHBrdCwgc3QtPmluZGV4KTsKKyAgICB9IGVsc2UgaWYgKG1pc3NlZF9sYXN0X3BhY2tldCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworfQorCitjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3JmYzQxNzVfcnRwX2hhbmRsZXIgPSB7CisgICAgLmVuY19uYW1lICAgICAgICAgICA9ICJyYXciLAorICAgIC5jb2RlY190eXBlICAgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCisgICAgLmNvZGVjX2lkICAgICAgICAgICA9IEFWX0NPREVDX0lEX0JJVFBBQ0tFRCwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgID0gc2l6ZW9mKFBheWxvYWRDb250ZXh0KSwKKyAgICAucGFyc2Vfc2RwX2FfbGluZSAgID0gcmZjNDE3NV9wYXJzZV9zZHBfbGluZSwKKyAgICAucGFyc2VfcGFja2V0ICAgICAgID0gcmZjNDE3NV9oYW5kbGVfcGFja2V0LAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY19zdnEzLmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfc3ZxMy5jCmluZGV4IGJhZDE5OWYuLjc3MTY0ZGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGRlY19zdnEzLmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjX3N2cTMuYwpAQCAtNTksMjIgKzU5LDIyIEBACiAKICAgICBpZiAoY29uZmlnX3BhY2tldCkgewogCi0gICAgICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7Ci0gICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gMDsKIAotICAgICAgICBpZiAobGVuIDwgMiB8fCBmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBsZW4gKyA4KSkKKyAgICAgICAgaWYgKGxlbiA8IDIgfHwgZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgbGVuICsgOCkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKIAotICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsICJTRVFIIiwgNCk7Ci0gICAgICAgIEFWX1dCMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA0LCBsZW4pOwotICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA4LCBidWYsIGxlbik7CisgICAgICAgIG1lbWNweShzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgIlNFUUgiLCA0KTsKKyAgICAgICAgQVZfV0IzMihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDQsIGxlbik7CisgICAgICAgIG1lbWNweShzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDgsIGJ1ZiwgbGVuKTsKIAogICAgICAgICAvKiBXZSBzZXQgY29kZWNfaWQgdG8gQVZfQ09ERUNfSURfTk9ORSBpbml0aWFsbHkgdG8KICAgICAgICAgICogZGVsYXkgZGVjb2RlciBpbml0aWFsaXphdGlvbiBzaW5jZSBleHRyYWRhdGEgaXMKICAgICAgICAgICogY2FycmllZCB3aXRoaW4gdGhlIFJUUCBzdHJlYW0sIG5vdCBTRFAuIEhlcmUsCiAgICAgICAgICAqIGJ5IHNldHRpbmcgY29kZWNfaWQgdG8gQVZfQ09ERUNfSURfU1ZRMywgd2UgYXJlIHNpZ25hbGxpbmcKICAgICAgICAgICogdG8gdGhlIGRlY29kZXIgdGhhdCBpdCBpcyBPSyB0byBpbml0aWFsaXplLiAqLwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfU1ZRMzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NWUTM7CiAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKICAgICB9CkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICBmZmlvX2ZyZWVfZHluX2J1Zigmc3YtPnBrdGJ1Zik7CiB9CiAKLVJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgZmZfc3ZxM19keW5hbWljX2hhbmRsZXIgPSB7Citjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3N2cTNfZHluYW1pY19oYW5kbGVyID0gewogICAgIC5lbmNfbmFtZSAgICAgICAgID0gIlgtU1YzVi1FUyIsCiAgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfVklERU8sCiAgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9OT05FLCAgICAgIC8vIHNlZSBpZiAoY29uZmlnX3BhY2tldCkgYWJvdmUKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY192YzJocS5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX3ZjMmhxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExMWFjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlY192YzJocS5jCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogUlRQIHBhcnNlciBmb3IgVkMtMiBIUSBwYXlsb2FkIGZvcm1hdCAoZHJhZnQgdmVyc2lvbiAxKSAtIGV4cGVyaW1lbnRhbAorICogQ29weXJpZ2h0IChjKSAyMDE2IFRob21hcyBWb2xrZXJ0IDx0aG9tYXNAbmV0emVhbC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2RpcmFjLmgiCisKKyNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAicnRwZGVjX2Zvcm1hdHMuaCIKKworI2RlZmluZSBSVFBfVkMySFFfUExfSEVBREVSX1NJWkUgICAgICAgICAgICAgNAorCisjZGVmaW5lIERJUkFDX0RBVEFfVU5JVF9IRUFERVJfU0laRSAgICAgICAgICAxMworI2RlZmluZSBESVJBQ19QSUNfTlJfU0laRSAgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBESVJBQ19SVFBfUENPREVfSFFfUElDX0ZSQUdNRU5UICAgICAgMHhFQworCitzdHJ1Y3QgUGF5bG9hZENvbnRleHQgeworICAgIEFWSU9Db250ZXh0ICpidWY7CisgICAgdWludDMyX3QgICAgZnJhbWVfc2l6ZTsKKyAgICB1aW50MzJfdCAgICBmcmFtZV9ucjsKKyAgICB1aW50MzJfdCAgICB0aW1lc3RhbXA7CisgICAgdWludDMyX3QgICAgbGFzdF91bml0X3NpemU7CisgICAgaW50ICAgICAgICAgc2Vlbl9zZXF1ZW5jZV9oZWFkZXI7Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzdGFydF9zZXF1ZW5jZVtdID0geyAnQicsICdCJywgJ0MnLCAnRCcgfTsKKworc3RhdGljIHZvaWQgZmlsbF9wYXJzZV9pbmZvX2hlYWRlcihQYXlsb2FkQ29udGV4dCAqcGxfY3R4LCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgcGFyc2VfY29kZSwgdWludDMyX3QgZGF0YV91bml0X3NpemUpCit7CisgICAgbWVtY3B5KGJ1Ziwgc3RhcnRfc2VxdWVuY2UsIHNpemVvZihzdGFydF9zZXF1ZW5jZSkpOworICAgIGJ1Zls0XSAgPSBwYXJzZV9jb2RlOworICAgIEFWX1dCMzIoJmJ1Zls1XSwgZGF0YV91bml0X3NpemUpOworICAgIEFWX1dCMzIoJmJ1Zls5XSwgcGxfY3R4LT5sYXN0X3VuaXRfc2l6ZSk7CisKKyAgICBwbF9jdHgtPmxhc3RfdW5pdF9zaXplID0gZGF0YV91bml0X3NpemU7Cit9CisKK3N0YXRpYyBpbnQgdmMyaHFfaGFuZGxlX3NlcXVlbmNlX2hlYWRlcihQYXlsb2FkQ29udGV4dCAqcGxfY3R4LCBBVlN0cmVhbSAqc3QsIEFWUGFja2V0ICpwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQoreworICAgIGludCByZXM7CisgICAgdWludDMyX3Qgc2l6ZSA9IERJUkFDX0RBVEFfVU5JVF9IRUFERVJfU0laRSArIGxlbjsKKworICAgIGlmICgocmVzID0gYXZfbmV3X3BhY2tldChwa3QsIERJUkFDX0RBVEFfVU5JVF9IRUFERVJfU0laRSArIGxlbikpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJlczsKKworICAgIGZpbGxfcGFyc2VfaW5mb19oZWFkZXIocGxfY3R4LCBwa3QtPmRhdGEsIDB4MDAsIHNpemUpOworICAgIC8qIHBheWxvYWQgb2Ygc2VxLiBoZWFkZXIgKi8KKyAgICBtZW1jcHkocGt0LT5kYXRhICsgRElSQUNfREFUQV9VTklUX0hFQURFUl9TSVpFLCBidWYsIGxlbik7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CisKKyAgICBwbF9jdHgtPnNlZW5fc2VxdWVuY2VfaGVhZGVyID0gMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZjMmhxX21hcmtfZW5kX29mX3NlcXVlbmNlKFBheWxvYWRDb250ZXh0ICpwbF9jdHgsIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBpbnQgcmVzOworICAgIHVpbnQzMl90IHNpemUgPSAwOworCisgICAgLyogY3JlYXRlIEEvViBwYWNrZXQgKi8KKyAgICBpZiAoKHJlcyA9IGF2X25ld19wYWNrZXQocGt0LCBESVJBQ19EQVRBX1VOSVRfSEVBREVSX1NJWkUpKSA8IDApCisgICAgICAgIHJldHVybiByZXM7CisKKyAgICBmaWxsX3BhcnNlX2luZm9faGVhZGVyKHBsX2N0eCwgcGt0LT5kYXRhLCAweDEwLCBzaXplKTsKKyAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKKworICAgIHBsX2N0eC0+c2Vlbl9zZXF1ZW5jZV9oZWFkZXIgPSAwOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmMyaHFfaGFuZGxlX2ZyYW1lX2ZyYWdtZW50KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBQYXlsb2FkQ29udGV4dCAqcGxfY3R4LCBBVlN0cmVhbSAqc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldCAqcGt0LCB1aW50MzJfdCAqdGltZXN0YW1wLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgaW50IHJlczsKKyAgICB1aW50MzJfdCBwaWNfbnI7CisgICAgdWludDE2X3QgZnJhZ19sZW47CisgICAgdWludDE2X3Qgbm9fc2xpY2VzOworCisgICAgLyogc2FuaXR5IGNoZWNrIGZvciBzaXplIG9mIGlucHV0IHBhY2tldDogMTYgYnl0ZXMgaGVhZGVyIGluIGFueSBjYXNlIGFzIG1pbmltdW0gKi8KKyAgICBpZiAobGVuIDwgMTYpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IFJUUC9WQzJocSBwYWNrZXQsIGdvdCAlZCBieXRlc1xuIiwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcGljX25yID0gQVZfUkIzMigmYnVmWzRdKTsKKyAgICBmcmFnX2xlbiA9IEFWX1JCMTYoJmJ1ZlsxMl0pOworICAgIG5vX3NsaWNlcyA9IEFWX1JCMTYoJmJ1ZlsxNF0pOworCisgICAgaWYgKHBsX2N0eC0+YnVmICYmIHBsX2N0eC0+ZnJhbWVfbnIgIT0gcGljX25yKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRHJvcHBpbmcgYnVmZmVyZWQgUlRQL1ZDMmhxIHBhY2tldCBmcmFnbWVudHMgLSBub24tY29udGludW91cyBwaWN0dXJlIG51bWJlcnNcbiIpOworICAgICAgICBmZmlvX2ZyZWVfZHluX2J1ZigmcGxfY3R4LT5idWYpOworICAgIH0KKworICAgIC8qIHRyYW5zZm9ybSBwYXJhbWV0ZXJzPyAqLworICAgIGlmIChub19zbGljZXMgPT0gMCkgeworICAgICAgICBpZiAobGVuIDwgZnJhZ19sZW4gKyAxNikgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IFJUUC9WQzJocSBwYWNrZXQsIGdvdCAlZCBieXRlc1xuIiwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgLyogc3RhcnQgZnJhbWUgYnVmZmVyaW5nIHdpdGggbmV3IGR5bmFtaWMgYnVmZmVyICovCisgICAgICAgIGlmICghcGxfY3R4LT5idWYpIHsKKworICAgICAgICAgICAgcmVzID0gYXZpb19vcGVuX2R5bl9idWYoJnBsX2N0eC0+YnVmKTsKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgICAgIC8qIHJlc2VydmUgbWVtb3J5IGZvciBmcmFtZSBoZWFkZXIgKi8KKyAgICAgICAgICAgIHJlcyA9IGF2aW9fc2VlayhwbF9jdHgtPmJ1ZiwgRElSQUNfREFUQV9VTklUX0hFQURFUl9TSVpFICsgRElSQUNfUElDX05SX1NJWkUsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisKKyAgICAgICAgICAgIHBsX2N0eC0+ZnJhbWVfbnIgPSBwaWNfbnI7CisgICAgICAgICAgICBwbF9jdHgtPnRpbWVzdGFtcCA9ICp0aW1lc3RhbXA7CisgICAgICAgICAgICBwbF9jdHgtPmZyYW1lX3NpemUgPSBESVJBQ19EQVRBX1VOSVRfSEVBREVSX1NJWkUgKyBESVJBQ19QSUNfTlJfU0laRTsKKyAgICAgICAgfQorCisgICAgICAgIGF2aW9fd3JpdGUocGxfY3R4LT5idWYsIGJ1ZiArIDE2IC8qIHNraXAgcGwgaGVhZGVyICovLCBmcmFnX2xlbik7CisgICAgICAgIHBsX2N0eC0+ZnJhbWVfc2l6ZSArPSBmcmFnX2xlbjsKKworICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChsZW4gPCBmcmFnX2xlbiArIDIwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgUlRQL1ZDMmhxIHBhY2tldCwgZ290ICVkIGJ5dGVzXG4iLCBsZW4pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKworICAgICAgICAvKiB0cmFuc2Zvcm0gcGFyYW1ldGVycyB3ZXJlIG1pc3NlZCwgbm8gYnVmZmVyIGF2YWlsYWJsZSAqLworICAgICAgICBpZiAoIXBsX2N0eC0+YnVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICAgICAgYXZpb193cml0ZShwbF9jdHgtPmJ1ZiwgYnVmICsgMjAgLyogc2tpcCBwbCBoZWFkZXIgKi8sIGZyYWdfbGVuKTsKKyAgICAgICAgcGxfY3R4LT5mcmFtZV9zaXplICs9IGZyYWdfbGVuOworCisgICAgICAgIC8qIFJUUCBtYXJrZXIgYml0IG1lYW5zOiBsYXN0IGZyYWdtZW50IG9mIGN1cnJlbnQgZnJhbWUgd2FzIHJlY2VpdmVkOworICAgICAgICAgICBvdGhlcndpc2UsIGFuIGFkZGl0aW9uYWwgZnJhZ21lbnQgaXMgbmVlZGVkIGZvciB0aGUgY3VycmVudCBmcmFtZSAqLworICAgICAgICBpZiAoIShmbGFncyAmIFJUUF9GTEFHX01BUktFUikpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIH0KKworICAgIC8qIGNsb3NlIGZyYW1lIGJ1ZmZlcmluZyBhbmQgY3JlYXRlIEEvViBwYWNrZXQgKi8KKyAgICByZXMgPSBmZl9ydHBfZmluYWxpemVfcGFja2V0KHBrdCwgJnBsX2N0eC0+YnVmLCBzdC0+aW5kZXgpOworICAgIGlmIChyZXMgPCAwKQorICAgICAgICByZXR1cm4gcmVzOworCisgICAgZmlsbF9wYXJzZV9pbmZvX2hlYWRlcihwbF9jdHgsIHBrdC0+ZGF0YSwgRElSQUNfUENPREVfUElDVFVSRV9IUSwgcGxfY3R4LT5mcmFtZV9zaXplKTsKKyAgICBBVl9XQjMyKCZwa3QtPmRhdGFbMTNdLCBwbF9jdHgtPmZyYW1lX25yKTsKKworICAgIHBsX2N0eC0+ZnJhbWVfc2l6ZSA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YzJocV9oYW5kbGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBQYXlsb2FkQ29udGV4dCAqcGxfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKnBrdCwgdWludDMyX3QgKnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sIHVpbnQxNl90IHNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgdWludDhfdCBwYXJzZV9jb2RlID0gMDsKKyAgICBpbnQgcmVzID0gMDsKKworICAgIGlmIChwbF9jdHgtPmJ1ZiAmJiBwbF9jdHgtPnRpbWVzdGFtcCAhPSAqdGltZXN0YW1wKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19XQVJOSU5HLCAiRHJvcHBpbmcgYnVmZmVyZWQgUlRQL1ZDMmhxIHBhY2tldCBmcmFnbWVudHMgLSBub24tY29udGludW91cyB0aW1lc3RhbXBzXG4iKTsKKyAgICAgICAgZmZpb19mcmVlX2R5bl9idWYoJnBsX2N0eC0+YnVmKTsKKyAgICAgICAgcGxfY3R4LT5mcmFtZV9zaXplID0gMDsKKyAgICB9CisKKyAgICAvKiBzYW5pdHkgY2hlY2sgZm9yIHNpemUgb2YgaW5wdXQgcGFja2V0OiBuZWVkZWQgaGVhZGVyIGRhdGEgYXMgbWluaW11bSAqLworICAgIGlmIChsZW4gPCBSVFBfVkMySFFfUExfSEVBREVSX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IFJUUC9WQzJocSBwYWNrZXQsIGdvdCAlZCBieXRlc1xuIiwgbGVuKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgcGFyc2VfY29kZSA9IGJ1ZlszXTsKKworICAgIC8qIHdhaXQgZm9yIG5leHQgc2VxdWVuY2UgaGVhZGVyPyAqLworICAgIGlmIChwbF9jdHgtPnNlZW5fc2VxdWVuY2VfaGVhZGVyIHx8IHBhcnNlX2NvZGUgPT0gRElSQUNfUENPREVfU0VRX0hFQURFUikgeworICAgICAgICBzd2l0Y2gocGFyc2VfY29kZSkgeworICAgICAgICAvKiBzZXF1ZW5jZSBoZWFkZXIgKi8KKyAgICAgICAgY2FzZSBESVJBQ19QQ09ERV9TRVFfSEVBREVSOgorICAgICAgICAgICAgcmVzID0gdmMyaHFfaGFuZGxlX3NlcXVlbmNlX2hlYWRlcihwbF9jdHgsIHN0LCBwa3QsIGJ1ZiArIFJUUF9WQzJIUV9QTF9IRUFERVJfU0laRSwgbGVuIC0gUlRQX1ZDMkhRX1BMX0hFQURFUl9TSVpFKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBlbmQgb2Ygc2VxdWVuY2UgKi8KKyAgICAgICAgY2FzZSBESVJBQ19QQ09ERV9FTkRfU0VROgorICAgICAgICAgICAgcmVzID0gdmMyaHFfbWFya19lbmRfb2Zfc2VxdWVuY2UocGxfY3R4LCBzdCwgcGt0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBIUSBwaWN0dXJlIGZyYWdtZW50ICovCisgICAgICAgIGNhc2UgRElSQUNfUlRQX1BDT0RFX0hRX1BJQ19GUkFHTUVOVDoKKyAgICAgICAgICAgIHJlcyA9IHZjMmhxX2hhbmRsZV9mcmFtZV9mcmFnbWVudChjdHgsIHBsX2N0eCwgc3QsIHBrdCwgdGltZXN0YW1wLCBidWYsIGxlbiwgZmxhZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3ZjMmhxX2R5bmFtaWNfaGFuZGxlciA9IHsKKyAgICAuZW5jX25hbWUgICAgICAgICA9ICJWQzIiLAorICAgIC5jb2RlY190eXBlICAgICAgID0gQVZNRURJQV9UWVBFX1ZJREVPLAorICAgIC5jb2RlY19pZCAgICAgICAgID0gQVZfQ09ERUNfSURfRElSQUMsCisgICAgLnByaXZfZGF0YV9zaXplICAgPSBzaXplb2YoUGF5bG9hZENvbnRleHQpLAorICAgIC5wYXJzZV9wYWNrZXQgICAgID0gdmMyaHFfaGFuZGxlX3BhY2tldAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGRlY192cDguYyBiL2xpYmF2Zm9ybWF0L3J0cGRlY192cDguYwppbmRleCBkMWUzNTVkLi4zNjBkZDVjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBkZWNfdnA4LmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZGVjX3ZwOC5jCkBAIC00Niw3ICs0Niw3IEBACiAgICAgaW50ICAgICAgICAgIHByZXZfcGljdHVyZWlkOwogICAgIGludCAgICAgICAgICBicm9rZW5fZnJhbWU7CiAgICAgLyogSWYgc2VxdWVuY2VfZGlydHkgaXMgc2V0LCB3ZSBoYXZlIGxvc3Qgc29tZSBkYXRhIChjcml0aWNhbCBvcgotICAgICAqIG5vbi1jcml0aWNhbCkgYW5kIGRlY29kaW5nIHdpbGwgaGF2ZSBzb21lIHNvcnQgb2YgYXJ0ZWZhY3RzLCBhbmQKKyAgICAgKiBub24tY3JpdGljYWwpIGFuZCBkZWNvZGluZyB3aWxsIGhhdmUgc29tZSBzb3J0IG9mIGFydGlmYWN0cywgYW5kCiAgICAgICogd2UgdGh1cyBzaG91bGQgcmVxdWVzdCBhIG5ldyBrZXlmcmFtZS4KICAgICAgKi8KICAgICBpbnQgICAgICAgICAgc2VxdWVuY2VfZGlydHk7CkBAIC0yNzYsNyArMjc2LDcgQEAKICAgICByZXR1cm4gdnA4LT5zZXF1ZW5jZV9kaXJ0eSB8fCAhdnA4LT5zZXF1ZW5jZV9vazsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92cDhfZHluYW1pY19oYW5kbGVyID0geworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92cDhfZHluYW1pY19oYW5kbGVyID0gewogICAgIC5lbmNfbmFtZSAgICAgICA9ICJWUDgiLAogICAgIC5jb2RlY190eXBlICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuY29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9WUDgsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBkZWNfdnA5LmMgYi9saWJhdmZvcm1hdC9ydHBkZWNfdnA5LmMKaW5kZXggZTUwYmVkZS4uNmJiZGY0OCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZGVjX3ZwOS5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlY192cDkuYwpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBSVFAgcGFyc2VyIGZvciBWUDkgcGF5bG9hZCBmb3JtYXQgKGRyYWZ0IHZlcnNpb24gMCkgLSBleHBlcmltZW50YWwKKyAqIFJUUCBwYXJzZXIgZm9yIFZQOSBwYXlsb2FkIGZvcm1hdCAoZHJhZnQgdmVyc2lvbiAwMikgLSBleHBlcmltZW50YWwKICAqIENvcHlyaWdodCAoYykgMjAxNSBUaG9tYXMgVm9sa2VydCA8dGhvbWFzQGhvbWVyLWNvbmZlcmVuY2luZy5jb20+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgpAQCAtNDUsOCArNDUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4sIHVpbnQxNl90IHNlcSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQogewotICAgIGludCBoYXNfcGljX2lkLCBoYXNfbGF5ZXJfaWRjLCBoYXNfcmVmX2lkYywgaGFzX3NzX2RhdGEsIGhhc19zdV9kYXRhOwotICAgIGF2X3VudXNlZCBpbnQgcGljX2lkID0gMCwgbm9uX2tleV9mcmFtZSA9IDA7CisgICAgaW50IGhhc19waWNfaWQsIGhhc19sYXllcl9pZGMsIGhhc19yZWZfaWRjLCBoYXNfc3NfZGF0YTsKKyAgICBhdl91bnVzZWQgaW50IHBpY19pZCA9IDAsIG5vbl9rZXlfZnJhbWUgPSAwLCBpbnRlcl9waWN0dXJlX2xheWVyX2ZyYW1lOwogICAgIGF2X3VudXNlZCBpbnQgbGF5ZXJfdGVtcG9yYWwgPSAtMSwgbGF5ZXJfc3BhdGlhbCA9IC0xLCBsYXllcl9xdWFsaXR5ID0gLTE7CiAgICAgaW50IHJlZl9maWVsZHMgPSAwLCBoYXNfcmVmX2ZpZWxkX2V4dF9waWNfaWQgPSAwOwogICAgIGludCBmaXJzdF9mcmFnbWVudCwgbGFzdF9mcmFnbWVudDsKQEAgLTY4LDI0ICs2OCwyNCBAQAogICAgICAqCiAgICAgICogICAgICAwIDEgMiAzIDQgNSA2IDcKICAgICAgKiAgICAgKy0rLSstKy0rLSstKy0rLSsKLSAgICAgKiAgICAgfEl8THxGfEJ8RXxWfFV8LXwgKFJFUVVJUkVEKQorICAgICAqICAgICB8SXxQfEx8RnxCfEV8VnwtfCAoUkVRVUlSRUQpCiAgICAgICogICAgICstKy0rLSstKy0rLSstKy0rCiAgICAgICoKICAgICAgKiAgICAgSTogUGljdHVyZUlEIHByZXNlbnQKKyAgICAgKiAgICAgUDogSW50ZXItcGljdHVyZSBwcmVkaWN0ZWQgbGF5ZXIgZnJhbWUKICAgICAgKiAgICAgTDogTGF5ZXIgaW5kaWNlcyBwcmVzZW50Ci0gICAgICogICAgIEY6IFJlZmVyZW5jZSBpbmRpY2VzIHByZXNlbnQKKyAgICAgKiAgICAgRjogRmxleGlibGUgbW9kZQogICAgICAqICAgICBCOiBTdGFydCBvZiBWUDkgZnJhbWUKICAgICAgKiAgICAgRTogRW5kIG9mIHBpY3R1cmUKICAgICAgKiAgICAgVjogU2NhbGFiaWxpdHkgU3RydWN0dXJlIChTUykgcHJlc2VudAotICAgICAqICAgICBVOiBTY2FsYWJpbGl0eSBTdHJ1Y3R1cmUgVXBkYXRlIChTVSkgcHJlc2VudAogICAgICAqLwogICAgIGhhc19waWNfaWQgICAgID0gISEoYnVmWzBdICYgMHg4MCk7Ci0gICAgaGFzX2xheWVyX2lkYyAgPSAhIShidWZbMF0gJiAweDQwKTsKLSAgICBoYXNfcmVmX2lkYyAgICA9ICEhKGJ1ZlswXSAmIDB4MjApOwotICAgIGZpcnN0X2ZyYWdtZW50ID0gISEoYnVmWzBdICYgMHgxMCk7Ci0gICAgbGFzdF9mcmFnbWVudCAgPSAhIShidWZbMF0gJiAweDA4KTsKLSAgICBoYXNfc3NfZGF0YSAgICA9ICEhKGJ1ZlswXSAmIDB4MDQpOwotICAgIGhhc19zdV9kYXRhICAgID0gISEoYnVmWzBdICYgMHgwMik7CisgICAgaW50ZXJfcGljdHVyZV9sYXllcl9mcmFtZSA9ICEhKGJ1ZlswXSAmIDB4NDApOworICAgIGhhc19sYXllcl9pZGMgID0gISEoYnVmWzBdICYgMHgyMCk7CisgICAgaGFzX3JlZl9pZGMgICAgPSAhIShidWZbMF0gJiAweDEwKTsKKyAgICBmaXJzdF9mcmFnbWVudCA9ICEhKGJ1ZlswXSAmIDB4MDgpOworICAgIGxhc3RfZnJhZ21lbnQgID0gISEoYnVmWzBdICYgMHgwNCk7CisgICAgaGFzX3NzX2RhdGEgICAgPSAhIShidWZbMF0gJiAweDAyKTsKIAogICAgIHJ0cF9tID0gISEoZmxhZ3MgJiBSVFBfRkxBR19NQVJLRVIpOwogCkBAIC0yMjIsMTggKzIyMiw2NCBAQAogICAgICAqICAgWDogMSBpZiB0aGlzIGxheWVyIGluZGV4IGhhcyBhbiBleHRlbmRlZCByZWxhdGl2ZSBQaWN0dXJlIElELgogICAgICAqLwogICAgIGlmIChoYXNfc3NfZGF0YSkgewotICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShjdHgsICJWUDkgc2NhbGFiaWxpdHkgc3RydWN0dXJlIGRhdGEiKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGRlY29kZSB0aGUgc2NhbGFiaWxpdHkgdXBkYXRlIHN0cnVjdHVyZSAoU1UpCi0gICAgICoKLSAgICAgKiAgc3BlYy4gaXMgdGJkCi0gICAgICovCi0gICAgaWYgKGhhc19zdV9kYXRhKSB7Ci0gICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGN0eCwgIlZQOSBzY2FsYWJpbGl0eSB1cGRhdGUgc3RydWN0dXJlIGRhdGEiKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgaW50IG5fcywgeSwgZywgaTsKKyAgICAgICAgaWYgKGxlbiA8IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlRvbyBzaG9ydCBSVFAvVlA5IHBhY2tldFxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorICAgICAgICBuX3MgPSBidWZbMF0gPj4gNTsKKyAgICAgICAgeSA9ICEhKGJ1ZlswXSAmIDB4MTApOworICAgICAgICBnID0gISEoYnVmWzBdICYgMHgwOCk7CisgICAgICAgIGJ1ZisrOworICAgICAgICBsZW4tLTsKKyAgICAgICAgaWYgKG5fcyA+IDApIHsKKyAgICAgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGN0eCwgIlZQOSBzY2FsYWJpbGl0eSBzdHJ1Y3R1cmUgd2l0aCBtdWx0aXBsZSBsYXllcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoeSkgeworICAgICAgICAgICAgaWYgKGxlbiA8IDQgKiAobl9zICsgMSkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgUlRQL1ZQOSBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5fcyArIDE7IGkrKykgeworICAgICAgICAgICAgICAgIGF2X3VudXNlZCBpbnQgdywgaDsKKyAgICAgICAgICAgICAgICB3ID0gQVZfUkIxNihidWYpOworICAgICAgICAgICAgICAgIGggPSBBVl9SQjE2KGJ1ZiArIDIpOworICAgICAgICAgICAgICAgIGJ1ZiArPSA0OworICAgICAgICAgICAgICAgIGxlbiAtPSA0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChnKSB7CisgICAgICAgICAgICBpbnQgbl9nOworICAgICAgICAgICAgaWYgKGxlbiA8IDEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgUlRQL1ZQOSBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbl9nID0gYnVmWzBdOworICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuX2c7IGkrKykgeworICAgICAgICAgICAgICAgIGF2X3VudXNlZCBpbnQgdCwgdSwgciwgajsKKyAgICAgICAgICAgICAgICBpZiAobGVuIDwgMSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJUb28gc2hvcnQgUlRQL1ZQOSBwYWNrZXRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdCA9IGJ1ZlswXSA+PiA1OworICAgICAgICAgICAgICAgIHUgPSAhIShidWZbMF0gJiAweDEwKTsKKyAgICAgICAgICAgICAgICByID0gKGJ1ZlswXSA+PiAyKSAmIDB4MDM7CisgICAgICAgICAgICAgICAgYnVmKys7CisgICAgICAgICAgICAgICAgbGVuLS07CisgICAgICAgICAgICAgICAgaWYgKGxlbiA8IHIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVG9vIHNob3J0IFJUUC9WUDkgcGFja2V0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfdW51c2VkIGludCBwX2RpZmYgPSBidWZbMF07CisgICAgICAgICAgICAgICAgICAgIGJ1ZisrOworICAgICAgICAgICAgICAgICAgICBsZW4tLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKgpAQCAtMjc5LDExICszMjUsMTcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92cDlfZHluYW1pY19oYW5kbGVyID0geworc3RhdGljIHZvaWQgdnA5X2Nsb3NlX2NvbnRleHQoUGF5bG9hZENvbnRleHQgKnZwOSkKK3sKKyAgICBmZmlvX2ZyZWVfZHluX2J1ZigmdnA5LT5idWYpOworfQorCitjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3ZwOV9keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmVuY19uYW1lICAgICAgICAgPSAiVlA5IiwKICAgICAuY29kZWNfdHlwZSAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuY29kZWNfaWQgICAgICAgICA9IEFWX0NPREVDX0lEX1ZQOSwKICAgICAucHJpdl9kYXRhX3NpemUgICA9IHNpemVvZihQYXlsb2FkQ29udGV4dCksCiAgICAgLmluaXQgICAgICAgICAgICAgPSB2cDlfaW5pdCwKKyAgICAuY2xvc2UgICAgICAgICAgICA9IHZwOV9jbG9zZV9jb250ZXh0LAogICAgIC5wYXJzZV9wYWNrZXQgICAgID0gdnA5X2hhbmRsZV9wYWNrZXQKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBkZWNfeGlwaC5jIGIvbGliYXZmb3JtYXQvcnRwZGVjX3hpcGguYwppbmRleCA2ZDlkMGZkLi41NzQ1MDhhIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBkZWNfeGlwaC5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGRlY194aXBoLmMKQEAgLTEwOCwxNSArMTA4LDE0IEBACiAgICAgfQogCiAgICAgaWYgKGlkZW50ICE9IGRhdGEtPmlkZW50KSB7Ci0gICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJVbmltcGxlbWVudGVkIFhpcGggU0RQIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGRldGVjdGVkXG4iKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoY3R4LCAiWGlwaCBTRFAgY29uZmlndXJhdGlvbiBjaGFuZ2UiKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KIAogICAgIGlmICh0ZHQpIHsKLSAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlVuaW1wbGVtZW50ZWQgUlRQIFhpcGggcGFja2V0IHNldHRpbmdzICglZCwlZCwlZClcbiIsCi0gICAgICAgICAgICAgICBmcmFnbWVudGVkLCB0ZHQsIG51bV9wa3RzKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUlRQIFhpcGggcGFja2V0IHNldHRpbmdzICglZCwlZCwlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudGVkLCB0ZHQsIG51bV9wa3RzKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KIApAQCAtMjIyLDE2ICsyMjEsMTcgQEAKICAqIEJhc2VkIG9mZiBwYXJzZV9wYWNrZWRfaGVhZGVycyBpbiBWb3JiaXMgUlRQCiAgKi8KIHN0YXRpYyBpbnQKLXBhcnNlX3BhY2tlZF9oZWFkZXJzKGNvbnN0IHVpbnQ4X3QgKiBwYWNrZWRfaGVhZGVycywKK3BhcnNlX3BhY2tlZF9oZWFkZXJzKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBwYWNrZWRfaGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiBwYWNrZWRfaGVhZGVyc19lbmQsCi0gICAgICAgICAgICAgICAgICAgICBBVkNvZGVjQ29udGV4dCAqIGNvZGVjLCBQYXlsb2FkQ29udGV4dCAqIHhpcGhfZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIFBheWxvYWRDb250ZXh0ICogeGlwaF9kYXRhKQogewogCiAgICAgdW5zaWduZWQgbnVtX3BhY2tlZCwgbnVtX2hlYWRlcnMsIGxlbmd0aCwgbGVuZ3RoMSwgbGVuZ3RoMiwgZXh0cmFkYXRhX2FsbG9jOwogICAgIHVpbnQ4X3QgKnB0cjsKIAogICAgIGlmIChwYWNrZWRfaGVhZGVyc19lbmQgLSBwYWNrZWRfaGVhZGVycyA8IDkpIHsKLSAgICAgICAgYXZfbG9nKGNvZGVjLCBBVl9MT0dfRVJST1IsCisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAiSW52YWxpZCAlIlBUUkRJRkZfU1BFQ0lGSUVSIiBieXRlIHBhY2tlZCBoZWFkZXIuIiwKICAgICAgICAgICAgICAgIHBhY2tlZF9oZWFkZXJzX2VuZCAtIHBhY2tlZF9oZWFkZXJzKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CkBAIC0yNDUsMTYgKzI0NSwxNSBAQAogICAgIGxlbmd0aDIgICAgICAgICAgICA9IGdldF9iYXNlMTI4KCZwYWNrZWRfaGVhZGVycywgcGFja2VkX2hlYWRlcnNfZW5kKTsKIAogICAgIGlmIChudW1fcGFja2VkICE9IDEgfHwgbnVtX2hlYWRlcnMgPiAzKSB7Ci0gICAgICAgIGF2X2xvZyhjb2RlYywgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlVuaW1wbGVtZW50ZWQgbnVtYmVyIG9mIGhlYWRlcnM6ICVkIHBhY2tlZCBoZWFkZXJzLCAlZCBoZWFkZXJzXG4iLAotICAgICAgICAgICAgICAgbnVtX3BhY2tlZCwgbnVtX2hlYWRlcnMpOworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLCAiJXUgcGFja2VkIGhlYWRlcnMsICV1IGhlYWRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFja2VkLCBudW1faGVhZGVycyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAKICAgICBpZiAocGFja2VkX2hlYWRlcnNfZW5kIC0gcGFja2VkX2hlYWRlcnMgIT0gbGVuZ3RoIHx8CiAgICAgICAgIGxlbmd0aDEgPiBsZW5ndGggfHwgbGVuZ3RoMiA+IGxlbmd0aCAtIGxlbmd0aDEpIHsKLSAgICAgICAgYXZfbG9nKGNvZGVjLCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiQmFkIHBhY2tlZCBoZWFkZXIgbGVuZ3RocyAoJWQsJWQsJSJQVFJESUZGX1NQRUNJRklFUiIsJWQpXG4iLCBsZW5ndGgxLAorICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkJhZCBwYWNrZWQgaGVhZGVyIGxlbmd0aHMgKCVkLCVkLCUiUFRSRElGRl9TUEVDSUZJRVIiLCV1KVxuIiwgbGVuZ3RoMSwKICAgICAgICAgICAgICAgIGxlbmd0aDIsIHBhY2tlZF9oZWFkZXJzX2VuZCAtIHBhY2tlZF9oZWFkZXJzLCBsZW5ndGgpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CkBAIC0yNjUsMTkgKzI2NCwxOSBAQAogICAgICAqIC0tIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUgcmVxdWlyZWQgKi8KICAgICBleHRyYWRhdGFfYWxsb2MgPSBsZW5ndGggKyBsZW5ndGgvMjU1ICsgMyArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkU7CiAKLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKGNvZGVjLCBleHRyYWRhdGFfYWxsb2MpKSB7Ci0gICAgICAgIGF2X2xvZyhjb2RlYywgQVZfTE9HX0VSUk9SLCAiT3V0IG9mIG1lbW9yeVxuIik7CisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShwYXIsIGV4dHJhZGF0YV9hbGxvYykpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk91dCBvZiBtZW1vcnlcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KLSAgICBwdHIgPSBjb2RlYy0+ZXh0cmFkYXRhOworICAgIHB0ciA9IHBhci0+ZXh0cmFkYXRhOwogICAgICpwdHIrKyA9IDI7CiAgICAgcHRyICs9IGF2X3hpcGhsYWNpbmcocHRyLCBsZW5ndGgxKTsKICAgICBwdHIgKz0gYXZfeGlwaGxhY2luZyhwdHIsIGxlbmd0aDIpOwogICAgIG1lbWNweShwdHIsIHBhY2tlZF9oZWFkZXJzLCBsZW5ndGgpOwogICAgIHB0ciArPSBsZW5ndGg7Ci0gICAgY29kZWMtPmV4dHJhZGF0YV9zaXplID0gcHRyIC0gY29kZWMtPmV4dHJhZGF0YTsKKyAgICBwYXItPmV4dHJhZGF0YV9zaXplID0gcHRyIC0gcGFyLT5leHRyYWRhdGE7CiAgICAgLy8gY2xlYXIgb3V0IHJlbWFpbmluZyBwYXJ0cyBvZiB0aGUgYnVmZmVyCi0gICAgbWVtc2V0KHB0ciwgMCwgZXh0cmFkYXRhX2FsbG9jIC0gY29kZWMtPmV4dHJhZGF0YV9zaXplKTsKKyAgICBtZW1zZXQocHRyLCAwLCBleHRyYWRhdGFfYWxsb2MgLSBwYXItPmV4dHJhZGF0YV9zaXplKTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjg3LDE2ICsyODYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZENvbnRleHQgKnhpcGhfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYXR0ciwgY29uc3QgY2hhciAqdmFsdWUpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3RyZWFtLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3RyZWFtLT5jb2RlY3BhcjsKICAgICBpbnQgcmVzdWx0ID0gMDsKIAogICAgIGlmICghc3RyY21wKGF0dHIsICJzYW1wbGluZyIpKSB7CiAgICAgICAgIGlmICghc3RyY21wKHZhbHVlLCAiWUNiQ3ItNDoyOjAiKSkgewotICAgICAgICAgICAgY29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CisgICAgICAgICAgICBwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIwUDsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHZhbHVlLCAiWUNiQ3ItNDo0OjIiKSkgewotICAgICAgICAgICAgY29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQyMlA7CisgICAgICAgICAgICBwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDIyUDsKICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKHZhbHVlLCAiWUNiQ3ItNDo0OjQiKSkgewotICAgICAgICAgICAgY29kZWMtPnBpeF9mbXQgPSBBVl9QSVhfRk1UX1lVVjQ0NFA7CisgICAgICAgICAgICBwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdCAlc1xuIiwgYXR0cik7CkBAIC0zMDUsMTIgKzMwNCwxMiBAQAogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhdHRyLCAid2lkdGgiKSkgewogICAgICAgICAvKiBUaGlzIGlzIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDQ4NTYxCiAgICAgICAgICAqIGFuZCBNVVNUIGJlIGluIG11bHRpcGxlcyBvZiAxNi4gKi8KLSAgICAgICAgY29kZWMtPndpZHRoID0gYXRvaSh2YWx1ZSk7CisgICAgICAgIHBhci0+d2lkdGggPSBhdG9pKHZhbHVlKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfSBlbHNlIGlmICghc3RyY21wKGF0dHIsICJoZWlnaHQiKSkgewogICAgICAgICAvKiBUaGlzIGlzIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDQ4NTYxCiAgICAgICAgICAqIGFuZCBNVVNUIGJlIGluIG11bHRpcGxlcyBvZiAxNi4gKi8KLSAgICAgICAgY29kZWMtPmhlaWdodCA9IGF0b2kodmFsdWUpOworICAgICAgICBwYXItPmhlaWdodCA9IGF0b2kodmFsdWUpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXR0ciwgImRlbGl2ZXJ5LW1ldGhvZCIpKSB7CiAgICAgICAgIC8qIFBvc3NpYmxlIHZhbHVlcyBhcmU6IGlubGluZSwgaW5fYmFuZCwgb3V0X2JhbmQvc3BlY2lmaWNfbmFtZS4gKi8KQEAgLTMzNCw3ICszMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICBhdl9iYXNlNjRfZGVjb2RlKGRlY29kZWRfcGFja2V0LCB2YWx1ZSwgZGVjb2RlZF9hbGxvYyk7CiAKICAgICAgICAgICAgICAgICByZXN1bHQgPSBwYXJzZV9wYWNrZWRfaGVhZGVycwotICAgICAgICAgICAgICAgICAgICAoZGVjb2RlZF9wYWNrZXQsIGRlY29kZWRfcGFja2V0ICsgcGFja2V0X3NpemUsIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAocywgZGVjb2RlZF9wYWNrZXQsIGRlY29kZWRfcGFja2V0ICsgcGFja2V0X3NpemUsIHBhciwKICAgICAgICAgICAgICAgICAgICAgeGlwaF9kYXRhKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKQEAgLTM2Niw3ICszNjUsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1SVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3RoZW9yYV9keW5hbWljX2hhbmRsZXIgPSB7Citjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyIGZmX3RoZW9yYV9keW5hbWljX2hhbmRsZXIgPSB7CiAgICAgLmVuY19uYW1lICAgICAgICAgPSAidGhlb3JhIiwKICAgICAuY29kZWNfdHlwZSAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTywKICAgICAuY29kZWNfaWQgICAgICAgICA9IEFWX0NPREVDX0lEX1RIRU9SQSwKQEAgLTM3Niw3ICszNzUsNyBAQAogICAgIC5wYXJzZV9wYWNrZXQgICAgID0geGlwaF9oYW5kbGVfcGFja2V0LAogfTsKIAotUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92b3JiaXNfZHluYW1pY19oYW5kbGVyID0geworY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciBmZl92b3JiaXNfZHluYW1pY19oYW5kbGVyID0gewogICAgIC5lbmNfbmFtZSAgICAgICAgID0gInZvcmJpcyIsCiAgICAgLmNvZGVjX3R5cGUgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU8sCiAgICAgLmNvZGVjX2lkICAgICAgICAgPSBBVl9DT0RFQ19JRF9WT1JCSVMsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBlbmMuYyBiL2xpYmF2Zm9ybWF0L3J0cGVuYy5jCmluZGV4IDMxNTY5ZDYuLjYzMDQ3YmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGVuYy5jCkBAIC00OSw2ICs0OSw3IEBACiBzdGF0aWMgaW50IGlzX3N1cHBvcnRlZChlbnVtIEFWQ29kZWNJRCBpZCkKIHsKICAgICBzd2l0Y2goaWQpIHsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0RJUkFDOgogICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MToKICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjM6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjYzUDoKQEAgLTY1LDYgKzY2LDcgQEAKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TODoKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRCRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZCRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZMRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VODoKQEAgLTc0LDggKzc2LDEwIEBACiAgICAgY2FzZSBBVl9DT0RFQ19JRF9WT1JCSVM6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9USEVPUkE6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDg6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDk6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9HNzIyOgogICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyNjoKKyAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0c3MjZMRToKICAgICBjYXNlIEFWX0NPREVDX0lEX0lMQkM6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9NSlBFRzoKICAgICBjYXNlIEFWX0NPREVDX0lEX1NQRUVYOgpAQCAtOTcsOCArMTAxLDggQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAgICAgc3QgPSBzMS0+c3RyZWFtc1swXTsKLSAgICBpZiAoIWlzX3N1cHBvcnRlZChzdC0+Y29kZWMtPmNvZGVjX2lkKSkgewotICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjICVzXG4iLCBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlYy0+Y29kZWNfaWQpKTsKKyAgICBpZiAoIWlzX3N1cHBvcnRlZChzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSkgeworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjICVzXG4iLCBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpKTsKIAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTA2LDcgKzExMCw3IEBACiAgICAgaWYgKHMtPnBheWxvYWRfdHlwZSA8IDApIHsKICAgICAgICAgLyogUmUtdmFsaWRhdGUgbm9uLWR5bmFtaWMgcGF5bG9hZCB0eXBlcyAqLwogICAgICAgICBpZiAoc3QtPmlkIDwgUlRQX1BUX1BSSVZBVEUpCi0gICAgICAgICAgICBzdC0+aWQgPSBmZl9ydHBfZ2V0X3BheWxvYWRfdHlwZShzMSwgc3QtPmNvZGVjLCAtMSk7CisgICAgICAgICAgICBzdC0+aWQgPSBmZl9ydHBfZ2V0X3BheWxvYWRfdHlwZShzMSwgc3QtPmNvZGVjcGFyLCAtMSk7CiAKICAgICAgICAgcy0+cGF5bG9hZF90eXBlID0gc3QtPmlkOwogICAgIH0gZWxzZSB7CkBAIC0xNDMsNyArMTQ3LDcgQEAKICAgICB9IGVsc2UKICAgICAgICAgczEtPnBhY2tldF9zaXplID0gczEtPnBiLT5tYXhfcGFja2V0X3NpemU7CiAgICAgaWYgKHMxLT5wYWNrZXRfc2l6ZSA8PSAxMikgewotICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIk1heCBwYWNrZXQgc2l6ZSAlZCB0b28gbG93XG4iLCBzMS0+cGFja2V0X3NpemUpOworICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIk1heCBwYWNrZXQgc2l6ZSAldSB0b28gbG93XG4iLCBzMS0+cGFja2V0X3NpemUpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwogICAgIH0KICAgICBzLT5idWYgPSBhdl9tYWxsb2MoczEtPnBhY2tldF9zaXplKTsKQEAgLTE1MiwxMyArMTU2LDEzIEBACiAgICAgfQogICAgIHMtPm1heF9wYXlsb2FkX3NpemUgPSBzMS0+cGFja2V0X3NpemUgLSAxMjsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIDkwMDAwKTsKICAgICB9CiAgICAgcy0+YnVmX3B0ciA9IHMtPmJ1ZjsKLSAgICBzd2l0Y2goc3QtPmNvZGVjLT5jb2RlY19pZCkgeworICAgIHN3aXRjaChzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDI6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDM6CiAgICAgICAgIHMtPmJ1Zl9wdHIgPSBzLT5idWYgKyA0OwpAQCAtMTczLDEwICsxNzcsMjEgQEAKICAgICAgICAgICAgIG4gPSAxOwogICAgICAgICBzLT5tYXhfcGF5bG9hZF9zaXplID0gbiAqIFRTX1BBQ0tFVF9TSVpFOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX0RJUkFDOgorICAgICAgICBpZiAoczEtPnN0cmljdF9zdGRfY29tcGxpYW5jZSA+IEZGX0NPTVBMSUFOQ0VfRVhQRVJJTUVOVEFMKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICJQYWNrZXRpemluZyBWQy0yIGlzIGV4cGVyaW1lbnRhbCBhbmQgZG9lcyBub3QgdXNlIGFsbCB2YWx1ZXMgIgorICAgICAgICAgICAgICAgICAgICJvZiB0aGUgc3BlY2lmaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgIihldmVuIHRob3VnaCBtb3N0IHJlY2VpdmVycyBtYXkgaGFuZGxlIGl0IGp1c3QgZmluZSkuICIKKyAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHNldCAtc3RyaWN0IGV4cGVyaW1lbnRhbCBpbiBvcmRlciB0byBlbmFibGUgaXQuXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfRVhQRVJJTUVOVEFMOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2MToKICAgICAgICAgaWYgKHMxLT5zdHJpY3Rfc3RkX2NvbXBsaWFuY2UgPiBGRl9DT01QTElBTkNFX0VYUEVSSU1FTlRBTCkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAiUGFja2V0aXppbmcgSDI2MSBpcyBleHBlcmltZW50YWwgYW5kIHByb2R1Y2VzIGluY29ycmVjdCAiCisgICAgICAgICAgICAgICAgICAgIlBhY2tldGl6aW5nIEguMjYxIGlzIGV4cGVyaW1lbnRhbCBhbmQgcHJvZHVjZXMgaW5jb3JyZWN0ICIKICAgICAgICAgICAgICAgICAgICAicGFja2V0aXphdGlvbiBmb3IgY2FzZXMgd2hlcmUgR09CcyBkb24ndCBmaXQgaW50byBwYWNrZXRzICIKICAgICAgICAgICAgICAgICAgICAiKGV2ZW4gdGhvdWdoIG1vc3QgcmVjZWl2ZXJzIG1heSBoYW5kbGUgaXQganVzdCBmaW5lKS4gIgogICAgICAgICAgICAgICAgICAgICJQbGVhc2Ugc2V0IC1mX3N0cmljdCBleHBlcmltZW50YWwgaW4gb3JkZXIgdG8gZW5hYmxlIGl0LlxuIik7CkBAIC0xODYsMTcgKzIwMSwyNyBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0gyNjQ6CiAgICAgICAgIC8qIGNoZWNrIGZvciBILjI2NCBNUDQgc3ludGF4ICovCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplID4gNCAmJiBzdC0+Y29kZWMtPmV4dHJhZGF0YVswXSA9PSAxKSB7Ci0gICAgICAgICAgICBzLT5uYWxfbGVuZ3RoX3NpemUgPSAoc3QtPmNvZGVjLT5leHRyYWRhdGFbNF0gJiAweDAzKSArIDE7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID4gNCAmJiBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVswXSA9PSAxKSB7CisgICAgICAgICAgICBzLT5uYWxfbGVuZ3RoX3NpemUgPSAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFbNF0gJiAweDAzKSArIDE7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9IRVZDOgogICAgICAgICAvKiBPbmx5IGNoZWNrIGZvciB0aGUgc3RhbmRhcmRpemVkIGh2Y0MgdmVyc2lvbiBvZiBleHRyYWRhdGEsIGtlZXBpbmcKLSAgICAgICAgICogdGhpbmdzIHNpbXBsZSBhbmQgc2ltaWxhciB0byB0aGUgYXZjQy9IMjY0IGNhc2UgYWJvdmUsIGluc3RlYWQKKyAgICAgICAgICogdGhpbmdzIHNpbXBsZSBhbmQgc2ltaWxhciB0byB0aGUgYXZjQy9ILjI2NCBjYXNlIGFib3ZlLCBpbnN0ZWFkCiAgICAgICAgICAqIG9mIHRyeWluZyB0byBoYW5kbGUgdGhlIHByZS1zdGFuZGFyZGl6YXRpb24gdmVyc2lvbnMgKGFzIGluCiAgICAgICAgICAqIGxpYmF2Y29kZWMvaGV2Yy5jKS4gKi8KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgPiAyMSAmJiBzdC0+Y29kZWMtPmV4dHJhZGF0YVswXSA9PSAxKSB7Ci0gICAgICAgICAgICBzLT5uYWxfbGVuZ3RoX3NpemUgPSAoc3QtPmNvZGVjLT5leHRyYWRhdGFbMjFdICYgMHgwMykgKyAxOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSA+IDIxICYmIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzBdID09IDEpIHsKKyAgICAgICAgICAgIHMtPm5hbF9sZW5ndGhfc2l6ZSA9IChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsyMV0gJiAweDAzKSArIDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDk6CisgICAgICAgIGlmIChzMS0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID4gRkZfQ09NUExJQU5DRV9FWFBFUklNRU5UQUwpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlBhY2tldGl6aW5nIFZQOSBpcyBleHBlcmltZW50YWwgYW5kIGl0cyBzcGVjaWZpY2F0aW9uIGlzICIKKyAgICAgICAgICAgICAgICAgICAic3RpbGwgaW4gZHJhZnQgc3RhdGUuICIKKyAgICAgICAgICAgICAgICAgICAiUGxlYXNlIHNldCAtc3RyaWN0IGV4cGVyaW1lbnRhbCBpbiBvcmRlciB0byBlbmFibGUgaXQuXG4iKTsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1JfRVhQRVJJTUVOVEFMOworICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfVk9SQklTOgpAQCAtMjA5LDcgKzIzNCw3IEBACiAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCA4MDAwKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9PUFVTOgotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPiAyKSB7CiAgICAgICAgICAgICBhdl9sb2coczEsIEFWX0xPR19FUlJPUiwgIk11bHRpc3RyZWFtIG9wdXMgbm90IHN1cHBvcnRlZCBpbiBSVFBcbiIpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CkBAIC0yMTksMTYgKzI0NCwxNiBAQAogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgNDgwMDApOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0lMQkM6Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmJsb2NrX2FsaWduICE9IDM4ICYmIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gIT0gNTApIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gIT0gMzggJiYgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAhPSA1MCkgewogICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgaUxCQyBibG9jayBzaXplIHNwZWNpZmllZFxuIik7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KLSAgICAgICAgcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0ID0gcy0+bWF4X3BheWxvYWRfc2l6ZSAvIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247CisgICAgICAgIHMtPm1heF9mcmFtZXNfcGVyX3BhY2tldCA9IHMtPm1heF9wYXlsb2FkX3NpemUgLyBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0NPREVDX0lEX0FNUl9OQjoKICAgICBjYXNlIEFWX0NPREVDX0lEX0FNUl9XQjoKICAgICAgICAgcy0+bWF4X2ZyYW1lc19wZXJfcGFja2V0ID0gNTA7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FNUl9OQikKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQU1SX05CKQogICAgICAgICAgICAgbiA9IDMxOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBuID0gNjE7CkBAIC0yMzcsNyArMjYyLDcgQEAKICAgICAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiUlRQIG1heCBwYXlsb2FkIHNpemUgdG9vIHNtYWxsIGZvciBBTVJcbiIpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzICE9IDEpIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgIT0gMSkgewogICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJPbmx5IG1vbm8gaXMgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQpAQCAtMjYyLDcgKzI4Nyw3IEBACiAgICAgUlRQTXV4Q29udGV4dCAqcyA9IHMxLT5wcml2X2RhdGE7CiAgICAgdWludDMyX3QgcnRwX3RzOwogCi0gICAgYXZfbG9nKHMxLCBBVl9MT0dfVFJBQ0UsICJSVENQOiAlMDJ4ICUiUFJJeDY0IiAleFxuIiwgcy0+cGF5bG9hZF90eXBlLCBudHBfdGltZSwgcy0+dGltZXN0YW1wKTsKKyAgICBhdl9sb2coczEsIEFWX0xPR19UUkFDRSwgIlJUQ1A6ICUwMnggJSJQUkl4NjQiICUiUFJJeDMyIlxuIiwgcy0+cGF5bG9hZF90eXBlLCBudHBfdGltZSwgcy0+dGltZXN0YW1wKTsKIAogICAgIHMtPmxhc3RfcnRjcF9udHBfdGltZSA9IG50cF90aW1lOwogICAgIHJ0cF90cyA9IGF2X3Jlc2NhbGVfcShudHBfdGltZSAtIHMtPmZpcnN0X3J0Y3BfbnRwX3RpbWUsIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwfSwKQEAgLTI3MSw3ICsyOTYsOCBAQAogICAgIGF2aW9fdzgoczEtPnBiLCBSVENQX1NSKTsKICAgICBhdmlvX3diMTYoczEtPnBiLCA2KTsgLyogbGVuZ3RoIGluIHdvcmRzIC0gMSAqLwogICAgIGF2aW9fd2IzMihzMS0+cGIsIHMtPnNzcmMpOwotICAgIGF2aW9fd2I2NChzMS0+cGIsIE5UUF9UT19SVFBfRk9STUFUKG50cF90aW1lKSk7CisgICAgYXZpb193YjMyKHMxLT5wYiwgbnRwX3RpbWUgLyAxMDAwMDAwKTsKKyAgICBhdmlvX3diMzIoczEtPnBiLCAoKG50cF90aW1lICUgMTAwMDAwMCkgPDwgMzIpIC8gMTAwMDAwMCk7CiAgICAgYXZpb193YjMyKHMxLT5wYiwgcnRwX3RzKTsKICAgICBhdmlvX3diMzIoczEtPnBiLCBzLT5wYWNrZXRfY291bnQpOwogICAgIGF2aW9fd2IzMihzMS0+cGIsIHMtPm9jdGV0X2NvdW50KTsKQEAgLTQ1Nyw4ICs0ODMsOCBAQAogewogICAgIFJUUE11eENvbnRleHQgKnMgPSBzMS0+cHJpdl9kYXRhOwogICAgIEFWU3RyZWFtICpzdCA9IHMxLT5zdHJlYW1zWzBdOwotICAgIGludCBmcmFtZV9kdXJhdGlvbiA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihzdC0+Y29kZWMsIDApOwotICAgIGludCBmcmFtZV9zaXplID0gc3QtPmNvZGVjLT5ibG9ja19hbGlnbjsKKyAgICBpbnQgZnJhbWVfZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHN0LT5jb2RlY3BhciwgMCk7CisgICAgaW50IGZyYW1lX3NpemUgPSBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduOwogICAgIGludCBmcmFtZXMgPSBzaXplIC8gZnJhbWVfc2l6ZTsKIAogICAgIHdoaWxlIChmcmFtZXMgPiAwKSB7CkBAIC01MDgsMjYgKzUzNCwyOSBAQAogICAgIH0KICAgICBzLT5jdXJfdGltZXN0YW1wID0gcy0+YmFzZV90aW1lc3RhbXAgKyBwa3QtPnB0czsKIAotICAgIHN3aXRjaChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgc3dpdGNoKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9NVUxBVzoKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9BTEFXOgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1U4OgogICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1M4OgotICAgICAgICByZXR1cm4gcnRwX3NlbmRfc2FtcGxlcyhzMSwgcGt0LT5kYXRhLCBzaXplLCA4ICogc3QtPmNvZGVjLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBydHBfc2VuZF9zYW1wbGVzKHMxLCBwa3QtPmRhdGEsIHNpemUsIDggKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZCRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9VMTZMRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZCRToKICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMTZMRToKLSAgICAgICAgcmV0dXJuIHJ0cF9zZW5kX3NhbXBsZXMoczEsIHBrdC0+ZGF0YSwgc2l6ZSwgMTYgKiBzdC0+Y29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIHJ0cF9zZW5kX3NhbXBsZXMoczEsIHBrdC0+ZGF0YSwgc2l6ZSwgMTYgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9TMjRCRToKKyAgICAgICAgcmV0dXJuIHJ0cF9zZW5kX3NhbXBsZXMoczEsIHBrdC0+ZGF0YSwgc2l6ZSwgMjQgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0c3MjI6CiAgICAgICAgIC8qIFRoZSBhY3R1YWwgc2FtcGxlIHNpemUgaXMgaGFsZiBhIGJ5dGUgcGVyIHNhbXBsZSwgYnV0IHNpbmNlIHRoZQogICAgICAgICAgKiBzdHJlYW0gY2xvY2sgcmF0ZSBpcyA4MDAwIEh6IHdoaWxlIHRoZSBzYW1wbGUgcmF0ZSBpcyAxNjAwMCBIeiwKICAgICAgICAgICogdGhlIGNvcnJlY3QgcGFyYW1ldGVyIGZvciBzZW5kX3NhbXBsZXNfYml0cyBpcyA4IGJpdHMgcGVyIHN0cmVhbQogICAgICAgICAgKiBjbG9jay4gKi8KLSAgICAgICAgcmV0dXJuIHJ0cF9zZW5kX3NhbXBsZXMoczEsIHBrdC0+ZGF0YSwgc2l6ZSwgOCAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gcnRwX3NlbmRfc2FtcGxlcyhzMSwgcGt0LT5kYXRhLCBzaXplLCA4ICogc3QtPmNvZGVjcGFyLT5jaGFubmVscyk7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BRFBDTV9HNzI2OgorICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fRzcyNkxFOgogICAgICAgICByZXR1cm4gcnRwX3NlbmRfc2FtcGxlcyhzMSwgcGt0LT5kYXRhLCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpOwogICAgIGNhc2UgQVZfQ09ERUNfSURfTVAyOgogICAgIGNhc2UgQVZfQ09ERUNfSURfTVAzOgogICAgICAgICBydHBfc2VuZF9tcGVnYXVkaW8oczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CkBAIC01NDksNiArNTc4LDkgQEAKICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUcyVFM6CiAgICAgICAgIHJ0cF9zZW5kX21wZWd0c19yYXcoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfRElSQUM6CisgICAgICAgIGZmX3J0cF9zZW5kX3ZjMmhxKHMxLCBwa3QtPmRhdGEsIHNpemUsIHN0LT5jb2RlY3Bhci0+ZmllbGRfb3JkZXIgIT0gQVZfRklFTERfUFJPR1JFU1NJVkUgPyAxIDogMCk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKICAgICAgICAgZmZfcnRwX3NlbmRfaDI2NF9oZXZjKHMxLCBwa3QtPmRhdGEsIHNpemUpOwogICAgICAgICBicmVhazsKQEAgLTU3OCw2ICs2MTAsOSBAQAogICAgIGNhc2UgQVZfQ09ERUNfSURfVlA4OgogICAgICAgICBmZl9ydHBfc2VuZF92cDgoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfVlA5OgorICAgICAgICBmZl9ydHBfc2VuZF92cDkoczEsIHBrdC0+ZGF0YSwgc2l6ZSk7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfQ09ERUNfSURfSUxCQzoKICAgICAgICAgcnRwX3NlbmRfaWxiYyhzMSwgcGt0LT5kYXRhLCBzaXplKTsKICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBlbmMuaCBiL2xpYmF2Zm9ybWF0L3J0cGVuYy5oCmluZGV4IGQzNDE1M2YuLjYyZGM5YWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGVuYy5oCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGVuYy5oCkBAIC03Niw3ICs3Niw3IEBACiAgICAgeyAibGF0bSIsICJVc2UgTVA0QS1MQVRNIHBhY2tldGl6YXRpb24gaW5zdGVhZCBvZiBNUEVHNC1HRU5FUklDIGZvciBBQUMiLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQgPSBGRl9SVFBfRkxBR19NUDRBX0xBVE19LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgInJ0cGZsYWdzIiB9LCBcCiAgICAgeyAicmZjMjE5MCIsICJVc2UgUkZDIDIxOTAgcGFja2V0aXphdGlvbiBpbnN0ZWFkIG9mIFJGQyA0NjI5IGZvciBILjI2MyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1JUUF9GTEFHX1JGQzIxOTB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgInJ0cGZsYWdzIiB9LCBcCiAgICAgeyAic2tpcF9ydGNwIiwgIkRvbid0IHNlbmQgUlRDUCBzZW5kZXIgcmVwb3J0cyIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1JUUF9GTEFHX1NLSVBfUlRDUH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAicnRwZmxhZ3MiIH0sIFwKLSAgICB7ICJoMjY0X21vZGUwIiwgIlVzZSBtb2RlIDAgZm9yIEgyNjQgaW4gUlRQIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUlRQX0ZMQUdfSDI2NF9NT0RFMH0sIElOVF9NSU4sIElOVF9NQVgsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNLCAicnRwZmxhZ3MiIH0sIFwKKyAgICB7ICJoMjY0X21vZGUwIiwgIlVzZSBtb2RlIDAgZm9yIEguMjY0IGluIFJUUCIsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7Lmk2NCA9IEZGX1JUUF9GTEFHX0gyNjRfTU9ERTB9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgInJ0cGZsYWdzIiB9LCBcCiAgICAgeyAic2VuZF9ieWUiLCAiU2VuZCBSVENQIEJZRSBwYWNrZXRzIHdoZW4gZmluaXNoaW5nIiwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsuaTY0ID0gRkZfUlRQX0ZMQUdfU0VORF9CWUV9LCBJTlRfTUlOLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgInJ0cGZsYWdzIiB9IFwKIAogdm9pZCBmZl9ydHBfc2VuZF9kYXRhKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZjEsIGludCBsZW4sIGludCBtKTsKQEAgLTkxLDcgKzkxLDkgQEAKIHZvaWQgZmZfcnRwX3NlbmRfYW1yKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmYsIGludCBzaXplKTsKIHZvaWQgZmZfcnRwX3NlbmRfbXBlZ3ZpZGVvKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZjEsIGludCBzaXplKTsKIHZvaWQgZmZfcnRwX3NlbmRfeGlwaChBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWZmLCBpbnQgc2l6ZSk7Cit2b2lkIGZmX3J0cF9zZW5kX3ZjMmhxKEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsIGludCBpbnRlcmxhY2VkKTsKIHZvaWQgZmZfcnRwX3NlbmRfdnA4KEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmYsIGludCBzaXplKTsKK3ZvaWQgZmZfcnRwX3NlbmRfdnA5KEFWRm9ybWF0Q29udGV4dCAqczEsIGNvbnN0IHVpbnQ4X3QgKmJ1ZmYsIGludCBzaXplKTsKIHZvaWQgZmZfcnRwX3NlbmRfanBlZyhBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWZmLCBpbnQgc2l6ZSk7CiAKIGNvbnN0IHVpbnQ4X3QgKmZmX2gyNjNfZmluZF9yZXN5bmNfbWFya2VyX3JldmVyc2UoY29uc3QgdWludDhfdCAqYXZfcmVzdHJpY3Qgc3RhcnQsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBlbmNfYWFjLmMgYi9saWJhdmZvcm1hdC9ydHBlbmNfYWFjLmMKaW5kZXggZjgzNTE4My4uZmFkOGVhMiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZW5jX2FhYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGVuY19hYWMuYwpAQCAtMzMsNyArMzMsNyBAQAogICAgIHVpbnQ4X3QgKnA7CiAKICAgICAvKiBza2lwIEFEVFMgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0gICAgaWYgKChzMS0+c3RyZWFtc1swXS0+Y29kZWMtPmV4dHJhZGF0YV9zaXplKSA9PSAwKSB7CisgICAgaWYgKChzMS0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKSA9PSAwKSB7CiAgICAgICAgIHNpemUgLT0gNzsKICAgICAgICAgYnVmZiArPSA3OwogICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGVuY19jaGFpbi5jIGIvbGliYXZmb3JtYXQvcnRwZW5jX2NoYWluLmMKaW5kZXggOTZlNjVlZi4uZTY5ZmRjMiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZW5jX2NoYWluLmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZW5jX2NoYWluLmMKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAvKiBHZXQgdGhlIHBheWxvYWQgdHlwZSBmcm9tIHRoZSBjb2RlYyAqLwogICAgIGlmIChzdC0+aWQgPCBSVFBfUFRfUFJJVkFURSkKICAgICAgICAgcnRwY3R4LT5zdHJlYW1zWzBdLT5pZCA9Ci0gICAgICAgICAgICBmZl9ydHBfZ2V0X3BheWxvYWRfdHlwZShzLCBzdC0+Y29kZWMsIGlkeCk7CisgICAgICAgICAgICBmZl9ydHBfZ2V0X3BheWxvYWRfdHlwZShzLCBzdC0+Y29kZWNwYXIsIGlkeCk7CiAgICAgZWxzZQogICAgICAgICBydHBjdHgtPnN0cmVhbXNbMF0tPmlkID0gc3QtPmlkOwogCkBAIC03NCw3ICs3NCw3IEBACiAgICAgLyogU2V0IHRoZSBzeW5jaHJvbml6ZWQgc3RhcnQgdGltZS4gKi8KICAgICBydHBjdHgtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPSBzLT5zdGFydF90aW1lX3JlYWx0aW1lOwogCi0gICAgYXZjb2RlY19jb3B5X2NvbnRleHQocnRwY3R4LT5zdHJlYW1zWzBdLT5jb2RlYywgc3QtPmNvZGVjKTsKKyAgICBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShydHBjdHgtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLCBzdC0+Y29kZWNwYXIpOwogICAgIHJ0cGN0eC0+c3RyZWFtc1swXS0+dGltZV9iYXNlID0gc3QtPnRpbWVfYmFzZTsKIAogICAgIGlmIChoYW5kbGUpIHsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgIHJldHVybiAwOwogCiBmYWlsOgotICAgIGF2X2ZyZWUocnRwY3R4KTsKKyAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQocnRwY3R4KTsKICAgICBpZiAoaGFuZGxlKQogICAgICAgICBmZnVybF9jbG9zZShoYW5kbGUpOwogICAgIHJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBlbmNfaDI2MS5jIGIvbGliYXZmb3JtYXQvcnRwZW5jX2gyNjEuYwppbmRleCBmYzUwMjg1Li4yMjQ2MWNhIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBlbmNfaDI2MS5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGVuY19oMjYxLmMKQEAgLTcyLDEyICs3MiwxMiBAQAogICAgICAgICBydHBfY3R4LT5idWZbMl0gPSAwOyAvKiBxdWFudD0wLCBobXZkPTUgKi8KICAgICAgICAgcnRwX2N0eC0+YnVmWzNdID0gMDsgLyogdm12ZD0wICovCiAgICAgICAgIGlmIChmcmFtZV9zaXplIDwgMiB8fCBmcmFtZV9idWZbMF0gIT0gMCB8fCBmcmFtZV9idWZbMV0gIT0gMSkgewotICAgICAgICAgICAgLyogQSBmdWxsLCBjb3JyZWN0IGZpeCBmb3IgdGhpcyB3b3VsZCBiZSB0byBtYWtlIHRoZSBIMjYxIGVuY29kZXIKKyAgICAgICAgICAgIC8qIEEgZnVsbCwgY29ycmVjdCBmaXggZm9yIHRoaXMgd291bGQgYmUgdG8gbWFrZSB0aGUgSC4yNjEgZW5jb2RlcgogICAgICAgICAgICAgICogc3VwcG9ydCBpbnNlcnRpbmcgZXh0cmEgR09CIGhlYWRlcnMgKHRyaWdnZXJlZCBieSBzZXR0aW5nIGUuZy4KICAgICAgICAgICAgICAqICItcHMgMSIpLCBhbmQgaW5jbHVkaW5nIGluZm9ybWF0aW9uIGFib3V0IG1hY3JvYmxvY2sgYm91bmRhcmllcwogICAgICAgICAgICAgICogKHN1Y2ggYXMgZm9yIGgyNjNfcmZjMjE5MCkuICovCiAgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAiUlRQL0gyNjEgcGFja2V0IG5vdCBjdXQgYXQgYSBHT0IgYm91bmRhcnksIG5vdCBzaWduYWxlZCBjb3JyZWN0bHlcbiIpOworICAgICAgICAgICAgICAgICAgICJSVFAvSC4yNjEgcGFja2V0IG5vdCBjdXQgYXQgYSBHT0IgYm91bmRhcnksIG5vdCBzaWduYWxlZCBjb3JyZWN0bHlcbiIpOwogICAgICAgICB9CiAKICAgICAgICAgY3VyX2ZyYW1lX3NpemUgPSBGRk1JTihydHBfY3R4LT5tYXhfcGF5bG9hZF9zaXplIC0gUlRQX0gyNjFfSEVBREVSX1NJWkUsIGZyYW1lX3NpemUpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZW5jX2gyNjNfcmZjMjE5MC5jIGIvbGliYXZmb3JtYXQvcnRwZW5jX2gyNjNfcmZjMjE5MC5jCmluZGV4IDM0YjM5MDYuLjM1NjcyMDIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGVuY19oMjYzX3JmYzIxOTAuYworKysgYi9saWJhdmZvcm1hdC9ydHBlbmNfaDI2M19yZmMyMTkwLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIGluaXRfZ2V0X2JpdHMoJmdiLCBidWYsIHNpemUqOCk7CiAgICAgaWYgKGdldF9iaXRzKCZnYiwgMjIpID09IDB4MjApIHsgLyogUGljdHVyZSBTdGFydCBDb2RlICovCiAgICAgICAgIGluZm8udHIgID0gZ2V0X2JpdHMoJmdiLCA4KTsKLSAgICAgICAgc2tpcF9iaXRzKCZnYiwgMik7IC8qIFBUWVBFIHN0YXJ0LCBIMjYxIGRpc2FtYmlndWF0aW9uICovCisgICAgICAgIHNraXBfYml0cygmZ2IsIDIpOyAvKiBQVFlQRSBzdGFydCwgSC4yNjEgZGlzYW1iaWd1YXRpb24gKi8KICAgICAgICAgc2tpcF9iaXRzKCZnYiwgMyk7IC8qIFNwbGl0IHNjcmVlbiwgZG9jdW1lbnQgY2FtZXJhLCBmcmVlemUgcGljdHVyZSByZWxlYXNlICovCiAgICAgICAgIGluZm8uc3JjID0gZ2V0X2JpdHMoJmdiLCAzKTsKICAgICAgICAgaW5mby5pICAgPSBnZXRfYml0cygmZ2IsIDEpOwpAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtYl9pbmZvX3BvcysrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gc3BsaXQgSDI2MyBwYWNrZXQsICIKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMxLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gc3BsaXQgSC4yNjMgcGFja2V0LCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlIC1tYl9pbmZvICVkIG9yIC1wcyAxLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1heF9wYXlsb2FkX3NpemUgLSA4KTsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBlbmNfaDI2NF9oZXZjLmMgYi9saWJhdmZvcm1hdC9ydHBlbmNfaDI2NF9oZXZjLmMKaW5kZXggNzIzNGM3ZS4uMGM4OGZjMiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZW5jX2gyNjRfaGV2Yy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGVuY19oMjY0X2hldmMuYwpAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICAvLyBJZiB3ZSdyZSBvbmx5IHNlbmRpbmcgb25lIHNpbmdsZSBOQUwgdW5pdCwgc2VuZCBpdCBhcyBzdWNoLCBza2lwCiAgICAgICAgIC8vIHRoZSBTVEFQLUEvQVAgZnJhbWluZwogICAgICAgICBpZiAocy0+YnVmZmVyZWRfbmFscyA9PSAxKSB7Ci0gICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCBjb2RlYyA9IHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQ7CisgICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCBjb2RlYyA9IHMxLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQ7CiAgICAgICAgICAgICBpZiAoY29kZWMgPT0gQVZfQ09ERUNfSURfSDI2NCkKICAgICAgICAgICAgICAgICBmZl9ydHBfc2VuZF9kYXRhKHMxLCBzLT5idWYgKyAzLCBzLT5idWZfcHRyIC0gcy0+YnVmIC0gMywgbGFzdCk7CiAgICAgICAgICAgICBlbHNlCkBAIC01NSw3ICs1NSw3IEBACiBzdGF0aWMgdm9pZCBuYWxfc2VuZChBVkZvcm1hdENvbnRleHQgKnMxLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLCBpbnQgbGFzdCkKIHsKICAgICBSVFBNdXhDb250ZXh0ICpzID0gczEtPnByaXZfZGF0YTsKLSAgICBlbnVtIEFWQ29kZWNJRCBjb2RlYyA9IHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQ7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWMgPSBzMS0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkOwogCiAgICAgYXZfbG9nKHMxLCBBVl9MT0dfREVCVUcsICJTZW5kaW5nIE5BTCAleCBvZiBsZW4gJWQgTT0lZFxuIiwgYnVmWzBdICYgMHgxRiwgc2l6ZSwgbGFzdCk7CiAgICAgaWYgKHNpemUgPD0gcy0+bWF4X3BheWxvYWRfc2l6ZSkgewpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZW5jX2pwZWcuYyBiL2xpYmF2Zm9ybWF0L3J0cGVuY19qcGVnLmMKaW5kZXggNzJjMDdjNy4uMzhlYjJlNiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZW5jX2pwZWcuYworKysgYi9saWJhdmZvcm1hdC9ydHBlbmNfanBlZy5jCkBAIC00MiwyNCArNDIsMjQgQEAKICAgICBzLT50aW1lc3RhbXAgPSBzLT5jdXJfdGltZXN0YW1wOwogCiAgICAgLyogY29udmVydCB2aWRlbyBwaXhlbCBkaW1lbnNpb25zIGZyb20gcGl4ZWxzIHRvIGJsb2NrcyAqLwotICAgIHcgPSBBVl9DRUlMX1JTSElGVChzMS0+c3RyZWFtc1swXS0+Y29kZWMtPndpZHRoLCAzKTsKLSAgICBoID0gQVZfQ0VJTF9SU0hJRlQoczEtPnN0cmVhbXNbMF0tPmNvZGVjLT5oZWlnaHQsIDMpOworICAgIHcgPSBBVl9DRUlMX1JTSElGVChzMS0+c3RyZWFtc1swXS0+Y29kZWNwYXItPndpZHRoLCAzKTsKKyAgICBoID0gQVZfQ0VJTF9SU0hJRlQoczEtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5oZWlnaHQsIDMpOwogCiAgICAgLyogZ2V0IHRoZSBwaXhlbCBmb3JtYXQgdHlwZSBvciBmYWlsICovCi0gICAgaWYgKHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0MjJQIHx8Ci0gICAgICAgIChzMS0+c3RyZWFtc1swXS0+Y29kZWMtPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUcgJiYKLSAgICAgICAgIHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVjQyMlApKSB7CisgICAgaWYgKHMxLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWSjQyMlAgfHwKKyAgICAgICAgKHMxLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29sb3JfcmFuZ2UgPT0gQVZDT0xfUkFOR0VfSlBFRyAmJgorICAgICAgICAgczEtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjJQKSkgewogICAgICAgICB0eXBlID0gMDsKLSAgICB9IGVsc2UgaWYgKHMxLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1lVVko0MjBQIHx8Ci0gICAgICAgICAgICAgICAoczEtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2xvcl9yYW5nZSA9PSBBVkNPTF9SQU5HRV9KUEVHICYmCi0gICAgICAgICAgICAgICAgczEtPnN0cmVhbXNbMF0tPmNvZGVjLT5waXhfZm10ID09IEFWX1BJWF9GTVRfWVVWNDIwUCkpIHsKKyAgICB9IGVsc2UgaWYgKHMxLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWSjQyMFAgfHwKKyAgICAgICAgICAgICAgIChzMS0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUcgJiYKKyAgICAgICAgICAgICAgICBzMS0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFApKSB7CiAgICAgICAgIHR5cGUgPSAxOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF2X2xvZyhzMSwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0XG4iKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8qIHByZXBhcnNlIHRoZSBoZWFkZXIgZm9yIGdldHRpbmcgc29tZSBpbmZvcyAqLworICAgIC8qIHByZXBhcnNlIHRoZSBoZWFkZXIgZm9yIGdldHRpbmcgc29tZSBpbmZvICovCiAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICBpZiAoYnVmW2ldICE9IDB4ZmYpCiAgICAgICAgICAgICBjb250aW51ZTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3J0cGVuY19sYXRtLmMgYi9saWJhdmZvcm1hdC9ydHBlbmNfbGF0bS5jCmluZGV4IDQ0MzBjNDQuLjdiZGE2NmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0cGVuY19sYXRtLmMKKysrIGIvbGliYXZmb3JtYXQvcnRwZW5jX2xhdG0uYwpAQCAtMzQsNyArMzQsNyBAQAogICAgIGludCBsZW4gICAgPSAwOwogCiAgICAgLyogc2tpcCBBRFRTIGhlYWRlciwgaWYgcHJlc2VudCAqLwotICAgIGlmICgoczEtPnN0cmVhbXNbMF0tPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSkgPT0gMCkgeworICAgIGlmICgoczEtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSkgPT0gMCkgewogICAgICAgICBzaXplIC09IDc7CiAgICAgICAgIGJ1ZmYgKz0gNzsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBlbmNfbXBlZ3RzLmMgYi9saWJhdmZvcm1hdC9ydHBlbmNfbXBlZ3RzLmMKaW5kZXggZGIxNjgwZS4uNWY4MWUxYSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRwZW5jX21wZWd0cy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGVuY19tcGVndHMuYwpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICBzdC0+dGltZV9iYXNlICAgICAgICAgICA9IHMtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZTsKICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzLT5zdHJlYW1zW2ldLT5zYW1wbGVfYXNwZWN0X3JhdGlvOwotICAgICAgICBhdmNvZGVjX2NvcHlfY29udGV4dChzdC0+Y29kZWMsIHMtPnN0cmVhbXNbaV0tPmNvZGVjKTsKKyAgICAgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkoc3QtPmNvZGVjcGFyLCBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhcik7CiAgICAgfQogICAgIGlmICgocmV0ID0gYXZpb19vcGVuX2R5bl9idWYoJm1wZWd0c19jdHgtPnBiKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CkBAIC04NSw5ICs4NSwxMyBAQAogICAgIH0KICAgICBydHBfY3R4LT5vZm9ybWF0ID0gcnRwX2Zvcm1hdDsKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocnRwX2N0eCwgTlVMTCk7CisgICAgaWYgKCFzdCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CiAgICAgc3QtPnRpbWVfYmFzZS5udW0gICA9IDE7CiAgICAgc3QtPnRpbWVfYmFzZS5kZW4gICA9IDkwMDAwOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHMlRTOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUEVHMlRTOwogICAgIHJ0cF9jdHgtPnBiID0gcy0+cGI7CiAgICAgaWYgKChyZXQgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIocnRwX2N0eCwgTlVMTCkpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRwZW5jX3ZjMmhxLmMgYi9saWJhdmZvcm1hdC9ydHBlbmNfdmMyaHEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODUyMDRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvcnRwZW5jX3ZjMmhxLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBSVFAgcGFja2V0aXplciBmb3IgVkMtMiBIUSBwYXlsb2FkIGZvcm1hdCAoZHJhZnQgdmVyc2lvbiAxKSAtIGV4cGVyaW1lbnRhbAorICogQ29weXJpZ2h0IChjKSAyMDE2IFRob21hcyBWb2xrZXJ0IDx0aG9tYXNAbmV0emVhbC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2RpcmFjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZ29sb21iLmgiCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgInJ0cGVuYy5oIgorCisjZGVmaW5lIFJUUF9WQzJIUV9QTF9IRUFERVJfU0laRSAgICAgICAgICAgICA0CisKKyNkZWZpbmUgRElSQUNfREFUQV9VTklUX0hFQURFUl9TSVpFICAgICAgICAgIDEzCisjZGVmaW5lIERJUkFDX1BJQ19OUl9TSVpFICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIERJUkFDX1JUUF9QQ09ERV9IUV9QSUNfRlJBR01FTlQgICAgICAweEVDCisKK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCB1aW50OF90IHBhcnNlX2NvZGUsIGludCBpbmZvX2hkcl9zaXplLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLCBpbnQgaSwgaW50IGYsIGludCBydHBfbSkKK3sKKyAgICBSVFBNdXhDb250ZXh0ICpydHBfY3R4ID0gY3R4LT5wcml2X2RhdGE7CisKKyAgICBBVl9XQjE2KCZydHBfY3R4LT5idWZbMF0sIDApOyAvKiBleHRlbmRlZCBzZXF1ZW5jZSBudW1iZXIgKi8KKyAgICBBVl9XQjggKCZydHBfY3R4LT5idWZbMl0sIGkgPyAoZiA/ICgweDAzKSA6ICgweDAyKSkgOiAweDAwKTsgLyogZmxhZ3M6IGludGVybGFjZWQsIHNlY29uZCBmaWVsZCAqLworICAgIEFWX1dCOCAoJnJ0cF9jdHgtPmJ1ZlszXSwgcGFyc2VfY29kZSk7CisgICAgaWYgKHNpemUgPiAwKQorICAgICAgICBtZW1jcHkoJnJ0cF9jdHgtPmJ1Zls0ICsgaW5mb19oZHJfc2l6ZV0sIGJ1Ziwgc2l6ZSk7CisgICAgZmZfcnRwX3NlbmRfZGF0YShjdHgsIHJ0cF9jdHgtPmJ1ZiwgUlRQX1ZDMkhRX1BMX0hFQURFUl9TSVpFICsgaW5mb19oZHJfc2l6ZSArIHNpemUsIHJ0cF9tKTsKK30KKworc3RhdGljIHZvaWQgc2VuZF9waWN0dXJlKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplLCBpbnQgaW50ZXJsYWNlZCkKK3sKKyAgICBSVFBNdXhDb250ZXh0ICpydHBfY3R4ID0gY3R4LT5wcml2X2RhdGE7CisgICAgR2V0Qml0Q29udGV4dCBnYzsKKyAgICBpbnQgbHZsLCBzZWNvbmRfZmllbGQ7CisgICAgdWludDMyX3QgcGljX25yLCB3YXZlbGV0X2RlcHRoLCBwcmVmaXhfYnl0ZXMsIHNpemVfc2NhbGVyOworICAgIHVpbnQxNl90IGZyYWdfbGVuOworICAgIGNoYXIgKmluZm9faGRyID0gJnJ0cF9jdHgtPmJ1Zls0XTsKKworICAgIHBpY19uciA9IEFWX1JCMzIoJmJ1ZlswXSk7CisgICAgYnVmICs9IERJUkFDX1BJQ19OUl9TSVpFOworICAgIHNpemUgLT0gRElSQUNfUElDX05SX1NJWkU7CisgICAgc2Vjb25kX2ZpZWxkID0gaW50ZXJsYWNlZCAmJiAocGljX25yICYgMHgwMSk7CisKKyAgICBpbml0X2dldF9iaXRzKCZnYywgYnVmLCA4ICAqIHNpemUpOworICAgICAgICAgICAgICAgICAgICBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZnYyk7IC8qIHdhdmVsZXRfaWR4ICovCisgICAgd2F2ZWxldF9kZXB0aCA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJmdjKTsKKyAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYigmZ2MpOyAvKiBudW1feCAqLworICAgICAgICAgICAgICAgICAgICBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZnYyk7IC8qIG51bV95ICovCisgICAgcHJlZml4X2J5dGVzICA9IGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJmdjKTsKKyAgICBzaXplX3NjYWxlciAgID0gZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYigmZ2MpOworICAgIC8qIHBhc3MgdGhlIHF1YW50aXphdGlvbiBtYXRyaWNlcyAqLworICAgIGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJmdjKTsKKyAgICBmb3IobHZsID0gMDsgbHZsIDwgd2F2ZWxldF9kZXB0aDsgbHZsKyspCisgICAgeworICAgICAgICBnZXRfaW50ZXJsZWF2ZWRfdWVfZ29sb21iKCZnYyk7CisgICAgICAgIGdldF9pbnRlcmxlYXZlZF91ZV9nb2xvbWIoJmdjKTsKKyAgICAgICAgZ2V0X2ludGVybGVhdmVkX3VlX2dvbG9tYigmZ2MpOworICAgIH0KKworICAgIGZyYWdfbGVuID0gKGdldF9iaXRzX2NvdW50KCZnYykgKyA3KSAvIDg7IC8qIGxlbmd0aCBvZiB0cmFuc2Zvcm0gcGFyYW1ldGVycyAqLworCisgICAgQVZfV0IzMigmaW5mb19oZHJbIDBdLCBwaWNfbnIpOworICAgIEFWX1dCMTYoJmluZm9faGRyWyA0XSwgcHJlZml4X2J5dGVzKTsKKyAgICBBVl9XQjE2KCZpbmZvX2hkclsgNl0sIHNpemVfc2NhbGVyKTsKKyAgICBBVl9XQjE2KCZpbmZvX2hkclsgOF0sIGZyYWdfbGVuKTsKKyAgICBBVl9XQjE2KCZpbmZvX2hkclsxMF0sIDAgLyogbnIuIG9mIHNsaWNlcyAqLyk7CisgICAgc2VuZF9wYWNrZXQoY3R4LCBESVJBQ19SVFBfUENPREVfSFFfUElDX0ZSQUdNRU5ULCAxMiwgYnVmLCBmcmFnX2xlbiwgaW50ZXJsYWNlZCwgc2Vjb25kX2ZpZWxkLCAwKTsKKyAgICBidWYgKz0gZnJhZ19sZW47CisgICAgc2l6ZSAtPSBmcmFnX2xlbjsKKworICAgIHdoaWxlIChzaXplID4gMCkgeworICAgICAgICBmcmFnX2xlbiA9IEZGTUlOKHJ0cF9jdHgtPm1heF9wYXlsb2FkX3NpemUgLSAyMCAvKiBwbCBoZWFkZXIgKi8sIHNpemUpOworICAgICAgICBBVl9XQjE2KCZpbmZvX2hkclsgOF0sIGZyYWdfbGVuKTsKKyAgICAgICAgQVZfV0IxNigmaW5mb19oZHJbMTBdLCAxIC8qIG5yLiBvZiBzbGljZXMgKi8pOworICAgICAgICBBVl9XQjE2KCZpbmZvX2hkclsxMl0sIDAgLyogc2xpY2UgeCAqLyk7CisgICAgICAgIEFWX1dCMTYoJmluZm9faGRyWzE0XSwgMCAvKiBzbGljZSB5ICovKTsKKworICAgICAgICBzaXplIC09IGZyYWdfbGVuOworICAgICAgICBzZW5kX3BhY2tldChjdHgsIERJUkFDX1JUUF9QQ09ERV9IUV9QSUNfRlJBR01FTlQsIDE2LCBidWYsIGZyYWdfbGVuLCBpbnRlcmxhY2VkLCBzZWNvbmRfZmllbGQsIHNpemUgPiAwID8gMCA6IDEpOworICAgICAgICBidWYgKz0gZnJhZ19sZW47CisgICAgfQorfQorCit2b2lkIGZmX3J0cF9zZW5kX3ZjMmhxKEFWRm9ybWF0Q29udGV4dCAqY3R4LCBjb25zdCB1aW50OF90ICpmcmFtZV9idWYsIGludCBmcmFtZV9zaXplLCBpbnQgaW50ZXJsYWNlZCkKK3sKKyAgICBjb25zdCB1aW50OF90ICplbmQgPSBmcmFtZV9idWYgKyBmcmFtZV9zaXplOworICAgIGNvbnN0IHVpbnQ4X3QgKnVuaXQgPSBmcmFtZV9idWY7CisgICAgdWludDhfdCBwYXJzZV9jb2RlOworICAgIHVpbnQzMl90IHVuaXRfc2l6ZTsKKworICAgIHdoaWxlICh1bml0IDwgZW5kKSB7CisgICAgICAgIHBhcnNlX2NvZGUgPSB1bml0WzRdOworICAgICAgICB1bml0X3NpemUgPSBBVl9SQjMyKCZ1bml0WzVdKTsKKworICAgICAgICBzd2l0Y2ggKHBhcnNlX2NvZGUpIHsKKyAgICAgICAgLyogc2VxdWVuY2UgaGVhZGVyICovCisgICAgICAgIC8qIGVuZCBvZiBzZXF1ZW5jZSAqLworICAgICAgICBjYXNlIERJUkFDX1BDT0RFX1NFUV9IRUFERVI6CisgICAgICAgIGNhc2UgRElSQUNfUENPREVfRU5EX1NFUToKKyAgICAgICAgICAgIHNlbmRfcGFja2V0KGN0eCwgcGFyc2VfY29kZSwgMCwgdW5pdCArIERJUkFDX0RBVEFfVU5JVF9IRUFERVJfU0laRSwgdW5pdF9zaXplIC0gRElSQUNfREFUQV9VTklUX0hFQURFUl9TSVpFLCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKiBIUSBwaWN0dXJlICovCisgICAgICAgIGNhc2UgRElSQUNfUENPREVfUElDVFVSRV9IUToKKyAgICAgICAgICAgIHNlbmRfcGljdHVyZShjdHgsIHVuaXQgKyBESVJBQ19EQVRBX1VOSVRfSEVBREVSX1NJWkUsIHVuaXRfc2l6ZSAtIERJUkFDX0RBVEFfVU5JVF9IRUFERVJfU0laRSwgaW50ZXJsYWNlZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyogcGFyc2UgY29kZXMgd2l0aG91dCBzcGVjaWZpY2F0aW9uICovCisgICAgICAgIGNhc2UgRElSQUNfUENPREVfQVVYOgorICAgICAgICBjYXNlIERJUkFDX1BDT0RFX1BBRDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUoY3R4LCAiVkMtMiBwYXJzZSBjb2RlICVkIiwgcGFyc2VfY29kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1bml0ICs9IHVuaXRfc2l6ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBlbmNfdnA5LmMgYi9saWJhdmZvcm1hdC9ydHBlbmNfdnA5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyYWIyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGVuY192cDkuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogUlRQIHBhY2tldGl6ZXIgZm9yIFZQOSBwYXlsb2FkIGZvcm1hdCAoZHJhZnQgdmVyc2lvbiAwMikgLSBleHBlcmltZW50YWwKKyAqIENvcHlyaWdodCAoYykgMjAxNiBUaG9tYXMgVm9sa2VydCA8dGhvbWFzQG5ldHplYWwuZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJydHBlbmMuaCIKKworI2RlZmluZSBSVFBfVlA5X0RFU0NfUkVRVUlSRURfU0laRSAxCisKK3ZvaWQgZmZfcnRwX3NlbmRfdnA5KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQoreworICAgIFJUUE11eENvbnRleHQgKnJ0cF9jdHggPSBjdHgtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuOworCisgICAgcnRwX2N0eC0+dGltZXN0YW1wICA9IHJ0cF9jdHgtPmN1cl90aW1lc3RhbXA7CisgICAgcnRwX2N0eC0+YnVmX3B0ciAgICA9IHJ0cF9jdHgtPmJ1ZjsKKworICAgIC8qIG1hcmsgdGhlIGZpcnN0IGZyYWdtZW50ICovCisgICAgKnJ0cF9jdHgtPmJ1Zl9wdHIrKyA9IDB4MDg7CisKKyAgICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICAgICAgbGVuID0gRkZNSU4oc2l6ZSwgcnRwX2N0eC0+bWF4X3BheWxvYWRfc2l6ZSAtIFJUUF9WUDlfREVTQ19SRVFVSVJFRF9TSVpFKTsKKworICAgICAgICBpZiAobGVuID09IHNpemUpIHsKKyAgICAgICAgICAgIC8qIG1hcmsgdGhlIGxhc3QgZnJhZ21lbnQgKi8KKyAgICAgICAgICAgIHJ0cF9jdHgtPmJ1ZlswXSB8PSAweDA0OworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KHJ0cF9jdHgtPmJ1Zl9wdHIsIGJ1ZiwgbGVuKTsKKyAgICAgICAgZmZfcnRwX3NlbmRfZGF0YShjdHgsIHJ0cF9jdHgtPmJ1ZiwgbGVuICsgUlRQX1ZQOV9ERVNDX1JFUVVJUkVEX1NJWkUsIHNpemUgPT0gbGVuKTsKKworICAgICAgICBzaXplICAgICAgICAgICAgLT0gbGVuOworICAgICAgICBidWYgICAgICAgICAgICAgKz0gbGVuOworCisgICAgICAgIC8qIGNsZWFyIHRoZSBlbmQgYml0ICovCisgICAgICAgIHJ0cF9jdHgtPmJ1ZlswXSAmPSB+MHgwODsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBlbmNfeGlwaC5jIGIvbGliYXZmb3JtYXQvcnRwZW5jX3hpcGguYwppbmRleCBiNGQ5NTBiLi4wMGMyOWE3IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBlbmNfeGlwaC5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cGVuY194aXBoLmMKQEAgLTY4LDcgKzY4LDcgQEAKICAgICAvLyAwIC0gd2hvbGUgZnJhbWUgKHBvc3NpYmx5IG11bHRpcGxlIGZyYW1lcykKICAgICAvLyAxIC0gZmlyc3QgZnJhZ21lbnQKICAgICAvLyAyIC0gZnJhZ21lbnQgY29udGludWF0aW9uCi0gICAgLy8gMyAtIGxhc3QgZnJhZ21lbWVudAorICAgIC8vIDMgLSBsYXN0IGZyYWdtZW50CiAgICAgZnJhZyA9IHNpemUgPD0gbWF4X3BrdF9zaXplID8gMCA6IDE7CiAKICAgICBpZiAoIWZyYWcgJiYgIXhkdCkgeyAvLyBkbyB3ZSBoYXZlIGEgd2hvbGUgZnJhbWUgb2YgcmF3IGRhdGE/CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBwcm90by5jIGIvbGliYXZmb3JtYXQvcnRwcHJvdG8uYwppbmRleCA1MzhhN2IyLi5jMDFkOWNlIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBwcm90by5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0cHByb3RvLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgUlRQQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Ci0gICAgVVJMQ29udGV4dCAqcnRwX2hkLCAqcnRjcF9oZDsKKyAgICBVUkxDb250ZXh0ICpydHBfaGQsICpydGNwX2hkLCAqZmVjX2hkOwogICAgIGludCBydHBfZmQsIHJ0Y3BfZmQsIG5iX3NzbV9pbmNsdWRlX2FkZHJzLCBuYl9zc21fZXhjbHVkZV9hZGRyczsKICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAqKnNzbV9pbmNsdWRlX2FkZHJzLCAqKnNzbV9leGNsdWRlX2FkZHJzOwogICAgIGludCB3cml0ZV90b19zb3VyY2U7CkBAIC01OCw2ICs1OCw3IEBACiAgICAgaW50IGRzY3A7CiAgICAgY2hhciAqc291cmNlczsKICAgICBjaGFyICpibG9jazsKKyAgICBjaGFyICpmZWNfb3B0aW9uc19zdHI7CiB9IFJUUENvbnRleHQ7CiAKICNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFJUUENvbnRleHQsIHgpCkBAIC03NSw2ICs3Niw3IEBACiAgICAgeyAiZHNjcCIsICAgICAgICAgICAgICAgIkRTQ1AgY2xhc3MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZHNjcCksICAgICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAtMSB9LCAgICAtMSwgSU5UX01BWCwgLmZsYWdzID0gRHxFIH0sCiAgICAgeyAic291cmNlcyIsICAgICAgICAgICAgIlNvdXJjZSBsaXN0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoc291cmNlcyksICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICAgICAgICAgICAgICAgLmZsYWdzID0gRHxFIH0sCiAgICAgeyAiYmxvY2siLCAgICAgICAgICAgICAgIkJsb2NrIGxpc3QiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoYmxvY2spLCAgICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICAgICAgICAgICAgICAgLmZsYWdzID0gRHxFIH0sCisgICAgeyAiZmVjIiwgICAgICAgICAgICAgICAgIkZFQyIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoZmVjX29wdGlvbnNfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICAgICAgICAgICAgICAgLmZsYWdzID0gRSB9LAogICAgIHsgTlVMTCB9CiB9OwogCkBAIC0zMTYsMTMgKzMxOCwxNiBAQAogc3RhdGljIGludCBydHBfb3BlbihVUkxDb250ZXh0ICpoLCBjb25zdCBjaGFyICp1cmksIGludCBmbGFncykKIHsKICAgICBSVFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIEFWRGljdGlvbmFyeSAqZmVjX29wdHMgPSBOVUxMOwogICAgIGludCBydHBfcG9ydDsKICAgICBjaGFyIGhvc3RuYW1lWzI1Nl0sIGluY2x1ZGVfc291cmNlc1sxMDI0XSA9ICIiLCBleGNsdWRlX3NvdXJjZXNbMTAyNF0gPSAiIjsKICAgICBjaGFyICpzb3VyY2VzID0gaW5jbHVkZV9zb3VyY2VzLCAqYmxvY2sgPSBleGNsdWRlX3NvdXJjZXM7CisgICAgY2hhciAqZmVjX3Byb3RvY29sID0gTlVMTDsKICAgICBjaGFyIGJ1ZlsxMDI0XTsKICAgICBjaGFyIHBhdGhbMTAyNF07CiAgICAgY29uc3QgY2hhciAqcDsKICAgICBpbnQgaSwgbWF4X3JldHJ5X2NvdW50ID0gMzsKKyAgICBpbnQgcnRjcGZsYWdzOwogCiAgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIE5VTEwsIDAsIGhvc3RuYW1lLCBzaXplb2YoaG9zdG5hbWUpLCAmcnRwX3BvcnQsCiAgICAgICAgICAgICAgICAgIHBhdGgsIHNpemVvZihwYXRoKSwgdXJpKTsKQEAgLTM3NiwyNiArMzgxLDUyIEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocy0+ZmVjX29wdGlvbnNfc3RyKSB7CisgICAgICAgIHAgPSBzLT5mZWNfb3B0aW9uc19zdHI7CisKKyAgICAgICAgaWYgKCEoZmVjX3Byb3RvY29sID0gYXZfZ2V0X3Rva2VuKCZwLCAiPSIpKSkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBwYXJzZSB0aGUgRkVDIHByb3RvY29sIHZhbHVlXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RyY21wKGZlY19wcm90b2NvbCwgInByb21wZWciKSkgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIEZFQyBwcm90b2NvbCAlc1xuIiwgZmVjX3Byb3RvY29sKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSBzLT5mZWNfb3B0aW9uc19zdHIgKyBzdHJsZW4oZmVjX3Byb3RvY29sKTsKKyAgICAgICAgd2hpbGUgKCpwICYmICpwID09ICc9JykgcCsrOworCisgICAgICAgIGlmIChhdl9kaWN0X3BhcnNlX3N0cmluZygmZmVjX29wdHMsIHAsICI9IiwgIjoiLCAwKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcGFyc2UgdGhlIEZFQyBvcHRpb25zXG4iKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAocy0+dHRsID4gMCkgeworICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YgKGJ1ZiksICIlZCIsIHMtPnR0bCk7CisgICAgICAgICAgICBhdl9kaWN0X3NldCgmZmVjX29wdHMsICJ0dGwiLCBidWYsIDApOworICAgICAgICB9CisgICAgfQorCiAgICAgZm9yIChpID0gMDsgaSA8IG1heF9yZXRyeV9jb3VudDsgaSsrKSB7CiAgICAgICAgIGJ1aWxkX3VkcF91cmwocywgYnVmLCBzaXplb2YoYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwgcnRwX3BvcnQsIHMtPmxvY2FsX3J0cHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcywgYmxvY2spOwogICAgICAgICBpZiAoZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJnMtPnJ0cF9oZCwgYnVmLCBmbGFncywgJmgtPmludGVycnVwdF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGgtPnByb3RvY29sX3doaXRlbGlzdCkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpIDwgMCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgcy0+bG9jYWxfcnRwcG9ydCA9IGZmX3VkcF9nZXRfbG9jYWxfcG9ydChzLT5ydHBfaGQpOwogICAgICAgICBpZihzLT5sb2NhbF9ydHBwb3J0ID09IDY1NTM1KSB7CiAgICAgICAgICAgICBzLT5sb2NhbF9ydHBwb3J0ID0gLTE7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBydGNwZmxhZ3MgPSBmbGFncyB8IEFWSU9fRkxBR19XUklURTsKICAgICAgICAgaWYgKHMtPmxvY2FsX3J0Y3Bwb3J0IDwgMCkgewogICAgICAgICAgICAgcy0+bG9jYWxfcnRjcHBvcnQgPSBzLT5sb2NhbF9ydHBwb3J0ICsgMTsKICAgICAgICAgICAgIGJ1aWxkX3VkcF91cmwocywgYnVmLCBzaXplb2YoYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdG5hbWUsIHMtPnJ0Y3BfcG9ydCwgcy0+bG9jYWxfcnRjcHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMsIGJsb2NrKTsKLSAgICAgICAgICAgIGlmIChmZnVybF9vcGVuX3doaXRlbGlzdCgmcy0+cnRjcF9oZCwgYnVmLCBmbGFncywKKyAgICAgICAgICAgIGlmIChmZnVybF9vcGVuX3doaXRlbGlzdCgmcy0+cnRjcF9oZCwgYnVmLCBydGNwZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmgtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5wcm90b2NvbF93aGl0ZWxpc3QpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByb3RvY29sX3doaXRlbGlzdCwgaC0+cHJvdG9jb2xfYmxhY2tsaXN0LCBoKSA8IDApIHsKICAgICAgICAgICAgICAgICBzLT5sb2NhbF9ydHBwb3J0ID0gcy0+bG9jYWxfcnRjcHBvcnQgPSAtMTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMiArNDM1LDIwIEBACiAgICAgICAgIGJ1aWxkX3VkcF91cmwocywgYnVmLCBzaXplb2YoYnVmKSwKICAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZSwgcy0+cnRjcF9wb3J0LCBzLT5sb2NhbF9ydGNwcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLCBibG9jayk7Ci0gICAgICAgIGlmIChmZnVybF9vcGVuX3doaXRlbGlzdCgmcy0+cnRjcF9oZCwgYnVmLCBmbGFncywgJmgtPmludGVycnVwdF9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIGgtPnByb3RvY29sX3doaXRlbGlzdCkgPCAwKQorICAgICAgICBpZiAoZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJnMtPnJ0Y3BfaGQsIGJ1ZiwgcnRjcGZsYWdzLCAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpIDwgMCkKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCisgICAgcy0+ZmVjX2hkID0gTlVMTDsKKyAgICBpZiAoZmVjX3Byb3RvY29sKSB7CisgICAgICAgIGZmX3VybF9qb2luKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZlY19wcm90b2NvbCwgTlVMTCwgaG9zdG5hbWUsIHJ0cF9wb3J0LCBOVUxMKTsKKyAgICAgICAgaWYgKGZmdXJsX29wZW5fd2hpdGVsaXN0KCZzLT5mZWNfaGQsIGJ1ZiwgZmxhZ3MsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZWNfb3B0cywgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKICAgICAvKiBqdXN0IHRvIGVhc2UgaGFuZGxlIGFjY2Vzcy4gWFhYOiBuZWVkIHRvIHN1cHByZXNzIGRpcmVjdCBoYW5kbGUKICAgICAgICBhY2Nlc3MgKi8KICAgICBzLT5ydHBfZmQgPSBmZnVybF9nZXRfZmlsZV9oYW5kbGUocy0+cnRwX2hkKTsKQEAgLTQxNyw2ICs0NTYsMTAgQEAKIAogICAgIGgtPm1heF9wYWNrZXRfc2l6ZSA9IHMtPnJ0cF9oZC0+bWF4X3BhY2tldF9zaXplOwogICAgIGgtPmlzX3N0cmVhbWVkID0gMTsKKworICAgIGF2X2ZyZWUoZmVjX3Byb3RvY29sKTsKKyAgICBhdl9kaWN0X2ZyZWUoJmZlY19vcHRzKTsKKwogICAgIHJldHVybiAwOwogCiAgZmFpbDoKQEAgLTQyNCw2ICs0NjcsOSBAQAogICAgICAgICBmZnVybF9jbG9zZShzLT5ydHBfaGQpOwogICAgIGlmIChzLT5ydGNwX2hkKQogICAgICAgICBmZnVybF9jbG9zZShzLT5ydGNwX2hkKTsKKyAgICBmZnVybF9jbG9zZXAoJnMtPmZlY19oZCk7CisgICAgYXZfZnJlZShmZWNfcHJvdG9jb2wpOworICAgIGF2X2RpY3RfZnJlZSgmZmVjX29wdHMpOwogICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiB9CiAKQEAgLTQ2NiwxMyArNTEyLDEyIEBACiAgICAgICAgIGlmIChoLT5mbGFncyAmIEFWSU9fRkxBR19OT05CTE9DSykKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CiAgICAgfQotICAgIHJldHVybiBsZW47CiB9CiAKIHN0YXRpYyBpbnQgcnRwX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCiB7CiAgICAgUlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKLSAgICBpbnQgcmV0OworICAgIGludCByZXQsIHJldF9mZWM7CiAgICAgVVJMQ29udGV4dCAqaGQ7CiAKICAgICBpZiAoc2l6ZSA8IDIpCkBAIC01NDEsNyArNTg2LDE3IEBACiAgICAgICAgIGhkID0gcy0+cnRwX2hkOwogICAgIH0KIAotICAgIHJldCA9IGZmdXJsX3dyaXRlKGhkLCBidWYsIHNpemUpOworICAgIGlmICgocmV0ID0gZmZ1cmxfd3JpdGUoaGQsIGJ1Ziwgc2l6ZSkpIDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChzLT5mZWNfaGQgJiYgIVJUUF9QVF9JU19SVENQKGJ1ZlsxXSkpIHsKKyAgICAgICAgaWYgKChyZXRfZmVjID0gZmZ1cmxfd3JpdGUocy0+ZmVjX2hkLCBidWYsIHNpemUpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2VuZCBGRUNcbiIpOworICAgICAgICAgICAgcmV0dXJuIHJldF9mZWM7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC01NTksNiArNjE0LDcgQEAKIAogICAgIGZmdXJsX2Nsb3NlKHMtPnJ0cF9oZCk7CiAgICAgZmZ1cmxfY2xvc2Uocy0+cnRjcF9oZCk7CisgICAgZmZ1cmxfY2xvc2VwKCZzLT5mZWNfaGQpOwogICAgIHJldHVybiAwOwogfQogCkBAIC01ODAsMTIgKzYzNiw2IEBACiAgKiBAcmV0dXJuIHRoZSBsb2NhbCBwb3J0IG51bWJlcgogICovCiAKLWludCBmZl9ydHBfZ2V0X2xvY2FsX3J0Y3BfcG9ydChVUkxDb250ZXh0ICpoKQotewotICAgIFJUUENvbnRleHQgKnMgPSBoLT5wcml2X2RhdGE7Ci0gICAgcmV0dXJuIGZmX3VkcF9nZXRfbG9jYWxfcG9ydChzLT5ydGNwX2hkKTsKLX0KLQogc3RhdGljIGludCBydHBfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgpCiB7CiAgICAgUlRQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKQEAgLTYwNSw3ICs2NTUsNyBAQAogICAgIHJldHVybiAwOwogfQogCi1VUkxQcm90b2NvbCBmZl9ydHBfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9ydHBfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgICAgICAgPSAicnRwIiwKICAgICAudXJsX29wZW4gICAgICAgICAgICAgICAgICA9IHJ0cF9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICAgICAgICAgICAgID0gcnRwX3JlYWQsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHBwcm90by5oIGIvbGliYXZmb3JtYXQvcnRwcHJvdG8uaAppbmRleCA1YjI0M2ZiLi4xMzFhYWM1IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9ydHBwcm90by5oCisrKyBiL2xpYmF2Zm9ybWF0L3J0cHByb3RvLmgKQEAgLTI2LDYgKzI2LDUgQEAKIGludCBmZl9ydHBfc2V0X3JlbW90ZV91cmwoVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpKTsKIAogaW50IGZmX3J0cF9nZXRfbG9jYWxfcnRwX3BvcnQoVVJMQ29udGV4dCAqaCk7Ci1pbnQgZmZfcnRwX2dldF9sb2NhbF9ydGNwX3BvcnQoVVJMQ29udGV4dCAqaCk7CiAKICNlbmRpZiAvKiBBVkZPUk1BVF9SVFBQUk9UT19IICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHNwLmMgYi9saWJhdmZvcm1hdC9ydHNwLmMKaW5kZXggZDcxMDQ2OS4uOTc1NjM3YyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRzcC5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0c3AuYwpAQCAtOTMsMTAgKzkzLDE4IEBACiAgICAgUlRTUF9NRURJQVRZUEVfT1BUUygiYWxsb3dlZF9tZWRpYV90eXBlcyIsICJzZXQgbWVkaWEgdHlwZXMgdG8gYWNjZXB0IGZyb20gdGhlIHNlcnZlciIpLAogICAgIHsgIm1pbl9wb3J0IiwgInNldCBtaW5pbXVtIGxvY2FsIFVEUCBwb3J0IiwgT0ZGU0VUKHJ0cF9wb3J0X21pbiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSBSVFNQX1JUUF9QT1JUX01JTn0sIDAsIDY1NTM1LCBERUN8RU5DIH0sCiAgICAgeyAibWF4X3BvcnQiLCAic2V0IG1heGltdW0gbG9jYWwgVURQIHBvcnQiLCBPRkZTRVQocnRwX3BvcnRfbWF4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IFJUU1BfUlRQX1BPUlRfTUFYfSwgMCwgNjU1MzUsIERFQ3xFTkMgfSwKLSAgICB7ICJ0aW1lb3V0IiwgInNldCBtYXhpbXVtIHRpbWVvdXQgKGluIHNlY29uZHMpIHRvIHdhaXQgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zICgtMSBpcyBpbmZpbml0ZSwgaW1wbHkgZmxhZyBsaXN0ZW4pIiwgT0ZGU0VUKGluaXRpYWxfdGltZW91dCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIElOVF9NSU4sIElOVF9NQVgsIERFQyB9LAorICAgIHsgImxpc3Rlbl90aW1lb3V0IiwgInNldCBtYXhpbXVtIHRpbWVvdXQgKGluIHNlY29uZHMpIHRvIHdhaXQgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zICgtMSBpcyBpbmZpbml0ZSwgaW1wbHkgZmxhZyBsaXN0ZW4pIiwgT0ZGU0VUKGluaXRpYWxfdGltZW91dCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAtMX0sIElOVF9NSU4sIElOVF9NQVgsIERFQyB9LAorI2lmIEZGX0FQSV9PTERfUlRTUF9PUFRJT05TCisgICAgeyAidGltZW91dCIsICJzZXQgbWF4aW11bSB0aW1lb3V0IChpbiBzZWNvbmRzKSB0byB3YWl0IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucyAoLTEgaXMgaW5maW5pdGUsIGltcGx5IGZsYWcgbGlzdGVuKSAoZGVwcmVjYXRlZCwgdXNlIGxpc3Rlbl90aW1lb3V0KSIsIE9GRlNFVChpbml0aWFsX3RpbWVvdXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gLTF9LCBJTlRfTUlOLCBJTlRfTUFYLCBERUMgfSwKICAgICB7ICJzdGltZW91dCIsICJzZXQgdGltZW91dCAoaW4gbWljcm9zZWNvbmRzKSBvZiBzb2NrZXQgVENQIEkvTyBvcGVyYXRpb25zIiwgT0ZGU0VUKHN0aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBERUMgfSwKKyNlbHNlCisgICAgeyAidGltZW91dCIsICJzZXQgdGltZW91dCAoaW4gbWljcm9zZWNvbmRzKSBvZiBzb2NrZXQgVENQIEkvTyBvcGVyYXRpb25zIiwgT0ZGU0VUKHN0aW1lb3V0KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCBJTlRfTUlOLCBJTlRfTUFYLCBERUMgfSwKKyNlbmRpZgogICAgIENPTU1PTl9PUFRTKCksCi0gICAgeyAidXNlci1hZ2VudCIsICJvdmVycmlkZSBVc2VyLUFnZW50IGhlYWRlciIsIE9GRlNFVCh1c2VyX2FnZW50KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IExJQkFWRk9STUFUX0lERU5UfSwgMCwgMCwgREVDIH0sCisgICAgeyAidXNlcl9hZ2VudCIsICJvdmVycmlkZSBVc2VyLUFnZW50IGhlYWRlciIsIE9GRlNFVCh1c2VyX2FnZW50KSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IExJQkFWRk9STUFUX0lERU5UfSwgMCwgMCwgREVDIH0sCisjaWYgRkZfQVBJX09MRF9SVFNQX09QVElPTlMKKyAgICB7ICJ1c2VyLWFnZW50IiwgIm92ZXJyaWRlIFVzZXItQWdlbnQgaGVhZGVyIChkZXByZWNhdGVkLCB1c2UgdXNlcl9hZ2VudCkiLCBPRkZTRVQodXNlcl9hZ2VudCksIEFWX09QVF9UWVBFX1NUUklORywgey5zdHIgPSBMSUJBVkZPUk1BVF9JREVOVH0sIDAsIDAsIERFQyB9LAorI2VuZGlmCiAgICAgeyBOVUxMIH0sCiB9OwogCkBAIC0yMDMsMTQgKzIxMSwxNCBAQAogfQogCiAjaWYgQ09ORklHX1JUUERFQwotc3RhdGljIHZvaWQgaW5pdF9ydHBfaGFuZGxlcihSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyLAorc3RhdGljIHZvaWQgaW5pdF9ydHBfaGFuZGxlcihjb25zdCBSVFBEeW5hbWljUHJvdG9jb2xIYW5kbGVyICpoYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSVFNQU3RyZWFtICpydHNwX3N0LCBBVlN0cmVhbSAqc3QpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gc3QgPyBzdC0+Y29kZWMgOiBOVUxMOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzdCA/IHN0LT5jb2RlY3BhciA6IE5VTEw7CiAgICAgaWYgKCFoYW5kbGVyKQogICAgICAgICByZXR1cm47Ci0gICAgaWYgKGNvZGVjKQotICAgICAgICBjb2RlYy0+Y29kZWNfaWQgICAgICAgICAgPSBoYW5kbGVyLT5jb2RlY19pZDsKKyAgICBpZiAocGFyKQorICAgICAgICBwYXItPmNvZGVjX2lkICAgICAgICAgID0gaGFuZGxlci0+Y29kZWNfaWQ7CiAgICAgcnRzcF9zdC0+ZHluYW1pY19oYW5kbGVyID0gaGFuZGxlcjsKICAgICBpZiAoc3QpCiAgICAgICAgIHN0LT5uZWVkX3BhcnNpbmcgPSBoYW5kbGVyLT5uZWVkX3BhcnNpbmc7CkBAIC0yNDUsMTAgKzI1MywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWU3RyZWFtICpzdCwgUlRTUFN0cmVhbSAqcnRzcF9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZF90eXBlLCBjb25zdCBjaGFyICpwKQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHN0LT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3QtPmNvZGVjcGFyOwogICAgIGNoYXIgYnVmWzI1Nl07CiAgICAgaW50IGk7Ci0gICAgQVZDb2RlYyAqYzsKKyAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqZGVzYzsKICAgICBjb25zdCBjaGFyICpjX25hbWU7CiAKICAgICAvKiBTZWUgaWYgd2UgY2FuIGhhbmRsZSB0aGlzIGtpbmQgb2YgcGF5bG9hZC4KQEAgLTI1OSw0NiArMjY3LDQ2IEBACiAgICAgaWYgKHBheWxvYWRfdHlwZSA8IFJUUF9QVF9QUklWQVRFKSB7CiAgICAgICAgIC8qIFdlIGFyZSBpbiBhIHN0YW5kYXJkIGNhc2UKICAgICAgICAgICogKGZyb20gaHR0cDovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9ydHAtcGFyYW1ldGVycykuICovCi0gICAgICAgIGNvZGVjLT5jb2RlY19pZCA9IGZmX3J0cF9jb2RlY19pZChidWYsIGNvZGVjLT5jb2RlY190eXBlKTsKKyAgICAgICAgcGFyLT5jb2RlY19pZCA9IGZmX3J0cF9jb2RlY19pZChidWYsIHBhci0+Y29kZWNfdHlwZSk7CiAgICAgfQogCi0gICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7Ci0gICAgICAgIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXIgPQotICAgICAgICAgICAgZmZfcnRwX2hhbmRsZXJfZmluZF9ieV9uYW1lKGJ1ZiwgY29kZWMtPmNvZGVjX3R5cGUpOworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKKyAgICAgICAgY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlciA9CisgICAgICAgICAgICBmZl9ydHBfaGFuZGxlcl9maW5kX2J5X25hbWUoYnVmLCBwYXItPmNvZGVjX3R5cGUpOwogICAgICAgICBpbml0X3J0cF9oYW5kbGVyKGhhbmRsZXIsIHJ0c3Bfc3QsIHN0KTsKICAgICAgICAgLyogSWYgbm8gZHluYW1pYyBoYW5kbGVyIHdhcyBmb3VuZCwgY2hlY2sgd2l0aCB0aGUgbGlzdCBvZiBzdGFuZGFyZAogICAgICAgICAgKiBhbGxvY2F0ZWQgdHlwZXMsIGlmIHN1Y2ggYSBzdHJlYW0gZm9yIHNvbWUgcmVhc29uIGhhcHBlbnMgdG8KICAgICAgICAgICogdXNlIGEgcHJpdmF0ZSBwYXlsb2FkIHR5cGUuIFRoaXMgaXNuJ3QgaGFuZGxlZCBpbiBydHBkZWMuYywgc2luY2UKICAgICAgICAgICogdGhlIGZvcm1hdCBuYW1lIGZyb20gdGhlIHJ0cG1hcCBsaW5lIG5ldmVyIGlzIHBhc3NlZCBpbnRvIHJ0cGRlYy4gKi8KICAgICAgICAgaWYgKCFydHNwX3N0LT5keW5hbWljX2hhbmRsZXIpCi0gICAgICAgICAgICBjb2RlYy0+Y29kZWNfaWQgPSBmZl9ydHBfY29kZWNfaWQoYnVmLCBjb2RlYy0+Y29kZWNfdHlwZSk7CisgICAgICAgICAgICBwYXItPmNvZGVjX2lkID0gZmZfcnRwX2NvZGVjX2lkKGJ1ZiwgcGFyLT5jb2RlY190eXBlKTsKICAgICB9CiAKLSAgICBjID0gYXZjb2RlY19maW5kX2RlY29kZXIoY29kZWMtPmNvZGVjX2lkKTsKLSAgICBpZiAoYyAmJiBjLT5uYW1lKQotICAgICAgICBjX25hbWUgPSBjLT5uYW1lOworICAgIGRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KHBhci0+Y29kZWNfaWQpOworICAgIGlmIChkZXNjICYmIGRlc2MtPm5hbWUpCisgICAgICAgIGNfbmFtZSA9IGRlc2MtPm5hbWU7CiAgICAgZWxzZQogICAgICAgICBjX25hbWUgPSAiKG51bGwpIjsKIAogICAgIGdldF93b3JkX3NlcChidWYsIHNpemVvZihidWYpLCAiLyIsICZwKTsKICAgICBpID0gYXRvaShidWYpOwotICAgIHN3aXRjaCAoY29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICBzd2l0Y2ggKHBhci0+Y29kZWNfdHlwZSkgewogICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiYXVkaW8gY29kZWMgc2V0IHRvOiAlc1xuIiwgY19uYW1lKTsKLSAgICAgICAgY29kZWMtPnNhbXBsZV9yYXRlID0gUlRTUF9ERUZBVUxUX0FVRElPX1NBTVBMRVJBVEU7Ci0gICAgICAgIGNvZGVjLT5jaGFubmVscyA9IFJUU1BfREVGQVVMVF9OQl9BVURJT19DSEFOTkVMUzsKKyAgICAgICAgcGFyLT5zYW1wbGVfcmF0ZSA9IFJUU1BfREVGQVVMVF9BVURJT19TQU1QTEVSQVRFOworICAgICAgICBwYXItPmNoYW5uZWxzID0gUlRTUF9ERUZBVUxUX05CX0FVRElPX0NIQU5ORUxTOwogICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICAgIGNvZGVjLT5zYW1wbGVfcmF0ZSA9IGk7Ci0gICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgY29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgPSBpOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIHBhci0+c2FtcGxlX3JhdGUpOwogICAgICAgICAgICAgZ2V0X3dvcmRfc2VwKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIvIiwgJnApOwogICAgICAgICAgICAgaSA9IGF0b2koYnVmKTsKICAgICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgICAgICBjb2RlYy0+Y2hhbm5lbHMgPSBpOworICAgICAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgPSBpOwogICAgICAgICB9CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJhdWRpbyBzYW1wbGVyYXRlIHNldCB0bzogJWlcbiIsCi0gICAgICAgICAgICAgICBjb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJhdWRpbyBjaGFubmVscyBzZXQgdG86ICVpXG4iLAotICAgICAgICAgICAgICAgY29kZWMtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInZpZGVvIGNvZGVjIHNldCB0bzogJXNcbiIsIGNfbmFtZSk7CkBAIC00NDYsNyArNDU0LDEwIEBACiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChzdF90eXBlLCAidGV4dCIpKSB7CiAgICAgICAgICAgICBjb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwogICAgICAgICB9Ci0gICAgICAgIGlmIChjb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9VTktOT1dOIHx8ICEocnQtPm1lZGlhX3R5cGVfbWFzayAmICgxIDw8IGNvZGVjX3R5cGUpKSkgeworICAgICAgICBpZiAoY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVU5LTk9XTiB8fAorICAgICAgICAgICAgIShydC0+bWVkaWFfdHlwZV9tYXNrICYgKDEgPDwgY29kZWNfdHlwZSkpIHx8CisgICAgICAgICAgICBydC0+bmJfcnRzcF9zdHJlYW1zID49IHMtPm1heF9zdHJlYW1zCisgICAgICAgICkgewogICAgICAgICAgICAgczEtPnNraXBfbWVkaWEgPSAxOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC00ODcsNyArNDk4LDcgQEAKICAgICAgICAgICAgICAgICBpZiAoQ09ORklHX1JUUERFQyAmJiAhcnQtPnRzKQogICAgICAgICAgICAgICAgICAgICBydC0+dHMgPSBhdnByaXZfbXBlZ3RzX3BhcnNlX29wZW4ocyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXI7CisgICAgICAgICAgICAgICAgY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlcjsKICAgICAgICAgICAgICAgICBoYW5kbGVyID0gZmZfcnRwX2hhbmRsZXJfZmluZF9ieV9pZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPnNkcF9wYXlsb2FkX3R5cGUsIEFWTUVESUFfVFlQRV9EQVRBKTsKICAgICAgICAgICAgICAgICBpbml0X3J0cF9oYW5kbGVyKGhhbmRsZXIsIHJ0c3Bfc3QsIE5VTEwpOwpAQCAtNTAzLDE3ICs1MTQsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICBzdC0+aWQgPSBydC0+bmJfcnRzcF9zdHJlYW1zIC0gMTsKICAgICAgICAgICAgIHJ0c3Bfc3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IGNvZGVjX3R5cGU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBjb2RlY190eXBlOwogICAgICAgICAgICAgaWYgKHJ0c3Bfc3QtPnNkcF9wYXlsb2FkX3R5cGUgPCBSVFBfUFRfUFJJVkFURSkgewotICAgICAgICAgICAgICAgIFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmhhbmRsZXI7CisgICAgICAgICAgICAgICAgY29uc3QgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqaGFuZGxlcjsKICAgICAgICAgICAgICAgICAvKiBpZiBzdGFuZGFyZCBwYXlsb2FkIHR5cGUsIHdlIGNhbiBmaW5kIHRoZSBjb2RlYyByaWdodCBub3cgKi8KLSAgICAgICAgICAgICAgICBmZl9ydHBfZ2V0X2NvZGVjX2luZm8oc3QtPmNvZGVjLCBydHNwX3N0LT5zZHBfcGF5bG9hZF90eXBlKTsKLSAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID4gMCkKLSAgICAgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgIGZmX3J0cF9nZXRfY29kZWNfaW5mbyhzdC0+Y29kZWNwYXIsIHJ0c3Bfc3QtPnNkcF9wYXlsb2FkX3R5cGUpOworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmCisgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPiAwKQorICAgICAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICAgICAgLyogRXZlbiBzdGF0aWMgcGF5bG9hZCB0eXBlcyBtYXkgbmVlZCBhIGN1c3RvbSBkZXBhY2tldGl6ZXIgKi8KICAgICAgICAgICAgICAgICBoYW5kbGVyID0gZmZfcnRwX2hhbmRsZXJfZmluZF9ieV9pZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPnNkcF9wYXlsb2FkX3R5cGUsIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydHNwX3N0LT5zZHBfcGF5bG9hZF90eXBlLCBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpOwogICAgICAgICAgICAgICAgIGluaXRfcnRwX2hhbmRsZXIoaGFuZGxlciwgcnRzcF9zdCwgc3QpOwogICAgICAgICAgICAgICAgIGZpbmFsaXplX3J0cF9oYW5kbGVyX2luaXQocywgcnRzcF9zdCwgc3QpOwogICAgICAgICAgICAgfQpAQCAtNTczLDYgKzU4NCwxMCBAQAogICAgICAgICAgICAgICAgIHMxLT5zZWVuX2ZtdHAgPSAxOwogICAgICAgICAgICAgICAgIGF2X3N0cmxjcHkoczEtPmRlbGF5ZWRfZm10cCwgYnVmLCBzaXplb2YoczEtPmRlbGF5ZWRfZm10cCkpOwogICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGF2X3N0cnN0YXJ0KHAsICJzc3JjOiIsICZwKSAmJiBzLT5uYl9zdHJlYW1zID4gMCkgeworICAgICAgICAgICAgcnRzcF9zdCA9IHJ0LT5ydHNwX3N0cmVhbXNbcnQtPm5iX3J0c3Bfc3RyZWFtcyAtIDFdOworICAgICAgICAgICAgZ2V0X3dvcmQoYnVmMSwgc2l6ZW9mKGJ1ZjEpLCAmcCk7CisgICAgICAgICAgICBydHNwX3N0LT5zc3JjID0gc3RydG9sbChidWYxLCBOVUxMLCAxMCk7CiAgICAgICAgIH0gZWxzZSBpZiAoYXZfc3Ryc3RhcnQocCwgInJhbmdlOiIsICZwKSkgewogICAgICAgICAgICAgaW50NjRfdCBzdGFydCwgZW5kOwogCkBAIC01OTgsNyArNjEzLDcgQEAKICAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChwLCAiU2FtcGxlUmF0ZTppbnRlZ2VyOyIsICZwKSAmJgogICAgICAgICAgICAgICAgICAgIHMtPm5iX3N0cmVhbXMgPiAwKSB7CiAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbcy0+bmJfc3RyZWFtcyAtIDFdOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF0b2kocCk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXRvaShwKTsKICAgICAgICAgfSBlbHNlIGlmIChhdl9zdHJzdGFydChwLCAiY3J5cHRvOiIsICZwKSAmJiBzLT5uYl9zdHJlYW1zID4gMCkgewogICAgICAgICAgICAgLy8gUkZDIDQ1NjgKICAgICAgICAgICAgIHJ0c3Bfc3QgPSBydC0+cnRzcF9zdHJlYW1zW3J0LT5uYl9ydHNwX3N0cmVhbXMgLSAxXTsKQEAgLTY2Niw3ICs2ODEsNiBAQAogCiBpbnQgZmZfc2RwX3BhcnNlKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgY2hhciAqY29udGVudCkKIHsKLSAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOwogICAgIGNvbnN0IGNoYXIgKnA7CiAgICAgaW50IGxldHRlciwgaTsKICAgICAvKiBTb21lIFNEUCBsaW5lcywgcGFydGljdWxhcmx5IGZvciBSZWFsbWVkaWEgb3IgQVNGIFJUU1Agc3RyZWFtcywKQEAgLTcxMyw4ICs3MjcsNiBAQAogICAgICAgICBhdl9mcmVlcCgmczEtPmRlZmF1bHRfZXhjbHVkZV9zb3VyY2VfYWRkcnNbaV0pOwogICAgIGF2X2ZyZWVwKCZzMS0+ZGVmYXVsdF9leGNsdWRlX3NvdXJjZV9hZGRycyk7CiAKLSAgICBydC0+cCA9IGF2X21hbGxvY19hcnJheShydC0+bmJfcnRzcF9zdHJlYW1zICsgMSwgc2l6ZW9mKHN0cnVjdCBwb2xsZmQpICogMik7Ci0gICAgaWYgKCFydC0+cCkgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICByZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfUlRQREVDICovCkBAIC04MzAsNyArODQyLDEwIEBACiAKICAgICBpZiAoIXJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2KSB7CiAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0gZWxzZSBpZiAoQ09ORklHX1JUUERFQyAmJiBydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkgeworICAgIH0gZWxzZSBpZiAoQ09ORklHX1JUUERFQyAmJiBydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCAmJgorICAgICAgICAgICAgICAgcy0+aWZvcm1hdCkgeworICAgICAgICBSVFBEZW11eENvbnRleHQgKnJ0cGN0eCA9IHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2OworICAgICAgICBydHBjdHgtPnNzcmMgPSBydHNwX3N0LT5zc3JjOwogICAgICAgICBpZiAocnRzcF9zdC0+ZHluYW1pY19oYW5kbGVyKSB7CiAgICAgICAgICAgICBmZl9ydHBfcGFyc2Vfc2V0X2R5bmFtaWNfcHJvdG9jb2wocnRzcF9zdC0+dHJhbnNwb3J0X3ByaXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+ZHluYW1pY19wcm90b2NvbF9jb250ZXh0LApAQCAtMTMzMyw4ICsxMzQ4LDcgQEAKICAgICBmZnVybF93cml0ZShydC0+cnRzcF9oZF9vdXQsIG91dF9idWYsIHN0cmxlbihvdXRfYnVmKSk7CiAgICAgaWYgKHNlbmRfY29udGVudF9sZW5ndGggPiAwICYmIHNlbmRfY29udGVudCkgewogICAgICAgICBpZiAocnQtPmNvbnRyb2xfdHJhbnNwb3J0ID09IFJUU1BfTU9ERV9UVU5ORUwpIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ0dW5uZWxpbmcgb2YgUlRTUCByZXF1ZXN0cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBjb250ZW50IGRhdGEgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLCAiVHVubmVsaW5nIG9mIFJUU1AgcmVxdWVzdHMgd2l0aCBjb250ZW50IGRhdGEiKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICAgICAgfQogICAgICAgICBmZnVybF93cml0ZShydC0+cnRzcF9oZF9vdXQsIHNlbmRfY29udGVudCwgc2VuZF9jb250ZW50X2xlbmd0aCk7CkBAIC0xNDY5LDcgKzE0ODMsNyBAQAogICAgICAgICAgICAgICAgIC8qIHdlIHdpbGwgdXNlIHR3byBwb3J0cyBwZXIgcnRwIHN0cmVhbSAocnRwIGFuZCBydGNwKSAqLwogICAgICAgICAgICAgICAgIGogKz0gMjsKICAgICAgICAgICAgICAgICBlcnIgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmcnRzcF9zdC0+cnRwX2hhbmRsZSwgYnVmLCBBVklPX0ZMQUdfUkVBRF9XUklURSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssICZvcHRzLCBzLT5wcm90b2NvbF93aGl0ZWxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgJm9wdHMsIHMtPnByb3RvY29sX3doaXRlbGlzdCwgcy0+cHJvdG9jb2xfYmxhY2tsaXN0LCBOVUxMKTsKIAogICAgICAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CiAKQEAgLTE1MDEsNyArMTUxNSw3IEBACiAgICAgICAgICAgICAgKiB3aWxsIHJldHVybiBhbiBlcnJvci4gVGhlcmVmb3JlLCB3ZSBza2lwIHRob3NlIHN0cmVhbXMuICovCiAgICAgICAgICAgICBpZiAocnQtPnNlcnZlcl90eXBlID09IFJUU1BfU0VSVkVSX1dNUyAmJgogICAgICAgICAgICAgICAgIChydHNwX3N0LT5zdHJlYW1faW5kZXggPCAwIHx8Ci0gICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbcnRzcF9zdC0+c3RyZWFtX2luZGV4XS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0KKyAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1tydHNwX3N0LT5zdHJlYW1faW5kZXhdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PQogICAgICAgICAgICAgICAgICAgICBBVk1FRElBX1RZUEVfREFUQSkpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBzbnByaW50Zih0cmFuc3BvcnQsIHNpemVvZih0cmFuc3BvcnQpIC0gMSwKQEAgLTE2MTIsNyArMTYyNiw3IEBACiAgICAgICAgICAgICBmZl91cmxfam9pbih1cmwsIHNpemVvZih1cmwpLCAicnRwIiwgTlVMTCwgbmFtZWJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQsICIlcyIsIG9wdGJ1Zik7CiAgICAgICAgICAgICBpZiAoZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJnJ0c3Bfc3QtPnJ0cF9oYW5kbGUsIHVybCwgQVZJT19GTEFHX1JFQURfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLCBzLT5wcm90b2NvbF93aGl0ZWxpc3QpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwgcy0+cHJvdG9jb2xfd2hpdGVsaXN0LCBzLT5wcm90b2NvbF9ibGFja2xpc3QsIE5VTEwpIDwgMCkgewogICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgfQpAQCAtMTY1Miw3ICsxNjY2LDcgQEAKICAgICBjaGFyIHRjcG5hbWVbMTAyNF0sIGNtZFsyMDQ4XSwgYXV0aFsxMjhdOwogICAgIGNvbnN0IGNoYXIgKmxvd2VyX3J0c3BfcHJvdG8gPSAidGNwIjsKICAgICBpbnQgcG9ydCwgZXJyLCB0Y3BfZmQ7Ci0gICAgUlRTUE1lc3NhZ2VIZWFkZXIgcmVwbHkxID0gezB9LCAqcmVwbHkgPSAmcmVwbHkxOworICAgIFJUU1BNZXNzYWdlSGVhZGVyIHJlcGx5MSwgKnJlcGx5ID0gJnJlcGx5MTsKICAgICBpbnQgbG93ZXJfdHJhbnNwb3J0X21hc2sgPSAwOwogICAgIGludCBkZWZhdWx0X3BvcnQgPSBSVFNQX0RFRkFVTFRfUE9SVDsKICAgICBjaGFyIHJlYWxfY2hhbGxlbmdlWzY0XSA9ICIiOwpAQCAtMTY4MSw5ICsxNjk1LDEwIEBACiAgICAgcnQtPmxvd2VyX3RyYW5zcG9ydF9tYXNrICY9ICgxIDw8IFJUU1BfTE9XRVJfVFJBTlNQT1JUX05CKSAtIDE7CiAKIHJlZGlyZWN0OgorICAgIG1lbXNldCgmcmVwbHkxLCAwLCBzaXplb2YocmVwbHkxKSk7CiAgICAgLyogZXh0cmFjdCBob3N0bmFtZSBhbmQgcG9ydCAqLwogICAgIGF2X3VybF9zcGxpdChwcm90bywgc2l6ZW9mKHByb3RvKSwgYXV0aCwgc2l6ZW9mKGF1dGgpLAotICAgICAgICAgICAgICAgICBob3N0LCBzaXplb2YoaG9zdCksICZwb3J0LCBwYXRoLCBzaXplb2YocGF0aCksIHMtPmZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgaG9zdCwgc2l6ZW9mKGhvc3QpLCAmcG9ydCwgcGF0aCwgc2l6ZW9mKHBhdGgpLCBzLT51cmwpOwogCiAgICAgaWYgKCFzdHJjbXAocHJvdG8sICJydHNwcyIpKSB7CiAgICAgICAgIGxvd2VyX3J0c3BfcHJvdG8gICAgICAgICA9ICJ0bHMiOwpAQCAtMTcxNCw3ICsxNzI5LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8qIENvbnN0cnVjdCB0aGUgVVJJIHVzZWQgaW4gcmVxdWVzdDsgdGhpcyBpcyBzaW1pbGFyIHRvIHMtPmZpbGVuYW1lLAorICAgIC8qIENvbnN0cnVjdCB0aGUgVVJJIHVzZWQgaW4gcmVxdWVzdDsgdGhpcyBpcyBzaW1pbGFyIHRvIHMtPnVybCwKICAgICAgKiBidXQgd2l0aCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscyByZW1vdmVkIGFuZCBSVFNQIHNwZWNpZmljIG9wdGlvbnMKICAgICAgKiBzdHJpcHBlZCBvdXQuICovCiAgICAgZmZfdXJsX2pvaW4ocnQtPmNvbnRyb2xfdXJpLCBzaXplb2YocnQtPmNvbnRyb2xfdXJpKSwgcHJvdG8sIE5VTEwsCkBAIC0xNzQ2LDYgKzE3NjEsMTQgQEAKICAgICAgICAgICAgICAgICAgc2Vzc2lvbmNvb2tpZSk7CiAgICAgICAgIGF2X29wdF9zZXQocnQtPnJ0c3BfaGQtPnByaXZfZGF0YSwgImhlYWRlcnMiLCBoZWFkZXJzLCAwKTsKIAorICAgICAgICBpZiAoIXJ0LT5ydHNwX2hkLT5wcm90b2NvbF93aGl0ZWxpc3QgJiYgcy0+cHJvdG9jb2xfd2hpdGVsaXN0KSB7CisgICAgICAgICAgICBydC0+cnRzcF9oZC0+cHJvdG9jb2xfd2hpdGVsaXN0ID0gYXZfc3RyZHVwKHMtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICBpZiAoIXJ0LT5ydHNwX2hkLT5wcm90b2NvbF93aGl0ZWxpc3QpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgLyogY29tcGxldGUgdGhlIGNvbm5lY3Rpb24gKi8KICAgICAgICAgaWYgKGZmdXJsX2Nvbm5lY3QocnQtPnJ0c3BfaGQsIE5VTEwpKSB7CiAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CkBAIC0xODAxLDcgKzE4MjQsNyBAQAogICAgICAgICAgICAgICAgICAgICBob3N0LCBwb3J0LAogICAgICAgICAgICAgICAgICAgICAiP3RpbWVvdXQ9JWQiLCBydC0+c3RpbWVvdXQpOwogICAgICAgICBpZiAoKHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZydC0+cnRzcF9oZCwgdGNwbmFtZSwgQVZJT19GTEFHX1JFQURfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsIHMtPnByb3RvY29sX3doaXRlbGlzdCkpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLCBzLT5wcm90b2NvbF93aGl0ZWxpc3QsIHMtPnByb3RvY29sX2JsYWNrbGlzdCwgTlVMTCkpIDwgMCkgewogICAgICAgICAgICAgZXJyID0gcmV0OwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CkBAIC0xODk0LDQxICsxOTE3LDY5IEBACiAgICAgZmZfcnRzcF9jbG9zZV9zdHJlYW1zKHMpOwogICAgIGZmX3J0c3BfY2xvc2VfY29ubmVjdGlvbnMocyk7CiAgICAgaWYgKHJlcGx5LT5zdGF0dXNfY29kZSA+PTMwMCAmJiByZXBseS0+c3RhdHVzX2NvZGUgPCA0MDAgJiYgcy0+aWZvcm1hdCkgewotICAgICAgICBhdl9zdHJsY3B5KHMtPmZpbGVuYW1lLCByZXBseS0+bG9jYXRpb24sIHNpemVvZihzLT5maWxlbmFtZSkpOworICAgICAgICBjaGFyICpuZXdfdXJsID0gYXZfc3RyZHVwKHJlcGx5LT5sb2NhdGlvbik7CisgICAgICAgIGlmICghbmV3X3VybCkgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsMjsKKyAgICAgICAgfQorICAgICAgICBmZl9mb3JtYXRfc2V0X3VybChzLCBuZXdfdXJsKTsKICAgICAgICAgcnQtPnNlc3Npb25faWRbMF0gPSAnXDAnOwogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJTdGF0dXMgJWQ6IFJlZGlyZWN0aW5nIHRvICVzXG4iLAogICAgICAgICAgICAgICAgcmVwbHktPnN0YXR1c19jb2RlLAotICAgICAgICAgICAgICAgcy0+ZmlsZW5hbWUpOworICAgICAgICAgICAgICAgcy0+dXJsKTsKICAgICAgICAgZ290byByZWRpcmVjdDsKICAgICB9CisgZmFpbDI6CiAgICAgZmZfbmV0d29ya19jbG9zZSgpOwogICAgIHJldHVybiBlcnI7CiB9CiAjZW5kaWYgLyogQ09ORklHX1JUU1BfREVNVVhFUiB8fCBDT05GSUdfUlRTUF9NVVhFUiAqLwogCiAjaWYgQ09ORklHX1JUUERFQworc3RhdGljIGludCBwYXJzZV9ydHNwX21lc3NhZ2UoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFJUU1BTdGF0ZSAqcnQgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChydC0+cnRzcF9mbGFncyAmIFJUU1BfRkxBR19MSVNURU4pIHsKKyAgICAgICAgaWYgKHJ0LT5zdGF0ZSA9PSBSVFNQX1NUQVRFX1NUUkVBTUlORykgeworICAgICAgICAgICAgaWYgKCFmZl9ydHNwX3BhcnNlX3N0cmVhbWluZ19jb21tYW5kcyhzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGFuc3dlciB0byBURUFSRE9XTlxuIik7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUlRTUE1lc3NhZ2VIZWFkZXIgcmVwbHk7CisgICAgICAgIHJldCA9IGZmX3J0c3BfcmVhZF9yZXBseShzLCAmcmVwbHksIE5VTEwsIDAsIE5VTEwpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIC8qIFhYWDogcGFyc2UgbWVzc2FnZSAqLworICAgICAgICBpZiAocnQtPnN0YXRlICE9IFJUU1BfU1RBVEVfU1RSRUFNSU5HKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdWRwX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgUlRTUFN0cmVhbSAqKnBydHNwX3N0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUsIGludDY0X3Qgd2FpdF9lbmQpCiB7CiAgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKICAgICBSVFNQU3RyZWFtICpydHNwX3N0OwotICAgIGludCBuLCBpLCByZXQsIHRjcF9mZCwgdGltZW91dF9jbnQgPSAwOwotICAgIGludCBtYXhfcCA9IDA7CisgICAgaW50IG4sIGksIHJldCwgdGltZW91dF9jbnQgPSAwOwogICAgIHN0cnVjdCBwb2xsZmQgKnAgPSBydC0+cDsKICAgICBpbnQgKmZkcyA9IE5VTEwsIGZkc251bSwgZmRzaWR4OwogCi0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoZmZfY2hlY2tfaW50ZXJydXB0KCZzLT5pbnRlcnJ1cHRfY2FsbGJhY2spKQotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKLSAgICAgICAgaWYgKHdhaXRfZW5kICYmIHdhaXRfZW5kIC0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7Ci0gICAgICAgIG1heF9wID0gMDsKKyAgICBpZiAoIXApIHsKKyAgICAgICAgcCA9IHJ0LT5wID0gYXZfbWFsbG9jX2FycmF5KDIgKiAocnQtPm5iX3J0c3Bfc3RyZWFtcyArIDEpLCBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworICAgICAgICBpZiAoIXApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCiAgICAgICAgIGlmIChydC0+cnRzcF9oZCkgewotICAgICAgICAgICAgdGNwX2ZkID0gZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKHJ0LT5ydHNwX2hkKTsKLSAgICAgICAgICAgIHBbbWF4X3BdLmZkID0gdGNwX2ZkOwotICAgICAgICAgICAgcFttYXhfcCsrXS5ldmVudHMgPSBQT0xMSU47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0Y3BfZmQgPSAtMTsKKyAgICAgICAgICAgIHBbcnQtPm1heF9wXS5mZCA9IGZmdXJsX2dldF9maWxlX2hhbmRsZShydC0+cnRzcF9oZCk7CisgICAgICAgICAgICBwW3J0LT5tYXhfcCsrXS5ldmVudHMgPSBQT0xMSU47CiAgICAgICAgIH0KICAgICAgICAgZm9yIChpID0gMDsgaSA8IHJ0LT5uYl9ydHNwX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgcnRzcF9zdCA9IHJ0LT5ydHNwX3N0cmVhbXNbaV07CkBAIC0xOTQ0LDE1ICsxOTk1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBmb3IgKGZkc2lkeCA9IDA7IGZkc2lkeCA8IGZkc251bTsgZmRzaWR4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgcFttYXhfcF0uZmQgICAgICAgPSBmZHNbZmRzaWR4XTsKLSAgICAgICAgICAgICAgICAgICAgcFttYXhfcCsrXS5ldmVudHMgPSBQT0xMSU47CisgICAgICAgICAgICAgICAgICAgIHBbcnQtPm1heF9wXS5mZCAgICAgICA9IGZkc1tmZHNpZHhdOworICAgICAgICAgICAgICAgICAgICBwW3J0LT5tYXhfcCsrXS5ldmVudHMgPSBQT0xMSU47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZmZHMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG4gPSBwb2xsKHAsIG1heF9wLCBQT0xMX1RJTUVPVVRfTVMpOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKGZmX2NoZWNrX2ludGVycnVwdCgmcy0+aW50ZXJydXB0X2NhbGxiYWNrKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgICAgIGlmICh3YWl0X2VuZCAmJiB3YWl0X2VuZCAtIGF2X2dldHRpbWVfcmVsYXRpdmUoKSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgICAgICBuID0gcG9sbChwLCBydC0+bWF4X3AsIFBPTExfVElNRU9VVF9NUyk7CiAgICAgICAgIGlmIChuID4gMCkgewotICAgICAgICAgICAgaW50IGogPSAxIC0gKHRjcF9mZCA9PSAtMSk7CisgICAgICAgICAgICBpbnQgaiA9IHJ0LT5ydHNwX2hkID8gMSA6IDA7CiAgICAgICAgICAgICB0aW1lb3V0X2NudCA9IDA7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcnQtPm5iX3J0c3Bfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgcnRzcF9zdCA9IHJ0LT5ydHNwX3N0cmVhbXNbaV07CkBAIC0xOTY4LDI0ICsyMDI2LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAjaWYgQ09ORklHX1JUU1BfREVNVVhFUgotICAgICAgICAgICAgaWYgKHRjcF9mZCAhPSAtMSAmJiBwWzBdLnJldmVudHMgJiBQT0xMSU4pIHsKLSAgICAgICAgICAgICAgICBpZiAocnQtPnJ0c3BfZmxhZ3MgJiBSVFNQX0ZMQUdfTElTVEVOKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChydC0+c3RhdGUgPT0gUlRTUF9TVEFURV9TVFJFQU1JTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmZfcnRzcF9wYXJzZV9zdHJlYW1pbmdfY29tbWFuZHMocykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBhbnN3ZXIgdG8gVEVBUkRPV05cbiIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIFJUU1BNZXNzYWdlSGVhZGVyIHJlcGx5OwotICAgICAgICAgICAgICAgICAgICByZXQgPSBmZl9ydHNwX3JlYWRfcmVwbHkocywgJnJlcGx5LCBOVUxMLCAwLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgICAgICAvKiBYWFg6IHBhcnNlIG1lc3NhZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJ0LT5zdGF0ZSAhPSBSVFNQX1NUQVRFX1NUUkVBTUlORykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHJ0LT5ydHNwX2hkICYmIHBbMF0ucmV2ZW50cyAmIFBPTExJTikgeworICAgICAgICAgICAgICAgIGlmICgocmV0ID0gcGFyc2VfcnRzcF9tZXNzYWdlKHMpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAjZW5kaWYKQEAgLTIwNDAsNiArMjA4Myw0NCBAQAogICAgIHJldHVybiBBVkVSUk9SKEVBR0FJTik7CiB9CiAKK3N0YXRpYyBpbnQgcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICBSVFNQU3RyZWFtICoqcnRzcF9zdCwgUlRTUFN0cmVhbSAqZmlyc3RfcXVldWVfc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgd2FpdF9lbmQpCit7CisgICAgUlRTUFN0YXRlICpydCA9IHMtPnByaXZfZGF0YTsKKyAgICBpbnQgbGVuOworCisgICAgc3dpdGNoKHJ0LT5sb3dlcl90cmFuc3BvcnQpIHsKKyAgICBkZWZhdWx0OgorI2lmIENPTkZJR19SVFNQX0RFTVVYRVIKKyAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1RDUDoKKyAgICAgICAgbGVuID0gZmZfcnRzcF90Y3BfcmVhZF9wYWNrZXQocywgcnRzcF9zdCwgcnQtPnJlY3ZidWYsIFJFQ1ZCVUZfU0laRSk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgY2FzZSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFA6CisgICAgY2FzZSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9VRFBfTVVMVElDQVNUOgorICAgICAgICBsZW4gPSB1ZHBfcmVhZF9wYWNrZXQocywgcnRzcF9zdCwgcnQtPnJlY3ZidWYsIFJFQ1ZCVUZfU0laRSwgd2FpdF9lbmQpOworICAgICAgICBpZiAobGVuID4gMCAmJiAoKnJ0c3Bfc3QpLT50cmFuc3BvcnRfcHJpdiAmJiBydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkKKyAgICAgICAgICAgIGZmX3J0cF9jaGVja19hbmRfc2VuZF9iYWNrX3JyKCgqcnRzcF9zdCktPnRyYW5zcG9ydF9wcml2LCAoKnJ0c3Bfc3QpLT5ydHBfaGFuZGxlLCBOVUxMLCBsZW4pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX0NVU1RPTToKKyAgICAgICAgaWYgKGZpcnN0X3F1ZXVlX3N0ICYmIHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUlRQICYmCisgICAgICAgICAgICB3YWl0X2VuZCAmJiB3YWl0X2VuZCA8IGF2X2dldHRpbWVfcmVsYXRpdmUoKSkKKyAgICAgICAgICAgIGxlbiA9IEFWRVJST1IoRUFHQUlOKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGVuID0gYXZpb19yZWFkX3BhcnRpYWwocy0+cGIsIHJ0LT5yZWN2YnVmLCBSRUNWQlVGX1NJWkUpOworICAgICAgICBsZW4gPSBwaWNrX3N0cmVhbShzLCBydHNwX3N0LCBydC0+cmVjdmJ1ZiwgbGVuKTsKKyAgICAgICAgaWYgKGxlbiA+IDAgJiYgKCpydHNwX3N0KS0+dHJhbnNwb3J0X3ByaXYgJiYgcnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SVFApCisgICAgICAgICAgICBmZl9ydHBfY2hlY2tfYW5kX3NlbmRfYmFja19ycigoKnJ0c3Bfc3QpLT50cmFuc3BvcnRfcHJpdiwgTlVMTCwgcy0+cGIsIGxlbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChsZW4gPT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgcmV0dXJuIGxlbjsKK30KKwogaW50IGZmX3J0c3BfZmV0Y2hfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBSVFNQU3RhdGUgKnJ0ID0gcy0+cHJpdl9kYXRhOwpAQCAtMjEwNCwzMCArMjE4NSw3IEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KIAotICAgIHN3aXRjaChydC0+bG93ZXJfdHJhbnNwb3J0KSB7Ci0gICAgZGVmYXVsdDoKLSNpZiBDT05GSUdfUlRTUF9ERU1VWEVSCi0gICAgY2FzZSBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1A6Ci0gICAgICAgIGxlbiA9IGZmX3J0c3BfdGNwX3JlYWRfcGFja2V0KHMsICZydHNwX3N0LCBydC0+cmVjdmJ1ZiwgUkVDVkJVRl9TSVpFKTsKLSAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUDoKLSAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX1VEUF9NVUxUSUNBU1Q6Ci0gICAgICAgIGxlbiA9IHVkcF9yZWFkX3BhY2tldChzLCAmcnRzcF9zdCwgcnQtPnJlY3ZidWYsIFJFQ1ZCVUZfU0laRSwgd2FpdF9lbmQpOwotICAgICAgICBpZiAobGVuID4gMCAmJiBydHNwX3N0LT50cmFuc3BvcnRfcHJpdiAmJiBydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkKLSAgICAgICAgICAgIGZmX3J0cF9jaGVja19hbmRfc2VuZF9iYWNrX3JyKHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2LCBydHNwX3N0LT5ydHBfaGFuZGxlLCBOVUxMLCBsZW4pOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIFJUU1BfTE9XRVJfVFJBTlNQT1JUX0NVU1RPTToKLSAgICAgICAgaWYgKGZpcnN0X3F1ZXVlX3N0ICYmIHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUlRQICYmCi0gICAgICAgICAgICB3YWl0X2VuZCAmJiB3YWl0X2VuZCA8IGF2X2dldHRpbWVfcmVsYXRpdmUoKSkKLSAgICAgICAgICAgIGxlbiA9IEFWRVJST1IoRUFHQUlOKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbGVuID0gZmZpb19yZWFkX3BhcnRpYWwocy0+cGIsIHJ0LT5yZWN2YnVmLCBSRUNWQlVGX1NJWkUpOwotICAgICAgICBsZW4gPSBwaWNrX3N0cmVhbShzLCAmcnRzcF9zdCwgcnQtPnJlY3ZidWYsIGxlbik7Ci0gICAgICAgIGlmIChsZW4gPiAwICYmIHJ0c3Bfc3QtPnRyYW5zcG9ydF9wcml2ICYmIHJ0LT50cmFuc3BvcnQgPT0gUlRTUF9UUkFOU1BPUlRfUlRQKQotICAgICAgICAgICAgZmZfcnRwX2NoZWNrX2FuZF9zZW5kX2JhY2tfcnIocnRzcF9zdC0+dHJhbnNwb3J0X3ByaXYsIE5VTEwsIHMtPnBiLCBsZW4pOwotICAgICAgICBicmVhazsKLSAgICB9CisgICAgbGVuID0gcmVhZF9wYWNrZXQocywgJnJ0c3Bfc3QsIGZpcnN0X3F1ZXVlX3N0LCB3YWl0X2VuZCk7CiAgICAgaWYgKGxlbiA9PSBBVkVSUk9SKEVBR0FJTikgJiYgZmlyc3RfcXVldWVfc3QgJiYKICAgICAgICAgcnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SVFApIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLApAQCAtMjEzOCw4ICsyMTk2LDcgQEAKICAgICB9CiAgICAgaWYgKGxlbiA8IDApCiAgICAgICAgIHJldHVybiBsZW47Ci0gICAgaWYgKGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisKICAgICBpZiAocnQtPnRyYW5zcG9ydCA9PSBSVFNQX1RSQU5TUE9SVF9SRFQpIHsKICAgICAgICAgcmV0ID0gZmZfcmR0X3BhcnNlX3BhY2tldChydHNwX3N0LT50cmFuc3BvcnRfcHJpdiwgcGt0LCAmcnQtPnJlY3ZidWYsIGxlbik7CiAgICAgfSBlbHNlIGlmIChydC0+dHJhbnNwb3J0ID09IFJUU1BfVFJBTlNQT1JUX1JUUCkgewpAQCAtMjMxNiw4ICsyMzczLDggQEAKICAgICAgICAgICAgIGFwcGVuZF9zb3VyY2VfYWRkcnModXJsLCBzaXplb2YodXJsKSwgImJsb2NrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRzcF9zdC0+bmJfZXhjbHVkZV9zb3VyY2VfYWRkcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0c3Bfc3QtPmV4Y2x1ZGVfc291cmNlX2FkZHJzKTsKLSAgICAgICAgICAgIGVyciA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZydHNwX3N0LT5ydHBfaGFuZGxlLCB1cmwsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgJm9wdHMsIHMtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICBlcnIgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmcnRzcF9zdC0+cnRwX2hhbmRsZSwgdXJsLCBBVklPX0ZMQUdfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssICZvcHRzLCBzLT5wcm90b2NvbF93aGl0ZWxpc3QsIHMtPnByb3RvY29sX2JsYWNrbGlzdCwgTlVMTCk7CiAKICAgICAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CiAKQEAgLTIzNzcsNyArMjQzNCw3IEBACiAgICAgaW50IHJldCwgcG9ydDsKICAgICBVUkxDb250ZXh0KiBpbiA9IE5VTEw7CiAgICAgaW50IHBheWxvYWRfdHlwZTsKLSAgICBBVkNvZGVjQ29udGV4dCBjb2RlYyA9IHsgMCB9OworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBOVUxMOwogICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlIGFkZHI7CiAgICAgQVZJT0NvbnRleHQgcGI7CiAgICAgc29ja2xlbl90IGFkZHJsZW4gPSBzaXplb2YoYWRkcik7CkBAIC0yMzg2LDggKzI0NDMsOCBAQAogICAgIGlmICghZmZfbmV0d29ya19pbml0KCkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAKLSAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmaW4sIHMtPmZpbGVuYW1lLCBBVklPX0ZMQUdfUkVBRCwKLSAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsIHMtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgcmV0ID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJmluLCBzLT51cmwsIEFWSU9fRkxBR19SRUFELAorICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwgcy0+cHJvdG9jb2xfd2hpdGVsaXN0LCBzLT5wcm90b2NvbF9ibGFja2xpc3QsIE5VTEwpOwogICAgIGlmIChyZXQpCiAgICAgICAgIGdvdG8gZmFpbDsKIApAQCAtMjQxOCwyOCArMjQ3NSwzNSBAQAogICAgIGZmdXJsX2Nsb3NlKGluKTsKICAgICBpbiA9IE5VTEw7CiAKLSAgICBpZiAoZmZfcnRwX2dldF9jb2RlY19pbmZvKCZjb2RlYywgcGF5bG9hZF90eXBlKSkgeworICAgIHBhciA9IGF2Y29kZWNfcGFyYW1ldGVyc19hbGxvYygpOworICAgIGlmICghcGFyKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChmZl9ydHBfZ2V0X2NvZGVjX2luZm8ocGFyLCBwYXlsb2FkX3R5cGUpKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmVjZWl2ZSBSVFAgcGF5bG9hZCB0eXBlICVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgYW4gU0RQIGZpbGUgZGVzY3JpYmluZyBpdFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9Ci0gICAgaWYgKGNvZGVjLmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0RBVEEpIHsKKyAgICBpZiAocGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9EQVRBKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkd1ZXNzaW5nIG9uIFJUUCBjb250ZW50IC0gaWYgbm90IHJlY2VpdmVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVybHkgeW91IG5lZWQgYW4gU0RQIGZpbGUgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmliaW5nIGl0XG4iKTsKICAgICB9CiAKICAgICBhdl91cmxfc3BsaXQoTlVMTCwgMCwgTlVMTCwgMCwgaG9zdCwgc2l6ZW9mKGhvc3QpLCAmcG9ydCwKLSAgICAgICAgICAgICAgICAgTlVMTCwgMCwgcy0+ZmlsZW5hbWUpOworICAgICAgICAgICAgICAgICBOVUxMLCAwLCBzLT51cmwpOwogCiAgICAgc25wcmludGYoc2RwLCBzaXplb2Yoc2RwKSwKICAgICAgICAgICAgICAidj0wXHJcbmM9SU4gSVAlZCAlc1xyXG5tPSVzICVkIFJUUC9BVlAgJWRcclxuIiwKICAgICAgICAgICAgICBhZGRyLnNzX2ZhbWlseSA9PSBBRl9JTkVUID8gNCA6IDYsIGhvc3QsCi0gICAgICAgICAgICAgY29kZWMuY29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSAgPyAiYXBwbGljYXRpb24iIDoKLSAgICAgICAgICAgICBjb2RlYy5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyA/ICJ2aWRlbyIgOiAiYXVkaW8iLAorICAgICAgICAgICAgIHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfREFUQSAgPyAiYXBwbGljYXRpb24iIDoKKyAgICAgICAgICAgICBwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8gInZpZGVvIiA6ICJhdWRpbyIsCiAgICAgICAgICAgICAgcG9ydCwgcGF5bG9hZF90eXBlKTsKICAgICBhdl9sb2cocywgQVZfTE9HX1ZFUkJPU0UsICJTRFA6XG4lc1xuIiwgc2RwKTsKKyAgICBhdmNvZGVjX3BhcmFtZXRlcnNfZnJlZSgmcGFyKTsKIAogICAgIGZmaW9faW5pdF9jb250ZXh0KCZwYiwgc2RwLCBzdHJsZW4oc2RwKSwgMCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgICAgcy0+cGIgPSAmcGI7CkBAIC0yNDU0LDYgKzI1MTgsNyBAQAogICAgIHJldHVybiByZXQ7CiAKIGZhaWw6CisgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2ZyZWUoJnBhcik7CiAgICAgaWYgKGluKQogICAgICAgICBmZnVybF9jbG9zZShpbik7CiAgICAgZmZfbmV0d29ya19jbG9zZSgpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvcnRzcC5oIGIvbGliYXZmb3JtYXQvcnRzcC5oCmluZGV4IGJkODM3YjUuLjlhN2YzNjYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3J0c3AuaAorKysgYi9saWJhdmZvcm1hdC9ydHNwLmgKQEAgLTM1Miw2ICszNTIsNyBAQAogICAgICAqIFBvbGxpbmcgYXJyYXkgZm9yIHVkcAogICAgICAqLwogICAgIHN0cnVjdCBwb2xsZmQgKnA7CisgICAgaW50IG1heF9wOwogCiAgICAgLyoqCiAgICAgICogV2hldGhlciB0aGUgc2VydmVyIHN1cHBvcnRzIHRoZSBHRVRfUEFSQU1FVEVSIG1ldGhvZC4KQEAgLTQ1Nyw3ICs0NTgsNyBAQAogICAgIC8qKiBUaGUgZm9sbG93aW5nIGFyZSB1c2VkIGZvciBkeW5hbWljIHByb3RvY29scyAocnRwZGVjXyouYy9yZHQuYykgKi8KICAgICAvL0B7CiAgICAgLyoqIGhhbmRsZXIgc3RydWN0dXJlICovCi0gICAgUlRQRHluYW1pY1Byb3RvY29sSGFuZGxlciAqZHluYW1pY19oYW5kbGVyOworICAgIGNvbnN0IFJUUER5bmFtaWNQcm90b2NvbEhhbmRsZXIgKmR5bmFtaWNfaGFuZGxlcjsKIAogICAgIC8qKiBwcml2YXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBkeW5hbWljIHByb3RvY29sICovCiAgICAgUGF5bG9hZENvbnRleHQgKmR5bmFtaWNfcHJvdG9jb2xfY29udGV4dDsKQEAgLTQ2Niw2ICs0NjcsOSBAQAogICAgIC8qKiBFbmFibGUgc2VuZGluZyBSVENQIGZlZWRiYWNrIG1lc3NhZ2VzIGFjY29yZGluZyB0byBSRkMgNDU4NSAqLwogICAgIGludCBmZWVkYmFjazsKIAorICAgIC8qKiBTU1JDIGZvciB0aGlzIHN0cmVhbSwgdG8gYWxsb3cgaWRlbnRpZnlpbmcgUlRDUCBwYWNrZXRzIGJlZm9yZSB0aGUgZmlyc3QgUlRQIHBhY2tldCAqLworICAgIHVpbnQzMl90IHNzcmM7CisKICAgICBjaGFyIGNyeXB0b19zdWl0ZVs0MF07CiAgICAgY2hhciBjcnlwdG9fcGFyYW1zWzEwMF07CiB9IFJUU1BTdHJlYW07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHNwZGVjLmMgYi9saWJhdmZvcm1hdC9ydHNwZGVjLmMKaW5kZXggMTdmMDRjMC4uMzJkZmYyMyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRzcGRlYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0c3BkZWMuYwpAQCAtMjk2LDcgKzI5Niw3IEBACiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1RSQUNFLCAiT3BlbmluZzogJXMiLCB1cmwpOwogICAgICAgICAgICAgcmV0ID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJnJ0c3Bfc3QtPnJ0cF9oYW5kbGUsIHVybCwgQVZJT19GTEFHX1JFQURfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm90b2NvbF93aGl0ZWxpc3QsIHMtPnByb3RvY29sX2JsYWNrbGlzdCwgTlVMTCk7CiAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOwogICAgICAgICAgICAgaWYgKHJldCkKICAgICAgICAgICAgICAgICBsb2NhbHBvcnQgKz0gMjsKQEAgLTQ5OCw3ICs0OTgsNiBAQAogICAgIH0gZWxzZSBpZiAobWV0aG9kY29kZSA9PSBURUFSRE9XTikgewogICAgICAgICBydC0+c3RhdGUgPSBSVFNQX1NUQVRFX0lETEU7CiAgICAgICAgIHJldCAgICAgICA9IHJ0c3Bfc2VuZF9yZXBseShzLCBSVFNQX1NUQVRVU19PSywgTlVMTCAsIHJlcXVlc3Quc2VxKTsKLSAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9CkBAIC02NDUsNyArNjQ0LDcgQEAKIAogICAgIC8qIGV4dHJhY3QgaG9zdG5hbWUgYW5kIHBvcnQgKi8KICAgICBhdl91cmxfc3BsaXQocHJvdG8sIHNpemVvZihwcm90byksIGF1dGgsIHNpemVvZihhdXRoKSwgaG9zdCwgc2l6ZW9mKGhvc3QpLAotICAgICAgICAgICAgICAgICAmcG9ydCwgcGF0aCwgc2l6ZW9mKHBhdGgpLCBzLT5maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICZwb3J0LCBwYXRoLCBzaXplb2YocGF0aCksIHMtPnVybCk7CiAKICAgICAvKiBmZl91cmxfam9pbi4gTm8gYXV0aG9yaXphdGlvbiBieSBub3cgKE5VTEwpICovCiAgICAgZmZfdXJsX2pvaW4ocnQtPmNvbnRyb2xfdXJpLCBzaXplb2YocnQtPmNvbnRyb2xfdXJpKSwgcHJvdG8sIE5VTEwsIGhvc3QsCkBAIC02NjUsNyArNjY0LDcgQEAKIAogICAgIGlmIChyZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmcnQtPnJ0c3BfaGQsIHRjcG5hbWUsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm90b2NvbF93aGl0ZWxpc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb3RvY29sX3doaXRlbGlzdCwgcy0+cHJvdG9jb2xfYmxhY2tsaXN0LCBOVUxMKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIG9wZW4gUlRTUCBmb3IgbGlzdGVuaW5nXG4iKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC02OTgsNyArNjk3LDYgQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHJ0c3BfcHJvYmUoQVZQcm9iZURhdGEgKnApCkBAIC04MDYsNyArODA0LDcgQEAKICAgICBpbnQgcG9ydDsKIAogICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0LCBzaXplb2YoaG9zdCksICZwb3J0LCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICBzLT5maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgIHMtPnVybCk7CiAgICAgZmZfcnRzcF91bmRvX3NldHVwKHMsIDApOwogICAgIHJldHVybiBmZl9ydHNwX21ha2Vfc2V0dXBfcmVxdWVzdChzLCBob3N0LCBwb3J0LCBSVFNQX0xPV0VSX1RSQU5TUE9SVF9UQ1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0LT5yZWFsX2NoYWxsZW5nZSk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9ydHNwZW5jLmMgYi9saWJhdmZvcm1hdC9ydHNwZW5jLmMKaW5kZXggZTc3MDdiYi4uOTdlM2VmNiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvcnRzcGVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3J0c3BlbmMuYwpAQCAtNTAsNiArNTAsNyBAQAogICAgIGludCBpOwogICAgIGNoYXIgKnNkcDsKICAgICBBVkZvcm1hdENvbnRleHQgc2RwX2N0eCwgKmN0eF9hcnJheVsxXTsKKyAgICBjaGFyIHVybFsxMDI0XTsKIAogICAgIGlmIChzLT5zdGFydF90aW1lX3JlYWx0aW1lID09IDAgIHx8ICBzLT5zdGFydF90aW1lX3JlYWx0aW1lID09IEFWX05PUFRTX1ZBTFVFKQogICAgICAgICBzLT5zdGFydF90aW1lX3JlYWx0aW1lID0gYXZfZ2V0dGltZSgpOwpAQCAtNzEsNyArNzIsOCBAQAogICAgICAqIGZsZXhpYmxlIFNEUCBjcmVhdGlvbiBpbnRlcmZhY2UuCiAgICAgICovCiAgICAgc2RwX2N0eCA9ICpzOwotICAgIGZmX3VybF9qb2luKHNkcF9jdHguZmlsZW5hbWUsIHNpemVvZihzZHBfY3R4LmZpbGVuYW1lKSwKKyAgICBzZHBfY3R4LnVybCA9IHVybDsKKyAgICBmZl91cmxfam9pbih1cmwsIHNpemVvZih1cmwpLAogICAgICAgICAgICAgICAgICJydHNwIiwgTlVMTCwgYWRkciwgLTEsIE5VTEwpOwogICAgIGN0eF9hcnJheVswXSA9ICZzZHBfY3R4OwogICAgIGlmIChhdl9zZHBfY3JlYXRlKGN0eF9hcnJheSwgMSwgc2RwLCBTRFBfTUFYX1NJWkUpKSB7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zMzM3bS5jIGIvbGliYXZmb3JtYXQvczMzN20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg1ZDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvczMzN20uYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBmb284NgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAic3BkaWYuaCIKKworI2RlZmluZSBNQVJLRVJfMTZMRSAgICAgICAgIDB4NzJGODFGNEUKKyNkZWZpbmUgTUFSS0VSXzIwTEUgICAgICAgICAweDIwODc2RkYwRTE1NAorI2RlZmluZSBNQVJLRVJfMjRMRSAgICAgICAgIDB4NzJGODk2MUY0RUE1CisKKyNkZWZpbmUgSVNfMTZMRV9NQVJLRVIoc3RhdGUpICAgKChzdGF0ZSAmIDB4RkZGRkZGRkYpID09IE1BUktFUl8xNkxFKQorI2RlZmluZSBJU18yMExFX01BUktFUihzdGF0ZSkgICAoKHN0YXRlICYgMHhGMEZGRkZGMEZGRkYpID09IE1BUktFUl8yMExFKQorI2RlZmluZSBJU18yNExFX01BUktFUihzdGF0ZSkgICAoKHN0YXRlICYgMHhGRkZGRkZGRkZGRkYpID09IE1BUktFUl8yNExFKQorI2RlZmluZSBJU19MRV9NQVJLRVIoc3RhdGUpICAgICAoSVNfMTZMRV9NQVJLRVIoc3RhdGUpIHx8IElTXzIwTEVfTUFSS0VSKHN0YXRlKSB8fCBJU18yNExFX01BUktFUihzdGF0ZSkpCisKK3N0YXRpYyBpbnQgczMzN21fZ2V0X29mZnNldF9hbmRfY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfdHlwZSwgaW50IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpvZmZzZXQsIGVudW0gQVZDb2RlY0lEICpjb2RlYykKK3sKKyAgICBpbnQgd29yZF9iaXRzOworCisgICAgaWYgKElTXzE2TEVfTUFSS0VSKHN0YXRlKSkgeworICAgICAgICB3b3JkX2JpdHMgPSAxNjsKKyAgICB9IGVsc2UgaWYgKElTXzIwTEVfTUFSS0VSKHN0YXRlKSkgeworICAgICAgICBkYXRhX3R5cGUgPj49IDg7CisgICAgICAgIGRhdGFfc2l6ZSA+Pj0gNDsKKyAgICAgICAgd29yZF9iaXRzID0gMjA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YV90eXBlID4+PSA4OworICAgICAgICB3b3JkX2JpdHMgPSAyNDsKKyAgICB9CisKKyAgICBpZiAoKGRhdGFfdHlwZSAmIDB4MUYpICE9IDB4MUMpIHsKKyAgICAgICAgaWYgKHMpCisgICAgICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShzLCAiRGF0YSB0eXBlICUjeCBpbiBTTVBURSAzMzdNIiwgZGF0YV90eXBlICYgMHgxRik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICB9CisKKyAgICBpZiAoY29kZWMpCisgICAgICAgICpjb2RlYyA9IEFWX0NPREVDX0lEX0RPTEJZX0U7CisKKyAgICBzd2l0Y2ggKGRhdGFfc2l6ZSAvIHdvcmRfYml0cykgeworICAgIGNhc2UgMzY0ODoKKyAgICAgICAgKm9mZnNldCA9IDE5MjA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzY0NDoKKyAgICAgICAgKm9mZnNldCA9IDIwMDI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzY0MDoKKyAgICAgICAgKm9mZnNldCA9IDIwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMzA0MDoKKyAgICAgICAgKm9mZnNldCA9IDE2MDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChzKQorICAgICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIkRvbGJ5IEUgZGF0YSBzaXplICVkIGluIFNNUFRFIDMzN00iLCBkYXRhX3NpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CisgICAgfQorCisgICAgKm9mZnNldCAtPSA0OworICAgICpvZmZzZXQgKj0gKHdvcmRfYml0cyArIDcgPj4gMykgKiAyOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzMzdtX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIHVpbnQ2NF90IHN0YXRlID0gMDsKKyAgICBpbnQgbWFya2Vyc1szXSA9IHsgMCB9OworICAgIGludCBpLCBwb3MsIHN1bSwgbWF4LCBkYXRhX3R5cGUsIGRhdGFfc2l6ZSwgb2Zmc2V0OworICAgIHVpbnQ4X3QgKmJ1ZjsKKworICAgIGZvciAocG9zID0gMDsgcG9zIDwgcC0+YnVmX3NpemU7IHBvcysrKSB7CisgICAgICAgIHN0YXRlID0gKHN0YXRlIDw8IDgpIHwgcC0+YnVmW3Bvc107CisgICAgICAgIGlmICghSVNfTEVfTUFSS0VSKHN0YXRlKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGJ1ZiA9IHAtPmJ1ZiArIHBvcyArIDE7CisgICAgICAgIGlmIChJU18xNkxFX01BUktFUihzdGF0ZSkpIHsKKyAgICAgICAgICAgIGRhdGFfdHlwZSA9IEFWX1JMMTYoYnVmICAgICk7CisgICAgICAgICAgICBkYXRhX3NpemUgPSBBVl9STDE2KGJ1ZiArIDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGF0YV90eXBlID0gQVZfUkwyNChidWYgICAgKTsKKyAgICAgICAgICAgIGRhdGFfc2l6ZSA9IEFWX1JMMjQoYnVmICsgMyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoczMzN21fZ2V0X29mZnNldF9hbmRfY29kZWMoTlVMTCwgc3RhdGUsIGRhdGFfdHlwZSwgZGF0YV9zaXplLCAmb2Zmc2V0LCBOVUxMKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGkgPSBJU18xNkxFX01BUktFUihzdGF0ZSkgPyAwIDogSVNfMjBMRV9NQVJLRVIoc3RhdGUpID8gMSA6IDI7CisgICAgICAgIG1hcmtlcnNbaV0rKzsKKworICAgICAgICBwb3MgICs9IElTXzE2TEVfTUFSS0VSKHN0YXRlKSA/IDQgOiA2OworICAgICAgICBwb3MgICs9IG9mZnNldDsKKyAgICAgICAgc3RhdGUgPSAwOworICAgIH0KKworICAgIHN1bSA9IG1heCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKG1hcmtlcnMpOyBpKyspIHsKKyAgICAgICAgc3VtICs9IG1hcmtlcnNbaV07CisgICAgICAgIGlmIChtYXJrZXJzW21heF0gPCBtYXJrZXJzW2ldKQorICAgICAgICAgICAgbWF4ID0gaTsKKyAgICB9CisKKyAgICBpZiAobWFya2Vyc1ttYXhdID4gMyAmJiBtYXJrZXJzW21heF0gKiA0ID4gc3VtICogMykKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OICsgMTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHMzMzdtX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBzLT5jdHhfZmxhZ3MgfD0gQVZGTVRDVFhfTk9IRUFERVI7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJzd2FwX2J1ZjI0KHVpbnQ4X3QgKmRhdGEsIGludCBzaXplKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemUgLyAzOyBpKyssIGRhdGEgKz0gMykKKyAgICAgICAgRkZTV0FQKHVpbnQ4X3QsIGRhdGFbMF0sIGRhdGFbMl0pOworfQorCitzdGF0aWMgaW50IHMzMzdtX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICB1aW50NjRfdCBzdGF0ZSA9IDA7CisgICAgaW50IHJldCwgZGF0YV90eXBlLCBkYXRhX3NpemUsIG9mZnNldDsKKyAgICBlbnVtIEFWQ29kZWNJRCBjb2RlYzsKKyAgICBpbnQ2NF90IHBvczsKKworICAgIHdoaWxlICghSVNfTEVfTUFSS0VSKHN0YXRlKSkgeworICAgICAgICBzdGF0ZSA9IChzdGF0ZSA8PCA4KSB8IGF2aW9fcjgocGIpOworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKyAgICB9CisKKyAgICBpZiAoSVNfMTZMRV9NQVJLRVIoc3RhdGUpKSB7CisgICAgICAgIGRhdGFfdHlwZSA9IGF2aW9fcmwxNihwYik7CisgICAgICAgIGRhdGFfc2l6ZSA9IGF2aW9fcmwxNihwYik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGF0YV90eXBlID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgZGF0YV9zaXplID0gYXZpb19ybDI0KHBiKTsKKyAgICB9CisKKyAgICBwb3MgPSBhdmlvX3RlbGwocGIpOworCisgICAgaWYgKChyZXQgPSBzMzM3bV9nZXRfb2Zmc2V0X2FuZF9jb2RlYyhzLCBzdGF0ZSwgZGF0YV90eXBlLCBkYXRhX3NpemUsICZvZmZzZXQsICZjb2RlYykpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGlmICgocmV0ID0gYXZfbmV3X3BhY2tldChwa3QsIG9mZnNldCkpIDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHBrdC0+cG9zID0gcG9zOworCisgICAgaWYgKGF2aW9fcmVhZChwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpIDwgcGt0LT5zaXplKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgfQorCisgICAgaWYgKElTXzE2TEVfTUFSS0VSKHN0YXRlKSkKKyAgICAgICAgZmZfc3BkaWZfYnN3YXBfYnVmMTYoKHVpbnQxNl90ICopcGt0LT5kYXRhLCAodWludDE2X3QgKilwa3QtPmRhdGEsIHBrdC0+c2l6ZSA+PiAxKTsKKyAgICBlbHNlCisgICAgICAgIGJzd2FwX2J1ZjI0KHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKworICAgIGlmICghcy0+bmJfc3RyZWFtcykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICBpZiAoIXN0KSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBjb2RlYzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zMzM3bV9kZW11eGVyID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJzMzM3bSIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlNNUFRFIDMzN00iKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzMzM3bV9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgICAgPSBzMzM3bV9yZWFkX2hlYWRlciwKKyAgICAucmVhZF9wYWNrZXQgICAgPSBzMzM3bV9yZWFkX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3NhbWlkZWMuYyBiL2xpYmF2Zm9ybWF0L3NhbWlkZWMuYwppbmRleCAxMWM2NzRjLi43ZWExYmRmIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zYW1pZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvc2FtaWRlYy5jCkBAIC01OSw4ICs1OSw4IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMCk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NBTUk7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NBTUk7CiAKICAgICBhdl9icHJpbnRfaW5pdCgmYnVmLCAgICAgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKICAgICBhdl9icHJpbnRfaW5pdCgmaGRyX2J1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKQEAgLTEwMSw3ICsxMDEsNyBAQAogICAgICAgICBhdl9icHJpbnRfY2xlYXIoJmJ1Zik7CiAgICAgfQogCi0gICAgcmVzID0gYXZwcml2X2JwcmludF90b19leHRyYWRhdGEoc3QtPmNvZGVjLCAmaGRyX2J1Zik7CisgICAgcmVzID0gZmZfYnByaW50X3RvX2NvZGVjcGFyX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsICZoZHJfYnVmKTsKICAgICBpZiAocmVzIDwgMCkKICAgICAgICAgZ290byBlbmQ7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3NhcGRlYy5jIGIvbGliYXZmb3JtYXQvc2FwZGVjLmMKaW5kZXggOTI2Nzk1Yi4uN2E2YzhiZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc2FwZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvc2FwZGVjLmMKQEAgLTc0LDcgKzc0LDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAogICAgIGF2X3VybF9zcGxpdChOVUxMLCAwLCBOVUxMLCAwLCBob3N0LCBzaXplb2YoaG9zdCksICZwb3J0LAotICAgICAgICAgICAgICAgICBwYXRoLCBzaXplb2YocGF0aCksIHMtPmZpbGVuYW1lKTsKKyAgICAgICAgICAgICAgICAgcGF0aCwgc2l6ZW9mKHBhdGgpLCBzLT51cmwpOwogICAgIGlmIChwb3J0IDwgMCkKICAgICAgICAgcG9ydCA9IDk4NzU7CiAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgICAgICBwb3J0KTsKICAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmc2FwLT5hbm5fZmQsIHVybCwgQVZJT19GTEFHX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVycnVwdF9jYWxsYmFjaywgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm90b2NvbF93aGl0ZWxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnByb3RvY29sX3doaXRlbGlzdCwgcy0+cHJvdG9jb2xfYmxhY2tsaXN0LCBOVUxMKTsKICAgICBpZiAocmV0KQogICAgICAgICBnb3RvIGZhaWw7CiAKQEAgLTE2MSw3ICsxNjEsNyBAQAogICAgIHNhcC0+c2RwX2N0eC0+cGIgICAgICAgID0gJnNhcC0+c2RwX3BiOwogICAgIHNhcC0+c2RwX2N0eC0+aW50ZXJydXB0X2NhbGxiYWNrID0gcy0+aW50ZXJydXB0X2NhbGxiYWNrOwogCi0gICAgaWYgKChyZXQgPSBmZl9jb3B5X3doaXRlbGlzdHMoc2FwLT5zZHBfY3R4LCBzKSkgPCAwKQorICAgIGlmICgocmV0ID0gZmZfY29weV93aGl0ZWJsYWNrbGlzdHMoc2FwLT5zZHBfY3R4LCBzKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKICAgICByZXQgPSBhdmZvcm1hdF9vcGVuX2lucHV0KCZzYXAtPnNkcF9jdHgsICJ0ZW1wLnNkcCIsIGluZm10LCBOVUxMKTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgICAgIHN0LT5pZCA9IGk7Ci0gICAgICAgIGF2Y29kZWNfY29weV9jb250ZXh0KHN0LT5jb2RlYywgc2FwLT5zZHBfY3R4LT5zdHJlYW1zW2ldLT5jb2RlYyk7CisgICAgICAgIGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KHN0LT5jb2RlY3Bhciwgc2FwLT5zZHBfY3R4LT5zdHJlYW1zW2ldLT5jb2RlY3Bhcik7CiAgICAgICAgIHN0LT50aW1lX2Jhc2UgPSBzYXAtPnNkcF9jdHgtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZTsKICAgICB9CiAKQEAgLTIyNSw3ICsyMjUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdC0+aWQgPSBpOwotICAgICAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzYXAtPnNkcF9jdHgtPnN0cmVhbXNbaV0tPmNvZGVjKTsKKyAgICAgICAgICAgIGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KHN0LT5jb2RlY3Bhciwgc2FwLT5zZHBfY3R4LT5zdHJlYW1zW2ldLT5jb2RlY3Bhcik7CiAgICAgICAgICAgICBzdC0+dGltZV9iYXNlID0gc2FwLT5zZHBfY3R4LT5zdHJlYW1zW2ldLT50aW1lX2Jhc2U7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zYXBlbmMuYyBiL2xpYmF2Zm9ybWF0L3NhcGVuYy5jCmluZGV4IGIyZjY0YjguLmY5YWZhYjAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3NhcGVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3NhcGVuYy5jCkBAIC04NCw3ICs4NCw3IEBACiAKICAgICAvKiBleHRyYWN0IGhvc3RuYW1lIGFuZCBwb3J0ICovCiAgICAgYXZfdXJsX3NwbGl0KE5VTEwsIDAsIE5VTEwsIDAsIGhvc3QsIHNpemVvZihob3N0KSwgJmJhc2VfcG9ydCwKLSAgICAgICAgICAgICAgICAgcGF0aCwgc2l6ZW9mKHBhdGgpLCBzLT5maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgIHBhdGgsIHNpemVvZihwYXRoKSwgcy0+dXJsKTsKICAgICBpZiAoYmFzZV9wb3J0IDwgMCkKICAgICAgICAgYmFzZV9wb3J0ID0gNTAwNDsKIApAQCAtMTQ0LDYgKzE0NCw3IEBACiAgICAgICAgIHMtPnN0YXJ0X3RpbWVfcmVhbHRpbWUgPSBhdl9nZXR0aW1lKCk7CiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBVUkxDb250ZXh0ICpmZDsKKyAgICAgICAgY2hhciAqbmV3X3VybDsKIAogICAgICAgICBmZl91cmxfam9pbih1cmwsIHNpemVvZih1cmwpLCAicnRwIiwgTlVMTCwgaG9zdCwgYmFzZV9wb3J0LAogICAgICAgICAgICAgICAgICAgICAiP3R0bD0lZCIsIHR0bCk7CkBAIC0xNTEsNyArMTUyLDcgQEAKICAgICAgICAgICAgIGJhc2VfcG9ydCArPSAyOwogICAgICAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmZmQsIHVybCwgQVZJT19GTEFHX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm90b2NvbF93aGl0ZWxpc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm90b2NvbF93aGl0ZWxpc3QsIHMtPnByb3RvY29sX2JsYWNrbGlzdCwgTlVMTCk7CiAgICAgICAgIGlmIChyZXQpIHsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKQEAgLTE2MSw3ICsxNjIsMTIgQEAKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgcy0+c3RyZWFtc1tpXS0+cHJpdl9kYXRhID0gY29udGV4dHNbaV07CiAgICAgICAgIHMtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZSA9IGNvbnRleHRzW2ldLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2U7Ci0gICAgICAgIGF2X3N0cmxjcHkoY29udGV4dHNbaV0tPmZpbGVuYW1lLCB1cmwsIHNpemVvZihjb250ZXh0c1tpXS0+ZmlsZW5hbWUpKTsKKyAgICAgICAgbmV3X3VybCA9IGF2X3N0cmR1cCh1cmwpOworICAgICAgICBpZiAoIW5ld191cmwpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBmZl9mb3JtYXRfc2V0X3VybChjb250ZXh0c1tpXSwgbmV3X3VybCk7CiAgICAgfQogCiAgICAgaWYgKHMtPm5iX3N0cmVhbXMgPiAwICYmIHRpdGxlKQpAQCAtMTcxLDcgKzE3Nyw3IEBACiAgICAgICAgICAgICAgICAgIj90dGw9JWQmY29ubmVjdD0xIiwgdHRsKTsKICAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmc2FwLT5hbm5fZmQsIHVybCwgQVZJT19GTEFHX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wcm90b2NvbF93aGl0ZWxpc3QsIHMtPnByb3RvY29sX2JsYWNrbGlzdCwgTlVMTCk7CiAgICAgaWYgKHJldCkgewogICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CiAgICAgICAgIGdvdG8gZmFpbDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3NhdWNlLmMgYi9saWJhdmZvcm1hdC9zYXVjZS5jCmluZGV4IGEyMzQ3YjAuLjVhYzljYTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3NhdWNlLmMKKysrIGIvbGliYXZmb3JtYXQvc2F1Y2UuYwpAQCAtNjUsMTggKzY1LDE4IEBACiAgICAgaWYgKGdvdF93aWR0aCAmJiBkYXRhdHlwZSAmJiBmaWxldHlwZSkgewogICAgICAgICBpZiAoKGRhdGF0eXBlID09IDEgJiYgZmlsZXR5cGUgPD0yKSB8fCAoZGF0YXR5cGUgPT0gNSAmJiBmaWxldHlwZSA9PSAyNTUpIHx8IGRhdGF0eXBlID09IDYpIHsKICAgICAgICAgICAgIGlmICh0MSkgewotICAgICAgICAgICAgICAgIGF2Y3R4LT5zdHJlYW1zWzBdLT5jb2RlYy0+d2lkdGggPSB0MTw8MzsKKyAgICAgICAgICAgICAgICBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXItPndpZHRoID0gdDE8PDM7CiAgICAgICAgICAgICAgICAgKmdvdF93aWR0aCA9IDE7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZ2V0X2hlaWdodCAmJiB0MikKLSAgICAgICAgICAgICAgICBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWMtPmhlaWdodCA9IHQyPDw0OworICAgICAgICAgICAgICAgIGF2Y3R4LT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+aGVpZ2h0ID0gdDI8PDQ7CiAgICAgICAgIH0gZWxzZSBpZiAoZGF0YXR5cGUgPT0gNSkgewogICAgICAgICAgICAgaWYgKGZpbGV0eXBlKSB7Ci0gICAgICAgICAgICAgICAgYXZjdHgtPnN0cmVhbXNbMF0tPmNvZGVjLT53aWR0aCA9IChmaWxldHlwZSA9PSAxID8gdDEgOiBmaWxldHlwZSkgPDwgNDsKKyAgICAgICAgICAgICAgICBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXItPndpZHRoID0gKGZpbGV0eXBlID09IDEgPyB0MSA6IGZpbGV0eXBlKSA8PCA0OwogICAgICAgICAgICAgICAgICpnb3Rfd2lkdGggPSAxOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGdldF9oZWlnaHQgJiYgdDIpCi0gICAgICAgICAgICAgICAgYXZjdHgtPnN0cmVhbXNbMF0tPmNvZGVjLT5oZWlnaHQgPSB0Mjw8NDsKKyAgICAgICAgICAgICAgICBhdmN0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmhlaWdodCA9IHQyPDw0OwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zYmNkZWMuYyBiL2xpYmF2Zm9ybWF0L3NiY2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzRhMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9zYmNkZWMuYwpAQCAtMCwwICsxLDMzIEBACisvKgorICogUkFXIFNCQyBkZW11eGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAicmF3ZGVjLmgiCisKK0FWSW5wdXRGb3JtYXQgZmZfc2JjX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInNiYyIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBTQkMgKGxvdy1jb21wbGV4aXR5IHN1YmJhbmQgY29kZWMpIiksCisgICAgLmV4dGVuc2lvbnMgICAgID0gInNiYyxtc2JjIiwKKyAgICAucmF3X2NvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9TQkMsCisgICAgLnJlYWRfaGVhZGVyICAgID0gZmZfcmF3X2F1ZGlvX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3Jhd19yZWFkX3BhcnRpYWxfcGFja2V0LAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc2JnZGVjLmMgYi9saWJhdmZvcm1hdC9zYmdkZWMuYwppbmRleCAwM2NkOTIyLi5jYmVkZDEyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zYmdkZWMuYworKysgYi9saWJhdmZvcm1hdC9zYmdkZWMuYwpAQCAtOTI3LDcgKzkyNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHMtPnN0YXJ0X3RzID09IEFWX05PUFRTX1ZBTFVFKQotICAgICAgICBzLT5zdGFydF90cyA9IHMtPm9wdF9zdGFydF9hdF9maXJzdCA/IHMtPnRzZXFbMF0udHMudCA6IG5vdzsKKyAgICAgICAgcy0+c3RhcnRfdHMgPSAocy0+b3B0X3N0YXJ0X2F0X2ZpcnN0ICYmIHMtPnRzZXEpID8gcy0+dHNlcVswXS50cy50IDogbm93OwogICAgIHMtPmVuZF90cyA9IHMtPm9wdF9kdXJhdGlvbiA/IHMtPnN0YXJ0X3RzICsgcy0+b3B0X2R1cmF0aW9uIDoKICAgICAgICAgICAgICAgICBBVl9OT1BUU19WQUxVRTsgLyogbWF5IGJlIG92ZXJyaWRkZW4gbGF0ZXIgYnkgLUUgb3B0aW9uICovCiAgICAgY3VyX3RzID0gbm93OwpAQCAtMTMyNCw3ICsxMzI0LDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlbmNvZGVfaW50ZXJ2YWxzKHN0cnVjdCBzYmdfc2NyaXB0ICpzLCBBVkNvZGVjQ29udGV4dCAqYXZjLAorc3RhdGljIGludCBlbmNvZGVfaW50ZXJ2YWxzKHN0cnVjdCBzYmdfc2NyaXB0ICpzLCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3c19pbnRlcnZhbHMgKmludGVyKQogewogICAgIGludCBpLCBlZGF0YV9zaXplID0gNDsKQEAgLTEzMzYsOSArMTMzNiw5IEBACiAgICAgICAgIGlmIChlZGF0YV9zaXplIDwgMCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQotICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoYXZjLCBlZGF0YV9zaXplKSkKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHBhciwgZWRhdGFfc2l6ZSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgZWRhdGEgPSBhdmMtPmV4dHJhZGF0YTsKKyAgICBlZGF0YSA9IHBhci0+ZXh0cmFkYXRhOwogCiAjZGVmaW5lIEFERF9FREFUQTMyKHYpIGRvIHsgQVZfV0wzMihlZGF0YSwgKHYpKTsgZWRhdGEgKz0gNDsgfSB3aGlsZSgwKQogI2RlZmluZSBBRERfRURBVEE2NCh2KSBkbyB7IEFWX1dMNjQoZWRhdGEsICh2KSk7IGVkYXRhICs9IDg7IH0gd2hpbGUoMCkKQEAgLTEzNjIsNyArMTM2Miw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGVkYXRhICE9IGF2Yy0+ZXh0cmFkYXRhICsgZWRhdGFfc2l6ZSkKKyAgICBpZiAoZWRhdGEgIT0gcGFyLT5leHRyYWRhdGEgKyBlZGF0YV9zaXplKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNDE0LDEzICsxNDE0LDEzIEBACiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2ZiwgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9GRldBVkVTWU5USDsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICAgID0gc2JnLT5zYW1wbGVfcmF0ZTsKLSAgICBzdC0+Y29kZWMtPmZyYW1lX3NpemUgICAgID0gc2JnLT5mcmFtZV9zaXplOwotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9GRldBVkVTWU5USDsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgID0gc2JnLT5zYW1wbGVfcmF0ZTsKKyAgICBzdC0+Y29kZWNwYXItPmZyYW1lX3NpemUgICAgID0gc2JnLT5mcmFtZV9zaXplOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKICAgICBzdC0+cHJvYmVfcGFja2V0cyA9IDA7CiAgICAgc3QtPnN0YXJ0X3RpbWUgICAgPSBhdl9yZXNjYWxlKHNjcmlwdC5zdGFydF90cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2JnLT5zYW1wbGVfcmF0ZSwgQVZfVElNRV9CQVNFKTsKQEAgLTE0MjgsNyArMTQyOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBhdl9yZXNjYWxlKHNjcmlwdC5lbmRfdHMgLSBzY3JpcHQuc3RhcnRfdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiZy0+c2FtcGxlX3JhdGUsIEFWX1RJTUVfQkFTRSk7CiAgICAgc3QtPmN1cl9kdHMgICAgICAgPSBzdC0+c3RhcnRfdGltZTsKLSAgICByID0gZW5jb2RlX2ludGVydmFscygmc2NyaXB0LCBzdC0+Y29kZWMsICZpbnRlcik7CisgICAgciA9IGVuY29kZV9pbnRlcnZhbHMoJnNjcmlwdCwgc3QtPmNvZGVjcGFyLCAmaW50ZXIpOwogICAgIGlmIChyIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCkBAIC0xNDQ4LDcgKzE0NDgsNyBAQAogICAgIGludDY0X3QgdHMsIGVuZF90czsKIAogICAgIHRzID0gYXZmLT5zdHJlYW1zWzBdLT5jdXJfZHRzOwotICAgIGVuZF90cyA9IHRzICsgYXZmLT5zdHJlYW1zWzBdLT5jb2RlYy0+ZnJhbWVfc2l6ZTsKKyAgICBlbmRfdHMgPSB0cyArIGF2Zi0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmZyYW1lX3NpemU7CiAgICAgaWYgKGF2Zi0+c3RyZWFtc1swXS0+ZHVyYXRpb24gIT0gQVZfTk9QVFNfVkFMVUUpCiAgICAgICAgIGVuZF90cyA9IEZGTUlOKGF2Zi0+c3RyZWFtc1swXS0+c3RhcnRfdGltZSArIGF2Zi0+c3RyZWFtc1swXS0+ZHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZF90cyk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zY2NkZWMuYyBiL2xpYmF2Zm9ybWF0L3NjY2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDIxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9zY2NkZWMuYwpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIFNDQyBzdWJ0aXRsZSBkZW11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAic3VidGl0bGVzLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2JwcmludC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU0NDQ29udGV4dCB7CisgICAgRkZEZW11eFN1YnRpdGxlc1F1ZXVlIHE7Cit9IFNDQ0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgc2NjX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGNoYXIgYnVmWzE4XTsKKyAgICBGRlRleHRSZWFkZXIgdHI7CisKKyAgICBmZl90ZXh0X2luaXRfYnVmKCZ0ciwgcC0+YnVmLCBwLT5idWZfc2l6ZSk7CisKKyAgICB3aGlsZSAoZmZfdGV4dF9wZWVrX3I4KCZ0cikgPT0gJ1xyJyB8fCBmZl90ZXh0X3BlZWtfcjgoJnRyKSA9PSAnXG4nKQorICAgICAgICBmZl90ZXh0X3I4KCZ0cik7CisKKyAgICBmZl90ZXh0X3JlYWQoJnRyLCBidWYsIHNpemVvZihidWYpKTsKKworICAgIGlmICghbWVtY21wKGJ1ZiwgIlNjZW5hcmlzdF9TQ0MgVjEuMCIsIDE4KSkKKyAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29udmVydCh1aW50OF90IHgpCit7CisgICAgaWYgKHggPj0gJ2EnKQorICAgICAgICB4IC09IDg3OworICAgIGVsc2UgaWYgKHggPj0gJ0EnKQorICAgICAgICB4IC09IDU1OworICAgIGVsc2UKKyAgICAgICAgeCAtPSAnMCc7CisgICAgcmV0dXJuIHg7Cit9CisKK3N0YXRpYyBpbnQgc2NjX3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBTQ0NDb250ZXh0ICpzY2MgPSBzLT5wcml2X2RhdGE7CisgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBjaGFyIGxpbmVbNDA5Nl0sIGxpbmUyWzQwOTZdOworICAgIGludCBjb3VudCA9IDAsIHJldCA9IDA7CisgICAgcHRyZGlmZl90IGxlbjIsIGxlbjsKKyAgICB1aW50OF90IG91dFs0MDk2XTsKKyAgICBGRlRleHRSZWFkZXIgdHI7CisKKyAgICBmZl90ZXh0X2luaXRfYXZpbyhzLCAmdHIsIHMtPnBiKTsKKworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDApOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9FSUFfNjA4OworCisgICAgd2hpbGUgKCFmZl90ZXh0X2VvZigmdHIpKSB7CisgICAgICAgIGNvbnN0IGludDY0X3QgcG9zID0gZmZfdGV4dF9wb3MoJnRyKTsKKyAgICAgICAgY2hhciAqc2F2ZXB0ciA9IE5VTEwsICpsbGluZTsKKyAgICAgICAgaW50IGhoMSwgbW0xLCBzczEsIGZzMSwgaTsKKyAgICAgICAgaW50IGhoMiwgbW0yLCBzczIsIGZzMjsKKyAgICAgICAgaW50NjRfdCB0c19zdGFydCwgdHNfZW5kOworICAgICAgICBBVlBhY2tldCAqc3ViOworCisgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICB3aGlsZSAoIWZmX3RleHRfZW9mKCZ0cikpIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBmZl9zdWJ0aXRsZXNfcmVhZF9saW5lKCZ0ciwgbGluZSwgc2l6ZW9mKGxpbmUpKTsKKyAgICAgICAgICAgICAgICBpZiAobGVuID4gMTMpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzdHJuY21wKGxpbmUsICJTY2VuYXJpc3RfU0NDIFYxLjAiLCAxOCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHNzY2FuZihsaW5lLCAiJWQ6JWQ6JWQlKls6O10lZCIsICZoaDEsICZtbTEsICZzczEsICZmczEpICE9IDQpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB0c19zdGFydCA9IChoaDEgKiAzNjAwTEwgKyBtbTEgKiA2MExMICsgc3MxKSAqIDEwMDBMTCArIGZzMSAqIDMzOworCisgICAgICAgIHdoaWxlICghZmZfdGV4dF9lb2YoJnRyKSkgeworICAgICAgICAgICAgbGVuMiA9IGZmX3N1YnRpdGxlc19yZWFkX2xpbmUoJnRyLCBsaW5lMiwgc2l6ZW9mKGxpbmUyKSk7CisgICAgICAgICAgICBpZiAobGVuMiA+IDEzKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChzc2NhbmYobGluZTIsICIlZDolZDolZCUqWzo7XSVkIiwgJmhoMiwgJm1tMiwgJnNzMiwgJmZzMikgIT0gNCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHRzX2VuZCA9IChoaDIgKiAzNjAwTEwgKyBtbTIgKiA2MExMICsgc3MyKSAqIDEwMDBMTCArIGZzMiAqIDMzOworICAgICAgICBjb3VudCsrOworCisgICAgICAgIGxsaW5lID0gKGNoYXIgKikmbGluZTsKKyAgICAgICAgbGxpbmUgKz0gMTI7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQwOTU7IGkgKz0gMykgeworICAgICAgICAgICAgY2hhciAqcHRyID0gYXZfc3RydG9rKGxsaW5lLCAiICIsICZzYXZlcHRyKTsKKyAgICAgICAgICAgIGNoYXIgYzEsIGMyLCBjMywgYzQ7CisKKyAgICAgICAgICAgIGlmICghcHRyKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiAoc3NjYW5mKHB0ciwgIiVjJWMlYyVjIiwgJmMxLCAmYzIsICZjMywgJmM0KSAhPSA0KQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBsbGluZSA9IE5VTEw7CisgICAgICAgICAgICBvdXRbaSswXSA9IDB4ZmM7CisgICAgICAgICAgICBvdXRbaSsxXSA9IGNvbnZlcnQoYzIpIHwgKGNvbnZlcnQoYzEpIDw8IDQpOworICAgICAgICAgICAgb3V0W2krMl0gPSBjb252ZXJ0KGM0KSB8IChjb252ZXJ0KGMzKSA8PCA0KTsKKyAgICAgICAgfQorICAgICAgICBvdXRbaV0gPSAwOworCisgICAgICAgIHN1YiA9IGZmX3N1YnRpdGxlc19xdWV1ZV9pbnNlcnQoJnNjYy0+cSwgb3V0LCBpLCAwKTsKKyAgICAgICAgaWYgKCFzdWIpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIHN1Yi0+cG9zID0gcG9zOworICAgICAgICBzdWItPnB0cyA9IHRzX3N0YXJ0OworICAgICAgICBzdWItPmR1cmF0aW9uID0gRkZNQVgoMTIwMCwgdHNfZW5kIC0gdHNfc3RhcnQpOworICAgICAgICBtZW1tb3ZlKGxpbmUsIGxpbmUyLCBzaXplb2YobGluZSkpOworICAgICAgICBGRlNXQVAocHRyZGlmZl90LCBsZW4sIGxlbjIpOworICAgIH0KKworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9maW5hbGl6ZShzLCAmc2NjLT5xKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc2NjX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBTQ0NDb250ZXh0ICpzY2MgPSBzLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmX3N1YnRpdGxlc19xdWV1ZV9yZWFkX3BhY2tldCgmc2NjLT5xLCBwa3QpOworfQorCitzdGF0aWMgaW50IHNjY19yZWFkX3NlZWsoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbWluX3RzLCBpbnQ2NF90IHRzLCBpbnQ2NF90IG1heF90cywgaW50IGZsYWdzKQoreworICAgIFNDQ0NvbnRleHQgKnNjYyA9IHMtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZfc3VidGl0bGVzX3F1ZXVlX3NlZWsoJnNjYy0+cSwgcywgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fdHMsIHRzLCBtYXhfdHMsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzY2NfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgU0NDQ29udGV4dCAqc2NjID0gcy0+cHJpdl9kYXRhOworICAgIGZmX3N1YnRpdGxlc19xdWV1ZV9jbGVhbigmc2NjLT5xKTsKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zY2NfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2NjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2NlbmFyaXN0IENsb3NlZCBDYXB0aW9ucyIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTQ0NDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzY2NfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc2NjX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHNjY19yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrMiAgICAgPSBzY2NfcmVhZF9zZWVrLAorICAgIC5yZWFkX2Nsb3NlICAgICA9IHNjY19yZWFkX2Nsb3NlLAorICAgIC5leHRlbnNpb25zICAgICA9ICJzY2MiLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3NjY2VuYy5jIGIvbGliYXZmb3JtYXQvc2NjZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjZjNkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L3NjY2VuYy5jCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogU0NDIG11eGVyCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgUGF1bCBCIE1haG9sCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgU0NDQ29udGV4dCB7CisgICAgaW50IHByZXZfaCwgcHJldl9tLCBwcmV2X3MsIHByZXZfZjsKKyAgICBpbnQgaW5zaWRlOworICAgIGludCBuOworfSBTQ0NDb250ZXh0OworCitzdGF0aWMgaW50IHNjY193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICphdmYpCit7CisgICAgU0NDQ29udGV4dCAqc2NjID0gYXZmLT5wcml2X2RhdGE7CisKKyAgICBpZiAoYXZmLT5uYl9zdHJlYW1zICE9IDEgfHwKKyAgICAgICAgYXZmLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlNDQyBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIHN1YnRpdGxlcyBzdHJlYW0uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKGF2Zi0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0VJQV82MDgpIHsKKyAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHN1YnRpdGxlcyBjb2RlYzogJXNcbiIsCisgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKGF2Zi0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXZmLT5zdHJlYW1zWzBdLCA2NCwgMSwgMTAwMCk7CisgICAgYXZpb19wcmludGYoYXZmLT5wYiwgIlNjZW5hcmlzdF9TQ0MgVjEuMFxuIik7CisKKyAgICBzY2MtPnByZXZfaCA9IHNjYy0+cHJldl9tID0gc2NjLT5wcmV2X3MgPSBzY2MtPnByZXZfZiA9IC0xOworICAgIHNjYy0+aW5zaWRlID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjY193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICphdmYsIEFWUGFja2V0ICpwa3QpCit7CisgICAgU0NDQ29udGV4dCAqc2NjID0gYXZmLT5wcml2X2RhdGE7CisgICAgaW50NjRfdCBwdHMgPSBwa3QtPnB0czsKKyAgICBpbnQgaSwgaCwgbSwgcywgZjsKKworICAgIGlmIChwdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAiSW5zdWZmaWNpZW50IHRpbWVzdGFtcHMuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaCA9IChpbnQpKHB0cyAvICgzNjAwMDAwKSk7CisgICAgbSA9IChpbnQpKHB0cyAvICg2MDAwMCkpICUgNjA7CisgICAgcyA9IChpbnQpKHB0cyAvICAxMDAwKSAlIDYwOworICAgIGYgPSAoaW50KShwdHMgJSAgMTAwMCkgLyAzMzsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwa3QtPnNpemU7IGkrPTMpIHsKKyAgICAgICAgaWYgKHBrdC0+ZGF0YVtpXSA9PSAweGZjICYmICgocGt0LT5kYXRhW2kgKyAxXSAhPSAweDgwIHx8IHBrdC0+ZGF0YVtpICsgMl0gIT0gMHg4MCkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID49IHBrdC0+c2l6ZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoIXNjYy0+aW5zaWRlICYmIChzY2MtPnByZXZfaCAhPSBoIHx8IHNjYy0+cHJldl9tICE9IG0gfHwgc2NjLT5wcmV2X3MgIT0gcyB8fCBzY2MtPnByZXZfZiAhPSBmKSkgeworICAgICAgICBhdmlvX3ByaW50ZihhdmYtPnBiLCAiXG4lMDJkOiUwMmQ6JTAyZDolMDJkXHQiLCBoLCBtLCBzLCBmKTsKKyAgICAgICAgc2NjLT5pbnNpZGUgPSAxOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcGt0LT5zaXplOyBpKz0zKSB7CisgICAgICAgIGlmIChpICsgMyA+IHBrdC0+c2l6ZSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmIChwa3QtPmRhdGFbaV0gIT0gMHhmYyB8fCAocGt0LT5kYXRhW2kgKyAxXSA9PSAweDgwICYmIHBrdC0+ZGF0YVtpICsgMl0gPT0gMHg4MCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCFzY2MtPmluc2lkZSkgeworICAgICAgICAgICAgYXZpb19wcmludGYoYXZmLT5wYiwgIlxuJTAyZDolMDJkOiUwMmQ6JTAyZFx0IiwgaCwgbSwgcywgZik7CisgICAgICAgICAgICBzY2MtPmluc2lkZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjYy0+biA+IDApCisgICAgICAgICAgICBhdmlvX3ByaW50ZihhdmYtPnBiLCAiICIpOworICAgICAgICBhdmlvX3ByaW50ZihhdmYtPnBiLCAiJTAyeCUwMngiLCBwa3QtPmRhdGFbaSArIDFdLCBwa3QtPmRhdGFbaSArIDJdKTsKKyAgICAgICAgc2NjLT5uKys7CisgICAgfQorICAgIGlmIChzY2MtPmluc2lkZSAmJiAoc2NjLT5wcmV2X2ggIT0gaCB8fCBzY2MtPnByZXZfbSAhPSBtIHx8IHNjYy0+cHJldl9zICE9IHMgfHwgc2NjLT5wcmV2X2YgIT0gZikpIHsKKyAgICAgICAgYXZpb19wcmludGYoYXZmLT5wYiwgIlxuIik7CisgICAgICAgIHNjYy0+biA9IDA7CisgICAgICAgIHNjYy0+aW5zaWRlID0gMDsKKyAgICB9CisKKyAgICBzY2MtPnByZXZfaCA9IGg7CisgICAgc2NjLT5wcmV2X20gPSBtOworICAgIHNjYy0+cHJldl9zID0gczsKKyAgICBzY2MtPnByZXZfZiA9IGY7CisgICAgcmV0dXJuIDA7Cit9CisKK0FWT3V0cHV0Rm9ybWF0IGZmX3NjY19tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2NjIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2NlbmFyaXN0IENsb3NlZCBDYXB0aW9ucyIpLAorICAgIC5leHRlbnNpb25zICAgICA9ICJzY2MiLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTQ0NDb250ZXh0KSwKKyAgICAud3JpdGVfaGVhZGVyICAgPSBzY2Nfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICA9IHNjY193cml0ZV9wYWNrZXQsCisgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfR0xPQkFMSEVBREVSIHwgQVZGTVRfVkFSSUFCTEVfRlBTIHwgQVZGTVRfVFNfTk9OU1RSSUNULAorICAgIC5zdWJ0aXRsZV9jb2RlYyA9IEFWX0NPREVDX0lEX0VJQV82MDgsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc2N0cC5jIGIvbGliYXZmb3JtYXQvc2N0cC5jCmluZGV4IDVmZWU3ZTMuLjlhODBlOWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3NjdHAuYworKysgYi9saWJhdmZvcm1hdC9zY3RwLmMKQEAgLTM1OSw3ICszNTksNyBAQAogICAgIHJldHVybiBzLT5mZDsKIH0KIAotVVJMUHJvdG9jb2wgZmZfc2N0cF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX3NjdHBfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAic2N0cCIsCiAgICAgLnVybF9vcGVuICAgICAgICAgICAgPSBzY3RwX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSBzY3RwX3JlYWQsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zZHAuYyBiL2xpYmF2Zm9ybWF0L3NkcC5jCmluZGV4IDJhYjM3YTguLmE1ZDIwMmUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3NkcC5jCisrKyBiL2xpYmF2Zm9ybWF0L3NkcC5jCkBAIC0xNTEsMjQgKzE1MSwyNCBAQAogfQogCiAjZGVmaW5lIE1BWF9QU0VUX1NJWkUgMTAyNAotc3RhdGljIGNoYXIgKmV4dHJhZGF0YTJwc2V0cyhBVkNvZGVjQ29udGV4dCAqYykKK3N0YXRpYyBjaGFyICpleHRyYWRhdGEycHNldHMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyKQogewogICAgIGNoYXIgKnBzZXRzLCAqcDsKICAgICBjb25zdCB1aW50OF90ICpyOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIHBzZXRfc3RyaW5nW10gPSAiOyBzcHJvcC1wYXJhbWV0ZXItc2V0cz0iOwogICAgIHN0YXRpYyBjb25zdCBjaGFyIHByb2ZpbGVfc3RyaW5nW10gPSAiOyBwcm9maWxlLWxldmVsLWlkPSI7Ci0gICAgdWludDhfdCAqZXh0cmFkYXRhID0gYy0+ZXh0cmFkYXRhOwotICAgIGludCBleHRyYWRhdGFfc2l6ZSA9IGMtPmV4dHJhZGF0YV9zaXplOworICAgIHVpbnQ4X3QgKmV4dHJhZGF0YSA9IHBhci0+ZXh0cmFkYXRhOworICAgIGludCBleHRyYWRhdGFfc2l6ZSA9IHBhci0+ZXh0cmFkYXRhX3NpemU7CiAgICAgdWludDhfdCAqdG1wYnVmID0gTlVMTDsKICAgICBjb25zdCB1aW50OF90ICpzcHMgPSBOVUxMLCAqc3BzX2VuZDsKIAotICAgIGlmIChjLT5leHRyYWRhdGFfc2l6ZSA+IE1BWF9FWFRSQURBVEFfU0laRSkgewotICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiVG9vIG11Y2ggZXh0cmFkYXRhIVxuIik7CisgICAgaWYgKHBhci0+ZXh0cmFkYXRhX3NpemUgPiBNQVhfRVhUUkFEQVRBX1NJWkUpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRvbyBtdWNoIGV4dHJhZGF0YSFcbiIpOwogCiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoYy0+ZXh0cmFkYXRhWzBdID09IDEpIHsKLSAgICAgICAgaWYgKGZmX2F2Y193cml0ZV9hbm5leGJfZXh0cmFkYXRhKGMtPmV4dHJhZGF0YSwgJmV4dHJhZGF0YSwKKyAgICBpZiAocGFyLT5leHRyYWRhdGFbMF0gPT0gMSkgeworICAgICAgICBpZiAoZmZfYXZjX3dyaXRlX2FubmV4Yl9leHRyYWRhdGEocGFyLT5leHRyYWRhdGEsICZleHRyYWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFkYXRhX3NpemUpKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIHRtcGJ1ZiA9IGV4dHJhZGF0YTsKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiAgICAgcHNldHMgPSBhdl9tYWxsb2N6KE1BWF9QU0VUX1NJWkUpOwogICAgIGlmICghcHNldHMpIHsKLSAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBwYXJhbWV0ZXIgc2V0cy5cbiIpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBhcmFtZXRlciBzZXRzLlxuIik7CiAgICAgICAgIGF2X2ZyZWUodG1wYnVmKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjAzLDcgKzIwMyw3IEBACiAgICAgICAgICAgICBzcHNfZW5kID0gcjE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFhdl9iYXNlNjRfZW5jb2RlKHAsIE1BWF9QU0VUX1NJWkUgLSAocCAtIHBzZXRzKSwgciwgcjEgLSByKSkgewotICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBCYXNlNjQtZW5jb2RlICUiUFRSRElGRl9TUEVDSUZJRVIiICUiUFRSRElGRl9TUEVDSUZJRVIiIVxuIiwgTUFYX1BTRVRfU0laRSAtIChwIC0gcHNldHMpLCByMSAtIHIpOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBCYXNlNjQtZW5jb2RlICUiUFRSRElGRl9TUEVDSUZJRVIiICUiUFRSRElGRl9TUEVDSUZJRVIiIVxuIiwgTUFYX1BTRVRfU0laRSAtIChwIC0gcHNldHMpLCByMSAtIHIpOwogICAgICAgICAgICAgYXZfZnJlZShwc2V0cyk7CiAgICAgICAgICAgICBhdl9mcmVlKHRtcGJ1Zik7CiAKQEAgLTIyMywxMSArMjIzLDExIEBACiAgICAgcmV0dXJuIHBzZXRzOwogfQogCi1zdGF0aWMgY2hhciAqZXh0cmFkYXRhMnBzZXRzX2hldmMoQVZDb2RlY0NvbnRleHQgKmMpCitzdGF0aWMgY2hhciAqZXh0cmFkYXRhMnBzZXRzX2hldmMoQVZDb2RlY1BhcmFtZXRlcnMgKnBhcikKIHsKICAgICBjaGFyICpwc2V0czsKLSAgICB1aW50OF90ICpleHRyYWRhdGEgPSBjLT5leHRyYWRhdGE7Ci0gICAgaW50IGV4dHJhZGF0YV9zaXplID0gYy0+ZXh0cmFkYXRhX3NpemU7CisgICAgdWludDhfdCAqZXh0cmFkYXRhID0gcGFyLT5leHRyYWRhdGE7CisgICAgaW50IGV4dHJhZGF0YV9zaXplID0gcGFyLT5leHRyYWRhdGFfc2l6ZTsKICAgICB1aW50OF90ICp0bXBidWYgPSBOVUxMOwogICAgIGludCBwc19wb3NbM10gPSB7IDAgfTsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHBzX25hbWVzWzNdID0geyAidnBzIiwgInNwcyIsICJwcHMiIH07CkBAIC0yMzgsMTEgKzIzOCwxMSBAQAogICAgIC8vIHRoZSBzYW1lIHR5cGUsIGFuZCB3ZSBtaWdodCBuZWVkIHRvIGNvbnZlcnQgZnJvbSBvbmUgZm9ybWF0IHRvIHRoZQogICAgIC8vIG90aGVyIGFueXdheSwgd2UgZ2V0IGF3YXkgd2l0aCBhIGxpdHRsZSBsZXNzIHdvcmsgYnkgdXNpbmcgdGhlIGh2Y2MKICAgICAvLyBmb3JtYXQuCi0gICAgaWYgKGMtPmV4dHJhZGF0YVswXSAhPSAxKSB7CisgICAgaWYgKHBhci0+ZXh0cmFkYXRhWzBdICE9IDEpIHsKICAgICAgICAgQVZJT0NvbnRleHQgKnBiOwogICAgICAgICBpZiAoYXZpb19vcGVuX2R5bl9idWYoJnBiKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgaWYgKGZmX2lzb21fd3JpdGVfaHZjYyhwYiwgYy0+ZXh0cmFkYXRhLCBjLT5leHRyYWRhdGFfc2l6ZSwgMCkgPCAwKSB7CisgICAgICAgIGlmIChmZl9pc29tX3dyaXRlX2h2Y2MocGIsIHBhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YV9zaXplLCAwKSA8IDApIHsKICAgICAgICAgICAgIGF2aW9fY2xvc2VfZHluX2J1ZihwYiwgJnRtcGJ1Zik7CiAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgfQpAQCAtMjYxLDcgKzI2MSw3IEBACiAgICAgICAgICAgICBnb3RvIGVycjsKICAgICAgICAgbmFsdV90eXBlID0gZXh0cmFkYXRhW3Bvc10gJiAweDNmOwogICAgICAgICAvLyBOb3QgaW5jbHVkaW5nIGxpYmF2Y29kZWMvaGV2Yy5oIHRvIGF2b2lkIGNvbmZ1c2lvbiBiZXR3ZWVuCi0gICAgICAgIC8vIE5BTF8qIHdpdGggdGhlIHNhbWUgbmFtZSBmb3IgYm90aCBIMjY0IGFuZCBIRVZDLgorICAgICAgICAvLyBOQUxfKiB3aXRoIHRoZSBzYW1lIG5hbWUgZm9yIGJvdGggSC4yNjQgYW5kIEhFVkMuCiAgICAgICAgIGlmIChuYWx1X3R5cGUgPT0gMzIpIC8vIFZQUwogICAgICAgICAgICAgcHNfcG9zWzBdID0gcG9zOwogICAgICAgICBlbHNlIGlmIChuYWx1X3R5cGUgPT0gMzMpIC8vIFNQUwpAQCAtMzI0LDM1ICszMjQsMzUgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGNoYXIgKmV4dHJhZGF0YTJjb25maWcoQVZDb2RlY0NvbnRleHQgKmMpCitzdGF0aWMgY2hhciAqZXh0cmFkYXRhMmNvbmZpZyhBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpCiB7CiAgICAgY2hhciAqY29uZmlnOwogCi0gICAgaWYgKGMtPmV4dHJhZGF0YV9zaXplID4gTUFYX0VYVFJBREFUQV9TSVpFKSB7Ci0gICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJUb28gbXVjaCBleHRyYWRhdGEhXG4iKTsKKyAgICBpZiAocGFyLT5leHRyYWRhdGFfc2l6ZSA+IE1BWF9FWFRSQURBVEFfU0laRSkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVG9vIG11Y2ggZXh0cmFkYXRhIVxuIik7CiAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIGNvbmZpZyA9IGF2X21hbGxvYygxMCArIGMtPmV4dHJhZGF0YV9zaXplICogMik7CisgICAgY29uZmlnID0gYXZfbWFsbG9jKDEwICsgcGFyLT5leHRyYWRhdGFfc2l6ZSAqIDIpOwogICAgIGlmICghY29uZmlnKSB7Ci0gICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgY29uZmlnIGluZm8uXG4iKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBjb25maWcgaW5mby5cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgICAgbWVtY3B5KGNvbmZpZywgIjsgY29uZmlnPSIsIDkpOwotICAgIGZmX2RhdGFfdG9faGV4KGNvbmZpZyArIDksIGMtPmV4dHJhZGF0YSwgYy0+ZXh0cmFkYXRhX3NpemUsIDApOwotICAgIGNvbmZpZ1s5ICsgYy0+ZXh0cmFkYXRhX3NpemUgKiAyXSA9IDA7CisgICAgZmZfZGF0YV90b19oZXgoY29uZmlnICsgOSwgcGFyLT5leHRyYWRhdGEsIHBhci0+ZXh0cmFkYXRhX3NpemUsIDApOworICAgIGNvbmZpZ1s5ICsgcGFyLT5leHRyYWRhdGFfc2l6ZSAqIDJdID0gMDsKIAogICAgIHJldHVybiBjb25maWc7CiB9CiAKLXN0YXRpYyBjaGFyICp4aXBoX2V4dHJhZGF0YTJjb25maWcoQVZDb2RlY0NvbnRleHQgKmMpCitzdGF0aWMgY2hhciAqeGlwaF9leHRyYWRhdGEyY29uZmlnKEFWRm9ybWF0Q29udGV4dCAqcywgQVZDb2RlY1BhcmFtZXRlcnMgKnBhcikKIHsKICAgICBjaGFyICpjb25maWcsICplbmNvZGVkX2NvbmZpZzsKICAgICBjb25zdCB1aW50OF90ICpoZWFkZXJfc3RhcnRbM107CiAgICAgaW50IGhlYWRlcnNfbGVuLCBoZWFkZXJfbGVuWzNdLCBjb25maWdfbGVuOwogICAgIGludCBmaXJzdF9oZWFkZXJfc2l6ZTsKIAotICAgIHN3aXRjaCAoYy0+Y29kZWNfaWQpIHsKKyAgICBzd2l0Y2ggKHBhci0+Y29kZWNfaWQpIHsKICAgICBjYXNlIEFWX0NPREVDX0lEX1RIRU9SQToKICAgICAgICAgZmlyc3RfaGVhZGVyX3NpemUgPSA0MjsKICAgICAgICAgYnJlYWs7CkBAIC0zNjAsMTQgKzM2MCwxNCBAQAogICAgICAgICBmaXJzdF9oZWFkZXJfc2l6ZSA9IDMwOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhdl9sb2coYywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgWGlwaCBjb2RlYyBJRFxuIik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBYaXBoIGNvZGVjIElEXG4iKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKGF2cHJpdl9zcGxpdF94aXBoX2hlYWRlcnMoYy0+ZXh0cmFkYXRhLCBjLT5leHRyYWRhdGFfc2l6ZSwKKyAgICBpZiAoYXZwcml2X3NwbGl0X3hpcGhfaGVhZGVycyhwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2hlYWRlcl9zaXplLCBoZWFkZXJfc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfbGVuKSA8IDApIHsKLSAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkV4dHJhZGF0YSBjb3JydXB0LlxuIik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFeHRyYWRhdGEgY29ycnVwdC5cbiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTQwOSwxMiArNDA5LDEyIEBACiAgICAgcmV0dXJuIGVuY29kZWRfY29uZmlnOwogCiB4aXBoX2ZhaWw6Ci0gICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwKKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGNvbmZpZ3VyYXRpb24gc3RyaW5nXG4iKTsKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGludCBsYXRtX2NvbnRleHQycHJvZmlsZWxldmVsKEFWQ29kZWNDb250ZXh0ICpjKQorc3RhdGljIGludCBsYXRtX2NvbnRleHQycHJvZmlsZWxldmVsKEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpCiB7CiAgICAgLyogTVA0QS1MQVRNCiAgICAgICogVGhlIFJUUCBwYXlsb2FkIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIGRlc2NyaWJlZCBpbiBSRkMgMzAxNgpAQCAtNDI1LDE3ICs0MjUsMTcgQEAKICAgICAvKiBUT0RPOiBBQUMgUHJvZmlsZSBvbmx5IHN1cHBvcnRzIEFBQyBMQyBPYmplY3QgVHlwZS4KICAgICAgKiBEaWZmZXJlbnQgT2JqZWN0IFR5cGVzIHNob3VsZCBpbXBsZW1lbnQgZGlmZmVyZW50IFByb2ZpbGUgTGV2ZWxzICovCiAKLSAgICBpZiAoYy0+c2FtcGxlX3JhdGUgPD0gMjQwMDApIHsKLSAgICAgICAgaWYgKGMtPmNoYW5uZWxzIDw9IDIpCisgICAgaWYgKHBhci0+c2FtcGxlX3JhdGUgPD0gMjQwMDApIHsKKyAgICAgICAgaWYgKHBhci0+Y2hhbm5lbHMgPD0gMikKICAgICAgICAgICAgIHByb2ZpbGVfbGV2ZWwgPSAweDI4OyAvLyBBQUMgUHJvZmlsZSwgTGV2ZWwgMQotICAgIH0gZWxzZSBpZiAoYy0+c2FtcGxlX3JhdGUgPD0gNDgwMDApIHsKLSAgICAgICAgaWYgKGMtPmNoYW5uZWxzIDw9IDIpIHsKKyAgICB9IGVsc2UgaWYgKHBhci0+c2FtcGxlX3JhdGUgPD0gNDgwMDApIHsKKyAgICAgICAgaWYgKHBhci0+Y2hhbm5lbHMgPD0gMikgewogICAgICAgICAgICAgcHJvZmlsZV9sZXZlbCA9IDB4Mjk7IC8vIEFBQyBQcm9maWxlLCBMZXZlbCAyCi0gICAgICAgIH0gZWxzZSBpZiAoYy0+Y2hhbm5lbHMgPD0gNSkgeworICAgICAgICB9IGVsc2UgaWYgKHBhci0+Y2hhbm5lbHMgPD0gNSkgewogICAgICAgICAgICAgcHJvZmlsZV9sZXZlbCA9IDB4MkE7IC8vIEFBQyBQcm9maWxlLCBMZXZlbCA0CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGMtPnNhbXBsZV9yYXRlIDw9IDk2MDAwKSB7Ci0gICAgICAgIGlmIChjLT5jaGFubmVscyA8PSA1KSB7CisgICAgfSBlbHNlIGlmIChwYXItPnNhbXBsZV9yYXRlIDw9IDk2MDAwKSB7CisgICAgICAgIGlmIChwYXItPmNoYW5uZWxzIDw9IDUpIHsKICAgICAgICAgICAgIHByb2ZpbGVfbGV2ZWwgPSAweDJCOyAvLyBBQUMgUHJvZmlsZSwgTGV2ZWwgNQogICAgICAgICB9CiAgICAgfQpAQCAtNDQzLDcgKzQ0Myw3IEBACiAgICAgcmV0dXJuIHByb2ZpbGVfbGV2ZWw7CiB9CiAKLXN0YXRpYyBjaGFyICpsYXRtX2NvbnRleHQyY29uZmlnKEFWQ29kZWNDb250ZXh0ICpjKQorc3RhdGljIGNoYXIgKmxhdG1fY29udGV4dDJjb25maWcoQVZGb3JtYXRDb250ZXh0ICpzLCBBVkNvZGVjUGFyYW1ldGVycyAqcGFyKQogewogICAgIC8qIE1QNEEtTEFUTQogICAgICAqIFRoZSBSVFAgcGF5bG9hZCBmb3JtYXQgc3BlY2lmaWNhdGlvbiBpcyBkZXNjcmliZWQgaW4gUkZDIDMwMTYKQEAgLTQ1NCwyMyArNDU0LDIzIEBACiAgICAgY2hhciAqY29uZmlnOwogCiAgICAgZm9yIChyYXRlX2luZGV4ID0gMDsgcmF0ZV9pbmRleCA8IDE2OyByYXRlX2luZGV4KyspCi0gICAgICAgIGlmIChhdnByaXZfbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbcmF0ZV9pbmRleF0gPT0gYy0+c2FtcGxlX3JhdGUpCisgICAgICAgIGlmIChhdnByaXZfbXBlZzRhdWRpb19zYW1wbGVfcmF0ZXNbcmF0ZV9pbmRleF0gPT0gcGFyLT5zYW1wbGVfcmF0ZSkKICAgICAgICAgICAgIGJyZWFrOwogICAgIGlmIChyYXRlX2luZGV4ID09IDE2KSB7Ci0gICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZVxuIik7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBzYW1wbGUgcmF0ZVxuIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGNvbmZpZ19ieXRlWzBdID0gMHg0MDsKICAgICBjb25maWdfYnl0ZVsxXSA9IDA7CiAgICAgY29uZmlnX2J5dGVbMl0gPSAweDIwIHwgcmF0ZV9pbmRleDsKLSAgICBjb25maWdfYnl0ZVszXSA9IGMtPmNoYW5uZWxzIDw8IDQ7CisgICAgY29uZmlnX2J5dGVbM10gPSBwYXItPmNoYW5uZWxzIDw8IDQ7CiAgICAgY29uZmlnX2J5dGVbNF0gPSAweDNmOwogICAgIGNvbmZpZ19ieXRlWzVdID0gMHhjMDsKIAogICAgIGNvbmZpZyA9IGF2X21hbGxvYyg2KjIrMSk7CiAgICAgaWYgKCFjb25maWcpIHsKLSAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBjb25maWcgaW5mby5cbiIpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGNvbmZpZyBpbmZvLlxuIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICBmZl9kYXRhX3RvX2hleChjb25maWcsIGNvbmZpZ19ieXRlLCA2LCAxKTsKQEAgLTQ3OSwxOCArNDc5LDIyIEBACiAgICAgcmV0dXJuIGNvbmZpZzsKIH0KIAotc3RhdGljIGNoYXIgKnNkcF93cml0ZV9tZWRpYV9hdHRyaWJ1dGVzKGNoYXIgKmJ1ZmYsIGludCBzaXplLCBBVkNvZGVjQ29udGV4dCAqYywgaW50IHBheWxvYWRfdHlwZSwgQVZGb3JtYXRDb250ZXh0ICpmbXQpCitzdGF0aWMgY2hhciAqc2RwX3dyaXRlX21lZGlhX2F0dHJpYnV0ZXMoY2hhciAqYnVmZiwgaW50IHNpemUsIEFWU3RyZWFtICpzdCwgaW50IHBheWxvYWRfdHlwZSwgQVZGb3JtYXRDb250ZXh0ICpmbXQpCiB7CiAgICAgY2hhciAqY29uZmlnID0gTlVMTDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcCA9IHN0LT5jb2RlY3BhcjsKIAotICAgIHN3aXRjaCAoYy0+Y29kZWNfaWQpIHsKKyAgICBzd2l0Y2ggKHAtPmNvZGVjX2lkKSB7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfRElSQUM6CisgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgVkMyLzkwMDAwXHJcbiIsIHBheWxvYWRfdHlwZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9IMjY0OiB7CiAgICAgICAgICAgICBpbnQgbW9kZSA9IDE7CiAgICAgICAgICAgICBpZiAoZm10ICYmIGZtdC0+b2Zvcm1hdCAmJiBmbXQtPm9mb3JtYXQtPnByaXZfY2xhc3MgJiYKICAgICAgICAgICAgICAgICBhdl9vcHRfZmxhZ19pc19zZXQoZm10LT5wcml2X2RhdGEsICJydHBmbGFncyIsICJoMjY0X21vZGUwIikpCiAgICAgICAgICAgICAgICAgbW9kZSA9IDA7Ci0gICAgICAgICAgICBpZiAoYy0+ZXh0cmFkYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICBjb25maWcgPSBleHRyYWRhdGEycHNldHMoYyk7CisgICAgICAgICAgICBpZiAocC0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBjb25maWcgPSBleHRyYWRhdGEycHNldHMoZm10LCBwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBIMjY0LzkwMDAwXHJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhPWZtdHA6JWQgcGFja2V0aXphdGlvbi1tb2RlPSVkJXNcclxuIiwKQEAgLTUwMiw5ICs1MDYsOSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpwaWNfZm10ID0gTlVMTDsKICAgICAgICAgICAgIC8qIG9ubHkgUUNJRiBhbmQgQ0lGIGFyZSBzcGVjaWZpZWQgYXMgc3VwcG9ydGVkIGluIFJGQyA0NTg3ICovCi0gICAgICAgICAgICBpZiAoYy0+d2lkdGggPT0gMTc2ICYmIGMtPmhlaWdodCA9PSAxNDQpCisgICAgICAgICAgICBpZiAocC0+d2lkdGggPT0gMTc2ICYmIHAtPmhlaWdodCA9PSAxNDQpCiAgICAgICAgICAgICAgICAgcGljX2ZtdCA9ICJRQ0lGPTEiOwotICAgICAgICAgICAgZWxzZSBpZiAoYy0+d2lkdGggPT0gMzUyICYmIGMtPmhlaWdodCA9PSAyODgpCisgICAgICAgICAgICBlbHNlIGlmIChwLT53aWR0aCA9PSAzNTIgJiYgcC0+aGVpZ2h0ID09IDI4OCkKICAgICAgICAgICAgICAgICBwaWNfZm10ID0gIkNJRj0xIjsKICAgICAgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPj0gUlRQX1BUX1BSSVZBVEUpCiAgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEgyNjEvOTAwMDBcclxuIiwgcGF5bG9hZF90eXBlKTsKQEAgLTUyMCwyMyArNTI0LDIzIEBACiAgICAgICAgICAgICAgKiBzdGFnZWZyaWdodCBhbmQgb24gU2Ftc3VuZyBiYWRhLiAqLwogICAgICAgICAgICAgaWYgKCFmbXQgfHwgIWZtdC0+b2Zvcm1hdC0+cHJpdl9jbGFzcyB8fAogICAgICAgICAgICAgICAgICFhdl9vcHRfZmxhZ19pc19zZXQoZm10LT5wcml2X2RhdGEsICJydHBmbGFncyIsICJyZmMyMTkwIikgfHwKLSAgICAgICAgICAgICAgICBjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzUCkKKyAgICAgICAgICAgICAgICBwLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjYzUCkKICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBIMjYzLTIwMDAvOTAwMDBcclxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImE9ZnJhbWVzaXplOiVkICVkLSVkXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGMtPndpZHRoLCBjLT5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBwLT53aWR0aCwgcC0+aGVpZ2h0KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0hFVkM6Ci0gICAgICAgICAgICBpZiAoYy0+ZXh0cmFkYXRhX3NpemUpCi0gICAgICAgICAgICAgICAgY29uZmlnID0gZXh0cmFkYXRhMnBzZXRzX2hldmMoYyk7CisgICAgICAgICAgICBpZiAocC0+ZXh0cmFkYXRhX3NpemUpCisgICAgICAgICAgICAgICAgY29uZmlnID0gZXh0cmFkYXRhMnBzZXRzX2hldmMocCk7CiAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgSDI2NS85MDAwMFxyXG4iLCBwYXlsb2FkX3R5cGUpOwogICAgICAgICAgICAgaWYgKGNvbmZpZykKICAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1mbXRwOiVkICVzXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgY29uZmlnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01QRUc0OgotICAgICAgICAgICAgaWYgKGMtPmV4dHJhZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnID0gZXh0cmFkYXRhMmNvbmZpZyhjKTsKKyAgICAgICAgICAgIGlmIChwLT5leHRyYWRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgIGNvbmZpZyA9IGV4dHJhZGF0YTJjb25maWcoZm10LCBwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBNUDRWLUVTLzkwMDAwXHJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhPWZtdHA6JWQgcHJvZmlsZS1sZXZlbC1pZD0xJXNcclxuIiwKQEAgLTU0NiwyMSArNTUwLDIxIEBACiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfQUFDOgogICAgICAgICAgICAgaWYgKGZtdCAmJiBmbXQtPm9mb3JtYXQgJiYgZm10LT5vZm9ybWF0LT5wcml2X2NsYXNzICYmCiAgICAgICAgICAgICAgICAgYXZfb3B0X2ZsYWdfaXNfc2V0KGZtdC0+cHJpdl9kYXRhLCAicnRwZmxhZ3MiLCAibGF0bSIpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnID0gbGF0bV9jb250ZXh0MmNvbmZpZyhjKTsKKyAgICAgICAgICAgICAgICBjb25maWcgPSBsYXRtX2NvbnRleHQyY29uZmlnKGZtdCwgcCk7CiAgICAgICAgICAgICAgICAgaWYgKCFjb25maWcpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBNUDRBLUxBVE0vJWQvJWRcclxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhPWZtdHA6JWQgcHJvZmlsZS1sZXZlbC1pZD0lZDtjcHJlc2VudD0wO2NvbmZpZz0lc1xyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGMtPnNhbXBsZV9yYXRlLCBjLT5jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBsYXRtX2NvbnRleHQycHJvZmlsZWxldmVsKGMpLCBjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIHAtPnNhbXBsZV9yYXRlLCBwLT5jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBsYXRtX2NvbnRleHQycHJvZmlsZWxldmVsKHApLCBjb25maWcpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYy0+ZXh0cmFkYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gZXh0cmFkYXRhMmNvbmZpZyhjKTsKKyAgICAgICAgICAgICAgICBpZiAocC0+ZXh0cmFkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnID0gZXh0cmFkYXRhMmNvbmZpZyhmbXQsIHApOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBtYXliZSB3ZSBjYW4gZm9yZ2UgY29uZmlnIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgKiAgICAgICAgY29kZWMgcGFyYW1ldGVycy4uLgogICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIkFBQyB3aXRoIG5vIGdsb2JhbCBoZWFkZXJzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhmbXQsIEFWX0xPR19FUlJPUiwgIkFBQyB3aXRoIG5vIGdsb2JhbCBoZWFkZXJzIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykgewpAQCAtNTcwLDcgKzU3NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImE9Zm10cDolZCBwcm9maWxlLWxldmVsLWlkPTE7IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2RlPUFBQy1oYnI7c2l6ZWxlbmd0aD0xMztpbmRleGxlbmd0aD0zOyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXhkZWx0YWxlbmd0aD0zJXNcclxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgcC0+c2FtcGxlX3JhdGUsIHAtPmNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGNvbmZpZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTU3OCw0OCArNTgyLDU0IEBACiAgICAgICAgICAgICBpZiAocGF5bG9hZF90eXBlID49IFJUUF9QVF9QUklWQVRFKQogICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBMMTYvJWQvJWRcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5zYW1wbGVfcmF0ZSwgcC0+Y2hhbm5lbHMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MyNEJFOgorICAgICAgICAgICAgaWYgKHBheWxvYWRfdHlwZSA+PSBSVFBfUFRfUFJJVkFURSkKKyAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgTDI0LyVkLyVkXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+c2FtcGxlX3JhdGUsIHAtPmNoYW5uZWxzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1BDTV9NVUxBVzoKICAgICAgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPj0gUlRQX1BUX1BSSVZBVEUpCiAgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIFBDTVUvJWQvJWRcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5zYW1wbGVfcmF0ZSwgcC0+Y2hhbm5lbHMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX0FMQVc6CiAgICAgICAgICAgICBpZiAocGF5bG9hZF90eXBlID49IFJUUF9QVF9QUklWQVRFKQogICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBQQ01BLyVkLyVkXHJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2FtcGxlX3JhdGUsIGMtPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+c2FtcGxlX3JhdGUsIHAtPmNoYW5uZWxzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FNUl9OQjoKICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBBTVIvJWQvJWRcclxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImE9Zm10cDolZCBvY3RldC1hbGlnbj0xXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBwLT5zYW1wbGVfcmF0ZSwgcC0+Y2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FNUl9XQjoKICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBBTVItV0IvJWQvJWRcclxuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImE9Zm10cDolZCBvY3RldC1hbGlnbj0xXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBwLT5zYW1wbGVfcmF0ZSwgcC0+Y2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1ZPUkJJUzoKLSAgICAgICAgICAgIGlmIChjLT5leHRyYWRhdGFfc2l6ZSkKLSAgICAgICAgICAgICAgICBjb25maWcgPSB4aXBoX2V4dHJhZGF0YTJjb25maWcoYyk7CisgICAgICAgICAgICBpZiAocC0+ZXh0cmFkYXRhX3NpemUpCisgICAgICAgICAgICAgICAgY29uZmlnID0geGlwaF9leHRyYWRhdGEyY29uZmlnKGZtdCwgcCk7CiAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIlZvcmJpcyBjb25maWd1cmF0aW9uIGluZm8gbWlzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgYXZfbG9nKGZtdCwgQVZfTE9HX0VSUk9SLCAiVm9yYmlzIGNvbmZpZ3VyYXRpb24gaW5mbyBtaXNzaW5nXG4iKTsKICAgICAgICAgICAgIGlmICghY29uZmlnKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgdm9yYmlzLyVkLyVkXHJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhPWZtdHA6JWQgY29uZmlndXJhdGlvbj0lc1xyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBjLT5zYW1wbGVfcmF0ZSwgYy0+Y2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIHAtPnNhbXBsZV9yYXRlLCBwLT5jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgY29uZmlnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1RIRU9SQTogewogICAgICAgICAgICAgY29uc3QgY2hhciAqcGl4X2ZtdDsKLSAgICAgICAgICAgIHN3aXRjaCAoYy0+cGl4X2ZtdCkgeworICAgICAgICAgICAgc3dpdGNoIChwLT5mb3JtYXQpIHsKICAgICAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgogICAgICAgICAgICAgICAgIHBpeF9mbXQgPSAiWUNiQ3ItNDoyOjAiOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNjMwLDE0ICs2NDAsMTQgQEAKICAgICAgICAgICAgICAgICBwaXhfZm10ID0gIllDYkNyLTQ6NDo0IjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC5cbiIpOworICAgICAgICAgICAgICAgIGF2X2xvZyhmbXQsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdC5cbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoYy0+ZXh0cmFkYXRhX3NpemUpCi0gICAgICAgICAgICAgICAgY29uZmlnID0geGlwaF9leHRyYWRhdGEyY29uZmlnKGMpOworICAgICAgICAgICAgaWYgKHAtPmV4dHJhZGF0YV9zaXplKQorICAgICAgICAgICAgICAgIGNvbmZpZyA9IHhpcGhfZXh0cmFkYXRhMmNvbmZpZyhmbXQsIHApOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJUaGVvcmEgY29uZmlndWF0aW9uIGluZm8gbWlzc2luZ1xuIik7CisgICAgICAgICAgICAgICAgYXZfbG9nKGZtdCwgQVZfTE9HX0VSUk9SLCAiVGhlb3JhIGNvbmZpZ3VyYXRpb24gaW5mbyBtaXNzaW5nXG4iKTsKICAgICAgICAgICAgIGlmICghY29uZmlnKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC02NDYsMTMgKzY1NiwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpZHRoPSVkOyBoZWlnaHQ9JWQ7IHNhbXBsaW5nPSVzOyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJhdGlvbj0lc1xyXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBwYXlsb2FkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT53aWR0aCwgYy0+aGVpZ2h0LCBwaXhfZm10LCBjb25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+d2lkdGgsIHAtPmhlaWdodCwgcGl4X2ZtdCwgY29uZmlnKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgQVZfQ09ERUNfSURfVlA4OgogICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIFZQOC85MDAwMFxyXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSk7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVl9DT0RFQ19JRF9WUDk6CisgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgVlA5LzkwMDAwXHJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX01KUEVHOgogICAgICAgICAgICAgaWYgKHBheWxvYWRfdHlwZSA+PSBSVFBfUFRfUFJJVkFURSkKICAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgSlBFRy85MDAwMFxyXG4iLApAQCAtNjYyLDMyICs2NzYsNDAgQEAKICAgICAgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPj0gUlRQX1BUX1BSSVZBVEUpCiAgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEc3MjIvJWQvJWRcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwLCBjLT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDAsIHAtPmNoYW5uZWxzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0c3MjY6IHsKICAgICAgICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPj0gUlRQX1BUX1BSSVZBVEUpCisgICAgICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIEFBTDItRzcyNi0lZC8lZFxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSo4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0FEUENNX0c3MjZMRTogeworICAgICAgICAgICAgaWYgKHBheWxvYWRfdHlwZSA+PSBSVFBfUFRfUFJJVkFURSkKICAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgRzcyNi0lZC8lZFxyXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSo4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSo4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5zYW1wbGVfcmF0ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX0lMQkM6CiAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1ydHBtYXA6JWQgaUxCQy8lZFxyXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYT1mbXRwOiVkIG1vZGU9JWRcclxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIGMtPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgYy0+YmxvY2tfYWxpZ24gPT0gMzggPyAyMCA6IDMwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIHAtPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRfdHlwZSwgcC0+YmxvY2tfYWxpZ24gPT0gMzggPyAyMCA6IDMwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX0NPREVDX0lEX1NQRUVYOgogICAgICAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImE9cnRwbWFwOiVkIHNwZWV4LyVkXHJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlLCBjLT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBpZiAoYy0+Y29kZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUsIHAtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWMpIHsKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlOwogICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhZF9vcHRpb247CiAKLSAgICAgICAgICAgICAgICBpZiAoYy0+ZmxhZ3MgJiBBVl9DT0RFQ19GTEFHX1FTQ0FMRSkKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5mbGFncyAmIEFWX0NPREVDX0ZMQUdfUVNDQUxFKQogICAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAib24iOwotICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhdl9vcHRfZ2V0X2ludChjLCAidmFkIiwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0sICZ2YWRfb3B0aW9uKSAmJiB2YWRfb3B0aW9uKQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFhdl9vcHRfZ2V0X2ludChzdC0+Y29kZWMsICJ2YWQiLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSwgJnZhZF9vcHRpb24pICYmIHZhZF9vcHRpb24pCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9ICJ2YWQiOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gIm9mZiI7CkBAIC03MDUsOCArNzI3LDggQEAKICAgICAgICAgICAgICAgIHJlY2VpdmVycyBNVVNUIGJlIGFibGUgdG8gcmVjZWl2ZSBhbmQgcHJvY2VzcyBzdGVyZW8gcGFja2V0cy4gKi8KICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPXJ0cG1hcDolZCBvcHVzLzQ4MDAwLzJcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkX3R5cGUpOwotICAgICAgICAgICAgaWYgKGMtPmNoYW5uZWxzID09IDIpIHsKLSAgICAgICAgICAgICAgICBhdl9zdHJsY2F0ZihidWZmLCBzaXplLCAiYT1mbXRwOiVkIHNwcm9wLXN0ZXJlbzoxXHJcbiIsCisgICAgICAgICAgICBpZiAocC0+Y2hhbm5lbHMgPT0gMikgeworICAgICAgICAgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJhPWZtdHA6JWQgc3Byb3Atc3RlcmVvPTFcclxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF90eXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzI0LDEzICs3NDYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlc3RfYWRkciwgY29uc3QgY2hhciAqZGVzdF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvcnQsIGludCB0dGwsIEFWRm9ybWF0Q29udGV4dCAqZm10KQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjID0gc3QtPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwID0gc3QtPmNvZGVjcGFyOwogICAgIGNvbnN0IGNoYXIgKnR5cGU7CiAgICAgaW50IHBheWxvYWRfdHlwZTsKIAotICAgIHBheWxvYWRfdHlwZSA9IGZmX3J0cF9nZXRfcGF5bG9hZF90eXBlKGZtdCwgYywgaWR4KTsKKyAgICBwYXlsb2FkX3R5cGUgPSBmZl9ydHBfZ2V0X3BheWxvYWRfdHlwZShmbXQsIHN0LT5jb2RlY3BhciwgaWR4KTsKIAotICAgIHN3aXRjaCAoYy0+Y29kZWNfdHlwZSkgeworICAgIHN3aXRjaCAocC0+Y29kZWNfdHlwZSkgewogICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTyAgIDogdHlwZSA9ICJ2aWRlbyIgICAgICA7IGJyZWFrOwogICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTyAgIDogdHlwZSA9ICJhdWRpbyIgICAgICA7IGJyZWFrOwogICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRTogdHlwZSA9ICJ0ZXh0IiAgICAgICA7IGJyZWFrOwpAQCAtNzM5LDExICs3NjEsMTEgQEAKIAogICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJtPSVzICVkIFJUUC9BVlAgJWRcclxuIiwgdHlwZSwgcG9ydCwgcGF5bG9hZF90eXBlKTsKICAgICBzZHBfd3JpdGVfYWRkcmVzcyhidWZmLCBzaXplLCBkZXN0X2FkZHIsIGRlc3RfdHlwZSwgdHRsKTsKLSAgICBpZiAoYy0+Yml0X3JhdGUpIHsKLSAgICAgICAgYXZfc3RybGNhdGYoYnVmZiwgc2l6ZSwgImI9QVM6JSJQUklkNjQiXHJcbiIsIChpbnQ2NF90KWMtPmJpdF9yYXRlIC8gMTAwMCk7CisgICAgaWYgKHAtPmJpdF9yYXRlKSB7CisgICAgICAgIGF2X3N0cmxjYXRmKGJ1ZmYsIHNpemUsICJiPUFTOiUiUFJJZDY0IlxyXG4iLCBwLT5iaXRfcmF0ZSAvIDEwMDApOwogICAgIH0KIAotICAgIHNkcF93cml0ZV9tZWRpYV9hdHRyaWJ1dGVzKGJ1ZmYsIHNpemUsIGMsIHBheWxvYWRfdHlwZSwgZm10KTsKKyAgICBzZHBfd3JpdGVfbWVkaWFfYXR0cmlidXRlcyhidWZmLCBzaXplLCBzdCwgcGF5bG9hZF90eXBlLCBmbXQpOwogfQogCiBpbnQgYXZfc2RwX2NyZWF0ZShBVkZvcm1hdENvbnRleHQgKmFjW10sIGludCBuX2ZpbGVzLCBjaGFyICpidWYsIGludCBzaXplKQpAQCAtNzYyLDcgKzc4NCw3IEBACiAgICAgcG9ydCA9IDA7CiAgICAgdHRsID0gMDsKICAgICBpZiAobl9maWxlcyA9PSAxKSB7Ci0gICAgICAgIHBvcnQgPSBzZHBfZ2V0X2FkZHJlc3MoZHN0LCBzaXplb2YoZHN0KSwgJnR0bCwgYWNbMF0tPmZpbGVuYW1lKTsKKyAgICAgICAgcG9ydCA9IHNkcF9nZXRfYWRkcmVzcyhkc3QsIHNpemVvZihkc3QpLCAmdHRsLCBhY1swXS0+dXJsID8gYWNbMF0tPnVybCA6ICIiKTsKICAgICAgICAgaXNfbXVsdGljYXN0ID0gcmVzb2x2ZV9kZXN0aW5hdGlvbihkc3QsIHNpemVvZihkc3QpLCBkc3RfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZHN0X3R5cGUpKTsKICAgICAgICAgaWYgKCFpc19tdWx0aWNhc3QpCkBAIC03ODIsNyArODA0LDcgQEAKICAgICBkc3RbMF0gPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBuX2ZpbGVzOyBpKyspIHsKICAgICAgICAgaWYgKG5fZmlsZXMgIT0gMSkgewotICAgICAgICAgICAgcG9ydCA9IHNkcF9nZXRfYWRkcmVzcyhkc3QsIHNpemVvZihkc3QpLCAmdHRsLCBhY1tpXS0+ZmlsZW5hbWUpOworICAgICAgICAgICAgcG9ydCA9IHNkcF9nZXRfYWRkcmVzcyhkc3QsIHNpemVvZihkc3QpLCAmdHRsLCBhY1tpXS0+dXJsID8gYWNbaV0tPnVybCA6ICIiKTsKICAgICAgICAgICAgIGlzX211bHRpY2FzdCA9IHJlc29sdmVfZGVzdGluYXRpb24oZHN0LCBzaXplb2YoZHN0KSwgZHN0X3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkc3RfdHlwZSkpOwogICAgICAgICAgICAgaWYgKCFpc19tdWx0aWNhc3QpCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zZHIyLmMgYi9saWJhdmZvcm1hdC9zZHIyLmMKaW5kZXggZWRiNDU0Yy4uYzk5NTMzMyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc2RyMi5jCisrKyBiL2xpYmF2Zm9ybWF0L3NkcjIuYwpAQCAtNDcsMTYgKzQ3LDE2IEBACiAKICAgICBhdmlvX3NraXAocy0+cGIsIDIwKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgYXZpb19ybDMyKHMtPnBiKSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9IMjY0OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfSDI2NDsKICAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwogCi0gICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSAxOwotICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKLSAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IDE7CisgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA4MDAwOworICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgODAwMCk7CiAKICAgICBhdmlvX3NlZWsocy0+cGIsIEZJUlNULCBTRUVLX1NFVCk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zZHNkZWMuYyBiL2xpYmF2Zm9ybWF0L3Nkc2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MWJiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC9zZHNkZWMuYwpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIE1JREkgU2FtcGxlIER1bXAgU3RhbmRhcmQgZm9ybWF0IGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFNEU0NvbnRleHQgeworICAgIHVpbnQ4X3QgZGF0YVsxMjBdOworICAgIGludCBiaXRfZGVwdGg7CisgICAgaW50IHNpemU7CisgICAgdm9pZCAoKnJlYWRfYmxvY2spKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDMyX3QgKmRzdCk7Cit9IFNEU0NvbnRleHQ7CisKK3N0YXRpYyBpbnQgc2RzX3Byb2JlKEFWUHJvYmVEYXRhICpwKQoreworICAgIGlmIChBVl9SQjMyKHAtPmJ1ZikgPT0gMHhGMDdFMDAwMSAmJiBwLT5idWZbMjBdID09IDB4RjcgJiYKKyAgICAgICAgcC0+YnVmWzZdID49IDggJiYgcC0+YnVmWzZdIDw9IDI4KQorICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ5dGUyX3JlYWQoY29uc3QgdWludDhfdCAqc3JjLCB1aW50MzJfdCAqZHN0KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyMDsgaSArPSAyKSB7CisgICAgICAgIHVuc2lnbmVkIHNhbXBsZSA9IChzcmNbaSArIDBdIDw8IDI1KSArIChzcmNbaSArIDFdIDw8IDE4KTsKKworICAgICAgICBkc3RbaSAvIDJdID0gc2FtcGxlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgYnl0ZTNfcmVhZChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQzMl90ICpkc3QpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTIwOyBpICs9IDMpIHsKKyAgICAgICAgdW5zaWduZWQgc2FtcGxlOworCisgICAgICAgIHNhbXBsZSA9IChzcmNbaSArIDBdIDw8IDI1KSB8IChzcmNbaSArIDFdIDw8IDE4KSB8IChzcmNbaSArIDJdIDw8IDExKTsKKyAgICAgICAgZHN0W2kgLyAzXSA9IHNhbXBsZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGJ5dGU0X3JlYWQoY29uc3QgdWludDhfdCAqc3JjLCB1aW50MzJfdCAqZHN0KQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEyMDsgaSArPSA0KSB7CisgICAgICAgIHVuc2lnbmVkIHNhbXBsZTsKKworICAgICAgICBzYW1wbGUgPSAoc3JjW2kgKyAwXSA8PCAyNSkgfCAoc3JjW2kgKyAxXSA8PCAxOCkgfCAoc3JjW2kgKyAyXSA8PCAxMSkgfCAoc3JjW2kgKyAzXSA8PCA0KTsKKyAgICAgICAgZHN0W2kgLyA0XSA9IHNhbXBsZTsKKyAgICB9Cit9CisKKyNkZWZpbmUgU0RTXzNCWVRFX1RPX0lOVF9ERUNPREUoeCkgKCgoeCkgJiAweDdGKSB8ICgoKHgpICYgMHg3RjAwKSA+PiAxKSB8ICgoKHgpICYgMHg3RjAwMDApID4+IDIpKQorCitzdGF0aWMgaW50IHNkc19yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmN0eCkKK3sKKyAgICBTRFNDb250ZXh0ICpzID0gY3R4LT5wcml2X2RhdGE7CisgICAgdW5zaWduZWQgc2FtcGxlX3BlcmlvZDsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBjdHgtPnBiOworICAgIEFWU3RyZWFtICpzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBhdmlvX3NraXAocGIsIDQpOworICAgIGF2aW9fc2tpcChwYiwgMik7CisKKyAgICBzLT5iaXRfZGVwdGggPSBhdmlvX3I4KHBiKTsKKyAgICBpZiAocy0+Yml0X2RlcHRoIDwgOCB8fCBzLT5iaXRfZGVwdGggPiAyOCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBpZiAocy0+Yml0X2RlcHRoIDwgMTQpIHsKKyAgICAgICAgcy0+cmVhZF9ibG9jayA9IGJ5dGUyX3JlYWQ7CisgICAgICAgIHMtPnNpemUgPSA2MCAqIDQ7CisgICAgfSBlbHNlIGlmIChzLT5iaXRfZGVwdGggPCAyMSkgeworICAgICAgICBzLT5yZWFkX2Jsb2NrID0gYnl0ZTNfcmVhZDsKKyAgICAgICAgcy0+c2l6ZSA9IDQwICogNDsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5yZWFkX2Jsb2NrID0gYnl0ZTRfcmVhZDsKKyAgICAgICAgcy0+c2l6ZSA9IDMwICogNDsKKyAgICB9CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VMzJMRTsKKworICAgIHNhbXBsZV9wZXJpb2QgPSBhdmlvX3JsMjQocGIpOworICAgIHNhbXBsZV9wZXJpb2QgPSBTRFNfM0JZVEVfVE9fSU5UX0RFQ09ERShzYW1wbGVfcGVyaW9kKTsKKyAgICBhdmlvX3NraXAocGIsIDExKTsKKworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gc2FtcGxlX3BlcmlvZCA/IDEwMDAwMDAwMDAgLyBzYW1wbGVfcGVyaW9kIDogMTYwMDA7CisgICAgc3QtPmR1cmF0aW9uID0gKGF2aW9fc2l6ZShwYikgLSAyMSkgLyAoMTI3KSAqIHMtPnNpemUgLyA0OworCisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RzX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqY3R4LCBBVlBhY2tldCAqcGt0KQoreworICAgIFNEU0NvbnRleHQgKnMgPSBjdHgtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBjdHgtPnBiOworICAgIGludDY0X3QgcG9zOworICAgIGludCByZXQ7CisKKyAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgcG9zID0gYXZpb190ZWxsKHBiKTsKKyAgICBpZiAoYXZpb19yYjE2KHBiKSAhPSAweEYwN0UpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIGF2aW9fc2tpcChwYiwgMyk7CisKKyAgICByZXQgPSBhdl9uZXdfcGFja2V0KHBrdCwgcy0+c2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBhdmlvX3JlYWQocGIsIHMtPmRhdGEsIDEyMCk7CisKKyAgICBzLT5yZWFkX2Jsb2NrKHMtPmRhdGEsICh1aW50MzJfdCAqKXBrdC0+ZGF0YSk7CisKKyAgICBhdmlvX3NraXAocGIsIDEpOyAvLyBjaGVja3N1bQorICAgIGlmIChhdmlvX3I4KHBiKSAhPSAweEY3KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgIHBrdC0+ZmxhZ3MgJj0gfkFWX1BLVF9GTEFHX0NPUlJVUFQ7CisgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOworICAgIHBrdC0+cG9zID0gcG9zOworCisgICAgcmV0dXJuIHJldDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zZHNfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2RzIiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiTUlESSBTYW1wbGUgRHVtcCBTdGFuZGFyZCIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTRFNDb250ZXh0KSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzZHNfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc2RzX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IHNkc19yZWFkX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAic2RzIiwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9HRU5FUklDX0lOREVYLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3NkeGRlYy5jIGIvbGliYXZmb3JtYXQvc2R4ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlN2E0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L3NkeGRlYy5jCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBTRFggZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJwY20uaCIKKworc3RhdGljIGludCBzZHhfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaWYgKEFWX1JCMzIocC0+YnVmKSA9PSBBVl9SQjMyKCJTRFg6IikpCisgICAgICAgIHJldHVybiBBVlBST0JFX1NDT1JFX0VYVEVOU0lPTjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZHhfcmVhZF9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIEFWU3RyZWFtICpzdDsKKyAgICBpbnQgZGVwdGgsIGxlbmd0aDsKKworICAgIGF2aW9fc2tpcChzLT5wYiwgNCk7CisgICAgd2hpbGUgKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CisgICAgICAgIGlmIChhdmlvX3I4KHMtPnBiKSA9PSAweDFhKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChhdmlvX3I4KHMtPnBiKSAhPSAxKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBsZW5ndGggPSBhdmlvX3I4KHMtPnBiKTsKKyAgICBhdmlvX3NraXAocy0+cGIsIGxlbmd0aCk7CisgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKKyAgICBkZXB0aCA9IGF2aW9fcjgocy0+cGIpOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IDE7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgc3dpdGNoIChkZXB0aCkgeworICAgIGNhc2UgODoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VMTZMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyNDoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VMjRMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VMzJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorICAgIGF2aW9fc2tpcChzLT5wYiwgMTYpOworICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBkZXB0aCAvIDg7CisKKyAgICByZXR1cm4gMDsKK30KKworQVZJbnB1dEZvcm1hdCBmZl9zZHhfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAic2R4IiwKKyAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiU2FtcGxlIER1bXAgZVhjaGFuZ2UiKSwKKyAgICAucmVhZF9wcm9iZSAgICAgPSBzZHhfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gc2R4X3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgICA9IGZmX3BjbV9yZWFkX3BhY2tldCwKKyAgICAucmVhZF9zZWVrICAgICAgPSBmZl9wY21fcmVhZF9zZWVrLAorICAgIC5leHRlbnNpb25zICAgICA9ICJzZHgiLAorICAgIC5mbGFncyAgICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVgsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc2Vlay10ZXN0LmMgYi9saWJhdmZvcm1hdC9zZWVrLXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkMDZkYi4uMDAwMDAwMAotLS0gYS9saWJhdmZvcm1hdC9zZWVrLXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAotICogQ29weXJpZ2h0IChjKSAyMDA3IE1pY2hhZWwgTmllZGVybWF5ZXIKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21hdGhlbWF0aWNzLmgiCi0jaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKLQotc3RhdGljIGNoYXIgYnVmZmVyWzIwXTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnJldF9zdHIoaW50IHYpCi17Ci0gICAgc3dpdGNoICh2KSB7Ci0gICAgY2FzZSBBVkVSUk9SX0VPRjogICAgIHJldHVybiAiLUVPRiI7Ci0gICAgY2FzZSBBVkVSUk9SKEVJTyk6ICAgIHJldHVybiAiLUVJTyI7Ci0gICAgY2FzZSBBVkVSUk9SKEVOT01FTSk6IHJldHVybiAiLUVOT01FTSI7Ci0gICAgY2FzZSBBVkVSUk9SKEVJTlZBTCk6IHJldHVybiAiLUVJTlZBTCI7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiUyZCIsIHYpOwotICAgICAgICByZXR1cm4gYnVmZmVyOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgdHNfc3RyKGNoYXIgYnVmZmVyWzYwXSwgaW50NjRfdCB0cywgQVZSYXRpb25hbCBiYXNlKQotewotICAgIGlmICh0cyA9PSBBVl9OT1BUU19WQUxVRSkgewotICAgICAgICBzdHJjcHkoYnVmZmVyLCAiIE5PUFRTICAgIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdHM9IGF2X3Jlc2NhbGVfcSh0cywgYmFzZSwgKEFWUmF0aW9uYWwpezEsIDEwMDAwMDB9KTsKLSAgICBzbnByaW50ZihidWZmZXIsIDYwLCAiJWMlIlBSSWQ2NCIuJTA2IlBSSWQ2NCIiLCB0czwwID8gJy0nIDogJyAnLCBGRkFCUyh0cykvMTAwMDAwMCwgRkZBQlModHMpJTEwMDAwMDApOwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgQVZGb3JtYXRDb250ZXh0ICppYyA9IGF2Zm9ybWF0X2FsbG9jX2NvbnRleHQoKTsKLSAgICBpbnQgaSwgcmV0LCBzdHJlYW1faWQ7Ci0gICAgaW50IGo7Ci0gICAgaW50NjRfdCB0aW1lc3RhbXA7Ci0gICAgQVZEaWN0aW9uYXJ5ICpmb3JtYXRfb3B0cyA9IE5VTEw7Ci0gICAgaW50NjRfdCBzZWVrZmlyc3QgPSBBVl9OT1BUU19WQUxVRTsKLSAgICBpbnQgZmlyc3RiYWNrPTA7Ci0gICAgaW50IGZyYW1lX2NvdW50ID0gMTsKLSAgICBpbnQgZHVyYXRpb24gPSA0OwotCi0gICAgZm9yKGk9MjsgaTxhcmdjOyBpKz0yKXsKLSAgICAgICAgaWYgICAgICAgKCFzdHJjbXAoYXJndltpXSwgIi1zZWVrZm9ydyIpKXsKLSAgICAgICAgICAgIHNlZWtmaXJzdCA9IGF0b2koYXJndltpKzFdKTsKLSAgICAgICAgfSBlbHNlIGlmKCFzdHJjbXAoYXJndltpXSwgIi1zZWVrYmFjayIpKXsKLSAgICAgICAgICAgIHNlZWtmaXJzdCA9IGF0b2koYXJndltpKzFdKTsKLSAgICAgICAgICAgIGZpcnN0YmFjayA9IDE7Ci0gICAgICAgIH0gZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItZnJhbWVzIikpewotICAgICAgICAgICAgZnJhbWVfY291bnQgPSBhdG9pKGFyZ3ZbaSsxXSk7Ci0gICAgICAgIH0gZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItZHVyYXRpb24iKSl7Ci0gICAgICAgICAgICBkdXJhdGlvbiA9IGF0b2koYXJndltpKzFdKTsKLSAgICAgICAgfSBlbHNlIGlmKCFzdHJjbXAoYXJndltpXSwgIi1mYXN0c2VlayIpKSB7Ci0gICAgICAgICAgICBpZiAoYXRvaShhcmd2W2krMV0pKSB7Ci0gICAgICAgICAgICAgICAgaWMtPmZsYWdzIHw9IEFWRk1UX0ZMQUdfRkFTVF9TRUVLOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXJnYyA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBhdl9kaWN0X3NldCgmZm9ybWF0X29wdHMsICJjaGFubmVscyIsICIxIiwgMCk7Ci0gICAgYXZfZGljdF9zZXQoJmZvcm1hdF9vcHRzLCAic2FtcGxlX3JhdGUiLCAiMjIwNTAiLCAwKTsKLQotICAgIC8qIGluaXRpYWxpemUgbGliYXZjb2RlYywgYW5kIHJlZ2lzdGVyIGFsbCBjb2RlY3MgYW5kIGZvcm1hdHMgKi8KLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQotICAgIGlmIChhcmdjIDwgMikgewotICAgICAgICBwcmludGYoInVzYWdlOiAlcyBpbnB1dF9maWxlXG4iCi0gICAgICAgICAgICAgICAiXG4iLCBhcmd2WzBdKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgZmlsZW5hbWUgPSBhcmd2WzFdOwotCi0gICAgcmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmaWMsIGZpbGVuYW1lLCBOVUxMLCAmZm9ybWF0X29wdHMpOwotICAgIGF2X2RpY3RfZnJlZSgmZm9ybWF0X29wdHMpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2Fubm90IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgcmV0ID0gYXZmb3JtYXRfZmluZF9zdHJlYW1faW5mbyhpYywgTlVMTCk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogY291bGQgbm90IGZpbmQgY29kZWMgcGFyYW1ldGVyc1xuIiwgZmlsZW5hbWUpOwotICAgICAgICByZXR1cm4gMTsKLSAgICB9Ci0KLSAgICBpZihzZWVrZmlyc3QgIT0gQVZfTk9QVFNfVkFMVUUpewotICAgICAgICBpZihmaXJzdGJhY2spICAgYXZmb3JtYXRfc2Vla19maWxlKGljLCAtMSwgSU5UNjRfTUlOLCBzZWVrZmlyc3QsIHNlZWtmaXJzdCwgMCk7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICBhdmZvcm1hdF9zZWVrX2ZpbGUoaWMsIC0xLCBzZWVrZmlyc3QsIHNlZWtmaXJzdCwgSU5UNjRfTUFYLCAwKTsKLSAgICB9Ci0gICAgZm9yKGk9MDsgOyBpKyspewotICAgICAgICBBVlBhY2tldCBwa3QgPSB7IDAgfTsKLSAgICAgICAgQVZTdHJlYW0gKmF2X3VuaW5pdChzdCk7Ci0gICAgICAgIGNoYXIgdHNfYnVmWzYwXTsKLQotICAgICAgICBpZihyZXQ+PTApewotICAgICAgICAgICAgZm9yKGo9MDsgajxmcmFtZV9jb3VudDsgaisrKSB7Ci0gICAgICAgICAgICByZXQ9IGF2X3JlYWRfZnJhbWUoaWMsICZwa3QpOwotICAgICAgICAgICAgaWYocmV0Pj0wKXsKLSAgICAgICAgICAgICAgICBjaGFyIGR0c19idWZbNjBdOwotICAgICAgICAgICAgICAgIHN0PSBpYy0+c3RyZWFtc1twa3Quc3RyZWFtX2luZGV4XTsKLSAgICAgICAgICAgICAgICB0c19zdHIoZHRzX2J1ZiwgcGt0LmR0cywgc3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgICAgICAgICAgdHNfc3RyKHRzX2J1ZiwgIHBrdC5wdHMsIHN0LT50aW1lX2Jhc2UpOwotICAgICAgICAgICAgICAgIHByaW50ZigicmV0OiUtMTBzIHN0OiUyZCBmbGFnczolZCBkdHM6JXMgcHRzOiVzIHBvczolNyIgUFJJZDY0ICIgc2l6ZTolNmQiLCByZXRfc3RyKHJldCksIHBrdC5zdHJlYW1faW5kZXgsIHBrdC5mbGFncywgZHRzX2J1ZiwgdHNfYnVmLCBwa3QucG9zLCBwa3Quc2l6ZSk7Ci0gICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJyZXQ6JXMiLCByZXRfc3RyKHJldCkpOyAvLyBuZWNlc3NhcnkgdG8gYXZvaWQgdHJhaWxpbmcgd2hpdGVzcGFjZQotICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoaT4yNSkgYnJlYWs7Ci0KLSAgICAgICAgc3RyZWFtX2lkPSAoaT4+MSklKGljLT5uYl9zdHJlYW1zKzEpIC0gMTsKLSAgICAgICAgdGltZXN0YW1wPSAoaSoxOTM2Mjg5NDE2N0xMKSAlIChkdXJhdGlvbipBVl9USU1FX0JBU0UpIC0gQVZfVElNRV9CQVNFOwotICAgICAgICBpZihzdHJlYW1faWQ+PTApewotICAgICAgICAgICAgc3Q9IGljLT5zdHJlYW1zW3N0cmVhbV9pZF07Ci0gICAgICAgICAgICB0aW1lc3RhbXA9IGF2X3Jlc2NhbGVfcSh0aW1lc3RhbXAsIEFWX1RJTUVfQkFTRV9RLCBzdC0+dGltZV9iYXNlKTsKLSAgICAgICAgfQotICAgICAgICAvL0ZJWE1FIGZ1bGx5IHRlc3QgdGhlIG5ldyBzZWVrIEFQSQotICAgICAgICBpZihpJjEpIHJldCA9IGF2Zm9ybWF0X3NlZWtfZmlsZShpYywgc3RyZWFtX2lkLCBJTlQ2NF9NSU4sIHRpbWVzdGFtcCwgdGltZXN0YW1wLCAwKTsKLSAgICAgICAgZWxzZSAgICByZXQgPSBhdmZvcm1hdF9zZWVrX2ZpbGUoaWMsIHN0cmVhbV9pZCwgdGltZXN0YW1wLCB0aW1lc3RhbXAsIElOVDY0X01BWCwgMCk7Ci0gICAgICAgIHRzX3N0cih0c19idWYsIHRpbWVzdGFtcCwgc3RyZWFtX2lkIDwgMCA/IEFWX1RJTUVfQkFTRV9RIDogc3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgIHByaW50ZigicmV0OiUtMTBzIHN0OiUyZCBmbGFnczolZCAgdHM6JXNcbiIsIHJldF9zdHIocmV0KSwgc3RyZWFtX2lkLCBpJjEsIHRzX2J1Zik7Ci0gICAgfQotCi0gICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmljKTsKLQotICAgIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc2VnYWZpbG0uYyBiL2xpYmF2Zm9ybWF0L3NlZ2FmaWxtLmMKaW5kZXggOTRiMzc3Mi4uYjBjNmM0MSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc2VnYWZpbG0uYworKysgYi9saWJhdmZvcm1hdC9zZWdhZmlsbS5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFNlZ2EgRklMTSBGb3JtYXQgKENQSykgRGVtdXhlcgotICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgcHJvamVjdAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0xNTAsMTUgKzE1MCwxNSBAQAogICAgICAgICBpZiAoIXN0KQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgZmlsbS0+dmlkZW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmaWxtLT52aWRlb190eXBlOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KLSAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IEFWX1JCMzIoJnNjcmF0Y2hbMTZdKTsKLSAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBBVl9SQjMyKCZzY3JhdGNoWzEyXSk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZpbG0tPnZpZGVvX3R5cGU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLworICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoID0gQVZfUkIzMigmc2NyYXRjaFsxNl0pOworICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IEFWX1JCMzIoJnNjcmF0Y2hbMTJdKTsKIAogICAgICAgICBpZiAoZmlsbS0+dmlkZW9fdHlwZSA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTykgewogICAgICAgICAgICAgaWYgKHNjcmF0Y2hbMjBdID09IDI0KSB7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5waXhfZm10ID0gQVZfUElYX0ZNVF9SR0IyNDsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IEFWX1BJWF9GTVRfUkdCMjQ7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJyYXcgdmlkZW8gaXMgdXNpbmcgdW5oYW5kbGVkICVkYnBwXG4iLCBzY3JhdGNoWzIwXSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTcxLDI0ICsxNzEsMjQgQEAKICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGZpbG0tPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmlsbS0+YXVkaW9fdHlwZTsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAxOwotICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gZmlsbS0+YXVkaW9fY2hhbm5lbHM7Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBmaWxtLT5hdWRpb19zYW1wbGVyYXRlOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBmaWxtLT5hdWRpb190eXBlOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBmaWxtLT5hdWRpb19jaGFubmVsczsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGZpbG0tPmF1ZGlvX3NhbXBsZXJhdGU7CiAKICAgICAgICAgaWYgKGZpbG0tPmF1ZGlvX3R5cGUgPT0gQVZfQ09ERUNfSURfQURQQ01fQURYKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE4ICogOCAvIDMyOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiAxODsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTggKiA4IC8gMzI7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIDE4OwogICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGZpbG0tPmF1ZGlvX2JpdHM7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5jaGFubmVscyAqCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgLyA4OworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBmaWxtLT5hdWRpb19iaXRzOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKgorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gODsKICAgICAgICAgfQogCi0gICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOwogICAgIH0KIAogICAgIC8qIGxvYWQgdGhlIHNhbXBsZSB0YWJsZSAqLwpAQCAtMjA2LDcgKzIwNiw3IEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIGZpbG0tPmJhc2VfY2xvY2spOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgZmlsbS0+YXVkaW9fc2FtcGxlcmF0ZSk7CkBAIC0yMzksNyArMjM5LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGZpbG0tPnNhbXBsZV90YWJsZVtpXS5zdHJlYW0gPSBmaWxtLT52aWRlb19zdHJlYW1faW5kZXg7CiAgICAgICAgICAgICBmaWxtLT5zYW1wbGVfdGFibGVbaV0ucHRzID0gQVZfUkIzMigmc2NyYXRjaFs4XSkgJiAweDdGRkZGRkZGOwotICAgICAgICAgICAgZmlsbS0+c2FtcGxlX3RhYmxlW2ldLmtleWZyYW1lID0gKHNjcmF0Y2hbOF0gJiAweDgwKSA/IDAgOiAxOworICAgICAgICAgICAgZmlsbS0+c2FtcGxlX3RhYmxlW2ldLmtleWZyYW1lID0gKHNjcmF0Y2hbOF0gJiAweDgwKSA/IDAgOiBBVklOREVYX0tFWUZSQU1FOwogICAgICAgICAgICAgdmlkZW9fZnJhbWVfY291bnRlcisrOwogICAgICAgICAgICAgaWYgKGZpbG0tPnZpZGVvX3R5cGUpCiAgICAgICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHMtPnN0cmVhbXNbZmlsbS0+dmlkZW9fc3RyZWFtX2luZGV4XSwKQEAgLTI3MCw2ICsyNzAsOCBAQAogICAgIEZpbG1EZW11eENvbnRleHQgKmZpbG0gPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgZmlsbV9zYW1wbGUgKnNhbXBsZTsKKyAgICBmaWxtX3NhbXBsZSAqbmV4dF9zYW1wbGUgPSBOVUxMOworICAgIGludCBuZXh0X3NhbXBsZV9pZDsKICAgICBpbnQgcmV0ID0gMDsKIAogICAgIGlmIChmaWxtLT5jdXJyZW50X3NhbXBsZSA+PSBmaWxtLT5zYW1wbGVfY291bnQpCkBAIC0yNzcsNiArMjc5LDIwIEBACiAKICAgICBzYW1wbGUgPSAmZmlsbS0+c2FtcGxlX3RhYmxlW2ZpbG0tPmN1cnJlbnRfc2FtcGxlXTsKIAorICAgIC8qIEZpbmQgdGhlIG5leHQgc2FtcGxlIGZyb20gdGhlIHNhbWUgc3RyZWFtLCBhc3N1bWluZyB0aGVyZSBpcyBvbmU7CisgICAgICogdGhpcyBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgZHVyYXRpb24gYmVsb3cgKi8KKyAgICBuZXh0X3NhbXBsZV9pZCA9IGZpbG0tPmN1cnJlbnRfc2FtcGxlICsgMTsKKyAgICB3aGlsZSAobmV4dF9zYW1wbGUgPT0gTlVMTCkgeworICAgICAgICBpZiAobmV4dF9zYW1wbGVfaWQgPj0gZmlsbS0+c2FtcGxlX2NvdW50KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbmV4dF9zYW1wbGUgPSAmZmlsbS0+c2FtcGxlX3RhYmxlW25leHRfc2FtcGxlX2lkXTsKKyAgICAgICAgaWYgKG5leHRfc2FtcGxlLT5zdHJlYW0gIT0gc2FtcGxlLT5zdHJlYW0pIHsKKyAgICAgICAgICAgIG5leHRfc2FtcGxlID0gTlVMTDsKKyAgICAgICAgICAgIG5leHRfc2FtcGxlX2lkKys7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiBwb3NpdGlvbiB0aGUgc3RyZWFtICh3aWxsIHByb2JhYmx5IGJlIHRoZXJlIGFueXdheSkgKi8KICAgICBhdmlvX3NlZWsocGIsIHNhbXBsZS0+c2FtcGxlX29mZnNldCwgU0VFS19TRVQpOwogCkBAIC0yODUsNyArMzAxLDExIEBACiAgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKIAogICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gc2FtcGxlLT5zdHJlYW07CisgICAgcGt0LT5kdHMgPSBzYW1wbGUtPnB0czsKICAgICBwa3QtPnB0cyA9IHNhbXBsZS0+cHRzOworICAgIHBrdC0+ZmxhZ3MgfD0gc2FtcGxlLT5rZXlmcmFtZSA/IEFWX1BLVF9GTEFHX0tFWSA6IDA7CisgICAgaWYgKG5leHRfc2FtcGxlICE9IE5VTEwpCisgICAgICAgIHBrdC0+ZHVyYXRpb24gPSBuZXh0X3NhbXBsZS0+cHRzIC0gc2FtcGxlLT5wdHM7CiAKICAgICBmaWxtLT5jdXJyZW50X3NhbXBsZSsrOwogCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zZWdhZmlsbWVuYy5jIGIvbGliYXZmb3JtYXQvc2VnYWZpbG1lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjBkN2U2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvc2VnYWZpbG1lbmMuYwpAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIFNlZ2EgRklMTSBGb3JtYXQgKENQSykgTXV4ZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxOCBNaXN0eSBEZSBNZW8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoqCisgKiBAZmlsZQorICogU2VnYSBGSUxNICguY3BrKSBmaWxlIG11eGVyCisgKiBAYXV0aG9yIE1pc3R5IERlIE1lbyA8bWlzdHlAYnJldy5zaD4KKyAqCisgKiBAc2VlIEZvciBtb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgU2VnYSBGSUxNIGZpbGUgZm9ybWF0LCB2aXNpdDoKKyAqICAgaHR0cDovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9U2VnYV9GSUxNCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorCit0eXBlZGVmIHN0cnVjdCBGSUxNUGFja2V0IHsKKyAgICBpbnQgYXVkaW87CisgICAgaW50IGtleWZyYW1lOworICAgIGludDMyX3QgcHRzOworICAgIGludDMyX3QgZHVyYXRpb247CisgICAgaW50MzJfdCBzaXplOworICAgIGludDMyX3QgaW5kZXg7CisgICAgc3RydWN0IEZJTE1QYWNrZXQgKm5leHQ7Cit9IEZJTE1QYWNrZXQ7CisKK3R5cGVkZWYgc3RydWN0IEZJTE1PdXRwdXRDb250ZXh0IHsKKyAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKKyAgICBpbnQgYXVkaW9faW5kZXg7CisgICAgaW50IHZpZGVvX2luZGV4OworICAgIGludDY0X3Qgc3RhYl9wb3M7CisgICAgRklMTVBhY2tldCAqc3RhcnQ7CisgICAgRklMTVBhY2tldCAqbGFzdDsKKyAgICBpbnQ2NF90IHBhY2tldF9jb3VudDsKK30gRklMTU91dHB1dENvbnRleHQ7CisKK3N0YXRpYyBpbnQgZmlsbV93cml0ZV9wYWNrZXRfdG9faGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqZm9ybWF0X2NvbnRleHQsIEZJTE1QYWNrZXQgKnBrdCkKK3sKKyAgICBBVklPQ29udGV4dCAqcGIgPSBmb3JtYXRfY29udGV4dC0+cGI7CisgICAgLyogVGhlIGJpdHMgaW4gdGhlc2UgdHdvIDMyLWJpdCBpbnRlZ2VycyBjb250YWluIGluZm8gYWJvdXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc2FtcGxlICovCisgICAgaW50MzJfdCBpbmZvMSA9IDA7CisgICAgaW50MzJfdCBpbmZvMiA9IDA7CisKKyAgICBpZiAocGt0LT5hdWRpbykgeworICAgICAgICAvKiBBbHdheXMgdGhlIHNhbWUsIGNhcnJpZXMgbm8gbW9yZSBpbmZvcm1hdGlvbiB0aGFuICJ0aGlzIGlzIGF1ZGlvIiAqLworICAgICAgICBpbmZvMSA9IDB4RkZGRkZGRkY7CisgICAgICAgIGluZm8yID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbmZvMSA9IHBrdC0+cHRzOworICAgICAgICBpbmZvMiA9IHBrdC0+ZHVyYXRpb247CisgICAgICAgIC8qIFRoZSB0b3AgYml0IGJlaW5nIHNldCBpbmRpY2F0ZXMgYSBrZXkgZnJhbWUgKi8KKyAgICAgICAgaWYgKHBrdC0+a2V5ZnJhbWUpCisgICAgICAgICAgICBpbmZvMSB8PSAoMSA8PCAzMSk7CisgICAgfQorCisgICAgLyogV3JpdGUgdGhlIDE2LWJ5dGUgc2FtcGxlIGluZm8gcGFja2V0IHRvIHRoZSBTVEFCIGNodW5rIGluIHRoZSBoZWFkZXIgKi8KKyAgICBhdmlvX3diMzIocGIsIHBrdC0+aW5kZXgpOworICAgIGF2aW9fd2IzMihwYiwgcGt0LT5zaXplKTsKKyAgICBhdmlvX3diMzIocGIsIGluZm8xKTsKKyAgICBhdmlvX3diMzIocGIsIGluZm8yKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbG1fd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqZm9ybWF0X2NvbnRleHQsIEFWUGFja2V0ICpwa3QpCit7CisgICAgRklMTVBhY2tldCAqbWV0YWRhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gZm9ybWF0X2NvbnRleHQtPnBiOworICAgIEZJTE1PdXRwdXRDb250ZXh0ICpmaWxtID0gZm9ybWF0X2NvbnRleHQtPnByaXZfZGF0YTsKKyAgICBpbnQgZW5jb2RlZF9idWZfc2l6ZSA9IDA7CisgICAgZW51bSBBVkNvZGVjSUQgY29kZWNfaWQ7CisKKyAgICAvKiBUcmFjayB0aGUgbWV0YWRhdGEgdXNlZCB0byB3cml0ZSB0aGUgaGVhZGVyIGFuZCBhZGQgaXQgdG8gdGhlIGxpbmtlZCBsaXN0ICovCisgICAgbWV0YWRhdGEgPSBhdl9tYWxsb2N6KHNpemVvZihGSUxNUGFja2V0KSk7CisgICAgaWYgKCFtZXRhZGF0YSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtZXRhZGF0YS0+YXVkaW8gPSBwa3QtPnN0cmVhbV9pbmRleCA9PSBmaWxtLT5hdWRpb19pbmRleDsKKyAgICBtZXRhZGF0YS0+a2V5ZnJhbWUgPSBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZOworICAgIG1ldGFkYXRhLT5wdHMgPSBwa3QtPnB0czsKKyAgICBtZXRhZGF0YS0+ZHVyYXRpb24gPSBwa3QtPmR1cmF0aW9uOworICAgIG1ldGFkYXRhLT5zaXplID0gcGt0LT5zaXplOworICAgIGlmIChmaWxtLT5sYXN0ID09IE5VTEwpIHsKKyAgICAgICAgbWV0YWRhdGEtPmluZGV4ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtZXRhZGF0YS0+aW5kZXggPSBmaWxtLT5sYXN0LT5pbmRleCArIGZpbG0tPmxhc3QtPnNpemU7CisgICAgICAgIGZpbG0tPmxhc3QtPm5leHQgPSBtZXRhZGF0YTsKKyAgICB9CisgICAgbWV0YWRhdGEtPm5leHQgPSBOVUxMOworICAgIGlmIChmaWxtLT5zdGFydCA9PSBOVUxMKQorICAgICAgICBmaWxtLT5zdGFydCA9IG1ldGFkYXRhOworICAgIGZpbG0tPnBhY2tldF9jb3VudCsrOworICAgIGZpbG0tPmxhc3QgPSBtZXRhZGF0YTsKKworICAgIGNvZGVjX2lkID0gZm9ybWF0X2NvbnRleHQtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlY3Bhci0+Y29kZWNfaWQ7CisKKyAgICAvKiBTZWdhIENpbmVwYWsgaGFzIGFuIGV4dHJhIHR3by1ieXRlIGhlYWRlcjsgd3JpdGUgZHVtbXkgZGF0YSB0aGVyZSwKKyAgICAgKiB0aGVuIGFkanVzdCB0aGUgY3ZpZCBoZWFkZXIgdG8gYWNjb21tb2RhdGUgZm9yIHRoZSBleHRyYSBzaXplICovCisgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0NJTkVQQUspIHsKKyAgICAgICAgZW5jb2RlZF9idWZfc2l6ZSA9IEFWX1JCMjQoJnBrdC0+ZGF0YVsxXSk7CisgICAgICAgIC8qIEFscmVhZHkgU2VnYSBDaW5lcGFrLCBzbyBubyBuZWVkIHRvIHJlZm9ybWF0IHRoZSBwYWNrZXRzICovCisgICAgICAgIGlmIChlbmNvZGVkX2J1Zl9zaXplICE9IHBrdC0+c2l6ZSAmJiAocGt0LT5zaXplICUgZW5jb2RlZF9idWZfc2l6ZSkgIT0gMCkgeworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdWludDhfdCBwYWRkaW5nWzJdID0gezAsIDB9OworICAgICAgICAgICAgLyogSW4gU2VnYSBDaW5lcGFrLCB0aGUgcmVwb3J0ZWQgc2l6ZSBpbiB0aGUgQ2luZXBhayBoZWFkZXIgaXMKKyAgICAgICAgICAgICAqIDggYnl0ZXMgdG9vIHNob3J0LiBIb3dldmVyLCB0aGUgc2l6ZSBpbiB0aGUgU1RBQiBzZWN0aW9uIG9mIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAqIGlzIGNvcnJlY3QsIHRha2luZyBpbnRvIGFjY291bnQgdGhlIGV4dHJhIHR3byBieXRlcy4gKi8KKyAgICAgICAgICAgIEFWX1dCMjQoJnBrdC0+ZGF0YVsxXSwgcGt0LT5zaXplIC0gOCArIDIpOworICAgICAgICAgICAgbWV0YWRhdGEtPnNpemUgKz0gMjsKKworICAgICAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCAxMCk7CisgICAgICAgICAgICBhdmlvX3dyaXRlKHBiLCBwYWRkaW5nLCAyKTsKKyAgICAgICAgICAgIGF2aW9fd3JpdGUocGIsICZwa3QtPmRhdGFbMTBdLCBwa3QtPnNpemUgLSAxMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBPdGhlciBmb3JtYXRzIGNhbiBqdXN0IGJlIHdyaXR0ZW4gYXMtaXMgKi8KKyAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9hdWRpb19jb2RlY19pZChlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3sKKyAgICAvKiAwIChQQ00pIGFuZCAyIChBRFgpIGFyZSB0aGUgb25seSBrbm93biB2YWx1ZXMgKi8KKyAgICBzd2l0Y2ggKGNvZGVjX2lkKSB7CisgICAgY2FzZSBBVl9DT0RFQ19JRF9QQ01fUzhfUExBTkFSOgorICAgIGNhc2UgQVZfQ09ERUNfSURfUENNX1MxNkJFX1BMQU5BUjoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfQ09ERUNfSURfQURQQ01fQURYOgorICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KK30KKworc3RhdGljIGludCBmaWxtX2luaXQoQVZGb3JtYXRDb250ZXh0ICpmb3JtYXRfY29udGV4dCkKK3sKKyAgICBBVlN0cmVhbSAqYXVkaW8gPSBOVUxMOworICAgIEZJTE1PdXRwdXRDb250ZXh0ICpmaWxtID0gZm9ybWF0X2NvbnRleHQtPnByaXZfZGF0YTsKKyAgICBmaWxtLT5hdWRpb19pbmRleCA9IC0xOworICAgIGZpbG0tPnZpZGVvX2luZGV4ID0gLTE7CisgICAgZmlsbS0+c3RhYl9wb3MgPSAwOworICAgIGZpbG0tPnBhY2tldF9jb3VudCA9IDA7CisgICAgZmlsbS0+c3RhcnQgPSBOVUxMOworICAgIGZpbG0tPmxhc3QgPSBOVUxMOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmb3JtYXRfY29udGV4dC0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIEFWU3RyZWFtICpzdCA9IGZvcm1hdF9jb250ZXh0LT5zdHJlYW1zW2ldOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICAgICAgaWYgKGZpbG0tPmF1ZGlvX2luZGV4ID4gLTEpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coZm9ybWF0X2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIlNlZ2EgRklMTSBhbGxvd3MgYSBtYXhpbXVtIG9mIG9uZSBhdWRpbyBzdHJlYW0uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmlsbS0+YXVkaW9faW5kZXggPSBpOworICAgICAgICAgICAgYXVkaW8gPSBzdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgICAgICBpZiAoZmlsbS0+dmlkZW9faW5kZXggPiAtMSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhmb3JtYXRfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiU2VnYSBGSUxNIGFsbG93cyBhIG1heGltdW0gb2Ygb25lIHZpZGVvIHN0cmVhbS5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaWxtLT52aWRlb19pbmRleCA9IGk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmlsbS0+dmlkZW9faW5kZXggPT0gLTEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhmb3JtYXRfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiTm8gdmlkZW8gc3RyZWFtIHByZXNlbnQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYXVkaW8gIT0gTlVMTCAmJiBnZXRfYXVkaW9fY29kZWNfaWQoYXVkaW8tPmNvZGVjcGFyLT5jb2RlY19pZCkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhmb3JtYXRfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiSW5jb21wYXRpYmxlIGF1ZGlvIHN0cmVhbSBmb3JtYXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaGlmdF9kYXRhKEFWRm9ybWF0Q29udGV4dCAqZm9ybWF0X2NvbnRleHQsIGludDY0X3Qgc2hpZnRfc2l6ZSkKK3sKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQ2NF90IHBvcywgcG9zX2VuZCA9IGF2aW9fdGVsbChmb3JtYXRfY29udGV4dC0+cGIpOworICAgIHVpbnQ4X3QgKmJ1ZiwgKnJlYWRfYnVmWzJdOworICAgIGludCByZWFkX2J1Zl9pZCA9IDA7CisgICAgaW50IHJlYWRfc2l6ZVsyXTsKKyAgICBBVklPQ29udGV4dCAqcmVhZF9wYjsKKworICAgIGJ1ZiA9IGF2X21hbGxvYyhzaGlmdF9zaXplICogMik7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgcmVhZF9idWZbMF0gPSBidWY7CisgICAgcmVhZF9idWZbMV0gPSBidWYgKyBzaGlmdF9zaXplOworCisgICAgLyogV3JpdGUgdGhlIGhlYWRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLCBzaGlmdGluZyBhbGwgY29udGVudCBhcyBuZWNlc3Nhcnk7CisgICAgICogYmFzZWQgb24gdGhlIGFwcHJvYWNoIHVzZWQgYnkgTU9WIGZhc3RzdGFydC4gKi8KKyAgICBhdmlvX2ZsdXNoKGZvcm1hdF9jb250ZXh0LT5wYik7CisgICAgcmV0ID0gZm9ybWF0X2NvbnRleHQtPmlvX29wZW4oZm9ybWF0X2NvbnRleHQsICZyZWFkX3BiLCBmb3JtYXRfY29udGV4dC0+dXJsLCBBVklPX0ZMQUdfUkVBRCwgTlVMTCk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGZvcm1hdF9jb250ZXh0LCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gcmUtb3BlbiAlcyBvdXRwdXQgZmlsZSB0byAiCisgICAgICAgICAgICAgICAid3JpdGUgdGhlIGhlYWRlclxuIiwgZm9ybWF0X2NvbnRleHQtPnVybCk7CisgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKiBtYXJrIHRoZSBlbmQgb2YgdGhlIHNoaWZ0IHRvIHVwIHRvIHRoZSBsYXN0IGRhdGEgd2Ugd3JvdGUsIGFuZCBnZXQgcmVhZHkKKyAgICAgKiBmb3Igd3JpdGluZyAqLworICAgIHBvc19lbmQgPSBhdmlvX3RlbGwoZm9ybWF0X2NvbnRleHQtPnBiKTsKKyAgICBhdmlvX3NlZWsoZm9ybWF0X2NvbnRleHQtPnBiLCBzaGlmdF9zaXplLCBTRUVLX1NFVCk7CisKKyAgICAvKiBzdGFydCByZWFkaW5nIGF0IHdoZXJlIHRoZSBuZXcgaGVhZGVyIHdpbGwgYmUgcGxhY2VkICovCisgICAgYXZpb19zZWVrKHJlYWRfcGIsIDAsIFNFRUtfU0VUKTsKKyAgICBwb3MgPSBhdmlvX3RlbGwocmVhZF9wYik7CisKKyNkZWZpbmUgUkVBRF9CTE9DSyBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWFkX3NpemVbcmVhZF9idWZfaWRdID0gYXZpb19yZWFkKHJlYWRfcGIsIHJlYWRfYnVmW3JlYWRfYnVmX2lkXSwgc2hpZnRfc2l6ZSk7ICBcCisgICAgcmVhZF9idWZfaWQgXj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgLyogc2hpZnQgZGF0YSBieSBjaHVuayBvZiBhdCBtb3N0IHNoaWZ0X3NpemUgKi8KKyAgICBSRUFEX0JMT0NLOworICAgIGRvIHsKKyAgICAgICAgaW50IG47CisgICAgICAgIFJFQURfQkxPQ0s7CisgICAgICAgIG4gPSByZWFkX3NpemVbcmVhZF9idWZfaWRdOworICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGF2aW9fd3JpdGUoZm9ybWF0X2NvbnRleHQtPnBiLCByZWFkX2J1ZltyZWFkX2J1Zl9pZF0sIG4pOworICAgICAgICBwb3MgKz0gbjsKKyAgICB9IHdoaWxlIChwb3MgPCBwb3NfZW5kKTsKKyAgICBmZl9mb3JtYXRfaW9fY2xvc2UoZm9ybWF0X2NvbnRleHQsICZyZWFkX3BiKTsKKworICAgIGF2X2ZyZWUoYnVmKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWxtX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmZvcm1hdF9jb250ZXh0KQoreworICAgIGludCByZXQgPSAwOworICAgIGludDY0X3Qgc2FtcGxlX3RhYmxlX3NpemUsIHN0YWJzaXplLCBoZWFkZXJzaXplOworICAgIGludDhfdCBhdWRpb19jb2RlYzsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBmb3JtYXRfY29udGV4dC0+cGI7CisgICAgRklMTU91dHB1dENvbnRleHQgKmZpbG0gPSBmb3JtYXRfY29udGV4dC0+cHJpdl9kYXRhOworICAgIEZJTE1QYWNrZXQgKnByZXYsICpwYWNrZXQ7CisgICAgQVZTdHJlYW0gKmF1ZGlvID0gTlVMTDsKKyAgICBBVlN0cmVhbSAqdmlkZW8gPSBOVUxMOworCisgICAgLyogQ2FsY3VsYXRlIGhvdyBtdWNoIHdlIG5lZWQgdG8gcmVzZXJ2ZSBmb3IgdGhlIGhlYWRlcjsKKyAgICAgKiB0aGlzIGlzIHRoZSBhbW91bnQgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgd2lsbCBiZSBzaGlmdGVkIHVwIGJ5LiAqLworICAgIHNhbXBsZV90YWJsZV9zaXplID0gZmlsbS0+cGFja2V0X2NvdW50ICogMTY7CisgICAgc3RhYnNpemUgPSAxNiArIHNhbXBsZV90YWJsZV9zaXplOworICAgIGhlYWRlcnNpemUgPSAxNiArIC8qIEZJTE0gaGVhZGVyIGJhc2UgKi8KKyAgICAgICAgICAgICAgICAgMzIgKyAvKiBGRFNDIGNodW5rICovCisgICAgICAgICAgICAgICAgIHN0YWJzaXplOworCisgICAgcmV0ID0gc2hpZnRfZGF0YShmb3JtYXRfY29udGV4dCwgaGVhZGVyc2l6ZSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisgICAgLyogU2VlayBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgdG8gc3RhcnQgd3JpdGluZyB0aGUgaGVhZGVyIG5vdyAqLworICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworCisgICAgaWYgKGZpbG0tPmF1ZGlvX2luZGV4ID4gLTEpCisgICAgICAgIGF1ZGlvID0gZm9ybWF0X2NvbnRleHQtPnN0cmVhbXNbZmlsbS0+YXVkaW9faW5kZXhdOworICAgIGlmIChmaWxtLT52aWRlb19pbmRleCA+IC0xKQorICAgICAgICB2aWRlbyA9IGZvcm1hdF9jb250ZXh0LT5zdHJlYW1zW2ZpbG0tPnZpZGVvX2luZGV4XTsKKworICAgIGlmIChhdWRpbyAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2NvZGVjID0gZ2V0X2F1ZGlvX2NvZGVjX2lkKGF1ZGlvLT5jb2RlY3Bhci0+Y29kZWNfaWQpOworICAgICAgICBpZiAoYXVkaW9fY29kZWMgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coZm9ybWF0X2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIkluY29tcGF0aWJsZSBhdWRpbyBzdHJlYW0gZm9ybWF0LlxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHZpZGVvLT5jb2RlY3Bhci0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfUkdCMjQpIHsKKyAgICAgICAgYXZfbG9nKGZvcm1hdF9jb250ZXh0LCBBVl9MT0dfRVJST1IsICJQaXhlbCBmb3JtYXQgbXVzdCBiZSByZ2IyNC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIC8qIEZpcnN0LCB3cml0ZSB0aGUgRklMTSBoZWFkZXI7IHRoaXMgaXMgdmVyeSBzaW1wbGUgKi8KKworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkZJTE0iKTsKKyAgICBhdmlvX3diMzIocGIsIDQ4ICsgc3RhYnNpemUpOworICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgb2theSB0byBoYXJkY29kZSwgc2luY2UgdGhpcyBtdXhlciB0YXJnZXRzIDEuMDkgZmVhdHVyZXM7CisgICAgICogdmlkZW9zIHByb2R1Y2VkIGJ5IHRoaXMgbXV4ZXIgYXJlIHJlYWRhYmxlIGJ5IDEuMDggYW5kIGxvd2VyIHBsYXllcnMuICovCisgICAgZmZpb193Zm91cmNjKHBiLCAiMS4wOSIpOworICAgIC8qIEkgaGF2ZSBubyBpZGVhIHdoYXQgdGhpcyBmaWVsZCBkb2VzLCBtaWdodCBiZSByZXNlcnZlZCAqLworICAgIGF2aW9fd2IzMihwYiwgMCk7CisKKyAgICAvKiBOZXh0IHdyaXRlIHRoZSBGRFNDIChmaWxlIGRlc2NyaXB0aW9uKSBjaHVuayAqLworICAgIGZmaW9fd2ZvdXJjYyhwYiwgIkZEU0MiKTsKKyAgICBhdmlvX3diMzIocGIsIDB4MjApOyAvKiBTaXplIG9mIEZEU0MgY2h1bmsgKi8KKworICAgIC8qIFRoZSBvbmx5IHR3byBzdXBwb3J0ZWQgY29kZWNzOyByYXcgdmlkZW8gaXMgcmFyZSAqLworICAgIHN3aXRjaCAodmlkZW8tPmNvZGVjcGFyLT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfQ0lORVBBSzoKKyAgICAgICAgZmZpb193Zm91cmNjKHBiLCAiY3ZpZCIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX0NPREVDX0lEX1JBV1ZJREVPOgorICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJyYXcgIik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhmb3JtYXRfY29udGV4dCwgQVZfTE9HX0VSUk9SLCAiSW5jb21wYXRpYmxlIHZpZGVvIHN0cmVhbSBmb3JtYXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdmlvX3diMzIocGIsIHZpZGVvLT5jb2RlY3Bhci0+aGVpZ2h0KTsKKyAgICBhdmlvX3diMzIocGIsIHZpZGVvLT5jb2RlY3Bhci0+d2lkdGgpOworICAgIGF2aW9fdzgocGIsIDI0KTsgLyogQml0cyBwZXIgcGl4ZWwgLSBvYnNlcnZlZCB0byBhbHdheXMgYmUgMjQgKi8KKworICAgIGlmIChhdWRpbyAhPSBOVUxMKSB7CisgICAgICAgIGF2aW9fdzgocGIsIGF1ZGlvLT5jb2RlY3Bhci0+Y2hhbm5lbHMpOyAvKiBBdWRpbyBjaGFubmVscyAqLworICAgICAgICBhdmlvX3c4KHBiLCBhdWRpby0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7IC8qIEF1ZGlvIGJpdCBkZXB0aCAqLworICAgICAgICBhdmlvX3c4KHBiLCBhdWRpb19jb2RlYyk7IC8qIENvbXByZXNzaW9uIC0gMCBpcyBQQ00sIDIgaXMgQURYICovCisgICAgICAgIGF2aW9fd2IxNihwYiwgYXVkaW8tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7IC8qIEF1ZGlvIHNhbXBsaW5nIHJhdGUgKi8KKyAgICB9IGVsc2UgeworICAgICAgICAvKiBTZXQgYWxsIHRoZXNlIGZpZWxkcyB0byAwIGlmIHRoZXJlJ3Mgbm8gYXVkaW8gKi8KKyAgICAgICAgYXZpb193OChwYiwgMCk7CisgICAgICAgIGF2aW9fdzgocGIsIDApOworICAgICAgICBhdmlvX3c4KHBiLCAwKTsKKyAgICAgICAgYXZpb193YjE2KHBiLCAwKTsKKyAgICB9CisKKyAgICAvKiBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoaXMgcGFpciBvZiBmaWVsZHMgZG9lcyBlaXRoZXIsIG1pZ2h0IGJlIHJlc2VydmVkICovCisgICAgYXZpb193YjMyKHBiLCAwKTsKKyAgICBhdmlvX3diMTYocGIsIDApOworCisgICAgLyogRmluYWxseSwgd3JpdGUgdGhlIFNUQUIgKHNhbXBsZSB0YWJsZSkgY2h1bmsgKi8KKyAgICBmZmlvX3dmb3VyY2MocGIsICJTVEFCIik7CisgICAgYXZpb193YjMyKHBiLCAxNiArIChmaWxtLT5wYWNrZXRfY291bnQgKiAxNikpOworICAgIC8qIEZyYW1lcmF0ZSBiYXNlIGZyZXF1ZW5jeS4gSGVyZSB3ZSdyZSBhc3N1bWluZyB0aGF0IHRoZSBmcmFtZSByYXRlIGlzIGV2ZW4uCisgICAgICogSW4gcmVhbCB3b3JsZCBTZWdhIEZJTE0gZmlsZXMsIHRoZXJlIGFyZSB1c3VhbGx5IGEgY291cGxlIG9mIGFwcHJvYWNoZXM6CisgICAgICogYSkgZnJhbWVyYXRlIGJhc2UgZnJlcXVlbmN5IGlzIHRoZSBzYW1lIGFzIHRoZSBmcmFtZXJhdGUsIGFuZCB0aWNrcworICAgICAqICAgIGluY3JlbWVudCBieSAxIGV2ZXJ5IGZyYW1lLCBvcgorICAgICAqIGIpIGZyYW1lcmF0ZSBiYXNlIGZyZXF1ZW5jeSBpcyBhIG11Y2ggbGFyZ2VyIG51bWJlciwgYW5kIHRpY2tzCisgICAgICogICAgaW5jcmVtZW50IGJ5IGxhcmdlciBzdGVwcyBldmVyeSBmcmFtZS4KKyAgICAgKiBUaGUgbGF0dGVyIG9jY3VycyBldmVuIGluIGNhc2VzIHdoZXJlIHRoZSBmcmFtZSByYXRlIGlzIGV2ZW47IGZvciBleGFtcGxlLCBpbgorICAgICAqIEx1bmFyOiBTaWx2ZXIgU3RhciBTdG9yeSwgdGhlIGJhc2UgZnJlcXVlbmN5IGlzIDYwMCBhbmQgZWFjaCBmcmFtZSwgdGhlIHRpY2tzCisgICAgICogYXJlIGluY3JlbWVudGVkIGJ5IDI1IGZvciBhbiBldmVubHkgc3BhY2VkIGZyYW1lcmF0ZSBvZiAyNGZwcy4gKi8KKyAgICBhdmlvX3diMzIocGIsIGF2X3EyZChhdl9pbnZfcSh2aWRlby0+dGltZV9iYXNlKSkpOworCisgICAgYXZpb193YjMyKHBiLCBmaWxtLT5wYWNrZXRfY291bnQpOworCisgICAgYXZpb19mbHVzaChwYik7CisKKyAgICAvKiBGaW5hbGx5LCB3cml0ZSBvdXQgZWFjaCBwYWNrZXQncyBkYXRhIHRvIHRoZSBoZWFkZXIgKi8KKyAgICBwYWNrZXQgPSBmaWxtLT5zdGFydDsKKyAgICB3aGlsZSAocGFja2V0ICE9IE5VTEwpIHsKKyAgICAgICAgZmlsbV93cml0ZV9wYWNrZXRfdG9faGVhZGVyKGZvcm1hdF9jb250ZXh0LCBwYWNrZXQpOworICAgICAgICBwcmV2ID0gcGFja2V0OworICAgICAgICBwYWNrZXQgPSBwYWNrZXQtPm5leHQ7CisgICAgICAgIGF2X2ZyZWVwKCZwcmV2KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmlsbV9tdXhlcl9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgPSAiU2VnYSBGSUxNIG11eGVyIiwKKyAgICAuaXRlbV9uYW1lICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitBVk91dHB1dEZvcm1hdCBmZl9zZWdhZmlsbV9tdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAiZmlsbV9jcGsiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJTZWdhIEZJTE0gLyBDUEsiKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAiY3BrIiwKKyAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoRklMTU91dHB1dENvbnRleHQpLAorICAgIC5hdWRpb19jb2RlYyAgICA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRV9QTEFOQVIsCisgICAgLnZpZGVvX2NvZGVjICAgID0gQVZfQ09ERUNfSURfQ0lORVBBSywKKyAgICAuaW5pdCAgICAgICAgICAgPSBmaWxtX2luaXQsCisgICAgLndyaXRlX3RyYWlsZXIgID0gZmlsbV93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gZmlsbV93cml0ZV9wYWNrZXQsCisgICAgLnByaXZfY2xhc3MgICAgID0gJmZpbG1fbXV4ZXJfY2xhc3MsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc2VnbWVudC5jIGIvbGliYXZmb3JtYXQvc2VnbWVudC5jCmluZGV4IGRkM2IwOTIuLjdmYjRkYzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3NlZ21lbnQuYworKysgYi9saWJhdmZvcm1hdC9zZWdtZW50LmMKQEAgLTI0LDggKzI0LDYgQEAKICAqIEB1cmx7aHR0cDovL3Rvb2xzLmlldGYub3JnL2lkL2RyYWZ0LXBhbnRvcy1odHRwLWxpdmUtc3RyZWFtaW5nfQogICovCiAKLS8qICNkZWZpbmUgREVCVUcgKi8KLQogI2luY2x1ZGUgPGZsb2F0Lmg+CiAjaW5jbHVkZSA8dGltZS5oPgogCkBAIC00MSw2ICszOSw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lY29kZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lX2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVzdGFtcC5oIgogCkBAIC04Niw4ICs4NSw4IEBACiAgICAgaW50NjRfdCBjbG9ja3RpbWVfb2Zmc2V0OyAvLzwgY2xvY2sgb2Zmc2V0IGZvciBjdXR0aW5nIHRoZSBzZWdtZW50cyBhdCByZWd1bGFyIGNsb2NrIHRpbWUKICAgICBpbnQ2NF90IGNsb2NrdGltZV93cmFwX2R1cmF0aW9uOyAvLzwgd3JhcHBpbmcgZHVyYXRpb24gY29uc2lkZXJlZCBmb3Igc3RhcnRpbmcgYSBuZXcgc2VnbWVudAogICAgIGludDY0X3QgbGFzdF92YWw7ICAgICAgLy8vPCByZW1lbWJlciBsYXN0IHRpbWUgZm9yIHdyYXAgYXJvdW5kIGRldGVjdGlvbgotICAgIGludDY0X3QgbGFzdF9jdXQ7ICAgICAgLy8vPCByZW1lbWJlciBsYXN0IGN1dAogICAgIGludCBjdXRfcGVuZGluZzsKKyAgICBpbnQgaGVhZGVyX3dyaXR0ZW47ICAgIC8vLzwgd2hldGhlciB3ZSd2ZSBhbHJlYWR5IGNhbGxlZCBhdmZvcm1hdF93cml0ZV9oZWFkZXIKIAogICAgIGNoYXIgKmVudHJ5X3ByZWZpeDsgICAgLy8vPCBwcmVmaXggdG8gYWRkIHRvIGxpc3QgZW50cnkgZmlsZW5hbWVzCiAgICAgaW50IGxpc3RfdHlwZTsgICAgICAgICAvLy88IHNldCB0aGUgbGlzdCB0eXBlCkBAIC05NSw2ICs5NCw3IEBACiAgICAgY2hhciAqdGltZV9zdHI7ICAgICAgICAvLy88IHNlZ21lbnQgZHVyYXRpb24gc3BlY2lmaWNhdGlvbiBzdHJpbmcKICAgICBpbnQ2NF90IHRpbWU7ICAgICAgICAgIC8vLzwgc2VnbWVudCBkdXJhdGlvbgogICAgIGludCB1c2Vfc3RyZnRpbWU7ICAgICAgLy8vPCBmbGFnIHRvIGV4cGFuZCBmaWxlbmFtZSB3aXRoIHN0cmZ0aW1lCisgICAgaW50IGluY3JlbWVudF90YzsgICAgICAvLy88IGZsYWcgdG8gaW5jcmVtZW50IHRpbWVjb2RlIGlmIGZvdW5kCiAKICAgICBjaGFyICp0aW1lc19zdHI7ICAgICAgIC8vLzwgc2VnbWVudCB0aW1lcyBzcGVjaWZpY2F0aW9uIHN0cmluZwogICAgIGludDY0X3QgKnRpbWVzOyAgICAgICAgLy8vPCBsaXN0IG9mIHNlZ21lbnQgaW50ZXJ2YWwgc3BlY2lmaWNhdGlvbgpAQCAtMTExLDExICsxMTEsMTIgQEAKICAgICBpbnQgIHdyaXRlX2hlYWRlcl90cmFpbGVyOyAvKio8IFNldCBieSBhIHByaXZhdGUgb3B0aW9uLiAqLwogICAgIGNoYXIgKmhlYWRlcl9maWxlbmFtZTsgIC8vLzwgZmlsZW5hbWUgdG8gd3JpdGUgdGhlIG91dHB1dCBoZWFkZXIgdG8KIAotICAgIGludCByZXNldF90aW1lc3RhbXBzOyAgLy8vPCByZXNldCB0aW1lc3RhbXBzIGF0IHRoZSBiZWdpbiBvZiBlYWNoIHNlZ21lbnQKKyAgICBpbnQgcmVzZXRfdGltZXN0YW1wczsgIC8vLzwgcmVzZXQgdGltZXN0YW1wcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggc2VnbWVudAogICAgIGludDY0X3QgaW5pdGlhbF9vZmZzZXQ7ICAgIC8vLzwgaW5pdGlhbCB0aW1lc3RhbXBzIG9mZnNldCwgZXhwcmVzc2VkIGluIG1pY3Jvc2Vjb25kcwogICAgIGNoYXIgKnJlZmVyZW5jZV9zdHJlYW1fc3BlY2lmaWVyOyAvLy88IHJlZmVyZW5jZSBzdHJlYW0gc3BlY2lmaWVyCiAgICAgaW50ICAgcmVmZXJlbmNlX3N0cmVhbV9pbmRleDsKICAgICBpbnQgICBicmVha19ub25fa2V5ZnJhbWVzOworICAgIGludCAgIHdyaXRlX2VtcHR5OwogCiAgICAgaW50IHVzZV9yZW5hbWU7CiAgICAgY2hhciB0ZW1wX2xpc3RfZmlsZW5hbWVbMTAyNF07CkBAIC0xNTksMjIgKzE2MCwyMyBAQAogICAgIG9jLT5vcGFxdWUgICAgICAgICAgICAgPSBzLT5vcGFxdWU7CiAgICAgb2MtPmlvX2Nsb3NlICAgICAgICAgICA9IHMtPmlvX2Nsb3NlOwogICAgIG9jLT5pb19vcGVuICAgICAgICAgICAgPSBzLT5pb19vcGVuOworICAgIG9jLT5mbGFncyAgICAgICAgICAgICAgPSBzLT5mbGFnczsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0OwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqaWNvZGVjLCAqb2NvZGVjOworICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqaXBhciwgKm9wYXI7CiAKICAgICAgICAgaWYgKCEoc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKG9jLCBOVUxMKSkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBpY29kZWMgPSBzLT5zdHJlYW1zW2ldLT5jb2RlYzsKLSAgICAgICAgb2NvZGVjID0gc3QtPmNvZGVjOwotICAgICAgICBhdmNvZGVjX2NvcHlfY29udGV4dChvY29kZWMsIGljb2RlYyk7CisgICAgICAgIGlwYXIgPSBzLT5zdHJlYW1zW2ldLT5jb2RlY3BhcjsKKyAgICAgICAgb3BhciA9IHN0LT5jb2RlY3BhcjsKKyAgICAgICAgYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkob3BhciwgaXBhcik7CiAgICAgICAgIGlmICghb2MtPm9mb3JtYXQtPmNvZGVjX3RhZyB8fAotICAgICAgICAgICAgYXZfY29kZWNfZ2V0X2lkIChvYy0+b2Zvcm1hdC0+Y29kZWNfdGFnLCBpY29kZWMtPmNvZGVjX3RhZykgPT0gb2NvZGVjLT5jb2RlY19pZCB8fAotICAgICAgICAgICAgYXZfY29kZWNfZ2V0X3RhZyhvYy0+b2Zvcm1hdC0+Y29kZWNfdGFnLCBpY29kZWMtPmNvZGVjX2lkKSA8PSAwKSB7Ci0gICAgICAgICAgICBvY29kZWMtPmNvZGVjX3RhZyA9IGljb2RlYy0+Y29kZWNfdGFnOworICAgICAgICAgICAgYXZfY29kZWNfZ2V0X2lkIChvYy0+b2Zvcm1hdC0+Y29kZWNfdGFnLCBpcGFyLT5jb2RlY190YWcpID09IG9wYXItPmNvZGVjX2lkIHx8CisgICAgICAgICAgICBhdl9jb2RlY19nZXRfdGFnKG9jLT5vZm9ybWF0LT5jb2RlY190YWcsIGlwYXItPmNvZGVjX2lkKSA8PSAwKSB7CisgICAgICAgICAgICBvcGFyLT5jb2RlY190YWcgPSBpcGFyLT5jb2RlY190YWc7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvY29kZWMtPmNvZGVjX3RhZyA9IDA7CisgICAgICAgICAgICBvcGFyLT5jb2RlY190YWcgPSAwOwogICAgICAgICB9CiAgICAgICAgIHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gcy0+c3RyZWFtc1tpXS0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKICAgICAgICAgc3QtPnRpbWVfYmFzZSA9IHMtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZTsKQEAgLTE5MCw2ICsxOTIsOCBAQAogICAgIEFWRm9ybWF0Q29udGV4dCAqb2MgPSBzZWctPmF2ZjsKICAgICBzaXplX3Qgc2l6ZTsKICAgICBpbnQgcmV0OworICAgIGNoYXIgYnVmWzEwMjRdOworICAgIGNoYXIgKm5ld19uYW1lOwogCiAgICAgaWYgKHNlZy0+c2VnbWVudF9pZHhfd3JhcCkKICAgICAgICAgc2VnLT5zZWdtZW50X2lkeCAlPSBzZWctPnNlZ21lbnRfaWR4X3dyYXA7CkBAIC0xOTgsMTggKzIwMiwyMiBAQAogICAgICAgICBzdHJ1Y3QgdG0gKnRtLCB0bXBidWY7CiAgICAgICAgIHRpbWUoJm5vdzApOwogICAgICAgICB0bSA9IGxvY2FsdGltZV9yKCZub3cwLCAmdG1wYnVmKTsKLSAgICAgICAgaWYgKCFzdHJmdGltZShvYy0+ZmlsZW5hbWUsIHNpemVvZihvYy0+ZmlsZW5hbWUpLCBzLT5maWxlbmFtZSwgdG0pKSB7CisgICAgICAgIGlmICghc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgcy0+dXJsLCB0bSkpIHsKICAgICAgICAgICAgIGF2X2xvZyhvYywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCBzZWdtZW50IGZpbGVuYW1lIHdpdGggc3RyZnRpbWVcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXZfZ2V0X2ZyYW1lX2ZpbGVuYW1lKG9jLT5maWxlbmFtZSwgc2l6ZW9mKG9jLT5maWxlbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZmlsZW5hbWUsIHNlZy0+c2VnbWVudF9pZHgpIDwgMCkgewotICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2VnbWVudCBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnXG4iLCBzLT5maWxlbmFtZSk7CisgICAgfSBlbHNlIGlmIChhdl9nZXRfZnJhbWVfZmlsZW5hbWUoYnVmLCBzaXplb2YoYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT51cmwsIHNlZy0+c2VnbWVudF9pZHgpIDwgMCkgeworICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgc2VnbWVudCBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnXG4iLCBzLT51cmwpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KKyAgICBuZXdfbmFtZSA9IGF2X3N0cmR1cChidWYpOworICAgIGlmICghbmV3X25hbWUpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfZm9ybWF0X3NldF91cmwob2MsIG5ld19uYW1lKTsKIAogICAgIC8qIGNvcHkgbW9kaWZpZWQgbmFtZSBpbiBsaXN0IGVudHJ5ICovCi0gICAgc2l6ZSA9IHN0cmxlbihhdl9iYXNlbmFtZShvYy0+ZmlsZW5hbWUpKSArIDE7CisgICAgc2l6ZSA9IHN0cmxlbihhdl9iYXNlbmFtZShvYy0+dXJsKSkgKyAxOwogICAgIGlmIChzZWctPmVudHJ5X3ByZWZpeCkKICAgICAgICAgc2l6ZSArPSBzdHJsZW4oc2VnLT5lbnRyeV9wcmVmaXgpOwogCkBAIC0yMTcsNyArMjI1LDcgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICBzbnByaW50ZihzZWctPmN1cl9lbnRyeS5maWxlbmFtZSwgc2l6ZSwgIiVzJXMiLAogICAgICAgICAgICAgIHNlZy0+ZW50cnlfcHJlZml4ID8gc2VnLT5lbnRyeV9wcmVmaXggOiAiIiwKLSAgICAgICAgICAgICBhdl9iYXNlbmFtZShvYy0+ZmlsZW5hbWUpKTsKKyAgICAgICAgICAgICBhdl9iYXNlbmFtZShvYy0+dXJsKSk7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTI0Myw4ICsyNTEsOCBAQAogICAgIGlmICgoZXJyID0gc2V0X3NlZ21lbnRfZmlsZW5hbWUocykpIDwgMCkKICAgICAgICAgcmV0dXJuIGVycjsKIAotICAgIGlmICgoZXJyID0gcy0+aW9fb3BlbihzLCAmb2MtPnBiLCBvYy0+ZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwgTlVMTCkpIDwgMCkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gc2VnbWVudCAnJXMnXG4iLCBvYy0+ZmlsZW5hbWUpOworICAgIGlmICgoZXJyID0gcy0+aW9fb3BlbihzLCAmb2MtPnBiLCBvYy0+dXJsLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwpKSA8IDApIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIHNlZ21lbnQgJyVzJ1xuIiwgb2MtPnVybCk7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogICAgIGlmICghc2VnLT5pbmRpdmlkdWFsX2hlYWRlcl90cmFpbGVyKQpAQCAtMjU0LDcgKzI2MiwxMiBAQAogICAgICAgICBhdl9vcHRfc2V0KG9jLT5wcml2X2RhdGEsICJtcGVndHNfZmxhZ3MiLCAiK3Jlc2VuZF9oZWFkZXJzIiwgMCk7CiAKICAgICBpZiAod3JpdGVfaGVhZGVyKSB7Ci0gICAgICAgIGlmICgoZXJyID0gYXZmb3JtYXRfd3JpdGVfaGVhZGVyKG9jLCBOVUxMKSkgPCAwKQorICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOworICAgICAgICBhdl9kaWN0X2NvcHkoJm9wdGlvbnMsIHNlZy0+Zm9ybWF0X29wdGlvbnMsIDApOworICAgICAgICBhdl9kaWN0X3NldCgmb3B0aW9ucywgImZmbGFncyIsICItYXV0b2JzZiIsIDApOworICAgICAgICBlcnIgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIob2MsICZvcHRpb25zKTsKKyAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKKyAgICAgICAgaWYgKGVyciA8IDApCiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIApAQCAtMzM3LDYgKzM1MCwxNSBAQAogICAgIFNlZ21lbnRDb250ZXh0ICpzZWcgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IHNlZy0+YXZmOwogICAgIGludCByZXQgPSAwOworICAgIEFWVGltZWNvZGUgdGM7CisgICAgQVZSYXRpb25hbCByYXRlOworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0Y3I7CisgICAgY2hhciBidWZbQVZfVElNRUNPREVfU1RSX1NJWkVdOworICAgIGludCBpOworICAgIGludCBlcnI7CisKKyAgICBpZiAoIW9jIHx8ICFvYy0+cGIpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAKICAgICBhdl93cml0ZV9mcmFtZShvYywgTlVMTCk7IC8qIEZsdXNoIGFueSBidWZmZXJlZCBkYXRhIChmcmFnbWVudGVkIG1wNCkgKi8KICAgICBpZiAod3JpdGVfdHJhaWxlcikKQEAgLTM0NCw3ICszNjYsNyBAQAogCiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsdXJlIG9jY3VycmVkIHdoZW4gZW5kaW5nIHNlZ21lbnQgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgIG9jLT5maWxlbmFtZSk7CisgICAgICAgICAgICAgICBvYy0+dXJsKTsKIAogICAgIGlmIChzZWctPmxpc3QpIHsKICAgICAgICAgaWYgKHNlZy0+bGlzdF9zaXplIHx8IHNlZy0+bGlzdF90eXBlID09IExJU1RfVFlQRV9NM1U4KSB7CkBAIC0zODcsOSArNDA5LDMyIEBACiAgICAgfQogCiAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAic2VnbWVudDonJXMnIGNvdW50OiVkIGVuZGVkXG4iLAotICAgICAgICAgICBzZWctPmF2Zi0+ZmlsZW5hbWUsIHNlZy0+c2VnbWVudF9jb3VudCk7CisgICAgICAgICAgIHNlZy0+YXZmLT51cmwsIHNlZy0+c2VnbWVudF9jb3VudCk7CiAgICAgc2VnLT5zZWdtZW50X2NvdW50Kys7CiAKKyAgICBpZiAoc2VnLT5pbmNyZW1lbnRfdGMpIHsKKyAgICAgICAgdGNyID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICJ0aW1lY29kZSIsIE5VTEwsIDApOworICAgICAgICBpZiAodGNyKSB7CisgICAgICAgICAgICAvKiBzZWFyY2ggdGhlIGZpcnN0IHZpZGVvIHN0cmVhbSAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgICAgICAgICAgcmF0ZSA9IHMtPnN0cmVhbXNbaV0tPmF2Z19mcmFtZV9yYXRlOy8qIEdldCBmcHMgZnJvbSB0aGUgdmlkZW8gc3RyZWFtICovCisgICAgICAgICAgICAgICAgICAgIGVyciA9IGF2X3RpbWVjb2RlX2luaXRfZnJvbV9zdHJpbmcoJnRjLCByYXRlLCB0Y3ItPnZhbHVlLCBzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkNvdWxkIG5vdCBpbmNyZW1lbnQgdGltZWNvZGUsIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aW1lY29kZSBjcmVhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRjLnN0YXJ0ICs9IChpbnQpKChzZWctPmN1cl9lbnRyeS5lbmRfdGltZSAtIHNlZy0+Y3VyX2VudHJ5LnN0YXJ0X3RpbWUpICogYXZfcTJkKHJhdGUpKTsvKiBpbmNyZW1lbnQgdGltZWNvZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCAidGltZWNvZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl90aW1lY29kZV9tYWtlX3N0cmluZygmdGMsIGJ1ZiwgMCksIDApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJDb3VsZCBub3QgaW5jcmVtZW50IHRpbWVjb2RlLCBubyB0aW1lY29kZSBtZXRhZGF0YSBmb3VuZCIpOworICAgICAgICB9CisgICAgfQorCiBlbmQ6CiAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKG9jLCAmb2MtPnBiKTsKIApAQCAtNTMwLDcgKzU3NSw3IEBACiBzdGF0aWMgdm9pZCBjbG9zZV9udWxsX2N0eHAoQVZJT0NvbnRleHQgKipwYikKIHsKICAgICBhdl9mcmVlcCgmKCpwYiktPmJ1ZmZlcik7Ci0gICAgYXZfZnJlZXAocGIpOworICAgIGF2aW9fY29udGV4dF9mcmVlKHBiKTsKIH0KIAogc3RhdGljIGludCBzZWxlY3RfcmVmZXJlbmNlX3N0cmVhbShBVkZvcm1hdENvbnRleHQgKnMpCkBAIC01NTYsNyArNjAxLDcgQEAKIAogICAgICAgICAvKiBzZWxlY3QgZmlyc3QgaW5kZXggZm9yIGVhY2ggdHlwZSAqLwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgICAgICB0eXBlID0gcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgICAgICAgICB0eXBlID0gcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3R5cGU7CiAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXR5cGUgPCBBVk1FRElBX1RZUEVfTkIgJiYgdHlwZV9pbmRleF9tYXBbdHlwZV0gPT0gLTEKICAgICAgICAgICAgICAgICAvKiBpZ25vcmUgYXR0YWNoZWQgcGljdHVyZXMvY292ZXIgYXJ0IHN0cmVhbXMgKi8KICAgICAgICAgICAgICAgICAmJiAhKHMtPnN0cmVhbXNbaV0tPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDKSkKQEAgLTU5MCwxNyArNjM1LDE4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNlZ19mcmVlX2NvbnRleHQoU2VnbWVudENvbnRleHQgKnNlZykKK3N0YXRpYyB2b2lkIHNlZ19mcmVlKEFWRm9ybWF0Q29udGV4dCAqcykKIHsKKyAgICBTZWdtZW50Q29udGV4dCAqc2VnID0gcy0+cHJpdl9kYXRhOwogICAgIGZmX2Zvcm1hdF9pb19jbG9zZShzZWctPmF2ZiwgJnNlZy0+bGlzdF9wYik7CiAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHNlZy0+YXZmKTsKICAgICBzZWctPmF2ZiA9IE5VTEw7CiB9CiAKLXN0YXRpYyBpbnQgc2VnX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCitzdGF0aWMgaW50IHNlZ19pbml0KEFWRm9ybWF0Q29udGV4dCAqcykKIHsKICAgICBTZWdtZW50Q29udGV4dCAqc2VnID0gcy0+cHJpdl9kYXRhOwotICAgIEFWRm9ybWF0Q29udGV4dCAqb2MgPSBOVUxMOworICAgIEFWRm9ybWF0Q29udGV4dCAqb2MgPSBzZWctPmF2ZjsKICAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOwogICAgIGludCByZXQ7CiAgICAgaW50IGk7CkBAIC02MTQsNiArNjYwLDExIEBACiAgICAgICAgIHNlZy0+aW5kaXZpZHVhbF9oZWFkZXJfdHJhaWxlciA9IDA7CiAgICAgfQogCisgICAgaWYgKHNlZy0+aW5pdGlhbF9vZmZzZXQgPiAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIk5PVEU6IHRoZSBvcHRpb24gaW5pdGlhbF9vZmZzZXQgaXMgZGVwcmVjYXRlZCwiCisgICAgICAgICAgICAgICAieW91IGNhbiB1c2Ugb3V0cHV0X3RzX29mZnNldCBpbnN0ZWFkIG9mIGl0XG4iKTsKKyAgICB9CisKICAgICBpZiAoISFzZWctPnRpbWVfc3RyICsgISFzZWctPnRpbWVzX3N0ciArICEhc2VnLT5mcmFtZXNfc3RyID4gMSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgInNlZ21lbnRfdGltZSwgc2VnbWVudF90aW1lcywgYW5kIHNlZ21lbnRfZnJhbWVzIG9wdGlvbnMgIgpAQCAtNjUxLDcgKzcwMiw3IEBACiAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IHBhcnNlIGZvcm1hdCBvcHRpb25zIGxpc3QgJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICBzZWctPmZvcm1hdF9vcHRpb25zX3N0cik7Ci0gICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfQogCkBAIC02NjUsNzEgKzcxNiw3OCBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghc2VnLT5saXN0X3NpemUgJiYgc2VnLT5saXN0X3R5cGUgIT0gTElTVF9UWVBFX00zVTgpIHsKICAgICAgICAgICAgIGlmICgocmV0ID0gc2VnbWVudF9saXN0X29wZW4ocykpIDwgMCkKLSAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnByb3RvID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUocy0+ZmlsZW5hbWUpOworICAgICAgICAgICAgY29uc3QgY2hhciAqcHJvdG8gPSBhdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShzZWctPmxpc3QpOwogICAgICAgICAgICAgc2VnLT51c2VfcmVuYW1lID0gcHJvdG8gJiYgIXN0cmNtcChwcm90bywgImZpbGUiKTsKICAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChzZWctPmxpc3RfdHlwZSA9PSBMSVNUX1RZUEVfRVhUKQogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICInZXh0JyBsaXN0IHR5cGUgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgJ2NzdidcbiIpOwogCiAgICAgaWYgKChyZXQgPSBzZWxlY3RfcmVmZXJlbmNlX3N0cmVhbShzKSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiU2VsZWN0ZWQgc3RyZWFtIGlkOiVkIHR5cGU6JXNcbiIsCiAgICAgICAgICAgIHNlZy0+cmVmZXJlbmNlX3N0cmVhbV9pbmRleCwKLSAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHMtPnN0cmVhbXNbc2VnLT5yZWZlcmVuY2Vfc3RyZWFtX2luZGV4XS0+Y29kZWMtPmNvZGVjX3R5cGUpKTsKKyAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHMtPnN0cmVhbXNbc2VnLT5yZWZlcmVuY2Vfc3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmNvZGVjX3R5cGUpKTsKIAotICAgIHNlZy0+b2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdChzZWctPmZvcm1hdCwgcy0+ZmlsZW5hbWUsIE5VTEwpOworICAgIHNlZy0+b2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdChzZWctPmZvcm1hdCwgcy0+dXJsLCBOVUxMKTsKIAotICAgIGlmICghc2VnLT5vZm9ybWF0KSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOwotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgfQorICAgIGlmICghc2VnLT5vZm9ybWF0KQorICAgICAgICByZXR1cm4gQVZFUlJPUl9NVVhFUl9OT1RfRk9VTkQ7CiAgICAgaWYgKHNlZy0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImZvcm1hdCAlcyBub3Qgc3VwcG9ydGVkLlxuIiwKICAgICAgICAgICAgICAgIHNlZy0+b2Zvcm1hdC0+bmFtZSk7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBmYWlsOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIAogICAgIGlmICgocmV0ID0gc2VnbWVudF9tdXhfaW5pdChzKSkgPCAwKQotICAgICAgICBnb3RvIGZhaWw7Ci0gICAgb2MgPSBzZWctPmF2ZjsKKyAgICAgICAgcmV0dXJuIHJldDsKIAogICAgIGlmICgocmV0ID0gc2V0X3NlZ21lbnRfZmlsZW5hbWUocykpIDwgMCkKLSAgICAgICAgZ290byBmYWlsOworICAgICAgICByZXR1cm4gcmV0OworICAgIG9jID0gc2VnLT5hdmY7CiAKICAgICBpZiAoc2VnLT53cml0ZV9oZWFkZXJfdHJhaWxlcikgewogICAgICAgICBpZiAoKHJldCA9IHMtPmlvX29wZW4ocywgJm9jLT5wYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy0+aGVhZGVyX2ZpbGVuYW1lID8gc2VnLT5oZWFkZXJfZmlsZW5hbWUgOiBvYy0+ZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWctPmhlYWRlcl9maWxlbmFtZSA/IHNlZy0+aGVhZGVyX2ZpbGVuYW1lIDogb2MtPnVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSU9fRkxBR19XUklURSwgTlVMTCkpIDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBvcGVuIHNlZ21lbnQgJyVzJ1xuIiwgb2MtPmZpbGVuYW1lKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBzZWdtZW50ICclcydcbiIsIG9jLT51cmwpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXNlZy0+aW5kaXZpZHVhbF9oZWFkZXJfdHJhaWxlcikKICAgICAgICAgICAgIG9jLT5wYi0+c2Vla2FibGUgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICgocmV0ID0gb3Blbl9udWxsX2N0eCgmb2MtPnBiKSkgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBhdl9kaWN0X2NvcHkoJm9wdGlvbnMsIHNlZy0+Zm9ybWF0X29wdGlvbnMsIDApOwotICAgIHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihvYywgJm9wdGlvbnMpOworICAgIGF2X2RpY3Rfc2V0KCZvcHRpb25zLCAiZmZsYWdzIiwgIi1hdXRvYnNmIiwgMCk7CisgICAgcmV0ID0gYXZmb3JtYXRfaW5pdF9vdXRwdXQob2MsICZvcHRpb25zKTsKICAgICBpZiAoYXZfZGljdF9jb3VudChvcHRpb25zKSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIlNvbWUgb2YgdGhlIHByb3ZpZGVkIGZvcm1hdCBvcHRpb25zIGluICclcycgYXJlIG5vdCByZWNvZ25pemVkXG4iLCBzZWctPmZvcm1hdF9vcHRpb25zX3N0cik7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgZ290byBmYWlsOworICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KKyAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOwogCiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKG9jLCAmb2MtPnBiKTsKLSAgICAgICAgZ290byBmYWlsOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBzZWctPnNlZ21lbnRfZnJhbWVfY291bnQgPSAwOwogCiAgICAgYXZfYXNzZXJ0MChzLT5uYl9zdHJlYW1zID09IG9jLT5uYl9zdHJlYW1zKTsKKyAgICBpZiAocmV0ID09IEFWU1RSRUFNX0lOSVRfSU5fV1JJVEVfSEVBREVSKSB7CisgICAgICAgIHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihvYywgTlVMTCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgc2VnLT5oZWFkZXJfd3JpdHRlbiA9IDE7CisgICAgfQorCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBBVlN0cmVhbSAqaW5uZXJfc3QgID0gb2MtPnN0cmVhbXNbaV07CiAgICAgICAgIEFWU3RyZWFtICpvdXRlcl9zdCA9IHMtPnN0cmVhbXNbaV07CkBAIC03MzksNiArNzk3LDM4IEBACiAgICAgaWYgKG9jLT5hdm9pZF9uZWdhdGl2ZV90cyA+IDAgJiYgcy0+YXZvaWRfbmVnYXRpdmVfdHMgPCAwKQogICAgICAgICBzLT5hdm9pZF9uZWdhdGl2ZV90cyA9IDE7CiAKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHNlZ193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIFNlZ21lbnRDb250ZXh0ICpzZWcgPSBzLT5wcml2X2RhdGE7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IHNlZy0+YXZmOworICAgIGludCByZXQsIGk7CisKKyAgICBpZiAoIXNlZy0+aGVhZGVyX3dyaXR0ZW4pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICAgICAgQVZTdHJlYW0gKnN0ID0gb2MtPnN0cmVhbXNbaV07CisgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqaXBhciwgKm9wYXI7CisKKyAgICAgICAgICAgIGlwYXIgPSBzLT5zdHJlYW1zW2ldLT5jb2RlY3BhcjsKKyAgICAgICAgICAgIG9wYXIgPSBvYy0+c3RyZWFtc1tpXS0+Y29kZWNwYXI7CisgICAgICAgICAgICBhdmNvZGVjX3BhcmFtZXRlcnNfY29weShvcGFyLCBpcGFyKTsKKyAgICAgICAgICAgIGlmICghb2MtPm9mb3JtYXQtPmNvZGVjX3RhZyB8fAorICAgICAgICAgICAgICAgIGF2X2NvZGVjX2dldF9pZCAob2MtPm9mb3JtYXQtPmNvZGVjX3RhZywgaXBhci0+Y29kZWNfdGFnKSA9PSBvcGFyLT5jb2RlY19pZCB8fAorICAgICAgICAgICAgICAgIGF2X2NvZGVjX2dldF90YWcob2MtPm9mb3JtYXQtPmNvZGVjX3RhZywgaXBhci0+Y29kZWNfaWQpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBvcGFyLT5jb2RlY190YWcgPSBpcGFyLT5jb2RlY190YWc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9wYXItPmNvZGVjX3RhZyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHMtPnN0cmVhbXNbaV0tPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgICAgICAgICBzdC0+dGltZV9iYXNlID0gcy0+c3RyZWFtc1tpXS0+dGltZV9iYXNlOworICAgICAgICB9CisgICAgICAgIHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihvYywgTlVMTCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKICAgICBpZiAoIXNlZy0+d3JpdGVfaGVhZGVyX3RyYWlsZXIgfHwgc2VnLT5oZWFkZXJfZmlsZW5hbWUpIHsKICAgICAgICAgaWYgKHNlZy0+aGVhZGVyX2ZpbGVuYW1lKSB7CiAgICAgICAgICAgICBhdl93cml0ZV9mcmFtZShvYywgTlVMTCk7CkBAIC03NDYsMTggKzgzNiwxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY2xvc2VfbnVsbF9jdHhwKCZvYy0+cGIpOwogICAgICAgICB9Ci0gICAgICAgIGlmICgocmV0ID0gb2MtPmlvX29wZW4ob2MsICZvYy0+cGIsIG9jLT5maWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFLCBOVUxMKSkgPCAwKQotICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoKHJldCA9IG9jLT5pb19vcGVuKG9jLCAmb2MtPnBiLCBvYy0+dXJsLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwpKSA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICBpZiAoIXNlZy0+aW5kaXZpZHVhbF9oZWFkZXJfdHJhaWxlcikKICAgICAgICAgICAgIG9jLT5wYi0+c2Vla2FibGUgPSAwOwogICAgIH0KIAotZmFpbDoKLSAgICBhdl9kaWN0X2ZyZWUoJm9wdGlvbnMpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBzZWdfZnJlZV9jb250ZXh0KHNlZyk7Ci0KLSAgICByZXR1cm4gcmV0OworICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNlZ193cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQpAQCAtNzcxLDkgKzg1NiwxMCBAQAogICAgIGludDY0X3QgdXNlY3M7CiAgICAgaW50NjRfdCB3cmFwcGVkX3ZhbDsKIAotICAgIGlmICghc2VnLT5hdmYpCisgICAgaWYgKCFzZWctPmF2ZiB8fCAhc2VnLT5hdmYtPnBiKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCitjYWxjX3RpbWVzOgogICAgIGlmIChzZWctPnRpbWVzKSB7CiAgICAgICAgIGVuZF9wdHMgPSBzZWctPnNlZ21lbnRfY291bnQgPCBzZWctPm5iX3RpbWVzID8KICAgICAgICAgICAgIHNlZy0+dGltZXNbc2VnLT5zZWdtZW50X2NvdW50XSA6IElOVDY0X01BWDsKQEAgLTc4NywxMCArODczLDggQEAKICAgICAgICAgICAgIGxvY2FsdGltZV9yKCZzZWMsICZ0aSk7CiAgICAgICAgICAgICB1c2VjcyA9IChpbnQ2NF90KSh0aS50bV9ob3VyICogMzYwMCArIHRpLnRtX21pbiAqIDYwICsgdGkudG1fc2VjKSAqIDEwMDAwMDAgKyAoYXZndCAlIDEwMDAwMDApOwogICAgICAgICAgICAgd3JhcHBlZF92YWwgPSAodXNlY3MgKyBzZWctPmNsb2NrdGltZV9vZmZzZXQpICUgc2VnLT50aW1lOwotICAgICAgICAgICAgaWYgKHNlZy0+bGFzdF9jdXQgIT0gdXNlY3MgJiYgd3JhcHBlZF92YWwgPCBzZWctPmxhc3RfdmFsICYmIHdyYXBwZWRfdmFsIDwgc2VnLT5jbG9ja3RpbWVfd3JhcF9kdXJhdGlvbikgeworICAgICAgICAgICAgaWYgKHdyYXBwZWRfdmFsIDwgc2VnLT5sYXN0X3ZhbCAmJiB3cmFwcGVkX3ZhbCA8IHNlZy0+Y2xvY2t0aW1lX3dyYXBfZHVyYXRpb24pCiAgICAgICAgICAgICAgICAgc2VnLT5jdXRfcGVuZGluZyA9IDE7Ci0gICAgICAgICAgICAgICAgc2VnLT5sYXN0X2N1dCA9IHVzZWNzOwotICAgICAgICAgICAgfQogICAgICAgICAgICAgc2VnLT5sYXN0X3ZhbCA9IHdyYXBwZWRfdmFsOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZW5kX3B0cyA9IHNlZy0+dGltZSAqIChzZWctPnNlZ21lbnRfY291bnQgKyAxKTsKQEAgLTgwNSwxMSArODg5LDExIEBACiAKICAgICBpZiAocGt0LT5zdHJlYW1faW5kZXggPT0gc2VnLT5yZWZlcmVuY2Vfc3RyZWFtX2luZGV4ICYmCiAgICAgICAgIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZIHx8IHNlZy0+YnJlYWtfbm9uX2tleWZyYW1lcykgJiYKLSAgICAgICAgc2VnLT5zZWdtZW50X2ZyYW1lX2NvdW50ID4gMCAmJgorICAgICAgICAoc2VnLT5zZWdtZW50X2ZyYW1lX2NvdW50ID4gMCB8fCBzZWctPndyaXRlX2VtcHR5KSAmJgogICAgICAgICAoc2VnLT5jdXRfcGVuZGluZyB8fCBzZWctPmZyYW1lX2NvdW50ID49IHN0YXJ0X2ZyYW1lIHx8CiAgICAgICAgICAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKICAgICAgICAgICBhdl9jb21wYXJlX3RzKHBrdC0+cHRzLCBzdC0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3B0cy1zZWctPnRpbWVfZGVsdGEsIEFWX1RJTUVfQkFTRV9RKSA+PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9wdHMgLSBzZWctPnRpbWVfZGVsdGEsIEFWX1RJTUVfQkFTRV9RKSA+PSAwKSkpIHsKICAgICAgICAgLyogc2FuaXRpemUgZW5kIHRpbWUgaW4gY2FzZSBsYXN0IHBhY2tldCBkaWRuJ3QgaGF2ZSBhIGRlZmluZWQgZHVyYXRpb24gKi8KICAgICAgICAgaWYgKHNlZy0+Y3VyX2VudHJ5Lmxhc3RfZHVyYXRpb24gPT0gMCkKICAgICAgICAgICAgIHNlZy0+Y3VyX2VudHJ5LmVuZF90aW1lID0gKGRvdWJsZSlwa3QtPnB0cyAqIGF2X3EyZChzdC0+dGltZV9iYXNlKTsKQEAgLTgyNCwxNyArOTA4LDIyIEBACiAgICAgICAgIHNlZy0+Y3VyX2VudHJ5LmluZGV4ID0gc2VnLT5zZWdtZW50X2lkeCArIHNlZy0+c2VnbWVudF9pZHhfd3JhcCAqIHNlZy0+c2VnbWVudF9pZHhfd3JhcF9uYjsKICAgICAgICAgc2VnLT5jdXJfZW50cnkuc3RhcnRfdGltZSA9IChkb3VibGUpcGt0LT5wdHMgKiBhdl9xMmQoc3QtPnRpbWVfYmFzZSk7CiAgICAgICAgIHNlZy0+Y3VyX2VudHJ5LnN0YXJ0X3B0cyA9IGF2X3Jlc2NhbGVfcShwa3QtPnB0cywgc3QtPnRpbWVfYmFzZSwgQVZfVElNRV9CQVNFX1EpOwotICAgICAgICBzZWctPmN1cl9lbnRyeS5lbmRfdGltZSA9IHNlZy0+Y3VyX2VudHJ5LnN0YXJ0X3RpbWUgKwotICAgICAgICAgICAgcGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgPyAoZG91YmxlKShwa3QtPnB0cyArIHBrdC0+ZHVyYXRpb24pICogYXZfcTJkKHN0LT50aW1lX2Jhc2UpIDogMDsKLSAgICB9IGVsc2UgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHBrdC0+c3RyZWFtX2luZGV4ID09IHNlZy0+cmVmZXJlbmNlX3N0cmVhbV9pbmRleCkgewotICAgICAgICBzZWctPmN1cl9lbnRyeS5lbmRfdGltZSA9Ci0gICAgICAgICAgICBGRk1BWChzZWctPmN1cl9lbnRyeS5lbmRfdGltZSwgKGRvdWJsZSkocGt0LT5wdHMgKyBwa3QtPmR1cmF0aW9uKSAqIGF2X3EyZChzdC0+dGltZV9iYXNlKSk7CisgICAgICAgIHNlZy0+Y3VyX2VudHJ5LmVuZF90aW1lID0gc2VnLT5jdXJfZW50cnkuc3RhcnRfdGltZTsKKworICAgICAgICBpZiAoc2VnLT50aW1lcyB8fCAoIXNlZy0+ZnJhbWVzICYmICFzZWctPnVzZV9jbG9ja3RpbWUpICYmIHNlZy0+d3JpdGVfZW1wdHkpCisgICAgICAgICAgICBnb3RvIGNhbGNfdGltZXM7CisgICAgfQorCisgICAgaWYgKHBrdC0+c3RyZWFtX2luZGV4ID09IHNlZy0+cmVmZXJlbmNlX3N0cmVhbV9pbmRleCkgeworICAgICAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICBzZWctPmN1cl9lbnRyeS5lbmRfdGltZSA9CisgICAgICAgICAgICAgICAgRkZNQVgoc2VnLT5jdXJfZW50cnkuZW5kX3RpbWUsIChkb3VibGUpKHBrdC0+cHRzICsgcGt0LT5kdXJhdGlvbikgKiBhdl9xMmQoc3QtPnRpbWVfYmFzZSkpOwogICAgICAgICBzZWctPmN1cl9lbnRyeS5sYXN0X2R1cmF0aW9uID0gcGt0LT5kdXJhdGlvbjsKICAgICB9CiAKICAgICBpZiAoc2VnLT5zZWdtZW50X2ZyYW1lX2NvdW50ID09IDApIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAic2VnbWVudDonJXMnIHN0YXJ0cyB3aXRoIHBhY2tldCBzdHJlYW06JWQgcHRzOiVzIHB0c190aW1lOiVzIGZyYW1lOiVkXG4iLAotICAgICAgICAgICAgICAgc2VnLT5hdmYtPmZpbGVuYW1lLCBwa3QtPnN0cmVhbV9pbmRleCwKKyAgICAgICAgICAgICAgIHNlZy0+YXZmLT51cmwsIHBrdC0+c3RyZWFtX2luZGV4LAogICAgICAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+cHRzKSwgYXZfdHMydGltZXN0cihwa3QtPnB0cywgJnN0LT50aW1lX2Jhc2UpLCBzZWctPmZyYW1lX2NvdW50KTsKICAgICB9CiAKQEAgLTg2NCw5ICs5NTMsNiBAQAogICAgICAgICBzZWctPnNlZ21lbnRfZnJhbWVfY291bnQrKzsKICAgICB9CiAKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgc2VnX2ZyZWVfY29udGV4dChzZWcpOwotCiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtOTEzLDYgKzk5OSwyNSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyBpbnQgc2VnX2NoZWNrX2JpdHN0cmVhbShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBBVlBhY2tldCAqcGt0KQoreworICAgIFNlZ21lbnRDb250ZXh0ICpzZWcgPSBzLT5wcml2X2RhdGE7CisgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IHNlZy0+YXZmOworICAgIGlmIChvYy0+b2Zvcm1hdC0+Y2hlY2tfYml0c3RyZWFtKSB7CisgICAgICAgIGludCByZXQgPSBvYy0+b2Zvcm1hdC0+Y2hlY2tfYml0c3RyZWFtKG9jLCBwa3QpOworICAgICAgICBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOworICAgICAgICAgICAgQVZTdHJlYW0gKm9zdCA9IG9jLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKKyAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+YnNmY3MgPSBvc3QtPmludGVybmFsLT5ic2ZjczsKKyAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+bmJfYnNmY3MgPSBvc3QtPmludGVybmFsLT5uYl9ic2ZjczsKKyAgICAgICAgICAgIG9zdC0+aW50ZXJuYWwtPmJzZmNzID0gTlVMTDsKKyAgICAgICAgICAgIG9zdC0+aW50ZXJuYWwtPm5iX2JzZmNzID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKwogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoU2VnbWVudENvbnRleHQsIHgpCiAjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CkBAIC05NDgsMTUgKzEwNTMsMTggQEAKICAgICB7ICJzZWdtZW50X3N0YXJ0X251bWJlciIsICJzZXQgdGhlIHNlcXVlbmNlIG51bWJlciBvZiB0aGUgZmlyc3Qgc2VnbWVudCIsIE9GRlNFVChzZWdtZW50X2lkeCksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgRSB9LAogICAgIHsgInNlZ21lbnRfd3JhcF9udW1iZXIiLCAic2V0IHRoZSBudW1iZXIgb2Ygd3JhcCBiZWZvcmUgdGhlIGZpcnN0IHNlZ21lbnQiLCBPRkZTRVQoc2VnbWVudF9pZHhfd3JhcF9uYiksIEFWX09QVF9UWVBFX0lOVCwgey5pNjQgPSAwfSwgMCwgSU5UX01BWCwgRSB9LAogICAgIHsgInN0cmZ0aW1lIiwgICAgICAgICAgInNldCBmaWxlbmFtZSBleHBhbnNpb24gd2l0aCBzdHJmdGltZSBhdCBzZWdtZW50IGNyZWF0aW9uIiwgT0ZGU0VUKHVzZV9zdHJmdGltZSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMCB9LCAwLCAxLCBFIH0sCisgICAgeyAiaW5jcmVtZW50X3RjIiwgImluY3JlbWVudCB0aW1lY29kZSBiZXR3ZWVuIGVhY2ggc2VnbWVudCIsIE9GRlNFVChpbmNyZW1lbnRfdGMpLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDAgfSwgMCwgMSwgRSB9LAogICAgIHsgImJyZWFrX25vbl9rZXlmcmFtZXMiLCAiYWxsb3cgYnJlYWtpbmcgc2VnbWVudHMgb24gbm9uLWtleWZyYW1lcyIsIE9GRlNFVChicmVha19ub25fa2V5ZnJhbWVzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgRSB9LAogCiAgICAgeyAiaW5kaXZpZHVhbF9oZWFkZXJfdHJhaWxlciIsICJ3cml0ZSBoZWFkZXIvdHJhaWxlciB0byBlYWNoIHNlZ21lbnQiLCBPRkZTRVQoaW5kaXZpZHVhbF9oZWFkZXJfdHJhaWxlciksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMX0sIDAsIDEsIEUgfSwKICAgICB7ICJ3cml0ZV9oZWFkZXJfdHJhaWxlciIsICJ3cml0ZSBhIGhlYWRlciB0byB0aGUgZmlyc3Qgc2VnbWVudCBhbmQgYSB0cmFpbGVyIHRvIHRoZSBsYXN0IG9uZSIsIE9GRlNFVCh3cml0ZV9oZWFkZXJfdHJhaWxlciksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMX0sIDAsIDEsIEUgfSwKLSAgICB7ICJyZXNldF90aW1lc3RhbXBzIiwgInJlc2V0IHRpbWVzdGFtcHMgYXQgdGhlIGJlZ2luIG9mIGVhY2ggc2VnbWVudCIsIE9GRlNFVChyZXNldF90aW1lc3RhbXBzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgRSB9LAorICAgIHsgInJlc2V0X3RpbWVzdGFtcHMiLCAicmVzZXQgdGltZXN0YW1wcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggc2VnbWVudCIsIE9GRlNFVChyZXNldF90aW1lc3RhbXBzKSwgQVZfT1BUX1RZUEVfQk9PTCwgey5pNjQgPSAwfSwgMCwgMSwgRSB9LAogICAgIHsgImluaXRpYWxfb2Zmc2V0IiwgInNldCBpbml0aWFsIHRpbWVzdGFtcCBvZmZzZXQiLCBPRkZTRVQoaW5pdGlhbF9vZmZzZXQpLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAwfSwgLUlOVDY0X01BWCwgSU5UNjRfTUFYLCBFIH0sCisgICAgeyAid3JpdGVfZW1wdHlfc2VnbWVudHMiLCAiYWxsb3cgd3JpdGluZyBlbXB0eSAnZmlsbGVyJyBzZWdtZW50cyIsIE9GRlNFVCh3cml0ZV9lbXB0eSksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0sIDAsIDEsIEUgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKKyNpZiBDT05GSUdfU0VHTUVOVF9NVVhFUgogc3RhdGljIGNvbnN0IEFWQ2xhc3Mgc2VnX2NsYXNzID0gewogICAgIC5jbGFzc19uYW1lID0gInNlZ21lbnQgbXV4ZXIiLAogICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCkBAIC05NjksMTIgKzEwNzcsMTcgQEAKICAgICAubG9uZ19uYW1lICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgic2VnbWVudCIpLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihTZWdtZW50Q29udGV4dCksCiAgICAgLmZsYWdzICAgICAgICAgID0gQVZGTVRfTk9GSUxFfEFWRk1UX0dMT0JBTEhFQURFUiwKKyAgICAuaW5pdCAgICAgICAgICAgPSBzZWdfaW5pdCwKICAgICAud3JpdGVfaGVhZGVyICAgPSBzZWdfd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICA9IHNlZ193cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgID0gc2VnX3dyaXRlX3RyYWlsZXIsCisgICAgLmRlaW5pdCAgICAgICAgID0gc2VnX2ZyZWUsCisgICAgLmNoZWNrX2JpdHN0cmVhbSA9IHNlZ19jaGVja19iaXRzdHJlYW0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJnNlZ19jbGFzcywKIH07CisjZW5kaWYKIAorI2lmIENPTkZJR19TVFJFQU1fU0VHTUVOVF9NVVhFUgogc3RhdGljIGNvbnN0IEFWQ2xhc3Mgc3NlZ19jbGFzcyA9IHsKICAgICAuY2xhc3NfbmFtZSA9ICJzdHJlYW1fc2VnbWVudCBtdXhlciIsCiAgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKQEAgLTk4Nyw4ICsxMTAwLDEyIEBACiAgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInN0cmVhbWluZyBzZWdtZW50IG11eGVyIiksCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFNlZ21lbnRDb250ZXh0KSwKICAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLmluaXQgICAgICAgICAgID0gc2VnX2luaXQsCiAgICAgLndyaXRlX2hlYWRlciAgID0gc2VnX3dyaXRlX2hlYWRlciwKICAgICAud3JpdGVfcGFja2V0ICAgPSBzZWdfd3JpdGVfcGFja2V0LAogICAgIC53cml0ZV90cmFpbGVyICA9IHNlZ193cml0ZV90cmFpbGVyLAorICAgIC5kZWluaXQgICAgICAgICA9IHNlZ19mcmVlLAorICAgIC5jaGVja19iaXRzdHJlYW0gPSBzZWdfY2hlY2tfYml0c3RyZWFtLAogICAgIC5wcml2X2NsYXNzICAgICA9ICZzc2VnX2NsYXNzLAogfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc2llcnJhdm1kLmMgYi9saWJhdmZvcm1hdC9zaWVycmF2bWQuYwppbmRleCAyYWIwZTM4Li42OTYwYzI4IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zaWVycmF2bWQuYworKysgYi9saWJhdmZvcm1hdC9zaWVycmF2bWQuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBTaWVycmEgVk1EIEZvcm1hdCBEZW11eGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDQgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTExOCwxOCArMTE4LDE4IEBACiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgMzMsIDEsIDEwKTsKICAgICAgICAgdm1kLT52aWRlb19zdHJlYW1faW5kZXggPSB2c3QtPmluZGV4OwotICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IHZtZC0+aXNfaW5kZW8zID8gQVZfQ09ERUNfSURfSU5ERU8zIDogQVZfQ09ERUNfSURfVk1EVklERU87Ci0gICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KLSAgICAgICAgdnN0LT5jb2RlYy0+d2lkdGggPSB3aWR0aDsKLSAgICAgICAgdnN0LT5jb2RlYy0+aGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICBpZih2bWQtPmlzX2luZGVvMyAmJiB2c3QtPmNvZGVjLT53aWR0aCA+IDMyMCl7Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT53aWR0aCA+Pj0gMTsKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPmhlaWdodCA+Pj0gMTsKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSB2bWQtPmlzX2luZGVvMyA/IEFWX0NPREVDX0lEX0lOREVPMyA6IEFWX0NPREVDX0lEX1ZNRFZJREVPOworICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgICAgIHZzdC0+Y29kZWNwYXItPndpZHRoID0gd2lkdGg7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgaWYodm1kLT5pc19pbmRlbzMgJiYgdnN0LT5jb2RlY3Bhci0+d2lkdGggPiAzMjApeworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+d2lkdGggPj49IDE7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgPj49IDE7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YSh2c3QtPmNvZGVjLCBWTURfSEVBREVSX1NJWkUpKQorICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHZzdC0+Y29kZWNwYXIsIFZNRF9IRUFERVJfU0laRSkpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBtZW1jcHkodnN0LT5jb2RlYy0+ZXh0cmFkYXRhLCB2bWQtPnZtZF9oZWFkZXIsIFZNRF9IRUFERVJfU0laRSk7CisgICAgICAgIG1lbWNweSh2c3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHZtZC0+dm1kX2hlYWRlciwgVk1EX0hFQURFUl9TSVpFKTsKICAgICB9CiAKICAgICAvKiBpZiBzYW1wbGUgcmF0ZSBpcyAwLCBhc3N1bWUgbm8gYXVkaW8gKi8KQEAgLTEzOSwzMCArMTM5LDM2IEBACiAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB2bWQtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfVk1EQVVESU87Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1ZNREFVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSB2bWQtPnNhbXBsZV9yYXRlOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gQVZfUkwxNigmdm1kLT52bWRfaGVhZGVyWzgwNl0pOworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiAmIDB4ODAwMCkgeworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAtKHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gLSAweDEwMDAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKKyAgICAgICAgfQogICAgICAgICBpZiAodm1kLT52bWRfaGVhZGVyWzgxMV0gJiAweDgwKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDI7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgfSBlbHNlIGlmICh2bWQtPnZtZF9oZWFkZXJbODExXSAmIDB4MikgeworICAgICAgICAgICAgLyogU2hpdmVycyAyIHN0ZXJlbyBhdWRpbyAqLworICAgICAgICAgICAgLyogRnJhbWUgbGVuZ3RoIGlzIGZvciAxIGNoYW5uZWwgKi8KKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA8PCAxOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKICAgICAgICAgfQotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gdm1kLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IEFWX1JMMTYoJnZtZC0+dm1kX2hlYWRlcls4MDZdKTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gJiAweDgwMDApIHsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gLShzdC0+Y29kZWMtPmJsb2NrX2FsaWduIC0gMHgxMDAwMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7Ci0gICAgICAgIH0KLSAgICAgICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAqCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAKICAgICAgICAgLyogY2FsY3VsYXRlIHB0cyAqLwotICAgICAgICBudW0gPSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOwotICAgICAgICBkZW4gPSBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgbnVtID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbjsKKyAgICAgICAgZGVuID0gc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAgICAgICAgIGF2X3JlZHVjZSgmbnVtLCAmZGVuLCBudW0sIGRlbiwgKDFVTDw8MzEpLTEpOwogICAgICAgICBpZiAodnN0KQogICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDMzLCBudW0sIGRlbik7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zaWZmLmMgYi9saWJhdmZvcm1hdC9zaWZmLmMKaW5kZXggMDI4ZjE4Yi4uZGRkMTcxNSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc2lmZi5jCisrKyBiL2xpYmF2Zm9ybWF0L3NpZmYuYwpAQCAtNzgsMTIgKzc4LDEyIEBACiAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIWFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1U4OwotICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICAgICAgICA9IDE7Ci0gICAgYXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgICAgICAgID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gODsKLSAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAgICAgICAgICAgPSBjLT5yYXRlOworICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gMTsKKyAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCAgICAgICAgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBhc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OworICAgIGFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgICAgICAgICA9IGMtPnJhdGU7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDE2LCAxLCBjLT5yYXRlKTsKICAgICBhc3QtPnN0YXJ0X3RpbWUgICAgICAgICAgICAgICAgICAgPSAwOwogICAgIHJldHVybiAwOwpAQCAtMTIzLDE0ICsxMjMsMTQgQEAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVkI7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgID0gTUtUQUcoJ1YnLCAnQicsICdWJywgJzEnKTsKLSAgICBzdC0+Y29kZWMtPndpZHRoICAgICAgPSB3aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBoZWlnaHQ7Ci0gICAgc3QtPmNvZGVjLT5waXhfZm10ICAgID0gQVZfUElYX0ZNVF9QQUw4OwotICAgIHN0LT5uYl9mcmFtZXMgICAgICAgICA9Ci0gICAgc3QtPmR1cmF0aW9uICAgICAgICAgID0gYy0+ZnJhbWVzOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9WQjsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSBNS1RBRygnVicsICdCJywgJ1YnLCAnMScpOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IHdpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ICAgICA9IGhlaWdodDsKKyAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCAgICAgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgc3QtPm5iX2ZyYW1lcyAgICAgICAgICAgID0KKyAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgICAgPSBjLT5mcmFtZXM7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMTYsIDEsIDEyKTsKIAogICAgIGMtPmN1cl9mcmFtZSA9IDA7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zbWFja2VyLmMgYi9saWJhdmZvcm1hdC9zbWFja2VyLmMKaW5kZXggZGU4YmJkYi4uOGEyMWNjMCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc21hY2tlci5jCisrKyBiL2xpYmF2Zm9ybWF0L3NtYWNrZXIuYwpAQCAtMTc1LDEyICsxNzUsMTIgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIHNtay0+dmlkZW9pbmRleCA9IHN0LT5pbmRleDsKLSAgICBzdC0+Y29kZWMtPndpZHRoID0gc21rLT53aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHNtay0+aGVpZ2h0OwotICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IEFWX1BJWF9GTVRfUEFMODsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1NNQUNLVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBzbWstPm1hZ2ljOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggPSBzbWstPndpZHRoOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gc21rLT5oZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBBVl9QSVhfRk1UX1BBTDg7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TTUFDS1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gc21rLT5tYWdpYzsKICAgICAvKiBTbWFja2VyIHVzZXMgMTAwMDAwIGFzIGludGVybmFsIHRpbWViYXNlICovCiAgICAgaWYoc21rLT5wdHNfaW5jIDwgMCkKICAgICAgICAgc21rLT5wdHNfaW5jID0gLXNtay0+cHRzX2luYzsKQEAgLTE5OCwzNiArMTk4LDM2IEBACiAgICAgICAgICAgICBpZiAoIWFzdFtpXSkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgc21rLT5pbmRleGVzW2ldID0gYXN0W2ldLT5pbmRleDsKLSAgICAgICAgICAgIGFzdFtpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBhc3RbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogICAgICAgICAgICAgaWYgKHNtay0+YWZsYWdzW2ldICYgU01LX0FVRF9CSU5LQVVEKSB7Ci0gICAgICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fUkRGVDsKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0JJTktBVURJT19SREZUOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzbWstPmFmbGFnc1tpXSAmIFNNS19BVURfVVNFRENUKSB7Ci0gICAgICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9CSU5LQVVESU9fRENUOworICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQklOS0FVRElPX0RDVDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc21rLT5hZmxhZ3NbaV0gJiBTTUtfQVVEX1BBQ0tFRCl7Ci0gICAgICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TTUFDS0FVRElPOwotICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWMtPmNvZGVjX3RhZyA9IE1LVEFHKCdTJywgJ00nLCAnSycsICdBJyk7CisgICAgICAgICAgICAgICAgYXN0W2ldLT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TTUFDS0FVRElPOworICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IE1LVEFHKCdTJywgJ00nLCAnSycsICdBJyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHNtay0+YWZsYWdzW2ldICYgU01LX0FVRF9TVEVSRU8pIHsKLSAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDI7Ci0gICAgICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMjsKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMTsKLSAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICAgICAgICAgIGFzdFtpXS0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzbWstPnJhdGVzW2ldOwotICAgICAgICAgICAgYXN0W2ldLT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gKHNtay0+YWZsYWdzW2ldICYgU01LX0FVRF8xNkJJVFMpID8gMTYgOiA4OwotICAgICAgICAgICAgaWYoYXN0W2ldLT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2ICYmIGFzdFtpXS0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9VOCkKLSAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKLSAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0W2ldLCA2NCwgMSwgYXN0W2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUKLSAgICAgICAgICAgICAgICAgICAgKiBhc3RbaV0tPmNvZGVjLT5jaGFubmVscyAqIGFzdFtpXS0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAvIDgpOworICAgICAgICAgICAgYXN0W2ldLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzbWstPnJhdGVzW2ldOworICAgICAgICAgICAgYXN0W2ldLT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gKHNtay0+YWZsYWdzW2ldICYgU01LX0FVRF8xNkJJVFMpID8gMTYgOiA4OworICAgICAgICAgICAgaWYoYXN0W2ldLT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDE2ICYmIGFzdFtpXS0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9VOCkKKyAgICAgICAgICAgICAgICBhc3RbaV0tPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZMRTsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0W2ldLCA2NCwgMSwgYXN0W2ldLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUKKyAgICAgICAgICAgICAgICAgICAgKiBhc3RbaV0tPmNvZGVjcGFyLT5jaGFubmVscyAqIGFzdFtpXS0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAvIDgpOwogICAgICAgICB9CiAgICAgfQogCiAKICAgICAvKiBsb2FkIHRyZWVzIHRvIGV4dHJhZGF0YSwgdGhleSB3aWxsIGJlIHVucGFja2VkIGJ5IGRlY29kZXIgKi8KLSAgICBpZihmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBzbWstPnRyZWVzaXplICsgMTYpKXsKKyAgICBpZihmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBzbWstPnRyZWVzaXplICsgMTYpKXsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJDYW5ub3QgYWxsb2NhdGUgJSJQUkl1MzIiIGJ5dGVzIG9mIGV4dHJhZGF0YVxuIiwKICAgICAgICAgICAgICAgIHNtay0+dHJlZXNpemUgKyAxNik7CkBAIC0yMzUsMTYgKzIzNSwxNiBAQAogICAgICAgICBhdl9mcmVlcCgmc21rLT5mcm1fZmxhZ3MpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIH0KLSAgICByZXQgPSBhdmlvX3JlYWQocGIsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICsgMTYsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgLSAxNik7Ci0gICAgaWYocmV0ICE9IHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgLSAxNil7CisgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDE2LCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplIC0gMTYpOworICAgIGlmKHJldCAhPSBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplIC0gMTYpewogICAgICAgICBhdl9mcmVlcCgmc21rLT5mcm1fc2l6ZSk7CiAgICAgICAgIGF2X2ZyZWVwKCZzbWstPmZybV9mbGFncyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAgICAgfQotICAgICgoaW50MzJfdCopc3QtPmNvZGVjLT5leHRyYWRhdGEpWzBdID0gYXZfbGUybmUzMihzbWstPm1tYXBfc2l6ZSk7Ci0gICAgKChpbnQzMl90KilzdC0+Y29kZWMtPmV4dHJhZGF0YSlbMV0gPSBhdl9sZTJuZTMyKHNtay0+bWNscl9zaXplKTsKLSAgICAoKGludDMyX3QqKXN0LT5jb2RlYy0+ZXh0cmFkYXRhKVsyXSA9IGF2X2xlMm5lMzIoc21rLT5mdWxsX3NpemUpOwotICAgICgoaW50MzJfdCopc3QtPmNvZGVjLT5leHRyYWRhdGEpWzNdID0gYXZfbGUybmUzMihzbWstPnR5cGVfc2l6ZSk7CisgICAgKChpbnQzMl90KilzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSlbMF0gPSBhdl9sZTJuZTMyKHNtay0+bW1hcF9zaXplKTsKKyAgICAoKGludDMyX3QqKXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKVsxXSA9IGF2X2xlMm5lMzIoc21rLT5tY2xyX3NpemUpOworICAgICgoaW50MzJfdCopc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpWzJdID0gYXZfbGUybmUzMihzbWstPmZ1bGxfc2l6ZSk7CisgICAgKChpbnQzMl90KilzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSlbM10gPSBhdl9sZTJuZTMyKHNtay0+dHlwZV9zaXplKTsKIAogICAgIHNtay0+Y3Vyc3RyZWFtID0gLTE7CiAgICAgc21rLT5uZXh0cG9zID0gYXZpb190ZWxsKHBiKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3NtanBlZ2RlYy5jIGIvbGliYXZmb3JtYXQvc21qcGVnZGVjLmMKaW5kZXggOTljYTJmZi4uYzE4NGMwZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc21qcGVnZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvc21qcGVnZGVjLmMKQEAgLTg4LDEzICs4OCwxMyBAQAogICAgICAgICAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKICAgICAgICAgICAgIGlmICghYXN0KQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcjgocGIpOwotICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3I4KHBiKTsKLSAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3RhZyAgID0gYXZpb19ybDMyKHBiKTsKLSAgICAgICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX3NtanBlZ19hdWRpb190YWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMTYocGIpOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19yOChwYik7CisgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfc21qcGVnX2F1ZGlvX3RhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190YWcpOwogICAgICAgICAgICAgYXN0LT5kdXJhdGlvbiAgICAgICAgICAgPSBkdXJhdGlvbjsKICAgICAgICAgICAgIHNjLT5hdWRpb19zdHJlYW1faW5kZXggID0gYXN0LT5pbmRleDsKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCAzMiwgMSwgMTAwMCk7CkBAIC0xMTEsMTMgKzExMSwxMyBAQAogICAgICAgICAgICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCAwKTsKICAgICAgICAgICAgIGlmICghdnN0KQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICB2c3QtPm5iX2ZyYW1lcyAgICAgICAgID0gYXZpb19yYjMyKHBiKTsKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgID0gYXZpb19yYjE2KHBiKTsKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPmhlaWdodCAgICAgPSBhdmlvX3JiMTYocGIpOwotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IGF2aW9fcmwzMihwYik7Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX3NtanBlZ192aWRlb190YWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcpOworICAgICAgICAgICAgdnN0LT5uYl9mcmFtZXMgICAgICAgICAgICA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+d2lkdGggICAgICA9IGF2aW9fcmIxNihwYik7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gYXZpb19yYjE2KHBiKTsKKyAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChmZl9jb2RlY19zbWpwZWdfdmlkZW9fdGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnKTsKICAgICAgICAgICAgIHZzdC0+ZHVyYXRpb24gICAgICAgICAgPSBkdXJhdGlvbjsKICAgICAgICAgICAgIHNjLT52aWRlb19zdHJlYW1faW5kZXggPSB2c3QtPmluZGV4OwogICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDMyLCAxLCAxMDAwKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3NtanBlZ2VuYy5jIGIvbGliYXZmb3JtYXQvc21qcGVnZW5jLmMKaW5kZXggNDMwYTQ5Ny4uNjhhMTI4NiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc21qcGVnZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvc21qcGVnZW5jLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICAgICBhdmlvX3diMzIocGIsIDApOwogICAgIGF2aW9fd2IzMihwYiwgMCk7CiAKKyAgICBmZl9zdGFuZGFyZGl6ZV9jcmVhdGlvbl90aW1lKHMpOwogICAgIHdoaWxlICgodCA9IGF2X2RpY3RfZ2V0KHMtPm1ldGFkYXRhLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpIHsKICAgICAgICAgYXZpb193bDMyKHBiLCBTTUpQRUdfVFhUKTsKICAgICAgICAgYXZpb193YjMyKHBiLCBzdHJsZW4odC0+a2V5KSArIHN0cmxlbih0LT52YWx1ZSkgKyAzKTsKQEAgLTU2LDIyICs1NywyMiBAQAogCiAgICAgZm9yIChuID0gMDsgbiA8IHMtPm5iX3N0cmVhbXM7IG4rKykgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW25dOwotICAgICAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzdC0+Y29kZWM7Ci0gICAgICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfc21qcGVnX2F1ZGlvX3RhZ3MsIGNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzdC0+Y29kZWNwYXI7CisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICB0YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX3NtanBlZ19hdWRpb190YWdzLCBwYXItPmNvZGVjX2lkKTsKICAgICAgICAgICAgIGlmICghdGFnKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInVuc3VwcG9ydGVkIGF1ZGlvIGNvZGVjXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZpb193bDMyKHBiLCBTTUpQRUdfU05EKTsKICAgICAgICAgICAgIGF2aW9fd2IzMihwYiwgOCk7Ci0gICAgICAgICAgICBhdmlvX3diMTYocGIsIGNvZGVjLT5zYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBhdmlvX3c4KHBiLCBjb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKTsKLSAgICAgICAgICAgIGF2aW9fdzgocGIsIGNvZGVjLT5jaGFubmVscyk7CisgICAgICAgICAgICBhdmlvX3diMTYocGIsIHBhci0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZpb193OChwYiwgcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICAgICAgYXZpb193OChwYiwgcGFyLT5jaGFubmVscyk7CiAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIHRhZyk7CiAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCAzMiwgMSwgMTAwMCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICB0YWcgPSBmZl9jb2RlY19nZXRfdGFnKGZmX2NvZGVjX3NtanBlZ192aWRlb190YWdzLCBjb2RlYy0+Y29kZWNfaWQpOworICAgICAgICB9IGVsc2UgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICAgICAgICAgIHRhZyA9IGZmX2NvZGVjX2dldF90YWcoZmZfY29kZWNfc21qcGVnX3ZpZGVvX3RhZ3MsIHBhci0+Y29kZWNfaWQpOwogICAgICAgICAgICAgaWYgKCF0YWcpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgdmlkZW8gY29kZWNcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CkBAIC03OSw4ICs4MCw4IEBACiAgICAgICAgICAgICBhdmlvX3dsMzIocGIsIFNNSlBFR19WSUQpOwogICAgICAgICAgICAgYXZpb193YjMyKHBiLCAxMik7CiAgICAgICAgICAgICBhdmlvX3diMzIocGIsIDApOwotICAgICAgICAgICAgYXZpb193YjE2KHBiLCBjb2RlYy0+d2lkdGgpOwotICAgICAgICAgICAgYXZpb193YjE2KHBiLCBjb2RlYy0+aGVpZ2h0KTsKKyAgICAgICAgICAgIGF2aW9fd2IxNihwYiwgcGFyLT53aWR0aCk7CisgICAgICAgICAgICBhdmlvX3diMTYocGIsIHBhci0+aGVpZ2h0KTsKICAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgdGFnKTsKICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCAxMDAwKTsKICAgICAgICAgfQpAQCAtOTcsMTEgKzk4LDExIEBACiAgICAgU01KUEVHTXV4Q29udGV4dCAqc21jID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdOwotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHN0LT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3QtPmNvZGVjcGFyOwogCi0gICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgYXZpb193bDMyKHBiLCBTTUpQRUdfU05ERCk7Ci0gICAgZWxzZSBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKQorICAgIGVsc2UgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCiAgICAgICAgIGF2aW9fd2wzMihwYiwgU01KUEVHX1ZJREQpOwogICAgIGVsc2UKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMjAsNyArMTIxLDcgQEAKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBpbnQ2NF90IGN1cnJlbnRwb3M7CiAKLSAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgaWYgKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CiAgICAgICAgIGN1cnJlbnRwb3MgPSBhdmlvX3RlbGwocGIpOwogICAgICAgICBhdmlvX3NlZWsocGIsIDEyLCBTRUVLX1NFVCk7CiAgICAgICAgIGF2aW9fd2IzMihwYiwgc21jLT5kdXJhdGlvbik7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zbW9vdGhzdHJlYW1pbmdlbmMuYyBiL2xpYmF2Zm9ybWF0L3Ntb290aHN0cmVhbWluZ2VuYy5jCmluZGV4IGYzNmU1ZmUuLjA5NDcxMmEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Ntb290aHN0cmVhbWluZ2VuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3Ntb290aHN0cmVhbWluZ2VuYy5jCkBAIC0xMjIsOCArMTIyLDggQEAKICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CiAgICAgICAgICAgICBvcy0+dGFpbF9vdXQgPSBvcy0+b3V0OwogICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJ0cnVuY2F0ZSIsICIwIiwgMCk7Ci0gICAgICAgICAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmb3MtPm91dCwgZnJhZy0+ZmlsZSwgQVZJT19GTEFHX1JFQURfV1JJVEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3MtPmN0eC0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cywgb3MtPmN0eC0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgICAgIHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZvcy0+b3V0LCBmcmFnLT5maWxlLCBBVklPX0ZMQUdfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3MtPmN0eC0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cywgb3MtPmN0eC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBvcy0+Y3R4LT5wcm90b2NvbF9ibGFja2xpc3QsIE5VTEwpOwogICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgb3MtPm91dCA9IG9zLT50YWlsX291dDsKQEAgLTEzMSw4ICsxMzEsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdl9kaWN0X3NldCgmb3B0cywgInRydW5jYXRlIiwgIjAiLCAwKTsKLSAgICAgICAgICAgIGZmdXJsX29wZW5fd2hpdGVsaXN0KCZvcy0+b3V0MiwgZnJhZy0+aW5mb2ZpbGUsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9zLT5jdHgtPmludGVycnVwdF9jYWxsYmFjaywgJm9wdHMsIG9zLT5jdHgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICBmZnVybF9vcGVuX3doaXRlbGlzdCgmb3MtPm91dDIsIGZyYWctPmluZm9maWxlLCBBVklPX0ZMQUdfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3MtPmN0eC0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0cywgb3MtPmN0eC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBvcy0+Y3R4LT5wcm90b2NvbF9ibGFja2xpc3QsIE5VTEwpOwogICAgICAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKICAgICAgICAgICAgIGZmdXJsX3NlZWsob3MtPm91dCwgb2Zmc2V0IC0gZnJhZy0+c3RhcnRfcG9zLCBTRUVLX1NFVCk7CiAgICAgICAgICAgICBpZiAob3MtPm91dDIpCkBAIC0xNDYsMTQgKzE0NiwxNCBAQAogCiBzdGF0aWMgdm9pZCBnZXRfcHJpdmF0ZV9kYXRhKE91dHB1dFN0cmVhbSAqb3MpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gb3MtPmN0eC0+c3RyZWFtc1swXS0+Y29kZWM7Ci0gICAgdWludDhfdCAqcHRyID0gY29kZWMtPmV4dHJhZGF0YTsKLSAgICBpbnQgc2l6ZSA9IGNvZGVjLT5leHRyYWRhdGFfc2l6ZTsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gb3MtPmN0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisgICAgdWludDhfdCAqcHRyID0gcGFyLT5leHRyYWRhdGE7CisgICAgaW50IHNpemUgPSBwYXItPmV4dHJhZGF0YV9zaXplOwogICAgIGludCBpOwotICAgIGlmIChjb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfSDI2NCkgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKICAgICAgICAgZmZfYXZjX3dyaXRlX2FubmV4Yl9leHRyYWRhdGEocHRyLCAmcHRyLCAmc2l6ZSk7CiAgICAgICAgIGlmICghcHRyKQotICAgICAgICAgICAgcHRyID0gY29kZWMtPmV4dHJhZGF0YTsKKyAgICAgICAgICAgIHB0ciA9IHBhci0+ZXh0cmFkYXRhOwogICAgIH0KICAgICBpZiAoIXB0cikKICAgICAgICAgcmV0dXJuOwpAQCAtMTYzLDcgKzE2Myw3IEBACiAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKICAgICAgICAgc25wcmludGYoJm9zLT5wcml2YXRlX3N0clsyKmldLCAzLCAiJTAyeCIsIHB0cltpXSk7CiBmYWlsOgotICAgIGlmIChwdHIgIT0gY29kZWMtPmV4dHJhZGF0YSkKKyAgICBpZiAocHRyICE9IHBhci0+ZXh0cmFkYXRhKQogICAgICAgICBhdl9mcmVlKHB0cik7CiB9CiAKQEAgLTE4Miw3ICsxODIsNyBAQAogICAgICAgICBpZiAob3MtPmN0eCAmJiBvcy0+Y3R4X2luaXRlZCkKICAgICAgICAgICAgIGF2X3dyaXRlX3RyYWlsZXIob3MtPmN0eCk7CiAgICAgICAgIGlmIChvcy0+Y3R4ICYmIG9zLT5jdHgtPnBiKQotICAgICAgICAgICAgYXZfZnJlZXAoJm9zLT5jdHgtPnBiKTsKKyAgICAgICAgICAgIGF2aW9fY29udGV4dF9mcmVlKCZvcy0+Y3R4LT5wYik7CiAgICAgICAgIGlmIChvcy0+Y3R4KQogICAgICAgICAgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KG9zLT5jdHgpOwogICAgICAgICBhdl9mcmVlcCgmb3MtPnByaXZhdGVfc3RyKTsKQEAgLTIyMSw4ICsyMjEsOCBAQAogICAgIGludCByZXQsIGksIHZpZGVvX2NodW5rcyA9IDAsIGF1ZGlvX2NodW5rcyA9IDAsIHZpZGVvX3N0cmVhbXMgPSAwLCBhdWRpb19zdHJlYW1zID0gMDsKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKIAotICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvTWFuaWZlc3QiLCBzLT5maWxlbmFtZSk7Ci0gICAgc25wcmludGYodGVtcF9maWxlbmFtZSwgc2l6ZW9mKHRlbXBfZmlsZW5hbWUpLCAiJXMvTWFuaWZlc3QudG1wIiwgcy0+ZmlsZW5hbWUpOworICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvTWFuaWZlc3QiLCBzLT51cmwpOworICAgIHNucHJpbnRmKHRlbXBfZmlsZW5hbWUsIHNpemVvZih0ZW1wX2ZpbGVuYW1lKSwgIiVzL01hbmlmZXN0LnRtcCIsIHMtPnVybCk7CiAgICAgcmV0ID0gcy0+aW9fb3BlbihzLCAmb3V0LCB0ZW1wX2ZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwpOwogICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gb3BlbiAlcyBmb3Igd3JpdGluZ1xuIiwgdGVtcF9maWxlbmFtZSk7CkBAIC0yMzUsNyArMjM1LDcgQEAKICAgICAgICAgICAgIEZyYWdtZW50ICpsYXN0ID0gb3MtPmZyYWdtZW50c1tvcy0+bmJfZnJhZ21lbnRzIC0gMV07CiAgICAgICAgICAgICBkdXJhdGlvbiA9IGxhc3QtPnN0YXJ0X3RpbWUgKyBsYXN0LT5kdXJhdGlvbjsKICAgICAgICAgfQotICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgICAgIHZpZGVvX2NodW5rcyA9IG9zLT5uYl9mcmFnbWVudHM7CiAgICAgICAgICAgICB2aWRlb19zdHJlYW1zKys7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yNjAsMTAgKzI2MCwxMCBAQAogICAgICAgICBhdmlvX3ByaW50ZihvdXQsICI8U3RyZWFtSW5kZXggVHlwZT1cInZpZGVvXCIgUXVhbGl0eUxldmVscz1cIiVkXCIgQ2h1bmtzPVwiJWRcIiBVcmw9XCJRdWFsaXR5TGV2ZWxzKHtiaXRyYXRlfSkvRnJhZ21lbnRzKHZpZGVvPXtzdGFydCB0aW1lfSlcIj5cbiIsIHZpZGVvX3N0cmVhbXMsIHZpZGVvX2NodW5rcyk7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgIE91dHB1dFN0cmVhbSAqb3MgPSAmYy0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zW2ldLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgbGFzdCA9IGk7Ci0gICAgICAgICAgICBhdmlvX3ByaW50ZihvdXQsICI8UXVhbGl0eUxldmVsIEluZGV4PVwiJWRcIiBCaXRyYXRlPVwiJSJQUklkNjQiXCIgRm91ckNDPVwiJXNcIiBNYXhXaWR0aD1cIiVkXCIgTWF4SGVpZ2h0PVwiJWRcIiBDb2RlY1ByaXZhdGVEYXRhPVwiJXNcIiAvPlxuIiwgaW5kZXgsIChpbnQ2NF90KXMtPnN0cmVhbXNbaV0tPmNvZGVjLT5iaXRfcmF0ZSwgb3MtPmZvdXJjYywgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPndpZHRoLCBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+aGVpZ2h0LCBvcy0+cHJpdmF0ZV9zdHIpOworICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiPFF1YWxpdHlMZXZlbCBJbmRleD1cIiVkXCIgQml0cmF0ZT1cIiUiUFJJZDY0IlwiIEZvdXJDQz1cIiVzXCIgTWF4V2lkdGg9XCIlZFwiIE1heEhlaWdodD1cIiVkXCIgQ29kZWNQcml2YXRlRGF0YT1cIiVzXCIgLz5cbiIsIGluZGV4LCBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Yml0X3JhdGUsIG9zLT5mb3VyY2MsIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT53aWR0aCwgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmhlaWdodCwgb3MtPnByaXZhdGVfc3RyKTsKICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgIH0KICAgICAgICAgb3V0cHV0X2NodW5rX2xpc3QoJmMtPnN0cmVhbXNbbGFzdF0sIG91dCwgZmluYWwsIGMtPmxvb2thaGVhZF9jb3VudCwgYy0+d2luZG93X3NpemUpOwpAQCAtMjc0LDEwICsyNzQsMTAgQEAKICAgICAgICAgYXZpb19wcmludGYob3V0LCAiPFN0cmVhbUluZGV4IFR5cGU9XCJhdWRpb1wiIFF1YWxpdHlMZXZlbHM9XCIlZFwiIENodW5rcz1cIiVkXCIgVXJsPVwiUXVhbGl0eUxldmVscyh7Yml0cmF0ZX0pL0ZyYWdtZW50cyhhdWRpbz17c3RhcnQgdGltZX0pXCI+XG4iLCBhdWRpb19zdHJlYW1zLCBhdWRpb19jaHVua3MpOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zID0gJmMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKQorICAgICAgICAgICAgaWYgKHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIGxhc3QgPSBpOwotICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiPFF1YWxpdHlMZXZlbCBJbmRleD1cIiVkXCIgQml0cmF0ZT1cIiUiUFJJZDY0IlwiIEZvdXJDQz1cIiVzXCIgU2FtcGxpbmdSYXRlPVwiJWRcIiBDaGFubmVscz1cIiVkXCIgQml0c1BlclNhbXBsZT1cIjE2XCIgUGFja2V0U2l6ZT1cIiVkXCIgQXVkaW9UYWc9XCIlZFwiIENvZGVjUHJpdmF0ZURhdGE9XCIlc1wiIC8+XG4iLCBpbmRleCwgKGludDY0X3Qpcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmJpdF9yYXRlLCBvcy0+Zm91cmNjLCBzLT5zdHJlYW1zW2ldLT5jb2RlYy0+c2FtcGxlX3JhdGUsIHMtPnN0cmVhbXNbaV0tPmNvZGVjLT5jaGFubmVscywgb3MtPnBhY2tldF9zaXplLCBvcy0+YXVkaW9fdGFnLCBvcy0+cHJpdmF0ZV9zdHIpOworICAgICAgICAgICAgYXZpb19wcmludGYob3V0LCAiPFF1YWxpdHlMZXZlbCBJbmRleD1cIiVkXCIgQml0cmF0ZT1cIiUiUFJJZDY0IlwiIEZvdXJDQz1cIiVzXCIgU2FtcGxpbmdSYXRlPVwiJWRcIiBDaGFubmVscz1cIiVkXCIgQml0c1BlclNhbXBsZT1cIjE2XCIgUGFja2V0U2l6ZT1cIiVkXCIgQXVkaW9UYWc9XCIlZFwiIENvZGVjUHJpdmF0ZURhdGE9XCIlc1wiIC8+XG4iLCBpbmRleCwgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmJpdF9yYXRlLCBvcy0+Zm91cmNjLCBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUsIHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jaGFubmVscywgb3MtPnBhY2tldF9zaXplLCBvcy0+YXVkaW9fdGFnLCBvcy0+cHJpdmF0ZV9zdHIpOwogICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQogICAgICAgICBvdXRwdXRfY2h1bmtfbGlzdCgmYy0+c3RyZWFtc1tsYXN0XSwgb3V0LCBmaW5hbCwgYy0+bG9va2FoZWFkX2NvdW50LCBjLT53aW5kb3dfc2l6ZSk7CkBAIC0yOTUsNyArMjk1LDcgQEAKICAgICBpbnQgcmV0ID0gMCwgaTsKICAgICBBVk91dHB1dEZvcm1hdCAqb2Zvcm1hdDsKIAotICAgIGlmIChta2RpcihzLT5maWxlbmFtZSwgMDc3NykgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7CisgICAgaWYgKG1rZGlyKHMtPnVybCwgMDc3NykgPT0gLTEgJiYgZXJybm8gIT0gRUVYSVNUKSB7CiAgICAgICAgIHJldCA9IEFWRVJST1IoZXJybm8pOwogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibWtkaXIgZmFpbGVkXG4iKTsKICAgICAgICAgZ290byBmYWlsOwpAQCAtMzE5LDEyICszMTksMTIgQEAKICAgICAgICAgQVZTdHJlYW0gKnN0OwogICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOwogCi0gICAgICAgIGlmICghcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmJpdF9yYXRlKSB7CisgICAgICAgIGlmICghcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmJpdF9yYXRlKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTm8gYml0IHJhdGUgc2V0IGZvciBzdHJlYW0gJWRcbiIsIGkpOwogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKG9zLT5kaXJuYW1lLCBzaXplb2Yob3MtPmRpcm5hbWUpLCAiJXMvUXVhbGl0eUxldmVscyglIlBSSWQ2NCIpIiwgcy0+ZmlsZW5hbWUsIChpbnQ2NF90KXMtPnN0cmVhbXNbaV0tPmNvZGVjLT5iaXRfcmF0ZSk7CisgICAgICAgIHNucHJpbnRmKG9zLT5kaXJuYW1lLCBzaXplb2Yob3MtPmRpcm5hbWUpLCAiJXMvUXVhbGl0eUxldmVscyglIlBSSWQ2NCIpIiwgcy0+dXJsLCBzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Yml0X3JhdGUpOwogICAgICAgICBpZiAobWtkaXIob3MtPmRpcm5hbWUsIDA3NzcpID09IC0xICYmIGVycm5vICE9IEVFWElTVCkgewogICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihlcnJubyk7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAibWtkaXIgZmFpbGVkXG4iKTsKQEAgLTMzMiw3ICszMzIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOwotICAgICAgICBpZiAoIWN0eCB8fCBmZl9jb3B5X3doaXRlbGlzdHMoY3R4LCBzKSA8IDApIHsKKyAgICAgICAgaWYgKCFjdHggfHwgZmZfY29weV93aGl0ZWJsYWNrbGlzdHMoY3R4LCBzKSA8IDApIHsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQpAQCAtMzQ0LDcgKzM0NCw3IEBACiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KLSAgICAgICAgYXZjb2RlY19jb3B5X2NvbnRleHQoc3QtPmNvZGVjLCBzLT5zdHJlYW1zW2ldLT5jb2RlYyk7CisgICAgICAgIGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KHN0LT5jb2RlY3Bhciwgcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXIpOwogICAgICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyA9IHMtPnN0cmVhbXNbaV0tPnNhbXBsZV9hc3BlY3RfcmF0aW87CiAgICAgICAgIHN0LT50aW1lX2Jhc2UgPSBzLT5zdHJlYW1zW2ldLT50aW1lX2Jhc2U7CiAKQEAgLTM2MywxMiArMzYzLDEyIEBACiAgICAgICAgIGF2aW9fZmx1c2goY3R4LT5wYik7CiAgICAgICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CiAgICAgICAgIHMtPnN0cmVhbXNbaV0tPnRpbWVfYmFzZSA9IHN0LT50aW1lX2Jhc2U7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBjLT5oYXNfdmlkZW8gPSAxOwogICAgICAgICAgICAgb3MtPnN0cmVhbV90eXBlX3RhZyA9ICJ2aWRlbyI7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CiAgICAgICAgICAgICAgICAgb3MtPmZvdXJjYyA9ICJIMjY0IjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEpIHsKICAgICAgICAgICAgICAgICBvcy0+Zm91cmNjID0gIldWQzEiOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgdmlkZW8gY29kZWNcbiIpOwpAQCAtMzc4LDEwICszNzgsMTAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGMtPmhhc19hdWRpbyA9IDE7CiAgICAgICAgICAgICBvcy0+c3RyZWFtX3R5cGVfdGFnID0gImF1ZGlvIjsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0FBQykgeworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CiAgICAgICAgICAgICAgICAgb3MtPmZvdXJjYyA9ICJBQUNMIjsKICAgICAgICAgICAgICAgICBvcy0+YXVkaW9fdGFnID0gMHhmZjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTUFQUk8pIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XTUFQUk8pIHsKICAgICAgICAgICAgICAgICBvcy0+Zm91cmNjID0gIldNQVAiOwogICAgICAgICAgICAgICAgIG9zLT5hdWRpb190YWcgPSAweDAxNjI7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMzg5LDcgKzM4OSw3IEBACiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9zLT5wYWNrZXRfc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPyBzdC0+Y29kZWMtPmJsb2NrX2FsaWduIDogNDsKKyAgICAgICAgICAgIG9zLT5wYWNrZXRfc2l6ZSA9IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPyBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduIDogNDsKICAgICAgICAgfQogICAgICAgICBnZXRfcHJpdmF0ZV9kYXRhKG9zKTsKICAgICB9CkBAIC01MjYsNyArNTI2LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvdGVtcCIsIG9zLT5kaXJuYW1lKTsKLSAgICAgICAgcmV0ID0gZmZ1cmxfb3Blbl93aGl0ZWxpc3QoJm9zLT5vdXQsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsICZzLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsIHMtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgIHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZvcy0+b3V0LCBmaWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFLCAmcy0+aW50ZXJydXB0X2NhbGxiYWNrLCBOVUxMLCBzLT5wcm90b2NvbF93aGl0ZWxpc3QsIHMtPnByb3RvY29sX2JsYWNrbGlzdCwgTlVMTCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIG9zLT5jdXJfc3RhcnRfcG9zID0gb3MtPnRhaWxfcG9zOwpAQCAtNTg4LDcgKzU4OCw3IEBACiAgICAgaWYgKHN0LT5maXJzdF9kdHMgPT0gQVZfTk9QVFNfVkFMVUUpCiAgICAgICAgIHN0LT5maXJzdF9kdHMgPSBwa3QtPmR0czsKIAotICAgIGlmICgoIWMtPmhhc192aWRlbyB8fCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSAmJgorICAgIGlmICgoIWMtPmhhc192aWRlbyB8fCBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSAmJgogICAgICAgICBhdl9jb21wYXJlX3RzKHBrdC0+ZHRzIC0gc3QtPmZpcnN0X2R0cywgc3QtPnRpbWVfYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICBlbmRfZHRzLCBBVl9USU1FX0JBU0VfUSkgPj0gMCAmJgogICAgICAgICBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZICYmIG9zLT5wYWNrZXRzX3dyaXR0ZW4pIHsKQEAgLTYwOSw5ICs2MDksOSBAQAogCiAgICAgaWYgKGMtPnJlbW92ZV9hdF9leGl0KSB7CiAgICAgICAgIGNoYXIgZmlsZW5hbWVbMTAyNF07Ci0gICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvTWFuaWZlc3QiLCBzLT5maWxlbmFtZSk7CisgICAgICAgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMvTWFuaWZlc3QiLCBzLT51cmwpOwogICAgICAgICB1bmxpbmsoZmlsZW5hbWUpOwotICAgICAgICBybWRpcihzLT5maWxlbmFtZSk7CisgICAgICAgIHJtZGlyKHMtPnVybCk7CiAgICAgfQogCiAgICAgaXNtX2ZyZWUocyk7CkBAIC02NDcsNiArNjQ3LDUgQEAKICAgICAud3JpdGVfaGVhZGVyICAgPSBpc21fd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICA9IGlzbV93cml0ZV9wYWNrZXQsCiAgICAgLndyaXRlX3RyYWlsZXIgID0gaXNtX3dyaXRlX3RyYWlsZXIsCi0gICAgLmNvZGVjX3RhZyAgICAgID0gKGNvbnN0IEFWQ29kZWNUYWcqIGNvbnN0IFtdKXsgZmZfbXA0X29ial90eXBlLCAwIH0sCiAgICAgLnByaXZfY2xhc3MgICAgID0gJmlzbV9jbGFzcywKIH07CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zbXVzaC5jIGIvbGliYXZmb3JtYXQvc211c2guYwppbmRleCBhYmI2OTg5Li5mZTU0NGQ4IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zbXVzaC5jCisrKyBiL2xpYmF2Zm9ybWF0L3NtdXNoLmMKQEAgLTEyOSw3ICsxMjksNiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNTEsMTkgKzE1MCwxOSBAQAogICAgIHZzdC0+ZHVyYXRpb24gICAgICAgICAgPQogICAgIHZzdC0+bmJfZnJhbWVzICAgICAgICAgPSBuZnJhbWVzOwogICAgIHZzdC0+YXZnX2ZyYW1lX3JhdGUgICAgPSBhdl9pbnZfcSh2c3QtPnRpbWVfYmFzZSk7Ci0gICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfU0FOTTsKLSAgICB2c3QtPmNvZGVjLT5jb2RlY190YWcgID0gMDsKLSAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgID0gd2lkdGg7Ci0gICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGhlaWdodDsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9TQU5NOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSAwOworICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSB3aWR0aDsKKyAgICB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gaGVpZ2h0OwogCiAgICAgaWYgKCFzbXVzaC0+dmVyc2lvbikgewotICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHZzdC0+Y29kZWMsIDEwMjQgKyAyKSkKKyAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YSh2c3QtPmNvZGVjcGFyLCAxMDI0ICsgMikpCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgIEFWX1dMMTYodnN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBzdWJ2ZXJzaW9uKTsKKyAgICAgICAgQVZfV0wxNih2c3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIHN1YnZlcnNpb24pOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgICAgICAgICBBVl9XTDMyKHZzdC0+Y29kZWMtPmV4dHJhZGF0YSArIDIgKyBpICogNCwgcGFsZXR0ZVtpXSk7CisgICAgICAgICAgICBBVl9XTDMyKHZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDIgKyBpICogNCwgcGFsZXR0ZVtpXSk7CiAgICAgfQogCiAgICAgaWYgKGdvdF9hdWRpbykgewpAQCAtMTc0LDEzICsxNzMsMTMgQEAKICAgICAgICAgc211c2gtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IGFzdC0+aW5kZXg7CiAKICAgICAgICAgYXN0LT5zdGFydF90aW1lICAgICAgICAgPSAwOwotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9WSU1BOwotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgICA9IDA7Ci0gICAgICAgIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gY2hhbm5lbHM7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FEUENNX1ZJTUE7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgID0gMDsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKIAotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgNjQsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDY0LCAxLCBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zb2wuYyBiL2xpYmF2Zm9ybWF0L3NvbC5jCmluZGV4IGM5NDM0NTMuLjU3OTZmOGQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3NvbC5jCisrKyBiL2xpYmF2Zm9ybWF0L3NvbC5jCkBAIC0xMTAsMTMgKzExMCwxMyBAQAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gaWQ7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGNvZGVjOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU87Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHJhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gaWQ7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGNvZGVjOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU87CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHJhdGU7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHJhdGUpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc294ZGVjLmMgYi9saWJhdmZvcm1hdC9zb3hkZWMuYwppbmRleCBhZWM0Mjg0Li4xMmE5NGM4IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zb3hkZWMuYworKysgYi9saWJhdmZvcm1hdC9zb3hkZWMuYwpAQCAtNTUsMjEgKzU1LDIxIEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CiAKICAgICBpZiAoYXZpb19ybDMyKHBiKSA9PSBTT1hfVEFHKSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzMyTEU7CiAgICAgICAgIGhlYWRlcl9zaXplICAgICAgICAgPSBhdmlvX3JsMzIocGIpOwogICAgICAgICBhdmlvX3NraXAocGIsIDgpOyAvKiBzYW1wbGUgY291bnQgKi8KICAgICAgICAgc2FtcGxlX3JhdGUgICAgICAgICA9IGF2X2ludDJkb3VibGUoYXZpb19ybDY0KHBiKSk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSBhdmlvX3JsMzIocGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gYXZpb19ybDMyKHBiKTsKICAgICAgICAgY29tbWVudF9zaXplICAgICAgICA9IGF2aW9fcmwzMihwYik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJCRTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMzJCRTsKICAgICAgICAgaGVhZGVyX3NpemUgICAgICAgICA9IGF2aW9fcmIzMihwYik7CiAgICAgICAgIGF2aW9fc2tpcChwYiwgOCk7IC8qIHNhbXBsZSBjb3VudCAqLwogICAgICAgICBzYW1wbGVfcmF0ZSAgICAgICAgID0gYXZfaW50MmRvdWJsZShhdmlvX3JiNjQocGIpKTsKLSAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBhdmlvX3JiMzIocGIpOwogICAgICAgICBjb21tZW50X3NpemUgICAgICAgID0gYXZpb19yYjMyKHBiKTsKICAgICB9CiAKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgICAgICAgIHNhbXBsZV9yYXRlX2ZyYWMpOwogCiAgICAgaWYgKChoZWFkZXJfc2l6ZSArIDQpICYgNyB8fCBoZWFkZXJfc2l6ZSA8IFNPWF9GSVhFRF9IRFIgKyBjb21tZW50X3NpemUKLSAgICAgICAgfHwgc3QtPmNvZGVjLT5jaGFubmVscyA+IDY1NTM1KSAvKiBSZXNlcnZlIHRvcCAxNiBiaXRzICovIHsKKyAgICAgICAgfHwgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA+IDY1NTM1KSAvKiBSZXNlcnZlIHRvcCAxNiBiaXRzICovIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImludmFsaWQgaGVhZGVyXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQpAQCAtMTExLDE1ICsxMTEsMTUgQEAKIAogICAgIGF2aW9fc2tpcChwYiwgaGVhZGVyX3NpemUgLSBTT1hfRklYRURfSERSIC0gY29tbWVudF9zaXplKTsKIAotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gc2FtcGxlX3JhdGU7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAzMjsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICAgICAgICA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsczsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduICAgICAgICAgICA9IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgLyA4OworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gc2FtcGxlX3JhdGU7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAzMjsKKyAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlICAgICAgICAgICAgICA9IChpbnQ2NF90KXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduICAgICAgICAgICA9IHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgLyA4OwogCi0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc294ZW5jLmMgYi9saWJhdmZvcm1hdC9zb3hlbmMuYwppbmRleCBiZmE5MDAyLi43YjM3YmQ0IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zb3hlbmMuYworKysgYi9saWJhdmZvcm1hdC9zb3hlbmMuYwpAQCAtNDUsNyArNDUsNyBAQAogewogICAgIFNvWENvbnRleHQgKnNveCA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICpjb21tZW50OwogICAgIHNpemVfdCBjb21tZW50X2xlbiA9IDAsIGNvbW1lbnRfc2l6ZTsKIApAQCAtNTYsMTkgKzU2LDE5IEBACiAKICAgICBzb3gtPmhlYWRlcl9zaXplID0gU09YX0ZJWEVEX0hEUiArIGNvbW1lbnRfc2l6ZTsKIAotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJMRSkgeworICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJMRSkgewogICAgICAgICBmZmlvX3dmb3VyY2MocGIsICIuU29YIik7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgc294LT5oZWFkZXJfc2l6ZSk7CiAgICAgICAgIGF2aW9fd2w2NChwYiwgMCk7IC8qIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgICAgIGF2aW9fd2w2NChwYiwgYXZfZG91YmxlMmludChlbmMtPnNhbXBsZV9yYXRlKSk7Ci0gICAgICAgIGF2aW9fd2wzMihwYiwgZW5jLT5jaGFubmVscyk7CisgICAgICAgIGF2aW9fd2w2NChwYiwgYXZfZG91YmxlMmludChwYXItPnNhbXBsZV9yYXRlKSk7CisgICAgICAgIGF2aW9fd2wzMihwYiwgcGFyLT5jaGFubmVscyk7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgY29tbWVudF9zaXplKTsKLSAgICB9IGVsc2UgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MzMkJFKSB7CisgICAgfSBlbHNlIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJCRSkgewogICAgICAgICBmZmlvX3dmb3VyY2MocGIsICJYb1MuIik7CiAgICAgICAgIGF2aW9fd2IzMihwYiwgc294LT5oZWFkZXJfc2l6ZSk7CiAgICAgICAgIGF2aW9fd2I2NChwYiwgMCk7IC8qIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgICAgIGF2aW9fd2I2NChwYiwgYXZfZG91YmxlMmludChlbmMtPnNhbXBsZV9yYXRlKSk7Ci0gICAgICAgIGF2aW9fd2IzMihwYiwgZW5jLT5jaGFubmVscyk7CisgICAgICAgIGF2aW9fd2I2NChwYiwgYXZfZG91YmxlMmludChwYXItPnNhbXBsZV9yYXRlKSk7CisgICAgICAgIGF2aW9fd2IzMihwYiwgcGFyLT5jaGFubmVscyk7CiAgICAgICAgIGF2aW9fd2IzMihwYiwgY29tbWVudF9zaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBjb2RlYzsgdXNlIHBjbV9zMzJsZSBvciBwY21fczMyYmVcbiIpOwpAQCAtODksMTQgKzg5LDE0IEBACiB7CiAgICAgU29YQ29udGV4dCAqc294ID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAKLSAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CiAgICAgICAgIC8qIHVwZGF0ZSBudW1iZXIgb2Ygc2FtcGxlcyAqLwogICAgICAgICBpbnQ2NF90IGZpbGVfc2l6ZSA9IGF2aW9fdGVsbChwYik7CiAgICAgICAgIGludDY0X3QgbnVtX3NhbXBsZXMgPSAoZmlsZV9zaXplIC0gc294LT5oZWFkZXJfc2l6ZSAtIDRMTCkgPj4gMkxMOwogICAgICAgICBhdmlvX3NlZWsocGIsIDgsIFNFRUtfU0VUKTsKLSAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MzMkxFKSB7CisgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJMRSkgewogICAgICAgICAgICAgYXZpb193bDY0KHBiLCBudW1fc2FtcGxlcyk7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgYXZpb193YjY0KHBiLCBudW1fc2FtcGxlcyk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zcGRpZi5oIGIvbGliYXZmb3JtYXQvc3BkaWYuaAppbmRleCBmZWU0ZmY3Li4wMDM5ZmNmIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zcGRpZi5oCisrKyBiL2xpYmF2Zm9ybWF0L3NwZGlmLmgKQEAgLTU0LDggKzU0LDggQEAKIAogc3RhdGljIGNvbnN0IHVpbnQxNl90IHNwZGlmX21wZWdfcGt0X29mZnNldFsyXVszXSA9IHsKICAgICAvL0xBWUVSMSAgTEFZRVIyICBMQVlFUjMKLSAgICB7IDMwNzIsICAgIDkyMTYsICAgNDYwOCB9LCAvLyBNUEVHMiBMU0YKLSAgICB7IDE1MzYsICAgIDQ2MDgsICAgNDYwOCB9LCAvLyBNUEVHMQorICAgIHsgMzA3MiwgICAgOTIxNiwgICA0NjA4IH0sIC8vIE1QRUctMiBMU0YKKyAgICB7IDE1MzYsICAgIDQ2MDgsICAgNDYwOCB9LCAvLyBNUEVHLTEKIH07CiAKIHZvaWQgZmZfc3BkaWZfYnN3YXBfYnVmMTYodWludDE2X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyYywgaW50IHcpOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3BkaWZkZWMuYyBiL2xpYmF2Zm9ybWF0L3NwZGlmZGVjLmMKaW5kZXggYTJmMDZhOS4uMjFiZmNlNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc3BkaWZkZWMuYworKysgYi9saWJhdmZvcm1hdC9zcGRpZmRlYy5jCkBAIC0yNSwxOCArMjUsMjIgQEAKICAqIEBhdXRob3IgQW5zc2kgSGFubnVsYQogICovCiAKKyNpbmNsdWRlICJsaWJhdnV0aWwvYnN3YXAuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYWMzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hZHRzX3BhcnNlci5oIgorCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJzcGRpZi5oIgotI2luY2x1ZGUgImxpYmF2Y29kZWMvYWMzLmgiCi0jaW5jbHVkZSAibGliYXZjb2RlYy9hYWNhZHRzZGVjLmgiCiAKIHN0YXRpYyBpbnQgc3BkaWZfZ2V0X29mZnNldF9hbmRfY29kZWMoQVZGb3JtYXRDb250ZXh0ICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIElFQzYxOTM3RGF0YVR5cGUgZGF0YV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIGludCAqb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWQ29kZWNJRCAqY29kZWMpCiB7Ci0gICAgQUFDQURUU0hlYWRlckluZm8gYWFjX2hkcjsKLSAgICBHZXRCaXRDb250ZXh0IGdiYzsKKyAgICB1aW50MzJfdCBzYW1wbGVzOworICAgIHVpbnQ4X3QgZnJhbWVzOworICAgIGludCByZXQ7CiAKICAgICBzd2l0Y2ggKGRhdGFfdHlwZSAmIDB4ZmYpIHsKICAgICBjYXNlIElFQzYxOTM3X0FDMzoKQEAgLTU2LDEzICs2MCwxMyBAQAogICAgICAgICAqY29kZWMgPSBBVl9DT0RFQ19JRF9NUDM7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgSUVDNjE5MzdfTVBFRzJfQUFDOgotICAgICAgICBpbml0X2dldF9iaXRzKCZnYmMsIGJ1ZiwgQUFDX0FEVFNfSEVBREVSX1NJWkUgKiA4KTsKLSAgICAgICAgaWYgKGF2cHJpdl9hYWNfcGFyc2VfaGVhZGVyKCZnYmMsICZhYWNfaGRyKSA8IDApIHsKKyAgICAgICAgcmV0ID0gYXZfYWR0c19oZWFkZXJfcGFyc2UoYnVmLCAmc2FtcGxlcywgJmZyYW1lcyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICBpZiAocykgLyogYmUgc2lsZW50IGR1cmluZyBhIHByb2JlICovCiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgQUFDIHBhY2tldCBpbiBJRUMgNjE5MzdcbiIpOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9Ci0gICAgICAgICpvZmZzZXQgPSBhYWNfaGRyLnNhbXBsZXMgPDwgMjsKKyAgICAgICAgKm9mZnNldCA9IHNhbXBsZXMgPDwgMjsKICAgICAgICAgKmNvZGVjID0gQVZfQ09ERUNfSURfQUFDOwogICAgICAgICBicmVhazsKICAgICBjYXNlIElFQzYxOTM3X01QRUcyX0xBWUVSMV9MU0Y6CkBAIC0xMDAsNyArMTA0LDcgQEAKIH0KIAogLyogTGFyZ2VzdCBvZmZzZXQgYmV0d2VlbiBidXJzdHMgd2UgY3VycmVudGx5IGhhbmRsZSwgaS5lLiBBQUMgd2l0aAotICAgYWFjX2hkci5zYW1wbGVzID0gNDA5NiAqLworICAgc2FtcGxlcyA9IDQwOTYgKi8KICNkZWZpbmUgU1BESUZfTUFYX09GRlNFVCAxNjM4NAogCiBzdGF0aWMgaW50IHNwZGlmX3Byb2JlKEFWUHJvYmVEYXRhICpwKQpAQCAtMTMyLDcgKzEzNiw3IEBACiAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgICBjb25zZWN1dGl2ZV9jb2RlcyA9IDA7CiAKLSAgICAgICAgICAgIGlmIChidWYgKyA0ICsgQUFDX0FEVFNfSEVBREVSX1NJWkUgPiBwX2J1ZiArIGJ1Zl9zaXplKQorICAgICAgICAgICAgaWYgKGJ1ZiArIDQgKyBBVl9BQUNfQURUU19IRUFERVJfU0laRSA+IHBfYnVmICsgYnVmX3NpemUpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIC8qIGNvbnRpbnVlIHByb2JpbmcgdG8gZmluZCBtb3JlIHN5bmMgY29kZXMgKi8KQEAgLTIxNSwxNyArMjE5LDE3IEBACiAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0KLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gY29kZWNfaWQ7Ci0gICAgfSBlbHNlIGlmIChjb2RlY19pZCAhPSBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gY29kZWNfaWQ7CisgICAgfSBlbHNlIGlmIChjb2RlY19pZCAhPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKICAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIkNvZGVjIGNoYW5nZSBpbiBJRUMgNjE5MzciKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KIAotICAgIGlmICghcy0+Yml0X3JhdGUgJiYgcy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlKQorICAgIGlmICghcy0+Yml0X3JhdGUgJiYgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKQogICAgICAgICAvKiBzdHJlYW0gYml0cmF0ZSBtYXRjaGVzIDE2LWJpdCBzdGVyZW8gUENNIGJpdHJhdGUgZm9yIGN1cnJlbnRseQogICAgICAgICAgICBzdXBwb3J0ZWQgY29kZWNzICovCi0gICAgICAgIHMtPmJpdF9yYXRlID0gMiAqIDE2ICogcy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlOworICAgICAgICBzLT5iaXRfcmF0ZSA9IDIgKiAxNiAqIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3BkaWZlbmMuYyBiL2xpYmF2Zm9ybWF0L3NwZGlmZW5jLmMKaW5kZXggNjRjNWYzOC4uOTUxNGZmOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc3BkaWZlbmMuYworKysgYi9saWJhdmZvcm1hdC9zcGRpZmVuYy5jCkBAIC0zMiw3ICszMiw3IEBACiAvKgogICogVGVybWlub2xvZ3kgdXNlZCBpbiBzcGVjaWZpY2F0aW9uOgogICogZGF0YS1idXJzdCAtIElFQzYxOTM3IGZyYW1lLCBjb250YWlucyBoZWFkZXIgYW5kIGVuY2Fwc3VsZWQgZnJhbWUKLSAqIGJ1cnN0LXByZWFtYnVsZSAtIElFQzYxOTM3IGZyYW1lIGhlYWRlciwgY29udGFpbnMgMTYtYml0cyB3b3JkcyBuYW1lZCBQYSwgUGIsIFBjIGFuZCBQZAorICogYnVyc3QtcHJlYW1ibGUgLSBJRUM2MTkzNyBmcmFtZSBoZWFkZXIsIGNvbnRhaW5zIDE2LWJpdCB3b3JkcyBuYW1lZCBQYSwgUGIsIFBjIGFuZCBQZAogICogYnVyc3QtcGF5bG9hZCAtIGVuY2Fwc3VsZWQgZnJhbWUKICAqIFBhLCBQYiAtIHN5bmN3b3JkIC0gMHhGODcyLCAweDRFMUYKICAqIFBjIC0gYnVyc3QtaW5mbywgY29udGFpbnMgZGF0YS10eXBlIChiaXRzIDAtNiksIGVycm9yIGZsYWcgKGJpdCA3KSwgZGF0YS10eXBlLWRlcGVuZGVudCBpbmZvIChiaXRzIDgtMTIpCkBAIC01MCw5ICs1MCw5IEBACiAjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgogI2luY2x1ZGUgInNwZGlmLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9hYzMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2FkdHNfcGFyc2VyLmgiCiAjaW5jbHVkZSAibGliYXZjb2RlYy9kY2EuaCIKICNpbmNsdWRlICJsaWJhdmNvZGVjL2RjYV9zeW5jd29yZHMuaCIKLSNpbmNsdWRlICJsaWJhdmNvZGVjL2FhY2FkdHNkZWMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCiAKIHR5cGVkZWYgc3RydWN0IElFQzYxOTM3Q29udGV4dCB7CkBAIC0xMTgsNyArMTE4LDggQEAKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBlYWMzX3JlcGVhdFs0XSA9IHs2LCAzLCAyLCAxfTsKICAgICBpbnQgcmVwZWF0ID0gMTsKIAotICAgIGlmICgocGt0LT5kYXRhWzRdICYgMHhjMCkgIT0gMHhjMCkgLyogZnNjb2QgKi8KKyAgICBpbnQgYnNpZCA9IHBrdC0+ZGF0YVs1XSA+PiAzOworICAgIGlmIChic2lkID4gMTAgJiYgKHBrdC0+ZGF0YVs0XSAmIDB4YzApICE9IDB4YzApIC8qIGZzY29kICovCiAgICAgICAgIHJlcGVhdCA9IGVhYzNfcmVwZWF0Wyhwa3QtPmRhdGFbNF0gJiAweDMwKSA+PiA0XTsgLyogbnVtYmxrc2NvZCAqLwogCiAgICAgY3R4LT5oZF9idWYgPSBhdl9mYXN0X3JlYWxsb2MoY3R4LT5oZF9idWYsICZjdHgtPmhkX2J1Zl9zaXplLCBjdHgtPmhkX2J1Zl9maWxsZWQgKyBwa3QtPnNpemUpOwpAQCAtMTQ3LDcgKzE0OCw3IEBACiAgKiBEVFMgdHlwZSBJViAoRFRTLUhEKSBjYW4gYmUgdHJhbnNtaXR0ZWQgd2l0aCB2YXJpb3VzIGZyYW1lIHJlcGV0aXRpb24KICAqIHBlcmlvZHM7IGxvbmdlciByZXBldGl0aW9uIHBlcmlvZHMgYWxsb3cgZm9yIGxvbmdlciBwYWNrZXRzIGFuZCB0aGVyZWZvcmUKICAqIGhpZ2hlciBiaXRyYXRlLiBMb25nZXIgcmVwZXRpdGlvbiBwZXJpb2RzIG1lYW4gdGhhdCB0aGUgY29uc3RhbnQgYml0cmF0ZSBvZgotICogdGhlIG91dHB1dHRlZCBJRUMgNjE5Mzcgc3RyZWFtIGlzIGhpZ2hlci4KKyAqIHRoZSBvdXRwdXQgSUVDIDYxOTM3IHN0cmVhbSBpcyBoaWdoZXIuCiAgKiBUaGUgcmVwZXRpdGlvbiBwZXJpb2QgaXMgbWVhc3VyZWQgaW4gSUVDIDYwOTU4IGZyYW1lcyAoNCBieXRlcykuCiAgKi8KIHN0YXRpYyBpbnQgc3BkaWZfZHRzNF9zdWJ0eXBlKGludCBwZXJpb2QpCkBAIC0zMTksOCArMzIwLDggQEAKIAogc3RhdGljIGNvbnN0IGVudW0gSUVDNjE5MzdEYXRhVHlwZSBtcGVnX2RhdGFfdHlwZVsyXVszXSA9IHsKICAgICAvLyAgICAgTEFZRVIxICAgICAgICAgICAgICAgICAgICAgIExBWUVSMiAgICAgICAgICAgICAgICAgIExBWUVSMwotICAgIHsgSUVDNjE5MzdfTVBFRzJfTEFZRVIxX0xTRiwgSUVDNjE5MzdfTVBFRzJfTEFZRVIyX0xTRiwgSUVDNjE5MzdfTVBFRzJfTEFZRVIzX0xTRiB9LC8vTVBFRzIgTFNGCi0gICAgeyBJRUM2MTkzN19NUEVHMV9MQVlFUjEsICAgICBJRUM2MTkzN19NUEVHMV9MQVlFUjIzLCAgICBJRUM2MTkzN19NUEVHMV9MQVlFUjIzIH0sICAgLy9NUEVHMQorICAgIHsgSUVDNjE5MzdfTVBFRzJfTEFZRVIxX0xTRiwgSUVDNjE5MzdfTVBFRzJfTEFZRVIyX0xTRiwgSUVDNjE5MzdfTVBFRzJfTEFZRVIzX0xTRiB9LCAvLyBNUEVHLTIgTFNGCisgICAgeyBJRUM2MTkzN19NUEVHMV9MQVlFUjEsICAgICBJRUM2MTkzN19NUEVHMV9MQVlFUjIzLCAgICBJRUM2MTkzN19NUEVHMV9MQVlFUjIzIH0sICAgIC8vIE1QRUctMQogfTsKIAogc3RhdGljIGludCBzcGRpZl9oZWFkZXJfbXBlZyhBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCkBAIC0zNDksMTkgKzM1MCwxOCBAQAogc3RhdGljIGludCBzcGRpZl9oZWFkZXJfYWFjKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBJRUM2MTkzN0NvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKLSAgICBBQUNBRFRTSGVhZGVySW5mbyBoZHI7Ci0gICAgR2V0Qml0Q29udGV4dCBnYmM7CisgICAgdWludDMyX3Qgc2FtcGxlczsKKyAgICB1aW50OF90IGZyYW1lczsKICAgICBpbnQgcmV0OwogCi0gICAgaW5pdF9nZXRfYml0cygmZ2JjLCBwa3QtPmRhdGEsIEFBQ19BRFRTX0hFQURFUl9TSVpFICogOCk7Ci0gICAgcmV0ID0gYXZwcml2X2FhY19wYXJzZV9oZWFkZXIoJmdiYywgJmhkcik7CisgICAgcmV0ID0gYXZfYWR0c19oZWFkZXJfcGFyc2UocGt0LT5kYXRhLCAmc2FtcGxlcywgJmZyYW1lcyk7CiAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIldyb25nIEFBQyBmaWxlIGZvcm1hdFxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGN0eC0+cGt0X29mZnNldCA9IGhkci5zYW1wbGVzIDw8IDI7Ci0gICAgc3dpdGNoIChoZHIubnVtX2FhY19mcmFtZXMpIHsKKyAgICBjdHgtPnBrdF9vZmZzZXQgPSBzYW1wbGVzIDw8IDI7CisgICAgc3dpdGNoIChmcmFtZXMpIHsKICAgICBjYXNlIDE6CiAgICAgICAgIGN0eC0+ZGF0YV90eXBlID0gSUVDNjE5MzdfTVBFRzJfQUFDOwogICAgICAgICBicmVhazsKQEAgLTM3Myw3ICszNzMsNyBAQAogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIiUiUFJJdTMyIiBzYW1wbGVzIGluIEFBQyBmcmFtZSBub3Qgc3VwcG9ydGVkXG4iLCBoZHIuc2FtcGxlcyk7CisgICAgICAgICAgICAgICAiJSJQUkl1MzIiIHNhbXBsZXMgaW4gQUFDIGZyYW1lIG5vdCBzdXBwb3J0ZWRcbiIsIHNhbXBsZXMpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KICAgICAvL1RPRE8gRGF0YSB0eXBlIGRlcGVuZGVudCBpbmZvIChMQyBwcm9maWxlL1NCUikKQEAgLTQ0NCw3ICs0NDQsNyBAQAogewogICAgIElFQzYxOTM3Q29udGV4dCAqY3R4ID0gcy0+cHJpdl9kYXRhOwogCi0gICAgc3dpdGNoIChzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQpIHsKKyAgICBzd2l0Y2ggKHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY19pZCkgewogICAgIGNhc2UgQVZfQ09ERUNfSURfQUMzOgogICAgICAgICBjdHgtPmhlYWRlcl9pbmZvID0gc3BkaWZfaGVhZGVyX2FjMzsKICAgICAgICAgYnJlYWs7CkBAIC00NzAsNyArNDcwLDggQEAKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjb2RlYyBub3Qgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgYXZwcml2X3JlcG9ydF9taXNzaW5nX2ZlYXR1cmUocywgIkNvZGVjICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3NydGRlYy5jIGIvbGliYXZmb3JtYXQvc3J0ZGVjLmMKaW5kZXggNjExM2Y3MC4uNTZiZDBjNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc3J0ZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvc3J0ZGVjLmMKQEAgLTUyLDggKzUyLDExIEBACiAgICAgLyogQ2hlY2sgaWYgdGhlIG5leHQgbGluZSBtYXRjaGVzIGEgU1JUIHRpbWVzdGFtcCAqLwogICAgIGlmIChmZl9zdWJ0aXRsZXNfcmVhZF9saW5lKCZ0ciwgYnVmLCBzaXplb2YoYnVmKSkgPCAwKQogICAgICAgICByZXR1cm4gMDsKLSAgICBpZiAoYnVmWzBdID49ICcwJyAmJiBidWZbMF0gPD0gJzknICYmIHN0cnN0cihidWYsICIgLS0+ICIpCi0gICAgICAgICYmIHNzY2FuZihidWYsICIlKmQ6JSoyZDolKjJkJSoxWywuXSUqM2QgLS0+ICUqZDolKjJkOiUqMmQlKjFbLC5dJTNkIiwgJnYpID09IDEpCisgICAgcGJ1ZiA9IGJ1ZjsKKyAgICBpZiAoYnVmWzBdID09ICctJykKKyAgICAgICAgcGJ1ZisrOworICAgIGlmIChwYnVmWzBdID49ICcwJyAmJiBwYnVmWzBdIDw9ICc5JyAmJiBzdHJzdHIoYnVmLCAiIC0tPiAiKQorICAgICAgICAmJiBzc2NhbmYoYnVmLCAiJSpkOiUqZDolKmQlKjFbLC5dJSpkIC0tPiAlKmQ6JSpkOiUqZCUqMVssLl0lZCIsICZ2KSA9PSAxKQogICAgICAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7CiAKICAgICByZXR1cm4gMDsKQEAgLTc0LDggKzc3LDggQEAKICAgICBlaS0+eDEgPSBlaS0+eDIgPSBlaS0+eTEgPSBlaS0+eTIgPSBlaS0+ZHVyYXRpb24gPSAtMTsKICAgICBlaS0+cHRzID0gQVZfTk9QVFNfVkFMVUU7CiAgICAgZWktPnBvcyA9IC0xOwotICAgIGlmIChzc2NhbmYobGluZSwgIiVkOiUyZDolMmQlKjFbLC5dJTNkIC0tPiAlZDolMmQ6JTJkJSoxWywuXSUzZCIKLSAgICAgICAgICAgICAgICIlKlsgXVgxOiV1IFgyOiV1IFkxOiV1IFkyOiV1IiwKKyAgICBpZiAoc3NjYW5mKGxpbmUsICIlZDolZDolZCUqMVssLl0lZCAtLT4gJWQ6JWQ6JWQlKjFbLC5dJWQiCisgICAgICAgICAgICAgICAiJSpbIF1YMTolIlBSSWQzMiIgWDI6JSJQUklkMzIiIFkxOiUiUFJJZDMyIiBZMjolIlBSSWQzMiwKICAgICAgICAgICAgICAgICZoaDEsICZtbTEsICZzczEsICZtczEsCiAgICAgICAgICAgICAgICAmaGgyLCAmbW0yLCAmc3MyLCAmbXMyLAogICAgICAgICAgICAgICAgJmVpLT54MSwgJmVpLT54MiwgJmVpLT55MSwgJmVpLT55MikgPj0gOCkgewpAQCAtMTM1LDggKzEzOCw4IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMTAwMCk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NVQlJJUDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfU1VCUklQOwogCiAgICAgYXZfYnByaW50X2luaXQoJmJ1ZiwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3J0ZW5jLmMgYi9saWJhdmZvcm1hdC9zcnRlbmMuYwppbmRleCAyNGMyNWVjLi5kODExYTRkIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zcnRlbmMuYworKysgYi9saWJhdmZvcm1hdC9zcnRlbmMuYwpAQCAtMzksMTYgKzM5LDE2IEBACiAgICAgU1JUQ29udGV4dCAqc3J0ID0gYXZmLT5wcml2X2RhdGE7CiAKICAgICBpZiAoYXZmLT5uYl9zdHJlYW1zICE9IDEgfHwKLSAgICAgICAgYXZmLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKKyAgICAgICAgYXZmLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfU1VCVElUTEUpIHsKICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgIlNSVCBzdXBwb3J0cyBvbmx5IGEgc2luZ2xlIHN1YnRpdGxlcyBzdHJlYW0uXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9Ci0gICAgaWYgKGF2Zi0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1RFWFQgJiYKLSAgICAgICAgYXZmLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfU1VCUklQKSB7CisgICAgaWYgKGF2Zi0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1RFWFQgJiYKKyAgICAgICAgYXZmLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfU1VCUklQKSB7CiAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBzdWJ0aXRsZXMgY29kZWM6ICVzXG4iLAotICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShhdmYtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCkpOworICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShhdmYtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY19pZCkpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGF2Zi0+c3RyZWFtc1swXSwgNjQsIDEsIDEwMDApOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3J0cC5jIGIvbGliYXZmb3JtYXQvc3J0cC5jCmluZGV4IGI2ZTgyMTEuLmY4YjY4NmMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3NydHAuYworKysgYi9saWJhdmZvcm1hdC9zcnRwLmMKQEAgLTMyMywxNTAgKzMyMywzIEBACiAgICAgbGVuICs9IGhtYWNfc2l6ZTsKICAgICByZXR1cm4gYnVmICsgbGVuIC0gb3V0OwogfQotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXN0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfODBfa2V5ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW4iOwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBydHBfYWVzMTI4XzgwW10gPSB7Ci0gICAgLy8gUlRQIGhlYWRlcgotICAgIDB4ODAsIDB4ZTAsIDB4MTIsIDB4MzQsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsCi0gICAgLy8gZW5jcnlwdGVkIHBheWxvYWQKLSAgICAweDYyLCAweDY5LCAweDc2LCAweGNhLCAweGM1LAotICAgIC8vIEhNQUMKLSAgICAweGExLCAweGFjLCAweDFiLCAweGI0LCAweGEwLCAweDFjLCAweGQ1LCAweDQ5LCAweDI4LCAweDk5LAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnRjcF9hZXMxMjhfODBbXSA9IHsKLSAgICAvLyBSVENQIGhlYWRlcgotICAgIDB4ODEsIDB4YzksIDB4MDAsIDB4MDcsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsCi0gICAgLy8gZW5jcnlwdGVkIHBheWxvYWQKLSAgICAweDhhLCAweGFjLCAweGRjLCAweGE1LCAweDRjLCAweGY2LCAweDc4LCAweGE2LCAweDYyLCAweDhmLCAweDI0LCAweGRhLAotICAgIDB4NmMsIDB4MDksIDB4M2YsIDB4YTksIDB4MjgsIDB4N2EsIDB4YjUsIDB4N2YsIDB4MWYsIDB4MGYsIDB4YzksIDB4MzUsCi0gICAgLy8gUlRDUCBpbmRleAotICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDMsCi0gICAgLy8gSE1BQwotICAgIDB4ZTksIDB4M2IsIDB4YzAsIDB4NWMsIDB4MGMsIDB4MDYsIDB4OWYsIDB4YWIsIDB4YzAsIDB4ZGUsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqYWVzMTI4XzMyX2tleSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1uIjsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnRwX2FlczEyOF8zMltdID0gewotICAgIC8vIFJUUCBoZWFkZXIKLSAgICAweDgwLCAweGUwLCAweDEyLCAweDM0LCAweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDEyLCAweDM0LCAweDU2LCAweDc4LAotICAgIC8vIGVuY3J5cHRlZCBwYXlsb2FkCi0gICAgMHg2MiwgMHg2OSwgMHg3NiwgMHhjYSwgMHhjNSwKLSAgICAvLyBITUFDCi0gICAgMHhhMSwgMHhhYywgMHgxYiwgMHhiNCwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHJ0Y3BfYWVzMTI4XzMyW10gPSB7Ci0gICAgLy8gUlRDUCBoZWFkZXIKLSAgICAweDgxLCAweGM5LCAweDAwLCAweDA3LCAweDEyLCAweDM0LCAweDU2LCAweDc4LAotICAgIC8vIGVuY3J5cHRlZCBwYXlsb2FkCi0gICAgMHgzNSwgMHhlOSwgMHhiNSwgMHhmZiwgMHgwZCwgMHhkMSwgMHhkZSwgMHg3MCwgMHg3NCwgMHgxMCwgMHhhYSwgMHgxYiwKLSAgICAweGIyLCAweDhkLCAweGYwLCAweDIwLCAweDAyLCAweDk5LCAweDZiLCAweDFiLCAweDBiLCAweGQwLCAweDQ3LCAweDM0LAotICAgIC8vIFJUQ1AgaW5kZXgKLSAgICAweDgwLCAweDAwLCAweDAwLCAweDA0LAotICAgIC8vIEhNQUMKLSAgICAweDViLCAweGQyLCAweGE5LCAweDlkLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKmFlczEyOF84MF8zMl9rZXkgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbiI7Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHJ0cF9hZXMxMjhfODBfMzJbXSA9IHsKLSAgICAvLyBSVFAgaGVhZGVyCi0gICAgMHg4MCwgMHhlMCwgMHgxMiwgMHgzNCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwKLSAgICAvLyBlbmNyeXB0ZWQgcGF5bG9hZAotICAgIDB4NjIsIDB4NjksIDB4NzYsIDB4Y2EsIDB4YzUsCi0gICAgLy8gSE1BQwotICAgIDB4YTEsIDB4YWMsIDB4MWIsIDB4YjQsCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBydGNwX2FlczEyOF84MF8zMltdID0gewotICAgIC8vIFJUQ1AgaGVhZGVyCi0gICAgMHg4MSwgMHhjOSwgMHgwMCwgMHgwNywgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwKLSAgICAvLyBlbmNyeXB0ZWQgcGF5bG9hZAotICAgIDB4ZDYsIDB4YWUsIDB4YzEsIDB4NTgsIDB4NjMsIDB4NzAsIDB4YzksIDB4ODgsIDB4NjYsIDB4MjYsIDB4MWMsIDB4NTMsCi0gICAgMHhmZiwgMHg1ZCwgMHg1ZCwgMHgyYiwgMHgwZiwgMHg4YywgMHg3MiwgMHgzZSwgMHhjOSwgMHgxZCwgMHg0MywgMHhmOSwKLSAgICAvLyBSVENQIGluZGV4Ci0gICAgMHg4MCwgMHgwMCwgMHgwMCwgMHgwNSwKLSAgICAvLyBITUFDCi0gICAgMHgwOSwgMHgxNiwgMHhiNCwgMHgyNywgMHg5YSwgMHhlOSwgMHg5MiwgMHgyNiwgMHg0ZSwgMHgxMCwKLX07Ci0KLXN0YXRpYyB2b2lkIHByaW50X2RhdGEoY29uc3QgdWludDhfdCAqYnVmLCBpbnQgbGVuKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgcHJpbnRmKCIlMDJ4IiwgYnVmW2ldKTsKLSAgICBwcmludGYoIlxuIik7Ci19Ci0KLXN0YXRpYyBpbnQgdGVzdF9kZWNyeXB0KHN0cnVjdCBTUlRQQ29udGV4dCAqc3J0cCwgY29uc3QgdWludDhfdCAqaW4sIGludCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQpCi17Ci0gICAgbWVtY3B5KG91dCwgaW4sIGxlbik7Ci0gICAgaWYgKCFmZl9zcnRwX2RlY3J5cHQoc3J0cCwgb3V0LCAmbGVuKSkgewotICAgICAgICBwcmludF9kYXRhKG91dCwgbGVuKTsKLSAgICAgICAgcmV0dXJuIGxlbjsKLSAgICB9IGVsc2UKLSAgICAgICAgcmV0dXJuIC0xOwotfQotCi1zdGF0aWMgdm9pZCB0ZXN0X2VuY3J5cHQoY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGluX2xlbiwgY29uc3QgY2hhciAqc3VpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqa2V5KQotewotICAgIHN0cnVjdCBTUlRQQ29udGV4dCBlbmMgPSB7IDAgfSwgZGVjID0geyAwIH07Ci0gICAgaW50IGxlbjsKLSAgICBjaGFyIGJ1ZltSVFBfTUFYX1BBQ0tFVF9MRU5HVEhdOwotICAgIGZmX3NydHBfc2V0X2NyeXB0bygmZW5jLCBzdWl0ZSwga2V5KTsKLSAgICBmZl9zcnRwX3NldF9jcnlwdG8oJmRlYywgc3VpdGUsIGtleSk7Ci0gICAgbGVuID0gZmZfc3J0cF9lbmNyeXB0KCZlbmMsIGRhdGEsIGluX2xlbiwgYnVmLCBzaXplb2YoYnVmKSk7Ci0gICAgaWYgKCFmZl9zcnRwX2RlY3J5cHQoJmRlYywgYnVmLCAmbGVuKSkgewotICAgICAgICBpZiAobGVuID09IGluX2xlbiAmJiAhbWVtY21wKGJ1ZiwgZGF0YSwgbGVuKSkKLSAgICAgICAgICAgIHByaW50ZigiRGVjcnlwdGVkIGNvbnRlbnQgbWF0Y2hlcyBpbnB1dFxuIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByaW50ZigiRGVjcnlwdGVkIGNvbnRlbnQgZG9lc24ndCBtYXRjaCBpbnB1dFxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRmKCJEZWNyeXB0aW9uIGZhaWxlZFxuIik7Ci0gICAgfQotICAgIGZmX3NydHBfZnJlZSgmZW5jKTsKLSAgICBmZl9zcnRwX2ZyZWUoJmRlYyk7Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmFlczEyOF84MF9zdWl0ZSA9ICJBRVNfQ01fMTI4X0hNQUNfU0hBMV84MCI7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmFlczEyOF8zMl9zdWl0ZSA9ICJBRVNfQ01fMTI4X0hNQUNfU0hBMV8zMiI7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmFlczEyOF84MF8zMl9zdWl0ZSA9ICJTUlRQX0FFUzEyOF9DTV9ITUFDX1NIQTFfMzIiOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICp0ZXN0X2tleSA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEyMzQ1Njc4OTBBQkNEIjsKLSAgICB1aW50OF90IGJ1ZltSVFBfTUFYX1BBQ0tFVF9MRU5HVEhdOwotICAgIHN0cnVjdCBTUlRQQ29udGV4dCBzcnRwID0geyAwIH07Ci0gICAgaW50IGxlbjsKLSAgICBmZl9zcnRwX3NldF9jcnlwdG8oJnNydHAsIGFlczEyOF84MF9zdWl0ZSwgYWVzMTI4XzgwX2tleSk7Ci0gICAgbGVuID0gdGVzdF9kZWNyeXB0KCZzcnRwLCBydHBfYWVzMTI4XzgwLCBzaXplb2YocnRwX2FlczEyOF84MCksIGJ1Zik7Ci0gICAgdGVzdF9lbmNyeXB0KGJ1ZiwgbGVuLCBhZXMxMjhfODBfc3VpdGUsIHRlc3Rfa2V5KTsKLSAgICB0ZXN0X2VuY3J5cHQoYnVmLCBsZW4sIGFlczEyOF8zMl9zdWl0ZSwgdGVzdF9rZXkpOwotICAgIHRlc3RfZW5jcnlwdChidWYsIGxlbiwgYWVzMTI4XzgwXzMyX3N1aXRlLCB0ZXN0X2tleSk7Ci0gICAgdGVzdF9kZWNyeXB0KCZzcnRwLCBydGNwX2FlczEyOF84MCwgc2l6ZW9mKHJ0Y3BfYWVzMTI4XzgwKSwgYnVmKTsKLSAgICB0ZXN0X2VuY3J5cHQoYnVmLCBsZW4sIGFlczEyOF84MF9zdWl0ZSwgdGVzdF9rZXkpOwotICAgIHRlc3RfZW5jcnlwdChidWYsIGxlbiwgYWVzMTI4XzMyX3N1aXRlLCB0ZXN0X2tleSk7Ci0gICAgdGVzdF9lbmNyeXB0KGJ1ZiwgbGVuLCBhZXMxMjhfODBfMzJfc3VpdGUsIHRlc3Rfa2V5KTsKLSAgICBmZl9zcnRwX2ZyZWUoJnNydHApOwotCi0gICAgbWVtc2V0KCZzcnRwLCAwLCBzaXplb2Yoc3J0cCkpOyAvLyBDbGVhciB0aGUgY29udGV4dAotICAgIGZmX3NydHBfc2V0X2NyeXB0bygmc3J0cCwgYWVzMTI4XzMyX3N1aXRlLCBhZXMxMjhfMzJfa2V5KTsKLSAgICB0ZXN0X2RlY3J5cHQoJnNydHAsIHJ0cF9hZXMxMjhfMzIsIHNpemVvZihydHBfYWVzMTI4XzMyKSwgYnVmKTsKLSAgICB0ZXN0X2RlY3J5cHQoJnNydHAsIHJ0Y3BfYWVzMTI4XzMyLCBzaXplb2YocnRjcF9hZXMxMjhfMzIpLCBidWYpOwotICAgIGZmX3NydHBfZnJlZSgmc3J0cCk7Ci0KLSAgICBtZW1zZXQoJnNydHAsIDAsIHNpemVvZihzcnRwKSk7IC8vIENsZWFyIHRoZSBjb250ZXh0Ci0gICAgZmZfc3J0cF9zZXRfY3J5cHRvKCZzcnRwLCBhZXMxMjhfODBfMzJfc3VpdGUsIGFlczEyOF84MF8zMl9rZXkpOwotICAgIHRlc3RfZGVjcnlwdCgmc3J0cCwgcnRwX2FlczEyOF84MF8zMiwgc2l6ZW9mKHJ0cF9hZXMxMjhfODBfMzIpLCBidWYpOwotICAgIHRlc3RfZGVjcnlwdCgmc3J0cCwgcnRjcF9hZXMxMjhfODBfMzIsIHNpemVvZihydGNwX2FlczEyOF84MF8zMiksIGJ1Zik7Ci0gICAgZmZfc3J0cF9mcmVlKCZzcnRwKTsKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC9zcnRwcHJvdG8uYyBiL2xpYmF2Zm9ybWF0L3NydHBwcm90by5jCmluZGV4IDQ2MDc5OWEuLjVlNmU1MTYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3NydHBwcm90by5jCisrKyBiL2xpYmF2Zm9ybWF0L3NydHBwcm90by5jCkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgICAgICAgICAgIHBhdGgsIHNpemVvZihwYXRoKSwgdXJpKTsKICAgICBmZl91cmxfam9pbihidWYsIHNpemVvZihidWYpLCAicnRwIiwgTlVMTCwgaG9zdG5hbWUsIHJ0cF9wb3J0LCAiJXMiLCBwYXRoKTsKICAgICBpZiAoKHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZzLT5ydHBfaGQsIGJ1ZiwgZmxhZ3MsICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBoLT5wcm90b2NvbF93aGl0ZWxpc3QpKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBoLT5wcm90b2NvbF93aGl0ZWxpc3QsIGgtPnByb3RvY29sX2JsYWNrbGlzdCwgaCkpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCiAgICAgaC0+bWF4X3BhY2tldF9zaXplID0gRkZNSU4ocy0+cnRwX2hkLT5tYXhfcGFja2V0X3NpemUsCkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICByZXR1cm4gZmZ1cmxfZ2V0X211bHRpX2ZpbGVfaGFuZGxlKHMtPnJ0cF9oZCwgaGFuZGxlcywgbnVtaGFuZGxlcyk7CiB9CiAKLVVSTFByb3RvY29sIGZmX3NydHBfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9zcnRwX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgICAgICAgICAgID0gInNydHAiLAogICAgIC51cmxfb3BlbiAgICAgICAgICAgICAgICAgID0gc3J0cF9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICAgICAgICAgICAgID0gc3J0cF9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3RsZGVjLmMgYi9saWJhdmZvcm1hdC9zdGxkZWMuYwppbmRleCA4YjFmMGE2Li4zNWRlNDkzIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zdGxkZWMuYworKysgYi9saWJhdmZvcm1hdC9zdGxkZWMuYwpAQCAtNzcsOCArNzcsOCBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMCk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NUTDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfU1RMOwogCiAgICAgd2hpbGUgKCFhdmlvX2Zlb2Yocy0+cGIpKSB7CiAgICAgICAgIGNoYXIgbGluZVs0MDk2XTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3N1YmZpbGUuYyBiL2xpYmF2Zm9ybWF0L3N1YmZpbGUuYwppbmRleCAyYjUzNDM4Li5iNTI3ZjJiIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zdWJmaWxlLmMKKysrIGIvbGliYXZmb3JtYXQvc3ViZmlsZS5jCkBAIC03MiwxMyArNzIsMTYgQEAKICAgICBTdWJmaWxlQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKICAgICBpbnQgcmV0OwogCisgICAgaWYgKCFjLT5lbmQpCisgICAgICAgIGMtPmVuZCA9IElOVDY0X01BWDsKKwogICAgIGlmIChjLT5lbmQgPD0gYy0+c3RhcnQpIHsKICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgImVuZCBiZWZvcmUgc3RhcnRcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KICAgICBhdl9zdHJzdGFydChmaWxlbmFtZSwgInN1YmZpbGU6IiwgJmZpbGVuYW1lKTsKICAgICByZXQgPSBmZnVybF9vcGVuX3doaXRlbGlzdCgmYy0+aCwgZmlsZW5hbWUsIGZsYWdzLCAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsIGgtPnByb3RvY29sX3doaXRlbGlzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsIGgpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIGMtPnBvcyA9IGMtPnN0YXJ0OwpAQCAtMTAyLDcgKzEwNSw3IEBACiAgICAgaW50IHJldDsKIAogICAgIGlmIChyZXN0IDw9IDApCi0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIHJlc3QpOwogICAgIHJldCA9IGZmdXJsX3JlYWQoYy0+aCwgYnVmLCBzaXplKTsKICAgICBpZiAocmV0ID49IDApCkBAIC0xMzcsNyArMTQwLDcgQEAKICAgICByZXR1cm4gYy0+cG9zIC0gYy0+c3RhcnQ7CiB9CiAKLVVSTFByb3RvY29sIGZmX3N1YmZpbGVfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl9zdWJmaWxlX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgICAgID0gInN1YmZpbGUiLAogICAgIC51cmxfb3BlbjIgICAgICAgICAgID0gc3ViZmlsZV9vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICAgICAgID0gc3ViZmlsZV9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3VidGl0bGVzLmMgYi9saWJhdmZvcm1hdC9zdWJ0aXRsZXMuYwppbmRleCAxMDhmOTA5Li45M2M5ZWYwIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zdWJ0aXRsZXMuYworKysgYi9saWJhdmZvcm1hdC9zdWJ0aXRsZXMuYwpAQCAtMjExLDcgKzIxMSw3IEBACiAKICAgICBpZiAocS0+Y3VycmVudF9zdWJfaWR4ID09IHEtPm5iX3N1YnMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKLSAgICBpZiAoYXZfY29weV9wYWNrZXQocGt0LCBzdWIpIDwgMCkgeworICAgIGlmIChhdl9wYWNrZXRfcmVmKHBrdCwgc3ViKSA8IDApIHsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3N1YnZpZXdlcjFkZWMuYyBiL2xpYmF2Zm9ybWF0L3N1YnZpZXdlcjFkZWMuYwppbmRleCA5M2RiNGViLi5lNTc5ZDFjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zdWJ2aWV3ZXIxZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvc3Vidmlld2VyMWRlYy5jCkBAIC01MCw4ICs1MCw4IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgMSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NVQlZJRVdFUjE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NVQlZJRVdFUjE7CiAKICAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikpIHsKICAgICAgICAgY2hhciBsaW5lWzQwOTZdOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3Vidmlld2VyZGVjLmMgYi9saWJhdmZvcm1hdC9zdWJ2aWV3ZXJkZWMuYwppbmRleCBkNGIyZmRmLi5hZjA4NGY0IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zdWJ2aWV3ZXJkZWMuYworKysgYi9saWJhdmZvcm1hdC9zdWJ2aWV3ZXJkZWMuYwpAQCAtNzksOCArNzksOCBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMCk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1NVQlZJRVdFUjsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfU1VCVklFV0VSOwogCiAgICAgYXZfYnByaW50X2luaXQoJmhlYWRlciwgMCwgQVZfQlBSSU5UX1NJWkVfVU5MSU1JVEVEKTsKIApAQCAtMTAxLDExICsxMDEsMTEgQEAKICAgICAgICAgICAgICAgICBzdHJzdHIobGluZSwgIltGT05UXSIpIHx8IHN0cnN0cihsaW5lLCAiW1NUWUxFXSIpKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICBpZiAoIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKSB7IC8vIGhlYWRlciBub3QgZmluYWxpemVkIHlldAorICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgeyAvLyBoZWFkZXIgbm90IGZpbmFsaXplZCB5ZXQKICAgICAgICAgICAgICAgICBhdl9icHJpbnRmKCZoZWFkZXIsICIlc1xuIiwgbGluZSk7CiAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKGxpbmUsICJbRU5EIElORk9STUFUSU9OXSIsIDE3KSB8fCAhc3RybmNtcChsaW5lLCAiW1NVQlRJVExFXSIsIDEwKSkgewogICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgaGVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgIHJlcyA9IGF2cHJpdl9icHJpbnRfdG9fZXh0cmFkYXRhKHN0LT5jb2RlYywgJmhlYWRlcik7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGZmX2JwcmludF90b19jb2RlY3Bhcl9leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCAmaGVhZGVyKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAobGluZSwgIltJTkZPUk1BVElPTl0iLCAxMykpIHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3N1cGRlYy5jIGIvbGliYXZmb3JtYXQvc3VwZGVjLmMKaW5kZXggNDgwODNiMi4uMDkzMGRiYyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc3VwZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvc3VwZGVjLmMKQEAgLTI3LDggKzI3LDggQEAKICAgICBBVlN0cmVhbSAqc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9IRE1WX1BHU19TVUJUSVRMRTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDMyLCAxLCA5MDAwMCk7CiAKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3N1cGVuYy5jIGIvbGliYXZmb3JtYXQvc3VwZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmNmI1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L3N1cGVuYy5jCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBTVVAgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBQZXRyaSBIaW50dWthaW5lbiA8cGhpbnR1a2FAdXNlcnMuc291cmNlZm9yZ2UubmV0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2RlZmluZSBTVVBfUEdTX01BR0lDIDB4NTA0NyAvKiAiUEciLCBiaWcgZW5kaWFuICovCisKK3N0YXRpYyBpbnQgc3VwX3dyaXRlX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCit7CisgICAgdWludDhfdCAqZGF0YSA9IHBrdC0+ZGF0YTsKKyAgICBzaXplX3Qgc2l6ZSA9IHBrdC0+c2l6ZTsKKyAgICB1aW50MzJfdCBwdHMgPSAwLCBkdHMgPSAwOworCisgICAgaWYgKHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIHB0cyA9ICh1aW50MzJfdClwa3QtPnB0czsKKyAgICB9CisgICAgaWYgKHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGR0cyA9ICh1aW50MzJfdClwa3QtPmR0czsKKyAgICB9CisKKyAgICAvKgorICAgICAgU3BsaXQgZnJhbWUgdG8gc2VnbWVudHMuCisgICAgICBta3ZtZXJnZSBzdG9yZXMgbXVsdGlwbGUgc2VnbWVudHMgaW4gb25lIGZyYW1lLgorICAgICovCisgICAgd2hpbGUgKHNpemUgPiAyKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBBVl9SQjE2KGRhdGEgKyAxKSArIDM7CisKKyAgICAgICAgaWYgKGxlbiA+IHNpemUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJOb3QgZW5vdWdoIGRhdGEsIHNraXBwaW5nICVkIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgKGludClzaXplKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICB9CisKKyAgICAgICAgLyogaGVhZGVyICovCisgICAgICAgIGF2aW9fd2IxNihzLT5wYiwgU1VQX1BHU19NQUdJQyk7CisgICAgICAgIGF2aW9fd2IzMihzLT5wYiwgcHRzKTsKKyAgICAgICAgYXZpb193YjMyKHMtPnBiLCBkdHMpOworCisgICAgICAgIGF2aW9fd3JpdGUocy0+cGIsIGRhdGEsIGxlbik7CisKKyAgICAgICAgZGF0YSArPSBsZW47CisgICAgICAgIHNpemUgLT0gbGVuOworICAgIH0KKworICAgIGlmIChzaXplID4gMCkgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU2tpcHBpbmcgJWQgYnl0ZXMgYWZ0ZXIgbGFzdCBzZWdtZW50IGluIGZyYW1lXG4iLAorICAgICAgICAgICAgICAgICAoaW50KXNpemUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdXBfd3JpdGVfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICIlcyBmaWxlcyBoYXZlIGV4YWN0bHkgb25lIHN0cmVhbVxuIiwKKyAgICAgICAgICAgICAgIHMtPm9mb3JtYXQtPm5hbWUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1swXSwgMzIsIDEsIDkwMDAwKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl9zdXBfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgID0gInN1cCIsCisgICAgLmxvbmdfbmFtZSAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoInJhdyBIRE1WIFByZXNlbnRhdGlvbiBHcmFwaGljIFN0cmVhbSBzdWJ0aXRsZXMiKSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAic3VwIiwKKyAgICAubWltZV90eXBlICAgICAgPSAiYXBwbGljYXRpb24veC1wZ3MiLAorICAgIC5zdWJ0aXRsZV9jb2RlYyA9IEFWX0NPREVDX0lEX0hETVZfUEdTX1NVQlRJVExFLAorICAgIC53cml0ZV9oZWFkZXIgICA9IHN1cF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX3BhY2tldCAgID0gc3VwX3dyaXRlX3BhY2tldCwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9WQVJJQUJMRV9GUFMgfCBBVkZNVF9UU19OT05TVFJJQ1QsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3ZhZy5jIGIvbGliYXZmb3JtYXQvc3ZhZy5jCmluZGV4IGFiN2YzNmMuLjgyOGI4NTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3N2YWcuYworKysgYi9saWJhdmZvcm1hdC9zdmFnLmMKQEAgLTQyLDMwICs0MiwzMCBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgc2l6ZSAgICAgICAgICAgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fUFNYOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocy0+cGIpOwotICAgIGlmIChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIDw9IDApCisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fUFNYOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocy0+cGIpOworICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3JsMzIocy0+cGIpOwotICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzIDw9IDApCisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPD0gMCB8fCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID4gOCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgc3QtPmR1cmF0aW9uICAgICAgICAgICA9IHNpemUgLyAoMTYgKiBzdC0+Y29kZWMtPmNoYW5uZWxzKSAqIDI4OworICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICAgPSBzaXplIC8gKDE2ICogc3QtPmNvZGVjcGFyLT5jaGFubmVscykgKiAyODsKICAgICBhbGlnbiAgICAgICAgICAgICAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICBpZiAoYWxpZ24gPD0gMCB8fCBhbGlnbiA+IElOVF9NQVggLyBzdC0+Y29kZWMtPmNoYW5uZWxzKQorICAgIGlmIChhbGlnbiA8PSAwIHx8IGFsaWduID4gSU5UX01BWCAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSBhbGlnbiAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IGFsaWduICogc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICBhdmlvX3NraXAocy0+cGIsIDB4ODAwIC0gYXZpb190ZWxsKHMtPnBiKSk7Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHN2YWdfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKIAotICAgIHJldHVybiBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGNvZGVjLT5ibG9ja19hbGlnbik7CisgICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgcGFyLT5ibG9ja19hbGlnbik7CiB9CiAKIEFWSW5wdXRGb3JtYXQgZmZfc3ZhZ19kZW11eGVyID0gewpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3dmLmggYi9saWJhdmZvcm1hdC9zd2YuaAppbmRleCBhYjY3Yzc1Li5kMGYwMTk0IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zd2YuaAorKysgYi9saWJhdmZvcm1hdC9zd2YuaApAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgaW50IGZyYW1lX3JhdGU7CiAgICAgaW50IHRhZzsKICAgICBBVkZpZm9CdWZmZXIgKmF1ZGlvX2ZpZm87Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF1ZGlvX2VuYywgKnZpZGVvX2VuYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqYXVkaW9fcGFyLCAqdmlkZW9fcGFyOwogICAgIEFWU3RyZWFtICp2aWRlb19zdDsKICNpZiBDT05GSUdfWkxJQgogI2RlZmluZSBaQlVGX1NJWkUgNDA5NgpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvc3dmZGVjLmMgYi9saWJhdmZvcm1hdC9zd2ZkZWMuYwppbmRleCBlYjE3ZTgyLi4yMTIxNTdmIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC9zd2ZkZWMuYworKysgYi9saWJhdmZvcm1hdC9zd2ZkZWMuYwpAQCAtOTUsNyArOTUsNyBAQAogICAgIGlmIChwLT5idWZbM10gPj0gMjAgfHwgeG1heCA8IDE2IHx8IHltYXggPCAxNikKICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYIC8gNDsKIAotICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04gKyAxOwogfQogCiAjaWYgQ09ORklHX1pMSUIKQEAgLTExOSwxMCArMTE5LDEwIEBACiAgICAgei0+YXZhaWxfb3V0ID0gYnVmX3NpemU7CiAKICAgICByZXQgPSBpbmZsYXRlKHosIFpfTk9fRkxVU0gpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIGlmIChyZXQgPT0gWl9TVFJFQU1fRU5EKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgaWYgKHJldCAhPSBaX09LKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCiAgICAgaWYgKGJ1Zl9zaXplIC0gei0+YXZhaWxfb3V0ID09IDApCiAgICAgICAgIGdvdG8gcmV0cnk7CkBAIC0xODEsMjEgKzE4MSwyMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBhc3QtPmlkID0gaWQ7CiAgICAgaWYgKGluZm8gJiAxKSB7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgID0gMjsKLSAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDI7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKICAgICB9IGVsc2UgewotICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDE7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKICAgICB9Ci0gICAgYXN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZmZfY29kZWNfZ2V0X2lkKHN3Zl9hdWRpb19jb2RlY190YWdzLCBpbmZvPj40ICYgMTUpOworICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IGZmX2NvZGVjX2dldF9pZChzd2ZfYXVkaW9fY29kZWNfdGFncywgaW5mbz4+NCAmIDE1KTsKICAgICBhc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTEw7CiAgICAgc2FtcGxlX3JhdGVfY29kZSA9IGluZm8+PjIgJiAzOwogICAgIHNhbXBsZV9zaXplX2NvZGUgPSBpbmZvPj4xICYgMTsKLSAgICBpZiAoIXNhbXBsZV9zaXplX2NvZGUgJiYgYXN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKQotICAgICAgICBhc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKLSAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwID4+ICgzIC0gc2FtcGxlX3JhdGVfY29kZSk7Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDY0LCAxLCBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgaWYgKCFzYW1wbGVfc2l6ZV9jb2RlICYmIGFzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMTZMRSkKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CisgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA0NDEwMCA+PiAoMyAtIHNhbXBsZV9yYXRlX2NvZGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIHJldHVybiBhc3Q7CiB9CiAKQEAgLTIyNiw3ICsyMjYsNyBAQAogCiAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc3QtPmlkID09IGNoX2lkKQorICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIHN0LT5pZCA9PSBjaF9pZCkKICAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgfQogCkBAIC0yMzksOCArMjM5LDggQEAKICAgICAgICAgICAgIGlmICghdnN0KQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICB2c3QtPmlkID0gY2hfaWQ7Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfc3dmX2NvZGVjX3RhZ3MsIGF2aW9fcjgocGIpKTsKKyAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2NvZGVjX2dldF9pZChmZl9zd2ZfY29kZWNfdGFncywgYXZpb19yOChwYikpOwogICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyh2c3QsIDE2LCAyNTYsIHN3Zi0+ZnJhbWVfcmF0ZSk7CiAgICAgICAgICAgICBsZW4gLT0gODsKICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gVEFHX1NUUkVBTUhFQUQgfHwgdGFnID09IFRBR19TVFJFQU1IRUFEMikgewpAQCAtMjQ4LDcgKzI0OCw3IEBACiAKICAgICAgICAgICAgIGZvciAoaT0wOyBpPHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJiBzdC0+aWQgPT0gLTEpCisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgc3QtPmlkID09IC0xKQogICAgICAgICAgICAgICAgICAgICBnb3RvIHNraXA7CiAgICAgICAgICAgICB9CiAKQEAgLTI2NSw3ICsyNjUsNyBAQAogCiAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgc3QtPmlkID09IGNoX2lkKQorICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHN0LT5pZCA9PSBjaF9pZCkKICAgICAgICAgICAgICAgICAgICAgZ290byBza2lwOwogICAgICAgICAgICAgfQogCkBAIC0yOTIsNyArMjkyLDcgQEAKICAgICAgICAgICAgIGxlbiAtPSAyOwogICAgICAgICAgICAgZm9yKGk9MDsgaTxzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc3QtPmlkID09IGNoX2lkKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc3QtPmlkID09IGNoX2lkKSB7CiAgICAgICAgICAgICAgICAgICAgIGZyYW1lID0gYXZpb19ybDE2KHBiKTsKICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDI7CiAgICAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMCkKQEAgLTM2OCw3ICszNjgsNyBAQAogCiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPICYmIHN0LT5pZCA9PSAtMykKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTyAmJiBzdC0+aWQgPT0gLTMpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGkgPT0gcy0+bmJfc3RyZWFtcykgewpAQCAtMzc4LDIzICszNzgsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgZ290byBiaXRtYXBfZW5kOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB2c3QtPmlkID0gLTM7IC8qIC0zIHRvIGF2b2lkIGNsYXNoIHdpdGggdmlkZW8gc3RyZWFtIGFuZCBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1JBV1ZJREVPOwogICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgMjU2LCBzd2YtPmZyYW1lX3JhdGUpOwogICAgICAgICAgICAgICAgIHN0ID0gdnN0OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoKHJlcyA9IGF2X25ld19wYWNrZXQocGt0LCBvdXRfbGVuIC0gY29sb3JtYXBzaXplICogY29sb3JtYXBicHApKSA8IDApCiAgICAgICAgICAgICAgICAgZ290byBiaXRtYXBfZW5kOwotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPndpZHRoICYmICFzdC0+Y29kZWMtPmhlaWdodCkgewotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBpZiAoIXN0LT5jb2RlY3Bhci0+d2lkdGggJiYgIXN0LT5jb2RlY3Bhci0+aGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgZmZfYWRkX3BhcmFtX2NoYW5nZShwa3QsIDAsIDAsIDAsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGt0LT5wb3MgPSBwb3M7CiAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKIAorICAgICAgICAgICAgaWYgKGxpbmVzaXplICogaGVpZ2h0ID4gcGt0LT5zaXplKSB7CisgICAgICAgICAgICAgICAgcmVzID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGJpdG1hcF9lbmQ7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIHN3aXRjaCAoYm1wX2ZtdCkgewogICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1BBTDg7CkBAIC00MTcsMTUgKzQyMywxMSBAQAogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUgJiYgc3QtPmNvZGVjLT5waXhfZm10ICE9IHBpeF9mbXQpIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmZvcm1hdCAhPSBBVl9QSVhfRk1UX05PTkUgJiYgc3QtPmNvZGVjcGFyLT5mb3JtYXQgIT0gcGl4X2ZtdCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJwaXhlbCBmb3JtYXQgY2hhbmdlIHVuc3VwcG9ydGVkXG4iKTsKICAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+cGl4X2ZtdCA9IHBpeF9mbXQ7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5mb3JtYXQgPSBwaXhfZm10OwogCi0gICAgICAgICAgICBpZiAobGluZXNpemUgKiBoZWlnaHQgPiBwa3QtPnNpemUpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgICAgICAgICAgICAgIGdvdG8gYml0bWFwX2VuZDsKLSAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIGJ1ZiArIGNvbG9ybWFwc2l6ZSpjb2xvcm1hcGJwcCwgbGluZXNpemUgKiBoZWlnaHQpOwogCiAgICAgICAgICAgICByZXMgPSBwa3QtPnNpemU7CkBAIC00NDMsOCArNDQ1LDggQEAKICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gVEFHX1NUUkVBTUJMT0NLKSB7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHN0LT5pZCA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJiBzdC0+aWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOwogICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IDQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDApCkBAIC00NjUsNyArNDY3LDcgQEAKICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gVEFHX0pQRUcyKSB7CiAgICAgICAgICAgICBmb3IgKGk9MDsgaTxzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUpQRUcgJiYgc3QtPmlkID09IC0yKQorICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01KUEVHICYmIHN0LT5pZCA9PSAtMikKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoaSA9PSBzLT5uYl9zdHJlYW1zKSB7CkBAIC00NzMsOCArNDc1LDggQEAKICAgICAgICAgICAgICAgICBpZiAoIXZzdCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgICAgICB2c3QtPmlkID0gLTI7IC8qIC0yIHRvIGF2b2lkIGNsYXNoIHdpdGggdmlkZW8gc3RyZWFtIGFuZCBhdWRpbyBzdHJlYW0gKi8KLSAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTUpQRUc7CisgICAgICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01KUEVHOwogICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgMjU2LCBzd2YtPmZyYW1lX3JhdGUpOwogICAgICAgICAgICAgICAgIHN0ID0gdnN0OwogICAgICAgICAgICAgfQpAQCAtNTE2LDcgKzUxOCw3IEBACiAgICAgICAgIH0KICAgICBza2lwOgogICAgICAgICBpZihsZW48MCkKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkNsaXBpbmcgbGVuICVkXG4iLCBsZW4pOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiQ2xpcHBpbmcgbGVuICVkXG4iLCBsZW4pOwogICAgICAgICBsZW4gPSBGRk1BWCgwLCBsZW4pOwogICAgICAgICBhdmlvX3NraXAocGIsIGxlbik7CiAgICAgfQpAQCAtNTI5LDcgKzUzMSw3IEBACiAgICAgaW5mbGF0ZUVuZCgmcy0+enN0cmVhbSk7CiAgICAgYXZfZnJlZXAoJnMtPnpidWZfaW4pOwogICAgIGF2X2ZyZWVwKCZzLT56YnVmX291dCk7Ci0gICAgYXZfZnJlZXAoJnMtPnpwYik7CisgICAgYXZpb19jb250ZXh0X2ZyZWUoJnMtPnpwYik7CiAgICAgcmV0dXJuIDA7CiB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3N3ZmVuYy5jIGIvbGliYXZmb3JtYXQvc3dmZW5jLmMKaW5kZXggOGQ1OTMzZS4uZjUzZGIwZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvc3dmZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvc3dmZW5jLmMKQEAgLTY5LDcgKzY5LDcgQEAKIAogICAgIGlmICh2YWwgPT0gMCkKICAgICAgICAgcmV0dXJuOwotICAgIHZhbCA9IGFicyh2YWwpOworICAgIHZhbCA9IEZGQUJTKHZhbCk7CiAgICAgbiA9IDE7CiAgICAgd2hpbGUgKHZhbCAhPSAwKSB7CiAgICAgICAgIG4rKzsKQEAgLTE4NSwxOCArMTg1LDE0IEBACiAgICAgc3dmLT52aWRlb19mcmFtZV9udW1iZXIgPSAwOwogCiAgICAgZm9yKGk9MDtpPHMtPm5iX3N0cmVhbXM7aSsrKSB7Ci0gICAgICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zW2ldLT5jb2RlYzsKLSAgICAgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgIGlmIChzd2YtPmF1ZGlvX2VuYykgeworICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1tpXS0+Y29kZWNwYXI7CisgICAgICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoc3dmLT5hdWRpb19wYXIpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU1dGIG11eGVyIG9ubHkgc3VwcG9ydHMgMSBhdWRpbyBzdHJlYW1cbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlbmMtPmZyYW1lX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImF1ZGlvIGZyYW1lIHNpemUgbm90IHNldFxuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3dmLT5hdWRpb19lbmMgPSBlbmM7CisgICAgICAgICAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDMpIHsKKyAgICAgICAgICAgICAgICBzd2YtPmF1ZGlvX3BhciA9IHBhcjsKICAgICAgICAgICAgICAgICBzd2YtPmF1ZGlvX2ZpZm89IGF2X2ZpZm9fYWxsb2MoQVVESU9fRklGT19TSVpFKTsKICAgICAgICAgICAgICAgICBpZiAoIXN3Zi0+YXVkaW9fZmlmbykKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTIwNSwxNSArMjAxLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHN3Zi0+dmlkZW9fZW5jKSB7CisgICAgICAgICAgICBpZiAoc3dmLT52aWRlb19wYXIpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU1dGIG11eGVyIG9ubHkgc3VwcG9ydHMgMSB2aWRlbyBzdHJlYW1cbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RiB8fAotICAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxWMSB8fAotICAgICAgICAgICAgICAgIGVuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUpQRUcpIHsKKyAgICAgICAgICAgIGlmIChwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkYgfHwKKyAgICAgICAgICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMVjEgfHwKKyAgICAgICAgICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01KUEVHKSB7CiAgICAgICAgICAgICAgICAgc3dmLT52aWRlb19zdCAgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICAgICAgICAgIHN3Zi0+dmlkZW9fZW5jID0gZW5jOworICAgICAgICAgICAgICAgIHN3Zi0+dmlkZW9fcGFyID0gcGFyOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiU1dGIG11eGVyIG9ubHkgc3VwcG9ydHMgVlA2LCBGTFYxIGFuZCBNSlBFR1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMjIxLDMyICsyMTcsMzIgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghc3dmLT52aWRlb19lbmMpIHsKKyAgICBpZiAoIXN3Zi0+dmlkZW9fcGFyKSB7CiAgICAgICAgIC8qIGN1cnJlbnRseSwgY2Fubm90IHdvcmsgY29ycmVjdGx5IGlmIGF1ZGlvIG9ubHkgKi8KICAgICAgICAgd2lkdGggPSAzMjA7CiAgICAgICAgIGhlaWdodCA9IDIwMDsKICAgICAgICAgcmF0ZSA9IDEwOwogICAgICAgICByYXRlX2Jhc2U9IDE7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgd2lkdGggPSBzd2YtPnZpZGVvX2VuYy0+d2lkdGg7Ci0gICAgICAgIGhlaWdodCA9IHN3Zi0+dmlkZW9fZW5jLT5oZWlnaHQ7CisgICAgICAgIHdpZHRoID0gc3dmLT52aWRlb19wYXItPndpZHRoOworICAgICAgICBoZWlnaHQgPSBzd2YtPnZpZGVvX3Bhci0+aGVpZ2h0OwogICAgICAgICAvLyBUT0RPOiBzaG91bGQgYmUgYXZnX2ZyYW1lX3JhdGUKICAgICAgICAgcmF0ZSA9IHN3Zi0+dmlkZW9fc3QtPnRpbWVfYmFzZS5kZW47CiAgICAgICAgIHJhdGVfYmFzZSA9IHN3Zi0+dmlkZW9fc3QtPnRpbWVfYmFzZS5udW07CiAgICAgfQogCi0gICAgaWYgKCFzd2YtPmF1ZGlvX2VuYykKKyAgICBpZiAoIXN3Zi0+YXVkaW9fcGFyKQogICAgICAgICBzd2YtPnNhbXBsZXNfcGVyX2ZyYW1lID0gKDQ0MTAwTEwgKiByYXRlX2Jhc2UpIC8gcmF0ZTsKICAgICBlbHNlCi0gICAgICAgIHN3Zi0+c2FtcGxlc19wZXJfZnJhbWUgPSAoc3dmLT5hdWRpb19lbmMtPnNhbXBsZV9yYXRlICogcmF0ZV9iYXNlKSAvIHJhdGU7CisgICAgICAgIHN3Zi0+c2FtcGxlc19wZXJfZnJhbWUgPSAoc3dmLT5hdWRpb19wYXItPnNhbXBsZV9yYXRlICogcmF0ZV9iYXNlKSAvIHJhdGU7CiAKICAgICBhdmlvX3dyaXRlKHBiLCAiRldTIiwgMyk7CiAKICAgICBpZiAoIXN0cmNtcCgiYXZtMiIsIHMtPm9mb3JtYXQtPm5hbWUpKQogICAgICAgICB2ZXJzaW9uID0gOTsKLSAgICBlbHNlIGlmIChzd2YtPnZpZGVvX2VuYyAmJiBzd2YtPnZpZGVvX2VuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RikKKyAgICBlbHNlIGlmIChzd2YtPnZpZGVvX3BhciAmJiBzd2YtPnZpZGVvX3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RikKICAgICAgICAgdmVyc2lvbiA9IDg7IC8qIHZlcnNpb24gOCBhbmQgYWJvdmUgc3VwcG9ydCBWUDYgY29kZWMgKi8KLSAgICBlbHNlIGlmIChzd2YtPnZpZGVvX2VuYyAmJiBzd2YtPnZpZGVvX2VuYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxWMSkKKyAgICBlbHNlIGlmIChzd2YtPnZpZGVvX3BhciAmJiBzd2YtPnZpZGVvX3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRkxWMSkKICAgICAgICAgdmVyc2lvbiA9IDY7IC8qIHZlcnNpb24gNiBhbmQgYWJvdmUgc3VwcG9ydCBGTFYxIGNvZGVjICovCiAgICAgZWxzZQogICAgICAgICB2ZXJzaW9uID0gNDsgLyogdmVyc2lvbiA0IGZvciBtcGVnIGF1ZGlvIHN1cHBvcnQgKi8KQEAgLTI3Miw3ICsyNjgsNyBAQAogICAgIH0KIAogICAgIC8qIGRlZmluZSBhIHNoYXBlIHdpdGggdGhlIGpwZWcgaW5zaWRlICovCi0gICAgaWYgKHN3Zi0+dmlkZW9fZW5jICYmIHN3Zi0+dmlkZW9fZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykgeworICAgIGlmIChzd2YtPnZpZGVvX3BhciAmJiBzd2YtPnZpZGVvX3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUpQRUcpIHsKICAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX0RFRklORVNIQVBFKTsKIAogICAgICAgICBhdmlvX3dsMTYocGIsIFNIQVBFX0lEKTsgLyogSUQgb2Ygc2hhcGUgKi8KQEAgLTMxNSwxMiArMzExLDEyIEBACiAgICAgICAgIHB1dF9zd2ZfZW5kX3RhZyhzKTsKICAgICB9CiAKLSAgICBpZiAoc3dmLT5hdWRpb19lbmMgJiYgc3dmLT5hdWRpb19lbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMykgeworICAgIGlmIChzd2YtPmF1ZGlvX3BhciAmJiBzd2YtPmF1ZGlvX3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAzKSB7CiAgICAgICAgIGludCB2ID0gMDsKIAogICAgICAgICAvKiBzdGFydCBzb3VuZCAqLwogICAgICAgICBwdXRfc3dmX3RhZyhzLCBUQUdfU1RSRUFNSEVBRDIpOwotICAgICAgICBzd2l0Y2goc3dmLT5hdWRpb19lbmMtPnNhbXBsZV9yYXRlKSB7CisgICAgICAgIHN3aXRjaChzd2YtPmF1ZGlvX3Bhci0+c2FtcGxlX3JhdGUpIHsKICAgICAgICAgY2FzZSAxMTAyNTogdiB8PSAxIDw8IDI7IGJyZWFrOwogICAgICAgICBjYXNlIDIyMDUwOiB2IHw9IDIgPDwgMjsgYnJlYWs7CiAgICAgICAgIGNhc2UgNDQxMDA6IHYgfD0gMyA8PCAyOyBicmVhazsKQEAgLTMzMCw3ICszMjYsNyBAQAogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIHYgfD0gMHgwMjsgLyogMTYgYml0IHBsYXliYWNrICovCi0gICAgICAgIGlmIChzd2YtPmF1ZGlvX2VuYy0+Y2hhbm5lbHMgPT0gMikKKyAgICAgICAgaWYgKHN3Zi0+YXVkaW9fcGFyLT5jaGFubmVscyA9PSAyKQogICAgICAgICAgICAgdiB8PSAweDAxOyAvKiBzdGVyZW8gcGxheWJhY2sgKi8KICAgICAgICAgYXZpb193OChzLT5wYiwgdik7CiAgICAgICAgIHYgfD0gMHgyMDsgLyogbXAzIGNvbXByZXNzZWQgKi8KQEAgLTM0NiwyNyArMzQyLDI3IEBACiB9CiAKIHN0YXRpYyBpbnQgc3dmX3dyaXRlX3ZpZGVvKEFWRm9ybWF0Q29udGV4dCAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICplbmMsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQogewogICAgIFNXRkNvbnRleHQgKnN3ZiA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKIAogICAgIC8qIEZsYXNoIFBsYXllciBsaW1pdCAqLwogICAgIGlmIChzd2YtPnN3Zl9mcmFtZV9udW1iZXIgPT0gMTYwMDApCi0gICAgICAgIGF2X2xvZyhlbmMsIEFWX0xPR19JTkZPLCAid2FybmluZzogRmxhc2ggUGxheWVyIGxpbWl0IG9mIDE2MDAwIGZyYW1lcyByZWFjaGVkXG4iKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAid2FybmluZzogRmxhc2ggUGxheWVyIGxpbWl0IG9mIDE2MDAwIGZyYW1lcyByZWFjaGVkXG4iKTsKIAotICAgIGlmIChlbmMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZQNkYgfHwKLSAgICAgICAgZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9GTFYxKSB7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVlA2RiB8fAorICAgICAgICBwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0ZMVjEpIHsKICAgICAgICAgaWYgKHN3Zi0+dmlkZW9fZnJhbWVfbnVtYmVyID09IDApIHsKICAgICAgICAgICAgIC8qIGNyZWF0ZSBhIG5ldyB2aWRlbyBvYmplY3QgKi8KICAgICAgICAgICAgIHB1dF9zd2ZfdGFnKHMsIFRBR19WSURFT1NUUkVBTSk7CiAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIFZJREVPX0lEKTsKICAgICAgICAgICAgIHN3Zi0+dmZyYW1lc19wb3MgPSBhdmlvX3RlbGwocGIpOwogICAgICAgICAgICAgYXZpb193bDE2KHBiLCAxNTAwMCk7IC8qIGhhcmQgZmxhc2ggcGxheWVyIGxpbWl0ICovCi0gICAgICAgICAgICBhdmlvX3dsMTYocGIsIGVuYy0+d2lkdGgpOwotICAgICAgICAgICAgYXZpb193bDE2KHBiLCBlbmMtPmhlaWdodCk7CisgICAgICAgICAgICBhdmlvX3dsMTYocGIsIHBhci0+d2lkdGgpOworICAgICAgICAgICAgYXZpb193bDE2KHBiLCBwYXItPmhlaWdodCk7CiAgICAgICAgICAgICBhdmlvX3c4KHBiLCAwKTsKLSAgICAgICAgICAgIGF2aW9fdzgocGIsZmZfY29kZWNfZ2V0X3RhZyhmZl9zd2ZfY29kZWNfdGFncywgZW5jLT5jb2RlY19pZCkpOworICAgICAgICAgICAgYXZpb193OChwYixmZl9jb2RlY19nZXRfdGFnKGZmX3N3Zl9jb2RlY190YWdzLCBwYXItPmNvZGVjX2lkKSk7CiAgICAgICAgICAgICBwdXRfc3dmX2VuZF90YWcocyk7CiAKICAgICAgICAgICAgIC8qIHBsYWNlIHRoZSB2aWRlbyBvYmplY3QgZm9yIHRoZSBmaXJzdCB0aW1lICovCkBAIC0zOTQsNyArMzkwLDcgQEAKICAgICAgICAgYXZpb193bDE2KHBiLCBzd2YtPnZpZGVvX2ZyYW1lX251bWJlcisrKTsKICAgICAgICAgYXZpb193cml0ZShwYiwgYnVmLCBzaXplKTsKICAgICAgICAgcHV0X3N3Zl9lbmRfdGFnKHMpOwotICAgIH0gZWxzZSBpZiAoZW5jLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykgeworICAgIH0gZWxzZSBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykgewogICAgICAgICBpZiAoc3dmLT5zd2ZfZnJhbWVfbnVtYmVyID4gMCkgewogICAgICAgICAgICAgLyogcmVtb3ZlIHRoZSBzaGFwZSAqLwogICAgICAgICAgICAgcHV0X3N3Zl90YWcocywgVEFHX1JFTU9WRU9CSkVDVCk7CkBAIC00MzEsNyArNDI3LDcgQEAKICAgICBzd2YtPnN3Zl9mcmFtZV9udW1iZXIrKzsKIAogICAgIC8qIHN0cmVhbWluZyBzb3VuZCBhbHdheXMgc2hvdWxkIGJlIHBsYWNlZCBqdXN0IGJlZm9yZSBzaG93ZnJhbWUgdGFncyAqLwotICAgIGlmIChzd2YtPmF1ZGlvX2VuYyAmJiBhdl9maWZvX3NpemUoc3dmLT5hdWRpb19maWZvKSkgeworICAgIGlmIChzd2YtPmF1ZGlvX3BhciAmJiBhdl9maWZvX3NpemUoc3dmLT5hdWRpb19maWZvKSkgewogICAgICAgICBpbnQgZnJhbWVfc2l6ZSA9IGF2X2ZpZm9fc2l6ZShzd2YtPmF1ZGlvX2ZpZm8pOwogICAgICAgICBwdXRfc3dmX3RhZyhzLCBUQUdfU1RSRUFNQkxPQ0sgfCBUQUdfTE9ORyk7CiAgICAgICAgIGF2aW9fd2wxNihwYiwgc3dmLT5zb3VuZF9zYW1wbGVzKTsKQEAgLTQ1MSwxMyArNDQ3LDEzIEBACiB9CiAKIHN0YXRpYyBpbnQgc3dmX3dyaXRlX2F1ZGlvKEFWRm9ybWF0Q29udGV4dCAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNDb250ZXh0ICplbmMsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCB1aW50OF90ICpidWYsIGludCBzaXplKQogewogICAgIFNXRkNvbnRleHQgKnN3ZiA9IHMtPnByaXZfZGF0YTsKIAogICAgIC8qIEZsYXNoIFBsYXllciBsaW1pdCAqLwogICAgIGlmIChzd2YtPnN3Zl9mcmFtZV9udW1iZXIgPT0gMTYwMDApCi0gICAgICAgIGF2X2xvZyhlbmMsIEFWX0xPR19JTkZPLCAid2FybmluZzogRmxhc2ggUGxheWVyIGxpbWl0IG9mIDE2MDAwIGZyYW1lcyByZWFjaGVkXG4iKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19JTkZPLCAid2FybmluZzogRmxhc2ggUGxheWVyIGxpbWl0IG9mIDE2MDAwIGZyYW1lcyByZWFjaGVkXG4iKTsKIAogICAgIGlmIChhdl9maWZvX3NpemUoc3dmLT5hdWRpb19maWZvKSArIHNpemUgPiBBVURJT19GSUZPX1NJWkUpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgImF1ZGlvIGZpZm8gdG9vIHNtYWxsIHRvIG11eCBhdWRpbyBlc3NlbmNlXG4iKTsKQEAgLTQ2NSwzNiArNDYxLDM2IEBACiAgICAgfQogCiAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHN3Zi0+YXVkaW9fZmlmbywgYnVmLCBzaXplLCBOVUxMKTsKLSAgICBzd2YtPnNvdW5kX3NhbXBsZXMgKz0gZW5jLT5mcmFtZV9zaXplOworICAgIHN3Zi0+c291bmRfc2FtcGxlcyArPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHBhciwgc2l6ZSk7CiAKICAgICAvKiBpZiBhdWRpbyBvbmx5IHN0cmVhbSBtYWtlIHN1cmUgd2UgYWRkIHN3ZiBmcmFtZXMgKi8KLSAgICBpZiAoIXN3Zi0+dmlkZW9fZW5jKQotICAgICAgICBzd2Zfd3JpdGVfdmlkZW8ocywgZW5jLCAwLCAwKTsKKyAgICBpZiAoIXN3Zi0+dmlkZW9fcGFyKQorICAgICAgICBzd2Zfd3JpdGVfdmlkZW8ocywgcGFyLCAwLCAwKTsKIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHN3Zl93cml0ZV9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlYzsKLSAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKQotICAgICAgICByZXR1cm4gc3dmX3dyaXRlX2F1ZGlvKHMsIGNvZGVjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlY3BhcjsKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgcmV0dXJuIHN3Zl93cml0ZV9hdWRpbyhzLCBwYXIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKICAgICBlbHNlCi0gICAgICAgIHJldHVybiBzd2Zfd3JpdGVfdmlkZW8ocywgY29kZWMsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKKyAgICAgICAgcmV0dXJuIHN3Zl93cml0ZV92aWRlbyhzLCBwYXIsIHBrdC0+ZGF0YSwgcGt0LT5zaXplKTsKIH0KIAogc3RhdGljIGludCBzd2Zfd3JpdGVfdHJhaWxlcihBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgU1dGQ29udGV4dCAqc3dmID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMsICp2aWRlb19lbmM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgKnZpZGVvX3BhcjsKICAgICBpbnQgZmlsZV9zaXplLCBpOwogCi0gICAgdmlkZW9fZW5jID0gTlVMTDsKKyAgICB2aWRlb19wYXIgPSBOVUxMOwogICAgIGZvcihpPTA7aTxzLT5uYl9zdHJlYW1zO2krKykgewotICAgICAgICBlbmMgPSBzLT5zdHJlYW1zW2ldLT5jb2RlYzsKLSAgICAgICAgaWYgKGVuYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pCi0gICAgICAgICAgICB2aWRlb19lbmMgPSBlbmM7CisgICAgICAgIHBhciA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyOworICAgICAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKKyAgICAgICAgICAgIHZpZGVvX3BhciA9IHBhcjsKICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICBhdl9maWZvX2ZyZWVwKCZzd2YtPmF1ZGlvX2ZpZm8pOwogICAgICAgICB9CkBAIC01MDQsNyArNTAwLDcgQEAKICAgICBwdXRfc3dmX2VuZF90YWcocyk7CiAKICAgICAvKiBwYXRjaCBmaWxlIHNpemUgYW5kIG51bWJlciBvZiBmcmFtZXMgaWYgbm90IHN0cmVhbWVkICovCi0gICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmJiB2aWRlb19lbmMpIHsKKyAgICBpZiAoKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJiB2aWRlb19wYXIpIHsKICAgICAgICAgZmlsZV9zaXplID0gYXZpb190ZWxsKHBiKTsKICAgICAgICAgYXZpb19zZWVrKHBiLCA0LCBTRUVLX1NFVCk7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgZmlsZV9zaXplKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3Rha2RlYy5jIGIvbGliYXZmb3JtYXQvdGFrZGVjLmMKaW5kZXggOTcwYWI0YS4uNmZkYTM1YyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdGFrZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvdGFrZGVjLmMKQEAgLTIwLDEyICsyMCwxNSBAQAogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCisKKyNkZWZpbmUgQklUU1RSRUFNX1JFQURFUl9MRQogI2luY2x1ZGUgImxpYmF2Y29kZWMvdGFrLmgiCisKKyNpbmNsdWRlICJhcGV0YWcuaCIKICNpbmNsdWRlICJhdmZvcm1hdC5oIgogI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgInJhd2RlYy5oIgotI2luY2x1ZGUgImFwZXRhZy5oIgogCiB0eXBlZGVmIHN0cnVjdCBUQUtEZW11eENvbnRleHQgewogICAgIGludCAgICAgbWxhc3RfZnJhbWU7CkBAIC01OCw5ICs2MSw5IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9UQUs7Ci0gICAgc3QtPm5lZWRfcGFyc2luZyAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1RBSzsKKyAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMX1JBVzsKIAogICAgIHRjLT5tbGFzdF9mcmFtZSA9IDA7CiAgICAgaWYgKGF2aW9fcmwzMihwYikgIT0gTUtUQUcoJ3QnLCAnQicsICdhJywgJ0snKSkgewpAQCAtMTAwLDcgKzEwMyw2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZmZlciwgc2l6ZSAtIDMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgVEFLX01FVEFEQVRBX01ENTogewogICAgICAgICAgICAgdWludDhfdCBtZDVbMTZdOwpAQCAtMTI1LDcgKzEyNyw3IEBACiAgICAgICAgIGNhc2UgVEFLX01FVEFEQVRBX0VORDogewogICAgICAgICAgICAgaW50NjRfdCBjdXJwb3MgPSBhdmlvX3RlbGwocGIpOwogCi0gICAgICAgICAgICBpZiAocGItPnNlZWthYmxlKSB7CisgICAgICAgICAgICBpZiAocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgICAgICAgICBmZl9hcGVfcGFyc2VfdGFnKHMpOwogICAgICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgY3VycG9zLCBTRUVLX1NFVCk7CiAgICAgICAgICAgICB9CkBAIC0xNDIsMjcgKzE0NCwzMSBAQAogICAgICAgICBpZiAodHlwZSA9PSBUQUtfTUVUQURBVEFfU1RSRUFNSU5GTykgewogICAgICAgICAgICAgVEFLU3RyZWFtSW5mbyB0aTsKIAotICAgICAgICAgICAgYXZwcml2X3Rha19wYXJzZV9zdHJlYW1pbmZvKCZnYiwgJnRpKTsKKyAgICAgICAgICAgIHJldCA9IGF2cHJpdl90YWtfcGFyc2Vfc3RyZWFtaW5mbygmdGksIGJ1ZmZlciwgc2l6ZSAtMyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgIGlmICh0aS5zYW1wbGVzID4gMCkKICAgICAgICAgICAgICAgICBzdC0+ZHVyYXRpb24gPSB0aS5zYW1wbGVzOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSB0aS5icHM7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHRpLmJwczsKICAgICAgICAgICAgIGlmICh0aS5jaF9sYXlvdXQpCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IHRpLmNoX2xheW91dDsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gdGkuc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgICAgICAgICAgICA9IHRpLmNoYW5uZWxzOworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSB0aS5jaF9sYXlvdXQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgICAgICAgICA9IHRpLnNhbXBsZV9yYXRlOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICAgICAgICAgPSB0aS5jaGFubmVsczsKICAgICAgICAgICAgIHN0LT5zdGFydF90aW1lICAgICAgICAgICAgICAgICAgID0gMDsKLSAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhICAgICAgICAgICAgID0gYnVmZmVyOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAgICAgICAgPSBzaXplIC0gMzsKKyAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICAgICAgICAgICAgID0gYnVmZmVyOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSAgICAgICAgPSBzaXplIC0gMzsKICAgICAgICAgICAgIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgID0gTlVMTDsKICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFRBS19NRVRBREFUQV9MQVNUX0ZSQU1FKSB7CiAgICAgICAgICAgICBpZiAoc2l6ZSAhPSAxMSkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgICAgIGluaXRfZ2V0X2JpdHM4KCZnYiwgYnVmZmVyLCBzaXplIC0gMyk7CiAgICAgICAgICAgICB0Yy0+bWxhc3RfZnJhbWUgPSAxOwogICAgICAgICAgICAgdGMtPmRhdGFfZW5kICAgID0gZ2V0X2JpdHM2NCgmZ2IsIFRBS19MQVNUX0ZSQU1FX1BPU19CSVRTKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYml0cygmZ2IsIFRBS19MQVNUX0ZSQU1FX1NJWkVfQklUUyk7CiAgICAgICAgICAgICBhdl9mcmVlcCgmYnVmZmVyKTsKICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFRBS19NRVRBREFUQV9FTkNPREVSKSB7CisgICAgICAgICAgICBpbml0X2dldF9iaXRzOCgmZ2IsIGJ1ZmZlciwgc2l6ZSAtIDMpOwogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAiZW5jb2RlciB2ZXJzaW9uOiAlMFhcbiIsCiAgICAgICAgICAgICAgICAgICAgZ2V0X2JpdHNfbG9uZygmZ2IsIFRBS19FTkNPREVSX1ZFUlNJT05fQklUUykpOwogICAgICAgICAgICAgYXZfZnJlZXAoJmJ1ZmZlcik7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC90Y3AuYyBiL2xpYmF2Zm9ybWF0L3RjcC5jCmluZGV4IDU3Mzg2OTAuLjg3NzM0OTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3RjcC5jCisrKyBiL2xpYmF2Zm9ybWF0L3RjcC5jCkBAIC00MSw2ICs0MSw3IEBACiAgICAgaW50IGxpc3Rlbl90aW1lb3V0OwogICAgIGludCByZWN2X2J1ZmZlcl9zaXplOwogICAgIGludCBzZW5kX2J1ZmZlcl9zaXplOworICAgIGludCB0Y3Bfbm9kZWxheTsKIH0gVENQQ29udGV4dDsKIAogI2RlZmluZSBPRkZTRVQoeCkgb2Zmc2V0b2YoVENQQ29udGV4dCwgeCkKQEAgLTUyLDYgKzUzLDcgQEAKICAgICB7ICJsaXN0ZW5fdGltZW91dCIsICAiQ29ubmVjdGlvbiBhd2FpdGluZyB0aW1lb3V0IChpbiBtaWxsaXNlY29uZHMpIiwgICAgICBPRkZTRVQobGlzdGVuX3RpbWVvdXQpLCBBVl9PUFRfVFlQRV9JTlQsIHsgLmk2NCA9IC0xIH0sICAgICAgICAgLTEsIElOVF9NQVgsIC5mbGFncyA9IER8RSB9LAogICAgIHsgInNlbmRfYnVmZmVyX3NpemUiLCAiU29ja2V0IHNlbmQgYnVmZmVyIHNpemUgKGluIGJ5dGVzKSIsICAgICAgICAgICAgICAgIE9GRlNFVChzZW5kX2J1ZmZlcl9zaXplKSwgQVZfT1BUX1RZUEVfSU5ULCB7IC5pNjQgPSAtMSB9LCAgICAgICAgIC0xLCBJTlRfTUFYLCAuZmxhZ3MgPSBEfEUgfSwKICAgICB7ICJyZWN2X2J1ZmZlcl9zaXplIiwgIlNvY2tldCByZWNlaXZlIGJ1ZmZlciBzaXplIChpbiBieXRlcykiLCAgICAgICAgICAgICBPRkZTRVQocmVjdl9idWZmZXJfc2l6ZSksIEFWX09QVF9UWVBFX0lOVCwgeyAuaTY0ID0gLTEgfSwgICAgICAgICAtMSwgSU5UX01BWCwgLmZsYWdzID0gRHxFIH0sCisgICAgeyAidGNwX25vZGVsYXkiLCAiVXNlIFRDUF9OT0RFTEFZIHRvIGRpc2FibGUgbmFnbGUncyBhbGdvcml0aG0iLCAgICAgICAgICAgT0ZGU0VUKHRjcF9ub2RlbGF5KSwgQVZfT1BUX1RZUEVfQk9PTCwgeyAuaTY0ID0gMCB9LCAgICAgICAgICAgICAwLCAxLCAuZmxhZ3MgPSBEfEUgfSwKICAgICB7IE5VTEwgfQogfTsKIApAQCAtMTIyLDYgKzEyNCwxNiBAQAogICAgIGN1cl9haSA9IGFpOwogCiAgcmVzdGFydDoKKyNpZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9JTjYKKyAgICAvLyB3b3JrYXJvdW5kIGZvciBJT1M5IGdldGFkZHJpbmZvIGluIElQdjYgb25seSBuZXR3b3JrIHVzZSBoYXJkY29kZSBJUHY0IGFkZHJlc3MgY2FuIG5vdCByZXNvbHZlIHBvcnQgbnVtYmVyLgorICAgIGlmIChjdXJfYWktPmFpX2ZhbWlseSA9PSBBRl9JTkVUNil7CisgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbjYgKiBzb2NrYWRkcl92NiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopY3VyX2FpLT5haV9hZGRyOworICAgICAgICBpZiAoIXNvY2thZGRyX3Y2LT5zaW42X3BvcnQpeworICAgICAgICAgICAgc29ja2FkZHJfdjYtPnNpbjZfcG9ydCA9IGh0b25zKHBvcnQpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKICAgICBmZCA9IGZmX3NvY2tldChjdXJfYWktPmFpX2ZhbWlseSwKICAgICAgICAgICAgICAgICAgICBjdXJfYWktPmFpX3NvY2t0eXBlLAogICAgICAgICAgICAgICAgICAgIGN1cl9haS0+YWlfcHJvdG9jb2wpOwpAQCAtMTMwLDYgKzE0MiwxOCBAQAogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQogCisgICAgLyogU2V0IHRoZSBzb2NrZXQncyBzZW5kIG9yIHJlY2VpdmUgYnVmZmVyIHNpemVzLCBpZiBzcGVjaWZpZWQuCisgICAgICAgSWYgdW5zcGVjaWZpZWQgb3Igc2V0dGluZyBmYWlscywgc3lzdGVtIGRlZmF1bHQgaXMgdXNlZC4gKi8KKyAgICBpZiAocy0+cmVjdl9idWZmZXJfc2l6ZSA+IDApIHsKKyAgICAgICAgc2V0c29ja29wdCAoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnMtPnJlY3ZfYnVmZmVyX3NpemUsIHNpemVvZiAocy0+cmVjdl9idWZmZXJfc2l6ZSkpOworICAgIH0KKyAgICBpZiAocy0+c2VuZF9idWZmZXJfc2l6ZSA+IDApIHsKKyAgICAgICAgc2V0c29ja29wdCAoZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJnMtPnNlbmRfYnVmZmVyX3NpemUsIHNpemVvZiAocy0+c2VuZF9idWZmZXJfc2l6ZSkpOworICAgIH0KKyAgICBpZiAocy0+dGNwX25vZGVsYXkgPiAwKSB7CisgICAgICAgIHNldHNvY2tvcHQgKGZkLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVksICZzLT50Y3Bfbm9kZWxheSwgc2l6ZW9mIChzLT50Y3Bfbm9kZWxheSkpOworICAgIH0KKwogICAgIGlmIChzLT5saXN0ZW4gPT0gMikgewogICAgICAgICAvLyBtdWx0aS1jbGllbnQKICAgICAgICAgaWYgKChyZXQgPSBmZl9saXN0ZW4oZmQsIGN1cl9haS0+YWlfYWRkciwgY3VyX2FpLT5haV9hZGRybGVuKSkgPCAwKQpAQCAtMTU0LDE0ICsxNzgsNiBAQAogCiAgICAgaC0+aXNfc3RyZWFtZWQgPSAxOwogICAgIHMtPmZkID0gZmQ7Ci0gICAgLyogU2V0IHRoZSBzb2NrZXQncyBzZW5kIG9yIHJlY2VpdmUgYnVmZmVyIHNpemVzLCBpZiBzcGVjaWZpZWQuCi0gICAgICAgSWYgdW5zcGVjaWZpZWQgb3Igc2V0dGluZyBmYWlscywgc3lzdGVtIGRlZmF1bHQgaXMgdXNlZC4gKi8KLSAgICBpZiAocy0+cmVjdl9idWZmZXJfc2l6ZSA+IDApIHsKLSAgICAgICAgc2V0c29ja29wdCAoZmQsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnMtPnJlY3ZfYnVmZmVyX3NpemUsIHNpemVvZiAocy0+cmVjdl9idWZmZXJfc2l6ZSkpOwotICAgIH0KLSAgICBpZiAocy0+c2VuZF9idWZmZXJfc2l6ZSA+IDApIHsKLSAgICAgICAgc2V0c29ja29wdCAoZmQsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJnMtPnNlbmRfYnVmZmVyX3NpemUsIHNpemVvZiAocy0+c2VuZF9idWZmZXJfc2l6ZSkpOwotICAgIH0KIAogICAgIGZyZWVhZGRyaW5mbyhhaSk7CiAgICAgcmV0dXJuIDA7CkBAIC0xOTMsNyArMjA5LDcgQEAKICAgICBjYyA9ICgqYyktPnByaXZfZGF0YTsKICAgICByZXQgPSBmZl9hY2NlcHQoc2MtPmZkLCBzYy0+bGlzdGVuX3RpbWVvdXQsIHMpOwogICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gZmZfbmV0ZXJybm8oKTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICBjYy0+ZmQgPSByZXQ7CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yMDksNiArMjI1LDggQEAKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIHJldCA9IHJlY3Yocy0+ZmQsIGJ1Ziwgc2l6ZSwgMCk7CisgICAgaWYgKHJldCA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAgICAgcmV0dXJuIHJldCA8IDAgPyBmZl9uZXRlcnJubygpIDogcmV0OwogfQogCkBAIC0yNTUsNyArMjczLDI3IEBACiAgICAgcmV0dXJuIHMtPmZkOwogfQogCi1VUkxQcm90b2NvbCBmZl90Y3BfcHJvdG9jb2wgPSB7CitzdGF0aWMgaW50IHRjcF9nZXRfd2luZG93X3NpemUoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBUQ1BDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCBhdmFpbDsKKyAgICBzb2NrbGVuX3QgYXZhaWxfbGVuID0gc2l6ZW9mKGF2YWlsKTsKKworI2lmIEhBVkVfV0lOU09DSzJfSAorICAgIC8qIFNPX1JDVkJVRiB3aXRoIHdpbnNvY2sgb25seSByZXBvcnRzIHRoZSBhY3R1YWwgVENQIHdpbmRvdyBzaXplIHdoZW4KKyAgICBhdXRvLXR1bmluZyBoYXMgYmVlbiBkaXNhYmxlZCB2aWEgc2V0dGluZyBTT19SQ1ZCVUYgKi8KKyAgICBpZiAocy0+cmVjdl9idWZmZXJfc2l6ZSA8IDApIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmIChnZXRzb2Nrb3B0KHMtPmZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZhdmFpbCwgJmF2YWlsX2xlbikpIHsKKyAgICAgICAgcmV0dXJuIGZmX25ldGVycm5vKCk7CisgICAgfQorICAgIHJldHVybiBhdmFpbDsKK30KKworY29uc3QgVVJMUHJvdG9jb2wgZmZfdGNwX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICAgICAgID0gInRjcCIsCiAgICAgLnVybF9vcGVuICAgICAgICAgICAgPSB0Y3Bfb3BlbiwKICAgICAudXJsX2FjY2VwdCAgICAgICAgICA9IHRjcF9hY2NlcHQsCkBAIC0yNjMsNiArMzAxLDcgQEAKICAgICAudXJsX3dyaXRlICAgICAgICAgICA9IHRjcF93cml0ZSwKICAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IHRjcF9jbG9zZSwKICAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IHRjcF9nZXRfZmlsZV9oYW5kbGUsCisgICAgLnVybF9nZXRfc2hvcnRfc2VlayAgPSB0Y3BfZ2V0X3dpbmRvd19zaXplLAogICAgIC51cmxfc2h1dGRvd24gICAgICAgID0gdGNwX3NodXRkb3duLAogICAgIC5wcml2X2RhdGFfc2l6ZSAgICAgID0gc2l6ZW9mKFRDUENvbnRleHQpLAogICAgIC5mbGFncyAgICAgICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3RlZGNhcHRpb25zZGVjLmMgYi9saWJhdmZvcm1hdC90ZWRjYXB0aW9uc2RlYy5jCmluZGV4IGI2ZGM1MTcuLjc3NGQ0OTkgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3RlZGNhcHRpb25zZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvdGVkY2FwdGlvbnNkZWMuYwpAQCAtMjk1LDggKzI5NSw4IEBACiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGF2ZiwgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9URVhUOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICA9IEFWX0NPREVDX0lEX1RFWFQ7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMDApOwogICAgIHN0LT5wcm9iZV9wYWNrZXRzID0gMDsKICAgICBzdC0+c3RhcnRfdGltZSAgICA9IDA7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC90ZWUuYyBiL2xpYmF2Zm9ybWF0L3RlZS5jCmluZGV4IDEzOTA3MDUuLmVmM2IxMTMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3RlZS5jCisrKyBiL2xpYmF2Zm9ybWF0L3RlZS5jCkBAIC0yNiwxMjkgKzI2LDE1MSBAQAogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiYXZmb3JtYXQuaCIKICNpbmNsdWRlICJhdmlvX2ludGVybmFsLmgiCisjaW5jbHVkZSAidGVlX2NvbW1vbi5oIgogCi0jZGVmaW5lIE1BWF9TTEFWRVMgMTYKK3R5cGVkZWYgZW51bSB7CisgICAgT05fU0xBVkVfRkFJTFVSRV9BQk9SVCAgPSAxLAorICAgIE9OX1NMQVZFX0ZBSUxVUkVfSUdOT1JFID0gMgorfSBTbGF2ZUZhaWx1cmVQb2xpY3k7CisKKyNkZWZpbmUgREVGQVVMVF9TTEFWRV9GQUlMVVJFX1BPTElDWSBPTl9TTEFWRV9GQUlMVVJFX0FCT1JUCiAKIHR5cGVkZWYgc3RydWN0IHsKICAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjsKLSAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKipic2ZzOyAvLy88IGJpdHN0cmVhbSBmaWx0ZXJzIHBlciBzdHJlYW0KKyAgICBBVkJTRkNvbnRleHQgKipic2ZzOyAvLy88IGJpdHN0cmVhbSBmaWx0ZXJzIHBlciBzdHJlYW0KKworICAgIFNsYXZlRmFpbHVyZVBvbGljeSBvbl9mYWlsOworICAgIGludCB1c2VfZmlmbzsKKyAgICBBVkRpY3Rpb25hcnkgKmZpZm9fb3B0aW9uczsKIAogICAgIC8qKiBtYXAgZnJvbSBpbnB1dCB0byBvdXRwdXQgc3RyZWFtcyBpbmRleGVzLAogICAgICAqIGRpc2FibGVkIG91dHB1dCBzdHJlYW1zIGFyZSBzZXQgdG8gLTEgKi8KICAgICBpbnQgKnN0cmVhbV9tYXA7CisgICAgaW50IGhlYWRlcl93cml0dGVuOwogfSBUZWVTbGF2ZTsKIAogdHlwZWRlZiBzdHJ1Y3QgVGVlQ29udGV4dCB7CiAgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CiAgICAgdW5zaWduZWQgbmJfc2xhdmVzOwotICAgIFRlZVNsYXZlIHNsYXZlc1tNQVhfU0xBVkVTXTsKKyAgICB1bnNpZ25lZCBuYl9hbGl2ZTsKKyAgICBUZWVTbGF2ZSAqc2xhdmVzOworICAgIGludCB1c2VfZmlmbzsKKyAgICBBVkRpY3Rpb25hcnkgKmZpZm9fb3B0aW9uczsKKyAgICBjaGFyICpmaWZvX29wdGlvbnNfc3RyOwogfSBUZWVDb250ZXh0OwogCiBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2xhdmVfZGVsaW0gICAgID0gInwiOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsYXZlX29wdF9vcGVuICA9ICJbIjsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGF2ZV9vcHRfY2xvc2UgPSAiXSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2xhdmVfb3B0X2RlbGltID0gIjpdIjsgLyogbXVzdCBoYXZlIHRoZSBjbG9zZSB0b28gKi8KIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGF2ZV9ic2ZzX3NwZWNfc2VwID0gIi8iOwogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsYXZlX3NlbGVjdF9zZXAgPSAiLCI7CiAKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRlZUNvbnRleHQsIHgpCitzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0geworICAgICAgICB7InVzZV9maWZvIiwgIlVzZSBmaWZvIHBzZXVkby1tdXhlciB0byBzZXBhcmF0ZSBhY3R1YWwgbXV4ZXJzIGZyb20gZW5jb2RlciIsCisgICAgICAgICBPRkZTRVQodXNlX2ZpZm8pLCBBVl9PUFRfVFlQRV9CT09MLCB7Lmk2NCA9IDB9LCAwLCAxLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTX0sCisgICAgICAgIHsiZmlmb19vcHRpb25zIiwgImZpZm8gcHNldWRvLW11eGVyIG9wdGlvbnMiLCBPRkZTRVQoZmlmb19vcHRpb25zX3N0ciksCisgICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNfSwKKyAgICAgICAge05VTEx9Cit9OworCiBzdGF0aWMgY29uc3QgQVZDbGFzcyB0ZWVfbXV4ZXJfY2xhc3MgPSB7CiAgICAgLmNsYXNzX25hbWUgPSAiVGVlIG11eGVyIiwKICAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gPSBvcHRpb25zLAogICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAotc3RhdGljIGludCBwYXJzZV9zbGF2ZV9vcHRpb25zKHZvaWQgKmxvZywgY2hhciAqc2xhdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucywgY2hhciAqKmZpbGVuYW1lKQorc3RhdGljIGlubGluZSBpbnQgcGFyc2Vfc2xhdmVfZmFpbHVyZV9wb2xpY3lfb3B0aW9uKGNvbnN0IGNoYXIgKm9wdCwgVGVlU2xhdmUgKnRlZV9zbGF2ZSkKIHsKLSAgICBjb25zdCBjaGFyICpwOwotICAgIGNoYXIgKmtleSwgKnZhbDsKLSAgICBpbnQgcmV0OworICAgIGlmICghb3B0KSB7CisgICAgICAgIHRlZV9zbGF2ZS0+b25fZmFpbCA9IERFRkFVTFRfU0xBVkVfRkFJTFVSRV9QT0xJQ1k7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIWF2X3N0cmNhc2VjbXAoImFib3J0Iiwgb3B0KSkgeworICAgICAgICB0ZWVfc2xhdmUtPm9uX2ZhaWwgPSBPTl9TTEFWRV9GQUlMVVJFX0FCT1JUOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFhdl9zdHJjYXNlY21wKCJpZ25vcmUiLCBvcHQpKSB7CisgICAgICAgIHRlZV9zbGF2ZS0+b25fZmFpbCA9IE9OX1NMQVZFX0ZBSUxVUkVfSUdOT1JFOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLyogU2V0IGZhaWx1cmUgYmVoYXZpb3VyIHRvIGFib3J0LCBzbyBpbnZhbGlkIG9wdGlvbiBlcnJvciB3aWxsIG5vdCBiZSBpZ25vcmVkICovCisgICAgdGVlX3NsYXZlLT5vbl9mYWlsID0gT05fU0xBVkVfRkFJTFVSRV9BQk9SVDsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQogCi0gICAgaWYgKCFzdHJzcG4oc2xhdmUsIHNsYXZlX29wdF9vcGVuKSkgewotICAgICAgICAqZmlsZW5hbWUgPSBzbGF2ZTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHAgPSBzbGF2ZSArIDE7Ci0gICAgaWYgKHN0cnNwbihwLCBzbGF2ZV9vcHRfY2xvc2UpKSB7Ci0gICAgICAgICpmaWxlbmFtZSA9IChjaGFyICopcCArIDE7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB3aGlsZSAoMSkgewotICAgICAgICByZXQgPSBhdl9vcHRfZ2V0X2tleV92YWx1ZSgmcCwgIj0iLCBzbGF2ZV9vcHRfZGVsaW0sIDAsICZrZXksICZ2YWwpOwotICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLCAiTm8gb3B0aW9uIGZvdW5kIG5lYXIgXCIlc1wiXG4iLCBwKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKK3N0YXRpYyBpbnQgcGFyc2Vfc2xhdmVfZmlmb19vcHRpb25zKGNvbnN0IGNoYXIgKnVzZV9maWZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlmb19vcHRpb25zLCBUZWVTbGF2ZSAqdGVlX3NsYXZlKQoreworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKHVzZV9maWZvKSB7CisgICAgICAgIC8qVE9ETyAtIGNoYW5nZSB0aGlzIHRvIHVzZSBwcm9wZXIgZnVuY3Rpb24gZm9yIHBhcnNpbmcgYm9vbGVhbgorICAgICAgICAgKiAgICAgICBvcHRpb25zIHdoZW4gdGhlcmUgaXMgb25lICovCisgICAgICAgIGlmIChhdl9tYXRjaF9uYW1lKHVzZV9maWZvLCAidHJ1ZSx5LHllcyxlbmFibGUsZW5hYmxlZCxvbiwxIikpIHsKKyAgICAgICAgICAgIHRlZV9zbGF2ZS0+dXNlX2ZpZm8gPSAxOworICAgICAgICB9IGVsc2UgaWYgKGF2X21hdGNoX25hbWUodXNlX2ZpZm8sICJmYWxzZSxuLG5vLGRpc2FibGUsZGlzYWJsZWQsb2ZmLDAiKSkgeworICAgICAgICAgICAgdGVlX3NsYXZlLT51c2VfZmlmbyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9Ci0gICAgICAgIHJldCA9IGF2X2RpY3Rfc2V0KG9wdGlvbnMsIGtleSwgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0RPTlRfU1RSRFVQX0tFWSB8IEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGlmIChzdHJzcG4ocCwgc2xhdmVfb3B0X2Nsb3NlKSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBwKys7CiAgICAgfQotICAgICpmaWxlbmFtZSA9IChjaGFyICopcCArIDE7Ci0gICAgcmV0dXJuIDA7CiAKLWZhaWw6Ci0gICAgYXZfZGljdF9mcmVlKG9wdGlvbnMpOworICAgIGlmIChmaWZvX29wdGlvbnMpCisgICAgICAgIHJldCA9IGF2X2RpY3RfcGFyc2Vfc3RyaW5nKCZ0ZWVfc2xhdmUtPmZpZm9fb3B0aW9ucywgZmlmb19vcHRpb25zLCAiPSIsICI6IiwgMCk7CisKICAgICByZXR1cm4gcmV0OwogfQogCi0vKioKLSAqIFBhcnNlIGxpc3Qgb2YgYml0c3RyZWFtIGZpbHRlcnMgYW5kIGFkZCB0aGVtIHRvIHRoZSBsaXN0IG9mIGZpbHRlcnMKLSAqIHBvaW50ZWQgdG8gYnkgYnNmcy4KLSAqCi0gKiBUaGUgbGlzdCBtdXN0IGJlIHNwZWNpZmllZCBpbiB0aGUgZm9ybToKLSAqIEJTRlMgOjo9IEJTRlssQlNGU10KLSAqLwotc3RhdGljIGludCBwYXJzZV9ic2ZzKHZvaWQgKmxvZ19jdHgsIGNvbnN0IGNoYXIgKmJzZnNfc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKipic2ZzKQorc3RhdGljIGludCBjbG9zZV9zbGF2ZShUZWVTbGF2ZSAqdGVlX3NsYXZlKQogewotICAgIGNoYXIgKmJzZl9uYW1lLCAqYnVmLCAqZHVwLCAqc2F2ZXB0cjsKKyAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjsKKyAgICB1bnNpZ25lZCBpOwogICAgIGludCByZXQgPSAwOwogCi0gICAgaWYgKCEoZHVwID0gYnVmID0gYXZfc3RyZHVwKGJzZnNfc3BlYykpKQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIGF2ZiA9IHRlZV9zbGF2ZS0+YXZmOworICAgIGlmICghYXZmKQorICAgICAgICByZXR1cm4gMDsKIAotICAgIHdoaWxlIChic2ZfbmFtZSA9IGF2X3N0cnRvayhidWYsICIsIiwgJnNhdmVwdHIpKSB7Ci0gICAgICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqYnNmID0gYXZfYml0c3RyZWFtX2ZpbHRlcl9pbml0KGJzZl9uYW1lKTsKKyAgICBpZiAodGVlX3NsYXZlLT5oZWFkZXJfd3JpdHRlbikKKyAgICAgICAgcmV0ID0gYXZfd3JpdGVfdHJhaWxlcihhdmYpOwogCi0gICAgICAgIGlmICghYnNmKSB7Ci0gICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaW5pdGlhbGl6ZSBiaXRzdHJlYW0gZmlsdGVyIHdpdGggbmFtZSAnJXMnLCAiCi0gICAgICAgICAgICAgICAgICAgInVua25vd24gZmlsdGVyIG9yIGludGVybmFsIGVycm9yIGhhcHBlbmVkXG4iLAotICAgICAgICAgICAgICAgICAgIGJzZl9uYW1lKTsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogYXBwZW5kIGJzZiBjb250ZXh0IHRvIHRoZSBsaXN0IG9mIGJzZiBjb250ZXh0cyAqLwotICAgICAgICAqYnNmcyA9IGJzZjsKLSAgICAgICAgYnNmcyA9ICZic2YtPm5leHQ7Ci0KLSAgICAgICAgYnVmID0gTlVMTDsKKyAgICBpZiAodGVlX3NsYXZlLT5ic2ZzKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdmYtPm5iX3N0cmVhbXM7ICsraSkKKyAgICAgICAgICAgIGF2X2JzZl9mcmVlKCZ0ZWVfc2xhdmUtPmJzZnNbaV0pOwogICAgIH0KKyAgICBhdl9mcmVlcCgmdGVlX3NsYXZlLT5zdHJlYW1fbWFwKTsKKyAgICBhdl9mcmVlcCgmdGVlX3NsYXZlLT5ic2ZzKTsKIAotZW5kOgotICAgIGF2X2ZyZWUoZHVwKTsKKyAgICBmZl9mb3JtYXRfaW9fY2xvc2UoYXZmLCAmYXZmLT5wYik7CisgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KGF2Zik7CisgICAgdGVlX3NsYXZlLT5hdmYgPSBOVUxMOwogICAgIHJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGNsb3NlX3NsYXZlcyhBVkZvcm1hdENvbnRleHQgKmF2ZikKK3sKKyAgICBUZWVDb250ZXh0ICp0ZWUgPSBhdmYtPnByaXZfZGF0YTsKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IHRlZS0+bmJfc2xhdmVzOyBpKyspIHsKKyAgICAgICAgY2xvc2Vfc2xhdmUoJnRlZS0+c2xhdmVzW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZXAoJnRlZS0+c2xhdmVzKTsKK30KKwogc3RhdGljIGludCBvcGVuX3NsYXZlKEFWRm9ybWF0Q29udGV4dCAqYXZmLCBjaGFyICpzbGF2ZSwgVGVlU2xhdmUgKnRlZV9zbGF2ZSkKIHsKICAgICBpbnQgaSwgcmV0OwogICAgIEFWRGljdGlvbmFyeSAqb3B0aW9ucyA9IE5VTEw7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmVudHJ5OwogICAgIGNoYXIgKmZpbGVuYW1lOwotICAgIGNoYXIgKmZvcm1hdCA9IE5VTEwsICpzZWxlY3QgPSBOVUxMOworICAgIGNoYXIgKmZvcm1hdCA9IE5VTEwsICpzZWxlY3QgPSBOVUxMLCAqb25fZmFpbCA9IE5VTEw7CisgICAgY2hhciAqdXNlX2ZpZm8gPSBOVUxMLCAqZmlmb19vcHRpb25zX3N0ciA9IE5VTEw7CiAgICAgQVZGb3JtYXRDb250ZXh0ICphdmYyID0gTlVMTDsKICAgICBBVlN0cmVhbSAqc3QsICpzdDI7CiAgICAgaW50IHN0cmVhbV9jb3VudDsKICAgICBpbnQgZnVsbHJldDsKICAgICBjaGFyICpzdWJzZWxlY3QgPSBOVUxMLCAqbmV4dF9zdWJzZWxlY3QgPSBOVUxMLCAqZmlyc3Rfc3Vic2VsZWN0ID0gTlVMTCwgKnRtcF9zZWxlY3QgPSBOVUxMOwogCi0gICAgaWYgKChyZXQgPSBwYXJzZV9zbGF2ZV9vcHRpb25zKGF2Ziwgc2xhdmUsICZvcHRpb25zLCAmZmlsZW5hbWUpKSA8IDApCisgICAgaWYgKChyZXQgPSBmZl90ZWVfcGFyc2Vfc2xhdmVfb3B0aW9ucyhhdmYsIHNsYXZlLCAmb3B0aW9ucywgJmZpbGVuYW1lKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogCiAjZGVmaW5lIFNURUFMX09QVElPTihvcHRpb24sIGZpZWxkKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xNjEsMTQgKzE4Myw1OSBAQAogCiAgICAgU1RFQUxfT1BUSU9OKCJmIiwgZm9ybWF0KTsKICAgICBTVEVBTF9PUFRJT04oInNlbGVjdCIsIHNlbGVjdCk7CisgICAgU1RFQUxfT1BUSU9OKCJvbmZhaWwiLCBvbl9mYWlsKTsKKyAgICBTVEVBTF9PUFRJT04oInVzZV9maWZvIiwgdXNlX2ZpZm8pOworICAgIFNURUFMX09QVElPTigiZmlmb19vcHRpb25zIiwgZmlmb19vcHRpb25zX3N0cik7CiAKLSAgICByZXQgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJmF2ZjIsIE5VTEwsIGZvcm1hdCwgZmlsZW5hbWUpOworICAgIHJldCA9IHBhcnNlX3NsYXZlX2ZhaWx1cmVfcG9saWN5X29wdGlvbihvbl9mYWlsLCB0ZWVfc2xhdmUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIG9uZmFpbCBvcHRpb24gdmFsdWUsIHZhbGlkIG9wdGlvbnMgYXJlICdhYm9ydCcgYW5kICdpZ25vcmUnXG4iKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgcmV0ID0gcGFyc2Vfc2xhdmVfZmlmb19vcHRpb25zKHVzZV9maWZvLCBmaWZvX29wdGlvbnNfc3RyLCB0ZWVfc2xhdmUpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIkVycm9yIHBhcnNpbmcgZmlmbyBvcHRpb25zOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKHRlZV9zbGF2ZS0+dXNlX2ZpZm8pIHsKKworICAgICAgICBpZiAob3B0aW9ucykgeworICAgICAgICAgICAgY2hhciAqZm9ybWF0X29wdGlvbnNfc3RyID0gTlVMTDsKKyAgICAgICAgICAgIHJldCA9IGF2X2RpY3RfZ2V0X3N0cmluZyhvcHRpb25zLCAmZm9ybWF0X29wdGlvbnNfc3RyLCAnPScsICc6Jyk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICAgICAgcmV0ID0gYXZfZGljdF9zZXQoJnRlZV9zbGF2ZS0+Zmlmb19vcHRpb25zLCAiZm9ybWF0X29wdHMiLCBmb3JtYXRfb3B0aW9uc19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldCA9IGF2X2RpY3Rfc2V0KCZ0ZWVfc2xhdmUtPmZpZm9fb3B0aW9ucywgImZpZm9fZm9ybWF0IiwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgICAgICAgICAgZm9ybWF0ID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisKKyAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKKyAgICAgICAgb3B0aW9ucyA9IHRlZV9zbGF2ZS0+Zmlmb19vcHRpb25zOworICAgIH0KKyAgICByZXQgPSBhdmZvcm1hdF9hbGxvY19vdXRwdXRfY29udGV4dDIoJmF2ZjIsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZV9zbGF2ZS0+dXNlX2ZpZm8gPyAiZmlmbyIgOmZvcm1hdCwgZmlsZW5hbWUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGVuZDsKKyAgICB0ZWVfc2xhdmUtPmF2ZiA9IGF2ZjI7CiAgICAgYXZfZGljdF9jb3B5KCZhdmYyLT5tZXRhZGF0YSwgYXZmLT5tZXRhZGF0YSwgMCk7CiAgICAgYXZmMi0+b3BhcXVlICAgPSBhdmYtPm9wYXF1ZTsKICAgICBhdmYyLT5pb19vcGVuICA9IGF2Zi0+aW9fb3BlbjsKICAgICBhdmYyLT5pb19jbG9zZSA9IGF2Zi0+aW9fY2xvc2U7CisgICAgYXZmMi0+aW50ZXJydXB0X2NhbGxiYWNrID0gYXZmLT5pbnRlcnJ1cHRfY2FsbGJhY2s7CisgICAgYXZmMi0+ZmxhZ3MgPSBhdmYtPmZsYWdzOwogCiAgICAgdGVlX3NsYXZlLT5zdHJlYW1fbWFwID0gYXZfY2FsbG9jKGF2Zi0+bmJfc3RyZWFtcywgc2l6ZW9mKCp0ZWVfc2xhdmUtPnN0cmVhbV9tYXApKTsKICAgICBpZiAoIXRlZV9zbGF2ZS0+c3RyZWFtX21hcCkgewpAQCAtMjE2LDI2ICsyODMsMTcgQEAKICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICB9Ci0gICAgICAgIHN0Mi0+aWQgPSBzdC0+aWQ7Ci0gICAgICAgIHN0Mi0+cl9mcmFtZV9yYXRlICAgICAgICA9IHN0LT5yX2ZyYW1lX3JhdGU7Ci0gICAgICAgIHN0Mi0+dGltZV9iYXNlICAgICAgICAgICA9IHN0LT50aW1lX2Jhc2U7Ci0gICAgICAgIHN0Mi0+c3RhcnRfdGltZSAgICAgICAgICA9IHN0LT5zdGFydF90aW1lOwotICAgICAgICBzdDItPmR1cmF0aW9uICAgICAgICAgICAgPSBzdC0+ZHVyYXRpb247Ci0gICAgICAgIHN0Mi0+bmJfZnJhbWVzICAgICAgICAgICA9IHN0LT5uYl9mcmFtZXM7Ci0gICAgICAgIHN0Mi0+ZGlzcG9zaXRpb24gICAgICAgICA9IHN0LT5kaXNwb3NpdGlvbjsKLSAgICAgICAgc3QyLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0gICAgICAgIHN0Mi0+YXZnX2ZyYW1lX3JhdGUgICAgICA9IHN0LT5hdmdfZnJhbWVfcmF0ZTsKLSAgICAgICAgYXZfZGljdF9jb3B5KCZzdDItPm1ldGFkYXRhLCBzdC0+bWV0YWRhdGEsIDApOwotICAgICAgICBpZiAoKHJldCA9IGF2Y29kZWNfY29weV9jb250ZXh0KHN0Mi0+Y29kZWMsIHN0LT5jb2RlYykpIDwgMCkKKworICAgICAgICByZXQgPSBmZl9zdHJlYW1fZW5jb2RlX3BhcmFtc19jb3B5KHN0Miwgc3QpOworICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgIH0KIAotICAgIGlmICghKGF2ZjItPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSkgewotICAgICAgICBpZiAoKHJldCA9IGF2ZjItPmlvX29wZW4oYXZmMiwgJmF2ZjItPnBiLCBmaWxlbmFtZSwgQVZJT19GTEFHX1dSSVRFLCBOVUxMKSkgPCAwKSB7Ci0gICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJTbGF2ZSAnJXMnOiBlcnJvciBvcGVuaW5nOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICBzbGF2ZSwgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9CisgICAgcmV0ID0gZmZfZm9ybWF0X291dHB1dF9vcGVuKGF2ZjIsIGZpbGVuYW1lLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJTbGF2ZSAnJXMnOiBlcnJvciBvcGVuaW5nOiAlc1xuIiwgc2xhdmUsCisgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKICAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihhdmYyLCAmb3B0aW9ucykpIDwgMCkgewpAQCAtMjQzLDkgKzMwMSw5IEBACiAgICAgICAgICAgICAgICBzbGF2ZSwgYXZfZXJyMnN0cihyZXQpKTsKICAgICAgICAgZ290byBlbmQ7CiAgICAgfQorICAgIHRlZV9zbGF2ZS0+aGVhZGVyX3dyaXR0ZW4gPSAxOwogCi0gICAgdGVlX3NsYXZlLT5hdmYgPSBhdmYyOwotICAgIHRlZV9zbGF2ZS0+YnNmcyA9IGF2X2NhbGxvYyhhdmYyLT5uYl9zdHJlYW1zLCBzaXplb2YoVGVlU2xhdmUpKTsKKyAgICB0ZWVfc2xhdmUtPmJzZnMgPSBhdl9jYWxsb2MoYXZmMi0+bmJfc3RyZWFtcywgc2l6ZW9mKCp0ZWVfc2xhdmUtPmJzZnMpKTsKICAgICBpZiAoIXRlZV9zbGF2ZS0+YnNmcykgewogICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIGdvdG8gZW5kOwpAQCAtMjU5LDcgKzMxNyw4IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiU3BlY2lmaWVyIHNlcGFyYXRvciBpbiAnJXMnIGlzICclYycsIGJ1dCBvbmx5IGNoYXJhY3RlcnMgJyVzJyAiCiAgICAgICAgICAgICAgICAgICAgICAgICJhcmUgYWxsb3dlZFxuIiwgZW50cnktPmtleSwgKnNwZWMsIHNsYXZlX2JzZnNfc3BlY19zZXApOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3BlYysrOyAvKiBjb25zdW1lIHNlcGFyYXRvciAqLwogICAgICAgICB9CkBAIC0yODIsNyArMzQxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgJyVzJywgZmlsdGVycyB3aWxsIGJlIGlnbm9yZWRcbiIsIGksIGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldCA9IHBhcnNlX2JzZnMoYXZmLCBlbnRyeS0+dmFsdWUsICZ0ZWVfc2xhdmUtPmJzZnNbaV0pOworICAgICAgICAgICAgICAgIHJldCA9IGF2X2JzZl9saXN0X3BhcnNlX3N0cihlbnRyeS0+dmFsdWUsICZ0ZWVfc2xhdmUtPmJzZnNbaV0pOwogICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGJpdHN0cmVhbSBmaWx0ZXIgc2VxdWVuY2UgJyVzJyBhc3NvY2lhdGVkIHRvICIKQEAgLTI5NSw2ICszNTQsMzcgQEAKICAgICAgICAgYXZfZGljdF9zZXQoJm9wdGlvbnMsIGVudHJ5LT5rZXksIE5VTEwsIDApOwogICAgIH0KIAorICAgIGZvciAoaSA9IDA7IGkgPCBhdmYtPm5iX3N0cmVhbXM7IGkrKyl7CisgICAgICAgIGludCB0YXJnZXRfc3RyZWFtID0gdGVlX3NsYXZlLT5zdHJlYW1fbWFwW2ldOworICAgICAgICBpZiAodGFyZ2V0X3N0cmVhbSA8IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIXRlZV9zbGF2ZS0+YnNmc1t0YXJnZXRfc3RyZWFtXSkgeworICAgICAgICAgICAgLyogQWRkIHBhc3MtdGhyb3VnaCBiaXRzdHJlYW0gZmlsdGVyICovCisgICAgICAgICAgICByZXQgPSBhdl9ic2ZfZ2V0X251bGxfZmlsdGVyKCZ0ZWVfc2xhdmUtPmJzZnNbdGFyZ2V0X3N0cmVhbV0pOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gY3JlYXRlIHBhc3MtdGhyb3VnaCBiaXRzdHJlYW0gZmlsdGVyOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRlZV9zbGF2ZS0+YnNmc1t0YXJnZXRfc3RyZWFtXS0+dGltZV9iYXNlX2luID0gYXZmLT5zdHJlYW1zW2ldLT50aW1lX2Jhc2U7CisgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KHRlZV9zbGF2ZS0+YnNmc1t0YXJnZXRfc3RyZWFtXS0+cGFyX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmYtPnN0cmVhbXNbaV0tPmNvZGVjcGFyKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGVuZDsKKworICAgICAgICByZXQgPSBhdl9ic2ZfaW5pdCh0ZWVfc2xhdmUtPmJzZnNbdGFyZ2V0X3N0cmVhbV0pOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIGJpdHN0cmVhbSBmaWx0ZXIocyk6ICVzXG4iLAorICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorCiAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAgZW50cnkgPSBOVUxMOwogICAgICAgICB3aGlsZSAoKGVudHJ5ID0gYXZfZGljdF9nZXQob3B0aW9ucywgIiIsIGVudHJ5LCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKQEAgLTMwNiw1OCArMzk2LDUxIEBACiBlbmQ6CiAgICAgYXZfZnJlZShmb3JtYXQpOwogICAgIGF2X2ZyZWUoc2VsZWN0KTsKKyAgICBhdl9mcmVlKG9uX2ZhaWwpOwogICAgIGF2X2RpY3RfZnJlZSgmb3B0aW9ucyk7CiAgICAgYXZfZnJlZXAoJnRtcF9zZWxlY3QpOwogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNsb3NlX3NsYXZlcyhBVkZvcm1hdENvbnRleHQgKmF2ZikKLXsKLSAgICBUZWVDb250ZXh0ICp0ZWUgPSBhdmYtPnByaXZfZGF0YTsKLSAgICBBVkZvcm1hdENvbnRleHQgKmF2ZjI7Ci0gICAgdW5zaWduZWQgaSwgajsKLQotICAgIGZvciAoaSA9IDA7IGkgPCB0ZWUtPm5iX3NsYXZlczsgaSsrKSB7Ci0gICAgICAgIGF2ZjIgPSB0ZWUtPnNsYXZlc1tpXS5hdmY7Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGF2ZjItPm5iX3N0cmVhbXM7IGorKykgewotICAgICAgICAgICAgQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZfbmV4dCwgKmJzZiA9IHRlZS0+c2xhdmVzW2ldLmJzZnNbal07Ci0gICAgICAgICAgICB3aGlsZSAoYnNmKSB7Ci0gICAgICAgICAgICAgICAgYnNmX25leHQgPSBic2YtPm5leHQ7Ci0gICAgICAgICAgICAgICAgYXZfYml0c3RyZWFtX2ZpbHRlcl9jbG9zZShic2YpOwotICAgICAgICAgICAgICAgIGJzZiA9IGJzZl9uZXh0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyZWVwKCZ0ZWUtPnNsYXZlc1tpXS5zdHJlYW1fbWFwKTsKLSAgICAgICAgYXZfZnJlZXAoJnRlZS0+c2xhdmVzW2ldLmJzZnMpOwotCi0gICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShhdmYyLCAmYXZmMi0+cGIpOwotICAgICAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQoYXZmMik7Ci0gICAgICAgIHRlZS0+c2xhdmVzW2ldLmF2ZiA9IE5VTEw7Ci0gICAgfQotfQotCiBzdGF0aWMgdm9pZCBsb2dfc2xhdmUoVGVlU2xhdmUgKnNsYXZlLCB2b2lkICpsb2dfY3R4LCBpbnQgbG9nX2xldmVsKQogewogICAgIGludCBpOwogICAgIGF2X2xvZyhsb2dfY3R4LCBsb2dfbGV2ZWwsICJmaWxlbmFtZTonJXMnIGZvcm1hdDolc1xuIiwKLSAgICAgICAgICAgc2xhdmUtPmF2Zi0+ZmlsZW5hbWUsIHNsYXZlLT5hdmYtPm9mb3JtYXQtPm5hbWUpOworICAgICAgICAgICBzbGF2ZS0+YXZmLT51cmwsIHNsYXZlLT5hdmYtPm9mb3JtYXQtPm5hbWUpOwogICAgIGZvciAoaSA9IDA7IGkgPCBzbGF2ZS0+YXZmLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gc2xhdmUtPmF2Zi0+c3RyZWFtc1tpXTsKLSAgICAgICAgQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2YgPSBzbGF2ZS0+YnNmc1tpXTsKKyAgICAgICAgQVZCU0ZDb250ZXh0ICpic2YgPSBzbGF2ZS0+YnNmc1tpXTsKKyAgICAgICAgY29uc3QgY2hhciAqYnNmX25hbWU7CiAKICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiAgICBzdHJlYW06JWQgY29kZWM6JXMgdHlwZTolcyIsCi0gICAgICAgICAgICAgICBpLCBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlYy0+Y29kZWNfaWQpLAotICAgICAgICAgICAgICAgYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSkpOwotICAgICAgICBpZiAoYnNmKSB7Ci0gICAgICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiIGJzZnM6Iik7Ci0gICAgICAgICAgICB3aGlsZSAoYnNmKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKGxvZ19jdHgsIGxvZ19sZXZlbCwgIiVzJXMiLAotICAgICAgICAgICAgICAgICAgICAgICBic2YtPmZpbHRlci0+bmFtZSwgYnNmLT5uZXh0ID8gIiwiIDogIiIpOwotICAgICAgICAgICAgICAgIGJzZiA9IGJzZi0+bmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhdl9sb2cobG9nX2N0eCwgbG9nX2xldmVsLCAiXG4iKTsKKyAgICAgICAgICAgICAgIGksIGF2Y29kZWNfZ2V0X25hbWUoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCksCisgICAgICAgICAgICAgICBhdl9nZXRfbWVkaWFfdHlwZV9zdHJpbmcoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlKSk7CisKKyAgICAgICAgYnNmX25hbWUgPSBic2YtPmZpbHRlci0+cHJpdl9jbGFzcyA/CisgICAgICAgICAgICAgICAgICAgYnNmLT5maWx0ZXItPnByaXZfY2xhc3MtPml0ZW1fbmFtZShic2YpIDogYnNmLT5maWx0ZXItPm5hbWU7CisgICAgICAgIGF2X2xvZyhsb2dfY3R4LCBsb2dfbGV2ZWwsICIgYnNmczogJXNcbiIsIGJzZl9uYW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdGVlX3Byb2Nlc3Nfc2xhdmVfZmFpbHVyZShBVkZvcm1hdENvbnRleHQgKmF2ZiwgdW5zaWduZWQgc2xhdmVfaWR4LCBpbnQgZXJyX24pCit7CisgICAgVGVlQ29udGV4dCAqdGVlID0gYXZmLT5wcml2X2RhdGE7CisgICAgVGVlU2xhdmUgKnRlZV9zbGF2ZSA9ICZ0ZWUtPnNsYXZlc1tzbGF2ZV9pZHhdOworCisgICAgdGVlLT5uYl9hbGl2ZS0tOworCisgICAgY2xvc2Vfc2xhdmUodGVlX3NsYXZlKTsKKworICAgIGlmICghdGVlLT5uYl9hbGl2ZSkgeworICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJBbGwgdGVlIG91dHB1dHMgZmFpbGVkLlxuIik7CisgICAgICAgIHJldHVybiBlcnJfbjsKKyAgICB9IGVsc2UgaWYgKHRlZV9zbGF2ZS0+b25fZmFpbCA9PSBPTl9TTEFWRV9GQUlMVVJFX0FCT1JUKSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIlNsYXZlIG11eGVyICMldSBmYWlsZWQsIGFib3J0aW5nLlxuIiwgc2xhdmVfaWR4KTsKKyAgICAgICAgcmV0dXJuIGVycl9uOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19FUlJPUiwgIlNsYXZlIG11eGVyICMldSBmYWlsZWQ6ICVzLCBjb250aW51aW5nIHdpdGggJXUvJXUgc2xhdmVzLlxuIiwKKyAgICAgICAgICAgICAgIHNsYXZlX2lkeCwgYXZfZXJyMnN0cihlcnJfbiksIHRlZS0+bmJfYWxpdmUsIHRlZS0+bmJfc2xhdmVzKTsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQogCkBAIC0zNjUsNjcgKzQ0OCw4OCBAQAogewogICAgIFRlZUNvbnRleHQgKnRlZSA9IGF2Zi0+cHJpdl9kYXRhOwogICAgIHVuc2lnbmVkIG5iX3NsYXZlcyA9IDAsIGk7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhdmYtPmZpbGVuYW1lOwotICAgIGNoYXIgKnNsYXZlc1tNQVhfU0xBVkVTXTsKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZSA9IGF2Zi0+dXJsOworICAgIGNoYXIgKipzbGF2ZXMgPSBOVUxMOwogICAgIGludCByZXQ7CiAKICAgICB3aGlsZSAoKmZpbGVuYW1lKSB7Ci0gICAgICAgIGlmIChuYl9zbGF2ZXMgPT0gTUFYX1NMQVZFUykgewotICAgICAgICAgICAgYXZfbG9nKGF2ZiwgQVZfTE9HX0VSUk9SLCAiTWF4aW11bSAlZCBzbGF2ZSBtdXhlcnMgcmVhY2hlZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgTUFYX1NMQVZFUyk7Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SX1BBVENIV0VMQ09NRTsKKyAgICAgICAgY2hhciAqc2xhdmUgPSBhdl9nZXRfdG9rZW4oJmZpbGVuYW1lLCBzbGF2ZV9kZWxpbSk7CisgICAgICAgIGlmICghc2xhdmUpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQotICAgICAgICBpZiAoIShzbGF2ZXNbbmJfc2xhdmVzKytdID0gYXZfZ2V0X3Rva2VuKCZmaWxlbmFtZSwgc2xhdmVfZGVsaW0pKSkgewotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByZXQgPSBhdl9keW5hcnJheV9hZGRfbm9mcmVlKCZzbGF2ZXMsICZuYl9zbGF2ZXMsIHNsYXZlKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoc2xhdmUpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAgICAgICAgIGlmIChzdHJzcG4oZmlsZW5hbWUsIHNsYXZlX2RlbGltKSkKICAgICAgICAgICAgIGZpbGVuYW1lKys7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IG5iX3NsYXZlczsgaSsrKSB7Ci0gICAgICAgIGlmICgocmV0ID0gb3Blbl9zbGF2ZShhdmYsIHNsYXZlc1tpXSwgJnRlZS0+c2xhdmVzW2ldKSkgPCAwKQorICAgIGlmICh0ZWUtPmZpZm9fb3B0aW9uc19zdHIpIHsKKyAgICAgICAgcmV0ID0gYXZfZGljdF9wYXJzZV9zdHJpbmcoJnRlZS0+Zmlmb19vcHRpb25zLCB0ZWUtPmZpZm9fb3B0aW9uc19zdHIsICI9IiwgIjoiLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICBnb3RvIGZhaWw7Ci0gICAgICAgIGxvZ19zbGF2ZSgmdGVlLT5zbGF2ZXNbaV0sIGF2ZiwgQVZfTE9HX1ZFUkJPU0UpOwotICAgICAgICBhdl9mcmVlcCgmc2xhdmVzW2ldKTsKICAgICB9CiAKLSAgICB0ZWUtPm5iX3NsYXZlcyA9IG5iX3NsYXZlczsKKyAgICBpZiAoISh0ZWUtPnNsYXZlcyA9IGF2X21hbGxvY3pfYXJyYXkobmJfc2xhdmVzLCBzaXplb2YoKnRlZS0+c2xhdmVzKSkpKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICB0ZWUtPm5iX3NsYXZlcyA9IHRlZS0+bmJfYWxpdmUgPSBuYl9zbGF2ZXM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2xhdmVzOyBpKyspIHsKKworICAgICAgICB0ZWUtPnNsYXZlc1tpXS51c2VfZmlmbyA9IHRlZS0+dXNlX2ZpZm87CisgICAgICAgIHJldCA9IGF2X2RpY3RfY29weSgmdGVlLT5zbGF2ZXNbaV0uZmlmb19vcHRpb25zLCB0ZWUtPmZpZm9fb3B0aW9ucywgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIGlmICgocmV0ID0gb3Blbl9zbGF2ZShhdmYsIHNsYXZlc1tpXSwgJnRlZS0+c2xhdmVzW2ldKSkgPCAwKSB7CisgICAgICAgICAgICByZXQgPSB0ZWVfcHJvY2Vzc19zbGF2ZV9mYWlsdXJlKGF2ZiwgaSwgcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvZ19zbGF2ZSgmdGVlLT5zbGF2ZXNbaV0sIGF2ZiwgQVZfTE9HX1ZFUkJPU0UpOworICAgICAgICB9CisgICAgICAgIGF2X2ZyZWVwKCZzbGF2ZXNbaV0pOworICAgIH0KIAogICAgIGZvciAoaSA9IDA7IGkgPCBhdmYtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpbnQgaiwgbWFwcGVkID0gMDsKICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRlZS0+bmJfc2xhdmVzOyBqKyspCi0gICAgICAgICAgICBtYXBwZWQgKz0gdGVlLT5zbGF2ZXNbal0uc3RyZWFtX21hcFtpXSA+PSAwOworICAgICAgICAgICAgaWYgKHRlZS0+c2xhdmVzW2pdLmF2ZikKKyAgICAgICAgICAgICAgICBtYXBwZWQgKz0gdGVlLT5zbGF2ZXNbal0uc3RyZWFtX21hcFtpXSA+PSAwOwogICAgICAgICBpZiAoIW1hcHBlZCkKICAgICAgICAgICAgIGF2X2xvZyhhdmYsIEFWX0xPR19XQVJOSU5HLCAiSW5wdXQgc3RyZWFtICMlZCBpcyBub3QgbWFwcGVkICIKICAgICAgICAgICAgICAgICAgICAidG8gYW55IHNsYXZlLlxuIiwgaSk7CiAgICAgfQorICAgIGF2X2ZyZWUoc2xhdmVzKTsKICAgICByZXR1cm4gMDsKIAogZmFpbDoKICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfc2xhdmVzOyBpKyspCiAgICAgICAgIGF2X2ZyZWVwKCZzbGF2ZXNbaV0pOwogICAgIGNsb3NlX3NsYXZlcyhhdmYpOworICAgIGF2X2ZyZWUoc2xhdmVzKTsKICAgICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHRlZV93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqYXZmKQogewogICAgIFRlZUNvbnRleHQgKnRlZSA9IGF2Zi0+cHJpdl9kYXRhOwotICAgIEFWRm9ybWF0Q29udGV4dCAqYXZmMjsKICAgICBpbnQgcmV0X2FsbCA9IDAsIHJldDsKICAgICB1bnNpZ25lZCBpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IHRlZS0+bmJfc2xhdmVzOyBpKyspIHsKLSAgICAgICAgYXZmMiA9IHRlZS0+c2xhdmVzW2ldLmF2ZjsKLSAgICAgICAgaWYgKChyZXQgPSBhdl93cml0ZV90cmFpbGVyKGF2ZjIpKSA8IDApCi0gICAgICAgICAgICBpZiAoIXJldF9hbGwpCisgICAgICAgIGlmICgocmV0ID0gY2xvc2Vfc2xhdmUoJnRlZS0+c2xhdmVzW2ldKSkgPCAwKSB7CisgICAgICAgICAgICByZXQgPSB0ZWVfcHJvY2Vzc19zbGF2ZV9mYWlsdXJlKGF2ZiwgaSwgcmV0KTsKKyAgICAgICAgICAgIGlmICghcmV0X2FsbCAmJiByZXQgPCAwKQogICAgICAgICAgICAgICAgIHJldF9hbGwgPSByZXQ7Ci0gICAgICAgIGlmICghKGF2ZjItPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSkKLSAgICAgICAgICAgIGZmX2Zvcm1hdF9pb19jbG9zZShhdmYyLCAmYXZmMi0+cGIpOworICAgICAgICB9CiAgICAgfQotICAgIGNsb3NlX3NsYXZlcyhhdmYpOworICAgIGF2X2ZyZWVwKCZ0ZWUtPnNsYXZlcyk7CiAgICAgcmV0dXJuIHJldF9hbGw7CiB9CiAKQEAgLTQzMywzNyArNTM3LDcxIEBACiB7CiAgICAgVGVlQ29udGV4dCAqdGVlID0gYXZmLT5wcml2X2RhdGE7CiAgICAgQVZGb3JtYXRDb250ZXh0ICphdmYyOworICAgIEFWQlNGQ29udGV4dCAqYnNmczsKICAgICBBVlBhY2tldCBwa3QyOwogICAgIGludCByZXRfYWxsID0gMCwgcmV0OwogICAgIHVuc2lnbmVkIGksIHM7CiAgICAgaW50IHMyOwotICAgIEFWUmF0aW9uYWwgdGIsIHRiMjsKIAogICAgIGZvciAoaSA9IDA7IGkgPCB0ZWUtPm5iX3NsYXZlczsgaSsrKSB7Ci0gICAgICAgIGF2ZjIgPSB0ZWUtPnNsYXZlc1tpXS5hdmY7CisgICAgICAgIGlmICghKGF2ZjIgPSB0ZWUtPnNsYXZlc1tpXS5hdmYpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogRmx1c2ggc2xhdmUgaWYgcGt0IGlzIE5VTEwqLworICAgICAgICBpZiAoIXBrdCkgeworICAgICAgICAgICAgcmV0ID0gYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUoYXZmMiwgTlVMTCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIHJldCA9IHRlZV9wcm9jZXNzX3NsYXZlX2ZhaWx1cmUoYXZmLCBpLCByZXQpOworICAgICAgICAgICAgICAgIGlmICghcmV0X2FsbCAmJiByZXQgPCAwKQorICAgICAgICAgICAgICAgICAgICByZXRfYWxsID0gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKwogICAgICAgICBzID0gcGt0LT5zdHJlYW1faW5kZXg7CiAgICAgICAgIHMyID0gdGVlLT5zbGF2ZXNbaV0uc3RyZWFtX21hcFtzXTsKICAgICAgICAgaWYgKHMyIDwgMCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGlmICgocmV0ID0gYXZfY29weV9wYWNrZXQoJnBrdDIsIHBrdCkpIDwgMCB8fAotICAgICAgICAgICAgKHJldCA9IGF2X2R1cF9wYWNrZXQoJnBrdDIpKTwgMCkKKyAgICAgICAgbWVtc2V0KCZwa3QyLCAwLCBzaXplb2YoQVZQYWNrZXQpKTsKKyAgICAgICAgaWYgKChyZXQgPSBhdl9wYWNrZXRfcmVmKCZwa3QyLCBwa3QpKSA8IDApCiAgICAgICAgICAgICBpZiAoIXJldF9hbGwpIHsKICAgICAgICAgICAgICAgICByZXRfYWxsID0gcmV0OwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICB0YiAgPSBhdmYgLT5zdHJlYW1zW3MgXS0+dGltZV9iYXNlOwotICAgICAgICB0YjIgPSBhdmYyLT5zdHJlYW1zW3MyXS0+dGltZV9iYXNlOwotICAgICAgICBwa3QyLnB0cyAgICAgID0gYXZfcmVzY2FsZV9xKHBrdC0+cHRzLCAgICAgIHRiLCB0YjIpOwotICAgICAgICBwa3QyLmR0cyAgICAgID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHRzLCAgICAgIHRiLCB0YjIpOwotICAgICAgICBwa3QyLmR1cmF0aW9uID0gYXZfcmVzY2FsZV9xKHBrdC0+ZHVyYXRpb24sIHRiLCB0YjIpOworICAgICAgICBic2ZzID0gdGVlLT5zbGF2ZXNbaV0uYnNmc1tzMl07CiAgICAgICAgIHBrdDIuc3RyZWFtX2luZGV4ID0gczI7CiAKLSAgICAgICAgaWYgKChyZXQgPSBhdl9hcHBseV9iaXRzdHJlYW1fZmlsdGVycyhhdmYyLT5zdHJlYW1zW3MyXS0+Y29kZWMsICZwa3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlZS0+c2xhdmVzW2ldLmJzZnNbczJdKSkgPCAwIHx8Ci0gICAgICAgICAgICAocmV0ID0gYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUoYXZmMiwgJnBrdDIpKSA8IDApCi0gICAgICAgICAgICBpZiAoIXJldF9hbGwpCisgICAgICAgIHJldCA9IGF2X2JzZl9zZW5kX3BhY2tldChic2ZzLCAmcGt0Mik7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coYXZmLCBBVl9MT0dfRVJST1IsICJFcnJvciB3aGlsZSBzZW5kaW5nIHBhY2tldCB0byBiaXRzdHJlYW0gZmlsdGVyOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgcmV0ID0gdGVlX3Byb2Nlc3Nfc2xhdmVfZmFpbHVyZShhdmYsIGksIHJldCk7CisgICAgICAgICAgICBpZiAoIXJldF9hbGwgJiYgcmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXRfYWxsID0gcmV0OworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUoMSkgeworICAgICAgICAgICAgcmV0ID0gYXZfYnNmX3JlY2VpdmVfcGFja2V0KGJzZnMsICZwa3QyKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUihFQUdBSU4pKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdl9wYWNrZXRfcmVzY2FsZV90cygmcGt0MiwgYnNmcy0+dGltZV9iYXNlX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2ZjItPnN0cmVhbXNbczJdLT50aW1lX2Jhc2UpOworICAgICAgICAgICAgcmV0ID0gYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUoYXZmMiwgJnBrdDIpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIHJldCA9IHRlZV9wcm9jZXNzX3NsYXZlX2ZhaWx1cmUoYXZmLCBpLCByZXQpOworICAgICAgICAgICAgaWYgKCFyZXRfYWxsICYmIHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0X2FsbCA9IHJldDsKKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gcmV0X2FsbDsKIH0KQEAgLTQ3Niw1ICs2MTQsNSBAQAogICAgIC53cml0ZV90cmFpbGVyICAgICA9IHRlZV93cml0ZV90cmFpbGVyLAogICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHRlZV93cml0ZV9wYWNrZXQsCiAgICAgLnByaXZfY2xhc3MgICAgICAgID0gJnRlZV9tdXhlcl9jbGFzcywKLSAgICAuZmxhZ3MgICAgICAgICAgICAgPSBBVkZNVF9OT0ZJTEUsCisgICAgLmZsYWdzICAgICAgICAgICAgID0gQVZGTVRfTk9GSUxFIHwgQVZGTVRfQUxMT1dfRkxVU0gsCiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGVlX2NvbW1vbi5jIGIvbGliYXZmb3JtYXQvdGVlX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NjA4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90ZWVfY29tbW9uLmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIFRlZSBjb21tb24gY29kZQorICogQ29weXJpZ2h0IChjKSAyMDEyIE5pY29sYXMgR2VvcmdlCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJ0ZWVfY29tbW9uLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzbGF2ZV9vcHRfb3BlbiAgPSAiWyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2xhdmVfb3B0X2Nsb3NlID0gIl0iOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNsYXZlX29wdF9kZWxpbSA9ICI6XSI7IC8qIG11c3QgaGF2ZSB0aGUgY2xvc2UgdG9vICovCisKK2ludCBmZl90ZWVfcGFyc2Vfc2xhdmVfb3B0aW9ucyh2b2lkICpsb2csIGNoYXIgKnNsYXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMsIGNoYXIgKipmaWxlbmFtZSkKK3sKKyAgICBjb25zdCBjaGFyICpwOworICAgIGNoYXIgKmtleSwgKnZhbDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFzdHJzcG4oc2xhdmUsIHNsYXZlX29wdF9vcGVuKSkgeworICAgICAgICAqZmlsZW5hbWUgPSBzbGF2ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHAgPSBzbGF2ZSArIDE7CisgICAgaWYgKHN0cnNwbihwLCBzbGF2ZV9vcHRfY2xvc2UpKSB7CisgICAgICAgICpmaWxlbmFtZSA9IChjaGFyICopcCArIDE7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB3aGlsZSAoMSkgeworICAgICAgICByZXQgPSBhdl9vcHRfZ2V0X2tleV92YWx1ZSgmcCwgIj0iLCBzbGF2ZV9vcHRfZGVsaW0sIDAsICZrZXksICZ2YWwpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGxvZywgQVZfTE9HX0VSUk9SLCAiTm8gb3B0aW9uIGZvdW5kIG5lYXIgXCIlc1wiXG4iLCBwKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBhdl9kaWN0X3NldChvcHRpb25zLCBrZXksIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgfCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBpZiAoc3Ryc3BuKHAsIHNsYXZlX29wdF9jbG9zZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgcCsrOworICAgIH0KKyAgICAqZmlsZW5hbWUgPSAoY2hhciAqKXAgKyAxOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2RpY3RfZnJlZShvcHRpb25zKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGVlX2NvbW1vbi5oIGIvbGliYXZmb3JtYXQvdGVlX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDdmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90ZWVfY29tbW9uLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIFRlZSBjb21tb24gY29kZQorICogQ29weXJpZ2h0IChjKSAyMDE2IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxAbmllZGVybWF5ZXIuY2M+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVkZPUk1BVF9URUVfQ09NTU9OX0gKKyNkZWZpbmUgQVZGT1JNQVRfVEVFX0NPTU1PTl9ICisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorCitpbnQgZmZfdGVlX3BhcnNlX3NsYXZlX29wdGlvbnModm9pZCAqbG9nLCBjaGFyICpzbGF2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKipvcHRpb25zLCBjaGFyICoqZmlsZW5hbWUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3RlZXByb3RvLmMgYi9saWJhdmZvcm1hdC90ZWVwcm90by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MzJiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90ZWVwcm90by5jCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogVGVlIG91dHB1dCBwcm90b2NvbAorICogQ29weXJpZ2h0IChjKSAyMDE2IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImF2aW9faW50ZXJuYWwuaCIKKyNpbmNsdWRlICJ0ZWVfY29tbW9uLmgiCisKK3R5cGVkZWYgc3RydWN0IENoaWxkQ29udGV4dCB7CisgICAgVVJMQ29udGV4dCAqdXJsX2NvbnRleHQ7Cit9IENoaWxkQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgVGVlQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IGNoaWxkX2NvdW50OworICAgIENoaWxkQ29udGV4dCAqY2hpbGQ7Cit9IFRlZUNvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB0ZWVfb3B0aW9uc1tdID0geworICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgY29uc3QgQVZDbGFzcyB0ZWVfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAidGVlIiwKKyAgICAuaXRlbV9uYW1lICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgID0gdGVlX29wdGlvbnMsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGRfZGVsaW0gPSAifCI7CisKK3N0YXRpYyBpbnQgdGVlX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgVGVlQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICBpbnQgaTsKKyAgICBpbnQgbWFpbl9yZXQgPSBzaXplOworCisgICAgZm9yIChpPTA7IGk8Yy0+Y2hpbGRfY291bnQ7IGkrKykgeworICAgICAgICBpbnQgcmV0ID0gZmZ1cmxfd3JpdGUoYy0+Y2hpbGRbaV0udXJsX2NvbnRleHQsIGJ1Ziwgc2l6ZSk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgbWFpbl9yZXQgPSByZXQ7CisgICAgfQorICAgIHJldHVybiBtYWluX3JldDsKK30KKworc3RhdGljIGludCB0ZWVfY2xvc2UoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBUZWVDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIGludCBpOworICAgIGludCBtYWluX3JldCA9IDA7CisKKyAgICBmb3IgKGk9MDsgaTxjLT5jaGlsZF9jb3VudDsgaSsrKSB7CisgICAgICAgIGludCByZXQgPSBmZnVybF9jbG9zZXAoJmMtPmNoaWxkW2ldLnVybF9jb250ZXh0KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBtYWluX3JldCA9IHJldDsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmYy0+Y2hpbGQpOworICAgIGMtPmNoaWxkX2NvdW50ID0gMDsKKyAgICByZXR1cm4gbWFpbl9yZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGVlX29wZW4oVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncykKK3sKKyAgICBUZWVDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIGludCByZXQsIGk7CisKKyAgICBhdl9zdHJzdGFydChmaWxlbmFtZSwgInRlZToiLCAmZmlsZW5hbWUpOworCisgICAgaWYgKGZsYWdzICYgQVZJT19GTEFHX1JFQUQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisKKyAgICB3aGlsZSAoKmZpbGVuYW1lKSB7CisgICAgICAgIGNoYXIgKmNoaWxkX3N0cmluZyA9IGF2X2dldF90b2tlbigmZmlsZW5hbWUsIGNoaWxkX2RlbGltKTsKKyAgICAgICAgY2hhciAqY2hpbGRfbmFtZSA9IE5VTEw7CisgICAgICAgIHZvaWQgKnRtcDsKKyAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRpb25zID0gTlVMTDsKKyAgICAgICAgaWYgKCFjaGlsZF9zdHJpbmcpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoYy0+Y2hpbGQsIGMtPmNoaWxkX2NvdW50ICsgMSwgc2l6ZW9mKCpjLT5jaGlsZCkpOworICAgICAgICBpZiAoIXRtcCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBsb29wX2ZhaWw7CisgICAgICAgIH0KKyAgICAgICAgYy0+Y2hpbGQgPSB0bXA7CisgICAgICAgIG1lbXNldCgmYy0+Y2hpbGRbYy0+Y2hpbGRfY291bnRdLCAwLCBzaXplb2YoYy0+Y2hpbGRbYy0+Y2hpbGRfY291bnRdKSk7CisKKyAgICAgICAgcmV0ID0gZmZfdGVlX3BhcnNlX3NsYXZlX29wdGlvbnMoaCwgY2hpbGRfc3RyaW5nLCAmb3B0aW9ucywgJmNoaWxkX25hbWUpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gbG9vcF9mYWlsOworCisgICAgICAgIHJldCA9IGZmdXJsX29wZW5fd2hpdGVsaXN0KCZjLT5jaGlsZFtjLT5jaGlsZF9jb3VudF0udXJsX2NvbnRleHQsIGNoaWxkX25hbWUsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaC0+aW50ZXJydXB0X2NhbGxiYWNrLCAmb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgpOworbG9vcF9mYWlsOgorICAgICAgICBhdl9mcmVlcCgmY2hpbGRfc3RyaW5nKTsKKyAgICAgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIGMtPmNoaWxkX2NvdW50Kys7CisKKyAgICAgICAgaWYgKHN0cnNwbihmaWxlbmFtZSwgY2hpbGRfZGVsaW0pKQorICAgICAgICAgICAgZmlsZW5hbWUrKzsKKyAgICB9CisKKyAgICBoLT5pc19zdHJlYW1lZCA9IDA7CisgICAgZm9yIChpPTA7IGk8Yy0+Y2hpbGRfY291bnQ7IGkrKykgeworICAgICAgICBoLT5pc19zdHJlYW1lZCB8PSBjLT5jaGlsZFtpXS51cmxfY29udGV4dC0+aXNfc3RyZWFtZWQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIHRlZV9jbG9zZShoKTsKKyAgICByZXR1cm4gcmV0OworfQorY29uc3QgVVJMUHJvdG9jb2wgZmZfdGVlX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICAgICAgID0gInRlZSIsCisgICAgLnVybF9vcGVuICAgICAgICAgICAgPSB0ZWVfb3BlbiwKKyAgICAudXJsX3dyaXRlICAgICAgICAgICA9IHRlZV93cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgICAgICA9IHRlZV9jbG9zZSwKKyAgICAucHJpdl9kYXRhX3NpemUgICAgICA9IHNpemVvZihUZWVDb250ZXh0KSwKKyAgICAucHJpdl9kYXRhX2NsYXNzICAgICA9ICZ0ZWVfY2xhc3MsCisgICAgLmRlZmF1bHRfd2hpdGVsaXN0ICAgPSAiY3J5cHRvLGZpbGUsaHR0cCxodHRwcyxodHRwcHJveHkscnRtcCx0Y3AsdGxzIgorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3Rlc3RzL2ZpZm9fbXV4ZXIuYyBiL2xpYmF2Zm9ybWF0L3Rlc3RzL2ZpZm9fbXV4ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTI3YThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvdGVzdHMvZmlmb19tdXhlci5jCkBAIC0wLDAgKzEsMjg0IEBACisvKgorICogRklGTyBwc2V1ZG8tbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBKYW4gU2ViZWNobGVic2t5CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAqIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvdXJsLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvbmV0d29yay5oIgorCisjZGVmaW5lIE1BWF9UU1RfUEFDS0VUUyAxMjgKKyNkZWZpbmUgU0xFRVBUSU1FXzUwX01TIDUwMDAwCisjZGVmaW5lIFNMRUVQVElNRV8xMF9NUyAxMDAwMAorCisvKiBUaGlzIGlzIHN0cnVjdHVyZSBvZiBkYXRhIHNlbnQgaW4gcGFja2V0cyB0bworICogZmFpbGluZyBtdXhlciAqLwordHlwZWRlZiBzdHJ1Y3QgRmFpbGluZ011eGVyUGFja2V0RGF0YSB7CisgICAgaW50IHJldDsgICAgICAgICAgICAgLyogcmV0dXJuIHZhbHVlIG9mIHdyaXRlX3BhY2tldCBjYWxsKi8KKyAgICBpbnQgcmVjb3Zlcl9hZnRlcjsgICAvKiBzZXQgcmV0IHRvIHplcm8gYWZ0ZXIgdGhpcyBudW1iZXIgb2YgcmVjb3ZlcnkgYXR0ZW1wdHMgKi8KKyAgICB1bnNpZ25lZCBzbGVlcF90aW1lOyAvKiBzbGVlcCBmb3IgdGhpcyBsb25nIGluIHdyaXRlX3BhY2tldCB0byBzaW11bGF0ZSBsb25nIEkvTyBvcGVyYXRpb24gKi8KK30gRmFpbGluZ011eGVyUGFja2V0RGF0YTsKKworc3RhdGljIGludCBwcmVwYXJlX3BhY2tldChBVlBhY2tldCAqcGt0LCBjb25zdCBGYWlsaW5nTXV4ZXJQYWNrZXREYXRhICpwa3RfZGF0YSwgaW50NjRfdCBwdHMpCit7CisgICAgaW50IHJldDsKKyAgICBGYWlsaW5nTXV4ZXJQYWNrZXREYXRhICpkYXRhID0gYXZfbWFsbG9jKHNpemVvZigqZGF0YSkpOworICAgIGlmICghZGF0YSkgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBtZW1jcHkoZGF0YSwgcGt0X2RhdGEsIHNpemVvZihGYWlsaW5nTXV4ZXJQYWNrZXREYXRhKSk7CisgICAgcmV0ID0gYXZfcGFja2V0X2Zyb21fZGF0YShwa3QsICh1aW50OF90KikgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7CisKKyAgICBwa3QtPnB0cyA9IHBrdC0+ZHRzID0gcHRzOworICAgIHBrdC0+ZHVyYXRpb24gPSAxOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpbml0aWFsaXplX2ZpZm9fdHN0X211eGVyX2NoYWluKEFWRm9ybWF0Q29udGV4dCAqKm9jKQoreworICAgIGludCByZXQgPSAwOworICAgIEFWU3RyZWFtICpzOworCisgICAgcmV0ID0gYXZmb3JtYXRfYWxsb2Nfb3V0cHV0X2NvbnRleHQyKG9jLCBOVUxMLCAiZmlmbyIsICItIik7CisgICAgaWYgKHJldCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjcmVhdGUgZm9ybWF0IGNvbnRleHQ6ICVzXG4iLAorICAgICAgICAgICAgICAgIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorCisgICAgcyA9IGF2Zm9ybWF0X25ld19zdHJlYW0oKm9jLCBOVUxMKTsKKyAgICBpZiAoIXMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY3JlYXRlIHN0cmVhbTogJXNcbiIsCisgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlmb19iYXNpY190ZXN0KEFWRm9ybWF0Q29udGV4dCAqb2MsIEFWRGljdGlvbmFyeSAqKm9wdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZhaWxpbmdNdXhlclBhY2tldERhdGEgKnBrdF9kYXRhKQoreworICAgIGludCByZXQgPSAwLCBpOworICAgIEFWUGFja2V0IHBrdDsKKworICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOworCisKKyAgICByZXQgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIob2MsIG9wdHMpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIHdyaXRlX2hlYWRlciBmYWlsdXJlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IDE1OyBpKysgKSB7CisgICAgICAgIHJldCA9IHByZXBhcmVfcGFja2V0KCZwa3QsIHBrdF9kYXRhLCBpKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHByZXBhcmUgdGVzdCBwYWNrZXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgZ290byB3cml0ZV90cmFpbGVyX2FuZF9mYWlsOworICAgICAgICB9CisgICAgICAgIHJldCA9IGF2X3dyaXRlX2ZyYW1lKG9jLCAmcGt0KTsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIHdyaXRlX2ZyYW1lIGVycm9yOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgICAgIGdvdG8gd3JpdGVfdHJhaWxlcl9hbmRfZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldCA9IGF2X3dyaXRlX2ZyYW1lKG9jLCBOVUxMKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgd3JpdGVfZnJhbWUgZXJyb3IgZHVyaW5nIGZsdXNoaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICBnb3RvIHdyaXRlX3RyYWlsZXJfYW5kX2ZhaWw7CisgICAgfQorCisgICAgcmV0ID0gYXZfd3JpdGVfdHJhaWxlcihvYyk7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIHdyaXRlX3RyYWlsZXIgZXJyb3IgZHVyaW5nIGZsdXNoaW5nOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK3dyaXRlX3RyYWlsZXJfYW5kX2ZhaWw6CisgICAgYXZfd3JpdGVfdHJhaWxlcihvYyk7CitmYWlsOgorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmlmb19vdmVyZmxvd19kcm9wX3Rlc3QoQVZGb3JtYXRDb250ZXh0ICpvYywgQVZEaWN0aW9uYXJ5ICoqb3B0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFpbGluZ011eGVyUGFja2V0RGF0YSAqZGF0YSkKK3sKKyAgICBpbnQgcmV0ID0gMCwgaTsKKyAgICBpbnQ2NF90IHdyaXRlX3BrdF9zdGFydCwgd3JpdGVfcGt0X2VuZCwgZHVyYXRpb247CisgICAgQVZQYWNrZXQgcGt0OworCisgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisKKyAgICByZXQgPSBhdmZvcm1hdF93cml0ZV9oZWFkZXIob2MsIG9wdHMpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIHdyaXRlX2hlYWRlciBmYWlsdXJlOiAlc1xuIiwKKyAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHdyaXRlX3BrdF9zdGFydCA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNjsgaSsrICkgeworICAgICAgICByZXQgPSBwcmVwYXJlX3BhY2tldCgmcGt0LCBkYXRhLCBpKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHByZXBhcmUgdGVzdCBwYWNrZXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHJldCA9IGF2X3dyaXRlX2ZyYW1lKG9jLCAmcGt0KTsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd3JpdGVfcGt0X2VuZCA9IGF2X2dldHRpbWVfcmVsYXRpdmUoKTsKKyAgICBkdXJhdGlvbiA9IHdyaXRlX3BrdF9lbmQgLSB3cml0ZV9wa3Rfc3RhcnQ7CisgICAgaWYgKGR1cmF0aW9uID4gKFNMRUVQVElNRV81MF9NUyo2KS8yKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV3JpdGluZyBwYWNrZXRzIHRvIGZpZm8gbXV4ZXIgdG9vayB0b28gbXVjaCB0aW1lIHdoaWxlIHRlc3RpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIG92ZXJmbG93IHdpdGggZHJvcF9wa3RzX29uX292ZXJmbG93IHdhcyBvbi5cbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0JVRzsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmIChyZXQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIHdyaXRlX3BhY2tldCBlcnJvcjogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBhdl93cml0ZV90cmFpbGVyKG9jKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIHdyaXRlX3RyYWlsZXIgZXJyb3I6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworCisgICAgcmV0dXJuIHJldDsKK2ZhaWw6CisgICAgYXZfd3JpdGVfdHJhaWxlcihvYyk7CisgICAgcmV0dXJuIHJldDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UgeworICAgIGludCAoKnRlc3RfZnVuYykoQVZGb3JtYXRDb250ZXh0ICosIEFWRGljdGlvbmFyeSAqKixjb25zdCBGYWlsaW5nTXV4ZXJQYWNrZXREYXRhICpwa3RfZGF0YSk7CisgICAgY29uc3QgY2hhciAqdGVzdF9uYW1lOworICAgIGNvbnN0IGNoYXIgKm9wdGlvbnM7CisKKyAgICB1aW50OF90IHByaW50X3N1bW1hcnlfb25fZGVpbml0OworICAgIGludCB3cml0ZV9oZWFkZXJfcmV0OworICAgIGludCB3cml0ZV90cmFpbGVyX3JldDsKKworICAgIEZhaWxpbmdNdXhlclBhY2tldERhdGEgcGt0X2RhdGE7Cit9IFRlc3RDYXNlOworCisKKyNkZWZpbmUgQlVGRkVSX1NJWkUgNjQKKworc3RhdGljIGludCBydW5fdGVzdChjb25zdCBUZXN0Q2FzZSAqdGVzdCkKK3sKKyAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBOVUxMOworICAgIEFWRm9ybWF0Q29udGV4dCAqb2MgPSBOVUxMOworICAgIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXTsKKyAgICBpbnQgcmV0LCByZXQxOworCisgICAgcmV0ID0gaW5pdGlhbGl6ZV9maWZvX3RzdF9tdXhlcl9jaGFpbigmb2MpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTXV4ZXIgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgaWYgKHRlc3QtPm9wdGlvbnMpIHsKKyAgICAgICAgcmV0ID0gYXZfZGljdF9wYXJzZV9zdHJpbmcoJm9wdHMsIHRlc3QtPm9wdGlvbnMsICI9IiwgIjoiLCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIG9wdGlvbnM6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzbnByaW50ZihidWZmZXIsIEJVRkZFUl9TSVpFLAorICAgICAgICAgICAgICJwcmludF9kZWluaXRfc3VtbWFyeT0lZDp3cml0ZV9oZWFkZXJfcmV0PSVkOndyaXRlX3RyYWlsZXJfcmV0PSVkIiwKKyAgICAgICAgICAgICAoaW50KXRlc3QtPnByaW50X3N1bW1hcnlfb25fZGVpbml0LCB0ZXN0LT53cml0ZV9oZWFkZXJfcmV0LAorICAgICAgICAgICAgIHRlc3QtPndyaXRlX3RyYWlsZXJfcmV0KTsKKyAgICByZXQgPSBhdl9kaWN0X3NldCgmb3B0cywgImZvcm1hdF9vcHRzIiwgYnVmZmVyLCAwKTsKKyAgICByZXQxID0gYXZfZGljdF9zZXQoJm9wdHMsICJmaWZvX2Zvcm1hdCIsICJmaWZvX3Rlc3QiLCAwKTsKKyAgICBpZiAocmV0IDwgMCB8fCByZXQxIDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzZXQgb3B0aW9ucyBmb3IgdGVzdCBtdXhlcjogJXNcbiIsCisgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQorCisgICAgcmV0ID0gdGVzdC0+dGVzdF9mdW5jKG9jLCAmb3B0cywgJnRlc3QtPnBrdF9kYXRhKTsKKworZW5kOgorICAgIHByaW50ZigiJXM6ICVzXG4iLCB0ZXN0LT50ZXN0X25hbWUsIHJldCA8IDAgPyAiZmFpbCIgOiAib2siKTsKKyAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQob2MpOworICAgIGF2X2RpY3RfZnJlZSgmb3B0cyk7CisgICAgcmV0dXJuIHJldDsKK30KKworCitjb25zdCBUZXN0Q2FzZSB0ZXN0c1tdID0geworICAgICAgICAvKiBTaW1wbGUgdGVzdCBpbiBwYWNrZXQtbm9uLWRyb3BwaW5nIG1vZGUsIHdlIGV4cGVjdCB0byBnZXQgb24gdGhlIG91dHB1dAorICAgICAgICAgKiBleGFjdGx5IHdoYXQgd2FzIG9uIGlucHV0ICovCisgICAgICAgIHtmaWZvX2Jhc2ljX3Rlc3QsICJub25mYWlsIHRlc3QiLCBOVUxMLDEsIDAsIDAsIHswLCAwLCAwfX0sCisKKyAgICAgICAgLyogRWFjaCB3cml0ZV9wYWNrZXQgd2lsbCBmYWlsIDMgdGltZXMgYmVmb3JlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLiBJZiByZWNvdmVyeQorICAgICAgICAgKiBTaW5jZSByZWNvdmVyeSBpcyBvbiwgZmlmbyBtdXhlciBzaG91bGQgbm90IHJldHVybiBhbnkgZXJyb3JzLiAqLworICAgICAgICB7Zmlmb19iYXNpY190ZXN0LCAicmVjb3ZlcnkgdGVzdCIsICJhdHRlbXB0X3JlY292ZXJ5PTE6cmVjb3Zlcnlfd2FpdF90aW1lPTAiLAorICAgICAgICAgMCwgMCwgMCwge0FWRVJST1IoRVRJTUVET1VUKSwgMywgMH19LAorCisgICAgICAgIC8qIEJ5IHNldHRpbmcgbG93IHF1ZXVlX3NpemUgYW5kIHNlbmRpbmcgcGFja2V0cyB3aXRoIGxvbmdlciBwcm9jZXNzaW5nIHRpbWUsCisgICAgICAgICAqIHRoaXMgdGVzdCB3aWxsIGNhdXNlIHF1ZXVlIHRvIG92ZXJmbG93LCBzaW5jZSBkcm9wX3BrdHNfb25fb3ZlcmZsb3cgaXMgb2ZmCisgICAgICAgICAqIGJ5IGRlZmF1bHQsIGFsbCBwYWNrZXRzIHNob3VsZCBiZSBwcm9jZXNzZWQgYW5kIGZpZm8gc2hvdWxkIGJsb2NrIG9uIGZ1bGwKKyAgICAgICAgICogcXVldWUuICovCisgICAgICAgIHtmaWZvX2Jhc2ljX3Rlc3QsICJvdmVyZmxvdyB3aXRob3V0IHBhY2tldCBkcm9wcGluZyIsInF1ZXVlX3NpemU9MyIsCisgICAgICAgICAxLCAwLCAwLCB7MCwgMCwgU0xFRVBUSU1FXzEwX01TfX0sCisKKyAgICAgICAgLyogVGhlIHRlc3QgYXMgdGhlIHVwcGVyIG9uZSwgZXhjZXB0IHRoYXQgZHJvcF9vbl9vdmVyZmxvdyBpcyB0dXJuZWQgb24uIEluIHRoaXMgY2FzZQorICAgICAgICAgKiBmaWZvIHNob3VsZCBub3QgYmxvY2sgd2hlbiB0aGUgcXVldWUgaXMgZnVsbCBhbmQgc2xvdyBkb3duIHByb2R1Y2VyLCBzbyB0aGUgdGVzdAorICAgICAgICAgKiBtZWFzdXJlcyB0aW1lIHByb2R1Y2VyIHNwZW5kcyBvbiB3cml0ZV9wYWNrZXQgY2FsbHMgd2hpY2ggc2hvdWxkIGJlIHNpZ25pZmljYW50bHkKKyAgICAgICAgICogbGVzcyB0aGFuIG51bWJlcl9vZl9wa3RzICogNTAgTVMuCisgICAgICAgICAqLworICAgICAgICB7Zmlmb19vdmVyZmxvd19kcm9wX3Rlc3QsICJvdmVyZmxvdyB3aXRoIHBhY2tldCBkcm9wcGluZyIsICJxdWV1ZV9zaXplPTM6ZHJvcF9wa3RzX29uX292ZXJmbG93PTEiLAorICAgICAgICAgMCwgMCwgMCwgezAsIDAsIFNMRUVQVElNRV81MF9NU319LAorCisgICAgICAgIHtOVUxMfQorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgaSwgcmV0LCByZXRfYWxsID0gMDsKKworICAgIGZvciAoaSA9IDA7IHRlc3RzW2ldLnRlc3RfZnVuYzsgaSsrKSB7CisgICAgICAgIHJldCA9IHJ1bl90ZXN0KCZ0ZXN0c1tpXSk7CisgICAgICAgIGlmICghcmV0X2FsbCAmJiByZXQgPCAwKQorICAgICAgICAgICAgcmV0X2FsbCA9IHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGVzdHMvbW92ZW5jLmMgYi9saWJhdmZvcm1hdC90ZXN0cy9tb3ZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE1ZDk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvdGVzdHMvbW92ZW5jLmMKQEAgLTAsMCArMSw3OTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgTWFydGluIFN0b3Jzam8KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZDUuaCIKKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworI2lmICFIQVZFX0dFVE9QVAorI2luY2x1ZGUgImNvbXBhdC9nZXRvcHQuYyIKKyNlbmRpZgorCisjZGVmaW5lIEhBU0hfU0laRSAxNgorCitzdGF0aWMgY29uc3QgdWludDhfdCBoMjY0X2V4dHJhZGF0YVtdID0geworICAgIDB4MDEsIDB4NGQsIDB4NDAsIDB4MWUsIDB4ZmYsIDB4ZTEsIDB4MDAsIDB4MDIsIDB4NjcsIDB4NGQsIDB4MDEsIDB4MDAsIDB4MDIsIDB4NjgsIDB4ZWYKK307CitzdGF0aWMgY29uc3QgdWludDhfdCBhYWNfZXh0cmFkYXRhW10gPSB7CisgICAgMHgxMiwgMHgxMAorfTsKKworCitzdGF0aWMgY29uc3QgY2hhciAqZm9ybWF0ID0gIm1wNCI7CitBVkZvcm1hdENvbnRleHQgKmN0eDsKK3VpbnQ4X3QgaW9idWZbMzI3NjhdOworQVZEaWN0aW9uYXJ5ICpvcHRzOworCitpbnQgd3JpdGVfZmlsZTsKK2NvbnN0IGNoYXIgKmN1cl9uYW1lOworRklMRSogb3V0OworaW50IG91dF9zaXplOworc3RydWN0IEFWTUQ1KiBtZDU7Cit1aW50OF90IGhhc2hbSEFTSF9TSVpFXTsKKworQVZTdHJlYW0gKnZpZGVvX3N0LCAqYXVkaW9fc3Q7CitpbnQ2NF90IGF1ZGlvX2R0cywgdmlkZW9fZHRzOworCitpbnQgYmZyYW1lczsKK2ludDY0X3QgZHVyYXRpb247CitpbnQ2NF90IGF1ZGlvX2R1cmF0aW9uOworaW50IGZyYW1lczsKK2ludCBnb3Bfc2l6ZTsKK2ludDY0X3QgbmV4dF9wX3B0czsKK2VudW0gQVZQaWN0dXJlVHlwZSBsYXN0X3BpY3R1cmU7CitpbnQgc2tpcF93cml0ZTsKK2ludCBza2lwX3dyaXRlX2F1ZGlvOworaW50IGNsZWFyX2R1cmF0aW9uOworaW50IGZvcmNlX2lvYnVmX3NpemU7CitpbnQgZG9faW50ZXJsZWF2ZTsKK2ludCBmYWtlX3BrdF9kdXJhdGlvbjsKKworaW50IG51bV93YXJuaW5nczsKKworaW50IGNoZWNrX2ZhdWx0czsKKworCitzdGF0aWMgdm9pZCBjb3VudF93YXJuaW5ncyh2b2lkICphdmNsLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2bCkKK3sKKyAgICBpZiAobGV2ZWwgPT0gQVZfTE9HX1dBUk5JTkcpCisgICAgICAgIG51bV93YXJuaW5ncysrOworfQorCitzdGF0aWMgdm9pZCBpbml0X2NvdW50X3dhcm5pbmdzKHZvaWQpCit7CisgICAgYXZfbG9nX3NldF9jYWxsYmFjayhjb3VudF93YXJuaW5ncyk7CisgICAgbnVtX3dhcm5pbmdzID0gMDsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfY291bnRfd2FybmluZ3Modm9pZCkKK3sKKyAgICBhdl9sb2dfc2V0X2NhbGxiYWNrKGF2X2xvZ19kZWZhdWx0X2NhbGxiYWNrKTsKK30KKworc3RhdGljIGludCBpb193cml0ZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgb3V0X3NpemUgKz0gc2l6ZTsKKyAgICBhdl9tZDVfdXBkYXRlKG1kNSwgYnVmLCBzaXplKTsKKyAgICBpZiAob3V0KQorICAgICAgICBmd3JpdGUoYnVmLCAxLCBzaXplLCBvdXQpOworICAgIHJldHVybiBzaXplOworfQorCitzdGF0aWMgaW50IGlvX3dyaXRlX2RhdGFfdHlwZSh2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWSU9EYXRhTWFya2VyVHlwZSB0eXBlLCBpbnQ2NF90IHRpbWUpCit7CisgICAgY2hhciB0aW1lYnVmWzMwXSwgY29udGVudFs1XSA9IHsgMCB9OworICAgIGNvbnN0IGNoYXIgKnN0cjsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEFWSU9fREFUQV9NQVJLRVJfSEVBREVSOiAgICAgICAgIHN0ciA9ICJoZWFkZXIiOyAgIGJyZWFrOworICAgIGNhc2UgQVZJT19EQVRBX01BUktFUl9TWU5DX1BPSU5UOiAgICAgc3RyID0gInN5bmMiOyAgICAgYnJlYWs7CisgICAgY2FzZSBBVklPX0RBVEFfTUFSS0VSX0JPVU5EQVJZX1BPSU5UOiBzdHIgPSAiYm91bmRhcnkiOyBicmVhazsKKyAgICBjYXNlIEFWSU9fREFUQV9NQVJLRVJfVU5LTk9XTjogICAgICAgIHN0ciA9ICJ1bmtub3duIjsgIGJyZWFrOworICAgIGNhc2UgQVZJT19EQVRBX01BUktFUl9UUkFJTEVSOiAgICAgICAgc3RyID0gInRyYWlsZXIiOyAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSAidW5rbm93biI7ICBicmVhazsKKyAgICB9CisgICAgaWYgKHRpbWUgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgIHNucHJpbnRmKHRpbWVidWYsIHNpemVvZih0aW1lYnVmKSwgIm5vcHRzIik7CisgICAgZWxzZQorICAgICAgICBzbnByaW50Zih0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksICIlIlBSSWQ2NCwgdGltZSk7CisgICAgLy8gVGhlcmUgY2FuIGJlIG11bHRpcGxlIGhlYWRlci90cmFpbGVyIGNhbGxiYWNrcywgb25seSBsb2cgdGhlIGJveCB0eXBlCisgICAgLy8gZm9yIGhlYWRlciBhdCBvdXRfc2l6ZSA9PSAwCisgICAgaWYgKHR5cGUgIT0gQVZJT19EQVRBX01BUktFUl9VTktOT1dOICYmCisgICAgICAgIHR5cGUgIT0gQVZJT19EQVRBX01BUktFUl9UUkFJTEVSICYmCisgICAgICAgICh0eXBlICE9IEFWSU9fREFUQV9NQVJLRVJfSEVBREVSIHx8IG91dF9zaXplID09IDApICYmCisgICAgICAgIHNpemUgPj0gOCkKKyAgICAgICAgbWVtY3B5KGNvbnRlbnQsICZidWZbNF0sIDQpOworICAgIGVsc2UKKyAgICAgICAgc25wcmludGYoY29udGVudCwgc2l6ZW9mKGNvbnRlbnQpLCAiLSIpOworICAgIHByaW50Zigid3JpdGVfZGF0YSBsZW4gJWQsIHRpbWUgJXMsIHR5cGUgJXMgYXRvbSAlc1xuIiwgc2l6ZSwgdGltZWJ1Ziwgc3RyLCBjb250ZW50KTsKKyAgICByZXR1cm4gaW9fd3JpdGUob3BhcXVlLCBidWYsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpbml0X291dChjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNoYXIgYnVmWzEwMF07CisgICAgY3VyX25hbWUgPSBuYW1lOworICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcy4lcyIsIGN1cl9uYW1lLCBmb3JtYXQpOworCisgICAgYXZfbWQ1X2luaXQobWQ1KTsKKyAgICBpZiAod3JpdGVfZmlsZSkgeworICAgICAgICBvdXQgPSBmb3BlbihidWYsICJ3YiIpOworICAgICAgICBpZiAoIW91dCkKKyAgICAgICAgICAgIHBlcnJvcihidWYpOworICAgIH0KKyAgICBvdXRfc2l6ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX291dCh2b2lkKQoreworICAgIGludCBpOworICAgIGF2X21kNV9maW5hbChtZDUsIGhhc2gpOworICAgIGZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7IGkrKykKKyAgICAgICAgcHJpbnRmKCIlMDJ4IiwgaGFzaFtpXSk7CisgICAgcHJpbnRmKCIgJWQgJXNcbiIsIG91dF9zaXplLCBjdXJfbmFtZSk7CisgICAgaWYgKG91dCkKKyAgICAgICAgZmNsb3NlKG91dCk7CisgICAgb3V0ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZnVuYyhpbnQgdmFsdWUsIGludCBsaW5lLCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHZhX2xpc3QgYXA7CisgICAgICAgIHZhX3N0YXJ0KGFwLCBtc2cpOworICAgICAgICBwcmludGYoIiVkOiAiLCBsaW5lKTsKKyAgICAgICAgdnByaW50Zihtc2csIGFwKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBjaGVja19mYXVsdHMrKzsKKyAgICAgICAgdmFfZW5kKGFwKTsKKyAgICB9Cit9CisjZGVmaW5lIGNoZWNrKHZhbHVlLCAuLi4pIGNoZWNrX2Z1bmModmFsdWUsIF9fTElORV9fLCBfX1ZBX0FSR1NfXykKKworc3RhdGljIHZvaWQgaW5pdF9mcHMoaW50IGJmLCBpbnQgYXVkaW9fcHJlcm9sbCwgaW50IGZwcykKK3sKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGlvYnVmX3NpemUgPSBmb3JjZV9pb2J1Zl9zaXplID8gZm9yY2VfaW9idWZfc2l6ZSA6IHNpemVvZihpb2J1Zik7CisgICAgY3R4ID0gYXZmb3JtYXRfYWxsb2NfY29udGV4dCgpOworICAgIGlmICghY3R4KQorICAgICAgICBleGl0KDEpOworICAgIGN0eC0+b2Zvcm1hdCA9IGF2X2d1ZXNzX2Zvcm1hdChmb3JtYXQsIE5VTEwsIE5VTEwpOworICAgIGlmICghY3R4LT5vZm9ybWF0KQorICAgICAgICBleGl0KDEpOworICAgIGN0eC0+cGIgPSBhdmlvX2FsbG9jX2NvbnRleHQoaW9idWYsIGlvYnVmX3NpemUsIEFWSU9fRkxBR19XUklURSwgTlVMTCwgTlVMTCwgaW9fd3JpdGUsIE5VTEwpOworICAgIGlmICghY3R4LT5wYikKKyAgICAgICAgZXhpdCgxKTsKKyAgICBjdHgtPnBiLT53cml0ZV9kYXRhX3R5cGUgPSBpb193cml0ZV9kYXRhX3R5cGU7CisgICAgY3R4LT5mbGFncyB8PSBBVkZNVF9GTEFHX0JJVEVYQUNUOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKGN0eCwgTlVMTCk7CisgICAgaWYgKCFzdCkKKyAgICAgICAgZXhpdCgxKTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0gyNjQ7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IDY0MDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IDQ4MDsKKyAgICBzdC0+dGltZV9iYXNlLm51bSA9IDE7CisgICAgc3QtPnRpbWVfYmFzZS5kZW4gPSAzMDsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID0gc2l6ZW9mKGgyNjRfZXh0cmFkYXRhKTsKKyAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSA9IGF2X21hbGxvY3ooc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpCisgICAgICAgIGV4aXQoMSk7CisgICAgbWVtY3B5KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBoMjY0X2V4dHJhZGF0YSwgc2l6ZW9mKGgyNjRfZXh0cmFkYXRhKSk7CisgICAgdmlkZW9fc3QgPSBzdDsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShjdHgsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIGV4aXQoMSk7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQUM7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDQ0MTAwOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSAyOworICAgIHN0LT50aW1lX2Jhc2UubnVtID0gMTsKKyAgICBzdC0+dGltZV9iYXNlLmRlbiA9IDQ0MTAwOworICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSBzaXplb2YoYWFjX2V4dHJhZGF0YSk7CisgICAgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEgPSBhdl9tYWxsb2N6KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBpZiAoIXN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKQorICAgICAgICBleGl0KDEpOworICAgIG1lbWNweShzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgYWFjX2V4dHJhZGF0YSwgc2l6ZW9mKGFhY19leHRyYWRhdGEpKTsKKyAgICBhdWRpb19zdCA9IHN0OworCisgICAgaWYgKGF2Zm9ybWF0X3dyaXRlX2hlYWRlcihjdHgsICZvcHRzKSA8IDApCisgICAgICAgIGV4aXQoMSk7CisgICAgYXZfZGljdF9mcmVlKCZvcHRzKTsKKworICAgIGZyYW1lcyA9IDA7CisgICAgZ29wX3NpemUgPSAzMDsKKyAgICBkdXJhdGlvbiA9IHZpZGVvX3N0LT50aW1lX2Jhc2UuZGVuIC8gZnBzOworICAgIGF1ZGlvX2R1cmF0aW9uID0gMTAyNExMICogYXVkaW9fc3QtPnRpbWVfYmFzZS5kZW4gLyBhdWRpb19zdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOworICAgIGlmIChhdWRpb19wcmVyb2xsKQorICAgICAgICBhdWRpb19wcmVyb2xsID0gMjA0OExMICogYXVkaW9fc3QtPnRpbWVfYmFzZS5kZW4gLyBhdWRpb19zdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOworCisgICAgYmZyYW1lcyA9IGJmOworICAgIHZpZGVvX2R0cyA9IGJmcmFtZXMgPyAtZHVyYXRpb24gOiAwOworICAgIGF1ZGlvX2R0cyA9IC1hdWRpb19wcmVyb2xsOworfQorCitzdGF0aWMgdm9pZCBpbml0KGludCBiZiwgaW50IGF1ZGlvX3ByZXJvbGwpCit7CisgICAgaW5pdF9mcHMoYmYsIGF1ZGlvX3ByZXJvbGwsIDMwKTsKK30KKworc3RhdGljIHZvaWQgbXV4X2ZyYW1lcyhpbnQgbiwgaW50IGMpCit7CisgICAgaW50IGVuZF9mcmFtZXMgPSBmcmFtZXMgKyBuOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIEFWUGFja2V0IHBrdDsKKyAgICAgICAgdWludDhfdCBwa3RkYXRhWzhdID0geyAwIH07CisgICAgICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOworCisgICAgICAgIGlmIChhdl9jb21wYXJlX3RzKGF1ZGlvX2R0cywgYXVkaW9fc3QtPnRpbWVfYmFzZSwgdmlkZW9fZHRzLCB2aWRlb19zdC0+dGltZV9iYXNlKSA8IDApIHsKKyAgICAgICAgICAgIHBrdC5kdHMgPSBwa3QucHRzID0gYXVkaW9fZHRzOworICAgICAgICAgICAgcGt0LnN0cmVhbV9pbmRleCA9IDE7CisgICAgICAgICAgICBwa3QuZHVyYXRpb24gPSBhdWRpb19kdXJhdGlvbjsKKyAgICAgICAgICAgIGF1ZGlvX2R0cyArPSBhdWRpb19kdXJhdGlvbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChmcmFtZXMgPT0gZW5kX2ZyYW1lcykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBrdC5kdHMgPSB2aWRlb19kdHM7CisgICAgICAgICAgICBwa3Quc3RyZWFtX2luZGV4ID0gMDsKKyAgICAgICAgICAgIHBrdC5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgICAgICAgICAgaWYgKChmcmFtZXMgJSBnb3Bfc2l6ZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBrdC5mbGFncyB8PSBBVl9QS1RfRkxBR19LRVk7CisgICAgICAgICAgICAgICAgbGFzdF9waWN0dXJlID0gQVZfUElDVFVSRV9UWVBFX0k7CisgICAgICAgICAgICAgICAgcGt0LnB0cyA9IHBrdC5kdHMgKyBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICB2aWRlb19kdHMgPSBwa3QucHRzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdF9waWN0dXJlID09IEFWX1BJQ1RVUkVfVFlQRV9QKSB7CisgICAgICAgICAgICAgICAgICAgIGxhc3RfcGljdHVyZSA9IEFWX1BJQ1RVUkVfVFlQRV9COworICAgICAgICAgICAgICAgICAgICBwa3QucHRzID0gcGt0LmR0czsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9fZHRzID0gbmV4dF9wX3B0czsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsYXN0X3BpY3R1cmUgPSBBVl9QSUNUVVJFX1RZUEVfUDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoZnJhbWVzICsgMSkgJSBnb3Bfc2l6ZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGt0LnB0cyA9IHBrdC5kdHMgKyBkdXJhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2R0cyA9IHBrdC5wdHM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X3BfcHRzID0gcGt0LnB0cyA9IHBrdC5kdHMgKyAyICogZHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19kdHMgKz0gZHVyYXRpb247CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWJmcmFtZXMpCisgICAgICAgICAgICAgICAgcGt0LnB0cyA9IHBrdC5kdHM7CisgICAgICAgICAgICBpZiAoZmFrZV9wa3RfZHVyYXRpb24pCisgICAgICAgICAgICAgICAgcGt0LmR1cmF0aW9uID0gZmFrZV9wa3RfZHVyYXRpb247CisgICAgICAgICAgICBmcmFtZXMrKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbGVhcl9kdXJhdGlvbikKKyAgICAgICAgICAgIHBrdC5kdXJhdGlvbiA9IDA7CisgICAgICAgIEFWX1dCMzIocGt0ZGF0YSArIDQsIHBrdC5wdHMpOworICAgICAgICBwa3QuZGF0YSA9IHBrdGRhdGE7CisgICAgICAgIHBrdC5zaXplID0gODsKKyAgICAgICAgaWYgKHNraXBfd3JpdGUpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHNraXBfd3JpdGVfYXVkaW8gJiYgcGt0LnN0cmVhbV9pbmRleCA9PSAxKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGMpIHsKKyAgICAgICAgICAgIHBrdC5wdHMgKz0gKDFMTDw8MzIpOworICAgICAgICAgICAgcGt0LmR0cyArPSAoMUxMPDwzMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZG9faW50ZXJsZWF2ZSkKKyAgICAgICAgICAgIGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKGN0eCwgJnBrdCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgJnBrdCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBtdXhfZ29wcyhpbnQgbikKK3sKKyAgICBtdXhfZnJhbWVzKGdvcF9zaXplICogbiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNraXBfZ29wcyhpbnQgbikKK3sKKyAgICBza2lwX3dyaXRlID0gMTsKKyAgICBtdXhfZ29wcyhuKTsKKyAgICBza2lwX3dyaXRlID0gMDsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsX2luaXRfdHModm9pZCkKK3sKKyAgICBBVlBhY2tldCBwa3Q7CisgICAgYXZfaW5pdF9wYWNrZXQoJnBrdCk7CisgICAgcGt0LnNpemUgPSAwOworICAgIHBrdC5kYXRhID0gTlVMTDsKKworICAgIHBrdC5zdHJlYW1faW5kZXggPSAwOworICAgIHBrdC5kdHMgPSB2aWRlb19kdHM7CisgICAgcGt0LnB0cyA9IDA7CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCAmcGt0KTsKKworICAgIHBrdC5zdHJlYW1faW5kZXggPSAxOworICAgIHBrdC5kdHMgPSBwa3QucHRzID0gYXVkaW9fZHRzOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgJnBrdCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaCh2b2lkKQoreworICAgIGF2X3dyaXRlX3RyYWlsZXIoY3R4KTsKKyAgICBhdmlvX2NvbnRleHRfZnJlZSgmY3R4LT5wYik7CisgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KGN0eCk7CisgICAgY3R4ID0gTlVMTDsKK30KKworc3RhdGljIHZvaWQgaGVscCh2b2lkKQoreworICAgIHByaW50ZigibW92ZW5jLXRlc3QgWy13XVxuIgorICAgICAgICAgICAiLXcgICAgICAgICAgd3JpdGUgb3V0cHV0IGludG8gZmlsZXNcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IGM7CisgICAgdWludDhfdCBoZWFkZXJbSEFTSF9TSVpFXTsKKyAgICB1aW50OF90IGNvbnRlbnRbSEFTSF9TSVpFXTsKKyAgICBpbnQgZW1wdHlfbW9vdl9wb3M7CisgICAgaW50IHByZXZfcG9zOworCisgICAgZm9yICg7OykgeworICAgICAgICBjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ3aCIpOworICAgICAgICBpZiAoYyA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAndyc6CisgICAgICAgICAgICB3cml0ZV9maWxlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGhlbHAoKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgbWQ1ID0gYXZfbWQ1X2FsbG9jKCk7CisgICAgaWYgKCFtZDUpCisgICAgICAgIHJldHVybiAxOworCisgICAgLy8gV3JpdGUgYSBmcmFnbWVudGVkIGZpbGUgd2l0aCBhbiBpbml0aWFsIG1vb3YgdGhhdCBhY3R1YWxseSBjb250YWlucyBzb21lCisgICAgLy8gc2FtcGxlcy4gT25lIG1vb3YrbWRhdCB3aXRoIDEgc2Vjb25kIG9mIGRhdGEgYW5kIG9uZSBtb29mK21kYXQgd2l0aCAxCisgICAgLy8gc2Vjb25kIG9mIGRhdGEuCisgICAgaW5pdF9vdXQoIm5vbi1lbXB0eS1tb292Iik7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lIiwgMCk7CisgICAgaW5pdCgwLCAwKTsKKyAgICBtdXhfZ29wcygyKTsKKyAgICBmaW5pc2goKTsKKyAgICBjbG9zZV9vdXQoKTsKKworICAgIC8vIFdyaXRlIGEgc2ltaWxhciBmaWxlLCBidXQgd2l0aCBCLWZyYW1lcyBhbmQgYXVkaW8gcHJlcm9sbCwgaGFuZGxlZAorICAgIC8vIHZpYSBhbiBlZGl0IGxpc3QuCisgICAgaW5pdF9vdXQoIm5vbi1lbXB0eS1tb292LWVsc3QiKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgInVzZV9lZGl0bGlzdCIsICIxIiwgMCk7CisgICAgaW5pdCgxLCAxKTsKKyAgICBtdXhfZ29wcygyKTsKKyAgICBmaW5pc2goKTsKKyAgICBjbG9zZV9vdXQoKTsKKworICAgIC8vIFVzZSBCLWZyYW1lcyBidXQgbm8gYXVkaW8tcHJlcm9sbCwgYnV0IHdpdGhvdXQgYW4gZWRpdCBsaXN0LgorICAgIC8vIER1ZSB0byBhdm9pZF9uZWdhdGl2ZV90cyA9PSBBVkZNVF9BVk9JRF9ORUdfVFNfTUFLRV9aRVJPLCB0aGUgZHRzCisgICAgLy8gb2YgdGhlIGZpcnN0IGF1ZGlvIHBhY2tldCBpcyA+IDAsIGJ1dCBpdCBpcyBzZXQgdG8gemVybyBzaW5jZSBlZGl0CisgICAgLy8gbGlzdHMgYXJlbid0IHVzZWQsIGluY3JlYXNpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSBmaXJzdCBwYWNrZXQgaW5zdGVhZC4KKyAgICBpbml0X291dCgibm9uLWVtcHR5LW1vb3Ytbm8tZWxzdCIpOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZSIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidXNlX2VkaXRsaXN0IiwgIjAiLCAwKTsKKyAgICBpbml0KDEsIDApOworICAgIG11eF9nb3BzKDIpOworICAgIGZpbmlzaCgpOworICAgIGNsb3NlX291dCgpOworCisgICAgZm9ybWF0ID0gImlzbXYiOworICAgIC8vIFdyaXRlIGFuIElTTVYsIHdpdGggQi1mcmFtZXMgYW5kIGF1ZGlvIHByZXJvbGwuCisgICAgaW5pdF9vdXQoImlzbXYiKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUiLCAwKTsKKyAgICBpbml0KDEsIDEpOworICAgIG11eF9nb3BzKDIpOworICAgIGZpbmlzaCgpOworICAgIGNsb3NlX291dCgpOworICAgIGZvcm1hdCA9ICJtcDQiOworCisgICAgLy8gQW4gaW5pdGlhbCBtb292IHRoYXQgZG9lc24ndCBjb250YWluIGFueSBzYW1wbGVzLCBmb2xsb3dlZCBieSB0d28KKyAgICAvLyBtb29mK21kYXQgcGFpcnMuCisgICAgaW5pdF9vdXQoImVtcHR5LW1vb3YiKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUrZW1wdHlfbW9vdiIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAidXNlX2VkaXRsaXN0IiwgIjAiLCAwKTsKKyAgICBpbml0KDAsIDApOworICAgIG11eF9nb3BzKDIpOworICAgIGZpbmlzaCgpOworICAgIGNsb3NlX291dCgpOworICAgIG1lbWNweShjb250ZW50LCBoYXNoLCBIQVNIX1NJWkUpOworCisgICAgLy8gU2ltaWxhciB0byB0aGUgcHJldmlvdXMgb25lLCBidXQgd2l0aCBpbnB1dCB0aGF0IGRvZXNuJ3Qgc3RhcnQgYXQKKyAgICAvLyBwdHMvZHRzIDAuIGF2b2lkX25lZ2F0aXZlX3RzIGJlaGF2ZXMgaW4gdGhlIHNhbWUgd2F5IGFzCisgICAgLy8gaW4gbm9uLWVtcHR5LW1vb3Ytbm8tZWxzdCBhYm92ZS4KKyAgICBpbml0X291dCgiZW1wdHktbW9vdi1uby1lbHN0Iik7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lK2VtcHR5X21vb3YiLCAwKTsKKyAgICBpbml0KDEsIDApOworICAgIG11eF9nb3BzKDIpOworICAgIGZpbmlzaCgpOworICAgIGNsb3NlX291dCgpOworCisgICAgLy8gU2FtZSBhcyB0aGUgcHJldmlvdXMgb25lLCBidXQgZGlzYWJsZSBhdm9pZF9uZWdhdGl2ZV90cyAod2hpY2gKKyAgICAvLyB3b3VsZCByZXF1aXJlIHVzaW5nIGFuIGVkaXQgbGlzdCwgYnV0IHdpdGggZW1wdHlfbW9vdiwgb25lIGNhbid0CisgICAgLy8gd3JpdGUgYSBzZW5zaWJsZSBlZGl0IGxpc3QsIHdoZW4gdGhlIHN0YXJ0IHRpbWVzdGFtcHMgYXJlbid0IGtub3duKS4KKyAgICAvLyBUaGlzIHNob3VsZCB0cmlnZ2VyIGEgd2FybmluZyAtIHdlIGNoZWNrIHRoYXQgdGhlIHdhcm5pbmcgaXMgcHJvZHVjZWQuCisgICAgaW5pdF9jb3VudF93YXJuaW5ncygpOworICAgIGluaXRfb3V0KCJlbXB0eS1tb292LW5vLWVsc3Qtbm8tYWRqdXN0Iik7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lK2VtcHR5X21vb3YiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgImF2b2lkX25lZ2F0aXZlX3RzIiwgIjAiLCAwKTsKKyAgICBpbml0KDEsIDApOworICAgIG11eF9nb3BzKDIpOworICAgIGZpbmlzaCgpOworICAgIGNsb3NlX291dCgpOworCisgICAgcmVzZXRfY291bnRfd2FybmluZ3MoKTsKKyAgICBjaGVjayhudW1fd2FybmluZ3MgPiAwLCAiTm8gd2FybmluZ3MgcHJpbnRlZCBmb3IgdW5oYW5kbGVkIHN0YXJ0IG9mZnNldCIpOworCisgICAgLy8gVmVyaWZ5IHRoYXQgZGVsYXlfbW9vdiBwcm9kdWNlcyB0aGUgc2FtZSBhcyBlbXB0eV9tb292IGZvcgorICAgIC8vIHNpbXBsZSBpbnB1dAorICAgIGluaXRfb3V0KCJkZWxheS1tb292Iik7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lK2RlbGF5X21vb3YiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgInVzZV9lZGl0bGlzdCIsICIwIiwgMCk7CisgICAgaW5pdCgwLCAwKTsKKyAgICBtdXhfZ29wcygyKTsKKyAgICBmaW5pc2goKTsKKyAgICBjbG9zZV9vdXQoKTsKKyAgICBjaGVjayghbWVtY21wKGhhc2gsIGNvbnRlbnQsIEhBU0hfU0laRSksICJkZWxheV9tb292IGRpZmZlcnMgZnJvbSBlbXB0eV9tb292Iik7CisKKyAgICAvLyBUZXN0IHdyaXRpbmcgY29udGVudCB0aGF0IHJlcXVpcmVzIGFuIGVkaXQgbGlzdCB1c2luZyBkZWxheV9tb292CisgICAgaW5pdF9vdXQoImRlbGF5LW1vb3YtZWxzdCIpOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZStkZWxheV9tb292IiwgMCk7CisgICAgaW5pdCgxLCAxKTsKKyAgICBtdXhfZ29wcygyKTsKKyAgICBmaW5pc2goKTsKKyAgICBjbG9zZV9vdXQoKTsKKworICAgIC8vIFRlc3Qgd3JpdGluZyBhIGZpbGUgd2l0aCBvbmUgdHJhY2sgbGFja2luZyBwYWNrZXRzLCB3aXRoIGRlbGF5X21vb3YuCisgICAgc2tpcF93cml0ZV9hdWRpbyA9IDE7CisgICAgaW5pdF9vdXQoImRlbGF5LW1vb3YtZW1wdHktdHJhY2siKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUrZGVsYXlfbW9vdiIsIDApOworICAgIGluaXQoMCwgMCk7CisgICAgbXV4X2dvcHMoMik7CisgICAgLy8gVGhlIGF1dG9tYXRpYyBmbHVzaGluZyBzaG91bGRuJ3Qgb3V0cHV0IGFueXRoaW5nLCBzaW5jZSB3ZSdyZSBzdGlsbAorICAgIC8vIHdhaXRpbmcgZm9yIGRhdGEgZm9yIHNvbWUgdHJhY2tzCisgICAgY2hlY2sob3V0X3NpemUgPT0gMCwgImRlbGF5X21vb3YgZmx1c2hlZCBwcmVtYXR1cmVseSIpOworICAgIC8vIFdoZW4gY2xvc2VkIChvciBtYW51YWxseSBmbHVzaGVkKSwgYWxsIHRoZSB3cml0dGVuIGRhdGEgc2hvdWxkIHN0aWxsCisgICAgLy8gYmUgb3V0cHV0LgorICAgIGZpbmlzaCgpOworICAgIGNsb3NlX291dCgpOworICAgIGNoZWNrKG91dF9zaXplID4gMCwgImRlbGF5X21vb3YgZGlkbid0IG91dHB1dCBhbnl0aGluZyIpOworCisgICAgLy8gQ2hlY2sgdGhhdCBtYW51YWxseSBmbHVzaGluZyBzdGlsbCBvdXRwdXRzIHRoaW5ncyBhcyBleHBlY3RlZC4gVGhpcworICAgIC8vIHByb2R1Y2VzIHR3byBmcmFnbWVudHMsIHdoaWxlIHRoZSBvbmUgYWJvdmUgcHJvZHVjZXMgb25seSBvbmUuCisgICAgaW5pdF9vdXQoImRlbGF5LW1vb3YtZW1wdHktdHJhY2stZmx1c2giKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2RlbGF5X21vb3YiLCAwKTsKKyAgICBpbml0KDAsIDApOworICAgIG11eF9nb3BzKDEpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIEZvcmNlIHdyaXRpbmcgdGhlIG1vb3YKKyAgICBjaGVjayhvdXRfc2l6ZSA+IDAsICJObyBtb292IHdyaXR0ZW4iKTsKKyAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOworICAgIG11eF9nb3BzKDEpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7CisgICAgZmluaXNoKCk7CisgICAgY2xvc2Vfb3V0KCk7CisKKyAgICBza2lwX3dyaXRlX2F1ZGlvID0gMDsKKworCisKKyAgICAvLyBWZXJpZnkgdGhhdCB0aGUgaGVhZGVyIHdyaXR0ZW4gYnkgZGVsYXlfbW9vdiB3aGVuIG1hbnVhbGx5IGZsdXNoZWQKKyAgICAvLyBpcyBpZGVudGljYWwgdG8gdGhlIG9uZSBieSBlbXB0eV9tb292LgorICAgIGluaXRfb3V0KCJlbXB0eS1tb292LWhlYWRlciIpOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZStlbXB0eV9tb292IiwgMCk7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJ1c2VfZWRpdGxpc3QiLCAiMCIsIDApOworICAgIGluaXQoMCwgMCk7CisgICAgY2xvc2Vfb3V0KCk7CisgICAgbWVtY3B5KGhlYWRlciwgaGFzaCwgSEFTSF9TSVpFKTsKKyAgICBpbml0X291dCgiZW1wdHktbW9vdi1jb250ZW50Iik7CisgICAgbXV4X2dvcHMoMik7CisgICAgLy8gV3JpdHRlbiAyIHNlY29uZHMgb2YgY29udGVudCwgd2l0aCBhbiBhdXRvbWF0aWMgZmx1c2ggYWZ0ZXIgMSBzZWNvbmQuCisgICAgY2hlY2sob3V0X3NpemUgPiAwLCAiTm8gYXV0b21hdGljIGZsdXNoPyIpOworICAgIGVtcHR5X21vb3ZfcG9zID0gcHJldl9wb3MgPSBvdXRfc2l6ZTsKKyAgICAvLyBNYW51YWxseSBmbHVzaCB0aGUgc2Vjb25kIGZyYWdtZW50CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsKKyAgICBjaGVjayhvdXRfc2l6ZSA+IHByZXZfcG9zLCAiTm8gc2Vjb25kIGZyYWdtZW50IGZsdXNoZWQ/Iik7CisgICAgcHJldl9wb3MgPSBvdXRfc2l6ZTsKKyAgICAvLyBDaGVjayB0aGF0IGFuIGV4dHJhIGZsdXNoIGRvZXNuJ3Qgb3V0cHV0IGFueSBtb3JlIGRhdGEKKyAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOworICAgIGNoZWNrKG91dF9zaXplID09IHByZXZfcG9zLCAiTW9yZSBkYXRhIHdyaXR0ZW4/Iik7CisgICAgY2xvc2Vfb3V0KCk7CisgICAgbWVtY3B5KGNvbnRlbnQsIGhhc2gsIEhBU0hfU0laRSk7CisgICAgLy8gSWdub3JlIHRoZSB0cmFpbGVyIHdyaXR0ZW4gaGVyZQorICAgIGZpbmlzaCgpOworCisgICAgaW5pdF9vdXQoImRlbGF5LW1vb3YtaGVhZGVyIik7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2N1c3RvbStkZWxheV9tb292IiwgMCk7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJ1c2VfZWRpdGxpc3QiLCAiMCIsIDApOworICAgIGluaXQoMCwgMCk7CisgICAgY2hlY2sob3V0X3NpemUgPT0gMCwgIk91dHB1dCB3cml0dGVuIGR1cmluZyBpbml0IHdpdGggZGVsYXlfbW9vdiIpOworICAgIG11eF9nb3BzKDEpOyAvLyBXcml0ZSAxIHNlY29uZCBvZiBjb250ZW50CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gRm9yY2Ugd3JpdGluZyB0aGUgbW9vdgorICAgIGNsb3NlX291dCgpOworICAgIGNoZWNrKCFtZW1jbXAoaGFzaCwgaGVhZGVyLCBIQVNIX1NJWkUpLCAiZGVsYXlfbW9vdiBoZWFkZXIgZGlmZmVycyBmcm9tIGVtcHR5X21vb3YiKTsKKyAgICBpbml0X291dCgiZGVsYXktbW9vdi1jb250ZW50Iik7CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gRmx1c2ggdGhlIGZpcnN0IGZyYWdtZW50CisgICAgY2hlY2sob3V0X3NpemUgPT0gZW1wdHlfbW9vdl9wb3MsICJNYW51YWxseSBmbHVzaGVkIGNvbnRlbnQgZGlmZmVycyBmcm9tIGF1dG9tYXRpY2FsbHkgZmx1c2hlZCwgJWQgdnMgJWQiLCBvdXRfc2l6ZSwgZW1wdHlfbW9vdl9wb3MpOworICAgIG11eF9nb3BzKDEpOyAvLyBXcml0ZSB0aGUgcmVzdCBvZiB0aGUgY29udGVudAorICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIEZsdXNoIHRoZSBzZWNvbmQgZnJhZ21lbnQKKyAgICBjbG9zZV9vdXQoKTsKKyAgICBjaGVjayghbWVtY21wKGhhc2gsIGNvbnRlbnQsIEhBU0hfU0laRSksICJkZWxheV9tb292IGNvbnRlbnQgZGlmZmVycyBmcm9tIGVtcHR5X21vb3YiKTsKKyAgICBmaW5pc2goKTsKKworCisgICAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHByb2R1Y2UgYW4gaWRlbnRpY2FsIHNlY29uZCBmcmFnbWVudCB3aXRob3V0CisgICAgLy8gd3JpdGluZyB0aGUgZmlyc3Qgb25lLiBGaXJzdCB3cml0ZSB0aGUgcmVmZXJlbmNlIGZyYWdtZW50cyB0aGF0CisgICAgLy8gd2Ugd2FudCB0byByZXByb2R1Y2UuCisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2N1c3RvbStlbXB0eV9tb292K2Rhc2giLCAwKTsKKyAgICBpbml0KDAsIDApOworICAgIG11eF9nb3BzKDEpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgZmlyc3QgZnJhZ21lbnQKKyAgICBpbml0X291dCgiZW1wdHktbW9vdi1zZWNvbmQtZnJhZyIpOworICAgIG11eF9nb3BzKDEpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgc2Vjb25kIGZyYWdtZW50CisgICAgY2xvc2Vfb3V0KCk7CisgICAgbWVtY3B5KGNvbnRlbnQsIGhhc2gsIEhBU0hfU0laRSk7CisgICAgZmluaXNoKCk7CisKKyAgICAvLyBQcm9kdWNlIHRoZSBzYW1lIHNlY29uZCBmcmFnbWVudCB3aXRob3V0IGFjdHVhbGx5IHdyaXRpbmcgdGhlIGZpcnN0CisgICAgLy8gb25lIGJlZm9yZS4KKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2VtcHR5X21vb3YrZGFzaCtmcmFnX2Rpc2NvbnQiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgImZyYWdtZW50X2luZGV4IiwgIjIiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgImF2b2lkX25lZ2F0aXZlX3RzIiwgIjAiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgInVzZV9lZGl0bGlzdCIsICIwIiwgMCk7CisgICAgaW5pdCgwLCAwKTsKKyAgICBza2lwX2dvcHMoMSk7CisgICAgaW5pdF9vdXQoImVtcHR5LW1vb3Ytc2Vjb25kLWZyYWctZGlzY29udCIpOworICAgIG11eF9nb3BzKDEpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgc2Vjb25kIGZyYWdtZW50CisgICAgY2xvc2Vfb3V0KCk7CisgICAgY2hlY2soIW1lbWNtcChoYXNoLCBjb250ZW50LCBIQVNIX1NJWkUpLCAiZGlzY29udGludW91c2x5IHdyaXR0ZW4gZnJhZ21lbnQgZGlmZmVycyIpOworICAgIGZpbmlzaCgpOworCisgICAgLy8gUHJvZHVjZSB0aGUgc2FtZSB0aGluZyBieSB1c2luZyBkZWxheV9tb292LCB3aGljaCByZXF1aXJlcyBhIHNsaWdodGx5CisgICAgLy8gZGlmZmVyZW50IGNhbGwgc2VxdWVuY2UuCisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2N1c3RvbStkZWxheV9tb292K2Rhc2grZnJhZ19kaXNjb250IiwgMCk7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJmcmFnbWVudF9pbmRleCIsICIyIiwgMCk7CisgICAgaW5pdCgwLCAwKTsKKyAgICBza2lwX2dvcHMoMSk7CisgICAgbXV4X2dvcHMoMSk7CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBtb292CisgICAgaW5pdF9vdXQoImRlbGF5LW1vb3Ytc2Vjb25kLWZyYWctZGlzY29udCIpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgc2Vjb25kIGZyYWdtZW50CisgICAgY2xvc2Vfb3V0KCk7CisgICAgY2hlY2soIW1lbWNtcChoYXNoLCBjb250ZW50LCBIQVNIX1NJWkUpLCAiZGlzY29udGludW91c2x5IHdyaXR0ZW4gZnJhZ21lbnQgZGlmZmVycyIpOworICAgIGZpbmlzaCgpOworCisKKyAgICAvLyBUZXN0IGRpc2NvbnRpbnVvdXNseSB3cml0dGVuIGZyYWdtZW50cyB3aXRoIEItZnJhbWVzICh3aGVyZSB0aGUKKyAgICAvLyBhc3N1bXB0aW9uIG9mIHN0YXJ0aW5nIGF0IHB0cz0wIHdvcmtzKSBidXQgbm90IHdpdGggYXVkaW8gcHJlcm9sbAorICAgIC8vICh3aGljaCBjYW4ndCBiZSBndWVzc2VkKS4KKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2RlbGF5X21vb3YrZGFzaCIsIDApOworICAgIGluaXQoMSwgMCk7CisgICAgbXV4X2dvcHMoMSk7CisgICAgaW5pdF9vdXQoImRlbGF5LW1vb3YtZWxzdC1pbml0Iik7CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBtb292CisgICAgY2xvc2Vfb3V0KCk7CisgICAgbWVtY3B5KGhlYWRlciwgaGFzaCwgSEFTSF9TSVpFKTsKKyAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBPdXRwdXQgdGhlIGZpcnN0IGZyYWdtZW50CisgICAgaW5pdF9vdXQoImRlbGF5LW1vb3YtZWxzdC1zZWNvbmQtZnJhZyIpOworICAgIG11eF9nb3BzKDEpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgc2Vjb25kIGZyYWdtZW50CisgICAgY2xvc2Vfb3V0KCk7CisgICAgbWVtY3B5KGNvbnRlbnQsIGhhc2gsIEhBU0hfU0laRSk7CisgICAgZmluaXNoKCk7CisKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfY3VzdG9tK2RlbGF5X21vb3YrZGFzaCtmcmFnX2Rpc2NvbnQiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgImZyYWdtZW50X2luZGV4IiwgIjIiLCAwKTsKKyAgICBpbml0KDEsIDApOworICAgIHNraXBfZ29wcygxKTsKKyAgICBtdXhfZ29wcygxKTsgLy8gV3JpdGUgdGhlIHNlY29uZCBmcmFnbWVudAorICAgIGluaXRfb3V0KCJkZWxheS1tb292LWVsc3QtaW5pdC1kaXNjb250Iik7CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBtb292CisgICAgY2xvc2Vfb3V0KCk7CisgICAgY2hlY2soIW1lbWNtcChoYXNoLCBoZWFkZXIsIEhBU0hfU0laRSksICJkaXNjb250aW51b3VzbHkgd3JpdHRlbiBoZWFkZXIgZGlmZmVycyIpOworICAgIGluaXRfb3V0KCJkZWxheS1tb292LWVsc3Qtc2Vjb25kLWZyYWctZGlzY29udCIpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgc2Vjb25kIGZyYWdtZW50CisgICAgY2xvc2Vfb3V0KCk7CisgICAgY2hlY2soIW1lbWNtcChoYXNoLCBjb250ZW50LCBIQVNIX1NJWkUpLCAiZGlzY29udGludW91c2x5IHdyaXR0ZW4gZnJhZ21lbnQgZGlmZmVycyIpOworICAgIGZpbmlzaCgpOworCisKKyAgICAvLyBUZXN0IGRpc2NvbnRpbnVvdXNseSB3cml0dGVuIGZyYWdtZW50cyB3aXRoIEItZnJhbWVzIGFuZCBhdWRpbyBwcmVyb2xsLAorICAgIC8vIHByb3Blcmx5IHNpZ25hbGVkLgorICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19jdXN0b20rZGVsYXlfbW9vditkYXNoIiwgMCk7CisgICAgaW5pdCgxLCAxKTsKKyAgICBtdXhfZ29wcygxKTsKKyAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbHN0LXNpZ25hbC1pbml0Iik7CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBtb292CisgICAgY2xvc2Vfb3V0KCk7CisgICAgbWVtY3B5KGhlYWRlciwgaGFzaCwgSEFTSF9TSVpFKTsKKyAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBPdXRwdXQgdGhlIGZpcnN0IGZyYWdtZW50CisgICAgaW5pdF9vdXQoImRlbGF5LW1vb3YtZWxzdC1zaWduYWwtc2Vjb25kLWZyYWciKTsKKyAgICBtdXhfZ29wcygxKTsKKyAgICBhdl93cml0ZV9mcmFtZShjdHgsIE5VTEwpOyAvLyBPdXRwdXQgdGhlIHNlY29uZCBmcmFnbWVudAorICAgIGNsb3NlX291dCgpOworICAgIG1lbWNweShjb250ZW50LCBoYXNoLCBIQVNIX1NJWkUpOworICAgIGZpbmlzaCgpOworCisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2N1c3RvbStkZWxheV9tb292K2Rhc2grZnJhZ19kaXNjb250IiwgMCk7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJmcmFnbWVudF9pbmRleCIsICIyIiwgMCk7CisgICAgaW5pdCgxLCAxKTsKKyAgICBzaWduYWxfaW5pdF90cygpOworICAgIHNraXBfZ29wcygxKTsKKyAgICBtdXhfZ29wcygxKTsgLy8gV3JpdGUgdGhlIHNlY29uZCBmcmFnbWVudAorICAgIGluaXRfb3V0KCJkZWxheS1tb292LWVsc3Qtc2lnbmFsLWluaXQtZGlzY29udCIpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgbW9vdgorICAgIGNsb3NlX291dCgpOworICAgIGNoZWNrKCFtZW1jbXAoaGFzaCwgaGVhZGVyLCBIQVNIX1NJWkUpLCAiZGlzY29udGludW91c2x5IHdyaXR0ZW4gaGVhZGVyIGRpZmZlcnMiKTsKKyAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbHN0LXNpZ25hbC1zZWNvbmQtZnJhZy1kaXNjb250Iik7CisgICAgYXZfd3JpdGVfZnJhbWUoY3R4LCBOVUxMKTsgLy8gT3V0cHV0IHRoZSBzZWNvbmQgZnJhZ21lbnQKKyAgICBjbG9zZV9vdXQoKTsKKyAgICBjaGVjayghbWVtY21wKGhhc2gsIGNvbnRlbnQsIEhBU0hfU0laRSksICJkaXNjb250aW51b3VzbHkgd3JpdHRlbiBmcmFnbWVudCBkaWZmZXJzIik7CisgICAgZmluaXNoKCk7CisKKworICAgIC8vIFRlc3QgbXV4aW5nIGRpc2NvbnRpbnVvdXMgZnJhZ21lbnRzIHdpdGggdmVyeSBsYXJnZSAoPiAoMTw8MzEpKSB0aW1lc3RhbXBzLgorICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19jdXN0b20rZGVsYXlfbW9vditkYXNoK2ZyYWdfZGlzY29udCIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAiZnJhZ21lbnRfaW5kZXgiLCAiMiIsIDApOworICAgIGluaXQoMSwgMSk7CisgICAgc2lnbmFsX2luaXRfdHMoKTsKKyAgICBza2lwX2dvcHMoMSk7CisgICAgbXV4X2ZyYW1lcyhnb3Bfc2l6ZSwgMSk7IC8vIFdyaXRlIHRoZSBzZWNvbmQgZnJhZ21lbnQKKyAgICBpbml0X291dCgiZGVsYXktbW9vdi1lbHN0LXNpZ25hbC1pbml0LWRpc2NvbnQtbGFyZ2V0cyIpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgbW9vdgorICAgIGNsb3NlX291dCgpOworICAgIGluaXRfb3V0KCJkZWxheS1tb292LWVsc3Qtc2lnbmFsLXNlY29uZC1mcmFnLWRpc2NvbnQtbGFyZ2V0cyIpOworICAgIGF2X3dyaXRlX2ZyYW1lKGN0eCwgTlVMTCk7IC8vIE91dHB1dCB0aGUgc2Vjb25kIGZyYWdtZW50CisgICAgY2xvc2Vfb3V0KCk7CisgICAgZmluaXNoKCk7CisKKyAgICAvLyBUZXN0IFZGUiBjb250ZW50LCB3aXRoIHNpZHggYXRvbXMgKHdoaWNoIGRlY2xhcmUgdGhlIHB0cyBkdXJhdGlvbgorICAgIC8vIG9mIGEgZnJhZ21lbnQsIGZvcmNpbmcgb3ZlcnJpZGluZyB0aGUgc3RhcnQgcHRzIG9mIHRoZSBuZXh0IG9uZSkuCisgICAgLy8gSGVyZSwgdGhlIGZyYWdtZW50IGR1cmF0aW9uIGluIHB0cyBpcyBzaWduaWZpY2FudGx5IGRpZmZlcmVudCBmcm9tCisgICAgLy8gdGhlIGR1cmF0aW9uIGluIGR0cy4gVGhlIHZpZGVvIHN0cmVhbSBzdGFydHMgYXQgZHRzPS0xMCxwdHM9MCwgYW5kCisgICAgLy8gdGhlIHNlY29uZCBmcmFnbWVudCBzdGFydHMgYXQgZHRzPTE1NSxwdHM9MTU2LiBUaGUgdHJ1biBkdXJhdGlvbiBzdW0KKyAgICAvLyBvZiB0aGUgZmlyc3QgZnJhZ21lbnQgaXMgMTY1LCB3aGljaCBhbHNvIGlzIHdyaXR0ZW4gYXMKKyAgICAvLyBiYXNlTWVkaWFEZWNvZGVUaW1lIGluIHRoZSB0ZmR0IGluIHRoZSBzZWNvbmQgZnJhZ21lbnQuIFRoZSBzaWR4IGZvcgorICAgIC8vIHRoZSBmaXJzdCBmcmFnbWVudCBzYXlzIGVhcmxpZXN0X3ByZXNlbnRhdGlvbl90aW1lID0gMCBhbmQKKyAgICAvLyBzdWJzZWdtZW50X2R1cmF0aW9uID0gMTU2LCB3aGljaCBhbHNvIG1hdGNoZXMgdGhlIHNpZHggaW4gdGhlIHNlY29uZAorICAgIC8vIGZyYWdtZW50LiBGb3IgdGhlIGF1ZGlvIHN0cmVhbSwgdGhlIHB0cyBhbmQgZHRzIGR1cmF0aW9ucyBhbHNvIGRvbid0CisgICAgLy8gbWF0Y2ggLSB0aGUgaW5wdXQgc3RyZWFtIHN0YXJ0cyBhdCBwdHM9LTIwNDgsIGJ1dCB0aGF0IHBhcnQgaXMgZXhjbHVkZWQKKyAgICAvLyBieSB0aGUgZWRpdCBsaXN0LgorICAgIGluaXRfb3V0KCJ2ZnIiKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUrZGVsYXlfbW9vditkYXNoIiwgMCk7CisgICAgaW5pdF9mcHMoMSwgMSwgMyk7CisgICAgbXV4X2ZyYW1lcyhnb3Bfc2l6ZS8yLCAwKTsKKyAgICBkdXJhdGlvbiAvPSAxMDsKKyAgICBtdXhfZnJhbWVzKGdvcF9zaXplLzIsIDApOworICAgIG11eF9nb3BzKDEpOworICAgIGZpbmlzaCgpOworICAgIGNsb3NlX291dCgpOworCisgICAgLy8gVGVzdCBWRlIgY29udGVudCwgd2l0aCBjbGVhcmVkIGR1cmF0aW9uIGZpZWxkcy4gSW4gdGhlc2UgY2FzZXMsCisgICAgLy8gdGhlIG11eGVyIG11c3QgZ3Vlc3MgdGhlIGR1cmF0aW9uIG9mIHRoZSBsYXN0IHBhY2tldCBvZiBlYWNoCisgICAgLy8gZnJhZ21lbnQuIEFzIGxvbmcgYXMgdGhlIGZyYW1lcmF0ZSBkb2Vzbid0IHZhcnkgKHRvbyBtdWNoKSBhdCB0aGUKKyAgICAvLyBmcmFnbWVudCBlZGdlLCBpdCB3b3JrcyBqdXN0IGZpbmUuIEFkZGl0aW9uYWxseSwgd2hlbiBhdXRvbWF0aWNhbGx5CisgICAgLy8gY3V0dGluZyBmcmFnbWVudHMsIHRoZSBtdXhlciBhbHJlYWR5IGtub3cgdGhlIHRpbWVzdGFtcHMgb2YgdGhlIG5leHQKKyAgICAvLyBwYWNrZXQgZm9yIG9uZSBzdHJlYW0gKGluIG1vc3QgY2FzZXMgdGhlIHZpZGVvIHN0cmVhbSksIGF2b2lkaW5nCisgICAgLy8gaGF2aW5nIHRvIHVzZSBndWVzc2VzIGZvciB0aGF0IG9uZS4KKyAgICBpbml0X2NvdW50X3dhcm5pbmdzKCk7CisgICAgY2xlYXJfZHVyYXRpb24gPSAxOworICAgIGluaXRfb3V0KCJ2ZnItbm9kdXJhdGlvbiIpOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZStkZWxheV9tb292K2Rhc2giLCAwKTsKKyAgICBpbml0X2ZwcygxLCAxLCAzKTsKKyAgICBtdXhfZnJhbWVzKGdvcF9zaXplLzIsIDApOworICAgIGR1cmF0aW9uIC89IDEwOworICAgIG11eF9mcmFtZXMoZ29wX3NpemUvMiwgMCk7CisgICAgbXV4X2dvcHMoMSk7CisgICAgZmluaXNoKCk7CisgICAgY2xvc2Vfb3V0KCk7CisgICAgY2xlYXJfZHVyYXRpb24gPSAwOworICAgIHJlc2V0X2NvdW50X3dhcm5pbmdzKCk7CisgICAgY2hlY2sobnVtX3dhcm5pbmdzID4gMCwgIk5vIHdhcm5pbmdzIHByaW50ZWQgZm9yIGZpbGxlZCBpbiBkdXJhdGlvbnMiKTsKKworICAgIC8vIFRlc3Qgd2l0aCBhbiBJTyBidWZmZXIgc2l6ZSB0aGF0IGlzIHRvbyBzbWFsbCB0byBob2xkIGEgZnVsbCBmcmFnbWVudDsKKyAgICAvLyB0aGlzIHdpbGwgY2F1c2Ugd3JpdGVfZGF0YV90eXBlIHRvIGJlIGNhbGxlZCB3aXRoIHRoZSB0eXBlIHVua25vd24uCisgICAgZm9yY2VfaW9idWZfc2l6ZSA9IDE1MDA7CisgICAgaW5pdF9vdXQoImxhcmdlX2ZyYWciKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUrZGVsYXlfbW9vdiIsIDApOworICAgIGluaXRfZnBzKDEsIDEsIDMpOworICAgIG11eF9nb3BzKDIpOworICAgIGZpbmlzaCgpOworICAgIGNsb3NlX291dCgpOworICAgIGZvcmNlX2lvYnVmX3NpemUgPSAwOworCisgICAgLy8gVGVzdCBWRlIgY29udGVudCB3aXRoIGJmcmFtZXMgd2l0aCBpbnRlcmxlYXZpbmcuCisgICAgLy8gSGVyZSwgdXNpbmcgYXZfaW50ZXJsZWF2ZWRfd3JpdGVfZnJhbWUgYWxsb3dzIHRoZSBtdXhlciB0byBnZXQgdGhlCisgICAgLy8gZnJhZ21lbnQgZW5kIGR1cmF0aW9ucyByaWdodC4gV2UgYWx3YXlzIHNldCB0aGUgcGFja2V0IGR1cmF0aW9uIHRvCisgICAgLy8gdGhlIGV4cGVjdGVkLCBidXQgd2Ugc2ltdWxhdGUgZHJvcHBlZCBmcmFtZXMgYXQgb25lIHBvaW50LgorICAgIGRvX2ludGVybGVhdmUgPSAxOworICAgIGluaXRfb3V0KCJ2ZnItbm9kdXJhdGlvbi1pbnRlcmxlYXZlIik7CisgICAgYXZfZGljdF9zZXQoJm9wdHMsICJtb3ZmbGFncyIsICJmcmFnX2tleWZyYW1lK2RlbGF5X21vb3YiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgImZyYWdfZHVyYXRpb24iLCAiNjUwMDAwIiwgMCk7CisgICAgaW5pdF9mcHMoMSwgMSwgMzApOworICAgIG11eF9mcmFtZXMoZ29wX3NpemUvMiwgMCk7CisgICAgLy8gUHJldGVuZCB0aGF0IHRoZSBwYWNrZXQgZHVyYXRpb24gaXMgdGhlIG5vcm1hbCwgZXZlbiBpZgorICAgIC8vIHdlIGFjdHVhbGx5IHNraXAgYSBidW5jaCBvZiBmcmFtZXMuIChJLmUuLCBzaW11bGF0ZSB0aGF0CisgICAgLy8gd2UgZG9uJ3Qga25vdyBvZiB0aGUgZnJhbWVkcm9wIGluIGFkdmFuY2UuKQorICAgIGZha2VfcGt0X2R1cmF0aW9uID0gZHVyYXRpb247CisgICAgZHVyYXRpb24gKj0gMTA7CisgICAgbXV4X2ZyYW1lcygxLCAwKTsKKyAgICBmYWtlX3BrdF9kdXJhdGlvbiA9IDA7CisgICAgZHVyYXRpb24gLz0gMTA7CisgICAgbXV4X2ZyYW1lcyhnb3Bfc2l6ZS8yIC0gMSwgMCk7CisgICAgbXV4X2dvcHMoMSk7CisgICAgZmluaXNoKCk7CisgICAgY2xvc2Vfb3V0KCk7CisgICAgY2xlYXJfZHVyYXRpb24gPSAwOworICAgIGRvX2ludGVybGVhdmUgPSAwOworCisgICAgLy8gV3JpdGUgYSBmcmFnbWVudGVkIGZpbGUgd2l0aCBiLWZyYW1lcyBhbmQgYXVkaW8gcHJlcm9sbCwKKyAgICAvLyB3aXRoIG5lZ2F0aXZlIGN0cyB2YWx1ZXMsIHJlbW92aW5nIHRoZSBlZGl0IGxpc3QgZm9yIHRoZQorICAgIC8vIHZpZGVvIHRyYWNrLgorICAgIGluaXRfb3V0KCJkZWxheS1tb292LWVsc3QtbmVnLWN0cyIpOworICAgIGF2X2RpY3Rfc2V0KCZvcHRzLCAibW92ZmxhZ3MiLCAiZnJhZ19rZXlmcmFtZStkZWxheV9tb292K25lZ2F0aXZlX2N0c19vZmZzZXRzIiwgMCk7CisgICAgaW5pdCgxLCAxKTsKKyAgICBtdXhfZ29wcygyKTsKKyAgICBmaW5pc2goKTsKKyAgICBjbG9zZV9vdXQoKTsKKworICAgIC8vIFdyaXRlIGEgZnJhZ21lbnRlZCBmaWxlIHdpdGggYi1mcmFtZXMgd2l0aG91dCBhdWRpbyBwcmVyb2xsLAorICAgIC8vIHdpdGggbmVnYXRpdmUgY3RzIHZhbHVlcywgYXZvaWRpbmcgYW55IGVkaXQgbGlzdHMsIGFsbG93aW5nCisgICAgLy8gdG8gdXNlIGVtcHR5X21vb3YgaW5zdGVhZCBvZiBkZWxheV9tb292LgorICAgIGluaXRfb3V0KCJlbXB0eS1tb292LW5lZy1jdHMiKTsKKyAgICBhdl9kaWN0X3NldCgmb3B0cywgIm1vdmZsYWdzIiwgImZyYWdfa2V5ZnJhbWUrZW1wdHlfbW9vdituZWdhdGl2ZV9jdHNfb2Zmc2V0cyIsIDApOworICAgIGluaXQoMSwgMCk7CisgICAgbXV4X2dvcHMoMik7CisgICAgZmluaXNoKCk7CisgICAgY2xvc2Vfb3V0KCk7CisKKyAgICBhdl9mcmVlKG1kNSk7CisKKyAgICByZXR1cm4gY2hlY2tfZmF1bHRzID4gMCA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGVzdHMvbm9wcm94eS5jIGIvbGliYXZmb3JtYXQvdGVzdHMvbm9wcm94eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MjM1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90ZXN0cy9ub3Byb3h5LmMKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMyBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZmb3JtYXQvbmV0d29yay5oIgorCitzdGF0aWMgdm9pZCB0ZXN0KGNvbnN0IGNoYXIgKnBhdHRlcm4sIGNvbnN0IGNoYXIgKmhvc3QpCit7CisgICAgaW50IHJlcyA9IGZmX2h0dHBfbWF0Y2hfbm9fcHJveHkocGF0dGVybiwgaG9zdCk7CisgICAgcHJpbnRmKCJUaGUgcGF0dGVybiBcIiVzXCIgJXMgdGhlIGhvc3RuYW1lICVzXG4iLAorICAgICAgICAgICBwYXR0ZXJuID8gcGF0dGVybiA6ICIobnVsbCkiLCByZXMgPyAibWF0Y2hlcyIgOiAiZG9lcyBub3QgbWF0Y2giLAorICAgICAgICAgICBob3N0KTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICB0ZXN0KE5VTEwsICJkb21haW4uY29tIik7CisgICAgdGVzdCgiZXhhbXBsZS5jb20gZG9tYWluLmNvbSIsICJkb21haW4uY29tIik7CisgICAgdGVzdCgiZXhhbXBsZS5jb20gb3RoZXIuY29tIiwgImRvbWFpbi5jb20iKTsKKyAgICB0ZXN0KCJleGFtcGxlLmNvbSxkb21haW4uY29tIiwgImRvbWFpbi5jb20iKTsKKyAgICB0ZXN0KCJleGFtcGxlLmNvbSxkb21haW4uY29tIiwgIm90aGVyZG9tYWluLmNvbSIpOworICAgIHRlc3QoImV4YW1wbGUuY29tLCAqLmRvbWFpbi5jb20iLCAic3ViLmRvbWFpbi5jb20iKTsKKyAgICB0ZXN0KCJleGFtcGxlLmNvbSwgKi5kb21haW4uY29tIiwgImRvbWFpbi5jb20iKTsKKyAgICB0ZXN0KCJleGFtcGxlLmNvbSwgLmRvbWFpbi5jb20iLCAiZG9tYWluLmNvbSIpOworICAgIHRlc3QoIioiLCAiZG9tYWluLmNvbSIpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGVzdHMvcnRtcGRoLmMgYi9saWJhdmZvcm1hdC90ZXN0cy9ydG1wZGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzEzOWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvdGVzdHMvcnRtcGRoLmMKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvcnRtcGRoLmMiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgaW50IHRlc3RfcmFuZG9tX3NoYXJlZF9zZWNyZXQodm9pZCkKK3sKKyAgICBGRl9ESCAqcGVlcjEgPSBOVUxMLCAqcGVlcjIgPSBOVUxMOworICAgIGludCByZXQ7CisgICAgdWludDhfdCBwdWJrZXkxWzEyOF0sIHB1YmtleTJbMTI4XTsKKyAgICB1aW50OF90IHNoYXJlZGtleTFbMTI4XSwgc2hhcmVka2V5MlsxMjhdOworCisgICAgcGVlcjEgPSBmZl9kaF9pbml0KDEwMjQpOworICAgIHBlZXIyID0gZmZfZGhfaW5pdCgxMDI0KTsKKyAgICBpZiAoIXBlZXIxIHx8ICFwZWVyMikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKChyZXQgPSBmZl9kaF9nZW5lcmF0ZV9wdWJsaWNfa2V5KHBlZXIxKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKChyZXQgPSBmZl9kaF9nZW5lcmF0ZV9wdWJsaWNfa2V5KHBlZXIyKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKChyZXQgPSBmZl9kaF93cml0ZV9wdWJsaWNfa2V5KHBlZXIxLCBwdWJrZXkxLCBzaXplb2YocHVia2V5MSkpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoKHJldCA9IGZmX2RoX3dyaXRlX3B1YmxpY19rZXkocGVlcjIsIHB1YmtleTIsIHNpemVvZihwdWJrZXkyKSkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmICgocmV0ID0gZmZfZGhfY29tcHV0ZV9zaGFyZWRfc2VjcmV0X2tleShwZWVyMSwgcHVia2V5Miwgc2l6ZW9mKHB1YmtleTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRrZXkxLCBzaXplb2Yoc2hhcmVka2V5MSkpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAoKHJldCA9IGZmX2RoX2NvbXB1dGVfc2hhcmVkX3NlY3JldF9rZXkocGVlcjIsIHB1YmtleTEsIHNpemVvZihwdWJrZXkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVka2V5Miwgc2l6ZW9mKHNoYXJlZGtleTIpKSkgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKG1lbWNtcChzaGFyZWRrZXkxLCBzaGFyZWRrZXkyLCBzaXplb2Yoc2hhcmVka2V5MSkpKSB7CisgICAgICAgIHByaW50ZigiTWlzbWF0Y2hlZCBnZW5lcmF0ZWQgc2hhcmVkIGtleVxuIik7CisgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJHZW5lcmF0ZWQgc2hhcmVkIGtleSBva1xuIik7CisgICAgfQorZmFpbDoKKyAgICBmZl9kaF9mcmVlKHBlZXIxKTsKKyAgICBmZl9kaF9mcmVlKHBlZXIyKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJpdmF0ZV9rZXkgPQorICAgICI5NzZDMThGQ0FEQzI1NUI0NTY1NjRGNzRGM0VFREE1OUQyOEFGNkI3NDRENzQzRjIzNTdCRkQyNDA0Nzk3RUY4OTZFRjFBIgorICAgICI3QzFDQkVBQUEzQUI2MEFGMzE5MkQxODlDRkYzRjk5MUM5Q0JCRkQ3ODExOUZDQTIxODEzODRCOTQwMTE5NDNCNkQ2RjI4IgorICAgICI5RTFCNzA4RTJEMUEwQzc3NzExNjkyOTNGMDNEQTI3RTU2MUYxNUYxNkYwQUM5QkM4NThDNzdBODBGQTk4RkQwODhBMjMyIgorICAgICIxOUQwOEJFNkYxNjVERTBCMDIwMzRCMTg3MDU4MjlGQUQwQUNCMjZBNUI3NUVGIjsKK3N0YXRpYyBjb25zdCBjaGFyICpwdWJsaWNfa2V5ID0KKyAgICAiRjI3MkVDRjgzNjIyNTdDNUQyQzNDQzIyMjlDRjlDMEEwMzIyNUJDMTA5QjFEQkM3NkE2OEMzOTRGMjU2QUNBM0VGNUY2NCIKKyAgICAiRkMyNzBDMjYzODJCRjMxNUMxOUU5N0E3NjEwNEE3MTZGQzk5OEE2NTFFODYxMEEzQUU2Q0Y2NUQ4RkFFNUQzRjMyRUVBMCIKKyAgICAiMEIzMkNCOTYwOUI0OTQxMTZBODI1RDcxNDJEMTdCODhFM0QyMEVERDk4NzQzREUyOUNGMzdBMjNBOUY2QTU4Qjk2MDU5MSIKKyAgICAiMzE1N0Q1OTY1RkNCNDZEREE3M0ExRjA4REQ4OTdCQUU4OERGRTZGQzkzN0NCQSI7CitzdGF0aWMgY29uc3QgdWludDhfdCBwdWJsaWNfa2V5X2JpbltdID0geworICAgIDB4ZjIsIDB4NzIsIDB4ZWMsIDB4ZjgsIDB4MzYsIDB4MjIsIDB4NTcsIDB4YzUsIDB4ZDIsIDB4YzMsIDB4Y2MsIDB4MjIsCisgICAgMHgyOSwgMHhjZiwgMHg5YywgMHgwYSwgMHgwMywgMHgyMiwgMHg1YiwgMHhjMSwgMHgwOSwgMHhiMSwgMHhkYiwgMHhjNywKKyAgICAweDZhLCAweDY4LCAweGMzLCAweDk0LCAweGYyLCAweDU2LCAweGFjLCAweGEzLCAweGVmLCAweDVmLCAweDY0LCAweGZjLAorICAgIDB4MjcsIDB4MGMsIDB4MjYsIDB4MzgsIDB4MmIsIDB4ZjMsIDB4MTUsIDB4YzEsIDB4OWUsIDB4OTcsIDB4YTcsIDB4NjEsCisgICAgMHgwNCwgMHhhNywgMHgxNiwgMHhmYywgMHg5OSwgMHg4YSwgMHg2NSwgMHgxZSwgMHg4NiwgMHgxMCwgMHhhMywgMHhhZSwKKyAgICAweDZjLCAweGY2LCAweDVkLCAweDhmLCAweGFlLCAweDVkLCAweDNmLCAweDMyLCAweGVlLCAweGEwLCAweDBiLCAweDMyLAorICAgIDB4Y2IsIDB4OTYsIDB4MDksIDB4YjQsIDB4OTQsIDB4MTEsIDB4NmEsIDB4ODIsIDB4NWQsIDB4NzEsIDB4NDIsIDB4ZDEsCisgICAgMHg3YiwgMHg4OCwgMHhlMywgMHhkMiwgMHgwZSwgMHhkZCwgMHg5OCwgMHg3NCwgMHgzZCwgMHhlMiwgMHg5YywgMHhmMywKKyAgICAweDdhLCAweDIzLCAweGE5LCAweGY2LCAweGE1LCAweDhiLCAweDk2LCAweDA1LCAweDkxLCAweDMxLCAweDU3LCAweGQ1LAorICAgIDB4OTYsIDB4NWYsIDB4Y2IsIDB4NDYsIDB4ZGQsIDB4YTcsIDB4M2EsIDB4MWYsIDB4MDgsIDB4ZGQsIDB4ODksIDB4N2IsCisgICAgMHhhZSwgMHg4OCwgMHhkZiwgMHhlNiwgMHhmYywgMHg5MywgMHg3YywgMHhiYQorfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHBlZXJfcHVibGljX2tleVtdID0geworICAgIDB4NTgsIDB4NjYsIDB4MDUsIDB4NDksIDB4OTQsIDB4MjMsIDB4MmIsIDB4NjYsIDB4NTIsIDB4MTMsIDB4ZmYsIDB4NDYsCisgICAgMHhmMiwgMHhiMywgMHg3OSwgMHhhOSwgMHhlZSwgMHhhZSwgMHgxYSwgMHgxMywgMHhmMCwgMHg3MSwgMHg1MiwgMHhmYiwKKyAgICAweDkzLCAweDRlLCAweGVlLCAweDk3LCAweDA1LCAweDczLCAweDUwLCAweDdkLCAweGFmLCAweDAyLCAweDA3LCAweDcyLAorICAgIDB4YWMsIDB4ZGMsIDB4YTMsIDB4OTUsIDB4NzgsIDB4ZWUsIDB4OWEsIDB4MTksIDB4NzEsIDB4N2UsIDB4OTksIDB4OWYsCisgICAgMHgyYSwgMHhkNCwgMHhiMywgMHhlMiwgMHgwYywgMHgxZCwgMHgxYSwgMHg3OCwgMHg0YywgMHhkZSwgMHhmMSwgMHhhZCwKKyAgICAweGI0LCAweDYwLCAweGE4LCAweDUxLCAweGFjLCAweDcxLCAweGVjLCAweDg2LCAweDcwLCAweGEyLCAweDYzLCAweDM2LAorICAgIDB4OTIsIDB4N2MsIDB4ZTMsIDB4ODcsIDB4ZWUsIDB4ZTQsIDB4ZjEsIDB4NjIsIDB4MjQsIDB4NzQsIDB4YjQsIDB4MDQsCisgICAgMHhmYSwgMHg1YywgMHhkZiwgMHhiYSwgMHhmYSwgMHhhMywgMHhjMiwgMHhiYiwgMHg2MiwgMHgyNywgMHhkMCwgMHhmNCwKKyAgICAweGU0LCAweDQzLCAweGRhLCAweDhhLCAweDg4LCAweDY5LCAweDYwLCAweGUyLCAweGRiLCAweDc1LCAweDJhLCAweDk4LAorICAgIDB4OWQsIDB4YjUsIDB4NTAsIDB4ZTMsIDB4OTksIDB4ZGEsIDB4ZTAsIDB4YTYsIDB4MTQsIDB4YzksIDB4ODAsIDB4MTIsCisgICAgMHhmOSwgMHgzYywgMHhhYywgMHgwNiwgMHgwMiwgMHg3YSwgMHhkZSwgMHg3NAorfTsKK3N0YXRpYyBjb25zdCB1aW50OF90IHNoYXJlZF9zZWNyZXRbXSA9IHsKKyAgICAweGIyLCAweGViLCAweGNiLCAweDcxLCAweGYzLCAweDYxLCAweGZiLCAweDViLCAweDRlLCAweDVjLCAweDRjLCAweGNmLAorICAgIDB4NWMsIDB4MDgsIDB4NWYsIDB4OTYsIDB4MjYsIDB4NzcsIDB4MWQsIDB4MzEsIDB4ZjEsIDB4ZTEsIDB4ZjcsIDB4NGIsCisgICAgMHg5MiwgMHhhYywgMHg4MiwgMHgyYSwgMHg4OCwgMHhjNywgMHg4MywgMHhlMSwgMHhjNywgMHhmMywgMHhkMywgMHgxYSwKKyAgICAweDdkLCAweGM4LCAweDMxLCAweGUzLCAweDk3LCAweGU0LCAweGVjLCAweDMxLCAweDBlLCAweDhmLCAweDczLCAweDFhLAorICAgIDB4ZTQsIDB4ZjYsIDB4ZDgsIDB4YzgsIDB4OTQsIDB4ZmYsIDB4YTAsIDB4MDMsIDB4ODQsIDB4MDMsIDB4MGYsIDB4YTUsCisgICAgMHgzMCwgMHg1ZCwgMHg2NywgMHhlMCwgMHg3YSwgMHgzYiwgMHg1ZiwgMHhlZCwgMHg0YywgMHhmNSwgMHhiYywgMHgxOCwKKyAgICAweGVhLCAweGQ0LCAweDc3LCAweGE5LCAweDA3LCAweGIzLCAweDU0LCAweDBiLCAweDAyLCAweGQ5LCAweGM2LCAweGI4LAorICAgIDB4NjYsIDB4NWUsIDB4ZWMsIDB4YTQsIDB4Y2QsIDB4NDcsIDB4ZWQsIDB4YzksIDB4MzgsIDB4YzYsIDB4OTEsIDB4MDgsCisgICAgMHhmMywgMHg4NSwgMHg5YiwgMHg2OSwgMHgxNiwgMHg3OCwgMHgwZCwgMHhiNywgMHg3NCwgMHg1MSwgMHhhYSwgMHg1YiwKKyAgICAweDRkLCAweDc0LCAweGU0LCAweDI5LCAweDJlLCAweDllLCAweDhlLCAweGY3LCAweGU1LCAweDQyLCAweDgzLCAweGIwLAorICAgIDB4NjUsIDB4YjAsIDB4Y2UsIDB4YzYsIDB4YjIsIDB4OGYsIDB4NWIsIDB4YjAKK307CisKK3N0YXRpYyBpbnQgdGVzdF9yZWZfZGF0YSh2b2lkKQoreworICAgIEZGX0RIICpkaDsKKyAgICBpbnQgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgIHVpbnQ4X3QgcHVia2V5X3Rlc3RbMTI4XTsKKyAgICB1aW50OF90IHNoYXJlZGtleV90ZXN0WzEyOF07CisKKyAgICBkaCA9IGZmX2RoX2luaXQoMTAyNCk7CisgICAgaWYgKCFkaCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGJuX2hleDJibihkaC0+cHJpdl9rZXksIHByaXZhdGVfa2V5LCByZXQpOworICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIGZhaWw7CisgICAgYm5faGV4MmJuKGRoLT5wdWJfa2V5LCBwdWJsaWNfa2V5LCByZXQpOworICAgIGlmICghcmV0KQorICAgICAgICBnb3RvIGZhaWw7CisgICAgaWYgKChyZXQgPSBmZl9kaF93cml0ZV9wdWJsaWNfa2V5KGRoLCBwdWJrZXlfdGVzdCwgc2l6ZW9mKHB1YmtleV90ZXN0KSkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworICAgIGlmIChtZW1jbXAocHVia2V5X3Rlc3QsIHB1YmxpY19rZXlfYmluLCBzaXplb2YocHVia2V5X3Rlc3QpKSkgeworICAgICAgICBwcmludGYoIk1pc21hdGNoZWQgZ2VuZXJhdGVkIHB1YmxpYyBrZXlcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCJHZW5lcmF0ZWQgcHVibGljIGtleSBva1xuIik7CisgICAgfQorICAgIGlmICgocmV0ID0gZmZfZGhfY29tcHV0ZV9zaGFyZWRfc2VjcmV0X2tleShkaCwgcGVlcl9wdWJsaWNfa2V5LCBzaXplb2YocGVlcl9wdWJsaWNfa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVka2V5X3Rlc3QsIHNpemVvZihzaGFyZWRrZXlfdGVzdCkpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKyAgICBpZiAobWVtY21wKHNoYXJlZF9zZWNyZXQsIHNoYXJlZGtleV90ZXN0LCBzaXplb2Yoc2hhcmVka2V5X3Rlc3QpKSkgeworICAgICAgICBwcmludGYoIk1pc21hdGNoZWQgZ2VuZXJhdGVkIHNoYXJlZCBrZXlcbiIpOworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiR2VuZXJhdGVkIHNoYXJlZCBrZXkgb2tcbiIpOworICAgIH0KK2ZhaWw6CisgICAgZmZfZGhfZnJlZShkaCk7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBhdmZvcm1hdF9uZXR3b3JrX2luaXQoKTsKKyAgICBpZiAodGVzdF9yYW5kb21fc2hhcmVkX3NlY3JldCgpIDwgMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgaWYgKHRlc3RfcmVmX2RhdGEoKSA8IDApCisgICAgICAgIHJldHVybiAxOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGVzdHMvc2Vlay5jIGIvbGliYXZmb3JtYXQvdGVzdHMvc2Vlay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMDY3YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90ZXN0cy9zZWVrLmMKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgRmFicmljZSBCZWxsYXJkCisgKiBDb3B5cmlnaHQgKGMpIDIwMDcgTWljaGFlbCBOaWVkZXJtYXllcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWF0aGVtYXRpY3MuaCIKKworI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisKK3N0YXRpYyBjaGFyIGJ1ZmZlclsyMF07CisKK3N0YXRpYyBjb25zdCBjaGFyICpyZXRfc3RyKGludCB2KQoreworICAgIHN3aXRjaCAodikgeworICAgIGNhc2UgQVZFUlJPUl9FT0Y6ICAgICByZXR1cm4gIi1FT0YiOworICAgIGNhc2UgQVZFUlJPUihFSU8pOiAgICByZXR1cm4gIi1FSU8iOworICAgIGNhc2UgQVZFUlJPUihFTk9NRU0pOiByZXR1cm4gIi1FTk9NRU0iOworICAgIGNhc2UgQVZFUlJPUihFSU5WQUwpOiByZXR1cm4gIi1FSU5WQUwiOworICAgIGRlZmF1bHQ6CisgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlMmQiLCB2KTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRzX3N0cihjaGFyIGJ1ZmZlcls2MF0sIGludDY0X3QgdHMsIEFWUmF0aW9uYWwgYmFzZSkKK3sKKyAgICBpZiAodHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICAgICAgc3RyY3B5KGJ1ZmZlciwgIiBOT1BUUyAgICIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRzPSBhdl9yZXNjYWxlX3EodHMsIGJhc2UsIChBVlJhdGlvbmFsKXsxLCAxMDAwMDAwfSk7CisgICAgc25wcmludGYoYnVmZmVyLCA2MCwgIiVjJSJQUklkNjQiLiUwNiJQUklkNjQiIiwgdHM8MCA/ICctJyA6ICcgJywgRkZBQlModHMpLzEwMDAwMDAsIEZGQUJTKHRzKSUxMDAwMDAwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworICAgIEFWRm9ybWF0Q29udGV4dCAqaWMgPSBhdmZvcm1hdF9hbGxvY19jb250ZXh0KCk7CisgICAgaW50IGksIHJldCwgc3RyZWFtX2lkOworICAgIGludCBqOworICAgIGludDY0X3QgdGltZXN0YW1wOworICAgIEFWRGljdGlvbmFyeSAqZm9ybWF0X29wdHMgPSBOVUxMOworICAgIGludDY0X3Qgc2Vla2ZpcnN0ID0gQVZfTk9QVFNfVkFMVUU7CisgICAgaW50IGZpcnN0YmFjaz0wOworICAgIGludCBmcmFtZV9jb3VudCA9IDE7CisgICAgaW50IGR1cmF0aW9uID0gNDsKKworICAgIGZvcihpPTI7IGk8YXJnYzsgaSs9Mil7CisgICAgICAgIGlmICAgICAgICghc3RyY21wKGFyZ3ZbaV0sICItc2Vla2ZvcnciKSl7CisgICAgICAgICAgICBzZWVrZmlyc3QgPSBhdG9pKGFyZ3ZbaSsxXSk7CisgICAgICAgIH0gZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItc2Vla2JhY2siKSl7CisgICAgICAgICAgICBzZWVrZmlyc3QgPSBhdG9pKGFyZ3ZbaSsxXSk7CisgICAgICAgICAgICBmaXJzdGJhY2sgPSAxOworICAgICAgICB9IGVsc2UgaWYoIXN0cmNtcChhcmd2W2ldLCAiLWZyYW1lcyIpKXsKKyAgICAgICAgICAgIGZyYW1lX2NvdW50ID0gYXRvaShhcmd2W2krMV0pOworICAgICAgICB9IGVsc2UgaWYoIXN0cmNtcChhcmd2W2ldLCAiLWR1cmF0aW9uIikpeworICAgICAgICAgICAgZHVyYXRpb24gPSBhdG9pKGFyZ3ZbaSsxXSk7CisgICAgICAgIH0gZWxzZSBpZighc3RyY21wKGFyZ3ZbaV0sICItZmFzdHNlZWsiKSkgeworICAgICAgICAgICAgaWYgKGF0b2koYXJndltpKzFdKSkgeworICAgICAgICAgICAgICAgIGljLT5mbGFncyB8PSBBVkZNVF9GTEFHX0ZBU1RfU0VFSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmKGFyZ3ZbaV1bMF0gPT0gJy0nICYmIGFyZ3ZbaSsxXSkgeworICAgICAgICAgICAgYXZfZGljdF9zZXQoJmZvcm1hdF9vcHRzLCBhcmd2W2ldICsgMSwgYXJndltpKzFdLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFyZ2MgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgYXZfZGljdF9zZXQoJmZvcm1hdF9vcHRzLCAiY2hhbm5lbHMiLCAiMSIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZmb3JtYXRfb3B0cywgInNhbXBsZV9yYXRlIiwgIjIyMDUwIiwgMCk7CisKKyAgICBpZiAoYXJnYyA8IDIpIHsKKyAgICAgICAgcHJpbnRmKCJ1c2FnZTogJXMgaW5wdXRfZmlsZVxuIgorICAgICAgICAgICAgICAgIlxuIiwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZpbGVuYW1lID0gYXJndlsxXTsKKworICAgIHJldCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmljLCBmaWxlbmFtZSwgTlVMTCwgJmZvcm1hdF9vcHRzKTsKKyAgICBhdl9kaWN0X2ZyZWUoJmZvcm1hdF9vcHRzKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBvcGVuICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldCA9IGF2Zm9ybWF0X2ZpbmRfc3RyZWFtX2luZm8oaWMsIE5VTEwpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6IGNvdWxkIG5vdCBmaW5kIGNvZGVjIHBhcmFtZXRlcnNcbiIsIGZpbGVuYW1lKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYoc2Vla2ZpcnN0ICE9IEFWX05PUFRTX1ZBTFVFKXsKKyAgICAgICAgaWYoZmlyc3RiYWNrKSAgIGF2Zm9ybWF0X3NlZWtfZmlsZShpYywgLTEsIElOVDY0X01JTiwgc2Vla2ZpcnN0LCBzZWVrZmlyc3QsIDApOworICAgICAgICBlbHNlICAgICAgICAgICAgYXZmb3JtYXRfc2Vla19maWxlKGljLCAtMSwgc2Vla2ZpcnN0LCBzZWVrZmlyc3QsIElOVDY0X01BWCwgMCk7CisgICAgfQorICAgIGZvcihpPTA7IDsgaSsrKXsKKyAgICAgICAgQVZQYWNrZXQgcGt0ID0geyAwIH07CisgICAgICAgIEFWU3RyZWFtICphdl91bmluaXQoc3QpOworICAgICAgICBjaGFyIHRzX2J1Zls2MF07CisKKyAgICAgICAgaWYocmV0Pj0wKXsKKyAgICAgICAgICAgIGZvcihqPTA7IGo8ZnJhbWVfY291bnQ7IGorKykgeworICAgICAgICAgICAgcmV0PSBhdl9yZWFkX2ZyYW1lKGljLCAmcGt0KTsKKyAgICAgICAgICAgIGlmKHJldD49MCl7CisgICAgICAgICAgICAgICAgY2hhciBkdHNfYnVmWzYwXTsKKyAgICAgICAgICAgICAgICBzdD0gaWMtPnN0cmVhbXNbcGt0LnN0cmVhbV9pbmRleF07CisgICAgICAgICAgICAgICAgdHNfc3RyKGR0c19idWYsIHBrdC5kdHMsIHN0LT50aW1lX2Jhc2UpOworICAgICAgICAgICAgICAgIHRzX3N0cih0c19idWYsICBwa3QucHRzLCBzdC0+dGltZV9iYXNlKTsKKyAgICAgICAgICAgICAgICBwcmludGYoInJldDolLTEwcyBzdDolMmQgZmxhZ3M6JWQgZHRzOiVzIHB0czolcyBwb3M6JTciIFBSSWQ2NCAiIHNpemU6JTZkIiwgcmV0X3N0cihyZXQpLCBwa3Quc3RyZWFtX2luZGV4LCBwa3QuZmxhZ3MsIGR0c19idWYsIHRzX2J1ZiwgcGt0LnBvcywgcGt0LnNpemUpOworICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHByaW50ZigicmV0OiVzIiwgcmV0X3N0cihyZXQpKTsgLy8gbmVjZXNzYXJ5IHRvIGF2b2lkIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKGk+MjUpIGJyZWFrOworCisgICAgICAgIHN0cmVhbV9pZD0gKGk+PjEpJShpYy0+bmJfc3RyZWFtcysxKSAtIDE7CisgICAgICAgIHRpbWVzdGFtcD0gKGkqMTkzNjI4OTQxNjdMTCkgJSAoZHVyYXRpb24qQVZfVElNRV9CQVNFKSAtIEFWX1RJTUVfQkFTRTsKKyAgICAgICAgaWYoc3RyZWFtX2lkPj0wKXsKKyAgICAgICAgICAgIHN0PSBpYy0+c3RyZWFtc1tzdHJlYW1faWRdOworICAgICAgICAgICAgdGltZXN0YW1wPSBhdl9yZXNjYWxlX3EodGltZXN0YW1wLCBBVl9USU1FX0JBU0VfUSwgc3QtPnRpbWVfYmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgLy9GSVhNRSBmdWxseSB0ZXN0IHRoZSBuZXcgc2VlayBBUEkKKyAgICAgICAgaWYoaSYxKSByZXQgPSBhdmZvcm1hdF9zZWVrX2ZpbGUoaWMsIHN0cmVhbV9pZCwgSU5UNjRfTUlOLCB0aW1lc3RhbXAsIHRpbWVzdGFtcCwgMCk7CisgICAgICAgIGVsc2UgICAgcmV0ID0gYXZmb3JtYXRfc2Vla19maWxlKGljLCBzdHJlYW1faWQsIHRpbWVzdGFtcCwgdGltZXN0YW1wLCBJTlQ2NF9NQVgsIDApOworICAgICAgICB0c19zdHIodHNfYnVmLCB0aW1lc3RhbXAsIHN0cmVhbV9pZCA8IDAgPyBBVl9USU1FX0JBU0VfUSA6IHN0LT50aW1lX2Jhc2UpOworICAgICAgICBwcmludGYoInJldDolLTEwcyBzdDolMmQgZmxhZ3M6JWQgIHRzOiVzXG4iLCByZXRfc3RyKHJldCksIHN0cmVhbV9pZCwgaSYxLCB0c19idWYpOworICAgIH0KKworICAgIGF2Zm9ybWF0X2Nsb3NlX2lucHV0KCZpYyk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3Rlc3RzL3NydHAuYyBiL2xpYmF2Zm9ybWF0L3Rlc3RzL3NydHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTQ1MGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvdGVzdHMvc3J0cC5jCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZmb3JtYXQvcnRwZGVjLmgiCisjaW5jbHVkZSAibGliYXZmb3JtYXQvc3J0cC5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqYWVzMTI4XzgwX2tleSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1uIjsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnRwX2FlczEyOF84MFtdID0geworICAgIC8vIFJUUCBoZWFkZXIKKyAgICAweDgwLCAweGUwLCAweDEyLCAweDM0LCAweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDEyLCAweDM0LCAweDU2LCAweDc4LAorICAgIC8vIGVuY3J5cHRlZCBwYXlsb2FkCisgICAgMHg2MiwgMHg2OSwgMHg3NiwgMHhjYSwgMHhjNSwKKyAgICAvLyBITUFDCisgICAgMHhhMSwgMHhhYywgMHgxYiwgMHhiNCwgMHhhMCwgMHgxYywgMHhkNSwgMHg0OSwgMHgyOCwgMHg5OSwKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ0Y3BfYWVzMTI4XzgwW10gPSB7CisgICAgLy8gUlRDUCBoZWFkZXIKKyAgICAweDgxLCAweGM5LCAweDAwLCAweDA3LCAweDEyLCAweDM0LCAweDU2LCAweDc4LAorICAgIC8vIGVuY3J5cHRlZCBwYXlsb2FkCisgICAgMHg4YSwgMHhhYywgMHhkYywgMHhhNSwgMHg0YywgMHhmNiwgMHg3OCwgMHhhNiwgMHg2MiwgMHg4ZiwgMHgyNCwgMHhkYSwKKyAgICAweDZjLCAweDA5LCAweDNmLCAweGE5LCAweDI4LCAweDdhLCAweGI1LCAweDdmLCAweDFmLCAweDBmLCAweGM5LCAweDM1LAorICAgIC8vIFJUQ1AgaW5kZXgKKyAgICAweDgwLCAweDAwLCAweDAwLCAweDAzLAorICAgIC8vIEhNQUMKKyAgICAweGU5LCAweDNiLCAweGMwLCAweDVjLCAweDBjLCAweDA2LCAweDlmLCAweGFiLCAweGMwLCAweGRlLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmFlczEyOF8zMl9rZXkgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbiI7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHJ0cF9hZXMxMjhfMzJbXSA9IHsKKyAgICAvLyBSVFAgaGVhZGVyCisgICAgMHg4MCwgMHhlMCwgMHgxMiwgMHgzNCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwKKyAgICAvLyBlbmNyeXB0ZWQgcGF5bG9hZAorICAgIDB4NjIsIDB4NjksIDB4NzYsIDB4Y2EsIDB4YzUsCisgICAgLy8gSE1BQworICAgIDB4YTEsIDB4YWMsIDB4MWIsIDB4YjQsCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBydGNwX2FlczEyOF8zMltdID0geworICAgIC8vIFJUQ1AgaGVhZGVyCisgICAgMHg4MSwgMHhjOSwgMHgwMCwgMHgwNywgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OCwKKyAgICAvLyBlbmNyeXB0ZWQgcGF5bG9hZAorICAgIDB4MzUsIDB4ZTksIDB4YjUsIDB4ZmYsIDB4MGQsIDB4ZDEsIDB4ZGUsIDB4NzAsIDB4NzQsIDB4MTAsIDB4YWEsIDB4MWIsCisgICAgMHhiMiwgMHg4ZCwgMHhmMCwgMHgyMCwgMHgwMiwgMHg5OSwgMHg2YiwgMHgxYiwgMHgwYiwgMHhkMCwgMHg0NywgMHgzNCwKKyAgICAvLyBSVENQIGluZGV4CisgICAgMHg4MCwgMHgwMCwgMHgwMCwgMHgwNCwKKyAgICAvLyBITUFDCisgICAgMHg1YiwgMHhkMiwgMHhhOSwgMHg5ZCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfODBfMzJfa2V5ID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW4iOworCitzdGF0aWMgY29uc3QgdWludDhfdCBydHBfYWVzMTI4XzgwXzMyW10gPSB7CisgICAgLy8gUlRQIGhlYWRlcgorICAgIDB4ODAsIDB4ZTAsIDB4MTIsIDB4MzQsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsCisgICAgLy8gZW5jcnlwdGVkIHBheWxvYWQKKyAgICAweDYyLCAweDY5LCAweDc2LCAweGNhLCAweGM1LAorICAgIC8vIEhNQUMKKyAgICAweGExLCAweGFjLCAweDFiLCAweGI0LAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnRjcF9hZXMxMjhfODBfMzJbXSA9IHsKKyAgICAvLyBSVENQIGhlYWRlcgorICAgIDB4ODEsIDB4YzksIDB4MDAsIDB4MDcsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsCisgICAgLy8gZW5jcnlwdGVkIHBheWxvYWQKKyAgICAweGQ2LCAweGFlLCAweGMxLCAweDU4LCAweDYzLCAweDcwLCAweGM5LCAweDg4LCAweDY2LCAweDI2LCAweDFjLCAweDUzLAorICAgIDB4ZmYsIDB4NWQsIDB4NWQsIDB4MmIsIDB4MGYsIDB4OGMsIDB4NzIsIDB4M2UsIDB4YzksIDB4MWQsIDB4NDMsIDB4ZjksCisgICAgLy8gUlRDUCBpbmRleAorICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDUsCisgICAgLy8gSE1BQworICAgIDB4MDksIDB4MTYsIDB4YjQsIDB4MjcsIDB4OWEsIDB4ZTksIDB4OTIsIDB4MjYsIDB4NGUsIDB4MTAsCit9OworCitzdGF0aWMgdm9pZCBwcmludF9kYXRhKGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgICAgIHByaW50ZigiJTAyeCIsIGJ1ZltpXSk7CisgICAgcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgaW50IHRlc3RfZGVjcnlwdChzdHJ1Y3QgU1JUUENvbnRleHQgKnNydHAsIGNvbnN0IHVpbnQ4X3QgKmluLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqb3V0KQoreworICAgIG1lbWNweShvdXQsIGluLCBsZW4pOworICAgIGlmICghZmZfc3J0cF9kZWNyeXB0KHNydHAsIG91dCwgJmxlbikpIHsKKyAgICAgICAgcHJpbnRfZGF0YShvdXQsIGxlbik7CisgICAgICAgIHJldHVybiBsZW47CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9lbmNyeXB0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIGludCBpbl9sZW4sIGNvbnN0IGNoYXIgKnN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleSkKK3sKKyAgICBzdHJ1Y3QgU1JUUENvbnRleHQgZW5jID0geyAwIH0sIGRlYyA9IHsgMCB9OworICAgIGludCBsZW47CisgICAgY2hhciBidWZbUlRQX01BWF9QQUNLRVRfTEVOR1RIXTsKKyAgICBmZl9zcnRwX3NldF9jcnlwdG8oJmVuYywgc3VpdGUsIGtleSk7CisgICAgZmZfc3J0cF9zZXRfY3J5cHRvKCZkZWMsIHN1aXRlLCBrZXkpOworICAgIGxlbiA9IGZmX3NydHBfZW5jcnlwdCgmZW5jLCBkYXRhLCBpbl9sZW4sIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgIGlmICghZmZfc3J0cF9kZWNyeXB0KCZkZWMsIGJ1ZiwgJmxlbikpIHsKKyAgICAgICAgaWYgKGxlbiA9PSBpbl9sZW4gJiYgIW1lbWNtcChidWYsIGRhdGEsIGxlbikpCisgICAgICAgICAgICBwcmludGYoIkRlY3J5cHRlZCBjb250ZW50IG1hdGNoZXMgaW5wdXRcbiIpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIkRlY3J5cHRlZCBjb250ZW50IGRvZXNuJ3QgbWF0Y2ggaW5wdXRcbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZigiRGVjcnlwdGlvbiBmYWlsZWRcbiIpOworICAgIH0KKyAgICBmZl9zcnRwX2ZyZWUoJmVuYyk7CisgICAgZmZfc3J0cF9mcmVlKCZkZWMpOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfODBfc3VpdGUgPSAiQUVTX0NNXzEyOF9ITUFDX1NIQTFfODAiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfMzJfc3VpdGUgPSAiQUVTX0NNXzEyOF9ITUFDX1NIQTFfMzIiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICphZXMxMjhfODBfMzJfc3VpdGUgPSAiU1JUUF9BRVMxMjhfQ01fSE1BQ19TSEExXzMyIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdGVzdF9rZXkgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoxMjM0NTY3ODkwQUJDRCI7CisgICAgdWludDhfdCBidWZbUlRQX01BWF9QQUNLRVRfTEVOR1RIXTsKKyAgICBzdHJ1Y3QgU1JUUENvbnRleHQgc3J0cCA9IHsgMCB9OworICAgIGludCBsZW47CisgICAgZmZfc3J0cF9zZXRfY3J5cHRvKCZzcnRwLCBhZXMxMjhfODBfc3VpdGUsIGFlczEyOF84MF9rZXkpOworICAgIGxlbiA9IHRlc3RfZGVjcnlwdCgmc3J0cCwgcnRwX2FlczEyOF84MCwgc2l6ZW9mKHJ0cF9hZXMxMjhfODApLCBidWYpOworICAgIHRlc3RfZW5jcnlwdChidWYsIGxlbiwgYWVzMTI4XzgwX3N1aXRlLCB0ZXN0X2tleSk7CisgICAgdGVzdF9lbmNyeXB0KGJ1ZiwgbGVuLCBhZXMxMjhfMzJfc3VpdGUsIHRlc3Rfa2V5KTsKKyAgICB0ZXN0X2VuY3J5cHQoYnVmLCBsZW4sIGFlczEyOF84MF8zMl9zdWl0ZSwgdGVzdF9rZXkpOworICAgIHRlc3RfZGVjcnlwdCgmc3J0cCwgcnRjcF9hZXMxMjhfODAsIHNpemVvZihydGNwX2FlczEyOF84MCksIGJ1Zik7CisgICAgdGVzdF9lbmNyeXB0KGJ1ZiwgbGVuLCBhZXMxMjhfODBfc3VpdGUsIHRlc3Rfa2V5KTsKKyAgICB0ZXN0X2VuY3J5cHQoYnVmLCBsZW4sIGFlczEyOF8zMl9zdWl0ZSwgdGVzdF9rZXkpOworICAgIHRlc3RfZW5jcnlwdChidWYsIGxlbiwgYWVzMTI4XzgwXzMyX3N1aXRlLCB0ZXN0X2tleSk7CisgICAgZmZfc3J0cF9mcmVlKCZzcnRwKTsKKworICAgIG1lbXNldCgmc3J0cCwgMCwgc2l6ZW9mKHNydHApKTsgLy8gQ2xlYXIgdGhlIGNvbnRleHQKKyAgICBmZl9zcnRwX3NldF9jcnlwdG8oJnNydHAsIGFlczEyOF8zMl9zdWl0ZSwgYWVzMTI4XzMyX2tleSk7CisgICAgdGVzdF9kZWNyeXB0KCZzcnRwLCBydHBfYWVzMTI4XzMyLCBzaXplb2YocnRwX2FlczEyOF8zMiksIGJ1Zik7CisgICAgdGVzdF9kZWNyeXB0KCZzcnRwLCBydGNwX2FlczEyOF8zMiwgc2l6ZW9mKHJ0Y3BfYWVzMTI4XzMyKSwgYnVmKTsKKyAgICBmZl9zcnRwX2ZyZWUoJnNydHApOworCisgICAgbWVtc2V0KCZzcnRwLCAwLCBzaXplb2Yoc3J0cCkpOyAvLyBDbGVhciB0aGUgY29udGV4dAorICAgIGZmX3NydHBfc2V0X2NyeXB0bygmc3J0cCwgYWVzMTI4XzgwXzMyX3N1aXRlLCBhZXMxMjhfODBfMzJfa2V5KTsKKyAgICB0ZXN0X2RlY3J5cHQoJnNydHAsIHJ0cF9hZXMxMjhfODBfMzIsIHNpemVvZihydHBfYWVzMTI4XzgwXzMyKSwgYnVmKTsKKyAgICB0ZXN0X2RlY3J5cHQoJnNydHAsIHJ0Y3BfYWVzMTI4XzgwXzMyLCBzaXplb2YocnRjcF9hZXMxMjhfODBfMzIpLCBidWYpOworICAgIGZmX3NydHBfZnJlZSgmc3J0cCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC90ZXN0cy91cmwuYyBiL2xpYmF2Zm9ybWF0L3Rlc3RzL3VybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjMxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90ZXN0cy91cmwuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIE1hcnRpbiBTdG9yc2pvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdmZvcm1hdC91cmwuaCIKKworc3RhdGljIHZvaWQgdGVzdChjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpyZWwpCit7CisgICAgY2hhciBidWZbMjAwXSwgYnVmMlsyMDBdOworICAgIGZmX21ha2VfYWJzb2x1dGVfdXJsKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGJhc2UsIHJlbCk7CisgICAgcHJpbnRmKCIlc1xuIiwgYnVmKTsKKyAgICBpZiAoYmFzZSkgeworICAgICAgICAvKiBUZXN0IGluLWJ1ZmZlciByZXBsYWNlbWVudCAqLworICAgICAgICBzbnByaW50ZihidWYyLCBzaXplb2YoYnVmMiksICIlcyIsIGJhc2UpOworICAgICAgICBmZl9tYWtlX2Fic29sdXRlX3VybChidWYyLCBzaXplb2YoYnVmMiksIGJ1ZjIsIHJlbCk7CisgICAgICAgIGlmIChzdHJjbXAoYnVmLCBidWYyKSkgeworICAgICAgICAgICAgcHJpbnRmKCJJbi1wbGFjZSBoYW5kbGluZyBvZiAlcyArICVzIGZhaWxlZFxuIiwgYmFzZSwgcmVsKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgdGVzdChOVUxMLCAiYmF6Iik7CisgICAgdGVzdCgiL2Zvby9iYXIiLCAiYmF6Iik7CisgICAgdGVzdCgiL2Zvby9iYXIiLCAiLi4vYmF6Iik7CisgICAgdGVzdCgiL2Zvby9iYXIiLCAiL2JheiIpOworICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vLyIsICJiYXoiKTsKKyAgICB0ZXN0KCJodHRwOi8vc2VydmVyL2Zvby9iYXIiLCAiYmF6Iik7CisgICAgdGVzdCgiaHR0cDovL3NlcnZlci9mb28vIiwgIi4uL2JheiIpOworICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vL2Jhci8xMjMiLCAiLi4vLi4vYmF6Iik7CisgICAgdGVzdCgiaHR0cDovL3NlcnZlci9mb28vYmFyLzEyMyIsICIvYmF6Iik7CisgICAgdGVzdCgiaHR0cDovL3NlcnZlci9mb28vYmFyLzEyMyIsICJodHRwczovL290aGVyL3VybCIpOworICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vL2Jhcj9wYXJhbT12YWx1ZS93aXRoL3NsYXNoZXMiLCAiL2JheiIpOworICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vL2Jhcj9wYXJhbSZvdGhlcnBhcmFtIiwgIj9zb21lcGFyYW0iKTsKKyAgICB0ZXN0KCJodHRwOi8vc2VydmVyL2Zvby9iYXIiLCAiLy9vdGhlci91cmwiKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3RocC5jIGIvbGliYXZmb3JtYXQvdGhwLmMKaW5kZXggNTU2OTAyNy4uNzZiOWIzOCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdGhwLmMKKysrIGIvbGliYXZmb3JtYXQvdGhwLmMKQEAgLTEwOSwxMSArMTA5LDEyIEBACiAgICAgICAgICAgICAvKiBUaGUgZGVub21pbmF0b3IgYW5kIG51bWVyYXRvciBhcmUgc3dpdGNoZWQgYmVjYXVzZSAxL2ZwcwogICAgICAgICAgICAgICAgaXMgcmVxdWlyZWQuICAqLwogICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIHRocC0+ZnBzLmRlbiwgdGhwLT5mcHMubnVtKTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9USFA7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KLSAgICAgICAgICAgIHN0LT5jb2RlYy0+d2lkdGggPSBhdmlvX3JiMzIocGIpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBhdmlvX3JiMzIocGIpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RIUDsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMDsgIC8qIG5vIGZvdXJjYyAqLworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZfcTJkKHRocC0+ZnBzKTsKICAgICAgICAgICAgIHN0LT5uYl9mcmFtZXMgPQogICAgICAgICAgICAgc3QtPmR1cmF0aW9uID0gdGhwLT5mcmFtZWNudDsKICAgICAgICAgICAgIHRocC0+dnN0ID0gc3Q7CkBAIC0xMzAsMTQgKzEzMSwxNCBAQAogICAgICAgICAgICAgaWYgKCFzdCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fVEhQOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gYXZpb19yYjMyKHBiKTsgLyogbnVtQ2hhbm5lbHMuICAqLwotICAgICAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihwYik7IC8qIEZyZXF1ZW5jeS4gICovCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fVEhQOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gYXZpb19yYjMyKHBiKTsgLyogbnVtQ2hhbm5lbHMuICAqLworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihwYik7IC8qIEZyZXF1ZW5jeS4gICovCiAgICAgICAgICAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgID0gYXZpb19yYjMyKHBiKTsKIAotICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgICAgICAgICB0aHAtPmF1ZGlvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKICAgICAgICAgICAgIHRocC0+aGFzX2F1ZGlvID0gMTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3RpZXJ0ZXhzZXEuYyBiL2xpYmF2Zm9ybWF0L3RpZXJ0ZXhzZXEuYwppbmRleCA2NTliYTA2Li42ZTAwNjkyIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC90aWVydGV4c2VxLmMKKysrIGIvbGliYXZmb3JtYXQvdGllcnRleHNlcS5jCkBAIC0yMTQsMTEgKzIxNCwxMSBAQAogCiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIFNFUV9GUkFNRV9SQVRFKTsKICAgICBzZXEtPnZpZGVvX3N0cmVhbV9pbmRleCA9IHN0LT5pbmRleDsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RJRVJURVhTRVFWSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KLSAgICBzdC0+Y29kZWMtPndpZHRoID0gU0VRX0ZSQU1FX1c7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBTRVFfRlJBTUVfSDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RJRVJURVhTRVFWSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICBzdC0+Y29kZWNwYXItPndpZHRoID0gU0VRX0ZSQU1FX1c7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBTRVFfRlJBTUVfSDsKIAogICAgIC8qIGluaXRpYWxpemUgdGhlIGF1ZGlvIGRlY29kZXIgc3RyZWFtICovCiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwpAQCAtMjI4LDE1ICsyMjgsMTUgQEAKICAgICBzdC0+c3RhcnRfdGltZSA9IDA7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzIsIDEsIFNFUV9TQU1QTEVfUkFURSk7CiAgICAgc2VxLT5hdWRpb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2QkU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gdGFnICovCi0gICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IDE7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBTRVFfU0FNUExFX1JBVEU7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSAxNjsKLSAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVsczsKLSAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlIC8gODsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9TMTZCRTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDA7ICAvKiBubyB0YWcgKi8KKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IFNFUV9TQU1QTEVfUkFURTsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDE2OworICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICogc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgLyA4OwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC90bHMuYyBiL2xpYmF2Zm9ybWF0L3Rscy5jCmluZGV4IGM2MjU5ODMuLjEwZTA3OTIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Rscy5jCisrKyBiL2xpYmF2Zm9ybWF0L3Rscy5jCkBAIC0xMDYsNSArMTA2LDUgQEAKIAogICAgIHJldHVybiBmZnVybF9vcGVuX3doaXRlbGlzdCgmYy0+dGNwLCBidWYsIEFWSU9fRkxBR19SRUFEX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyZW50LT5pbnRlcnJ1cHRfY2FsbGJhY2ssIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5wcm90b2NvbF93aGl0ZWxpc3QsIHBhcmVudC0+cHJvdG9jb2xfYmxhY2tsaXN0LCBwYXJlbnQpOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGxzLmggYi9saWJhdmZvcm1hdC90bHMuaAppbmRleCAwMzI2ZWY3Li5iZWIxOWQ2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC90bHMuaAorKysgYi9saWJhdmZvcm1hdC90bHMuaApAQCAtMjIsMTEgKzIyLDkgQEAKICNpZm5kZWYgQVZGT1JNQVRfVExTX0gKICNkZWZpbmUgQVZGT1JNQVRfVExTX0gKIAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgInVybC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKIAotI2RlZmluZSBDT05GSUdfVExTX1BST1RPQ09MIChDT05GSUdfVExTX0dOVVRMU19QUk9UT0NPTCB8IENPTkZJR19UTFNfT1BFTlNTTF9QUk9UT0NPTCB8IENPTkZJR19UTFNfU0VDVVJFVFJBTlNQT1JUX1BST1RPQ09MIHwgQ09ORklHX1RMU19TQ0hBTk5FTF9QUk9UT0NPTCkKKyNpbmNsdWRlICJ1cmwuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgVExTU2hhcmVkIHsKICAgICBjaGFyICpjYV9maWxlOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGxzX2dudXRscy5jIGIvbGliYXZmb3JtYXQvdGxzX2dudXRscy5jCmluZGV4IDRiZjk0NDguLmUzYzQzNjggMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Rsc19nbnV0bHMuYworKysgYi9saWJhdmZvcm1hdC90bHNfZ251dGxzLmMKQEAgLTM1LDYgKzM1LDEwIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAKKyNpZm5kZWYgR05VVExTX1ZFUlNJT05fTlVNQkVSCisjZGVmaW5lIEdOVVRMU19WRVJTSU9OX05VTUJFUiBMSUJHTlVUTFNfVkVSU0lPTl9OVU1CRVIKKyNlbmRpZgorCiAjaWYgSEFWRV9USFJFQURTICYmIEdOVVRMU19WRVJTSU9OX05VTUJFUiA8PSAweDAyMGIwMAogI2luY2x1ZGUgPGdjcnlwdC5oPgogI2luY2x1ZGUgImxpYmF2dXRpbC90aHJlYWQuaCIKQEAgLTUxLDI3ICs1NSwzMSBAQAogCiB2b2lkIGZmX2dudXRsc19pbml0KHZvaWQpCiB7Ci0gICAgYXZwcml2X2xvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl9sb2NrX2F2Zm9ybWF0KCk7CiAjaWYgSEFWRV9USFJFQURTICYmIEdOVVRMU19WRVJTSU9OX05VTUJFUiA8IDB4MDIwYjAwCiAgICAgaWYgKGdjcnlfY29udHJvbChHQ1JZQ1RMX0FOWV9JTklUSUFMSVpBVElPTl9QKSA9PSAwKQogICAgICAgICBnY3J5X2NvbnRyb2woR0NSWUNUTF9TRVRfVEhSRUFEX0NCUywgJmdjcnlfdGhyZWFkc19wdGhyZWFkKTsKICNlbmRpZgogICAgIGdudXRsc19nbG9iYWxfaW5pdCgpOwotICAgIGF2cHJpdl91bmxvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl91bmxvY2tfYXZmb3JtYXQoKTsKIH0KIAogdm9pZCBmZl9nbnV0bHNfZGVpbml0KHZvaWQpCiB7Ci0gICAgYXZwcml2X2xvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl9sb2NrX2F2Zm9ybWF0KCk7CiAgICAgZ251dGxzX2dsb2JhbF9kZWluaXQoKTsKLSAgICBhdnByaXZfdW5sb2NrX2F2Zm9ybWF0KCk7CisgICAgZmZfdW5sb2NrX2F2Zm9ybWF0KCk7CiB9CiAKIHN0YXRpYyBpbnQgcHJpbnRfdGxzX2Vycm9yKFVSTENvbnRleHQgKmgsIGludCByZXQpCiB7CiAgICAgc3dpdGNoIChyZXQpIHsKICAgICBjYXNlIEdOVVRMU19FX0FHQUlOOgorICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOwogICAgIGNhc2UgR05VVExTX0VfSU5URVJSVVBURUQ6CisjaWZkZWYgR05VVExTX0VfUFJFTUFUVVJFX1RFUk1JTkFUSU9OCisgICAgY2FzZSBHTlVUTFNfRV9QUkVNQVRVUkVfVEVSTUlOQVRJT046CisjZW5kaWYKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBHTlVUTFNfRV9XQVJOSU5HX0FMRVJUX1JFQ0VJVkVEOgogICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsICIlc1xuIiwgZ251dGxzX3N0cmVycm9yKHJldCkpOwpAQCAtMTA3LDcgKzExNSwxMCBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FWElUKQogICAgICAgICByZXR1cm4gMDsKLSAgICBlcnJubyA9IEVJTzsKKyAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgZXJybm8gPSBFQUdBSU47CisgICAgZWxzZQorICAgICAgICBlcnJubyA9IEVJTzsKICAgICByZXR1cm4gLTE7CiB9CiAKQEAgLTEyMCw3ICsxMzEsMTAgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICBpZiAocmV0ID09IEFWRVJST1JfRVhJVCkKICAgICAgICAgcmV0dXJuIDA7Ci0gICAgZXJybm8gPSBFSU87CisgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgIGVycm5vID0gRUFHQUlOOworICAgIGVsc2UKKyAgICAgICAgZXJybm8gPSBFSU87CiAgICAgcmV0dXJuIC0xOwogfQogCkBAIC0yMTYsNyArMjMwLDExIEBACiBzdGF0aWMgaW50IHRsc19yZWFkKFVSTENvbnRleHQgKmgsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCiB7CiAgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKLSAgICBpbnQgcmV0ID0gZ251dGxzX3JlY29yZF9yZWN2KGMtPnNlc3Npb24sIGJ1Ziwgc2l6ZSk7CisgICAgaW50IHJldDsKKyAgICAvLyBTZXQgb3IgY2xlYXIgdGhlIEFWSU9fRkxBR19OT05CTE9DSyBvbiBjLT50bHNfc2hhcmVkLnRjcAorICAgIGMtPnRsc19zaGFyZWQudGNwLT5mbGFncyAmPSB+QVZJT19GTEFHX05PTkJMT0NLOworICAgIGMtPnRsc19zaGFyZWQudGNwLT5mbGFncyB8PSBoLT5mbGFncyAmIEFWSU9fRkxBR19OT05CTE9DSzsKKyAgICByZXQgPSBnbnV0bHNfcmVjb3JkX3JlY3YoYy0+c2Vzc2lvbiwgYnVmLCBzaXplKTsKICAgICBpZiAocmV0ID4gMCkKICAgICAgICAgcmV0dXJuIHJldDsKICAgICBpZiAocmV0ID09IDApCkBAIC0yMjcsNyArMjQ1LDExIEBACiBzdGF0aWMgaW50IHRsc193cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBzaXplKQogewogICAgIFRMU0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7Ci0gICAgaW50IHJldCA9IGdudXRsc19yZWNvcmRfc2VuZChjLT5zZXNzaW9uLCBidWYsIHNpemUpOworICAgIGludCByZXQ7CisgICAgLy8gU2V0IG9yIGNsZWFyIHRoZSBBVklPX0ZMQUdfTk9OQkxPQ0sgb24gYy0+dGxzX3NoYXJlZC50Y3AKKyAgICBjLT50bHNfc2hhcmVkLnRjcC0+ZmxhZ3MgJj0gfkFWSU9fRkxBR19OT05CTE9DSzsKKyAgICBjLT50bHNfc2hhcmVkLnRjcC0+ZmxhZ3MgfD0gaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0s7CisgICAgcmV0ID0gZ251dGxzX3JlY29yZF9zZW5kKGMtPnNlc3Npb24sIGJ1Ziwgc2l6ZSk7CiAgICAgaWYgKHJldCA+IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgaWYgKHJldCA9PSAwKQpAQCAtMjM1LDYgKzI1NywxMiBAQAogICAgIHJldHVybiBwcmludF90bHNfZXJyb3IoaCwgcmV0KTsKIH0KIAorc3RhdGljIGludCB0bHNfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgpCit7CisgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKGMtPnRsc19zaGFyZWQudGNwKTsKK30KKwogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICBUTFNfQ09NTU9OX09QVElPTlMoVExTQ29udGV4dCwgdGxzX3NoYXJlZCksCiAgICAgeyBOVUxMIH0KQEAgLTI0NywxMiArMjc1LDEzIEBACiAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi1VUkxQcm90b2NvbCBmZl90bHNfZ251dGxzX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfdGxzX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJ0bHMiLAogICAgIC51cmxfb3BlbjIgICAgICA9IHRsc19vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICA9IHRsc19yZWFkLAogICAgIC51cmxfd3JpdGUgICAgICA9IHRsc193cml0ZSwKICAgICAudXJsX2Nsb3NlICAgICAgPSB0bHNfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSB0bHNfZ2V0X2ZpbGVfaGFuZGxlLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUTFNDb250ZXh0KSwKICAgICAuZmxhZ3MgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAogICAgIC5wcml2X2RhdGFfY2xhc3MgPSAmdGxzX2NsYXNzLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGxzX2xpYnRscy5jIGIvbGliYXZmb3JtYXQvdGxzX2xpYnRscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODNiNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90bHNfbGlidGxzLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBUTFMvU1NMIFByb3RvY29sCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTWFydGluIFN0b3Jzam8KKyAqIENvcHlyaWdodCAoYykgMjAxNyBzZmFuNSA8c2ZhbjVAbGl2ZS5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJuZXR3b3JrLmgiCisjaW5jbHVkZSAidXJsLmgiCisjaW5jbHVkZSAidGxzLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlIDx0bHMuaD4KKwordHlwZWRlZiBzdHJ1Y3QgVExTQ29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgVExTU2hhcmVkIHRsc19zaGFyZWQ7CisgICAgc3RydWN0IHRscyAqY3R4OworfSBUTFNDb250ZXh0OworCitzdGF0aWMgaW50IGZmX3Rsc19jbG9zZShVUkxDb250ZXh0ICpoKQoreworICAgIFRMU0NvbnRleHQgKnAgPSBoLT5wcml2X2RhdGE7CisgICAgaWYgKHAtPmN0eCkgeworICAgICAgICB0bHNfY2xvc2UocC0+Y3R4KTsKKyAgICAgICAgdGxzX2ZyZWUocC0+Y3R4KTsKKyAgICB9CisgICAgaWYgKHAtPnRsc19zaGFyZWQudGNwKQorICAgICAgICBmZnVybF9jbG9zZShwLT50bHNfc2hhcmVkLnRjcCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRsc19yZWFkX2NhbGxiYWNrKHN0cnVjdCB0bHMgKmN0eCwgdm9pZCAqYnVmLCBzaXplX3QgYnVmbGVuLCB2b2lkICpjYl9hcmcpCit7CisgICAgVVJMQ29udGV4dCAqaCA9IChVUkxDb250ZXh0KikgY2JfYXJnOworICAgIGludCByZXQgPSBmZnVybF9yZWFkKGgsIGJ1ZiwgYnVmbGVuKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgcmV0dXJuIFRMU19XQU5UX1BPTExJTjsKKyAgICBlbHNlIGlmIChyZXQgPT0gQVZFUlJPUl9FWElUKQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gcmV0ID49IDAgPyByZXQgOiAtMTsKK30KKworc3RhdGljIHNzaXplX3QgdGxzX3dyaXRlX2NhbGxiYWNrKHN0cnVjdCB0bHMgKmN0eCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgYnVmbGVuLCB2b2lkICpjYl9hcmcpCit7CisgICAgVVJMQ29udGV4dCAqaCA9IChVUkxDb250ZXh0KikgY2JfYXJnOworICAgIGludCByZXQgPSBmZnVybF93cml0ZShoLCBidWYsIGJ1Zmxlbik7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgIHJldHVybiBUTFNfV0FOVF9QT0xMT1VUOworICAgIGVsc2UgaWYgKHJldCA9PSBBVkVSUk9SX0VYSVQpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiByZXQgPj0gMCA/IHJldCA6IC0xOworfQorCitzdGF0aWMgaW50IGZmX3Rsc19vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQoreworICAgIFRMU0NvbnRleHQgKnAgPSBoLT5wcml2X2RhdGE7CisgICAgVExTU2hhcmVkICpjID0gJnAtPnRsc19zaGFyZWQ7CisgICAgc3RydWN0IHRsc19jb25maWcgKmNmZyA9IE5VTEw7CisgICAgaW50IHJldDsKKworICAgIGlmICh0bHNfaW5pdCgpID09IC0xKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGlmICgocmV0ID0gZmZfdGxzX29wZW5fdW5kZXJseWluZyhjLCBoLCB1cmksIG9wdGlvbnMpKSA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIHAtPmN0eCA9ICFjLT5saXN0ZW4gPyB0bHNfY2xpZW50KCkgOiB0bHNfc2VydmVyKCk7CisgICAgaWYgKCFwLT5jdHgpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgY2ZnID0gdGxzX2NvbmZpZ19uZXcoKTsKKyAgICBpZiAoIXAtPmN0eCkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKHRsc19jb25maWdfc2V0X3Byb3RvY29scyhjZmcsIFRMU19QUk9UT0NPTFNfQUxMKSA9PSAtMSkKKyAgICAgICAgZ290byBlcnJfY29uZmlnOworICAgIC8vIFdoaWxlIFRMU3YxLjAgYW5kIFRMU3YxLjEgYXJlIGFscmVhZHkgZW5hYmxlZCBieSB0aGUgYWJvdmUsCisgICAgLy8gd2UgbmVlZCB0byBiZSBsZXNzIHN0cmljdCB3aXRoIGNpcGhlcnMgc28gaXQgd29ya3MgaW4gcHJhY3RpY2UuCisgICAgaWYgKHRsc19jb25maWdfc2V0X2NpcGhlcnMoY2ZnLCAiY29tcGF0IikgPT0gLTEpCisgICAgICAgIGdvdG8gZXJyX2NvbmZpZzsKKyAgICBpZiAoYy0+Y2FfZmlsZSAmJiB0bHNfY29uZmlnX3NldF9jYV9maWxlKGNmZywgYy0+Y2FfZmlsZSkgPT0gLTEpCisgICAgICAgIGdvdG8gZXJyX2NvbmZpZzsKKyAgICBpZiAoYy0+Y2VydF9maWxlICYmIHRsc19jb25maWdfc2V0X2NlcnRfZmlsZShjZmcsIGMtPmNlcnRfZmlsZSkgPT0gLTEpCisgICAgICAgIGdvdG8gZXJyX2NvbmZpZzsKKyAgICBpZiAoYy0+a2V5X2ZpbGUgJiYgdGxzX2NvbmZpZ19zZXRfa2V5X2ZpbGUoY2ZnLCBjLT5rZXlfZmlsZSkgPT0gLTEpCisgICAgICAgIGdvdG8gZXJyX2NvbmZpZzsKKyAgICBpZiAoIWMtPnZlcmlmeSkgeworICAgICAgICB0bHNfY29uZmlnX2luc2VjdXJlX25vdmVyaWZ5Y2VydChjZmcpOworICAgICAgICB0bHNfY29uZmlnX2luc2VjdXJlX25vdmVyaWZ5bmFtZShjZmcpOworICAgICAgICB0bHNfY29uZmlnX2luc2VjdXJlX25vdmVyaWZ5dGltZShjZmcpOworICAgIH0KKyAgICBpZiAodGxzX2NvbmZpZ3VyZShwLT5jdHgsIGNmZykgPT0gLTEpCisgICAgICAgIGdvdG8gZXJyX2N0eDsKKworICAgIGlmICghYy0+bGlzdGVuKSB7CisgICAgICAgIHJldCA9IHRsc19jb25uZWN0X2NicyhwLT5jdHgsIHRsc19yZWFkX2NhbGxiYWNrLCB0bHNfd3JpdGVfY2FsbGJhY2ssCisgICAgICAgICAgICBjLT50Y3AsIGMtPmhvc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCB0bHMgKmN0eF9uZXc7CisgICAgICAgIHJldCA9IHRsc19hY2NlcHRfY2JzKHAtPmN0eCwgJmN0eF9uZXcsIHRsc19yZWFkX2NhbGxiYWNrLAorICAgICAgICAgICAgdGxzX3dyaXRlX2NhbGxiYWNrLCBjLT50Y3ApOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIC8vIGZyZWUgInNlcnZlciIgY29udGV4dCBhbmQgcmVwbGFjZSBieSAiY29ubmVjdGlvbiIgY29udGV4dAorICAgICAgICAgICAgdGxzX2ZyZWUocC0+Y3R4KTsKKyAgICAgICAgICAgIHAtPmN0eCA9IGN0eF9uZXc7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJldCA9PSAtMSkKKyAgICAgICAgZ290byBlcnJfY3R4OworCisgICAgdGxzX2NvbmZpZ19mcmVlKGNmZyk7CisgICAgcmV0dXJuIDA7CitlcnJfY29uZmlnOgorICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICIlc1xuIiwgdGxzX2NvbmZpZ19lcnJvcihjZmcpKTsKKyAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgZ290byBmYWlsOworZXJyX2N0eDoKKyAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIHRsc19lcnJvcihwLT5jdHgpKTsKKyAgICByZXQgPSBBVkVSUk9SKEVJTyk7CisgICAgLyogZmFsbHRocm91Z2ggKi8KK2ZhaWw6CisgICAgaWYgKGNmZykKKyAgICAgICAgdGxzX2NvbmZpZ19mcmVlKGNmZyk7CisgICAgZmZfdGxzX2Nsb3NlKGgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZmZfdGxzX3JlYWQoVVJMQ29udGV4dCAqaCwgdWludDhfdCAqYnVmLCBpbnQgc2l6ZSkKK3sKKyAgICBUTFNDb250ZXh0ICpwID0gaC0+cHJpdl9kYXRhOworICAgIHNzaXplX3QgcmV0OworICAgIHJldCA9IHRsc19yZWFkKHAtPmN0eCwgYnVmLCBzaXplKTsKKyAgICBpZiAocmV0ID4gMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBlbHNlIGlmIChyZXQgPT0gMCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICIlc1xuIiwgdGxzX2Vycm9yKHAtPmN0eCkpOworICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Cit9CisKK3N0YXRpYyBpbnQgZmZfdGxzX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCit7CisgICAgVExTQ29udGV4dCAqcCA9IGgtPnByaXZfZGF0YTsKKyAgICBzc2l6ZV90IHJldDsKKyAgICByZXQgPSB0bHNfd3JpdGUocC0+Y3R4LCBidWYsIHNpemUpOworICAgIGlmIChyZXQgPiAwKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGVsc2UgaWYgKHJldCA9PSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCB0bHNfZXJyb3IocC0+Y3R4KSk7CisgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKK30KKworc3RhdGljIGludCB0bHNfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgpCit7CisgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKGMtPnRsc19zaGFyZWQudGNwKTsKK30KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICBUTFNfQ09NTU9OX09QVElPTlMoVExTQ29udGV4dCwgdGxzX3NoYXJlZCksCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIHRsc19jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJ0bHMiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgPSBvcHRpb25zLAorICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorfTsKKworY29uc3QgVVJMUHJvdG9jb2wgZmZfdGxzX3Byb3RvY29sID0geworICAgIC5uYW1lICAgICAgICAgICA9ICJ0bHMiLAorICAgIC51cmxfb3BlbjIgICAgICA9IGZmX3Rsc19vcGVuLAorICAgIC51cmxfcmVhZCAgICAgICA9IGZmX3Rsc19yZWFkLAorICAgIC51cmxfd3JpdGUgICAgICA9IGZmX3Rsc193cml0ZSwKKyAgICAudXJsX2Nsb3NlICAgICAgPSBmZl90bHNfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSB0bHNfZ2V0X2ZpbGVfaGFuZGxlLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUTFNDb250ZXh0KSwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAorICAgIC5wcml2X2RhdGFfY2xhc3MgPSAmdGxzX2NsYXNzLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3Rsc19vcGVuc3NsLmMgYi9saWJhdmZvcm1hdC90bHNfb3BlbnNzbC5jCmluZGV4IDYzNmQ0ZWUuLjU5YTg2MTUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Rsc19vcGVuc3NsLmMKKysrIGIvbGliYXZmb3JtYXQvdGxzX29wZW5zc2wuYwpAQCAtNDMsNiArNDMsOSBAQAogICAgIFRMU1NoYXJlZCB0bHNfc2hhcmVkOwogICAgIFNTTF9DVFggKmN0eDsKICAgICBTU0wgKnNzbDsKKyNpZiBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSID49IDB4MTAxMDAwMGZMCisgICAgQklPX01FVEhPRCogdXJsX2Jpb19tZXRob2Q7CisjZW5kaWYKIH0gVExTQ29udGV4dDsKIAogI2lmIEhBVkVfVEhSRUFEUwpAQCAtNjUsNyArNjgsNyBAQAogCiBpbnQgZmZfb3BlbnNzbF9pbml0KHZvaWQpCiB7Ci0gICAgYXZwcml2X2xvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl9sb2NrX2F2Zm9ybWF0KCk7CiAgICAgaWYgKCFvcGVuc3NsX2luaXQpIHsKICAgICAgICAgU1NMX2xpYnJhcnlfaW5pdCgpOwogICAgICAgICBTU0xfbG9hZF9lcnJvcl9zdHJpbmdzKCk7CkBAIC03NCw3ICs3Nyw3IEBACiAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgIG9wZW5zc2xfbXV0ZXhlcyA9IGF2X21hbGxvY19hcnJheShzaXplb2YocHRocmVhZF9tdXRleF90KSwgQ1JZUFRPX251bV9sb2NrcygpKTsKICAgICAgICAgICAgIGlmICghb3BlbnNzbF9tdXRleGVzKSB7Ci0gICAgICAgICAgICAgICAgYXZwcml2X3VubG9ja19hdmZvcm1hdCgpOworICAgICAgICAgICAgICAgIGZmX3VubG9ja19hdmZvcm1hdCgpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgICAgICB9CiAKQEAgLTg4LDE0ICs5MSwxNCBAQAogI2VuZGlmCiAgICAgfQogICAgIG9wZW5zc2xfaW5pdCsrOwotICAgIGF2cHJpdl91bmxvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl91bmxvY2tfYXZmb3JtYXQoKTsKIAogICAgIHJldHVybiAwOwogfQogCiB2b2lkIGZmX29wZW5zc2xfZGVpbml0KHZvaWQpCiB7Ci0gICAgYXZwcml2X2xvY2tfYXZmb3JtYXQoKTsKKyAgICBmZl9sb2NrX2F2Zm9ybWF0KCk7CiAgICAgb3BlbnNzbF9pbml0LS07CiAgICAgaWYgKCFvcGVuc3NsX2luaXQpIHsKICNpZiBIQVZFX1RIUkVBRFMKQEAgLTEwOCwxMSArMTExLDE3IEBACiAgICAgICAgIH0KICNlbmRpZgogICAgIH0KLSAgICBhdnByaXZfdW5sb2NrX2F2Zm9ybWF0KCk7CisgICAgZmZfdW5sb2NrX2F2Zm9ybWF0KCk7CiB9CiAKIHN0YXRpYyBpbnQgcHJpbnRfdGxzX2Vycm9yKFVSTENvbnRleHQgKmgsIGludCByZXQpCiB7CisgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICBpZiAoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0spIHsKKyAgICAgICAgaW50IGVyciA9IFNTTF9nZXRfZXJyb3IoYy0+c3NsLCByZXQpOworICAgICAgICBpZiAoZXJyID09IFNTTF9FUlJPUl9XQU5UX1JFQUQgfHwgZXJyID09IFNTTF9FUlJPUl9XQU5UX1JFQUQpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFQUdBSU4pOworICAgIH0KICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIEVSUl9lcnJvcl9zdHJpbmcoRVJSX2dldF9lcnJvcigpLCBOVUxMKSk7CiAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIH0KQEAgLTEyOCwxNSArMTM3LDI1IEBACiAgICAgICAgIFNTTF9DVFhfZnJlZShjLT5jdHgpOwogICAgIGlmIChjLT50bHNfc2hhcmVkLnRjcCkKICAgICAgICAgZmZ1cmxfY2xvc2UoYy0+dGxzX3NoYXJlZC50Y3ApOworI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDEwMDAwZkwKKyAgICBpZiAoYy0+dXJsX2Jpb19tZXRob2QpCisgICAgICAgIEJJT19tZXRoX2ZyZWUoYy0+dXJsX2Jpb19tZXRob2QpOworI2VuZGlmCiAgICAgZmZfb3BlbnNzbF9kZWluaXQoKTsKICAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB1cmxfYmlvX2NyZWF0ZShCSU8gKmIpCiB7CisjaWYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA+PSAweDEwMTAwMDBmTAorICAgIEJJT19zZXRfaW5pdChiLCAxKTsKKyAgICBCSU9fc2V0X2RhdGEoYiwgTlVMTCk7CisgICAgQklPX3NldF9mbGFncyhiLCAwKTsKKyNlbHNlCiAgICAgYi0+aW5pdCA9IDE7CiAgICAgYi0+cHRyID0gTlVMTDsKICAgICBiLT5mbGFncyA9IDA7CisjZW5kaWYKICAgICByZXR1cm4gMTsKIH0KIApAQCAtMTQ1LDEzICsxNjQsMjEgQEAKICAgICByZXR1cm4gMTsKIH0KIAorI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDEwMDAwZkwKKyNkZWZpbmUgR0VUX0JJT19EQVRBKHgpIEJJT19nZXRfZGF0YSh4KQorI2Vsc2UKKyNkZWZpbmUgR0VUX0JJT19EQVRBKHgpICh4KS0+cHRyCisjZW5kaWYKKwogc3RhdGljIGludCB1cmxfYmlvX2JyZWFkKEJJTyAqYiwgY2hhciAqYnVmLCBpbnQgbGVuKQogewotICAgIFVSTENvbnRleHQgKmggPSBiLT5wdHI7CisgICAgVVJMQ29udGV4dCAqaCA9IEdFVF9CSU9fREFUQShiKTsKICAgICBpbnQgcmV0ID0gZmZ1cmxfcmVhZChoLCBidWYsIGxlbik7CiAgICAgaWYgKHJldCA+PSAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIEJJT19jbGVhcl9yZXRyeV9mbGFncyhiKTsKKyAgICBpZiAocmV0ID09IEFWRVJST1IoRUFHQUlOKSkKKyAgICAgICAgQklPX3NldF9yZXRyeV9yZWFkKGIpOwogICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FWElUKQogICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gLTE7CkBAIC0xNTksMTEgKzE4NiwxMyBAQAogCiBzdGF0aWMgaW50IHVybF9iaW9fYndyaXRlKEJJTyAqYiwgY29uc3QgY2hhciAqYnVmLCBpbnQgbGVuKQogewotICAgIFVSTENvbnRleHQgKmggPSBiLT5wdHI7CisgICAgVVJMQ29udGV4dCAqaCA9IEdFVF9CSU9fREFUQShiKTsKICAgICBpbnQgcmV0ID0gZmZ1cmxfd3JpdGUoaCwgYnVmLCBsZW4pOwogICAgIGlmIChyZXQgPj0gMCkKICAgICAgICAgcmV0dXJuIHJldDsKICAgICBCSU9fY2xlYXJfcmV0cnlfZmxhZ3MoYik7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikpCisgICAgICAgIEJJT19zZXRfcmV0cnlfd3JpdGUoYik7CiAgICAgaWYgKHJldCA9PSBBVkVSUk9SX0VYSVQpCiAgICAgICAgIHJldHVybiAwOwogICAgIHJldHVybiAtMTsKQEAgLTE4Myw2ICsyMTIsNyBAQAogICAgIHJldHVybiB1cmxfYmlvX2J3cml0ZShiLCBzdHIsIHN0cmxlbihzdHIpKTsKIH0KIAorI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPCAweDEwMTAwMDBmTAogc3RhdGljIEJJT19NRVRIT0QgdXJsX2Jpb19tZXRob2QgPSB7CiAgICAgLnR5cGUgPSBCSU9fVFlQRV9TT1VSQ0VfU0lOSywKICAgICAubmFtZSA9ICJ1cmxwcm90b2NvbCBiaW8iLApAQCAtMTk0LDYgKzIyNCw3IEBACiAgICAgLmNyZWF0ZSA9IHVybF9iaW9fY3JlYXRlLAogICAgIC5kZXN0cm95ID0gdXJsX2Jpb19kZXN0cm95LAogfTsKKyNlbmRpZgogCiBzdGF0aWMgaW50IHRsc19vcGVuKFVSTENvbnRleHQgKmgsIGNvbnN0IGNoYXIgKnVyaSwgaW50IGZsYWdzLCBBVkRpY3Rpb25hcnkgKipvcHRpb25zKQogewpAQCAtMjA4LDEyICsyMzksMTcgQEAKICAgICBpZiAoKHJldCA9IGZmX3Rsc19vcGVuX3VuZGVybHlpbmcoYywgaCwgdXJpLCBvcHRpb25zKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICBwLT5jdHggPSBTU0xfQ1RYX25ldyhjLT5saXN0ZW4gPyBUTFN2MV9zZXJ2ZXJfbWV0aG9kKCkgOiBUTFN2MV9jbGllbnRfbWV0aG9kKCkpOworICAgIC8vIFdlIHdhbnQgdG8gc3VwcG9ydCBhbGwgdmVyc2lvbnMgb2YgVExTID49IDEuMCwgYnV0IG5vdCB0aGUgZGVwcmVjYXRlZAorICAgIC8vIGFuZCBpbnNlY3VyZSBTU0x2MiBhbmQgU1NMdjMuICBEZXNwaXRlIHRoZSBuYW1lLCBTU0x2MjNfKl9tZXRob2QoKQorICAgIC8vIGVuYWJsZXMgc3VwcG9ydCBmb3IgYWxsIHZlcnNpb25zIG9mIFNTTCBhbmQgVExTLCBhbmQgd2UgdGhlbiBkaXNhYmxlCisgICAgLy8gc3VwcG9ydCBmb3IgdGhlIG9sZCBwcm90b2NvbHMgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpbmcgdGhlIGNvbnRleHQuCisgICAgcC0+Y3R4ID0gU1NMX0NUWF9uZXcoYy0+bGlzdGVuID8gU1NMdjIzX3NlcnZlcl9tZXRob2QoKSA6IFNTTHYyM19jbGllbnRfbWV0aG9kKCkpOwogICAgIGlmICghcC0+Y3R4KSB7CiAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICIlc1xuIiwgRVJSX2Vycm9yX3N0cmluZyhFUlJfZ2V0X2Vycm9yKCksIE5VTEwpKTsKICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQorICAgIFNTTF9DVFhfc2V0X29wdGlvbnMocC0+Y3R4LCBTU0xfT1BfTk9fU1NMdjIgfCBTU0xfT1BfTk9fU1NMdjMpOwogICAgIGlmIChjLT5jYV9maWxlKSB7CiAgICAgICAgIGlmICghU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMocC0+Y3R4LCBjLT5jYV9maWxlLCBOVUxMKSkKICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJTU0xfQ1RYX2xvYWRfdmVyaWZ5X2xvY2F0aW9ucyAlc1xuIiwgRVJSX2Vycm9yX3N0cmluZyhFUlJfZ2V0X2Vycm9yKCksIE5VTEwpKTsKQEAgLTI0MCw4ICsyNzYsMjAgQEAKICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOwogICAgICAgICBnb3RvIGZhaWw7CiAgICAgfQorI2lmIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgPj0gMHgxMDEwMDAwZkwKKyAgICBwLT51cmxfYmlvX21ldGhvZCA9IEJJT19tZXRoX25ldyhCSU9fVFlQRV9TT1VSQ0VfU0lOSywgInVybHByb3RvY29sIGJpbyIpOworICAgIEJJT19tZXRoX3NldF93cml0ZShwLT51cmxfYmlvX21ldGhvZCwgdXJsX2Jpb19id3JpdGUpOworICAgIEJJT19tZXRoX3NldF9yZWFkKHAtPnVybF9iaW9fbWV0aG9kLCB1cmxfYmlvX2JyZWFkKTsKKyAgICBCSU9fbWV0aF9zZXRfcHV0cyhwLT51cmxfYmlvX21ldGhvZCwgdXJsX2Jpb19icHV0cyk7CisgICAgQklPX21ldGhfc2V0X2N0cmwocC0+dXJsX2Jpb19tZXRob2QsIHVybF9iaW9fY3RybCk7CisgICAgQklPX21ldGhfc2V0X2NyZWF0ZShwLT51cmxfYmlvX21ldGhvZCwgdXJsX2Jpb19jcmVhdGUpOworICAgIEJJT19tZXRoX3NldF9kZXN0cm95KHAtPnVybF9iaW9fbWV0aG9kLCB1cmxfYmlvX2Rlc3Ryb3kpOworICAgIGJpbyA9IEJJT19uZXcocC0+dXJsX2Jpb19tZXRob2QpOworICAgIEJJT19zZXRfZGF0YShiaW8sIGMtPnRjcCk7CisjZWxzZQogICAgIGJpbyA9IEJJT19uZXcoJnVybF9iaW9fbWV0aG9kKTsKICAgICBiaW8tPnB0ciA9IGMtPnRjcDsKKyNlbmRpZgogICAgIFNTTF9zZXRfYmlvKHAtPnNzbCwgYmlvLCBiaW8pOwogICAgIGlmICghYy0+bGlzdGVuICYmICFjLT5udW1lcmljaG9zdCkKICAgICAgICAgU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKHAtPnNzbCwgYy0+aG9zdCk7CkBAIC0yNjQsNyArMzEyLDExIEBACiBzdGF0aWMgaW50IHRsc19yZWFkKFVSTENvbnRleHQgKmgsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCiB7CiAgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKLSAgICBpbnQgcmV0ID0gU1NMX3JlYWQoYy0+c3NsLCBidWYsIHNpemUpOworICAgIGludCByZXQ7CisgICAgLy8gU2V0IG9yIGNsZWFyIHRoZSBBVklPX0ZMQUdfTk9OQkxPQ0sgb24gYy0+dGxzX3NoYXJlZC50Y3AKKyAgICBjLT50bHNfc2hhcmVkLnRjcC0+ZmxhZ3MgJj0gfkFWSU9fRkxBR19OT05CTE9DSzsKKyAgICBjLT50bHNfc2hhcmVkLnRjcC0+ZmxhZ3MgfD0gaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfTk9OQkxPQ0s7CisgICAgcmV0ID0gU1NMX3JlYWQoYy0+c3NsLCBidWYsIHNpemUpOwogICAgIGlmIChyZXQgPiAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIGlmIChyZXQgPT0gMCkKQEAgLTI3NSw3ICszMjcsMTEgQEAKIHN0YXRpYyBpbnQgdGxzX3dyaXRlKFVSTENvbnRleHQgKmgsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCiB7CiAgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKLSAgICBpbnQgcmV0ID0gU1NMX3dyaXRlKGMtPnNzbCwgYnVmLCBzaXplKTsKKyAgICBpbnQgcmV0OworICAgIC8vIFNldCBvciBjbGVhciB0aGUgQVZJT19GTEFHX05PTkJMT0NLIG9uIGMtPnRsc19zaGFyZWQudGNwCisgICAgYy0+dGxzX3NoYXJlZC50Y3AtPmZsYWdzICY9IH5BVklPX0ZMQUdfTk9OQkxPQ0s7CisgICAgYy0+dGxzX3NoYXJlZC50Y3AtPmZsYWdzIHw9IGgtPmZsYWdzICYgQVZJT19GTEFHX05PTkJMT0NLOworICAgIHJldCA9IFNTTF93cml0ZShjLT5zc2wsIGJ1Ziwgc2l6ZSk7CiAgICAgaWYgKHJldCA+IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgaWYgKHJldCA9PSAwKQpAQCAtMjgzLDYgKzMzOSwxMiBAQAogICAgIHJldHVybiBwcmludF90bHNfZXJyb3IoaCwgcmV0KTsKIH0KIAorc3RhdGljIGludCB0bHNfZ2V0X2ZpbGVfaGFuZGxlKFVSTENvbnRleHQgKmgpCit7CisgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKKyAgICByZXR1cm4gZmZ1cmxfZ2V0X2ZpbGVfaGFuZGxlKGMtPnRsc19zaGFyZWQudGNwKTsKK30KKwogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICBUTFNfQ09NTU9OX09QVElPTlMoVExTQ29udGV4dCwgdGxzX3NoYXJlZCksCiAgICAgeyBOVUxMIH0KQEAgLTI5NSwxMiArMzU3LDEzIEBACiAgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCiB9OwogCi1VUkxQcm90b2NvbCBmZl90bHNfb3BlbnNzbF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX3Rsc19wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgPSAidGxzIiwKICAgICAudXJsX29wZW4yICAgICAgPSB0bHNfb3BlbiwKICAgICAudXJsX3JlYWQgICAgICAgPSB0bHNfcmVhZCwKICAgICAudXJsX3dyaXRlICAgICAgPSB0bHNfd3JpdGUsCiAgICAgLnVybF9jbG9zZSAgICAgID0gdGxzX2Nsb3NlLAorICAgIC51cmxfZ2V0X2ZpbGVfaGFuZGxlID0gdGxzX2dldF9maWxlX2hhbmRsZSwKICAgICAucHJpdl9kYXRhX3NpemUgPSBzaXplb2YoVExTQ29udGV4dCksCiAgICAgLmZsYWdzICAgICAgICAgID0gVVJMX1BST1RPQ09MX0ZMQUdfTkVUV09SSywKICAgICAucHJpdl9kYXRhX2NsYXNzID0gJnRsc19jbGFzcywKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3Rsc19zY2hhbm5lbC5jIGIvbGliYXZmb3JtYXQvdGxzX3NjaGFubmVsLmMKaW5kZXggODVjMDFhMC4uZjQxYjAwNyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdGxzX3NjaGFubmVsLmMKKysrIGIvbGliYXZmb3JtYXQvdGxzX3NjaGFubmVsLmMKQEAgLTQxMywxMSArNDEzLDEzIEBACiAKICAgICAgICAgcmV0ID0gZmZ1cmxfcmVhZChzLT50Y3AsIGMtPmVuY19idWYgKyBjLT5lbmNfYnVmX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjLT5lbmNfYnVmX3NpemUgLSBjLT5lbmNfYnVmX29mZnNldCk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGlmIChyZXQgPT0gQVZFUlJPUl9FT0YpIHsKKyAgICAgICAgICAgIGMtPmNvbm5lY3Rpb25fY2xvc2VkID0gMTsKKyAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byByZWFkIGZyb20gc29ja2V0XG4iKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApCi0gICAgICAgICAgICBjLT5jb25uZWN0aW9uX2Nsb3NlZCA9IDE7CisgICAgICAgIH0KIAogICAgICAgICBjLT5lbmNfYnVmX29mZnNldCArPSByZXQ7CiAgICAgfQpAQCAtNDk0LDcgKzQ5Niw3IEBACiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVBR0FJTik7CiAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGRlY3J5cHQgbWVzc2FnZVxuIik7CisgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGRlY3J5cHQgbWVzc2FnZSAoZXJyb3IgMHgleClcbiIsICh1bnNpZ25lZClzc3BpX3JldCk7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CiAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CiAgICAgICAgIH0KQEAgLTUxNSw3ICs1MTcsNyBAQAogICAgIGlmIChyZXQgPT0gMCAmJiAhYy0+Y29ubmVjdGlvbl9jbG9zZWQpCiAgICAgICAgIHJldCA9IEFWRVJST1IoRUFHQUlOKTsKIAotICAgIHJldHVybiByZXQgPCAwID8gcmV0IDogMDsKKyAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfRU9GOwogfQogCiBzdGF0aWMgaW50IHRsc193cml0ZShVUkxDb250ZXh0ICpoLCBjb25zdCB1aW50OF90ICpidWYsIGludCBsZW4pCkBAIC01NzcsNiArNTc5LDEyIEBACiAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBvdXRidWZbMV0uY2JCdWZmZXI7CiB9CiAKK3N0YXRpYyBpbnQgdGxzX2dldF9maWxlX2hhbmRsZShVUkxDb250ZXh0ICpoKQoreworICAgIFRMU0NvbnRleHQgKmMgPSBoLT5wcml2X2RhdGE7CisgICAgcmV0dXJuIGZmdXJsX2dldF9maWxlX2hhbmRsZShjLT50bHNfc2hhcmVkLnRjcCk7Cit9CisKIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CiAgICAgVExTX0NPTU1PTl9PUFRJT05TKFRMU0NvbnRleHQsIHRsc19zaGFyZWQpLAogICAgIHsgTlVMTCB9CkBAIC01ODksMTIgKzU5NywxMyBAQAogICAgIC52ZXJzaW9uICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogfTsKIAotVVJMUHJvdG9jb2wgZmZfdGxzX3NjaGFubmVsX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfdGxzX3Byb3RvY29sID0gewogICAgIC5uYW1lICAgICAgICAgICA9ICJ0bHMiLAogICAgIC51cmxfb3BlbjIgICAgICA9IHRsc19vcGVuLAogICAgIC51cmxfcmVhZCAgICAgICA9IHRsc19yZWFkLAogICAgIC51cmxfd3JpdGUgICAgICA9IHRsc193cml0ZSwKICAgICAudXJsX2Nsb3NlICAgICAgPSB0bHNfY2xvc2UsCisgICAgLnVybF9nZXRfZmlsZV9oYW5kbGUgPSB0bHNfZ2V0X2ZpbGVfaGFuZGxlLAogICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUTFNDb250ZXh0KSwKICAgICAuZmxhZ3MgICAgICAgICAgPSBVUkxfUFJPVE9DT0xfRkxBR19ORVRXT1JLLAogICAgIC5wcml2X2RhdGFfY2xhc3MgPSAmdGxzX2NsYXNzLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdGxzX3NlY3VyZXRyYW5zcG9ydC5jIGIvbGliYXZmb3JtYXQvdGxzX3NlY3VyZXRyYW5zcG9ydC5jCmluZGV4IDQ4Mjc3MWEuLjM3MzgwNTQgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Rsc19zZWN1cmV0cmFuc3BvcnQuYworKysgYi9saWJhdmZvcm1hdC90bHNfc2VjdXJldHJhbnNwb3J0LmMKQEAgLTU0LDcgKzU0LDcgQEAKICAgICBUTFNDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOwogICAgIHN3aXRjaCAocmV0KSB7CiAgICAgY2FzZSBlcnJTU0xXb3VsZEJsb2NrOgotICAgICAgICBicmVhazsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUFHQUlOKTsKICAgICBjYXNlIGVyclNTTFhDZXJ0Q2hhaW5JbnZhbGlkOgogICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjZXJ0aWZpY2F0ZSBjaGFpblxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CkBAIC02OSw2ICs2OSw5IEBACiAKIHN0YXRpYyBpbnQgaW1wb3J0X3BlbShVUkxDb250ZXh0ICpoLCBjaGFyICpwYXRoLCBDRkFycmF5UmVmICphcnJheSkKIHsKKyNpZiAhSEFWRV9TRUNJVEVNSU1QT1JUCisgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworI2Vsc2UKICAgICBBVklPQ29udGV4dCAqcyA9IE5VTEw7CiAgICAgQ0ZEYXRhUmVmIGRhdGEgPSBOVUxMOwogICAgIGludDY0X3QgcmV0ID0gMDsKQEAgLTgzLDcgKzg2LDcgQEAKIAogICAgIGlmICgocmV0ID0gZmZpb19vcGVuX3doaXRlbGlzdCgmcywgcGF0aCwgQVZJT19GTEFHX1JFQUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoLT5pbnRlcnJ1cHRfY2FsbGJhY2ssIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgtPnByb3RvY29sX3doaXRlbGlzdCkpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC0+cHJvdG9jb2xfd2hpdGVsaXN0LCBoLT5wcm90b2NvbF9ibGFja2xpc3QpKSA8IDApCiAgICAgICAgIGdvdG8gZW5kOwogCiAgICAgaWYgKChyZXQgPSBhdmlvX3NpemUocykpIDwgMCkKQEAgLTEyNCw2ICsxMjcsNyBAQAogICAgIGlmIChzKQogICAgICAgICBhdmlvX2Nsb3NlKHMpOwogICAgIHJldHVybiByZXQ7CisjZW5kaWYKIH0KIAogc3RhdGljIGludCBsb2FkX2NhKFVSTENvbnRleHQgKmgpCkBAIC0xOTMsNyArMTk3LDggQEAKIHsKICAgICBVUkxDb250ZXh0ICpoID0gKFVSTENvbnRleHQqKWNvbm5lY3Rpb247CiAgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKLSAgICBpbnQgcmVhZCA9IGZmdXJsX3JlYWRfY29tcGxldGUoYy0+dGxzX3NoYXJlZC50Y3AsIGRhdGEsICpkYXRhTGVuZ3RoKTsKKyAgICBzaXplX3QgcmVxdWVzdGVkID0gKmRhdGFMZW5ndGg7CisgICAgaW50IHJlYWQgPSBmZnVybF9yZWFkKGMtPnRsc19zaGFyZWQudGNwLCBkYXRhLCByZXF1ZXN0ZWQpOwogICAgIGlmIChyZWFkIDw9IDApIHsKICAgICAgICAgKmRhdGFMZW5ndGggPSAwOwogICAgICAgICBzd2l0Y2goQVZVTkVSUk9SKHJlYWQpKSB7CkBAIC0yMTAsNyArMjE1LDEwIEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAqZGF0YUxlbmd0aCA9IHJlYWQ7Ci0gICAgICAgIHJldHVybiBub0VycjsKKyAgICAgICAgaWYgKHJlYWQgPCByZXF1ZXN0ZWQpCisgICAgICAgICAgICByZXR1cm4gZXJyU1NMV291bGRCbG9jazsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIG5vRXJyOwogICAgIH0KIH0KIApAQCAtMzIyLDEyICszMzAsMTMgQEAKICAgICAgICAgICAgIGlmIChwZWVyVHJ1c3QpCiAgICAgICAgICAgICAgICAgQ0ZSZWxlYXNlKHBlZXJUcnVzdCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgewogICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBuZWdvdGlhdGUgVExTL1NTTCBzZXNzaW9uOiAlaVxuIiwgKGludClzdGF0dXMpOwotICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7Ci0gICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gZXJyU1NMV291bGRCbG9jaykgeworICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgIlVuYWJsZSB0byBuZWdvdGlhdGUgVExTL1NTTCBzZXNzaW9uOiAlaVxuIiwgKGludClzdGF0dXMpOworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0zNDQsNiArMzUzLDkgQEAKICAgICBjYXNlIGVyclNTTENsb3NlZEdyYWNlZnVsOgogICAgIGNhc2UgZXJyU1NMQ2xvc2VkTm9Ob3RpZnk6CiAgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgZXJyU1NMV291bGRCbG9jazoKKyAgICAgICAgaWYgKHByb2Nlc3NlZCA+IDApCisgICAgICAgICAgICByZXR1cm4gcHJvY2Vzc2VkOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiAoaW50KXN0YXR1czsKICAgICB9CkBAIC0zNTIsOCArMzY0LDEyIEBACiBzdGF0aWMgaW50IHRsc19yZWFkKFVSTENvbnRleHQgKmgsIHVpbnQ4X3QgKmJ1ZiwgaW50IHNpemUpCiB7CiAgICAgVExTQ29udGV4dCAqYyA9IGgtPnByaXZfZGF0YTsKLSAgICBzaXplX3QgcHJvY2Vzc2VkID0gMDsKLSAgICBpbnQgcmV0ID0gU1NMUmVhZChjLT5zc2xfY29udGV4dCwgYnVmLCBzaXplLCAmcHJvY2Vzc2VkKTsKKyAgICBzaXplX3QgYXZhaWxhYmxlID0gMCwgcHJvY2Vzc2VkID0gMDsKKyAgICBpbnQgcmV0OworICAgIFNTTEdldEJ1ZmZlcmVkUmVhZFNpemUoYy0+c3NsX2NvbnRleHQsICZhdmFpbGFibGUpOworICAgIGlmIChhdmFpbGFibGUpCisgICAgICAgIHNpemUgPSBGRk1JTihhdmFpbGFibGUsIHNpemUpOworICAgIHJldCA9IFNTTFJlYWQoYy0+c3NsX2NvbnRleHQsIGJ1Ziwgc2l6ZSwgJnByb2Nlc3NlZCk7CiAgICAgcmV0ID0gbWFwX3NzbF9lcnJvcihyZXQsIHByb2Nlc3NlZCk7CiAgICAgaWYgKHJldCA+IDApCiAgICAgICAgIHJldHVybiByZXQ7CkBAIC0zNzUsNiArMzkxLDEyIEBACiAgICAgcmV0dXJuIHByaW50X3Rsc19lcnJvcihoLCByZXQpOwogfQogCitzdGF0aWMgaW50IHRsc19nZXRfZmlsZV9oYW5kbGUoVVJMQ29udGV4dCAqaCkKK3sKKyAgICBUTFNDb250ZXh0ICpjID0gaC0+cHJpdl9kYXRhOworICAgIHJldHVybiBmZnVybF9nZXRfZmlsZV9oYW5kbGUoYy0+dGxzX3NoYXJlZC50Y3ApOworfQorCiBzdGF0aWMgY29uc3QgQVZPcHRpb24gb3B0aW9uc1tdID0gewogICAgIFRMU19DT01NT05fT1BUSU9OUyhUTFNDb250ZXh0LCB0bHNfc2hhcmVkKSwKICAgICB7IE5VTEwgfQpAQCAtMzg3LDEyICs0MDksMTMgQEAKICAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKIH07CiAKLVVSTFByb3RvY29sIGZmX3Rsc19zZWN1cmV0cmFuc3BvcnRfcHJvdG9jb2wgPSB7Citjb25zdCBVUkxQcm90b2NvbCBmZl90bHNfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgID0gInRscyIsCiAgICAgLnVybF9vcGVuMiAgICAgID0gdGxzX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgID0gdGxzX3JlYWQsCiAgICAgLnVybF93cml0ZSAgICAgID0gdGxzX3dyaXRlLAogICAgIC51cmxfY2xvc2UgICAgICA9IHRsc19jbG9zZSwKKyAgICAudXJsX2dldF9maWxlX2hhbmRsZSA9IHRsc19nZXRfZmlsZV9oYW5kbGUsCiAgICAgLnByaXZfZGF0YV9zaXplID0gc2l6ZW9mKFRMU0NvbnRleHQpLAogICAgIC5mbGFncyAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCiAgICAgLnByaXZfZGF0YV9jbGFzcyA9ICZ0bHNfY2xhc3MsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC90bXYuYyBiL2xpYmF2Zm9ybWF0L3Rtdi5jCmluZGV4IGFkMTcyZjQuLjJlMzUxNzEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Rtdi5jCisrKyBiL2xpYmF2Zm9ybWF0L3Rtdi5jCkBAIC04MSw4ICs4MSw4IEBACiAgICAgaWYgKCEoYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwxNihwYik7Ci0gICAgaWYgKCFhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkgeworICAgIGFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19ybDE2KHBiKTsKKyAgICBpZiAoIWFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHNhbXBsZSByYXRlXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTExMSwyOSArMTExLDI5IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfUENNX1U4OworICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9QQ01fVTg7CiAgICAgaWYgKGZlYXR1cmVzICYgVE1WX1NURVJFTykgewotICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVscyAgICAgICA9IDI7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9TVEVSRU87CiAgICAgfSBlbHNlIHsKLSAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAxOwotICAgICAgICBhc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCA9IEFWX0NIX0xBWU9VVF9NT05POworICAgICAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IDE7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CiAgICAgfQotICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7Ci0gICAgYXN0LT5jb2RlYy0+Yml0X3JhdGUgICAgICAgICAgICAgID0gYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzIsIDEsIGFzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OworICAgIGFzdC0+Y29kZWNwYXItPmJpdF9yYXRlICAgICAgICAgICAgICA9IGFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDMyLCAxLCBhc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKLSAgICBmcHMubnVtID0gYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgKiBhc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICBmcHMubnVtID0gYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgKiBhc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICBmcHMuZGVuID0gdG12LT5hdWRpb19jaHVua19zaXplOwogICAgIGF2X3JlZHVjZSgmZnBzLm51bSwgJmZwcy5kZW4sIGZwcy5udW0sIGZwcy5kZW4sIDB4RkZGRkZGRkZMTCk7CiAKLSAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9UTVY7Ci0gICAgdnN0LT5jb2RlYy0+cGl4X2ZtdCAgICA9IEFWX1BJWF9GTVRfUEFMODsKLSAgICB2c3QtPmNvZGVjLT53aWR0aCAgICAgID0gY2hhcl9jb2xzICogODsKLSAgICB2c3QtPmNvZGVjLT5oZWlnaHQgICAgID0gY2hhcl9yb3dzICogODsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9UTVY7CisgICAgdnN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgICA9IEFWX1BJWF9GTVRfUEFMODsKKyAgICB2c3QtPmNvZGVjcGFyLT53aWR0aCAgICAgID0gY2hhcl9jb2xzICogODsKKyAgICB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0gY2hhcl9yb3dzICogODsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHZzdCwgMzIsIGZwcy5kZW4sIGZwcy5udW0pOwogCiAgICAgaWYgKGZlYXR1cmVzICYgVE1WX1BBRERJTkcpCkBAIC0xNDEsOCArMTQxLDggQEAKICAgICAgICAgICAgICgodG12LT52aWRlb19jaHVua19zaXplICsgdG12LT5hdWRpb19jaHVua19zaXplICsgNTExKSAmIH41MTEpIC0KICAgICAgICAgICAgICAodG12LT52aWRlb19jaHVua19zaXplICsgdG12LT5hdWRpb19jaHVua19zaXplKTsKIAotICAgIHZzdC0+Y29kZWMtPmJpdF9yYXRlID0gKCh0bXYtPnZpZGVvX2NodW5rX3NpemUgKyB0bXYtPnBhZGRpbmcpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHMubnVtICogOCkgLyBmcHMuZGVuOworICAgIHZzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gKCh0bXYtPnZpZGVvX2NodW5rX3NpemUgKyB0bXYtPnBhZGRpbmcpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHMubnVtICogOCkgLyBmcHMuZGVuOwogCiAgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC90dGEuYyBiL2xpYmF2Zm9ybWF0L3R0YS5jCmluZGV4IDc1NjY5MzkuLmFlOTBhODUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3R0YS5jCisrKyBiL2xpYmF2Zm9ybWF0L3R0YS5jCkBAIC0xOSwxNCArMTksMTUgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCi0jaW5jbHVkZSAibGliYXZjb2RlYy9nZXRfYml0cy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGljdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKwogI2luY2x1ZGUgImFwZXRhZy5oIgogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAiaWQzdjEuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2RpY3QuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgVFRBQ29udGV4dCB7CiAgICAgaW50IHRvdGFsZnJhbWVzLCBjdXJyZW50ZnJhbWU7CkBAIC0zNCwxMiArMzUsNiBAQAogICAgIGludCBsYXN0X2ZyYW1lX3NpemU7CiB9IFRUQUNvbnRleHQ7CiAKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHR0YV9jaGVja19jcmModW5zaWduZWQgbG9uZyBjaGVja3N1bSwgY29uc3QgdWludDhfdCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQotewotICAgIHJldHVybiBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRV9MRSksIGNoZWNrc3VtLCBidWYsIGxlbik7Ci19Ci0KIHN0YXRpYyBpbnQgdHRhX3Byb2JlKEFWUHJvYmVEYXRhICpwKQogewogICAgIGlmIChBVl9STDMyKCZwLT5idWZbMF0pID09IE1LVEFHKCdUJywgJ1QnLCAnQScsICcxJykgJiYKQEAgLTY0LDcgKzU5LDcgQEAKICAgICBzdGFydF9vZmZzZXQgPSBhdmlvX3RlbGwocy0+cGIpOwogICAgIGlmIChzdGFydF9vZmZzZXQgPCAwKQogICAgICAgICByZXR1cm4gc3RhcnRfb2Zmc2V0OwotICAgIGZmaW9faW5pdF9jaGVja3N1bShzLT5wYiwgdHRhX2NoZWNrX2NyYywgVUlOVDMyX01BWCk7CisgICAgZmZpb19pbml0X2NoZWNrc3VtKHMtPnBiLCBmZl9jcmNFREI4ODMyMF91cGRhdGUsIFVJTlQzMl9NQVgpOwogICAgIGlmIChhdmlvX3JsMzIocy0+cGIpICE9IEFWX1JMMzIoIlRUQTEiKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKQEAgLTExNCwxMyArMTA5LDEzIEBACiAgICAgICAgIHJldHVybiBmcmFtZXBvczsKICAgICBmcmFtZXBvcyArPSA0ICogYy0+dG90YWxmcmFtZXMgKyA0OwogCi0gICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIGF2aW9fdGVsbChzLT5wYikgLSBzdGFydF9vZmZzZXQpKQorICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCBhdmlvX3RlbGwocy0+cGIpIC0gc3RhcnRfb2Zmc2V0KSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAogICAgIGF2aW9fc2VlayhzLT5wYiwgc3RhcnRfb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgYXZpb19yZWFkKHMtPnBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgYXZpb19yZWFkKHMtPnBiLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CiAKLSAgICBmZmlvX2luaXRfY2hlY2tzdW0ocy0+cGIsIHR0YV9jaGVja19jcmMsIFVJTlQzMl9NQVgpOworICAgIGZmaW9faW5pdF9jaGVja3N1bShzLT5wYiwgZmZfY3JjRURCODgzMjBfdXBkYXRlLCBVSU5UMzJfTUFYKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+dG90YWxmcmFtZXM7IGkrKykgewogICAgICAgICB1aW50MzJfdCBzaXplID0gYXZpb19ybDMyKHMtPnBiKTsKICAgICAgICAgaW50IHI7CkBAIC0xMzUsMTMgKzEzMCwxMyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RUQTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gY2hhbm5lbHM7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZXJhdGU7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBicHM7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9UVEE7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBzYW1wbGVyYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYnBzOwogCi0gICAgaWYgKHMtPnBiLT5zZWVrYWJsZSkgeworICAgIGlmIChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CiAgICAgICAgIGZmX2FwZV9wYXJzZV90YWcocyk7CiAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgcG9zLCBTRUVLX1NFVCk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC90dGFlbmMuYyBiL2xpYmF2Zm9ybWF0L3R0YWVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZTExMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90dGFlbmMuYwpAQCAtMCwwICsxLDE3MyBAQAorLyoKKyAqIFRydWUgQXVkaW8gKFRUQSkgbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNiBKYW1lcyBBbG1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImFwZXRhZy5oIgorI2luY2x1ZGUgImF2Zm9ybWF0LmgiCisjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3R5cGVkZWYgc3RydWN0IFRUQU11eENvbnRleHQgeworICAgIEFWSU9Db250ZXh0ICpzZWVrX3RhYmxlOworICAgIEFWUGFja2V0TGlzdCAqcXVldWUsICpxdWV1ZV9lbmQ7CisgICAgdWludDMyX3QgbmJfc2FtcGxlczsKKyAgICBpbnQgZnJhbWVfc2l6ZTsKKyAgICBpbnQgbGFzdF9mcmFtZTsKK30gVFRBTXV4Q29udGV4dDsKKworc3RhdGljIGludCB0dGFfaW5pdChBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgVFRBTXV4Q29udGV4dCAqdHRhID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXI7CisKKyAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPbmx5IG9uZSBzdHJlYW0gaXMgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CisKKyAgICBpZiAocGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9UVEEpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIGNvZGVjXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgaWYgKHBhci0+ZXh0cmFkYXRhICYmIHBhci0+ZXh0cmFkYXRhX3NpemUgPCAyMikgeworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBUVEEgZXh0cmFkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgLyogUHJldmVudCBvdmVyZmxvdyAqLworICAgIGlmIChwYXItPnNhbXBsZV9yYXRlID4gMHg3RkZGRkZ1KSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJTYW1wbGUgcmF0ZSB0b28gbGFyZ2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICB0dGEtPmZyYW1lX3NpemUgPSBwYXItPnNhbXBsZV9yYXRlICogMjU2IC8gMjQ1OworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1swXSwgNjQsIDEsIHBhci0+c2FtcGxlX3JhdGUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHRhX3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgVFRBTXV4Q29udGV4dCAqdHRhID0gcy0+cHJpdl9kYXRhOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKChyZXQgPSBhdmlvX29wZW5fZHluX2J1ZigmdHRhLT5zZWVrX3RhYmxlKSkgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogSWdub3JlIG1vc3QgZXh0cmFkYXRhIGluZm9ybWF0aW9uIGlmIHByZXNlbnQuIEl0IGNhbiBiZSBpbm5hY3VyYXRlCisgICAgICAgaWYgZm9yIGV4YW1wbGUgcmVtdXhpbmcgZnJvbSBNYXRyb3NrYSAqLworICAgIGZmaW9faW5pdF9jaGVja3N1bShzLT5wYiwgZmZfY3JjRURCODgzMjBfdXBkYXRlLCBVSU5UMzJfTUFYKTsKKyAgICBmZmlvX2luaXRfY2hlY2tzdW0odHRhLT5zZWVrX3RhYmxlLCBmZl9jcmNFREI4ODMyMF91cGRhdGUsIFVJTlQzMl9NQVgpOworICAgIGF2aW9fd3JpdGUocy0+cGIsICJUVEExIiwgNCk7CisgICAgYXZpb193bDE2KHMtPnBiLCBwYXItPmV4dHJhZGF0YSA/IEFWX1JMMTYocGFyLT5leHRyYWRhdGEgKyA0KSA6IDEpOworICAgIGF2aW9fd2wxNihzLT5wYiwgcGFyLT5jaGFubmVscyk7CisgICAgYXZpb193bDE2KHMtPnBiLCBwYXItPmJpdHNfcGVyX3Jhd19zYW1wbGUpOworICAgIGF2aW9fd2wzMihzLT5wYiwgcGFyLT5zYW1wbGVfcmF0ZSk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0dGFfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBUVEFNdXhDb250ZXh0ICp0dGEgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IHJldDsKKworICAgIHJldCA9IGZmX3BhY2tldF9saXN0X3B1dCgmdHRhLT5xdWV1ZSwgJnR0YS0+cXVldWVfZW5kLCBwa3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX1BBQ0tFVExJU1RfRkxBR19SRUZfUEFDS0VUKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGF2aW9fd2wzMih0dGEtPnNlZWtfdGFibGUsIHBrdC0+c2l6ZSk7CisgICAgdHRhLT5uYl9zYW1wbGVzICs9IHBrdC0+ZHVyYXRpb247CisKKyAgICBpZiAodHRhLT5mcmFtZV9zaXplICE9IHBrdC0+ZHVyYXRpb24pIHsKKyAgICAgICAgaWYgKHR0YS0+bGFzdF9mcmFtZSkgeworICAgICAgICAgICAgLyogVHdvIGZyYW1lcyB3aXRoIGEgZGlmZmVyZW50IGR1cmF0aW9uIHRoYW4gdGhlIGRlZmF1bHQgZnJhbWUKKyAgICAgICAgICAgICAgIHNpemUgbWVhbnMgdGhlIFRUQSBzdHJlYW0gY29tZXMgZnJvbSBhIGZhdWx0eSBjb250YWluZXIsIGFuZAorICAgICAgICAgICAgICAgdGhlcmUncyBubyB3YXkgdGhlIGxhc3QgZnJhbWUgZHVyYXRpb24gd2lsbCBiZSBjb3JyZWN0LiAqLworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgZnJhbWUgZHVyYXRpb25zXG4iKTsKKworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgLyogRmlyc3QgZnJhbWUgd2l0aCBhIGRpZmZlcmVudCBkdXJhdGlvbiB0aGFuIHRoZSBkZWZhdWx0IGZyYW1lIHNpemUuCisgICAgICAgICAgIEFzc3VtZSBpdCdzIHRoZSBsYXN0IGZyYW1lIGluIHRoZSBzdHJlYW0gYW5kIGNvbnRpbnVlLiAqLworICAgICAgICB0dGEtPmxhc3RfZnJhbWUrKzsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHRhX3F1ZXVlX2ZsdXNoKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBUVEFNdXhDb250ZXh0ICp0dGEgPSBzLT5wcml2X2RhdGE7CisgICAgQVZQYWNrZXQgcGt0OworCisgICAgd2hpbGUgKHR0YS0+cXVldWUpIHsKKyAgICAgICAgZmZfcGFja2V0X2xpc3RfZ2V0KCZ0dGEtPnF1ZXVlLCAmdHRhLT5xdWV1ZV9lbmQsICZwa3QpOworICAgICAgICBhdmlvX3dyaXRlKHMtPnBiLCBwa3QuZGF0YSwgcGt0LnNpemUpOworICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CisgICAgfQorfQorCitzdGF0aWMgaW50IHR0YV93cml0ZV90cmFpbGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBUVEFNdXhDb250ZXh0ICp0dGEgPSBzLT5wcml2X2RhdGE7CisgICAgdWludDhfdCAqcHRyOworICAgIHVuc2lnbmVkIGludCBjcmM7CisgICAgaW50IHNpemU7CisKKyAgICBhdmlvX3dsMzIocy0+cGIsIHR0YS0+bmJfc2FtcGxlcyk7CisgICAgY3JjID0gZmZpb19nZXRfY2hlY2tzdW0ocy0+cGIpIF4gVUlOVDMyX01BWDsKKyAgICBhdmlvX3dsMzIocy0+cGIsIGNyYyk7CisKKyAgICAvKiBXcml0ZSBTZWVrIHRhYmxlICovCisgICAgY3JjID0gZmZpb19nZXRfY2hlY2tzdW0odHRhLT5zZWVrX3RhYmxlKSBeIFVJTlQzMl9NQVg7CisgICAgYXZpb193bDMyKHR0YS0+c2Vla190YWJsZSwgY3JjKTsKKyAgICBzaXplID0gYXZpb19jbG9zZV9keW5fYnVmKHR0YS0+c2Vla190YWJsZSwgJnB0cik7CisgICAgYXZpb193cml0ZShzLT5wYiwgcHRyLCBzaXplKTsKKyAgICBhdl9mcmVlKHB0cik7CisKKyAgICAvKiBXcml0ZSBhdWRpbyBkYXRhICovCisgICAgdHRhX3F1ZXVlX2ZsdXNoKHMpOworCisgICAgZmZfYXBlX3dyaXRlX3RhZyhzKTsKKyAgICBhdmlvX2ZsdXNoKHMtPnBiKTsKKworICAgIHJldHVybiAwOworfQorCitBVk91dHB1dEZvcm1hdCBmZl90dGFfbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICAgICAgID0gInR0YSIsCisgICAgLmxvbmdfbmFtZSAgICAgICAgID0gTlVMTF9JRl9DT05GSUdfU01BTEwoIlRUQSAoVHJ1ZSBBdWRpbykiKSwKKyAgICAubWltZV90eXBlICAgICAgICAgPSAiYXVkaW8veC10dGEiLAorICAgIC5leHRlbnNpb25zICAgICAgICA9ICJ0dGEiLAorICAgIC5wcml2X2RhdGFfc2l6ZSAgICA9IHNpemVvZihUVEFNdXhDb250ZXh0KSwKKyAgICAuYXVkaW9fY29kZWMgICAgICAgPSBBVl9DT0RFQ19JRF9UVEEsCisgICAgLnZpZGVvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfTk9ORSwKKyAgICAuaW5pdCAgICAgICAgICAgICAgPSB0dGFfaW5pdCwKKyAgICAud3JpdGVfaGVhZGVyICAgICAgPSB0dGFfd3JpdGVfaGVhZGVyLAorICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHR0YV93cml0ZV9wYWNrZXQsCisgICAgLndyaXRlX3RyYWlsZXIgICAgID0gdHRhX3dyaXRlX3RyYWlsZXIsCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdHR5LmMgYi9saWJhdmZvcm1hdC90dHkuYwppbmRleCA5MDIyZTkxLi44ZDQ4ZjJjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC90dHkuYworKysgYi9saWJhdmZvcm1hdC90dHkuYwpAQCAtODIsMTkgKzgyLDE5IEBACiAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgZ290byBmYWlsOwogICAgIH0KLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyAgID0gMDsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BTlNJOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnICAgPSAwOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX0FOU0k7CiAKLSAgICBzdC0+Y29kZWMtPndpZHRoICA9IHMtPndpZHRoOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gcy0+aGVpZ2h0OworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggID0gcy0+d2lkdGg7CisgICAgc3QtPmNvZGVjcGFyLT5oZWlnaHQgPSBzLT5oZWlnaHQ7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjAsIHMtPmZyYW1lcmF0ZS5kZW4sIHMtPmZyYW1lcmF0ZS5udW0pOwogICAgIHN0LT5hdmdfZnJhbWVfcmF0ZSA9IHMtPmZyYW1lcmF0ZTsKIAogICAgIC8qIHNpbXVsYXRlIHR0eSBkaXNwbGF5IHNwZWVkICovCiAgICAgcy0+Y2hhcnNfcGVyX2ZyYW1lID0gRkZNQVgoYXZfcTJkKHN0LT50aW1lX2Jhc2UpKnMtPmNoYXJzX3Blcl9mcmFtZSwgMSk7CiAKLSAgICBpZiAoYXZjdHgtPnBiLT5zZWVrYWJsZSkgeworICAgIGlmIChhdmN0eC0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgcy0+ZnNpemUgPSBhdmlvX3NpemUoYXZjdHgtPnBiKTsKICAgICAgICAgc3QtPmR1cmF0aW9uID0gKHMtPmZzaXplICsgcy0+Y2hhcnNfcGVyX2ZyYW1lIC0gMSkgLyBzLT5jaGFyc19wZXJfZnJhbWU7CiAKQEAgLTEzOCw3ICsxMzgsNyBAQAogc3RhdGljIGNvbnN0IEFWT3B0aW9uIG9wdGlvbnNbXSA9IHsKICAgICB7ICJjaGFyc19wZXJfZnJhbWUiLCAiIiwgb2Zmc2V0b2YoVHR5RGVtdXhDb250ZXh0LCBjaGFyc19wZXJfZnJhbWUpLCBBVl9PUFRfVFlQRV9JTlQsIHsuaTY0ID0gNjAwMH0sIDEsIElOVF9NQVgsIEFWX09QVF9GTEFHX0RFQ09ESU5HX1BBUkFNfSwKICAgICB7ICJ2aWRlb19zaXplIiwgIkEgc3RyaW5nIGRlc2NyaWJpbmcgZnJhbWUgc2l6ZSwgc3VjaCBhcyA2NDB4NDgwIG9yIGhkNzIwLiIsIE9GRlNFVCh3aWR0aCksIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIHsuc3RyID0gTlVMTH0sIDAsIDAsIERFQyB9LAotICAgIHsgImZyYW1lcmF0ZSIsICIiLCBPRkZTRVQoZnJhbWVyYXRlKSwgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgey5zdHIgPSAiMjUifSwgMCwgMCwgREVDIH0sCisgICAgeyAiZnJhbWVyYXRlIiwgIiIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCBJTlRfTUFYLCBERUMgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3R4ZC5jIGIvbGliYXZmb3JtYXQvdHhkLmMKaW5kZXggY2FjMzdkNS4uMThjOTY4MyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdHhkLmMKKysrIGIvbGliYXZmb3JtYXQvdHhkLmMKQEAgLTQ0LDggKzQ0LDggQEAKICAgICBzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RYRDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1RYRDsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgNSk7CiAgICAgc3QtPmF2Z19mcmFtZV9yYXRlID0gYXZfaW52X3Eoc3QtPnRpbWVfYmFzZSk7CiAgICAgLyogdGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3R5LmMgYi9saWJhdmZvcm1hdC90eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNDg2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC90eS5jCkBAIC0wLDAgKzEsNzg5IEBACisvKgorICogVGlWbyB0eSBzdHJlYW0gZGVtdXhlcgorICogQ29weXJpZ2h0IChjKSAyMDA1IFZMQyBhdXRob3JzIGFuZCBWaWRlb0xBTgorICogQ29weXJpZ2h0IChjKSAyMDA1IGJ5IE5lYWwgU3ltbXMgKHRpdm9AZnJlYWtpbnpvby5jb20pIC0gRmVicnVhcnkgMjAwNQorICogYmFzZWQgb24gY29kZSBieSBDaHJpc3RvcGhlciBXaW5nZXJ0IGZvciB0aXZvLW1wbGF5ZXIKKyAqIHRpdm8oYXQpd2luZ2VydC5vcmcsIEZlYnJ1YXJ5IDIwMDMKKyAqIENvcHlyaWdodCAoYykgMjAxNyBQYXVsIEIgTWFob2wKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAibXBlZy5oIgorCisjZGVmaW5lIFNFUklFUzFfUEVTX0xFTkdUSCAgMTEgICAgLyogbGVuZ3RoIG9mIGF1ZGlvIFBFUyBoZHIgb24gUzEgKi8KKyNkZWZpbmUgU0VSSUVTMl9QRVNfTEVOR1RIICAxNiAgICAvKiBsZW5ndGggb2YgYXVkaW8gUEVTIGhkciBvbiBTMiAqLworI2RlZmluZSBBQzNfUEVTX0xFTkdUSCAgICAgIDE0ICAgIC8qIGxlbmd0aCBvZiBhdWRpbyBQRVMgaGRyIGZvciBBQzMgKi8KKyNkZWZpbmUgVklERU9fUEVTX0xFTkdUSCAgICAxNiAgICAvKiBsZW5ndGggb2YgdmlkZW8gUEVTIGhlYWRlciAqLworI2RlZmluZSBEVElWT19QVFNfT0ZGU0VUICAgIDYgICAgIC8qIG9mZnMgaW50byBQRVMgZm9yIE1QRUcgUFRTIG9uIERUaXZvICovCisjZGVmaW5lIFNBX1BUU19PRkZTRVQgICAgICAgOSAgICAgLyogb2Zmc2V0IGludG8gUEVTIGZvciBNUEVHIFBUUyBvbiBTQSAqLworI2RlZmluZSBBQzNfUFRTX09GRlNFVCAgICAgIDkgICAgIC8qIG9mZnNldCBpbnRvIFBFUyBmb3IgQUMzIFBUUyBvbiBEVGl2byAqLworI2RlZmluZSBWSURFT19QVFNfT0ZGU0VUICAgIDkgICAgIC8qIG9mZnNldCBpbnRvIFBFUyBmb3IgdmlkZW8gUFRTIG9uIGFsbCAqLworI2RlZmluZSBBQzNfUEtUX0xFTkdUSCAgICAgIDE1MzYgIC8qIHNpemUgb2YgVGlWbyBBQzMgcGt0cyAody9vIFBFUyBoZHIpICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IHR5X1ZpZGVvUGFja2V0W10gICAgID0geyAweDAwLCAweDAwLCAweDAxLCAweGUwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCB0eV9NUEVHQXVkaW9QYWNrZXRbXSA9IHsgMHgwMCwgMHgwMCwgMHgwMSwgMHhjMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3QgdHlfQUMzQXVkaW9QYWNrZXRbXSAgPSB7IDB4MDAsIDB4MDAsIDB4MDEsIDB4YmQgfTsKKworI2RlZmluZSBUSVZPX1BFU19GSUxFSUQgICAweGY1NDY3YWJkCisjZGVmaW5lIENIVU5LX1NJWkUgICAgICAgICgxMjggKiAxMDI0KQorI2RlZmluZSBDSFVOS19QRUVLX0NPVU5UICAzICAgICAgLyogbnVtYmVyIG9mIGNodW5rcyB0byBwcm9iZSAqLworCit0eXBlZGVmIHN0cnVjdCBUeVJlY0hkciB7CisgICAgaW50NjRfdCAgIHJlY19zaXplOworICAgIHVpbnQ4X3QgICBleFsyXTsKKyAgICB1aW50OF90ICAgcmVjX3R5cGU7CisgICAgdWludDhfdCAgIHN1YnJlY190eXBlOworICAgIHVpbnQ2NF90ICB0eV9wdHM7ICAgICAgICAgICAgLyogVFkgUFRTIGluIHRoZSByZWNvcmQgaGVhZGVyICovCit9IFR5UmVjSGRyOworCit0eXBlZGVmIGVudW0geworICAgIFRJVk9fVFlQRV9VTktOT1dOLAorICAgIFRJVk9fVFlQRV9TQSwKKyAgICBUSVZPX1RZUEVfRFRJVk8KK30gVGlWb190eXBlOworCit0eXBlZGVmIGVudW0geworICAgIFRJVk9fU0VSSUVTX1VOS05PV04sCisgICAgVElWT19TRVJJRVMxLAorICAgIFRJVk9fU0VSSUVTMgorfSBUaVZvX3NlcmllczsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBUSVZPX0FVRElPX1VOS05PV04sCisgICAgVElWT19BVURJT19BQzMsCisgICAgVElWT19BVURJT19NUEVHCit9IFRpVm9fYXVkaW87CisKK3R5cGVkZWYgc3RydWN0IFR5U2VxVGFibGUgeworICAgIHVpbnQ2NF90ICAgIHRpbWVzdGFtcDsKKyAgICB1aW50OF90ICAgICBjaHVua19iaXRtYXNrWzhdOworfSBUeVNlcVRhYmxlOworCit0eXBlZGVmIHN0cnVjdCBUWURlbXV4Q29udGV4dCB7CisgICAgdW5zaWduZWQgICAgICAgIGN1cl9jaHVuazsKKyAgICB1bnNpZ25lZCAgICAgICAgY3VyX2NodW5rX3BvczsKKyAgICBpbnQ2NF90ICAgICAgICAgY3VyX3BvczsKKyAgICBUaVZvX3R5cGUgICAgICAgdGl2b190eXBlOyAgICAgICAgLyogVGlWbyB0eXBlIChTQSAvIERUaVZvKSAqLworICAgIFRpVm9fc2VyaWVzICAgICB0aXZvX3NlcmllczsgICAgICAvKiBTZXJpZXMxIG9yIFNlcmllczIgKi8KKyAgICBUaVZvX2F1ZGlvICAgICAgYXVkaW9fdHlwZTsgICAgICAgLyogQUMzIG9yIE1QRUcgKi8KKyAgICBpbnQgICAgICAgICAgICAgcGVzX2xlbmd0aDsgICAgICAgLyogTGVuZ3RoIG9mIEF1ZGlvIFBFUyBoZWFkZXIgKi8KKyAgICBpbnQgICAgICAgICAgICAgcHRzX29mZnNldDsgICAgICAgLyogb2Zmc2V0IGludG8gYXVkaW8gUEVTIG9mIFBUUyAqLworICAgIHVpbnQ4X3QgICAgICAgICBwZXNfYnVmZmVyWzIwXTsgICAvKiBob2xkcyBpbmNvbXBsZXRlIHBlcyBoZWFkZXJzICovCisgICAgaW50ICAgICAgICAgICAgIHBlc19idWZfY250OyAgICAgIC8qIGhvdyBtYW55IGJ5dGVzIGluIG91ciBidWZmZXIgKi8KKyAgICBzaXplX3QgICAgICAgICAgYWMzX3BrdF9zaXplOyAgICAgLyogbGVuZ3RoIG9mIGFjMyBwa3Qgd2UndmUgc2VlbiBzbyBmYXIgKi8KKyAgICB1aW50NjRfdCAgICAgICAgbGFzdF90eV9wdHM7ICAgICAgLyogbGFzdCBUWSB0aW1lc3RhbXAgd2UndmUgc2VlbiAqLworICAgIHVuc2lnbmVkICAgICAgICBzZXFfdGFibGVfc2l6ZTsgICAvKiBudW1iZXIgb2YgZW50cmllcyBpbiBTRVEgdGFibGUgKi8KKworICAgIGludDY0X3QgICAgICAgICBmaXJzdF9hdWRpb19wdHM7CisgICAgaW50NjRfdCAgICAgICAgIGxhc3RfYXVkaW9fcHRzOworICAgIGludDY0X3QgICAgICAgICBsYXN0X3ZpZGVvX3B0czsKKworICAgIFR5UmVjSGRyICAgICAgICpyZWNfaGRyczsgICAgICAgICAvKiByZWNvcmQgaGVhZGVycyBhcnJheSAqLworICAgIGludCAgICAgICAgICAgICBjdXJfcmVjOyAgICAgICAgICAvKiBjdXJyZW50IHJlY29yZCBpbiB0aGlzIGNodW5rICovCisgICAgaW50ICAgICAgICAgICAgIG51bV9yZWNzOyAgICAgICAgIC8qIG51bWJlciBvZiByZWNzIGluIHRoaXMgY2h1bmsgKi8KKyAgICBpbnQgICAgICAgICAgICAgc2VxX3JlYzsgICAgICAgICAgLyogcmVjb3JkIG51bWJlciB3aGVyZSBzZXEgc3RhcnQgaXMgKi8KKyAgICBUeVNlcVRhYmxlICAgICAqc2VxX3RhYmxlOyAgICAgICAgLyogdGFibGUgb2YgU0VRIGVudHJpZXMgZnJvbSBtc3RyIGNoayAqLworICAgIGludCAgICAgICAgICAgICBmaXJzdF9jaHVuazsKKworICAgIHVpbnQ4X3QgICAgICAgICBjaHVua1tDSFVOS19TSVpFXTsKK30gVFlEZW11eENvbnRleHQ7CisKK3N0YXRpYyBpbnQgdHlfcHJvYmUoQVZQcm9iZURhdGEgKnApCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpICsgMTIgPCBwLT5idWZfc2l6ZTsgaSArPSBDSFVOS19TSVpFKSB7CisgICAgICAgIGlmIChBVl9SQjMyKHAtPmJ1ZiArIGkpID09IFRJVk9fUEVTX0ZJTEVJRCAmJgorICAgICAgICAgICAgQVZfUkIzMihwLT5idWYgKyBpICsgNCkgPT0gMHgwMiAmJgorICAgICAgICAgICAgQVZfUkIzMihwLT5idWYgKyBpICsgOCkgPT0gQ0hVTktfU0laRSkgeworICAgICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBUeVJlY0hkciAqcGFyc2VfY2h1bmtfaGVhZGVycyhjb25zdCB1aW50OF90ICpidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9yZWNzKQoreworICAgIFR5UmVjSGRyICpoZHJzLCAqcmVjX2hkcjsKKyAgICBpbnQgaTsKKworICAgIGhkcnMgPSBhdl9jYWxsb2MobnVtX3JlY3MsIHNpemVvZihUeVJlY0hkcikpOworICAgIGlmICghaGRycykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3JlY3M7IGkrKykgeworICAgICAgICBjb25zdCB1aW50OF90ICpyZWNvcmRfaGVhZGVyID0gYnVmICsgKGkgKiAxNik7CisKKyAgICAgICAgcmVjX2hkciA9ICZoZHJzW2ldOyAgICAgLyogZm9yIGJyZXZpdHkgKi8KKyAgICAgICAgcmVjX2hkci0+cmVjX3R5cGUgPSByZWNvcmRfaGVhZGVyWzNdOworICAgICAgICByZWNfaGRyLT5zdWJyZWNfdHlwZSA9IHJlY29yZF9oZWFkZXJbMl0gJiAweDBmOworICAgICAgICBpZiAoKHJlY29yZF9oZWFkZXJbMF0gJiAweDgwKSA9PSAweDgwKSB7CisgICAgICAgICAgICB1aW50OF90IGIxLCBiMjsKKworICAgICAgICAgICAgLyogbWFya2VyIGJpdCAyIHNldCwgc28gcmVhZCBleHRlbmRlZCBkYXRhICovCisgICAgICAgICAgICBiMSA9ICgoKHJlY29yZF9oZWFkZXJbMF0gJiAweDBmKSA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAoKHJlY29yZF9oZWFkZXJbMV0gJiAweGYwKSA+PiA0KSk7CisgICAgICAgICAgICBiMiA9ICgoKHJlY29yZF9oZWFkZXJbMV0gJiAweDBmKSA8PCA0KSB8CisgICAgICAgICAgICAgICAgICAoKHJlY29yZF9oZWFkZXJbMl0gJiAweGYwKSA+PiA0KSk7CisKKyAgICAgICAgICAgIHJlY19oZHItPmV4WzBdID0gYjE7CisgICAgICAgICAgICByZWNfaGRyLT5leFsxXSA9IGIyOworICAgICAgICAgICAgcmVjX2hkci0+cmVjX3NpemUgPSAwOworICAgICAgICAgICAgcmVjX2hkci0+dHlfcHRzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlY19oZHItPnJlY19zaXplID0gKHJlY29yZF9oZWFkZXJbMF0gPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRfaGVhZGVyWzFdKSA8PCA0IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlY29yZF9oZWFkZXJbMl0gPj4gNCk7CisgICAgICAgICAgICByZWNfaGRyLT50eV9wdHMgPSBBVl9SQjY0KCZyZWNvcmRfaGVhZGVyWzhdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gaGRyczsKK30KKworc3RhdGljIGludCBmaW5kX2VzX2hlYWRlcihjb25zdCB1aW50OF90ICpoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgaW50IHNlYXJjaF9sZW4pCit7CisgICAgaW50IGNvdW50OworCisgICAgZm9yIChjb3VudCA9IDA7IGNvdW50IDwgc2VhcmNoX2xlbjsgY291bnQrKykgeworICAgICAgICBpZiAoIW1lbWNtcCgmYnVmZmVyW2NvdW50XSwgaGVhZGVyLCA0KSkKKyAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGFuYWx5emVfY2h1bmsoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCB1aW50OF90ICpjaHVuaykKK3sKKyAgICBUWURlbXV4Q29udGV4dCAqdHkgPSBzLT5wcml2X2RhdGE7CisgICAgaW50IG51bV9yZWNzLCBpOworICAgIFR5UmVjSGRyICpoZHJzOworICAgIGludCBudW1fNmUwLCBudW1fYmUwLCBudW1fOWMwLCBudW1fM2MwOworCisgICAgLyogc2tpcCBpZiBpdCdzIGEgUGFydCBoZWFkZXIgKi8KKyAgICBpZiAoQVZfUkIzMigmY2h1bmtbMF0pID09IFRJVk9fUEVTX0ZJTEVJRCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvKiBudW1iZXIgb2YgcmVjb3JkcyBpbiBjaHVuayAod2UgaWdub3JlIGhpZ2ggb3JkZXIgYnl0ZTsKKyAgICAgKiByYXJlbHkgYXJlIHRoZXJlID4gMjU2IGNodW5rcyAmIHdlIGRvbid0IG5lZWQgdGhhdCBtYW55IGFueXdheSkgKi8KKyAgICBudW1fcmVjcyA9IGNodW5rWzBdOworICAgIGlmIChudW1fcmVjcyA8IDUpIHsKKyAgICAgICAgLyogdHJ5IGFnYWluIHdpdGggdGhlIG5leHQgY2h1bmsuICBTb21ldGltZXMgdGhlcmUgYXJlIGRlYWQgb25lcyAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBjaHVuayArPSA0OyAgICAgICAvKiBza2lwIHBhc3QgcmVjIGNvdW50ICYgU0VRIGJ5dGVzICovCisgICAgZmZfZGxvZyhzLCAicHJvYmU6IGNodW5rIGhhcyAlZCByZWNzXG4iLCBudW1fcmVjcyk7CisgICAgaGRycyA9IHBhcnNlX2NodW5rX2hlYWRlcnMoY2h1bmssIG51bV9yZWNzKTsKKyAgICBpZiAoIWhkcnMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvKiBzY2FuIGhlYWRlcnMuCisgICAgICogMS4gY2hlY2sgdmlkZW8gcGFja2V0cy4gIFByZXNlbmNlIG9mIDB4NmUwIG1lYW5zIFMxLgorICAgICAqICAgIE5vIDZlMCBidXQgaGF2ZSBiZTAgbWVhbnMgUzIuCisgICAgICogMi4gcHJvYmUgZm9yIGF1ZGlvIDB4OWMwIHZzIDB4M2MwIChBQzMgdnMgTXBlZykKKyAgICAgKiAgICBJZiBBQy0zLCB0aGVuIHdlIGhhdmUgRFRpdm8uCisgICAgICogICAgSWYgTVBFRywgc2VhcmNoIGZvciBQVFMgb2Zmc2V0LiAgVGhpcyB3aWxsIGRldGVybWluZSBTQSB2cy4gRFRpdm8uCisgICAgICovCisgICAgbnVtXzZlMCA9IG51bV9iZTAgPSBudW1fOWMwID0gbnVtXzNjMCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9yZWNzOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChoZHJzW2ldLnN1YnJlY190eXBlIDw8IDggfCBoZHJzW2ldLnJlY190eXBlKSB7CisgICAgICAgIGNhc2UgMHg2ZTA6CisgICAgICAgICAgICBudW1fNmUwKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweGJlMDoKKyAgICAgICAgICAgIG51bV9iZTArKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4M2MwOgorICAgICAgICAgICAgbnVtXzNjMCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg5YzA6CisgICAgICAgICAgICBudW1fOWMwKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBmZl9kbG9nKHMsICJwcm9iZTogY2h1bmsgaGFzICVkIDB4NmUwIHJlY3MsICVkIDB4YmUwIHJlY3MuXG4iLAorICAgICAgICAgICAgbnVtXzZlMCwgbnVtX2JlMCk7CisKKyAgICAvKiBzZXQgdXAgb3VyIHZhcmlhYmxlcyAqLworICAgIGlmIChudW1fNmUwID4gMCkgeworICAgICAgICBmZl9kbG9nKHMsICJkZXRlY3RlZCBTZXJpZXMgMSBUaXZvXG4iKTsKKyAgICAgICAgdHktPnRpdm9fc2VyaWVzID0gVElWT19TRVJJRVMxOworICAgICAgICB0eS0+cGVzX2xlbmd0aCA9IFNFUklFUzFfUEVTX0xFTkdUSDsKKyAgICB9IGVsc2UgaWYgKG51bV9iZTAgPiAwKSB7CisgICAgICAgIGZmX2Rsb2cocywgImRldGVjdGVkIFNlcmllcyAyIFRpdm9cbiIpOworICAgICAgICB0eS0+dGl2b19zZXJpZXMgPSBUSVZPX1NFUklFUzI7CisgICAgICAgIHR5LT5wZXNfbGVuZ3RoID0gU0VSSUVTMl9QRVNfTEVOR1RIOworICAgIH0KKyAgICBpZiAobnVtXzljMCA+IDApIHsKKyAgICAgICAgZmZfZGxvZyhzLCAiZGV0ZWN0ZWQgQUMtMyBBdWRpbyAoRFRpdm8pXG4iKTsKKyAgICAgICAgdHktPmF1ZGlvX3R5cGUgPSBUSVZPX0FVRElPX0FDMzsKKyAgICAgICAgdHktPnRpdm9fdHlwZSA9IFRJVk9fVFlQRV9EVElWTzsKKyAgICAgICAgdHktPnB0c19vZmZzZXQgPSBBQzNfUFRTX09GRlNFVDsKKyAgICAgICAgdHktPnBlc19sZW5ndGggPSBBQzNfUEVTX0xFTkdUSDsKKyAgICB9IGVsc2UgaWYgKG51bV8zYzAgPiAwKSB7CisgICAgICAgIHR5LT5hdWRpb190eXBlID0gVElWT19BVURJT19NUEVHOworICAgICAgICBmZl9kbG9nKHMsICJkZXRlY3RlZCBNUEVHIEF1ZGlvXG4iKTsKKyAgICB9CisKKyAgICAvKiBpZiB0aXZvX3R5cGUgc3RpbGwgdW5rbm93biwgd2UgY2FuIGNoZWNrIFBUUyBsb2NhdGlvbgorICAgICAqIGluIE1QRUcgcGFja2V0cyB0byBkZXRlcm1pbmUgdGl2b190eXBlICovCisgICAgaWYgKHR5LT50aXZvX3R5cGUgPT0gVElWT19UWVBFX1VOS05PV04pIHsKKyAgICAgICAgdWludDMyX3QgZGF0YV9vZmZzZXQgPSAxNiAqIG51bV9yZWNzOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fcmVjczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZGF0YV9vZmZzZXQgKyBoZHJzW2ldLnJlY19zaXplID4gQ0hVTktfU0laRSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaWYgKChoZHJzW2ldLnN1YnJlY190eXBlIDw8IDB4MDggfCBoZHJzW2ldLnJlY190eXBlKSA9PSAweDNjMCAmJiBoZHJzW2ldLnJlY19zaXplID4gMTUpIHsKKyAgICAgICAgICAgICAgICAvKiBmaXJzdCBtYWtlIHN1cmUgd2UncmUgYWxpZ25lZCAqLworICAgICAgICAgICAgICAgIGludCBwZXNfb2Zmc2V0ID0gZmluZF9lc19oZWFkZXIodHlfTVBFR0F1ZGlvUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgJmNodW5rW2RhdGFfb2Zmc2V0XSwgNSk7CisgICAgICAgICAgICAgICAgaWYgKHBlc19vZmZzZXQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvKiBwZXMgZm91bmQuIG9uIFNBLCBQRVMgaGFzIGhkciBkYXRhIGF0IG9mZnNldCA2LCBub3QgUFRTLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAoKGNodW5rW2RhdGFfb2Zmc2V0ICsgNiArIHBlc19vZmZzZXRdICYgMHg4MCkgPT0gMHg4MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogUzFTQSBvciBTMihhbnkpIE1wZWcgQXVkaW8gKFBFUyBoZHIsIG5vdCBhIFBUUyBzdGFydCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eS0+dGl2b19zZXJpZXMgPT0gVElWT19TRVJJRVMxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2Rsb2cocywgImRldGVjdGVkIFN0YW5kLUFsb25lIFRpdm9cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdHktPnRpdm9fdHlwZSA9IFRJVk9fVFlQRV9TQTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5LT5wdHNfb2Zmc2V0ID0gU0FfUFRTX09GRlNFVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eS0+dGl2b19zZXJpZXMgPT0gVElWT19TRVJJRVMxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmX2Rsb2cocywgImRldGVjdGVkIERpcmVjVFYgVGl2b1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB0eS0+dGl2b190eXBlID0gVElWT19UWVBFX0RUSVZPOworICAgICAgICAgICAgICAgICAgICAgICAgdHktPnB0c19vZmZzZXQgPSBEVElWT19QVFNfT0ZGU0VUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IGhkcnNbaV0ucmVjX3NpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZShoZHJzKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR5X3JlYWRfaGVhZGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBUWURlbXV4Q29udGV4dCAqdHkgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0LCAqYXN0OworICAgIGludCBpLCByZXQgPSAwOworCisgICAgdHktPmZpcnN0X2F1ZGlvX3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIHR5LT5sYXN0X2F1ZGlvX3B0cyA9IEFWX05PUFRTX1ZBTFVFOworICAgIHR5LT5sYXN0X3ZpZGVvX3B0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgZm9yIChpID0gMDsgaSA8IENIVU5LX1BFRUtfQ09VTlQ7IGkrKykgeworICAgICAgICBhdmlvX3JlYWQocGIsIHR5LT5jaHVuaywgQ0hVTktfU0laRSk7CisKKyAgICAgICAgcmV0ID0gYW5hbHl6ZV9jaHVuayhzLCB0eS0+Y2h1bmspOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIGlmICh0eS0+dGl2b19zZXJpZXMgIT0gVElWT19TRVJJRVNfVU5LTk9XTiAmJgorICAgICAgICAgICAgdHktPmF1ZGlvX3R5cGUgICE9IFRJVk9fQVVESU9fVU5LTk9XTiAmJgorICAgICAgICAgICAgdHktPnRpdm9fdHlwZSAgICE9IFRJVk9fVFlQRV9VTktOT1dOKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKHR5LT50aXZvX3NlcmllcyA9PSBUSVZPX1NFUklFU19VTktOT1dOIHx8CisgICAgICAgIHR5LT5hdWRpb190eXBlID09IFRJVk9fQVVESU9fVU5LTk9XTiB8fAorICAgICAgICB0eS0+dGl2b190eXBlID09IFRJVk9fVFlQRV9VTktOT1dOKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworCisgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgIGlmICghc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01QRUcyVklERU87CisgICAgc3QtPm5lZWRfcGFyc2luZyAgICAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDkwMDAwKTsKKworICAgIGFzdCA9IGF2Zm9ybWF0X25ld19zdHJlYW0ocywgTlVMTCk7CisgICAgaWYgKCFhc3QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKworICAgIGlmICh0eS0+YXVkaW9fdHlwZSA9PSBUSVZPX0FVRElPX01QRUcpIHsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDI7CisgICAgICAgIGFzdC0+bmVlZF9wYXJzaW5nICAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9BQzM7CisgICAgfQorICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgOTAwMDApOworCisgICAgdHktPmZpcnN0X2NodW5rID0gMTsKKworICAgIGF2aW9fc2VlayhwYiwgMCwgU0VFS19TRVQpOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIHBhcnNlIGEgbWFzdGVyIGNodW5rLCBmaWxsaW5nIHRoZSBTRVEgdGFibGUgYW5kIG90aGVyIHZhcmlhYmxlcy4KKyAqIFdlIGFzc3VtZSB0aGUgc3RyZWFtIGlzIGN1cnJlbnRseSBwb2ludGluZyB0byBpdC4KKyAqLworc3RhdGljIHZvaWQgcGFyc2VfbWFzdGVyKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBUWURlbXV4Q29udGV4dCAqdHkgPSBzLT5wcml2X2RhdGE7CisgICAgdW5zaWduZWQgbWFwX3NpemU7ICAvKiBzaXplIG9mIGJpdG1hc2ssIGluIGJ5dGVzICovCisgICAgdW5zaWduZWQgaSwgajsKKworICAgIC8qIE5vdGUgdGhhdCB0aGUgZW50cmllcyBpbiB0aGUgU0VRIHRhYmxlIGluIHRoZSBzdHJlYW0gbWF5IGhhdmUKKyAgICAgICBkaWZmZXJlbnQgc2l6ZXMgZGVwZW5kaW5nIG9uIHRoZSBiaXRzIHBlciBlbnRyeS4gIFdlIHN0b3JlIHRoZW0KKyAgICAgICBhbGwgaW4gdGhlIHNhbWUgc2l6ZSBzdHJ1Y3R1cmUsIHNvIHdlIGhhdmUgdG8gcGFyc2UgdGhlbSBvdXQgb25lCisgICAgICAgYnkgb25lLiAgSWYgd2UgaGFkIGEgZHluYW1pYyBzdHJ1Y3R1cmUsIHdlIGNvdWxkIHNpbXBseSByZWFkIHRoZQorICAgICAgIGVudGlyZSB0YWJsZSBkaXJlY3RseSBmcm9tIHRoZSBzdHJlYW0gaW50byBtZW1vcnkgaW4gcGxhY2UuICovCisKKyAgICAvKiBjbGVhciB0aGUgU0VRIHRhYmxlICovCisgICAgYXZfZnJlZXAoJnR5LT5zZXFfdGFibGUpOworCisgICAgLyogcGFyc2UgaGVhZGVyIGluZm8gKi8KKworICAgIG1hcF9zaXplID0gQVZfUkIzMih0eS0+Y2h1bmsgKyAyMCk7ICAvKiBzaXplIG9mIGJpdG1hc2ssIGluIGJ5dGVzICovCisgICAgaSA9IEFWX1JCMzIodHktPmNodW5rICsgMjgpOyAgIC8qIHNpemUgb2YgU0VRIHRhYmxlLCBpbiBieXRlcyAqLworCisgICAgdHktPnNlcV90YWJsZV9zaXplID0gaSAvICg4TEwgKyBtYXBfc2l6ZSk7CisKKyAgICBpZiAodHktPnNlcV90YWJsZV9zaXplID09IDApIHsKKyAgICAgICAgdHktPnNlcV90YWJsZSA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBwYXJzZSBhbGwgdGhlIGVudHJpZXMgKi8KKyAgICB0eS0+c2VxX3RhYmxlID0gYXZfY2FsbG9jKHR5LT5zZXFfdGFibGVfc2l6ZSwgc2l6ZW9mKFR5U2VxVGFibGUpKTsKKyAgICBpZiAodHktPnNlcV90YWJsZSA9PSBOVUxMKSB7CisgICAgICAgIHR5LT5zZXFfdGFibGVfc2l6ZSA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eS0+Y3VyX2NodW5rX3BvcyA9IDMyOworICAgIGZvciAoaiA9IDA7IGogPCB0eS0+c2VxX3RhYmxlX3NpemU7IGorKykgeworICAgICAgICBpZiAodHktPmN1cl9jaHVua19wb3MgPj0gQ0hVTktfU0laRSAtIDgpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHR5LT5zZXFfdGFibGVbal0udGltZXN0YW1wID0gQVZfUkI2NCh0eS0+Y2h1bmsgKyB0eS0+Y3VyX2NodW5rX3Bvcyk7CisgICAgICAgIHR5LT5jdXJfY2h1bmtfcG9zICs9IDg7CisgICAgICAgIGlmIChtYXBfc2l6ZSA+IDgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBTRVEgYml0bWFwIHNpemUgaW4gbWFzdGVyIGNodW5rLlxuIik7CisgICAgICAgICAgICB0eS0+Y3VyX2NodW5rX3BvcyArPSBtYXBfc2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweSh0eS0+c2VxX3RhYmxlW2pdLmNodW5rX2JpdG1hc2ssIHR5LT5jaHVuayArIHR5LT5jdXJfY2h1bmtfcG9zLCBtYXBfc2l6ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2NodW5rKEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICBUWURlbXV4Q29udGV4dCAqdHkgPSBzLT5wcml2X2RhdGE7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgaW50IHJlYWRfc2l6ZSwgbnVtX3JlY3M7CisKKyAgICBmZl9kbG9nKHMsICJwYXJzaW5nIHR5IGNodW5rICMlZFxuIiwgdHktPmN1cl9jaHVuayk7CisKKyAgICAvKiBpZiB3ZSBoYXZlIGxlZnQtb3ZlciBmaWxsZXIgc3BhY2UgZnJvbSB0aGUgbGFzdCBjaHVuaywgZ2V0IHRoYXQgKi8KKyAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworCisgICAgLyogcmVhZCB0aGUgVFkgcGFja2V0IGhlYWRlciAqLworICAgIHJlYWRfc2l6ZSA9IGF2aW9fcmVhZChwYiwgdHktPmNodW5rLCBDSFVOS19TSVpFKTsKKyAgICB0eS0+Y3VyX2NodW5rKys7CisKKyAgICBpZiAoKHJlYWRfc2l6ZSA8IDQpIHx8IChBVl9SQjMyKHR5LT5jaHVuaykgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOworICAgIH0KKworICAgIC8qIGNoZWNrIGlmIGl0J3MgYSBQQVJUIEhlYWRlciAqLworICAgIGlmIChBVl9SQjMyKHR5LT5jaHVuaykgPT0gVElWT19QRVNfRklMRUlEKSB7CisgICAgICAgIHBhcnNlX21hc3RlcihzKTsgLyogcGFyc2UgbWFzdGVyIGNodW5rICovCisgICAgICAgIHJldHVybiBnZXRfY2h1bmsocyk7CisgICAgfQorCisgICAgLyogbnVtYmVyIG9mIHJlY29yZHMgaW4gY2h1bmsgKDgtIG9yIDE2LWJpdCBudW1iZXIpICovCisgICAgaWYgKHR5LT5jaHVua1szXSAmIDB4ODApIHsKKyAgICAgICAgLyogMTYgYml0IHJlYyBjbnQgKi8KKyAgICAgICAgdHktPm51bV9yZWNzID0gbnVtX3JlY3MgPSAodHktPmNodW5rWzFdIDw8IDgpICsgdHktPmNodW5rWzBdOworICAgICAgICB0eS0+c2VxX3JlYyA9ICh0eS0+Y2h1bmtbM10gPDwgOCkgKyB0eS0+Y2h1bmtbMl07CisgICAgICAgIGlmICh0eS0+c2VxX3JlYyAhPSAweGZmZmYpIHsKKyAgICAgICAgICAgIHR5LT5zZXFfcmVjICY9IH4weDgwMDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvKiA4IGJpdCByZWNsZW4gLSBUaVZvIDEuMyBmb3JtYXQgKi8KKyAgICAgICAgdHktPm51bV9yZWNzID0gbnVtX3JlY3MgPSB0eS0+Y2h1bmtbMF07CisgICAgICAgIHR5LT5zZXFfcmVjID0gdHktPmNodW5rWzFdOworICAgIH0KKyAgICB0eS0+Y3VyX3JlYyA9IDA7CisgICAgdHktPmZpcnN0X2NodW5rID0gMDsKKworICAgIGZmX2Rsb2cocywgImNodW5rIGhhcyAlZCByZWNvcmRzXG4iLCBudW1fcmVjcyk7CisgICAgdHktPmN1cl9jaHVua19wb3MgPSA0OworCisgICAgYXZfZnJlZXAoJnR5LT5yZWNfaGRycyk7CisKKyAgICBpZiAobnVtX3JlY3MgKiAxNiA+PSBDSFVOS19TSVpFIC0gNCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICB0eS0+cmVjX2hkcnMgPSBwYXJzZV9jaHVua19oZWFkZXJzKHR5LT5jaHVuayArIDQsIG51bV9yZWNzKTsKKyAgICBpZiAoIXR5LT5yZWNfaGRycykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB0eS0+Y3VyX2NodW5rX3BvcyArPSAxNiAqIG51bV9yZWNzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVtdXhfdmlkZW8oQVZGb3JtYXRDb250ZXh0ICpzLCBUeVJlY0hkciAqcmVjX2hkciwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBUWURlbXV4Q29udGV4dCAqdHkgPSBzLT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50IHN1YnJlY190eXBlID0gcmVjX2hkci0+c3VicmVjX3R5cGU7CisgICAgY29uc3QgaW50NjRfdCByZWNfc2l6ZSA9IHJlY19oZHItPnJlY19zaXplOworICAgIGludCBlc19vZmZzZXQxOworICAgIGludCBnb3RfcGFja2V0ID0gMDsKKworICAgIGlmIChzdWJyZWNfdHlwZSAhPSAweDAyICYmIHN1YnJlY190eXBlICE9IDB4MGMgJiYKKyAgICAgICAgc3VicmVjX3R5cGUgIT0gMHgwOCAmJiByZWNfc2l6ZSA+IDQpIHsKKyAgICAgICAgLyogZ2V0IHRoZSBQVFMgZnJvbSB0aGlzIHBhY2tldCBpZiBpdCBoYXMgb25lLgorICAgICAgICAgKiBvbiBTMSwgb25seSAweDA2IGhhcyBQRVMuICBPbiBTMiwgaG93ZXZlciwgbW9zdCBhbGwgZG8uCisgICAgICAgICAqIERvIE5PVCBQYXNzIHRoZSBQRVMgSGVhZGVyIHRvIHRoZSBNUEVHMiBjb2RlYyAqLworICAgICAgICBlc19vZmZzZXQxID0gZmluZF9lc19oZWFkZXIodHlfVmlkZW9QYWNrZXQsIHR5LT5jaHVuayArIHR5LT5jdXJfY2h1bmtfcG9zLCA1KTsKKyAgICAgICAgaWYgKGVzX29mZnNldDEgIT0gLTEpIHsKKyAgICAgICAgICAgIHR5LT5sYXN0X3ZpZGVvX3B0cyA9IGZmX3BhcnNlX3Blc19wdHMoCisgICAgICAgICAgICAgICAgICAgIHR5LT5jaHVuayArIHR5LT5jdXJfY2h1bmtfcG9zICsgZXNfb2Zmc2V0MSArIFZJREVPX1BUU19PRkZTRVQpOworICAgICAgICAgICAgaWYgKHN1YnJlY190eXBlICE9IDB4MDYpIHsKKyAgICAgICAgICAgICAgICAvKiBpZiB3ZSBmb3VuZCBhIFBFUywgYW5kIGl0J3Mgbm90IHR5cGUgNiwgdGhlbiB3ZSdyZSBTMiAqLworICAgICAgICAgICAgICAgIC8qIFRoZSBwYWNrZXQgd2lsbCBoYXZlIHZpZGVvIGRhdGEgKCYgb3RoZXIgaGVhZGVycykgc28gd2UKKyAgICAgICAgICAgICAgICAgKiBjaG9wIG91dCB0aGUgUEVTIGhlYWRlciBhbmQgc2VuZCB0aGUgcmVzdCAqLworICAgICAgICAgICAgICAgIGlmIChyZWNfc2l6ZSA+PSBWSURFT19QRVNfTEVOR1RIICsgZXNfb2Zmc2V0MSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHJlY19oZHItPnJlY19zaXplIC0gVklERU9fUEVTX0xFTkdUSCAtIGVzX29mZnNldDE7CisKKyAgICAgICAgICAgICAgICAgICAgdHktPmN1cl9jaHVua19wb3MgKz0gVklERU9fUEVTX0xFTkdUSCArIGVzX29mZnNldDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgc2l6ZSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgdHktPmNodW5rICsgdHktPmN1cl9jaHVua19wb3MsIHNpemUpOworICAgICAgICAgICAgICAgICAgICB0eS0+Y3VyX2NodW5rX3BvcyArPSBzaXplOworICAgICAgICAgICAgICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGdvdF9wYWNrZXQgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZmX2Rsb2cocywgInZpZGVvIHJlYyB0eXBlIDB4JTAyeCBoYXMgc2hvcnQgUEVTIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAoJSJQUklkNjQiIGJ5dGVzKVxuIiwgc3VicmVjX3R5cGUsIHJlY19zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgLyogbnVrZSB0aGlzIGJsb2NrOyBpdCdzIHRvbyBzaG9ydCwgYnV0IGhhcyBQRVMgbWFya2VyICovCisgICAgICAgICAgICAgICAgICAgIHR5LT5jdXJfY2h1bmtfcG9zICs9IHJlY19zaXplOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3VicmVjX3R5cGUgPT0gMHgwNikgeworICAgICAgICAvKiB0eXBlIDYgKFMxIERUaXZvKSBoYXMgbm8gZGF0YSwgc28gd2UncmUgZG9uZSAqLworICAgICAgICB0eS0+Y3VyX2NodW5rX3BvcyArPSByZWNfc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCFnb3RfcGFja2V0KSB7CisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgcmVjX3NpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHR5LT5jaHVuayArIHR5LT5jdXJfY2h1bmtfcG9zLCByZWNfc2l6ZSk7CisgICAgICAgIHR5LT5jdXJfY2h1bmtfcG9zICs9IHJlY19zaXplOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CisgICAgICAgIGdvdF9wYWNrZXQgPSAxOworICAgIH0KKworICAgIC8qIGlmIGl0J3Mgbm90IGEgY29udGludWUgYmxrLCB0aGVuIHNldCBQVFMgKi8KKyAgICBpZiAoc3VicmVjX3R5cGUgIT0gMHgwMikgeworICAgICAgICBpZiAoc3VicmVjX3R5cGUgPT0gMHgwYyAmJiBwa3QtPnNpemUgPj0gNikKKyAgICAgICAgICAgIHBrdC0+ZGF0YVs1XSB8PSAweDA4OworICAgICAgICBpZiAoc3VicmVjX3R5cGUgPT0gMHgwNykgeworICAgICAgICAgICAgdHktPmxhc3RfdHlfcHRzID0gcmVjX2hkci0+dHlfcHRzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogeWVzIEkga25vdyB0aGlzIGlzIGEgY2hlYXAgaGFjay4gIEl0J3MgdGhlIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgdXNlZCBmb3IgZGlzcGxheSBhbmQgc2tpcHBpbmcgZndkL2JhY2ssIHNvIGl0CisgICAgICAgICAgICAgICBkb2Vzbid0IGhhdmUgdG8gYmUgYWNjdXJhdGUgdG8gdGhlIG1pbGxpc2Vjb25kLgorICAgICAgICAgICAgICAgSSBhZGp1c3QgaXQgaGVyZSBieSByb3VnaGx5IG9uZSAxLzMwIHNlYy4gIFllcyBpdAorICAgICAgICAgICAgICAgd2lsbCBiZSBzbGlnaHRseSBvZmYgZm9yIFVLIHN0cmVhbXMsIGJ1dCBpdCdzIE9LLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB0eS0+bGFzdF90eV9wdHMgKz0gMzUwMDAwMDA7CisgICAgICAgICAgICAvL3R5LT5sYXN0X3R5X3B0cyArPSAzMzM2NjY2NzsKKyAgICAgICAgfQorICAgICAgICAvKiBzZXQgUFRTIGZvciB0aGlzIGJsb2NrIGJlZm9yZSB3ZSBzZW5kICovCisgICAgICAgIGlmICh0eS0+bGFzdF92aWRlb19wdHMgPiBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgcGt0LT5wdHMgPSB0eS0+bGFzdF92aWRlb19wdHM7CisgICAgICAgICAgICAvKiBQVFMgZ2V0cyB1c2VkIE9OQ0UuCisgICAgICAgICAgICAgKiBBbnkgc3Vic2VxdWVudCBmcmFtZXMgd2UgZ2V0IEJFRk9SRSBuZXh0IFBFUworICAgICAgICAgICAgICogaGVhZGVyIHdpbGwgaGF2ZSB0aGVpciBQVFMgY29tcHV0ZWQgaW4gdGhlIGNvZGVjICovCisgICAgICAgICAgICB0eS0+bGFzdF92aWRlb19wdHMgPSBBVl9OT1BUU19WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBnb3RfcGFja2V0OworfQorCitzdGF0aWMgaW50IGNoZWNrX3N5bmNfcGVzKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgcmVjX2xlbikKK3sKKyAgICBUWURlbXV4Q29udGV4dCAqdHkgPSBzLT5wcml2X2RhdGE7CisKKyAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgKyB0eS0+cGVzX2xlbmd0aCA+IHJlY19sZW4pIHsKKyAgICAgICAgLyogZW50aXJlIFBFUyBoZWFkZXIgbm90IHByZXNlbnQgKi8KKyAgICAgICAgZmZfZGxvZyhzLCAiUEVTIGhlYWRlciBhdCAlIlBSSWQzMiIgbm90IGNvbXBsZXRlIGluIHJlY29yZC4gc3RvcmluZy5cbiIsIG9mZnNldCk7CisgICAgICAgIC8qIHNhdmUgdGhlIHBhcnRpYWwgcGVzIGhlYWRlciAqLworICAgICAgICBpZiAob2Zmc2V0IDwgMCkgeworICAgICAgICAgICAgLyogbm8gaGVhZGVyIGZvdW5kLCBmYWtlIHNvbWUgMDAncyAodGhpcyB3b3JrcywgYmVsaWV2ZSBtZSkgKi8KKyAgICAgICAgICAgIG1lbXNldCh0eS0+cGVzX2J1ZmZlciwgMCwgNCk7CisgICAgICAgICAgICB0eS0+cGVzX2J1Zl9jbnQgPSA0OworICAgICAgICAgICAgaWYgKHJlY19sZW4gPiA0KQorICAgICAgICAgICAgICAgIGZmX2Rsb2cocywgIlBFUyBoZWFkZXIgbm90IGZvdW5kIGluIHJlY29yZCBvZiAlIlBSSWQzMiIgYnl0ZXMhXG4iLCByZWNfbGVuKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICAvKiBjb3B5IHRoZSBwYXJ0aWFsIHBlcyBoZWFkZXIgd2UgZm91bmQgKi8KKyAgICAgICAgbWVtY3B5KHR5LT5wZXNfYnVmZmVyLCBwa3QtPmRhdGEgKyBvZmZzZXQsIHJlY19sZW4gLSBvZmZzZXQpOworICAgICAgICB0eS0+cGVzX2J1Zl9jbnQgPSByZWNfbGVuIC0gb2Zmc2V0OworCisgICAgICAgIGlmIChvZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAvKiBQRVMgSGVhZGVyIHdhcyBmb3VuZCwgYnV0IG5vdCBjb21wbGV0ZSwgc28gdHJpbSB0aGUgZW5kIG9mIHRoaXMgcmVjb3JkICovCisgICAgICAgICAgICBwa3QtPnNpemUgLT0gcmVjX2xlbiAtIG9mZnNldDsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsgICAgLyogcGFydGlhbCBQRVMsIG5vIGF1ZGlvIGRhdGEgKi8KKyAgICB9CisgICAgLyogZnVsbCBQRVMgaGVhZGVyIHByZXNlbnQsIGV4dHJhY3QgUFRTICovCisgICAgdHktPmxhc3RfYXVkaW9fcHRzID0gZmZfcGFyc2VfcGVzX3B0cygmcGt0LT5kYXRhWyBvZmZzZXQgKyB0eS0+cHRzX29mZnNldF0pOworICAgIGlmICh0eS0+Zmlyc3RfYXVkaW9fcHRzID09IEFWX05PUFRTX1ZBTFVFKQorICAgICAgICB0eS0+Zmlyc3RfYXVkaW9fcHRzID0gdHktPmxhc3RfYXVkaW9fcHRzOworICAgIHBrdC0+cHRzID0gdHktPmxhc3RfYXVkaW9fcHRzOworICAgIG1lbW1vdmUocGt0LT5kYXRhICsgb2Zmc2V0LCBwa3QtPmRhdGEgKyBvZmZzZXQgKyB0eS0+cGVzX2xlbmd0aCwgcmVjX2xlbiAtIHR5LT5wZXNfbGVuZ3RoKTsKKyAgICBwa3QtPnNpemUgLT0gdHktPnBlc19sZW5ndGg7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVtdXhfYXVkaW8oQVZGb3JtYXRDb250ZXh0ICpzLCBUeVJlY0hkciAqcmVjX2hkciwgQVZQYWNrZXQgKnBrdCkKK3sKKyAgICBUWURlbXV4Q29udGV4dCAqdHkgPSBzLT5wcml2X2RhdGE7CisgICAgY29uc3QgaW50IHN1YnJlY190eXBlID0gcmVjX2hkci0+c3VicmVjX3R5cGU7CisgICAgY29uc3QgaW50NjRfdCByZWNfc2l6ZSA9IHJlY19oZHItPnJlY19zaXplOworICAgIGludCBlc19vZmZzZXQxOworCisgICAgaWYgKHN1YnJlY190eXBlID09IDIpIHsKKyAgICAgICAgaW50IG5lZWQgPSAwOworICAgICAgICAvKiBTQSBvciBEVGlWbyBBdWRpbyBEYXRhLCBubyBQRVMgKGNvbnRpbnVlZCBibG9jaykKKyAgICAgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgICAgICAqLworCisgICAgICAgIC8qIGNvbnRpbnVlIFBFUyBpZiBwcmV2aW91cyB3YXMgaW5jb21wbGV0ZSAqLworICAgICAgICBpZiAodHktPnBlc19idWZfY250ID4gMCkgeworICAgICAgICAgICAgbmVlZCA9IHR5LT5wZXNfbGVuZ3RoIC0gdHktPnBlc19idWZfY250OworCisgICAgICAgICAgICBmZl9kbG9nKHMsICJjb250aW51aW5nIFBFUyBoZWFkZXJcbiIpOworICAgICAgICAgICAgLyogZG8gd2UgaGF2ZSBlbm91Z2ggZGF0YSB0byBjb21wbGV0ZT8gKi8KKyAgICAgICAgICAgIGlmIChuZWVkID49IHJlY19zaXplKSB7CisgICAgICAgICAgICAgICAgLyogZG9uJ3QgaGF2ZSBjb21wbGV0ZSBQRVMgaGRyOyBzYXZlIHdoYXQgd2UgaGF2ZSBhbmQgcmV0dXJuICovCisgICAgICAgICAgICAgICAgbWVtY3B5KHR5LT5wZXNfYnVmZmVyICsgdHktPnBlc19idWZfY250LCB0eS0+Y2h1bmsgKyB0eS0+Y3VyX2NodW5rX3BvcywgcmVjX3NpemUpOworICAgICAgICAgICAgICAgIHR5LT5jdXJfY2h1bmtfcG9zICs9IHJlY19zaXplOworICAgICAgICAgICAgICAgIHR5LT5wZXNfYnVmX2NudCArPSByZWNfc2l6ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogd2UgaGF2ZSBlbm91Z2g7IHJlY29uc3RydWN0IHRoaXMgZnJhbWUgd2l0aCB0aGUgbmV3IGhkciAqLworICAgICAgICAgICAgbWVtY3B5KHR5LT5wZXNfYnVmZmVyICsgdHktPnBlc19idWZfY250LCB0eS0+Y2h1bmsgKyB0eS0+Y3VyX2NodW5rX3BvcywgbmVlZCk7CisgICAgICAgICAgICB0eS0+Y3VyX2NodW5rX3BvcyArPSBuZWVkOworICAgICAgICAgICAgLyogZ2V0IHRoZSBQVFMgb3V0IG9mIHRoaXMgUEVTIGhlYWRlciAoTVBFRyBvciBBQzMpICovCisgICAgICAgICAgICBpZiAodHktPmF1ZGlvX3R5cGUgPT0gVElWT19BVURJT19NUEVHKSB7CisgICAgICAgICAgICAgICAgZXNfb2Zmc2V0MSA9IGZpbmRfZXNfaGVhZGVyKHR5X01QRUdBdWRpb1BhY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5LT5wZXNfYnVmZmVyLCA1KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXNfb2Zmc2V0MSA9IGZpbmRfZXNfaGVhZGVyKHR5X0FDM0F1ZGlvUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgdHktPnBlc19idWZmZXIsIDUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVzX29mZnNldDEgPCAwKSB7CisgICAgICAgICAgICAgICAgZmZfZGxvZyhzLCAiQ2FuJ3QgZmluZCBhdWRpbyBQRVMgaGVhZGVyIGluIHBhY2tldC5cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eS0+bGFzdF9hdWRpb19wdHMgPSBmZl9wYXJzZV9wZXNfcHRzKAorICAgICAgICAgICAgICAgICAgICAmdHktPnBlc19idWZmZXJbZXNfb2Zmc2V0MSArIHR5LT5wdHNfb2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgcGt0LT5wdHMgPSB0eS0+bGFzdF9hdWRpb19wdHM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0eS0+cGVzX2J1Zl9jbnQgPSAwOworCisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCByZWNfc2l6ZSAtIG5lZWQpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHR5LT5jaHVuayArIHR5LT5jdXJfY2h1bmtfcG9zLCByZWNfc2l6ZSAtIG5lZWQpOworICAgICAgICB0eS0+Y3VyX2NodW5rX3BvcyArPSByZWNfc2l6ZSAtIG5lZWQ7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKKworICAgICAgICAvKiBTMiBEVGl2byBoYXMgQUMzIHBhY2tldHMgd2l0aCAyIHBhZGRpbmcgYnl0ZXMgYXQgZW5kLiAgVGhpcyBpcworICAgICAgICAgKiBub3QgYWxsb3dlZCBpbiB0aGUgQUMzIHNwZWMgYW5kIHdpbGwgY2F1c2UgcHJvYmxlbXMuICBTbyBoZXJlCisgICAgICAgICAqIHdlIHRyeSB0byB0cmltIHRoaW5ncy4gKi8KKyAgICAgICAgLyogQWxzbywgUzEgRFRpdm8gaGFzIGFsdGVybmF0aW5nIHNob3J0IC8gbG9uZyBBQzMgcGFja2V0cy4gIFRoYXQKKyAgICAgICAgICogaXMsIG9uZSBwYWNrZXQgaXMgc2hvcnQgKGluY29tcGxldGUpIGFuZCB0aGUgbmV4dCBwYWNrZXQgaGFzCisgICAgICAgICAqIHRoZSBmaXJzdCBvbmUncyBtaXNzaW5nIGRhdGEsIHBsdXMgYWxsIG9mIGl0cyBvd24uICBTdHJhbmdlLiAqLworICAgICAgICBpZiAodHktPmF1ZGlvX3R5cGUgPT0gVElWT19BVURJT19BQzMgJiYKKyAgICAgICAgICAgICAgICB0eS0+dGl2b19zZXJpZXMgPT0gVElWT19TRVJJRVMyKSB7CisgICAgICAgICAgICBpZiAodHktPmFjM19wa3Rfc2l6ZSArIHBrdC0+c2l6ZSA+IEFDM19QS1RfTEVOR1RIKSB7CisgICAgICAgICAgICAgICAgcGt0LT5zaXplIC09IDI7CisgICAgICAgICAgICAgICAgdHktPmFjM19wa3Rfc2l6ZSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR5LT5hYzNfcGt0X3NpemUgKz0gcGt0LT5zaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdWJyZWNfdHlwZSA9PSAweDAzKSB7CisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgcmVjX3NpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHR5LT5jaHVuayArIHR5LT5jdXJfY2h1bmtfcG9zLCByZWNfc2l6ZSk7CisgICAgICAgIHR5LT5jdXJfY2h1bmtfcG9zICs9IHJlY19zaXplOworICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDE7CisgICAgICAgIC8qIE1QRUcgQXVkaW8gd2l0aCBQRVMgSGVhZGVyLCBlaXRoZXIgU0Egb3IgRFRpVm8gICAqLworICAgICAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICAgICAgZXNfb2Zmc2V0MSA9IGZpbmRfZXNfaGVhZGVyKHR5X01QRUdBdWRpb1BhY2tldCwgcGt0LT5kYXRhLCA1KTsKKworICAgICAgICAvKiBTQSBQRVMgSGVhZGVyLCBObyBBdWRpbyBEYXRhICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisgICAgICAgIGlmICgoZXNfb2Zmc2V0MSA9PSAwKSAmJiAocmVjX3NpemUgPT0gMTYpKSB7CisgICAgICAgICAgICB0eS0+bGFzdF9hdWRpb19wdHMgPSBmZl9wYXJzZV9wZXNfcHRzKCZwa3QtPmRhdGFbU0FfUFRTX09GRlNFVF0pOworICAgICAgICAgICAgaWYgKHR5LT5maXJzdF9hdWRpb19wdHMgPT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgdHktPmZpcnN0X2F1ZGlvX3B0cyA9IHR5LT5sYXN0X2F1ZGlvX3B0czsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgLyogRFRpVm8gQXVkaW8gd2l0aCBQRVMgSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAgICAgIC8qIENoZWNrIGZvciBjb21wbGV0ZSBQRVMgKi8KKyAgICAgICAgaWYgKGNoZWNrX3N5bmNfcGVzKHMsIHBrdCwgZXNfb2Zmc2V0MSwgcmVjX3NpemUpID09IC0xKSB7CisgICAgICAgICAgICAvKiBwYXJ0aWFsIFBFUyBoZWFkZXIgZm91bmQsIG5vdGhpbmcgZWxzZS4KKyAgICAgICAgICAgICAqIHdlJ3JlIGRvbmUuICovCisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdWJyZWNfdHlwZSA9PSAweDA0KSB7CisgICAgICAgIC8qIFNBIEF1ZGlvIHdpdGggbm8gUEVTIEhlYWRlciAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICAgICAgaWYgKGF2X25ld19wYWNrZXQocGt0LCByZWNfc2l6ZSkgPCAwKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgbWVtY3B5KHBrdC0+ZGF0YSwgdHktPmNodW5rICsgdHktPmN1cl9jaHVua19wb3MsIHJlY19zaXplKTsKKyAgICAgICAgdHktPmN1cl9jaHVua19wb3MgKz0gcmVjX3NpemU7CisgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMTsKKyAgICAgICAgcGt0LT5wdHMgPSB0eS0+bGFzdF9hdWRpb19wdHM7CisgICAgfSBlbHNlIGlmIChzdWJyZWNfdHlwZSA9PSAweDA5KSB7CisgICAgICAgIGlmIChhdl9uZXdfcGFja2V0KHBrdCwgcmVjX3NpemUpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIG1lbWNweShwa3QtPmRhdGEsIHR5LT5jaHVuayArIHR5LT5jdXJfY2h1bmtfcG9zLCByZWNfc2l6ZSk7CisgICAgICAgIHR5LT5jdXJfY2h1bmtfcG9zICs9IHJlY19zaXplIDsKKyAgICAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAxOworCisgICAgICAgIC8qIERUaVZvIEFDMyBBdWRpbyBEYXRhIHdpdGggUEVTIEhlYWRlciAgICAgICAgICAgICAqLworICAgICAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKyAgICAgICAgZXNfb2Zmc2V0MSA9IGZpbmRfZXNfaGVhZGVyKHR5X0FDM0F1ZGlvUGFja2V0LCBwa3QtPmRhdGEsIDUpOworCisgICAgICAgIC8qIENoZWNrIGZvciBjb21wbGV0ZSBQRVMgKi8KKyAgICAgICAgaWYgKGNoZWNrX3N5bmNfcGVzKHMsIHBrdCwgZXNfb2Zmc2V0MSwgcmVjX3NpemUpID09IC0xKSB7CisgICAgICAgICAgICAvKiBwYXJ0aWFsIFBFUyBoZWFkZXIgZm91bmQsIG5vdGhpbmcgZWxzZS4gIHdlJ3JlIGRvbmUuICovCisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIC8qIFMyIERUaXZvIGhhcyBpbnZhbGlkIGxvbmcgQUMzIHBhY2tldHMgKi8KKyAgICAgICAgaWYgKHR5LT50aXZvX3NlcmllcyA9PSBUSVZPX1NFUklFUzIpIHsKKyAgICAgICAgICAgIGlmIChwa3QtPnNpemUgPiBBQzNfUEtUX0xFTkdUSCkgeworICAgICAgICAgICAgICAgIHBrdC0+c2l6ZSAtPSAyOworICAgICAgICAgICAgICAgIHR5LT5hYzNfcGt0X3NpemUgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0eS0+YWMzX3BrdF9zaXplID0gcGt0LT5zaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogVW5zdXBwb3J0ZWQvVW5rbm93biAqLworICAgICAgICB0eS0+Y3VyX2NodW5rX3BvcyArPSByZWNfc2l6ZTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgdHlfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQoreworICAgIFRZRGVtdXhDb250ZXh0ICp0eSA9IHMtPnByaXZfZGF0YTsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBUeVJlY0hkciAqcmVjOworICAgIGludDY0X3QgcmVjX3NpemUgPSAwOworICAgIGludCByZXQgPSAwOworCisgICAgaWYgKGF2aW9fZmVvZihwYikpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgIHdoaWxlIChyZXQgPD0gMCkgeworICAgICAgICBpZiAoIXR5LT5yZWNfaGRycyB8fCB0eS0+Zmlyc3RfY2h1bmsgfHwgdHktPmN1cl9yZWMgPj0gdHktPm51bV9yZWNzKSB7CisgICAgICAgICAgICBpZiAoZ2V0X2NodW5rKHMpIDwgMCB8fCB0eS0+bnVtX3JlY3MgPD0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIH0KKworICAgICAgICByZWMgPSAmdHktPnJlY19oZHJzW3R5LT5jdXJfcmVjXTsKKyAgICAgICAgcmVjX3NpemUgPSByZWMtPnJlY19zaXplOworICAgICAgICB0eS0+Y3VyX3JlYysrOworCisgICAgICAgIGlmIChyZWNfc2l6ZSA8PSAwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHR5LT5jdXJfY2h1bmtfcG9zICsgcmVjLT5yZWNfc2l6ZSA+IENIVU5LX1NJWkUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKworICAgICAgICBpZiAoYXZpb19mZW9mKHBiKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKKworICAgICAgICBzd2l0Y2ggKHJlYy0+cmVjX3R5cGUpIHsKKyAgICAgICAgY2FzZSBWSURFT19JRDoKKyAgICAgICAgICAgIHJldCA9IGRlbXV4X3ZpZGVvKHMsIHJlYywgcGt0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0lEOgorICAgICAgICAgICAgcmV0ID0gZGVtdXhfYXVkaW8ocywgcmVjLCBwa3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmZl9kbG9nKHMsICJJbnZhbGlkIHJlY29yZCB0eXBlIDB4JTAyeFxuIiwgcmVjLT5yZWNfdHlwZSk7CisgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAgY2FzZSAweDAyOgorICAgICAgICBjYXNlIDB4MDM6IC8qIFRpVm8gZGF0YSBzZXJ2aWNlcyAqLworICAgICAgICBjYXNlIDB4MDU6IC8qIHVua25vd24sIGJ1dCBzZWVuIHJlZ3VsYXJseSAqLworICAgICAgICAgICAgdHktPmN1cl9jaHVua19wb3MgKz0gcmVjLT5yZWNfc2l6ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHlfcmVhZF9jbG9zZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgVFlEZW11eENvbnRleHQgKnR5ID0gcy0+cHJpdl9kYXRhOworCisgICAgYXZfZnJlZXAoJnR5LT5zZXFfdGFibGUpOworICAgIGF2X2ZyZWVwKCZ0eS0+cmVjX2hkcnMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfdHlfZGVtdXhlciA9IHsKKyAgICAubmFtZSAgICAgICAgICAgPSAidHkiLAorICAgIC5sb25nX25hbWUgICAgICA9IE5VTExfSUZfQ09ORklHX1NNQUxMKCJUaVZvIFRZIFN0cmVhbSIpLAorICAgIC5wcml2X2RhdGFfc2l6ZSA9IHNpemVvZihUWURlbXV4Q29udGV4dCksCisgICAgLnJlYWRfcHJvYmUgICAgID0gdHlfcHJvYmUsCisgICAgLnJlYWRfaGVhZGVyICAgID0gdHlfcmVhZF9oZWFkZXIsCisgICAgLnJlYWRfcGFja2V0ICAgID0gdHlfcmVhZF9wYWNrZXQsCisgICAgLnJlYWRfY2xvc2UgICAgID0gdHlfcmVhZF9jbG9zZSwKKyAgICAuZXh0ZW5zaW9ucyAgICAgPSAidHksdHkrIiwKKyAgICAuZmxhZ3MgICAgICAgICAgPSBBVkZNVF9UU19ESVNDT05ULAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3VkcC5jIGIvbGliYXZmb3JtYXQvdWRwLmMKaW5kZXggZWE4MGU1Mi4uMGRkZTAzNSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdWRwLmMKKysrIGIvbGliYXZmb3JtYXQvdWRwLmMKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiYXZpb19pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ZpZm8uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCkBAIC00MSw2ICs0MiwxMCBAQAogI2luY2x1ZGUgIm9zX3N1cHBvcnQuaCIKICNpbmNsdWRlICJ1cmwuaCIKIAorI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgIlRhcmdldENvbmRpdGlvbmFscy5oIgorI2VuZGlmCisKICNpZiBIQVZFX1VEUExJVEVfSAogI2luY2x1ZGUgInVkcGxpdGUuaCIKICNlbHNlCkBAIC01OSwxMCArNjQsNiBAQAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNlbmRpZgogCi0jaWZuZGVmIEhBVkVfUFRIUkVBRF9DQU5DRUwKLSNkZWZpbmUgSEFWRV9QVEhSRUFEX0NBTkNFTCAwCi0jZW5kaWYKLQogI2lmbmRlZiBJUFY2X0FERF9NRU1CRVJTSElQCiAjZGVmaW5lIElQVjZfQUREX01FTUJFUlNISVAgSVBWNl9KT0lOX0dST1VQCiAjZGVmaW5lIElQVjZfRFJPUF9NRU1CRVJTSElQIElQVjZfTEVBVkVfR1JPVVAKQEAgLTkyLDYgKzkzLDkgQEAKICAgICBpbnQgY2lyY3VsYXJfYnVmZmVyX3NpemU7CiAgICAgQVZGaWZvQnVmZmVyICpmaWZvOwogICAgIGludCBjaXJjdWxhcl9idWZmZXJfZXJyb3I7CisgICAgaW50NjRfdCBiaXRyYXRlOyAvKiBudW1iZXIgb2YgYml0cyB0byBzZW5kIHBlciBzZWNvbmQgKi8KKyAgICBpbnQ2NF90IGJ1cnN0X2JpdHM7CisgICAgaW50IGNsb3NlX3JlcTsKICNpZiBIQVZFX1BUSFJFQURfQ0FOQ0VMCiAgICAgcHRocmVhZF90IGNpcmN1bGFyX2J1ZmZlcl90aHJlYWQ7CiAgICAgcHRocmVhZF9tdXRleF90IG11dGV4OwpAQCAtMTEyLDYgKzExNiw4IEBACiAjZGVmaW5lIEUgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiBvcHRpb25zW10gPSB7CiAgICAgeyAiYnVmZmVyX3NpemUiLCAgICAiU3lzdGVtIGRhdGEgc2l6ZSAoaW4gYnl0ZXMpIiwgICAgICAgICAgICAgICAgICAgICBPRkZTRVQoYnVmZmVyX3NpemUpLCAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sICAgIC0xLCBJTlRfTUFYLCAuZmxhZ3MgPSBEfEUgfSwKKyAgICB7ICJiaXRyYXRlIiwgICAgICAgICJCaXRzIHRvIHNlbmQgcGVyIHNlY29uZCIsICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChiaXRyYXRlKSwgICAgICAgIEFWX09QVF9UWVBFX0lOVDY0LCAgeyAuaTY0ID0gMCAgfSwgICAgIDAsIElOVDY0X01BWCwgLmZsYWdzID0gRSB9LAorICAgIHsgImJ1cnN0X2JpdHMiLCAgICAgIk1heCBsZW5ndGggb2YgYnVyc3RzIGluIGJpdHMgKHdoZW4gdXNpbmcgYml0cmF0ZSkiLCBPRkZTRVQoYnVyc3RfYml0cyksICAgQVZfT1BUX1RZUEVfSU5UNjQsICB7IC5pNjQgPSAwICB9LCAgICAgMCwgSU5UNjRfTUFYLCAuZmxhZ3MgPSBFIH0sCiAgICAgeyAibG9jYWxwb3J0IiwgICAgICAiTG9jYWwgcG9ydCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZTRVQobG9jYWxfcG9ydCksICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IC0xIH0sICAgIC0xLCBJTlRfTUFYLCBEfEUgfSwKICAgICB7ICJsb2NhbF9wb3J0IiwgICAgICJMb2NhbCBwb3J0IiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRlNFVChsb2NhbF9wb3J0KSwgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gLTEgfSwgICAgLTEsIElOVF9NQVgsIC5mbGFncyA9IER8RSB9LAogICAgIHsgImxvY2FsYWRkciIsICAgICAgIkxvY2FsIGFkZHJlc3MiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGU0VUKGxvY2FsYWRkciksICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCB7IC5zdHIgPSBOVUxMIH0sICAgICAgICAgICAgICAgLmZsYWdzID0gRHxFIH0sCkBAIC0yNjAsNyArMjY2LDcgQEAKICAgICAgICAgcmVzID0gTlVMTDsKICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgImdldGFkZHJpbmZvKCVzLCAlcyk6ICVzXG4iLAogICAgICAgICAgICAgICAgbm9kZSA/IG5vZGUgOiAidW5rbm93biIsCi0gICAgICAgICAgICAgICBzZXJ2aWNlID8gc2VydmljZSA6ICJ1bmtub3duIiwKKyAgICAgICAgICAgICAgIHNlcnZpY2UsCiAgICAgICAgICAgICAgICBnYWlfc3RyZXJyb3IoZXJyb3IpKTsKICAgICB9CiAKQEAgLTI3Miw3ICsyNzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGRyX2xlbiwgY2hhciAqKnNvdXJjZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NvdXJjZXMsIGludCBpbmNsdWRlKQogewotI2lmIEhBVkVfU1RSVUNUX0dST1VQX1NPVVJDRV9SRVEgJiYgZGVmaW5lZChNQ0FTVF9CTE9DS19TT1VSQ0UpICYmICFkZWZpbmVkKF9XSU4zMikKKyNpZiBIQVZFX1NUUlVDVF9HUk9VUF9TT1VSQ0VfUkVRICYmIGRlZmluZWQoTUNBU1RfQkxPQ0tfU09VUkNFKSAmJiAhZGVmaW5lZChfV0lOMzIpICYmICghZGVmaW5lZChUQVJHRVRfT1NfVFYpIHx8ICFUQVJHRVRfT1NfVFYpCiAgICAgLyogVGhlc2Ugb25lcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBtaWNyb3NvZnQgU0RLLCBidXQgZG9uJ3Qgc2VlbSB0byB3b3JrCiAgICAgICogYXMgb24gbGludXgsIHNvIGp1c3QgcHJlZmVyIHRoZSB2NC1vbmx5IGFwcHJvYWNoIHRoZXJlIGZvciBub3cuICovCiAgICAgaW50IGk7CkBAIC00ODYsNyArNDkyLDcgQEAKIH0KIAogI2lmIEhBVkVfUFRIUkVBRF9DQU5DRUwKLXN0YXRpYyB2b2lkICpjaXJjdWxhcl9idWZmZXJfdGFzayggdm9pZCAqX1VSTENvbnRleHQpCitzdGF0aWMgdm9pZCAqY2lyY3VsYXJfYnVmZmVyX3Rhc2tfcngoIHZvaWQgKl9VUkxDb250ZXh0KQogewogICAgIFVSTENvbnRleHQgKmggPSBfVVJMQ29udGV4dDsKICAgICBVRFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOwpAQCAtNTQyLDYgKzU0OCwxMDkgQEAKICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+bXV0ZXgpOwogICAgIHJldHVybiBOVUxMOwogfQorCitzdGF0aWMgdm9pZCAqY2lyY3VsYXJfYnVmZmVyX3Rhc2tfdHgoIHZvaWQgKl9VUkxDb250ZXh0KQoreworICAgIFVSTENvbnRleHQgKmggPSBfVVJMQ29udGV4dDsKKyAgICBVRFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOworICAgIGludCBvbGRfY2FuY2Vsc3RhdGU7CisgICAgaW50NjRfdCB0YXJnZXRfdGltZXN0YW1wID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworICAgIGludDY0X3Qgc3RhcnRfdGltZXN0YW1wID0gYXZfZ2V0dGltZV9yZWxhdGl2ZSgpOworICAgIGludDY0X3Qgc2VudF9iaXRzID0gMDsKKyAgICBpbnQ2NF90IGJ1cnN0X2ludGVydmFsID0gcy0+Yml0cmF0ZSA/IChzLT5idXJzdF9iaXRzICogMTAwMDAwMCAvIHMtPmJpdHJhdGUpIDogMDsKKyAgICBpbnQ2NF90IG1heF9kZWxheSA9IHMtPmJpdHJhdGUgPyAgKChpbnQ2NF90KWgtPm1heF9wYWNrZXRfc2l6ZSAqIDggKiAxMDAwMDAwIC8gcy0+Yml0cmF0ZSArIDEpIDogMDsKKworICAgIHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoUFRIUkVBRF9DQU5DRUxfRElTQUJMRSwgJm9sZF9jYW5jZWxzdGF0ZSk7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5tdXRleCk7CisKKyAgICBpZiAoZmZfc29ja2V0X25vbmJsb2NrKHMtPnVkcF9mZCwgMCkgPCAwKSB7CisgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gc2V0IGJsb2NraW5nIG1vZGUiKTsKKyAgICAgICAgcy0+Y2lyY3VsYXJfYnVmZmVyX2Vycm9yID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBmb3IoOzspIHsKKyAgICAgICAgaW50IGxlbjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqcDsKKyAgICAgICAgdWludDhfdCB0bXBbNF07CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworCisgICAgICAgIGxlbj1hdl9maWZvX3NpemUocy0+Zmlmbyk7CisKKyAgICAgICAgd2hpbGUgKGxlbjw0KSB7CisgICAgICAgICAgICBpZiAocy0+Y2xvc2VfcmVxKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgaWYgKHB0aHJlYWRfY29uZF93YWl0KCZzLT5jb25kLCAmcy0+bXV0ZXgpIDwgMCkgeworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGVuPWF2X2ZpZm9fc2l6ZShzLT5maWZvKTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19yZWFkKHMtPmZpZm8sIHRtcCwgNCwgTlVMTCk7CisgICAgICAgIGxlbj1BVl9STDMyKHRtcCk7CisKKyAgICAgICAgYXZfYXNzZXJ0MChsZW4gPj0gMCk7CisgICAgICAgIGF2X2Fzc2VydDAobGVuIDw9IHNpemVvZihzLT50bXApKTsKKworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChzLT5maWZvLCBzLT50bXAsIGxlbiwgTlVMTCk7CisKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPm11dGV4KTsKKyAgICAgICAgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZShQVEhSRUFEX0NBTkNFTF9FTkFCTEUsICZvbGRfY2FuY2Vsc3RhdGUpOworCisgICAgICAgIGlmIChzLT5iaXRyYXRlKSB7CisgICAgICAgICAgICB0aW1lc3RhbXAgPSBhdl9nZXR0aW1lX3JlbGF0aXZlKCk7CisgICAgICAgICAgICBpZiAodGltZXN0YW1wIDwgdGFyZ2V0X3RpbWVzdGFtcCkgeworICAgICAgICAgICAgICAgIGludDY0X3QgZGVsYXkgPSB0YXJnZXRfdGltZXN0YW1wIC0gdGltZXN0YW1wOworICAgICAgICAgICAgICAgIGlmIChkZWxheSA+IG1heF9kZWxheSkgeworICAgICAgICAgICAgICAgICAgICBkZWxheSA9IG1heF9kZWxheTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfdGltZXN0YW1wID0gdGltZXN0YW1wICsgZGVsYXk7CisgICAgICAgICAgICAgICAgICAgIHNlbnRfYml0cyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGF2X3VzbGVlcChkZWxheSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0aW1lc3RhbXAgLSBidXJzdF9pbnRlcnZhbCA+IHRhcmdldF90aW1lc3RhbXApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRfdGltZXN0YW1wID0gdGltZXN0YW1wIC0gYnVyc3RfaW50ZXJ2YWw7CisgICAgICAgICAgICAgICAgICAgIHNlbnRfYml0cyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VudF9iaXRzICs9IGxlbiAqIDg7CisgICAgICAgICAgICB0YXJnZXRfdGltZXN0YW1wID0gc3RhcnRfdGltZXN0YW1wICsgc2VudF9iaXRzICogMTAwMDAwMCAvIHMtPmJpdHJhdGU7CisgICAgICAgIH0KKworICAgICAgICBwID0gcy0+dG1wOworICAgICAgICB3aGlsZSAobGVuKSB7CisgICAgICAgICAgICBpbnQgcmV0OworICAgICAgICAgICAgYXZfYXNzZXJ0MChsZW4gPiAwKTsKKyAgICAgICAgICAgIGlmICghcy0+aXNfY29ubmVjdGVkKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gc2VuZHRvIChzLT51ZHBfZmQsIHAsIGxlbiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopICZzLT5kZXN0X2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVzdF9hZGRyX2xlbik7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICByZXQgPSBzZW5kKHMtPnVkcF9mZCwgcCwgbGVuLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMCkgeworICAgICAgICAgICAgICAgIGxlbiAtPSByZXQ7CisgICAgICAgICAgICAgICAgcCAgICs9IHJldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gZmZfbmV0ZXJybm8oKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ICE9IEFWRVJST1IoRUFHQUlOKSAmJiByZXQgIT0gQVZFUlJPUihFSU5UUikpIHsKKyAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5tdXRleCk7CisgICAgICAgICAgICAgICAgICAgIHMtPmNpcmN1bGFyX2J1ZmZlcl9lcnJvciA9IHJldDsKKyAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPm11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHRocmVhZF9zZXRjYW5jZWxzdGF0ZShQVEhSRUFEX0NBTkNFTF9ESVNBQkxFLCAmb2xkX2NhbmNlbHN0YXRlKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5tdXRleCk7CisgICAgfQorCitlbmQ6CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPm11dGV4KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCiAjZW5kaWYKIAogc3RhdGljIGludCBwYXJzZV9zb3VyY2VfbGlzdChjaGFyICpidWYsIGNoYXIgKipzb3VyY2VzLCBpbnQgKm51bV9zb3VyY2VzLApAQCAtNjUwLDYgKzc1OSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAiJ2NpcmN1bGFyX2J1ZmZlcl9zaXplJyBvcHRpb24gd2FzIHNldCBidXQgaXQgaXMgbm90IHN1cHBvcnRlZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJvbiB0aGlzIGJ1aWxkIChwdGhyZWFkIHN1cHBvcnQgaXMgcmVxdWlyZWQpXG4iKTsKICAgICAgICAgfQorICAgICAgICBpZiAoYXZfZmluZF9pbmZvX3RhZyhidWYsIHNpemVvZihidWYpLCAiYml0cmF0ZSIsIHApKSB7CisgICAgICAgICAgICBzLT5iaXRyYXRlID0gc3RydG9sbChidWYsIE5VTEwsIDEwKTsKKyAgICAgICAgICAgIGlmICghSEFWRV9QVEhSRUFEX0NBTkNFTCkKKyAgICAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICInYml0cmF0ZScgb3B0aW9uIHdhcyBzZXQgYnV0IGl0IGlzIG5vdCBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAib24gdGhpcyBidWlsZCAocHRocmVhZCBzdXBwb3J0IGlzIHJlcXVpcmVkKVxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImJ1cnN0X2JpdHMiLCBwKSkgeworICAgICAgICAgICAgcy0+YnVyc3RfYml0cyA9IHN0cnRvbGwoYnVmLCBOVUxMLCAxMCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmLCBzaXplb2YoYnVmKSwgImxvY2FsYWRkciIsIHApKSB7CiAgICAgICAgICAgICBhdl9zdHJsY3B5KGxvY2FsYWRkciwgYnVmLCBzaXplb2YobG9jYWxhZGRyKSk7CiAgICAgICAgIH0KQEAgLTgyOSw3ICs5NDgsMTggQEAKICAgICBzLT51ZHBfZmQgPSB1ZHBfZmQ7CiAKICNpZiBIQVZFX1BUSFJFQURfQ0FOQ0VMCi0gICAgaWYgKCFpc19vdXRwdXQgJiYgcy0+Y2lyY3VsYXJfYnVmZmVyX3NpemUpIHsKKyAgICAvKgorICAgICAgQ3JlYXRlIHRocmVhZCBpbiBjYXNlIG9mOgorICAgICAgMS4gSW5wdXQgYW5kIGNpcmN1bGFyX2J1ZmZlcl9zaXplIGlzIHNldAorICAgICAgMi4gT3V0cHV0IGFuZCBiaXRyYXRlIGFuZCBjaXJjdWxhcl9idWZmZXJfc2l6ZSBpcyBzZXQKKyAgICAqLworCisgICAgaWYgKGlzX291dHB1dCAmJiBzLT5iaXRyYXRlICYmICFzLT5jaXJjdWxhcl9idWZmZXJfc2l6ZSkgeworICAgICAgICAvKiBXYXJuIHVzZXIgaW4gY2FzZSBvZiAnY2lyY3VsYXJfYnVmZmVyX3NpemUnIGlzIG5vdCBzZXQgKi8KKyAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19XQVJOSU5HLCInYml0cmF0ZScgb3B0aW9uIHdhcyBzZXQgYnV0ICdjaXJjdWxhcl9idWZmZXJfc2l6ZScgaXMgbm90LCBidXQgcmVxdWlyZWRcbiIpOworICAgIH0KKworICAgIGlmICgoIWlzX291dHB1dCAmJiBzLT5jaXJjdWxhcl9idWZmZXJfc2l6ZSkgfHwgKGlzX291dHB1dCAmJiBzLT5iaXRyYXRlICYmIHMtPmNpcmN1bGFyX2J1ZmZlcl9zaXplKSkgewogICAgICAgICBpbnQgcmV0OwogCiAgICAgICAgIC8qIHN0YXJ0IHRoZSB0YXNrIGdvaW5nICovCkBAIC04NDQsNyArOTc0LDcgQEAKICAgICAgICAgICAgIGF2X2xvZyhoLCBBVl9MT0dfRVJST1IsICJwdGhyZWFkX2NvbmRfaW5pdCBmYWlsZWQgOiAlc1xuIiwgc3RyZXJyb3IocmV0KSk7CiAgICAgICAgICAgICBnb3RvIGNvbmRfZmFpbDsKICAgICAgICAgfQotICAgICAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmcy0+Y2lyY3VsYXJfYnVmZmVyX3RocmVhZCwgTlVMTCwgY2lyY3VsYXJfYnVmZmVyX3Rhc2ssIGgpOworICAgICAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmcy0+Y2lyY3VsYXJfYnVmZmVyX3RocmVhZCwgTlVMTCwgaXNfb3V0cHV0P2NpcmN1bGFyX2J1ZmZlcl90YXNrX3R4OmNpcmN1bGFyX2J1ZmZlcl90YXNrX3J4LCBoKTsKICAgICAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgICAgICBhdl9sb2coaCwgQVZfTE9HX0VSUk9SLCAicHRocmVhZF9jcmVhdGUgZmFpbGVkIDogJXNcbiIsIHN0cmVycm9yKHJldCkpOwogICAgICAgICAgICAgZ290byB0aHJlYWRfZmFpbDsKQEAgLTk0NSw2ICsxMDc1LDM1IEBACiAgICAgVURQQ29udGV4dCAqcyA9IGgtPnByaXZfZGF0YTsKICAgICBpbnQgcmV0OwogCisjaWYgSEFWRV9QVEhSRUFEX0NBTkNFTAorICAgIGlmIChzLT5maWZvKSB7CisgICAgICAgIHVpbnQ4X3QgdG1wWzRdOworCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmcy0+bXV0ZXgpOworCisgICAgICAgIC8qCisgICAgICAgICAgUmV0dXJuIGVycm9yIGlmIGxhc3QgdHggZmFpbGVkLgorICAgICAgICAgIEhlcmUgd2UgY2FuJ3Qga25vdyBvbiB3aGljaCBwYWNrZXQgZXJyb3Igd2FzLCBidXQgaXQgbmVlZHMgdG8ga25vdyB0aGF0IGVycm9yIGV4aXN0cy4KKyAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmNpcmN1bGFyX2J1ZmZlcl9lcnJvcjwwKSB7CisgICAgICAgICAgICBpbnQgZXJyPXMtPmNpcmN1bGFyX2J1ZmZlcl9lcnJvcjsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5tdXRleCk7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgaWYoYXZfZmlmb19zcGFjZShzLT5maWZvKSA8IHNpemUgKyA0KSB7CisgICAgICAgICAgICAvKiBXaGF0IGFib3V0IGEgcGFydGlhbCBwYWNrZXQgdHggPyAqLworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnMtPm11dGV4KTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgQVZfV0wzMih0bXAsIHNpemUpOworICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUocy0+ZmlmbywgdG1wLCA0LCBOVUxMKTsgLyogc2l6ZSBvZiBwYWNrZXQgKi8KKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKHMtPmZpZm8sICh1aW50OF90ICopYnVmLCBzaXplLCBOVUxMKTsgLyogdGhlIGRhdGEgKi8KKyAgICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmcy0+Y29uZCk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZzLT5tdXRleCk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKyNlbmRpZgogICAgIGlmICghKGgtPmZsYWdzICYgQVZJT19GTEFHX05PTkJMT0NLKSkgewogICAgICAgICByZXQgPSBmZl9uZXR3b3JrX3dhaXRfZmQocy0+dWRwX2ZkLCAxKTsKICAgICAgICAgaWYgKHJldCA8IDApCkBAIC05NjUsMTMgKzExMjQsMjQgQEAKIHsKICAgICBVRFBDb250ZXh0ICpzID0gaC0+cHJpdl9kYXRhOwogCisjaWYgSEFWRV9QVEhSRUFEX0NBTkNFTAorICAgIC8vIFJlcXVlc3QgY2xvc2Ugb25jZSB3cml0aW5nIGlzIGZpbmlzaGVkCisgICAgaWYgKHMtPnRocmVhZF9zdGFydGVkICYmICEoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkpIHsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZzLT5tdXRleCk7CisgICAgICAgIHMtPmNsb3NlX3JlcSA9IDE7CisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnMtPmNvbmQpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmcy0+bXV0ZXgpOworICAgIH0KKyNlbmRpZgorCiAgICAgaWYgKHMtPmlzX211bHRpY2FzdCAmJiAoaC0+ZmxhZ3MgJiBBVklPX0ZMQUdfUkVBRCkpCiAgICAgICAgIHVkcF9sZWF2ZV9tdWx0aWNhc3RfZ3JvdXAocy0+dWRwX2ZkLCAoc3RydWN0IHNvY2thZGRyICopJnMtPmRlc3RfYWRkciwoc3RydWN0IHNvY2thZGRyICopJnMtPmxvY2FsX2FkZHJfc3RvcmFnZSk7Ci0gICAgY2xvc2Vzb2NrZXQocy0+dWRwX2ZkKTsKICNpZiBIQVZFX1BUSFJFQURfQ0FOQ0VMCiAgICAgaWYgKHMtPnRocmVhZF9zdGFydGVkKSB7CiAgICAgICAgIGludCByZXQ7Ci0gICAgICAgIHB0aHJlYWRfY2FuY2VsKHMtPmNpcmN1bGFyX2J1ZmZlcl90aHJlYWQpOworICAgICAgICAvLyBDYW5jZWwgb25seSByZWFkLCBhcyB3cml0ZSBoYXMgYmVlbiBzaWduYWxlZCBhcyBzdWNjZXNzIHRvIHRoZSB1c2VyCisgICAgICAgIGlmIChoLT5mbGFncyAmIEFWSU9fRkxBR19SRUFEKQorICAgICAgICAgICAgcHRocmVhZF9jYW5jZWwocy0+Y2lyY3VsYXJfYnVmZmVyX3RocmVhZCk7CiAgICAgICAgIHJldCA9IHB0aHJlYWRfam9pbihzLT5jaXJjdWxhcl9idWZmZXJfdGhyZWFkLCBOVUxMKTsKICAgICAgICAgaWYgKHJldCAhPSAwKQogICAgICAgICAgICAgYXZfbG9nKGgsIEFWX0xPR19FUlJPUiwgInB0aHJlYWRfam9pbigpOiAlc1xuIiwgc3RyZXJyb3IocmV0KSk7CkBAIC05NzksMTEgKzExNDksMTIgQEAKICAgICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnMtPmNvbmQpOwogICAgIH0KICNlbmRpZgorICAgIGNsb3Nlc29ja2V0KHMtPnVkcF9mZCk7CiAgICAgYXZfZmlmb19mcmVlcCgmcy0+Zmlmbyk7CiAgICAgcmV0dXJuIDA7CiB9CiAKLVVSTFByb3RvY29sIGZmX3VkcF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX3VkcF9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJ1ZHAiLAogICAgIC51cmxfb3BlbiAgICAgICAgICAgID0gdWRwX29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSB1ZHBfcmVhZCwKQEAgLTk5NSw3ICsxMTY2LDcgQEAKICAgICAuZmxhZ3MgICAgICAgICAgICAgICA9IFVSTF9QUk9UT0NPTF9GTEFHX05FVFdPUkssCiB9OwogCi1VUkxQcm90b2NvbCBmZl91ZHBsaXRlX3Byb3RvY29sID0geworY29uc3QgVVJMUHJvdG9jb2wgZmZfdWRwbGl0ZV9wcm90b2NvbCA9IHsKICAgICAubmFtZSAgICAgICAgICAgICAgICA9ICJ1ZHBsaXRlIiwKICAgICAudXJsX29wZW4gICAgICAgICAgICA9IHVkcGxpdGVfb3BlbiwKICAgICAudXJsX3JlYWQgICAgICAgICAgICA9IHVkcF9yZWFkLApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdW5jb2RlZGZyYW1lY3JjZW5jLmMgYi9saWJhdmZvcm1hdC91bmNvZGVkZnJhbWVjcmNlbmMuYwppbmRleCBlZDQ1MzJkLi4yZjFhMTRjIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC91bmNvZGVkZnJhbWVjcmNlbmMuYworKysgYi9saWJhdmZvcm1hdC91bmNvZGVkZnJhbWVjcmNlbmMuYwpAQCAtNzksNyArNzksNyBAQAogICAgIGludCBuYl9wbGFuZXMsIG5iX3NhbXBsZXMsIHA7CiAgICAgY29uc3QgY2hhciAqbmFtZTsKIAotICAgIG5iX3BsYW5lcyAgPSBhdl9mcmFtZV9nZXRfY2hhbm5lbHMoZnJhbWUpOworICAgIG5iX3BsYW5lcyAgPSBmcmFtZS0+Y2hhbm5lbHM7CiAgICAgbmJfc2FtcGxlcyA9IGZyYW1lLT5uYl9zYW1wbGVzOwogICAgIGlmICghYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZnJhbWUtPmZvcm1hdCkpIHsKICAgICAgICAgbmJfc2FtcGxlcyAqPSBuYl9wbGFuZXM7CkBAIC0xMTUsMTAgKzExNSwxNSBAQAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYXZfYXNzZXJ0MCghInJlYWNoZWQiKTsKICAgICAgICAgfQotICAgICAgICBhdl9icHJpbnRmKGJwLCAiLCAweCUwOHgiLCBja3N1bSk7CisgICAgICAgIGF2X2JwcmludGYoYnAsICIsIDB4JTA4IlBSSXgzMiwgY2tzdW0pOwogICAgIH0KIH0KIAorc3RhdGljIGludCB3cml0ZV9oZWFkZXIoc3RydWN0IEFWRm9ybWF0Q29udGV4dCAqcykKK3sKKyAgICByZXR1cm4gZmZfZnJhbWVoYXNoX3dyaXRlX2hlYWRlcihzKTsKK30KKwogc3RhdGljIGludCB3cml0ZV9mcmFtZShzdHJ1Y3QgQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICoqZnJhbWUsIHVuc2lnbmVkIGZsYWdzKQogewpAQCAtMTMzLDcgKzEzOCw3IEBACiAgICAgYXZfYnByaW50X2luaXQoJmJwLCAwLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOwogICAgIGF2X2JwcmludGYoJmJwLCAiJWQsICUxMCJQUklkNjQiIiwKICAgICAgICAgICAgICAgIHN0cmVhbV9pbmRleCwgKCpmcmFtZSktPnB0cyk7Ci0gICAgdHlwZSA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWMtPmNvZGVjX3R5cGU7CisgICAgdHlwZSA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmNvZGVjX3R5cGU7CiAgICAgdHlwZV9uYW1lID0gYXZfZ2V0X21lZGlhX3R5cGVfc3RyaW5nKHR5cGUpOwogICAgIGF2X2JwcmludGYoJmJwLCAiLCAlcyIsIHR5cGVfbmFtZSA/IHR5cGVfbmFtZSA6ICJ1bmtub3duIik7CiAgICAgc3dpdGNoICh0eXBlKSB7CkBAIC0xNjQsNyArMTY5LDcgQEAKICAgICAubG9uZ19uYW1lICAgICAgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgidW5jb2RlZCBmcmFtZWNyYyB0ZXN0aW5nIiksCiAgICAgLmF1ZGlvX2NvZGVjICAgICAgID0gQVZfQ09ERUNfSURfUENNX1MxNkxFLAogICAgIC52aWRlb19jb2RlYyAgICAgICA9IEFWX0NPREVDX0lEX1JBV1ZJREVPLAotICAgIC53cml0ZV9oZWFkZXIgICAgICA9IGZmX2ZyYW1laGFzaF93cml0ZV9oZWFkZXIsCisgICAgLndyaXRlX2hlYWRlciAgICAgID0gd3JpdGVfaGVhZGVyLAogICAgIC53cml0ZV9wYWNrZXQgICAgICA9IHdyaXRlX3BhY2tldCwKICAgICAud3JpdGVfdW5jb2RlZF9mcmFtZSA9IHdyaXRlX2ZyYW1lLAogICAgIC5mbGFncyAgICAgICAgICAgICA9IEFWRk1UX1ZBUklBQkxFX0ZQUyB8IEFWRk1UX1RTX05PTlNUUklDVCB8CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC91bml4LmMgYi9saWJhdmZvcm1hdC91bml4LmMKaW5kZXggYjNkNWZhYy4uMzgwMTZkYiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdW5peC5jCisrKyBiL2xpYmF2Zm9ybWF0L3VuaXguYwpAQCAtMjMsNyArMjMsNiBAQAogICogQGZpbGUKICAqCiAgKiBVbml4IHNvY2tldCB1cmxfcHJvdG9jb2wKLSAqCiAgKi8KIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgpAQCAtNzMsNiArNzIsOSBAQAogICAgIGlmICgoZmQgPSBmZl9zb2NrZXQoQUZfVU5JWCwgcy0+dHlwZSwgMCkpIDwgMCkKICAgICAgICAgcmV0dXJuIGZmX25ldGVycm5vKCk7CiAKKyAgICBpZiAocy0+dGltZW91dCA8IDAgJiYgaC0+cndfdGltZW91dCkKKyAgICAgICAgcy0+dGltZW91dCA9IGgtPnJ3X3RpbWVvdXQgLyAxMDAwOworCiAgICAgaWYgKHMtPmxpc3RlbikgewogICAgICAgICByZXQgPSBmZl9saXN0ZW5fYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzLT5hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yocy0+YWRkciksIHMtPnRpbWVvdXQsIGgpOwpAQCAtMTA5LDYgKzExMSw4IEBACiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICByZXQgPSByZWN2KHMtPmZkLCBidWYsIHNpemUsIDApOworICAgIGlmICghcmV0ICYmIHMtPnR5cGUgPT0gU09DS19TVFJFQU0pCisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKICAgICByZXR1cm4gcmV0IDwgMCA/IGZmX25ldGVycm5vKCkgOiByZXQ7CiB9CiAKQEAgLTE0MSw3ICsxNDUsNyBAQAogICAgIHJldHVybiBzLT5mZDsKIH0KIAotVVJMUHJvdG9jb2wgZmZfdW5peF9wcm90b2NvbCA9IHsKK2NvbnN0IFVSTFByb3RvY29sIGZmX3VuaXhfcHJvdG9jb2wgPSB7CiAgICAgLm5hbWUgICAgICAgICAgICAgICAgPSAidW5peCIsCiAgICAgLnVybF9vcGVuICAgICAgICAgICAgPSB1bml4X29wZW4sCiAgICAgLnVybF9yZWFkICAgICAgICAgICAgPSB1bml4X3JlYWQsCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC91cmwtdGVzdC5jIGIvbGliYXZmb3JtYXQvdXJsLXRlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFkYTgyZS4uMDAwMDAwMAotLS0gYS9saWJhdmZvcm1hdC91cmwtdGVzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBNYXJ0aW4gU3RvcnNqbwotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSAidXJsLmgiCi0KLXN0YXRpYyB2b2lkIHRlc3QoY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqcmVsKQotewotICAgIGNoYXIgYnVmWzIwMF0sIGJ1ZjJbMjAwXTsKLSAgICBmZl9tYWtlX2Fic29sdXRlX3VybChidWYsIHNpemVvZihidWYpLCBiYXNlLCByZWwpOwotICAgIHByaW50ZigiJXNcbiIsIGJ1Zik7Ci0gICAgaWYgKGJhc2UpIHsKLSAgICAgICAgLyogVGVzdCBpbi1idWZmZXIgcmVwbGFjZW1lbnQgKi8KLSAgICAgICAgc25wcmludGYoYnVmMiwgc2l6ZW9mKGJ1ZjIpLCAiJXMiLCBiYXNlKTsKLSAgICAgICAgZmZfbWFrZV9hYnNvbHV0ZV91cmwoYnVmMiwgc2l6ZW9mKGJ1ZjIpLCBidWYyLCByZWwpOwotICAgICAgICBpZiAoc3RyY21wKGJ1ZiwgYnVmMikpIHsKLSAgICAgICAgICAgIHByaW50ZigiSW4tcGxhY2UgaGFuZGxpbmcgb2YgJXMgKyAlcyBmYWlsZWRcbiIsIGJhc2UsIHJlbCk7Ci0gICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIHRlc3QoTlVMTCwgImJheiIpOwotICAgIHRlc3QoIi9mb28vYmFyIiwgImJheiIpOwotICAgIHRlc3QoIi9mb28vYmFyIiwgIi4uL2JheiIpOwotICAgIHRlc3QoIi9mb28vYmFyIiwgIi9iYXoiKTsKLSAgICB0ZXN0KCJodHRwOi8vc2VydmVyL2Zvby8iLCAiYmF6Iik7Ci0gICAgdGVzdCgiaHR0cDovL3NlcnZlci9mb28vYmFyIiwgImJheiIpOwotICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vLyIsICIuLi9iYXoiKTsKLSAgICB0ZXN0KCJodHRwOi8vc2VydmVyL2Zvby9iYXIvMTIzIiwgIi4uLy4uL2JheiIpOwotICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vL2Jhci8xMjMiLCAiL2JheiIpOwotICAgIHRlc3QoImh0dHA6Ly9zZXJ2ZXIvZm9vL2Jhci8xMjMiLCAiaHR0cHM6Ly9vdGhlci91cmwiKTsKLSAgICB0ZXN0KCJodHRwOi8vc2VydmVyL2Zvby9iYXI/cGFyYW09dmFsdWUvd2l0aC9zbGFzaGVzIiwgIi9iYXoiKTsKLSAgICB0ZXN0KCJodHRwOi8vc2VydmVyL2Zvby9iYXI/cGFyYW0mb3RoZXJwYXJhbSIsICI/c29tZXBhcmFtIik7Ci0gICAgdGVzdCgiaHR0cDovL3NlcnZlci9mb28vYmFyIiwgIi8vb3RoZXIvdXJsIik7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC91cmwuaCBiL2xpYmF2Zm9ybWF0L3VybC5oCmluZGV4IDBiNGYyZWUuLjQ3NTBiZmYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3VybC5oCisrKyBiL2xpYmF2Zm9ybWF0L3VybC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMzgsNyArMzcsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCBVUkxDb250ZXh0IHsKICAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsgICAgLyoqPCBpbmZvcm1hdGlvbiBmb3IgYXZfbG9nKCkuIFNldCBieSB1cmxfb3BlbigpLiAqLwotICAgIHN0cnVjdCBVUkxQcm90b2NvbCAqcHJvdDsKKyAgICBjb25zdCBzdHJ1Y3QgVVJMUHJvdG9jb2wgKnByb3Q7CiAgICAgdm9pZCAqcHJpdl9kYXRhOwogICAgIGNoYXIgKmZpbGVuYW1lOyAgICAgICAgICAgICAvKio8IHNwZWNpZmllZCBVUkwgKi8KICAgICBpbnQgZmxhZ3M7CkBAIC00OCw2ICs0Nyw4IEBACiAgICAgQVZJT0ludGVycnVwdENCIGludGVycnVwdF9jYWxsYmFjazsKICAgICBpbnQ2NF90IHJ3X3RpbWVvdXQ7ICAgICAgICAgLyoqPCBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgKG5ldHdvcmspIHJlYWQvd3JpdGUgb3BlcmF0aW9uIGNvbXBsZXRpb24sIGluIG1jcyAqLwogICAgIGNvbnN0IGNoYXIgKnByb3RvY29sX3doaXRlbGlzdDsKKyAgICBjb25zdCBjaGFyICpwcm90b2NvbF9ibGFja2xpc3Q7CisgICAgaW50IG1pbl9wYWNrZXRfc2l6ZTsgICAgICAgIC8qKjwgaWYgbm9uIHplcm8sIHRoZSBzdHJlYW0gaXMgcGFja2V0aXplZCB3aXRoIHRoaXMgbWluIHBhY2tldCBzaXplICovCiB9IFVSTENvbnRleHQ7CiAKIHR5cGVkZWYgc3RydWN0IFVSTFByb3RvY29sIHsKQEAgLTc4LDEzICs3OSwxMyBAQAogICAgIGludCAgICAgKCp1cmxfd3JpdGUpKFVSTENvbnRleHQgKmgsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IHNpemUpOwogICAgIGludDY0X3QgKCp1cmxfc2VlaykoIFVSTENvbnRleHQgKmgsIGludDY0X3QgcG9zLCBpbnQgd2hlbmNlKTsKICAgICBpbnQgICAgICgqdXJsX2Nsb3NlKShVUkxDb250ZXh0ICpoKTsKLSAgICBzdHJ1Y3QgVVJMUHJvdG9jb2wgKm5leHQ7CiAgICAgaW50ICgqdXJsX3JlYWRfcGF1c2UpKFVSTENvbnRleHQgKmgsIGludCBwYXVzZSk7CiAgICAgaW50NjRfdCAoKnVybF9yZWFkX3NlZWspKFVSTENvbnRleHQgKmgsIGludCBzdHJlYW1faW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpOwogICAgIGludCAoKnVybF9nZXRfZmlsZV9oYW5kbGUpKFVSTENvbnRleHQgKmgpOwogICAgIGludCAoKnVybF9nZXRfbXVsdGlfZmlsZV9oYW5kbGUpKFVSTENvbnRleHQgKmgsIGludCAqKmhhbmRsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpudW1oYW5kbGVzKTsKKyAgICBpbnQgKCp1cmxfZ2V0X3Nob3J0X3NlZWspKFVSTENvbnRleHQgKmgpOwogICAgIGludCAoKnVybF9zaHV0ZG93bikoVVJMQ29udGV4dCAqaCwgaW50IGZsYWdzKTsKICAgICBpbnQgcHJpdl9kYXRhX3NpemU7CiAgICAgY29uc3QgQVZDbGFzcyAqcHJpdl9kYXRhX2NsYXNzOwpAQCAtMTM3LDEyICsxMzgsMTUgQEAKICAqIEBwYXJhbSBvcHRpb25zICBBIGRpY3Rpb25hcnkgZmlsbGVkIHdpdGggcHJvdG9jb2wtcHJpdmF0ZSBvcHRpb25zLiBPbiByZXR1cm4KICAqIHRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgZGVzdHJveWVkIGFuZCByZXBsYWNlZCB3aXRoIGEgZGljdCBjb250YWluaW5nIG9wdGlvbnMKICAqIHRoYXQgd2VyZSBub3QgZm91bmQuIE1heSBiZSBOVUxMLgorICogQHBhcmFtIHBhcmVudCBBbiBlbmNsb3NpbmcgVVJMQ29udGV4dCwgd2hvc2UgZ2VuZXJpYyBvcHRpb25zIHNob3VsZAorICogICAgICAgICAgICAgICBiZSBhcHBsaWVkIHRvIHRoaXMgVVJMQ29udGV4dCBhcyB3ZWxsLgogICogQHJldHVybiA+PSAwIGluIGNhc2Ugb2Ygc3VjY2VzcywgYSBuZWdhdGl2ZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGFuCiAgKiBBVkVSUk9SIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCiAgKi8KIGludCBmZnVybF9vcGVuX3doaXRlbGlzdChVUkxDb250ZXh0ICoqcHVjLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgY29uc3QgQVZJT0ludGVycnVwdENCICppbnRfY2IsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyICp3aGl0ZWxpc3QpOworICAgICAgICAgICAgICAgY29uc3QgY2hhciAqd2hpdGVsaXN0LCBjb25zdCBjaGFyKiBibGFja2xpc3QsCisgICAgICAgICAgICAgICBVUkxDb250ZXh0ICpwYXJlbnQpOwogCiBpbnQgZmZ1cmxfb3BlbihVUkxDb250ZXh0ICoqcHVjLCBjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLAogICAgICAgICAgICAgICAgY29uc3QgQVZJT0ludGVycnVwdENCICppbnRfY2IsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpOwpAQCAtMjQ3LDYgKzI1MSwxMyBAQAogaW50IGZmdXJsX2dldF9tdWx0aV9maWxlX2hhbmRsZShVUkxDb250ZXh0ICpoLCBpbnQgKipoYW5kbGVzLCBpbnQgKm51bWhhbmRsZXMpOwogCiAvKioKKyAqIFJldHVybiB0aGUgY3VycmVudCBzaG9ydCBzZWVrIHRocmVzaG9sZCB2YWx1ZSBmb3IgdGhpcyBVUkwuCisgKgorICogQHJldHVybiB0aHJlc2hvbGQgKD4wKSBvbiBzdWNjZXNzIG9yIDw9MCBvbiBlcnJvci4KKyAqLworaW50IGZmdXJsX2dldF9zaG9ydF9zZWVrKFVSTENvbnRleHQgKmgpOworCisvKioKICAqIFNpZ25hbCB0aGUgVVJMQ29udGV4dCB0aGF0IHdlIGFyZSBkb25lIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgc3RyZWFtLgogICoKICAqIEBwYXJhbSBoIHBvaW50ZXIgdG8gdGhlIHJlc291cmNlCkBAIC0yNTksMjMgKzI3MCwxMSBAQAogaW50IGZmdXJsX3NodXRkb3duKFVSTENvbnRleHQgKmgsIGludCBmbGFncyk7CiAKIC8qKgotICogUmVnaXN0ZXIgdGhlIFVSTFByb3RvY29sIHByb3RvY29sLgotICovCi1pbnQgZmZ1cmxfcmVnaXN0ZXJfcHJvdG9jb2woVVJMUHJvdG9jb2wgKnByb3RvY29sKTsKLQotLyoqCi0gKiBDaGVjayBpZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIHRvIGludGVycnVwIGEgYmxvY2tpbmcgZnVuY3Rpb24KKyAqIENoZWNrIGlmIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgdG8gaW50ZXJydXB0IGEgYmxvY2tpbmcgZnVuY3Rpb24KICAqIGFzc29jaWF0ZWQgd2l0aCBjYi4KICAqLwogaW50IGZmX2NoZWNrX2ludGVycnVwdChBVklPSW50ZXJydXB0Q0IgKmNiKTsKIAotLyoqCi0gKiBJdGVyYXRlIG92ZXIgYWxsIGF2YWlsYWJsZSBwcm90b2NvbHMuCi0gKgotICogQHBhcmFtIHByZXYgcmVzdWx0IG9mIHRoZSBwcmV2aW91cyBjYWxsIHRvIHRoaXMgZnVuY3Rpb25zIG9yIE5VTEwuCi0gKi8KLVVSTFByb3RvY29sICpmZnVybF9wcm90b2NvbF9uZXh0KGNvbnN0IFVSTFByb3RvY29sICpwcmV2KTsKLQogLyogdWRwLmMgKi8KIGludCBmZl91ZHBfc2V0X3JlbW90ZV91cmwoVVJMQ29udGV4dCAqaCwgY29uc3QgY2hhciAqdXJpKTsKIGludCBmZl91ZHBfZ2V0X2xvY2FsX3BvcnQoVVJMQ29udGV4dCAqaCk7CkBAIC0zMjMsNSArMzIyLDIyIEBACiAgKi8KIEFWSU9EaXJFbnRyeSAqZmZfYWxsb2NfZGlyX2VudHJ5KHZvaWQpOwogCitjb25zdCBBVkNsYXNzICpmZl91cmxjb250ZXh0X2NoaWxkX2NsYXNzX25leHQoY29uc3QgQVZDbGFzcyAqcHJldik7CisKKy8qKgorICogQ29uc3RydWN0IGEgbGlzdCBvZiBwcm90b2NvbHMgbWF0Y2hpbmcgYSBnaXZlbiB3aGl0ZWxpc3QgYW5kL29yIGJsYWNrbGlzdC4KKyAqCisgKiBAcGFyYW0gd2hpdGVsaXN0IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYWxsb3dlZCBwcm90b2NvbCBuYW1lcyBvciBOVUxMLiBJZgorICogICAgICAgICAgICAgICAgICB0aGlzIGlzIGEgbm9uLWVtcHR5IHN0cmluZywgb25seSBwcm90b2NvbHMgaW4gdGhpcyBsaXN0IHdpbGwKKyAqICAgICAgICAgICAgICAgICAgYmUgaW5jbHVkZWQuCisgKiBAcGFyYW0gYmxhY2tsaXN0IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZm9yYmlkZGVuIHByb3RvY29sIG5hbWVzIG9yIE5VTEwuCisgKiAgICAgICAgICAgICAgICAgIElmIHRoaXMgaXMgYSBub24tZW1wdHkgc3RyaW5nLCBhbGwgcHJvdG9jb2xzIGluIHRoaXMgbGlzdAorICogICAgICAgICAgICAgICAgICB3aWxsIGJlIGV4Y2x1ZGVkLgorICoKKyAqIEByZXR1cm4gYSBOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgbWF0Y2hpbmcgcHJvdG9jb2xzLiBUaGUgYXJyYXkgbXVzdCBiZQorICogZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqLworY29uc3QgVVJMUHJvdG9jb2wgKipmZnVybF9nZXRfcHJvdG9jb2xzKGNvbnN0IGNoYXIgKndoaXRlbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpibGFja2xpc3QpOwogCiAjZW5kaWYgLyogQVZGT1JNQVRfVVJMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3V0aWxzLmMgYi9saWJhdmZvcm1hdC91dGlscy5jCmluZGV4IDEyOWE0OWQuLjU4ZWNhYWIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3V0aWxzLmMKKysrIGIvbGliYXZmb3JtYXQvdXRpbHMuYwpAQCAtMzIsNyArMzIsOSBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGFyc2V1dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXN0YW1wLmgiCiAKICNpbmNsdWRlICJsaWJhdmNvZGVjL2J5dGVzdHJlYW0uaCIKQEAgLTU0LDYgKzU2LDggQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvZmZ2ZXJzaW9uLmgiCiBjb25zdCBjaGFyIGF2X2Zvcm1hdF9mZnZlcnNpb25bXSA9ICJGRm1wZWcgdmVyc2lvbiAiIEZGTVBFR19WRVJTSU9OOwogCitzdGF0aWMgQVZNdXRleCBhdmZvcm1hdF9tdXRleCA9IEFWX01VVEVYX0lOSVRJQUxJWkVSOworCiAvKioKICAqIEBmaWxlCiAgKiB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB1c2Ugd2l0aGluIEZGbXBlZwpAQCAtNzYsNiArODAsMTYgQEAKICAgICByZXR1cm4gTElDRU5TRV9QUkVGSVggRkZNUEVHX0xJQ0VOU0UgKyBzaXplb2YoTElDRU5TRV9QUkVGSVgpIC0gMTsKIH0KIAoraW50IGZmX2xvY2tfYXZmb3JtYXQodm9pZCkKK3sKKyAgICByZXR1cm4gZmZfbXV0ZXhfbG9jaygmYXZmb3JtYXRfbXV0ZXgpID8gLTEgOiAwOworfQorCitpbnQgZmZfdW5sb2NrX2F2Zm9ybWF0KHZvaWQpCit7CisgICAgcmV0dXJuIGZmX211dGV4X3VubG9jaygmYXZmb3JtYXRfbXV0ZXgpID8gLTEgOiAwOworfQorCiAjZGVmaW5lIFJFTEFUSVZFX1RTX0JBU0UgKElOVDY0X01BWCAtICgxTEw8PDQ4KSkKIAogc3RhdGljIGludCBpc19yZWxhdGl2ZShpbnQ2NF90IHRzKSB7CkBAIC04OSw3ICsxMDMsNyBAQAogICogQHBhcmFtIHRpbWVzdGFtcCB0aGUgdGltZSBzdGFtcCB0byB3cmFwCiAgKiBAcmV0dXJuIHJlc3VsdGluZyB0aW1lIHN0YW1wCiAgKi8KLXN0YXRpYyBpbnQ2NF90IHdyYXBfdGltZXN0YW1wKEFWU3RyZWFtICpzdCwgaW50NjRfdCB0aW1lc3RhbXApCitzdGF0aWMgaW50NjRfdCB3cmFwX3RpbWVzdGFtcChjb25zdCBBVlN0cmVhbSAqc3QsIGludDY0X3QgdGltZXN0YW1wKQogewogICAgIGlmIChzdC0+cHRzX3dyYXBfYmVoYXZpb3IgIT0gQVZfUFRTX1dSQVBfSUdOT1JFICYmCiAgICAgICAgIHN0LT5wdHNfd3JhcF9yZWZlcmVuY2UgIT0gQVZfTk9QVFNfVkFMVUUgJiYgdGltZXN0YW1wICE9IEFWX05PUFRTX1ZBTFVFKSB7CkBAIC0xMDMsOCArMTE3LDEzIEBACiAgICAgcmV0dXJuIHRpbWVzdGFtcDsKIH0KIAorI2lmIEZGX0FQSV9GT1JNQVRfR0VUX1NFVAogTUFLRV9BQ0NFU1NPUlMoQVZTdHJlYW0sIHN0cmVhbSwgQVZSYXRpb25hbCwgcl9mcmFtZV9yYXRlKQorI2lmIEZGX0FQSV9MQVZGX0ZGU0VSVkVSCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiBNQUtFX0FDQ0VTU09SUyhBVlN0cmVhbSwgc3RyZWFtLCBjaGFyICosIHJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbikKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCiBNQUtFX0FDQ0VTU09SUyhBVkZvcm1hdENvbnRleHQsIGZvcm1hdCwgQVZDb2RlYyAqLCB2aWRlb19jb2RlYykKIE1BS0VfQUNDRVNTT1JTKEFWRm9ybWF0Q29udGV4dCwgZm9ybWF0LCBBVkNvZGVjICosIGF1ZGlvX2NvZGVjKQogTUFLRV9BQ0NFU1NPUlMoQVZGb3JtYXRDb250ZXh0LCBmb3JtYXQsIEFWQ29kZWMgKiwgc3VidGl0bGVfY29kZWMpCkBAIC0xMTcsMTEgKzEzNiwxMiBAQAogTUFLRV9BQ0NFU1NPUlMoQVZGb3JtYXRDb250ZXh0LCBmb3JtYXQsIEFWT3BlbkNhbGxiYWNrLCBvcGVuX2NiKQogRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAjZW5kaWYKKyNlbmRpZgogCiBpbnQ2NF90IGF2X3N0cmVhbV9nZXRfZW5kX3B0cyhjb25zdCBBVlN0cmVhbSAqc3QpCiB7Ci0gICAgaWYgKHN0LT5wcml2X3B0cykgewotICAgICAgICByZXR1cm4gc3QtPnByaXZfcHRzLT52YWw7CisgICAgaWYgKHN0LT5pbnRlcm5hbC0+cHJpdl9wdHMpIHsKKyAgICAgICAgcmV0dXJuIHN0LT5pbnRlcm5hbC0+cHJpdl9wdHMtPnZhbDsKICAgICB9IGVsc2UKICAgICAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOwogfQpAQCAtMTQxLDI5ICsxNjEsMzYgQEAKICAgICB9CiB9CiAKLWludCBmZl9jb3B5X3doaXRlbGlzdHMoQVZGb3JtYXRDb250ZXh0ICpkc3QsIEFWRm9ybWF0Q29udGV4dCAqc3JjKQoraW50IGZmX2NvcHlfd2hpdGVibGFja2xpc3RzKEFWRm9ybWF0Q29udGV4dCAqZHN0LCBjb25zdCBBVkZvcm1hdENvbnRleHQgKnNyYykKIHsKICAgICBhdl9hc3NlcnQwKCFkc3QtPmNvZGVjX3doaXRlbGlzdCAmJgogICAgICAgICAgICAgICAgIWRzdC0+Zm9ybWF0X3doaXRlbGlzdCAmJgotICAgICAgICAgICAgICAgIWRzdC0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICAgICAgICAgICAgICFkc3QtPnByb3RvY29sX3doaXRlbGlzdCAmJgorICAgICAgICAgICAgICAgIWRzdC0+cHJvdG9jb2xfYmxhY2tsaXN0KTsKICAgICBkc3QtPiBjb2RlY193aGl0ZWxpc3QgPSBhdl9zdHJkdXAoc3JjLT5jb2RlY193aGl0ZWxpc3QpOwogICAgIGRzdC0+Zm9ybWF0X3doaXRlbGlzdCA9IGF2X3N0cmR1cChzcmMtPmZvcm1hdF93aGl0ZWxpc3QpOwogICAgIGRzdC0+cHJvdG9jb2xfd2hpdGVsaXN0ID0gYXZfc3RyZHVwKHNyYy0+cHJvdG9jb2xfd2hpdGVsaXN0KTsKKyAgICBkc3QtPnByb3RvY29sX2JsYWNrbGlzdCA9IGF2X3N0cmR1cChzcmMtPnByb3RvY29sX2JsYWNrbGlzdCk7CiAgICAgaWYgKCAgIChzcmMtPiBjb2RlY193aGl0ZWxpc3QgJiYgIWRzdC0+IGNvZGVjX3doaXRlbGlzdCkKICAgICAgICAgfHwgKHNyYy0+ICBmb3JtYXRfd2hpdGVsaXN0ICYmICFkc3QtPiAgZm9ybWF0X3doaXRlbGlzdCkKLSAgICAgICAgfHwgKHNyYy0+cHJvdG9jb2xfd2hpdGVsaXN0ICYmICFkc3QtPnByb3RvY29sX3doaXRlbGlzdCkpIHsKLSAgICAgICAgYXZfbG9nKGRzdCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGR1cGxpY2F0ZSB3aGl0ZWxpc3RcbiIpOworICAgICAgICB8fCAoc3JjLT5wcm90b2NvbF93aGl0ZWxpc3QgJiYgIWRzdC0+cHJvdG9jb2xfd2hpdGVsaXN0KQorICAgICAgICB8fCAoc3JjLT5wcm90b2NvbF9ibGFja2xpc3QgJiYgIWRzdC0+cHJvdG9jb2xfYmxhY2tsaXN0KSkgeworICAgICAgICBhdl9sb2coZHN0LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZHVwbGljYXRlIGJsYWNrL3doaXRlbGlzdFxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgQVZDb2RlYyAqZmluZF9kZWNvZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3N0YXRpYyBjb25zdCBBVkNvZGVjICpmaW5kX2RlY29kZXIoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBBVlN0cmVhbSAqc3QsIGVudW0gQVZDb2RlY0lEIGNvZGVjX2lkKQogeworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWMpCiAgICAgICAgIHJldHVybiBzdC0+Y29kZWMtPmNvZGVjOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKIAotICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpIHsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKICAgICAgICAgaWYgKHMtPnZpZGVvX2NvZGVjKSAgICByZXR1cm4gcy0+dmlkZW9fY29kZWM7CiAgICAgICAgIGJyZWFrOwpAQCAtMTc4LDEwICsyMDUsNDEgQEAKICAgICByZXR1cm4gYXZjb2RlY19maW5kX2RlY29kZXIoY29kZWNfaWQpOwogfQogCitzdGF0aWMgY29uc3QgQVZDb2RlYyAqZmluZF9wcm9iZV9kZWNvZGVyKEFWRm9ybWF0Q29udGV4dCAqcywgY29uc3QgQVZTdHJlYW0gKnN0LCBlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3sKKyAgICBjb25zdCBBVkNvZGVjICpjb2RlYzsKKworI2lmIENPTkZJR19IMjY0X0RFQ09ERVIKKyAgICAvKiBPdGhlciBwYXJ0cyBvZiB0aGUgY29kZSBhc3N1bWUgdGhpcyBkZWNvZGVyIHRvIGJlIHVzZWQgZm9yIGgyNjQsCisgICAgICogc28gZm9yY2UgaXQgaWYgcG9zc2libGUuICovCisgICAgaWYgKGNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpCisgICAgICAgIHJldHVybiBhdmNvZGVjX2ZpbmRfZGVjb2Rlcl9ieV9uYW1lKCJoMjY0Iik7CisjZW5kaWYKKworICAgIGNvZGVjID0gZmluZF9kZWNvZGVyKHMsIHN0LCBjb2RlY19pZCk7CisgICAgaWYgKCFjb2RlYykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoY29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9BVk9JRF9QUk9CSU5HKSB7CisgICAgICAgIGNvbnN0IEFWQ29kZWMgKnByb2JlX2NvZGVjID0gTlVMTDsKKyAgICAgICAgd2hpbGUgKHByb2JlX2NvZGVjID0gYXZfY29kZWNfbmV4dChwcm9iZV9jb2RlYykpIHsKKyAgICAgICAgICAgIGlmIChwcm9iZV9jb2RlYy0+aWQgPT0gY29kZWNfaWQgJiYKKyAgICAgICAgICAgICAgICAgICAgYXZfY29kZWNfaXNfZGVjb2Rlcihwcm9iZV9jb2RlYykgJiYKKyAgICAgICAgICAgICAgICAgICAgIShwcm9iZV9jb2RlYy0+Y2FwYWJpbGl0aWVzICYgKEFWX0NPREVDX0NBUF9BVk9JRF9QUk9CSU5HIHwgQVZfQ09ERUNfQ0FQX0VYUEVSSU1FTlRBTCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2JlX2NvZGVjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGNvZGVjOworfQorCisjaWYgRkZfQVBJX0ZPUk1BVF9HRVRfU0VUCiBpbnQgYXZfZm9ybWF0X2dldF9wcm9iZV9zY29yZShjb25zdCBBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgcmV0dXJuIHMtPnByb2JlX3Njb3JlOwogfQorI2VuZGlmCiAKIC8qIGFuIGFyYml0cmFyaWx5IGNob3NlbiAic2FuZSIgbWF4IHBhY2tldCBzaXplIC0tIDUwTSAqLwogI2RlZmluZSBTQU5FX0NIVU5LX1NJWkUgKDUwMDAwMDAwKQpAQCAtMjgzLDIxICszNDEsMjUgQEAKICAgICB9IGZtdF9pZF90eXBlW10gPSB7CiAgICAgICAgIHsgImFhYyIsICAgICAgIEFWX0NPREVDX0lEX0FBQywgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTyB9LAogICAgICAgICB7ICJhYzMiLCAgICAgICBBVl9DT0RFQ19JRF9BQzMsICAgICAgICBBVk1FRElBX1RZUEVfQVVESU8gfSwKKyAgICAgICAgeyAiYXB0eCIsICAgICAgQVZfQ09ERUNfSURfQVBUWCwgICAgICAgQVZNRURJQV9UWVBFX0FVRElPIH0sCiAgICAgICAgIHsgImR0cyIsICAgICAgIEFWX0NPREVDX0lEX0RUUywgICAgICAgIEFWTUVESUFfVFlQRV9BVURJTyB9LAogICAgICAgICB7ICJkdmJzdWIiLCAgICBBVl9DT0RFQ19JRF9EVkJfU1VCVElUTEUsQVZNRURJQV9UWVBFX1NVQlRJVExFIH0sCisgICAgICAgIHsgImR2YnR4dCIsICAgIEFWX0NPREVDX0lEX0RWQl9URUxFVEVYVCxBVk1FRElBX1RZUEVfU1VCVElUTEUgfSwKICAgICAgICAgeyAiZWFjMyIsICAgICAgQVZfQ09ERUNfSURfRUFDMywgICAgICAgQVZNRURJQV9UWVBFX0FVRElPIH0sCiAgICAgICAgIHsgImgyNjQiLCAgICAgIEFWX0NPREVDX0lEX0gyNjQsICAgICAgIEFWTUVESUFfVFlQRV9WSURFTyB9LAogICAgICAgICB7ICJoZXZjIiwgICAgICBBVl9DT0RFQ19JRF9IRVZDLCAgICAgICBBVk1FRElBX1RZUEVfVklERU8gfSwKICAgICAgICAgeyAibG9hcyIsICAgICAgQVZfQ09ERUNfSURfQUFDX0xBVE0sICAgQVZNRURJQV9UWVBFX0FVRElPIH0sCiAgICAgICAgIHsgIm00diIsICAgICAgIEFWX0NPREVDX0lEX01QRUc0LCAgICAgIEFWTUVESUFfVFlQRV9WSURFTyB9LAorICAgICAgICB7ICJtanBlZ18yMDAwIixBVl9DT0RFQ19JRF9KUEVHMjAwMCwgICBBVk1FRElBX1RZUEVfVklERU8gfSwKICAgICAgICAgeyAibXAzIiwgICAgICAgQVZfQ09ERUNfSURfTVAzLCAgICAgICAgQVZNRURJQV9UWVBFX0FVRElPIH0sCiAgICAgICAgIHsgIm1wZWd2aWRlbyIsIEFWX0NPREVDX0lEX01QRUcyVklERU8sIEFWTUVESUFfVFlQRV9WSURFTyB9LAorICAgICAgICB7ICJ0cnVlaGQiLCAgICBBVl9DT0RFQ19JRF9UUlVFSEQsICAgICBBVk1FRElBX1RZUEVfQVVESU8gfSwKICAgICAgICAgeyAwIH0KICAgICB9OwogICAgIGludCBzY29yZTsKICAgICBBVklucHV0Rm9ybWF0ICpmbXQgPSBhdl9wcm9iZV9pbnB1dF9mb3JtYXQzKHBkLCAxLCAmc2NvcmUpOwogCi0gICAgaWYgKGZtdCAmJiBzdC0+cmVxdWVzdF9wcm9iZSA8PSBzY29yZSkgeworICAgIGlmIChmbXQpIHsKICAgICAgICAgaW50IGk7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsCiAgICAgICAgICAgICAgICAiUHJvYmUgd2l0aCBzaXplPSVkLCBwYWNrZXRzPSVkIGRldGVjdGVkICVzIHdpdGggc2NvcmU9JWRcbiIsCkBAIC0zMDUsOCArMzY3LDIxIEBACiAgICAgICAgICAgICAgICBmbXQtPm5hbWUsIHNjb3JlKTsKICAgICAgICAgZm9yIChpID0gMDsgZm10X2lkX3R5cGVbaV0ubmFtZTsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoIXN0cmNtcChmbXQtPm5hbWUsIGZtdF9pZF90eXBlW2ldLm5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gZm10X2lkX3R5cGVbaV0uaWQ7Ci0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gZm10X2lkX3R5cGVbaV0udHlwZTsKKyAgICAgICAgICAgICAgICBpZiAoZm10X2lkX3R5cGVbaV0udHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8gJiYKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKHN0LT5yZXF1ZXN0X3Byb2JlID4gc2NvcmUgJiYKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBmbXRfaWRfdHlwZVtpXS5pZCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgID0gZm10X2lkX3R5cGVbaV0uaWQ7CisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gZm10X2lkX3R5cGVbaV0udHlwZTsKKyAgICAgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUgPSAxOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlOworICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQ7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogICAgICAgICAgICAgICAgIHJldHVybiBzY29yZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMzY5LDggKzQ0NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLCAwLCBzLT5mb3JtYXRfcHJvYmVzaXplKTsKIH0KIAotc3RhdGljIGludCBhZGRfdG9fcGt0YnVmKEFWUGFja2V0TGlzdCAqKnBhY2tldF9idWZmZXIsIEFWUGFja2V0ICpwa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXRMaXN0ICoqcGxhc3RfcGt0bCwgaW50IHJlZikKK2ludCBmZl9wYWNrZXRfbGlzdF9wdXQoQVZQYWNrZXRMaXN0ICoqcGFja2V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXRMaXN0ICoqcGxhc3RfcGt0bCwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXQgICAgICAqcGt0LCBpbnQgZmxhZ3MpCiB7CiAgICAgQVZQYWNrZXRMaXN0ICpwa3RsID0gYXZfbWFsbG9jeihzaXplb2YoQVZQYWNrZXRMaXN0KSk7CiAgICAgaW50IHJldDsKQEAgLTM3OCwxMiArNDU0LDE1IEBACiAgICAgaWYgKCFwa3RsKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgaWYgKHJlZikgeworICAgIGlmIChmbGFncyAmIEZGX1BBQ0tFVExJU1RfRkxBR19SRUZfUEFDS0VUKSB7CiAgICAgICAgIGlmICgocmV0ID0gYXZfcGFja2V0X3JlZigmcGt0bC0+cGt0LCBwa3QpKSA8IDApIHsKICAgICAgICAgICAgIGF2X2ZyZWUocGt0bCk7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogQWRhcHQgY2FsbGVycyBpbiB0aGlzIGZpbGUgc28gdGhlIGxpbmUgYmVsb3cgY2FuIHVzZQorICAgICAgICAvLyAgICAgICBhdl9wYWNrZXRfbW92ZV9yZWYoKSB0byBlZmZlY3RpdmVseSBtb3ZlIHRoZSByZWZlcmVuY2UKKyAgICAgICAgLy8gICAgICAgdG8gdGhlIGxpc3QuCiAgICAgICAgIHBrdGwtPnBrdCA9ICpwa3Q7CiAgICAgfQogCkBAIC00MTAsMjAgKzQ4OSw1NiBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXQgPSBhZGRfdG9fcGt0YnVmKCZzLT5pbnRlcm5hbC0+cmF3X3BhY2tldF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5zdHJlYW1zW2ldLT5hdHRhY2hlZF9waWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcm5hbC0+cmF3X3BhY2tldF9idWZmZXJfZW5kLCAxKTsKKyAgICAgICAgICAgIHJldCA9IGZmX3BhY2tldF9saXN0X3B1dCgmcy0+aW50ZXJuYWwtPnJhd19wYWNrZXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcm5hbC0+cmF3X3BhY2tldF9idWZmZXJfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5zdHJlYW1zW2ldLT5hdHRhY2hlZF9waWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkZfUEFDS0VUTElTVF9GTEFHX1JFRl9QQUNLRVQpOwogICAgICAgICAgICAgaWYgKHJldCA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgIHJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHVwZGF0ZV9zdHJlYW1fYXZjdHgoQVZGb3JtYXRDb250ZXh0ICpzKQoreworICAgIGludCBpLCByZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW2ldOworCisgICAgICAgIGlmICghc3QtPmludGVybmFsLT5uZWVkX2NvbnRleHRfdXBkYXRlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLyogY2xvc2UgcGFyc2VyLCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gdGhlIGNvZGVjICovCisgICAgICAgIGlmIChzdC0+cGFyc2VyICYmIHN0LT5pbnRlcm5hbC0+YXZjdHgtPmNvZGVjX2lkICE9IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpIHsKKyAgICAgICAgICAgIGF2X3BhcnNlcl9jbG9zZShzdC0+cGFyc2VyKTsKKyAgICAgICAgICAgIHN0LT5wYXJzZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgLyogdXBkYXRlIGludGVybmFsIGNvZGVjIGNvbnRleHQsIGZvciB0aGUgcGFyc2VyICovCisgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc190b19jb250ZXh0KHN0LT5pbnRlcm5hbC0+YXZjdHgsIHN0LT5jb2RlY3Bhcik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIC8qIHVwZGF0ZSBkZXByZWNhdGVkIHB1YmxpYyBjb2RlYyBjb250ZXh0ICovCisgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc190b19jb250ZXh0KHN0LT5jb2RlYywgc3QtPmNvZGVjcGFyKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworICAgICAgICBzdC0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUgPSAwOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCiBpbnQgYXZmb3JtYXRfb3Blbl9pbnB1dChBVkZvcm1hdENvbnRleHQgKipwcywgY29uc3QgY2hhciAqZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBBVklucHV0Rm9ybWF0ICpmbXQsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCiB7CiAgICAgQVZGb3JtYXRDb250ZXh0ICpzID0gKnBzOwotICAgIGludCByZXQgPSAwOworICAgIGludCBpLCByZXQgPSAwOwogICAgIEFWRGljdGlvbmFyeSAqdG1wID0gTlVMTDsKICAgICBJRDN2MkV4dHJhTWV0YSAqaWQzdjJfZXh0cmFfbWV0YSA9IE5VTEw7CiAKQEAgLTQ0NSw2ICs1NjAsMTYgQEAKICAgICBpZiAoKHJldCA9IGF2X29wdF9zZXRfZGljdChzLCAmdG1wKSkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKKyAgICBpZiAoIShzLT51cmwgPSBhdl9zdHJkdXAoZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICIiKSkpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisjaWYgRkZfQVBJX0ZPUk1BVF9GSUxFTkFNRQorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgIGF2X3N0cmxjcHkocy0+ZmlsZW5hbWUsIGZpbGVuYW1lID8gZmlsZW5hbWUgOiAiIiwgc2l6ZW9mKHMtPmZpbGVuYW1lKSk7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogICAgIGlmICgocmV0ID0gaW5pdF9pbnB1dChzLCBmaWxlbmFtZSwgJnRtcCkpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogICAgIHMtPnByb2JlX3Njb3JlID0gcmV0OwpAQCAtNDU3LDYgKzU4MiwxNCBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgaWYgKCFzLT5wcm90b2NvbF9ibGFja2xpc3QgJiYgcy0+cGIgJiYgcy0+cGItPnByb3RvY29sX2JsYWNrbGlzdCkgeworICAgICAgICBzLT5wcm90b2NvbF9ibGFja2xpc3QgPSBhdl9zdHJkdXAocy0+cGItPnByb3RvY29sX2JsYWNrbGlzdCk7CisgICAgICAgIGlmICghcy0+cHJvdG9jb2xfYmxhY2tsaXN0KSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAocy0+Zm9ybWF0X3doaXRlbGlzdCAmJiBhdl9tYXRjaF9saXN0KHMtPmlmb3JtYXQtPm5hbWUsIHMtPmZvcm1hdF93aGl0ZWxpc3QsICcsJykgPD0gMCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRm9ybWF0IG5vdCBvbiB3aGl0ZWxpc3QgXCclc1wnXG4iLCBzLT5mb3JtYXRfd2hpdGVsaXN0KTsKICAgICAgICAgcmV0ID0gQVZFUlJPUihFSU5WQUwpOwpAQCAtNDc0LDcgKzYwNyw2IEBACiAgICAgfQogCiAgICAgcy0+ZHVyYXRpb24gPSBzLT5zdGFydF90aW1lID0gQVZfTk9QVFNfVkFMVUU7Ci0gICAgYXZfc3RybGNweShzLT5maWxlbmFtZSwgZmlsZW5hbWUgPyBmaWxlbmFtZSA6ICIiLCBzaXplb2Yocy0+ZmlsZW5hbWUpKTsKIAogICAgIC8qIEFsbG9jYXRlIHByaXZhdGUgZGF0YS4gKi8KICAgICBpZiAocy0+aWZvcm1hdC0+cHJpdl9kYXRhX3NpemUgPiAwKSB7CkBAIC00OTIsMTcgKzYyNCwzNSBAQAogCiAgICAgLyogZS5nLiBBVkZNVF9OT0ZJTEUgZm9ybWF0cyB3aWxsIG5vdCBoYXZlIGEgQVZJT0NvbnRleHQgKi8KICAgICBpZiAocy0+cGIpCi0gICAgICAgIGZmX2lkM3YyX3JlYWQocywgSUQzdjJfREVGQVVMVF9NQUdJQywgJmlkM3YyX2V4dHJhX21ldGEsIDApOworICAgICAgICBmZl9pZDN2Ml9yZWFkX2RpY3Qocy0+cGIsICZzLT5pbnRlcm5hbC0+aWQzdjJfbWV0YSwgSUQzdjJfREVGQVVMVF9NQUdJQywgJmlkM3YyX2V4dHJhX21ldGEpOworCiAKICAgICBpZiAoIShzLT5mbGFncyZBVkZNVF9GTEFHX1BSSVZfT1BUKSAmJiBzLT5pZm9ybWF0LT5yZWFkX2hlYWRlcikKICAgICAgICAgaWYgKChyZXQgPSBzLT5pZm9ybWF0LT5yZWFkX2hlYWRlcihzKSkgPCAwKQogICAgICAgICAgICAgZ290byBmYWlsOwogCisgICAgaWYgKCFzLT5tZXRhZGF0YSkgeworICAgICAgICBzLT5tZXRhZGF0YSA9IHMtPmludGVybmFsLT5pZDN2Ml9tZXRhOworICAgICAgICBzLT5pbnRlcm5hbC0+aWQzdjJfbWV0YSA9IE5VTEw7CisgICAgfSBlbHNlIGlmIChzLT5pbnRlcm5hbC0+aWQzdjJfbWV0YSkgeworICAgICAgICBpbnQgbGV2ZWwgPSBBVl9MT0dfV0FSTklORzsKKyAgICAgICAgaWYgKHMtPmVycm9yX3JlY29nbml0aW9uICYgQVZfRUZfQ09NUExJQU5UKQorICAgICAgICAgICAgbGV2ZWwgPSBBVl9MT0dfRVJST1I7CisgICAgICAgIGF2X2xvZyhzLCBsZXZlbCwgIkRpc2NhcmRpbmcgSUQzIHRhZ3MgYmVjYXVzZSBtb3JlIHN1aXRhYmxlIHRhZ3Mgd2VyZSBmb3VuZC5cbiIpOworICAgICAgICBhdl9kaWN0X2ZyZWUoJnMtPmludGVybmFsLT5pZDN2Ml9tZXRhKTsKKyAgICAgICAgaWYgKHMtPmVycm9yX3JlY29nbml0aW9uICYgQVZfRUZfRVhQTE9ERSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgIH0KKwogICAgIGlmIChpZDN2Ml9leHRyYV9tZXRhKSB7CiAgICAgICAgIGlmICghc3RyY21wKHMtPmlmb3JtYXQtPm5hbWUsICJtcDMiKSB8fCAhc3RyY21wKHMtPmlmb3JtYXQtPm5hbWUsICJhYWMiKSB8fAogICAgICAgICAgICAgIXN0cmNtcChzLT5pZm9ybWF0LT5uYW1lLCAidHRhIikpIHsKICAgICAgICAgICAgIGlmICgocmV0ID0gZmZfaWQzdjJfcGFyc2VfYXBpYyhzLCAmaWQzdjJfZXh0cmFfbWV0YSkpIDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2lkM3YyX3BhcnNlX2NoYXB0ZXJzKHMsICZpZDN2Ml9leHRyYV9tZXRhKSkgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIGlmICgocmV0ID0gZmZfaWQzdjJfcGFyc2VfcHJpdihzLCAmaWQzdjJfZXh0cmFfbWV0YSkpIDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgImRlbXV4ZXIgZG9lcyBub3Qgc3VwcG9ydCBhZGRpdGlvbmFsIGlkMyBkYXRhLCBza2lwcGluZ1xuIik7CiAgICAgfQpAQCAtNTE2LDYgKzY2NiwxMSBAQAogCiAgICAgcy0+aW50ZXJuYWwtPnJhd19wYWNrZXRfYnVmZmVyX3JlbWFpbmluZ19zaXplID0gUkFXX1BBQ0tFVF9CVUZGRVJfU0laRTsKIAorICAgIHVwZGF0ZV9zdHJlYW1fYXZjdHgocyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKQorICAgICAgICBzLT5zdHJlYW1zW2ldLT5pbnRlcm5hbC0+b3JpZ19jb2RlY19pZCA9IHMtPnN0cmVhbXNbaV0tPmNvZGVjcGFyLT5jb2RlY19pZDsKKwogICAgIGlmIChvcHRpb25zKSB7CiAgICAgICAgIGF2X2RpY3RfZnJlZShvcHRpb25zKTsKICAgICAgICAgKm9wdGlvbnMgPSB0bXA7CkBAIC01MzcsMTggKzY5MiwyMiBAQAogCiBzdGF0aWMgdm9pZCBmb3JjZV9jb2RlY19pZHMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QpCiB7Ci0gICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICBzd2l0Y2ggKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSkgewogICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgogICAgICAgICBpZiAocy0+dmlkZW9fY29kZWNfaWQpCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gcy0+dmlkZW9fY29kZWNfaWQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gcy0+dmlkZW9fY29kZWNfaWQ7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgogICAgICAgICBpZiAocy0+YXVkaW9fY29kZWNfaWQpCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gcy0+YXVkaW9fY29kZWNfaWQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gcy0+YXVkaW9fY29kZWNfaWQ7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgogICAgICAgICBpZiAocy0+c3VidGl0bGVfY29kZWNfaWQpCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gcy0+c3VidGl0bGVfY29kZWNfaWQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gcy0+c3VidGl0bGVfY29kZWNfaWQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZNRURJQV9UWVBFX0RBVEE6CisgICAgICAgIGlmIChzLT5kYXRhX2NvZGVjX2lkKQorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IHMtPmRhdGFfY29kZWNfaWQ7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KQEAgLTU4NywxMiArNzQ2LDEyIEBACiAKICAgICAgICAgaWYgKGVuZCB8fCBhdl9sb2cyKHBkLT5idWZfc2l6ZSkgIT0gYXZfbG9nMihwZC0+YnVmX3NpemUgLSBwa3QtPnNpemUpKSB7CiAgICAgICAgICAgICBpbnQgc2NvcmUgPSBzZXRfY29kZWNfZnJvbV9wcm9iZV9kYXRhKHMsIHN0LCBwZCk7Ci0gICAgICAgICAgICBpZiAoICAgIChzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkUgJiYgc2NvcmUgPiBBVlBST0JFX1NDT1JFX1NUUkVBTV9SRVRSWSkKKyAgICAgICAgICAgIGlmICggICAgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSAmJiBzY29yZSA+IEFWUFJPQkVfU0NPUkVfU1RSRUFNX1JFVFJZKQogICAgICAgICAgICAgICAgIHx8IGVuZCkgewogICAgICAgICAgICAgICAgIHBkLT5idWZfc2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnBkLT5idWYpOwogICAgICAgICAgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlID0gLTE7Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInByb2JlZCBzdHJlYW0gJWRcbiIsIHN0LT5pbmRleCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInByb2JlZCBzdHJlYW0gJWQgZmFpbGVkXG4iLCBzdC0+aW5kZXgpOwpAQCAtNzA1LDcgKzg2NCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgaWYgKHN0LT5wcm9iZV9wYWNrZXRzKQorICAgICAgICAgICAgICAgIGlmIChzdC0+cHJvYmVfcGFja2V0cyB8fCBzdC0+cmVxdWVzdF9wcm9iZSA+IDApCiAgICAgICAgICAgICAgICAgICAgIGlmICgoZXJyID0gcHJvYmVfY29kZWMocywgc3QsIE5VTEwpKSA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoc3QtPnJlcXVlc3RfcHJvYmUgPD0gMCk7CkBAIC03MTMsMTMgKzg3Miw5IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghcGt0LT5idWYpIHsKLSAgICAgICAgICAgIEFWUGFja2V0IHRtcCA9IHsgMCB9OwotICAgICAgICAgICAgcmV0ID0gYXZfcGFja2V0X3JlZigmdG1wLCBwa3QpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICpwa3QgPSB0bXA7Ci0gICAgICAgIH0KKyAgICAgICAgZXJyID0gYXZfcGFja2V0X21ha2VfcmVmY291bnRlZChwa3QpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CiAKICAgICAgICAgaWYgKChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfRElTQ0FSRF9DT1JSVVBUKSAmJgogICAgICAgICAgICAgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19DT1JSVVBUKSkgewpAQCAtNzU5LDggKzkxNCw5IEBACiAgICAgICAgIGlmICghcGt0bCAmJiBzdC0+cmVxdWVzdF9wcm9iZSA8PSAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKIAotICAgICAgICBlcnIgPSBhZGRfdG9fcGt0YnVmKCZzLT5pbnRlcm5hbC0+cmF3X3BhY2tldF9idWZmZXIsIHBrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJuYWwtPnJhd19wYWNrZXRfYnVmZmVyX2VuZCwgMCk7CisgICAgICAgIGVyciA9IGZmX3BhY2tldF9saXN0X3B1dCgmcy0+aW50ZXJuYWwtPnJhd19wYWNrZXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVybmFsLT5yYXdfcGFja2V0X2J1ZmZlcl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QsIDApOwogICAgICAgICBpZiAoZXJyKQogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgcy0+aW50ZXJuYWwtPnJhd19wYWNrZXRfYnVmZmVyX3JlbWFpbmluZ19zaXplIC09IHBrdC0+c2l6ZTsKQEAgLTc3NSwxMiArOTMxLDE0IEBACiAKIHN0YXRpYyBpbnQgZGV0ZXJtaW5hYmxlX2ZyYW1lX3NpemUoQVZDb2RlY0NvbnRleHQgKmF2Y3R4KQogewotICAgIGlmICgvKmF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMgfHwqLwotICAgICAgICBhdmN0eC0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVAxIHx8Ci0gICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUDIgfHwKLSAgICAgICAgYXZjdHgtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QMy8qIHx8Ci0gICAgICAgIGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9DRUxUKi8pCisgICAgc3dpdGNoKGF2Y3R4LT5jb2RlY19pZCkgeworICAgIGNhc2UgQVZfQ09ERUNfSURfTVAxOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVAyOgorICAgIGNhc2UgQVZfQ09ERUNfSURfTVAzOgorICAgIGNhc2UgQVZfQ09ERUNfSURfQ09ERUMyOgogICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNzkwLDEzICs5NDgsMjAgQEAKIHZvaWQgZmZfY29tcHV0ZV9mcmFtZV9kdXJhdGlvbihBVkZvcm1hdENvbnRleHQgKnMsIGludCAqcG51bSwgaW50ICpwZGVuLCBBVlN0cmVhbSAqc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY1BhcnNlckNvbnRleHQgKnBjLCBBVlBhY2tldCAqcGt0KQogewotICAgIEFWUmF0aW9uYWwgY29kZWNfZnJhbWVyYXRlID0gcy0+aWZvcm1hdCA/IHN0LT5jb2RlYy0+ZnJhbWVyYXRlIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9tdWxfcShhdl9pbnZfcShzdC0+Y29kZWMtPnRpbWVfYmFzZSksIChBVlJhdGlvbmFsKXsxLCBzdC0+Y29kZWMtPnRpY2tzX3Blcl9mcmFtZX0pOwotICAgIGludCBmcmFtZV9zaXplOworICAgIEFWUmF0aW9uYWwgY29kZWNfZnJhbWVyYXRlID0gcy0+aWZvcm1hdCA/IHN0LT5pbnRlcm5hbC0+YXZjdHgtPmZyYW1lcmF0ZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbXVsX3EoYXZfaW52X3Eoc3QtPmludGVybmFsLT5hdmN0eC0+dGltZV9iYXNlKSwgKEFWUmF0aW9uYWwpezEsIHN0LT5pbnRlcm5hbC0+YXZjdHgtPnRpY2tzX3Blcl9mcmFtZX0pOworICAgIGludCBmcmFtZV9zaXplLCBzYW1wbGVfcmF0ZTsKKworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgaWYgKCghY29kZWNfZnJhbWVyYXRlLmRlbiB8fCAhY29kZWNfZnJhbWVyYXRlLm51bSkgJiYgc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuICYmIHN0LT5jb2RlYy0+dGltZV9iYXNlLm51bSkKKyAgICAgICAgY29kZWNfZnJhbWVyYXRlID0gYXZfbXVsX3EoYXZfaW52X3Eoc3QtPmNvZGVjLT50aW1lX2Jhc2UpLCAoQVZSYXRpb25hbCl7MSwgc3QtPmNvZGVjLT50aWNrc19wZXJfZnJhbWV9KTsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCiAKICAgICAqcG51bSA9IDA7CiAgICAgKnBkZW4gPSAwOwotICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7CisgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpIHsKICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKICAgICAgICAgaWYgKHN0LT5yX2ZyYW1lX3JhdGUubnVtICYmICFwYyAmJiBzLT5pZm9ybWF0KSB7CiAgICAgICAgICAgICAqcG51bSA9IHN0LT5yX2ZyYW1lX3JhdGUuZGVuOwpAQCAtODA1LDEwICs5NzAsMTAgQEAKICAgICAgICAgICAgICpwbnVtID0gc3QtPnRpbWVfYmFzZS5udW07CiAgICAgICAgICAgICAqcGRlbiA9IHN0LT50aW1lX2Jhc2UuZGVuOwogICAgICAgICB9IGVsc2UgaWYgKGNvZGVjX2ZyYW1lcmF0ZS5kZW4gKiAxMDAwTEwgPiBjb2RlY19mcmFtZXJhdGUubnVtKSB7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKHN0LT5jb2RlYy0+dGlja3NfcGVyX2ZyYW1lKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoc3QtPmludGVybmFsLT5hdmN0eC0+dGlja3NfcGVyX2ZyYW1lKTsKICAgICAgICAgICAgIGF2X3JlZHVjZShwbnVtLCBwZGVuLAogICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2ZyYW1lcmF0ZS5kZW4sCi0gICAgICAgICAgICAgICAgICAgICAgY29kZWNfZnJhbWVyYXRlLm51bSAqIChpbnQ2NF90KXN0LT5jb2RlYy0+dGlja3NfcGVyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvZGVjX2ZyYW1lcmF0ZS5udW0gKiAoaW50NjRfdClzdC0+aW50ZXJuYWwtPmF2Y3R4LT50aWNrc19wZXJfZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgSU5UX01BWCk7CiAKICAgICAgICAgICAgIGlmIChwYyAmJiBwYy0+cmVwZWF0X3BpY3QpIHsKQEAgLTgyMSw1MSArOTg2LDUxIEBACiAgICAgICAgICAgICAvKiBJZiB0aGlzIGNvZGVjIGNhbiBiZSBpbnRlcmxhY2VkIG9yIHByb2dyZXNzaXZlIHRoZW4gd2UgbmVlZAogICAgICAgICAgICAgICogYSBwYXJzZXIgdG8gY29tcHV0ZSBkdXJhdGlvbiBvZiBhIHBhY2tldC4gVGh1cyBpZiB3ZSBoYXZlCiAgICAgICAgICAgICAgKiBubyBwYXJzZXIgaW4gc3VjaCBjYXNlIGxlYXZlIGR1cmF0aW9uIHVuZGVmaW5lZC4gKi8KLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPnRpY2tzX3Blcl9mcmFtZSA+IDEgJiYgIXBjKQorICAgICAgICAgICAgaWYgKHN0LT5pbnRlcm5hbC0+YXZjdHgtPnRpY2tzX3Blcl9mcmFtZSA+IDEgJiYgIXBjKQogICAgICAgICAgICAgICAgICpwbnVtID0gKnBkZW4gPSAwOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICBmcmFtZV9zaXplID0gYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKHN0LT5jb2RlYywgcGt0LT5zaXplKTsKLSAgICAgICAgaWYgKGZyYW1lX3NpemUgPD0gMCB8fCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIDw9IDApCisgICAgICAgIGlmIChzdC0+aW50ZXJuYWwtPmF2Y3R4X2luaXRlZCkgeworICAgICAgICAgICAgZnJhbWVfc2l6ZSA9IGF2X2dldF9hdWRpb19mcmFtZV9kdXJhdGlvbihzdC0+aW50ZXJuYWwtPmF2Y3R4LCBwa3QtPnNpemUpOworICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZyYW1lX3NpemUgPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHN0LT5jb2RlY3BhciwgcGt0LT5zaXplKTsKKyAgICAgICAgICAgIHNhbXBsZV9yYXRlID0gc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZnJhbWVfc2l6ZSA8PSAwIHx8IHNhbXBsZV9yYXRlIDw9IDApCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgKnBudW0gPSBmcmFtZV9zaXplOwotICAgICAgICAqcGRlbiA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICpwZGVuID0gc2FtcGxlX3JhdGU7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KIAotc3RhdGljIGludCBpc19pbnRyYV9vbmx5KEFWQ29kZWNDb250ZXh0ICplbmMpIHsKLSAgICBjb25zdCBBVkNvZGVjRGVzY3JpcHRvciAqZGVzYzsKLQotICAgIGlmIChlbmMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGRlc2MgPSBhdl9jb2RlY19nZXRfY29kZWNfZGVzY3JpcHRvcihlbmMpOwotICAgIGlmICghZGVzYykgewotICAgICAgICBkZXNjID0gYXZjb2RlY19kZXNjcmlwdG9yX2dldChlbmMtPmNvZGVjX2lkKTsKLSAgICAgICAgYXZfY29kZWNfc2V0X2NvZGVjX2Rlc2NyaXB0b3IoZW5jLCBkZXNjKTsKLSAgICB9Ci0gICAgaWYgKGRlc2MpCi0gICAgICAgIHJldHVybiAhIShkZXNjLT5wcm9wcyAmIEFWX0NPREVDX1BST1BfSU5UUkFfT05MWSk7Ci0gICAgcmV0dXJuIDA7CitzdGF0aWMgaW50IGlzX2ludHJhX29ubHkoZW51bSBBVkNvZGVjSUQgaWQpCit7CisgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmQgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KGlkKTsKKyAgICBpZiAoIWQpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChkLT50eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiAhKGQtPnByb3BzICYgQVZfQ09ERUNfUFJPUF9JTlRSQV9PTkxZKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyBpbnQgaGFzX2RlY29kZV9kZWxheV9iZWVuX2d1ZXNzZWQoQVZTdHJlYW0gKnN0KQogewotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0gyNjQpIHJldHVybiAxOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0gyNjQpIHJldHVybiAxOwogICAgIGlmICghc3QtPmluZm8pIC8vIGlmIHdlIGhhdmUgbGVmdCBmaW5kX3N0cmVhbV9pbmZvIHRoZW4gbmJfZGVjb2RlZF9mcmFtZXMgd29uJ3QgaW5jcmVhc2UgYW55bW9yZSBmb3Igc3RyZWFtIGNvcHkKICAgICAgICAgcmV0dXJuIDE7CiAjaWYgQ09ORklHX0gyNjRfREVDT0RFUgotICAgIGlmIChzdC0+Y29kZWMtPmhhc19iX2ZyYW1lcyAmJgotICAgICAgIGF2cHJpdl9oMjY0X2hhc19udW1fcmVvcmRlcl9mcmFtZXMoc3QtPmNvZGVjKSA9PSBzdC0+Y29kZWMtPmhhc19iX2ZyYW1lcykKKyAgICBpZiAoc3QtPmludGVybmFsLT5hdmN0eC0+aGFzX2JfZnJhbWVzICYmCisgICAgICAgYXZwcml2X2gyNjRfaGFzX251bV9yZW9yZGVyX2ZyYW1lcyhzdC0+aW50ZXJuYWwtPmF2Y3R4KSA9PSBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5oYXNfYl9mcmFtZXMpCiAgICAgICAgIHJldHVybiAxOwogI2VuZGlmCi0gICAgaWYgKHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzPDMpCisgICAgaWYgKHN0LT5pbnRlcm5hbC0+YXZjdHgtPmhhc19iX2ZyYW1lczwzKQogICAgICAgICByZXR1cm4gc3QtPm5iX2RlY29kZWRfZnJhbWVzID49IDc7Ci0gICAgZWxzZSBpZiAoc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXM8NCkKKyAgICBlbHNlIGlmIChzdC0+aW50ZXJuYWwtPmF2Y3R4LT5oYXNfYl9mcmFtZXM8NCkKICAgICAgICAgcmV0dXJuIHN0LT5uYl9kZWNvZGVkX2ZyYW1lcyA+PSAxODsKICAgICBlbHNlCiAgICAgICAgIHJldHVybiBzdC0+bmJfZGVjb2RlZF9mcmFtZXMgPj0gMjA7CkBAIC04ODEsMTEgKzEwNDYsMTEgQEAKIH0KIAogc3RhdGljIGludDY0X3Qgc2VsZWN0X2Zyb21fcHRzX2J1ZmZlcihBVlN0cmVhbSAqc3QsIGludDY0X3QgKnB0c19idWZmZXIsIGludDY0X3QgZHRzKSB7Ci0gICAgaW50IG9uZWluX29uZW91dCA9IHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSDI2NCAmJgotICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0hFVkM7CisgICAgaW50IG9uZWluX29uZW91dCA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSDI2NCAmJgorICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX0hFVkM7CiAKICAgICBpZighb25laW5fb25lb3V0KSB7Ci0gICAgICAgIGludCBkZWxheSA9IHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzOworICAgICAgICBpbnQgZGVsYXkgPSBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5oYXNfYl9mcmFtZXM7CiAgICAgICAgIGludCBpOwogCiAgICAgICAgIGlmIChkdHMgPT0gQVZfTk9QVFNfVkFMVUUpIHsKQEAgLTkyMiw1NSArMTA4Nyw4NiBAQAogICAgIHJldHVybiBkdHM7CiB9CiAKKy8qKgorICogVXBkYXRlcyB0aGUgZHRzIG9mIHBhY2tldHMgb2YgYSBzdHJlYW0gaW4gcGt0X2J1ZmZlciwgYnkgcmUtb3JkZXJpbmcgdGhlIHB0cworICogb2YgdGhlIHBhY2tldHMgaW4gYSB3aW5kb3cuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9kdHNfZnJvbV9wdHMoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlBhY2tldExpc3QgKnBrdF9idWZmZXIpCit7CisgICAgQVZTdHJlYW0gKnN0ICAgICAgID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgIGludCBkZWxheSAgICAgICAgICA9IHN0LT5pbnRlcm5hbC0+YXZjdHgtPmhhc19iX2ZyYW1lczsKKyAgICBpbnQgaTsKKworICAgIGludDY0X3QgcHRzX2J1ZmZlcltNQVhfUkVPUkRFUl9ERUxBWSsxXTsKKworICAgIGZvciAoaSA9IDA7IGk8TUFYX1JFT1JERVJfREVMQVkrMTsgaSsrKQorICAgICAgICBwdHNfYnVmZmVyW2ldID0gQVZfTk9QVFNfVkFMVUU7CisKKyAgICBmb3IgKDsgcGt0X2J1ZmZlcjsgcGt0X2J1ZmZlciA9IGdldF9uZXh0X3BrdChzLCBzdCwgcGt0X2J1ZmZlcikpIHsKKyAgICAgICAgaWYgKHBrdF9idWZmZXItPnBrdC5zdHJlYW1faW5kZXggIT0gc3RyZWFtX2luZGV4KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKHBrdF9idWZmZXItPnBrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgZGVsYXkgPD0gTUFYX1JFT1JERVJfREVMQVkpIHsKKyAgICAgICAgICAgIHB0c19idWZmZXJbMF0gPSBwa3RfYnVmZmVyLT5wa3QucHRzOworICAgICAgICAgICAgZm9yIChpID0gMDsgaTxkZWxheSAmJiBwdHNfYnVmZmVyW2ldID4gcHRzX2J1ZmZlcltpICsgMV07IGkrKykKKyAgICAgICAgICAgICAgICBGRlNXQVAoaW50NjRfdCwgcHRzX2J1ZmZlcltpXSwgcHRzX2J1ZmZlcltpICsgMV0pOworCisgICAgICAgICAgICBwa3RfYnVmZmVyLT5wa3QuZHRzID0gc2VsZWN0X2Zyb21fcHRzX2J1ZmZlcihzdCwgcHRzX2J1ZmZlciwgcGt0X2J1ZmZlci0+cGt0LmR0cyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHN0YXRpYyB2b2lkIHVwZGF0ZV9pbml0aWFsX3RpbWVzdGFtcHMoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgc3RyZWFtX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR0cywgaW50NjRfdCBwdHMsIEFWUGFja2V0ICpwa3QpCiB7CiAgICAgQVZTdHJlYW0gKnN0ICAgICAgID0gcy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOwogICAgIEFWUGFja2V0TGlzdCAqcGt0bCA9IHMtPmludGVybmFsLT5wYWNrZXRfYnVmZmVyID8gcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXIgOiBzLT5pbnRlcm5hbC0+cGFyc2VfcXVldWU7Ci0gICAgaW50NjRfdCBwdHNfYnVmZmVyW01BWF9SRU9SREVSX0RFTEFZKzFdOworICAgIEFWUGFja2V0TGlzdCAqcGt0bF9pdDsKKwogICAgIHVpbnQ2NF90IHNoaWZ0OwotICAgIGludCBpLCBkZWxheTsKIAogICAgIGlmIChzdC0+Zmlyc3RfZHRzICE9IEFWX05PUFRTX1ZBTFVFIHx8CiAgICAgICAgIGR0cyAgICAgICAgICAgPT0gQVZfTk9QVFNfVkFMVUUgfHwKICAgICAgICAgc3QtPmN1cl9kdHMgICA9PSBBVl9OT1BUU19WQUxVRSB8fAorICAgICAgICBzdC0+Y3VyX2R0cyA8IElOVF9NSU4gKyBSRUxBVElWRV9UU19CQVNFIHx8CiAgICAgICAgIGlzX3JlbGF0aXZlKGR0cykpCiAgICAgICAgIHJldHVybjsKIAotICAgIGRlbGF5ICAgICAgICAgPSBzdC0+Y29kZWMtPmhhc19iX2ZyYW1lczsKICAgICBzdC0+Zmlyc3RfZHRzID0gZHRzIC0gKHN0LT5jdXJfZHRzIC0gUkVMQVRJVkVfVFNfQkFTRSk7CiAgICAgc3QtPmN1cl9kdHMgICA9IGR0czsKICAgICBzaGlmdCAgICAgICAgID0gKHVpbnQ2NF90KXN0LT5maXJzdF9kdHMgLSBSRUxBVElWRV9UU19CQVNFOwogCi0gICAgZm9yIChpID0gMDsgaTxNQVhfUkVPUkRFUl9ERUxBWSsxOyBpKyspCi0gICAgICAgIHB0c19idWZmZXJbaV0gPSBBVl9OT1BUU19WQUxVRTsKLQogICAgIGlmIChpc19yZWxhdGl2ZShwdHMpKQogICAgICAgICBwdHMgKz0gc2hpZnQ7CiAKLSAgICBmb3IgKDsgcGt0bDsgcGt0bCA9IGdldF9uZXh0X3BrdChzLCBzdCwgcGt0bCkpIHsKLSAgICAgICAgaWYgKHBrdGwtPnBrdC5zdHJlYW1faW5kZXggIT0gc3RyZWFtX2luZGV4KQorICAgIGZvciAocGt0bF9pdCA9IHBrdGw7IHBrdGxfaXQ7IHBrdGxfaXQgPSBnZXRfbmV4dF9wa3Qocywgc3QsIHBrdGxfaXQpKSB7CisgICAgICAgIGlmIChwa3RsX2l0LT5wa3Quc3RyZWFtX2luZGV4ICE9IHN0cmVhbV9pbmRleCkKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAoaXNfcmVsYXRpdmUocGt0bC0+cGt0LnB0cykpCi0gICAgICAgICAgICBwa3RsLT5wa3QucHRzICs9IHNoaWZ0OworICAgICAgICBpZiAoaXNfcmVsYXRpdmUocGt0bF9pdC0+cGt0LnB0cykpCisgICAgICAgICAgICBwa3RsX2l0LT5wa3QucHRzICs9IHNoaWZ0OwogCi0gICAgICAgIGlmIChpc19yZWxhdGl2ZShwa3RsLT5wa3QuZHRzKSkKLSAgICAgICAgICAgIHBrdGwtPnBrdC5kdHMgKz0gc2hpZnQ7CisgICAgICAgIGlmIChpc19yZWxhdGl2ZShwa3RsX2l0LT5wa3QuZHRzKSkKKyAgICAgICAgICAgIHBrdGxfaXQtPnBrdC5kdHMgKz0gc2hpZnQ7CiAKLSAgICAgICAgaWYgKHN0LT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFICYmIHBrdGwtPnBrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCi0gICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IHBrdGwtPnBrdC5wdHM7Ci0KLSAgICAgICAgaWYgKHBrdGwtPnBrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgZGVsYXkgPD0gTUFYX1JFT1JERVJfREVMQVkgJiYgaGFzX2RlY29kZV9kZWxheV9iZWVuX2d1ZXNzZWQoc3QpKSB7Ci0gICAgICAgICAgICBwdHNfYnVmZmVyWzBdID0gcGt0bC0+cGt0LnB0czsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGk8ZGVsYXkgJiYgcHRzX2J1ZmZlcltpXSA+IHB0c19idWZmZXJbaSArIDFdOyBpKyspCi0gICAgICAgICAgICAgICAgRkZTV0FQKGludDY0X3QsIHB0c19idWZmZXJbaV0sIHB0c19idWZmZXJbaSArIDFdKTsKLQotICAgICAgICAgICAgcGt0bC0+cGt0LmR0cyA9IHNlbGVjdF9mcm9tX3B0c19idWZmZXIoc3QsIHB0c19idWZmZXIsIHBrdGwtPnBrdC5kdHMpOworICAgICAgICBpZiAoc3QtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0bF9pdC0+cGt0LnB0cyAhPSBBVl9OT1BUU19WQUxVRSkgeworICAgICAgICAgICAgc3QtPnN0YXJ0X3RpbWUgPSBwa3RsX2l0LT5wa3QucHRzOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSArPSBhdl9yZXNjYWxlX3Eoc3QtPnNraXBfc2FtcGxlcywgKEFWUmF0aW9uYWwpezEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGV9LCBzdC0+dGltZV9iYXNlKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChzdC0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgc3QtPnN0YXJ0X3RpbWUgPSBwdHM7CisgICAgaWYgKGhhc19kZWNvZGVfZGVsYXlfYmVlbl9ndWVzc2VkKHN0KSkgeworICAgICAgICB1cGRhdGVfZHRzX2Zyb21fcHRzKHMsIHN0cmVhbV9pbmRleCwgcGt0bCk7CisgICAgfQorCisgICAgaWYgKHN0LT5zdGFydF90aW1lID09IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPIHx8ICEocGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0RJU0NBUkQpKSB7CisgICAgICAgICAgICBzdC0+c3RhcnRfdGltZSA9IHB0czsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJiBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKQorICAgICAgICAgICAgc3QtPnN0YXJ0X3RpbWUgKz0gYXZfcmVzY2FsZV9xKHN0LT5za2lwX3NhbXBsZXMsIChBVlJhdGlvbmFsKXsxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlfSwgc3QtPnRpbWVfYmFzZSk7CisgICAgfQogfQogCiBzdGF0aWMgdm9pZCB1cGRhdGVfaW5pdGlhbF9kdXJhdGlvbnMoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlN0cmVhbSAqc3QsCkBAIC0xMDEwLDEzICsxMjA2LDE2IEBACiAgICAgZm9yICg7IHBrdGw7IHBrdGwgPSBnZXRfbmV4dF9wa3Qocywgc3QsIHBrdGwpKSB7CiAgICAgICAgIGlmIChwa3RsLT5wa3Quc3RyZWFtX2luZGV4ICE9IHN0cmVhbV9pbmRleCkKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAocGt0bC0+cGt0LnB0cyA9PSBwa3RsLT5wa3QuZHRzICAmJgotICAgICAgICAgICAgKHBrdGwtPnBrdC5kdHMgPT0gQVZfTk9QVFNfVkFMVUUgfHwgcGt0bC0+cGt0LmR0cyA9PSBzdC0+Zmlyc3RfZHRzKSAmJgorICAgICAgICBpZiAoKHBrdGwtPnBrdC5wdHMgPT0gcGt0bC0+cGt0LmR0cyB8fAorICAgICAgICAgICAgIHBrdGwtPnBrdC5wdHMgPT0gQVZfTk9QVFNfVkFMVUUpICYmCisgICAgICAgICAgICAocGt0bC0+cGt0LmR0cyA9PSBBVl9OT1BUU19WQUxVRSB8fAorICAgICAgICAgICAgIHBrdGwtPnBrdC5kdHMgPT0gc3QtPmZpcnN0X2R0cyB8fAorICAgICAgICAgICAgIHBrdGwtPnBrdC5kdHMgPT0gUkVMQVRJVkVfVFNfQkFTRSkgJiYKICAgICAgICAgICAgICFwa3RsLT5wa3QuZHVyYXRpb24pIHsKICAgICAgICAgICAgIHBrdGwtPnBrdC5kdHMgPSBjdXJfZHRzOwotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmhhc19iX2ZyYW1lcykKKyAgICAgICAgICAgIGlmICghc3QtPmludGVybmFsLT5hdmN0eC0+aGFzX2JfZnJhbWVzKQogICAgICAgICAgICAgICAgIHBrdGwtPnBrdC5wdHMgPSBjdXJfZHRzOwotLy8gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKKy8vICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfQVVESU8pCiAgICAgICAgICAgICAgICAgcGt0bC0+cGt0LmR1cmF0aW9uID0gZHVyYXRpb247CiAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xMDMzLDEzICsxMjMyLDEzIEBACiAgICAgaW50IG51bSwgZGVuLCBwcmVzZW50YXRpb25fZGVsYXllZCwgZGVsYXksIGk7CiAgICAgaW50NjRfdCBvZmZzZXQ7CiAgICAgQVZSYXRpb25hbCBkdXJhdGlvbjsKLSAgICBpbnQgb25laW5fb25lb3V0ID0gc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjY0ICYmCi0gICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSEVWQzsKKyAgICBpbnQgb25laW5fb25lb3V0ID0gc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9IMjY0ICYmCisgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfSEVWQzsKIAogICAgIGlmIChzLT5mbGFncyAmIEFWRk1UX0ZMQUdfTk9GSUxMSU4pCiAgICAgICAgIHJldHVybjsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIHBrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgcGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpIHsKICAgICAgICAgaWYgKHBrdC0+ZHRzID09IHBrdC0+cHRzICYmIHN0LT5sYXN0X2R0c19mb3Jfb3JkZXJfY2hlY2sgIT0gQVZfTk9QVFNfVkFMVUUpIHsKICAgICAgICAgICAgIGlmIChzdC0+bGFzdF9kdHNfZm9yX29yZGVyX2NoZWNrIDw9IHBrdC0+ZHRzKSB7CiAgICAgICAgICAgICAgICAgc3QtPmR0c19vcmRlcmVkKys7CkBAIC0xMDY1LDEyICsxMjY0LDEyIEBACiAgICAgICAgIHBrdC0+ZHRzID0gQVZfTk9QVFNfVkFMVUU7CiAKICAgICBpZiAocGMgJiYgcGMtPnBpY3RfdHlwZSA9PSBBVl9QSUNUVVJFX1RZUEVfQgotICAgICAgICAmJiAhc3QtPmNvZGVjLT5oYXNfYl9mcmFtZXMpCisgICAgICAgICYmICFzdC0+aW50ZXJuYWwtPmF2Y3R4LT5oYXNfYl9mcmFtZXMpCiAgICAgICAgIC8vRklYTUUgU2V0IGxvd19kZWxheSA9IDAgd2hlbiBoYXNfYl9mcmFtZXMgPSAxCi0gICAgICAgIHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzID0gMTsKKyAgICAgICAgc3QtPmludGVybmFsLT5hdmN0eC0+aGFzX2JfZnJhbWVzID0gMTsKIAogICAgIC8qIGRvIHdlIGhhdmUgYSB2aWRlbyBCLWZyYW1lID8gKi8KLSAgICBkZWxheSA9IHN0LT5jb2RlYy0+aGFzX2JfZnJhbWVzOworICAgIGRlbGF5ID0gc3QtPmludGVybmFsLT5hdmN0eC0+aGFzX2JfZnJhbWVzOwogICAgIHByZXNlbnRhdGlvbl9kZWxheWVkID0gMDsKIAogICAgIC8qIFhYWDogbmVlZCBoYXNfYl9mcmFtZSwgYnV0IGNhbm5vdCBnZXQgaXQgaWYgdGhlIGNvZGVjIGlzCkBAIC0xMTUzLDcgKzEzNTIsNyBAQAogCiAgICAgICAgICAgICAvKiBUaGlzIGlzIHRyaWNreTogdGhlIGR0cyBtdXN0IGJlIGluY3JlbWVudGVkIGJ5IHRoZSBkdXJhdGlvbgogICAgICAgICAgICAgICogb2YgdGhlIGZyYW1lIHdlIGFyZSBkaXNwbGF5aW5nLCBpLmUuIHRoZSBsYXN0IEktIG9yIFAtZnJhbWUuICovCi0gICAgICAgICAgICBpZiAoc3QtPmxhc3RfSVBfZHVyYXRpb24gPT0gMCkKKyAgICAgICAgICAgIGlmIChzdC0+bGFzdF9JUF9kdXJhdGlvbiA9PSAwICYmICh1aW50NjRfdClwa3QtPmR1cmF0aW9uIDw9IElOVDMyX01BWCkKICAgICAgICAgICAgICAgICBzdC0+bGFzdF9JUF9kdXJhdGlvbiA9IHBrdC0+ZHVyYXRpb247CiAgICAgICAgICAgICBpZiAocGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUpCiAgICAgICAgICAgICAgICAgc3QtPmN1cl9kdHMgPSBwa3QtPmR0cyArIHN0LT5sYXN0X0lQX2R1cmF0aW9uOwpAQCAtMTE2NSw3ICsxMzY0LDggQEAKICAgICAgICAgICAgICAgICBuZXh0X3B0cyAhPSBBVl9OT1BUU19WQUxVRSkKICAgICAgICAgICAgICAgICBwa3QtPnB0cyA9IG5leHRfZHRzOwogCi0gICAgICAgICAgICBzdC0+bGFzdF9JUF9kdXJhdGlvbiA9IHBrdC0+ZHVyYXRpb247CisgICAgICAgICAgICBpZiAoKHVpbnQ2NF90KXBrdC0+ZHVyYXRpb24gPD0gSU5UMzJfTUFYKQorICAgICAgICAgICAgICAgIHN0LT5sYXN0X0lQX2R1cmF0aW9uID0gcGt0LT5kdXJhdGlvbjsKICAgICAgICAgICAgIHN0LT5sYXN0X0lQX3B0cyAgICAgID0gcGt0LT5wdHM7CiAgICAgICAgICAgICAvKiBDYW5ub3QgY29tcHV0ZSBQVFMgaWYgbm90IHByZXNlbnQgKHdlIGNhbiBjb21wdXRlIGl0IG9ubHkKICAgICAgICAgICAgICAqIGJ5IGtub3dpbmcgdGhlIGZ1dHVyZS4gKi8KQEAgLTExODYsMTIgKzEzODYsMTMgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBkZWxheSA8PSBNQVhfUkVPUkRFUl9ERUxBWSAmJiBoYXNfZGVjb2RlX2RlbGF5X2JlZW5fZ3Vlc3NlZChzdCkpIHsKKyAgICBpZiAocGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgZGVsYXkgPD0gTUFYX1JFT1JERVJfREVMQVkpIHsKICAgICAgICAgc3QtPnB0c19idWZmZXJbMF0gPSBwa3QtPnB0czsKICAgICAgICAgZm9yIChpID0gMDsgaTxkZWxheSAmJiBzdC0+cHRzX2J1ZmZlcltpXSA+IHN0LT5wdHNfYnVmZmVyW2kgKyAxXTsgaSsrKQogICAgICAgICAgICAgRkZTV0FQKGludDY0X3QsIHN0LT5wdHNfYnVmZmVyW2ldLCBzdC0+cHRzX2J1ZmZlcltpICsgMV0pOwogCi0gICAgICAgIHBrdC0+ZHRzID0gc2VsZWN0X2Zyb21fcHRzX2J1ZmZlcihzdCwgc3QtPnB0c19idWZmZXIsIHBrdC0+ZHRzKTsKKyAgICAgICAgaWYoaGFzX2RlY29kZV9kZWxheV9iZWVuX2d1ZXNzZWQoc3QpKQorICAgICAgICAgICAgcGt0LT5kdHMgPSBzZWxlY3RfZnJvbV9wdHNfYnVmZmVyKHN0LCBzdC0+cHRzX2J1ZmZlciwgcGt0LT5kdHMpOwogICAgIH0KICAgICAvLyBXZSBza2lwcGVkIGl0IGFib3ZlIHNvIHdlIHRyeSBoZXJlLgogICAgIGlmICghb25laW5fb25lb3V0KQpAQCAtMTIwNSw3ICsxNDA2LDcgQEAKICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9kZWxheWVkLCBkZWxheSwgYXZfdHMyc3RyKHBrdC0+cHRzKSwgYXZfdHMyc3RyKHBrdC0+ZHRzKSwgYXZfdHMyc3RyKHN0LT5jdXJfZHRzKSk7CiAKICAgICAvKiB1cGRhdGUgZmxhZ3MgKi8KLSAgICBpZiAoaXNfaW50cmFfb25seShzdC0+Y29kZWMpKQorICAgIGlmIChpc19pbnRyYV9vbmx5KHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpKQogICAgICAgICBwa3QtPmZsYWdzIHw9IEFWX1BLVF9GTEFHX0tFWTsKICNpZiBGRl9BUElfQ09OVkVSR0VOQ0VfRFVSQVRJT04KIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKQEAgLTEyMTUsMTQgKzE0MTYsMTcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBmcmVlX3BhY2tldF9idWZmZXIoQVZQYWNrZXRMaXN0ICoqcGt0X2J1ZiwgQVZQYWNrZXRMaXN0ICoqcGt0X2J1Zl9lbmQpCit2b2lkIGZmX3BhY2tldF9saXN0X2ZyZWUoQVZQYWNrZXRMaXN0ICoqcGt0X2J1ZiwgQVZQYWNrZXRMaXN0ICoqcGt0X2J1Zl9lbmQpCiB7Ci0gICAgd2hpbGUgKCpwa3RfYnVmKSB7Ci0gICAgICAgIEFWUGFja2V0TGlzdCAqcGt0bCA9ICpwa3RfYnVmOwotICAgICAgICAqcGt0X2J1ZiA9IHBrdGwtPm5leHQ7CisgICAgQVZQYWNrZXRMaXN0ICp0bXAgPSAqcGt0X2J1ZjsKKworICAgIHdoaWxlICh0bXApIHsKKyAgICAgICAgQVZQYWNrZXRMaXN0ICpwa3RsID0gdG1wOworICAgICAgICB0bXAgPSBwa3RsLT5uZXh0OwogICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdGwtPnBrdCk7CiAgICAgICAgIGF2X2ZyZWVwKCZwa3RsKTsKICAgICB9CisgICAgKnBrdF9idWYgICAgID0gTlVMTDsKICAgICAqcGt0X2J1Zl9lbmQgPSBOVUxMOwogfQogCkBAIC0xMjU0LDcgKzE0NTgsNyBAQAogICAgICAgICBpbnQ2NF90IG5leHRfZHRzID0gcGt0LT5kdHM7CiAKICAgICAgICAgYXZfaW5pdF9wYWNrZXQoJm91dF9wa3QpOwotICAgICAgICBsZW4gPSBhdl9wYXJzZXJfcGFyc2UyKHN0LT5wYXJzZXIsIHN0LT5jb2RlYywKKyAgICAgICAgbGVuID0gYXZfcGFyc2VyX3BhcnNlMihzdC0+cGFyc2VyLCBzdC0+aW50ZXJuYWwtPmF2Y3R4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfcGt0LmRhdGEsICZvdXRfcGt0LnNpemUsIGRhdGEsIHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGt0LT5wdHMsIHBrdC0+ZHRzLCBwa3QtPnBvcyk7CiAKQEAgLTEyNjksNiArMTQ3MywyMiBAQAogICAgICAgICBpZiAoIW91dF9wa3Quc2l6ZSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCisgICAgICAgIGlmIChwa3QtPmJ1ZiAmJiBvdXRfcGt0LmRhdGEgPT0gcGt0LT5kYXRhKSB7CisgICAgICAgICAgICAvKiByZWZlcmVuY2UgcGt0LT5idWYgb25seSB3aGVuIG91dF9wa3QuZGF0YSBpcyBndWFyYW50ZWVkIHRvIHBvaW50CisgICAgICAgICAgICAgKiB0byBkYXRhIGluIGl0IGFuZCBub3QgaW4gdGhlIHBhcnNlcidzIGludGVybmFsIGJ1ZmZlci4gKi8KKyAgICAgICAgICAgIC8qIFhYWDogRW5zdXJlIHRoaXMgaXMgdGhlIGNhc2Ugd2l0aCBhbGwgcGFyc2VycyB3aGVuIHN0LT5wYXJzZXItPmZsYWdzCisgICAgICAgICAgICAgKiBpcyBQQVJTRVJfRkxBR19DT01QTEVURV9GUkFNRVMgYW5kIGNoZWNrIGZvciB0aGF0IGluc3RlYWQ/ICovCisgICAgICAgICAgICBvdXRfcGt0LmJ1ZiA9IGF2X2J1ZmZlcl9yZWYocGt0LT5idWYpOworICAgICAgICAgICAgaWYgKCFvdXRfcGt0LmJ1ZikgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBhdl9wYWNrZXRfbWFrZV9yZWZjb3VudGVkKCZvdXRfcGt0KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChwa3QtPnNpZGVfZGF0YSkgewogICAgICAgICAgICAgb3V0X3BrdC5zaWRlX2RhdGEgICAgICAgPSBwa3QtPnNpZGVfZGF0YTsKICAgICAgICAgICAgIG91dF9wa3Quc2lkZV9kYXRhX2VsZW1zID0gcGt0LT5zaWRlX2RhdGFfZWxlbXM7CkBAIC0xMjc4LDExICsxNDk4LDExIEBACiAKICAgICAgICAgLyogc2V0IHRoZSBkdXJhdGlvbiAqLwogICAgICAgICBvdXRfcGt0LmR1cmF0aW9uID0gKHN0LT5wYXJzZXItPmZsYWdzICYgUEFSU0VSX0ZMQUdfQ09NUExFVEVfRlJBTUVTKSA/IHBrdC0+ZHVyYXRpb24gOiAwOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICAgICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPiAwKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoc3QtPmludGVybmFsLT5hdmN0eC0+c2FtcGxlX3JhdGUgPiAwKSB7CiAgICAgICAgICAgICAgICAgb3V0X3BrdC5kdXJhdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgIGF2X3Jlc2NhbGVfcV9ybmQoc3QtPnBhcnNlci0+ZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKSB7IDEsIHN0LT5pbnRlcm5hbC0+YXZjdHgtPnNhbXBsZV9yYXRlIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9ET1dOKTsKICAgICAgICAgICAgIH0KQEAgLTEyOTIsNiArMTUxMiw3IEBACiAgICAgICAgIG91dF9wa3QucHRzICAgICAgICAgID0gc3QtPnBhcnNlci0+cHRzOwogICAgICAgICBvdXRfcGt0LmR0cyAgICAgICAgICA9IHN0LT5wYXJzZXItPmR0czsKICAgICAgICAgb3V0X3BrdC5wb3MgICAgICAgICAgPSBzdC0+cGFyc2VyLT5wb3M7CisgICAgICAgIG91dF9wa3QuZmxhZ3MgICAgICAgfD0gcGt0LT5mbGFncyAmIEFWX1BLVF9GTEFHX0RJU0NBUkQ7CiAKICAgICAgICAgaWYgKHN0LT5uZWVkX3BhcnNpbmcgPT0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVcpCiAgICAgICAgICAgICBvdXRfcGt0LnBvcyA9IHN0LT5wYXJzZXItPmZyYW1lX29mZnNldDsKQEAgLTEzMDYsMTEgKzE1MjcsMTMgQEAKIAogICAgICAgICBjb21wdXRlX3BrdF9maWVsZHMocywgc3QsIHN0LT5wYXJzZXIsICZvdXRfcGt0LCBuZXh0X2R0cywgbmV4dF9wdHMpOwogCi0gICAgICAgIHJldCA9IGFkZF90b19wa3RidWYoJnMtPmludGVybmFsLT5wYXJzZV9xdWV1ZSwgJm91dF9wa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmludGVybmFsLT5wYXJzZV9xdWV1ZV9lbmQsIDEpOwotICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJm91dF9wa3QpOwotICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0ID0gZmZfcGFja2V0X2xpc3RfcHV0KCZzLT5pbnRlcm5hbC0+cGFyc2VfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJuYWwtPnBhcnNlX3F1ZXVlX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfcGt0LCAwKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmb3V0X3BrdCk7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBlbmQgb2YgdGhlIHN0cmVhbSA9PiBjbG9zZSBhbmQgZnJlZSB0aGUgcGFyc2VyICovCkBAIC0xMzI0LDkgKzE1NDcsOSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcmVhZF9mcm9tX3BhY2tldF9idWZmZXIoQVZQYWNrZXRMaXN0ICoqcGt0X2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXRMaXN0ICoqcGt0X2J1ZmZlcl9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICAgICAgKnBrdCkKK2ludCBmZl9wYWNrZXRfbGlzdF9nZXQoQVZQYWNrZXRMaXN0ICoqcGt0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZQYWNrZXRMaXN0ICoqcGt0X2J1ZmZlcl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgIEFWUGFja2V0ICAgICAgKnBrdCkKIHsKICAgICBBVlBhY2tldExpc3QgKnBrdGw7CiAgICAgYXZfYXNzZXJ0MCgqcGt0X2J1ZmZlcik7CkBAIC0xMzQxLDcgKzE1NjQsNyBAQAogCiBzdGF0aWMgaW50NjRfdCB0c190b19zYW1wbGVzKEFWU3RyZWFtICpzdCwgaW50NjRfdCB0cykKIHsKLSAgICByZXR1cm4gYXZfcmVzY2FsZSh0cywgc3QtPnRpbWVfYmFzZS5udW0gKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlLCBzdC0+dGltZV9iYXNlLmRlbik7CisgICAgcmV0dXJuIGF2X3Jlc2NhbGUodHMsIHN0LT50aW1lX2Jhc2UubnVtICogc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSwgc3QtPnRpbWVfYmFzZS5kZW4pOwogfQogCiBzdGF0aWMgaW50IHJlYWRfZnJhbWVfaW50ZXJuYWwoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQpAQCAtMTM3Myw2ICsxNTk2LDM2IEBACiAgICAgICAgIHJldCA9IDA7CiAgICAgICAgIHN0ICA9IHMtPnN0cmVhbXNbY3VyX3BrdC5zdHJlYW1faW5kZXhdOwogCisgICAgICAgIC8qIHVwZGF0ZSBjb250ZXh0IGlmIHJlcXVpcmVkICovCisgICAgICAgIGlmIChzdC0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChhdmNvZGVjX2lzX29wZW4oc3QtPmludGVybmFsLT5hdmN0eCkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiRGVtdXhlciBjb250ZXh0IHVwZGF0ZSB3aGlsZSBkZWNvZGVyIGlzIG9wZW4sIGNsb3NpbmcgYW5kIHRyeWluZyB0byByZS1vcGVuXG4iKTsKKyAgICAgICAgICAgICAgICBhdmNvZGVjX2Nsb3NlKHN0LT5pbnRlcm5hbC0+YXZjdHgpOworICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2xvc2UgcGFyc2VyLCBiZWNhdXNlIGl0IGRlcGVuZHMgb24gdGhlIGNvZGVjICovCisgICAgICAgICAgICBpZiAoc3QtPnBhcnNlciAmJiBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5jb2RlY19pZCAhPSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CisgICAgICAgICAgICAgICAgYXZfcGFyc2VyX2Nsb3NlKHN0LT5wYXJzZXIpOworICAgICAgICAgICAgICAgIHN0LT5wYXJzZXIgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChzdC0+aW50ZXJuYWwtPmF2Y3R4LCBzdC0+Y29kZWNwYXIpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICAvKiB1cGRhdGUgZGVwcmVjYXRlZCBwdWJsaWMgY29kZWMgY29udGV4dCAqLworICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoc3QtPmNvZGVjLCBzdC0+Y29kZWNwYXIpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisKKyAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+bmVlZF9jb250ZXh0X3VwZGF0ZSA9IDA7CisgICAgICAgIH0KKwogICAgICAgICBpZiAoY3VyX3BrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKICAgICAgICAgICAgIGN1cl9wa3QuZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmCiAgICAgICAgICAgICBjdXJfcGt0LnB0cyA8IGN1cl9wa3QuZHRzKSB7CkBAIC0xMzkyLDExICsxNjQ1LDExIEBACiAgICAgICAgICAgICAgICAgICAgY3VyX3BrdC5zaXplLCBjdXJfcGt0LmR1cmF0aW9uLCBjdXJfcGt0LmZsYWdzKTsKIAogICAgICAgICBpZiAoc3QtPm5lZWRfcGFyc2luZyAmJiAhc3QtPnBhcnNlciAmJiAhKHMtPmZsYWdzICYgQVZGTVRfRkxBR19OT1BBUlNFKSkgewotICAgICAgICAgICAgc3QtPnBhcnNlciA9IGF2X3BhcnNlcl9pbml0KHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgc3QtPnBhcnNlciA9IGF2X3BhcnNlcl9pbml0KHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogICAgICAgICAgICAgaWYgKCFzdC0+cGFyc2VyKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19WRVJCT1NFLCAicGFyc2VyIG5vdCBmb3VuZCBmb3IgY29kZWMgIgogICAgICAgICAgICAgICAgICAgICAgICAiJXMsIHBhY2tldHMgb3IgdGltZXMgbWF5IGJlIGludmFsaWQuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSk7CiAgICAgICAgICAgICAgICAgLyogbm8gcGFyc2VyIGF2YWlsYWJsZToganVzdCBvdXRwdXQgdGhlIHJhdyBwYWNrZXRzICovCiAgICAgICAgICAgICAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX05PTkU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5uZWVkX3BhcnNpbmcgPT0gQVZTVFJFQU1fUEFSU0VfSEVBREVSUykKQEAgLTE0MjEsNiArMTY3NCwxMSBAQAogICAgICAgICB9IGVsc2UgaWYgKHN0LT5kaXNjYXJkIDwgQVZESVNDQVJEX0FMTCkgewogICAgICAgICAgICAgaWYgKChyZXQgPSBwYXJzZV9wYWNrZXQocywgJmN1cl9wa3QsIGN1cl9wa3Quc3RyZWFtX2luZGV4KSkgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gc3QtPmludGVybmFsLT5hdmN0eC0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gc3QtPmludGVybmFsLT5hdmN0eC0+Yml0X3JhdGU7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gc3QtPmludGVybmFsLT5hdmN0eC0+Y2hhbm5lbHM7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gc3QtPmludGVybmFsLT5hdmN0eC0+Y2hhbm5lbF9sYXlvdXQ7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gc3QtPmludGVybmFsLT5hdmN0eC0+Y29kZWNfaWQ7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBmcmVlIHBhY2tldCAqLwogICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZjdXJfcGt0KTsKQEAgLTE0MzcsNyArMTY5NSw3IEBACiAgICAgfQogCiAgICAgaWYgKCFnb3RfcGFja2V0ICYmIHMtPmludGVybmFsLT5wYXJzZV9xdWV1ZSkKLSAgICAgICAgcmV0ID0gcmVhZF9mcm9tX3BhY2tldF9idWZmZXIoJnMtPmludGVybmFsLT5wYXJzZV9xdWV1ZSwgJnMtPmludGVybmFsLT5wYXJzZV9xdWV1ZV9lbmQsIHBrdCk7CisgICAgICAgIHJldCA9IGZmX3BhY2tldF9saXN0X2dldCgmcy0+aW50ZXJuYWwtPnBhcnNlX3F1ZXVlLCAmcy0+aW50ZXJuYWwtPnBhcnNlX3F1ZXVlX2VuZCwgcGt0KTsKIAogICAgIGlmIChyZXQgPj0gMCkgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKQEAgLTE0ODEsOSArMTczOSw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdC0+aW5qZWN0X2dsb2JhbF9zaWRlX2RhdGEgPSAwOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEocy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX0tFRVBfU0lERV9EQVRBKSkKLSAgICAgICAgICAgIGF2X3BhY2tldF9tZXJnZV9zaWRlX2RhdGEocGt0KTsKICAgICB9CiAKICAgICBhdl9vcHRfZ2V0X2RpY3RfdmFsKHMsICJtZXRhZGF0YSIsIEFWX09QVF9TRUFSQ0hfQ0hJTERSRU4sICZtZXRhZGF0YSk7CkBAIC0xNDk0LDYgKzE3NDksMTAgQEAKICAgICAgICAgYXZfb3B0X3NldF9kaWN0X3ZhbChzLCAibWV0YWRhdGEiLCBOVUxMLCBBVl9PUFRfU0VBUkNIX0NISUxEUkVOKTsKICAgICB9CiAKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorICAgIHVwZGF0ZV9zdHJlYW1fYXZjdHgocyk7CisjZW5kaWYKKwogICAgIGlmIChzLT5kZWJ1ZyAmIEZGX0ZERUJVR19UUykKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywKICAgICAgICAgICAgICAgICJyZWFkX2ZyYW1lX2ludGVybmFsIHN0cmVhbT0lZCwgcHRzPSVzLCBkdHM9JXMsICIKQEAgLTE1MTUsNyArMTc3NCw3IEBACiAKICAgICBpZiAoIWdlbnB0cykgewogICAgICAgICByZXQgPSBzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcgotICAgICAgICAgICAgICA/IHJlYWRfZnJvbV9wYWNrZXRfYnVmZmVyKCZzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgPyBmZl9wYWNrZXRfbGlzdF9nZXQoJnMtPmludGVybmFsLT5wYWNrZXRfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcl9lbmQsIHBrdCkKICAgICAgICAgICAgICAgOiByZWFkX2ZyYW1lX2ludGVybmFsKHMsIHBrdCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQpAQCAtMTUzNCwxMCArMTc5MywxMSBAQAogICAgICAgICAgICAgICAgIC8vIGxhc3QgZHRzIHNlZW4gZm9yIHRoaXMgc3RyZWFtLiBpZiBhbnkgb2YgcGFja2V0cyBmb2xsb3dpbmcKICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IG9uZSBoYWQgbm8gZHRzLCB3ZSB3aWxsIHNldCB0aGlzIHRvIEFWX05PUFRTX1ZBTFVFLgogICAgICAgICAgICAgICAgIGludDY0X3QgbGFzdF9kdHMgPSBuZXh0X3BrdC0+ZHRzOworICAgICAgICAgICAgICAgIGF2X2Fzc2VydDIod3JhcF9iaXRzIDw9IDY0KTsKICAgICAgICAgICAgICAgICB3aGlsZSAocGt0bCAmJiBuZXh0X3BrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwa3RsLT5wa3Quc3RyZWFtX2luZGV4ID09IG5leHRfcGt0LT5zdHJlYW1faW5kZXggJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChhdl9jb21wYXJlX21vZChuZXh0X3BrdC0+ZHRzLCBwa3RsLT5wa3QuZHRzLCAyTEwgPDwgKHdyYXBfYml0cyAtIDEpKSA8IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXZfY29tcGFyZV9tb2QocGt0bC0+cGt0LnB0cywgcGt0bC0+cGt0LmR0cywgMkxMIDw8ICh3cmFwX2JpdHMgLSAxKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NvbXBhcmVfbW9kKG5leHRfcGt0LT5kdHMsIHBrdGwtPnBrdC5kdHMsIDJVTEwgPDwgKHdyYXBfYml0cyAtIDEpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdl9jb21wYXJlX21vZChwa3RsLT5wa3QucHRzLCBwa3RsLT5wa3QuZHRzLCAyVUxMIDw8ICh3cmFwX2JpdHMgLSAxKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgQi1mcmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfcGt0LT5wdHMgPSBwa3RsLT5wa3QuZHRzOwogICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTU2Myw3ICsxODIzLDcgQEAKICAgICAgICAgICAgIHN0ID0gcy0+c3RyZWFtc1tuZXh0X3BrdC0+c3RyZWFtX2luZGV4XTsKICAgICAgICAgICAgIGlmICghKG5leHRfcGt0LT5wdHMgPT0gQVZfTk9QVFNfVkFMVUUgJiYgc3QtPmRpc2NhcmQgPCBBVkRJU0NBUkRfQUxMICYmCiAgICAgICAgICAgICAgICAgICBuZXh0X3BrdC0+ZHRzICE9IEFWX05PUFRTX1ZBTFVFICYmICFlb2YpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gcmVhZF9mcm9tX3BhY2tldF9idWZmZXIoJnMtPmludGVybmFsLT5wYWNrZXRfYnVmZmVyLAorICAgICAgICAgICAgICAgIHJldCA9IGZmX3BhY2tldF9saXN0X2dldCgmcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcl9lbmQsIHBrdCk7CiAgICAgICAgICAgICAgICAgZ290byByZXR1cm5fcGFja2V0OwogICAgICAgICAgICAgfQpAQCAtMTU3OCw4ICsxODM4LDkgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9CiAKLSAgICAgICAgcmV0ID0gYWRkX3RvX3BrdGJ1Zigmcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXIsIHBrdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXJfZW5kLCAxKTsKKyAgICAgICAgcmV0ID0gZmZfcGFja2V0X2xpc3RfcHV0KCZzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QsIEZGX1BBQ0tFVExJU1RfRkxBR19SRUZfUEFDS0VUKTsKICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdCk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE2MDYsOSArMTg2Nyw5IEBACiB7CiAgICAgaWYgKCFzLT5pbnRlcm5hbCkKICAgICAgICAgcmV0dXJuOwotICAgIGZyZWVfcGFja2V0X2J1ZmZlcigmcy0+aW50ZXJuYWwtPnBhcnNlX3F1ZXVlLCAgICAgICAmcy0+aW50ZXJuYWwtPnBhcnNlX3F1ZXVlX2VuZCk7Ci0gICAgZnJlZV9wYWNrZXRfYnVmZmVyKCZzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlciwgICAgICZzLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcl9lbmQpOwotICAgIGZyZWVfcGFja2V0X2J1ZmZlcigmcy0+aW50ZXJuYWwtPnJhd19wYWNrZXRfYnVmZmVyLCAmcy0+aW50ZXJuYWwtPnJhd19wYWNrZXRfYnVmZmVyX2VuZCk7CisgICAgZmZfcGFja2V0X2xpc3RfZnJlZSgmcy0+aW50ZXJuYWwtPnBhcnNlX3F1ZXVlLCAgICAgICAmcy0+aW50ZXJuYWwtPnBhcnNlX3F1ZXVlX2VuZCk7CisgICAgZmZfcGFja2V0X2xpc3RfZnJlZSgmcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXIsICAgICAmcy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXJfZW5kKTsKKyAgICBmZl9wYWNrZXRfbGlzdF9mcmVlKCZzLT5pbnRlcm5hbC0+cmF3X3BhY2tldF9idWZmZXIsICZzLT5pbnRlcm5hbC0+cmF3X3BhY2tldF9idWZmZXJfZW5kKTsKIAogICAgIHMtPmludGVybmFsLT5yYXdfcGFja2V0X2J1ZmZlcl9yZW1haW5pbmdfc2l6ZSA9IFJBV19QQUNLRVRfQlVGRkVSX1NJWkU7CiB9CkBAIC0xNjI4LDE1ICsxODg5LDE1IEBACiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpbnQgc2NvcmUgPSAwOwogICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgICAgICBpZiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDKQogICAgICAgICAgICAgICAgIHNjb3JlIC09IDQwMDsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPndpZHRoICYmIHN0LT5jb2RlYy0+aGVpZ2h0KQorICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+d2lkdGggJiYgc3QtPmNvZGVjcGFyLT5oZWlnaHQpCiAgICAgICAgICAgICAgICAgc2NvcmUgKz0gNTA7CiAgICAgICAgICAgICBzY29yZSs9IDI1OwogICAgICAgICB9Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKQogICAgICAgICAgICAgICAgIHNjb3JlICs9IDUwOwogICAgICAgICB9CiAgICAgICAgIGlmIChzdC0+Y29kZWNfaW5mb19uYl9mcmFtZXMpCkBAIC0xNzk5LDYgKzIwNjAsMTYgQEAKIAogICAgIHdoaWxlIChiIC0gYSA+IDEpIHsKICAgICAgICAgbSAgICAgICAgID0gKGEgKyBiKSA+PiAxOworCisgICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIG5leHQgbm9uLWRpc2NhcmRlZCBwYWNrZXQuCisgICAgICAgIHdoaWxlICgoZW50cmllc1ttXS5mbGFncyAmIEFWSU5ERVhfRElTQ0FSRF9GUkFNRSkgJiYgbSA8IGIgJiYgbSA8IG5iX2VudHJpZXMgLSAxKSB7CisgICAgICAgICAgICBtKys7CisgICAgICAgICAgICBpZiAobSA9PSBiICYmIGVudHJpZXNbbV0udGltZXN0YW1wID49IHdhbnRlZF90aW1lc3RhbXApIHsKKyAgICAgICAgICAgICAgICBtID0gYiAtIDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB0aW1lc3RhbXAgPSBlbnRyaWVzW21dLnRpbWVzdGFtcDsKICAgICAgICAgaWYgKHRpbWVzdGFtcCA+PSB3YW50ZWRfdGltZXN0YW1wKQogICAgICAgICAgICAgYiA9IG07CkBAIC0xODIzLDcgKzIwOTQsNyBAQAogICAgIGludDY0X3QgcG9zX2RlbHRhID0gMDsKICAgICBpbnQ2NF90IHNraXAgPSAwOwogICAgIC8vV2UgY291bGQgdXNlIFVSTFByb3RvY29sIGZsYWdzIGhlcmUgYnV0IGFzIG1hbnkgdXNlciBhcHBsaWNhdGlvbnMgZG8gbm90IHVzZSBVUkxQcm90b2NvbHMgdGhpcyB3b3VsZCBiZSB1bnJlbGlhYmxlCi0gICAgY29uc3QgY2hhciAqcHJvdG8gPSBhdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShzLT5maWxlbmFtZSk7CisgICAgY29uc3QgY2hhciAqcHJvdG8gPSBhdmlvX2ZpbmRfcHJvdG9jb2xfbmFtZShzLT51cmwpOwogCiAgICAgaWYgKCFwcm90bykgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sCkBAIC0yMTYzLDcgKzI0MzQsNyBAQAogICAgICAgICAgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobm9ua2V5KysgPiAxMDAwICYmIHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfQ0RHUkFQSElDUykgeworICAgICAgICAgICAgICAgIGlmIChub25rZXkrKyA+IDEwMDAgJiYgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9DREdSQVBISUNTKSB7CiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsInNlZWtfZnJhbWVfZ2VuZXJpYyBmYWlsZWQgYXMgdGhpcyBzdHJlYW0gc2VlbXMgdG8gY29udGFpbiBubyBrZXlmcmFtZXMgYWZ0ZXIgdGhlIHRhcmdldCB0aW1lc3RhbXAsICVkIG5vbiBrZXlmcmFtZXMgZm91bmRcbiIsIG5vbmtleSk7CiAgICAgICAgICAgICAgICAgICAgIGF2X3BhY2tldF91bnJlZigmcGt0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yMjgwLDYgKzI1NTEsNyBAQAogICAgICAgICAgICAgbWF4X3RzID0gYXZfcmVzY2FsZV9ybmQobWF4X3RzLCB0aW1lX2Jhc2UuZGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZV9iYXNlLm51bSAqIChpbnQ2NF90KUFWX1RJTUVfQkFTRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1JPVU5EX0RPV04gfCBBVl9ST1VORF9QQVNTX01JTk1BWCk7CisgICAgICAgICAgICBzdHJlYW1faW5kZXggPSAwOwogICAgICAgICB9CiAKICAgICAgICAgcmV0ID0gcy0+aWZvcm1hdC0+cmVhZF9zZWVrMihzLCBzdHJlYW1faW5kZXgsIG1pbl90cywKQEAgLTIzNDYsMzIgKzI2MTgsMzggQEAKICAqLwogc3RhdGljIHZvaWQgdXBkYXRlX3N0cmVhbV90aW1pbmdzKEFWRm9ybWF0Q29udGV4dCAqaWMpCiB7Ci0gICAgaW50NjRfdCBzdGFydF90aW1lLCBzdGFydF90aW1lMSwgc3RhcnRfdGltZV90ZXh0LCBlbmRfdGltZSwgZW5kX3RpbWUxOwotICAgIGludDY0X3QgZHVyYXRpb24sIGR1cmF0aW9uMSwgZmlsZXNpemU7CisgICAgaW50NjRfdCBzdGFydF90aW1lLCBzdGFydF90aW1lMSwgc3RhcnRfdGltZV90ZXh0LCBlbmRfdGltZSwgZW5kX3RpbWUxLCBlbmRfdGltZV90ZXh0OworICAgIGludDY0X3QgZHVyYXRpb24sIGR1cmF0aW9uMSwgZHVyYXRpb25fdGV4dCwgZmlsZXNpemU7CiAgICAgaW50IGk7Ci0gICAgQVZTdHJlYW0gKnN0OwogICAgIEFWUHJvZ3JhbSAqcDsKIAogICAgIHN0YXJ0X3RpbWUgPSBJTlQ2NF9NQVg7CiAgICAgc3RhcnRfdGltZV90ZXh0ID0gSU5UNjRfTUFYOwogICAgIGVuZF90aW1lICAgPSBJTlQ2NF9NSU47CisgICAgZW5kX3RpbWVfdGV4dCAgID0gSU5UNjRfTUlOOwogICAgIGR1cmF0aW9uICAgPSBJTlQ2NF9NSU47CisgICAgZHVyYXRpb25fdGV4dCA9IElOVDY0X01JTjsKKwogICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7Ci0gICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CisgICAgICAgIEFWU3RyZWFtICpzdCA9IGljLT5zdHJlYW1zW2ldOworICAgICAgICBpbnQgaXNfdGV4dCA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEE7CiAgICAgICAgIGlmIChzdC0+c3RhcnRfdGltZSAhPSBBVl9OT1BUU19WQUxVRSAmJiBzdC0+dGltZV9iYXNlLmRlbikgewogICAgICAgICAgICAgc3RhcnRfdGltZTEgPSBhdl9yZXNjYWxlX3Eoc3QtPnN0YXJ0X3RpbWUsIHN0LT50aW1lX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSB8fCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0RBVEEpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRfdGltZTEgPCBzdGFydF90aW1lX3RleHQpCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0X3RpbWVfdGV4dCA9IHN0YXJ0X3RpbWUxOwotICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBpZiAoaXNfdGV4dCkKKyAgICAgICAgICAgICAgICBzdGFydF90aW1lX3RleHQgPSBGRk1JTihzdGFydF90aW1lX3RleHQsIHN0YXJ0X3RpbWUxKTsKKyAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBzdGFydF90aW1lID0gRkZNSU4oc3RhcnRfdGltZSwgc3RhcnRfdGltZTEpOwogICAgICAgICAgICAgZW5kX3RpbWUxID0gYXZfcmVzY2FsZV9xX3JuZChzdC0+ZHVyYXRpb24sIHN0LT50aW1lX2Jhc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1RJTUVfQkFTRV9RLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9ST1VORF9ORUFSX0lORnxBVl9ST1VORF9QQVNTX01JTk1BWCk7Ci0gICAgICAgICAgICBpZiAoZW5kX3RpbWUxICE9IEFWX05PUFRTX1ZBTFVFKSB7CisgICAgICAgICAgICBpZiAoZW5kX3RpbWUxICE9IEFWX05PUFRTX1ZBTFVFICYmIChlbmRfdGltZTEgPiAwID8gc3RhcnRfdGltZTEgPD0gSU5UNjRfTUFYIC0gZW5kX3RpbWUxIDogc3RhcnRfdGltZTEgPj0gSU5UNjRfTUlOIC0gZW5kX3RpbWUxKSkgewogICAgICAgICAgICAgICAgIGVuZF90aW1lMSArPSBzdGFydF90aW1lMTsKLSAgICAgICAgICAgICAgICBlbmRfdGltZSA9IEZGTUFYKGVuZF90aW1lLCBlbmRfdGltZTEpOworICAgICAgICAgICAgICAgIGlmIChpc190ZXh0KQorICAgICAgICAgICAgICAgICAgICBlbmRfdGltZV90ZXh0ID0gRkZNQVgoZW5kX3RpbWVfdGV4dCwgZW5kX3RpbWUxKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGVuZF90aW1lID0gRkZNQVgoZW5kX3RpbWUsIGVuZF90aW1lMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBmb3IgKHAgPSBOVUxMOyAocCA9IGF2X2ZpbmRfcHJvZ3JhbV9mcm9tX3N0cmVhbShpYywgcCwgaSkpOyApIHsKICAgICAgICAgICAgICAgICBpZiAocC0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSB8fCBwLT5zdGFydF90aW1lID4gc3RhcnRfdGltZTEpCkBAIC0yMzgzLDcgKzI2NjEsMTAgQEAKICAgICAgICAgaWYgKHN0LT5kdXJhdGlvbiAhPSBBVl9OT1BUU19WQUxVRSkgewogICAgICAgICAgICAgZHVyYXRpb24xID0gYXZfcmVzY2FsZV9xKHN0LT5kdXJhdGlvbiwgc3QtPnRpbWVfYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9USU1FX0JBU0VfUSk7Ci0gICAgICAgICAgICBkdXJhdGlvbiAgPSBGRk1BWChkdXJhdGlvbiwgZHVyYXRpb24xKTsKKyAgICAgICAgICAgIGlmIChpc190ZXh0KQorICAgICAgICAgICAgICAgIGR1cmF0aW9uX3RleHQgPSBGRk1BWChkdXJhdGlvbl90ZXh0LCBkdXJhdGlvbjEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gRkZNQVgoZHVyYXRpb24sIGR1cmF0aW9uMSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHN0YXJ0X3RpbWUgPT0gSU5UNjRfTUFYIHx8IChzdGFydF90aW1lID4gc3RhcnRfdGltZV90ZXh0ICYmIHN0YXJ0X3RpbWUgLSBzdGFydF90aW1lX3RleHQgPCBBVl9USU1FX0JBU0UpKQpAQCAtMjM5MSwyMyArMjY3MiwzNiBAQAogICAgIGVsc2UgaWYgKHN0YXJ0X3RpbWUgPiBzdGFydF90aW1lX3RleHQpCiAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1ZFUkJPU0UsICJJZ25vcmluZyBvdXRsaWVyIG5vbiBwcmltYXJ5IHN0cmVhbSBzdGFydHRpbWUgJWZcbiIsIHN0YXJ0X3RpbWVfdGV4dCAvIChmbG9hdClBVl9USU1FX0JBU0UpOwogCisgICAgaWYgKGVuZF90aW1lID09IElOVDY0X01JTiB8fCAoZW5kX3RpbWUgPCBlbmRfdGltZV90ZXh0ICYmIGVuZF90aW1lX3RleHQgLSAodWludDY0X3QpZW5kX3RpbWUgPCBBVl9USU1FX0JBU0UpKQorICAgICAgICBlbmRfdGltZSA9IGVuZF90aW1lX3RleHQ7CisgICAgZWxzZSBpZiAoZW5kX3RpbWUgPCBlbmRfdGltZV90ZXh0KQorICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19WRVJCT1NFLCAiSWdub3Jpbmcgb3V0bGllciBub24gcHJpbWFyeSBzdHJlYW0gZW5kdGltZSAlZlxuIiwgZW5kX3RpbWVfdGV4dCAvIChmbG9hdClBVl9USU1FX0JBU0UpOworCisgICAgIGlmIChkdXJhdGlvbiA9PSBJTlQ2NF9NSU4gfHwgKGR1cmF0aW9uIDwgZHVyYXRpb25fdGV4dCAmJiBkdXJhdGlvbl90ZXh0IC0gZHVyYXRpb24gPCBBVl9USU1FX0JBU0UpKQorICAgICAgICAgZHVyYXRpb24gPSBkdXJhdGlvbl90ZXh0OworICAgICBlbHNlIGlmIChkdXJhdGlvbiA8IGR1cmF0aW9uX3RleHQpCisgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19WRVJCT1NFLCAiSWdub3Jpbmcgb3V0bGllciBub24gcHJpbWFyeSBzdHJlYW0gZHVyYXRpb24gJWZcbiIsIGR1cmF0aW9uX3RleHQgLyAoZmxvYXQpQVZfVElNRV9CQVNFKTsKKwogICAgIGlmIChzdGFydF90aW1lICE9IElOVDY0X01BWCkgewogICAgICAgICBpYy0+c3RhcnRfdGltZSA9IHN0YXJ0X3RpbWU7CiAgICAgICAgIGlmIChlbmRfdGltZSAhPSBJTlQ2NF9NSU4pIHsKLSAgICAgICAgICAgIGlmIChpYy0+bmJfcHJvZ3JhbXMpIHsKKyAgICAgICAgICAgIGlmIChpYy0+bmJfcHJvZ3JhbXMgPiAxKSB7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9wcm9ncmFtczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIHAgPSBpYy0+cHJvZ3JhbXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwLT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFICYmIHAtPmVuZF90aW1lID4gcC0+c3RhcnRfdGltZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAtPnN0YXJ0X3RpbWUgIT0gQVZfTk9QVFNfVkFMVUUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPmVuZF90aW1lID4gcC0+c3RhcnRfdGltZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcC0+ZW5kX3RpbWUgLSAodWludDY0X3QpcC0+c3RhcnRfdGltZSA8PSBJTlQ2NF9NQVgpCiAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IEZGTUFYKGR1cmF0aW9uLCBwLT5lbmRfdGltZSAtIHAtPnN0YXJ0X3RpbWUpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgfSBlbHNlIGlmIChlbmRfdGltZSA+PSBzdGFydF90aW1lICYmIGVuZF90aW1lIC0gKHVpbnQ2NF90KXN0YXJ0X3RpbWUgPD0gSU5UNjRfTUFYKSB7CiAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBGRk1BWChkdXJhdGlvbiwgZW5kX3RpbWUgLSBzdGFydF90aW1lKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAoZHVyYXRpb24gIT0gSU5UNjRfTUlOICYmIGR1cmF0aW9uID4gMCAmJiBpYy0+ZHVyYXRpb24gPT0gQVZfTk9QVFNfVkFMVUUpIHsKICAgICAgICAgaWMtPmR1cmF0aW9uID0gZHVyYXRpb247CiAgICAgfQotICAgIGlmIChpYy0+cGIgJiYgKGZpbGVzaXplID0gYXZpb19zaXplKGljLT5wYikpID4gMCAmJiBpYy0+ZHVyYXRpb24gIT0gQVZfTk9QVFNfVkFMVUUpIHsKKyAgICBpZiAoaWMtPnBiICYmIChmaWxlc2l6ZSA9IGF2aW9fc2l6ZShpYy0+cGIpKSA+IDAgJiYgaWMtPmR1cmF0aW9uID4gMCkgewogICAgICAgICAvKiBjb21wdXRlIHRoZSBiaXRyYXRlICovCiAgICAgICAgIGRvdWJsZSBiaXRyYXRlID0gKGRvdWJsZSkgZmlsZXNpemUgKiA4LjAgKiBBVl9USU1FX0JBU0UgLwogICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIGljLT5kdXJhdGlvbjsKQEAgLTI0NDMsMTYgKzI3MzcsMTggQEAKIAogICAgIC8qIGlmIGJpdF9yYXRlIGlzIGFscmVhZHkgc2V0LCB3ZSBiZWxpZXZlIGl0ICovCiAgICAgaWYgKGljLT5iaXRfcmF0ZSA8PSAwKSB7Ci0gICAgICAgIGludCBiaXRfcmF0ZSA9IDA7CisgICAgICAgIGludDY0X3QgYml0X3JhdGUgPSAwOwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmJpdF9yYXRlID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChJTlRfTUFYIC0gc3QtPmNvZGVjLT5iaXRfcmF0ZSA8IGJpdF9yYXRlKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA8PSAwICYmIHN0LT5pbnRlcm5hbC0+YXZjdHgtPmJpdF9yYXRlID4gMCkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gc3QtPmludGVybmFsLT5hdmN0eC0+Yml0X3JhdGU7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoSU5UNjRfTUFYIC0gc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA8IGJpdF9yYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgIGJpdF9yYXRlID0gMDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJpdF9yYXRlICs9IHN0LT5jb2RlYy0+Yml0X3JhdGU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzID4gMSkgeworICAgICAgICAgICAgICAgIGJpdF9yYXRlICs9IHN0LT5jb2RlY3Bhci0+Yml0X3JhdGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzID4gMSkgewogICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSB2aWRlb3N0cmVhbSB3aXRoIHBhY2tldHMgYnV0IHdpdGhvdXQgYSBiaXRyYXRlCiAgICAgICAgICAgICAgICAgLy8gdGhlbiBjb25zaWRlciB0aGUgc3VtIG5vdCBrbm93bgogICAgICAgICAgICAgICAgIGJpdF9yYXRlID0gMDsKQEAgLTI1MDcsOCArMjgwMyw4IEBACiAgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CiAgICAgICAgIGlmIChzdC0+c3RhcnRfdGltZSA9PSBBVl9OT1BUU19WQUxVRSAmJgogICAgICAgICAgICAgc3QtPmZpcnN0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSAmJgotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9VTktOT1dOKQotICAgICAgICAgICAgYXZfbG9nKHN0LT5jb2RlYywgQVZfTE9HX1dBUk5JTkcsCisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1VOS05PV04pCisgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19XQVJOSU5HLAogICAgICAgICAgICAgICAgICAgICJzdGFydCB0aW1lIGZvciBzdHJlYW0gJWQgaXMgbm90IHNldCBpbiBlc3RpbWF0ZV90aW1pbmdzX2Zyb21fcHRzXG4iLCBpKTsKIAogICAgICAgICBpZiAoc3QtPnBhcnNlcikgewpAQCAtMjU3Myw3ICsyODY5LDcgQEAKICAgICAgICAgICAgIGlzX2VuZCA9IDE7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3QtPmR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFKQpAQCAtMjU5MSw3ICsyODg3LDcgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOwogICAgICAgICBpZiAoc3QtPmR1cmF0aW9uID09IEFWX05PUFRTX1ZBTFVFKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSkgeworICAgICAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgogICAgICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86CiAgICAgICAgICAgICAgICAgaWYgKHN0LT5zdGFydF90aW1lICE9IEFWX05PUFRTX1ZBTFVFIHx8IHN0LT5maXJzdF9kdHMgICE9IEFWX05PUFRTX1ZBTFVFKSB7CkBAIC0yNjMwLDcgKzI5MjYsNyBAQAogCiAgICAgaWYgKCghc3RyY21wKGljLT5pZm9ybWF0LT5uYW1lLCAibXBlZyIpIHx8CiAgICAgICAgICAhc3RyY21wKGljLT5pZm9ybWF0LT5uYW1lLCAibXBlZ3RzIikpICYmCi0gICAgICAgIGZpbGVfc2l6ZSAmJiBpYy0+cGItPnNlZWthYmxlKSB7CisgICAgICAgIGZpbGVfc2l6ZSAmJiAoaWMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkgewogICAgICAgICAvKiBnZXQgYWNjdXJhdGUgZXN0aW1hdGUgZnJvbSB0aGUgUFRTZXMgKi8KICAgICAgICAgZXN0aW1hdGVfdGltaW5nc19mcm9tX3B0cyhpYywgb2xkX29mZnNldCk7CiAgICAgICAgIGljLT5kdXJhdGlvbl9lc3RpbWF0aW9uX21ldGhvZCA9IEFWRk1UX0RVUkFUSU9OX0ZST01fUFRTOwpAQCAtMjY1MSwxMiArMjk0NywxMiBAQAogICAgICAgICBBVlN0cmVhbSBhdl91bnVzZWQgKnN0OwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tpXTsKLSAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1RSQUNFLCAiJWQ6IHN0YXJ0X3RpbWU6ICUwLjNmIGR1cmF0aW9uOiAlMC4zZlxuIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgc3QtPnN0YXJ0X3RpbWUgLyBBVl9USU1FX0JBU0UsCi0gICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHN0LT5kdXJhdGlvbiAgIC8gQVZfVElNRV9CQVNFKTsKKyAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1RSQUNFLCAic3RyZWFtICVkOiBzdGFydF90aW1lOiAlMC4zZiBkdXJhdGlvbjogJTAuM2ZcbiIsIGksCisgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgc3QtPnN0YXJ0X3RpbWUgKiBhdl9xMmQoc3QtPnRpbWVfYmFzZSksCisgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgc3QtPmR1cmF0aW9uICAgKiBhdl9xMmQoc3QtPnRpbWVfYmFzZSkpOwogICAgICAgICB9CiAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1RSQUNFLAotICAgICAgICAgICAgICAgICJzdHJlYW06IHN0YXJ0X3RpbWU6ICUwLjNmIGR1cmF0aW9uOiAlMC4zZiBiaXRyYXRlPSUiUFJJZDY0IiBrYi9zXG4iLAorICAgICAgICAgICAgICAgICJmb3JtYXQ6IHN0YXJ0X3RpbWU6ICUwLjNmIGR1cmF0aW9uOiAlMC4zZiBiaXRyYXRlPSUiUFJJZDY0IiBrYi9zXG4iLAogICAgICAgICAgICAgICAgIChkb3VibGUpIGljLT5zdGFydF90aW1lIC8gQVZfVElNRV9CQVNFLAogICAgICAgICAgICAgICAgIChkb3VibGUpIGljLT5kdXJhdGlvbiAgIC8gQVZfVElNRV9CQVNFLAogICAgICAgICAgICAgICAgIChpbnQ2NF90KWljLT5iaXRfcmF0ZSAvIDEwMDApOwpAQCAtMjY2NSw3ICsyOTYxLDcgQEAKIAogc3RhdGljIGludCBoYXNfY29kZWNfcGFyYW1ldGVycyhBVlN0cmVhbSAqc3QsIGNvbnN0IGNoYXIgKiplcnJtc2dfcHRyKQogewotICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eCA9IHN0LT5jb2RlYzsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXZjdHggPSBzdC0+aW50ZXJuYWwtPmF2Y3R4OwogCiAjZGVmaW5lIEZBSUwoZXJybXNnKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGlmIChlcnJtc2dfcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNjk1LDggKzI5OTEsOCBAQAogICAgICAgICAgICAgRkFJTCgidW5zcGVjaWZpZWQgc2l6ZSIpOwogICAgICAgICBpZiAoc3QtPmluZm8tPmZvdW5kX2RlY29kZXIgPj0gMCAmJiBhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpCiAgICAgICAgICAgICBGQUlMKCJ1bnNwZWNpZmllZCBwaXhlbCBmb3JtYXQiKTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlYzMCB8fCBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JWNDApCi0gICAgICAgICAgICBpZiAoIXN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAmJiAhc3QtPmNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvLm51bSAmJiAhc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzKQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SVjMwIHx8IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUlY0MCkKKyAgICAgICAgICAgIGlmICghc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmICFzdC0+Y29kZWNwYXItPnNhbXBsZV9hc3BlY3RfcmF0aW8ubnVtICYmICFzdC0+Y29kZWNfaW5mb19uYl9mcmFtZXMpCiAgICAgICAgICAgICAgICAgRkFJTCgibm8gZnJhbWUgaW4gcnYzMC80MCBhbmQgbm8gc2FyIik7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgpAQCAtMjcxNCw2ICszMDEwLDcgQEAKIHN0YXRpYyBpbnQgdHJ5X2RlY29kZV9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMsIEFWU3RyZWFtICpzdCwgQVZQYWNrZXQgKmF2cGt0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCiB7CisgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gc3QtPmludGVybmFsLT5hdmN0eDsKICAgICBjb25zdCBBVkNvZGVjICpjb2RlYzsKICAgICBpbnQgZ290X3BpY3R1cmUgPSAxLCByZXQgPSAwOwogICAgIEFWRnJhbWUgKmZyYW1lID0gYXZfZnJhbWVfYWxsb2MoKTsKQEAgLTI3MjUsMTUgKzMwMjIsMTUgQEAKICAgICBpZiAoIWZyYW1lKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgaWYgKCFhdmNvZGVjX2lzX29wZW4oc3QtPmNvZGVjKSAmJgorICAgIGlmICghYXZjb2RlY19pc19vcGVuKGF2Y3R4KSAmJgogICAgICAgICBzdC0+aW5mby0+Zm91bmRfZGVjb2RlciA8PSAwICYmCi0gICAgICAgIChzdC0+Y29kZWMtPmNvZGVjX2lkICE9IC1zdC0+aW5mby0+Zm91bmRfZGVjb2RlciB8fCAhc3QtPmNvZGVjLT5jb2RlY19pZCkpIHsKKyAgICAgICAgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gLXN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyIHx8ICFzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSkgewogICAgICAgICBBVkRpY3Rpb25hcnkgKnRocmVhZF9vcHQgPSBOVUxMOwogCi0gICAgICAgIGNvZGVjID0gZmluZF9kZWNvZGVyKHMsIHN0LCBzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgY29kZWMgPSBmaW5kX3Byb2JlX2RlY29kZXIocywgc3QsIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogCiAgICAgICAgIGlmICghY29kZWMpIHsKLSAgICAgICAgICAgIHN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyID0gLXN0LT5jb2RlYy0+Y29kZWNfaWQ7CisgICAgICAgICAgICBzdC0+aW5mby0+Zm91bmRfZGVjb2RlciA9IC1zdC0+Y29kZWNwYXItPmNvZGVjX2lkOwogICAgICAgICAgICAgcmV0ICAgICAgICAgICAgICAgICAgICAgPSAtMTsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQpAQCAtMjc0MywxMSArMzA0MCwxMSBAQAogICAgICAgICBhdl9kaWN0X3NldChvcHRpb25zID8gb3B0aW9ucyA6ICZ0aHJlYWRfb3B0LCAidGhyZWFkcyIsICIxIiwgMCk7CiAgICAgICAgIGlmIChzLT5jb2RlY193aGl0ZWxpc3QpCiAgICAgICAgICAgICBhdl9kaWN0X3NldChvcHRpb25zID8gb3B0aW9ucyA6ICZ0aHJlYWRfb3B0LCAiY29kZWNfd2hpdGVsaXN0Iiwgcy0+Y29kZWNfd2hpdGVsaXN0LCAwKTsKLSAgICAgICAgcmV0ID0gYXZjb2RlY19vcGVuMihzdC0+Y29kZWMsIGNvZGVjLCBvcHRpb25zID8gb3B0aW9ucyA6ICZ0aHJlYWRfb3B0KTsKKyAgICAgICAgcmV0ID0gYXZjb2RlY19vcGVuMihhdmN0eCwgY29kZWMsIG9wdGlvbnMgPyBvcHRpb25zIDogJnRocmVhZF9vcHQpOwogICAgICAgICBpZiAoIW9wdGlvbnMpCiAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJnRocmVhZF9vcHQpOwogICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgc3QtPmluZm8tPmZvdW5kX2RlY29kZXIgPSAtc3QtPmNvZGVjLT5jb2RlY19pZDsKKyAgICAgICAgICAgIHN0LT5pbmZvLT5mb3VuZF9kZWNvZGVyID0gLWF2Y3R4LT5jb2RlY19pZDsKICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgfQogICAgICAgICBzdC0+aW5mby0+Zm91bmRfZGVjb2RlciA9IDE7CkBAIC0yNzU5LDM5ICszMDU2LDM5IEBACiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlYy0+Y2Fwc19pbnRlcm5hbCAmIEZGX0NPREVDX0NBUF9TS0lQX0ZSQU1FX0ZJTExfUEFSQU0pIHsKKyAgICBpZiAoYXZwcml2X2NvZGVjX2dldF9jYXBfc2tpcF9mcmFtZV9maWxsX3BhcmFtKGF2Y3R4LT5jb2RlYykpIHsKICAgICAgICAgZG9fc2tpcF9mcmFtZSA9IDE7Ci0gICAgICAgIHNraXBfZnJhbWUgPSBzdC0+Y29kZWMtPnNraXBfZnJhbWU7Ci0gICAgICAgIHN0LT5jb2RlYy0+c2tpcF9mcmFtZSA9IEFWRElTQ0FSRF9BTEw7CisgICAgICAgIHNraXBfZnJhbWUgPSBhdmN0eC0+c2tpcF9mcmFtZTsKKyAgICAgICAgYXZjdHgtPnNraXBfZnJhbWUgPSBBVkRJU0NBUkRfQUxMOwogICAgIH0KIAogICAgIHdoaWxlICgocGt0LnNpemUgPiAwIHx8ICghcGt0LmRhdGEgJiYgZ290X3BpY3R1cmUpKSAmJgogICAgICAgICAgICByZXQgPj0gMCAmJgogICAgICAgICAgICAoIWhhc19jb2RlY19wYXJhbWV0ZXJzKHN0LCBOVUxMKSB8fCAhaGFzX2RlY29kZV9kZWxheV9iZWVuX2d1ZXNzZWQoc3QpIHx8CiAgICAgICAgICAgICAoIXN0LT5jb2RlY19pbmZvX25iX2ZyYW1lcyAmJgotICAgICAgICAgICAgIChzdC0+Y29kZWMtPmNvZGVjLT5jYXBhYmlsaXRpZXMgJiBBVl9DT0RFQ19DQVBfQ0hBTk5FTF9DT05GKSkpKSB7CisgICAgICAgICAgICAgKGF2Y3R4LT5jb2RlYy0+Y2FwYWJpbGl0aWVzICYgQVZfQ09ERUNfQ0FQX0NIQU5ORUxfQ09ORikpKSkgewogICAgICAgICBnb3RfcGljdHVyZSA9IDA7Ci0gICAgICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5jb2RlY190eXBlKSB7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfdmlkZW8yKHN0LT5jb2RlYywgZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdvdF9waWN0dXJlLCAmcGt0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFWTUVESUFfVFlQRV9BVURJTzoKLSAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfZGVjb2RlX2F1ZGlvNChzdC0+Y29kZWMsIGZyYW1lLCAmZ290X3BpY3R1cmUsICZwa3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1NVQlRJVExFOgotICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19kZWNvZGVfc3VidGl0bGUyKHN0LT5jb2RlYywgJnN1YnRpdGxlLAorICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPIHx8CisgICAgICAgICAgICBhdmN0eC0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfc2VuZF9wYWNrZXQoYXZjdHgsICZwa3QpOworICAgICAgICAgICAgaWYgKHJldCA8IDAgJiYgcmV0ICE9IEFWRVJST1IoRUFHQUlOKSAmJiByZXQgIT0gQVZFUlJPUl9FT0YpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgcGt0LnNpemUgPSAwOworICAgICAgICAgICAgcmV0ID0gYXZjb2RlY19yZWNlaXZlX2ZyYW1lKGF2Y3R4LCBmcmFtZSk7CisgICAgICAgICAgICBpZiAocmV0ID49IDApCisgICAgICAgICAgICAgICAgZ290X3BpY3R1cmUgPSAxOworICAgICAgICAgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVBR0FJTikgfHwgcmV0ID09IEFWRVJST1JfRU9GKQorICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSB7CisgICAgICAgICAgICByZXQgPSBhdmNvZGVjX2RlY29kZV9zdWJ0aXRsZTIoYXZjdHgsICZzdWJ0aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ290X3BpY3R1cmUsICZwa3QpOwotICAgICAgICAgICAgcmV0ID0gcGt0LnNpemU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHJldCA+PSAwKQorICAgICAgICAgICAgICAgIHBrdC5zaXplID0gMDsKICAgICAgICAgfQogICAgICAgICBpZiAocmV0ID49IDApIHsKICAgICAgICAgICAgIGlmIChnb3RfcGljdHVyZSkKICAgICAgICAgICAgICAgICBzdC0+bmJfZGVjb2RlZF9mcmFtZXMrKzsKLSAgICAgICAgICAgIHBrdC5kYXRhICs9IHJldDsKLSAgICAgICAgICAgIHBrdC5zaXplIC09IHJldDsKICAgICAgICAgICAgIHJldCAgICAgICA9IGdvdF9waWN0dXJlOwogICAgICAgICB9CiAgICAgfQpAQCAtMjgwMSw3ICszMDk4LDcgQEAKIAogZmFpbDoKICAgICBpZiAoZG9fc2tpcF9mcmFtZSkgewotICAgICAgICBzdC0+Y29kZWMtPnNraXBfZnJhbWUgPSBza2lwX2ZyYW1lOworICAgICAgICBhdmN0eC0+c2tpcF9mcmFtZSA9IHNraXBfZnJhbWU7CiAgICAgfQogCiAgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWUpOwpAQCAtMjgzMiw2ICszMTI5LDkgQEAKIAogZW51bSBBVkNvZGVjSUQgZmZfZ2V0X3BjbV9jb2RlY19pZChpbnQgYnBzLCBpbnQgZmx0LCBpbnQgYmUsIGludCBzZmxhZ3MpCiB7CisgICAgaWYgKGJwcyA8PSAwIHx8IGJwcyA+IDY0KQorICAgICAgICByZXR1cm4gQVZfQ09ERUNfSURfTk9ORTsKKwogICAgIGlmIChmbHQpIHsKICAgICAgICAgc3dpdGNoIChicHMpIHsKICAgICAgICAgY2FzZSAzMjoKQEAgLTI4NTQsNiArMzE1NCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGJlID8gQVZfQ09ERUNfSURfUENNX1MyNEJFIDogQVZfQ09ERUNfSURfUENNX1MyNExFOwogICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgIHJldHVybiBiZSA/IEFWX0NPREVDX0lEX1BDTV9TMzJCRSA6IEFWX0NPREVDX0lEX1BDTV9TMzJMRTsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICByZXR1cm4gYmUgPyBBVl9DT0RFQ19JRF9QQ01fUzY0QkUgOiBBVl9DT0RFQ19JRF9QQ01fUzY0TEU7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHJldHVybiBBVl9DT0RFQ19JRF9OT05FOwogICAgICAgICAgICAgfQpAQCAtMjkxNSw3ICszMjE3LDcgQEAKICAgICB1bnNpZ25lZCBpbnQgaSwgajsKICAgICBpbnQ2NF90IG1heF90aW1lID0gMDsKIAotICAgIGlmIChzLT5kdXJhdGlvbiA+IDApCisgICAgaWYgKHMtPmR1cmF0aW9uID4gMCAmJiBzLT5zdGFydF90aW1lIDwgSU5UNjRfTUFYIC0gcy0+ZHVyYXRpb24pCiAgICAgICAgIG1heF90aW1lID0gcy0+ZHVyYXRpb24gKwogICAgICAgICAgICAgICAgICAgICAgICAoKHMtPnN0YXJ0X3RpbWUgPT0gQVZfTk9QVFNfVkFMVUUpID8gMCA6IHMtPnN0YXJ0X3RpbWUpOwogCkBAIC0yOTMzLDcgKzMyMzUsNyBAQAogICAgICAgICAgICAgICAgIGlmIChqICE9IGkgJiYgbmV4dF9zdGFydCA+IGNoLT5zdGFydCAmJiBuZXh0X3N0YXJ0IDwgZW5kKQogICAgICAgICAgICAgICAgICAgICBlbmQgPSBuZXh0X3N0YXJ0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2gtPmVuZCA9IChlbmQgPT0gSU5UNjRfTUFYKSA/IGNoLT5zdGFydCA6IGVuZDsKKyAgICAgICAgICAgIGNoLT5lbmQgPSAoZW5kID09IElOVDY0X01BWCB8fCBlbmQgPCBjaC0+c3RhcnQpID8gY2gtPnN0YXJ0IDogZW5kOwogICAgICAgICB9CiB9CiAKQEAgLTI5NzYsMzcgKzMyNzgsMzQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGZmX2FsbG9jX2V4dHJhZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIGludCBzaXplKQoraW50IGZmX2FsbG9jX2V4dHJhZGF0YShBVkNvZGVjUGFyYW1ldGVycyAqcGFyLCBpbnQgc2l6ZSkKIHsKLSAgICBpbnQgcmV0OworICAgIGF2X2ZyZWVwKCZwYXItPmV4dHJhZGF0YSk7CisgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IDA7CiAKLSAgICBpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+PSBJTlQzMl9NQVggLSBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKSB7Ci0gICAgICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBOVUxMOwotICAgICAgICBhdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgIGlmIChzaXplIDwgMCB8fCBzaXplID49IElOVDMyX01BWCAtIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIGF2Y3R4LT5leHRyYWRhdGEgPSBhdl9tYWxsb2Moc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOwotICAgIGlmIChhdmN0eC0+ZXh0cmFkYXRhKSB7Ci0gICAgICAgIG1lbXNldChhdmN0eC0+ZXh0cmFkYXRhICsgc2l6ZSwgMCwgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSk7Ci0gICAgICAgIGF2Y3R4LT5leHRyYWRhdGFfc2l6ZSA9IHNpemU7Ci0gICAgICAgIHJldCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMDsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLSAgICByZXR1cm4gcmV0OworCisgICAgcGFyLT5leHRyYWRhdGEgPSBhdl9tYWxsb2Moc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgIGlmICghcGFyLT5leHRyYWRhdGEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBtZW1zZXQocGFyLT5leHRyYWRhdGEgKyBzaXplLCAwLCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsKKyAgICBwYXItPmV4dHJhZGF0YV9zaXplID0gc2l6ZTsKKworICAgIHJldHVybiAwOwogfQogCi1pbnQgZmZfZ2V0X2V4dHJhZGF0YShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUpCitpbnQgZmZfZ2V0X2V4dHJhZGF0YShBVkZvcm1hdENvbnRleHQgKnMsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIsIEFWSU9Db250ZXh0ICpwYiwgaW50IHNpemUpCiB7Ci0gICAgaW50IHJldCA9IGZmX2FsbG9jX2V4dHJhZGF0YShhdmN0eCwgc2l6ZSk7CisgICAgaW50IHJldCA9IGZmX2FsbG9jX2V4dHJhZGF0YShwYXIsIHNpemUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwotICAgIHJldCA9IGF2aW9fcmVhZChwYiwgYXZjdHgtPmV4dHJhZGF0YSwgc2l6ZSk7CisgICAgcmV0ID0gYXZpb19yZWFkKHBiLCBwYXItPmV4dHJhZGF0YSwgc2l6ZSk7CiAgICAgaWYgKHJldCAhPSBzaXplKSB7Ci0gICAgICAgIGF2X2ZyZWVwKCZhdmN0eC0+ZXh0cmFkYXRhKTsKLSAgICAgICAgYXZjdHgtPmV4dHJhZGF0YV9zaXplID0gMDsKLSAgICAgICAgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBleHRyYWRhdGEgb2Ygc2l6ZSAlZFxuIiwgc2l6ZSk7CisgICAgICAgIGF2X2ZyZWVwKCZwYXItPmV4dHJhZGF0YSk7CisgICAgICAgIHBhci0+ZXh0cmFkYXRhX3NpemUgPSAwOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlYWQgZXh0cmFkYXRhIG9mIHNpemUgJWRcbiIsIHNpemUpOwogICAgICAgICByZXR1cm4gcmV0IDwgMCA/IHJldCA6IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCkBAIC0zMDc4LDE1ICszMzc3LDE1IEBACiAgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gaWMtPnN0cmVhbXNbaV07CiAKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSBBVk1FRElBX1RZUEVfVklERU8pCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX1ZJREVPKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIC8vIHRoZSBjaGVjayBmb3IgdGJfdW5yZWxpYWJsZSgpIGlzIG5vdCBjb21wbGV0ZWx5IGNvcnJlY3QsIHNpbmNlIHRoaXMgaXMgbm90IGFib3V0IGhhbmRsaW5nCi0gICAgICAgIC8vIGEgdW5yZWxpYWJsZS9pbmV4YWN0IHRpbWUgYmFzZSwgYnV0IGEgdGltZSBiYXNlIHRoYXQgaXMgZmluZXIgdGhhbiBuZWNlc3NhcnksIGFzIGUuZy4KKyAgICAgICAgLy8gYW4gdW5yZWxpYWJsZS9pbmV4YWN0IHRpbWUgYmFzZSwgYnV0IGEgdGltZSBiYXNlIHRoYXQgaXMgZmluZXIgdGhhbiBuZWNlc3NhcnksIGFzIGUuZy4KICAgICAgICAgLy8gaXBtb3ZpZS5jIHByb2R1Y2VzLgotICAgICAgICBpZiAodGJfdW5yZWxpYWJsZShzdC0+Y29kZWMpICYmIHN0LT5pbmZvLT5kdXJhdGlvbl9jb3VudCA+IDE1ICYmIHN0LT5pbmZvLT5kdXJhdGlvbl9nY2QgPiBGRk1BWCgxLCBzdC0+dGltZV9iYXNlLmRlbi8oNTAwTEwqc3QtPnRpbWVfYmFzZS5udW0pKSAmJiAhc3QtPnJfZnJhbWVfcmF0ZS5udW0pCisgICAgICAgIGlmICh0Yl91bnJlbGlhYmxlKHN0LT5pbnRlcm5hbC0+YXZjdHgpICYmIHN0LT5pbmZvLT5kdXJhdGlvbl9jb3VudCA+IDE1ICYmIHN0LT5pbmZvLT5kdXJhdGlvbl9nY2QgPiBGRk1BWCgxLCBzdC0+dGltZV9iYXNlLmRlbi8oNTAwTEwqc3QtPnRpbWVfYmFzZS5udW0pKSAmJiAhc3QtPnJfZnJhbWVfcmF0ZS5udW0pCiAgICAgICAgICAgICBhdl9yZWR1Y2UoJnN0LT5yX2ZyYW1lX3JhdGUubnVtLCAmc3QtPnJfZnJhbWVfcmF0ZS5kZW4sIHN0LT50aW1lX2Jhc2UuZGVuLCBzdC0+dGltZV9iYXNlLm51bSAqIHN0LT5pbmZvLT5kdXJhdGlvbl9nY2QsIElOVF9NQVgpOwogICAgICAgICBpZiAoc3QtPmluZm8tPmR1cmF0aW9uX2NvdW50PjEgJiYgIXN0LT5yX2ZyYW1lX3JhdGUubnVtCi0gICAgICAgICAgICAmJiB0Yl91bnJlbGlhYmxlKHN0LT5jb2RlYykpIHsKKyAgICAgICAgICAgICYmIHRiX3VucmVsaWFibGUoc3QtPmludGVybmFsLT5hdmN0eCkpIHsKICAgICAgICAgICAgIGludCBudW0gPSAwOwogICAgICAgICAgICAgZG91YmxlIGJlc3RfZXJyb3I9IDAuMDE7CiAgICAgICAgICAgICBBVlJhdGlvbmFsIHJlZl9yYXRlID0gc3QtPnJfZnJhbWVfcmF0ZS5udW0gPyBzdC0+cl9mcmFtZV9yYXRlIDogYXZfaW52X3Eoc3QtPnRpbWVfYmFzZSk7CkBAIC0zMDk0LDcgKzMzOTMsOCBAQAogICAgICAgICAgICAgZm9yIChqPSAwOyBqPE1BWF9TVERfVElNRUJBU0VTOyBqKyspIHsKICAgICAgICAgICAgICAgICBpbnQgazsKIAotICAgICAgICAgICAgICAgIGlmIChzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiAmJiBzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiphdl9xMmQoc3QtPnRpbWVfYmFzZSkgPCAoMTAwMSoxMi4wKS9nZXRfc3RkX2ZyYW1lcmF0ZShqKSkKKyAgICAgICAgICAgICAgICBpZiAoc3QtPmluZm8tPmNvZGVjX2luZm9fZHVyYXRpb24gJiYKKyAgICAgICAgICAgICAgICAgICAgc3QtPmluZm8tPmNvZGVjX2luZm9fZHVyYXRpb24qYXZfcTJkKHN0LT50aW1lX2Jhc2UpIDwgKDEwMDEqMTEuNSkvZ2V0X3N0ZF9mcmFtZXJhdGUoaikpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIGlmICghc3QtPmluZm8tPmNvZGVjX2luZm9fZHVyYXRpb24gJiYgZ2V0X3N0ZF9mcmFtZXJhdGUoaikgPCAxMDAxKjEyKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTMxMzYsMTEgKzM0MzYsMTM1IEBACiAgICAgfQogfQogCitzdGF0aWMgaW50IGV4dHJhY3RfZXh0cmFkYXRhX2NoZWNrKEFWU3RyZWFtICpzdCkKK3sKKyAgICBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqZjsKKworICAgIGYgPSBhdl9ic2ZfZ2V0X2J5X25hbWUoImV4dHJhY3RfZXh0cmFkYXRhIik7CisgICAgaWYgKCFmKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGlmIChmLT5jb2RlY19pZHMpIHsKKyAgICAgICAgY29uc3QgZW51bSBBVkNvZGVjSUQgKmlkczsKKyAgICAgICAgZm9yIChpZHMgPSBmLT5jb2RlY19pZHM7ICppZHMgIT0gQVZfQ09ERUNfSURfTk9ORTsgaWRzKyspCisgICAgICAgICAgICBpZiAoKmlkcyA9PSBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV4dHJhY3RfZXh0cmFkYXRhX2luaXQoQVZTdHJlYW0gKnN0KQoreworICAgIEFWU3RyZWFtSW50ZXJuYWwgKmkgPSBzdC0+aW50ZXJuYWw7CisgICAgY29uc3QgQVZCaXRTdHJlYW1GaWx0ZXIgKmY7CisgICAgaW50IHJldDsKKworICAgIGYgPSBhdl9ic2ZfZ2V0X2J5X25hbWUoImV4dHJhY3RfZXh0cmFkYXRhIik7CisgICAgaWYgKCFmKQorICAgICAgICBnb3RvIGZpbmlzaDsKKworICAgIC8qIGNoZWNrIHRoYXQgdGhlIGNvZGVjIGlkIGlzIHN1cHBvcnRlZCAqLworICAgIHJldCA9IGV4dHJhY3RfZXh0cmFkYXRhX2NoZWNrKHN0KTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgZ290byBmaW5pc2g7CisKKyAgICBpLT5leHRyYWN0X2V4dHJhZGF0YS5wa3QgPSBhdl9wYWNrZXRfYWxsb2MoKTsKKyAgICBpZiAoIWktPmV4dHJhY3RfZXh0cmFkYXRhLnBrdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldCA9IGF2X2JzZl9hbGxvYyhmLCAmaS0+ZXh0cmFjdF9leHRyYWRhdGEuYnNmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkoaS0+ZXh0cmFjdF9leHRyYWRhdGEuYnNmLT5wYXJfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaS0+ZXh0cmFjdF9leHRyYWRhdGEuYnNmLT50aW1lX2Jhc2VfaW4gPSBzdC0+dGltZV9iYXNlOworCisgICAgLyogaWYgaW5pdCBmYWlscyBoZXJlLCB3ZSBhc3N1bWUgZXh0cmFjdGluZyBleHRyYWRhdGEgaXMganVzdCBub3QKKyAgICAgKiBzdXBwb3J0ZWQgZm9yIHRoaXMgY29kZWMsIHNvIHdlIHJldHVybiBzdWNjZXNzICovCisgICAgcmV0ID0gYXZfYnNmX2luaXQoaS0+ZXh0cmFjdF9leHRyYWRhdGEuYnNmKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9ic2ZfZnJlZSgmaS0+ZXh0cmFjdF9leHRyYWRhdGEuYnNmKTsKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9CisKK2ZpbmlzaDoKKyAgICBpLT5leHRyYWN0X2V4dHJhZGF0YS5pbml0ZWQgPSAxOworCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGF2X2JzZl9mcmVlKCZpLT5leHRyYWN0X2V4dHJhZGF0YS5ic2YpOworICAgIGF2X3BhY2tldF9mcmVlKCZpLT5leHRyYWN0X2V4dHJhZGF0YS5wa3QpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXh0cmFjdF9leHRyYWRhdGEoQVZTdHJlYW0gKnN0LCBBVlBhY2tldCAqcGt0KQoreworICAgIEFWU3RyZWFtSW50ZXJuYWwgKmkgPSBzdC0+aW50ZXJuYWw7CisgICAgQVZQYWNrZXQgKnBrdF9yZWY7CisgICAgaW50IHJldDsKKworICAgIGlmICghaS0+ZXh0cmFjdF9leHRyYWRhdGEuaW5pdGVkKSB7CisgICAgICAgIHJldCA9IGV4dHJhY3RfZXh0cmFkYXRhX2luaXQoc3QpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGktPmV4dHJhY3RfZXh0cmFkYXRhLmluaXRlZCAmJiAhaS0+ZXh0cmFjdF9leHRyYWRhdGEuYnNmKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHBrdF9yZWYgPSBpLT5leHRyYWN0X2V4dHJhZGF0YS5wa3Q7CisgICAgcmV0ID0gYXZfcGFja2V0X3JlZihwa3RfcmVmLCBwa3QpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0ID0gYXZfYnNmX3NlbmRfcGFja2V0KGktPmV4dHJhY3RfZXh0cmFkYXRhLmJzZiwgcGt0X3JlZik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdF9yZWYpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHdoaWxlIChyZXQgPj0gMCAmJiAhaS0+YXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICBpbnQgZXh0cmFkYXRhX3NpemU7CisgICAgICAgIHVpbnQ4X3QgKmV4dHJhZGF0YTsKKworICAgICAgICByZXQgPSBhdl9ic2ZfcmVjZWl2ZV9wYWNrZXQoaS0+ZXh0cmFjdF9leHRyYWRhdGEuYnNmLCBwa3RfcmVmKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUihFQUdBSU4pICYmIHJldCAhPSBBVkVSUk9SX0VPRikKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBleHRyYWRhdGEgPSBhdl9wYWNrZXRfZ2V0X3NpZGVfZGF0YShwa3RfcmVmLCBBVl9QS1RfREFUQV9ORVdfRVhUUkFEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0cmFkYXRhX3NpemUpOworCisgICAgICAgIGlmIChleHRyYWRhdGEpIHsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoIWktPmF2Y3R4LT5leHRyYWRhdGEpOworICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClleHRyYWRhdGFfc2l6ZSA8IEZGX01BWF9FWFRSQURBVEFfU0laRSkKKyAgICAgICAgICAgICAgICBpLT5hdmN0eC0+ZXh0cmFkYXRhID0gYXZfbWFsbG9jeihleHRyYWRhdGFfc2l6ZSArIEFWX0lOUFVUX0JVRkZFUl9QQURESU5HX1NJWkUpOworICAgICAgICAgICAgaWYgKCFpLT5hdmN0eC0+ZXh0cmFkYXRhKSB7CisgICAgICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKHBrdF9yZWYpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoaS0+YXZjdHgtPmV4dHJhZGF0YSwgZXh0cmFkYXRhLCBleHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBpLT5hdmN0eC0+ZXh0cmFkYXRhX3NpemUgPSBleHRyYWRhdGFfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0X3JlZik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKIGludCBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKEFWRm9ybWF0Q29udGV4dCAqaWMsIEFWRGljdGlvbmFyeSAqKm9wdGlvbnMpCiB7Ci0gICAgaW50IGksIGNvdW50LCByZXQgPSAwLCBqOworICAgIGludCBpLCBjb3VudCA9IDAsIHJldCA9IDAsIGo7CiAgICAgaW50NjRfdCByZWFkX3NpemU7CiAgICAgQVZTdHJlYW0gKnN0OworICAgIEFWQ29kZWNDb250ZXh0ICphdmN0eDsKICAgICBBVlBhY2tldCBwa3QxLCAqcGt0OwogICAgIGludDY0X3Qgb2xkX29mZnNldCAgPSBhdmlvX3RlbGwoaWMtPnBiKTsKICAgICAvLyBuZXcgc3RyZWFtcyBtaWdodCBhcHBlYXIsIG5vIG9wdGlvbnMgZm9yIHRob3NlCkBAIC0zMTUwLDYgKzM1NzQsOCBAQAogICAgIGludDY0X3QgbWF4X3N0cmVhbV9hbmFseXplX2R1cmF0aW9uOwogICAgIGludDY0X3QgbWF4X3N1YnRpdGxlX2FuYWx5emVfZHVyYXRpb247CiAgICAgaW50NjRfdCBwcm9iZXNpemUgPSBpYy0+cHJvYmVzaXplOworICAgIGludCBlb2ZfcmVhY2hlZCA9IDA7CisgICAgaW50ICptaXNzaW5nX3N0cmVhbXMgPSBhdl9vcHRfcHRyKGljLT5pZm9ybWF0LT5wcml2X2NsYXNzLCBpYy0+cHJpdl9kYXRhLCAibWlzc2luZ19zdHJlYW1zIik7CiAKICAgICBmbHVzaF9jb2RlY3MgPSBwcm9iZXNpemUgPiAwOwogCkBAIC0zMTYzLDI3ICszNTg5LDQxIEBACiAgICAgICAgIG1heF9zdWJ0aXRsZV9hbmFseXplX2R1cmF0aW9uID0gMzAqQVZfVElNRV9CQVNFOwogICAgICAgICBpZiAoIXN0cmNtcChpYy0+aWZvcm1hdC0+bmFtZSwgImZsdiIpKQogICAgICAgICAgICAgbWF4X3N0cmVhbV9hbmFseXplX2R1cmF0aW9uID0gOTAqQVZfVElNRV9CQVNFOworICAgICAgICBpZiAoIXN0cmNtcChpYy0+aWZvcm1hdC0+bmFtZSwgIm1wZWciKSB8fCAhc3RyY21wKGljLT5pZm9ybWF0LT5uYW1lLCAibXBlZ3RzIikpCisgICAgICAgICAgICBtYXhfc3RyZWFtX2FuYWx5emVfZHVyYXRpb24gPSA3KkFWX1RJTUVfQkFTRTsKICAgICB9CiAKICAgICBpZiAoaWMtPnBiKQotICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19ERUJVRywgIkJlZm9yZSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkgcG9zOiAlIlBSSWQ2NCIgYnl0ZXMgcmVhZDolIlBSSWQ2NCIgc2Vla3M6JWRcbiIsCi0gICAgICAgICAgICAgICBhdmlvX3RlbGwoaWMtPnBiKSwgaWMtPnBiLT5ieXRlc19yZWFkLCBpYy0+cGItPnNlZWtfY291bnQpOworICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19ERUJVRywgIkJlZm9yZSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkgcG9zOiAlIlBSSWQ2NCIgYnl0ZXMgcmVhZDolIlBSSWQ2NCIgc2Vla3M6JWQgbmJfc3RyZWFtczolZFxuIiwKKyAgICAgICAgICAgICAgIGF2aW9fdGVsbChpYy0+cGIpLCBpYy0+cGItPmJ5dGVzX3JlYWQsIGljLT5wYi0+c2Vla19jb3VudCwgaWMtPm5iX3N0cmVhbXMpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgY29uc3QgQVZDb2RlYyAqY29kZWM7CiAgICAgICAgIEFWRGljdGlvbmFyeSAqdGhyZWFkX29wdCA9IE5VTEw7CiAgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CisgICAgICAgIGF2Y3R4ID0gc3QtPmludGVybmFsLT5hdmN0eDsKIAotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSkgewogLyogICAgICAgICAgICBpZiAoIXN0LT50aW1lX2Jhc2UubnVtKQogICAgICAgICAgICAgICAgIHN0LT50aW1lX2Jhc2UgPSAqLwotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPnRpbWVfYmFzZS5udW0pCi0gICAgICAgICAgICAgICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UgPSBzdC0+dGltZV9iYXNlOworICAgICAgICAgICAgaWYgKCFhdmN0eC0+dGltZV9iYXNlLm51bSkKKyAgICAgICAgICAgICAgICBhdmN0eC0+dGltZV9iYXNlID0gc3QtPnRpbWVfYmFzZTsKICAgICAgICAgfQorCisgICAgICAgIC8qIGNoZWNrIGlmIHRoZSBjYWxsZXIgaGFzIG92ZXJyaWRkZW4gdGhlIGNvZGVjIGlkICovCisjaWYgRkZfQVBJX0xBVkZfQVZDVFgKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gc3QtPmludGVybmFsLT5vcmlnX2NvZGVjX2lkKSB7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBzdC0+Y29kZWMtPmNvZGVjX2lkOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gc3QtPmNvZGVjLT5jb2RlY190eXBlOworICAgICAgICAgICAgc3QtPmludGVybmFsLT5vcmlnX2NvZGVjX2lkID0gc3QtPmNvZGVjLT5jb2RlY19pZDsKKyAgICAgICAgfQorRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKICAgICAgICAgLy8gb25seSBmb3IgdGhlIHNwbGl0IHN0dWZmCiAgICAgICAgIGlmICghc3QtPnBhcnNlciAmJiAhKGljLT5mbGFncyAmIEFWRk1UX0ZMQUdfTk9QQVJTRSkgJiYgc3QtPnJlcXVlc3RfcHJvYmUgPD0gMCkgewotICAgICAgICAgICAgc3QtPnBhcnNlciA9IGF2X3BhcnNlcl9pbml0KHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgICAgICAgICAgc3QtPnBhcnNlciA9IGF2X3BhcnNlcl9pbml0KHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogICAgICAgICAgICAgaWYgKHN0LT5wYXJzZXIpIHsKICAgICAgICAgICAgICAgICBpZiAoc3QtPm5lZWRfcGFyc2luZyA9PSBBVlNUUkVBTV9QQVJTRV9IRUFERVJTKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0LT5wYXJzZXItPmZsYWdzIHw9IFBBUlNFUl9GTEFHX0NPTVBMRVRFX0ZSQU1FUzsKQEAgLTMxOTMsMTAgKzM2MzMsMjAgQEAKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3QtPm5lZWRfcGFyc2luZykgewogICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1ZFUkJPU0UsICJwYXJzZXIgbm90IGZvdW5kIGZvciBjb2RlYyAiCiAgICAgICAgICAgICAgICAgICAgICAgICIlcywgcGFja2V0cyBvciB0aW1lcyBtYXkgYmUgaW52YWxpZC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGF2Y29kZWNfZ2V0X25hbWUoc3QtPmNvZGVjLT5jb2RlY19pZCkpOworICAgICAgICAgICAgICAgICAgICAgICBhdmNvZGVjX2dldF9uYW1lKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjb2RlYyA9IGZpbmRfZGVjb2RlcihpYywgc3QsIHN0LT5jb2RlYy0+Y29kZWNfaWQpOworCisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IHN0LT5pbnRlcm5hbC0+b3JpZ19jb2RlY19pZCkKKyAgICAgICAgICAgIHN0LT5pbnRlcm5hbC0+b3JpZ19jb2RlY19pZCA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQ7CisKKyAgICAgICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX3RvX2NvbnRleHQoYXZjdHgsIHN0LT5jb2RlY3Bhcik7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmaW5kX3N0cmVhbV9pbmZvX2VycjsKKyAgICAgICAgaWYgKHN0LT5yZXF1ZXN0X3Byb2JlIDw9IDApCisgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPmF2Y3R4X2luaXRlZCA9IDE7CisKKyAgICAgICAgY29kZWMgPSBmaW5kX3Byb2JlX2RlY29kZXIoaWMsIHN0LCBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKIAogICAgICAgICAvKiBGb3JjZSB0aHJlYWQgY291bnQgdG8gMSBzaW5jZSB0aGUgSC4yNjQgZGVjb2RlciB3aWxsIG5vdCBleHRyYWN0CiAgICAgICAgICAqIFNQUyBhbmQgUFBTIHRvIGV4dHJhZGF0YSBkdXJpbmcgbXVsdGktdGhyZWFkZWQgZGVjb2RpbmcuICovCkBAIC0zMjA2LDE5ICszNjU2LDE5IEBACiAgICAgICAgICAgICBhdl9kaWN0X3NldChvcHRpb25zID8gJm9wdGlvbnNbaV0gOiAmdGhyZWFkX29wdCwgImNvZGVjX3doaXRlbGlzdCIsIGljLT5jb2RlY193aGl0ZWxpc3QsIDApOwogCiAgICAgICAgIC8qIEVuc3VyZSB0aGF0IHN1YnRpdGxlX2hlYWRlciBpcyBwcm9wZXJseSBzZXQuICovCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFCi0gICAgICAgICAgICAmJiBjb2RlYyAmJiAhc3QtPmNvZGVjLT5jb2RlYykgewotICAgICAgICAgICAgaWYgKGF2Y29kZWNfb3BlbjIoc3QtPmNvZGVjLCBjb2RlYywgb3B0aW9ucyA/ICZvcHRpb25zW2ldIDogJnRocmVhZF9vcHQpIDwgMCkKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfU1VCVElUTEUKKyAgICAgICAgICAgICYmIGNvZGVjICYmICFhdmN0eC0+Y29kZWMpIHsKKyAgICAgICAgICAgIGlmIChhdmNvZGVjX29wZW4yKGF2Y3R4LCBjb2RlYywgb3B0aW9ucyA/ICZvcHRpb25zW2ldIDogJnRocmVhZF9vcHQpIDwgMCkKICAgICAgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gY29kZWMgaW4gYXZfZmluZF9zdHJlYW1faW5mb1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBjb2RlYyBpbiAlc1xuIixfX0ZVTkNUSU9OX18pOwogICAgICAgICB9CiAKICAgICAgICAgLy8gVHJ5IHRvIGp1c3Qgb3BlbiBkZWNvZGVycywgaW4gY2FzZSB0aGlzIGlzIGVub3VnaCB0byBnZXQgcGFyYW1ldGVycy4KICAgICAgICAgaWYgKCFoYXNfY29kZWNfcGFyYW1ldGVycyhzdCwgTlVMTCkgJiYgc3QtPnJlcXVlc3RfcHJvYmUgPD0gMCkgewotICAgICAgICAgICAgaWYgKGNvZGVjICYmICFzdC0+Y29kZWMtPmNvZGVjKQotICAgICAgICAgICAgICAgIGlmIChhdmNvZGVjX29wZW4yKHN0LT5jb2RlYywgY29kZWMsIG9wdGlvbnMgPyAmb3B0aW9uc1tpXSA6ICZ0aHJlYWRfb3B0KSA8IDApCisgICAgICAgICAgICBpZiAoY29kZWMgJiYgIWF2Y3R4LT5jb2RlYykKKyAgICAgICAgICAgICAgICBpZiAoYXZjb2RlY19vcGVuMihhdmN0eCwgY29kZWMsIG9wdGlvbnMgPyAmb3B0aW9uc1tpXSA6ICZ0aHJlYWRfb3B0KSA8IDApCiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gY29kZWMgaW4gYXZfZmluZF9zdHJlYW1faW5mb1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG9wZW4gY29kZWMgaW4gJXNcbiIsX19GVU5DVElPTl9fKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIW9wdGlvbnMpCiAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJnRocmVhZF9vcHQpOwpAQCAtMzIzMiw3ICszNjgyLDYgQEAKICAgICAgICAgaWMtPnN0cmVhbXNbaV0tPmluZm8tPmZwc19sYXN0X2R0cyAgPSBBVl9OT1BUU19WQUxVRTsKICAgICB9CiAKLSAgICBjb3VudCAgICAgPSAwOwogICAgIHJlYWRfc2l6ZSA9IDA7CiAgICAgZm9yICg7OykgewogICAgICAgICBpbnQgYW5hbHl6ZWRfYWxsX3N0cmVhbXM7CkBAIC0zMjQ1LDYgKzM2OTQsNyBAQAogICAgICAgICAvKiBjaGVjayBpZiBvbmUgY29kZWMgc3RpbGwgbmVlZHMgdG8gYmUgaGFuZGxlZCAqLwogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICAgICAgaW50IGZwc19hbmFseXplX2ZyYW1lY291bnQgPSAyMDsKKyAgICAgICAgICAgIGludCBjb3VudDsKIAogICAgICAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tpXTsKICAgICAgICAgICAgIGlmICghaGFzX2NvZGVjX3BhcmFtZXRlcnMoc3QsIE5VTEwpKQpAQCAtMzI1NCwzMiArMzcwNCwzOSBAQAogICAgICAgICAgICAgICogdGhlIGNvcnJlY3QgZnBzLiAqLwogICAgICAgICAgICAgaWYgKGF2X3EyZChzdC0+dGltZV9iYXNlKSA+IDAuMDAwNSkKICAgICAgICAgICAgICAgICBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ICo9IDI7Ci0gICAgICAgICAgICBpZiAoIXRiX3VucmVsaWFibGUoc3QtPmNvZGVjKSkKKyAgICAgICAgICAgIGlmICghdGJfdW5yZWxpYWJsZShzdC0+aW50ZXJuYWwtPmF2Y3R4KSkKICAgICAgICAgICAgICAgICBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ID0gMDsKICAgICAgICAgICAgIGlmIChpYy0+ZnBzX3Byb2JlX3NpemUgPj0gMCkKICAgICAgICAgICAgICAgICBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ID0gaWMtPmZwc19wcm9iZV9zaXplOwogICAgICAgICAgICAgaWYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykKICAgICAgICAgICAgICAgICBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50ID0gMDsKICAgICAgICAgICAgIC8qIHZhcmlhYmxlIGZwcyBhbmQgbm8gZ3Vlc3MgYXQgdGhlIHJlYWwgZnBzICovCisgICAgICAgICAgICBjb3VudCA9IChpYy0+aWZvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT1RJTUVTVEFNUFMpID8KKyAgICAgICAgICAgICAgICAgICAgICAgc3QtPmluZm8tPmNvZGVjX2luZm9fZHVyYXRpb25fZmllbGRzLzIgOgorICAgICAgICAgICAgICAgICAgICAgICBzdC0+aW5mby0+ZHVyYXRpb25fY291bnQ7CiAgICAgICAgICAgICBpZiAoIShzdC0+cl9mcmFtZV9yYXRlLm51bSAmJiBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtKSAmJgotICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSAoaWMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9USU1FU1RBTVBTKSA/Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uX2ZpZWxkcy8yIDoKLSAgICAgICAgICAgICAgICAgICAgc3QtPmluZm8tPmR1cmF0aW9uX2NvdW50OworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKICAgICAgICAgICAgICAgICBpZiAoY291bnQgPCBmcHNfYW5hbHl6ZV9mcmFtZWNvdW50KQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdC0+cGFyc2VyICYmIHN0LT5wYXJzZXItPnBhcnNlci0+c3BsaXQgJiYKLSAgICAgICAgICAgICAgICAhc3QtPmNvZGVjLT5leHRyYWRhdGEpCisgICAgICAgICAgICAvLyBMb29rIGF0IHRoZSBmaXJzdCAzIGZyYW1lcyBpZiB0aGVyZSBpcyBldmlkZW5jZSBvZiBmcmFtZSBkZWxheQorICAgICAgICAgICAgLy8gYnV0IHRoZSBkZWNvZGVyIGRlbGF5IGlzIG5vdCBzZXQuCisgICAgICAgICAgICBpZiAoc3QtPmluZm8tPmZyYW1lX2RlbGF5X2V2aWRlbmNlICYmIGNvdW50IDwgMiAmJiBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5oYXNfYl9mcmFtZXMgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmICghc3QtPmludGVybmFsLT5hdmN0eC0+ZXh0cmFkYXRhICYmCisgICAgICAgICAgICAgICAgKCFzdC0+aW50ZXJuYWwtPmV4dHJhY3RfZXh0cmFkYXRhLmluaXRlZCB8fAorICAgICAgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPmV4dHJhY3RfZXh0cmFkYXRhLmJzZikgJiYKKyAgICAgICAgICAgICAgICBleHRyYWN0X2V4dHJhZGF0YV9jaGVjayhzdCkpCiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBpZiAoc3QtPmZpcnN0X2R0cyA9PSBBVl9OT1BUU19WQUxVRSAmJgogICAgICAgICAgICAgICAgICEoaWMtPmlmb3JtYXQtPmZsYWdzICYgQVZGTVRfTk9USU1FU1RBTVBTKSAmJgotICAgICAgICAgICAgICAgIHN0LT5jb2RlY19pbmZvX25iX2ZyYW1lcyA8IGljLT5tYXhfdHNfcHJvYmUgJiYKLSAgICAgICAgICAgICAgICAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAotICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNfaW5mb19uYl9mcmFtZXMgPCAoKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykgPyAxIDogaWMtPm1heF90c19wcm9iZSkgJiYKKyAgICAgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyB8fAorICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBhbmFseXplZF9hbGxfc3RyZWFtcyA9IDA7CisgICAgICAgIGlmICghbWlzc2luZ19zdHJlYW1zIHx8ICEqbWlzc2luZ19zdHJlYW1zKQogICAgICAgICBpZiAoaSA9PSBpYy0+bmJfc3RyZWFtcykgewogICAgICAgICAgICAgYW5hbHl6ZWRfYWxsX3N0cmVhbXMgPSAxOwogICAgICAgICAgICAgLyogTk9URTogSWYgdGhlIGZvcm1hdCBoYXMgbm8gaGVhZGVyLCB0aGVuIHdlIG5lZWQgdG8gcmVhZCBzb21lCkBAIC0zMzAwLDcgKzM3NTcsNyBAQAogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspCiAgICAgICAgICAgICAgICAgaWYgKCFpYy0+c3RyZWFtc1tpXS0+cl9mcmFtZV9yYXRlLm51bSAmJgogICAgICAgICAgICAgICAgICAgICBpYy0+c3RyZWFtc1tpXS0+aW5mby0+ZHVyYXRpb25fY291bnQgPD0gMSAmJgotICAgICAgICAgICAgICAgICAgICBpYy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmCisgICAgICAgICAgICAgICAgICAgIGljLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYKICAgICAgICAgICAgICAgICAgICAgc3RyY21wKGljLT5pZm9ybWF0LT5uYW1lLCAiaW1hZ2UyIikpCiAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyZWFtICMlZDogbm90IGVub3VnaCBmcmFtZXMgdG8gZXN0aW1hdGUgcmF0ZTsgIgpAQCAtMzMxNiwxNCArMzc3MywxNiBAQAogCiAgICAgICAgIGlmIChyZXQgPCAwKSB7CiAgICAgICAgICAgICAvKiBFT0Ygb3IgZXJyb3IqLworICAgICAgICAgICAgZW9mX3JlYWNoZWQgPSAxOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBwa3QgPSAmcGt0MTsKIAogICAgICAgICBpZiAoIShpYy0+ZmxhZ3MgJiBBVkZNVF9GTEFHX05PQlVGRkVSKSkgewotICAgICAgICAgICAgcmV0ID0gYWRkX3RvX3BrdGJ1ZigmaWMtPmludGVybmFsLT5wYWNrZXRfYnVmZmVyLCBwa3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpYy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXJfZW5kLCAwKTsKKyAgICAgICAgICAgIHJldCA9IGZmX3BhY2tldF9saXN0X3B1dCgmaWMtPmludGVybmFsLT5wYWNrZXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpYy0+aW50ZXJuYWwtPnBhY2tldF9idWZmZXJfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBrdCwgMCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICBnb3RvIGZpbmRfc3RyZWFtX2luZm9fZXJyOwogICAgICAgICB9CkBAIC0zMzMyLDYgKzM3OTEsMTQgQEAKICAgICAgICAgaWYgKCEoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDKSkKICAgICAgICAgICAgIHJlYWRfc2l6ZSArPSBwa3QtPnNpemU7CiAKKyAgICAgICAgYXZjdHggPSBzdC0+aW50ZXJuYWwtPmF2Y3R4OworICAgICAgICBpZiAoIXN0LT5pbnRlcm5hbC0+YXZjdHhfaW5pdGVkKSB7CisgICAgICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChhdmN0eCwgc3QtPmNvZGVjcGFyKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluZF9zdHJlYW1faW5mb19lcnI7CisgICAgICAgICAgICBzdC0+aW50ZXJuYWwtPmF2Y3R4X2luaXRlZCA9IDE7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgc3QtPmNvZGVjX2luZm9fbmJfZnJhbWVzID4gMSkgewogICAgICAgICAgICAgLyogY2hlY2sgZm9yIG5vbi1pbmNyZWFzaW5nIGR0cyAqLwogICAgICAgICAgICAgaWYgKHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKQEAgLTMzNTAsOCArMzgxNyw4IEBACiAgICAgICAgICAgICAgKiBzZXF1ZW5jZSwgd2UgdHJlYXQgaXQgYXMgYSBkaXNjb250aW51aXR5LiAqLwogICAgICAgICAgICAgaWYgKHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYKICAgICAgICAgICAgICAgICBzdC0+aW5mby0+ZnBzX2xhc3RfZHRzX2lkeCA+IHN0LT5pbmZvLT5mcHNfZmlyc3RfZHRzX2lkeCAmJgotICAgICAgICAgICAgICAgIChwa3QtPmR0cyAtIHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMpIC8gMTAwMCA+Ci0gICAgICAgICAgICAgICAgKHN0LT5pbmZvLT5mcHNfbGFzdF9kdHMgICAgIC0gc3QtPmluZm8tPmZwc19maXJzdF9kdHMpIC8KKyAgICAgICAgICAgICAgICAocGt0LT5kdHMgLSAodWludDY0X3Qpc3QtPmluZm8tPmZwc19sYXN0X2R0cykgLyAxMDAwID4KKyAgICAgICAgICAgICAgICAoc3QtPmluZm8tPmZwc19sYXN0X2R0cyAgICAgLSAodWludDY0X3Qpc3QtPmluZm8tPmZwc19maXJzdF9kdHMpIC8KICAgICAgICAgICAgICAgICAoc3QtPmluZm8tPmZwc19sYXN0X2R0c19pZHggLSBzdC0+aW5mby0+ZnBzX2ZpcnN0X2R0c19pZHgpKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKGljLCBBVl9MT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAgICAgICAgIkRUUyBkaXNjb250aW51aXR5IGluIHN0cmVhbSAlZDogcGFja2V0ICVkIHdpdGggRFRTICIKQEAgLTMzODcsNyArMzg1NCw3IEBACiAgICAgICAgICAgICAgICAgdCA9IEZGTUFYKHQsIGF2X3Jlc2NhbGVfcShzdC0+aW5mby0+ZnBzX2xhc3RfZHRzIC0gc3QtPmluZm8tPmZwc19maXJzdF9kdHMsIHN0LT50aW1lX2Jhc2UsIEFWX1RJTUVfQkFTRV9RKSk7CiAKICAgICAgICAgICAgIGlmIChhbmFseXplZF9hbGxfc3RyZWFtcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gbWF4X2FuYWx5emVfZHVyYXRpb247Ci0gICAgICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSBsaW1pdCA9IG1heF9zdWJ0aXRsZV9hbmFseXplX2R1cmF0aW9uOworICAgICAgICAgICAgZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFKSBsaW1pdCA9IG1heF9zdWJ0aXRsZV9hbmFseXplX2R1cmF0aW9uOwogICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBtYXhfc3RyZWFtX2FuYWx5emVfZHVyYXRpb247CiAKICAgICAgICAgICAgIGlmICh0ID49IGxpbWl0KSB7CkBAIC0zMzk5LDI1ICszODY2LDI0IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocGt0LT5kdXJhdGlvbikgewotICAgICAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1NVQlRJVExFICYmIHBrdC0+cHRzICE9IEFWX05PUFRTX1ZBTFVFICYmIHBrdC0+cHRzID49IHN0LT5zdGFydF90aW1lKSB7CisgICAgICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9TVUJUSVRMRSAmJiBwa3QtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSAmJiBwa3QtPnB0cyA+PSBzdC0+c3RhcnRfdGltZSkgewogICAgICAgICAgICAgICAgICAgICBzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbiA9IEZGTUlOKHBrdC0+cHRzIC0gc3QtPnN0YXJ0X3RpbWUsIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uICsgcGt0LT5kdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uICs9IHBrdC0+ZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgc3QtPmluZm8tPmNvZGVjX2luZm9fZHVyYXRpb25fZmllbGRzICs9IHN0LT5wYXJzZXIgJiYgc3QtPm5lZWRfcGFyc2luZyAmJiBzdC0+Y29kZWMtPnRpY2tzX3Blcl9mcmFtZSA9PTIgPyBzdC0+cGFyc2VyLT5yZXBlYXRfcGljdCArIDEgOiAyOworICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uX2ZpZWxkcyArPSBzdC0+cGFyc2VyICYmIHN0LT5uZWVkX3BhcnNpbmcgJiYgYXZjdHgtPnRpY2tzX3Blcl9mcmFtZSA9PTIgPyBzdC0+cGFyc2VyLT5yZXBlYXRfcGljdCArIDEgOiAyOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAjaWYgRkZfQVBJX1JfRlJBTUVfUkFURQotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykKICAgICAgICAgICAgIGZmX3JmcHNfYWRkX2ZyYW1lKGljLCBzdCwgcGt0LT5kdHMpOwogI2VuZGlmCi0gICAgICAgIGlmIChzdC0+cGFyc2VyICYmIHN0LT5wYXJzZXItPnBhcnNlci0+c3BsaXQgJiYgIXN0LT5jb2RlYy0+ZXh0cmFkYXRhKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IHN0LT5wYXJzZXItPnBhcnNlci0+c3BsaXQoc3QtPmNvZGVjLCBwa3QtPmRhdGEsIHBrdC0+c2l6ZSk7Ci0gICAgICAgICAgICBpZiAoaSA+IDAgJiYgaSA8IEZGX01BWF9FWFRSQURBVEFfU0laRSkgewotICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCBpKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIHBrdC0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGt0LT5kdHMgIT0gcGt0LT5wdHMgJiYgcGt0LT5kdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcGt0LT5wdHMgIT0gQVZfTk9QVFNfVkFMVUUpCisgICAgICAgICAgICAgICAgc3QtPmluZm8tPmZyYW1lX2RlbGF5X2V2aWRlbmNlID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXN0LT5pbnRlcm5hbC0+YXZjdHgtPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgcmV0ID0gZXh0cmFjdF9leHRyYWRhdGEoc3QsIHBrdCk7CisgICAgICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmRfc3RyZWFtX2luZm9fZXJyOwogICAgICAgICB9CiAKICAgICAgICAgLyogSWYgc3RpbGwgbm8gaW5mb3JtYXRpb24sIHdlIHRyeSB0byBvcGVuIHRoZSBjb2RlYyBhbmQgdG8KQEAgLTM0MzksNiArMzkwNSwzMiBAQAogICAgICAgICBjb3VudCsrOwogICAgIH0KIAorICAgIGlmIChlb2ZfcmVhY2hlZCkgeworICAgICAgICBpbnQgc3RyZWFtX2luZGV4OworICAgICAgICBmb3IgKHN0cmVhbV9pbmRleCA9IDA7IHN0cmVhbV9pbmRleCA8IGljLT5uYl9zdHJlYW1zOyBzdHJlYW1faW5kZXgrKykgeworICAgICAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tzdHJlYW1faW5kZXhdOworICAgICAgICAgICAgYXZjdHggPSBzdC0+aW50ZXJuYWwtPmF2Y3R4OworICAgICAgICAgICAgaWYgKCFoYXNfY29kZWNfcGFyYW1ldGVycyhzdCwgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBBVkNvZGVjICpjb2RlYyA9IGZpbmRfcHJvYmVfZGVjb2RlcihpYywgc3QsIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOworICAgICAgICAgICAgICAgIGlmIChjb2RlYyAmJiAhYXZjdHgtPmNvZGVjKSB7CisgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIGlmIChpYy0+Y29kZWNfd2hpdGVsaXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgYXZfZGljdF9zZXQoJm9wdHMsICJjb2RlY193aGl0ZWxpc3QiLCBpYy0+Y29kZWNfd2hpdGVsaXN0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2Y29kZWNfb3BlbjIoYXZjdHgsIGNvZGVjLCAob3B0aW9ucyAmJiBzdHJlYW1faW5kZXggPCBvcmlnX25iX3N0cmVhbXMpID8gJm9wdGlvbnNbc3RyZWFtX2luZGV4XSA6ICZvcHRzKSA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coaWMsIEFWX0xPR19XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gb3BlbiBjb2RlYyBpbiAlc1xuIixfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRU9GIGFscmVhZHkgcmVhY2hlZCB3aGlsZSByZWFkaW5nIHRoZSBzdHJlYW0gYWJvdmUuCisgICAgICAgICAgICAvLyBTbyBjb250aW51ZSB3aXRoIHJlb29yZGVyaW5nIERUUyB3aXRoIHdoYXRldmVyIGRlbGF5IHdlIGhhdmUuCisgICAgICAgICAgICBpZiAoaWMtPmludGVybmFsLT5wYWNrZXRfYnVmZmVyICYmICFoYXNfZGVjb2RlX2RlbGF5X2JlZW5fZ3Vlc3NlZChzdCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVfZHRzX2Zyb21fcHRzKGljLCBzdHJlYW1faW5kZXgsIGljLT5pbnRlcm5hbC0+cGFja2V0X2J1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBpZiAoZmx1c2hfY29kZWNzKSB7CiAgICAgICAgIEFWUGFja2V0IGVtcHR5X3BrdCA9IHsgMCB9OwogICAgICAgICBpbnQgZXJyID0gMDsKQEAgLTM0NjQsMjEgKzM5NTYsMTYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGNsb3NlIGNvZGVjcyB3aGljaCB3ZXJlIG9wZW5lZCBpbiB0cnlfZGVjb2RlX2ZyYW1lKCkKLSAgICBmb3IgKGkgPSAwOyBpIDwgaWMtPm5iX3N0cmVhbXM7IGkrKykgewotICAgICAgICBzdCA9IGljLT5zdHJlYW1zW2ldOwotICAgICAgICBhdmNvZGVjX2Nsb3NlKHN0LT5jb2RlYyk7Ci0gICAgfQotCiAgICAgZmZfcmZwc19jYWxjdWxhdGUoaWMpOwogCiAgICAgZm9yIChpID0gMDsgaSA8IGljLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tpXTsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1JBV1ZJREVPICYmICFzdC0+Y29kZWMtPmNvZGVjX3RhZyAmJiAhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWc9IGF2Y29kZWNfcGl4X2ZtdF90b19jb2RlY190YWcoc3QtPmNvZGVjLT5waXhfZm10KTsKLSAgICAgICAgICAgICAgICBpZiAoYXZwcml2X2ZpbmRfcGl4X2ZtdChhdnByaXZfZ2V0X3Jhd19waXhfZm10X3RhZ3MoKSwgdGFnKSA9PSBzdC0+Y29kZWMtPnBpeF9mbXQpCi0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnPSB0YWc7CisgICAgICAgIGF2Y3R4ID0gc3QtPmludGVybmFsLT5hdmN0eDsKKyAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICAgICAgaWYgKGF2Y3R4LT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9SQVdWSURFTyAmJiAhYXZjdHgtPmNvZGVjX3RhZyAmJiAhYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZz0gYXZjb2RlY19waXhfZm10X3RvX2NvZGVjX3RhZyhhdmN0eC0+cGl4X2ZtdCk7CisgICAgICAgICAgICAgICAgaWYgKGF2cHJpdl9maW5kX3BpeF9mbXQoYXZwcml2X2dldF9yYXdfcGl4X2ZtdF90YWdzKCksIHRhZykgPT0gYXZjdHgtPnBpeF9mbXQpCisgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT5jb2RlY190YWc9IHRhZzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogZXN0aW1hdGUgYXZlcmFnZSBmcmFtZXJhdGUgaWYgbm90IHNldCBieSBkZW11eGVyICovCkBAIC0zNDg3LDYgKzM5NzQsNyBAQAogICAgICAgICAgICAgICAgIHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgaW50IGJlc3RfZnBzICAgICAgPSAwOwogICAgICAgICAgICAgICAgIGRvdWJsZSBiZXN0X2Vycm9yID0gMC4wMTsKKyAgICAgICAgICAgICAgICBBVlJhdGlvbmFsIGNvZGVjX2ZyYW1lX3JhdGUgPSBhdmN0eC0+ZnJhbWVyYXRlOwogCiAgICAgICAgICAgICAgICAgaWYgKHN0LT5pbmZvLT5jb2RlY19pbmZvX2R1cmF0aW9uICAgICAgICA+PSBJTlQ2NF9NQVggLyBzdC0+dGltZV9iYXNlLm51bSAvIDJ8fAogICAgICAgICAgICAgICAgICAgICBzdC0+aW5mby0+Y29kZWNfaW5mb19kdXJhdGlvbl9maWVsZHMgPj0gSU5UNjRfTUFYIC8gc3QtPnRpbWVfYmFzZS5kZW4gfHwKQEAgLTM1MDcsNiArMzk5NSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9lcnJvciA9IGVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9mcHMgICA9IHN0ZF9mcHMubnVtOwogICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGljLT5pbnRlcm5hbC0+cHJlZmVyX2NvZGVjX2ZyYW1lcmF0ZSAmJiBjb2RlY19mcmFtZV9yYXRlLm51bSA+IDAgJiYgY29kZWNfZnJhbWVfcmF0ZS5kZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciAgICAgICA9IGZhYnMoYXZfcTJkKGNvZGVjX2ZyYW1lX3JhdGUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9xMmQoc3RkX2ZwcykgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciA8IGJlc3RfZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X2Vycm9yID0gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF9mcHMgICA9IHN0ZF9mcHMubnVtOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChiZXN0X2ZwcykKICAgICAgICAgICAgICAgICAgICAgYXZfcmVkdWNlKCZzdC0+YXZnX2ZyYW1lX3JhdGUubnVtLCAmc3QtPmF2Z19mcmFtZV9yYXRlLmRlbiwKQEAgLTM1MTQsMjYgKzQwMTEsMjYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKCFzdC0+cl9mcmFtZV9yYXRlLm51bSkgewotICAgICAgICAgICAgICAgIGlmICggICAgc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuICogKGludDY0X3QpIHN0LT50aW1lX2Jhc2UubnVtCi0gICAgICAgICAgICAgICAgICAgIDw9IHN0LT5jb2RlYy0+dGltZV9iYXNlLm51bSAqIHN0LT5jb2RlYy0+dGlja3NfcGVyX2ZyYW1lICogKGludDY0X3QpIHN0LT50aW1lX2Jhc2UuZGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5yX2ZyYW1lX3JhdGUubnVtID0gc3QtPmNvZGVjLT50aW1lX2Jhc2UuZGVuOwotICAgICAgICAgICAgICAgICAgICBzdC0+cl9mcmFtZV9yYXRlLmRlbiA9IHN0LT5jb2RlYy0+dGltZV9iYXNlLm51bSAqIHN0LT5jb2RlYy0+dGlja3NfcGVyX2ZyYW1lOworICAgICAgICAgICAgICAgIGlmICggICAgYXZjdHgtPnRpbWVfYmFzZS5kZW4gKiAoaW50NjRfdCkgc3QtPnRpbWVfYmFzZS5udW0KKyAgICAgICAgICAgICAgICAgICAgPD0gYXZjdHgtPnRpbWVfYmFzZS5udW0gKiBhdmN0eC0+dGlja3NfcGVyX2ZyYW1lICogKGludDY0X3QpIHN0LT50aW1lX2Jhc2UuZGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGF2X3JlZHVjZSgmc3QtPnJfZnJhbWVfcmF0ZS5udW0sICZzdC0+cl9mcmFtZV9yYXRlLmRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Y3R4LT50aW1lX2Jhc2UuZGVuLCAoaW50NjRfdClhdmN0eC0+dGltZV9iYXNlLm51bSAqIGF2Y3R4LT50aWNrc19wZXJfZnJhbWUsIElOVF9NQVgpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHN0LT5yX2ZyYW1lX3JhdGUubnVtID0gc3QtPnRpbWVfYmFzZS5kZW47CiAgICAgICAgICAgICAgICAgICAgIHN0LT5yX2ZyYW1lX3JhdGUuZGVuID0gc3QtPnRpbWVfYmFzZS5udW07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHN0LT5kaXNwbGF5X2FzcGVjdF9yYXRpby5udW0gJiYgc3QtPmRpc3BsYXlfYXNwZWN0X3JhdGlvLmRlbikgewotICAgICAgICAgICAgICAgIEFWUmF0aW9uYWwgaHdfcmF0aW8gPSB7IHN0LT5jb2RlYy0+aGVpZ2h0LCBzdC0+Y29kZWMtPndpZHRoIH07CisgICAgICAgICAgICAgICAgQVZSYXRpb25hbCBod19yYXRpbyA9IHsgYXZjdHgtPmhlaWdodCwgYXZjdHgtPndpZHRoIH07CiAgICAgICAgICAgICAgICAgc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBhdl9tdWxfcShzdC0+ZGlzcGxheV9hc3BlY3RfcmF0aW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod19yYXRpbyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewotICAgICAgICAgICAgaWYgKCFzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkKLSAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9Ci0gICAgICAgICAgICAgICAgICAgIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgIH0gZWxzZSBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoIWF2Y3R4LT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpCisgICAgICAgICAgICAgICAgYXZjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9CisgICAgICAgICAgICAgICAgICAgIGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoYXZjdHgtPmNvZGVjX2lkKTsKICAgICAgICAgICAgIC8vIHNldCBzdHJlYW0gZGlzcG9zaXRpb24gYmFzZWQgb24gYXVkaW8gc2VydmljZSB0eXBlCi0gICAgICAgICAgICBzd2l0Y2ggKHN0LT5jb2RlYy0+YXVkaW9fc2VydmljZV90eXBlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGF2Y3R4LT5hdWRpb19zZXJ2aWNlX3R5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQVZfQVVESU9fU0VSVklDRV9UWVBFX0VGRkVDVFM6CiAgICAgICAgICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uID0gQVZfRElTUE9TSVRJT05fQ0xFQU5fRUZGRUNUUzsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTM1NjQsOSArNDA2MSwxOSBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKmVycm1zZzsKICAgICAgICAgc3QgPSBpYy0+c3RyZWFtc1tpXTsKKworICAgICAgICAvKiBpZiBubyBwYWNrZXQgd2FzIGV2ZXIgc2VlbiwgdXBkYXRlIGNvbnRleHQgbm93IGZvciBoYXNfY29kZWNfcGFyYW1ldGVycyAqLworICAgICAgICBpZiAoIXN0LT5pbnRlcm5hbC0+YXZjdHhfaW5pdGVkKSB7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfTk9ORSkKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCA9IHN0LT5pbnRlcm5hbC0+YXZjdHgtPnNhbXBsZV9mbXQ7CisgICAgICAgICAgICByZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChzdC0+aW50ZXJuYWwtPmF2Y3R4LCBzdC0+Y29kZWNwYXIpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgZ290byBmaW5kX3N0cmVhbV9pbmZvX2VycjsKKyAgICAgICAgfQogICAgICAgICBpZiAoIWhhc19jb2RlY19wYXJhbWV0ZXJzKHN0LCAmZXJybXNnKSkgewogICAgICAgICAgICAgY2hhciBidWZbMjU2XTsKLSAgICAgICAgICAgIGF2Y29kZWNfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHN0LT5jb2RlYywgMCk7CisgICAgICAgICAgICBhdmNvZGVjX3N0cmluZyhidWYsIHNpemVvZihidWYpLCBzdC0+aW50ZXJuYWwtPmF2Y3R4LCAwKTsKICAgICAgICAgICAgIGF2X2xvZyhpYywgQVZfTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBmaW5kIGNvZGVjIHBhcmFtZXRlcnMgZm9yIHN0cmVhbSAlZCAoJXMpOiAlc1xuIgogICAgICAgICAgICAgICAgICAgICJDb25zaWRlciBpbmNyZWFzaW5nIHRoZSB2YWx1ZSBmb3IgdGhlICdhbmFseXplZHVyYXRpb24nIGFuZCAncHJvYmVzaXplJyBvcHRpb25zXG4iLApAQCAtMzU3OCwxNCArNDA4NSw3NSBAQAogCiAgICAgY29tcHV0ZV9jaGFwdGVyc19lbmQoaWMpOwogCisgICAgLyogdXBkYXRlIHRoZSBzdHJlYW0gcGFyYW1ldGVycyBmcm9tIHRoZSBpbnRlcm5hbCBjb2RlYyBjb250ZXh0cyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07CisKKyAgICAgICAgaWYgKHN0LT5pbnRlcm5hbC0+YXZjdHhfaW5pdGVkKSB7CisgICAgICAgICAgICBpbnQgb3JpZ193ID0gc3QtPmNvZGVjcGFyLT53aWR0aDsKKyAgICAgICAgICAgIGludCBvcmlnX2ggPSBzdC0+Y29kZWNwYXItPmhlaWdodDsKKyAgICAgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQoc3QtPmNvZGVjcGFyLCBzdC0+aW50ZXJuYWwtPmF2Y3R4KTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZmluZF9zdHJlYW1faW5mb19lcnI7CisjaWYgRkZfQVBJX0xPV1JFUworICAgICAgICAgICAgLy8gVGhlIGRlY29kZXIgbWlnaHQgcmVkdWNlIHRoZSB2aWRlbyBzaXplIGJ5IHRoZSBsb3dyZXMgZmFjdG9yLgorICAgICAgICAgICAgaWYgKHN0LT5pbnRlcm5hbC0+YXZjdHgtPmxvd3JlcyAmJiBvcmlnX3cpIHsKKyAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPndpZHRoID0gb3JpZ193OworICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gb3JpZ19oOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc190b19jb250ZXh0KHN0LT5jb2RlYywgc3QtPmNvZGVjcGFyKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZpbmRfc3RyZWFtX2luZm9fZXJyOworCisjaWYgRkZfQVBJX0xPV1JFUworICAgICAgICAvLyBUaGUgb2xkIEFQSSAoQVZTdHJlYW0uY29kZWMpICJyZXF1aXJlcyIgdGhlIHJlc29sdXRpb24gdG8gYmUgYWRqdXN0ZWQKKyAgICAgICAgLy8gYnkgdGhlIGxvd3JlcyBmYWN0b3IuCisgICAgICAgIGlmIChzdC0+aW50ZXJuYWwtPmF2Y3R4LT5sb3dyZXMgJiYgc3QtPmludGVybmFsLT5hdmN0eC0+d2lkdGgpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+bG93cmVzID0gc3QtPmludGVybmFsLT5hdmN0eC0+bG93cmVzOworICAgICAgICAgICAgc3QtPmNvZGVjLT53aWR0aCA9IHN0LT5pbnRlcm5hbC0+YXZjdHgtPndpZHRoOworICAgICAgICAgICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5oZWlnaHQ7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3RhZyAhPSBNS1RBRygndCcsJ20nLCdjJywnZCcpKSB7CisgICAgICAgICAgICBzdC0+Y29kZWMtPnRpbWVfYmFzZSA9IHN0LT5pbnRlcm5hbC0+YXZjdHgtPnRpbWVfYmFzZTsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+dGlja3NfcGVyX2ZyYW1lID0gc3QtPmludGVybmFsLT5hdmN0eC0+dGlja3NfcGVyX2ZyYW1lOworICAgICAgICB9CisgICAgICAgIHN0LT5jb2RlYy0+ZnJhbWVyYXRlID0gc3QtPmF2Z19mcmFtZV9yYXRlOworCisgICAgICAgIGlmIChzdC0+aW50ZXJuYWwtPmF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXIpIHsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c3VidGl0bGVfaGVhZGVyID0gYXZfbWFsbG9jKHN0LT5pbnRlcm5hbC0+YXZjdHgtPnN1YnRpdGxlX2hlYWRlcl9zaXplKTsKKyAgICAgICAgICAgIGlmICghc3QtPmNvZGVjLT5zdWJ0aXRsZV9oZWFkZXIpCisgICAgICAgICAgICAgICAgZ290byBmaW5kX3N0cmVhbV9pbmZvX2VycjsKKyAgICAgICAgICAgIHN0LT5jb2RlYy0+c3VidGl0bGVfaGVhZGVyX3NpemUgPSBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5zdWJ0aXRsZV9oZWFkZXJfc2l6ZTsKKyAgICAgICAgICAgIG1lbWNweShzdC0+Y29kZWMtPnN1YnRpdGxlX2hlYWRlciwgc3QtPmludGVybmFsLT5hdmN0eC0+c3VidGl0bGVfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+c3VidGl0bGVfaGVhZGVyX3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmllbGRzIHVuYXZhaWxhYmxlIGluIEFWQ29kZWNQYXJhbWV0ZXJzCisgICAgICAgIHN0LT5jb2RlYy0+Y29kZWRfd2lkdGggPSBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5jb2RlZF93aWR0aDsKKyAgICAgICAgc3QtPmNvZGVjLT5jb2RlZF9oZWlnaHQgPSBzdC0+aW50ZXJuYWwtPmF2Y3R4LT5jb2RlZF9oZWlnaHQ7CisgICAgICAgIHN0LT5jb2RlYy0+cHJvcGVydGllcyA9IHN0LT5pbnRlcm5hbC0+YXZjdHgtPnByb3BlcnRpZXM7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgorCisgICAgICAgIHN0LT5pbnRlcm5hbC0+YXZjdHhfaW5pdGVkID0gMDsKKyAgICB9CisKIGZpbmRfc3RyZWFtX2luZm9fZXJyOgogICAgIGZvciAoaSA9IDA7IGkgPCBpYy0+bmJfc3RyZWFtczsgaSsrKSB7CiAgICAgICAgIHN0ID0gaWMtPnN0cmVhbXNbaV07Ci0gICAgICAgIGlmIChpYy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKQotICAgICAgICAgICAgaWMtPnN0cmVhbXNbaV0tPmNvZGVjLT50aHJlYWRfY291bnQgPSAwOwogICAgICAgICBpZiAoc3QtPmluZm8pCiAgICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmluZm8tPmR1cmF0aW9uX2Vycm9yKTsKKyAgICAgICAgYXZjb2RlY19jbG9zZShpYy0+c3RyZWFtc1tpXS0+aW50ZXJuYWwtPmF2Y3R4KTsKICAgICAgICAgYXZfZnJlZXAoJmljLT5zdHJlYW1zW2ldLT5pbmZvKTsKKyAgICAgICAgYXZfYnNmX2ZyZWUoJmljLT5zdHJlYW1zW2ldLT5pbnRlcm5hbC0+ZXh0cmFjdF9leHRyYWRhdGEuYnNmKTsKKyAgICAgICAgYXZfcGFja2V0X2ZyZWUoJmljLT5zdHJlYW1zW2ldLT5pbnRlcm5hbC0+ZXh0cmFjdF9leHRyYWRhdGEucGt0KTsKICAgICB9CiAgICAgaWYgKGljLT5wYikKICAgICAgICAgYXZfbG9nKGljLCBBVl9MT0dfREVCVUcsICJBZnRlciBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKCkgcG9zOiAlIlBSSWQ2NCIgYnl0ZXMgcmVhZDolIlBSSWQ2NCIgc2Vla3M6JWQgZnJhbWVzOiVkXG4iLApAQCAtMzYxNSw3ICs0MTgzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBVkNvZGVjICoqZGVjb2Rlcl9yZXQsIGludCBmbGFncykKIHsKICAgICBpbnQgaSwgbmJfc3RyZWFtcyA9IGljLT5uYl9zdHJlYW1zOwotICAgIGludCByZXQgPSBBVkVSUk9SX1NUUkVBTV9OT1RfRk9VTkQsIGJlc3RfY291bnQgPSAtMSwgYmVzdF9iaXRyYXRlID0gLTEsIGJlc3RfbXVsdGlmcmFtZSA9IC0xLCBjb3VudCwgYml0cmF0ZSwgbXVsdGlmcmFtZTsKKyAgICBpbnQgcmV0ID0gQVZFUlJPUl9TVFJFQU1fTk9UX0ZPVU5EOworICAgIGludCBiZXN0X2NvdW50ID0gLTEsIGJlc3RfbXVsdGlmcmFtZSA9IC0xLCBiZXN0X2Rpc3Bvc2l0aW9uID0gLTE7CisgICAgaW50IGNvdW50LCBtdWx0aWZyYW1lLCBkaXNwb3NpdGlvbjsKKyAgICBpbnQ2NF90IGJlc3RfYml0cmF0ZSA9IC0xOworICAgIGludDY0X3QgYml0cmF0ZTsKICAgICB1bnNpZ25lZCAqcHJvZ3JhbSA9IE5VTEw7CiAgICAgY29uc3QgQVZDb2RlYyAqZGVjb2RlciA9IE5VTEwsICpiZXN0X2RlY29kZXIgPSBOVUxMOwogCkBAIC0zNjI5LDM0ICs0MjAxLDMxIEBACiAgICAgZm9yIChpID0gMDsgaSA8IG5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBpbnQgcmVhbF9zdHJlYW1faW5kZXggPSBwcm9ncmFtID8gcHJvZ3JhbVtpXSA6IGk7CiAgICAgICAgIEFWU3RyZWFtICpzdCAgICAgICAgICA9IGljLT5zdHJlYW1zW3JlYWxfc3RyZWFtX2luZGV4XTsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gc3QtPmNvZGVjOwotICAgICAgICBpZiAoYXZjdHgtPmNvZGVjX3R5cGUgIT0gdHlwZSkKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfdHlwZSAhPSB0eXBlKQogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmICh3YW50ZWRfc3RyZWFtX25iID49IDAgJiYgcmVhbF9zdHJlYW1faW5kZXggIT0gd2FudGVkX3N0cmVhbV9uYikKICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAod2FudGVkX3N0cmVhbV9uYiAhPSByZWFsX3N0cmVhbV9pbmRleCAmJgotICAgICAgICAgICAgc3QtPmRpc3Bvc2l0aW9uICYgKEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0RJU1BPU0lUSU9OX1ZJU1VBTF9JTVBBSVJFRCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHR5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmICEoYXZjdHgtPmNoYW5uZWxzICYmIGF2Y3R4LT5zYW1wbGVfcmF0ZSkpCisgICAgICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJiAhKHBhci0+Y2hhbm5lbHMgJiYgcGFyLT5zYW1wbGVfcmF0ZSkpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgaWYgKGRlY29kZXJfcmV0KSB7Ci0gICAgICAgICAgICBkZWNvZGVyID0gZmluZF9kZWNvZGVyKGljLCBzdCwgc3QtPmNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgICAgICBkZWNvZGVyID0gZmluZF9kZWNvZGVyKGljLCBzdCwgcGFyLT5jb2RlY19pZCk7CiAgICAgICAgICAgICBpZiAoIWRlY29kZXIpIHsKICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9ERUNPREVSX05PVF9GT1VORDsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBkaXNwb3NpdGlvbiA9ICEoc3QtPmRpc3Bvc2l0aW9uICYgKEFWX0RJU1BPU0lUSU9OX0hFQVJJTkdfSU1QQUlSRUQgfCBBVl9ESVNQT1NJVElPTl9WSVNVQUxfSU1QQUlSRUQpKTsKICAgICAgICAgY291bnQgPSBzdC0+Y29kZWNfaW5mb19uYl9mcmFtZXM7Ci0gICAgICAgIGJpdHJhdGUgPSBhdmN0eC0+Yml0X3JhdGU7Ci0gICAgICAgIGlmICghYml0cmF0ZSkKLSAgICAgICAgICAgIGJpdHJhdGUgPSBhdmN0eC0+cmNfbWF4X3JhdGU7CisgICAgICAgIGJpdHJhdGUgPSBwYXItPmJpdF9yYXRlOwogICAgICAgICBtdWx0aWZyYW1lID0gRkZNSU4oNSwgY291bnQpOwotICAgICAgICBpZiAoKGJlc3RfbXVsdGlmcmFtZSA+ICBtdWx0aWZyYW1lKSB8fAotICAgICAgICAgICAgKGJlc3RfbXVsdGlmcmFtZSA9PSBtdWx0aWZyYW1lICYmIGJlc3RfYml0cmF0ZSA+ICBiaXRyYXRlKSB8fAotICAgICAgICAgICAgKGJlc3RfbXVsdGlmcmFtZSA9PSBtdWx0aWZyYW1lICYmIGJlc3RfYml0cmF0ZSA9PSBiaXRyYXRlICYmIGJlc3RfY291bnQgPj0gY291bnQpKQorICAgICAgICBpZiAoKGJlc3RfZGlzcG9zaXRpb24gPiAgZGlzcG9zaXRpb24pIHx8CisgICAgICAgICAgICAoYmVzdF9kaXNwb3NpdGlvbiA9PSBkaXNwb3NpdGlvbiAmJiBiZXN0X211bHRpZnJhbWUgPiAgbXVsdGlmcmFtZSkgfHwKKyAgICAgICAgICAgIChiZXN0X2Rpc3Bvc2l0aW9uID09IGRpc3Bvc2l0aW9uICYmIGJlc3RfbXVsdGlmcmFtZSA9PSBtdWx0aWZyYW1lICYmIGJlc3RfYml0cmF0ZSA+ICBiaXRyYXRlKSB8fAorICAgICAgICAgICAgKGJlc3RfZGlzcG9zaXRpb24gPT0gZGlzcG9zaXRpb24gJiYgYmVzdF9tdWx0aWZyYW1lID09IG11bHRpZnJhbWUgJiYgYmVzdF9iaXRyYXRlID09IGJpdHJhdGUgJiYgYmVzdF9jb3VudCA+PSBjb3VudCkpCiAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgYmVzdF9kaXNwb3NpdGlvbiA9IGRpc3Bvc2l0aW9uOwogICAgICAgICBiZXN0X2NvdW50ICAgPSBjb3VudDsKICAgICAgICAgYmVzdF9iaXRyYXRlID0gYml0cmF0ZTsKICAgICAgICAgYmVzdF9tdWx0aWZyYW1lID0gbXVsdGlmcmFtZTsKQEAgLTM2OTQsNiArNDI2Myw2NyBAQAogICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiB9CiAKK2ludCBmZl9zdHJlYW1fZW5jb2RlX3BhcmFtc19jb3B5KEFWU3RyZWFtICpkc3QsIGNvbnN0IEFWU3RyZWFtICpzcmMpCit7CisgICAgaW50IHJldCwgaTsKKworICAgIGRzdC0+aWQgICAgICAgICAgICAgICAgICA9IHNyYy0+aWQ7CisgICAgZHN0LT50aW1lX2Jhc2UgICAgICAgICAgID0gc3JjLT50aW1lX2Jhc2U7CisgICAgZHN0LT5uYl9mcmFtZXMgICAgICAgICAgID0gc3JjLT5uYl9mcmFtZXM7CisgICAgZHN0LT5kaXNwb3NpdGlvbiAgICAgICAgID0gc3JjLT5kaXNwb3NpdGlvbjsKKyAgICBkc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSBzcmMtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgZHN0LT5hdmdfZnJhbWVfcmF0ZSAgICAgID0gc3JjLT5hdmdfZnJhbWVfcmF0ZTsKKyAgICBkc3QtPnJfZnJhbWVfcmF0ZSAgICAgICAgPSBzcmMtPnJfZnJhbWVfcmF0ZTsKKworICAgIGF2X2RpY3RfZnJlZSgmZHN0LT5tZXRhZGF0YSk7CisgICAgcmV0ID0gYXZfZGljdF9jb3B5KCZkc3QtPm1ldGFkYXRhLCBzcmMtPm1ldGFkYXRhLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGF2Y29kZWNfcGFyYW1ldGVyc19jb3B5KGRzdC0+Y29kZWNwYXIsIHNyYy0+Y29kZWNwYXIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgLyogRnJlZSBleGlzdGluZyBzaWRlIGRhdGEqLworICAgIGZvciAoaSA9IDA7IGkgPCBkc3QtPm5iX3NpZGVfZGF0YTsgaSsrKQorICAgICAgICBhdl9mcmVlKGRzdC0+c2lkZV9kYXRhW2ldLmRhdGEpOworICAgIGF2X2ZyZWVwKCZkc3QtPnNpZGVfZGF0YSk7CisgICAgZHN0LT5uYl9zaWRlX2RhdGEgPSAwOworCisgICAgLyogQ29weSBzaWRlIGRhdGEgaWYgcHJlc2VudCAqLworICAgIGlmIChzcmMtPm5iX3NpZGVfZGF0YSkgeworICAgICAgICBkc3QtPnNpZGVfZGF0YSA9IGF2X21hbGxvY3pfYXJyYXkoc3JjLT5uYl9zaWRlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQVZQYWNrZXRTaWRlRGF0YSkpOworICAgICAgICBpZiAoIWRzdC0+c2lkZV9kYXRhKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZHN0LT5uYl9zaWRlX2RhdGEgPSBzcmMtPm5iX3NpZGVfZGF0YTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjLT5uYl9zaWRlX2RhdGE7IGkrKykgeworICAgICAgICAgICAgdWludDhfdCAqZGF0YSA9IGF2X21lbWR1cChzcmMtPnNpZGVfZGF0YVtpXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPnNpZGVfZGF0YVtpXS5zaXplKTsKKyAgICAgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZHN0LT5zaWRlX2RhdGFbaV0udHlwZSA9IHNyYy0+c2lkZV9kYXRhW2ldLnR5cGU7CisgICAgICAgICAgICBkc3QtPnNpZGVfZGF0YVtpXS5zaXplID0gc3JjLT5zaWRlX2RhdGFbaV0uc2l6ZTsKKyAgICAgICAgICAgIGRzdC0+c2lkZV9kYXRhW2ldLmRhdGEgPSBkYXRhOworICAgICAgICB9CisgICAgfQorCisjaWYgRkZfQVBJX0xBVkZfRkZTRVJWRVIKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBhdl9mcmVlcCgmZHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24pOworICAgIGlmIChzcmMtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbikgeworICAgICAgICBjb25zdCBjaGFyICpjb25mX3N0ciA9IHNyYy0+cmVjb21tZW5kZWRfZW5jb2Rlcl9jb25maWd1cmF0aW9uOworICAgICAgICBkc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbiA9IGF2X3N0cmR1cChjb25mX3N0cik7CisgICAgICAgIGlmICghZHN0LT5yZWNvbW1lbmRlZF9lbmNvZGVyX2NvbmZpZ3VyYXRpb24pCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisKKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgZnJlZV9zdHJlYW0oQVZTdHJlYW0gKipwc3QpCiB7CiAgICAgQVZTdHJlYW0gKnN0ID0gKnBzdDsKQEAgLTM3MTIsMjAgKzQzNDIsMzYgQEAKICAgICBpZiAoc3QtPmF0dGFjaGVkX3BpYy5kYXRhKQogICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnN0LT5hdHRhY2hlZF9waWMpOwogCisgICAgaWYgKHN0LT5pbnRlcm5hbCkgeworICAgICAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmc3QtPmludGVybmFsLT5hdmN0eCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+aW50ZXJuYWwtPm5iX2JzZmNzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2JzZl9mcmVlKCZzdC0+aW50ZXJuYWwtPmJzZmNzW2ldKTsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzdC0+aW50ZXJuYWwtPmJzZmNzKTsKKyAgICAgICAgfQorICAgICAgICBhdl9mcmVlcCgmc3QtPmludGVybmFsLT5wcml2X3B0cyk7CisgICAgICAgIGF2X2JzZl9mcmVlKCZzdC0+aW50ZXJuYWwtPmV4dHJhY3RfZXh0cmFkYXRhLmJzZik7CisgICAgICAgIGF2X3BhY2tldF9mcmVlKCZzdC0+aW50ZXJuYWwtPmV4dHJhY3RfZXh0cmFkYXRhLnBrdCk7CisgICAgfQogICAgIGF2X2ZyZWVwKCZzdC0+aW50ZXJuYWwpOwogCiAgICAgYXZfZGljdF9mcmVlKCZzdC0+bWV0YWRhdGEpOworICAgIGF2Y29kZWNfcGFyYW1ldGVyc19mcmVlKCZzdC0+Y29kZWNwYXIpOwogICAgIGF2X2ZyZWVwKCZzdC0+cHJvYmVfZGF0YS5idWYpOwogICAgIGF2X2ZyZWVwKCZzdC0+aW5kZXhfZW50cmllcyk7Ci0gICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5zdWJ0aXRsZV9oZWFkZXIpOwotICAgIGF2X2ZyZWVwKCZzdC0+Y29kZWMpOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJnN0LT5jb2RlYyk7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogICAgIGF2X2ZyZWVwKCZzdC0+cHJpdl9kYXRhKTsKICAgICBpZiAoc3QtPmluZm8pCiAgICAgICAgIGF2X2ZyZWVwKCZzdC0+aW5mby0+ZHVyYXRpb25fZXJyb3IpOwogICAgIGF2X2ZyZWVwKCZzdC0+aW5mbyk7CisjaWYgRkZfQVBJX0xBVkZfRkZTRVJWRVIKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICAgICBhdl9mcmVlcCgmc3QtPnJlY29tbWVuZGVkX2VuY29kZXJfY29uZmlndXJhdGlvbik7Ci0gICAgYXZfZnJlZXAoJnN0LT5wcml2X3B0cyk7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogCiAgICAgYXZfZnJlZXAocHN0KTsKIH0KQEAgLTM3NjgsOSArNDQxNCwxMSBAQAogICAgIH0KICAgICBhdl9mcmVlcCgmcy0+Y2hhcHRlcnMpOwogICAgIGF2X2RpY3RfZnJlZSgmcy0+bWV0YWRhdGEpOworICAgIGF2X2RpY3RfZnJlZSgmcy0+aW50ZXJuYWwtPmlkM3YyX21ldGEpOwogICAgIGF2X2ZyZWVwKCZzLT5zdHJlYW1zKTsKLSAgICBhdl9mcmVlcCgmcy0+aW50ZXJuYWwpOwogICAgIGZsdXNoX3BhY2tldF9xdWV1ZShzKTsKKyAgICBhdl9mcmVlcCgmcy0+aW50ZXJuYWwpOworICAgIGF2X2ZyZWVwKCZzLT51cmwpOwogICAgIGF2X2ZyZWUocyk7CiB9CiAKQEAgLTM4MDgsOCArNDQ1NiwxMSBAQAogICAgIGludCBpOwogICAgIEFWU3RyZWFtICoqc3RyZWFtczsKIAotICAgIGlmIChzLT5uYl9zdHJlYW1zID49IElOVF9NQVgvc2l6ZW9mKCpzdHJlYW1zKSkKKyAgICBpZiAocy0+bmJfc3RyZWFtcyA+PSBGRk1JTihzLT5tYXhfc3RyZWFtcywgSU5UX01BWC9zaXplb2YoKnN0cmVhbXMpKSkgeworICAgICAgICBpZiAocy0+bWF4X3N0cmVhbXMgPCBJTlRfTUFYL3NpemVvZigqc3RyZWFtcykpCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiTnVtYmVyIG9mIHN0cmVhbXMgZXhjZWVkcyBtYXhfc3RyZWFtcyBwYXJhbWV0ZXIgKCVkKSwgc2VlIHRoZSBkb2N1bWVudGF0aW9uIGlmIHlvdSB3aXNoIHRvIGluY3JlYXNlIGl0XG4iLCBzLT5tYXhfc3RyZWFtcyk7CiAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KICAgICBzdHJlYW1zID0gYXZfcmVhbGxvY19hcnJheShzLT5zdHJlYW1zLCBzLT5uYl9zdHJlYW1zICsgMSwgc2l6ZW9mKCpzdHJlYW1zKSk7CiAgICAgaWYgKCFzdHJlYW1zKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTM4MjQsMjAgKzQ0NzUsMzYgQEAKICAgICB9CiAgICAgc3QtPmluZm8tPmxhc3RfZHRzID0gQVZfTk9QVFNfVkFMVUU7CiAKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIHN0LT5jb2RlYyA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoYyk7CiAgICAgaWYgKCFzdC0+Y29kZWMpIHsKICAgICAgICAgYXZfZnJlZShzdC0+aW5mbyk7CiAgICAgICAgIGF2X2ZyZWUoc3QpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyNlbmRpZgogCiAgICAgc3QtPmludGVybmFsID0gYXZfbWFsbG9jeihzaXplb2YoKnN0LT5pbnRlcm5hbCkpOwogICAgIGlmICghc3QtPmludGVybmFsKQogICAgICAgICBnb3RvIGZhaWw7CiAKKyAgICBzdC0+Y29kZWNwYXIgPSBhdmNvZGVjX3BhcmFtZXRlcnNfYWxsb2MoKTsKKyAgICBpZiAoIXN0LT5jb2RlY3BhcikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgc3QtPmludGVybmFsLT5hdmN0eCA9IGF2Y29kZWNfYWxsb2NfY29udGV4dDMoTlVMTCk7CisgICAgaWYgKCFzdC0+aW50ZXJuYWwtPmF2Y3R4KQorICAgICAgICBnb3RvIGZhaWw7CisKICAgICBpZiAocy0+aWZvcm1hdCkgeworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgICAgIC8qIG5vIGRlZmF1bHQgYml0cmF0ZSBpZiBkZWNvZGluZyAqLwogICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlID0gMDsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCiAKICAgICAgICAgLyogZGVmYXVsdCBwdHMgc2V0dGluZyBpcyBNUEVHLWxpa2UgKi8KICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIDkwMDAwKTsKQEAgLTM4NzMsNiArNDU0MCw4IEBACiAKICAgICBzdC0+aW5qZWN0X2dsb2JhbF9zaWRlX2RhdGEgPSBzLT5pbnRlcm5hbC0+aW5qZWN0X2dsb2JhbF9zaWRlX2RhdGE7CiAKKyAgICBzdC0+aW50ZXJuYWwtPm5lZWRfY29udGV4dF91cGRhdGUgPSAxOworCiAgICAgcy0+c3RyZWFtc1tzLT5uYl9zdHJlYW1zKytdID0gc3Q7CiAgICAgcmV0dXJuIHN0OwogZmFpbDoKQEAgLTM5NzEsNyArNDY0MCw3IEBACiAgICAgcmV0dXJuIChhdl9nZXR0aW1lKCkgLyAxMDAwKSAqIDEwMDAgKyBOVFBfT0ZGU0VUX1VTOwogfQogCi1pbnQgYXZfZ2V0X2ZyYW1lX2ZpbGVuYW1lKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLCBjb25zdCBjaGFyICpwYXRoLCBpbnQgbnVtYmVyKQoraW50IGF2X2dldF9mcmFtZV9maWxlbmFtZTIoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsIGNvbnN0IGNoYXIgKnBhdGgsIGludCBudW1iZXIsIGludCBmbGFncykKIHsKICAgICBjb25zdCBjaGFyICpwOwogICAgIGNoYXIgKnEsIGJ1ZjFbMjBdLCBjOwpAQCAtMzk5Niw3ICs0NjY1LDcgQEAKICAgICAgICAgICAgIGNhc2UgJyUnOgogICAgICAgICAgICAgICAgIGdvdG8gYWRkY2hhcjsKICAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICAgIGlmIChwZXJjZW50ZF9mb3VuZCkKKyAgICAgICAgICAgICAgICBpZiAoIShmbGFncyAmIEFWX0ZSQU1FX0ZJTEVOQU1FX0ZMQUdTX01VTFRJUExFKSAmJiBwZXJjZW50ZF9mb3VuZCkKICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICAgICAgICAgIHBlcmNlbnRkX2ZvdW5kID0gMTsKICAgICAgICAgICAgICAgICBpZiAobnVtYmVyIDwgMCkKQEAgLTQwMjYsNiArNDY5NSwxMSBAQAogICAgIHJldHVybiAtMTsKIH0KIAoraW50IGF2X2dldF9mcmFtZV9maWxlbmFtZShjaGFyICpidWYsIGludCBidWZfc2l6ZSwgY29uc3QgY2hhciAqcGF0aCwgaW50IG51bWJlcikKK3sKKyAgICByZXR1cm4gYXZfZ2V0X2ZyYW1lX2ZpbGVuYW1lMihidWYsIGJ1Zl9zaXplLCBwYXRoLCBudW1iZXIsIDApOworfQorCiB2b2lkIGF2X3VybF9zcGxpdChjaGFyICpwcm90bywgaW50IHByb3RvX3NpemUsCiAgICAgICAgICAgICAgICAgICBjaGFyICphdXRob3JpemF0aW9uLCBpbnQgYXV0aG9yaXphdGlvbl9zaXplLAogICAgICAgICAgICAgICAgICAgY2hhciAqaG9zdG5hbWUsIGludCBob3N0bmFtZV9zaXplLApAQCAtNDE2Nyw3ICs0ODQxLDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgcy0+dGltZV9iYXNlICAgICA9IG5ld190YjsKLSAgICBhdl9jb2RlY19zZXRfcGt0X3RpbWViYXNlKHMtPmNvZGVjLCBuZXdfdGIpOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgcy0+Y29kZWMtPnBrdF90aW1lYmFzZSA9IG5ld190YjsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCisgICAgcy0+aW50ZXJuYWwtPmF2Y3R4LT5wa3RfdGltZWJhc2UgPSBuZXdfdGI7CiAgICAgcy0+cHRzX3dyYXBfYml0cyA9IHB0c193cmFwX2JpdHM7CiB9CiAKQEAgLTQyNDUsNyArNDkyNCw4IEBACiAgICAgICAgICAgICByZXR1cm4gISFhdl9jb2RlY19nZXRfdGFnMihvZm10LT5jb2RlY190YWcsIGNvZGVjX2lkLCAmY29kZWNfdGFnKTsKICAgICAgICAgZWxzZSBpZiAoY29kZWNfaWQgPT0gb2ZtdC0+dmlkZW9fY29kZWMgfHwKICAgICAgICAgICAgICAgICAgY29kZWNfaWQgPT0gb2ZtdC0+YXVkaW9fY29kZWMgfHwKLSAgICAgICAgICAgICAgICAgY29kZWNfaWQgPT0gb2ZtdC0+c3VidGl0bGVfY29kZWMpCisgICAgICAgICAgICAgICAgIGNvZGVjX2lkID09IG9mbXQtPnN1YnRpdGxlX2NvZGVjIHx8CisgICAgICAgICAgICAgICAgIGNvZGVjX2lkID09IG9mbXQtPmRhdGFfY29kZWMpCiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICB9CiAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwpAQCAtNDI1NSw3ICs0OTM1LDYgQEAKIHsKICNpZiBDT05GSUdfTkVUV09SSwogICAgIGludCByZXQ7Ci0gICAgZmZfbmV0d29ya19pbml0ZWRfZ2xvYmFsbHkgPSAxOwogICAgIGlmICgocmV0ID0gZmZfbmV0d29ya19pbml0KCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKICAgICBpZiAoKHJldCA9IGZmX3Rsc19pbml0KCkpIDwgMCkKQEAgLTQyNjksNyArNDk0OCw2IEBACiAjaWYgQ09ORklHX05FVFdPUksKICAgICBmZl9uZXR3b3JrX2Nsb3NlKCk7CiAgICAgZmZfdGxzX2RlaW5pdCgpOwotICAgIGZmX25ldHdvcmtfaW5pdGVkX2dsb2JhbGx5ID0gMDsKICNlbmRpZgogICAgIHJldHVybiAwOwogfQpAQCAtNDMyMCw3ICs0OTk4LDcgQEAKIHsKICAgICBBVlJhdGlvbmFsIHVuZGVmID0gezAsIDF9OwogICAgIEFWUmF0aW9uYWwgc3RyZWFtX3NhbXBsZV9hc3BlY3RfcmF0aW8gPSBzdHJlYW0gPyBzdHJlYW0tPnNhbXBsZV9hc3BlY3RfcmF0aW8gOiB1bmRlZjsKLSAgICBBVlJhdGlvbmFsIGNvZGVjX3NhbXBsZV9hc3BlY3RfcmF0aW8gID0gc3RyZWFtICYmIHN0cmVhbS0+Y29kZWMgPyBzdHJlYW0tPmNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvIDogdW5kZWY7CisgICAgQVZSYXRpb25hbCBjb2RlY19zYW1wbGVfYXNwZWN0X3JhdGlvICA9IHN0cmVhbSAmJiBzdHJlYW0tPmNvZGVjcGFyID8gc3RyZWFtLT5jb2RlY3Bhci0+c2FtcGxlX2FzcGVjdF9yYXRpbyA6IHVuZGVmOwogICAgIEFWUmF0aW9uYWwgZnJhbWVfc2FtcGxlX2FzcGVjdF9yYXRpbyAgPSBmcmFtZSAgPyBmcmFtZS0+c2FtcGxlX2FzcGVjdF9yYXRpbyAgOiBjb2RlY19zYW1wbGVfYXNwZWN0X3JhdGlvOwogCiAgICAgYXZfcmVkdWNlKCZzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5udW0sICZzdHJlYW1fc2FtcGxlX2FzcGVjdF9yYXRpby5kZW4sCkBAIC00MzQyLDcgKzUwMjAsNyBAQAogQVZSYXRpb25hbCBhdl9ndWVzc19mcmFtZV9yYXRlKEFWRm9ybWF0Q29udGV4dCAqZm9ybWF0LCBBVlN0cmVhbSAqc3QsIEFWRnJhbWUgKmZyYW1lKQogewogICAgIEFWUmF0aW9uYWwgZnIgPSBzdC0+cl9mcmFtZV9yYXRlOwotICAgIEFWUmF0aW9uYWwgY29kZWNfZnIgPSBzdC0+Y29kZWMtPmZyYW1lcmF0ZTsKKyAgICBBVlJhdGlvbmFsIGNvZGVjX2ZyID0gc3QtPmludGVybmFsLT5hdmN0eC0+ZnJhbWVyYXRlOwogICAgIEFWUmF0aW9uYWwgICBhdmdfZnIgPSBzdC0+YXZnX2ZyYW1lX3JhdGU7CiAKICAgICBpZiAoYXZnX2ZyLm51bSA+IDAgJiYgYXZnX2ZyLmRlbiA+IDAgJiYgZnIubnVtID4gMCAmJiBmci5kZW4gPiAwICYmCkBAIC00MzUxLDcgKzUwMjksNyBAQAogICAgIH0KIAogCi0gICAgaWYgKHN0LT5jb2RlYy0+dGlja3NfcGVyX2ZyYW1lID4gMSkgeworICAgIGlmIChzdC0+aW50ZXJuYWwtPmF2Y3R4LT50aWNrc19wZXJfZnJhbWUgPiAxKSB7CiAgICAgICAgIGlmICggICBjb2RlY19mci5udW0gPiAwICYmIGNvZGVjX2ZyLmRlbiA+IDAgJiYKICAgICAgICAgICAgIChmci5udW0gPT0gMCB8fCBhdl9xMmQoY29kZWNfZnIpIDwgYXZfcTJkKGZyKSowLjcgJiYgZmFicygxLjAgLSBhdl9xMmQoYXZfZGl2X3EoYXZnX2ZyLCBmcikpKSA+IDAuMSkpCiAgICAgICAgICAgICBmciA9IGNvZGVjX2ZyOwpAQCAtNDM3OSwxNyArNTA1NywzNyBAQAogICAgICAgICBjYXNlICdWJzogdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsgbm9waWMgPSAxOyBicmVhazsKICAgICAgICAgZGVmYXVsdDogIGF2X2Fzc2VydDAoMCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgIT0gc3QtPmNvZGVjLT5jb2RlY190eXBlKQorI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIGlmICh0eXBlICE9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZQorICAgICAgICAgICAmJiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9VTktOT1dOIHx8IHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAhPSB0eXBlKSkKICAgICAgICAgICAgIHJldHVybiAwOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZWxzZQorICAgICAgICBpZiAodHlwZSAhPSBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpCisgICAgICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgogICAgICAgICBpZiAobm9waWMgJiYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykpCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgaWYgKCpzcGVjKysgPT0gJzonKSB7IC8qIHBvc3NpYmx5IGZvbGxvd2VkIGJ5IDppbmRleCAqLwogICAgICAgICAgICAgaW50IGksIGluZGV4ID0gc3RydG9sKHNwZWMsIE5VTEwsIDApOwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gdHlwZSAmJgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgeworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICAgICAgaWYgKChzLT5zdHJlYW1zW2ldLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgfHwgcy0+c3RyZWFtc1tpXS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gdHlwZQorICAgICAgICAgICAgICAgICAgICApICYmCiAgICAgICAgICAgICAgICAgICAgICEobm9waWMgJiYgKHN0LT5kaXNwb3NpdGlvbiAmIEFWX0RJU1BPU0lUSU9OX0FUVEFDSEVEX1BJQykpICYmCiAgICAgICAgICAgICAgICAgICAgIGluZGV4LS0gPT0gMCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkgPT0gc3QtPmluZGV4OworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZWxzZQorICAgICAgICAgICAgICAgIGlmICgocy0+c3RyZWFtc1tpXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gdHlwZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgIShub3BpYyAmJiAoc3QtPmRpc3Bvc2l0aW9uICYgQVZfRElTUE9TSVRJT05fQVRUQUNIRURfUElDKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgtLSA9PSAwKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSA9PSBzdC0+aW5kZXg7CisjZW5kaWYKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiAxOwpAQCAtNDQwMiwxMSArNTEwMCw5NCBAQAogICAgICAgICAgICAgaWYgKHMtPnByb2dyYW1zW2ldLT5pZCAhPSBwcm9nX2lkKQogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgICBpZiAoKmVuZHB0cisrID09ICc6JykgewotICAgICAgICAgICAgICAgIGludCBzdHJlYW1faWR4ID0gc3RydG9sKGVuZHB0ciwgTlVMTCwgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbV9pZHggPj0gMCAmJgotICAgICAgICAgICAgICAgICAgICBzdHJlYW1faWR4IDwgcy0+cHJvZ3JhbXNbaV0tPm5iX3N0cmVhbV9pbmRleGVzICYmCi0gICAgICAgICAgICAgICAgICAgIHN0LT5pbmRleCA9PSBzLT5wcm9ncmFtc1tpXS0+c3RyZWFtX2luZGV4W3N0cmVhbV9pZHhdOworICAgICAgICAgICAgaWYgKCplbmRwdHIrKyA9PSAnOicpIHsgIC8vIHA6PGlkPjouLi4uCisgICAgICAgICAgICAgICAgaWYgKCAqZW5kcHRyID09ICdhJyB8fCAqZW5kcHRyID09ICd2JyB8fAorICAgICAgICAgICAgICAgICAgICAgKmVuZHB0ciA9PSAncycgfHwgKmVuZHB0ciA9PSAnZCcpIHsgIC8vIHA6PGlkPjo8c3RfdHlwZT5bOjxpbmRleD5dCisgICAgICAgICAgICAgICAgICAgIGVudW0gQVZNZWRpYVR5cGUgdHlwZTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCplbmRwdHIrKykgeworICAgICAgICAgICAgICAgICAgICBjYXNlICd2JzogdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnYSc6IHR5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3MnOiB0eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOyAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzogdHlwZSA9IEFWTUVESUFfVFlQRV9EQVRBOyAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogIGF2X2Fzc2VydDAoMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCplbmRwdHIrKyA9PSAnOicpIHsgIC8vIHA6PGlkPjo8c3RfdHlwZT46PGluZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9pZHggPSBzdHJ0b2woZW5kcHRyLCBOVUxMLCAwKSwgdHlwZV9jb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5wcm9ncmFtc1tpXS0+bmJfc3RyZWFtX2luZGV4ZXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1faW5kZXggPSBzLT5wcm9ncmFtc1tpXS0+c3RyZWFtX2luZGV4W2pdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdC0+aW5kZXggPT0gcy0+cHJvZ3JhbXNbaV0tPnN0cmVhbV9pbmRleFtqXSkgeworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlX2NvdW50ZXIgPT0gc3RyZWFtX2lkeCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZV9jb3VudGVyID09IHN0cmVhbV9pZHggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjLT5jb2RlY190eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2NvdW50ZXIrKzsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF0tPmNvZGVjcGFyLT5jb2RlY190eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2NvdW50ZXIrKzsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBwOjxpZD46PHN0X3R5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcy0+cHJvZ3JhbXNbaV0tPm5iX3N0cmVhbV9pbmRleGVzOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5pbmRleCA9PSBzLT5wcm9ncmFtc1tpXS0+c3RyZWFtX2luZGV4W2pdKSB7CisjaWYgRkZfQVBJX0xBVkZfQVZDVFgKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlID09IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gc3QtPmNvZGVjLT5jb2RlY190eXBlOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoICplbmRwdHIgPT0gJ20nKSB7IC8vIHA6PGlkPjptOjxtZXRhZGF0YV9zcGVjPgorICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnOworICAgICAgICAgICAgICAgICAgICBjaGFyICprZXksICp2YWw7CisgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmICgqKCsrZW5kcHRyKSAhPSAnOicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHN0cmVhbSBzcGVjaWZpZXIgc3ludGF4LCBtaXNzaW5nICc6JyBzaWduIGFmdGVyIDptLlxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gc3RyY2hyKCsrZW5kcHRyLCAnOicpOworICAgICAgICAgICAgICAgICAgICBrZXkgPSB2YWwgPyBhdl9zdHJuZHVwKGVuZHB0ciwgdmFsIC0gZW5kcHRyKSA6IGF2X3N0cmR1cChlbmRwdHIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHMtPnByb2dyYW1zW2ldLT5uYl9zdHJlYW1faW5kZXhlczsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0LT5pbmRleCA9PSBzLT5wcm9ncmFtc1tpXS0+c3RyZWFtX2luZGV4W2pdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnID0gYXZfZGljdF9nZXQoc3QtPm1ldGFkYXRhLCBrZXksIE5VTEwsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcgJiYgKCF2YWwgfHwgIXN0cmNtcCh0YWctPnZhbHVlLCB2YWwgKyAxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgma2V5KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAvLyBwOjxpZD46PGluZGV4PgorICAgICAgICAgICAgICAgICAgICBpbnQgc3RyZWFtX2lkeCA9IHN0cnRvbChlbmRwdHIsIE5VTEwsIDApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtX2lkeCA+PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1faWR4IDwgcy0+cHJvZ3JhbXNbaV0tPm5iX3N0cmVhbV9pbmRleGVzICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+aW5kZXggPT0gcy0+cHJvZ3JhbXNbaV0tPnN0cmVhbV9pbmRleFtzdHJlYW1faWR4XTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBzLT5wcm9ncmFtc1tpXS0+bmJfc3RyZWFtX2luZGV4ZXM7IGorKykKQEAgLTQ0NDYsMTcgKzUyMjcsMzYgQEAKICAgICAgICAgYXZfZnJlZXAoJmtleSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfSBlbHNlIGlmICgqc3BlYyA9PSAndScpIHsKLSAgICAgICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gc3QtPmNvZGVjOworICAgICAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gc3QtPmNvZGVjcGFyOworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHN0LT5jb2RlYzsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCiAgICAgICAgIGludCB2YWw7Ci0gICAgICAgIHN3aXRjaCAoYXZjdHgtPmNvZGVjX3R5cGUpIHsKKyAgICAgICAgc3dpdGNoIChwYXItPmNvZGVjX3R5cGUpIHsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICB2YWwgPSBhdmN0eC0+c2FtcGxlX3JhdGUgJiYgYXZjdHgtPmNoYW5uZWxzOwotICAgICAgICAgICAgaWYgKGF2Y3R4LT5zYW1wbGVfZm10ID09IEFWX1NBTVBMRV9GTVRfTk9ORSkKKyAgICAgICAgICAgIHZhbCA9IHBhci0+c2FtcGxlX3JhdGUgJiYgcGFyLT5jaGFubmVsczsKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorICAgICAgICAgICAgdmFsID0gdmFsIHx8IChjb2RlYy0+c2FtcGxlX3JhdGUgJiYgY29kZWMtPmNoYW5uZWxzKTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKHBhci0+Zm9ybWF0ID09IEFWX1NBTVBMRV9GTVRfTk9ORQorI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgICAgICAgICAgICAgJiYgY29kZWMtPnNhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9OT05FCisjZW5kaWYKKyAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU86Ci0gICAgICAgICAgICB2YWwgPSBhdmN0eC0+d2lkdGggJiYgYXZjdHgtPmhlaWdodDsKLSAgICAgICAgICAgIGlmIChhdmN0eC0+cGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpCisgICAgICAgICAgICB2YWwgPSBwYXItPndpZHRoICYmIHBhci0+aGVpZ2h0OworI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgICAgICAgICB2YWwgPSB2YWwgfHwgKGNvZGVjLT53aWR0aCAmJiBjb2RlYy0+aGVpZ2h0KTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKHBhci0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORQorI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCisgICAgICAgICAgICAgICAgJiYgY29kZWMtPnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FCisjZW5kaWYKKyAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfVU5LTk9XTjoKQEAgLTQ0NjYsNyArNTI2NiwxMSBAQAogICAgICAgICAgICAgdmFsID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhdmN0eC0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSAmJiB2YWwgIT0gMDsKKyNpZiBGRl9BUElfTEFWRl9BVkNUWAorICAgICAgICByZXR1cm4gKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSB8fCBjb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORSkgJiYgdmFsICE9IDA7CisjZWxzZQorICAgICAgICByZXR1cm4gcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9OT05FICYmIHZhbCAhPSAwOworI2VuZGlmCiAgICAgfSBlbHNlIGlmICghKnNwZWMpIC8qIGVtcHR5IHNwZWNpZmllciwgbWF0Y2hlcyBldmVyeXRoaW5nICovCiAgICAgICAgIHJldHVybiAxOwogCkBAIC00NTc1LDI2ICs1Mzc5LDI2IEBACiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IE5VTEw7CiAgICAgaW50IHNpemUgICAgICAgICAgICA9IDA7CiAKLSAgICBpZiAoc3QtPmNvZGVjLT53aWR0aCA9PSAxOTIwKSB7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1BST0dSRVNTSVZFKSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+d2lkdGggPT0gMTkyMCkgeworICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5maWVsZF9vcmRlciA9PSBBVl9GSUVMRF9QUk9HUkVTU0lWRSkgewogICAgICAgICAgICAgZGF0YSA9IGF2Y2kxMDBfMTA4MHBfZXh0cmFkYXRhOwogICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihhdmNpMTAwXzEwODBwX2V4dHJhZGF0YSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkYXRhID0gYXZjaTEwMF8xMDgwaV9leHRyYWRhdGE7CiAgICAgICAgICAgICBzaXplID0gc2l6ZW9mKGF2Y2kxMDBfMTA4MGlfZXh0cmFkYXRhKTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT53aWR0aCA9PSAxNDQwKSB7Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmZpZWxkX29yZGVyID09IEFWX0ZJRUxEX1BST0dSRVNTSVZFKSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPndpZHRoID09IDE0NDApIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+ZmllbGRfb3JkZXIgPT0gQVZfRklFTERfUFJPR1JFU1NJVkUpIHsKICAgICAgICAgICAgIGRhdGEgPSBhdmNpNTBfMTA4MHBfZXh0cmFkYXRhOwogICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihhdmNpNTBfMTA4MHBfZXh0cmFkYXRhKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRhdGEgPSBhdmNpNTBfMTA4MGlfZXh0cmFkYXRhOwogICAgICAgICAgICAgc2l6ZSA9IHNpemVvZihhdmNpNTBfMTA4MGlfZXh0cmFkYXRhKTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT53aWR0aCA9PSAxMjgwKSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPndpZHRoID09IDEyODApIHsKICAgICAgICAgZGF0YSA9IGF2Y2kxMDBfNzIwcF9leHRyYWRhdGE7CiAgICAgICAgIHNpemUgPSBzaXplb2YoYXZjaTEwMF83MjBwX2V4dHJhZGF0YSk7Ci0gICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPndpZHRoID09IDk2MCkgeworICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjcGFyLT53aWR0aCA9PSA5NjApIHsKICAgICAgICAgZGF0YSA9IGF2Y2k1MF83MjBwX2V4dHJhZGF0YTsKICAgICAgICAgc2l6ZSA9IHNpemVvZihhdmNpNTBfNzIwcF9leHRyYWRhdGEpOwogICAgIH0KQEAgLTQ2MDIsMTYgKzU0MDYsMTYgQEAKICAgICBpZiAoIXNpemUpCiAgICAgICAgIHJldHVybiAwOwogCi0gICAgYXZfZnJlZXAoJnN0LT5jb2RlYy0+ZXh0cmFkYXRhKTsKLSAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgc2l6ZSkpCisgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3Bhciwgc2l6ZSkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgbWVtY3B5KHN0LT5jb2RlYy0+ZXh0cmFkYXRhLCBkYXRhLCBzaXplKTsKKyAgICBtZW1jcHkoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIGRhdGEsIHNpemUpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXVpbnQ4X3QgKmF2X3N0cmVhbV9nZXRfc2lkZV9kYXRhKEFWU3RyZWFtICpzdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzaXplKQordWludDhfdCAqYXZfc3RyZWFtX2dldF9zaWRlX2RhdGEoY29uc3QgQVZTdHJlYW0gKnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLCBpbnQgKnNpemUpCiB7CiAgICAgaW50IGk7CiAKQEAgLTQ2MjUsMTUgKzU0MjksMTEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdWludDhfdCAqYXZfc3RyZWFtX25ld19zaWRlX2RhdGEoQVZTdHJlYW0gKnN0LCBlbnVtIEFWUGFja2V0U2lkZURhdGFUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkKK2ludCBhdl9zdHJlYW1fYWRkX3NpZGVfZGF0YShBVlN0cmVhbSAqc3QsIGVudW0gQVZQYWNrZXRTaWRlRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBBVlBhY2tldFNpZGVEYXRhICpzZCwgKnRtcDsKICAgICBpbnQgaTsKLSAgICB1aW50OF90ICpkYXRhID0gYXZfbWFsbG9jKHNpemUpOwotCi0gICAgaWYgKCFkYXRhKQotICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzdC0+bmJfc2lkZV9kYXRhOyBpKyspIHsKICAgICAgICAgc2QgPSAmc3QtPnNpZGVfZGF0YVtpXTsKQEAgLTQ2NDIsMTQgKzU0NDIsMTYgQEAKICAgICAgICAgICAgIGF2X2ZyZWVwKCZzZC0+ZGF0YSk7CiAgICAgICAgICAgICBzZC0+ZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICBzZC0+c2l6ZSA9IHNpemU7Ci0gICAgICAgICAgICByZXR1cm4gc2QtPmRhdGE7CisgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQogICAgIH0KIAotICAgIHRtcCA9IGF2X3JlYWxsb2NfYXJyYXkoc3QtPnNpZGVfZGF0YSwgc3QtPm5iX3NpZGVfZGF0YSArIDEsIHNpemVvZigqdG1wKSk7CisgICAgaWYgKCh1bnNpZ25lZClzdC0+bmJfc2lkZV9kYXRhICsgMSA+PSBJTlRfTUFYIC8gc2l6ZW9mKCpzdC0+c2lkZV9kYXRhKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRVJBTkdFKTsKKworICAgIHRtcCA9IGF2X3JlYWxsb2Moc3QtPnNpZGVfZGF0YSwgKHN0LT5uYl9zaWRlX2RhdGEgKyAxKSAqIHNpemVvZigqdG1wKSk7CiAgICAgaWYgKCF0bXApIHsKLSAgICAgICAgYXZfZnJlZXAoJmRhdGEpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICB9CiAKICAgICBzdC0+c2lkZV9kYXRhID0gdG1wOwpAQCAtNDY1OSwzMSArNTQ2MSw4NyBAQAogICAgIHNkLT50eXBlID0gdHlwZTsKICAgICBzZC0+ZGF0YSA9IGRhdGE7CiAgICAgc2QtPnNpemUgPSBzaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK3VpbnQ4X3QgKmF2X3N0cmVhbV9uZXdfc2lkZV9kYXRhKEFWU3RyZWFtICpzdCwgZW51bSBBVlBhY2tldFNpZGVEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCit7CisgICAgaW50IHJldDsKKyAgICB1aW50OF90ICpkYXRhID0gYXZfbWFsbG9jKHNpemUpOworCisgICAgaWYgKCFkYXRhKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldCA9IGF2X3N0cmVhbV9hZGRfc2lkZV9kYXRhKHN0LCB0eXBlLCBkYXRhLCBzaXplKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9mcmVlcCgmZGF0YSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKwogICAgIHJldHVybiBkYXRhOwogfQogCiBpbnQgZmZfc3RyZWFtX2FkZF9iaXRzdHJlYW1fZmlsdGVyKEFWU3RyZWFtICpzdCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqYXJncykKIHsKLSAgICBBVkJpdFN0cmVhbUZpbHRlckNvbnRleHQgKmJzZmMgPSBOVUxMOwotICAgIEFWQml0U3RyZWFtRmlsdGVyQ29udGV4dCAqKmRlc3QgPSAmc3QtPmludGVybmFsLT5ic2ZjOwotICAgIHdoaWxlICgqZGVzdCAmJiAoKmRlc3QpLT5uZXh0KQotICAgICAgICBkZXN0ID0gJigqZGVzdCktPm5leHQ7CisgICAgaW50IHJldDsKKyAgICBjb25zdCBBVkJpdFN0cmVhbUZpbHRlciAqYnNmOworICAgIEFWQlNGQ29udGV4dCAqYnNmYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqaW5fcGFyOwogCi0gICAgaWYgKCEoYnNmYyA9IGF2X2JpdHN0cmVhbV9maWx0ZXJfaW5pdChuYW1lKSkpIHsKKyAgICBpZiAoIShic2YgPSBhdl9ic2ZfZ2V0X2J5X25hbWUobmFtZSkpKSB7CiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJVbmtub3duIGJpdHN0cmVhbSBmaWx0ZXIgJyVzJ1xuIiwgbmFtZSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0JTRl9OT1RfRk9VTkQ7CiAgICAgfQotICAgIGlmIChhcmdzICYmICEoYnNmYy0+YXJncyA9IGF2X3N0cmR1cChhcmdzKSkpIHsKLSAgICAgICAgYXZfYml0c3RyZWFtX2ZpbHRlcl9jbG9zZShic2ZjKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGlmICgocmV0ID0gYXZfYnNmX2FsbG9jKGJzZiwgJmJzZmMpKSA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICBpZiAoc3QtPmludGVybmFsLT5uYl9ic2ZjcykgeworICAgICAgICBpbl9wYXIgPSBzdC0+aW50ZXJuYWwtPmJzZmNzW3N0LT5pbnRlcm5hbC0+bmJfYnNmY3MgLSAxXS0+cGFyX291dDsKKyAgICAgICAgYnNmYy0+dGltZV9iYXNlX2luID0gc3QtPmludGVybmFsLT5ic2Zjc1tzdC0+aW50ZXJuYWwtPm5iX2JzZmNzIC0gMV0tPnRpbWVfYmFzZV9vdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5fcGFyID0gc3QtPmNvZGVjcGFyOworICAgICAgICBic2ZjLT50aW1lX2Jhc2VfaW4gPSBzdC0+dGltZV9iYXNlOwogICAgIH0KLSAgICBhdl9sb2coc3QtPmNvZGVjLCBBVl9MT0dfVkVSQk9TRSwKKworICAgIGlmICgocmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2NvcHkoYnNmYy0+cGFyX2luLCBpbl9wYXIpKSA8IDApIHsKKyAgICAgICAgYXZfYnNmX2ZyZWUoJmJzZmMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChhcmdzICYmIGJzZmMtPmZpbHRlci0+cHJpdl9jbGFzcykgeworICAgICAgICBjb25zdCBBVk9wdGlvbiAqb3B0ID0gYXZfb3B0X25leHQoYnNmYy0+cHJpdl9kYXRhLCBOVUxMKTsKKyAgICAgICAgY29uc3QgY2hhciAqIHNob3J0aGFuZFsyXSA9IHtOVUxMfTsKKworICAgICAgICBpZiAob3B0KQorICAgICAgICAgICAgc2hvcnRoYW5kWzBdID0gb3B0LT5uYW1lOworCisgICAgICAgIGlmICgocmV0ID0gYXZfb3B0X3NldF9mcm9tX3N0cmluZyhic2ZjLT5wcml2X2RhdGEsIGFyZ3MsIHNob3J0aGFuZCwgIj0iLCAiOiIpKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2JzZl9mcmVlKCZic2ZjKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHJldCA9IGF2X2JzZl9pbml0KGJzZmMpKSA8IDApIHsKKyAgICAgICAgYXZfYnNmX2ZyZWUoJmJzZmMpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICgocmV0ID0gYXZfZHluYXJyYXlfYWRkX25vZnJlZSgmc3QtPmludGVybmFsLT5ic2ZjcywgJnN0LT5pbnRlcm5hbC0+bmJfYnNmY3MsIGJzZmMpKSkgeworICAgICAgICBhdl9ic2ZfZnJlZSgmYnNmYyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19WRVJCT1NFLAogICAgICAgICAgICAiQXV0b21hdGljYWxseSBpbnNlcnRlZCBiaXRzdHJlYW0gZmlsdGVyICclcyc7IGFyZ3M9JyVzJ1xuIiwKICAgICAgICAgICAgbmFtZSwgYXJncyA/IGFyZ3MgOiAiIik7Ci0gICAgKmRlc3QgPSBic2ZjOwogICAgIHJldHVybiAxOwogfQogCisjaWYgRkZfQVBJX09MRF9CU0YKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKIGludCBhdl9hcHBseV9iaXRzdHJlYW1fZmlsdGVycyhBVkNvZGVjQ29udGV4dCAqY29kZWMsIEFWUGFja2V0ICpwa3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCaXRTdHJlYW1GaWx0ZXJDb250ZXh0ICpic2ZjKQogewpAQCAtNDY5NCw2ICs1NTUyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19wa3QuZGF0YSwgJm5ld19wa3Quc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmRhdGEsIHBrdC0+c2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKTsKKyAgICAgICAgaWYgKGEgPT0gMCAmJiBuZXdfcGt0LnNpemUgPT0gMCAmJiBuZXdfcGt0LnNpZGVfZGF0YV9lbGVtcyA9PSAwKSB7CisgICAgICAgICAgICBhdl9wYWNrZXRfdW5yZWYocGt0KTsKKyAgICAgICAgICAgIG1lbXNldChwa3QsIDAsIHNpemVvZigqcGt0KSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogICAgICAgICBpZihhID09IDAgJiYgbmV3X3BrdC5kYXRhICE9IHBrdC0+ZGF0YSkgewogICAgICAgICAgICAgdWludDhfdCAqdCA9IGF2X21hbGxvYyhuZXdfcGt0LnNpemUgKyBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKTsgLy90aGUgbmV3IHNob3VsZCBiZSBhIHN1YnNldCBvZiB0aGUgb2xkIHNvIGNhbm5vdCBvdmVyZmxvdwogICAgICAgICAgICAgaWYgKHQpIHsKQEAgLTQ3MzIsNiArNTU5NSwxOCBAQAogICAgIH0KICAgICByZXR1cm4gcmV0OwogfQorRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworaW50IGZmX2Zvcm1hdF9vdXRwdXRfb3BlbihBVkZvcm1hdENvbnRleHQgKnMsIGNvbnN0IGNoYXIgKnVybCwgQVZEaWN0aW9uYXJ5ICoqb3B0aW9ucykKK3sKKyAgICBpZiAoIXMtPm9mb3JtYXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoIShzLT5vZm9ybWF0LT5mbGFncyAmIEFWRk1UX05PRklMRSkpCisgICAgICAgIHJldHVybiBzLT5pb19vcGVuKHMsICZzLT5wYiwgdXJsLCBBVklPX0ZMQUdfV1JJVEUsIG9wdGlvbnMpOworICAgIHJldHVybiAwOworfQogCiB2b2lkIGZmX2Zvcm1hdF9pb19jbG9zZShBVkZvcm1hdENvbnRleHQgKnMsIEFWSU9Db250ZXh0ICoqcGIpCiB7CkBAIC00NzQwLDYgKzU2MTUsMTEgQEAKICAgICAqcGIgPSBOVUxMOwogfQogCitpbnQgZmZfaXNfaHR0cF9wcm90byhjaGFyICpmaWxlbmFtZSkgeworICAgIGNvbnN0IGNoYXIgKnByb3RvID0gYXZpb19maW5kX3Byb3RvY29sX25hbWUoZmlsZW5hbWUpOworICAgIHJldHVybiBwcm90byA/ICghYXZfc3RyY2FzZWNtcChwcm90bywgImh0dHAiKSB8fCAhYXZfc3RyY2FzZWNtcChwcm90bywgImh0dHBzIikpIDogMDsKK30KKwogaW50IGZmX3BhcnNlX2NyZWF0aW9uX3RpbWVfbWV0YWRhdGEoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90ICp0aW1lc3RhbXAsIGludCByZXR1cm5fc2Vjb25kcykKIHsKICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZW50cnk7CkBAIC00NzU2LDMgKzU2MzYsMTQ2IEBACiAgICAgfQogICAgIHJldHVybiAwOwogfQorCitpbnQgZmZfc3RhbmRhcmRpemVfY3JlYXRpb25fdGltZShBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7CisgICAgaW50IHJldCA9IGZmX3BhcnNlX2NyZWF0aW9uX3RpbWVfbWV0YWRhdGEocywgJnRpbWVzdGFtcCwgMCk7CisgICAgaWYgKHJldCA9PSAxKQorICAgICAgICByZXR1cm4gYXZwcml2X2RpY3Rfc2V0X3RpbWVzdGFtcCgmcy0+bWV0YWRhdGEsICJjcmVhdGlvbl90aW1lIiwgdGltZXN0YW1wKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgZmZfZ2V0X3BhY2tldF9wYWxldHRlKEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCwgaW50IHJldCwgdWludDMyX3QgKnBhbGV0dGUpCit7CisgICAgdWludDhfdCAqc2lkZV9kYXRhOworICAgIGludCBzaXplOworCisgICAgc2lkZV9kYXRhID0gYXZfcGFja2V0X2dldF9zaWRlX2RhdGEocGt0LCBBVl9QS1RfREFUQV9QQUxFVFRFLCAmc2l6ZSk7CisgICAgaWYgKHNpZGVfZGF0YSkgeworICAgICAgICBpZiAoc2l6ZSAhPSBBVlBBTEVUVEVfU0laRSkgeworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFsZXR0ZSBzaWRlIGRhdGFcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KHBhbGV0dGUsIHNpZGVfZGF0YSwgQVZQQUxFVFRFX1NJWkUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAocmV0ID09IENPTlRBSU5TX1BBTCkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEFWUEFMRVRURV9DT1VOVDsgaSsrKQorICAgICAgICAgICAgcGFsZXR0ZVtpXSA9IEFWX1JMMzIocGt0LT5kYXRhICsgcGt0LT5zaXplIC0gQVZQQUxFVFRFX1NJWkUgKyBpKjQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZmX2JwcmludF90b19jb2RlY3Bhcl9leHRyYWRhdGEoQVZDb2RlY1BhcmFtZXRlcnMgKnBhciwgc3RydWN0IEFWQlByaW50ICpidWYpCit7CisgICAgaW50IHJldDsKKyAgICBjaGFyICpzdHI7CisKKyAgICByZXQgPSBhdl9icHJpbnRfZmluYWxpemUoYnVmLCAmc3RyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIWF2X2JwcmludF9pc19jb21wbGV0ZShidWYpKSB7CisgICAgICAgIGF2X2ZyZWUoc3RyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICBwYXItPmV4dHJhZGF0YSA9IHN0cjsKKyAgICAvKiBOb3RlOiB0aGUgc3RyaW5nIGlzIE5VTCB0ZXJtaW5hdGVkIChzbyBleHRyYWRhdGEgY2FuIGJlIHJlYWQgYXMgYQorICAgICAqIHN0cmluZyksIGJ1dCB0aGUgZW5kaW5nIGNoYXJhY3RlciBpcyBub3QgYWNjb3VudGVkIGluIHRoZSBzaXplIChpbgorICAgICAqIGJpbmFyeSBmb3JtYXRzIHlvdSBhcmUgbGlrZWx5IG5vdCBzdXBwb3NlZCB0byBtdXggdGhhdCBjaGFyYWN0ZXIpLiBXaGVuCisgICAgICogZXh0cmFkYXRhIGlzIGNvcGllZCwgaXQgaXMgYWxzbyBwYWRkZWQgd2l0aCBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFCisgICAgICogemVyb3MuICovCisgICAgcGFyLT5leHRyYWRhdGFfc2l6ZSA9IGJ1Zi0+bGVuOworICAgIHJldHVybiAwOworfQorCitpbnQgYXZmb3JtYXRfdHJhbnNmZXJfaW50ZXJuYWxfc3RyZWFtX3RpbWluZ19pbmZvKGNvbnN0IEFWT3V0cHV0Rm9ybWF0ICpvZm10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN0cmVhbSAqb3N0LCBjb25zdCBBVlN0cmVhbSAqaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWVGltZWJhc2VTb3VyY2UgY29weV90YikKK3sKKyAgICAvL1RPRE86IHVzZSBbaW9dc3QtPmludGVybmFsLT5hdmN0eAorICAgIGNvbnN0IEFWQ29kZWNDb250ZXh0ICpkZWNfY3R4ID0gaXN0LT5jb2RlYzsKKyAgICBBVkNvZGVjQ29udGV4dCAgICAgICAqZW5jX2N0eCA9IG9zdC0+Y29kZWM7CisKKyAgICBlbmNfY3R4LT50aW1lX2Jhc2UgPSBpc3QtPnRpbWVfYmFzZTsKKyAgICAvKgorICAgICAqIEF2aSBpcyBhIHNwZWNpYWwgY2FzZSBoZXJlIGJlY2F1c2UgaXQgc3VwcG9ydHMgdmFyaWFibGUgZnBzIGJ1dAorICAgICAqIGhhdmluZyB0aGUgZnBzIGFuZCB0aW1lYmFzZSBkaWZmZXJlIHNpZ25pZmljYW50bHkgYWRkcyBxdWl0ZSBzb21lCisgICAgICogb3ZlcmhlYWQKKyAgICAgKi8KKyAgICBpZiAoIXN0cmNtcChvZm10LT5uYW1lLCAiYXZpIikpIHsKKyNpZiBGRl9BUElfUl9GUkFNRV9SQVRFCisgICAgICAgIGlmIChjb3B5X3RiID09IEFWRk1UX1RCQ0ZfQVVUTyAmJiBpc3QtPnJfZnJhbWVfcmF0ZS5udW0KKyAgICAgICAgICAgICYmIGF2X3EyZChpc3QtPnJfZnJhbWVfcmF0ZSkgPj0gYXZfcTJkKGlzdC0+YXZnX2ZyYW1lX3JhdGUpCisgICAgICAgICAgICAmJiAwLjUvYXZfcTJkKGlzdC0+cl9mcmFtZV9yYXRlKSA+IGF2X3EyZChpc3QtPnRpbWVfYmFzZSkKKyAgICAgICAgICAgICYmIDAuNS9hdl9xMmQoaXN0LT5yX2ZyYW1lX3JhdGUpID4gYXZfcTJkKGRlY19jdHgtPnRpbWVfYmFzZSkKKyAgICAgICAgICAgICYmIGF2X3EyZChpc3QtPnRpbWVfYmFzZSkgPCAxLjAvNTAwICYmIGF2X3EyZChkZWNfY3R4LT50aW1lX2Jhc2UpIDwgMS4wLzUwMAorICAgICAgICAgICAgfHwgY29weV90YiA9PSBBVkZNVF9UQkNGX1JfRlJBTUVSQVRFKSB7CisgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UubnVtID0gaXN0LT5yX2ZyYW1lX3JhdGUuZGVuOworICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlLmRlbiA9IDIqaXN0LT5yX2ZyYW1lX3JhdGUubnVtOworICAgICAgICAgICAgZW5jX2N0eC0+dGlja3NfcGVyX2ZyYW1lID0gMjsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgIGlmIChjb3B5X3RiID09IEFWRk1UX1RCQ0ZfQVVUTyAmJiBhdl9xMmQoZGVjX2N0eC0+dGltZV9iYXNlKSpkZWNfY3R4LT50aWNrc19wZXJfZnJhbWUgPiAyKmF2X3EyZChpc3QtPnRpbWVfYmFzZSkKKyAgICAgICAgICAgICAgICAgICAmJiBhdl9xMmQoaXN0LT50aW1lX2Jhc2UpIDwgMS4wLzUwMAorICAgICAgICAgICAgICAgICAgIHx8IGNvcHlfdGIgPT0gQVZGTVRfVEJDRl9ERUNPREVSKSB7CisgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UgPSBkZWNfY3R4LT50aW1lX2Jhc2U7CisgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UubnVtICo9IGRlY19jdHgtPnRpY2tzX3Blcl9mcmFtZTsKKyAgICAgICAgICAgIGVuY19jdHgtPnRpbWVfYmFzZS5kZW4gKj0gMjsKKyAgICAgICAgICAgIGVuY19jdHgtPnRpY2tzX3Blcl9mcmFtZSA9IDI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCEob2ZtdC0+ZmxhZ3MgJiBBVkZNVF9WQVJJQUJMRV9GUFMpCisgICAgICAgICAgICAgICAmJiAhYXZfbWF0Y2hfbmFtZShvZm10LT5uYW1lLCAibW92LG1wNCwzZ3AsM2cyLHBzcCxpcG9kLGlzbXYsZjR2IikpIHsKKyAgICAgICAgaWYgKGNvcHlfdGIgPT0gQVZGTVRfVEJDRl9BVVRPICYmIGRlY19jdHgtPnRpbWVfYmFzZS5kZW4KKyAgICAgICAgICAgICYmIGF2X3EyZChkZWNfY3R4LT50aW1lX2Jhc2UpKmRlY19jdHgtPnRpY2tzX3Blcl9mcmFtZSA+IGF2X3EyZChpc3QtPnRpbWVfYmFzZSkKKyAgICAgICAgICAgICYmIGF2X3EyZChpc3QtPnRpbWVfYmFzZSkgPCAxLjAvNTAwCisgICAgICAgICAgICB8fCBjb3B5X3RiID09IEFWRk1UX1RCQ0ZfREVDT0RFUikgeworICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gZGVjX2N0eC0+dGltZV9iYXNlOworICAgICAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlLm51bSAqPSBkZWNfY3R4LT50aWNrc19wZXJfZnJhbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKGVuY19jdHgtPmNvZGVjX3RhZyA9PSBBVl9STDMyKCJ0bWNkIikgfHwgb3N0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID09IEFWX1JMMzIoInRtY2QiKSkKKyAgICAgICAgJiYgZGVjX2N0eC0+dGltZV9iYXNlLm51bSA8IGRlY19jdHgtPnRpbWVfYmFzZS5kZW4KKyAgICAgICAgJiYgZGVjX2N0eC0+dGltZV9iYXNlLm51bSA+IDAKKyAgICAgICAgJiYgMTIxTEwqZGVjX2N0eC0+dGltZV9iYXNlLm51bSA+IGRlY19jdHgtPnRpbWVfYmFzZS5kZW4pIHsKKyAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gZGVjX2N0eC0+dGltZV9iYXNlOworICAgIH0KKworICAgIGlmIChvc3QtPmF2Z19mcmFtZV9yYXRlLm51bSkKKyAgICAgICAgZW5jX2N0eC0+dGltZV9iYXNlID0gYXZfaW52X3Eob3N0LT5hdmdfZnJhbWVfcmF0ZSk7CisKKyAgICBhdl9yZWR1Y2UoJmVuY19jdHgtPnRpbWVfYmFzZS5udW0sICZlbmNfY3R4LT50aW1lX2Jhc2UuZGVuLAorICAgICAgICAgICAgICBlbmNfY3R4LT50aW1lX2Jhc2UubnVtLCBlbmNfY3R4LT50aW1lX2Jhc2UuZGVuLCBJTlRfTUFYKTsKKworICAgIHJldHVybiAwOworfQorCitBVlJhdGlvbmFsIGF2X3N0cmVhbV9nZXRfY29kZWNfdGltZWJhc2UoY29uc3QgQVZTdHJlYW0gKnN0KQoreworICAgIC8vIFNlZSBhdmZvcm1hdF90cmFuc2Zlcl9pbnRlcm5hbF9zdHJlYW1fdGltaW5nX2luZm8oKSBUT0RPLgorI2lmIEZGX0FQSV9MQVZGX0FWQ1RYCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgcmV0dXJuIHN0LT5jb2RlYy0+dGltZV9iYXNlOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZWxzZQorICAgIHJldHVybiBzdC0+aW50ZXJuYWwtPmF2Y3R4LT50aW1lX2Jhc2U7CisjZW5kaWYKK30KKwordm9pZCBmZl9mb3JtYXRfc2V0X3VybChBVkZvcm1hdENvbnRleHQgKnMsIGNoYXIgKnVybCkKK3sKKyAgICBhdl9hc3NlcnQwKHVybCk7CisgICAgYXZfZnJlZXAoJnMtPnVybCk7CisgICAgcy0+dXJsID0gdXJsOworI2lmIEZGX0FQSV9GT1JNQVRfRklMRU5BTUUKK0ZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICBhdl9zdHJsY3B5KHMtPmZpbGVuYW1lLCB1cmwsIHNpemVvZihzLT5maWxlbmFtZSkpOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3YyMTAuYyBiL2xpYmF2Zm9ybWF0L3YyMTAuYwppbmRleCAzMTM4N2E0Li5hOTBiZDM2IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC92MjEwLmMKKysrIGIvbGliYXZmb3JtYXQvdjIxMC5jCkBAIC00NSwyMSArNDUsMjEgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBjdHgtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gY3R4LT5pZm9ybWF0LT5yYXdfY29kZWNfaWQ7CiAKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgcy0+ZnJhbWVyYXRlLmRlbiwgcy0+ZnJhbWVyYXRlLm51bSk7CiAKICAgICByZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHMtPndpZHRoLCBzLT5oZWlnaHQsIDAsIGN0eCk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgc3QtPmNvZGVjLT53aWR0aCAgICA9IHMtPndpZHRoOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ICAgPSBzLT5oZWlnaHQ7Ci0gICAgc3QtPmNvZGVjLT5waXhfZm10ICA9IGN0eC0+aWZvcm1hdC0+cmF3X2NvZGVjX2lkID09IEFWX0NPREVDX0lEX1YyMTAgPwotICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMCA6IEFWX1BJWF9GTVRfWVVWNDIyUDE2OwotICAgIGN0eC0+cGFja2V0X3NpemUgICAgPSBHRVRfUEFDS0VUX1NJWkUocy0+d2lkdGgsIHMtPmhlaWdodCk7Ci0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGF2X3Jlc2NhbGVfcShjdHgtPnBhY2tldF9zaXplLAorICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggICAgPSBzLT53aWR0aDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCAgID0gcy0+aGVpZ2h0OworICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICAgPSBjdHgtPmlmb3JtYXQtPnJhd19jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WMjEwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQMTAgOiBBVl9QSVhfRk1UX1lVVjQyMlAxNjsKKyAgICBjdHgtPnBhY2tldF9zaXplICAgICAgID0gR0VUX1BBQ0tFVF9TSVpFKHMtPndpZHRoLCBzLT5oZWlnaHQpOworICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBhdl9yZXNjYWxlX3EoY3R4LT5wYWNrZXRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBVlJhdGlvbmFsKXs4LDF9LCBzdC0+dGltZV9iYXNlKTsKIAogICAgIHJldHVybiAwOwpAQCAtODMsNyArODMsNyBAQAogI2RlZmluZSBERUMgQVZfT1BUX0ZMQUdfREVDT0RJTkdfUEFSQU0KIHN0YXRpYyBjb25zdCBBVk9wdGlvbiB2MjEwX29wdGlvbnNbXSA9IHsKICAgICB7ICJ2aWRlb19zaXplIiwgInNldCBmcmFtZSBzaXplIiwgT0ZGU0VUKHdpZHRoKSwgQVZfT1BUX1RZUEVfSU1BR0VfU0laRSwgey5zdHIgPSBOVUxMfSwgMCwgMCwgREVDIH0sCi0gICAgeyAiZnJhbWVyYXRlIiwgInNldCBmcmFtZSByYXRlIiwgT0ZGU0VUKGZyYW1lcmF0ZSksIEFWX09QVF9UWVBFX1ZJREVPX1JBVEUsIHsuc3RyID0gIjI1In0sIDAsIDAsIERFQyB9LAorICAgIHsgImZyYW1lcmF0ZSIsICJzZXQgZnJhbWUgcmF0ZSIsIE9GRlNFVChmcmFtZXJhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCB7LnN0ciA9ICIyNSJ9LCAwLCBJTlRfTUFYLCBERUMgfSwKICAgICB7IE5VTEwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3ZhZy5jIGIvbGliYXZmb3JtYXQvdmFnLmMKaW5kZXggMjg3NWRiNS4uZThlYmNhZiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdmFnLmMKKysrIGIvbGliYXZmb3JtYXQvdmFnLmMKQEAgLTQwLDM3ICs0MCwzNyBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9QU1g7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IDEgKyAoYXZpb19yYjMyKHMtPnBiKSA9PSAweDAwMDAwMDA0KTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9QU1g7CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IDEgKyAoYXZpb19yYjMyKHMtPnBiKSA9PSAweDAwMDAwMDA0KTsKICAgICBhdmlvX3NraXAocy0+cGIsIDQpOwotICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzID4gMSkgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzID4gMSkgewogICAgICAgICBzdC0+ZHVyYXRpb24gICAgICAgPSBhdmlvX3JiMzIocy0+cGIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHN0LT5kdXJhdGlvbiAgICAgICA9IGF2aW9fcmIzMihzLT5wYikgLyAxNiAqIDI4OwogICAgIH0KLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHMtPnBiKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKQorICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocy0+cGIpOworICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGF2aW9fc2VlayhzLT5wYiwgMHgxMDAwLCBTRUVLX1NFVCk7CiAgICAgaWYgKGF2aW9fcmwzMihzLT5wYikgPT0gTUtUQUcoJ1YnLCdBJywnRycsJ3AnKSkgewotICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMHgxMDAwICogc3QtPmNvZGVjLT5jaGFubmVsczsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IDB4MTAwMCAqIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CiAgICAgICAgIGF2aW9fc2VlayhzLT5wYiwgMCwgU0VFS19TRVQpOwogICAgICAgICBzdC0+ZHVyYXRpb24gPSBzdC0+ZHVyYXRpb24gLyAxNiAqIDI4OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPSAxNiAqIHN0LT5jb2RlYy0+Y2hhbm5lbHM7Ci0gICAgICAgIGF2aW9fc2VlayhzLT5wYiwgc3QtPmNvZGVjLT5jaGFubmVscyA+IDEgPyAweDgwIDogMHgzMCwgU0VFS19TRVQpOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMTYgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgICAgICBhdmlvX3NlZWsocy0+cGIsIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPiAxID8gMHg4MCA6IDB4MzAsIFNFRUtfU0VUKTsKICAgICB9Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHZhZ19yZWFkX3BhY2tldChBVkZvcm1hdENvbnRleHQgKnMsIEFWUGFja2V0ICpwa3QpCiB7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmNvZGVjID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogCi0gICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgY29kZWMtPmJsb2NrX2FsaWduKTsKKyAgICByZXR1cm4gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBwYXItPmJsb2NrX2FsaWduKTsKIH0KIAogQVZJbnB1dEZvcm1hdCBmZl92YWdfZGVtdXhlciA9IHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3ZjMXRlc3QuYyBiL2xpYmF2Zm9ybWF0L3ZjMXRlc3QuYwppbmRleCAzYWZlMzk4Li5hODAxZjRiIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC92YzF0ZXN0LmMKKysrIGIvbGliYXZmb3JtYXQvdmMxdGVzdC5jCkBAIC01OCwxMyArNTgsMTMgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9XTVYzOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfV01WMzsKIAotICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHN0LT5jb2RlYywgcGIsIFZDMV9FWFRSQURBVEFfU0laRSkgPCAwKQorICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsIHN0LT5jb2RlY3BhciwgcGIsIFZDMV9FWFRSQURBVEFfU0laRSkgPCAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+aGVpZ2h0ID0gYXZpb19ybDMyKHBiKTsKLSAgICBzdC0+Y29kZWMtPndpZHRoID0gYXZpb19ybDMyKHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IGF2aW9fcmwzMihwYik7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCA9IGF2aW9fcmwzMihwYik7CiAgICAgaWYoYXZpb19ybDMyKHBiKSAhPSAweEMpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIGF2aW9fc2tpcChwYiwgOCk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC92YzF0ZXN0ZW5jLmMgYi9saWJhdmZvcm1hdC92YzF0ZXN0ZW5jLmMKaW5kZXggNzUxMzMzYS4uY2Y5NWQxZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdmMxdGVzdGVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3ZjMXRlc3RlbmMuYwpAQCAtMjcsMTkgKzI3LDE5IEBACiAKIHN0YXRpYyBpbnQgdmMxdGVzdF93cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewotICAgIEFWQ29kZWNDb250ZXh0ICphdmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAKLSAgICBpZiAoYXZjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XTVYzKSB7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV01WMykgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiT25seSBXTVYzIGlzIGFjY2VwdGVkIVxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgYXZpb193bDI0KHBiLCAwKTsgLy9mcmFtZXMgY291bnQgd2lsbCBiZSBoZXJlCiAgICAgYXZpb193OChwYiwgMHhDNSk7CiAgICAgYXZpb193bDMyKHBiLCA0KTsKLSAgICBhdmlvX3dyaXRlKHBiLCBhdmMtPmV4dHJhZGF0YSwgNCk7Ci0gICAgYXZpb193bDMyKHBiLCBhdmMtPmhlaWdodCk7Ci0gICAgYXZpb193bDMyKHBiLCBhdmMtPndpZHRoKTsKKyAgICBhdmlvX3dyaXRlKHBiLCBwYXItPmV4dHJhZGF0YSwgNCk7CisgICAgYXZpb193bDMyKHBiLCBwYXItPmhlaWdodCk7CisgICAgYXZpb193bDMyKHBiLCBwYXItPndpZHRoKTsKICAgICBhdmlvX3dsMzIocGIsIDB4Qyk7CiAgICAgYXZpb193bDI0KHBiLCAwKTsgLy8gaHJkX2J1ZmZlcgogICAgIGF2aW9fdzgocGIsIDB4ODApOyAvLyBsZXZlbHxjYnJ8cmVzMQpAQCAtNzMsNyArNzMsNyBAQAogICAgIFJDVkNvbnRleHQgKmN0eCA9IHMtPnByaXZfZGF0YTsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKIAotICAgIGlmIChzLT5wYi0+c2Vla2FibGUpIHsKKyAgICBpZiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHsKICAgICAgICAgYXZpb19zZWVrKHBiLCAwLCBTRUVLX1NFVCk7CiAgICAgICAgIGF2aW9fd2wyNChwYiwgY3R4LT5mcmFtZXMpOwogICAgICAgICBhdmlvX2ZsdXNoKHBiKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3ZlcnNpb24uaCBiL2xpYmF2Zm9ybWF0L3ZlcnNpb24uaAppbmRleCAwMjRhYjkxLi5hMGEyNmQ1IDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC92ZXJzaW9uLmgKKysrIGIvbGliYXZmb3JtYXQvdmVyc2lvbi5oCkBAIC0yOSw4ICsyOSwxMCBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL3ZlcnNpb24uaCIKIAotI2RlZmluZSBMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SICA1NwotI2RlZmluZSBMSUJBVkZPUk1BVF9WRVJTSU9OX01JTk9SICAyNQorLy8gTWFqb3IgYnVtcGluZyBtYXkgYWZmZWN0IFRpY2tldDU0NjcsIDU0MjEsIDU0NTEoY29tcGF0aWJpbGl0eSB3aXRoIENocm9taXVtKQorLy8gQWxzbyBwbGVhc2UgYWRkIGFueSB0aWNrZXQgbnVtYmVycyB0aGF0IHlvdSBiZWxpZXZlIG1pZ2h0IGJlIGFmZmVjdGVkIGhlcmUKKyNkZWZpbmUgTElCQVZGT1JNQVRfVkVSU0lPTl9NQUpPUiAgNTgKKyNkZWZpbmUgTElCQVZGT1JNQVRfVkVSU0lPTl9NSU5PUiAgMTIKICNkZWZpbmUgTElCQVZGT1JNQVRfVkVSU0lPTl9NSUNSTyAxMDAKIAogI2RlZmluZSBMSUJBVkZPUk1BVF9WRVJTSU9OX0lOVCBBVl9WRVJTSU9OX0lOVChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SLCBcCkBAIC01MywyNyArNTUsNDYgQEAKICAqIGF0IG9uY2UgdGhyb3VnaCB0aGUgYnVtcC4gVGhpcyBpbXByb3ZlcyB0aGUgZ2l0IGJpc2VjdC1hYmlsaXR5IG9mIHRoZSBjaGFuZ2UuCiAgKgogICovCi0jaWZuZGVmIEZGX0FQSV9MQVZGX0JJVEVYQUNUCi0jZGVmaW5lIEZGX0FQSV9MQVZGX0JJVEVYQUNUICAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfTEFWRl9GUkFDCi0jZGVmaW5lIEZGX0FQSV9MQVZGX0ZSQUMgICAgICAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfTEFWRl9DT0RFQ19UQgotI2RlZmluZSBGRl9BUElfTEFWRl9DT0RFQ19UQiAgICAgICAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKLSNpZm5kZWYgRkZfQVBJX1VSTF9GRU9GCi0jZGVmaW5lIEZGX0FQSV9VUkxfRkVPRiAgICAgICAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1OCkKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfTEFWRl9GTVRfUkFXUElDVFVSRQotI2RlZmluZSBGRl9BUElfTEFWRl9GTVRfUkFXUElDVFVSRSAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTgpCi0jZW5kaWYKICNpZm5kZWYgRkZfQVBJX0NPTVBVVEVfUEtUX0ZJRUxEUzIKLSNkZWZpbmUgRkZfQVBJX0NPTVBVVEVfUEtUX0ZJRUxEUzIgICAgICAoTElCQVZGT1JNQVRfVkVSU0lPTl9NQUpPUiA8IDU4KQorI2RlZmluZSBGRl9BUElfQ09NUFVURV9QS1RfRklFTERTMiAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTkpCiAjZW5kaWYKICNpZm5kZWYgRkZfQVBJX09MRF9PUEVOX0NBTExCQUNLUwotI2RlZmluZSBGRl9BUElfT0xEX09QRU5fQ0FMTEJBQ0tTICAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTgpCisjZGVmaW5lIEZGX0FQSV9PTERfT1BFTl9DQUxMQkFDS1MgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1OSkKICNlbmRpZgorI2lmbmRlZiBGRl9BUElfTEFWRl9BVkNUWAorI2RlZmluZSBGRl9BUElfTEFWRl9BVkNUWCAgICAgICAgICAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTkpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0hUVFBfVVNFUl9BR0VOVAorI2RlZmluZSBGRl9BUElfSFRUUF9VU0VSX0FHRU5UICAgICAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTkpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0hMU19XUkFQCisjZGVmaW5lIEZGX0FQSV9ITFNfV1JBUCAgICAgICAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1OSkKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfTEFWRl9LRUVQU0lERV9GTEFHCisjZGVmaW5lIEZGX0FQSV9MQVZGX0tFRVBTSURFX0ZMQUcgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1OSkKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfT0xEX1JPVEFURV9BUEkKKyNkZWZpbmUgRkZfQVBJX09MRF9ST1RBVEVfQVBJICAgICAgICAgICAoTElCQVZGT1JNQVRfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9GT1JNQVRfR0VUX1NFVAorI2RlZmluZSBGRl9BUElfRk9STUFUX0dFVF9TRVQgICAgICAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTkpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX09MRF9BVklPX0VPRl8wCisjZGVmaW5lIEZGX0FQSV9PTERfQVZJT19FT0ZfMCAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1OSkKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfTEFWRl9GRlNFUlZFUgorI2RlZmluZSBGRl9BUElfTEFWRl9GRlNFUlZFUiAgICAgICAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTkpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0ZPUk1BVF9GSUxFTkFNRQorI2RlZmluZSBGRl9BUElfRk9STUFUX0ZJTEVOQU1FICAgICAgICAgIChMSUJBVkZPUk1BVF9WRVJTSU9OX01BSk9SIDwgNTkpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX09MRF9SVFNQX09QVElPTlMKKyNkZWZpbmUgRkZfQVBJX09MRF9SVFNQX09QVElPTlMgICAgICAgICAoTElCQVZGT1JNQVRfVkVSU0lPTl9NQUpPUiA8IDU5KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9ORVhUCisjZGVmaW5lIEZGX0FQSV9ORVhUICAgICAgICAgICAgICAgICAgICAgKExJQkFWRk9STUFUX1ZFUlNJT05fTUFKT1IgPCA1OSkKKyNlbmRpZgorCiAKICNpZm5kZWYgRkZfQVBJX1JfRlJBTUVfUkFURQogI2RlZmluZSBGRl9BUElfUl9GUkFNRV9SQVRFICAgICAgICAgICAgMQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdml2by5jIGIvbGliYXZmb3JtYXQvdml2by5jCmluZGV4IDEwZDgxYjkuLmM5ZTljMzcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Zpdm8uYworKysgYi9saWJhdmZvcm1hdC92aXZvLmMKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgYnVmICs9IDE1OwogCi0gICAgaWYgKCpidWYgPCAnMCcgJiYgKmJ1ZiA+ICcyJykKKyAgICBpZiAoKmJ1ZiA8ICcwJyB8fCAqYnVmID4gJzInKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIHJldHVybiBBVlBST0JFX1NDT1JFX01BWDsKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgIGlmICghYXN0IHx8ICF2c3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDgwMDA7CisgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA4MDAwOwogCiAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgaWYgKChyZXQgPSB2aXZvX2dldF9wYWNrZXRfaGVhZGVyKHMpKSA8IDApCkBAIC0xODIsMTUgKzE4MiwxNSBAQAogICAgICAgICAgICAgICAgIGlmICghc3RyY21wKGtleSwgIkR1cmF0aW9uIikpIHsKICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSB2YWx1ZV9pbnQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIldpZHRoIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdnN0LT5jb2RlYy0+d2lkdGggPSB2YWx1ZV9pbnQ7CisgICAgICAgICAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPndpZHRoID0gdmFsdWVfaW50OwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJIZWlnaHQiKSkgewotICAgICAgICAgICAgICAgICAgICB2c3QtPmNvZGVjLT5oZWlnaHQgPSB2YWx1ZV9pbnQ7CisgICAgICAgICAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmhlaWdodCA9IHZhbHVlX2ludDsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiVGltZVVuaXROdW1lcmF0b3IiKSkgewogICAgICAgICAgICAgICAgICAgICBmcHMubnVtID0gdmFsdWVfaW50IC8gMTAwMDsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiVGltZVVuaXREZW5vbWluYXRvciIpKSB7CiAgICAgICAgICAgICAgICAgICAgIGZwcy5kZW4gPSB2YWx1ZV9pbnQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIlNhbXBsaW5nRnJlcXVlbmN5IikpIHsKLSAgICAgICAgICAgICAgICAgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSB2YWx1ZV9pbnQ7CisgICAgICAgICAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gdmFsdWVfaW50OwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJOb21pbmFsQml0cmF0ZSIpKSB7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGtleSwgIkxlbmd0aCIpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgZmlsZQpAQCAtMjE2LDI3ICsyMTYsMjcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oYXN0LCA2NCwgMSwgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCA2NCwgZnBzLm51bSwgZnBzLmRlbik7CiAgICAgaWYgKGR1cmF0aW9uKQogICAgICAgICBzLT5kdXJhdGlvbiA9IGF2X3Jlc2NhbGUoZHVyYXRpb24sIDEwMDAsIDEpOwogCiAgICAgdnN0LT5zdGFydF90aW1lICAgICAgICA9IDA7Ci0gICAgdnN0LT5jb2RlYy0+Y29kZWNfdGFnICA9IDA7Ci0gICAgdnN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gMDsKKyAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwogCiAgICAgaWYgKHZpdm8tPnZlcnNpb24gPT0gMSkgewotICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0gyNjM7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRzcyM18xOwotICAgICAgICBhc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA4OwotICAgICAgICBhc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IDI0OwotICAgICAgICBhc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IDY0MDA7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfSDI2MzsKKyAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9HNzIzXzE7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDg7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMjQ7CisgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gNjQwMDsKICAgICB9CiAKICAgICBhc3QtPnN0YXJ0X3RpbWUgICAgICAgID0gMDsKLSAgICBhc3QtPmNvZGVjLT5jb2RlY190YWcgID0gMDsKLSAgICBhc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIGFzdC0+Y29kZWMtPmNoYW5uZWxzID0gMTsKKyAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgID0gMDsKKyAgICBhc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGFzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gMTsKIAogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdm9jX3BhY2tldC5jIGIvbGliYXZmb3JtYXQvdm9jX3BhY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMmUxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdmZvcm1hdC92b2NfcGFja2V0LmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAidm9jLmgiCisKK2ludAorZmZfdm9jX2dldF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBBVlN0cmVhbSAqc3QsIGludCBtYXhfc2l6ZSkKK3sKKyAgICBWb2NEZWNDb250ZXh0ICp2b2MgPSBzLT5wcml2X2RhdGE7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHN0LT5jb2RlY3BhcjsKKyAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKKyAgICBWb2NUeXBlIHR5cGU7CisgICAgaW50IHNpemUsIHRtcF9jb2RlYz0tMTsKKyAgICBpbnQgc2FtcGxlX3JhdGUgPSAwOworICAgIGludCBjaGFubmVscyA9IDE7CisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBpbnQgcmV0OworCisgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LAorICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3RlbGwocGIpLAorICAgICAgICAgICAgICAgICAgICAgICB2b2MtPnB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgdm9jLT5yZW1haW5pbmdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZJTkRFWF9LRVlGUkFNRSk7CisKKyAgICB3aGlsZSAoIXZvYy0+cmVtYWluaW5nX3NpemUpIHsKKyAgICAgICAgdHlwZSA9IGF2aW9fcjgocGIpOworICAgICAgICBpZiAodHlwZSA9PSBWT0NfVFlQRV9FT0YpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CisgICAgICAgIHZvYy0+cmVtYWluaW5nX3NpemUgPSBhdmlvX3JsMjQocGIpOworICAgICAgICBpZiAoIXZvYy0+cmVtYWluaW5nX3NpemUpIHsKKyAgICAgICAgICAgIGlmICghKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgdm9jLT5yZW1haW5pbmdfc2l6ZSA9IGF2aW9fc2l6ZShwYikgLSBhdmlvX3RlbGwocGIpOworICAgICAgICB9CisgICAgICAgIG1heF9zaXplIC09IDQ7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgIGNhc2UgVk9DX1RZUEVfVk9JQ0VfREFUQToKKyAgICAgICAgICAgIGlmICghcGFyLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICAgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgPSAxMDAwMDAwIC8gKDI1NiAtIGF2aW9fcjgocGIpKTsKKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlX3JhdGUpCisgICAgICAgICAgICAgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgPSBzYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICAgICAgcGFyLT5jaGFubmVscyA9IGNoYW5uZWxzOworICAgICAgICAgICAgICAgIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShwYXItPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgMSk7CisgICAgICAgICAgICB0bXBfY29kZWMgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIHZvYy0+cmVtYWluaW5nX3NpemUgLT0gMjsKKyAgICAgICAgICAgIG1heF9zaXplIC09IDI7CisgICAgICAgICAgICBjaGFubmVscyA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIFZPQ19UWVBFX1ZPSUNFX0RBVEFfQ09OVDoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgVk9DX1RZUEVfRVhURU5ERUQ6CisgICAgICAgICAgICBzYW1wbGVfcmF0ZSA9IGF2aW9fcmwxNihwYik7CisgICAgICAgICAgICBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIGNoYW5uZWxzID0gYXZpb19yOChwYikgKyAxOworICAgICAgICAgICAgc2FtcGxlX3JhdGUgPSAyNTYwMDAwMDAgLyAoY2hhbm5lbHMgKiAoNjU1MzYgLSBzYW1wbGVfcmF0ZSkpOworICAgICAgICAgICAgdm9jLT5yZW1haW5pbmdfc2l6ZSA9IDA7CisgICAgICAgICAgICBtYXhfc2l6ZSAtPSA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBWT0NfVFlQRV9ORVdfVk9JQ0VfREFUQToKKyAgICAgICAgICAgIGlmICghcGFyLT5zYW1wbGVfcmF0ZSkgeworICAgICAgICAgICAgICAgIHBhci0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocGIpOworICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBwYXItPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2aW9fcjgocGIpOworICAgICAgICAgICAgICAgIHBhci0+Y2hhbm5lbHMgPSBhdmlvX3I4KHBiKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgNik7CisgICAgICAgICAgICB0bXBfY29kZWMgPSBhdmlvX3JsMTYocGIpOworICAgICAgICAgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICAgICAgICAgIHZvYy0+cmVtYWluaW5nX3NpemUgLT0gMTI7CisgICAgICAgICAgICBtYXhfc2l6ZSAtPSAxMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIHZvYy0+cmVtYWluaW5nX3NpemUpOworICAgICAgICAgICAgbWF4X3NpemUgLT0gdm9jLT5yZW1haW5pbmdfc2l6ZTsKKyAgICAgICAgICAgIHZvYy0+cmVtYWluaW5nX3NpemUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFyLT5zYW1wbGVfcmF0ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIHNhbXBsZSByYXRlICVkXG4iLCBwYXItPnNhbXBsZV9yYXRlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgfQorCisgICAgaWYgKHRtcF9jb2RlYyA+PSAwKSB7CisgICAgICAgIHRtcF9jb2RlYyA9IGZmX2NvZGVjX2dldF9pZChmZl92b2NfY29kZWNfdGFncywgdG1wX2NvZGVjKTsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgICAgIHBhci0+Y29kZWNfaWQgPSB0bXBfY29kZWM7CisgICAgICAgIGVsc2UgaWYgKHBhci0+Y29kZWNfaWQgIT0gdG1wX2NvZGVjKQorICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiSWdub3JpbmcgbWlkLXN0cmVhbSBjaGFuZ2UgaW4gYXVkaW8gY29kZWNcbiIpOworICAgICAgICBpZiAocGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKSB7CisgICAgICAgICAgICBpZiAocy0+YXVkaW9fY29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGNvZGVjIHRhZ1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gY29kZWMgdGFnXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBhci0+Yml0X3JhdGUgPSAoaW50NjRfdClwYXItPnNhbXBsZV9yYXRlICogcGFyLT5jaGFubmVscyAqIHBhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlOworCisgICAgaWYgKG1heF9zaXplIDw9IDApCisgICAgICAgIG1heF9zaXplID0gMjA0ODsKKyAgICBzaXplID0gRkZNSU4odm9jLT5yZW1haW5pbmdfc2l6ZSwgbWF4X3NpemUpOworICAgIHZvYy0+cmVtYWluaW5nX3NpemUgLT0gc2l6ZTsKKworICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsIHBrdCwgc2l6ZSk7CisgICAgcGt0LT5kdHMgPSBwa3QtPnB0cyA9IHZvYy0+cHRzOworCisgICAgZHVyYXRpb24gPSBhdl9nZXRfYXVkaW9fZnJhbWVfZHVyYXRpb24yKHN0LT5jb2RlY3Bhciwgc2l6ZSk7CisgICAgaWYgKGR1cmF0aW9uID4gMCAmJiB2b2MtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKKyAgICAgICAgdm9jLT5wdHMgKz0gZHVyYXRpb247CisgICAgZWxzZQorICAgICAgICB2b2MtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3ZvY2RlYy5jIGIvbGliYXZmb3JtYXQvdm9jZGVjLmMKaW5kZXggNzBmYTAwOS4uMTBkZjI4YiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvdm9jZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvdm9jZGVjLmMKQEAgLTIzLDEyNCArMjMsNiBAQAogI2luY2x1ZGUgInZvYy5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKLWludAotZmZfdm9jX2dldF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0LCBBVlN0cmVhbSAqc3QsIGludCBtYXhfc2l6ZSkKLXsKLSAgICBWb2NEZWNDb250ZXh0ICp2b2MgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmRlYyA9IHN0LT5jb2RlYzsKLSAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKLSAgICBWb2NUeXBlIHR5cGU7Ci0gICAgaW50IHNpemUsIHRtcF9jb2RlYz0tMTsKLSAgICBpbnQgc2FtcGxlX3JhdGUgPSAwOwotICAgIGludCBjaGFubmVscyA9IDE7Ci0gICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICBpbnQgcmV0OwotCi0gICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LAotICAgICAgICAgICAgICAgICAgICAgICBhdmlvX3RlbGwocGIpLAotICAgICAgICAgICAgICAgICAgICAgICB2b2MtPnB0cywKLSAgICAgICAgICAgICAgICAgICAgICAgdm9jLT5yZW1haW5pbmdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgQVZJTkRFWF9LRVlGUkFNRSk7Ci0KLSAgICB3aGlsZSAoIXZvYy0+cmVtYWluaW5nX3NpemUpIHsKLSAgICAgICAgdHlwZSA9IGF2aW9fcjgocGIpOwotICAgICAgICBpZiAodHlwZSA9PSBWT0NfVFlQRV9FT0YpCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7Ci0gICAgICAgIHZvYy0+cmVtYWluaW5nX3NpemUgPSBhdmlvX3JsMjQocGIpOwotICAgICAgICBpZiAoIXZvYy0+cmVtYWluaW5nX3NpemUpIHsKLSAgICAgICAgICAgIGlmICghcy0+cGItPnNlZWthYmxlKQotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7Ci0gICAgICAgICAgICB2b2MtPnJlbWFpbmluZ19zaXplID0gYXZpb19zaXplKHBiKSAtIGF2aW9fdGVsbChwYik7Ci0gICAgICAgIH0KLSAgICAgICAgbWF4X3NpemUgLT0gNDsKLQotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBWT0NfVFlQRV9WT0lDRV9EQVRBOgotICAgICAgICAgICAgaWYgKCFkZWMtPnNhbXBsZV9yYXRlKSB7Ci0gICAgICAgICAgICAgICAgZGVjLT5zYW1wbGVfcmF0ZSA9IDEwMDAwMDAgLyAoMjU2IC0gYXZpb19yOChwYikpOwotICAgICAgICAgICAgICAgIGlmIChzYW1wbGVfcmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgZGVjLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBkZWMtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICAgICAgICBkZWMtPmNoYW5uZWxzID0gY2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSBhdl9nZXRfYml0c19wZXJfc2FtcGxlKGRlYy0+Y29kZWNfaWQpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCAxKTsKLSAgICAgICAgICAgIHRtcF9jb2RlYyA9IGF2aW9fcjgocGIpOwotICAgICAgICAgICAgdm9jLT5yZW1haW5pbmdfc2l6ZSAtPSAyOwotICAgICAgICAgICAgbWF4X3NpemUgLT0gMjsKLSAgICAgICAgICAgIGNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVk9DX1RZUEVfVk9JQ0VfREFUQV9DT05UOgotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBWT0NfVFlQRV9FWFRFTkRFRDoKLSAgICAgICAgICAgIHNhbXBsZV9yYXRlID0gYXZpb19ybDE2KHBiKTsKLSAgICAgICAgICAgIGF2aW9fcjgocGIpOwotICAgICAgICAgICAgY2hhbm5lbHMgPSBhdmlvX3I4KHBiKSArIDE7Ci0gICAgICAgICAgICBzYW1wbGVfcmF0ZSA9IDI1NjAwMDAwMCAvIChjaGFubmVscyAqICg2NTUzNiAtIHNhbXBsZV9yYXRlKSk7Ci0gICAgICAgICAgICB2b2MtPnJlbWFpbmluZ19zaXplID0gMDsKLSAgICAgICAgICAgIG1heF9zaXplIC09IDQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFZPQ19UWVBFX05FV19WT0lDRV9EQVRBOgotICAgICAgICAgICAgaWYgKCFkZWMtPnNhbXBsZV9yYXRlKSB7Ci0gICAgICAgICAgICAgICAgZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihwYik7Ci0gICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIGRlYy0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgICAgIGRlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZpb19yOChwYik7Ci0gICAgICAgICAgICAgICAgZGVjLT5jaGFubmVscyA9IGF2aW9fcjgocGIpOwotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICAgICAgYXZpb19za2lwKHBiLCA2KTsKLSAgICAgICAgICAgIHRtcF9jb2RlYyA9IGF2aW9fcmwxNihwYik7Ci0gICAgICAgICAgICBhdmlvX3NraXAocGIsIDQpOwotICAgICAgICAgICAgdm9jLT5yZW1haW5pbmdfc2l6ZSAtPSAxMjsKLSAgICAgICAgICAgIG1heF9zaXplIC09IDEyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgdm9jLT5yZW1haW5pbmdfc2l6ZSk7Ci0gICAgICAgICAgICBtYXhfc2l6ZSAtPSB2b2MtPnJlbWFpbmluZ19zaXplOwotICAgICAgICAgICAgdm9jLT5yZW1haW5pbmdfc2l6ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh0bXBfY29kZWMgPj0gMCkgewotICAgICAgICB0bXBfY29kZWMgPSBmZl9jb2RlY19nZXRfaWQoZmZfdm9jX2NvZGVjX3RhZ3MsIHRtcF9jb2RlYyk7Ci0gICAgICAgIGlmIChkZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpCi0gICAgICAgICAgICBkZWMtPmNvZGVjX2lkID0gdG1wX2NvZGVjOwotICAgICAgICBlbHNlIGlmIChkZWMtPmNvZGVjX2lkICE9IHRtcF9jb2RlYykKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIklnbm9yaW5nIG1pZC1zdHJlYW0gY2hhbmdlIGluIGF1ZGlvIGNvZGVjXG4iKTsKLSAgICAgICAgaWYgKGRlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkgewotICAgICAgICAgICAgaWYgKHMtPmF1ZGlvX2NvZGVjX2lkID09IEFWX0NPREVDX0lEX05PTkUpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5rbm93biBjb2RlYyB0YWdcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJ1bmtub3duIGNvZGVjIHRhZ1xuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZWMtPmJpdF9yYXRlID0gZGVjLT5zYW1wbGVfcmF0ZSAqIGRlYy0+Y2hhbm5lbHMgKiBkZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKLQotICAgIGlmIChtYXhfc2l6ZSA8PSAwKQotICAgICAgICBtYXhfc2l6ZSA9IDIwNDg7Ci0gICAgc2l6ZSA9IEZGTUlOKHZvYy0+cmVtYWluaW5nX3NpemUsIG1heF9zaXplKTsKLSAgICB2b2MtPnJlbWFpbmluZ19zaXplIC09IHNpemU7Ci0KLSAgICByZXQgPSBhdl9nZXRfcGFja2V0KHBiLCBwa3QsIHNpemUpOwotICAgIHBrdC0+ZHRzID0gcGt0LT5wdHMgPSB2b2MtPnB0czsKLQotICAgIGR1cmF0aW9uID0gYXZfZ2V0X2F1ZGlvX2ZyYW1lX2R1cmF0aW9uKHN0LT5jb2RlYywgc2l6ZSk7Ci0gICAgaWYgKGR1cmF0aW9uID4gMCAmJiB2b2MtPnB0cyAhPSBBVl9OT1BUU19WQUxVRSkKLSAgICAgICAgdm9jLT5wdHMgKz0gZHVyYXRpb247Ci0gICAgZWxzZQotICAgICAgICB2b2MtPnB0cyA9IEFWX05PUFRTX1ZBTFVFOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotI2lmIENPTkZJR19WT0NfREVNVVhFUgogc3RhdGljIGludCB2b2NfcHJvYmUoQVZQcm9iZURhdGEgKnApCiB7CiAgICAgaW50IHZlcnNpb24sIGNoZWNrOwpAQCAtMTYwLDcgKzQyLDYgQEAKICAgICBWb2NEZWNDb250ZXh0ICp2b2MgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CiAgICAgaW50IGhlYWRlcl9zaXplOwotICAgIEFWU3RyZWFtICpzdDsKIAogICAgIGF2aW9fc2tpcChwYiwgMjApOwogICAgIGhlYWRlcl9zaXplID0gYXZpb19ybDE2KHBiKSAtIDIyOwpAQCAtMTY5LDEwICs1MCw4IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CiAgICAgfQogICAgIGF2aW9fc2tpcChwYiwgaGVhZGVyX3NpemUpOwotICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKLSAgICBpZiAoIXN0KQotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKworICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsKIAogICAgIHZvYy0+cmVtYWluaW5nX3NpemUgPSAwOwogICAgIHJldHVybiAwOwpAQCAtMTgwLDYgKzU5LDEyIEBACiAKIHN0YXRpYyBpbnQgdm9jX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKKyAgICBpZiAoIXMtPm5iX3N0cmVhbXMpIHsKKyAgICAgICAgQVZTdHJlYW0gKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzdCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICB9CiAgICAgcmV0dXJuIGZmX3ZvY19nZXRfcGFja2V0KHMsIHBrdCwgcy0+c3RyZWFtc1swXSwgMCk7CiB9CiAKQEAgLTE4Nyw4ICs3MiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmxhZ3MpCiB7CiAgICAgVm9jRGVjQ29udGV4dCAqdm9jID0gcy0+cHJpdl9kYXRhOwotICAgIEFWU3RyZWFtICpzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKLSAgICBpbnQgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCB0aW1lc3RhbXAsIGZsYWdzKTsKKyAgICBBVlN0cmVhbSAqc3Q7CisgICAgaW50IGluZGV4OworCisgICAgaWYgKHMtPm5iX3N0cmVhbXMgPCAxKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJjYW5ub3Qgc2VlayB3aGlsZSBubyBzdHJlYW0gd2FzIGZvdW5kIHlldFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgc3QgPSBzLT5zdHJlYW1zW3N0cmVhbV9pbmRleF07CisgICAgaW5kZXggPSBhdl9pbmRleF9zZWFyY2hfdGltZXN0YW1wKHN0LCB0aW1lc3RhbXAsIGZsYWdzKTsKIAogICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgc3QtPm5iX2luZGV4X2VudHJpZXMgLSAxKSB7CiAgICAgICAgIEFWSW5kZXhFbnRyeSAqZSA9ICZzdC0+aW5kZXhfZW50cmllc1tpbmRleF07CkBAIC0yMTUsNCArMTA4LDMgQEAKICAgICAucmVhZF9zZWVrICAgICAgPSB2b2NfcmVhZF9zZWVrLAogICAgIC5jb2RlY190YWcgICAgICA9IChjb25zdCBBVkNvZGVjVGFnKiBjb25zdCBbXSl7IGZmX3ZvY19jb2RlY190YWdzLCAwIH0sCiB9OwotI2VuZGlmIC8qIENPTkZJR19WT0NfREVNVVhFUiAqLwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdm9jZW5jLmMgYi9saWJhdmZvcm1hdC92b2NlbmMuYwppbmRleCAwYmI1MzJlLi4zMjFiMTEzIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC92b2NlbmMuYworKysgYi9saWJhdmZvcm1hdC92b2NlbmMuYwpAQCAtMzAsMTUgKzMwLDE1IEBACiBzdGF0aWMgaW50IHZvY193cml0ZV9oZWFkZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgY29uc3QgaW50IGhlYWRlcl9zaXplID0gMjY7CiAgICAgY29uc3QgaW50IHZlcnNpb24gPSAweDAxMTQ7CiAKICAgICBpZiAocy0+bmJfc3RyZWFtcyAhPSAxCi0gICAgICAgIHx8IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgfHwgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgIT0gQVZNRURJQV9UWVBFX0FVRElPKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAKLSAgICBpZiAoIWVuYy0+Y29kZWNfdGFnICYmIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1U4KSB7CisgICAgaWYgKCFwYXItPmNvZGVjX3RhZyAmJiBwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1BDTV9VOCkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY29kZWNcbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KQEAgLTU0LDMwICs1NCwzMCBAQAogc3RhdGljIGludCB2b2Nfd3JpdGVfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKICAgICBWb2NFbmNDb250ZXh0ICp2b2MgPSBzLT5wcml2X2RhdGE7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmVuYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKIAogICAgIGlmICghdm9jLT5wYXJhbV93cml0dGVuKSB7Ci0gICAgICAgIGlmIChlbmMtPmNvZGVjX3RhZyA+IDMpIHsKKyAgICAgICAgaWYgKHBhci0+Y29kZWNfdGFnID4gMykgewogICAgICAgICAgICAgYXZpb193OChwYiwgVk9DX1RZUEVfTkVXX1ZPSUNFX0RBVEEpOwogICAgICAgICAgICAgYXZpb193bDI0KHBiLCBwa3QtPnNpemUgKyAxMik7Ci0gICAgICAgICAgICBhdmlvX3dsMzIocGIsIGVuYy0+c2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOwotICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5jaGFubmVscyk7Ci0gICAgICAgICAgICBhdmlvX3dsMTYocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgIGF2aW9fd2wzMihwYiwgcGFyLT5zYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCBwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICBhdmlvX3c4KHBiLCBwYXItPmNoYW5uZWxzKTsKKyAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgcGFyLT5jb2RlY190YWcpOwogICAgICAgICAgICAgYXZpb193bDMyKHBiLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y2hhbm5lbHMgPiAxKSB7CisgICAgICAgICAgICBpZiAocy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNoYW5uZWxzID4gMSkgewogICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIFZPQ19UWVBFX0VYVEVOREVEKTsKICAgICAgICAgICAgICAgICBhdmlvX3dsMjQocGIsIDQpOwotICAgICAgICAgICAgICAgIGF2aW9fd2wxNihwYiwgNjU1MzYtKDI1NjAwMDAwMCArIGVuYy0+c2FtcGxlX3JhdGUqZW5jLT5jaGFubmVscy8yKS8oZW5jLT5zYW1wbGVfcmF0ZSplbmMtPmNoYW5uZWxzKSk7Ci0gICAgICAgICAgICAgICAgYXZpb193OChwYiwgZW5jLT5jb2RlY190YWcpOwotICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIGVuYy0+Y2hhbm5lbHMgLSAxKTsKKyAgICAgICAgICAgICAgICBhdmlvX3dsMTYocGIsIDY1NTM2LSgyNTYwMDAwMDAgKyBwYXItPnNhbXBsZV9yYXRlKnBhci0+Y2hhbm5lbHMvMikvKHBhci0+c2FtcGxlX3JhdGUqcGFyLT5jaGFubmVscykpOworICAgICAgICAgICAgICAgIGF2aW9fdzgocGIsIHBhci0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgICAgICBhdmlvX3c4KHBiLCBwYXItPmNoYW5uZWxzIC0gMSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdmlvX3c4KHBiLCBWT0NfVFlQRV9WT0lDRV9EQVRBKTsKICAgICAgICAgICAgIGF2aW9fd2wyNChwYiwgcGt0LT5zaXplICsgMik7Ci0gICAgICAgICAgICBhdmlvX3c4KHBiLCAyNTYgLSAoMTAwMDAwMCArIGVuYy0+c2FtcGxlX3JhdGUvMikgLyBlbmMtPnNhbXBsZV9yYXRlKTsKLSAgICAgICAgICAgIGF2aW9fdzgocGIsIGVuYy0+Y29kZWNfdGFnKTsKKyAgICAgICAgICAgIGF2aW9fdzgocGIsIDI1NiAtICgxMDAwMDAwICsgcGFyLT5zYW1wbGVfcmF0ZS8yKSAvIHBhci0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZpb193OChwYiwgcGFyLT5jb2RlY190YWcpOwogICAgICAgICB9CiAgICAgICAgIHZvYy0+cGFyYW1fd3JpdHRlbiA9IDE7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3ZwY2MuYyBiL2xpYmF2Zm9ybWF0L3ZwY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjA4ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvdnBjYy5jCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEdvb2dsZSBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgS29uZ1F1biBZYW5nIChrcXlhbmdAZ29vZ2xlLmNvbSkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgorI2luY2x1ZGUgInZwY2MuaCIKKworZW51bSBWUFhfQ0hST01BX1NVQlNBTVBMSU5HCit7CisgICAgVlBYX1NVQlNBTVBMSU5HXzQyMF9WRVJUSUNBTCA9IDAsCisgICAgVlBYX1NVQlNBTVBMSU5HXzQyMF9DT0xMT0NBVEVEX1dJVEhfTFVNQSA9IDEsCisgICAgVlBYX1NVQlNBTVBMSU5HXzQyMiA9IDIsCisgICAgVlBYX1NVQlNBTVBMSU5HXzQ0NCA9IDMsCit9OworCitzdGF0aWMgaW50IGdldF92cHhfY2hyb21hX3N1YnNhbXBsaW5nKEFWRm9ybWF0Q29udGV4dCAqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkNocm9tYUxvY2F0aW9uIGNocm9tYV9sb2NhdGlvbikKK3sKKyAgICBpbnQgY2hyb21hX3csIGNocm9tYV9oOworICAgIGlmIChhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShwaXhlbF9mb3JtYXQsICZjaHJvbWFfdywgJmNocm9tYV9oKSA9PSAwKSB7CisgICAgICAgIGlmIChjaHJvbWFfdyA9PSAxICYmIGNocm9tYV9oID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiAoY2hyb21hX2xvY2F0aW9uID09IEFWQ0hST01BX0xPQ19MRUZUKQorICAgICAgICAgICAgICAgICAgICAgICA/IFZQWF9TVUJTQU1QTElOR180MjBfVkVSVElDQUwKKyAgICAgICAgICAgICAgICAgICAgICAgOiBWUFhfU1VCU0FNUExJTkdfNDIwX0NPTExPQ0FURURfV0lUSF9MVU1BOworICAgICAgICB9IGVsc2UgaWYgKGNocm9tYV93ID09IDEgJiYgY2hyb21hX2ggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFZQWF9TVUJTQU1QTElOR180MjI7CisgICAgICAgIH0gZWxzZSBpZiAoY2hyb21hX3cgPT0gMCAmJiBjaHJvbWFfaCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gVlBYX1NVQlNBTVBMSU5HXzQ0NDsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0ICglZClcbiIsIHBpeGVsX2Zvcm1hdCk7CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGdldF9iaXRfZGVwdGgoQVZGb3JtYXRDb250ZXh0ICpzLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4ZWxfZm9ybWF0KQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4ZWxfZm9ybWF0KTsKKyAgICBpZiAoZGVzYyA9PSBOVUxMKSB7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQgKCVkKVxuIiwKKyAgICAgICAgICAgICAgIHBpeGVsX2Zvcm1hdCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIGRlc2MtPmNvbXBbMF0uZGVwdGg7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3ZweF92aWRlb19mdWxsX3JhbmdlX2ZsYWcoZW51bSBBVkNvbG9yUmFuZ2UgY29sb3JfcmFuZ2UpCit7CisgICAgcmV0dXJuIGNvbG9yX3JhbmdlID09IEFWQ09MX1JBTkdFX0pQRUc7Cit9CisKK2ludCBmZl9pc29tX3dyaXRlX3ZwY2MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpCit7CisgICAgaW50IHByb2ZpbGUgPSBwYXItPnByb2ZpbGU7CisgICAgaW50IGxldmVsID0gcGFyLT5sZXZlbCA9PSBGRl9MRVZFTF9VTktOT1dOID8gMCA6IHBhci0+bGV2ZWw7CisgICAgaW50IGJpdF9kZXB0aCA9IGdldF9iaXRfZGVwdGgocywgcGFyLT5mb3JtYXQpOworICAgIGludCB2cHhfY2hyb21hX3N1YnNhbXBsaW5nID0KKyAgICAgICAgZ2V0X3ZweF9jaHJvbWFfc3Vic2FtcGxpbmcocywgcGFyLT5mb3JtYXQsIHBhci0+Y2hyb21hX2xvY2F0aW9uKTsKKyAgICBpbnQgdnB4X3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyA9CisgICAgICAgIGdldF92cHhfdmlkZW9fZnVsbF9yYW5nZV9mbGFnKHBhci0+Y29sb3JfcmFuZ2UpOworCisgICAgaWYgKGJpdF9kZXB0aCA8IDAgfHwgdnB4X2Nocm9tYV9zdWJzYW1wbGluZyA8IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOworCisgICAgaWYgKHByb2ZpbGUgPT0gRkZfUFJPRklMRV9VTktOT1dOKSB7CisgICAgICAgIGlmICh2cHhfY2hyb21hX3N1YnNhbXBsaW5nID09IFZQWF9TVUJTQU1QTElOR180MjBfVkVSVElDQUwgfHwKKyAgICAgICAgICAgIHZweF9jaHJvbWFfc3Vic2FtcGxpbmcgPT0gVlBYX1NVQlNBTVBMSU5HXzQyMF9DT0xMT0NBVEVEX1dJVEhfTFVNQSkgeworICAgICAgICAgICAgcHJvZmlsZSA9IChiaXRfZGVwdGggPT0gOCkgPyBGRl9QUk9GSUxFX1ZQOV8wIDogRkZfUFJPRklMRV9WUDlfMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2ZpbGUgPSAoYml0X2RlcHRoID09IDgpID8gRkZfUFJPRklMRV9WUDlfMSA6IEZGX1BST0ZJTEVfVlA5XzM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdmlvX3c4KHBiLCBwcm9maWxlKTsKKyAgICBhdmlvX3c4KHBiLCBsZXZlbCk7CisgICAgYXZpb193OChwYiwgKGJpdF9kZXB0aCA8PCA0KSB8ICh2cHhfY2hyb21hX3N1YnNhbXBsaW5nIDw8IDEpIHwgdnB4X3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZyk7CisgICAgYXZpb193OChwYiwgcGFyLT5jb2xvcl9wcmltYXJpZXMpOworICAgIGF2aW9fdzgocGIsIHBhci0+Y29sb3JfdHJjKTsKKyAgICBhdmlvX3c4KHBiLCBwYXItPmNvbG9yX3NwYWNlKTsKKworICAgIC8vIHZwOSBkb2VzIG5vdCBoYXZlIGNvZGVjIGluaXRpYWxpemF0aW9uIGRhdGEuCisgICAgYXZpb193YjE2KHBiLCAwKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3ZwY2MuaCBiL2xpYmF2Zm9ybWF0L3ZwY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODRlODU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmb3JtYXQvdnBjYy5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgR29vZ2xlIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxNiBLb25nUXVuIFlhbmcgKGtxeWFuZ0Bnb29nbGUuY29tKQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKioKKyAqIEBmaWxlCisgKiBpbnRlcm5hbCBoZWFkZXIgZm9yIFZQeCBjb2RlYyBjb25maWd1cmF0aW9uIHV0aWxpdGllcy4KKyAqLworCisjaWZuZGVmIEFWRk9STUFUX1ZQQ0NfSAorI2RlZmluZSBBVkZPUk1BVF9WUENDX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImF2aW8uaCIKKyNpbmNsdWRlICJhdmZvcm1hdC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorCisvKioKKyAqIFdyaXRlcyBWUCBjb2RlYyBjb25maWd1cmF0aW9uIHRvIHRoZSBwcm92aWRlZCBBVklPQ29udGV4dC4KKyAqCisgKiBAcGFyYW0gcyBhZGRyZXNzIG9mIHRoZSBBVkZvcm1hdENvbnRleHQgZm9yIHRoZSBsb2dnaW5nIGNvbnRleHQuCisgKiBAcGFyYW0gcGIgYWRkcmVzcyBvZiB0aGUgQVZJT0NvbnRleHQgd2hlcmUgdGhlIHZwY0Mgc2hhbGwgYmUgd3JpdHRlbi4KKyAqIEBwYXJhbSBwYXIgYWRkcmVzcyBvZiB0aGUgQVZDb2RlY1BhcmFtZXRlcnMgd2hpY2ggY29udGFpbnMgY29kZWMgaW5mb3JtYXRpb24uCisgKiBAcmV0dXJuID49MCBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiBBVkVSUk9SCisgKiAgICAgICAgIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCisgKi8KK2ludCBmZl9pc29tX3dyaXRlX3ZwY2MoQVZGb3JtYXRDb250ZXh0ICpzLCBBVklPQ29udGV4dCAqcGIsCisgICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIpOworCisjZW5kaWYgLyogQVZGT1JNQVRfVlBDQ19IICovCmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC92cGsuYyBiL2xpYmF2Zm9ybWF0L3Zway5jCmluZGV4IDc1MTkwNDkuLmJiOWVhYmIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3Zway5jCisrKyBiL2xpYmF2Zm9ybWF0L3Zway5jCkBAIC01Miw0MSArNTIsNDEgQEAKICAgICBhdmlvX3NraXAocy0+cGIsIDQpOwogICAgIHN0LT5kdXJhdGlvbiAgICAgICAgICAgPSBhdmlvX3JsMzIocy0+cGIpICogMjggLyAxNjsKICAgICBvZmZzZXQgICAgICAgICAgICAgICAgID0gYXZpb19ybDMyKHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9QU1g7Ci0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgaWYgKHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPD0gMCkKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9QU1g7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmwzMihzLT5wYik7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y2hhbm5lbHMgPD0gMCkKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gYXZpb19ybDMyKHMtPnBiKTsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA8PSAwKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKLSAgICBzYW1wbGVzX3Blcl9ibG9jayAgICAgID0gKChzdC0+Y29kZWMtPmJsb2NrX2FsaWduIC8gc3QtPmNvZGVjLT5jaGFubmVscykgKiAyOCkgLyAxNjsKKyAgICBzYW1wbGVzX3Blcl9ibG9jayAgICAgID0gKChzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduIC8gc3QtPmNvZGVjcGFyLT5jaGFubmVscykgKiAyOCkgLyAxNjsKICAgICBpZiAoc2FtcGxlc19wZXJfYmxvY2sgPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgdnBrLT5ibG9ja19jb3VudCAgICAgICA9IChzdC0+ZHVyYXRpb24gKyAoc2FtcGxlc19wZXJfYmxvY2sgLSAxKSkgLyBzYW1wbGVzX3Blcl9ibG9jazsKLSAgICB2cGstPmxhc3RfYmxvY2tfc2l6ZSAgID0gKHN0LT5kdXJhdGlvbiAlIHNhbXBsZXNfcGVyX2Jsb2NrKSAqIDE2ICogc3QtPmNvZGVjLT5jaGFubmVscyAvIDI4OworICAgIHZway0+bGFzdF9ibG9ja19zaXplICAgPSAoc3QtPmR1cmF0aW9uICUgc2FtcGxlc19wZXJfYmxvY2spICogMTYgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzIC8gMjg7CiAgICAgYXZpb19za2lwKHMtPnBiLCBvZmZzZXQgLSBhdmlvX3RlbGwocy0+cGIpKTsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgdnBrX3JlYWRfcGFja2V0KEFWRm9ybWF0Q29udGV4dCAqcywgQVZQYWNrZXQgKnBrdCkKIHsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgVlBLRGVtdXhDb250ZXh0ICp2cGsgPSBzLT5wcml2X2RhdGE7CiAgICAgaW50IHJldCwgaTsKIAogICAgIHZway0+Y3VycmVudF9ibG9jaysrOwogICAgIGlmICh2cGstPmN1cnJlbnRfYmxvY2sgPT0gdnBrLT5ibG9ja19jb3VudCkgewotICAgICAgICB1bnNpZ25lZCBzaXplID0gdnBrLT5sYXN0X2Jsb2NrX3NpemUgLyBjb2RlYy0+Y2hhbm5lbHM7Ci0gICAgICAgIHVuc2lnbmVkIHNraXAgPSAoY29kZWMtPmJsb2NrX2FsaWduIC0gdnBrLT5sYXN0X2Jsb2NrX3NpemUpIC8gY29kZWMtPmNoYW5uZWxzOworICAgICAgICB1bnNpZ25lZCBzaXplID0gdnBrLT5sYXN0X2Jsb2NrX3NpemUgLyBwYXItPmNoYW5uZWxzOworICAgICAgICB1bnNpZ25lZCBza2lwID0gKHBhci0+YmxvY2tfYWxpZ24gLSB2cGstPmxhc3RfYmxvY2tfc2l6ZSkgLyBwYXItPmNoYW5uZWxzOwogCiAgICAgICAgIHJldCA9IGF2X25ld19wYWNrZXQocGt0LCB2cGstPmxhc3RfYmxvY2tfc2l6ZSk7CiAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvZGVjLT5jaGFubmVsczsgaSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXItPmNoYW5uZWxzOyBpKyspIHsKICAgICAgICAgICAgIHJldCA9IGF2aW9fcmVhZChzLT5wYiwgcGt0LT5kYXRhICsgaSAqIHNpemUsIHNpemUpOwogICAgICAgICAgICAgYXZpb19za2lwKHMtPnBiLCBza2lwKTsKICAgICAgICAgICAgIGlmIChyZXQgIT0gc2l6ZSkgewpAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICB9CiAgICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0gMDsKICAgICB9IGVsc2UgaWYgKHZway0+Y3VycmVudF9ibG9jayA8IHZway0+YmxvY2tfY291bnQpIHsKLSAgICAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChzLT5wYiwgcGt0LCBjb2RlYy0+YmxvY2tfYWxpZ24pOworICAgICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHBhci0+YmxvY2tfYWxpZ24pOwogICAgICAgICBwa3QtPnN0cmVhbV9pbmRleCA9IDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfRU9GOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdnBsYXllcmRlYy5jIGIvbGliYXZmb3JtYXQvdnBsYXllcmRlYy5jCmluZGV4IDg2MGI3NzguLjQ5OTQzZDAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3ZwbGF5ZXJkZWMuYworKysgYi9saWJhdmZvcm1hdC92cGxheWVyZGVjLmMKQEAgLTM2LDcgKzM2LDggQEAKICAgICBjaGFyIGM7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcHRyID0gcC0+YnVmOwogCi0gICAgaWYgKHNzY2FuZihwdHIsICIlKmQ6JSpkOiUqZC4lKmQlYyIsICZjKSA9PSAxICYmIHN0cmNocigiOiA9IiwgYykpCisgICAgaWYgKChzc2NhbmYocHRyLCAiJSozZDolKjJkOiUqMmQuJSoyZCVjIiwgJmMpID09IDEgfHwKKyAgICAgICAgIHNzY2FuZihwdHIsICIlKjNkOiUqMmQ6JSoyZCVjIiwgICAgICAmYykgPT0gMSkgJiYgc3RyY2hyKCI6ID0iLCBjKSkKICAgICAgICAgcmV0dXJuIEFWUFJPQkVfU0NPUkVfTUFYOwogICAgIHJldHVybiAwOwogfQpAQCAtNDQsMTIgKzQ1LDEyIEBACiBzdGF0aWMgaW50NjRfdCByZWFkX3RzKGNoYXIgKipsaW5lKQogewogICAgIGNoYXIgYzsKLSAgICBpbnQgaGgsIG1tLCBzcywgbXMsIGxlbjsKKyAgICBpbnQgaGgsIG1tLCBzcywgbXMsIG4sIGxlbjsKIAotICAgIGlmIChzc2NhbmYoKmxpbmUsICIlZDolZDolZC4lZCVjJW4iLAotICAgICAgICAgICAgICAgJmhoLCAmbW0sICZzcywgJm1zLCAmYywgJmxlbikgPj0gNSkgeworICAgIGlmICgoKG4gPSBzc2NhbmYoKmxpbmUsICIlZDolZDolZC4lZCVjJW4iLCAmaGgsICZtbSwgJnNzLCAmbXMsICZjLCAmbGVuKSkgPj0gNSB8fAorICAgICAgICAgKG4gPSBzc2NhbmYoKmxpbmUsICIlZDolZDolZCVjJW4iLCAgICAmaGgsICZtbSwgJnNzLCAgICAgICZjLCAmbGVuKSkgPj0gNCkgJiYgc3RyY2hyKCI6ID0iLCBjKSkgewogICAgICAgICAqbGluZSArPSBsZW47Ci0gICAgICAgIHJldHVybiAoaGgqMzYwMExMICsgbW0qNjBMTCArIHNzKSAqIDEwMExMICsgbXM7CisgICAgICAgIHJldHVybiAoaGgqMzYwMExMICsgbW0qNjBMTCArIHNzKSAqIDEwMExMICsgKG4gPCA1ID8gMCA6IG1zKTsKICAgICB9CiAgICAgcmV0dXJuIEFWX05PUFRTX1ZBTFVFOwogfQpAQCAtNjIsOCArNjMsOCBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIDEwMCk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1ZQTEFZRVI7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1NVQlRJVExFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1ZQTEFZRVI7CiAKICAgICB3aGlsZSAoIWF2aW9fZmVvZihzLT5wYikpIHsKICAgICAgICAgY2hhciBsaW5lWzQwOTZdOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvdnFmLmMgYi9saWJhdmZvcm1hdC92cWYuYwppbmRleCAzYzg5N2UxLi5kMDBmYTVlIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC92cWYuYworKysgYi9saWJhdmZvcm1hdC92cWYuYwpAQCAtMTA3LDggKzEwNyw4IEBACiAKICAgICBoZWFkZXJfc2l6ZSA9IGF2aW9fcmIzMihzLT5wYik7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfVFdJTlZROworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9UV0lOVlE7CiAgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOwogCiAgICAgZG8gewpAQCAtMTMwLDE3ICsxMzAsMTcgQEAKICAgICAgICAgc3dpdGNoKGNodW5rX3RhZyl7CiAgICAgICAgIGNhc2UgTUtUQUcoJ0MnLCdPJywnTScsJ00nKToKICAgICAgICAgICAgIGF2aW9fcmVhZChzLT5wYiwgY29tbV9jaHVuaywgMTIpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5jaGFubmVscyA9IEFWX1JCMzIoY29tbV9jaHVuayAgICApICsgMTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPSBBVl9SQjMyKGNvbW1fY2h1bmsgICAgKSArIDE7CiAgICAgICAgICAgICByZWFkX2JpdHJhdGUgICAgICAgID0gQVZfUkIzMihjb21tX2NodW5rICsgNCk7CiAgICAgICAgICAgICByYXRlX2ZsYWcgICAgICAgICAgID0gQVZfUkIzMihjb21tX2NodW5rICsgOCk7CiAgICAgICAgICAgICBhdmlvX3NraXAocy0+cGIsIGxlbi0xMik7CiAKLSAgICAgICAgICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzIDw9IDApIHsKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmNoYW5uZWxzIDw9IDApIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHNcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICAgICAgICA9IHJlYWRfYml0cmF0ZSoxMDAwOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IChpbnQ2NF90KXJlYWRfYml0cmF0ZSAqIDEwMDA7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBNS1RBRygnRCcsJ1MnLCdJJywnWicpOiAvLyBzaXplIG9mIGNvbXByZXNzZWQgZGF0YQogICAgICAgICB7CkBAIC0xNjksMzIgKzE2OSwzMiBAQAogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiQ09NTSB0YWcgbm90IGZvdW5kIVxuIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICBjYXNlIDQ0OgotICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gNDQxMDA7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA0NDEwMDsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyMjoKLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IDIyMDUwOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gMjIwNTA7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgMTE6Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSAxMTAyNTsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IDExMDI1OwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBpZiAocmF0ZV9mbGFnIDwgOCB8fCByYXRlX2ZsYWcgPiA0NCkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcmF0ZSBmbGFnICVkXG4iLCByYXRlX2ZsYWcpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgIH0KLSAgICAgICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHJhdGVfZmxhZyoxMDAwOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gcmF0ZV9mbGFnKjEwMDA7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChyZWFkX2JpdHJhdGUgLyBzdC0+Y29kZWMtPmNoYW5uZWxzIDwgIDggfHwKLSAgICAgICAgcmVhZF9iaXRyYXRlIC8gc3QtPmNvZGVjLT5jaGFubmVscyA+IDQ4KSB7CisgICAgaWYgKHJlYWRfYml0cmF0ZSAvIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPCAgOCB8fAorICAgICAgICByZWFkX2JpdHJhdGUgLyBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID4gNDgpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgYml0cmF0ZSBwZXIgY2hhbm5lbCAlZFxuIiwKLSAgICAgICAgICAgICAgIHJlYWRfYml0cmF0ZSAvIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgcmVhZF9iaXRyYXRlIC8gc3QtPmNvZGVjcGFyLT5jaGFubmVscyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAotICAgIHN3aXRjaCAoKChzdC0+Y29kZWMtPnNhbXBsZV9yYXRlLzEwMDApIDw8IDgpICsKLSAgICAgICAgICAgIHJlYWRfYml0cmF0ZS9zdC0+Y29kZWMtPmNoYW5uZWxzKSB7CisgICAgc3dpdGNoICgoKHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUvMTAwMCkgPDwgOCkgKworICAgICAgICAgICAgcmVhZF9iaXRyYXRlL3N0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpIHsKICAgICBjYXNlICgxMTw8OCkgKyA4IDoKICAgICBjYXNlICg4IDw8OCkgKyA4IDoKICAgICBjYXNlICgxMTw8OCkgKyAxMDoKQEAgLTIxMiwxNiArMjEyLDE2IEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkIEh6LCAlIlBSSWQ2NCIga2Ivcy5cbiIsCi0gICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlLCAoaW50NjRfdClzdC0+Y29kZWMtPmJpdF9yYXRlKTsKKyAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUsIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGMtPmZyYW1lX2JpdF9sZW4gPSBzdC0+Y29kZWMtPmJpdF9yYXRlKnNpemUvc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZTsKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgc2l6ZSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYy0+ZnJhbWVfYml0X2xlbiA9IHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUqc2l6ZS9zdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCBzaXplLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIC8qIHB1dCBmaXJzdCAxMiBieXRlcyBvZiBDT01NIGNodW5rIGluIGV4dHJhZGF0YSAqLwotICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCAxMikpCisgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWNwYXIsIDEyKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBtZW1jcHkoc3QtPmNvZGVjLT5leHRyYWRhdGEsIGNvbW1fY2h1bmssIDEyKTsKKyAgICBtZW1jcHkoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEsIGNvbW1fY2h1bmssIDEyKTsKIAogICAgIGZmX21ldGFkYXRhX2NvbnZfY3R4KHMsIE5VTEwsIHZxZl9tZXRhZGF0YV9jb252KTsKIApAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgaW50NjRfdCBwb3M7CiAKICAgICBzdCA9IHMtPnN0cmVhbXNbc3RyZWFtX2luZGV4XTsKLSAgICBwb3MgPSBhdl9yZXNjYWxlX3JuZCh0aW1lc3RhbXAgKiBzdC0+Y29kZWMtPmJpdF9yYXRlLAorICAgIHBvcyA9IGF2X3Jlc2NhbGVfcm5kKHRpbWVzdGFtcCAqIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZS5udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnRpbWVfYmFzZS5kZW4gKiAoaW50NjRfdCljLT5mcmFtZV9iaXRfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIEFWU0VFS19GTEFHX0JBQ0tXQVJEKSA/CkBAIC0yNzMsNyArMjczLDcgQEAKICAgICBwb3MgKj0gYy0+ZnJhbWVfYml0X2xlbjsKIAogICAgIHN0LT5jdXJfZHRzID0gYXZfcmVzY2FsZShwb3MsIHN0LT50aW1lX2Jhc2UuZGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdF9yYXRlICogKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5udW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlICogKGludDY0X3Qpc3QtPnRpbWVfYmFzZS5udW0pOwogCiAgICAgaWYgKChyZXQgPSBhdmlvX3NlZWsocy0+cGIsICgocG9zLTcpID4+IDMpICsgcy0+aW50ZXJuYWwtPmRhdGFfb2Zmc2V0LCBTRUVLX1NFVCkpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3dhdmRlYy5jIGIvbGliYXZmb3JtYXQvd2F2ZGVjLmMKaW5kZXggZDk1NTk2Zi4uZTI4MGJlNCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvd2F2ZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvd2F2ZGVjLmMKQEAgLTYwLDYgKzYwLDM3IEBACiAgICAgaW50IHJpZng7IC8vIFJJRlg6IGludGVnZXIgYnl0ZSBvcmRlciBmb3IgcGFyYW1ldGVycyBpcyBiaWcgZW5kaWFuCiB9IFdBVkRlbXV4Q29udGV4dDsKIAorc3RhdGljIHZvaWQgc2V0X3NwZGlmKEFWRm9ybWF0Q29udGV4dCAqcywgV0FWRGVtdXhDb250ZXh0ICp3YXYpCit7CisgICAgaWYgKENPTkZJR19TUERJRl9ERU1VWEVSICYmIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY190YWcgPT0gMSkgeworICAgICAgICBlbnVtIEFWQ29kZWNJRCBjb2RlYzsKKyAgICAgICAgaW50IGxlbiA9IDE8PDE2OworICAgICAgICBpbnQgcmV0ID0gZmZpb19lbnN1cmVfc2Vla2JhY2socy0+cGIsIGxlbik7CisKKyAgICAgICAgaWYgKHJldCA+PSAwKSB7CisgICAgICAgICAgICB1aW50OF90ICpidWYgPSBhdl9tYWxsb2MobGVuKTsKKyAgICAgICAgICAgIGlmICghYnVmKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHBvcyA9IGF2aW9fdGVsbChzLT5wYik7CisgICAgICAgICAgICAgICAgbGVuID0gcmV0ID0gYXZpb19yZWFkKHMtPnBiLCBidWYsIGxlbik7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IGZmX3NwZGlmX3Byb2JlKGJ1ZiwgbGVuLCAmY29kZWMpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ID4gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY19pZCA9IGNvZGVjOworICAgICAgICAgICAgICAgICAgICAgICAgd2F2LT5zcGRpZiA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXZpb19zZWVrKHMtPnBiLCBwb3MsIFNFRUtfU0VUKTsKKyAgICAgICAgICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIkNhbm5vdCBjaGVjayBmb3IgU1BESUZcbiIpOworICAgIH0KK30KKwogI2lmIENPTkZJR19XQVZfREVNVVhFUgogCiBzdGF0aWMgaW50NjRfdCBuZXh0X3RhZyhBVklPQ29udGV4dCAqcGIsIHVpbnQzMl90ICp0YWcsIGludCBiaWdfZW5kaWFuKQpAQCAtMTE3LDcgKzE0OCw3IEBACiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9zdHJlYW1fcHJvYmluZyhBVlN0cmVhbSAqc3QpCiB7Ci0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKSB7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfUENNX1MxNkxFKSB7CiAgICAgICAgIHN0LT5yZXF1ZXN0X3Byb2JlID0gQVZQUk9CRV9TQ09SRV9FWFRFTlNJT047CiAgICAgICAgIHN0LT5wcm9iZV9wYWNrZXRzID0gRkZNSU4oc3QtPnByb2JlX3BhY2tldHMsIDMyKTsKICAgICB9CkBAIC0xMzQsMTQgKzE2NSwxNCBAQAogICAgIGlmICghKnN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsICgqc3QpLT5jb2RlYywgc2l6ZSwgd2F2LT5yaWZ4KTsKKyAgICByZXQgPSBmZl9nZXRfd2F2X2hlYWRlcihzLCBwYiwgKCpzdCktPmNvZGVjcGFyLCBzaXplLCB3YXYtPnJpZngpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIGhhbmRsZV9zdHJlYW1fcHJvYmluZygqc3QpOwogCiAgICAgKCpzdCktPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOwogCi0gICAgYXZwcml2X3NldF9wdHNfaW5mbygqc3QsIDY0LCAxLCAoKnN0KS0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKCpzdCwgNjQsIDEsICgqc3QpLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0xNDksMjYgKzE4MCwzMCBAQAogc3RhdGljIGludCB3YXZfcGFyc2VfeG1hMl90YWcoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQ2NF90IHNpemUsIEFWU3RyZWFtICoqc3QpCiB7CiAgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7Ci0gICAgaW50IG51bV9zdHJlYW1zLCBpLCBjaGFubmVscyA9IDA7CisgICAgaW50IHZlcnNpb24sIG51bV9zdHJlYW1zLCBpLCBjaGFubmVscyA9IDA7CiAKLSAgICBpZiAoc2l6ZSA8IDQ0KQorICAgIGlmIChzaXplIDwgMzYpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCiAgICAgKnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoISpzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgICgqc3QpLT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAoKnN0KS0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9YTUEyOwotICAgICgqc3QpLT5uZWVkX3BhcnNpbmcgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOworICAgICgqc3QpLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAoKnN0KS0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9YTUEyOworICAgICgqc3QpLT5uZWVkX3BhcnNpbmcgICAgICAgICA9IEFWU1RSRUFNX1BBUlNFX0ZVTExfUkFXOwogCi0gICAgYXZpb19za2lwKHBiLCAxKTsKKyAgICB2ZXJzaW9uID0gYXZpb19yOChwYik7CisgICAgaWYgKHZlcnNpb24gIT0gMyAmJiB2ZXJzaW9uICE9IDQpCisgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIG51bV9zdHJlYW1zID0gYXZpb19yOChwYik7Ci0gICAgaWYgKHNpemUgPCA0MCArIG51bV9zdHJlYW1zICogNCkKKyAgICBpZiAoc2l6ZSAhPSAoMzIgKyAoKHZlcnNpb249PTMpPzA6OCkgKyA0Km51bV9zdHJlYW1zKSkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgYXZpb19za2lwKHBiLCAxMCk7Ci0gICAgKCpzdCktPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihwYik7Ci0gICAgYXZpb19za2lwKHBiLCAxMik7CisgICAgKCpzdCktPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IGF2aW9fcmIzMihwYik7CisgICAgaWYgKHZlcnNpb24gPT0gNCkKKyAgICAgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICBhdmlvX3NraXAocGIsIDQpOwogICAgICgqc3QpLT5kdXJhdGlvbiA9IGF2aW9fcmIzMihwYik7CiAgICAgYXZpb19za2lwKHBiLCA4KTsKIApAQCAtMTc2LDE1ICsyMTEsMTcgQEAKICAgICAgICAgY2hhbm5lbHMgKz0gYXZpb19yOChwYik7CiAgICAgICAgIGF2aW9fc2tpcChwYiwgMyk7CiAgICAgfQotICAgICgqc3QpLT5jb2RlYy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICAoKnN0KS0+Y29kZWNwYXItPmNoYW5uZWxzID0gY2hhbm5lbHM7CiAKLSAgICBpZiAoKCpzdCktPmNvZGVjLT5jaGFubmVscyA8PSAwIHx8ICgqc3QpLT5jb2RlYy0+c2FtcGxlX3JhdGUgPD0gMCkKKyAgICBpZiAoKCpzdCktPmNvZGVjcGFyLT5jaGFubmVscyA8PSAwIHx8ICgqc3QpLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPD0gMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKCpzdCwgNjQsIDEsICgqc3QpLT5jb2RlYy0+c2FtcGxlX3JhdGUpOwotICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoKCpzdCktPmNvZGVjLCAzNCkpCisgICAgYXZwcml2X3NldF9wdHNfaW5mbygqc3QsIDY0LCAxLCAoKnN0KS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKKworICAgIGF2aW9fc2VlayhwYiwgLXNpemUsIFNFRUtfQ1VSKTsKKyAgICBhdl9mcmVlcCgmKCpzdCktPmNvZGVjcGFyLT5leHRyYWRhdGEpOworICAgIGlmIChmZl9nZXRfZXh0cmFkYXRhKHMsICgqc3QpLT5jb2RlY3BhciwgcGIsIHNpemUpIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICBtZW1zZXQoKCpzdCktPmNvZGVjLT5leHRyYWRhdGEsIDAsIDM0KTsKIAogICAgIHJldHVybiAwOwogfQpAQCAtMjkyLDcgKzMyOSw2IEBACiAgICAgaW50NjRfdCBzaXplLCBhdl91bmluaXQoZGF0YV9zaXplKTsKICAgICBpbnQ2NF90IHNhbXBsZV9jb3VudCA9IDA7CiAgICAgaW50IHJmNjQgPSAwOwotICAgIGNoYXIgc3RhcnRfY29kZVszMl07CiAgICAgdWludDMyX3QgdGFnOwogICAgIEFWSU9Db250ZXh0ICpwYiAgICAgID0gcy0+cGI7CiAgICAgQVZTdHJlYW0gKnN0ICAgICAgICAgPSBOVUxMOwpAQCAtMzE2LDggKzM1Miw4IEBACiAgICAgICAgIHJmNjQgPSAxOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyhzdGFydF9jb2RlLCBzaXplb2Yoc3RhcnRfY29kZSksIHRhZyk7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJpbnZhbGlkIHN0YXJ0IGNvZGUgJXMgaW4gUklGRiBoZWFkZXJcbiIsIHN0YXJ0X2NvZGUpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBzdGFydCBjb2RlICVzIGluIFJJRkYgaGVhZGVyXG4iLAorICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cih0YWcpKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogCkBAIC0zNzksNyArNDE1LDcgQEAKICAgICAgICAgICAgIGdvdF94bWEyID0gMTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1LVEFHKCdkJywgJ2EnLCAndCcsICdhJyk6Ci0gICAgICAgICAgICBpZiAoIXBiLT5zZWVrYWJsZSAmJiAhZ290X2ZtdCAmJiAhZ290X3htYTIpIHsKKyAgICAgICAgICAgIGlmICghKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJiAhZ290X2ZtdCAmJiAhZ290X3htYTIpIHsKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgbm8gJ2ZtdCAnIHRhZyBiZWZvcmUgdGhlICdkYXRhJyB0YWdcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwpAQCAtNDAyLDcgKzQzOCw3IEBACiAgICAgICAgICAgICAvKiBkb24ndCBsb29rIGZvciBmb290ZXIgbWV0YWRhdGEgaWYgd2UgY2FuJ3Qgc2VlayBvciBpZiB3ZSBkb24ndAogICAgICAgICAgICAgICoga25vdyB3aGVyZSB0aGUgZGF0YSB0YWcgZW5kcwogICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoIXBiLT5zZWVrYWJsZSB8fCAoIXJmNjQgJiYgIXNpemUpKQorICAgICAgICAgICAgaWYgKCEocGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpIHx8ICghcmY2NCAmJiAhc2l6ZSkpCiAgICAgICAgICAgICAgICAgZ290byBicmVha19sb29wOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTUtUQUcoJ2YnLCAnYScsICdjJywgJ3QnKToKQEAgLTQzMCwxMSArNDY2LDExIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIGF2aW9fcjgocGIpOwogICAgICAgICAgICAgdnN0LT5pZCA9IDE7Ci0gICAgICAgICAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgICAgICAgICAgdnN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TTVZKUEVHOwotICAgICAgICAgICAgdnN0LT5jb2RlYy0+d2lkdGggID0gYXZpb19ybDI0KHBiKTsKLSAgICAgICAgICAgIHZzdC0+Y29kZWMtPmhlaWdodCA9IGF2aW9fcmwyNChwYik7Ci0gICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHZzdC0+Y29kZWMsIDQpKSB7CisgICAgICAgICAgICB2c3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9TTVZKUEVHOworICAgICAgICAgICAgdnN0LT5jb2RlY3Bhci0+d2lkdGggID0gYXZpb19ybDI0KHBiKTsKKyAgICAgICAgICAgIHZzdC0+Y29kZWNwYXItPmhlaWdodCA9IGF2aW9fcmwyNChwYik7CisgICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHZzdC0+Y29kZWNwYXIsIDQpKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBleHRyYWRhdGEuXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgfQpAQCAtNDUxLDcgKzQ4Nyw3IEBACiAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgInRvbyBtYW55IGZyYW1lcyBwZXIganBlZ1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBVl9XTDMyKHZzdC0+Y29kZWMtPmV4dHJhZGF0YSwgd2F2LT5zbXZfZnJhbWVzX3Blcl9qcGVnKTsKKyAgICAgICAgICAgIEFWX1dMMzIodnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCB3YXYtPnNtdl9mcmFtZXNfcGVyX2pwZWcpOwogICAgICAgICAgICAgd2F2LT5zbXZfY3VyX3B0ID0gMDsKICAgICAgICAgICAgIGdvdG8gYnJlYWtfbG9vcDsKICAgICAgICAgY2FzZSBNS1RBRygnTCcsICdJJywgJ1MnLCAnVCcpOgpAQCAtNDkxLDQzICs1MjcsNjEgQEAKICAgICAgICAgZGF0YV9zaXplID0gMDsKICAgICB9CiAKLSAgICBpZiAoICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA+IDAgJiYgZGF0YV9zaXplID4gMAotICAgICAgICAmJiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID4gMAotICAgICAgICAmJiBzYW1wbGVfY291bnQgPiAwICYmIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPiAxCi0gICAgICAgICYmIHNhbXBsZV9jb3VudCAlIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPT0gMCkgewotICAgICAgICBpZiAoZmFicyg4LjAgKiBkYXRhX3NpemUgKiBzdC0+Y29kZWMtPmNoYW5uZWxzICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAvCi0gICAgICAgICAgICBzYW1wbGVfY291bnQgL3N0LT5jb2RlYy0+Yml0X3JhdGUgLSAxLjApIDwgMC4zKQotICAgICAgICAgICAgc2FtcGxlX2NvdW50IC89IHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgaWYgKCAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPiAwICYmIGRhdGFfc2l6ZSA+IDAKKyAgICAgICAgJiYgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA+IDAKKyAgICAgICAgJiYgc2FtcGxlX2NvdW50ID4gMCAmJiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID4gMQorICAgICAgICAmJiBzYW1wbGVfY291bnQgJSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID09IDApIHsKKyAgICAgICAgaWYgKGZhYnMoOC4wICogZGF0YV9zaXplICogc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgLworICAgICAgICAgICAgc2FtcGxlX2NvdW50IC9zdC0+Y29kZWNwYXItPmJpdF9yYXRlIC0gMS4wKSA8IDAuMykKKyAgICAgICAgICAgIHNhbXBsZV9jb3VudCAvPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogICAgIH0KIAotICAgIGlmICggICBkYXRhX3NpemUgPiAwICYmIHNhbXBsZV9jb3VudCAmJiBzdC0+Y29kZWMtPmNoYW5uZWxzCi0gICAgICAgICYmIChkYXRhX3NpemUgPDwgMykgLyBzYW1wbGVfY291bnQgLyBzdC0+Y29kZWMtPmNoYW5uZWxzID4gc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgICsgMSkgeworICAgIGlmICggICBkYXRhX3NpemUgPiAwICYmIHNhbXBsZV9jb3VudCAmJiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzCisgICAgICAgICYmIChkYXRhX3NpemUgPDwgMykgLyBzYW1wbGVfY291bnQgLyBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID4gc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgICsgMSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJpZ25vcmluZyB3cm9uZyBzYW1wbGVfY291bnQgJSJQUklkNjQiXG4iLCBzYW1wbGVfY291bnQpOwogICAgICAgICBzYW1wbGVfY291bnQgPSAwOwogICAgIH0KIAogICAgIC8qIEcuNzI5IGhhY2sgKGZvciBUaWNrZXQ0NTc3KQogICAgICAqIEZJWE1FOiBDb21lIHVwIHdpdGggY2xlYW5lciwgbW9yZSBnZW5lcmFsIHNvbHV0aW9uICovCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfRzcyOSAmJiBzYW1wbGVfY291bnQgJiYgKGRhdGFfc2l6ZSA8PCAzKSA+IHNhbXBsZV9jb3VudCkgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0c3MjkgJiYgc2FtcGxlX2NvdW50ICYmIChkYXRhX3NpemUgPDwgMykgPiBzYW1wbGVfY291bnQpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiaWdub3Jpbmcgd3Jvbmcgc2FtcGxlX2NvdW50ICUiUFJJZDY0IlxuIiwgc2FtcGxlX2NvdW50KTsKICAgICAgICAgc2FtcGxlX2NvdW50ID0gMDsKICAgICB9CiAKLSAgICBpZiAoIXNhbXBsZV9jb3VudCB8fCBhdl9nZXRfZXhhY3RfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpID4gMCkKLSAgICAgICAgaWYgKCAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMKKyAgICBpZiAoIXNhbXBsZV9jb3VudCB8fCBhdl9nZXRfZXhhY3RfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpID4gMCkKKyAgICAgICAgaWYgKCAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMKICAgICAgICAgICAgICYmIGRhdGFfc2l6ZQotICAgICAgICAgICAgJiYgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWMtPmNvZGVjX2lkKQorICAgICAgICAgICAgJiYgYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKQogICAgICAgICAgICAgJiYgd2F2LT5kYXRhX2VuZCA8PSBhdmlvX3NpemUocGIpKQogICAgICAgICAgICAgc2FtcGxlX2NvdW50ID0gKGRhdGFfc2l6ZSA8PCAzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KLSAgICAgICAgICAgICAgICAoc3QtPmNvZGVjLT5jaGFubmVscyAqICh1aW50NjRfdClhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlYy0+Y29kZWNfaWQpKTsKKyAgICAgICAgICAgICAgICAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyAqICh1aW50NjRfdClhdl9nZXRfYml0c19wZXJfc2FtcGxlKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpKTsKIAogICAgIGlmIChzYW1wbGVfY291bnQpCiAgICAgICAgIHN0LT5kdXJhdGlvbiA9IHNhbXBsZV9jb3VudDsKIAorICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMzJMRSAmJgorICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID09IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiA0ICYmCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID09IDMyICYmCisgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPT0gMiAmJgorICAgICAgICBBVl9STDE2KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKSA9PSAxKSB7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fRjE2TEU7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gMTY7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1BDTV9TMjRMRSAmJgorICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9PSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogNCAmJgorICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPT0gMjQpIHsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9GMjRMRTsKKyAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfWE1BMSB8fAorICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9YTUEyKSB7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24gPSAyMDQ4OworICAgIH0KKwogICAgIGZmX21ldGFkYXRhX2NvbnZfY3R4KHMsIE5VTEwsIHdhdl9tZXRhZGF0YV9jb252KTsKICAgICBmZl9tZXRhZGF0YV9jb252X2N0eChzLCBOVUxMLCBmZl9yaWZmX2luZm9fY29udik7CiAKKyAgICBzZXRfc3BkaWYocywgd2F2KTsKKwogICAgIHJldHVybiAwOwogfQogCkBAIC01NjEsMTggKzYxNSw2IEBACiAgICAgQVZTdHJlYW0gKnN0OwogICAgIFdBVkRlbXV4Q29udGV4dCAqd2F2ID0gcy0+cHJpdl9kYXRhOwogCi0gICAgaWYgKENPTkZJR19TUERJRl9ERU1VWEVSICYmIHdhdi0+c3BkaWYgPT0gMCAmJgotICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfdGFnID09IDEpIHsKLSAgICAgICAgZW51bSBBVkNvZGVjSUQgY29kZWM7Ci0gICAgICAgIHJldCA9IGZmX3NwZGlmX3Byb2JlKHMtPnBiLT5idWZmZXIsIHMtPnBiLT5idWZfZW5kIC0gcy0+cGItPmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjKTsKLSAgICAgICAgaWYgKHJldCA+IEFWUFJPQkVfU0NPUkVfRVhURU5TSU9OKSB7Ci0gICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfaWQgPSBjb2RlYzsKLSAgICAgICAgICAgIHdhdi0+c3BkaWYgPSAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd2F2LT5zcGRpZiA9IC0xOwotICAgICAgICB9Ci0gICAgfQogICAgIGlmIChDT05GSUdfU1BESUZfREVNVVhFUiAmJiB3YXYtPnNwZGlmID09IDEpCiAgICAgICAgIHJldHVybiBmZl9zcGRpZl9yZWFkX3BhY2tldChzLCBwa3QpOwogCkBAIC02NDMsMTAgKzY4NSwxMCBAQAogICAgIH0KIAogICAgIHNpemUgPSBNQVhfU0laRTsKLSAgICBpZiAoc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA+IDEpIHsKLSAgICAgICAgaWYgKHNpemUgPCBzdC0+Y29kZWMtPmJsb2NrX2FsaWduKQotICAgICAgICAgICAgc2l6ZSA9IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ247Ci0gICAgICAgIHNpemUgPSAoc2l6ZSAvIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24pICogc3QtPmNvZGVjLT5ibG9ja19hbGlnbjsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA+IDEpIHsKKyAgICAgICAgaWYgKHNpemUgPCBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduKQorICAgICAgICAgICAgc2l6ZSA9IHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ247CisgICAgICAgIHNpemUgPSAoc2l6ZSAvIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24pICogc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbjsKICAgICB9CiAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIGxlZnQpOwogICAgIHJldCAgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHNpemUpOwpAQCAtNjc3LDExICs3MTksMTIgQEAKICAgICB9CiAKICAgICBzdCA9IHMtPnN0cmVhbXNbMF07Ci0gICAgc3dpdGNoIChzdC0+Y29kZWMtPmNvZGVjX2lkKSB7CisgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkKSB7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDI6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9NUDM6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BQzM6CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9EVFM6CisgICAgY2FzZSBBVl9DT0RFQ19JRF9YTUEyOgogICAgICAgICAvKiB1c2UgZ2VuZXJpYyBzZWVraW5nIHdpdGggZHluYW1pY2FsbHkgZ2VuZXJhdGVkIGluZGV4ZXMgKi8KICAgICAgICAgcmV0dXJuIC0xOwogICAgIGRlZmF1bHQ6CkBAIC03NjcsMjMgKzgxMCwyNCBAQAogCiAgICAgICAgIGlmICghbWVtY21wKGd1aWQsIGZmX3c2NF9ndWlkX2ZtdCwgMTYpKSB7CiAgICAgICAgICAgICAvKiBzdWJ0cmFjdCBjaHVuayBoZWFkZXIgc2l6ZSAtIG5vcm1hbCB3YXYgZmlsZSBkb2Vzbid0IGNvdW50IGl0ICovCi0gICAgICAgICAgICByZXQgPSBmZl9nZXRfd2F2X2hlYWRlcihzLCBwYiwgc3QtPmNvZGVjLCBzaXplIC0gMjQsIDApOworICAgICAgICAgICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlY3Bhciwgc2l6ZSAtIDI0LCAwKTsKICAgICAgICAgICAgIGlmIChyZXQgPCAwKQogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICBhdmlvX3NraXAocGIsIEZGQUxJR04oc2l6ZSwgSU5UNjRfQyg4KSkgLSBzaXplKTsKIAotICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoZ3VpZCwgZmZfdzY0X2d1aWRfZmFjdCwgMTYpKSB7CiAgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXM7CiAKICAgICAgICAgICAgIHNhbXBsZXMgPSBhdmlvX3JsNjQocGIpOwogICAgICAgICAgICAgaWYgKHNhbXBsZXMgPiAwKQogICAgICAgICAgICAgICAgIHN0LT5kdXJhdGlvbiA9IHNhbXBsZXM7CisgICAgICAgICAgICBhdmlvX3NraXAocGIsIEZGQUxJR04oc2l6ZSwgSU5UNjRfQyg4KSkgLSAzMik7CiAgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChndWlkLCBmZl93NjRfZ3VpZF9kYXRhLCAxNikpIHsKICAgICAgICAgICAgIHdhdi0+ZGF0YV9lbmQgPSBhdmlvX3RlbGwocGIpICsgc2l6ZSAtIDI0OwogCiAgICAgICAgICAgICBkYXRhX29mcyA9IGF2aW9fdGVsbChwYik7Ci0gICAgICAgICAgICBpZiAoIXBiLT5zZWVrYWJsZSkKKyAgICAgICAgICAgIGlmICghKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkKICAgICAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICAgICAgYXZpb19za2lwKHBiLCBzaXplIC0gMjQpOwpAQCAtODA0LDYgKzg0OCw4IEBACiAgICAgICAgICAgICAgICAgY2h1bmtfa2V5WzRdID0gMDsKICAgICAgICAgICAgICAgICBhdmlvX3JlYWQocGIsIGNodW5rX2tleSwgNCk7CiAgICAgICAgICAgICAgICAgY2h1bmtfc2l6ZSA9IGF2aW9fcmwzMihwYik7CisgICAgICAgICAgICAgICAgaWYgKGNodW5rX3NpemUgPT0gVUlOVDMyX01BWCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICAgICAgICAgICAgICB2YWx1ZSA9IGF2X21hbGxvY3ooY2h1bmtfc2l6ZSArIDEpOwogICAgICAgICAgICAgICAgIGlmICghdmFsdWUpCkBAIC04MzMsNiArODc5LDggQEAKIAogICAgIGF2aW9fc2VlayhwYiwgZGF0YV9vZnMsIFNFRUtfU0VUKTsKIAorICAgIHNldF9zcGRpZihzLCB3YXYpOworCiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3dhdmVuYy5jIGIvbGliYXZmb3JtYXQvd2F2ZW5jLmMKaW5kZXggMDE1NmY2ZS4uMTU5MTE5ZCAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvd2F2ZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvd2F2ZW5jLmMKQEAgLTc0LDggKzc0LDYgQEAKICAgICB1aW50MzJfdCBwZWFrX251bV9mcmFtZXM7CiAgICAgdWludDMyX3QgcGVha19vdXRidWZfc2l6ZTsKICAgICB1aW50MzJfdCBwZWFrX291dGJ1Zl9ieXRlczsKLSAgICB1aW50MzJfdCBwZWFrX3Bvc19wb3A7Ci0gICAgdWludDE2X3QgcGVha19wb3A7CiAgICAgdWludDhfdCAqcGVha19vdXRwdXQ7CiAgICAgaW50IGxhc3RfZHVyYXRpb247CiAgICAgaW50IHdyaXRlX2JleHQ7CkBAIC0xNTUsMTggKzE1MywxOSBAQAogc3RhdGljIGF2X2NvbGQgaW50IHBlYWtfaW5pdF93cml0ZXIoQVZGb3JtYXRDb250ZXh0ICpzKQogewogICAgIFdBVk11eENvbnRleHQgKndhdiA9IHMtPnByaXZfZGF0YTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZW5jID0gcy0+c3RyZWFtc1swXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyOwogCi0gICAgaWYgKGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1M4ICYmCi0gICAgICAgIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1MxNkxFICYmCi0gICAgICAgIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1U4ICYmCi0gICAgICAgIGVuYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1UxNkxFKSB7CisgICAgaWYgKHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1M4ICYmCisgICAgICAgIHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1MxNkxFICYmCisgICAgICAgIHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1U4ICYmCisgICAgICAgIHBhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfUENNX1UxNkxFKSB7CisgICAgICAgIEFWQ29kZWMgKmNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIocy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkKTsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiVzIGNvZGVjIG5vdCBzdXBwb3J0ZWQgZm9yIFBlYWsgQ2h1bmtcbiIsCi0gICAgICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWMgPyBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWMtPm5hbWUgOiAiTk9ORSIpOworICAgICAgICAgICAgICAgY29kZWMgPyBjb2RlYy0+bmFtZSA6ICJOT05FIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICB3YXYtPnBlYWtfYnBzID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShlbmMtPmNvZGVjX2lkKSAvIDg7CisgICAgd2F2LT5wZWFrX2JwcyA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUocGFyLT5jb2RlY19pZCkgLyA4OwogCiAgICAgaWYgKHdhdi0+cGVha19icHMgPT0gMSAmJiB3YXYtPnBlYWtfZm9ybWF0ID09IFBFQUtfRk9STUFUX1VJTlQxNikgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLApAQCAtMTc0LDggKzE3Myw4IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgd2F2LT5wZWFrX21heHBvcyA9IGF2X21hbGxvY3pfYXJyYXkoZW5jLT5jaGFubmVscywgc2l6ZW9mKCp3YXYtPnBlYWtfbWF4cG9zKSk7Ci0gICAgd2F2LT5wZWFrX21heG5lZyA9IGF2X21hbGxvY3pfYXJyYXkoZW5jLT5jaGFubmVscywgc2l6ZW9mKCp3YXYtPnBlYWtfbWF4bmVnKSk7CisgICAgd2F2LT5wZWFrX21heHBvcyA9IGF2X21hbGxvY3pfYXJyYXkocGFyLT5jaGFubmVscywgc2l6ZW9mKCp3YXYtPnBlYWtfbWF4cG9zKSk7CisgICAgd2F2LT5wZWFrX21heG5lZyA9IGF2X21hbGxvY3pfYXJyYXkocGFyLT5jaGFubmVscywgc2l6ZW9mKCp3YXYtPnBlYWtfbWF4bmVnKSk7CiAgICAgd2F2LT5wZWFrX291dHB1dCA9IGF2X21hbGxvYyhQRUFLX0JVRkZFUl9TSVpFKTsKICAgICBpZiAoIXdhdi0+cGVha19tYXhwb3MgfHwgIXdhdi0+cGVha19tYXhuZWcgfHwgIXdhdi0+cGVha19vdXRwdXQpCiAgICAgICAgIGdvdG8gbm9tZW07CkBAIC0xOTMsMTQgKzE5MiwxMyBAQAogc3RhdGljIHZvaWQgcGVha193cml0ZV9mcmFtZShBVkZvcm1hdENvbnRleHQgKnMpCiB7CiAgICAgV0FWTXV4Q29udGV4dCAqd2F2ID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKLSAgICBpbnQgcGVha19vZl9wZWFrczsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgaW50IGM7CiAKICAgICBpZiAoIXdhdi0+cGVha19vdXRwdXQpCiAgICAgICAgIHJldHVybjsKIAotICAgIGZvciAoYyA9IDA7IGMgPCBlbmMtPmNoYW5uZWxzOyBjKyspIHsKKyAgICBmb3IgKGMgPSAwOyBjIDwgcGFyLT5jaGFubmVsczsgYysrKSB7CiAgICAgICAgIHdhdi0+cGVha19tYXhuZWdbY10gPSAtd2F2LT5wZWFrX21heG5lZ1tjXTsKIAogICAgICAgICBpZiAod2F2LT5wZWFrX2JwcyA9PSAyICYmIHdhdi0+cGVha19mb3JtYXQgPT0gUEVBS19GT1JNQVRfVUlOVDgpIHsKQEAgLTIxMiwxMiArMjEwLDYgQEAKICAgICAgICAgICAgIHdhdi0+cGVha19tYXhwb3NbY10gPQogICAgICAgICAgICAgICAgIEZGTUFYKHdhdi0+cGVha19tYXhwb3NbY10sIHdhdi0+cGVha19tYXhuZWdbY10pOwogCi0gICAgICAgIHBlYWtfb2ZfcGVha3MgPSBGRk1BWDMod2F2LT5wZWFrX21heHBvc1tjXSwgd2F2LT5wZWFrX21heG5lZ1tjXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXYtPnBlYWtfcG9wKTsKLSAgICAgICAgaWYgKHBlYWtfb2ZfcGVha3MgPiB3YXYtPnBlYWtfcG9wKQotICAgICAgICAgICAgd2F2LT5wZWFrX3Bvc19wb3AgPSB3YXYtPnBlYWtfbnVtX2ZyYW1lczsKLSAgICAgICAgd2F2LT5wZWFrX3BvcCA9IHBlYWtfb2ZfcGVha3M7Ci0KICAgICAgICAgaWYgKHdhdi0+cGVha19vdXRidWZfc2l6ZSAtIHdhdi0+cGVha19vdXRidWZfYnl0ZXMgPAogICAgICAgICAgICAgd2F2LT5wZWFrX2Zvcm1hdCAqIHdhdi0+cGVha19wcHYpIHsKICAgICAgICAgICAgIHdhdi0+cGVha19vdXRidWZfc2l6ZSArPSBQRUFLX0JVRkZFUl9TSVpFOwpAQCAtMjU2LDcgKzI0OCw3IEBACiB7CiAgICAgV0FWTXV4Q29udGV4dCAqd2F2ID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gcy0+c3RyZWFtc1swXS0+Y29kZWNwYXI7CiAgICAgaW50NjRfdCBwZWFrID0gZmZfc3RhcnRfdGFnKHMtPnBiLCAibGV2bCIpOwogICAgIGludDY0X3Qgbm93MDsKICAgICB0aW1lX3Qgbm93X3NlY3M7CkBAIC0yODQsOSArMjc2LDkgQEAKICAgICBhdmlvX3dsMzIocGIsIHdhdi0+cGVha19mb3JtYXQpOyAgICAgICAgICAgIC8qIDggb3IgMTYgYml0ICovCiAgICAgYXZpb193bDMyKHBiLCB3YXYtPnBlYWtfcHB2KTsgICAgICAgICAgICAgICAvKiBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgKi8KICAgICBhdmlvX3dsMzIocGIsIHdhdi0+cGVha19ibG9ja19zaXplKTsgICAgICAgIC8qIGZyYW1lcyBwZXIgdmFsdWUgKi8KLSAgICBhdmlvX3dsMzIocGIsIGVuYy0+Y2hhbm5lbHMpOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyAqLworICAgIGF2aW9fd2wzMihwYiwgcGFyLT5jaGFubmVscyk7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzICovCiAgICAgYXZpb193bDMyKHBiLCB3YXYtPnBlYWtfbnVtX2ZyYW1lcyk7ICAgICAgICAvKiBudW1iZXIgb2YgcGVhayBmcmFtZXMgKi8KLSAgICBhdmlvX3dsMzIocGIsIHdhdi0+cGVha19wb3NfcG9wKTsgICAgICAgICAgIC8qIGF1ZGlvIHNhbXBsZSBmcmFtZSBpbmRleCAqLworICAgIGF2aW9fd2wzMihwYiwgLTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXVkaW8gc2FtcGxlIGZyYW1lIHBvc2l0aW9uIChub3QgaW1wbGVtZW50ZWQpICovCiAgICAgYXZpb193bDMyKHBiLCAxMjgpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcXVhbCB0byBzaXplIG9mIGhlYWRlciAqLwogICAgIGF2aW9fd3JpdGUocGIsIHRpbWVzdGFtcCwgMjgpOyAgICAgICAgICAgICAgLyogQVNDSUkgdGltZSBzdGFtcCAqLwogICAgIGZmaW9fZmlsbChwYiwgMCwgNjApOwpAQCAtMzMwLDExICszMjIsMTEgQEAKICAgICAgICAgZmZpb19maWxsKHBiLCAwLCAyOCk7CiAgICAgfQogCi0gICAgaWYgKHdhdi0+d3JpdGVfcGVhayAhPSAyKSB7CisgICAgaWYgKHdhdi0+d3JpdGVfcGVhayAhPSBQRUFLX09OTFkpIHsKICAgICAgICAgLyogZm9ybWF0IGhlYWRlciAqLwogICAgICAgICBmbXQgPSBmZl9zdGFydF90YWcocGIsICJmbXQgIik7Ci0gICAgICAgIGlmIChmZl9wdXRfd2F2X2hlYWRlcihwYiwgcy0+c3RyZWFtc1swXS0+Y29kZWMsIDApIDwgMCkgewotICAgICAgICAgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCk7CisgICAgICAgIGlmIChmZl9wdXRfd2F2X2hlYWRlcihzLCBwYiwgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXIsIDApIDwgMCkgeworICAgICAgICAgICAgY29uc3QgQVZDb2RlY0Rlc2NyaXB0b3IgKmRlc2MgPSBhdmNvZGVjX2Rlc2NyaXB0b3JfZ2V0KHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jb2RlY19pZCk7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXMgY29kZWMgbm90IHN1cHBvcnRlZCBpbiBXQVZFIGZvcm1hdFxuIiwKICAgICAgICAgICAgICAgICAgICBkZXNjID8gZGVzYy0+bmFtZSA6ICJ1bmtub3duIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOwpAQCAtMzQyLDggKzMzNCw4IEBACiAgICAgICAgIGZmX2VuZF90YWcocGIsIGZtdCk7CiAgICAgfQogCi0gICAgaWYgKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190YWcgIT0gMHgwMSAvKiBoZW5jZSBmb3IgYWxsIG90aGVyIHRoYW4gUENNICovCi0gICAgICAgICYmIHMtPnBiLT5zZWVrYWJsZSkgeworICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfdGFnICE9IDB4MDEgLyogaGVuY2UgZm9yIGFsbCBvdGhlciB0aGFuIFBDTSAqLworICAgICAgICAmJiAocy0+cGItPnNlZWthYmxlICYgQVZJT19TRUVLQUJMRV9OT1JNQUwpKSB7CiAgICAgICAgIHdhdi0+ZmFjdF9wb3MgPSBmZl9zdGFydF90YWcocGIsICJmYWN0Iik7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7CiAgICAgICAgIGZmX2VuZF90YWcocGIsIHdhdi0+ZmFjdF9wb3MpOwpAQCAtMzU4LDExICszNTAsMTEgQEAKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzLT5zdHJlYW1zWzBdLCA2NCwgMSwgcy0+c3RyZWFtc1swXS0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHMtPnN0cmVhbXNbMF0sIDY0LCAxLCBzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogICAgIHdhdi0+bWF4cHRzID0gd2F2LT5sYXN0X2R1cmF0aW9uID0gMDsKICAgICB3YXYtPm1pbnB0cyA9IElOVDY0X01BWDsKIAotICAgIGlmICh3YXYtPndyaXRlX3BlYWsgIT0gMikgeworICAgIGlmICh3YXYtPndyaXRlX3BlYWsgIT0gUEVBS19PTkxZKSB7CiAgICAgICAgIC8qIGluZm8gaGVhZGVyICovCiAgICAgICAgIGZmX3JpZmZfd3JpdGVfaW5mbyhzKTsKIApAQCAtMzgwLDcgKzM3Miw3IEBACiAgICAgQVZJT0NvbnRleHQgKnBiICA9IHMtPnBiOwogICAgIFdBVk11eENvbnRleHQgICAgKndhdiA9IHMtPnByaXZfZGF0YTsKIAotICAgIGlmICh3YXYtPndyaXRlX3BlYWsgIT0gMikKKyAgICBpZiAod2F2LT53cml0ZV9wZWFrICE9IFBFQUtfT05MWSkKICAgICAgICAgYXZpb193cml0ZShwYiwgcGt0LT5kYXRhLCBwa3QtPnNpemUpOwogCiAgICAgaWYgKHdhdi0+d3JpdGVfcGVhaykgewpAQCAtMzk0LDcgKzM4Niw3IEBACiAgICAgICAgICAgICAgICAgd2F2LT5wZWFrX21heHBvc1tjXSA9IEZGTUFYKHdhdi0+cGVha19tYXhwb3NbY10sIChpbnQxNl90KUFWX1JMMTYocGt0LT5kYXRhICsgaSkpOwogICAgICAgICAgICAgICAgIHdhdi0+cGVha19tYXhuZWdbY10gPSBGRk1JTih3YXYtPnBlYWtfbWF4bmVnW2NdLCAoaW50MTZfdClBVl9STDE2KHBrdC0+ZGF0YSArIGkpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgrK2MgPT0gcy0+c3RyZWFtc1swXS0+Y29kZWMtPmNoYW5uZWxzKSB7CisgICAgICAgICAgICBpZiAoKytjID09IHMtPnN0cmVhbXNbMF0tPmNvZGVjcGFyLT5jaGFubmVscykgewogICAgICAgICAgICAgICAgIGMgPSAwOwogICAgICAgICAgICAgICAgIGlmICgrK3dhdi0+cGVha19ibG9ja19wb3MgPT0gd2F2LT5wZWFrX2Jsb2NrX3NpemUpIHsKICAgICAgICAgICAgICAgICAgICAgcGVha193cml0ZV9mcmFtZShzKTsKQEAgLTQyNCw4ICs0MTYsOCBAQAogCiAgICAgYXZpb19mbHVzaChwYik7CiAKLSAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7Ci0gICAgICAgIGlmICh3YXYtPndyaXRlX3BlYWsgIT0gMiAmJiBhdmlvX3RlbGwocGIpIC0gd2F2LT5kYXRhIDwgVUlOVDMyX01BWCkgeworICAgIGlmIChzLT5wYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgeworICAgICAgICBpZiAod2F2LT53cml0ZV9wZWFrICE9IFBFQUtfT05MWSAmJiBhdmlvX3RlbGwocGIpIC0gd2F2LT5kYXRhIDwgVUlOVDMyX01BWCkgewogICAgICAgICAgICAgZmZfZW5kX3RhZyhwYiwgd2F2LT5kYXRhKTsKICAgICAgICAgICAgIGF2aW9fZmx1c2gocGIpOwogICAgICAgICB9CkBAIC00NTMsMTAgKzQ0NSwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgbnVtYmVyX29mX3NhbXBsZXMgPSBhdl9yZXNjYWxlKHdhdi0+bWF4cHRzIC0gd2F2LT5taW5wdHMgKyB3YXYtPmxhc3RfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT5jb2RlYy0+c2FtcGxlX3JhdGUgKiAoaW50NjRfdClzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICogKGludDY0X3Qpcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlLm51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZS5kZW4pOwogCi0gICAgICAgIGlmKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY190YWcgIT0gMHgwMSkgeworICAgICAgICBpZihzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfdGFnICE9IDB4MDEpIHsKICAgICAgICAgICAgIC8qIFVwZGF0ZSBudW1fc2FtcHMgaW4gZmFjdCBjaHVuayAqLwogICAgICAgICAgICAgYXZpb19zZWVrKHBiLCB3YXYtPmZhY3RfcG9zLCBTRUVLX1NFVCk7CiAgICAgICAgICAgICBpZiAocmY2NCB8fCAod2F2LT5yZjY0ID09IFJGNjRfQVVUTyAmJiBudW1iZXJfb2Zfc2FtcGxlcyA+IFVJTlQzMl9NQVgpKSB7CkBAIC01NzQsMTUgKzU2NiwxNiBAQAogICAgIGF2aW9fd2w2NChwYiwgLTEpOwogICAgIGF2aW9fd3JpdGUocGIsIGZmX3c2NF9ndWlkX3dhdmUsIHNpemVvZihmZl93NjRfZ3VpZF93YXZlKSk7CiAgICAgc3RhcnRfZ3VpZChwYiwgZmZfdzY0X2d1aWRfZm10LCAmc3RhcnQpOwotICAgIGlmICgocmV0ID0gZmZfcHV0X3dhdl9oZWFkZXIocGIsIHMtPnN0cmVhbXNbMF0tPmNvZGVjLCAwKSkgPCAwKSB7CisgICAgaWYgKChyZXQgPSBmZl9wdXRfd2F2X2hlYWRlcihzLCBwYiwgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXIsIDApKSA8IDApIHsKKyAgICAgICAgQVZDb2RlYyAqY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJXMgY29kZWMgbm90IHN1cHBvcnRlZFxuIiwKLSAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlYyA/IHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlYy0+bmFtZSA6ICJOT05FIik7CisgICAgICAgICAgICAgICBjb2RlYyA/IGNvZGVjLT5uYW1lIDogIk5PTkUiKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAgICAgZW5kX2d1aWQocGIsIHN0YXJ0KTsKIAotICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlYy0+Y29kZWNfdGFnICE9IDB4MDEgLyogaGVuY2UgZm9yIGFsbCBvdGhlciB0aGFuIFBDTSAqLwotICAgICAgICAmJiBzLT5wYi0+c2Vla2FibGUpIHsKKyAgICBpZiAocy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX3RhZyAhPSAweDAxIC8qIGhlbmNlIGZvciBhbGwgb3RoZXIgdGhhbiBQQ00gKi8KKyAgICAgICAgJiYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkgewogICAgICAgICBzdGFydF9ndWlkKHBiLCBmZl93NjRfZ3VpZF9mYWN0LCAmd2F2LT5mYWN0X3Bvcyk7CiAgICAgICAgIGF2aW9fd2w2NChwYiwgMCk7CiAgICAgICAgIGVuZF9ndWlkKHBiLCB3YXYtPmZhY3RfcG9zKTsKQEAgLTU5OSwxOCArNTkyLDE4IEBACiAgICAgV0FWTXV4Q29udGV4dCAqd2F2ID0gcy0+cHJpdl9kYXRhOwogICAgIGludDY0X3QgZmlsZV9zaXplOwogCi0gICAgaWYgKHBiLT5zZWVrYWJsZSkgeworICAgIGlmIChwYi0+c2Vla2FibGUgJiBBVklPX1NFRUtBQkxFX05PUk1BTCkgewogICAgICAgICBlbmRfZ3VpZChwYiwgd2F2LT5kYXRhKTsKIAogICAgICAgICBmaWxlX3NpemUgPSBhdmlvX3RlbGwocGIpOwogICAgICAgICBhdmlvX3NlZWsocGIsIDE2LCBTRUVLX1NFVCk7CiAgICAgICAgIGF2aW9fd2w2NChwYiwgZmlsZV9zaXplKTsKIAotICAgICAgICBpZiAocy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX3RhZyAhPSAweDAxKSB7CisgICAgICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfdGFnICE9IDB4MDEpIHsKICAgICAgICAgICAgIGludDY0X3QgbnVtYmVyX29mX3NhbXBsZXM7CiAKICAgICAgICAgICAgIG51bWJlcl9vZl9zYW1wbGVzID0gYXZfcmVzY2FsZSh3YXYtPm1heHB0cyAtIHdhdi0+bWlucHRzICsgd2F2LT5sYXN0X2R1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5zYW1wbGVfcmF0ZSAqIChpbnQ2NF90KXMtPnN0cmVhbXNbMF0tPnRpbWVfYmFzZS5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICogKGludDY0X3Qpcy0+c3RyZWFtc1swXS0+dGltZV9iYXNlLm51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5zdHJlYW1zWzBdLT50aW1lX2Jhc2UuZGVuKTsKICAgICAgICAgICAgIGF2aW9fc2VlayhwYiwgd2F2LT5mYWN0X3BvcyArIDI0LCBTRUVLX1NFVCk7CiAgICAgICAgICAgICBhdmlvX3dsNjQocGIsIG51bWJlcl9vZl9zYW1wbGVzKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3djM21vdmllLmMgYi9saWJhdmZvcm1hdC93YzNtb3ZpZS5jCmluZGV4IDA0Zjg2NjcuLmNiNGQ0ZDkgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3djM21vdmllLmMKKysrIGIvbGliYXZmb3JtYXQvd2MzbW92aWUuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBXaW5nIENvbW1hbmRlciBJSUkgTW92aWUgKC5tdmUpIEZpbGUgRGVtdXhlcgotICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgUHJvamVjdAorICogQ29weXJpZ2h0IChjKSAyMDAzIFRoZSBGRm1wZWcgcHJvamVjdAogICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCkBAIC0xNTAsOSArMTUwLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiICB1bnJlY29nbml6ZWQgV0MzIGNodW5rOiAlYyVjJWMlYyAoMHglMDJYJTAyWCUwMlglMDJYKVxuIiwKLSAgICAgICAgICAgICAgICAodWludDhfdClmb3VyY2NfdGFnLCAodWludDhfdCkoZm91cmNjX3RhZyA+PiA4KSwgKHVpbnQ4X3QpKGZvdXJjY190YWcgPj4gMTYpLCAodWludDhfdCkoZm91cmNjX3RhZyA+PiAyNCksCi0gICAgICAgICAgICAgICAgKHVpbnQ4X3QpZm91cmNjX3RhZywgKHVpbnQ4X3QpKGZvdXJjY190YWcgPj4gOCksICh1aW50OF90KShmb3VyY2NfdGFnID4+IDE2KSwgKHVpbnQ4X3QpKGZvdXJjY190YWcgPj4gMjQpKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnJlY29nbml6ZWQgV0MzIGNodW5rOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKGZvdXJjY190YWcpKTsKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICB9CiAKQEAgLTE3MCwyNyArMTY5LDI3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIFdDM19GUkFNRV9GUFMpOwogICAgIHdjMy0+dmlkZW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfWEFOX1dDMzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KLSAgICBzdC0+Y29kZWMtPndpZHRoID0gd2MzLT53aWR0aDsKLSAgICBzdC0+Y29kZWMtPmhlaWdodCA9IHdjMy0+aGVpZ2h0OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfWEFOX1dDMzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyA9IDA7ICAvKiBubyBmb3VyY2MgKi8KKyAgICBzdC0+Y29kZWNwYXItPndpZHRoID0gd2MzLT53aWR0aDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IHdjMy0+aGVpZ2h0OwogCiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgMzMsIDEsIFdDM19GUkFNRV9GUFMpOwogICAgIHdjMy0+YXVkaW9fc3RyZWFtX2luZGV4ID0gc3QtPmluZGV4OwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdGFnID0gMTsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzID0gV0MzX0FVRElPX0NIQU5ORUxTOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IFdDM19BVURJT19CSVRTOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBXQzNfU0FNUExFX1JBVEU7Ci0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlICoKLSAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7Ci0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IFdDM19BVURJT19CSVRTICogV0MzX0FVRElPX0NIQU5ORUxTOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gMTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gV0MzX0FVRElPX0NIQU5ORUxTOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IFdDM19BVURJT19CSVRTOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSBXQzNfU0FNUExFX1JBVEU7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICoKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGU7CisgICAgc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA9IFdDM19BVURJT19CSVRTICogV0MzX0FVRElPX0NIQU5ORUxTOwogCiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yNDIsOSArMjQxLDYgQEAKIAogICAgICAgICBjYXNlIFRFWFRfVEFHOgogICAgICAgICAgICAgLyogc3VidGl0bGUgY2h1bmsgKi8KLSNpZiAwCi0gICAgICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOwotI2Vsc2UKICAgICAgICAgICAgIGlmICgodW5zaWduZWQpc2l6ZSA+IHNpemVvZih0ZXh0KSB8fCAocmV0ID0gYXZpb19yZWFkKHBiLCB0ZXh0LCBzaXplKSkgIT0gc2l6ZSkKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVJTyk7CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTI2Miw3ICsyNTgsNiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICAgICAgICAgICAgICBhdl9sb2cgKHMsIEFWX0xPR19ERUJVRywgIiAgZnJvbnNheTogJXNcbiIsICZ0ZXh0W2kgKyAxXSk7CiAgICAgICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgQVVESV9UQUc6CkBAIC0yNzgsOSArMjczLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhdl9sb2cgKHMsIEFWX0xPR19FUlJPUiwgIiAgdW5yZWNvZ25pemVkIFdDMyBjaHVuazogJWMlYyVjJWMgKDB4JTAyWCUwMlglMDJYJTAyWClcbiIsCi0gICAgICAgICAgICAgICAgKHVpbnQ4X3QpZm91cmNjX3RhZywgKHVpbnQ4X3QpKGZvdXJjY190YWcgPj4gOCksICh1aW50OF90KShmb3VyY2NfdGFnID4+IDE2KSwgKHVpbnQ4X3QpKGZvdXJjY190YWcgPj4gMjQpLAotICAgICAgICAgICAgICAgICh1aW50OF90KWZvdXJjY190YWcsICh1aW50OF90KShmb3VyY2NfdGFnID4+IDgpLCAodWludDhfdCkoZm91cmNjX3RhZyA+PiAxNiksICh1aW50OF90KShmb3VyY2NfdGFnID4+IDI0KSk7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5yZWNvZ25pemVkIFdDMyBjaHVuazogJXNcbiIsCisgICAgICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cihmb3VyY2NfdGFnKSk7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgcGFja2V0X3JlYWQgPSAxOwogICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC93ZWJtX2NodW5rLmMgYi9saWJhdmZvcm1hdC93ZWJtX2NodW5rLmMKaW5kZXggMDYzZWIzYi4uN2NlYjI3NiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvd2VibV9jaHVuay5jCisrKyBiL2xpYmF2Zm9ybWF0L3dlYm1fY2h1bmsuYwpAQCAtNTAsNiArNTAsNyBAQAogICAgIGNoYXIgKmhlYWRlcl9maWxlbmFtZTsKICAgICBpbnQgY2h1bmtfZHVyYXRpb247CiAgICAgaW50IGNodW5rX2luZGV4OworICAgIGNoYXIgKmh0dHBfbWV0aG9kOwogICAgIHVpbnQ2NF90IGR1cmF0aW9uX3dyaXR0ZW47CiAgICAgaW50IHByZXZfcHRzOwogICAgIEFWT3V0cHV0Rm9ybWF0ICpvZm9ybWF0OwpAQCAtOTIsMTMgKzkzLDE0IEBACiAgICAgfQogICAgIGlmIChpc19oZWFkZXIpIHsKICAgICAgICAgaWYgKCF3Yy0+aGVhZGVyX2ZpbGVuYW1lKSB7CisgICAgICAgICAgICBhdl9sb2cob2MsIEFWX0xPR19FUlJPUiwgIk5vIGhlYWRlciBmaWxlbmFtZSBwcm92aWRlZFxuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgICAgICB9CiAgICAgICAgIGF2X3N0cmxjcHkoZmlsZW5hbWUsIHdjLT5oZWFkZXJfZmlsZW5hbWUsIHN0cmxlbih3Yy0+aGVhZGVyX2ZpbGVuYW1lKSArIDEpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChhdl9nZXRfZnJhbWVfZmlsZW5hbWUoZmlsZW5hbWUsIE1BWF9GSUxFTkFNRV9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZpbGVuYW1lLCB3Yy0+Y2h1bmtfaW5kZXggLSAxKSA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhvYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaHVuayBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnXG4iLCBzLT5maWxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+dXJsLCB3Yy0+Y2h1bmtfaW5kZXggLSAxKSA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhvYywgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBjaHVuayBmaWxlbmFtZSB0ZW1wbGF0ZSAnJXMnXG4iLCBzLT51cmwpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQogICAgIH0KQEAgLTExMCwxMiArMTEyLDE2IEBACiAgICAgV2ViTUNodW5rQ29udGV4dCAqd2MgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZGb3JtYXRDb250ZXh0ICpvYyA9IE5VTEw7CiAgICAgaW50IHJldDsKKyAgICBpbnQgaTsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOworICAgIGNoYXIgb2NfZmlsZW5hbWVbTUFYX0ZJTEVOQU1FX1NJWkVdOworICAgIGNoYXIgKm9jX3VybDsKIAogICAgIC8vIERBU0ggU3RyZWFtcyBjYW4gb25seSBoYXZlIGVpdGhlciBvbmUgdHJhY2sgcGVyIGZpbGUuCiAgICAgaWYgKHMtPm5iX3N0cmVhbXMgIT0gMSkgeyByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsgfQogCiAgICAgd2MtPmNodW5rX2luZGV4ID0gd2MtPmNodW5rX3N0YXJ0X2luZGV4OwotICAgIHdjLT5vZm9ybWF0ID0gYXZfZ3Vlc3NfZm9ybWF0KCJ3ZWJtIiwgcy0+ZmlsZW5hbWUsICJ2aWRlby93ZWJtIik7CisgICAgd2MtPm9mb3JtYXQgPSBhdl9ndWVzc19mb3JtYXQoIndlYm0iLCBzLT51cmwsICJ2aWRlby93ZWJtIik7CiAgICAgaWYgKCF3Yy0+b2Zvcm1hdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1JfTVVYRVJfTk9UX0ZPVU5EOwogCkBAIC0xMjMsMTAgKzEyOSwxNyBAQAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIG9jID0gd2MtPmF2ZjsKLSAgICByZXQgPSBnZXRfY2h1bmtfZmlsZW5hbWUocywgMSwgb2MtPmZpbGVuYW1lKTsKKyAgICByZXQgPSBnZXRfY2h1bmtfZmlsZW5hbWUocywgMSwgb2NfZmlsZW5hbWUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwotICAgIHJldCA9IHMtPmlvX29wZW4ocywgJm9jLT5wYiwgb2MtPmZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwpOworICAgIG9jX3VybCA9IGF2X3N0cmR1cChvY19maWxlbmFtZSk7CisgICAgaWYgKCFvY191cmwpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgZmZfZm9ybWF0X3NldF91cmwob2MsIG9jX3VybCk7CisgICAgaWYgKHdjLT5odHRwX21ldGhvZCkKKyAgICAgICAgYXZfZGljdF9zZXQoJm9wdGlvbnMsICJtZXRob2QiLCB3Yy0+aHR0cF9tZXRob2QsIDApOworICAgIHJldCA9IHMtPmlvX29wZW4ocywgJm9jLT5wYiwgb2MtPnVybCwgQVZJT19GTEFHX1dSSVRFLCAmb3B0aW9ucyk7CisgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKIApAQCAtMTM1LDYgKzE0OCwxMCBAQAogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIGZmX2Zvcm1hdF9pb19jbG9zZShzLCAmb2MtPnBiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcy0+bmJfc3RyZWFtczsgaSsrKSB7CisgICAgICAgIC8vIG1zIHByZWNpc2lvbiBpcyB0aGUgZGUtZmFjdG8gc3RhbmRhcmQgdGltZXNjYWxlIGZvciBta3YgZmlsZXMuCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8ocy0+c3RyZWFtc1tpXSwgNjQsIDEsIDEwMDApOworICAgIH0KICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTYwLDYgKzE3Nyw3IEBACiAgICAgdWludDhfdCAqYnVmZmVyOwogICAgIEFWSU9Db250ZXh0ICpwYjsKICAgICBjaGFyIGZpbGVuYW1lW01BWF9GSUxFTkFNRV9TSVpFXTsKKyAgICBBVkRpY3Rpb25hcnkgKm9wdGlvbnMgPSBOVUxMOwogCiAgICAgaWYgKHdjLT5jaHVua19zdGFydF9pbmRleCA9PSB3Yy0+Y2h1bmtfaW5kZXgpCiAgICAgICAgIHJldHVybiAwOwpAQCAtMTY5LDEzICsxODcsMTYgQEAKICAgICByZXQgPSBnZXRfY2h1bmtfZmlsZW5hbWUocywgMCwgZmlsZW5hbWUpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGZhaWw7Ci0gICAgcmV0ID0gcy0+aW9fb3BlbihzLCAmcGIsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwpOworICAgIGlmICh3Yy0+aHR0cF9tZXRob2QpCisgICAgICAgIGF2X2RpY3Rfc2V0KCZvcHRpb25zLCAibWV0aG9kIiwgd2MtPmh0dHBfbWV0aG9kLCAwKTsKKyAgICByZXQgPSBzLT5pb19vcGVuKHMsICZwYiwgZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwgJm9wdGlvbnMpOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAgICAgYXZpb193cml0ZShwYiwgYnVmZmVyLCBidWZmZXJfc2l6ZSk7CiAgICAgZmZfZm9ybWF0X2lvX2Nsb3NlKHMsICZwYik7CiAgICAgb2MtPnBiID0gTlVMTDsKIGZhaWw6CisgICAgYXZfZGljdF9mcmVlKCZvcHRpb25zKTsKICAgICBhdl9mcmVlKGJ1ZmZlcik7CiAgICAgcmV0dXJuIChyZXQgPCAwKSA/IHJldCA6IDA7CiB9CkBAIC0xODcsNyArMjA4LDcgQEAKICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKICAgICBpbnQgcmV0OwogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykgewogICAgICAgICB3Yy0+ZHVyYXRpb25fd3JpdHRlbiArPSBhdl9yZXNjYWxlX3EocGt0LT5wdHMgLSB3Yy0+cHJldl9wdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+dGltZV9iYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFWUmF0aW9uYWwpIHsxLCAxMDAwfSk7CkBAIC0xOTYsOSArMjE3LDkgQEAKIAogICAgIC8vIEZvciB2aWRlbywgYSBuZXcgY2h1bmsgaXMgc3RhcnRlZCBvbmx5IG9uIGtleSBmcmFtZXMuIEZvciBhdWRpbywgYSBuZXcKICAgICAvLyBjaHVuayBpcyBzdGFydGVkIGJhc2VkIG9uIGNodW5rX2R1cmF0aW9uLgotICAgIGlmICgoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgorICAgIGlmICgoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJgogICAgICAgICAgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpKSB8fAotICAgICAgICAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgorICAgICAgICAoc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyAmJgogICAgICAgICAgKHBrdC0+cHRzID09IDAgfHwgd2MtPmR1cmF0aW9uX3dyaXR0ZW4gPj0gd2MtPmNodW5rX2R1cmF0aW9uKSkpIHsKICAgICAgICAgd2MtPmR1cmF0aW9uX3dyaXR0ZW4gPSAwOwogICAgICAgICBpZiAoKHJldCA9IGNodW5rX2VuZChzKSkgPCAwIHx8IChyZXQgPSBjaHVua19zdGFydChzKSkgPCAwKSB7CkBAIC0yMzcsNiArMjU4LDcgQEAKICAgICB7ICJjaHVua19zdGFydF9pbmRleCIsICAic3RhcnQgaW5kZXggb2YgdGhlIGNodW5rIiwgT0ZGU0VUKGNodW5rX3N0YXJ0X2luZGV4KSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAogICAgIHsgImhlYWRlciIsICJmaWxlbmFtZSBvZiB0aGUgaGVhZGVyIHdoZXJlIHRoZSBpbml0aWFsaXphdGlvbiBkYXRhIHdpbGwgYmUgd3JpdHRlbiIsIE9GRlNFVChoZWFkZXJfZmlsZW5hbWUpLCBBVl9PUFRfVFlQRV9TVFJJTkcsIHsgMCB9LCAwLCAwLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAogICAgIHsgImF1ZGlvX2NodW5rX2R1cmF0aW9uIiwgImR1cmF0aW9uIG9mIGVhY2ggY2h1bmsgaW4gbWlsbGlzZWNvbmRzIiwgT0ZGU0VUKGNodW5rX2R1cmF0aW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDUwMDB9LCAwLCBJTlRfTUFYLCBBVl9PUFRfRkxBR19FTkNPRElOR19QQVJBTSB9LAorICAgIHsgIm1ldGhvZCIsICJzZXQgdGhlIEhUVFAgbWV0aG9kIiwgT0ZGU0VUKGh0dHBfbWV0aG9kKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAgMCwgMCwgQVZfT1BUX0ZMQUdfRU5DT0RJTkdfUEFSQU0gfSwKICAgICB7IE5VTEwgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3dlYm1kYXNoZW5jLmMgYi9saWJhdmZvcm1hdC93ZWJtZGFzaGVuYy5jCmluZGV4IDMwMWMwNDUuLjI2Yjg3MjcgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3dlYm1kYXNoZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvd2VibWRhc2hlbmMuYwpAQCAtMTUyLDE3ICsxNTIsMTcgQEAKICAgICBpbnQgaTsKICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqZ29sZF90cmFja19udW0gPSBhdl9kaWN0X2dldChzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+bWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0tfTlVNQkVSLCBOVUxMLCAwKTsKLSAgICBBVkNvZGVjQ29udGV4dCAqZ29sZF9jb2RlYyA9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbMF1dLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqZ29sZF9wYXIgPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+Y29kZWNwYXI7CiAgICAgaWYgKCFnb2xkX3RyYWNrX251bSkgcmV0dXJuIDA7CiAgICAgZm9yIChpID0gMTsgaSA8IGFzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKnRyYWNrX251bSA9IGF2X2RpY3RfZ2V0KHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbaV1dLT5tZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNLX05VTUJFUiwgTlVMTCwgMCk7Ci0gICAgICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbaV1dLT5jb2RlYzsKKyAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbaV1dLT5jb2RlY3BhcjsKICAgICAgICAgaWYgKCF0cmFja19udW0gfHwKICAgICAgICAgICAgIHN0cm5jbXAoZ29sZF90cmFja19udW0tPnZhbHVlLCB0cmFja19udW0tPnZhbHVlLCBzdHJsZW4oZ29sZF90cmFja19udW0tPnZhbHVlKSkgfHwKLSAgICAgICAgICAgIGdvbGRfY29kZWMtPmNvZGVjX2lkICE9IGNvZGVjLT5jb2RlY19pZCB8fAotICAgICAgICAgICAgZ29sZF9jb2RlYy0+ZXh0cmFkYXRhX3NpemUgIT0gY29kZWMtPmV4dHJhZGF0YV9zaXplIHx8Ci0gICAgICAgICAgICBtZW1jbXAoZ29sZF9jb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBnb2xkX3Bhci0+Y29kZWNfaWQgIT0gcGFyLT5jb2RlY19pZCB8fAorICAgICAgICAgICAgZ29sZF9wYXItPmV4dHJhZGF0YV9zaXplICE9IHBhci0+ZXh0cmFkYXRhX3NpemUgfHwKKyAgICAgICAgICAgIG1lbWNtcChnb2xkX3Bhci0+ZXh0cmFkYXRhLCBwYXItPmV4dHJhZGF0YSwgcGFyLT5leHRyYWRhdGFfc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CiAgICAgfQpAQCAtMTgyLDI1ICsxODIsMzAgQEAKICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqY3Vlc19lbmQgPSBhdl9kaWN0X2dldChzdHJlYW0tPm1ldGFkYXRhLCBDVUVTX0VORCwgTlVMTCwgMCk7CiAgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmZpbGVuYW1lID0gYXZfZGljdF9nZXQoc3RyZWFtLT5tZXRhZGF0YSwgRklMRU5BTUUsIE5VTEwsIDApOwogICAgIEFWRGljdGlvbmFyeUVudHJ5ICpiYW5kd2lkdGggPSBhdl9kaWN0X2dldChzdHJlYW0tPm1ldGFkYXRhLCBCQU5EV0lEVEgsIE5VTEwsIDApOworICAgIGNvbnN0IGNoYXIgKmJhbmR3aWR0aF9zdHI7CiAgICAgaWYgKCh3LT5pc19saXZlICYmICghZmlsZW5hbWUpKSB8fAogICAgICAgICAoIXctPmlzX2xpdmUgJiYgKCFpcmFuZ2UgfHwgIWN1ZXNfc3RhcnQgfHwgIWN1ZXNfZW5kIHx8ICFmaWxlbmFtZSB8fCAhYmFuZHdpZHRoKSkpIHsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgfQogICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiPFJlcHJlc2VudGF0aW9uIGlkPVwiJXNcIiIsIGlkKTsKLSAgICAvLyBGSVhNRTogRm9yIGxpdmUsIFRoaXMgc2hvdWxkIGJlIG9idGFpbmVkIGZyb20gdGhlIGlucHV0IGZpbGUgb3IgYXMgYW4gQVZPcHRpb24uCi0gICAgYXZpb19wcmludGYocy0+cGIsICIgYmFuZHdpZHRoPVwiJXNcIiIsCi0gICAgICAgICAgICAgICAgdy0+aXNfbGl2ZSA/IChzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9BVURJTyA/ICIxMjgwMDAiIDogIjEwMDAwMDAiKSA6IGJhbmR3aWR0aC0+dmFsdWUpOwotICAgIGlmIChzdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBvdXRwdXRfd2lkdGgpCi0gICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIHdpZHRoPVwiJWRcIiIsIHN0cmVhbS0+Y29kZWMtPndpZHRoKTsKLSAgICBpZiAoc3RyZWFtLT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgb3V0cHV0X2hlaWdodCkKLSAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIgaGVpZ2h0PVwiJWRcIiIsIHN0cmVhbS0+Y29kZWMtPmhlaWdodCk7Ci0gICAgaWYgKHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIG91dHB1dF9zYW1wbGVfcmF0ZSkKLSAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIgYXVkaW9TYW1wbGluZ1JhdGU9XCIlZFwiIiwgc3RyZWFtLT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIC8vIGlmIGJhbmR3aWR0aCBmb3IgbGl2ZSB3YXMgbm90IHByb3ZpZGVkLCB1c2UgYSBkZWZhdWx0CisgICAgaWYgKHctPmlzX2xpdmUgJiYgIWJhbmR3aWR0aCkgeworICAgICAgICBiYW5kd2lkdGhfc3RyID0gKHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSA/ICIxMjgwMDAiIDogIjEwMDAwMDAiOworICAgIH0gZWxzZSB7CisgICAgICAgIGJhbmR3aWR0aF9zdHIgPSBiYW5kd2lkdGgtPnZhbHVlOworICAgIH0KKyAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiBiYW5kd2lkdGg9XCIlc1wiIiwgYmFuZHdpZHRoX3N0cik7CisgICAgaWYgKHN0cmVhbS0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIG91dHB1dF93aWR0aCkKKyAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIgd2lkdGg9XCIlZFwiIiwgc3RyZWFtLT5jb2RlY3Bhci0+d2lkdGgpOworICAgIGlmIChzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBvdXRwdXRfaGVpZ2h0KQorICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiBoZWlnaHQ9XCIlZFwiIiwgc3RyZWFtLT5jb2RlY3Bhci0+aGVpZ2h0KTsKKyAgICBpZiAoc3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgb3V0cHV0X3NhbXBsZV9yYXRlKQorICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiBhdWRpb1NhbXBsaW5nUmF0ZT1cIiVkXCIiLCBzdHJlYW0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgaWYgKHctPmlzX2xpdmUpIHsKICAgICAgICAgLy8gRm9yIGxpdmUgc3RyZWFtcywgQ29kZWMgYW5kIE1pbWUgVHlwZSBhbHdheXMgZ28gaW4gdGhlIFJlcHJlc2VudGF0aW9uIHRhZy4KLSAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIgY29kZWNzPVwiJXNcIiIsIGdldF9jb2RlY19uYW1lKHN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkKSk7CisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIGNvZGVjcz1cIiVzXCIiLCBnZXRfY29kZWNfbmFtZShzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY19pZCkpOwogICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiBtaW1lVHlwZT1cIiVzL3dlYm1cIiIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmNvZGVjcGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyA/ICJ2aWRlbyIgOiAiYXVkaW8iKTsKICAgICAgICAgLy8gRm9yIGxpdmUgc3RyZWFtcywgc3Vic2VnbWVudHMgYWx3YXlzIHN0YXJ0IHdpdGgga2V5IGZyYW1lcy4gU28gdGhpcwogICAgICAgICAvLyBpcyBhbHdheXMgMS4KICAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIgc3RhcnRzV2l0aFNBUD1cIjFcIiIpOwpAQCAtMjI0LDkgKzIyOSw5IEBACiBzdGF0aWMgaW50IGNoZWNrX21hdGNoaW5nX3dpZHRoKEFWRm9ybWF0Q29udGV4dCAqcywgQWRhcHRhdGlvblNldCAqYXMpIHsKICAgICBpbnQgZmlyc3Rfd2lkdGgsIGk7CiAgICAgaWYgKGFzLT5uYl9zdHJlYW1zIDwgMikgcmV0dXJuIDE7Ci0gICAgZmlyc3Rfd2lkdGggPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+Y29kZWMtPndpZHRoOworICAgIGZpcnN0X3dpZHRoID0gcy0+c3RyZWFtc1thcy0+c3RyZWFtc1swXV0tPmNvZGVjcGFyLT53aWR0aDsKICAgICBmb3IgKGkgPSAxOyBpIDwgYXMtPm5iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgaWYgKGZpcnN0X3dpZHRoICE9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbaV1dLT5jb2RlYy0+d2lkdGgpCisgICAgICAgIGlmIChmaXJzdF93aWR0aCAhPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zW2ldXS0+Y29kZWNwYXItPndpZHRoKQogICAgICAgICAgIHJldHVybiAwOwogICAgIHJldHVybiAxOwogfQpAQCAtMjM3LDkgKzI0Miw5IEBACiBzdGF0aWMgaW50IGNoZWNrX21hdGNoaW5nX2hlaWdodChBVkZvcm1hdENvbnRleHQgKnMsIEFkYXB0YXRpb25TZXQgKmFzKSB7CiAgICAgaW50IGZpcnN0X2hlaWdodCwgaTsKICAgICBpZiAoYXMtPm5iX3N0cmVhbXMgPCAyKSByZXR1cm4gMTsKLSAgICBmaXJzdF9oZWlnaHQgPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+Y29kZWMtPmhlaWdodDsKKyAgICBmaXJzdF9oZWlnaHQgPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+Y29kZWNwYXItPmhlaWdodDsKICAgICBmb3IgKGkgPSAxOyBpIDwgYXMtPm5iX3N0cmVhbXM7IGkrKykKLSAgICAgICAgaWYgKGZpcnN0X2hlaWdodCAhPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zW2ldXS0+Y29kZWMtPmhlaWdodCkKKyAgICAgICAgaWYgKGZpcnN0X2hlaWdodCAhPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zW2ldXS0+Y29kZWNwYXItPmhlaWdodCkKICAgICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gMTsKIH0KQEAgLTI1MCw5ICsyNTUsOSBAQAogc3RhdGljIGludCBjaGVja19tYXRjaGluZ19zYW1wbGVfcmF0ZShBVkZvcm1hdENvbnRleHQgKnMsIEFkYXB0YXRpb25TZXQgKmFzKSB7CiAgICAgaW50IGZpcnN0X3NhbXBsZV9yYXRlLCBpOwogICAgIGlmIChhcy0+bmJfc3RyZWFtcyA8IDIpIHJldHVybiAxOwotICAgIGZpcnN0X3NhbXBsZV9yYXRlID0gcy0+c3RyZWFtc1thcy0+c3RyZWFtc1swXV0tPmNvZGVjLT5zYW1wbGVfcmF0ZTsKKyAgICBmaXJzdF9zYW1wbGVfcmF0ZSA9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbMF1dLT5jb2RlY3Bhci0+c2FtcGxlX3JhdGU7CiAgICAgZm9yIChpID0gMTsgaSA8IGFzLT5uYl9zdHJlYW1zOyBpKyspCi0gICAgICAgIGlmIChmaXJzdF9zYW1wbGVfcmF0ZSAhPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zW2ldXS0+Y29kZWMtPnNhbXBsZV9yYXRlKQorICAgICAgICBpZiAoZmlyc3Rfc2FtcGxlX3JhdGUgIT0gcy0+c3RyZWFtc1thcy0+c3RyZWFtc1tpXV0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSkKICAgICAgICAgICByZXR1cm4gMDsKICAgICByZXR1cm4gMTsKIH0KQEAgLTI4MywzMyArMjg4LDU1IEBACiAgICAgY2hhciAqcGVyaW9kX3BvcyA9IE5VTEw7CiAgICAgY2hhciAqdGVtcF9wb3MgPSBOVUxMOwogICAgIGNoYXIgKmZpbGVuYW1lX3N0ciA9IGF2X3N0cmR1cChmaWxlbmFtZSk7Ci0gICAgaWYgKCFmaWxlbmFtZV9zdHIpIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIWZpbGVuYW1lX3N0cikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KICAgICB0ZW1wX3BvcyA9IGF2X3N0cmlzdHIoZmlsZW5hbWVfc3RyLCAiXyIpOwogICAgIHdoaWxlICh0ZW1wX3BvcykgewogICAgICAgICB1bmRlcnNjb3JlX3BvcyA9IHRlbXBfcG9zICsgMTsKICAgICAgICAgdGVtcF9wb3MgPSBhdl9zdHJpc3RyKHRlbXBfcG9zICsgMSwgIl8iKTsKICAgICB9Ci0gICAgaWYgKCF1bmRlcnNjb3JlX3BvcykgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisgICAgaWYgKCF1bmRlcnNjb3JlX3BvcykgeworICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CiAgICAgcGVyaW9kX3BvcyA9IGF2X3N0cmlzdHIodW5kZXJzY29yZV9wb3MsICIuIik7Ci0gICAgaWYgKCFwZXJpb2RfcG9zKSByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICBpZiAoIXBlcmlvZF9wb3MpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfQogICAgICoodW5kZXJzY29yZV9wb3MgLSAxKSA9IDA7CiAgICAgaWYgKHJlcHJlc2VudGF0aW9uX2lkKSB7CiAgICAgICAgICpyZXByZXNlbnRhdGlvbl9pZCA9IGF2X21hbGxvYyhwZXJpb2RfcG9zIC0gdW5kZXJzY29yZV9wb3MgKyAxKTsKLSAgICAgICAgaWYgKCEoKnJlcHJlc2VudGF0aW9uX2lkKSkgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKCEoKnJlcHJlc2VudGF0aW9uX2lkKSkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KICAgICAgICAgYXZfc3RybGNweSgqcmVwcmVzZW50YXRpb25faWQsIHVuZGVyc2NvcmVfcG9zLCBwZXJpb2RfcG9zIC0gdW5kZXJzY29yZV9wb3MgKyAxKTsKICAgICB9CiAgICAgaWYgKGluaXRpYWxpemF0aW9uX3BhdHRlcm4pIHsKICAgICAgICAgKmluaXRpYWxpemF0aW9uX3BhdHRlcm4gPSBhdl9hc3ByaW50ZigiJXNfJFJlcHJlc2VudGF0aW9uSUQkLmhkciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVfc3RyKTsKLSAgICAgICAgaWYgKCEoKmluaXRpYWxpemF0aW9uX3BhdHRlcm4pKSByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBpZiAoISgqaW5pdGlhbGl6YXRpb25fcGF0dGVybikpIHsKKyAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChtZWRpYV9wYXR0ZXJuKSB7CiAgICAgICAgICptZWRpYV9wYXR0ZXJuID0gYXZfYXNwcmludGYoIiVzXyRSZXByZXNlbnRhdGlvbklEJF8kTnVtYmVyJC5jaGsiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lX3N0cik7Ci0gICAgICAgIGlmICghKCptZWRpYV9wYXR0ZXJuKSkgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgaWYgKCEoKm1lZGlhX3BhdHRlcm4pKSB7CisgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQogICAgIH0KLSAgICBhdl9mcmVlKGZpbGVuYW1lX3N0cik7Ci0gICAgcmV0dXJuIDA7CisKK2VuZDoKKyAgICBhdl9mcmVlcCgmZmlsZW5hbWVfc3RyKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKgpAQCAtMzE5LDcgKzM0Niw3IEBACiB7CiAgICAgV2ViTURhc2hNdXhDb250ZXh0ICp3ID0gcy0+cHJpdl9kYXRhOwogICAgIEFkYXB0YXRpb25TZXQgKmFzID0gJnctPmFzW2FzX2luZGV4XTsKLSAgICBBVkNvZGVjQ29udGV4dCAqY29kZWMgPSBzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbYXMtPnN0cmVhbXNbMF1dLT5jb2RlY3BhcjsKICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqbGFuZzsKICAgICBpbnQgaTsKICAgICBzdGF0aWMgY29uc3QgY2hhciBib29sZWFuWzJdWzZdID0geyAiZmFsc2UiLCAidHJ1ZSIgfTsKQEAgLTMzMCw3ICszNTcsNyBAQAogICAgIC8vIG9uIHRoZWlyIHJlc3BlY3RpdmUgUmVwcmVzZW50YXRpb24gdGFnLiBGb3IgbGl2ZSBzdHJlYW1zLCB0aGV5IGFsd2F5cyBnbwogICAgIC8vIGluIHRoZSBSZXByZXNlbnRhdGlvbiB0YWcuCiAgICAgaW50IHdpZHRoX2luX2FzID0gMSwgaGVpZ2h0X2luX2FzID0gMSwgc2FtcGxlX3JhdGVfaW5fYXMgPSAxOwotICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8pIHsKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgewogICAgICAgd2lkdGhfaW5fYXMgPSAhdy0+aXNfbGl2ZSAmJiBjaGVja19tYXRjaGluZ193aWR0aChzLCBhcyk7CiAgICAgICBoZWlnaHRfaW5fYXMgPSAhdy0+aXNfbGl2ZSAmJiBjaGVja19tYXRjaGluZ19oZWlnaHQocywgYXMpOwogICAgIH0gZWxzZSB7CkBAIC0zMzksMTggKzM2NiwxOCBAQAogCiAgICAgYXZpb19wcmludGYocy0+cGIsICI8QWRhcHRhdGlvblNldCBpZD1cIiVzXCIiLCBhcy0+aWQpOwogICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIG1pbWVUeXBlPVwiJXMvd2VibVwiIiwKLSAgICAgICAgICAgICAgICBjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gPyAidmlkZW8iIDogImF1ZGlvIik7Ci0gICAgYXZpb19wcmludGYocy0+cGIsICIgY29kZWNzPVwiJXNcIiIsIGdldF9jb2RlY19uYW1lKGNvZGVjLT5jb2RlY19pZCkpOworICAgICAgICAgICAgICAgIHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gPyAidmlkZW8iIDogImF1ZGlvIik7CisgICAgYXZpb19wcmludGYocy0+cGIsICIgY29kZWNzPVwiJXNcIiIsIGdldF9jb2RlY19uYW1lKHBhci0+Y29kZWNfaWQpKTsKIAogICAgIGxhbmcgPSBhdl9kaWN0X2dldChzLT5zdHJlYW1zW2FzLT5zdHJlYW1zWzBdXS0+bWV0YWRhdGEsICJsYW5ndWFnZSIsIE5VTEwsIDApOwogICAgIGlmIChsYW5nKSBhdmlvX3ByaW50ZihzLT5wYiwgIiBsYW5nPVwiJXNcIiIsIGxhbmctPnZhbHVlKTsKIAotICAgIGlmIChjb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgd2lkdGhfaW5fYXMpCi0gICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIHdpZHRoPVwiJWRcIiIsIGNvZGVjLT53aWR0aCk7Ci0gICAgaWYgKGNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBoZWlnaHRfaW5fYXMpCi0gICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIGhlaWdodD1cIiVkXCIiLCBjb2RlYy0+aGVpZ2h0KTsKLSAgICBpZiAoY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPICYmIHNhbXBsZV9yYXRlX2luX2FzKQotICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiBhdWRpb1NhbXBsaW5nUmF0ZT1cIiVkXCIiLCBjb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGlmIChwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIHdpZHRoX2luX2FzKQorICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIiB3aWR0aD1cIiVkXCIiLCBwYXItPndpZHRoKTsKKyAgICBpZiAocGFyLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTyAmJiBoZWlnaHRfaW5fYXMpCisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIGhlaWdodD1cIiVkXCIiLCBwYXItPmhlaWdodCk7CisgICAgaWYgKHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8gJiYgc2FtcGxlX3JhdGVfaW5fYXMpCisgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIGF1ZGlvU2FtcGxpbmdSYXRlPVwiJWRcIiIsIHBhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgYXZpb19wcmludGYocy0+cGIsICIgYml0c3RyZWFtU3dpdGNoaW5nPVwiJXNcIiIsCiAgICAgICAgICAgICAgICAgYm9vbGVhbltiaXRzdHJlYW1fc3dpdGNoaW5nKHMsIGFzKV0pOwpAQCAtMzc0LDcgKzQwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVkaWFfcGF0dGVybik7CiAgICAgICAgIGlmIChyZXQpIHJldHVybiByZXQ7CiAgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiPENvbnRlbnRDb21wb25lbnQgaWQ9XCIxXCIgdHlwZT1cIiVzXCIvPlxuIiwKLSAgICAgICAgICAgICAgICAgICAgY29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8gInZpZGVvIiA6ICJhdWRpbyIpOworICAgICAgICAgICAgICAgICAgICBwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPID8gInZpZGVvIiA6ICJhdWRpbyIpOwogICAgICAgICBhdmlvX3ByaW50ZihzLT5wYiwgIjxTZWdtZW50VGVtcGxhdGUiKTsKICAgICAgICAgYXZpb19wcmludGYocy0+cGIsICIgdGltZXNjYWxlPVwiMTAwMFwiIik7CiAgICAgICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiIGR1cmF0aW9uPVwiJWRcIiIsIHctPmNodW5rX2R1cmF0aW9uKTsKQEAgLTQyOCw2ICs0NTUsMTAgQEAKICAgICBjaGFyICpwID0gdy0+YWRhcHRhdGlvbl9zZXRzOwogICAgIGNoYXIgKnE7CiAgICAgZW51bSB7IG5ld19zZXQsIHBhcnNlZF9pZCwgcGFyc2luZ19zdHJlYW1zIH0gc3RhdGU7CisgICAgaWYgKCF3LT5hZGFwdGF0aW9uX3NldHMpIHsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRoZSAnYWRhcHRhdGlvbl9zZXRzJyBvcHRpb24gbXVzdCBiZSBzZXQuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CiAgICAgLy8gc3ludGF4IGlkPTAsc3RyZWFtcz0wLDEsMiBpZD0xLHN0cmVhbXM9Myw0IGFuZCBzbyBvbgogICAgIHN0YXRlID0gbmV3X3NldDsKICAgICB3aGlsZSAocCA8IHctPmFkYXB0YXRpb25fc2V0cyArIHN0cmxlbih3LT5hZGFwdGF0aW9uX3NldHMpKSB7CkBAIC00MzUsNiArNDY2LDcgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PSBuZXdfc2V0ICYmICFzdHJuY21wKHAsICJpZD0iLCAzKSkgewogICAgICAgICAgICAgdm9pZCAqbWVtID0gYXZfcmVhbGxvYyh3LT5hcywgc2l6ZW9mKCp3LT5hcykgKiAody0+bmJfYXMgKyAxKSk7CisgICAgICAgICAgICBjb25zdCBjaGFyICpjb21tYTsKICAgICAgICAgICAgIGlmIChtZW0gPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgdy0+YXMgPSBtZW07CkBAIC00NDMsNiArNDc1LDExIEBACiAgICAgICAgICAgICB3LT5hc1t3LT5uYl9hcyAtIDFdLnN0cmVhbXMgPSBOVUxMOwogICAgICAgICAgICAgcCArPSAzOyAvLyBjb25zdW1lICJpZD0iCiAgICAgICAgICAgICBxID0gdy0+YXNbdy0+bmJfYXMgLSAxXS5pZDsKKyAgICAgICAgICAgIGNvbW1hID0gc3RyY2hyKHAsICcsJyk7CisgICAgICAgICAgICBpZiAoIWNvbW1hIHx8IGNvbW1hIC0gcCA+PSBzaXplb2Yody0+YXNbdy0+bmJfYXMgLSAxXS5pZCkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJ2lkJyBpbiAnYWRhcHRhdGlvbl9zZXRzJyBpcyBtYWxmb3JtZWQuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgd2hpbGUgKCpwICE9ICcsJykgKnErKyA9ICpwKys7CiAgICAgICAgICAgICAqcSA9IDA7CiAgICAgICAgICAgICBwKys7CkBAIC00NTgsNyArNDk1LDExIEBACiAgICAgICAgICAgICBpZiAoYXMtPnN0cmVhbXMgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICAgICAgYXMtPnN0cmVhbXNbYXMtPm5iX3N0cmVhbXMgLSAxXSA9IHRvX2ludGVnZXIocCwgcSAtIHAgKyAxKTsKLSAgICAgICAgICAgIGlmIChhcy0+c3RyZWFtc1thcy0+bmJfc3RyZWFtcyAtIDFdIDwgMCkgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKGFzLT5zdHJlYW1zW2FzLT5uYl9zdHJlYW1zIC0gMV0gPCAwIHx8CisgICAgICAgICAgICAgICAgYXMtPnN0cmVhbXNbYXMtPm5iX3N0cmVhbXMgLSAxXSA+PSBzLT5uYl9zdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgdmFsdWUgZm9yICdzdHJlYW1zJyBpbiBhZGFwYXRpb25fc2V0cy5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKnEgPT0gJ1wwJykgYnJlYWs7CiAgICAgICAgICAgICBpZiAoKnEgPT0gJyAnKSBzdGF0ZSA9IG5ld19zZXQ7CiAgICAgICAgICAgICBwID0gKytxOwpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvd2VicGVuYy5jIGIvbGliYXZmb3JtYXQvd2VicGVuYy5jCmluZGV4IDJhMjE3MzAuLjlmYjQ3MjIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3dlYnBlbmMuYworKysgYi9saWJhdmZvcm1hdC93ZWJwZW5jLmMKQEAgLTQyLDcgKzQyLDcgQEAKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAgICAgc3QgPSBzLT5zdHJlYW1zWzBdOwotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dFQlApIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XRUJQKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJPbmx5IFdlYlAgaXMgc3VwcG9ydGVkXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CkBAIC0xMTUsOCArMTE1LDggQEAKICAgICAgICAgICAgICAgICBhdmlvX3dsMzIocy0+cGIsIDEwKTsKICAgICAgICAgICAgICAgICBhdmlvX3c4KHMtPnBiLCBmbGFncyk7CiAgICAgICAgICAgICAgICAgYXZpb193bDI0KHMtPnBiLCAwKTsKLSAgICAgICAgICAgICAgICBhdmlvX3dsMjQocy0+cGIsIHN0LT5jb2RlYy0+d2lkdGggLSAxKTsKLSAgICAgICAgICAgICAgICBhdmlvX3dsMjQocy0+cGIsIHN0LT5jb2RlYy0+aGVpZ2h0IC0gMSk7CisgICAgICAgICAgICAgICAgYXZpb193bDI0KHMtPnBiLCBzdC0+Y29kZWNwYXItPndpZHRoIC0gMSk7CisgICAgICAgICAgICAgICAgYXZpb193bDI0KHMtPnBiLCBzdC0+Y29kZWNwYXItPmhlaWdodCAtIDEpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCF0cmFpbGVyKSB7CiAgICAgICAgICAgICAgICAgYXZpb193cml0ZShzLT5wYiwgIkFOSU0iLCA0KTsKQEAgLTEzMSw4ICsxMzEsOCBAQAogICAgICAgICAgICAgYXZpb193bDMyKHMtPnBiLCAxNiArIHctPmxhc3RfcGt0LnNpemUgLSBza2lwKTsKICAgICAgICAgICAgIGF2aW9fd2wyNChzLT5wYiwgMCk7CiAgICAgICAgICAgICBhdmlvX3dsMjQocy0+cGIsIDApOwotICAgICAgICAgICAgYXZpb193bDI0KHMtPnBiLCBzdC0+Y29kZWMtPndpZHRoIC0gMSk7Ci0gICAgICAgICAgICBhdmlvX3dsMjQocy0+cGIsIHN0LT5jb2RlYy0+aGVpZ2h0IC0gMSk7CisgICAgICAgICAgICBhdmlvX3dsMjQocy0+cGIsIHN0LT5jb2RlY3Bhci0+d2lkdGggLSAxKTsKKyAgICAgICAgICAgIGF2aW9fd2wyNChzLT5wYiwgc3QtPmNvZGVjcGFyLT5oZWlnaHQgLSAxKTsKICAgICAgICAgICAgIGlmICh3LT5sYXN0X3BrdC5wdHMgIT0gQVZfTk9QVFNfVkFMVUUgJiYgcHRzICE9IEFWX05PUFRTX1ZBTFVFKSB7CiAgICAgICAgICAgICAgICAgYXZpb193bDI0KHMtPnBiLCBwdHMgLSB3LT5sYXN0X3BrdC5wdHMpOwogICAgICAgICAgICAgfSBlbHNlCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgaW50IHJldDsKICAgICAgICAgaWYgKChyZXQgPSBmbHVzaChzLCAwLCBwa3QtPnB0cykpIDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIGF2X2NvcHlfcGFja2V0KCZ3LT5sYXN0X3BrdCwgcGt0KTsKKyAgICAgICAgYXZfcGFja2V0X3JlZigmdy0+bGFzdF9wa3QsIHBrdCk7CiAgICAgfQogICAgICsrdy0+ZnJhbWVfY291bnQ7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3dlYnZ0dGRlYy5jIGIvbGliYXZmb3JtYXQvd2VidnR0ZGVjLmMKaW5kZXggNDdhMzI1NS4uMGFlYjhhNiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvd2VidnR0ZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvd2VidnR0ZGVjLmMKQEAgLTY3LDggKzY3LDggQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfU1VCVElUTEU7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfV0VCVlRUOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9TVUJUSVRMRTsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9XRUJWVFQ7CiAgICAgc3QtPmRpc3Bvc2l0aW9uIHw9IHdlYnZ0dC0+a2luZDsKIAogICAgIGF2X2JwcmludF9pbml0KCZoZWFkZXIsIDAsIEFWX0JQUklOVF9TSVpFX1VOTElNSVRFRCk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC93ZWJ2dHRlbmMuYyBiL2xpYmF2Zm9ybWF0L3dlYnZ0dGVuYy5jCmluZGV4IGMzODY1MzguLjQ4MjdkZTAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3dlYnZ0dGVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3dlYnZ0dGVuYy5jCkBAIC00NiwxMCArNDYsMTAgQEAKIHN0YXRpYyBpbnQgd2VidnR0X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmN0eCkKIHsKICAgICBBVlN0cmVhbSAgICAgKnMgPSBjdHgtPnN0cmVhbXNbMF07Ci0gICAgQVZDb2RlY0NvbnRleHQgKmF2Y3R4ID0gY3R4LT5zdHJlYW1zWzBdLT5jb2RlYzsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqcGFyID0gY3R4LT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKICAgICBBVklPQ29udGV4dCAqcGIgPSBjdHgtPnBiOwogCi0gICAgaWYgKGN0eC0+bmJfc3RyZWFtcyAhPSAxIHx8IGF2Y3R4LT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XRUJWVFQpIHsKKyAgICBpZiAoY3R4LT5uYl9zdHJlYW1zICE9IDEgfHwgcGFyLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XRUJWVFQpIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXhhY3RseSBvbmUgV2ViVlRUIHN0cmVhbSBpcyBuZWVkZWQuXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC93ZXN0d29vZF9hdWQuYyBiL2xpYmF2Zm9ybWF0L3dlc3R3b29kX2F1ZC5jCmluZGV4IDZkOGRiZGIuLjljMmQzNWMgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3dlc3R3b29kX2F1ZC5jCisrKyBiL2xpYmF2Zm9ybWF0L3dlc3R3b29kX2F1ZC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIFdlc3R3b29kIFN0dWRpb3MgQVVEIEZvcm1hdCBEZW11eGVyCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKGMpIDIwMDMgVGhlIEZGbXBlZyBwcm9qZWN0CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgogICoKQEAgLTEwNSwyMyArMTA1LDIzIEBACiAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlN0ZXJlbyBXUy1TTkQxIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9QQVRDSFdFTENPTUU7CiAgICAgICAgIH0KLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1dFU1RXT09EX1NORDE7CisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9XRVNUV09PRF9TTkQxOwogICAgICAgICBicmVhazsKICAgICBjYXNlIDk5OgotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dTOwotICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IDQ7Ci0gICAgICAgIHN0LT5jb2RlYy0+Yml0X3JhdGUgPSBjaGFubmVscyAqIHNhbXBsZV9yYXRlICogNDsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUzsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSA0OworICAgICAgICBzdC0+Y29kZWNwYXItPmJpdF9yYXRlID0gY2hhbm5lbHMgKiBzYW1wbGVfcmF0ZSAqIDQ7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVW5rbm93biBjb2RlYzogJWQiLCBjb2RlYyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX1BBVENIV0VMQ09NRTsKICAgICB9CiAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHNhbXBsZV9yYXRlKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBjaGFubmVsczsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxfbGF5b3V0ID0gY2hhbm5lbHMgPT0gMSA/IEFWX0NIX0xBWU9VVF9NT05PIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX0NIX0xBWU9VVF9TVEVSRU87Ci0gICAgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA9IHNhbXBsZV9yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICA9IGNoYW5uZWxzOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBjaGFubmVscyA9PSAxID8gQVZfQ0hfTEFZT1VUX01PTk8gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfQ0hfTEFZT1VUX1NURVJFTzsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CiAKICAgICByZXR1cm4gMDsKIH0KQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAgICAgY2h1bmtfc2l6ZSA9IEFWX1JMMTYoJnByZWFtYmxlWzBdKTsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dFU1RXT09EX1NORDEpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9XRVNUV09PRF9TTkQxKSB7CiAgICAgICAgIC8qIEZvciBXZXN0d29vZCBTTkQxIGF1ZGlvIHdlIG5lZWQgdG8gYWRkIHRoZSBvdXRwdXQgc2l6ZSBhbmQgaW5wdXQKICAgICAgICAgICAgc2l6ZSB0byB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldCB0byBtYXRjaCB3aGF0IGlzIGluIFZRQS4KICAgICAgICAgICAgU3BlY2lmaWNhbGx5LCB0aGlzIGlzIG5lZWRlZCB0byBzaWduYWwgd2hlbiBhIHBhY2tldCBzaG91bGQgYmUKQEAgLTE2NCw4ICsxNjQsMTQgQEAKICAgICAgICAgaWYgKHJldCAhPSBjaHVua19zaXplKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKIAorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jaGFubmVscyA8PSAwKSB7CisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiaW52YWxpZCBudW1iZXIgb2YgY2hhbm5lbHMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKKyAgICAgICAgfQorCiAgICAgICAgIC8qIDIgc2FtcGxlcy9ieXRlLCAxIG9yIDIgc2FtcGxlcyBwZXIgZnJhbWUgZGVwZW5kaW5nIG9uIHN0ZXJlbyAqLwotICAgICAgICBwa3QtPmR1cmF0aW9uID0gKGNodW5rX3NpemUgKiAyKSAvIHN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgICAgIHBrdC0+ZHVyYXRpb24gPSAoY2h1bmtfc2l6ZSAqIDIpIC8gc3QtPmNvZGVjcGFyLT5jaGFubmVsczsKICAgICB9CiAgICAgcGt0LT5zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3dlc3R3b29kX3ZxYS5jIGIvbGliYXZmb3JtYXQvd2VzdHdvb2RfdnFhLmMKaW5kZXggNTQ2MTY0Yy4uZWZiOTg0NyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvd2VzdHdvb2RfdnFhLmMKKysrIGIvbGliYXZmb3JtYXQvd2VzdHdvb2RfdnFhLmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogV2VzdHdvb2QgU3R1ZGlvcyBWUUEgRm9ybWF0IERlbXV4ZXIKLSAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIFByb2plY3QKKyAqIENvcHlyaWdodCAoYykgMjAwMyBUaGUgRkZtcGVnIHByb2plY3QKICAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgpAQCAtOTMsMTkgKzkzLDE5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOwogICAgIHdzdnFhLT52aWRlb19zdHJlYW1faW5kZXggPSBzdC0+aW5kZXg7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9XU19WUUE7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9XU19WUUE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190YWcgPSAwOyAgLyogbm8gZm91cmNjICovCiAKICAgICAvKiBza2lwIHRvIHRoZSBzdGFydCBvZiB0aGUgVlFBIGhlYWRlciAqLwogICAgIGF2aW9fc2VlayhwYiwgMjAsIFNFRUtfU0VUKTsKIAogICAgIC8qIHRoZSBWUUEgaGVhZGVyIG5lZWRzIHRvIGdvIHRvIHRoZSBkZWNvZGVyICovCi0gICAgaWYgKGZmX2dldF9leHRyYWRhdGEoc3QtPmNvZGVjLCBwYiwgVlFBX0hFQURFUl9TSVpFKSA8IDApCisgICAgaWYgKGZmX2dldF9leHRyYWRhdGEocywgc3QtPmNvZGVjcGFyLCBwYiwgVlFBX0hFQURFUl9TSVpFKSA8IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgaGVhZGVyID0gc3QtPmNvZGVjLT5leHRyYWRhdGE7Ci0gICAgc3QtPmNvZGVjLT53aWR0aCA9IEFWX1JMMTYoJmhlYWRlcls2XSk7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBBVl9STDE2KCZoZWFkZXJbOF0pOworICAgIGhlYWRlciA9IHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhOworICAgIHN0LT5jb2RlY3Bhci0+d2lkdGggPSBBVl9STDE2KCZoZWFkZXJbNl0pOworICAgIHN0LT5jb2RlY3Bhci0+aGVpZ2h0ID0gQVZfUkwxNigmaGVhZGVyWzhdKTsKICAgICBmcHMgPSBoZWFkZXJbMTJdOwogICAgIHN0LT5uYl9mcmFtZXMgPQogICAgIHN0LT5kdXJhdGlvbiAgPSBBVl9STDE2KCZoZWFkZXJbNF0pOwpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgIGNodW5rX3RhZyA9IEFWX1JCMzIoJnNjcmF0Y2hbMF0pOwogICAgICAgICBjaHVua19zaXplID0gQVZfUkIzMigmc2NyYXRjaFs0XSk7CiAKLSAgICAgICAgLyogY2F0Y2ggYW55IHVua25vd24gaGVhZGVyIHRhZ3MsIGZvciBjdXJpb3VzaXR5ICovCisgICAgICAgIC8qIGNhdGNoIGFueSB1bmtub3duIGhlYWRlciB0YWdzLCBmb3IgY3VyaW9zaXR5ICovCiAgICAgICAgIHN3aXRjaCAoY2h1bmtfdGFnKSB7CiAgICAgICAgIGNhc2UgQ0lORl9UQUc6CiAgICAgICAgIGNhc2UgQ0lOSF9UQUc6CkBAIC0xNDQsOSArMTQ0LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBhdl9sb2cgKHMsIEFWX0xPR19FUlJPUiwgIiBub3RlOiB1bmtub3duIGNodW5rIHNlZW4gKCVjJWMlYyVjKVxuIiwKLSAgICAgICAgICAgICAgICBzY3JhdGNoWzBdLCBzY3JhdGNoWzFdLAotICAgICAgICAgICAgICAgIHNjcmF0Y2hbMl0sIHNjcmF0Y2hbM10pOworICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIiBub3RlOiB1bmtub3duIGNodW5rIHNlZW4gKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKGNodW5rX3RhZykpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTk2LDI4ICsxOTUsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHdzdnFhLT5jaGFubmVscyA9IDE7CiAgICAgICAgICAgICAgICAgICAgIGlmICghd3N2cWEtPmJwcykKICAgICAgICAgICAgICAgICAgICAgICAgIHdzdnFhLT5icHMgPSA4OwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gd3N2cWEtPnNhbXBsZV9yYXRlOwotICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHdzdnFhLT5icHM7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgPSB3c3ZxYS0+Y2hhbm5lbHM7Ci0gICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSA9IHdzdnFhLT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSB3c3ZxYS0+YnBzOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gd3N2cWEtPmNoYW5uZWxzOworICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CiAKLSAgICAgICAgICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgICAgICAgICAgICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaHVua190eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU05EMF9UQUc6CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3N2cWEtPmJwcyA9PSAxNikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1MxNkxFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9QQ01fUzE2TEU7CiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX1BDTV9VODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUENNX1U4OwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU05EMV9UQUc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfV0VTVFdPT0RfU05EMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9XRVNUV09PRF9TTkQxOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgU05EMl9UQUc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfQURQQ01fSU1BX1dTOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YShzdC0+Y29kZWMsIDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX0FEUENNX0lNQV9XUzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCAyKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0wxNihzdC0+Y29kZWMtPmV4dHJhZGF0YSwgd3N2cWEtPnZlcnNpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgQVZfV0wxNihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgd3N2cWEtPnZlcnNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0yNTEsNyArMjUwLDggQEAKICAgICAgICAgICAgIGNhc2UgQ01EU19UQUc6CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfSU5GTywgIlNraXBwaW5nIHVua25vd24gY2h1bmsgMHglMDhYXG4iLCBjaHVua190eXBlKTsKKyAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0lORk8sICJTa2lwcGluZyB1bmtub3duIGNodW5rICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKGF2X2Jzd2FwMzIoY2h1bmtfdHlwZSkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF2aW9fc2tpcChwYiwgY2h1bmtfc2l6ZSArIHNraXBfYnl0ZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3dzZGRlYy5jIGIvbGliYXZmb3JtYXQvd3NkZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhNGRjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2Zm9ybWF0L3dzZGRlYy5jCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogV2lkZWJhbmQgU2luZ2xlLWJpdCBEYXRhIChXU0QpIGRlbXV4ZXIKKyAqIENvcHlyaWdodCAoYykgMjAxNCBQZXRlciBSb3NzCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVjb2RlLmgiCisjaW5jbHVkZSAiYXZmb3JtYXQuaCIKKyNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgInJhd2RlYy5oIgorCitzdGF0aWMgaW50IHdzZF9wcm9iZShBVlByb2JlRGF0YSAqcCkKK3sKKyAgICBpZiAocC0+YnVmX3NpemUgPCA0NSB8fCBtZW1jbXAocC0+YnVmLCAiMWJpdCIsIDQpIHx8CisgICAgICAgICFBVl9SQjMyKHAtPmJ1ZiArIDM2KSB8fCAhcC0+YnVmWzQ0XSB8fAorICAgICAgICAocC0+YnVmWzBdID49IDB4MTAgJiYgKEFWX1JCMzIocC0+YnVmICsgMjApIDwgMHg4MCB8fCBBVl9SQjMyKHAtPmJ1ZiArIDI0KSA8IDB4ODApKSkKKyAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQVZQUk9CRV9TQ09SRV9NQVg7Cit9CisKK3N0YXRpYyBpbnQgZW1wdHlfc3RyaW5nKGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICB3aGlsZSAoc2l6ZS0tKSB7CisgICAgICAgaWYgKCpidWYrKyAhPSAnICcpCisgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCB3c2RfdG9fYXZfY2hhbm5lbF9sYXlveXQoQVZGb3JtYXRDb250ZXh0ICpzLCBpbnQgYml0KQoreworICAgIHN3aXRjaCAoYml0KSB7CisgICAgY2FzZSAyOiByZXR1cm4gQVZfQ0hfQkFDS19SSUdIVDsKKyAgICBjYXNlIDM6CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiUnItbWlkZGxlIik7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNDogcmV0dXJuIEFWX0NIX0JBQ0tfQ0VOVEVSOworICAgIGNhc2UgNToKKyAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJMci1taWRkbGUiKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OiByZXR1cm4gQVZfQ0hfQkFDS19MRUZUOworICAgIGNhc2UgMjQ6IHJldHVybiBBVl9DSF9MT1dfRlJFUVVFTkNZOworICAgIGNhc2UgMjY6IHJldHVybiBBVl9DSF9GUk9OVF9SSUdIVDsKKyAgICBjYXNlIDI3OiByZXR1cm4gQVZfQ0hfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSOworICAgIGNhc2UgMjg6IHJldHVybiBBVl9DSF9GUk9OVF9DRU5URVI7CisgICAgY2FzZSAyOTogcmV0dXJuIEFWX0NIX0ZST05UX0xFRlRfT0ZfQ0VOVEVSOworICAgIGNhc2UgMzA6IHJldHVybiBBVl9DSF9GUk9OVF9MRUZUOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInJlc2VydmVkIGNoYW5uZWwgYXNzaWdubWVudFxuIik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbWV0YWRhdGEoQVZGb3JtYXRDb250ZXh0ICpzLCBjb25zdCBjaGFyICpjb25zdCB0YWcsIGNvbnN0IHVuc2lnbmVkIHNpemUpCit7CisgICAgdWludDhfdCAqYnVmOworICAgIGlmICghKHNpemUgKyAxKSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGJ1ZiA9IGF2X21hbGxvYyhzaXplICsgMSk7CisgICAgaWYgKCFidWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoYXZpb19yZWFkKHMtPnBiLCBidWYsIHNpemUpICE9IHNpemUpIHsKKyAgICAgICAgYXZfZnJlZShidWYpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKworICAgIGlmIChlbXB0eV9zdHJpbmcoYnVmLCBzaXplKSkgeworICAgICAgICBhdl9mcmVlKGJ1Zik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGJ1ZltzaXplXSA9IDA7CisgICAgYXZfZGljdF9zZXQoJnMtPm1ldGFkYXRhLCB0YWcsIGJ1ZiwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdzZF9yZWFkX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKnMpCit7CisgICAgQVZJT0NvbnRleHQgKnBiID0gcy0+cGI7CisgICAgQVZTdHJlYW0gKnN0OworICAgIGludCB2ZXJzaW9uOworICAgIHVpbnQzMl90IHRleHRfb2Zmc2V0LCBkYXRhX29mZnNldCwgY2hhbm5lbF9hc3NpZ247CisgICAgY2hhciBwbGF5YmFja190aW1lW0FWX1RJTUVDT0RFX1NUUl9TSVpFXTsKKworICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICBpZiAoIXN0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICB2ZXJzaW9uID0gYXZpb19yOChwYik7CisgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgInZlcnNpb246ICVpLiVpXG4iLCB2ZXJzaW9uID4+IDQsIHZlcnNpb24gJiAweEYpOworICAgIGF2aW9fc2tpcChwYiwgMTEpOworCisgICAgaWYgKHZlcnNpb24gPCAweDEwKSB7CisgICAgICAgIHRleHRfb2Zmc2V0ID0gMHg4MDsKKyAgICAgICAgZGF0YV9vZmZzZXQgPSAweDgwMDsKKyAgICAgICAgYXZpb19za2lwKHBiLCA4KTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZXh0X29mZnNldCA9IGF2aW9fcmIzMihwYik7CisgICAgICAgIGRhdGFfb2Zmc2V0ID0gYXZpb19yYjMyKHBiKTsKKyAgICB9CisKKyAgICBhdmlvX3NraXAocGIsIDQpOworICAgIGF2X3RpbWVjb2RlX21ha2Vfc21wdGVfdGNfc3RyaW5nKHBsYXliYWNrX3RpbWUsIGF2aW9fcmIzMihwYiksIDApOworICAgIGF2X2RpY3Rfc2V0KCZzLT5tZXRhZGF0YSwgInBsYXliYWNrX3RpbWUiLCBwbGF5YmFja190aW1lLCAwKTsKKworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IHMtPmlmb3JtYXQtPnJhd19jb2RlY19pZDsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHBiKSAvIDg7CisgICAgYXZpb19za2lwKHBiLCA0KTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgID0gYXZpb19yOChwYikgJiAweEY7CisgICAgc3QtPmNvZGVjcGFyLT5iaXRfcmF0ZSAgICA9IChpbnQ2NF90KXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICogOExMOworICAgIGlmICghc3QtPmNvZGVjcGFyLT5jaGFubmVscykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CisKKyAgICBhdmlvX3NraXAocGIsIDMpOworICAgIGNoYW5uZWxfYXNzaWduICAgICAgICAgPSBhdmlvX3JiMzIocGIpOworICAgIGlmICghKGNoYW5uZWxfYXNzaWduICYgMSkpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAzMjsgaSsrKQorICAgICAgICAgICAgaWYgKGNoYW5uZWxfYXNzaWduICYgKDEgPDwgaSkpCisgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCB8PSB3c2RfdG9fYXZfY2hhbm5lbF9sYXlveXQocywgaSk7CisgICAgfQorCisgICAgYXZpb19za2lwKHBiLCAxNik7CisgICAgaWYgKGF2aW9fcmIzMihwYikpCisgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJlbXBoYXNpcyIpOworCisgICAgaWYgKGF2aW9fc2VlayhwYiwgdGV4dF9vZmZzZXQsIFNFRUtfU0VUKSA+PSAwKSB7CisgICAgICAgIGdldF9tZXRhZGF0YShzLCAidGl0bGUiLCAgICAgICAxMjgpOworICAgICAgICBnZXRfbWV0YWRhdGEocywgImNvbXBvc2VyIiwgICAgMTI4KTsKKyAgICAgICAgZ2V0X21ldGFkYXRhKHMsICJzb25nX3dyaXRlciIsIDEyOCk7CisgICAgICAgIGdldF9tZXRhZGF0YShzLCAiYXJ0aXN0IiwgICAgICAxMjgpOworICAgICAgICBnZXRfbWV0YWRhdGEocywgImFsYnVtIiwgICAgICAgMTI4KTsKKyAgICAgICAgZ2V0X21ldGFkYXRhKHMsICJnZW5yZSIsICAgICAgICAzMik7CisgICAgICAgIGdldF9tZXRhZGF0YShzLCAiZGF0ZSIsICAgICAgICAgMzIpOworICAgICAgICBnZXRfbWV0YWRhdGEocywgImxvY2F0aW9uIiwgICAgIDMyKTsKKyAgICAgICAgZ2V0X21ldGFkYXRhKHMsICJjb21tZW50IiwgICAgIDUxMik7CisgICAgICAgIGdldF9tZXRhZGF0YShzLCAidXNlciIsICAgICAgICA1MTIpOworICAgIH0KKworICAgIHJldHVybiBhdmlvX3NlZWsocGIsIGRhdGFfb2Zmc2V0LCBTRUVLX1NFVCk7Cit9CisKK0FWSW5wdXRGb3JtYXQgZmZfd3NkX2RlbXV4ZXIgPSB7CisgICAgLm5hbWUgICAgICAgICA9ICJ3c2QiLAorICAgIC5sb25nX25hbWUgICAgPSBOVUxMX0lGX0NPTkZJR19TTUFMTCgiV2lkZWJhbmQgU2luZ2xlLWJpdCBEYXRhIChXU0QpIiksCisgICAgLnJlYWRfcHJvYmUgICA9IHdzZF9wcm9iZSwKKyAgICAucmVhZF9oZWFkZXIgID0gd3NkX3JlYWRfaGVhZGVyLAorICAgIC5yZWFkX3BhY2tldCAgPSBmZl9yYXdfcmVhZF9wYXJ0aWFsX3BhY2tldCwKKyAgICAuZXh0ZW5zaW9ucyAgID0gIndzZCIsCisgICAgLmZsYWdzICAgICAgICA9IEFWRk1UX0dFTkVSSUNfSU5ERVggfCBBVkZNVF9OT19CWVRFX1NFRUssCisgICAgLnJhd19jb2RlY19pZCA9IEFWX0NPREVDX0lEX0RTRF9NU0JGLAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3d0dmRlYy5jIGIvbGliYXZmb3JtYXQvd3R2ZGVjLmMKaW5kZXggNzFkZWFmMC4uMzAxMTYzYiAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvd3R2ZGVjLmMKKysrIGIvbGliYXZmb3JtYXQvd3R2ZGVjLmMKQEAgLTM2LDcgKzM2LDcgQEAKICNpbmNsdWRlICJ3dHYuaCIKICNpbmNsdWRlICJtcGVndHMuaCIKIAotLyogTWFjcm9zIGZvciBmb3JtYXRpbmcgR1VJRHMgKi8KKy8qIE1hY3JvcyBmb3IgZm9ybWF0dGluZyBHVUlEcyAqLwogI2RlZmluZSBQUklfUFJFVFRZX0dVSUQgXAogICAgICIlMDgiUFJJeDMyIi0lMDQiUFJJeDE2Ii0lMDQiUFJJeDE2Ii0lMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIKICNkZWZpbmUgQVJHX1BSRVRUWV9HVUlEKGcpIFwKQEAgLTQ0LDkgKzQ0LDcgQEAKICNkZWZpbmUgTEVOX1BSRVRUWV9HVUlEIDM0CiAKIC8qCi0gKgogICogRmlsZSBzeXN0ZW0gcm91dGluZXMKLSAqCiAgKi8KIAogdHlwZWRlZiBzdHJ1Y3QgV3R2RmlsZSB7CkBAIC02Nyw3ICs2NSw3IEBACiB9CiAKIC8qKgotICogQHJldHVybiBieXRlcyByZWFkLCAwIG9uIGVuZCBvZiBmaWxlLCBvciA8MCBvbiBlcnJvcgorICogQHJldHVybiBieXRlcyByZWFkLCBBVkVSUk9SX0VPRiBvbiBlbmQgb2YgZmlsZSwgb3IgPDAgb24gZXJyb3IKICAqLwogc3RhdGljIGludCB3dHZmaWxlX3JlYWRfcGFja2V0KHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqYnVmLCBpbnQgYnVmX3NpemUpCiB7CkBAIC03OCw3ICs3Niw3IEBACiAgICAgaWYgKHdmLT5lcnJvciB8fCBwYi0+ZXJyb3IpCiAgICAgICAgIHJldHVybiAtMTsKICAgICBpZiAod2YtPnBvc2l0aW9uID49IHdmLT5sZW5ndGggfHwgYXZpb19mZW9mKHBiKSkKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VPRjsKIAogICAgIGJ1Zl9zaXplID0gRkZNSU4oYnVmX3NpemUsIHdmLT5sZW5ndGggLSB3Zi0+cG9zaXRpb24pOwogICAgIHdoaWxlKG5yZWFkIDwgYnVmX3NpemUpIHsKQEAgLTMwNywxMyArMzA1LDExIEBACiAgICAgYXZfZnJlZXAoJndmLT5zZWN0b3JzKTsKICAgICBhdl9mcmVlcCgmcGItPm9wYXF1ZSk7CiAgICAgYXZfZnJlZXAoJnBiLT5idWZmZXIpOwotICAgIGF2X2ZyZWUocGIpOworICAgIGF2aW9fY29udGV4dF9mcmVlKCZwYik7CiB9CiAKIC8qCi0gKgogICogTWFpbiBkZW11eGVyCi0gKgogICovCiAKIHR5cGVkZWYgc3RydWN0IFd0dlN0cmVhbSB7CkBAIC0zMjQsNyArMzIwLDcgQEAKICAgICBBVklPQ29udGV4dCAqcGI7ICAgICAgIC8qKjwgdGltZWxpbmUgZmlsZSAqLwogICAgIGludDY0X3QgZXBvY2g7CiAgICAgaW50NjRfdCBwdHM7ICAgICAgICAgICAgIC8qKjwgcHRzIGZvciBuZXh0IGRhdGEgY2h1bmsgKi8KLSAgICBpbnQ2NF90IGxhc3RfdmFsaWRfcHRzOyAgLyoqPCBsYXRlc3QgdmFsaWQgcHRzLCB1c2VkIGZvciBpbnRlcmF0aXZlIHNlZWtpbmcgKi8KKyAgICBpbnQ2NF90IGxhc3RfdmFsaWRfcHRzOyAgLyoqPCBsYXRlc3QgdmFsaWQgcHRzLCB1c2VkIGZvciBpbnRlcmFjdGl2ZSBzZWVraW5nICovCiAKICAgICAvKiBtYWludGFpbiBwcml2YXRlIHNlZWsgaW5kZXgsIGFzIHRoZSBBVkluZGV4RW50cnktPnBvcyBpcyByZWxhdGl2ZSB0byB0aGUKICAgICAgICBzdGFydCBvZiB0aGUgJ3RpbWVsaW5lJyBmaWxlLCBub3QgdGhlIGZpbGUgc3lzdGVtIChBVkZvcm1hdENvbnRleHQtPnBiKSAqLwpAQCAtNDUxLDggKzQ0Nyw4IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgZ290byBkb25lOwogICAgIGF2X2RpY3Rfc2V0KCZzdC0+bWV0YWRhdGEsICJ0aXRsZSIsIGRlc2NyaXB0aW9uLCAwKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfVklERU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgID0gQVZfQ09ERUNfSURfTUpQRUc7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX01KUEVHOwogICAgIHN0LT5pZCA9IC0xOwogICAgIHJldCA9IGF2X2dldF9wYWNrZXQocGIsICZzdC0+YXR0YWNoZWRfcGljLCBmaWxlc2l6ZSk7CiAgICAgaWYgKHJldCA8IDApCkBAIC01NjksNyArNTY1LDcgQEAKICAgICBBVklPQ29udGV4dCAqcGIgPSB3dHYtPnBiOwogCiAgICAgYXZpb19za2lwKHBiLCA3Mik7ICAvLyBwaWN0dXJlIGFzcGVjdCByYXRpbyBpcyB1bnJlbGlhYmxlCi0gICAgc3QtPmNvZGVjLT5jb2RlY190YWcgPSBmZl9nZXRfYm1wX2hlYWRlcihwYiwgc3QsIE5VTEwpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdGFnID0gZmZfZ2V0X2JtcF9oZWFkZXIocGIsIHN0LCBOVUxMKTsKIAogICAgIHJldHVybiA3MiArIDQwOwogfQpAQCAtNTgwLDIzICs1NzYsMjMgQEAKIHN0YXRpYyB2b2lkIHBhcnNlX21wZWcxd2F2ZWZvcm1hdGV4KEFWU3RyZWFtICpzdCkKIHsKICAgICAvKiBmd0hlYWRMYXllciAqLwotICAgIHN3aXRjaCAoQVZfUkwxNihzdC0+Y29kZWMtPmV4dHJhZGF0YSkpIHsKLSAgICBjYXNlIDB4MDAwMSA6IHN0LT5jb2RlYy0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDE7IGJyZWFrOwotICAgIGNhc2UgMHgwMDAyIDogc3QtPmNvZGVjLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QMjsgYnJlYWs7Ci0gICAgY2FzZSAweDAwMDQgOiBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVAzOyBicmVhazsKKyAgICBzd2l0Y2ggKEFWX1JMMTYoc3QtPmNvZGVjcGFyLT5leHRyYWRhdGEpKSB7CisgICAgY2FzZSAweDAwMDEgOiBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfTVAxOyBicmVhazsKKyAgICBjYXNlIDB4MDAwMiA6IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9NUDI7IGJyZWFrOworICAgIGNhc2UgMHgwMDA0IDogc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IEFWX0NPREVDX0lEX01QMzsgYnJlYWs7CiAgICAgfQogCi0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IEFWX1JMMzIoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyAyKTsgLyogZHdIZWFkQml0cmF0ZSAqLworICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBBVl9STDMyKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhICsgMik7IC8qIGR3SGVhZEJpdHJhdGUgKi8KIAogICAgIC8qIGR3SGVhZE1vZGUgKi8KLSAgICBzd2l0Y2ggKEFWX1JMMTYoc3QtPmNvZGVjLT5leHRyYWRhdGEgKyA2KSkgeworICAgIHN3aXRjaCAoQVZfUkwxNihzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSArIDYpKSB7CiAgICAgY2FzZSAxIDoKICAgICBjYXNlIDIgOgotICAgIGNhc2UgNCA6IHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAyOwotICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOworICAgIGNhc2UgNCA6IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgICAgPSAyOworICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwogICAgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgOCA6IHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgPSAxOwotICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBjYXNlIDggOiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgID0gMTsKKyAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQpAQCAtNjA5LDkgKzYwNSw5IEBACiBzdGF0aWMgQVZTdHJlYW0gKiBuZXdfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqcywgQVZTdHJlYW0gKnN0LCBpbnQgc2lkLCBpbnQgY29kZWNfdHlwZSkKIHsKICAgICBpZiAoc3QpIHsKLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+ZXh0cmFkYXRhKSB7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmc3QtPmNvZGVjLT5leHRyYWRhdGEpOwotICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA9IDA7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSkgeworICAgICAgICAgICAgYXZfZnJlZXAoJnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPSAwOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgV3R2U3RyZWFtICp3c3QgPSBhdl9tYWxsb2N6KHNpemVvZihXdHZTdHJlYW0pKTsKQEAgLTYyNSw3ICs2MjEsNyBAQAogICAgICAgICBzdC0+aWQgPSBzaWQ7CiAgICAgICAgIHN0LT5wcml2X2RhdGEgPSB3c3Q7CiAgICAgfQotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9IGNvZGVjX3R5cGU7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gY29kZWNfdHlwZTsKICAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgPSBBVlNUUkVBTV9QQVJTRV9GVUxMOwogICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCAxMDAwMDAwMCk7CiAgICAgcmV0dXJuIHN0OwpAQCAtNjcwLDcgKzY2Niw3IEBACiAgICAgICAgIGlmICghc3QpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKCFmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF93YXZlZm9ybWF0ZXgpKSB7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlYywgc2l6ZSwgMCk7CisgICAgICAgICAgICBpbnQgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlY3Bhciwgc2l6ZSwgMCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTY4MCwxNSArNjc2LDE1IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1lbWNtcChzdWJ0eXBlICsgNCwgKGNvbnN0IHVpbnQ4X3RbXSl7RkZfTUVESUFTVUJUWVBFX0JBU0VfR1VJRH0sIDEyKSkgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX3dhdl9jb2RlY19nZXRfaWQoQVZfUkwzMihzdWJ0eXBlKSwgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOworICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX3dhdl9jb2RlY19nZXRfaWQoQVZfUkwzMihzdWJ0eXBlKSwgc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUpOwogICAgICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKHN1YnR5cGUsIG1lZGlhc3VidHlwZV9tcGVnMXBheWxvYWQpKSB7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGEgJiYgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA+PSAyMikKKyAgICAgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSAmJiBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplID49IDIyKQogICAgICAgICAgICAgICAgIHBhcnNlX21wZWcxd2F2ZWZvcm1hdGV4KHN0KTsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJNUEVHMVdBVkVGT1JNQVRFWCB1bmRlcmZsb3dcbiIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2d1aWRfZ2V0X2lkKGZmX2NvZGVjX3dhdl9ndWlkcywgc3VidHlwZSk7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQorICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9IGZmX2NvZGVjX2d1aWRfZ2V0X2lkKGZmX2NvZGVjX3dhdl9ndWlkcywgc3VidHlwZSk7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9OT05FKQogICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gc3VidHlwZToiRkZfUFJJX0dVSUQiXG4iLCBGRl9BUkdfR1VJRChzdWJ0eXBlKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0OwpAQCAtNzEwLDExICs3MDYsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghbWVtY21wKHN1YnR5cGUgKyA0LCAoY29uc3QgdWludDhfdFtdKXtGRl9NRURJQVNVQlRZUEVfQkFTRV9HVUlEfSwgMTIpKSB7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gZmZfY29kZWNfZ2V0X2lkKGZmX2NvZGVjX2JtcF90YWdzLCBBVl9STDMyKHN1YnR5cGUpKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBmZl9jb2RlY19nZXRfaWQoZmZfY29kZWNfYm1wX3RhZ3MsIEFWX1JMMzIoc3VidHlwZSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCA9IGZmX2NvZGVjX2d1aWRfZ2V0X2lkKGZmX3ZpZGVvX2d1aWRzLCBzdWJ0eXBlKTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBmZl9jb2RlY19ndWlkX2dldF9pZChmZl92aWRlb19ndWlkcywgc3VidHlwZSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTk9ORSkKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gc3VidHlwZToiRkZfUFJJX0dVSUQiXG4iLCBGRl9BUkdfR1VJRChzdWJ0eXBlKSk7CiAgICAgICAgIHJldHVybiBzdDsKICAgICB9IGVsc2UgaWYgKCFmZl9ndWlkY21wKG1lZGlhdHlwZSwgbWVkaWF0eXBlX21wZWcyX3BlcykgJiYKQEAgLTcyNSw3ICs3MjEsNyBAQAogICAgICAgICBpZiAoZmZfZ3VpZGNtcChmb3JtYXR0eXBlLCBmZl9mb3JtYXRfbm9uZSkpCiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJ1bmtub3duIGZvcm1hdHR5cGU6IkZGX1BSSV9HVUlEIlxuIiwgRkZfQVJHX0dVSUQoZm9ybWF0dHlwZSkpOwogICAgICAgICBhdmlvX3NraXAocGIsIHNpemUpOwotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfRFZCX1NVQlRJVExFOwogICAgICAgICByZXR1cm4gc3Q7CiAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcChtZWRpYXR5cGUsIG1lZGlhdHlwZV9tc3R2Y2FwdGlvbikgJiYKICAgICAgICAgICAgICAgICghZmZfZ3VpZGNtcChzdWJ0eXBlLCBtZWRpYXN1YnR5cGVfdGVsZXRleHQpIHx8ICFmZl9ndWlkY21wKHN1YnR5cGUsIG1lZGlhc3VidHlwZV9kdHZjY2RhdGEpKSkgewpAQCAtNzM1LDcgKzczMSw3IEBACiAgICAgICAgIGlmIChmZl9ndWlkY21wKGZvcm1hdHR5cGUsIGZmX2Zvcm1hdF9ub25lKSkKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgInVua25vd24gZm9ybWF0dHlwZToiRkZfUFJJX0dVSUQiXG4iLCBGRl9BUkdfR1VJRChmb3JtYXR0eXBlKSk7CiAgICAgICAgIGF2aW9fc2tpcChwYiwgc2l6ZSk7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgPSAhZmZfZ3VpZGNtcChzdWJ0eXBlLCBtZWRpYXN1YnR5cGVfdGVsZXRleHQpID8gQVZfQ09ERUNfSURfRFZCX1RFTEVURVhUIDogQVZfQ09ERUNfSURfRUlBXzYwODsKKyAgICAgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9ICFmZl9ndWlkY21wKHN1YnR5cGUsIG1lZGlhc3VidHlwZV90ZWxldGV4dCkgPyBBVl9DT0RFQ19JRF9EVkJfVEVMRVRFWFQgOiBBVl9DT0RFQ19JRF9FSUFfNjA4OwogICAgICAgICByZXR1cm4gc3Q7CiAgICAgfSBlbHNlIGlmICghZmZfZ3VpZGNtcChtZWRpYXR5cGUsIG1lZGlhdHlwZV9tcGVnMl9zZWN0aW9ucykgJiYKICAgICAgICAgICAgICAgICFmZl9ndWlkY21wKHN1YnR5cGUsIG1lZGlhc3VidHlwZV9tcGVnMl9zZWN0aW9ucykpIHsKQEAgLTEwMDksNiArMTAwNSw4IEBACiAgICAgICAgIHd0dmZpbGVfY2xvc2UocGIpOwogICAgIH0KIAorICAgIHMtPmN0eF9mbGFncyB8PSBBVkZNVENUWF9OT0hFQURFUjsgLy8gTmVlZGVkIGZvciBub1N0cmVhbXMud3R2CisKICAgICAvKiByZWFkIHNlZWsgaW5kZXggKi8KICAgICBpZiAocy0+bmJfc3RyZWFtcykgewogICAgICAgICBBVlN0cmVhbSAqc3QgPSBzLT5zdHJlYW1zWzBdOwpAQCAtMTAzMyw3ICsxMDMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lX25iID0gYXZpb19ybDY0KHBiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uID0gYXZpb19ybDY0KHBiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChmcmFtZV9uYiA+IGUtPnNpemUgJiYgZSA8PSBlX2VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGUgPD0gZV9lbmQgJiYgZnJhbWVfbmIgPiBlLT5zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+cG9zID0gbGFzdF9wb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKys7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC93dHZlbmMuYyBiL2xpYmF2Zm9ybWF0L3d0dmVuYy5jCmluZGV4IDA4OTRiN2YuLjRhNjhiODEgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3d0dmVuYy5jCisrKyBiL2xpYmF2Zm9ybWF0L3d0dmVuYy5jCkBAIC0yMTUsMjIgKzIxNSwyMiBAQAogCiBzdGF0aWMgdm9pZCBwdXRfdmlkZW9pbmZvaGVhZGVyMihBVklPQ29udGV4dCAqcGIsIEFWU3RyZWFtICpzdCkKIHsKLSAgICBBVlJhdGlvbmFsIGRhciA9IGF2X211bF9xKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLCAoQVZSYXRpb25hbCl7c3QtPmNvZGVjLT53aWR0aCwgc3QtPmNvZGVjLT5oZWlnaHR9KTsKKyAgICBBVlJhdGlvbmFsIGRhciA9IGF2X211bF9xKHN0LT5zYW1wbGVfYXNwZWN0X3JhdGlvLCAoQVZSYXRpb25hbCl7c3QtPmNvZGVjcGFyLT53aWR0aCwgc3QtPmNvZGVjcGFyLT5oZWlnaHR9KTsKICAgICB1bnNpZ25lZCBpbnQgbnVtLCBkZW47CiAgICAgYXZfcmVkdWNlKCZudW0sICZkZW4sIGRhci5udW0sIGRhci5kZW4sIDB4RkZGRkZGRkYpOwogCiAgICAgLyogVklERU9JTkZPSEVBREVSMiAqLwogICAgIGF2aW9fd2wzMihwYiwgMCk7CiAgICAgYXZpb193bDMyKHBiLCAwKTsKLSAgICBhdmlvX3dsMzIocGIsIHN0LT5jb2RlYy0+d2lkdGgpOwotICAgIGF2aW9fd2wzMihwYiwgc3QtPmNvZGVjLT5oZWlnaHQpOworICAgIGF2aW9fd2wzMihwYiwgc3QtPmNvZGVjcGFyLT53aWR0aCk7CisgICAgYXZpb193bDMyKHBiLCBzdC0+Y29kZWNwYXItPmhlaWdodCk7CiAKICAgICBhdmlvX3dsMzIocGIsIDApOwogICAgIGF2aW9fd2wzMihwYiwgMCk7CiAgICAgYXZpb193bDMyKHBiLCAwKTsKICAgICBhdmlvX3dsMzIocGIsIDApOwogCi0gICAgYXZpb193bDMyKHBiLCBzdC0+Y29kZWMtPmJpdF9yYXRlKTsKKyAgICBhdmlvX3dsMzIocGIsIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUpOwogICAgIGF2aW9fd2wzMihwYiwgMCk7CiAgICAgYXZpb193bDY0KHBiLCBzdC0+YXZnX2ZyYW1lX3JhdGUubnVtICYmIHN0LT5hdmdfZnJhbWVfcmF0ZS5kZW4gPyBJTlQ2NF9DKDEwMDAwMDAwKSAvIGF2X3EyZChzdC0+YXZnX2ZyYW1lX3JhdGUpIDogMCk7CiAgICAgYXZpb193bDMyKHBiLCAwKTsKQEAgLTI0MSwxNyArMjQxLDE3IEBACiAgICAgYXZpb193bDMyKHBiLCAwKTsKICAgICBhdmlvX3dsMzIocGIsIDApOwogCi0gICAgZmZfcHV0X2JtcF9oZWFkZXIocGIsIHN0LT5jb2RlYywgZmZfY29kZWNfYm1wX3RhZ3MsIDAsIDEpOworICAgIGZmX3B1dF9ibXBfaGVhZGVyKHBiLCBzdC0+Y29kZWNwYXIsIDAsIDEpOwogCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgewotICAgICAgICBpbnQgcGFkZGluZyA9IChzdC0+Y29kZWMtPmV4dHJhZGF0YV9zaXplICYgMykgPyA0IC0gKHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUgJiAzKSA6IDA7CisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTykgeworICAgICAgICBpbnQgcGFkZGluZyA9IChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICYgMykgPyA0IC0gKHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgJiAzKSA6IDA7CiAgICAgICAgIC8qIE1QRUcyVklERU9JTkZPICovCiAgICAgICAgIGF2aW9fd2wzMihwYiwgMCk7Ci0gICAgICAgIGF2aW9fd2wzMihwYiwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSArIHBhZGRpbmcpOworICAgICAgICBhdmlvX3dsMzIocGIsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgKyBwYWRkaW5nKTsKICAgICAgICAgYXZpb193bDMyKHBiLCAtMSk7CiAgICAgICAgIGF2aW9fd2wzMihwYiwgLTEpOwogICAgICAgICBhdmlvX3dsMzIocGIsIDApOwotICAgICAgICBhdmlvX3dyaXRlKHBiLCBzdC0+Y29kZWMtPmV4dHJhZGF0YSwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgIGF2aW9fd3JpdGUocGIsIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgZmZpb19maWxsKHBiLCAwLCBwYWRkaW5nKTsKICAgICB9CiB9CkBAIC0yNjQsMTggKzI2NCwxOCBAQAogICAgIGludDY0X3QgIGhkcl9wb3Nfc3RhcnQ7CiAgICAgaW50IGhkcl9zaXplID0gMDsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID09IEFWTUVESUFfVFlQRV9WSURFTykgewotICAgICAgICBnID0gZmZfZ2V0X2NvZGVjX2d1aWQoc3QtPmNvZGVjLT5jb2RlY19pZCwgZmZfdmlkZW9fZ3VpZHMpOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgICAgICBnID0gZmZfZ2V0X2NvZGVjX2d1aWQoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCwgZmZfdmlkZW9fZ3VpZHMpOwogICAgICAgICBtZWRpYV90eXBlID0gJmZmX21lZGlhdHlwZV92aWRlbzsKLSAgICAgICAgZm9ybWF0X3R5cGUgPSBzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01QRUcyVklERU8gPyAmZmZfZm9ybWF0X21wZWcyX3ZpZGVvIDogJmZmX2Zvcm1hdF92aWRlb2luZm8yOworICAgICAgICBmb3JtYXRfdHlwZSA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTVBFRzJWSURFTyA/ICZmZl9mb3JtYXRfbXBlZzJfdmlkZW8gOiAmZmZfZm9ybWF0X3ZpZGVvaW5mbzI7CiAgICAgICAgIHRhZ3MgPSBmZl9jb2RlY19ibXBfdGFnczsKLSAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKLSAgICAgICAgZyA9IGZmX2dldF9jb2RlY19ndWlkKHN0LT5jb2RlYy0+Y29kZWNfaWQsIGZmX2NvZGVjX3dhdl9ndWlkcyk7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgIGcgPSBmZl9nZXRfY29kZWNfZ3VpZChzdC0+Y29kZWNwYXItPmNvZGVjX2lkLCBmZl9jb2RlY193YXZfZ3VpZHMpOwogICAgICAgICBtZWRpYV90eXBlID0gJmZmX21lZGlhdHlwZV9hdWRpbzsKICAgICAgICAgZm9ybWF0X3R5cGUgPSAmZmZfZm9ybWF0X3dhdmVmb3JtYXRleDsKICAgICAgICAgdGFncyA9IGZmX2NvZGVjX3dhdl90YWdzOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bmtub3duIGNvZGVjX3R5cGUgKDB4JXgpXG4iLCBzdC0+Y29kZWMtPmNvZGVjX3R5cGUpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5rbm93biBjb2RlY190eXBlICgweCV4KVxuIiwgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIApAQCAtMjg2LDEwICsyODYsMTAgQEAKICAgICBhdmlvX3dsMzIocGIsIDApOyAvLyBzaXplCiAKICAgICBoZHJfcG9zX3N0YXJ0ID0gYXZpb190ZWxsKHBiKTsKLSAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykgeworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CiAgICAgICAgIHB1dF92aWRlb2luZm9oZWFkZXIyKHBiLCBzdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGZmX3B1dF93YXZfaGVhZGVyKHBiLCBzdC0+Y29kZWMsIDApIDwgMCkKKyAgICAgICAgaWYgKGZmX3B1dF93YXZfaGVhZGVyKHMsIHBiLCBzdC0+Y29kZWNwYXIsIDApIDwgMCkKICAgICAgICAgICAgIGZvcm1hdF90eXBlID0gJmZmX2Zvcm1hdF9ub25lOwogICAgIH0KICAgICBoZHJfc2l6ZSA9IGF2aW9fdGVsbChwYikgLSBoZHJfcG9zX3N0YXJ0OwpAQCAtMzAxLDkgKzMwMSw5IEBACiAgICAgaWYgKGcpIHsKICAgICAgICAgZmZfcHV0X2d1aWQocGIsIGcpOyAgICAgICAgICAgLy8gYWN0dWFsX3N1YnR5cGUKICAgICB9IGVsc2UgewotICAgICAgICBpbnQgdGFnID0gZmZfY29kZWNfZ2V0X3RhZyh0YWdzLCBzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgaW50IHRhZyA9IGZmX2NvZGVjX2dldF90YWcodGFncywgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCk7CiAgICAgICAgIGlmICghdGFnKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAidW5zdXBwb3J0ZWQgY29kZWNfaWQgKDB4JXgpXG4iLCBzdC0+Y29kZWMtPmNvZGVjX2lkKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ1bnN1cHBvcnRlZCBjb2RlY19pZCAoMHgleClcbiIsIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgICAgIGF2aW9fd2wzMihwYiwgdGFnKTsKQEAgLTMyNiw3ICszMjYsNyBAQAogCiAgICAgcmV0ID0gd3JpdGVfc3RyZWFtX2NvZGVjX2luZm8ocywgc3QpOwogICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ3cml0ZSBzdHJlYW0gY29kZWMgaW5mbyBmYWlsZWQgY29kZWNfdHlwZSgweCV4KVxuIiwgc3QtPmNvZGVjLT5jb2RlY190eXBlKTsKKyAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIndyaXRlIHN0cmVhbSBjb2RlYyBpbmZvIGZhaWxlZCBjb2RlY190eXBlKDB4JXgpXG4iLCBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0zNjQsNyArMzY0LDcgQEAKIAogICAgIHJldCA9IHdyaXRlX3N0cmVhbV9jb2RlY19pbmZvKHMsIHN0KTsKICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAid3JpdGUgc3RyZWFtIGNvZGVjIGluZm8gZmFpbGVkIGNvZGVjX3R5cGUoMHgleClcbiIsIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSk7CisgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ3cml0ZSBzdHJlYW0gY29kZWMgaW5mbyBmYWlsZWQgY29kZWNfdHlwZSgweCV4KVxuIiwgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBmaW5pc2hfY2h1bmsocyk7CkBAIC00MTEsMTEgKzQxMSwxMSBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IHMtPm5iX3N0cmVhbXM7IGkrKykgewogICAgICAgICBzdCA9IHMtPnN0cmVhbXNbaV07Ci0gICAgICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01KUEVHKQorICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICByZXQgPSB3cml0ZV9zdHJlYW1fY29kZWMocywgc3QpOwogICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIndyaXRlIHN0cmVhbSBjb2RlYyBmYWlsZWQgY29kZWNfdHlwZSgweCV4KVxuIiwgc3QtPmNvZGVjLT5jb2RlY190eXBlKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ3cml0ZSBzdHJlYW0gY29kZWMgZmFpbGVkIGNvZGVjX3R5cGUoMHgleClcbiIsIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFpKQpAQCAtNDI0LDExICs0MjQsMTEgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCBzLT5uYl9zdHJlYW1zOyBpKyspIHsKICAgICAgICAgc3QgPSBzLT5zdHJlYW1zW2ldOwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NSlBFRykKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfTUpQRUcpCiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgcmV0ICA9IHdyaXRlX3N0cmVhbV9kYXRhKHMsIHN0KTsKICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ3cml0ZSBzdHJlYW0gZGF0YSBmYWlsZWQgY29kZWNfdHlwZSgweCV4KVxuIiwgc3QtPmNvZGVjLT5jb2RlY190eXBlKTsKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJ3cml0ZSBzdHJlYW0gZGF0YSBmYWlsZWQgY29kZWNfdHlwZSgweCV4KVxuIiwgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlKTsKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogICAgIH0KQEAgLTQ0Myw3ICs0NDMsNyBAQAogewogICAgIEFWSU9Db250ZXh0ICpwYiA9IHMtPnBiOwogICAgIFd0dkNvbnRleHQgICp3Y3R4ID0gcy0+cHJpdl9kYXRhOwotICAgIEFWQ29kZWNDb250ZXh0ICplbmMgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XS0+Y29kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKnBhciA9IHMtPnN0cmVhbXNbcGt0LT5zdHJlYW1faW5kZXhdLT5jb2RlY3BhcjsKIAogICAgIHdyaXRlX2NodW5rX2hlYWRlcihzLCAmZmZfdGltZXN0YW1wX2d1aWQsIDU2LCAweDQwMDAwMDAwIHwgKElOREVYX0JBU0UgKyBwa3QtPnN0cmVhbV9pbmRleCkpOwogICAgIHdyaXRlX3BhZChwYiwgOCk7CkBAIC00NTEsNyArNDUxLDcgQEAKICAgICBhdmlvX3dsNjQocGIsIHBrdC0+cHRzID09IEFWX05PUFRTX1ZBTFVFID8gLTEgOiBwa3QtPnB0cyk7CiAgICAgYXZpb193bDY0KHBiLCBwa3QtPnB0cyA9PSBBVl9OT1BUU19WQUxVRSA/IC0xIDogcGt0LT5wdHMpOwogICAgIGF2aW9fd2w2NChwYiwgMCk7Ci0gICAgYXZpb193bDY0KHBiLCBlbmMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPICYmIChwa3QtPmZsYWdzICYgQVZfUEtUX0ZMQUdfS0VZKSA/IDEgOiAwKTsKKyAgICBhdmlvX3dsNjQocGIsIHBhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfVklERU8gJiYgKHBrdC0+ZmxhZ3MgJiBBVl9QS1RfRkxBR19LRVkpID8gMSA6IDApOwogICAgIGF2aW9fd2w2NChwYiwgMCk7CiAKICAgICB3Y3R4LT5sYXN0X3RpbWVzdGFtcF9wb3MgPSB3Y3R4LT5sYXN0X2NodW5rX3BvczsKQEAgLTQ2MywxMCArNDYzLDEwIEBACiAgICAgV3R2Q29udGV4dCAgKndjdHggPSBzLT5wcml2X2RhdGE7CiAgICAgQVZTdHJlYW0gICAgKnN0ICAgPSBzLT5zdHJlYW1zW3BrdC0+c3RyZWFtX2luZGV4XTsKIAotICAgIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01KUEVHICYmICF3Y3R4LT50aHVtYm5haWwuc2l6ZSkgewotICAgICAgICBhdl9jb3B5X3BhY2tldCgmd2N0eC0+dGh1bWJuYWlsLCBwa3QpOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX01KUEVHICYmICF3Y3R4LT50aHVtYm5haWwuc2l6ZSkgeworICAgICAgICBhdl9wYWNrZXRfcmVmKCZ3Y3R4LT50aHVtYm5haWwsIHBrdCk7CiAgICAgICAgIHJldHVybiAwOwotICAgIH0gZWxzZSBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX0gyNjQpIHsKICAgICAgICAgaW50IHJldCA9IGZmX2NoZWNrX2gyNjRfc3RhcnRjb2RlKHMsIHN0LCBwa3QpOwogICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC02NzIsNiArNjcyLDcgQEAKICAgICBBVklPQ29udGV4dCAqcGIgPSBzLT5wYjsKICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gMDsKIAorICAgIGZmX3N0YW5kYXJkaXplX2NyZWF0aW9uX3RpbWUocyk7CiAgICAgLy9GSVhNRTogdHJhbnNsYXRlIHNwZWNpYWwgdGFncyAoZS5nLiBXTS9CaXRyYXRlKSB0byBiaW5hcnkgcmVwcmVzZW50YXRpb24KICAgICBmZl9tZXRhZGF0YV9jb252KCZzLT5tZXRhZGF0YSwgZmZfYXNmX21ldGFkYXRhX2NvbnYsIE5VTEwpOwogICAgIHdoaWxlICgodGFnID0gYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCB0YWcsIEFWX0RJQ1RfSUdOT1JFX1NVRkZJWCkpKQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvd3ZkZWMuYyBiL2xpYmF2Zm9ybWF0L3d2ZGVjLmMKaW5kZXggMDQyZjk2Yi4uMjA2MDUyMyAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQvd3ZkZWMuYworKysgYi9saWJhdmZvcm1hdC93dmRlYy5jCkBAIC00MCw2ICs0MCw3IEBACiAgICAgV1ZfSEJBTCAgID0gMHgwNDAwLAogICAgIFdWX01DSU5JVCA9IDB4MDgwMCwKICAgICBXVl9NQ0VORCAgPSAweDEwMDAsCisgICAgV1ZfRFNEICAgID0gMHg4MDAwMDAwMCwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQgd3ZfcmF0ZXNbMTZdID0gewpAQCAtOTcsOCArOTgsMTQgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKKyAgICBpZiAod2MtPmhlYWRlci5mbGFncyAmIFdWX0RTRCkgeworICAgICAgICBhdnByaXZfcmVwb3J0X21pc3NpbmdfZmVhdHVyZShjdHgsICJXViBEU0QiKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOworICAgIH0KKwogICAgIGlmICh3Yy0+aGVhZGVyLnZlcnNpb24gPCAweDQwMiB8fCB3Yy0+aGVhZGVyLnZlcnNpb24gPiAweDQxMCkgewotICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCB2ZXJzaW9uICUwM1hcbiIsIHdjLT5oZWFkZXIudmVyc2lvbik7CisgICAgICAgIGF2cHJpdl9yZXBvcnRfbWlzc2luZ19mZWF0dXJlKGN0eCwgIldWIHZlcnNpb24gMHglMDNYIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2MtPmhlYWRlci52ZXJzaW9uKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1JfUEFUQ0hXRUxDT01FOwogICAgIH0KIApAQCAtMTE5LDcgKzEyNiw3IEBACiAgICAgfQogICAgIGlmICgocmF0ZSA9PSAtMSB8fCAhY2hhbikgJiYgIXdjLT5ibG9ja19wYXJzZWQpIHsKICAgICAgICAgaW50NjRfdCBibG9ja19lbmQgPSBhdmlvX3RlbGwocGIpICsgd2MtPmhlYWRlci5ibG9ja3NpemU7Ci0gICAgICAgIGlmICghcGItPnNlZWthYmxlKSB7CisgICAgICAgIGlmICghKHBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSkgewogICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZGV0ZXJtaW5lIGFkZGl0aW9uYWwgcGFyYW1ldGVyc1xuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKQEAgLTIzMCwxOCArMjM3LDE4IEBACiAgICAgc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOwogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3QtPmNvZGVjLT5jb2RlY190eXBlICAgICAgICAgICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgc3QtPmNvZGVjLT5jb2RlY19pZCAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9XQVZQQUNLOwotICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gd2MtPmNoYW47Ci0gICAgc3QtPmNvZGVjLT5jaGFubmVsX2xheW91dCAgICAgICAgPSB3Yy0+Y2htYXNrOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gd2MtPnJhdGU7Ci0gICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgPSB3Yy0+YnBwOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgICAgICAgID0gQVZfQ09ERUNfSURfV0FWUEFDSzsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICAgICAgICAgICA9IHdjLT5jaGFuOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbF9sYXlvdXQgICAgICAgID0gd2MtPmNobWFzazsKKyAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlICAgICAgICAgICA9IHdjLT5yYXRlOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gd2MtPmJwcDsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgd2MtPnJhdGUpOwogICAgIHN0LT5zdGFydF90aW1lID0gMDsKICAgICBpZiAod2MtPmhlYWRlci50b3RhbF9zYW1wbGVzICE9IDB4RkZGRkZGRkZ1KQogICAgICAgICBzdC0+ZHVyYXRpb24gPSB3Yy0+aGVhZGVyLnRvdGFsX3NhbXBsZXM7CiAKLSAgICBpZiAocy0+cGItPnNlZWthYmxlKSB7CisgICAgaWYgKHMtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSB7CiAgICAgICAgIGludDY0X3QgY3VyID0gYXZpb190ZWxsKHMtPnBiKTsKICAgICAgICAgd2MtPmFwZXRhZ19zdGFydCA9IGZmX2FwZV9wYXJzZV90YWcocyk7CiAgICAgICAgIGlmICghYXZfZGljdF9nZXQocy0+bWV0YWRhdGEsICIiLCBOVUxMLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQvd3ZlZGVjLmMgYi9saWJhdmZvcm1hdC93dmVkZWMuYwppbmRleCA4ZTc0YWJlLi44OWMwMDAxIDEwMDY0NAotLS0gYS9saWJhdmZvcm1hdC93dmVkZWMuYworKysgYi9saWJhdmZvcm1hdC93dmVkZWMuYwpAQCAtNDAsMTMgKzQwLDEzIEBACiAKICAgICBhdmlvX3NraXAocy0+cGIsIDE4KTsKICAgICBzdC0+ZHVyYXRpb24gICAgICAgICAgID0gYXZpb19yYjMyKHMtPnBiKTsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgPSBBVl9DT0RFQ19JRF9QQ01fQUxBVzsKLSAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlID0gODAwMDsKLSAgICBzdC0+Y29kZWMtPmNoYW5uZWxzICAgID0gMTsKLSAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IGF2X2dldF9iaXRzX3Blcl9zYW1wbGUoc3QtPmNvZGVjLT5jb2RlY19pZCk7Ci0gICAgc3QtPmNvZGVjLT5ibG9ja19hbGlnbiA9IHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlICogc3QtPmNvZGVjLT5jaGFubmVscyAvIDg7Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICA9IEFWX0NPREVDX0lEX1BDTV9BTEFXOworICAgIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgPSA4MDAwOworICAgIHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgICAgPSAxOworICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gYXZfZ2V0X2JpdHNfcGVyX3NhbXBsZShzdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKKyAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gc3QtPmNvZGVjcGFyLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzIC8gODsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgYXZpb19za2lwKHMtPnBiLCAxMCk7CiAKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3d2ZW5jLmMgYi9saWJhdmZvcm1hdC93dmVuYy5jCmluZGV4IGIwZDc0Y2EuLjg3NDM3MzkgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3d2ZW5jLmMKKysrIGIvbGliYXZmb3JtYXQvd3ZlbmMuYwpAQCAtMzMsNyArMzMsNyBAQAogc3RhdGljIGF2X2NvbGQgaW50IHd2X3dyaXRlX2hlYWRlcihBVkZvcm1hdENvbnRleHQgKmN0eCkKIHsKICAgICBpZiAoY3R4LT5uYl9zdHJlYW1zID4gMSB8fAotICAgICAgICBjdHgtPnN0cmVhbXNbMF0tPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XQVZQQUNLKSB7CisgICAgICAgIGN0eC0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dBVlBBQ0spIHsKICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVGhpcyBtdXhlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIFdhdlBhY2sgc3RyZWFtLlxuIik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQpAQCAtNjQsNyArNjQsNyBAQAogICAgIFd2TXV4Q29udGV4dCAqcyA9IGN0eC0+cHJpdl9kYXRhOwogCiAgICAgLyogdXBkYXRlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBmaXJzdCBibG9jayAqLwotICAgIGlmIChjdHgtPnBiLT5zZWVrYWJsZSAmJiBzLT5zYW1wbGVzICYmCisgICAgaWYgKChjdHgtPnBiLT5zZWVrYWJsZSAmIEFWSU9fU0VFS0FCTEVfTk9STUFMKSAmJiBzLT5zYW1wbGVzICYmCiAgICAgICAgIHMtPnNhbXBsZXMgPCBVSU5UMzJfTUFYKSB7CiAgICAgICAgIGludDY0X3QgcG9zID0gYXZpb190ZWxsKGN0eC0+cGIpOwogICAgICAgICBhdmlvX3NlZWsoY3R4LT5wYiwgMTIsIFNFRUtfU0VUKTsKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3hhLmMgYi9saWJhdmZvcm1hdC94YS5jCmluZGV4IDQzNjYxZGUuLjgxMGUwYzAgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3hhLmMKKysrIGIvbGliYXZmb3JtYXQveGEuYwpAQCAtNzMsMjQgKzczLDI0IEBACiAgICAgaWYgKCFzdCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKIAotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgID0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgIHN0LT5jb2RlYy0+Y29kZWNfaWQgICAgID0gQVZfQ09ERUNfSURfQURQQ01fRUFfTUFYSVNfWEE7CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9FQV9NQVhJU19YQTsKICAgICBhdmlvX3NraXAocGIsIDQpOyAgICAgICAvKiBTa2lwIHRoZSBYQSBJRCAqLwogICAgIHhhLT5vdXRfc2l6ZSAgICAgICAgICAgID0gIGF2aW9fcmwzMihwYik7CiAgICAgYXZpb19za2lwKHBiLCAyKTsgICAgICAgLyogU2tpcCB0aGUgdGFnICovCi0gICAgc3QtPmNvZGVjLT5jaGFubmVscyAgICAgPSBhdmlvX3JsMTYocGIpOwotICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgID0gYXZpb19ybDMyKHBiKTsKKyAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICAgICA9IGF2aW9fcmwxNihwYik7CisgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgPSBhdmlvX3JsMzIocGIpOwogICAgIGF2aW9fc2tpcChwYiwgNCk7ICAgICAgIC8qIFNraXAgYXZlcmFnZSBieXRlIHJhdGUgKi8KICAgICBhdmlvX3NraXAocGIsIDIpOyAgICAgICAvKiBTa2lwIGJsb2NrIGFsaWduICovCiAgICAgYXZpb19za2lwKHBiLCAyKTsgICAgICAgLyogU2tpcCBiaXRzLXBlci1zYW1wbGUgKi8KIAotICAgIGlmICghc3QtPmNvZGVjLT5jaGFubmVscyB8fCAhc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSkKKyAgICBpZiAoIXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgfHwgIXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogCi0gICAgc3QtPmNvZGVjLT5iaXRfcmF0ZSA9IGF2X2NsaXAoMTVMTCAqIHN0LT5jb2RlYy0+Y2hhbm5lbHMgKiA4ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlIC8gMjgsIDAsIElOVF9NQVgpOworICAgIHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPSBhdl9jbGlwKDE1TEwgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzICogOCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAvIDI4LCAwLCBJTlRfTUFYKTsKIAotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWMtPnNhbXBsZV9yYXRlKTsKKyAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSk7CiAgICAgc3QtPnN0YXJ0X3RpbWUgPSAwOwogCiAgICAgcmV0dXJuIDA7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICBpZiAoeGEtPnNlbnRfYnl0ZXMgPj0geGEtPm91dF9zaXplKQogICAgICAgICByZXR1cm4gQVZFUlJPUl9FT0Y7CiAgICAgLyogMSBieXRlIGhlYWRlciBhbmQgMTQgYnl0ZXMgd29ydGggb2Ygc2FtcGxlcyAqIG51bWJlciBjaGFubmVscyBwZXIgYmxvY2sgKi8KLSAgICBwYWNrZXRfc2l6ZSA9IDE1KnN0LT5jb2RlYy0+Y2hhbm5lbHM7CisgICAgcGFja2V0X3NpemUgPSAxNSpzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogCiAgICAgcmV0ID0gYXZfZ2V0X3BhY2tldChwYiwgcGt0LCBwYWNrZXRfc2l6ZSk7CiAgICAgaWYocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3htdi5jIGIvbGliYXZmb3JtYXQveG12LmMKaW5kZXggNDVlNWViYy4uYjk3NGU1YSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQveG12LmMKKysrIGIvbGliYXZmb3JtYXQveG12LmMKQEAgLTUzLDYgKzUzLDcgQEAKIAogLyoqIEEgdmlkZW8gcGFja2V0IHdpdGggYW4gWE1WIGZpbGUuICovCiB0eXBlZGVmIHN0cnVjdCBYTVZWaWRlb1BhY2tldCB7CisgICAgaW50IGNyZWF0ZWQ7CiAgICAgaW50IHN0cmVhbV9pbmRleDsgLy8vPCBUaGUgZGVjb2RlciBzdHJlYW0gaW5kZXggZm9yIHRoaXMgdmlkZW8gcGFja2V0LgogCiAgICAgdWludDMyX3QgZGF0YV9zaXplOyAgIC8vLzwgVGhlIHNpemUgb2YgdGhlIHJlbWFpbmluZyB2aWRlbyBkYXRhLgpAQCAtNzAsMTIgKzcxLDEzIEBACiAKIC8qKiBBbiBhdWRpbyBwYWNrZXQgd2l0aCBhbiBYTVYgZmlsZS4gKi8KIHR5cGVkZWYgc3RydWN0IFhNVkF1ZGlvUGFja2V0IHsKKyAgICBpbnQgY3JlYXRlZDsKICAgICBpbnQgc3RyZWFtX2luZGV4OyAvLy88IFRoZSBkZWNvZGVyIHN0cmVhbSBpbmRleCBmb3IgdGhpcyBhdWRpbyBwYWNrZXQuCiAKICAgICAvKiBTdHJlYW0gZm9ybWF0IHByb3BlcnRpZXMuICovCiAgICAgdWludDE2X3QgY29tcHJlc3Npb247ICAgICAvLy88IFRoZSB0eXBlIG9mIGNvbXByZXNzaW9uLgogICAgIHVpbnQxNl90IGNoYW5uZWxzOyAgICAgICAgLy8vPCBOdW1iZXIgb2YgY2hhbm5lbHMuCi0gICAgdWludDMyX3Qgc2FtcGxlX3JhdGU7ICAgICAvLy88IFNhbXBsaW5nIHJhdGUuCisgICAgaW50MzJfdCBzYW1wbGVfcmF0ZTsgICAgICAvLy88IFNhbXBsaW5nIHJhdGUuCiAgICAgdWludDE2X3QgYml0c19wZXJfc2FtcGxlOyAvLy88IEJpdHMgcGVyIGNvbXByZXNzZWQgc2FtcGxlLgogICAgIHVpbnQzMl90IGJpdF9yYXRlOyAgICAgICAgLy8vPCBCaXRzIG9mIGNvbXByZXNzZWQgZGF0YSBwZXIgc2Vjb25kLgogICAgIHVpbnQxNl90IGZsYWdzOyAgICAgICAgICAgLy8vPCBGbGFncwpAQCAtMTA1LDYgKzEwNywxMCBAQAogICAgIHVpbnQxNl90IGN1cnJlbnRfc3RyZWFtOyAvLy88IFRoZSBpbmRleCBvZiB0aGUgc3RyZWFtIGN1cnJlbnRseSBoYW5kbGluZy4KICAgICB1aW50MTZfdCBzdHJlYW1fY291bnQ7ICAgLy8vPCBUaGUgbnVtYmVyIG9mIHN0cmVhbXMgaW4gdGhpcyBmaWxlLgogCisgICAgdWludDMyX3QgdmlkZW9fZHVyYXRpb247CisgICAgdWludDMyX3QgdmlkZW9fd2lkdGg7CisgICAgdWludDMyX3QgdmlkZW9faGVpZ2h0OworCiAgICAgWE1WVmlkZW9QYWNrZXQgIHZpZGVvOyAvLy88IFRoZSB2aWRlbyBwYWNrZXQgY29udGFpbmVkIGluIGVhY2ggcGFja2V0LgogICAgIFhNVkF1ZGlvUGFja2V0ICphdWRpbzsgLy8vPCBUaGUgYXVkaW8gcGFja2V0cyBjb250YWluZWQgaW4gZWFjaCBwYWNrZXQuCiB9IFhNVkRlbXV4Q29udGV4dDsKQEAgLTEzOSwxMyArMTQ1LDE0IEBACiB7CiAgICAgWE1WRGVtdXhDb250ZXh0ICp4bXYgPSBzLT5wcml2X2RhdGE7CiAgICAgQVZJT0NvbnRleHQgICAgICpwYiAgPSBzLT5wYjsKLSAgICBBVlN0cmVhbSAgICAgICAgKnZzdCA9IE5VTEw7CiAKICAgICB1aW50MzJfdCBmaWxlX3ZlcnNpb247CiAgICAgdWludDMyX3QgdGhpc19wYWNrZXRfc2l6ZTsKICAgICB1aW50MTZfdCBhdWRpb190cmFjazsKICAgICBpbnQgcmV0OwogCisgICAgcy0+Y3R4X2ZsYWdzIHw9IEFWRk1UQ1RYX05PSEVBREVSOworCiAgICAgYXZpb19za2lwKHBiLCA0KTsgLyogTmV4dCBwYWNrZXQgc2l6ZSAqLwogCiAgICAgdGhpc19wYWNrZXRfc2l6ZSA9IGF2aW9fcmwzMihwYik7CkBAIC0xNTcsMjQgKzE2NCwxMSBAQAogICAgIGlmICgoZmlsZV92ZXJzaW9uICE9IDQpICYmIChmaWxlX3ZlcnNpb24gIT0gMikpCiAgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVW5jb21tb24gdmVyc2lvbiAlIlBSSXUzMiIiLCBmaWxlX3ZlcnNpb24pOwogCisgICAgLyogVmlkZW8gdHJhY2tzICovCiAKLSAgICAvKiBWaWRlbyB0cmFjayAqLwotCi0gICAgdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKLSAgICBpZiAoIXZzdCkKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLQotICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMiwgMSwgMTAwMCk7Ci0KLSAgICB2c3QtPmNvZGVjLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX1ZJREVPOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX2lkICAgPSBBVl9DT0RFQ19JRF9XTVYyOwotICAgIHZzdC0+Y29kZWMtPmNvZGVjX3RhZyAgPSBNS0JFVEFHKCdXJywgJ00nLCAnVicsICcyJyk7Ci0gICAgdnN0LT5jb2RlYy0+d2lkdGggICAgICA9IGF2aW9fcmwzMihwYik7Ci0gICAgdnN0LT5jb2RlYy0+aGVpZ2h0ICAgICA9IGF2aW9fcmwzMihwYik7Ci0KLSAgICB2c3QtPmR1cmF0aW9uICAgICAgICAgID0gYXZpb19ybDMyKHBiKTsKLQotICAgIHhtdi0+dmlkZW8uc3RyZWFtX2luZGV4ID0gdnN0LT5pbmRleDsKKyAgICB4bXYtPnZpZGVvX3dpZHRoICAgID0gYXZpb19ybDMyKHBiKTsKKyAgICB4bXYtPnZpZGVvX2hlaWdodCAgID0gYXZpb19ybDMyKHBiKTsKKyAgICB4bXYtPnZpZGVvX2R1cmF0aW9uID0gYXZpb19ybDMyKHBiKTsKIAogICAgIC8qIEF1ZGlvIHRyYWNrcyAqLwogCkBAIC0xODIsNyArMTc2LDcgQEAKIAogICAgIGF2aW9fc2tpcChwYiwgMik7IC8qIFVua25vd24gKHBhZGRpbmc/KSAqLwogCi0gICAgeG12LT5hdWRpbyA9IGF2X21hbGxvY19hcnJheSh4bXYtPmF1ZGlvX3RyYWNrX2NvdW50LCBzaXplb2YoWE1WQXVkaW9QYWNrZXQpKTsKKyAgICB4bXYtPmF1ZGlvID0gYXZfbWFsbG9jel9hcnJheSh4bXYtPmF1ZGlvX3RyYWNrX2NvdW50LCBzaXplb2YoWE1WQXVkaW9QYWNrZXQpKTsKICAgICBpZiAoIXhtdi0+YXVkaW8pIHsKICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICBnb3RvIGZhaWw7CkBAIC0xOTAsNyArMTg0LDYgQEAKIAogICAgIGZvciAoYXVkaW9fdHJhY2sgPSAwOyBhdWRpb190cmFjayA8IHhtdi0+YXVkaW9fdHJhY2tfY291bnQ7IGF1ZGlvX3RyYWNrKyspIHsKICAgICAgICAgWE1WQXVkaW9QYWNrZXQgKnBhY2tldCA9ICZ4bXYtPmF1ZGlvW2F1ZGlvX3RyYWNrXTsKLSAgICAgICAgQVZTdHJlYW0gKmFzdCA9IE5VTEw7CiAKICAgICAgICAgcGFja2V0LT5jb21wcmVzc2lvbiAgICAgPSBhdmlvX3JsMTYocGIpOwogICAgICAgICBwYWNrZXQtPmNoYW5uZWxzICAgICAgICA9IGF2aW9fcmwxNihwYik7CkBAIC0yMTcsMzQgKzIxMCwxMyBAQAogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiVW5zdXBwb3J0ZWQgNS4xIEFEUENNIGF1ZGlvIHN0cmVhbSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoMHglMDRYKVxuIiwgcGFja2V0LT5mbGFncyk7CiAKLSAgICAgICAgaWYgKCFwYWNrZXQtPmNoYW5uZWxzIHx8ICFwYWNrZXQtPnNhbXBsZV9yYXRlIHx8CisgICAgICAgIGlmICghcGFja2V0LT5jaGFubmVscyB8fCBwYWNrZXQtPnNhbXBsZV9yYXRlIDw9IDAgfHwKICAgICAgICAgICAgICBwYWNrZXQtPmNoYW5uZWxzID49IFVJTlQxNl9NQVggLyBYTVZfQkxPQ0tfQUxJR05fU0laRSkgewogICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGFyYW1ldGVycyBmb3IgYXVkaW8gdHJhY2sgJSJQUkl1MTYiLlxuIiwKICAgICAgICAgICAgICAgICAgICBhdWRpb190cmFjayk7CiAgICAgICAgICAgICByZXQgPSBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9Ci0KLSAgICAgICAgYXN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKLSAgICAgICAgaWYgKCFhc3QpIHsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGFzdC0+Y29kZWMtPmNvZGVjX3R5cGUgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9BVURJTzsKLSAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfaWQgICAgICAgICAgICAgID0gcGFja2V0LT5jb2RlY19pZDsKLSAgICAgICAgYXN0LT5jb2RlYy0+Y29kZWNfdGFnICAgICAgICAgICAgID0gcGFja2V0LT5jb21wcmVzc2lvbjsKLSAgICAgICAgYXN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgICAgICAgICAgID0gcGFja2V0LT5jaGFubmVsczsKLSAgICAgICAgYXN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gcGFja2V0LT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgYXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlID0gcGFja2V0LT5iaXRzX3Blcl9zYW1wbGU7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmJpdF9yYXRlICAgICAgICAgICAgICA9IHBhY2tldC0+Yml0X3JhdGU7Ci0gICAgICAgIGFzdC0+Y29kZWMtPmJsb2NrX2FsaWduICAgICAgICAgICA9IDM2ICogcGFja2V0LT5jaGFubmVsczsKLQotICAgICAgICBhdnByaXZfc2V0X3B0c19pbmZvKGFzdCwgMzIsIHBhY2tldC0+YmxvY2tfc2FtcGxlcywgcGFja2V0LT5zYW1wbGVfcmF0ZSk7Ci0KLSAgICAgICAgcGFja2V0LT5zdHJlYW1faW5kZXggPSBhc3QtPmluZGV4OwotCi0gICAgICAgIGFzdC0+ZHVyYXRpb24gPSB2c3QtPmR1cmF0aW9uOwogICAgIH0KIAogCkBAIC0zMTUsNiArMjg3LDI2IEBACiAKICAgICB4bXYtPnZpZGVvLmhhc19leHRyYWRhdGEgPSAoZGF0YVszXSAmIDB4ODApICE9IDA7CiAKKyAgICBpZiAoIXhtdi0+dmlkZW8uY3JlYXRlZCkgeworICAgICAgICBBVlN0cmVhbSAqdnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKKyAgICAgICAgaWYgKCF2c3QpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIGF2cHJpdl9zZXRfcHRzX2luZm8odnN0LCAzMiwgMSwgMTAwMCk7CisKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgdnN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICA9IEFWX0NPREVDX0lEX1dNVjI7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgPSBNS0JFVEFHKCdXJywgJ00nLCAnVicsICcyJyk7CisgICAgICAgIHZzdC0+Y29kZWNwYXItPndpZHRoICAgICAgPSB4bXYtPnZpZGVvX3dpZHRoOworICAgICAgICB2c3QtPmNvZGVjcGFyLT5oZWlnaHQgICAgID0geG12LT52aWRlb19oZWlnaHQ7CisKKyAgICAgICAgdnN0LT5kdXJhdGlvbiA9IHhtdi0+dmlkZW9fZHVyYXRpb247CisKKyAgICAgICAgeG12LT52aWRlby5zdHJlYW1faW5kZXggPSB2c3QtPmluZGV4OworCisgICAgICAgIHhtdi0+dmlkZW8uY3JlYXRlZCA9IDE7CisgICAgfQorCiAgICAgLyogQWRkaW5nIHRoZSBhdWRpbyBkYXRhIHNpemVzIGFuZCB0aGUgdmlkZW8gZGF0YSBzaXplIGtlZXBzIHlvdSA0IGJ5dGVzCiAgICAgICogc2hvcnQgZm9yIGV2ZXJ5IGF1ZGlvIHRyYWNrLiBCdXQgYXMgcGxheWluZyBhcm91bmQgd2l0aCBYTVYgZmlsZXMgd2l0aAogICAgICAqIEFEUENNIGF1ZGlvIHNob3dlZCwgdGFraW5nIHRoZSBleHRyYSA0IGJ5dGVzIGZyb20gdGhlIGF1ZGlvIGRhdGEgZ2l2ZXMKQEAgLTM0MCw2ICszMzIsMjkgQEAKICAgICAgICAgaWYgKGF2aW9fcmVhZChwYiwgZGF0YSwgNCkgIT0gNCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAKKyAgICAgICAgaWYgKCFwYWNrZXQtPmNyZWF0ZWQpIHsKKyAgICAgICAgICAgIEFWU3RyZWFtICphc3QgPSBhdmZvcm1hdF9uZXdfc3RyZWFtKHMsIE5VTEwpOworICAgICAgICAgICAgaWYgKCFhc3QpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgICAgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgICAgICAgID0gcGFja2V0LT5jb2RlY19pZDsKKyAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyAgICAgICAgICAgICA9IHBhY2tldC0+Y29tcHJlc3Npb247CisgICAgICAgICAgICBhc3QtPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICAgICAgICAgPSBwYWNrZXQtPmNoYW5uZWxzOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgICAgICAgICAgID0gcGFja2V0LT5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSA9IHBhY2tldC0+Yml0c19wZXJfc2FtcGxlOworICAgICAgICAgICAgYXN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgICAgICAgICAgICAgID0gcGFja2V0LT5iaXRfcmF0ZTsKKyAgICAgICAgICAgIGFzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduICAgICAgICAgICA9IDM2ICogcGFja2V0LT5jaGFubmVsczsKKworICAgICAgICAgICAgYXZwcml2X3NldF9wdHNfaW5mbyhhc3QsIDMyLCBwYWNrZXQtPmJsb2NrX3NhbXBsZXMsIHBhY2tldC0+c2FtcGxlX3JhdGUpOworCisgICAgICAgICAgICBwYWNrZXQtPnN0cmVhbV9pbmRleCA9IGFzdC0+aW5kZXg7CisKKyAgICAgICAgICAgIGFzdC0+ZHVyYXRpb24gPSB4bXYtPnZpZGVvX2R1cmF0aW9uOworCisgICAgICAgICAgICBwYWNrZXQtPmNyZWF0ZWQgPSAxOworICAgICAgICB9CisKICAgICAgICAgcGFja2V0LT5kYXRhX3NpemUgPSBBVl9STDMyKGRhdGEpICYgMHgwMDdGRkZGRjsKICAgICAgICAgaWYgKChwYWNrZXQtPmRhdGFfc2l6ZSA9PSAwKSAmJiAoYXVkaW9fdHJhY2sgIT0gMCkpCiAgICAgICAgICAgICAvKiBUaGlzIGhhcHBlbnMgd2hlbiBJIGNyZWF0ZSBhbiBYTVYgd2l0aCBzZXZlcmFsIGlkZW50aWNhbCBhdWRpbwpAQCAtMzgxLDE0ICszOTYsMTQgQEAKIAogICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoeG12LT52aWRlby5zdHJlYW1faW5kZXggPCBzLT5uYl9zdHJlYW1zKTsKIAotICAgICAgICAgICAgICAgIGlmICh2c3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfZnJlZXAoJnZzdC0+Y29kZWMtPmV4dHJhZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKHZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplIDwgNCkgeworICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmdnN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2FsbG9jX2V4dHJhZGF0YSh2c3QtPmNvZGVjLCA0KSkgPCAwKQorICAgICAgICAgICAgICAgICAgICBpZiAoKHJldCA9IGZmX2FsbG9jX2V4dHJhZGF0YSh2c3QtPmNvZGVjcGFyLCA0KSkgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtZW1jcHkodnN0LT5jb2RlYy0+ZXh0cmFkYXRhLCB4bXYtPnZpZGVvLmV4dHJhZGF0YSwgNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHZzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgeG12LT52aWRlby5leHRyYWRhdGEsIDQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQveHZhZy5jIGIvbGliYXZmb3JtYXQveHZhZy5jCmluZGV4IDkyYzgwYTQuLjIyZTRmMWUgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3h2YWcuYworKysgYi9saWJhdmZvcm1hdC94dmFnLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImF2Zm9ybWF0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIApAQCAtNDMsNyArNDQsNyBAQAogICAgIGlmICghc3QpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgc3QtPmNvZGVjcGFyLT5jb2RlY190eXBlID0gQVZNRURJQV9UWVBFX0FVRElPOwogCiAgICAgb2Zmc2V0ICAgICA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgYmlnX2VuZGlhbiA9IG9mZnNldCA+IGF2X2Jzd2FwMzIob2Zmc2V0KTsKQEAgLTUxLDMwICs1MiwzMCBAQAogICAgICAgICBvZmZzZXQgICAgICAgICAgICAgICAgID0gYXZfYnN3YXAzMihvZmZzZXQpOwogICAgICAgICBhdmlvX3NraXAocy0+cGIsIDI4KTsKICAgICAgICAgY29kZWMgICAgICAgICAgICAgICAgICA9IGF2aW9fcmIzMihzLT5wYik7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gYXZpb19yYjMyKHMtPnBiKTsKICAgICAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKICAgICAgICAgc3QtPmR1cmF0aW9uICAgICAgICAgICA9IGF2aW9fcmIzMihzLT5wYik7CiAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgOCk7Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JiMzIocy0+cGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19yYjMyKHMtPnBiKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdmlvX3NraXAocy0+cGIsIDI4KTsKICAgICAgICAgY29kZWMgICAgICAgICAgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7Ci0gICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMgICAgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID0gYXZpb19ybDMyKHMtPnBiKTsKICAgICAgICAgYXZpb19za2lwKHMtPnBiLCA0KTsKICAgICAgICAgc3QtPmR1cmF0aW9uICAgICAgICAgICA9IGF2aW9fcmwzMihzLT5wYik7CiAgICAgICAgIGF2aW9fc2tpcChzLT5wYiwgOCk7Ci0gICAgICAgIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBhdmlvX3JsMzIocy0+cGIpOworICAgICAgICBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlID0gYXZpb19ybDMyKHMtPnBiKTsKICAgICB9CiAKLSAgICBpZiAoc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSA8PSAwKQorICAgIGlmIChzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlIDw9IDApCiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwotICAgIGlmIChzdC0+Y29kZWMtPmNoYW5uZWxzIDw9IDApCisgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgPD0gMCB8fCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzID4gRkZfU0FORV9OQl9DSEFOTkVMUykKICAgICAgICAgcmV0dXJuIEFWRVJST1JfSU5WQUxJRERBVEE7CiAKICAgICBzd2l0Y2ggKGNvZGVjKSB7CiAgICAgY2FzZSAweDFjOgotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fUFNYOwotICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMTYgKiBzdC0+Y29kZWMtPmNoYW5uZWxzOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfQURQQ01fUFNYOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMTYgKiBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgImNvZGVjICVYIiwgY29kZWMpOwpAQCAtODQsMjIgKzg1LDIyIEBACiAgICAgYXZpb19za2lwKHMtPnBiLCBvZmZzZXQgLSBhdmlvX3RlbGwocy0+cGIpKTsKIAogICAgIGlmIChhdmlvX3JiMTYocy0+cGIpID09IDB4RkZGQikgewotICAgICAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfTVAzOwotICAgICAgICBzdC0+Y29kZWMtPmJsb2NrX2FsaWduID0gMHgxMDAwOworICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgID0gQVZfQ09ERUNfSURfTVAzOworICAgICAgICBzdC0+Y29kZWNwYXItPmJsb2NrX2FsaWduID0gMHgxMDAwOwogICAgICAgICBzdC0+bmVlZF9wYXJzaW5nICAgICAgID0gQVZTVFJFQU1fUEFSU0VfRlVMTF9SQVc7CiAgICAgfQogCiAgICAgYXZpb19za2lwKHMtPnBiLCAtMik7Ci0gICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlYy0+c2FtcGxlX3JhdGUpOworICAgIGF2cHJpdl9zZXRfcHRzX2luZm8oc3QsIDY0LCAxLCBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlKTsKIAogICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHh2YWdfcmVhZF9wYWNrZXQoQVZGb3JtYXRDb250ZXh0ICpzLCBBVlBhY2tldCAqcGt0KQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjb2RlYyA9IHMtPnN0cmVhbXNbMF0tPmNvZGVjOworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXIgPSBzLT5zdHJlYW1zWzBdLT5jb2RlY3BhcjsKIAotICAgIHJldHVybiBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIGNvZGVjLT5ibG9ja19hbGlnbik7CisgICAgcmV0dXJuIGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgcGFyLT5ibG9ja19hbGlnbik7CiB9CiAKIEFWSW5wdXRGb3JtYXQgZmZfeHZhZ19kZW11eGVyID0gewpkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQveHdtYS5jIGIvbGliYXZmb3JtYXQveHdtYS5jCmluZGV4IGQ1MTZiNzYuLjFjMTg3NzIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3h3bWEuYworKysgYi9saWJhdmZvcm1hdC94d21hLmMKQEAgLTc1LDcgKzc1LDcgQEAKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlYywgc2l6ZSwgMCk7CisgICAgcmV0ID0gZmZfZ2V0X3dhdl9oZWFkZXIocywgcGIsIHN0LT5jb2RlY3Bhciwgc2l6ZSwgMCk7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgc3QtPm5lZWRfcGFyc2luZyA9IEFWU1RSRUFNX1BBUlNFX05PTkU7CkBAIC04NSwxMCArODUsMTEgQEAKICAgICAgKiBleHRyYWRhdGEgZm9yIHRoYXQuIFRodXMsIGFzayB0aGUgdXNlciBmb3IgZmVlZGJhY2ssIGJ1dCB0cnkgdG8gZ28gb24KICAgICAgKiBhbnl3YXkuCiAgICAgICovCi0gICAgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV01BVjIgJiYKLSAgICAgICAgc3QtPmNvZGVjLT5jb2RlY19pZCAhPSBBVl9DT0RFQ19JRF9XTUFQUk8pIHsKLSAgICAgICAgYXZwcml2X3JlcXVlc3Rfc2FtcGxlKHMsICJVbmV4cGVjdGVkIGNvZGVjICh0YWcgMHgwNCV4OyBpZCAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5jb2RlY190YWcsIHN0LT5jb2RlYy0+Y29kZWNfaWQpOworICAgIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dNQVYyICYmCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV01BUFJPKSB7CisgICAgICAgIGF2cHJpdl9yZXF1ZXN0X3NhbXBsZShzLCAiVW5leHBlY3RlZCBjb2RlYyAodGFnICVzOyBpZCAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZm91cmNjMnN0cihzdC0+Y29kZWNwYXItPmNvZGVjX3RhZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkKTsKICAgICB9IGVsc2UgewogICAgICAgICAvKiBJbiBhbGwgeFdNQSBmaWxlcyBJIGhhdmUgc2VlbiwgdGhlcmUgaXMgbm8gZXh0cmFkYXRhLiBCdXQgdGhlIFdNQQogICAgICAgICAgKiBjb2RlY3MgcmVxdWlyZSBleHRyYWRhdGEsIHNvIHdlIHByb3ZpZGUgb3VyIG93biBmYWtlIGV4dHJhZGF0YS4KQEAgLTk3LDQzICs5OCw0MyBAQAogICAgICAgICAgKiB0aGVyZSB3YXMsIHRoZW4gdHJ5IHRvIHVzZSBpdCwgYWZ0ZXIgYXNraW5nIHRoZSB1c2VyIHRvIHByb3ZpZGUgYQogICAgICAgICAgKiBzYW1wbGUgb2YgdGhpcyB1bnVzdWFsIGZpbGUuCiAgICAgICAgICAqLwotICAgICAgICBpZiAoc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSAhPSAwKSB7CisgICAgICAgIGlmIChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplICE9IDApIHsKICAgICAgICAgICAgIC8qIFN1cnByaXNlLCBzdXJwcmlzZTogV2UgKmRpZCogZ2V0IHNvbWUgZXh0cmFkYXRhLiBObyBpZGVhCiAgICAgICAgICAgICAgKiBpZiBpdCB3aWxsIHdvcmssIGJ1dCBqdXN0IGdvIG9uIGFuZCB0cnkgaXQsIGFmdGVyIGFza2luZwogICAgICAgICAgICAgICogdGhlIHVzZXIgZm9yIGEgc2FtcGxlLgogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBhdnByaXZfcmVxdWVzdF9zYW1wbGUocywgIlVuZXhwZWN0ZWQgZXh0cmFkYXRhICglZCBieXRlcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlYy0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01BUFJPKSB7Ci0gICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlYywgMTgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfV01BUFJPKSB7CisgICAgICAgICAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHN0LT5jb2RlY3BhciwgMTgpKQogICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICAgICAgICAgIG1lbXNldChzdC0+Y29kZWMtPmV4dHJhZGF0YSwgMCwgc3QtPmNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7Ci0gICAgICAgICAgICBzdC0+Y29kZWMtPmV4dHJhZGF0YVsgMF0gPSBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKLSAgICAgICAgICAgIHN0LT5jb2RlYy0+ZXh0cmFkYXRhWzE0XSA9IDIyNDsKKyAgICAgICAgICAgIG1lbXNldChzdC0+Y29kZWNwYXItPmV4dHJhZGF0YSwgMCwgc3QtPmNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YVsgMF0gPSBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzE0XSA9IDIyNDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjLCA2KSkKKyAgICAgICAgICAgIGlmIChmZl9hbGxvY19leHRyYWRhdGEoc3QtPmNvZGVjcGFyLCA2KSkKICAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCi0gICAgICAgICAgICBtZW1zZXQoc3QtPmNvZGVjLT5leHRyYWRhdGEsIDAsIHN0LT5jb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgICAgICAgICAgbWVtc2V0KHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhLCAwLCBzdC0+Y29kZWNwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICAgICAgICAgIC8qIHNldHVwIGV4dHJhZGF0YSB3aXRoIG91ciBleHBlcmltZW50YWxseSBvYnRhaW5lZCB2YWx1ZSAqLwotICAgICAgICAgICAgc3QtPmNvZGVjLT5leHRyYWRhdGFbNF0gPSAzMTsKKyAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+ZXh0cmFkYXRhWzRdID0gMzE7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIXN0LT5jb2RlYy0+Y2hhbm5lbHMpIHsKKyAgICBpZiAoIXN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiSW52YWxpZCBjaGFubmVsIGNvdW50OiAlZFxuIiwKLSAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgc3QtPmNvZGVjcGFyLT5jaGFubmVscyk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KLSAgICBpZiAoIXN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSB7CisgICAgaWYgKCFzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgewogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJJbnZhbGlkIGJpdHNfcGVyX2NvZGVkX3NhbXBsZTogJWRcbiIsCi0gICAgICAgICAgICAgICBzdC0+Y29kZWMtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CisgICAgICAgICAgICAgICBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SX0lOVkFMSUREQVRBOwogICAgIH0KIAogICAgIC8qIHNldCB0aGUgc2FtcGxlIHJhdGUgKi8KLSAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgMSwgc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSk7CisgICAgYXZwcml2X3NldF9wdHNfaW5mbyhzdCwgNjQsIDEsIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUpOwogCiAgICAgLyogcGFyc2UgdGhlIHJlbWFpbmluZyBSSUZGIGNodW5rcyAqLwogICAgIGZvciAoOzspIHsKQEAgLTE1Myw3ICsxNTQsNyBAQAogICAgICAgICAgICAgICogbnVtYmVyIG9mIGJ5dGVzIGFjY3VtdWxhdGVkIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIHhXTUEgcGFja2V0CiAgICAgICAgICAgICAgKiBpcyBkZWNvZGVkIGluIG9yZGVyLiIKICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBFYWNoIHBhY2tldCBoYXMgc2l6ZSBlcXVhbCB0byBzdC0+Y29kZWMtPmJsb2NrX2FsaWduLCB3aGljaCBpbgorICAgICAgICAgICAgICogRWFjaCBwYWNrZXQgaGFzIHNpemUgZXF1YWwgdG8gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiwgd2hpY2ggaW4KICAgICAgICAgICAgICAqIGFsbCBjYXNlcyBJIHNhdyBzbyBmYXIgd2FzIGFsd2F5cyAyMjMwLiBUaHVzLCB3ZSBjYW4gdXNlIHRoZQogICAgICAgICAgICAgICogZHBkcyBkYXRhIHRvIGNvbXB1dGUgYSBzZWVraW5nIGluZGV4LgogICAgICAgICAgICAgICovCkBAIC0yMDcsNyArMjA4LDcgQEAKICAgICBpZiAoZHBkc190YWJsZSAmJiBkcGRzX3RhYmxlX3NpemUpIHsKICAgICAgICAgaW50NjRfdCBjdXJfcG9zOwogICAgICAgICBjb25zdCB1aW50MzJfdCBieXRlc19wZXJfc2FtcGxlCi0gICAgICAgICAgICAgICAgPSAoc3QtPmNvZGVjLT5jaGFubmVscyAqIHN0LT5jb2RlYy0+Yml0c19wZXJfY29kZWRfc2FtcGxlKSA+PiAzOworICAgICAgICAgICAgICAgID0gKHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHMgKiBzdC0+Y29kZWNwYXItPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSkgPj4gMzsKIAogICAgICAgICAvKiBFc3RpbWF0ZSB0aGUgZHVyYXRpb24gZnJvbSB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCBieXRlcy4gKi8KICAgICAgICAgY29uc3QgdWludDY0X3QgdG90YWxfZGVjb2RlZF9ieXRlcyA9IGRwZHNfdGFibGVbZHBkc190YWJsZV9zaXplIC0gMV07CkBAIC0yMTUsNyArMjE2LDcgQEAKICAgICAgICAgaWYgKCFieXRlc19wZXJfc2FtcGxlKSB7CiAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLAogICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJpdHNfcGVyX2NvZGVkX3NhbXBsZSAlZCBmb3IgJWQgY2hhbm5lbHNcbiIsCi0gICAgICAgICAgICAgICAgICAgc3QtPmNvZGVjLT5iaXRzX3Blcl9jb2RlZF9zYW1wbGUsIHN0LT5jb2RlYy0+Y2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+Yml0c19wZXJfY29kZWRfc2FtcGxlLCBzdC0+Y29kZWNwYXItPmNoYW5uZWxzKTsKICAgICAgICAgICAgIHJldCA9IEFWRVJST1JfSU5WQUxJRERBVEE7CiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KQEAgLTIzOCwxOCArMjM5LDE4IEBACiAgICAgICAgICAgICAgKiBhbiBvZmZzZXQgLyB0aW1lc3RhbXAgcGFpci4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgYXZfYWRkX2luZGV4X2VudHJ5KHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9wb3MgKyAoaSsxKSAqIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24sIC8qIHBvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwZHNfdGFibGVbaV0gLyBieXRlc19wZXJfc2FtcGxlLCAgICAgICAgIC8qIHRpbWVzdGFtcCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24sICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkdXJhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9wb3MgKyAoaSsxKSAqIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24sIC8qIHBvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwZHNfdGFibGVbaV0gLyBieXRlc19wZXJfc2FtcGxlLCAgICAgICAgICAgIC8qIHRpbWVzdGFtcCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0LT5jb2RlY3Bhci0+YmxvY2tfYWxpZ24sICAgICAgICAgICAgICAgICAgIC8qIHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkdXJhdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSU5ERVhfS0VZRlJBTUUpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmJpdF9yYXRlKSB7CisgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmJpdF9yYXRlKSB7CiAgICAgICAgIC8qIE5vIGRwZHMgY2h1bmsgd2FzIHByZXNlbnQgKG9yIG9ubHkgYW4gZW1wdHkgb25lKSwgc28gZXN0aW1hdGUKICAgICAgICAgICogdGhlIHRvdGFsIGR1cmF0aW9uIHVzaW5nIHRoZSBhdmVyYWdlIGJpdHMgcGVyIHNhbXBsZSBhbmQgdGhlCiAgICAgICAgICAqIHRvdGFsIGRhdGEgbGVuZ3RoLgogICAgICAgICAgKi8KLSAgICAgICAgc3QtPmR1cmF0aW9uID0gKHNpemU8PDMpICogc3QtPmNvZGVjLT5zYW1wbGVfcmF0ZSAvIHN0LT5jb2RlYy0+Yml0X3JhdGU7CisgICAgICAgIHN0LT5kdXJhdGlvbiA9IChzaXplPDwzKSAqIHN0LT5jb2RlY3Bhci0+c2FtcGxlX3JhdGUgLyBzdC0+Y29kZWNwYXItPmJpdF9yYXRlOwogICAgIH0KIAogZmFpbDoKQEAgLTI3Myw3ICsyNzQsNyBAQAogICAgIH0KIAogICAgIC8qIHJlYWQgYSBzaW5nbGUgYmxvY2s7IHRoZSBkZWZhdWx0IGJsb2NrIHNpemUgaXMgMjIzMC4gKi8KLSAgICBzaXplID0gKHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gPiAxKSA/IHN0LT5jb2RlYy0+YmxvY2tfYWxpZ24gOiAyMjMwOworICAgIHNpemUgPSAoc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA+IDEpID8gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbiA6IDIyMzA7CiAgICAgc2l6ZSA9IEZGTUlOKHNpemUsIGxlZnQpOwogCiAgICAgcmV0ICA9IGF2X2dldF9wYWNrZXQocy0+cGIsIHBrdCwgc2l6ZSk7CmRpZmYgLS1naXQgYS9saWJhdmZvcm1hdC95b3AuYyBiL2xpYmF2Zm9ybWF0L3lvcC5jCmluZGV4IDliNzdmNmUuLmU2ZmQ4OTYgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3lvcC5jCisrKyBiL2xpYmF2Zm9ybWF0L3lvcC5jCkBAIC01OCw3ICs1OCw3IEBACiAgICAgWW9wRGVjQ29udGV4dCAqeW9wID0gcy0+cHJpdl9kYXRhOwogICAgIEFWSU9Db250ZXh0ICpwYiAgPSBzLT5wYjsKIAotICAgIEFWQ29kZWNDb250ZXh0ICphdWRpb19kZWMsICp2aWRlb19kZWM7CisgICAgQVZDb2RlY1BhcmFtZXRlcnMgKmF1ZGlvX3BhciwgKnZpZGVvX3BhcjsKICAgICBBVlN0cmVhbSAqYXVkaW9fc3RyZWFtLCAqdmlkZW9fc3RyZWFtOwogCiAgICAgaW50IGZyYW1lX3JhdGUsIHJldDsKQEAgLTY5LDM5ICs2OSwzOSBAQAogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgLy8gRXh0cmEgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBkZWNvZGVyCi0gICAgaWYgKGZmX2FsbG9jX2V4dHJhZGF0YSh2aWRlb19zdHJlYW0tPmNvZGVjLCA4KSkKKyAgICBpZiAoZmZfYWxsb2NfZXh0cmFkYXRhKHZpZGVvX3N0cmVhbS0+Y29kZWNwYXIsIDgpKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwogCiAgICAgLy8gQXVkaW8KLSAgICBhdWRpb19kZWMgICAgICAgICAgICAgICA9IGF1ZGlvX3N0cmVhbS0+Y29kZWM7Ci0gICAgYXVkaW9fZGVjLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfQVVESU87Ci0gICAgYXVkaW9fZGVjLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQVBDOwotICAgIGF1ZGlvX2RlYy0+Y2hhbm5lbHMgICAgID0gMTsKLSAgICBhdWRpb19kZWMtPmNoYW5uZWxfbGF5b3V0ID0gQVZfQ0hfTEFZT1VUX01PTk87Ci0gICAgYXVkaW9fZGVjLT5zYW1wbGVfcmF0ZSAgPSAyMjA1MDsKKyAgICBhdWRpb19wYXIgICAgICAgICAgICAgICAgID0gYXVkaW9fc3RyZWFtLT5jb2RlY3BhcjsKKyAgICBhdWRpb19wYXItPmNvZGVjX3R5cGUgICAgID0gQVZNRURJQV9UWVBFX0FVRElPOworICAgIGF1ZGlvX3Bhci0+Y29kZWNfaWQgICAgICAgPSBBVl9DT0RFQ19JRF9BRFBDTV9JTUFfQVBDOworICAgIGF1ZGlvX3Bhci0+Y2hhbm5lbHMgICAgICAgPSAxOworICAgIGF1ZGlvX3Bhci0+Y2hhbm5lbF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfTU9OTzsKKyAgICBhdWRpb19wYXItPnNhbXBsZV9yYXRlICAgID0gMjIwNTA7CiAKICAgICAvLyBWaWRlbwotICAgIHZpZGVvX2RlYyAgICAgICAgICAgICAgID0gdmlkZW9fc3RyZWFtLT5jb2RlYzsKLSAgICB2aWRlb19kZWMtPmNvZGVjX3R5cGUgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICB2aWRlb19kZWMtPmNvZGVjX2lkICAgICA9IEFWX0NPREVDX0lEX1lPUDsKKyAgICB2aWRlb19wYXIgICAgICAgICAgICAgICA9IHZpZGVvX3N0cmVhbS0+Y29kZWNwYXI7CisgICAgdmlkZW9fcGFyLT5jb2RlY190eXBlICAgPSBBVk1FRElBX1RZUEVfVklERU87CisgICAgdmlkZW9fcGFyLT5jb2RlY19pZCAgICAgPSBBVl9DT0RFQ19JRF9ZT1A7CiAKICAgICBhdmlvX3NraXAocGIsIDYpOwogCiAgICAgZnJhbWVfcmF0ZSAgICAgICAgICAgICAgPSBhdmlvX3I4KHBiKTsKICAgICB5b3AtPmZyYW1lX3NpemUgICAgICAgICA9IGF2aW9fcjgocGIpICogMjA0ODsKLSAgICB2aWRlb19kZWMtPndpZHRoICAgICAgICA9IGF2aW9fcmwxNihwYik7Ci0gICAgdmlkZW9fZGVjLT5oZWlnaHQgICAgICAgPSBhdmlvX3JsMTYocGIpOworICAgIHZpZGVvX3Bhci0+d2lkdGggICAgICAgID0gYXZpb19ybDE2KHBiKTsKKyAgICB2aWRlb19wYXItPmhlaWdodCAgICAgICA9IGF2aW9fcmwxNihwYik7CiAKICAgICB2aWRlb19zdHJlYW0tPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7MSwgMn07CiAKLSAgICByZXQgPSBhdmlvX3JlYWQocGIsIHZpZGVvX2RlYy0+ZXh0cmFkYXRhLCA4KTsKKyAgICByZXQgPSBhdmlvX3JlYWQocGIsIHZpZGVvX3Bhci0+ZXh0cmFkYXRhLCA4KTsKICAgICBpZiAocmV0IDwgOCkKICAgICAgICAgcmV0dXJuIHJldCA8IDAgPyByZXQgOiBBVkVSUk9SX0VPRjsKIAotICAgIHlvcC0+cGFsZXR0ZV9zaXplICAgICAgID0gdmlkZW9fZGVjLT5leHRyYWRhdGFbMF0gKiAzICsgNDsKLSAgICB5b3AtPmF1ZGlvX2Jsb2NrX2xlbmd0aCA9IEFWX1JMMTYodmlkZW9fZGVjLT5leHRyYWRhdGEgKyA2KTsKKyAgICB5b3AtPnBhbGV0dGVfc2l6ZSAgICAgICA9IHZpZGVvX3Bhci0+ZXh0cmFkYXRhWzBdICogMyArIDQ7CisgICAgeW9wLT5hdWRpb19ibG9ja19sZW5ndGggPSBBVl9STDE2KHZpZGVvX3Bhci0+ZXh0cmFkYXRhICsgNik7CiAKLSAgICB2aWRlb19kZWMtPmJpdF9yYXRlICAgICA9IDggKiAoeW9wLT5mcmFtZV9zaXplIC0geW9wLT5hdWRpb19ibG9ja19sZW5ndGgpICogZnJhbWVfcmF0ZTsKKyAgICB2aWRlb19wYXItPmJpdF9yYXRlICAgICA9IDggKiAoeW9wLT5mcmFtZV9zaXplIC0geW9wLT5hdWRpb19ibG9ja19sZW5ndGgpICogZnJhbWVfcmF0ZTsKIAogICAgIC8vIDE4NDAgc2FtcGxlcyBwZXIgZnJhbWUsIDEgbmliYmxlIHBlciBzYW1wbGU7IGhlbmNlIDE4NDAvMiA9IDkyMAogICAgIGlmICh5b3AtPmF1ZGlvX2Jsb2NrX2xlbmd0aCA8IDkyMCB8fApkaWZmIC0tZ2l0IGEvbGliYXZmb3JtYXQveXV2NG1wZWdkZWMuYyBiL2xpYmF2Zm9ybWF0L3l1djRtcGVnZGVjLmMKaW5kZXggZWExYWUyNS4uZmYwMTI1ZSAxMDA2NDQKLS0tIGEvbGliYXZmb3JtYXQveXV2NG1wZWdkZWMuYworKysgYi9saWJhdmZvcm1hdC95dXY0bXBlZ2RlYy5jCkBAIC0xMjYsNiArMTI2LDEyIEBACiAgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfWVVWNDQ0UDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgibW9ubzE2IiwgdG9rc3RhcnQsIDYpID09IDApIHsKICAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZMTY7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAoIm1vbm8xMiIsIHRva3N0YXJ0LCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcGl4X2ZtdCA9IEFWX1BJWF9GTVRfR1JBWTEyOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCJtb25vMTAiLCB0b2tzdGFydCwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVkxMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgibW9ubzkiLCB0b2tzdGFydCwgNSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX0dSQVk5OwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKCJtb25vIiwgdG9rc3RhcnQsIDQpID09IDApIHsKICAgICAgICAgICAgICAgICBwaXhfZm10ID0gQVZfUElYX0ZNVF9HUkFZODsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yNDcsMTggKzI1MywxOCBAQAogICAgIHN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShzLCBOVUxMKTsKICAgICBpZiAoIXN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHN0LT5jb2RlYy0+d2lkdGggID0gd2lkdGg7Ci0gICAgc3QtPmNvZGVjLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgc3QtPmNvZGVjcGFyLT53aWR0aCAgPSB3aWR0aDsKKyAgICBzdC0+Y29kZWNwYXItPmhlaWdodCA9IGhlaWdodDsKICAgICBhdl9yZWR1Y2UoJnJhdGVuLCAmcmF0ZWQsIHJhdGVuLCByYXRlZCwgKDFVTCA8PCAzMSkgLSAxKTsKICAgICBhdnByaXZfc2V0X3B0c19pbmZvKHN0LCA2NCwgcmF0ZWQsIHJhdGVuKTsKICAgICBzdC0+YXZnX2ZyYW1lX3JhdGUgICAgICAgICAgICAgICAgPSBhdl9pbnZfcShzdC0+dGltZV9iYXNlKTsKLSAgICBzdC0+Y29kZWMtPnBpeF9mbXQgICAgICAgICAgICAgICAgPSBwaXhfZm10OwotICAgIHN0LT5jb2RlYy0+Y29kZWNfdHlwZSAgICAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKLSAgICBzdC0+Y29kZWMtPmNvZGVjX2lkICAgICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmZvcm1hdCAgICAgICAgICAgICAgPSBwaXhfZm10OworICAgIHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSAgICAgICAgICA9IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICBzdC0+Y29kZWNwYXItPmNvZGVjX2lkICAgICAgICAgICAgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKICAgICBzdC0+c2FtcGxlX2FzcGVjdF9yYXRpbyAgICAgICAgICAgPSAoQVZSYXRpb25hbCl7IGFzcGVjdG4sIGFzcGVjdGQgfTsKLSAgICBzdC0+Y29kZWMtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24gPSBjaHJvbWFfc2FtcGxlX2xvY2F0aW9uOwotICAgIHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgICAgICAgICAgICA9IGZpZWxkX29yZGVyOwotICAgIHMtPnBhY2tldF9zaXplID0gYXZfaW1hZ2VfZ2V0X2J1ZmZlcl9zaXplKHN0LT5jb2RlYy0+cGl4X2ZtdCwgd2lkdGgsIGhlaWdodCwgMSkgKyBZNE1fRlJBTUVfTUFHSUNfTEVOOworICAgIHN0LT5jb2RlY3Bhci0+Y2hyb21hX2xvY2F0aW9uICAgICA9IGNocm9tYV9zYW1wbGVfbG9jYXRpb247CisgICAgc3QtPmNvZGVjcGFyLT5maWVsZF9vcmRlciAgICAgICAgID0gZmllbGRfb3JkZXI7CisgICAgcy0+cGFja2V0X3NpemUgPSBhdl9pbWFnZV9nZXRfYnVmZmVyX3NpemUoc3QtPmNvZGVjcGFyLT5mb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDEpICsgWTRNX0ZSQU1FX01BR0lDX0xFTjsKICAgICBpZiAoKGludCkgcy0+cGFja2V0X3NpemUgPCAwKQogICAgICAgICByZXR1cm4gcy0+cGFja2V0X3NpemU7CiAgICAgcy0+aW50ZXJuYWwtPmRhdGFfb2Zmc2V0ID0gYXZpb190ZWxsKHBiKTsKQEAgLTI5NSw5ICszMDEsMTAgQEAKICAgICByZXQgPSBhdl9nZXRfcGFja2V0KHMtPnBiLCBwa3QsIHMtPnBhY2tldF9zaXplIC0gWTRNX0ZSQU1FX01BR0lDX0xFTik7CiAgICAgaWYgKHJldCA8IDApCiAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgZWxzZSBpZiAocmV0ICE9IHMtPnBhY2tldF9zaXplIC0gWTRNX0ZSQU1FX01BR0lDX0xFTikKKyAgICBlbHNlIGlmIChyZXQgIT0gcy0+cGFja2V0X3NpemUgLSBZNE1fRlJBTUVfTUFHSUNfTEVOKSB7CisgICAgICAgIGF2X3BhY2tldF91bnJlZihwa3QpOwogICAgICAgICByZXR1cm4gcy0+cGItPmVvZl9yZWFjaGVkID8gQVZFUlJPUl9FT0YgOiBBVkVSUk9SKEVJTyk7Ci0KKyAgICB9CiAgICAgcGt0LT5zdHJlYW1faW5kZXggPSAwOwogICAgIHBrdC0+cHRzID0gKG9mZiAtIHMtPmludGVybmFsLT5kYXRhX29mZnNldCkgLyBzLT5wYWNrZXRfc2l6ZTsKICAgICBwa3QtPmR1cmF0aW9uID0gMTsKQEAgLTMwNyw3ICszMTQsOCBAQAogc3RhdGljIGludCB5dXY0X3JlYWRfc2VlayhBVkZvcm1hdENvbnRleHQgKnMsIGludCBzdHJlYW1faW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHRzLCBpbnQgZmxhZ3MpCiB7Ci0gICAgYXZpb19zZWVrKHMtPnBiLCBwdHMgKiBzLT5wYWNrZXRfc2l6ZSArIHMtPmludGVybmFsLT5kYXRhX29mZnNldCwgU0VFS19TRVQpOworICAgIGlmIChhdmlvX3NlZWsocy0+cGIsIHB0cyAqIHMtPnBhY2tldF9zaXplICsgcy0+aW50ZXJuYWwtPmRhdGFfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKQorICAgICAgICByZXR1cm4gLTE7CiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2Zm9ybWF0L3l1djRtcGVnZW5jLmMgYi9saWJhdmZvcm1hdC95dXY0bXBlZ2VuYy5jCmluZGV4IDYxMjBjN2UuLjQ0ZjQwYmIgMTAwNjQ0Ci0tLSBhL2xpYmF2Zm9ybWF0L3l1djRtcGVnZW5jLmMKKysrIGIvbGliYXZmb3JtYXQveXV2NG1wZWdlbmMuYwpAQCAtMzMsMTAgKzMzLDEyIEBACiAgICAgaW50IHJhdGVuLCByYXRlZCwgYXNwZWN0biwgYXNwZWN0ZCwgbjsKICAgICBjaGFyIGludGVyOwogICAgIGNvbnN0IGNoYXIgKmNvbG9yc3BhY2UgPSAiIjsKKyAgICBpbnQgZmllbGRfb3JkZXI7CiAKICAgICBzdCAgICAgPSBzLT5zdHJlYW1zWzBdOwotICAgIHdpZHRoICA9IHN0LT5jb2RlYy0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gc3QtPmNvZGVjLT5oZWlnaHQ7CisgICAgd2lkdGggID0gc3QtPmNvZGVjcGFyLT53aWR0aDsKKyAgICBoZWlnaHQgPSBzdC0+Y29kZWNwYXItPmhlaWdodDsKKyAgICBmaWVsZF9vcmRlciA9IHN0LT5jb2RlY3Bhci0+ZmllbGRfb3JkZXI7CiAKICAgICAvLyBUT0RPOiBzaG91bGQgYmUgYXZnX2ZyYW1lX3JhdGUKICAgICBhdl9yZWR1Y2UoJnJhdGVuLCAmcmF0ZWQsIHN0LT50aW1lX2Jhc2UuZGVuLApAQCAtNDgsNyArNTAsMTQgQEAKICAgICBpZiAoYXNwZWN0biA9PSAwICYmIGFzcGVjdGQgPT0gMSkKICAgICAgICAgYXNwZWN0ZCA9IDA7ICAvLyAwOjAgbWVhbnMgdW5rbm93bgogCi0gICAgc3dpdGNoIChzdC0+Y29kZWMtPmZpZWxkX29yZGVyKSB7CisjaWYgRkZfQVBJX0xBVkZfQVZDVFgKKyAgICBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisgICAgaWYgKGZpZWxkX29yZGVyICE9IHN0LT5jb2RlYy0+ZmllbGRfb3JkZXIgJiYgc3QtPmNvZGVjLT5maWVsZF9vcmRlciAhPSBBVl9GSUVMRF9VTktOT1dOKQorICAgICAgICBmaWVsZF9vcmRlciA9IHN0LT5jb2RlYy0+ZmllbGRfb3JkZXI7CisgICAgRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKworICAgIHN3aXRjaCAoZmllbGRfb3JkZXIpIHsKICAgICBjYXNlIEFWX0ZJRUxEX1RCOgogICAgIGNhc2UgQVZfRklFTERfVFQ6IGludGVyID0gJ3QnOyBicmVhazsKICAgICBjYXNlIEFWX0ZJRUxEX0JUOgpAQCAtNTYsMTAgKzY1LDE5IEBACiAgICAgZGVmYXVsdDogICAgICAgICAgaW50ZXIgPSAncCc7IGJyZWFrOwogICAgIH0KIAotICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5waXhfZm10KSB7CisgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmZvcm1hdCkgewogICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKICAgICAgICAgY29sb3JzcGFjZSA9ICIgQ21vbm8iOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTk6CisgICAgICAgIGNvbG9yc3BhY2UgPSAiIENtb25vOSI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTA6CisgICAgICAgIGNvbG9yc3BhY2UgPSAiIENtb25vMTAiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTEyOgorICAgICAgICBjb2xvcnNwYWNlID0gIiBDbW9ubzEyIjsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNjoKICAgICAgICAgY29sb3JzcGFjZSA9ICIgQ21vbm8xNiI7CiAgICAgICAgIGJyZWFrOwpAQCAtNjcsNyArODUsNyBAQAogICAgICAgICBjb2xvcnNwYWNlID0gIiBDNDExIFhZU0NTUz00MTEiOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKLSAgICAgICAgc3dpdGNoIChzdC0+Y29kZWMtPmNocm9tYV9zYW1wbGVfbG9jYXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmNocm9tYV9sb2NhdGlvbikgewogICAgICAgICBjYXNlIEFWQ0hST01BX0xPQ19UT1BMRUZUOiBjb2xvcnNwYWNlID0gIiBDNDIwcGFsZHYgWFlTQ1NTPTQyMFBBTERWIjsgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZDSFJPTUFfTE9DX0xFRlQ6ICAgIGNvbG9yc3BhY2UgPSAiIEM0MjBtcGVnMiBYWVNDU1M9NDIwTVBFRzIiOyBicmVhazsKICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgY29sb3JzcGFjZSA9ICIgQzQyMGpwZWcgWFlTQ1NTPTQyMEpQRUciOyAgIGJyZWFrOwpAQCAtMTYzLDE4ICsxODEsMjEgQEAKIAogICAgIGF2aW9fcHJpbnRmKHMtPnBiLCAiJXNcbiIsIFk0TV9GUkFNRV9NQUdJQyk7CiAKLSAgICB3aWR0aCAgPSBzdC0+Y29kZWMtPndpZHRoOwotICAgIGhlaWdodCA9IHN0LT5jb2RlYy0+aGVpZ2h0OworICAgIHdpZHRoICA9IHN0LT5jb2RlY3Bhci0+d2lkdGg7CisgICAgaGVpZ2h0ID0gc3QtPmNvZGVjcGFyLT5oZWlnaHQ7CiAKICAgICBwdHIgPSBmcmFtZS0+ZGF0YVswXTsKIAotICAgIHN3aXRjaCAoc3QtPmNvZGVjLT5waXhfZm10KSB7CisgICAgc3dpdGNoIChzdC0+Y29kZWNwYXItPmZvcm1hdCkgewogICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDExUDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxMjoKICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDk6CkBAIC0xOTUsNyArMjE2LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlRoZSBwaXhlbCBmb3JtYXQgJyVzJyBpcyBub3Qgc3VwcG9ydGVkLlxuIiwKLSAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoc3QtPmNvZGVjLT5waXhfZm10KSk7CisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHN0LT5jb2RlY3Bhci0+Zm9ybWF0KSk7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCkBAIC0yMDQsMTEgKzIyNSwxMyBAQAogICAgICAgICBwdHIgKz0gZnJhbWUtPmxpbmVzaXplWzBdOwogICAgIH0KIAotICAgIGlmIChzdC0+Y29kZWMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9HUkFZOCAmJgotICAgICAgICBzdC0+Y29kZWMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9HUkFZMTYpIHsKKyAgICBpZiAoc3QtPmNvZGVjcGFyLT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9HUkFZOCAmJiBzdC0+Y29kZWNwYXItPmZvcm1hdCAhPSBBVl9QSVhfRk1UX0dSQVk5ICYmCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfR1JBWTEwICYmIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfR1JBWTEyICYmCisgICAgICAgIHN0LT5jb2RlY3Bhci0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfR1JBWTE2KSB7CiAgICAgICAgIC8vIEFkanVzdCBmb3Igc21hbGxlciBDYiBhbmQgQ3IgcGxhbmVzCi0gICAgICAgIGF2X3BpeF9mbXRfZ2V0X2Nocm9tYV9zdWJfc2FtcGxlKHN0LT5jb2RlYy0+cGl4X2ZtdCwgJmhfY2hyb21hX3NoaWZ0LAorICAgICAgICBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShzdC0+Y29kZWNwYXItPmZvcm1hdCwgJmhfY2hyb21hX3NoaWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdl9jaHJvbWFfc2hpZnQpOworICAgICAgICAvLyBTaGlmdCByaWdodCwgcm91bmRpbmcgdXAKICAgICAgICAgd2lkdGggID0gQVZfQ0VJTF9SU0hJRlQod2lkdGgsICBoX2Nocm9tYV9zaGlmdCk7CiAgICAgICAgIGhlaWdodCA9IEFWX0NFSUxfUlNISUZUKGhlaWdodCwgdl9jaHJvbWFfc2hpZnQpOwogCkBAIC0yMzQsMjIgKzI1NywyNSBAQAogICAgIGlmIChzLT5uYl9zdHJlYW1zICE9IDEpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CiAKLSAgICBpZiAocy0+c3RyZWFtc1swXS0+Y29kZWMtPmNvZGVjX2lkICE9IEFWX0NPREVDX0lEX1dSQVBQRURfQVZGUkFNRSkgeworICAgIGlmIChzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfV1JBUFBFRF9BVkZSQU1FKSB7CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJFUlJPUjogQ29kZWMgbm90IHN1cHBvcnRlZC5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUl9JTlZBTElEREFUQTsKICAgICB9CiAKLSAgICBzd2l0Y2ggKHMtPnN0cmVhbXNbMF0tPmNvZGVjLT5waXhfZm10KSB7CisgICAgc3dpdGNoIChzLT5zdHJlYW1zWzBdLT5jb2RlY3Bhci0+Zm9ybWF0KSB7CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQxMVA6CiAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfV0FSTklORywgIldhcm5pbmc6IGdlbmVyYXRpbmcgcmFyZWx5IHVzZWQgNDoxOjEgWVVWICIKICAgICAgICAgICAgICAgICJzdHJlYW0sIHNvbWUgbWpwZWd0b29scyBtaWdodCBub3Qgd29yay5cbiIpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTg6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNjoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVk5OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxMjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2OgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDk6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA5OgpAQCAtMjY2LDkgKzI5Miw5IEBACiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNjoKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2OgogICAgICAgICBpZiAocy0+c3RyaWN0X3N0ZF9jb21wbGlhbmNlID49IEZGX0NPTVBMSUFOQ0VfTk9STUFMKSB7Ci0gICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJyVzJyBpcyBub3QgYSBvZmZpY2lhbCB5dXY0bXBlZ3BpcGUgcGl4ZWwgZm9ybWF0LiAiCisgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiJyVzJyBpcyBub3QgYW4gb2ZmaWNpYWwgeXV2NG1wZWdwaXBlIHBpeGVsIGZvcm1hdC4gIgogICAgICAgICAgICAgICAgICAgICJVc2UgJy1zdHJpY3QgLTEnIHRvIGVuY29kZSB0byB0aGlzIHBpeGVsIGZvcm1hdC5cbiIsCi0gICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShzLT5zdHJlYW1zWzBdLT5jb2RlYy0+cGl4X2ZtdCkpOworICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocy0+c3RyZWFtc1swXS0+Y29kZWNwYXItPmZvcm1hdCkpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICAgICAgfQogICAgICAgICBhdl9sb2cocywgQVZfTE9HX1dBUk5JTkcsICJXYXJuaW5nOiBnZW5lcmF0aW5nIG5vbiBzdGFuZGFyZCBZVVYgc3RyZWFtLiAiCkBAIC0yODEsNyArMzA3LDggQEAKICAgICAgICAgICAgICAgICJ5dXY0NDRwMTAsIHl1djQyMnAxMCwgeXV2NDIwcDEwLCAiCiAgICAgICAgICAgICAgICAieXV2NDQ0cDEyLCB5dXY0MjJwMTIsIHl1djQyMHAxMiwgIgogICAgICAgICAgICAgICAgInl1djQ0NHAxNCwgeXV2NDIycDE0LCB5dXY0MjBwMTQsICIKLSAgICAgICAgICAgICAgICJ5dXY0NDRwMTYsIHl1djQyMnAxNiwgeXV2NDIwcDE2ICIKKyAgICAgICAgICAgICAgICJ5dXY0NDRwMTYsIHl1djQyMnAxNiwgeXV2NDIwcDE2LCAiCisgICAgICAgICAgICAgICAiZ3JheTksIGdyYXkxMCwgZ3JheTEyICIKICAgICAgICAgICAgICAgICJhbmQgZ3JheTE2IHBpeGVsIGZvcm1hdHMuICIKICAgICAgICAgICAgICAgICJVc2UgLXBpeF9mbXQgdG8gc2VsZWN0IG9uZS5cbiIpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOwpkaWZmIC0tZ2l0IGEvbGliYXZyZXNhbXBsZS9NYWtlZmlsZSBiL2xpYmF2cmVzYW1wbGUvTWFrZWZpbGUKaW5kZXggN2Q4NTdhMC4uOTBmMDI1YSAxMDA2NDQKLS0tIGEvbGliYXZyZXNhbXBsZS9NYWtlZmlsZQorKysgYi9saWJhdnJlc2FtcGxlL01ha2VmaWxlCkBAIC0xLDQgKzEsNSBAQAogTkFNRSA9IGF2cmVzYW1wbGUKK0RFU0MgPSBMaWJhdiBhdWRpbyByZXNhbXBsaW5nIGxpYnJhcnkKIAogSEVBREVSUyA9IGF2cmVzYW1wbGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHZlcnNpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbGliYXZyZXNhbXBsZS9hYXJjaDY0L01ha2VmaWxlIGIvbGliYXZyZXNhbXBsZS9hYXJjaDY0L01ha2VmaWxlCmluZGV4IDFkOWU1ZjguLmY5MjY5OWUgMTAwNjQ0Ci0tLSBhL2xpYmF2cmVzYW1wbGUvYWFyY2g2NC9NYWtlZmlsZQorKysgYi9saWJhdnJlc2FtcGxlL2FhcmNoNjQvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACi1PQkpTICAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSBhYXJjaDY0L2F1ZGlvX2NvbnZlcnRfaW5pdC5vICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhcmNoNjQvcmVzYW1wbGVfaW5pdC5vICAgICAgICAgXAorT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9hdWRpb19jb252ZXJ0X2luaXQubyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFyY2g2NC9yZXNhbXBsZV9pbml0Lm8gICAgICAgICAgICAgXAogCiBPQkpTLSQoQ09ORklHX05FT05fQ0xPQkJFUl9URVNUKSArPSBhYXJjaDY0L25lb250ZXN0Lm8KIAotTkVPTi1PQkpTICAgICAgICAgICAgICAgICAgICAgICAgKz0gYWFyY2g2NC9hdWRpb19jb252ZXJ0X25lb24ubyAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXJjaDY0L3Jlc2FtcGxlX25lb24ubyAgICAgICAgIFwKK05FT04tT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvYXVkaW9fY29udmVydF9uZW9uLm8gICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhcmNoNjQvcmVzYW1wbGVfbmVvbi5vICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2xpYmF2cmVzYW1wbGUvYXJtL01ha2VmaWxlIGIvbGliYXZyZXNhbXBsZS9hcm0vTWFrZWZpbGUKaW5kZXggYWZmYzJiZi4uMzUyZDFhOCAxMDA2NDQKLS0tIGEvbGliYXZyZXNhbXBsZS9hcm0vTWFrZWZpbGUKKysrIGIvbGliYXZyZXNhbXBsZS9hcm0vTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACi1PQkpTICAgICAgKz0gYXJtL2F1ZGlvX2NvbnZlcnRfaW5pdC5vIFwKLSAgICAgICAgICAgICBhcm0vcmVzYW1wbGVfaW5pdC5vCitPQkpTICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IGFybS9hdWRpb19jb252ZXJ0X2luaXQubyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFybS9yZXNhbXBsZV9pbml0Lm8KIAogT0JKUy0kKENPTkZJR19ORU9OX0NMT0JCRVJfVEVTVCkgKz0gYXJtL25lb250ZXN0Lm8KIAotTkVPTi1PQkpTICs9IGFybS9hdWRpb19jb252ZXJ0X25lb24ubyBcCi0gICAgICAgICAgICAgYXJtL3Jlc2FtcGxlX25lb24ubworTkVPTi1PQkpTICAgICAgICAgICAgICAgICAgICAgICAgKz0gYXJtL2F1ZGlvX2NvbnZlcnRfbmVvbi5vICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJtL3Jlc2FtcGxlX25lb24ubwpkaWZmIC0tZ2l0IGEvbGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLXRlc3QuYyBiL2xpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS10ZXN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MGFlOTQuLjAwMDAwMDAKLS0tIGEvbGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLXRlc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAotICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKLSNpbmNsdWRlICJhdnJlc2FtcGxlLmgiCi0KLXN0YXRpYyBkb3VibGUgZGJsX3JhbmQoQVZMRkcgKmxmZykKLXsKLSAgICByZXR1cm4gMi4wICogKGF2X2xmZ19nZXQobGZnKSAvIChkb3VibGUpVUlOVF9NQVgpIC0gMS4wOwotfQotCi0jZGVmaW5lIFBVVF9GVU5DKG5hbWUsIGZtdCwgdHlwZSwgZXhwcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgcHV0X3NhbXBsZV8gIyMgbmFtZSh2b2lkICoqZGF0YSwgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxlLCBpbnQgY2gsICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2X2RibCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0eXBlIHYgPSBleHByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHlwZSAqKm91dCA9ICh0eXBlICoqKWRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihzYW1wbGVfZm10KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgb3V0W2NoXVtzYW1wbGVdID0gdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBvdXRbMF1bc2FtcGxlICogY2hhbm5lbHMgKyBjaF0gPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotUFVUX0ZVTkModTgsICBBVl9TQU1QTEVfRk1UX1U4LCAgdWludDhfdCwgYXZfY2xpcF91aW50OCAoIGxyaW50KHZfZGJsICogKDEgIDw8ICA3KSkgKyAxMjgpKQotUFVUX0ZVTkMoczE2LCBBVl9TQU1QTEVfRk1UX1MxNiwgaW50MTZfdCwgYXZfY2xpcF9pbnQxNiAoIGxyaW50KHZfZGJsICogKDEgIDw8IDE1KSkpKQotUFVUX0ZVTkMoczMyLCBBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgYXZfY2xpcGxfaW50MzIobGxyaW50KHZfZGJsICogKDFVIDw8IDMxKSkpKQotUFVUX0ZVTkMoZmx0LCBBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQsICAgdl9kYmwpCi1QVVRfRlVOQyhkYmwsIEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUsICB2X2RibCkKLQotc3RhdGljIHZvaWQgcHV0X3NhbXBsZSh2b2lkICoqZGF0YSwgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBzYW1wbGUsIGludCBjaCwgZG91YmxlIHZfZGJsKQotewotICAgIHN3aXRjaCAoYXZfZ2V0X3BhY2tlZF9zYW1wbGVfZm10KHNhbXBsZV9mbXQpKSB7Ci0gICAgY2FzZSBBVl9TQU1QTEVfRk1UX1U4OgotICAgICAgICBwdXRfc2FtcGxlX3U4KGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6Ci0gICAgICAgIHB1dF9zYW1wbGVfczE2KGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6Ci0gICAgICAgIHB1dF9zYW1wbGVfczMyKGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6Ci0gICAgICAgIHB1dF9zYW1wbGVfZmx0KGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkw6Ci0gICAgICAgIHB1dF9zYW1wbGVfZGJsKGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBzYW1wbGUsIGNoLCB2X2RibCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgYXVkaW9nZW4oQVZMRkcgKnJuZCwgdm9pZCAqKmRhdGEsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsZV9yYXRlLCBpbnQgbmJfc2FtcGxlcykKLXsKLSAgICBpbnQgaSwgY2gsIGs7Ci0gICAgZG91YmxlIHYsIGYsIGEsIGFtcGE7Ci0gICAgZG91YmxlIHRhYmYxW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKLSAgICBkb3VibGUgdGFiZjJbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdOwotICAgIGRvdWJsZSB0YWJhW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKLQotI2RlZmluZSBQVVRfU0FNUExFIHB1dF9zYW1wbGUoZGF0YSwgc2FtcGxlX2ZtdCwgY2hhbm5lbHMsIGssIGNoLCB2KTsKLQotICAgIGsgPSAwOwotCi0gICAgLyogMSBzZWNvbmQgb2Ygc2luZ2xlIGZyZXEgc2luZSBhdCAxMDAwIEh6ICovCi0gICAgYSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDEgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKLSAgICAgICAgdiA9IHNpbihhKSAqIDAuMzA7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgUFVUX1NBTVBMRQotICAgICAgICBhICs9IE1fUEkgKiAxMDAwLjAgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKLSAgICB9Ci0KLSAgICAvKiAxIHNlY29uZCBvZiB2YXJ5aW5nIGZyZXF1ZW5jeSBiZXR3ZWVuIDEwMCBhbmQgMTAwMDAgSHogKi8KLSAgICBhID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMSAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgewotICAgICAgICB2ID0gc2luKGEpICogMC4zMDsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICBQVVRfU0FNUExFCi0gICAgICAgIGYgID0gMTAwLjAgKyAoKCgxMDAwMC4wIC0gMTAwLjApICogaSkgLyBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgIGEgKz0gTV9QSSAqIGYgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKLSAgICB9Ci0KLSAgICAvKiAwLjUgc2Vjb25kIG9mIGxvdyBhbXBsaXR1ZGUgd2hpdGUgbm9pc2UgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX3JhdGUgLyAyICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgewotICAgICAgICB2ID0gZGJsX3JhbmQocm5kKSAqIDAuMzA7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgUFVUX1NBTVBMRQotICAgIH0KLQotICAgIC8qIDAuNSBzZWNvbmQgb2YgaGlnaCBhbXBsaXR1ZGUgd2hpdGUgbm9pc2UgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX3JhdGUgLyAyICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgewotICAgICAgICB2ID0gZGJsX3JhbmQocm5kKTsKLSAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCi0gICAgICAgICAgICBQVVRfU0FNUExFCi0gICAgfQotCi0gICAgLyogMSBzZWNvbmQgb2YgdW5yZWxhdGVkIHJhbXBzIGZvciBlYWNoIGNoYW5uZWwgKi8KLSAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICB0YWJhW2NoXSAgPSAwOwotICAgICAgICB0YWJmMVtjaF0gPSAxMDAgKyBhdl9sZmdfZ2V0KHJuZCkgJSA1MDAwOwotICAgICAgICB0YWJmMltjaF0gPSAxMDAgKyBhdl9sZmdfZ2V0KHJuZCkgJSA1MDAwOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMSAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgewotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgdiA9IHNpbih0YWJhW2NoXSkgKiAwLjMwOwotICAgICAgICAgICAgUFVUX1NBTVBMRQotICAgICAgICAgICAgZiA9IHRhYmYxW2NoXSArICgoKHRhYmYyW2NoXSAtIHRhYmYxW2NoXSkgKiBpKSAvIHNhbXBsZV9yYXRlKTsKLSAgICAgICAgICAgIHRhYmFbY2hdICs9IE1fUEkgKiBmICogMi4wIC8gc2FtcGxlX3JhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiAyIHNlY29uZHMgb2YgNTAwIEh6IHdpdGggdmFyeWluZyB2b2x1bWUgKi8KLSAgICBhICAgID0gMDsKLSAgICBhbXBhID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMiAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgewotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgewotICAgICAgICAgICAgZG91YmxlIGFtcCA9ICgxLjAgKyBzaW4oYW1wYSkpICogMC4xNTsKLSAgICAgICAgICAgIGlmIChjaCAmIDEpCi0gICAgICAgICAgICAgICAgYW1wID0gMC4zMCAtIGFtcDsKLSAgICAgICAgICAgIHYgPSBzaW4oYSkgKiBhbXA7Ci0gICAgICAgICAgICBQVVRfU0FNUExFCi0gICAgICAgICAgICBhICAgICs9IE1fUEkgKiA1MDAuMCAqIDIuMCAvIHNhbXBsZV9yYXRlOwotICAgICAgICAgICAgYW1wYSArPSBNX1BJICogIDIuMCAvIHNhbXBsZV9yYXRlOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiBmb3JtYXRzLCByYXRlcywgYW5kIGxheW91dHMgYXJlIG9yZGVyZWQgZm9yIHByaW9yaXR5IGluIHRlc3RpbmcuCi0gICBlLmcuICdhdnJlc2FtcGxlLXRlc3QgNCAyIDInIHdpbGwgdGVzdCBhbGwgaW5wdXQvb3V0cHV0IGNvbWJpbmF0aW9ucyBvZgotICAgUzE2L0ZMVFAvUzE2UC9GTFQsIDQ4MDAwLzQ0MTAwLCBhbmQgc3RlcmVvL21vbm8gKi8KLQotc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0c1tdID0gewotICAgIEFWX1NBTVBMRV9GTVRfUzE2LAotICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKLSAgICBBVl9TQU1QTEVfRk1UX1MxNlAsCi0gICAgQVZfU0FNUExFX0ZNVF9GTFQsCi0gICAgQVZfU0FNUExFX0ZNVF9TMzJQLAotICAgIEFWX1NBTVBMRV9GTVRfUzMyLAotICAgIEFWX1NBTVBMRV9GTVRfVThQLAotICAgIEFWX1NBTVBMRV9GTVRfVTgsCi0gICAgQVZfU0FNUExFX0ZNVF9EQkxQLAotICAgIEFWX1NBTVBMRV9GTVRfREJMLAotfTsKLQotc3RhdGljIGNvbnN0IGludCByYXRlc1tdID0gewotICAgIDQ4MDAwLAotICAgIDQ0MTAwLAotICAgIDE2MDAwCi19OwotCi1zdGF0aWMgY29uc3QgdWludDY0X3QgbGF5b3V0c1tdID0gewotICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8sCi0gICAgQVZfQ0hfTEFZT1VUX01PTk8sCi0gICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEsCi0gICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDEsCi19OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqczsKLSAgICBBVkxGRyBybmQ7Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgdWludDhfdCAqaW5fYnVmID0gTlVMTDsKLSAgICB1aW50OF90ICpvdXRfYnVmID0gTlVMTDsKLSAgICB1bnNpZ25lZCBpbnQgaW5fYnVmX3NpemU7Ci0gICAgdW5zaWduZWQgaW50IG91dF9idWZfc2l6ZTsKLSAgICB1aW50OF90ICAqaW5fZGF0YVtBVlJFU0FNUExFX01BWF9DSEFOTkVMU10gPSB7IDAgfTsKLSAgICB1aW50OF90ICpvdXRfZGF0YVtBVlJFU0FNUExFX01BWF9DSEFOTkVMU10gPSB7IDAgfTsKLSAgICBpbnQgaW5fbGluZXNpemU7Ci0gICAgaW50IG91dF9saW5lc2l6ZTsKLSAgICB1aW50NjRfdCBpbl9jaF9sYXlvdXQ7Ci0gICAgaW50IGluX2NoYW5uZWxzOwotICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgaW5fZm10OwotICAgIGludCBpbl9yYXRlOwotICAgIHVpbnQ2NF90IG91dF9jaF9sYXlvdXQ7Ci0gICAgaW50IG91dF9jaGFubmVsczsKLSAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IG91dF9mbXQ7Ci0gICAgaW50IG91dF9yYXRlOwotICAgIGludCBudW1fZm9ybWF0cywgbnVtX3JhdGVzLCBudW1fbGF5b3V0czsKLSAgICBpbnQgaSwgaiwgaywgbCwgbSwgbjsKLQotICAgIG51bV9mb3JtYXRzID0gMjsKLSAgICBudW1fcmF0ZXMgICA9IDI7Ci0gICAgbnVtX2xheW91dHMgPSAyOwotICAgIGlmIChhcmdjID4gMSkgewotICAgICAgICBpZiAoIWF2X3N0cm5jYXNlY21wKGFyZ3ZbMV0sICItaCIsIDMpKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJVc2FnZTogYXZyZXNhbXBsZS10ZXN0IFs8bnVtIGZvcm1hdHM+ICIKLSAgICAgICAgICAgICAgICAgICAiWzxudW0gc2FtcGxlIHJhdGVzPiBbPG51bSBjaGFubmVsIGxheW91dHM+XV1dXG4iCi0gICAgICAgICAgICAgICAgICAgIkRlZmF1bHQgaXMgMiAyIDJcbiIpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbnVtX2Zvcm1hdHMgPSBzdHJ0b2woYXJndlsxXSwgTlVMTCwgMCk7Ci0gICAgICAgIG51bV9mb3JtYXRzID0gYXZfY2xpcChudW1fZm9ybWF0cywgMSwgRkZfQVJSQVlfRUxFTVMoZm9ybWF0cykpOwotICAgIH0KLSAgICBpZiAoYXJnYyA+IDIpIHsKLSAgICAgICAgbnVtX3JhdGVzID0gc3RydG9sKGFyZ3ZbMl0sIE5VTEwsIDApOwotICAgICAgICBudW1fcmF0ZXMgPSBhdl9jbGlwKG51bV9yYXRlcywgMSwgRkZfQVJSQVlfRUxFTVMocmF0ZXMpKTsKLSAgICB9Ci0gICAgaWYgKGFyZ2MgPiAzKSB7Ci0gICAgICAgIG51bV9sYXlvdXRzID0gc3RydG9sKGFyZ3ZbM10sIE5VTEwsIDApOwotICAgICAgICBudW1fbGF5b3V0cyA9IGF2X2NsaXAobnVtX2xheW91dHMsIDEsIEZGX0FSUkFZX0VMRU1TKGxheW91dHMpKTsKLSAgICB9Ci0KLSAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7Ci0KLSAgICBhdl9sZmdfaW5pdCgmcm5kLCAweEMwRkZFRSk7Ci0KLSAgICBpbl9idWZfc2l6ZSA9IGF2X3NhbXBsZXNfZ2V0X2J1ZmZlcl9zaXplKCZpbl9saW5lc2l6ZSwgOCwgNDgwMDAgKiA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfU0FNUExFX0ZNVF9EQkxQLCAwKTsKLSAgICBvdXRfYnVmX3NpemUgPSBpbl9idWZfc2l6ZTsKLQotICAgIGluX2J1ZiA9IGF2X21hbGxvYyhpbl9idWZfc2l6ZSk7Ci0gICAgaWYgKCFpbl9idWYpCi0gICAgICAgIGdvdG8gZW5kOwotICAgIG91dF9idWYgPSBhdl9tYWxsb2Mob3V0X2J1Zl9zaXplKTsKLSAgICBpZiAoIW91dF9idWYpCi0gICAgICAgIGdvdG8gZW5kOwotCi0gICAgcyA9IGF2cmVzYW1wbGVfYWxsb2NfY29udGV4dCgpOwotICAgIGlmICghcykgewotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgYWxsb2NhdGluZyBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0XG4iKTsKLSAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotCi0gICAgZm9yIChpID0gMDsgaSA8IG51bV9mb3JtYXRzOyBpKyspIHsKLSAgICAgICAgaW5fZm10ID0gZm9ybWF0c1tpXTsKLSAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9sYXlvdXRzOyBrKyspIHsKLSAgICAgICAgICAgIGluX2NoX2xheW91dCA9IGxheW91dHNba107Ci0gICAgICAgICAgICBpbl9jaGFubmVscyAgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoaW5fY2hfbGF5b3V0KTsKLSAgICAgICAgICAgIGZvciAobSA9IDA7IG0gPCBudW1fcmF0ZXM7IG0rKykgewotICAgICAgICAgICAgICAgIGluX3JhdGUgPSByYXRlc1ttXTsKLQotICAgICAgICAgICAgICAgIHJldCA9IGF2X3NhbXBsZXNfZmlsbF9hcnJheXMoaW5fZGF0YSwgJmluX2xpbmVzaXplLCBpbl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jaGFubmVscywgaW5fcmF0ZSAqIDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9mbXQsIDApOwotICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgaW5fZGF0YSBmaWxsIGFycmF5c1xuIik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhdWRpb2dlbigmcm5kLCAodm9pZCAqKilpbl9kYXRhLCBpbl9mbXQsIGluX2NoYW5uZWxzLCBpbl9yYXRlLCBpbl9yYXRlICogNik7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX2Zvcm1hdHM7IGorKykgewotICAgICAgICAgICAgICAgICAgICBvdXRfZm10ID0gZm9ybWF0c1tqXTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChsID0gMDsgbCA8IG51bV9sYXlvdXRzOyBsKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dF9jaF9sYXlvdXQgPSBsYXlvdXRzW2xdOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2NoYW5uZWxzICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXRfY2hfbGF5b3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobiA9IDA7IG4gPCBudW1fcmF0ZXM7IG4rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9yYXRlID0gcmF0ZXNbbl07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlcyB0byAlcywgJWQgdG8gJWQgY2hhbm5lbHMsICVkIEh6IHRvICVkIEh6XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGluX2ZtdCksIGF2X2dldF9zYW1wbGVfZm10X25hbWUob3V0X2ZtdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NoYW5uZWxzLCBvdXRfY2hhbm5lbHMsIGluX3JhdGUsIG91dF9yYXRlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2X3NhbXBsZXNfZmlsbF9hcnJheXMob3V0X2RhdGEsICZvdXRfbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfYnVmLCBvdXRfY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcmF0ZSAqIDYsIG91dF9mbXQsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJmYWlsZWQgb3V0X2RhdGEgZmlsbCBhcnJheXNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9vcHRfc2V0X2ludChzLCAiaW5fY2hhbm5lbF9sYXlvdXQiLCAgaW5fY2hfbGF5b3V0LCAgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQocywgImluX3NhbXBsZV9mbXQiLCAgICAgIGluX2ZtdCwgICAgICAgIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KHMsICJpbl9zYW1wbGVfcmF0ZSIsICAgICBpbl9yYXRlLCAgICAgICAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9vcHRfc2V0X2ludChzLCAib3V0X2NoYW5uZWxfbGF5b3V0Iiwgb3V0X2NoX2xheW91dCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQocywgIm91dF9zYW1wbGVfZm10IiwgICAgIG91dF9mbXQsICAgICAgIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KHMsICJvdXRfc2FtcGxlX3JhdGUiLCAgICBvdXRfcmF0ZSwgICAgICAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KHMsICJpbnRlcm5hbF9zYW1wbGVfZm10IiwgQVZfU0FNUExFX0ZNVF9GTFRQLCAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2cmVzYW1wbGVfb3BlbihzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiRXJyb3Igb3BlbmluZyBjb250ZXh0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gYXZyZXNhbXBsZV9jb252ZXJ0KHMsIG91dF9kYXRhLCBvdXRfbGluZXNpemUsIG91dF9yYXRlICogNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2RhdGEsICBpbl9saW5lc2l6ZSwgIGluX3JhdGUgKiA2KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGVycmJ1ZlsyNTZdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9zdHJlcnJvcihyZXQsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJXNcbiIsIGVycmJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJDb252ZXJ0ZWQgJWQgc2FtcGxlcyB0byAlZCBzYW1wbGVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9yYXRlICogNiwgcmV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXZyZXNhbXBsZV9nZXRfZGVsYXkocykgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlZCBkZWxheSBzYW1wbGVzIG5vdCBjb252ZXJ0ZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnJlc2FtcGxlX2dldF9kZWxheShzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2cmVzYW1wbGVfYXZhaWxhYmxlKHMpID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJWQgc2FtcGxlcyBhdmFpbGFibGUgZm9yIG91dHB1dFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cmVzYW1wbGVfYXZhaWxhYmxlKHMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyZXNhbXBsZV9jbG9zZShzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldCA9IDA7Ci0KLWVuZDoKLSAgICBhdl9mcmVlcCgmaW5fYnVmKTsKLSAgICBhdl9mcmVlcCgmb3V0X2J1Zik7Ci0gICAgYXZyZXNhbXBsZV9mcmVlKCZzKTsKLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvbGliYXZyZXNhbXBsZS9hdnJlc2FtcGxlLmggYi9saWJhdnJlc2FtcGxlL2F2cmVzYW1wbGUuaAppbmRleCAxYzJiY2U4Li41YWM5YWRiIDEwMDY0NAotLS0gYS9saWJhdnJlc2FtcGxlL2F2cmVzYW1wbGUuaAorKysgYi9saWJhdnJlc2FtcGxlL2F2cmVzYW1wbGUuaApAQCAtMjgsNyArMjgsNyBAQAogICovCiAKIC8qKgotICogQGRlZmdyb3VwIGxhdnIgTGliYXZyZXNhbXBsZQorICogQGRlZmdyb3VwIGxhdnIgbGliYXZyZXNhbXBsZQogICogQHsKICAqCiAgKiBMaWJhdnJlc2FtcGxlIChsYXZyKSBpcyBhIGxpYnJhcnkgdGhhdCBoYW5kbGVzIGF1ZGlvIHJlc2FtcGxpbmcsIHNhbXBsZQpAQCAtMTA1LDIyICsxMDUsMzEgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0OwogCi0vKiogTWl4aW5nIENvZWZmaWNpZW50IFR5cGVzICovCi1lbnVtIEFWTWl4Q29lZmZUeXBlIHsKKy8qKgorICogQGRlcHJlY2F0ZWQgdXNlIGxpYnN3cmVzYW1wbGUKKyAqCisgKiBNaXhpbmcgQ29lZmZpY2llbnQgVHlwZXMgKi8KK2VudW0gYXR0cmlidXRlX2RlcHJlY2F0ZWQgQVZNaXhDb2VmZlR5cGUgewogICAgIEFWX01JWF9DT0VGRl9UWVBFX1E4LCAgIC8qKiAxNi1iaXQgOC44IGZpeGVkLXBvaW50ICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgQVZfTUlYX0NPRUZGX1RZUEVfUTE1LCAgLyoqIDMyLWJpdCAxNy4xNSBmaXhlZC1wb2ludCAgICAgICAgICAgICAgICAgICAgKi8KICAgICBBVl9NSVhfQ09FRkZfVFlQRV9GTFQsICAvKiogZmxvYXRpbmctcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIEFWX01JWF9DT0VGRl9UWVBFX05CLCAgIC8qKiBOdW1iZXIgb2YgY29lZmYgdHlwZXMuIE5vdCBwYXJ0IG9mIEFCSSAgICAgICovCiB9OwogCi0vKiogUmVzYW1wbGluZyBGaWx0ZXIgVHlwZXMgKi8KLWVudW0gQVZSZXNhbXBsZUZpbHRlclR5cGUgeworLyoqCisgKiBAZGVwcmVjYXRlZCB1c2UgbGlic3dyZXNhbXBsZQorICoKKyAqIFJlc2FtcGxpbmcgRmlsdGVyIFR5cGVzICovCitlbnVtIGF0dHJpYnV0ZV9kZXByZWNhdGVkIEFWUmVzYW1wbGVGaWx0ZXJUeXBlIHsKICAgICBBVl9SRVNBTVBMRV9GSUxURVJfVFlQRV9DVUJJQywgICAgICAgICAgICAgIC8qKjwgQ3ViaWMgKi8KICAgICBBVl9SRVNBTVBMRV9GSUxURVJfVFlQRV9CTEFDS01BTl9OVVRUQUxMLCAgIC8qKjwgQmxhY2ttYW4gTnV0dGFsbCBXaW5kb3dlZCBTaW5jICovCiAgICAgQVZfUkVTQU1QTEVfRklMVEVSX1RZUEVfS0FJU0VSLCAgICAgICAgICAgICAvKio8IEthaXNlciBXaW5kb3dlZCBTaW5jICovCiB9OwogCi1lbnVtIEFWUmVzYW1wbGVEaXRoZXJNZXRob2QgeworLyoqCisgKiBAZGVwcmVjYXRlZCB1c2UgbGlic3dyZXNhbXBsZQorICovCitlbnVtIGF0dHJpYnV0ZV9kZXByZWNhdGVkIEFWUmVzYW1wbGVEaXRoZXJNZXRob2QgewogICAgIEFWX1JFU0FNUExFX0RJVEhFUl9OT05FLCAgICAgICAgICAgIC8qKjwgRG8gbm90IHVzZSBkaXRoZXJpbmcgKi8KICAgICBBVl9SRVNBTVBMRV9ESVRIRVJfUkVDVEFOR1VMQVIsICAgICAvKio8IFJlY3Rhbmd1bGFyIERpdGhlciAqLwogICAgIEFWX1JFU0FNUExFX0RJVEhFUl9UUklBTkdVTEFSLCAgICAgIC8qKjwgVHJpYW5ndWxhciBEaXRoZXIqLwpAQCAtMTMwLDIyICsxMzksMzcgQEAKIH07CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogUmV0dXJuIHRoZSBMSUJBVlJFU0FNUExFX1ZFUlNJT05fSU5UIGNvbnN0YW50LgogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdW5zaWduZWQgYXZyZXNhbXBsZV92ZXJzaW9uKHZvaWQpOwogCiAvKioKKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgbGlic3dyZXNhbXBsZQorICoKICAqIFJldHVybiB0aGUgbGliYXZyZXNhbXBsZSBidWlsZC10aW1lIGNvbmZpZ3VyYXRpb24uCiAgKiBAcmV0dXJuICBjb25maWd1cmUgc3RyaW5nCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBjb25zdCBjaGFyICphdnJlc2FtcGxlX2NvbmZpZ3VyYXRpb24odm9pZCk7CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogUmV0dXJuIHRoZSBsaWJhdnJlc2FtcGxlIGxpY2Vuc2UuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBjb25zdCBjaGFyICphdnJlc2FtcGxlX2xpY2Vuc2Uodm9pZCk7CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogR2V0IHRoZSBBVkNsYXNzIGZvciBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0LgogICoKICAqIENhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggQVZfT1BUX1NFQVJDSF9GQUtFX09CSiBmb3IgZXhhbWluaW5nIG9wdGlvbnMKQEAgLTE1NSwxNiArMTc5LDI0IEBACiAgKgogICogQHJldHVybiBBVkNsYXNzIGZvciBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0CiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBjb25zdCBBVkNsYXNzICphdnJlc2FtcGxlX2dldF9jbGFzcyh2b2lkKTsKIAogLyoqCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGxpYnN3cmVzYW1wbGUKKyAqCiAgKiBBbGxvY2F0ZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0IGFuZCBzZXQgb3B0aW9ucy4KICAqCiAgKiBAcmV0dXJuICBhbGxvY2F0ZWQgYXVkaW8gcmVzYW1wbGUgY29udGV4dCwgb3IgTlVMTCBvbiBmYWlsdXJlCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnJlc2FtcGxlX2FsbG9jX2NvbnRleHQodm9pZCk7CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogSW5pdGlhbGl6ZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0LgogICogQG5vdGUgVGhlIGNvbnRleHQgbXVzdCBiZSBjb25maWd1cmVkIHVzaW5nIHRoZSBBVk9wdGlvbiBBUEkuCiAgKiBAbm90ZSBUaGUgZmllbGRzICJpbl9jaGFubmVsX2xheW91dCIsICJvdXRfY2hhbm5lbF9sYXlvdXQiLApAQCAtMTc4LDE3ICsyMTAsMjUgQEAKICAqIEBwYXJhbSBhdnIgIGF1ZGlvIHJlc2FtcGxlIGNvbnRleHQKICAqIEByZXR1cm4gICAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdnJlc2FtcGxlX29wZW4oQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyKTsKIAogLyoqCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGxpYnN3cmVzYW1wbGUKKyAqCiAgKiBDaGVjayB3aGV0aGVyIGFuIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgaXMgb3BlbiBvciBjbG9zZWQuCiAgKgogICogQHBhcmFtIGF2ciBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0IHRvIGNoZWNrCiAgKiBAcmV0dXJuIDEgaWYgYXZyIGlzIG9wZW4sIDAgaWYgYXZyIGlzIGNsb3NlZC4KICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdnJlc2FtcGxlX2lzX29wZW4oQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyKTsKIAogLyoqCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGxpYnN3cmVzYW1wbGUKKyAqCiAgKiBDbG9zZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0LgogICoKICAqIFRoaXMgY2xvc2VzIHRoZSBjb250ZXh0LCBidXQgaXQgZG9lcyBub3QgY2hhbmdlIHRoZSBwYXJhbWV0ZXJzLiBUaGUgY29udGV4dApAQCAtMjAxLDE4ICsyNDEsMjYgQEAKICAqCiAgKiBAcGFyYW0gYXZyICBhdWRpbyByZXNhbXBsZSBjb250ZXh0CiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiB2b2lkIGF2cmVzYW1wbGVfY2xvc2UoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyKTsKIAogLyoqCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGxpYnN3cmVzYW1wbGUKKyAqCiAgKiBGcmVlIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgYW5kIGFzc29jaWF0ZWQgQVZPcHRpb24gdmFsdWVzLgogICoKICAqIFRoaXMgYWxzbyBjYWxscyBhdnJlc2FtcGxlX2Nsb3NlKCkgYmVmb3JlIGZyZWVpbmcuCiAgKgogICogQHBhcmFtIGF2ciAgYXVkaW8gcmVzYW1wbGUgY29udGV4dAogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCBhdnJlc2FtcGxlX2ZyZWUoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqKmF2cik7CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogR2VuZXJhdGUgYSBjaGFubmVsIG1peGluZyBtYXRyaXguCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgb25lIHVzZWQgaW50ZXJuYWxseSBieSBsaWJhdnJlc2FtcGxlIGZvciBidWlsZGluZyB0aGUKQEAgLTIzNCwxMiArMjgyLDE2IEBACiAgKiBAcGFyYW0gbWF0cml4X2VuY29kaW5nICAgICBtYXRyaXhlZCBzdGVyZW8gZG93bm1peCBtb2RlIChlLmcuIGRwbGlpKQogICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2cmVzYW1wbGVfYnVpbGRfbWF0cml4KHVpbnQ2NF90IGluX2xheW91dCwgdWludDY0X3Qgb3V0X2xheW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY2VudGVyX21peF9sZXZlbCwgZG91YmxlIHN1cnJvdW5kX21peF9sZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGZlX21peF9sZXZlbCwgaW50IG5vcm1hbGl6ZSwgZG91YmxlICptYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgZW51bSBBVk1hdHJpeEVuY29kaW5nIG1hdHJpeF9lbmNvZGluZyk7CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogR2V0IHRoZSBjdXJyZW50IGNoYW5uZWwgbWl4aW5nIG1hdHJpeC4KICAqCiAgKiBJZiBubyBjdXN0b20gbWF0cml4IGhhcyBiZWVuIHByZXZpb3VzbHkgc2V0IG9yIHRoZSBBVkF1ZGlvUmVzYW1wbGVDb250ZXh0IGlzCkBAIC0yNTEsMTAgKzMwMywxNCBAQAogICogQHBhcmFtIHN0cmlkZSAgZGlzdGFuY2UgYmV0d2VlbiBhZGphY2VudCBpbnB1dCBjaGFubmVscyBpbiB0aGUgbWF0cml4IGFycmF5CiAgKiBAcmV0dXJuICAgICAgICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgYXZyZXNhbXBsZV9nZXRfbWF0cml4KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgZG91YmxlICptYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpOwogCiAvKioKKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgbGlic3dyZXNhbXBsZQorICoKICAqIFNldCBjaGFubmVsIG1peGluZyBtYXRyaXguCiAgKgogICogQWxsb3dzIGZvciBzZXR0aW5nIGEgY3VzdG9tIG1peGluZyBtYXRyaXgsIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgbWF0cml4CkBAIC0yNzIsMTAgKzMyOCwxNCBAQAogICogQHBhcmFtIHN0cmlkZSAgZGlzdGFuY2UgYmV0d2VlbiBhZGphY2VudCBpbnB1dCBjaGFubmVscyBpbiB0aGUgbWF0cml4IGFycmF5CiAgKiBAcmV0dXJuICAgICAgICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgYXZyZXNhbXBsZV9zZXRfbWF0cml4KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2ciwgY29uc3QgZG91YmxlICptYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpOwogCiAvKioKKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgbGlic3dyZXNhbXBsZQorICoKICAqIFNldCBhIGN1c3RvbWl6ZWQgaW5wdXQgY2hhbm5lbCBtYXBwaW5nLgogICoKICAqIFRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIGFsbG9jYXRlZCBjb250ZXh0IGlzIG5vdCBvcGVuLgpAQCAtMzAyLDEwICszNjIsMTQgQEAKICAqIEBwYXJhbSBjaGFubmVsX21hcCBjdXN0b21pemVkIGlucHV0IGNoYW5uZWwgbWFwcGluZwogICogQHJldHVybiAgICAgICAgICAgIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdnJlc2FtcGxlX3NldF9jaGFubmVsX21hcHBpbmcoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKmNoYW5uZWxfbWFwKTsKIAogLyoqCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGxpYnN3cmVzYW1wbGUKKyAqCiAgKiBTZXQgY29tcGVuc2F0aW9uIGZvciByZXNhbXBsaW5nLgogICoKICAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhbnl0aW1lIGFmdGVyIGF2cmVzYW1wbGVfb3BlbigpLiBJZiByZXNhbXBsaW5nIGlzIG5vdApAQCAtMzE4LDEwICszODIsMTQgQEAKICAqIEBwYXJhbSBjb21wZW5zYXRpb25fZGlzdGFuY2UgIGNvbXBlbnNhdGlvbiBkaXN0YW5jZSwgaW4gc2FtcGxlcwogICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2cmVzYW1wbGVfc2V0X2NvbXBlbnNhdGlvbihBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsIGludCBzYW1wbGVfZGVsdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wZW5zYXRpb25fZGlzdGFuY2UpOwogCiAvKioKKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgbGlic3dyZXNhbXBsZQorICoKICAqIFByb3ZpZGUgdGhlIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGUgY29uZmlndXJlZAogICogY29udmVyc2lvbiB3b3VsZCBvdXRwdXQuCiAgKgpAQCAtMzMxLDEwICszOTksMTMgQEAKICAqIEByZXR1cm4gICAgICAgICAgICAgIG51bWJlciBvZiBzYW1wbGVzIG9yIEFWRVJST1IoRUlOVkFMKSBpZiB0aGUgdmFsdWUKICAqICAgICAgICAgICAgICAgICAgICAgIHdvdWxkIGV4Y2VlZCBJTlRfTUFYCiAgKi8KLQorYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdnJlc2FtcGxlX2dldF9vdXRfc2FtcGxlcyhBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsIGludCBpbl9uYl9zYW1wbGVzKTsKIAogLyoqCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGxpYnN3cmVzYW1wbGUKKyAqCiAgKiBDb252ZXJ0IGlucHV0IHNhbXBsZXMgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIG91dHB1dCBGSUZPLgogICoKICAqIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyIG9mIG91dHB1dCBzYW1wbGVzIGNhbiBiZSBvYnRhaW5lZCB0aHJvdWdoCkBAIC0zNzYsMTIgKzQ0NywxNiBAQAogICogICAgICAgICAgICAgICAgICAgICAgICBub3QgaW5jbHVkaW5nIGNvbnZlcnRlZCBzYW1wbGVzIGFkZGVkIHRvIHRoZSBpbnRlcm5hbAogICogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgRklGTwogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2cmVzYW1wbGVfY29udmVydChBVkF1ZGlvUmVzYW1wbGVDb250ZXh0ICphdnIsIHVpbnQ4X3QgKipvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfcGxhbmVfc2l6ZSwgaW50IG91dF9zYW1wbGVzLAogICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICogY29uc3QgKmlucHV0LCBpbnQgaW5fcGxhbmVfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluX3NhbXBsZXMpOwogCiAvKioKKyAqCisgKiBAZGVwcmVjYXRlZCB1c2UgbGlic3dyZXNhbXBsZQorICoKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgY3VycmVudGx5IGluIHRoZSByZXNhbXBsaW5nIGRlbGF5IGJ1ZmZlci4KICAqCiAgKiBXaGVuIHJlc2FtcGxpbmcsIHRoZXJlIG1heSBiZSBhIGRlbGF5IGJldHdlZW4gdGhlIGlucHV0IGFuZCBvdXRwdXQuIEFueQpAQCAtMzk0LDkgKzQ2OSwxMyBAQAogICogQHBhcmFtIGF2ciAgYXVkaW8gcmVzYW1wbGUgY29udGV4dAogICogQHJldHVybiAgICAgbnVtYmVyIG9mIHNhbXBsZXMgY3VycmVudGx5IGluIHRoZSByZXNhbXBsaW5nIGRlbGF5IGJ1ZmZlcgogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2cmVzYW1wbGVfZ2V0X2RlbGF5KEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cik7CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBGSUZPLgogICoKICAqIER1cmluZyBjb252ZXJzaW9uLCBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFuIG91dHB1dCBidWZmZXIgb3IKQEAgLTQxMSw5ICs0OTAsMTMgQEAKICAqIEBwYXJhbSBhdnIgIGF1ZGlvIHJlc2FtcGxlIGNvbnRleHQKICAqIEByZXR1cm4gICAgIG51bWJlciBvZiBzYW1wbGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZwogICovCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50IGF2cmVzYW1wbGVfYXZhaWxhYmxlKEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKmF2cik7CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogUmVhZCBzYW1wbGVzIGZyb20gdGhlIG91dHB1dCBGSUZPLgogICoKICAqIER1cmluZyBjb252ZXJzaW9uLCBpZiB0aGUgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IGFuIG91dHB1dCBidWZmZXIgb3IKQEAgLTQzMCw5ICs1MTMsMTMgQEAKICAqIEBwYXJhbSBuYl9zYW1wbGVzICBudW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkIGZyb20gdGhlIEZJRk8KICAqIEByZXR1cm4gICAgICAgICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgd3JpdHRlbiB0byBvdXRwdXQKICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdnJlc2FtcGxlX3JlYWQoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLCB1aW50OF90ICoqb3V0cHV0LCBpbnQgbmJfc2FtcGxlcyk7CiAKIC8qKgorICoKKyAqIEBkZXByZWNhdGVkIHVzZSBsaWJzd3Jlc2FtcGxlCisgKgogICogQ29udmVydCB0aGUgc2FtcGxlcyBpbiB0aGUgaW5wdXQgQVZGcmFtZSBhbmQgd3JpdGUgdGhlbSB0byB0aGUgb3V0cHV0IEFWRnJhbWUuCiAgKgogICogSW5wdXQgYW5kIG91dHB1dCBBVkZyYW1lcyBtdXN0IGhhdmUgY2hhbm5lbF9sYXlvdXQsIHNhbXBsZV9yYXRlIGFuZCBmb3JtYXQgc2V0LgpAQCAtNDc2LDEwICs1NjMsMTQgQEAKICAqIEByZXR1cm4gICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBBVkVSUk9SIG9uIGZhaWx1cmUgb3Igbm9ubWF0Y2hpbmcKICAqICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdnJlc2FtcGxlX2NvbnZlcnRfZnJhbWUoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpvdXRwdXQsIEFWRnJhbWUgKmlucHV0KTsKIAogLyoqCisgKgorICogQGRlcHJlY2F0ZWQgdXNlIGxpYnN3cmVzYW1wbGUKKyAqCiAgKiBDb25maWd1cmUgb3IgcmVjb25maWd1cmUgdGhlIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgdXNpbmcgdGhlIGluZm9ybWF0aW9uCiAgKiBwcm92aWRlZCBieSB0aGUgQVZGcmFtZXMuCiAgKgpAQCAtNDkwLDEwICs1ODEsMTEgQEAKICAqIEBzZWUgYXZyZXNhbXBsZV9jbG9zZSgpOwogICoKICAqIEBwYXJhbSBhdnIgICAgICAgICAgICAgYXVkaW8gcmVzYW1wbGUgY29udGV4dAotICogQHBhcmFtIG91dHB1dCAgICAgICAgICBvdXRwdXQgQVZGcmFtZQotICogQHBhcmFtIGlucHV0ICAgICAgICAgICBpbnB1dCBBVkZyYW1lCisgKiBAcGFyYW0gb3V0ICAgICAgICAgICAgIG91dHB1dCBBVkZyYW1lCisgKiBAcGFyYW0gaW4gICAgICAgICAgICAgIGlucHV0IEFWRnJhbWUKICAqIEByZXR1cm4gICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBBVkVSUk9SIG9uIGZhaWx1cmUuCiAgKi8KK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgYXZyZXNhbXBsZV9jb25maWcoQVZBdWRpb1Jlc2FtcGxlQ29udGV4dCAqYXZyLCBBVkZyYW1lICpvdXQsIEFWRnJhbWUgKmluKTsKIAogLyoqCmRpZmYgLS1naXQgYS9saWJhdnJlc2FtcGxlL2RpdGhlci5oIGIvbGliYXZyZXNhbXBsZS9kaXRoZXIuaAppbmRleCBjNTNlODIyLi43MmYwOWNiIDEwMDY0NAotLS0gYS9saWJhdnJlc2FtcGxlL2RpdGhlci5oCisrKyBiL2xpYmF2cmVzYW1wbGUvZGl0aGVyLmgKQEAgLTM3LDggKzM3LDggQEAKICAgICAgKi8KICAgICB2b2lkICgqcXVhbnRpemUpKGludDE2X3QgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgZmxvYXQgKmRpdGhlciwgaW50IGxlbik7CiAKLSAgICBpbnQgcHRyX2FsaWduOyAgICAgIC8vLzwgc3JjIGFuZCBkc3QgY29uc3RyYWl0cyBmb3IgcXVhbnRpemUoKQotICAgIGludCBzYW1wbGVzX2FsaWduOyAgLy8vPCBsZW4gY29uc3RyYWl0cyBmb3IgcXVhbnRpemUoKQorICAgIGludCBwdHJfYWxpZ247ICAgICAgLy8vPCBzcmMgYW5kIGRzdCBjb25zdHJhaW50cyBmb3IgcXVhbnRpemUoKQorICAgIGludCBzYW1wbGVzX2FsaWduOyAgLy8vPCBsZW4gY29uc3RyYWludHMgZm9yIHF1YW50aXplKCkKIAogICAgIC8qKgogICAgICAqIENvbnZlcnQgZGl0aGVyIG5vaXNlIGZyb20gaW50IHRvIGZsb2F0IHdpdGggdHJpYW5ndWxhciBkaXN0cmlidXRpb24uCmRpZmYgLS1naXQgYS9saWJhdnJlc2FtcGxlL2xpYmF2cmVzYW1wbGUudiBiL2xpYmF2cmVzYW1wbGUvbGliYXZyZXNhbXBsZS52CmluZGV4IGI4YzdjN2QuLmQ2ZmM3NTEgMTAwNjQ0Ci0tLSBhL2xpYmF2cmVzYW1wbGUvbGliYXZyZXNhbXBsZS52CisrKyBiL2xpYmF2cmVzYW1wbGUvbGliYXZyZXNhbXBsZS52CkBAIC0xLDQgKzEsNiBAQAotTElCQVZSRVNBTVBMRV8kTUFKT1IgewotICAgICAgICBnbG9iYWw6IGF2KjsKLSAgICAgICAgbG9jYWw6ICAqOworTElCQVZSRVNBTVBMRV9NQUpPUiB7CisgICAgZ2xvYmFsOgorICAgICAgICBhdio7CisgICAgbG9jYWw6CisgICAgICAgICo7CiB9OwpkaWZmIC0tZ2l0IGEvbGliYXZyZXNhbXBsZS9yZXNhbXBsZS5jIGIvbGliYXZyZXNhbXBsZS9yZXNhbXBsZS5jCmluZGV4IDY1MTY3MGQuLmRjMTRjYzIgMTAwNjQ0Ci0tLSBhL2xpYmF2cmVzYW1wbGUvcmVzYW1wbGUuYworKysgYi9saWJhdnJlc2FtcGxlL3Jlc2FtcGxlLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKICNpbmNsdWRlICJyZXNhbXBsZV90ZW1wbGF0ZS5jIgogCiAKLS8qIDB0aCBvcmRlciBtb2RpZmllZCBiZXNzZWwgZnVuY3Rpb24gb2YgdGhlIGZpcnN0IGtpbmQuICovCisvKiAwdGggb3JkZXIgbW9kaWZpZWQgQmVzc2VsIGZ1bmN0aW9uIG9mIHRoZSBmaXJzdCBraW5kLiAqLwogc3RhdGljIGRvdWJsZSBiZXNzZWwoZG91YmxlIHgpCiB7CiAgICAgZG91YmxlIHYgICAgID0gMTsKZGlmZiAtLWdpdCBhL2xpYmF2cmVzYW1wbGUvdGVzdHMvYXZyZXNhbXBsZS5jIGIvbGliYXZyZXNhbXBsZS90ZXN0cy9hdnJlc2FtcGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzNzdiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2cmVzYW1wbGUvdGVzdHMvYXZyZXNhbXBsZS5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICogQ29weXJpZ2h0IChjKSAyMDEyIEp1c3RpbiBSdWdnbGVzIDxqdXN0aW4ucnVnZ2xlc0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGlibS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL29wdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKKworI2luY2x1ZGUgImxpYmF2cmVzYW1wbGUvYXZyZXNhbXBsZS5oIgorCitzdGF0aWMgZG91YmxlIGRibF9yYW5kKEFWTEZHICpsZmcpCit7CisgICAgcmV0dXJuIDIuMCAqIChhdl9sZmdfZ2V0KGxmZykgLyAoZG91YmxlKVVJTlRfTUFYKSAtIDEuMDsKK30KKworI2RlZmluZSBQVVRfRlVOQyhuYW1lLCBmbXQsIHR5cGUsIGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHB1dF9zYW1wbGVfICMjIG5hbWUodm9pZCAqKmRhdGEsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsZSwgaW50IGNoLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdl9kYmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSB2ID0gZXhwcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGUgKipvdXQgPSAodHlwZSAqKilkYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoc2FtcGxlX2ZtdCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG91dFtjaF1bc2FtcGxlXSA9IHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb3V0WzBdW3NhbXBsZSAqIGNoYW5uZWxzICsgY2hdID0gdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1BVVF9GVU5DKHU4LCAgQVZfU0FNUExFX0ZNVF9VOCwgIHVpbnQ4X3QsIGF2X2NsaXBfdWludDggKCBscmludCh2X2RibCAqICgxICA8PCAgNykpICsgMTI4KSkKK1BVVF9GVU5DKHMxNiwgQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIGF2X2NsaXBfaW50MTYgKCBscmludCh2X2RibCAqICgxICA8PCAxNSkpKSkKK1BVVF9GVU5DKHMzMiwgQVZfU0FNUExFX0ZNVF9TMzIsIGludDMyX3QsIGF2X2NsaXBsX2ludDMyKGxscmludCh2X2RibCAqICgxVSA8PCAzMSkpKSkKK1BVVF9GVU5DKGZsdCwgQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0LCAgIHZfZGJsKQorUFVUX0ZVTkMoZGJsLCBBVl9TQU1QTEVfRk1UX0RCTCwgZG91YmxlLCAgdl9kYmwpCisKK3N0YXRpYyB2b2lkIHB1dF9zYW1wbGUodm9pZCAqKmRhdGEsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgc2FtcGxlLCBpbnQgY2gsIGRvdWJsZSB2X2RibCkKK3sKKyAgICBzd2l0Y2ggKGF2X2dldF9wYWNrZWRfc2FtcGxlX2ZtdChzYW1wbGVfZm10KSkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9VODoKKyAgICAgICAgcHV0X3NhbXBsZV91OChkYXRhLCBzYW1wbGVfZm10LCBjaGFubmVscywgc2FtcGxlLCBjaCwgdl9kYmwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OgorICAgICAgICBwdXRfc2FtcGxlX3MxNihkYXRhLCBzYW1wbGVfZm10LCBjaGFubmVscywgc2FtcGxlLCBjaCwgdl9kYmwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOgorICAgICAgICBwdXRfc2FtcGxlX3MzMihkYXRhLCBzYW1wbGVfZm10LCBjaGFubmVscywgc2FtcGxlLCBjaCwgdl9kYmwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOgorICAgICAgICBwdXRfc2FtcGxlX2ZsdChkYXRhLCBzYW1wbGVfZm10LCBjaGFubmVscywgc2FtcGxlLCBjaCwgdl9kYmwpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMOgorICAgICAgICBwdXRfc2FtcGxlX2RibChkYXRhLCBzYW1wbGVfZm10LCBjaGFubmVscywgc2FtcGxlLCBjaCwgdl9kYmwpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvZ2VuKEFWTEZHICpybmQsIHZvaWQgKipkYXRhLCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBzYW1wbGVfcmF0ZSwgaW50IG5iX3NhbXBsZXMpCit7CisgICAgaW50IGksIGNoLCBrOworICAgIGRvdWJsZSB2LCBmLCBhLCBhbXBhOworICAgIGRvdWJsZSB0YWJmMVtBVlJFU0FNUExFX01BWF9DSEFOTkVMU107CisgICAgZG91YmxlIHRhYmYyW0FWUkVTQU1QTEVfTUFYX0NIQU5ORUxTXTsKKyAgICBkb3VibGUgdGFiYVtBVlJFU0FNUExFX01BWF9DSEFOTkVMU107CisKKyNkZWZpbmUgUFVUX1NBTVBMRSBwdXRfc2FtcGxlKGRhdGEsIHNhbXBsZV9mbXQsIGNoYW5uZWxzLCBrLCBjaCwgdik7CisKKyAgICBrID0gMDsKKworICAgIC8qIDEgc2Vjb25kIG9mIHNpbmdsZSBmcmVxIHNpbmUgYXQgMTAwMCBIeiAqLworICAgIGEgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCAxICogc2FtcGxlX3JhdGUgJiYgayA8IG5iX3NhbXBsZXM7IGkrKywgaysrKSB7CisgICAgICAgIHYgPSBzaW4oYSkgKiAwLjMwOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIFBVVF9TQU1QTEUKKyAgICAgICAgYSArPSBNX1BJICogMTAwMC4wICogMi4wIC8gc2FtcGxlX3JhdGU7CisgICAgfQorCisgICAgLyogMSBzZWNvbmQgb2YgdmFyeWluZyBmcmVxdWVuY3kgYmV0d2VlbiAxMDAgYW5kIDEwMDAwIEh6ICovCisgICAgYSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDEgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgdiA9IHNpbihhKSAqIDAuMzA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgICAgICBmICA9IDEwMC4wICsgKCgoMTAwMDAuMCAtIDEwMC4wKSAqIGkpIC8gc2FtcGxlX3JhdGUpOworICAgICAgICBhICs9IE1fUEkgKiBmICogMi4wIC8gc2FtcGxlX3JhdGU7CisgICAgfQorCisgICAgLyogMC41IHNlY29uZCBvZiBsb3cgYW1wbGl0dWRlIHdoaXRlIG5vaXNlICovCisgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZV9yYXRlIC8gMiAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgdiA9IGRibF9yYW5kKHJuZCkgKiAwLjMwOworICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIFBVVF9TQU1QTEUKKyAgICB9CisKKyAgICAvKiAwLjUgc2Vjb25kIG9mIGhpZ2ggYW1wbGl0dWRlIHdoaXRlIG5vaXNlICovCisgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZV9yYXRlIC8gMiAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgdiA9IGRibF9yYW5kKHJuZCk7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgIH0KKworICAgIC8qIDEgc2Vjb25kIG9mIHVucmVsYXRlZCByYW1wcyBmb3IgZWFjaCBjaGFubmVsICovCisgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgdGFiYVtjaF0gID0gMDsKKyAgICAgICAgdGFiZjFbY2hdID0gMTAwICsgYXZfbGZnX2dldChybmQpICUgNTAwMDsKKyAgICAgICAgdGFiZjJbY2hdID0gMTAwICsgYXZfbGZnX2dldChybmQpICUgNTAwMDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDEgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIHYgPSBzaW4odGFiYVtjaF0pICogMC4zMDsKKyAgICAgICAgICAgIFBVVF9TQU1QTEUKKyAgICAgICAgICAgIGYgPSB0YWJmMVtjaF0gKyAoKCh0YWJmMltjaF0gLSB0YWJmMVtjaF0pICogaSkgLyBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICB0YWJhW2NoXSArPSBNX1BJICogZiAqIDIuMCAvIHNhbXBsZV9yYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgLyogMiBzZWNvbmRzIG9mIDUwMCBIeiB3aXRoIHZhcnlpbmcgdm9sdW1lICovCisgICAgYSAgICA9IDA7CisgICAgYW1wYSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDIgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBhbXAgPSAoMS4wICsgc2luKGFtcGEpKSAqIDAuMTU7CisgICAgICAgICAgICBpZiAoY2ggJiAxKQorICAgICAgICAgICAgICAgIGFtcCA9IDAuMzAgLSBhbXA7CisgICAgICAgICAgICB2ID0gc2luKGEpICogYW1wOworICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgICAgICAgICAgYSAgICArPSBNX1BJICogNTAwLjAgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGFtcGEgKz0gTV9QSSAqICAyLjAgLyBzYW1wbGVfcmF0ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogZm9ybWF0cywgcmF0ZXMsIGFuZCBsYXlvdXRzIGFyZSBvcmRlcmVkIGZvciBwcmlvcml0eSBpbiB0ZXN0aW5nLgorICAgZS5nLiAnYXZyZXNhbXBsZS10ZXN0IDQgMiAyJyB3aWxsIHRlc3QgYWxsIGlucHV0L291dHB1dCBjb21iaW5hdGlvbnMgb2YKKyAgIFMxNi9GTFRQL1MxNlAvRkxULCA0ODAwMC80NDEwMCwgYW5kIHN0ZXJlby9tb25vICovCisKK3N0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZvcm1hdHNbXSA9IHsKKyAgICBBVl9TQU1QTEVfRk1UX1MxNiwKKyAgICBBVl9TQU1QTEVfRk1UX0ZMVFAsCisgICAgQVZfU0FNUExFX0ZNVF9TMTZQLAorICAgIEFWX1NBTVBMRV9GTVRfRkxULAorICAgIEFWX1NBTVBMRV9GTVRfUzMyUCwKKyAgICBBVl9TQU1QTEVfRk1UX1MzMiwKKyAgICBBVl9TQU1QTEVfRk1UX1U4UCwKKyAgICBBVl9TQU1QTEVfRk1UX1U4LAorICAgIEFWX1NBTVBMRV9GTVRfREJMUCwKKyAgICBBVl9TQU1QTEVfRk1UX0RCTCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgcmF0ZXNbXSA9IHsKKyAgICA0ODAwMCwKKyAgICA0NDEwMCwKKyAgICAxNjAwMAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGxheW91dHNbXSA9IHsKKyAgICBBVl9DSF9MQVlPVVRfU1RFUkVPLAorICAgIEFWX0NIX0xBWU9VVF9NT05PLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxLAorICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxLAorfTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIEFWQXVkaW9SZXNhbXBsZUNvbnRleHQgKnM7CisgICAgQVZMRkcgcm5kOworICAgIGludCByZXQgPSAwOworICAgIHVpbnQ4X3QgKmluX2J1ZiA9IE5VTEw7CisgICAgdWludDhfdCAqb3V0X2J1ZiA9IE5VTEw7CisgICAgdW5zaWduZWQgaW50IGluX2J1Zl9zaXplOworICAgIHVuc2lnbmVkIGludCBvdXRfYnVmX3NpemU7CisgICAgdWludDhfdCAgKmluX2RhdGFbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdID0geyAwIH07CisgICAgdWludDhfdCAqb3V0X2RhdGFbQVZSRVNBTVBMRV9NQVhfQ0hBTk5FTFNdID0geyAwIH07CisgICAgaW50IGluX2xpbmVzaXplOworICAgIGludCBvdXRfbGluZXNpemU7CisgICAgdWludDY0X3QgaW5fY2hfbGF5b3V0OworICAgIGludCBpbl9jaGFubmVsczsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGluX2ZtdDsKKyAgICBpbnQgaW5fcmF0ZTsKKyAgICB1aW50NjRfdCBvdXRfY2hfbGF5b3V0OworICAgIGludCBvdXRfY2hhbm5lbHM7CisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBvdXRfZm10OworICAgIGludCBvdXRfcmF0ZTsKKyAgICBpbnQgbnVtX2Zvcm1hdHMsIG51bV9yYXRlcywgbnVtX2xheW91dHM7CisgICAgaW50IGksIGosIGssIGwsIG0sIG47CisKKyAgICBudW1fZm9ybWF0cyA9IDI7CisgICAgbnVtX3JhdGVzICAgPSAyOworICAgIG51bV9sYXlvdXRzID0gMjsKKyAgICBpZiAoYXJnYyA+IDEpIHsKKyAgICAgICAgaWYgKCFhdl9zdHJuY2FzZWNtcChhcmd2WzFdLCAiLWgiLCAzKSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiVXNhZ2U6IGF2cmVzYW1wbGUtdGVzdCBbPG51bSBmb3JtYXRzPiAiCisgICAgICAgICAgICAgICAgICAgIls8bnVtIHNhbXBsZSByYXRlcz4gWzxudW0gY2hhbm5lbCBsYXlvdXRzPl1dXVxuIgorICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IGlzIDIgMiAyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIG51bV9mb3JtYXRzID0gc3RydG9sKGFyZ3ZbMV0sIE5VTEwsIDApOworICAgICAgICBudW1fZm9ybWF0cyA9IGF2X2NsaXAobnVtX2Zvcm1hdHMsIDEsIEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpKTsKKyAgICB9CisgICAgaWYgKGFyZ2MgPiAyKSB7CisgICAgICAgIG51bV9yYXRlcyA9IHN0cnRvbChhcmd2WzJdLCBOVUxMLCAwKTsKKyAgICAgICAgbnVtX3JhdGVzID0gYXZfY2xpcChudW1fcmF0ZXMsIDEsIEZGX0FSUkFZX0VMRU1TKHJhdGVzKSk7CisgICAgfQorICAgIGlmIChhcmdjID4gMykgeworICAgICAgICBudW1fbGF5b3V0cyA9IHN0cnRvbChhcmd2WzNdLCBOVUxMLCAwKTsKKyAgICAgICAgbnVtX2xheW91dHMgPSBhdl9jbGlwKG51bV9sYXlvdXRzLCAxLCBGRl9BUlJBWV9FTEVNUyhsYXlvdXRzKSk7CisgICAgfQorCisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOworCisgICAgYXZfbGZnX2luaXQoJnJuZCwgMHhDMEZGRUUpOworCisgICAgaW5fYnVmX3NpemUgPSBhdl9zYW1wbGVzX2dldF9idWZmZXJfc2l6ZSgmaW5fbGluZXNpemUsIDgsIDQ4MDAwICogNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1NBTVBMRV9GTVRfREJMUCwgMCk7CisgICAgb3V0X2J1Zl9zaXplID0gaW5fYnVmX3NpemU7CisKKyAgICBpbl9idWYgPSBhdl9tYWxsb2MoaW5fYnVmX3NpemUpOworICAgIGlmICghaW5fYnVmKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBvdXRfYnVmID0gYXZfbWFsbG9jKG91dF9idWZfc2l6ZSk7CisgICAgaWYgKCFvdXRfYnVmKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIHMgPSBhdnJlc2FtcGxlX2FsbG9jX2NvbnRleHQoKTsKKyAgICBpZiAoIXMpIHsKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgQVZBdWRpb1Jlc2FtcGxlQ29udGV4dFxuIik7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZm9ybWF0czsgaSsrKSB7CisgICAgICAgIGluX2ZtdCA9IGZvcm1hdHNbaV07CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBudW1fbGF5b3V0czsgaysrKSB7CisgICAgICAgICAgICBpbl9jaF9sYXlvdXQgPSBsYXlvdXRzW2tdOworICAgICAgICAgICAgaW5fY2hhbm5lbHMgID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGluX2NoX2xheW91dCk7CisgICAgICAgICAgICBmb3IgKG0gPSAwOyBtIDwgbnVtX3JhdGVzOyBtKyspIHsKKyAgICAgICAgICAgICAgICBpbl9yYXRlID0gcmF0ZXNbbV07CisKKyAgICAgICAgICAgICAgICByZXQgPSBhdl9zYW1wbGVzX2ZpbGxfYXJyYXlzKGluX2RhdGEsICZpbl9saW5lc2l6ZSwgaW5fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fY2hhbm5lbHMsIGluX3JhdGUgKiA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fZm10LCAwKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIGluX2RhdGEgZmlsbCBhcnJheXNcbiIpOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9nZW4oJnJuZCwgKHZvaWQgKiopaW5fZGF0YSwgaW5fZm10LCBpbl9jaGFubmVscywgaW5fcmF0ZSwgaW5fcmF0ZSAqIDYpOworCisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG51bV9mb3JtYXRzOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0X2ZtdCA9IGZvcm1hdHNbal07CisgICAgICAgICAgICAgICAgICAgIGZvciAobCA9IDA7IGwgPCBudW1fbGF5b3V0czsgbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRfY2hfbGF5b3V0ID0gbGF5b3V0c1tsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dF9jaGFubmVscyAgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMob3V0X2NoX2xheW91dCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgbnVtX3JhdGVzOyBuKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcmF0ZSA9IHJhdGVzW25dOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJXMgdG8gJXMsICVkIHRvICVkIGNoYW5uZWxzLCAlZCBIeiB0byAlZCBIelxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShpbl9mbXQpLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKG91dF9mbXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9jaGFubmVscywgb3V0X2NoYW5uZWxzLCBpbl9yYXRlLCBvdXRfcmF0ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBhdl9zYW1wbGVzX2ZpbGxfYXJyYXlzKG91dF9kYXRhLCAmb3V0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2J1Ziwgb3V0X2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3JhdGUgKiA2LCBvdXRfZm10LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiZmFpbGVkIG91dF9kYXRhIGZpbGwgYXJyYXlzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQocywgImluX2NoYW5uZWxfbGF5b3V0IiwgIGluX2NoX2xheW91dCwgIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KHMsICJpbl9zYW1wbGVfZm10IiwgICAgICBpbl9mbXQsICAgICAgICAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9vcHRfc2V0X2ludChzLCAiaW5fc2FtcGxlX3JhdGUiLCAgICAgaW5fcmF0ZSwgICAgICAgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQocywgIm91dF9jaGFubmVsX2xheW91dCIsIG91dF9jaF9sYXlvdXQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KHMsICJvdXRfc2FtcGxlX2ZtdCIsICAgICBvdXRfZm10LCAgICAgICAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9vcHRfc2V0X2ludChzLCAib3V0X3NhbXBsZV9yYXRlIiwgICAgb3V0X3JhdGUsICAgICAgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9vcHRfc2V0X2ludChzLCAiaW50ZXJuYWxfc2FtcGxlX2ZtdCIsIEFWX1NBTVBMRV9GTVRfRkxUUCwgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBhdnJlc2FtcGxlX29wZW4ocyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIkVycm9yIG9wZW5pbmcgY29udGV4dFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGF2cmVzYW1wbGVfY29udmVydChzLCBvdXRfZGF0YSwgb3V0X2xpbmVzaXplLCBvdXRfcmF0ZSAqIDYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9kYXRhLCAgaW5fbGluZXNpemUsICBpbl9yYXRlICogNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBlcnJidWZbMjU2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfc3RyZXJyb3IocmV0LCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVzXG4iLCBlcnJidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiQ29udmVydGVkICVkIHNhbXBsZXMgdG8gJWQgc2FtcGxlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcmF0ZSAqIDYsIHJldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF2cmVzYW1wbGVfZ2V0X2RlbGF5KHMpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJWQgZGVsYXkgc2FtcGxlcyBub3QgY29udmVydGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZyZXNhbXBsZV9nZXRfZGVsYXkocykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdnJlc2FtcGxlX2F2YWlsYWJsZShzKSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIiVkIHNhbXBsZXMgYXZhaWxhYmxlIGZvciBvdXRwdXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdnJlc2FtcGxlX2F2YWlsYWJsZShzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiXG4iKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2cmVzYW1wbGVfY2xvc2Uocyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSAwOworCitlbmQ6CisgICAgYXZfZnJlZXAoJmluX2J1Zik7CisgICAgYXZfZnJlZXAoJm91dF9idWYpOworICAgIGF2cmVzYW1wbGVfZnJlZSgmcyk7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2cmVzYW1wbGUvdmVyc2lvbi5oIGIvbGliYXZyZXNhbXBsZS92ZXJzaW9uLmgKaW5kZXggYjViMGUyZC4uZDVkM2VhOCAxMDA2NDQKLS0tIGEvbGliYXZyZXNhbXBsZS92ZXJzaW9uLmgKKysrIGIvbGliYXZyZXNhbXBsZS92ZXJzaW9uLmgKQEAgLTI3LDcgKzI3LDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC92ZXJzaW9uLmgiCiAKLSNkZWZpbmUgTElCQVZSRVNBTVBMRV9WRVJTSU9OX01BSk9SICAzCisjZGVmaW5lIExJQkFWUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiAgNAogI2RlZmluZSBMSUJBVlJFU0FNUExFX1ZFUlNJT05fTUlOT1IgIDAKICNkZWZpbmUgTElCQVZSRVNBTVBMRV9WRVJTSU9OX01JQ1JPICAwCiAKZGlmZiAtLWdpdCBhL2xpYmF2cmVzYW1wbGUveDg2L01ha2VmaWxlIGIvbGliYXZyZXNhbXBsZS94ODYvTWFrZWZpbGUKaW5kZXggMGNhMmQ3OS4uNTViNzA5YyAxMDA2NDQKLS0tIGEvbGliYXZyZXNhbXBsZS94ODYvTWFrZWZpbGUKKysrIGIvbGliYXZyZXNhbXBsZS94ODYvTWFrZWZpbGUKQEAgLTQsNiArNCw2IEBACiAKIE9CSlMtJChDT05GSUdfWE1NX0NMT0JCRVJfVEVTVCkgKz0geDg2L3c2NHhtbXRlc3QubwogCi1ZQVNNLU9CSlMgKz0geDg2L2F1ZGlvX2NvbnZlcnQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitYODZBU00tT0JKUyArPSB4ODYvYXVkaW9fY29udmVydC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgeDg2L2F1ZGlvX21peC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgeDg2L2RpdGhlci5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvTWFrZWZpbGUgYi9saWJhdnV0aWwvTWFrZWZpbGUKaW5kZXggNjViMmQyNS4uYTYzYmE1MiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL01ha2VmaWxlCisrKyBiL2xpYmF2dXRpbC9NYWtlZmlsZQpAQCAtMSw2ICsxLDUgQEAKLWluY2x1ZGUgJChTVUJESVIpLi4vY29uZmlnLm1hawotCiBOQU1FID0gYXZ1dGlsCitERVNDID0gRkZtcGVnIHV0aWxpdHkgbGlicmFyeQogCiBIRUFERVJTID0gYWRsZXIzMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgYWVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMiw4ICsyMSwxMCBAQAogICAgICAgICAgIGNwdS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGNyYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGRlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGRpY3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGRpc3BsYXkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGRvd25taXhfaW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGVuY3J5cHRpb25faW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGVycm9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGV2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIGZpZm8uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzEsNiArMzIsMTYgQEAKICAgICAgICAgICBmcmFtZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBoYXNoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBobWFjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfY3VkYS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfZDNkMTF2YS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfZHJtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfZHh2YTIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfcXN2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfbWVkaWFjb2RlYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfdmFhcGkuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfdmlkZW90b29sYm94LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBod2NvbnRleHRfdmRwYXUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBpbWd1dGlscy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBpbnRmbG9hdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBpbnRyZWFkd3JpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQzLDcgKzU0LDYgQEAKICAgICAgICAgICBtZW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBtb3Rpb25fdmVjdG9yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBtdXJtdXIzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkaWN0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBvcHQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBwYXJzZXV0aWxzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICBwaXhkZXNjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTUxLDEyICs2MSwxMyBAQAogICAgICAgICAgIHBpeGZtdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHJhbmRvbV9zZWVkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHJjNC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcGxheWdhaW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHJhdGlvbmFsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJlcGxheWdhaW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHJpcGVtZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHNhbXBsZWZtdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHNoYS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHNoYTUxMi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHNwaGVyaWNhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHN0ZXJlbzNkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHRocmVhZG1lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHRpbWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNzAsOCArODEsNiBAQAogCiBIRUFERVJTLSQoQ09ORklHX0xaTykgICAgICAgICAgICAgICAgICAgKz0gbHpvLmgKIAotSEVBREVSUy0kKENPTkZJR19PUEVOQ0wpICAgICAgICAgICAgICAgICs9IG9wZW5jbC5oCi0KIEFSQ0hfSEVBREVSUyA9IGJzd2FwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGludG1hdGguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGludHJlYWR3cml0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTk2LDggKzEwNSwxMCBAQAogICAgICAgIGNwdS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGNyYy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRlcy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGRpY3QubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRpc3BsYXkubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGRvd25taXhfaW5mby5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGVuY3J5cHRpb25faW5mby5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGVycm9yLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGV2YWwubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGZpZm8ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTA4LDYgKzExOSw3IEBACiAgICAgICAgZnJhbWUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaGFzaC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaG1hYy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaHdjb250ZXh0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW1ndXRpbHMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50ZWdlci5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgaW50bWF0aC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0xMjAsNyArMTMyLDYgQEAKICAgICAgICBtZDUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBtZW0ubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBtdXJtdXIzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBkaWN0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBvcHQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBwYXJzZXV0aWxzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBwaXhkZXNjLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEzMyw2ICsxNDQsOCBAQAogICAgICAgIHNhbXBsZWZtdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNoYS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHNoYTUxMi5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHNsaWNldGhyZWFkLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHNwaGVyaWNhbC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHN0ZXJlbzNkLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHRocmVhZG1lc3NhZ2UubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHRpbWUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTQ0LDQwICsxNTcsNTcgQEAKICAgICAgICB4dGVhLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICB0ZWEubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAotT0JKUy0kKCFIQVZFX0FUT01JQ1NfTkFUSVZFKSAgICAgICAgICAgICs9IGF0b21pYy5vICAgICAgICAgICAgICAgICAgICAgXAotCitPQkpTLSQoQ09ORklHX0NVREEpICAgICAgICAgICAgICAgICAgICAgKz0gaHdjb250ZXh0X2N1ZGEubworT0JKUy0kKENPTkZJR19EM0QxMVZBKSAgICAgICAgICAgICAgICAgICs9IGh3Y29udGV4dF9kM2QxMXZhLm8KK09CSlMtJChDT05GSUdfRFhWQTIpICAgICAgICAgICAgICAgICAgICArPSBod2NvbnRleHRfZHh2YTIubworT0JKUy0kKENPTkZJR19RU1YpICAgICAgICAgICAgICAgICAgICs9IGh3Y29udGV4dF9xc3YubworT0JKUy0kKENPTkZJR19MSUJEUk0pICAgICAgICAgICAgICAgICAgICs9IGh3Y29udGV4dF9kcm0ubwogT0JKUy0kKENPTkZJR19MWk8pICAgICAgICAgICAgICAgICAgICAgICs9IGx6by5vCi1PQkpTLSQoQ09ORklHX09QRU5DTCkgICAgICAgICAgICAgICAgICAgKz0gb3BlbmNsLm8gb3BlbmNsX2ludGVybmFsLm8KK09CSlMtJChDT05GSUdfT1BFTkNMKSAgICAgICAgICAgICAgICAgICArPSBod2NvbnRleHRfb3BlbmNsLm8KK09CSlMtJChDT05GSUdfVkFBUEkpICAgICAgICAgICAgICAgICAgICArPSBod2NvbnRleHRfdmFhcGkubworT0JKUy0kKENPTkZJR19WSURFT1RPT0xCT1gpICAgICAgICAgICAgICs9IGh3Y29udGV4dF92aWRlb3Rvb2xib3gubworT0JKUy0kKENPTkZJR19WRFBBVSkgICAgICAgICAgICAgICAgICAgICs9IGh3Y29udGV4dF92ZHBhdS5vCitPQkpTLSQoQ09ORklHX01FRElBQ09ERUMpICAgICAgICAgICAgICAgKz0gaHdjb250ZXh0X21lZGlhY29kZWMubwogCiBPQkpTICs9ICQoQ09NUEFUX09CSlM6JT0uLi9jb21wYXQvJSkKIAogIyBXaW5kb3dzIHJlc291cmNlIGZpbGUKIFNMSUJPQkpTLSQoSEFWRV9HTlVfV0lORFJFUykgICAgICAgICAgICArPSBhdnV0aWxyZXMubwogCi1TS0lQSEVBREVSUy0kKEhBVkVfQVRPTUlDU19HQ0MpICAgICAgICArPSBhdG9taWNfZ2NjLmgKLVNLSVBIRUFERVJTLSQoSEFWRV9BVE9NSUNTX1NVTkNDKSAgICAgICs9IGF0b21pY19zdW5jYy5oCi1TS0lQSEVBREVSUy0kKEhBVkVfQVRPTUlDU19XSU4zMikgICAgICArPSBhdG9taWNfd2luMzIuaAotU0tJUEhFQURFUlMtJChDT05GSUdfT1BFTkNMKSAgICAgICAgICAgKz0gb3BlbmNsLmgKK1NLSVBIRUFERVJTLSQoSEFWRV9DVURBX0gpICAgICAgICAgICAgICs9IGh3Y29udGV4dF9jdWRhLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX0NVREEpICAgICAgICAgICAgICs9IGh3Y29udGV4dF9jdWRhX2ludGVybmFsLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX0QzRDExVkEpICAgICAgICAgICs9IGh3Y29udGV4dF9kM2QxMXZhLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX0RYVkEyKSAgICAgICAgICAgICs9IGh3Y29udGV4dF9keHZhMi5oCitTS0lQSEVBREVSUy0kKENPTkZJR19RU1YpICAgICAgICAgICArPSBod2NvbnRleHRfcXN2LmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX09QRU5DTCkgICAgICAgICAgICs9IGh3Y29udGV4dF9vcGVuY2wuaAorU0tJUEhFQURFUlMtJChDT05GSUdfVkFBUEkpICAgICAgICAgICAgKz0gaHdjb250ZXh0X3ZhYXBpLmgKK1NLSVBIRUFERVJTLSQoQ09ORklHX1ZJREVPVE9PTEJPWCkgICAgICs9IGh3Y29udGV4dF92aWRlb3Rvb2xib3guaAorU0tJUEhFQURFUlMtJChDT05GSUdfVkRQQVUpICAgICAgICAgICAgKz0gaHdjb250ZXh0X3ZkcGF1LmgKIAogVEVTVFBST0dTID0gYWRsZXIzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYXRvbWljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYWVzX2N0ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXVkaW9fZmlmbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYXZzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYmFzZTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYmxvd2Zpc2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgYnByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgY2FzdDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgY2FtZWxsaWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29sb3JfdXRpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgY3B1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgY3JjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZGlzcGxheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgZXZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgZmlmbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZmxvYXRfZHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGFzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgaG1hYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW1ndXRpbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgbGZnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgbGxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgbG9nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMTg4LDYgKzIxOCw3IEBACiAgICAgICAgICAgICBwYXJzZXV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBwaXhkZXNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBwaXhlbHV0aWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwaXhmbXRfYmVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICByYW5kb21fc2VlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICByYXRpb25hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICByaXBlbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMDAsNiArMjMxLDcgQEAKICAgICAgICAgICAgIHh0ZWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHRlYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAorVEVTVFBST0dTLSQoSEFWRV9USFJFQURTKSAgICAgICAgICAgICs9IGNwdV9pbml0CiBURVNUUFJPR1MtJChIQVZFX0xaTzFYXzk5OV9DT01QUkVTUykgKz0gbHpvCiAKIFRPT0xTID0gY3J5cHRvX2JlbmNoIGZmaGFzaCBmZmV2YWwgZmZlc2NhcGUKQEAgLTIwNyw0ICsyMzksNCBAQAogdG9vbHMvY3J5cHRvX2JlbmNoJChFWEVTVUYpOiBFTElCUyArPSAkKGlmICQoVkVSU1VTKSwkKHN1YnN0ICssIC1sLCskKFZFUlNVUykpLCkKIHRvb2xzL2NyeXB0b19iZW5jaCQoRVhFU1VGKTogQ0ZMQUdTICs9IC1EVVNFX0VYVF9MSUJTPTAkKGlmICQoVkVSU1VTKSwkKHN1YnN0ICssK1VTRV8sKyQoVkVSU1VTKSksKQogCi0kKFNVQkRJUilsem8tdGVzdCQoRVhFU1VGKTogRUxJQlMgPSAtbGx6bzIKKyQoU1VCRElSKXRlc3RzL2x6byQoRVhFU1VGKTogRUxJQlMgPSAtbGx6bzIKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIGIvbGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMKaW5kZXggZmYzNGU3YS4uZmQzMmJmNyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMKKysrIGIvbGliYXZ1dGlsL2FhcmNoNjQvYXNtLlMKQEAgLTIzLDcgKzIzLDcgQEAKICNpZmRlZiBfX0VMRl9fCiAjICAgZGVmaW5lIEVMRgogI2Vsc2UKLSMgICBkZWZpbmUgRUxGICAjCisjICAgZGVmaW5lIEVMRiAjCiAjZW5kaWYKIAogI2lmIEhBVkVfQVNfRlVOQwpAQCAtNzIsMTUgKzcyLDMwIEBACiBcbmFtZToKIC5lbmRtCiAKLS5tYWNybyAgbW92cmVsIHJkLCB2YWwKKy5tYWNybyAgbW92cmVsIHJkLCB2YWwsIG9mZnNldD0wCiAjaWYgQ09ORklHX1BJQyAmJiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICAuaWYgXG9mZnNldCA8IDAKICAgICAgICAgYWRycCAgICAgICAgICAgIFxyZCwgXHZhbEBQQUdFCiAgICAgICAgIGFkZCAgICAgICAgICAgICBccmQsIFxyZCwgXHZhbEBQQUdFT0ZGCi0jZWxpZiBDT05GSUdfUElDCisgICAgICAgIHN1YiAgICAgICAgICAgICBccmQsIFxyZCwgLShcb2Zmc2V0KQorICAgIC5lbHNlCisgICAgICAgIGFkcnAgICAgICAgICAgICBccmQsIFx2YWwrKFxvZmZzZXQpQFBBR0UKKyAgICAgICAgYWRkICAgICAgICAgICAgIFxyZCwgXHJkLCBcdmFsKyhcb2Zmc2V0KUBQQUdFT0ZGCisgICAgLmVuZGlmCisjZWxpZiBDT05GSUdfUElDICYmIGRlZmluZWQoX1dJTjMyKQorICAgIC5pZiBcb2Zmc2V0IDwgMAogICAgICAgICBhZHJwICAgICAgICAgICAgXHJkLCBcdmFsCiAgICAgICAgIGFkZCAgICAgICAgICAgICBccmQsIFxyZCwgOmxvMTI6XHZhbAorICAgICAgICBzdWIgICAgICAgICAgICAgXHJkLCBccmQsIC0oXG9mZnNldCkKKyAgICAuZWxzZQorICAgICAgICBhZHJwICAgICAgICAgICAgXHJkLCBcdmFsKyhcb2Zmc2V0KQorICAgICAgICBhZGQgICAgICAgICAgICAgXHJkLCBccmQsIDpsbzEyOlx2YWwrKFxvZmZzZXQpCisgICAgLmVuZGlmCisjZWxpZiBDT05GSUdfUElDCisgICAgICAgIGFkcnAgICAgICAgICAgICBccmQsIFx2YWwrKFxvZmZzZXQpCisgICAgICAgIGFkZCAgICAgICAgICAgICBccmQsIFxyZCwgOmxvMTI6XHZhbCsoXG9mZnNldCkKICNlbHNlCi0gICAgICAgIGxkciAgICAgICAgICAgICBccmQsID1cdmFsCisgICAgICAgIGxkciAgICAgICAgICAgICBccmQsID1cdmFsK1xvZmZzZXQKICNlbmRpZgogLmVuZG0KIApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2FhcmNoNjQvY3B1LmMgYi9saWJhdnV0aWwvYWFyY2g2NC9jcHUuYwppbmRleCA4ZWYwNzdhLi5jYzY0MWRhIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvYWFyY2g2NC9jcHUuYworKysgYi9saWJhdnV0aWwvYWFyY2g2NC9jcHUuYwpAQCAtMjYsMyArMjYsMTMgQEAKICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfTkVPTiAgKiBIQVZFX05FT04gIHwKICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfVkZQICAgKiBIQVZFX1ZGUDsKIH0KKworc2l6ZV90IGZmX2dldF9jcHVfbWF4X2FsaWduX2FhcmNoNjQodm9pZCkKK3sKKyAgICBpbnQgZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoZmxhZ3MgJiBBVl9DUFVfRkxBR19ORU9OKQorICAgICAgICByZXR1cm4gMTY7CisKKyAgICByZXR1cm4gODsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIGIvbGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgKaW5kZXggY2YxYjljYy4uMmVlM2Y5MyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgKKysrIGIvbGliYXZ1dGlsL2FhcmNoNjQvY3B1LmgKQEAgLTE5LDcgKzE5LDYgQEAKICNpZm5kZWYgQVZVVElMX0FBUkNINjRfQ1BVX0gKICNkZWZpbmUgQVZVVElMX0FBUkNINjRfQ1BVX0gKIAotI2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1X2ludGVybmFsLmgiCiAKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9hZGxlcjMyLmMgYi9saWJhdnV0aWwvYWRsZXIzMi5jCmluZGV4IDY0Yzg3NjcuLmM4N2Q1ZTIgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9hZGxlcjMyLmMKKysrIGIvbGliYXZ1dGlsL2FkbGVyMzIuYwpAQCAtOTUsMzggKzk1LDMgQEAKICAgICB9CiAgICAgcmV0dXJuIChzMiA8PCAxNikgfCBzMTsKIH0KLQotI2lmZGVmIFRFU1QKLS8vIExDT1ZfRVhDTF9TVEFSVAotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInRpbWVyLmgiCi0jZGVmaW5lIExFTiA3MDAxCi0KLXN0YXRpYyB2b2xhdGlsZSBpbnQgY2hlY2tzdW07Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgaTsKLSAgICB1aW50OF90IGRhdGFbTEVOXTsKLQotICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBMRU47IGkrKykKLSAgICAgICAgZGF0YVtpXSA9ICgoaSAqIGkpID4+IDMpICsgMTIzICogaTsKLQotICAgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItdCIpKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKLSAgICAgICAgICAgIFNUQVJUX1RJTUVSOwotICAgICAgICAgICAgY2hlY2tzdW0gPSBhdl9hZGxlcjMyX3VwZGF0ZSgxLCBkYXRhLCBMRU4pOwotICAgICAgICAgICAgU1RPUF9USU1FUigiYWRsZXIiKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoZWNrc3VtID0gYXZfYWRsZXIzMl91cGRhdGUoMSwgZGF0YSwgTEVOKTsKLSAgICB9Ci0KLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJVggKGV4cGVjdGVkIDUwRTZFNTA4KVxuIiwgY2hlY2tzdW0pOwotICAgIHJldHVybiBjaGVja3N1bSA9PSAweDUwZTZlNTA4ID8gMCA6IDE7Ci19Ci0vLyBMQ09WX0VYQ0xfU1RPUAotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYWRsZXIzMi5oIGIvbGliYXZ1dGlsL2FkbGVyMzIuaAppbmRleCAwZGM2OWVjLi5hMWYwMzViIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvYWRsZXIzMi5oCisrKyBiL2xpYmF2dXRpbC9hZGxlcjMyLmgKQEAgLTE4LDYgKzE4LDEyIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2dV9hZGxlcjMyCisgKiBQdWJsaWMgaGVhZGVyIGZvciBBZGxlci0zMiBoYXNoIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLgorICovCisKICNpZm5kZWYgQVZVVElMX0FETEVSMzJfSAogI2RlZmluZSBBVlVUSUxfQURMRVIzMl9ICiAKQEAgLTI1LDExICszMSwxMCBAQAogI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKIAogLyoqCi0gKiBAZmlsZQotICogUHVibGljIGhlYWRlciBmb3IgbGliYXZ1dGlsIEFkbGVyMzIgaGFzaGVyCisgKiBAZGVmZ3JvdXAgbGF2dV9hZGxlcjMyIEFkbGVyLTMyCisgKiBAaW5ncm91cCBsYXZ1X2hhc2gKKyAqIEFkbGVyLTMyIGhhc2ggZnVuY3Rpb24gaW1wbGVtZW50YXRpb24uCiAgKgotICogQGRlZmdyb3VwIGxhdnVfYWRsZXIzMiBBZGxlcjMyCi0gKiBAaW5ncm91cCBsYXZ1X2NyeXB0bwogICogQHsKICAqLwogCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYWVzLmMgYi9saWJhdnV0aWwvYWVzLmMKaW5kZXggOTA5NmYwMy4uMzk3ZWE3NyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2Flcy5jCisrKyBiL2xpYmF2dXRpbC9hZXMuYwpAQCAtMzQsNyArMzQsNyBAQAogfQogCiBzdGF0aWMgY29uc3QgdWludDhfdCByY29uWzEwXSA9IHsKLSAgMHgwMSwgMHgwMiwgMHgwNCwgMHgwOCwgMHgxMCwgMHgyMCwgMHg0MCwgMHg4MCwgMHgxYiwgMHgzNgorICAgIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDgsIDB4MTAsIDB4MjAsIDB4NDAsIDB4ODAsIDB4MWIsIDB4MzYKIH07CiAKIHN0YXRpYyB1aW50OF90ICAgICBzYm94WzI1Nl07CkBAIC05Nyw3ICs5Nyw4IEBACiAgICAgczNbMF0udThbIDVdID0gYm94W3MzWzFdLnU4WyAxXV07CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG1peF9jb3JlKHVpbnQzMl90IG11bHRibFtdWzI1Nl0sIGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKXsKK3N0YXRpYyBpbmxpbmUgaW50IG1peF9jb3JlKHVpbnQzMl90IG11bHRibFtdWzI1Nl0sIGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKQorewogI2lmIENPTkZJR19TTUFMTAogICAgIHJldHVybiBtdWx0YmxbMF1bYV0gXiBST1QobXVsdGJsWzBdW2JdLCA4KSBeIFJPVChtdWx0YmxbMF1bY10sIDE2KSBeIFJPVChtdWx0YmxbMF1bZF0sIDI0KTsKICNlbHNlCkBAIC0xMDUsMTIgKzEwNiwxMyBAQAogI2VuZGlmCiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBtaXgoYXZfYWVzX2Jsb2NrIHN0YXRlWzJdLCB1aW50MzJfdCBtdWx0YmxbXVsyNTZdLCBpbnQgczEsIGludCBzMyl7CitzdGF0aWMgaW5saW5lIHZvaWQgbWl4KGF2X2Flc19ibG9jayBzdGF0ZVsyXSwgdWludDMyX3QgbXVsdGJsW11bMjU2XSwgaW50IHMxLCBpbnQgczMpCit7CiAgICAgdWludDhfdCAoKnNyYylbNF0gPSBzdGF0ZVsxXS51OHg0OwotICAgIHN0YXRlWzBdLnUzMlswXSA9IG1peF9jb3JlKG11bHRibCwgc3JjWzBdWzBdLCBzcmNbczEgIF1bMV0sIHNyY1syXVsyXSwgc3JjW3MzICBdWzNdKTsKLSAgICBzdGF0ZVswXS51MzJbMV0gPSBtaXhfY29yZShtdWx0YmwsIHNyY1sxXVswXSwgc3JjW3MzLTFdWzFdLCBzcmNbM11bMl0sIHNyY1tzMS0xXVszXSk7Ci0gICAgc3RhdGVbMF0udTMyWzJdID0gbWl4X2NvcmUobXVsdGJsLCBzcmNbMl1bMF0sIHNyY1tzMyAgXVsxXSwgc3JjWzBdWzJdLCBzcmNbczEgIF1bM10pOwotICAgIHN0YXRlWzBdLnUzMlszXSA9IG1peF9jb3JlKG11bHRibCwgc3JjWzNdWzBdLCBzcmNbczEtMV1bMV0sIHNyY1sxXVsyXSwgc3JjW3MzLTFdWzNdKTsKKyAgICBzdGF0ZVswXS51MzJbMF0gPSBtaXhfY29yZShtdWx0YmwsIHNyY1swXVswXSwgc3JjW3MxICAgIF1bMV0sIHNyY1syXVsyXSwgc3JjW3MzICAgIF1bM10pOworICAgIHN0YXRlWzBdLnUzMlsxXSA9IG1peF9jb3JlKG11bHRibCwgc3JjWzFdWzBdLCBzcmNbczMgLSAxXVsxXSwgc3JjWzNdWzJdLCBzcmNbczEgLSAxXVszXSk7CisgICAgc3RhdGVbMF0udTMyWzJdID0gbWl4X2NvcmUobXVsdGJsLCBzcmNbMl1bMF0sIHNyY1tzMyAgICBdWzFdLCBzcmNbMF1bMl0sIHNyY1tzMSAgICBdWzNdKTsKKyAgICBzdGF0ZVswXS51MzJbM10gPSBtaXhfY29yZShtdWx0YmwsIHNyY1szXVswXSwgc3JjW3MxIC0gMV1bMV0sIHNyY1sxXVsyXSwgc3JjW3MzIC0gMV1bM10pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYWVzX2NyeXB0KEFWQUVTICphLCBpbnQgcywgY29uc3QgdWludDhfdCAqc2JveCwKQEAgLTE3OSw3ICsxODEsNyBAQAogICAgICAgICAgICAgbCA9IGFsb2c4W3ggKyBsb2c4W2NbMV1dXTsKICAgICAgICAgICAgIG0gPSBhbG9nOFt4ICsgbG9nOFtjWzJdXV07CiAgICAgICAgICAgICBuID0gYWxvZzhbeCArIGxvZzhbY1szXV1dOwotICAgICAgICAgICAgdGJsWzBdW2ldID0gQVZfTkUoTUtCRVRBRyhrLGwsbSxuKSwgTUtUQUcoayxsLG0sbikpOworICAgICAgICAgICAgdGJsWzBdW2ldID0gQVZfTkUoTUtCRVRBRyhrLCBsLCBtLCBuKSwgTUtUQUcoaywgbCwgbSwgbikpOwogI2lmICFDT05GSUdfU01BTEwKICAgICAgICAgICAgIHRibFsxXVtpXSA9IFJPVCh0YmxbMF1baV0sIDgpOwogICAgICAgICAgICAgdGJsWzJdW2ldID0gUk9UKHRibFswXVtpXSwgMTYpOwpAQCAtMjAxLDcgKzIwMyw3IEBACiAKICAgICBhLT5jcnlwdCA9IGRlY3J5cHQgPyBhZXNfZGVjcnlwdCA6IGFlc19lbmNyeXB0OwogCi0gICAgaWYgKCFlbmNfbXVsdGJsW0ZGX0FSUkFZX0VMRU1TKGVuY19tdWx0YmwpLTFdW0ZGX0FSUkFZX0VMRU1TKGVuY19tdWx0YmxbMF0pLTFdKSB7CisgICAgaWYgKCFlbmNfbXVsdGJsW0ZGX0FSUkFZX0VMRU1TKGVuY19tdWx0YmwpIC0gMV1bRkZfQVJSQVlfRUxFTVMoZW5jX211bHRibFswXSkgLSAxXSkgewogICAgICAgICBqID0gMTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSsrKSB7CiAgICAgICAgICAgICBhbG9nOFtpXSA9IGFsb2c4W2kgKyAyNTVdID0gajsKQEAgLTIxNSw3ICsyMTcsNyBAQAogICAgICAgICAgICAgaiBePSAoaiA8PCAxKSBeIChqIDw8IDIpIF4gKGogPDwgMykgXiAoaiA8PCA0KTsKICAgICAgICAgICAgIGogPSAoaiBeIChqID4+IDgpIF4gOTkpICYgMjU1OwogICAgICAgICAgICAgaW52X3Nib3hbal0gPSBpOwotICAgICAgICAgICAgc2JveFtpXSA9IGo7CisgICAgICAgICAgICBzYm94W2ldICAgICA9IGo7CiAgICAgICAgIH0KICAgICAgICAgaW5pdF9tdWx0YmwyKGRlY19tdWx0YmwsIChjb25zdCBpbnRbNF0pIHsgMHhlLCAweDksIDB4ZCwgMHhiIH0sCiAgICAgICAgICAgICAgICAgICAgICBsb2c4LCBhbG9nOCwgaW52X3Nib3gpOwpAQCAtMjU3LDk2ICsyNTksMTAgQEAKICAgICAgICAgICAgIGEtPnJvdW5kX2tleVtpXSA9IHRtcFswXTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAocm91bmRzICsgMSkgPj4gMTsgaSsrKSB7Ci0gICAgICAgICAgICBGRlNXQVAoYXZfYWVzX2Jsb2NrLCBhLT5yb3VuZF9rZXlbaV0sIGEtPnJvdW5kX2tleVtyb3VuZHMtaV0pOwotICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocm91bmRzICsgMSkgPj4gMTsgaSsrKQorICAgICAgICAgICAgRkZTV0FQKGF2X2Flc19ibG9jaywgYS0+cm91bmRfa2V5W2ldLCBhLT5yb3VuZF9rZXlbcm91bmRzIC0gaV0pOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQogCi0jaWZkZWYgVEVTVAotLy8gTENPVl9FWENMX1NUQVJUCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSAibGZnLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgaSwgajsKLSAgICBBVkFFUyBiOwotICAgIHVpbnQ4X3QgcmtleVsyXVsxNl0gPSB7Ci0gICAgICAgIHsgMCB9LAotICAgICAgICB7IDB4MTAsIDB4YTUsIDB4ODgsIDB4NjksIDB4ZDcsIDB4NGIsIDB4ZTUsIDB4YTMsCi0gICAgICAgICAgMHg3NCwgMHhjZiwgMHg4NiwgMHg3YywgMHhmYiwgMHg0NywgMHgzOCwgMHg1OSB9Ci0gICAgfTsKLSAgICB1aW50OF90IHB0WzMyXSwgcnB0WzJdWzE2XT0gewotICAgICAgICB7IDB4NmEsIDB4ODQsIDB4ODYsIDB4N2MsIDB4ZDcsIDB4N2UsIDB4MTIsIDB4YWQsCi0gICAgICAgICAgMHgwNywgMHhlYSwgMHgxYiwgMHhlOCwgMHg5NSwgMHhjNSwgMHgzZiwgMHhhMyB9LAotICAgICAgICB7IDAgfQotICAgIH07Ci0gICAgdWludDhfdCByY3RbMl1bMTZdPSB7Ci0gICAgICAgIHsgMHg3MywgMHgyMiwgMHg4MSwgMHhjMCwgMHhhMCwgMHhhYSwgMHhiOCwgMHhmNywKLSAgICAgICAgICAweGE1LCAweDRhLCAweDBjLCAweDY3LCAweGEwLCAweGM0LCAweDVlLCAweGNmIH0sCi0gICAgICAgIHsgMHg2ZCwgMHgyNSwgMHgxZSwgMHg2OSwgMHg0NCwgMHhiMCwgMHg1MSwgMHhlMCwKLSAgICAgICAgICAweDRlLCAweGFhLCAweDZmLCAweGI0LCAweGRiLCAweGY3LCAweDg0LCAweDY1IH0KLSAgICB9OwotICAgIHVpbnQ4X3QgdGVtcFszMl07Ci0gICAgdWludDhfdCBpdlsyXVsxNl07Ci0gICAgaW50IGVyciA9IDA7Ci0KLSAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgIGF2X2Flc19pbml0KCZiLCBya2V5W2ldLCAxMjgsIDEpOwotICAgICAgICBhdl9hZXNfY3J5cHQoJmIsIHRlbXAsIHJjdFtpXSwgMSwgTlVMTCwgMSk7Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7Ci0gICAgICAgICAgICBpZiAocnB0W2ldW2pdICE9IHRlbXBbal0pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyWCAlMDJYXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBqLCBycHRbaV1bal0sIHRlbXBbal0pOwotICAgICAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYXJnYyA+IDEgJiYgIXN0cmNtcChhcmd2WzFdLCAiLXQiKSkgewotICAgICAgICBBVkFFUyBhZSwgYWQ7Ci0gICAgICAgIEFWTEZHIHBybmc7Ci0KLSAgICAgICAgYXZfYWVzX2luaXQoJmFlLCAoY29uc3QgdWludDhfdCopIlBJPTMuMTQxNTkyNjU0Li4iLCAxMjgsIDApOwotICAgICAgICBhdl9hZXNfaW5pdCgmYWQsIChjb25zdCB1aW50OF90KikiUEk9My4xNDE1OTI2NTQuLiIsIDEyOCwgMSk7Ci0gICAgICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspIHsKLSAgICAgICAgICAgICAgICBwdFtqXSA9IGF2X2xmZ19nZXQoJnBybmcpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKLSAgICAgICAgICAgICAgICBpdlswXVtqXSA9IGl2WzFdW2pdID0gYXZfbGZnX2dldCgmcHJuZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU1RBUlRfVElNRVI7Ci0gICAgICAgICAgICAgICAgYXZfYWVzX2NyeXB0KCZhZSwgdGVtcCwgcHQsIDIsIGl2WzBdLCAwKTsKLSAgICAgICAgICAgICAgICBpZiAoIShpICYgKGkgLSAxKSkpCi0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlMDJYICUwMlggJTAyWCAlMDJYXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFswXSwgdGVtcFs1XSwgdGVtcFsxMF0sIHRlbXBbMTVdKTsKLSAgICAgICAgICAgICAgICBhdl9hZXNfY3J5cHQoJmFkLCB0ZW1wLCB0ZW1wLCAyLCBpdlsxXSwgMSk7Ci0gICAgICAgICAgICAgICAgYXZfYWVzX2NyeXB0KCZhZSwgdGVtcCwgcHQsIDIsIE5VTEwsIDApOwotICAgICAgICAgICAgICAgIGlmICghKGkgJiAoaSAtIDEpKSkKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiUwMlggJTAyWCAlMDJYICUwMlhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wWzBdLCB0ZW1wWzVdLCB0ZW1wWzEwXSwgdGVtcFsxNV0pOwotICAgICAgICAgICAgICAgIGF2X2Flc19jcnlwdCgmYWQsIHRlbXAsIHRlbXAsIDIsIE5VTEwsIDEpOwotICAgICAgICAgICAgICAgIFNUT1BfVElNRVIoImFlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDE2OyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocHRbal0gIT0gdGVtcFtqXSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJWQgJTAyWCAlMDJYXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgcHRbal0sIHRlbXBbal0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotLy8gTENPVl9FWENMX1NUT1AKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2Flc19jdHIuYyBiL2xpYmF2dXRpbC9hZXNfY3RyLmMKaW5kZXggZTljNTY4Zi4uMGMyZTg2NyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2Flc19jdHIuYworKysgYi9saWJhdnV0aWwvYWVzX2N0ci5jCkBAIC00NSw2ICs0NSwxMiBAQAogICAgIGEtPmJsb2NrX29mZnNldCA9IDA7CiB9CiAKK3ZvaWQgYXZfYWVzX2N0cl9zZXRfZnVsbF9pdihzdHJ1Y3QgQVZBRVNDVFIgKmEsIGNvbnN0IHVpbnQ4X3QqIGl2KQoreworICAgIG1lbWNweShhLT5jb3VudGVyLCBpdiwgc2l6ZW9mKGEtPmNvdW50ZXIpKTsKKyAgICBhLT5ibG9ja19vZmZzZXQgPSAwOworfQorCiBjb25zdCB1aW50OF90KiBhdl9hZXNfY3RyX2dldF9pdihzdHJ1Y3QgQVZBRVNDVFIgKmEpCiB7CiAgICAgcmV0dXJuIGEtPmNvdW50ZXI7CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYWVzX2N0ci5oIGIvbGliYXZ1dGlsL2Flc19jdHIuaAppbmRleCBmNTk2ZmE2Li5lNGFhZTEyIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvYWVzX2N0ci5oCisrKyBiL2xpYmF2dXRpbC9hZXNfY3RyLmgKQEAgLTY3LDExICs2NywxNiBAQAogdm9pZCBhdl9hZXNfY3RyX3NldF9yYW5kb21faXYoc3RydWN0IEFWQUVTQ1RSICphKTsKIAogLyoqCi0gKiBGb3JjZWZ1bGx5IGNoYW5nZSB0aGUgaXYKKyAqIEZvcmNlZnVsbHkgY2hhbmdlIHRoZSA4LWJ5dGUgaXYKICAqLwogdm9pZCBhdl9hZXNfY3RyX3NldF9pdihzdHJ1Y3QgQVZBRVNDVFIgKmEsIGNvbnN0IHVpbnQ4X3QqIGl2KTsKIAogLyoqCisgKiBGb3JjZWZ1bGx5IGNoYW5nZSB0aGUgImZ1bGwiIDE2LWJ5dGUgaXYsIGluY2x1ZGluZyB0aGUgY291bnRlcgorICovCit2b2lkIGF2X2Flc19jdHJfc2V0X2Z1bGxfaXYoc3RydWN0IEFWQUVTQ1RSICphLCBjb25zdCB1aW50OF90KiBpdik7CisKKy8qKgogICogSW5jcmVtZW50IHRoZSB0b3AgNjQgYml0IG9mIHRoZSBpdiAocGVyZm9ybWVkIGFmdGVyIGVhY2ggZnJhbWUpCiAgKi8KIHZvaWQgYXZfYWVzX2N0cl9pbmNyZW1lbnRfaXYoc3RydWN0IEFWQUVTQ1RSICphKTsKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9hcm0vYXNtLlMgYi9saWJhdnV0aWwvYXJtL2FzbS5TCmluZGV4IGU5YjBiY2EuLjY3NDRmMmEgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9hcm0vYXNtLlMKKysrIGIvbGliYXZ1dGlsL2FybS9hc20uUwpAQCAtNDAsNiArNDAsMTMgQEAKICMgICBkZWZpbmUgRlVOQyBACiAjZW5kaWYKIAorI2lmIEhBVkVfQVNfRlBVX0RJUkVDVElWRQorIyAgIGRlZmluZSBGUFUKKyNlbHNlCisjICAgZGVmaW5lIEZQVSBACisjZW5kaWYKKworI2lmIEhBVkVfQVNfQVJDSF9ESVJFQ1RJVkUKICNpZiAgIEhBVkVfTkVPTgogICAgICAgICAuYXJjaCAgICAgICAgICAgYXJtdjctYQogI2VsaWYgSEFWRV9BUk1WNlQyCkBAIC00OSwxNiArNTYsMTcgQEAKICNlbGlmIEhBVkVfQVJNVjVURQogICAgICAgICAuYXJjaCAgICAgICAgICAgYXJtdjV0ZQogI2VuZGlmCisjZW5kaWYKICNpZiAgIEhBVkVfQVNfT0JKRUNUX0FSQ0gKIEVMRiAgICAgLm9iamVjdF9hcmNoICAgIGFybXY0CiAjZW5kaWYKIAogI2lmICAgSEFWRV9ORU9OCi0gICAgICAgIC5mcHUgICAgICAgICAgICBuZW9uCitGUFUgICAgIC5mcHUgICAgICAgICAgICBuZW9uCiBFTEYgICAgIC5lYWJpX2F0dHJpYnV0ZSAxMCwgMCAgICAgICAgICAgQCBzdXBwcmVzcyBUYWdfRlBfYXJjaAogRUxGICAgICAuZWFiaV9hdHRyaWJ1dGUgMTIsIDAgICAgICAgICAgIEAgc3VwcHJlc3MgVGFnX0FkdmFuY2VkX1NJTURfYXJjaAogI2VsaWYgSEFWRV9WRlAKLSAgICAgICAgLmZwdSAgICAgICAgICAgIHZmcAorRlBVICAgICAuZnB1ICAgICAgICAgICAgdmZwCiBFTEYgICAgIC5lYWJpX2F0dHJpYnV0ZSAxMCwgMCAgICAgICAgICAgQCBzdXBwcmVzcyBUYWdfRlBfYXJjaAogI2VuZGlmCiAKQEAgLTc3LDYgKzg1LDkgQEAKICAgICAgICAgcHV0X3BpYyAgICAgICAgICUoLkxwaWNfaWR4IC0gMSkKICAgICAgICAgLm5vYWx0bWFjcm8KICAgICAgIC5lbmRpZgorICAgICAgLmlmIC5McGljX2dwCisgICAgICAgIC51bnJlcSAgICAgICAgICBncAorICAgICAgLmVuZGlmCiBFTEYgICAgIC5zaXplICAgXG5hbWUsIC4gLSBcbmFtZQogRlVOQyAgICAuZW5kZnVuYwogICAgICAgICAucHVyZ2VtIGVuZGZ1bmMKQEAgLTEwMCwxMSArMTExLDE3IEBACiBFTEYgICAgIC5zaXplICAgXG5hbWUsIC4gLSBcbmFtZQogICAgICAgICAucHVyZ2VtIGVuZGNvbnN0CiAgICAgLmVuZG0KLS5pZiBIQVZFX1NFQ1RJT05fREFUQV9SRUxfUk8gJiYgXHJlbG9jYXRlCisjaWYgSEFWRV9TRUNUSU9OX0RBVEFfUkVMX1JPCisuaWYgXHJlbG9jYXRlCiAgICAgICAgIC5zZWN0aW9uICAgICAgICAuZGF0YS5yZWwucm8KIC5lbHNlCiAgICAgICAgIC5zZWN0aW9uICAgICAgICAucm9kYXRhCiAuZW5kaWYKKyNlbGlmICFkZWZpbmVkKF9fTUFDSF9fKQorICAgICAgICAuc2VjdGlvbiAgICAgICAgLnJvZGF0YQorI2Vsc2UKKyAgICAgICAgLmNvbnN0X2RhdGEKKyNlbmRpZgogICAgICAgICAuYWxpZ24gICAgICAgICAgXGFsaWduCiBcbmFtZToKIC5lbmRtCkBAIC0xNzUsNiArMTkyLDE1IEBACiAuZW5kbQogCiAubWFjcm8gIG1vdnJlbHggICAgICAgICByZCwgIHZhbCwgZ3AKKyAgICAuaWZjIFxyZCxcZ3AKKyAgICAgICAgLmVycm9yICAgICAgIm1vdnJlbHggbmVlZHMgdHdvIGRpc3RpbmN0IHJlZ2lzdGVycyIKKyAgICAuZW5kaWYKKyAgICAuaWZjIFxyZFwoKV9cZ3AscjEyXworICAgICAgICAud2FybmluZyAgICAibW92cmVseCByZD1ccmQgd2l0aG91dCBleHBsaWNpdCBzZXQgZ3AiCisgICAgLmVuZGlmCisgICAgLmlmYyBccmRcKClfXGdwLGlwXworICAgICAgICAud2FybmluZyAgICAibW92cmVseCByZD1ccmQgd2l0aG91dCBleHBsaWNpdCBzZXQgZ3AiCisgICAgLmVuZGlmCiAjaWYgQ09ORklHX1BJQyAmJiBkZWZpbmVkKF9fRUxGX18pCiAgICAgLmlmbmIgXGdwCiAgICAgICAuaWYgLkxwaWNfZ3AKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9hcm0vY3B1LmMgYi9saWJhdnV0aWwvYXJtL2NwdS5jCmluZGV4IDM4ODllZjAuLjgxZTg1ZTIgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9hcm0vY3B1LmMKKysrIGIvbGliYXZ1dGlsL2FybS9jcHUuYwpAQCAtMTU4LDMgKzE1OCwxMyBAQAogfQogCiAjZW5kaWYKKworc2l6ZV90IGZmX2dldF9jcHVfbWF4X2FsaWduX2FybSh2b2lkKQoreworICAgIGludCBmbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChmbGFncyAmIEFWX0NQVV9GTEFHX05FT04pCisgICAgICAgIHJldHVybiAxNjsKKworICAgIHJldHVybiA4OworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2FybS9jcHUuaCBiL2xpYmF2dXRpbC9hcm0vY3B1LmgKaW5kZXggZWI2NGVkNS4uMWQ2Y2M2NSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2FybS9jcHUuaAorKysgYi9saWJhdnV0aWwvYXJtL2NwdS5oCkBAIC0xOSw3ICsxOSw2IEBACiAjaWZuZGVmIEFWVVRJTF9BUk1fQ1BVX0gKICNkZWZpbmUgQVZVVElMX0FSTV9DUFVfSAogCi0jaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHVfaW50ZXJuYWwuaCIKIApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2FybS9mbG9hdF9kc3BfaW5pdF92ZnAuYyBiL2xpYmF2dXRpbC9hcm0vZmxvYXRfZHNwX2luaXRfdmZwLmMKaW5kZXggZTE1YWJmMy4uMDU4NzNlNyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2FybS9mbG9hdF9kc3BfaW5pdF92ZnAuYworKysgYi9saWJhdnV0aWwvYXJtL2Zsb2F0X2RzcF9pbml0X3ZmcC5jCkBAIC0zNiwxMSArMzYsMTEgQEAKIAogYXZfY29sZCB2b2lkIGZmX2Zsb2F0X2RzcF9pbml0X3ZmcChBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgaW50IGNwdV9mbGFncykKIHsKLSAgICBpZiAoIWhhdmVfdmZwdjMoY3B1X2ZsYWdzKSkgeworICAgIGlmIChoYXZlX3ZmcF92bShjcHVfZmxhZ3MpKSB7CiAgICAgICAgIGZkc3AtPnZlY3Rvcl9mbXVsID0gZmZfdmVjdG9yX2ZtdWxfdmZwOwogICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF93aW5kb3cgPSBmZl92ZWN0b3JfZm11bF93aW5kb3dfdmZwOwogICAgIH0KICAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlID0gZmZfdmVjdG9yX2ZtdWxfcmV2ZXJzZV92ZnA7Ci0gICAgaWYgKCFoYXZlX3ZmcHYzKGNwdV9mbGFncykpCisgICAgaWYgKGhhdmVfdmZwX3ZtKGNwdV9mbGFncykpCiAgICAgICAgIGZkc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0ID0gZmZfYnV0dGVyZmxpZXNfZmxvYXRfdmZwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2FybS9pbnRtYXRoLmggYi9saWJhdnV0aWwvYXJtL2ludG1hdGguaAppbmRleCA2NWU0MmM1Li41MzExYTdkIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvYXJtL2ludG1hdGguaAorKysgYi9saWJhdnV0aWwvYXJtL2ludG1hdGguaApAQCAtOTQsNiArOTQsMjIgQEAKICAgICByZXR1cm4gcjsKIH0KIAorI2RlZmluZSBhdl9zYXRfc3ViMzIgYXZfc2F0X3N1YjMyX2FybQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGF2X3NhdF9zdWIzMl9hcm0oaW50IGEsIGludCBiKQoreworICAgIGludCByOworICAgIF9fYXNtX18gKCJxc3ViICUwLCAlMSwgJTIiIDogIj1yIihyKSA6ICJyIihhKSwgInIiKGIpKTsKKyAgICByZXR1cm4gcjsKK30KKworI2RlZmluZSBhdl9zYXRfZHN1YjMyIGF2X3NhdF9kc3ViMzJfYXJtCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgYXZfc2F0X2RzdWIzMl9hcm0oaW50IGEsIGludCBiKQoreworICAgIGludCByOworICAgIF9fYXNtX18gKCJxZHN1YiAlMCwgJTEsICUyIiA6ICI9ciIocikgOiAiciIoYSksICJyIihiKSk7CisgICAgcmV0dXJuIHI7Cit9CisKICNlbmRpZiAvKiBIQVZFX0FSTVY2X0lOTElORSAqLwogCiAjaWYgSEFWRV9BU01fTU9EX1EKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9hdG9taWMuYyBiL2xpYmF2dXRpbC9hdG9taWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEzNzI1ZC4uMDAwMDAwMAotLS0gYS9saWJhdnV0aWwvYXRvbWljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJhdG9taWMuaCIKLQotI2lmICFIQVZFX0FUT01JQ1NfTkFUSVZFCi0KLSNpZiBIQVZFX1BUSFJFQURTCi0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgYXRvbWljX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOwotCi1pbnQgYXZwcml2X2F0b21pY19pbnRfZ2V0KHZvbGF0aWxlIGludCAqcHRyKQotewotICAgIGludCByZXM7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0b21pY19sb2NrKTsKLSAgICByZXMgPSAqcHRyOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhdG9taWNfbG9jayk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi12b2lkIGF2cHJpdl9hdG9taWNfaW50X3NldCh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbCkKLXsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0b21pY19sb2NrKTsKLSAgICAqcHRyID0gdmFsOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhdG9taWNfbG9jayk7Ci19Ci0KLWludCBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKHZvbGF0aWxlIGludCAqcHRyLCBpbnQgaW5jKQotewotICAgIGludCByZXM7Ci0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0b21pY19sb2NrKTsKLSAgICAqcHRyICs9IGluYzsKLSAgICByZXMgPSAqcHRyOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhdG9taWNfbG9jayk7Ci0KLSAgICByZXR1cm4gcmVzOwotfQotCi12b2lkICphdnByaXZfYXRvbWljX3B0cl9jYXModm9pZCAqIHZvbGF0aWxlICpwdHIsIHZvaWQgKm9sZHZhbCwgdm9pZCAqbmV3dmFsKQotewotICAgIHZvaWQgKnJldDsKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0b21pY19sb2NrKTsKLSAgICByZXQgPSAqcHRyOwotICAgIGlmIChyZXQgPT0gb2xkdmFsKQotICAgICAgICAqcHRyID0gbmV3dmFsOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhdG9taWNfbG9jayk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotI2VsaWYgIUhBVkVfVEhSRUFEUwotCi1pbnQgYXZwcml2X2F0b21pY19pbnRfZ2V0KHZvbGF0aWxlIGludCAqcHRyKQotewotICAgIHJldHVybiAqcHRyOwotfQotCi12b2lkIGF2cHJpdl9hdG9taWNfaW50X3NldCh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbCkKLXsKLSAgICAqcHRyID0gdmFsOwotfQotCi1pbnQgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IGluYykKLXsKLSAgICAqcHRyICs9IGluYzsKLSAgICByZXR1cm4gKnB0cjsKLX0KLQotdm9pZCAqYXZwcml2X2F0b21pY19wdHJfY2FzKHZvaWQgKiB2b2xhdGlsZSAqcHRyLCB2b2lkICpvbGR2YWwsIHZvaWQgKm5ld3ZhbCkKLXsKLSAgICBpZiAoKnB0ciA9PSBvbGR2YWwpIHsKLSAgICAgICAgKnB0ciA9IG5ld3ZhbDsKLSAgICAgICAgcmV0dXJuIG9sZHZhbDsKLSAgICB9Ci0gICAgcmV0dXJuICpwdHI7Ci19Ci0KLSNlbHNlIC8qIEhBVkVfVEhSRUFEUyAqLwotCi0vKiBUaGlzIHNob3VsZCBuZXZlciB0cmlnZ2VyLCB1bmxlc3MgYSBuZXcgdGhyZWFkaW5nIGltcGxlbWVudGF0aW9uCi0gKiB3aXRob3V0IGNvcnJlY3QgYXRvbWljcyBkZXBlbmRlbmNpZXMgaW4gY29uZmlndXJlIG9yIGEgY29ycmVzcG9uZGluZwotICogYXRvbWljcyBpbXBsZW1lbnRhdGlvbiBpcyBhZGRlZC4gKi8KLSNlcnJvciAiVGhyZWFkaW5nIGlzIGVuYWJsZWQsIGJ1dCB0aGVyZSBpcyBubyBpbXBsZW1lbnRhdGlvbiBvZiBhdG9taWMgb3BlcmF0aW9ucyBhdmFpbGFibGUiCi0KLSNlbmRpZiAvKiBIQVZFX1BUSFJFQURTICovCi0KLSNlbmRpZiAvKiAhSEFWRV9BVE9NSUNTX05BVElWRSAqLwotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGUgImF2YXNzZXJ0LmgiCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgdm9sYXRpbGUgaW50IHZhbCA9IDE7Ci0gICAgaW50IHJlczsKLQotICAgIHJlcyA9IGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJnZhbCwgMSk7Ci0gICAgYXZfYXNzZXJ0MChyZXMgPT0gMik7Ci0gICAgYXZwcml2X2F0b21pY19pbnRfc2V0KCZ2YWwsIDMpOwotICAgIHJlcyA9IGF2cHJpdl9hdG9taWNfaW50X2dldCgmdmFsKTsKLSAgICBhdl9hc3NlcnQwKHJlcyA9PSAzKTsKLQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXRvbWljLmggYi9saWJhdnV0aWwvYXRvbWljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1OTA2ZDIuLjAwMDAwMDAKLS0tIGEvbGliYXZ1dGlsL2F0b21pYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZVVElMX0FUT01JQ19ICi0jZGVmaW5lIEFWVVRJTF9BVE9NSUNfSAotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KLSNpZiBIQVZFX0FUT01JQ1NfTkFUSVZFCi0KLSNpZiBIQVZFX0FUT01JQ1NfR0NDCi0jaW5jbHVkZSAiYXRvbWljX2djYy5oIgotI2VsaWYgSEFWRV9BVE9NSUNTX1dJTjMyCi0jaW5jbHVkZSAiYXRvbWljX3dpbjMyLmgiCi0jZWxpZiBIQVZFX0FUT01JQ1NfU1VOQ0MKLSNpbmNsdWRlICJhdG9taWNfc3VuY2MuaCIKLSNlbmRpZgotCi0jZWxzZQotCi0vKioKLSAqIExvYWQgdGhlIGN1cnJlbnQgdmFsdWUgc3RvcmVkIGluIGFuIGF0b21pYyBpbnRlZ2VyLgotICoKLSAqIEBwYXJhbSBwdHIgYXRvbWljIGludGVnZXIKLSAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGF0b21pYyBpbnRlZ2VyCi0gKiBAbm90ZSBUaGlzIGFjdHMgYXMgYSBtZW1vcnkgYmFycmllci4KLSAqLwotaW50IGF2cHJpdl9hdG9taWNfaW50X2dldCh2b2xhdGlsZSBpbnQgKnB0cik7Ci0KLS8qKgotICogU3RvcmUgYSBuZXcgdmFsdWUgaW4gYW4gYXRvbWljIGludGVnZXIuCi0gKgotICogQHBhcmFtIHB0ciBhdG9taWMgaW50ZWdlcgotICogQHBhcmFtIHZhbCB0aGUgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIGF0b21pYyBpbnRlZ2VyCi0gKiBAbm90ZSBUaGlzIGFjdHMgYXMgYSBtZW1vcnkgYmFycmllci4KLSAqLwotdm9pZCBhdnByaXZfYXRvbWljX2ludF9zZXQodm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWwpOwotCi0vKioKLSAqIEFkZCBhIHZhbHVlIHRvIGFuIGF0b21pYyBpbnRlZ2VyLgotICoKLSAqIEBwYXJhbSBwdHIgYXRvbWljIGludGVnZXIKLSAqIEBwYXJhbSBpbmMgdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgYXRvbWljIGludGVnZXIgKG1heSBiZSBuZWdhdGl2ZSkKLSAqIEByZXR1cm4gdGhlIG5ldyB2YWx1ZSBvZiB0aGUgYXRvbWljIGludGVnZXIuCi0gKiBAbm90ZSBUaGlzIGRvZXMgTk9UIGFjdCBhcyBhIG1lbW9yeSBiYXJyaWVyLiBUaGlzIGlzIHByaW1hcmlseQotICogICAgICAgaW50ZW5kZWQgZm9yIHJlZmVyZW5jZSBjb3VudGluZy4KLSAqLwotaW50IGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2godm9sYXRpbGUgaW50ICpwdHIsIGludCBpbmMpOwotCi0vKioKLSAqIEF0b21pYyBwb2ludGVyIGNvbXBhcmUgYW5kIHN3YXAuCi0gKgotICogQHBhcmFtIHB0ciBwb2ludGVyIHRvIHRoZSBwb2ludGVyIHRvIG9wZXJhdGUgb24KLSAqIEBwYXJhbSBvbGR2YWwgZG8gdGhlIHN3YXAgaWYgdGhlIGN1cnJlbnQgdmFsdWUgb2YgKnB0ciBlcXVhbHMgdG8gb2xkdmFsCi0gKiBAcGFyYW0gbmV3dmFsIHZhbHVlIHRvIHJlcGxhY2UgKnB0ciB3aXRoCi0gKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiAqcHRyIGJlZm9yZSBjb21wYXJpc29uCi0gKi8KLXZvaWQgKmF2cHJpdl9hdG9taWNfcHRyX2Nhcyh2b2lkICogdm9sYXRpbGUgKnB0ciwgdm9pZCAqb2xkdmFsLCB2b2lkICpuZXd2YWwpOwotCi0jZW5kaWYgLyogSEFWRV9BVE9NSUNTX05BVElWRSAqLwotCi0jZW5kaWYgLyogQVZVVElMX0FUT01JQ19IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXRvbWljX2djYy5oIGIvbGliYXZ1dGlsL2F0b21pY19nY2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5ZmM0OS4uMDAwMDAwMAotLS0gYS9saWJhdnV0aWwvYXRvbWljX2djYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZVVElMX0FUT01JQ19HQ0NfSAotI2RlZmluZSBBVlVUSUxfQVRPTUlDX0dDQ19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgImF0b21pYy5oIgotCi0jZGVmaW5lIGF2cHJpdl9hdG9taWNfaW50X2dldCBhdG9taWNfaW50X2dldF9nY2MKLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19pbnRfZ2V0X2djYyh2b2xhdGlsZSBpbnQgKnB0cikKLXsKLSNpZiBIQVZFX0FUT01JQ19DT01QQVJFX0VYQ0hBTkdFCi0gICAgcmV0dXJuIF9fYXRvbWljX2xvYWRfbihwdHIsIF9fQVRPTUlDX1NFUV9DU1QpOwotI2Vsc2UKLSAgICBfX3N5bmNfc3luY2hyb25pemUoKTsKLSAgICByZXR1cm4gKnB0cjsKLSNlbmRpZgotfQotCi0jZGVmaW5lIGF2cHJpdl9hdG9taWNfaW50X3NldCBhdG9taWNfaW50X3NldF9nY2MKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfaW50X3NldF9nY2Modm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWwpCi17Ci0jaWYgSEFWRV9BVE9NSUNfQ09NUEFSRV9FWENIQU5HRQotICAgIF9fYXRvbWljX3N0b3JlX24ocHRyLCB2YWwsIF9fQVRPTUlDX1NFUV9DU1QpOwotI2Vsc2UKLSAgICAqcHRyID0gdmFsOwotICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCBhdG9taWNfaW50X2FkZF9hbmRfZmV0Y2hfZ2NjCi1zdGF0aWMgaW5saW5lIGludCBhdG9taWNfaW50X2FkZF9hbmRfZmV0Y2hfZ2NjKHZvbGF0aWxlIGludCAqcHRyLCBpbnQgaW5jKQotewotI2lmIEhBVkVfQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0UKLSAgICByZXR1cm4gX19hdG9taWNfYWRkX2ZldGNoKHB0ciwgaW5jLCBfX0FUT01JQ19TRVFfQ1NUKTsKLSNlbHNlCi0gICAgcmV0dXJuIF9fc3luY19hZGRfYW5kX2ZldGNoKHB0ciwgaW5jKTsKLSNlbmRpZgotfQotCi0jZGVmaW5lIGF2cHJpdl9hdG9taWNfcHRyX2NhcyBhdG9taWNfcHRyX2Nhc19nY2MKLXN0YXRpYyBpbmxpbmUgdm9pZCAqYXRvbWljX3B0cl9jYXNfZ2NjKHZvaWQgKiB2b2xhdGlsZSAqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb2xkdmFsLCB2b2lkICpuZXd2YWwpCi17Ci0jaWYgSEFWRV9TWU5DX1ZBTF9DT01QQVJFX0FORF9TV0FQCi0jaWZkZWYgX19BUk1DQ19WRVJTSU9OCi0gICAgLy8gYXJtY2Mgd2lsbCB0aHJvdyBhbiBlcnJvciBpZiBwdHIgaXMgbm90IGFuIGludGVnZXIgdHlwZQotICAgIHZvbGF0aWxlIHVpbnRwdHJfdCAqdG1wID0gKHZvbGF0aWxlIHVpbnRwdHJfdCopcHRyOwotICAgIHJldHVybiAodm9pZCopX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKHRtcCwgb2xkdmFsLCBuZXd2YWwpOwotI2Vsc2UKLSAgICByZXR1cm4gX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwKHB0ciwgb2xkdmFsLCBuZXd2YWwpOwotI2VuZGlmCi0jZWxzZQotICAgIF9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfbihwdHIsICZvbGR2YWwsIG5ld3ZhbCwgMCwgX19BVE9NSUNfU0VRX0NTVCwgX19BVE9NSUNfU0VRX0NTVCk7Ci0gICAgcmV0dXJuIG9sZHZhbDsKLSNlbmRpZgotfQotCi0jZW5kaWYgLyogQVZVVElMX0FUT01JQ19HQ0NfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2F0b21pY19zdW5jYy5oIGIvbGliYXZ1dGlsL2F0b21pY19zdW5jYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2FkMjRhLi4wMDAwMDAwCi0tLSBhL2xpYmF2dXRpbC9hdG9taWNfc3VuY2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZVVElMX0FUT01JQ19TVU5DQ19ICi0jZGVmaW5lIEFWVVRJTF9BVE9NSUNfU1VOQ0NfSAotCi0jaW5jbHVkZSA8YXRvbWljLmg+Ci0jaW5jbHVkZSA8bWJhcnJpZXIuaD4KLQotI2luY2x1ZGUgImF0b21pYy5oIgotCi0jZGVmaW5lIGF2cHJpdl9hdG9taWNfaW50X2dldCBhdG9taWNfaW50X2dldF9zdW5jYwotc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2ludF9nZXRfc3VuY2Modm9sYXRpbGUgaW50ICpwdHIpCi17Ci0gICAgX19tYWNoaW5lX3J3X2JhcnJpZXIoKTsKLSAgICByZXR1cm4gKnB0cjsKLX0KLQotI2RlZmluZSBhdnByaXZfYXRvbWljX2ludF9zZXQgYXRvbWljX2ludF9zZXRfc3VuY2MKLXN0YXRpYyBpbmxpbmUgdm9pZCBhdG9taWNfaW50X3NldF9zdW5jYyh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IHZhbCkKLXsKLSAgICAqcHRyID0gdmFsOwotICAgIF9fbWFjaGluZV9yd19iYXJyaWVyKCk7Ci19Ci0KLSNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCBhdG9taWNfaW50X2FkZF9hbmRfZmV0Y2hfc3VuY2MKLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19pbnRfYWRkX2FuZF9mZXRjaF9zdW5jYyh2b2xhdGlsZSBpbnQgKnB0ciwgaW50IGluYykKLXsKLSAgICByZXR1cm4gYXRvbWljX2FkZF9pbnRfbnYocHRyLCBpbmMpOwotfQotCi0jZGVmaW5lIGF2cHJpdl9hdG9taWNfcHRyX2NhcyBhdG9taWNfcHRyX2Nhc19zdW5jYwotc3RhdGljIGlubGluZSB2b2lkICphdG9taWNfcHRyX2Nhc19zdW5jYyh2b2lkICogdm9sYXRpbGUgKnB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqb2xkdmFsLCB2b2lkICpuZXd2YWwpCi17Ci0gICAgcmV0dXJuIGF0b21pY19jYXNfcHRyKHB0ciwgb2xkdmFsLCBuZXd2YWwpOwotfQotCi0jZW5kaWYgLyogQVZVVElMX0FUT01JQ19TVU5DQ19IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXRvbWljX3dpbjMyLmggYi9saWJhdnV0aWwvYXRvbWljX3dpbjMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3Mjk5MzMuLjAwMDAwMDAKLS0tIGEvbGliYXZ1dGlsL2F0b21pY193aW4zMi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpZm5kZWYgQVZVVElMX0FUT01JQ19XSU4zMl9ICi0jZGVmaW5lIEFWVVRJTF9BVE9NSUNfV0lOMzJfSAotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0KLSNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfZ2V0IGF0b21pY19pbnRfZ2V0X3dpbjMyCi1zdGF0aWMgaW5saW5lIGludCBhdG9taWNfaW50X2dldF93aW4zMih2b2xhdGlsZSBpbnQgKnB0cikKLXsKLSAgICBNZW1vcnlCYXJyaWVyKCk7Ci0gICAgcmV0dXJuICpwdHI7Ci19Ci0KLSNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfc2V0IGF0b21pY19pbnRfc2V0X3dpbjMyCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljX2ludF9zZXRfd2luMzIodm9sYXRpbGUgaW50ICpwdHIsIGludCB2YWwpCi17Ci0gICAgKnB0ciA9IHZhbDsKLSAgICBNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLSNkZWZpbmUgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCBhdG9taWNfaW50X2FkZF9hbmRfZmV0Y2hfd2luMzIKLXN0YXRpYyBpbmxpbmUgaW50IGF0b21pY19pbnRfYWRkX2FuZF9mZXRjaF93aW4zMih2b2xhdGlsZSBpbnQgKnB0ciwgaW50IGluYykKLXsKLSAgICByZXR1cm4gaW5jICsgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZChwdHIsIGluYyk7Ci19Ci0KLSNkZWZpbmUgYXZwcml2X2F0b21pY19wdHJfY2FzIGF0b21pY19wdHJfY2FzX3dpbjMyCi1zdGF0aWMgaW5saW5lIHZvaWQgKmF0b21pY19wdHJfY2FzX3dpbjMyKHZvaWQgKiB2b2xhdGlsZSAqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvbGR2YWwsIHZvaWQgKm5ld3ZhbCkKLXsKLSAgICByZXR1cm4gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKHB0ciwgbmV3dmFsLCBvbGR2YWwpOwotfQotCi0jZW5kaWYgLyogQVZVVElMX0FUT01JQ19XSU4zMl9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXR0cmlidXRlcy5oIGIvbGliYXZ1dGlsL2F0dHJpYnV0ZXMuaAppbmRleCA1YzZiOWRlLi5jZWQxMDhhIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvYXR0cmlidXRlcy5oCisrKyBiL2xpYmF2dXRpbC9hdHRyaWJ1dGVzLmgKQEAgLTY2LDE5ICs2NiwxOSBAQAogIyAgICBkZWZpbmUgYXZfbm9pbmxpbmUKICNlbmRpZgogCi0jaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoMywxKQorI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMSkgfHwgZGVmaW5lZChfX2NsYW5nX18pCiAjICAgIGRlZmluZSBhdl9wdXJlIF9fYXR0cmlidXRlX18oKHB1cmUpKQogI2Vsc2UKICMgICAgZGVmaW5lIGF2X3B1cmUKICNlbmRpZgogCi0jaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoMiw2KQorI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDIsNikgfHwgZGVmaW5lZChfX2NsYW5nX18pCiAjICAgIGRlZmluZSBhdl9jb25zdCBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCiAjZWxzZQogIyAgICBkZWZpbmUgYXZfY29uc3QKICNlbmRpZgogCi0jaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoNCwzKQorI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDQsMykgfHwgZGVmaW5lZChfX2NsYW5nX18pCiAjICAgIGRlZmluZSBhdl9jb2xkIF9fYXR0cmlidXRlX18oKGNvbGQpKQogI2Vsc2UKICMgICAgZGVmaW5lIGF2X2NvbGQKQEAgLTEyMSw4ICsxMjEsNyBAQAogI2VuZGlmCiAjZW5kaWYKIAotCi0jaWYgZGVmaW5lZChfX0dOVUNfXykKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKICMgICAgZGVmaW5lIGF2X3VudXNlZCBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQogI2Vsc2UKICMgICAgZGVmaW5lIGF2X3VudXNlZApAQCAtMTMzLDI1ICsxMzIsMjUgQEAKICAqIGF3YXkuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdmFyaWFibGVzIGFjY2Vzc2VkIG9ubHkgZnJvbSBpbmxpbmUKICAqIGFzc2VtYmxlciB3aXRob3V0IHRoZSBjb21waWxlciBiZWluZyBhd2FyZS4KICAqLwotI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMSkKKyNpZiBBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCgzLDEpIHx8IGRlZmluZWQoX19jbGFuZ19fKQogIyAgICBkZWZpbmUgYXZfdXNlZCBfX2F0dHJpYnV0ZV9fKCh1c2VkKSkKICNlbHNlCiAjICAgIGRlZmluZSBhdl91c2VkCiAjZW5kaWYKIAotI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMykKKyNpZiBBVl9HQ0NfVkVSU0lPTl9BVF9MRUFTVCgzLDMpIHx8IGRlZmluZWQoX19jbGFuZ19fKQogIyAgIGRlZmluZSBhdl9hbGlhcyBfX2F0dHJpYnV0ZV9fKChtYXlfYWxpYXMpKQogI2Vsc2UKICMgICBkZWZpbmUgYXZfYWxpYXMKICNlbmRpZgogCi0jaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgJiYgIWRlZmluZWQoX19jbGFuZ19fKQorI2lmIChkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykpICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCiAjICAgIGRlZmluZSBhdl91bmluaXQoeCkgeD14CiAjZWxzZQogIyAgICBkZWZpbmUgYXZfdW5pbml0KHgpIHgKICNlbmRpZgogCi0jaWZkZWYgX19HTlVDX18KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKICMgICAgZGVmaW5lIGF2X2J1aWx0aW5fY29uc3RhbnRfcCBfX2J1aWx0aW5fY29uc3RhbnRfcAogIyAgICBkZWZpbmUgYXZfcHJpbnRmX2Zvcm1hdChmbXRwb3MsIGF0dHJwb3MpIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXywgZm10cG9zLCBhdHRycG9zKSkpCiAjZWxzZQpAQCAtMTU5LDcgKzE1OCw3IEBACiAjICAgIGRlZmluZSBhdl9wcmludGZfZm9ybWF0KGZtdHBvcywgYXR0cnBvcykKICNlbmRpZgogCi0jaWYgQVZfR0NDX1ZFUlNJT05fQVRfTEVBU1QoMiw1KQorI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDIsNSkgfHwgZGVmaW5lZChfX2NsYW5nX18pCiAjICAgIGRlZmluZSBhdl9ub3JldHVybiBfX2F0dHJpYnV0ZV9fKChub3JldHVybikpCiAjZWxzZQogIyAgICBkZWZpbmUgYXZfbm9yZXR1cm4KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9hdWRpb19maWZvLmMgYi9saWJhdnV0aWwvYXVkaW9fZmlmby5jCmluZGV4IGQ1Mjk4Y2MuLjFiZjc1Y2UgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9hdWRpb19maWZvLmMKKysrIGIvbGliYXZ1dGlsL2F1ZGlvX2ZpZm8uYwpAQCAtNDgsOCArNDgsNyBAQAogICAgICAgICBpZiAoYWYtPmJ1ZikgewogICAgICAgICAgICAgaW50IGk7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWYtPm5iX2J1ZmZlcnM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChhZi0+YnVmW2ldKQotICAgICAgICAgICAgICAgICAgICBhdl9maWZvX2ZyZWUoYWYtPmJ1ZltpXSk7CisgICAgICAgICAgICAgICAgYXZfZmlmb19mcmVlcCgmYWYtPmJ1ZltpXSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdl9mcmVlcCgmYWYtPmJ1Zik7CiAgICAgICAgIH0KQEAgLTE1NSwxMCArMTU0LDM0IEBACiAgICAgcmV0dXJuIG5iX3NhbXBsZXM7CiB9CiAKLWludCBhdl9hdWRpb19maWZvX3JlYWQoQVZBdWRpb0ZpZm8gKmFmLCB2b2lkICoqZGF0YSwgaW50IG5iX3NhbXBsZXMpCitpbnQgYXZfYXVkaW9fZmlmb19wZWVrX2F0KEFWQXVkaW9GaWZvICphZiwgdm9pZCAqKmRhdGEsIGludCBuYl9zYW1wbGVzLCBpbnQgb2Zmc2V0KQogewogICAgIGludCBpLCByZXQsIHNpemU7CiAKKyAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gYWYtPm5iX3NhbXBsZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKG5iX3NhbXBsZXMgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIG5iX3NhbXBsZXMgPSBGRk1JTihuYl9zYW1wbGVzLCBhZi0+bmJfc2FtcGxlcyk7CisgICAgaWYgKCFuYl9zYW1wbGVzKQorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAob2Zmc2V0ID4gYWYtPm5iX3NhbXBsZXMgLSBuYl9zYW1wbGVzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgb2Zmc2V0ICo9IGFmLT5zYW1wbGVfc2l6ZTsKKyAgICBzaXplID0gbmJfc2FtcGxlcyAqIGFmLT5zYW1wbGVfc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWYtPm5iX2J1ZmZlcnM7IGkrKykgeworICAgICAgICBpZiAoKHJldCA9IGF2X2ZpZm9fZ2VuZXJpY19wZWVrX2F0KGFmLT5idWZbaV0sIGRhdGFbaV0sIG9mZnNldCwgc2l6ZSwgTlVMTCkpIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0JVRzsKKyAgICB9CisKKyAgICByZXR1cm4gbmJfc2FtcGxlczsKK30KKworaW50IGF2X2F1ZGlvX2ZpZm9fcmVhZChBVkF1ZGlvRmlmbyAqYWYsIHZvaWQgKipkYXRhLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgc2l6ZTsKKwogICAgIGlmIChuYl9zYW1wbGVzIDwgMCkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICBuYl9zYW1wbGVzID0gRkZNSU4obmJfc2FtcGxlcywgYWYtPm5iX3NhbXBsZXMpOwpAQCAtMTY3LDcgKzE5MCw3IEBACiAKICAgICBzaXplID0gbmJfc2FtcGxlcyAqIGFmLT5zYW1wbGVfc2l6ZTsKICAgICBmb3IgKGkgPSAwOyBpIDwgYWYtPm5iX2J1ZmZlcnM7IGkrKykgewotICAgICAgICBpZiAoKHJldCA9IGF2X2ZpZm9fZ2VuZXJpY19yZWFkKGFmLT5idWZbaV0sIGRhdGFbaV0sIHNpemUsIE5VTEwpKSA8IDApCisgICAgICAgIGlmIChhdl9maWZvX2dlbmVyaWNfcmVhZChhZi0+YnVmW2ldLCBkYXRhW2ldLCBzaXplLCBOVUxMKSA8IDApCiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CiAgICAgfQogICAgIGFmLT5uYl9zYW1wbGVzIC09IG5iX3NhbXBsZXM7CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXVkaW9fZmlmby5oIGIvbGliYXZ1dGlsL2F1ZGlvX2ZpZm8uaAppbmRleCAyNGY5MWRhLi5kOGE5MTk0IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvYXVkaW9fZmlmby5oCisrKyBiL2xpYmF2dXRpbC9hdWRpb19maWZvLmgKQEAgLTExMSw2ICsxMTEsMjMgQEAKIGludCBhdl9hdWRpb19maWZvX3BlZWsoQVZBdWRpb0ZpZm8gKmFmLCB2b2lkICoqZGF0YSwgaW50IG5iX3NhbXBsZXMpOwogCiAvKioKKyAqIFBlZWsgZGF0YSBmcm9tIGFuIEFWQXVkaW9GaWZvLgorICoKKyAqIEBzZWUgZW51bSBBVlNhbXBsZUZvcm1hdAorICogVGhlIGRvY3VtZW50YXRpb24gZm9yIEFWU2FtcGxlRm9ybWF0IGRlc2NyaWJlcyB0aGUgZGF0YSBsYXlvdXQuCisgKgorICogQHBhcmFtIGFmICAgICAgICAgIEFWQXVkaW9GaWZvIHRvIHJlYWQgZnJvbQorICogQHBhcmFtIGRhdGEgICAgICAgIGF1ZGlvIGRhdGEgcGxhbmUgcG9pbnRlcnMKKyAqIEBwYXJhbSBuYl9zYW1wbGVzICBudW1iZXIgb2Ygc2FtcGxlcyB0byBwZWVrCisgKiBAcGFyYW0gb2Zmc2V0ICAgICAgb2Zmc2V0IGZyb20gY3VycmVudCByZWFkIHBvc2l0aW9uCisgKiBAcmV0dXJuICAgICAgICAgICAgbnVtYmVyIG9mIHNhbXBsZXMgYWN0dWFsbHkgcGVlaywgb3IgbmVnYXRpdmUgQVZFUlJPUiBjb2RlCisgKiAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhlIG51bWJlciBvZiBzYW1wbGVzIGFjdHVhbGx5IHBlZWsgd2lsbCBub3QKKyAqICAgICAgICAgICAgICAgICAgICBiZSBncmVhdGVyIHRoYW4gbmJfc2FtcGxlcywgYW5kIHdpbGwgb25seSBiZSBsZXNzIHRoYW4KKyAqICAgICAgICAgICAgICAgICAgICBuYl9zYW1wbGVzIGlmIGF2X2F1ZGlvX2ZpZm9fc2l6ZSBpcyBsZXNzIHRoYW4gbmJfc2FtcGxlcy4KKyAqLworaW50IGF2X2F1ZGlvX2ZpZm9fcGVla19hdChBVkF1ZGlvRmlmbyAqYWYsIHZvaWQgKipkYXRhLCBpbnQgbmJfc2FtcGxlcywgaW50IG9mZnNldCk7CisKKy8qKgogICogUmVhZCBkYXRhIGZyb20gYW4gQVZBdWRpb0ZpZm8uCiAgKgogICogQHNlZSBlbnVtIEFWU2FtcGxlRm9ybWF0CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXZhc3NlcnQuaCBiL2xpYmF2dXRpbC9hdmFzc2VydC5oCmluZGV4IDQxZjVlMGUuLjQ2ZjNmZWEgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9hdmFzc2VydC5oCisrKyBiL2xpYmF2dXRpbC9hdmFzc2VydC5oCkBAIC00NSw3ICs0NSw3IEBACiAKIC8qKgogICogYXNzZXJ0KCkgZXF1aXZhbGVudCwgdGhhdCBkb2VzIG5vdCBsaWUgaW4gc3BlZWQgY3JpdGljYWwgY29kZS4KLSAqIFRoZXNlIGFzc2VydHMoKSB0aHVzIGNhbiBiZSBlbmFibGVkIHdpdGhvdXQgZmVhcmluZyBzcGVlZGxvc3MuCisgKiBUaGVzZSBhc3NlcnRzKCkgdGh1cyBjYW4gYmUgZW5hYmxlZCB3aXRob3V0IGZlYXJpbmcgc3BlZWQgbG9zcy4KICAqLwogI2lmIGRlZmluZWQoQVNTRVJUX0xFVkVMKSAmJiBBU1NFUlRfTEVWRUwgPiAwCiAjZGVmaW5lIGF2X2Fzc2VydDEoY29uZCkgYXZfYXNzZXJ0MChjb25kKQpAQCAtNTksOCArNTksMTcgQEAKICAqLwogI2lmIGRlZmluZWQoQVNTRVJUX0xFVkVMKSAmJiBBU1NFUlRfTEVWRUwgPiAxCiAjZGVmaW5lIGF2X2Fzc2VydDIoY29uZCkgYXZfYXNzZXJ0MChjb25kKQorI2RlZmluZSBhdl9hc3NlcnQyX2ZwdSgpIGF2X2Fzc2VydDBfZnB1KCkKICNlbHNlCiAjZGVmaW5lIGF2X2Fzc2VydDIoY29uZCkgKCh2b2lkKTApCisjZGVmaW5lIGF2X2Fzc2VydDJfZnB1KCkgKCh2b2lkKTApCiAjZW5kaWYKIAorLyoqCisgKiBBc3NlcnQgdGhhdCBmbG9hdGluZyBwb2ludCBvcHBlcmF0aW9ucyBjYW4gYmUgZXhlY3V0ZWQuCisgKgorICogVGhpcyB3aWxsIGF2X2Fzc2VydDAoKSB0aGF0IHRoZSBjcHUgaXMgbm90IGluIE1NWCBzdGF0ZSBvbiBYODYKKyAqLwordm9pZCBhdl9hc3NlcnQwX2ZwdSh2b2lkKTsKKwogI2VuZGlmIC8qIEFWVVRJTF9BVkFTU0VSVF9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXZyMzIvaW50cmVhZHdyaXRlLmggYi9saWJhdnV0aWwvYXZyMzIvaW50cmVhZHdyaXRlLmgKaW5kZXggYzZmZDNhYS4uOTUxNzlmMSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2F2cjMyL2ludHJlYWR3cml0ZS5oCisrKyBiL2xpYmF2dXRpbC9hdnIzMi9pbnRyZWFkd3JpdGUuaApAQCAtMjcsNyArMjcsNyBAQAogCiAvKgogICogQVZSMzIgZG9lcyBub3Qgc3VwcG9ydCB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLCBleGNlcHQgZm9yIHRoZSBBUAotICogc2VyaWVzIHdoaWNoIHN1cHBwb3J0cyB1bmFsaWduZWQgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMuICAxNi1iaXQKKyAqIHNlcmllcyB3aGljaCBzdXBwb3J0cyB1bmFsaWduZWQgMzItYml0IGxvYWRzIGFuZCBzdG9yZXMuICAxNi1iaXQKICAqIGFuZCA2NC1iaXQgYWNjZXNzZXMgbXVzdCBiZSBhbGlnbmVkIHRvIDE2IGFuZCAzMiBiaXRzLCByZXNwZWN0aXZlbHkuCiAgKiBUaGlzIG1lYW5zIHdlIGNhbm5vdCB1c2UgdGhlIGJ5dGUtc3dhcHBpbmcgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMKICAqIGhlcmUuCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXZzdHJpbmcuYyBiL2xpYmF2dXRpbC9hdnN0cmluZy5jCmluZGV4IDg1ZmIzZTkuLmYwM2RkMjUgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9hdnN0cmluZy5jCisrKyBiL2xpYmF2dXRpbC9hdnN0cmluZy5jCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICByZXR1cm4gc3RyOwogfQogCi0jZGVmaW5lIFdISVRFU1BBQ0VTICIgXG5cdCIKKyNkZWZpbmUgV0hJVEVTUEFDRVMgIiBcblx0XHIiCiAKIGNoYXIgKmF2X2dldF90b2tlbihjb25zdCBjaGFyICoqYnVmLCBjb25zdCBjaGFyICp0ZXJtKQogewpAQCAtMjMxLDYgKzIzMSwyOSBAQAogICAgIHJldHVybiBjMSAtIGMyOwogfQogCitjaGFyICphdl9zdHJpcmVwbGFjZShjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZyb20sIGNvbnN0IGNoYXIgKnRvKQoreworICAgIGNoYXIgKnJldCA9IE5VTEw7CisgICAgY29uc3QgY2hhciAqcHN0cjIsICpwc3RyID0gc3RyOworICAgIHNpemVfdCB0b2xlbiA9IHN0cmxlbih0byksIGZyb21sZW4gPSBzdHJsZW4oZnJvbSk7CisgICAgQVZCUHJpbnQgcGJ1ZjsKKworICAgIGF2X2JwcmludF9pbml0KCZwYnVmLCAxLCBBVl9CUFJJTlRfU0laRV9VTkxJTUlURUQpOworICAgIHdoaWxlICgocHN0cjIgPSBhdl9zdHJpc3RyKHBzdHIsIGZyb20pKSkgeworICAgICAgICBhdl9icHJpbnRfYXBwZW5kX2RhdGEoJnBidWYsIHBzdHIsIHBzdHIyIC0gcHN0cik7CisgICAgICAgIHBzdHIgPSBwc3RyMiArIGZyb21sZW47CisgICAgICAgIGF2X2JwcmludF9hcHBlbmRfZGF0YSgmcGJ1ZiwgdG8sIHRvbGVuKTsKKyAgICB9CisgICAgYXZfYnByaW50X2FwcGVuZF9kYXRhKCZwYnVmLCBwc3RyLCBzdHJsZW4ocHN0cikpOworICAgIGlmICghYXZfYnByaW50X2lzX2NvbXBsZXRlKCZwYnVmKSkgeworICAgICAgICBhdl9icHJpbnRfZmluYWxpemUoJnBidWYsIE5VTEwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2JwcmludF9maW5hbGl6ZSgmcGJ1ZiwgJnJldCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwogY29uc3QgY2hhciAqYXZfYmFzZW5hbWUoY29uc3QgY2hhciAqcGF0aCkKIHsKICAgICBjaGFyICpwID0gc3RycmNocihwYXRoLCAnLycpOwpAQCAtNDM1LDY3ICs0NTgsMyBAQAogCiAgICAgcmV0dXJuIDA7CiB9Ci0KLSNpZmRlZiBURVNUCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgY2hhciAqZnVsbHBhdGg7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10gPSB7Ci0gICAgICAgICInJyIsCi0gICAgICAgICIiLAotICAgICAgICAiOiIsCi0gICAgICAgICJcXCIsCi0gICAgICAgICInIiwKLSAgICAgICAgIiAgICAnJyAgICA6IiwKLSAgICAgICAgIiAgICAnJyAgJycgIDoiLAotICAgICAgICAiZm9vICAgJycgOiIsCi0gICAgICAgICInZm9vJyIsCi0gICAgICAgICJmb28gICAgICIsCi0gICAgICAgICIgICcgIGZvbyAgJyAgIiwKLSAgICAgICAgImZvb1xcIiwKLSAgICAgICAgImZvbyc6ICBibGFoOmJsYWgiLAotICAgICAgICAiZm9vXFw6ICBibGFoOmJsYWgiLAotICAgICAgICAiZm9vXCciLAotICAgICAgICAiJ2ZvbyA6ICAnICA6YmxhaGJsYWgiLAotICAgICAgICAiXFwgOmJsYWgiLAotICAgICAgICAiICAgICBmb28iLAotICAgICAgICAiICAgICAgZm9vICAgICAgICIsCi0gICAgICAgICIgICAgICBmb28gICAgIFxcICIsCi0gICAgICAgICJmb28gJzpibGFoIiwKLSAgICAgICAgIiBmb28gICBiYXIgICAgOiAgIGJsYWhibGFoIiwKLSAgICAgICAgIlxcZlxcb1xcbyIsCi0gICAgICAgICInZm9vIDogXFwgXFwgICcgICA6IGJsYWhibGFoIiwKLSAgICAgICAgIidcXGZvXFxvOic6IGJsYWhibGFoIiwKLSAgICAgICAgIlxcJ2ZvXFxvXFw6JzogIGZvbyAgJyAgOmJsYWhibGFoIgotICAgIH07Ci0KLSAgICBwcmludGYoIlRlc3RpbmcgYXZfZ2V0X3Rva2VuKClcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzdHJpbmdzKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKnAgPSBzdHJpbmdzW2ldOwotICAgICAgICBjaGFyICpxOwotICAgICAgICBwcmludGYoInwlc3wiLCBwKTsKLSAgICAgICAgcSA9IGF2X2dldF90b2tlbigmcCwgIjoiKTsKLSAgICAgICAgcHJpbnRmKCIgLT4gfCVzfCIsIHEpOwotICAgICAgICBwcmludGYoIiArIHwlc3xcbiIsIHApOwotICAgICAgICBhdl9mcmVlKHEpOwotICAgIH0KLQotICAgIHByaW50ZigiVGVzdGluZyBhdl9hcHBlbmRfcGF0aF9jb21wb25lbnQoKVxuIik7Ci0gICAgI2RlZmluZSBURVNUX0FQUEVORF9QQVRIX0NPTVBPTkVOVChwYXRoLCBjb21wb25lbnQsIGV4cGVjdGVkKSBcCi0gICAgICAgIGZ1bGxwYXRoID0gYXZfYXBwZW5kX3BhdGhfY29tcG9uZW50KChwYXRoKSwgKGNvbXBvbmVudCkpOyBcCi0gICAgICAgIHByaW50ZigiJXMgPSAlc1xuIiwgZnVsbHBhdGggPyBmdWxscGF0aCA6ICIobnVsbCkiLCBleHBlY3RlZCk7IFwKLSAgICAgICAgYXZfZnJlZShmdWxscGF0aCk7Ci0gICAgVEVTVF9BUFBFTkRfUEFUSF9DT01QT05FTlQoTlVMTCwgTlVMTCwgIihudWxsKSIpCi0gICAgVEVTVF9BUFBFTkRfUEFUSF9DT01QT05FTlQoInBhdGgiLCBOVUxMLCAicGF0aCIpOwotICAgIFRFU1RfQVBQRU5EX1BBVEhfQ09NUE9ORU5UKE5VTEwsICJjb21wIiwgImNvbXAiKTsKLSAgICBURVNUX0FQUEVORF9QQVRIX0NPTVBPTkVOVCgicGF0aCIsICJjb21wIiwgInBhdGgvY29tcCIpOwotICAgIFRFU1RfQVBQRU5EX1BBVEhfQ09NUE9ORU5UKCJwYXRoLyIsICJjb21wIiwgInBhdGgvY29tcCIpOwotICAgIFRFU1RfQVBQRU5EX1BBVEhfQ09NUE9ORU5UKCJwYXRoIiwgIi9jb21wIiwgInBhdGgvY29tcCIpOwotICAgIFRFU1RfQVBQRU5EX1BBVEhfQ09NUE9ORU5UKCJwYXRoLyIsICIvY29tcCIsICJwYXRoL2NvbXAiKTsKLSAgICBURVNUX0FQUEVORF9QQVRIX0NPTVBPTkVOVCgicGF0aC9wYXRoMi8iLCAiL2NvbXAvY29tcDIiLCAicGF0aC9wYXRoMi9jb21wL2NvbXAyIik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYXZzdHJpbmcuaCBiL2xpYmF2dXRpbC9hdnN0cmluZy5oCmluZGV4IDE1YjA0YmEuLjA0ZDI2OTUgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9hdnN0cmluZy5oCisrKyBiL2xpYmF2dXRpbC9hdnN0cmluZy5oCkBAIC0xNTYsNyArMTU2LDcgQEAKIGNoYXIgKmF2X2FzcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBhdl9wcmludGZfZm9ybWF0KDEsIDIpOwogCiAvKioKLSAqIENvbnZlcnQgYSBudW1iZXIgdG8gYSBhdl9tYWxsb2NlZCBzdHJpbmcuCisgKiBDb252ZXJ0IGEgbnVtYmVyIHRvIGFuIGF2X21hbGxvY2VkIHN0cmluZy4KICAqLwogY2hhciAqYXZfZDJzdHIoZG91YmxlIGQpOwogCkBAIC0yNjYsNiArMjY2LDExIEBACiAgKi8KIGludCBhdl9zdHJuY2FzZWNtcChjb25zdCBjaGFyICphLCBjb25zdCBjaGFyICpiLCBzaXplX3Qgbik7CiAKKy8qKgorICogTG9jYWxlLWluZGVwZW5kZW50IHN0cmluZ3MgcmVwbGFjZS4KKyAqIEBub3RlIFRoaXMgbWVhbnMgb25seSBBU0NJSS1yYW5nZSBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlCisgKi8KK2NoYXIgKmF2X3N0cmlyZXBsYWNlKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZnJvbSwgY29uc3QgY2hhciAqdG8pOwogCiAvKioKICAqIFRocmVhZCBzYWZlIGJhc2VuYW1lLgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2F2dXRpbC5oIGIvbGliYXZ1dGlsL2F2dXRpbC5oCmluZGV4IDliY2Y2NzQuLjRkNjMzMTUgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9hdnV0aWwuaAorKysgYi9saWJhdnV0aWwvYXZ1dGlsLmgKQEAgLTIzLDcgKzIzLDggQEAKIAogLyoqCiAgKiBAZmlsZQotICogZXh0ZXJuYWwgQVBJIGhlYWRlcgorICogQGluZ3JvdXAgbGF2dQorICogQ29udmVuaWVuY2UgaGVhZGVyIHRoYXQgaW5jbHVkZXMgQHJlZiBsYXZ1ICJsaWJhdnV0aWwiJ3MgY29yZS4KICAqLwogCiAvKioKQEAgLTc4LDE0ICs3OSwxNSBAQAogICovCiAKIC8qKgotICogQGRlZmdyb3VwIGxhdnUgQ29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCisgKiBAZGVmZ3JvdXAgbGF2dSBsaWJhdnV0aWwKKyAqIENvbW1vbiBjb2RlIHNoYXJlZCBhY3Jvc3MgYWxsIEZGbXBlZyBsaWJyYXJpZXMuCiAgKgotICogQGJyaWVmCi0gKiBsaWJhdnV0aWwgY29udGFpbnMgdGhlIGNvZGUgc2hhcmVkIGFjcm9zcyBhbGwgdGhlIG90aGVyIEZGbXBlZwotICogbGlicmFyaWVzCi0gKgotICogQG5vdGUgSW4gb3JkZXIgdG8gdXNlIHRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgYXZ1dGlsIHlvdSBtdXN0IGluY2x1ZGUKLSAqIHRoZSBzcGVjaWZpYyBoZWFkZXIuCisgKiBAbm90ZQorICogbGliYXZ1dGlsIGlzIGRlc2lnbmVkIHRvIGJlIG1vZHVsYXIuIEluIG1vc3QgY2FzZXMsIGluIG9yZGVyIHRvIHVzZSB0aGUKKyAqIGZ1bmN0aW9ucyBwcm92aWRlZCBieSBvbmUgY29tcG9uZW50IG9mIGxpYmF2dXRpbCB5b3UgbXVzdCBleHBsaWNpdGx5IGluY2x1ZGUKKyAqIHRoZSBzcGVjaWZpYyBoZWFkZXIgY29udGFpbmluZyB0aGF0IGZlYXR1cmUuIElmIHlvdSBhcmUgb25seSB1c2luZworICogbWVkaWEtcmVsYXRlZCBjb21wb25lbnRzLCB5b3UgY291bGQgc2ltcGx5IGluY2x1ZGUgbGliYXZ1dGlsL2F2dXRpbC5oLCB3aGljaAorICogYnJpbmdzIGluIG1vc3Qgb2YgdGhlICJjb3JlIiBjb21wb25lbnRzLgogICoKICAqIEB7CiAgKgpAQCAtOTQsNyArOTYsNyBAQAogICogQHsKICAqIEB9CiAgKgotICogQGRlZmdyb3VwIGxhdnVfbWF0aCBNYXRocworICogQGRlZmdyb3VwIGxhdnVfbWF0aCBNYXRoZW1hdGljcwogICogQHsKICAqCiAgKiBAfQpAQCAtMTE2LDYgKzExOCwxMiBAQAogICoKICAqIEB9CiAgKgorICogQGRlZmdyb3VwIGxhdnVfdmlkZW8gVmlkZW8gcmVsYXRlZAorICoKKyAqIEB7CisgKgorICogQH0KKyAqCiAgKiBAZGVmZ3JvdXAgbGF2dV9hdWRpbyBBdWRpbyByZWxhdGVkCiAgKgogICogQHsKQEAgLTI2Niw3ICsyNzQsNyBAQAogICAgIEFWX1BJQ1RVUkVfVFlQRV9JLCAgICAgLy8vPCBJbnRyYQogICAgIEFWX1BJQ1RVUkVfVFlQRV9QLCAgICAgLy8vPCBQcmVkaWN0ZWQKICAgICBBVl9QSUNUVVJFX1RZUEVfQiwgICAgIC8vLzwgQmktZGlyIHByZWRpY3RlZAotICAgIEFWX1BJQ1RVUkVfVFlQRV9TLCAgICAgLy8vPCBTKEdNQyktVk9QIE1QRUc0CisgICAgQVZfUElDVFVSRV9UWVBFX1MsICAgICAvLy88IFMoR01DKS1WT1AgTVBFRy00CiAgICAgQVZfUElDVFVSRV9UWVBFX1NJLCAgICAvLy88IFN3aXRjaGluZyBJbnRyYQogICAgIEFWX1BJQ1RVUkVfVFlQRV9TUCwgICAgLy8vPCBTd2l0Y2hpbmcgUHJlZGljdGVkCiAgICAgQVZfUElDVFVSRV9UWVBFX0JJLCAgICAvLy88IEJJIHR5cGUKQEAgLTMzNSw2ICszNDMsMjAgQEAKICAqLwogQVZSYXRpb25hbCBhdl9nZXRfdGltZV9iYXNlX3Eodm9pZCk7CiAKKyNkZWZpbmUgQVZfRk9VUkNDX01BWF9TVFJJTkdfU0laRSAzMgorCisjZGVmaW5lIGF2X2ZvdXJjYzJzdHIoZm91cmNjKSBhdl9mb3VyY2NfbWFrZV9zdHJpbmcoKGNoYXJbQVZfRk9VUkNDX01BWF9TVFJJTkdfU0laRV0pezB9LCBmb3VyY2MpCisKKy8qKgorICogRmlsbCB0aGUgcHJvdmlkZWQgYnVmZmVyIHdpdGggYSBzdHJpbmcgY29udGFpbmluZyBhIEZvdXJDQyAoZm91ci1jaGFyYWN0ZXIKKyAqIGNvZGUpIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIEBwYXJhbSBidWYgICAgYSBidWZmZXIgd2l0aCBzaXplIGluIGJ5dGVzIG9mIGF0IGxlYXN0IEFWX0ZPVVJDQ19NQVhfU1RSSU5HX1NJWkUKKyAqIEBwYXJhbSBmb3VyY2MgdGhlIGZvdXJjYyB0byByZXByZXNlbnQKKyAqIEByZXR1cm4gdGhlIGJ1ZmZlciBpbiBpbnB1dAorICovCitjaGFyICphdl9mb3VyY2NfbWFrZV9zdHJpbmcoY2hhciAqYnVmLCB1aW50MzJfdCBmb3VyY2MpOworCiAvKioKICAqIEB9CiAgKiBAfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2Jhc2U2NC5jIGIvbGliYXZ1dGlsL2Jhc2U2NC5jCmluZGV4IDAzZWJjZTguLjI1YWU4YzQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9iYXNlNjQuYworKysgYi9saWJhdnV0aWwvYmFzZTY0LmMKQEAgLTE3MiwxMTAgKzE3MiwzIEBACiAKICAgICByZXR1cm4gcmV0OwogfQotCi0jaWZkZWYgVEVTVAotLy8gTENPVl9FWENMX1NUQVJUCi0KLSNkZWZpbmUgTUFYX0RBVEFfU0laRSAgICAxMDI0Ci0jZGVmaW5lIE1BWF9FTkNPREVEX1NJWkUgMjA0OAotCi1zdGF0aWMgaW50IHRlc3RfZW5jb2RlX2RlY29kZShjb25zdCB1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RlZF9yZWYpCi17Ci0gICAgY2hhciAgZW5jb2RlZFtNQVhfRU5DT0RFRF9TSVpFXTsKLSAgICB1aW50OF90IGRhdGEyW01BWF9EQVRBX1NJWkVdOwotICAgIGludCBkYXRhMl9zaXplLCBtYXhfZGF0YTJfc2l6ZSA9IE1BWF9EQVRBX1NJWkU7Ci0KLSAgICBpZiAoIWF2X2Jhc2U2NF9lbmNvZGUoZW5jb2RlZCwgTUFYX0VOQ09ERURfU0laRSwgZGF0YSwgZGF0YV9zaXplKSkgewotICAgICAgICBwcmludGYoIkZhaWxlZDogY2Fubm90IGVuY29kZSB0aGUgaW5wdXQgZGF0YVxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoZW5jb2RlZF9yZWYgJiYgc3RyY21wKGVuY29kZWQsIGVuY29kZWRfcmVmKSkgewotICAgICAgICBwcmludGYoIkZhaWxlZDogZW5jb2RlZCBzdHJpbmcgZGlmZmVycyBmcm9tIHJlZmVyZW5jZVxuIgotICAgICAgICAgICAgICAgIkVuY29kZWQ6XG4lc1xuUmVmZXJlbmNlOlxuJXNcbiIsIGVuY29kZWQsIGVuY29kZWRfcmVmKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgaWYgKChkYXRhMl9zaXplID0gYXZfYmFzZTY0X2RlY29kZShkYXRhMiwgZW5jb2RlZCwgbWF4X2RhdGEyX3NpemUpKSAhPSBkYXRhX3NpemUpIHsKLSAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IGNhbm5vdCBkZWNvZGUgdGhlIGVuY29kZWQgc3RyaW5nXG4iCi0gICAgICAgICAgICAgICAiRW5jb2RlZDpcbiVzXG4iLCBlbmNvZGVkKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmICgoZGF0YTJfc2l6ZSA9IGF2X2Jhc2U2NF9kZWNvZGUoZGF0YTIsIGVuY29kZWQsIGRhdGFfc2l6ZSkpICE9IGRhdGFfc2l6ZSkgewotICAgICAgICBwcmludGYoIkZhaWxlZDogY2Fubm90IGRlY29kZSB3aXRoIG1pbmltYWwgYnVmZmVyXG4iCi0gICAgICAgICAgICAgICAiRW5jb2RlZDpcbiVzXG4iLCBlbmNvZGVkKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChtZW1jbXAoZGF0YTIsIGRhdGEsIGRhdGFfc2l6ZSkpIHsKLSAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IGVuY29kZWQvZGVjb2RlZCBkYXRhIGRpZmZlcnMgZnJvbSBvcmlnaW5hbCBkYXRhXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChhdl9iYXNlNjRfZGVjb2RlKE5VTEwsIGVuY29kZWQsIDApICE9IDApIHsKLSAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IGRlY29kZSB0byBOVUxMIGJ1ZmZlclxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAoc3RybGVuKGVuY29kZWQpKSB7Ci0gICAgICAgIGNoYXIgKmVuZCA9IHN0cmNocihlbmNvZGVkLCAnPScpOwotICAgICAgICBpZiAoIWVuZCkKLSAgICAgICAgICAgIGVuZCA9IGVuY29kZWQgKyBzdHJsZW4oZW5jb2RlZCkgLSAxOwotICAgICAgICAqZW5kID0gJyUnOwotICAgICAgICBpZiAoYXZfYmFzZTY0X2RlY29kZShOVUxMLCBlbmNvZGVkLCAwKSA+PSAwKSB7Ci0gICAgICAgICAgICBwcmludGYoIkZhaWxlZDogZXJyb3IgZGV0ZWN0aW9uXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpbnRmKCJQYXNzZWQhXG4iKTsKLSAgICByZXR1cm4gMDsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKLXsKLSAgICBpbnQgaSwgZXJyb3JfY291bnQgPSAwOwotICAgIHN0cnVjdCB0ZXN0IHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YTsKLSAgICAgICAgY29uc3QgY2hhciAqZW5jb2RlZF9yZWY7Ci0gICAgfSB0ZXN0c1tdID0gewotICAgICAgICB7ICIiLCAgICAgICAgIiJ9LAotICAgICAgICB7ICIxIiwgICAgICAgIk1RPT0ifSwKLSAgICAgICAgeyAiMjIiLCAgICAgICJNakk9In0sCi0gICAgICAgIHsgIjMzMyIsICAgICAiTXpNeiJ9LAotICAgICAgICB7ICI0NDQ0IiwgICAgIk5EUTBOQT09In0sCi0gICAgICAgIHsgIjU1NTU1IiwgICAiTlRVMU5UVT0ifSwKLSAgICAgICAgeyAiNjY2NjY2IiwgICJOalkyTmpZMiJ9LAotICAgICAgICB7ICJhYmM6ZGVmIiwgIllXSmpPbVJsWmc9PSJ9LAotICAgIH07Ci0gICAgY2hhciBpblsxMDI0XSwgb3V0WzIwNDhdOwotCi0gICAgcHJpbnRmKCJFbmNvZGluZy9kZWNvZGluZyB0ZXN0c1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHRlc3RzKTsgaSsrKQotICAgICAgICBlcnJvcl9jb3VudCArPSB0ZXN0X2VuY29kZV9kZWNvZGUodGVzdHNbaV0uZGF0YSwgc3RybGVuKHRlc3RzW2ldLmRhdGEpLCB0ZXN0c1tpXS5lbmNvZGVkX3JlZik7Ci0KLSAgICBpZiAoYXJnYz4xICYmICFzdHJjbXAoYXJndlsxXSwgIi10IikpIHsKLSAgICAgICAgbWVtc2V0KGluLCAxMjMsIHNpemVvZihpbikpOwotICAgICAgICBmb3IoaT0wOyBpPDEwMDAwOyBpKyspewotICAgICAgICAgICAgU1RBUlRfVElNRVIKLSAgICAgICAgICAgIGF2X2Jhc2U2NF9lbmNvZGUob3V0LCBzaXplb2Yob3V0KSwgaW4sIHNpemVvZihpbikpOwotICAgICAgICAgICAgU1RPUF9USU1FUigiZW5jb2RlIikKLSAgICAgICAgfQotICAgICAgICBmb3IoaT0wOyBpPDEwMDAwOyBpKyspewotICAgICAgICAgICAgU1RBUlRfVElNRVIKLSAgICAgICAgICAgIGF2X2Jhc2U2NF9kZWNvZGUoaW4sIG91dCwgc2l6ZW9mKGluKSk7Ci0gICAgICAgICAgICBTVE9QX1RJTUVSKCJkZWNvZGUiKQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKGk9MDsgaTwxMDAwMDsgaSsrKXsKLSAgICAgICAgICAgIFNUQVJUX1RJTUVSCi0gICAgICAgICAgICBhdl9iYXNlNjRfZGVjb2RlKE5VTEwsIG91dCwgMCk7Ci0gICAgICAgICAgICBTVE9QX1RJTUVSKCJzeW50YXggY2hlY2siKQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGVycm9yX2NvdW50KQotICAgICAgICBwcmludGYoIkVycm9yIENvdW50OiAlZC5cbiIsIGVycm9yX2NvdW50KTsKLQotICAgIHJldHVybiAhIWVycm9yX2NvdW50OwotfQotCi0vLyBMQ09WX0VYQ0xfU1RPUAotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYmFzZTY0LmggYi9saWJhdnV0aWwvYmFzZTY0LmgKaW5kZXggNTE0NDk4ZS4uMjk1NGMxMiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2Jhc2U2NC5oCisrKyBiL2xpYmF2dXRpbC9iYXNlNjQuaApAQCAtMjksMjAgKzI5LDI1IEBACiAgKiBAewogICovCiAKLQogLyoqCiAgKiBEZWNvZGUgYSBiYXNlNjQtZW5jb2RlZCBzdHJpbmcuCiAgKgogICogQHBhcmFtIG91dCAgICAgIGJ1ZmZlciBmb3IgZGVjb2RlZCBkYXRhCiAgKiBAcGFyYW0gaW4gICAgICAgbnVsbC10ZXJtaW5hdGVkIGlucHV0IHN0cmluZwogICogQHBhcmFtIG91dF9zaXplIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG91dCBidWZmZXIsIG11c3QgYmUgYXQKLSAqICAgICAgICAgICAgICAgICBsZWFzdCAzLzQgb2YgdGhlIGxlbmd0aCBvZiBpbgorICogICAgICAgICAgICAgICAgIGxlYXN0IDMvNCBvZiB0aGUgbGVuZ3RoIG9mIGluLCB0aGF0IGlzIEFWX0JBU0U2NF9ERUNPREVfU0laRShzdHJsZW4oaW4pKQogICogQHJldHVybiAgICAgICAgIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBvciBhIG5lZ2F0aXZlIHZhbHVlIGluIGNhc2Ugb2YKICAqICAgICAgICAgICAgICAgICBpbnZhbGlkIGlucHV0CiAgKi8KIGludCBhdl9iYXNlNjRfZGVjb2RlKHVpbnQ4X3QgKm91dCwgY29uc3QgY2hhciAqaW4sIGludCBvdXRfc2l6ZSk7CiAKIC8qKgorICogQ2FsY3VsYXRlIHRoZSBvdXRwdXQgc2l6ZSBpbiBieXRlcyBuZWVkZWQgdG8gZGVjb2RlIGEgYmFzZTY0IHN0cmluZworICogd2l0aCBsZW5ndGggeCB0byBhIGRhdGEgYnVmZmVyLgorICovCisjZGVmaW5lIEFWX0JBU0U2NF9ERUNPREVfU0laRSh4KSAoKHgpICogM0xMIC8gNCkKKworLyoqCiAgKiBFbmNvZGUgZGF0YSB0byBiYXNlNjQgYW5kIG51bGwtdGVybWluYXRlLgogICoKICAqIEBwYXJhbSBvdXQgICAgICBidWZmZXIgZm9yIGVuY29kZWQgZGF0YQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2Jsb3dmaXNoLmMgYi9saWJhdnV0aWwvYmxvd2Zpc2guYwppbmRleCAwYWIxMDRlLi5hYmMwZTAzIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvYmxvd2Zpc2guYworKysgYi9saWJhdnV0aWwvYmxvd2Zpc2guYwpAQCAtNDIyLDE3MyArNDIyLDMgQEAKICAgICAgICAgfQogICAgIH0KIH0KLQotI2lmZGVmIFRFU1QKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIE5VTV9WQVJJQUJMRV9LRVlfVEVTVFMgMzQKLQotLyogcGxhaW50ZXh0IGJ5dGVzIC0tIGxlZnQgaGFsdmVzICovCi1zdGF0aWMgY29uc3QgdWludDMyX3QgcGxhaW50ZXh0X2xbTlVNX1ZBUklBQkxFX0tFWV9URVNUU10gPSB7Ci0gICAgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHgxMDAwMDAwMCwgMHgxMTExMTExMSwgMHgxMTExMTExMSwKLSAgICAweDAxMjM0NTY3LCAweDAwMDAwMDAwLCAweDAxMjM0NTY3LCAweDAxQTFENkQwLCAweDVDRDU0Q0E4LAotICAgIDB4MDI0OEQ0MzgsIDB4NTE0NTRCNTgsIDB4NDJGRDQ0MzAsIDB4MDU5QjVFMDgsIDB4MDc1NkQ4RTAsCi0gICAgMHg3NjI1MTRCOCwgMHgzQkREMTE5MCwgMHgyNjk1NUY2OCwgMHgxNjRENUU0MCwgMHg2QjA1NkUxOCwKLSAgICAweDAwNEJENkVGLCAweDQ4MEQzOTAwLCAweDQzNzU0MEM4LCAweDA3MkQ0M0EwLCAweDAyRkU1NTc3LAotICAgIDB4MUQ5RDVDNTAsIDB4MzA1NTMyMjgsIDB4MDEyMzQ1NjcsIDB4MDEyMzQ1NjcsIDB4MDEyMzQ1NjcsCi0gICAgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRgotfTsKLQotLyogcGxhaW50ZXh0IGJ5dGVzIC0tIHJpZ2h0IGhhbHZlcyAqLwotc3RhdGljIGNvbnN0IHVpbnQzMl90IHBsYWludGV4dF9yW05VTV9WQVJJQUJMRV9LRVlfVEVTVFNdID0gewotICAgIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDEsIDB4MTExMTExMTEsIDB4MTExMTExMTEsCi0gICAgMHg4OUFCQ0RFRiwgMHgwMDAwMDAwMCwgMHg4OUFCQ0RFRiwgMHgzOTc3Njc0MiwgMHgzREVGNTdEQSwKLSAgICAweDA2RjY3MTcyLCAweDJEREY0NDBBLCAweDU5NTc3RkEyLCAweDUxQ0YxNDNBLCAweDc3NDc2MUQyLAotICAgIDB4MjlCRjQ4NkEsIDB4NDkzNzI4MDIsIDB4MzVBRjYwOUEsIDB4NEYyNzUyMzIsIDB4NzU5RjVDQ0EsCi0gICAgMHgwOTE3NjA2MiwgMHg2RUU3NjJGMiwgMHg2OThGM0NGQSwgMHg3NzA3NTI5MiwgMHg4MTE3RjEyQSwKLSAgICAweDE4RjcyOEMyLCAweDZENkYyOTVBLCAweDg5QUJDREVGLCAweDg5QUJDREVGLCAweDg5QUJDREVGLAotICAgIDB4RkZGRkZGRkYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4RkZGRkZGRkYKLX07Ci0KLS8qIGtleSBieXRlcyBmb3IgdmFyaWFibGUga2V5IHRlc3RzICovCi1zdGF0aWMgY29uc3QgdWludDhfdCB2YXJpYWJsZV9rZXlbTlVNX1ZBUklBQkxFX0tFWV9URVNUU11bOF0gPSB7Ci0gICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgeyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH0sCi0gICAgeyAweDMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgeyAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExIH0sCi0gICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGIH0sCi0gICAgeyAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExLCAweDExIH0sCi0gICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgeyAweEZFLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwIH0sCi0gICAgeyAweDdDLCAweEExLCAweDEwLCAweDQ1LCAweDRBLCAweDFBLCAweDZFLCAweDU3IH0sCi0gICAgeyAweDAxLCAweDMxLCAweEQ5LCAweDYxLCAweDlELCAweEMxLCAweDM3LCAweDZFIH0sCi0gICAgeyAweDA3LCAweEExLCAweDEzLCAweDNFLCAweDRBLCAweDBCLCAweDI2LCAweDg2IH0sCi0gICAgeyAweDM4LCAweDQ5LCAweDY3LCAweDRDLCAweDI2LCAweDAyLCAweDMxLCAweDlFIH0sCi0gICAgeyAweDA0LCAweEI5LCAweDE1LCAweEJBLCAweDQzLCAweEZFLCAweEI1LCAweEI2IH0sCi0gICAgeyAweDAxLCAweDEzLCAweEI5LCAweDcwLCAweEZELCAweDM0LCAweEYyLCAweENFIH0sCi0gICAgeyAweDAxLCAweDcwLCAweEYxLCAweDc1LCAweDQ2LCAweDhGLCAweEI1LCAweEU2IH0sCi0gICAgeyAweDQzLCAweDI5LCAweDdGLCAweEFELCAweDM4LCAweEUzLCAweDczLCAweEZFIH0sCi0gICAgeyAweDA3LCAweEE3LCAweDEzLCAweDcwLCAweDQ1LCAweERBLCAweDJBLCAweDE2IH0sCi0gICAgeyAweDA0LCAweDY4LCAweDkxLCAweDA0LCAweEMyLCAweEZELCAweDNCLCAweDJGIH0sCi0gICAgeyAweDM3LCAweEQwLCAweDZCLCAweEI1LCAweDE2LCAweENCLCAweDc1LCAweDQ2IH0sCi0gICAgeyAweDFGLCAweDA4LCAweDI2LCAweDBELCAweDFBLCAweEMyLCAweDQ2LCAweDVFIH0sCi0gICAgeyAweDU4LCAweDQwLCAweDIzLCAweDY0LCAweDFBLCAweEJBLCAweDYxLCAweDc2IH0sCi0gICAgeyAweDAyLCAweDU4LCAweDE2LCAweDE2LCAweDQ2LCAweDI5LCAweEIwLCAweDA3IH0sCi0gICAgeyAweDQ5LCAweDc5LCAweDNFLCAweEJDLCAweDc5LCAweEIzLCAweDI1LCAweDhGIH0sCi0gICAgeyAweDRGLCAweEIwLCAweDVFLCAweDE1LCAweDE1LCAweEFCLCAweDczLCAweEE3IH0sCi0gICAgeyAweDQ5LCAweEU5LCAweDVELCAweDZELCAweDRDLCAweEEyLCAweDI5LCAweEJGIH0sCi0gICAgeyAweDAxLCAweDgzLCAweDEwLCAweERDLCAweDQwLCAweDlCLCAweDI2LCAweEQ2IH0sCi0gICAgeyAweDFDLCAweDU4LCAweDdGLCAweDFDLCAweDEzLCAweDkyLCAweDRGLCAweEVGIH0sCi0gICAgeyAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxIH0sCi0gICAgeyAweDFGLCAweDFGLCAweDFGLCAweDFGLCAweDBFLCAweDBFLCAweDBFLCAweDBFIH0sCi0gICAgeyAweEUwLCAweEZFLCAweEUwLCAweEZFLCAweEYxLCAweEZFLCAweEYxLCAweEZFIH0sCi0gICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgeyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH0sCi0gICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGIH0sCi0gICAgeyAweEZFLCAweERDLCAweEJBLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwIH0KLX07Ci0KLS8qIGNpcGhlcnRleHQgYnl0ZXMgLS0gbGVmdCBoYWx2ZXMgKi8KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBjaXBoZXJ0ZXh0X2xbTlVNX1ZBUklBQkxFX0tFWV9URVNUU10gPSB7Ci0gICAgMHg0RUY5OTc0NSwgMHg1MTg2NkZENSwgMHg3RDg1NkY5QSwgMHgyNDY2REQ4NywgMHg2MUY5QzM4MCwKLSAgICAweDdEMENDNjMwLCAweDRFRjk5NzQ1LCAweDBBQ0VBQjBGLCAweDU5QzY4MjQ1LCAweEIxQjhDQzBCLAotICAgIDB4MTczMEU1NzcsIDB4QTI1RTc4NTYsIDB4MzUzODgyQjEsIDB4NDhGNEQwODgsIDB4NDMyMTkzQjcsCi0gICAgMHgxM0YwNDE1NCwgMHgyRUVEREE5MywgMHhEODg3RTAzOSwgMHg1Rjk5RDA0RiwgMHg0QTA1N0EzQiwKLSAgICAweDQ1MjAzMUMxLCAweDc1NTVBRTM5LCAweDUzQzU1RjlDLCAweDdBOEU3QkZBLCAweENGOUM1RDdBLAotICAgIDB4RDFBQkIyOTAsIDB4NTVDQjM3NzQsIDB4RkEzNEVDNDgsIDB4QTc5MDc5NTEsIDB4QzM5RTA3MkQsCi0gICAgMHgwMTQ5MzNFMCwgMHhGMjFFOUE3NywgMHgyNDU5NDY4OCwgMHg2QjVDNUE5QwotfTsKLQotLyogY2lwaGVydGV4dCBieXRlcyAtLSByaWdodCBoYWx2ZXMgKi8KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBjaXBoZXJ0ZXh0X3JbTlVNX1ZBUklBQkxFX0tFWV9URVNUU10gPSB7Ci0gICAgMHg2MTk4REQ3OCwgMHhCODVFQ0I4QSwgMHg2MTMwNjNGMiwgMHg4Qjk2M0M5RCwgMHgyMjgxQjA5NiwKLSAgICAweEFGREExRUM3LCAweDYxOThERDc4LCAweEM2QTBBMjhELCAweEVCMDUyODJCLCAweDI1MEYwOUEwLAotICAgIDB4OEJFQTFEQTQsIDB4Q0YyNjUxRUIsIDB4MDlDRThGMUEsIDB4NEMzNzk5MTgsIDB4ODk1MUZDOTgsCi0gICAgMHhENjlEMUFFNSwgMHhGRkQzOUM3OSwgMHgzQzJEQTZFMywgMHg1QjE2Mzk2OSwgMHgyNEQzOTc3QiwKLSAgICAweEU0RkFEQThFLCAweEY1OUI4N0JELCAweEI0OUZDMDE5LCAweDkzN0U4OUEzLCAweDQ5ODZBREI1LAotICAgIDB4NjU4QkM3NzgsIDB4RDEzRUYyMDEsIDB4NDdCMjY4QjIsIDB4MDhFQTNDQUUsIDB4OUZBQzYzMUQsCi0gICAgMHhDREFGRjZFNCwgMHhCNzFDNDlCQywgMHg1NzU0MzY5QSwgMHg1RDlFMEE1QQotfTsKLQotLyogcGxhaW50ZXh0IGJ5dGVzICovCi1zdGF0aWMgY29uc3QgdWludDhfdCBwbGFpbnRleHRbOF0gPSAiQkxPV0ZJU0giOwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBwbGFpbnRleHQyWzE2XSA9ICJCTE9XRklTSEJMT1dGSVNIIjsKLQotLyogY2lwaGVydGV4dCBieXRlcyAqLwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2lwaGVydGV4dFs4XSA9IHsKLSAgICAweDMyLCAweDRFLCAweEQwLCAweEZFLCAweEY0LCAweDEzLCAweEEyLCAweDAzCi19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBjaXBoZXJ0ZXh0MlsxNl0gPSB7Ci0gICAgMHg1MywgMHgwMCwgMHg0MCwgMHgwNiwgMHg2MywgMHhmMiwgMHgxZCwgMHg5OSwKLSAgICAweDNiLCAweDliLCAweDI3LCAweDY0LCAweDQ2LCAweGZkLCAweDIwLCAweGMxLAotfTsKLQotI2RlZmluZSBJViAiYmxvd2Zpc2giCi0KLXN0YXRpYyB2b2lkIHRlc3RfYmxvd2Zpc2goQVZCbG93ZmlzaCAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBpbnQgbGVuLCB1aW50OF90ICppdiwgaW50IGRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGVzdCkKLXsKLSAgICBhdl9ibG93ZmlzaF9jcnlwdChjdHgsIGRzdCwgc3JjLCBsZW4sIGl2LCBkaXIpOwotICAgIGlmIChtZW1jbXAoZHN0LCByZWYsIDgqbGVuKSkgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgcHJpbnRmKCIlcyBmYWlsZWRcbmdvdCAgICAgICIsIHRlc3QpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCpsZW47IGkrKykKLSAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBkc3RbaV0pOwotICAgICAgICBwcmludGYoIlxuZXhwZWN0ZWQgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4KmxlbjsgaSsrKQotICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIHJlZltpXSk7Ci0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgQVZCbG93ZmlzaCBjdHg7Ci0gICAgdWludDMyX3QgdG1wdGV4dF9sW05VTV9WQVJJQUJMRV9LRVlfVEVTVFNdOwotICAgIHVpbnQzMl90IHRtcHRleHRfcltOVU1fVkFSSUFCTEVfS0VZX1RFU1RTXTsKLSAgICB1aW50OF90IHRtcFsxNl0sIGl2WzhdOwotICAgIGludCBpOwotCi0gICAgYXZfYmxvd2Zpc2hfaW5pdCgmY3R4LCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLCAyNik7Ci0KLSAgICB0ZXN0X2Jsb3dmaXNoKCZjdHgsIHRtcCwgcGxhaW50ZXh0LCBjaXBoZXJ0ZXh0LCAxLCBOVUxMLCAwLCAiZW5jcnlwdGlvbiIpOwotICAgIHRlc3RfYmxvd2Zpc2goJmN0eCwgdG1wLCBjaXBoZXJ0ZXh0LCBwbGFpbnRleHQsIDEsIE5VTEwsIDEsICJkZWNyeXB0aW9uIik7Ci0gICAgdGVzdF9ibG93ZmlzaCgmY3R4LCB0bXAsIHRtcCwgY2lwaGVydGV4dCwgMSwgTlVMTCwgMCwgIklucGxhY2UgZW5jcnlwdGlvbiIpOwotICAgIHRlc3RfYmxvd2Zpc2goJmN0eCwgdG1wLCB0bXAsIHBsYWludGV4dCwgIDEsIE5VTEwsIDEsICJJbnBsYWNlIGRlY3J5cHRpb24iKTsKLSAgICBtZW1jcHkoaXYsIElWLCA4KTsKLSAgICB0ZXN0X2Jsb3dmaXNoKCZjdHgsIHRtcCwgcGxhaW50ZXh0MiwgY2lwaGVydGV4dDIsIDIsIGl2LCAwLCAiQ0JDIGVuY3J5cHRpb24iKTsKLSAgICBtZW1jcHkoaXYsIElWLCA4KTsKLSAgICB0ZXN0X2Jsb3dmaXNoKCZjdHgsIHRtcCwgY2lwaGVydGV4dDIsIHBsYWludGV4dDIsIDIsIGl2LCAxLCAiQ0JDIGRlY3J5cHRpb24iKTsKLSAgICBtZW1jcHkoaXYsIElWLCA4KTsKLSAgICB0ZXN0X2Jsb3dmaXNoKCZjdHgsIHRtcCwgdG1wLCBjaXBoZXJ0ZXh0MiwgMiwgaXYsIDAsICJJbnBsYWNlIENCQyBlbmNyeXB0aW9uIik7Ci0gICAgbWVtY3B5KGl2LCBJViwgOCk7Ci0gICAgdGVzdF9ibG93ZmlzaCgmY3R4LCB0bXAsIHRtcCwgcGxhaW50ZXh0MiwgIDIsIGl2LCAxLCAiSW5wbGFjZSBDQkMgZGVjcnlwdGlvbiIpOwotCi0gICAgbWVtY3B5KHRtcHRleHRfbCwgcGxhaW50ZXh0X2wsIHNpemVvZigqcGxhaW50ZXh0X2wpICogTlVNX1ZBUklBQkxFX0tFWV9URVNUUyk7Ci0gICAgbWVtY3B5KHRtcHRleHRfciwgcGxhaW50ZXh0X3IsIHNpemVvZigqcGxhaW50ZXh0X3IpICogTlVNX1ZBUklBQkxFX0tFWV9URVNUUyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1ZBUklBQkxFX0tFWV9URVNUUzsgaSsrKSB7Ci0gICAgICAgIGF2X2Jsb3dmaXNoX2luaXQoJmN0eCwgdmFyaWFibGVfa2V5W2ldLCA4KTsKLQotICAgICAgICBhdl9ibG93ZmlzaF9jcnlwdF9lY2IoJmN0eCwgJnRtcHRleHRfbFtpXSwgJnRtcHRleHRfcltpXSwgMCk7Ci0gICAgICAgIGlmICh0bXB0ZXh0X2xbaV0gIT0gY2lwaGVydGV4dF9sW2ldIHx8IHRtcHRleHRfcltpXSAhPSBjaXBoZXJ0ZXh0X3JbaV0pIHsKLSAgICAgICAgICAgIHByaW50ZigiVGVzdCBlbmNyeXB0aW9uIGZhaWxlZC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBhdl9ibG93ZmlzaF9jcnlwdF9lY2IoJmN0eCwgJnRtcHRleHRfbFtpXSwgJnRtcHRleHRfcltpXSwgMSk7Ci0gICAgICAgIGlmICh0bXB0ZXh0X2xbaV0gIT0gcGxhaW50ZXh0X2xbaV0gfHwgdG1wdGV4dF9yW2ldICE9IHBsYWludGV4dF9yW2ldKSB7Ci0gICAgICAgICAgICBwcmludGYoIlRlc3QgZGVjcnlwdGlvbiBmYWlsZWQuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgfQotICAgIHByaW50ZigiVGVzdCBlbmNyeXB0aW9uL2RlY3J5cHRpb24gc3VjY2Vzcy5cbiIpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2JwcmludC5jIGIvbGliYXZ1dGlsL2JwcmludC5jCmluZGV4IDBhMGQwNzguLjJmMDU5YzUgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9icHJpbnQuYworKysgYi9saWJhdnV0aWwvYnByaW50LmMKQEAgLTI2MCw3ICsyNjAsNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLSNkZWZpbmUgV0hJVEVTUEFDRVMgIiBcblx0IgorI2RlZmluZSBXSElURVNQQUNFUyAiIFxuXHRcciIKIAogdm9pZCBhdl9icHJpbnRfZXNjYXBlKEFWQlByaW50ICpkc3RidWYsIGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqc3BlY2lhbF9jaGFycywKICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWRXNjYXBlTW9kZSBtb2RlLCBpbnQgZmxhZ3MpCkBAIC0zMDMsNzkgKzMwMywzIEBACiAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KLQotI2lmZGVmIFRFU1QKLQotI3VuZGVmIHByaW50ZgotCi1zdGF0aWMgdm9pZCBicHJpbnRfcGFzY2FsKEFWQlByaW50ICpiLCB1bnNpZ25lZCBzaXplKQotewotICAgIHVuc2lnbmVkIGksIGo7Ci0gICAgdW5zaWduZWQgcFs0Ml07Ci0KLSAgICBhdl9hc3NlcnQwKHNpemUgPCBGRl9BUlJBWV9FTEVNUyhwKSk7Ci0KLSAgICBwWzBdID0gMTsKLSAgICBhdl9icHJpbnRmKGIsICIlOGRcbiIsIDEpOwotICAgIGZvciAoaSA9IDE7IGkgPD0gc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHBbaV0gPSAxOwotICAgICAgICBmb3IgKGogPSBpIC0gMTsgaiA+IDA7IGotLSkKLSAgICAgICAgICAgIHBbal0gPSBwW2pdICsgcFtqIC0gMV07Ci0gICAgICAgIGZvciAoaiA9IDA7IGogPD0gaTsgaisrKQotICAgICAgICAgICAgYXZfYnByaW50ZihiLCAiJThkIiwgcFtqXSk7Ci0gICAgICAgIGF2X2JwcmludGYoYiwgIlxuIik7Ci0gICAgfQotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIEFWQlByaW50IGI7Ci0gICAgY2hhciBidWZbMjU2XTsKLSAgICBzdHJ1Y3QgdG0gdGVzdHRpbWUgPSB7IC50bV95ZWFyID0gMTAwLCAudG1fbW9uID0gMTEsIC50bV9tZGF5ID0gMjAgfTsKLQotICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAtMSk7Ci0gICAgYnByaW50X3Bhc2NhbCgmYiwgNSk7Ci0gICAgcHJpbnRmKCJTaG9ydCB0ZXh0IGluIHVubGltaXRlZCBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGIuc3RyKSwgYi5sZW4pOwotICAgIHByaW50ZigiJXNcbiIsIGIuc3RyKTsKLSAgICBhdl9icHJpbnRfZmluYWxpemUoJmIsIE5VTEwpOwotCi0gICAgYXZfYnByaW50X2luaXQoJmIsIDAsIC0xKTsKLSAgICBicHJpbnRfcGFzY2FsKCZiLCAyNSk7Ci0gICAgcHJpbnRmKCJMb25nIHRleHQgaW4gdW5saW1pdGVkIGJ1ZmZlcjogJXUvJXVcbiIsICh1bnNpZ25lZClzdHJsZW4oYi5zdHIpLCBiLmxlbik7Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZiLCBOVUxMKTsKLQotICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAyMDQ4KTsKLSAgICBicHJpbnRfcGFzY2FsKCZiLCAyNSk7Ci0gICAgcHJpbnRmKCJMb25nIHRleHQgaW4gbGltaXRlZCBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGIuc3RyKSwgYi5sZW4pOwotICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYiwgTlVMTCk7Ci0KLSAgICBhdl9icHJpbnRfaW5pdCgmYiwgMCwgMSk7Ci0gICAgYnByaW50X3Bhc2NhbCgmYiwgNSk7Ci0gICAgcHJpbnRmKCJTaG9ydCB0ZXh0IGluIGF1dG9tYXRpYyBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGIuc3RyKSwgYi5sZW4pOwotCi0gICAgYXZfYnByaW50X2luaXQoJmIsIDAsIDEpOwotICAgIGJwcmludF9wYXNjYWwoJmIsIDI1KTsKLSAgICBwcmludGYoIkxvbmcgdGV4dCBpbiBhdXRvbWF0aWMgYnVmZmVyOiAldS8ldVxuIiwgKHVuc2lnbmVkKXN0cmxlbihiLnN0cikvOCo4LCBiLmxlbik7Ci0gICAgLyogTm90ZSB0aGF0IHRoZSBzaXplIG9mIHRoZSBhdXRvbWF0aWMgYnVmZmVyIGlzIGFyY2gtZGVwZW5kZW50LiAqLwotCi0gICAgYXZfYnByaW50X2luaXQoJmIsIDAsIDApOwotICAgIGJwcmludF9wYXNjYWwoJmIsIDI1KTsKLSAgICBwcmludGYoIkxvbmcgdGV4dCBjb3VudCBvbmx5IGJ1ZmZlcjogJXUvJXVcbiIsICh1bnNpZ25lZClzdHJsZW4oYi5zdHIpLCBiLmxlbik7Ci0KLSAgICBhdl9icHJpbnRfaW5pdF9mb3JfYnVmZmVyKCZiLCBidWYsIHNpemVvZihidWYpKTsKLSAgICBicHJpbnRfcGFzY2FsKCZiLCAyNSk7Ci0gICAgcHJpbnRmKCJMb25nIHRleHQgY291bnQgb25seSBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGJ1ZiksIGIubGVuKTsKLQotICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAtMSk7Ci0gICAgYXZfYnByaW50X3N0cmZ0aW1lKCZiLCAiJVktJW0tJWQiLCAmdGVzdHRpbWUpOwotICAgIHByaW50Zigic3RyZnRpbWUgZnVsbDogJXUvJXUgXCIlc1wiXG4iLCAodW5zaWduZWQpc3RybGVuKGJ1ZiksIGIubGVuLCBiLnN0cik7Ci0gICAgYXZfYnByaW50X2ZpbmFsaXplKCZiLCBOVUxMKTsKLQotICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCA4KTsKLSAgICBhdl9icHJpbnRfc3RyZnRpbWUoJmIsICIlWS0lbS0lZCIsICZ0ZXN0dGltZSk7Ci0gICAgcHJpbnRmKCJzdHJmdGltZSB0cnVuY2F0ZWQ6ICV1LyV1IFwiJXNcIlxuIiwgKHVuc2lnbmVkKXN0cmxlbihidWYpLCBiLmxlbiwgYi5zdHIpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2J1ZmZlci5jIGIvbGliYXZ1dGlsL2J1ZmZlci5jCmluZGV4IGJiMTEyYzIuLjhkMWFhNWYgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9idWZmZXIuYworKysgYi9saWJhdnV0aWwvYnVmZmVyLmMKQEAgLTE2LDEwICsxNiwxMCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlIDxzdGRhdG9taWMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgImF0b21pYy5oIgogI2luY2x1ZGUgImJ1ZmZlcl9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgIm1lbS5oIgpAQCAtNDAsNyArNDAsOCBAQAogICAgIGJ1Zi0+c2l6ZSAgICAgPSBzaXplOwogICAgIGJ1Zi0+ZnJlZSAgICAgPSBmcmVlID8gZnJlZSA6IGF2X2J1ZmZlcl9kZWZhdWx0X2ZyZWU7CiAgICAgYnVmLT5vcGFxdWUgICA9IG9wYXF1ZTsKLSAgICBidWYtPnJlZmNvdW50ID0gMTsKKworICAgIGF0b21pY19pbml0KCZidWYtPnJlZmNvdW50LCAxKTsKIAogICAgIGlmIChmbGFncyAmIEFWX0JVRkZFUl9GTEFHX1JFQURPTkxZKQogICAgICAgICBidWYtPmZsYWdzIHw9IEJVRkZFUl9GTEFHX1JFQURPTkxZOwpAQCAtOTgsNyArOTksNyBAQAogCiAgICAgKnJldCA9ICpidWY7CiAKLSAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZidWYtPmJ1ZmZlci0+cmVmY291bnQsIDEpOworICAgIGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoJmJ1Zi0+YnVmZmVyLT5yZWZjb3VudCwgMSwgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KQEAgLTExNSw3ICsxMTYsNyBAQAogICAgIH0gZWxzZQogICAgICAgICBhdl9mcmVlcChkc3QpOwogCi0gICAgaWYgKCFhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZiLT5yZWZjb3VudCwgLTEpKSB7CisgICAgaWYgKGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoJmItPnJlZmNvdW50LCAtMSwgbWVtb3J5X29yZGVyX2FjcV9yZWwpID09IDEpIHsKICAgICAgICAgYi0+ZnJlZShiLT5vcGFxdWUsIGItPmRhdGEpOwogICAgICAgICBhdl9mcmVlcCgmYik7CiAgICAgfQpAQCAtMTM0LDcgKzEzNSw3IEBACiAgICAgaWYgKGJ1Zi0+YnVmZmVyLT5mbGFncyAmIEFWX0JVRkZFUl9GTEFHX1JFQURPTkxZKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIHJldHVybiBhdnByaXZfYXRvbWljX2ludF9nZXQoJmJ1Zi0+YnVmZmVyLT5yZWZjb3VudCkgPT0gMTsKKyAgICByZXR1cm4gYXRvbWljX2xvYWQoJmJ1Zi0+YnVmZmVyLT5yZWZjb3VudCkgPT0gMTsKIH0KIAogdm9pZCAqYXZfYnVmZmVyX2dldF9vcGFxdWUoY29uc3QgQVZCdWZmZXJSZWYgKmJ1ZikKQEAgLTE0NCw3ICsxNDUsNyBAQAogCiBpbnQgYXZfYnVmZmVyX2dldF9yZWZfY291bnQoY29uc3QgQVZCdWZmZXJSZWYgKmJ1ZikKIHsKLSAgICByZXR1cm4gYnVmLT5idWZmZXItPnJlZmNvdW50OworICAgIHJldHVybiBhdG9taWNfbG9hZCgmYnVmLT5idWZmZXItPnJlZmNvdW50KTsKIH0KIAogaW50IGF2X2J1ZmZlcl9tYWtlX3dyaXRhYmxlKEFWQnVmZmVyUmVmICoqcGJ1ZikKQEAgLTE5MSw3ICsxOTIsNyBAQAogICAgICAgICByZXR1cm4gMDsKIAogICAgIGlmICghKGJ1Zi0+YnVmZmVyLT5mbGFncyAmIEJVRkZFUl9GTEFHX1JFQUxMT0NBVEFCTEUpIHx8Ci0gICAgICAgICFhdl9idWZmZXJfaXNfd3JpdGFibGUoYnVmKSkgeworICAgICAgICAhYXZfYnVmZmVyX2lzX3dyaXRhYmxlKGJ1ZikgfHwgYnVmLT5kYXRhICE9IGJ1Zi0+YnVmZmVyLT5kYXRhKSB7CiAgICAgICAgIC8qIGNhbm5vdCByZWFsbG9jLCBhbGxvY2F0ZSBhIG5ldyByZWFsbG9jYWJsZSBidWZmZXIgYW5kIGNvcHkgZGF0YSAqLwogICAgICAgICBBVkJ1ZmZlclJlZiAqbmV3ID0gTlVMTDsKIApAQCAtMjE0LDYgKzIxNSwyNiBAQAogICAgIHJldHVybiAwOwogfQogCitBVkJ1ZmZlclBvb2wgKmF2X2J1ZmZlcl9wb29sX2luaXQyKGludCBzaXplLCB2b2lkICpvcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmKiAoKmFsbG9jKSh2b2lkICpvcGFxdWUsIGludCBzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnBvb2xfZnJlZSkodm9pZCAqb3BhcXVlKSkKK3sKKyAgICBBVkJ1ZmZlclBvb2wgKnBvb2wgPSBhdl9tYWxsb2N6KHNpemVvZigqcG9vbCkpOworICAgIGlmICghcG9vbCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmZl9tdXRleF9pbml0KCZwb29sLT5tdXRleCwgTlVMTCk7CisKKyAgICBwb29sLT5zaXplICAgICAgPSBzaXplOworICAgIHBvb2wtPm9wYXF1ZSAgICA9IG9wYXF1ZTsKKyAgICBwb29sLT5hbGxvYzIgICAgPSBhbGxvYzsKKyAgICBwb29sLT5wb29sX2ZyZWUgPSBwb29sX2ZyZWU7CisKKyAgICBhdG9taWNfaW5pdCgmcG9vbC0+cmVmY291bnQsIDEpOworCisgICAgcmV0dXJuIHBvb2w7Cit9CisKIEFWQnVmZmVyUG9vbCAqYXZfYnVmZmVyX3Bvb2xfaW5pdChpbnQgc2l6ZSwgQVZCdWZmZXJSZWYqICgqYWxsb2MpKGludCBzaXplKSkKIHsKICAgICBBVkJ1ZmZlclBvb2wgKnBvb2wgPSBhdl9tYWxsb2N6KHNpemVvZigqcG9vbCkpOwpAQCAtMjI1LDcgKzI0Niw3IEBACiAgICAgcG9vbC0+c2l6ZSAgICAgPSBzaXplOwogICAgIHBvb2wtPmFsbG9jICAgID0gYWxsb2MgPyBhbGxvYyA6IGF2X2J1ZmZlcl9hbGxvYzsKIAotICAgIGF2cHJpdl9hdG9taWNfaW50X3NldCgmcG9vbC0+cmVmY291bnQsIDEpOworICAgIGF0b21pY19pbml0KCZwb29sLT5yZWZjb3VudCwgMSk7CiAKICAgICByZXR1cm4gcG9vbDsKIH0KQEAgLTI0NCw2ICsyNjUsMTAgQEAKICAgICAgICAgYXZfZnJlZXAoJmJ1Zik7CiAgICAgfQogICAgIGZmX211dGV4X2Rlc3Ryb3koJnBvb2wtPm11dGV4KTsKKworICAgIGlmIChwb29sLT5wb29sX2ZyZWUpCisgICAgICAgIHBvb2wtPnBvb2xfZnJlZShwb29sLT5vcGFxdWUpOworCiAgICAgYXZfZnJlZXAoJnBvb2wpOwogfQogCkBAIC0yNTYsNDggKzI4MSwxMCBAQAogICAgIHBvb2wgICA9ICpwcG9vbDsKICAgICAqcHBvb2wgPSBOVUxMOwogCi0gICAgaWYgKCFhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZwb29sLT5yZWZjb3VudCwgLTEpKQorICAgIGlmIChhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCZwb29sLT5yZWZjb3VudCwgLTEsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKSA9PSAxKQogICAgICAgICBidWZmZXJfcG9vbF9mcmVlKHBvb2wpOwogfQogCi0jaWYgVVNFX0FUT01JQ1MKLS8qIHJlbW92ZSB0aGUgd2hvbGUgYnVmZmVyIGxpc3QgZnJvbSB0aGUgcG9vbCBhbmQgcmV0dXJuIGl0ICovCi1zdGF0aWMgQnVmZmVyUG9vbEVudHJ5ICpnZXRfcG9vbChBVkJ1ZmZlclBvb2wgKnBvb2wpCi17Ci0gICAgQnVmZmVyUG9vbEVudHJ5ICpjdXIgPSAqKHZvaWQgKiB2b2xhdGlsZSAqKSZwb29sLT5wb29sLCAqbGFzdCA9IE5VTEw7Ci0KLSAgICB3aGlsZSAoY3VyICE9IGxhc3QpIHsKLSAgICAgICAgbGFzdCA9IGN1cjsKLSAgICAgICAgY3VyID0gYXZwcml2X2F0b21pY19wdHJfY2FzKCh2b2lkICogdm9sYXRpbGUgKikmcG9vbC0+cG9vbCwgbGFzdCwgTlVMTCk7Ci0gICAgICAgIGlmICghY3VyKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGN1cjsKLX0KLQotc3RhdGljIHZvaWQgYWRkX3RvX3Bvb2woQnVmZmVyUG9vbEVudHJ5ICpidWYpCi17Ci0gICAgQVZCdWZmZXJQb29sICpwb29sOwotICAgIEJ1ZmZlclBvb2xFbnRyeSAqY3VyLCAqZW5kID0gYnVmOwotCi0gICAgaWYgKCFidWYpCi0gICAgICAgIHJldHVybjsKLSAgICBwb29sID0gYnVmLT5wb29sOwotCi0gICAgd2hpbGUgKGVuZC0+bmV4dCkKLSAgICAgICAgZW5kID0gZW5kLT5uZXh0OwotCi0gICAgd2hpbGUgKGF2cHJpdl9hdG9taWNfcHRyX2Nhcygodm9pZCAqIHZvbGF0aWxlICopJnBvb2wtPnBvb2wsIE5VTEwsIGJ1ZikpIHsKLSAgICAgICAgLyogcG9vbCBpcyBub3QgZW1wdHksIHJldHJpZXZlIGl0IGFuZCBhcHBlbmQgaXQgdG8gb3VyIGxpc3QgKi8KLSAgICAgICAgY3VyID0gZ2V0X3Bvb2wocG9vbCk7Ci0gICAgICAgIGVuZC0+bmV4dCA9IGN1cjsKLSAgICAgICAgd2hpbGUgKGVuZC0+bmV4dCkKLSAgICAgICAgICAgIGVuZCA9IGVuZC0+bmV4dDsKLSAgICB9Ci19Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgcG9vbF9yZWxlYXNlX2J1ZmZlcih2b2lkICpvcGFxdWUsIHVpbnQ4X3QgKmRhdGEpCiB7CiAgICAgQnVmZmVyUG9vbEVudHJ5ICpidWYgPSBvcGFxdWU7CkBAIC0zMDYsMTYgKzI5MywxMiBAQAogICAgIGlmKENPTkZJR19NRU1PUllfUE9JU09OSU5HKQogICAgICAgICBtZW1zZXQoYnVmLT5kYXRhLCBGRl9NRU1PUllfUE9JU09OLCBwb29sLT5zaXplKTsKIAotI2lmIFVTRV9BVE9NSUNTCi0gICAgYWRkX3RvX3Bvb2woYnVmKTsKLSNlbHNlCiAgICAgZmZfbXV0ZXhfbG9jaygmcG9vbC0+bXV0ZXgpOwogICAgIGJ1Zi0+bmV4dCA9IHBvb2wtPnBvb2w7CiAgICAgcG9vbC0+cG9vbCA9IGJ1ZjsKICAgICBmZl9tdXRleF91bmxvY2soJnBvb2wtPm11dGV4KTsKLSNlbmRpZgogCi0gICAgaWYgKCFhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZwb29sLT5yZWZjb3VudCwgLTEpKQorICAgIGlmIChhdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCZwb29sLT5yZWZjb3VudCwgLTEsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKSA9PSAxKQogICAgICAgICBidWZmZXJfcG9vbF9mcmVlKHBvb2wpOwogfQogCkBAIC0zMjYsNyArMzA5LDggQEAKICAgICBCdWZmZXJQb29sRW50cnkgKmJ1ZjsKICAgICBBVkJ1ZmZlclJlZiAgICAgKnJldDsKIAotICAgIHJldCA9IHBvb2wtPmFsbG9jKHBvb2wtPnNpemUpOworICAgIHJldCA9IHBvb2wtPmFsbG9jMiA/IHBvb2wtPmFsbG9jMihwb29sLT5vcGFxdWUsIHBvb2wtPnNpemUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBwb29sLT5hbGxvYyhwb29sLT5zaXplKTsKICAgICBpZiAoIXJldCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTM0NCwxMSArMzI4LDYgQEAKICAgICByZXQtPmJ1ZmZlci0+b3BhcXVlID0gYnVmOwogICAgIHJldC0+YnVmZmVyLT5mcmVlICAgPSBwb29sX3JlbGVhc2VfYnVmZmVyOwogCi0jaWYgVVNFX0FUT01JQ1MKLSAgICBhdnByaXZfYXRvbWljX2ludF9hZGRfYW5kX2ZldGNoKCZwb29sLT5yZWZjb3VudCwgMSk7Ci0gICAgYXZwcml2X2F0b21pY19pbnRfYWRkX2FuZF9mZXRjaCgmcG9vbC0+bmJfYWxsb2NhdGVkLCAxKTsKLSNlbmRpZgotCiAgICAgcmV0dXJuIHJldDsKIH0KIApAQCAtMzU3LDI5ICszMzYsNiBAQAogICAgIEFWQnVmZmVyUmVmICpyZXQ7CiAgICAgQnVmZmVyUG9vbEVudHJ5ICpidWY7CiAKLSNpZiBVU0VfQVRPTUlDUwotICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIHBvb2wgaXMgZW1wdHkgKi8KLSAgICBidWYgPSBnZXRfcG9vbChwb29sKTsKLSAgICBpZiAoIWJ1ZiAmJiBwb29sLT5yZWZjb3VudCA8PSBwb29sLT5uYl9hbGxvY2F0ZWQpIHsKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgIlBvb2wgcmFjZSBkZWN0ZWN0ZWQsIHNwaW5pbmcgdG8gYXZvaWQgb3ZlcmFsbG9jYXRpb24gYW5kIGV2ZW50dWFsIE9PTVxuIik7Ci0gICAgICAgIHdoaWxlICghYnVmICYmIGF2cHJpdl9hdG9taWNfaW50X2dldCgmcG9vbC0+cmVmY291bnQpIDw9IGF2cHJpdl9hdG9taWNfaW50X2dldCgmcG9vbC0+bmJfYWxsb2NhdGVkKSkKLSAgICAgICAgICAgIGJ1ZiA9IGdldF9wb29sKHBvb2wpOwotICAgIH0KLQotICAgIGlmICghYnVmKQotICAgICAgICByZXR1cm4gcG9vbF9hbGxvY19idWZmZXIocG9vbCk7Ci0KLSAgICAvKiBrZWVwIHRoZSBmaXJzdCBlbnRyeSwgcmV0dXJuIHRoZSByZXN0IG9mIHRoZSBsaXN0IHRvIHRoZSBwb29sICovCi0gICAgYWRkX3RvX3Bvb2woYnVmLT5uZXh0KTsKLSAgICBidWYtPm5leHQgPSBOVUxMOwotCi0gICAgcmV0ID0gYXZfYnVmZmVyX2NyZWF0ZShidWYtPmRhdGEsIHBvb2wtPnNpemUsIHBvb2xfcmVsZWFzZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIDApOwotICAgIGlmICghcmV0KSB7Ci0gICAgICAgIGFkZF90b19wb29sKGJ1Zik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSNlbHNlCiAgICAgZmZfbXV0ZXhfbG9jaygmcG9vbC0+bXV0ZXgpOwogICAgIGJ1ZiA9IHBvb2wtPnBvb2w7CiAgICAgaWYgKGJ1ZikgewpAQCAtMzkzLDEwICszNDksOSBAQAogICAgICAgICByZXQgPSBwb29sX2FsbG9jX2J1ZmZlcihwb29sKTsKICAgICB9CiAgICAgZmZfbXV0ZXhfdW5sb2NrKCZwb29sLT5tdXRleCk7Ci0jZW5kaWYKIAogICAgIGlmIChyZXQpCi0gICAgICAgIGF2cHJpdl9hdG9taWNfaW50X2FkZF9hbmRfZmV0Y2goJnBvb2wtPnJlZmNvdW50LCAxKTsKKyAgICAgICAgYXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgmcG9vbC0+cmVmY291bnQsIDEsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKIAogICAgIHJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvYnVmZmVyLmggYi9saWJhdnV0aWwvYnVmZmVyLmgKaW5kZXggYjQzOTlmZC4uNzNiNmJkMCAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2J1ZmZlci5oCisrKyBiL2xpYmF2dXRpbC9idWZmZXIuaApAQCAtMjQ5LDEzICsyNDksMzAgQEAKIEFWQnVmZmVyUG9vbCAqYXZfYnVmZmVyX3Bvb2xfaW5pdChpbnQgc2l6ZSwgQVZCdWZmZXJSZWYqICgqYWxsb2MpKGludCBzaXplKSk7CiAKIC8qKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBidWZmZXIgcG9vbCB3aXRoIGEgbW9yZSBjb21wbGV4IGFsbG9jYXRvci4KKyAqCisgKiBAcGFyYW0gc2l6ZSBzaXplIG9mIGVhY2ggYnVmZmVyIGluIHRoaXMgcG9vbAorICogQHBhcmFtIG9wYXF1ZSBhcmJpdHJhcnkgdXNlciBkYXRhIHVzZWQgYnkgdGhlIGFsbG9jYXRvcgorICogQHBhcmFtIGFsbG9jIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWxsb2NhdGUgbmV3IGJ1ZmZlcnMgd2hlbiB0aGUKKyAqICAgICAgICAgICAgICBwb29sIGlzIGVtcHR5LgorICogQHBhcmFtIHBvb2xfZnJlZSBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBwb29sCisgKiAgICAgICAgICAgICAgICAgIGlzIGZyZWVkLiBJLmUuIGFmdGVyIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgpIGlzIGNhbGxlZAorICogICAgICAgICAgICAgICAgICBieSB0aGUgY2FsbGVyIGFuZCBhbGwgdGhlIGZyYW1lcyBhcmUgcmV0dXJuZWQgdG8gdGhlIHBvb2wKKyAqICAgICAgICAgICAgICAgICAgYW5kIGZyZWVkLiBJdCBpcyBpbnRlbmRlZCB0byB1bmluaXRpYWxpemUgdGhlIHVzZXIgb3BhcXVlCisgKiAgICAgICAgICAgICAgICAgIGRhdGEuCisgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wgb24gc3VjY2VzcywgTlVMTCBvbiBlcnJvci4KKyAqLworQVZCdWZmZXJQb29sICphdl9idWZmZXJfcG9vbF9pbml0MihpbnQgc2l6ZSwgdm9pZCAqb3BhcXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiogKCphbGxvYykodm9pZCAqb3BhcXVlLCBpbnQgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpwb29sX2ZyZWUpKHZvaWQgKm9wYXF1ZSkpOworCisvKioKICAqIE1hcmsgdGhlIHBvb2wgYXMgYmVpbmcgYXZhaWxhYmxlIGZvciBmcmVlaW5nLiBJdCB3aWxsIGFjdHVhbGx5IGJlIGZyZWVkIG9ubHkKICAqIG9uY2UgYWxsIHRoZSBhbGxvY2F0ZWQgYnVmZmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHBvb2wgYXJlIHJlbGVhc2VkLiBUaHVzIGl0CiAgKiBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGlsZSBzb21lIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVycyBhcmUgc3RpbGwKICAqIGluIHVzZS4KICAqCiAgKiBAcGFyYW0gcG9vbCBwb2ludGVyIHRvIHRoZSBwb29sIHRvIGJlIGZyZWVkLiBJdCB3aWxsIGJlIHNldCB0byBOVUxMLgotICogQHNlZSBhdl9idWZmZXJfcG9vbF9jYW5fdW5pbml0KCkKICAqLwogdm9pZCBhdl9idWZmZXJfcG9vbF91bmluaXQoQVZCdWZmZXJQb29sICoqcG9vbCk7CiAKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9idWZmZXJfaW50ZXJuYWwuaCBiL2xpYmF2dXRpbC9idWZmZXJfaW50ZXJuYWwuaAppbmRleCBlNjUzMDQ4Li41NGI2NzA0IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvYnVmZmVyX2ludGVybmFsLmgKKysrIGIvbGliYXZ1dGlsL2J1ZmZlcl9pbnRlcm5hbC5oCkBAIC0xOSw2ICsxOSw3IEBACiAjaWZuZGVmIEFWVVRJTF9CVUZGRVJfSU5URVJOQUxfSAogI2RlZmluZSBBVlVUSUxfQlVGRkVSX0lOVEVSTkFMX0gKIAorI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAiYnVmZmVyLmgiCkBAIC00MCw3ICs0MSw3IEBACiAgICAgLyoqCiAgICAgICogIG51bWJlciBvZiBleGlzdGluZyBBVkJ1ZmZlclJlZiBpbnN0YW5jZXMgcmVmZXJyaW5nIHRvIHRoaXMgYnVmZmVyCiAgICAgICovCi0gICAgdm9sYXRpbGUgaW50IHJlZmNvdW50OworICAgIGF0b21pY191aW50IHJlZmNvdW50OwogCiAgICAgLyoqCiAgICAgICogYSBjYWxsYmFjayBmb3IgZnJlZWluZyB0aGUgZGF0YQpAQCAtODUsMTIgKzg2LDEzIEBACiAgICAgICogYnVmZmVycyBoYXZlIGJlZW4gcmVsZWFzZWQsIHRoZW4gaXQncyBzYWZlIHRvIGZyZWUgdGhlIHBvb2wgYW5kIGFsbAogICAgICAqIHRoZSBidWZmZXJzIGluIGl0LgogICAgICAqLwotICAgIHZvbGF0aWxlIGludCByZWZjb3VudDsKLQotICAgIHZvbGF0aWxlIGludCBuYl9hbGxvY2F0ZWQ7CisgICAgYXRvbWljX3VpbnQgcmVmY291bnQ7CiAKICAgICBpbnQgc2l6ZTsKKyAgICB2b2lkICpvcGFxdWU7CiAgICAgQVZCdWZmZXJSZWYqICgqYWxsb2MpKGludCBzaXplKTsKKyAgICBBVkJ1ZmZlclJlZiogKCphbGxvYzIpKHZvaWQgKm9wYXF1ZSwgaW50IHNpemUpOworICAgIHZvaWQgICAgICAgICAoKnBvb2xfZnJlZSkodm9pZCAqb3BhcXVlKTsKIH07CiAKICNlbmRpZiAvKiBBVlVUSUxfQlVGRkVSX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9jYW1lbGxpYS5jIGIvbGliYXZ1dGlsL2NhbWVsbGlhLmMKaW5kZXggZjIxY2ExMi4uZjMzZWU5YiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2NhbWVsbGlhLmMKKysrIGIvbGliYXZ1dGlsL2NhbWVsbGlhLmMKQEAgLTQxMCw2MSArNDEwLDMgQEAKICAgICAgICAgZHN0ID0gZHN0ICsgMTY7CiAgICAgfQogfQotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGU8c3RkaW8uaD4KLSNpbmNsdWRlPHN0ZGxpYi5oPgotI2luY2x1ZGUibG9nLmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCi17Ci0gICAgY29uc3QgdWludDhfdCBLZXlbM11bMzJdID0gewotICAgICAgICB7MHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMH0sCi0gICAgICAgIHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwLCAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3fSwKLSAgICAgICAgezB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsIDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAsIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsIDB4ODgsIDB4OTksIDB4YWEsIDB4YmIsIDB4Y2MsIDB4ZGQsIDB4ZWUsIDB4ZmZ9Ci0gICAgfTsKLSAgICBjb25zdCB1aW50OF90IHJjdFszXVsxNl0gPSB7Ci0gICAgICAgIHsweDY3LCAweDY3LCAweDMxLCAweDM4LCAweDU0LCAweDk2LCAweDY5LCAweDczLCAweDA4LCAweDU3LCAweDA2LCAweDU2LCAweDQ4LCAweGVhLCAweGJlLCAweDQzfSwKLSAgICAgICAgezB4YjQsIDB4OTksIDB4MzQsIDB4MDEsIDB4YjMsIDB4ZTksMHg5NiwgMHhmOCwgMHg0ZSwgMHhlNSwgMHhjZSwgMHhlNywgMHhkNywgMHg5YiwgMHgwOSwgMHhiOX0sCi0gICAgICAgIHsweDlhLCAweGNjLCAweDIzLCAweDdkLCAweGZmLCAweDE2LCAweGQ3LCAweDZjLCAweDIwLCAweGVmLCAweDdjLCAweDkxLCAweDllLCAweDNhLCAweDc1LCAweDA5fQotICAgIH07Ci0gICAgY29uc3QgdWludDhfdCBycHRbMzJdID0gezB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsIDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAsIDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsIDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTB9OwotICAgIGNvbnN0IGludCBrYml0c1szXSA9IHsxMjgsIDE5MiwgMjU2fTsKLSAgICBpbnQgaSwgaiwgZXJyID0gMDsKLSAgICB1aW50OF90IHRlbXBbMzJdLCBpdlsxNl07Ci0gICAgQVZDQU1FTExJQSAqY3M7Ci0gICAgY3MgPSBhdl9jYW1lbGxpYV9hbGxvYygpOwotICAgIGlmICghY3MpCi0gICAgICAgIHJldHVybiAxOwotICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKLSAgICAgICAgYXZfY2FtZWxsaWFfaW5pdChjcywgS2V5W2pdLCBrYml0c1tqXSk7Ci0gICAgICAgIGF2X2NhbWVsbGlhX2NyeXB0KGNzLCB0ZW1wLCBycHQsIDEsIE5VTEwsIDApOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgaWYgKHJjdFtqXVtpXSAhPSB0ZW1wW2ldKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICUwMnggJTAyeFxuIiwgaSwgcmN0W2pdW2ldLCB0ZW1wW2ldKTsKLSAgICAgICAgICAgICAgICBlcnIgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF2X2NhbWVsbGlhX2NyeXB0KGNzLCB0ZW1wLCByY3Rbal0sIDEsIE5VTEwsIDEpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgaWYgKHJwdFtpXSAhPSB0ZW1wW2ldKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICUwMnggJTAyeFxuIiwgaSwgcnB0W2ldLCB0ZW1wW2ldKTsKLSAgICAgICAgICAgICAgICBlcnIgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGF2X2NhbWVsbGlhX2luaXQoY3MsIEtleVswXSwgMTI4KTsKLSAgICBtZW1jcHkoaXYsICJIQUxMTzEyM0hBTExPMTIzIiwgMTYpOwotICAgIGF2X2NhbWVsbGlhX2NyeXB0KGNzLCB0ZW1wLCBycHQsIDIsIGl2LCAwKTsKLSAgICBtZW1jcHkoaXYsICJIQUxMTzEyM0hBTExPMTIzIiwgMTYpOwotICAgIGF2X2NhbWVsbGlhX2NyeXB0KGNzLCB0ZW1wLCB0ZW1wLCAyLCBpdiwgMSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKLSAgICAgICAgaWYgKHJwdFtpXSAhPSB0ZW1wW2ldKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCBycHRbaV0sIHRlbXBbaV0pOwotICAgICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBhdl9mcmVlKGNzKTsKLSAgICByZXR1cm4gZXJyOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvY2FzdDUuYyBiL2xpYmF2dXRpbC9jYXN0NS5jCmluZGV4IGE0NzY5N2IuLjQ0NWViNTUgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9jYXN0NS5jCisrKyBiL2xpYmF2dXRpbC9jYXN0NS5jCkBAIC01MDUsODkgKzUwNSwzIEBACiAgICAgICAgIGRzdCA9IGRzdCArIDg7CiAgICAgfQogfQotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGU8c3RkaW8uaD4KLSNpbmNsdWRlPHN0ZGxpYi5oPgotI2luY2x1ZGUibG9nLmgiCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKLXsKLQotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IEtleVszXVsxNl0gPSB7Ci0gICAgICAgIHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweDM0LCAweDU2LCAweDc4LCAweDlhfSwKLSAgICAgICAgezB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4MjMsIDB4NDV9LAotICAgICAgICB7MHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHgxMn0KLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHJwdFs4XSA9IHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmfTsKLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCByY3RbM11bOF0gPSB7Ci0gICAgICAgIHsweDIzLCAweDhiLCAweDRmLCAweGU1LCAweDg0LCAweDdlLCAweDQ0LCAweGIyfSwKLSAgICAgICAgezB4ZWIsIDB4NmEsIDB4NzEsIDB4MWEsIDB4MmMsIDB4MDIsIDB4MjcsIDB4MWJ9LAotICAgICAgICB7MHg3YSwgMHhjOCwgMHgxNiwgMHhkMSwgMHg2ZSwgMHg5YiwgMHgzMCwgMHgyZX0KLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHJjdDJbMl1bMTZdID0gewotICAgICAgICB7MHhlZSwgMHhhOSwgMHhkMCwgMHhhMiwgMHg0OSwgMHhmZCwgMHgzYiwgMHhhNiwgMHhiMywgMHg0MywgMHg2ZiwgMHhiOCwgMHg5ZCwgMHg2ZCwgMHhjYSwgMHg5Mn0sCi0gICAgICAgIHsweGIyLCAweGM5LCAweDVlLCAweGIwLCAweDBjLCAweDMxLCAweGFkLCAweDcxLCAweDgwLCAweGFjLCAweDA1LCAweGI4LCAweGU4LCAweDNkLCAweDY5LCAweDZlfQotICAgIH07Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaXZbOF0gPSB7MHhlZSwgMHhhOSwgMHhkMCwgMHhhMiwgMHg0OSwgMHhmZCwgMHgzYiwgMHhhNn07Ci0gICAgc3RhdGljIHVpbnQ4X3QgcnB0MlsyXVsxNl07Ci0gICAgaW50IGksIGosIGVyciA9IDA7Ci0gICAgc3RhdGljIGNvbnN0IGludCBrZXlfYml0c1szXSA9IHsxMjgsIDgwLCA0MH07Ci0gICAgdWludDhfdCB0ZW1wWzhdOwotICAgIEFWQ0FTVDUgKmNzOwotICAgIGNzID0gYXZfY2FzdDVfYWxsb2MoKTsKLSAgICBpZiAoIWNzKQotICAgICAgICByZXR1cm4gMTsKLSAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKXsKLQotICAgICAgICBhdl9jYXN0NV9pbml0KGNzLCBLZXlbal0sIGtleV9iaXRzW2pdKTsKLSAgICAgICAgYXZfY2FzdDVfY3J5cHQoY3MsIHRlbXAsIHJwdCwgMSwgMCk7Ci0gICAgICAgIGZvciAoaSA9IDA7aSA8IDg7IGkrKyl7Ci0gICAgICAgICAgICBpZiAocmN0W2pdW2ldICE9IHRlbXBbaV0pewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCAlMDJ4ICUwMnhcbiIsIGksIHJjdFtqXVtpXSwgdGVtcFtpXSk7Ci0gICAgICAgICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGF2X2Nhc3Q1X2NyeXB0KGNzLCB0ZW1wLCByY3Rbal0sIDEsIDEpOwotICAgICAgICBmb3IgKGkgPTA7IGkgPCA4OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChycHRbaV0gIT0gdGVtcFtpXSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCAlMDJ4ICUwMnhcbiIsIGksIHJwdFtpXSwgdGVtcFtpXSk7Ci0gICAgICAgICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBtZW1jcHkocnB0MlswXSwgS2V5WzBdLCAxNik7Ci0gICAgbWVtY3B5KHJwdDJbMV0sIEtleVswXSwgMTYpOwotICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDAwOyBpKyspewotICAgICAgICBhdl9jYXN0NV9pbml0KGNzLCBycHQyWzFdLCAxMjgpOwotICAgICAgICBhdl9jYXN0NV9jcnlwdChjcywgcnB0MlswXSwgcnB0MlswXSwgMiwgMCk7Ci0gICAgICAgIGF2X2Nhc3Q1X2luaXQoY3MsIHJwdDJbMF0sIDEyOCk7Ci0gICAgICAgIGF2X2Nhc3Q1X2NyeXB0KGNzLCBycHQyWzFdLCBycHQyWzFdLCAyLCAwKTsKLSAgICB9Ci0gICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgaWYgKHJjdDJbal1baV0gIT0gcnB0MltqXVtpXSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCAlMDJ4ICUwMnhcbiIsIGksIHJjdDJbal1baV0sIHJwdDJbal1baV0pOwotICAgICAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykgewotCi0gICAgICAgIGF2X2Nhc3Q1X2luaXQoY3MsIEtleVtqXSwga2V5X2JpdHNbal0pOwotICAgICAgICBtZW1jcHkodGVtcCwgaXYsIDgpOwotICAgICAgICBhdl9jYXN0NV9jcnlwdDIoY3MsIHJwdDJbMF0sIHJjdDJbMF0sIDIsIHRlbXAsIDApOwotICAgICAgICBtZW1jcHkodGVtcCwgaXYsIDgpOwotICAgICAgICBhdl9jYXN0NV9jcnlwdDIoY3MsIHJwdDJbMF0sIHJwdDJbMF0sIDIsIHRlbXAsIDEpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgICAgaWYgKHJjdDJbMF1baV0gIT0gcnB0MlswXVtpXSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCAlMDJ4ICUwMnhcbiIsIGksIHJjdDJbMF1baV0sIHJwdDJbMF1baV0pOwotICAgICAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXZfZnJlZShjcyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmMgYi9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuYwppbmRleCA2MDFjN2U2Li4zYmQ1ZWUyIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuYworKysgYi9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuYwpAQCAtOTQsNyArOTQsNyBAQAogICAgIHsgIjYuMChmcm9udCkiLCAgNiwgIEFWX0NIX0xBWU9VVF82UE9JTlQwX0ZST05UIH0sCiAgICAgeyAiaGV4YWdvbmFsIiwgICA2LCAgQVZfQ0hfTEFZT1VUX0hFWEFHT05BTCB9LAogICAgIHsgIjYuMSIsICAgICAgICAgNywgIEFWX0NIX0xBWU9VVF82UE9JTlQxIH0sCi0gICAgeyAiNi4xIiwgICAgICAgICA3LCAgQVZfQ0hfTEFZT1VUXzZQT0lOVDFfQkFDSyB9LAorICAgIHsgIjYuMShiYWNrKSIsICAgNywgIEFWX0NIX0xBWU9VVF82UE9JTlQxX0JBQ0sgfSwKICAgICB7ICI2LjEoZnJvbnQpIiwgIDcsICBBVl9DSF9MQVlPVVRfNlBPSU5UMV9GUk9OVCB9LAogICAgIHsgIjcuMCIsICAgICAgICAgNywgIEFWX0NIX0xBWU9VVF83UE9JTlQwIH0sCiAgICAgeyAiNy4wKGZyb250KSIsICA3LCAgQVZfQ0hfTEFZT1VUXzdQT0lOVDBfRlJPTlQgfSwKQEAgLTE1Miw2ICsxNTIsMjggQEAKICAgICByZXR1cm4gbGF5b3V0OwogfQogCitpbnQgYXZfZ2V0X2V4dGVuZGVkX2NoYW5uZWxfbGF5b3V0KGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90KiBjaGFubmVsX2xheW91dCwgaW50KiBuYl9jaGFubmVscykKK3sKKyAgICBpbnQgbmIgPSAwOworICAgIGNoYXIgKmVuZDsKKyAgICB1aW50NjRfdCBsYXlvdXQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXQobmFtZSk7CisKKyAgICBpZiAobGF5b3V0KSB7CisgICAgICAgICpjaGFubmVsX2xheW91dCA9IGxheW91dDsKKyAgICAgICAgKm5iX2NoYW5uZWxzID0gYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGxheW91dCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5iID0gc3RydG9sKG5hbWUsICZlbmQsIDEwKTsKKyAgICBpZiAoIWVycm5vICYmICplbmQgID09ICdDJyAmJiAqKGVuZCArIDEpID09ICdcMCcgJiYgbmIgPiAwICYmIG5iIDwgNjQpIHsKKyAgICAgICAgKmNoYW5uZWxfbGF5b3V0ID0gMDsKKyAgICAgICAgKm5iX2NoYW5uZWxzID0gbmI7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKIHZvaWQgYXZfYnByaW50X2NoYW5uZWxfbGF5b3V0KHN0cnVjdCBBVkJQcmludCAqYnAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfY2hhbm5lbHMsIHVpbnQ2NF90IGNoYW5uZWxfbGF5b3V0KQogewpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmggYi9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaAppbmRleCBlYzdlZmZlLi41MGJiOGYwIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaAorKysgYi9saWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaApAQCAtMTMxLDIyICsxMzEsMzEgQEAKICAqICAgNS4wKHNpZGUpLCA1LjEsIDUuMShzaWRlKSwgNy4xLCA3LjEod2lkZSksIGRvd25taXgpOwogICogLSB0aGUgbmFtZSBvZiBhIHNpbmdsZSBjaGFubmVsIChGTCwgRlIsIEZDLCBMRkUsIEJMLCBCUiwgRkxDLCBGUkMsIEJDLAogICogICBTTCwgU1IsIFRDLCBURkwsIFRGQywgVEZSLCBUQkwsIFRCQywgVEJSLCBETCwgRFIpOwotICogLSBhIG51bWJlciBvZiBjaGFubmVscywgaW4gZGVjaW1hbCwgb3B0aW9uYWxseSBmb2xsb3dlZCBieSAnYycsIHlpZWxkaW5nCisgKiAtIGEgbnVtYmVyIG9mIGNoYW5uZWxzLCBpbiBkZWNpbWFsLCBmb2xsb3dlZCBieSAnYycsIHlpZWxkaW5nCiAgKiAgIHRoZSBkZWZhdWx0IGNoYW5uZWwgbGF5b3V0IGZvciB0aGF0IG51bWJlciBvZiBjaGFubmVscyAoQHNlZQogICogICBhdl9nZXRfZGVmYXVsdF9jaGFubmVsX2xheW91dCk7CiAgKiAtIGEgY2hhbm5lbCBsYXlvdXQgbWFzaywgaW4gaGV4YWRlY2ltYWwgc3RhcnRpbmcgd2l0aCAiMHgiIChzZWUgdGhlCiAgKiAgIEFWX0NIXyogbWFjcm9zKS4KICAqCi0gKiBAd2FybmluZyBTdGFydGluZyBmcm9tIHRoZSBuZXh0IG1ham9yIGJ1bXAgdGhlIHRyYWlsaW5nIGNoYXJhY3RlcgotICogJ2MnIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgY2hhbm5lbHMgd2lsbCBiZSByZXF1aXJlZCwgd2hpbGUgYQotICogY2hhbm5lbCBsYXlvdXQgbWFzayBjb3VsZCBhbHNvIGJlIHNwZWNpZmllZCBhcyBhIGRlY2ltYWwgbnVtYmVyCi0gKiAoaWYgYW5kIG9ubHkgaWYgbm90IGZvbGxvd2VkIGJ5ICJjIikuCi0gKgogICogRXhhbXBsZTogInN0ZXJlbytGQyIgPSAiMmMrRkMiID0gIjJjKzFjIiA9ICIweDciCiAgKi8KIHVpbnQ2NF90IGF2X2dldF9jaGFubmVsX2xheW91dChjb25zdCBjaGFyICpuYW1lKTsKIAogLyoqCisgKiBSZXR1cm4gYSBjaGFubmVsIGxheW91dCBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIG5hbWUuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIChAc2VlIGF2X2dldF9jaGFubmVsX2xheW91dCksIGJ1dCBjYW4gYWxzbyBwYXJzZQorICogdW5rbm93biBjaGFubmVsIGxheW91dCBzcGVjaWZpY2F0aW9ucy4KKyAqCisgKiBAcGFyYW1baW5dICBuYW1lICAgICAgICAgICAgIGNoYW5uZWwgbGF5b3V0IHNwZWNpZmljYXRpb24gc3RyaW5nCisgKiBAcGFyYW1bb3V0XSBjaGFubmVsX2xheW91dCAgIHBhcnNlZCBjaGFubmVsIGxheW91dCAoMCBpZiB1bmtub3duKQorICogQHBhcmFtW291dF0gbmJfY2hhbm5lbHMgICAgICBudW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgQVZFUlJPUihFSU5WQUwpIGlmIHRoZSBwYXJzaW5nIGZhaWxzLgorICovCitpbnQgYXZfZ2V0X2V4dGVuZGVkX2NoYW5uZWxfbGF5b3V0KGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQ2NF90KiBjaGFubmVsX2xheW91dCwgaW50KiBuYl9jaGFubmVscyk7CisKKy8qKgogICogUmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgYSBjaGFubmVsIGxheW91dC4KICAqIElmIG5iX2NoYW5uZWxzIGlzIDw9IDAsIGl0IGlzIGd1ZXNzZWQgZnJvbSB0aGUgY2hhbm5lbF9sYXlvdXQuCiAgKgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2NvbG9yX3V0aWxzLmMgYi9saWJhdnV0aWwvY29sb3JfdXRpbHMuYwppbmRleCBiNjhiNDAyLi5lYjhiYzdiIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvY29sb3JfdXRpbHMuYworKysgYi9saWJhdnV0aWwvY29sb3JfdXRpbHMuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAorI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jb2xvcl91dGlscy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhmbXQuaCIKIApAQCAtMTU0LDYgKzE1NSwxOCBAQAogICAgICAgICAgOiAgICAgICAgICAgICAgcG93KDQ4LjAgKiBMYyAvIDUyLjM3LCAxLjAgLyAyLjYpOwogfQogCisKK3N0YXRpYyBkb3VibGUgYXZwcml2X3RyY19hcmliX3N0ZF9iNjcoZG91YmxlIExjKSB7CisgICAgLy8gVGhlIGZ1bmN0aW9uIHVzZXMgdGhlIGRlZmluaXRpb24gZnJvbSBIRVZDLCB3aGljaCBhc3N1bWVzIHRoYXQgdGhlIHBlYWsKKyAgICAvLyB3aGl0ZSBpcyBpbnB1dCBsZXZlbCA9IDEuICh0aGlzIGlzIGVxdWl2YWxlbnQgdG8gc2NhbGluZyBFID0gTGMgKiAxMiBhbmQKKyAgICAvLyB1c2luZyB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZSBBUklCIFNURC1CNjcgc3BlYykKKyAgICBjb25zdCBkb3VibGUgYSA9IDAuMTc4ODMyNzc7CisgICAgY29uc3QgZG91YmxlIGIgPSAwLjI4NDY2ODkyOworICAgIGNvbnN0IGRvdWJsZSBjID0gMC41NTk5MTA3MzsKKyAgICByZXR1cm4gKDAuMCA+IExjKSA/IDAuMCA6CisgICAgICAgIChMYyA8PSAxLjAgLyAxMi4wID8gc3FydCgzLjAgKiBMYykgOiBhICogbG9nKDEyLjAgKiBMYyAtIGIpICsgYyk7Cit9CisKIGF2cHJpdl90cmNfZnVuY3Rpb24gYXZwcml2X2dldF90cmNfZnVuY3Rpb25fZnJvbV90cmMoZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyB0cmMpCiB7CiAgICAgYXZwcml2X3RyY19mdW5jdGlvbiBmdW5jID0gTlVMTDsKQEAgLTIwOCw2ICsyMjEsMTAgQEAKICAgICAgICAgICAgIGZ1bmMgPSBhdnByaXZfdHJjX3NtcHRlX3N0NDI4XzE7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIEFWQ09MX1RSQ19BUklCX1NURF9CNjc6CisgICAgICAgICAgICBmdW5jID0gYXZwcml2X3RyY19hcmliX3N0ZF9iNjc7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBjYXNlIEFWQ09MX1RSQ19SRVNFUlZFRDA6CiAgICAgICAgIGNhc2UgQVZDT0xfVFJDX1VOU1BFQ0lGSUVEOgogICAgICAgICBjYXNlIEFWQ09MX1RSQ19SRVNFUlZFRDoKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9jb2xvcnNwYWNlLmggYi9saWJhdnV0aWwvY29sb3JzcGFjZS5oCmluZGV4IDgyNmZmZDUuLmI2ZGJhMmMgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9jb2xvcnNwYWNlLmgKKysrIGIvbGliYXZ1dGlsL2NvbG9yc3BhY2UuaApAQCAtNDEsNiArNDEsMTcgQEAKICAgICBiX2FkZCA9IEZJWCgxLjc3MjAwKjI1NS4wLzIyNC4wKSAqIGNiICsgT05FX0hBTEY7XAogfQogCisjZGVmaW5lIFlVVl9UT19SR0IxX0NDSVJfQlQ3MDkoY2IxLCBjcjEpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYiAgICA9IChjYjEpIC0gMTI4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNyICAgID0gKGNyMSkgLSAxMjg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcl9hZGQgPSBPTkVfSEFMRiArIEZJWCgxLjU3NDcgKiAyNTUuMCAvIDIyNC4wKSAqIGNyOyAgXAorICAgICAgICBnX2FkZCA9IE9ORV9IQUxGIC0gRklYKDAuMTg3MyAqIDI1NS4wIC8gMjI0LjApICogY2IgLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSVgoMC40NjgyICogMjU1LjAgLyAyMjQuMCkgKiBjcjsgIFwKKyAgICAgICAgYl9hZGQgPSBPTkVfSEFMRiArIEZJWCgxLjg1NTYgKiAyNTUuMCAvIDIyNC4wKSAqIGNiOyAgXAorICAgIH0KKworLy8gVG8gYmUgdXNlZCBmb3IgdGhlIEJUNzA5IHZhcmlhbnQgYXMgd2VsbAogI2RlZmluZSBZVVZfVE9fUkdCMl9DQ0lSKHIsIGcsIGIsIHkxKVwKIHtcCiAgICAgeSA9ICgoeTEpIC0gMTYpICogRklYKDI1NS4wLzIxOS4wKTtcCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvY29tbW9uLmggYi9saWJhdnV0aWwvY29tbW9uLmgKaW5kZXggODE0MmIzMS4uOGRiMDI5MSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2NvbW1vbi5oCisrKyBiL2xpYmF2dXRpbC9jb21tb24uaApAQCAtMTU4LDcgKzE1OCw3IEBACiAgKi8KIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGF2X2NvbnN0IHVpbnQ4X3QgYXZfY2xpcF91aW50OF9jKGludCBhKQogewotICAgIGlmIChhJih+MHhGRikpIHJldHVybiAoLWEpPj4zMTsKKyAgICBpZiAoYSYofjB4RkYpKSByZXR1cm4gKH5hKT4+MzE7CiAgICAgZWxzZSAgICAgICAgICAgcmV0dXJuIGE7CiB9CiAKQEAgLTE4MCw3ICsxODAsNyBAQAogICovCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCB1aW50MTZfdCBhdl9jbGlwX3VpbnQxNl9jKGludCBhKQogewotICAgIGlmIChhJih+MHhGRkZGKSkgcmV0dXJuICgtYSk+PjMxOworICAgIGlmIChhJih+MHhGRkZGKSkgcmV0dXJuICh+YSk+PjMxOwogICAgIGVsc2UgICAgICAgICAgICAgcmV0dXJuIGE7CiB9CiAKQEAgLTIyOCw3ICsyMjgsNyBAQAogICovCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBhdl9jb25zdCB1bnNpZ25lZCBhdl9jbGlwX3VpbnRwMl9jKGludCBhLCBpbnQgcCkKIHsKLSAgICBpZiAoYSAmIH4oKDE8PHApIC0gMSkpIHJldHVybiAtYSA+PiAzMSAmICgoMTw8cCkgLSAxKTsKKyAgICBpZiAoYSAmIH4oKDE8PHApIC0gMSkpIHJldHVybiAofmEpID4+IDMxICYgKCgxPDxwKSAtIDEpOwogICAgIGVsc2UgICAgICAgICAgICAgICAgICAgcmV0dXJuICBhOwogfQogCkBAIC0yNjAsNyArMjYwLDcgQEAKICAqCiAgKiBAcGFyYW0gIGEgZmlyc3QgdmFsdWUKICAqIEBwYXJhbSAgYiB2YWx1ZSBkb3VibGVkIGFuZCBhZGRlZCB0byBhCi0gKiBAcmV0dXJuIHN1bSB3aXRoIHNpZ25lZCBzYXR1cmF0aW9uCisgKiBAcmV0dXJuIHN1bSBzYXQoYSArIHNhdCgyKmIpKSB3aXRoIHNpZ25lZCBzYXR1cmF0aW9uCiAgKi8KIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBhdl9zYXRfZGFkZDMyX2MoaW50IGEsIGludCBiKQogewpAQCAtMjY4LDYgKzI2OCwzMCBAQAogfQogCiAvKioKKyAqIFN1YnRyYWN0IHR3byBzaWduZWQgMzItYml0IHZhbHVlcyB3aXRoIHNhdHVyYXRpb24uCisgKgorICogQHBhcmFtICBhIG9uZSB2YWx1ZQorICogQHBhcmFtICBiIGFub3RoZXIgdmFsdWUKKyAqIEByZXR1cm4gZGlmZmVyZW5jZSB3aXRoIHNpZ25lZCBzYXR1cmF0aW9uCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBhdl9zYXRfc3ViMzJfYyhpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGF2X2NsaXBsX2ludDMyKChpbnQ2NF90KWEgLSBiKTsKK30KKworLyoqCisgKiBTdWJ0cmFjdCBhIGRvdWJsZWQgdmFsdWUgZnJvbSBhbm90aGVyIHZhbHVlIHdpdGggc2F0dXJhdGlvbiBhdCBib3RoIHN0YWdlcy4KKyAqCisgKiBAcGFyYW0gIGEgZmlyc3QgdmFsdWUKKyAqIEBwYXJhbSAgYiB2YWx1ZSBkb3VibGVkIGFuZCBzdWJ0cmFjdGVkIGZyb20gYQorICogQHJldHVybiBkaWZmZXJlbmNlIHNhdChhIC0gc2F0KDIqYikpIHdpdGggc2lnbmVkIHNhdHVyYXRpb24KKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGF2X3NhdF9kc3ViMzJfYyhpbnQgYSwgaW50IGIpCit7CisgICAgcmV0dXJuIGF2X3NhdF9zdWIzMihhLCBhdl9zYXRfYWRkMzIoYiwgYikpOworfQorCisvKioKICAqIENsaXAgYSBmbG9hdCB2YWx1ZSBpbnRvIHRoZSBhbWluLWFtYXggcmFuZ2UuCiAgKiBAcGFyYW0gYSB2YWx1ZSB0byBjbGlwCiAgKiBAcGFyYW0gYW1pbiBtaW5pbXVtIHZhbHVlIG9mIHRoZSBjbGlwIHJhbmdlCkBAIC01MTMsNiArNTM3LDEyIEBACiAjaWZuZGVmIGF2X3NhdF9kYWRkMzIKICMgICBkZWZpbmUgYXZfc2F0X2RhZGQzMiAgICBhdl9zYXRfZGFkZDMyX2MKICNlbmRpZgorI2lmbmRlZiBhdl9zYXRfc3ViMzIKKyMgICBkZWZpbmUgYXZfc2F0X3N1YjMyICAgICBhdl9zYXRfc3ViMzJfYworI2VuZGlmCisjaWZuZGVmIGF2X3NhdF9kc3ViMzIKKyMgICBkZWZpbmUgYXZfc2F0X2RzdWIzMiAgICBhdl9zYXRfZHN1YjMyX2MKKyNlbmRpZgogI2lmbmRlZiBhdl9jbGlwZgogIyAgIGRlZmluZSBhdl9jbGlwZiAgICAgICAgIGF2X2NsaXBmX2MKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2NwdS5jIGIvbGliYXZ1dGlsL2NwdS5jCmluZGV4IGNkNTVkM2IuLjY1NDhjYzMgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9jcHUuYworKysgYi9saWJhdnV0aWwvY3B1LmMKQEAgLTE2LDggKzE2LDExIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorI2luY2x1ZGUgPHN0ZGRlZi5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgogCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgogI2luY2x1ZGUgImNwdS5oIgogI2luY2x1ZGUgImNwdV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImNvbmZpZy5oIgpAQCAtNDQsMTAgKzQ3LDI0IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKIAotc3RhdGljIGludCBmbGFncywgY2hlY2tlZDsKK3N0YXRpYyBhdG9taWNfaW50IGNwdV9mbGFncyA9IEFUT01JQ19WQVJfSU5JVCgtMSk7CisKK3N0YXRpYyBpbnQgZ2V0X2NwdV9mbGFncyh2b2lkKQoreworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIHJldHVybiBmZl9nZXRfY3B1X2ZsYWdzX2FhcmNoNjQoKTsKKyAgICBpZiAoQVJDSF9BUk0pCisgICAgICAgIHJldHVybiBmZl9nZXRfY3B1X2ZsYWdzX2FybSgpOworICAgIGlmIChBUkNIX1BQQykKKyAgICAgICAgcmV0dXJuIGZmX2dldF9jcHVfZmxhZ3NfcHBjKCk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICByZXR1cm4gZmZfZ2V0X2NwdV9mbGFnc194ODYoKTsKKyAgICByZXR1cm4gMDsKK30KIAogdm9pZCBhdl9mb3JjZV9jcHVfZmxhZ3MoaW50IGFyZyl7Ci0gICAgaWYgKCAgIChhcmcgJiAoIEFWX0NQVV9GTEFHXzNETk9XICAgIHwKKyAgICBpZiAoQVJDSF9YODYgJiYKKyAgICAgICAgICAgKGFyZyAmICggQVZfQ1BVX0ZMQUdfM0ROT1cgICAgfAogICAgICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR18zRE5PV0VYVCB8CiAgICAgICAgICAgICAgICAgICAgIEFWX0NQVV9GTEFHX01NWEVYVCAgIHwKICAgICAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfU1NFICAgICAgfApAQCAtNjMsMzkgKzgwLDMwIEBACiAgICAgICAgICAgICAgICAgICAgIEFWX0NQVV9GTEFHX1hPUCAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfRk1BMyAgICAgfAogICAgICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19GTUE0ICAgICB8Ci0gICAgICAgICAgICAgICAgICAgIEFWX0NQVV9GTEFHX0FWWDIgICAgICkpCisgICAgICAgICAgICAgICAgICAgIEFWX0NQVV9GTEFHX0FWWDIgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfQVZYNTEyICAgKSkKICAgICAgICAgJiYgIShhcmcgJiBBVl9DUFVfRkxBR19NTVgpKSB7CiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfV0FSTklORywgIk1NWCBpbXBsaWVkIGJ5IHNwZWNpZmllZCBmbGFnc1xuIik7CiAgICAgICAgIGFyZyB8PSBBVl9DUFVfRkxBR19NTVg7CiAgICAgfQogCi0gICAgZmxhZ3MgICA9IGFyZzsKLSAgICBjaGVja2VkID0gYXJnICE9IC0xOworICAgIGF0b21pY19zdG9yZV9leHBsaWNpdCgmY3B1X2ZsYWdzLCBhcmcsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKIH0KIAogaW50IGF2X2dldF9jcHVfZmxhZ3Modm9pZCkKIHsKLSAgICBpZiAoY2hlY2tlZCkKLSAgICAgICAgcmV0dXJuIGZsYWdzOwotCi0gICAgaWYgKEFSQ0hfQUFSQ0g2NCkKLSAgICAgICAgZmxhZ3MgPSBmZl9nZXRfY3B1X2ZsYWdzX2FhcmNoNjQoKTsKLSAgICBpZiAoQVJDSF9BUk0pCi0gICAgICAgIGZsYWdzID0gZmZfZ2V0X2NwdV9mbGFnc19hcm0oKTsKLSAgICBpZiAoQVJDSF9QUEMpCi0gICAgICAgIGZsYWdzID0gZmZfZ2V0X2NwdV9mbGFnc19wcGMoKTsKLSAgICBpZiAoQVJDSF9YODYpCi0gICAgICAgIGZsYWdzID0gZmZfZ2V0X2NwdV9mbGFnc194ODYoKTsKLQotICAgIGNoZWNrZWQgPSAxOworICAgIGludCBmbGFncyA9IGF0b21pY19sb2FkX2V4cGxpY2l0KCZjcHVfZmxhZ3MsIG1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICBpZiAoZmxhZ3MgPT0gLTEpIHsKKyAgICAgICAgZmxhZ3MgPSBnZXRfY3B1X2ZsYWdzKCk7CisgICAgICAgIGF0b21pY19zdG9yZV9leHBsaWNpdCgmY3B1X2ZsYWdzLCBmbGFncywgbWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIH0KICAgICByZXR1cm4gZmxhZ3M7CiB9CiAKIHZvaWQgYXZfc2V0X2NwdV9mbGFnc19tYXNrKGludCBtYXNrKQogewotICAgIGNoZWNrZWQgICAgICAgPSAwOwotICAgIGZsYWdzICAgICAgICAgPSBhdl9nZXRfY3B1X2ZsYWdzKCkgJiBtYXNrOwotICAgIGNoZWNrZWQgICAgICAgPSAxOworICAgIGF0b21pY19zdG9yZV9leHBsaWNpdCgmY3B1X2ZsYWdzLCBnZXRfY3B1X2ZsYWdzKCkgJiBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CiB9CiAKIGludCBhdl9wYXJzZV9jcHVfZmxhZ3MoY29uc3QgY2hhciAqcykKQEAgLTExOSw2ICsxMjcsNyBAQAogI2RlZmluZSBDUFVGTEFHX0FWWDIgICAgIChBVl9DUFVfRkxBR19BVlgyICAgICB8IENQVUZMQUdfQVZYKQogI2RlZmluZSBDUFVGTEFHX0JNSTIgICAgIChBVl9DUFVfRkxBR19CTUkyICAgICB8IEFWX0NQVV9GTEFHX0JNSTEpCiAjZGVmaW5lIENQVUZMQUdfQUVTTkkgICAgKEFWX0NQVV9GTEFHX0FFU05JICAgIHwgQ1BVRkxBR19TU0U0MikKKyNkZWZpbmUgQ1BVRkxBR19BVlg1MTIgICAoQVZfQ1BVX0ZMQUdfQVZYNTEyICAgfCBDUFVGTEFHX0FWWDIpCiAgICAgc3RhdGljIGNvbnN0IEFWT3B0aW9uIGNwdWZsYWdzX29wdHNbXSA9IHsKICAgICAgICAgeyAiZmxhZ3MiICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9GTEFHUywgeyAuaTY0ID0gMCB9LCBJTlQ2NF9NSU4sIElOVDY0X01BWCwgLnVuaXQgPSAiZmxhZ3MiIH0sCiAjaWYgICBBUkNIX1BQQwpAQCAtMTQ3LDYgKzE1Niw3IEBACiAgICAgICAgIHsgIjNkbm93ZXh0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVUZMQUdfM0ROT1dFWFQgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAogICAgICAgICB7ICJjbW92IiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19DTU9WICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKICAgICAgICAgeyAiYWVzbmkiICAgLCBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQ1BVRkxBR19BRVNOSSAgICAgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImF2eDUxMiIgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IENQVUZMQUdfQVZYNTEyICAgICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAogI2VsaWYgQVJDSF9BUk0KICAgICAgICAgeyAiYXJtdjV0ZSIsICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfQVJNVjVURSAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCiAgICAgICAgIHsgImFybXY2IiwgICAgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0FSTVY2ICAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LApAQCAtMjA5LDYgKzIxOSw3IEBACiAgICAgICAgIHsgIjNkbm93ZXh0IiwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHXzNETk9XRVhUIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAogICAgICAgICB7ICJjbW92IiwgICAgIE5VTEwsIDAsIEFWX09QVF9UWVBFX0NPTlNULCB7IC5pNjQgPSBBVl9DUFVfRkxBR19DTU9WICAgICB9LCAgICAudW5pdCA9ICJmbGFncyIgfSwKICAgICAgICAgeyAiYWVzbmkiLCAgICBOVUxMLCAwLCBBVl9PUFRfVFlQRV9DT05TVCwgeyAuaTY0ID0gQVZfQ1BVX0ZMQUdfQUVTTkkgICAgfSwgICAgLnVuaXQgPSAiZmxhZ3MiIH0sCisgICAgICAgIHsgImF2eDUxMiIgICwgTlVMTCwgMCwgQVZfT1BUX1RZUEVfQ09OU1QsIHsgLmk2NCA9IEFWX0NQVV9GTEFHX0FWWDUxMiAgIH0sICAgIC51bml0ID0gImZsYWdzIiB9LAogCiAjZGVmaW5lIENQVV9GTEFHX1AyIEFWX0NQVV9GTEFHX0NNT1YgfCBBVl9DUFVfRkxBR19NTVgKICNkZWZpbmUgQ1BVX0ZMQUdfUDMgQ1BVX0ZMQUdfUDIgfCBBVl9DUFVfRkxBR19NTVgyIHwgQVZfQ1BVX0ZMQUdfU1NFCkBAIC0yOTUsMTI5ICszMDYsMTYgQEAKICAgICByZXR1cm4gbmJfY3B1czsKIH0KIAotI2lmZGVmIFRFU1QKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAiYXZzdHJpbmcuaCIKLQotI2lmICFIQVZFX0dFVE9QVAotI2luY2x1ZGUgImNvbXBhdC9nZXRvcHQuYyIKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICBpbnQgZmxhZzsKLSAgICBjb25zdCBjaGFyICpuYW1lOwotfSBjcHVfZmxhZ190YWJbXSA9IHsKLSNpZiAgIEFSQ0hfQUFSQ0g2NAotICAgIHsgQVZfQ1BVX0ZMQUdfQVJNVjgsICAgICAiYXJtdjgiICAgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX05FT04sICAgICAgIm5lb24iICAgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19WRlAsICAgICAgICJ2ZnAiICAgICAgICB9LAotI2VsaWYgQVJDSF9BUk0KLSAgICB7IEFWX0NQVV9GTEFHX0FSTVY1VEUsICAgImFybXY1dGUiICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19BUk1WNiwgICAgICJhcm12NiIgICAgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfQVJNVjZUMiwgICAiYXJtdjZ0MiIgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX1ZGUCwgICAgICAgInZmcCIgICAgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19WRlBfVk0sICAgICJ2ZnBfdm0iICAgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfVkZQVjMsICAgICAidmZwdjMiICAgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX05FT04sICAgICAgIm5lb24iICAgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19TRVRFTkQsICAgICJzZXRlbmQiICAgICB9LAotI2VsaWYgQVJDSF9QUEMKLSAgICB7IEFWX0NQVV9GTEFHX0FMVElWRUMsICAgImFsdGl2ZWMiICAgIH0sCi0jZWxpZiBBUkNIX1g4NgotICAgIHsgQVZfQ1BVX0ZMQUdfTU1YLCAgICAgICAibW14IiAgICAgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX01NWEVYVCwgICAgIm1teGV4dCIgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19TU0UsICAgICAgICJzc2UiICAgICAgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfU1NFMiwgICAgICAic3NlMiIgICAgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX1NTRTJTTE9XLCAgInNzZTJzbG93IiAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19TU0UzLCAgICAgICJzc2UzIiAgICAgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfU1NFM1NMT1csICAic3NlM3Nsb3ciICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX1NTU0UzLCAgICAgInNzc2UzIiAgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19BVE9NLCAgICAgICJhdG9tIiAgICAgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfU1NFNCwgICAgICAic3NlNC4xIiAgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX1NTRTQyLCAgICAgInNzZTQuMiIgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19BVlgsICAgICAgICJhdngiICAgICAgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfQVZYU0xPVywgICAiYXZ4c2xvdyIgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX1hPUCwgICAgICAgInhvcCIgICAgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19GTUEzLCAgICAgICJmbWEzIiAgICAgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfRk1BNCwgICAgICAiZm1hNCIgICAgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHXzNETk9XLCAgICAgIjNkbm93IiAgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR18zRE5PV0VYVCwgICIzZG5vd2V4dCIgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfQ01PViwgICAgICAiY21vdiIgICAgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX0FWWDIsICAgICAgImF2eDIiICAgICAgIH0sCi0gICAgeyBBVl9DUFVfRkxBR19CTUkxLCAgICAgICJibWkxIiAgICAgICB9LAotICAgIHsgQVZfQ1BVX0ZMQUdfQk1JMiwgICAgICAiYm1pMiIgICAgICAgfSwKLSAgICB7IEFWX0NQVV9GTEFHX0FFU05JLCAgICAgImFlc25pIiAgICAgIH0sCi0jZW5kaWYKLSAgICB7IDAgfQotfTsKLQotc3RhdGljIHZvaWQgcHJpbnRfY3B1X2ZsYWdzKGludCBjcHVfZmxhZ3MsIGNvbnN0IGNoYXIgKnR5cGUpCitzaXplX3QgYXZfY3B1X21heF9hbGlnbih2b2lkKQogewotICAgIGludCBpOworICAgIGlmIChBUkNIX0FBUkNINjQpCisgICAgICAgIHJldHVybiBmZl9nZXRfY3B1X21heF9hbGlnbl9hYXJjaDY0KCk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICByZXR1cm4gZmZfZ2V0X2NwdV9tYXhfYWxpZ25fYXJtKCk7CisgICAgaWYgKEFSQ0hfUFBDKQorICAgICAgICByZXR1cm4gZmZfZ2V0X2NwdV9tYXhfYWxpZ25fcHBjKCk7CisgICAgaWYgKEFSQ0hfWDg2KQorICAgICAgICByZXR1cm4gZmZfZ2V0X2NwdV9tYXhfYWxpZ25feDg2KCk7CiAKLSAgICBwcmludGYoImNwdV9mbGFncyglcykgPSAweCUwOFhcbiIsIHR5cGUsIGNwdV9mbGFncyk7Ci0gICAgcHJpbnRmKCJjcHVfZmxhZ3Nfc3RyKCVzKSA9IiwgdHlwZSk7Ci0gICAgZm9yIChpID0gMDsgY3B1X2ZsYWdfdGFiW2ldLmZsYWc7IGkrKykKLSAgICAgICAgaWYgKGNwdV9mbGFncyAmIGNwdV9mbGFnX3RhYltpXS5mbGFnKQotICAgICAgICAgICAgcHJpbnRmKCIgJXMiLCBjcHVfZmxhZ190YWJbaV0ubmFtZSk7Ci0gICAgcHJpbnRmKCJcbiIpOworICAgIHJldHVybiA4OwogfQotCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgY3B1X2ZsYWdzX3JhdyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKLSAgICBpbnQgY3B1X2ZsYWdzX2VmZjsKLSAgICBpbnQgY3B1X2NvdW50ID0gYXZfY3B1X2NvdW50KCk7Ci0gICAgY2hhciB0aHJlYWRzWzVdID0gImF1dG8iOwotICAgIGludCBpOwotCi0gICAgZm9yKGkgPSAwOyBjcHVfZmxhZ190YWJbaV0uZmxhZzsgaSsrKSB7Ci0gICAgICAgIHVuc2lnbmVkIHRtcCA9IDA7Ci0gICAgICAgIGlmIChhdl9wYXJzZV9jcHVfY2FwcygmdG1wLCBjcHVfZmxhZ190YWJbaV0ubmFtZSkgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlRhYmxlIG1pc3NpbmcgJXNcbiIsIGNwdV9mbGFnX3RhYltpXS5uYW1lKTsKLSAgICAgICAgICAgIHJldHVybiA0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGNwdV9mbGFnc19yYXcgPCAwKQotICAgICAgICByZXR1cm4gMTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgaW50IGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImM6dDoiKTsKLSAgICAgICAgaWYgKGMgPT0gLTEpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgIGNhc2UgJ2MnOgotICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBmbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKLSAgICAgICAgICAgIGlmIChhdl9wYXJzZV9jcHVfY2FwcygmZmxhZ3MsIG9wdGFyZykgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgICAgICBhdl9mb3JjZV9jcHVfZmxhZ3MoZmxhZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAndCc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBsZW4gPSBhdl9zdHJsY3B5KHRocmVhZHMsIG9wdGFyZywgc2l6ZW9mKHRocmVhZHMpKTsKLSAgICAgICAgICAgIGlmIChsZW4gPj0gc2l6ZW9mKHRocmVhZHMpKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHRocmVhZCBjb3VudCAnJXMnXG4iLCBvcHRhcmcpOwotICAgICAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjcHVfZmxhZ3NfZWZmID0gYXZfZ2V0X2NwdV9mbGFncygpOwotCi0gICAgaWYgKGNwdV9mbGFnc19lZmYgPCAwKQotICAgICAgICByZXR1cm4gMzsKLQotICAgIHByaW50X2NwdV9mbGFncyhjcHVfZmxhZ3NfcmF3LCAicmF3Iik7Ci0gICAgcHJpbnRfY3B1X2ZsYWdzKGNwdV9mbGFnc19lZmYsICJlZmZlY3RpdmUiKTsKLSAgICBwcmludGYoInRocmVhZHMgPSAlcyAoY3B1X2NvdW50ID0gJWQpXG4iLCB0aHJlYWRzLCBjcHVfY291bnQpOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2NwdS5oIGIvbGliYXZ1dGlsL2NwdS5oCmluZGV4IGNjNGUzMGMuLjhiYjllYjYgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9jcHUuaAorKysgYi9saWJhdnV0aWwvY3B1LmgKQEAgLTIxLDYgKzIxLDggQEAKICNpZm5kZWYgQVZVVElMX0NQVV9ICiAjZGVmaW5lIEFWVVRJTF9DUFVfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKICNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCiAKICNkZWZpbmUgQVZfQ1BVX0ZMQUdfRk9SQ0UgICAgMHg4MDAwMDAwMCAvKiBmb3JjZSB1c2FnZSBvZiBzZWxlY3RlZCBmbGFncyAoT1IpICovCkBAIC0zOSw2ICs0MSw3IEBACiAjZGVmaW5lIEFWX0NQVV9GTEFHX1NTRTNTTE9XIDB4MjAwMDAwMDAgLy8vPCBTU0UzIHN1cHBvcnRlZCwgYnV0IHVzdWFsbHkgbm90IGZhc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdGhhbiByZWd1bGFyIE1NWC9TU0UgKGUuZy4gQ29yZTEpCiAjZGVmaW5lIEFWX0NQVV9GTEFHX1NTU0UzICAgICAgICAweDAwODAgLy8vPCBDb25yb2UgU1NTRTMgZnVuY3Rpb25zCisjZGVmaW5lIEFWX0NQVV9GTEFHX1NTU0UzU0xPVyAweDQwMDAwMDAgLy8vPCBTU1NFMyBzdXBwb3J0ZWQsIGJ1dCB1c3VhbGx5IG5vdCBmYXN0ZXIKICNkZWZpbmUgQVZfQ1BVX0ZMQUdfQVRPTSAgICAgMHgxMDAwMDAwMCAvLy88IEF0b20gcHJvY2Vzc29yLCBzb21lIFNTU0UzIGluc3RydWN0aW9ucyBhcmUgc2xvd2VyCiAjZGVmaW5lIEFWX0NQVV9GTEFHX1NTRTQgICAgICAgICAweDAxMDAgLy8vPCBQZW5yeW4gU1NFNC4xIGZ1bmN0aW9ucwogI2RlZmluZSBBVl9DUFVfRkxBR19TU0U0MiAgICAgICAgMHgwMjAwIC8vLzwgTmVoYWxlbSBTU0U0LjIgZnVuY3Rpb25zCkBAIC01Miw2ICs1NSw3IEBACiAjZGVmaW5lIEFWX0NQVV9GTEFHX0ZNQTMgICAgICAgIDB4MTAwMDAgLy8vPCBIYXN3ZWxsIEZNQTMgZnVuY3Rpb25zCiAjZGVmaW5lIEFWX0NQVV9GTEFHX0JNSTEgICAgICAgIDB4MjAwMDAgLy8vPCBCaXQgTWFuaXB1bGF0aW9uIEluc3RydWN0aW9uIFNldCAxCiAjZGVmaW5lIEFWX0NQVV9GTEFHX0JNSTIgICAgICAgIDB4NDAwMDAgLy8vPCBCaXQgTWFuaXB1bGF0aW9uIEluc3RydWN0aW9uIFNldCAyCisjZGVmaW5lIEFWX0NQVV9GTEFHX0FWWDUxMiAgICAgMHgxMDAwMDAgLy8vPCBBVlgtNTEyIGZ1bmN0aW9uczogcmVxdWlyZXMgT1Mgc3VwcG9ydCBldmVuIGlmIFlNTS9aTU0gcmVnaXN0ZXJzIGFyZW4ndCB1c2VkCiAKICNkZWZpbmUgQVZfQ1BVX0ZMQUdfQUxUSVZFQyAgICAgIDB4MDAwMSAvLy88IHN0YW5kYXJkCiAjZGVmaW5lIEFWX0NQVV9GTEFHX1ZTWCAgICAgICAgICAweDAwMDIgLy8vPCBJU0EgMi4wNgpAQCAtNzAsNyArNzQsNyBAQAogLyoqCiAgKiBSZXR1cm4gdGhlIGZsYWdzIHdoaWNoIHNwZWNpZnkgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgYnkgdGhlIENQVS4KICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhZmZlY3RlZCBieSBhdl9mb3JjZV9jcHVfZmxhZ3MoKSBpZiB0aGF0IHdhcyB1c2VkCi0gKiBiZWZvcmUuIFNvIGF2X2dldF9jcHVfZmxhZ3MoKSBjYW4gZWFzaWx5IGJlIHVzZWQgaW4gYSBhcHBsaWNhdGlvbiB0bworICogYmVmb3JlLiBTbyBhdl9nZXRfY3B1X2ZsYWdzKCkgY2FuIGVhc2lseSBiZSB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIHRvCiAgKiBkZXRlY3QgdGhlIGVuYWJsZWQgY3B1IGZsYWdzLgogICovCiBpbnQgYXZfZ2V0X2NwdV9mbGFncyh2b2lkKTsKQEAgLTg1LDggKzg5LDYgQEAKICAqIFNldCBhIG1hc2sgb24gZmxhZ3MgcmV0dXJuZWQgYnkgYXZfZ2V0X2NwdV9mbGFncygpLgogICogVGhpcyBmdW5jdGlvbiBpcyBtYWlubHkgdXNlZnVsIGZvciB0ZXN0aW5nLgogICogUGxlYXNlIHVzZSBhdl9mb3JjZV9jcHVfZmxhZ3MoKSBhbmQgYXZfZ2V0X2NwdV9mbGFncygpIGluc3RlYWQgd2hpY2ggYXJlIG1vcmUgZmxleGlibGUKLSAqCi0gKiBAd2FybmluZyB0aGlzIGZ1bmN0aW9uIGlzIG5vdCB0aHJlYWQgc2FmZS4KICAqLwogYXR0cmlidXRlX2RlcHJlY2F0ZWQgdm9pZCBhdl9zZXRfY3B1X2ZsYWdzX21hc2soaW50IG1hc2spOwogCkBAIC0xMTQsNCArMTE2LDE1IEBACiAgKi8KIGludCBhdl9jcHVfY291bnQodm9pZCk7CiAKKy8qKgorICogR2V0IHRoZSBtYXhpbXVtIGRhdGEgYWxpZ25tZW50IHRoYXQgbWF5IGJlIHJlcXVpcmVkIGJ5IEZGbXBlZy4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBpcyBhZmZlY3RlZCBieSB0aGUgYnVpbGQgY29uZmlndXJhdGlvbiBhbmQgdGhlIENQVSBmbGFncyBtYXNrLAorICogc28gZS5nLiBpZiB0aGUgQ1BVIHN1cHBvcnRzIEFWWCwgYnV0IGxpYmF2dXRpbCBoYXMgYmVlbiBidWlsdCB3aXRoCisgKiAtLWRpc2FibGUtYXZ4IG9yIHRoZSBBVl9DUFVfRkxBR19BVlggZmxhZyBoYXMgYmVlbiBkaXNhYmxlZCB0aHJvdWdoCisgKiAgYXZfc2V0X2NwdV9mbGFnc19tYXNrKCksIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIGJlaGF2ZSBhcyBpZiBBVlggaXMgbm90CisgKiAgcHJlc2VudC4KKyAqLworc2l6ZV90IGF2X2NwdV9tYXhfYWxpZ24odm9pZCk7CisKICNlbmRpZiAvKiBBVlVUSUxfQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9jcHVfaW50ZXJuYWwuaCBiL2xpYmF2dXRpbC9jcHVfaW50ZXJuYWwuaAppbmRleCA2YzM1MmFiLi4zNzEyMmQxIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvY3B1X2ludGVybmFsLmgKKysrIGIvbGliYXZ1dGlsL2NwdV9pbnRlcm5hbC5oCkBAIC0xOSw2ICsxOSw4IEBACiAjaWZuZGVmIEFWVVRJTF9DUFVfSU5URVJOQUxfSAogI2RlZmluZSBBVlVUSUxfQ1BVX0lOVEVSTkFMX0gKIAorI2luY2x1ZGUgImNvbmZpZy5oIgorCiAjaW5jbHVkZSAiY3B1LmgiCiAKICNkZWZpbmUgQ1BVRVhUX1NVRkZJWChmbGFncywgc3VmZml4LCBjcHVleHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTQ0LDQgKzQ2LDkgQEAKIGludCBmZl9nZXRfY3B1X2ZsYWdzX3BwYyh2b2lkKTsKIGludCBmZl9nZXRfY3B1X2ZsYWdzX3g4Nih2b2lkKTsKIAorc2l6ZV90IGZmX2dldF9jcHVfbWF4X2FsaWduX2FhcmNoNjQodm9pZCk7CitzaXplX3QgZmZfZ2V0X2NwdV9tYXhfYWxpZ25fYXJtKHZvaWQpOworc2l6ZV90IGZmX2dldF9jcHVfbWF4X2FsaWduX3BwYyh2b2lkKTsKK3NpemVfdCBmZl9nZXRfY3B1X21heF9hbGlnbl94ODYodm9pZCk7CisKICNlbmRpZiAvKiBBVlVUSUxfQ1BVX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9jcmMuYyBiL2xpYmF2dXRpbC9jcmMuYwppbmRleCA1YTFkZGYwLi5jNDVlYTYzIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvY3JjLmMKKysrIGIvbGliYXZ1dGlsL2NyYy5jCkBAIC0xOSw4ICsxOSwxMSBAQAogICovCiAKICNpbmNsdWRlICJjb25maWcuaCIKLSNpbmNsdWRlICJjb21tb24uaCIKKworI2luY2x1ZGUgInRocmVhZC5oIgorI2luY2x1ZGUgImF2YXNzZXJ0LmgiCiAjaW5jbHVkZSAiYnN3YXAuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKICNpbmNsdWRlICJjcmMuaCIKIAogI2lmIENPTkZJR19IQVJEQ09ERURfVEFCTEVTCkBAIC00OSw2ICs1MiwzMCBAQAogICAgICAgICAweERFLCAweEQ5LCAweEQwLCAweEQ3LCAweEMyLCAweEM1LCAweENDLCAweENCLCAweEU2LCAweEUxLCAweEU4LCAweEVGLAogICAgICAgICAweEZBLCAweEZELCAweEY0LCAweEYzLCAweDAxCiAgICAgfSwKKyAgICBbQVZfQ1JDXzhfRUJVXSA9IHsKKyAgICAgICAgMHgwMCwgMHgxRCwgMHgzQSwgMHgyNywgMHg3NCwgMHg2OSwgMHg0RSwgMHg1MywgMHhFOCwgMHhGNSwgMHhEMiwgMHhDRiwKKyAgICAgICAgMHg5QywgMHg4MSwgMHhBNiwgMHhCQiwgMHhDRCwgMHhEMCwgMHhGNywgMHhFQSwgMHhCOSwgMHhBNCwgMHg4MywgMHg5RSwKKyAgICAgICAgMHgyNSwgMHgzOCwgMHgxRiwgMHgwMiwgMHg1MSwgMHg0QywgMHg2QiwgMHg3NiwgMHg4NywgMHg5QSwgMHhCRCwgMHhBMCwKKyAgICAgICAgMHhGMywgMHhFRSwgMHhDOSwgMHhENCwgMHg2RiwgMHg3MiwgMHg1NSwgMHg0OCwgMHgxQiwgMHgwNiwgMHgyMSwgMHgzQywKKyAgICAgICAgMHg0QSwgMHg1NywgMHg3MCwgMHg2RCwgMHgzRSwgMHgyMywgMHgwNCwgMHgxOSwgMHhBMiwgMHhCRiwgMHg5OCwgMHg4NSwKKyAgICAgICAgMHhENiwgMHhDQiwgMHhFQywgMHhGMSwgMHgxMywgMHgwRSwgMHgyOSwgMHgzNCwgMHg2NywgMHg3QSwgMHg1RCwgMHg0MCwKKyAgICAgICAgMHhGQiwgMHhFNiwgMHhDMSwgMHhEQywgMHg4RiwgMHg5MiwgMHhCNSwgMHhBOCwgMHhERSwgMHhDMywgMHhFNCwgMHhGOSwKKyAgICAgICAgMHhBQSwgMHhCNywgMHg5MCwgMHg4RCwgMHgzNiwgMHgyQiwgMHgwQywgMHgxMSwgMHg0MiwgMHg1RiwgMHg3OCwgMHg2NSwKKyAgICAgICAgMHg5NCwgMHg4OSwgMHhBRSwgMHhCMywgMHhFMCwgMHhGRCwgMHhEQSwgMHhDNywgMHg3QywgMHg2MSwgMHg0NiwgMHg1QiwKKyAgICAgICAgMHgwOCwgMHgxNSwgMHgzMiwgMHgyRiwgMHg1OSwgMHg0NCwgMHg2MywgMHg3RSwgMHgyRCwgMHgzMCwgMHgxNywgMHgwQSwKKyAgICAgICAgMHhCMSwgMHhBQywgMHg4QiwgMHg5NiwgMHhDNSwgMHhEOCwgMHhGRiwgMHhFMiwgMHgyNiwgMHgzQiwgMHgxQywgMHgwMSwKKyAgICAgICAgMHg1MiwgMHg0RiwgMHg2OCwgMHg3NSwgMHhDRSwgMHhEMywgMHhGNCwgMHhFOSwgMHhCQSwgMHhBNywgMHg4MCwgMHg5RCwKKyAgICAgICAgMHhFQiwgMHhGNiwgMHhEMSwgMHhDQywgMHg5RiwgMHg4MiwgMHhBNSwgMHhCOCwgMHgwMywgMHgxRSwgMHgzOSwgMHgyNCwKKyAgICAgICAgMHg3NywgMHg2QSwgMHg0RCwgMHg1MCwgMHhBMSwgMHhCQywgMHg5QiwgMHg4NiwgMHhENSwgMHhDOCwgMHhFRiwgMHhGMiwKKyAgICAgICAgMHg0OSwgMHg1NCwgMHg3MywgMHg2RSwgMHgzRCwgMHgyMCwgMHgwNywgMHgxQSwgMHg2QywgMHg3MSwgMHg1NiwgMHg0QiwKKyAgICAgICAgMHgxOCwgMHgwNSwgMHgyMiwgMHgzRiwgMHg4NCwgMHg5OSwgMHhCRSwgMHhBMywgMHhGMCwgMHhFRCwgMHhDQSwgMHhENywKKyAgICAgICAgMHgzNSwgMHgyOCwgMHgwRiwgMHgxMiwgMHg0MSwgMHg1QywgMHg3QiwgMHg2NiwgMHhERCwgMHhDMCwgMHhFNywgMHhGQSwKKyAgICAgICAgMHhBOSwgMHhCNCwgMHg5MywgMHg4RSwgMHhGOCwgMHhFNSwgMHhDMiwgMHhERiwgMHg4QywgMHg5MSwgMHhCNiwgMHhBQiwKKyAgICAgICAgMHgxMCwgMHgwRCwgMHgyQSwgMHgzNywgMHg2NCwgMHg3OSwgMHg1RSwgMHg0MywgMHhCMiwgMHhBRiwgMHg4OCwgMHg5NSwKKyAgICAgICAgMHhDNiwgMHhEQiwgMHhGQywgMHhFMSwgMHg1QSwgMHg0NywgMHg2MCwgMHg3RCwgMHgyRSwgMHgzMywgMHgxNCwgMHgwOSwKKyAgICAgICAgMHg3RiwgMHg2MiwgMHg0NSwgMHg1OCwgMHgwQiwgMHgxNiwgMHgzMSwgMHgyQywgMHg5NywgMHg4QSwgMHhBRCwgMHhCMCwKKyAgICAgICAgMHhFMywgMHhGRSwgMHhEOSwgMHhDNCwgMHgwMQorICAgIH0sCiAgICAgW0FWX0NSQ18xNl9BTlNJXSA9IHsKICAgICAgICAgMHgwMDAwLCAweDA1ODAsIDB4MEY4MCwgMHgwQTAwLCAweDFCODAsIDB4MUUwMCwgMHgxNDAwLCAweDExODAsCiAgICAgICAgIDB4MzM4MCwgMHgzNjAwLCAweDNDMDAsIDB4Mzk4MCwgMHgyODAwLCAweDJEODAsIDB4Mjc4MCwgMHgyMjAwLApAQCAtMjkwLDIwICszMTcsMjUgQEAKICNlbHNlCiAjZGVmaW5lIENSQ19UQUJMRV9TSVpFIDEwMjQKICNlbmRpZgotc3RhdGljIHN0cnVjdCB7Ci0gICAgdWludDhfdCAgbGU7Ci0gICAgdWludDhfdCAgYml0czsKLSAgICB1aW50MzJfdCBwb2x5OwotfSBhdl9jcmNfdGFibGVfcGFyYW1zW0FWX0NSQ19NQVhdID0gewotICAgIFtBVl9DUkNfOF9BVE1dICAgICAgPSB7IDAsICA4LCAgICAgICAweDA3IH0sCi0gICAgW0FWX0NSQ18xNl9BTlNJXSAgICA9IHsgMCwgMTYsICAgICAweDgwMDUgfSwKLSAgICBbQVZfQ1JDXzE2X0NDSVRUXSAgID0geyAwLCAxNiwgICAgIDB4MTAyMSB9LAotICAgIFtBVl9DUkNfMjRfSUVFRV0gICAgPSB7IDAsIDI0LCAgIDB4ODY0Q0ZCIH0sCi0gICAgW0FWX0NSQ18zMl9JRUVFXSAgICA9IHsgMCwgMzIsIDB4MDRDMTFEQjcgfSwKLSAgICBbQVZfQ1JDXzMyX0lFRUVfTEVdID0geyAxLCAzMiwgMHhFREI4ODMyMCB9LAotICAgIFtBVl9DUkNfMTZfQU5TSV9MRV0gPSB7IDEsIDE2LCAgICAgMHhBMDAxIH0sCi19Owogc3RhdGljIEFWQ1JDIGF2X2NyY190YWJsZVtBVl9DUkNfTUFYXVtDUkNfVEFCTEVfU0laRV07CisKKyNkZWZpbmUgREVDTEFSRV9DUkNfSU5JVF9UQUJMRV9PTkNFKGlkLCBsZSwgYml0cywgcG9seSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQVZPbmNlIGlkICMjIF9vbmNlX2NvbnRyb2wgPSBBVl9PTkNFX0lOSVQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgaWQgIyMgX2luaXRfdGFibGVfb25jZSh2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXZfYXNzZXJ0MChhdl9jcmNfaW5pdChhdl9jcmNfdGFibGVbaWRdLCBsZSwgYml0cywgcG9seSwgc2l6ZW9mKGF2X2NyY190YWJsZVtpZF0pKSA+PSAwKTsgXAorfQorCisjZGVmaW5lIENSQ19JTklUX1RBQkxFX09OQ0UoaWQpIGZmX3RocmVhZF9vbmNlKCZpZCAjIyBfb25jZV9jb250cm9sLCBpZCAjIyBfaW5pdF90YWJsZV9vbmNlKQorCitERUNMQVJFX0NSQ19JTklUX1RBQkxFX09OQ0UoQVZfQ1JDXzhfQVRNLCAgICAgIDAsICA4LCAgICAgICAweDA3KQorREVDTEFSRV9DUkNfSU5JVF9UQUJMRV9PTkNFKEFWX0NSQ184X0VCVSwgICAgICAwLCAgOCwgICAgICAgMHgxRCkKK0RFQ0xBUkVfQ1JDX0lOSVRfVEFCTEVfT05DRShBVl9DUkNfMTZfQU5TSSwgICAgMCwgMTYsICAgICAweDgwMDUpCitERUNMQVJFX0NSQ19JTklUX1RBQkxFX09OQ0UoQVZfQ1JDXzE2X0NDSVRULCAgIDAsIDE2LCAgICAgMHgxMDIxKQorREVDTEFSRV9DUkNfSU5JVF9UQUJMRV9PTkNFKEFWX0NSQ18yNF9JRUVFLCAgICAwLCAyNCwgICAweDg2NENGQikKK0RFQ0xBUkVfQ1JDX0lOSVRfVEFCTEVfT05DRShBVl9DUkNfMzJfSUVFRSwgICAgMCwgMzIsIDB4MDRDMTFEQjcpCitERUNMQVJFX0NSQ19JTklUX1RBQkxFX09OQ0UoQVZfQ1JDXzMyX0lFRUVfTEUsIDEsIDMyLCAweEVEQjg4MzIwKQorREVDTEFSRV9DUkNfSU5JVF9UQUJMRV9PTkNFKEFWX0NSQ18xNl9BTlNJX0xFLCAxLCAxNiwgICAgIDB4QTAwMSkKICNlbmRpZgogCiBpbnQgYXZfY3JjX2luaXQoQVZDUkMgKmN0eCwgaW50IGxlLCBpbnQgYml0cywgdWludDMyX3QgcG9seSwgaW50IGN0eF9zaXplKQpAQCAtMzMyLDcgKzM2NCw3IEBACiAgICAgaWYgKGN0eF9zaXplID49IHNpemVvZihBVkNSQykgKiAxMDI0KQogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCiAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgICAgIGN0eFsyNTYgKihqICsgMSkgKyBpXSA9CisgICAgICAgICAgICAgICAgY3R4WzI1NiAqIChqICsgMSkgKyBpXSA9CiAgICAgICAgICAgICAgICAgICAgIChjdHhbMjU2ICogaiArIGldID4+IDgpIF4gY3R4W2N0eFsyNTYgKiBqICsgaV0gJiAweEZGXTsKICNlbmRpZgogCkBAIC0zNDIsMTMgKzM3NCwxNyBAQAogY29uc3QgQVZDUkMgKmF2X2NyY19nZXRfdGFibGUoQVZDUkNJZCBjcmNfaWQpCiB7CiAjaWYgIUNPTkZJR19IQVJEQ09ERURfVEFCTEVTCi0gICAgaWYgKCFhdl9jcmNfdGFibGVbY3JjX2lkXVtGRl9BUlJBWV9FTEVNUyhhdl9jcmNfdGFibGVbY3JjX2lkXSkgLSAxXSkKLSAgICAgICAgaWYgKGF2X2NyY19pbml0KGF2X2NyY190YWJsZVtjcmNfaWRdLAotICAgICAgICAgICAgICAgICAgICAgICAgYXZfY3JjX3RhYmxlX3BhcmFtc1tjcmNfaWRdLmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgYXZfY3JjX3RhYmxlX3BhcmFtc1tjcmNfaWRdLmJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdl9jcmNfdGFibGVfcGFyYW1zW2NyY19pZF0ucG9seSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhdl9jcmNfdGFibGVbY3JjX2lkXSkpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIHN3aXRjaCAoY3JjX2lkKSB7CisgICAgY2FzZSBBVl9DUkNfOF9BVE06ICAgICAgQ1JDX0lOSVRfVEFCTEVfT05DRShBVl9DUkNfOF9BVE0pOyBicmVhazsKKyAgICBjYXNlIEFWX0NSQ184X0VCVTogICAgICBDUkNfSU5JVF9UQUJMRV9PTkNFKEFWX0NSQ184X0VCVSk7IGJyZWFrOworICAgIGNhc2UgQVZfQ1JDXzE2X0FOU0k6ICAgIENSQ19JTklUX1RBQkxFX09OQ0UoQVZfQ1JDXzE2X0FOU0kpOyBicmVhazsKKyAgICBjYXNlIEFWX0NSQ18xNl9DQ0lUVDogICBDUkNfSU5JVF9UQUJMRV9PTkNFKEFWX0NSQ18xNl9DQ0lUVCk7IGJyZWFrOworICAgIGNhc2UgQVZfQ1JDXzI0X0lFRUU6ICAgIENSQ19JTklUX1RBQkxFX09OQ0UoQVZfQ1JDXzI0X0lFRUUpOyBicmVhazsKKyAgICBjYXNlIEFWX0NSQ18zMl9JRUVFOiAgICBDUkNfSU5JVF9UQUJMRV9PTkNFKEFWX0NSQ18zMl9JRUVFKTsgYnJlYWs7CisgICAgY2FzZSBBVl9DUkNfMzJfSUVFRV9MRTogQ1JDX0lOSVRfVEFCTEVfT05DRShBVl9DUkNfMzJfSUVFRV9MRSk7IGJyZWFrOworICAgIGNhc2UgQVZfQ1JDXzE2X0FOU0lfTEU6IENSQ19JTklUX1RBQkxFX09OQ0UoQVZfQ1JDXzE2X0FOU0lfTEUpOyBicmVhazsKKyAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOworICAgIH0KICNlbmRpZgogICAgIHJldHVybiBhdl9jcmNfdGFibGVbY3JjX2lkXTsKIH0KQEAgLTM3NywyOSArNDEzLDMgQEAKIAogICAgIHJldHVybiBjcmM7CiB9Ci0KLSNpZmRlZiBURVNUCi1pbnQgbWFpbih2b2lkKQotewotICAgIHVpbnQ4X3QgYnVmWzE5OTldOwotICAgIGludCBpOwotICAgIHVuc2lnbmVkCi0gICAgICAgIHBbNl1bM10gPSB7IHsgQVZfQ1JDXzMyX0lFRUVfTEUsIDB4RURCODgzMjAsIDB4M0Q1Q0REMDQgfSwKLSAgICAgICAgICAgICAgICAgICAgeyBBVl9DUkNfMzJfSUVFRSAgICwgMHgwNEMxMURCNywgMHhDMEY1QkFFMCB9LAotICAgICAgICAgICAgICAgICAgICB7IEFWX0NSQ18yNF9JRUVFICAgLCAweDg2NENGQiAgLCAweEI3MDRDRSAgIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgQVZfQ1JDXzE2X0FOU0lfTEUsIDB4QTAwMSAgICAsIDB4QkZEOCAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgeyBBVl9DUkNfMTZfQU5TSSAgICwgMHg4MDA1ICAgICwgMHgxRkJCICAgICB9LAotICAgICAgICAgICAgICAgICAgICB7IEFWX0NSQ184X0FUTSAgICAgLCAweDA3ICAgICAgLCAweEUzICAgICAgIH0KLSAgICB9OwotICAgIGNvbnN0IEFWQ1JDICpjdHg7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGJ1Zik7IGkrKykKLSAgICAgICAgYnVmW2ldID0gaSArIGkgKiBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgICBjdHggPSBhdl9jcmNfZ2V0X3RhYmxlKHBbaV1bMF0pOwotICAgICAgICBwcmludGYoImNyYyAlMDhYID0gJVhcbiIsIHBbaV1bMV0sIGF2X2NyYyhjdHgsIDAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9jcmMuaCBiL2xpYmF2dXRpbC9jcmMuaAppbmRleCBlZjhhNzEzLi40N2UyMmI0IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvY3JjLmgKKysrIGIvbGliYXZ1dGlsL2NyYy5oCkBAIC0xOCw2ICsxOCwxMiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdnVfY3JjMzIKKyAqIFB1YmxpYyBoZWFkZXIgZm9yIENSQyBoYXNoIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLgorICovCisKICNpZm5kZWYgQVZVVElMX0NSQ19ICiAjZGVmaW5lIEFWVVRJTF9DUkNfSAogCkBAIC0yNyw4ICszMywxNCBAQAogI2luY2x1ZGUgInZlcnNpb24uaCIKIAogLyoqCi0gKiBAZGVmZ3JvdXAgbGF2dV9jcmMzMiBDUkMzMgotICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEBkZWZncm91cCBsYXZ1X2NyYzMyIENSQworICogQGluZ3JvdXAgbGF2dV9oYXNoCisgKiBDUkMgKEN5Y2xpYyBSZWR1bmRhbmN5IENoZWNrKSBoYXNoIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFRoaXMgbW9kdWxlIHN1cHBvcnRzIG51bWVyb3VzIENSQyBwb2x5bm9taWFscywgaW4gYWRkaXRpb24gdG8gdGhlIG1vc3QKKyAqIHdpZGVseSB1c2VkIENSQy0zMi1JRUVFLiBTZWUgQHJlZiBBVkNSQ0lkIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlCisgKiBwb2x5bm9taWFscy4KKyAqCiAgKiBAewogICovCiAKQEAgLTQxLDExICs1Myw4IEBACiAgICAgQVZfQ1JDXzMyX0lFRUUsCiAgICAgQVZfQ1JDXzMyX0lFRUVfTEUsICAvKjwgcmV2ZXJzZWQgYml0b3JkZXIgdmVyc2lvbiBvZiBBVl9DUkNfMzJfSUVFRSAqLwogICAgIEFWX0NSQ18xNl9BTlNJX0xFLCAgLyo8IHJldmVyc2VkIGJpdG9yZGVyIHZlcnNpb24gb2YgQVZfQ1JDXzE2X0FOU0kgKi8KLSNpZiBGRl9BUElfQ1JDX0JJR19UQUJMRQotICAgIEFWX0NSQ18yNF9JRUVFID0gMTIsCi0jZWxzZQogICAgIEFWX0NSQ18yNF9JRUVFLAotI2VuZGlmIC8qIEZGX0FQSV9DUkNfQklHX1RBQkxFICovCisgICAgQVZfQ1JDXzhfRUJVLAogICAgIEFWX0NSQ19NQVgsICAgICAgICAgLyo8IE5vdCBwYXJ0IG9mIHB1YmxpYyBBUEkhIERvIG5vdCB1c2Ugb3V0c2lkZSBsaWJhdnV0aWwuICovCiB9QVZDUkNJZDsKIApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2Rlcy5jIGIvbGliYXZ1dGlsL2Rlcy5jCmluZGV4IDNjY2JmODkuLjY5NTc2NjYgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9kZXMuYworKysgYi9saWJhdnV0aWwvZGVzLmMKQEAgLTE4LDE0ICsxOCwxNiBAQAogICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCiAjaW5jbHVkZSAiYXZ1dGlsLmgiCiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAiaW50cmVhZHdyaXRlLmgiCiAjaW5jbHVkZSAibWVtLmgiCiAjaW5jbHVkZSAiZGVzLmgiCiAKLSNkZWZpbmUgVChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSA2NC1hLDY0LWIsNjQtYyw2NC1kLDY0LWUsNjQtZiw2NC1nLDY0LWgKKyNkZWZpbmUgVChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKSA2NCAtIGEsIDY0IC0gYiwgNjQgLSBjLCA2NCAtIGQsIDY0IC0gZSwgNjQgLSBmLCA2NCAtIGcsIDY0IC0gaAogc3RhdGljIGNvbnN0IHVpbnQ4X3QgSVBfc2h1ZmZsZVtdID0gewogICAgIFQoNTgsIDUwLCA0MiwgMzQsIDI2LCAxOCwgMTAsIDIpLAogICAgIFQoNjAsIDUyLCA0NCwgMzYsIDI4LCAyMCwgMTIsIDQpLApAQCAtMzksNyArNDEsNyBAQAogI3VuZGVmIFQKIAogI2lmIENPTkZJR19TTUFMTCB8fCBkZWZpbmVkKEdFTlRBQkxFUykKLSNkZWZpbmUgVChhLCBiLCBjLCBkKSAzMi1hLDMyLWIsMzItYywzMi1kCisjZGVmaW5lIFQoYSwgYiwgYywgZCkgMzIgLSBhLCAzMiAtIGIsIDMyIC0gYywgMzIgLSBkCiBzdGF0aWMgY29uc3QgdWludDhfdCBQX3NodWZmbGVbXSA9IHsKICAgICBUKDE2LCAgNywgMjAsIDIxKSwKICAgICBUKDI5LCAxMiwgMjgsIDE3KSwKQEAgLTUzLDcgKzU1LDcgQEAKICN1bmRlZiBUCiAjZW5kaWYKIAotI2RlZmluZSBUKGEsIGIsIGMsIGQsIGUsIGYsIGcpIDY0LWEsNjQtYiw2NC1jLDY0LWQsNjQtZSw2NC1mLDY0LWcKKyNkZWZpbmUgVChhLCBiLCBjLCBkLCBlLCBmLCBnKSA2NCAtIGEsIDY0IC0gYiwgNjQgLSBjLCA2NCAtIGQsIDY0IC0gZSwgNjQgLSBmLCA2NCAtIGcKIHN0YXRpYyBjb25zdCB1aW50OF90IFBDMV9zaHVmZmxlW10gPSB7CiAgICAgVCg1NywgNDksIDQxLCAzMywgMjUsIDE3LCAgOSksCiAgICAgVCggMSwgNTgsIDUwLCA0MiwgMzQsIDI2LCAxOCksCkBAIC02Niw3ICs2OCw3IEBACiB9OwogI3VuZGVmIFQKIAotI2RlZmluZSBUKGEsIGIsIGMsIGQsIGUsIGYpIDU2LWEsNTYtYiw1Ni1jLDU2LWQsNTYtZSw1Ni1mCisjZGVmaW5lIFQoYSwgYiwgYywgZCwgZSwgZikgNTYgLSBhLCA1NiAtIGIsIDU2IC0gYywgNTYgLSBkLCA1NiAtIGUsIDU2IC0gZgogc3RhdGljIGNvbnN0IHVpbnQ4X3QgUEMyX3NodWZmbGVbXSA9IHsKICAgICBUKDE0LCAxNywgMTEsIDI0LCAgMSwgIDUpLAogICAgIFQoIDMsIDI4LCAxNSwgIDYsIDIxLCAxMCksCkBAIC04MSwxMjIgKzgzLDk5IEBACiAKICNpZiBDT05GSUdfU01BTEwKIHN0YXRpYyBjb25zdCB1aW50OF90IFNfYm94ZXNbOF1bMzJdID0gewotICAgIHsKLSAgICAweDBlLCAweGY0LCAweDdkLCAweDQxLCAweGUyLCAweDJmLCAweGRiLCAweDE4LCAweGEzLCAweDZhLCAweGM2LCAweGJjLCAweDk1LCAweDU5LCAweDMwLCAweDg3LAotICAgIDB4ZjQsIDB4YzEsIDB4OGUsIDB4MjgsIDB4NGQsIDB4OTYsIDB4MTIsIDB4N2IsIDB4NWYsIDB4YmMsIDB4MzksIDB4ZTcsIDB4YTMsIDB4MGEsIDB4NjUsIDB4ZDAsCi0gICAgfSwgewotICAgIDB4M2YsIDB4ZDEsIDB4NDgsIDB4N2UsIDB4ZjYsIDB4MmIsIDB4ODMsIDB4ZTQsIDB4YzksIDB4MDcsIDB4MTIsIDB4YWQsIDB4NmMsIDB4OTAsIDB4YjUsIDB4NWEsCi0gICAgMHhkMCwgMHg4ZSwgMHhhNywgMHgxYiwgMHgzYSwgMHhmNCwgMHg0ZCwgMHgyMSwgMHhiNSwgMHg2OCwgMHg3YywgMHhjNiwgMHgwOSwgMHg1MywgMHhlMiwgMHg5ZiwKLSAgICB9LCB7Ci0gICAgMHhkYSwgMHg3MCwgMHgwOSwgMHg5ZSwgMHgzNiwgMHg0MywgMHg2ZiwgMHhhNSwgMHgyMSwgMHg4ZCwgMHg1YywgMHhlNywgMHhjYiwgMHhiNCwgMHhmMiwgMHgxOCwKLSAgICAweDFkLCAweGE2LCAweGQ0LCAweDA5LCAweDY4LCAweDlmLCAweDgzLCAweDcwLCAweDRiLCAweGYxLCAweGUyLCAweDNjLCAweGI1LCAweDVhLCAweDJlLCAweGM3LAotICAgIH0sIHsKLSAgICAweGQ3LCAweDhkLCAweGJlLCAweDUzLCAweDYwLCAweGY2LCAweDA5LCAweDNhLCAweDQxLCAweDcyLCAweDI4LCAweGM1LCAweDFiLCAweGFjLCAweGU0LCAweDlmLAotICAgIDB4M2EsIDB4ZjYsIDB4MDksIDB4NjAsIDB4YWMsIDB4MWIsIDB4ZDcsIDB4OGQsIDB4OWYsIDB4NDEsIDB4NTMsIDB4YmUsIDB4YzUsIDB4NzIsIDB4MjgsIDB4ZTQsCi0gICAgfSwgewotICAgIDB4ZTIsIDB4YmMsIDB4MjQsIDB4YzEsIDB4NDcsIDB4N2EsIDB4ZGIsIDB4MTYsIDB4NTgsIDB4MDUsIDB4ZjMsIDB4YWYsIDB4M2QsIDB4OTAsIDB4OGUsIDB4NjksCi0gICAgMHhiNCwgMHg4MiwgMHhjMSwgMHg3YiwgMHgxYSwgMHhlZCwgMHgyNywgMHhkOCwgMHg2ZiwgMHhmOSwgMHgwYywgMHg5NSwgMHhhNiwgMHg0MywgMHg1MCwgMHgzZSwKLSAgICB9LCB7Ci0gICAgMHhhYywgMHhmMSwgMHg0YSwgMHgyZiwgMHg3OSwgMHhjMiwgMHg5NiwgMHg1OCwgMHg2MCwgMHgxZCwgMHhkMywgMHhlNCwgMHgwZSwgMHhiNywgMHgzNSwgMHg4YiwKLSAgICAweDQ5LCAweDNlLCAweDJmLCAweGM1LCAweDkyLCAweDU4LCAweGZjLCAweGEzLCAweGI3LCAweGUwLCAweDE0LCAweDdhLCAweDYxLCAweDBkLCAweDhiLCAweGQ2LAotICAgIH0sIHsKLSAgICAweGQ0LCAweDBiLCAweGIyLCAweDdlLCAweDRmLCAweDkwLCAweDE4LCAweGFkLCAweGUzLCAweDNjLCAweDU5LCAweGM3LCAweDI1LCAweGZhLCAweDg2LCAweDYxLAotICAgIDB4NjEsIDB4YjQsIDB4ZGIsIDB4OGQsIDB4MWMsIDB4NDMsIDB4YTcsIDB4N2UsIDB4OWEsIDB4NWYsIDB4MDYsIDB4ZjgsIDB4ZTAsIDB4MjUsIDB4MzksIDB4YzIsCi0gICAgfSwgewotICAgIDB4MWQsIDB4ZjIsIDB4ZDgsIDB4ODQsIDB4YTYsIDB4M2YsIDB4N2IsIDB4NDEsIDB4Y2EsIDB4NTksIDB4NjMsIDB4YmUsIDB4MDUsIDB4ZTAsIDB4OWMsIDB4MjcsCi0gICAgMHgyNywgMHgxYiwgMHhlNCwgMHg3MSwgMHg0OSwgMHhhYywgMHg4ZSwgMHhkMiwgMHhmMCwgMHhjNiwgMHg5YSwgMHgwZCwgMHgzZiwgMHg1MywgMHg2NSwgMHhiOCwKKyAgICB7IDB4MGUsIDB4ZjQsIDB4N2QsIDB4NDEsIDB4ZTIsIDB4MmYsIDB4ZGIsIDB4MTgsIDB4YTMsIDB4NmEsIDB4YzYsIDB4YmMsIDB4OTUsIDB4NTksIDB4MzAsIDB4ODcsCisgICAgICAweGY0LCAweGMxLCAweDhlLCAweDI4LCAweDRkLCAweDk2LCAweDEyLCAweDdiLCAweDVmLCAweGJjLCAweDM5LCAweGU3LCAweGEzLCAweDBhLCAweDY1LCAweGQwLCB9LAorICAgIHsgMHgzZiwgMHhkMSwgMHg0OCwgMHg3ZSwgMHhmNiwgMHgyYiwgMHg4MywgMHhlNCwgMHhjOSwgMHgwNywgMHgxMiwgMHhhZCwgMHg2YywgMHg5MCwgMHhiNSwgMHg1YSwKKyAgICAgIDB4ZDAsIDB4OGUsIDB4YTcsIDB4MWIsIDB4M2EsIDB4ZjQsIDB4NGQsIDB4MjEsIDB4YjUsIDB4NjgsIDB4N2MsIDB4YzYsIDB4MDksIDB4NTMsIDB4ZTIsIDB4OWYsIH0sCisgICAgeyAweGRhLCAweDcwLCAweDA5LCAweDllLCAweDM2LCAweDQzLCAweDZmLCAweGE1LCAweDIxLCAweDhkLCAweDVjLCAweGU3LCAweGNiLCAweGI0LCAweGYyLCAweDE4LAorICAgICAgMHgxZCwgMHhhNiwgMHhkNCwgMHgwOSwgMHg2OCwgMHg5ZiwgMHg4MywgMHg3MCwgMHg0YiwgMHhmMSwgMHhlMiwgMHgzYywgMHhiNSwgMHg1YSwgMHgyZSwgMHhjNywgfSwKKyAgICB7IDB4ZDcsIDB4OGQsIDB4YmUsIDB4NTMsIDB4NjAsIDB4ZjYsIDB4MDksIDB4M2EsIDB4NDEsIDB4NzIsIDB4MjgsIDB4YzUsIDB4MWIsIDB4YWMsIDB4ZTQsIDB4OWYsCisgICAgICAweDNhLCAweGY2LCAweDA5LCAweDYwLCAweGFjLCAweDFiLCAweGQ3LCAweDhkLCAweDlmLCAweDQxLCAweDUzLCAweGJlLCAweGM1LCAweDcyLCAweDI4LCAweGU0LCB9LAorICAgIHsgMHhlMiwgMHhiYywgMHgyNCwgMHhjMSwgMHg0NywgMHg3YSwgMHhkYiwgMHgxNiwgMHg1OCwgMHgwNSwgMHhmMywgMHhhZiwgMHgzZCwgMHg5MCwgMHg4ZSwgMHg2OSwKKyAgICAgIDB4YjQsIDB4ODIsIDB4YzEsIDB4N2IsIDB4MWEsIDB4ZWQsIDB4MjcsIDB4ZDgsIDB4NmYsIDB4ZjksIDB4MGMsIDB4OTUsIDB4YTYsIDB4NDMsIDB4NTAsIDB4M2UsIH0sCisgICAgeyAweGFjLCAweGYxLCAweDRhLCAweDJmLCAweDc5LCAweGMyLCAweDk2LCAweDU4LCAweDYwLCAweDFkLCAweGQzLCAweGU0LCAweDBlLCAweGI3LCAweDM1LCAweDhiLAorICAgICAgMHg0OSwgMHgzZSwgMHgyZiwgMHhjNSwgMHg5MiwgMHg1OCwgMHhmYywgMHhhMywgMHhiNywgMHhlMCwgMHgxNCwgMHg3YSwgMHg2MSwgMHgwZCwgMHg4YiwgMHhkNiwgfSwKKyAgICB7IDB4ZDQsIDB4MGIsIDB4YjIsIDB4N2UsIDB4NGYsIDB4OTAsIDB4MTgsIDB4YWQsIDB4ZTMsIDB4M2MsIDB4NTksIDB4YzcsIDB4MjUsIDB4ZmEsIDB4ODYsIDB4NjEsCisgICAgICAweDYxLCAweGI0LCAweGRiLCAweDhkLCAweDFjLCAweDQzLCAweGE3LCAweDdlLCAweDlhLCAweDVmLCAweDA2LCAweGY4LCAweGUwLCAweDI1LCAweDM5LCAweGMyLCB9LAorICAgIHsgMHgxZCwgMHhmMiwgMHhkOCwgMHg4NCwgMHhhNiwgMHgzZiwgMHg3YiwgMHg0MSwgMHhjYSwgMHg1OSwgMHg2MywgMHhiZSwgMHgwNSwgMHhlMCwgMHg5YywgMHgyNywKKyAgICAgIDB4MjcsIDB4MWIsIDB4ZTQsIDB4NzEsIDB4NDksIDB4YWMsIDB4OGUsIDB4ZDIsIDB4ZjAsIDB4YzYsIDB4OWEsIDB4MGQsIDB4M2YsIDB4NTMsIDB4NjUsIDB4YjgsCiAgICAgfQogfTsKICNlbHNlCiAvKioKICAqIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgYm90aCB0aGUgUy1ib3ggYW5kIFAtc2h1ZmZsZS4KLSAqIEl0IGNhbiBiZSByZWdlbmVyYXRlZCBieSBjb21waWxpbmcgdGhpcyBmaWxlIHdpdGggLURDT05GSUdfU01BTEwgLURURVNUIC1ER0VOVEFCTEVTCisgKiBJdCBjYW4gYmUgcmVnZW5lcmF0ZWQgYnkgY29tcGlsaW5nIHRlc3RzL2Rlcy5jIHdpdGggIi1EQ09ORklHX1NNQUxMIC1ER0VOVEFCTEVTIi4KICAqLwogc3RhdGljIGNvbnN0IHVpbnQzMl90IFNfYm94ZXNfUF9zaHVmZmxlWzhdWzY0XSA9IHsKLSAgICB7Ci0gICAgMHgwMDgwODIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwODAwMCwgMHgwMDgwODIwMiwgMHgwMDgwODAwMiwgMHgwMDAwODIwMiwgMHgwMDAwMDAwMiwgMHgwMDAwODAwMCwKLSAgICAweDAwMDAwMjAwLCAweDAwODA4MjAwLCAweDAwODA4MjAyLCAweDAwMDAwMjAwLCAweDAwODAwMjAyLCAweDAwODA4MDAyLCAweDAwODAwMDAwLCAweDAwMDAwMDAyLAotICAgIDB4MDAwMDAyMDIsIDB4MDA4MDAyMDAsIDB4MDA4MDAyMDAsIDB4MDAwMDgyMDAsIDB4MDAwMDgyMDAsIDB4MDA4MDgwMDAsIDB4MDA4MDgwMDAsIDB4MDA4MDAyMDIsCi0gICAgMHgwMDAwODAwMiwgMHgwMDgwMDAwMiwgMHgwMDgwMDAwMiwgMHgwMDAwODAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDIwMiwgMHgwMDAwODIwMiwgMHgwMDgwMDAwMCwKLSAgICAweDAwMDA4MDAwLCAweDAwODA4MjAyLCAweDAwMDAwMDAyLCAweDAwODA4MDAwLCAweDAwODA4MjAwLCAweDAwODAwMDAwLCAweDAwODAwMDAwLCAweDAwMDAwMjAwLAotICAgIDB4MDA4MDgwMDIsIDB4MDAwMDgwMDAsIDB4MDAwMDgyMDAsIDB4MDA4MDAwMDIsIDB4MDAwMDAyMDAsIDB4MDAwMDAwMDIsIDB4MDA4MDAyMDIsIDB4MDAwMDgyMDIsCi0gICAgMHgwMDgwODIwMiwgMHgwMDAwODAwMiwgMHgwMDgwODAwMCwgMHgwMDgwMDIwMiwgMHgwMDgwMDAwMiwgMHgwMDAwMDIwMiwgMHgwMDAwODIwMiwgMHgwMDgwODIwMCwKLSAgICAweDAwMDAwMjAyLCAweDAwODAwMjAwLCAweDAwODAwMjAwLCAweDAwMDAwMDAwLCAweDAwMDA4MDAyLCAweDAwMDA4MjAwLCAweDAwMDAwMDAwLCAweDAwODA4MDAyLAotICAgIH0sCi0gICAgewotICAgIDB4NDAwODQwMTAsIDB4NDAwMDQwMDAsIDB4MDAwMDQwMDAsIDB4MDAwODQwMTAsIDB4MDAwODAwMDAsIDB4MDAwMDAwMTAsIDB4NDAwODAwMTAsIDB4NDAwMDQwMTAsCi0gICAgMHg0MDAwMDAxMCwgMHg0MDA4NDAxMCwgMHg0MDA4NDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwNDAwMCwgMHgwMDA4MDAwMCwgMHgwMDAwMDAxMCwgMHg0MDA4MDAxMCwKLSAgICAweDAwMDg0MDAwLCAweDAwMDgwMDEwLCAweDQwMDA0MDEwLCAweDAwMDAwMDAwLCAweDQwMDAwMDAwLCAweDAwMDA0MDAwLCAweDAwMDg0MDEwLCAweDQwMDgwMDAwLAotICAgIDB4MDAwODAwMTAsIDB4NDAwMDAwMTAsIDB4MDAwMDAwMDAsIDB4MDAwODQwMDAsIDB4MDAwMDQwMTAsIDB4NDAwODQwMDAsIDB4NDAwODAwMDAsIDB4MDAwMDQwMTAsCi0gICAgMHgwMDAwMDAwMCwgMHgwMDA4NDAxMCwgMHg0MDA4MDAxMCwgMHgwMDA4MDAwMCwgMHg0MDAwNDAxMCwgMHg0MDA4MDAwMCwgMHg0MDA4NDAwMCwgMHgwMDAwNDAwMCwKLSAgICAweDQwMDgwMDAwLCAweDQwMDA0MDAwLCAweDAwMDAwMDEwLCAweDQwMDg0MDEwLCAweDAwMDg0MDEwLCAweDAwMDAwMDEwLCAweDAwMDA0MDAwLCAweDQwMDAwMDAwLAotICAgIDB4MDAwMDQwMTAsIDB4NDAwODQwMDAsIDB4MDAwODAwMDAsIDB4NDAwMDAwMTAsIDB4MDAwODAwMTAsIDB4NDAwMDQwMTAsIDB4NDAwMDAwMTAsIDB4MDAwODAwMTAsCi0gICAgMHgwMDA4NDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwNDAwMCwgMHgwMDAwNDAxMCwgMHg0MDAwMDAwMCwgMHg0MDA4MDAxMCwgMHg0MDA4NDAxMCwgMHgwMDA4NDAwMCwKLSAgICB9LAotICAgIHsKLSAgICAweDAwMDAwMTA0LCAweDA0MDEwMTAwLCAweDAwMDAwMDAwLCAweDA0MDEwMDA0LCAweDA0MDAwMTAwLCAweDAwMDAwMDAwLCAweDAwMDEwMTA0LCAweDA0MDAwMTAwLAotICAgIDB4MDAwMTAwMDQsIDB4MDQwMDAwMDQsIDB4MDQwMDAwMDQsIDB4MDAwMTAwMDAsIDB4MDQwMTAxMDQsIDB4MDAwMTAwMDQsIDB4MDQwMTAwMDAsIDB4MDAwMDAxMDQsCi0gICAgMHgwNDAwMDAwMCwgMHgwMDAwMDAwNCwgMHgwNDAxMDEwMCwgMHgwMDAwMDEwMCwgMHgwMDAxMDEwMCwgMHgwNDAxMDAwMCwgMHgwNDAxMDAwNCwgMHgwMDAxMDEwNCwKLSAgICAweDA0MDAwMTA0LCAweDAwMDEwMTAwLCAweDAwMDEwMDAwLCAweDA0MDAwMTA0LCAweDAwMDAwMDA0LCAweDA0MDEwMTA0LCAweDAwMDAwMTAwLCAweDA0MDAwMDAwLAotICAgIDB4MDQwMTAxMDAsIDB4MDQwMDAwMDAsIDB4MDAwMTAwMDQsIDB4MDAwMDAxMDQsIDB4MDAwMTAwMDAsIDB4MDQwMTAxMDAsIDB4MDQwMDAxMDAsIDB4MDAwMDAwMDAsCi0gICAgMHgwMDAwMDEwMCwgMHgwMDAxMDAwNCwgMHgwNDAxMDEwNCwgMHgwNDAwMDEwMCwgMHgwNDAwMDAwNCwgMHgwMDAwMDEwMCwgMHgwMDAwMDAwMCwgMHgwNDAxMDAwNCwKLSAgICAweDA0MDAwMTA0LCAweDAwMDEwMDAwLCAweDA0MDAwMDAwLCAweDA0MDEwMTA0LCAweDAwMDAwMDA0LCAweDAwMDEwMTA0LCAweDAwMDEwMTAwLCAweDA0MDAwMDA0LAotICAgIDB4MDQwMTAwMDAsIDB4MDQwMDAxMDQsIDB4MDAwMDAxMDQsIDB4MDQwMTAwMDAsIDB4MDAwMTAxMDQsIDB4MDAwMDAwMDQsIDB4MDQwMTAwMDQsIDB4MDAwMTAxMDAsCi0gICAgfSwKLSAgICB7Ci0gICAgMHg4MDQwMTAwMCwgMHg4MDAwMTA0MCwgMHg4MDAwMTA0MCwgMHgwMDAwMDA0MCwgMHgwMDQwMTA0MCwgMHg4MDQwMDA0MCwgMHg4MDQwMDAwMCwgMHg4MDAwMTAwMCwKLSAgICAweDAwMDAwMDAwLCAweDAwNDAxMDAwLCAweDAwNDAxMDAwLCAweDgwNDAxMDQwLCAweDgwMDAwMDQwLCAweDAwMDAwMDAwLCAweDAwNDAwMDQwLCAweDgwNDAwMDAwLAotICAgIDB4ODAwMDAwMDAsIDB4MDAwMDEwMDAsIDB4MDA0MDAwMDAsIDB4ODA0MDEwMDAsIDB4MDAwMDAwNDAsIDB4MDA0MDAwMDAsIDB4ODAwMDEwMDAsIDB4MDAwMDEwNDAsCi0gICAgMHg4MDQwMDA0MCwgMHg4MDAwMDAwMCwgMHgwMDAwMTA0MCwgMHgwMDQwMDA0MCwgMHgwMDAwMTAwMCwgMHgwMDQwMTA0MCwgMHg4MDQwMTA0MCwgMHg4MDAwMDA0MCwKLSAgICAweDAwNDAwMDQwLCAweDgwNDAwMDAwLCAweDAwNDAxMDAwLCAweDgwNDAxMDQwLCAweDgwMDAwMDQwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwNDAxMDAwLAotICAgIDB4MDAwMDEwNDAsIDB4MDA0MDAwNDAsIDB4ODA0MDAwNDAsIDB4ODAwMDAwMDAsIDB4ODA0MDEwMDAsIDB4ODAwMDEwNDAsIDB4ODAwMDEwNDAsIDB4MDAwMDAwNDAsCi0gICAgMHg4MDQwMTA0MCwgMHg4MDAwMDA0MCwgMHg4MDAwMDAwMCwgMHgwMDAwMTAwMCwgMHg4MDQwMDAwMCwgMHg4MDAwMTAwMCwgMHgwMDQwMTA0MCwgMHg4MDQwMDA0MCwKLSAgICAweDgwMDAxMDAwLCAweDAwMDAxMDQwLCAweDAwNDAwMDAwLCAweDgwNDAxMDAwLCAweDAwMDAwMDQwLCAweDAwNDAwMDAwLCAweDAwMDAxMDAwLCAweDAwNDAxMDQwLAotICAgIH0sCi0gICAgewotICAgIDB4MDAwMDAwODAsIDB4MDEwNDAwODAsIDB4MDEwNDAwMDAsIDB4MjEwMDAwODAsIDB4MDAwNDAwMDAsIDB4MDAwMDAwODAsIDB4MjAwMDAwMDAsIDB4MDEwNDAwMDAsCi0gICAgMHgyMDA0MDA4MCwgMHgwMDA0MDAwMCwgMHgwMTAwMDA4MCwgMHgyMDA0MDA4MCwgMHgyMTAwMDA4MCwgMHgyMTA0MDAwMCwgMHgwMDA0MDA4MCwgMHgyMDAwMDAwMCwKLSAgICAweDAxMDAwMDAwLCAweDIwMDQwMDAwLCAweDIwMDQwMDAwLCAweDAwMDAwMDAwLCAweDIwMDAwMDgwLCAweDIxMDQwMDgwLCAweDIxMDQwMDgwLCAweDAxMDAwMDgwLAotICAgIDB4MjEwNDAwMDAsIDB4MjAwMDAwODAsIDB4MDAwMDAwMDAsIDB4MjEwMDAwMDAsIDB4MDEwNDAwODAsIDB4MDEwMDAwMDAsIDB4MjEwMDAwMDAsIDB4MDAwNDAwODAsCi0gICAgMHgwMDA0MDAwMCwgMHgyMTAwMDA4MCwgMHgwMDAwMDA4MCwgMHgwMTAwMDAwMCwgMHgyMDAwMDAwMCwgMHgwMTA0MDAwMCwgMHgyMTAwMDA4MCwgMHgyMDA0MDA4MCwKLSAgICAweDAxMDAwMDgwLCAweDIwMDAwMDAwLCAweDIxMDQwMDAwLCAweDAxMDQwMDgwLCAweDIwMDQwMDgwLCAweDAwMDAwMDgwLCAweDAxMDAwMDAwLCAweDIxMDQwMDAwLAotICAgIDB4MjEwNDAwODAsIDB4MDAwNDAwODAsIDB4MjEwMDAwMDAsIDB4MjEwNDAwODAsIDB4MDEwNDAwMDAsIDB4MDAwMDAwMDAsIDB4MjAwNDAwMDAsIDB4MjEwMDAwMDAsCi0gICAgMHgwMDA0MDA4MCwgMHgwMTAwMDA4MCwgMHgyMDAwMDA4MCwgMHgwMDA0MDAwMCwgMHgwMDAwMDAwMCwgMHgyMDA0MDAwMCwgMHgwMTA0MDA4MCwgMHgyMDAwMDA4MCwKLSAgICB9LAotICAgIHsKLSAgICAweDEwMDAwMDA4LCAweDEwMjAwMDAwLCAweDAwMDAyMDAwLCAweDEwMjAyMDA4LCAweDEwMjAwMDAwLCAweDAwMDAwMDA4LCAweDEwMjAyMDA4LCAweDAwMjAwMDAwLAotICAgIDB4MTAwMDIwMDAsIDB4MDAyMDIwMDgsIDB4MDAyMDAwMDAsIDB4MTAwMDAwMDgsIDB4MDAyMDAwMDgsIDB4MTAwMDIwMDAsIDB4MTAwMDAwMDAsIDB4MDAwMDIwMDgsCi0gICAgMHgwMDAwMDAwMCwgMHgwMDIwMDAwOCwgMHgxMDAwMjAwOCwgMHgwMDAwMjAwMCwgMHgwMDIwMjAwMCwgMHgxMDAwMjAwOCwgMHgwMDAwMDAwOCwgMHgxMDIwMDAwOCwKLSAgICAweDEwMjAwMDA4LCAweDAwMDAwMDAwLCAweDAwMjAyMDA4LCAweDEwMjAyMDAwLCAweDAwMDAyMDA4LCAweDAwMjAyMDAwLCAweDEwMjAyMDAwLCAweDEwMDAwMDAwLAotICAgIDB4MTAwMDIwMDAsIDB4MDAwMDAwMDgsIDB4MTAyMDAwMDgsIDB4MDAyMDIwMDAsIDB4MTAyMDIwMDgsIDB4MDAyMDAwMDAsIDB4MDAwMDIwMDgsIDB4MTAwMDAwMDgsCi0gICAgMHgwMDIwMDAwMCwgMHgxMDAwMjAwMCwgMHgxMDAwMDAwMCwgMHgwMDAwMjAwOCwgMHgxMDAwMDAwOCwgMHgxMDIwMjAwOCwgMHgwMDIwMjAwMCwgMHgxMDIwMDAwMCwKLSAgICAweDAwMjAyMDA4LCAweDEwMjAyMDAwLCAweDAwMDAwMDAwLCAweDEwMjAwMDA4LCAweDAwMDAwMDA4LCAweDAwMDAyMDAwLCAweDEwMjAwMDAwLCAweDAwMjAyMDA4LAotICAgIDB4MDAwMDIwMDAsIDB4MDAyMDAwMDgsIDB4MTAwMDIwMDgsIDB4MDAwMDAwMDAsIDB4MTAyMDIwMDAsIDB4MTAwMDAwMDAsIDB4MDAyMDAwMDgsIDB4MTAwMDIwMDgsCi0gICAgfSwKLSAgICB7Ci0gICAgMHgwMDEwMDAwMCwgMHgwMjEwMDAwMSwgMHgwMjAwMDQwMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDQwMCwgMHgwMjAwMDQwMSwgMHgwMDEwMDQwMSwgMHgwMjEwMDQwMCwKLSAgICAweDAyMTAwNDAxLCAweDAwMTAwMDAwLCAweDAwMDAwMDAwLCAweDAyMDAwMDAxLCAweDAwMDAwMDAxLCAweDAyMDAwMDAwLCAweDAyMTAwMDAxLCAweDAwMDAwNDAxLAotICAgIDB4MDIwMDA0MDAsIDB4MDAxMDA0MDEsIDB4MDAxMDAwMDEsIDB4MDIwMDA0MDAsIDB4MDIwMDAwMDEsIDB4MDIxMDAwMDAsIDB4MDIxMDA0MDAsIDB4MDAxMDAwMDEsCi0gICAgMHgwMjEwMDAwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDQwMSwgMHgwMjEwMDQwMSwgMHgwMDEwMDQwMCwgMHgwMDAwMDAwMSwgMHgwMjAwMDAwMCwgMHgwMDEwMDQwMCwKLSAgICAweDAyMDAwMDAwLCAweDAwMTAwNDAwLCAweDAwMTAwMDAwLCAweDAyMDAwNDAxLCAweDAyMDAwNDAxLCAweDAyMTAwMDAxLCAweDAyMTAwMDAxLCAweDAwMDAwMDAxLAotICAgIDB4MDAxMDAwMDEsIDB4MDIwMDAwMDAsIDB4MDIwMDA0MDAsIDB4MDAxMDAwMDAsIDB4MDIxMDA0MDAsIDB4MDAwMDA0MDEsIDB4MDAxMDA0MDEsIDB4MDIxMDA0MDAsCi0gICAgMHgwMDAwMDQwMSwgMHgwMjAwMDAwMSwgMHgwMjEwMDQwMSwgMHgwMjEwMDAwMCwgMHgwMDEwMDQwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgMHgwMjEwMDQwMSwKLSAgICAweDAwMDAwMDAwLCAweDAwMTAwNDAxLCAweDAyMTAwMDAwLCAweDAwMDAwNDAwLCAweDAyMDAwMDAxLCAweDAyMDAwNDAwLCAweDAwMDAwNDAwLCAweDAwMTAwMDAxLAotICAgIH0sCi0gICAgewotICAgIDB4MDgwMDA4MjAsIDB4MDAwMDA4MDAsIDB4MDAwMjAwMDAsIDB4MDgwMjA4MjAsIDB4MDgwMDAwMDAsIDB4MDgwMDA4MjAsIDB4MDAwMDAwMjAsIDB4MDgwMDAwMDAsCi0gICAgMHgwMDAyMDAyMCwgMHgwODAyMDAwMCwgMHgwODAyMDgyMCwgMHgwMDAyMDgwMCwgMHgwODAyMDgwMCwgMHgwMDAyMDgyMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDAyMCwKLSAgICAweDA4MDIwMDAwLCAweDA4MDAwMDIwLCAweDA4MDAwODAwLCAweDAwMDAwODIwLCAweDAwMDIwODAwLCAweDAwMDIwMDIwLCAweDA4MDIwMDIwLCAweDA4MDIwODAwLAotICAgIDB4MDAwMDA4MjAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDgwMjAwMjAsIDB4MDgwMDAwMjAsIDB4MDgwMDA4MDAsIDB4MDAwMjA4MjAsIDB4MDAwMjAwMDAsCi0gICAgMHgwMDAyMDgyMCwgMHgwMDAyMDAwMCwgMHgwODAyMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDAyMCwgMHgwODAyMDAyMCwgMHgwMDAwMDgwMCwgMHgwMDAyMDgyMCwKLSAgICAweDA4MDAwODAwLCAweDAwMDAwMDIwLCAweDA4MDAwMDIwLCAweDA4MDIwMDAwLCAweDA4MDIwMDIwLCAweDA4MDAwMDAwLCAweDAwMDIwMDAwLCAweDA4MDAwODIwLAotICAgIDB4MDAwMDAwMDAsIDB4MDgwMjA4MjAsIDB4MDAwMjAwMjAsIDB4MDgwMDAwMjAsIDB4MDgwMjAwMDAsIDB4MDgwMDA4MDAsIDB4MDgwMDA4MjAsIDB4MDAwMDAwMDAsCi0gICAgMHgwODAyMDgyMCwgMHgwMDAyMDgwMCwgMHgwMDAyMDgwMCwgMHgwMDAwMDgyMCwgMHgwMDAwMDgyMCwgMHgwMDAyMDAyMCwgMHgwODAwMDAwMCwgMHgwODAyMDgwMCwKLSAgICB9LAorICAgIHsgMHgwMDgwODIwMCwgMHgwMDAwMDAwMCwgMHgwMDAwODAwMCwgMHgwMDgwODIwMiwgMHgwMDgwODAwMiwgMHgwMDAwODIwMiwgMHgwMDAwMDAwMiwgMHgwMDAwODAwMCwKKyAgICAgIDB4MDAwMDAyMDAsIDB4MDA4MDgyMDAsIDB4MDA4MDgyMDIsIDB4MDAwMDAyMDAsIDB4MDA4MDAyMDIsIDB4MDA4MDgwMDIsIDB4MDA4MDAwMDAsIDB4MDAwMDAwMDIsCisgICAgICAweDAwMDAwMjAyLCAweDAwODAwMjAwLCAweDAwODAwMjAwLCAweDAwMDA4MjAwLCAweDAwMDA4MjAwLCAweDAwODA4MDAwLCAweDAwODA4MDAwLCAweDAwODAwMjAyLAorICAgICAgMHgwMDAwODAwMiwgMHgwMDgwMDAwMiwgMHgwMDgwMDAwMiwgMHgwMDAwODAwMiwgMHgwMDAwMDAwMCwgMHgwMDAwMDIwMiwgMHgwMDAwODIwMiwgMHgwMDgwMDAwMCwKKyAgICAgIDB4MDAwMDgwMDAsIDB4MDA4MDgyMDIsIDB4MDAwMDAwMDIsIDB4MDA4MDgwMDAsIDB4MDA4MDgyMDAsIDB4MDA4MDAwMDAsIDB4MDA4MDAwMDAsIDB4MDAwMDAyMDAsCisgICAgICAweDAwODA4MDAyLCAweDAwMDA4MDAwLCAweDAwMDA4MjAwLCAweDAwODAwMDAyLCAweDAwMDAwMjAwLCAweDAwMDAwMDAyLCAweDAwODAwMjAyLCAweDAwMDA4MjAyLAorICAgICAgMHgwMDgwODIwMiwgMHgwMDAwODAwMiwgMHgwMDgwODAwMCwgMHgwMDgwMDIwMiwgMHgwMDgwMDAwMiwgMHgwMDAwMDIwMiwgMHgwMDAwODIwMiwgMHgwMDgwODIwMCwKKyAgICAgIDB4MDAwMDAyMDIsIDB4MDA4MDAyMDAsIDB4MDA4MDAyMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDgwMDIsIDB4MDAwMDgyMDAsIDB4MDAwMDAwMDAsIDB4MDA4MDgwMDIsIH0sCisgICAgeyAweDQwMDg0MDEwLCAweDQwMDA0MDAwLCAweDAwMDA0MDAwLCAweDAwMDg0MDEwLCAweDAwMDgwMDAwLCAweDAwMDAwMDEwLCAweDQwMDgwMDEwLCAweDQwMDA0MDEwLAorICAgICAgMHg0MDAwMDAxMCwgMHg0MDA4NDAxMCwgMHg0MDA4NDAwMCwgMHg0MDAwMDAwMCwgMHg0MDAwNDAwMCwgMHgwMDA4MDAwMCwgMHgwMDAwMDAxMCwgMHg0MDA4MDAxMCwKKyAgICAgIDB4MDAwODQwMDAsIDB4MDAwODAwMTAsIDB4NDAwMDQwMTAsIDB4MDAwMDAwMDAsIDB4NDAwMDAwMDAsIDB4MDAwMDQwMDAsIDB4MDAwODQwMTAsIDB4NDAwODAwMDAsCisgICAgICAweDAwMDgwMDEwLCAweDQwMDAwMDEwLCAweDAwMDAwMDAwLCAweDAwMDg0MDAwLCAweDAwMDA0MDEwLCAweDQwMDg0MDAwLCAweDQwMDgwMDAwLCAweDAwMDA0MDEwLAorICAgICAgMHgwMDAwMDAwMCwgMHgwMDA4NDAxMCwgMHg0MDA4MDAxMCwgMHgwMDA4MDAwMCwgMHg0MDAwNDAxMCwgMHg0MDA4MDAwMCwgMHg0MDA4NDAwMCwgMHgwMDAwNDAwMCwKKyAgICAgIDB4NDAwODAwMDAsIDB4NDAwMDQwMDAsIDB4MDAwMDAwMTAsIDB4NDAwODQwMTAsIDB4MDAwODQwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDQwMDAsIDB4NDAwMDAwMDAsCisgICAgICAweDAwMDA0MDEwLCAweDQwMDg0MDAwLCAweDAwMDgwMDAwLCAweDQwMDAwMDEwLCAweDAwMDgwMDEwLCAweDQwMDA0MDEwLCAweDQwMDAwMDEwLCAweDAwMDgwMDEwLAorICAgICAgMHgwMDA4NDAwMCwgMHgwMDAwMDAwMCwgMHg0MDAwNDAwMCwgMHgwMDAwNDAxMCwgMHg0MDAwMDAwMCwgMHg0MDA4MDAxMCwgMHg0MDA4NDAxMCwgMHgwMDA4NDAwMCwgfSwKKyAgICB7IDB4MDAwMDAxMDQsIDB4MDQwMTAxMDAsIDB4MDAwMDAwMDAsIDB4MDQwMTAwMDQsIDB4MDQwMDAxMDAsIDB4MDAwMDAwMDAsIDB4MDAwMTAxMDQsIDB4MDQwMDAxMDAsCisgICAgICAweDAwMDEwMDA0LCAweDA0MDAwMDA0LCAweDA0MDAwMDA0LCAweDAwMDEwMDAwLCAweDA0MDEwMTA0LCAweDAwMDEwMDA0LCAweDA0MDEwMDAwLCAweDAwMDAwMTA0LAorICAgICAgMHgwNDAwMDAwMCwgMHgwMDAwMDAwNCwgMHgwNDAxMDEwMCwgMHgwMDAwMDEwMCwgMHgwMDAxMDEwMCwgMHgwNDAxMDAwMCwgMHgwNDAxMDAwNCwgMHgwMDAxMDEwNCwKKyAgICAgIDB4MDQwMDAxMDQsIDB4MDAwMTAxMDAsIDB4MDAwMTAwMDAsIDB4MDQwMDAxMDQsIDB4MDAwMDAwMDQsIDB4MDQwMTAxMDQsIDB4MDAwMDAxMDAsIDB4MDQwMDAwMDAsCisgICAgICAweDA0MDEwMTAwLCAweDA0MDAwMDAwLCAweDAwMDEwMDA0LCAweDAwMDAwMTA0LCAweDAwMDEwMDAwLCAweDA0MDEwMTAwLCAweDA0MDAwMTAwLCAweDAwMDAwMDAwLAorICAgICAgMHgwMDAwMDEwMCwgMHgwMDAxMDAwNCwgMHgwNDAxMDEwNCwgMHgwNDAwMDEwMCwgMHgwNDAwMDAwNCwgMHgwMDAwMDEwMCwgMHgwMDAwMDAwMCwgMHgwNDAxMDAwNCwKKyAgICAgIDB4MDQwMDAxMDQsIDB4MDAwMTAwMDAsIDB4MDQwMDAwMDAsIDB4MDQwMTAxMDQsIDB4MDAwMDAwMDQsIDB4MDAwMTAxMDQsIDB4MDAwMTAxMDAsIDB4MDQwMDAwMDQsCisgICAgICAweDA0MDEwMDAwLCAweDA0MDAwMTA0LCAweDAwMDAwMTA0LCAweDA0MDEwMDAwLCAweDAwMDEwMTA0LCAweDAwMDAwMDA0LCAweDA0MDEwMDA0LCAweDAwMDEwMTAwLCB9LAorICAgIHsgMHg4MDQwMTAwMCwgMHg4MDAwMTA0MCwgMHg4MDAwMTA0MCwgMHgwMDAwMDA0MCwgMHgwMDQwMTA0MCwgMHg4MDQwMDA0MCwgMHg4MDQwMDAwMCwgMHg4MDAwMTAwMCwKKyAgICAgIDB4MDAwMDAwMDAsIDB4MDA0MDEwMDAsIDB4MDA0MDEwMDAsIDB4ODA0MDEwNDAsIDB4ODAwMDAwNDAsIDB4MDAwMDAwMDAsIDB4MDA0MDAwNDAsIDB4ODA0MDAwMDAsCisgICAgICAweDgwMDAwMDAwLCAweDAwMDAxMDAwLCAweDAwNDAwMDAwLCAweDgwNDAxMDAwLCAweDAwMDAwMDQwLCAweDAwNDAwMDAwLCAweDgwMDAxMDAwLCAweDAwMDAxMDQwLAorICAgICAgMHg4MDQwMDA0MCwgMHg4MDAwMDAwMCwgMHgwMDAwMTA0MCwgMHgwMDQwMDA0MCwgMHgwMDAwMTAwMCwgMHgwMDQwMTA0MCwgMHg4MDQwMTA0MCwgMHg4MDAwMDA0MCwKKyAgICAgIDB4MDA0MDAwNDAsIDB4ODA0MDAwMDAsIDB4MDA0MDEwMDAsIDB4ODA0MDEwNDAsIDB4ODAwMDAwNDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDA0MDEwMDAsCisgICAgICAweDAwMDAxMDQwLCAweDAwNDAwMDQwLCAweDgwNDAwMDQwLCAweDgwMDAwMDAwLCAweDgwNDAxMDAwLCAweDgwMDAxMDQwLCAweDgwMDAxMDQwLCAweDAwMDAwMDQwLAorICAgICAgMHg4MDQwMTA0MCwgMHg4MDAwMDA0MCwgMHg4MDAwMDAwMCwgMHgwMDAwMTAwMCwgMHg4MDQwMDAwMCwgMHg4MDAwMTAwMCwgMHgwMDQwMTA0MCwgMHg4MDQwMDA0MCwKKyAgICAgIDB4ODAwMDEwMDAsIDB4MDAwMDEwNDAsIDB4MDA0MDAwMDAsIDB4ODA0MDEwMDAsIDB4MDAwMDAwNDAsIDB4MDA0MDAwMDAsIDB4MDAwMDEwMDAsIDB4MDA0MDEwNDAsIH0sCisgICAgeyAweDAwMDAwMDgwLCAweDAxMDQwMDgwLCAweDAxMDQwMDAwLCAweDIxMDAwMDgwLCAweDAwMDQwMDAwLCAweDAwMDAwMDgwLCAweDIwMDAwMDAwLCAweDAxMDQwMDAwLAorICAgICAgMHgyMDA0MDA4MCwgMHgwMDA0MDAwMCwgMHgwMTAwMDA4MCwgMHgyMDA0MDA4MCwgMHgyMTAwMDA4MCwgMHgyMTA0MDAwMCwgMHgwMDA0MDA4MCwgMHgyMDAwMDAwMCwKKyAgICAgIDB4MDEwMDAwMDAsIDB4MjAwNDAwMDAsIDB4MjAwNDAwMDAsIDB4MDAwMDAwMDAsIDB4MjAwMDAwODAsIDB4MjEwNDAwODAsIDB4MjEwNDAwODAsIDB4MDEwMDAwODAsCisgICAgICAweDIxMDQwMDAwLCAweDIwMDAwMDgwLCAweDAwMDAwMDAwLCAweDIxMDAwMDAwLCAweDAxMDQwMDgwLCAweDAxMDAwMDAwLCAweDIxMDAwMDAwLCAweDAwMDQwMDgwLAorICAgICAgMHgwMDA0MDAwMCwgMHgyMTAwMDA4MCwgMHgwMDAwMDA4MCwgMHgwMTAwMDAwMCwgMHgyMDAwMDAwMCwgMHgwMTA0MDAwMCwgMHgyMTAwMDA4MCwgMHgyMDA0MDA4MCwKKyAgICAgIDB4MDEwMDAwODAsIDB4MjAwMDAwMDAsIDB4MjEwNDAwMDAsIDB4MDEwNDAwODAsIDB4MjAwNDAwODAsIDB4MDAwMDAwODAsIDB4MDEwMDAwMDAsIDB4MjEwNDAwMDAsCisgICAgICAweDIxMDQwMDgwLCAweDAwMDQwMDgwLCAweDIxMDAwMDAwLCAweDIxMDQwMDgwLCAweDAxMDQwMDAwLCAweDAwMDAwMDAwLCAweDIwMDQwMDAwLCAweDIxMDAwMDAwLAorICAgICAgMHgwMDA0MDA4MCwgMHgwMTAwMDA4MCwgMHgyMDAwMDA4MCwgMHgwMDA0MDAwMCwgMHgwMDAwMDAwMCwgMHgyMDA0MDAwMCwgMHgwMTA0MDA4MCwgMHgyMDAwMDA4MCwgfSwKKyAgICB7IDB4MTAwMDAwMDgsIDB4MTAyMDAwMDAsIDB4MDAwMDIwMDAsIDB4MTAyMDIwMDgsIDB4MTAyMDAwMDAsIDB4MDAwMDAwMDgsIDB4MTAyMDIwMDgsIDB4MDAyMDAwMDAsCisgICAgICAweDEwMDAyMDAwLCAweDAwMjAyMDA4LCAweDAwMjAwMDAwLCAweDEwMDAwMDA4LCAweDAwMjAwMDA4LCAweDEwMDAyMDAwLCAweDEwMDAwMDAwLCAweDAwMDAyMDA4LAorICAgICAgMHgwMDAwMDAwMCwgMHgwMDIwMDAwOCwgMHgxMDAwMjAwOCwgMHgwMDAwMjAwMCwgMHgwMDIwMjAwMCwgMHgxMDAwMjAwOCwgMHgwMDAwMDAwOCwgMHgxMDIwMDAwOCwKKyAgICAgIDB4MTAyMDAwMDgsIDB4MDAwMDAwMDAsIDB4MDAyMDIwMDgsIDB4MTAyMDIwMDAsIDB4MDAwMDIwMDgsIDB4MDAyMDIwMDAsIDB4MTAyMDIwMDAsIDB4MTAwMDAwMDAsCisgICAgICAweDEwMDAyMDAwLCAweDAwMDAwMDA4LCAweDEwMjAwMDA4LCAweDAwMjAyMDAwLCAweDEwMjAyMDA4LCAweDAwMjAwMDAwLCAweDAwMDAyMDA4LCAweDEwMDAwMDA4LAorICAgICAgMHgwMDIwMDAwMCwgMHgxMDAwMjAwMCwgMHgxMDAwMDAwMCwgMHgwMDAwMjAwOCwgMHgxMDAwMDAwOCwgMHgxMDIwMjAwOCwgMHgwMDIwMjAwMCwgMHgxMDIwMDAwMCwKKyAgICAgIDB4MDAyMDIwMDgsIDB4MTAyMDIwMDAsIDB4MDAwMDAwMDAsIDB4MTAyMDAwMDgsIDB4MDAwMDAwMDgsIDB4MDAwMDIwMDAsIDB4MTAyMDAwMDAsIDB4MDAyMDIwMDgsCisgICAgICAweDAwMDAyMDAwLCAweDAwMjAwMDA4LCAweDEwMDAyMDA4LCAweDAwMDAwMDAwLCAweDEwMjAyMDAwLCAweDEwMDAwMDAwLCAweDAwMjAwMDA4LCAweDEwMDAyMDA4LCB9LAorICAgIHsgMHgwMDEwMDAwMCwgMHgwMjEwMDAwMSwgMHgwMjAwMDQwMSwgMHgwMDAwMDAwMCwgMHgwMDAwMDQwMCwgMHgwMjAwMDQwMSwgMHgwMDEwMDQwMSwgMHgwMjEwMDQwMCwKKyAgICAgIDB4MDIxMDA0MDEsIDB4MDAxMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDIwMDAwMDEsIDB4MDAwMDAwMDEsIDB4MDIwMDAwMDAsIDB4MDIxMDAwMDEsIDB4MDAwMDA0MDEsCisgICAgICAweDAyMDAwNDAwLCAweDAwMTAwNDAxLCAweDAwMTAwMDAxLCAweDAyMDAwNDAwLCAweDAyMDAwMDAxLCAweDAyMTAwMDAwLCAweDAyMTAwNDAwLCAweDAwMTAwMDAxLAorICAgICAgMHgwMjEwMDAwMCwgMHgwMDAwMDQwMCwgMHgwMDAwMDQwMSwgMHgwMjEwMDQwMSwgMHgwMDEwMDQwMCwgMHgwMDAwMDAwMSwgMHgwMjAwMDAwMCwgMHgwMDEwMDQwMCwKKyAgICAgIDB4MDIwMDAwMDAsIDB4MDAxMDA0MDAsIDB4MDAxMDAwMDAsIDB4MDIwMDA0MDEsIDB4MDIwMDA0MDEsIDB4MDIxMDAwMDEsIDB4MDIxMDAwMDEsIDB4MDAwMDAwMDEsCisgICAgICAweDAwMTAwMDAxLCAweDAyMDAwMDAwLCAweDAyMDAwNDAwLCAweDAwMTAwMDAwLCAweDAyMTAwNDAwLCAweDAwMDAwNDAxLCAweDAwMTAwNDAxLCAweDAyMTAwNDAwLAorICAgICAgMHgwMDAwMDQwMSwgMHgwMjAwMDAwMSwgMHgwMjEwMDQwMSwgMHgwMjEwMDAwMCwgMHgwMDEwMDQwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgMHgwMjEwMDQwMSwKKyAgICAgIDB4MDAwMDAwMDAsIDB4MDAxMDA0MDEsIDB4MDIxMDAwMDAsIDB4MDAwMDA0MDAsIDB4MDIwMDAwMDEsIDB4MDIwMDA0MDAsIDB4MDAwMDA0MDAsIDB4MDAxMDAwMDEsIH0sCisgICAgeyAweDA4MDAwODIwLCAweDAwMDAwODAwLCAweDAwMDIwMDAwLCAweDA4MDIwODIwLCAweDA4MDAwMDAwLCAweDA4MDAwODIwLCAweDAwMDAwMDIwLCAweDA4MDAwMDAwLAorICAgICAgMHgwMDAyMDAyMCwgMHgwODAyMDAwMCwgMHgwODAyMDgyMCwgMHgwMDAyMDgwMCwgMHgwODAyMDgwMCwgMHgwMDAyMDgyMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDAyMCwKKyAgICAgIDB4MDgwMjAwMDAsIDB4MDgwMDAwMjAsIDB4MDgwMDA4MDAsIDB4MDAwMDA4MjAsIDB4MDAwMjA4MDAsIDB4MDAwMjAwMjAsIDB4MDgwMjAwMjAsIDB4MDgwMjA4MDAsCisgICAgICAweDAwMDAwODIwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDA4MDIwMDIwLCAweDA4MDAwMDIwLCAweDA4MDAwODAwLCAweDAwMDIwODIwLCAweDAwMDIwMDAwLAorICAgICAgMHgwMDAyMDgyMCwgMHgwMDAyMDAwMCwgMHgwODAyMDgwMCwgMHgwMDAwMDgwMCwgMHgwMDAwMDAyMCwgMHgwODAyMDAyMCwgMHgwMDAwMDgwMCwgMHgwMDAyMDgyMCwKKyAgICAgIDB4MDgwMDA4MDAsIDB4MDAwMDAwMjAsIDB4MDgwMDAwMjAsIDB4MDgwMjAwMDAsIDB4MDgwMjAwMjAsIDB4MDgwMDAwMDAsIDB4MDAwMjAwMDAsIDB4MDgwMDA4MjAsCisgICAgICAweDAwMDAwMDAwLCAweDA4MDIwODIwLCAweDAwMDIwMDIwLCAweDA4MDAwMDIwLCAweDA4MDIwMDAwLCAweDA4MDAwODAwLCAweDA4MDAwODIwLCAweDAwMDAwMDAwLAorICAgICAgMHgwODAyMDgyMCwgMHgwMDAyMDgwMCwgMHgwMDAyMDgwMCwgMHgwMDAwMDgyMCwgMHgwMDAwMDgyMCwgMHgwMDAyMDAyMCwgMHgwODAwMDAwMCwgMHgwODAyMDgwMCwgfSwKIH07CiAjZW5kaWYKIAotc3RhdGljIHVpbnQ2NF90IHNodWZmbGUodWludDY0X3QgaW4sIGNvbnN0IHVpbnQ4X3QgKnNodWZmbGUsIGludCBzaHVmZmxlX2xlbikgeworc3RhdGljIHVpbnQ2NF90IHNodWZmbGUodWludDY0X3QgaW4sIGNvbnN0IHVpbnQ4X3QgKnNodWZmbGUsIGludCBzaHVmZmxlX2xlbikKK3sKICAgICBpbnQgaTsKICAgICB1aW50NjRfdCByZXMgPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBzaHVmZmxlX2xlbjsgaSsrKQpAQCAtMjA0LDcgKzE4Myw4IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIHVpbnQ2NF90IHNodWZmbGVfaW52KHVpbnQ2NF90IGluLCBjb25zdCB1aW50OF90ICpzaHVmZmxlLCBpbnQgc2h1ZmZsZV9sZW4pIHsKK3N0YXRpYyB1aW50NjRfdCBzaHVmZmxlX2ludih1aW50NjRfdCBpbiwgY29uc3QgdWludDhfdCAqc2h1ZmZsZSwgaW50IHNodWZmbGVfbGVuKQorewogICAgIGludCBpOwogICAgIHVpbnQ2NF90IHJlcyA9IDA7CiAgICAgc2h1ZmZsZSArPSBzaHVmZmxlX2xlbiAtIDE7CkBAIC0yMTUsNyArMTk1LDggQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0aWMgdWludDMyX3QgZl9mdW5jKHVpbnQzMl90IHIsIHVpbnQ2NF90IGspIHsKK3N0YXRpYyB1aW50MzJfdCBmX2Z1bmModWludDMyX3QgciwgdWludDY0X3QgaykKK3sKICAgICBpbnQgaTsKICAgICB1aW50MzJfdCBvdXQgPSAwOwogICAgIC8vIHJvdGF0ZSB0byBnZXQgZmlyc3QgcGFydCBvZiBFLXNodWZmbGUgaW4gdGhlIGxvd2VzdCA2IGJpdHMKQEAgLTIyNSwxMyArMjA2LDE0IEBACiAgICAgICAgIHVpbnQ4X3QgdG1wID0gKHIgXiBrKSAmIDB4M2Y7CiAjaWYgQ09ORklHX1NNQUxMCiAgICAgICAgIHVpbnQ4X3QgdiA9IFNfYm94ZXNbaV1bdG1wID4+IDFdOwotICAgICAgICBpZiAodG1wICYgMSkgdiA+Pj0gNDsKKyAgICAgICAgaWYgKHRtcCAmIDEpCisgICAgICAgICAgICB2ID4+PSA0OwogICAgICAgICBvdXQgPSAob3V0ID4+IDQpIHwgKHYgPDwgMjgpOwogI2Vsc2UKICAgICAgICAgb3V0IHw9IFNfYm94ZXNfUF9zaHVmZmxlW2ldW3RtcF07CiAjZW5kaWYKICAgICAgICAgLy8gZ2V0IG5leHQgNiBiaXRzIG9mIEUtc2h1ZmZsZSBhbmQgcm91bmQga2V5IGsgaW50byB0aGUgbG93ZXN0IGJpdHMKLSAgICAgICAgciA9IChyID4+IDQpIHwgKHIgPDwgMjgpOworICAgICAgICByICAgPSAociA+PiA0KSB8IChyIDw8IDI4KTsKICAgICAgICAgayA+Pj0gNjsKICAgICB9CiAjaWYgQ09ORklHX1NNQUxMCkBAIC0yNDYsMTUgKzIyOCwxNyBAQAogICogTm90ZTogdGhlIHNwZWNpZmljYXRpb24gY2FsbHMgdGhpcyAic2hpZnQiLCBzbyBJIGtlcHQgaXQgYWx0aG91Z2gKICAqIGl0IGlzIGNvbmZ1c2luZy4KICAqLwotc3RhdGljIHVpbnQ2NF90IGtleV9zaGlmdF9sZWZ0KHVpbnQ2NF90IENEbikgeworc3RhdGljIHVpbnQ2NF90IGtleV9zaGlmdF9sZWZ0KHVpbnQ2NF90IENEbikKK3sKICAgICB1aW50NjRfdCBjYXJyaWVzID0gKENEbiA+PiAyNykgJiAweDEwMDAwMDAxOwogICAgIENEbiA8PD0gMTsKLSAgICBDRG4gJj0gfjB4MTAwMDAwMDE7Ci0gICAgQ0RuIHw9IGNhcnJpZXM7CisgICAgQ0RuICAmPSB+MHgxMDAwMDAwMTsKKyAgICBDRG4gIHw9IGNhcnJpZXM7CiAgICAgcmV0dXJuIENEbjsKIH0KIAotc3RhdGljIHZvaWQgZ2VuX3JvdW5ka2V5cyh1aW50NjRfdCBLWzE2XSwgdWludDY0X3Qga2V5KSB7CitzdGF0aWMgdm9pZCBnZW5fcm91bmRrZXlzKHVpbnQ2NF90IEtbMTZdLCB1aW50NjRfdCBrZXkpCit7CiAgICAgaW50IGk7CiAgICAgLy8gZGlzY2FyZCBwYXJpdHkgYml0cyBmcm9tIGtleSBhbmQgc2h1ZmZsZSBpdCBpbnRvIEMgYW5kIEQgcGFydHMKICAgICB1aW50NjRfdCBDRG4gPSBzaHVmZmxlKGtleSwgUEMxX3NodWZmbGUsIHNpemVvZihQQzFfc2h1ZmZsZSkpOwpAQCAtMjY3LDcgKzI1MSw4IEBACiAgICAgfQogfQogCi1zdGF0aWMgdWludDY0X3QgZGVzX2VuY2RlYyh1aW50NjRfdCBpbiwgdWludDY0X3QgS1sxNl0sIGludCBkZWNyeXB0KSB7CitzdGF0aWMgdWludDY0X3QgZGVzX2VuY2RlYyh1aW50NjRfdCBpbiwgdWludDY0X3QgS1sxNl0sIGludCBkZWNyeXB0KQorewogICAgIGludCBpOwogICAgIC8vIHVzZWQgdG8gYXBwbHkgcm91bmQga2V5cyBpbiByZXZlcnNlIG9yZGVyIGZvciBkZWNyeXB0aW9uCiAgICAgZGVjcnlwdCA9IGRlY3J5cHQgPyAxNSA6IDA7CkBAIC0yNzYsOCArMjYxLDggQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICB1aW50MzJfdCBmX3JlczsKICAgICAgICAgZl9yZXMgPSBmX2Z1bmMoaW4sIEtbZGVjcnlwdCBeIGldKTsKLSAgICAgICAgaW4gPSAoaW4gPDwgMzIpIHwgKGluID4+IDMyKTsKLSAgICAgICAgaW4gXj0gZl9yZXM7CisgICAgICAgIGluICAgID0gKGluIDw8IDMyKSB8IChpbiA+PiAzMik7CisgICAgICAgIGluICAgXj0gZl9yZXM7CiAgICAgfQogICAgIGluID0gKGluIDw8IDMyKSB8IChpbiA+PiAzMik7CiAgICAgLy8gcmV2ZXJzZSBzaHVmZmxlIHVzZWQgdG8gZWFzZSBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbnMKQEAgLTMwMiw3ICsyODcsOSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBhdl9kZXNfY3J5cHRfbWFjKEFWREVTICpkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50LCB1aW50OF90ICppdiwgaW50IGRlY3J5cHQsIGludCBtYWMpIHsKK3N0YXRpYyB2b2lkIGF2X2Rlc19jcnlwdF9tYWMoQVZERVMgKmQsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHVpbnQ4X3QgKml2LCBpbnQgZGVjcnlwdCwgaW50IG1hYykKK3sKICAgICB1aW50NjRfdCBpdl92YWwgPSBpdiA/IEFWX1JCNjQoaXYpIDogMDsKICAgICB3aGlsZSAoY291bnQtLSA+IDApIHsKICAgICAgICAgdWludDY0X3QgZHN0X3ZhbDsKQEAgLTMxNCw3ICszMDEsNyBAQAogICAgICAgICAgICAgICAgIHNyY192YWwgPSBkZXNfZW5jZGVjKHNyY192YWwsIGQtPnJvdW5kX2tleXNbMV0sIDApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZHN0X3ZhbCA9IGRlc19lbmNkZWMoc3JjX3ZhbCwgZC0+cm91bmRfa2V5c1swXSwgMSkgXiBpdl92YWw7Ci0gICAgICAgICAgICBpdl92YWwgPSBpdiA/IHRtcCA6IDA7CisgICAgICAgICAgICBpdl92YWwgID0gaXYgPyB0bXAgOiAwOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHN0X3ZhbCA9IGRlc19lbmNkZWMoc3JjX3ZhbCBeIGl2X3ZhbCwgZC0+cm91bmRfa2V5c1swXSwgMCk7CiAgICAgICAgICAgICBpZiAoZC0+dHJpcGxlX2RlcykgewpAQCAtMzMyLDExNiArMzE5LDEzIEBACiAgICAgICAgIEFWX1dCNjQoaXYsIGl2X3ZhbCk7CiB9CiAKLXZvaWQgYXZfZGVzX2NyeXB0KEFWREVTICpkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50LCB1aW50OF90ICppdiwgaW50IGRlY3J5cHQpIHsKK3ZvaWQgYXZfZGVzX2NyeXB0KEFWREVTICpkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKyAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdWludDhfdCAqaXYsIGludCBkZWNyeXB0KQorewogICAgIGF2X2Rlc19jcnlwdF9tYWMoZCwgZHN0LCBzcmMsIGNvdW50LCBpdiwgZGVjcnlwdCwgMCk7CiB9CiAKLXZvaWQgYXZfZGVzX21hYyhBVkRFUyAqZCwgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBjb3VudCkgewotICAgIGF2X2Rlc19jcnlwdF9tYWMoZCwgZHN0LCBzcmMsIGNvdW50LCAodWludDhfdFs4XSl7MH0sIDAsIDEpOwordm9pZCBhdl9kZXNfbWFjKEFWREVTICpkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGNvdW50KQoreworICAgIGF2X2Rlc19jcnlwdF9tYWMoZCwgZHN0LCBzcmMsIGNvdW50LCAodWludDhfdFs4XSkgeyAwIH0sIDAsIDEpOwogfQotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJ0aW1lLmgiCi0KLXN0YXRpYyB1aW50NjRfdCByYW5kNjQodm9pZCkgewotICAgIHVpbnQ2NF90IHIgPSByYW5kKCk7Ci0gICAgciA9IChyIDw8IDMyKSB8IHJhbmQoKTsKLSAgICByZXR1cm4gcjsKLX0KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVzdF9rZXlbXSA9IHsweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDlhLCAweGJjLCAweGRlLCAweGYwfTsKLXN0YXRpYyBjb25zdCBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgcGxhaW4pW10gPSB7MHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMH07Ci1zdGF0aWMgY29uc3QgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGNyeXB0KVtdID0gezB4NGEsIDB4YjYsIDB4NWIsIDB4M2QsIDB4NGIsIDB4MDYsIDB4MTUsIDB4MTh9Owotc3RhdGljIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCB0bXApWzhdOwotc3RhdGljIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBsYXJnZV9idWZmZXIpWzEwMDAyXVs4XTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGNiY19rZXlbXSA9IHsKLSAgICAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLAotICAgIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsIDB4MDEsCi0gICAgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgMHgwMSwgMHgyMwotfTsKLQotc3RhdGljIGludCBydW5fdGVzdChpbnQgY2JjLCBpbnQgZGVjcnlwdCkgewotICAgIEFWREVTIGQ7Ci0gICAgaW50IGRlbGF5ID0gY2JjICYmICFkZWNyeXB0ID8gMiA6IDE7Ci0gICAgdWludDY0X3QgcmVzOwotICAgIEFWX1dCNjQobGFyZ2VfYnVmZmVyWzBdLCAweDRlNmY3NzIwNjk3MzIwNzRVTEwpOwotICAgIEFWX1dCNjQobGFyZ2VfYnVmZmVyWzFdLCAweDEyMzQ1Njc4OTBhYmNkZWZVTEwpOwotICAgIEFWX1dCNjQodG1wLCAgICAgICAgICAgICAweDEyMzQ1Njc4OTBhYmNkZWZVTEwpOwotICAgIGF2X2Rlc19pbml0KCZkLCBjYmNfa2V5LCAxOTIsIGRlY3J5cHQpOwotICAgIGF2X2Rlc19jcnlwdCgmZCwgbGFyZ2VfYnVmZmVyW2RlbGF5XSwgbGFyZ2VfYnVmZmVyWzBdLCAxMDAwMCwgY2JjID8gdG1wIDogTlVMTCwgZGVjcnlwdCk7Ci0gICAgcmVzID0gQVZfUkI2NChsYXJnZV9idWZmZXJbOTk5OSArIGRlbGF5XSk7Ci0gICAgaWYgKGNiYykgewotICAgICAgICBpZiAoZGVjcnlwdCkKLSAgICAgICAgICAgIHJldHVybiByZXMgPT0gMHhjNWNlY2Y2M2VjZWM1MTRjVUxMOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcmVzID09IDB4Y2IxOTFmODVkMWVkODQzOVVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoZGVjcnlwdCkKLSAgICAgICAgICAgIHJldHVybiByZXMgPT0gMHg4MzI1Mzk3NjQ0MDkxYTBhVUxMOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICByZXR1cm4gcmVzID09IDB4ZGQxN2U4YjhiNDM3ZDIzMlVMTDsKLSAgICB9Ci19Ci0KLWludCBtYWluKHZvaWQpIHsKLSAgICBBVkRFUyBkOwotICAgIGludCBpOwotI2lmZGVmIEdFTlRBQkxFUwotICAgIGludCBqOwotI2VuZGlmCi0gICAgdWludDY0X3Qga2V5WzNdOwotICAgIHVpbnQ2NF90IGRhdGE7Ci0gICAgdWludDY0X3QgY3Q7Ci0gICAgdWludDY0X3Qgcm91bmRrZXlzWzE2XTsKLSAgICBzcmFuZChhdl9nZXR0aW1lKCkpOwotICAgIGtleVswXSA9IEFWX1JCNjQodGVzdF9rZXkpOwotICAgIGRhdGEgPSBBVl9SQjY0KHBsYWluKTsKLSAgICBnZW5fcm91bmRrZXlzKHJvdW5ka2V5cywga2V5WzBdKTsKLSAgICBpZiAoZGVzX2VuY2RlYyhkYXRhLCByb3VuZGtleXMsIDApICE9IEFWX1JCNjQoY3J5cHQpKSB7Ci0gICAgICAgIHByaW50ZigiVGVzdCAxIGZhaWxlZFxuIik7Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBhdl9kZXNfaW5pdCgmZCwgdGVzdF9rZXksIDY0LCAwKTsKLSAgICBhdl9kZXNfY3J5cHQoJmQsIHRtcCwgcGxhaW4sIDEsIE5VTEwsIDApOwotICAgIGlmIChtZW1jbXAodG1wLCBjcnlwdCwgc2l6ZW9mKGNyeXB0KSkpIHsKLSAgICAgICAgcHJpbnRmKCJQdWJsaWMgQVBJIGRlY3J5cHRpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmICghcnVuX3Rlc3QoMCwgMCkgfHwgIXJ1bl90ZXN0KDAsIDEpIHx8ICFydW5fdGVzdCgxLCAwKSB8fCAhcnVuX3Rlc3QoMSwgMSkpIHsKLSAgICAgICAgcHJpbnRmKCJQYXJ0aWFsIE1vbnRlLUNhcmxvIHRlc3QgZmFpbGVkXG4iKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKLSAgICAgICAga2V5WzBdID0gcmFuZDY0KCk7IGtleVsxXSA9IHJhbmQ2NCgpOyBrZXlbMl0gPSByYW5kNjQoKTsKLSAgICAgICAgZGF0YSA9IHJhbmQ2NCgpOwotICAgICAgICBhdl9kZXNfaW5pdCgmZCwgKHVpbnQ4X3QqKWtleSwgMTkyLCAwKTsKLSAgICAgICAgYXZfZGVzX2NyeXB0KCZkLCAodWludDhfdCopJmN0LCAodWludDhfdCopJmRhdGEsIDEsIE5VTEwsIDApOwotICAgICAgICBhdl9kZXNfaW5pdCgmZCwgKHVpbnQ4X3QqKWtleSwgMTkyLCAxKTsKLSAgICAgICAgYXZfZGVzX2NyeXB0KCZkLCAodWludDhfdCopJmN0LCAodWludDhfdCopJmN0LCAxLCBOVUxMLCAxKTsKLSAgICAgICAgaWYgKGN0ICE9IGRhdGEpIHsKLSAgICAgICAgICAgIHByaW50ZigiVGVzdCAyIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgIH0KLSNpZmRlZiBHRU5UQUJMRVMKLSAgICBwcmludGYoInN0YXRpYyBjb25zdCB1aW50MzJfdCBTX2JveGVzX1Bfc2h1ZmZsZVs4XVs2NF0gPSB7XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICAgIHByaW50ZigiICAgIHsiKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHYgPSBTX2JveGVzW2ldW2ogPj4gMV07Ci0gICAgICAgICAgICB2ID0gaiAmIDEgPyB2ID4+IDQgOiB2ICYgMHhmOwotICAgICAgICAgICAgdiA8PD0gMjggLSA0ICogaTsKLSAgICAgICAgICAgIHYgPSBzaHVmZmxlKHYsIFBfc2h1ZmZsZSwgc2l6ZW9mKFBfc2h1ZmZsZSkpOwotICAgICAgICAgICAgcHJpbnRmKChqICYgNykgPT0gMCA/ICJcbiAgICAiIDogIiAiKTsKLSAgICAgICAgICAgIHByaW50ZigiMHglMDhYLCIsIHYpOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiXG4gICAgfSxcbiIpOwotICAgIH0KLSAgICBwcmludGYoIn07XG4iKTsKLSNlbmRpZgotICAgIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvZGljdC5jIGIvbGliYXZ1dGlsL2RpY3QuYwppbmRleCA4YmI2NWExLi4wZWE3MTM4IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvZGljdC5jCisrKyBiL2xpYmF2dXRpbC9kaWN0LmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJkaWN0LmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJ0aW1lX2ludGVybmFsLmgiCiAjaW5jbHVkZSAiYnByaW50LmgiCiAKIHN0cnVjdCBBVkRpY3Rpb25hcnkgewpAQCAtNzAsOSArNzEsMTIgQEAKICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCiB7CiAgICAgQVZEaWN0aW9uYXJ5ICptID0gKnBtOwotICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0YWcgPSBhdl9kaWN0X2dldChtLCBrZXksIE5VTEwsIGZsYWdzKTsKKyAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdGFnID0gTlVMTDsKICAgICBjaGFyICpvbGR2YWwgPSBOVUxMLCAqY29weV9rZXkgPSBOVUxMLCAqY29weV92YWx1ZSA9IE5VTEw7CiAKKyAgICBpZiAoIShmbGFncyAmIEFWX0RJQ1RfTVVMVElLRVkpKSB7CisgICAgICAgIHRhZyA9IGF2X2RpY3RfZ2V0KG0sIGtleSwgTlVMTCwgZmxhZ3MpOworICAgIH0KICAgICBpZiAoZmxhZ3MgJiBBVl9ESUNUX0RPTlRfU1RSRFVQX0tFWSkKICAgICAgICAgY29weV9rZXkgPSAodm9pZCAqKWtleTsKICAgICBlbHNlCkBAIC05OCw3ICsxMDIsNyBAQAogICAgICAgICAgICAgYXZfZnJlZSh0YWctPnZhbHVlKTsKICAgICAgICAgYXZfZnJlZSh0YWctPmtleSk7CiAgICAgICAgICp0YWcgPSBtLT5lbGVtc1stLW0tPmNvdW50XTsKLSAgICB9IGVsc2UgeworICAgIH0gZWxzZSBpZiAoY29weV92YWx1ZSkgewogICAgICAgICBBVkRpY3Rpb25hcnlFbnRyeSAqdG1wID0gYXZfcmVhbGxvYyhtLT5lbGVtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0tPmNvdW50ICsgMSkgKiBzaXplb2YoKm0tPmVsZW1zKSk7CiAgICAgICAgIGlmICghdG1wKQpAQCAtMjUxLDExNiArMjU1LDE4IEBACiAgICAgcmV0dXJuIGF2X2JwcmludF9maW5hbGl6ZSgmYnByaW50LCBidWZmZXIpOwogfQogCi0jaWZkZWYgVEVTVAotc3RhdGljIHZvaWQgcHJpbnRfZGljdChjb25zdCBBVkRpY3Rpb25hcnkgKm0pCitpbnQgYXZwcml2X2RpY3Rfc2V0X3RpbWVzdGFtcChBVkRpY3Rpb25hcnkgKipkaWN0LCBjb25zdCBjaGFyICprZXksIGludDY0X3QgdGltZXN0YW1wKQogewotICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKLSAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChtLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpCi0gICAgICAgIHByaW50ZigiJXMgJXMgICAiLCB0LT5rZXksIHQtPnZhbHVlKTsKLSAgICBwcmludGYoIlxuIik7CisgICAgdGltZV90IHNlY29uZHMgPSB0aW1lc3RhbXAgLyAxMDAwMDAwOworICAgIHN0cnVjdCB0bSAqcHRtLCB0bWJ1ZjsKKyAgICBwdG0gPSBnbXRpbWVfcigmc2Vjb25kcywgJnRtYnVmKTsKKyAgICBpZiAocHRtKSB7CisgICAgICAgIGNoYXIgYnVmWzMyXTsKKyAgICAgICAgaWYgKCFzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJVktJW0tJWRUJUg6JU06JVMiLCBwdG0pKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgICAgIGF2X3N0cmxjYXRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIuJTA2ZFoiLCAoaW50KSh0aW1lc3RhbXAgJSAxMDAwMDAwKSk7CisgICAgICAgIHJldHVybiBhdl9kaWN0X3NldChkaWN0LCBrZXksIGJ1ZiwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7CisgICAgfQogfQotCi1zdGF0aWMgdm9pZCB0ZXN0X3NlcGFyYXRvcnMoY29uc3QgQVZEaWN0aW9uYXJ5ICptLCBjb25zdCBjaGFyIHBhaXIsIGNvbnN0IGNoYXIgdmFsKQotewotICAgIEFWRGljdGlvbmFyeSAqZGljdCA9IE5VTEw7Ci0gICAgY2hhciBwYWlyc1tdID0ge3BhaXIgLCAnXDAnfTsKLSAgICBjaGFyIHZhbHNbXSAgPSB7dmFsLCAnXDAnfTsKLQotICAgIGNoYXIgKmJ1ZmZlciA9IE5VTEw7Ci0gICAgYXZfZGljdF9jb3B5KCZkaWN0LCBtLCAwKTsKLSAgICBwcmludF9kaWN0KGRpY3QpOwotICAgIGF2X2RpY3RfZ2V0X3N0cmluZyhkaWN0LCAmYnVmZmVyLCB2YWwsIHBhaXIpOwotICAgIHByaW50ZigiJXNcbiIsIGJ1ZmZlcik7Ci0gICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKLSAgICBhdl9kaWN0X3BhcnNlX3N0cmluZygmZGljdCwgYnVmZmVyLCB2YWxzLCBwYWlycywgMCk7Ci0gICAgYXZfZnJlZXAoJmJ1ZmZlcik7Ci0gICAgcHJpbnRfZGljdChkaWN0KTsKLSAgICBhdl9kaWN0X2ZyZWUoJmRpY3QpOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIEFWRGljdGlvbmFyeSAqZGljdCA9IE5VTEw7Ci0gICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7Ci0gICAgY2hhciAqYnVmZmVyID0gTlVMTDsKLQotICAgIHByaW50ZigiVGVzdGluZyBhdl9kaWN0X2dldF9zdHJpbmcoKSBhbmQgYXZfZGljdF9wYXJzZV9zdHJpbmcoKVxuIik7Ci0gICAgYXZfZGljdF9nZXRfc3RyaW5nKGRpY3QsICZidWZmZXIsICc9JywgJywnKTsKLSAgICBwcmludGYoIiVzXG4iLCBidWZmZXIpOwotICAgIGF2X2ZyZWVwKCZidWZmZXIpOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiYWFhIiwgImFhYSIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiYixiIiwgImJiYiIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiYz1jIiwgImNjYyIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZGRkIiwgImQsZCIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZWVlIiwgImU9ZSIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZixmIiwgImY9ZiIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZz1nIiwgImcsZyIsIDApOwotICAgIHRlc3Rfc2VwYXJhdG9ycyhkaWN0LCAnLCcsICc9Jyk7Ci0gICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKLSAgICBhdl9kaWN0X3NldCgmZGljdCwgImFhYSIsICJhYWEiLCAwKTsKLSAgICBhdl9kaWN0X3NldCgmZGljdCwgImJiYiIsICJiYmIiLCAwKTsKLSAgICBhdl9kaWN0X3NldCgmZGljdCwgImNjYyIsICJjY2MiLCAwKTsKLSAgICBhdl9kaWN0X3NldCgmZGljdCwgIlxcLD1cJ1wiIiwgIlxcLD1cJ1wiIiwgMCk7Ci0gICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICciJywgICc9Jyk7Ci0gICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICdcJycsICc9Jyk7Ci0gICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICcsJywgJyInKTsKLSAgICB0ZXN0X3NlcGFyYXRvcnMoZGljdCwgJywnLCAnXCcnKTsKLSAgICB0ZXN0X3NlcGFyYXRvcnMoZGljdCwgJ1wnJywgJyInKTsKLSAgICB0ZXN0X3NlcGFyYXRvcnMoZGljdCwgJyInLCAnXCcnKTsKLSAgICBhdl9kaWN0X2ZyZWUoJmRpY3QpOwotCi0gICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfZGljdF9zZXQoKVxuIik7Ci0gICAgYXZfZGljdF9zZXQoJmRpY3QsICJhIiwgImEiLCAwKTsKLSAgICBhdl9kaWN0X3NldCgmZGljdCwgImIiLCBhdl9zdHJkdXAoImIiKSwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCBhdl9zdHJkdXAoImMiKSwgImMiLCBBVl9ESUNUX0RPTlRfU1RSRFVQX0tFWSk7Ci0gICAgYXZfZGljdF9zZXQoJmRpY3QsIGF2X3N0cmR1cCgiZCIpLCBhdl9zdHJkdXAoImQiKSwgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgfCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7Ci0gICAgYXZfZGljdF9zZXQoJmRpY3QsICJlIiwgImUiLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLSAgICBhdl9kaWN0X3NldCgmZGljdCwgImUiLCAiZiIsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZiIsICJmIiwgMCk7Ci0gICAgYXZfZGljdF9zZXQoJmRpY3QsICJmIiwgTlVMTCwgMCk7Ci0gICAgYXZfZGljdF9zZXQoJmRpY3QsICJmZiIsICJmIiwgMCk7Ci0gICAgYXZfZGljdF9zZXQoJmRpY3QsICJmZiIsICJmIiwgQVZfRElDVF9BUFBFTkQpOwotICAgIGUgPSBOVUxMOwotICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKLSAgICAgICAgcHJpbnRmKCIlcyAlc1xuIiwgZS0+a2V5LCBlLT52YWx1ZSk7Ci0gICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKLQotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCBOVUxMLCAiYSIsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCBOVUxMLCAiYiIsIDApOwotICAgIGF2X2RpY3RfZ2V0KGRpY3QsIE5VTEwsIE5VTEwsIDApOwotICAgIGUgPSBOVUxMOwotICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKLSAgICAgICAgcHJpbnRmKCInJXMnICclcydcbiIsIGUtPmtleSwgZS0+dmFsdWUpOwotICAgIGF2X2RpY3RfZnJlZSgmZGljdCk7Ci0KLQotICAgIC8vdmFsZ3JpbmQgc2Vuc2libGUgdGVzdAotICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X2RpY3Rfc2V0X2ludCgpXG4iKTsKLSAgICBhdl9kaWN0X3NldF9pbnQoJmRpY3QsICIxIiwgMSwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOwotICAgIGF2X2RpY3Rfc2V0X2ludCgmZGljdCwgYXZfc3RyZHVwKCIyIiksIDIsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZKTsKLSAgICBhdl9kaWN0X3NldF9pbnQoJmRpY3QsIGF2X3N0cmR1cCgiMyIpLCAzLCBBVl9ESUNUX0RPTlRfU1RSRFVQX0tFWSB8IEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKLSAgICBhdl9kaWN0X3NldF9pbnQoJmRpY3QsICI0IiwgNCwgMCk7Ci0gICAgYXZfZGljdF9zZXRfaW50KCZkaWN0LCAiNSIsIDUsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOwotICAgIGF2X2RpY3Rfc2V0X2ludCgmZGljdCwgIjUiLCA2LCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKLSAgICBhdl9kaWN0X3NldF9pbnQoJmRpY3QsICIxMiIsIDEsIDApOwotICAgIGF2X2RpY3Rfc2V0X2ludCgmZGljdCwgIjEyIiwgMiwgQVZfRElDVF9BUFBFTkQpOwotICAgIGUgPSBOVUxMOwotICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKLSAgICAgICAgcHJpbnRmKCIlcyAlc1xuIiwgZS0+a2V5LCBlLT52YWx1ZSk7Ci0gICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKLQotICAgIC8vdmFsZ3JpbmQgc2Vuc2libGUgdGVzdAotICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X2RpY3Rfc2V0KCkgd2l0aCBleGlzdGluZyBBVkRpY3Rpb25hcnlFbnRyeS5rZXkgYXMga2V5XG4iKTsKLSAgICBhdl9kaWN0X3NldCgmZGljdCwgImtleSIsICJvbGQiLCAwKTsKLSAgICBlID0gYXZfZGljdF9nZXQoZGljdCwgImtleSIsIE5VTEwsIDApOwotICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCBlLT5rZXksICJuZXcgdmFsIE9LIiwgMCk7Ci0gICAgZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICJrZXkiLCBOVUxMLCAwKTsKLSAgICBwcmludGYoIiVzXG4iLCBlLT52YWx1ZSk7Ci0gICAgYXZfZGljdF9zZXQoJmRpY3QsIGUtPmtleSwgZS0+dmFsdWUsIDApOwotICAgIGUgPSBhdl9kaWN0X2dldChkaWN0LCAia2V5IiwgTlVMTCwgMCk7Ci0gICAgcHJpbnRmKCIlc1xuIiwgZS0+dmFsdWUpOwotICAgIGF2X2RpY3RfZnJlZSgmZGljdCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2RpY3QuaCBiL2xpYmF2dXRpbC9kaWN0LmgKaW5kZXggNWI4ZDAwMy4uMTE4ZjFmMCAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2RpY3QuaAorKysgYi9saWJhdnV0aWwvZGljdC5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNjUsNyArNjQsNiBAQAogICAgfQogICAgYXZfZGljdF9mcmVlKCZkKTsKICBAZW5kY29kZQotICoKICAqLwogCiAjZGVmaW5lIEFWX0RJQ1RfTUFUQ0hfQ0FTRSAgICAgIDEgICAvKio8IE9ubHkgZ2V0IGFuIGVudHJ5IHdpdGggZXhhY3QtY2FzZSBrZXkgbWF0Y2guIE9ubHkgcmVsZXZhbnQgaW4gYXZfZGljdF9nZXQoKS4gKi8KQEAgLTc4LDYgKzc2LDcgQEAKICNkZWZpbmUgQVZfRElDVF9ET05UX09WRVJXUklURSAxNiAgIC8vLzwgRG9uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGVudHJpZXMuCiAjZGVmaW5lIEFWX0RJQ1RfQVBQRU5EICAgICAgICAgMzIgICAvKio8IElmIHRoZSBlbnRyeSBhbHJlYWR5IGV4aXN0cywgYXBwZW5kIHRvIGl0LiAgTm90ZSB0aGF0IG5vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlciBpcyBhZGRlZCwgdGhlIHN0cmluZ3MgYXJlIHNpbXBseSBjb25jYXRlbmF0ZWQuICovCisjZGVmaW5lIEFWX0RJQ1RfTVVMVElLRVkgICAgICAgNjQgICAvKio8IEFsbG93IHRvIHN0b3JlIHNldmVyYWwgZXF1YWwga2V5cyBpbiB0aGUgZGljdGlvbmFyeSAqLwogCiB0eXBlZGVmIHN0cnVjdCBBVkRpY3Rpb25hcnlFbnRyeSB7CiAgICAgY2hhciAqa2V5OwpAQCAtMTE4LDEwICsxMTcsMTMgQEAKICAqIE5vdGU6IElmIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZIG9yIEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMIGlzIHNldCwKICAqIHRoZXNlIGFyZ3VtZW50cyB3aWxsIGJlIGZyZWVkIG9uIGVycm9yLgogICoKKyAqIFdhcm5pbmc6IEFkZGluZyBhIG5ldyBlbnRyeSB0byBhIGRpY3Rpb25hcnkgaW52YWxpZGF0ZXMgYWxsIGV4aXN0aW5nIGVudHJpZXMKKyAqIHByZXZpb3VzbHkgcmV0dXJuZWQgd2l0aCBhdl9kaWN0X2dldC4KKyAqCiAgKiBAcGFyYW0gcG0gcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gYSBkaWN0aW9uYXJ5IHN0cnVjdC4gSWYgKnBtIGlzIE5VTEwKICAqIGEgZGljdGlvbmFyeSBzdHJ1Y3QgaXMgYWxsb2NhdGVkIGFuZCBwdXQgaW4gKnBtLgotICogQHBhcmFtIGtleSBlbnRyeSBrZXkgdG8gYWRkIHRvICpwbSAod2lsbCBiZSBhdl9zdHJkdXBlZCBkZXBlbmRpbmcgb24gZmxhZ3MpCi0gKiBAcGFyYW0gdmFsdWUgZW50cnkgdmFsdWUgdG8gYWRkIHRvICpwbSAod2lsbCBiZSBhdl9zdHJkdXBlZCBkZXBlbmRpbmcgb24gZmxhZ3MpLgorICogQHBhcmFtIGtleSBlbnRyeSBrZXkgdG8gYWRkIHRvICpwbSAod2lsbCBlaXRoZXIgYmUgYXZfc3RyZHVwZWQgb3IgYWRkZWQgYXMgYSBuZXcga2V5IGRlcGVuZGluZyBvbiBmbGFncykKKyAqIEBwYXJhbSB2YWx1ZSBlbnRyeSB2YWx1ZSB0byBhZGQgdG8gKnBtICh3aWxsIGJlIGF2X3N0cmR1cGVkIG9yIGFkZGVkIGFzIGEgbmV3IGtleSBkZXBlbmRpbmcgb24gZmxhZ3MpLgogICogICAgICAgIFBhc3NpbmcgYSBOVUxMIHZhbHVlIHdpbGwgY2F1c2UgYW4gZXhpc3RpbmcgZW50cnkgdG8gYmUgZGVsZXRlZC4KICAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzIG90aGVyd2lzZSBhbiBlcnJvciBjb2RlIDwwCiAgKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9kaXNwbGF5LmggYi9saWJhdnV0aWwvZGlzcGxheS5oCmluZGV4IGMwY2ZlZTMuLjUxNWFkYWQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9kaXNwbGF5LmgKKysrIGIvbGliYXZ1dGlsL2Rpc3BsYXkuaApAQCAtMTgsMjEgKzE4LDM4IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorLyoqCisgKiBAZmlsZQorICogRGlzcGxheSBtYXRyaXgKKyAqLworCiAjaWZuZGVmIEFWVVRJTF9ESVNQTEFZX0gKICNkZWZpbmUgQVZVVElMX0RJU1BMQVlfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSAiY29tbW9uLmgiCiAKIC8qKgorICogQGFkZHRvZ3JvdXAgbGF2dV92aWRlbworICogQHsKKyAqCisgKiBAZGVmZ3JvdXAgbGF2dV92aWRlb19kaXNwbGF5IERpc3BsYXkgdHJhbnNmb3JtYXRpb24gbWF0cml4IGZ1bmN0aW9ucworICogQHsKKyAqLworCisvKioKKyAqIEBhZGR0b2dyb3VwIGxhdnVfdmlkZW9fZGlzcGxheQogICogVGhlIGRpc3BsYXkgdHJhbnNmb3JtYXRpb24gbWF0cml4IHNwZWNpZmllcyBhbiBhZmZpbmUgdHJhbnNmb3JtYXRpb24gdGhhdAogICogc2hvdWxkIGJlIGFwcGxpZWQgdG8gdmlkZW8gZnJhbWVzIGZvciBjb3JyZWN0IHByZXNlbnRhdGlvbi4gSXQgaXMgY29tcGF0aWJsZQogICogd2l0aCB0aGUgbWF0cmljZXMgc3RvcmVkIGluIHRoZSBJU08vSUVDIDE0NDk2LTEyIGNvbnRhaW5lciBmb3JtYXQuCiAgKgogICogVGhlIGRhdGEgaXMgYSAzeDMgbWF0cml4IHJlcHJlc2VudGVkIGFzIGEgOS1lbGVtZW50IGFycmF5OgogICoKKyAqIEBjb2Rley51bnBhcnNlZH0KICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYSBiIHUgfAogICogICAoYSwgYiwgdSwgYywgZCwgdiwgeCwgeSwgdykgLT4gfCBjIGQgdiB8CiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHggeSB3IHwKKyAqIEBlbmRjb2RlCiAgKgogICogQWxsIG51bWJlcnMgYXJlIHN0b3JlZCBpbiBuYXRpdmUgZW5kaWFubmVzcywgYXMgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWVzLAogICogZXhjZXB0IGZvciB1LCB2IGFuZCB3LCB3aGljaCBhcmUgc3RvcmVkIGFzIDIuMzAgZml4ZWQtcG9pbnQgdmFsdWVzLgpAQCAtNDAsMTUgKzU3LDIxIEBACiAgKiBUaGUgdHJhbnNmb3JtYXRpb24gbWFwcyBhIHBvaW50IChwLCBxKSBpbiB0aGUgc291cmNlIChwcmUtdHJhbnNmb3JtYXRpb24pCiAgKiBmcmFtZSB0byB0aGUgcG9pbnQgKHAnLCBxJykgaW4gdGhlIGRlc3RpbmF0aW9uIChwb3N0LXRyYW5zZm9ybWF0aW9uKSBmcmFtZSBhcwogICogZm9sbG93czoKKyAqCisgKiBAY29kZXsudW5wYXJzZWR9CiAgKiAgICAgICAgICAgICAgIHwgYSBiIHUgfAogICogICAocCwgcSwgMSkgLiB8IGMgZCB2IHwgPSB6ICogKHAnLCBxJywgMSkKICAqICAgICAgICAgICAgICAgfCB4IHkgdyB8CisgKiBAZW5kY29kZQogICoKICAqIFRoZSB0cmFuc2Zvcm1hdGlvbiBjYW4gYWxzbyBiZSBtb3JlIGV4cGxpY2l0bHkgd3JpdHRlbiBpbiBjb21wb25lbnRzIGFzCiAgKiBmb2xsb3dzOgorICoKKyAqIEBjb2Rley51bnBhcnNlZH0KICAqICAgcCcgPSAoYSAqIHAgKyBjICogcSArIHgpIC8gejsKICAqICAgcScgPSAoYiAqIHAgKyBkICogcSArIHkpIC8gejsKICAqICAgeiAgPSAgdSAqIHAgKyB2ICogcSArIHcKKyAqIEBlbmRjb2RlCiAgKi8KIAogLyoqCkBAIC04Myw0ICsxMDYsOSBAQAogICovCiB2b2lkIGF2X2Rpc3BsYXlfbWF0cml4X2ZsaXAoaW50MzJfdCBtYXRyaXhbOV0sIGludCBoZmxpcCwgaW50IHZmbGlwKTsKIAorLyoqCisgKiBAfQorICogQH0KKyAqLworCiAjZW5kaWYgLyogQVZVVElMX0RJU1BMQVlfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2R5bmFycmF5LmggYi9saWJhdnV0aWwvZHluYXJyYXkuaAppbmRleCA0OTQ3ZDkzLi4wMzRhOWZlIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvZHluYXJyYXkuaAorKysgYi9saWJhdnV0aWwvZHluYXJyYXkuaApAQCAtNDIsNyArNDIsNyBAQAogICogICAgICAgICAgICAgICAgICAgICBhcnJheSBhbmQgc2l6ZSBhcmUgbm90IGNoYW5nZWQ7IHRoZSBzdGF0ZW1lbnQgY2FuIGVuZAogICogICAgICAgICAgICAgICAgICAgICB3aXRoIGEgcmV0dXJuIG9yIGEgZ290bwogICovCi0jZGVmaW5lIEFWX0RZTkFSUkFZX0FERChhdl9zaXplX21heCwgYXZfZWx0X3NpemUsIGF2X2FycmF5LCBhdl9zaXplLCBcCisjZGVmaW5lIEZGX0RZTkFSUkFZX0FERChhdl9zaXplX21heCwgYXZfZWx0X3NpemUsIGF2X2FycmF5LCBhdl9zaXplLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICBhdl9zdWNjZXNzLCBhdl9mYWlsdXJlKSBcCiAgICAgZG8geyBcCiAgICAgICAgIHNpemVfdCBhdl9zaXplX25ldyA9IChhdl9zaXplKTsgXApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2VuY3J5cHRpb25faW5mby5jIGIvbGliYXZ1dGlsL2VuY3J5cHRpb25faW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYTc1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvZW5jcnlwdGlvbl9pbmZvLmMKQEAgLTAsMCArMSwyOTUgQEAKKy8qKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJlbmNyeXB0aW9uX2luZm8uaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJpbnRyZWFkd3JpdGUuaCIKKworI2RlZmluZSBGRl9FTkNSWVBUSU9OX0lORk9fRVhUUkEgMjQKKworLy8gVGhlIGZvcm1hdCBvZiB0aGUgQVZFbmNyeXB0aW9uSW5mbyBzaWRlIGRhdGE6CisvLyB1MzJiZSBzY2hlbWUKKy8vIHUzMmJlIGNyeXB0X2J5dGVfYmxvY2sKKy8vIHUzMmJlIHNraXBfYnl0ZV9ibG9jaworLy8gdTMyYmUga2V5X2lkX3NpemUKKy8vIHUzMmJlIGl2X3NpemUKKy8vIHUzMmJlIHN1YnNhbXBsZV9jb3VudAorLy8gdThba2V5X2lkX3NpemVdIGtleV9pZAorLy8gdThbaXZfc2l6ZV0gaXYKKy8vIHsKKy8vICAgdTMyYmUgYnl0ZXNfb2ZfY2xlYXJfZGF0YQorLy8gICB1MzJiZSBieXRlc19vZl9wcm90ZWN0ZWRfZGF0YQorLy8gfVtzdWJzYW1wbGVfY291bnRdCisKK0FWRW5jcnlwdGlvbkluZm8gKmF2X2VuY3J5cHRpb25faW5mb19hbGxvYyh1aW50MzJfdCBzdWJzYW1wbGVfY291bnQsIHVpbnQzMl90IGtleV9pZF9zaXplLCB1aW50MzJfdCBpdl9zaXplKQoreworICAgIEFWRW5jcnlwdGlvbkluZm8gKmluZm87CisKKyAgICBpbmZvID0gYXZfbWFsbG9jeihzaXplb2YoKmluZm8pKTsKKyAgICBpZiAoIWluZm8pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaW5mby0+a2V5X2lkID0gYXZfbWFsbG9jeihrZXlfaWRfc2l6ZSk7CisgICAgaW5mby0+a2V5X2lkX3NpemUgPSBrZXlfaWRfc2l6ZTsKKyAgICBpbmZvLT5pdiA9IGF2X21hbGxvY3ooaXZfc2l6ZSk7CisgICAgaW5mby0+aXZfc2l6ZSA9IGl2X3NpemU7CisgICAgaW5mby0+c3Vic2FtcGxlcyA9IGF2X21hbGxvY3pfYXJyYXkoc3Vic2FtcGxlX2NvdW50LCBzaXplb2YoKmluZm8tPnN1YnNhbXBsZXMpKTsKKyAgICBpbmZvLT5zdWJzYW1wbGVfY291bnQgPSBzdWJzYW1wbGVfY291bnQ7CisKKyAgICAvLyBBbGxvdyBpbmZvLT5zdWJzYW1wbGVzIHRvIGJlIE5VTEwgaWYgdGhlcmUgYXJlIG5vIHN1YnNhbXBsZXMuCisgICAgaWYgKCFpbmZvLT5rZXlfaWQgfHwgIWluZm8tPml2IHx8ICghaW5mby0+c3Vic2FtcGxlcyAmJiBzdWJzYW1wbGVfY291bnQpKSB7CisgICAgICAgIGF2X2VuY3J5cHRpb25faW5mb19mcmVlKGluZm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gaW5mbzsKK30KKworQVZFbmNyeXB0aW9uSW5mbyAqYXZfZW5jcnlwdGlvbl9pbmZvX2Nsb25lKGNvbnN0IEFWRW5jcnlwdGlvbkluZm8gKmluZm8pCit7CisgICAgQVZFbmNyeXB0aW9uSW5mbyAqcmV0OworCisgICAgcmV0ID0gYXZfZW5jcnlwdGlvbl9pbmZvX2FsbG9jKGluZm8tPnN1YnNhbXBsZV9jb3VudCwgaW5mby0+a2V5X2lkX3NpemUsIGluZm8tPml2X3NpemUpOworICAgIGlmICghcmV0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldC0+c2NoZW1lID0gaW5mby0+c2NoZW1lOworICAgIHJldC0+Y3J5cHRfYnl0ZV9ibG9jayA9IGluZm8tPmNyeXB0X2J5dGVfYmxvY2s7CisgICAgcmV0LT5za2lwX2J5dGVfYmxvY2sgPSBpbmZvLT5za2lwX2J5dGVfYmxvY2s7CisgICAgbWVtY3B5KHJldC0+aXYsIGluZm8tPml2LCBpbmZvLT5pdl9zaXplKTsKKyAgICBtZW1jcHkocmV0LT5rZXlfaWQsIGluZm8tPmtleV9pZCwgaW5mby0+a2V5X2lkX3NpemUpOworICAgIG1lbWNweShyZXQtPnN1YnNhbXBsZXMsIGluZm8tPnN1YnNhbXBsZXMsIHNpemVvZigqaW5mby0+c3Vic2FtcGxlcykgKiBpbmZvLT5zdWJzYW1wbGVfY291bnQpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgYXZfZW5jcnlwdGlvbl9pbmZvX2ZyZWUoQVZFbmNyeXB0aW9uSW5mbyAqaW5mbykKK3sKKyAgICBpZiAoaW5mbykgeworICAgICAgICBhdl9mcmVlKGluZm8tPmtleV9pZCk7CisgICAgICAgIGF2X2ZyZWUoaW5mby0+aXYpOworICAgICAgICBhdl9mcmVlKGluZm8tPnN1YnNhbXBsZXMpOworICAgICAgICBhdl9mcmVlKGluZm8pOworICAgIH0KK30KKworQVZFbmNyeXB0aW9uSW5mbyAqYXZfZW5jcnlwdGlvbl9pbmZvX2dldF9zaWRlX2RhdGEoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgICBBVkVuY3J5cHRpb25JbmZvICppbmZvOworICAgIHVpbnQ2NF90IGtleV9pZF9zaXplLCBpdl9zaXplLCBzdWJzYW1wbGVfY291bnQsIGk7CisKKyAgICBpZiAoIWJ1ZmZlciB8fCBzaXplIDwgRkZfRU5DUllQVElPTl9JTkZPX0VYVFJBKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGtleV9pZF9zaXplID0gQVZfUkIzMihidWZmZXIgKyAxMik7CisgICAgaXZfc2l6ZSA9IEFWX1JCMzIoYnVmZmVyICsgMTYpOworICAgIHN1YnNhbXBsZV9jb3VudCA9IEFWX1JCMzIoYnVmZmVyICsgMjApOworCisgICAgaWYgKHNpemUgPCBGRl9FTkNSWVBUSU9OX0lORk9fRVhUUkEgKyBrZXlfaWRfc2l6ZSArIGl2X3NpemUgKyBzdWJzYW1wbGVfY291bnQgKiA4KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGluZm8gPSBhdl9lbmNyeXB0aW9uX2luZm9fYWxsb2Moc3Vic2FtcGxlX2NvdW50LCBrZXlfaWRfc2l6ZSwgaXZfc2l6ZSk7CisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGluZm8tPnNjaGVtZSA9IEFWX1JCMzIoYnVmZmVyKTsKKyAgICBpbmZvLT5jcnlwdF9ieXRlX2Jsb2NrID0gQVZfUkIzMihidWZmZXIgKyA0KTsKKyAgICBpbmZvLT5za2lwX2J5dGVfYmxvY2sgPSBBVl9SQjMyKGJ1ZmZlciArIDgpOworICAgIG1lbWNweShpbmZvLT5rZXlfaWQsIGJ1ZmZlciArIDI0LCBrZXlfaWRfc2l6ZSk7CisgICAgbWVtY3B5KGluZm8tPml2LCBidWZmZXIgKyBrZXlfaWRfc2l6ZSArIDI0LCBpdl9zaXplKTsKKworICAgIGJ1ZmZlciArPSBrZXlfaWRfc2l6ZSArIGl2X3NpemUgKyAyNDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3Vic2FtcGxlX2NvdW50OyBpKyspIHsKKyAgICAgICAgaW5mby0+c3Vic2FtcGxlc1tpXS5ieXRlc19vZl9jbGVhcl9kYXRhID0gQVZfUkIzMihidWZmZXIpOworICAgICAgICBpbmZvLT5zdWJzYW1wbGVzW2ldLmJ5dGVzX29mX3Byb3RlY3RlZF9kYXRhID0gQVZfUkIzMihidWZmZXIgKyA0KTsKKyAgICAgICAgYnVmZmVyICs9IDg7CisgICAgfQorCisgICAgcmV0dXJuIGluZm87Cit9CisKK3VpbnQ4X3QgKmF2X2VuY3J5cHRpb25faW5mb19hZGRfc2lkZV9kYXRhKGNvbnN0IEFWRW5jcnlwdGlvbkluZm8gKmluZm8sIHNpemVfdCAqc2l6ZSkKK3sKKyAgICB1aW50OF90ICpidWZmZXIsICpjdXJfYnVmZmVyOworICAgIHVpbnQzMl90IGk7CisKKyAgICBpZiAoVUlOVDMyX01BWCAtIEZGX0VOQ1JZUFRJT05fSU5GT19FWFRSQSA8IGluZm8tPmtleV9pZF9zaXplIHx8CisgICAgICAgIFVJTlQzMl9NQVggLSBGRl9FTkNSWVBUSU9OX0lORk9fRVhUUkEgLSBpbmZvLT5rZXlfaWRfc2l6ZSA8IGluZm8tPml2X3NpemUgfHwKKyAgICAgICAgKFVJTlQzMl9NQVggLSBGRl9FTkNSWVBUSU9OX0lORk9fRVhUUkEgLSBpbmZvLT5rZXlfaWRfc2l6ZSAtIGluZm8tPml2X3NpemUpIC8gOCA8IGluZm8tPnN1YnNhbXBsZV9jb3VudCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IEZGX0VOQ1JZUFRJT05fSU5GT19FWFRSQSArIGluZm8tPmtleV9pZF9zaXplICsgaW5mby0+aXZfc2l6ZSArCisgICAgICAgICAgICAoaW5mby0+c3Vic2FtcGxlX2NvdW50ICogOCk7CisgICAgY3VyX2J1ZmZlciA9IGJ1ZmZlciA9IGF2X21hbGxvYygqc2l6ZSk7CisgICAgaWYgKCFidWZmZXIpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgQVZfV0IzMihjdXJfYnVmZmVyLCAgICAgIGluZm8tPnNjaGVtZSk7CisgICAgQVZfV0IzMihjdXJfYnVmZmVyICsgIDQsIGluZm8tPmNyeXB0X2J5dGVfYmxvY2spOworICAgIEFWX1dCMzIoY3VyX2J1ZmZlciArICA4LCBpbmZvLT5za2lwX2J5dGVfYmxvY2spOworICAgIEFWX1dCMzIoY3VyX2J1ZmZlciArIDEyLCBpbmZvLT5rZXlfaWRfc2l6ZSk7CisgICAgQVZfV0IzMihjdXJfYnVmZmVyICsgMTYsIGluZm8tPml2X3NpemUpOworICAgIEFWX1dCMzIoY3VyX2J1ZmZlciArIDIwLCBpbmZvLT5zdWJzYW1wbGVfY291bnQpOworICAgIGN1cl9idWZmZXIgKz0gMjQ7CisgICAgbWVtY3B5KGN1cl9idWZmZXIsIGluZm8tPmtleV9pZCwgaW5mby0+a2V5X2lkX3NpemUpOworICAgIGN1cl9idWZmZXIgKz0gaW5mby0+a2V5X2lkX3NpemU7CisgICAgbWVtY3B5KGN1cl9idWZmZXIsIGluZm8tPml2LCBpbmZvLT5pdl9zaXplKTsKKyAgICBjdXJfYnVmZmVyICs9IGluZm8tPml2X3NpemU7CisgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPnN1YnNhbXBsZV9jb3VudDsgaSsrKSB7CisgICAgICAgIEFWX1dCMzIoY3VyX2J1ZmZlciwgaW5mby0+c3Vic2FtcGxlc1tpXS5ieXRlc19vZl9jbGVhcl9kYXRhKTsKKyAgICAgICAgQVZfV0IzMihjdXJfYnVmZmVyICsgNCwgaW5mby0+c3Vic2FtcGxlc1tpXS5ieXRlc19vZl9wcm90ZWN0ZWRfZGF0YSk7CisgICAgICAgIGN1cl9idWZmZXIgKz0gODsKKyAgICB9CisKKyAgICByZXR1cm4gYnVmZmVyOworfQorCisvLyBUaGUgZm9ybWF0IG9mIHRoZSBBVkVuY3J5cHRpb25Jbml0SW5mbyBzaWRlIGRhdGE6CisvLyB1MzJiZSBzeXN0ZW1faWRfc2l6ZQorLy8gdTMyYmUgbnVtX2tleV9pZHMKKy8vIHUzMmJlIGtleV9pZF9zaXplCisvLyB1MzJiZSBkYXRhX3NpemUKKy8vIHU4W3N5c3RlbV9pZF9zaXplXSBzeXN0ZW1faWQKKy8vIHU4W2tleV9pZF9zaXplXVtudW1fa2V5X2lkXSBrZXlfaWRzCisvLyB1OFtkYXRhX3NpemVdIGRhdGEKKworI2RlZmluZSBGRl9FTkNSWVBUSU9OX0lOSVRfSU5GT19FWFRSQSAxNgorCitBVkVuY3J5cHRpb25Jbml0SW5mbyAqYXZfZW5jcnlwdGlvbl9pbml0X2luZm9fYWxsb2MoCisgICAgdWludDMyX3Qgc3lzdGVtX2lkX3NpemUsIHVpbnQzMl90IG51bV9rZXlfaWRzLCB1aW50MzJfdCBrZXlfaWRfc2l6ZSwgdWludDMyX3QgZGF0YV9zaXplKQoreworICAgIEFWRW5jcnlwdGlvbkluaXRJbmZvICppbmZvOworICAgIHVpbnQzMl90IGk7CisKKyAgICBpbmZvID0gYXZfbWFsbG9jeihzaXplb2YoKmluZm8pKTsKKyAgICBpZiAoIWluZm8pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaW5mby0+c3lzdGVtX2lkID0gYXZfbWFsbG9jeihzeXN0ZW1faWRfc2l6ZSk7CisgICAgaW5mby0+c3lzdGVtX2lkX3NpemUgPSBzeXN0ZW1faWRfc2l6ZTsKKyAgICBpbmZvLT5rZXlfaWRzID0ga2V5X2lkX3NpemUgPyBhdl9tYWxsb2N6X2FycmF5KG51bV9rZXlfaWRzLCBzaXplb2YoKmluZm8tPmtleV9pZHMpKSA6IE5VTEw7CisgICAgaW5mby0+bnVtX2tleV9pZHMgPSBudW1fa2V5X2lkczsKKyAgICBpbmZvLT5rZXlfaWRfc2l6ZSA9IGtleV9pZF9zaXplOworICAgIGluZm8tPmRhdGEgPSBhdl9tYWxsb2N6KGRhdGFfc2l6ZSk7CisgICAgaW5mby0+ZGF0YV9zaXplID0gZGF0YV9zaXplOworCisgICAgLy8gQWxsb3cgcG9pbnRlcnMgdG8gYmUgTlVMTCBpZiB0aGUgc2l6ZSBpcyAwLgorICAgIGlmICgoIWluZm8tPnN5c3RlbV9pZCAmJiBzeXN0ZW1faWRfc2l6ZSkgfHwgKCFpbmZvLT5kYXRhICYmIGRhdGFfc2l6ZSkgfHwKKyAgICAgICAgKCFpbmZvLT5rZXlfaWRzICYmIG51bV9rZXlfaWRzICYmIGtleV9pZF9zaXplKSkgeworICAgICAgICBhdl9lbmNyeXB0aW9uX2luaXRfaW5mb19mcmVlKGluZm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoa2V5X2lkX3NpemUpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9rZXlfaWRzOyBpKyspIHsKKyAgICAgICAgICAgIGluZm8tPmtleV9pZHNbaV0gPSBhdl9tYWxsb2N6KGtleV9pZF9zaXplKTsKKyAgICAgICAgICAgIGlmICghaW5mby0+a2V5X2lkc1tpXSkgeworICAgICAgICAgICAgICAgIGF2X2VuY3J5cHRpb25faW5pdF9pbmZvX2ZyZWUoaW5mbyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gaW5mbzsKK30KKwordm9pZCBhdl9lbmNyeXB0aW9uX2luaXRfaW5mb19mcmVlKEFWRW5jcnlwdGlvbkluaXRJbmZvICppbmZvKQoreworICAgIHVpbnQzMl90IGk7CisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGluZm8tPm51bV9rZXlfaWRzOyBpKyspIHsKKyAgICAgICAgICAgIGF2X2ZyZWUoaW5mby0+a2V5X2lkc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShpbmZvLT5zeXN0ZW1faWQpOworICAgICAgICBhdl9mcmVlKGluZm8tPmtleV9pZHMpOworICAgICAgICBhdl9mcmVlKGluZm8tPmRhdGEpOworICAgICAgICBhdl9mcmVlKGluZm8pOworICAgIH0KK30KKworQVZFbmNyeXB0aW9uSW5pdEluZm8gKmF2X2VuY3J5cHRpb25faW5pdF9pbmZvX2dldF9zaWRlX2RhdGEoCisgICAgY29uc3QgdWludDhfdCAqc2lkZV9kYXRhLCBzaXplX3Qgc2lkZV9kYXRhX3NpemUpCit7CisgICAgQVZFbmNyeXB0aW9uSW5pdEluZm8gKmluZm87CisgICAgdWludDY0X3Qgc3lzdGVtX2lkX3NpemUsIG51bV9rZXlfaWRzLCBrZXlfaWRfc2l6ZSwgZGF0YV9zaXplLCBpOworCisgICAgaWYgKCFzaWRlX2RhdGEgfHwgc2lkZV9kYXRhX3NpemUgPCBGRl9FTkNSWVBUSU9OX0lOSVRfSU5GT19FWFRSQSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzeXN0ZW1faWRfc2l6ZSA9IEFWX1JCMzIoc2lkZV9kYXRhKTsKKyAgICBudW1fa2V5X2lkcyA9IEFWX1JCMzIoc2lkZV9kYXRhICsgNCk7CisgICAga2V5X2lkX3NpemUgPSBBVl9SQjMyKHNpZGVfZGF0YSArIDgpOworICAgIGRhdGFfc2l6ZSA9IEFWX1JCMzIoc2lkZV9kYXRhICsgMTIpOworCisgICAgLy8gVUlOVDMyX01BWCArIFVJTlQzMl9NQVggKyBVSU5UMzJfTUFYICogVUlOVDMyX01BWCA9PSBVSU5UNjRfTUFYCisgICAgaWYgKHNpZGVfZGF0YV9zaXplIC0gRkZfRU5DUllQVElPTl9JTklUX0lORk9fRVhUUkEgPCBzeXN0ZW1faWRfc2l6ZSArIGRhdGFfc2l6ZSArIG51bV9rZXlfaWRzICoga2V5X2lkX3NpemUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaW5mbyA9IGF2X2VuY3J5cHRpb25faW5pdF9pbmZvX2FsbG9jKHN5c3RlbV9pZF9zaXplLCBudW1fa2V5X2lkcywga2V5X2lkX3NpemUsIGRhdGFfc2l6ZSk7CisgICAgaWYgKCFpbmZvKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIG1lbWNweShpbmZvLT5zeXN0ZW1faWQsIHNpZGVfZGF0YSArIDE2LCBzeXN0ZW1faWRfc2l6ZSk7CisgICAgc2lkZV9kYXRhICs9IHN5c3RlbV9pZF9zaXplICsgMTY7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9rZXlfaWRzOyBpKyspIHsKKyAgICAgIG1lbWNweShpbmZvLT5rZXlfaWRzW2ldLCBzaWRlX2RhdGEsIGtleV9pZF9zaXplKTsKKyAgICAgIHNpZGVfZGF0YSArPSBrZXlfaWRfc2l6ZTsKKyAgICB9CisgICAgbWVtY3B5KGluZm8tPmRhdGEsIHNpZGVfZGF0YSwgZGF0YV9zaXplKTsKKworICAgIHJldHVybiBpbmZvOworfQorCit1aW50OF90ICphdl9lbmNyeXB0aW9uX2luaXRfaW5mb19hZGRfc2lkZV9kYXRhKGNvbnN0IEFWRW5jcnlwdGlvbkluaXRJbmZvICppbmZvLCBzaXplX3QgKnNpZGVfZGF0YV9zaXplKQoreworICAgIHVpbnQ4X3QgKmJ1ZmZlciwgKmN1cl9idWZmZXI7CisgICAgdWludDMyX3QgaSwgbWF4X3NpemU7CisKKyAgICBpZiAoVUlOVDMyX01BWCAtIEZGX0VOQ1JZUFRJT05fSU5JVF9JTkZPX0VYVFJBIDwgaW5mby0+c3lzdGVtX2lkX3NpemUgfHwKKyAgICAgICAgVUlOVDMyX01BWCAtIEZGX0VOQ1JZUFRJT05fSU5JVF9JTkZPX0VYVFJBIC0gaW5mby0+c3lzdGVtX2lkX3NpemUgPCBpbmZvLT5kYXRhX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGluZm8tPm51bV9rZXlfaWRzKSB7CisgICAgICAgIG1heF9zaXplID0gVUlOVDMyX01BWCAtIEZGX0VOQ1JZUFRJT05fSU5JVF9JTkZPX0VYVFJBIC0gaW5mby0+c3lzdGVtX2lkX3NpemUgLSBpbmZvLT5kYXRhX3NpemU7CisgICAgICAgIGlmIChtYXhfc2l6ZSAvIGluZm8tPm51bV9rZXlfaWRzIDwgaW5mby0+a2V5X2lkX3NpemUpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAqc2lkZV9kYXRhX3NpemUgPSBGRl9FTkNSWVBUSU9OX0lOSVRfSU5GT19FWFRSQSArIGluZm8tPnN5c3RlbV9pZF9zaXplICsKKyAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5kYXRhX3NpemUgKyAoaW5mby0+bnVtX2tleV9pZHMgKiBpbmZvLT5rZXlfaWRfc2l6ZSk7CisgICAgY3VyX2J1ZmZlciA9IGJ1ZmZlciA9IGF2X21hbGxvYygqc2lkZV9kYXRhX3NpemUpOworICAgIGlmICghYnVmZmVyKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIEFWX1dCMzIoY3VyX2J1ZmZlciwgICAgICBpbmZvLT5zeXN0ZW1faWRfc2l6ZSk7CisgICAgQVZfV0IzMihjdXJfYnVmZmVyICsgIDQsIGluZm8tPm51bV9rZXlfaWRzKTsKKyAgICBBVl9XQjMyKGN1cl9idWZmZXIgKyAgOCwgaW5mby0+a2V5X2lkX3NpemUpOworICAgIEFWX1dCMzIoY3VyX2J1ZmZlciArIDEyLCBpbmZvLT5kYXRhX3NpemUpOworICAgIGN1cl9idWZmZXIgKz0gMTY7CisKKyAgICBtZW1jcHkoY3VyX2J1ZmZlciwgaW5mby0+c3lzdGVtX2lkLCBpbmZvLT5zeXN0ZW1faWRfc2l6ZSk7CisgICAgY3VyX2J1ZmZlciArPSBpbmZvLT5zeXN0ZW1faWRfc2l6ZTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+bnVtX2tleV9pZHM7IGkrKykgeworICAgICAgICBtZW1jcHkoY3VyX2J1ZmZlciwgaW5mby0+a2V5X2lkc1tpXSwgaW5mby0+a2V5X2lkX3NpemUpOworICAgICAgICBjdXJfYnVmZmVyICs9IGluZm8tPmtleV9pZF9zaXplOworICAgIH0KKyAgICBtZW1jcHkoY3VyX2J1ZmZlciwgaW5mby0+ZGF0YSwgaW5mby0+ZGF0YV9zaXplKTsKKworICAgIHJldHVybiBidWZmZXI7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvZW5jcnlwdGlvbl9pbmZvLmggYi9saWJhdnV0aWwvZW5jcnlwdGlvbl9pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdkYzNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9lbmNyeXB0aW9uX2luZm8uaApAQCAtMCwwICsxLDIwMCBAQAorLyoqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfRU5DUllQVElPTl9JTkZPX0gKKyNkZWZpbmUgQVZVVElMX0VOQ1JZUFRJT05fSU5GT19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwordHlwZWRlZiBzdHJ1Y3QgQVZTdWJzYW1wbGVFbmNyeXB0aW9uSW5mbyB7CisgICAgLyoqIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgY2xlYXIuICovCisgICAgdW5zaWduZWQgaW50IGJ5dGVzX29mX2NsZWFyX2RhdGE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIHByb3RlY3RlZC4gIElmIHVzaW5nIHBhdHRlcm4gZW5jcnlwdGlvbiwKKyAgICAgKiB0aGUgcGF0dGVybiBhcHBsaWVzIHRvIG9ubHkgdGhlIHByb3RlY3RlZCBieXRlczsgaWYgbm90IHVzaW5nIHBhdHRlcm4KKyAgICAgKiBlbmNyeXB0aW9uLCBhbGwgdGhlc2UgYnl0ZXMgYXJlIGVuY3J5cHRlZC4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgYnl0ZXNfb2ZfcHJvdGVjdGVkX2RhdGE7Cit9IEFWU3Vic2FtcGxlRW5jcnlwdGlvbkluZm87CisKKy8qKgorICogVGhpcyBkZXNjcmliZXMgZW5jcnlwdGlvbiBpbmZvIGZvciBhIHBhY2tldC4gIFRoaXMgY29udGFpbnMgZnJhbWUtc3BlY2lmaWMKKyAqIGluZm8gZm9yIGhvdyB0byBkZWNyeXB0IHRoZSBwYWNrZXQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIGRlY29kZXIuCisgKgorICogVGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3QgaXMgbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBQkkuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRW5jcnlwdGlvbkluZm8geworICAgIC8qKiBUaGUgZm91cmNjIGVuY3J5cHRpb24gc2NoZW1lLiAqLworICAgIHVpbnQzMl90IHNjaGVtZTsKKworICAgIC8qKgorICAgICAqIE9ubHkgdXNlZCBmb3IgcGF0dGVybiBlbmNyeXB0aW9uLiAgVGhpcyBpcyB0aGUgbnVtYmVyIG9mIDE2LWJ5dGUgYmxvY2tzCisgICAgICogdGhhdCBhcmUgZW5jcnlwdGVkLgorICAgICAqLworICAgIHVpbnQzMl90IGNyeXB0X2J5dGVfYmxvY2s7CisKKyAgICAvKioKKyAgICAgKiBPbmx5IHVzZWQgZm9yIHBhdHRlcm4gZW5jcnlwdGlvbi4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiAxNi1ieXRlIGJsb2NrcworICAgICAqIHRoYXQgYXJlIGNsZWFyLgorICAgICAqLworICAgIHVpbnQzMl90IHNraXBfYnl0ZV9ibG9jazsKKworICAgIC8qKgorICAgICAqIFRoZSBJRCBvZiB0aGUga2V5IHVzZWQgdG8gZW5jcnlwdCB0aGUgcGFja2V0LiAgVGhpcyBzaG91bGQgYWx3YXlzIGJlCisgICAgICogMTYgYnl0ZXMgbG9uZywgYnV0IG1heSBiZSBjaGFuZ2VkIGluIHRoZSBmdXR1cmUuCisgICAgICovCisgICAgdWludDhfdCAqa2V5X2lkOworICAgIHVpbnQzMl90IGtleV9pZF9zaXplOworCisgICAgLyoqCisgICAgICogVGhlIGluaXRpYWxpemF0aW9uIHZlY3Rvci4gIFRoaXMgbWF5IGhhdmUgYmVlbiB6ZXJvLWZpbGxlZCB0byBiZSB0aGUKKyAgICAgKiBjb3JyZWN0IGJsb2NrIHNpemUuICBUaGlzIHNob3VsZCBhbHdheXMgYmUgMTYgYnl0ZXMgbG9uZywgYnV0IG1heSBiZQorICAgICAqIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKi8KKyAgICB1aW50OF90ICppdjsKKyAgICB1aW50MzJfdCBpdl9zaXplOworCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgb2Ygc3Vic2FtcGxlIGVuY3J5cHRpb24gaW5mbyBzcGVjaWZ5aW5nIGhvdyBwYXJ0cyBvZiB0aGUgc2FtcGxlCisgICAgICogYXJlIGVuY3J5cHRlZC4gIElmIHRoZXJlIGFyZSBubyBzdWJzYW1wbGVzLCB0aGVuIHRoZSB3aG9sZSBzYW1wbGUgaXMKKyAgICAgKiBlbmNyeXB0ZWQuCisgICAgICovCisgICAgQVZTdWJzYW1wbGVFbmNyeXB0aW9uSW5mbyAqc3Vic2FtcGxlczsKKyAgICB1aW50MzJfdCBzdWJzYW1wbGVfY291bnQ7Cit9IEFWRW5jcnlwdGlvbkluZm87CisKKy8qKgorICogVGhpcyBkZXNjcmliZXMgaW5mbyB1c2VkIHRvIGluaXRpYWxpemUgYW4gZW5jcnlwdGlvbiBrZXkgc3lzdGVtLgorICoKKyAqIFRoZSBzaXplIG9mIHRoaXMgc3RydWN0IGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQUJJLgorICovCit0eXBlZGVmIHN0cnVjdCBBVkVuY3J5cHRpb25Jbml0SW5mbyB7CisgICAgLyoqCisgICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGtleSBzeXN0ZW0gdGhpcyBpcyBmb3IsIGNhbiBiZSBOVUxMIGlmIGl0CisgICAgICogaXMgbm90IGtub3duLiAgVGhpcyBzaG91bGQgYWx3YXlzIGJlIDE2IGJ5dGVzLCBidXQgbWF5IGNoYW5nZSBpbiB0aGUKKyAgICAgKiBmdXR1cmUuCisgICAgICovCisgICAgdWludDhfdCogc3lzdGVtX2lkOworICAgIHVpbnQzMl90IHN5c3RlbV9pZF9zaXplOworCisgICAgLyoqCisgICAgICogQW4gYXJyYXkgb2Yga2V5IElEcyB0aGlzIGluaXRpYWxpemF0aW9uIGRhdGEgaXMgZm9yLiAgQWxsIElEcyBhcmUgdGhlCisgICAgICogc2FtZSBsZW5ndGguICBDYW4gYmUgTlVMTCBpZiB0aGVyZSBhcmUgbm8ga25vd24ga2V5IElEcy4KKyAgICAgKi8KKyAgICB1aW50OF90Kioga2V5X2lkczsKKyAgICAvKiogVGhlIG51bWJlciBvZiBrZXkgSURzLiAqLworICAgIHVpbnQzMl90IG51bV9rZXlfaWRzOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gZWFjaCBrZXkgSUQuICBUaGlzIHNob3VsZCBhbHdheXMgYmUgMTYsIGJ1dCBtYXkKKyAgICAgKiBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBrZXlfaWRfc2l6ZTsKKworICAgIC8qKgorICAgICAqIEtleS1zeXN0ZW0gc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZGF0YS4gIFRoaXMgZGF0YSBpcyBjb3BpZWQgZGlyZWN0bHkKKyAgICAgKiBmcm9tIHRoZSBmaWxlIGFuZCB0aGUgZm9ybWF0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIGtleSBzeXN0ZW0uICBUaGlzCisgICAgICogY2FuIGJlIE5VTEwgaWYgdGhlcmUgaXMgbm8gaW5pdGlhbGl6YXRpb24gZGF0YTsgaW4gdGhhdCBjYXNlLCB0aGVyZQorICAgICAqIHdpbGwgYmUgYXQgbGVhc3Qgb25lIGtleSBJRC4KKyAgICAgKi8KKyAgICB1aW50OF90KiBkYXRhOworICAgIHVpbnQzMl90IGRhdGFfc2l6ZTsKK30gQVZFbmNyeXB0aW9uSW5pdEluZm87CisKKy8qKgorICogQWxsb2NhdGVzIGFuIEFWRW5jcnlwdGlvbkluZm8gc3RydWN0dXJlIGFuZCBzdWItcG9pbnRlcnMgdG8gaG9sZCB0aGUgZ2l2ZW4KKyAqIG51bWJlciBvZiBzdWJzYW1wbGVzLiAgVGhpcyB3aWxsIGFsbG9jYXRlIHBvaW50ZXJzIGZvciB0aGUga2V5IElELCBJViwKKyAqIGFuZCBzdWJzYW1wbGUgZW50cmllcywgc2V0IHRoZSBzaXplIG1lbWJlcnMsIGFuZCB6ZXJvLWluaXRpYWxpemUgdGhlIHJlc3QuCisgKgorICogQHBhcmFtIHN1YnNhbXBsZV9jb3VudCBUaGUgbnVtYmVyIG9mIHN1YnNhbXBsZXMuCisgKiBAcGFyYW0ga2V5X2lkX3NpemUgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUga2V5IElELCBzaG91bGQgYmUgMTYuCisgKiBAcGFyYW0ga2V5X2lkX3NpemUgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgSVYsIHNob3VsZCBiZSAxNi4KKyAqCisgKiBAcmV0dXJuIFRoZSBuZXcgQVZFbmNyeXB0aW9uSW5mbyBzdHJ1Y3R1cmUsIG9yIE5VTEwgb24gZXJyb3IuCisgKi8KK0FWRW5jcnlwdGlvbkluZm8gKmF2X2VuY3J5cHRpb25faW5mb19hbGxvYyh1aW50MzJfdCBzdWJzYW1wbGVfY291bnQsIHVpbnQzMl90IGtleV9pZF9zaXplLCB1aW50MzJfdCBpdl9zaXplKTsKKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gQVZFbmNyeXB0aW9uSW5mbyBzdHJ1Y3R1cmUgd2l0aCBhIGNvcHkgb2YgdGhlIGdpdmVuIGRhdGEuCisgKiBAcmV0dXJuIFRoZSBuZXcgQVZFbmNyeXB0aW9uSW5mbyBzdHJ1Y3R1cmUsIG9yIE5VTEwgb24gZXJyb3IuCisgKi8KK0FWRW5jcnlwdGlvbkluZm8gKmF2X2VuY3J5cHRpb25faW5mb19jbG9uZShjb25zdCBBVkVuY3J5cHRpb25JbmZvICppbmZvKTsKKworLyoqCisgKiBGcmVlcyB0aGUgZ2l2ZW4gZW5jcnlwdGlvbiBpbmZvIG9iamVjdC4gIFRoaXMgTVVTVCBOT1QgYmUgdXNlZCB0byBmcmVlIHRoZQorICogc2lkZS1kYXRhIGRhdGEgcG9pbnRlciwgdGhhdCBzaG91bGQgdXNlIG5vcm1hbCBzaWRlLWRhdGEgbWV0aG9kcy4KKyAqLwordm9pZCBhdl9lbmNyeXB0aW9uX2luZm9fZnJlZShBVkVuY3J5cHRpb25JbmZvICppbmZvKTsKKworLyoqCisgKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgQVZFbmNyeXB0aW9uSW5mbyB0aGF0IGlzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gc2lkZQorICogZGF0YS4gIFRoZSByZXN1bHRpbmcgb2JqZWN0IHNob3VsZCBiZSBwYXNzZWQgdG8gYXZfZW5jcnlwdGlvbl9pbmZvX2ZyZWUoKQorICogd2hlbiBkb25lLgorICoKKyAqIEByZXR1cm4gVGhlIG5ldyBBVkVuY3J5cHRpb25JbmZvIHN0cnVjdHVyZSwgb3IgTlVMTCBvbiBlcnJvci4KKyAqLworQVZFbmNyeXB0aW9uSW5mbyAqYXZfZW5jcnlwdGlvbl9pbmZvX2dldF9zaWRlX2RhdGEoY29uc3QgdWludDhfdCAqc2lkZV9kYXRhLCBzaXplX3Qgc2lkZV9kYXRhX3NpemUpOworCisvKioKKyAqIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgc2lkZSBkYXRhIHRoYXQgaG9sZHMgYSBjb3B5IG9mIHRoZSBnaXZlbiBlbmNyeXB0aW9uCisgKiBpbmZvLiAgVGhlIHJlc3VsdGluZyBwb2ludGVyIHNob3VsZCBiZSBlaXRoZXIgZnJlZWQgdXNpbmcgYXZfZnJlZSBvciBnaXZlbgorICogdG8gYXZfcGFja2V0X2FkZF9zaWRlX2RhdGEoKS4KKyAqCisgKiBAcmV0dXJuIFRoZSBuZXcgc2lkZS1kYXRhIHBvaW50ZXIsIG9yIE5VTEwuCisgKi8KK3VpbnQ4X3QgKmF2X2VuY3J5cHRpb25faW5mb19hZGRfc2lkZV9kYXRhKAorICAgICAgY29uc3QgQVZFbmNyeXB0aW9uSW5mbyAqaW5mbywgc2l6ZV90ICpzaWRlX2RhdGFfc2l6ZSk7CisKKworLyoqCisgKiBBbGxvY2F0ZXMgYW4gQVZFbmNyeXB0aW9uSW5pdEluZm8gc3RydWN0dXJlIGFuZCBzdWItcG9pbnRlcnMgdG8gaG9sZCB0aGUKKyAqIGdpdmVuIHNpemVzLiAgVGhpcyB3aWxsIGFsbG9jYXRlIHBvaW50ZXJzIGFuZCBzZXQgYWxsIHRoZSBmaWVsZHMuCisgKgorICogQHJldHVybiBUaGUgbmV3IEFWRW5jcnlwdGlvbkluaXRJbmZvIHN0cnVjdHVyZSwgb3IgTlVMTCBvbiBlcnJvci4KKyAqLworQVZFbmNyeXB0aW9uSW5pdEluZm8gKmF2X2VuY3J5cHRpb25faW5pdF9pbmZvX2FsbG9jKAorICAgIHVpbnQzMl90IHN5c3RlbV9pZF9zaXplLCB1aW50MzJfdCBudW1fa2V5X2lkcywgdWludDMyX3Qga2V5X2lkX3NpemUsIHVpbnQzMl90IGRhdGFfc2l6ZSk7CisKKy8qKgorICogRnJlZXMgdGhlIGdpdmVuIGVuY3J5cHRpb24gaW5pdCBpbmZvIG9iamVjdC4gIFRoaXMgTVVTVCBOT1QgYmUgdXNlZCB0byBmcmVlCisgKiB0aGUgc2lkZS1kYXRhIGRhdGEgcG9pbnRlciwgdGhhdCBzaG91bGQgdXNlIG5vcm1hbCBzaWRlLWRhdGEgbWV0aG9kcy4KKyAqLwordm9pZCBhdl9lbmNyeXB0aW9uX2luaXRfaW5mb19mcmVlKEFWRW5jcnlwdGlvbkluaXRJbmZvKiBpbmZvKTsKKworLyoqCisgKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgQVZFbmNyeXB0aW9uSW5pdEluZm8gdGhhdCBpcyBjb250YWluZWQgaW4gdGhlIGdpdmVuCisgKiBzaWRlIGRhdGEuICBUaGUgcmVzdWx0aW5nIG9iamVjdCBzaG91bGQgYmUgcGFzc2VkIHRvCisgKiBhdl9lbmNyeXB0aW9uX2luaXRfaW5mb19mcmVlKCkgd2hlbiBkb25lLgorICoKKyAqIEByZXR1cm4gVGhlIG5ldyBBVkVuY3J5cHRpb25Jbml0SW5mbyBzdHJ1Y3R1cmUsIG9yIE5VTEwgb24gZXJyb3IuCisgKi8KK0FWRW5jcnlwdGlvbkluaXRJbmZvICphdl9lbmNyeXB0aW9uX2luaXRfaW5mb19nZXRfc2lkZV9kYXRhKAorICAgIGNvbnN0IHVpbnQ4X3QqIHNpZGVfZGF0YSwgc2l6ZV90IHNpZGVfZGF0YV9zaXplKTsKKworLyoqCisgKiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIHNpZGUgZGF0YSB0aGF0IGhvbGRzIGEgY29weSBvZiB0aGUgZ2l2ZW4gZW5jcnlwdGlvbgorICogaW5pdCBpbmZvLiAgVGhlIHJlc3VsdGluZyBwb2ludGVyIHNob3VsZCBiZSBlaXRoZXIgZnJlZWQgdXNpbmcgYXZfZnJlZSBvcgorICogZ2l2ZW4gdG8gYXZfcGFja2V0X2FkZF9zaWRlX2RhdGEoKS4KKyAqCisgKiBAcmV0dXJuIFRoZSBuZXcgc2lkZS1kYXRhIHBvaW50ZXIsIG9yIE5VTEwuCisgKi8KK3VpbnQ4X3QgKmF2X2VuY3J5cHRpb25faW5pdF9pbmZvX2FkZF9zaWRlX2RhdGEoCisgICAgY29uc3QgQVZFbmNyeXB0aW9uSW5pdEluZm8gKmluZm8sIHNpemVfdCAqc2lkZV9kYXRhX3NpemUpOworCisjZW5kaWYgLyogQVZVVElMX0VOQ1JZUFRJT05fSU5GT19IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvZXJyb3IuYyBiL2xpYmF2dXRpbC9lcnJvci5jCmluZGV4IDhkZjczZGIuLmI5NjMwNDggMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9lcnJvci5jCisrKyBiL2xpYmF2dXRpbC9lcnJvci5jCkBAIC0xMjcsMjUgKzEyNywzIEBACiAKICAgICByZXR1cm4gcmV0OwogfQotCi0jaWZkZWYgVEVTVAotCi0jdW5kZWYgcHJpbnRmCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZXJyb3JfZW50cmllcyk7IGkrKykgewotICAgICAgICBjb25zdCBzdHJ1Y3QgZXJyb3JfZW50cnkgKmVudHJ5ID0gJmVycm9yX2VudHJpZXNbaV07Ci0gICAgICAgIHByaW50ZigiJWQ6ICVzIFslc11cbiIsIGVudHJ5LT5udW0sIGF2X2VycjJzdHIoZW50cnktPm51bSksIGVudHJ5LT50YWcpOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICBwcmludGYoIiVkOiAlc1xuIiwgLWksIGF2X2VycjJzdHIoLWkpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmIC8qIFRFU1QgKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9ldmFsLmMgYi9saWJhdnV0aWwvZXZhbC5jCmluZGV4IDJhY2JiYjQuLjVkYTlhNmQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9ldmFsLmMKKysrIGIvbGliYXZ1dGlsL2V2YWwuYwpAQCAtMzEsMTIgKzMxLDE0IEBACiAjaW5jbHVkZSAiYXZ1dGlsLmgiCiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAiZXZhbC5oIgorI2luY2x1ZGUgImZmbWF0aC5oIgogI2luY2x1ZGUgImludGVybmFsLmgiCiAjaW5jbHVkZSAibG9nLmgiCiAjaW5jbHVkZSAibWF0aGVtYXRpY3MuaCIKICNpbmNsdWRlICJ0aW1lLmgiCiAjaW5jbHVkZSAiYXZzdHJpbmcuaCIKICNpbmNsdWRlICJ0aW1lci5oIgorI2luY2x1ZGUgInJldmVyc2UuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgUGFyc2VyIHsKICAgICBjb25zdCBBVkNsYXNzICpjbGFzczsKQEAgLTU1LDcgKzU3LDE0IEBACiAgICAgZG91YmxlICp2YXI7CiB9IFBhcnNlcjsKIAotc3RhdGljIGNvbnN0IEFWQ2xhc3MgZXZhbF9jbGFzcyA9IHsgIkV2YWwiLCBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwgTlVMTCwgTElCQVZVVElMX1ZFUlNJT05fSU5ULCBvZmZzZXRvZihQYXJzZXIsbG9nX29mZnNldCksIG9mZnNldG9mKFBhcnNlcixsb2dfY3R4KSB9Oworc3RhdGljIGNvbnN0IEFWQ2xhc3MgZXZhbF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgICAgICAgICAgICA9ICJFdmFsIiwKKyAgICAuaXRlbV9uYW1lICAgICAgICAgICAgICAgICA9IGF2X2RlZmF1bHRfaXRlbV9uYW1lLAorICAgIC5vcHRpb24gICAgICAgICAgICAgICAgICAgID0gTlVMTCwKKyAgICAudmVyc2lvbiAgICAgICAgICAgICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKKyAgICAubG9nX2xldmVsX29mZnNldF9vZmZzZXQgICA9IG9mZnNldG9mKFBhcnNlciwgbG9nX29mZnNldCksCisgICAgLnBhcmVudF9sb2dfY29udGV4dF9vZmZzZXQgPSBvZmZzZXRvZihQYXJzZXIsIGxvZ19jdHgpLAorfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAgICAgZG91YmxlIGJpbl92YWw7CkBAIC0xNTEsOSArMTYwLDkgQEAKICAgICAgICAgZV9zcXVpc2gsIGVfZ2F1c3MsIGVfbGQsIGVfaXNuYW4sIGVfaXNpbmYsCiAgICAgICAgIGVfbW9kLCBlX21heCwgZV9taW4sIGVfZXEsIGVfZ3QsIGVfZ3RlLCBlX2x0ZSwgZV9sdCwKICAgICAgICAgZV9wb3csIGVfbXVsLCBlX2RpdiwgZV9hZGQsCi0gICAgICAgIGVfbGFzdCwgZV9zdCwgZV93aGlsZSwgZV90YXlsb3IsIGVfcm9vdCwgZV9mbG9vciwgZV9jZWlsLCBlX3RydW5jLAorICAgICAgICBlX2xhc3QsIGVfc3QsIGVfd2hpbGUsIGVfdGF5bG9yLCBlX3Jvb3QsIGVfZmxvb3IsIGVfY2VpbCwgZV90cnVuYywgZV9yb3VuZCwKICAgICAgICAgZV9zcXJ0LCBlX25vdCwgZV9yYW5kb20sIGVfaHlwb3QsIGVfZ2NkLAotICAgICAgICBlX2lmLCBlX2lmbm90LCBlX3ByaW50LCBlX2JpdGFuZCwgZV9iaXRvciwgZV9iZXR3ZWVuLCBlX2NsaXAKKyAgICAgICAgZV9pZiwgZV9pZm5vdCwgZV9wcmludCwgZV9iaXRhbmQsIGVfYml0b3IsIGVfYmV0d2VlbiwgZV9jbGlwLCBlX2F0YW4yLCBlX2xlcnAsCiAgICAgfSB0eXBlOwogICAgIGRvdWJsZSB2YWx1ZTsgLy8gaXMgc2lnbiBpbiBvdGhlciB0eXBlcwogICAgIHVuaW9uIHsKQEAgLTE4Nyw2ICsxOTYsNyBAQAogICAgICAgICBjYXNlIGVfZmxvb3I6ICByZXR1cm4gZS0+dmFsdWUgKiBmbG9vcihldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pKTsKICAgICAgICAgY2FzZSBlX2NlaWwgOiAgcmV0dXJuIGUtPnZhbHVlICogY2VpbCAoZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSk7CiAgICAgICAgIGNhc2UgZV90cnVuYzogIHJldHVybiBlLT52YWx1ZSAqIHRydW5jKGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSkpOworICAgICAgICBjYXNlIGVfcm91bmQ6ICByZXR1cm4gZS0+dmFsdWUgKiByb3VuZChldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pKTsKICAgICAgICAgY2FzZSBlX3NxcnQ6ICAgcmV0dXJuIGUtPnZhbHVlICogc3FydCAoZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSk7CiAgICAgICAgIGNhc2UgZV9ub3Q6ICAgIHJldHVybiBlLT52YWx1ZSAqIChldmFsX2V4cHIocCwgZS0+cGFyYW1bMF0pID09IDApOwogICAgICAgICBjYXNlIGVfaWY6ICAgICByZXR1cm4gZS0+dmFsdWUgKiAoZXZhbF9leHByKHAsIGUtPnBhcmFtWzBdKSA/IGV2YWxfZXhwcihwLCBlLT5wYXJhbVsxXSkgOgpAQCAtMjA1LDYgKzIxNSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIGUtPnZhbHVlICogKGQgPj0gZXZhbF9leHByKHAsIGUtPnBhcmFtWzFdKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPD0gZXZhbF9leHByKHAsIGUtPnBhcmFtWzJdKSk7CiAgICAgICAgIH0KKyAgICAgICAgY2FzZSBlX2xlcnA6IHsKKyAgICAgICAgICAgIGRvdWJsZSB2MCA9IGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSk7CisgICAgICAgICAgICBkb3VibGUgdjEgPSBldmFsX2V4cHIocCwgZS0+cGFyYW1bMV0pOworICAgICAgICAgICAgZG91YmxlIGYgID0gZXZhbF9leHByKHAsIGUtPnBhcmFtWzJdKTsKKyAgICAgICAgICAgIHJldHVybiB2MCArICh2MSAtIHYwKSAqIGY7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBlX3ByaW50OiB7CiAgICAgICAgICAgICBkb3VibGUgeCA9IGV2YWxfZXhwcihwLCBlLT5wYXJhbVswXSk7CiAgICAgICAgICAgICBpbnQgbGV2ZWwgPSBlLT5wYXJhbVsxXSA/IGF2X2NsaXAoZXZhbF9leHByKHAsIGUtPnBhcmFtWzFdKSwgSU5UX01JTiwgSU5UX01BWCkgOiBBVl9MT0dfSU5GTzsKQEAgLTMwNCw2ICszMjAsNyBAQAogICAgICAgICAgICAgICAgIGNhc2UgZV9sYXN0OnJldHVybiBlLT52YWx1ZSAqIGQyOwogICAgICAgICAgICAgICAgIGNhc2UgZV9zdCA6IHJldHVybiBlLT52YWx1ZSAqIChwLT52YXJbYXZfY2xpcChkLCAwLCBWQVJTLTEpXT0gZDIpOwogICAgICAgICAgICAgICAgIGNhc2UgZV9oeXBvdDpyZXR1cm4gZS0+dmFsdWUgKiBoeXBvdChkLCBkMik7CisgICAgICAgICAgICAgICAgY2FzZSBlX2F0YW4yOnJldHVybiBlLT52YWx1ZSAqIGF0YW4yKGQsIGQyKTsKICAgICAgICAgICAgICAgICBjYXNlIGVfYml0YW5kOiByZXR1cm4gaXNuYW4oZCkgfHwgaXNuYW4oZDIpID8gTkFOIDogZS0+dmFsdWUgKiAoKGxvbmcgaW50KWQgJiAobG9uZyBpbnQpZDIpOwogICAgICAgICAgICAgICAgIGNhc2UgZV9iaXRvcjogIHJldHVybiBpc25hbihkKSB8fCBpc25hbihkMikgPyBOQU4gOiBlLT52YWx1ZSAqICgobG9uZyBpbnQpZCB8IChsb25nIGludClkMik7CiAgICAgICAgICAgICB9CkBAIC00MzcsNiArNDU0LDcgQEAKICAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiZmxvb3IiICkpIGQtPnR5cGUgPSBlX2Zsb29yOwogICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJjZWlsIiAgKSkgZC0+dHlwZSA9IGVfY2VpbDsKICAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAidHJ1bmMiICkpIGQtPnR5cGUgPSBlX3RydW5jOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJyb3VuZCIgKSkgZC0+dHlwZSA9IGVfcm91bmQ7CiAgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgInNxcnQiICApKSBkLT50eXBlID0gZV9zcXJ0OwogICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJub3QiICAgKSkgZC0+dHlwZSA9IGVfbm90OwogICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJwb3ciICAgKSkgZC0+dHlwZSA9IGVfcG93OwpAQCAtNDUwLDYgKzQ2OCw4IEBACiAgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImJpdG9yIiApKSBkLT50eXBlID0gZV9iaXRvcjsKICAgICBlbHNlIGlmIChzdHJtYXRjaChuZXh0LCAiYmV0d2VlbiIpKWQtPnR5cGUgPSBlX2JldHdlZW47CiAgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImNsaXAiICApKSBkLT50eXBlID0gZV9jbGlwOworICAgIGVsc2UgaWYgKHN0cm1hdGNoKG5leHQsICJhdGFuMiIgKSkgZC0+dHlwZSA9IGVfYXRhbjI7CisgICAgZWxzZSBpZiAoc3RybWF0Y2gobmV4dCwgImxlcnAiICApKSBkLT50eXBlID0gZV9sZXJwOwogICAgIGVsc2UgewogICAgICAgICBmb3IgKGk9MDsgcC0+ZnVuYzFfbmFtZXMgJiYgcC0+ZnVuYzFfbmFtZXNbaV07IGkrKykgewogICAgICAgICAgICAgaWYgKHN0cm1hdGNoKG5leHQsIHAtPmZ1bmMxX25hbWVzW2ldKSkgewpAQCAtNjMzLDYgKzY1Myw3IEBACiAgICAgICAgIGNhc2UgZV9mbG9vcjoKICAgICAgICAgY2FzZSBlX2NlaWw6CiAgICAgICAgIGNhc2UgZV90cnVuYzoKKyAgICAgICAgY2FzZSBlX3JvdW5kOgogICAgICAgICBjYXNlIGVfc3FydDoKICAgICAgICAgY2FzZSBlX25vdDoKICAgICAgICAgY2FzZSBlX3JhbmRvbToKQEAgLTY0Nyw2ICs2NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICYmICghZS0+cGFyYW1bMl0gfHwgdmVyaWZ5X2V4cHIoZS0+cGFyYW1bMl0pKTsKICAgICAgICAgY2FzZSBlX2JldHdlZW46CiAgICAgICAgIGNhc2UgZV9jbGlwOgorICAgICAgICBjYXNlIGVfbGVycDoKICAgICAgICAgICAgIHJldHVybiB2ZXJpZnlfZXhwcihlLT5wYXJhbVswXSkgJiYKICAgICAgICAgICAgICAgICAgICB2ZXJpZnlfZXhwcihlLT5wYXJhbVsxXSkgJiYKICAgICAgICAgICAgICAgICAgICB2ZXJpZnlfZXhwcihlLT5wYXJhbVsyXSk7CkBAIC03MzYsMTU2ICs3NTgsMyBAQAogICAgIGF2X2V4cHJfZnJlZShlKTsKICAgICByZXR1cm4gaXNuYW4oKmQpID8gQVZFUlJPUihFSU5WQUwpIDogMDsKIH0KLQotI2lmZGVmIFRFU1QKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotc3RhdGljIGNvbnN0IGRvdWJsZSBjb25zdF92YWx1ZXNbXSA9IHsKLSAgICBNX1BJLAotICAgIE1fRSwKLSAgICAwCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29uc3RfbmFtZXNbXSA9IHsKLSAgICAiUEkiLAotICAgICJFIiwKLSAgICAwCi19OwotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IGk7Ci0gICAgZG91YmxlIGQ7Ci0gICAgY29uc3QgY2hhciAqY29uc3QgKmV4cHI7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGV4cHJzW10gPSB7Ci0gICAgICAgICIiLAotICAgICAgICAiMTsyIiwKLSAgICAgICAgIi0yMCIsCi0gICAgICAgICItUEkiLAotICAgICAgICAiK1BJIiwKLSAgICAgICAgIjErKDUtMileKDMtMSkrMS8yK3NpbihQSSktbWF4KC0yLjIsLTMuMSkiLAotICAgICAgICAiODBHLzgwR2kiLAotICAgICAgICAiMWsiLAotICAgICAgICAiMUdpIiwKLSAgICAgICAgIjFnaSIsCi0gICAgICAgICIxR2lGb28iLAotICAgICAgICAiMWsrMWsiLAotICAgICAgICAiMUdpKjNmb28iLAotICAgICAgICAiZm9vIiwKLSAgICAgICAgImZvbygiLAotICAgICAgICAiZm9vKCkiLAotICAgICAgICAiZm9vKSIsCi0gICAgICAgICJzaW4iLAotICAgICAgICAic2luKCIsCi0gICAgICAgICJzaW4oKSIsCi0gICAgICAgICJzaW4pIiwKLSAgICAgICAgInNpbiAxMCIsCi0gICAgICAgICJzaW4oMSwyLDMpIiwKLSAgICAgICAgInNpbigxICkiLAotICAgICAgICAiMSIsCi0gICAgICAgICIxZm9vIiwKLSAgICAgICAgImJhciArIFBJICsgRSArIDEwMGYqMiArIGZvbyIsCi0gICAgICAgICIxM2sgKyAxMmYgLSBmb28oMSwgMikiLAotICAgICAgICAiMWdpIiwKLSAgICAgICAgIjFHaSIsCi0gICAgICAgICJzdCgwLCAxMjMpIiwKLSAgICAgICAgInN0KDEsIDEyMyk7IGxkKDEpIiwKLSAgICAgICAgImx0ZSgwLCAxKSIsCi0gICAgICAgICJsdGUoMSwgMSkiLAotICAgICAgICAibHRlKDEsIDApIiwKLSAgICAgICAgImx0KDAsIDEpIiwKLSAgICAgICAgImx0KDEsIDEpIiwKLSAgICAgICAgImd0KDEsIDApIiwKLSAgICAgICAgImd0KDIsIDcpIiwKLSAgICAgICAgImd0ZSgxMjIsIDEyMikiLAotICAgICAgICAvKiBjb21wdXRlIDErMisuLi4rTiAqLwotICAgICAgICAic3QoMCwgMSk7IHdoaWxlKGx0ZShsZCgwKSwgMTAwKSwgc3QoMSwgbGQoMSkrbGQoMCkpO3N0KDAsIGxkKDApKzEpKTsgbGQoMSkiLAotICAgICAgICAvKiBjb21wdXRlIEZpYihOKSAqLwotICAgICAgICAic3QoMSwgMSk7IHN0KDIsIDIpOyBzdCgwLCAxKTsgd2hpbGUobHRlKGxkKDApLDEwKSwgc3QoMywgbGQoMSkrbGQoMikpOyBzdCgxLCBsZCgyKSk7IHN0KDIsIGxkKDMpKTsgc3QoMCwgbGQoMCkrMSkpOyBsZCgzKSIsCi0gICAgICAgICJ3aGlsZSgwLCAxMCkiLAotICAgICAgICAic3QoMCwgMSk7IHdoaWxlKGx0ZShsZCgwKSwxMDApLCBzdCgxLCBsZCgxKStsZCgwKSk7IHN0KDAsIGxkKDApKzEpKSIsCi0gICAgICAgICJpc25hbigxKSIsCi0gICAgICAgICJpc25hbihOQU4pIiwKLSAgICAgICAgImlzbmFuKElORikiLAotICAgICAgICAiaXNpbmYoMSkiLAotICAgICAgICAiaXNpbmYoTkFOKSIsCi0gICAgICAgICJpc2luZihJTkYpIiwKLSAgICAgICAgImZsb29yKE5BTikiLAotICAgICAgICAiZmxvb3IoMTIzLjEyMykiLAotICAgICAgICAiZmxvb3IoLTEyMy4xMjMpIiwKLSAgICAgICAgInRydW5jKDEyMy4xMjMpIiwKLSAgICAgICAgInRydW5jKC0xMjMuMTIzKSIsCi0gICAgICAgICJjZWlsKDEyMy4xMjMpIiwKLSAgICAgICAgImNlaWwoLTEyMy4xMjMpIiwKLSAgICAgICAgInNxcnQoMTc2NCkiLAotICAgICAgICAiaXNuYW4oc3FydCgtMSkpIiwKLSAgICAgICAgIm5vdCgxKSIsCi0gICAgICAgICJub3QoTkFOKSIsCi0gICAgICAgICJub3QoMCkiLAotICAgICAgICAiNi4wMjA2ZEIiLAotICAgICAgICAiLTMuMDEwM2RCIiwKLSAgICAgICAgInBvdygwLDEuMjMpIiwKLSAgICAgICAgInBvdyhQSSwxLjIzKSIsCi0gICAgICAgICJQSV4xLjIzIiwKLSAgICAgICAgInBvdygtMSwxLjIzKSIsCi0gICAgICAgICJpZigxLCAyKSIsCi0gICAgICAgICJpZigxLCAxLCAyKSIsCi0gICAgICAgICJpZigwLCAxLCAyKSIsCi0gICAgICAgICJpZm5vdCgwLCAyMykiLAotICAgICAgICAiaWZub3QoMSwgTmFOKSArIGlmKDAsIDEpIiwKLSAgICAgICAgImlmbm90KDEsIDEsIDIpIiwKLSAgICAgICAgImlmbm90KDAsIDEsIDIpIiwKLSAgICAgICAgInRheWxvcigxLCAxKSIsCi0gICAgICAgICJ0YXlsb3IoZXEobW9kKGxkKDEpLDQpLDEpLWVxKG1vZChsZCgxKSw0KSwzKSwgUEkvMiwgMSkiLAotICAgICAgICAicm9vdChzaW4obGQoMCkpLTEsIDIpIiwKLSAgICAgICAgInJvb3Qoc2luKGxkKDApKSs2K3NpbihsZCgwKS8xMiktbG9nKGxkKDApKSwgMTAwKSIsCi0gICAgICAgICI3MDAwMDAwQipyYW5kb20oMCkiLAotICAgICAgICAic3F1aXNoKDIpIiwKLSAgICAgICAgImdhdXNzKDAuMSkiLAotICAgICAgICAiaHlwb3QoNCwzKSIsCi0gICAgICAgICJnY2QoMzAsNTUpKnByaW50KG1pbig5LDEpKSIsCi0gICAgICAgICJiaXRvcig0MiwgMTIpIiwKLSAgICAgICAgImJpdGFuZCg0MiwgMTIpIiwKLSAgICAgICAgImJpdGFuZChOQU4sIDEpIiwKLSAgICAgICAgImJldHdlZW4oMTAsIC0zLCAxMCkiLAotICAgICAgICAiYmV0d2VlbigtNCwgLTIsIC0xKSIsCi0gICAgICAgICJiZXR3ZWVuKDEsMikiLAotICAgICAgICAiY2xpcCgwLCAyLCAxKSIsCi0gICAgICAgICJjbGlwKDAvMCwgMSwgMikiLAotICAgICAgICAiY2xpcCgwLCAwLzAsIDEpIiwKLSAgICAgICAgTlVMTAotICAgIH07Ci0KLSAgICBmb3IgKGV4cHIgPSBleHByczsgKmV4cHI7IGV4cHIrKykgewotICAgICAgICBwcmludGYoIkV2YWx1YXRpbmcgJyVzJ1xuIiwgKmV4cHIpOwotICAgICAgICBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZkLCAqZXhwciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9uYW1lcywgY29uc3RfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOwotICAgICAgICBpZiAoaXNuYW4oZCkpCi0gICAgICAgICAgICBwcmludGYoIiclcycgLT4gbmFuXG5cbiIsICpleHByKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRmKCInJXMnIC0+ICVmXG5cbiIsICpleHByLCBkKTsKLSAgICB9Ci0KLSAgICBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZkLCAiMSsoNS0yKV4oMy0xKSsxLzIrc2luKFBJKS1tYXgoLTIuMiwtMy4xKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9uYW1lcywgY29uc3RfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7Ci0gICAgcHJpbnRmKCIlZiA9PSAxMi43XG4iLCBkKTsKLSAgICBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZkLCAiODBHLzgwR2kiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfbmFtZXMsIGNvbnN0X3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOwotICAgIHByaW50ZigiJWYgPT0gMC45MzEzMjI1NzVcbiIsIGQpOwotCi0gICAgaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAoYXJndlsxXSwgIi10IikpIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwNTA7IGkrKykgewotICAgICAgICAgICAgU1RBUlRfVElNRVI7Ci0gICAgICAgICAgICBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZkLCAiMSsoNS0yKV4oMy0xKSsxLzIrc2luKFBJKS1tYXgoLTIuMiwtMy4xKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X25hbWVzLCBjb25zdF92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOwotICAgICAgICAgICAgU1RPUF9USU1FUigiYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9mZm1hdGguaCBiL2xpYmF2dXRpbC9mZm1hdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQxMzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2ZmbWF0aC5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBjb3B5cmlnaHQgKGMpIDIwMTYgR2FuZXNoIEFqamFuYWdhZGRlIDxnYWpqYW5hZ0BnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIGludGVybmFsIG1hdGggZnVuY3Rpb25zIGhlYWRlcgorICovCisKKyNpZm5kZWYgQVZVVElMX0ZGTUFUSF9ICisjZGVmaW5lIEFWVVRJTF9GRk1BVEhfSAorCisjaW5jbHVkZSAiYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxpYm0uaCIKKworLyoqCisgKiBDb21wdXRlIDEwXnggZm9yIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4gTm90ZTogdGhpcyBmdW5jdGlvbiBpcyBieSBubyBtZWFucworICogImNvcnJlY3RseSByb3VuZGVkIiwgYW5kIGlzIG1lYW50IGFzIGEgZmFzdCwgcmVhc29uYWJseSBhY2N1cmF0ZSBhcHByb3hpbWF0aW9uLgorICogRm9yIGluc3RhbmNlLCBtYXhpbXVtIHJlbGF0aXZlIGVycm9yIGZvciB0aGUgZG91YmxlIHByZWNpc2lvbiB2YXJpYW50IGlzCisgKiB+IDFlLTEzIGZvciB2ZXJ5IHNtYWxsIGFuZCB2ZXJ5IGxhcmdlIHZhbHVlcy4KKyAqIFRoaXMgaXMgfjJ4IGZhc3RlciB0aGFuIEdOVSBsaWJtJ3MgYXBwcm9hY2gsIHdoaWNoIGlzIHN0aWxsIG9mZiBieSAydWxwIG9uCisgKiBzb21lIGlucHV0cy4KKyAqIEBwYXJhbSB4IGV4cG9uZW50CisgKiBAcmV0dXJuIDEwXngKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgZG91YmxlIGZmX2V4cDEwKGRvdWJsZSB4KQoreworICAgIHJldHVybiBleHAyKE1fTE9HMl8xMCAqIHgpOworfQorCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBmbG9hdCBmZl9leHAxMGYoZmxvYXQgeCkKK3sKKyAgICByZXR1cm4gZXhwMmYoTV9MT0cyXzEwICogeCk7Cit9CisKKy8qKgorICogQ29tcHV0ZSB4XnkgZm9yIGZsb2F0aW5nIHBvaW50IHgsIHkuIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gdGhlCisgKiBsaWJtIHZhcmlhbnQgZHVlIHRvIG1haW5seSAyIHJlYXNvbnM6CisgKiAxLiBJdCBkb2VzIG5vdCBoYW5kbGUgYW55IGVkZ2UgY2FzZXMuIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMgb25seSBndWFyYW50ZWVkCisgKiB0byB3b3JrIGNvcnJlY3RseSBmb3IgeCA+IDAuCisgKiAyLiBJdCBpcyBub3QgYXMgYWNjdXJhdGUgYXMgYSBzdGFuZGFyZCBuZWFybHkgImNvcnJlY3RseSByb3VuZGVkIiBsaWJtIHZhcmlhbnQuCisgKiBAcGFyYW0geCBiYXNlCisgKiBAcGFyYW0geSBleHBvbmVudAorICogQHJldHVybiB4XnkKKyAqLworc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgZmxvYXQgZmZfZmFzdF9wb3dmKGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgcmV0dXJuIGV4cGYobG9nZih4KSAqIHkpOworfQorCisjZW5kaWYgLyogQVZVVElMX0ZGTUFUSF9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvZmlmby5jIGIvbGliYXZ1dGlsL2ZpZm8uYwppbmRleCA3YmQ0OGEyLi4xMDYwYWVkIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvZmlmby5jCisrKyBiL2xpYmF2dXRpbC9maWZvLmMKQEAgLTExMyw3ICsxMTMsNyBAQAogICAgIHNpemUgKz0gYXZfZmlmb19zaXplKGYpOwogCiAgICAgaWYgKG9sZF9zaXplIDwgc2l6ZSkKLSAgICAgICAgcmV0dXJuIGF2X2ZpZm9fcmVhbGxvYzIoZiwgRkZNQVgoc2l6ZSwgMipzaXplKSk7CisgICAgICAgIHJldHVybiBhdl9maWZvX3JlYWxsb2MyKGYsIEZGTUFYKHNpemUsIDIqb2xkX3NpemUpKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMjM4LDYwICsyMzgsMyBAQAogICAgICAgICBmLT5ycHRyIC09IGYtPmVuZCAtIGYtPmJ1ZmZlcjsKICAgICBmLT5ybmR4ICs9IHNpemU7CiB9Ci0KLSNpZmRlZiBURVNUCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgLyogY3JlYXRlIGEgRklGTyBidWZmZXIgKi8KLSAgICBBVkZpZm9CdWZmZXIgKmZpZm8gPSBhdl9maWZvX2FsbG9jKDEzICogc2l6ZW9mKGludCkpOwotICAgIGludCBpLCBqLCBuOwotCi0gICAgLyogZmlsbCBkYXRhICovCi0gICAgZm9yIChpID0gMDsgYXZfZmlmb19zcGFjZShmaWZvKSA+PSBzaXplb2YoaW50KTsgaSsrKQotICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoZmlmbywgJmksIHNpemVvZihpbnQpLCBOVUxMKTsKLQotICAgIC8qIHBlZWsgYXQgRklGTyAqLwotICAgIG4gPSBhdl9maWZvX3NpemUoZmlmbykgLyBzaXplb2YoaW50KTsKLSAgICBmb3IgKGkgPSAtbiArIDE7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgaW50ICp2ID0gKGludCAqKWF2X2ZpZm9fcGVlazIoZmlmbywgaSAqIHNpemVvZihpbnQpKTsKLSAgICAgICAgcHJpbnRmKCIlZDogJWRcbiIsIGksICp2KTsKLSAgICB9Ci0gICAgcHJpbnRmKCJcbiIpOwotCi0gICAgLyogcGVla19hdCBhdCBGSUZPICovCi0gICAgbiA9IGF2X2ZpZm9fc2l6ZShmaWZvKSAvIHNpemVvZihpbnQpOwotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgYXZfZmlmb19nZW5lcmljX3BlZWtfYXQoZmlmbywgJmosIGkgKiBzaXplb2YoaW50KSwgc2l6ZW9mKGopLCBOVUxMKTsKLSAgICAgICAgcHJpbnRmKCIlZDogJWRcbiIsIGksIGopOwotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci0KLSAgICAvKiByZWFkIGRhdGEgKi8KLSAgICBmb3IgKGkgPSAwOyBhdl9maWZvX3NpemUoZmlmbykgPj0gc2l6ZW9mKGludCk7IGkrKykgewotICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChmaWZvLCAmaiwgc2l6ZW9mKGludCksIE5VTEwpOwotICAgICAgICBwcmludGYoIiVkICIsIGopOwotICAgIH0KLSAgICBwcmludGYoIlxuIik7Ci0KLSAgICAvKiB0ZXN0ICpuZHggb3ZlcmZsb3cgKi8KLSAgICBhdl9maWZvX3Jlc2V0KGZpZm8pOwotICAgIGZpZm8tPnJuZHggPSBmaWZvLT53bmR4ID0gfih1aW50MzJfdCkwIC0gNTsKLQotICAgIC8qIGZpbGwgZGF0YSAqLwotICAgIGZvciAoaSA9IDA7IGF2X2ZpZm9fc3BhY2UoZmlmbykgPj0gc2l6ZW9mKGludCk7IGkrKykKLSAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGZpZm8sICZpLCBzaXplb2YoaW50KSwgTlVMTCk7Ci0KLSAgICAvKiBwZWVrX2F0IGF0IEZJRk8gKi8KLSAgICBuID0gYXZfZmlmb19zaXplKGZpZm8pIC8gc2l6ZW9mKGludCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBhdl9maWZvX2dlbmVyaWNfcGVla19hdChmaWZvLCAmaiwgaSAqIHNpemVvZihpbnQpLCBzaXplb2YoaiksIE5VTEwpOwotICAgICAgICBwcmludGYoIiVkOiAlZFxuIiwgaSwgaik7Ci0gICAgfQotCi0gICAgYXZfZmlmb19mcmVlKGZpZm8pOwotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2ZpbGUuYyBiL2xpYmF2dXRpbC9maWxlLmMKaW5kZXggMmEwNmJlNC4uMjRhODZjMyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2ZpbGUuYworKysgYi9saWJhdnV0aWwvZmlsZS5jCkBAIC00Miw4ICs0MiwxMiBAQAogfSBGaWxlTG9nQ29udGV4dDsKIAogc3RhdGljIGNvbnN0IEFWQ2xhc3MgZmlsZV9sb2dfY3R4X2NsYXNzID0gewotICAgICJGSUxFIiwgYXZfZGVmYXVsdF9pdGVtX25hbWUsIE5VTEwsIExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLSAgICBvZmZzZXRvZihGaWxlTG9nQ29udGV4dCwgbG9nX29mZnNldCksIG9mZnNldG9mKEZpbGVMb2dDb250ZXh0LCBsb2dfY3R4KQorICAgIC5jbGFzc19uYW1lICAgICAgICAgICAgICAgID0gIkZJTEUiLAorICAgIC5pdGVtX25hbWUgICAgICAgICAgICAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgICAgICAgICAgICAgPSBOVUxMLAorICAgIC52ZXJzaW9uICAgICAgICAgICAgICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAorICAgIC5sb2dfbGV2ZWxfb2Zmc2V0X29mZnNldCAgID0gb2Zmc2V0b2YoRmlsZUxvZ0NvbnRleHQsIGxvZ19vZmZzZXQpLAorICAgIC5wYXJlbnRfbG9nX2NvbnRleHRfb2Zmc2V0ID0gb2Zmc2V0b2YoRmlsZUxvZ0NvbnRleHQsIGxvZ19jdHgpLAogfTsKIAogaW50IGF2X2ZpbGVfbWFwKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB1aW50OF90ICoqYnVmcHRyLCBzaXplX3QgKnNpemUsCkBAIC0xMzcsNjkgKzE0MSw2IEBACiAjZW5kaWYKIH0KIAotaW50IGF2X3RlbXBmaWxlKGNvbnN0IGNoYXIgKnByZWZpeCwgY2hhciAqKmZpbGVuYW1lLCBpbnQgbG9nX29mZnNldCwgdm9pZCAqbG9nX2N0eCkKLXsKLSAgICBGaWxlTG9nQ29udGV4dCBmaWxlX2xvZ19jdHggPSB7ICZmaWxlX2xvZ19jdHhfY2xhc3MsIGxvZ19vZmZzZXQsIGxvZ19jdHggfTsKLSAgICBpbnQgZmQgPSAtMTsKLSNpZiAhSEFWRV9NS1NURU1QCi0gICAgdm9pZCAqcHRyPSB0ZW1wbmFtKE5VTEwsIHByZWZpeCk7Ci0gICAgaWYoIXB0cikKLSAgICAgICAgcHRyPSB0ZW1wbmFtKCIuIiwgcHJlZml4KTsKLSAgICAqZmlsZW5hbWUgPSBhdl9zdHJkdXAocHRyKTsKLSN1bmRlZiBmcmVlCi0gICAgZnJlZShwdHIpOwotI2Vsc2UKLSAgICBzaXplX3QgbGVuID0gc3RybGVuKHByZWZpeCkgKyAxMjsgLyogcm9vbSBmb3IgIi90bXAvIiBhbmQgIlhYWFhYWFwwIiAqLwotICAgICpmaWxlbmFtZSAgPSBhdl9tYWxsb2MobGVuKTsKLSNlbmRpZgotICAgIC8qIC0tLS0tY29tbW9uIHNlY3Rpb24tLS0tLSovCi0gICAgaWYgKCEqZmlsZW5hbWUpIHsKLSAgICAgICAgYXZfbG9nKCZmaWxlX2xvZ19jdHgsIEFWX0xPR19FUlJPUiwgImZmX3RlbXBmaWxlOiBDYW5ub3QgYWxsb2NhdGUgZmlsZSBuYW1lXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKLSAgICB9Ci0jaWYgIUhBVkVfTUtTVEVNUAotIyAgIGlmbmRlZiBPX0JJTkFSWQotIyAgICAgICBkZWZpbmUgT19CSU5BUlkgMAotIyAgIGVuZGlmCi0jICAgaWZuZGVmIE9fRVhDTAotIyAgICAgICBkZWZpbmUgT19FWENMIDAKLSMgICBlbmRpZgotICAgIGZkID0gb3BlbigqZmlsZW5hbWUsIE9fUkRXUiB8IE9fQklOQVJZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDYwMCk7Ci0jZWxzZQotICAgIHNucHJpbnRmKCpmaWxlbmFtZSwgbGVuLCAiL3RtcC8lc1hYWFhYWCIsIHByZWZpeCk7Ci0gICAgZmQgPSBta3N0ZW1wKCpmaWxlbmFtZSk7Ci0jaWZkZWYgX1dJTjMyCi0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBzbnByaW50ZigqZmlsZW5hbWUsIGxlbiwgIi4vJXNYWFhYWFgiLCBwcmVmaXgpOwotICAgICAgICBmZCA9IG1rc3RlbXAoKmZpbGVuYW1lKTsKLSAgICB9Ci0jZW5kaWYKLSNlbmRpZgotICAgIC8qIC0tLS0tY29tbW9uIHNlY3Rpb24tLS0tLSovCi0gICAgaWYgKGZkIDwgMCkgewotICAgICAgICBpbnQgZXJyID0gQVZFUlJPUihlcnJubyk7Ci0gICAgICAgIGF2X2xvZygmZmlsZV9sb2dfY3R4LCBBVl9MT0dfRVJST1IsICJmZl90ZW1wZmlsZTogQ2Fubm90IG9wZW4gdGVtcG9yYXJ5IGZpbGUgJXNcbiIsICpmaWxlbmFtZSk7Ci0gICAgICAgIGF2X2ZyZWVwKGZpbGVuYW1lKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgcmV0dXJuIGZkOyAvKiBzdWNjZXNzICovCitpbnQgYXZfdGVtcGZpbGUoY29uc3QgY2hhciAqcHJlZml4LCBjaGFyICoqZmlsZW5hbWUsIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KSB7CisgICAgcmV0dXJuIGF2cHJpdl90ZW1wZmlsZShwcmVmaXgsIGZpbGVuYW1lLCBsb2dfb2Zmc2V0LCBsb2dfY3R4KTsKIH0KLQotI2lmZGVmIFRFU1QKLQotI3VuZGVmIHByaW50ZgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIHVpbnQ4X3QgKmJ1ZjsKLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBpZiAoYXZfZmlsZV9tYXAoImZpbGUuYyIsICZidWYsICZzaXplLCAwLCBOVUxMKSA8IDApCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgYnVmWzBdID0gJ3MnOwotICAgIHByaW50ZigiJXMiLCBidWYpOwotICAgIGF2X2ZpbGVfdW5tYXAoYnVmLCBzaXplKTsKLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvZmlsZS5oIGIvbGliYXZ1dGlsL2ZpbGUuaAppbmRleCBlOTMxYmU3Li44NjY2YzdiIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvZmlsZS5oCisrKyBiL2xpYmF2dXRpbC9maWxlLmgKQEAgLTYyLDYgKzYyLDcgQEAKICAqIEBub3RlIE9uIHZlcnkgb2xkIGxpYmNzIGl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgYSBzZWN1cmUgdW1hc2sgYmVmb3JlCiAgKiAgICAgICBjYWxsaW5nIHRoaXMsIGF2X3RlbXBmaWxlKCkgY2FuJ3QgY2FsbCB1bWFzayBpdHNlbGYgYXMgaXQgaXMgdXNlZCBpbgogICogICAgICAgbGlicmFyaWVzIGFuZCBjb3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4KKyAqIEBkZXByZWNhdGVkIGFzIGZkIG51bWJlcnMgY2Fubm90IGJlIHBhc3NlZCBzYWZ0ZWx5IGJldHdlZW4gbGlicyBvbiBzb21lIHBsYXRmb3JtcwogICovCiBpbnQgYXZfdGVtcGZpbGUoY29uc3QgY2hhciAqcHJlZml4LCBjaGFyICoqZmlsZW5hbWUsIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KTsKIApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2ZpbGVfb3Blbi5jIGIvbGliYXZ1dGlsL2ZpbGVfb3Blbi5jCmluZGV4IDllNzYxMjcuLmE4ZGEyODMgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9maWxlX29wZW4uYworKysgYi9saWJhdnV0aWwvZmlsZV9vcGVuLmMKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxpby5oPgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19NSU5HVzMyQ0VfXykKKyNpZmRlZiBfV0lOMzIKICN1bmRlZiBvcGVuCiAjdW5kZWYgbHNlZWsKICN1bmRlZiBzdGF0CkBAIC05Miw2ICs5Miw2OSBAQAogICAgIHJldHVybiBmZDsKIH0KIAordHlwZWRlZiBzdHJ1Y3QgRmlsZUxvZ0NvbnRleHQgeworICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOworICAgIGludCAgIGxvZ19vZmZzZXQ7CisgICAgdm9pZCAqbG9nX2N0eDsKK30gRmlsZUxvZ0NvbnRleHQ7CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGZpbGVfbG9nX2N0eF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSAgICAgICAgICAgICAgICA9ICJURU1QRklMRSIsCisgICAgLml0ZW1fbmFtZSAgICAgICAgICAgICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAub3B0aW9uICAgICAgICAgICAgICAgICAgICA9IE5VTEwsCisgICAgLnZlcnNpb24gICAgICAgICAgICAgICAgICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmxvZ19sZXZlbF9vZmZzZXRfb2Zmc2V0ICAgPSBvZmZzZXRvZihGaWxlTG9nQ29udGV4dCwgbG9nX29mZnNldCksCisgICAgLnBhcmVudF9sb2dfY29udGV4dF9vZmZzZXQgPSBvZmZzZXRvZihGaWxlTG9nQ29udGV4dCwgbG9nX2N0eCksCit9OworCitpbnQgYXZwcml2X3RlbXBmaWxlKGNvbnN0IGNoYXIgKnByZWZpeCwgY2hhciAqKmZpbGVuYW1lLCBpbnQgbG9nX29mZnNldCwgdm9pZCAqbG9nX2N0eCkKK3sKKyAgICBGaWxlTG9nQ29udGV4dCBmaWxlX2xvZ19jdHggPSB7ICZmaWxlX2xvZ19jdHhfY2xhc3MsIGxvZ19vZmZzZXQsIGxvZ19jdHggfTsKKyAgICBpbnQgZmQgPSAtMTsKKyNpZiAhSEFWRV9NS1NURU1QCisgICAgdm9pZCAqcHRyPSB0ZW1wbmFtKE5VTEwsIHByZWZpeCk7CisgICAgaWYoIXB0cikKKyAgICAgICAgcHRyPSB0ZW1wbmFtKCIuIiwgcHJlZml4KTsKKyAgICAqZmlsZW5hbWUgPSBhdl9zdHJkdXAocHRyKTsKKyN1bmRlZiBmcmVlCisgICAgZnJlZShwdHIpOworI2Vsc2UKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHByZWZpeCkgKyAxMjsgLyogcm9vbSBmb3IgIi90bXAvIiBhbmQgIlhYWFhYWFwwIiAqLworICAgICpmaWxlbmFtZSAgPSBhdl9tYWxsb2MobGVuKTsKKyNlbmRpZgorICAgIC8qIC0tLS0tY29tbW9uIHNlY3Rpb24tLS0tLSovCisgICAgaWYgKCEqZmlsZW5hbWUpIHsKKyAgICAgICAgYXZfbG9nKCZmaWxlX2xvZ19jdHgsIEFWX0xPR19FUlJPUiwgImZmX3RlbXBmaWxlOiBDYW5ub3QgYWxsb2NhdGUgZmlsZSBuYW1lXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisjaWYgIUhBVkVfTUtTVEVNUAorIyAgIGlmbmRlZiBPX0JJTkFSWQorIyAgICAgICBkZWZpbmUgT19CSU5BUlkgMAorIyAgIGVuZGlmCisjICAgaWZuZGVmIE9fRVhDTAorIyAgICAgICBkZWZpbmUgT19FWENMIDAKKyMgICBlbmRpZgorICAgIGZkID0gb3BlbigqZmlsZW5hbWUsIE9fUkRXUiB8IE9fQklOQVJZIHwgT19DUkVBVCB8IE9fRVhDTCwgMDYwMCk7CisjZWxzZQorICAgIHNucHJpbnRmKCpmaWxlbmFtZSwgbGVuLCAiL3RtcC8lc1hYWFhYWCIsIHByZWZpeCk7CisgICAgZmQgPSBta3N0ZW1wKCpmaWxlbmFtZSk7CisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQgKF9fQU5EUk9JRF9fKQorICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgc25wcmludGYoKmZpbGVuYW1lLCBsZW4sICIuLyVzWFhYWFhYIiwgcHJlZml4KTsKKyAgICAgICAgZmQgPSBta3N0ZW1wKCpmaWxlbmFtZSk7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKyAgICAvKiAtLS0tLWNvbW1vbiBzZWN0aW9uLS0tLS0qLworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgaW50IGVyciA9IEFWRVJST1IoZXJybm8pOworICAgICAgICBhdl9sb2coJmZpbGVfbG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiZmZfdGVtcGZpbGU6IENhbm5vdCBvcGVuIHRlbXBvcmFyeSBmaWxlICVzXG4iLCAqZmlsZW5hbWUpOworICAgICAgICBhdl9mcmVlcChmaWxlbmFtZSk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIHJldHVybiBmZDsgLyogc3VjY2VzcyAqLworfQorCiBGSUxFICphdl9mb3Blbl91dGY4KGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpCiB7CiAgICAgaW50IGZkOwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2Zsb2F0X2RzcC5jIGIvbGliYXZ1dGlsL2Zsb2F0X2RzcC5jCmluZGV4IDQ5ZTBhZTcuLjFkNDkxMWQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9mbG9hdF9kc3AuYworKysgYi9saWJhdnV0aWwvZmxvYXRfZHNwLmMKQEAgLTQwLDYgKzQwLDE0IEBACiAgICAgICAgIGRzdFtpXSArPSBzcmNbaV0gKiBtdWw7CiB9CiAKK3N0YXRpYyB2b2lkIHZlY3Rvcl9kbWFjX3NjYWxhcl9jKGRvdWJsZSAqZHN0LCBjb25zdCBkb3VibGUgKnNyYywgZG91YmxlIG11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBkc3RbaV0gKz0gc3JjW2ldICogbXVsOworfQorCiBzdGF0aWMgdm9pZCB2ZWN0b3JfZm11bF9zY2FsYXJfYyhmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCBtdWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKQogewpAQCAtMTI1LDYgKzEzMyw3IEBACiAgICAgZmRzcC0+dmVjdG9yX2ZtdWwgPSB2ZWN0b3JfZm11bF9jOwogICAgIGZkc3AtPnZlY3Rvcl9mbWFjX3NjYWxhciA9IHZlY3Rvcl9mbWFjX3NjYWxhcl9jOwogICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3NjYWxhciA9IHZlY3Rvcl9mbXVsX3NjYWxhcl9jOworICAgIGZkc3AtPnZlY3Rvcl9kbWFjX3NjYWxhciA9IHZlY3Rvcl9kbWFjX3NjYWxhcl9jOwogICAgIGZkc3AtPnZlY3Rvcl9kbXVsX3NjYWxhciA9IHZlY3Rvcl9kbXVsX3NjYWxhcl9jOwogICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyA9IHZlY3Rvcl9mbXVsX3dpbmRvd19jOwogICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZCA9IHZlY3Rvcl9mbXVsX2FkZF9jOwpAQCAtMTQ0LDMyMSArMTUzLDMgQEAKICAgICAgICAgZmZfZmxvYXRfZHNwX2luaXRfbWlwcyhmZHNwKTsKICAgICByZXR1cm4gZmRzcDsKIH0KLQotCi0jaWZkZWYgVEVTVAotCi0jaW5jbHVkZSA8ZmxvYXQuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWYgSEFWRV9VTklTVERfSAotI2luY2x1ZGUgPHVuaXN0ZC5oPiAvKiBmb3IgZ2V0b3B0ICovCi0jZW5kaWYKLSNpZiAhSEFWRV9HRVRPUFQKLSNpbmNsdWRlICJjb21wYXQvZ2V0b3B0LmMiCi0jZW5kaWYKLQotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImNwdS5oIgotI2luY2x1ZGUgImludGVybmFsLmgiCi0jaW5jbHVkZSAibGZnLmgiCi0jaW5jbHVkZSAibG9nLmgiCi0jaW5jbHVkZSAicmFuZG9tX3NlZWQuaCIKLQotI2RlZmluZSBMRU4gMjQwCi0KLXN0YXRpYyB2b2lkIGZpbGxfZmxvYXRfYXJyYXkoQVZMRkcgKmxmZywgZmxvYXQgKmEsIGludCBsZW4pCi17Ci0gICAgaW50IGk7Ci0gICAgZG91YmxlIGJtZ1syXSwgc3RkZGV2ID0gMTAuMCwgbWVhbiA9IDAuMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgewotICAgICAgICBhdl9ibWdfZ2V0KGxmZywgYm1nKTsKLSAgICAgICAgYVtpXSAgICAgPSBibWdbMF0gKiBzdGRkZXYgKyBtZWFuOwotICAgICAgICBhW2kgKyAxXSA9IGJtZ1sxXSAqIHN0ZGRldiArIG1lYW47Ci0gICAgfQotfQotc3RhdGljIGludCBjb21wYXJlX2Zsb2F0cyhjb25zdCBmbG9hdCAqYSwgY29uc3QgZmxvYXQgKmIsIGludCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heF9kaWZmKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBpZiAoZmFic2YoYVtpXSAtIGJbaV0pID4gbWF4X2RpZmYpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZDogJS0gLjEyZiAtICUtIC4xMmYgPSAlIC4xMmdcbiIsCi0gICAgICAgICAgICAgICAgICAgaSwgYVtpXSwgYltpXSwgYVtpXSAtIGJbaV0pOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBmaWxsX2RvdWJsZV9hcnJheShBVkxGRyAqbGZnLCBkb3VibGUgKmEsIGludCBsZW4pCi17Ci0gICAgaW50IGk7Ci0gICAgZG91YmxlIGJtZ1syXSwgc3RkZGV2ID0gMTAuMCwgbWVhbiA9IDAuMDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgewotICAgICAgICBhdl9ibWdfZ2V0KGxmZywgYm1nKTsKLSAgICAgICAgYVtpXSAgICAgPSBibWdbMF0gKiBzdGRkZXYgKyBtZWFuOwotICAgICAgICBhW2kgKyAxXSA9IGJtZ1sxXSAqIHN0ZGRldiArIG1lYW47Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGNvbXBhcmVfZG91Ymxlcyhjb25zdCBkb3VibGUgKmEsIGNvbnN0IGRvdWJsZSAqYiwgaW50IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhfZGlmZikKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICBpZiAoZmFicyhhW2ldIC0gYltpXSkgPiBtYXhfZGlmZikgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkOiAlLSAuMTJmIC0gJS0gLjEyZiA9ICUgLjEyZ1xuIiwKLSAgICAgICAgICAgICAgICAgICBpLCBhW2ldLCBiW2ldLCBhW2ldIC0gYltpXSk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdGVzdF92ZWN0b3JfZm11bChBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgQVZGbG9hdERTUENvbnRleHQgKmNkc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIpCi17Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGNkc3QsIFtMRU5dKTsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgb2RzdCwgW0xFTl0pOwotICAgIGludCByZXQ7Ci0KLSAgICBjZHNwLT52ZWN0b3JfZm11bChjZHN0LCB2MSwgdjIsIExFTik7Ci0gICAgZmRzcC0+dmVjdG9yX2ZtdWwob2RzdCwgdjEsIHYyLCBMRU4pOwotCi0gICAgaWYgKHJldCA9IGNvbXBhcmVfZmxvYXRzKGNkc3QsIG9kc3QsIExFTiwgRkxUX0VQU0lMT04pKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAidmVjdG9yX2ZtdWwgZmFpbGVkXG4iKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgQVJCSVRSQVJZX0ZNQUNfU0NBTEFSX0NPTlNUIDAuMDA1Ci1zdGF0aWMgaW50IHRlc3RfdmVjdG9yX2ZtYWNfc2NhbGFyKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBBVkZsb2F0RFNQQ29udGV4dCAqY2RzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqc3JjMCwgZmxvYXQgc2NhbGUpCi17Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGNkc3QsIFtMRU5dKTsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgb2RzdCwgW0xFTl0pOwotICAgIGludCByZXQ7Ci0KLSAgICBtZW1jcHkoY2RzdCwgdjEsIExFTiAqIHNpemVvZigqdjEpKTsKLSAgICBtZW1jcHkob2RzdCwgdjEsIExFTiAqIHNpemVvZigqdjEpKTsKLQotICAgIGNkc3AtPnZlY3Rvcl9mbWFjX3NjYWxhcihjZHN0LCBzcmMwLCBzY2FsZSwgTEVOKTsKLSAgICBmZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIob2RzdCwgc3JjMCwgc2NhbGUsIExFTik7Ci0KLSAgICBpZiAocmV0ID0gY29tcGFyZV9mbG9hdHMoY2RzdCwgb2RzdCwgTEVOLCBBUkJJVFJBUllfRk1BQ19TQ0FMQVJfQ09OU1QpKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAidmVjdG9yX2ZtYWNfc2NhbGFyIGZhaWxlZFxuIik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHRlc3RfdmVjdG9yX2ZtdWxfc2NhbGFyKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBBVkZsb2F0RFNQQ29udGV4dCAqY2RzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBmbG9hdCBzY2FsZSkKLXsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgY2RzdCwgW0xFTl0pOwotICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBvZHN0LCBbTEVOXSk7Ci0gICAgaW50IHJldDsKLQotICAgIGNkc3AtPnZlY3Rvcl9mbXVsX3NjYWxhcihjZHN0LCB2MSwgc2NhbGUsIExFTik7Ci0gICAgZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyKG9kc3QsIHYxLCBzY2FsZSwgTEVOKTsKLQotICAgIGlmIChyZXQgPSBjb21wYXJlX2Zsb2F0cyhjZHN0LCBvZHN0LCBMRU4sIEZMVF9FUFNJTE9OKSkKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInZlY3Rvcl9mbXVsX3NjYWxhciBmYWlsZWRcbiIpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZXN0X3ZlY3Rvcl9kbXVsX3NjYWxhcihBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgQVZGbG9hdERTUENvbnRleHQgKmNkc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSAqdjEsIGRvdWJsZSBzY2FsZSkKLXsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBkb3VibGUsIGNkc3QsIFtMRU5dKTsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBkb3VibGUsIG9kc3QsIFtMRU5dKTsKLSAgICBpbnQgcmV0OwotCi0gICAgY2RzcC0+dmVjdG9yX2RtdWxfc2NhbGFyKGNkc3QsIHYxLCBzY2FsZSwgTEVOKTsKLSAgICBmZHNwLT52ZWN0b3JfZG11bF9zY2FsYXIob2RzdCwgdjEsIHNjYWxlLCBMRU4pOwotCi0gICAgaWYgKHJldCA9IGNvbXBhcmVfZG91YmxlcyhjZHN0LCBvZHN0LCBMRU4sIERCTF9FUFNJTE9OKSkKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInZlY3Rvcl9kbXVsX3NjYWxhciBmYWlsZWRcbiIpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBBUkJJVFJBUllfRk1VTF9XSU5ET1dfQ09OU1QgMC4wMDgKLXN0YXRpYyBpbnQgdGVzdF92ZWN0b3JfZm11bF93aW5kb3coQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIEFWRmxvYXREU1BDb250ZXh0ICpjZHNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqdjEsIGNvbnN0IGZsb2F0ICp2MiwgY29uc3QgZmxvYXQgKnYzKQotewotICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBjZHN0LCBbTEVOXSk7Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIG9kc3QsIFtMRU5dKTsKLSAgICBpbnQgcmV0OwotCi0gICAgY2RzcC0+dmVjdG9yX2ZtdWxfd2luZG93KGNkc3QsIHYxLCB2MiwgdjMsIExFTiAvIDIpOwotICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyhvZHN0LCB2MSwgdjIsIHYzLCBMRU4gLyAyKTsKLQotICAgIGlmIChyZXQgPSBjb21wYXJlX2Zsb2F0cyhjZHN0LCBvZHN0LCBMRU4sIEFSQklUUkFSWV9GTVVMX1dJTkRPV19DT05TVCkpCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJ2ZWN0b3JfZm11bF93aW5kb3cgZmFpbGVkXG4iKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgQVJCSVRSQVJZX0ZNVUxfQUREX0NPTlNUIDAuMDA1Ci1zdGF0aWMgaW50IHRlc3RfdmVjdG9yX2ZtdWxfYWRkKEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBBVkZsb2F0RFNQQ29udGV4dCAqY2RzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIsIGNvbnN0IGZsb2F0ICp2MykKLXsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgY2RzdCwgW0xFTl0pOwotICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBvZHN0LCBbTEVOXSk7Ci0gICAgaW50IHJldDsKLQotICAgIGNkc3AtPnZlY3Rvcl9mbXVsX2FkZChjZHN0LCB2MSwgdjIsIHYzLCBMRU4pOwotICAgIGZkc3AtPnZlY3Rvcl9mbXVsX2FkZChvZHN0LCB2MSwgdjIsIHYzLCBMRU4pOwotCi0gICAgaWYgKHJldCA9IGNvbXBhcmVfZmxvYXRzKGNkc3QsIG9kc3QsIExFTiwgQVJCSVRSQVJZX0ZNVUxfQUREX0NPTlNUKSkKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInZlY3Rvcl9mbXVsX2FkZCBmYWlsZWRcbiIpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB0ZXN0X3ZlY3Rvcl9mbXVsX3JldmVyc2UoQVZGbG9hdERTUENvbnRleHQgKmZkc3AsIEFWRmxvYXREU1BDb250ZXh0ICpjZHNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIpCi17Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGNkc3QsIFtMRU5dKTsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgb2RzdCwgW0xFTl0pOwotICAgIGludCByZXQ7Ci0KLSAgICBjZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKGNkc3QsIHYxLCB2MiwgTEVOKTsKLSAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlKG9kc3QsIHYxLCB2MiwgTEVOKTsKLQotICAgIGlmIChyZXQgPSBjb21wYXJlX2Zsb2F0cyhjZHN0LCBvZHN0LCBMRU4sIEZMVF9FUFNJTE9OKSkKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInZlY3Rvcl9mbXVsX3JldmVyc2UgZmFpbGVkXG4iKTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgdGVzdF9idXR0ZXJmbGllc19mbG9hdChBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgQVZGbG9hdERTUENvbnRleHQgKmNkc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIpCi17Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGN2MSwgW0xFTl0pOwotICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBjdjIsIFtMRU5dKTsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgb3YxLCBbTEVOXSk7Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIG92MiwgW0xFTl0pOwotICAgIGludCByZXQ7Ci0KLSAgICBtZW1jcHkoY3YxLCB2MSwgTEVOICogc2l6ZW9mKCp2MSkpOwotICAgIG1lbWNweShjdjIsIHYyLCBMRU4gKiBzaXplb2YoKnYyKSk7Ci0gICAgbWVtY3B5KG92MSwgdjEsIExFTiAqIHNpemVvZigqdjEpKTsKLSAgICBtZW1jcHkob3YyLCB2MiwgTEVOICogc2l6ZW9mKCp2MikpOwotCi0gICAgY2RzcC0+YnV0dGVyZmxpZXNfZmxvYXQoY3YxLCBjdjIsIExFTik7Ci0gICAgZmRzcC0+YnV0dGVyZmxpZXNfZmxvYXQob3YxLCBvdjIsIExFTik7Ci0KLSAgICBpZiAoKHJldCA9IGNvbXBhcmVfZmxvYXRzKGN2MSwgb3YxLCBMRU4sIEZMVF9FUFNJTE9OKSkgfHwKLSAgICAgICAgKHJldCA9IGNvbXBhcmVfZmxvYXRzKGN2Miwgb3YyLCBMRU4sIEZMVF9FUFNJTE9OKSkpCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJidXR0ZXJmbGllc19mbG9hdCBmYWlsZWRcbiIpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBBUkJJVFJBUllfU0NBTEFSUFJPRFVDVF9DT05TVCAwLjIKLXN0YXRpYyBpbnQgdGVzdF9zY2FsYXJwcm9kdWN0X2Zsb2F0KEFWRmxvYXREU1BDb250ZXh0ICpmZHNwLCBBVkZsb2F0RFNQQ29udGV4dCAqY2RzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICp2MSwgY29uc3QgZmxvYXQgKnYyKQotewotICAgIGZsb2F0IGNwcm9kLCBvcHJvZDsKLSAgICBpbnQgcmV0OwotCi0gICAgY3Byb2QgPSBjZHNwLT5zY2FsYXJwcm9kdWN0X2Zsb2F0KHYxLCB2MiwgTEVOKTsKLSAgICBvcHJvZCA9IGZkc3AtPnNjYWxhcnByb2R1Y3RfZmxvYXQodjEsIHYyLCBMRU4pOwotCi0gICAgaWYgKHJldCA9IGNvbXBhcmVfZmxvYXRzKCZjcHJvZCwgJm9wcm9kLCAxLCBBUkJJVFJBUllfU0NBTEFSUFJPRFVDVF9DT05TVCkpCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJzY2FsYXJwcm9kdWN0X2Zsb2F0IGZhaWxlZFxuIik7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0gICAgaW50IHJldCA9IDAsIHNlZWRlZCA9IDA7Ci0gICAgdWludDMyX3Qgc2VlZDsKLSAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCwgKmNkc3A7Ci0gICAgQVZMRkcgbGZnOwotCi0gICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIHNyYzAsIFtMRU5dKTsKLSAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgc3JjMSwgW0xFTl0pOwotICAgIExPQ0FMX0FMSUdORUQoMzIsIGZsb2F0LCBzcmMyLCBbTEVOXSk7Ci0gICAgTE9DQUxfQUxJR05FRCgzMiwgZG91YmxlLCBkYmxfc3JjMCwgW0xFTl0pOwotICAgIExPQ0FMX0FMSUdORUQoMzIsIGRvdWJsZSwgZGJsX3NyYzEsIFtMRU5dKTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgaW50IGFyZyA9IGdldG9wdChhcmdjLCBhcmd2LCAiczpjOiIpOwotICAgICAgICBpZiAoYXJnID09IC0xKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHN3aXRjaCAoYXJnKSB7Ci0gICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgc2VlZCA9IHN0cnRvdWwob3B0YXJnLCBOVUxMLCAxMCk7Ci0gICAgICAgICAgICBzZWVkZWQgPSAxOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2MnOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgY3B1ZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7Ci0KLSAgICAgICAgICAgIGlmIChhdl9wYXJzZV9jcHVfY2FwcygmY3B1ZmxhZ3MsIG9wdGFyZykgPCAwKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgICBhdl9mb3JjZV9jcHVfZmxhZ3MoY3B1ZmxhZ3MpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoIXNlZWRlZCkKLSAgICAgICAgc2VlZCA9IGF2X2dldF9yYW5kb21fc2VlZCgpOwotCi0gICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiZmxvYXRfZHNwLXRlc3Q6ICVzICV1XG4iLCBzZWVkZWQgPyAic2VlZCIgOiAicmFuZG9tIHNlZWQiLCBzZWVkKTsKLQotICAgIGZkc3AgPSBhdnByaXZfZmxvYXRfZHNwX2FsbG9jKDEpOwotICAgIGF2X2ZvcmNlX2NwdV9mbGFncygwKTsKLSAgICBjZHNwID0gYXZwcml2X2Zsb2F0X2RzcF9hbGxvYygxKTsKLQotICAgIGlmICghZmRzcCB8fCAhY2RzcCkgewotICAgICAgICByZXQgPSAxOwotICAgICAgICBnb3RvIGVuZDsKLSAgICB9Ci0KLSAgICBhdl9sZmdfaW5pdCgmbGZnLCBzZWVkKTsKLQotICAgIGZpbGxfZmxvYXRfYXJyYXkoJmxmZywgc3JjMCwgTEVOKTsKLSAgICBmaWxsX2Zsb2F0X2FycmF5KCZsZmcsIHNyYzEsIExFTik7Ci0gICAgZmlsbF9mbG9hdF9hcnJheSgmbGZnLCBzcmMyLCBMRU4pOwotCi0gICAgZmlsbF9kb3VibGVfYXJyYXkoJmxmZywgZGJsX3NyYzAsIExFTik7Ci0gICAgZmlsbF9kb3VibGVfYXJyYXkoJmxmZywgZGJsX3NyYzEsIExFTik7Ci0KLSAgICBpZiAodGVzdF92ZWN0b3JfZm11bChmZHNwLCBjZHNwLCBzcmMwLCBzcmMxKSkKLSAgICAgICAgcmV0IC09IDEgPDwgMDsKLSAgICBpZiAodGVzdF92ZWN0b3JfZm1hY19zY2FsYXIoZmRzcCwgY2RzcCwgc3JjMiwgc3JjMCwgc3JjMVswXSkpCi0gICAgICAgIHJldCAtPSAxIDw8IDE7Ci0gICAgaWYgKHRlc3RfdmVjdG9yX2ZtdWxfc2NhbGFyKGZkc3AsIGNkc3AsIHNyYzAsIHNyYzFbMF0pKQotICAgICAgICByZXQgLT0gMSA8PCAyOwotICAgIGlmICh0ZXN0X3ZlY3Rvcl9mbXVsX3dpbmRvdyhmZHNwLCBjZHNwLCBzcmMwLCBzcmMxLCBzcmMyKSkKLSAgICAgICAgcmV0IC09IDEgPDwgMzsKLSAgICBpZiAodGVzdF92ZWN0b3JfZm11bF9hZGQoZmRzcCwgY2RzcCwgc3JjMCwgc3JjMSwgc3JjMikpCi0gICAgICAgIHJldCAtPSAxIDw8IDQ7Ci0gICAgaWYgKHRlc3RfdmVjdG9yX2ZtdWxfcmV2ZXJzZShmZHNwLCBjZHNwLCBzcmMwLCBzcmMxKSkKLSAgICAgICAgcmV0IC09IDEgPDwgNTsKLSAgICBpZiAodGVzdF9idXR0ZXJmbGllc19mbG9hdChmZHNwLCBjZHNwLCBzcmMwLCBzcmMxKSkKLSAgICAgICAgcmV0IC09IDEgPDwgNjsKLSAgICBpZiAodGVzdF9zY2FsYXJwcm9kdWN0X2Zsb2F0KGZkc3AsIGNkc3AsIHNyYzAsIHNyYzEpKQotICAgICAgICByZXQgLT0gMSA8PCA3OwotICAgIGlmICh0ZXN0X3ZlY3Rvcl9kbXVsX3NjYWxhcihmZHNwLCBjZHNwLCBkYmxfc3JjMCwgZGJsX3NyYzFbMF0pKQotICAgICAgICByZXQgLT0gMSA8PCA4OwotCi1lbmQ6Ci0gICAgYXZfZnJlZXAoJmZkc3ApOwotICAgIGF2X2ZyZWVwKCZjZHNwKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0jZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2Zsb2F0X2RzcC5oIGIvbGliYXZ1dGlsL2Zsb2F0X2RzcC5oCmluZGV4IGQxYmUzOGYuLjJjMjRkOTMgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9mbG9hdF9kc3AuaAorKysgYi9saWJhdnV0aWwvZmxvYXRfZHNwLmgKQEAgLTU1LDYgKzU1LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CiAKICAgICAvKioKKyAgICAgKiBNdWx0aXBseSBhIHZlY3RvciBvZiBkb3VibGVzIGJ5IGEgc2NhbGFyIGRvdWJsZSBhbmQgYWRkIHRvCisgICAgICogZGVzdGluYXRpb24gdmVjdG9yLiAgU291cmNlIGFuZCBkZXN0aW5hdGlvbiB2ZWN0b3JzIG11c3QKKyAgICAgKiBvdmVybGFwIGV4YWN0bHkgb3Igbm90IGF0IGFsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkc3QgcmVzdWx0IHZlY3RvcgorICAgICAqICAgICAgICAgICAgY29uc3RyYWludHM6IDMyLWJ5dGUgYWxpZ25lZAorICAgICAqIEBwYXJhbSBzcmMgaW5wdXQgdmVjdG9yCisgICAgICogICAgICAgICAgICBjb25zdHJhaW50czogMzItYnl0ZSBhbGlnbmVkCisgICAgICogQHBhcmFtIG11bCBzY2FsYXIgdmFsdWUKKyAgICAgKiBAcGFyYW0gbGVuIGxlbmd0aCBvZiB2ZWN0b3IKKyAgICAgKiAgICAgICAgICAgIGNvbnN0cmFpbnRzOiBtdWx0aXBsZSBvZiAxNgorICAgICAqLworICAgIHZvaWQgKCp2ZWN0b3JfZG1hY19zY2FsYXIpKGRvdWJsZSAqZHN0LCBjb25zdCBkb3VibGUgKnNyYywgZG91YmxlIG11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKworICAgIC8qKgogICAgICAqIE11bHRpcGx5IGEgdmVjdG9yIG9mIGZsb2F0cyBieSBhIHNjYWxhciBmbG9hdC4gIFNvdXJjZSBhbmQKICAgICAgKiBkZXN0aW5hdGlvbiB2ZWN0b3JzIG11c3Qgb3ZlcmxhcCBleGFjdGx5IG9yIG5vdCBhdCBhbGwuCiAgICAgICoKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9mcmFtZS5jIGIvbGliYXZ1dGlsL2ZyYW1lLmMKaW5kZXggMDMzZjAxMy4uMDAyMTVhYyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2ZyYW1lLmMKKysrIGIvbGliYXZ1dGlsL2ZyYW1lLmMKQEAgLTEsNSArMSw0IEBACiAvKgotICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCiAgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNyw2ICsyNiw3IEBACiAjaW5jbHVkZSAibWVtLmgiCiAjaW5jbHVkZSAic2FtcGxlZm10LmgiCiAKKyNpZiBGRl9BUElfRlJBTUVfR0VUX1NFVAogTUFLRV9BQ0NFU1NPUlMoQVZGcmFtZSwgZnJhbWUsIGludDY0X3QsIGJlc3RfZWZmb3J0X3RpbWVzdGFtcCkKIE1BS0VfQUNDRVNTT1JTKEFWRnJhbWUsIGZyYW1lLCBpbnQ2NF90LCBwa3RfZHVyYXRpb24pCiBNQUtFX0FDQ0VTU09SUyhBVkZyYW1lLCBmcmFtZSwgaW50NjRfdCwgcGt0X3BvcykKQEAgLTM4LDQxICszOCw4NCBAQAogTUFLRV9BQ0NFU1NPUlMoQVZGcmFtZSwgZnJhbWUsIGludCwgICAgIHBrdF9zaXplKQogTUFLRV9BQ0NFU1NPUlMoQVZGcmFtZSwgZnJhbWUsIGVudW0gQVZDb2xvclNwYWNlLCBjb2xvcnNwYWNlKQogTUFLRV9BQ0NFU1NPUlMoQVZGcmFtZSwgZnJhbWUsIGVudW0gQVZDb2xvclJhbmdlLCBjb2xvcl9yYW5nZSkKKyNlbmRpZgogCiAjZGVmaW5lIENIRUNLX0NIQU5ORUxTX0NPTlNJU1RFTkNZKGZyYW1lKSBcCiAgICAgYXZfYXNzZXJ0MighKGZyYW1lKS0+Y2hhbm5lbF9sYXlvdXQgfHwgXAogICAgICAgICAgICAgICAgKGZyYW1lKS0+Y2hhbm5lbHMgPT0gXAogICAgICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKChmcmFtZSktPmNoYW5uZWxfbGF5b3V0KSkKIAotQVZEaWN0aW9uYXJ5ICoqYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoQVZGcmFtZSAqZnJhbWUpIHtyZXR1cm4gJmZyYW1lLT5tZXRhZGF0YTt9OwotCiAjaWYgRkZfQVBJX0ZSQU1FX1FQCitzdHJ1Y3QgcXBfcHJvcGVydGllcyB7CisgICAgaW50IHN0cmlkZTsKKyAgICBpbnQgdHlwZTsKK307CisKIGludCBhdl9mcmFtZV9zZXRfcXBfdGFibGUoQVZGcmFtZSAqZiwgQVZCdWZmZXJSZWYgKmJ1ZiwgaW50IHN0cmlkZSwgaW50IHFwX3R5cGUpCiB7CisgICAgc3RydWN0IHFwX3Byb3BlcnRpZXMgKnA7CisgICAgQVZGcmFtZVNpZGVEYXRhICpzZDsKKyAgICBBVkJ1ZmZlclJlZiAqcmVmOworCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgYXZfYnVmZmVyX3VucmVmKCZmLT5xcF90YWJsZV9idWYpOwogCiAgICAgZi0+cXBfdGFibGVfYnVmID0gYnVmOwotCi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgZi0+cXNjYWxlX3RhYmxlID0gYnVmLT5kYXRhOwogICAgIGYtPnFzdHJpZGUgICAgICA9IHN0cmlkZTsKICAgICBmLT5xc2NhbGVfdHlwZSAgPSBxcF90eXBlOwogRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAKKyAgICBhdl9mcmFtZV9yZW1vdmVfc2lkZV9kYXRhKGYsIEFWX0ZSQU1FX0RBVEFfUVBfVEFCTEVfUFJPUEVSVElFUyk7CisgICAgYXZfZnJhbWVfcmVtb3ZlX3NpZGVfZGF0YShmLCBBVl9GUkFNRV9EQVRBX1FQX1RBQkxFX0RBVEEpOworCisgICAgcmVmID0gYXZfYnVmZmVyX3JlZihidWYpOworICAgIGlmICghYXZfZnJhbWVfbmV3X3NpZGVfZGF0YV9mcm9tX2J1ZihmLCBBVl9GUkFNRV9EQVRBX1FQX1RBQkxFX0RBVEEsIHJlZikpIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZyZWYpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHNkID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YShmLCBBVl9GUkFNRV9EQVRBX1FQX1RBQkxFX1BST1BFUlRJRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgcXBfcHJvcGVydGllcykpOworICAgIGlmICghc2QpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBwID0gKHN0cnVjdCBxcF9wcm9wZXJ0aWVzICopc2QtPmRhdGE7CisgICAgcC0+c3RyaWRlID0gc3RyaWRlOworICAgIHAtPnR5cGUgPSBxcF90eXBlOworCiAgICAgcmV0dXJuIDA7CiB9CiAKIGludDhfdCAqYXZfZnJhbWVfZ2V0X3FwX3RhYmxlKEFWRnJhbWUgKmYsIGludCAqc3RyaWRlLCBpbnQgKnR5cGUpCiB7CisgICAgQVZCdWZmZXJSZWYgKmJ1ZiA9IE5VTEw7CisKKyAgICAqc3RyaWRlID0gMDsKKyAgICAqdHlwZSAgID0gMDsKKwogRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwotICAgICpzdHJpZGUgPSBmLT5xc3RyaWRlOwotICAgICp0eXBlICAgPSBmLT5xc2NhbGVfdHlwZTsKKyAgICBpZiAoZi0+cXBfdGFibGVfYnVmKSB7CisgICAgICAgICpzdHJpZGUgPSBmLT5xc3RyaWRlOworICAgICAgICAqdHlwZSAgID0gZi0+cXNjYWxlX3R5cGU7CisgICAgICAgIGJ1ZiAgICAgPSBmLT5xcF90YWJsZV9idWY7CiBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKKyAgICB9IGVsc2UgeworICAgICAgICBBVkZyYW1lU2lkZURhdGEgKnNkOworICAgICAgICBzdHJ1Y3QgcXBfcHJvcGVydGllcyAqcDsKKyAgICAgICAgc2QgPSBhdl9mcmFtZV9nZXRfc2lkZV9kYXRhKGYsIEFWX0ZSQU1FX0RBVEFfUVBfVEFCTEVfUFJPUEVSVElFUyk7CisgICAgICAgIGlmICghc2QpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcCA9IChzdHJ1Y3QgcXBfcHJvcGVydGllcyAqKXNkLT5kYXRhOworICAgICAgICBzZCA9IGF2X2ZyYW1lX2dldF9zaWRlX2RhdGEoZiwgQVZfRlJBTUVfREFUQV9RUF9UQUJMRV9EQVRBKTsKKyAgICAgICAgaWYgKCFzZCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAqc3RyaWRlID0gcC0+c3RyaWRlOworICAgICAgICAqdHlwZSAgID0gcC0+dHlwZTsKKyAgICAgICAgYnVmICAgICA9IHNkLT5idWY7CisgICAgfQogCi0gICAgaWYgKCFmLT5xcF90YWJsZV9idWYpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmV0dXJuIGYtPnFwX3RhYmxlX2J1Zi0+ZGF0YTsKKyAgICByZXR1cm4gYnVmID8gYnVmLT5kYXRhIDogTlVMTDsKIH0KICNlbmRpZgogCkBAIC0xMDAsMTIgKzE0MywxNiBAQAogICAgIG1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKCpmcmFtZSkpOwogCiAgICAgZnJhbWUtPnB0cyAgICAgICAgICAgICAgICAgICA9Ci0gICAgZnJhbWUtPnBrdF9kdHMgICAgICAgICAgICAgICA9CisgICAgZnJhbWUtPnBrdF9kdHMgICAgICAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOworI2lmIEZGX0FQSV9QS1RfUFRTCitGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAgICAgZnJhbWUtPnBrdF9wdHMgICAgICAgICAgICAgICA9IEFWX05PUFRTX1ZBTFVFOwotICAgIGF2X2ZyYW1lX3NldF9iZXN0X2VmZm9ydF90aW1lc3RhbXAoZnJhbWUsIEFWX05PUFRTX1ZBTFVFKTsKLSAgICBhdl9mcmFtZV9zZXRfcGt0X2R1cmF0aW9uICAgICAgICAgKGZyYW1lLCAwKTsKLSAgICBhdl9mcmFtZV9zZXRfcGt0X3BvcyAgICAgICAgICAgICAgKGZyYW1lLCAtMSk7Ci0gICAgYXZfZnJhbWVfc2V0X3BrdF9zaXplICAgICAgICAgICAgIChmcmFtZSwgLTEpOworRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCisjZW5kaWYKKyAgICBmcmFtZS0+YmVzdF9lZmZvcnRfdGltZXN0YW1wID0gQVZfTk9QVFNfVkFMVUU7CisgICAgZnJhbWUtPnBrdF9kdXJhdGlvbiAgICAgICAgPSAwOworICAgIGZyYW1lLT5wa3RfcG9zICAgICAgICAgICAgID0gLTE7CisgICAgZnJhbWUtPnBrdF9zaXplICAgICAgICAgICAgPSAtMTsKICAgICBmcmFtZS0+a2V5X2ZyYW1lICAgICAgICAgICA9IDE7CiAgICAgZnJhbWUtPnNhbXBsZV9hc3BlY3RfcmF0aW8gPSAoQVZSYXRpb25hbCl7IDAsIDEgfTsKICAgICBmcmFtZS0+Zm9ybWF0ICAgICAgICAgICAgICA9IC0xOyAvKiB1bmtub3duICovCkBAIC0xMTUsNiArMTYyLDcgQEAKICAgICBmcmFtZS0+Y29sb3JzcGFjZSAgICAgICAgICA9IEFWQ09MX1NQQ19VTlNQRUNJRklFRDsKICAgICBmcmFtZS0+Y29sb3JfcmFuZ2UgICAgICAgICA9IEFWQ09MX1JBTkdFX1VOU1BFQ0lGSUVEOwogICAgIGZyYW1lLT5jaHJvbWFfbG9jYXRpb24gICAgID0gQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEOworICAgIGZyYW1lLT5mbGFncyAgICAgICAgICAgICAgID0gMDsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9zaWRlX2RhdGEoQVZGcmFtZVNpZGVEYXRhICoqcHRyX3NkKQpAQCAtMTcyLDYgKzIyMCw5IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBpZiAoIWZyYW1lLT5saW5lc2l6ZVswXSkgeworICAgICAgICBpZiAoYWxpZ24gPD0gMCkKKyAgICAgICAgICAgIGFsaWduID0gMzI7IC8qIFNUUklERV9BTElHTi4gU2hvdWxkIGJlIGF2X2NwdV9tYXhfYWxpZ24oKSAqLworCiAgICAgICAgIGZvcihpPTE7IGk8PWFsaWduOyBpKz1pKSB7CiAgICAgICAgICAgICByZXQgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhmcmFtZS0+bGluZXNpemUsIGZyYW1lLT5mb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGRkFMSUdOKGZyYW1lLT53aWR0aCwgaSkpOwpAQCAtMTk2LDcgKzI0Nyw3IEBACiAKICAgICAgICAgZnJhbWUtPmRhdGFbaV0gPSBmcmFtZS0+YnVmW2ldLT5kYXRhOwogICAgIH0KLSAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkgeworICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwgZGVzYy0+ZmxhZ3MgJiBGRl9QU0VVRE9QQUwpIHsKICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+YnVmWzFdKTsKICAgICAgICAgZnJhbWUtPmJ1ZlsxXSA9IGF2X2J1ZmZlcl9hbGxvYyhBVlBBTEVUVEVfU0laRSk7CiAgICAgICAgIGlmICghZnJhbWUtPmJ1ZlsxXSkKQEAgLTI4OCw2ICszMzksMTAgQEAKICAgICBkc3QtPmtleV9mcmFtZSAgICAgICAgICAgICAgPSBzcmMtPmtleV9mcmFtZTsKICAgICBkc3QtPnBpY3RfdHlwZSAgICAgICAgICAgICAgPSBzcmMtPnBpY3RfdHlwZTsKICAgICBkc3QtPnNhbXBsZV9hc3BlY3RfcmF0aW8gICAgPSBzcmMtPnNhbXBsZV9hc3BlY3RfcmF0aW87CisgICAgZHN0LT5jcm9wX3RvcCAgICAgICAgICAgICAgID0gc3JjLT5jcm9wX3RvcDsKKyAgICBkc3QtPmNyb3BfYm90dG9tICAgICAgICAgICAgPSBzcmMtPmNyb3BfYm90dG9tOworICAgIGRzdC0+Y3JvcF9sZWZ0ICAgICAgICAgICAgICA9IHNyYy0+Y3JvcF9sZWZ0OworICAgIGRzdC0+Y3JvcF9yaWdodCAgICAgICAgICAgICA9IHNyYy0+Y3JvcF9yaWdodDsKICAgICBkc3QtPnB0cyAgICAgICAgICAgICAgICAgICAgPSBzcmMtPnB0czsKICAgICBkc3QtPnJlcGVhdF9waWN0ICAgICAgICAgICAgPSBzcmMtPnJlcGVhdF9waWN0OwogICAgIGRzdC0+aW50ZXJsYWNlZF9mcmFtZSAgICAgICA9IHNyYy0+aW50ZXJsYWNlZF9mcmFtZTsKQEAgLTI5NSw3ICszNTAsMTEgQEAKICAgICBkc3QtPnBhbGV0dGVfaGFzX2NoYW5nZWQgICAgPSBzcmMtPnBhbGV0dGVfaGFzX2NoYW5nZWQ7CiAgICAgZHN0LT5zYW1wbGVfcmF0ZSAgICAgICAgICAgID0gc3JjLT5zYW1wbGVfcmF0ZTsKICAgICBkc3QtPm9wYXF1ZSAgICAgICAgICAgICAgICAgPSBzcmMtPm9wYXF1ZTsKKyNpZiBGRl9BUElfUEtUX1BUUworRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIGRzdC0+cGt0X3B0cyAgICAgICAgICAgICAgICA9IHNyYy0+cGt0X3B0czsKK0ZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUworI2VuZGlmCiAgICAgZHN0LT5wa3RfZHRzICAgICAgICAgICAgICAgID0gc3JjLT5wa3RfZHRzOwogICAgIGRzdC0+cGt0X3BvcyAgICAgICAgICAgICAgICA9IHNyYy0+cGt0X3BvczsKICAgICBkc3QtPnBrdF9zaXplICAgICAgICAgICAgICAgPSBzcmMtPnBrdF9zaXplOwpAQCAtMzM2LDE4ICszOTUsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lbWNweShzZF9kc3QtPmRhdGEsIHNkX3NyYy0+ZGF0YSwgc2Rfc3JjLT5zaXplKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNkX2RzdCA9IGF2X2ZyYW1lX25ld19zaWRlX2RhdGEoZHN0LCBzZF9zcmMtPnR5cGUsIDApOworICAgICAgICAgICAgQVZCdWZmZXJSZWYgKnJlZiA9IGF2X2J1ZmZlcl9yZWYoc2Rfc3JjLT5idWYpOworICAgICAgICAgICAgc2RfZHN0ID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YV9mcm9tX2J1Zihkc3QsIHNkX3NyYy0+dHlwZSwgcmVmKTsKICAgICAgICAgICAgIGlmICghc2RfZHN0KSB7CisgICAgICAgICAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZyZWYpOwogICAgICAgICAgICAgICAgIHdpcGVfc2lkZV9kYXRhKGRzdCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNkX2RzdC0+YnVmID0gYXZfYnVmZmVyX3JlZihzZF9zcmMtPmJ1Zik7Ci0gICAgICAgICAgICBpZiAoIXNkX2RzdC0+YnVmKSB7Ci0gICAgICAgICAgICAgICAgd2lwZV9zaWRlX2RhdGEoZHN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2RfZHN0LT5kYXRhID0gc2RfZHN0LT5idWYtPmRhdGE7Ci0gICAgICAgICAgICBzZF9kc3QtPnNpemUgPSBzZF9kc3QtPmJ1Zi0+c2l6ZTsKICAgICAgICAgfQogICAgICAgICBhdl9kaWN0X2NvcHkoJnNkX2RzdC0+bWV0YWRhdGEsIHNkX3NyYy0+bWV0YWRhdGEsIDApOwogICAgIH0KQEAgLTM2OSw2ICs0MjMsMTggQEAKIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogI2VuZGlmCiAKKyAgICBhdl9idWZmZXJfdW5yZWYoJmRzdC0+b3BhcXVlX3JlZik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZkc3QtPnByaXZhdGVfcmVmKTsKKyAgICBpZiAoc3JjLT5vcGFxdWVfcmVmKSB7CisgICAgICAgIGRzdC0+b3BhcXVlX3JlZiA9IGF2X2J1ZmZlcl9yZWYoc3JjLT5vcGFxdWVfcmVmKTsKKyAgICAgICAgaWYgKCFkc3QtPm9wYXF1ZV9yZWYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKyAgICBpZiAoc3JjLT5wcml2YXRlX3JlZikgeworICAgICAgICBkc3QtPnByaXZhdGVfcmVmID0gYXZfYnVmZmVyX3JlZihzcmMtPnByaXZhdGVfcmVmKTsKKyAgICAgICAgaWYgKCFkc3QtPnByaXZhdGVfcmVmKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTM3Niw2ICs0NDIsOSBAQAogewogICAgIGludCBpLCByZXQgPSAwOwogCisgICAgYXZfYXNzZXJ0MShkc3QtPndpZHRoID09IDAgJiYgZHN0LT5oZWlnaHQgPT0gMCk7CisgICAgYXZfYXNzZXJ0MShkc3QtPmNoYW5uZWxzID09IDApOworCiAgICAgZHN0LT5mb3JtYXQgICAgICAgICA9IHNyYy0+Zm9ybWF0OwogICAgIGRzdC0+d2lkdGggICAgICAgICAgPSBzcmMtPndpZHRoOwogICAgIGRzdC0+aGVpZ2h0ICAgICAgICAgPSBzcmMtPmhlaWdodDsKQEAgLTQyOSw2ICs0OTgsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChzcmMtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgZHN0LT5od19mcmFtZXNfY3R4ID0gYXZfYnVmZmVyX3JlZihzcmMtPmh3X2ZyYW1lc19jdHgpOworICAgICAgICBpZiAoIWRzdC0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgfQorCiAgICAgLyogZHVwbGljYXRlIGV4dGVuZGVkIGRhdGEgKi8KICAgICBpZiAoc3JjLT5leHRlbmRlZF9kYXRhICE9IHNyYy0+ZGF0YSkgewogICAgICAgICBpbnQgY2ggPSBzcmMtPmNoYW5uZWxzOwpAQCAtNDg3LDE0ICs1NjQsMjQgQEAKICAgICBhdl9mcmVlcCgmZnJhbWUtPmV4dGVuZGVkX2J1Zik7CiAgICAgYXZfZGljdF9mcmVlKCZmcmFtZS0+bWV0YWRhdGEpOwogI2lmIEZGX0FQSV9GUkFNRV9RUAorRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogICAgIGF2X2J1ZmZlcl91bnJlZigmZnJhbWUtPnFwX3RhYmxlX2J1Zik7CitGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MKICNlbmRpZgogCisgICAgYXZfYnVmZmVyX3VucmVmKCZmcmFtZS0+aHdfZnJhbWVzX2N0eCk7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5vcGFxdWVfcmVmKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5wcml2YXRlX3JlZik7CisKICAgICBnZXRfZnJhbWVfZGVmYXVsdHMoZnJhbWUpOwogfQogCiB2b2lkIGF2X2ZyYW1lX21vdmVfcmVmKEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjKQogeworICAgIGF2X2Fzc2VydDEoZHN0LT53aWR0aCA9PSAwICYmIGRzdC0+aGVpZ2h0ID09IDApOworICAgIGF2X2Fzc2VydDEoZHN0LT5jaGFubmVscyA9PSAwKTsKKwogICAgICpkc3QgPSAqc3JjOwogICAgIGlmIChzcmMtPmV4dGVuZGVkX2RhdGEgPT0gc3JjLT5kYXRhKQogICAgICAgICBkc3QtPmV4dGVuZGVkX2RhdGEgPSBkc3QtPmRhdGE7CkBAIC01OTgsMTIgKzY4NSwxNSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1BVkZyYW1lU2lkZURhdGEgKmF2X2ZyYW1lX25ld19zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkZyYW1lU2lkZURhdGFUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpCitBVkZyYW1lU2lkZURhdGEgKmF2X2ZyYW1lX25ld19zaWRlX2RhdGFfZnJvbV9idWYoQVZGcmFtZSAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkZyYW1lU2lkZURhdGFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKmJ1ZikKIHsKICAgICBBVkZyYW1lU2lkZURhdGEgKnJldCwgKip0bXA7CiAKKyAgICBpZiAoIWJ1ZikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKICAgICBpZiAoZnJhbWUtPm5iX3NpZGVfZGF0YSA+IElOVF9NQVggLyBzaXplb2YoKmZyYW1lLT5zaWRlX2RhdGEpIC0gMSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTYxNywxNiArNzA3LDkgQEAKICAgICBpZiAoIXJldCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgcmV0LT5idWYgPSBhdl9idWZmZXJfYWxsb2Moc2l6ZSk7Ci0gICAgICAgIGlmICghcmV0LT5idWYpIHsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZyZXQpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXQtPmRhdGEgPSByZXQtPmJ1Zi0+ZGF0YTsKLSAgICAgICAgcmV0LT5zaXplID0gc2l6ZTsKLSAgICB9CisgICAgcmV0LT5idWYgPSBidWY7CisgICAgcmV0LT5kYXRhID0gcmV0LT5idWYtPmRhdGE7CisgICAgcmV0LT5zaXplID0gYnVmLT5zaXplOwogICAgIHJldC0+dHlwZSA9IHR5cGU7CiAKICAgICBmcmFtZS0+c2lkZV9kYXRhW2ZyYW1lLT5uYl9zaWRlX2RhdGErK10gPSByZXQ7CkBAIC02MzQsNiArNzE3LDE4IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorQVZGcmFtZVNpZGVEYXRhICphdl9mcmFtZV9uZXdfc2lkZV9kYXRhKEFWRnJhbWUgKmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZGcmFtZVNpZGVEYXRhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKQoreworICAgIEFWRnJhbWVTaWRlRGF0YSAqcmV0OworICAgIEFWQnVmZmVyUmVmICpidWYgPSBhdl9idWZmZXJfYWxsb2Moc2l6ZSk7CisgICAgcmV0ID0gYXZfZnJhbWVfbmV3X3NpZGVfZGF0YV9mcm9tX2J1ZihmcmFtZSwgdHlwZSwgYnVmKTsKKyAgICBpZiAoIXJldCkKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZidWYpOworICAgIHJldHVybiByZXQ7Cit9CisKIEFWRnJhbWVTaWRlRGF0YSAqYXZfZnJhbWVfZ2V0X3NpZGVfZGF0YShjb25zdCBBVkZyYW1lICpmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWRnJhbWVTaWRlRGF0YVR5cGUgdHlwZSkKIHsKQEAgLTY5OSw3ICs3OTQsNyBAQAogCiAgICAgaWYgKGRzdC0+d2lkdGggPiAwICYmIGRzdC0+aGVpZ2h0ID4gMCkKICAgICAgICAgcmV0dXJuIGZyYW1lX2NvcHlfdmlkZW8oZHN0LCBzcmMpOwotICAgIGVsc2UgaWYgKGRzdC0+bmJfc2FtcGxlcyA+IDAgJiYgZHN0LT5jaGFubmVsX2xheW91dCkKKyAgICBlbHNlIGlmIChkc3QtPm5iX3NhbXBsZXMgPiAwICYmIGRzdC0+Y2hhbm5lbHMgPiAwKQogICAgICAgICByZXR1cm4gZnJhbWVfY29weV9hdWRpbyhkc3QsIHNyYyk7CiAKICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwpAQCAtNzM0LDcgKzgyOSwxMTEgQEAKICAgICBjYXNlIEFWX0ZSQU1FX0RBVEFfU0tJUF9TQU1QTEVTOiAgICByZXR1cm4gIlNraXAgc2FtcGxlcyI7CiAgICAgY2FzZSBBVl9GUkFNRV9EQVRBX0FVRElPX1NFUlZJQ0VfVFlQRTogICAgICAgICAgcmV0dXJuICJBdWRpbyBzZXJ2aWNlIHR5cGUiOwogICAgIGNhc2UgQVZfRlJBTUVfREFUQV9NQVNURVJJTkdfRElTUExBWV9NRVRBREFUQTogIHJldHVybiAiTWFzdGVyaW5nIGRpc3BsYXkgbWV0YWRhdGEiOworICAgIGNhc2UgQVZfRlJBTUVfREFUQV9DT05URU5UX0xJR0hUX0xFVkVMOiAgICAgICAgIHJldHVybiAiQ29udGVudCBsaWdodCBsZXZlbCBtZXRhZGF0YSI7CiAgICAgY2FzZSBBVl9GUkFNRV9EQVRBX0dPUF9USU1FQ09ERTogICAgICAgICAgICAgICAgcmV0dXJuICJHT1AgdGltZWNvZGUiOworICAgIGNhc2UgQVZfRlJBTUVfREFUQV9JQ0NfUFJPRklMRTogICAgICAgICAgICAgICAgIHJldHVybiAiSUNDIHByb2ZpbGUiOworICAgIGNhc2UgQVZfRlJBTUVfREFUQV9RUF9UQUJMRV9QUk9QRVJUSUVTOiAgICAgICAgIHJldHVybiAiUVAgdGFibGUgcHJvcGVydGllcyI7CisgICAgY2FzZSBBVl9GUkFNRV9EQVRBX1FQX1RBQkxFX0RBVEE6ICAgICAgICAgICAgICAgcmV0dXJuICJRUCB0YWJsZSBkYXRhIjsKICAgICB9CiAgICAgcmV0dXJuIE5VTEw7CiB9CisKK3N0YXRpYyBpbnQgY2FsY19jcm9wcGluZ19vZmZzZXRzKHNpemVfdCBvZmZzZXRzWzRdLCBjb25zdCBBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYykKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGZyYW1lLT5kYXRhW2ldOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZDb21wb25lbnREZXNjcmlwdG9yICpjb21wID0gTlVMTDsKKyAgICAgICAgaW50IHNoaWZ0X3ggPSAoaSA9PSAxIHx8IGkgPT0gMikgPyBkZXNjLT5sb2cyX2Nocm9tYV93IDogMDsKKyAgICAgICAgaW50IHNoaWZ0X3kgPSAoaSA9PSAxIHx8IGkgPT0gMikgPyBkZXNjLT5sb2cyX2Nocm9tYV9oIDogMDsKKworICAgICAgICBpZiAoZGVzYy0+ZmxhZ3MgJiAoQVZfUElYX0ZNVF9GTEFHX1BBTCB8IEZGX1BTRVVET1BBTCkgJiYgaSA9PSAxKSB7CisgICAgICAgICAgICBvZmZzZXRzW2ldID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyogZmluZCBhbnkgY29tcG9uZW50IGRlc2NyaXB0b3IgZm9yIHRoaXMgcGxhbmUgKi8KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGRlc2MtPm5iX2NvbXBvbmVudHM7IGorKykgeworICAgICAgICAgICAgaWYgKGRlc2MtPmNvbXBbal0ucGxhbmUgPT0gaSkgeworICAgICAgICAgICAgICAgIGNvbXAgPSAmZGVzYy0+Y29tcFtqXTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvbXApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9CVUc7CisKKyAgICAgICAgb2Zmc2V0c1tpXSA9IChmcmFtZS0+Y3JvcF90b3AgID4+IHNoaWZ0X3kpICogZnJhbWUtPmxpbmVzaXplW2ldICsKKyAgICAgICAgICAgICAgICAgICAgIChmcmFtZS0+Y3JvcF9sZWZ0ID4+IHNoaWZ0X3gpICogY29tcC0+c3RlcDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGF2X2ZyYW1lX2FwcGx5X2Nyb3BwaW5nKEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIHNpemVfdCBvZmZzZXRzWzRdOworICAgIGludCBpOworCisgICAgaWYgKCEoZnJhbWUtPndpZHRoID4gMCAmJiBmcmFtZS0+aGVpZ2h0ID4gMCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBpZiAoZnJhbWUtPmNyb3BfbGVmdCA+PSBJTlRfTUFYIC0gZnJhbWUtPmNyb3BfcmlnaHQgICAgICAgIHx8CisgICAgICAgIGZyYW1lLT5jcm9wX3RvcCAgPj0gSU5UX01BWCAtIGZyYW1lLT5jcm9wX2JvdHRvbSAgICAgICB8fAorICAgICAgICAoZnJhbWUtPmNyb3BfbGVmdCArIGZyYW1lLT5jcm9wX3JpZ2h0KSA+PSBmcmFtZS0+d2lkdGggfHwKKyAgICAgICAgKGZyYW1lLT5jcm9wX3RvcCArIGZyYW1lLT5jcm9wX2JvdHRvbSkgPj0gZnJhbWUtPmhlaWdodCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRVJBTkdFKTsKKworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGZyYW1lLT5mb3JtYXQpOworICAgIGlmICghZGVzYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworCisgICAgLyogQXBwbHkganVzdCB0aGUgcmlnaHQvYm90dG9tIGNyb3BwaW5nIGZvciBod2FjY2VsIGZvcm1hdHMuIEJpdHN0cmVhbQorICAgICAqIGZvcm1hdHMgY2Fubm90IGJlIGVhc2lseSBoYW5kbGVkIGhlcmUgZWl0aGVyIChhbmQgY29ycmVzcG9uZGluZyBkZWNvZGVycworICAgICAqIHNob3VsZCBub3QgZXhwb3J0IGFueSBjcm9wcGluZyBhbnl3YXkpLCBzbyBkbyB0aGUgc2FtZSBmb3IgdGhvc2UgYXMgd2VsbC4KKyAgICAgKiAqLworICAgIGlmIChkZXNjLT5mbGFncyAmIChBVl9QSVhfRk1UX0ZMQUdfQklUU1RSRUFNIHwgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpKSB7CisgICAgICAgIGZyYW1lLT53aWR0aCAgICAgIC09IGZyYW1lLT5jcm9wX3JpZ2h0OworICAgICAgICBmcmFtZS0+aGVpZ2h0ICAgICAtPSBmcmFtZS0+Y3JvcF9ib3R0b207CisgICAgICAgIGZyYW1lLT5jcm9wX3JpZ2h0ICA9IDA7CisgICAgICAgIGZyYW1lLT5jcm9wX2JvdHRvbSA9IDA7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0cyBmb3IgZWFjaCBwbGFuZSAqLworICAgIGNhbGNfY3JvcHBpbmdfb2Zmc2V0cyhvZmZzZXRzLCBmcmFtZSwgZGVzYyk7CisKKyAgICAvKiBhZGp1c3QgdGhlIG9mZnNldHMgdG8gYXZvaWQgYnJlYWtpbmcgYWxpZ25tZW50ICovCisgICAgaWYgKCEoZmxhZ3MgJiBBVl9GUkFNRV9DUk9QX1VOQUxJR05FRCkpIHsKKyAgICAgICAgaW50IGxvZzJfY3JvcF9hbGlnbiA9IGZyYW1lLT5jcm9wX2xlZnQgPyBmZl9jdHooZnJhbWUtPmNyb3BfbGVmdCkgOiBJTlRfTUFYOworICAgICAgICBpbnQgbWluX2xvZzJfYWxpZ24gPSBJTlRfTUFYOworCisgICAgICAgIGZvciAoaSA9IDA7IGZyYW1lLT5kYXRhW2ldOyBpKyspIHsKKyAgICAgICAgICAgIGludCBsb2cyX2FsaWduID0gb2Zmc2V0c1tpXSA/IGZmX2N0eihvZmZzZXRzW2ldKSA6IElOVF9NQVg7CisgICAgICAgICAgICBtaW5fbG9nMl9hbGlnbiA9IEZGTUlOKGxvZzJfYWxpZ24sIG1pbl9sb2cyX2FsaWduKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHdlIGFzc3VtZSwgYW5kIGl0IHNob3VsZCBhbHdheXMgYmUgdHJ1ZSwgdGhhdCB0aGUgZGF0YSBhbGlnbm1lbnQgaXMKKyAgICAgICAgICogcmVsYXRlZCB0byB0aGUgY3JvcHBpbmcgYWxpZ25tZW50IGJ5IGEgY29uc3RhbnQgcG93ZXItb2YtMiBmYWN0b3IgKi8KKyAgICAgICAgaWYgKGxvZzJfY3JvcF9hbGlnbiA8IG1pbl9sb2cyX2FsaWduKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworCisgICAgICAgIGlmIChtaW5fbG9nMl9hbGlnbiA8IDUpIHsKKyAgICAgICAgICAgIGZyYW1lLT5jcm9wX2xlZnQgJj0gfigoMSA8PCAoNSArIGxvZzJfY3JvcF9hbGlnbiAtIG1pbl9sb2cyX2FsaWduKSkgLSAxKTsKKyAgICAgICAgICAgIGNhbGNfY3JvcHBpbmdfb2Zmc2V0cyhvZmZzZXRzLCBmcmFtZSwgZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBmcmFtZS0+ZGF0YVtpXTsgaSsrKQorICAgICAgICBmcmFtZS0+ZGF0YVtpXSArPSBvZmZzZXRzW2ldOworCisgICAgZnJhbWUtPndpZHRoICAgICAgLT0gKGZyYW1lLT5jcm9wX2xlZnQgKyBmcmFtZS0+Y3JvcF9yaWdodCk7CisgICAgZnJhbWUtPmhlaWdodCAgICAgLT0gKGZyYW1lLT5jcm9wX3RvcCAgKyBmcmFtZS0+Y3JvcF9ib3R0b20pOworICAgIGZyYW1lLT5jcm9wX2xlZnQgICA9IDA7CisgICAgZnJhbWUtPmNyb3BfcmlnaHQgID0gMDsKKyAgICBmcmFtZS0+Y3JvcF90b3AgICAgPSAwOworICAgIGZyYW1lLT5jcm9wX2JvdHRvbSA9IDA7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9mcmFtZS5oIGIvbGliYXZ1dGlsL2ZyYW1lLmgKaW5kZXggOGRjNDA0OS4uOWQ1N2Q2YyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2ZyYW1lLmgKKysrIGIvbGliYXZ1dGlsL2ZyYW1lLmgKQEAgLTEsNSArMSw0IEBACiAvKgotICoKICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KICAqCiAgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC0yNiw2ICsyNSw3IEBACiAjaWZuZGVmIEFWVVRJTF9GUkFNRV9ICiAjZGVmaW5lIEFWVVRJTF9GUkFNRV9ICiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgImF2dXRpbC5oIgpAQCAtMTIxLDcgKzEyMSw0MyBAQAogICAgICAqIFRoZSBHT1AgdGltZWNvZGUgaW4gMjUgYml0IHRpbWVjb2RlIGZvcm1hdC4gRGF0YSBmb3JtYXQgaXMgNjQtYml0IGludGVnZXIuCiAgICAgICogVGhpcyBpcyBzZXQgb24gdGhlIGZpcnN0IGZyYW1lIG9mIGEgR09QIHRoYXQgaGFzIGEgdGVtcG9yYWwgcmVmZXJlbmNlIG9mIDAuCiAgICAgICovCi0gICAgQVZfRlJBTUVfREFUQV9HT1BfVElNRUNPREUKKyAgICBBVl9GUkFNRV9EQVRBX0dPUF9USU1FQ09ERSwKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIHJlcHJlc2VudHMgdGhlIEFWU3BoZXJpY2FsTWFwcGluZyBzdHJ1Y3R1cmUgZGVmaW5lZCBpbgorICAgICAqIGxpYmF2dXRpbC9zcGhlcmljYWwuaC4KKyAgICAgKi8KKyAgICBBVl9GUkFNRV9EQVRBX1NQSEVSSUNBTCwKKworICAgIC8qKgorICAgICAqIENvbnRlbnQgbGlnaHQgbGV2ZWwgKGJhc2VkIG9uIENUQS04NjEuMykuIFRoaXMgcGF5bG9hZCBjb250YWlucyBkYXRhIGluCisgICAgICogdGhlIGZvcm0gb2YgdGhlIEFWQ29udGVudExpZ2h0TWV0YWRhdGEgc3RydWN0LgorICAgICAqLworICAgIEFWX0ZSQU1FX0RBVEFfQ09OVEVOVF9MSUdIVF9MRVZFTCwKKworICAgIC8qKgorICAgICAqIFRoZSBkYXRhIGNvbnRhaW5zIGFuIElDQyBwcm9maWxlIGFzIGFuIG9wYXF1ZSBvY3RldCBidWZmZXIgZm9sbG93aW5nIHRoZQorICAgICAqIGZvcm1hdCBkZXNjcmliZWQgYnkgSVNPIDE1MDc2LTEgd2l0aCBhbiBvcHRpb25hbCBuYW1lIGRlZmluZWQgaW4gdGhlCisgICAgICogbWV0YWRhdGEga2V5IGVudHJ5ICJuYW1lIi4KKyAgICAgKi8KKyAgICBBVl9GUkFNRV9EQVRBX0lDQ19QUk9GSUxFLAorCisjaWYgRkZfQVBJX0ZSQU1FX1FQCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24tc3BlY2lmaWMgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdCBvZiBBVl9GUkFNRV9RUF9UQUJMRV9EQVRBLgorICAgICAqIFRoZSBjb250ZW50cyBvZiB0aGlzIHNpZGUgZGF0YSBhcmUgdW5kb2N1bWVudGVkIGFuZCBpbnRlcm5hbDsgdXNlCisgICAgICogYXZfZnJhbWVfc2V0X3FwX3RhYmxlKCkgYW5kIGF2X2ZyYW1lX2dldF9xcF90YWJsZSgpIHRvIGFjY2VzcyB0aGlzIGluIGEKKyAgICAgKiBtZWFuaW5nZnVsIHdheSBpbnN0ZWFkLgorICAgICAqLworICAgIEFWX0ZSQU1FX0RBVEFfUVBfVEFCTEVfUFJPUEVSVElFUywKKworICAgIC8qKgorICAgICAqIFJhdyBRUCB0YWJsZSBkYXRhLiBJdHMgZm9ybWF0IGlzIGRlc2NyaWJlZCBieQorICAgICAqIEFWX0ZSQU1FX0RBVEFfUVBfVEFCTEVfUFJPUEVSVElFUy4gVXNlIGF2X2ZyYW1lX3NldF9xcF90YWJsZSgpIGFuZAorICAgICAqIGF2X2ZyYW1lX2dldF9xcF90YWJsZSgpIHRvIGFjY2VzcyB0aGlzIGluc3RlYWQuCisgICAgICovCisgICAgQVZfRlJBTUVfREFUQV9RUF9UQUJMRV9EQVRBLAorI2VuZGlmCiB9OwogCiBlbnVtIEFWQWN0aXZlRm9ybWF0RGVzY3JpcHRpb24gewpAQCAtMTc0LDkgKzIxMCwxMCBAQAogICoKICAqIHNpemVvZihBVkZyYW1lKSBpcyBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQUJJLCBzbyBuZXcgZmllbGRzIG1heSBiZSBhZGRlZAogICogdG8gdGhlIGVuZCB3aXRoIGEgbWlub3IgYnVtcC4KLSAqIFNpbWlsYXJseSBmaWVsZHMgdGhhdCBhcmUgbWFya2VkIGFzIHRvIGJlIG9ubHkgYWNjZXNzZWQgYnkKLSAqIGF2X29wdF9wdHIoKSBjYW4gYmUgcmVvcmRlcmVkLiBUaGlzIGFsbG93cyAyIGZvcmtzIHRvIGFkZCBmaWVsZHMKLSAqIHdpdGhvdXQgYnJlYWtpbmcgY29tcGF0aWJpbGl0eSB3aXRoIGVhY2ggb3RoZXIuCisgKgorICogRmllbGRzIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIEFWT3B0aW9ucywgdGhlIG5hbWUgc3RyaW5nIHVzZWQsIG1hdGNoZXMgdGhlCisgKiBDIHN0cnVjdHVyZSBmaWVsZCBuYW1lIGZvciBmaWVsZHMgYWNjZXNzaWJsZSB0aHJvdWdoIEFWT3B0aW9ucy4gVGhlIEFWQ2xhc3MKKyAqIGZvciBBVkZyYW1lIGNhbiBiZSBvYnRhaW5lZCBmcm9tIGF2Y29kZWNfZ2V0X2ZyYW1lX2NsYXNzKCkKICAqLwogdHlwZWRlZiBzdHJ1Y3QgQVZGcmFtZSB7CiAjZGVmaW5lIEFWX05VTV9EQVRBX1BPSU5URVJTIDgKQEAgLTE4OCw2ICsyMjUsOSBAQAogICAgICAqIHNlZSBhdmNvZGVjX2FsaWduX2RpbWVuc2lvbnMyKCkuIFNvbWUgZmlsdGVycyBhbmQgc3dzY2FsZSBjYW4gcmVhZAogICAgICAqIHVwIHRvIDE2IGJ5dGVzIGJleW9uZCB0aGUgcGxhbmVzLCBpZiB0aGVzZSBmaWx0ZXJzIGFyZSB0byBiZSB1c2VkLAogICAgICAqIHRoZW4gMTYgZXh0cmEgYnl0ZXMgbXVzdCBiZSBhbGxvY2F0ZWQuCisgICAgICoKKyAgICAgKiBOT1RFOiBFeGNlcHQgZm9yIGh3YWNjZWwgZm9ybWF0cywgcG9pbnRlcnMgbm90IG5lZWRlZCBieSB0aGUgZm9ybWF0CisgICAgICogTVVTVCBiZSBzZXQgdG8gTlVMTC4KICAgICAgKi8KICAgICB1aW50OF90ICpkYXRhW0FWX05VTV9EQVRBX1BPSU5URVJTXTsKIApAQCAtMjI1LDkgKzI2NSwxOCBAQAogICAgIHVpbnQ4X3QgKipleHRlbmRlZF9kYXRhOwogCiAgICAgLyoqCi0gICAgICogd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdmlkZW8gZnJhbWUKKyAgICAgKiBAbmFtZSBWaWRlbyBkaW1lbnNpb25zCisgICAgICogVmlkZW8gZnJhbWVzIG9ubHkuIFRoZSBjb2RlZCBkaW1lbnNpb25zIChpbiBwaXhlbHMpIG9mIHRoZSB2aWRlbyBmcmFtZSwKKyAgICAgKiBpLmUuIHRoZSBzaXplIG9mIHRoZSByZWN0YW5nbGUgdGhhdCBjb250YWlucyBzb21lIHdlbGwtZGVmaW5lZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAbm90ZSBUaGUgcGFydCBvZiB0aGUgZnJhbWUgaW50ZW5kZWQgZm9yIGRpc3BsYXkvcHJlc2VudGF0aW9uIGlzIGZ1cnRoZXIKKyAgICAgKiByZXN0cmljdGVkIGJ5IHRoZSBAcmVmIGNyb3BwaW5nICJDcm9wcGluZyByZWN0YW5nbGUiLgorICAgICAqIEB7CiAgICAgICovCiAgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgLyoqCisgICAgICogQH0KKyAgICAgKi8KIAogICAgIC8qKgogICAgICAqIG51bWJlciBvZiBhdWRpbyBzYW1wbGVzIChwZXIgY2hhbm5lbCkgZGVzY3JpYmVkIGJ5IHRoaXMgZnJhbWUKQEAgLTI2MSwxMCArMzEwLDE0IEBACiAgICAgICovCiAgICAgaW50NjRfdCBwdHM7CiAKKyNpZiBGRl9BUElfUEtUX1BUUwogICAgIC8qKgogICAgICAqIFBUUyBjb3BpZWQgZnJvbSB0aGUgQVZQYWNrZXQgdGhhdCB3YXMgZGVjb2RlZCB0byBwcm9kdWNlIHRoaXMgZnJhbWUuCisgICAgICogQGRlcHJlY2F0ZWQgdXNlIHRoZSBwdHMgZmllbGQgaW5zdGVhZAogICAgICAqLworICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCiAgICAgaW50NjRfdCBwa3RfcHRzOworI2VuZGlmCiAKICAgICAvKioKICAgICAgKiBEVFMgY29waWVkIGZyb20gdGhlIEFWUGFja2V0IHRoYXQgdHJpZ2dlcmVkIHJldHVybmluZyB0aGlzIGZyYW1lLiAoaWYgZnJhbWUgdGhyZWFkaW5nIGlzbid0IHVzZWQpCkBAIC0zMjIsNyArMzc1LDcgQEAKICAgICBpbnQgcGFsZXR0ZV9oYXNfY2hhbmdlZDsKIAogICAgIC8qKgotICAgICAqIHJlb3JkZXJlZCBvcGFxdWUgNjRiaXQgKGdlbmVyYWxseSBhbiBpbnRlZ2VyIG9yIGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdAorICAgICAqIHJlb3JkZXJlZCBvcGFxdWUgNjQgYml0cyAoZ2VuZXJhbGx5IGFuIGludGVnZXIgb3IgYSBkb3VibGUgcHJlY2lzaW9uIGZsb2F0CiAgICAgICogUFRTIGJ1dCBjYW4gYmUgYW55dGhpbmcpLgogICAgICAqIFRoZSB1c2VyIHNldHMgQVZDb2RlY0NvbnRleHQucmVvcmRlcmVkX29wYXF1ZSB0byByZXByZXNlbnQgdGhlIGlucHV0IGF0CiAgICAgICogdGhhdCB0aW1lLApAQCAtMzc5LDYgKzQzMiw3IEBACiAKIC8qKgogICogQGRlZmdyb3VwIGxhdnVfZnJhbWVfZmxhZ3MgQVZfRlJBTUVfRkxBR1MKKyAqIEBpbmdyb3VwIGxhdnVfZnJhbWUKICAqIEZsYWdzIGRlc2NyaWJpbmcgYWRkaXRpb25hbCBmcmFtZSBwcm9wZXJ0aWVzLgogICoKICAqIEB7CkBAIC0zODksNiArNDQzLDEwIEBACiAgKi8KICNkZWZpbmUgQVZfRlJBTUVfRkxBR19DT1JSVVBUICAgICAgICgxIDw8IDApCiAvKioKKyAqIEEgZmxhZyB0byBtYXJrIHRoZSBmcmFtZXMgd2hpY2ggbmVlZCB0byBiZSBkZWNvZGVkLCBidXQgc2hvdWxkbid0IGJlIG91dHB1dC4KKyAqLworI2RlZmluZSBBVl9GUkFNRV9GTEFHX0RJU0NBUkQgICAoMSA8PCAyKQorLyoqCiAgKiBAfQogICovCiAKQEAgLTM5OSw4ICs0NTcsNiBAQAogCiAgICAgLyoqCiAgICAgICogTVBFRyB2cyBKUEVHIFlVViByYW5nZS4KLSAgICAgKiBJdCBtdXN0IGJlIGFjY2Vzc2VkIHVzaW5nIGF2X2ZyYW1lX2dldF9jb2xvcl9yYW5nZSgpIGFuZAotICAgICAqIGF2X2ZyYW1lX3NldF9jb2xvcl9yYW5nZSgpLgogICAgICAqIC0gZW5jb2Rpbmc6IFNldCBieSB1c2VyCiAgICAgICogLSBkZWNvZGluZzogU2V0IGJ5IGxpYmF2Y29kZWMKICAgICAgKi8KQEAgLTQxMiw4ICs0NjgsNiBAQAogCiAgICAgLyoqCiAgICAgICogWVVWIGNvbG9yc3BhY2UgdHlwZS4KLSAgICAgKiBJdCBtdXN0IGJlIGFjY2Vzc2VkIHVzaW5nIGF2X2ZyYW1lX2dldF9jb2xvcnNwYWNlKCkgYW5kCi0gICAgICogYXZfZnJhbWVfc2V0X2NvbG9yc3BhY2UoKS4KICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlcgogICAgICAqIC0gZGVjb2Rpbmc6IFNldCBieSBsaWJhdmNvZGVjCiAgICAgICovCkBAIC00MjMsOCArNDc3LDYgQEAKIAogICAgIC8qKgogICAgICAqIGZyYW1lIHRpbWVzdGFtcCBlc3RpbWF0ZWQgdXNpbmcgdmFyaW91cyBoZXVyaXN0aWNzLCBpbiBzdHJlYW0gdGltZSBiYXNlCi0gICAgICogQ29kZSBvdXRzaWRlIGxpYmF2dXRpbCBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6Ci0gICAgICogYXZfZnJhbWVfZ2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChmcmFtZSkKICAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKICAgICAgKiAtIGRlY29kaW5nOiBzZXQgYnkgbGliYXZjb2RlYywgcmVhZCBieSB1c2VyLgogICAgICAqLwpAQCAtNDMyLDggKzQ4NCw2IEBACiAKICAgICAvKioKICAgICAgKiByZW9yZGVyZWQgcG9zIGZyb20gdGhlIGxhc3QgQVZQYWNrZXQgdGhhdCBoYXMgYmVlbiBpbnB1dCBpbnRvIHRoZSBkZWNvZGVyCi0gICAgICogQ29kZSBvdXRzaWRlIGxpYmF2dXRpbCBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6Ci0gICAgICogYXZfZnJhbWVfZ2V0X3BrdF9wb3MoZnJhbWUpCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCiAgICAgICogLSBkZWNvZGluZzogUmVhZCBieSB1c2VyLgogICAgICAqLwpAQCAtNDQyLDggKzQ5Miw2IEBACiAgICAgLyoqCiAgICAgICogZHVyYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFja2V0LCBleHByZXNzZWQgaW4KICAgICAgKiBBVlN0cmVhbS0+dGltZV9iYXNlIHVuaXRzLCAwIGlmIHVua25vd24uCi0gICAgICogQ29kZSBvdXRzaWRlIGxpYmF2dXRpbCBzaG91bGQgYWNjZXNzIHRoaXMgZmllbGQgdXNpbmc6Ci0gICAgICogYXZfZnJhbWVfZ2V0X3BrdF9kdXJhdGlvbihmcmFtZSkKICAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKICAgICAgKiAtIGRlY29kaW5nOiBSZWFkIGJ5IHVzZXIuCiAgICAgICovCkBAIC00NTEsOCArNDk5LDYgQEAKIAogICAgIC8qKgogICAgICAqIG1ldGFkYXRhLgotICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdnV0aWwgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nOgotICAgICAqIGF2X2ZyYW1lX2dldF9tZXRhZGF0YShmcmFtZSkKICAgICAgKiAtIGVuY29kaW5nOiBTZXQgYnkgdXNlci4KICAgICAgKiAtIGRlY29kaW5nOiBTZXQgYnkgbGliYXZjb2RlYy4KICAgICAgKi8KQEAgLTQ2Miw4ICs1MDgsNiBAQAogICAgICAqIGRlY29kZSBlcnJvciBmbGFncyBvZiB0aGUgZnJhbWUsIHNldCB0byBhIGNvbWJpbmF0aW9uIG9mCiAgICAgICogRkZfREVDT0RFX0VSUk9SX3h4eCBmbGFncyBpZiB0aGUgZGVjb2RlciBwcm9kdWNlZCBhIGZyYW1lLCBidXQgdGhlcmUKICAgICAgKiB3ZXJlIGVycm9ycyBkdXJpbmcgdGhlIGRlY29kaW5nLgotICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdnV0aWwgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nOgotICAgICAqIGF2X2ZyYW1lX2dldF9kZWNvZGVfZXJyb3JfZmxhZ3MoZnJhbWUpCiAgICAgICogLSBlbmNvZGluZzogdW51c2VkCiAgICAgICogLSBkZWNvZGluZzogc2V0IGJ5IGxpYmF2Y29kZWMsIHJlYWQgYnkgdXNlci4KICAgICAgKi8KQEAgLTQ3Myw4ICs1MTcsNiBAQAogCiAgICAgLyoqCiAgICAgICogbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzLCBvbmx5IHVzZWQgZm9yIGF1ZGlvLgotICAgICAqIENvZGUgb3V0c2lkZSBsaWJhdnV0aWwgc2hvdWxkIGFjY2VzcyB0aGlzIGZpZWxkIHVzaW5nOgotICAgICAqIGF2X2ZyYW1lX2dldF9jaGFubmVscyhmcmFtZSkKICAgICAgKiAtIGVuY29kaW5nOiB1bnVzZWQKICAgICAgKiAtIGRlY29kaW5nOiBSZWFkIGJ5IHVzZXIuCiAgICAgICovCkBAIC00ODIsOCArNTI0LDcgQEAKIAogICAgIC8qKgogICAgICAqIHNpemUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcGFja2V0IGNvbnRhaW5pbmcgdGhlIGNvbXByZXNzZWQKLSAgICAgKiBmcmFtZS4gSXQgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZyBhdl9mcmFtZV9nZXRfcGt0X3NpemUoKSBhbmQKLSAgICAgKiBhdl9mcmFtZV9zZXRfcGt0X3NpemUoKS4KKyAgICAgKiBmcmFtZS4KICAgICAgKiBJdCBpcyBzZXQgdG8gYSBuZWdhdGl2ZSB2YWx1ZSBpZiB1bmtub3duLgogICAgICAqIC0gZW5jb2Rpbmc6IHVudXNlZAogICAgICAqIC0gZGVjb2Rpbmc6IHNldCBieSBsaWJhdmNvZGVjLCByZWFkIGJ5IHVzZXIuCkBAIC00OTMsMTMgKzUzNCwxMSBAQAogI2lmIEZGX0FQSV9GUkFNRV9RUAogICAgIC8qKgogICAgICAqIFFQIHRhYmxlCi0gICAgICogTm90IHRvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gb3V0c2lkZSBsaWJhdnV0aWwKICAgICAgKi8KICAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAogICAgIGludDhfdCAqcXNjYWxlX3RhYmxlOwogICAgIC8qKgogICAgICAqIFFQIHN0b3JlIHN0cmlkZQotICAgICAqIE5vdCB0byBiZSBhY2Nlc3NlZCBkaXJlY3RseSBmcm9tIG91dHNpZGUgbGliYXZ1dGlsCiAgICAgICovCiAgICAgYXR0cmlidXRlX2RlcHJlY2F0ZWQKICAgICBpbnQgcXN0cmlkZTsKQEAgLTUwNyw0NSArNTQ2LDExMiBAQAogICAgIGF0dHJpYnV0ZV9kZXByZWNhdGVkCiAgICAgaW50IHFzY2FsZV90eXBlOwogCi0gICAgLyoqCi0gICAgICogTm90IHRvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gb3V0c2lkZSBsaWJhdnV0aWwKLSAgICAgKi8KKyAgICBhdHRyaWJ1dGVfZGVwcmVjYXRlZAogICAgIEFWQnVmZmVyUmVmICpxcF90YWJsZV9idWY7CiAjZW5kaWYKKyAgICAvKioKKyAgICAgKiBGb3IgaHdhY2NlbC1mb3JtYXQgZnJhbWVzLCB0aGlzIHNob3VsZCBiZSBhIHJlZmVyZW5jZSB0byB0aGUKKyAgICAgKiBBVkhXRnJhbWVzQ29udGV4dCBkZXNjcmliaW5nIHRoZSBmcmFtZS4KKyAgICAgKi8KKyAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eDsKKworICAgIC8qKgorICAgICAqIEFWQnVmZmVyUmVmIGZvciBmcmVlIHVzZSBieSB0aGUgQVBJIHVzZXIuIEZGbXBlZyB3aWxsIG5ldmVyIGNoZWNrIHRoZQorICAgICAqIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgcmVmLiBGRm1wZWcgY2FsbHMgYXZfYnVmZmVyX3VucmVmKCkgb24gaXQgd2hlbgorICAgICAqIHRoZSBmcmFtZSBpcyB1bnJlZmVyZW5jZWQuIGF2X2ZyYW1lX2NvcHlfcHJvcHMoKSBjYWxscyBjcmVhdGUgYSBuZXcKKyAgICAgKiByZWZlcmVuY2Ugd2l0aCBhdl9idWZmZXJfcmVmKCkgZm9yIHRoZSB0YXJnZXQgZnJhbWUncyBvcGFxdWVfcmVmIGZpZWxkLgorICAgICAqCisgICAgICogVGhpcyBpcyB1bnJlbGF0ZWQgdG8gdGhlIG9wYXF1ZSBmaWVsZCwgYWx0aG91Z2ggaXQgc2VydmVzIGEgc2ltaWxhcgorICAgICAqIHB1cnBvc2UuCisgICAgICovCisgICAgQVZCdWZmZXJSZWYgKm9wYXF1ZV9yZWY7CisKKyAgICAvKioKKyAgICAgKiBAYW5jaG9yIGNyb3BwaW5nCisgICAgICogQG5hbWUgQ3JvcHBpbmcKKyAgICAgKiBWaWRlbyBmcmFtZXMgb25seS4gVGhlIG51bWJlciBvZiBwaXhlbHMgdG8gZGlzY2FyZCBmcm9tIHRoZSB0aGUKKyAgICAgKiB0b3AvYm90dG9tL2xlZnQvcmlnaHQgYm9yZGVyIG9mIHRoZSBmcmFtZSB0byBvYnRhaW4gdGhlIHN1Yi1yZWN0YW5nbGUgb2YKKyAgICAgKiB0aGUgZnJhbWUgaW50ZW5kZWQgZm9yIHByZXNlbnRhdGlvbi4KKyAgICAgKiBAeworICAgICAqLworICAgIHNpemVfdCBjcm9wX3RvcDsKKyAgICBzaXplX3QgY3JvcF9ib3R0b207CisgICAgc2l6ZV90IGNyb3BfbGVmdDsKKyAgICBzaXplX3QgY3JvcF9yaWdodDsKKyAgICAvKioKKyAgICAgKiBAfQorICAgICAqLworCisgICAgLyoqCisgICAgICogQVZCdWZmZXJSZWYgZm9yIGludGVybmFsIHVzZSBieSBhIHNpbmdsZSBsaWJhdiogbGlicmFyeS4KKyAgICAgKiBNdXN0IG5vdCBiZSB1c2VkIHRvIHRyYW5zZmVyIGRhdGEgYmV0d2VlbiBsaWJyYXJpZXMuCisgICAgICogSGFzIHRvIGJlIE5VTEwgd2hlbiBvd25lcnNoaXAgb2YgdGhlIGZyYW1lIGxlYXZlcyB0aGUgcmVzcGVjdGl2ZSBsaWJyYXJ5LgorICAgICAqCisgICAgICogQ29kZSBvdXRzaWRlIHRoZSBGRm1wZWcgbGlicyBzaG91bGQgbmV2ZXIgY2hlY2sgb3IgY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHJlZi4KKyAgICAgKgorICAgICAqIEZGbXBlZyBjYWxscyBhdl9idWZmZXJfdW5yZWYoKSBvbiBpdCB3aGVuIHRoZSBmcmFtZSBpcyB1bnJlZmVyZW5jZWQuCisgICAgICogYXZfZnJhbWVfY29weV9wcm9wcygpIGNhbGxzIGNyZWF0ZSBhIG5ldyByZWZlcmVuY2Ugd2l0aCBhdl9idWZmZXJfcmVmKCkKKyAgICAgKiBmb3IgdGhlIHRhcmdldCBmcmFtZSdzIHByaXZhdGVfcmVmIGZpZWxkLgorICAgICAqLworICAgIEFWQnVmZmVyUmVmICpwcml2YXRlX3JlZjsKIH0gQVZGcmFtZTsKIAorI2lmIEZGX0FQSV9GUkFNRV9HRVRfU0VUCiAvKioKLSAqIEFjY2Vzc29ycyBmb3Igc29tZSBBVkZyYW1lIGZpZWxkcy4KLSAqIFRoZSBwb3NpdGlvbiBvZiB0aGVzZSBmaWVsZCBpbiB0aGUgc3RydWN0dXJlIGlzIG5vdCBwYXJ0IG9mIHRoZSBBQkksCi0gKiB0aGV5IHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkgb3V0c2lkZSBsaWJhdnV0aWwuCisgKiBBY2Nlc3NvcnMgZm9yIHNvbWUgQVZGcmFtZSBmaWVsZHMuIFRoZXNlIHVzZWQgdG8gYmUgcHJvdmlkZWQgZm9yIEFCSQorICogY29tcGF0aWJpbGl0eSwgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIHVzZWQgYW55bW9yZS4KICAqLworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludDY0X3QgYXZfZnJhbWVfZ2V0X2Jlc3RfZWZmb3J0X3RpbWVzdGFtcChjb25zdCBBVkZyYW1lICpmcmFtZSk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICBhdl9mcmFtZV9zZXRfYmVzdF9lZmZvcnRfdGltZXN0YW1wKEFWRnJhbWUgKmZyYW1lLCBpbnQ2NF90IHZhbCk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50NjRfdCBhdl9mcmFtZV9nZXRfcGt0X2R1cmF0aW9uICAgICAgICAgKGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiB2b2lkICAgIGF2X2ZyYW1lX3NldF9wa3RfZHVyYXRpb24gICAgICAgICAoQVZGcmFtZSAqZnJhbWUsIGludDY0X3QgdmFsKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQ2NF90IGF2X2ZyYW1lX2dldF9wa3RfcG9zICAgICAgICAgICAgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgICAgYXZfZnJhbWVfc2V0X3BrdF9wb3MgICAgICAgICAgICAgIChBVkZyYW1lICpmcmFtZSwgaW50NjRfdCB2YWwpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludDY0X3QgYXZfZnJhbWVfZ2V0X2NoYW5uZWxfbGF5b3V0ICAgICAgIChjb25zdCBBVkZyYW1lICpmcmFtZSk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICBhdl9mcmFtZV9zZXRfY2hhbm5lbF9sYXlvdXQgICAgICAgKEFWRnJhbWUgKmZyYW1lLCBpbnQ2NF90IHZhbCk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50ICAgICBhdl9mcmFtZV9nZXRfY2hhbm5lbHMgICAgICAgICAgICAgKGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiB2b2lkICAgIGF2X2ZyYW1lX3NldF9jaGFubmVscyAgICAgICAgICAgICAoQVZGcmFtZSAqZnJhbWUsIGludCAgICAgdmFsKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgICAgIGF2X2ZyYW1lX2dldF9zYW1wbGVfcmF0ZSAgICAgICAgICAoY29uc3QgQVZGcmFtZSAqZnJhbWUpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgICAgYXZfZnJhbWVfc2V0X3NhbXBsZV9yYXRlICAgICAgICAgIChBVkZyYW1lICpmcmFtZSwgaW50ICAgICB2YWwpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIEFWRGljdGlvbmFyeSAqYXZfZnJhbWVfZ2V0X21ldGFkYXRhICAgICAgIChjb25zdCBBVkZyYW1lICpmcmFtZSk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICAgICAgICBhdl9mcmFtZV9zZXRfbWV0YWRhdGEgICAgICAgKEFWRnJhbWUgKmZyYW1lLCBBVkRpY3Rpb25hcnkgKnZhbCk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogaW50ICAgICBhdl9mcmFtZV9nZXRfZGVjb2RlX2Vycm9yX2ZsYWdzICAgKGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiB2b2lkICAgIGF2X2ZyYW1lX3NldF9kZWNvZGVfZXJyb3JfZmxhZ3MgICAoQVZGcmFtZSAqZnJhbWUsIGludCAgICAgdmFsKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiBpbnQgICAgIGF2X2ZyYW1lX2dldF9wa3Rfc2l6ZShjb25zdCBBVkZyYW1lICpmcmFtZSk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogdm9pZCAgICBhdl9mcmFtZV9zZXRfcGt0X3NpemUoQVZGcmFtZSAqZnJhbWUsIGludCB2YWwpOwotQVZEaWN0aW9uYXJ5ICoqYXZwcml2X2ZyYW1lX2dldF9tZXRhZGF0YXAoQVZGcmFtZSAqZnJhbWUpOwogI2lmIEZGX0FQSV9GUkFNRV9RUAorYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludDhfdCAqYXZfZnJhbWVfZ2V0X3FwX3RhYmxlKEFWRnJhbWUgKmYsIGludCAqc3RyaWRlLCBpbnQgKnR5cGUpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIGludCBhdl9mcmFtZV9zZXRfcXBfdGFibGUoQVZGcmFtZSAqZiwgQVZCdWZmZXJSZWYgKmJ1ZiwgaW50IHN0cmlkZSwgaW50IHR5cGUpOwogI2VuZGlmCithdHRyaWJ1dGVfZGVwcmVjYXRlZAogZW51bSBBVkNvbG9yU3BhY2UgYXZfZnJhbWVfZ2V0X2NvbG9yc3BhY2UoY29uc3QgQVZGcmFtZSAqZnJhbWUpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQKIHZvaWQgICAgYXZfZnJhbWVfc2V0X2NvbG9yc3BhY2UoQVZGcmFtZSAqZnJhbWUsIGVudW0gQVZDb2xvclNwYWNlIHZhbCk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZAogZW51bSBBVkNvbG9yUmFuZ2UgYXZfZnJhbWVfZ2V0X2NvbG9yX3JhbmdlKGNvbnN0IEFWRnJhbWUgKmZyYW1lKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkCiB2b2lkICAgIGF2X2ZyYW1lX3NldF9jb2xvcl9yYW5nZShBVkZyYW1lICpmcmFtZSwgZW51bSBBVkNvbG9yUmFuZ2UgdmFsKTsKKyNlbmRpZgogCiAvKioKICAqIEdldCB0aGUgbmFtZSBvZiBhIGNvbG9yc3BhY2UuCkBAIC01ODMsNiArNjg5LDEwIEBACiAgKiBJZiBzcmMgaXMgbm90IHJlZmVyZW5jZSBjb3VudGVkLCBuZXcgYnVmZmVycyBhcmUgYWxsb2NhdGVkIGFuZCB0aGUgZGF0YSBpcwogICogY29waWVkLgogICoKKyAqIEB3YXJuaW5nOiBkc3QgTVVTVCBoYXZlIGJlZW4gZWl0aGVyIHVucmVmZXJlbmNlZCB3aXRoIGF2X2ZyYW1lX3VucmVmKGRzdCksCisgKiAgICAgICAgICAgb3IgbmV3bHkgYWxsb2NhdGVkIHdpdGggYXZfZnJhbWVfYWxsb2MoKSBiZWZvcmUgY2FsbGluZyB0aGlzCisgKiAgICAgICAgICAgZnVuY3Rpb24sIG9yIHVuZGVmaW5lZCBiZWhhdmlvciB3aWxsIG9jY3VyLgorICoKICAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IKICAqLwogaW50IGF2X2ZyYW1lX3JlZihBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYyk7CkBAIC02MDMsNiArNzEzLDEwIEBACiAKIC8qKgogICogTW92ZSBldmVyeXRoaW5nIGNvbnRhaW5lZCBpbiBzcmMgdG8gZHN0IGFuZCByZXNldCBzcmMuCisgKgorICogQHdhcm5pbmc6IGRzdCBpcyBub3QgdW5yZWZlcmVuY2VkLCBidXQgZGlyZWN0bHkgb3ZlcndyaXR0ZW4gd2l0aG91dCByZWFkaW5nCisgKiAgICAgICAgICAgb3IgZGVhbGxvY2F0aW5nIGl0cyBjb250ZW50cy4gQ2FsbCBhdl9mcmFtZV91bnJlZihkc3QpIG1hbnVhbGx5CisgKiAgICAgICAgICAgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0byBlbnN1cmUgdGhhdCBubyBtZW1vcnkgaXMgbGVha2VkLgogICovCiB2b2lkIGF2X2ZyYW1lX21vdmVfcmVmKEFWRnJhbWUgKmRzdCwgQVZGcmFtZSAqc3JjKTsKIApAQCAtNjE4LDggKzczMiwxNCBAQAogICogbmVjZXNzYXJ5LCBhbGxvY2F0ZSBhbmQgZmlsbCBBVkZyYW1lLmV4dGVuZGVkX2RhdGEgYW5kIEFWRnJhbWUuZXh0ZW5kZWRfYnVmLgogICogRm9yIHBsYW5hciBmb3JtYXRzLCBvbmUgYnVmZmVyIHdpbGwgYmUgYWxsb2NhdGVkIGZvciBlYWNoIHBsYW5lLgogICoKKyAqIEB3YXJuaW5nOiBpZiBmcmFtZSBhbHJlYWR5IGhhcyBiZWVuIGFsbG9jYXRlZCwgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpbGwKKyAqICAgICAgICAgICBsZWFrIG1lbW9yeS4gSW4gYWRkaXRpb24sIHVuZGVmaW5lZCBiZWhhdmlvciBjYW4gb2NjdXIgaW4gY2VydGFpbgorICogICAgICAgICAgIGNhc2VzLgorICoKICAqIEBwYXJhbSBmcmFtZSBmcmFtZSBpbiB3aGljaCB0byBzdG9yZSB0aGUgbmV3IGJ1ZmZlcnMuCi0gKiBAcGFyYW0gYWxpZ24gcmVxdWlyZWQgYnVmZmVyIHNpemUgYWxpZ25tZW50CisgKiBAcGFyYW0gYWxpZ24gUmVxdWlyZWQgYnVmZmVyIHNpemUgYWxpZ25tZW50LiBJZiBlcXVhbCB0byAwLCBhbGlnbm1lbnQgd2lsbCBiZQorICogICAgICAgICAgICAgIGNob3NlbiBhdXRvbWF0aWNhbGx5IGZvciB0aGUgY3VycmVudCBDUFUuIEl0IGlzIGhpZ2hseQorICogICAgICAgICAgICAgIHJlY29tbWVuZGVkIHRvIHBhc3MgMCBoZXJlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAgKgogICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBvbiBlcnJvci4KICAqLwpAQCAtNjk5LDYgKzgxOSwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKIAogLyoqCisgKiBBZGQgYSBuZXcgc2lkZSBkYXRhIHRvIGEgZnJhbWUgZnJvbSBhbiBleGlzdGluZyBBVkJ1ZmZlclJlZgorICoKKyAqIEBwYXJhbSBmcmFtZSBhIGZyYW1lIHRvIHdoaWNoIHRoZSBzaWRlIGRhdGEgc2hvdWxkIGJlIGFkZGVkCisgKiBAcGFyYW0gdHlwZSAgdGhlIHR5cGUgb2YgdGhlIGFkZGVkIHNpZGUgZGF0YQorICogQHBhcmFtIGJ1ZiAgIGFuIEFWQnVmZmVyUmVmIHRvIGFkZCBhcyBzaWRlIGRhdGEuIFRoZSBvd25lcnNoaXAgb2YKKyAqICAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlIGlzIHRyYW5zZmVycmVkIHRvIHRoZSBmcmFtZS4KKyAqCisgKiBAcmV0dXJuIG5ld2x5IGFkZGVkIHNpZGUgZGF0YSBvbiBzdWNjZXNzLCBOVUxMIG9uIGVycm9yLiBPbiBmYWlsdXJlCisgKiAgICAgICAgIHRoZSBmcmFtZSBpcyB1bmNoYW5nZWQgYW5kIHRoZSBBVkJ1ZmZlclJlZiByZW1haW5zIG93bmVkIGJ5CisgKiAgICAgICAgIHRoZSBjYWxsZXIuCisgKi8KK0FWRnJhbWVTaWRlRGF0YSAqYXZfZnJhbWVfbmV3X3NpZGVfZGF0YV9mcm9tX2J1ZihBVkZyYW1lICpmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWRnJhbWVTaWRlRGF0YVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqYnVmKTsKKworLyoqCiAgKiBAcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgc2lkZSBkYXRhIG9mIGEgZ2l2ZW4gdHlwZSBvbiBzdWNjZXNzLCBOVUxMIGlmIHRoZXJlCiAgKiBpcyBubyBzaWRlIGRhdGEgd2l0aCBzdWNoIHR5cGUgaW4gdGhpcyBmcmFtZS4KICAqLwpAQCAtNzExLDYgKzg0Nyw0MCBAQAogICovCiB2b2lkIGF2X2ZyYW1lX3JlbW92ZV9zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUsIGVudW0gQVZGcmFtZVNpZGVEYXRhVHlwZSB0eXBlKTsKIAorCisvKioKKyAqIEZsYWdzIGZvciBmcmFtZSBjcm9wcGluZy4KKyAqLworZW51bSB7CisgICAgLyoqCisgICAgICogQXBwbHkgdGhlIG1heGltdW0gcG9zc2libGUgY3JvcHBpbmcsIGV2ZW4gaWYgaXQgcmVxdWlyZXMgc2V0dGluZyB0aGUKKyAgICAgKiBBVkZyYW1lLmRhdGFbXSBlbnRyaWVzIHRvIHVuYWxpZ25lZCBwb2ludGVycy4gUGFzc2luZyB1bmFsaWduZWQgZGF0YQorICAgICAqIHRvIEZGbXBlZyBBUEkgaXMgZ2VuZXJhbGx5IG5vdCBhbGxvd2VkLCBhbmQgY2F1c2VzIHVuZGVmaW5lZCBiZWhhdmlvcgorICAgICAqIChzdWNoIGFzIGNyYXNoZXMpLiBZb3UgY2FuIHBhc3MgdW5hbGlnbmVkIGRhdGEgb25seSB0byBGRm1wZWcgQVBJcyB0aGF0CisgICAgICogYXJlIGV4cGxpY2l0bHkgZG9jdW1lbnRlZCB0byBhY2NlcHQgaXQuIFVzZSB0aGlzIGZsYWcgb25seSBpZiB5b3UKKyAgICAgKiBhYnNvbHV0ZWx5IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorICAgICAqLworICAgIEFWX0ZSQU1FX0NST1BfVU5BTElHTkVEICAgICA9IDEgPDwgMCwKK307CisKKy8qKgorICogQ3JvcCB0aGUgZ2l2ZW4gdmlkZW8gQVZGcmFtZSBhY2NvcmRpbmcgdG8gaXRzIGNyb3BfbGVmdC9jcm9wX3RvcC9jcm9wX3JpZ2h0LworICogY3JvcF9ib3R0b20gZmllbGRzLiBJZiBjcm9wcGluZyBpcyBzdWNjZXNzZnVsLCB0aGUgZnVuY3Rpb24gd2lsbCBhZGp1c3QgdGhlCisgKiBkYXRhIHBvaW50ZXJzIGFuZCB0aGUgd2lkdGgvaGVpZ2h0IGZpZWxkcywgYW5kIHNldCB0aGUgY3JvcCBmaWVsZHMgdG8gMC4KKyAqCisgKiBJbiBhbGwgY2FzZXMsIHRoZSBjcm9wcGluZyBib3VuZGFyaWVzIHdpbGwgYmUgcm91bmRlZCB0byB0aGUgaW5oZXJlbnQKKyAqIGFsaWdubWVudCBvZiB0aGUgcGl4ZWwgZm9ybWF0LiBJbiBzb21lIGNhc2VzLCBzdWNoIGFzIGZvciBvcGFxdWUgaHdhY2NlbAorICogZm9ybWF0cywgdGhlIGxlZnQvdG9wIGNyb3BwaW5nIGlzIGlnbm9yZWQuIFRoZSBjcm9wIGZpZWxkcyBhcmUgc2V0IHRvIDAgZXZlbgorICogaWYgdGhlIGNyb3BwaW5nIHdhcyByb3VuZGVkIG9yIGlnbm9yZWQuCisgKgorICogQHBhcmFtIGZyYW1lIHRoZSBmcmFtZSB3aGljaCBzaG91bGQgYmUgY3JvcHBlZAorICogQHBhcmFtIGZsYWdzIFNvbWUgY29tYmluYXRpb24gb2YgQVZfRlJBTUVfQ1JPUF8qIGZsYWdzLCBvciAwLgorICoKKyAqIEByZXR1cm4gPj0gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1Igb24gZXJyb3IuIElmIHRoZSBjcm9wcGluZyBmaWVsZHMKKyAqIHdlcmUgaW52YWxpZCwgQVZFUlJPUihFUkFOR0UpIGlzIHJldHVybmVkLCBhbmQgbm90aGluZyBpcyBjaGFuZ2VkLgorICovCitpbnQgYXZfZnJhbWVfYXBwbHlfY3JvcHBpbmcoQVZGcmFtZSAqZnJhbWUsIGludCBmbGFncyk7CisKIC8qKgogICogQHJldHVybiBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgc2lkZSBkYXRhIHR5cGUKICAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2hhc2guYyBiL2xpYmF2dXRpbC9oYXNoLmMKaW5kZXggNzAzN2IwZC4uNzVlZGI2ZCAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2hhc2guYworKysgYi9saWJhdnV0aWwvaGFzaC5jCkBAIC0xNTUsNyArMTU1LDExIEBACiAgICAgfQogfQogCisjaWYgRkZfQVBJX0NSWVBUT19TSVpFX1QKIHZvaWQgYXZfaGFzaF91cGRhdGUoQVZIYXNoQ29udGV4dCAqY3R4LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4pCisjZWxzZQordm9pZCBhdl9oYXNoX3VwZGF0ZShBVkhhc2hDb250ZXh0ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IGxlbikKKyNlbmRpZgogewogICAgIHN3aXRjaCAoY3R4LT50eXBlKSB7CiAgICAgY2FzZSBNRDU6ICAgICBhdl9tZDVfdXBkYXRlKGN0eC0+Y3R4LCBzcmMsIGxlbik7IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2hhc2guaCBiL2xpYmF2dXRpbC9oYXNoLmgKaW5kZXggZDRiY2JmOC4uNzY5M2U2YiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2hhc2guaAorKysgYi9saWJhdnV0aWwvaGFzaC5oCkBAIC0xOCwxOCArMTgsMTEwIEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2dV9oYXNoX2dlbmVyaWMKKyAqIEdlbmVyaWMgaGFzaGluZyBBUEkKKyAqLworCiAjaWZuZGVmIEFWVVRJTF9IQVNIX0gKICNkZWZpbmUgQVZVVElMX0hBU0hfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKgorICogQGRlZmdyb3VwIGxhdnVfaGFzaCBIYXNoIEZ1bmN0aW9ucworICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEhhc2ggZnVuY3Rpb25zIHVzZWZ1bCBpbiBtdWx0aW1lZGlhLgorICoKKyAqIEhhc2ggZnVuY3Rpb25zIGFyZSB3aWRlbHkgdXNlZCBpbiBtdWx0aW1lZGlhLCBmcm9tIGVycm9yIGNoZWNraW5nIGFuZAorICogY29uY2VhbG1lbnQgdG8gaW50ZXJuYWwgcmVncmVzc2lvbiB0ZXN0aW5nLiBsaWJhdnV0aWwgaGFzIGVmZmljaWVudAorICogaW1wbGVtZW50YXRpb25zIG9mIGEgdmFyaWV0eSBvZiBoYXNoIGZ1bmN0aW9ucyB0aGF0IG1heSBiZSB1c2VmdWwgZm9yCisgKiBGRm1wZWcgYW5kIG90aGVyIG11bHRpbWVkaWEgYXBwbGljYXRpb25zLgorICoKKyAqIEB7CisgKgorICogQGRlZmdyb3VwIGxhdnVfaGFzaF9nZW5lcmljIEdlbmVyaWMgSGFzaGluZyBBUEkKKyAqIEFuIGFic3RyYWN0aW9uIGxheWVyIGZvciBhbGwgaGFzaCBmdW5jdGlvbnMgc3VwcG9ydGVkIGJ5IGxpYmF2dXRpbC4KKyAqCisgKiBJZiB5b3VyIGFwcGxpY2F0aW9uIG5lZWRzIHRvIHN1cHBvcnQgYSB3aWRlIHJhbmdlIG9mIGRpZmZlcmVudCBoYXNoCisgKiBmdW5jdGlvbnMsIHRoZW4gdGhlIEdlbmVyaWMgSGFzaGluZyBBUEkgaXMgZm9yIHlvdS4gSXQgcHJvdmlkZXMgYSBnZW5lcmljLAorICogcmV1c2FibGUgQVBJIGZvciBAcmVmIGxhdnVfaGFzaCAiYWxsIGhhc2ggZnVuY3Rpb25zIiBpbXBsZW1lbnRlZCBpbiBsaWJhdnV0aWwuCisgKiBJZiB5b3UganVzdCBuZWVkIHRvIHVzZSBvbmUgcGFydGljdWxhciBoYXNoIGZ1bmN0aW9uLCB1c2UgdGhlIEByZWYgbGF2dV9oYXNoCisgKiAiaW5kaXZpZHVhbCBoYXNoIiBkaXJlY3RseS4KKyAqCisgKiBAc2VjdGlvbiBTYW1wbGUgQ29kZQorICoKKyAqIEEgYmFzaWMgdGVtcGxhdGUgZm9yIHVzaW5nIHRoZSBHZW5lcmljIEhhc2hpbmcgQVBJIGZvbGxvd3M6CisgKgorICogQGNvZGUKKyAqIHN0cnVjdCBBVkhhc2hDb250ZXh0ICpjdHggPSBOVUxMOworICogY29uc3QgY2hhciAqaGFzaF9uYW1lID0gTlVMTDsKKyAqIHVpbnQ4X3QgKm91dHB1dF9idWYgPSBOVUxMOworICoKKyAqIC8vIFNlbGVjdCBmcm9tIGEgc3RyaW5nIHJldHVybmVkIGJ5IGF2X2hhc2hfbmFtZXMoKQorICogaGFzaF9uYW1lID0gLi4uOworICoKKyAqIC8vIEFsbG9jYXRlIGEgaGFzaCBjb250ZXh0CisgKiByZXQgPSBhdl9oYXNoX2FsbG9jKCZjdHgsIGhhc2hfbmFtZSk7CisgKiBpZiAocmV0IDwgMCkKKyAqICAgICByZXR1cm4gcmV0OworICoKKyAqIC8vIEluaXRpYWxpemUgdGhlIGhhc2ggY29udGV4dAorICogYXZfaGFzaF9pbml0KGN0eCk7CisgKgorICogLy8gVXBkYXRlIHRoZSBoYXNoIGNvbnRleHQgd2l0aCBkYXRhCisgKiB3aGlsZSAoZGF0YV9sZWZ0KSB7CisgKiAgICAgYXZfaGFzaF91cGRhdGUoY3R4LCBkYXRhLCBzaXplKTsKKyAqIH0KKyAqCisgKiAvLyBOb3cgd2UgaGF2ZSBubyBtb3JlIGRhdGEsIHNvIGl0IGlzIHRpbWUgdG8gZmluYWxpemUgdGhlIGhhc2ggYW5kIGdldCB0aGUKKyAqIC8vIG91dHB1dC4gQnV0IHdlIG5lZWQgdG8gZmlyc3QgYWxsb2NhdGUgYW4gb3V0cHV0IGJ1ZmZlci4gTm90ZSB0aGF0IHlvdSBjYW4KKyAqIC8vIHVzZSBhbnkgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24sIGluY2x1ZGluZyBtYWxsb2MoKSwgbm90IGp1c3QKKyAqIC8vIGF2X21hbGxvYygpLgorICogb3V0cHV0X2J1ZiA9IGF2X21hbGxvYyhhdl9oYXNoX2dldF9zaXplKGN0eCkpOworICogaWYgKCFvdXRwdXRfYnVmKQorICogICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgKgorICogLy8gRmluYWxpemUgdGhlIGhhc2ggY29udGV4dC4KKyAqIC8vIFlvdSBjYW4gdXNlIGFueSBvZiB0aGUgYXZfaGFzaF9maW5hbCooKSBmdW5jdGlvbnMgcHJvdmlkZWQsIGZvciBvdGhlcgorICogLy8gb3V0cHV0IGZvcm1hdHMuIElmIHlvdSBkbyBzbywgYmUgc3VyZSB0byBhZGp1c3QgdGhlIG1lbW9yeSBhbGxvY2F0aW9uCisgKiAvLyBhYm92ZS4gU2VlIHRoZSBmdW5jdGlvbiBkb2N1bWVudGF0aW9uIGJlbG93IGZvciB0aGUgZXhhY3QgYW1vdW50IG9mIGV4dHJhCisgKiAvLyBtZW1vcnkgbmVlZGVkLgorICogYXZfaGFzaF9maW5hbChjdHgsIG91dHB1dF9idWZmZXIpOworICoKKyAqIC8vIEZyZWUgdGhlIGNvbnRleHQKKyAqIGF2X2hhc2hfZnJlZXAoJmN0eCk7CisgKiBAZW5kY29kZQorICoKKyAqIEBzZWN0aW9uIEhhc2ggRnVuY3Rpb24tU3BlY2lmaWMgSW5mb3JtYXRpb24KKyAqIElmIHRoZSBDUkMzMiBoYXNoIGlzIHNlbGVjdGVkLCB0aGUgI0FWX0NSQ18zMl9JRUVFIHBvbHlub21pYWwgd2lsbCBiZQorICogdXNlZC4KKyAqCisgKiBJZiB0aGUgTXVybXVyMyBoYXNoIGlzIHNlbGVjdGVkLCB0aGUgZGVmYXVsdCBzZWVkIHdpbGwgYmUgdXNlZC4gU2VlIEByZWYKKyAqIGxhdnVfbXVybXVyM19zZWVkaW5mbyAiTXVybXVyMyIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBleGFtcGxlIGZmaGFzaC5jCisgKiBUaGlzIGV4YW1wbGUgaXMgYSBzaW1wbGUgY29tbWFuZCBsaW5lIGFwcGxpY2F0aW9uIHRoYXQgdGFrZXMgb25lIG9yIG1vcmUKKyAqIGFyZ3VtZW50cy4gSXQgZGVtb25zdHJhdGVzIGEgdHlwaWNhbCB1c2Ugb2YgdGhlIGhhc2hpbmcgQVBJIHdpdGggYWxsb2NhdGlvbiwKKyAqIGluaXRpYWxpemF0aW9uLCB1cGRhdGluZywgYW5kIGZpbmFsaXppbmcuCisgKi8KKwogc3RydWN0IEFWSGFzaENvbnRleHQ7CiAKIC8qKgogICogQWxsb2NhdGUgYSBoYXNoIGNvbnRleHQgZm9yIHRoZSBhbGdvcml0aG0gc3BlY2lmaWVkIGJ5IG5hbWUuCiAgKgogICogQHJldHVybiAgPj0gMCBmb3Igc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGZvciBmYWlsdXJlCi0gKiBAbm90ZSAgVGhlIGNvbnRleHQgaXMgbm90IGluaXRpYWxpemVkLCB5b3UgbXVzdCBjYWxsIGF2X2hhc2hfaW5pdCgpLgorICoKKyAqIEBub3RlIFRoZSBjb250ZXh0IGlzIG5vdCBpbml0aWFsaXplZCBhZnRlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbjsgeW91IG11c3QKKyAqIGNhbGwgYXZfaGFzaF9pbml0KCkgdG8gZG8gc28uCiAgKi8KIGludCBhdl9oYXNoX2FsbG9jKHN0cnVjdCBBVkhhc2hDb250ZXh0ICoqY3R4LCBjb25zdCBjaGFyICpuYW1lKTsKIApAQCAtMzgsOCArMTMwLDggQEAKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGVudW1lcmF0ZSB0aGUgYWxnb3JpdGhtcy4KICAqCi0gKiBAcGFyYW0gaSAgaW5kZXggb2YgdGhlIGhhc2ggYWxnb3JpdGhtLCBzdGFydGluZyBmcm9tIDAKLSAqIEByZXR1cm4gICBhIHBvaW50ZXIgdG8gYSBzdGF0aWMgc3RyaW5nIG9yIE5VTEwgaWYgaSBpcyBvdXQgb2YgcmFuZ2UKKyAqIEBwYXJhbVtpbl0gaSAgSW5kZXggb2YgdGhlIGhhc2ggYWxnb3JpdGhtLCBzdGFydGluZyBmcm9tIDAKKyAqIEByZXR1cm4gICAgICAgUG9pbnRlciB0byBhIHN0YXRpYyBzdHJpbmcgb3IgYE5VTExgIGlmIGBpYCBpcyBvdXQgb2YgcmFuZ2UKICAqLwogY29uc3QgY2hhciAqYXZfaGFzaF9uYW1lcyhpbnQgaSk7CiAKQEAgLTQ5LDY0ICsxNDEsMTI5IEBACiBjb25zdCBjaGFyICphdl9oYXNoX2dldF9uYW1lKGNvbnN0IHN0cnVjdCBBVkhhc2hDb250ZXh0ICpjdHgpOwogCiAvKioKLSAqIE1heGltdW0gdmFsdWUgdGhhdCBhdl9oYXNoX2dldF9zaXplIHdpbGwgY3VycmVudGx5IHJldHVybi4KKyAqIE1heGltdW0gdmFsdWUgdGhhdCBhdl9oYXNoX2dldF9zaXplKCkgd2lsbCBjdXJyZW50bHkgcmV0dXJuLgogICoKLSAqIFlvdSBjYW4gdXNlIHRoaXMgaWYgeW91IGFic29sdXRlbHkgd2FudCBvciBuZWVkIHRvIHVzZSBzdGF0aWMgYWxsb2NhdGlvbgotICogYW5kIGFyZSBmaW5lIHdpdGggbm90IHN1cHBvcnRpbmcgaGFzaGVzIG5ld2x5IGFkZGVkIHRvIGxpYmF2dXRpbCB3aXRob3V0Ci0gKiByZWNvbXBpbGF0aW9uLgotICogTm90ZSB0aGF0IHlvdSBzdGlsbCBuZWVkIHRvIGNoZWNrIGFnYWluc3QgYXZfaGFzaF9nZXRfc2l6ZSwgYWRkaW5nIG5ldyBoYXNoZXMKLSAqIHdpdGggbGFyZ2VyIHNpemVzIHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgYW4gQUJJIGNoYW5nZSBhbmQgc2hvdWxkIG5vdCBjYXVzZQotICogeW91ciBjb2RlIHRvIG92ZXJmbG93IGEgYnVmZmVyLgorICogWW91IGNhbiB1c2UgdGhpcyBpZiB5b3UgYWJzb2x1dGVseSB3YW50IG9yIG5lZWQgdG8gdXNlIHN0YXRpYyBhbGxvY2F0aW9uIGZvcgorICogdGhlIG91dHB1dCBidWZmZXIgYW5kIGFyZSBmaW5lIHdpdGggbm90IHN1cHBvcnRpbmcgaGFzaGVzIG5ld2x5IGFkZGVkIHRvCisgKiBsaWJhdnV0aWwgd2l0aG91dCByZWNvbXBpbGF0aW9uLgorICoKKyAqIEB3YXJuaW5nCisgKiBBZGRpbmcgbmV3IGhhc2hlcyB3aXRoIGxhcmdlciBzaXplcywgYW5kIGluY3JlYXNpbmcgdGhlIG1hY3JvIHdoaWxlIGRvaW5nCisgKiBzbywgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBhbiBBQkkgY2hhbmdlLiBUbyBwcmV2ZW50IHlvdXIgY29kZSBmcm9tCisgKiBvdmVyZmxvd2luZyBhIGJ1ZmZlciwgZWl0aGVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGgKKyAqIGF2X2hhc2hfZ2V0X3NpemUoKSwgb3IgbGltaXQgeW91ciB1c2Ugb2YgdGhlIEhhc2hpbmcgQVBJIHRvIGhhc2hlcyB0aGF0IGFyZQorICogYWxyZWFkeSBpbiBGRm1wZWcgZHVyaW5nIHRoZSB0aW1lIG9mIGNvbXBpbGF0aW9uLgogICovCiAjZGVmaW5lIEFWX0hBU0hfTUFYX1NJWkUgNjQKIAogLyoqCiAgKiBHZXQgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBoYXNoIHZhbHVlIGluIGJ5dGVzLgogICoKLSAqIFRoZSBwb2ludGVyIHBhc3NlZCB0byBhdl9oYXNoX2ZpbmFsIGhhdmUgc3BhY2UgZm9yIGF0IGxlYXN0IHRoaXMgbWFueSBieXRlcy4KKyAqIFRoZSBtYXhpbXVtIHZhbHVlIHRoaXMgZnVuY3Rpb24gd2lsbCBjdXJyZW50bHkgcmV0dXJuIGlzIGF2YWlsYWJsZSBhcyBtYWNybworICogI0FWX0hBU0hfTUFYX1NJWkUuCisgKgorICogQHBhcmFtW2luXSAgICAgY3R4IEhhc2ggY29udGV4dAorICogQHJldHVybiAgICAgICAgICAgIFNpemUgb2YgdGhlIGhhc2ggdmFsdWUgaW4gYnl0ZXMKICAqLwogaW50IGF2X2hhc2hfZ2V0X3NpemUoY29uc3Qgc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCk7CiAKIC8qKgogICogSW5pdGlhbGl6ZSBvciByZXNldCBhIGhhc2ggY29udGV4dC4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBjdHggSGFzaCBjb250ZXh0CiAgKi8KIHZvaWQgYXZfaGFzaF9pbml0KHN0cnVjdCBBVkhhc2hDb250ZXh0ICpjdHgpOwogCiAvKioKICAqIFVwZGF0ZSBhIGhhc2ggY29udGV4dCB3aXRoIGFkZGl0aW9uYWwgZGF0YS4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBjdHggSGFzaCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBzcmMgRGF0YSB0byBiZSBhZGRlZCB0byB0aGUgaGFzaCBjb250ZXh0CisgKiBAcGFyYW1baW5dICAgICBsZW4gU2l6ZSBvZiB0aGUgYWRkaXRpb25hbCBkYXRhCiAgKi8KKyNpZiBGRl9BUElfQ1JZUFRPX1NJWkVfVAogdm9pZCBhdl9oYXNoX3VwZGF0ZShzdHJ1Y3QgQVZIYXNoQ29udGV4dCAqY3R4LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4pOworI2Vsc2UKK3ZvaWQgYXZfaGFzaF91cGRhdGUoc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3QgbGVuKTsKKyNlbmRpZgogCiAvKioKICAqIEZpbmFsaXplIGEgaGFzaCBjb250ZXh0IGFuZCBjb21wdXRlIHRoZSBhY3R1YWwgaGFzaCB2YWx1ZS4KKyAqCisgKiBUaGUgbWluaW11bSBzaXplIG9mIGBkc3RgIGJ1ZmZlciBpcyBnaXZlbiBieSBhdl9oYXNoX2dldF9zaXplKCkgb3IKKyAqICNBVl9IQVNIX01BWF9TSVpFLiBUaGUgdXNlIG9mIHRoZSBsYXR0ZXIgbWFjcm8gaXMgZGlzY291cmFnZWQuCisgKgorICogSXQgaXMgbm90IHNhZmUgdG8gdXBkYXRlIG9yIGZpbmFsaXplIGEgaGFzaCBjb250ZXh0IGFnYWluLCBpZiBpdCBoYXMgYWxyZWFkeQorICogYmVlbiBmaW5hbGl6ZWQuCisgKgorICogQHBhcmFtW2luLG91dF0gY3R4IEhhc2ggY29udGV4dAorICogQHBhcmFtW291dF0gICAgZHN0IFdoZXJlIHRoZSBmaW5hbCBoYXNoIHZhbHVlIHdpbGwgYmUgc3RvcmVkCisgKgorICogQHNlZSBhdl9oYXNoX2ZpbmFsX2JpbigpIHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIEFQSQogICovCiB2b2lkIGF2X2hhc2hfZmluYWwoc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgdWludDhfdCAqZHN0KTsKIAogLyoqCi0gKiBGaW5hbGl6ZSBhIGhhc2ggY29udGV4dCBhbmQgY29tcHV0ZSB0aGUgYWN0dWFsIGhhc2ggdmFsdWUuCi0gKiBJZiBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgaGFzaCBzaXplLCB0aGUgaGFzaCBpcyB0cnVuY2F0ZWQ7Ci0gKiBpZiBzaXplIGlzIGxhcmdlciwgdGhlIGJ1ZmZlciBpcyBwYWRkZWQgd2l0aCAwLgorICogRmluYWxpemUgYSBoYXNoIGNvbnRleHQgYW5kIHN0b3JlIHRoZSBhY3R1YWwgaGFzaCB2YWx1ZSBpbiBhIGJ1ZmZlci4KKyAqCisgKiBJdCBpcyBub3Qgc2FmZSB0byB1cGRhdGUgb3IgZmluYWxpemUgYSBoYXNoIGNvbnRleHQgYWdhaW4sIGlmIGl0IGhhcyBhbHJlYWR5CisgKiBiZWVuIGZpbmFsaXplZC4KKyAqCisgKiBJZiBgc2l6ZWAgaXMgc21hbGxlciB0aGFuIHRoZSBoYXNoIHNpemUgKGdpdmVuIGJ5IGF2X2hhc2hfZ2V0X3NpemUoKSksIHRoZQorICogaGFzaCBpcyB0cnVuY2F0ZWQ7IGlmIHNpemUgaXMgbGFyZ2VyLCB0aGUgYnVmZmVyIGlzIHBhZGRlZCB3aXRoIDAuCisgKgorICogQHBhcmFtW2luLG91dF0gY3R4ICBIYXNoIGNvbnRleHQKKyAqIEBwYXJhbVtvdXRdICAgIGRzdCAgV2hlcmUgdGhlIGZpbmFsIGhhc2ggdmFsdWUgd2lsbCBiZSBzdG9yZWQKKyAqIEBwYXJhbVtpbl0gICAgIHNpemUgTnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHRvIGBkc3RgCiAgKi8KIHZvaWQgYXZfaGFzaF9maW5hbF9iaW4oc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCwgdWludDhfdCAqZHN0LCBpbnQgc2l6ZSk7CiAKIC8qKgotICogRmluYWxpemUgYSBoYXNoIGNvbnRleHQgYW5kIGNvbXB1dGUgdGhlIGFjdHVhbCBoYXNoIHZhbHVlIGFzIGEgaGV4IHN0cmluZy4KKyAqIEZpbmFsaXplIGEgaGFzaCBjb250ZXh0IGFuZCBzdG9yZSB0aGUgaGV4YWRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgKiBhY3R1YWwgaGFzaCB2YWx1ZSBhcyBhIHN0cmluZy4KKyAqCisgKiBJdCBpcyBub3Qgc2FmZSB0byB1cGRhdGUgb3IgZmluYWxpemUgYSBoYXNoIGNvbnRleHQgYWdhaW4sIGlmIGl0IGhhcyBhbHJlYWR5CisgKiBiZWVuIGZpbmFsaXplZC4KKyAqCiAgKiBUaGUgc3RyaW5nIGlzIGFsd2F5cyAwLXRlcm1pbmF0ZWQuCi0gKiBJZiBzaXplIGlzIHNtYWxsZXIgdGhhbiAyICogaGFzaF9zaXplICsgMSwgdGhlIGhleCBzdHJpbmcgaXMgdHJ1bmNhdGVkLgorICoKKyAqIElmIGBzaXplYCBpcyBzbWFsbGVyIHRoYW4gYDIgKiBoYXNoX3NpemUgKyAxYCwgd2hlcmUgYGhhc2hfc2l6ZWAgaXMgdGhlCisgKiB2YWx1ZSByZXR1cm5lZCBieSBhdl9oYXNoX2dldF9zaXplKCksIHRoZSBzdHJpbmcgd2lsbCBiZSB0cnVuY2F0ZWQuCisgKgorICogQHBhcmFtW2luLG91dF0gY3R4ICBIYXNoIGNvbnRleHQKKyAqIEBwYXJhbVtvdXRdICAgIGRzdCAgV2hlcmUgdGhlIHN0cmluZyB3aWxsIGJlIHN0b3JlZAorICogQHBhcmFtW2luXSAgICAgc2l6ZSBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byBgZHN0YAogICovCiB2b2lkIGF2X2hhc2hfZmluYWxfaGV4KHN0cnVjdCBBVkhhc2hDb250ZXh0ICpjdHgsIHVpbnQ4X3QgKmRzdCwgaW50IHNpemUpOwogCiAvKioKLSAqIEZpbmFsaXplIGEgaGFzaCBjb250ZXh0IGFuZCBjb21wdXRlIHRoZSBhY3R1YWwgaGFzaCB2YWx1ZSBhcyBhIGJhc2U2NCBzdHJpbmcuCisgKiBGaW5hbGl6ZSBhIGhhc2ggY29udGV4dCBhbmQgc3RvcmUgdGhlIEJhc2U2NCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAqIGFjdHVhbCBoYXNoIHZhbHVlIGFzIGEgc3RyaW5nLgorICoKKyAqIEl0IGlzIG5vdCBzYWZlIHRvIHVwZGF0ZSBvciBmaW5hbGl6ZSBhIGhhc2ggY29udGV4dCBhZ2FpbiwgaWYgaXQgaGFzIGFscmVhZHkKKyAqIGJlZW4gZmluYWxpemVkLgorICoKICAqIFRoZSBzdHJpbmcgaXMgYWx3YXlzIDAtdGVybWluYXRlZC4KLSAqIElmIHNpemUgaXMgc21hbGxlciB0aGFuIEFWX0JBU0U2NF9TSVpFKGhhc2hfc2l6ZSksIHRoZSBiYXNlNjQgc3RyaW5nIGlzCi0gKiB0cnVuY2F0ZWQuCisgKgorICogSWYgYHNpemVgIGlzIHNtYWxsZXIgdGhhbiBBVl9CQVNFNjRfU0laRShoYXNoX3NpemUpLCB3aGVyZSBgaGFzaF9zaXplYCBpcworICogdGhlIHZhbHVlIHJldHVybmVkIGJ5IGF2X2hhc2hfZ2V0X3NpemUoKSwgdGhlIHN0cmluZyB3aWxsIGJlIHRydW5jYXRlZC4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBjdHggIEhhc2ggY29udGV4dAorICogQHBhcmFtW291dF0gICAgZHN0ICBXaGVyZSB0aGUgZmluYWwgaGFzaCB2YWx1ZSB3aWxsIGJlIHN0b3JlZAorICogQHBhcmFtW2luXSAgICAgc2l6ZSBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byBgZHN0YAogICovCiB2b2lkIGF2X2hhc2hfZmluYWxfYjY0KHN0cnVjdCBBVkhhc2hDb250ZXh0ICpjdHgsIHVpbnQ4X3QgKmRzdCwgaW50IHNpemUpOwogCiAvKioKLSAqIEZyZWUgaGFzaCBjb250ZXh0LgorICogRnJlZSBoYXNoIGNvbnRleHQgYW5kIHNldCBoYXNoIGNvbnRleHQgcG9pbnRlciB0byBgTlVMTGAuCisgKgorICogQHBhcmFtW2luLG91dF0gY3R4ICBQb2ludGVyIHRvIGhhc2ggY29udGV4dAogICovCiB2b2lkIGF2X2hhc2hfZnJlZXAoc3RydWN0IEFWSGFzaENvbnRleHQgKipjdHgpOwogCisvKioKKyAqIEB9CisgKiBAfQorICovCisKICNlbmRpZiAvKiBBVlVUSUxfSEFTSF9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaG1hYy5jIGIvbGliYXZ1dGlsL2htYWMuYwppbmRleCAzZTExNTA5Li5kMDY0YTEwIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvaG1hYy5jCisrKyBiL2xpYmF2dXRpbC9obWFjLmMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCkBAIC0yNiwxNiArMjgsMjUgQEAKICNpbmNsdWRlICJzaGEuaCIKICNpbmNsdWRlICJzaGE1MTIuaCIKICNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAKICNkZWZpbmUgTUFYX0hBU0hMRU4gNjQKICNkZWZpbmUgTUFYX0JMT0NLTEVOIDEyOAogCit0eXBlZGVmIHZvaWQgKCpobWFjX2ZpbmFsKSh2b2lkICpjdHgsIHVpbnQ4X3QgKmRzdCk7CisjaWYgRkZfQVBJX0NSWVBUT19TSVpFX1QKK3R5cGVkZWYgdm9pZCAoKmhtYWNfdXBkYXRlKSh2b2lkICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbik7CisjZWxzZQordHlwZWRlZiB2b2lkICgqaG1hY191cGRhdGUpKHZvaWQgKmN0eCwgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3QgbGVuKTsKKyNlbmRpZgordHlwZWRlZiB2b2lkICgqaG1hY19pbml0KSh2b2lkICpjdHgpOworCiBzdHJ1Y3QgQVZITUFDIHsKICAgICB2b2lkICpoYXNoOwogICAgIGludCBibG9ja2xlbiwgaGFzaGxlbjsKLSAgICB2b2lkICgqZmluYWwpKHZvaWQqLCB1aW50OF90Kik7Ci0gICAgdm9pZCAoKnVwZGF0ZSkodm9pZCosIGNvbnN0IHVpbnQ4X3QqLCBpbnQgbGVuKTsKLSAgICB2b2lkICgqaW5pdCkodm9pZCopOworICAgIGhtYWNfZmluYWwgIGZpbmFsOworICAgIGhtYWNfdXBkYXRlIHVwZGF0ZTsKKyAgICBobWFjX2luaXQgICBpbml0OwogICAgIHVpbnQ4X3Qga2V5W01BWF9CTE9DS0xFTl07CiAgICAgaW50IGtleWxlbjsKIH07CkBAIC02Nyw0OSArNzgsNDkgQEAKICAgICBjYXNlIEFWX0hNQUNfTUQ1OgogICAgICAgICBjLT5ibG9ja2xlbiA9IDY0OwogICAgICAgICBjLT5oYXNobGVuICA9IDE2OwotICAgICAgICBjLT5pbml0ICAgICA9ICh2b2lkKilhdl9tZDVfaW5pdDsKLSAgICAgICAgYy0+dXBkYXRlICAgPSAodm9pZCopYXZfbWQ1X3VwZGF0ZTsKLSAgICAgICAgYy0+ZmluYWwgICAgPSAodm9pZCopYXZfbWQ1X2ZpbmFsOworICAgICAgICBjLT5pbml0ICAgICA9IChobWFjX2luaXQpIGF2X21kNV9pbml0OworICAgICAgICBjLT51cGRhdGUgICA9IChobWFjX3VwZGF0ZSkgYXZfbWQ1X3VwZGF0ZTsKKyAgICAgICAgYy0+ZmluYWwgICAgPSAoaG1hY19maW5hbCkgYXZfbWQ1X2ZpbmFsOwogICAgICAgICBjLT5oYXNoICAgICA9IGF2X21kNV9hbGxvYygpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0hNQUNfU0hBMToKICAgICAgICAgYy0+YmxvY2tsZW4gPSA2NDsKICAgICAgICAgYy0+aGFzaGxlbiAgPSAyMDsKICAgICAgICAgYy0+aW5pdCAgICAgPSBzaGExNjBfaW5pdDsKLSAgICAgICAgYy0+dXBkYXRlICAgPSAodm9pZCopYXZfc2hhX3VwZGF0ZTsKLSAgICAgICAgYy0+ZmluYWwgICAgPSAodm9pZCopYXZfc2hhX2ZpbmFsOworICAgICAgICBjLT51cGRhdGUgICA9IChobWFjX3VwZGF0ZSkgYXZfc2hhX3VwZGF0ZTsKKyAgICAgICAgYy0+ZmluYWwgICAgPSAoaG1hY19maW5hbCkgYXZfc2hhX2ZpbmFsOwogICAgICAgICBjLT5oYXNoICAgICA9IGF2X3NoYV9hbGxvYygpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX0hNQUNfU0hBMjI0OgogICAgICAgICBjLT5ibG9ja2xlbiA9IDY0OwogICAgICAgICBjLT5oYXNobGVuICA9IDI4OwogICAgICAgICBjLT5pbml0ICAgICA9IHNoYTIyNF9pbml0OwotICAgICAgICBjLT51cGRhdGUgICA9ICh2b2lkKilhdl9zaGFfdXBkYXRlOwotICAgICAgICBjLT5maW5hbCAgICA9ICh2b2lkKilhdl9zaGFfZmluYWw7CisgICAgICAgIGMtPnVwZGF0ZSAgID0gKGhtYWNfdXBkYXRlKSBhdl9zaGFfdXBkYXRlOworICAgICAgICBjLT5maW5hbCAgICA9IChobWFjX2ZpbmFsKSBhdl9zaGFfZmluYWw7CiAgICAgICAgIGMtPmhhc2ggICAgID0gYXZfc2hhX2FsbG9jKCk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfSE1BQ19TSEEyNTY6CiAgICAgICAgIGMtPmJsb2NrbGVuID0gNjQ7CiAgICAgICAgIGMtPmhhc2hsZW4gID0gMzI7CiAgICAgICAgIGMtPmluaXQgICAgID0gc2hhMjU2X2luaXQ7Ci0gICAgICAgIGMtPnVwZGF0ZSAgID0gKHZvaWQqKWF2X3NoYV91cGRhdGU7Ci0gICAgICAgIGMtPmZpbmFsICAgID0gKHZvaWQqKWF2X3NoYV9maW5hbDsKKyAgICAgICAgYy0+dXBkYXRlICAgPSAoaG1hY191cGRhdGUpIGF2X3NoYV91cGRhdGU7CisgICAgICAgIGMtPmZpbmFsICAgID0gKGhtYWNfZmluYWwpIGF2X3NoYV9maW5hbDsKICAgICAgICAgYy0+aGFzaCAgICAgPSBhdl9zaGFfYWxsb2MoKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9ITUFDX1NIQTM4NDoKICAgICAgICAgYy0+YmxvY2tsZW4gPSAxMjg7CiAgICAgICAgIGMtPmhhc2hsZW4gID0gNDg7CiAgICAgICAgIGMtPmluaXQgICAgID0gc2hhMzg0X2luaXQ7Ci0gICAgICAgIGMtPnVwZGF0ZSAgID0gKHZvaWQqKWF2X3NoYTUxMl91cGRhdGU7Ci0gICAgICAgIGMtPmZpbmFsICAgID0gKHZvaWQqKWF2X3NoYTUxMl9maW5hbDsKKyAgICAgICAgYy0+dXBkYXRlICAgPSAoaG1hY191cGRhdGUpIGF2X3NoYTUxMl91cGRhdGU7CisgICAgICAgIGMtPmZpbmFsICAgID0gKGhtYWNfZmluYWwpIGF2X3NoYTUxMl9maW5hbDsKICAgICAgICAgYy0+aGFzaCAgICAgPSBhdl9zaGE1MTJfYWxsb2MoKTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9ITUFDX1NIQTUxMjoKICAgICAgICAgYy0+YmxvY2tsZW4gPSAxMjg7CiAgICAgICAgIGMtPmhhc2hsZW4gID0gNjQ7CiAgICAgICAgIGMtPmluaXQgICAgID0gc2hhNTEyX2luaXQ7Ci0gICAgICAgIGMtPnVwZGF0ZSAgID0gKHZvaWQqKWF2X3NoYTUxMl91cGRhdGU7Ci0gICAgICAgIGMtPmZpbmFsICAgID0gKHZvaWQqKWF2X3NoYTUxMl9maW5hbDsKKyAgICAgICAgYy0+dXBkYXRlICAgPSAoaG1hY191cGRhdGUpIGF2X3NoYTUxMl91cGRhdGU7CisgICAgICAgIGMtPmZpbmFsICAgID0gKGhtYWNfZmluYWwpIGF2X3NoYTUxMl9maW5hbDsKICAgICAgICAgYy0+aGFzaCAgICAgPSBhdl9zaGE1MTJfYWxsb2MoKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTE4Myw4NCArMTk0LDMgQEAKICAgICBhdl9obWFjX3VwZGF0ZShjLCBkYXRhLCBsZW4pOwogICAgIHJldHVybiBhdl9obWFjX2ZpbmFsKGMsIG91dCwgb3V0bGVuKTsKIH0KLQotI2lmZGVmIFRFU1QKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1zdGF0aWMgdm9pZCB0ZXN0KEFWSE1BQyAqaG1hYywgY29uc3QgdWludDhfdCAqa2V5LCBpbnQga2V5bGVuLAotICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBpbnQgZGF0YWxlbikKLXsKLSAgICB1aW50OF90IGJ1ZltNQVhfSEFTSExFTl07Ci0gICAgaW50IG91dCwgaTsKLSAgICAvLyBTb21lIG9mIHRoZSB0ZXN0IHZlY3RvcnMgYXJlIHN0cmluZ3MsIHdoZXJlIHNpemVvZigpIGluY2x1ZGVzIHRoZQotICAgIC8vIHRyYWlsaW5nIG51bGwgYnl0ZSAtIHJlbW92ZSB0aGF0LgotICAgIGlmICgha2V5W2tleWxlbiAtIDFdKQotICAgICAgICBrZXlsZW4tLTsKLSAgICBpZiAoIWRhdGFbZGF0YWxlbiAtIDFdKQotICAgICAgICBkYXRhbGVuLS07Ci0gICAgb3V0ID0gYXZfaG1hY19jYWxjKGhtYWMsIGRhdGEsIGRhdGFsZW4sIGtleSwga2V5bGVuLCBidWYsIHNpemVvZihidWYpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgb3V0OyBpKyspCi0gICAgICAgIHByaW50ZigiJTAyeCIsIGJ1ZltpXSk7Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIHVpbnQ4X3Qga2V5MVsyMF0sIGtleTNbMTMxXSwgZGF0YTNbNTBdOwotICAgIEFWSE1BQyAqaG1hYzsKLSAgICBlbnVtIEFWSE1BQ1R5cGUgaTsKLSAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrZXkyW10gID0gIkplZmUiOwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRhdGExW10gPSAiSGkgVGhlcmUiOwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRhdGEyW10gPSAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyI7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGF0YTRbXSA9ICJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5IC0gSGFzaCBLZXkgRmlyc3QiOwotICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRhdGE1W10gPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSBhbmQgTGFyZ2VyIFRoYW4gT25lIEJsb2NrLVNpemUgRGF0YSI7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGF0YTZbXSA9ICJUaGlzIGlzIGEgdGVzdCB1c2luZyBhIGxhcmdlciB0aGFuIGJsb2NrLXNpemUga2V5IGFuZCBhIGxhcmdlciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gYmxvY2stc2l6ZSBkYXRhLiBUaGUga2V5IG5lZWRzIHRvIGJlIGhhc2hlZCBiZWZvcmUgYmVpbmcgdXNlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5IHRoZSBITUFDIGFsZ29yaXRobS4iOwotICAgIG1lbXNldChrZXkxLCAweDBiLCBzaXplb2Yoa2V5MSkpOwotICAgIG1lbXNldChrZXkzLCAweGFhLCBzaXplb2Yoa2V5MykpOwotICAgIG1lbXNldChkYXRhMywgMHhkZCwgc2l6ZW9mKGRhdGEzKSk7Ci0KLSAgICAvKiBNRDUsIFNIQS0xICovCi0gICAgZm9yIChpID0gQVZfSE1BQ19NRDU7IGkgPD0gQVZfSE1BQ19TSEExOyBpKyspIHsKLSAgICAgICAgaG1hYyA9IGF2X2htYWNfYWxsb2MoaSk7Ci0gICAgICAgIGlmICghaG1hYykKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAvLyBSRkMgMjIwMiB0ZXN0IHZlY3RvcnMKLSAgICAgICAgdGVzdChobWFjLCBrZXkxLCBobWFjLT5oYXNobGVuLCBkYXRhMSwgc2l6ZW9mKGRhdGExKSk7Ci0gICAgICAgIHRlc3QoaG1hYywga2V5Miwgc2l6ZW9mKGtleTIpLCAgZGF0YTIsIHNpemVvZihkYXRhMikpOwotICAgICAgICB0ZXN0KGhtYWMsIGtleTMsIGhtYWMtPmhhc2hsZW4sIGRhdGEzLCBzaXplb2YoZGF0YTMpKTsKLSAgICAgICAgdGVzdChobWFjLCBrZXkzLCA4MCwgICAgICAgICAgICBkYXRhNCwgc2l6ZW9mKGRhdGE0KSk7Ci0gICAgICAgIHRlc3QoaG1hYywga2V5MywgODAsICAgICAgICAgICAgZGF0YTUsIHNpemVvZihkYXRhNSkpOwotICAgICAgICBhdl9obWFjX2ZyZWUoaG1hYyk7Ci0gICAgfQotCi0gICAgLyogU0hBLTIgKi8KLSAgICBmb3IgKGkgPSBBVl9ITUFDX1NIQTIyNDsgaSA8PSBBVl9ITUFDX1NIQTI1NjsgaSsrKSB7Ci0gICAgICAgIGhtYWMgPSBhdl9obWFjX2FsbG9jKGkpOwotICAgICAgICBpZiAoIWhtYWMpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgLy8gUkZDIDQyMzEgdGVzdCB2ZWN0b3JzCi0gICAgICAgIHRlc3QoaG1hYywga2V5MSwgc2l6ZW9mKGtleTEpLCBkYXRhMSwgc2l6ZW9mKGRhdGExKSk7Ci0gICAgICAgIHRlc3QoaG1hYywga2V5Miwgc2l6ZW9mKGtleTIpLCBkYXRhMiwgc2l6ZW9mKGRhdGEyKSk7Ci0gICAgICAgIHRlc3QoaG1hYywga2V5MywgMjAsICAgICAgICAgICBkYXRhMywgc2l6ZW9mKGRhdGEzKSk7Ci0gICAgICAgIHRlc3QoaG1hYywga2V5Mywgc2l6ZW9mKGtleTMpLCBkYXRhNCwgc2l6ZW9mKGRhdGE0KSk7Ci0gICAgICAgIHRlc3QoaG1hYywga2V5Mywgc2l6ZW9mKGtleTMpLCBkYXRhNiwgc2l6ZW9mKGRhdGE2KSk7Ci0gICAgICAgIGF2X2htYWNfZnJlZShobWFjKTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSBBVl9ITUFDX1NIQTM4NDsgaSA8PSBBVl9ITUFDX1NIQTUxMjsgaSsrKSB7Ci0gICAgICAgIGhtYWMgPSBhdl9obWFjX2FsbG9jKGkpOwotICAgICAgICBpZiAoIWhtYWMpCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgLy8gUkZDIDQyMzEgdGVzdCB2ZWN0b3JzCi0gICAgICAgIHRlc3QoaG1hYywga2V5MSwgc2l6ZW9mKGtleTEpLCBkYXRhMSwgc2l6ZW9mKGRhdGExKSk7Ci0gICAgICAgIHRlc3QoaG1hYywga2V5Miwgc2l6ZW9mKGtleTIpLCBkYXRhMiwgc2l6ZW9mKGRhdGEyKSk7Ci0gICAgICAgIHRlc3QoaG1hYywga2V5MywgMjAsIGRhdGEzLCBzaXplb2YoZGF0YTMpKTsKLSAgICAgICAgdGVzdChobWFjLCBrZXkzLCBzaXplb2Yoa2V5MyksIGRhdGE0LCBzaXplb2YoZGF0YTQpKTsKLSAgICAgICAgdGVzdChobWFjLCBrZXkzLCBzaXplb2Yoa2V5MyksIGRhdGE2LCBzaXplb2YoZGF0YTYpKTsKLSAgICAgICAgYXZfaG1hY19mcmVlKGhtYWMpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaG1hYy5oIGIvbGliYXZ1dGlsL2htYWMuaAppbmRleCA1NzZhMGE0Li40MTJlOTUwIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvaG1hYy5oCisrKyBiL2xpYmF2dXRpbC9obWFjLmgKQEAgLTM1LDcgKzM1LDcgQEAKICAgICBBVl9ITUFDX1NIQTEsCiAgICAgQVZfSE1BQ19TSEEyMjQsCiAgICAgQVZfSE1BQ19TSEEyNTYsCi0gICAgQVZfSE1BQ19TSEEzODQgPSAxMiwKKyAgICBBVl9ITUFDX1NIQTM4NCwKICAgICBBVl9ITUFDX1NIQTUxMiwKIH07CiAKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9od2NvbnRleHQuYyBiL2xpYmF2dXRpbC9od2NvbnRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGM1NTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dC5jCkBAIC0wLDAgKzEsODczIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImh3Y29udGV4dC5oIgorI2luY2x1ZGUgImh3Y29udGV4dF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImltZ3V0aWxzLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAicGl4ZGVzYy5oIgorI2luY2x1ZGUgInBpeGZtdC5oIgorCitzdGF0aWMgY29uc3QgSFdDb250ZXh0VHlwZSAqIGNvbnN0IGh3X3RhYmxlW10gPSB7CisjaWYgQ09ORklHX0NVREEKKyAgICAmZmZfaHdjb250ZXh0X3R5cGVfY3VkYSwKKyNlbmRpZgorI2lmIENPTkZJR19EM0QxMVZBCisgICAgJmZmX2h3Y29udGV4dF90eXBlX2QzZDExdmEsCisjZW5kaWYKKyNpZiBDT05GSUdfTElCRFJNCisgICAgJmZmX2h3Y29udGV4dF90eXBlX2RybSwKKyNlbmRpZgorI2lmIENPTkZJR19EWFZBMgorICAgICZmZl9od2NvbnRleHRfdHlwZV9keHZhMiwKKyNlbmRpZgorI2lmIENPTkZJR19PUEVOQ0wKKyAgICAmZmZfaHdjb250ZXh0X3R5cGVfb3BlbmNsLAorI2VuZGlmCisjaWYgQ09ORklHX1FTVgorICAgICZmZl9od2NvbnRleHRfdHlwZV9xc3YsCisjZW5kaWYKKyNpZiBDT05GSUdfVkFBUEkKKyAgICAmZmZfaHdjb250ZXh0X3R5cGVfdmFhcGksCisjZW5kaWYKKyNpZiBDT05GSUdfVkRQQVUKKyAgICAmZmZfaHdjb250ZXh0X3R5cGVfdmRwYXUsCisjZW5kaWYKKyNpZiBDT05GSUdfVklERU9UT09MQk9YCisgICAgJmZmX2h3Y29udGV4dF90eXBlX3ZpZGVvdG9vbGJveCwKKyNlbmRpZgorI2lmIENPTkZJR19NRURJQUNPREVDCisgICAgJmZmX2h3Y29udGV4dF90eXBlX21lZGlhY29kZWMsCisjZW5kaWYKKyAgICBOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGh3X3R5cGVfbmFtZXNbXSA9IHsKKyAgICBbQVZfSFdERVZJQ0VfVFlQRV9DVURBXSAgID0gImN1ZGEiLAorICAgIFtBVl9IV0RFVklDRV9UWVBFX0RSTV0gICAgPSAiZHJtIiwKKyAgICBbQVZfSFdERVZJQ0VfVFlQRV9EWFZBMl0gID0gImR4dmEyIiwKKyAgICBbQVZfSFdERVZJQ0VfVFlQRV9EM0QxMVZBXSA9ICJkM2QxMXZhIiwKKyAgICBbQVZfSFdERVZJQ0VfVFlQRV9PUEVOQ0xdID0gIm9wZW5jbCIsCisgICAgW0FWX0hXREVWSUNFX1RZUEVfUVNWXSAgICA9ICJxc3YiLAorICAgIFtBVl9IV0RFVklDRV9UWVBFX1ZBQVBJXSAgPSAidmFhcGkiLAorICAgIFtBVl9IV0RFVklDRV9UWVBFX1ZEUEFVXSAgPSAidmRwYXUiLAorICAgIFtBVl9IV0RFVklDRV9UWVBFX1ZJREVPVE9PTEJPWF0gPSAidmlkZW90b29sYm94IiwKKyAgICBbQVZfSFdERVZJQ0VfVFlQRV9NRURJQUNPREVDXSA9ICJtZWRpYWNvZGVjIiwKK307CisKK2VudW0gQVZIV0RldmljZVR5cGUgYXZfaHdkZXZpY2VfZmluZF90eXBlX2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgdHlwZTsKKyAgICBmb3IgKHR5cGUgPSAwOyB0eXBlIDwgRkZfQVJSQVlfRUxFTVMoaHdfdHlwZV9uYW1lcyk7IHR5cGUrKykgeworICAgICAgICBpZiAoaHdfdHlwZV9uYW1lc1t0eXBlXSAmJiAhc3RyY21wKGh3X3R5cGVfbmFtZXNbdHlwZV0sIG5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorICAgIHJldHVybiBBVl9IV0RFVklDRV9UWVBFX05PTkU7Cit9CisKK2NvbnN0IGNoYXIgKmF2X2h3ZGV2aWNlX2dldF90eXBlX25hbWUoZW51bSBBVkhXRGV2aWNlVHlwZSB0eXBlKQoreworICAgIGlmICh0eXBlID4gQVZfSFdERVZJQ0VfVFlQRV9OT05FICYmCisgICAgICAgIHR5cGUgPCBGRl9BUlJBWV9FTEVNUyhod190eXBlX25hbWVzKSkKKyAgICAgICAgcmV0dXJuIGh3X3R5cGVfbmFtZXNbdHlwZV07CisgICAgZWxzZQorICAgICAgICByZXR1cm4gTlVMTDsKK30KKworZW51bSBBVkhXRGV2aWNlVHlwZSBhdl9od2RldmljZV9pdGVyYXRlX3R5cGVzKGVudW0gQVZIV0RldmljZVR5cGUgcHJldikKK3sKKyAgICBlbnVtIEFWSFdEZXZpY2VUeXBlIG5leHQ7CisgICAgaW50IGksIHNldCA9IDA7CisgICAgZm9yIChpID0gMDsgaHdfdGFibGVbaV07IGkrKykgeworICAgICAgICBpZiAocHJldiAhPSBBVl9IV0RFVklDRV9UWVBFX05PTkUgJiYgaHdfdGFibGVbaV0tPnR5cGUgPD0gcHJldikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXNldCB8fCBod190YWJsZVtpXS0+dHlwZSA8IG5leHQpIHsKKyAgICAgICAgICAgIG5leHQgPSBod190YWJsZVtpXS0+dHlwZTsKKyAgICAgICAgICAgIHNldCA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNldCA/IG5leHQgOiBBVl9IV0RFVklDRV9UWVBFX05PTkU7Cit9CisKK3N0YXRpYyBjb25zdCBBVkNsYXNzIGh3ZGV2aWNlX2N0eF9jbGFzcyA9IHsKKyAgICAuY2xhc3NfbmFtZSA9ICJBVkhXRGV2aWNlQ29udGV4dCIsCisgICAgLml0ZW1fbmFtZSAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKKyAgICAudmVyc2lvbiAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKK307CisKK3N0YXRpYyB2b2lkIGh3ZGV2aWNlX2N0eF9mcmVlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0KilkYXRhOworCisgICAgLyogdW5pbml0IG1pZ2h0IHN0aWxsIHdhbnQgYWNjZXNzIHRoZSBodyBjb250ZXh0IGFuZCB0aGUgdXNlcgorICAgICAqIGZyZWUoKSBjYWxsYmFjayBtaWdodCBkZXN0cm95IGl0LCBzbyB1bmluaXQgaGFzIHRvIGJlIGNhbGxlZCBmaXJzdCAqLworICAgIGlmIChjdHgtPmludGVybmFsLT5od190eXBlLT5kZXZpY2VfdW5pbml0KQorICAgICAgICBjdHgtPmludGVybmFsLT5od190eXBlLT5kZXZpY2VfdW5pbml0KGN0eCk7CisKKyAgICBpZiAoY3R4LT5mcmVlKQorICAgICAgICBjdHgtPmZyZWUoY3R4KTsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmY3R4LT5pbnRlcm5hbC0+c291cmNlX2RldmljZSk7CisKKyAgICBhdl9mcmVlcCgmY3R4LT5od2N0eCk7CisgICAgYXZfZnJlZXAoJmN0eC0+aW50ZXJuYWwtPnByaXYpOworICAgIGF2X2ZyZWVwKCZjdHgtPmludGVybmFsKTsKKyAgICBhdl9mcmVlcCgmY3R4KTsKK30KKworQVZCdWZmZXJSZWYgKmF2X2h3ZGV2aWNlX2N0eF9hbGxvYyhlbnVtIEFWSFdEZXZpY2VUeXBlIHR5cGUpCit7CisgICAgQVZIV0RldmljZUNvbnRleHQgKmN0eDsKKyAgICBBVkJ1ZmZlclJlZiAqYnVmOworICAgIGNvbnN0IEhXQ29udGV4dFR5cGUgKmh3X3R5cGUgPSBOVUxMOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaHdfdGFibGVbaV07IGkrKykgeworICAgICAgICBpZiAoaHdfdGFibGVbaV0tPnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgaHdfdHlwZSA9IGh3X3RhYmxlW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFod190eXBlKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGN0eCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjdHgpKTsKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjdHgtPmludGVybmFsID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eC0+aW50ZXJuYWwpKTsKKyAgICBpZiAoIWN0eC0+aW50ZXJuYWwpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGlmIChod190eXBlLT5kZXZpY2VfcHJpdl9zaXplKSB7CisgICAgICAgIGN0eC0+aW50ZXJuYWwtPnByaXYgPSBhdl9tYWxsb2N6KGh3X3R5cGUtPmRldmljZV9wcml2X3NpemUpOworICAgICAgICBpZiAoIWN0eC0+aW50ZXJuYWwtPnByaXYpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaWYgKGh3X3R5cGUtPmRldmljZV9od2N0eF9zaXplKSB7CisgICAgICAgIGN0eC0+aHdjdHggPSBhdl9tYWxsb2N6KGh3X3R5cGUtPmRldmljZV9od2N0eF9zaXplKTsKKyAgICAgICAgaWYgKCFjdHgtPmh3Y3R4KQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGJ1ZiA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QqKWN0eCwgc2l6ZW9mKCpjdHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdkZXZpY2VfY3R4X2ZyZWUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7CisgICAgaWYgKCFidWYpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGN0eC0+dHlwZSAgICAgPSB0eXBlOworICAgIGN0eC0+YXZfY2xhc3MgPSAmaHdkZXZpY2VfY3R4X2NsYXNzOworCisgICAgY3R4LT5pbnRlcm5hbC0+aHdfdHlwZSA9IGh3X3R5cGU7CisKKyAgICByZXR1cm4gYnVmOworCitmYWlsOgorICAgIGlmIChjdHgtPmludGVybmFsKQorICAgICAgICBhdl9mcmVlcCgmY3R4LT5pbnRlcm5hbC0+cHJpdik7CisgICAgYXZfZnJlZXAoJmN0eC0+aW50ZXJuYWwpOworICAgIGF2X2ZyZWVwKCZjdHgtPmh3Y3R4KTsKKyAgICBhdl9mcmVlcCgmY3R4KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworaW50IGF2X2h3ZGV2aWNlX2N0eF9pbml0KEFWQnVmZmVyUmVmICpyZWYpCit7CisgICAgQVZIV0RldmljZUNvbnRleHQgKmN0eCA9IChBVkhXRGV2aWNlQ29udGV4dCopcmVmLT5kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZGV2aWNlX2luaXQpIHsKKyAgICAgICAgcmV0ID0gY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZGV2aWNlX2luaXQoY3R4KTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcmV0dXJuIDA7CitmYWlsOgorICAgIGlmIChjdHgtPmludGVybmFsLT5od190eXBlLT5kZXZpY2VfdW5pbml0KQorICAgICAgICBjdHgtPmludGVybmFsLT5od190eXBlLT5kZXZpY2VfdW5pbml0KGN0eCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IEFWQ2xhc3MgaHdmcmFtZV9jdHhfY2xhc3MgPSB7CisgICAgLmNsYXNzX25hbWUgPSAiQVZIV0ZyYW1lc0NvbnRleHQiLAorICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCit9OworCitzdGF0aWMgdm9pZCBod2ZyYW1lX2N0eF9mcmVlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilkYXRhOworCisgICAgaWYgKGN0eC0+aW50ZXJuYWwtPnBvb2xfaW50ZXJuYWwpCisgICAgICAgIGF2X2J1ZmZlcl9wb29sX3VuaW5pdCgmY3R4LT5pbnRlcm5hbC0+cG9vbF9pbnRlcm5hbCk7CisKKyAgICBpZiAoY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZnJhbWVzX3VuaW5pdCkKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZnJhbWVzX3VuaW5pdChjdHgpOworCisgICAgaWYgKGN0eC0+ZnJlZSkKKyAgICAgICAgY3R4LT5mcmVlKGN0eCk7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmN0eC0+aW50ZXJuYWwtPnNvdXJjZV9mcmFtZXMpOworCisgICAgYXZfYnVmZmVyX3VucmVmKCZjdHgtPmRldmljZV9yZWYpOworCisgICAgYXZfZnJlZXAoJmN0eC0+aHdjdHgpOworICAgIGF2X2ZyZWVwKCZjdHgtPmludGVybmFsLT5wcml2KTsKKyAgICBhdl9mcmVlcCgmY3R4LT5pbnRlcm5hbCk7CisgICAgYXZfZnJlZXAoJmN0eCk7Cit9CisKK0FWQnVmZmVyUmVmICphdl9od2ZyYW1lX2N0eF9hbGxvYyhBVkJ1ZmZlclJlZiAqZGV2aWNlX3JlZl9pbikKK3sKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqZGV2aWNlX2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCopZGV2aWNlX3JlZl9pbi0+ZGF0YTsKKyAgICBjb25zdCBIV0NvbnRleHRUeXBlICAqaHdfdHlwZSA9IGRldmljZV9jdHgtPmludGVybmFsLT5od190eXBlOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpjdHg7CisgICAgQVZCdWZmZXJSZWYgKmJ1ZiwgKmRldmljZV9yZWYgPSBOVUxMOworCisgICAgY3R4ID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eCkpOworICAgIGlmICghY3R4KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGN0eC0+aW50ZXJuYWwgPSBhdl9tYWxsb2N6KHNpemVvZigqY3R4LT5pbnRlcm5hbCkpOworICAgIGlmICghY3R4LT5pbnRlcm5hbCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaWYgKGh3X3R5cGUtPmZyYW1lc19wcml2X3NpemUpIHsKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+cHJpdiA9IGF2X21hbGxvY3ooaHdfdHlwZS0+ZnJhbWVzX3ByaXZfc2l6ZSk7CisgICAgICAgIGlmICghY3R4LT5pbnRlcm5hbC0+cHJpdikKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoaHdfdHlwZS0+ZnJhbWVzX2h3Y3R4X3NpemUpIHsKKyAgICAgICAgY3R4LT5od2N0eCA9IGF2X21hbGxvY3ooaHdfdHlwZS0+ZnJhbWVzX2h3Y3R4X3NpemUpOworICAgICAgICBpZiAoIWN0eC0+aHdjdHgpCisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZGV2aWNlX3JlZiA9IGF2X2J1ZmZlcl9yZWYoZGV2aWNlX3JlZl9pbik7CisgICAgaWYgKCFkZXZpY2VfcmVmKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBidWYgPSBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90KiljdHgsIHNpemVvZigqY3R4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3ZnJhbWVfY3R4X2ZyZWUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7CisgICAgaWYgKCFidWYpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGN0eC0+YXZfY2xhc3MgICA9ICZod2ZyYW1lX2N0eF9jbGFzczsKKyAgICBjdHgtPmRldmljZV9yZWYgPSBkZXZpY2VfcmVmOworICAgIGN0eC0+ZGV2aWNlX2N0eCA9IGRldmljZV9jdHg7CisgICAgY3R4LT5mb3JtYXQgICAgID0gQVZfUElYX0ZNVF9OT05FOworICAgIGN0eC0+c3dfZm9ybWF0ICA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIGN0eC0+aW50ZXJuYWwtPmh3X3R5cGUgPSBod190eXBlOworCisgICAgcmV0dXJuIGJ1ZjsKKworZmFpbDoKKyAgICBpZiAoZGV2aWNlX3JlZikKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZkZXZpY2VfcmVmKTsKKyAgICBpZiAoY3R4LT5pbnRlcm5hbCkKKyAgICAgICAgYXZfZnJlZXAoJmN0eC0+aW50ZXJuYWwtPnByaXYpOworICAgIGF2X2ZyZWVwKCZjdHgtPmludGVybmFsKTsKKyAgICBhdl9mcmVlcCgmY3R4LT5od2N0eCk7CisgICAgYXZfZnJlZXAoJmN0eCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaHdmcmFtZV9wb29sX3ByZWFsbG9jKEFWQnVmZmVyUmVmICpyZWYpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopcmVmLT5kYXRhOworICAgIEFWRnJhbWUgKipmcmFtZXM7CisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBmcmFtZXMgPSBhdl9tYWxsb2N6X2FycmF5KGN0eC0+aW5pdGlhbF9wb29sX3NpemUsIHNpemVvZigqZnJhbWVzKSk7CisgICAgaWYgKCFmcmFtZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZTsgaSsrKSB7CisgICAgICAgIGZyYW1lc1tpXSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgICAgIGlmICghZnJhbWVzW2ldKQorICAgICAgICAgICAgZ290byBmYWlsOworCisgICAgICAgIHJldCA9IGF2X2h3ZnJhbWVfZ2V0X2J1ZmZlcihyZWYsIGZyYW1lc1tpXSwgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgIH0KKworZmFpbDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZTsgaSsrKQorICAgICAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZXNbaV0pOworICAgIGF2X2ZyZWVwKCZmcmFtZXMpOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGF2X2h3ZnJhbWVfY3R4X2luaXQoQVZCdWZmZXJSZWYgKnJlZikKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilyZWYtPmRhdGE7CisgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10OworICAgIGludCByZXQ7CisKKyAgICBpZiAoY3R4LT5pbnRlcm5hbC0+c291cmNlX2ZyYW1lcykgeworICAgICAgICAvKiBBIGRlcml2ZWQgZnJhbWUgY29udGV4dCBpcyBhbHJlYWR5IGluaXRpYWxpc2VkLiAqLworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiB2YWxpZGF0ZSB0aGUgcGl4ZWwgZm9ybWF0ICovCisgICAgZm9yIChwaXhfZm10ID0gY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+cGl4X2ZtdHM7ICpwaXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORTsgcGl4X2ZtdCsrKSB7CisgICAgICAgIGlmICgqcGl4X2ZtdCA9PSBjdHgtPmZvcm1hdCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKnBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJUaGUgaGFyZHdhcmUgcGl4ZWwgZm9ybWF0ICclcycgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIHR5cGUgJyVzJ1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5mb3JtYXQpLCBjdHgtPmludGVybmFsLT5od190eXBlLT5uYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICAvKiB2YWxpZGF0ZSB0aGUgZGltZW5zaW9ucyAqLworICAgIHJldCA9IGF2X2ltYWdlX2NoZWNrX3NpemUoY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQsIDAsIGN0eCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiByZXQ7CisKKyAgICAvKiBmb3JtYXQtc3BlY2lmaWMgaW5pdCAqLworICAgIGlmIChjdHgtPmludGVybmFsLT5od190eXBlLT5mcmFtZXNfaW5pdCkgeworICAgICAgICByZXQgPSBjdHgtPmludGVybmFsLT5od190eXBlLT5mcmFtZXNfaW5pdChjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5pbnRlcm5hbC0+cG9vbF9pbnRlcm5hbCAmJiAhY3R4LT5wb29sKQorICAgICAgICBjdHgtPnBvb2wgPSBjdHgtPmludGVybmFsLT5wb29sX2ludGVybmFsOworCisgICAgLyogcHJlYWxsb2NhdGUgdGhlIGZyYW1lcyBpbiB0aGUgcG9vbCwgaWYgcmVxdWVzdGVkICovCisgICAgaWYgKGN0eC0+aW5pdGlhbF9wb29sX3NpemUgPiAwKSB7CisgICAgICAgIHJldCA9IGh3ZnJhbWVfcG9vbF9wcmVhbGxvYyhyZWYpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgaWYgKGN0eC0+aW50ZXJuYWwtPmh3X3R5cGUtPmZyYW1lc191bmluaXQpCisgICAgICAgIGN0eC0+aW50ZXJuYWwtPmh3X3R5cGUtPmZyYW1lc191bmluaXQoY3R4KTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfaHdmcmFtZV90cmFuc2Zlcl9nZXRfZm9ybWF0cyhBVkJ1ZmZlclJlZiAqaHdmcmFtZV9yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWSFdGcmFtZVRyYW5zZmVyRGlyZWN0aW9uIGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqKmZvcm1hdHMsIGludCBmbGFncykKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0Kilod2ZyYW1lX3JlZi0+ZGF0YTsKKworICAgIGlmICghY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+dHJhbnNmZXJfZ2V0X2Zvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisKKyAgICByZXR1cm4gY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+dHJhbnNmZXJfZ2V0X2Zvcm1hdHMoY3R4LCBkaXIsIGZvcm1hdHMpOworfQorCitzdGF0aWMgaW50IHRyYW5zZmVyX2RhdGFfYWxsb2MoQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmbGFncykKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilzcmMtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZGcmFtZSAqZnJhbWVfdG1wOworICAgIGludCByZXQgPSAwOworCisgICAgZnJhbWVfdG1wID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWZyYW1lX3RtcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIC8qIGlmIHRoZSBmb3JtYXQgaXMgc2V0LCB1c2UgdGhhdAorICAgICAqIG90aGVyd2lzZSBwaWNrIHRoZSBmaXJzdCBzdXBwb3J0ZWQgb25lICovCisgICAgaWYgKGRzdC0+Zm9ybWF0ID49IDApIHsKKyAgICAgICAgZnJhbWVfdG1wLT5mb3JtYXQgPSBkc3QtPmZvcm1hdDsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKmZvcm1hdHM7CisKKyAgICAgICAgcmV0ID0gYXZfaHdmcmFtZV90cmFuc2Zlcl9nZXRfZm9ybWF0cyhzcmMtPmh3X2ZyYW1lc19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSFdGUkFNRV9UUkFOU0ZFUl9ESVJFQ1RJT05fRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9ybWF0cywgMCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBmcmFtZV90bXAtPmZvcm1hdCA9IGZvcm1hdHNbMF07CisgICAgICAgIGF2X2ZyZWVwKCZmb3JtYXRzKTsKKyAgICB9CisgICAgZnJhbWVfdG1wLT53aWR0aCAgPSBjdHgtPndpZHRoOworICAgIGZyYW1lX3RtcC0+aGVpZ2h0ID0gY3R4LT5oZWlnaHQ7CisKKyAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKGZyYW1lX3RtcCwgMzIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSBhdl9od2ZyYW1lX3RyYW5zZmVyX2RhdGEoZnJhbWVfdG1wLCBzcmMsIGZsYWdzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZnJhbWVfdG1wLT53aWR0aCAgPSBzcmMtPndpZHRoOworICAgIGZyYW1lX3RtcC0+aGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisKKyAgICBhdl9mcmFtZV9tb3ZlX3JlZihkc3QsIGZyYW1lX3RtcCk7CisKK2ZhaWw6CisgICAgYXZfZnJhbWVfZnJlZSgmZnJhbWVfdG1wKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfaHdmcmFtZV90cmFuc2Zlcl9kYXRhKEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmN0eDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFkc3QtPmJ1ZlswXSkKKyAgICAgICAgcmV0dXJuIHRyYW5zZmVyX2RhdGFfYWxsb2MoZHN0LCBzcmMsIGZsYWdzKTsKKworICAgIGlmIChzcmMtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilzcmMtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICAgICAgcmV0ID0gY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+dHJhbnNmZXJfZGF0YV9mcm9tKGN0eCwgZHN0LCBzcmMpOworICAgICAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgfSBlbHNlIGlmIChkc3QtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0Kilkc3QtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICAgICAgcmV0ID0gY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+dHJhbnNmZXJfZGF0YV90byhjdHgsIGRzdCwgc3JjKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBhdl9od2ZyYW1lX2dldF9idWZmZXIoQVZCdWZmZXJSZWYgKmh3ZnJhbWVfcmVmLCBBVkZyYW1lICpmcmFtZSwgaW50IGZsYWdzKQoreworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpjdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWh3ZnJhbWVfcmVmLT5kYXRhOworICAgIGludCByZXQ7CisKKyAgICBpZiAoY3R4LT5pbnRlcm5hbC0+c291cmNlX2ZyYW1lcykgeworICAgICAgICAvLyBUaGlzIGlzIGEgZGVyaXZlZCBmcmFtZSBjb250ZXh0LCBzbyB3ZSBhbGxvY2F0ZSBpbiB0aGUgc291cmNlCisgICAgICAgIC8vIGFuZCBtYXAgdGhlIGZyYW1lIGltbWVkaWF0ZWx5LgorICAgICAgICBBVkZyYW1lICpzcmNfZnJhbWU7CisKKyAgICAgICAgZnJhbWUtPmZvcm1hdCA9IGN0eC0+Zm9ybWF0OworICAgICAgICBmcmFtZS0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoaHdmcmFtZV9yZWYpOworICAgICAgICBpZiAoIWZyYW1lLT5od19mcmFtZXNfY3R4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBzcmNfZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgICAgICBpZiAoIXNyY19mcmFtZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgcmV0ID0gYXZfaHdmcmFtZV9nZXRfYnVmZmVyKGN0eC0+aW50ZXJuYWwtPnNvdXJjZV9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZnJhbWUsIDApOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfZnJhbWVfZnJlZSgmc3JjX2ZyYW1lKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBhdl9od2ZyYW1lX21hcChmcmFtZSwgc3JjX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmludGVybmFsLT5zb3VyY2VfYWxsb2NhdGlvbl9tYXBfZmxhZ3MpOworICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbWFwIGZyYW1lIGludG8gZGVyaXZlZCAiCisgICAgICAgICAgICAgICAgICAgImZyYW1lIGNvbnRleHQ6ICVkLlxuIiwgcmV0KTsKKyAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJnNyY19mcmFtZSk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gRnJlZSB0aGUgc291cmNlIGZyYW1lIGltbWVkaWF0ZWx5IC0gdGhlIG1hcHBlZCBmcmFtZSBzdGlsbAorICAgICAgICAvLyBjb250YWlucyBhIHJlZmVyZW5jZSB0byBpdC4KKyAgICAgICAgYXZfZnJhbWVfZnJlZSgmc3JjX2ZyYW1lKTsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoIWN0eC0+aW50ZXJuYWwtPmh3X3R5cGUtPmZyYW1lc19nZXRfYnVmZmVyKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgaWYgKCFjdHgtPnBvb2wpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBmcmFtZS0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYoaHdmcmFtZV9yZWYpOworICAgIGlmICghZnJhbWUtPmh3X2ZyYW1lc19jdHgpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXQgPSBjdHgtPmludGVybmFsLT5od190eXBlLT5mcmFtZXNfZ2V0X2J1ZmZlcihjdHgsIGZyYW1lKTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9idWZmZXJfdW5yZWYoJmZyYW1lLT5od19mcmFtZXNfY3R4KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCAqYXZfaHdkZXZpY2VfaHdjb25maWdfYWxsb2MoQVZCdWZmZXJSZWYgKnJlZikKK3sKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0KilyZWYtPmRhdGE7CisgICAgY29uc3QgSFdDb250ZXh0VHlwZSAgKmh3X3R5cGUgPSBjdHgtPmludGVybmFsLT5od190eXBlOworCisgICAgaWYgKGh3X3R5cGUtPmRldmljZV9od2NvbmZpZ19zaXplID09IDApCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuIGF2X21hbGxvY3ooaHdfdHlwZS0+ZGV2aWNlX2h3Y29uZmlnX3NpemUpOworfQorCitBVkhXRnJhbWVzQ29uc3RyYWludHMgKmF2X2h3ZGV2aWNlX2dldF9od2ZyYW1lX2NvbnN0cmFpbnRzKEFWQnVmZmVyUmVmICpyZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmh3Y29uZmlnKQoreworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpjdHggPSAoQVZIV0RldmljZUNvbnRleHQqKXJlZi0+ZGF0YTsKKyAgICBjb25zdCBIV0NvbnRleHRUeXBlICAqaHdfdHlwZSA9IGN0eC0+aW50ZXJuYWwtPmh3X3R5cGU7CisgICAgQVZIV0ZyYW1lc0NvbnN0cmFpbnRzICpjb25zdHJhaW50czsKKworICAgIGlmICghaHdfdHlwZS0+ZnJhbWVzX2dldF9jb25zdHJhaW50cykKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjb25zdHJhaW50cyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpjb25zdHJhaW50cykpOworICAgIGlmICghY29uc3RyYWludHMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY29uc3RyYWludHMtPm1pbl93aWR0aCA9IGNvbnN0cmFpbnRzLT5taW5faGVpZ2h0ID0gMDsKKyAgICBjb25zdHJhaW50cy0+bWF4X3dpZHRoID0gY29uc3RyYWludHMtPm1heF9oZWlnaHQgPSBJTlRfTUFYOworCisgICAgaWYgKGh3X3R5cGUtPmZyYW1lc19nZXRfY29uc3RyYWludHMoY3R4LCBod2NvbmZpZywgY29uc3RyYWludHMpID49IDApIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRzOworICAgIH0gZWxzZSB7CisgICAgICAgIGF2X2h3ZnJhbWVfY29uc3RyYWludHNfZnJlZSgmY29uc3RyYWludHMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK3ZvaWQgYXZfaHdmcmFtZV9jb25zdHJhaW50c19mcmVlKEFWSFdGcmFtZXNDb25zdHJhaW50cyAqKmNvbnN0cmFpbnRzKQoreworICAgIGlmICgqY29uc3RyYWludHMpIHsKKyAgICAgICAgYXZfZnJlZXAoJigqY29uc3RyYWludHMpLT52YWxpZF9od19mb3JtYXRzKTsKKyAgICAgICAgYXZfZnJlZXAoJigqY29uc3RyYWludHMpLT52YWxpZF9zd19mb3JtYXRzKTsKKyAgICB9CisgICAgYXZfZnJlZXAoY29uc3RyYWludHMpOworfQorCitpbnQgYXZfaHdkZXZpY2VfY3R4X2NyZWF0ZShBVkJ1ZmZlclJlZiAqKnBkZXZpY2VfcmVmLCBlbnVtIEFWSFdEZXZpY2VUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2UsIEFWRGljdGlvbmFyeSAqb3B0cywgaW50IGZsYWdzKQoreworICAgIEFWQnVmZmVyUmVmICpkZXZpY2VfcmVmID0gTlVMTDsKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqZGV2aWNlX2N0eDsKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGRldmljZV9yZWYgPSBhdl9od2RldmljZV9jdHhfYWxsb2ModHlwZSk7CisgICAgaWYgKCFkZXZpY2VfcmVmKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICBkZXZpY2VfY3R4ID0gKEFWSFdEZXZpY2VDb250ZXh0KilkZXZpY2VfcmVmLT5kYXRhOworCisgICAgaWYgKCFkZXZpY2VfY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZGV2aWNlX2NyZWF0ZSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXQgPSBkZXZpY2VfY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZGV2aWNlX2NyZWF0ZShkZXZpY2VfY3R4LCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cywgZmxhZ3MpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSBhdl9od2RldmljZV9jdHhfaW5pdChkZXZpY2VfcmVmKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgKnBkZXZpY2VfcmVmID0gZGV2aWNlX3JlZjsKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgYXZfYnVmZmVyX3VucmVmKCZkZXZpY2VfcmVmKTsKKyAgICAqcGRldmljZV9yZWYgPSBOVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBhdl9od2RldmljZV9jdHhfY3JlYXRlX2Rlcml2ZWQoQVZCdWZmZXJSZWYgKipkc3RfcmVmX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkhXRGV2aWNlVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqc3JjX3JlZiwgaW50IGZsYWdzKQoreworICAgIEFWQnVmZmVyUmVmICpkc3RfcmVmID0gTlVMTCwgKnRtcF9yZWY7CisgICAgQVZIV0RldmljZUNvbnRleHQgKmRzdF9jdHgsICp0bXBfY3R4OworICAgIGludCByZXQgPSAwOworCisgICAgdG1wX3JlZiA9IHNyY19yZWY7CisgICAgd2hpbGUgKHRtcF9yZWYpIHsKKyAgICAgICAgdG1wX2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCopdG1wX3JlZi0+ZGF0YTsKKyAgICAgICAgaWYgKHRtcF9jdHgtPnR5cGUgPT0gdHlwZSkgeworICAgICAgICAgICAgZHN0X3JlZiA9IGF2X2J1ZmZlcl9yZWYodG1wX3JlZik7CisgICAgICAgICAgICBpZiAoIWRzdF9yZWYpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICB9CisgICAgICAgIHRtcF9yZWYgPSB0bXBfY3R4LT5pbnRlcm5hbC0+c291cmNlX2RldmljZTsKKyAgICB9CisKKyAgICBkc3RfcmVmID0gYXZfaHdkZXZpY2VfY3R4X2FsbG9jKHR5cGUpOworICAgIGlmICghZHN0X3JlZikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgZHN0X2N0eCA9IChBVkhXRGV2aWNlQ29udGV4dCopZHN0X3JlZi0+ZGF0YTsKKworICAgIHRtcF9yZWYgPSBzcmNfcmVmOworICAgIHdoaWxlICh0bXBfcmVmKSB7CisgICAgICAgIHRtcF9jdHggPSAoQVZIV0RldmljZUNvbnRleHQqKXRtcF9yZWYtPmRhdGE7CisgICAgICAgIGlmIChkc3RfY3R4LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZGV2aWNlX2Rlcml2ZSkgeworICAgICAgICAgICAgcmV0ID0gZHN0X2N0eC0+aW50ZXJuYWwtPmh3X3R5cGUtPmRldmljZV9kZXJpdmUoZHN0X2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgICAgICBkc3RfY3R4LT5pbnRlcm5hbC0+c291cmNlX2RldmljZSA9IGF2X2J1ZmZlcl9yZWYoc3JjX3JlZik7CisgICAgICAgICAgICAgICAgaWYgKCFkc3RfY3R4LT5pbnRlcm5hbC0+c291cmNlX2RldmljZSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBkb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVOT1NZUykpCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIHRtcF9yZWYgPSB0bXBfY3R4LT5pbnRlcm5hbC0+c291cmNlX2RldmljZTsKKyAgICB9CisKKyAgICByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgZ290byBmYWlsOworCitkb25lOgorICAgIHJldCA9IGF2X2h3ZGV2aWNlX2N0eF9pbml0KGRzdF9yZWYpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAqZHN0X3JlZl9wdHIgPSBkc3RfcmVmOworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2J1ZmZlcl91bnJlZigmZHN0X3JlZik7CisgICAgKmRzdF9yZWZfcHRyID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBmZl9od2ZyYW1lX3VubWFwKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBIV01hcERlc2NyaXB0b3IgKmh3bWFwID0gKEhXTWFwRGVzY3JpcHRvciopZGF0YTsKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqY3R4ID0gb3BhcXVlOworCisgICAgaWYgKGh3bWFwLT51bm1hcCkKKyAgICAgICAgaHdtYXAtPnVubWFwKGN0eCwgaHdtYXApOworCisgICAgYXZfZnJhbWVfZnJlZSgmaHdtYXAtPnNvdXJjZSk7CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJmh3bWFwLT5od19mcmFtZXNfY3R4KTsKKworICAgIGF2X2ZyZWUoaHdtYXApOworfQorCitpbnQgZmZfaHdmcmFtZV9tYXBfY3JlYXRlKEFWQnVmZmVyUmVmICpod2ZyYW1lX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCp1bm1hcCkoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV01hcERlc2NyaXB0b3IgKmh3bWFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHJpdikKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0Kilod2ZyYW1lX3JlZi0+ZGF0YTsKKyAgICBIV01hcERlc2NyaXB0b3IgKmh3bWFwOworICAgIGludCByZXQ7CisKKyAgICBod21hcCA9IGF2X21hbGxvY3ooc2l6ZW9mKCpod21hcCkpOworICAgIGlmICghaHdtYXApIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgaHdtYXAtPnNvdXJjZSA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFod21hcC0+c291cmNlKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKyAgICByZXQgPSBhdl9mcmFtZV9yZWYoaHdtYXAtPnNvdXJjZSwgc3JjKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgaHdtYXAtPmh3X2ZyYW1lc19jdHggPSBhdl9idWZmZXJfcmVmKGh3ZnJhbWVfcmVmKTsKKyAgICBpZiAoIWh3bWFwLT5od19mcmFtZXNfY3R4KSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGh3bWFwLT51bm1hcCA9IHVubWFwOworICAgIGh3bWFwLT5wcml2ICA9IHByaXY7CisKKyAgICBkc3QtPmJ1ZlswXSA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QqKWh3bWFwLCBzaXplb2YoKmh3bWFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZmX2h3ZnJhbWVfdW5tYXAsIGN0eCwgMCk7CisgICAgaWYgKCFkc3QtPmJ1ZlswXSkgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBpZiAoaHdtYXApIHsKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZod21hcC0+aHdfZnJhbWVzX2N0eCk7CisgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJmh3bWFwLT5zb3VyY2UpOworICAgIH0KKyAgICBhdl9mcmVlKGh3bWFwKTsKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgYXZfaHdmcmFtZV9tYXAoQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmbGFncykKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqc3JjX2ZyYW1lcywgKmRzdF9mcmFtZXM7CisgICAgSFdNYXBEZXNjcmlwdG9yICpod21hcDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKHNyYy0+aHdfZnJhbWVzX2N0eCAmJiBkc3QtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgc3JjX2ZyYW1lcyA9IChBVkhXRnJhbWVzQ29udGV4dCopc3JjLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgICAgICBkc3RfZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0Kilkc3QtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICAgICAgaWYgKChzcmNfZnJhbWVzID09IGRzdF9mcmFtZXMgJiYKKyAgICAgICAgICAgICBzcmMtPmZvcm1hdCA9PSBkc3RfZnJhbWVzLT5zd19mb3JtYXQgJiYKKyAgICAgICAgICAgICBkc3QtPmZvcm1hdCA9PSBkc3RfZnJhbWVzLT5mb3JtYXQpIHx8CisgICAgICAgICAgICAoc3JjX2ZyYW1lcy0+aW50ZXJuYWwtPnNvdXJjZV9mcmFtZXMgJiYKKyAgICAgICAgICAgICBzcmNfZnJhbWVzLT5pbnRlcm5hbC0+c291cmNlX2ZyYW1lcy0+ZGF0YSA9PQorICAgICAgICAgICAgICh1aW50OF90Kilkc3RfZnJhbWVzKSkgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiB1bm1hcCBvcGVyYXRpb24uICBXZSBkb24ndCBuZWVkIHRvIGRpcmVjdGx5CisgICAgICAgICAgICAvLyBkbyBhbnl0aGluZyBoZXJlIG90aGVyIHRoYW4gZmlsbCBpbiB0aGUgb3JpZ2luYWwgZnJhbWUsCisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSByZWFsIHVubWFwIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBsYXN0CisgICAgICAgICAgICAvLyByZWZlcmVuY2UgdG8gdGhlIG1hcHBlZCBmcmFtZSBkaXNhcHBlYXJzLgorICAgICAgICAgICAgaWYgKCFzcmMtPmJ1ZlswXSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhzcmNfZnJhbWVzLCBBVl9MT0dfRVJST1IsICJJbnZhbGlkIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAiZm91bmQgd2hlbiBhdHRlbXB0aW5nIHVubWFwLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh3bWFwID0gKEhXTWFwRGVzY3JpcHRvciopc3JjLT5idWZbMF0tPmRhdGE7CisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihkc3QpOworICAgICAgICAgICAgcmV0dXJuIGF2X2ZyYW1lX3JlZihkc3QsIGh3bWFwLT5zb3VyY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNyYy0+aHdfZnJhbWVzX2N0eCkgeworICAgICAgICBzcmNfZnJhbWVzID0gKEFWSFdGcmFtZXNDb250ZXh0KilzcmMtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyAgICAgICAgaWYgKHNyY19mcmFtZXMtPmZvcm1hdCA9PSBzcmMtPmZvcm1hdCAmJgorICAgICAgICAgICAgc3JjX2ZyYW1lcy0+aW50ZXJuYWwtPmh3X3R5cGUtPm1hcF9mcm9tKSB7CisgICAgICAgICAgICByZXQgPSBzcmNfZnJhbWVzLT5pbnRlcm5hbC0+aHdfdHlwZS0+bWFwX2Zyb20oc3JjX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIHNyYywgZmxhZ3MpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBVkVSUk9SKEVOT1NZUykpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkc3QtPmh3X2ZyYW1lc19jdHgpIHsKKyAgICAgICAgZHN0X2ZyYW1lcyA9IChBVkhXRnJhbWVzQ29udGV4dCopZHN0LT5od19mcmFtZXNfY3R4LT5kYXRhOworCisgICAgICAgIGlmIChkc3RfZnJhbWVzLT5mb3JtYXQgPT0gZHN0LT5mb3JtYXQgJiYKKyAgICAgICAgICAgIGRzdF9mcmFtZXMtPmludGVybmFsLT5od190eXBlLT5tYXBfdG8pIHsKKyAgICAgICAgICAgIHJldCA9IGRzdF9mcmFtZXMtPmludGVybmFsLT5od190eXBlLT5tYXBfdG8oZHN0X2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBzcmMsIGZsYWdzKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQVZFUlJPUihFTk9TWVMpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorCitpbnQgYXZfaHdmcmFtZV9jdHhfY3JlYXRlX2Rlcml2ZWQoQVZCdWZmZXJSZWYgKipkZXJpdmVkX2ZyYW1lX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpkZXJpdmVkX2RldmljZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKnNvdXJjZV9mcmFtZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIEFWQnVmZmVyUmVmICAgKmRzdF9yZWYgPSBOVUxMOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpkc3QgPSBOVUxMOworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpzcmMgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKXNvdXJjZV9mcmFtZV9jdHgtPmRhdGE7CisgICAgaW50IHJldDsKKworICAgIGlmIChzcmMtPmludGVybmFsLT5zb3VyY2VfZnJhbWVzKSB7CisgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpzcmNfc3JjID0KKyAgICAgICAgICAgIChBVkhXRnJhbWVzQ29udGV4dCopc3JjLT5pbnRlcm5hbC0+c291cmNlX2ZyYW1lcy0+ZGF0YTsKKyAgICAgICAgQVZIV0RldmljZUNvbnRleHQgKmRzdF9kZXYgPQorICAgICAgICAgICAgKEFWSFdEZXZpY2VDb250ZXh0KilkZXJpdmVkX2RldmljZV9jdHgtPmRhdGE7CisKKyAgICAgICAgaWYgKHNyY19zcmMtPmRldmljZV9jdHggPT0gZHN0X2RldikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBhY3R1YWxseSBhbiB1bm1hcHBpbmcsIHNvIHdlIGp1c3QgcmV0dXJuIGEKKyAgICAgICAgICAgIC8vIHJlZmVyZW5jZSB0byB0aGUgc291cmNlIGZyYW1lIGNvbnRleHQuCisgICAgICAgICAgICAqZGVyaXZlZF9mcmFtZV9jdHggPQorICAgICAgICAgICAgICAgIGF2X2J1ZmZlcl9yZWYoc3JjLT5pbnRlcm5hbC0+c291cmNlX2ZyYW1lcyk7CisgICAgICAgICAgICBpZiAoISpkZXJpdmVkX2ZyYW1lX2N0eCkgeworICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRzdF9yZWYgPSBhdl9od2ZyYW1lX2N0eF9hbGxvYyhkZXJpdmVkX2RldmljZV9jdHgpOworICAgIGlmICghZHN0X3JlZikgeworICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBkc3QgPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWRzdF9yZWYtPmRhdGE7CisKKyAgICBkc3QtPmZvcm1hdCAgICA9IGZvcm1hdDsKKyAgICBkc3QtPnN3X2Zvcm1hdCA9IHNyYy0+c3dfZm9ybWF0OworICAgIGRzdC0+d2lkdGggICAgID0gc3JjLT53aWR0aDsKKyAgICBkc3QtPmhlaWdodCAgICA9IHNyYy0+aGVpZ2h0OworCisgICAgZHN0LT5pbnRlcm5hbC0+c291cmNlX2ZyYW1lcyA9IGF2X2J1ZmZlcl9yZWYoc291cmNlX2ZyYW1lX2N0eCk7CisgICAgaWYgKCFkc3QtPmludGVybmFsLT5zb3VyY2VfZnJhbWVzKSB7CisgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGRzdC0+aW50ZXJuYWwtPnNvdXJjZV9hbGxvY2F0aW9uX21hcF9mbGFncyA9CisgICAgICAgIGZsYWdzICYgKEFWX0hXRlJBTUVfTUFQX1JFQUQgICAgICB8CisgICAgICAgICAgICAgICAgIEFWX0hXRlJBTUVfTUFQX1dSSVRFICAgICB8CisgICAgICAgICAgICAgICAgIEFWX0hXRlJBTUVfTUFQX09WRVJXUklURSB8CisgICAgICAgICAgICAgICAgIEFWX0hXRlJBTUVfTUFQX0RJUkVDVCk7CisKKyAgICByZXQgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgaWYgKHNyYy0+aW50ZXJuYWwtPmh3X3R5cGUtPmZyYW1lc19kZXJpdmVfZnJvbSkKKyAgICAgICAgcmV0ID0gc3JjLT5pbnRlcm5hbC0+aHdfdHlwZS0+ZnJhbWVzX2Rlcml2ZV9mcm9tKGRzdCwgc3JjLCBmbGFncyk7CisgICAgaWYgKHJldCA9PSBBVkVSUk9SKEVOT1NZUykgJiYKKyAgICAgICAgZHN0LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZnJhbWVzX2Rlcml2ZV90bykKKyAgICAgICAgcmV0ID0gZHN0LT5pbnRlcm5hbC0+aHdfdHlwZS0+ZnJhbWVzX2Rlcml2ZV90byhkc3QsIHNyYywgZmxhZ3MpOworICAgIGlmIChyZXQgPT0gQVZFUlJPUihFTk9TWVMpKQorICAgICAgICByZXQgPSAwOworICAgIGlmIChyZXQpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgICpkZXJpdmVkX2ZyYW1lX2N0eCA9IGRzdF9yZWY7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgaWYgKGRzdCkKKyAgICAgICAgYXZfYnVmZmVyX3VucmVmKCZkc3QtPmludGVybmFsLT5zb3VyY2VfZnJhbWVzKTsKKyAgICBhdl9idWZmZXJfdW5yZWYoJmRzdF9yZWYpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0LmggYi9saWJhdnV0aWwvaHdjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhNGI2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHQuaApAQCAtMCwwICsxLDU4NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9IV0NPTlRFWFRfSAorI2RlZmluZSBBVlVUSUxfSFdDT05URVhUX0gKKworI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImZyYW1lLmgiCisjaW5jbHVkZSAibG9nLmgiCisjaW5jbHVkZSAicGl4Zm10LmgiCisKK2VudW0gQVZIV0RldmljZVR5cGUgeworICAgIEFWX0hXREVWSUNFX1RZUEVfTk9ORSwKKyAgICBBVl9IV0RFVklDRV9UWVBFX1ZEUEFVLAorICAgIEFWX0hXREVWSUNFX1RZUEVfQ1VEQSwKKyAgICBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJLAorICAgIEFWX0hXREVWSUNFX1RZUEVfRFhWQTIsCisgICAgQVZfSFdERVZJQ0VfVFlQRV9RU1YsCisgICAgQVZfSFdERVZJQ0VfVFlQRV9WSURFT1RPT0xCT1gsCisgICAgQVZfSFdERVZJQ0VfVFlQRV9EM0QxMVZBLAorICAgIEFWX0hXREVWSUNFX1RZUEVfRFJNLAorICAgIEFWX0hXREVWSUNFX1RZUEVfT1BFTkNMLAorICAgIEFWX0hXREVWSUNFX1RZUEVfTUVESUFDT0RFQywKK307CisKK3R5cGVkZWYgc3RydWN0IEFWSFdEZXZpY2VJbnRlcm5hbCBBVkhXRGV2aWNlSW50ZXJuYWw7CisKKy8qKgorICogVGhpcyBzdHJ1Y3QgYWdncmVnYXRlcyBhbGwgdGhlIChoYXJkd2FyZS92ZW5kb3Itc3BlY2lmaWMpICJoaWdoLWxldmVsIiBzdGF0ZSwKKyAqIGkuZS4gc3RhdGUgdGhhdCBpcyBub3QgdGllZCB0byBhIGNvbmNyZXRlIHByb2Nlc3NpbmcgY29uZmlndXJhdGlvbi4KKyAqIEUuZy4sIGluIGFuIEFQSSB0aGF0IHN1cHBvcnRzIGhhcmR3YXJlLWFjY2VsZXJhdGVkIGVuY29kaW5nIGFuZCBkZWNvZGluZywKKyAqIHRoaXMgc3RydWN0IHdpbGwgKGlmIHBvc3NpYmxlKSB3cmFwIHRoZSBzdGF0ZSB0aGF0IGlzIGNvbW1vbiB0byBib3RoIGVuY29kaW5nCisgKiBhbmQgZGVjb2RpbmcgYW5kIGZyb20gd2hpY2ggc3BlY2lmaWMgaW5zdGFuY2VzIG9mIGVuY29kZXJzIG9yIGRlY29kZXJzIGNhbiBiZQorICogZGVyaXZlZC4KKyAqCisgKiBUaGlzIHN0cnVjdCBpcyByZWZlcmVuY2UtY291bnRlZCB3aXRoIHRoZSBBVkJ1ZmZlciBtZWNoYW5pc20uIFRoZQorICogYXZfaHdkZXZpY2VfY3R4X2FsbG9jKCkgY29uc3RydWN0b3IgeWllbGRzIGEgcmVmZXJlbmNlLCB3aG9zZSBkYXRhIGZpZWxkCisgKiBwb2ludHMgdG8gdGhlIGFjdHVhbCBBVkhXRGV2aWNlQ29udGV4dC4gRnVydGhlciBvYmplY3RzIGRlcml2ZWQgZnJvbQorICogQVZIV0RldmljZUNvbnRleHQgKHN1Y2ggYXMgQVZIV0ZyYW1lc0NvbnRleHQsIGRlc2NyaWJpbmcgYSBmcmFtZSBwb29sIHdpdGgKKyAqIHNwZWNpZmljIHByb3BlcnRpZXMpIHdpbGwgaG9sZCBhbiBpbnRlcm5hbCByZWZlcmVuY2UgdG8gaXQuIEFmdGVyIGFsbCB0aGUKKyAqIHJlZmVyZW5jZXMgYXJlIHJlbGVhc2VkLCB0aGUgQVZIV0RldmljZUNvbnRleHQgaXRzZWxmIHdpbGwgYmUgZnJlZWQsCisgKiBvcHRpb25hbGx5IGludm9raW5nIGEgdXNlci1zcGVjaWZpZWQgY2FsbGJhY2sgZm9yIHVuaW5pdGlhbGl6aW5nIHRoZSBoYXJkd2FyZQorICogc3RhdGUuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWSFdEZXZpY2VDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBBIGNsYXNzIGZvciBsb2dnaW5nLiBTZXQgYnkgYXZfaHdkZXZpY2VfY3R4X2FsbG9jKCkuCisgICAgICovCisgICAgY29uc3QgQVZDbGFzcyAqYXZfY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGRhdGEgdXNlZCBpbnRlcm5hbGx5IGJ5IGxpYmF2dXRpbC4gTXVzdCBub3QgYmUgYWNjZXNzZWQgaW4gYW55CisgICAgICogd2F5IGJ5IHRoZSBjYWxsZXIuCisgICAgICovCisgICAgQVZIV0RldmljZUludGVybmFsICppbnRlcm5hbDsKKworICAgIC8qKgorICAgICAqIFRoaXMgZmllbGQgaWRlbnRpZmllcyB0aGUgdW5kZXJseWluZyBBUEkgdXNlZCBmb3IgaGFyZHdhcmUgYWNjZXNzLgorICAgICAqCisgICAgICogVGhpcyBmaWVsZCBpcyBzZXQgd2hlbiB0aGlzIHN0cnVjdCBpcyBhbGxvY2F0ZWQgYW5kIG5ldmVyIGNoYW5nZWQKKyAgICAgKiBhZnRlcndhcmRzLgorICAgICAqLworICAgIGVudW0gQVZIV0RldmljZVR5cGUgdHlwZTsKKworICAgIC8qKgorICAgICAqIFRoZSBmb3JtYXQtc3BlY2lmaWMgZGF0YSwgYWxsb2NhdGVkIGFuZCBmcmVlZCBieSBsaWJhdnV0aWwgYWxvbmcgd2l0aAorICAgICAqIHRoaXMgY29udGV4dC4KKyAgICAgKgorICAgICAqIFNob3VsZCBiZSBjYXN0IGJ5IHRoZSB1c2VyIHRvIHRoZSBmb3JtYXQtc3BlY2lmaWMgY29udGV4dCBkZWZpbmVkIGluIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgaGVhZGVyIChod2NvbnRleHRfKi5oKSBhbmQgZmlsbGVkIGFzIGRlc2NyaWJlZCBpbiB0aGUKKyAgICAgKiBkb2N1bWVudGF0aW9uIGJlZm9yZSBjYWxsaW5nIGF2X2h3ZGV2aWNlX2N0eF9pbml0KCkuCisgICAgICoKKyAgICAgKiBBZnRlciBjYWxsaW5nIGF2X2h3ZGV2aWNlX2N0eF9pbml0KCkgdGhpcyBzdHJ1Y3Qgc2hvdWxkIG5vdCBiZSBtb2RpZmllZAorICAgICAqIGJ5IHRoZSBjYWxsZXIuCisgICAgICovCisgICAgdm9pZCAqaHdjdHg7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZpZWxkIG1heSBiZSBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgY2FsbGluZyBhdl9od2RldmljZV9jdHhfaW5pdCgpLgorICAgICAqCisgICAgICogSWYgbm9uLU5VTEwsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8KKyAgICAgKiB0aGlzIGNvbnRleHQgaXMgdW5yZWZlcmVuY2VkLCBpbW1lZGlhdGVseSBiZWZvcmUgaXQgaXMgZnJlZWQuCisgICAgICoKKyAgICAgKiBAbm90ZSB3aGVuIG90aGVyIG9iamVjdHMgKGUuZyBhbiBBVkhXRnJhbWVzQ29udGV4dCkgYXJlIGRlcml2ZWQgZnJvbSB0aGlzCisgICAgICogICAgICAgc3RydWN0LCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBhZnRlciBhbGwgc3VjaCBjaGlsZCBvYmplY3RzCisgICAgICogICAgICAgYXJlIGZ1bGx5IHVuaW5pdGlhbGl6ZWQgYW5kIHRoZWlyIHJlc3BlY3RpdmUgZGVzdHJ1Y3RvcnMgaW52b2tlZC4KKyAgICAgKi8KKyAgICB2b2lkICgqZnJlZSkoc3RydWN0IEFWSFdEZXZpY2VDb250ZXh0ICpjdHgpOworCisgICAgLyoqCisgICAgICogQXJiaXRyYXJ5IHVzZXIgZGF0YSwgdG8gYmUgdXNlZCBlLmcuIGJ5IHRoZSBmcmVlKCkgY2FsbGJhY2suCisgICAgICovCisgICAgdm9pZCAqdXNlcl9vcGFxdWU7Cit9IEFWSFdEZXZpY2VDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBBVkhXRnJhbWVzSW50ZXJuYWwgQVZIV0ZyYW1lc0ludGVybmFsOworCisvKioKKyAqIFRoaXMgc3RydWN0IGRlc2NyaWJlcyBhIHNldCBvciBwb29sIG9mICJoYXJkd2FyZSIgZnJhbWVzIChpLmUuIHRob3NlIHdpdGgKKyAqIGRhdGEgbm90IGxvY2F0ZWQgaW4gbm9ybWFsIHN5c3RlbSBtZW1vcnkpLiBBbGwgdGhlIGZyYW1lcyBpbiB0aGUgcG9vbCBhcmUKKyAqIGFzc3VtZWQgdG8gYmUgYWxsb2NhdGVkIGluIHRoZSBzYW1lIHdheSBhbmQgaW50ZXJjaGFuZ2VhYmxlLgorICoKKyAqIFRoaXMgc3RydWN0IGlzIHJlZmVyZW5jZS1jb3VudGVkIHdpdGggdGhlIEFWQnVmZmVyIG1lY2hhbmlzbSBhbmQgdGllZCB0byBhCisgKiBnaXZlbiBBVkhXRGV2aWNlQ29udGV4dCBpbnN0YW5jZS4gVGhlIGF2X2h3ZnJhbWVfY3R4X2FsbG9jKCkgY29uc3RydWN0b3IKKyAqIHlpZWxkcyBhIHJlZmVyZW5jZSwgd2hvc2UgZGF0YSBmaWVsZCBwb2ludHMgdG8gdGhlIGFjdHVhbCBBVkhXRnJhbWVzQ29udGV4dAorICogc3RydWN0LgorICovCit0eXBlZGVmIHN0cnVjdCBBVkhXRnJhbWVzQ29udGV4dCB7CisgICAgLyoqCisgICAgICogQSBjbGFzcyBmb3IgbG9nZ2luZy4KKyAgICAgKi8KKyAgICBjb25zdCBBVkNsYXNzICphdl9jbGFzczsKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgZGF0YSB1c2VkIGludGVybmFsbHkgYnkgbGliYXZ1dGlsLiBNdXN0IG5vdCBiZSBhY2Nlc3NlZCBpbiBhbnkKKyAgICAgKiB3YXkgYnkgdGhlIGNhbGxlci4KKyAgICAgKi8KKyAgICBBVkhXRnJhbWVzSW50ZXJuYWwgKmludGVybmFsOworCisgICAgLyoqCisgICAgICogQSByZWZlcmVuY2UgdG8gdGhlIHBhcmVudCBBVkhXRGV2aWNlQ29udGV4dC4gVGhpcyByZWZlcmVuY2UgaXMgb3duZWQgYW5kCisgICAgICogbWFuYWdlZCBieSB0aGUgZW5jbG9zaW5nIEFWSFdGcmFtZXNDb250ZXh0LCBidXQgdGhlIGNhbGxlciBtYXkgZGVyaXZlCisgICAgICogYWRkaXRpb25hbCByZWZlcmVuY2VzIGZyb20gaXQuCisgICAgICovCisgICAgQVZCdWZmZXJSZWYgKmRldmljZV9yZWY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGFyZW50IEFWSFdEZXZpY2VDb250ZXh0LiBUaGlzIGlzIHNpbXBseSBhIHBvaW50ZXIgdG8KKyAgICAgKiBkZXZpY2VfcmVmLT5kYXRhIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZS4KKyAgICAgKgorICAgICAqIFNldCBieSBsaWJhdnV0aWwgaW4gYXZfaHdmcmFtZV9jdHhfaW5pdCgpLgorICAgICAqLworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpkZXZpY2VfY3R4OworCisgICAgLyoqCisgICAgICogVGhlIGZvcm1hdC1zcGVjaWZpYyBkYXRhLCBhbGxvY2F0ZWQgYW5kIGZyZWVkIGF1dG9tYXRpY2FsbHkgYWxvbmcgd2l0aAorICAgICAqIHRoaXMgY29udGV4dC4KKyAgICAgKgorICAgICAqIFNob3VsZCBiZSBjYXN0IGJ5IHRoZSB1c2VyIHRvIHRoZSBmb3JtYXQtc3BlY2lmaWMgY29udGV4dCBkZWZpbmVkIGluIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgaGVhZGVyIChod2ZyYW1lXyouaCkgYW5kIGZpbGxlZCBhcyBkZXNjcmliZWQgaW4gdGhlCisgICAgICogZG9jdW1lbnRhdGlvbiBiZWZvcmUgY2FsbGluZyBhdl9od2ZyYW1lX2N0eF9pbml0KCkuCisgICAgICoKKyAgICAgKiBBZnRlciBhbnkgZnJhbWVzIHVzaW5nIHRoaXMgY29udGV4dCBhcmUgY3JlYXRlZCwgdGhlIGNvbnRlbnRzIG9mIHRoaXMKKyAgICAgKiBzdHJ1Y3Qgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgY2FsbGVyLgorICAgICAqLworICAgIHZvaWQgKmh3Y3R4OworCisgICAgLyoqCisgICAgICogVGhpcyBmaWVsZCBtYXkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIgYmVmb3JlIGNhbGxpbmcgYXZfaHdmcmFtZV9jdHhfaW5pdCgpLgorICAgICAqCisgICAgICogSWYgbm9uLU5VTEwsIHRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8KKyAgICAgKiB0aGlzIGNvbnRleHQgaXMgdW5yZWZlcmVuY2VkLCBpbW1lZGlhdGVseSBiZWZvcmUgaXQgaXMgZnJlZWQuCisgICAgICovCisgICAgdm9pZCAoKmZyZWUpKHN0cnVjdCBBVkhXRnJhbWVzQ29udGV4dCAqY3R4KTsKKworICAgIC8qKgorICAgICAqIEFyYml0cmFyeSB1c2VyIGRhdGEsIHRvIGJlIHVzZWQgZS5nLiBieSB0aGUgZnJlZSgpIGNhbGxiYWNrLgorICAgICAqLworICAgIHZvaWQgKnVzZXJfb3BhcXVlOworCisgICAgLyoqCisgICAgICogQSBwb29sIGZyb20gd2hpY2ggdGhlIGZyYW1lcyBhcmUgYWxsb2NhdGVkIGJ5IGF2X2h3ZnJhbWVfZ2V0X2J1ZmZlcigpLgorICAgICAqIFRoaXMgZmllbGQgbWF5IGJlIHNldCBieSB0aGUgY2FsbGVyIGJlZm9yZSBjYWxsaW5nIGF2X2h3ZnJhbWVfY3R4X2luaXQoKS4KKyAgICAgKiBUaGUgYnVmZmVycyByZXR1cm5lZCBieSBjYWxsaW5nIGF2X2J1ZmZlcl9wb29sX2dldCgpIG9uIHRoaXMgcG9vbCBtdXN0CisgICAgICogaGF2ZSB0aGUgcHJvcGVydGllcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gaW4gdGhlIGNvcnJlc3BvbmRpbmcgaHcKKyAgICAgKiB0eXBlJ3MgaGVhZGVyIChod2NvbnRleHRfKi5oKS4gVGhlIHBvb2wgd2lsbCBiZSBmcmVlZCBzdHJpY3RseSBiZWZvcmUKKyAgICAgKiB0aGlzIHN0cnVjdCdzIGZyZWUoKSBjYWxsYmFjayBpcyBpbnZva2VkLgorICAgICAqCisgICAgICogVGhpcyBmaWVsZCBtYXkgYmUgTlVMTCwgdGhlbiBsaWJhdnV0aWwgd2lsbCBhdHRlbXB0IHRvIGFsbG9jYXRlIGEgcG9vbAorICAgICAqIGludGVybmFsbHkuIE5vdGUgdGhhdCBjZXJ0YWluIGRldmljZSB0eXBlcyBlbmZvcmNlIHBvb2xzIGFsbG9jYXRlZCBhdAorICAgICAqIGZpeGVkIHNpemUgKGZyYW1lIGNvdW50KSwgd2hpY2ggY2Fubm90IGJlIGV4dGVuZGVkIGR5bmFtaWNhbGx5LiBJbiBzdWNoIGEKKyAgICAgKiBjYXNlLCBpbml0aWFsX3Bvb2xfc2l6ZSBtdXN0IGJlIHNldCBhcHByb3ByaWF0ZWx5LgorICAgICAqLworICAgIEFWQnVmZmVyUG9vbCAqcG9vbDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWwgc2l6ZSBvZiB0aGUgZnJhbWUgcG9vbC4gSWYgYSBkZXZpY2UgdHlwZSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogZHluYW1pY2FsbHkgcmVzaXppbmcgdGhlIHBvb2wsIHRoZW4gdGhpcyBpcyBhbHNvIHRoZSBtYXhpbXVtIHBvb2wgc2l6ZS4KKyAgICAgKgorICAgICAqIE1heSBiZSBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgY2FsbGluZyBhdl9od2ZyYW1lX2N0eF9pbml0KCkuIE11c3QgYmUKKyAgICAgKiBzZXQgaWYgcG9vbCBpcyBOVUxMIGFuZCB0aGUgZGV2aWNlIHR5cGUgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIHBvb2xzLgorICAgICAqLworICAgIGludCBpbml0aWFsX3Bvb2xfc2l6ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBwaXhlbCBmb3JtYXQgaWRlbnRpZnlpbmcgdGhlIHVuZGVybHlpbmcgSFcgc3VyZmFjZSB0eXBlLgorICAgICAqCisgICAgICogTXVzdCBiZSBhIGh3YWNjZWwgZm9ybWF0LCBpLmUuIHRoZSBjb3JyZXNwb25kaW5nIGRlc2NyaXB0b3IgbXVzdCBoYXZlIHRoZQorICAgICAqIEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMIGZsYWcgc2V0LgorICAgICAqCisgICAgICogTXVzdCBiZSBzZXQgYnkgdGhlIHVzZXIgYmVmb3JlIGNhbGxpbmcgYXZfaHdmcmFtZV9jdHhfaW5pdCgpLgorICAgICAqLworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGl4ZWwgZm9ybWF0IGlkZW50aWZ5aW5nIHRoZSBhY3R1YWwgZGF0YSBsYXlvdXQgb2YgdGhlIGhhcmR3YXJlCisgICAgICogZnJhbWVzLgorICAgICAqCisgICAgICogTXVzdCBiZSBzZXQgYnkgdGhlIGNhbGxlciBiZWZvcmUgY2FsbGluZyBhdl9od2ZyYW1lX2N0eF9pbml0KCkuCisgICAgICoKKyAgICAgKiBAbm90ZSB3aGVuIHRoZSB1bmRlcmx5aW5nIEFQSSBkb2VzIG5vdCBwcm92aWRlIHRoZSBleGFjdCBkYXRhIGxheW91dCwgYnV0CisgICAgICogb25seSB0aGUgY29sb3JzcGFjZS9iaXQgZGVwdGgsIHRoaXMgZmllbGQgc2hvdWxkIGJlIHNldCB0byB0aGUgZnVsbHkKKyAgICAgKiBwbGFuYXIgdmVyc2lvbiBvZiB0aGF0IGZvcm1hdCAoZS5nLiBmb3IgOC1iaXQgNDIwIFlVViBpdCBzaG91bGQgYmUKKyAgICAgKiBBVl9QSVhfRk1UX1lVVjQyMFAsIG5vdCBBVl9QSVhfRk1UX05WMTIgb3IgYW55dGhpbmcgZWxzZSkuCisgICAgICovCisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHN3X2Zvcm1hdDsKKworICAgIC8qKgorICAgICAqIFRoZSBhbGxvY2F0ZWQgZGltZW5zaW9ucyBvZiB0aGUgZnJhbWVzIGluIHRoaXMgcG9vbC4KKyAgICAgKgorICAgICAqIE11c3QgYmUgc2V0IGJ5IHRoZSB1c2VyIGJlZm9yZSBjYWxsaW5nIGF2X2h3ZnJhbWVfY3R4X2luaXQoKS4KKyAgICAgKi8KKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKK30gQVZIV0ZyYW1lc0NvbnRleHQ7CisKKy8qKgorICogTG9vayB1cCBhbiBBVkhXRGV2aWNlVHlwZSBieSBuYW1lLgorICoKKyAqIEBwYXJhbSBuYW1lIFN0cmluZyBuYW1lIG9mIHRoZSBkZXZpY2UgdHlwZSAoY2FzZS1pbnNlbnNpdGl2ZSkuCisgKiBAcmV0dXJuIFRoZSB0eXBlIGZyb20gZW51bSBBVkhXRGV2aWNlVHlwZSwgb3IgQVZfSFdERVZJQ0VfVFlQRV9OT05FIGlmCisgKiAgICAgICAgIG5vdCBmb3VuZC4KKyAqLworZW51bSBBVkhXRGV2aWNlVHlwZSBhdl9od2RldmljZV9maW5kX3R5cGVfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworLyoqIEdldCB0aGUgc3RyaW5nIG5hbWUgb2YgYW4gQVZIV0RldmljZVR5cGUuCisgKgorICogQHBhcmFtIHR5cGUgVHlwZSBmcm9tIGVudW0gQVZIV0RldmljZVR5cGUuCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gYSBzdGF0aWMgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUsIG9yIE5VTEwgaWYgdGhlIHR5cGUKKyAqICAgICAgICAgaXMgbm90IHZhbGlkLgorICovCitjb25zdCBjaGFyICphdl9od2RldmljZV9nZXRfdHlwZV9uYW1lKGVudW0gQVZIV0RldmljZVR5cGUgdHlwZSk7CisKKy8qKgorICogSXRlcmF0ZSBvdmVyIHN1cHBvcnRlZCBkZXZpY2UgdHlwZXMuCisgKgorICogQHBhcmFtIHR5cGUgQVZfSFdERVZJQ0VfVFlQRV9OT05FIGluaXRpYWxseSwgdGhlbiB0aGUgcHJldmlvdXMgdHlwZQorICogICAgICAgICAgICAgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpbiBzdWJzZXF1ZW50IGl0ZXJhdGlvbnMuCisgKiBAcmV0dXJuIFRoZSBuZXh0IHVzYWJsZSBkZXZpY2UgdHlwZSBmcm9tIGVudW0gQVZIV0RldmljZVR5cGUsIG9yCisgKiAgICAgICAgIEFWX0hXREVWSUNFX1RZUEVfTk9ORSBpZiB0aGVyZSBhcmUgbm8gbW9yZS4KKyAqLworZW51bSBBVkhXRGV2aWNlVHlwZSBhdl9od2RldmljZV9pdGVyYXRlX3R5cGVzKGVudW0gQVZIV0RldmljZVR5cGUgcHJldik7CisKKy8qKgorICogQWxsb2NhdGUgYW4gQVZIV0RldmljZUNvbnRleHQgZm9yIGEgZ2l2ZW4gaGFyZHdhcmUgdHlwZS4KKyAqCisgKiBAcGFyYW0gdHlwZSB0aGUgdHlwZSBvZiB0aGUgaGFyZHdhcmUgZGV2aWNlIHRvIGFsbG9jYXRlLgorICogQHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgbmV3bHkgY3JlYXRlZCBBVkhXRGV2aWNlQ29udGV4dCBvbiBzdWNjZXNzIG9yIE5VTEwKKyAqICAgICAgICAgb24gZmFpbHVyZS4KKyAqLworQVZCdWZmZXJSZWYgKmF2X2h3ZGV2aWNlX2N0eF9hbGxvYyhlbnVtIEFWSFdEZXZpY2VUeXBlIHR5cGUpOworCisvKioKKyAqIEZpbmFsaXplIHRoZSBkZXZpY2UgY29udGV4dCBiZWZvcmUgdXNlLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyCisgKiB0aGUgY29udGV4dCBpcyBmaWxsZWQgd2l0aCBhbGwgdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uIGFuZCBiZWZvcmUgaXQgaXMKKyAqIHVzZWQgaW4gYW55IHdheS4KKyAqCisgKiBAcGFyYW0gcmVmIGEgcmVmZXJlbmNlIHRvIHRoZSBBVkhXRGV2aWNlQ29udGV4dAorICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGF2X2h3ZGV2aWNlX2N0eF9pbml0KEFWQnVmZmVyUmVmICpyZWYpOworCisvKioKKyAqIE9wZW4gYSBkZXZpY2Ugb2YgdGhlIHNwZWNpZmllZCB0eXBlIGFuZCBjcmVhdGUgYW4gQVZIV0RldmljZUNvbnRleHQgZm9yIGl0LgorICoKKyAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBpbnRlbmRlZCB0byBjb3ZlciB0aGUgc2ltcGxlIGNhc2VzLiBDYWxsZXJzCisgKiB3aG8gbmVlZCB0byBmaW5lLXR1bmUgZGV2aWNlIGNyZWF0aW9uL21hbmFnZW1lbnQgc2hvdWxkIG9wZW4gdGhlIGRldmljZQorICogbWFudWFsbHkgYW5kIHRoZW4gd3JhcCBpdCBpbiBhbiBBVkhXRGV2aWNlQ29udGV4dCB1c2luZworICogYXZfaHdkZXZpY2VfY3R4X2FsbG9jKCkvYXZfaHdkZXZpY2VfY3R4X2luaXQoKS4KKyAqCisgKiBUaGUgcmV0dXJuZWQgY29udGV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIGFuZCByZWFkeSBmb3IgdXNlLCB0aGUgY2FsbGVyCisgKiBzaG91bGQgbm90IGNhbGwgYXZfaHdkZXZpY2VfY3R4X2luaXQoKSBvbiBpdC4gVGhlIHVzZXJfb3BhcXVlL2ZyZWUgZmllbGRzIG9mCisgKiB0aGUgY3JlYXRlZCBBVkhXRGV2aWNlQ29udGV4dCBhcmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gYW5kIHNob3VsZCBub3QgYmUKKyAqIHRvdWNoZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2N0eCBPbiBzdWNjZXNzLCBhIHJlZmVyZW5jZSB0byB0aGUgbmV3bHktY3JlYXRlZCBkZXZpY2UgY29udGV4dAorICogICAgICAgICAgICAgICAgICAgd2lsbCBiZSB3cml0dGVuIGhlcmUuIFRoZSByZWZlcmVuY2UgaXMgb3duZWQgYnkgdGhlIGNhbGxlcgorICogICAgICAgICAgICAgICAgICAgYW5kIG11c3QgYmUgcmVsZWFzZWQgd2l0aCBhdl9idWZmZXJfdW5yZWYoKSB3aGVuIG5vIGxvbmdlcgorICogICAgICAgICAgICAgICAgICAgbmVlZGVkLiBPbiBmYWlsdXJlLCBOVUxMIHdpbGwgYmUgd3JpdHRlbiB0byB0aGlzIHBvaW50ZXIuCisgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgZGV2aWNlIHRvIGNyZWF0ZS4KKyAqIEBwYXJhbSBkZXZpY2UgQSB0eXBlLXNwZWNpZmljIHN0cmluZyBpZGVudGlmeWluZyB0aGUgZGV2aWNlIHRvIG9wZW4uCisgKiBAcGFyYW0gb3B0cyBBIGRpY3Rpb25hcnkgb2YgYWRkaXRpb25hbCAodHlwZS1zcGVjaWZpYykgb3B0aW9ucyB0byB1c2UgaW4KKyAqICAgICAgICAgICAgIG9wZW5pbmcgdGhlIGRldmljZS4gVGhlIGRpY3Rpb25hcnkgcmVtYWlucyBvd25lZCBieSB0aGUgY2FsbGVyLgorICogQHBhcmFtIGZsYWdzIGN1cnJlbnRseSB1bnVzZWQKKyAqCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGF2X2h3ZGV2aWNlX2N0eF9jcmVhdGUoQVZCdWZmZXJSZWYgKipkZXZpY2VfY3R4LCBlbnVtIEFWSFdEZXZpY2VUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2UsIEFWRGljdGlvbmFyeSAqb3B0cywgaW50IGZsYWdzKTsKKworLyoqCisgKiBDcmVhdGUgYSBuZXcgZGV2aWNlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBmcm9tIGFuIGV4aXN0aW5nIGRldmljZS4KKyAqCisgKiBJZiB0aGUgc291cmNlIGRldmljZSBpcyBhIGRldmljZSBvZiB0aGUgdGFyZ2V0IHR5cGUgb3Igd2FzIG9yaWdpbmFsbHkKKyAqIGRlcml2ZWQgZnJvbSBzdWNoIGEgZGV2aWNlIChwb3NzaWJseSB0aHJvdWdoIG9uZSBvciBtb3JlIGludGVybWVkaWF0ZQorICogZGV2aWNlcyBvZiBvdGhlciB0eXBlcyksIHRoZW4gdGhpcyB3aWxsIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUKKyAqIGV4aXN0aW5nIGRldmljZSBvZiB0aGUgc2FtZSB0eXBlIGFzIGlzIHJlcXVlc3RlZC4KKyAqCisgKiBPdGhlcndpc2UsIGl0IHdpbGwgYXR0ZW1wdCB0byBkZXJpdmUgYSBuZXcgZGV2aWNlIGZyb20gdGhlIGdpdmVuIHNvdXJjZQorICogZGV2aWNlLiAgSWYgZGlyZWN0IGRlcml2YXRpb24gdG8gdGhlIG5ldyB0eXBlIGlzIG5vdCBpbXBsZW1lbnRlZCwgaXQgd2lsbAorICogYXR0ZW1wdCB0aGUgc2FtZSBkZXJpdmF0aW9uIGZyb20gZWFjaCBhbmNlc3RvciBvZiB0aGUgc291cmNlIGRldmljZSBpbgorICogdHVybiBsb29raW5nIGZvciBhbiBpbXBsZW1lbnRlZCBkZXJpdmF0aW9uIG1ldGhvZC4KKyAqCisgKiBAcGFyYW0gZHN0X2N0eCBPbiBzdWNjZXNzLCBhIHJlZmVyZW5jZSB0byB0aGUgbmV3bHktY3JlYXRlZAorICogICAgICAgICAgICAgICAgQVZIV0RldmljZUNvbnRleHQuCisgKiBAcGFyYW0gdHlwZSAgICBUaGUgdHlwZSBvZiB0aGUgbmV3IGRldmljZSB0byBjcmVhdGUuCisgKiBAcGFyYW0gc3JjX2N0eCBBIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyBBVkhXRGV2aWNlQ29udGV4dCB3aGljaCB3aWxsIGJlCisgKiAgICAgICAgICAgICAgICB1c2VkIHRvIGNyZWF0ZSB0aGUgbmV3IGRldmljZS4KKyAqIEBwYXJhbSBmbGFncyAgIEN1cnJlbnRseSB1bnVzZWQ7IHNob3VsZCBiZSBzZXQgdG8gemVyby4KKyAqIEByZXR1cm4gICAgICAgIFplcm8gb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGF2X2h3ZGV2aWNlX2N0eF9jcmVhdGVfZGVyaXZlZChBVkJ1ZmZlclJlZiAqKmRzdF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZIV0RldmljZVR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZCdWZmZXJSZWYgKnNyY19jdHgsIGludCBmbGFncyk7CisKKworLyoqCisgKiBBbGxvY2F0ZSBhbiBBVkhXRnJhbWVzQ29udGV4dCB0aWVkIHRvIGEgZ2l2ZW4gZGV2aWNlIGNvbnRleHQuCisgKgorICogQHBhcmFtIGRldmljZV9jdHggYSByZWZlcmVuY2UgdG8gYSBBVkhXRGV2aWNlQ29udGV4dC4gVGhpcyBmdW5jdGlvbiB3aWxsIG1ha2UKKyAqICAgICAgICAgICAgICAgICAgIGEgbmV3IHJlZmVyZW5jZSBmb3IgaW50ZXJuYWwgdXNlLCB0aGUgb25lIHBhc3NlZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlbWFpbnMgb3duZWQgYnkgdGhlIGNhbGxlci4KKyAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgQVZIV0ZyYW1lc0NvbnRleHQgb24gc3VjY2VzcyBvciBOVUxMCisgKiAgICAgICAgIG9uIGZhaWx1cmUuCisgKi8KK0FWQnVmZmVyUmVmICphdl9od2ZyYW1lX2N0eF9hbGxvYyhBVkJ1ZmZlclJlZiAqZGV2aWNlX2N0eCk7CisKKy8qKgorICogRmluYWxpemUgdGhlIGNvbnRleHQgYmVmb3JlIHVzZS4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUKKyAqIGNvbnRleHQgaXMgZmlsbGVkIHdpdGggYWxsIHRoZSByZXF1aXJlZCBpbmZvcm1hdGlvbiBhbmQgYmVmb3JlIGl0IGlzIGF0dGFjaGVkCisgKiB0byBhbnkgZnJhbWVzLgorICoKKyAqIEBwYXJhbSByZWYgYSByZWZlcmVuY2UgdG8gdGhlIEFWSFdGcmFtZXNDb250ZXh0CisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgYXZfaHdmcmFtZV9jdHhfaW5pdChBVkJ1ZmZlclJlZiAqcmVmKTsKKworLyoqCisgKiBBbGxvY2F0ZSBhIG5ldyBmcmFtZSBhdHRhY2hlZCB0byB0aGUgZ2l2ZW4gQVZIV0ZyYW1lc0NvbnRleHQuCisgKgorICogQHBhcmFtIGh3ZnJhbWVfY3R4IGEgcmVmZXJlbmNlIHRvIGFuIEFWSFdGcmFtZXNDb250ZXh0CisgKiBAcGFyYW0gZnJhbWUgYW4gZW1wdHkgKGZyZXNobHkgYWxsb2NhdGVkIG9yIHVucmVmZmVkKSBmcmFtZSB0byBiZSBmaWxsZWQgd2l0aAorICogICAgICAgICAgICAgIG5ld2x5IGFsbG9jYXRlZCBidWZmZXJzLgorICogQHBhcmFtIGZsYWdzIGN1cnJlbnRseSB1bnVzZWQsIHNob3VsZCBiZSBzZXQgdG8gemVybworICogQHJldHVybiAwIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgQVZFUlJPUiBjb2RlIG9uIGZhaWx1cmUKKyAqLworaW50IGF2X2h3ZnJhbWVfZ2V0X2J1ZmZlcihBVkJ1ZmZlclJlZiAqaHdmcmFtZV9jdHgsIEFWRnJhbWUgKmZyYW1lLCBpbnQgZmxhZ3MpOworCisvKioKKyAqIENvcHkgZGF0YSB0byBvciBmcm9tIGEgaHcgc3VyZmFjZS4gQXQgbGVhc3Qgb25lIG9mIGRzdC9zcmMgbXVzdCBoYXZlIGFuCisgKiBBVkhXRnJhbWVzQ29udGV4dCBhdHRhY2hlZC4KKyAqCisgKiBJZiBzcmMgaGFzIGFuIEFWSFdGcmFtZXNDb250ZXh0IGF0dGFjaGVkLCB0aGVuIHRoZSBmb3JtYXQgb2YgZHN0IChpZiBzZXQpCisgKiBtdXN0IHVzZSBvbmUgb2YgdGhlIGZvcm1hdHMgcmV0dXJuZWQgYnkgYXZfaHdmcmFtZV90cmFuc2Zlcl9nZXRfZm9ybWF0cyhzcmMsCisgKiBBVl9IV0ZSQU1FX1RSQU5TRkVSX0RJUkVDVElPTl9GUk9NKS4KKyAqIElmIGRzdCBoYXMgYW4gQVZIV0ZyYW1lc0NvbnRleHQgYXR0YWNoZWQsIHRoZW4gdGhlIGZvcm1hdCBvZiBzcmMgbXVzdCB1c2Ugb25lCisgKiBvZiB0aGUgZm9ybWF0cyByZXR1cm5lZCBieSBhdl9od2ZyYW1lX3RyYW5zZmVyX2dldF9mb3JtYXRzKGRzdCwKKyAqIEFWX0hXRlJBTUVfVFJBTlNGRVJfRElSRUNUSU9OX1RPKQorICoKKyAqIGRzdCBtYXkgYmUgImNsZWFuIiAoaS5lLiB3aXRoIGRhdGEvYnVmIHBvaW50ZXJzIHVuc2V0KSwgaW4gd2hpY2ggY2FzZSB0aGUKKyAqIGRhdGEgYnVmZmVycyB3aWxsIGJlIGFsbG9jYXRlZCBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nIGF2X2ZyYW1lX2dldF9idWZmZXIoKS4KKyAqIElmIGRzdC0+Zm9ybWF0IGlzIHNldCwgdGhlbiB0aGlzIGZvcm1hdCB3aWxsIGJlIHVzZWQsIG90aGVyd2lzZSAod2hlbgorICogZHN0LT5mb3JtYXQgaXMgQVZfUElYX0ZNVF9OT05FKSB0aGUgZmlyc3QgYWNjZXB0YWJsZSBmb3JtYXQgd2lsbCBiZSBjaG9zZW4uCisgKgorICogVGhlIHR3byBmcmFtZXMgbXVzdCBoYXZlIG1hdGNoaW5nIGFsbG9jYXRlZCBkaW1lbnNpb25zIChpLmUuIGVxdWFsIHRvCisgKiBBVkhXRnJhbWVzQ29udGV4dC53aWR0aC9oZWlnaHQpLCBzaW5jZSBub3QgYWxsIGRldmljZSB0eXBlcyBzdXBwb3J0CisgKiB0cmFuc2ZlcnJpbmcgYSBzdWItcmVjdGFuZ2xlIG9mIHRoZSB3aG9sZSBzdXJmYWNlLiBUaGUgZGlzcGxheSBkaW1lbnNpb25zCisgKiAoaS5lLiBBVkZyYW1lLndpZHRoL2hlaWdodCkgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgYWxsb2NhdGVkIGRpbWVuc2lvbnMsIGJ1dAorICogYWxzbyBoYXZlIHRvIGJlIGVxdWFsIGZvciBib3RoIGZyYW1lcy4gV2hlbiB0aGUgZGlzcGxheSBkaW1lbnNpb25zIGFyZQorICogc21hbGxlciB0aGFuIHRoZSBhbGxvY2F0ZWQgZGltZW5zaW9ucywgdGhlIGNvbnRlbnQgb2YgdGhlIHBhZGRpbmcgaW4gdGhlCisgKiBkZXN0aW5hdGlvbiBmcmFtZSBpcyB1bnNwZWNpZmllZC4KKyAqCisgKiBAcGFyYW0gZHN0IHRoZSBkZXN0aW5hdGlvbiBmcmFtZS4gZHN0IGlzIG5vdCB0b3VjaGVkIG9uIGZhaWx1cmUuCisgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgZnJhbWUuCisgKiBAcGFyYW0gZmxhZ3MgY3VycmVudGx5IHVudXNlZCwgc2hvdWxkIGJlIHNldCB0byB6ZXJvCisgKiBAcmV0dXJuIDAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBBVkVSUk9SIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGF2X2h3ZnJhbWVfdHJhbnNmZXJfZGF0YShBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKTsKKworZW51bSBBVkhXRnJhbWVUcmFuc2ZlckRpcmVjdGlvbiB7CisgICAgLyoqCisgICAgICogVHJhbnNmZXIgdGhlIGRhdGEgZnJvbSB0aGUgcXVlcmllZCBodyBmcmFtZS4KKyAgICAgKi8KKyAgICBBVl9IV0ZSQU1FX1RSQU5TRkVSX0RJUkVDVElPTl9GUk9NLAorCisgICAgLyoqCisgICAgICogVHJhbnNmZXIgdGhlIGRhdGEgdG8gdGhlIHF1ZXJpZWQgaHcgZnJhbWUuCisgICAgICovCisgICAgQVZfSFdGUkFNRV9UUkFOU0ZFUl9ESVJFQ1RJT05fVE8sCit9OworCisvKioKKyAqIEdldCBhIGxpc3Qgb2YgcG9zc2libGUgc291cmNlIG9yIHRhcmdldCBmb3JtYXRzIHVzYWJsZSBpbgorICogYXZfaHdmcmFtZV90cmFuc2Zlcl9kYXRhKCkuCisgKgorICogQHBhcmFtIGh3ZnJhbWVfY3R4IHRoZSBmcmFtZSBjb250ZXh0IHRvIG9idGFpbiB0aGUgaW5mb3JtYXRpb24gZm9yCisgKiBAcGFyYW0gZGlyIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRyYW5zZmVyCisgKiBAcGFyYW0gZm9ybWF0cyB0aGUgcG9pbnRlciB0byB0aGUgb3V0cHV0IGZvcm1hdCBsaXN0IHdpbGwgYmUgd3JpdHRlbiBoZXJlLgorICogICAgICAgICAgICAgICAgVGhlIGxpc3QgaXMgdGVybWluYXRlZCB3aXRoIEFWX1BJWF9GTVRfTk9ORSBhbmQgbXVzdCBiZSBmcmVlZAorICogICAgICAgICAgICAgICAgYnkgdGhlIGNhbGxlciB3aGVuIG5vIGxvbmdlciBuZWVkZWQgdXNpbmcgYXZfZnJlZSgpLgorICogICAgICAgICAgICAgICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3NmdWxseSwgdGhlIGZvcm1hdCBsaXN0IHdpbGwKKyAqICAgICAgICAgICAgICAgIGhhdmUgYXQgbGVhc3Qgb25lIGl0ZW0gKG5vdCBjb3VudGluZyB0aGUgdGVybWluYXRvcikuCisgKiAgICAgICAgICAgICAgICBPbiBmYWlsdXJlLCB0aGUgY29udGVudHMgb2YgdGhpcyBwb2ludGVyIGFyZSB1bnNwZWNpZmllZC4KKyAqIEBwYXJhbSBmbGFncyBjdXJyZW50bHkgdW51c2VkLCBzaG91bGQgYmUgc2V0IHRvIHplcm8KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgYXZfaHdmcmFtZV90cmFuc2Zlcl9nZXRfZm9ybWF0cyhBVkJ1ZmZlclJlZiAqaHdmcmFtZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWSFdGcmFtZVRyYW5zZmVyRGlyZWN0aW9uIGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqKmZvcm1hdHMsIGludCBmbGFncyk7CisKKworLyoqCisgKiBUaGlzIHN0cnVjdCBkZXNjcmliZXMgdGhlIGNvbnN0cmFpbnRzIG9uIGhhcmR3YXJlIGZyYW1lcyBhdHRhY2hlZCB0bworICogYSBnaXZlbiBkZXZpY2Ugd2l0aCBhIGhhcmR3YXJlLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24uICBUaGlzIGlzIHJldHVybmVkCisgKiBieSBhdl9od2RldmljZV9nZXRfaHdmcmFtZV9jb25zdHJhaW50cygpIGFuZCBtdXN0IGJlIGZyZWVkIGJ5CisgKiBhdl9od2ZyYW1lX2NvbnN0cmFpbnRzX2ZyZWUoKSBhZnRlciB1c2UuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWSFdGcmFtZXNDb25zdHJhaW50cyB7CisgICAgLyoqCisgICAgICogQSBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcyBmb3IgZm9ybWF0IGluIHRoZSBod19mcmFtZXNfY3R4LAorICAgICAqIHRlcm1pbmF0ZWQgYnkgQVZfUElYX0ZNVF9OT05FLiAgVGhpcyBtZW1iZXIgd2lsbCBhbHdheXMgYmUgZmlsbGVkLgorICAgICAqLworICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqdmFsaWRfaHdfZm9ybWF0czsKKworICAgIC8qKgorICAgICAqIEEgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMgZm9yIHN3X2Zvcm1hdCBpbiB0aGUgaHdfZnJhbWVzX2N0eCwKKyAgICAgKiB0ZXJtaW5hdGVkIGJ5IEFWX1BJWF9GTVRfTk9ORS4gIENhbiBiZSBOVUxMIGlmIHRoaXMgaW5mb3JtYXRpb24gaXMKKyAgICAgKiBub3Qga25vd24uCisgICAgICovCisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICp2YWxpZF9zd19mb3JtYXRzOworCisgICAgLyoqCisgICAgICogVGhlIG1pbmltdW0gc2l6ZSBvZiBmcmFtZXMgaW4gdGhpcyBod19mcmFtZXNfY3R4LgorICAgICAqIChaZXJvIGlmIG5vdCBrbm93bi4pCisgICAgICovCisgICAgaW50IG1pbl93aWR0aDsKKyAgICBpbnQgbWluX2hlaWdodDsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgZnJhbWVzIGluIHRoaXMgaHdfZnJhbWVzX2N0eC4KKyAgICAgKiAoSU5UX01BWCBpZiBub3Qga25vd24gLyBubyBsaW1pdC4pCisgICAgICovCisgICAgaW50IG1heF93aWR0aDsKKyAgICBpbnQgbWF4X2hlaWdodDsKK30gQVZIV0ZyYW1lc0NvbnN0cmFpbnRzOworCisvKioKKyAqIEFsbG9jYXRlIGEgSFctc3BlY2lmaWMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gSFcgZGV2aWNlLgorICogQWZ0ZXIgdXNlLCB0aGUgdXNlciBtdXN0IGZyZWUgYWxsIG1lbWJlcnMgYXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljCisgKiBoYXJkd2FyZSBzdHJ1Y3R1cmUgYmVpbmcgdXNlZCwgdGhlbiBmcmVlIHRoZSBzdHJ1Y3R1cmUgaXRzZWxmIHdpdGgKKyAqIGF2X2ZyZWUoKS4KKyAqCisgKiBAcGFyYW0gZGV2aWNlX2N0eCBhIHJlZmVyZW5jZSB0byB0aGUgYXNzb2NpYXRlZCBBVkhXRGV2aWNlQ29udGV4dC4KKyAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgSFctc3BlY2lmaWMgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUgb24KKyAqICAgICAgICAgc3VjY2VzcyBvciBOVUxMIG9uIGZhaWx1cmUuCisgKi8KK3ZvaWQgKmF2X2h3ZGV2aWNlX2h3Y29uZmlnX2FsbG9jKEFWQnVmZmVyUmVmICpkZXZpY2VfY3R4KTsKKworLyoqCisgKiBHZXQgdGhlIGNvbnN0cmFpbnRzIG9uIEhXIGZyYW1lcyBnaXZlbiBhIGRldmljZSBhbmQgdGhlIEhXLXNwZWNpZmljCisgKiBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQgd2l0aCB0aGF0IGRldmljZS4gIElmIG5vIEhXLXNwZWNpZmljCisgKiBjb25maWd1cmF0aW9uIGlzIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGNhcGFiaWxpdGllcworICogb2YgdGhlIGRldmljZS4KKyAqCisgKiBAcGFyYW0gcmVmIGEgcmVmZXJlbmNlIHRvIHRoZSBhc3NvY2lhdGVkIEFWSFdEZXZpY2VDb250ZXh0LgorICogQHBhcmFtIGh3Y29uZmlnIGEgZmlsbGVkIEhXLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlLCBvciBOVUxMCisgKiAgICAgICAgdG8gcmV0dXJuIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGNhcGFiaWxpdGllcyBvZiB0aGUgZGV2aWNlLgorICogQHJldHVybiBBVkhXRnJhbWVzQ29uc3RyYWludHMgc3RydWN0dXJlIGRlc2NyaWJpbmcgdGhlIGNvbnN0cmFpbnRzCisgKiAgICAgICAgIG9uIHRoZSBkZXZpY2UsIG9yIE5VTEwgaWYgbm90IGF2YWlsYWJsZS4KKyAqLworQVZIV0ZyYW1lc0NvbnN0cmFpbnRzICphdl9od2RldmljZV9nZXRfaHdmcmFtZV9jb25zdHJhaW50cyhBVkJ1ZmZlclJlZiAqcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpod2NvbmZpZyk7CisKKy8qKgorICogRnJlZSBhbiBBVkhXRnJhbWVDb25zdHJhaW50cyBzdHJ1Y3R1cmUuCisgKgorICogQHBhcmFtIGNvbnN0cmFpbnRzIFRoZSAoZmlsbGVkIG9yIHVuZmlsbGVkKSBBVkhXRnJhbWVDb25zdHJhaW50cyBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQgYXZfaHdmcmFtZV9jb25zdHJhaW50c19mcmVlKEFWSFdGcmFtZXNDb25zdHJhaW50cyAqKmNvbnN0cmFpbnRzKTsKKworCisvKioKKyAqIEZsYWdzIHRvIGFwcGx5IHRvIGZyYW1lIG1hcHBpbmdzLgorICovCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwcGluZyBtdXN0IGJlIHJlYWRhYmxlLgorICAgICAqLworICAgIEFWX0hXRlJBTUVfTUFQX1JFQUQgICAgICA9IDEgPDwgMCwKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwcGluZyBtdXN0IGJlIHdyaXRlYWJsZS4KKyAgICAgKi8KKyAgICBBVl9IV0ZSQU1FX01BUF9XUklURSAgICAgPSAxIDw8IDEsCisgICAgLyoqCisgICAgICogVGhlIG1hcHBlZCBmcmFtZSB3aWxsIGJlIG92ZXJ3cml0dGVuIGNvbXBsZXRlbHkgaW4gc3Vic2VxdWVudAorICAgICAqIG9wZXJhdGlvbnMsIHNvIHRoZSBjdXJyZW50IGZyYW1lIGRhdGEgbmVlZCBub3QgYmUgbG9hZGVkLiAgQW55IHZhbHVlcworICAgICAqIHdoaWNoIGFyZSBub3Qgb3ZlcndyaXR0ZW4gYXJlIHVuc3BlY2lmaWVkLgorICAgICAqLworICAgIEFWX0hXRlJBTUVfTUFQX09WRVJXUklURSA9IDEgPDwgMiwKKyAgICAvKioKKyAgICAgKiBUaGUgbWFwcGluZyBtdXN0IGJlIGRpcmVjdC4gIFRoYXQgaXMsIHRoZXJlIG11c3Qgbm90IGJlIGFueSBjb3B5aW5nIGluCisgICAgICogdGhlIG1hcCBvciB1bm1hcCBzdGVwcy4gIE5vdGUgdGhhdCBwZXJmb3JtYW5jZSBvZiBkaXJlY3QgbWFwcGluZ3MgbWF5CisgICAgICogYmUgbXVjaCBsb3dlciB0aGFuIG5vcm1hbCBtZW1vcnkuCisgICAgICovCisgICAgQVZfSFdGUkFNRV9NQVBfRElSRUNUICAgID0gMSA8PCAzLAorfTsKKworLyoqCisgKiBNYXAgYSBoYXJkd2FyZSBmcmFtZS4KKyAqCisgKiBUaGlzIGhhcyBhIG51bWJlciBvZiBkaWZmZXJlbnQgcG9zc2libGUgZWZmZWN0cywgZGVwZW5kaW5nIG9uIHRoZSBmb3JtYXQKKyAqIGFuZCBvcmlnaW4gb2YgdGhlIHNyYyBhbmQgZHN0IGZyYW1lcy4gIE9uIGlucHV0LCBzcmMgc2hvdWxkIGJlIGEgdXNhYmxlCisgKiBmcmFtZSB3aXRoIHZhbGlkIGJ1ZmZlcnMgYW5kIGRzdCBzaG91bGQgYmUgYmxhbmsgKHR5cGljYWxseSBhcyBqdXN0IGNyZWF0ZWQKKyAqIGJ5IGF2X2ZyYW1lX2FsbG9jKCkpLiAgc3JjIHNob3VsZCBoYXZlIGFuIGFzc29jaWF0ZWQgaHdmcmFtZSBjb250ZXh0LCBhbmQKKyAqIGRzdCBtYXkgb3B0aW9uYWxseSBoYXZlIGEgZm9ybWF0IGFuZCBhc3NvY2lhdGVkIGh3ZnJhbWUgY29udGV4dC4KKyAqCisgKiBJZiBzcmMgd2FzIGNyZWF0ZWQgYnkgbWFwcGluZyBhIGZyYW1lIGZyb20gdGhlIGh3ZnJhbWUgY29udGV4dCBvZiBkc3QsCisgKiB0aGVuIHRoaXMgZnVuY3Rpb24gdW5kb2VzIHRoZSBtYXBwaW5nIC0gZHN0IGlzIHJlcGxhY2VkIGJ5IGEgcmVmZXJlbmNlIHRvCisgKiB0aGUgZnJhbWUgdGhhdCBzcmMgd2FzIG9yaWdpbmFsbHkgbWFwcGVkIGZyb20uCisgKgorICogSWYgYm90aCBzcmMgYW5kIGRzdCBoYXZlIGFuIGFzc29jaWF0ZWQgaHdmcmFtZSBjb250ZXh0LCB0aGVuIHRoaXMgZnVuY3Rpb24KKyAqIGF0dGVtcHRzIHRvIG1hcCB0aGUgc3JjIGZyYW1lIGZyb20gaXRzIGhhcmR3YXJlIGNvbnRleHQgdG8gdGhhdCBvZiBkc3QgYW5kCisgKiB0aGVuIGZpbGwgZHN0IHdpdGggYXBwcm9wcmlhdGUgZGF0YSB0byBiZSB1c2FibGUgdGhlcmUuICBUaGlzIHdpbGwgb25seSBiZQorICogcG9zc2libGUgaWYgdGhlIGh3ZnJhbWUgY29udGV4dHMgYW5kIGFzc29jaWF0ZWQgZGV2aWNlcyBhcmUgY29tcGF0aWJsZSAtCisgKiBnaXZlbiBjb21wYXRpYmxlIGRldmljZXMsIGF2X2h3ZnJhbWVfY3R4X2NyZWF0ZV9kZXJpdmVkKCkgY2FuIGJlIHVzZWQgdG8KKyAqIGNyZWF0ZSBhIGh3ZnJhbWUgY29udGV4dCBmb3IgZHN0IGluIHdoaWNoIG1hcHBpbmcgc2hvdWxkIGJlIHBvc3NpYmxlLgorICoKKyAqIElmIHNyYyBoYXMgYSBod2ZyYW1lIGNvbnRleHQgYnV0IGRzdCBkb2VzIG5vdCwgdGhlbiB0aGUgc3JjIGZyYW1lIGlzCisgKiBtYXBwZWQgdG8gbm9ybWFsIG1lbW9yeSBhbmQgc2hvdWxkIHRoZXJlYWZ0ZXIgYmUgdXNhYmxlIGFzIGEgbm9ybWFsIGZyYW1lLgorICogSWYgdGhlIGZvcm1hdCBpcyBzZXQgb24gZHN0LCB0aGVuIHRoZSBtYXBwaW5nIHdpbGwgYXR0ZW1wdCB0byBjcmVhdGUgZHN0CisgKiB3aXRoIHRoYXQgZm9ybWF0IGFuZCBmYWlsIGlmIGl0IGlzIG5vdCBwb3NzaWJsZS4gIElmIGZvcm1hdCBpcyB1bnNldCAoaXMKKyAqIEFWX1BJWF9GTVRfTk9ORSkgdGhlbiBkc3Qgd2lsbCBiZSBtYXBwZWQgd2l0aCB3aGF0ZXZlciB0aGUgbW9zdCBhcHByb3ByaWF0ZQorICogZm9ybWF0IHRvIHVzZSBpcyAocHJvYmFibHkgdGhlIHN3X2Zvcm1hdCBvZiB0aGUgc3JjIGh3ZnJhbWUgY29udGV4dCkuCisgKgorICogQSByZXR1cm4gdmFsdWUgb2YgQVZFUlJPUihFTk9TWVMpIGluZGljYXRlcyB0aGF0IHRoZSBtYXBwaW5nIGlzIG5vdAorICogcG9zc2libGUgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCBod2ZyYW1lIHNldHVwLCB3aGlsZSBvdGhlciByZXR1cm4KKyAqIHZhbHVlcyBpbmRpY2F0ZSB0aGF0IGl0IGZhaWxlZCBzb21laG93LgorICoKKyAqIEBwYXJhbSBkc3QgRGVzdGluYXRpb24gZnJhbWUsIHRvIGNvbnRhaW4gdGhlIG1hcHBpbmcuCisgKiBAcGFyYW0gc3JjIFNvdXJjZSBmcmFtZSwgdG8gYmUgbWFwcGVkLgorICogQHBhcmFtIGZsYWdzIFNvbWUgY29tYmluYXRpb24gb2YgQVZfSFdGUkFNRV9NQVBfKiBmbGFncy4KKyAqIEByZXR1cm4gWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGF2X2h3ZnJhbWVfbWFwKEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpOworCisKKy8qKgorICogQ3JlYXRlIGFuZCBpbml0aWFsaXNlIGFuIEFWSFdGcmFtZXNDb250ZXh0IGFzIGEgbWFwcGluZyBvZiBhbm90aGVyIGV4aXN0aW5nCisgKiBBVkhXRnJhbWVzQ29udGV4dCBvbiBhIGRpZmZlcmVudCBkZXZpY2UuCisgKgorICogYXZfaHdmcmFtZV9jdHhfaW5pdCgpIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoaXMuCisgKgorICogQHBhcmFtIGRlcml2ZWRfZnJhbWVfY3R4ICBPbiBzdWNjZXNzLCBhIHJlZmVyZW5jZSB0byB0aGUgbmV3bHkgY3JlYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dC4KKyAqIEBwYXJhbSBkZXJpdmVkX2RldmljZV9jdHggQSByZWZlcmVuY2UgdG8gdGhlIGRldmljZSB0byBjcmVhdGUgdGhlIG5ldworICogICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCBvbi4KKyAqIEBwYXJhbSBzb3VyY2VfZnJhbWVfY3R4ICAgQSByZWZlcmVuY2UgdG8gYW4gZXhpc3RpbmcgQVZIV0ZyYW1lc0NvbnRleHQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBiZSBtYXBwZWQgdG8gdGhlIGRlcml2ZWQgY29udGV4dC4KKyAqIEBwYXJhbSBmbGFncyAgU29tZSBjb21iaW5hdGlvbiBvZiBBVl9IV0ZSQU1FX01BUF8qIGZsYWdzLCBkZWZpbmluZyB0aGUKKyAqICAgICAgICAgICAgICAgbWFwcGluZyBwYXJhbWV0ZXJzIHRvIGFwcGx5IHRvIGZyYW1lcyB3aGljaCBhcmUgYWxsb2NhdGVkCisgKiAgICAgICAgICAgICAgIGluIHRoZSBkZXJpdmVkIGRldmljZS4KKyAqIEByZXR1cm4gICAgICAgWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGF2X2h3ZnJhbWVfY3R4X2NyZWF0ZV9kZXJpdmVkKEFWQnVmZmVyUmVmICoqZGVyaXZlZF9mcmFtZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkJ1ZmZlclJlZiAqZGVyaXZlZF9kZXZpY2VfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQnVmZmVyUmVmICpzb3VyY2VfZnJhbWVfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisKKyNlbmRpZiAvKiBBVlVUSUxfSFdDT05URVhUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9od2NvbnRleHRfY3VkYS5jIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9jdWRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4MjdhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHRfY3VkYS5jCkBAIC0wLDAgKzEsNDE4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJod2NvbnRleHQuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfY3VkYV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInBpeGRlc2MuaCIKKyNpbmNsdWRlICJwaXhmbXQuaCIKKworI2RlZmluZSBDVURBX0ZSQU1FX0FMSUdOTUVOVCAyNTYKKwordHlwZWRlZiBzdHJ1Y3QgQ1VEQUZyYW1lc0NvbnRleHQgeworICAgIGludCBzaGlmdF93aWR0aCwgc2hpZnRfaGVpZ2h0OworfSBDVURBRnJhbWVzQ29udGV4dDsKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBzdXBwb3J0ZWRfZm9ybWF0c1tdID0geworICAgIEFWX1BJWF9GTVRfTlYxMiwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQLAorICAgIEFWX1BJWF9GTVRfUDAxMCwKKyAgICBBVl9QSVhfRk1UX1AwMTYsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCit9OworCitzdGF0aWMgaW50IGN1ZGFfZnJhbWVzX2dldF9jb25zdHJhaW50cyhBVkhXRGV2aWNlQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaHdjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29uc3RyYWludHMgKmNvbnN0cmFpbnRzKQoreworICAgIGludCBpOworCisgICAgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHMgPSBhdl9tYWxsb2NfYXJyYXkoRkZfQVJSQVlfRUxFTVMoc3VwcG9ydGVkX2Zvcm1hdHMpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzKSk7CisgICAgaWYgKCFjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfZm9ybWF0cyk7IGkrKykKKyAgICAgICAgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHNbaV0gPSBzdXBwb3J0ZWRfZm9ybWF0c1tpXTsKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0c1tGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfZm9ybWF0cyldID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgY29uc3RyYWludHMtPnZhbGlkX2h3X2Zvcm1hdHMgPSBhdl9tYWxsb2NfYXJyYXkoMiwgc2l6ZW9mKCpjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0cykpOworICAgIGlmICghY29uc3RyYWludHMtPnZhbGlkX2h3X2Zvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0c1swXSA9IEFWX1BJWF9GTVRfQ1VEQTsKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0c1sxXSA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjdWRhX2J1ZmZlcl9mcmVlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqY3R4ID0gb3BhcXVlOworICAgIEFWQ1VEQURldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBDdWRhRnVuY3Rpb25zICpjdSA9IGh3Y3R4LT5pbnRlcm5hbC0+Y3VkYV9kbDsKKworICAgIENVY29udGV4dCBkdW1teTsKKworICAgIGN1LT5jdUN0eFB1c2hDdXJyZW50KGh3Y3R4LT5jdWRhX2N0eCk7CisKKyAgICBjdS0+Y3VNZW1GcmVlKChDVWRldmljZXB0cilkYXRhKTsKKworICAgIGN1LT5jdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKK30KKworc3RhdGljIEFWQnVmZmVyUmVmICpjdWRhX3Bvb2xfYWxsb2Modm9pZCAqb3BhcXVlLCBpbnQgc2l6ZSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAgKmN0eCA9IG9wYXF1ZTsKKyAgICBBVkNVREFEZXZpY2VDb250ZXh0ICpod2N0eCA9IGN0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgQ3VkYUZ1bmN0aW9ucyAgICAgICAgICAqY3UgPSBod2N0eC0+aW50ZXJuYWwtPmN1ZGFfZGw7CisKKyAgICBBVkJ1ZmZlclJlZiAqcmV0ID0gTlVMTDsKKyAgICBDVWNvbnRleHQgZHVtbXkgPSBOVUxMOworICAgIENVZGV2aWNlcHRyIGRhdGE7CisgICAgQ1VyZXN1bHQgZXJyOworCisgICAgZXJyID0gY3UtPmN1Q3R4UHVzaEN1cnJlbnQoaHdjdHgtPmN1ZGFfY3R4KTsKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzZXR0aW5nIGN1cnJlbnQgQ1VEQSBjb250ZXh0XG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZXJyID0gY3UtPmN1TWVtQWxsb2MoJmRhdGEsIHNpemUpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXQgPSBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90KilkYXRhLCBzaXplLCBjdWRhX2J1ZmZlcl9mcmVlLCBjdHgsIDApOworICAgIGlmICghcmV0KSB7CisgICAgICAgIGN1LT5jdU1lbUZyZWUoZGF0YSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKK2ZhaWw6CisgICAgY3UtPmN1Q3R4UG9wQ3VycmVudCgmZHVtbXkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3VkYV9mcmFtZXNfaW5pdChBVkhXRnJhbWVzQ29udGV4dCAqY3R4KQoreworICAgIENVREFGcmFtZXNDb250ZXh0ICpwcml2ID0gY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBpbnQgYWxpZ25lZF93aWR0aCA9IEZGQUxJR04oY3R4LT53aWR0aCwgQ1VEQV9GUkFNRV9BTElHTk1FTlQpOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHN1cHBvcnRlZF9mb3JtYXRzKTsgaSsrKSB7CisgICAgICAgIGlmIChjdHgtPnN3X2Zvcm1hdCA9PSBzdXBwb3J0ZWRfZm9ybWF0c1tpXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaSA9PSBGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfZm9ybWF0cykpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiUGl4ZWwgZm9ybWF0ICclcycgaXMgbm90IHN1cHBvcnRlZFxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5zd19mb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICBhdl9waXhfZm10X2dldF9jaHJvbWFfc3ViX3NhbXBsZShjdHgtPnN3X2Zvcm1hdCwgJnByaXYtPnNoaWZ0X3dpZHRoLCAmcHJpdi0+c2hpZnRfaGVpZ2h0KTsKKworICAgIGlmICghY3R4LT5wb29sKSB7CisgICAgICAgIGludCBzaXplOworCisgICAgICAgIHN3aXRjaCAoY3R4LT5zd19mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOgorICAgICAgICAgICAgc2l6ZSA9IGFsaWduZWRfd2lkdGggKiBjdHgtPmhlaWdodCAqIDMgLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOgorICAgICAgICBjYXNlIEFWX1BJWF9GTVRfUDAxMDoKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1AwMTY6CisgICAgICAgICAgICBzaXplID0gYWxpZ25lZF93aWR0aCAqIGN0eC0+aGVpZ2h0ICogMzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2OgorICAgICAgICAgICAgc2l6ZSA9IGFsaWduZWRfd2lkdGggKiBjdHgtPmhlaWdodCAqIDY7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkJVRzogUGl4ZWwgZm9ybWF0IG1pc3NpbmcgZnJvbSBzaXplIGNhbGN1bGF0aW9uLiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgICAgICB9CisKKyAgICAgICAgY3R4LT5pbnRlcm5hbC0+cG9vbF9pbnRlcm5hbCA9IGF2X2J1ZmZlcl9wb29sX2luaXQyKHNpemUsIGN0eCwgY3VkYV9wb29sX2FsbG9jLCBOVUxMKTsKKyAgICAgICAgaWYgKCFjdHgtPmludGVybmFsLT5wb29sX2ludGVybmFsKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjdWRhX2dldF9idWZmZXIoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgaW50IGFsaWduZWRfd2lkdGg7CisgICAgaW50IHdpZHRoX2luX2J5dGVzID0gY3R4LT53aWR0aDsKKworICAgIGlmIChjdHgtPnN3X2Zvcm1hdCA9PSBBVl9QSVhfRk1UX1AwMTAgfHwKKyAgICAgICAgY3R4LT5zd19mb3JtYXQgPT0gQVZfUElYX0ZNVF9QMDE2IHx8CisgICAgICAgIGN0eC0+c3dfZm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDQ0UDE2KSB7CisgICAgICAgd2lkdGhfaW5fYnl0ZXMgKj0gMjsKKyAgICB9CisgICAgYWxpZ25lZF93aWR0aCA9IEZGQUxJR04od2lkdGhfaW5fYnl0ZXMsIENVREFfRlJBTUVfQUxJR05NRU5UKTsKKworICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9vbF9nZXQoY3R4LT5wb29sKTsKKyAgICBpZiAoIWZyYW1lLT5idWZbMF0pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBzd2l0Y2ggKGN0eC0+c3dfZm9ybWF0KSB7CisgICAgY2FzZSBBVl9QSVhfRk1UX05WMTI6CisgICAgY2FzZSBBVl9QSVhfRk1UX1AwMTA6CisgICAgY2FzZSBBVl9QSVhfRk1UX1AwMTY6CisgICAgICAgIGZyYW1lLT5kYXRhWzBdICAgICA9IGZyYW1lLT5idWZbMF0tPmRhdGE7CisgICAgICAgIGZyYW1lLT5kYXRhWzFdICAgICA9IGZyYW1lLT5kYXRhWzBdICsgYWxpZ25lZF93aWR0aCAqIGN0eC0+aGVpZ2h0OworICAgICAgICBmcmFtZS0+bGluZXNpemVbMF0gPSBhbGlnbmVkX3dpZHRoOworICAgICAgICBmcmFtZS0+bGluZXNpemVbMV0gPSBhbGlnbmVkX3dpZHRoOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDoKKyAgICAgICAgZnJhbWUtPmRhdGFbMF0gICAgID0gZnJhbWUtPmJ1ZlswXS0+ZGF0YTsKKyAgICAgICAgZnJhbWUtPmRhdGFbMl0gICAgID0gZnJhbWUtPmRhdGFbMF0gKyBhbGlnbmVkX3dpZHRoICogY3R4LT5oZWlnaHQ7CisgICAgICAgIGZyYW1lLT5kYXRhWzFdICAgICA9IGZyYW1lLT5kYXRhWzJdICsgYWxpZ25lZF93aWR0aCAqIGN0eC0+aGVpZ2h0IC8gNDsKKyAgICAgICAgZnJhbWUtPmxpbmVzaXplWzBdID0gYWxpZ25lZF93aWR0aDsKKyAgICAgICAgZnJhbWUtPmxpbmVzaXplWzFdID0gYWxpZ25lZF93aWR0aCAvIDI7CisgICAgICAgIGZyYW1lLT5saW5lc2l6ZVsyXSA9IGFsaWduZWRfd2lkdGggLyAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDoKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2OgorICAgICAgICBmcmFtZS0+ZGF0YVswXSAgICAgPSBmcmFtZS0+YnVmWzBdLT5kYXRhOworICAgICAgICBmcmFtZS0+ZGF0YVsxXSAgICAgPSBmcmFtZS0+ZGF0YVswXSArIGFsaWduZWRfd2lkdGggKiBjdHgtPmhlaWdodDsKKyAgICAgICAgZnJhbWUtPmRhdGFbMl0gICAgID0gZnJhbWUtPmRhdGFbMV0gKyBhbGlnbmVkX3dpZHRoICogY3R4LT5oZWlnaHQ7CisgICAgICAgIGZyYW1lLT5saW5lc2l6ZVswXSA9IGFsaWduZWRfd2lkdGg7CisgICAgICAgIGZyYW1lLT5saW5lc2l6ZVsxXSA9IGFsaWduZWRfd2lkdGg7CisgICAgICAgIGZyYW1lLT5saW5lc2l6ZVsyXSA9IGFsaWduZWRfd2lkdGg7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGF2X2ZyYW1lX3VucmVmKGZyYW1lKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfQlVHOworICAgIH0KKworICAgIGZyYW1lLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0NVREE7CisgICAgZnJhbWUtPndpZHRoICA9IGN0eC0+d2lkdGg7CisgICAgZnJhbWUtPmhlaWdodCA9IGN0eC0+aGVpZ2h0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3VkYV90cmFuc2Zlcl9nZXRfZm9ybWF0cyhBVkhXRnJhbWVzQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZIV0ZyYW1lVHJhbnNmZXJEaXJlY3Rpb24gZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqKmZvcm1hdHMpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICpmbXRzOworCisgICAgZm10cyA9IGF2X21hbGxvY19hcnJheSgyLCBzaXplb2YoKmZtdHMpKTsKKyAgICBpZiAoIWZtdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmbXRzWzBdID0gY3R4LT5zd19mb3JtYXQ7CisgICAgZm10c1sxXSA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgICpmb3JtYXRzID0gZm10czsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGN1ZGFfdHJhbnNmZXJfZGF0YV9mcm9tKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjKQoreworICAgIENVREFGcmFtZXNDb250ZXh0ICAgICAgICAgICAqcHJpdiA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZDVURBRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4ID0gY3R4LT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBDdWRhRnVuY3Rpb25zICAgICAgICAgICAgICAgICAqY3UgPSBkZXZpY2VfaHdjdHgtPmludGVybmFsLT5jdWRhX2RsOworCisgICAgQ1Vjb250ZXh0IGR1bW15OworICAgIENVcmVzdWx0IGVycjsKKyAgICBpbnQgaTsKKworICAgIGVyciA9IGN1LT5jdUN0eFB1c2hDdXJyZW50KGRldmljZV9od2N0eC0+Y3VkYV9jdHgpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHNyYy0+ZGF0YSkgJiYgc3JjLT5kYXRhW2ldOyBpKyspIHsKKyAgICAgICAgQ1VEQV9NRU1DUFkyRCBjcHkgPSB7CisgICAgICAgICAgICAuc3JjTWVtb3J5VHlwZSA9IENVX01FTU9SWVRZUEVfREVWSUNFLAorICAgICAgICAgICAgLmRzdE1lbW9yeVR5cGUgPSBDVV9NRU1PUllUWVBFX0hPU1QsCisgICAgICAgICAgICAuc3JjRGV2aWNlICAgICA9IChDVWRldmljZXB0cilzcmMtPmRhdGFbaV0sCisgICAgICAgICAgICAuZHN0SG9zdCAgICAgICA9IGRzdC0+ZGF0YVtpXSwKKyAgICAgICAgICAgIC5zcmNQaXRjaCAgICAgID0gc3JjLT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgIC5kc3RQaXRjaCAgICAgID0gZHN0LT5saW5lc2l6ZVtpXSwKKyAgICAgICAgICAgIC5XaWR0aEluQnl0ZXMgID0gRkZNSU4oc3JjLT5saW5lc2l6ZVtpXSwgZHN0LT5saW5lc2l6ZVtpXSksCisgICAgICAgICAgICAuSGVpZ2h0ICAgICAgICA9IHNyYy0+aGVpZ2h0ID4+IChpID8gcHJpdi0+c2hpZnRfaGVpZ2h0IDogMCksCisgICAgICAgIH07CisKKyAgICAgICAgZXJyID0gY3UtPmN1TWVtY3B5MkQoJmNweSk7CisgICAgICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciB0cmFuc2ZlcnJpbmcgdGhlIGRhdGEgZnJvbSB0aGUgQ1VEQSBmcmFtZVxuIik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgY3UtPmN1Q3R4UG9wQ3VycmVudCgmZHVtbXkpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3VkYV90cmFuc2Zlcl9kYXRhX3RvKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBDVURBRnJhbWVzQ29udGV4dCAgICAgICAgICAgKnByaXYgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIEFWQ1VEQURldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGN0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgQ3VkYUZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgKmN1ID0gZGV2aWNlX2h3Y3R4LT5pbnRlcm5hbC0+Y3VkYV9kbDsKKworICAgIENVY29udGV4dCBkdW1teTsKKyAgICBDVXJlc3VsdCBlcnI7CisgICAgaW50IGk7CisKKyAgICBlcnIgPSBjdS0+Y3VDdHhQdXNoQ3VycmVudChkZXZpY2VfaHdjdHgtPmN1ZGFfY3R4KTsKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzcmMtPmRhdGEpICYmIHNyYy0+ZGF0YVtpXTsgaSsrKSB7CisgICAgICAgIENVREFfTUVNQ1BZMkQgY3B5ID0geworICAgICAgICAgICAgLnNyY01lbW9yeVR5cGUgPSBDVV9NRU1PUllUWVBFX0hPU1QsCisgICAgICAgICAgICAuZHN0TWVtb3J5VHlwZSA9IENVX01FTU9SWVRZUEVfREVWSUNFLAorICAgICAgICAgICAgLnNyY0hvc3QgICAgICAgPSBzcmMtPmRhdGFbaV0sCisgICAgICAgICAgICAuZHN0RGV2aWNlICAgICA9IChDVWRldmljZXB0cilkc3QtPmRhdGFbaV0sCisgICAgICAgICAgICAuc3JjUGl0Y2ggICAgICA9IHNyYy0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAuZHN0UGl0Y2ggICAgICA9IGRzdC0+bGluZXNpemVbaV0sCisgICAgICAgICAgICAuV2lkdGhJbkJ5dGVzICA9IEZGTUlOKHNyYy0+bGluZXNpemVbaV0sIGRzdC0+bGluZXNpemVbaV0pLAorICAgICAgICAgICAgLkhlaWdodCAgICAgICAgPSBzcmMtPmhlaWdodCA+PiAoaSA/IHByaXYtPnNoaWZ0X2hlaWdodCA6IDApLAorICAgICAgICB9OworCisgICAgICAgIGVyciA9IGN1LT5jdU1lbWNweTJEKCZjcHkpOworICAgICAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgdHJhbnNmZXJyaW5nIHRoZSBkYXRhIGZyb20gdGhlIENVREEgZnJhbWVcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN1LT5jdUN0eFBvcEN1cnJlbnQoJmR1bW15KTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjdWRhX2RldmljZV91bmluaXQoQVZIV0RldmljZUNvbnRleHQgKmN0eCkKK3sKKyAgICBBVkNVREFEZXZpY2VDb250ZXh0ICpod2N0eCA9IGN0eC0+aHdjdHg7CisKKyAgICBpZiAoaHdjdHgtPmludGVybmFsKSB7CisgICAgICAgIGlmIChod2N0eC0+aW50ZXJuYWwtPmlzX2FsbG9jYXRlZCAmJiBod2N0eC0+Y3VkYV9jdHgpIHsKKyAgICAgICAgICAgIGh3Y3R4LT5pbnRlcm5hbC0+Y3VkYV9kbC0+Y3VDdHhEZXN0cm95KGh3Y3R4LT5jdWRhX2N0eCk7CisgICAgICAgICAgICBod2N0eC0+Y3VkYV9jdHggPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGN1ZGFfZnJlZV9mdW5jdGlvbnMoJmh3Y3R4LT5pbnRlcm5hbC0+Y3VkYV9kbCk7CisgICAgfQorCisgICAgYXZfZnJlZXAoJmh3Y3R4LT5pbnRlcm5hbCk7Cit9CisKK3N0YXRpYyBpbnQgY3VkYV9kZXZpY2VfaW5pdChBVkhXRGV2aWNlQ29udGV4dCAqY3R4KQoreworICAgIEFWQ1VEQURldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBpbnQgcmV0OworCisgICAgaWYgKCFod2N0eC0+aW50ZXJuYWwpIHsKKyAgICAgICAgaHdjdHgtPmludGVybmFsID0gYXZfbWFsbG9jeihzaXplb2YoKmh3Y3R4LT5pbnRlcm5hbCkpOworICAgICAgICBpZiAoIWh3Y3R4LT5pbnRlcm5hbCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgaWYgKCFod2N0eC0+aW50ZXJuYWwtPmN1ZGFfZGwpIHsKKyAgICAgICAgcmV0ID0gY3VkYV9sb2FkX2Z1bmN0aW9ucygmaHdjdHgtPmludGVybmFsLT5jdWRhX2RsLCBjdHgpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGR5bmFtaWNhbGx5IGxvYWQgQ1VEQVxuIik7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGN1ZGFfZGV2aWNlX3VuaW5pdChjdHgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY3VkYV9kZXZpY2VfY3JlYXRlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cywgaW50IGZsYWdzKQoreworICAgIEFWQ1VEQURldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBDdWRhRnVuY3Rpb25zICpjdTsKKyAgICBDVWRldmljZSBjdV9kZXZpY2U7CisgICAgQ1Vjb250ZXh0IGR1bW15OworICAgIENVcmVzdWx0IGVycjsKKyAgICBpbnQgZGV2aWNlX2lkeCA9IDA7CisKKyAgICBpZiAoZGV2aWNlKQorICAgICAgICBkZXZpY2VfaWR4ID0gc3RydG9sKGRldmljZSwgTlVMTCwgMCk7CisKKyAgICBpZiAoY3VkYV9kZXZpY2VfaW5pdChjdHgpIDwgMCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGN1ID0gaHdjdHgtPmludGVybmFsLT5jdWRhX2RsOworCisgICAgZXJyID0gY3UtPmN1SW5pdCgwKTsKKyAgICBpZiAoZXJyICE9IENVREFfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgaW5pdGlhbGl6ZSB0aGUgQ1VEQSBkcml2ZXIgQVBJXG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBlcnIgPSBjdS0+Y3VEZXZpY2VHZXQoJmN1X2RldmljZSwgZGV2aWNlX2lkeCk7CisgICAgaWYgKGVyciAhPSBDVURBX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGdldCB0aGUgZGV2aWNlIG51bWJlciAlZFxuIiwgZGV2aWNlX2lkeCk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgZXJyID0gY3UtPmN1Q3R4Q3JlYXRlKCZod2N0eC0+Y3VkYV9jdHgsIENVX0NUWF9TQ0hFRF9CTE9DS0lOR19TWU5DLCBjdV9kZXZpY2UpOworICAgIGlmIChlcnIgIT0gQ1VEQV9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGNyZWF0aW5nIGEgQ1VEQSBjb250ZXh0XG4iKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBjdS0+Y3VDdHhQb3BDdXJyZW50KCZkdW1teSk7CisKKyAgICBod2N0eC0+aW50ZXJuYWwtPmlzX2FsbG9jYXRlZCA9IDE7CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgY3VkYV9kZXZpY2VfdW5pbml0KGN0eCk7CisgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKK30KKworY29uc3QgSFdDb250ZXh0VHlwZSBmZl9od2NvbnRleHRfdHlwZV9jdWRhID0geworICAgIC50eXBlICAgICAgICAgICAgICAgICA9IEFWX0hXREVWSUNFX1RZUEVfQ1VEQSwKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAiQ1VEQSIsCisKKyAgICAuZGV2aWNlX2h3Y3R4X3NpemUgICAgPSBzaXplb2YoQVZDVURBRGV2aWNlQ29udGV4dCksCisgICAgLmZyYW1lc19wcml2X3NpemUgICAgID0gc2l6ZW9mKENVREFGcmFtZXNDb250ZXh0KSwKKworICAgIC5kZXZpY2VfY3JlYXRlICAgICAgICA9IGN1ZGFfZGV2aWNlX2NyZWF0ZSwKKyAgICAuZGV2aWNlX2luaXQgICAgICAgICAgPSBjdWRhX2RldmljZV9pbml0LAorICAgIC5kZXZpY2VfdW5pbml0ICAgICAgICA9IGN1ZGFfZGV2aWNlX3VuaW5pdCwKKyAgICAuZnJhbWVzX2dldF9jb25zdHJhaW50cyA9IGN1ZGFfZnJhbWVzX2dldF9jb25zdHJhaW50cywKKyAgICAuZnJhbWVzX2luaXQgICAgICAgICAgPSBjdWRhX2ZyYW1lc19pbml0LAorICAgIC5mcmFtZXNfZ2V0X2J1ZmZlciAgICA9IGN1ZGFfZ2V0X2J1ZmZlciwKKyAgICAudHJhbnNmZXJfZ2V0X2Zvcm1hdHMgPSBjdWRhX3RyYW5zZmVyX2dldF9mb3JtYXRzLAorICAgIC50cmFuc2Zlcl9kYXRhX3RvICAgICA9IGN1ZGFfdHJhbnNmZXJfZGF0YV90bywKKyAgICAudHJhbnNmZXJfZGF0YV9mcm9tICAgPSBjdWRhX3RyYW5zZmVyX2RhdGFfZnJvbSwKKworICAgIC5waXhfZm10cyAgICAgICAgICAgICA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfQ1VEQSwgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2h3Y29udGV4dF9jdWRhLmggYi9saWJhdnV0aWwvaHdjb250ZXh0X2N1ZGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmRhZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9jdWRhLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisKKyNpZm5kZWYgQVZVVElMX0hXQ09OVEVYVF9DVURBX0gKKyNkZWZpbmUgQVZVVElMX0hXQ09OVEVYVF9DVURBX0gKKworI2lmbmRlZiBDVURBX1ZFUlNJT04KKyNpbmNsdWRlIDxjdWRhLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInBpeGZtdC5oIgorCisvKioKKyAqIEBmaWxlCisgKiBBbiBBUEktc3BlY2lmaWMgaGVhZGVyIGZvciBBVl9IV0RFVklDRV9UWVBFX0NVREEuCisgKgorICogVGhpcyBBUEkgc3VwcG9ydHMgZHluYW1pYyBmcmFtZSBwb29scy4gQVZIV0ZyYW1lc0NvbnRleHQucG9vbCBtdXN0IHJldHVybgorICogQVZCdWZmZXJSZWZzIHdob3NlIGRhdGEgcG9pbnRlciBpcyBhIENVZGV2aWNlcHRyLgorICovCisKK3R5cGVkZWYgc3RydWN0IEFWQ1VEQURldmljZUNvbnRleHRJbnRlcm5hbCBBVkNVREFEZXZpY2VDb250ZXh0SW50ZXJuYWw7CisKKy8qKgorICogVGhpcyBzdHJ1Y3QgaXMgYWxsb2NhdGVkIGFzIEFWSFdEZXZpY2VDb250ZXh0Lmh3Y3R4CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWQ1VEQURldmljZUNvbnRleHQgeworICAgIENVY29udGV4dCBjdWRhX2N0eDsKKyAgICBBVkNVREFEZXZpY2VDb250ZXh0SW50ZXJuYWwgKmludGVybmFsOworfSBBVkNVREFEZXZpY2VDb250ZXh0OworCisvKioKKyAqIEFWSFdGcmFtZXNDb250ZXh0Lmh3Y3R4IGlzIGN1cnJlbnRseSBub3QgdXNlZAorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfSFdDT05URVhUX0NVREFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2h3Y29udGV4dF9jdWRhX2ludGVybmFsLmggYi9saWJhdnV0aWwvaHdjb250ZXh0X2N1ZGFfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWJjNmZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9jdWRhX2ludGVybmFsLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisKKyNpZm5kZWYgQVZVVElMX0hXQ09OVEVYVF9DVURBX0lOVEVSTkFMX0gKKyNkZWZpbmUgQVZVVElMX0hXQ09OVEVYVF9DVURBX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgImNvbXBhdC9jdWRhL2R5bmxpbmtfbG9hZGVyLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X2N1ZGEuaCIKKworLyoqCisgKiBAZmlsZQorICogRkZtcGVnIGludGVybmFsIEFQSSBmb3IgQ1VEQS4KKyAqLworCitzdHJ1Y3QgQVZDVURBRGV2aWNlQ29udGV4dEludGVybmFsIHsKKyAgICBDdWRhRnVuY3Rpb25zICpjdWRhX2RsOworICAgIGludCBpc19hbGxvY2F0ZWQ7Cit9OworCisjZW5kaWYgLyogQVZVVElMX0hXQ09OVEVYVF9DVURBX0lOVEVSTkFMX0ggKi8KKwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmMgYi9saWJhdnV0aWwvaHdjb250ZXh0X2QzZDExdmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjhkMjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmMKQEAgLTAsMCArMSw2MTUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZGVmaW5lIENPQkpNQUNST1MKKworI2luY2x1ZGUgPGluaXRndWlkLmg+CisjaW5jbHVkZSA8ZDNkMTEuaD4KKyNpbmNsdWRlIDxkeGdpMV8yLmg+CisKKyNpZiBIQVZFX0RYR0lERUJVR19ICisjaW5jbHVkZSA8ZHhnaWRlYnVnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0LmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X2QzZDExdmEuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJpbWd1dGlscy5oIgorI2luY2x1ZGUgInBpeGRlc2MuaCIKKyNpbmNsdWRlICJwaXhmbXQuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKwordHlwZWRlZiBIUkVTVUxUKFdJTkFQSSAqUEZOX0NSRUFURV9EWEdJX0ZBQ1RPUlkpKFJFRklJRCByaWlkLCB2b2lkICoqcHBGYWN0b3J5KTsKKworc3RhdGljIEFWT25jZSBmdW5jdGlvbnNfbG9hZGVkID0gQVZfT05DRV9JTklUOworCitzdGF0aWMgUEZOX0NSRUFURV9EWEdJX0ZBQ1RPUlkgbUNyZWF0ZURYR0lGYWN0b3J5Oworc3RhdGljIFBGTl9EM0QxMV9DUkVBVEVfREVWSUNFIG1EM0QxMUNyZWF0ZURldmljZTsKKworc3RhdGljIGF2X2NvbGQgdm9pZCBsb2FkX2Z1bmN0aW9ucyh2b2lkKQoreworI2lmICFIQVZFX1VXUAorICAgIC8vIFdlIGxldCB0aGVzZSAibGVhayIgLSB0aGlzIGlzIGZpbmUsIGFzIHVubG9hZGluZyBoYXMgbm8gZ3JlYXQgYmVuZWZpdCwgYW5kCisgICAgLy8gV2luZG93cyB3aWxsIG1hcmsgYSBETEwgYXMgbG9hZGVkIGZvcmV2ZXIgaWYgaXRzIGludGVybmFsIHJlZmNvdW50IG92ZXJmbG93cworICAgIC8vIGZyb20gdG9vIG1hbnkgTG9hZExpYnJhcnkgY2FsbHMuCisgICAgSEFORExFIGQzZGxpYiwgZHhnaWxpYjsKKworICAgIGQzZGxpYiAgPSBMb2FkTGlicmFyeSgiZDNkMTEuZGxsIik7CisgICAgZHhnaWxpYiA9IExvYWRMaWJyYXJ5KCJkeGdpLmRsbCIpOworICAgIGlmICghZDNkbGliIHx8ICFkeGdpbGliKQorICAgICAgICByZXR1cm47CisKKyAgICBtRDNEMTFDcmVhdGVEZXZpY2UgPSAoUEZOX0QzRDExX0NSRUFURV9ERVZJQ0UpIEdldFByb2NBZGRyZXNzKGQzZGxpYiwgIkQzRDExQ3JlYXRlRGV2aWNlIik7CisgICAgbUNyZWF0ZURYR0lGYWN0b3J5ID0gKFBGTl9DUkVBVEVfRFhHSV9GQUNUT1JZKSBHZXRQcm9jQWRkcmVzcyhkeGdpbGliLCAiQ3JlYXRlRFhHSUZhY3RvcnkiKTsKKyNlbHNlCisgICAgLy8gSW4gVVdQICh3aGljaCBsYWNrcyBMb2FkTGlicmFyeSksIENyZWF0ZURYR0lGYWN0b3J5IGlzbid0IGF2YWlsYWJsZSwKKyAgICAvLyBvbmx5IENyZWF0ZURYR0lGYWN0b3J5MQorICAgIG1EM0QxMUNyZWF0ZURldmljZSA9IChQRk5fRDNEMTFfQ1JFQVRFX0RFVklDRSkgRDNEMTFDcmVhdGVEZXZpY2U7CisgICAgbUNyZWF0ZURYR0lGYWN0b3J5ID0gKFBGTl9DUkVBVEVfRFhHSV9GQUNUT1JZKSBDcmVhdGVEWEdJRmFjdG9yeTE7CisjZW5kaWYKK30KKwordHlwZWRlZiBzdHJ1Y3QgRDNEMTFWQUZyYW1lc0NvbnRleHQgeworICAgIGludCBuYl9zdXJmYWNlc191c2VkOworCisgICAgRFhHSV9GT1JNQVQgZm9ybWF0OworCisgICAgSUQzRDExVGV4dHVyZTJEICpzdGFnaW5nX3RleHR1cmU7Cit9IEQzRDExVkFGcmFtZXNDb250ZXh0OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBEWEdJX0ZPUk1BVCBkM2RfZm9ybWF0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworfSBzdXBwb3J0ZWRfZm9ybWF0c1tdID0geworICAgIHsgRFhHSV9GT1JNQVRfTlYxMiwgICAgICAgICBBVl9QSVhfRk1UX05WMTIgfSwKKyAgICB7IERYR0lfRk9STUFUX1AwMTAsICAgICAgICAgQVZfUElYX0ZNVF9QMDEwIH0sCisgICAgLy8gU3BlY2lhbCBvcGFxdWUgZm9ybWF0cy4gVGhlIHBpeF9mbXQgaXMgbWVyZWx5IGEgcGxhY2UgaG9sZGVyLCBhcyB0aGUKKyAgICAvLyBvcGFxdWUgZm9ybWF0IGNhbm5vdCBiZSBhY2Nlc3NlZCBkaXJlY3RseS4KKyAgICB7IERYR0lfRk9STUFUXzQyMF9PUEFRVUUsICAgQVZfUElYX0ZNVF9ZVVY0MjBQIH0sCit9OworCitzdGF0aWMgdm9pZCBkM2QxMXZhX2RlZmF1bHRfbG9jayh2b2lkICpjdHgpCit7CisgICAgV2FpdEZvclNpbmdsZU9iamVjdEV4KGN0eCwgSU5GSU5JVEUsIEZBTFNFKTsKK30KKworc3RhdGljIHZvaWQgZDNkMTF2YV9kZWZhdWx0X3VubG9jayh2b2lkICpjdHgpCit7CisgICAgUmVsZWFzZU11dGV4KGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIGQzZDExdmFfZnJhbWVzX3VuaW5pdChBVkhXRnJhbWVzQ29udGV4dCAqY3R4KQoreworICAgIEFWRDNEMTFWQUZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGN0eC0+aHdjdHg7CisgICAgRDNEMTFWQUZyYW1lc0NvbnRleHQgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworCisgICAgaWYgKGZyYW1lc19od2N0eC0+dGV4dHVyZSkKKyAgICAgICAgSUQzRDExVGV4dHVyZTJEX1JlbGVhc2UoZnJhbWVzX2h3Y3R4LT50ZXh0dXJlKTsKKyAgICBmcmFtZXNfaHdjdHgtPnRleHR1cmUgPSBOVUxMOworCisgICAgaWYgKHMtPnN0YWdpbmdfdGV4dHVyZSkKKyAgICAgICAgSUQzRDExVGV4dHVyZTJEX1JlbGVhc2Uocy0+c3RhZ2luZ190ZXh0dXJlKTsKKyAgICBzLT5zdGFnaW5nX3RleHR1cmUgPSBOVUxMOworfQorCitzdGF0aWMgaW50IGQzZDExdmFfZnJhbWVzX2dldF9jb25zdHJhaW50cyhBVkhXRGV2aWNlQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaHdjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29uc3RyYWludHMgKmNvbnN0cmFpbnRzKQoreworICAgIEFWRDNEMTFWQURldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGN0eC0+aHdjdHg7CisgICAgaW50IG5iX3N3X2Zvcm1hdHMgPSAwOworICAgIEhSRVNVTFQgaHI7CisgICAgaW50IGk7CisKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cyA9IGF2X21hbGxvY19hcnJheShGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfZm9ybWF0cykgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHMpKTsKKyAgICBpZiAoIWNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHN1cHBvcnRlZF9mb3JtYXRzKTsgaSsrKSB7CisgICAgICAgIFVJTlQgZm9ybWF0X3N1cHBvcnQgPSAwOworICAgICAgICBociA9IElEM0QxMURldmljZV9DaGVja0Zvcm1hdFN1cHBvcnQoZGV2aWNlX2h3Y3R4LT5kZXZpY2UsIHN1cHBvcnRlZF9mb3JtYXRzW2ldLmQzZF9mb3JtYXQsICZmb3JtYXRfc3VwcG9ydCk7CisgICAgICAgIGlmIChTVUNDRUVERUQoaHIpICYmIChmb3JtYXRfc3VwcG9ydCAmIEQzRDExX0ZPUk1BVF9TVVBQT1JUX1RFWFRVUkUyRCkpCisgICAgICAgICAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0c1tuYl9zd19mb3JtYXRzKytdID0gc3VwcG9ydGVkX2Zvcm1hdHNbaV0ucGl4X2ZtdDsKKyAgICB9CisgICAgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHNbbmJfc3dfZm9ybWF0c10gPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0cyA9IGF2X21hbGxvY19hcnJheSgyLCBzaXplb2YoKmNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzKSk7CisgICAgaWYgKCFjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzWzBdID0gQVZfUElYX0ZNVF9EM0QxMTsKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0c1sxXSA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3RleHR1cmUodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQoreworICAgIElEM0QxMVRleHR1cmUyRF9SZWxlYXNlKChJRDNEMTFUZXh0dXJlMkQgKilvcGFxdWUpOworICAgIGF2X2ZyZWUoZGF0YSk7Cit9CisKK3N0YXRpYyBBVkJ1ZmZlclJlZiAqd3JhcF90ZXh0dXJlX2J1ZihJRDNEMTFUZXh0dXJlMkQgKnRleCwgaW50IGluZGV4KQoreworICAgIEFWQnVmZmVyUmVmICpidWY7CisgICAgQVZEM0QxMUZyYW1lRGVzY3JpcHRvciAqZGVzYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpkZXNjKSk7CisgICAgaWYgKCFkZXNjKSB7CisgICAgICAgIElEM0QxMVRleHR1cmUyRF9SZWxlYXNlKHRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGRlc2MtPnRleHR1cmUgPSB0ZXg7CisgICAgZGVzYy0+aW5kZXggICA9IGluZGV4OworCisgICAgYnVmID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCAqKWRlc2MsIHNpemVvZihkZXNjKSwgZnJlZV90ZXh0dXJlLCB0ZXgsIDApOworICAgIGlmICghYnVmKSB7CisgICAgICAgIElEM0QxMVRleHR1cmUyRF9SZWxlYXNlKHRleCk7CisgICAgICAgIGF2X2ZyZWUoZGVzYyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKK3N0YXRpYyBBVkJ1ZmZlclJlZiAqZDNkMTF2YV9hbGxvY19zaW5nbGUoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCkKK3sKKyAgICBEM0QxMVZBRnJhbWVzQ29udGV4dCAgICAgICAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZEM0QxMVZBRnJhbWVzQ29udGV4dCAqaHdjdHggPSBjdHgtPmh3Y3R4OworICAgIEFWRDNEMTFWQURldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGN0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgSFJFU1VMVCBocjsKKyAgICBJRDNEMTFUZXh0dXJlMkQgKnRleDsKKyAgICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXhEZXNjID0geworICAgICAgICAuV2lkdGggICAgICA9IGN0eC0+d2lkdGgsCisgICAgICAgIC5IZWlnaHQgICAgID0gY3R4LT5oZWlnaHQsCisgICAgICAgIC5NaXBMZXZlbHMgID0gMSwKKyAgICAgICAgLkZvcm1hdCAgICAgPSBzLT5mb3JtYXQsCisgICAgICAgIC5TYW1wbGVEZXNjID0geyAuQ291bnQgPSAxIH0sCisgICAgICAgIC5BcnJheVNpemUgID0gMSwKKyAgICAgICAgLlVzYWdlICAgICAgPSBEM0QxMV9VU0FHRV9ERUZBVUxULAorICAgICAgICAuQmluZEZsYWdzICA9IGh3Y3R4LT5CaW5kRmxhZ3MsCisgICAgICAgIC5NaXNjRmxhZ3MgID0gaHdjdHgtPk1pc2NGbGFncywKKyAgICB9OworCisgICAgaHIgPSBJRDNEMTFEZXZpY2VfQ3JlYXRlVGV4dHVyZTJEKGRldmljZV9od2N0eC0+ZGV2aWNlLCAmdGV4RGVzYywgTlVMTCwgJnRleCk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSB0aGUgdGV4dHVyZSAoJWx4KVxuIiwgKGxvbmcpaHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gd3JhcF90ZXh0dXJlX2J1Zih0ZXgsIDApOworfQorCitzdGF0aWMgQVZCdWZmZXJSZWYgKmQzZDExdmFfcG9vbF9hbGxvYyh2b2lkICpvcGFxdWUsIGludCBzaXplKQoreworICAgIEFWSFdGcmFtZXNDb250ZXh0ICAgICAgICAqY3R4ID0gKEFWSFdGcmFtZXNDb250ZXh0KilvcGFxdWU7CisgICAgRDNEMTFWQUZyYW1lc0NvbnRleHQgICAgICAgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIEFWRDNEMTFWQUZyYW1lc0NvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBEM0QxMV9URVhUVVJFMkRfREVTQyAgdGV4RGVzYzsKKworICAgIGlmICghaHdjdHgtPnRleHR1cmUpCisgICAgICAgIHJldHVybiBkM2QxMXZhX2FsbG9jX3NpbmdsZShjdHgpOworCisgICAgSUQzRDExVGV4dHVyZTJEX0dldERlc2MoaHdjdHgtPnRleHR1cmUsICZ0ZXhEZXNjKTsKKworICAgIGlmIChzLT5uYl9zdXJmYWNlc191c2VkID49IHRleERlc2MuQXJyYXlTaXplKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlN0YXRpYyBzdXJmYWNlIHBvb2wgc2l6ZSBleGNlZWRlZC5cbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBJRDNEMTFUZXh0dXJlMkRfQWRkUmVmKGh3Y3R4LT50ZXh0dXJlKTsKKyAgICByZXR1cm4gd3JhcF90ZXh0dXJlX2J1Zihod2N0eC0+dGV4dHVyZSwgcy0+bmJfc3VyZmFjZXNfdXNlZCsrKTsKK30KKworc3RhdGljIGludCBkM2QxMXZhX2ZyYW1lc19pbml0KEFWSFdGcmFtZXNDb250ZXh0ICpjdHgpCit7CisgICAgQVZEM0QxMVZBRnJhbWVzQ29udGV4dCAqaHdjdHggICAgICAgID0gY3R4LT5od2N0eDsKKyAgICBBVkQzRDExVkFEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBjdHgtPmRldmljZV9jdHgtPmh3Y3R4OworICAgIEQzRDExVkFGcmFtZXNDb250ZXh0ICAgICAgICAgICAgICAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisKKyAgICBpbnQgaTsKKyAgICBIUkVTVUxUIGhyOworICAgIEQzRDExX1RFWFRVUkUyRF9ERVNDIHRleERlc2M7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc3VwcG9ydGVkX2Zvcm1hdHMpOyBpKyspIHsKKyAgICAgICAgaWYgKGN0eC0+c3dfZm9ybWF0ID09IHN1cHBvcnRlZF9mb3JtYXRzW2ldLnBpeF9mbXQpIHsKKyAgICAgICAgICAgIHMtPmZvcm1hdCA9IHN1cHBvcnRlZF9mb3JtYXRzW2ldLmQzZF9mb3JtYXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfZm9ybWF0cykpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgcGl4ZWwgZm9ybWF0OiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5zd19mb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB0ZXhEZXNjID0gKEQzRDExX1RFWFRVUkUyRF9ERVNDKXsKKyAgICAgICAgLldpZHRoICAgICAgPSBjdHgtPndpZHRoLAorICAgICAgICAuSGVpZ2h0ICAgICA9IGN0eC0+aGVpZ2h0LAorICAgICAgICAuTWlwTGV2ZWxzICA9IDEsCisgICAgICAgIC5Gb3JtYXQgICAgID0gcy0+Zm9ybWF0LAorICAgICAgICAuU2FtcGxlRGVzYyA9IHsgLkNvdW50ID0gMSB9LAorICAgICAgICAuQXJyYXlTaXplICA9IGN0eC0+aW5pdGlhbF9wb29sX3NpemUsCisgICAgICAgIC5Vc2FnZSAgICAgID0gRDNEMTFfVVNBR0VfREVGQVVMVCwKKyAgICAgICAgLkJpbmRGbGFncyAgPSBod2N0eC0+QmluZEZsYWdzLAorICAgICAgICAuTWlzY0ZsYWdzICA9IGh3Y3R4LT5NaXNjRmxhZ3MsCisgICAgfTsKKworICAgIGlmIChod2N0eC0+dGV4dHVyZSkgeworICAgICAgICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXhEZXNjMjsKKyAgICAgICAgSUQzRDExVGV4dHVyZTJEX0dldERlc2MoaHdjdHgtPnRleHR1cmUsICZ0ZXhEZXNjMik7CisKKyAgICAgICAgaWYgKHRleERlc2MuV2lkdGggIT0gdGV4RGVzYzIuV2lkdGggfHwKKyAgICAgICAgICAgIHRleERlc2MuSGVpZ2h0ICE9IHRleERlc2MyLkhlaWdodCB8fAorICAgICAgICAgICAgdGV4RGVzYy5Gb3JtYXQgIT0gdGV4RGVzYzIuRm9ybWF0KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVc2VyLXByb3ZpZGVkIHRleHR1cmUgaGFzIG1pc21hdGNoaW5nIHBhcmFtZXRlcnNcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodGV4RGVzYy5BcnJheVNpemUgPiAwKSB7CisgICAgICAgIGhyID0gSUQzRDExRGV2aWNlX0NyZWF0ZVRleHR1cmUyRChkZXZpY2VfaHdjdHgtPmRldmljZSwgJnRleERlc2MsIE5VTEwsICZod2N0eC0+dGV4dHVyZSk7CisgICAgICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIHRoZSB0ZXh0dXJlICglbHgpXG4iLCAobG9uZylocik7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgICAgICB9CisgICAgfQorCisgICAgY3R4LT5pbnRlcm5hbC0+cG9vbF9pbnRlcm5hbCA9IGF2X2J1ZmZlcl9wb29sX2luaXQyKHNpemVvZihBVkQzRDExRnJhbWVEZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LCBkM2QxMXZhX3Bvb2xfYWxsb2MsIE5VTEwpOworICAgIGlmICghY3R4LT5pbnRlcm5hbC0+cG9vbF9pbnRlcm5hbCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGQzZDExdmFfZ2V0X2J1ZmZlcihBVkhXRnJhbWVzQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVkQzRDExRnJhbWVEZXNjcmlwdG9yICpkZXNjOworCisgICAgZnJhbWUtPmJ1ZlswXSA9IGF2X2J1ZmZlcl9wb29sX2dldChjdHgtPnBvb2wpOworICAgIGlmICghZnJhbWUtPmJ1ZlswXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGRlc2MgPSAoQVZEM0QxMUZyYW1lRGVzY3JpcHRvciAqKWZyYW1lLT5idWZbMF0tPmRhdGE7CisKKyAgICBmcmFtZS0+ZGF0YVswXSA9ICh1aW50OF90ICopZGVzYy0+dGV4dHVyZTsKKyAgICBmcmFtZS0+ZGF0YVsxXSA9ICh1aW50OF90ICopZGVzYy0+aW5kZXg7CisgICAgZnJhbWUtPmZvcm1hdCAgPSBBVl9QSVhfRk1UX0QzRDExOworICAgIGZyYW1lLT53aWR0aCAgID0gY3R4LT53aWR0aDsKKyAgICBmcmFtZS0+aGVpZ2h0ICA9IGN0eC0+aGVpZ2h0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZDNkMTF2YV90cmFuc2Zlcl9nZXRfZm9ybWF0cyhBVkhXRnJhbWVzQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZIV0ZyYW1lVHJhbnNmZXJEaXJlY3Rpb24gZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqKmZvcm1hdHMpCit7CisgICAgRDNEMTFWQUZyYW1lc0NvbnRleHQgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqZm10czsKKworICAgIGZtdHMgPSBhdl9tYWxsb2NfYXJyYXkoMiwgc2l6ZW9mKCpmbXRzKSk7CisgICAgaWYgKCFmbXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm10c1swXSA9IGN0eC0+c3dfZm9ybWF0OworICAgIGZtdHNbMV0gPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICAvLyBEb24ndCBzaWduYWwgc3VwcG9ydCBmb3Igb3BhcXVlIGZvcm1hdHMuIEFjdHVhbCBhY2Nlc3Mgd291bGQgZmFpbC4KKyAgICBpZiAocy0+Zm9ybWF0ID09IERYR0lfRk9STUFUXzQyMF9PUEFRVUUpCisgICAgICAgIGZtdHNbMF0gPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICAqZm9ybWF0cyA9IGZtdHM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkM2QxMXZhX2NyZWF0ZV9zdGFnaW5nX3RleHR1cmUoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCkKK3sKKyAgICBBVkQzRDExVkFEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBjdHgtPmRldmljZV9jdHgtPmh3Y3R4OworICAgIEQzRDExVkFGcmFtZXNDb250ZXh0ICAgICAgICAgICAgICAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgSFJFU1VMVCBocjsKKyAgICBEM0QxMV9URVhUVVJFMkRfREVTQyB0ZXhEZXNjID0geworICAgICAgICAuV2lkdGggICAgICAgICAgPSBjdHgtPndpZHRoLAorICAgICAgICAuSGVpZ2h0ICAgICAgICAgPSBjdHgtPmhlaWdodCwKKyAgICAgICAgLk1pcExldmVscyAgICAgID0gMSwKKyAgICAgICAgLkZvcm1hdCAgICAgICAgID0gcy0+Zm9ybWF0LAorICAgICAgICAuU2FtcGxlRGVzYyAgICAgPSB7IC5Db3VudCA9IDEgfSwKKyAgICAgICAgLkFycmF5U2l6ZSAgICAgID0gMSwKKyAgICAgICAgLlVzYWdlICAgICAgICAgID0gRDNEMTFfVVNBR0VfU1RBR0lORywKKyAgICAgICAgLkNQVUFjY2Vzc0ZsYWdzID0gRDNEMTFfQ1BVX0FDQ0VTU19SRUFEIHwgRDNEMTFfQ1BVX0FDQ0VTU19XUklURSwKKyAgICB9OworCisgICAgaHIgPSBJRDNEMTFEZXZpY2VfQ3JlYXRlVGV4dHVyZTJEKGRldmljZV9od2N0eC0+ZGV2aWNlLCAmdGV4RGVzYywgTlVMTCwgJnMtPnN0YWdpbmdfdGV4dHVyZSk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ291bGQgbm90IGNyZWF0ZSB0aGUgc3RhZ2luZyB0ZXh0dXJlICglbHgpXG4iLCAobG9uZylocik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfdGV4dHVyZV9wdHJzKHVpbnQ4X3QgKmRhdGFbNF0sIGludCBsaW5lc2l6ZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0QxMV9URVhUVVJFMkRfREVTQyAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRDExX01BUFBFRF9TVUJSRVNPVVJDRSAqbWFwKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgbGluZXNpemVbaV0gPSBtYXAtPlJvd1BpdGNoOworCisgICAgYXZfaW1hZ2VfZmlsbF9wb2ludGVycyhkYXRhLCBjdHgtPnN3X2Zvcm1hdCwgZGVzYy0+SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKW1hcC0+cERhdGEsIGxpbmVzaXplKTsKK30KKworc3RhdGljIGludCBkM2QxMXZhX3RyYW5zZmVyX2RhdGEoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjKQoreworICAgIEFWRDNEMTFWQURldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGN0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgRDNEMTFWQUZyYW1lc0NvbnRleHQgICAgICAgICAgICAgICpzID0gY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBpbnQgZG93bmxvYWQgPSBzcmMtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX0QzRDExOworICAgIGNvbnN0IEFWRnJhbWUgKmZyYW1lID0gZG93bmxvYWQgPyBzcmMgOiBkc3Q7CisgICAgY29uc3QgQVZGcmFtZSAqb3RoZXIgPSBkb3dubG9hZCA/IGRzdCA6IHNyYzsKKyAgICAvLyAoVGhlIGludGVyZmFjZSB0eXBlcyBhcmUgY29tcGF0aWJsZS4pCisgICAgSUQzRDExUmVzb3VyY2UgKnRleHR1cmUgPSAoSUQzRDExUmVzb3VyY2UgKikoSUQzRDExVGV4dHVyZTJEICopZnJhbWUtPmRhdGFbMF07CisgICAgaW50IGluZGV4ID0gKGludHB0cl90KWZyYW1lLT5kYXRhWzFdOworICAgIElEM0QxMVJlc291cmNlICpzdGFnaW5nOworICAgIGludCB3ID0gRkZNSU4oZHN0LT53aWR0aCwgIHNyYy0+d2lkdGgpOworICAgIGludCBoID0gRkZNSU4oZHN0LT5oZWlnaHQsIHNyYy0+aGVpZ2h0KTsKKyAgICB1aW50OF90ICptYXBfZGF0YVs0XTsKKyAgICBpbnQgbWFwX2xpbmVzaXplWzRdOworICAgIEQzRDExX1RFWFRVUkUyRF9ERVNDIGRlc2M7CisgICAgRDNEMTFfTUFQUEVEX1NVQlJFU09VUkNFIG1hcDsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaWYgKGZyYW1lLT5od19mcmFtZXNfY3R4LT5kYXRhICE9ICh1aW50OF90ICopY3R4IHx8IG90aGVyLT5mb3JtYXQgIT0gY3R4LT5zd19mb3JtYXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBkZXZpY2VfaHdjdHgtPmxvY2soZGV2aWNlX2h3Y3R4LT5sb2NrX2N0eCk7CisKKyAgICBpZiAoIXMtPnN0YWdpbmdfdGV4dHVyZSkgeworICAgICAgICBpbnQgcmVzID0gZDNkMTF2YV9jcmVhdGVfc3RhZ2luZ190ZXh0dXJlKGN0eCk7CisgICAgICAgIGlmIChyZXMgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGFnaW5nID0gKElEM0QxMVJlc291cmNlICopcy0+c3RhZ2luZ190ZXh0dXJlOworCisgICAgSUQzRDExVGV4dHVyZTJEX0dldERlc2Mocy0+c3RhZ2luZ190ZXh0dXJlLCAmZGVzYyk7CisKKyAgICBpZiAoZG93bmxvYWQpIHsKKyAgICAgICAgSUQzRDExRGV2aWNlQ29udGV4dF9Db3B5U3VicmVzb3VyY2VSZWdpb24oZGV2aWNlX2h3Y3R4LT5kZXZpY2VfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2luZywgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZSwgaW5kZXgsIE5VTEwpOworCisgICAgICAgIGhyID0gSUQzRDExRGV2aWNlQ29udGV4dF9NYXAoZGV2aWNlX2h3Y3R4LT5kZXZpY2VfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnaW5nLCAwLCBEM0QxMV9NQVBfUkVBRCwgMCwgJm1hcCk7CisgICAgICAgIGlmIChGQUlMRUQoaHIpKQorICAgICAgICAgICAgZ290byBtYXBfZmFpbGVkOworCisgICAgICAgIGZpbGxfdGV4dHVyZV9wdHJzKG1hcF9kYXRhLCBtYXBfbGluZXNpemUsIGN0eCwgJmRlc2MsICZtYXApOworCisgICAgICAgIGF2X2ltYWdlX2NvcHkoZHN0LT5kYXRhLCBkc3QtPmxpbmVzaXplLCBtYXBfZGF0YSwgbWFwX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGN0eC0+c3dfZm9ybWF0LCB3LCBoKTsKKworICAgICAgICBJRDNEMTFEZXZpY2VDb250ZXh0X1VubWFwKGRldmljZV9od2N0eC0+ZGV2aWNlX2NvbnRleHQsIHN0YWdpbmcsIDApOworICAgIH0gZWxzZSB7CisgICAgICAgIGhyID0gSUQzRDExRGV2aWNlQ29udGV4dF9NYXAoZGV2aWNlX2h3Y3R4LT5kZXZpY2VfY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFnaW5nLCAwLCBEM0QxMV9NQVBfV1JJVEUsIDAsICZtYXApOworICAgICAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICAgICAgICAgIGdvdG8gbWFwX2ZhaWxlZDsKKworICAgICAgICBmaWxsX3RleHR1cmVfcHRycyhtYXBfZGF0YSwgbWFwX2xpbmVzaXplLCBjdHgsICZkZXNjLCAmbWFwKTsKKworICAgICAgICBhdl9pbWFnZV9jb3B5KG1hcF9kYXRhLCBtYXBfbGluZXNpemUsIHNyYy0+ZGF0YSwgc3JjLT5saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBjdHgtPnN3X2Zvcm1hdCwgdywgaCk7CisKKyAgICAgICAgSUQzRDExRGV2aWNlQ29udGV4dF9Vbm1hcChkZXZpY2VfaHdjdHgtPmRldmljZV9jb250ZXh0LCBzdGFnaW5nLCAwKTsKKworICAgICAgICBJRDNEMTFEZXZpY2VDb250ZXh0X0NvcHlTdWJyZXNvdXJjZVJlZ2lvbihkZXZpY2VfaHdjdHgtPmRldmljZV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlLCBpbmRleCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2luZywgMCwgTlVMTCk7CisgICAgfQorCisgICAgZGV2aWNlX2h3Y3R4LT51bmxvY2soZGV2aWNlX2h3Y3R4LT5sb2NrX2N0eCk7CisgICAgcmV0dXJuIDA7CisKK21hcF9mYWlsZWQ6CisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGxvY2sgRDNEMTFWQSBzdXJmYWNlICglbHgpXG4iLCAobG9uZylocik7CisgICAgZGV2aWNlX2h3Y3R4LT51bmxvY2soZGV2aWNlX2h3Y3R4LT5sb2NrX2N0eCk7CisgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKK30KKworc3RhdGljIGludCBkM2QxMXZhX2RldmljZV9pbml0KEFWSFdEZXZpY2VDb250ZXh0ICpod2RldikKK3sKKyAgICBBVkQzRDExVkFEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBod2Rldi0+aHdjdHg7CisgICAgSFJFU1VMVCBocjsKKworICAgIGlmICghZGV2aWNlX2h3Y3R4LT5sb2NrKSB7CisgICAgICAgIGRldmljZV9od2N0eC0+bG9ja19jdHggPSBDcmVhdGVNdXRleChOVUxMLCAwLCBOVUxMKTsKKyAgICAgICAgaWYgKGRldmljZV9od2N0eC0+bG9ja19jdHggPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGEgbXV0ZXhcbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2VfaHdjdHgtPmxvY2sgICA9IGQzZDExdmFfZGVmYXVsdF9sb2NrOworICAgICAgICBkZXZpY2VfaHdjdHgtPnVubG9jayA9IGQzZDExdmFfZGVmYXVsdF91bmxvY2s7CisgICAgfQorCisgICAgaWYgKCFkZXZpY2VfaHdjdHgtPmRldmljZV9jb250ZXh0KSB7CisgICAgICAgIElEM0QxMURldmljZV9HZXRJbW1lZGlhdGVDb250ZXh0KGRldmljZV9od2N0eC0+ZGV2aWNlLCAmZGV2aWNlX2h3Y3R4LT5kZXZpY2VfY29udGV4dCk7CisgICAgICAgIGlmICghZGV2aWNlX2h3Y3R4LT5kZXZpY2VfY29udGV4dCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKCFkZXZpY2VfaHdjdHgtPnZpZGVvX2RldmljZSkgeworICAgICAgICBociA9IElEM0QxMURldmljZUNvbnRleHRfUXVlcnlJbnRlcmZhY2UoZGV2aWNlX2h3Y3R4LT5kZXZpY2UsICZJSURfSUQzRDExVmlkZW9EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKikmZGV2aWNlX2h3Y3R4LT52aWRlb19kZXZpY2UpOworICAgICAgICBpZiAoRkFJTEVEKGhyKSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKCFkZXZpY2VfaHdjdHgtPnZpZGVvX2NvbnRleHQpIHsKKyAgICAgICAgaHIgPSBJRDNEMTFEZXZpY2VDb250ZXh0X1F1ZXJ5SW50ZXJmYWNlKGRldmljZV9od2N0eC0+ZGV2aWNlX2NvbnRleHQsICZJSURfSUQzRDExVmlkZW9Db250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJmRldmljZV9od2N0eC0+dmlkZW9fY29udGV4dCk7CisgICAgICAgIGlmIChGQUlMRUQoaHIpKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZDNkMTF2YV9kZXZpY2VfdW5pbml0KEFWSFdEZXZpY2VDb250ZXh0ICpod2RldikKK3sKKyAgICBBVkQzRDExVkFEZXZpY2VDb250ZXh0ICpkZXZpY2VfaHdjdHggPSBod2Rldi0+aHdjdHg7CisKKyAgICBpZiAoZGV2aWNlX2h3Y3R4LT5kZXZpY2UpIHsKKyAgICAgICAgSUQzRDExRGV2aWNlX1JlbGVhc2UoZGV2aWNlX2h3Y3R4LT5kZXZpY2UpOworICAgICAgICBkZXZpY2VfaHdjdHgtPmRldmljZSA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGRldmljZV9od2N0eC0+ZGV2aWNlX2NvbnRleHQpIHsKKyAgICAgICAgSUQzRDExRGV2aWNlQ29udGV4dF9SZWxlYXNlKGRldmljZV9od2N0eC0+ZGV2aWNlX2NvbnRleHQpOworICAgICAgICBkZXZpY2VfaHdjdHgtPmRldmljZV9jb250ZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX2h3Y3R4LT52aWRlb19kZXZpY2UpIHsKKyAgICAgICAgSUQzRDExVmlkZW9EZXZpY2VfUmVsZWFzZShkZXZpY2VfaHdjdHgtPnZpZGVvX2RldmljZSk7CisgICAgICAgIGRldmljZV9od2N0eC0+dmlkZW9fZGV2aWNlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX2h3Y3R4LT52aWRlb19jb250ZXh0KSB7CisgICAgICAgIElEM0QxMVZpZGVvQ29udGV4dF9SZWxlYXNlKGRldmljZV9od2N0eC0+dmlkZW9fY29udGV4dCk7CisgICAgICAgIGRldmljZV9od2N0eC0+dmlkZW9fY29udGV4dCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGRldmljZV9od2N0eC0+bG9jayA9PSBkM2QxMXZhX2RlZmF1bHRfbG9jaykgeworICAgICAgICBDbG9zZUhhbmRsZShkZXZpY2VfaHdjdHgtPmxvY2tfY3R4KTsKKyAgICAgICAgZGV2aWNlX2h3Y3R4LT5sb2NrX2N0eCA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgICAgICBkZXZpY2VfaHdjdHgtPmxvY2sgPSBOVUxMOworICAgIH0KK30KKworc3RhdGljIGludCBkM2QxMXZhX2RldmljZV9jcmVhdGUoQVZIV0RldmljZUNvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzLCBpbnQgZmxhZ3MpCit7CisgICAgQVZEM0QxMVZBRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4ID0gY3R4LT5od2N0eDsKKworICAgIEhSRVNVTFQgaHI7CisgICAgSURYR0lBZGFwdGVyICAgICAgICAgICAqcEFkYXB0ZXIgPSBOVUxMOworICAgIElEM0QxME11bHRpdGhyZWFkICAgICAgKnBNdWx0aXRocmVhZDsKKyAgICBVSU5UIGNyZWF0aW9uRmxhZ3MgPSBEM0QxMV9DUkVBVEVfREVWSUNFX1ZJREVPX1NVUFBPUlQ7CisgICAgaW50IGlzX2RlYnVnICAgICAgID0gISFhdl9kaWN0X2dldChvcHRzLCAiZGVidWciLCBOVUxMLCAwKTsKKyAgICBpbnQgcmV0OworCisgICAgLy8gKE9uIFVXUCB3ZSBjYW4ndCBjaGVjayB0aGlzLikKKyNpZiAhSEFWRV9VV1AKKyAgICBpZiAoIUxvYWRMaWJyYXJ5KCJkM2QxMV8xc2RrbGF5ZXJzLmRsbCIpKQorICAgICAgICBpc19kZWJ1ZyA9IDA7CisjZW5kaWYKKworICAgIGlmIChpc19kZWJ1ZykKKyAgICAgICAgY3JlYXRpb25GbGFncyB8PSBEM0QxMV9DUkVBVEVfREVWSUNFX0RFQlVHOworCisgICAgaWYgKChyZXQgPSBmZl90aHJlYWRfb25jZSgmZnVuY3Rpb25zX2xvYWRlZCwgbG9hZF9mdW5jdGlvbnMpKSAhPSAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIGlmICghbUQzRDExQ3JlYXRlRGV2aWNlIHx8ICFtQ3JlYXRlRFhHSUZhY3RvcnkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGxvYWQgRDNEMTEgbGlicmFyeSBvciBpdHMgZnVuY3Rpb25zXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlKSB7CisgICAgICAgIElEWEdJRmFjdG9yeTIgKnBEWEdJRmFjdG9yeTsKKyAgICAgICAgaHIgPSBtQ3JlYXRlRFhHSUZhY3RvcnkoJklJRF9JRFhHSUZhY3RvcnkyLCAodm9pZCAqKikmcERYR0lGYWN0b3J5KTsKKyAgICAgICAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICAgICAgICAgIGludCBhZGFwdGVyID0gYXRvaShkZXZpY2UpOworICAgICAgICAgICAgaWYgKEZBSUxFRChJRFhHSUZhY3RvcnkyX0VudW1BZGFwdGVycyhwRFhHSUZhY3RvcnksIGFkYXB0ZXIsICZwQWRhcHRlcikpKQorICAgICAgICAgICAgICAgIHBBZGFwdGVyID0gTlVMTDsKKyAgICAgICAgICAgIElEWEdJRmFjdG9yeTJfUmVsZWFzZShwRFhHSUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBBZGFwdGVyKSB7CisgICAgICAgIERYR0lfQURBUFRFUl9ERVNDMiBkZXNjOworICAgICAgICBociA9IElEWEdJQWRhcHRlcjJfR2V0RGVzYyhwQWRhcHRlciwgJmRlc2MpOworICAgICAgICBpZiAoIUZBSUxFRChocikpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAiVXNpbmcgZGV2aWNlICUwNHg6JTA0eCAoJWxzKS5cbiIsCisgICAgICAgICAgICAgICAgICAgZGVzYy5WZW5kb3JJZCwgZGVzYy5EZXZpY2VJZCwgZGVzYy5EZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBociA9IG1EM0QxMUNyZWF0ZURldmljZShwQWRhcHRlciwgcEFkYXB0ZXIgPyBEM0RfRFJJVkVSX1RZUEVfVU5LTk9XTiA6IEQzRF9EUklWRVJfVFlQRV9IQVJEV0FSRSwgTlVMTCwgY3JlYXRpb25GbGFncywgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICBEM0QxMV9TREtfVkVSU0lPTiwgJmRldmljZV9od2N0eC0+ZGV2aWNlLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAocEFkYXB0ZXIpCisgICAgICAgIElEWEdJQWRhcHRlcl9SZWxlYXNlKHBBZGFwdGVyKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIERpcmVjdDNEIGRldmljZSAoJWx4KVxuIiwgKGxvbmcpaHIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGhyID0gSUQzRDExRGV2aWNlX1F1ZXJ5SW50ZXJmYWNlKGRldmljZV9od2N0eC0+ZGV2aWNlLCAmSUlEX0lEM0QxME11bHRpdGhyZWFkLCAodm9pZCAqKikmcE11bHRpdGhyZWFkKTsKKyAgICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgICAgICBJRDNEMTBNdWx0aXRocmVhZF9TZXRNdWx0aXRocmVhZFByb3RlY3RlZChwTXVsdGl0aHJlYWQsIFRSVUUpOworICAgICAgICBJRDNEMTBNdWx0aXRocmVhZF9SZWxlYXNlKHBNdWx0aXRocmVhZCk7CisgICAgfQorCisjaWYgIUhBVkVfVVdQICYmIEhBVkVfRFhHSURFQlVHX0gKKyAgICBpZiAoaXNfZGVidWcpIHsKKyAgICAgICAgSEFORExFIGR4Z2lkZWJ1Z19kbGwgPSBMb2FkTGlicmFyeSgiZHhnaWRlYnVnLmRsbCIpOworICAgICAgICBpZiAoZHhnaWRlYnVnX2RsbCkgeworICAgICAgICAgICAgSFJFU1VMVCAoV0lOQVBJICAqIHBmX0RYR0lHZXREZWJ1Z0ludGVyZmFjZSkoY29uc3QgR1VJRCAqcmlpZCwgdm9pZCAqKnBwRGVidWcpCisgICAgICAgICAgICAgICAgPSAodm9pZCAqKUdldFByb2NBZGRyZXNzKGR4Z2lkZWJ1Z19kbGwsICJEWEdJR2V0RGVidWdJbnRlcmZhY2UiKTsKKyAgICAgICAgICAgIGlmIChwZl9EWEdJR2V0RGVidWdJbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICBJRFhHSURlYnVnICpkeGdpX2RlYnVnID0gTlVMTDsKKyAgICAgICAgICAgICAgICBociA9IHBmX0RYR0lHZXREZWJ1Z0ludGVyZmFjZSgmSUlEX0lEWEdJRGVidWcsICh2b2lkKiopJmR4Z2lfZGVidWcpOworICAgICAgICAgICAgICAgIGlmIChTVUNDRUVERUQoaHIpICYmIGR4Z2lfZGVidWcpCisgICAgICAgICAgICAgICAgICAgIElEWEdJRGVidWdfUmVwb3J0TGl2ZU9iamVjdHMoZHhnaV9kZWJ1ZywgRFhHSV9ERUJVR19BTEwsIERYR0lfREVCVUdfUkxPX0FMTCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiAwOworfQorCitjb25zdCBIV0NvbnRleHRUeXBlIGZmX2h3Y29udGV4dF90eXBlX2QzZDExdmEgPSB7CisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZfSFdERVZJQ0VfVFlQRV9EM0QxMVZBLAorICAgIC5uYW1lICAgICAgICAgICAgICAgICA9ICJEM0QxMVZBIiwKKworICAgIC5kZXZpY2VfaHdjdHhfc2l6ZSAgICA9IHNpemVvZihBVkQzRDExVkFEZXZpY2VDb250ZXh0KSwKKyAgICAuZnJhbWVzX2h3Y3R4X3NpemUgICAgPSBzaXplb2YoQVZEM0QxMVZBRnJhbWVzQ29udGV4dCksCisgICAgLmZyYW1lc19wcml2X3NpemUgICAgID0gc2l6ZW9mKEQzRDExVkFGcmFtZXNDb250ZXh0KSwKKworICAgIC5kZXZpY2VfY3JlYXRlICAgICAgICA9IGQzZDExdmFfZGV2aWNlX2NyZWF0ZSwKKyAgICAuZGV2aWNlX2luaXQgICAgICAgICAgPSBkM2QxMXZhX2RldmljZV9pbml0LAorICAgIC5kZXZpY2VfdW5pbml0ICAgICAgICA9IGQzZDExdmFfZGV2aWNlX3VuaW5pdCwKKyAgICAuZnJhbWVzX2dldF9jb25zdHJhaW50cyA9IGQzZDExdmFfZnJhbWVzX2dldF9jb25zdHJhaW50cywKKyAgICAuZnJhbWVzX2luaXQgICAgICAgICAgPSBkM2QxMXZhX2ZyYW1lc19pbml0LAorICAgIC5mcmFtZXNfdW5pbml0ICAgICAgICA9IGQzZDExdmFfZnJhbWVzX3VuaW5pdCwKKyAgICAuZnJhbWVzX2dldF9idWZmZXIgICAgPSBkM2QxMXZhX2dldF9idWZmZXIsCisgICAgLnRyYW5zZmVyX2dldF9mb3JtYXRzID0gZDNkMTF2YV90cmFuc2Zlcl9nZXRfZm9ybWF0cywKKyAgICAudHJhbnNmZXJfZGF0YV90byAgICAgPSBkM2QxMXZhX3RyYW5zZmVyX2RhdGEsCisgICAgLnRyYW5zZmVyX2RhdGFfZnJvbSAgID0gZDNkMTF2YV90cmFuc2Zlcl9kYXRhLAorCisgICAgLnBpeF9mbXRzICAgICAgICAgICAgID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKXsgQVZfUElYX0ZNVF9EM0QxMSwgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmggYi9saWJhdnV0aWwvaHdjb250ZXh0X2QzZDExdmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjkxZTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9kM2QxMXZhLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfSFdDT05URVhUX0QzRDExVkFfSAorI2RlZmluZSBBVlVUSUxfSFdDT05URVhUX0QzRDExVkFfSAorCisvKioKKyAqIEBmaWxlCisgKiBBbiBBUEktc3BlY2lmaWMgaGVhZGVyIGZvciBBVl9IV0RFVklDRV9UWVBFX0QzRDExVkEuCisgKgorICogVGhlIGRlZmF1bHQgcG9vbCBpbXBsZW1lbnRhdGlvbiB3aWxsIGJlIGZpeGVkLXNpemUgaWYgaW5pdGlhbF9wb29sX3NpemUgaXMKKyAqIHNldCAoYW5kIGFsbG9jYXRlIGVsZW1lbnRzIGZyb20gYW4gYXJyYXkgdGV4dHVyZSkuIE90aGVyd2lzZSBpdCB3aWxsIGFsbG9jYXRlCisgKiBpbmRpdmlkdWFsIHRleHR1cmVzLiBCZSBhd2FyZSB0aGF0IGRlY29kaW5nIHJlcXVpcmVzIGEgc2luZ2xlIGFycmF5IHRleHR1cmUuCisgKgorICogVXNpbmcgc3dfZm9ybWF0PT1BVl9QSVhfRk1UX1lVVjQyMFAgaGFzIHNwZWNpYWwgc2VtYW50aWNzLCBhbmQgbWFwcyB0bworICogRFhHSV9GT1JNQVRfNDIwX09QQVFVRS4gYXZfaHdmcmFtZV90cmFuc2Zlcl9kYXRhKCkgaXMgbm90IHN1cHBvcnRlZCBmb3IKKyAqIHRoaXMgZm9ybWF0LiBSZWZlciB0byBNU0ROIGZvciBkZXRhaWxzLgorICoKKyAqIGF2X2h3ZGV2aWNlX2N0eF9jcmVhdGUoKSBmb3IgdGhpcyBkZXZpY2UgdHlwZSBzdXBwb3J0cyBhIGtleSBuYW1lZCAiZGVidWciCisgKiBmb3IgdGhlIEFWRGljdGlvbmFyeSBlbnRyeS4gSWYgdGhpcyBpcyBzZXQgdG8gYW55IHZhbHVlLCB0aGUgZGV2aWNlIGNyZWF0aW9uCisgKiBjb2RlIHdpbGwgdHJ5IHRvIGxvYWQgdmFyaW91cyBzdXBwb3J0ZWQgRDNEIGRlYnVnZ2luZyBsYXllcnMuCisgKi8KKworI2luY2x1ZGUgPGQzZDExLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogVGhpcyBzdHJ1Y3QgaXMgYWxsb2NhdGVkIGFzIEFWSFdEZXZpY2VDb250ZXh0Lmh3Y3R4CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRDNEMTFWQURldmljZUNvbnRleHQgeworICAgIC8qKgorICAgICAqIERldmljZSB1c2VkIGZvciB0ZXh0dXJlIGNyZWF0aW9uIGFuZCBhY2Nlc3MuIFRoaXMgY2FuIGFsc28gYmUgdXNlZCB0bworICAgICAqIHNldCB0aGUgbGliYXZjb2RlYyBkZWNvZGluZyBkZXZpY2UuCisgICAgICoKKyAgICAgKiBNdXN0IGJlIHNldCBieSB0aGUgdXNlci4gVGhpcyBpcyB0aGUgb25seSBtYW5kYXRvcnkgZmllbGQgLSB0aGUgb3RoZXIKKyAgICAgKiBkZXZpY2UgY29udGV4dCBmaWVsZHMgYXJlIHNldCBmcm9tIHRoaXMgYW5kIGFyZSBhdmFpbGFibGUgZm9yIGNvbnZlbmllbmNlLgorICAgICAqCisgICAgICogRGVhbGxvY2F0aW5nIHRoZSBBVkhXRGV2aWNlQ29udGV4dCB3aWxsIGFsd2F5cyByZWxlYXNlIHRoaXMgaW50ZXJmYWNlLAorICAgICAqIGFuZCBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBpdCB3YXMgdXNlci1hbGxvY2F0ZWQuCisgICAgICovCisgICAgSUQzRDExRGV2aWNlICAgICAgICAqZGV2aWNlOworCisgICAgLyoqCisgICAgICogSWYgdW5zZXQsIHRoaXMgd2lsbCBiZSBzZXQgZnJvbSB0aGUgZGV2aWNlIGZpZWxkIG9uIGluaXQuCisgICAgICoKKyAgICAgKiBEZWFsbG9jYXRpbmcgdGhlIEFWSFdEZXZpY2VDb250ZXh0IHdpbGwgYWx3YXlzIHJlbGVhc2UgdGhpcyBpbnRlcmZhY2UsCisgICAgICogYW5kIGl0IGRvZXMgbm90IG1hdHRlciB3aGV0aGVyIGl0IHdhcyB1c2VyLWFsbG9jYXRlZC4KKyAgICAgKi8KKyAgICBJRDNEMTFEZXZpY2VDb250ZXh0ICpkZXZpY2VfY29udGV4dDsKKworICAgIC8qKgorICAgICAqIElmIHVuc2V0LCB0aGlzIHdpbGwgYmUgc2V0IGZyb20gdGhlIGRldmljZSBmaWVsZCBvbiBpbml0LgorICAgICAqCisgICAgICogRGVhbGxvY2F0aW5nIHRoZSBBVkhXRGV2aWNlQ29udGV4dCB3aWxsIGFsd2F5cyByZWxlYXNlIHRoaXMgaW50ZXJmYWNlLAorICAgICAqIGFuZCBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBpdCB3YXMgdXNlci1hbGxvY2F0ZWQuCisgICAgICovCisgICAgSUQzRDExVmlkZW9EZXZpY2UgICAqdmlkZW9fZGV2aWNlOworCisgICAgLyoqCisgICAgICogSWYgdW5zZXQsIHRoaXMgd2lsbCBiZSBzZXQgZnJvbSB0aGUgZGV2aWNlX2NvbnRleHQgZmllbGQgb24gaW5pdC4KKyAgICAgKgorICAgICAqIERlYWxsb2NhdGluZyB0aGUgQVZIV0RldmljZUNvbnRleHQgd2lsbCBhbHdheXMgcmVsZWFzZSB0aGlzIGludGVyZmFjZSwKKyAgICAgKiBhbmQgaXQgZG9lcyBub3QgbWF0dGVyIHdoZXRoZXIgaXQgd2FzIHVzZXItYWxsb2NhdGVkLgorICAgICAqLworICAgIElEM0QxMVZpZGVvQ29udGV4dCAgKnZpZGVvX2NvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDYWxsYmFja3MgZm9yIGxvY2tpbmcuIFRoZXkgcHJvdGVjdCBhY2Nlc3NlcyB0byBkZXZpY2VfY29udGV4dCBhbmQKKyAgICAgKiB2aWRlb19jb250ZXh0IGNhbGxzLiBUaGV5IGFsc28gcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIGludGVybmFsIHN0YWdpbmcKKyAgICAgKiB0ZXh0dXJlIChmb3IgYXZfaHdmcmFtZV90cmFuc2Zlcl9kYXRhKCkgY2FsbHMpLiBUaGV5IGRvIE5PVCBwcm90ZWN0CisgICAgICogYWNjZXNzIHRvIGh3Y29udGV4dCBvciBkZWNvZGVyIHN0YXRlIGluIGdlbmVyYWwuCisgICAgICoKKyAgICAgKiBJZiB1bnNldCBvbiBpbml0LCB0aGUgaHdjb250ZXh0IGltcGxlbWVudGF0aW9uIHdpbGwgc2V0IHRoZW0gdG8gdXNlIGFuCisgICAgICogaW50ZXJuYWwgbXV0ZXguCisgICAgICoKKyAgICAgKiBUaGUgdW5kZXJseWluZyBsb2NrIG11c3QgYmUgcmVjdXJzaXZlLiBsb2NrX2N0eCBpcyBmb3IgZnJlZSB1c2UgYnkgdGhlCisgICAgICogbG9ja2luZyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkICgqbG9jaykodm9pZCAqbG9ja19jdHgpOworICAgIHZvaWQgKCp1bmxvY2spKHZvaWQgKmxvY2tfY3R4KTsKKyAgICB2b2lkICpsb2NrX2N0eDsKK30gQVZEM0QxMVZBRGV2aWNlQ29udGV4dDsKKworLyoqCisgKiBEM0QxMSBmcmFtZSBkZXNjcmlwdG9yIGZvciBwb29sIGFsbG9jYXRpb24uCisgKgorICogSW4gdXNlci1hbGxvY2F0ZWQgcG9vbHMsIEFWSFdGcmFtZXNDb250ZXh0LnBvb2wgbXVzdCByZXR1cm4gQVZCdWZmZXJSZWZzCisgKiB3aXRoIHRoZSBkYXRhIHBvaW50ZXIgcG9pbnRpbmcgYXQgYW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBkZXNjcmliaW5nIHRoZQorICogcGxhbmVzIG9mIHRoZSBmcmFtZS4KKyAqCisgKiBUaGlzIGhhcyBubyB1c2Ugb3V0c2lkZSBvZiBjdXN0b20gYWxsb2NhdGlvbiwgYW5kIEFWRnJhbWUgQVZCdWZmZXJSZWYgZG8gbm90CisgKiBuZWNlc3NhcmlseSBwb2ludCB0byBhbiBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZEM0QxMUZyYW1lRGVzY3JpcHRvciB7CisgICAgLyoqCisgICAgICogVGhlIHRleHR1cmUgaW4gd2hpY2ggdGhlIGZyYW1lIGlzIGxvY2F0ZWQuIFRoZSByZWZlcmVuY2UgY291bnQgaXMKKyAgICAgKiBtYW5hZ2VkIGJ5IHRoZSBBVkJ1ZmZlclJlZiwgYW5kIGRlc3Ryb3lpbmcgdGhlIHJlZmVyZW5jZSB3aWxsIHJlbGVhc2UKKyAgICAgKiB0aGUgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogTm9ybWFsbHkgc3RvcmVkIGluIEFWRnJhbWUuZGF0YVswXS4KKyAgICAgKi8KKyAgICBJRDNEMTFUZXh0dXJlMkQgKnRleHR1cmU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggaW50byB0aGUgYXJyYXkgdGV4dHVyZSBlbGVtZW50IHJlcHJlc2VudGluZyB0aGUgZnJhbWUsIG9yIDAKKyAgICAgKiBpZiB0aGUgdGV4dHVyZSBpcyBub3QgYW4gYXJyYXkgdGV4dHVyZS4KKyAgICAgKgorICAgICAqIE5vcm1hbGx5IHN0b3JlZCBpbiBBVkZyYW1lLmRhdGFbMV0gKGNhc3QgZnJvbSBpbnRwdHJfdCkuCisgICAgICovCisgICAgaW50cHRyX3QgaW5kZXg7Cit9IEFWRDNEMTFGcmFtZURlc2NyaXB0b3I7CisKKy8qKgorICogVGhpcyBzdHJ1Y3QgaXMgYWxsb2NhdGVkIGFzIEFWSFdGcmFtZXNDb250ZXh0Lmh3Y3R4CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRDNEMTFWQUZyYW1lc0NvbnRleHQgeworICAgIC8qKgorICAgICAqIFRoZSBjYW5vbmljYWwgdGV4dHVyZSB1c2VkIGZvciBwb29sIGFsbG9jYXRpb24uIElmIHRoaXMgaXMgc2V0IHRvIE5VTEwKKyAgICAgKiBvbiBpbml0LCB0aGUgaHdmcmFtZXMgaW1wbGVtZW50YXRpb24gd2lsbCBhbGxvY2F0ZSBhbmQgc2V0IGFuIGFycmF5CisgICAgICogdGV4dHVyZSBpZiBpbml0aWFsX3Bvb2xfc2l6ZSA+IDAuCisgICAgICoKKyAgICAgKiBUaGUgb25seSBzaXR1YXRpb24gd2hlbiB0aGUgQVBJIHVzZXIgc2hvdWxkIHNldCB0aGlzIGlzOgorICAgICAqIC0gdGhlIHVzZXIgd2FudHMgdG8gZG8gbWFudWFsIHBvb2wgYWxsb2NhdGlvbiAoc2V0dGluZworICAgICAqICAgQVZIV0ZyYW1lc0NvbnRleHQucG9vbCksIGluc3RlYWQgb2YgbGV0dGluZyBBVkhXRnJhbWVzQ29udGV4dAorICAgICAqICAgYWxsb2NhdGUgdGhlIHBvb2wKKyAgICAgKiAtIG9mIGFuIGFycmF5IHRleHR1cmUKKyAgICAgKiAtIGFuZCB3YW50cyBpdCB0byB1c2UgaXQgZm9yIGRlY29kaW5nCisgICAgICogLSB0aGlzIGhhcyB0byBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIGF2X2h3ZnJhbWVfY3R4X2luaXQoKQorICAgICAqCisgICAgICogRGVhbGxvY2F0aW5nIHRoZSBBVkhXRnJhbWVzQ29udGV4dCB3aWxsIGFsd2F5cyByZWxlYXNlIHRoaXMgaW50ZXJmYWNlLAorICAgICAqIGFuZCBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBpdCB3YXMgdXNlci1hbGxvY2F0ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIGluIHBhcnRpY3VsYXIgdXNlZCBieSB0aGUgbGliYXZjb2RlYyBEM0QxMVZBIGh3YWNjZWwsIHdoaWNoCisgICAgICogcmVxdWlyZXMgYSBzaW5nbGUgYXJyYXkgdGV4dHVyZS4gSXQgd2lsbCBjcmVhdGUgSUQzRDExVmlkZW9EZWNvZGVyT3V0cHV0VmlldworICAgICAqIG9iamVjdHMgZm9yIGVhY2ggYXJyYXkgdGV4dHVyZSBlbGVtZW50IG9uIGRlY29kZXIgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgSUQzRDExVGV4dHVyZTJEICp0ZXh0dXJlOworCisgICAgLyoqCisgICAgICogRDNEMTFfVEVYVFVSRTJEX0RFU0MuQmluZEZsYWdzIHVzZWQgZm9yIHRleHR1cmUgY3JlYXRpb24uIFRoZSB1c2VyIG11c3QKKyAgICAgKiBhdCBsZWFzdCBzZXQgRDNEMTFfQklORF9ERUNPREVSIGlmIHRoZSBmcmFtZXMgY29udGV4dCBpcyB0byBiZSB1c2VkIGZvcgorICAgICAqIHZpZGVvIGRlY29kaW5nLgorICAgICAqIFRoaXMgZmllbGQgaXMgaWdub3JlZC9pbnZhbGlkIGlmIGEgdXNlci1hbGxvY2F0ZWQgdGV4dHVyZSBpcyBwcm92aWRlZC4KKyAgICAgKi8KKyAgICBVSU5UIEJpbmRGbGFnczsKKworICAgIC8qKgorICAgICAqIEQzRDExX1RFWFRVUkUyRF9ERVNDLk1pc2NGbGFncyB1c2VkIGZvciB0ZXh0dXJlIGNyZWF0aW9uLgorICAgICAqIFRoaXMgZmllbGQgaXMgaWdub3JlZC9pbnZhbGlkIGlmIGEgdXNlci1hbGxvY2F0ZWQgdGV4dHVyZSBpcyBwcm92aWRlZC4KKyAgICAgKi8KKyAgICBVSU5UIE1pc2NGbGFnczsKK30gQVZEM0QxMVZBRnJhbWVzQ29udGV4dDsKKworI2VuZGlmIC8qIEFWVVRJTF9IV0NPTlRFWFRfRDNEMTFWQV9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X2RybS5jIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9kcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmNiZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9kcm0uYwpAQCAtMCwwICsxLDI4OSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8ZHJtLmg+CisjaW5jbHVkZSA8eGY4NmRybS5oPgorCisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJod2NvbnRleHQuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfZHJtLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW1ndXRpbHMuaCIKKworCitzdGF0aWMgdm9pZCBkcm1fZGV2aWNlX2ZyZWUoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2KQoreworICAgIEFWRFJNRGV2aWNlQ29udGV4dCAqaHdjdHggPSBod2Rldi0+aHdjdHg7CisKKyAgICBjbG9zZShod2N0eC0+ZmQpOworfQorCitzdGF0aWMgaW50IGRybV9kZXZpY2VfY3JlYXRlKEFWSFdEZXZpY2VDb250ZXh0ICpod2RldiwgY29uc3QgY2hhciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMsIGludCBmbGFncykKK3sKKyAgICBBVkRSTURldmljZUNvbnRleHQgKmh3Y3R4ID0gaHdkZXYtPmh3Y3R4OworICAgIGRybVZlcnNpb25QdHIgdmVyc2lvbjsKKworICAgIGh3Y3R4LT5mZCA9IG9wZW4oZGV2aWNlLCBPX1JEV1IpOworICAgIGlmIChod2N0eC0+ZmQgPCAwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihlcnJubyk7CisKKyAgICB2ZXJzaW9uID0gZHJtR2V0VmVyc2lvbihod2N0eC0+ZmQpOworICAgIGlmICghdmVyc2lvbikgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgdmVyc2lvbiBpbmZvcm1hdGlvbiAiCisgICAgICAgICAgICAgICAiZnJvbSAlczogcHJvYmFibHkgbm90IGEgRFJNIGRldmljZT9cbiIsIGRldmljZSk7CisgICAgICAgIGNsb3NlKGh3Y3R4LT5mZCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfVkVSQk9TRSwgIk9wZW5lZCBEUk0gZGV2aWNlICVzOiBkcml2ZXIgJXMgIgorICAgICAgICAgICAidmVyc2lvbiAlZC4lZC4lZC5cbiIsIGRldmljZSwgdmVyc2lvbi0+bmFtZSwKKyAgICAgICAgICAgdmVyc2lvbi0+dmVyc2lvbl9tYWpvciwgdmVyc2lvbi0+dmVyc2lvbl9taW5vciwKKyAgICAgICAgICAgdmVyc2lvbi0+dmVyc2lvbl9wYXRjaGxldmVsKTsKKworICAgIGRybUZyZWVWZXJzaW9uKHZlcnNpb24pOworCisgICAgaHdkZXYtPmZyZWUgPSAmZHJtX2RldmljZV9mcmVlOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2dldF9idWZmZXIoQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9vbF9nZXQoaHdmYy0+cG9vbCk7CisgICAgaWYgKCFmcmFtZS0+YnVmWzBdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWUtPmRhdGFbMF0gPSAodWludDhfdCopZnJhbWUtPmJ1ZlswXS0+ZGF0YTsKKworICAgIGZyYW1lLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0RSTV9QUklNRTsKKyAgICBmcmFtZS0+d2lkdGggID0gaHdmYy0+d2lkdGg7CisgICAgZnJhbWUtPmhlaWdodCA9IGh3ZmMtPmhlaWdodDsKKworICAgIHJldHVybiAwOworfQorCit0eXBlZGVmIHN0cnVjdCBEUk1NYXBwaW5nIHsKKyAgICAvLyBBZGRyZXNzIGFuZCBsZW5ndGggb2YgZWFjaCBtbWFwKCllZCByZWdpb24uCisgICAgaW50IG5iX3JlZ2lvbnM7CisgICAgdm9pZCAqYWRkcmVzc1tBVl9EUk1fTUFYX1BMQU5FU107CisgICAgc2l6ZV90IGxlbmd0aFtBVl9EUk1fTUFYX1BMQU5FU107Cit9IERSTU1hcHBpbmc7CisKK3N0YXRpYyB2b2lkIGRybV91bm1hcF9mcmFtZShBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV01hcERlc2NyaXB0b3IgKmh3bWFwKQoreworICAgIERSTU1hcHBpbmcgKm1hcCA9IGh3bWFwLT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1hcC0+bmJfcmVnaW9uczsgaSsrKQorICAgICAgICBtdW5tYXAobWFwLT5hZGRyZXNzW2ldLCBtYXAtPmxlbmd0aFtpXSk7CisKKyAgICBhdl9mcmVlKG1hcCk7Cit9CisKK3N0YXRpYyBpbnQgZHJtX21hcF9mcmFtZShBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKQoreworICAgIGNvbnN0IEFWRFJNRnJhbWVEZXNjcmlwdG9yICpkZXNjID0gKEFWRFJNRnJhbWVEZXNjcmlwdG9yKilzcmMtPmRhdGFbMF07CisgICAgRFJNTWFwcGluZyAqbWFwOworICAgIGludCBlcnIsIGksIHAsIHBsYW5lOworICAgIGludCBtbWFwX3Byb3Q7CisgICAgdm9pZCAqYWRkcjsKKworICAgIG1hcCA9IGF2X21hbGxvY3ooc2l6ZW9mKCptYXApKTsKKyAgICBpZiAoIW1hcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIG1tYXBfcHJvdCA9IDA7CisgICAgaWYgKGZsYWdzICYgQVZfSFdGUkFNRV9NQVBfUkVBRCkKKyAgICAgICAgbW1hcF9wcm90IHw9IFBST1RfUkVBRDsKKyAgICBpZiAoZmxhZ3MgJiBBVl9IV0ZSQU1FX01BUF9XUklURSkKKyAgICAgICAgbW1hcF9wcm90IHw9IFBST1RfV1JJVEU7CisKKyAgICBhdl9hc3NlcnQwKGRlc2MtPm5iX29iamVjdHMgPD0gQVZfRFJNX01BWF9QTEFORVMpOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9vYmplY3RzOyBpKyspIHsKKyAgICAgICAgYWRkciA9IG1tYXAoTlVMTCwgZGVzYy0+b2JqZWN0c1tpXS5zaXplLCBtbWFwX3Byb3QsIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgIGRlc2MtPm9iamVjdHNbaV0uZmQsIDApOworICAgICAgICBpZiAoYWRkciA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKGVycm5vKTsKKyAgICAgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbWFwIERSTSBvYmplY3QgJWQgdG8gIgorICAgICAgICAgICAgICAgICAgICJtZW1vcnk6ICVkLlxuIiwgZGVzYy0+b2JqZWN0c1tpXS5mZCwgZXJybm8pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisKKyAgICAgICAgbWFwLT5hZGRyZXNzW2ldID0gYWRkcjsKKyAgICAgICAgbWFwLT5sZW5ndGhbaV0gID0gZGVzYy0+b2JqZWN0c1tpXS5zaXplOworICAgIH0KKyAgICBtYXAtPm5iX3JlZ2lvbnMgPSBpOworCisgICAgcGxhbmUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9sYXllcnM7IGkrKykgeworICAgICAgICBjb25zdCBBVkRSTUxheWVyRGVzY3JpcHRvciAqbGF5ZXIgPSAmZGVzYy0+bGF5ZXJzW2ldOworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgbGF5ZXItPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgICAgICBkc3QtPmRhdGFbcGxhbmVdID0KKyAgICAgICAgICAgICAgICAodWludDhfdCopbWFwLT5hZGRyZXNzW2xheWVyLT5wbGFuZXNbcF0ub2JqZWN0X2luZGV4XSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+cGxhbmVzW3BdLm9mZnNldDsKKyAgICAgICAgICAgIGRzdC0+bGluZXNpemVbcGxhbmVdID0gICAgIGxheWVyLT5wbGFuZXNbcF0ucGl0Y2g7CisgICAgICAgICAgICArK3BsYW5lOworICAgICAgICB9CisgICAgfQorICAgIGF2X2Fzc2VydDAocGxhbmUgPD0gQVZfRFJNX01BWF9QTEFORVMpOworCisgICAgZHN0LT53aWR0aCAgPSBzcmMtPndpZHRoOworICAgIGRzdC0+aGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisKKyAgICBlcnIgPSBmZl9od2ZyYW1lX21hcF9jcmVhdGUoc3JjLT5od19mcmFtZXNfY3R4LCBkc3QsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRybV91bm1hcF9mcmFtZSwgbWFwKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX29iamVjdHM7IGkrKykgeworICAgICAgICBpZiAobWFwLT5hZGRyZXNzW2ldKQorICAgICAgICAgICAgbXVubWFwKG1hcC0+YWRkcmVzc1tpXSwgbWFwLT5sZW5ndGhbaV0pOworICAgIH0KKyAgICBhdl9mcmVlKG1hcCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkcm1fdHJhbnNmZXJfZ2V0X2Zvcm1hdHMoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZIV0ZyYW1lVHJhbnNmZXJEaXJlY3Rpb24gZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0ICoqZm9ybWF0cykKK3sKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeF9mbXRzOworCisgICAgcGl4X2ZtdHMgPSBhdl9tYWxsb2NfYXJyYXkoMiwgc2l6ZW9mKCpwaXhfZm10cykpOworICAgIGlmICghcGl4X2ZtdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBwaXhfZm10c1swXSA9IGN0eC0+c3dfZm9ybWF0OworICAgIHBpeF9mbXRzWzFdID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgKmZvcm1hdHMgPSBwaXhfZm10czsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcm1fdHJhbnNmZXJfZGF0YV9mcm9tKEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjKQoreworICAgIEFWRnJhbWUgKm1hcDsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGRzdC0+d2lkdGggPiBod2ZjLT53aWR0aCB8fCBkc3QtPmhlaWdodCA+IGh3ZmMtPmhlaWdodCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIG1hcCA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFtYXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWFwLT5mb3JtYXQgPSBkc3QtPmZvcm1hdDsKKworICAgIGVyciA9IGRybV9tYXBfZnJhbWUoaHdmYywgbWFwLCBzcmMsIEFWX0hXRlJBTUVfTUFQX1JFQUQpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIG1hcC0+d2lkdGggID0gZHN0LT53aWR0aDsKKyAgICBtYXAtPmhlaWdodCA9IGRzdC0+aGVpZ2h0OworCisgICAgZXJyID0gYXZfZnJhbWVfY29weShkc3QsIG1hcCk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXJyID0gMDsKK2ZhaWw6CisgICAgYXZfZnJhbWVfZnJlZSgmbWFwKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRybV90cmFuc2Zlcl9kYXRhX3RvKEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBBVkZyYW1lICptYXA7CisgICAgaW50IGVycjsKKworICAgIGlmIChzcmMtPndpZHRoID4gaHdmYy0+d2lkdGggfHwgc3JjLT5oZWlnaHQgPiBod2ZjLT5oZWlnaHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBtYXAgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghbWFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1hcC0+Zm9ybWF0ID0gc3JjLT5mb3JtYXQ7CisKKyAgICBlcnIgPSBkcm1fbWFwX2ZyYW1lKGh3ZmMsIG1hcCwgZHN0LCBBVl9IV0ZSQU1FX01BUF9XUklURSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfSFdGUkFNRV9NQVBfT1ZFUldSSVRFKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBtYXAtPndpZHRoICA9IHNyYy0+d2lkdGg7CisgICAgbWFwLT5oZWlnaHQgPSBzcmMtPmhlaWdodDsKKworICAgIGVyciA9IGF2X2ZyYW1lX2NvcHkobWFwLCBzcmMpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IDA7CitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJm1hcCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBkcm1fbWFwX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKQoreworICAgIGludCBlcnI7CisKKyAgICBpZiAoaHdmYy0+c3dfZm9ybWF0ICE9IGRzdC0+Zm9ybWF0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgZXJyID0gZHJtX21hcF9mcmFtZShod2ZjLCBkc3QsIHNyYywgZmxhZ3MpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5X3Byb3BzKGRzdCwgc3JjKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfZHJtID0geworICAgIC50eXBlICAgICAgICAgICAgICAgICAgID0gQVZfSFdERVZJQ0VfVFlQRV9EUk0sCisgICAgLm5hbWUgICAgICAgICAgICAgICAgICAgPSAiRFJNIiwKKworICAgIC5kZXZpY2VfaHdjdHhfc2l6ZSAgICAgID0gc2l6ZW9mKEFWRFJNRGV2aWNlQ29udGV4dCksCisKKyAgICAuZGV2aWNlX2NyZWF0ZSAgICAgICAgICA9ICZkcm1fZGV2aWNlX2NyZWF0ZSwKKworICAgIC5mcmFtZXNfZ2V0X2J1ZmZlciAgICAgID0gJmRybV9nZXRfYnVmZmVyLAorCisgICAgLnRyYW5zZmVyX2dldF9mb3JtYXRzICAgPSAmZHJtX3RyYW5zZmVyX2dldF9mb3JtYXRzLAorICAgIC50cmFuc2Zlcl9kYXRhX3RvICAgICAgID0gJmRybV90cmFuc2Zlcl9kYXRhX3RvLAorICAgIC50cmFuc2Zlcl9kYXRhX2Zyb20gICAgID0gJmRybV90cmFuc2Zlcl9kYXRhX2Zyb20sCisgICAgLm1hcF9mcm9tICAgICAgICAgICAgICAgPSAmZHJtX21hcF9mcm9tLAorCisgICAgLnBpeF9mbXRzID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfRFJNX1BSSU1FLAorICAgICAgICBBVl9QSVhfRk1UX05PTkUKKyAgICB9LAorfTsKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9od2NvbnRleHRfZHJtLmggYi9saWJhdnV0aWwvaHdjb250ZXh0X2RybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNzA5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvaHdjb250ZXh0X2RybS5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0hXQ09OVEVYVF9EUk1fSAorI2RlZmluZSBBVlVUSUxfSFdDT05URVhUX0RSTV9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworLyoqCisgKiBAZmlsZQorICogQVBJLXNwZWNpZmljIGhlYWRlciBmb3IgQVZfSFdERVZJQ0VfVFlQRV9EUk0uCisgKgorICogSW50ZXJuYWwgZnJhbWUgYWxsb2NhdGlvbiBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAtIGFsbCBmcmFtZXMKKyAqIG11c3QgYmUgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyLiAgVGh1cyBBVkhXRnJhbWVzQ29udGV4dCBpcyBhbHdheXMKKyAqIE5VTEwsIHRob3VnaCB0aGlzIG1heSBjaGFuZ2UgaWYgc3VwcG9ydCBmb3IgZnJhbWUgYWxsb2NhdGlvbiBpcworICogYWRkZWQgaW4gZnV0dXJlLgorICovCisKK2VudW0geworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBsYXllcnMvcGxhbmVzIGluIGEgRFJNIGZyYW1lLgorICAgICAqLworICAgIEFWX0RSTV9NQVhfUExBTkVTID0gNAorfTsKKworLyoqCisgKiBEUk0gb2JqZWN0IGRlc2NyaXB0b3IuCisgKgorICogRGVzY3JpYmVzIGEgc2luZ2xlIERSTSBvYmplY3QsIGFkZHJlc3NpbmcgaXQgYXMgYSBQUklNRSBmaWxlCisgKiBkZXNjcmlwdG9yLgorICovCit0eXBlZGVmIHN0cnVjdCBBVkRSTU9iamVjdERlc2NyaXB0b3IgeworICAgIC8qKgorICAgICAqIERSTSBQUklNRSBmZCBmb3IgdGhlIG9iamVjdC4KKyAgICAgKi8KKyAgICBpbnQgZmQ7CisgICAgLyoqCisgICAgICogVG90YWwgc2l6ZSBvZiB0aGUgb2JqZWN0LgorICAgICAqCisgICAgICogKFRoaXMgaW5jbHVkZXMgYW55IHBhcnRzIG5vdCB3aGljaCBkbyBub3QgY29udGFpbiBpbWFnZSBkYXRhLikKKyAgICAgKi8KKyAgICBzaXplX3Qgc2l6ZTsKKyAgICAvKioKKyAgICAgKiBGb3JtYXQgbW9kaWZpZXIgYXBwbGllZCB0byB0aGUgb2JqZWN0IChEUk1fRk9STUFUX01PRF8qKS4KKyAgICAgKgorICAgICAqIElmIHRoZSBmb3JtYXQgbW9kaWZpZXIgaXMgdW5rbm93biB0aGVuIHRoaXMgc2hvdWxkIGJlIHNldCB0bworICAgICAqIERSTV9GT1JNQVRfTU9EX0lOVkFMSUQuCisgICAgICovCisgICAgdWludDY0X3QgZm9ybWF0X21vZGlmaWVyOworfSBBVkRSTU9iamVjdERlc2NyaXB0b3I7CisKKy8qKgorICogRFJNIHBsYW5lIGRlc2NyaXB0b3IuCisgKgorICogRGVzY3JpYmVzIGEgc2luZ2xlIHBsYW5lIG9mIGEgbGF5ZXIsIHdoaWNoIGlzIGNvbnRhaW5lZCB3aXRoaW4KKyAqIGEgc2luZ2xlIG9iamVjdC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZEUk1QbGFuZURlc2NyaXB0b3IgeworICAgIC8qKgorICAgICAqIEluZGV4IG9mIHRoZSBvYmplY3QgY29udGFpbmluZyB0aGlzIHBsYW5lIGluIHRoZSBvYmplY3RzCisgICAgICogYXJyYXkgb2YgdGhlIGVuY2xvc2luZyBmcmFtZSBkZXNjcmlwdG9yLgorICAgICAqLworICAgIGludCBvYmplY3RfaW5kZXg7CisgICAgLyoqCisgICAgICogT2Zmc2V0IHdpdGhpbiB0aGF0IG9iamVjdCBvZiB0aGlzIHBsYW5lLgorICAgICAqLworICAgIHB0cmRpZmZfdCBvZmZzZXQ7CisgICAgLyoqCisgICAgICogUGl0Y2ggKGxpbmVzaXplKSBvZiB0aGlzIHBsYW5lLgorICAgICAqLworICAgIHB0cmRpZmZfdCBwaXRjaDsKK30gQVZEUk1QbGFuZURlc2NyaXB0b3I7CisKKy8qKgorICogRFJNIGxheWVyIGRlc2NyaXB0b3IuCisgKgorICogRGVzY3JpYmVzIGEgc2luZ2xlIGxheWVyIHdpdGhpbiBhIGZyYW1lLiAgVGhpcyBoYXMgdGhlIHN0cnVjdHVyZQorICogZGVmaW5lZCBieSBpdHMgZm9ybWF0LCBhbmQgd2lsbCBjb250YWluIG9uZSBvciBtb3JlIHBsYW5lcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZEUk1MYXllckRlc2NyaXB0b3IgeworICAgIC8qKgorICAgICAqIEZvcm1hdCBvZiB0aGUgbGF5ZXIgKERSTV9GT1JNQVRfKikuCisgICAgICovCisgICAgdWludDMyX3QgZm9ybWF0OworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBwbGFuZXMgaW4gdGhlIGxheWVyLgorICAgICAqCisgICAgICogVGhpcyBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2YgcGxhbmVzIHJlcXVpcmVkIGJ5IGZvcm1hdC4KKyAgICAgKi8KKyAgICBpbnQgbmJfcGxhbmVzOworICAgIC8qKgorICAgICAqIEFycmF5IG9mIHBsYW5lcyBpbiB0aGlzIGxheWVyLgorICAgICAqLworICAgIEFWRFJNUGxhbmVEZXNjcmlwdG9yIHBsYW5lc1tBVl9EUk1fTUFYX1BMQU5FU107Cit9IEFWRFJNTGF5ZXJEZXNjcmlwdG9yOworCisvKioKKyAqIERSTSBmcmFtZSBkZXNjcmlwdG9yLgorICoKKyAqIFRoaXMgaXMgdXNlZCBhcyB0aGUgZGF0YSBwb2ludGVyIGZvciBBVl9QSVhfRk1UX0RSTV9QUklNRSBmcmFtZXMuCisgKiBJdCBpcyBhbHNvIHVzZWQgYnkgdXNlci1hbGxvY2F0ZWQgZnJhbWUgcG9vbHMgLSBhbGxvY2F0aW5nIGluCisgKiBBVkhXRnJhbWVzQ29udGV4dC5wb29sIG11c3QgcmV0dXJuIEFWQnVmZmVyUmVmcyB3aGljaCBjb250YWluCisgKiBhbiBvYmplY3Qgb2YgdGhpcyB0eXBlLgorICoKKyAqIFRoZSBmaWVsZHMgb2YgdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIHNldCBzdWNoIGl0IGNhbiBiZQorICogaW1wb3J0ZWQgZGlyZWN0bHkgYnkgRUdMIHVzaW5nIHRoZSBFR0xfRVhUX2ltYWdlX2RtYV9idWZfaW1wb3J0CisgKiBhbmQgRUdMX0VYVF9pbWFnZV9kbWFfYnVmX2ltcG9ydF9tb2RpZmllcnMgZXh0ZW5zaW9ucy4KKyAqIChOb3RlIHRoYXQgdGhlIGV4YWN0IGxheW91dCBvZiBhIHBhcnRpY3VsYXIgZm9ybWF0IG1heSB2YXJ5IGJldHdlZW4KKyAqIHBsYXRmb3JtcyAtIHdlIG9ubHkgc3BlY2lmeSB0aGF0IHRoZSBzYW1lIHBsYXRmb3JtIHNob3VsZCBiZSBhYmxlCisgKiB0byBpbXBvcnQgaXQuKQorICoKKyAqIFRoZSB0b3RhbCBudW1iZXIgb2YgcGxhbmVzIG11c3Qgbm90IGV4Y2VlZCBBVl9EUk1fTUFYX1BMQU5FUywgYW5kCisgKiB0aGUgb3JkZXIgb2YgdGhlIHBsYW5lcyBieSBpbmNyZWFzaW5nIGxheWVyIGluZGV4IGZvbGxvd2VkIGJ5CisgKiBpbmNyZWFzaW5nIHBsYW5lIGluZGV4IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIHdoaWNoIHdvdWxkCisgKiBiZSB1c2VkIGZvciB0aGUgZGF0YSBwb2ludGVycyBpbiB0aGUgZXF1aXZhbGVudCBzb2Z0d2FyZSBmb3JtYXQuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRFJNRnJhbWVEZXNjcmlwdG9yIHsKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgRFJNIG9iamVjdHMgbWFraW5nIHVwIHRoaXMgZnJhbWUuCisgICAgICovCisgICAgaW50IG5iX29iamVjdHM7CisgICAgLyoqCisgICAgICogQXJyYXkgb2Ygb2JqZWN0cyBtYWtpbmcgdXAgdGhlIGZyYW1lLgorICAgICAqLworICAgIEFWRFJNT2JqZWN0RGVzY3JpcHRvciBvYmplY3RzW0FWX0RSTV9NQVhfUExBTkVTXTsKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgbGF5ZXJzIGluIHRoZSBmcmFtZS4KKyAgICAgKi8KKyAgICBpbnQgbmJfbGF5ZXJzOworICAgIC8qKgorICAgICAqIEFycmF5IG9mIGxheWVycyBpbiB0aGUgZnJhbWUuCisgICAgICovCisgICAgQVZEUk1MYXllckRlc2NyaXB0b3IgbGF5ZXJzW0FWX0RSTV9NQVhfUExBTkVTXTsKK30gQVZEUk1GcmFtZURlc2NyaXB0b3I7CisKKy8qKgorICogRFJNIGRldmljZS4KKyAqCisgKiBBbGxvY2F0ZWQgYXMgQVZIV0RldmljZUNvbnRleHQuaHdjdHguCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWRFJNRGV2aWNlQ29udGV4dCB7CisgICAgLyoqCisgICAgICogRmlsZSBkZXNjcmlwdG9yIG9mIERSTSBkZXZpY2UuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHVzZWQgYXMgdGhlIGRldmljZSB0byBjcmVhdGUgZnJhbWVzIG9uLCBhbmQgbWF5IGFsc28gYmUKKyAgICAgKiB1c2VkIGluIHNvbWUgZGVyaXZhdGlvbiBhbmQgbWFwcGluZyBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogSWYgbm8gZGV2aWNlIGlzIHJlcXVpcmVkLCBzZXQgdG8gLTEuCisgICAgICovCisgICAgaW50IGZkOworfSBBVkRSTURldmljZUNvbnRleHQ7CisKKyNlbmRpZiAvKiBBVlVUSUxfSFdDT05URVhUX0RSTV9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X2R4dmEyLmMgYi9saWJhdnV0aWwvaHdjb250ZXh0X2R4dmEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU4NWYzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHRfZHh2YTIuYwpAQCAtMCwwICsxLDU5NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjZGVmaW5lIERYVkEyQVBJX1VTRV9CSVRGSUVMRFMKKyNkZWZpbmUgQ09CSk1BQ1JPUworCisjaW5jbHVkZSA8ZDNkOS5oPgorI2luY2x1ZGUgPGR4dmEyYXBpLmg+CisjaW5jbHVkZSA8aW5pdGd1aWQuaD4KKworI2luY2x1ZGUgImF2YXNzZXJ0LmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0LmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X2R4dmEyLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X2ludGVybmFsLmgiCisjaW5jbHVkZSAiaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJwaXhkZXNjLmgiCisjaW5jbHVkZSAicGl4Zm10LmgiCisjaW5jbHVkZSAiY29tcGF0L3czMmRsZmNuLmgiCisKK3R5cGVkZWYgSURpcmVjdDNEOSogV0lOQVBJIHBEaXJlY3QzRENyZWF0ZTkoVUlOVCk7Cit0eXBlZGVmIEhSRVNVTFQgV0lOQVBJIHBEaXJlY3QzRENyZWF0ZTlFeChVSU5ULCBJRGlyZWN0M0Q5RXggKiopOwordHlwZWRlZiBIUkVTVUxUIFdJTkFQSSBwQ3JlYXRlRGV2aWNlTWFuYWdlcjkoVUlOVCAqLCBJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOSAqKik7CisKKyNkZWZpbmUgRkZfRDNEQ1JFQVRFX0ZMQUdTIChEM0RDUkVBVEVfU09GVFdBUkVfVkVSVEVYUFJPQ0VTU0lORyB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDUkVBVEVfTVVMVElUSFJFQURFRCB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RDUkVBVEVfRlBVX1BSRVNFUlZFKQorCitzdGF0aWMgY29uc3QgRDNEUFJFU0VOVF9QQVJBTUVURVJTIGR4dmEyX3ByZXNlbnRfcGFyYW1zID0geworICAgIC5XaW5kb3dlZCAgICAgICAgID0gVFJVRSwKKyAgICAuQmFja0J1ZmZlcldpZHRoICA9IDY0MCwKKyAgICAuQmFja0J1ZmZlckhlaWdodCA9IDQ4MCwKKyAgICAuQmFja0J1ZmZlckNvdW50ICA9IDAsCisgICAgLlN3YXBFZmZlY3QgICAgICAgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQsCisgICAgLkZsYWdzICAgICAgICAgICAgPSBEM0RQUkVTRU5URkxBR19WSURFTywKK307CisKK3R5cGVkZWYgc3RydWN0IERYVkEyTWFwcGluZyB7CisgICAgdWludDMyX3QgcGFsZXR0ZV9kdW1teVsyNTZdOworfSBEWFZBMk1hcHBpbmc7CisKK3R5cGVkZWYgc3RydWN0IERYVkEyRnJhbWVzQ29udGV4dCB7CisgICAgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlc19pbnRlcm5hbDsKKyAgICBpbnQgICAgICAgICAgICAgIG5iX3N1cmZhY2VzX3VzZWQ7CisKKyAgICBIQU5ETEUgIGRldmljZV9oYW5kbGU7CisgICAgSURpcmVjdFhWaWRlb0FjY2VsZXJhdGlvblNlcnZpY2UgKnNlcnZpY2U7CisKKyAgICBEM0RGT1JNQVQgZm9ybWF0OworfSBEWFZBMkZyYW1lc0NvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IERYVkEyRGV2aWNlUHJpdiB7CisgICAgSE1PRFVMRSBkM2RsaWI7CisgICAgSE1PRFVMRSBkeHZhMmxpYjsKKworICAgIEhBTkRMRSBkZXZpY2VfaGFuZGxlOworCisgICAgSURpcmVjdDNEOSAgICAgICAqZDNkOTsKKyAgICBJRGlyZWN0M0REZXZpY2U5ICpkM2Q5ZGV2aWNlOworfSBEWFZBMkRldmljZVByaXY7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIEQzREZPUk1BVCBkM2RfZm9ybWF0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworfSBzdXBwb3J0ZWRfZm9ybWF0c1tdID0geworICAgIHsgTUtUQUcoJ04nLCAnVicsICcxJywgJzInKSwgQVZfUElYX0ZNVF9OVjEyIH0sCisgICAgeyBNS1RBRygnUCcsICcwJywgJzEnLCAnMCcpLCBBVl9QSVhfRk1UX1AwMTAgfSwKKyAgICB7IEQzREZNVF9QOCwgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfUEFMOCB9LAorfTsKKworREVGSU5FX0dVSUQodmlkZW9fZGVjb2Rlcl9zZXJ2aWNlLCAgIDB4ZmM1MWE1NTEsIDB4ZDVlNywgMHgxMWQ5LCAweGFmLCAweDU1LCAweDAwLCAweDA1LCAweDRlLCAweDQzLCAweGZmLCAweDAyKTsKK0RFRklORV9HVUlEKHZpZGVvX3Byb2Nlc3Nvcl9zZXJ2aWNlLCAweGZjNTFhNTUyLCAweGQ1ZTcsIDB4MTFkOSwgMHhhZiwgMHg1NSwgMHgwMCwgMHgwNSwgMHg0ZSwgMHg0MywgMHhmZiwgMHgwMik7CisKK3N0YXRpYyB2b2lkIGR4dmEyX2ZyYW1lc191bmluaXQoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCkKK3sKKyAgICBBVkRYVkEyRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4ID0gY3R4LT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBBVkRYVkEyRnJhbWVzQ29udGV4dCAqZnJhbWVzX2h3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBEWFZBMkZyYW1lc0NvbnRleHQgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIGludCBpOworCisgICAgaWYgKGZyYW1lc19od2N0eC0+ZGVjb2Rlcl90b19yZWxlYXNlKQorICAgICAgICBJRGlyZWN0WFZpZGVvRGVjb2Rlcl9SZWxlYXNlKGZyYW1lc19od2N0eC0+ZGVjb2Rlcl90b19yZWxlYXNlKTsKKworICAgIGlmIChzLT5zdXJmYWNlc19pbnRlcm5hbCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAocy0+c3VyZmFjZXNfaW50ZXJuYWxbaV0pCisgICAgICAgICAgICAgICAgSURpcmVjdDNEU3VyZmFjZTlfUmVsZWFzZShzLT5zdXJmYWNlc19pbnRlcm5hbFtpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZXAoJnMtPnN1cmZhY2VzX2ludGVybmFsKTsKKworICAgIGlmIChzLT5zZXJ2aWNlKSB7CisgICAgICAgIElEaXJlY3RYVmlkZW9BY2NlbGVyYXRpb25TZXJ2aWNlX1JlbGVhc2Uocy0+c2VydmljZSk7CisgICAgICAgIHMtPnNlcnZpY2UgPSBOVUxMOworICAgIH0KKworICAgIGlmIChzLT5kZXZpY2VfaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CisgICAgICAgIElEaXJlY3QzRERldmljZU1hbmFnZXI5X0Nsb3NlRGV2aWNlSGFuZGxlKGRldmljZV9od2N0eC0+ZGV2bWdyLCBzLT5kZXZpY2VfaGFuZGxlKTsKKyAgICAgICAgcy0+ZGV2aWNlX2hhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZHh2YTJfcG9vbF9yZWxlYXNlX2R1bW15KHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICAvLyBpbXBvcnRhbnQgbm90IHRvIGZyZWUgYW55dGhpbmcgaGVyZS0tZGF0YSBpcyBhIHN1cmZhY2Ugb2JqZWN0CisgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsIHRvIENyZWF0ZVN1cmZhY2UoKSwgYW5kIHRoZXNlIHN1cmZhY2VzIGFyZQorICAgIC8vIHJlbGVhc2VkIGluIGR4dmEyX2ZyYW1lc191bmluaXQoKQorfQorCitzdGF0aWMgQVZCdWZmZXJSZWYgKmR4dmEyX3Bvb2xfYWxsb2Modm9pZCAqb3BhcXVlLCBpbnQgc2l6ZSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAgICpjdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKW9wYXF1ZTsKKyAgICBEWFZBMkZyYW1lc0NvbnRleHQgICAgICAgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIEFWRFhWQTJGcmFtZXNDb250ZXh0ICpod2N0eCA9IGN0eC0+aHdjdHg7CisKKyAgICBpZiAocy0+bmJfc3VyZmFjZXNfdXNlZCA8IGh3Y3R4LT5uYl9zdXJmYWNlcykgeworICAgICAgICBzLT5uYl9zdXJmYWNlc191c2VkKys7CisgICAgICAgIHJldHVybiBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90KilzLT5zdXJmYWNlc19pbnRlcm5hbFtzLT5uYl9zdXJmYWNlc191c2VkIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHdjdHgtPnN1cmZhY2VzKSwgZHh2YTJfcG9vbF9yZWxlYXNlX2R1bW15LCAwLCAwKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBkeHZhMl9pbml0X3Bvb2woQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCkKK3sKKyAgICBBVkRYVkEyRnJhbWVzQ29udGV4dCAqZnJhbWVzX2h3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBBVkRYVkEyRGV2aWNlQ29udGV4dCAqZGV2aWNlX2h3Y3R4ID0gY3R4LT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBEWFZBMkZyYW1lc0NvbnRleHQgICAgICAgICAgICAgICpzID0gY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBpbnQgZGVjb2RlID0gKGZyYW1lc19od2N0eC0+c3VyZmFjZV90eXBlID09IERYVkEyX1ZpZGVvRGVjb2RlclJlbmRlclRhcmdldCk7CisKKyAgICBpbnQgaTsKKyAgICBIUkVTVUxUIGhyOworCisgICAgaWYgKGN0eC0+aW5pdGlhbF9wb29sX3NpemUgPD0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBociA9IElEaXJlY3QzRERldmljZU1hbmFnZXI5X09wZW5EZXZpY2VIYW5kbGUoZGV2aWNlX2h3Y3R4LT5kZXZtZ3IsICZzLT5kZXZpY2VfaGFuZGxlKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBkZXZpY2UgaGFuZGxlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBociA9IElEaXJlY3QzRERldmljZU1hbmFnZXI5X0dldFZpZGVvU2VydmljZShkZXZpY2VfaHdjdHgtPmRldm1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kZXZpY2VfaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZSA/ICZ2aWRlb19kZWNvZGVyX3NlcnZpY2UgOiAmdmlkZW9fcHJvY2Vzc29yX3NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiopJnMtPnNlcnZpY2UpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgdGhlIHZpZGVvIHNlcnZpY2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfZm9ybWF0cyk7IGkrKykgeworICAgICAgICBpZiAoY3R4LT5zd19mb3JtYXQgPT0gc3VwcG9ydGVkX2Zvcm1hdHNbaV0ucGl4X2ZtdCkgeworICAgICAgICAgICAgcy0+Zm9ybWF0ID0gc3VwcG9ydGVkX2Zvcm1hdHNbaV0uZDNkX2Zvcm1hdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID09IEZGX0FSUkFZX0VMRU1TKHN1cHBvcnRlZF9mb3JtYXRzKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBwaXhlbCBmb3JtYXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShjdHgtPnN3X2Zvcm1hdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIHMtPnN1cmZhY2VzX2ludGVybmFsID0gYXZfbWFsbG9jel9hcnJheShjdHgtPmluaXRpYWxfcG9vbF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPnN1cmZhY2VzX2ludGVybmFsKSk7CisgICAgaWYgKCFzLT5zdXJmYWNlc19pbnRlcm5hbCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGhyID0gSURpcmVjdFhWaWRlb0FjY2VsZXJhdGlvblNlcnZpY2VfQ3JlYXRlU3VyZmFjZShzLT5zZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPndpZHRoLCBjdHgtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmZvcm1hdCwgRDNEUE9PTF9ERUZBVUxULCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNfaHdjdHgtPnN1cmZhY2VfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3VyZmFjZXNfaW50ZXJuYWwsIE5VTEwpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIHN1cmZhY2VzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBjdHgtPmludGVybmFsLT5wb29sX2ludGVybmFsID0gYXZfYnVmZmVyX3Bvb2xfaW5pdDIoc2l6ZW9mKCpzLT5zdXJmYWNlc19pbnRlcm5hbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eCwgZHh2YTJfcG9vbF9hbGxvYywgTlVMTCk7CisgICAgaWYgKCFjdHgtPmludGVybmFsLT5wb29sX2ludGVybmFsKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWVzX2h3Y3R4LT5zdXJmYWNlcyAgICA9IHMtPnN1cmZhY2VzX2ludGVybmFsOworICAgIGZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXMgPSBjdHgtPmluaXRpYWxfcG9vbF9zaXplOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHh2YTJfZnJhbWVzX2luaXQoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCkKK3sKKyAgICBBVkRYVkEyRnJhbWVzQ29udGV4dCAqaHdjdHggPSBjdHgtPmh3Y3R4OworICAgIERYVkEyRnJhbWVzQ29udGV4dCAgICAgICAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgaW50IHJldDsKKworICAgIGlmIChod2N0eC0+c3VyZmFjZV90eXBlICE9IERYVkEyX1ZpZGVvRGVjb2RlclJlbmRlclRhcmdldCAmJgorICAgICAgICBod2N0eC0+c3VyZmFjZV90eXBlICE9IERYVkEyX1ZpZGVvUHJvY2Vzc29yUmVuZGVyVGFyZ2V0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVua25vd24gc3VyZmFjZSB0eXBlOiAlbHVcbiIsCisgICAgICAgICAgICAgICBod2N0eC0+c3VyZmFjZV90eXBlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBzLT5kZXZpY2VfaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgICAvKiBpbml0IHRoZSBmcmFtZSBwb29sIGlmIHRoZSBjYWxsZXIgZGlkbid0IHByb3ZpZGUgb25lICovCisgICAgaWYgKCFjdHgtPnBvb2wpIHsKKyAgICAgICAgcmV0ID0gZHh2YTJfaW5pdF9wb29sKGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBjcmVhdGluZyBhbiBpbnRlcm5hbCBmcmFtZSBwb29sXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHZhMl9nZXRfYnVmZmVyKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9vbF9nZXQoY3R4LT5wb29sKTsKKyAgICBpZiAoIWZyYW1lLT5idWZbMF0pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmcmFtZS0+ZGF0YVszXSA9IGZyYW1lLT5idWZbMF0tPmRhdGE7CisgICAgZnJhbWUtPmZvcm1hdCAgPSBBVl9QSVhfRk1UX0RYVkEyX1ZMRDsKKyAgICBmcmFtZS0+d2lkdGggICA9IGN0eC0+d2lkdGg7CisgICAgZnJhbWUtPmhlaWdodCAgPSBjdHgtPmhlaWdodDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR4dmEyX3RyYW5zZmVyX2dldF9mb3JtYXRzKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZIV0ZyYW1lVHJhbnNmZXJEaXJlY3Rpb24gZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKipmb3JtYXRzKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqZm10czsKKworICAgIGZtdHMgPSBhdl9tYWxsb2NfYXJyYXkoMiwgc2l6ZW9mKCpmbXRzKSk7CisgICAgaWYgKCFmbXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm10c1swXSA9IGN0eC0+c3dfZm9ybWF0OworICAgIGZtdHNbMV0gPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICAqZm9ybWF0cyA9IGZtdHM7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHh2YTJfdW5tYXBfZnJhbWUoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgSFdNYXBEZXNjcmlwdG9yICpod21hcCkKK3sKKyAgICBJRGlyZWN0M0RTdXJmYWNlOSAqc3VyZmFjZSA9IChJRGlyZWN0M0RTdXJmYWNlOSopaHdtYXAtPnNvdXJjZS0+ZGF0YVszXTsKKyAgICBJRGlyZWN0M0RTdXJmYWNlOV9VbmxvY2tSZWN0KHN1cmZhY2UpOworICAgIGF2X2ZyZWVwKCZod21hcC0+cHJpdik7Cit9CisKK3N0YXRpYyBpbnQgZHh2YTJfbWFwX2ZyYW1lKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIElEaXJlY3QzRFN1cmZhY2U5ICpzdXJmYWNlID0gKElEaXJlY3QzRFN1cmZhY2U5KilzcmMtPmRhdGFbM107CisgICAgRFhWQTJNYXBwaW5nICAgICAgKm1hcDsKKyAgICBEM0RTVVJGQUNFX0RFU0MgICAgc3VyZmFjZURlc2M7CisgICAgRDNETE9DS0VEX1JFQ1QgICAgIExvY2tlZFJlY3Q7CisgICAgSFJFU1VMVCAgICAgICAgICAgIGhyOworICAgIGludCBpLCBlcnIsIG5iX3BsYW5lczsKKyAgICBpbnQgbG9ja19mbGFncyA9IDA7CisKKyAgICBuYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhkc3QtPmZvcm1hdCk7CisKKyAgICBociA9IElEaXJlY3QzRFN1cmZhY2U5X0dldERlc2Moc3VyZmFjZSwgJnN1cmZhY2VEZXNjKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBnZXR0aW5nIGEgc3VyZmFjZSBkZXNjcmlwdGlvblxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKCEoZmxhZ3MgJiBBVl9IV0ZSQU1FX01BUF9XUklURSkpCisgICAgICAgIGxvY2tfZmxhZ3MgfD0gRDNETE9DS19SRUFET05MWTsKKyAgICBpZiAoZmxhZ3MgJiBBVl9IV0ZSQU1FX01BUF9PVkVSV1JJVEUpCisgICAgICAgIGxvY2tfZmxhZ3MgfD0gRDNETE9DS19ESVNDQVJEOworCisgICAgaHIgPSBJRGlyZWN0M0RTdXJmYWNlOV9Mb2NrUmVjdChzdXJmYWNlLCAmTG9ja2VkUmVjdCwgTlVMTCwgbG9ja19mbGFncyk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGxvY2sgRFhWQTIgc3VyZmFjZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgbWFwID0gYXZfbWFsbG9jeihzaXplb2YoKm1hcCkpOworICAgIGlmICghbWFwKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IGZmX2h3ZnJhbWVfbWFwX2NyZWF0ZShzcmMtPmh3X2ZyYW1lc19jdHgsIGRzdCwgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeHZhMl91bm1hcF9mcmFtZSwgbWFwKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9mcmVlcCgmbWFwKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl9wbGFuZXM7IGkrKykKKyAgICAgICAgZHN0LT5saW5lc2l6ZVtpXSA9IExvY2tlZFJlY3QuUGl0Y2g7CisKKyAgICBhdl9pbWFnZV9maWxsX3BvaW50ZXJzKGRzdC0+ZGF0YSwgZHN0LT5mb3JtYXQsIHN1cmZhY2VEZXNjLkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilMb2NrZWRSZWN0LnBCaXRzLCBkc3QtPmxpbmVzaXplKTsKKworICAgIGlmIChkc3QtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1BBTDgpCisgICAgICAgIGRzdC0+ZGF0YVsxXSA9ICh1aW50OF90KiltYXAtPnBhbGV0dGVfZHVtbXk7CisKKyAgICByZXR1cm4gMDsKK2ZhaWw6CisgICAgSURpcmVjdDNEU3VyZmFjZTlfVW5sb2NrUmVjdChzdXJmYWNlKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGR4dmEyX3RyYW5zZmVyX2RhdGFfdG8oQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBBVkZyYW1lICptYXA7CisgICAgaW50IHJldDsKKworICAgIGlmIChzcmMtPmZvcm1hdCAhPSBjdHgtPnN3X2Zvcm1hdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIG1hcCA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFtYXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWFwLT5mb3JtYXQgPSBkc3QtPmZvcm1hdDsKKworICAgIHJldCA9IGR4dmEyX21hcF9mcmFtZShjdHgsIG1hcCwgZHN0LCBBVl9IV0ZSQU1FX01BUF9XUklURSB8IEFWX0hXRlJBTUVfTUFQX09WRVJXUklURSk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGF2X2ltYWdlX2NvcHkobWFwLT5kYXRhLCBtYXAtPmxpbmVzaXplLCBzcmMtPmRhdGEsIHNyYy0+bGluZXNpemUsCisgICAgICAgICAgICAgICAgICBjdHgtPnN3X2Zvcm1hdCwgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQpOworCitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJm1hcCk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkeHZhMl90cmFuc2Zlcl9kYXRhX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjKQoreworICAgIEFWRnJhbWUgKm1hcDsKKyAgICBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplWzRdLCBkc3RfbGluZXNpemVbNF07CisgICAgaW50IHJldCwgaTsKKworICAgIGlmIChkc3QtPmZvcm1hdCAhPSBjdHgtPnN3X2Zvcm1hdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKworICAgIG1hcCA9IGF2X2ZyYW1lX2FsbG9jKCk7CisgICAgaWYgKCFtYXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgbWFwLT5mb3JtYXQgPSBkc3QtPmZvcm1hdDsKKworICAgIHJldCA9IGR4dmEyX21hcF9mcmFtZShjdHgsIG1hcCwgc3JjLCBBVl9IV0ZSQU1FX01BUF9SRUFEKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBkc3RfbGluZXNpemVbaV0gPSBkc3QtPmxpbmVzaXplW2ldOworICAgICAgICBzcmNfbGluZXNpemVbaV0gPSBtYXAtPmxpbmVzaXplW2ldOworICAgIH0KKyAgICBhdl9pbWFnZV9jb3B5X3VjX2Zyb20oZHN0LT5kYXRhLCBkc3RfbGluZXNpemUsIG1hcC0+ZGF0YSwgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnN3X2Zvcm1hdCwgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQpOworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZtYXApOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHh2YTJfbWFwX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmbGFncykKK3sKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGRzdC0+Zm9ybWF0ICE9IEFWX1BJWF9GTVRfTk9ORSAmJiBkc3QtPmZvcm1hdCAhPSBjdHgtPnN3X2Zvcm1hdCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICBkc3QtPmZvcm1hdCA9IGN0eC0+c3dfZm9ybWF0OworCisgICAgZXJyID0gZHh2YTJfbWFwX2ZyYW1lKGN0eCwgZHN0LCBzcmMsIGZsYWdzKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMoZHN0LCBzcmMpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGR4dmEyX2RldmljZV9mcmVlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgpCit7CisgICAgQVZEWFZBMkRldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBEWFZBMkRldmljZVByaXYgICAgICAgKnByaXYgPSBjdHgtPnVzZXJfb3BhcXVlOworCisgICAgaWYgKGh3Y3R4LT5kZXZtZ3IgJiYgcHJpdi0+ZGV2aWNlX2hhbmRsZSAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICAgICAgSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfQ2xvc2VEZXZpY2VIYW5kbGUoaHdjdHgtPmRldm1nciwgcHJpdi0+ZGV2aWNlX2hhbmRsZSk7CisKKyAgICBpZiAoaHdjdHgtPmRldm1ncikKKyAgICAgICAgSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfUmVsZWFzZShod2N0eC0+ZGV2bWdyKTsKKworICAgIGlmIChwcml2LT5kM2Q5ZGV2aWNlKQorICAgICAgICBJRGlyZWN0M0REZXZpY2U5X1JlbGVhc2UocHJpdi0+ZDNkOWRldmljZSk7CisKKyAgICBpZiAocHJpdi0+ZDNkOSkKKyAgICAgICAgSURpcmVjdDNEOV9SZWxlYXNlKHByaXYtPmQzZDkpOworCisgICAgaWYgKHByaXYtPmQzZGxpYikKKyAgICAgICAgZGxjbG9zZShwcml2LT5kM2RsaWIpOworCisgICAgaWYgKHByaXYtPmR4dmEybGliKQorICAgICAgICBkbGNsb3NlKHByaXYtPmR4dmEybGliKTsKKworICAgIGF2X2ZyZWVwKCZjdHgtPnVzZXJfb3BhcXVlKTsKK30KKworc3RhdGljIGludCBkeHZhMl9kZXZpY2VfY3JlYXRlOShBVkhXRGV2aWNlQ29udGV4dCAqY3R4LCBVSU5UIGFkYXB0ZXIpCit7CisgICAgRFhWQTJEZXZpY2VQcml2ICpwcml2ID0gY3R4LT51c2VyX29wYXF1ZTsKKyAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgZDNkcHAgPSBkeHZhMl9wcmVzZW50X3BhcmFtczsKKyAgICBEM0RESVNQTEFZTU9ERSBkM2RkbTsKKyAgICBIUkVTVUxUIGhyOworICAgIHBEaXJlY3QzRENyZWF0ZTkgKmNyZWF0ZUQzRCA9IChwRGlyZWN0M0RDcmVhdGU5ICopZGxzeW0ocHJpdi0+ZDNkbGliLCAiRGlyZWN0M0RDcmVhdGU5Iik7CisgICAgaWYgKCFjcmVhdGVEM0QpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGxvY2F0ZSBEaXJlY3QzRENyZWF0ZTlcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIHByaXYtPmQzZDkgPSBjcmVhdGVEM0QoRDNEX1NES19WRVJTSU9OKTsKKyAgICBpZiAoIXByaXYtPmQzZDkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBJRGlyZWN0M0Qgb2JqZWN0XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBJRGlyZWN0M0Q5X0dldEFkYXB0ZXJEaXNwbGF5TW9kZShwcml2LT5kM2Q5LCBhZGFwdGVyLCAmZDNkZG0pOworCisgICAgZDNkcHAuQmFja0J1ZmZlckZvcm1hdCA9IGQzZGRtLkZvcm1hdDsKKworICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UocHJpdi0+ZDNkOSwgYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIEdldERlc2t0b3BXaW5kb3coKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0QzRENSRUFURV9GTEFHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkM2RwcCwgJnByaXYtPmQzZDlkZXZpY2UpOworICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgRGlyZWN0M0QgZGV2aWNlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkeHZhMl9kZXZpY2VfY3JlYXRlOWV4KEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsIFVJTlQgYWRhcHRlcikKK3sKKyAgICBEWFZBMkRldmljZVByaXYgKnByaXYgPSBjdHgtPnVzZXJfb3BhcXVlOworICAgIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyBkM2RwcCA9IGR4dmEyX3ByZXNlbnRfcGFyYW1zOworICAgIEQzRERJU1BMQVlNT0RFRVggbW9kZWV4ID0gezB9OworICAgIElEaXJlY3QzRDlFeCAqZDNkOWV4ID0gTlVMTDsKKyAgICBJRGlyZWN0M0REZXZpY2U5RXggKmV4ZGV2ID0gTlVMTDsKKyAgICBIUkVTVUxUIGhyOworICAgIHBEaXJlY3QzRENyZWF0ZTlFeCAqY3JlYXRlRDNERXggPSAocERpcmVjdDNEQ3JlYXRlOUV4ICopZGxzeW0ocHJpdi0+ZDNkbGliLCAiRGlyZWN0M0RDcmVhdGU5RXgiKTsKKyAgICBpZiAoIWNyZWF0ZUQzREV4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworCisgICAgaHIgPSBjcmVhdGVEM0RFeChEM0RfU0RLX1ZFUlNJT04sICZkM2Q5ZXgpOworICAgIGlmIChGQUlMRUQoaHIpKQorICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworCisgICAgbW9kZWV4LlNpemUgPSBzaXplb2YoRDNERElTUExBWU1PREVFWCk7CisgICAgaHIgPSBJRGlyZWN0M0Q5RXhfR2V0QWRhcHRlckRpc3BsYXlNb2RlRXgoZDNkOWV4LCBhZGFwdGVyLCAmbW9kZWV4LCBOVUxMKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBJRGlyZWN0M0Q5RXhfUmVsZWFzZShkM2Q5ZXgpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGQzZHBwLkJhY2tCdWZmZXJGb3JtYXQgPSBtb2RlZXguRm9ybWF0OworCisgICAgaHIgPSBJRGlyZWN0M0Q5RXhfQ3JlYXRlRGV2aWNlRXgoZDNkOWV4LCBhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgR2V0RGVza3RvcFdpbmRvdygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZGX0QzRENSRUFURV9GTEFHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZDNkcHAsIE5VTEwsICZleGRldik7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgSURpcmVjdDNEOUV4X1JlbGVhc2UoZDNkOWV4KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlVzaW5nIEQzRDlFeCBkZXZpY2UuXG4iKTsKKyAgICBwcml2LT5kM2Q5ID0gKElEaXJlY3QzRDkgKilkM2Q5ZXg7CisgICAgcHJpdi0+ZDNkOWRldmljZSA9IChJRGlyZWN0M0REZXZpY2U5ICopZXhkZXY7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHh2YTJfZGV2aWNlX2NyZWF0ZShBVkhXRGV2aWNlQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzLCBpbnQgZmxhZ3MpCit7CisgICAgQVZEWFZBMkRldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBEWFZBMkRldmljZVByaXYgKnByaXY7CisgICAgcENyZWF0ZURldmljZU1hbmFnZXI5ICpjcmVhdGVEZXZpY2VNYW5hZ2VyID0gTlVMTDsKKyAgICB1bnNpZ25lZCByZXNldFRva2VuID0gMDsKKyAgICBVSU5UIGFkYXB0ZXIgPSBEM0RBREFQVEVSX0RFRkFVTFQ7CisgICAgSFJFU1VMVCBocjsKKyAgICBpbnQgZXJyOworCisgICAgaWYgKGRldmljZSkKKyAgICAgICAgYWRhcHRlciA9IGF0b2koZGV2aWNlKTsKKworICAgIHByaXYgPSBhdl9tYWxsb2N6KHNpemVvZigqcHJpdikpOworICAgIGlmICghcHJpdikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+dXNlcl9vcGFxdWUgPSBwcml2OworICAgIGN0eC0+ZnJlZSAgICAgICAgPSBkeHZhMl9kZXZpY2VfZnJlZTsKKworICAgIHByaXYtPmRldmljZV9oYW5kbGUgPSBJTlZBTElEX0hBTkRMRV9WQUxVRTsKKworICAgIHByaXYtPmQzZGxpYiA9IGRsb3BlbigiZDNkOS5kbGwiLCAwKTsKKyAgICBpZiAoIXByaXYtPmQzZGxpYikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbG9hZCBEM0Q5IGxpYnJhcnlcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBwcml2LT5keHZhMmxpYiA9IGRsb3BlbigiZHh2YTIuZGxsIiwgMCk7CisgICAgaWYgKCFwcml2LT5keHZhMmxpYikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbG9hZCBEWFZBMiBsaWJyYXJ5XG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBjcmVhdGVEZXZpY2VNYW5hZ2VyID0gKHBDcmVhdGVEZXZpY2VNYW5hZ2VyOSAqKWRsc3ltKHByaXYtPmR4dmEybGliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRYVkEyQ3JlYXRlRGlyZWN0M0REZXZpY2VNYW5hZ2VyOSIpOworICAgIGlmICghY3JlYXRlRGV2aWNlTWFuYWdlcikgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbG9jYXRlIERYVkEyQ3JlYXRlRGlyZWN0M0REZXZpY2VNYW5hZ2VyOVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKGR4dmEyX2RldmljZV9jcmVhdGU5ZXgoY3R4LCBhZGFwdGVyKSA8IDApIHsKKyAgICAgICAgLy8gUmV0cnkgd2l0aCAiY2xhc3NpYyIgZDNkOQorICAgICAgICBlcnIgPSBkeHZhMl9kZXZpY2VfY3JlYXRlOShjdHgsIGFkYXB0ZXIpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaHIgPSBjcmVhdGVEZXZpY2VNYW5hZ2VyKCZyZXNldFRva2VuLCAmaHdjdHgtPmRldm1ncik7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBEaXJlY3QzRCBkZXZpY2UgbWFuYWdlclxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaHIgPSBJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOV9SZXNldERldmljZShod2N0eC0+ZGV2bWdyLCBwcml2LT5kM2Q5ZGV2aWNlLCByZXNldFRva2VuKTsKKyAgICBpZiAoRkFJTEVEKGhyKSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYmluZCBEaXJlY3QzRCBkZXZpY2UgdG8gZGV2aWNlIG1hbmFnZXJcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGhyID0gSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfT3BlbkRldmljZUhhbmRsZShod2N0eC0+ZGV2bWdyLCAmcHJpdi0+ZGV2aWNlX2hhbmRsZSk7CisgICAgaWYgKEZBSUxFRChocikpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIG9wZW4gZGV2aWNlIGhhbmRsZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfZHh2YTIgPSB7CisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZfSFdERVZJQ0VfVFlQRV9EWFZBMiwKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAiRFhWQTIiLAorCisgICAgLmRldmljZV9od2N0eF9zaXplICAgID0gc2l6ZW9mKEFWRFhWQTJEZXZpY2VDb250ZXh0KSwKKyAgICAuZnJhbWVzX2h3Y3R4X3NpemUgICAgPSBzaXplb2YoQVZEWFZBMkZyYW1lc0NvbnRleHQpLAorICAgIC5mcmFtZXNfcHJpdl9zaXplICAgICA9IHNpemVvZihEWFZBMkZyYW1lc0NvbnRleHQpLAorCisgICAgLmRldmljZV9jcmVhdGUgICAgICAgID0gZHh2YTJfZGV2aWNlX2NyZWF0ZSwKKyAgICAuZnJhbWVzX2luaXQgICAgICAgICAgPSBkeHZhMl9mcmFtZXNfaW5pdCwKKyAgICAuZnJhbWVzX3VuaW5pdCAgICAgICAgPSBkeHZhMl9mcmFtZXNfdW5pbml0LAorICAgIC5mcmFtZXNfZ2V0X2J1ZmZlciAgICA9IGR4dmEyX2dldF9idWZmZXIsCisgICAgLnRyYW5zZmVyX2dldF9mb3JtYXRzID0gZHh2YTJfdHJhbnNmZXJfZ2V0X2Zvcm1hdHMsCisgICAgLnRyYW5zZmVyX2RhdGFfdG8gICAgID0gZHh2YTJfdHJhbnNmZXJfZGF0YV90bywKKyAgICAudHJhbnNmZXJfZGF0YV9mcm9tICAgPSBkeHZhMl90cmFuc2Zlcl9kYXRhX2Zyb20sCisgICAgLm1hcF9mcm9tICAgICAgICAgICAgID0gZHh2YTJfbWFwX2Zyb20sCisKKyAgICAucGl4X2ZtdHMgICAgICAgICAgICAgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX0RYVkEyX1ZMRCwgQVZfUElYX0ZNVF9OT05FIH0sCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2h3Y29udGV4dF9keHZhMi5oIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9keHZhMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYjc5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvaHdjb250ZXh0X2R4dmEyLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisKKyNpZm5kZWYgQVZVVElMX0hXQ09OVEVYVF9EWFZBMl9ICisjZGVmaW5lIEFWVVRJTF9IV0NPTlRFWFRfRFhWQTJfSAorCisvKioKKyAqIEBmaWxlCisgKiBBbiBBUEktc3BlY2lmaWMgaGVhZGVyIGZvciBBVl9IV0RFVklDRV9UWVBFX0RYVkEyLgorICoKKyAqIE9ubHkgZml4ZWQtc2l6ZSBwb29scyBhcmUgc3VwcG9ydGVkLgorICoKKyAqIEZvciB1c2VyLWFsbG9jYXRlZCBwb29scywgQVZIV0ZyYW1lc0NvbnRleHQucG9vbCBtdXN0IHJldHVybiBBVkJ1ZmZlclJlZnMKKyAqIHdpdGggdGhlIGRhdGEgcG9pbnRlciBzZXQgdG8gYSBwb2ludGVyIHRvIElEaXJlY3QzRFN1cmZhY2U5LgorICovCisKKyNpbmNsdWRlIDxkM2Q5Lmg+CisjaW5jbHVkZSA8ZHh2YTJhcGkuaD4KKworLyoqCisgKiBUaGlzIHN0cnVjdCBpcyBhbGxvY2F0ZWQgYXMgQVZIV0RldmljZUNvbnRleHQuaHdjdHgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZEWFZBMkRldmljZUNvbnRleHQgeworICAgIElEaXJlY3QzRERldmljZU1hbmFnZXI5ICpkZXZtZ3I7Cit9IEFWRFhWQTJEZXZpY2VDb250ZXh0OworCisvKioKKyAqIFRoaXMgc3RydWN0IGlzIGFsbG9jYXRlZCBhcyBBVkhXRnJhbWVzQ29udGV4dC5od2N0eAorICovCit0eXBlZGVmIHN0cnVjdCBBVkRYVkEyRnJhbWVzQ29udGV4dCB7CisgICAgLyoqCisgICAgICogVGhlIHN1cmZhY2UgdHlwZSAoZS5nLiBEWFZBMl9WaWRlb1Byb2Nlc3NvclJlbmRlclRhcmdldCBvcgorICAgICAqIERYVkEyX1ZpZGVvRGVjb2RlclJlbmRlclRhcmdldCkuIE11c3QgYmUgc2V0IGJ5IHRoZSBjYWxsZXIuCisgICAgICovCisgICAgRFdPUkQgICAgICAgICAgICAgICBzdXJmYWNlX3R5cGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VyZmFjZSBwb29sLiBXaGVuIGFuIGV4dGVybmFsIHBvb2wgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIsCisgICAgICogdGhpcyB3aWxsIGJlIG1hbmFnZWQgKGFsbG9jYXRlZCBhbmQgZmlsbGVkIG9uIGluaXQsIGZyZWVkIG9uIHVuaW5pdCkgYnkKKyAgICAgKiBsaWJhdnV0aWwuCisgICAgICovCisgICAgSURpcmVjdDNEU3VyZmFjZTkgKipzdXJmYWNlczsKKyAgICBpbnQgICAgICAgICAgICAgIG5iX3N1cmZhY2VzOworCisgICAgLyoqCisgICAgICogQ2VydGFpbiBkcml2ZXJzIHJlcXVpcmUgdGhlIGRlY29kZXIgdG8gYmUgZGVzdHJveWVkIGJlZm9yZSB0aGUgc3VyZmFjZXMuCisgICAgICogVG8gYWxsb3cgaW50ZXJuYWxseSBtYW5hZ2VkIHBvb2xzIHRvIHdvcmsgcHJvcGVybHkgaW4gc3VjaCBjYXNlcywgdGhpcworICAgICAqIGZpZWxkIGlzIHByb3ZpZGVkLgorICAgICAqCisgICAgICogSWYgaXQgaXMgbm9uLU5VTEwsIGxpYmF2dXRpbCB3aWxsIGNhbGwgSURpcmVjdFhWaWRlb0RlY29kZXJfUmVsZWFzZSgpIG9uCisgICAgICogaXQganVzdCBiZWZvcmUgdGhlIGludGVybmFsIHN1cmZhY2UgcG9vbCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgZm9yIGNvbnZlbmllbmNlIG9ubHkuIFNvbWUgY29kZSB1c2VzIG90aGVyIG1ldGhvZHMgdG8gbWFuYWdlIHRoZQorICAgICAqIGRlY29kZXIgcmVmZXJlbmNlLgorICAgICAqLworICAgIElEaXJlY3RYVmlkZW9EZWNvZGVyICpkZWNvZGVyX3RvX3JlbGVhc2U7Cit9IEFWRFhWQTJGcmFtZXNDb250ZXh0OworCisjZW5kaWYgLyogQVZVVElMX0hXQ09OVEVYVF9EWFZBMl9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X2ludGVybmFsLmggYi9saWJhdnV0aWwvaHdjb250ZXh0X2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyMDYyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHRfaW50ZXJuYWwuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9IV0NPTlRFWFRfSU5URVJOQUxfSAorI2RlZmluZSBBVlVUSUxfSFdDT05URVhUX0lOVEVSTkFMX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0LmgiCisjaW5jbHVkZSAiZnJhbWUuaCIKKyNpbmNsdWRlICJwaXhmbXQuaCIKKwordHlwZWRlZiBzdHJ1Y3QgSFdDb250ZXh0VHlwZSB7CisgICAgZW51bSBBVkhXRGV2aWNlVHlwZSB0eXBlOworICAgIGNvbnN0IGNoYXIgICAgICAgICAqbmFtZTsKKworICAgIC8qKgorICAgICAqIEFuIGFycmF5IG9mIHBpeGVsIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSBBVkhXRnJhbWVzQ29udGV4dCBpbnN0YW5jZXMKKyAgICAgKiBUZXJtaW5hdGVkIGJ5IEFWX1BJWF9GTVRfTk9ORS4KKyAgICAgKi8KKyAgICBjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeF9mbXRzOworCisgICAgLyoqCisgICAgICogc2l6ZSBvZiB0aGUgcHVibGljIGhhcmR3YXJlLXNwZWNpZmljIGNvbnRleHQsCisgICAgICogaS5lLiBBVkhXRGV2aWNlQ29udGV4dC5od2N0eAorICAgICAqLworICAgIHNpemVfdCAgICAgICAgICAgICBkZXZpY2VfaHdjdHhfc2l6ZTsKKyAgICAvKioKKyAgICAgKiBzaXplIG9mIHRoZSBwcml2YXRlIGRhdGEsIGkuZS4KKyAgICAgKiBBVkhXRGV2aWNlSW50ZXJuYWwucHJpdgorICAgICAqLworICAgIHNpemVfdCAgICAgICAgICAgICBkZXZpY2VfcHJpdl9zaXplOworCisgICAgLyoqCisgICAgICogU2l6ZSBvZiB0aGUgaGFyZHdhcmUtc3BlY2lmaWMgZGV2aWNlIGNvbmZpZ3VyYXRpb24uCisgICAgICogKFVzZWQgdG8gcXVlcnkgaHdmcmFtZSBjb25zdHJhaW50cy4pCisgICAgICovCisgICAgc2l6ZV90ICAgICAgICAgICAgIGRldmljZV9od2NvbmZpZ19zaXplOworCisgICAgLyoqCisgICAgICogc2l6ZSBvZiB0aGUgcHVibGljIGZyYW1lIHBvb2wgaGFyZHdhcmUtc3BlY2lmaWMgY29udGV4dCwKKyAgICAgKiBpLmUuIEFWSFdGcmFtZXNDb250ZXh0Lmh3Y3R4CisgICAgICovCisgICAgc2l6ZV90ICAgICAgICAgICAgIGZyYW1lc19od2N0eF9zaXplOworICAgIC8qKgorICAgICAqIHNpemUgb2YgdGhlIHByaXZhdGUgZGF0YSwgaS5lLgorICAgICAqIEFWSFdGcmFtZXNJbnRlcm5hbC5wcml2CisgICAgICovCisgICAgc2l6ZV90ICAgICAgICAgICAgIGZyYW1lc19wcml2X3NpemU7CisKKyAgICBpbnQgICAgICAgICAgICAgICgqZGV2aWNlX2NyZWF0ZSkoQVZIV0RldmljZUNvbnRleHQgKmN0eCwgY29uc3QgY2hhciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMsIGludCBmbGFncyk7CisgICAgaW50ICAgICAgICAgICAgICAoKmRldmljZV9kZXJpdmUpKEFWSFdEZXZpY2VDb250ZXh0ICpkc3RfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRGV2aWNlQ29udGV4dCAqc3JjX2N0eCwgaW50IGZsYWdzKTsKKworICAgIGludCAgICAgICAgICAgICAgKCpkZXZpY2VfaW5pdCkoQVZIV0RldmljZUNvbnRleHQgKmN0eCk7CisgICAgdm9pZCAgICAgICAgICAgICAoKmRldmljZV91bmluaXQpKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgpOworCisgICAgaW50ICAgICAgICAgICAgICAoKmZyYW1lc19nZXRfY29uc3RyYWludHMpKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmh3Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29uc3RyYWludHMgKmNvbnN0cmFpbnRzKTsKKworICAgIGludCAgICAgICAgICAgICAgKCpmcmFtZXNfaW5pdCkoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCk7CisgICAgdm9pZCAgICAgICAgICAgICAoKmZyYW1lc191bmluaXQpKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgpOworCisgICAgaW50ICAgICAgICAgICAgICAoKmZyYW1lc19nZXRfYnVmZmVyKShBVkhXRnJhbWVzQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSk7CisgICAgaW50ICAgICAgICAgICAgICAoKnRyYW5zZmVyX2dldF9mb3JtYXRzKShBVkhXRnJhbWVzQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkhXRnJhbWVUcmFuc2ZlckRpcmVjdGlvbiBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKipmb3JtYXRzKTsKKyAgICBpbnQgICAgICAgICAgICAgICgqdHJhbnNmZXJfZGF0YV90bykoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMpOworICAgIGludCAgICAgICAgICAgICAgKCp0cmFuc2Zlcl9kYXRhX2Zyb20pKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMpOworCisgICAgaW50ICAgICAgICAgICAgICAoKm1hcF90bykoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKTsKKyAgICBpbnQgICAgICAgICAgICAgICgqbWFwX2Zyb20pKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKTsKKworICAgIGludCAgICAgICAgICAgICAgKCpmcmFtZXNfZGVyaXZlX3RvKShBVkhXRnJhbWVzQ29udGV4dCAqZHN0X2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKnNyY19jdHgsIGludCBmbGFncyk7CisgICAgaW50ICAgICAgICAgICAgICAoKmZyYW1lc19kZXJpdmVfZnJvbSkoQVZIV0ZyYW1lc0NvbnRleHQgKmRzdF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKnNyY19jdHgsIGludCBmbGFncyk7Cit9IEhXQ29udGV4dFR5cGU7CisKK3N0cnVjdCBBVkhXRGV2aWNlSW50ZXJuYWwgeworICAgIGNvbnN0IEhXQ29udGV4dFR5cGUgKmh3X3R5cGU7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqcHJpdjsKKworICAgIC8qKgorICAgICAqIEZvciBhIGRlcml2ZWQgZGV2aWNlLCBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgZGV2aWNlCisgICAgICogY29udGV4dCBpdCB3YXMgZGVyaXZlZCBmcm9tLgorICAgICAqLworICAgIEFWQnVmZmVyUmVmICpzb3VyY2VfZGV2aWNlOworfTsKKworc3RydWN0IEFWSFdGcmFtZXNJbnRlcm5hbCB7CisgICAgY29uc3QgSFdDb250ZXh0VHlwZSAqaHdfdHlwZTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICpwcml2OworCisgICAgQVZCdWZmZXJQb29sICpwb29sX2ludGVybmFsOworCisgICAgLyoqCisgICAgICogRm9yIGEgZGVyaXZlZCBjb250ZXh0LCBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgZnJhbWVzCisgICAgICogY29udGV4dCBpdCB3YXMgZGVyaXZlZCBmcm9tLgorICAgICAqLworICAgIEFWQnVmZmVyUmVmICpzb3VyY2VfZnJhbWVzOworICAgIC8qKgorICAgICAqIEZsYWdzIHRvIGFwcGx5IHRvIHRoZSBtYXBwaW5nIGZyb20gdGhlIHNvdXJjZSB0byB0aGUgZGVyaXZlZAorICAgICAqIGZyYW1lIGNvbnRleHQgd2hlbiB0cnlpbmcgdG8gYWxsb2NhdGUgaW4gdGhlIGRlcml2ZWQgY29udGV4dC4KKyAgICAgKi8KKyAgICBpbnQgc291cmNlX2FsbG9jYXRpb25fbWFwX2ZsYWdzOworfTsKKwordHlwZWRlZiBzdHJ1Y3QgSFdNYXBEZXNjcmlwdG9yIHsKKyAgICAvKioKKyAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgc291cmNlIG9mIHRoZSBtYXBwaW5nLgorICAgICAqLworICAgIEFWRnJhbWUgKnNvdXJjZTsKKyAgICAvKioKKyAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgaGFyZHdhcmUgZnJhbWVzIGNvbnRleHQgaW4gd2hpY2ggdGhpcworICAgICAqIG1hcHBpbmcgd2FzIG1hZGUuICBNYXkgYmUgdGhlIHNhbWUgYXMgc291cmNlLT5od19mcmFtZXNfY3R4LAorICAgICAqIGJ1dCBuZWVkIG5vdCBiZS4KKyAgICAgKi8KKyAgICBBVkJ1ZmZlclJlZiAqaHdfZnJhbWVzX2N0eDsKKyAgICAvKioKKyAgICAgKiBVbm1hcCBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkICgqdW5tYXApKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgSFdNYXBEZXNjcmlwdG9yICpod21hcCk7CisgICAgLyoqCisgICAgICogSGFyZHdhcmUtc3BlY2lmaWMgcHJpdmF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWFwcGluZy4KKyAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICpwcml2OworfSBIV01hcERlc2NyaXB0b3I7CisKK2ludCBmZl9od2ZyYW1lX21hcF9jcmVhdGUoQVZCdWZmZXJSZWYgKmh3ZnJhbWVfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnVubWFwKShBVkhXRnJhbWVzQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwcml2KTsKKworCitleHRlcm4gY29uc3QgSFdDb250ZXh0VHlwZSBmZl9od2NvbnRleHRfdHlwZV9jdWRhOworZXh0ZXJuIGNvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfZDNkMTF2YTsKK2V4dGVybiBjb25zdCBIV0NvbnRleHRUeXBlIGZmX2h3Y29udGV4dF90eXBlX2RybTsKK2V4dGVybiBjb25zdCBIV0NvbnRleHRUeXBlIGZmX2h3Y29udGV4dF90eXBlX2R4dmEyOworZXh0ZXJuIGNvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfb3BlbmNsOworZXh0ZXJuIGNvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfcXN2OworZXh0ZXJuIGNvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfdmFhcGk7CitleHRlcm4gY29uc3QgSFdDb250ZXh0VHlwZSBmZl9od2NvbnRleHRfdHlwZV92ZHBhdTsKK2V4dGVybiBjb25zdCBIV0NvbnRleHRUeXBlIGZmX2h3Y29udGV4dF90eXBlX3ZpZGVvdG9vbGJveDsKK2V4dGVybiBjb25zdCBIV0NvbnRleHRUeXBlIGZmX2h3Y29udGV4dF90eXBlX21lZGlhY29kZWM7CisKKyNlbmRpZiAvKiBBVlVUSUxfSFdDT05URVhUX0lOVEVSTkFMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9od2NvbnRleHRfbWVkaWFjb2RlYy5jIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9tZWRpYWNvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkODk5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHRfbWVkaWFjb2RlYy5jCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiYnVmZmVyLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0LmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X2ludGVybmFsLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X21lZGlhY29kZWMuaCIKKworc3RhdGljIGludCBtY19kZXZpY2VfY3JlYXRlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMsIGludCBmbGFncykKK3sKKyAgICBpZiAoZGV2aWNlICYmIGRldmljZVswXSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJEZXZpY2Ugc2VsZWN0aW9uIHVuc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2NvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfbWVkaWFjb2RlYyA9IHsKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgPSBBVl9IV0RFVklDRV9UWVBFX01FRElBQ09ERUMsCisgICAgLm5hbWUgICAgICAgICAgICAgICAgID0gIm1lZGlhY29kZWMiLAorCisgICAgLmRldmljZV9od2N0eF9zaXplICAgID0gc2l6ZW9mKEFWTWVkaWFDb2RlY0RldmljZUNvbnRleHQpLAorCisgICAgLmRldmljZV9jcmVhdGUgICAgICAgID0gbWNfZGV2aWNlX2NyZWF0ZSwKKworICAgIC5waXhfZm10cyA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7CisgICAgICAgIEFWX1BJWF9GTVRfTUVESUFDT0RFQywKKyAgICAgICAgQVZfUElYX0ZNVF9OT05FCisgICAgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X21lZGlhY29kZWMuaCBiL2xpYmF2dXRpbC9od2NvbnRleHRfbWVkaWFjb2RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWE5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvaHdjb250ZXh0X21lZGlhY29kZWMuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0hXQ09OVEVYVF9NRURJQUNPREVDX0gKKyNkZWZpbmUgQVZVVElMX0hXQ09OVEVYVF9NRURJQUNPREVDX0gKKworLyoqCisgKiBNZWRpYUNvZGVjIGRldGFpbHMuCisgKgorICogQWxsb2NhdGVkIGFzIEFWSFdEZXZpY2VDb250ZXh0Lmh3Y3R4CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWTWVkaWFDb2RlY0RldmljZUNvbnRleHQgeworICAgIC8qKgorICAgICAqIGFuZHJvaWQvdmlldy9TdXJmYWNlIGhhbmRsZSwgdG8gYmUgZmlsbGVkIGJ5IHRoZSB1c2VyLgorICAgICAqCisgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBzdXJmYWNlIHVzZWQgYnkgZGVjb2RlcnMgb24gdGhpcyBkZXZpY2UuCisgICAgICovCisgICAgdm9pZCAqc3VyZmFjZTsKK30gQVZNZWRpYUNvZGVjRGV2aWNlQ29udGV4dDsKKworI2VuZGlmIC8qIEFWVVRJTF9IV0NPTlRFWFRfTUVESUFDT0RFQ19IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X29wZW5jbC5jIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9vcGVuY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2I1YzVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9vcGVuY2wuYwpAQCAtMCwwICsxLDI5NDEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBDTF9VU0VfREVQUkVDQVRFRF9PUEVOQ0xfMV8yX0FQSVMKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJhdmFzc2VydC5oIgorI2luY2x1ZGUgImF2c3RyaW5nLmgiCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0LmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X2ludGVybmFsLmgiCisjaW5jbHVkZSAiaHdjb250ZXh0X29wZW5jbC5oIgorI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgInBpeGRlc2MuaCIKKworI2lmIEhBVkVfT1BFTkNMX1ZBQVBJX0JFSUdORVQKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx2YS92YS5oPgorI2luY2x1ZGUgPHZhL3ZhX2RybWNvbW1vbi5oPgorI2luY2x1ZGUgPENML2NsX2ludGVsLmg+CisjaW5jbHVkZSAiaHdjb250ZXh0X3ZhYXBpLmgiCisjZW5kaWYKKworI2lmIEhBVkVfT1BFTkNMX0RSTV9CRUlHTkVUCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Q0wvY2xfaW50ZWwuaD4KKyNpbmNsdWRlICJod2NvbnRleHRfZHJtLmgiCisjZW5kaWYKKworI2lmIEhBVkVfT1BFTkNMX1ZBQVBJX0lOVEVMX01FRElBCisjaW5jbHVkZSA8bWZ4L21meHN0cnVjdHVyZXMuaD4KKyNpbmNsdWRlIDx2YS92YS5oPgorI2luY2x1ZGUgPENML3ZhX2V4dC5oPgorI2luY2x1ZGUgImh3Y29udGV4dF92YWFwaS5oIgorI2VuZGlmCisKKyNpZiBIQVZFX09QRU5DTF9EWFZBMgorI2RlZmluZSBDT0JKTUFDUk9TCisjaW5jbHVkZSA8Q0wvY2xfZHg5X21lZGlhX3NoYXJpbmcuaD4KKyNpbmNsdWRlIDxkeHZhMmFwaS5oPgorI2luY2x1ZGUgImh3Y29udGV4dF9keHZhMi5oIgorI2VuZGlmCisKKyNpZiBIQVZFX09QRU5DTF9EM0QxMQorI2luY2x1ZGUgPENML2NsX2QzZDExLmg+CisjaW5jbHVkZSAiaHdjb250ZXh0X2QzZDExdmEuaCIKKyNlbmRpZgorCisjaWYgSEFWRV9PUEVOQ0xfRFJNX0FSTQorI2luY2x1ZGUgPENML2NsX2V4dC5oPgorI2luY2x1ZGUgPGRybV9mb3VyY2MuaD4KKyNpbmNsdWRlICJod2NvbnRleHRfZHJtLmgiCisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBPcGVuQ0xEZXZpY2VDb250ZXh0IHsKKyAgICAvLyBEZWZhdWx0IGNvbW1hbmQgcXVldWUgdG8gdXNlIGZvciB0cmFuc2Zlci9tYXBwaW5nIG9wZXJhdGlvbnMgb24KKyAgICAvLyB0aGUgZGV2aWNlLiAgSWYgdGhlIHVzZXIgc3VwcGxpZXMgb25lLCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGl0LgorICAgIC8vIE90aGVyd2lzZSwgaXQgaXMgbmV3bHktY3JlYXRlZC4KKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWU7CisKKyAgICAvLyBUaGUgcGxhdGZvcm0gdGhlIGNvbnRleHQgZXhpc3RzIG9uLiAgVGhpcyBpcyBuZWVkZWQgdG8gcXVlcnkgYW5kCisgICAgLy8gcmV0cmlldmUgZXh0ZW5zaW9uIGZ1bmN0aW9ucy4KKyAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybV9pZDsKKworICAgIC8vIFBsYXRmb3JtL2RldmljZS1zcGVjaWZpYyBmdW5jdGlvbnMuCisjaWYgSEFWRV9PUEVOQ0xfRFJNX0JFSUdORVQKKyAgICBpbnQgYmVpZ25ldF9kcm1fbWFwcGluZ191c2FibGU7CisgICAgY2xDcmVhdGVJbWFnZUZyb21GZElOVEVMX2ZuIGNsQ3JlYXRlSW1hZ2VGcm9tRmRJTlRFTDsKKyNlbmRpZgorCisjaWYgSEFWRV9PUEVOQ0xfVkFBUElfSU5URUxfTUVESUEKKyAgICBpbnQgcXN2X21hcHBpbmdfdXNhYmxlOworICAgIGNsQ3JlYXRlRnJvbVZBX0FQSU1lZGlhU3VyZmFjZUlOVEVMX2ZuCisgICAgICAgIGNsQ3JlYXRlRnJvbVZBX0FQSU1lZGlhU3VyZmFjZUlOVEVMOworICAgIGNsRW5xdWV1ZUFjcXVpcmVWQV9BUElNZWRpYVN1cmZhY2VzSU5URUxfZm4KKyAgICAgICAgY2xFbnF1ZXVlQWNxdWlyZVZBX0FQSU1lZGlhU3VyZmFjZXNJTlRFTDsKKyAgICBjbEVucXVldWVSZWxlYXNlVkFfQVBJTWVkaWFTdXJmYWNlc0lOVEVMX2ZuCisgICAgICAgIGNsRW5xdWV1ZVJlbGVhc2VWQV9BUElNZWRpYVN1cmZhY2VzSU5URUw7CisjZW5kaWYKKworI2lmIEhBVkVfT1BFTkNMX0RYVkEyCisgICAgaW50IGR4dmEyX21hcHBpbmdfdXNhYmxlOworICAgIGNsX2R4OV9tZWRpYV9hZGFwdGVyX3R5cGVfa2hyIGR4OV9tZWRpYV9hZGFwdGVyX3R5cGU7CisKKyAgICBjbENyZWF0ZUZyb21EWDlNZWRpYVN1cmZhY2VLSFJfZm4KKyAgICAgICAgY2xDcmVhdGVGcm9tRFg5TWVkaWFTdXJmYWNlS0hSOworICAgIGNsRW5xdWV1ZUFjcXVpcmVEWDlNZWRpYVN1cmZhY2VzS0hSX2ZuCisgICAgICAgIGNsRW5xdWV1ZUFjcXVpcmVEWDlNZWRpYVN1cmZhY2VzS0hSOworICAgIGNsRW5xdWV1ZVJlbGVhc2VEWDlNZWRpYVN1cmZhY2VzS0hSX2ZuCisgICAgICAgIGNsRW5xdWV1ZVJlbGVhc2VEWDlNZWRpYVN1cmZhY2VzS0hSOworI2VuZGlmCisKKyNpZiBIQVZFX09QRU5DTF9EM0QxMQorICAgIGludCBkM2QxMV9tYXBwaW5nX3VzYWJsZTsKKyAgICBjbENyZWF0ZUZyb21EM0QxMVRleHR1cmUyREtIUl9mbgorICAgICAgICBjbENyZWF0ZUZyb21EM0QxMVRleHR1cmUyREtIUjsKKyAgICBjbEVucXVldWVBY3F1aXJlRDNEMTFPYmplY3RzS0hSX2ZuCisgICAgICAgIGNsRW5xdWV1ZUFjcXVpcmVEM0QxMU9iamVjdHNLSFI7CisgICAgY2xFbnF1ZXVlUmVsZWFzZUQzRDExT2JqZWN0c0tIUl9mbgorICAgICAgICBjbEVucXVldWVSZWxlYXNlRDNEMTFPYmplY3RzS0hSOworI2VuZGlmCisKKyNpZiBIQVZFX09QRU5DTF9EUk1fQVJNCisgICAgaW50IGRybV9hcm1fbWFwcGluZ191c2FibGU7CisjZW5kaWYKK30gT3BlbkNMRGV2aWNlQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgT3BlbkNMRnJhbWVzQ29udGV4dCB7CisgICAgLy8gQ29tbWFuZCBxdWV1ZSB1c2VkIGZvciB0cmFuc2Zlci9tYXBwaW5nIG9wZXJhdGlvbnMgb24gdGhpcyBmcmFtZXMKKyAgICAvLyBjb250ZXh0LiAgSWYgdGhlIHVzZXIgc3VwcGxpZXMgb25lLCB0aGlzIGlzIGEgcmVmZXJlbmNlIHRvIGl0LgorICAgIC8vIE90aGVyd2lzZSwgaXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIGRlZmF1bHQgY29tbWFuZCBxdWV1ZSBmb3IgdGhlCisgICAgLy8gZGV2aWNlLgorICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZTsKKworI2lmIEhBVkVfT1BFTkNMX0RYVkEyIHx8IEhBVkVfT1BFTkNMX0QzRDExCisgICAgLy8gRm9yIG1hcHBpbmcgQVBJcyB3aGljaCBoYXZlIHNlcGFyYXRlIGNyZWF0aW9uIGFuZCBhY3F1aXJlL3JlbGVhc2UKKyAgICAvLyBzdGVwcywgdGhpcyBzdG9yZXMgdGhlIE9wZW5DTCBtZW1vcnkgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIGVhY2gKKyAgICAvLyBmcmFtZS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgbmJfbWFwcGVkX2ZyYW1lczsKKyAgICBBVk9wZW5DTEZyYW1lRGVzY3JpcHRvciAqbWFwcGVkX2ZyYW1lczsKKyNlbmRpZgorfSBPcGVuQ0xGcmFtZXNDb250ZXh0OworCisKK3N0YXRpYyB2b2lkIG9wZW5jbF9lcnJvcl9jYWxsYmFjayhjb25zdCBjaGFyICplcnJpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnByaXZhdGVfaW5mbywgc2l6ZV90IGNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSkKK3sKKyAgICBBVkhXRGV2aWNlQ29udGV4dCAqY3R4ID0gdXNlcl9kYXRhOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBlcnJvcjogJXNcbiIsIGVycmluZm8pOworfQorCitzdGF0aWMgdm9pZCBvcGVuY2xfZGV2aWNlX2ZyZWUoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2KQoreworICAgIEFWT3BlbkNMRGV2aWNlQ29udGV4dCAqaHdjdHggPSBod2Rldi0+aHdjdHg7CisgICAgY2xfaW50IGNsZTsKKworICAgIGNsZSA9IGNsUmVsZWFzZUNvbnRleHQoaHdjdHgtPmNvbnRleHQpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlIE9wZW5DTCAiCisgICAgICAgICAgICAgICAiY29udGV4dDogJWQuXG4iLCBjbGUpOworICAgIH0KK30KKworc3RhdGljIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqa2V5OworICAgIGNsX3BsYXRmb3JtX2luZm8gbmFtZTsKK30gb3BlbmNsX3BsYXRmb3JtX3BhcmFtc1tdID0geworICAgIHsgInBsYXRmb3JtX3Byb2ZpbGUiLCAgICBDTF9QTEFURk9STV9QUk9GSUxFICAgIH0sCisgICAgeyAicGxhdGZvcm1fdmVyc2lvbiIsICAgIENMX1BMQVRGT1JNX1ZFUlNJT04gICAgfSwKKyAgICB7ICJwbGF0Zm9ybV9uYW1lIiwgICAgICAgQ0xfUExBVEZPUk1fTkFNRSAgICAgICB9LAorICAgIHsgInBsYXRmb3JtX3ZlbmRvciIsICAgICBDTF9QTEFURk9STV9WRU5ET1IgICAgIH0sCisgICAgeyAicGxhdGZvcm1fZXh0ZW5zaW9ucyIsIENMX1BMQVRGT1JNX0VYVEVOU0lPTlMgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmtleTsKKyAgICBjbF9kZXZpY2VfaW5mbyBuYW1lOworfSBvcGVuY2xfZGV2aWNlX3BhcmFtc1tdID0geworICAgIHsgImRldmljZV9uYW1lIiwgICAgICAgICBDTF9ERVZJQ0VfTkFNRSAgICAgICAgIH0sCisgICAgeyAiZGV2aWNlX3ZlbmRvciIsICAgICAgIENMX0RFVklDRV9WRU5ET1IgICAgICAgfSwKKyAgICB7ICJkcml2ZXJfdmVyc2lvbiIsICAgICAgQ0xfRFJJVkVSX1ZFUlNJT04gICAgICB9LAorICAgIHsgImRldmljZV92ZXJzaW9uIiwgICAgICBDTF9ERVZJQ0VfVkVSU0lPTiAgICAgIH0sCisgICAgeyAiZGV2aWNlX3Byb2ZpbGUiLCAgICAgIENMX0RFVklDRV9QUk9GSUxFICAgICAgfSwKKyAgICB7ICJkZXZpY2VfZXh0ZW5zaW9ucyIsICAgQ0xfREVWSUNFX0VYVEVOU0lPTlMgICB9LAorfTsKKworc3RhdGljIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqa2V5OworICAgIGNsX2RldmljZV90eXBlIHR5cGU7Cit9IG9wZW5jbF9kZXZpY2VfdHlwZXNbXSA9IHsKKyAgICB7ICJjcHUiLCAgICAgICAgIENMX0RFVklDRV9UWVBFX0NQVSAgICAgICAgIH0sCisgICAgeyAiZ3B1IiwgICAgICAgICBDTF9ERVZJQ0VfVFlQRV9HUFUgICAgICAgICB9LAorICAgIHsgImFjY2VsZXJhdG9yIiwgQ0xfREVWSUNFX1RZUEVfQUNDRUxFUkFUT1IgfSwKKyAgICB7ICJjdXN0b20iLCAgICAgIENMX0RFVklDRV9UWVBFX0NVU1RPTSAgICAgIH0sCisgICAgeyAiZGVmYXVsdCIsICAgICBDTF9ERVZJQ0VfVFlQRV9ERUZBVUxUICAgICB9LAorICAgIHsgImFsbCIsICAgICAgICAgQ0xfREVWSUNFX1RZUEVfQUxMICAgICAgICAgfSwKK307CisKK3N0YXRpYyBjaGFyICpvcGVuY2xfZ2V0X3BsYXRmb3JtX3N0cmluZyhjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9wbGF0Zm9ybV9pbmZvIGtleSkKK3sKKyAgICBjaGFyICpzdHI7CisgICAgc2l6ZV90IHNpemU7CisgICAgY2xfaW50IGNsZTsKKyAgICBjbGUgPSBjbEdldFBsYXRmb3JtSW5mbyhwbGF0Zm9ybV9pZCwga2V5LCAwLCBOVUxMLCAmc2l6ZSk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBzdHIgPSBhdl9tYWxsb2Moc2l6ZSk7CisgICAgaWYgKCFzdHIpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIGNsZSA9IGNsR2V0UGxhdGZvcm1JbmZvKHBsYXRmb3JtX2lkLCBrZXksIHNpemUsIHN0ciwgJnNpemUpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9mcmVlKHN0cik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhdl9hc3NlcnQwKHN0cmxlbihzdHIpICsgMSA9PSBzaXplKTsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgY2hhciAqb3BlbmNsX2dldF9kZXZpY2Vfc3RyaW5nKGNsX2RldmljZV9pZCBkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2RldmljZV9pbmZvIGtleSkKK3sKKyAgICBjaGFyICpzdHI7CisgICAgc2l6ZV90IHNpemU7CisgICAgY2xfaW50IGNsZTsKKyAgICBjbGUgPSBjbEdldERldmljZUluZm8oZGV2aWNlX2lkLCBrZXksIDAsIE5VTEwsICZzaXplKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHN0ciA9IGF2X21hbGxvYyhzaXplKTsKKyAgICBpZiAoIXN0cikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2xlID0gY2xHZXREZXZpY2VJbmZvKGRldmljZV9pZCwga2V5LCBzaXplLCBzdHIsICZzaXplKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfZnJlZShzdHIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgYXZfYXNzZXJ0MChzdHJsZW4oc3RyKSArIDE9PSBzaXplKTsKKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgaW50IG9wZW5jbF9jaGVja19wbGF0Zm9ybV9leHRlbnNpb24oY2xfcGxhdGZvcm1faWQgcGxhdGZvcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBjaGFyICpzdHI7CisgICAgaW50IGZvdW5kID0gMDsKKyAgICBzdHIgPSBvcGVuY2xfZ2V0X3BsYXRmb3JtX3N0cmluZyhwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9QTEFURk9STV9FWFRFTlNJT05TKTsKKyAgICBpZiAoc3RyICYmIHN0cnN0cihzdHIsIG5hbWUpKQorICAgICAgICBmb3VuZCA9IDE7CisgICAgYXZfZnJlZShzdHIpOworICAgIHJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGludCBvcGVuY2xfY2hlY2tfZGV2aWNlX2V4dGVuc2lvbihjbF9kZXZpY2VfaWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNoYXIgKnN0cjsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIHN0ciA9IG9wZW5jbF9nZXRfZGV2aWNlX3N0cmluZyhkZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX0RFVklDRV9FWFRFTlNJT05TKTsKKyAgICBpZiAoc3RyICYmIHN0cnN0cihzdHIsIG5hbWUpKQorICAgICAgICBmb3VuZCA9IDE7CisgICAgYXZfZnJlZShzdHIpOworICAgIHJldHVybiBmb3VuZDsKK30KKworc3RhdGljIGF2X3VudXNlZCBpbnQgb3BlbmNsX2NoZWNrX2V4dGVuc2lvbihBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgQVZPcGVuQ0xEZXZpY2VDb250ZXh0ICpod2N0eCA9IGh3ZGV2LT5od2N0eDsKKyAgICBPcGVuQ0xEZXZpY2VDb250ZXh0ICAgICpwcml2ID0gaHdkZXYtPmludGVybmFsLT5wcml2OworCisgICAgaWYgKG9wZW5jbF9jaGVja19wbGF0Zm9ybV9leHRlbnNpb24ocHJpdi0+cGxhdGZvcm1faWQsIG5hbWUpKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0RFQlVHLAorICAgICAgICAgICAgICAgIiVzIGZvdW5kIGFzIHBsYXRmb3JtIGV4dGVuc2lvbi5cbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAob3BlbmNsX2NoZWNrX2RldmljZV9leHRlbnNpb24oaHdjdHgtPmRldmljZV9pZCwgbmFtZSkpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfREVCVUcsCisgICAgICAgICAgICAgICAiJXMgZm91bmQgYXMgZGV2aWNlIGV4dGVuc2lvbi5cbiIsIG5hbWUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGVuY2xfZW51bWVyYXRlX3BsYXRmb3JtcyhBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgKm5iX3BsYXRmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfcGxhdGZvcm1faWQgKipwbGF0Zm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisgICAgY2xfaW50IGNsZTsKKworICAgIGNsZSA9IGNsR2V0UGxhdGZvcm1JRHMoMCwgTlVMTCwgbmJfcGxhdGZvcm1zKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IG51bWJlciBvZiAiCisgICAgICAgICAgICAgICAiT3BlbkNMIHBsYXRmb3JtczogJWQuXG4iLCBjbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9ERVYpOworICAgIH0KKyAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19ERUJVRywgIiV1IE9wZW5DTCBwbGF0Zm9ybXMgZm91bmQuXG4iLAorICAgICAgICAgICAqbmJfcGxhdGZvcm1zKTsKKworICAgICpwbGF0Zm9ybXMgPSBhdl9tYWxsb2NfYXJyYXkoKm5iX3BsYXRmb3Jtcywgc2l6ZW9mKCoqcGxhdGZvcm1zKSk7CisgICAgaWYgKCEqcGxhdGZvcm1zKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY2xlID0gY2xHZXRQbGF0Zm9ybUlEcygqbmJfcGxhdGZvcm1zLCAqcGxhdGZvcm1zLCBOVUxMKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IGxpc3Qgb2YgT3BlbkNMICIKKyAgICAgICAgICAgICAgICJwbGF0Zm9ybXM6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgYXZfZnJlZXAocGxhdGZvcm1zKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PREVWKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGVuY2xfZmlsdGVyX3BsYXRmb3JtKEFWSFdEZXZpY2VDb250ZXh0ICpod2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF0Zm9ybV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisgICAgQVZEaWN0aW9uYXJ5ICpvcHRzID0gY29udGV4dDsKKyAgICBjb25zdCBBVkRpY3Rpb25hcnlFbnRyeSAqcGFyYW07CisgICAgY2hhciAqc3RyOworICAgIGludCBpLCByZXQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKG9wZW5jbF9wbGF0Zm9ybV9wYXJhbXMpOyBpKyspIHsKKyAgICAgICAgcGFyYW0gPSBhdl9kaWN0X2dldChvcHRzLCBvcGVuY2xfcGxhdGZvcm1fcGFyYW1zW2ldLmtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwKTsKKyAgICAgICAgaWYgKCFwYXJhbSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHN0ciA9IG9wZW5jbF9nZXRfcGxhdGZvcm1fc3RyaW5nKHBsYXRmb3JtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuY2xfcGxhdGZvcm1fcGFyYW1zW2ldLm5hbWUpOworICAgICAgICBpZiAoIXN0cikgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgJXMgIgorICAgICAgICAgICAgICAgICAgICJvZiBwbGF0Zm9ybSBcIiVzXCIuXG4iLAorICAgICAgICAgICAgICAgICAgIG9wZW5jbF9wbGF0Zm9ybV9wYXJhbXNbaV0ua2V5LCBwbGF0Zm9ybV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhdl9zdHJpc3RyKHN0ciwgcGFyYW0tPnZhbHVlKSkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfREVCVUcsICIlcyBkb2VzIG5vdCBtYXRjaCAoXCIlc1wiKS5cbiIsCisgICAgICAgICAgICAgICAgICAgcGFyYW0tPmtleSwgc3RyKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShzdHIpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX2VudW1lcmF0ZV9kZXZpY2VzKEFWSFdEZXZpY2VDb250ZXh0ICpod2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3BsYXRmb3JtX2lkIHBsYXRmb3JtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3VpbnQgKm5iX2RldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgKipkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCkKK3sKKyAgICBjbF9pbnQgY2xlOworCisgICAgY2xlID0gY2xHZXREZXZpY2VJRHMocGxhdGZvcm1faWQsIENMX0RFVklDRV9UWVBFX0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBuYl9kZXZpY2VzKTsKKyAgICBpZiAoY2xlID09IENMX0RFVklDRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfREVCVUcsICJObyBkZXZpY2VzIGZvdW5kICIKKyAgICAgICAgICAgICAgICJvbiBwbGF0Zm9ybSBcIiVzXCIuXG4iLCBwbGF0Zm9ybV9uYW1lKTsKKyAgICAgICAgKm5iX2RldmljZXMgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBudW1iZXIgb2YgZGV2aWNlcyAiCisgICAgICAgICAgICAgICAib24gcGxhdGZvcm0gXCIlc1wiOiAlZC5cbiIsIHBsYXRmb3JtX25hbWUsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT0RFVik7CisgICAgfQorICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0RFQlVHLCAiJXUgT3BlbkNMIGRldmljZXMgZm91bmQgb24gIgorICAgICAgICAgICAicGxhdGZvcm0gXCIlc1wiLlxuIiwgKm5iX2RldmljZXMsIHBsYXRmb3JtX25hbWUpOworCisgICAgKmRldmljZXMgPSBhdl9tYWxsb2NfYXJyYXkoKm5iX2RldmljZXMsIHNpemVvZigqKmRldmljZXMpKTsKKyAgICBpZiAoISpkZXZpY2VzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY2xlID0gY2xHZXREZXZpY2VJRHMocGxhdGZvcm1faWQsIENMX0RFVklDRV9UWVBFX0FMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqbmJfZGV2aWNlcywgKmRldmljZXMsIE5VTEwpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgbGlzdCBvZiBkZXZpY2VzICIKKyAgICAgICAgICAgICAgICJvbiBwbGF0Zm9ybSBcIiVzXCI6ICVkLlxuIiwgcGxhdGZvcm1fbmFtZSwgY2xlKTsKKyAgICAgICAgYXZfZnJlZXAoZGV2aWNlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT0RFVik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX2ZpbHRlcl9kZXZpY2UoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCkKK3sKKyAgICBBVkRpY3Rpb25hcnkgKm9wdHMgPSBjb250ZXh0OworICAgIGNvbnN0IEFWRGljdGlvbmFyeUVudHJ5ICpwYXJhbTsKKyAgICBjaGFyICpzdHI7CisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBwYXJhbSA9IGF2X2RpY3RfZ2V0KG9wdHMsICJkZXZpY2VfdHlwZSIsIE5VTEwsIDApOworICAgIGlmIChwYXJhbSkgeworICAgICAgICBjbF9kZXZpY2VfdHlwZSBtYXRjaF90eXBlID0gMCwgZGV2aWNlX3R5cGU7CisgICAgICAgIGNsX2ludCBjbGU7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKG9wZW5jbF9kZXZpY2VfdHlwZXMpOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghc3RyY21wKG9wZW5jbF9kZXZpY2VfdHlwZXNbaV0ua2V5LCBwYXJhbS0+dmFsdWUpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hfdHlwZSA9IG9wZW5jbF9kZXZpY2VfdHlwZXNbaV0udHlwZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW1hdGNoX3R5cGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiVW5rbm93biBkZXZpY2UgdHlwZSAlcy5cbiIsCisgICAgICAgICAgICAgICAgICAgcGFyYW0tPnZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIH0KKworICAgICAgICBjbGUgPSBjbEdldERldmljZUluZm8oZGV2aWNlX2lkLCBDTF9ERVZJQ0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZXZpY2VfdHlwZSksICZkZXZpY2VfdHlwZSwgTlVMTCk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgZGV2aWNlIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICJvZiBkZXZpY2UgXCIlc1wiLlxuIiwgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGRldmljZV90eXBlICYgbWF0Y2hfdHlwZSkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0RFQlVHLCAiZGV2aWNlX3R5cGUgZG9lcyBub3QgbWF0Y2guXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKG9wZW5jbF9kZXZpY2VfcGFyYW1zKTsgaSsrKSB7CisgICAgICAgIHBhcmFtID0gYXZfZGljdF9nZXQob3B0cywgb3BlbmNsX2RldmljZV9wYXJhbXNbaV0ua2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDApOworICAgICAgICBpZiAoIXBhcmFtKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgc3RyID0gb3BlbmNsX2dldF9kZXZpY2Vfc3RyaW5nKGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5jbF9kZXZpY2VfcGFyYW1zW2ldLm5hbWUpOworICAgICAgICBpZiAoIXN0cikgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgJXMgIgorICAgICAgICAgICAgICAgICAgICJvZiBkZXZpY2UgXCIlc1wiLlxuIiwKKyAgICAgICAgICAgICAgICAgICBvcGVuY2xfZGV2aWNlX3BhcmFtc1tpXS5rZXksIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhdl9zdHJpc3RyKHN0ciwgcGFyYW0tPnZhbHVlKSkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfREVCVUcsICIlcyBkb2VzIG5vdCBtYXRjaCAoXCIlc1wiKS5cbiIsCisgICAgICAgICAgICAgICAgICAgcGFyYW0tPmtleSwgc3RyKTsKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShzdHIpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3R5cGVkZWYgc3RydWN0IE9wZW5DTERldmljZVNlbGVjdG9yIHsKKyAgICBpbnQgcGxhdGZvcm1faW5kZXg7CisgICAgaW50IGRldmljZV9pbmRleDsKKyAgICB2b2lkICpjb250ZXh0OworICAgIGludCAoKmVudW1lcmF0ZV9wbGF0Zm9ybXMpKEFWSFdEZXZpY2VDb250ZXh0ICpod2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICpuYl9wbGF0Zm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfcGxhdGZvcm1faWQgKipwbGF0Zm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCk7CisgICAgaW50ICgqZmlsdGVyX3BsYXRmb3JtKSAgICAoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3BsYXRmb3JtX2lkIHBsYXRmb3JtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBsYXRmb3JtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCk7CisgICAgaW50ICgqZW51bWVyYXRlX2RldmljZXMpICAoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3BsYXRmb3JtX2lkIHBsYXRmb3JtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBsYXRmb3JtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAqbmJfZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgKipkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpOworICAgIGludCAoKmZpbHRlcl9kZXZpY2UpICAgICAgKEFWSFdEZXZpY2VDb250ZXh0ICpod2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpOworfSBPcGVuQ0xEZXZpY2VTZWxlY3RvcjsKKworc3RhdGljIGludCBvcGVuY2xfZGV2aWNlX2NyZWF0ZV9pbnRlcm5hbChBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wZW5DTERldmljZVNlbGVjdG9yICpzZWxlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfY29udGV4dF9wcm9wZXJ0aWVzICpwcm9wcykKK3sKKyAgICBjbF91aW50ICAgICAgbmJfcGxhdGZvcm1zOworICAgIGNsX3BsYXRmb3JtX2lkICpwbGF0Zm9ybXMgPSBOVUxMOworICAgIGNsX3BsYXRmb3JtX2lkICBwbGF0Zm9ybV9pZDsKKyAgICBjbF91aW50ICAgICAgbmJfZGV2aWNlczsKKyAgICBjbF9kZXZpY2VfaWQgICAqZGV2aWNlcyA9IE5VTEw7CisgICAgQVZPcGVuQ0xEZXZpY2VDb250ZXh0ICpod2N0eCA9IGh3ZGV2LT5od2N0eDsKKyAgICBjbF9pbnQgY2xlOworICAgIGNsX2NvbnRleHRfcHJvcGVydGllcyBkZWZhdWx0X3Byb3BzWzNdOworICAgIGNoYXIgKnBsYXRmb3JtX25hbWVfc3JjID0gTlVMTCwKKyAgICAgICAgICpkZXZpY2VfbmFtZV9zcmMgICA9IE5VTEw7CisgICAgaW50IGVyciwgZm91bmQsIHAsIGQ7CisKKyAgICBlcnIgPSBzZWxlY3Rvci0+ZW51bWVyYXRlX3BsYXRmb3Jtcyhod2RldiwgJm5iX3BsYXRmb3JtcywgJnBsYXRmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rvci0+Y29udGV4dCk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGZvdW5kID0gMDsKKyAgICBmb3IgKHAgPSAwOyBwIDwgbmJfcGxhdGZvcm1zOyBwKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqcGxhdGZvcm1fbmFtZTsKKworICAgICAgICBpZiAoc2VsZWN0b3ItPnBsYXRmb3JtX2luZGV4ID49IDAgJiYKKyAgICAgICAgICAgIHNlbGVjdG9yLT5wbGF0Zm9ybV9pbmRleCAhPSBwKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYXZfZnJlZXAoJnBsYXRmb3JtX25hbWVfc3JjKTsKKyAgICAgICAgcGxhdGZvcm1fbmFtZV9zcmMgPSBvcGVuY2xfZ2V0X3BsYXRmb3JtX3N0cmluZyhwbGF0Zm9ybXNbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX1BMQVRGT1JNX05BTUUpOworICAgICAgICBpZiAocGxhdGZvcm1fbmFtZV9zcmMpCisgICAgICAgICAgICBwbGF0Zm9ybV9uYW1lID0gcGxhdGZvcm1fbmFtZV9zcmM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBsYXRmb3JtX25hbWUgPSAiVW5rbm93biBQbGF0Zm9ybSI7CisKKyAgICAgICAgaWYgKHNlbGVjdG9yLT5maWx0ZXJfcGxhdGZvcm0pIHsKKyAgICAgICAgICAgIGVyciA9IHNlbGVjdG9yLT5maWx0ZXJfcGxhdGZvcm0oaHdkZXYsIHBsYXRmb3Jtc1twXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3ItPmNvbnRleHQpOworICAgICAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgaWYgKGVyciA+IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBvcGVuY2xfZW51bWVyYXRlX2RldmljZXMoaHdkZXYsIHBsYXRmb3Jtc1twXSwgcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYl9kZXZpY2VzLCAmZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLT5jb250ZXh0KTsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBmb3IgKGQgPSAwOyBkIDwgbmJfZGV2aWNlczsgZCsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZTsKKworICAgICAgICAgICAgaWYgKHNlbGVjdG9yLT5kZXZpY2VfaW5kZXggPj0gMCAmJgorICAgICAgICAgICAgICAgIHNlbGVjdG9yLT5kZXZpY2VfaW5kZXggIT0gZCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgYXZfZnJlZXAoJmRldmljZV9uYW1lX3NyYyk7CisgICAgICAgICAgICBkZXZpY2VfbmFtZV9zcmMgPSBvcGVuY2xfZ2V0X2RldmljZV9zdHJpbmcoZGV2aWNlc1tkXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfREVWSUNFX05BTUUpOworICAgICAgICAgICAgaWYgKGRldmljZV9uYW1lX3NyYykKKyAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSA9IGRldmljZV9uYW1lX3NyYzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSA9ICJVbmtub3duIERldmljZSI7CisKKyAgICAgICAgICAgIGlmIChzZWxlY3Rvci0+ZmlsdGVyX2RldmljZSkgeworICAgICAgICAgICAgICAgIGVyciA9IHNlbGVjdG9yLT5maWx0ZXJfZGV2aWNlKGh3ZGV2LCBkZXZpY2VzW2RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yLT5jb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgICAgIGlmIChlcnIgPiAwKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfVkVSQk9TRSwgIiVkLiVkOiAlcyAvICVzXG4iLCBwLCBkLAorICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX25hbWUsIGRldmljZV9uYW1lKTsKKworICAgICAgICAgICAgKytmb3VuZDsKKyAgICAgICAgICAgIHBsYXRmb3JtX2lkICAgICAgPSBwbGF0Zm9ybXNbcF07CisgICAgICAgICAgICBod2N0eC0+ZGV2aWNlX2lkID0gZGV2aWNlc1tkXTsKKyAgICAgICAgfQorCisgICAgICAgIGF2X2ZyZWVwKCZkZXZpY2VzKTsKKyAgICB9CisKKyAgICBpZiAoZm91bmQgPT0gMCkgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIk5vIG1hdGNoaW5nIGRldmljZXMgZm91bmQuXG4iKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9ERVYpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGlmIChmb3VuZCA+IDEpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJNb3JlIHRoYW4gb25lIG1hdGNoaW5nIGRldmljZSBmb3VuZC5cbiIpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT0RFVik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBpZiAoIXByb3BzKSB7CisgICAgICAgIHByb3BzID0gZGVmYXVsdF9wcm9wczsKKyAgICAgICAgZGVmYXVsdF9wcm9wc1swXSA9IENMX0NPTlRFWFRfUExBVEZPUk07CisgICAgICAgIGRlZmF1bHRfcHJvcHNbMV0gPSAoaW50cHRyX3QpcGxhdGZvcm1faWQ7CisgICAgICAgIGRlZmF1bHRfcHJvcHNbMl0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwcm9wc1swXSA9PSBDTF9DT05URVhUX1BMQVRGT1JNICYmIHByb3BzWzFdID09IDApCisgICAgICAgICAgICBwcm9wc1sxXSA9IChpbnRwdHJfdClwbGF0Zm9ybV9pZDsKKyAgICB9CisKKyAgICBod2N0eC0+Y29udGV4dCA9IGNsQ3JlYXRlQ29udGV4dChwcm9wcywgMSwgJmh3Y3R4LT5kZXZpY2VfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5jbF9lcnJvcl9jYWxsYmFjaywgaHdkZXYsICZjbGUpOworICAgIGlmICghaHdjdHgtPmNvbnRleHQpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIE9wZW5DTCBjb250ZXh0OiAiCisgICAgICAgICAgICAgICAiJWQuXG4iLCBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT0RFVik7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBod2Rldi0+ZnJlZSA9ICZvcGVuY2xfZGV2aWNlX2ZyZWU7CisKKyAgICBlcnIgPSAwOworZmFpbDoKKyAgICBhdl9mcmVlcCgmcGxhdGZvcm1fbmFtZV9zcmMpOworICAgIGF2X2ZyZWVwKCZkZXZpY2VfbmFtZV9zcmMpOworICAgIGF2X2ZyZWVwKCZwbGF0Zm9ybXMpOworICAgIGF2X2ZyZWVwKCZkZXZpY2VzKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9wZW5jbF9kZXZpY2VfY3JlYXRlKEFWSFdEZXZpY2VDb250ZXh0ICpod2RldiwgY29uc3QgY2hhciAqZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMsIGludCBmbGFncykKK3sKKyAgICBPcGVuQ0xEZXZpY2VTZWxlY3RvciBzZWxlY3RvciA9IHsKKyAgICAgICAgLmNvbnRleHQgPSBvcHRzLAorICAgICAgICAuZW51bWVyYXRlX3BsYXRmb3JtcyA9ICZvcGVuY2xfZW51bWVyYXRlX3BsYXRmb3JtcywKKyAgICAgICAgLmZpbHRlcl9wbGF0Zm9ybSAgICAgPSAmb3BlbmNsX2ZpbHRlcl9wbGF0Zm9ybSwKKyAgICAgICAgLmVudW1lcmF0ZV9kZXZpY2VzICAgPSAmb3BlbmNsX2VudW1lcmF0ZV9kZXZpY2VzLAorICAgICAgICAuZmlsdGVyX2RldmljZSAgICAgICA9ICZvcGVuY2xfZmlsdGVyX2RldmljZSwKKyAgICB9OworCisgICAgaWYgKGRldmljZSAmJiBkZXZpY2VbMF0pIHsKKyAgICAgICAgLy8gTWF0Y2ggb25lIG9yIGJvdGggaW5kaWNlcyBmb3IgcGxhdGZvcm0gYW5kIGRldmljZS4KKyAgICAgICAgaW50IGQgPSAtMSwgcCA9IC0xLCByZXQ7CisgICAgICAgIGlmIChkZXZpY2VbMF0gPT0gJy4nKQorICAgICAgICAgICAgcmV0ID0gc3NjYW5mKGRldmljZSwgIi4lZCIsICZkKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0ID0gc3NjYW5mKGRldmljZSwgIiVkLiVkIiwgJnAsICZkKTsKKyAgICAgICAgaWYgKHJldCA8IDEpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiSW52YWxpZCBPcGVuQ0wgcGxhdGZvcm0vZGV2aWNlICIKKyAgICAgICAgICAgICAgICAgICAiaW5kZXggc3BlY2lmaWNhdGlvbiBcIiVzXCIuXG4iLCBkZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgICAgICBzZWxlY3Rvci5wbGF0Zm9ybV9pbmRleCA9IHA7CisgICAgICAgIHNlbGVjdG9yLmRldmljZV9pbmRleCAgID0gZDsKKyAgICB9IGVsc2UgeworICAgICAgICBzZWxlY3Rvci5wbGF0Zm9ybV9pbmRleCA9IC0xOworICAgICAgICBzZWxlY3Rvci5kZXZpY2VfaW5kZXggICA9IC0xOworICAgIH0KKworICAgIHJldHVybiBvcGVuY2xfZGV2aWNlX2NyZWF0ZV9pbnRlcm5hbChod2RldiwgJnNlbGVjdG9yLCBOVUxMKTsKK30KKworc3RhdGljIGludCBvcGVuY2xfZGV2aWNlX2luaXQoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2KQoreworICAgIEFWT3BlbkNMRGV2aWNlQ29udGV4dCAqaHdjdHggPSBod2Rldi0+aHdjdHg7CisgICAgT3BlbkNMRGV2aWNlQ29udGV4dCAgICAqcHJpdiA9IGh3ZGV2LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBjbF9pbnQgY2xlOworCisgICAgaWYgKGh3Y3R4LT5jb21tYW5kX3F1ZXVlKSB7CisgICAgICAgIGNsZSA9IGNsUmV0YWluQ29tbWFuZFF1ZXVlKGh3Y3R4LT5jb21tYW5kX3F1ZXVlKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZXRhaW4gZXh0ZXJuYWwgIgorICAgICAgICAgICAgICAgICAgICJjb21tYW5kIHF1ZXVlOiAlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgICAgICB9CisgICAgICAgIHByaXYtPmNvbW1hbmRfcXVldWUgPSBod2N0eC0+Y29tbWFuZF9xdWV1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwcml2LT5jb21tYW5kX3F1ZXVlID0gY2xDcmVhdGVDb21tYW5kUXVldWUoaHdjdHgtPmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2N0eC0+ZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmNsZSk7CisgICAgICAgIGlmICghcHJpdi0+Y29tbWFuZF9xdWV1ZSkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGludGVybmFsICIKKyAgICAgICAgICAgICAgICAgICAiY29tbWFuZCBxdWV1ZTogJWQuXG4iLCBjbGUpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsZSA9IGNsR2V0RGV2aWNlSW5mbyhod2N0eC0+ZGV2aWNlX2lkLCBDTF9ERVZJQ0VfUExBVEZPUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwcml2LT5wbGF0Zm9ybV9pZCksICZwcml2LT5wbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRldGVybWluZSB0aGUgT3BlbkNMICIKKyAgICAgICAgICAgICAgICJwbGF0Zm9ybSBjb250YWluaW5nIHRoZSBkZXZpY2UuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyNkZWZpbmUgQ0xfRlVOQyhuYW1lLCBkZXNjKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmYWlsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJpdi0+bmFtZSA9IGNsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzRm9yUGxhdGZvcm0oICBcCisgICAgICAgICAgICBwcml2LT5wbGF0Zm9ybV9pZCwgI25hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIXByaXYtPm5hbWUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1ZFUkJPU0UsICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgZGVzYyAiIGZ1bmN0aW9uIG5vdCBmb3VuZCAoJXMpLlxuIiwgI25hbWUpOyAgXAorICAgICAgICAgICAgZmFpbCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19WRVJCT1NFLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGRlc2MgIiBmdW5jdGlvbiBmb3VuZCAoJXMpLlxuIiwgI25hbWUpOyAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2lmIEhBVkVfT1BFTkNMX0RSTV9CRUlHTkVUCisgICAgeworICAgICAgICBpbnQgZmFpbCA9IDA7CisKKyAgICAgICAgQ0xfRlVOQyhjbENyZWF0ZUltYWdlRnJvbUZkSU5URUwsCisgICAgICAgICAgICAgICAgIkJlaWduZXQgRFJNIHRvIE9wZW5DTCBpbWFnZSBtYXBwaW5nIik7CisKKyAgICAgICAgaWYgKGZhaWwpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1dBUk5JTkcsICJCZWlnbmV0IERSTSB0byBPcGVuQ0wgIgorICAgICAgICAgICAgICAgICAgICJtYXBwaW5nIG5vdCB1c2FibGUuXG4iKTsKKyAgICAgICAgICAgIHByaXYtPmJlaWduZXRfZHJtX21hcHBpbmdfdXNhYmxlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaXYtPmJlaWduZXRfZHJtX21hcHBpbmdfdXNhYmxlID0gMTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgSEFWRV9PUEVOQ0xfVkFBUElfSU5URUxfTUVESUEKKyAgICB7CisgICAgICAgIHNpemVfdCBwcm9wc19zaXplOworICAgICAgICBjbF9jb250ZXh0X3Byb3BlcnRpZXMgKnByb3BzID0gTlVMTDsKKyAgICAgICAgVkFEaXNwbGF5IHZhX2Rpc3BsYXk7CisgICAgICAgIGNvbnN0IGNoYXIgKnZhX2V4dCA9ICJjbF9pbnRlbF92YV9hcGlfbWVkaWFfc2hhcmluZyI7CisgICAgICAgIGludCBpLCBmYWlsID0gMDsKKworICAgICAgICBpZiAoIW9wZW5jbF9jaGVja19leHRlbnNpb24oaHdkZXYsIHZhX2V4dCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1ZFUkJPU0UsICJUaGUgJXMgZXh0ZW5zaW9uIGlzICIKKyAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgZm9yIFFTViB0byBPcGVuQ0wgbWFwcGluZy5cbiIsIHZhX2V4dCk7CisgICAgICAgICAgICBnb3RvIG5vX3FzdjsKKyAgICAgICAgfQorCisgICAgICAgIGNsZSA9IGNsR2V0Q29udGV4dEluZm8oaHdjdHgtPmNvbnRleHQsIENMX0NPTlRFWFRfUFJPUEVSVElFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAmcHJvcHNfc2l6ZSk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfVkVSQk9TRSwgIkZhaWxlZCB0byBnZXQgY29udGV4dCAiCisgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXM6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgICAgIGdvdG8gbm9fcXN2OworICAgICAgICB9CisgICAgICAgIGlmIChwcm9wc19zaXplID09IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1ZFUkJPU0UsICJNZWRpYSBzaGFyaW5nIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICJlbmFibGVkIG9uIGNvbnRleHQgY3JlYXRpb24gdG8gdXNlIFFTViB0byAiCisgICAgICAgICAgICAgICAgICAgIk9wZW5DTCBtYXBwaW5nLlxuIik7CisgICAgICAgICAgICBnb3RvIG5vX3FzdjsKKyAgICAgICAgfQorCisgICAgICAgIHByb3BzID0gYXZfbWFsbG9jKHByb3BzX3NpemUpOworICAgICAgICBpZiAoIXByb3BzKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgICAgICBjbGUgPSBjbEdldENvbnRleHRJbmZvKGh3Y3R4LT5jb250ZXh0LCBDTF9DT05URVhUX1BST1BFUlRJRVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNfc2l6ZSwgcHJvcHMsIE5VTEwpOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1ZFUkJPU0UsICJGYWlsZWQgdG8gZ2V0IGNvbnRleHQgIgorICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzOiAlZC5cbiIsIGNsZSk7CisgICAgICAgICAgICBnb3RvIG5vX3FzdjsKKyAgICAgICAgfQorCisgICAgICAgIHZhX2Rpc3BsYXkgPSBOVUxMOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKHByb3BzX3NpemUgLyBzaXplb2YoKnByb3BzKSAtIDEpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwcm9wc1tpXSA9PSBDTF9DT05URVhUX1ZBX0FQSV9ESVNQTEFZX0lOVEVMKSB7CisgICAgICAgICAgICAgICAgdmFfZGlzcGxheSA9IChWQURpc3BsYXkpKGludHB0cl90KXByb3BzW2krMV07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF2YV9kaXNwbGF5KSB7CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19WRVJCT1NFLCAiTWVkaWEgc2hhcmluZyBtdXN0IGJlICIKKyAgICAgICAgICAgICAgICAgICAiZW5hYmxlZCBvbiBjb250ZXh0IGNyZWF0aW9uIHRvIHVzZSBRU1YgdG8gIgorICAgICAgICAgICAgICAgICAgICJPcGVuQ0wgbWFwcGluZy5cbiIpOworICAgICAgICAgICAgZ290byBub19xc3Y7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF2YURpc3BsYXlJc1ZhbGlkKHZhX2Rpc3BsYXkpKSB7CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19WRVJCT1NFLCAiQSB2YWxpZCBWQURpc3BsYXkgaXMgIgorICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBvbiBjb250ZXh0IGNyZWF0aW9uIHRvIHVzZSBRU1YgdG8gIgorICAgICAgICAgICAgICAgICAgICJPcGVuQ0wgbWFwcGluZy5cbiIpOworICAgICAgICAgICAgZ290byBub19xc3Y7CisgICAgICAgIH0KKworICAgICAgICBDTF9GVU5DKGNsQ3JlYXRlRnJvbVZBX0FQSU1lZGlhU3VyZmFjZUlOVEVMLAorICAgICAgICAgICAgICAgICJJbnRlbCBRU1YgdG8gT3BlbkNMIG1hcHBpbmciKTsKKyAgICAgICAgQ0xfRlVOQyhjbEVucXVldWVBY3F1aXJlVkFfQVBJTWVkaWFTdXJmYWNlc0lOVEVMLAorICAgICAgICAgICAgICAgICJJbnRlbCBRU1YgaW4gT3BlbkNMIGFjcXVpcmUiKTsKKyAgICAgICAgQ0xfRlVOQyhjbEVucXVldWVSZWxlYXNlVkFfQVBJTWVkaWFTdXJmYWNlc0lOVEVMLAorICAgICAgICAgICAgICAgICJJbnRlbCBRU1YgaW4gT3BlbkNMIHJlbGVhc2UiKTsKKworICAgICAgICBpZiAoZmFpbCkgeworICAgICAgICBub19xc3Y6CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19XQVJOSU5HLCAiUVNWIHRvIE9wZW5DTCBtYXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAibm90IHVzYWJsZS5cbiIpOworICAgICAgICAgICAgcHJpdi0+cXN2X21hcHBpbmdfdXNhYmxlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaXYtPnFzdl9tYXBwaW5nX3VzYWJsZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShwcm9wcyk7CisgICAgfQorI2VuZGlmCisKKyNpZiBIQVZFX09QRU5DTF9EWFZBMgorICAgIHsKKyAgICAgICAgaW50IGZhaWwgPSAwOworCisgICAgICAgIENMX0ZVTkMoY2xDcmVhdGVGcm9tRFg5TWVkaWFTdXJmYWNlS0hSLAorICAgICAgICAgICAgICAgICJEWFZBMiB0byBPcGVuQ0wgbWFwcGluZyIpOworICAgICAgICBDTF9GVU5DKGNsRW5xdWV1ZUFjcXVpcmVEWDlNZWRpYVN1cmZhY2VzS0hSLAorICAgICAgICAgICAgICAgICJEWFZBMiBpbiBPcGVuQ0wgYWNxdWlyZSIpOworICAgICAgICBDTF9GVU5DKGNsRW5xdWV1ZVJlbGVhc2VEWDlNZWRpYVN1cmZhY2VzS0hSLAorICAgICAgICAgICAgICAgICJEWFZBMiBpbiBPcGVuQ0wgcmVsZWFzZSIpOworCisgICAgICAgIGlmIChmYWlsKSB7CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19XQVJOSU5HLCAiRFhWQTIgdG8gT3BlbkNMIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICJub3QgdXNhYmxlLlxuIik7CisgICAgICAgICAgICBwcml2LT5keHZhMl9tYXBwaW5nX3VzYWJsZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcml2LT5keDlfbWVkaWFfYWRhcHRlcl90eXBlID0gQ0xfQURBUFRFUl9EM0Q5RVhfS0hSOworICAgICAgICAgICAgcHJpdi0+ZHh2YTJfbWFwcGluZ191c2FibGUgPSAxOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyNpZiBIQVZFX09QRU5DTF9EM0QxMQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqZDNkMTFfZXh0ID0gImNsX2tocl9kM2QxMV9zaGFyaW5nIjsKKyAgICAgICAgY29uc3QgY2hhciAqbnYxMl9leHQgID0gImNsX2ludGVsX2QzZDExX252MTJfbWVkaWFfc2hhcmluZyI7CisgICAgICAgIGludCBmYWlsID0gMDsKKworICAgICAgICBpZiAoIW9wZW5jbF9jaGVja19leHRlbnNpb24oaHdkZXYsIGQzZDExX2V4dCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1ZFUkJPU0UsICJUaGUgJXMgZXh0ZW5zaW9uIGlzICIKKyAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgZm9yIEQzRDExIHRvIE9wZW5DTCBtYXBwaW5nLlxuIiwgZDNkMTFfZXh0KTsKKyAgICAgICAgICAgIGZhaWwgPSAxOworICAgICAgICB9IGVsc2UgaWYgKCFvcGVuY2xfY2hlY2tfZXh0ZW5zaW9uKGh3ZGV2LCBudjEyX2V4dCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1ZFUkJPU0UsICJUaGUgJXMgZXh0ZW5zaW9uIG1heSBiZSAiCisgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIGZvciBEM0QxMSB0byBPcGVuQ0wgbWFwcGluZy5cbiIsIG52MTJfZXh0KTsKKyAgICAgICAgICAgIC8vIE5vdCBmYXRhbC4KKyAgICAgICAgfQorCisgICAgICAgIENMX0ZVTkMoY2xDcmVhdGVGcm9tRDNEMTFUZXh0dXJlMkRLSFIsCisgICAgICAgICAgICAgICAgIkQzRDExIHRvIE9wZW5DTCBtYXBwaW5nIik7CisgICAgICAgIENMX0ZVTkMoY2xFbnF1ZXVlQWNxdWlyZUQzRDExT2JqZWN0c0tIUiwKKyAgICAgICAgICAgICAgICAiRDNEMTEgaW4gT3BlbkNMIGFjcXVpcmUiKTsKKyAgICAgICAgQ0xfRlVOQyhjbEVucXVldWVSZWxlYXNlRDNEMTFPYmplY3RzS0hSLAorICAgICAgICAgICAgICAgICJEM0QxMSBpbiBPcGVuQ0wgcmVsZWFzZSIpOworCisgICAgICAgIGlmIChmYWlsKSB7CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19XQVJOSU5HLCAiRDNEMTEgdG8gT3BlbkNMIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICJub3QgdXNhYmxlLlxuIik7CisgICAgICAgICAgICBwcml2LT5kM2QxMV9tYXBwaW5nX3VzYWJsZSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcml2LT5kM2QxMV9tYXBwaW5nX3VzYWJsZSA9IDE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIEhBVkVfT1BFTkNMX0RSTV9BUk0KKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKmRybV9hcm1fZXh0ID0gImNsX2FybV9pbXBvcnRfbWVtb3J5IjsKKyAgICAgICAgY29uc3QgY2hhciAqaW1hZ2VfZXh0ICAgPSAiY2xfa2hyX2ltYWdlMmRfZnJvbV9idWZmZXIiOworICAgICAgICBpbnQgZmFpbCA9IDA7CisKKyAgICAgICAgaWYgKCFvcGVuY2xfY2hlY2tfZXh0ZW5zaW9uKGh3ZGV2LCBkcm1fYXJtX2V4dCkpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1ZFUkJPU0UsICJUaGUgJXMgZXh0ZW5zaW9uIGlzICIKKyAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQgZm9yIERSTSB0byBPcGVuQ0wgbWFwcGluZyBvbiBBUk0uXG4iLAorICAgICAgICAgICAgICAgICAgIGRybV9hcm1fZXh0KTsKKyAgICAgICAgICAgIGZhaWwgPSAxOworICAgICAgICB9CisgICAgICAgIGlmICghb3BlbmNsX2NoZWNrX2V4dGVuc2lvbihod2RldiwgaW1hZ2VfZXh0KSkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfVkVSQk9TRSwgIlRoZSAlcyBleHRlbnNpb24gaXMgIgorICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBmb3IgRFJNIHRvIE9wZW5DTCBtYXBwaW5nIG9uIEFSTS5cbiIsCisgICAgICAgICAgICAgICAgICAgaW1hZ2VfZXh0KTsKKyAgICAgICAgICAgIGZhaWwgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xJbXBvcnRNZW1vcnlBUk0oKSBpcyBsaW5rZWQgc3RhdGljYWxseS4KKworICAgICAgICBpZiAoZmFpbCkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfV0FSTklORywgIkRSTSB0byBPcGVuQ0wgbWFwcGluZyBvbiBBUk0gIgorICAgICAgICAgICAgICAgICAgICJub3QgdXNhYmxlLlxuIik7CisgICAgICAgICAgICBwcml2LT5kcm1fYXJtX21hcHBpbmdfdXNhYmxlID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaXYtPmRybV9hcm1fbWFwcGluZ191c2FibGUgPSAxOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyN1bmRlZiBDTF9GVU5DCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3BlbmNsX2RldmljZV91bmluaXQoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2KQoreworICAgIE9wZW5DTERldmljZUNvbnRleHQgKnByaXYgPSBod2Rldi0+aW50ZXJuYWwtPnByaXY7CisgICAgY2xfaW50IGNsZTsKKworICAgIGlmIChwcml2LT5jb21tYW5kX3F1ZXVlKSB7CisgICAgICAgIGNsZSA9IGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShwcml2LT5jb21tYW5kX3F1ZXVlKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlIGludGVybmFsICIKKyAgICAgICAgICAgICAgICAgICAiY29tbWFuZCBxdWV1ZSByZWZlcmVuY2U6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgfQorICAgICAgICBwcml2LT5jb21tYW5kX3F1ZXVlID0gTlVMTDsKKyAgICB9Cit9CisKKyNpZiBIQVZFX09QRU5DTF9WQUFQSV9JTlRFTF9NRURJQQorc3RhdGljIGludCBvcGVuY2xfZmlsdGVyX2ludGVsX21lZGlhX3ZhYXBpX3BsYXRmb3JtKEFWSFdEZXZpY2VDb250ZXh0ICpod2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF0Zm9ybV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisgICAgLy8gVGhpcyBkb2Vzbid0IGV4aXN0IGFzIGEgcGxhdGZvcm0gZXh0ZW5zaW9uLCBzbyBqdXN0IHRlc3Qgd2hldGhlcgorICAgIC8vIHRoZSBmdW5jdGlvbiB3ZSB3aWxsIHVzZSBmb3IgZGV2aWNlIGVudW1lcmF0aW9uIGV4aXN0cy4KKworICAgIGlmICghY2xHZXRFeHRlbnNpb25GdW5jdGlvbkFkZHJlc3NGb3JQbGF0Zm9ybShwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICJjbEdldERldmljZUlEc0Zyb21WQV9BUElNZWRpYUFkYXB0ZXJJTlRFTCIpKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0RFQlVHLCAiUGxhdGZvcm0gJXMgZG9lcyBub3QgZXhwb3J0IHRoZSAiCisgICAgICAgICAgICAgICAiVkFBUEkgZGV2aWNlIGVudW1lcmF0aW9uIGZ1bmN0aW9uLlxuIiwgcGxhdGZvcm1fbmFtZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworc3RhdGljIGludCBvcGVuY2xfZW51bWVyYXRlX2ludGVsX21lZGlhX3ZhYXBpX2RldmljZXMoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwbGF0Zm9ybV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfdWludCAqbmJfZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2RldmljZV9pZCAqKmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0KQoreworICAgIFZBRGlzcGxheSB2YV9kaXNwbGF5ID0gY29udGV4dDsKKyAgICBjbEdldERldmljZUlEc0Zyb21WQV9BUElNZWRpYUFkYXB0ZXJJTlRFTF9mbgorICAgICAgICBjbEdldERldmljZUlEc0Zyb21WQV9BUElNZWRpYUFkYXB0ZXJJTlRFTDsKKyAgICBjbF9pbnQgY2xlOworICAgIGludCBlcnI7CisKKyAgICBjbEdldERldmljZUlEc0Zyb21WQV9BUElNZWRpYUFkYXB0ZXJJTlRFTCA9CisgICAgICAgIGNsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzRm9yUGxhdGZvcm0ocGxhdGZvcm1faWQsCisgICAgICAgICAgICAiY2xHZXREZXZpY2VJRHNGcm9tVkFfQVBJTWVkaWFBZGFwdGVySU5URUwiKTsKKyAgICBpZiAoIWNsR2V0RGV2aWNlSURzRnJvbVZBX0FQSU1lZGlhQWRhcHRlcklOVEVMKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBhZGRyZXNzIG9mICIKKyAgICAgICAgICAgICAgICJjbEdldERldmljZUlEc0Zyb21WQV9BUElNZWRpYUFkYXB0ZXJJTlRFTCgpLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgY2xlID0gY2xHZXREZXZpY2VJRHNGcm9tVkFfQVBJTWVkaWFBZGFwdGVySU5URUwoCisgICAgICAgIHBsYXRmb3JtX2lkLCBDTF9WQV9BUElfRElTUExBWV9JTlRFTCwgdmFfZGlzcGxheSwKKyAgICAgICAgQ0xfUFJFRkVSUkVEX0RFVklDRVNfRk9SX1ZBX0FQSV9JTlRFTCwgMCwgTlVMTCwgbmJfZGV2aWNlcyk7CisgICAgaWYgKGNsZSA9PSBDTF9ERVZJQ0VfTk9UX0ZPVU5EKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0RFQlVHLCAiTm8gVkFBUEktc3VwcG9ydGluZyBkZXZpY2VzIGZvdW5kICIKKyAgICAgICAgICAgICAgICJvbiBwbGF0Zm9ybSBcIiVzXCIuXG4iLCBwbGF0Zm9ybV9uYW1lKTsKKyAgICAgICAgKm5iX2RldmljZXMgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBudW1iZXIgb2YgZGV2aWNlcyAiCisgICAgICAgICAgICAgICAib24gcGxhdGZvcm0gXCIlc1wiOiAlZC5cbiIsIHBsYXRmb3JtX25hbWUsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgKmRldmljZXMgPSBhdl9tYWxsb2NfYXJyYXkoKm5iX2RldmljZXMsIHNpemVvZigqKmRldmljZXMpKTsKKyAgICBpZiAoISpkZXZpY2VzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY2xlID0gY2xHZXREZXZpY2VJRHNGcm9tVkFfQVBJTWVkaWFBZGFwdGVySU5URUwoCisgICAgICAgIHBsYXRmb3JtX2lkLCBDTF9WQV9BUElfRElTUExBWV9JTlRFTCwgdmFfZGlzcGxheSwKKyAgICAgICAgQ0xfUFJFRkVSUkVEX0RFVklDRVNfRk9SX1ZBX0FQSV9JTlRFTCwgKm5iX2RldmljZXMsICpkZXZpY2VzLCBOVUxMKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IGxpc3Qgb2YgVkFBUEktc3VwcG9ydGluZyAiCisgICAgICAgICAgICAgICAiZGV2aWNlcyBvbiBwbGF0Zm9ybSBcIiVzXCI6ICVkLlxuIiwgcGxhdGZvcm1fbmFtZSwgY2xlKTsKKyAgICAgICAgYXZfZnJlZXAoZGV2aWNlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX2ZpbHRlcl9pbnRlbF9tZWRpYV92YWFwaV9kZXZpY2UoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCkKK3sKKyAgICBjb25zdCBjaGFyICp2YV9leHQgPSAiY2xfaW50ZWxfdmFfYXBpX21lZGlhX3NoYXJpbmciOworCisgICAgaWYgKG9wZW5jbF9jaGVja19kZXZpY2VfZXh0ZW5zaW9uKGRldmljZV9pZCwgdmFfZXh0KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19ERUJVRywgIkRldmljZSAlcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiCisgICAgICAgICAgICAgICAiJXMgZXh0ZW5zaW9uLlxuIiwgZGV2aWNlX25hbWUsIHZhX2V4dCk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKyNlbmRpZgorCisjaWYgSEFWRV9PUEVOQ0xfRFhWQTIKK3N0YXRpYyBpbnQgb3BlbmNsX2ZpbHRlcl9keHZhMl9wbGF0Zm9ybShBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcGxhdGZvcm1fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0KQoreworICAgIGNvbnN0IGNoYXIgKmR4OV9leHQgPSAiY2xfa2hyX2R4OV9tZWRpYV9zaGFyaW5nIjsKKworICAgIGlmIChvcGVuY2xfY2hlY2tfcGxhdGZvcm1fZXh0ZW5zaW9uKHBsYXRmb3JtX2lkLCBkeDlfZXh0KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19ERUJVRywgIlBsYXRmb3JtICVzIGRvZXMgbm90IHN1cHBvcnQgdGhlICIKKyAgICAgICAgICAgICAgICIlcyBleHRlbnNpb24uXG4iLCBwbGF0Zm9ybV9uYW1lLCBkeDlfZXh0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9wZW5jbF9lbnVtZXJhdGVfZHh2YTJfZGV2aWNlcyhBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBsYXRmb3JtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICpuYl9kZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGV2aWNlX2lkICoqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisgICAgSURpcmVjdDNERGV2aWNlOSAqZGV2aWNlID0gY29udGV4dDsKKyAgICBjbEdldERldmljZUlEc0Zyb21EWDlNZWRpYUFkYXB0ZXJLSFJfZm4KKyAgICAgICAgY2xHZXREZXZpY2VJRHNGcm9tRFg5TWVkaWFBZGFwdGVyS0hSOworICAgIGNsX2R4OV9tZWRpYV9hZGFwdGVyX3R5cGVfa2hyIG1lZGlhX2FkYXB0ZXJfdHlwZSA9IENMX0FEQVBURVJfRDNEOUVYX0tIUjsKKyAgICBjbF9pbnQgY2xlOworCisgICAgY2xHZXREZXZpY2VJRHNGcm9tRFg5TWVkaWFBZGFwdGVyS0hSID0KKyAgICAgICAgY2xHZXRFeHRlbnNpb25GdW5jdGlvbkFkZHJlc3NGb3JQbGF0Zm9ybShwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICJjbEdldERldmljZUlEc0Zyb21EWDlNZWRpYUFkYXB0ZXJLSFIiKTsKKyAgICBpZiAoIWNsR2V0RGV2aWNlSURzRnJvbURYOU1lZGlhQWRhcHRlcktIUikgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgYWRkcmVzcyBvZiAiCisgICAgICAgICAgICAgICAiY2xHZXREZXZpY2VJRHNGcm9tRFg5TWVkaWFBZGFwdGVyS0hSKCkuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBjbGUgPSBjbEdldERldmljZUlEc0Zyb21EWDlNZWRpYUFkYXB0ZXJLSFIoCisgICAgICAgIHBsYXRmb3JtX2lkLCAxLCAmbWVkaWFfYWRhcHRlcl90eXBlLCAodm9pZCoqKSZkZXZpY2UsCisgICAgICAgIENMX1BSRUZFUlJFRF9ERVZJQ0VTX0ZPUl9EWDlfTUVESUFfQURBUFRFUl9LSFIsCisgICAgICAgIDAsIE5VTEwsIG5iX2RldmljZXMpOworICAgIGlmIChjbGUgPT0gQ0xfREVWSUNFX05PVF9GT1VORCkgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19ERUJVRywgIk5vIERYVkEyLXN1cHBvcnRpbmcgZGV2aWNlcyBmb3VuZCAiCisgICAgICAgICAgICAgICAib24gcGxhdGZvcm0gXCIlc1wiLlxuIiwgcGxhdGZvcm1fbmFtZSk7CisgICAgICAgICpuYl9kZXZpY2VzID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBnZXQgbnVtYmVyIG9mIGRldmljZXMgIgorICAgICAgICAgICAgICAgIm9uIHBsYXRmb3JtIFwiJXNcIjogJWQuXG4iLCBwbGF0Zm9ybV9uYW1lLCBjbGUpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgICpkZXZpY2VzID0gYXZfbWFsbG9jX2FycmF5KCpuYl9kZXZpY2VzLCBzaXplb2YoKipkZXZpY2VzKSk7CisgICAgaWYgKCEqZGV2aWNlcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGNsZSA9IGNsR2V0RGV2aWNlSURzRnJvbURYOU1lZGlhQWRhcHRlcktIUigKKyAgICAgICAgcGxhdGZvcm1faWQsIDEsICZtZWRpYV9hZGFwdGVyX3R5cGUsICh2b2lkKiopJmRldmljZSwKKyAgICAgICAgQ0xfUFJFRkVSUkVEX0RFVklDRVNfRk9SX0RYOV9NRURJQV9BREFQVEVSX0tIUiwKKyAgICAgICAgKm5iX2RldmljZXMsICpkZXZpY2VzLCBOVUxMKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IGxpc3Qgb2YgRFhWQTItc3VwcG9ydGluZyAiCisgICAgICAgICAgICAgICAiZGV2aWNlcyBvbiBwbGF0Zm9ybSBcIiVzXCI6ICVkLlxuIiwgcGxhdGZvcm1fbmFtZSwgY2xlKTsKKyAgICAgICAgYXZfZnJlZXAoZGV2aWNlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIEhBVkVfT1BFTkNMX0QzRDExCitzdGF0aWMgaW50IG9wZW5jbF9maWx0ZXJfZDNkMTFfcGxhdGZvcm0oQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX3BsYXRmb3JtX2lkIHBsYXRmb3JtX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBsYXRmb3JtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCkKK3sKKyAgICBjb25zdCBjaGFyICpkM2QxMV9leHQgPSAiY2xfa2hyX2QzZDExX3NoYXJpbmciOworCisgICAgaWYgKG9wZW5jbF9jaGVja19wbGF0Zm9ybV9leHRlbnNpb24ocGxhdGZvcm1faWQsIGQzZDExX2V4dCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfREVCVUcsICJQbGF0Zm9ybSAlcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiCisgICAgICAgICAgICAgICAiJXMgZXh0ZW5zaW9uLlxuIiwgcGxhdGZvcm1fbmFtZSwgZDNkMTFfZXh0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9wZW5jbF9lbnVtZXJhdGVfZDNkMTFfZGV2aWNlcyhBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBsYXRmb3JtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF91aW50ICpuYl9kZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGV2aWNlX2lkICoqZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpCit7CisgICAgSUQzRDExRGV2aWNlICpkZXZpY2UgPSBjb250ZXh0OworICAgIGNsR2V0RGV2aWNlSURzRnJvbUQzRDExS0hSX2ZuIGNsR2V0RGV2aWNlSURzRnJvbUQzRDExS0hSOworICAgIGNsX2ludCBjbGU7CisKKyAgICBjbEdldERldmljZUlEc0Zyb21EM0QxMUtIUiA9CisgICAgICAgIGNsR2V0RXh0ZW5zaW9uRnVuY3Rpb25BZGRyZXNzRm9yUGxhdGZvcm0ocGxhdGZvcm1faWQsCisgICAgICAgICAgICAiY2xHZXREZXZpY2VJRHNGcm9tRDNEMTFLSFIiKTsKKyAgICBpZiAoIWNsR2V0RGV2aWNlSURzRnJvbUQzRDExS0hSKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBhZGRyZXNzIG9mICIKKyAgICAgICAgICAgICAgICJjbEdldERldmljZUlEc0Zyb21EM0QxMUtIUigpLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgY2xlID0gY2xHZXREZXZpY2VJRHNGcm9tRDNEMTFLSFIocGxhdGZvcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfRDNEMTFfREVWSUNFX0tIUiwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX1BSRUZFUlJFRF9ERVZJQ0VTX0ZPUl9EM0QxMV9LSFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgbmJfZGV2aWNlcyk7CisgICAgaWYgKGNsZSA9PSBDTF9ERVZJQ0VfTk9UX0ZPVU5EKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0RFQlVHLCAiTm8gRDNEMTEtc3VwcG9ydGluZyBkZXZpY2VzIGZvdW5kICIKKyAgICAgICAgICAgICAgICJvbiBwbGF0Zm9ybSBcIiVzXCIuXG4iLCBwbGF0Zm9ybV9uYW1lKTsKKyAgICAgICAgKm5iX2RldmljZXMgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBudW1iZXIgb2YgZGV2aWNlcyAiCisgICAgICAgICAgICAgICAib24gcGxhdGZvcm0gXCIlc1wiOiAlZC5cbiIsIHBsYXRmb3JtX25hbWUsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgKmRldmljZXMgPSBhdl9tYWxsb2NfYXJyYXkoKm5iX2RldmljZXMsIHNpemVvZigqKmRldmljZXMpKTsKKyAgICBpZiAoISpkZXZpY2VzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY2xlID0gY2xHZXREZXZpY2VJRHNGcm9tRDNEMTFLSFIocGxhdGZvcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfRDNEMTFfREVWSUNFX0tIUiwgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX1BSRUZFUlJFRF9ERVZJQ0VTX0ZPUl9EM0QxMV9LSFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5iX2RldmljZXMsICpkZXZpY2VzLCBOVUxMKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZ2V0IGxpc3Qgb2YgRDNEMTEtc3VwcG9ydGluZyAiCisgICAgICAgICAgICAgICAiZGV2aWNlcyBvbiBwbGF0Zm9ybSBcIiVzXCI6ICVkLlxuIiwgcGxhdGZvcm1fbmFtZSwgY2xlKTsKKyAgICAgICAgYXZfZnJlZXAoZGV2aWNlcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIEhBVkVfT1BFTkNMX0RYVkEyIHx8IEhBVkVfT1BFTkNMX0QzRDExCitzdGF0aWMgaW50IG9wZW5jbF9maWx0ZXJfZ3B1X2RldmljZShBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9kZXZpY2VfaWQgZGV2aWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0KQoreworICAgIGNsX2RldmljZV90eXBlIGRldmljZV90eXBlOworICAgIGNsX2ludCBjbGU7CisKKyAgICBjbGUgPSBjbEdldERldmljZUluZm8oZGV2aWNlX2lkLCBDTF9ERVZJQ0VfVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRldmljZV90eXBlKSwgJmRldmljZV90eXBlLCBOVUxMKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgZGV2aWNlIHR5cGUgIgorICAgICAgICAgICAgICAgIm9mIGRldmljZSBcIiVzXCIuXG4iLCBkZXZpY2VfbmFtZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorICAgIGlmICghKGRldmljZV90eXBlICYgQ0xfREVWSUNFX1RZUEVfR1BVKSkgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19ERUJVRywgIkRldmljZSAlcyBza2lwcGVkIChub3QgR1BVKS5cbiIsCisgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKKyNpZiBIQVZFX09QRU5DTF9EUk1fQVJNCitzdGF0aWMgaW50IG9wZW5jbF9maWx0ZXJfZHJtX2FybV9wbGF0Zm9ybShBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnBsYXRmb3JtX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0KQoreworICAgIGNvbnN0IGNoYXIgKmRybV9hcm1fZXh0ID0gImNsX2FybV9pbXBvcnRfbWVtb3J5IjsKKworICAgIGlmIChvcGVuY2xfY2hlY2tfcGxhdGZvcm1fZXh0ZW5zaW9uKHBsYXRmb3JtX2lkLCBkcm1fYXJtX2V4dCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfREVCVUcsICJQbGF0Zm9ybSAlcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiCisgICAgICAgICAgICAgICAiJXMgZXh0ZW5zaW9uLlxuIiwgcGxhdGZvcm1fbmFtZSwgZHJtX2FybV9leHQpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX2ZpbHRlcl9kcm1fYXJtX2RldmljZShBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfZGV2aWNlX2lkIGRldmljZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0KQoreworICAgIGNvbnN0IGNoYXIgKmRybV9hcm1fZXh0ID0gImNsX2FybV9pbXBvcnRfbWVtb3J5IjsKKworICAgIGlmIChvcGVuY2xfY2hlY2tfZGV2aWNlX2V4dGVuc2lvbihkZXZpY2VfaWQsIGRybV9hcm1fZXh0KSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19ERUJVRywgIkRldmljZSAlcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiCisgICAgICAgICAgICAgICAiJXMgZXh0ZW5zaW9uLlxuIiwgZGV2aWNlX25hbWUsIGRybV9hcm1fZXh0KTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgb3BlbmNsX2RldmljZV9kZXJpdmUoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRGV2aWNlQ29udGV4dCAqc3JjX2N0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGludCBlcnI7CisgICAgc3dpdGNoIChzcmNfY3R4LT50eXBlKSB7CisKKyNpZiBIQVZFX09QRU5DTF9EUk1fQkVJR05FVAorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9EUk06CisgICAgY2FzZSBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJOgorICAgICAgICB7CisgICAgICAgICAgICAvLyBTdXJmYWNlIG1hcHBpbmcgd29ya3MgdmlhIERSTSBQUklNRSBmZHMgd2l0aCBubyBzcGVjaWFsCisgICAgICAgICAgICAvLyBpbml0aWFsaXNhdGlvbiByZXF1aXJlZCBpbiBhZHZhbmNlLiAgVGhpcyBqdXN0IGZpbmRzIHRoZQorICAgICAgICAgICAgLy8gQmVpZ25ldCBJQ0QgYnkgbmFtZS4KKyAgICAgICAgICAgIEFWRGljdGlvbmFyeSAqb3B0cyA9IE5VTEw7CisKKyAgICAgICAgICAgIGVyciA9IGF2X2RpY3Rfc2V0KCZvcHRzLCAicGxhdGZvcm1fdmVuZG9yIiwgIkludGVsIiwgMCk7CisgICAgICAgICAgICBpZiAoZXJyID49IDApCisgICAgICAgICAgICAgICAgZXJyID0gYXZfZGljdF9zZXQoJm9wdHMsICJwbGF0Zm9ybV92ZXJzaW9uIiwgImJlaWduZXQiLCAwKTsKKyAgICAgICAgICAgIGlmIChlcnIgPj0gMCkgeworICAgICAgICAgICAgICAgIE9wZW5DTERldmljZVNlbGVjdG9yIHNlbGVjdG9yID0geworICAgICAgICAgICAgICAgICAgICAucGxhdGZvcm1faW5kZXggICAgICA9IC0xLAorICAgICAgICAgICAgICAgICAgICAuZGV2aWNlX2luZGV4ICAgICAgICA9IDAsCisgICAgICAgICAgICAgICAgICAgIC5jb250ZXh0ICAgICAgICAgICAgID0gb3B0cywKKyAgICAgICAgICAgICAgICAgICAgLmVudW1lcmF0ZV9wbGF0Zm9ybXMgPSAmb3BlbmNsX2VudW1lcmF0ZV9wbGF0Zm9ybXMsCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXJfcGxhdGZvcm0gICAgID0gJm9wZW5jbF9maWx0ZXJfcGxhdGZvcm0sCisgICAgICAgICAgICAgICAgICAgIC5lbnVtZXJhdGVfZGV2aWNlcyAgID0gJm9wZW5jbF9lbnVtZXJhdGVfZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcl9kZXZpY2UgICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgZXJyID0gb3BlbmNsX2RldmljZV9jcmVhdGVfaW50ZXJuYWwoaHdkZXYsICZzZWxlY3RvciwgTlVMTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9kaWN0X2ZyZWUoJm9wdHMpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZiBIQVZFX09QRU5DTF9WQUFQSV9JTlRFTF9NRURJQQorICAgICAgICAvLyBUaGUgZ2VuZXJpYyBjb2RlIGF1dG9tYXRpY2FsbHkgYXR0ZW1wdHMgdG8gZGVyaXZlIGZyb20gYWxsCisgICAgICAgIC8vIGFuY2VzdG9ycyBvZiB0aGUgZ2l2ZW4gZGV2aWNlLCBzbyB3ZSBjYW4gaWdub3JlIFFTViBkZXZpY2VzIGhlcmUKKyAgICAgICAgLy8gYW5kIGp1c3QgY29uc2lkZXIgdGhlIGlubmVyIFZBQVBJIGRldmljZSBpdCB3YXMgZGVyaXZlZCBmcm9tLgorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9WQUFQSToKKyAgICAgICAgeworICAgICAgICAgICAgQVZWQUFQSURldmljZUNvbnRleHQgKnNyY19od2N0eCA9IHNyY19jdHgtPmh3Y3R4OworICAgICAgICAgICAgY2xfY29udGV4dF9wcm9wZXJ0aWVzIHByb3BzWzddID0geworICAgICAgICAgICAgICAgIENMX0NPTlRFWFRfUExBVEZPUk0sCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBDTF9DT05URVhUX1ZBX0FQSV9ESVNQTEFZX0lOVEVMLAorICAgICAgICAgICAgICAgIChpbnRwdHJfdClzcmNfaHdjdHgtPmRpc3BsYXksCisgICAgICAgICAgICAgICAgQ0xfQ09OVEVYVF9JTlRFUk9QX1VTRVJfU1lOQywKKyAgICAgICAgICAgICAgICBDTF9GQUxTRSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIE9wZW5DTERldmljZVNlbGVjdG9yIHNlbGVjdG9yID0geworICAgICAgICAgICAgICAgIC5wbGF0Zm9ybV9pbmRleCAgICAgID0gLTEsCisgICAgICAgICAgICAgICAgLmRldmljZV9pbmRleCAgICAgICAgPSAtMSwKKyAgICAgICAgICAgICAgICAuY29udGV4dCAgICAgICAgICAgICA9IHNyY19od2N0eC0+ZGlzcGxheSwKKyAgICAgICAgICAgICAgICAuZW51bWVyYXRlX3BsYXRmb3JtcyA9ICZvcGVuY2xfZW51bWVyYXRlX3BsYXRmb3JtcywKKyAgICAgICAgICAgICAgICAuZmlsdGVyX3BsYXRmb3JtICAgICA9ICZvcGVuY2xfZmlsdGVyX2ludGVsX21lZGlhX3ZhYXBpX3BsYXRmb3JtLAorICAgICAgICAgICAgICAgIC5lbnVtZXJhdGVfZGV2aWNlcyAgID0gJm9wZW5jbF9lbnVtZXJhdGVfaW50ZWxfbWVkaWFfdmFhcGlfZGV2aWNlcywKKyAgICAgICAgICAgICAgICAuZmlsdGVyX2RldmljZSAgICAgICA9ICZvcGVuY2xfZmlsdGVyX2ludGVsX21lZGlhX3ZhYXBpX2RldmljZSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGVyciA9IG9wZW5jbF9kZXZpY2VfY3JlYXRlX2ludGVybmFsKGh3ZGV2LCAmc2VsZWN0b3IsIHByb3BzKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWYgSEFWRV9PUEVOQ0xfRFhWQTIKKyAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfRFhWQTI6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFWRFhWQTJEZXZpY2VDb250ZXh0ICpzcmNfaHdjdHggPSBzcmNfY3R4LT5od2N0eDsKKyAgICAgICAgICAgIElEaXJlY3QzRERldmljZTkgKmRldmljZTsKKyAgICAgICAgICAgIEhBTkRMRSBkZXZpY2VfaGFuZGxlOworICAgICAgICAgICAgSFJFU1VMVCBocjsKKworICAgICAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOV9PcGVuRGV2aWNlSGFuZGxlKHNyY19od2N0eC0+ZGV2bWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VfaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBkZXZpY2UgaGFuZGxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZvciBEaXJlY3QzRDkgZGV2aWNlOiAlbHguXG4iLCAodW5zaWduZWQgbG9uZylocik7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBociA9IElEaXJlY3QzRERldmljZU1hbmFnZXI5X0xvY2tEZXZpY2Uoc3JjX2h3Y3R4LT5kZXZtZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLCBGQUxTRSk7CisgICAgICAgICAgICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgICAgICAgICAgICAgIGNsX2NvbnRleHRfcHJvcGVydGllcyBwcm9wc1s1XSA9IHsKKyAgICAgICAgICAgICAgICAgICAgQ0xfQ09OVEVYVF9QTEFURk9STSwKKyAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgQ0xfQ09OVEVYVF9BREFQVEVSX0QzRDlFWF9LSFIsCisgICAgICAgICAgICAgICAgICAgIChpbnRwdHJfdClkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBPcGVuQ0xEZXZpY2VTZWxlY3RvciBzZWxlY3RvciA9IHsKKyAgICAgICAgICAgICAgICAgICAgLnBsYXRmb3JtX2luZGV4ICAgICAgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgLmRldmljZV9pbmRleCAgICAgICAgPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRleHQgICAgICAgICAgICAgPSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIC5lbnVtZXJhdGVfcGxhdGZvcm1zID0gJm9wZW5jbF9lbnVtZXJhdGVfcGxhdGZvcm1zLAorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyX3BsYXRmb3JtICAgICA9ICZvcGVuY2xfZmlsdGVyX2R4dmEyX3BsYXRmb3JtLAorICAgICAgICAgICAgICAgICAgICAuZW51bWVyYXRlX2RldmljZXMgICA9ICZvcGVuY2xfZW51bWVyYXRlX2R4dmEyX2RldmljZXMsCisgICAgICAgICAgICAgICAgICAgIC5maWx0ZXJfZGV2aWNlICAgICAgID0gJm9wZW5jbF9maWx0ZXJfZ3B1X2RldmljZSwKKyAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgZXJyID0gb3BlbmNsX2RldmljZV9jcmVhdGVfaW50ZXJuYWwoaHdkZXYsICZzZWxlY3RvciwgcHJvcHMpOworCisgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfVW5sb2NrRGV2aWNlKHNyY19od2N0eC0+ZGV2bWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlLCBGQUxTRSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGxvY2sgZGV2aWNlIGhhbmRsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJmb3IgRGlyZWN0M0Q5IGRldmljZTogJWx4LlxuIiwgKHVuc2lnbmVkIGxvbmcpaHIpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlTWFuYWdlcjlfQ2xvc2VEZXZpY2VIYW5kbGUoc3JjX2h3Y3R4LT5kZXZtZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorCisjaWYgSEFWRV9PUEVOQ0xfRDNEMTEKKyAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfRDNEMTFWQToKKyAgICAgICAgeworICAgICAgICAgICAgQVZEM0QxMVZBRGV2aWNlQ29udGV4dCAqc3JjX2h3Y3R4ID0gc3JjX2N0eC0+aHdjdHg7CisgICAgICAgICAgICBjbF9jb250ZXh0X3Byb3BlcnRpZXMgcHJvcHNbNV0gPSB7CisgICAgICAgICAgICAgICAgQ0xfQ09OVEVYVF9QTEFURk9STSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIENMX0NPTlRFWFRfRDNEMTFfREVWSUNFX0tIUiwKKyAgICAgICAgICAgICAgICAoaW50cHRyX3Qpc3JjX2h3Y3R4LT5kZXZpY2UsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBPcGVuQ0xEZXZpY2VTZWxlY3RvciBzZWxlY3RvciA9IHsKKyAgICAgICAgICAgICAgICAucGxhdGZvcm1faW5kZXggICAgICA9IC0xLAorICAgICAgICAgICAgICAgIC5kZXZpY2VfaW5kZXggICAgICAgID0gLTEsCisgICAgICAgICAgICAgICAgLmNvbnRleHQgICAgICAgICAgICAgPSBzcmNfaHdjdHgtPmRldmljZSwKKyAgICAgICAgICAgICAgICAuZW51bWVyYXRlX3BsYXRmb3JtcyA9ICZvcGVuY2xfZW51bWVyYXRlX3BsYXRmb3JtcywKKyAgICAgICAgICAgICAgICAuZmlsdGVyX3BsYXRmb3JtICAgICA9ICZvcGVuY2xfZmlsdGVyX2QzZDExX3BsYXRmb3JtLAorICAgICAgICAgICAgICAgIC5lbnVtZXJhdGVfZGV2aWNlcyAgID0gJm9wZW5jbF9lbnVtZXJhdGVfZDNkMTFfZGV2aWNlcywKKyAgICAgICAgICAgICAgICAuZmlsdGVyX2RldmljZSAgICAgICA9ICZvcGVuY2xfZmlsdGVyX2dwdV9kZXZpY2UsCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBlcnIgPSBvcGVuY2xfZGV2aWNlX2NyZWF0ZV9pbnRlcm5hbChod2RldiwgJnNlbGVjdG9yLCBwcm9wcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKworI2lmIEhBVkVfT1BFTkNMX0RSTV9BUk0KKyAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfRFJNOgorICAgICAgICB7CisgICAgICAgICAgICBPcGVuQ0xEZXZpY2VTZWxlY3RvciBzZWxlY3RvciA9IHsKKyAgICAgICAgICAgICAgICAucGxhdGZvcm1faW5kZXggICAgICA9IC0xLAorICAgICAgICAgICAgICAgIC5kZXZpY2VfaW5kZXggICAgICAgID0gLTEsCisgICAgICAgICAgICAgICAgLmNvbnRleHQgICAgICAgICAgICAgPSBOVUxMLAorICAgICAgICAgICAgICAgIC5lbnVtZXJhdGVfcGxhdGZvcm1zID0gJm9wZW5jbF9lbnVtZXJhdGVfcGxhdGZvcm1zLAorICAgICAgICAgICAgICAgIC5maWx0ZXJfcGxhdGZvcm0gICAgID0gJm9wZW5jbF9maWx0ZXJfZHJtX2FybV9wbGF0Zm9ybSwKKyAgICAgICAgICAgICAgICAuZW51bWVyYXRlX2RldmljZXMgICA9ICZvcGVuY2xfZW51bWVyYXRlX2RldmljZXMsCisgICAgICAgICAgICAgICAgLmZpbHRlcl9kZXZpY2UgICAgICAgPSAmb3BlbmNsX2ZpbHRlcl9kcm1fYXJtX2RldmljZSwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGVyciA9IG9wZW5jbF9kZXZpY2VfY3JlYXRlX2ludGVybmFsKGh3ZGV2LCAmc2VsZWN0b3IsIE5VTEwpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICBkZWZhdWx0OgorICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChlcnIgPCAwKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIG9wZW5jbF9kZXZpY2VfaW5pdChod2Rldik7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX2dldF9wbGFuZV9mb3JtYXQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeGZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2ltYWdlX2Zvcm1hdCAqaW1hZ2VfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9pbWFnZV9kZXNjICppbWFnZV9kZXNjKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYzsKKyAgICBjb25zdCBBVkNvbXBvbmVudERlc2NyaXB0b3IgKmNvbXA7CisgICAgaW50IGNoYW5uZWxzID0gMCwgb3JkZXIgPSAwLCBkZXB0aCA9IDAsIHN0ZXAgPSAwOworICAgIGludCB3c3ViLCBoc3ViLCBhbHBoYTsKKyAgICBpbnQgYzsKKworICAgIGlmIChwbGFuZSA+PSBBVl9OVU1fREFUQV9QT0lOVEVSUykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PRU5UKTsKKworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeGZtdCk7CisKKyAgICAvLyBPbmx5IG5vcm1hbCBpbWFnZXMgYXJlIGFsbG93ZWQuCisgICAgaWYgKGRlc2MtPmZsYWdzICYgKEFWX1BJWF9GTVRfRkxBR19CSVRTVFJFQU0gfAorICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9GTEFHX1BBTCkpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICB3c3ViID0gMSA8PCBkZXNjLT5sb2cyX2Nocm9tYV93OworICAgIGhzdWIgPSAxIDw8IGRlc2MtPmxvZzJfY2hyb21hX2g7CisgICAgLy8gU3Vic2FtcGxlZCBjb21wb25lbnRzIG11c3QgYmUgZXhhY3QuCisgICAgaWYgKHdpZHRoICYgd3N1YiAtIDEgfHwgaGVpZ2h0ICYgaHN1YiAtIDEpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgZGVzYy0+bmJfY29tcG9uZW50czsgYysrKSB7CisgICAgICAgIGNvbXAgPSAmZGVzYy0+Y29tcFtjXTsKKyAgICAgICAgaWYgKGNvbXAtPnBsYW5lICE9IHBsYW5lKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8vIFRoZSBzdGVwIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KKyAgICAgICAgaWYgKGNvbXAtPnN0ZXAgIT0gMSAmJiBjb21wLT5zdGVwICE9IDIgJiYKKyAgICAgICAgICAgIGNvbXAtPnN0ZXAgIT0gNCAmJiBjb21wLT5zdGVwICE9IDgpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAvLyBUaGUgYml0cyBpbiBlYWNoIGNvbXBvbmVudCBtdXN0IGJlIHBhY2tlZCBpbiB0aGUKKyAgICAgICAgLy8gbW9zdC1zaWduaWZpY2FudC1iaXRzIG9mIHRoZSByZWxldmFudCBieXRlcy4KKyAgICAgICAgaWYgKGNvbXAtPnNoaWZ0ICsgY29tcC0+ZGVwdGggIT0gOCAmJgorICAgICAgICAgICAgY29tcC0+c2hpZnQgKyBjb21wLT5kZXB0aCAhPSAxNikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIC8vIFRoZSBkZXB0aCBtdXN0IG5vdCB2YXJ5IGJldHdlZW4gY29tcG9uZW50cy4KKyAgICAgICAgaWYgKGRlcHRoICYmIGNvbXAtPmRlcHRoICE9IGRlcHRoKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgLy8gSWYgYSBzaW5nbGUgZGF0YSBlbGVtZW50IGNyb3NzZXMgbXVsdGlwbGUgYnl0ZXMgdGhlbgorICAgICAgICAvLyBpdCBtdXN0IG1hdGNoIHRoZSBuYXRpdmUgZW5kaWFubmVzcy4KKyAgICAgICAgaWYgKGNvbXAtPmRlcHRoID4gOCAmJgorICAgICAgICAgICAgSEFWRV9CSUdFTkRJQU4gPT0gIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CRSkpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAvLyBBIHNpbmdsZSBkYXRhIGVsZW1lbnQgbXVzdCBub3QgY29udGFpbiBtdWx0aXBsZSBzYW1wbGVzCisgICAgICAgIC8vIGZyb20gdGhlIHNhbWUgY29tcG9uZW50LgorICAgICAgICBpZiAoc3RlcCAmJiBjb21wLT5zdGVwICE9IHN0ZXApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBvcmRlciA9IG9yZGVyICogMTAgKyBjICsgMTsKKyAgICAgICAgZGVwdGggPSBjb21wLT5kZXB0aDsKKyAgICAgICAgc3RlcCAgPSBjb21wLT5zdGVwOworICAgICAgICBhbHBoYSA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSAmJgorICAgICAgICAgICAgICAgICBjID09IGRlc2MtPm5iX2NvbXBvbmVudHMgLSAxKTsKKyAgICAgICAgKytjaGFubmVsczsKKyAgICB9CisgICAgaWYgKGNoYW5uZWxzID09IDApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT0VOVCk7CisKKyAgICBtZW1zZXQoaW1hZ2VfZm9ybWF0LCAwLCBzaXplb2YoKmltYWdlX2Zvcm1hdCkpOworICAgIG1lbXNldChpbWFnZV9kZXNjLCAgIDAsIHNpemVvZigqaW1hZ2VfZGVzYykpOworICAgIGltYWdlX2Rlc2MtPmltYWdlX3R5cGUgPSBDTF9NRU1fT0JKRUNUX0lNQUdFMkQ7CisKKyAgICBpZiAocGxhbmUgPT0gMCB8fCBhbHBoYSkgeworICAgICAgICBpbWFnZV9kZXNjLT5pbWFnZV93aWR0aCAgICAgPSB3aWR0aDsKKyAgICAgICAgaW1hZ2VfZGVzYy0+aW1hZ2VfaGVpZ2h0ICAgID0gaGVpZ2h0OworICAgICAgICBpbWFnZV9kZXNjLT5pbWFnZV9yb3dfcGl0Y2ggPSBzdGVwICogd2lkdGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW1hZ2VfZGVzYy0+aW1hZ2Vfd2lkdGggICAgID0gd2lkdGggIC8gd3N1YjsKKyAgICAgICAgaW1hZ2VfZGVzYy0+aW1hZ2VfaGVpZ2h0ICAgID0gaGVpZ2h0IC8gaHN1YjsKKyAgICAgICAgaW1hZ2VfZGVzYy0+aW1hZ2Vfcm93X3BpdGNoID0gc3RlcCAqIHdpZHRoIC8gd3N1YjsKKyAgICB9CisKKyAgICBpZiAoZGVwdGggPD0gOCkgeworICAgICAgICBpbWFnZV9mb3JtYXQtPmltYWdlX2NoYW5uZWxfZGF0YV90eXBlID0gQ0xfVU5PUk1fSU5UODsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGVwdGggPD0gMTYpCisgICAgICAgICAgICBpbWFnZV9mb3JtYXQtPmltYWdlX2NoYW5uZWxfZGF0YV90eXBlID0gQ0xfVU5PUk1fSU5UMTY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisjZGVmaW5lIENIQU5ORUxfT1JERVIob3JkZXIsIHR5cGUpIFwKKyAgICBjYXNlIG9yZGVyOiBpbWFnZV9mb3JtYXQtPmltYWdlX2NoYW5uZWxfb3JkZXIgPSB0eXBlOyBicmVhazsKKyAgICBzd2l0Y2ggKG9yZGVyKSB7CisgICAgICAgIENIQU5ORUxfT1JERVIoMSwgICAgQ0xfUik7CisgICAgICAgIENIQU5ORUxfT1JERVIoMiwgICAgQ0xfUik7CisgICAgICAgIENIQU5ORUxfT1JERVIoMywgICAgQ0xfUik7CisgICAgICAgIENIQU5ORUxfT1JERVIoNCwgICAgQ0xfUik7CisgICAgICAgIENIQU5ORUxfT1JERVIoMTIsICAgQ0xfUkcpOworICAgICAgICBDSEFOTkVMX09SREVSKDIzLCAgIENMX1JHKTsKKyAgICAgICAgQ0hBTk5FTF9PUkRFUigxMjM0LCBDTF9SR0JBKTsKKyAgICAgICAgQ0hBTk5FTF9PUkRFUigzMjE0LCBDTF9CR1JBKTsKKyAgICAgICAgQ0hBTk5FTF9PUkRFUig0MTIzLCBDTF9BUkdCKTsKKyNpZmRlZiBDTF9BQkdSCisgICAgICAgIENIQU5ORUxfT1JERVIoNDMyMSwgQ0xfQUJHUik7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyN1bmRlZiBDSEFOTkVMX09SREVSCisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvcGVuY2xfZnJhbWVzX2dldF9jb25zdHJhaW50cyhBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmh3Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29uc3RyYWludHMgKmNvbnN0cmFpbnRzKQoreworICAgIEFWT3BlbkNMRGV2aWNlQ29udGV4dCAqaHdjdHggPSBod2Rldi0+aHdjdHg7CisgICAgY2xfdWludCBuYl9pbWFnZV9mb3JtYXRzOworICAgIGNsX2ltYWdlX2Zvcm1hdCAqaW1hZ2VfZm9ybWF0cyA9IE5VTEw7CisgICAgY2xfaW50IGNsZTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKyAgICBpbnQgZXJyLCBwaXhfZm10c19mb3VuZDsKKyAgICBzaXplX3QgbWF4X3dpZHRoLCBtYXhfaGVpZ2h0OworCisgICAgY2xlID0gY2xHZXREZXZpY2VJbmZvKGh3Y3R4LT5kZXZpY2VfaWQsIENMX0RFVklDRV9JTUFHRTJEX01BWF9XSURUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1heF93aWR0aCksICZtYXhfd2lkdGgsIE5VTEwpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBtYXhpbXVtICIKKyAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgaW1hZ2Ugd2lkdGg6ICVkLlxuIiwgY2xlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdHJhaW50cy0+bWF4X3dpZHRoID0gbWF4X3dpZHRoOworICAgIH0KKyAgICBjbGUgPSBjbEdldERldmljZUluZm8oaHdjdHgtPmRldmljZV9pZCwgQ0xfREVWSUNFX0lNQUdFMkRfTUFYX0hFSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1heF9oZWlnaHQpLCAmbWF4X2hlaWdodCwgTlVMTCk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IG1heGltdW0gIgorICAgICAgICAgICAgICAgInN1cHBvcnRlZCBpbWFnZSBoZWlnaHQ6ICVkLlxuIiwgY2xlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdHJhaW50cy0+bWF4X2hlaWdodCA9IG1heF9oZWlnaHQ7CisgICAgfQorICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0RFQlVHLCAiTWF4aW11bSBzdXBwb3J0ZWQgaW1hZ2Ugc2l6ZSAlZHglZC5cbiIsCisgICAgICAgICAgIGNvbnN0cmFpbnRzLT5tYXhfd2lkdGgsIGNvbnN0cmFpbnRzLT5tYXhfaGVpZ2h0KTsKKworICAgIGNsZSA9IGNsR2V0U3VwcG9ydGVkSW1hZ2VGb3JtYXRzKGh3Y3R4LT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9PQkpFQ1RfSU1BR0UyRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAmbmJfaW1hZ2VfZm9ybWF0cyk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAiaW1hZ2UgZm9ybWF0czogJWQuXG4iLCBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgaWYgKG5iX2ltYWdlX2Zvcm1hdHMgPT0gMCkgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIk5vIGltYWdlIHN1cHBvcnQgaW4gT3BlbkNMICIKKyAgICAgICAgICAgICAgICJkcml2ZXIgKHplcm8gc3VwcG9ydGVkIGltYWdlIGZvcm1hdHMpLlxuIik7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGltYWdlX2Zvcm1hdHMgPQorICAgICAgICBhdl9tYWxsb2NfYXJyYXkobmJfaW1hZ2VfZm9ybWF0cywgc2l6ZW9mKCppbWFnZV9mb3JtYXRzKSk7CisgICAgaWYgKCFpbWFnZV9mb3JtYXRzKSB7CisgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGNsZSA9IGNsR2V0U3VwcG9ydGVkSW1hZ2VGb3JtYXRzKGh3Y3R4LT5jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9SRUFEX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX01FTV9PQkpFQ1RfSU1BR0UyRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYl9pbWFnZV9mb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX2Zvcm1hdHMsIE5VTEwpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgImltYWdlIGZvcm1hdHM6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgcGl4X2ZtdHNfZm91bmQgPSAwOworICAgIGZvciAocGl4X2ZtdCA9IDA7IHBpeF9mbXQgPCBBVl9QSVhfRk1UX05COyBwaXhfZm10KyspIHsKKyAgICAgICAgY2xfaW1hZ2VfZm9ybWF0IGltYWdlX2Zvcm1hdDsKKyAgICAgICAgY2xfaW1hZ2VfZGVzYyAgIGltYWdlX2Rlc2M7CisgICAgICAgIGludCBwbGFuZSwgaTsKKworICAgICAgICBmb3IgKHBsYW5lID0gMDs7IHBsYW5lKyspIHsKKyAgICAgICAgICAgIGVyciA9IG9wZW5jbF9nZXRfcGxhbmVfZm9ybWF0KHBpeF9mbXQsIHBsYW5lLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZV9kZXNjKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmJfaW1hZ2VfZm9ybWF0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKGltYWdlX2Zvcm1hdHNbaV0uaW1hZ2VfY2hhbm5lbF9vcmRlciA9PQorICAgICAgICAgICAgICAgICAgICBpbWFnZV9mb3JtYXQuaW1hZ2VfY2hhbm5lbF9vcmRlciAmJgorICAgICAgICAgICAgICAgICAgICBpbWFnZV9mb3JtYXRzW2ldLmltYWdlX2NoYW5uZWxfZGF0YV90eXBlID09CisgICAgICAgICAgICAgICAgICAgIGltYWdlX2Zvcm1hdC5pbWFnZV9jaGFubmVsX2RhdGFfdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSBuYl9pbWFnZV9mb3JtYXRzKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gQVZFUlJPUihFTk9FTlQpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfREVCVUcsICJGb3JtYXQgJXMgc3VwcG9ydGVkLlxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUocGl4X2ZtdCkpOworCisgICAgICAgIGVyciA9IGF2X3JlYWxsb2NwX2FycmF5KCZjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4X2ZtdHNfZm91bmQgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzKSk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0c1twaXhfZm10c19mb3VuZF0gPSBwaXhfZm10OworICAgICAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0c1twaXhfZm10c19mb3VuZCArIDFdID0KKyAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORTsKKyAgICAgICAgKytwaXhfZm10c19mb3VuZDsKKyAgICB9CisKKyAgICBhdl9mcmVlcCgmaW1hZ2VfZm9ybWF0cyk7CisKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0cyA9CisgICAgICAgIGF2X21hbGxvY19hcnJheSgyLCBzaXplb2YoKmNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzKSk7CisgICAgaWYgKCFjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0cykgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgY29uc3RyYWludHMtPnZhbGlkX2h3X2Zvcm1hdHNbMF0gPSBBVl9QSVhfRk1UX09QRU5DTDsKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0c1sxXSA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGF2X2ZyZWVwKCZpbWFnZV9mb3JtYXRzKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBvcGVuY2xfcG9vbF9mcmVlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAgICAqaHdmYyA9IG9wYXF1ZTsKKyAgICBBVk9wZW5DTEZyYW1lRGVzY3JpcHRvciAqZGVzYyA9IChBVk9wZW5DTEZyYW1lRGVzY3JpcHRvciopZGF0YTsKKyAgICBjbF9pbnQgY2xlOworICAgIGludCBwOworCisgICAgZm9yIChwID0gMDsgcCA8IGRlc2MtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgIGNsZSA9IGNsUmVsZWFzZU1lbU9iamVjdChkZXNjLT5wbGFuZXNbcF0pOworICAgICAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVsZWFzZSBwbGFuZSAlZDogIgorICAgICAgICAgICAgICAgICAgICIlZC5cbiIsIHAsIGNsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9mcmVlKGRlc2MpOworfQorCitzdGF0aWMgQVZCdWZmZXJSZWYgKm9wZW5jbF9wb29sX2FsbG9jKHZvaWQgKm9wYXF1ZSwgaW50IHNpemUpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAgICAqaHdmYyA9IG9wYXF1ZTsKKyAgICBBVk9wZW5DTERldmljZUNvbnRleHQgKmh3Y3R4ID0gaHdmYy0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgKmRlc2M7CisgICAgY2xfaW50IGNsZTsKKyAgICBjbF9tZW0gaW1hZ2U7CisgICAgY2xfaW1hZ2VfZm9ybWF0IGltYWdlX2Zvcm1hdDsKKyAgICBjbF9pbWFnZV9kZXNjICAgaW1hZ2VfZGVzYzsKKyAgICBpbnQgZXJyLCBwOworICAgIEFWQnVmZmVyUmVmICpyZWY7CisKKyAgICBkZXNjID0gYXZfbWFsbG9jeihzaXplb2YoKmRlc2MpKTsKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgZm9yIChwID0gMDs7IHArKykgeworICAgICAgICBlcnIgPSBvcGVuY2xfZ2V0X3BsYW5lX2Zvcm1hdChod2ZjLT5zd19mb3JtYXQsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3ZmMtPndpZHRoLCBod2ZjLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZV9mb3JtYXQsICZpbWFnZV9kZXNjKTsKKyAgICAgICAgaWYgKGVyciA9PSBBVkVSUk9SKEVOT0VOVCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgLy8gRm9yIGdlbmVyaWMgaW1hZ2Ugb2JqZWN0cywgdGhlIHBpdGNoIGlzIGRldGVybWluZWQgYnkgdGhlCisgICAgICAgIC8vIGltcGxlbWVudGF0aW9uLgorICAgICAgICBpbWFnZV9kZXNjLmltYWdlX3Jvd19waXRjaCA9IDA7CisKKyAgICAgICAgaW1hZ2UgPSBjbENyZWF0ZUltYWdlKGh3Y3R4LT5jb250ZXh0LCBDTF9NRU1fUkVBRF9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZV9mb3JtYXQsICZpbWFnZV9kZXNjLCBOVUxMLCAmY2xlKTsKKyAgICAgICAgaWYgKCFpbWFnZSkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgaW1hZ2UgZm9yICIKKyAgICAgICAgICAgICAgICAgICAicGxhbmUgJWQ6ICVkLlxuIiwgcCwgY2xlKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGRlc2MtPnBsYW5lc1twXSA9IGltYWdlOworICAgIH0KKworICAgIGRlc2MtPm5iX3BsYW5lcyA9IHA7CisKKyAgICByZWYgPSBhdl9idWZmZXJfY3JlYXRlKCh1aW50OF90KilkZXNjLCBzaXplb2YoKmRlc2MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5jbF9wb29sX2ZyZWUsIGh3ZmMsIDApOworICAgIGlmICghcmVmKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICByZXR1cm4gcmVmOworCitmYWlsOgorICAgIGZvciAocCA9IDA7IGRlc2MtPnBsYW5lc1twXTsgcCsrKQorICAgICAgICBjbFJlbGVhc2VNZW1PYmplY3QoZGVzYy0+cGxhbmVzW3BdKTsKKyAgICBhdl9mcmVlKGRlc2MpOworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IG9wZW5jbF9mcmFtZXNfaW5pdF9jb21tYW5kX3F1ZXVlKEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjKQoreworICAgIEFWT3BlbkNMRnJhbWVzQ29udGV4dCAqaHdjdHggPSBod2ZjLT5od2N0eDsKKyAgICBPcGVuQ0xEZXZpY2VDb250ZXh0ICpkZXZwcml2ID0gaHdmYy0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgT3BlbkNMRnJhbWVzQ29udGV4dCAgICAqcHJpdiA9IGh3ZmMtPmludGVybmFsLT5wcml2OworICAgIGNsX2ludCBjbGU7CisKKyAgICBwcml2LT5jb21tYW5kX3F1ZXVlID0gaHdjdHgtPmNvbW1hbmRfcXVldWUgPyBod2N0eC0+Y29tbWFuZF9xdWV1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRldnByaXYtPmNvbW1hbmRfcXVldWU7CisgICAgY2xlID0gY2xSZXRhaW5Db21tYW5kUXVldWUocHJpdi0+Y29tbWFuZF9xdWV1ZSk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmV0YWluIGZyYW1lICIKKyAgICAgICAgICAgICAgICJjb21tYW5kIHF1ZXVlOiAlZC5cbiIsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX2ZyYW1lc19pbml0KEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjKQoreworICAgIGlmICghaHdmYy0+cG9vbCkgeworICAgICAgICBod2ZjLT5pbnRlcm5hbC0+cG9vbF9pbnRlcm5hbCA9CisgICAgICAgICAgICBhdl9idWZmZXJfcG9vbF9pbml0MihzaXplb2YoY2xfbWVtKSwgaHdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcGVuY2xfcG9vbF9hbGxvYywgTlVMTCk7CisgICAgICAgIGlmICghaHdmYy0+aW50ZXJuYWwtPnBvb2xfaW50ZXJuYWwpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHJldHVybiBvcGVuY2xfZnJhbWVzX2luaXRfY29tbWFuZF9xdWV1ZShod2ZjKTsKK30KKworc3RhdGljIHZvaWQgb3BlbmNsX2ZyYW1lc191bmluaXQoQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMpCit7CisgICAgT3BlbkNMRnJhbWVzQ29udGV4dCAqcHJpdiA9IGh3ZmMtPmludGVybmFsLT5wcml2OworICAgIGNsX2ludCBjbGU7CisKKyNpZiBIQVZFX09QRU5DTF9EWFZBMiB8fCBIQVZFX09QRU5DTF9EM0QxMQorICAgIGludCBpLCBwOworICAgIGZvciAoaSA9IDA7IGkgPCBwcml2LT5uYl9tYXBwZWRfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgKmRlc2MgPSAmcHJpdi0+bWFwcGVkX2ZyYW1lc1tpXTsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IGRlc2MtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgICAgICBjbGUgPSBjbFJlbGVhc2VNZW1PYmplY3QoZGVzYy0+cGxhbmVzW3BdKTsKKyAgICAgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVsZWFzZSBtYXBwZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUgb2JqZWN0IChmcmFtZSAlZCBwbGFuZSAlZCk6ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgcCwgY2xlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlcCgmcHJpdi0+bWFwcGVkX2ZyYW1lcyk7CisjZW5kaWYKKworICAgIGNsZSA9IGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShwcml2LT5jb21tYW5kX3F1ZXVlKTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlIGZyYW1lICIKKyAgICAgICAgICAgICAgICJjb21tYW5kIHF1ZXVlOiAlZC5cbiIsIGNsZSk7CisgICAgfQorfQorCitzdGF0aWMgaW50IG9wZW5jbF9nZXRfYnVmZmVyKEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjLCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBBVk9wZW5DTEZyYW1lRGVzY3JpcHRvciAqZGVzYzsKKyAgICBpbnQgcDsKKworICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9vbF9nZXQoaHdmYy0+cG9vbCk7CisgICAgaWYgKCFmcmFtZS0+YnVmWzBdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZGVzYyA9IChBVk9wZW5DTEZyYW1lRGVzY3JpcHRvciopZnJhbWUtPmJ1ZlswXS0+ZGF0YTsKKworICAgIGZvciAocCA9IDA7IHAgPCBkZXNjLT5uYl9wbGFuZXM7IHArKykKKyAgICAgICAgZnJhbWUtPmRhdGFbcF0gPSAodWludDhfdCopZGVzYy0+cGxhbmVzW3BdOworCisgICAgZnJhbWUtPmZvcm1hdCAgPSBBVl9QSVhfRk1UX09QRU5DTDsKKyAgICBmcmFtZS0+d2lkdGggICA9IGh3ZmMtPndpZHRoOworICAgIGZyYW1lLT5oZWlnaHQgID0gaHdmYy0+aGVpZ2h0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX3RyYW5zZmVyX2dldF9mb3JtYXRzKEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVkhXRnJhbWVUcmFuc2ZlckRpcmVjdGlvbiBkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKipmb3JtYXRzKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqZm10czsKKworICAgIGZtdHMgPSBhdl9tYWxsb2NfYXJyYXkoMiwgc2l6ZW9mKCpmbXRzKSk7CisgICAgaWYgKCFmbXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm10c1swXSA9IGh3ZmMtPnN3X2Zvcm1hdDsKKyAgICBmbXRzWzFdID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgKmZvcm1hdHMgPSBmbXRzOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wZW5jbF93YWl0X2V2ZW50cyhBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsX2V2ZW50ICpldmVudHMsIGludCBuYl9ldmVudHMpCit7CisgICAgY2xfaW50IGNsZTsKKyAgICBpbnQgaTsKKworICAgIGNsZSA9IGNsV2FpdEZvckV2ZW50cyhuYl9ldmVudHMsIGV2ZW50cyk7CisgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gd2FpdCBmb3IgZXZlbnQgIgorICAgICAgICAgICAgICAgImNvbXBsZXRpb246ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfZXZlbnRzOyBpKyspIHsKKyAgICAgICAgY2xlID0gY2xSZWxlYXNlRXZlbnQoZXZlbnRzW2ldKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2UgIgorICAgICAgICAgICAgICAgICAgICJldmVudDogJWQuXG4iLCBjbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX3RyYW5zZmVyX2RhdGFfZnJvbShBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBPcGVuQ0xGcmFtZXNDb250ZXh0ICpwcml2ID0gaHdmYy0+aW50ZXJuYWwtPnByaXY7CisgICAgY2xfaW1hZ2VfZm9ybWF0IGltYWdlX2Zvcm1hdDsKKyAgICBjbF9pbWFnZV9kZXNjIGltYWdlX2Rlc2M7CisgICAgY2xfaW50IGNsZTsKKyAgICBzaXplX3Qgb3JpZ2luWzNdID0geyAwLCAwLCAwIH07CisgICAgc2l6ZV90IHJlZ2lvblszXTsKKyAgICBjbF9ldmVudCBldmVudHNbQVZfTlVNX0RBVEFfUE9JTlRFUlNdOworICAgIGludCBlcnIsIHA7CisKKyAgICBpZiAoZHN0LT5mb3JtYXQgIT0gaHdmYy0+c3dfZm9ybWF0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgZm9yIChwID0gMDs7IHArKykgeworICAgICAgICBlcnIgPSBvcGVuY2xfZ2V0X3BsYW5lX2Zvcm1hdChod2ZjLT5zd19mb3JtYXQsIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+d2lkdGgsIHNyYy0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VfZm9ybWF0LCAmaW1hZ2VfZGVzYyk7CisgICAgICAgIGlmIChlcnIgPCAwKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IEFWRVJST1IoRU5PRU5UKSkKKyAgICAgICAgICAgICAgICBlcnIgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWRzdC0+ZGF0YVtwXSkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIlBsYW5lICVkIG1pc3Npbmcgb24gIgorICAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBmcmFtZSBmb3IgdHJhbnNmZXIuXG4iLCBwKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmVnaW9uWzBdID0gaW1hZ2VfZGVzYy5pbWFnZV93aWR0aDsKKyAgICAgICAgcmVnaW9uWzFdID0gaW1hZ2VfZGVzYy5pbWFnZV9oZWlnaHQ7CisgICAgICAgIHJlZ2lvblsyXSA9IDE7CisKKyAgICAgICAgY2xlID0gY2xFbnF1ZXVlUmVhZEltYWdlKHByaXYtPmNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xfbWVtKXNyYy0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX0ZBTFNFLCBvcmlnaW4sIHJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+bGluZXNpemVbcF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGFbcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAmZXZlbnRzW3BdKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVucXVldWUgcmVhZCBvZiAiCisgICAgICAgICAgICAgICAgICAgIk9wZW5DTCBpbWFnZSBwbGFuZSAlZDogJWQuXG4iLCBwLCBjbGUpOworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvcGVuY2xfd2FpdF9ldmVudHMoaHdmYywgZXZlbnRzLCBwKTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX3RyYW5zZmVyX2RhdGFfdG8oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjKQoreworICAgIE9wZW5DTEZyYW1lc0NvbnRleHQgKnByaXYgPSBod2ZjLT5pbnRlcm5hbC0+cHJpdjsKKyAgICBjbF9pbWFnZV9mb3JtYXQgaW1hZ2VfZm9ybWF0OworICAgIGNsX2ltYWdlX2Rlc2MgaW1hZ2VfZGVzYzsKKyAgICBjbF9pbnQgY2xlOworICAgIHNpemVfdCBvcmlnaW5bM10gPSB7IDAsIDAsIDAgfTsKKyAgICBzaXplX3QgcmVnaW9uWzNdOworICAgIGNsX2V2ZW50IGV2ZW50c1tBVl9OVU1fREFUQV9QT0lOVEVSU107CisgICAgaW50IGVyciwgcDsKKworICAgIGlmIChzcmMtPmZvcm1hdCAhPSBod2ZjLT5zd19mb3JtYXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBmb3IgKHAgPSAwOzsgcCsrKSB7CisgICAgICAgIGVyciA9IG9wZW5jbF9nZXRfcGxhbmVfZm9ybWF0KGh3ZmMtPnN3X2Zvcm1hdCwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZV9mb3JtYXQsICZpbWFnZV9kZXNjKTsKKyAgICAgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQVZFUlJPUihFTk9FTlQpKQorICAgICAgICAgICAgICAgIGVyciA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc3JjLT5kYXRhW3BdKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiUGxhbmUgJWQgbWlzc2luZyBvbiAiCisgICAgICAgICAgICAgICAgICAgInNvdXJjZSBmcmFtZSBmb3IgdHJhbnNmZXIuXG4iLCBwKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmVnaW9uWzBdID0gaW1hZ2VfZGVzYy5pbWFnZV93aWR0aDsKKyAgICAgICAgcmVnaW9uWzFdID0gaW1hZ2VfZGVzYy5pbWFnZV9oZWlnaHQ7CisgICAgICAgIHJlZ2lvblsyXSA9IDE7CisKKyAgICAgICAgY2xlID0gY2xFbnF1ZXVlV3JpdGVJbWFnZShwcml2LT5jb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbF9tZW0pZHN0LT5kYXRhW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX0ZBTFNFLCBvcmlnaW4sIHJlZ2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmxpbmVzaXplW3BdLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAmZXZlbnRzW3BdKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGVucXVldWUgd3JpdGUgb2YgIgorICAgICAgICAgICAgICAgICAgICJPcGVuQ0wgaW1hZ2UgcGxhbmUgJWQ6ICVkLlxuIiwgcCwgY2xlKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgb3BlbmNsX3dhaXRfZXZlbnRzKGh3ZmMsIGV2ZW50cywgcCk7CisKKyAgICByZXR1cm4gZXJyOworfQorCit0eXBlZGVmIHN0cnVjdCBPcGVuQ0xNYXBwaW5nIHsKKyAgICAvLyBUaGUgbWFwcGVkIGFkZHJlc3NlcyBmb3IgZWFjaCBwbGFuZS4KKyAgICAvLyBUaGUgZGVzdGluYXRpb24gZnJhbWUgaXMgbm90IGF2YWlsYWJsZSB3aGVuIHdlIHVubWFwLCBzbyB0aGVzZQorICAgIC8vIG5lZWQgdG8gYmUgc3RvcmVkIHNlcGFyYXRlbHkuCisgICAgdm9pZCAqYWRkcmVzc1tBVl9OVU1fREFUQV9QT0lOVEVSU107Cit9IE9wZW5DTE1hcHBpbmc7CisKK3N0YXRpYyB2b2lkIG9wZW5jbF91bm1hcF9mcmFtZShBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV01hcERlc2NyaXB0b3IgKmh3bWFwKQoreworICAgIE9wZW5DTEZyYW1lc0NvbnRleHQgKnByaXYgPSBod2ZjLT5pbnRlcm5hbC0+cHJpdjsKKyAgICBPcGVuQ0xNYXBwaW5nICptYXAgPSBod21hcC0+cHJpdjsKKyAgICBjbF9ldmVudCBldmVudHNbQVZfTlVNX0RBVEFfUE9JTlRFUlNdOworICAgIGludCBwLCBlOworICAgIGNsX2ludCBjbGU7CisKKyAgICBmb3IgKHAgPSBlID0gMDsgcCA8IEZGX0FSUkFZX0VMRU1TKG1hcC0+YWRkcmVzcyk7IHArKykgeworICAgICAgICBpZiAoIW1hcC0+YWRkcmVzc1twXSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNsZSA9IGNsRW5xdWV1ZVVubWFwTWVtT2JqZWN0KHByaXYtPmNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbF9tZW0paHdtYXAtPnNvdXJjZS0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLT5hZGRyZXNzW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAmZXZlbnRzW2VdKTsKKyAgICAgICAgaWYgKGNsZSAhPSBDTF9TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHVubWFwIE9wZW5DTCAiCisgICAgICAgICAgICAgICAgICAgImltYWdlIHBsYW5lICVkOiAlZC5cbiIsIHAsIGNsZSk7CisgICAgICAgIH0KKyAgICAgICAgKytlOworICAgIH0KKworICAgIG9wZW5jbF93YWl0X2V2ZW50cyhod2ZjLCBldmVudHMsIGUpOworCisgICAgYXZfZnJlZShtYXApOworfQorCitzdGF0aWMgaW50IG9wZW5jbF9tYXBfZnJhbWUoQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmbGFncykKK3sKKyAgICBPcGVuQ0xGcmFtZXNDb250ZXh0ICpwcml2ID0gaHdmYy0+aW50ZXJuYWwtPnByaXY7CisgICAgY2xfbWFwX2ZsYWdzIG1hcF9mbGFnczsKKyAgICBjbF9pbWFnZV9mb3JtYXQgaW1hZ2VfZm9ybWF0OworICAgIGNsX2ltYWdlX2Rlc2MgaW1hZ2VfZGVzYzsKKyAgICBjbF9pbnQgY2xlOworICAgIE9wZW5DTE1hcHBpbmcgKm1hcDsKKyAgICBzaXplX3Qgb3JpZ2luWzNdID0geyAwLCAwLCAwIH07CisgICAgc2l6ZV90IHJlZ2lvblszXTsKKyAgICBzaXplX3Qgcm93X3BpdGNoOworICAgIGNsX2V2ZW50IGV2ZW50c1tBVl9OVU1fREFUQV9QT0lOVEVSU107CisgICAgaW50IGVyciwgcDsKKworICAgIGF2X2Fzc2VydDAoaHdmYy0+c3dfZm9ybWF0ID09IGRzdC0+Zm9ybWF0KTsKKworICAgIGlmIChmbGFncyAmIEFWX0hXRlJBTUVfTUFQX09WRVJXUklURSAmJgorICAgICAgICAhKGZsYWdzICYgQVZfSFdGUkFNRV9NQVBfUkVBRCkpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCB0aGUgcmVhZC93cml0ZSBmbGFncywgc28KKyAgICAgICAgLy8gdGhlcmUgaXMgbm8gd2F5IHRvIG1hcCB3aXRoIHJlYWQgaGVyZS4KKyAgICAgICAgbWFwX2ZsYWdzID0gQ0xfTUFQX1dSSVRFX0lOVkFMSURBVEVfUkVHSU9OOworICAgIH0gZWxzZSB7CisgICAgICAgIG1hcF9mbGFncyA9IDA7CisgICAgICAgIGlmIChmbGFncyAmIEFWX0hXRlJBTUVfTUFQX1JFQUQpCisgICAgICAgICAgICBtYXBfZmxhZ3MgfD0gQ0xfTUFQX1JFQUQ7CisgICAgICAgIGlmIChmbGFncyAmIEFWX0hXRlJBTUVfTUFQX1dSSVRFKQorICAgICAgICAgICAgbWFwX2ZsYWdzIHw9IENMX01BUF9XUklURTsKKyAgICB9CisKKyAgICBtYXAgPSBhdl9tYWxsb2N6KHNpemVvZigqbWFwKSk7CisgICAgaWYgKCFtYXApCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKHAgPSAwOzsgcCsrKSB7CisgICAgICAgIGVyciA9IG9wZW5jbF9nZXRfcGxhbmVfZm9ybWF0KGh3ZmMtPnN3X2Zvcm1hdCwgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZV9mb3JtYXQsICZpbWFnZV9kZXNjKTsKKyAgICAgICAgaWYgKGVyciA9PSBBVkVSUk9SKEVOT0VOVCkpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGVyciA8IDApCisgICAgICAgICAgICBnb3RvIGZhaWw7CisKKyAgICAgICAgcmVnaW9uWzBdID0gaW1hZ2VfZGVzYy5pbWFnZV93aWR0aDsKKyAgICAgICAgcmVnaW9uWzFdID0gaW1hZ2VfZGVzYy5pbWFnZV9oZWlnaHQ7CisgICAgICAgIHJlZ2lvblsyXSA9IDE7CisKKyAgICAgICAgbWFwLT5hZGRyZXNzW3BdID0KKyAgICAgICAgICAgIGNsRW5xdWV1ZU1hcEltYWdlKHByaXYtPmNvbW1hbmRfcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xfbWVtKXNyYy0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX0ZBTFNFLCBtYXBfZmxhZ3MsIG9yaWdpbiwgcmVnaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJvd19waXRjaCwgTlVMTCwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudHNbcF0sICZjbGUpOworICAgICAgICBpZiAoIW1hcC0+YWRkcmVzc1twXSkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBtYXAgT3BlbkNMICIKKyAgICAgICAgICAgICAgICAgICAiaW1hZ2UgcGxhbmUgJWQ6ICVkLlxuIiwgcCwgY2xlKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdC0+ZGF0YVtwXSA9IG1hcC0+YWRkcmVzc1twXTsKKworICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0RFQlVHLCAiTWFwIHBsYW5lICVkICglcCAtPiAlcCkuXG4iLAorICAgICAgICAgICAgICAgcCwgc3JjLT5kYXRhW3BdLCBkc3QtPmRhdGFbcF0pOworICAgIH0KKworICAgIGVyciA9IG9wZW5jbF93YWl0X2V2ZW50cyhod2ZjLCBldmVudHMsIHApOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSBmZl9od2ZyYW1lX21hcF9jcmVhdGUoc3JjLT5od19mcmFtZXNfY3R4LCBkc3QsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5jbF91bm1hcF9mcmFtZSwgbWFwKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZHN0LT53aWR0aCAgPSBzcmMtPndpZHRoOworICAgIGRzdC0+aGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmb3IgKHAgPSAwOyBwIDwgQVZfTlVNX0RBVEFfUE9JTlRFUlM7IHArKykgeworICAgICAgICBpZiAoIW1hcC0+YWRkcmVzc1twXSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjbEVucXVldWVVbm1hcE1lbU9iamVjdChwcml2LT5jb21tYW5kX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xfbWVtKXNyYy0+ZGF0YVtwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLT5hZGRyZXNzW3BdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAmZXZlbnRzW3BdKTsKKyAgICB9CisgICAgaWYgKHAgPiAwKQorICAgICAgICBvcGVuY2xfd2FpdF9ldmVudHMoaHdmYywgZXZlbnRzLCBwKTsKKyAgICBhdl9mcmVlcCgmbWFwKTsKKyAgICByZXR1cm4gZXJyOworfQorCisjaWYgSEFWRV9PUEVOQ0xfRFJNX0JFSUdORVQKKwordHlwZWRlZiBzdHJ1Y3QgRFJNQmVpZ25ldFRvT3BlbkNMTWFwcGluZyB7CisgICAgQVZGcmFtZSAgICAgICAgICAgICAgKmRybV9mcmFtZTsKKyAgICBBVkRSTUZyYW1lRGVzY3JpcHRvciAqZHJtX2Rlc2M7CisKKyAgICBBVk9wZW5DTEZyYW1lRGVzY3JpcHRvciBmcmFtZTsKK30gRFJNQmVpZ25ldFRvT3BlbkNMTWFwcGluZzsKKworc3RhdGljIHZvaWQgb3BlbmNsX3VubWFwX2Zyb21fZHJtX2JlaWduZXQoQVZIV0ZyYW1lc0NvbnRleHQgKmRzdF9mYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXApCit7CisgICAgRFJNQmVpZ25ldFRvT3BlbkNMTWFwcGluZyAqbWFwcGluZyA9IGh3bWFwLT5wcml2OworICAgIGNsX2ludCBjbGU7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWFwcGluZy0+ZnJhbWUubmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgY2xlID0gY2xSZWxlYXNlTWVtT2JqZWN0KG1hcHBpbmctPmZyYW1lLnBsYW5lc1tpXSk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2UgQ0wgaW1hZ2UgIgorICAgICAgICAgICAgICAgICAgICJvZiBwbGFuZSAlZCBvZiBEUk0gZnJhbWU6ICVkLlxuIiwgaSwgY2xlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyZWUobWFwcGluZyk7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX21hcF9mcm9tX2RybV9iZWlnbmV0KEFWSFdGcmFtZXNDb250ZXh0ICpkc3RfZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBBVk9wZW5DTERldmljZUNvbnRleHQgKmh3Y3R4ID0gZHN0X2ZjLT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBPcGVuQ0xEZXZpY2VDb250ZXh0ICAgICpwcml2ID0gZHN0X2ZjLT5kZXZpY2VfY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBEUk1CZWlnbmV0VG9PcGVuQ0xNYXBwaW5nICptYXBwaW5nOworICAgIGNvbnN0IEFWRFJNRnJhbWVEZXNjcmlwdG9yICpkZXNjOworICAgIGNsX2ludCBjbGU7CisgICAgaW50IGVyciwgaSwgaiwgcDsKKworICAgIGRlc2MgPSAoY29uc3QgQVZEUk1GcmFtZURlc2NyaXB0b3IqKXNyYy0+ZGF0YVswXTsKKworICAgIG1hcHBpbmcgPSBhdl9tYWxsb2N6KHNpemVvZigqbWFwcGluZykpOworICAgIGlmICghbWFwcGluZykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIHAgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9sYXllcnM7IGkrKykgeworICAgICAgICBjb25zdCBBVkRSTUxheWVyRGVzY3JpcHRvciAqbGF5ZXIgPSAmZGVzYy0+bGF5ZXJzW2ldOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGF5ZXItPm5iX3BsYW5lczsgaisrKSB7CisgICAgICAgICAgICBjb25zdCBBVkRSTVBsYW5lRGVzY3JpcHRvciAqcGxhbmUgPSAmbGF5ZXItPnBsYW5lc1tqXTsKKyAgICAgICAgICAgIGNvbnN0IEFWRFJNT2JqZWN0RGVzY3JpcHRvciAqb2JqZWN0ID0KKyAgICAgICAgICAgICAgICAmZGVzYy0+b2JqZWN0c1twbGFuZS0+b2JqZWN0X2luZGV4XTsKKworICAgICAgICAgICAgY2xfaW1wb3J0X2ltYWdlX2luZm9faW50ZWwgaW1hZ2VfaW5mbyA9IHsKKyAgICAgICAgICAgICAgICAuZmQgICAgICAgID0gb2JqZWN0LT5mZCwKKyAgICAgICAgICAgICAgICAuc2l6ZSAgICAgID0gb2JqZWN0LT5zaXplLAorICAgICAgICAgICAgICAgIC50eXBlICAgICAgPSBDTF9NRU1fT0JKRUNUX0lNQUdFMkQsCisgICAgICAgICAgICAgICAgLm9mZnNldCAgICA9IHBsYW5lLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgLnJvd19waXRjaCA9IHBsYW5lLT5waXRjaCwKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjbF9pbWFnZV9kZXNjIGltYWdlX2Rlc2M7CisKKyAgICAgICAgICAgIGVyciA9IG9wZW5jbF9nZXRfcGxhbmVfZm9ybWF0KGRzdF9mYy0+c3dfZm9ybWF0LCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VfaW5mby5mbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VfZGVzYyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhkc3RfZmMsIEFWX0xPR19FUlJPUiwgIkRSTSBmcmFtZSBsYXllciAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJwbGFuZSAlZCBpcyBub3QgcmVwcmVzZW50YWJsZSBpbiBPcGVuQ0w6ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgZXJyKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbWFnZV9pbmZvLndpZHRoICA9IGltYWdlX2Rlc2MuaW1hZ2Vfd2lkdGg7CisgICAgICAgICAgICBpbWFnZV9pbmZvLmhlaWdodCA9IGltYWdlX2Rlc2MuaW1hZ2VfaGVpZ2h0OworCisgICAgICAgICAgICBtYXBwaW5nLT5mcmFtZS5wbGFuZXNbcF0gPQorICAgICAgICAgICAgICAgIHByaXYtPmNsQ3JlYXRlSW1hZ2VGcm9tRmRJTlRFTChod2N0eC0+Y29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlX2luZm8sICZjbGUpOworICAgICAgICAgICAgaWYgKCFtYXBwaW5nLT5mcmFtZS5wbGFuZXNbcF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIENMIGltYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZyb20gbGF5ZXIgJWQgcGxhbmUgJWQgb2YgRFJNIGZyYW1lOiAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGksIGosIGNsZSk7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0LT5kYXRhW3BdID0gKHVpbnQ4X3QqKW1hcHBpbmctPmZyYW1lLnBsYW5lc1twXTsKKyAgICAgICAgICAgIG1hcHBpbmctPmZyYW1lLm5iX3BsYW5lcyA9ICsrcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVyciA9IGZmX2h3ZnJhbWVfbWFwX2NyZWF0ZShkc3QtPmh3X2ZyYW1lc19jdHgsIGRzdCwgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BlbmNsX3VubWFwX2Zyb21fZHJtX2JlaWduZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBkc3QtPndpZHRoICA9IHNyYy0+d2lkdGg7CisgICAgZHN0LT5oZWlnaHQgPSBzcmMtPmhlaWdodDsKKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGZvciAocCA9IDA7IHAgPCBtYXBwaW5nLT5mcmFtZS5uYl9wbGFuZXM7IHArKykgeworICAgICAgICBpZiAobWFwcGluZy0+ZnJhbWUucGxhbmVzW3BdKQorICAgICAgICAgICAgY2xSZWxlYXNlTWVtT2JqZWN0KG1hcHBpbmctPmZyYW1lLnBsYW5lc1twXSk7CisgICAgfQorICAgIGF2X2ZyZWUobWFwcGluZyk7CisgICAgcmV0dXJuIGVycjsKK30KKworI2lmIEhBVkVfT1BFTkNMX1ZBQVBJX0JFSUdORVQKKworc3RhdGljIGludCBvcGVuY2xfbWFwX2Zyb21fdmFhcGkoQVZIV0ZyYW1lc0NvbnRleHQgKmRzdF9mYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXA7CisgICAgQVZGcmFtZSAqdG1wOworICAgIGludCBlcnI7CisKKyAgICB0bXAgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghdG1wKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdG1wLT5mb3JtYXQgPSBBVl9QSVhfRk1UX0RSTV9QUklNRTsKKworICAgIGVyciA9IGF2X2h3ZnJhbWVfbWFwKHRtcCwgc3JjLCBmbGFncyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IG9wZW5jbF9tYXBfZnJvbV9kcm1fYmVpZ25ldChkc3RfZmMsIGRzdCwgdG1wLCBmbGFncyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIC8vIEFkanVzdCB0aGUgbWFwIGRlc2NyaXB0b3Igc28gdGhhdCB1bm1hcCB3b3JrcyBjb3JyZWN0bHkuCisgICAgaHdtYXAgPSAoSFdNYXBEZXNjcmlwdG9yKilkc3QtPmJ1ZlswXS0+ZGF0YTsKKyAgICBhdl9mcmFtZV91bnJlZihod21hcC0+c291cmNlKTsKKyAgICBlcnIgPSBhdl9mcmFtZV9yZWYoaHdtYXAtPnNvdXJjZSwgc3JjKTsKKworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZ0bXApOworICAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZiAvKiBIQVZFX09QRU5DTF9WQUFQSV9CRUlHTkVUICovCisjZW5kaWYgLyogSEFWRV9PUEVOQ0xfRFJNX0JFSUdORVQgKi8KKworc3RhdGljIGlubGluZSBjbF9tZW1fZmxhZ3Mgb3BlbmNsX21lbV9mbGFnc19mb3JfbWFwcGluZyhpbnQgbWFwX2ZsYWdzKQoreworICAgIGlmICgobWFwX2ZsYWdzICYgQVZfSFdGUkFNRV9NQVBfUkVBRCkgJiYKKyAgICAgICAgKG1hcF9mbGFncyAmIEFWX0hXRlJBTUVfTUFQX1dSSVRFKSkKKyAgICAgICAgcmV0dXJuIENMX01FTV9SRUFEX1dSSVRFOworICAgIGVsc2UgaWYgKG1hcF9mbGFncyAmIEFWX0hXRlJBTUVfTUFQX1JFQUQpCisgICAgICAgIHJldHVybiBDTF9NRU1fUkVBRF9PTkxZOworICAgIGVsc2UgaWYgKG1hcF9mbGFncyAmIEFWX0hXRlJBTUVfTUFQX1dSSVRFKQorICAgICAgICByZXR1cm4gQ0xfTUVNX1dSSVRFX09OTFk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKworI2lmIEhBVkVfT1BFTkNMX1ZBQVBJX0lOVEVMX01FRElBCisKK3N0YXRpYyB2b2lkIG9wZW5jbF91bm1hcF9mcm9tX3FzdihBVkhXRnJhbWVzQ29udGV4dCAqZHN0X2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXApCit7CisgICAgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgICAgKmRlc2MgPSBod21hcC0+cHJpdjsKKyAgICBPcGVuQ0xEZXZpY2VDb250ZXh0ICpkZXZpY2VfcHJpdiA9IGRzdF9mYy0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgT3BlbkNMRnJhbWVzQ29udGV4dCAqZnJhbWVzX3ByaXYgPSBkc3RfZmMtPmludGVybmFsLT5wcml2OworICAgIGNsX2V2ZW50IGV2ZW50OworICAgIGNsX2ludCBjbGU7CisgICAgaW50IHA7CisKKyAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfREVCVUcsICJVbm1hcCBRU1YvVkFBUEkgc3VyZmFjZSBmcm9tIE9wZW5DTC5cbiIpOworCisgICAgY2xlID0gZGV2aWNlX3ByaXYtPmNsRW5xdWV1ZVJlbGVhc2VWQV9BUElNZWRpYVN1cmZhY2VzSU5URUwoCisgICAgICAgIGZyYW1lc19wcml2LT5jb21tYW5kX3F1ZXVlLCBkZXNjLT5uYl9wbGFuZXMsIGRlc2MtPnBsYW5lcywKKyAgICAgICAgMCwgTlVMTCwgJmV2ZW50KTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2Ugc3VyZmFjZSAiCisgICAgICAgICAgICAgICAiaGFuZGxlczogJWQuXG4iLCBjbGUpOworICAgIH0KKworICAgIG9wZW5jbF93YWl0X2V2ZW50cyhkc3RfZmMsICZldmVudCwgMSk7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgZGVzYy0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgY2xlID0gY2xSZWxlYXNlTWVtT2JqZWN0KGRlc2MtPnBsYW5lc1twXSk7CisgICAgICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2UgQ0wgIgorICAgICAgICAgICAgICAgICAgICJpbWFnZSBvZiBwbGFuZSAlZCBvZiBRU1YvVkFBUEkgc3VyZmFjZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcCwgY2xlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZyZWUoZGVzYyk7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX21hcF9mcm9tX3FzdihBVkhXRnJhbWVzQ29udGV4dCAqZHN0X2ZjLCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKnNyY19mYyA9CisgICAgICAgIChBVkhXRnJhbWVzQ29udGV4dCopc3JjLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgIEFWT3BlbkNMRGV2aWNlQ29udGV4dCAgICpkc3RfZGV2ID0gZHN0X2ZjLT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBPcGVuQ0xEZXZpY2VDb250ZXh0ICpkZXZpY2VfcHJpdiA9IGRzdF9mYy0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgT3BlbkNMRnJhbWVzQ29udGV4dCAqZnJhbWVzX3ByaXYgPSBkc3RfZmMtPmludGVybmFsLT5wcml2OworICAgIEFWT3BlbkNMRnJhbWVEZXNjcmlwdG9yICpkZXNjOworICAgIFZBU3VyZmFjZUlEIHZhX3N1cmZhY2U7CisgICAgY2xfbWVtX2ZsYWdzIGNsX2ZsYWdzOworICAgIGNsX2V2ZW50IGV2ZW50OworICAgIGNsX2ludCBjbGU7CisgICAgaW50IGVyciwgcDsKKworICAgIGlmIChzcmMtPmZvcm1hdCA9PSBBVl9QSVhfRk1UX1FTVikgeworICAgICAgICBtZnhGcmFtZVN1cmZhY2UxICptZnhfc3VyZmFjZSA9IChtZnhGcmFtZVN1cmZhY2UxKilzcmMtPmRhdGFbM107CisgICAgICAgIHZhX3N1cmZhY2UgPSAqKFZBU3VyZmFjZUlEKiltZnhfc3VyZmFjZS0+RGF0YS5NZW1JZDsKKyAgICB9IGVsc2UgaWYgKHNyYy0+Zm9ybWF0ID09IEFWX1BJWF9GTVRfVkFBUEkpIHsKKyAgICAgICAgdmFfc3VyZmFjZSA9IChWQVN1cmZhY2VJRCkodWludHB0cl90KXNyYy0+ZGF0YVszXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGNsX2ZsYWdzID0gb3BlbmNsX21lbV9mbGFnc19mb3JfbWFwcGluZyhmbGFncyk7CisgICAgaWYgKCFjbF9mbGFncykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGF2X2xvZyhzcmNfZmMsIEFWX0xPR19ERUJVRywgIk1hcCBRU1YvVkFBUEkgc3VyZmFjZSAlI3ggdG8gIgorICAgICAgICAgICAiT3BlbkNMLlxuIiwgdmFfc3VyZmFjZSk7CisKKyAgICBkZXNjID0gYXZfbWFsbG9jeihzaXplb2YoKmRlc2MpKTsKKyAgICBpZiAoIWRlc2MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAvLyBUaGUgY2xfaW50ZWxfdmFfYXBpX21lZGlhX3NoYXJpbmcgZXh0ZW5zaW9uIG9ubHkgc3VwcG9ydHMgTlYxMgorICAgIC8vIHN1cmZhY2VzLCBzbyBmb3Igbm93IHRoZXJlIGFyZSBhbHdheXMgZXhhY3RseSB0d28gcGxhbmVzLgorICAgIGRlc2MtPm5iX3BsYW5lcyA9IDI7CisKKyAgICBmb3IgKHAgPSAwOyBwIDwgZGVzYy0+bmJfcGxhbmVzOyBwKyspIHsKKyAgICAgICAgZGVzYy0+cGxhbmVzW3BdID0KKyAgICAgICAgICAgIGRldmljZV9wcml2LT5jbENyZWF0ZUZyb21WQV9BUElNZWRpYVN1cmZhY2VJTlRFTCgKKyAgICAgICAgICAgICAgICBkc3RfZGV2LT5jb250ZXh0LCBjbF9mbGFncywgJnZhX3N1cmZhY2UsIHAsICZjbGUpOworICAgICAgICBpZiAoIWRlc2MtPnBsYW5lc1twXSkgeworICAgICAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBDTCAiCisgICAgICAgICAgICAgICAgICAgImltYWdlIGZyb20gcGxhbmUgJWQgb2YgUVNWL1ZBQVBJIHN1cmZhY2UgIgorICAgICAgICAgICAgICAgICAgICIlI3g6ICVkLlxuIiwgcCwgdmFfc3VyZmFjZSwgY2xlKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdC0+ZGF0YVtwXSA9ICh1aW50OF90KilkZXNjLT5wbGFuZXNbcF07CisgICAgfQorCisgICAgY2xlID0gZGV2aWNlX3ByaXYtPmNsRW5xdWV1ZUFjcXVpcmVWQV9BUElNZWRpYVN1cmZhY2VzSU5URUwoCisgICAgICAgIGZyYW1lc19wcml2LT5jb21tYW5kX3F1ZXVlLCBkZXNjLT5uYl9wbGFuZXMsIGRlc2MtPnBsYW5lcywKKyAgICAgICAgMCwgTlVMTCwgJmV2ZW50KTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFjcXVpcmUgc3VyZmFjZSAiCisgICAgICAgICAgICAgICAiaGFuZGxlczogJWQuXG4iLCBjbGUpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBvcGVuY2xfd2FpdF9ldmVudHMoZHN0X2ZjLCAmZXZlbnQsIDEpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSBmZl9od2ZyYW1lX21hcF9jcmVhdGUoZHN0LT5od19mcmFtZXNfY3R4LCBkc3QsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5jbF91bm1hcF9mcm9tX3FzdiwgZGVzYyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGRzdC0+d2lkdGggID0gc3JjLT53aWR0aDsKKyAgICBkc3QtPmhlaWdodCA9IHNyYy0+aGVpZ2h0OworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZm9yIChwID0gMDsgcCA8IGRlc2MtPm5iX3BsYW5lczsgcCsrKQorICAgICAgICBpZiAoZGVzYy0+cGxhbmVzW3BdKQorICAgICAgICAgICAgY2xSZWxlYXNlTWVtT2JqZWN0KGRlc2MtPnBsYW5lc1twXSk7CisgICAgYXZfZnJlZXAoJmRlc2MpOworICAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZgorCisjaWYgSEFWRV9PUEVOQ0xfRFhWQTIKKworc3RhdGljIHZvaWQgb3BlbmNsX3VubWFwX2Zyb21fZHh2YTIoQVZIV0ZyYW1lc0NvbnRleHQgKmRzdF9mYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXApCit7CisgICAgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgICAgKmRlc2MgPSBod21hcC0+cHJpdjsKKyAgICBPcGVuQ0xEZXZpY2VDb250ZXh0ICpkZXZpY2VfcHJpdiA9IGRzdF9mYy0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgT3BlbkNMRnJhbWVzQ29udGV4dCAqZnJhbWVzX3ByaXYgPSBkc3RfZmMtPmRldmljZV9jdHgtPmludGVybmFsLT5wcml2OworICAgIGNsX2V2ZW50IGV2ZW50OworICAgIGNsX2ludCBjbGU7CisKKyAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfREVCVUcsICJVbm1hcCBEWFZBMiBzdXJmYWNlIGZyb20gT3BlbkNMLlxuIik7CisKKyAgICBjbGUgPSBkZXZpY2VfcHJpdi0+Y2xFbnF1ZXVlUmVsZWFzZURYOU1lZGlhU3VyZmFjZXNLSFIoCisgICAgICAgIGZyYW1lc19wcml2LT5jb21tYW5kX3F1ZXVlLCBkZXNjLT5uYl9wbGFuZXMsIGRlc2MtPnBsYW5lcywKKyAgICAgICAgMCwgTlVMTCwgJmV2ZW50KTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHJlbGVhc2Ugc3VyZmFjZSAiCisgICAgICAgICAgICAgICAiaGFuZGxlOiAlZC5cbiIsIGNsZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBvcGVuY2xfd2FpdF9ldmVudHMoZHN0X2ZjLCAmZXZlbnQsIDEpOworfQorCitzdGF0aWMgaW50IG9wZW5jbF9tYXBfZnJvbV9keHZhMihBVkhXRnJhbWVzQ29udGV4dCAqZHN0X2ZjLCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmbGFncykKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAqc3JjX2ZjID0KKyAgICAgICAgKEFWSFdGcmFtZXNDb250ZXh0KilzcmMtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZEWFZBMkZyYW1lc0NvbnRleHQgICpzcmNfaHdjdHggPSBzcmNfZmMtPmh3Y3R4OworICAgIE9wZW5DTERldmljZUNvbnRleHQgKmRldmljZV9wcml2ID0gZHN0X2ZjLT5kZXZpY2VfY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBPcGVuQ0xGcmFtZXNDb250ZXh0ICpmcmFtZXNfcHJpdiA9IGRzdF9mYy0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgKmRlc2M7CisgICAgY2xfZXZlbnQgZXZlbnQ7CisgICAgY2xfaW50IGNsZTsKKyAgICBpbnQgZXJyLCBpOworCisgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0RFQlVHLCAiTWFwIERYVkEyIHN1cmZhY2UgJXAgdG8gIgorICAgICAgICAgICAiT3BlbkNMLlxuIiwgc3JjLT5kYXRhWzNdKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfaHdjdHgtPm5iX3N1cmZhY2VzOyBpKyspIHsKKyAgICAgICAgaWYgKHNyY19od2N0eC0+c3VyZmFjZXNbaV0gPT0gKElEaXJlY3QzRFN1cmZhY2U5KilzcmMtPmRhdGFbM10pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgPj0gc3JjX2h3Y3R4LT5uYl9zdXJmYWNlcykgeworICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJUcnlpbmcgdG8gbWFwIGZyb20gYSBzdXJmYWNlIHdoaWNoICIKKyAgICAgICAgICAgICAgICJpcyBub3QgaW4gdGhlIG1hcHBlZCBmcmFtZXMgY29udGV4dC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGRlc2MgPSAmZnJhbWVzX3ByaXYtPm1hcHBlZF9mcmFtZXNbaV07CisKKyAgICBjbGUgPSBkZXZpY2VfcHJpdi0+Y2xFbnF1ZXVlQWNxdWlyZURYOU1lZGlhU3VyZmFjZXNLSFIoCisgICAgICAgIGZyYW1lc19wcml2LT5jb21tYW5kX3F1ZXVlLCBkZXNjLT5uYl9wbGFuZXMsIGRlc2MtPnBsYW5lcywKKyAgICAgICAgMCwgTlVMTCwgJmV2ZW50KTsKKyAgICBpZiAoY2xlICE9IENMX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGFjcXVpcmUgc3VyZmFjZSAiCisgICAgICAgICAgICAgICAiaGFuZGxlOiAlZC5cbiIsIGNsZSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgfQorCisgICAgZXJyID0gb3BlbmNsX3dhaXRfZXZlbnRzKGRzdF9mYywgJmV2ZW50LCAxKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX3BsYW5lczsgaSsrKQorICAgICAgICBkc3QtPmRhdGFbaV0gPSAodWludDhfdCopZGVzYy0+cGxhbmVzW2ldOworCisgICAgZXJyID0gZmZfaHdmcmFtZV9tYXBfY3JlYXRlKGRzdC0+aHdfZnJhbWVzX2N0eCwgZHN0LCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcGVuY2xfdW5tYXBfZnJvbV9keHZhMiwgZGVzYyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGRzdC0+d2lkdGggID0gc3JjLT53aWR0aDsKKyAgICBkc3QtPmhlaWdodCA9IHNyYy0+aGVpZ2h0OworCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgY2xlID0gZGV2aWNlX3ByaXYtPmNsRW5xdWV1ZVJlbGVhc2VEWDlNZWRpYVN1cmZhY2VzS0hSKAorICAgICAgICBmcmFtZXNfcHJpdi0+Y29tbWFuZF9xdWV1ZSwgZGVzYy0+bmJfcGxhbmVzLCBkZXNjLT5wbGFuZXMsCisgICAgICAgIDAsIE5VTEwsICZldmVudCk7CisgICAgaWYgKGNsZSA9PSBDTF9TVUNDRVNTKQorICAgICAgICBvcGVuY2xfd2FpdF9ldmVudHMoZHN0X2ZjLCAmZXZlbnQsIDEpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3BlbmNsX2ZyYW1lc19kZXJpdmVfZnJvbV9keHZhMihBVkhXRnJhbWVzQ29udGV4dCAqZHN0X2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSFdGcmFtZXNDb250ZXh0ICpzcmNfZmMsIGludCBmbGFncykKK3sKKyAgICBBVk9wZW5DTERldmljZUNvbnRleHQgICAqZHN0X2RldiA9IGRzdF9mYy0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgQVZEWFZBMkZyYW1lc0NvbnRleHQgICpzcmNfaHdjdHggPSBzcmNfZmMtPmh3Y3R4OworICAgIE9wZW5DTERldmljZUNvbnRleHQgKmRldmljZV9wcml2ID0gZHN0X2ZjLT5kZXZpY2VfY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBPcGVuQ0xGcmFtZXNDb250ZXh0ICpmcmFtZXNfcHJpdiA9IGRzdF9mYy0+aW50ZXJuYWwtPnByaXY7CisgICAgY2xfbWVtX2ZsYWdzIGNsX2ZsYWdzOworICAgIGNsX2ludCBjbGU7CisgICAgaW50IGVyciwgaSwgcCwgbmJfcGxhbmVzOworCisgICAgaWYgKHNyY19mYy0+c3dfZm9ybWF0ICE9IEFWX1BJWF9GTVRfTlYxMikgeworICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJPbmx5IE5WMTIgdGV4dHVyZXMgYXJlIHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAiZm9yIERYVkEyIHRvIE9wZW5DTCBtYXBwaW5nLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorICAgIG5iX3BsYW5lcyA9IDI7CisKKyAgICBpZiAoc3JjX2ZjLT5pbml0aWFsX3Bvb2xfc2l6ZSA9PSAwKSB7CisgICAgICAgIGF2X2xvZyhkc3RfZmMsIEFWX0xPR19FUlJPUiwgIk9ubHkgZml4ZWQtc2l6ZSBwb29scyBhcmUgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICJmb3IgRFhWQTIgdG8gT3BlbkNMIG1hcHBpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjbF9mbGFncyA9IG9wZW5jbF9tZW1fZmxhZ3NfZm9yX21hcHBpbmcoZmxhZ3MpOworICAgIGlmICghY2xfZmxhZ3MpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBmcmFtZXNfcHJpdi0+bmJfbWFwcGVkX2ZyYW1lcyA9IHNyY19od2N0eC0+bmJfc3VyZmFjZXM7CisKKyAgICBmcmFtZXNfcHJpdi0+bWFwcGVkX2ZyYW1lcyA9CisgICAgICAgIGF2X21hbGxvY3pfYXJyYXkoZnJhbWVzX3ByaXYtPm5iX21hcHBlZF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpmcmFtZXNfcHJpdi0+bWFwcGVkX2ZyYW1lcykpOworICAgIGlmICghZnJhbWVzX3ByaXYtPm1hcHBlZF9mcmFtZXMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzX3ByaXYtPm5iX21hcHBlZF9mcmFtZXM7IGkrKykgeworICAgICAgICBBVk9wZW5DTEZyYW1lRGVzY3JpcHRvciAqZGVzYyA9ICZmcmFtZXNfcHJpdi0+bWFwcGVkX2ZyYW1lc1tpXTsKKyAgICAgICAgY2xfZHg5X3N1cmZhY2VfaW5mb19raHIgc3VyZmFjZV9pbmZvID0geworICAgICAgICAgICAgLnJlc291cmNlICAgICAgPSBzcmNfaHdjdHgtPnN1cmZhY2VzW2ldLAorICAgICAgICAgICAgLnNoYXJlZF9oYW5kbGUgPSBOVUxMLAorICAgICAgICB9OworICAgICAgICBkZXNjLT5uYl9wbGFuZXMgPSBuYl9wbGFuZXM7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCBuYl9wbGFuZXM7IHArKykgeworICAgICAgICAgICAgZGVzYy0+cGxhbmVzW3BdID0KKyAgICAgICAgICAgICAgICBkZXZpY2VfcHJpdi0+Y2xDcmVhdGVGcm9tRFg5TWVkaWFTdXJmYWNlS0hSKAorICAgICAgICAgICAgICAgICAgICBkc3RfZGV2LT5jb250ZXh0LCBjbF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3ByaXYtPmR4OV9tZWRpYV9hZGFwdGVyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICZzdXJmYWNlX2luZm8sIHAsICZjbGUpOworICAgICAgICAgICAgaWYgKCFkZXNjLT5wbGFuZXNbcF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIENMICIKKyAgICAgICAgICAgICAgICAgICAgICAgImltYWdlIGZyb20gcGxhbmUgJWQgb2YgRFhWQTIgc3VyZmFjZSAlZDogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwLCBpLCBjbGUpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgZnJhbWVzX3ByaXYtPm5iX21hcHBlZF9mcmFtZXM7IGkrKykgeworICAgICAgICBBVk9wZW5DTEZyYW1lRGVzY3JpcHRvciAqZGVzYyA9ICZmcmFtZXNfcHJpdi0+bWFwcGVkX2ZyYW1lc1tpXTsKKyAgICAgICAgZm9yIChwID0gMDsgcCA8IGRlc2MtPm5iX3BsYW5lczsgcCsrKSB7CisgICAgICAgICAgICBpZiAoZGVzYy0+cGxhbmVzW3BdKQorICAgICAgICAgICAgICAgIGNsUmVsZWFzZU1lbU9iamVjdChkZXNjLT5wbGFuZXNbcF0pOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWVwKCZmcmFtZXNfcHJpdi0+bWFwcGVkX2ZyYW1lcyk7CisgICAgZnJhbWVzX3ByaXYtPm5iX21hcHBlZF9mcmFtZXMgPSAwOworICAgIHJldHVybiBlcnI7Cit9CisKKyNlbmRpZgorCisjaWYgSEFWRV9PUEVOQ0xfRDNEMTEKKworc3RhdGljIHZvaWQgb3BlbmNsX3VubWFwX2Zyb21fZDNkMTEoQVZIV0ZyYW1lc0NvbnRleHQgKmRzdF9mYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXApCit7CisgICAgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgICAgKmRlc2MgPSBod21hcC0+cHJpdjsKKyAgICBPcGVuQ0xEZXZpY2VDb250ZXh0ICpkZXZpY2VfcHJpdiA9IGRzdF9mYy0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgT3BlbkNMRnJhbWVzQ29udGV4dCAqZnJhbWVzX3ByaXYgPSBkc3RfZmMtPmRldmljZV9jdHgtPmludGVybmFsLT5wcml2OworICAgIGNsX2V2ZW50IGV2ZW50OworICAgIGNsX2ludCBjbGU7CisKKyAgICBjbGUgPSBkZXZpY2VfcHJpdi0+Y2xFbnF1ZXVlUmVsZWFzZUQzRDExT2JqZWN0c0tIUigKKyAgICAgICAgZnJhbWVzX3ByaXYtPmNvbW1hbmRfcXVldWUsIGRlc2MtPm5iX3BsYW5lcywgZGVzYy0+cGxhbmVzLAorICAgICAgICAwLCBOVUxMLCAmZXZlbnQpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVsZWFzZSBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICJoYW5kbGU6ICVkLlxuIiwgY2xlKTsKKyAgICB9CisKKyAgICBvcGVuY2xfd2FpdF9ldmVudHMoZHN0X2ZjLCAmZXZlbnQsIDEpOworfQorCitzdGF0aWMgaW50IG9wZW5jbF9tYXBfZnJvbV9kM2QxMShBVkhXRnJhbWVzQ29udGV4dCAqZHN0X2ZjLCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmbGFncykKK3sKKyAgICBPcGVuQ0xEZXZpY2VDb250ZXh0ICAqZGV2aWNlX3ByaXYgPSBkc3RfZmMtPmRldmljZV9jdHgtPmludGVybmFsLT5wcml2OworICAgIE9wZW5DTEZyYW1lc0NvbnRleHQgICpmcmFtZXNfcHJpdiA9IGRzdF9mYy0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgKmRlc2M7CisgICAgY2xfZXZlbnQgZXZlbnQ7CisgICAgY2xfaW50IGNsZTsKKyAgICBpbnQgZXJyLCBpbmRleCwgaTsKKworICAgIGluZGV4ID0gKGludHB0cl90KXNyYy0+ZGF0YVsxXTsKKyAgICBpZiAoaW5kZXggPj0gZnJhbWVzX3ByaXYtPm5iX21hcHBlZF9mcmFtZXMpIHsKKyAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiVGV4dHVyZSBhcnJheSBpbmRleCBvdXQgb2YgcmFuZ2UgZm9yICIKKyAgICAgICAgICAgICAgICJtYXBwaW5nOiAlZCA+PSAlZC5cbiIsIGluZGV4LCBmcmFtZXNfcHJpdi0+bmJfbWFwcGVkX2ZyYW1lcyk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0RFQlVHLCAiTWFwIEQzRDExIHRleHR1cmUgJWQgdG8gT3BlbkNMLlxuIiwKKyAgICAgICAgICAgaW5kZXgpOworCisgICAgZGVzYyA9ICZmcmFtZXNfcHJpdi0+bWFwcGVkX2ZyYW1lc1tpbmRleF07CisKKyAgICBjbGUgPSBkZXZpY2VfcHJpdi0+Y2xFbnF1ZXVlQWNxdWlyZUQzRDExT2JqZWN0c0tIUigKKyAgICAgICAgZnJhbWVzX3ByaXYtPmNvbW1hbmRfcXVldWUsIGRlc2MtPm5iX3BsYW5lcywgZGVzYy0+cGxhbmVzLAorICAgICAgICAwLCBOVUxMLCAmZXZlbnQpOworICAgIGlmIChjbGUgIT0gQ0xfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gYWNxdWlyZSBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICJoYW5kbGU6ICVkLlxuIiwgY2xlKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBlcnIgPSBvcGVuY2xfd2FpdF9ldmVudHMoZHN0X2ZjLCAmZXZlbnQsIDEpOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGVzYy0+bmJfcGxhbmVzOyBpKyspCisgICAgICAgIGRzdC0+ZGF0YVtpXSA9ICh1aW50OF90KilkZXNjLT5wbGFuZXNbaV07CisKKyAgICBlcnIgPSBmZl9od2ZyYW1lX21hcF9jcmVhdGUoZHN0LT5od19mcmFtZXNfY3R4LCBkc3QsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wZW5jbF91bm1hcF9mcm9tX2QzZDExLCBkZXNjKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZHN0LT53aWR0aCAgPSBzcmMtPndpZHRoOworICAgIGRzdC0+aGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBjbGUgPSBkZXZpY2VfcHJpdi0+Y2xFbnF1ZXVlUmVsZWFzZUQzRDExT2JqZWN0c0tIUigKKyAgICAgICAgZnJhbWVzX3ByaXYtPmNvbW1hbmRfcXVldWUsIGRlc2MtPm5iX3BsYW5lcywgZGVzYy0+cGxhbmVzLAorICAgICAgICAwLCBOVUxMLCAmZXZlbnQpOworICAgIGlmIChjbGUgPT0gQ0xfU1VDQ0VTUykKKyAgICAgICAgb3BlbmNsX3dhaXRfZXZlbnRzKGRzdF9mYywgJmV2ZW50LCAxKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG9wZW5jbF9mcmFtZXNfZGVyaXZlX2Zyb21fZDNkMTEoQVZIV0ZyYW1lc0NvbnRleHQgKmRzdF9mYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAqc3JjX2ZjLCBpbnQgZmxhZ3MpCit7CisgICAgQVZPcGVuQ0xEZXZpY2VDb250ZXh0ICAgICpkc3RfZGV2ID0gZHN0X2ZjLT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBBVkQzRDExVkFGcmFtZXNDb250ZXh0ICpzcmNfaHdjdHggPSBzcmNfZmMtPmh3Y3R4OworICAgIE9wZW5DTERldmljZUNvbnRleHQgICpkZXZpY2VfcHJpdiA9IGRzdF9mYy0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgT3BlbkNMRnJhbWVzQ29udGV4dCAgKmZyYW1lc19wcml2ID0gZHN0X2ZjLT5pbnRlcm5hbC0+cHJpdjsKKyAgICBjbF9tZW1fZmxhZ3MgY2xfZmxhZ3M7CisgICAgY2xfaW50IGNsZTsKKyAgICBpbnQgZXJyLCBpLCBwLCBuYl9wbGFuZXM7CisKKyAgICBpZiAoc3JjX2ZjLT5zd19mb3JtYXQgIT0gQVZfUElYX0ZNVF9OVjEyKSB7CisgICAgICAgIGF2X2xvZyhkc3RfZmMsIEFWX0xPR19FUlJPUiwgIk9ubHkgTlYxMiB0ZXh0dXJlcyBhcmUgc3VwcG9ydGVkICIKKyAgICAgICAgICAgICAgICJmb3IgRDNEMTEgdG8gT3BlbkNMIG1hcHBpbmcuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisgICAgbmJfcGxhbmVzID0gMjsKKworICAgIGlmIChzcmNfZmMtPmluaXRpYWxfcG9vbF9zaXplID09IDApIHsKKyAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiT25seSBmaXhlZC1zaXplIHBvb2xzIGFyZSBzdXBwb3J0ZWQgIgorICAgICAgICAgICAgICAgImZvciBEM0QxMSB0byBPcGVuQ0wgbWFwcGluZy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGNsX2ZsYWdzID0gb3BlbmNsX21lbV9mbGFnc19mb3JfbWFwcGluZyhmbGFncyk7CisgICAgaWYgKCFjbF9mbGFncykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGZyYW1lc19wcml2LT5uYl9tYXBwZWRfZnJhbWVzID0gc3JjX2ZjLT5pbml0aWFsX3Bvb2xfc2l6ZTsKKworICAgIGZyYW1lc19wcml2LT5tYXBwZWRfZnJhbWVzID0KKyAgICAgICAgYXZfbWFsbG9jel9hcnJheShmcmFtZXNfcHJpdi0+bmJfbWFwcGVkX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmZyYW1lc19wcml2LT5tYXBwZWRfZnJhbWVzKSk7CisgICAgaWYgKCFmcmFtZXNfcHJpdi0+bWFwcGVkX2ZyYW1lcykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBmcmFtZXNfcHJpdi0+bmJfbWFwcGVkX2ZyYW1lczsgaSsrKSB7CisgICAgICAgIEFWT3BlbkNMRnJhbWVEZXNjcmlwdG9yICpkZXNjID0gJmZyYW1lc19wcml2LT5tYXBwZWRfZnJhbWVzW2ldOworICAgICAgICBkZXNjLT5uYl9wbGFuZXMgPSBuYl9wbGFuZXM7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCBuYl9wbGFuZXM7IHArKykgeworICAgICAgICAgICAgVUlOVCBzdWJyZXNvdXJjZSA9IDIgKiBpICsgcDsKKworICAgICAgICAgICAgZGVzYy0+cGxhbmVzW3BdID0KKyAgICAgICAgICAgICAgICBkZXZpY2VfcHJpdi0+Y2xDcmVhdGVGcm9tRDNEMTFUZXh0dXJlMkRLSFIoCisgICAgICAgICAgICAgICAgICAgIGRzdF9kZXYtPmNvbnRleHQsIGNsX2ZsYWdzLCBzcmNfaHdjdHgtPnRleHR1cmUsCisgICAgICAgICAgICAgICAgICAgIHN1YnJlc291cmNlLCAmY2xlKTsKKyAgICAgICAgICAgIGlmICghZGVzYy0+cGxhbmVzW3BdKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBDTCAiCisgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZSBmcm9tIHBsYW5lICVkIG9mIEQzRCB0ZXh0dXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImluZGV4ICVkIChzdWJyZXNvdXJjZSAldSk6ICVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcCwgaSwgKHVuc2lnbmVkIGludClzdWJyZXNvdXJjZSwgY2xlKTsKKyAgICAgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lc19wcml2LT5uYl9tYXBwZWRfZnJhbWVzOyBpKyspIHsKKyAgICAgICAgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgKmRlc2MgPSAmZnJhbWVzX3ByaXYtPm1hcHBlZF9mcmFtZXNbaV07CisgICAgICAgIGZvciAocCA9IDA7IHAgPCBkZXNjLT5uYl9wbGFuZXM7IHArKykgeworICAgICAgICAgICAgaWYgKGRlc2MtPnBsYW5lc1twXSkKKyAgICAgICAgICAgICAgICBjbFJlbGVhc2VNZW1PYmplY3QoZGVzYy0+cGxhbmVzW3BdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlcCgmZnJhbWVzX3ByaXYtPm1hcHBlZF9mcmFtZXMpOworICAgIGZyYW1lc19wcml2LT5uYl9tYXBwZWRfZnJhbWVzID0gMDsKKyAgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKKworI2lmIEhBVkVfT1BFTkNMX0RSTV9BUk0KKwordHlwZWRlZiBzdHJ1Y3QgRFJNQVJNdG9PcGVuQ0xNYXBwaW5nIHsKKyAgICBpbnQgbmJfb2JqZWN0czsKKyAgICBjbF9tZW0gb2JqZWN0X2J1ZmZlcnNbQVZfRFJNX01BWF9QTEFORVNdOworICAgIGludCBuYl9wbGFuZXM7CisgICAgY2xfbWVtIHBsYW5lX2ltYWdlc1tBVl9EUk1fTUFYX1BMQU5FU107Cit9IERSTUFSTXRvT3BlbkNMTWFwcGluZzsKKworc3RhdGljIHZvaWQgb3BlbmNsX3VubWFwX2Zyb21fZHJtX2FybShBVkhXRnJhbWVzQ29udGV4dCAqZHN0X2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV01hcERlc2NyaXB0b3IgKmh3bWFwKQoreworICAgIERSTUFSTXRvT3BlbkNMTWFwcGluZyAqbWFwcGluZyA9IGh3bWFwLT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IG1hcHBpbmctPm5iX3BsYW5lczsgaSsrKQorICAgICAgICBjbFJlbGVhc2VNZW1PYmplY3QobWFwcGluZy0+cGxhbmVfaW1hZ2VzW2ldKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXBwaW5nLT5uYl9vYmplY3RzOyBpKyspCisgICAgICAgIGNsUmVsZWFzZU1lbU9iamVjdChtYXBwaW5nLT5vYmplY3RfYnVmZmVyc1tpXSk7CisKKyAgICBhdl9mcmVlKG1hcHBpbmcpOworfQorCitzdGF0aWMgaW50IG9wZW5jbF9tYXBfZnJvbV9kcm1fYXJtKEFWSFdGcmFtZXNDb250ZXh0ICpkc3RfZmMsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKnNyY19mYyA9CisgICAgICAgIChBVkhXRnJhbWVzQ29udGV4dCopc3JjLT5od19mcmFtZXNfY3R4LT5kYXRhOworICAgIEFWT3BlbkNMRGV2aWNlQ29udGV4dCAqZHN0X2RldiA9IGRzdF9mYy0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgY29uc3QgQVZEUk1GcmFtZURlc2NyaXB0b3IgKmRlc2M7CisgICAgRFJNQVJNdG9PcGVuQ0xNYXBwaW5nICptYXBwaW5nID0gTlVMTDsKKyAgICBjbF9tZW1fZmxhZ3MgY2xfZmxhZ3M7CisgICAgY29uc3QgY2xfaW1wb3J0X3Byb3BlcnRpZXNfYXJtIHByb3BzWzNdID0geworICAgICAgICBDTF9JTVBPUlRfVFlQRV9BUk0sIENMX0lNUE9SVF9UWVBFX0RNQV9CVUZfQVJNLCAwLAorICAgIH07CisgICAgY2xfaW50IGNsZTsKKyAgICBpbnQgZXJyLCBpLCBqOworCisgICAgZGVzYyA9IChjb25zdCBBVkRSTUZyYW1lRGVzY3JpcHRvciopc3JjLT5kYXRhWzBdOworCisgICAgY2xfZmxhZ3MgPSBvcGVuY2xfbWVtX2ZsYWdzX2Zvcl9tYXBwaW5nKGZsYWdzKTsKKyAgICBpZiAoIWNsX2ZsYWdzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgbWFwcGluZyA9IGF2X21hbGxvY3ooc2l6ZW9mKCptYXBwaW5nKSk7CisgICAgaWYgKCFtYXBwaW5nKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgbWFwcGluZy0+bmJfb2JqZWN0cyA9IGRlc2MtPm5iX29iamVjdHM7CisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX29iamVjdHM7IGkrKykgeworICAgICAgICBpbnQgZmQgPSBkZXNjLT5vYmplY3RzW2ldLmZkOworCisgICAgICAgIGF2X2xvZyhkc3RfZmMsIEFWX0xPR19ERUJVRywgIk1hcCBEUk0gUFJJTUUgZmQgJWQgdG8gT3BlbkNMLlxuIiwgZmQpOworCisgICAgICAgIGlmIChkZXNjLT5vYmplY3RzW2ldLmZvcm1hdF9tb2RpZmllcikgeworICAgICAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0RFQlVHLCAiV2FybmluZzogb2JqZWN0ICVkIGZkICVkIGhhcyAiCisgICAgICAgICAgICAgICAgICAgIm5vbnplcm8gZm9ybWF0IG1vZGlmaWVyICUiUFJJZDY0IiwgcmVzdWx0IG1heSBub3QgIgorICAgICAgICAgICAgICAgICAgICJiZSBhcyBleHBlY3RlZC5cbiIsIGksIGZkLAorICAgICAgICAgICAgICAgICAgIGRlc2MtPm9iamVjdHNbaV0uZm9ybWF0X21vZGlmaWVyKTsKKyAgICAgICAgfQorCisgICAgICAgIG1hcHBpbmctPm9iamVjdF9idWZmZXJzW2ldID0KKyAgICAgICAgICAgIGNsSW1wb3J0TWVtb3J5QVJNKGRzdF9kZXYtPmNvbnRleHQsIGNsX2ZsYWdzLCBwcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZCwgZGVzYy0+b2JqZWN0c1tpXS5zaXplLCAmY2xlKTsKKyAgICAgICAgaWYgKCFtYXBwaW5nLT5vYmplY3RfYnVmZmVyc1tpXSkgeworICAgICAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBDTCBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICJmcm9tIG9iamVjdCAlZCAoZmQgJWQsIHNpemUgJSJTSVpFX1NQRUNJRklFUiIpIG9mIERSTSBmcmFtZTogJWQuXG4iLAorICAgICAgICAgICAgICAgICAgIGksIGZkLCBkZXNjLT5vYmplY3RzW2ldLnNpemUsIGNsZSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtYXBwaW5nLT5uYl9wbGFuZXMgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXNjLT5uYl9sYXllcnM7IGkrKykgeworICAgICAgICBjb25zdCBBVkRSTUxheWVyRGVzY3JpcHRvciAqbGF5ZXIgPSAmZGVzYy0+bGF5ZXJzW2ldOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsYXllci0+bmJfcGxhbmVzOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEFWRFJNUGxhbmVEZXNjcmlwdG9yICpwbGFuZSA9ICZsYXllci0+cGxhbmVzW2pdOworICAgICAgICAgICAgY2xfbWVtIHBsYW5lX2J1ZmZlcjsKKyAgICAgICAgICAgIGNsX2ltYWdlX2Zvcm1hdCBpbWFnZV9mb3JtYXQ7CisgICAgICAgICAgICBjbF9pbWFnZV9kZXNjICAgaW1hZ2VfZGVzYzsKKyAgICAgICAgICAgIGNsX2J1ZmZlcl9yZWdpb24gcmVnaW9uOworICAgICAgICAgICAgaW50IHAgPSBtYXBwaW5nLT5uYl9wbGFuZXM7CisKKyAgICAgICAgICAgIGVyciA9IG9wZW5jbF9nZXRfcGxhbmVfZm9ybWF0KHNyY19mYy0+c3dfZm9ybWF0LCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2ZjLT53aWR0aCwgc3JjX2ZjLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VfZm9ybWF0LCAmaW1hZ2VfZGVzYyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhkc3RfZmMsIEFWX0xPR19FUlJPUiwgIkludmFsaWQgcGxhbmUgJWQgKERSTSAiCisgICAgICAgICAgICAgICAgICAgICAgICJsYXllciAlZCBwbGFuZSAlZCk6ICVkLlxuIiwgcCwgaSwgaiwgZXJyKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlZ2lvbi5vcmlnaW4gPSBwbGFuZS0+b2Zmc2V0OworICAgICAgICAgICAgcmVnaW9uLnNpemUgICA9IGltYWdlX2Rlc2MuaW1hZ2Vfcm93X3BpdGNoICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9kZXNjLmltYWdlX2hlaWdodDsKKworICAgICAgICAgICAgcGxhbmVfYnVmZmVyID0KKyAgICAgICAgICAgICAgICBjbENyZWF0ZVN1YkJ1ZmZlcihtYXBwaW5nLT5vYmplY3RfYnVmZmVyc1twbGFuZS0+b2JqZWN0X2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9CVUZGRVJfQ1JFQVRFX1RZUEVfUkVHSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWdpb24sICZjbGUpOworICAgICAgICAgICAgaWYgKCFwbGFuZV9idWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIHN1Yi1idWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHBsYW5lICVkOiAlZC5cbiIsIHAsIGNsZSk7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW1hZ2VfZGVzYy5idWZmZXIgPSBwbGFuZV9idWZmZXI7CisKKyAgICAgICAgICAgIG1hcHBpbmctPnBsYW5lX2ltYWdlc1twXSA9CisgICAgICAgICAgICAgICAgY2xDcmVhdGVJbWFnZShkc3RfZGV2LT5jb250ZXh0LCBjbF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZV9mb3JtYXQsICZpbWFnZV9kZXNjLCBOVUxMLCAmY2xlKTsKKworICAgICAgICAgICAgLy8gVW5yZWZlcmVuY2UgdGhlIHN1Yi1idWZmZXIgaW1tZWRpYXRlbHkgLSB3ZSBkb24ndCBuZWVkIGl0CisgICAgICAgICAgICAvLyBkaXJlY3RseSBhbmQgYSByZWZlcmVuY2UgaXMgaGVsZCBieSB0aGUgaW1hZ2UuCisgICAgICAgICAgICBjbFJlbGVhc2VNZW1PYmplY3QocGxhbmVfYnVmZmVyKTsKKworICAgICAgICAgICAgaWYgKCFtYXBwaW5nLT5wbGFuZV9pbWFnZXNbcF0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIGltYWdlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZvciBwbGFuZSAlZDogJWQuXG4iLCBwLCBjbGUpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrbWFwcGluZy0+bmJfcGxhbmVzOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IG1hcHBpbmctPm5iX3BsYW5lczsgaSsrKQorICAgICAgICBkc3QtPmRhdGFbaV0gPSAodWludDhfdCopbWFwcGluZy0+cGxhbmVfaW1hZ2VzW2ldOworCisgICAgZXJyID0gZmZfaHdmcmFtZV9tYXBfY3JlYXRlKGRzdC0+aHdfZnJhbWVzX2N0eCwgZHN0LCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcGVuY2xfdW5tYXBfZnJvbV9kcm1fYXJtLCBtYXBwaW5nKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZHN0LT53aWR0aCAgPSBzcmMtPndpZHRoOworICAgIGRzdC0+aGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWFwcGluZy0+bmJfcGxhbmVzOyBpKyspIHsKKyAgICAgICAgY2xSZWxlYXNlTWVtT2JqZWN0KG1hcHBpbmctPnBsYW5lX2ltYWdlc1tpXSk7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBtYXBwaW5nLT5uYl9vYmplY3RzOyBpKyspIHsKKyAgICAgICAgaWYgKG1hcHBpbmctPm9iamVjdF9idWZmZXJzW2ldKQorICAgICAgICAgICAgY2xSZWxlYXNlTWVtT2JqZWN0KG1hcHBpbmctPm9iamVjdF9idWZmZXJzW2ldKTsKKyAgICB9CisgICAgYXZfZnJlZShtYXBwaW5nKTsKKyAgICByZXR1cm4gZXJyOworfQorCisjZW5kaWYKKworc3RhdGljIGludCBvcGVuY2xfbWFwX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKQoreworICAgIGF2X2Fzc2VydDAoc3JjLT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9PUEVOQ0wpOworICAgIGlmIChod2ZjLT5zd19mb3JtYXQgIT0gZHN0LT5mb3JtYXQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgcmV0dXJuIG9wZW5jbF9tYXBfZnJhbWUoaHdmYywgZHN0LCBzcmMsIGZsYWdzKTsKK30KKworc3RhdGljIGludCBvcGVuY2xfbWFwX3RvKEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjLCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpCit7CisgICAgT3BlbkNMRGV2aWNlQ29udGV4dCAqcHJpdiA9IGh3ZmMtPmRldmljZV9jdHgtPmludGVybmFsLT5wcml2OworICAgIGF2X2Fzc2VydDAoZHN0LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9PUEVOQ0wpOworICAgIHN3aXRjaCAoc3JjLT5mb3JtYXQpIHsKKyNpZiBIQVZFX09QRU5DTF9EUk1fQkVJR05FVAorICAgIGNhc2UgQVZfUElYX0ZNVF9EUk1fUFJJTUU6CisgICAgICAgIGlmIChwcml2LT5iZWlnbmV0X2RybV9tYXBwaW5nX3VzYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBvcGVuY2xfbWFwX2Zyb21fZHJtX2JlaWduZXQoaHdmYywgZHN0LCBzcmMsIGZsYWdzKTsKKyNlbmRpZgorI2lmIEhBVkVfT1BFTkNMX1ZBQVBJX0JFSUdORVQKKyAgICBjYXNlIEFWX1BJWF9GTVRfVkFBUEk6CisgICAgICAgIGlmIChwcml2LT5iZWlnbmV0X2RybV9tYXBwaW5nX3VzYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBvcGVuY2xfbWFwX2Zyb21fdmFhcGkoaHdmYywgZHN0LCBzcmMsIGZsYWdzKTsKKyNlbmRpZgorI2lmIEhBVkVfT1BFTkNMX1ZBQVBJX0lOVEVMX01FRElBCisgICAgY2FzZSBBVl9QSVhfRk1UX1FTVjoKKyAgICBjYXNlIEFWX1BJWF9GTVRfVkFBUEk6CisgICAgICAgIGlmIChwcml2LT5xc3ZfbWFwcGluZ191c2FibGUpCisgICAgICAgICAgICByZXR1cm4gb3BlbmNsX21hcF9mcm9tX3Fzdihod2ZjLCBkc3QsIHNyYywgZmxhZ3MpOworI2VuZGlmCisjaWYgSEFWRV9PUEVOQ0xfRFhWQTIKKyAgICBjYXNlIEFWX1BJWF9GTVRfRFhWQTJfVkxEOgorICAgICAgICBpZiAocHJpdi0+ZHh2YTJfbWFwcGluZ191c2FibGUpCisgICAgICAgICAgICByZXR1cm4gb3BlbmNsX21hcF9mcm9tX2R4dmEyKGh3ZmMsIGRzdCwgc3JjLCBmbGFncyk7CisjZW5kaWYKKyNpZiBIQVZFX09QRU5DTF9EM0QxMQorICAgIGNhc2UgQVZfUElYX0ZNVF9EM0QxMToKKyAgICAgICAgaWYgKHByaXYtPmQzZDExX21hcHBpbmdfdXNhYmxlKQorICAgICAgICAgICAgcmV0dXJuIG9wZW5jbF9tYXBfZnJvbV9kM2QxMShod2ZjLCBkc3QsIHNyYywgZmxhZ3MpOworI2VuZGlmCisjaWYgSEFWRV9PUEVOQ0xfRFJNX0FSTQorICAgIGNhc2UgQVZfUElYX0ZNVF9EUk1fUFJJTUU6CisgICAgICAgIGlmIChwcml2LT5kcm1fYXJtX21hcHBpbmdfdXNhYmxlKQorICAgICAgICAgICAgcmV0dXJuIG9wZW5jbF9tYXBfZnJvbV9kcm1fYXJtKGh3ZmMsIGRzdCwgc3JjLCBmbGFncyk7CisjZW5kaWYKKyAgICB9CisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworc3RhdGljIGludCBvcGVuY2xfZnJhbWVzX2Rlcml2ZV90byhBVkhXRnJhbWVzQ29udGV4dCAqZHN0X2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAqc3JjX2ZjLCBpbnQgZmxhZ3MpCit7CisgICAgT3BlbkNMRGV2aWNlQ29udGV4dCAqcHJpdiA9IGRzdF9mYy0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgc3dpdGNoIChzcmNfZmMtPmRldmljZV9jdHgtPnR5cGUpIHsKKyNpZiBIQVZFX09QRU5DTF9EUk1fQkVJR05FVAorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9EUk06CisgICAgICAgIGlmICghcHJpdi0+YmVpZ25ldF9kcm1fbWFwcGluZ191c2FibGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIEhBVkVfT1BFTkNMX1ZBQVBJX0JFSUdORVQKKyAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfVkFBUEk6CisgICAgICAgIGlmICghcHJpdi0+YmVpZ25ldF9kcm1fbWFwcGluZ191c2FibGUpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIEhBVkVfT1BFTkNMX1ZBQVBJX0lOVEVMX01FRElBCisgICAgY2FzZSBBVl9IV0RFVklDRV9UWVBFX1FTVjoKKyAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfVkFBUEk6CisgICAgICAgIGlmICghcHJpdi0+cXN2X21hcHBpbmdfdXNhYmxlKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBIQVZFX09QRU5DTF9EWFZBMgorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9EWFZBMjoKKyAgICAgICAgaWYgKCFwcml2LT5keHZhMl9tYXBwaW5nX3VzYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICBlcnIgPSBvcGVuY2xfZnJhbWVzX2Rlcml2ZV9mcm9tX2R4dmEyKGRzdF9mYywgc3JjX2ZjLCBmbGFncyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgSEFWRV9PUEVOQ0xfRDNEMTEKKyAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfRDNEMTFWQToKKyAgICAgICAgaWYgKCFwcml2LT5kM2QxMV9tYXBwaW5nX3VzYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBlcnI7CisgICAgICAgICAgICBlcnIgPSBvcGVuY2xfZnJhbWVzX2Rlcml2ZV9mcm9tX2QzZDExKGRzdF9mYywgc3JjX2ZjLCBmbGFncyk7CisgICAgICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgSEFWRV9PUEVOQ0xfRFJNX0FSTQorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9EUk06CisgICAgICAgIGlmICghcHJpdi0+ZHJtX2FybV9tYXBwaW5nX3VzYWJsZSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisgICAgcmV0dXJuIG9wZW5jbF9mcmFtZXNfaW5pdF9jb21tYW5kX3F1ZXVlKGRzdF9mYyk7Cit9CisKK2NvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfb3BlbmNsID0geworICAgIC50eXBlICAgICAgICAgICAgICAgICAgID0gQVZfSFdERVZJQ0VfVFlQRV9PUEVOQ0wsCisgICAgLm5hbWUgICAgICAgICAgICAgICAgICAgPSAiT3BlbkNMIiwKKworICAgIC5kZXZpY2VfaHdjdHhfc2l6ZSAgICAgID0gc2l6ZW9mKEFWT3BlbkNMRGV2aWNlQ29udGV4dCksCisgICAgLmRldmljZV9wcml2X3NpemUgICAgICAgPSBzaXplb2YoT3BlbkNMRGV2aWNlQ29udGV4dCksCisgICAgLmZyYW1lc19od2N0eF9zaXplICAgICAgPSBzaXplb2YoQVZPcGVuQ0xGcmFtZXNDb250ZXh0KSwKKyAgICAuZnJhbWVzX3ByaXZfc2l6ZSAgICAgICA9IHNpemVvZihPcGVuQ0xGcmFtZXNDb250ZXh0KSwKKworICAgIC5kZXZpY2VfY3JlYXRlICAgICAgICAgID0gJm9wZW5jbF9kZXZpY2VfY3JlYXRlLAorICAgIC5kZXZpY2VfZGVyaXZlICAgICAgICAgID0gJm9wZW5jbF9kZXZpY2VfZGVyaXZlLAorICAgIC5kZXZpY2VfaW5pdCAgICAgICAgICAgID0gJm9wZW5jbF9kZXZpY2VfaW5pdCwKKyAgICAuZGV2aWNlX3VuaW5pdCAgICAgICAgICA9ICZvcGVuY2xfZGV2aWNlX3VuaW5pdCwKKworICAgIC5mcmFtZXNfZ2V0X2NvbnN0cmFpbnRzID0gJm9wZW5jbF9mcmFtZXNfZ2V0X2NvbnN0cmFpbnRzLAorICAgIC5mcmFtZXNfaW5pdCAgICAgICAgICAgID0gJm9wZW5jbF9mcmFtZXNfaW5pdCwKKyAgICAuZnJhbWVzX3VuaW5pdCAgICAgICAgICA9ICZvcGVuY2xfZnJhbWVzX3VuaW5pdCwKKyAgICAuZnJhbWVzX2dldF9idWZmZXIgICAgICA9ICZvcGVuY2xfZ2V0X2J1ZmZlciwKKworICAgIC50cmFuc2Zlcl9nZXRfZm9ybWF0cyAgID0gJm9wZW5jbF90cmFuc2Zlcl9nZXRfZm9ybWF0cywKKyAgICAudHJhbnNmZXJfZGF0YV90byAgICAgICA9ICZvcGVuY2xfdHJhbnNmZXJfZGF0YV90bywKKyAgICAudHJhbnNmZXJfZGF0YV9mcm9tICAgICA9ICZvcGVuY2xfdHJhbnNmZXJfZGF0YV9mcm9tLAorCisgICAgLm1hcF9mcm9tICAgICAgICAgICAgICAgPSAmb3BlbmNsX21hcF9mcm9tLAorICAgIC5tYXBfdG8gICAgICAgICAgICAgICAgID0gJm9wZW5jbF9tYXBfdG8sCisgICAgLmZyYW1lc19kZXJpdmVfdG8gICAgICAgPSAmb3BlbmNsX2ZyYW1lc19kZXJpdmVfdG8sCisKKyAgICAucGl4X2ZtdHMgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10pIHsKKyAgICAgICAgQVZfUElYX0ZNVF9PUEVOQ0wsCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2h3Y29udGV4dF9vcGVuY2wuaCBiL2xpYmF2dXRpbC9od2NvbnRleHRfb3BlbmNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1NDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHRfb3BlbmNsLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfSFdDT05URVhUX09QRU5DTF9ICisjZGVmaW5lIEFWVVRJTF9IV0NPTlRFWFRfT1BFTkNMX0gKKworI2lmZGVmIF9fQVBQTEVfXworI2luY2x1ZGUgPE9wZW5DTC9jbC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxDTC9jbC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJmcmFtZS5oIgorCisvKioKKyAqIEBmaWxlCisgKiBBUEktc3BlY2lmaWMgaGVhZGVyIGZvciBBVl9IV0RFVklDRV9UWVBFX09QRU5DTC4KKyAqCisgKiBQb29scyBhbGxvY2F0ZWQgaW50ZXJuYWxseSBhcmUgYWx3YXlzIGR5bmFtaWMsIGFuZCBhcmUgcHJpbWFyaWx5IGludGVuZGVkCisgKiB0byBiZSB1c2VkIGluIE9wZW5DTC1vbmx5IGNhc2VzLiAgSWYgaW50ZXJvcGVyYXRpb24gaXMgcmVxdWlyZWQsIGl0IGlzCisgKiB0eXBpY2FsbHkgcmVxdWlyZWQgdG8gYWxsb2NhdGUgZnJhbWVzIGluIHRoZSBvdGhlciBBUEkgYW5kIHRoZW4gbWFwIHRoZQorICogZnJhbWVzIGNvbnRleHQgdG8gT3BlbkNMIHdpdGggYXZfaHdmcmFtZV9jdHhfY3JlYXRlX2Rlcml2ZWQoKS4KKyAqLworCisvKioKKyAqIE9wZW5DTCBmcmFtZSBkZXNjcmlwdG9yIGZvciBwb29sIGFsbG9jYXRpb24uCisgKgorICogSW4gdXNlci1hbGxvY2F0ZWQgcG9vbHMsIEFWSFdGcmFtZXNDb250ZXh0LnBvb2wgbXVzdCByZXR1cm4gQVZCdWZmZXJSZWZzCisgKiB3aXRoIHRoZSBkYXRhIHBvaW50ZXIgcG9pbnRpbmcgYXQgYW4gb2JqZWN0IG9mIHRoaXMgdHlwZSBkZXNjcmliaW5nIHRoZQorICogcGxhbmVzIG9mIHRoZSBmcmFtZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZPcGVuQ0xGcmFtZURlc2NyaXB0b3IgeworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBwbGFuZXMgaW4gdGhlIGZyYW1lLgorICAgICAqLworICAgIGludCBuYl9wbGFuZXM7CisgICAgLyoqCisgICAgICogT3BlbkNMIGltYWdlMmQgb2JqZWN0cyBmb3IgZWFjaCBwbGFuZSBvZiB0aGUgZnJhbWUuCisgICAgICovCisgICAgY2xfbWVtIHBsYW5lc1tBVl9OVU1fREFUQV9QT0lOVEVSU107Cit9IEFWT3BlbkNMRnJhbWVEZXNjcmlwdG9yOworCisvKioKKyAqIE9wZW5DTCBkZXZpY2UgZGV0YWlscy4KKyAqCisgKiBBbGxvY2F0ZWQgYXMgQVZIV0RldmljZUNvbnRleHQuaHdjdHgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZPcGVuQ0xEZXZpY2VDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBUaGUgcHJpbWFyeSBkZXZpY2UgSUQgb2YgdGhlIGRldmljZS4gIElmIG11bHRpcGxlIE9wZW5DTCBkZXZpY2VzCisgICAgICogYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dCB0aGVuIHRoaXMgaXMgdGhlIG9uZSB3aGljaCB3aWxsCisgICAgICogYmUgdXNlZCBmb3IgYWxsIG9wZXJhdGlvbnMgaW50ZXJuYWwgdG8gRkZtcGVnLgorICAgICAqLworICAgIGNsX2RldmljZV9pZCBkZXZpY2VfaWQ7CisgICAgLyoqCisgICAgICogVGhlIE9wZW5DTCBjb250ZXh0IHdoaWNoIHdpbGwgY29udGFpbiBhbGwgb3BlcmF0aW9ucyBhbmQgZnJhbWVzIG9uCisgICAgICogdGhpcyBkZXZpY2UuCisgICAgICovCisgICAgY2xfY29udGV4dCBjb250ZXh0OworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGNvbW1hbmQgcXVldWUgZm9yIHRoaXMgZGV2aWNlLCB3aGljaCB3aWxsIGJlIHVzZWQgYnkgYWxsCisgICAgICogZnJhbWVzIGNvbnRleHRzIHdoaWNoIGRvIG5vdCBoYXZlIHRoZWlyIG93biBjb21tYW5kIHF1ZXVlLiAgSWYgbm90CisgICAgICogaW50aWFsaXNlZCBieSB0aGUgdXNlciwgYSBkZWZhdWx0IHF1ZXVlIHdpbGwgYmUgY3JlYXRlZCBvbiB0aGUKKyAgICAgKiBwcmltYXJ5IGRldmljZS4KKyAgICAgKi8KKyAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWU7Cit9IEFWT3BlbkNMRGV2aWNlQ29udGV4dDsKKworLyoqCisgKiBPcGVuQ0wtc3BlY2lmaWMgZGF0YSBhc3NvY2lhdGVkIHdpdGggYSBmcmFtZSBwb29sLgorICoKKyAqIEFsbG9jYXRlZCBhcyBBVkhXRnJhbWVzQ29udGV4dC5od2N0eC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZPcGVuQ0xGcmFtZXNDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBUaGUgY29tbWFuZCBxdWV1ZSB1c2VkIGZvciBpbnRlcm5hbCBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBvbiB0aGlzCisgICAgICogZGV2aWNlIChhdl9od2ZyYW1lX3RyYW5zZmVyX2RhdGEoKSwgYXZfaHdmcmFtZV9tYXAoKSkuCisgICAgICoKKyAgICAgKiBJZiB0aGlzIGlzIG5vdCBzZXQsIHRoZSBjb21tYW5kIHF1ZXVlIGZyb20gdGhlIGFzc29jaWF0ZWQgZGV2aWNlIGlzCisgICAgICogdXNlZCBpbnN0ZWFkLgorICAgICAqLworICAgIGNsX2NvbW1hbmRfcXVldWUgY29tbWFuZF9xdWV1ZTsKK30gQVZPcGVuQ0xGcmFtZXNDb250ZXh0OworCisjZW5kaWYgLyogQVZVVElMX0hXQ09OVEVYVF9PUEVOQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2h3Y29udGV4dF9xc3YuYyBiL2xpYmF2dXRpbC9od2NvbnRleHRfcXN2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwMDkxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHRfcXN2LmMKQEAgLTAsMCArMSwxMTQ3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1meC9tZnh2aWRlby5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBDT05GSUdfVkFBUEkKKyNpbmNsdWRlICJod2NvbnRleHRfdmFhcGkuaCIKKyNlbmRpZgorI2lmIENPTkZJR19EWFZBMgorI2luY2x1ZGUgImh3Y29udGV4dF9keHZhMi5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJod2NvbnRleHQuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfcXN2LmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAicGl4Zm10LmgiCisjaW5jbHVkZSAicGl4ZGVzYy5oIgorI2luY2x1ZGUgInRpbWUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgUVNWRGV2aWNlUHJpdiB7CisgICAgQVZCdWZmZXJSZWYgKmNoaWxkX2RldmljZV9jdHg7Cit9IFFTVkRldmljZVByaXY7CisKK3R5cGVkZWYgc3RydWN0IFFTVkRldmljZUNvbnRleHQgeworICAgIG1meEhETCAgICAgICAgICAgICAgaGFuZGxlOworICAgIG1meEhhbmRsZVR5cGUgICAgICAgaGFuZGxlX3R5cGU7CisgICAgbWZ4VmVyc2lvbiAgICAgICAgICB2ZXI7CisgICAgbWZ4SU1QTCAgICAgICAgICAgICBpbXBsOworCisgICAgZW51bSBBVkhXRGV2aWNlVHlwZSBjaGlsZF9kZXZpY2VfdHlwZTsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgIGNoaWxkX3BpeF9mbXQ7Cit9IFFTVkRldmljZUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFFTVkZyYW1lc0NvbnRleHQgeworICAgIG1meFNlc3Npb24gc2Vzc2lvbl9kb3dubG9hZDsKKyAgICBtZnhTZXNzaW9uIHNlc3Npb25fdXBsb2FkOworCisgICAgQVZCdWZmZXJSZWYgKmNoaWxkX2ZyYW1lc19yZWY7CisgICAgbWZ4RnJhbWVTdXJmYWNlMSAqc3VyZmFjZXNfaW50ZXJuYWw7CisgICAgaW50ICAgICAgICAgICAgIG5iX3N1cmZhY2VzX3VzZWQ7CisKKyAgICAvLyB1c2VkIGluIHRoZSBmcmFtZSBhbGxvY2F0b3IgZm9yIG5vbi1vcGFxdWUgc3VyZmFjZXMKKyAgICBtZnhNZW1JZCAqbWVtX2lkczsKKyAgICAvLyB1c2VkIGluIHRoZSBvcGFxdWUgYWxsb2MgcmVxdWVzdCBmb3Igb3BhcXVlIHN1cmZhY2VzCisgICAgbWZ4RnJhbWVTdXJmYWNlMSAqKnN1cmZhY2VfcHRyczsKKworICAgIG1meEV4dE9wYXF1ZVN1cmZhY2VBbGxvYyBvcGFxdWVfYWxsb2M7CisgICAgbWZ4RXh0QnVmZmVyICpleHRfYnVmZmVyc1sxXTsKK30gUVNWRnJhbWVzQ29udGV4dDsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgbWZ4SGFuZGxlVHlwZSBoYW5kbGVfdHlwZTsKKyAgICBlbnVtIEFWSFdEZXZpY2VUeXBlIGRldmljZV90eXBlOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCAgcGl4X2ZtdDsKK30gc3VwcG9ydGVkX2hhbmRsZV90eXBlc1tdID0geworI2lmIENPTkZJR19WQUFQSQorICAgIHsgTUZYX0hBTkRMRV9WQV9ESVNQTEFZLCAgICAgICAgICBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJLCBBVl9QSVhfRk1UX1ZBQVBJIH0sCisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICB7IE1GWF9IQU5ETEVfRDNEOV9ERVZJQ0VfTUFOQUdFUiwgQVZfSFdERVZJQ0VfVFlQRV9EWFZBMiwgQVZfUElYX0ZNVF9EWFZBMl9WTEQgfSwKKyNlbmRpZgorICAgIHsgMCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgdWludDMyX3QgICAgICAgICAgIGZvdXJjYzsKK30gc3VwcG9ydGVkX3BpeGVsX2Zvcm1hdHNbXSA9IHsKKyAgICB7IEFWX1BJWF9GTVRfTlYxMiwgTUZYX0ZPVVJDQ19OVjEyIH0sCisgICAgeyBBVl9QSVhfRk1UX1AwMTAsIE1GWF9GT1VSQ0NfUDAxMCB9LAorICAgIHsgQVZfUElYX0ZNVF9QQUw4LCBNRlhfRk9VUkNDX1A4ICAgfSwKK307CisKK3N0YXRpYyB1aW50MzJfdCBxc3ZfZm91cmNjX2Zyb21fcGl4X2ZtdChlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc3VwcG9ydGVkX3BpeGVsX2Zvcm1hdHMpOyBpKyspIHsKKyAgICAgICAgaWYgKHN1cHBvcnRlZF9waXhlbF9mb3JtYXRzW2ldLnBpeF9mbXQgPT0gcGl4X2ZtdCkKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRfcGl4ZWxfZm9ybWF0c1tpXS5mb3VyY2M7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzdl9kZXZpY2VfaW5pdChBVkhXRGV2aWNlQ29udGV4dCAqY3R4KQoreworICAgIEFWUVNWRGV2aWNlQ29udGV4dCAqaHdjdHggPSBjdHgtPmh3Y3R4OworICAgIFFTVkRldmljZUNvbnRleHQgICAgICAgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworCisgICAgbWZ4U3RhdHVzIGVycjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IHN1cHBvcnRlZF9oYW5kbGVfdHlwZXNbaV0uaGFuZGxlX3R5cGU7IGkrKykgeworICAgICAgICBlcnIgPSBNRlhWaWRlb0NPUkVfR2V0SGFuZGxlKGh3Y3R4LT5zZXNzaW9uLCBzdXBwb3J0ZWRfaGFuZGxlX3R5cGVzW2ldLmhhbmRsZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5oYW5kbGUpOworICAgICAgICBpZiAoZXJyID09IE1GWF9FUlJfTk9ORSkgeworICAgICAgICAgICAgcy0+aGFuZGxlX3R5cGUgICAgICAgPSBzdXBwb3J0ZWRfaGFuZGxlX3R5cGVzW2ldLmhhbmRsZV90eXBlOworICAgICAgICAgICAgcy0+Y2hpbGRfZGV2aWNlX3R5cGUgPSBzdXBwb3J0ZWRfaGFuZGxlX3R5cGVzW2ldLmRldmljZV90eXBlOworICAgICAgICAgICAgcy0+Y2hpbGRfcGl4X2ZtdCAgICAgPSBzdXBwb3J0ZWRfaGFuZGxlX3R5cGVzW2ldLnBpeF9mbXQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXMtPmhhbmRsZSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIk5vIHN1cHBvcnRlZCBodyBoYW5kbGUgY291bGQgYmUgcmV0cmlldmVkICIKKyAgICAgICAgICAgICAgICJmcm9tIHRoZSBzZXNzaW9uXG4iKTsKKyAgICB9CisKKyAgICBlcnIgPSBNRlhRdWVyeUlNUEwoaHdjdHgtPnNlc3Npb24sICZzLT5pbXBsKTsKKyAgICBpZiAoZXJyID09IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgZXJyID0gTUZYUXVlcnlWZXJzaW9uKGh3Y3R4LT5zZXNzaW9uLCAmcy0+dmVyKTsKKyAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBxdWVyeWluZyB0aGUgc2Vzc2lvbiBhdHRyaWJ1dGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcXN2X2ZyYW1lc191bmluaXQoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCkKK3sKKyAgICBRU1ZGcmFtZXNDb250ZXh0ICpzID0gY3R4LT5pbnRlcm5hbC0+cHJpdjsKKworICAgIGlmIChzLT5zZXNzaW9uX2Rvd25sb2FkKSB7CisgICAgICAgIE1GWFZpZGVvVlBQX0Nsb3NlKHMtPnNlc3Npb25fZG93bmxvYWQpOworICAgICAgICBNRlhDbG9zZShzLT5zZXNzaW9uX2Rvd25sb2FkKTsKKyAgICB9CisgICAgcy0+c2Vzc2lvbl9kb3dubG9hZCA9IE5VTEw7CisKKyAgICBpZiAocy0+c2Vzc2lvbl91cGxvYWQpIHsKKyAgICAgICAgTUZYVmlkZW9WUFBfQ2xvc2Uocy0+c2Vzc2lvbl91cGxvYWQpOworICAgICAgICBNRlhDbG9zZShzLT5zZXNzaW9uX3VwbG9hZCk7CisgICAgfQorICAgIHMtPnNlc3Npb25fdXBsb2FkID0gTlVMTDsKKworICAgIGF2X2ZyZWVwKCZzLT5tZW1faWRzKTsKKyAgICBhdl9mcmVlcCgmcy0+c3VyZmFjZV9wdHJzKTsKKyAgICBhdl9mcmVlcCgmcy0+c3VyZmFjZXNfaW50ZXJuYWwpOworICAgIGF2X2J1ZmZlcl91bnJlZigmcy0+Y2hpbGRfZnJhbWVzX3JlZik7Cit9CisKK3N0YXRpYyB2b2lkIHFzdl9wb29sX3JlbGVhc2VfZHVtbXkodm9pZCAqb3BhcXVlLCB1aW50OF90ICpkYXRhKQoreworfQorCitzdGF0aWMgQVZCdWZmZXJSZWYgKnFzdl9wb29sX2FsbG9jKHZvaWQgKm9wYXF1ZSwgaW50IHNpemUpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAgKmN0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopb3BhcXVlOworICAgIFFTVkZyYW1lc0NvbnRleHQgICAgICAgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIEFWUVNWRnJhbWVzQ29udGV4dCAqaHdjdHggPSBjdHgtPmh3Y3R4OworCisgICAgaWYgKHMtPm5iX3N1cmZhY2VzX3VzZWQgPCBod2N0eC0+bmJfc3VyZmFjZXMpIHsKKyAgICAgICAgcy0+bmJfc3VyZmFjZXNfdXNlZCsrOworICAgICAgICByZXR1cm4gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCopKHMtPnN1cmZhY2VzX2ludGVybmFsICsgcy0+bmJfc3VyZmFjZXNfdXNlZCAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmh3Y3R4LT5zdXJmYWNlcyksIHFzdl9wb29sX3JlbGVhc2VfZHVtbXksIE5VTEwsIDApOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IHFzdl9pbml0X2NoaWxkX2N0eChBVkhXRnJhbWVzQ29udGV4dCAqY3R4KQoreworICAgIEFWUVNWRnJhbWVzQ29udGV4dCAgICAgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBRU1ZGcmFtZXNDb250ZXh0ICAgICAgICAgICAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgUVNWRGV2aWNlQ29udGV4dCAqZGV2aWNlX3ByaXYgPSBjdHgtPmRldmljZV9jdHgtPmludGVybmFsLT5wcml2OworCisgICAgQVZCdWZmZXJSZWYgKmNoaWxkX2RldmljZV9yZWYgPSBOVUxMOworICAgIEFWQnVmZmVyUmVmICpjaGlsZF9mcmFtZXNfcmVmID0gTlVMTDsKKworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpjaGlsZF9kZXZpY2VfY3R4OworICAgIEFWSFdGcmFtZXNDb250ZXh0ICpjaGlsZF9mcmFtZXNfY3R4OworCisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBpZiAoIWRldmljZV9wcml2LT5oYW5kbGUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIkNhbm5vdCBjcmVhdGUgYSBub24tb3BhcXVlIGludGVybmFsIHN1cmZhY2UgcG9vbCB3aXRob3V0ICIKKyAgICAgICAgICAgICAgICJhIGhhcmR3YXJlIGhhbmRsZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgY2hpbGRfZGV2aWNlX3JlZiA9IGF2X2h3ZGV2aWNlX2N0eF9hbGxvYyhkZXZpY2VfcHJpdi0+Y2hpbGRfZGV2aWNlX3R5cGUpOworICAgIGlmICghY2hpbGRfZGV2aWNlX3JlZikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBjaGlsZF9kZXZpY2VfY3R4ICAgPSAoQVZIV0RldmljZUNvbnRleHQqKWNoaWxkX2RldmljZV9yZWYtPmRhdGE7CisKKyNpZiBDT05GSUdfVkFBUEkKKyAgICBpZiAoY2hpbGRfZGV2aWNlX2N0eC0+dHlwZSA9PSBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJKSB7CisgICAgICAgIEFWVkFBUElEZXZpY2VDb250ZXh0ICpjaGlsZF9kZXZpY2VfaHdjdHggPSBjaGlsZF9kZXZpY2VfY3R4LT5od2N0eDsKKyAgICAgICAgY2hpbGRfZGV2aWNlX2h3Y3R4LT5kaXNwbGF5ID0gKFZBRGlzcGxheSlkZXZpY2VfcHJpdi0+aGFuZGxlOworICAgIH0KKyNlbmRpZgorI2lmIENPTkZJR19EWFZBMgorICAgIGlmIChjaGlsZF9kZXZpY2VfY3R4LT50eXBlID09IEFWX0hXREVWSUNFX1RZUEVfRFhWQTIpIHsKKyAgICAgICAgQVZEWFZBMkRldmljZUNvbnRleHQgKmNoaWxkX2RldmljZV9od2N0eCA9IGNoaWxkX2RldmljZV9jdHgtPmh3Y3R4OworICAgICAgICBjaGlsZF9kZXZpY2VfaHdjdHgtPmRldm1nciA9IChJRGlyZWN0M0REZXZpY2VNYW5hZ2VyOSopZGV2aWNlX3ByaXYtPmhhbmRsZTsKKyAgICB9CisjZW5kaWYKKworICAgIHJldCA9IGF2X2h3ZGV2aWNlX2N0eF9pbml0KGNoaWxkX2RldmljZV9yZWYpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBhIGNoaWxkIGRldmljZSBjb250ZXh0XG4iKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGNoaWxkX2ZyYW1lc19yZWYgPSBhdl9od2ZyYW1lX2N0eF9hbGxvYyhjaGlsZF9kZXZpY2VfcmVmKTsKKyAgICBpZiAoIWNoaWxkX2ZyYW1lc19yZWYpIHsKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGNoaWxkX2ZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKWNoaWxkX2ZyYW1lc19yZWYtPmRhdGE7CisKKyAgICBjaGlsZF9mcmFtZXNfY3R4LT5mb3JtYXQgICAgICAgICAgICA9IGRldmljZV9wcml2LT5jaGlsZF9waXhfZm10OworICAgIGNoaWxkX2ZyYW1lc19jdHgtPnN3X2Zvcm1hdCAgICAgICAgID0gY3R4LT5zd19mb3JtYXQ7CisgICAgY2hpbGRfZnJhbWVzX2N0eC0+aW5pdGlhbF9wb29sX3NpemUgPSBjdHgtPmluaXRpYWxfcG9vbF9zaXplOworICAgIGNoaWxkX2ZyYW1lc19jdHgtPndpZHRoICAgICAgICAgICAgID0gRkZBTElHTihjdHgtPndpZHRoLCAxNik7CisgICAgY2hpbGRfZnJhbWVzX2N0eC0+aGVpZ2h0ICAgICAgICAgICAgPSBGRkFMSUdOKGN0eC0+aGVpZ2h0LCAxNik7CisKKyNpZiBDT05GSUdfRFhWQTIKKyAgICBpZiAoY2hpbGRfZGV2aWNlX2N0eC0+dHlwZSA9PSBBVl9IV0RFVklDRV9UWVBFX0RYVkEyKSB7CisgICAgICAgIEFWRFhWQTJGcmFtZXNDb250ZXh0ICpjaGlsZF9mcmFtZXNfaHdjdHggPSBjaGlsZF9mcmFtZXNfY3R4LT5od2N0eDsKKyAgICAgICAgaWYgKGh3Y3R4LT5mcmFtZV90eXBlICYgTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX1BST0NFU1NPUl9UQVJHRVQpCisgICAgICAgICAgICBjaGlsZF9mcmFtZXNfaHdjdHgtPnN1cmZhY2VfdHlwZSA9IERYVkEyX1ZpZGVvUHJvY2Vzc29yUmVuZGVyVGFyZ2V0OworICAgICAgICBlbHNlCisgICAgICAgICAgICBjaGlsZF9mcmFtZXNfaHdjdHgtPnN1cmZhY2VfdHlwZSA9IERYVkEyX1ZpZGVvRGVjb2RlclJlbmRlclRhcmdldDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldCA9IGF2X2h3ZnJhbWVfY3R4X2luaXQoY2hpbGRfZnJhbWVzX3JlZik7CisgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgaW5pdGlhbGl6aW5nIGEgY2hpbGQgZnJhbWVzIGNvbnRleHRcbiIpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisjaWYgQ09ORklHX1ZBQVBJCisgICAgaWYgKGNoaWxkX2RldmljZV9jdHgtPnR5cGUgPT0gQVZfSFdERVZJQ0VfVFlQRV9WQUFQSSkgeworICAgICAgICBBVlZBQVBJRnJhbWVzQ29udGV4dCAqY2hpbGRfZnJhbWVzX2h3Y3R4ID0gY2hpbGRfZnJhbWVzX2N0eC0+aHdjdHg7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPmluaXRpYWxfcG9vbF9zaXplOyBpKyspCisgICAgICAgICAgICBzLT5zdXJmYWNlc19pbnRlcm5hbFtpXS5EYXRhLk1lbUlkID0gY2hpbGRfZnJhbWVzX2h3Y3R4LT5zdXJmYWNlX2lkcyArIGk7CisgICAgICAgIGh3Y3R4LT5mcmFtZV90eXBlID0gTUZYX01FTVRZUEVfVklERU9fTUVNT1JZX0RFQ09ERVJfVEFSR0VUOworICAgIH0KKyNlbmRpZgorI2lmIENPTkZJR19EWFZBMgorICAgIGlmIChjaGlsZF9kZXZpY2VfY3R4LT50eXBlID09IEFWX0hXREVWSUNFX1RZUEVfRFhWQTIpIHsKKyAgICAgICAgQVZEWFZBMkZyYW1lc0NvbnRleHQgKmNoaWxkX2ZyYW1lc19od2N0eCA9IGNoaWxkX2ZyYW1lc19jdHgtPmh3Y3R4OworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZTsgaSsrKQorICAgICAgICAgICAgcy0+c3VyZmFjZXNfaW50ZXJuYWxbaV0uRGF0YS5NZW1JZCA9IChtZnhNZW1JZCljaGlsZF9mcmFtZXNfaHdjdHgtPnN1cmZhY2VzW2ldOworICAgICAgICBpZiAoY2hpbGRfZnJhbWVzX2h3Y3R4LT5zdXJmYWNlX3R5cGUgPT0gRFhWQTJfVmlkZW9Qcm9jZXNzb3JSZW5kZXJUYXJnZXQpCisgICAgICAgICAgICBod2N0eC0+ZnJhbWVfdHlwZSA9IE1GWF9NRU1UWVBFX1ZJREVPX01FTU9SWV9QUk9DRVNTT1JfVEFSR0VUOworICAgICAgICBlbHNlCisgICAgICAgICAgICBod2N0eC0+ZnJhbWVfdHlwZSA9IE1GWF9NRU1UWVBFX1ZJREVPX01FTU9SWV9ERUNPREVSX1RBUkdFVDsKKyAgICB9CisjZW5kaWYKKworICAgIHMtPmNoaWxkX2ZyYW1lc19yZWYgICAgICAgPSBjaGlsZF9mcmFtZXNfcmVmOworICAgIGNoaWxkX2ZyYW1lc19yZWYgICAgICAgICAgPSBOVUxMOworCitmYWlsOgorICAgIGF2X2J1ZmZlcl91bnJlZigmY2hpbGRfZGV2aWNlX3JlZik7CisgICAgYXZfYnVmZmVyX3VucmVmKCZjaGlsZF9mcmFtZXNfcmVmKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFzdl9pbml0X3N1cmZhY2UoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgbWZ4RnJhbWVTdXJmYWNlMSAqc3VyZikKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2M7CisgICAgdWludDMyX3QgZm91cmNjOworCisgICAgZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoY3R4LT5zd19mb3JtYXQpOworICAgIGlmICghZGVzYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIGZvdXJjYyA9IHFzdl9mb3VyY2NfZnJvbV9waXhfZm10KGN0eC0+c3dfZm9ybWF0KTsKKyAgICBpZiAoIWZvdXJjYykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgIHN1cmYtPkluZm8uQml0RGVwdGhMdW1hICAgPSBkZXNjLT5jb21wWzBdLmRlcHRoOworICAgIHN1cmYtPkluZm8uQml0RGVwdGhDaHJvbWEgPSBkZXNjLT5jb21wWzBdLmRlcHRoOworICAgIHN1cmYtPkluZm8uU2hpZnQgICAgICAgICAgPSBkZXNjLT5jb21wWzBdLmRlcHRoID4gODsKKworICAgIGlmIChkZXNjLT5sb2cyX2Nocm9tYV93ICYmIGRlc2MtPmxvZzJfY2hyb21hX2gpCisgICAgICAgIHN1cmYtPkluZm8uQ2hyb21hRm9ybWF0ICAgPSBNRlhfQ0hST01BRk9STUFUX1lVVjQyMDsKKyAgICBlbHNlIGlmIChkZXNjLT5sb2cyX2Nocm9tYV93KQorICAgICAgICBzdXJmLT5JbmZvLkNocm9tYUZvcm1hdCAgID0gTUZYX0NIUk9NQUZPUk1BVF9ZVVY0MjI7CisgICAgZWxzZQorICAgICAgICBzdXJmLT5JbmZvLkNocm9tYUZvcm1hdCAgID0gTUZYX0NIUk9NQUZPUk1BVF9ZVVY0NDQ7CisKKyAgICBzdXJmLT5JbmZvLkZvdXJDQyAgICAgICAgID0gZm91cmNjOworICAgIHN1cmYtPkluZm8uV2lkdGggICAgICAgICAgPSBGRkFMSUdOKGN0eC0+d2lkdGgsIDE2KTsKKyAgICBzdXJmLT5JbmZvLkNyb3BXICAgICAgICAgID0gY3R4LT53aWR0aDsKKyAgICBzdXJmLT5JbmZvLkhlaWdodCAgICAgICAgID0gRkZBTElHTihjdHgtPmhlaWdodCwgMTYpOworICAgIHN1cmYtPkluZm8uQ3JvcEggICAgICAgICAgPSBjdHgtPmhlaWdodDsKKyAgICBzdXJmLT5JbmZvLkZyYW1lUmF0ZUV4dE4gID0gMjU7CisgICAgc3VyZi0+SW5mby5GcmFtZVJhdGVFeHREICA9IDE7CisgICAgc3VyZi0+SW5mby5QaWNTdHJ1Y3QgICAgICA9IE1GWF9QSUNTVFJVQ1RfUFJPR1JFU1NJVkU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3ZfaW5pdF9wb29sKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIHVpbnQzMl90IGZvdXJjYykKK3sKKyAgICBRU1ZGcmFtZXNDb250ZXh0ICAgICAgICAgICAgICAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICpmcmFtZXNfaHdjdHggPSBjdHgtPmh3Y3R4OworCisgICAgaW50IGksIHJldCA9IDA7CisKKyAgICBpZiAoY3R4LT5pbml0aWFsX3Bvb2xfc2l6ZSA8PSAwKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlFTViByZXF1aXJlcyBhIGZpeGVkIGZyYW1lIHBvb2wgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcy0+c3VyZmFjZXNfaW50ZXJuYWwgPSBhdl9tYWxsb2N6X2FycmF5KGN0eC0+aW5pdGlhbF9wb29sX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcy0+c3VyZmFjZXNfaW50ZXJuYWwpKTsKKyAgICBpZiAoIXMtPnN1cmZhY2VzX2ludGVybmFsKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+aW5pdGlhbF9wb29sX3NpemU7IGkrKykgeworICAgICAgICByZXQgPSBxc3ZfaW5pdF9zdXJmYWNlKGN0eCwgJnMtPnN1cmZhY2VzX2ludGVybmFsW2ldKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmICghKGZyYW1lc19od2N0eC0+ZnJhbWVfdHlwZSAmIE1GWF9NRU1UWVBFX09QQVFVRV9GUkFNRSkpIHsKKyAgICAgICAgcmV0ID0gcXN2X2luaXRfY2hpbGRfY3R4KGN0eCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBjdHgtPmludGVybmFsLT5wb29sX2ludGVybmFsID0gYXZfYnVmZmVyX3Bvb2xfaW5pdDIoc2l6ZW9mKG1meEZyYW1lU3VyZmFjZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgsIHFzdl9wb29sX2FsbG9jLCBOVUxMKTsKKyAgICBpZiAoIWN0eC0+aW50ZXJuYWwtPnBvb2xfaW50ZXJuYWwpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmcmFtZXNfaHdjdHgtPnN1cmZhY2VzICAgID0gcy0+c3VyZmFjZXNfaW50ZXJuYWw7CisgICAgZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlcyA9IGN0eC0+aW5pdGlhbF9wb29sX3NpemU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIG1meFN0YXR1cyBmcmFtZV9hbGxvYyhtZnhIREwgcHRoaXMsIG1meEZyYW1lQWxsb2NSZXF1ZXN0ICpyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1meEZyYW1lQWxsb2NSZXNwb25zZSAqcmVzcCkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAqY3R4ID0gcHRoaXM7CisgICAgUVNWRnJhbWVzQ29udGV4dCAgICAgICAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICpod2N0eCA9IGN0eC0+aHdjdHg7CisgICAgbWZ4RnJhbWVJbmZvICppICA9ICZyZXEtPkluZm87CisgICAgbWZ4RnJhbWVJbmZvICppMSA9ICZod2N0eC0+c3VyZmFjZXNbMF0uSW5mbzsKKworICAgIGlmICghKHJlcS0+VHlwZSAmIE1GWF9NRU1UWVBFX1ZJREVPX01FTU9SWV9QUk9DRVNTT1JfVEFSR0VUKSB8fAorICAgICAgICAhKHJlcS0+VHlwZSAmIChNRlhfTUVNVFlQRV9GUk9NX1ZQUElOIHwgTUZYX01FTVRZUEVfRlJPTV9WUFBPVVQpKSB8fAorICAgICAgICAhKHJlcS0+VHlwZSAmIE1GWF9NRU1UWVBFX0VYVEVSTkFMX0ZSQU1FKSkKKyAgICAgICAgcmV0dXJuIE1GWF9FUlJfVU5TVVBQT1JURUQ7CisgICAgaWYgKGktPldpZHRoICAhPSBpMS0+V2lkdGggfHwgaS0+SGVpZ2h0ICE9IGkxLT5IZWlnaHQgfHwKKyAgICAgICAgaS0+Rm91ckNDICE9IGkxLT5Gb3VyQ0MgfHwgaS0+Q2hyb21hRm9ybWF0ICE9IGkxLT5DaHJvbWFGb3JtYXQpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTWlzbWF0Y2hpbmcgc3VyZmFjZSBwcm9wZXJ0aWVzIGluIGFuICIKKyAgICAgICAgICAgICAgICJhbGxvY2F0aW9uIHJlcXVlc3Q6ICVkeCVkICVkICVkIHZzICVkeCVkICVkICVkXG4iLAorICAgICAgICAgICAgICAgaS0+V2lkdGgsICBpLT5IZWlnaHQsICBpLT5Gb3VyQ0MsICBpLT5DaHJvbWFGb3JtYXQsCisgICAgICAgICAgICAgICBpMS0+V2lkdGgsIGkxLT5IZWlnaHQsIGkxLT5Gb3VyQ0MsIGkxLT5DaHJvbWFGb3JtYXQpOworICAgICAgICByZXR1cm4gTUZYX0VSUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICByZXNwLT5taWRzICAgICAgICAgICA9IHMtPm1lbV9pZHM7CisgICAgcmVzcC0+TnVtRnJhbWVBY3R1YWwgPSBod2N0eC0+bmJfc3VyZmFjZXM7CisKKyAgICByZXR1cm4gTUZYX0VSUl9OT05FOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX2ZyZWUobWZ4SERMIHB0aGlzLCBtZnhGcmFtZUFsbG9jUmVzcG9uc2UgKnJlc3ApCit7CisgICAgcmV0dXJuIE1GWF9FUlJfTk9ORTsKK30KKworc3RhdGljIG1meFN0YXR1cyBmcmFtZV9sb2NrKG1meEhETCBwdGhpcywgbWZ4TWVtSWQgbWlkLCBtZnhGcmFtZURhdGEgKnB0cikKK3sKKyAgICByZXR1cm4gTUZYX0VSUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdGljIG1meFN0YXR1cyBmcmFtZV91bmxvY2sobWZ4SERMIHB0aGlzLCBtZnhNZW1JZCBtaWQsIG1meEZyYW1lRGF0YSAqcHRyKQoreworICAgIHJldHVybiBNRlhfRVJSX1VOU1VQUE9SVEVEOworfQorCitzdGF0aWMgbWZ4U3RhdHVzIGZyYW1lX2dldF9oZGwobWZ4SERMIHB0aGlzLCBtZnhNZW1JZCBtaWQsIG1meEhETCAqaGRsKQoreworICAgICpoZGwgPSBtaWQ7CisgICAgcmV0dXJuIE1GWF9FUlJfTk9ORTsKK30KKworc3RhdGljIGludCBxc3ZfaW5pdF9pbnRlcm5hbF9zZXNzaW9uKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWZ4U2Vzc2lvbiAqc2Vzc2lvbiwgaW50IHVwbG9hZCkKK3sKKyAgICBRU1ZGcmFtZXNDb250ZXh0ICAgICAgICAgICAgICAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZRU1ZGcmFtZXNDb250ZXh0ICpmcmFtZXNfaHdjdHggPSBjdHgtPmh3Y3R4OworICAgIFFTVkRldmljZUNvbnRleHQgICAqZGV2aWNlX3ByaXYgID0gY3R4LT5kZXZpY2VfY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBpbnQgb3BhcXVlID0gISEoZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlICYgTUZYX01FTVRZUEVfT1BBUVVFX0ZSQU1FKTsKKworICAgIG1meEZyYW1lQWxsb2NhdG9yIGZyYW1lX2FsbG9jYXRvciA9IHsKKyAgICAgICAgLnB0aGlzICA9IGN0eCwKKyAgICAgICAgLkFsbG9jICA9IGZyYW1lX2FsbG9jLAorICAgICAgICAuTG9jayAgID0gZnJhbWVfbG9jaywKKyAgICAgICAgLlVubG9jayA9IGZyYW1lX3VubG9jaywKKyAgICAgICAgLkdldEhETCA9IGZyYW1lX2dldF9oZGwsCisgICAgICAgIC5GcmVlICAgPSBmcmFtZV9mcmVlLAorICAgIH07CisKKyAgICBtZnhWaWRlb1BhcmFtIHBhcjsKKyAgICBtZnhTdGF0dXMgZXJyOworCisgICAgZXJyID0gTUZYSW5pdChkZXZpY2VfcHJpdi0+aW1wbCwgJmRldmljZV9wcml2LT52ZXIsIHNlc3Npb24pOworICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGluaXRpYWxpemluZyBhbiBpbnRlcm5hbCBzZXNzaW9uXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoZGV2aWNlX3ByaXYtPmhhbmRsZSkgeworICAgICAgICBlcnIgPSBNRlhWaWRlb0NPUkVfU2V0SGFuZGxlKCpzZXNzaW9uLCBkZXZpY2VfcHJpdi0+aGFuZGxlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX3ByaXYtPmhhbmRsZSk7CisgICAgICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAoIW9wYXF1ZSkgeworICAgICAgICBlcnIgPSBNRlhWaWRlb0NPUkVfU2V0RnJhbWVBbGxvY2F0b3IoKnNlc3Npb24sICZmcmFtZV9hbGxvY2F0b3IpOworICAgICAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgbWVtc2V0KCZwYXIsIDAsIHNpemVvZihwYXIpKTsKKworICAgIGlmIChvcGFxdWUpIHsKKyAgICAgICAgcGFyLkV4dFBhcmFtICAgID0gcy0+ZXh0X2J1ZmZlcnM7CisgICAgICAgIHBhci5OdW1FeHRQYXJhbSA9IEZGX0FSUkFZX0VMRU1TKHMtPmV4dF9idWZmZXJzKTsKKyAgICAgICAgcGFyLklPUGF0dGVybiAgID0gdXBsb2FkID8gTUZYX0lPUEFUVEVSTl9PVVRfT1BBUVVFX01FTU9SWSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GWF9JT1BBVFRFUk5fSU5fT1BBUVVFX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXIuSU9QYXR0ZXJuID0gdXBsb2FkID8gTUZYX0lPUEFUVEVSTl9PVVRfVklERU9fTUVNT1JZIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GWF9JT1BBVFRFUk5fSU5fVklERU9fTUVNT1JZOworICAgIH0KKworICAgIHBhci5JT1BhdHRlcm4gfD0gdXBsb2FkID8gTUZYX0lPUEFUVEVSTl9JTl9TWVNURU1fTUVNT1JZIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1GWF9JT1BBVFRFUk5fT1VUX1NZU1RFTV9NRU1PUlk7CisgICAgcGFyLkFzeW5jRGVwdGggPSAxOworCisgICAgcGFyLnZwcC5JbiA9IGZyYW1lc19od2N0eC0+c3VyZmFjZXNbMF0uSW5mbzsKKworICAgIC8qIEFwcGFyZW50bHkgVlBQIHJlcXVpcmVzIHRoZSBmcmFtZSByYXRlIHRvIGJlIHNldCB0byBzb21lIHZhbHVlLCBvdGhlcndpc2UKKyAgICAgKiBpbml0IHdpbGwgZmFpbCAocHJvYmFibHkgZm9yIHRoZSBmcmFtZXJhdGUgY29udmVyc2lvbiBmaWx0ZXIpLiBTaW5jZSB3ZQorICAgICAqIGFyZSBvbmx5IGRvaW5nIGRhdGEgdXBsb2FkL2Rvd25sb2FkIGhlcmUsIHdlIGp1c3QgaW52ZW50IGFuIGFyYml0cmFyeQorICAgICAqIHZhbHVlICovCisgICAgcGFyLnZwcC5Jbi5GcmFtZVJhdGVFeHROID0gMjU7CisgICAgcGFyLnZwcC5Jbi5GcmFtZVJhdGVFeHREID0gMTsKKyAgICBwYXIudnBwLk91dCA9IHBhci52cHAuSW47CisKKyAgICBlcnIgPSBNRlhWaWRlb1ZQUF9Jbml0KCpzZXNzaW9uLCAmcGFyKTsKKyAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkVycm9yIG9wZW5pbmcgdGhlIGludGVybmFsIFZQUCBzZXNzaW9uLiIKKyAgICAgICAgICAgICAgICJTdXJmYWNlIHVwbG9hZC9kb3dubG9hZCB3aWxsIG5vdCBiZSBwb3NzaWJsZVxuIik7CisgICAgICAgIE1GWENsb3NlKCpzZXNzaW9uKTsKKyAgICAgICAgKnNlc3Npb24gPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzdl9mcmFtZXNfaW5pdChBVkhXRnJhbWVzQ29udGV4dCAqY3R4KQoreworICAgIFFTVkZyYW1lc0NvbnRleHQgICAgICAgICAgICAgICpzID0gY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmZyYW1lc19od2N0eCA9IGN0eC0+aHdjdHg7CisKKyAgICBpbnQgb3BhcXVlID0gISEoZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlICYgTUZYX01FTVRZUEVfT1BBUVVFX0ZSQU1FKTsKKworICAgIHVpbnQzMl90IGZvdXJjYzsKKyAgICBpbnQgaSwgcmV0OworCisgICAgZm91cmNjID0gcXN2X2ZvdXJjY19mcm9tX3BpeF9mbXQoY3R4LT5zd19mb3JtYXQpOworICAgIGlmICghZm91cmNjKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIHBpeGVsIGZvcm1hdFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgaWYgKCFjdHgtPnBvb2wpIHsKKyAgICAgICAgcmV0ID0gcXN2X2luaXRfcG9vbChjdHgsIGZvdXJjYyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBjcmVhdGluZyBhbiBpbnRlcm5hbCBmcmFtZSBwb29sXG4iKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3BhcXVlKSB7CisgICAgICAgIHMtPnN1cmZhY2VfcHRycyA9IGF2X21hbGxvY3pfYXJyYXkoZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPnN1cmZhY2VfcHRycykpOworICAgICAgICBpZiAoIXMtPnN1cmZhY2VfcHRycykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7IGkrKykKKyAgICAgICAgICAgIHMtPnN1cmZhY2VfcHRyc1tpXSA9IGZyYW1lc19od2N0eC0+c3VyZmFjZXMgKyBpOworCisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5Jbi5TdXJmYWNlcyAgID0gcy0+c3VyZmFjZV9wdHJzOworICAgICAgICBzLT5vcGFxdWVfYWxsb2MuSW4uTnVtU3VyZmFjZSA9IGZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7CisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5Jbi5UeXBlICAgICAgID0gZnJhbWVzX2h3Y3R4LT5mcmFtZV90eXBlOworCisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5PdXQgPSBzLT5vcGFxdWVfYWxsb2MuSW47CisKKyAgICAgICAgcy0+b3BhcXVlX2FsbG9jLkhlYWRlci5CdWZmZXJJZCA9IE1GWF9FWFRCVUZGX09QQVFVRV9TVVJGQUNFX0FMTE9DQVRJT047CisgICAgICAgIHMtPm9wYXF1ZV9hbGxvYy5IZWFkZXIuQnVmZmVyU3ogPSBzaXplb2Yocy0+b3BhcXVlX2FsbG9jKTsKKworICAgICAgICBzLT5leHRfYnVmZmVyc1swXSA9IChtZnhFeHRCdWZmZXIqKSZzLT5vcGFxdWVfYWxsb2M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWVtX2lkcyA9IGF2X21hbGxvY3pfYXJyYXkoZnJhbWVzX2h3Y3R4LT5uYl9zdXJmYWNlcywgc2l6ZW9mKCpzLT5tZW1faWRzKSk7CisgICAgICAgIGlmICghcy0+bWVtX2lkcykKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGZyYW1lc19od2N0eC0+bmJfc3VyZmFjZXM7IGkrKykKKyAgICAgICAgICAgIHMtPm1lbV9pZHNbaV0gPSBmcmFtZXNfaHdjdHgtPnN1cmZhY2VzW2ldLkRhdGEuTWVtSWQ7CisgICAgfQorCisgICAgcmV0ID0gcXN2X2luaXRfaW50ZXJuYWxfc2Vzc2lvbihjdHgsICZzLT5zZXNzaW9uX2Rvd25sb2FkLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIHJldCA9IHFzdl9pbml0X2ludGVybmFsX3Nlc3Npb24oY3R4LCAmcy0+c2Vzc2lvbl91cGxvYWQsIDEpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXN2X2dldF9idWZmZXIoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZnJhbWUpCit7CisgICAgZnJhbWUtPmJ1ZlswXSA9IGF2X2J1ZmZlcl9wb29sX2dldChjdHgtPnBvb2wpOworICAgIGlmICghZnJhbWUtPmJ1ZlswXSkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZyYW1lLT5kYXRhWzNdID0gZnJhbWUtPmJ1ZlswXS0+ZGF0YTsKKyAgICBmcmFtZS0+Zm9ybWF0ICA9IEFWX1BJWF9GTVRfUVNWOworICAgIGZyYW1lLT53aWR0aCAgID0gY3R4LT53aWR0aDsKKyAgICBmcmFtZS0+aGVpZ2h0ICA9IGN0eC0+aGVpZ2h0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcXN2X3RyYW5zZmVyX2dldF9mb3JtYXRzKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWSFdGcmFtZVRyYW5zZmVyRGlyZWN0aW9uIGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqKmZvcm1hdHMpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICpmbXRzOworCisgICAgZm10cyA9IGF2X21hbGxvY19hcnJheSgyLCBzaXplb2YoKmZtdHMpKTsKKyAgICBpZiAoIWZtdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmbXRzWzBdID0gY3R4LT5zd19mb3JtYXQ7CisgICAgZm10c1sxXSA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgICpmb3JtYXRzID0gZm10czsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzdl9mcmFtZXNfZGVyaXZlX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmRzdF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZIV0ZyYW1lc0NvbnRleHQgKnNyY19jdHgsIGludCBmbGFncykKK3sKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgKnNyY19od2N0eCA9IHNyY19jdHgtPmh3Y3R4OworICAgIGludCBpOworCisgICAgc3dpdGNoIChkc3RfY3R4LT5kZXZpY2VfY3R4LT50eXBlKSB7CisjaWYgQ09ORklHX1ZBQVBJCisgICAgY2FzZSBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJOgorICAgICAgICB7CisgICAgICAgICAgICBBVlZBQVBJRnJhbWVzQ29udGV4dCAqZHN0X2h3Y3R4ID0gZHN0X2N0eC0+aHdjdHg7CisgICAgICAgICAgICBkc3RfaHdjdHgtPnN1cmZhY2VfaWRzID0gYXZfbWFsbG9jel9hcnJheShzcmNfaHdjdHgtPm5iX3N1cmZhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpkc3RfaHdjdHgtPnN1cmZhY2VfaWRzKSk7CisgICAgICAgICAgICBpZiAoIWRzdF9od2N0eC0+c3VyZmFjZV9pZHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfaHdjdHgtPm5iX3N1cmZhY2VzOyBpKyspCisgICAgICAgICAgICAgICAgZHN0X2h3Y3R4LT5zdXJmYWNlX2lkc1tpXSA9CisgICAgICAgICAgICAgICAgICAgICooVkFTdXJmYWNlSUQqKXNyY19od2N0eC0+c3VyZmFjZXNbaV0uRGF0YS5NZW1JZDsKKyAgICAgICAgICAgIGRzdF9od2N0eC0+bmJfc3VyZmFjZXMgPSBzcmNfaHdjdHgtPm5iX3N1cmZhY2VzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgQ09ORklHX0RYVkEyCisgICAgY2FzZSBBVl9IV0RFVklDRV9UWVBFX0RYVkEyOgorICAgICAgICB7CisgICAgICAgICAgICBBVkRYVkEyRnJhbWVzQ29udGV4dCAqZHN0X2h3Y3R4ID0gZHN0X2N0eC0+aHdjdHg7CisgICAgICAgICAgICBkc3RfaHdjdHgtPnN1cmZhY2VzID0gYXZfbWFsbG9jel9hcnJheShzcmNfaHdjdHgtPm5iX3N1cmZhY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpkc3RfaHdjdHgtPnN1cmZhY2VzKSk7CisgICAgICAgICAgICBpZiAoIWRzdF9od2N0eC0+c3VyZmFjZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcmNfaHdjdHgtPm5iX3N1cmZhY2VzOyBpKyspCisgICAgICAgICAgICAgICAgZHN0X2h3Y3R4LT5zdXJmYWNlc1tpXSA9CisgICAgICAgICAgICAgICAgICAgIChJRGlyZWN0M0RTdXJmYWNlOSopc3JjX2h3Y3R4LT5zdXJmYWNlc1tpXS5EYXRhLk1lbUlkOworICAgICAgICAgICAgZHN0X2h3Y3R4LT5uYl9zdXJmYWNlcyA9IHNyY19od2N0eC0+bmJfc3VyZmFjZXM7CisgICAgICAgICAgICBpZiAoc3JjX2h3Y3R4LT5mcmFtZV90eXBlID09IE1GWF9NRU1UWVBFX1ZJREVPX01FTU9SWV9ERUNPREVSX1RBUkdFVCkKKyAgICAgICAgICAgICAgICBkc3RfaHdjdHgtPnN1cmZhY2VfdHlwZSA9IERYVkEyX1ZpZGVvRGVjb2RlclJlbmRlclRhcmdldDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkc3RfaHdjdHgtPnN1cmZhY2VfdHlwZSA9IERYVkEyX1ZpZGVvUHJvY2Vzc29yUmVuZGVyVGFyZ2V0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3ZfbWFwX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpCit7CisgICAgUVNWRnJhbWVzQ29udGV4dCAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgbWZ4RnJhbWVTdXJmYWNlMSAqc3VyZiA9IChtZnhGcmFtZVN1cmZhY2UxKilzcmMtPmRhdGFbM107CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmNoaWxkX2ZyYW1lc19jdHg7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjOworICAgIHVpbnQ4X3QgKmNoaWxkX2RhdGE7CisgICAgQVZGcmFtZSAqZHVtbXk7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoIXMtPmNoaWxkX2ZyYW1lc19yZWYpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgY2hpbGRfZnJhbWVzX2N0eCA9IChBVkhXRnJhbWVzQ29udGV4dCopcy0+Y2hpbGRfZnJhbWVzX3JlZi0+ZGF0YTsKKworICAgIHN3aXRjaCAoY2hpbGRfZnJhbWVzX2N0eC0+ZGV2aWNlX2N0eC0+dHlwZSkgeworI2lmIENPTkZJR19WQUFQSQorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9WQUFQSToKKyAgICAgICAgY2hpbGRfZGF0YSA9ICh1aW50OF90KikoaW50cHRyX3QpKihWQVN1cmZhY2VJRCopc3VyZi0+RGF0YS5NZW1JZDsKKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyNpZiBDT05GSUdfRFhWQTIKKyAgICBjYXNlIEFWX0hXREVWSUNFX1RZUEVfRFhWQTI6CisgICAgICAgIGNoaWxkX2RhdGEgPSBzdXJmLT5EYXRhLk1lbUlkOworICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgaWYgKGRzdC0+Zm9ybWF0ID09IGNoaWxkX2ZyYW1lc19jdHgtPmZvcm1hdCkgeworICAgICAgICByZXQgPSBmZl9od2ZyYW1lX21hcF9jcmVhdGUocy0+Y2hpbGRfZnJhbWVzX3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgc3JjLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGRzdC0+d2lkdGggICA9IHNyYy0+d2lkdGg7CisgICAgICAgIGRzdC0+aGVpZ2h0ICA9IHNyYy0+aGVpZ2h0OworICAgICAgICBkc3QtPmRhdGFbM10gPSBjaGlsZF9kYXRhOworCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGRzdC0+Zm9ybWF0KTsKKyAgICBpZiAoZGVzYyAmJiBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMKSB7CisgICAgICAgIC8vIFRoaXMgb25seSBzdXBwb3J0cyBtYXBwaW5nIHRvIHNvZnR3YXJlLgorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGR1bW15ID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWR1bW15KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZHVtbXktPmJ1ZlswXSAgICAgICAgPSBhdl9idWZmZXJfcmVmKHNyYy0+YnVmWzBdKTsKKyAgICBkdW1teS0+aHdfZnJhbWVzX2N0eCA9IGF2X2J1ZmZlcl9yZWYocy0+Y2hpbGRfZnJhbWVzX3JlZik7CisgICAgaWYgKCFkdW1teS0+YnVmWzBdIHx8ICFkdW1teS0+aHdfZnJhbWVzX2N0eCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZHVtbXktPmZvcm1hdCAgICAgICAgPSBjaGlsZF9mcmFtZXNfY3R4LT5mb3JtYXQ7CisgICAgZHVtbXktPndpZHRoICAgICAgICAgPSBzcmMtPndpZHRoOworICAgIGR1bW15LT5oZWlnaHQgICAgICAgID0gc3JjLT5oZWlnaHQ7CisgICAgZHVtbXktPmRhdGFbM10gICAgICAgPSBjaGlsZF9kYXRhOworCisgICAgcmV0ID0gYXZfaHdmcmFtZV9tYXAoZHN0LCBkdW1teSwgZmxhZ3MpOworCitmYWlsOgorICAgIGF2X2ZyYW1lX2ZyZWUoJmR1bW15KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcXN2X3RyYW5zZmVyX2RhdGFfY2hpbGQoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgUVNWRnJhbWVzQ29udGV4dCAqcyA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgKmNoaWxkX2ZyYW1lc19jdHggPSAoQVZIV0ZyYW1lc0NvbnRleHQqKXMtPmNoaWxkX2ZyYW1lc19yZWYtPmRhdGE7CisgICAgaW50IGRvd25sb2FkID0gISFzcmMtPmh3X2ZyYW1lc19jdHg7CisgICAgbWZ4RnJhbWVTdXJmYWNlMSAqc3VyZiA9IChtZnhGcmFtZVN1cmZhY2UxKikoZG93bmxvYWQgPyBzcmMtPmRhdGFbM10gOiBkc3QtPmRhdGFbM10pOworCisgICAgQVZGcmFtZSAqZHVtbXk7CisgICAgaW50IHJldDsKKworICAgIGR1bW15ID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIWR1bW15KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZHVtbXktPmZvcm1hdCAgICAgICAgPSBjaGlsZF9mcmFtZXNfY3R4LT5mb3JtYXQ7CisgICAgZHVtbXktPndpZHRoICAgICAgICAgPSBzcmMtPndpZHRoOworICAgIGR1bW15LT5oZWlnaHQgICAgICAgID0gc3JjLT5oZWlnaHQ7CisgICAgZHVtbXktPmJ1ZlswXSAgICAgICAgPSBkb3dubG9hZCA/IHNyYy0+YnVmWzBdIDogZHN0LT5idWZbMF07CisgICAgZHVtbXktPmRhdGFbM10gICAgICAgPSBzdXJmLT5EYXRhLk1lbUlkOworICAgIGR1bW15LT5od19mcmFtZXNfY3R4ID0gcy0+Y2hpbGRfZnJhbWVzX3JlZjsKKworICAgIHJldCA9IGRvd25sb2FkID8gYXZfaHdmcmFtZV90cmFuc2Zlcl9kYXRhKGRzdCwgZHVtbXksIDApIDoKKyAgICAgICAgICAgICAgICAgICAgIGF2X2h3ZnJhbWVfdHJhbnNmZXJfZGF0YShkdW1teSwgc3JjLCAwKTsKKworICAgIGR1bW15LT5idWZbMF0gICAgICAgID0gTlVMTDsKKyAgICBkdW1teS0+ZGF0YVszXSAgICAgICA9IE5VTEw7CisgICAgZHVtbXktPmh3X2ZyYW1lc19jdHggPSBOVUxMOworCisgICAgYXZfZnJhbWVfZnJlZSgmZHVtbXkpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxc3ZfdHJhbnNmZXJfZGF0YV9mcm9tKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgUVNWRnJhbWVzQ29udGV4dCAgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIG1meEZyYW1lU3VyZmFjZTEgb3V0ID0ge3sgMCB9fTsKKyAgICBtZnhGcmFtZVN1cmZhY2UxICppbiA9IChtZnhGcmFtZVN1cmZhY2UxKilzcmMtPmRhdGFbM107CisKKyAgICBtZnhTeW5jUG9pbnQgc3luYyA9IE5VTEw7CisgICAgbWZ4U3RhdHVzIGVycjsKKworICAgIGlmICghcy0+c2Vzc2lvbl9kb3dubG9hZCkgeworICAgICAgICBpZiAocy0+Y2hpbGRfZnJhbWVzX3JlZikKKyAgICAgICAgICAgIHJldHVybiBxc3ZfdHJhbnNmZXJfZGF0YV9jaGlsZChjdHgsIGRzdCwgc3JjKTsKKworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTdXJmYWNlIGRvd25sb2FkIG5vdCBwb3NzaWJsZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgb3V0LkluZm8gPSBpbi0+SW5mbzsKKyAgICBvdXQuRGF0YS5QaXRjaExvdyA9IGRzdC0+bGluZXNpemVbMF07CisgICAgb3V0LkRhdGEuWSAgICAgICAgPSBkc3QtPmRhdGFbMF07CisgICAgb3V0LkRhdGEuVSAgICAgICAgPSBkc3QtPmRhdGFbMV07CisgICAgb3V0LkRhdGEuViAgICAgICAgPSBkc3QtPmRhdGFbMl07CisgICAgb3V0LkRhdGEuQSAgICAgICAgPSBkc3QtPmRhdGFbM107CisKKyAgICBkbyB7CisgICAgICAgIGVyciA9IE1GWFZpZGVvVlBQX1J1bkZyYW1lVlBQQXN5bmMocy0+c2Vzc2lvbl9kb3dubG9hZCwgaW4sICZvdXQsIE5VTEwsICZzeW5jKTsKKyAgICAgICAgaWYgKGVyciA9PSBNRlhfV1JOX0RFVklDRV9CVVNZKQorICAgICAgICAgICAgYXZfdXNsZWVwKDEpOworICAgIH0gd2hpbGUgKGVyciA9PSBNRlhfV1JOX0RFVklDRV9CVVNZKTsKKworICAgIGlmIChlcnIgPCAwIHx8ICFzeW5jKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIGRvd25sb2FkaW5nIHRoZSBzdXJmYWNlXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGVyciA9IE1GWFZpZGVvQ09SRV9TeW5jT3BlcmF0aW9uKHMtPnNlc3Npb25fZG93bmxvYWQsIHN5bmMsIDEwMDApOworICAgIH0gd2hpbGUgKGVyciA9PSBNRlhfV1JOX0lOX0VYRUNVVElPTik7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc3luY2hyb25pemluZyB0aGUgb3BlcmF0aW9uOiAlZFxuIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBxc3ZfdHJhbnNmZXJfZGF0YV90byhBVkhXRnJhbWVzQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBRU1ZGcmFtZXNDb250ZXh0ICAgKnMgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIG1meEZyYW1lU3VyZmFjZTEgICBpbiA9IHt7IDAgfX07CisgICAgbWZ4RnJhbWVTdXJmYWNlMSAqb3V0ID0gKG1meEZyYW1lU3VyZmFjZTEqKWRzdC0+ZGF0YVszXTsKKworICAgIG1meFN5bmNQb2ludCBzeW5jID0gTlVMTDsKKyAgICBtZnhTdGF0dXMgZXJyOworCisgICAgaWYgKCFzLT5zZXNzaW9uX3VwbG9hZCkgeworICAgICAgICBpZiAocy0+Y2hpbGRfZnJhbWVzX3JlZikKKyAgICAgICAgICAgIHJldHVybiBxc3ZfdHJhbnNmZXJfZGF0YV9jaGlsZChjdHgsIGRzdCwgc3JjKTsKKworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJTdXJmYWNlIHVwbG9hZCBub3QgcG9zc2libGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGluLkluZm8gPSBvdXQtPkluZm87CisgICAgaW4uRGF0YS5QaXRjaExvdyA9IHNyYy0+bGluZXNpemVbMF07CisgICAgaW4uRGF0YS5ZICAgICAgICA9IHNyYy0+ZGF0YVswXTsKKyAgICBpbi5EYXRhLlUgICAgICAgID0gc3JjLT5kYXRhWzFdOworICAgIGluLkRhdGEuViAgICAgICAgPSBzcmMtPmRhdGFbMl07CisgICAgaW4uRGF0YS5BICAgICAgICA9IHNyYy0+ZGF0YVszXTsKKworICAgIGRvIHsKKyAgICAgICAgZXJyID0gTUZYVmlkZW9WUFBfUnVuRnJhbWVWUFBBc3luYyhzLT5zZXNzaW9uX3VwbG9hZCwgJmluLCBvdXQsIE5VTEwsICZzeW5jKTsKKyAgICAgICAgaWYgKGVyciA9PSBNRlhfV1JOX0RFVklDRV9CVVNZKQorICAgICAgICAgICAgYXZfdXNsZWVwKDEpOworICAgIH0gd2hpbGUgKGVyciA9PSBNRlhfV1JOX0RFVklDRV9CVVNZKTsKKworICAgIGlmIChlcnIgPCAwIHx8ICFzeW5jKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHVwbG9hZGluZyB0aGUgc3VyZmFjZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgZG8geworICAgICAgICBlcnIgPSBNRlhWaWRlb0NPUkVfU3luY09wZXJhdGlvbihzLT5zZXNzaW9uX3VwbG9hZCwgc3luYywgMTAwMCk7CisgICAgfSB3aGlsZSAoZXJyID09IE1GWF9XUk5fSU5fRVhFQ1VUSU9OKTsKKyAgICBpZiAoZXJyIDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBzeW5jaHJvbml6aW5nIHRoZSBvcGVyYXRpb25cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzdl9mcmFtZXNfZGVyaXZlX3RvKEFWSFdGcmFtZXNDb250ZXh0ICpkc3RfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29udGV4dCAqc3JjX2N0eCwgaW50IGZsYWdzKQoreworICAgIFFTVkZyYW1lc0NvbnRleHQgKnMgPSBkc3RfY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmRzdF9od2N0eCA9IGRzdF9jdHgtPmh3Y3R4OworICAgIGludCBpOworCisgICAgc3dpdGNoIChzcmNfY3R4LT5kZXZpY2VfY3R4LT50eXBlKSB7CisjaWYgQ09ORklHX1ZBQVBJCisgICAgY2FzZSBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJOgorICAgICAgICB7CisgICAgICAgICAgICBBVlZBQVBJRnJhbWVzQ29udGV4dCAqc3JjX2h3Y3R4ID0gc3JjX2N0eC0+aHdjdHg7CisgICAgICAgICAgICBzLT5zdXJmYWNlc19pbnRlcm5hbCA9IGF2X21hbGxvY3pfYXJyYXkoc3JjX2h3Y3R4LT5uYl9zdXJmYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnMtPnN1cmZhY2VzX2ludGVybmFsKSk7CisgICAgICAgICAgICBpZiAoIXMtPnN1cmZhY2VzX2ludGVybmFsKQorICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX2h3Y3R4LT5uYl9zdXJmYWNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgcXN2X2luaXRfc3VyZmFjZShkc3RfY3R4LCAmcy0+c3VyZmFjZXNfaW50ZXJuYWxbaV0pOworICAgICAgICAgICAgICAgIHMtPnN1cmZhY2VzX2ludGVybmFsW2ldLkRhdGEuTWVtSWQgPSBzcmNfaHdjdHgtPnN1cmZhY2VfaWRzICsgaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdF9od2N0eC0+bmJfc3VyZmFjZXMgPSBzcmNfaHdjdHgtPm5iX3N1cmZhY2VzOworICAgICAgICAgICAgZHN0X2h3Y3R4LT5mcmFtZV90eXBlICA9IE1GWF9NRU1UWVBFX1ZJREVPX01FTU9SWV9ERUNPREVSX1RBUkdFVDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIENPTkZJR19EWFZBMgorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9EWFZBMjoKKyAgICAgICAgeworICAgICAgICAgICAgQVZEWFZBMkZyYW1lc0NvbnRleHQgKnNyY19od2N0eCA9IHNyY19jdHgtPmh3Y3R4OworICAgICAgICAgICAgcy0+c3VyZmFjZXNfaW50ZXJuYWwgPSBhdl9tYWxsb2N6X2FycmF5KHNyY19od2N0eC0+bmJfc3VyZmFjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzLT5zdXJmYWNlc19pbnRlcm5hbCkpOworICAgICAgICAgICAgaWYgKCFzLT5zdXJmYWNlc19pbnRlcm5hbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNyY19od2N0eC0+bmJfc3VyZmFjZXM7IGkrKykgeworICAgICAgICAgICAgICAgIHFzdl9pbml0X3N1cmZhY2UoZHN0X2N0eCwgJnMtPnN1cmZhY2VzX2ludGVybmFsW2ldKTsKKyAgICAgICAgICAgICAgICBzLT5zdXJmYWNlc19pbnRlcm5hbFtpXS5EYXRhLk1lbUlkID0gKG1meE1lbUlkKXNyY19od2N0eC0+c3VyZmFjZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RfaHdjdHgtPm5iX3N1cmZhY2VzID0gc3JjX2h3Y3R4LT5uYl9zdXJmYWNlczsKKyAgICAgICAgICAgIGlmIChzcmNfaHdjdHgtPnN1cmZhY2VfdHlwZSA9PSBEWFZBMl9WaWRlb1Byb2Nlc3NvclJlbmRlclRhcmdldCkKKyAgICAgICAgICAgICAgICBkc3RfaHdjdHgtPmZyYW1lX3R5cGUgPSBNRlhfTUVNVFlQRV9WSURFT19NRU1PUllfUFJPQ0VTU09SX1RBUkdFVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkc3RfaHdjdHgtPmZyYW1lX3R5cGUgPSBNRlhfTUVNVFlQRV9WSURFT19NRU1PUllfREVDT0RFUl9UQVJHRVQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGRzdF9od2N0eC0+c3VyZmFjZXMgPSBzLT5zdXJmYWNlc19pbnRlcm5hbDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzdl9tYXBfdG8oQVZIV0ZyYW1lc0NvbnRleHQgKmRzdF9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmbGFncykKK3sKKyAgICBBVlFTVkZyYW1lc0NvbnRleHQgKmh3Y3R4ID0gZHN0X2N0eC0+aHdjdHg7CisgICAgaW50IGksIGVycjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBod2N0eC0+bmJfc3VyZmFjZXM7IGkrKykgeworI2lmIENPTkZJR19WQUFQSQorICAgICAgICBpZiAoKihWQVN1cmZhY2VJRCopaHdjdHgtPnN1cmZhY2VzW2ldLkRhdGEuTWVtSWQgPT0KKyAgICAgICAgICAgIChWQVN1cmZhY2VJRCkodWludHB0cl90KXNyYy0+ZGF0YVszXSkKKyAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisjaWYgQ09ORklHX0RYVkEyCisgICAgICAgIGlmICgoSURpcmVjdDNEU3VyZmFjZTkqKWh3Y3R4LT5zdXJmYWNlc1tpXS5EYXRhLk1lbUlkID09CisgICAgICAgICAgICAoSURpcmVjdDNEU3VyZmFjZTkqKSh1aW50cHRyX3Qpc3JjLT5kYXRhWzNdKQorICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICB9CisgICAgaWYgKGkgPj0gaHdjdHgtPm5iX3N1cmZhY2VzKSB7CisgICAgICAgIGF2X2xvZyhkc3RfY3R4LCBBVl9MT0dfRVJST1IsICJUcnlpbmcgdG8gbWFwIGZyb20gYSBzdXJmYWNlIHdoaWNoICIKKyAgICAgICAgICAgICAgICJpcyBub3QgaW4gdGhlIG1hcHBlZCBmcmFtZXMgY29udGV4dC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGVyciA9IGZmX2h3ZnJhbWVfbWFwX2NyZWF0ZShkc3QtPmh3X2ZyYW1lc19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgc3JjLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoZXJyKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgZHN0LT53aWR0aCAgID0gc3JjLT53aWR0aDsKKyAgICBkc3QtPmhlaWdodCAgPSBzcmMtPmhlaWdodDsKKyAgICBkc3QtPmRhdGFbM10gPSAodWludDhfdCopJmh3Y3R4LT5zdXJmYWNlc1tpXTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHFzdl9mcmFtZXNfZ2V0X2NvbnN0cmFpbnRzKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmh3Y29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkhXRnJhbWVzQ29uc3RyYWludHMgKmNvbnN0cmFpbnRzKQoreworICAgIGludCBpOworCisgICAgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHMgPSBhdl9tYWxsb2NfYXJyYXkoRkZfQVJSQVlfRUxFTVMoc3VwcG9ydGVkX3BpeGVsX2Zvcm1hdHMpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzKSk7CisgICAgaWYgKCFjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzdXBwb3J0ZWRfcGl4ZWxfZm9ybWF0cyk7IGkrKykKKyAgICAgICAgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHNbaV0gPSBzdXBwb3J0ZWRfcGl4ZWxfZm9ybWF0c1tpXS5waXhfZm10OworICAgIGNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzW0ZGX0FSUkFZX0VMRU1TKHN1cHBvcnRlZF9waXhlbF9mb3JtYXRzKV0gPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICBjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0cyA9IGF2X21hbGxvY19hcnJheSgyLCBzaXplb2YoKmNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzKSk7CisgICAgaWYgKCFjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzWzBdID0gQVZfUElYX0ZNVF9RU1Y7CisgICAgY29uc3RyYWludHMtPnZhbGlkX2h3X2Zvcm1hdHNbMV0gPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcXN2X2RldmljZV9mcmVlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgpCit7CisgICAgQVZRU1ZEZXZpY2VDb250ZXh0ICpod2N0eCA9IGN0eC0+aHdjdHg7CisgICAgUVNWRGV2aWNlUHJpdiAgICAgICAqcHJpdiA9IGN0eC0+dXNlcl9vcGFxdWU7CisKKyAgICBpZiAoaHdjdHgtPnNlc3Npb24pCisgICAgICAgIE1GWENsb3NlKGh3Y3R4LT5zZXNzaW9uKTsKKworICAgIGF2X2J1ZmZlcl91bnJlZigmcHJpdi0+Y2hpbGRfZGV2aWNlX2N0eCk7CisgICAgYXZfZnJlZXAoJnByaXYpOworfQorCitzdGF0aWMgbWZ4SU1QTCBjaG9vc2VfaW1wbGVtZW50YXRpb24oY29uc3QgY2hhciAqZGV2aWNlKQoreworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICBtZnhJTVBMICAgICBpbXBsOworICAgIH0gaW1wbF9tYXBbXSA9IHsKKyAgICAgICAgeyAiYXV0byIsICAgICBNRlhfSU1QTF9BVVRPICAgICAgICAgfSwKKyAgICAgICAgeyAic3ciLCAgICAgICBNRlhfSU1QTF9TT0ZUV0FSRSAgICAgfSwKKyAgICAgICAgeyAiaHciLCAgICAgICBNRlhfSU1QTF9IQVJEV0FSRSAgICAgfSwKKyAgICAgICAgeyAiYXV0b19hbnkiLCBNRlhfSU1QTF9BVVRPX0FOWSAgICAgfSwKKyAgICAgICAgeyAiaHdfYW55IiwgICBNRlhfSU1QTF9IQVJEV0FSRV9BTlkgfSwKKyAgICAgICAgeyAiaHcyIiwgICAgICBNRlhfSU1QTF9IQVJEV0FSRTIgICAgfSwKKyAgICAgICAgeyAiaHczIiwgICAgICBNRlhfSU1QTF9IQVJEV0FSRTMgICAgfSwKKyAgICAgICAgeyAiaHc0IiwgICAgICBNRlhfSU1QTF9IQVJEV0FSRTQgICAgfSwKKyAgICB9OworCisgICAgbWZ4SU1QTCBpbXBsID0gTUZYX0lNUExfQVVUT19BTlk7CisgICAgaW50IGk7CisKKyAgICBpZiAoZGV2aWNlKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhpbXBsX21hcCk7IGkrKykKKyAgICAgICAgICAgIGlmICghc3RyY21wKGRldmljZSwgaW1wbF9tYXBbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpbXBsID0gaW1wbF9tYXBbaV0uaW1wbDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPT0gRkZfQVJSQVlfRUxFTVMoaW1wbF9tYXApKQorICAgICAgICAgICAgaW1wbCA9IHN0cnRvbChkZXZpY2UsIE5VTEwsIDApOworICAgIH0KKworICAgIHJldHVybiBpbXBsOworfQorCitzdGF0aWMgaW50IHFzdl9kZXZpY2VfZGVyaXZlX2Zyb21fY2hpbGQoQVZIV0RldmljZUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZnhJTVBMIGltcGxlbWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSFdEZXZpY2VDb250ZXh0ICpjaGlsZF9kZXZpY2VfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBBVlFTVkRldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKworICAgIG1meFZlcnNpb24gICAgdmVyID0geyB7IDMsIDEgfSB9OworICAgIG1meEhETCAgICAgICAgaGFuZGxlOworICAgIG1meEhhbmRsZVR5cGUgaGFuZGxlX3R5cGU7CisgICAgbWZ4U3RhdHVzICAgICBlcnI7CisgICAgaW50IHJldDsKKworICAgIHN3aXRjaCAoY2hpbGRfZGV2aWNlX2N0eC0+dHlwZSkgeworI2lmIENPTkZJR19WQUFQSQorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9WQUFQSToKKyAgICAgICAgeworICAgICAgICAgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmNoaWxkX2RldmljZV9od2N0eCA9IGNoaWxkX2RldmljZV9jdHgtPmh3Y3R4OworICAgICAgICAgICAgaGFuZGxlX3R5cGUgPSBNRlhfSEFORExFX1ZBX0RJU1BMQVk7CisgICAgICAgICAgICBoYW5kbGUgPSAobWZ4SERMKWNoaWxkX2RldmljZV9od2N0eC0+ZGlzcGxheTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorI2lmIENPTkZJR19EWFZBMgorICAgIGNhc2UgQVZfSFdERVZJQ0VfVFlQRV9EWFZBMjoKKyAgICAgICAgeworICAgICAgICAgICAgQVZEWFZBMkRldmljZUNvbnRleHQgKmNoaWxkX2RldmljZV9od2N0eCA9IGNoaWxkX2RldmljZV9jdHgtPmh3Y3R4OworICAgICAgICAgICAgaGFuZGxlX3R5cGUgPSBNRlhfSEFORExFX0QzRDlfREVWSUNFX01BTkFHRVI7CisgICAgICAgICAgICBoYW5kbGUgPSAobWZ4SERMKWNoaWxkX2RldmljZV9od2N0eC0+ZGV2bWdyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9TWVMpOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZXJyID0gTUZYSW5pdChpbXBsZW1lbnRhdGlvbiwgJnZlciwgJmh3Y3R4LT5zZXNzaW9uKTsKKyAgICBpZiAoZXJyICE9IE1GWF9FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBpbml0aWFsaXppbmcgYW4gTUZYIHNlc3Npb246ICIKKyAgICAgICAgICAgICAgICIlZC5cbiIsIGVycik7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGVyciA9IE1GWFF1ZXJ5VmVyc2lvbihod2N0eC0+c2Vzc2lvbiwgJnZlcik7CisgICAgaWYgKGVyciAhPSBNRlhfRVJSX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcXVlcnlpbmcgYW4gTUZYIHNlc3Npb246ICVkLlxuIiwgZXJyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgYXZfbG9nKGN0eCwgQVZfTE9HX1ZFUkJPU0UsCisgICAgICAgICAgICJJbml0aWFsaXplIE1GWCBzZXNzaW9uOiBBUEkgdmVyc2lvbiBpcyAlZC4lZCwgaW1wbGVtZW50YXRpb24gdmVyc2lvbiBpcyAlZC4lZFxuIiwKKyAgICAgICAgICAgTUZYX1ZFUlNJT05fTUFKT1IsIE1GWF9WRVJTSU9OX01JTk9SLCB2ZXIuTWFqb3IsIHZlci5NaW5vcik7CisKKyAgICBNRlhDbG9zZShod2N0eC0+c2Vzc2lvbik7CisKKyAgICBlcnIgPSBNRlhJbml0KGltcGxlbWVudGF0aW9uLCAmdmVyLCAmaHdjdHgtPnNlc3Npb24pOworICAgIGlmIChlcnIgIT0gTUZYX0VSUl9OT05FKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICJFcnJvciBpbml0aWFsaXppbmcgYW4gTUZYIHNlc3Npb246ICVkLlxuIiwgZXJyKTsKKyAgICAgICAgcmV0ID0gQVZFUlJPUl9VTktOT1dOOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgZXJyID0gTUZYVmlkZW9DT1JFX1NldEhhbmRsZShod2N0eC0+c2Vzc2lvbiwgaGFuZGxlX3R5cGUsIGhhbmRsZSk7CisgICAgaWYgKGVyciAhPSBNRlhfRVJSX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3Igc2V0dGluZyBjaGlsZCBkZXZpY2UgaGFuZGxlOiAiCisgICAgICAgICAgICAgICAiJWRcbiIsIGVycik7CisgICAgICAgIHJldCA9IEFWRVJST1JfVU5LTk9XTjsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIHJldCA9IE1GWFF1ZXJ5VmVyc2lvbihod2N0eC0+c2Vzc2lvbiwmdmVyKTsKKyAgICBpZiAocmV0ID09IE1GWF9FUlJfTk9ORSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIk1GWCBjb21waWxlL3J1bnRpbWUgQVBJOiAlZC4lZC8lZC4lZFxuIiwKKyAgICAgICAgICAgICAgIE1GWF9WRVJTSU9OX01BSk9SLCBNRlhfVkVSU0lPTl9NSU5PUiwgdmVyLk1ham9yLCB2ZXIuTWlub3IpOworICAgIH0KKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBpZiAoaHdjdHgtPnNlc3Npb24pCisgICAgICAgIE1GWENsb3NlKGh3Y3R4LT5zZXNzaW9uKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHFzdl9kZXZpY2VfZGVyaXZlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSFdEZXZpY2VDb250ZXh0ICpjaGlsZF9kZXZpY2VfY3R4LCBpbnQgZmxhZ3MpCit7CisgICAgcmV0dXJuIHFzdl9kZXZpY2VfZGVyaXZlX2Zyb21fY2hpbGQoY3R4LCBNRlhfSU1QTF9IQVJEV0FSRV9BTlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfZGV2aWNlX2N0eCwgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHFzdl9kZXZpY2VfY3JlYXRlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzLCBpbnQgZmxhZ3MpCit7CisgICAgUVNWRGV2aWNlUHJpdiAqcHJpdjsKKyAgICBlbnVtIEFWSFdEZXZpY2VUeXBlIGNoaWxkX2RldmljZV90eXBlOworICAgIEFWSFdEZXZpY2VDb250ZXh0ICpjaGlsZF9kZXZpY2U7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7CisKKyAgICBtZnhJTVBMIGltcGw7CisgICAgaW50IHJldDsKKworICAgIHByaXYgPSBhdl9tYWxsb2N6KHNpemVvZigqcHJpdikpOworICAgIGlmICghcHJpdikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+dXNlcl9vcGFxdWUgPSBwcml2OworICAgIGN0eC0+ZnJlZSAgICAgICAgPSBxc3ZfZGV2aWNlX2ZyZWU7CisKKyAgICBlID0gYXZfZGljdF9nZXQob3B0cywgImNoaWxkX2RldmljZSIsIE5VTEwsIDApOworCisgICAgaWYgKENPTkZJR19WQUFQSSkKKyAgICAgICAgY2hpbGRfZGV2aWNlX3R5cGUgPSBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJOworICAgIGVsc2UgaWYgKENPTkZJR19EWFZBMikKKyAgICAgICAgY2hpbGRfZGV2aWNlX3R5cGUgPSBBVl9IV0RFVklDRV9UWVBFX0RYVkEyOworICAgIGVsc2UgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJObyBzdXBwb3J0ZWQgY2hpbGQgZGV2aWNlIHR5cGUgaXMgZW5hYmxlZFxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgcmV0ID0gYXZfaHdkZXZpY2VfY3R4X2NyZWF0ZSgmcHJpdi0+Y2hpbGRfZGV2aWNlX2N0eCwgY2hpbGRfZGV2aWNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID8gZS0+dmFsdWUgOiBOVUxMLCBOVUxMLCAwKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgcmV0dXJuIHJldDsKKworICAgIGNoaWxkX2RldmljZSA9IChBVkhXRGV2aWNlQ29udGV4dCopcHJpdi0+Y2hpbGRfZGV2aWNlX2N0eC0+ZGF0YTsKKworICAgIGltcGwgPSBjaG9vc2VfaW1wbGVtZW50YXRpb24oZGV2aWNlKTsKKworICAgIHJldHVybiBxc3ZfZGV2aWNlX2Rlcml2ZV9mcm9tX2NoaWxkKGN0eCwgaW1wbCwgY2hpbGRfZGV2aWNlLCAwKTsKK30KKworY29uc3QgSFdDb250ZXh0VHlwZSBmZl9od2NvbnRleHRfdHlwZV9xc3YgPSB7CisgICAgLnR5cGUgICAgICAgICAgICAgICAgICAgPSBBVl9IV0RFVklDRV9UWVBFX1FTViwKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgICA9ICJRU1YiLAorCisgICAgLmRldmljZV9od2N0eF9zaXplICAgICAgPSBzaXplb2YoQVZRU1ZEZXZpY2VDb250ZXh0KSwKKyAgICAuZGV2aWNlX3ByaXZfc2l6ZSAgICAgICA9IHNpemVvZihRU1ZEZXZpY2VDb250ZXh0KSwKKyAgICAuZnJhbWVzX2h3Y3R4X3NpemUgICAgICA9IHNpemVvZihBVlFTVkZyYW1lc0NvbnRleHQpLAorICAgIC5mcmFtZXNfcHJpdl9zaXplICAgICAgID0gc2l6ZW9mKFFTVkZyYW1lc0NvbnRleHQpLAorCisgICAgLmRldmljZV9jcmVhdGUgICAgICAgICAgPSBxc3ZfZGV2aWNlX2NyZWF0ZSwKKyAgICAuZGV2aWNlX2Rlcml2ZSAgICAgICAgICA9IHFzdl9kZXZpY2VfZGVyaXZlLAorICAgIC5kZXZpY2VfaW5pdCAgICAgICAgICAgID0gcXN2X2RldmljZV9pbml0LAorICAgIC5mcmFtZXNfZ2V0X2NvbnN0cmFpbnRzID0gcXN2X2ZyYW1lc19nZXRfY29uc3RyYWludHMsCisgICAgLmZyYW1lc19pbml0ICAgICAgICAgICAgPSBxc3ZfZnJhbWVzX2luaXQsCisgICAgLmZyYW1lc191bmluaXQgICAgICAgICAgPSBxc3ZfZnJhbWVzX3VuaW5pdCwKKyAgICAuZnJhbWVzX2dldF9idWZmZXIgICAgICA9IHFzdl9nZXRfYnVmZmVyLAorICAgIC50cmFuc2Zlcl9nZXRfZm9ybWF0cyAgID0gcXN2X3RyYW5zZmVyX2dldF9mb3JtYXRzLAorICAgIC50cmFuc2Zlcl9kYXRhX3RvICAgICAgID0gcXN2X3RyYW5zZmVyX2RhdGFfdG8sCisgICAgLnRyYW5zZmVyX2RhdGFfZnJvbSAgICAgPSBxc3ZfdHJhbnNmZXJfZGF0YV9mcm9tLAorICAgIC5tYXBfdG8gICAgICAgICAgICAgICAgID0gcXN2X21hcF90bywKKyAgICAubWFwX2Zyb20gICAgICAgICAgICAgICA9IHFzdl9tYXBfZnJvbSwKKyAgICAuZnJhbWVzX2Rlcml2ZV90byAgICAgICA9IHFzdl9mcmFtZXNfZGVyaXZlX3RvLAorICAgIC5mcmFtZXNfZGVyaXZlX2Zyb20gICAgID0gcXN2X2ZyYW1lc19kZXJpdmVfZnJvbSwKKworICAgIC5waXhfZm10cyA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfUVNWLCBBVl9QSVhfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X3Fzdi5oIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9xc3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOThkNjExCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF9xc3YuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0hXQ09OVEVYVF9RU1ZfSAorI2RlZmluZSBBVlVUSUxfSFdDT05URVhUX1FTVl9ICisKKyNpbmNsdWRlIDxtZngvbWZ4dmlkZW8uaD4KKworLyoqCisgKiBAZmlsZQorICogQW4gQVBJLXNwZWNpZmljIGhlYWRlciBmb3IgQVZfSFdERVZJQ0VfVFlQRV9RU1YuCisgKgorICogVGhpcyBBUEkgZG9lcyBub3Qgc3VwcG9ydCBkeW5hbWljIGZyYW1lIHBvb2xzLiBBVkhXRnJhbWVzQ29udGV4dC5wb29sIG11c3QKKyAqIGNvbnRhaW4gQVZCdWZmZXJSZWZzIHdob3NlIGRhdGEgcG9pbnRlciBwb2ludHMgdG8gYW4gbWZ4RnJhbWVTdXJmYWNlMSBzdHJ1Y3QuCisgKi8KKworLyoqCisgKiBUaGlzIHN0cnVjdCBpcyBhbGxvY2F0ZWQgYXMgQVZIV0RldmljZUNvbnRleHQuaHdjdHgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZRU1ZEZXZpY2VDb250ZXh0IHsKKyAgICBtZnhTZXNzaW9uIHNlc3Npb247Cit9IEFWUVNWRGV2aWNlQ29udGV4dDsKKworLyoqCisgKiBUaGlzIHN0cnVjdCBpcyBhbGxvY2F0ZWQgYXMgQVZIV0ZyYW1lc0NvbnRleHQuaHdjdHgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZRU1ZGcmFtZXNDb250ZXh0IHsKKyAgICBtZnhGcmFtZVN1cmZhY2UxICpzdXJmYWNlczsKKyAgICBpbnQgICAgICAgICAgICBuYl9zdXJmYWNlczsKKworICAgIC8qKgorICAgICAqIEEgY29tYmluYXRpb24gb2YgTUZYX01FTVRZUEVfKiBkZXNjcmliaW5nIHRoZSBmcmFtZSBwb29sLgorICAgICAqLworICAgIGludCBmcmFtZV90eXBlOworfSBBVlFTVkZyYW1lc0NvbnRleHQ7CisKKyNlbmRpZiAvKiBBVlVUSUxfSFdDT05URVhUX1FTVl9IICovCisKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9od2NvbnRleHRfdmFhcGkuYyBiL2xpYmF2dXRpbC9od2NvbnRleHRfdmFhcGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGFhYTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF92YWFwaS5jCkBAIC0wLDAgKzEsMTU2OCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBIQVZFX1ZBQVBJX1gxMQorIyAgIGluY2x1ZGUgPHZhL3ZhX3gxMS5oPgorI2VuZGlmCisjaWYgSEFWRV9WQUFQSV9EUk0KKyMgICBpbmNsdWRlIDx2YS92YV9kcm0uaD4KKyNlbmRpZgorCisjaWYgQ09ORklHX0xJQkRSTQorIyAgIGluY2x1ZGUgPHZhL3ZhX2RybWNvbW1vbi5oPgorIyAgIGluY2x1ZGUgPGRybV9mb3VyY2MuaD4KKyMgICBpZm5kZWYgRFJNX0ZPUk1BVF9NT0RfSU5WQUxJRAorIyAgICAgICBkZWZpbmUgRFJNX0ZPUk1BVF9NT0RfSU5WQUxJRCAoKDFVTEwgPDwgNTYpIC0gMSkKKyMgICBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2lmIEhBVkVfVU5JU1REX0gKKyMgICBpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisKKyNpbmNsdWRlICJhdmFzc2VydC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImh3Y29udGV4dC5oIgorI2luY2x1ZGUgImh3Y29udGV4dF9kcm0uaCIKKyNpbmNsdWRlICJod2NvbnRleHRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfdmFhcGkuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJwaXhkZXNjLmgiCisjaW5jbHVkZSAicGl4Zm10LmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElEZXZpY2VQcml2IHsKKyNpZiBIQVZFX1ZBQVBJX1gxMQorICAgIERpc3BsYXkgKngxMV9kaXNwbGF5OworI2VuZGlmCisKKyAgICBpbnQgZHJtX2ZkOworfSBWQUFQSURldmljZVByaXY7CisKK3R5cGVkZWYgc3RydWN0IFZBQVBJU3VyZmFjZUZvcm1hdCB7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgVkFJbWFnZUZvcm1hdCBpbWFnZV9mb3JtYXQ7Cit9IFZBQVBJU3VyZmFjZUZvcm1hdDsKKwordHlwZWRlZiBzdHJ1Y3QgVkFBUElEZXZpY2VDb250ZXh0IHsKKyAgICAvLyBTdXJmYWNlIGZvcm1hdHMgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCB0aGlzIGRldmljZS4KKyAgICBWQUFQSVN1cmZhY2VGb3JtYXQgKmZvcm1hdHM7CisgICAgaW50ICAgICAgICAgICAgICBuYl9mb3JtYXRzOworfSBWQUFQSURldmljZUNvbnRleHQ7CisKK3R5cGVkZWYgc3RydWN0IFZBQVBJRnJhbWVzQ29udGV4dCB7CisgICAgLy8gU3VyZmFjZSBhdHRyaWJ1dGVzIHNldCBhdCBjcmVhdGUgdGltZS4KKyAgICBWQVN1cmZhY2VBdHRyaWIgKmF0dHJpYnV0ZXM7CisgICAgaW50ICAgICAgICAgICBuYl9hdHRyaWJ1dGVzOworICAgIC8vIFJUIGZvcm1hdCBvZiB0aGUgdW5kZXJseWluZyBzdXJmYWNlIChJbnRlbCBkcml2ZXIgaWdub3JlcyB0aGlzIGFueXdheSkuCisgICAgdW5zaWduZWQgaW50IHJ0X2Zvcm1hdDsKKyAgICAvLyBXaGV0aGVyIHZhRGVyaXZlSW1hZ2Ugd29ya3MuCisgICAgaW50IGRlcml2ZV93b3JrczsKK30gVkFBUElGcmFtZXNDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBWQUFQSU1hcHBpbmcgeworICAgIC8vIEhhbmRsZSB0byB0aGUgZGVyaXZlZCBvciBjb3BpZWQgaW1hZ2Ugd2hpY2ggaXMgbWFwcGVkLgorICAgIFZBSW1hZ2UgaW1hZ2U7CisgICAgLy8gVGhlIG1hcHBpbmcgZmxhZ3MgYWN0dWFsbHkgdXNlZC4KKyAgICBpbnQgZmxhZ3M7Cit9IFZBQVBJTWFwcGluZzsKKworI2RlZmluZSBNQVAodmEsIHJ0LCBhdikgeyBcCisgICAgICAgIFZBX0ZPVVJDQ18gIyMgdmEsIFwKKyAgICAgICAgVkFfUlRfRk9STUFUXyAjIyBydCwgXAorICAgICAgICBBVl9QSVhfRk1UXyAjIyBhdiBcCisgICAgfQorLy8gVGhlIG1hcCBmb3VyY2MgPC0+IHBpeF9mbXQgaXNuJ3QgYmlqZWN0aXZlIGJlY2F1c2Ugb2YgdGhlIGFubm95aW5nIFUvVgorLy8gcGxhbmUgc3dhcCBjYXNlcy4gIFRoZSBmcmFtZSBoYW5kbGluZyBiZWxvdyB0cmllcyB0byBoaWRlIHRoZXNlLgorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgdW5zaWduZWQgaW50IGZvdXJjYzsKKyAgICB1bnNpZ25lZCBpbnQgcnRfZm9ybWF0OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworfSB2YWFwaV9mb3JtYXRfbWFwW10gPSB7CisgICAgTUFQKE5WMTIsIFlVVjQyMCwgIE5WMTIpLAorICAgIE1BUChZVjEyLCBZVVY0MjAsICBZVVY0MjBQKSwgLy8gV2l0aCBVL1YgcGxhbmVzIHN3YXBwZWQuCisgICAgTUFQKElZVVYsIFlVVjQyMCwgIFlVVjQyMFApLAorI2lmZGVmIFZBX0ZPVVJDQ19JNDIwCisgICAgTUFQKEk0MjAsIFlVVjQyMCwgIFlVVjQyMFApLAorI2VuZGlmCisjaWZkZWYgVkFfRk9VUkNDX1lWMTYKKyAgICBNQVAoWVYxNiwgWVVWNDIyLCAgWVVWNDIyUCksIC8vIFdpdGggVS9WIHBsYW5lcyBzd2FwcGVkLgorI2VuZGlmCisgICAgTUFQKDQyMkgsIFlVVjQyMiwgIFlVVjQyMlApLAorICAgIE1BUChVWVZZLCBZVVY0MjIsICBVWVZZNDIyKSwKKyAgICBNQVAoWVVZMiwgWVVWNDIyLCAgWVVZVjQyMiksCisgICAgTUFQKDQxMVAsIFlVVjQxMSwgIFlVVjQxMVApLAorICAgIE1BUCg0MjJWLCBZVVY0MjIsICBZVVY0NDBQKSwKKyAgICBNQVAoNDQ0UCwgWVVWNDQ0LCAgWVVWNDQ0UCksCisgICAgTUFQKFk4MDAsIFlVVjQwMCwgIEdSQVk4KSwKKyNpZmRlZiBWQV9GT1VSQ0NfUDAxMAorICAgIE1BUChQMDEwLCBZVVY0MjBfMTBCUFAsIFAwMTApLAorI2VuZGlmCisgICAgTUFQKEJHUkEsIFJHQjMyLCAgIEJHUkEpLAorICAgIE1BUChCR1JYLCBSR0IzMiwgICBCR1IwKSwKKyAgICBNQVAoUkdCQSwgUkdCMzIsICAgUkdCQSksCisgICAgTUFQKFJHQlgsIFJHQjMyLCAgIFJHQjApLAorI2lmZGVmIFZBX0ZPVVJDQ19BQkdSCisgICAgTUFQKEFCR1IsIFJHQjMyLCAgIEFCR1IpLAorICAgIE1BUChYQkdSLCBSR0IzMiwgICAwQkdSKSwKKyNlbmRpZgorICAgIE1BUChBUkdCLCBSR0IzMiwgICBBUkdCKSwKKyAgICBNQVAoWFJHQiwgUkdCMzIsICAgMFJHQiksCit9OworI3VuZGVmIE1BUAorCitzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IHZhYXBpX3BpeF9mbXRfZnJvbV9mb3VyY2ModW5zaWduZWQgaW50IGZvdXJjYykKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModmFhcGlfZm9ybWF0X21hcCk7IGkrKykKKyAgICAgICAgaWYgKHZhYXBpX2Zvcm1hdF9tYXBbaV0uZm91cmNjID09IGZvdXJjYykKKyAgICAgICAgICAgIHJldHVybiB2YWFwaV9mb3JtYXRfbWFwW2ldLnBpeF9mbXQ7CisgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKK30KKworc3RhdGljIGludCB2YWFwaV9nZXRfaW1hZ2VfZm9ybWF0KEFWSFdEZXZpY2VDb250ZXh0ICpod2RldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUltYWdlRm9ybWF0ICoqaW1hZ2VfZm9ybWF0KQoreworICAgIFZBQVBJRGV2aWNlQ29udGV4dCAqY3R4ID0gaHdkZXYtPmludGVybmFsLT5wcml2OworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+bmJfZm9ybWF0czsgaSsrKSB7CisgICAgICAgIGlmIChjdHgtPmZvcm1hdHNbaV0ucGl4X2ZtdCA9PSBwaXhfZm10KSB7CisgICAgICAgICAgICBpZiAoaW1hZ2VfZm9ybWF0KQorICAgICAgICAgICAgICAgICppbWFnZV9mb3JtYXQgPSAmY3R4LT5mb3JtYXRzW2ldLmltYWdlX2Zvcm1hdDsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZnJhbWVzX2dldF9jb25zdHJhaW50cyhBVkhXRGV2aWNlQ29udGV4dCAqaHdkZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaHdjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZIV0ZyYW1lc0NvbnN0cmFpbnRzICpjb25zdHJhaW50cykKK3sKKyAgICBBVlZBQVBJRGV2aWNlQ29udGV4dCAqaHdjdHggPSBod2Rldi0+aHdjdHg7CisgICAgY29uc3QgQVZWQUFQSUhXQ29uZmlnICpjb25maWcgPSBod2NvbmZpZzsKKyAgICBWQUFQSURldmljZUNvbnRleHQgKmN0eCA9IGh3ZGV2LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBWQVN1cmZhY2VBdHRyaWIgKmF0dHJfbGlzdCA9IE5VTEw7CisgICAgVkFTdGF0dXMgdmFzOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworICAgIHVuc2lnbmVkIGludCBmb3VyY2M7CisgICAgaW50IGVyciwgaSwgaiwgYXR0cl9jb3VudCwgcGl4X2ZtdF9jb3VudDsKKworICAgIGlmIChjb25maWcgJiYKKyAgICAgICAgIShod2N0eC0+ZHJpdmVyX3F1aXJrcyAmIEFWX1ZBQVBJX0RSSVZFUl9RVUlSS19TVVJGQUNFX0FUVFJJQlVURVMpKSB7CisgICAgICAgIGF0dHJfY291bnQgPSAwOworICAgICAgICB2YXMgPSB2YVF1ZXJ5U3VyZmFjZUF0dHJpYnV0ZXMoaHdjdHgtPmRpc3BsYXksIGNvbmZpZy0+Y29uZmlnX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJmF0dHJfY291bnQpOworICAgICAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBzdXJmYWNlIGF0dHJpYnV0ZXM6ICIKKyAgICAgICAgICAgICAgICAgICAiJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PU1lTKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIGF0dHJfbGlzdCA9IGF2X21hbGxvYyhhdHRyX2NvdW50ICogc2l6ZW9mKCphdHRyX2xpc3QpKTsKKyAgICAgICAgaWYgKCFhdHRyX2xpc3QpIHsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorCisgICAgICAgIHZhcyA9IHZhUXVlcnlTdXJmYWNlQXR0cmlidXRlcyhod2N0eC0+ZGlzcGxheSwgY29uZmlnLT5jb25maWdfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX2xpc3QsICZhdHRyX2NvdW50KTsKKyAgICAgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcXVlcnkgc3VyZmFjZSBhdHRyaWJ1dGVzOiAiCisgICAgICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworICAgICAgICBwaXhfZm10X2NvdW50ID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0dHJfY291bnQ7IGkrKykgeworICAgICAgICAgICAgc3dpdGNoIChhdHRyX2xpc3RbaV0udHlwZSkgeworICAgICAgICAgICAgY2FzZSBWQVN1cmZhY2VBdHRyaWJQaXhlbEZvcm1hdDoKKyAgICAgICAgICAgICAgICBmb3VyY2MgPSBhdHRyX2xpc3RbaV0udmFsdWUudmFsdWUuaTsKKyAgICAgICAgICAgICAgICBwaXhfZm10ID0gdmFhcGlfcGl4X2ZtdF9mcm9tX2ZvdXJjYyhmb3VyY2MpOworICAgICAgICAgICAgICAgIGlmIChwaXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICArK3BpeF9mbXRfY291bnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIHVuc3VwcG9ydGVkIC0gaWdub3JlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFTdXJmYWNlQXR0cmliTWluV2lkdGg6CisgICAgICAgICAgICAgICAgY29uc3RyYWludHMtPm1pbl93aWR0aCAgPSBhdHRyX2xpc3RbaV0udmFsdWUudmFsdWUuaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVkFTdXJmYWNlQXR0cmliTWluSGVpZ2h0OgorICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLT5taW5faGVpZ2h0ID0gYXR0cl9saXN0W2ldLnZhbHVlLnZhbHVlLmk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBU3VyZmFjZUF0dHJpYk1heFdpZHRoOgorICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzLT5tYXhfd2lkdGggID0gYXR0cl9saXN0W2ldLnZhbHVlLnZhbHVlLmk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFZBU3VyZmFjZUF0dHJpYk1heEhlaWdodDoKKyAgICAgICAgICAgICAgICBjb25zdHJhaW50cy0+bWF4X2hlaWdodCA9IGF0dHJfbGlzdFtpXS52YWx1ZS52YWx1ZS5pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwaXhfZm10X2NvdW50ID09IDApIHsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdXNhYmxlIGZvdW5kLiAgUHJlc3VtYWJseSB0aGVyZSBleGlzdHMgc29tZXRoaW5nIHdoaWNoCisgICAgICAgICAgICAvLyB3b3Jrcywgc28gbGVhdmUgdGhlIHNldCBudWxsIHRvIGluZGljYXRlIHVua25vd24uCisgICAgICAgICAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cyA9IE5VTEw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cyA9IGF2X21hbGxvY19hcnJheShwaXhfZm10X2NvdW50ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwaXhfZm10KSk7CisgICAgICAgICAgICBpZiAoIWNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gaiA9IDA7IGkgPCBhdHRyX2NvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXR0cl9saXN0W2ldLnR5cGUgIT0gVkFTdXJmYWNlQXR0cmliUGl4ZWxGb3JtYXQpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGZvdXJjYyA9IGF0dHJfbGlzdFtpXS52YWx1ZS52YWx1ZS5pOworICAgICAgICAgICAgICAgIHBpeF9mbXQgPSB2YWFwaV9waXhfZm10X2Zyb21fZm91cmNjKGZvdXJjYyk7CisgICAgICAgICAgICAgICAgaWYgKHBpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FKQorICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0c1tqKytdID0gcGl4X2ZtdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF2X2Fzc2VydDAoaiA9PSBwaXhfZm10X2NvdW50KTsKKyAgICAgICAgICAgIGNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzW2pdID0gQVZfUElYX0ZNVF9OT05FOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTm8gY29uZmlndXJhdGlvbiBzdXBwbGllZC4KKyAgICAgICAgLy8gUmV0dXJuIHRoZSBmdWxsIHNldCBvZiBpbWFnZSBmb3JtYXRzIGtub3duIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHMgPSBhdl9tYWxsb2NfYXJyYXkoY3R4LT5uYl9mb3JtYXRzICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBpeF9mbXQpKTsKKyAgICAgICAgaWYgKCFjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cykgeworICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgZ290byBmYWlsOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2Zvcm1hdHM7IGkrKykKKyAgICAgICAgICAgIGNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzW2ldID0gY3R4LT5mb3JtYXRzW2ldLnBpeF9mbXQ7CisgICAgICAgIGNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzW2ldID0gQVZfUElYX0ZNVF9OT05FOworICAgIH0KKworICAgIGNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzID0gYXZfbWFsbG9jX2FycmF5KDIsIHNpemVvZihwaXhfZm10KSk7CisgICAgaWYgKCFjb25zdHJhaW50cy0+dmFsaWRfaHdfZm9ybWF0cykgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgY29uc3RyYWludHMtPnZhbGlkX2h3X2Zvcm1hdHNbMF0gPSBBVl9QSVhfRk1UX1ZBQVBJOworICAgIGNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzWzFdID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgZXJyID0gMDsKK2ZhaWw6CisgICAgYXZfZnJlZXAoJmF0dHJfbGlzdCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqZnJpZW5kbHlfbmFtZTsKKyAgICBjb25zdCBjaGFyICptYXRjaF9zdHJpbmc7CisgICAgdW5zaWduZWQgaW50IHF1aXJrczsKK30gdmFhcGlfZHJpdmVyX3F1aXJrc190YWJsZVtdID0geworICAgIHsKKyAgICAgICAgIkludGVsIGk5NjUgKFF1aWNrIFN5bmMpIiwKKyAgICAgICAgImk5NjUiLAorICAgICAgICBBVl9WQUFQSV9EUklWRVJfUVVJUktfUkVOREVSX1BBUkFNX0JVRkZFUlMsCisgICAgfSwKKyAgICB7CisgICAgICAgICJJbnRlbCBpSEQiLAorICAgICAgICAidWJpdCIsCisgICAgICAgIEFWX1ZBQVBJX0RSSVZFUl9RVUlSS19BVFRSSUJfTUVNVFlQRSwKKyAgICB9LAorICAgIHsKKyAgICAgICAgIlZEUEFVIHdyYXBwZXIiLAorICAgICAgICAiU3BsaXR0ZWQtRGVza3RvcCBTeXN0ZW1zIFZEUEFVIGJhY2tlbmQgZm9yIFZBLUFQSSIsCisgICAgICAgIEFWX1ZBQVBJX0RSSVZFUl9RVUlSS19TVVJGQUNFX0FUVFJJQlVURVMsCisgICAgfSwKK307CisKK3N0YXRpYyBpbnQgdmFhcGlfZGV2aWNlX2luaXQoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2KQoreworICAgIFZBQVBJRGV2aWNlQ29udGV4dCAqY3R4ID0gaHdkZXYtPmludGVybmFsLT5wcml2OworICAgIEFWVkFBUElEZXZpY2VDb250ZXh0ICpod2N0eCA9IGh3ZGV2LT5od2N0eDsKKyAgICBWQUltYWdlRm9ybWF0ICppbWFnZV9saXN0ID0gTlVMTDsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgY29uc3QgY2hhciAqdmVuZG9yX3N0cmluZzsKKyAgICBpbnQgZXJyLCBpLCBpbWFnZV9jb3VudDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKKyAgICB1bnNpZ25lZCBpbnQgZm91cmNjOworCisgICAgaW1hZ2VfY291bnQgPSB2YU1heE51bUltYWdlRm9ybWF0cyhod2N0eC0+ZGlzcGxheSk7CisgICAgaWYgKGltYWdlX2NvdW50IDw9IDApIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIGltYWdlX2xpc3QgPSBhdl9tYWxsb2MoaW1hZ2VfY291bnQgKiBzaXplb2YoKmltYWdlX2xpc3QpKTsKKyAgICBpZiAoIWltYWdlX2xpc3QpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorICAgIHZhcyA9IHZhUXVlcnlJbWFnZUZvcm1hdHMoaHdjdHgtPmRpc3BsYXksIGltYWdlX2xpc3QsICZpbWFnZV9jb3VudCk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBjdHgtPmZvcm1hdHMgID0gYXZfbWFsbG9jKGltYWdlX2NvdW50ICogc2l6ZW9mKCpjdHgtPmZvcm1hdHMpKTsKKyAgICBpZiAoIWN0eC0+Zm9ybWF0cykgeworICAgICAgICBlcnIgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisgICAgY3R4LT5uYl9mb3JtYXRzID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2VfY291bnQ7IGkrKykgeworICAgICAgICBmb3VyY2MgID0gaW1hZ2VfbGlzdFtpXS5mb3VyY2M7CisgICAgICAgIHBpeF9mbXQgPSB2YWFwaV9waXhfZm10X2Zyb21fZm91cmNjKGZvdXJjYyk7CisgICAgICAgIGlmIChwaXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfREVCVUcsICJGb3JtYXQgJSN4IC0+IHVua25vd24uXG4iLAorICAgICAgICAgICAgICAgICAgIGZvdXJjYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19ERUJVRywgIkZvcm1hdCAlI3ggLT4gJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIGZvdXJjYywgYXZfZ2V0X3BpeF9mbXRfbmFtZShwaXhfZm10KSk7CisgICAgICAgICAgICBjdHgtPmZvcm1hdHNbY3R4LT5uYl9mb3JtYXRzXS5waXhfZm10ICAgICAgPSBwaXhfZm10OworICAgICAgICAgICAgY3R4LT5mb3JtYXRzW2N0eC0+bmJfZm9ybWF0c10uaW1hZ2VfZm9ybWF0ID0gaW1hZ2VfbGlzdFtpXTsKKyAgICAgICAgICAgICsrY3R4LT5uYl9mb3JtYXRzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGh3Y3R4LT5kcml2ZXJfcXVpcmtzICYgQVZfVkFBUElfRFJJVkVSX1FVSVJLX1VTRVJfU0VUKSB7CisgICAgICAgIGF2X2xvZyhod2RldiwgQVZfTE9HX1ZFUkJPU0UsICJOb3QgZGV0ZWN0aW5nIGRyaXZlcjogIgorICAgICAgICAgICAgICAgInF1aXJrcyBzZXQgYnkgdXNlci5cbiIpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERldGVjdCB0aGUgZHJpdmVyIGluIHVzZSBhbmQgc2V0IHF1aXJrIGZsYWdzIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgdmVuZG9yX3N0cmluZyA9IHZhUXVlcnlWZW5kb3JTdHJpbmcoaHdjdHgtPmRpc3BsYXkpOworICAgICAgICBod2N0eC0+ZHJpdmVyX3F1aXJrcyA9IDA7CisgICAgICAgIGlmICh2ZW5kb3Jfc3RyaW5nKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModmFhcGlfZHJpdmVyX3F1aXJrc190YWJsZSk7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChzdHJzdHIodmVuZG9yX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhYXBpX2RyaXZlcl9xdWlya3NfdGFibGVbaV0ubWF0Y2hfc3RyaW5nKSkgeworICAgICAgICAgICAgICAgICAgICBhdl9sb2coaHdkZXYsIEFWX0xPR19WRVJCT1NFLCAiTWF0Y2hlZCBcIiVzXCIgYXMga25vd24gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImRyaXZlciBcIiVzXCIuXG4iLCB2ZW5kb3Jfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFhcGlfZHJpdmVyX3F1aXJrc190YWJsZVtpXS5mcmllbmRseV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaHdjdHgtPmRyaXZlcl9xdWlya3MgfD0KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhYXBpX2RyaXZlcl9xdWlya3NfdGFibGVbaV0ucXVpcmtzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShpIDwgRkZfQVJSQVlfRUxFTVModmFhcGlfZHJpdmVyX3F1aXJrc190YWJsZSkpKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGh3ZGV2LCBBVl9MT0dfVkVSQk9TRSwgIlVua25vd24gZHJpdmVyIFwiJXNcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAiYXNzdW1pbmcgc3RhbmRhcmQgYmVoYXZpb3VyLlxuIiwgdmVuZG9yX3N0cmluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdl9mcmVlKGltYWdlX2xpc3QpOworICAgIHJldHVybiAwOworZmFpbDoKKyAgICBhdl9mcmVlcCgmY3R4LT5mb3JtYXRzKTsKKyAgICBhdl9mcmVlKGltYWdlX2xpc3QpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHZhYXBpX2RldmljZV91bmluaXQoQVZIV0RldmljZUNvbnRleHQgKmh3ZGV2KQoreworICAgIFZBQVBJRGV2aWNlQ29udGV4dCAqY3R4ID0gaHdkZXYtPmludGVybmFsLT5wcml2OworCisgICAgYXZfZnJlZXAoJmN0eC0+Zm9ybWF0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHZhYXBpX2J1ZmZlcl9mcmVlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAgKmh3ZmMgPSBvcGFxdWU7CisgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmh3Y3R4ID0gaHdmYy0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgVkFTdXJmYWNlSUQgc3VyZmFjZV9pZDsKKyAgICBWQVN0YXR1cyB2YXM7CisKKyAgICBzdXJmYWNlX2lkID0gKFZBU3VyZmFjZUlEKSh1aW50cHRyX3QpZGF0YTsKKworICAgIHZhcyA9IHZhRGVzdHJveVN1cmZhY2VzKGh3Y3R4LT5kaXNwbGF5LCAmc3VyZmFjZV9pZCwgMSk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlc3Ryb3kgc3VyZmFjZSAlI3g6ICIKKyAgICAgICAgICAgICAgICIlZCAoJXMpLlxuIiwgc3VyZmFjZV9pZCwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgIH0KK30KKworc3RhdGljIEFWQnVmZmVyUmVmICp2YWFwaV9wb29sX2FsbG9jKHZvaWQgKm9wYXF1ZSwgaW50IHNpemUpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAgICpod2ZjID0gb3BhcXVlOworICAgIFZBQVBJRnJhbWVzQ29udGV4dCAgICAgKmN0eCA9IGh3ZmMtPmludGVybmFsLT5wcml2OworICAgIEFWVkFBUElEZXZpY2VDb250ZXh0ICpod2N0eCA9IGh3ZmMtPmRldmljZV9jdHgtPmh3Y3R4OworICAgIEFWVkFBUElGcmFtZXNDb250ZXh0ICAqYXZmYyA9IGh3ZmMtPmh3Y3R4OworICAgIFZBU3VyZmFjZUlEIHN1cmZhY2VfaWQ7CisgICAgVkFTdGF0dXMgdmFzOworICAgIEFWQnVmZmVyUmVmICpyZWY7CisKKyAgICBpZiAoaHdmYy0+aW5pdGlhbF9wb29sX3NpemUgPiAwICYmCisgICAgICAgIGF2ZmMtPm5iX3N1cmZhY2VzID49IGh3ZmMtPmluaXRpYWxfcG9vbF9zaXplKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHZhcyA9IHZhQ3JlYXRlU3VyZmFjZXMoaHdjdHgtPmRpc3BsYXksIGN0eC0+cnRfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdmYy0+d2lkdGgsIGh3ZmMtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdXJmYWNlX2lkLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5hdHRyaWJ1dGVzLCBjdHgtPm5iX2F0dHJpYnV0ZXMpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgc3VyZmFjZTogIgorICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBhdl9sb2coaHdmYywgQVZfTE9HX0RFQlVHLCAiQ3JlYXRlZCBzdXJmYWNlICUjeC5cbiIsIHN1cmZhY2VfaWQpOworCisgICAgcmVmID0gYXZfYnVmZmVyX2NyZWF0ZSgodWludDhfdCopKHVpbnRwdHJfdClzdXJmYWNlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN1cmZhY2VfaWQpLCAmdmFhcGlfYnVmZmVyX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBod2ZjLCBBVl9CVUZGRVJfRkxBR19SRUFET05MWSk7CisgICAgaWYgKCFyZWYpIHsKKyAgICAgICAgdmFEZXN0cm95U3VyZmFjZXMoaHdjdHgtPmRpc3BsYXksICZzdXJmYWNlX2lkLCAxKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGh3ZmMtPmluaXRpYWxfcG9vbF9zaXplID4gMCkgeworICAgICAgICAvLyBUaGlzIGlzIGEgZml4ZWQtc2l6ZSBwb29sLCBzbyB3ZSBtdXN0IHN0aWxsIGJlIGluIHRoZSBpbml0aWFsCisgICAgICAgIC8vIGFsbG9jYXRpb24gc2VxdWVuY2UuCisgICAgICAgIGF2X2Fzc2VydDAoYXZmYy0+bmJfc3VyZmFjZXMgPCBod2ZjLT5pbml0aWFsX3Bvb2xfc2l6ZSk7CisgICAgICAgIGF2ZmMtPnN1cmZhY2VfaWRzW2F2ZmMtPm5iX3N1cmZhY2VzXSA9IHN1cmZhY2VfaWQ7CisgICAgICAgICsrYXZmYy0+bmJfc3VyZmFjZXM7CisgICAgfQorCisgICAgcmV0dXJuIHJlZjsKK30KKworc3RhdGljIGludCB2YWFwaV9mcmFtZXNfaW5pdChBVkhXRnJhbWVzQ29udGV4dCAqaHdmYykKK3sKKyAgICBBVlZBQVBJRnJhbWVzQ29udGV4dCAgKmF2ZmMgPSBod2ZjLT5od2N0eDsKKyAgICBWQUFQSUZyYW1lc0NvbnRleHQgICAgICpjdHggPSBod2ZjLT5pbnRlcm5hbC0+cHJpdjsKKyAgICBBVlZBQVBJRGV2aWNlQ29udGV4dCAqaHdjdHggPSBod2ZjLT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBWQUltYWdlRm9ybWF0ICpleHBlY3RlZF9mb3JtYXQ7CisgICAgQVZCdWZmZXJSZWYgKnRlc3Rfc3VyZmFjZSA9IE5VTEw7CisgICAgVkFTdXJmYWNlSUQgdGVzdF9zdXJmYWNlX2lkOworICAgIFZBSW1hZ2UgdGVzdF9pbWFnZTsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgaW50IGVyciwgaTsKKyAgICB1bnNpZ25lZCBpbnQgZm91cmNjLCBydF9mb3JtYXQ7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModmFhcGlfZm9ybWF0X21hcCk7IGkrKykgeworICAgICAgICBpZiAodmFhcGlfZm9ybWF0X21hcFtpXS5waXhfZm10ID09IGh3ZmMtPnN3X2Zvcm1hdCkgeworICAgICAgICAgICAgZm91cmNjICAgID0gdmFhcGlfZm9ybWF0X21hcFtpXS5mb3VyY2M7CisgICAgICAgICAgICBydF9mb3JtYXQgPSB2YWFwaV9mb3JtYXRfbWFwW2ldLnJ0X2Zvcm1hdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpID49IEZGX0FSUkFZX0VMRU1TKHZhYXBpX2Zvcm1hdF9tYXApKSB7CisgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJVbnN1cHBvcnRlZCBmb3JtYXQ6ICVzLlxuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoaHdmYy0+c3dfZm9ybWF0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKCFod2ZjLT5wb29sKSB7CisgICAgICAgIGlmICghKGh3Y3R4LT5kcml2ZXJfcXVpcmtzICYgQVZfVkFBUElfRFJJVkVSX1FVSVJLX1NVUkZBQ0VfQVRUUklCVVRFUykpIHsKKyAgICAgICAgICAgIGludCBuZWVkX21lbW9yeV90eXBlID0gIShod2N0eC0+ZHJpdmVyX3F1aXJrcyAmIEFWX1ZBQVBJX0RSSVZFUl9RVUlSS19BVFRSSUJfTUVNVFlQRSk7CisgICAgICAgICAgICBpbnQgbmVlZF9waXhlbF9mb3JtYXQgPSAxOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2ZmMtPm5iX2F0dHJpYnV0ZXM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhdmZjLT5hdHRyaWJ1dGVzW2ldLnR5cGUgPT0gVkFTdXJmYWNlQXR0cmliTWVtb3J5VHlwZSkKKyAgICAgICAgICAgICAgICAgICAgbmVlZF9tZW1vcnlfdHlwZSAgPSAwOworICAgICAgICAgICAgICAgIGlmIChhdmZjLT5hdHRyaWJ1dGVzW2ldLnR5cGUgPT0gVkFTdXJmYWNlQXR0cmliUGl4ZWxGb3JtYXQpCisgICAgICAgICAgICAgICAgICAgIG5lZWRfcGl4ZWxfZm9ybWF0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN0eC0+bmJfYXR0cmlidXRlcyA9CisgICAgICAgICAgICAgICAgYXZmYy0+bmJfYXR0cmlidXRlcyArIG5lZWRfbWVtb3J5X3R5cGUgKyBuZWVkX3BpeGVsX2Zvcm1hdDsKKworICAgICAgICAgICAgY3R4LT5hdHRyaWJ1dGVzID0gYXZfbWFsbG9jKGN0eC0+bmJfYXR0cmlidXRlcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpjdHgtPmF0dHJpYnV0ZXMpKTsKKyAgICAgICAgICAgIGlmICghY3R4LT5hdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGF2ZmMtPm5iX2F0dHJpYnV0ZXM7IGkrKykKKyAgICAgICAgICAgICAgICBjdHgtPmF0dHJpYnV0ZXNbaV0gPSBhdmZjLT5hdHRyaWJ1dGVzW2ldOworICAgICAgICAgICAgaWYgKG5lZWRfbWVtb3J5X3R5cGUpIHsKKyAgICAgICAgICAgICAgICBjdHgtPmF0dHJpYnV0ZXNbaSsrXSA9IChWQVN1cmZhY2VBdHRyaWIpIHsKKyAgICAgICAgICAgICAgICAgICAgLnR5cGUgICAgICAgICAgPSBWQVN1cmZhY2VBdHRyaWJNZW1vcnlUeXBlLAorICAgICAgICAgICAgICAgICAgICAuZmxhZ3MgICAgICAgICA9IFZBX1NVUkZBQ0VfQVRUUklCX1NFVFRBQkxFLAorICAgICAgICAgICAgICAgICAgICAudmFsdWUudHlwZSAgICA9IFZBR2VuZXJpY1ZhbHVlVHlwZUludGVnZXIsCisgICAgICAgICAgICAgICAgICAgIC52YWx1ZS52YWx1ZS5pID0gVkFfU1VSRkFDRV9BVFRSSUJfTUVNX1RZUEVfVkEsCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZWVkX3BpeGVsX2Zvcm1hdCkgeworICAgICAgICAgICAgICAgIGN0eC0+YXR0cmlidXRlc1tpKytdID0gKFZBU3VyZmFjZUF0dHJpYikgeworICAgICAgICAgICAgICAgICAgICAudHlwZSAgICAgICAgICA9IFZBU3VyZmFjZUF0dHJpYlBpeGVsRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAuZmxhZ3MgICAgICAgICA9IFZBX1NVUkZBQ0VfQVRUUklCX1NFVFRBQkxFLAorICAgICAgICAgICAgICAgICAgICAudmFsdWUudHlwZSAgICA9IFZBR2VuZXJpY1ZhbHVlVHlwZUludGVnZXIsCisgICAgICAgICAgICAgICAgICAgIC52YWx1ZS52YWx1ZS5pID0gZm91cmNjLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9hc3NlcnQwKGkgPT0gY3R4LT5uYl9hdHRyaWJ1dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN0eC0+YXR0cmlidXRlcyA9IE5VTEw7CisgICAgICAgICAgICBjdHgtPm5iX2F0dHJpYnV0ZXMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgY3R4LT5ydF9mb3JtYXQgPSBydF9mb3JtYXQ7CisKKyAgICAgICAgaWYgKGh3ZmMtPmluaXRpYWxfcG9vbF9zaXplID4gMCkgeworICAgICAgICAgICAgLy8gVGhpcyBwb29sIHdpbGwgYmUgdXNhYmxlIGFzIGEgcmVuZGVyIHRhcmdldCwgc28gd2UgbmVlZCB0byBzdG9yZQorICAgICAgICAgICAgLy8gYWxsIG9mIHRoZSBzdXJmYWNlIElEcyBzb21ld2hlcmUgdGhhdCB2YUNyZWF0ZUNvbnRleHQoKSBjYWxscworICAgICAgICAgICAgLy8gd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGVtLgorICAgICAgICAgICAgYXZmYy0+bmJfc3VyZmFjZXMgPSAwOworICAgICAgICAgICAgYXZmYy0+c3VyZmFjZV9pZHMgPSBhdl9tYWxsb2MoaHdmYy0+aW5pdGlhbF9wb29sX3NpemUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCphdmZjLT5zdXJmYWNlX2lkcykpOworICAgICAgICAgICAgaWYgKCFhdmZjLT5zdXJmYWNlX2lkcykgeworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGlzIHBvb2wgYWxsb3dzIGR5bmFtaWMgc2l6aW5nLCBhbmQgd2lsbCBub3QgYmUgdXNhYmxlIGFzIGEKKyAgICAgICAgICAgIC8vIHJlbmRlciB0YXJnZXQuCisgICAgICAgICAgICBhdmZjLT5uYl9zdXJmYWNlcyA9IDA7CisgICAgICAgICAgICBhdmZjLT5zdXJmYWNlX2lkcyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBod2ZjLT5pbnRlcm5hbC0+cG9vbF9pbnRlcm5hbCA9CisgICAgICAgICAgICBhdl9idWZmZXJfcG9vbF9pbml0MihzaXplb2YoVkFTdXJmYWNlSUQpLCBod2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhYXBpX3Bvb2xfYWxsb2MsIE5VTEwpOworICAgICAgICBpZiAoIWh3ZmMtPmludGVybmFsLT5wb29sX2ludGVybmFsKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGNyZWF0ZSBWQUFQSSBzdXJmYWNlIHBvb2wuXG4iKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGEgc2luZ2xlIHN1cmZhY2UgdG8gdGVzdCB3aGV0aGVyIHZhRGVyaXZlSW1hZ2UoKSBpcyBnb2luZworICAgIC8vIHRvIHdvcmsgZm9yIHRoZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgIGlmIChod2ZjLT5wb29sKSB7CisgICAgICAgIHRlc3Rfc3VyZmFjZSA9IGF2X2J1ZmZlcl9wb29sX2dldChod2ZjLT5wb29sKTsKKyAgICAgICAgaWYgKCF0ZXN0X3N1cmZhY2UpIHsKKyAgICAgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJVbmFibGUgdG8gYWxsb2NhdGUgYSBzdXJmYWNlIGZyb20gIgorICAgICAgICAgICAgICAgICAgICJ1c2VyLWNvbmZpZ3VyZWQgYnVmZmVyIHBvb2wuXG4iKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRlc3Rfc3VyZmFjZSA9IGF2X2J1ZmZlcl9wb29sX2dldChod2ZjLT5pbnRlcm5hbC0+cG9vbF9pbnRlcm5hbCk7CisgICAgICAgIGlmICghdGVzdF9zdXJmYWNlKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGEgc3VyZmFjZSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAiaW50ZXJuYWwgYnVmZmVyIHBvb2wuXG4iKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgIH0KKyAgICB0ZXN0X3N1cmZhY2VfaWQgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdCl0ZXN0X3N1cmZhY2UtPmRhdGE7CisKKyAgICBjdHgtPmRlcml2ZV93b3JrcyA9IDA7CisKKyAgICBlcnIgPSB2YWFwaV9nZXRfaW1hZ2VfZm9ybWF0KGh3ZmMtPmRldmljZV9jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2ZjLT5zd19mb3JtYXQsICZleHBlY3RlZF9mb3JtYXQpOworICAgIGlmIChlcnIgPT0gMCkgeworICAgICAgICB2YXMgPSB2YURlcml2ZUltYWdlKGh3Y3R4LT5kaXNwbGF5LCB0ZXN0X3N1cmZhY2VfaWQsICZ0ZXN0X2ltYWdlKTsKKyAgICAgICAgaWYgKHZhcyA9PSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKGV4cGVjdGVkX2Zvcm1hdC0+Zm91cmNjID09IHRlc3RfaW1hZ2UuZm9ybWF0LmZvdXJjYykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfREVCVUcsICJEaXJlY3QgbWFwcGluZyBwb3NzaWJsZS5cbiIpOworICAgICAgICAgICAgICAgIGN0eC0+ZGVyaXZlX3dvcmtzID0gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19ERUJVRywgIkRpcmVjdCBtYXBwaW5nIGRpc2FibGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICJkZXJpdmVkIGltYWdlIGZvcm1hdCAlMDh4IGRvZXMgbm90IG1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGZvcm1hdCAlMDh4LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZm9ybWF0LT5mb3VyY2MsIHRlc3RfaW1hZ2UuZm9ybWF0LmZvdXJjYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YURlc3Ryb3lJbWFnZShod2N0eC0+ZGlzcGxheSwgdGVzdF9pbWFnZS5pbWFnZV9pZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0RFQlVHLCAiRGlyZWN0IG1hcHBpbmcgZGlzYWJsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAiZGVyaXZpbmcgaW1hZ2UgZG9lcyBub3Qgd29yazogIgorICAgICAgICAgICAgICAgICAgICIlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19ERUJVRywgIkRpcmVjdCBtYXBwaW5nIGRpc2FibGVkOiAiCisgICAgICAgICAgICAgICAiaW1hZ2UgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICB9CisKKyAgICBhdl9idWZmZXJfdW5yZWYoJnRlc3Rfc3VyZmFjZSk7CisgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisgICAgYXZfYnVmZmVyX3VucmVmKCZ0ZXN0X3N1cmZhY2UpOworICAgIGF2X2ZyZWVwKCZhdmZjLT5zdXJmYWNlX2lkcyk7CisgICAgYXZfZnJlZXAoJmN0eC0+YXR0cmlidXRlcyk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdmFhcGlfZnJhbWVzX3VuaW5pdChBVkhXRnJhbWVzQ29udGV4dCAqaHdmYykKK3sKKyAgICBBVlZBQVBJRnJhbWVzQ29udGV4dCAqYXZmYyA9IGh3ZmMtPmh3Y3R4OworICAgIFZBQVBJRnJhbWVzQ29udGV4dCAgICAqY3R4ID0gaHdmYy0+aW50ZXJuYWwtPnByaXY7CisKKyAgICBhdl9mcmVlcCgmYXZmYy0+c3VyZmFjZV9pZHMpOworICAgIGF2X2ZyZWVwKCZjdHgtPmF0dHJpYnV0ZXMpOworfQorCitzdGF0aWMgaW50IHZhYXBpX2dldF9idWZmZXIoQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9vbF9nZXQoaHdmYy0+cG9vbCk7CisgICAgaWYgKCFmcmFtZS0+YnVmWzBdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWUtPmRhdGFbM10gPSBmcmFtZS0+YnVmWzBdLT5kYXRhOworICAgIGZyYW1lLT5mb3JtYXQgID0gQVZfUElYX0ZNVF9WQUFQSTsKKyAgICBmcmFtZS0+d2lkdGggICA9IGh3ZmMtPndpZHRoOworICAgIGZyYW1lLT5oZWlnaHQgID0gaHdmYy0+aGVpZ2h0OworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfdHJhbnNmZXJfZ2V0X2Zvcm1hdHMoQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZIV0ZyYW1lVHJhbnNmZXJEaXJlY3Rpb24gZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKipmb3JtYXRzKQoreworICAgIFZBQVBJRGV2aWNlQ29udGV4dCAqY3R4ID0gaHdmYy0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICpwaXhfZm10czsKKyAgICBpbnQgaSwgaywgc3dfZm9ybWF0X2F2YWlsYWJsZTsKKworICAgIHN3X2Zvcm1hdF9hdmFpbGFibGUgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2Zvcm1hdHM7IGkrKykgeworICAgICAgICBpZiAoY3R4LT5mb3JtYXRzW2ldLnBpeF9mbXQgPT0gaHdmYy0+c3dfZm9ybWF0KQorICAgICAgICAgICAgc3dfZm9ybWF0X2F2YWlsYWJsZSA9IDE7CisgICAgfQorCisgICAgcGl4X2ZtdHMgPSBhdl9tYWxsb2MoKGN0eC0+bmJfZm9ybWF0cyArIDEpICogc2l6ZW9mKCpwaXhfZm10cykpOworICAgIGlmICghcGl4X2ZtdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBpZiAoc3dfZm9ybWF0X2F2YWlsYWJsZSkgeworICAgICAgICBwaXhfZm10c1swXSA9IGh3ZmMtPnN3X2Zvcm1hdDsKKyAgICAgICAgayA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgayA9IDA7CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBjdHgtPm5iX2Zvcm1hdHM7IGkrKykgeworICAgICAgICBpZiAoY3R4LT5mb3JtYXRzW2ldLnBpeF9mbXQgPT0gaHdmYy0+c3dfZm9ybWF0KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGF2X2Fzc2VydDAoayA8IGN0eC0+bmJfZm9ybWF0cyk7CisgICAgICAgIHBpeF9mbXRzW2srK10gPSBjdHgtPmZvcm1hdHNbaV0ucGl4X2ZtdDsKKyAgICB9CisgICAgcGl4X2ZtdHNba10gPSBBVl9QSVhfRk1UX05PTkU7CisKKyAgICAqZm9ybWF0cyA9IHBpeF9mbXRzOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2YWFwaV91bm1hcF9mcmFtZShBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXApCit7CisgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmh3Y3R4ID0gaHdmYy0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgVkFBUElNYXBwaW5nICAgICAgICAgICAqbWFwID0gaHdtYXAtPnByaXY7CisgICAgVkFTdXJmYWNlSUQgc3VyZmFjZV9pZDsKKyAgICBWQVN0YXR1cyB2YXM7CisKKyAgICBzdXJmYWNlX2lkID0gKFZBU3VyZmFjZUlEKSh1aW50cHRyX3QpaHdtYXAtPnNvdXJjZS0+ZGF0YVszXTsKKyAgICBhdl9sb2coaHdmYywgQVZfTE9HX0RFQlVHLCAiVW5tYXAgc3VyZmFjZSAlI3guXG4iLCBzdXJmYWNlX2lkKTsKKworICAgIHZhcyA9IHZhVW5tYXBCdWZmZXIoaHdjdHgtPmRpc3BsYXksIG1hcC0+aW1hZ2UuYnVmKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gdW5tYXAgaW1hZ2UgZnJvbSBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICIlI3g6ICVkICglcykuXG4iLCBzdXJmYWNlX2lkLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgfQorCisgICAgaWYgKChtYXAtPmZsYWdzICYgQVZfSFdGUkFNRV9NQVBfV1JJVEUpICYmCisgICAgICAgICEobWFwLT5mbGFncyAmIEFWX0hXRlJBTUVfTUFQX0RJUkVDVCkpIHsKKyAgICAgICAgdmFzID0gdmFQdXRJbWFnZShod2N0eC0+ZGlzcGxheSwgc3VyZmFjZV9pZCwgbWFwLT5pbWFnZS5pbWFnZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBod2ZjLT53aWR0aCwgaHdmYy0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIGh3ZmMtPndpZHRoLCBod2ZjLT5oZWlnaHQpOworICAgICAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIHdyaXRlIGltYWdlIHRvIHN1cmZhY2UgIgorICAgICAgICAgICAgICAgICAgICIlI3g6ICVkICglcykuXG4iLCBzdXJmYWNlX2lkLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YXMgPSB2YURlc3Ryb3lJbWFnZShod2N0eC0+ZGlzcGxheSwgbWFwLT5pbWFnZS5pbWFnZV9pZCk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlc3Ryb3kgaW1hZ2UgZnJvbSBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICIlI3g6ICVkICglcykuXG4iLCBzdXJmYWNlX2lkLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgfQorCisgICAgYXZfZnJlZShtYXApOworfQorCitzdGF0aWMgaW50IHZhYXBpX21hcF9mcmFtZShBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKmRzdCwgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpCit7CisgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmh3Y3R4ID0gaHdmYy0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgVkFBUElGcmFtZXNDb250ZXh0ICpjdHggPSBod2ZjLT5pbnRlcm5hbC0+cHJpdjsKKyAgICBWQVN1cmZhY2VJRCBzdXJmYWNlX2lkOworICAgIFZBSW1hZ2VGb3JtYXQgKmltYWdlX2Zvcm1hdDsKKyAgICBWQUFQSU1hcHBpbmcgKm1hcDsKKyAgICBWQVN0YXR1cyB2YXM7CisgICAgdm9pZCAqYWRkcmVzcyA9IE5VTEw7CisgICAgaW50IGVyciwgaTsKKworICAgIHN1cmZhY2VfaWQgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClzcmMtPmRhdGFbM107CisgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19ERUJVRywgIk1hcCBzdXJmYWNlICUjeC5cbiIsIHN1cmZhY2VfaWQpOworCisgICAgaWYgKCFjdHgtPmRlcml2ZV93b3JrcyAmJiAoZmxhZ3MgJiBBVl9IV0ZSQU1FX01BUF9ESVJFQ1QpKSB7CisgICAgICAgIC8vIFJlcXVlc3RlZCBkaXJlY3QgbWFwcGluZyBidXQgaXQgaXMgbm90IHBvc3NpYmxlLgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKyAgICBpZiAoZHN0LT5mb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKQorICAgICAgICBkc3QtPmZvcm1hdCA9IGh3ZmMtPnN3X2Zvcm1hdDsKKyAgICBpZiAoZHN0LT5mb3JtYXQgIT0gaHdmYy0+c3dfZm9ybWF0ICYmIChmbGFncyAmIEFWX0hXRlJBTUVfTUFQX0RJUkVDVCkpIHsKKyAgICAgICAgLy8gUmVxdWVzdGVkIGRpcmVjdCBtYXBwaW5nIGJ1dCB0aGUgZm9ybWF0cyBkbyBub3QgbWF0Y2guCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgZXJyID0gdmFhcGlfZ2V0X2ltYWdlX2Zvcm1hdChod2ZjLT5kZXZpY2VfY3R4LCBkc3QtPmZvcm1hdCwgJmltYWdlX2Zvcm1hdCk7CisgICAgaWYgKGVyciA8IDApIHsKKyAgICAgICAgLy8gUmVxdWVzdGVkIGZvcm1hdCBpcyBub3QgYSB2YWxpZCBvdXRwdXQgZm9ybWF0LgorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIG1hcCA9IGF2X21hbGxvYyhzaXplb2YoKm1hcCkpOworICAgIGlmICghbWFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1hcC0+ZmxhZ3MgPSBmbGFnczsKKyAgICBtYXAtPmltYWdlLmltYWdlX2lkID0gVkFfSU5WQUxJRF9JRDsKKworICAgIHZhcyA9IHZhU3luY1N1cmZhY2UoaHdjdHgtPmRpc3BsYXksIHN1cmZhY2VfaWQpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBzeW5jIHN1cmZhY2UgIgorICAgICAgICAgICAgICAgIiUjeDogJWQgKCVzKS5cbiIsIHN1cmZhY2VfaWQsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU8pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLy8gVGhlIG1lbW9yeSB3aGljaCB3ZSBtYXAgdXNpbmcgZGVyaXZlIG5lZWQgbm90IGJlIGNvbm5lY3RlZCB0byB0aGUgQ1BVCisgICAgLy8gaW4gYSB3YXkgY29uZHVjaXZlIHRvIGZhc3QgYWNjZXNzLiAgT24gR2VuNy1HZW45IEludGVsIGdyYXBoaWNzLCB0aGUKKyAgICAvLyBtZW1vcnkgaXMgbWFwcGFibGUgYnV0IG5vdCBjYWNoZWQsIHNvIG5vcm1hbCBtZW1jcHkoKS1saWtlIGFjY2VzcyBpcworICAgIC8vIHZlcnkgc2xvdyB0byByZWFkIGl0IChidXQgd3JpdGluZyBpcyBvaykuICBJdCBpcyBwb3NzaWJsZSB0byByZWFkIG11Y2gKKyAgICAvLyBmYXN0ZXIgd2l0aCBhIGNvcHkgcm91dGluZSB3aGljaCBpcyBhd2FyZSBvZiB0aGUgbGltaXRhdGlvbiwgYnV0IHdlCisgICAgLy8gYXNzdW1lIGZvciBub3cgdGhhdCB0aGUgdXNlciBpcyBub3QgYXdhcmUgb2YgdGhhdCBhbmQgd291bGQgdGhlcmVmb3JlCisgICAgLy8gcHJlZmVyIG5vdCB0byBiZSBnaXZlbiBkaXJlY3QtbWFwcGVkIG1lbW9yeSBpZiB0aGV5IHJlcXVlc3QgcmVhZCBhY2Nlc3MuCisgICAgaWYgKGN0eC0+ZGVyaXZlX3dvcmtzICYmIGRzdC0+Zm9ybWF0ID09IGh3ZmMtPnN3X2Zvcm1hdCAmJgorICAgICAgICAoKGZsYWdzICYgQVZfSFdGUkFNRV9NQVBfRElSRUNUKSB8fCAhKGZsYWdzICYgQVZfSFdGUkFNRV9NQVBfUkVBRCkpKSB7CisgICAgICAgIHZhcyA9IHZhRGVyaXZlSW1hZ2UoaHdjdHgtPmRpc3BsYXksIHN1cmZhY2VfaWQsICZtYXAtPmltYWdlKTsKKyAgICAgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBkZXJpdmUgaW1hZ2UgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgInN1cmZhY2UgJSN4OiAlZCAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgICAgICBzdXJmYWNlX2lkLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcC0+aW1hZ2UuZm9ybWF0LmZvdXJjYyAhPSBpbWFnZV9mb3JtYXQtPmZvdXJjYykgeworICAgICAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkRlcml2ZSBpbWFnZSBvZiBzdXJmYWNlICUjeCAiCisgICAgICAgICAgICAgICAgICAgImlzIGluIHdyb25nIGZvcm1hdDogZXhwZWN0ZWQgJSMwOHgsIGdvdCAlIzA4eC5cbiIsCisgICAgICAgICAgICAgICAgICAgc3VyZmFjZV9pZCwgaW1hZ2VfZm9ybWF0LT5mb3VyY2MsIG1hcC0+aW1hZ2UuZm9ybWF0LmZvdXJjYyk7CisgICAgICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKyAgICAgICAgbWFwLT5mbGFncyB8PSBBVl9IV0ZSQU1FX01BUF9ESVJFQ1Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFzID0gdmFDcmVhdGVJbWFnZShod2N0eC0+ZGlzcGxheSwgaW1hZ2VfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3ZmMtPndpZHRoLCBod2ZjLT5oZWlnaHQsICZtYXAtPmltYWdlKTsKKyAgICAgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgaW1hZ2UgZm9yICIKKyAgICAgICAgICAgICAgICAgICAic3VyZmFjZSAlI3g6ICVkICglcykuXG4iLAorICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfaWQsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShmbGFncyAmIEFWX0hXRlJBTUVfTUFQX09WRVJXUklURSkpIHsKKyAgICAgICAgICAgIHZhcyA9IHZhR2V0SW1hZ2UoaHdjdHgtPmRpc3BsYXksIHN1cmZhY2VfaWQsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3ZmMtPndpZHRoLCBod2ZjLT5oZWlnaHQsIG1hcC0+aW1hZ2UuaW1hZ2VfaWQpOworICAgICAgICAgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gcmVhZCBpbWFnZSBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgInN1cmZhY2UgJSN4OiAlZCAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZV9pZCwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgICAgICAgICBnb3RvIGZhaWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2YXMgPSB2YU1hcEJ1ZmZlcihod2N0eC0+ZGlzcGxheSwgbWFwLT5pbWFnZS5idWYsICZhZGRyZXNzKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gbWFwIGltYWdlIGZyb20gc3VyZmFjZSAiCisgICAgICAgICAgICAgICAiJSN4OiAlZCAoJXMpLlxuIiwgc3VyZmFjZV9pZCwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICBlcnIgPSBBVkVSUk9SKEVJTyk7CisgICAgICAgIGdvdG8gZmFpbDsKKyAgICB9CisKKyAgICBlcnIgPSBmZl9od2ZyYW1lX21hcF9jcmVhdGUoc3JjLT5od19mcmFtZXNfY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsIHNyYywgJnZhYXBpX3VubWFwX2ZyYW1lLCBtYXApOworICAgIGlmIChlcnIgPCAwKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBkc3QtPndpZHRoICA9IHNyYy0+d2lkdGg7CisgICAgZHN0LT5oZWlnaHQgPSBzcmMtPmhlaWdodDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBtYXAtPmltYWdlLm51bV9wbGFuZXM7IGkrKykgeworICAgICAgICBkc3QtPmRhdGFbaV0gPSAodWludDhfdCopYWRkcmVzcyArIG1hcC0+aW1hZ2Uub2Zmc2V0c1tpXTsKKyAgICAgICAgZHN0LT5saW5lc2l6ZVtpXSA9IG1hcC0+aW1hZ2UucGl0Y2hlc1tpXTsKKyAgICB9CisgICAgaWYgKAorI2lmZGVmIFZBX0ZPVVJDQ19ZVjE2CisgICAgICAgIG1hcC0+aW1hZ2UuZm9ybWF0LmZvdXJjYyA9PSBWQV9GT1VSQ0NfWVYxNiB8fAorI2VuZGlmCisgICAgICAgIG1hcC0+aW1hZ2UuZm9ybWF0LmZvdXJjYyA9PSBWQV9GT1VSQ0NfWVYxMikgeworICAgICAgICAvLyBDaHJvbWEgcGxhbmVzIGFyZSBZVlUgcmF0aGVyIHRoYW4gWVVWLCBzbyBzd2FwIHRoZW0uCisgICAgICAgIEZGU1dBUCh1aW50OF90KiwgZHN0LT5kYXRhWzFdLCBkc3QtPmRhdGFbMl0pOworICAgIH0KKworICAgIHJldHVybiAwOworCitmYWlsOgorICAgIGlmIChtYXApIHsKKyAgICAgICAgaWYgKGFkZHJlc3MpCisgICAgICAgICAgICB2YVVubWFwQnVmZmVyKGh3Y3R4LT5kaXNwbGF5LCBtYXAtPmltYWdlLmJ1Zik7CisgICAgICAgIGlmIChtYXAtPmltYWdlLmltYWdlX2lkICE9IFZBX0lOVkFMSURfSUQpCisgICAgICAgICAgICB2YURlc3Ryb3lJbWFnZShod2N0eC0+ZGlzcGxheSwgbWFwLT5pbWFnZS5pbWFnZV9pZCk7CisgICAgICAgIGF2X2ZyZWUobWFwKTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB2YWFwaV90cmFuc2Zlcl9kYXRhX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBBVkZyYW1lICptYXA7CisgICAgaW50IGVycjsKKworICAgIGlmIChkc3QtPndpZHRoID4gaHdmYy0+d2lkdGggfHwgZHN0LT5oZWlnaHQgPiBod2ZjLT5oZWlnaHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBtYXAgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghbWFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1hcC0+Zm9ybWF0ID0gZHN0LT5mb3JtYXQ7CisKKyAgICBlcnIgPSB2YWFwaV9tYXBfZnJhbWUoaHdmYywgbWFwLCBzcmMsIEFWX0hXRlJBTUVfTUFQX1JFQUQpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIG1hcC0+d2lkdGggID0gZHN0LT53aWR0aDsKKyAgICBtYXAtPmhlaWdodCA9IGRzdC0+aGVpZ2h0OworCisgICAgZXJyID0gYXZfZnJhbWVfY29weShkc3QsIG1hcCk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXJyID0gMDsKK2ZhaWw6CisgICAgYXZfZnJhbWVfZnJlZSgmbWFwKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZhYXBpX3RyYW5zZmVyX2RhdGFfdG8oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgQVZGcmFtZSAqbWFwOworICAgIGludCBlcnI7CisKKyAgICBpZiAoc3JjLT53aWR0aCA+IGh3ZmMtPndpZHRoIHx8IHNyYy0+aGVpZ2h0ID4gaHdmYy0+aGVpZ2h0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgbWFwID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIW1hcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtYXAtPmZvcm1hdCA9IHNyYy0+Zm9ybWF0OworCisgICAgZXJyID0gdmFhcGlfbWFwX2ZyYW1lKGh3ZmMsIG1hcCwgZHN0LCBBVl9IV0ZSQU1FX01BUF9XUklURSB8IEFWX0hXRlJBTUVfTUFQX09WRVJXUklURSk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgbWFwLT53aWR0aCAgPSBzcmMtPndpZHRoOworICAgIG1hcC0+aGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5KG1hcCwgc3JjKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSAwOworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZtYXApOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfbWFwX3RvX21lbW9yeShBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKQoreworICAgIGludCBlcnI7CisKKyAgICBpZiAoZHN0LT5mb3JtYXQgIT0gQVZfUElYX0ZNVF9OT05FKSB7CisgICAgICAgIGVyciA9IHZhYXBpX2dldF9pbWFnZV9mb3JtYXQoaHdmYy0+ZGV2aWNlX2N0eCwgZHN0LT5mb3JtYXQsIE5VTEwpOworICAgICAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgfQorCisgICAgZXJyID0gdmFhcGlfbWFwX2ZyYW1lKGh3ZmMsIGRzdCwgc3JjLCBmbGFncyk7CisgICAgaWYgKGVycikKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGVyciA9IGF2X2ZyYW1lX2NvcHlfcHJvcHMoZHN0LCBzcmMpOworICAgIGlmIChlcnIpCisgICAgICAgIHJldHVybiBlcnI7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIENPTkZJR19MSUJEUk0KKworI2RlZmluZSBEUk1fTUFQKHZhLCBsYXllcnMsIC4uLikgeyBcCisgICAgICAgIFZBX0ZPVVJDQ18gIyMgdmEsIFwKKyAgICAgICAgbGF5ZXJzLCBcCisgICAgICAgIHsgX19WQV9BUkdTX18gfSBcCisgICAgfQorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgdWludDMyX3QgdmFfZm91cmNjOworICAgIGludCAgIG5iX2xheWVyX2Zvcm1hdHM7CisgICAgdWludDMyX3QgbGF5ZXJfZm9ybWF0c1tBVl9EUk1fTUFYX1BMQU5FU107Cit9IHZhYXBpX2RybV9mb3JtYXRfbWFwW10gPSB7CisjaWZkZWYgRFJNX0ZPUk1BVF9SOAorICAgIERSTV9NQVAoTlYxMiwgMiwgRFJNX0ZPUk1BVF9SOCwgIERSTV9GT1JNQVRfUkc4OCksCisjZW5kaWYKKyAgICBEUk1fTUFQKE5WMTIsIDEsIERSTV9GT1JNQVRfTlYxMiksCisjaWYgZGVmaW5lZChWQV9GT1VSQ0NfUDAxMCkgJiYgZGVmaW5lZChEUk1fRk9STUFUX1IxNikKKyAgICBEUk1fTUFQKFAwMTAsIDIsIERSTV9GT1JNQVRfUjE2LCBEUk1fRk9STUFUX1JHMTYxNiksCisjZW5kaWYKKyAgICBEUk1fTUFQKEJHUkEsIDEsIERSTV9GT1JNQVRfQVJHQjg4ODgpLAorICAgIERSTV9NQVAoQkdSWCwgMSwgRFJNX0ZPUk1BVF9YUkdCODg4OCksCisgICAgRFJNX01BUChSR0JBLCAxLCBEUk1fRk9STUFUX0FCR1I4ODg4KSwKKyAgICBEUk1fTUFQKFJHQlgsIDEsIERSTV9GT1JNQVRfWEJHUjg4ODgpLAorI2lmZGVmIFZBX0ZPVVJDQ19BQkdSCisgICAgRFJNX01BUChBQkdSLCAxLCBEUk1fRk9STUFUX1JHQkE4ODg4KSwKKyAgICBEUk1fTUFQKFhCR1IsIDEsIERSTV9GT1JNQVRfUkdCWDg4ODgpLAorI2VuZGlmCisgICAgRFJNX01BUChBUkdCLCAxLCBEUk1fRk9STUFUX0JHUkE4ODg4KSwKKyAgICBEUk1fTUFQKFhSR0IsIDEsIERSTV9GT1JNQVRfQkdSWDg4ODgpLAorfTsKKyN1bmRlZiBEUk1fTUFQCisKK3N0YXRpYyB2b2lkIHZhYXBpX3VubWFwX2Zyb21fZHJtKEFWSFdGcmFtZXNDb250ZXh0ICpkc3RfZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV01hcERlc2NyaXB0b3IgKmh3bWFwKQoreworICAgIEFWVkFBUElEZXZpY2VDb250ZXh0ICpkc3RfZGV2ID0gZHN0X2ZjLT5kZXZpY2VfY3R4LT5od2N0eDsKKworICAgIFZBU3VyZmFjZUlEIHN1cmZhY2VfaWQgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClod21hcC0+cHJpdjsKKworICAgIGF2X2xvZyhkc3RfZmMsIEFWX0xPR19ERUJVRywgIkRlc3Ryb3kgc3VyZmFjZSAlI3guXG4iLCBzdXJmYWNlX2lkKTsKKworICAgIHZhRGVzdHJveVN1cmZhY2VzKGRzdF9kZXYtPmRpc3BsYXksICZzdXJmYWNlX2lkLCAxKTsKK30KKworc3RhdGljIGludCB2YWFwaV9tYXBfZnJvbV9kcm0oQVZIV0ZyYW1lc0NvbnRleHQgKnNyY19mYywgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpCit7CisgICAgQVZIV0ZyYW1lc0NvbnRleHQgICAgICAqZHN0X2ZjID0KKyAgICAgICAgKEFWSFdGcmFtZXNDb250ZXh0Kilkc3QtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisgICAgQVZWQUFQSURldmljZUNvbnRleHQgICpkc3RfZGV2ID0gZHN0X2ZjLT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBjb25zdCBBVkRSTUZyYW1lRGVzY3JpcHRvciAqZGVzYzsKKyAgICBWQVN1cmZhY2VJRCBzdXJmYWNlX2lkOworICAgIFZBU3RhdHVzIHZhczsKKyAgICB1aW50MzJfdCB2YV9mb3VyY2MsIHZhX3J0X2Zvcm1hdDsKKyAgICBpbnQgZXJyLCBpLCBqLCBrOworCisgICAgdW5zaWduZWQgbG9uZyBidWZmZXJfaGFuZGxlOworICAgIFZBU3VyZmFjZUF0dHJpYkV4dGVybmFsQnVmZmVycyBidWZmZXJfZGVzYzsKKyAgICBWQVN1cmZhY2VBdHRyaWIgYXR0cnNbMl0gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC50eXBlICA9IFZBU3VyZmFjZUF0dHJpYk1lbW9yeVR5cGUsCisgICAgICAgICAgICAuZmxhZ3MgPSBWQV9TVVJGQUNFX0FUVFJJQl9TRVRUQUJMRSwKKyAgICAgICAgICAgIC52YWx1ZS50eXBlICAgID0gVkFHZW5lcmljVmFsdWVUeXBlSW50ZWdlciwKKyAgICAgICAgICAgIC52YWx1ZS52YWx1ZS5pID0gVkFfU1VSRkFDRV9BVFRSSUJfTUVNX1RZUEVfRFJNX1BSSU1FLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAudHlwZSAgPSBWQVN1cmZhY2VBdHRyaWJFeHRlcm5hbEJ1ZmZlckRlc2NyaXB0b3IsCisgICAgICAgICAgICAuZmxhZ3MgPSBWQV9TVVJGQUNFX0FUVFJJQl9TRVRUQUJMRSwKKyAgICAgICAgICAgIC52YWx1ZS50eXBlICAgID0gVkFHZW5lcmljVmFsdWVUeXBlUG9pbnRlciwKKyAgICAgICAgICAgIC52YWx1ZS52YWx1ZS5wID0gJmJ1ZmZlcl9kZXNjLAorICAgICAgICB9CisgICAgfTsKKworICAgIGRlc2MgPSAoQVZEUk1GcmFtZURlc2NyaXB0b3IqKXNyYy0+ZGF0YVswXTsKKworICAgIGlmIChkZXNjLT5uYl9vYmplY3RzICE9IDEpIHsKKyAgICAgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0VSUk9SLCAiVkFBUEkgY2FuIG9ubHkgbWFwIGZyYW1lcyAiCisgICAgICAgICAgICAgICAibWFkZSBmcm9tIGEgc2luZ2xlIERSTSBvYmplY3QuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICB2YV9mb3VyY2MgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyh2YWFwaV9kcm1fZm9ybWF0X21hcCk7IGkrKykgeworICAgICAgICBpZiAoZGVzYy0+bmJfbGF5ZXJzICE9IHZhYXBpX2RybV9mb3JtYXRfbWFwW2ldLm5iX2xheWVyX2Zvcm1hdHMpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGRlc2MtPm5iX2xheWVyczsgaisrKSB7CisgICAgICAgICAgICBpZiAoZGVzYy0+bGF5ZXJzW2pdLmZvcm1hdCAhPQorICAgICAgICAgICAgICAgIHZhYXBpX2RybV9mb3JtYXRfbWFwW2ldLmxheWVyX2Zvcm1hdHNbal0pCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGogIT0gZGVzYy0+bmJfbGF5ZXJzKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHZhX2ZvdXJjYyA9IHZhYXBpX2RybV9mb3JtYXRfbWFwW2ldLnZhX2ZvdXJjYzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICghdmFfZm91cmNjKSB7CisgICAgICAgIGF2X2xvZyhkc3RfZmMsIEFWX0xPR19FUlJPUiwgIkRSTSBmb3JtYXQgbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAiYnkgVkFBUEkuXG4iKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfREVCVUcsICJNYXAgRFJNIG9iamVjdCAlZCB0byBWQUFQSSBhcyAiCisgICAgICAgICAgICIlMDh4LlxuIiwgZGVzYy0+b2JqZWN0c1swXS5mZCwgdmFfZm91cmNjKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyh2YWFwaV9mb3JtYXRfbWFwKTsgaSsrKSB7CisgICAgICAgIGlmICh2YWFwaV9mb3JtYXRfbWFwW2ldLmZvdXJjYyA9PSB2YV9mb3VyY2MpCisgICAgICAgICAgICB2YV9ydF9mb3JtYXQgPSB2YWFwaV9mb3JtYXRfbWFwW2ldLnJ0X2Zvcm1hdDsKKyAgICB9CisKKyAgICBidWZmZXJfaGFuZGxlID0gZGVzYy0+b2JqZWN0c1swXS5mZDsKKyAgICBidWZmZXJfZGVzYy5waXhlbF9mb3JtYXQgPSB2YV9mb3VyY2M7CisgICAgYnVmZmVyX2Rlc2Mud2lkdGggICAgICAgID0gc3JjX2ZjLT53aWR0aDsKKyAgICBidWZmZXJfZGVzYy5oZWlnaHQgICAgICAgPSBzcmNfZmMtPmhlaWdodDsKKyAgICBidWZmZXJfZGVzYy5kYXRhX3NpemUgICAgPSBkZXNjLT5vYmplY3RzWzBdLnNpemU7CisgICAgYnVmZmVyX2Rlc2MuYnVmZmVycyAgICAgID0gJmJ1ZmZlcl9oYW5kbGU7CisgICAgYnVmZmVyX2Rlc2MubnVtX2J1ZmZlcnMgID0gMTsKKyAgICBidWZmZXJfZGVzYy5mbGFncyAgICAgICAgPSAwOworCisgICAgayA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGRlc2MtPm5iX2xheWVyczsgaSsrKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkZXNjLT5sYXllcnNbaV0ubmJfcGxhbmVzOyBqKyspIHsKKyAgICAgICAgICAgIGJ1ZmZlcl9kZXNjLnBpdGNoZXNba10gPSBkZXNjLT5sYXllcnNbaV0ucGxhbmVzW2pdLnBpdGNoOworICAgICAgICAgICAgYnVmZmVyX2Rlc2Mub2Zmc2V0c1trXSA9IGRlc2MtPmxheWVyc1tpXS5wbGFuZXNbal0ub2Zmc2V0OworICAgICAgICAgICAgKytrOworICAgICAgICB9CisgICAgfQorICAgIGJ1ZmZlcl9kZXNjLm51bV9wbGFuZXMgPSBrOworCisgICAgdmFzID0gdmFDcmVhdGVTdXJmYWNlcyhkc3RfZGV2LT5kaXNwbGF5LCB2YV9ydF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdXJmYWNlX2lkLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMsIEZGX0FSUkFZX0VMRU1TKGF0dHJzKSk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coZHN0X2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIHN1cmZhY2UgZnJvbSBEUk0gIgorICAgICAgICAgICAgICAgIm9iamVjdDogJWQgKCVzKS5cbiIsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisgICAgYXZfbG9nKGRzdF9mYywgQVZfTE9HX0RFQlVHLCAiQ3JlYXRlIHN1cmZhY2UgJSN4LlxuIiwgc3VyZmFjZV9pZCk7CisKKyAgICBlcnIgPSBmZl9od2ZyYW1lX21hcF9jcmVhdGUoZHN0LT5od19mcmFtZXNfY3R4LCBkc3QsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhYXBpX3VubWFwX2Zyb21fZHJtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdClzdXJmYWNlX2lkKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgcmV0dXJuIGVycjsKKworICAgIGRzdC0+d2lkdGggICA9IHNyYy0+d2lkdGg7CisgICAgZHN0LT5oZWlnaHQgID0gc3JjLT5oZWlnaHQ7CisgICAgZHN0LT5kYXRhWzNdID0gKHVpbnQ4X3QqKSh1aW50cHRyX3Qpc3VyZmFjZV9pZDsKKworICAgIGF2X2xvZyhkc3RfZmMsIEFWX0xPR19ERUJVRywgIk1hcHBlZCBEUk0gb2JqZWN0ICVkIHRvICIKKyAgICAgICAgICAgInN1cmZhY2UgJSN4LlxuIiwgZGVzYy0+b2JqZWN0c1swXS5mZCwgc3VyZmFjZV9pZCk7CisKKyAgICByZXR1cm4gMDsKK30KKworI2lmIFZBX0NIRUNLX1ZFUlNJT04oMSwgMSwgMCkKK3N0YXRpYyB2b2lkIHZhYXBpX3VubWFwX3RvX2RybV9lc2goQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXApCit7CisgICAgQVZEUk1GcmFtZURlc2NyaXB0b3IgKmRybV9kZXNjID0gaHdtYXAtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHJtX2Rlc2MtPm5iX29iamVjdHM7IGkrKykKKyAgICAgICAgY2xvc2UoZHJtX2Rlc2MtPm9iamVjdHNbaV0uZmQpOworCisgICAgYXZfZnJlZXAoJmRybV9kZXNjKTsKK30KKworc3RhdGljIGludCB2YWFwaV9tYXBfdG9fZHJtX2VzaChBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMsIGludCBmbGFncykKK3sKKyAgICBBVlZBQVBJRGV2aWNlQ29udGV4dCAqaHdjdHggPSBod2ZjLT5kZXZpY2VfY3R4LT5od2N0eDsKKyAgICBWQVN1cmZhY2VJRCBzdXJmYWNlX2lkOworICAgIFZBU3RhdHVzIHZhczsKKyAgICBWQURSTVBSSU1FU3VyZmFjZURlc2NyaXB0b3IgdmFfZGVzYzsKKyAgICBBVkRSTUZyYW1lRGVzY3JpcHRvciAqZHJtX2Rlc2MgPSBOVUxMOworICAgIHVpbnQzMl90IGV4cG9ydF9mbGFnczsKKyAgICBpbnQgZXJyLCBpLCBqOworCisgICAgc3VyZmFjZV9pZCA9IChWQVN1cmZhY2VJRCkodWludHB0cl90KXNyYy0+ZGF0YVszXTsKKworICAgIGV4cG9ydF9mbGFncyA9IFZBX0VYUE9SVF9TVVJGQUNFX1NFUEFSQVRFX0xBWUVSUzsKKyAgICBpZiAoZmxhZ3MgJiBBVl9IV0ZSQU1FX01BUF9SRUFEKQorICAgICAgICBleHBvcnRfZmxhZ3MgfD0gVkFfRVhQT1JUX1NVUkZBQ0VfUkVBRF9PTkxZOworICAgIGlmIChmbGFncyAmIEFWX0hXRlJBTUVfTUFQX1dSSVRFKQorICAgICAgICBleHBvcnRfZmxhZ3MgfD0gVkFfRVhQT1JUX1NVUkZBQ0VfV1JJVEVfT05MWTsKKworICAgIHZhcyA9IHZhRXhwb3J0U3VyZmFjZUhhbmRsZShod2N0eC0+ZGlzcGxheSwgc3VyZmFjZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFfU1VSRkFDRV9BVFRSSUJfTUVNX1RZUEVfRFJNX1BSSU1FXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydF9mbGFncywgJnZhX2Rlc2MpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKHZhcyA9PSBWQV9TVEFUVVNfRVJST1JfVU5JTVBMRU1FTlRFRCkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZXhwb3J0IHN1cmZhY2UgJSN4OiAiCisgICAgICAgICAgICAgICAiJWQgKCVzKS5cbiIsIHN1cmZhY2VfaWQsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlPKTsKKyAgICB9CisKKyAgICBkcm1fZGVzYyA9IGF2X21hbGxvY3ooc2l6ZW9mKCpkcm1fZGVzYykpOworICAgIGlmICghZHJtX2Rlc2MpIHsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFTk9NRU0pOworICAgICAgICBnb3RvIGZhaWw7CisgICAgfQorCisgICAgLy8gQnkgc29tZSBiaXphcnJlIGNvaW5jaWRlbmNlLCB0aGVzZSBzdHJ1Y3R1cmVzIGFyZSB2ZXJ5IHNpbWlsYXIuLi4KKyAgICBkcm1fZGVzYy0+bmJfb2JqZWN0cyA9IHZhX2Rlc2MubnVtX29iamVjdHM7CisgICAgZm9yIChpID0gMDsgaSA8IHZhX2Rlc2MubnVtX29iamVjdHM7IGkrKykgeworICAgICAgICBkcm1fZGVzYy0+b2JqZWN0c1tpXS5mZCAgID0gdmFfZGVzYy5vYmplY3RzW2ldLmZkOworICAgICAgICBkcm1fZGVzYy0+b2JqZWN0c1tpXS5zaXplID0gdmFfZGVzYy5vYmplY3RzW2ldLnNpemU7CisgICAgICAgIGRybV9kZXNjLT5vYmplY3RzW2ldLmZvcm1hdF9tb2RpZmllciA9CisgICAgICAgICAgICB2YV9kZXNjLm9iamVjdHNbaV0uZHJtX2Zvcm1hdF9tb2RpZmllcjsKKyAgICB9CisgICAgZHJtX2Rlc2MtPm5iX2xheWVycyA9IHZhX2Rlc2MubnVtX2xheWVyczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmFfZGVzYy5udW1fbGF5ZXJzOyBpKyspIHsKKyAgICAgICAgZHJtX2Rlc2MtPmxheWVyc1tpXS5mb3JtYXQgICAgPSB2YV9kZXNjLmxheWVyc1tpXS5kcm1fZm9ybWF0OworICAgICAgICBkcm1fZGVzYy0+bGF5ZXJzW2ldLm5iX3BsYW5lcyA9IHZhX2Rlc2MubGF5ZXJzW2ldLm51bV9wbGFuZXM7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCB2YV9kZXNjLmxheWVyc1tpXS5udW1fcGxhbmVzOyBqKyspIHsKKyAgICAgICAgICAgIGRybV9kZXNjLT5sYXllcnNbaV0ucGxhbmVzW2pdLm9iamVjdF9pbmRleCA9CisgICAgICAgICAgICAgICAgdmFfZGVzYy5sYXllcnNbaV0ub2JqZWN0X2luZGV4W2pdOworICAgICAgICAgICAgZHJtX2Rlc2MtPmxheWVyc1tpXS5wbGFuZXNbal0ub2Zmc2V0ID0KKyAgICAgICAgICAgICAgICB2YV9kZXNjLmxheWVyc1tpXS5vZmZzZXRbal07CisgICAgICAgICAgICBkcm1fZGVzYy0+bGF5ZXJzW2ldLnBsYW5lc1tqXS5waXRjaCA9CisgICAgICAgICAgICAgICAgdmFfZGVzYy5sYXllcnNbaV0ucGl0Y2hbal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBmZl9od2ZyYW1lX21hcF9jcmVhdGUoc3JjLT5od19mcmFtZXNfY3R4LCBkc3QsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZhYXBpX3VubWFwX3RvX2RybV9lc2gsIGRybV9kZXNjKTsKKyAgICBpZiAoZXJyIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZHN0LT53aWR0aCAgID0gc3JjLT53aWR0aDsKKyAgICBkc3QtPmhlaWdodCAgPSBzcmMtPmhlaWdodDsKKyAgICBkc3QtPmRhdGFbMF0gPSAodWludDhfdCopZHJtX2Rlc2M7CisKKyAgICByZXR1cm4gMDsKKworZmFpbDoKKyAgICBmb3IgKGkgPSAwOyBpIDwgdmFfZGVzYy5udW1fb2JqZWN0czsgaSsrKQorICAgICAgICBjbG9zZSh2YV9kZXNjLm9iamVjdHNbaV0uZmQpOworICAgIGF2X2ZyZWVwKCZkcm1fZGVzYyk7CisgICAgcmV0dXJuIGVycjsKK30KKyNlbmRpZgorCisjaWYgVkFfQ0hFQ0tfVkVSU0lPTigwLCAzNiwgMCkKK3R5cGVkZWYgc3RydWN0IFZBQVBJRFJNSW1hZ2VCdWZmZXJNYXBwaW5nIHsKKyAgICBWQUltYWdlICAgICAgaW1hZ2U7CisgICAgVkFCdWZmZXJJbmZvIGJ1ZmZlcl9pbmZvOworCisgICAgQVZEUk1GcmFtZURlc2NyaXB0b3IgZHJtX2Rlc2M7Cit9IFZBQVBJRFJNSW1hZ2VCdWZmZXJNYXBwaW5nOworCitzdGF0aWMgdm9pZCB2YWFwaV91bm1hcF90b19kcm1fYWJoKEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTWFwRGVzY3JpcHRvciAqaHdtYXApCit7CisgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmh3Y3R4ID0gaHdmYy0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgVkFBUElEUk1JbWFnZUJ1ZmZlck1hcHBpbmcgKm1hcHBpbmcgPSBod21hcC0+cHJpdjsKKyAgICBWQVN1cmZhY2VJRCBzdXJmYWNlX2lkOworICAgIFZBU3RhdHVzIHZhczsKKworICAgIHN1cmZhY2VfaWQgPSAoVkFTdXJmYWNlSUQpKHVpbnRwdHJfdClod21hcC0+c291cmNlLT5kYXRhWzNdOworICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfREVCVUcsICJVbm1hcCBWQUFQSSBzdXJmYWNlICUjeCBmcm9tIERSTS5cbiIsCisgICAgICAgICAgIHN1cmZhY2VfaWQpOworCisgICAgLy8gRFJNIFBSSU1FIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGNsb3NlZCBieSB2YVJlbGVhc2VCdWZmZXJIYW5kbGUoKSwKKyAgICAvLyBzbyB3ZSBzaG91bGRuJ3QgY2xvc2UgdGhlbSBzZXBhcmF0ZWx5LgorCisgICAgdmFzID0gdmFSZWxlYXNlQnVmZmVySGFuZGxlKGh3Y3R4LT5kaXNwbGF5LCBtYXBwaW5nLT5pbWFnZS5idWYpOworICAgIGlmICh2YXMgIT0gVkFfU1RBVFVTX1NVQ0NFU1MpIHsKKyAgICAgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byByZWxlYXNlIGJ1ZmZlciAiCisgICAgICAgICAgICAgICAiaGFuZGxlIG9mIGltYWdlICUjeCAoZGVyaXZlZCBmcm9tIHN1cmZhY2UgJSN4KTogIgorICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCBtYXBwaW5nLT5pbWFnZS5idWYsIHN1cmZhY2VfaWQsCisgICAgICAgICAgICAgICB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgfQorCisgICAgdmFzID0gdmFEZXN0cm95SW1hZ2UoaHdjdHgtPmRpc3BsYXksIG1hcHBpbmctPmltYWdlLmltYWdlX2lkKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhod2ZjLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gZGVzdHJveSBpbWFnZSAiCisgICAgICAgICAgICAgICAiZGVyaXZlZCBmcm9tIHN1cmZhY2UgJSN4OiAlZCAoJXMpLlxuIiwKKyAgICAgICAgICAgICAgIHN1cmZhY2VfaWQsIHZhcywgdmFFcnJvclN0cih2YXMpKTsKKyAgICB9CisKKyAgICBhdl9mcmVlKG1hcHBpbmcpOworfQorCitzdGF0aWMgaW50IHZhYXBpX21hcF90b19kcm1fYWJoKEFWSFdGcmFtZXNDb250ZXh0ICpod2ZjLCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKQoreworICAgIEFWVkFBUElEZXZpY2VDb250ZXh0ICpod2N0eCA9IGh3ZmMtPmRldmljZV9jdHgtPmh3Y3R4OworICAgIFZBQVBJRFJNSW1hZ2VCdWZmZXJNYXBwaW5nICptYXBwaW5nID0gTlVMTDsKKyAgICBWQVN1cmZhY2VJRCBzdXJmYWNlX2lkOworICAgIFZBU3RhdHVzIHZhczsKKyAgICBpbnQgZXJyLCBpLCBwOworCisgICAgc3VyZmFjZV9pZCA9IChWQVN1cmZhY2VJRCkodWludHB0cl90KXNyYy0+ZGF0YVszXTsKKyAgICBhdl9sb2coaHdmYywgQVZfTE9HX0RFQlVHLCAiTWFwIFZBQVBJIHN1cmZhY2UgJSN4IHRvIERSTS5cbiIsCisgICAgICAgICAgIHN1cmZhY2VfaWQpOworCisgICAgbWFwcGluZyA9IGF2X21hbGxvY3ooc2l6ZW9mKCptYXBwaW5nKSk7CisgICAgaWYgKCFtYXBwaW5nKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgdmFzID0gdmFEZXJpdmVJbWFnZShod2N0eC0+ZGlzcGxheSwgc3VyZmFjZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZtYXBwaW5nLT5pbWFnZSk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGRlcml2ZSBpbWFnZSBmcm9tICIKKyAgICAgICAgICAgICAgICJzdXJmYWNlICUjeDogJWQgKCVzKS5cbiIsCisgICAgICAgICAgICAgICBzdXJmYWNlX2lkLCB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyh2YWFwaV9kcm1fZm9ybWF0X21hcCk7IGkrKykgeworICAgICAgICBpZiAodmFhcGlfZHJtX2Zvcm1hdF9tYXBbaV0udmFfZm91cmNjID09CisgICAgICAgICAgICBtYXBwaW5nLT5pbWFnZS5mb3JtYXQuZm91cmNjKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID49IEZGX0FSUkFZX0VMRU1TKHZhYXBpX2RybV9mb3JtYXRfbWFwKSkgeworICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiTm8gbWF0Y2hpbmcgRFJNIGZvcm1hdCBmb3IgIgorICAgICAgICAgICAgICAgIlZBQVBJIGZvcm1hdCAlI3guXG4iLCBtYXBwaW5nLT5pbWFnZS5mb3JtYXQuZm91cmNjKTsKKyAgICAgICAgZXJyID0gQVZFUlJPUihFSU5WQUwpOworICAgICAgICBnb3RvIGZhaWxfZGVyaXZlZDsKKyAgICB9CisKKyAgICBtYXBwaW5nLT5idWZmZXJfaW5mby5tZW1fdHlwZSA9CisgICAgICAgIFZBX1NVUkZBQ0VfQVRUUklCX01FTV9UWVBFX0RSTV9QUklNRTsKKworICAgIG1hcHBpbmctPmRybV9kZXNjLm5iX2xheWVycyA9CisgICAgICAgIHZhYXBpX2RybV9mb3JtYXRfbWFwW2ldLm5iX2xheWVyX2Zvcm1hdHM7CisgICAgaWYgKG1hcHBpbmctPmRybV9kZXNjLm5iX2xheWVycyA+IDEpIHsKKyAgICAgICAgaWYgKG1hcHBpbmctPmRybV9kZXNjLm5iX2xheWVycyAhPSBtYXBwaW5nLT5pbWFnZS5udW1fcGxhbmVzKSB7CisgICAgICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiSW1hZ2UgcHJvcGVydGllcyBkbyBub3QgbWF0Y2ggIgorICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBmb3JtYXQ6IGdvdCAlZCBwbGFuZXMsIGJ1dCBleHBlY3RlZCAlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgbWFwcGluZy0+aW1hZ2UubnVtX3BsYW5lcywgbWFwcGluZy0+ZHJtX2Rlc2MubmJfbGF5ZXJzKTsKKyAgICAgICAgICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgICAgIGdvdG8gZmFpbF9kZXJpdmVkOworICAgICAgICB9CisKKyAgICAgICAgZm9yKHAgPSAwOyBwIDwgbWFwcGluZy0+ZHJtX2Rlc2MubmJfbGF5ZXJzOyBwKyspIHsKKyAgICAgICAgICAgIG1hcHBpbmctPmRybV9kZXNjLmxheWVyc1twXSA9IChBVkRSTUxheWVyRGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgIC5mb3JtYXQgICAgPSB2YWFwaV9kcm1fZm9ybWF0X21hcFtpXS5sYXllcl9mb3JtYXRzW3BdLAorICAgICAgICAgICAgICAgIC5uYl9wbGFuZXMgPSAxLAorICAgICAgICAgICAgICAgIC5wbGFuZXNbMF0gPSB7CisgICAgICAgICAgICAgICAgICAgIC5vYmplY3RfaW5kZXggPSAwLAorICAgICAgICAgICAgICAgICAgICAub2Zmc2V0ICAgICAgID0gbWFwcGluZy0+aW1hZ2Uub2Zmc2V0c1twXSwKKyAgICAgICAgICAgICAgICAgICAgLnBpdGNoICAgICAgICA9IG1hcHBpbmctPmltYWdlLnBpdGNoZXNbcF0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtYXBwaW5nLT5kcm1fZGVzYy5sYXllcnNbMF0uZm9ybWF0ID0KKyAgICAgICAgICAgIHZhYXBpX2RybV9mb3JtYXRfbWFwW2ldLmxheWVyX2Zvcm1hdHNbMF07CisgICAgICAgIG1hcHBpbmctPmRybV9kZXNjLmxheWVyc1swXS5uYl9wbGFuZXMgPSBtYXBwaW5nLT5pbWFnZS5udW1fcGxhbmVzOworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgbWFwcGluZy0+aW1hZ2UubnVtX3BsYW5lczsgcCsrKSB7CisgICAgICAgICAgICBtYXBwaW5nLT5kcm1fZGVzYy5sYXllcnNbMF0ucGxhbmVzW3BdID0gKEFWRFJNUGxhbmVEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgLm9iamVjdF9pbmRleCA9IDAsCisgICAgICAgICAgICAgICAgLm9mZnNldCAgICAgICA9IG1hcHBpbmctPmltYWdlLm9mZnNldHNbcF0sCisgICAgICAgICAgICAgICAgLnBpdGNoICAgICAgICA9IG1hcHBpbmctPmltYWdlLnBpdGNoZXNbcF0sCisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgdmFzID0gdmFBY3F1aXJlQnVmZmVySGFuZGxlKGh3Y3R4LT5kaXNwbGF5LCBtYXBwaW5nLT5pbWFnZS5idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBwaW5nLT5idWZmZXJfaW5mbyk7CisgICAgaWYgKHZhcyAhPSBWQV9TVEFUVVNfU1VDQ0VTUykgeworICAgICAgICBhdl9sb2coaHdmYywgQVZfTE9HX0VSUk9SLCAiRmFpbGVkIHRvIGdldCBidWZmZXIgIgorICAgICAgICAgICAgICAgImhhbmRsZSBmcm9tIGltYWdlICUjeCAoZGVyaXZlZCBmcm9tIHN1cmZhY2UgJSN4KTogIgorICAgICAgICAgICAgICAgIiVkICglcykuXG4iLCBtYXBwaW5nLT5pbWFnZS5idWYsIHN1cmZhY2VfaWQsCisgICAgICAgICAgICAgICB2YXMsIHZhRXJyb3JTdHIodmFzKSk7CisgICAgICAgIGVyciA9IEFWRVJST1IoRUlPKTsKKyAgICAgICAgZ290byBmYWlsX2Rlcml2ZWQ7CisgICAgfQorCisgICAgYXZfbG9nKGh3ZmMsIEFWX0xPR19ERUJVRywgIkRSTSBQUklNRSBmZCBpcyAlbGQuXG4iLAorICAgICAgICAgICBtYXBwaW5nLT5idWZmZXJfaW5mby5oYW5kbGUpOworCisgICAgbWFwcGluZy0+ZHJtX2Rlc2MubmJfb2JqZWN0cyA9IDE7CisgICAgbWFwcGluZy0+ZHJtX2Rlc2Mub2JqZWN0c1swXSA9IChBVkRSTU9iamVjdERlc2NyaXB0b3IpIHsKKyAgICAgICAgLmZkICAgPSBtYXBwaW5nLT5idWZmZXJfaW5mby5oYW5kbGUsCisgICAgICAgIC5zaXplID0gbWFwcGluZy0+aW1hZ2UuZGF0YV9zaXplLAorICAgICAgICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gZ2V0IHRoZSBmb3JtYXQgbW9kaWZpZXIgd2l0aCB0aGlzIEFQSS4KKyAgICAgICAgLmZvcm1hdF9tb2RpZmllciA9IERSTV9GT1JNQVRfTU9EX0lOVkFMSUQsCisgICAgfTsKKworICAgIGVyciA9IGZmX2h3ZnJhbWVfbWFwX2NyZWF0ZShzcmMtPmh3X2ZyYW1lc19jdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgc3JjLCAmdmFhcGlfdW5tYXBfdG9fZHJtX2FiaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyk7CisgICAgaWYgKGVyciA8IDApCisgICAgICAgIGdvdG8gZmFpbF9tYXBwZWQ7CisKKyAgICBkc3QtPmRhdGFbMF0gPSAodWludDhfdCopJm1hcHBpbmctPmRybV9kZXNjOworICAgIGRzdC0+d2lkdGggICA9IHNyYy0+d2lkdGg7CisgICAgZHN0LT5oZWlnaHQgID0gc3JjLT5oZWlnaHQ7CisKKyAgICByZXR1cm4gMDsKKworZmFpbF9tYXBwZWQ6CisgICAgdmFSZWxlYXNlQnVmZmVySGFuZGxlKGh3Y3R4LT5kaXNwbGF5LCBtYXBwaW5nLT5pbWFnZS5idWYpOworZmFpbF9kZXJpdmVkOgorICAgIHZhRGVzdHJveUltYWdlKGh3Y3R4LT5kaXNwbGF5LCBtYXBwaW5nLT5pbWFnZS5pbWFnZV9pZCk7CitmYWlsOgorICAgIGF2X2ZyZWVwKCZtYXBwaW5nKTsKKyAgICByZXR1cm4gZXJyOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdmFhcGlfbWFwX3RvX2RybShBVkhXRnJhbWVzQ29udGV4dCAqaHdmYywgQVZGcmFtZSAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKQoreworI2lmIFZBX0NIRUNLX1ZFUlNJT04oMSwgMSwgMCkKKyAgICBpbnQgZXJyOworICAgIGVyciA9IHZhYXBpX21hcF90b19kcm1fZXNoKGh3ZmMsIGRzdCwgc3JjLCBmbGFncyk7CisgICAgaWYgKGVyciAhPSBBVkVSUk9SKEVOT1NZUykpCisgICAgICAgIHJldHVybiBlcnI7CisjZW5kaWYKKyNpZiBWQV9DSEVDS19WRVJTSU9OKDAsIDM2LCAwKQorICAgIHJldHVybiB2YWFwaV9tYXBfdG9fZHJtX2FiaChod2ZjLCBkc3QsIHNyYywgZmxhZ3MpOworI2VuZGlmCisgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19MSUJEUk0gKi8KKworc3RhdGljIGludCB2YWFwaV9tYXBfdG8oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWRnJhbWUgKnNyYywgaW50IGZsYWdzKQoreworICAgIHN3aXRjaCAoc3JjLT5mb3JtYXQpIHsKKyNpZiBDT05GSUdfTElCRFJNCisgICAgY2FzZSBBVl9QSVhfRk1UX0RSTV9QUklNRToKKyAgICAgICAgcmV0dXJuIHZhYXBpX21hcF9mcm9tX2RybShod2ZjLCBkc3QsIHNyYywgZmxhZ3MpOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfbWFwX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsIEFWRnJhbWUgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjLCBpbnQgZmxhZ3MpCit7CisgICAgc3dpdGNoIChkc3QtPmZvcm1hdCkgeworI2lmIENPTkZJR19MSUJEUk0KKyAgICBjYXNlIEFWX1BJWF9GTVRfRFJNX1BSSU1FOgorICAgICAgICByZXR1cm4gdmFhcGlfbWFwX3RvX2RybShod2ZjLCBkc3QsIHNyYywgZmxhZ3MpOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHZhYXBpX21hcF90b19tZW1vcnkoaHdmYywgZHN0LCBzcmMsIGZsYWdzKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHZhYXBpX2RldmljZV9mcmVlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgpCit7CisgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBWQUFQSURldmljZVByaXYgICAgICAqcHJpdiAgPSBjdHgtPnVzZXJfb3BhcXVlOworCisgICAgaWYgKGh3Y3R4LT5kaXNwbGF5KQorICAgICAgICB2YVRlcm1pbmF0ZShod2N0eC0+ZGlzcGxheSk7CisKKyNpZiBIQVZFX1ZBQVBJX1gxMQorICAgIGlmIChwcml2LT54MTFfZGlzcGxheSkKKyAgICAgICAgWENsb3NlRGlzcGxheShwcml2LT54MTFfZGlzcGxheSk7CisjZW5kaWYKKworICAgIGlmIChwcml2LT5kcm1fZmQgPj0gMCkKKyAgICAgICAgY2xvc2UocHJpdi0+ZHJtX2ZkKTsKKworICAgIGF2X2ZyZWVwKCZwcml2KTsKK30KKworI2lmIENPTkZJR19WQUFQSV8xCitzdGF0aWMgdm9pZCB2YWFwaV9kZXZpY2VfbG9nX2Vycm9yKHZvaWQgKmNvbnRleHQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgICAgQVZIV0RldmljZUNvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJsaWJ2YTogJXMiLCBtZXNzYWdlKTsKK30KKworc3RhdGljIHZvaWQgdmFhcGlfZGV2aWNlX2xvZ19pbmZvKHZvaWQgKmNvbnRleHQsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisgICAgQVZIV0RldmljZUNvbnRleHQgKmN0eCA9IGNvbnRleHQ7CisKKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgImxpYnZhOiAlcyIsIG1lc3NhZ2UpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgdmFhcGlfZGV2aWNlX2Nvbm5lY3QoQVZIV0RldmljZUNvbnRleHQgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFEaXNwbGF5IGRpc3BsYXkpCit7CisgICAgQVZWQUFQSURldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBpbnQgbWFqb3IsIG1pbm9yOworICAgIFZBU3RhdHVzIHZhczsKKworI2lmIENPTkZJR19WQUFQSV8xCisgICAgdmFTZXRFcnJvckNhbGxiYWNrKGRpc3BsYXksICZ2YWFwaV9kZXZpY2VfbG9nX2Vycm9yLCBjdHgpOworICAgIHZhU2V0SW5mb0NhbGxiYWNrIChkaXNwbGF5LCAmdmFhcGlfZGV2aWNlX2xvZ19pbmZvLCAgY3R4KTsKKyNlbmRpZgorCisgICAgaHdjdHgtPmRpc3BsYXkgPSBkaXNwbGF5OworCisgICAgdmFzID0gdmFJbml0aWFsaXplKGRpc3BsYXksICZtYWpvciwgJm1pbm9yKTsKKyAgICBpZiAodmFzICE9IFZBX1NUQVRVU19TVUNDRVNTKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkZhaWxlZCB0byBpbml0aWFsaXNlIFZBQVBJICIKKyAgICAgICAgICAgICAgICJjb25uZWN0aW9uOiAlZCAoJXMpLlxuIiwgdmFzLCB2YUVycm9yU3RyKHZhcykpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU8pOworICAgIH0KKyAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkluaXRpYWxpc2VkIFZBQVBJIGNvbm5lY3Rpb246ICIKKyAgICAgICAgICAgInZlcnNpb24gJWQuJWRcbiIsIG1ham9yLCBtaW5vcik7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWFwaV9kZXZpY2VfY3JlYXRlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMsIGludCBmbGFncykKK3sKKyAgICBWQUFQSURldmljZVByaXYgKnByaXY7CisgICAgVkFEaXNwbGF5IGRpc3BsYXkgPSBOVUxMOworCisgICAgcHJpdiA9IGF2X21hbGxvY3ooc2l6ZW9mKCpwcml2KSk7CisgICAgaWYgKCFwcml2KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgcHJpdi0+ZHJtX2ZkID0gLTE7CisKKyAgICBjdHgtPnVzZXJfb3BhcXVlID0gcHJpdjsKKyAgICBjdHgtPmZyZWUgICAgICAgID0gdmFhcGlfZGV2aWNlX2ZyZWU7CisKKyNpZiBIQVZFX1ZBQVBJX1gxMQorICAgIGlmICghZGlzcGxheSAmJiAhKGRldmljZSAmJiBkZXZpY2VbMF0gPT0gJy8nKSkgeworICAgICAgICAvLyBUcnkgdG8gb3BlbiB0aGUgZGV2aWNlIGFzIGFuIFgxMSBkaXNwbGF5LgorICAgICAgICBwcml2LT54MTFfZGlzcGxheSA9IFhPcGVuRGlzcGxheShkZXZpY2UpOworICAgICAgICBpZiAoIXByaXYtPngxMV9kaXNwbGF5KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNhbm5vdCBvcGVuIFgxMSBkaXNwbGF5ICIKKyAgICAgICAgICAgICAgICAgICAiJXMuXG4iLCBYRGlzcGxheU5hbWUoZGV2aWNlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkaXNwbGF5ID0gdmFHZXREaXNwbGF5KHByaXYtPngxMV9kaXNwbGF5KTsKKyAgICAgICAgICAgIGlmICghZGlzcGxheSkgeworICAgICAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBvcGVuIGEgVkEgZGlzcGxheSAiCisgICAgICAgICAgICAgICAgICAgICAgICJmcm9tIFgxMSBkaXNwbGF5ICVzLlxuIiwgWERpc3BsYXlOYW1lKGRldmljZSkpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiT3BlbmVkIFZBIGRpc3BsYXkgdmlhICIKKyAgICAgICAgICAgICAgICAgICAiWDExIGRpc3BsYXkgJXMuXG4iLCBYRGlzcGxheU5hbWUoZGV2aWNlKSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIEhBVkVfVkFBUElfRFJNCisgICAgaWYgKCFkaXNwbGF5KSB7CisgICAgICAgIC8vIFRyeSB0byBvcGVuIHRoZSBkZXZpY2UgYXMgYSBEUk0gcGF0aC4KKyAgICAgICAgLy8gRGVmYXVsdCB0byB1c2luZyB0aGUgZmlyc3QgcmVuZGVyIG5vZGUgaWYgdGhlIHVzZXIgZGlkIG5vdAorICAgICAgICAvLyBzdXBwbHkgYSBwYXRoLgorICAgICAgICBjb25zdCBjaGFyICpwYXRoID0gZGV2aWNlID8gZGV2aWNlIDogIi9kZXYvZHJpL3JlbmRlckQxMjgiOworICAgICAgICBwcml2LT5kcm1fZmQgPSBvcGVuKHBhdGgsIE9fUkRXUik7CisgICAgICAgIGlmIChwcml2LT5kcm1fZmQgPCAwKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfVkVSQk9TRSwgIkNhbm5vdCBvcGVuIERSTSBkZXZpY2UgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgIHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlzcGxheSA9IHZhR2V0RGlzcGxheURSTShwcml2LT5kcm1fZmQpOworICAgICAgICAgICAgaWYgKCFkaXNwbGF5KSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IG9wZW4gYSBWQSBkaXNwbGF5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImZyb20gRFJNIGRldmljZSAlcy5cbiIsIHBhdGgpOworICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiT3BlbmVkIFZBIGRpc3BsYXkgdmlhICIKKyAgICAgICAgICAgICAgICAgICAiRFJNIGRldmljZSAlcy5cbiIsIHBhdGgpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIWRpc3BsYXkpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiTm8gVkEgZGlzcGxheSBmb3VuZCBmb3IgIgorICAgICAgICAgICAgICAgImRldmljZTogJXMuXG4iLCBkZXZpY2UgPyBkZXZpY2UgOiAiIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgcmV0dXJuIHZhYXBpX2RldmljZV9jb25uZWN0KGN0eCwgZGlzcGxheSk7Cit9CisKK3N0YXRpYyBpbnQgdmFhcGlfZGV2aWNlX2Rlcml2ZShBVkhXRGV2aWNlQ29udGV4dCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWSFdEZXZpY2VDb250ZXh0ICpzcmNfY3R4LCBpbnQgZmxhZ3MpCit7CisjaWYgSEFWRV9WQUFQSV9EUk0KKyAgICBpZiAoc3JjX2N0eC0+dHlwZSA9PSBBVl9IV0RFVklDRV9UWVBFX0RSTSkgeworICAgICAgICBBVkRSTURldmljZUNvbnRleHQgKnNyY19od2N0eCA9IHNyY19jdHgtPmh3Y3R4OworICAgICAgICBWQURpc3BsYXkgKmRpc3BsYXk7CisgICAgICAgIFZBQVBJRGV2aWNlUHJpdiAqcHJpdjsKKworICAgICAgICBpZiAoc3JjX2h3Y3R4LT5mZCA8IDApIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkRSTSBpbnN0YW5jZSByZXF1aXJlcyBhbiBhc3NvY2lhdGVkICIKKyAgICAgICAgICAgICAgICAgICAiZGV2aWNlIHRvIGRlcml2ZSBhIFZBIGRpc3BsYXkgZnJvbS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXYgPSBhdl9tYWxsb2N6KHNpemVvZigqcHJpdikpOworICAgICAgICBpZiAoIXByaXYpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgICAgIC8vIEluaGVyaXRzIHRoZSBmZCBmcm9tIHRoZSBzb3VyY2UgY29udGV4dCwgd2hpY2ggd2lsbCBjbG9zZSBpdC4KKyAgICAgICAgcHJpdi0+ZHJtX2ZkID0gLTE7CisKKyAgICAgICAgY3R4LT51c2VyX29wYXF1ZSA9IHByaXY7CisgICAgICAgIGN0eC0+ZnJlZSAgICAgICAgPSAmdmFhcGlfZGV2aWNlX2ZyZWU7CisKKyAgICAgICAgZGlzcGxheSA9IHZhR2V0RGlzcGxheURSTShzcmNfaHdjdHgtPmZkKTsKKyAgICAgICAgaWYgKCFkaXNwbGF5KSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gb3BlbiBhIFZBIGRpc3BsYXkgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgIkRSTSBkZXZpY2UuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFhcGlfZGV2aWNlX2Nvbm5lY3QoY3R4LCBkaXNwbGF5KTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworfQorCitjb25zdCBIV0NvbnRleHRUeXBlIGZmX2h3Y29udGV4dF90eXBlX3ZhYXBpID0geworICAgIC50eXBlICAgICAgICAgICAgICAgICAgID0gQVZfSFdERVZJQ0VfVFlQRV9WQUFQSSwKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgICA9ICJWQUFQSSIsCisKKyAgICAuZGV2aWNlX2h3Y3R4X3NpemUgICAgICA9IHNpemVvZihBVlZBQVBJRGV2aWNlQ29udGV4dCksCisgICAgLmRldmljZV9wcml2X3NpemUgICAgICAgPSBzaXplb2YoVkFBUElEZXZpY2VDb250ZXh0KSwKKyAgICAuZGV2aWNlX2h3Y29uZmlnX3NpemUgICA9IHNpemVvZihBVlZBQVBJSFdDb25maWcpLAorICAgIC5mcmFtZXNfaHdjdHhfc2l6ZSAgICAgID0gc2l6ZW9mKEFWVkFBUElGcmFtZXNDb250ZXh0KSwKKyAgICAuZnJhbWVzX3ByaXZfc2l6ZSAgICAgICA9IHNpemVvZihWQUFQSUZyYW1lc0NvbnRleHQpLAorCisgICAgLmRldmljZV9jcmVhdGUgICAgICAgICAgPSAmdmFhcGlfZGV2aWNlX2NyZWF0ZSwKKyAgICAuZGV2aWNlX2Rlcml2ZSAgICAgICAgICA9ICZ2YWFwaV9kZXZpY2VfZGVyaXZlLAorICAgIC5kZXZpY2VfaW5pdCAgICAgICAgICAgID0gJnZhYXBpX2RldmljZV9pbml0LAorICAgIC5kZXZpY2VfdW5pbml0ICAgICAgICAgID0gJnZhYXBpX2RldmljZV91bmluaXQsCisgICAgLmZyYW1lc19nZXRfY29uc3RyYWludHMgPSAmdmFhcGlfZnJhbWVzX2dldF9jb25zdHJhaW50cywKKyAgICAuZnJhbWVzX2luaXQgICAgICAgICAgICA9ICZ2YWFwaV9mcmFtZXNfaW5pdCwKKyAgICAuZnJhbWVzX3VuaW5pdCAgICAgICAgICA9ICZ2YWFwaV9mcmFtZXNfdW5pbml0LAorICAgIC5mcmFtZXNfZ2V0X2J1ZmZlciAgICAgID0gJnZhYXBpX2dldF9idWZmZXIsCisgICAgLnRyYW5zZmVyX2dldF9mb3JtYXRzICAgPSAmdmFhcGlfdHJhbnNmZXJfZ2V0X2Zvcm1hdHMsCisgICAgLnRyYW5zZmVyX2RhdGFfdG8gICAgICAgPSAmdmFhcGlfdHJhbnNmZXJfZGF0YV90bywKKyAgICAudHJhbnNmZXJfZGF0YV9mcm9tICAgICA9ICZ2YWFwaV90cmFuc2Zlcl9kYXRhX2Zyb20sCisgICAgLm1hcF90byAgICAgICAgICAgICAgICAgPSAmdmFhcGlfbWFwX3RvLAorICAgIC5tYXBfZnJvbSAgICAgICAgICAgICAgID0gJnZhYXBpX21hcF9mcm9tLAorCisgICAgLnBpeF9mbXRzID0gKGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdFtdKSB7CisgICAgICAgIEFWX1BJWF9GTVRfVkFBUEksCisgICAgICAgIEFWX1BJWF9GTVRfTk9ORQorICAgIH0sCit9OwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2h3Y29udGV4dF92YWFwaS5oIGIvbGliYXZ1dGlsL2h3Y29udGV4dF92YWFwaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMmUwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvaHdjb250ZXh0X3ZhYXBpLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfSFdDT05URVhUX1ZBQVBJX0gKKyNkZWZpbmUgQVZVVElMX0hXQ09OVEVYVF9WQUFQSV9ICisKKyNpbmNsdWRlIDx2YS92YS5oPgorCisvKioKKyAqIEBmaWxlCisgKiBBUEktc3BlY2lmaWMgaGVhZGVyIGZvciBBVl9IV0RFVklDRV9UWVBFX1ZBQVBJLgorICoKKyAqIER5bmFtaWMgZnJhbWUgcG9vbHMgYXJlIHN1cHBvcnRlZCwgYnV0IG5vdGUgdGhhdCBhbnkgcG9vbCB1c2VkIGFzIGEgcmVuZGVyCisgKiB0YXJnZXQgaXMgcmVxdWlyZWQgdG8gYmUgb2YgZml4ZWQgc2l6ZSBpbiBvcmRlciB0byBiZSBiZSB1c2FibGUgYXMgYW4KKyAqIGFyZ3VtZW50IHRvIHZhQ3JlYXRlQ29udGV4dCgpLgorICoKKyAqIEZvciB1c2VyLWFsbG9jYXRlZCBwb29scywgQVZIV0ZyYW1lc0NvbnRleHQucG9vbCBtdXN0IHJldHVybiBBVkJ1ZmZlclJlZnMKKyAqIHdpdGggdGhlIGRhdGEgcG9pbnRlciBzZXQgdG8gYSBWQVN1cmZhY2VJRC4KKyAqLworCitlbnVtIHsKKyAgICAvKioKKyAgICAgKiBUaGUgcXVpcmtzIGZpZWxkIGhhcyBiZWVuIHNldCBieSB0aGUgdXNlciBhbmQgc2hvdWxkIG5vdCBiZSBkZXRlY3RlZAorICAgICAqIGF1dG9tYXRpY2FsbHkgYnkgYXZfaHdkZXZpY2VfY3R4X2luaXQoKS4KKyAgICAgKi8KKyAgICBBVl9WQUFQSV9EUklWRVJfUVVJUktfVVNFUl9TRVQgPSAoMSA8PCAwKSwKKyAgICAvKioKKyAgICAgKiBUaGUgZHJpdmVyIGRvZXMgbm90IGRlc3Ryb3kgcGFyYW1ldGVyIGJ1ZmZlcnMgd2hlbiB0aGV5IGFyZSB1c2VkIGJ5CisgICAgICogdmFSZW5kZXJQaWN0dXJlKCkuICBBZGRpdGlvbmFsIGNvZGUgd2lsbCBiZSByZXF1aXJlZCB0byBkZXN0cm95IHRoZW0KKyAgICAgKiBzZXBhcmF0ZWx5IGFmdGVyd2FyZHMuCisgICAgICovCisgICAgQVZfVkFBUElfRFJJVkVSX1FVSVJLX1JFTkRFUl9QQVJBTV9CVUZGRVJTID0gKDEgPDwgMSksCisKKyAgICAvKioKKyAgICAgKiBUaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIFZBU3VyZmFjZUF0dHJpYk1lbW9yeVR5cGUgYXR0cmlidXRlLAorICAgICAqIHNvIHRoZSBzdXJmYWNlIGFsbG9jYXRpb24gY29kZSB3aWxsIG5vdCB0cnkgdG8gdXNlIGl0LgorICAgICAqLworICAgIEFWX1ZBQVBJX0RSSVZFUl9RVUlSS19BVFRSSUJfTUVNVFlQRSA9ICgxIDw8IDIpLAorCisgICAgLyoqCisgICAgICogVGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHN1cmZhY2UgYXR0cmlidXRlcyBhdCBhbGwuCisgICAgICogVGhlIHN1cmZhY2UgYWxsb2NhdGlvbiBjb2RlIHdpbGwgbmV2ZXIgcGFzcyB0aGVtIHRvIHN1cmZhY2UgYWxsb2NhdGlvbiwKKyAgICAgKiBhbmQgdGhlIHJlc3VsdHMgb2YgdGhlIHZhUXVlcnlTdXJmYWNlQXR0cmlidXRlcygpIGNhbGwgd2lsbCBiZSBmYWtlZC4KKyAgICAgKi8KKyAgICBBVl9WQUFQSV9EUklWRVJfUVVJUktfU1VSRkFDRV9BVFRSSUJVVEVTID0gKDEgPDwgMyksCit9OworCisvKioKKyAqIFZBQVBJIGNvbm5lY3Rpb24gZGV0YWlscy4KKyAqCisgKiBBbGxvY2F0ZWQgYXMgQVZIV0RldmljZUNvbnRleHQuaHdjdHgKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZWQUFQSURldmljZUNvbnRleHQgeworICAgIC8qKgorICAgICAqIFRoZSBWQURpc3BsYXkgaGFuZGxlLCB0byBiZSBmaWxsZWQgYnkgdGhlIHVzZXIuCisgICAgICovCisgICAgVkFEaXNwbGF5IGRpc3BsYXk7CisgICAgLyoqCisgICAgICogRHJpdmVyIHF1aXJrcyB0byBhcHBseSAtIHRoaXMgaXMgZmlsbGVkIGJ5IGF2X2h3ZGV2aWNlX2N0eF9pbml0KCksCisgICAgICogd2l0aCByZWZlcmVuY2UgdG8gYSB0YWJsZSBvZiBrbm93biBkcml2ZXJzLCB1bmxlc3MgdGhlCisgICAgICogQVZfVkFBUElfRFJJVkVSX1FVSVJLX1VTRVJfU0VUIGJpdCBpcyBhbHJlYWR5IHByZXNlbnQuICBUaGUgdXNlcgorICAgICAqIG1heSBuZWVkIHRvIHJlZmVyIHRvIHRoaXMgZmllbGQgd2hlbiBwZXJmb3JtaW5nIGFueSBsYXRlcgorICAgICAqIG9wZXJhdGlvbnMgdXNpbmcgVkFBUEkgd2l0aCB0aGUgc2FtZSBWQURpc3BsYXkuCisgICAgICovCisgICAgdW5zaWduZWQgaW50IGRyaXZlcl9xdWlya3M7Cit9IEFWVkFBUElEZXZpY2VDb250ZXh0OworCisvKioKKyAqIFZBQVBJLXNwZWNpZmljIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgZnJhbWUgcG9vbC4KKyAqCisgKiBBbGxvY2F0ZWQgYXMgQVZIV0ZyYW1lc0NvbnRleHQuaHdjdHguCisgKi8KK3R5cGVkZWYgc3RydWN0IEFWVkFBUElGcmFtZXNDb250ZXh0IHsKKyAgICAvKioKKyAgICAgKiBTZXQgYnkgdGhlIHVzZXIgdG8gYXBwbHkgc3VyZmFjZSBhdHRyaWJ1dGVzIHRvIGFsbCBzdXJmYWNlcyBpbgorICAgICAqIHRoZSBmcmFtZSBwb29sLiAgSWYgbnVsbCwgZGVmYXVsdCBzZXR0aW5ncyBhcmUgdXNlZC4KKyAgICAgKi8KKyAgICBWQVN1cmZhY2VBdHRyaWIgKmF0dHJpYnV0ZXM7CisgICAgaW50ICAgICAgICAgICBuYl9hdHRyaWJ1dGVzOworICAgIC8qKgorICAgICAqIFRoZSBzdXJmYWNlcyBJRHMgb2YgYWxsIHN1cmZhY2VzIGluIHRoZSBwb29sIGFmdGVyIGNyZWF0aW9uLgorICAgICAqIE9ubHkgdmFsaWQgaWYgQVZIV0ZyYW1lc0NvbnRleHQuaW5pdGlhbF9wb29sX3NpemUgd2FzIHBvc2l0aXZlLgorICAgICAqIFRoZXNlIGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIHRoZSByZW5kZXJfdGFyZ2V0cyBhcmd1bWVudHMgdG8KKyAgICAgKiB2YUNyZWF0ZUNvbnRleHQoKS4KKyAgICAgKi8KKyAgICBWQVN1cmZhY2VJRCAgICAgKnN1cmZhY2VfaWRzOworICAgIGludCAgICAgICAgICAgbmJfc3VyZmFjZXM7Cit9IEFWVkFBUElGcmFtZXNDb250ZXh0OworCisvKioKKyAqIFZBQVBJIGhhcmR3YXJlIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4KKyAqCisgKiBBbGxvY2F0ZWQgd2l0aCBhdl9od2RldmljZV9od2NvbmZpZ19hbGxvYygpLgorICovCit0eXBlZGVmIHN0cnVjdCBBVlZBQVBJSFdDb25maWcgeworICAgIC8qKgorICAgICAqIElEIG9mIGEgVkFBUEkgcGlwZWxpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBWQUNvbmZpZ0lEIGNvbmZpZ19pZDsKK30gQVZWQUFQSUhXQ29uZmlnOworCisjZW5kaWYgLyogQVZVVElMX0hXQ09OVEVYVF9WQUFQSV9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X3ZkcGF1LmMgYi9saWJhdnV0aWwvaHdjb250ZXh0X3ZkcGF1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExYzNjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHRfdmRwYXUuYwpAQCAtMCwwICsxLDUwMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPHZkcGF1L3ZkcGF1Lmg+CisKKyNpbmNsdWRlICJidWZmZXIuaCIKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJod2NvbnRleHQuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJod2NvbnRleHRfdmRwYXUuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJwaXhmbXQuaCIKKyNpbmNsdWRlICJwaXhkZXNjLmgiCisKK3R5cGVkZWYgc3RydWN0IFZEUEFVRGV2aWNlQ29udGV4dCB7CisgICAgVmRwVmlkZW9TdXJmYWNlUXVlcnlHZXRQdXRCaXRzWUNiQ3JDYXBhYmlsaXRpZXMgKmdldF90cmFuc2Zlcl9jYXBzOworICAgIFZkcFZpZGVvU3VyZmFjZUdldEJpdHNZQ2JDciAgICAgICAgICAgICAgICAgICAgICpnZXRfZGF0YTsKKyAgICBWZHBWaWRlb1N1cmZhY2VQdXRCaXRzWUNiQ3IgICAgICAgICAgICAgICAgICAgICAqcHV0X2RhdGE7CisgICAgVmRwVmlkZW9TdXJmYWNlQ3JlYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN1cmZfY3JlYXRlOworICAgIFZkcFZpZGVvU3VyZmFjZURlc3Ryb3kgICAgICAgICAgICAgICAgICAgICAgICAgICpzdXJmX2Rlc3Ryb3k7CisKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKnBpeF9mbXRzWzNdOworICAgIGludCAgICAgICAgICAgICAgbmJfcGl4X2ZtdHNbM107Cit9IFZEUEFVRGV2aWNlQ29udGV4dDsKKwordHlwZWRlZiBzdHJ1Y3QgVkRQQVVGcmFtZXNDb250ZXh0IHsKKyAgICBWZHBWaWRlb1N1cmZhY2VHZXRCaXRzWUNiQ3IgKmdldF9kYXRhOworICAgIFZkcFZpZGVvU3VyZmFjZVB1dEJpdHNZQ2JDciAqcHV0X2RhdGE7CisgICAgVmRwQ2hyb21hVHlwZSBjaHJvbWFfdHlwZTsKKyAgICBpbnQgY2hyb21hX2lkeDsKKworICAgIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCAqcGl4X2ZtdHM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBuYl9waXhfZm10czsKK30gVkRQQVVGcmFtZXNDb250ZXh0OworCit0eXBlZGVmIHN0cnVjdCBWRFBBVVBpeEZtdE1hcCB7CisgICAgVmRwWUNiQ3JGb3JtYXQgdmRwYXVfZm10OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10OworfSBWRFBBVVBpeEZtdE1hcDsKKworc3RhdGljIGNvbnN0IFZEUEFVUGl4Rm10TWFwIHBpeF9mbXRzXzQyMFtdID0geworICAgIHsgVkRQX1lDQkNSX0ZPUk1BVF9OVjEyLCBBVl9QSVhfRk1UX05WMTIgICAgfSwKKyAgICB7IFZEUF9ZQ0JDUl9GT1JNQVRfWVYxMiwgQVZfUElYX0ZNVF9ZVVY0MjBQIH0sCisgICAgeyAwLCAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfTk9ORSwgICB9LAorfTsKKworc3RhdGljIGNvbnN0IFZEUEFVUGl4Rm10TWFwIHBpeF9mbXRzXzQyMltdID0geworICAgIHsgVkRQX1lDQkNSX0ZPUk1BVF9OVjEyLCBBVl9QSVhfRk1UX05WMTYgICAgfSwKKyAgICB7IFZEUF9ZQ0JDUl9GT1JNQVRfWVYxMiwgQVZfUElYX0ZNVF9ZVVY0MjJQIH0sCisgICAgeyBWRFBfWUNCQ1JfRk9STUFUX1VZVlksIEFWX1BJWF9GTVRfVVlWWTQyMiB9LAorICAgIHsgVkRQX1lDQkNSX0ZPUk1BVF9ZVVlWLCBBVl9QSVhfRk1UX1lVWVY0MjIgfSwKKyAgICB7IDAsICAgICAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9OT05FLCAgIH0sCit9OworCitzdGF0aWMgY29uc3QgVkRQQVVQaXhGbXRNYXAgcGl4X2ZtdHNfNDQ0W10gPSB7CisgICAgeyBWRFBfWUNCQ1JfRk9STUFUX1lWMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UCB9LAorICAgIHsgMCwgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX05PTkUsICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIFZkcENocm9tYVR5cGUgY2hyb21hX3R5cGU7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGZyYW1lc19zd19mb3JtYXQ7CisgICAgY29uc3QgVkRQQVVQaXhGbXRNYXAgKm1hcDsKK30gdmRwYXVfcGl4X2ZtdHNbXSA9IHsKKyAgICB7IFZEUF9DSFJPTUFfVFlQRV80MjAsIEFWX1BJWF9GTVRfWVVWNDIwUCwgcGl4X2ZtdHNfNDIwIH0sCisgICAgeyBWRFBfQ0hST01BX1RZUEVfNDIyLCBBVl9QSVhfRk1UX1lVVjQyMlAsIHBpeF9mbXRzXzQyMiB9LAorICAgIHsgVkRQX0NIUk9NQV9UWVBFXzQ0NCwgQVZfUElYX0ZNVF9ZVVY0NDRQLCBwaXhfZm10c180NDQgfSwKK307CisKK3N0YXRpYyBpbnQgY291bnRfcGl4Zm10cyhjb25zdCBWRFBBVVBpeEZtdE1hcCAqbWFwKQoreworICAgIGludCBjb3VudCA9IDA7CisgICAgd2hpbGUgKG1hcC0+cGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgbWFwKys7CisgICAgICAgIGNvdW50Kys7CisgICAgfQorICAgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB2ZHBhdV9pbml0X3BpeG1mdHMoQVZIV0RldmljZUNvbnRleHQgKmN0eCkKK3sKKyAgICBBVlZEUEFVRGV2aWNlQ29udGV4dCAqaHdjdHggPSBjdHgtPmh3Y3R4OworICAgIFZEUEFVRGV2aWNlQ29udGV4dCAgICAqcHJpdiA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocHJpdi0+cGl4X2ZtdHMpOyBpKyspIHsKKyAgICAgICAgY29uc3QgVkRQQVVQaXhGbXRNYXAgKm1hcCA9IHZkcGF1X3BpeF9mbXRzW2ldLm1hcDsKKyAgICAgICAgaW50IG5iX3BpeF9mbXRzOworCisgICAgICAgIG5iX3BpeF9mbXRzID0gY291bnRfcGl4Zm10cyhtYXApOworICAgICAgICBwcml2LT5waXhfZm10c1tpXSA9IGF2X21hbGxvY19hcnJheShuYl9waXhfZm10cyArIDEsIHNpemVvZigqcHJpdi0+cGl4X2ZtdHNbaV0pKTsKKyAgICAgICAgaWYgKCFwcml2LT5waXhfZm10c1tpXSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICAgICAgbmJfcGl4X2ZtdHMgPSAwOworICAgICAgICB3aGlsZSAobWFwLT5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICAgICAgVmRwQm9vbCBzdXBwb3J0ZWQ7CisgICAgICAgICAgICBWZHBTdGF0dXMgZXJyID0gcHJpdi0+Z2V0X3RyYW5zZmVyX2NhcHMoaHdjdHgtPmRldmljZSwgdmRwYXVfcGl4X2ZtdHNbaV0uY2hyb21hX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwLT52ZHBhdV9mbXQsICZzdXBwb3J0ZWQpOworICAgICAgICAgICAgaWYgKGVyciA9PSBWRFBfU1RBVFVTX09LICYmIHN1cHBvcnRlZCkKKyAgICAgICAgICAgICAgICBwcml2LT5waXhfZm10c1tpXVtuYl9waXhfZm10cysrXSA9IG1hcC0+cGl4X2ZtdDsKKyAgICAgICAgICAgIG1hcCsrOworICAgICAgICB9CisgICAgICAgIHByaXYtPnBpeF9mbXRzW2ldW25iX3BpeF9mbXRzKytdID0gQVZfUElYX0ZNVF9OT05FOworICAgICAgICBwcml2LT5uYl9waXhfZm10c1tpXSAgICAgICAgICAgICA9IG5iX3BpeF9mbXRzOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjZGVmaW5lIEdFVF9DQUxMQkFDSyhpZCwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2RvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQgKnRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyID0gaHdjdHgtPmdldF9wcm9jX2FkZHJlc3MoaHdjdHgtPmRldmljZSwgaWQsICZ0bXApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZXJyICE9IFZEUF9TVEFUVVNfT0spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBnZXR0aW5nIHRoZSAiICNpZCAiIGNhbGxiYWNrLlxuIik7ICAgICBcCisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlc3VsdCA9IHRtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgaW50IHZkcGF1X2RldmljZV9pbml0KEFWSFdEZXZpY2VDb250ZXh0ICpjdHgpCit7CisgICAgQVZWRFBBVURldmljZUNvbnRleHQgKmh3Y3R4ID0gY3R4LT5od2N0eDsKKyAgICBWRFBBVURldmljZUNvbnRleHQgICAqcHJpdiAgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIFZkcFN0YXR1cyAgICAgICAgICAgICBlcnI7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIHJldDsKKworICAgIEdFVF9DQUxMQkFDSyhWRFBfRlVOQ19JRF9WSURFT19TVVJGQUNFX1FVRVJZX0dFVF9QVVRfQklUU19ZX0NCX0NSX0NBUEFCSUxJVElFUywKKyAgICAgICAgICAgICAgICAgcHJpdi0+Z2V0X3RyYW5zZmVyX2NhcHMpOworICAgIEdFVF9DQUxMQkFDSyhWRFBfRlVOQ19JRF9WSURFT19TVVJGQUNFX0dFVF9CSVRTX1lfQ0JfQ1IsIHByaXYtPmdldF9kYXRhKTsKKyAgICBHRVRfQ0FMTEJBQ0soVkRQX0ZVTkNfSURfVklERU9fU1VSRkFDRV9QVVRfQklUU19ZX0NCX0NSLCBwcml2LT5wdXRfZGF0YSk7CisgICAgR0VUX0NBTExCQUNLKFZEUF9GVU5DX0lEX1ZJREVPX1NVUkZBQ0VfQ1JFQVRFLCAgICAgICAgICAgcHJpdi0+c3VyZl9jcmVhdGUpOworICAgIEdFVF9DQUxMQkFDSyhWRFBfRlVOQ19JRF9WSURFT19TVVJGQUNFX0RFU1RST1ksICAgICAgICAgIHByaXYtPnN1cmZfZGVzdHJveSk7CisKKyAgICByZXQgPSB2ZHBhdV9pbml0X3BpeG1mdHMoY3R4KTsKKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBxdWVyeWluZyB0aGUgc3VwcG9ydGVkIHBpeGVsIGZvcm1hdHNcbiIpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB2ZHBhdV9kZXZpY2VfdW5pbml0KEFWSFdEZXZpY2VDb250ZXh0ICpjdHgpCit7CisgICAgVkRQQVVEZXZpY2VDb250ZXh0ICpwcml2ID0gY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhwcml2LT5waXhfZm10cyk7IGkrKykKKyAgICAgICAgYXZfZnJlZXAoJnByaXYtPnBpeF9mbXRzW2ldKTsKK30KKworc3RhdGljIGludCB2ZHBhdV9mcmFtZXNfZ2V0X2NvbnN0cmFpbnRzKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaHdjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZIV0ZyYW1lc0NvbnN0cmFpbnRzICpjb25zdHJhaW50cykKK3sKKyAgICBWRFBBVURldmljZUNvbnRleHQgICAqcHJpdiAgPSBjdHgtPmludGVybmFsLT5wcml2OworICAgIGludCBuYl9zd19mb3JtYXRzID0gMDsKKyAgICBpbnQgaTsKKworICAgIGNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzID0gYXZfbWFsbG9jX2FycmF5KEZGX0FSUkFZX0VMRU1TKHZkcGF1X3BpeF9mbXRzKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0cykpOworICAgIGlmICghY29uc3RyYWludHMtPnZhbGlkX3N3X2Zvcm1hdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVModmRwYXVfcGl4X2ZtdHMpOyBpKyspIHsKKyAgICAgICAgaWYgKHByaXYtPm5iX3BpeF9mbXRzW2ldID4gMSkKKyAgICAgICAgICAgIGNvbnN0cmFpbnRzLT52YWxpZF9zd19mb3JtYXRzW25iX3N3X2Zvcm1hdHMrK10gPSB2ZHBhdV9waXhfZm10c1tpXS5mcmFtZXNfc3dfZm9ybWF0OworICAgIH0KKyAgICBjb25zdHJhaW50cy0+dmFsaWRfc3dfZm9ybWF0c1tuYl9zd19mb3JtYXRzXSA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgIGNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzID0gYXZfbWFsbG9jX2FycmF5KDIsIHNpemVvZigqY29uc3RyYWludHMtPnZhbGlkX2h3X2Zvcm1hdHMpKTsKKyAgICBpZiAoIWNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgY29uc3RyYWludHMtPnZhbGlkX2h3X2Zvcm1hdHNbMF0gPSBBVl9QSVhfRk1UX1ZEUEFVOworICAgIGNvbnN0cmFpbnRzLT52YWxpZF9od19mb3JtYXRzWzFdID0gQVZfUElYX0ZNVF9OT05FOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZkcGF1X2J1ZmZlcl9mcmVlKHZvaWQgKm9wYXF1ZSwgdWludDhfdCAqZGF0YSkKK3sKKyAgICBBVkhXRnJhbWVzQ29udGV4dCAgICAgICAgICAqY3R4ID0gb3BhcXVlOworICAgIFZEUEFVRGV2aWNlQ29udGV4dCAqZGV2aWNlX3ByaXYgPSBjdHgtPmRldmljZV9jdHgtPmludGVybmFsLT5wcml2OworICAgIFZkcFZpZGVvU3VyZmFjZSAgICAgICAgICAgIHN1cmYgPSAoVmRwVmlkZW9TdXJmYWNlKSh1aW50cHRyX3QpZGF0YTsKKworICAgIGRldmljZV9wcml2LT5zdXJmX2Rlc3Ryb3koc3VyZik7Cit9CisKK3N0YXRpYyBBVkJ1ZmZlclJlZiAqdmRwYXVfcG9vbF9hbGxvYyh2b2lkICpvcGFxdWUsIGludCBzaXplKQoreworICAgIEFWSFdGcmFtZXNDb250ZXh0ICAgICAgICAgICAgICpjdHggPSBvcGFxdWU7CisgICAgVkRQQVVGcmFtZXNDb250ZXh0ICAgICAgICAgICAqcHJpdiA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgQVZWRFBBVURldmljZUNvbnRleHQgKmRldmljZV9od2N0eCA9IGN0eC0+ZGV2aWNlX2N0eC0+aHdjdHg7CisgICAgVkRQQVVEZXZpY2VDb250ZXh0ICAgICpkZXZpY2VfcHJpdiA9IGN0eC0+ZGV2aWNlX2N0eC0+aW50ZXJuYWwtPnByaXY7CisKKyAgICBBVkJ1ZmZlclJlZiAqcmV0OworICAgIFZkcFZpZGVvU3VyZmFjZSBzdXJmOworICAgIFZkcFN0YXR1cyBlcnI7CisKKyAgICBlcnIgPSBkZXZpY2VfcHJpdi0+c3VyZl9jcmVhdGUoZGV2aWNlX2h3Y3R4LT5kZXZpY2UsIHByaXYtPmNocm9tYV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPndpZHRoLCBjdHgtPmhlaWdodCwgJnN1cmYpOworICAgIGlmIChlcnIgIT0gVkRQX1NUQVRVU19PSykgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIGEgVkRQQVUgdmlkZW8gc3VyZmFjZVxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldCA9IGF2X2J1ZmZlcl9jcmVhdGUoKHVpbnQ4X3QqKSh1aW50cHRyX3Qpc3VyZiwgc2l6ZW9mKHN1cmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmRwYXVfYnVmZmVyX2ZyZWUsIGN0eCwgQVZfQlVGRkVSX0ZMQUdfUkVBRE9OTFkpOworICAgIGlmICghcmV0KSB7CisgICAgICAgIGRldmljZV9wcml2LT5zdXJmX2Rlc3Ryb3koc3VyZik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmRwYXVfZnJhbWVzX2luaXQoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCkKK3sKKyAgICBWRFBBVURldmljZUNvbnRleHQgKmRldmljZV9wcml2ID0gY3R4LT5kZXZpY2VfY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBWRFBBVUZyYW1lc0NvbnRleHQgICAgICAgICpwcml2ID0gY3R4LT5pbnRlcm5hbC0+cHJpdjsKKworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHZkcGF1X3BpeF9mbXRzKTsgaSsrKSB7CisgICAgICAgIGlmICh2ZHBhdV9waXhfZm10c1tpXS5mcmFtZXNfc3dfZm9ybWF0ID09IGN0eC0+c3dfZm9ybWF0KSB7CisgICAgICAgICAgICBwcml2LT5jaHJvbWFfdHlwZSA9IHZkcGF1X3BpeF9mbXRzW2ldLmNocm9tYV90eXBlOworICAgICAgICAgICAgcHJpdi0+Y2hyb21hX2lkeCAgPSBpOworICAgICAgICAgICAgcHJpdi0+cGl4X2ZtdHMgICAgPSBkZXZpY2VfcHJpdi0+cGl4X2ZtdHNbaV07CisgICAgICAgICAgICBwcml2LT5uYl9waXhfZm10cyA9IGRldmljZV9wcml2LT5uYl9waXhfZm10c1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwcml2LT5uYl9waXhfZm10cyA8IDIpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiVW5zdXBwb3J0ZWQgc3cgZm9ybWF0OiAlc1xuIiwKKyAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUoY3R4LT5zd19mb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PU1lTKTsKKyAgICB9CisKKyAgICBpZiAoIWN0eC0+cG9vbCkgeworICAgICAgICBjdHgtPmludGVybmFsLT5wb29sX2ludGVybmFsID0gYXZfYnVmZmVyX3Bvb2xfaW5pdDIoc2l6ZW9mKFZkcFZpZGVvU3VyZmFjZSksIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZkcGF1X3Bvb2xfYWxsb2MsIE5VTEwpOworICAgICAgICBpZiAoIWN0eC0+aW50ZXJuYWwtPnBvb2xfaW50ZXJuYWwpCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIH0KKworICAgIHByaXYtPmdldF9kYXRhID0gZGV2aWNlX3ByaXYtPmdldF9kYXRhOworICAgIHByaXYtPnB1dF9kYXRhID0gZGV2aWNlX3ByaXYtPnB1dF9kYXRhOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRwYXVfZ2V0X2J1ZmZlcihBVkhXRnJhbWVzQ29udGV4dCAqY3R4LCBBVkZyYW1lICpmcmFtZSkKK3sKKyAgICBmcmFtZS0+YnVmWzBdID0gYXZfYnVmZmVyX3Bvb2xfZ2V0KGN0eC0+cG9vbCk7CisgICAgaWYgKCFmcmFtZS0+YnVmWzBdKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgZnJhbWUtPmRhdGFbM10gPSBmcmFtZS0+YnVmWzBdLT5kYXRhOworICAgIGZyYW1lLT5mb3JtYXQgID0gQVZfUElYX0ZNVF9WRFBBVTsKKyAgICBmcmFtZS0+d2lkdGggICA9IGN0eC0+d2lkdGg7CisgICAgZnJhbWUtPmhlaWdodCAgPSBjdHgtPmhlaWdodDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkcGF1X3RyYW5zZmVyX2dldF9mb3JtYXRzKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZIV0ZyYW1lVHJhbnNmZXJEaXJlY3Rpb24gZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKipmb3JtYXRzKQoreworICAgIFZEUEFVRnJhbWVzQ29udGV4dCAqcHJpdiAgPSBjdHgtPmludGVybmFsLT5wcml2OworCisgICAgZW51bSBBVlBpeGVsRm9ybWF0ICpmbXRzOworCisgICAgaWYgKHByaXYtPm5iX3BpeF9mbXRzID09IDEpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIk5vIHRhcmdldCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQgZm9yIHRoaXMgY2hyb21hIHR5cGVcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9TWVMpOworICAgIH0KKworICAgIGZtdHMgPSBhdl9tYWxsb2NfYXJyYXkocHJpdi0+bmJfcGl4X2ZtdHMsIHNpemVvZigqZm10cykpOworICAgIGlmICghZm10cykKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIG1lbWNweShmbXRzLCBwcml2LT5waXhfZm10cywgc2l6ZW9mKCpmbXRzKSAqIChwcml2LT5uYl9waXhfZm10cykpOworICAgICpmb3JtYXRzID0gZm10czsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZkcGF1X3RyYW5zZmVyX2RhdGFfZnJvbShBVkhXRnJhbWVzQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgVkRQQVVGcmFtZXNDb250ZXh0ICpwcml2ID0gY3R4LT5pbnRlcm5hbC0+cHJpdjsKKyAgICBWZHBWaWRlb1N1cmZhY2UgICAgIHN1cmYgPSAoVmRwVmlkZW9TdXJmYWNlKSh1aW50cHRyX3Qpc3JjLT5kYXRhWzNdOworCisgICAgdm9pZCAqZGF0YVszXTsKKyAgICB1aW50MzJfdCBsaW5lc2l6ZVszXTsKKworICAgIGNvbnN0IFZEUEFVUGl4Rm10TWFwICptYXA7CisgICAgVmRwWUNiQ3JGb3JtYXQgdmRwYXVfZm9ybWF0OworICAgIFZkcFN0YXR1cyBlcnI7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpPCBGRl9BUlJBWV9FTEVNUyhkYXRhKSAmJiBkc3QtPmRhdGFbaV07IGkrKykgeworICAgICAgICBkYXRhW2ldID0gZHN0LT5kYXRhW2ldOworICAgICAgICBpZiAoZHN0LT5saW5lc2l6ZVtpXSA8IDAgfHwgZHN0LT5saW5lc2l6ZVtpXSA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAiVGhlIGxpbmVzaXplICVkIGNhbm5vdCBiZSByZXByZXNlbnRlZCBhcyB1aW50MzJcbiIsCisgICAgICAgICAgICAgICAgICAgZHN0LT5saW5lc2l6ZVtpXSk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOworICAgICAgICB9CisgICAgICAgIGxpbmVzaXplW2ldID0gZHN0LT5saW5lc2l6ZVtpXTsKKyAgICB9CisKKyAgICBtYXAgPSB2ZHBhdV9waXhfZm10c1twcml2LT5jaHJvbWFfaWR4XS5tYXA7CisgICAgZm9yIChpID0gMDsgbWFwW2ldLnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FOyBpKyspIHsKKyAgICAgICAgaWYgKG1hcFtpXS5waXhfZm10ID09IGRzdC0+Zm9ybWF0KSB7CisgICAgICAgICAgICB2ZHBhdV9mb3JtYXQgPSBtYXBbaV0udmRwYXVfZm10OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1hcFtpXS5waXhfZm10ID09IEFWX1BJWF9GTVRfTk9ORSkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgdGFyZ2V0IHBpeGVsIGZvcm1hdDogJXNcbiIsCisgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGRzdC0+Zm9ybWF0KSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgaWYgKHZkcGF1X2Zvcm1hdCA9PSBWRFBfWUNCQ1JfRk9STUFUX1lWMTIpCisgICAgICAgIEZGU1dBUCh2b2lkKiwgZGF0YVsxXSwgZGF0YVsyXSk7CisKKyAgICBlcnIgPSBwcml2LT5nZXRfZGF0YShzdXJmLCB2ZHBhdV9mb3JtYXQsIGRhdGEsIGxpbmVzaXplKTsKKyAgICBpZiAoZXJyICE9IFZEUF9TVEFUVVNfT0spIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgcmV0cmlldmluZyB0aGUgZGF0YSBmcm9tIGEgVkRQQVUgc3VyZmFjZVxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmRwYXVfdHJhbnNmZXJfZGF0YV90byhBVkhXRnJhbWVzQ29udGV4dCAqY3R4LCBBVkZyYW1lICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVZGcmFtZSAqc3JjKQoreworICAgIFZEUEFVRnJhbWVzQ29udGV4dCAqcHJpdiA9IGN0eC0+aW50ZXJuYWwtPnByaXY7CisgICAgVmRwVmlkZW9TdXJmYWNlICAgICBzdXJmID0gKFZkcFZpZGVvU3VyZmFjZSkodWludHB0cl90KWRzdC0+ZGF0YVszXTsKKworICAgIGNvbnN0IHZvaWQgKmRhdGFbM107CisgICAgdWludDMyX3QgbGluZXNpemVbM107CisKKyAgICBjb25zdCBWRFBBVVBpeEZtdE1hcCAqbWFwOworICAgIFZkcFlDYkNyRm9ybWF0IHZkcGF1X2Zvcm1hdDsKKyAgICBWZHBTdGF0dXMgZXJyOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaTwgRkZfQVJSQVlfRUxFTVMoZGF0YSkgJiYgc3JjLT5kYXRhW2ldOyBpKyspIHsKKyAgICAgICAgZGF0YVtpXSA9IHNyYy0+ZGF0YVtpXTsKKyAgICAgICAgaWYgKHNyYy0+bGluZXNpemVbaV0gPCAwIHx8IHNyYy0+bGluZXNpemVbaV0gPiBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIlRoZSBsaW5lc2l6ZSAlZCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgdWludDMyXG4iLAorICAgICAgICAgICAgICAgICAgIHNyYy0+bGluZXNpemVbaV0pOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRVJBTkdFKTsKKyAgICAgICAgfQorICAgICAgICBsaW5lc2l6ZVtpXSA9IHNyYy0+bGluZXNpemVbaV07CisgICAgfQorCisgICAgbWFwID0gdmRwYXVfcGl4X2ZtdHNbcHJpdi0+Y2hyb21hX2lkeF0ubWFwOworICAgIGZvciAoaSA9IDA7IG1hcFtpXS5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORTsgaSsrKSB7CisgICAgICAgIGlmIChtYXBbaV0ucGl4X2ZtdCA9PSBzcmMtPmZvcm1hdCkgeworICAgICAgICAgICAgdmRwYXVfZm9ybWF0ID0gbWFwW2ldLnZkcGF1X2ZtdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtYXBbaV0ucGl4X2ZtdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLAorICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHNvdXJjZSBwaXhlbCBmb3JtYXQ6ICVzXG4iLAorICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShzcmMtPmZvcm1hdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICh2ZHBhdV9mb3JtYXQgPT0gVkRQX1lDQkNSX0ZPUk1BVF9ZVjEyKQorICAgICAgICBGRlNXQVAoY29uc3Qgdm9pZCosIGRhdGFbMV0sIGRhdGFbMl0pOworCisgICAgZXJyID0gcHJpdi0+cHV0X2RhdGEoc3VyZiwgdmRwYXVfZm9ybWF0LCBkYXRhLCBsaW5lc2l6ZSk7CisgICAgaWYgKGVyciAhPSBWRFBfU1RBVFVTX09LKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkVycm9yIHVwbG9hZGluZyB0aGUgZGF0YSB0byBhIFZEUEFVIHN1cmZhY2VcbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisjaWYgSEFWRV9WRFBBVV9YMTEKKyNpbmNsdWRlIDx2ZHBhdS92ZHBhdV94MTEuaD4KKyNpbmNsdWRlIDxYMTEvWGxpYi5oPgorCit0eXBlZGVmIHN0cnVjdCBWRFBBVURldmljZVByaXYgeworICAgIFZkcERldmljZURlc3Ryb3kgKmRldmljZV9kZXN0cm95OworICAgIERpc3BsYXkgKmRweTsKK30gVkRQQVVEZXZpY2VQcml2OworCitzdGF0aWMgdm9pZCB2ZHBhdV9kZXZpY2VfZnJlZShBVkhXRGV2aWNlQ29udGV4dCAqY3R4KQoreworICAgIEFWVkRQQVVEZXZpY2VDb250ZXh0ICpod2N0eCA9IGN0eC0+aHdjdHg7CisgICAgVkRQQVVEZXZpY2VQcml2ICAgICAgICpwcml2ID0gY3R4LT51c2VyX29wYXF1ZTsKKworICAgIGlmIChwcml2LT5kZXZpY2VfZGVzdHJveSkKKyAgICAgICAgcHJpdi0+ZGV2aWNlX2Rlc3Ryb3koaHdjdHgtPmRldmljZSk7CisgICAgaWYgKHByaXYtPmRweSkKKyAgICAgICAgWENsb3NlRGlzcGxheShwcml2LT5kcHkpOworICAgIGF2X2ZyZWVwKCZwcml2KTsKK30KKworc3RhdGljIGludCB2ZHBhdV9kZXZpY2VfY3JlYXRlKEFWSFdEZXZpY2VDb250ZXh0ICpjdHgsIGNvbnN0IGNoYXIgKmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkRpY3Rpb25hcnkgKm9wdHMsIGludCBmbGFncykKK3sKKyAgICBBVlZEUEFVRGV2aWNlQ29udGV4dCAqaHdjdHggPSBjdHgtPmh3Y3R4OworCisgICAgVkRQQVVEZXZpY2VQcml2ICpwcml2OworICAgIFZkcFN0YXR1cyBlcnI7CisgICAgVmRwR2V0SW5mb3JtYXRpb25TdHJpbmcgKmdldF9pbmZvcm1hdGlvbl9zdHJpbmc7CisgICAgY29uc3QgY2hhciAqZGlzcGxheSwgKnZlbmRvcjsKKworICAgIHByaXYgPSBhdl9tYWxsb2N6KHNpemVvZigqcHJpdikpOworICAgIGlmICghcHJpdikKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKworICAgIGN0eC0+dXNlcl9vcGFxdWUgPSBwcml2OworICAgIGN0eC0+ZnJlZSAgICAgICAgPSB2ZHBhdV9kZXZpY2VfZnJlZTsKKworICAgIHByaXYtPmRweSA9IFhPcGVuRGlzcGxheShkZXZpY2UpOworICAgIGlmICghcHJpdi0+ZHB5KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNhbm5vdCBvcGVuIHRoZSBYMTEgZGlzcGxheSAlcy5cbiIsCisgICAgICAgICAgICAgICBYRGlzcGxheU5hbWUoZGV2aWNlKSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorICAgIGRpc3BsYXkgPSBYRGlzcGxheVN0cmluZyhwcml2LT5kcHkpOworCisgICAgZXJyID0gdmRwX2RldmljZV9jcmVhdGVfeDExKHByaXYtPmRweSwgWERlZmF1bHRTY3JlZW4ocHJpdi0+ZHB5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmh3Y3R4LT5kZXZpY2UsICZod2N0eC0+Z2V0X3Byb2NfYWRkcmVzcyk7CisgICAgaWYgKGVyciAhPSBWRFBfU1RBVFVTX09LKSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlZEUEFVIGRldmljZSBjcmVhdGlvbiBvbiBYMTEgZGlzcGxheSAlcyBmYWlsZWQuXG4iLAorICAgICAgICAgICAgICAgZGlzcGxheSk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgR0VUX0NBTExCQUNLKFZEUF9GVU5DX0lEX0dFVF9JTkZPUk1BVElPTl9TVFJJTkcsIGdldF9pbmZvcm1hdGlvbl9zdHJpbmcpOworICAgIEdFVF9DQUxMQkFDSyhWRFBfRlVOQ19JRF9ERVZJQ0VfREVTVFJPWSwgICAgICAgICBwcml2LT5kZXZpY2VfZGVzdHJveSk7CisKKyAgICBnZXRfaW5mb3JtYXRpb25fc3RyaW5nKCZ2ZW5kb3IpOworICAgIGF2X2xvZyhjdHgsIEFWX0xPR19WRVJCT1NFLCAiU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYSBWRFBBVSBkZXZpY2UgKCVzKSBvbiAiCisgICAgICAgICAgICJYMTEgZGlzcGxheSAlc1xuIiwgdmVuZG9yLCBkaXNwbGF5KTsKKworICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK2NvbnN0IEhXQ29udGV4dFR5cGUgZmZfaHdjb250ZXh0X3R5cGVfdmRwYXUgPSB7CisgICAgLnR5cGUgICAgICAgICAgICAgICAgID0gQVZfSFdERVZJQ0VfVFlQRV9WRFBBVSwKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAiVkRQQVUiLAorCisgICAgLmRldmljZV9od2N0eF9zaXplICAgID0gc2l6ZW9mKEFWVkRQQVVEZXZpY2VDb250ZXh0KSwKKyAgICAuZGV2aWNlX3ByaXZfc2l6ZSAgICAgPSBzaXplb2YoVkRQQVVEZXZpY2VDb250ZXh0KSwKKyAgICAuZnJhbWVzX3ByaXZfc2l6ZSAgICAgPSBzaXplb2YoVkRQQVVGcmFtZXNDb250ZXh0KSwKKworI2lmIEhBVkVfVkRQQVVfWDExCisgICAgLmRldmljZV9jcmVhdGUgICAgICAgID0gdmRwYXVfZGV2aWNlX2NyZWF0ZSwKKyNlbmRpZgorICAgIC5kZXZpY2VfaW5pdCAgICAgICAgICA9IHZkcGF1X2RldmljZV9pbml0LAorICAgIC5kZXZpY2VfdW5pbml0ICAgICAgICA9IHZkcGF1X2RldmljZV91bmluaXQsCisgICAgLmZyYW1lc19nZXRfY29uc3RyYWludHMgPSB2ZHBhdV9mcmFtZXNfZ2V0X2NvbnN0cmFpbnRzLAorICAgIC5mcmFtZXNfaW5pdCAgICAgICAgICA9IHZkcGF1X2ZyYW1lc19pbml0LAorICAgIC5mcmFtZXNfZ2V0X2J1ZmZlciAgICA9IHZkcGF1X2dldF9idWZmZXIsCisgICAgLnRyYW5zZmVyX2dldF9mb3JtYXRzID0gdmRwYXVfdHJhbnNmZXJfZ2V0X2Zvcm1hdHMsCisgICAgLnRyYW5zZmVyX2RhdGFfdG8gICAgID0gdmRwYXVfdHJhbnNmZXJfZGF0YV90bywKKyAgICAudHJhbnNmZXJfZGF0YV9mcm9tICAgPSB2ZHBhdV90cmFuc2Zlcl9kYXRhX2Zyb20sCisKKyAgICAucGl4X2ZtdHMgPSAoY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0W10peyBBVl9QSVhfRk1UX1ZEUEFVLCBBVl9QSVhfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X3ZkcGF1LmggYi9saWJhdnV0aWwvaHdjb250ZXh0X3ZkcGF1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3ZWExZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9od2NvbnRleHRfdmRwYXUuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0hXQ09OVEVYVF9WRFBBVV9ICisjZGVmaW5lIEFWVVRJTF9IV0NPTlRFWFRfVkRQQVVfSAorCisjaW5jbHVkZSA8dmRwYXUvdmRwYXUuaD4KKworLyoqCisgKiBAZmlsZQorICogQW4gQVBJLXNwZWNpZmljIGhlYWRlciBmb3IgQVZfSFdERVZJQ0VfVFlQRV9WRFBBVS4KKyAqCisgKiBUaGlzIEFQSSBzdXBwb3J0cyBkeW5hbWljIGZyYW1lIHBvb2xzLiBBVkhXRnJhbWVzQ29udGV4dC5wb29sIG11c3QgcmV0dXJuCisgKiBBVkJ1ZmZlclJlZnMgd2hvc2UgZGF0YSBwb2ludGVyIGlzIGEgVmRwVmlkZW9TdXJmYWNlLgorICovCisKKy8qKgorICogVGhpcyBzdHJ1Y3QgaXMgYWxsb2NhdGVkIGFzIEFWSFdEZXZpY2VDb250ZXh0Lmh3Y3R4CisgKi8KK3R5cGVkZWYgc3RydWN0IEFWVkRQQVVEZXZpY2VDb250ZXh0IHsKKyAgICBWZHBEZXZpY2UgICAgICAgICAgZGV2aWNlOworICAgIFZkcEdldFByb2NBZGRyZXNzICpnZXRfcHJvY19hZGRyZXNzOworfSBBVlZEUEFVRGV2aWNlQ29udGV4dDsKKworLyoqCisgKiBBVkhXRnJhbWVzQ29udGV4dC5od2N0eCBpcyBjdXJyZW50bHkgbm90IHVzZWQKKyAqLworCisjZW5kaWYgLyogQVZVVElMX0hXQ09OVEVYVF9WRFBBVV9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X3ZpZGVvdG9vbGJveC5jIGIvbGliYXZ1dGlsL2h3Y29udGV4dF92aWRlb3Rvb2xib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzAwZjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF92aWRlb3Rvb2xib3guYwpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPFZpZGVvVG9vbGJveC9WaWRlb1Rvb2xib3guaD4KKworI2luY2x1ZGUgImJ1ZmZlci5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImh3Y29udGV4dC5oIgorI2luY2x1ZGUgImh3Y29udGV4dF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImh3Y29udGV4dF92aWRlb3Rvb2xib3guaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlICJwaXhmbXQuaCIKKyNpbmNsdWRlICJwaXhkZXNjLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGN2X2ZtdDsKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdDsKK30gY3ZfcGl4X2ZtdHNbXSA9IHsKKyAgICB7IGtDVlBpeGVsRm9ybWF0VHlwZV80MjBZcENiQ3I4UGxhbmFyLCAgICAgICAgICAgICAgQVZfUElYX0ZNVF9ZVVY0MjBQIH0sCisgICAgeyBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIyWXBDYkNyOCwgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfVVlWWTQyMiB9LAorICAgIHsga0NWUGl4ZWxGb3JtYXRUeXBlXzMyQkdSQSwgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0JHUkEgfSwKKyNpZmRlZiBrQ0ZDb3JlRm91bmRhdGlvblZlcnNpb25OdW1iZXIxMF83CisgICAgeyBrQ1ZQaXhlbEZvcm1hdFR5cGVfNDIwWXBDYkNyOEJpUGxhbmFyVmlkZW9SYW5nZSwgIEFWX1BJWF9GTVRfTlYxMiB9LAorI2VuZGlmCit9OworCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZfbWFwX3ZpZGVvdG9vbGJveF9mb3JtYXRfdG9fcGl4Zm10KHVpbnQzMl90IGN2X2ZtdCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoY3ZfcGl4X2ZtdHMpOyBpKyspIHsKKyAgICAgICAgaWYgKGN2X3BpeF9mbXRzW2ldLmN2X2ZtdCA9PSBjdl9mbXQpCisgICAgICAgICAgICByZXR1cm4gY3ZfcGl4X2ZtdHNbaV0ucGl4X2ZtdDsKKyAgICB9CisgICAgcmV0dXJuIEFWX1BJWF9GTVRfTk9ORTsKK30KKwordWludDMyX3QgYXZfbWFwX3ZpZGVvdG9vbGJveF9mb3JtYXRfZnJvbV9waXhmbXQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGN2X3BpeF9mbXRzKTsgaSsrKSB7CisgICAgICAgIGlmIChjdl9waXhfZm10c1tpXS5waXhfZm10ID09IHBpeF9mbXQpCisgICAgICAgICAgICByZXR1cm4gY3ZfcGl4X2ZtdHNbaV0uY3ZfZm10OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2dF9nZXRfYnVmZmVyKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsIEFWRnJhbWUgKmZyYW1lKQoreworICAgIGZyYW1lLT5idWZbMF0gPSBhdl9idWZmZXJfcG9vbF9nZXQoY3R4LT5wb29sKTsKKyAgICBpZiAoIWZyYW1lLT5idWZbMF0pCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmcmFtZS0+ZGF0YVszXSA9IGZyYW1lLT5idWZbMF0tPmRhdGE7CisgICAgZnJhbWUtPmZvcm1hdCAgPSBBVl9QSVhfRk1UX1ZJREVPVE9PTEJPWDsKKyAgICBmcmFtZS0+d2lkdGggICA9IGN0eC0+d2lkdGg7CisgICAgZnJhbWUtPmhlaWdodCAgPSBjdHgtPmhlaWdodDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZ0X3RyYW5zZmVyX2dldF9mb3JtYXRzKEFWSFdGcmFtZXNDb250ZXh0ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZIV0ZyYW1lVHJhbnNmZXJEaXJlY3Rpb24gZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgKipmb3JtYXRzKQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCAqZm10cyA9IGF2X21hbGxvY19hcnJheSgyLCBzaXplb2YoKmZtdHMpKTsKKyAgICBpZiAoIWZtdHMpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICBmbXRzWzBdID0gY3R4LT5zd19mb3JtYXQ7CisgICAgZm10c1sxXSA9IEFWX1BJWF9GTVRfTk9ORTsKKworICAgICpmb3JtYXRzID0gZm10czsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdnRfdW5tYXAoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgSFdNYXBEZXNjcmlwdG9yICpod21hcCkKK3sKKyAgICBDVlBpeGVsQnVmZmVyUmVmIHBpeGJ1ZiA9IChDVlBpeGVsQnVmZmVyUmVmKWh3bWFwLT5zb3VyY2UtPmRhdGFbM107CisKKyAgICBDVlBpeGVsQnVmZmVyVW5sb2NrQmFzZUFkZHJlc3MocGl4YnVmLCAodWludHB0cl90KWh3bWFwLT5wcml2KTsKK30KKworc3RhdGljIGludCB2dF9tYXBfZnJhbWUoQVZIV0ZyYW1lc0NvbnRleHQgKmN0eCwgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgQ1ZQaXhlbEJ1ZmZlclJlZiBwaXhidWYgPSAoQ1ZQaXhlbEJ1ZmZlclJlZilzcmMtPmRhdGFbM107CisgICAgT1NUeXBlIHBpeGVsX2Zvcm1hdCA9IENWUGl4ZWxCdWZmZXJHZXRQaXhlbEZvcm1hdFR5cGUocGl4YnVmKTsKKyAgICBDVlJldHVybiBlcnI7CisgICAgdWludDMyX3QgbWFwX2ZsYWdzID0gMDsKKyAgICBpbnQgcmV0OworICAgIGludCBpOworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBmb3JtYXQ7CisKKyAgICBmb3JtYXQgPSBhdl9tYXBfdmlkZW90b29sYm94X2Zvcm1hdF90b19waXhmbXQocGl4ZWxfZm9ybWF0KTsKKyAgICBpZiAoZHN0LT5mb3JtYXQgIT0gZm9ybWF0KSB7CisgICAgICAgIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIlVuc3VwcG9ydGVkIG9yIG1pc21hdGNoaW5nIHBpeGVsIGZvcm1hdDogJXNcbiIsCisgICAgICAgICAgICAgICBhdl9mb3VyY2Myc3RyKHBpeGVsX2Zvcm1hdCkpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChDVlBpeGVsQnVmZmVyR2V0V2lkdGgocGl4YnVmKSAhPSBjdHgtPndpZHRoIHx8CisgICAgICAgIENWUGl4ZWxCdWZmZXJHZXRIZWlnaHQocGl4YnVmKSAhPSBjdHgtPmhlaWdodCkgeworICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJJbmNvbnNpc3RlbnQgZnJhbWUgZGltZW5zaW9ucy5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIGlmIChmbGFncyA9PSBBVl9IV0ZSQU1FX01BUF9SRUFEKQorICAgICAgICBtYXBfZmxhZ3MgPSBrQ1ZQaXhlbEJ1ZmZlckxvY2tfUmVhZE9ubHk7CisKKyAgICBlcnIgPSBDVlBpeGVsQnVmZmVyTG9ja0Jhc2VBZGRyZXNzKHBpeGJ1ZiwgbWFwX2ZsYWdzKTsKKyAgICBpZiAoZXJyICE9IGtDVlJldHVyblN1Y2Nlc3MpIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRXJyb3IgbG9ja2luZyB0aGUgcGl4ZWwgYnVmZmVyLlxuIik7CisgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CisgICAgfQorCisgICAgaWYgKENWUGl4ZWxCdWZmZXJJc1BsYW5hcihwaXhidWYpKSB7CisgICAgICAgIGludCBwbGFuZXMgPSBDVlBpeGVsQnVmZmVyR2V0UGxhbmVDb3VudChwaXhidWYpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzOyBpKyspIHsKKyAgICAgICAgICAgIGRzdC0+ZGF0YVtpXSAgICAgPSBDVlBpeGVsQnVmZmVyR2V0QmFzZUFkZHJlc3NPZlBsYW5lKHBpeGJ1ZiwgaSk7CisgICAgICAgICAgICBkc3QtPmxpbmVzaXplW2ldID0gQ1ZQaXhlbEJ1ZmZlckdldEJ5dGVzUGVyUm93T2ZQbGFuZShwaXhidWYsIGkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0LT5kYXRhWzBdICAgICA9IENWUGl4ZWxCdWZmZXJHZXRCYXNlQWRkcmVzcyhwaXhidWYpOworICAgICAgICBkc3QtPmxpbmVzaXplWzBdID0gQ1ZQaXhlbEJ1ZmZlckdldEJ5dGVzUGVyUm93KHBpeGJ1Zik7CisgICAgfQorCisgICAgcmV0ID0gZmZfaHdmcmFtZV9tYXBfY3JlYXRlKHNyYy0+aHdfZnJhbWVzX2N0eCwgZHN0LCBzcmMsIHZ0X3VubWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbWFwX2ZsYWdzKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byB1bmxvY2s7CisKKyAgICByZXR1cm4gMDsKKwordW5sb2NrOgorICAgIENWUGl4ZWxCdWZmZXJVbmxvY2tCYXNlQWRkcmVzcyhwaXhidWYsIG1hcF9mbGFncyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2dF90cmFuc2Zlcl9kYXRhX2Zyb20oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVkZyYW1lICpkc3QsIGNvbnN0IEFWRnJhbWUgKnNyYykKK3sKKyAgICBBVkZyYW1lICptYXA7CisgICAgaW50IGVycjsKKworICAgIGlmIChkc3QtPndpZHRoID4gaHdmYy0+d2lkdGggfHwgZHN0LT5oZWlnaHQgPiBod2ZjLT5oZWlnaHQpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICBtYXAgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghbWFwKQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgIG1hcC0+Zm9ybWF0ID0gZHN0LT5mb3JtYXQ7CisKKyAgICBlcnIgPSB2dF9tYXBfZnJhbWUoaHdmYywgbWFwLCBzcmMsIEFWX0hXRlJBTUVfTUFQX1JFQUQpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIG1hcC0+d2lkdGggID0gZHN0LT53aWR0aDsKKyAgICBtYXAtPmhlaWdodCA9IGRzdC0+aGVpZ2h0OworCisgICAgZXJyID0gYXZfZnJhbWVfY29weShkc3QsIG1hcCk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgZXJyID0gMDsKK2ZhaWw6CisgICAgYXZfZnJhbWVfZnJlZSgmbWFwKTsKKyAgICByZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHZ0X3RyYW5zZmVyX2RhdGFfdG8oQVZIV0ZyYW1lc0NvbnRleHQgKmh3ZmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZGcmFtZSAqZHN0LCBjb25zdCBBVkZyYW1lICpzcmMpCit7CisgICAgQVZGcmFtZSAqbWFwOworICAgIGludCBlcnI7CisKKyAgICBpZiAoc3JjLT53aWR0aCA+IGh3ZmMtPndpZHRoIHx8IHNyYy0+aGVpZ2h0ID4gaHdmYy0+aGVpZ2h0KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworCisgICAgbWFwID0gYXZfZnJhbWVfYWxsb2MoKTsKKyAgICBpZiAoIW1hcCkKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKKyAgICBtYXAtPmZvcm1hdCA9IHNyYy0+Zm9ybWF0OworCisgICAgZXJyID0gdnRfbWFwX2ZyYW1lKGh3ZmMsIG1hcCwgZHN0LCBBVl9IV0ZSQU1FX01BUF9XUklURSB8IEFWX0hXRlJBTUVfTUFQX09WRVJXUklURSk7CisgICAgaWYgKGVycikKKyAgICAgICAgZ290byBmYWlsOworCisgICAgbWFwLT53aWR0aCAgPSBzcmMtPndpZHRoOworICAgIG1hcC0+aGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisKKyAgICBlcnIgPSBhdl9mcmFtZV9jb3B5KG1hcCwgc3JjKTsKKyAgICBpZiAoZXJyKQorICAgICAgICBnb3RvIGZhaWw7CisKKyAgICBlcnIgPSAwOworZmFpbDoKKyAgICBhdl9mcmFtZV9mcmVlKCZtYXApOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdnRfZGV2aWNlX2NyZWF0ZShBVkhXRGV2aWNlQ29udGV4dCAqY3R4LCBjb25zdCBjaGFyICpkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZEaWN0aW9uYXJ5ICpvcHRzLCBpbnQgZmxhZ3MpCit7CisgICAgaWYgKGRldmljZSAmJiBkZXZpY2VbMF0pIHsKKyAgICAgICAgYXZfbG9nKGN0eCwgQVZfTE9HX0VSUk9SLCAiRGV2aWNlIHNlbGVjdGlvbiB1bnN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitjb25zdCBIV0NvbnRleHRUeXBlIGZmX2h3Y29udGV4dF90eXBlX3ZpZGVvdG9vbGJveCA9IHsKKyAgICAudHlwZSAgICAgICAgICAgICAgICAgPSBBVl9IV0RFVklDRV9UWVBFX1ZJREVPVE9PTEJPWCwKKyAgICAubmFtZSAgICAgICAgICAgICAgICAgPSAidmlkZW90b29sYm94IiwKKworICAgIC5kZXZpY2VfY3JlYXRlICAgICAgICA9IHZ0X2RldmljZV9jcmVhdGUsCisgICAgLmZyYW1lc19nZXRfYnVmZmVyICAgID0gdnRfZ2V0X2J1ZmZlciwKKyAgICAudHJhbnNmZXJfZ2V0X2Zvcm1hdHMgPSB2dF90cmFuc2Zlcl9nZXRfZm9ybWF0cywKKyAgICAudHJhbnNmZXJfZGF0YV90byAgICAgPSB2dF90cmFuc2Zlcl9kYXRhX3RvLAorICAgIC50cmFuc2Zlcl9kYXRhX2Zyb20gICA9IHZ0X3RyYW5zZmVyX2RhdGFfZnJvbSwKKworICAgIC5waXhfZm10cyA9IChjb25zdCBlbnVtIEFWUGl4ZWxGb3JtYXRbXSl7IEFWX1BJWF9GTVRfVklERU9UT09MQk9YLCBBVl9QSVhfRk1UX05PTkUgfSwKK307CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaHdjb250ZXh0X3ZpZGVvdG9vbGJveC5oIGIvbGliYXZ1dGlsL2h3Y29udGV4dF92aWRlb3Rvb2xib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA5MThkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2h3Y29udGV4dF92aWRlb3Rvb2xib3guaApAQCAtMCwwICsxLDU0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX0hXQ09OVEVYVF9WSURFT1RPT0xCT1hfSAorI2RlZmluZSBBVlVUSUxfSFdDT05URVhUX1ZJREVPVE9PTEJPWF9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPFZpZGVvVG9vbGJveC9WaWRlb1Rvb2xib3guaD4KKworI2luY2x1ZGUgInBpeGZtdC5oIgorCisvKioKKyAqIEBmaWxlCisgKiBBbiBBUEktc3BlY2lmaWMgaGVhZGVyIGZvciBBVl9IV0RFVklDRV9UWVBFX1ZJREVPVE9PTEJPWC4KKyAqCisgKiBUaGlzIEFQSSBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZSBhbGxvY2F0aW9uLCBhcyB0aGUgcmF3IFZpZGVvVG9vbGJveAorICogQVBJIGRvZXMgYWxsb2NhdGlvbiwgYW5kIEZGbXBlZyBpdHNlbGYgbmV2ZXIgaGFzIHRoZSBuZWVkIHRvIGFsbG9jYXRlIGZyYW1lcy4KKyAqCisgKiBJZiB0aGUgQVBJIHVzZXIgc2V0cyBhIGN1c3RvbSBwb29sLCBBVkhXRnJhbWVzQ29udGV4dC5wb29sIG11c3QgcmV0dXJuCisgKiBBVkJ1ZmZlclJlZnMgd2hvc2UgZGF0YSBwb2ludGVyIGlzIGEgQ1ZJbWFnZUJ1ZmZlclJlZiBvciBDVlBpeGVsQnVmZmVyUmVmLgorICoKKyAqIEN1cnJlbnRseSBBVkhXRGV2aWNlQ29udGV4dC5od2N0eCBhbmQgQVZIV0ZyYW1lc0NvbnRleHQuaHdjdHggYXJlIGFsd2F5cworICogTlVMTC4KKyAqLworCisvKioKKyAqIENvbnZlcnQgYSBWaWRlb1Rvb2xib3ggKGFjdHVhbGx5IENvcmVWaWRlbykgZm9ybWF0IHRvIEFWUGl4ZWxGb3JtYXQuCisgKiBSZXR1cm5zIEFWX1BJWF9GTVRfTk9ORSBpZiBubyBrbm93biBlcXVpdmFsZW50IHdhcyBmb3VuZC4KKyAqLworZW51bSBBVlBpeGVsRm9ybWF0IGF2X21hcF92aWRlb3Rvb2xib3hfZm9ybWF0X3RvX3BpeGZtdCh1aW50MzJfdCBjdl9mbXQpOworCisvKioKKyAqIENvbnZlcnQgYW4gQVZQaXhlbEZvcm1hdCB0byBhIFZpZGVvVG9vbGJveCAoYWN0dWFsbHkgQ29yZVZpZGVvKSBmb3JtYXQuCisgKiBSZXR1cm5zIDAgaWYgbm8ga25vd24gZXF1aXZhbGVudCB3YXMgZm91bmQuCisgKi8KK3VpbnQzMl90IGF2X21hcF92aWRlb3Rvb2xib3hfZm9ybWF0X2Zyb21fcGl4Zm10KGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKKworI2VuZGlmIC8qIEFWVVRJTF9IV0NPTlRFWFRfVklERU9UT09MQk9YX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9pbWd1dGlscy5jIGIvbGliYXZ1dGlsL2ltZ3V0aWxzLmMKaW5kZXggMTQ3NDQ4Mi4uYWZjNzNlMiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2ltZ3V0aWxzLmMKKysrIGIvbGliYXZ1dGlsL2ltZ3V0aWxzLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJhdmFzc2VydC5oIgogI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgImltZ3V0aWxzLmgiCisjaW5jbHVkZSAiaW1ndXRpbHNfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJpbnRlcm5hbC5oIgogI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImxvZy5oIgpAQCAtMTI0LDcgKzEyNSw3IEBACiAgICAgc2l6ZVswXSA9IGxpbmVzaXplc1swXSAqIGhlaWdodDsKIAogICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwKLSAgICAgICAgZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKSB7CisgICAgICAgIGRlc2MtPmZsYWdzICYgRkZfUFNFVURPUEFMKSB7CiAgICAgICAgIGRhdGFbMV0gPSBwdHIgKyBzaXplWzBdOyAvKiBwYWxldHRlIGlzIHN0b3JlZCBoZXJlIGFzIDI1NiAzMiBiaXRzIHdvcmRzICovCiAgICAgICAgIHJldHVybiBzaXplWzBdICsgMjU2ICogNDsKICAgICB9CkBAIC0yMTUsNyArMjE2LDcgQEAKICAgICAgICAgYXZfZnJlZShidWYpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMIHx8IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkgeworICAgIGlmIChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwgKGRlc2MtPmZsYWdzICYgRkZfUFNFVURPUEFMICYmIHBvaW50ZXJzWzFdKSkgewogICAgICAgICBhdnByaXZfc2V0X3N5c3RlbWF0aWNfcGFsMigodWludDMyX3QqKXBvaW50ZXJzWzFdLCBwaXhfZm10KTsKICAgICAgICAgaWYgKGFsaWduIDwgNCkgewogICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZvcm1hdHMgd2l0aCBhIHBhbGV0dGUgcmVxdWlyZSBhIG1pbmltdW0gYWxpZ25tZW50IG9mIDRcbiIpOwpAQCAtMjI0LDcgKzIyNSw3IEBACiAgICAgfQogCiAgICAgaWYgKChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwgfHwKLSAgICAgICAgIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCkgJiYKKyAgICAgICAgIGRlc2MtPmZsYWdzICYgRkZfUFNFVURPUEFMKSAmJiBwb2ludGVyc1sxXSAmJgogICAgICAgICBwb2ludGVyc1sxXSAtIHBvaW50ZXJzWzBdID4gbGluZXNpemVzWzBdICogaCkgewogICAgICAgICAvKiB6ZXJvLWluaXRpYWxpemUgdGhlIHBhZGRpbmcgYmVmb3JlIHRoZSBwYWxldHRlICovCiAgICAgICAgIG1lbXNldChwb2ludGVyc1swXSArIGxpbmVzaXplc1swXSAqIGgsIDAsCkBAIC0yNDEsMjYgKzI0Miw0NiBAQAogfSBJbWdVdGlsczsKIAogc3RhdGljIGNvbnN0IEFWQ2xhc3MgaW1ndXRpbHNfY2xhc3MgPSB7Ci0gICAgLmNsYXNzX25hbWUgPSAiSU1HVVRJTFMiLAotICAgIC5pdGVtX25hbWUgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCi0gICAgLnZlcnNpb24gICAgPSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQsCisgICAgLmNsYXNzX25hbWUgICAgICAgICAgICAgICAgPSAiSU1HVVRJTFMiLAorICAgIC5pdGVtX25hbWUgICAgICAgICAgICAgICAgID0gYXZfZGVmYXVsdF9pdGVtX25hbWUsCisgICAgLm9wdGlvbiAgICAgICAgICAgICAgICAgICAgPSBOVUxMLAorICAgIC52ZXJzaW9uICAgICAgICAgICAgICAgICAgID0gTElCQVZVVElMX1ZFUlNJT05fSU5ULAogICAgIC5sb2dfbGV2ZWxfb2Zmc2V0X29mZnNldCAgID0gb2Zmc2V0b2YoSW1nVXRpbHMsIGxvZ19vZmZzZXQpLAogICAgIC5wYXJlbnRfbG9nX2NvbnRleHRfb2Zmc2V0ID0gb2Zmc2V0b2YoSW1nVXRpbHMsIGxvZ19jdHgpLAogfTsKIAotaW50IGF2X2ltYWdlX2NoZWNrX3NpemUodW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBpbnQgbG9nX29mZnNldCwgdm9pZCAqbG9nX2N0eCkKK2ludCBhdl9pbWFnZV9jaGVja19zaXplMih1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgsIGludDY0X3QgbWF4X3BpeGVscywgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KQogewogICAgIEltZ1V0aWxzIGltZ3V0aWxzID0gewogICAgICAgICAuY2xhc3MgICAgICA9ICZpbWd1dGlsc19jbGFzcywKICAgICAgICAgLmxvZ19vZmZzZXQgPSBsb2dfb2Zmc2V0LAogICAgICAgICAubG9nX2N0eCAgICA9IGxvZ19jdHgsCiAgICAgfTsKKyAgICBpbnQ2NF90IHN0cmlkZSA9IGF2X2ltYWdlX2dldF9saW5lc2l6ZShwaXhfZm10LCB3LCAwKTsKKyAgICBpZiAoc3RyaWRlIDw9IDApCisgICAgICAgIHN0cmlkZSA9IDhMTCp3OworICAgIHN0cmlkZSArPSAxMjgqODsKIAotICAgIGlmICgoaW50KXc+MCAmJiAoaW50KWg+MCAmJiAodysxMjgpKih1aW50NjRfdCkoaCsxMjgpIDwgSU5UX01BWC84KQotICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoKGludCl3PD0wIHx8IChpbnQpaDw9MCB8fCBzdHJpZGUgPj0gSU5UX01BWCB8fCBzdHJpZGUqKHVpbnQ2NF90KShoKzEyOCkgPj0gSU5UX01BWCkgeworICAgICAgICBhdl9sb2coJmltZ3V0aWxzLCBBVl9MT0dfRVJST1IsICJQaWN0dXJlIHNpemUgJXV4JXUgaXMgaW52YWxpZFxuIiwgdywgaCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQogCi0gICAgYXZfbG9nKCZpbWd1dGlscywgQVZfTE9HX0VSUk9SLCAiUGljdHVyZSBzaXplICV1eCV1IGlzIGludmFsaWRcbiIsIHcsIGgpOwotICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgaWYgKG1heF9waXhlbHMgPCBJTlQ2NF9NQVgpIHsKKyAgICAgICAgaWYgKHcqKGludDY0X3QpaCA+IG1heF9waXhlbHMpIHsKKyAgICAgICAgICAgIGF2X2xvZygmaW1ndXRpbHMsIEFWX0xPR19FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgIlBpY3R1cmUgc2l6ZSAldXgldSBleGNlZWRzIHNwZWNpZmllZCBtYXggcGl4ZWwgY291bnQgJSJQUklkNjQiLCBzZWUgdGhlIGRvY3VtZW50YXRpb24gaWYgeW91IHdpc2ggdG8gaW5jcmVhc2UgaXRcbiIsCisgICAgICAgICAgICAgICAgICAgIHcsIGgsIG1heF9waXhlbHMpOworICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgYXZfaW1hZ2VfY2hlY2tfc2l6ZSh1bnNpZ25lZCBpbnQgdywgdW5zaWduZWQgaW50IGgsIGludCBsb2dfb2Zmc2V0LCB2b2lkICpsb2dfY3R4KQoreworICAgIHJldHVybiBhdl9pbWFnZV9jaGVja19zaXplMih3LCBoLCBJTlQ2NF9NQVgsIEFWX1BJWF9GTVRfTk9ORSwgbG9nX29mZnNldCwgbG9nX2N0eCk7CiB9CiAKIGludCBhdl9pbWFnZV9jaGVja19zYXIodW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBBVlJhdGlvbmFsIHNhcikKQEAgLTI4NCw5ICszMDUsOSBAQAogICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiB9CiAKLXZvaWQgYXZfaW1hZ2VfY29weV9wbGFuZSh1aW50OF90ICAgICAgICpkc3QsIGludCBkc3RfbGluZXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX2xpbmVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRld2lkdGgsIGludCBoZWlnaHQpCitzdGF0aWMgdm9pZCBpbWFnZV9jb3B5X3BsYW5lKHVpbnQ4X3QgICAgICAgKmRzdCwgcHRyZGlmZl90IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYnl0ZXdpZHRoLCBpbnQgaGVpZ2h0KQogewogICAgIGlmICghZHN0IHx8ICFzcmMpCiAgICAgICAgIHJldHVybjsKQEAgLTI5OSw5ICszMjAsMzMgQEAKICAgICB9CiB9CiAKLXZvaWQgYXZfaW1hZ2VfY29weSh1aW50OF90ICpkc3RfZGF0YVs0XSwgaW50IGRzdF9saW5lc2l6ZXNbNF0sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX2RhdGFbNF0sIGNvbnN0IGludCBzcmNfbGluZXNpemVzWzRdLAotICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCitzdGF0aWMgdm9pZCBpbWFnZV9jb3B5X3BsYW5lX3VjX2Zyb20odWludDhfdCAgICAgICAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYnl0ZXdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGludCByZXQgPSAtMTsKKworI2lmIEFSQ0hfWDg2CisgICAgcmV0ID0gZmZfaW1hZ2VfY29weV9wbGFuZV91Y19mcm9tX3g4Nihkc3QsIGRzdF9saW5lc2l6ZSwgc3JjLCBzcmNfbGluZXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRld2lkdGgsIGhlaWdodCk7CisjZW5kaWYKKworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBpbWFnZV9jb3B5X3BsYW5lKGRzdCwgZHN0X2xpbmVzaXplLCBzcmMsIHNyY19saW5lc2l6ZSwgYnl0ZXdpZHRoLCBoZWlnaHQpOworfQorCit2b2lkIGF2X2ltYWdlX2NvcHlfcGxhbmUodWludDhfdCAgICAgICAqZHN0LCBpbnQgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXdpZHRoLCBpbnQgaGVpZ2h0KQoreworICAgIGltYWdlX2NvcHlfcGxhbmUoZHN0LCBkc3RfbGluZXNpemUsIHNyYywgc3JjX2xpbmVzaXplLCBieXRld2lkdGgsIGhlaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIGltYWdlX2NvcHkodWludDhfdCAqZHN0X2RhdGFbNF0sIGNvbnN0IHB0cmRpZmZfdCBkc3RfbGluZXNpemVzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfZGF0YVs0XSwgY29uc3QgcHRyZGlmZl90IHNyY19saW5lc2l6ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjb3B5X3BsYW5lKSh1aW50OF90ICosIHB0cmRpZmZfdCwgY29uc3QgdWludDhfdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90LCBwdHJkaWZmX3QsIGludCkpCiB7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKIApAQCAtMzA5LDEyICszNTQsMTMgQEAKICAgICAgICAgcmV0dXJuOwogCiAgICAgaWYgKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1BBTCB8fAotICAgICAgICBkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwpIHsKLSAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3RfZGF0YVswXSwgZHN0X2xpbmVzaXplc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YVswXSwgc3JjX2xpbmVzaXplc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgZGVzYy0+ZmxhZ3MgJiBGRl9QU0VVRE9QQUwpIHsKKyAgICAgICAgY29weV9wbGFuZShkc3RfZGF0YVswXSwgZHN0X2xpbmVzaXplc1swXSwKKyAgICAgICAgICAgICAgICAgICBzcmNfZGF0YVswXSwgc3JjX2xpbmVzaXplc1swXSwKKyAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgLyogY29weSB0aGUgcGFsZXR0ZSAqLwotICAgICAgICBtZW1jcHkoZHN0X2RhdGFbMV0sIHNyY19kYXRhWzFdLCA0KjI1Nik7CisgICAgICAgIGlmICgoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMKSB8fCAoZHN0X2RhdGFbMV0gJiYgc3JjX2RhdGFbMV0pKQorICAgICAgICAgICAgbWVtY3B5KGRzdF9kYXRhWzFdLCBzcmNfZGF0YVsxXSwgNCoyNTYpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBpLCBwbGFuZXNfbmIgPSAwOwogCkBAIC0zMjMsNyArMzY5LDcgQEAKIAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVzX25iOyBpKyspIHsKICAgICAgICAgICAgIGludCBoID0gaGVpZ2h0OwotICAgICAgICAgICAgaW50IGJ3aWR0aCA9IGF2X2ltYWdlX2dldF9saW5lc2l6ZShwaXhfZm10LCB3aWR0aCwgaSk7CisgICAgICAgICAgICBwdHJkaWZmX3QgYndpZHRoID0gYXZfaW1hZ2VfZ2V0X2xpbmVzaXplKHBpeF9mbXQsIHdpZHRoLCBpKTsKICAgICAgICAgICAgIGlmIChid2lkdGggPCAwKSB7CiAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImF2X2ltYWdlX2dldF9saW5lc2l6ZSBmYWlsZWRcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTMzMSwxMyArMzc3LDM3IEBACiAgICAgICAgICAgICBpZiAoaSA9PSAxIHx8IGkgPT0gMikgewogICAgICAgICAgICAgICAgIGggPSBBVl9DRUlMX1JTSElGVChoZWlnaHQsIGRlc2MtPmxvZzJfY2hyb21hX2gpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZfaW1hZ2VfY29weV9wbGFuZShkc3RfZGF0YVtpXSwgZHN0X2xpbmVzaXplc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGFbaV0sIHNyY19saW5lc2l6ZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ3aWR0aCwgaCk7CisgICAgICAgICAgICBjb3B5X3BsYW5lKGRzdF9kYXRhW2ldLCBkc3RfbGluZXNpemVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YVtpXSwgc3JjX2xpbmVzaXplc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgYndpZHRoLCBoKTsKICAgICAgICAgfQogICAgIH0KIH0KIAordm9pZCBhdl9pbWFnZV9jb3B5KHVpbnQ4X3QgKmRzdF9kYXRhWzRdLCBpbnQgZHN0X2xpbmVzaXplc1s0XSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfZGF0YVs0XSwgY29uc3QgaW50IHNyY19saW5lc2l6ZXNbNF0sCisgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBwdHJkaWZmX3QgZHN0X2xpbmVzaXplczFbNF0sIHNyY19saW5lc2l6ZXMxWzRdOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBkc3RfbGluZXNpemVzMVtpXSA9IGRzdF9saW5lc2l6ZXNbaV07CisgICAgICAgIHNyY19saW5lc2l6ZXMxW2ldID0gc3JjX2xpbmVzaXplc1tpXTsKKyAgICB9CisKKyAgICBpbWFnZV9jb3B5KGRzdF9kYXRhLCBkc3RfbGluZXNpemVzMSwgc3JjX2RhdGEsIHNyY19saW5lc2l6ZXMxLCBwaXhfZm10LAorICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgaW1hZ2VfY29weV9wbGFuZSk7Cit9CisKK3ZvaWQgYXZfaW1hZ2VfY29weV91Y19mcm9tKHVpbnQ4X3QgKmRzdF9kYXRhWzRdLCBjb25zdCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY19kYXRhWzRdLCBjb25zdCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplc1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCit7CisgICAgaW1hZ2VfY29weShkc3RfZGF0YSwgZHN0X2xpbmVzaXplcywgc3JjX2RhdGEsIHNyY19saW5lc2l6ZXMsIHBpeF9mbXQsCisgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBpbWFnZV9jb3B5X3BsYW5lX3VjX2Zyb20pOworfQorCiBpbnQgYXZfaW1hZ2VfZmlsbF9hcnJheXModWludDhfdCAqZHN0X2RhdGFbNF0sIGludCBkc3RfbGluZXNpemVbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhbGlnbikKQEAgLTM3Myw3ICs0NDMsNyBAQAogICAgICAgICByZXR1cm4gcmV0OwogCiAgICAgLy8gZG8gbm90IGluY2x1ZGUgcGFsZXR0ZSBmb3IgdGhlc2UgcHNldWRvLXBhbGV0dGVkIGZvcm1hdHMKLSAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKQorICAgIGlmIChkZXNjLT5mbGFncyAmIEZGX1BTRVVET1BBTCkKICAgICAgICAgcmV0dXJuIEZGQUxJR04od2lkdGgsIGFsaWduKSAqIGhlaWdodDsKIAogICAgIHJldHVybiBhdl9pbWFnZV9maWxsX2FycmF5cyhkYXRhLCBsaW5lc2l6ZSwgTlVMTCwgcGl4X2ZtdCwKQEAgLTM4OSw2ICs0NTksNyBAQAogICAgIGludCBpLCBqLCBuYl9wbGFuZXMgPSAwLCBsaW5lc2l6ZVs0XTsKICAgICBpbnQgc2l6ZSA9IGF2X2ltYWdlX2dldF9idWZmZXJfc2l6ZShwaXhfZm10LCB3aWR0aCwgaGVpZ2h0LCBhbGlnbik7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBpbnQgcmV0OwogCiAgICAgaWYgKHNpemUgPiBkc3Rfc2l6ZSB8fCBzaXplIDwgMCB8fCAhZGVzYykKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKQEAgLTM5OCw3ICs0NjksOSBAQAogCiAgICAgbmJfcGxhbmVzKys7CiAKLSAgICBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhsaW5lc2l6ZSwgcGl4X2ZtdCwgd2lkdGgpOworICAgIHJldCA9IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKGxpbmVzaXplLCBwaXhfZm10LCB3aWR0aCk7CisgICAgYXZfYXNzZXJ0MChyZXQgPj0gMCk7IC8vIHdhcyBjaGVja2VkIHByZXZpb3VzbHkKKwogICAgIGZvciAoaSA9IDA7IGkgPCBuYl9wbGFuZXM7IGkrKykgewogICAgICAgICBpbnQgaCwgc2hpZnQgPSAoaSA9PSAxIHx8IGkgPT0gMikgPyBkZXNjLT5sb2cyX2Nocm9tYV9oIDogMDsKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0gc3JjX2RhdGFbaV07CkBAIC00MjAsMyArNDkzLDE1MyBAQAogCiAgICAgcmV0dXJuIHNpemU7CiB9CisKKy8vIEZpbGwgZHN0WzAuLmRzdF9zaXplXSB3aXRoIHRoZSBieXRlcyBpbiBjbGVhclswLi5jbGVhcl9zaXplXS4gVGhlIGNsZWFyCisvLyBieXRlcyBhcmUgcmVwZWF0ZWQgdW50aWwgZHN0X3NpemUgaXMgcmVhY2hlZC4gSWYgZHN0X3NpemUgaXMgdW5hbGlnbmVkIChpLmUuCisvLyBkc3Rfc2l6ZSVjbGVhcl9zaXplIT0wKSwgdGhlIHJlbWFpbmluZyBkYXRhIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIGJlZ2lubmluZworLy8gb2YgdGhlIGNsZWFyIGRhdGEgb25seS4KK3N0YXRpYyB2b2lkIG1lbXNldF9ieXRlcyh1aW50OF90ICpkc3QsIHNpemVfdCBkc3Rfc2l6ZSwgdWludDhfdCAqY2xlYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNsZWFyX3NpemUpCit7CisgICAgaW50IHNhbWUgPSAxOworICAgIGludCBpOworCisgICAgaWYgKCFjbGVhcl9zaXplKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBSZWR1Y2UgdG8gbWVtc2V0KCkgaWYgcG9zc2libGUuCisgICAgZm9yIChpID0gMDsgaSA8IGNsZWFyX3NpemU7IGkrKykgeworICAgICAgICBpZiAoY2xlYXJbaV0gIT0gY2xlYXJbMF0pIHsKKyAgICAgICAgICAgIHNhbWUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNhbWUpCisgICAgICAgIGNsZWFyX3NpemUgPSAxOworCisgICAgaWYgKGNsZWFyX3NpemUgPT0gMSkgeworICAgICAgICBtZW1zZXQoZHN0LCBjbGVhclswXSwgZHN0X3NpemUpOworICAgICAgICBkc3Rfc2l6ZSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNsZWFyX3NpemUgPiBkc3Rfc2l6ZSkKKyAgICAgICAgICAgIGNsZWFyX3NpemUgPSBkc3Rfc2l6ZTsKKyAgICAgICAgbWVtY3B5KGRzdCwgY2xlYXIsIGNsZWFyX3NpemUpOworICAgICAgICBhdl9tZW1jcHlfYmFja3B0cihkc3QgKyBjbGVhcl9zaXplLCBjbGVhcl9zaXplLCBkc3Rfc2l6ZSAtIGNsZWFyX3NpemUpOworICAgIH0KK30KKworLy8gTWF4aW11bSBzaXplIGluIGJ5dGVzIG9mIGEgcGxhbmUgZWxlbWVudCAodXN1YWxseSBhIHBpeGVsLCBvciBtdWx0aXBsZSBwaXhlbHMKKy8vIGlmIGl0J3MgYSBzdWJzYW1wbGVkIHBhY2tlZCBmb3JtYXQpLgorI2RlZmluZSBNQVhfQkxPQ0tfU0laRSAzMgorCitpbnQgYXZfaW1hZ2VfZmlsbF9ibGFjayh1aW50OF90ICpkc3RfZGF0YVs0XSwgY29uc3QgcHRyZGlmZl90IGRzdF9saW5lc2l6ZVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10LCBlbnVtIEFWQ29sb3JSYW5nZSByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGludCBuYl9wbGFuZXMgPSBhdl9waXhfZm10X2NvdW50X3BsYW5lcyhwaXhfZm10KTsKKyAgICAvLyBBIHBpeGVsIG9yIGEgZ3JvdXAgb2YgcGl4ZWxzIG9uIGVhY2ggcGxhbmUsIHdpdGggYSB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgYmxhY2suCisgICAgLy8gQ29uc2lkZXIgZS5nLiBBVl9QSVhfRk1UX1VZVlk0MjIgZm9yIG5vbi10cml2aWFsIGNhc2VzLgorICAgIHVpbnQ4X3QgY2xlYXJfYmxvY2tbNF1bTUFYX0JMT0NLX1NJWkVdID0ge3swfX07IC8vIGNsZWFyIHBhZGRpbmcgd2l0aCAwCisgICAgaW50IGNsZWFyX2Jsb2NrX3NpemVbNF0gPSB7MH07CisgICAgcHRyZGlmZl90IHBsYW5lX2xpbmVfYnl0ZXNbNF0gPSB7MH07CisgICAgaW50IHJnYiwgbGltaXRlZDsKKyAgICBpbnQgcGxhbmUsIGM7CisKKyAgICBpZiAoIWRlc2MgfHwgbmJfcGxhbmVzIDwgMSB8fCBuYl9wbGFuZXMgPiA0IHx8IGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisKKyAgICByZ2IgPSAhIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpOworICAgIGxpbWl0ZWQgPSAhcmdiICYmIHJhbmdlICE9IEFWQ09MX1JBTkdFX0pQRUc7CisKKyAgICBpZiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQklUU1RSRUFNKSB7CisgICAgICAgIHB0cmRpZmZfdCBieXRld2lkdGggPSBhdl9pbWFnZV9nZXRfbGluZXNpemUocGl4X2ZtdCwgd2lkdGgsIDApOworICAgICAgICB1aW50OF90ICpkYXRhOworICAgICAgICBpbnQgbW9ubyA9IHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEUgfHwgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX01PTk9CTEFDSzsKKyAgICAgICAgaW50IGZpbGwgPSBwaXhfZm10ID09IEFWX1BJWF9GTVRfTU9OT1dISVRFID8gMHhGRiA6IDA7CisgICAgICAgIGlmIChuYl9wbGFuZXMgIT0gMSB8fCAhKHJnYiB8fCBtb25vKSB8fCBieXRld2lkdGggPCAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICBpZiAoIWRzdF9kYXRhKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgZGF0YSA9IGRzdF9kYXRhWzBdOworCisgICAgICAgIC8vIChCaXRzdHJlYW0gKyBhbHBoYSB3aWxsIGJlIGhhbmRsZWQgaW5jb3JyZWN0bHkgLSBpdCdsbCByZW1haW4gdHJhbnNwYXJlbnQuKQorICAgICAgICBmb3IgKDtoZWlnaHQgPiAwOyBoZWlnaHQtLSkgeworICAgICAgICAgICAgbWVtc2V0KGRhdGEsIGZpbGwsIGJ5dGV3aWR0aCk7CisgICAgICAgICAgICBkYXRhICs9IGRzdF9saW5lc2l6ZVswXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgZGVzYy0+bmJfY29tcG9uZW50czsgYysrKSB7CisgICAgICAgIGNvbnN0IEFWQ29tcG9uZW50RGVzY3JpcHRvciBjb21wID0gZGVzYy0+Y29tcFtjXTsKKworICAgICAgICAvLyBXZSB0cnkgdG8gb3BlcmF0ZSBvbiBlbnRpcmUgbm9uLXN1YnNhbXBsZWQgcGl4ZWwgZ3JvdXBzIChmb3IKKyAgICAgICAgLy8gQVZfUElYX0ZNVF9VWVZZNDIyIHRoaXMgd291bGQgbWVhbiB0d28gY29uc2VjdXRpdmUgcGl4ZWxzKS4KKyAgICAgICAgY2xlYXJfYmxvY2tfc2l6ZVtjb21wLnBsYW5lXSA9IEZGTUFYKGNsZWFyX2Jsb2NrX3NpemVbY29tcC5wbGFuZV0sIGNvbXAuc3RlcCk7CisKKyAgICAgICAgaWYgKGNsZWFyX2Jsb2NrX3NpemVbY29tcC5wbGFuZV0gPiBNQVhfQkxPQ0tfU0laRSkKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgYnl0ZSBhcnJheSBmb3IgY2xlYXJpbmcgMSBwaXhlbCAoc29tZXRpbWVzIHNldmVyYWwgcGl4ZWxzKS4KKyAgICBmb3IgKGMgPSAwOyBjIDwgZGVzYy0+bmJfY29tcG9uZW50czsgYysrKSB7CisgICAgICAgIGNvbnN0IEFWQ29tcG9uZW50RGVzY3JpcHRvciBjb21wID0gZGVzYy0+Y29tcFtjXTsKKyAgICAgICAgLy8gKE11bHRpcGxlIHBpeGVscyBoYXBwZW4gZS5nLiB3aXRoIEFWX1BJWF9GTVRfVVlWWTQyMi4pCisgICAgICAgIGludCB3ID0gY2xlYXJfYmxvY2tfc2l6ZVtjb21wLnBsYW5lXSAvIGNvbXAuc3RlcDsKKyAgICAgICAgdWludDhfdCAqY19kYXRhWzRdOworICAgICAgICBjb25zdCBpbnQgY19saW5lc2l6ZVs0XSA9IHswfTsKKyAgICAgICAgdWludDE2X3Qgc3JjX2FycmF5W01BWF9CTE9DS19TSVpFXTsKKyAgICAgICAgdWludDE2X3Qgc3JjID0gMDsKKyAgICAgICAgaW50IHg7CisKKyAgICAgICAgaWYgKGNvbXAuZGVwdGggPiAxNikKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgICAgICAgIGlmICghcmdiICYmIGNvbXAuZGVwdGggPCA4KQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICAgICAgaWYgKHcgPCAxKQorICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKworICAgICAgICBpZiAoYyA9PSAwICYmIGxpbWl0ZWQpIHsKKyAgICAgICAgICAgIHNyYyA9IDE2IDw8IChjb21wLmRlcHRoIC0gOCk7CisgICAgICAgIH0gZWxzZSBpZiAoKGMgPT0gMSB8fCBjID09IDIpICYmICFyZ2IpIHsKKyAgICAgICAgICAgIHNyYyA9IDEyOCA8PCAoY29tcC5kZXB0aCAtIDgpOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gMykgeworICAgICAgICAgICAgLy8gKEFzc3VtZSBldmVuIGxpbWl0ZWQgWVVWIHVzZXMgZnVsbCByYW5nZSBhbHBoYS4pCisgICAgICAgICAgICBzcmMgPSAoMSA8PCBjb21wLmRlcHRoKSAtIDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdzsgeCsrKQorICAgICAgICAgICAgc3JjX2FycmF5W3hdID0gc3JjOworCisgICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyB4KyspCisgICAgICAgICAgICBjX2RhdGFbeF0gPSAmY2xlYXJfYmxvY2tbeF1bMF07CisKKyAgICAgICAgYXZfd3JpdGVfaW1hZ2VfbGluZShzcmNfYXJyYXksIGNfZGF0YSwgY19saW5lc2l6ZSwgZGVzYywgMCwgMCwgYywgdyk7CisgICAgfQorCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgbmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIHBsYW5lX2xpbmVfYnl0ZXNbcGxhbmVdID0gYXZfaW1hZ2VfZ2V0X2xpbmVzaXplKHBpeF9mbXQsIHdpZHRoLCBwbGFuZSk7CisgICAgICAgIGlmIChwbGFuZV9saW5lX2J5dGVzW3BsYW5lXSA8IDApCisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworICAgIH0KKworICAgIGlmICghZHN0X2RhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgbmJfcGxhbmVzOyBwbGFuZSsrKSB7CisgICAgICAgIHNpemVfdCBieXRld2lkdGggPSBwbGFuZV9saW5lX2J5dGVzW3BsYW5lXTsKKyAgICAgICAgdWludDhfdCAqZGF0YSA9IGRzdF9kYXRhW3BsYW5lXTsKKyAgICAgICAgaW50IGNocm9tYV9kaXYgPSBwbGFuZSA9PSAxIHx8IHBsYW5lID09IDIgPyBkZXNjLT5sb2cyX2Nocm9tYV9oIDogMDsKKyAgICAgICAgaW50IHBsYW5lX2ggPSAoKGhlaWdodCArICggMSA8PCBjaHJvbWFfZGl2KSAtIDEpKSA+PiBjaHJvbWFfZGl2OworCisgICAgICAgIGZvciAoOyBwbGFuZV9oID4gMDsgcGxhbmVfaC0tKSB7CisgICAgICAgICAgICBtZW1zZXRfYnl0ZXMoZGF0YSwgYnl0ZXdpZHRoLCAmY2xlYXJfYmxvY2tbcGxhbmVdWzBdLCBjbGVhcl9ibG9ja19zaXplW3BsYW5lXSk7CisgICAgICAgICAgICBkYXRhICs9IGRzdF9saW5lc2l6ZVtwbGFuZV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9pbWd1dGlscy5oIGIvbGliYXZ1dGlsL2ltZ3V0aWxzLmgKaW5kZXggMjMyODJhMy4uNWI3OTBlYyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2ltZ3V0aWxzLmgKKysrIGIvbGliYXZ1dGlsL2ltZ3V0aWxzLmgKQEAgLTEyMSw2ICsxMjEsMjQgQEAKICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKIAogLyoqCisgKiBDb3B5IGltYWdlIGRhdGEgbG9jYXRlZCBpbiB1bmNhY2hlYWJsZSAoZS5nLiBHUFUgbWFwcGVkKSBtZW1vcnkuIFdoZXJlCisgKiBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gd2lsbCB1c2Ugc3BlY2lhbCBmdW5jdGlvbmFsaXR5IGZvciByZWFkaW5nIGZyb20gc3VjaAorICogbWVtb3J5LCB3aGljaCBtYXkgcmVzdWx0IGluIGdyZWF0bHkgaW1wcm92ZWQgcGVyZm9ybWFuY2UgY29tcGFyZWQgdG8gcGxhaW4KKyAqIGF2X2ltYWdlX2NvcHkoKS4KKyAqCisgKiBUaGUgZGF0YSBwb2ludGVycyBhbmQgdGhlIGxpbmVzaXplcyBtdXN0IGJlIGFsaWduZWQgdG8gdGhlIG1heGltdW0gcmVxdWlyZWQKKyAqIGJ5IHRoZSBDUFUgYXJjaGl0ZWN0dXJlLgorICoKKyAqIEBub3RlIFRoZSBsaW5lc2l6ZSBwYXJhbWV0ZXJzIGhhdmUgdGhlIHR5cGUgcHRyZGlmZl90IGhlcmUsIHdoaWxlIHRoZXkgYXJlCisgKiAgICAgICBpbnQgZm9yIGF2X2ltYWdlX2NvcHkoKS4KKyAqIEBub3RlIE9uIHg4NiwgdGhlIGxpbmVzaXplcyBjdXJyZW50bHkgbmVlZCB0byBiZSBhbGlnbmVkIHRvIHRoZSBjYWNoZWxpbmUKKyAqICAgICAgIHNpemUgKGkuZS4gNjQpIHRvIGdldCBpbXByb3ZlZCBwZXJmb3JtYW5jZS4KKyAqLwordm9pZCBhdl9pbWFnZV9jb3B5X3VjX2Zyb20odWludDhfdCAqZHN0X2RhdGFbNF0sICAgICAgIGNvbnN0IHB0cmRpZmZfdCBkc3RfbGluZXNpemVzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX2RhdGFbNF0sIGNvbnN0IHB0cmRpZmZfdCBzcmNfbGluZXNpemVzWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8qKgogICogU2V0dXAgdGhlIGRhdGEgcG9pbnRlcnMgYW5kIGxpbmVzaXplcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIGltYWdlCiAgKiBwYXJhbWV0ZXJzIGFuZCB0aGUgcHJvdmlkZWQgYXJyYXkuCiAgKgpAQCAtMTM3LDcgKzE1NSw3IEBACiAgKiBvbmUgY2FsbCwgdXNlIGF2X2ltYWdlX2FsbG9jKCkuCiAgKgogICogQHBhcmFtIGRzdF9kYXRhICAgICAgZGF0YSBwb2ludGVycyB0byBiZSBmaWxsZWQgaW4KLSAqIEBwYXJhbSBkc3RfbGluZXNpemVzIGxpbmVzaXplcyBmb3IgdGhlIGltYWdlIGluIGRzdF9kYXRhIHRvIGJlIGZpbGxlZCBpbgorICogQHBhcmFtIGRzdF9saW5lc2l6ZSAgbGluZXNpemVzIGZvciB0aGUgaW1hZ2UgaW4gZHN0X2RhdGEgdG8gYmUgZmlsbGVkIGluCiAgKiBAcGFyYW0gc3JjICAgICAgICAgICBidWZmZXIgd2hpY2ggd2lsbCBjb250YWluIG9yIGNvbnRhaW5zIHRoZSBhY3R1YWwgaW1hZ2UgZGF0YSwgY2FuIGJlIE5VTEwKICAqIEBwYXJhbSBwaXhfZm10ICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIGltYWdlCiAgKiBAcGFyYW0gd2lkdGggICAgICAgICB0aGUgd2lkdGggb2YgdGhlIGltYWdlIGluIHBpeGVscwpAQCAtMTU0LDcgKzE3MiwxMSBAQAogICogUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBhbW91bnQgb2YgZGF0YSByZXF1aXJlZCB0byBzdG9yZSBhbgogICogaW1hZ2Ugd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KICAqCi0gKiBAcGFyYW1baW5dIGFsaWduIHRoZSBhc3N1bWVkIGxpbmVzaXplIGFsaWdubWVudAorICogQHBhcmFtIHBpeF9mbXQgIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gd2lkdGggICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMKKyAqIEBwYXJhbSBoZWlnaHQgICB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMKKyAqIEBwYXJhbSBhbGlnbiAgICB0aGUgYXNzdW1lZCBsaW5lc2l6ZSBhbGlnbm1lbnQKKyAqIEByZXR1cm4gdGhlIGJ1ZmZlciBzaXplIGluIGJ5dGVzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCiAgKi8KIGludCBhdl9pbWFnZV9nZXRfYnVmZmVyX3NpemUoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGFsaWduKTsKIApAQCAtMTY3LDcgKzE4OSw3IEBACiAgKiBAcGFyYW0gZHN0ICAgICAgICAgICBhIGJ1ZmZlciBpbnRvIHdoaWNoIHBpY3R1cmUgZGF0YSB3aWxsIGJlIGNvcGllZAogICogQHBhcmFtIGRzdF9zaXplICAgICAgdGhlIHNpemUgaW4gYnl0ZXMgb2YgZHN0CiAgKiBAcGFyYW0gc3JjX2RhdGEgICAgICBwb2ludGVycyBjb250YWluaW5nIHRoZSBzb3VyY2UgaW1hZ2UgZGF0YQotICogQHBhcmFtIHNyY19saW5lc2l6ZXMgbGluZXNpemVzIGZvciB0aGUgaW1hZ2UgaW4gc3JjX2RhdGEKKyAqIEBwYXJhbSBzcmNfbGluZXNpemUgIGxpbmVzaXplcyBmb3IgdGhlIGltYWdlIGluIHNyY19kYXRhCiAgKiBAcGFyYW0gcGl4X2ZtdCAgICAgICB0aGUgcGl4ZWwgZm9ybWF0IG9mIHRoZSBzb3VyY2UgaW1hZ2UKICAqIEBwYXJhbSB3aWR0aCAgICAgICAgIHRoZSB3aWR0aCBvZiB0aGUgc291cmNlIGltYWdlIGluIHBpeGVscwogICogQHBhcmFtIGhlaWdodCAgICAgICAgdGhlIGhlaWdodCBvZiB0aGUgc291cmNlIGltYWdlIGluIHBpeGVscwpAQCAtMTkyLDYgKzIxNCwyMSBAQAogaW50IGF2X2ltYWdlX2NoZWNrX3NpemUodW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBpbnQgbG9nX29mZnNldCwgdm9pZCAqbG9nX2N0eCk7CiAKIC8qKgorICogQ2hlY2sgaWYgdGhlIGdpdmVuIGRpbWVuc2lvbiBvZiBhbiBpbWFnZSBpcyB2YWxpZCwgbWVhbmluZyB0aGF0IGFsbAorICogYnl0ZXMgb2YgYSBwbGFuZSBvZiBhbiBpbWFnZSB3aXRoIHRoZSBzcGVjaWZpZWQgcGl4X2ZtdCBjYW4gYmUgYWRkcmVzc2VkCisgKiB3aXRoIGEgc2lnbmVkIGludC4KKyAqCisgKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIHBpY3R1cmUKKyAqIEBwYXJhbSBoIHRoZSBoZWlnaHQgb2YgdGhlIHBpY3R1cmUKKyAqIEBwYXJhbSBtYXhfcGl4ZWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBwaXhlbHMgdGhlIHVzZXIgd2FudHMgdG8gYWNjZXB0CisgKiBAcGFyYW0gcGl4X2ZtdCB0aGUgcGl4ZWwgZm9ybWF0LCBjYW4gYmUgQVZfUElYX0ZNVF9OT05FIGlmIHVua25vd24uCisgKiBAcGFyYW0gbG9nX29mZnNldCB0aGUgb2Zmc2V0IHRvIHN1bSB0byB0aGUgbG9nIGxldmVsIGZvciBsb2dnaW5nIHdpdGggbG9nX2N0eAorICogQHBhcmFtIGxvZ19jdHggdGhlIHBhcmVudCBsb2dnaW5nIGNvbnRleHQsIGl0IG1heSBiZSBOVUxMCisgKiBAcmV0dXJuID49IDAgaWYgdmFsaWQsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAqLworaW50IGF2X2ltYWdlX2NoZWNrX3NpemUyKHVuc2lnbmVkIGludCB3LCB1bnNpZ25lZCBpbnQgaCwgaW50NjRfdCBtYXhfcGl4ZWxzLCBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgaW50IGxvZ19vZmZzZXQsIHZvaWQgKmxvZ19jdHgpOworCisvKioKICAqIENoZWNrIGlmIHRoZSBnaXZlbiBzYW1wbGUgYXNwZWN0IHJhdGlvIG9mIGFuIGltYWdlIGlzIHZhbGlkLgogICoKICAqIEl0IGlzIGNvbnNpZGVyZWQgaW52YWxpZCBpZiB0aGUgZGVub21pbmF0b3IgaXMgMCBvciBpZiBhcHBseWluZyB0aGUgcmF0aW8KQEAgLTIwNiw2ICsyNDMsMzMgQEAKIGludCBhdl9pbWFnZV9jaGVja19zYXIodW5zaWduZWQgaW50IHcsIHVuc2lnbmVkIGludCBoLCBBVlJhdGlvbmFsIHNhcik7CiAKIC8qKgorICogT3ZlcndyaXRlIHRoZSBpbWFnZSBkYXRhIHdpdGggYmxhY2suIFRoaXMgaXMgc3VpdGFibGUgZm9yIGZpbGxpbmcgYQorICogc3ViLXJlY3RhbmdsZSBvZiBhbiBpbWFnZSwgbWVhbmluZyB0aGUgcGFkZGluZyBiZXR3ZWVuIHRoZSByaWdodCBtb3N0IHBpeGVsCisgKiBhbmQgdGhlIGxlZnQgbW9zdCBwaXhlbCBvbiB0aGUgbmV4dCBsaW5lIHdpbGwgbm90IGJlIG92ZXJ3cml0dGVuLiBGb3Igc29tZQorICogZm9ybWF0cywgdGhlIGltYWdlIHNpemUgbWlnaHQgYmUgcm91bmRlZCB1cCBkdWUgdG8gaW5oZXJlbnQgYWxpZ25tZW50LgorICoKKyAqIElmIHRoZSBwaXhlbCBmb3JtYXQgaGFzIGFscGhhLCB0aGUgYWxwaGEgaXMgY2xlYXJlZCB0byBvcGFxdWUuCisgKgorICogVGhpcyBjYW4gcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBwaXhlbCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4gTm9ybWFsbHksIGFsbAorICogbm9uLWh3YWNjZWwgcGl4ZWwgZm9ybWF0cyBzaG91bGQgYmUgc3VwcG9ydGVkLgorICoKKyAqIFBhc3NpbmcgTlVMTCBmb3IgZHN0X2RhdGEgaXMgYWxsb3dlZC4gVGhlbiB0aGUgZnVuY3Rpb24gcmV0dXJucyB3aGV0aGVyIHRoZQorICogb3BlcmF0aW9uIHdvdWxkIGhhdmUgc3VjY2VlZGVkLiAoSXQgY2FuIHJldHVybiBhbiBlcnJvciBpZiB0aGUgcGl4X2ZtdCBpcworICogbm90IHN1cHBvcnRlZC4pCisgKgorICogQHBhcmFtIGRzdF9kYXRhICAgICAgZGF0YSBwb2ludGVycyB0byBkZXN0aW5hdGlvbiBpbWFnZQorICogQHBhcmFtIGRzdF9saW5lc2l6ZSAgbGluZXNpemVzIGZvciB0aGUgZGVzdGluYXRpb24gaW1hZ2UKKyAqIEBwYXJhbSBwaXhfZm10ICAgICAgIHRoZSBwaXhlbCBmb3JtYXQgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gcmFuZ2UgICAgICAgICB0aGUgY29sb3IgcmFuZ2Ugb2YgdGhlIGltYWdlIChpbXBvcnRhbnQgZm9yIGNvbG9yc3BhY2VzIHN1Y2ggYXMgWVVWKQorICogQHBhcmFtIHdpZHRoICAgICAgICAgdGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMKKyAqIEBwYXJhbSBoZWlnaHQgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlIGluIHBpeGVscworICogQHJldHVybiAwIGlmIHRoZSBpbWFnZSBkYXRhIHdhcyBjbGVhcmVkLCBhIG5lZ2F0aXZlIEFWRVJST1IgY29kZSBvdGhlcndpc2UKKyAqLworaW50IGF2X2ltYWdlX2ZpbGxfYmxhY2sodWludDhfdCAqZHN0X2RhdGFbNF0sIGNvbnN0IHB0cmRpZmZfdCBkc3RfbGluZXNpemVbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCwgZW51bSBBVkNvbG9yUmFuZ2UgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisvKioKICAqIEB9CiAgKi8KIApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2ltZ3V0aWxzX2ludGVybmFsLmggYi9saWJhdnV0aWwvaW1ndXRpbHNfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTE1ODU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL2ltZ3V0aWxzX2ludGVybmFsLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9JTUdVVElMU19JTlRFUk5BTF9ICisjZGVmaW5lIEFWVVRJTF9JTUdVVElMU19JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworaW50IGZmX2ltYWdlX2NvcHlfcGxhbmVfdWNfZnJvbV94ODYodWludDhfdCAgICAgICAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGJ5dGV3aWR0aCwgaW50IGhlaWdodCk7CisKKworI2VuZGlmIC8qIEFWVVRJTF9JTUdVVElMU19JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaW50ZWdlci5jIGIvbGliYXZ1dGlsL2ludGVnZXIuYwppbmRleCA2ZDY4NTVmLi43OGUyNTJmIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvaW50ZWdlci5jCisrKyBiL2xpYmF2dXRpbC9pbnRlZ2VyLmMKQEAgLTc0LDcgKzc0LDcgQEAKIAogICAgICAgICBpZihhLnZbaV0pCiAgICAgICAgICAgICBmb3Ioaj1pOyBqPEFWX0lOVEVHRVJfU0laRSAmJiBqLWk8PW5iOyBqKyspewotICAgICAgICAgICAgICAgIGNhcnJ5PSAoY2Fycnk+PjE2KSArIG91dC52W2pdICsgYS52W2ldKmIudltqLWldOworICAgICAgICAgICAgICAgIGNhcnJ5PSAoY2Fycnk+PjE2KSArIG91dC52W2pdICsgYS52W2ldKih1bnNpZ25lZCliLnZbai1pXTsKICAgICAgICAgICAgICAgICBvdXQudltqXT0gY2Fycnk7CiAgICAgICAgICAgICB9CiAgICAgfQpAQCAtMTY0LDQxICsxNjQsMyBAQAogICAgIH0KICAgICByZXR1cm4gb3V0OwogfQotCi0jaWZkZWYgVEVTVAotCi1jb25zdCB1aW50OF90IGZmX2xvZzJfdGFiWzI1Nl09ewotICAgICAgICAwLDAsMSwxLDIsMiwyLDIsMywzLDMsMywzLDMsMywzLDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsNCw0LDQsCi0gICAgICAgIDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSwKLSAgICAgICAgNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LAotICAgICAgICA2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsNiw2LDYsCi0gICAgICAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNywKLSAgICAgICAgNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LAotICAgICAgICA3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsCi0gICAgICAgIDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNyw3LDcsNwotfTsKLQotaW50IG1haW4odm9pZCl7Ci0gICAgaW50NjRfdCBhLGI7Ci0KLSAgICBmb3IoYT03OyBhPDI1NioyNTYqMjU2OyBhKz0xMzIxNSl7Ci0gICAgICAgIGZvcihiPTM7IGI8MjU2KjI1NioyNTY7IGIrPTI3MTE4KXsKLSAgICAgICAgICAgIEFWSW50ZWdlciBhaT0gYXZfaW50MmkoYSk7Ci0gICAgICAgICAgICBBVkludGVnZXIgYmk9IGF2X2ludDJpKGIpOwotCi0gICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGFpKSA9PSBhKTsKLSAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYmkpID09IGIpOwotICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9hZGRfaShhaSxiaSkpID09IGErYik7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGF2X3N1Yl9pKGFpLGJpKSkgPT0gYS1iKTsKLSAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYXZfbXVsX2koYWksYmkpKSA9PSBhKmIpOwotICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9zaHJfaShhaSwgOSkpID09IGE+PjkpOwotICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9zaHJfaShhaSwtOSkpID09IGE8PDkpOwotICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9zaHJfaShhaSwgMTcpKSA9PSBhPj4xNyk7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGF2X3Nocl9pKGFpLC0xNykpID09IGE8PDE3KTsKLSAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfbG9nMl9pKGFpKSA9PSBhdl9sb2cyKGEpKTsKLSAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYXZfZGl2X2koYWksYmkpKSA9PSBhL2IpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaW50ZXJuYWwuaCBiL2xpYmF2dXRpbC9pbnRlcm5hbC5oCmluZGV4IGM0YmNmMzcuLjA2YmQ1NjEgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9pbnRlcm5hbC5oCisrKyBiL2xpYmF2dXRpbC9pbnRlcm5hbC5oCkBAIC0zMCw2ICszMCw5IEBACiAjICAgIGRlZmluZSBOREVCVUcKICNlbmRpZgogCisvLyBUaGlzIGNhbiBiZSBlbmFibGVkIHRvIGFsbG93IGRldGVjdGlvbiBvZiBhZGRpdGlvbmFsIGludGVnZXIgb3ZlcmZsb3dzIHdpdGggdWJzYW4KKy8vI2RlZmluZSBDSEVDS0VECisKICNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdGRkZWYuaD4KQEAgLTQwLDYgKzQzLDcgQEAKICNpbmNsdWRlICJjcHUuaCIKICNpbmNsdWRlICJkaWN0LmgiCiAjaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSAibWVtLmgiCiAjaW5jbHVkZSAicGl4Zm10LmgiCiAjaW5jbHVkZSAidmVyc2lvbi5oIgogCkBAIC01OSwxMCArNjMsMTAgQEAKICNlbmRpZgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBDT05GSUdfU0hBUkVECi0jICAgIGRlZmluZSBhdl9leHBvcnQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjaWYgZGVmaW5lZChfV0lOMzIpICYmIENPTkZJR19TSEFSRUQgJiYgIWRlZmluZWQoQlVJTERJTkdfYXZ1dGlsKQorIyAgICBkZWZpbmUgYXZfZXhwb3J0X2F2dXRpbCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKICNlbHNlCi0jICAgIGRlZmluZSBhdl9leHBvcnQKKyMgICAgZGVmaW5lIGF2X2V4cG9ydF9hdnV0aWwKICNlbmRpZgogCiAjaWYgSEFWRV9QUkFHTUFfREVQUkVDQVRFRApAQCAtNzMsOCArNzcsOCBAQAogIyAgICAgICAgZGVmaW5lIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MgX19wcmFnbWEod2FybmluZyhwdXNoKSkgX19wcmFnbWEod2FybmluZyhkaXNhYmxlOjQ5OTYpKQogIyAgICAgICAgZGVmaW5lIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUyAgX19wcmFnbWEod2FybmluZyhwb3ApKQogIyAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgRkZfRElTQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUyBfUHJhZ21hKCJHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9uc1wiIikKLSMgICAgICAgIGRlZmluZSBGRl9FTkFCTEVfREVQUkVDQVRJT05fV0FSTklOR1MgIF9QcmFnbWEoIkdDQyBkaWFnbm9zdGljIHdhcm5pbmcgXCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXCIiKQorIyAgICAgICAgZGVmaW5lIEZGX0RJU0FCTEVfREVQUkVDQVRJT05fV0FSTklOR1MgX1ByYWdtYSgiR0NDIGRpYWdub3N0aWMgcHVzaCIpIF9QcmFnbWEoIkdDQyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zXCIiKQorIyAgICAgICAgZGVmaW5lIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUyAgX1ByYWdtYSgiR0NDIGRpYWdub3N0aWMgcG9wIikKICMgICAgZW5kaWYKICNlbHNlCiAjICAgIGRlZmluZSBGRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCkBAIC0xMDcsMjQgKzExMSwzMCBAQAogICAgIERFQ0xBUkVfQUxJR05FRChhLCB0LCBsYV8jI3YpIHMgbzsgICAgICAgICAgICAgICAgICBcCiAgICAgdCAoKnYpIG8gPSBsYV8jI3YKIAotI2RlZmluZSBMT0NBTF9BTElHTkVEKGEsIHQsIHYsIC4uLikgRTEoTE9DQUxfQUxJR05FRF9BKGEsIHQsIHYsIF9fVkFfQVJHU19fLCwpKQorI2RlZmluZSBMT0NBTF9BTElHTkVEKGEsIHQsIHYsIC4uLikgTE9DQUxfQUxJR05FRF8jI2EodCwgdiwgX19WQV9BUkdTX18pCiAKLSNpZiBIQVZFX0xPQ0FMX0FMSUdORURfOAorI2lmIEhBVkVfTE9DQUxfQUxJR05FRAorIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzQodCwgdiwgLi4uKSBFMShMT0NBTF9BTElHTkVEX0QoNCwgdCwgdiwgX19WQV9BUkdTX18sLCkpCisjZWxzZQorIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzQodCwgdiwgLi4uKSBFMShMT0NBTF9BTElHTkVEX0EoNCwgdCwgdiwgX19WQV9BUkdTX18sLCkpCisjZW5kaWYKKworI2lmIEhBVkVfTE9DQUxfQUxJR05FRAogIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzgodCwgdiwgLi4uKSBFMShMT0NBTF9BTElHTkVEX0QoOCwgdCwgdiwgX19WQV9BUkdTX18sLCkpCiAjZWxzZQotIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzgodCwgdiwgLi4uKSBMT0NBTF9BTElHTkVEKDgsIHQsIHYsIF9fVkFfQVJHU19fKQorIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzgodCwgdiwgLi4uKSBFMShMT0NBTF9BTElHTkVEX0EoOCwgdCwgdiwgX19WQV9BUkdTX18sLCkpCiAjZW5kaWYKIAotI2lmIEhBVkVfTE9DQUxfQUxJR05FRF8xNgorI2lmIEhBVkVfTE9DQUxfQUxJR05FRAogIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzE2KHQsIHYsIC4uLikgRTEoTE9DQUxfQUxJR05FRF9EKDE2LCB0LCB2LCBfX1ZBX0FSR1NfXywsKSkKICNlbHNlCi0jICAgZGVmaW5lIExPQ0FMX0FMSUdORURfMTYodCwgdiwgLi4uKSBMT0NBTF9BTElHTkVEKDE2LCB0LCB2LCBfX1ZBX0FSR1NfXykKKyMgICBkZWZpbmUgTE9DQUxfQUxJR05FRF8xNih0LCB2LCAuLi4pIEUxKExPQ0FMX0FMSUdORURfQSgxNiwgdCwgdiwgX19WQV9BUkdTX18sLCkpCiAjZW5kaWYKIAotI2lmIEhBVkVfTE9DQUxfQUxJR05FRF8zMgorI2lmIEhBVkVfTE9DQUxfQUxJR05FRAogIyAgIGRlZmluZSBMT0NBTF9BTElHTkVEXzMyKHQsIHYsIC4uLikgRTEoTE9DQUxfQUxJR05FRF9EKDMyLCB0LCB2LCBfX1ZBX0FSR1NfXywsKSkKICNlbHNlCi0jICAgZGVmaW5lIExPQ0FMX0FMSUdORURfMzIodCwgdiwgLi4uKSBMT0NBTF9BTElHTkVEKDMyLCB0LCB2LCBfX1ZBX0FSR1NfXykKKyMgICBkZWZpbmUgTE9DQUxfQUxJR05FRF8zMih0LCB2LCAuLi4pIEUxKExPQ0FMX0FMSUdORURfQSgzMiwgdCwgdiwgX19WQV9BUkdTX18sLCkpCiAjZW5kaWYKIAogI2RlZmluZSBGRl9BTExPQ19PUl9HT1RPKGN0eCwgcCwgc2l6ZSwgbGFiZWwpXApAQCAtMjQ0LDYgKzI1NCw3IEBACiAjZW5kaWYKIAogI2RlZmluZSBhdnByaXZfb3BlbiBmZl9vcGVuCisjZGVmaW5lIGF2cHJpdl90ZW1wZmlsZSBmZl90ZW1wZmlsZQogI2RlZmluZSBQVFJESUZGX1NQRUNJRklFUiAiSWQiCiAjZGVmaW5lIFNJWkVfU1BFQ0lGSUVSICJJdSIKICNlbHNlCkBAIC0yNTcsNiArMjY4LDE2IEBACiAjICAgZGVmaW5lIGZmX2Rsb2coY3R4LCAuLi4pIGRvIHsgaWYgKDApIGF2X2xvZyhjdHgsIEFWX0xPR19ERUJVRywgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQogI2VuZGlmCiAKKy8vIEZvciBkZWJ1Z2luZyB3ZSB1c2Ugc2lnbmVkIG9wZXJhdGlvbnMgc28gb3ZlcmZsb3dzIGNhbiBiZSBkZXRlY3RlZCAoYnkgdWJzYW4pCisvLyBGb3IgcHJvZHVjdGlvbiB3ZSB1c2UgdW5zaWduZWQgc28gdGhlcmUgYXJlIG5vIHVuZGVmaW5lZCBvcGVyYXRpb25zCisjaWZkZWYgQ0hFQ0tFRAorI2RlZmluZSBTVUlOVCAgIGludAorI2RlZmluZSBTVUlOVDMyIGludDMyX3QKKyNlbHNlCisjZGVmaW5lIFNVSU5UICAgdW5zaWduZWQKKyNkZWZpbmUgU1VJTlQzMiB1aW50MzJfdAorI2VuZGlmCisKIC8qKgogICogQ2xpcCBhbmQgY29udmVydCBhIGRvdWJsZSB2YWx1ZSBpbnRvIHRoZSBsb25nIGxvbmcgYW1pbi1hbWF4IHJhbmdlLgogICogVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgYmVjYXVzZSBjb252ZXJzaW9uIG9mIGZsb2F0aW5nIHBvaW50IHRvIGludGVnZXJzIHdoZW4KQEAgLTI5NCwzMSArMzE1LDI0IEBACiB9CiAKIC8qKgotICogQ29tcHV0ZSAxMF54IGZvciBmbG9hdGluZyBwb2ludCB2YWx1ZXMuIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgYnkgbm8gbWVhbnMKLSAqICJjb3JyZWN0bHkgcm91bmRlZCIsIGFuZCBpcyBtZWFudCBhcyBhIGZhc3QsIHJlYXNvbmFibHkgYWNjdXJhdGUgYXBwcm94aW1hdGlvbi4KLSAqIEZvciBpbnN0YW5jZSwgbWF4aW11bSByZWxhdGl2ZSBlcnJvciBmb3IgdGhlIGRvdWJsZSBwcmVjaXNpb24gdmFyaWFudCBpcwotICogfiAxZS0xMyBmb3IgdmVyeSBzbWFsbCBhbmQgdmVyeSBsYXJnZSB2YWx1ZXMuCi0gKiBUaGlzIGlzIH4yeCBmYXN0ZXIgdGhhbiBHTlUgbGlibSdzIGFwcHJvYWNoLCB3aGljaCBpcyBzdGlsbCBvZmYgYnkgMnVscCBvbgotICogc29tZSBpbnB1dHMuCi0gKiBAcGFyYW0geCBleHBvbmVudAotICogQHJldHVybiAxMF54Ci0gKi8KLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGRvdWJsZSBmZl9leHAxMChkb3VibGUgeCkKLXsKLSAgICByZXR1cm4gZXhwMihNX0xPRzJfMTAgKiB4KTsKLX0KLQotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgZmxvYXQgZmZfZXhwMTBmKGZsb2F0IHgpCi17Ci0gICAgcmV0dXJuIGV4cDJmKE1fTE9HMl8xMCAqIHgpOwotfQotCi0vKioKICAqIEEgd3JhcHBlciBmb3Igb3BlbigpIHNldHRpbmcgT19DTE9FWEVDLgogICovCiBhdl93YXJuX3VudXNlZF9yZXN1bHQKIGludCBhdnByaXZfb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IGZsYWdzLCAuLi4pOwogCisvKioKKyAqIFdyYXBwZXIgdG8gd29yayBhcm91bmQgdGhlIGxhY2sgb2YgbWtzdGVtcCgpIG9uIG1pbmd3LgorICogQWxzbywgdHJpZXMgdG8gY3JlYXRlIGZpbGUgaW4gL3RtcCBmaXJzdCwgaWYgcG9zc2libGUuCisgKiAqcHJlZml4IGNhbiBiZSBhIGNoYXJhY3RlciBjb25zdGFudDsgKmZpbGVuYW1lIHdpbGwgYmUgYWxsb2NhdGVkIGludGVybmFsbHkuCisgKiBAcmV0dXJuIGZpbGUgZGVzY3JpcHRvciBvZiBvcGVuZWQgZmlsZSAob3IgbmVnYXRpdmUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbgorICogQVZFUlJPUiBjb2RlIG9uIGVycm9yKQorICogYW5kIG9wZW5lZCBmaWxlIG5hbWUgaW4gKipmaWxlbmFtZS4KKyAqIEBub3RlIE9uIHZlcnkgb2xkIGxpYmNzIGl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgYSBzZWN1cmUgdW1hc2sgYmVmb3JlCisgKiAgICAgICBjYWxsaW5nIHRoaXMsIGF2X3RlbXBmaWxlKCkgY2FuJ3QgY2FsbCB1bWFzayBpdHNlbGYgYXMgaXQgaXMgdXNlZCBpbgorICogICAgICAgbGlicmFyaWVzIGFuZCBjb3VsZCBpbnRlcmZlcmUgd2l0aCB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbi4KKyAqLworaW50IGF2cHJpdl90ZW1wZmlsZShjb25zdCBjaGFyICpwcmVmaXgsIGNoYXIgKipmaWxlbmFtZSwgaW50IGxvZ19vZmZzZXQsIHZvaWQgKmxvZ19jdHgpOworCiBpbnQgYXZwcml2X3NldF9zeXN0ZW1hdGljX3BhbDIodWludDMyX3QgcGFsWzI1Nl0sIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKIAogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgYXZfY29uc3QgaW50IGF2cHJpdl9taXJyb3IoaW50IHgsIGludCB3KQpAQCAtMzM2LDYgKzM1MCwyMyBAQAogCiB2b2lkIGZmX2NoZWNrX3BpeGZtdF9kZXNjcmlwdG9ycyh2b2lkKTsKIAotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfcmV2ZXJzZVsyNTZdOworLyoqCisgKiBTZXQgYSBkaWN0aW9uYXJ5IHZhbHVlIHRvIGFuIElTTy04NjAxIGNvbXBsaWFudCB0aW1lc3RhbXAgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzIEFWRm9ybWF0Q29udGV4dAorICogQHBhcmFtIGtleSBtZXRhZGF0YSBrZXkKKyAqIEBwYXJhbSB0aW1lc3RhbXAgdW5peCB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzCisgKiBAcmV0dXJuIDwwIG9uIGVycm9yCisgKi8KK2ludCBhdnByaXZfZGljdF9zZXRfdGltZXN0YW1wKEFWRGljdGlvbmFyeSAqKmRpY3QsIGNvbnN0IGNoYXIgKmtleSwgaW50NjRfdCB0aW1lc3RhbXApOworCisvLyBIZWxwZXIgbWFjcm8gZm9yIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwgZGVwcmVjYXRpb24uIENvZGUgaW5zaWRlIEZGbXBlZworLy8gc2hvdWxkIGFsd2F5cyB1c2UgRkZfUFNFVURPUEFMLiBPbmNlIHRoZSBwdWJsaWMgQVBJIGZsYWcgZ2V0cyByZW1vdmVkLCBhbGwKKy8vIGNvZGUgdXNpbmcgaXQgaXMgZGVhZCBjb2RlLgorI2lmIEZGX0FQSV9QU0VVRE9QQUwKKyNkZWZpbmUgRkZfUFNFVURPUEFMIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwKKyNlbHNlCisjZGVmaW5lIEZGX1BTRVVET1BBTCAwCisjZW5kaWYKIAogI2VuZGlmIC8qIEFWVVRJTF9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvaW50cmVhZHdyaXRlLmggYi9saWJhdnV0aWwvaW50cmVhZHdyaXRlLmgKaW5kZXggNTFmYmUzMC4uNjdjNzYzYiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oCisrKyBiL2xpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaApAQCAtMjE1LDcgKzIxNSw3IEBACiAgKiBieSBwZXItYXJjaCBoZWFkZXJzLgogICovCiAKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1RJX0NPTVBJTEVSX1ZFUlNJT05fXykKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQogCiB1bmlvbiB1bmFsaWduZWRfNjQgeyB1aW50NjRfdCBsOyB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIGF2X2FsaWFzOwogdW5pb24gdW5hbGlnbmVkXzMyIHsgdWludDMyX3QgbDsgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBhdl9hbGlhczsKQEAgLTIyNCw3ICsyMjQsNyBAQAogIyAgIGRlZmluZSBBVl9STihzLCBwKSAoKChjb25zdCB1bmlvbiB1bmFsaWduZWRfIyNzICopIChwKSktPmwpCiAjICAgZGVmaW5lIEFWX1dOKHMsIHAsIHYpICgoKCh1bmlvbiB1bmFsaWduZWRfIyNzICopIChwKSktPmwpID0gKHYpKQogCi0jZWxpZiBkZWZpbmVkKF9fREVDQykKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChkZWZpbmVkKF9NX0FSTSkgfHwgZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fQVJNNjQpKSAmJiBBVl9IQVZFX0ZBU1RfVU5BTElHTkVECiAKICMgICBkZWZpbmUgQVZfUk4ocywgcCkgKCooKGNvbnN0IF9fdW5hbGlnbmVkIHVpbnQjI3MjI190KikocCkpKQogIyAgIGRlZmluZSBBVl9XTihzLCBwLCB2KSAoKigoX191bmFsaWduZWQgdWludCMjcyMjX3QqKShwKSkgPSAodikpCkBAIC0yNDIsOCArMjQyLDggQEAKICAgICAgICgoY29uc3QgdWludDhfdCopKHgpKVsxXSkKICNlbmRpZgogI2lmbmRlZiBBVl9XQjE2Ci0jICAgZGVmaW5lIEFWX1dCMTYocCwgZGFyZykgZG8geyAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVuc2lnbmVkIGQgPSAoZGFyZyk7ICAgICAgICAgICAgICAgICAgICBcCisjICAgZGVmaW5lIEFWX1dCMTYocCwgdmFsKSBkbyB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQxNl90IGQgPSAodmFsKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICgodWludDhfdCopKHApKVsxXSA9IChkKTsgICAgICAgICAgICAgICBcCiAgICAgICAgICgodWludDhfdCopKHApKVswXSA9IChkKT4+ODsgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSgwKQpAQCAtMjU1LDggKzI1NSw4IEBACiAgICAgICAoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMF0pCiAjZW5kaWYKICNpZm5kZWYgQVZfV0wxNgotIyAgIGRlZmluZSBBVl9XTDE2KHAsIGRhcmcpIGRvIHsgICAgICAgICAgICAgICAgXAotICAgICAgICB1bnNpZ25lZCBkID0gKGRhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorIyAgIGRlZmluZSBBVl9XTDE2KHAsIHZhbCkgZG8geyAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MTZfdCBkID0gKHZhbCk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAoZCk7ICAgICAgICAgICAgICAgXAogICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAoZCk+Pjg7ICAgICAgICAgICAgXAogICAgIH0gd2hpbGUoMCkKQEAgLTI3MCw4ICsyNzAsOCBAQAogICAgICAgICAgICAgICAgICgoY29uc3QgdWludDhfdCopKHgpKVszXSkKICNlbmRpZgogI2lmbmRlZiBBVl9XQjMyCi0jICAgZGVmaW5lIEFWX1dCMzIocCwgZGFyZykgZG8geyAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVuc2lnbmVkIGQgPSAoZGFyZyk7ICAgICAgICAgICAgICAgICAgICBcCisjICAgZGVmaW5lIEFWX1dCMzIocCwgdmFsKSBkbyB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGQgPSAodmFsKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICgodWludDhfdCopKHApKVszXSA9IChkKTsgICAgICAgICAgICAgICBcCiAgICAgICAgICgodWludDhfdCopKHApKVsyXSA9IChkKT4+ODsgICAgICAgICAgICBcCiAgICAgICAgICgodWludDhfdCopKHApKVsxXSA9IChkKT4+MTY7ICAgICAgICAgICBcCkBAIC0yODcsOCArMjg3LDggQEAKICAgICAgICAgICAgICAgICAoKGNvbnN0IHVpbnQ4X3QqKSh4KSlbMF0pCiAjZW5kaWYKICNpZm5kZWYgQVZfV0wzMgotIyAgIGRlZmluZSBBVl9XTDMyKHAsIGRhcmcpIGRvIHsgICAgICAgICAgICAgICAgXAotICAgICAgICB1bnNpZ25lZCBkID0gKGRhcmcpOyAgICAgICAgICAgICAgICAgICAgXAorIyAgIGRlZmluZSBBVl9XTDMyKHAsIHZhbCkgZG8geyAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBkID0gKHZhbCk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAoZCk7ICAgICAgICAgICAgICAgXAogICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAoZCk+Pjg7ICAgICAgICAgICAgXAogICAgICAgICAoKHVpbnQ4X3QqKShwKSlbMl0gPSAoZCk+PjE2OyAgICAgICAgICAgXApAQCAtMzA4LDggKzMwOCw4IEBACiAgICAgICAodWludDY0X3QpKChjb25zdCB1aW50OF90KikoeCkpWzddKQogI2VuZGlmCiAjaWZuZGVmIEFWX1dCNjQKLSMgICBkZWZpbmUgQVZfV0I2NChwLCBkYXJnKSBkbyB7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdWludDY0X3QgZCA9IChkYXJnKTsgICAgICAgICAgICAgICAgICAgIFwKKyMgICBkZWZpbmUgQVZfV0I2NChwLCB2YWwpIGRvIHsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDY0X3QgZCA9ICh2YWwpOyAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgKCh1aW50OF90KikocCkpWzddID0gKGQpOyAgICAgICAgICAgICAgIFwKICAgICAgICAgKCh1aW50OF90KikocCkpWzZdID0gKGQpPj44OyAgICAgICAgICAgIFwKICAgICAgICAgKCh1aW50OF90KikocCkpWzVdID0gKGQpPj4xNjsgICAgICAgICAgIFwKQEAgLTMzMyw4ICszMzMsOCBAQAogICAgICAgKHVpbnQ2NF90KSgoY29uc3QgdWludDhfdCopKHgpKVswXSkKICNlbmRpZgogI2lmbmRlZiBBVl9XTDY0Ci0jICAgZGVmaW5lIEFWX1dMNjQocCwgZGFyZykgZG8geyAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVpbnQ2NF90IGQgPSAoZGFyZyk7ICAgICAgICAgICAgICAgICAgICBcCisjICAgZGVmaW5lIEFWX1dMNjQocCwgdmFsKSBkbyB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQ2NF90IGQgPSAodmFsKTsgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICgodWludDhfdCopKHApKVswXSA9IChkKTsgICAgICAgICAgICAgICBcCiAgICAgICAgICgodWludDhfdCopKHApKVsxXSA9IChkKT4+ODsgICAgICAgICAgICBcCiAgICAgICAgICgodWludDhfdCopKHApKVsyXSA9IChkKT4+MTY7ICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvbGZnLmMgYi9saWJhdnV0aWwvbGZnLmMKaW5kZXggZmZhMmYxZi4uNDZiMDRkMiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2xmZy5jCisrKyBiL2xpYmF2dXRpbC9sZmcuYwpAQCAtMjMsNyArMjMsOSBAQAogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlICJsZmcuaCIKKyNpbmNsdWRlICJjcmMuaCIKICNpbmNsdWRlICJtZDUuaCIKKyNpbmNsdWRlICJlcnJvci5oIgogI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgogI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKIApAQCAtNTksNDQgKzYxLDI3IEBACiAgICAgb3V0WzFdID0geDIgKiB3OwogfQogCi0jaWZkZWYgVEVTVAotI2luY2x1ZGUgImxvZy5oIgotI2luY2x1ZGUgInRpbWVyLmgiCitpbnQgYXZfbGZnX2luaXRfZnJvbV9kYXRhKEFWTEZHICpjLCBjb25zdCB1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuZ3RoKSB7CisgICAgdW5zaWduZWQgaW50IGJlZywgZW5kLCBzZWdtOworICAgIGNvbnN0IEFWQ1JDICphdmNyYzsKKyAgICB1aW50MzJfdCBjcmMgPSAxOwogCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCB4ID0gMDsKLSAgICBpbnQgaSwgajsKLSAgICBBVkxGRyBzdGF0ZTsKKyAgICAvKiBhdm9pZCBpbnRlZ2VyIG92ZXJmbG93IGluIHRoZSBsb29wIGJlbG93LiAqLworICAgIGlmIChsZW5ndGggPiAoVUlOVF9NQVggLyAxMjhVKSkgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIAotICAgIGF2X2xmZ19pbml0KCZzdGF0ZSwgMHhkZWFkYmVlZik7Ci0gICAgZm9yIChqID0gMDsgaiA8IDEwMDAwOyBqKyspIHsKLSAgICAgICAgU1RBUlRfVElNRVIKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDYyNDsgaSsrKSB7Ci0gICAgICAgICAgICAvL2F2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlWFxuIiwgYXZfbGZnX2dldCgmc3RhdGUpKTsKLSAgICAgICAgICAgIHggKz0gYXZfbGZnX2dldCgmc3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIFNUT1BfVElNRVIoIjYyNCBjYWxscyBvZiBhdl9sZmdfZ2V0Iik7Ci0gICAgfQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJmaW5hbCB2YWx1ZTolWFxuIiwgeCk7CisgICAgYy0+aW5kZXggPSAwOworICAgIGF2Y3JjID0gYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRSk7IC8qIFRoaXMgY2FuJ3QgZmFpbC4gSXQncyBhIHdlbGwtZGVmaW5lZCB0YWJsZSBpbiBjcmMuYyAqLwogCi0gICAgLyogQk1HIHVzYWdlIGV4YW1wbGUgKi8KLSAgICB7Ci0gICAgICAgIGRvdWJsZSBtZWFuICAgPSAxMDAwOwotICAgICAgICBkb3VibGUgc3RkZGV2ID0gNTM7Ci0KLSAgICAgICAgYXZfbGZnX2luaXQoJnN0YXRlLCA0Mik7Ci0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkgKz0gMikgewotICAgICAgICAgICAgZG91YmxlIGJtZ19vdXRbMl07Ci0gICAgICAgICAgICBhdl9ibWdfZ2V0KCZzdGF0ZSwgYm1nX291dCk7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgICAgIiVmXG4lZlxuIiwKLSAgICAgICAgICAgICAgICAgICBibWdfb3V0WzBdICogc3RkZGV2ICsgbWVhbiwKLSAgICAgICAgICAgICAgICAgICBibWdfb3V0WzFdICogc3RkZGV2ICsgbWVhbik7Ci0gICAgICAgIH0KKyAgICAvKiBhY3Jvc3MgNjQgc2VnbWVudHMgb2YgdGhlIGluY29taW5nIGRhdGEsCisgICAgICogZG8gYSBydW5uaW5nIGNyYyBvZiBlYWNoIHNlZ21lbnQgYW5kIHN0b3JlIHRoZSBjcmMgYXMgdGhlIHN0YXRlIGZvciB0aGF0IHNsb3QuCisgICAgICogdGhpcyB3b3JrcyBldmVuIGlmIHRoZSBsZW5ndGggb2YgdGhlIHNlZ21lbnQgaXMgMCBieXRlcy4gKi8KKyAgICBiZWcgPSAwOworICAgIGZvciAoc2VnbSA9IDA7c2VnbSA8IDY0O3NlZ20rKykgeworICAgICAgICBlbmQgPSAoKChzZWdtICsgMSkgKiBsZW5ndGgpIC8gNjQpOworICAgICAgICBjcmMgPSBhdl9jcmMoYXZjcmMsIGNyYywgZGF0YSArIGJlZywgZW5kIC0gYmVnKTsKKyAgICAgICAgYy0+c3RhdGVbc2VnbV0gPSAodW5zaWduZWQgaW50KWNyYzsKKyAgICAgICAgYmVnID0gZW5kOwogICAgIH0KIAogICAgIHJldHVybiAwOwogfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvbGZnLmggYi9saWJhdnV0aWwvbGZnLmgKaW5kZXggZWM5MDU2Mi4uMDNmNzc5YSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2xmZy5oCisrKyBiL2xpYmF2dXRpbC9sZmcuaApAQCAtMjIsNiArMjIsOCBAQAogI2lmbmRlZiBBVlVUSUxfTEZHX0gKICNkZWZpbmUgQVZVVElMX0xGR19ICiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKwogdHlwZWRlZiBzdHJ1Y3QgQVZMRkcgewogICAgIHVuc2lnbmVkIGludCBzdGF0ZVs2NF07CiAgICAgaW50IGluZGV4OwpAQCAtMzAsNiArMzIsMTMgQEAKIHZvaWQgYXZfbGZnX2luaXQoQVZMRkcgKmMsIHVuc2lnbmVkIGludCBzZWVkKTsKIAogLyoqCisgKiBTZWVkIHRoZSBzdGF0ZSBvZiB0aGUgQUxGRyB1c2luZyBiaW5hcnkgZGF0YS4KKyAqCisgKiBSZXR1cm4gdmFsdWU6IDAgb24gc3VjY2VzcywgbmVnYXRpdmUgdmFsdWUgKEFWRVJST1IpIG9uIGZhaWx1cmUuCisgKi8KK2ludCBhdl9sZmdfaW5pdF9mcm9tX2RhdGEoQVZMRkcgKmMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBsZW5ndGgpOworCisvKioKICAqIEdldCB0aGUgbmV4dCByYW5kb20gdW5zaWduZWQgMzItYml0IG51bWJlciB1c2luZyBhbiBBTEZHLgogICoKICAqIFBsZWFzZSBhbHNvIGNvbnNpZGVyIGEgc2ltcGxlIExDRyBsaWtlIHN0YXRlPSBzdGF0ZSoxNjY0NTI1KzEwMTM5MDQyMjMsCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvbGliYXZ1dGlsLnYgYi9saWJhdnV0aWwvbGliYXZ1dGlsLnYKaW5kZXggZTlmMDRjYi4uZmIxNzA1OCAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2xpYmF2dXRpbC52CisrKyBiL2xpYmF2dXRpbC9saWJhdnV0aWwudgpAQCAtMSw0ICsxLDYgQEAKLUxJQkFWVVRJTF8kTUFKT1IgewotICAgICAgICBnbG9iYWw6IGF2KjsKLSAgICAgICAgbG9jYWw6ICo7CitMSUJBVlVUSUxfTUFKT1IgeworICAgIGdsb2JhbDoKKyAgICAgICAgYXYqOworICAgIGxvY2FsOgorICAgICAgICAqOwogfTsKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9sbHMuYyBiL2xpYmF2dXRpbC9sbHMuYwppbmRleCA3ZGQ3MThkLi4wNTYwYjZhIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvbGxzLmMKKysrIGIvbGliYXZ1dGlsL2xscy5jCkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCi0jaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAjaW5jbHVkZSAibGxzLmgiCkBAIC0xMjIsNDEgKzEyMSwzIEBACiAgICAgaWYgKEFSQ0hfWDg2KQogICAgICAgICBmZl9pbml0X2xsc194ODYobSk7CiB9Ci0KLSNpZmRlZiBURVNUCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgImxmZy5oIgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIExMU01vZGVsIG07Ci0gICAgaW50IGksIG9yZGVyOwotICAgIEFWTEZHIGxmZzsKLQotICAgIGF2X2xmZ19pbml0KCZsZmcsIDEpOwotICAgIGF2cHJpdl9pbml0X2xscygmbSwgMyk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLSAgICAgICAgTE9DQUxfQUxJR05FRCgzMiwgZG91YmxlLCB2YXIsIFs0XSk7Ci0gICAgICAgIGRvdWJsZSBldmFsOwotCi0gICAgICAgIHZhclswXSA9IChhdl9sZmdfZ2V0KCZsZmcpIC8gKGRvdWJsZSkgVUlOVF9NQVggLSAwLjUpICogMjsKLSAgICAgICAgdmFyWzFdID0gdmFyWzBdICsgYXZfbGZnX2dldCgmbGZnKSAvIChkb3VibGUpIFVJTlRfTUFYIC0gMC41OwotICAgICAgICB2YXJbMl0gPSB2YXJbMV0gKyBhdl9sZmdfZ2V0KCZsZmcpIC8gKGRvdWJsZSkgVUlOVF9NQVggLSAwLjU7Ci0gICAgICAgIHZhclszXSA9IHZhclsyXSArIGF2X2xmZ19nZXQoJmxmZykgLyAoZG91YmxlKSBVSU5UX01BWCAtIDAuNTsKLSAgICAgICAgbS51cGRhdGVfbGxzKCZtLCB2YXIpOwotICAgICAgICBhdnByaXZfc29sdmVfbGxzKCZtLCAwLjAwMSwgMCk7Ci0gICAgICAgIGZvciAob3JkZXIgPSAwOyBvcmRlciA8IDM7IG9yZGVyKyspIHsKLSAgICAgICAgICAgIGV2YWwgPSBtLmV2YWx1YXRlX2xscygmbSwgdmFyICsgMSwgb3JkZXIpOwotICAgICAgICAgICAgcHJpbnRmKCJyZWFsOiU5ZiBvcmRlcjolZCBwcmVkOiU5ZiB2YXI6JWYgY29lZmZzOiVmICU5ZiAlOWZcbiIsCi0gICAgICAgICAgICAgICAgICAgdmFyWzBdLCBvcmRlciwgZXZhbCwgc3FydChtLnZhcmlhbmNlW29yZGVyXSAvIChpICsgMSkpLAotICAgICAgICAgICAgICAgICAgIG0uY29lZmZbb3JkZXJdWzBdLCBtLmNvZWZmW29yZGVyXVsxXSwKLSAgICAgICAgICAgICAgICAgICBtLmNvZWZmW29yZGVyXVsyXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL2xvZy5jIGIvbGliYXZ1dGlsL2xvZy5jCmluZGV4IDQ1ODM1MTkuLjliN2Q0ODQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9sb2cuYworKysgYi9saWJhdnV0aWwvbG9nLmMKQEAgLTM5LDExICszOSw5IEBACiAjaW5jbHVkZSAiY29tbW9uLmgiCiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsb2cuaCIKKyNpbmNsdWRlICJ0aHJlYWQuaCIKIAotI2lmIEhBVkVfUFRIUkVBRFMKLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci1zdGF0aWMgcHRocmVhZF9tdXRleF90IG11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKLSNlbmRpZgorc3RhdGljIEFWTXV0ZXggbXV0ZXggPSBBVl9NVVRFWF9JTklUSUFMSVpFUjsKIAogI2RlZmluZSBMSU5FX1NaIDEwMjQKIApAQCAtNTcsNyArNTUsNyBAQAogc3RhdGljIGludCBmbGFnczsKIAogI2RlZmluZSBOQl9MRVZFTFMgOAotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJDRV9fKSAmJiBIQVZFX1NFVENPTlNPTEVURVhUQVRUUklCVVRFCisjaWYgZGVmaW5lZChfV0lOMzIpICYmIEhBVkVfU0VUQ09OU09MRVRFWFRBVFRSSUJVVEUKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiBzdGF0aWMgY29uc3QgdWludDhfdCBjb2xvclsxNiArIEFWX0NMQVNTX0NBVEVHT1JZX05CXSA9IHsKICAgICBbQVZfTE9HX1BBTklDICAvOF0gPSAxMiwKQEAgLTEyNCw3ICsxMjIsNyBAQAogCiBzdGF0aWMgdm9pZCBjaGVja19jb2xvcl90ZXJtaW5hbCh2b2lkKQogewotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJDRV9fKSAmJiBIQVZFX1NFVENPTlNPTEVURVhUQVRUUklCVVRFCisjaWYgZGVmaW5lZChfV0lOMzIpICYmIEhBVkVfU0VUQ09OU09MRVRFWFRBVFRSSUJVVEUKICAgICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBjb25faW5mbzsKICAgICBjb24gPSBHZXRTdGRIYW5kbGUoU1REX0VSUk9SX0hBTkRMRSk7CiAgICAgdXNlX2NvbG9yID0gKGNvbiAhPSBJTlZBTElEX0hBTkRMRV9WQUxVRSkgJiYgIWdldGVudigiTk9fQ09MT1IiKSAmJgpAQCAtMTU5LDcgKzE1Nyw3IEBACiAgICAgaWYgKGxldmVsID09IEFWX0xPR19JTkZPLzgpIGxvY2FsX3VzZV9jb2xvciA9IDA7CiAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3VzZV9jb2xvciA9IHVzZV9jb2xvcjsKIAotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJDRV9fKSAmJiBIQVZFX1NFVENPTlNPTEVURVhUQVRUUklCVVRFCisjaWYgZGVmaW5lZChfV0lOMzIpICYmIEhBVkVfU0VUQ09OU09MRVRFWFRBVFRSSUJVVEUKICAgICBpZiAobG9jYWxfdXNlX2NvbG9yKQogICAgICAgICBTZXRDb25zb2xlVGV4dEF0dHJpYnV0ZShjb24sIGJhY2tncm91bmQgfCBjb2xvcltsZXZlbF0pOwogICAgIGZwdXRzKHN0ciwgc3RkZXJyKTsKQEAgLTE2OCwxOSArMTY2LDE5IEBACiAjZWxzZQogICAgIGlmIChsb2NhbF91c2VfY29sb3IgPT0gMSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwKLSAgICAgICAgICAgICAgICAiXDAzM1slZDszJWRtJXNcMDMzWzBtIiwKKyAgICAgICAgICAgICAgICAiXDAzM1slIlBSSXUzMiI7MyUiUFJJdTMyIm0lc1wwMzNbMG0iLAogICAgICAgICAgICAgICAgIChjb2xvcltsZXZlbF0gPj4gNCkgJiAxNSwKICAgICAgICAgICAgICAgICBjb2xvcltsZXZlbF0gJiAxNSwKICAgICAgICAgICAgICAgICBzdHIpOwogICAgIH0gZWxzZSBpZiAodGludCAmJiB1c2VfY29sb3IgPT0gMjU2KSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLAotICAgICAgICAgICAgICAgICJcMDMzWzQ4OzU7JWRtXDAzM1szODs1OyVkbSVzXDAzM1swbSIsCisgICAgICAgICAgICAgICAgIlwwMzNbNDg7NTslIlBSSXUzMiJtXDAzM1szODs1OyVkbSVzXDAzM1swbSIsCiAgICAgICAgICAgICAgICAgKGNvbG9yW2xldmVsXSA+PiAxNikgJiAweGZmLAogICAgICAgICAgICAgICAgIHRpbnQsCiAgICAgICAgICAgICAgICAgc3RyKTsKICAgICB9IGVsc2UgaWYgKGxvY2FsX3VzZV9jb2xvciA9PSAyNTYpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgIlwwMzNbNDg7NTslZG1cMDMzWzM4OzU7JWRtJXNcMDMzWzBtIiwKKyAgICAgICAgICAgICAgICAiXDAzM1s0ODs1OyUiUFJJdTMyIm1cMDMzWzM4OzU7JSJQUkl1MzIibSVzXDAzM1swbSIsCiAgICAgICAgICAgICAgICAgKGNvbG9yW2xldmVsXSA+PiAxNikgJiAweGZmLAogICAgICAgICAgICAgICAgIChjb2xvcltsZXZlbF0gPj4gOCkgJiAweGZmLAogICAgICAgICAgICAgICAgIHN0cik7CkBAIC0yNjgsMTEgKzI2NiwxMSBAQAogICAgICAgICBhdl9icHJpbnRmKHBhcnQrMSwgIlslcyBAICVwXSAiLAogICAgICAgICAgICAgICAgICBhdmMtPml0ZW1fbmFtZShhdmNsKSwgYXZjbCk7CiAgICAgICAgIGlmKHR5cGUpIHR5cGVbMV0gPSBnZXRfY2F0ZWdvcnkoYXZjbCk7Ci0KLSAgICAgICAgaWYgKGZsYWdzICYgQVZfTE9HX1BSSU5UX0xFVkVMKQotICAgICAgICAgICAgYXZfYnByaW50ZihwYXJ0KzIsICJbJXNdICIsIGdldF9sZXZlbF9zdHIobGV2ZWwpKTsKICAgICB9CiAKKyAgICBpZiAoKnByaW50X3ByZWZpeCAmJiAobGV2ZWwgPiBBVl9MT0dfUVVJRVQpICYmIChmbGFncyAmIEFWX0xPR19QUklOVF9MRVZFTCkpCisgICAgICAgIGF2X2JwcmludGYocGFydCsyLCAiWyVzXSAiLCBnZXRfbGV2ZWxfc3RyKGxldmVsKSk7CisKICAgICBhdl92YnByaW50ZihwYXJ0KzMsIGZtdCwgdmwpOwogCiAgICAgaWYoKnBhcnRbMF0uc3RyIHx8ICpwYXJ0WzFdLnN0ciB8fCAqcGFydFsyXS5zdHIgfHwgKnBhcnRbM10uc3RyKSB7CkBAIC0yODQsMTAgKzI4MiwxOSBAQAogdm9pZCBhdl9sb2dfZm9ybWF0X2xpbmUodm9pZCAqcHRyLCBpbnQgbGV2ZWwsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2bCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmxpbmUsIGludCBsaW5lX3NpemUsIGludCAqcHJpbnRfcHJlZml4KQogeworICAgIGF2X2xvZ19mb3JtYXRfbGluZTIocHRyLCBsZXZlbCwgZm10LCB2bCwgbGluZSwgbGluZV9zaXplLCBwcmludF9wcmVmaXgpOworfQorCitpbnQgYXZfbG9nX2Zvcm1hdF9saW5lMih2b2lkICpwdHIsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZsLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbGluZSwgaW50IGxpbmVfc2l6ZSwgaW50ICpwcmludF9wcmVmaXgpCit7CiAgICAgQVZCUHJpbnQgcGFydFs0XTsKKyAgICBpbnQgcmV0OworCiAgICAgZm9ybWF0X2xpbmUocHRyLCBsZXZlbCwgZm10LCB2bCwgcGFydCwgcHJpbnRfcHJlZml4LCBOVUxMKTsKLSAgICBzbnByaW50ZihsaW5lLCBsaW5lX3NpemUsICIlcyVzJXMlcyIsIHBhcnRbMF0uc3RyLCBwYXJ0WzFdLnN0ciwgcGFydFsyXS5zdHIsIHBhcnRbM10uc3RyKTsKKyAgICByZXQgPSBzbnByaW50ZihsaW5lLCBsaW5lX3NpemUsICIlcyVzJXMlcyIsIHBhcnRbMF0uc3RyLCBwYXJ0WzFdLnN0ciwgcGFydFsyXS5zdHIsIHBhcnRbM10uc3RyKTsKICAgICBhdl9icHJpbnRfZmluYWxpemUocGFydCszLCBOVUxMKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiB2b2lkIGF2X2xvZ19kZWZhdWx0X2NhbGxiYWNrKHZvaWQqIHB0ciwgaW50IGxldmVsLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgdmwpCkBAIC0zMDgsOSArMzE1LDcgQEAKIAogICAgIGlmIChsZXZlbCA+IGF2X2xvZ19sZXZlbCkKICAgICAgICAgcmV0dXJuOwotI2lmIEhBVkVfUFRIUkVBRFMKLSAgICBwdGhyZWFkX211dGV4X2xvY2soJm11dGV4KTsKLSNlbmRpZgorICAgIGZmX211dGV4X2xvY2soJm11dGV4KTsKIAogICAgIGZvcm1hdF9saW5lKHB0ciwgbGV2ZWwsIGZtdCwgdmwsIHBhcnQsICZwcmludF9wcmVmaXgsIHR5cGUpOwogICAgIHNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwgIiVzJXMlcyVzIiwgcGFydFswXS5zdHIsIHBhcnRbMV0uc3RyLCBwYXJ0WzJdLnN0ciwgcGFydFszXS5zdHIpOwpAQCAtMzQ3LDkgKzM1Miw3IEBACiAjZW5kaWYKIGVuZDoKICAgICBhdl9icHJpbnRfZmluYWxpemUocGFydCszLCBOVUxMKTsKLSNpZiBIQVZFX1BUSFJFQURTCi0gICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKLSNlbmRpZgorICAgIGZmX211dGV4X3VubG9jaygmbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZCAoKmF2X2xvZ19jYWxsYmFjaykodm9pZCosIGludCwgY29uc3QgY2hhciosIHZhX2xpc3QpID0KQEAgLTQzMCwyNiArNDMzLDMgQEAKICAgICBtaXNzaW5nX2ZlYXR1cmVfc2FtcGxlKDAsIGF2YywgbXNnLCBhcmd1bWVudF9saXN0KTsKICAgICB2YV9lbmQoYXJndW1lbnRfbGlzdCk7CiB9Ci0KLSNpZmRlZiBURVNUCi0vLyBMQ09WX0VYQ0xfU1RBUlQKLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCBpOwotICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKLSAgICBmb3IgKHVzZV9jb2xvcj0wOyB1c2VfY29sb3I8PTI1NjsgdXNlX2NvbG9yID0gMjU1KnVzZV9jb2xvcisxKSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRkFUQUwsICJ1c2VfY29sb3I6ICVkXG4iLCB1c2VfY29sb3IpOwotICAgICAgICBmb3IgKGkgPSBBVl9MT0dfREVCVUc7IGk+PUFWX0xPR19RVUlFVDsgaS09OCkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIGksICIgJWQiLCBpKTsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImUgIik7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgaSArIDI1NioxMjMsICJDJWQiLCBpKTsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImUiKTsKLSAgICAgICAgfQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1BBTklDLCAiXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0vLyBMQ09WX0VYQ0xfU1RPUAotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvbG9nLmggYi9saWJhdnV0aWwvbG9nLmgKaW5kZXggMzIxNzQ4Yy4uZDk1NTRlNiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL2xvZy5oCisrKyBiL2xpYmF2dXRpbC9sb2cuaApAQCAtNDQsNyArNDQsNyBAQAogICAgIEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9BVURJT19JTlBVVCwKICAgICBBVl9DTEFTU19DQVRFR09SWV9ERVZJQ0VfT1VUUFVULAogICAgIEFWX0NMQVNTX0NBVEVHT1JZX0RFVklDRV9JTlBVVCwKLSAgICBBVl9DTEFTU19DQVRFR09SWV9OQiwgLy8vPCBub3QgcGFydCBvZiBBQkkvQVBJCisgICAgQVZfQ0xBU1NfQ0FURUdPUllfTkIgIC8vLzwgbm90IHBhcnQgb2YgQUJJL0FQSQogfUFWQ2xhc3NDYXRlZ29yeTsKIAogI2RlZmluZSBBVl9JU19JTlBVVF9ERVZJQ0UoY2F0ZWdvcnkpIFwKQEAgLTMxNywxOSArMzE3LDIyIEBACiB2b2lkIGF2X2xvZ19mb3JtYXRfbGluZSh2b2lkICpwdHIsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZsLAogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqbGluZSwgaW50IGxpbmVfc2l6ZSwgaW50ICpwcmludF9wcmVmaXgpOwogCi0jaWYgRkZfQVBJX0RMT0cKIC8qKgotICogYXZfZGxvZyBtYWNyb3MKLSAqIEBkZXByZWNhdGVkIHVudXNlZAotICogVXNlZnVsIHRvIHByaW50IGRlYnVnIG1lc3NhZ2VzIHRoYXQgc2hvdWxkbid0IGdldCBjb21waWxlZCBpbiBub3JtYWxseS4KKyAqIEZvcm1hdCBhIGxpbmUgb2YgbG9nIHRoZSBzYW1lIHdheSBhcyB0aGUgZGVmYXVsdCBjYWxsYmFjay4KKyAqIEBwYXJhbSBsaW5lICAgICAgICAgIGJ1ZmZlciB0byByZWNlaXZlIHRoZSBmb3JtYXR0ZWQgbGluZTsKKyAqICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBOVUxMIGlmIGxpbmVfc2l6ZSBpcyAwCisgKiBAcGFyYW0gbGluZV9zaXplICAgICBzaXplIG9mIHRoZSBidWZmZXI7IGF0IG1vc3QgbGluZV9zaXplLTEgY2hhcmFjdGVycyB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIsIHBsdXMgb25lIG51bGwgdGVybWluYXRvcgorICogQHBhcmFtIHByaW50X3ByZWZpeCAgdXNlZCB0byBzdG9yZSB3aGV0aGVyIHRoZSBwcmVmaXggbXVzdCBiZSBwcmludGVkOworICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBwb2ludCB0byBhIHBlcnNpc3RlbnQgaW50ZWdlciBpbml0aWFsbHkgc2V0IHRvIDEKKyAqIEByZXR1cm4gUmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBvdGhlcndpc2UgcmV0dXJucworICogICAgICAgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB3b3VsZCBoYXZlIGJlZW4gd3JpdHRlbiBmb3IgYQorICogICAgICAgICBzdWZmaWNpZW50bHkgbGFyZ2UgYnVmZmVyLCBub3QgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsCisgKiAgICAgICAgIGNoYXJhY3Rlci4gSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgbGVzcyB0aGFuIGxpbmVfc2l6ZSwgaXQgbWVhbnMKKyAqICAgICAgICAgdGhhdCB0aGUgbG9nIG1lc3NhZ2Ugd2FzIHRydW5jYXRlZCB0byBmaXQgdGhlIGJ1ZmZlci4KICAqLwotCi0jaWZkZWYgREVCVUcKLSMgICAgZGVmaW5lIGF2X2Rsb2cocGN0eCwgLi4uKSBhdl9sb2cocGN0eCwgQVZfTE9HX0RFQlVHLCBfX1ZBX0FSR1NfXykKLSNlbHNlCi0jICAgIGRlZmluZSBhdl9kbG9nKHBjdHgsIC4uLikgZG8geyBpZiAoMCkgYXZfbG9nKHBjdHgsIEFWX0xPR19ERUJVRywgX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQotI2VuZGlmCi0jZW5kaWYgLyogRkZfQVBJX0RMT0cgKi8KK2ludCBhdl9sb2dfZm9ybWF0X2xpbmUyKHZvaWQgKnB0ciwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmwsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpsaW5lLCBpbnQgbGluZV9zaXplLCBpbnQgKnByaW50X3ByZWZpeCk7CiAKIC8qKgogICogU2tpcCByZXBlYXRlZCBtZXNzYWdlcywgdGhpcyByZXF1aXJlcyB0aGUgdXNlciBhcHAgdG8gdXNlIGF2X2xvZygpIGluc3RlYWQgb2YKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9sem8uYyBiL2xpYmF2dXRpbC9sem8uYwppbmRleCBiY2ExMGVjLi4xYWUwNzZlIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvbHpvLmMKKysrIGIvbGliYXZ1dGlsL2x6by5jCkBAIC0yMDMsNTggKzIwMywzIEBACiAgICAgKm91dGxlbiA9IGMub3V0X2VuZCAtIGMub3V0OwogICAgIHJldHVybiBjLmVycm9yOwogfQotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8bHpvL2x6bzF4Lmg+Ci0jaW5jbHVkZSAibG9nLmgiCi0jZGVmaW5lIE1BWFNaICgxMCoxMDI0KjEwMjQpCi0KLS8qIERlZmluZSBvbmUgb2YgdGhlc2UgdG8gMSBpZiB5b3Ugd2lzaCB0byBiZW5jaG1hcmsgbGlibHpvCi0gKiBpbnN0ZWFkIG9mIG91ciBuYXRpdmUgaW1wbGVtZW50YXRpb24uICovCi0jZGVmaW5lIEJFTkNITUFSS19MSUJMWk9fU0FGRSAgIDAKLSNkZWZpbmUgQkVOQ0hNQVJLX0xJQkxaT19VTlNBRkUgMAotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7Ci0gICAgRklMRSAqaW4gPSBmb3Blbihhcmd2WzFdLCAicmIiKTsKLSAgICBpbnQgY29tcF9sZXZlbCA9IGFyZ2MgPiAyID8gYXRvaShhcmd2WzJdKSA6IDA7Ci0gICAgdWludDhfdCAqb3JpZyA9IGF2X21hbGxvYyhNQVhTWiArIDE2KTsKLSAgICB1aW50OF90ICpjb21wID0gYXZfbWFsbG9jKDIqTUFYU1ogKyAxNik7Ci0gICAgdWludDhfdCAqZGVjb21wID0gYXZfbWFsbG9jKE1BWFNaICsgMTYpOwotICAgIHNpemVfdCBzID0gZnJlYWQob3JpZywgMSwgTUFYU1osIGluKTsKLSAgICBsem9fdWludCBjbGVuID0gMDsKLSAgICBsb25nIHRtcFtMWk8xWF9NRU1fQ09NUFJFU1NdOwotICAgIGludCBpbmxlbiwgb3V0bGVuOwotICAgIGludCBpOwotICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKLSAgICBpZiAoY29tcF9sZXZlbCA9PSAwKSB7Ci0gICAgICAgIGx6bzF4XzFfY29tcHJlc3Mob3JpZywgcywgY29tcCwgJmNsZW4sIHRtcCk7Ci0gICAgfSBlbHNlIGlmIChjb21wX2xldmVsID09IDExKSB7Ci0gICAgICAgIGx6bzF4XzFfMTFfY29tcHJlc3Mob3JpZywgcywgY29tcCwgJmNsZW4sIHRtcCk7Ci0gICAgfSBlbHNlIGlmIChjb21wX2xldmVsID09IDEyKSB7Ci0gICAgICAgIGx6bzF4XzFfMTJfY29tcHJlc3Mob3JpZywgcywgY29tcCwgJmNsZW4sIHRtcCk7Ci0gICAgfSBlbHNlIGlmIChjb21wX2xldmVsID09IDE1KSB7Ci0gICAgICAgIGx6bzF4XzFfMTVfY29tcHJlc3Mob3JpZywgcywgY29tcCwgJmNsZW4sIHRtcCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGx6bzF4Xzk5OV9jb21wcmVzcyhvcmlnLCBzLCBjb21wLCAmY2xlbiwgdG1wKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzAwOyBpKyspIHsKLVNUQVJUX1RJTUVSCi0gICAgICAgIGlubGVuID0gY2xlbjsgb3V0bGVuID0gTUFYU1o7Ci0jaWYgQkVOQ0hNQVJLX0xJQkxaT19TQUZFCi0gICAgICAgIGlmIChsem8xeF9kZWNvbXByZXNzX3NhZmUoY29tcCwgaW5sZW4sIGRlY29tcCwgJm91dGxlbiwgTlVMTCkpCi0jZWxpZiBCRU5DSE1BUktfTElCTFpPX1VOU0FGRQotICAgICAgICBpZiAobHpvMXhfZGVjb21wcmVzcyhjb21wLCBpbmxlbiwgZGVjb21wLCAmb3V0bGVuLCBOVUxMKSkKLSNlbHNlCi0gICAgICAgIGlmIChhdl9sem8xeF9kZWNvZGUoZGVjb21wLCAmb3V0bGVuLCBjb21wLCAmaW5sZW4pKQotI2VuZGlmCi0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZGVjb21wcmVzc2lvbiBlcnJvclxuIik7Ci1TVE9QX1RJTUVSKCJsem9kIikKLSAgICB9Ci0gICAgaWYgKG1lbWNtcChvcmlnLCBkZWNvbXAsIHMpKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZGVjb21wcmVzc2lvbiBpbmNvcnJlY3RcbiIpOwotICAgIGVsc2UKLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgImRlY29tcHJlc3Npb24gT0tcbiIpOwotICAgIGZjbG9zZShpbik7Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YS5jIGIvbGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmMKaW5kZXggZTE2ODNlNS4uNjA2OTM0NyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmMKKysrIGIvbGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmMKQEAgLTQxLDMgKzQxLDI2IEBACiAKICAgICByZXR1cm4gKEFWTWFzdGVyaW5nRGlzcGxheU1ldGFkYXRhICopc2lkZV9kYXRhLT5kYXRhOwogfQorCitBVkNvbnRlbnRMaWdodE1ldGFkYXRhICphdl9jb250ZW50X2xpZ2h0X21ldGFkYXRhX2FsbG9jKHNpemVfdCAqc2l6ZSkKK3sKKyAgICBBVkNvbnRlbnRMaWdodE1ldGFkYXRhICptZXRhZGF0YSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWQ29udGVudExpZ2h0TWV0YWRhdGEpKTsKKworICAgIGlmIChzaXplKQorICAgICAgICAqc2l6ZSA9IHNpemVvZigqbWV0YWRhdGEpOworCisgICAgcmV0dXJuIG1ldGFkYXRhOworfQorCitBVkNvbnRlbnRMaWdodE1ldGFkYXRhICphdl9jb250ZW50X2xpZ2h0X21ldGFkYXRhX2NyZWF0ZV9zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUpCit7CisgICAgQVZGcmFtZVNpZGVEYXRhICpzaWRlX2RhdGEgPSBhdl9mcmFtZV9uZXdfc2lkZV9kYXRhKGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9GUkFNRV9EQVRBX0NPTlRFTlRfTElHSFRfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBVkNvbnRlbnRMaWdodE1ldGFkYXRhKSk7CisgICAgaWYgKCFzaWRlX2RhdGEpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgbWVtc2V0KHNpZGVfZGF0YS0+ZGF0YSwgMCwgc2l6ZW9mKEFWQ29udGVudExpZ2h0TWV0YWRhdGEpKTsKKworICAgIHJldHVybiAoQVZDb250ZW50TGlnaHRNZXRhZGF0YSAqKXNpZGVfZGF0YS0+ZGF0YTsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9tYXN0ZXJpbmdfZGlzcGxheV9tZXRhZGF0YS5oIGIvbGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmgKaW5kZXggOTM2NTMzZi4uYzIzYjA3YyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmgKKysrIGIvbGliYXZ1dGlsL21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhLmgKQEAgLTEsNCArMSw0IEBACi0vKioKKy8qCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTmVpbCBCaXJrYmVjayA8bmVpbC5iaXJrYmVja0BnbWFpbC5jb20+CiAgKgogICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgpAQCAtODYsNCArODYsNDMgQEAKICAqLwogQVZNYXN0ZXJpbmdEaXNwbGF5TWV0YWRhdGEgKmF2X21hc3RlcmluZ19kaXNwbGF5X21ldGFkYXRhX2NyZWF0ZV9zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUpOwogCisvKioKKyAqIENvbnRlbnQgbGlnaHQgbGV2ZWwgbmVlZGVkIGJ5IHRvIHRyYW5zbWl0IEhEUiBvdmVyIEhETUkgKENUQS04NjEuMykuCisgKgorICogVG8gYmUgdXNlZCBhcyBwYXlsb2FkIG9mIGEgQVZGcmFtZVNpZGVEYXRhIG9yIEFWUGFja2V0U2lkZURhdGEgd2l0aCB0aGUKKyAqIGFwcHJvcHJpYXRlIHR5cGUuCisgKgorICogQG5vdGUgVGhlIHN0cnVjdCBzaG91bGQgYmUgYWxsb2NhdGVkIHdpdGggYXZfY29udGVudF9saWdodF9tZXRhZGF0YV9hbGxvYygpCisgKiAgICAgICBhbmQgaXRzIHNpemUgaXMgbm90IGEgcGFydCBvZiB0aGUgcHVibGljIEFCSS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQVZDb250ZW50TGlnaHRNZXRhZGF0YSB7CisgICAgLyoqCisgICAgICogTWF4IGNvbnRlbnQgbGlnaHQgbGV2ZWwgKGNkL21eMikuCisgICAgICovCisgICAgdW5zaWduZWQgTWF4Q0xMOworCisgICAgLyoqCisgICAgICogTWF4IGF2ZXJhZ2UgbGlnaHQgbGV2ZWwgcGVyIGZyYW1lIChjZC9tXjIpLgorICAgICAqLworICAgIHVuc2lnbmVkIE1heEZBTEw7Cit9IEFWQ29udGVudExpZ2h0TWV0YWRhdGE7CisKKy8qKgorICogQWxsb2NhdGUgYW4gQVZDb250ZW50TGlnaHRNZXRhZGF0YSBzdHJ1Y3R1cmUgYW5kIHNldCBpdHMgZmllbGRzIHRvCisgKiBkZWZhdWx0IHZhbHVlcy4gVGhlIHJlc3VsdGluZyBzdHJ1Y3QgY2FuIGJlIGZyZWVkIHVzaW5nIGF2X2ZyZWVwKCkuCisgKgorICogQHJldHVybiBBbiBBVkNvbnRlbnRMaWdodE1ldGFkYXRhIGZpbGxlZCB3aXRoIGRlZmF1bHQgdmFsdWVzIG9yIE5VTEwKKyAqICAgICAgICAgb24gZmFpbHVyZS4KKyAqLworQVZDb250ZW50TGlnaHRNZXRhZGF0YSAqYXZfY29udGVudF9saWdodF9tZXRhZGF0YV9hbGxvYyhzaXplX3QgKnNpemUpOworCisvKioKKyAqIEFsbG9jYXRlIGEgY29tcGxldGUgQVZDb250ZW50TGlnaHRNZXRhZGF0YSBhbmQgYWRkIGl0IHRvIHRoZSBmcmFtZS4KKyAqCisgKiBAcGFyYW0gZnJhbWUgVGhlIGZyYW1lIHdoaWNoIHNpZGUgZGF0YSBpcyBhZGRlZCB0by4KKyAqCisgKiBAcmV0dXJuIFRoZSBBVkNvbnRlbnRMaWdodE1ldGFkYXRhIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgY2FsbGVyLgorICovCitBVkNvbnRlbnRMaWdodE1ldGFkYXRhICphdl9jb250ZW50X2xpZ2h0X21ldGFkYXRhX2NyZWF0ZV9zaWRlX2RhdGEoQVZGcmFtZSAqZnJhbWUpOworCiAjZW5kaWYgLyogQVZVVElMX01BU1RFUklOR19ESVNQTEFZX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9tYXRoZW1hdGljcy5jIGIvbGliYXZ1dGlsL21hdGhlbWF0aWNzLmMKaW5kZXggMjBmZjM3Zi4uMWJmMDQ0YyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL21hdGhlbWF0aWNzLmMKKysrIGIvbGliYXZ1dGlsL21hdGhlbWF0aWNzLmMKQEAgLTExNSwxNSArMTE1LDE1IEBACiAgICAgICAgIGlmICh0MSA+IElOVDY0X01BWCkKICAgICAgICAgICAgIHJldHVybiBJTlQ2NF9NSU47CiAgICAgICAgIHJldHVybiB0MTsKLSAgICB9CiAjZWxzZQorICAgICAgICAvKiByZWZlcmVuY2UgY29kZSBkb2luZyAoYSpiICsgcikgLyBjLCByZXF1aXJlcyBsaWJhdnV0aWwvaW50ZWdlci5oICovCiAgICAgICAgIEFWSW50ZWdlciBhaTsKICAgICAgICAgYWkgPSBhdl9tdWxfaShhdl9pbnQyaShhKSwgYXZfaW50MmkoYikpOwogICAgICAgICBhaSA9IGF2X2FkZF9pKGFpLCBhdl9pbnQyaShyKSk7CiAKICAgICAgICAgcmV0dXJuIGF2X2kyaW50KGF2X2Rpdl9pKGFpLCBhdl9pbnQyaShjKSkpOwotICAgIH0KICNlbmRpZgorICAgIH0KIH0KIAogaW50NjRfdCBhdl9yZXNjYWxlKGludDY0X3QgYSwgaW50NjRfdCBiLCBpbnQ2NF90IGMpCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvbWF0aGVtYXRpY3MuaCBiL2xpYmF2dXRpbC9tYXRoZW1hdGljcy5oCmluZGV4IDU3YzQ0ZjguLjU0OTAxODAgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9tYXRoZW1hdGljcy5oCisrKyBiL2xpYmF2dXRpbC9tYXRoZW1hdGljcy5oCkBAIC0xOCw2ICsxOCwxMiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKy8qKgorICogQGZpbGUKKyAqIEBhZGR0b2dyb3VwIGxhdnVfbWF0aAorICogTWF0aGVtYXRpY2FsIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoIHRpbWVzdGFtcCBhbmQgdGltZSBiYXNlLgorICovCisKICNpZm5kZWYgQVZVVElMX01BVEhFTUFUSUNTX0gKICNkZWZpbmUgQVZVVElMX01BVEhFTUFUSUNTX0gKIApAQCAtNjMsODQgKzY5LDE1NSBAQAogCiAvKioKICAqIEBhZGR0b2dyb3VwIGxhdnVfbWF0aAorICoKICAqIEB7CiAgKi8KIAotCisvKioKKyAqIFJvdW5kaW5nIG1ldGhvZHMuCisgKi8KIGVudW0gQVZSb3VuZGluZyB7CiAgICAgQVZfUk9VTkRfWkVSTyAgICAgPSAwLCAvLy88IFJvdW5kIHRvd2FyZCB6ZXJvLgogICAgIEFWX1JPVU5EX0lORiAgICAgID0gMSwgLy8vPCBSb3VuZCBhd2F5IGZyb20gemVyby4KICAgICBBVl9ST1VORF9ET1dOICAgICA9IDIsIC8vLzwgUm91bmQgdG93YXJkIC1pbmZpbml0eS4KICAgICBBVl9ST1VORF9VUCAgICAgICA9IDMsIC8vLzwgUm91bmQgdG93YXJkICtpbmZpbml0eS4KICAgICBBVl9ST1VORF9ORUFSX0lORiA9IDUsIC8vLzwgUm91bmQgdG8gbmVhcmVzdCBhbmQgaGFsZndheSBjYXNlcyBhd2F5IGZyb20gemVyby4KLSAgICBBVl9ST1VORF9QQVNTX01JTk1BWCA9IDgxOTIsIC8vLzwgRmxhZyB0byBwYXNzIElOVDY0X01JTi9NQVggdGhyb3VnaCBpbnN0ZWFkIG9mIHJlc2NhbGluZywgdGhpcyBhdm9pZHMgc3BlY2lhbCBjYXNlcyBmb3IgQVZfTk9QVFNfVkFMVUUKKyAgICAvKioKKyAgICAgKiBGbGFnIHRlbGxpbmcgcmVzY2FsaW5nIGZ1bmN0aW9ucyB0byBwYXNzIGBJTlQ2NF9NSU5gL2BNQVhgIHRocm91Z2gKKyAgICAgKiB1bmNoYW5nZWQsIGF2b2lkaW5nIHNwZWNpYWwgY2FzZXMgZm9yICNBVl9OT1BUU19WQUxVRS4KKyAgICAgKgorICAgICAqIFVubGlrZSBvdGhlciB2YWx1ZXMgb2YgdGhlIGVudW1lcmF0aW9uIEFWUm91bmRpbmcsIHRoaXMgdmFsdWUgaXMgYQorICAgICAqIGJpdG1hc2sgdGhhdCBtdXN0IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbm90aGVyIHZhbHVlIG9mIHRoZQorICAgICAqIGVudW1lcmF0aW9uIHRocm91Z2ggYSBiaXR3aXNlIE9SLCBpbiBvcmRlciB0byBzZXQgYmVoYXZpb3IgZm9yIG5vcm1hbAorICAgICAqIGNhc2VzLgorICAgICAqCisgICAgICogQGNvZGV7LmN9CisgICAgICogYXZfcmVzY2FsZV9ybmQoMywgMSwgMiwgQVZfUk9VTkRfVVAgfCBBVl9ST1VORF9QQVNTX01JTk1BWCk7CisgICAgICogLy8gUmVzY2FsaW5nIDM6CisgICAgICogLy8gICAgIENhbGN1bGF0aW5nIDMgKiAxIC8gMgorICAgICAqIC8vICAgICAzIC8gMiBpcyByb3VuZGVkIHVwIHRvIDIKKyAgICAgKiAvLyAgICAgPT4gMgorICAgICAqCisgICAgICogYXZfcmVzY2FsZV9ybmQoQVZfTk9QVFNfVkFMVUUsIDEsIDIsIEFWX1JPVU5EX1VQIHwgQVZfUk9VTkRfUEFTU19NSU5NQVgpOworICAgICAqIC8vIFJlc2NhbGluZyBBVl9OT1BUU19WQUxVRToKKyAgICAgKiAvLyAgICAgQVZfTk9QVFNfVkFMVUUgPT0gSU5UNjRfTUlOCisgICAgICogLy8gICAgIEFWX05PUFRTX1ZBTFVFIGlzIHBhc3NlZCB0aHJvdWdoCisgICAgICogLy8gICAgID0+IEFWX05PUFRTX1ZBTFVFCisgICAgICogQGVuZGNvZGUKKyAgICAgKi8KKyAgICBBVl9ST1VORF9QQVNTX01JTk1BWCA9IDgxOTIsCiB9OwogCiAvKioKLSAqIENvbXB1dGUgdGhlIGdyZWF0ZXN0IGNvbW1vbiBkaXZpc29yIG9mIGEgYW5kIGIuCisgKiBDb21wdXRlIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0d28gaW50ZWdlciBvcGVyYW5kcy4KICAqCi0gKiBAcmV0dXJuIGdjZCBvZiBhIGFuZCBiIHVwIHRvIHNpZ247IGlmIGEgPj0gMCBhbmQgYiA+PSAwLCByZXR1cm4gdmFsdWUgaXMgPj0gMDsKKyAqIEBwYXJhbSBhLGIgT3BlcmFuZHMKKyAqIEByZXR1cm4gR0NEIG9mIGEgYW5kIGIgdXAgdG8gc2lnbjsgaWYgYSA+PSAwIGFuZCBiID49IDAsIHJldHVybiB2YWx1ZSBpcyA+PSAwOwogICogaWYgYSA9PSAwIGFuZCBiID09IDAsIHJldHVybnMgMC4KICAqLwogaW50NjRfdCBhdl9jb25zdCBhdl9nY2QoaW50NjRfdCBhLCBpbnQ2NF90IGIpOwogCiAvKioKICAqIFJlc2NhbGUgYSA2NC1iaXQgaW50ZWdlciB3aXRoIHJvdW5kaW5nIHRvIG5lYXJlc3QuCi0gKiBBIHNpbXBsZSBhKmIvYyBpc24ndCBwb3NzaWJsZSBhcyBpdCBjYW4gb3ZlcmZsb3cuCisgKgorICogVGhlIG9wZXJhdGlvbiBpcyBtYXRoZW1hdGljYWxseSBlcXVpdmFsZW50IHRvIGBhICogYiAvIGNgLCBidXQgd3JpdGluZyB0aGF0CisgKiBkaXJlY3RseSBjYW4gb3ZlcmZsb3cuCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGF2X3Jlc2NhbGVfcm5kKCkgd2l0aCAjQVZfUk9VTkRfTkVBUl9JTkYuCisgKgorICogQHNlZSBhdl9yZXNjYWxlX3JuZCgpLCBhdl9yZXNjYWxlX3EoKSwgYXZfcmVzY2FsZV9xX3JuZCgpCiAgKi8KIGludDY0X3QgYXZfcmVzY2FsZShpbnQ2NF90IGEsIGludDY0X3QgYiwgaW50NjRfdCBjKSBhdl9jb25zdDsKIAogLyoqCiAgKiBSZXNjYWxlIGEgNjQtYml0IGludGVnZXIgd2l0aCBzcGVjaWZpZWQgcm91bmRpbmcuCi0gKiBBIHNpbXBsZSBhKmIvYyBpc24ndCBwb3NzaWJsZSBhcyBpdCBjYW4gb3ZlcmZsb3cuCiAgKgotICogQHJldHVybiByZXNjYWxlZCB2YWx1ZSBhLCBvciBpZiBBVl9ST1VORF9QQVNTX01JTk1BWCBpcyBzZXQgYW5kIGEgaXMKLSAqICAgICAgICAgSU5UNjRfTUlOIG9yIElOVDY0X01BWCB0aGVuIGEgaXMgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkLgorICogVGhlIG9wZXJhdGlvbiBpcyBtYXRoZW1hdGljYWxseSBlcXVpdmFsZW50IHRvIGBhICogYiAvIGNgLCBidXQgd3JpdGluZyB0aGF0CisgKiBkaXJlY3RseSBjYW4gb3ZlcmZsb3csIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGRpZmZlcmVudCByb3VuZGluZyBtZXRob2RzLgorICoKKyAqIEBzZWUgYXZfcmVzY2FsZSgpLCBhdl9yZXNjYWxlX3EoKSwgYXZfcmVzY2FsZV9xX3JuZCgpCiAgKi8KLWludDY0X3QgYXZfcmVzY2FsZV9ybmQoaW50NjRfdCBhLCBpbnQ2NF90IGIsIGludDY0X3QgYywgZW51bSBBVlJvdW5kaW5nKSBhdl9jb25zdDsKK2ludDY0X3QgYXZfcmVzY2FsZV9ybmQoaW50NjRfdCBhLCBpbnQ2NF90IGIsIGludDY0X3QgYywgZW51bSBBVlJvdW5kaW5nIHJuZCkgYXZfY29uc3Q7CiAKIC8qKgogICogUmVzY2FsZSBhIDY0LWJpdCBpbnRlZ2VyIGJ5IDIgcmF0aW9uYWwgbnVtYmVycy4KKyAqCisgKiBUaGUgb3BlcmF0aW9uIGlzIG1hdGhlbWF0aWNhbGx5IGVxdWl2YWxlbnQgdG8gYGEgKiBicSAvIGNxYC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gYXZfcmVzY2FsZV9xX3JuZCgpIHdpdGggI0FWX1JPVU5EX05FQVJfSU5GLgorICoKKyAqIEBzZWUgYXZfcmVzY2FsZSgpLCBhdl9yZXNjYWxlX3JuZCgpLCBhdl9yZXNjYWxlX3Ffcm5kKCkKICAqLwogaW50NjRfdCBhdl9yZXNjYWxlX3EoaW50NjRfdCBhLCBBVlJhdGlvbmFsIGJxLCBBVlJhdGlvbmFsIGNxKSBhdl9jb25zdDsKIAogLyoqCiAgKiBSZXNjYWxlIGEgNjQtYml0IGludGVnZXIgYnkgMiByYXRpb25hbCBudW1iZXJzIHdpdGggc3BlY2lmaWVkIHJvdW5kaW5nLgogICoKLSAqIEByZXR1cm4gcmVzY2FsZWQgdmFsdWUgYSwgb3IgaWYgQVZfUk9VTkRfUEFTU19NSU5NQVggaXMgc2V0IGFuZCBhIGlzCi0gKiAgICAgICAgIElOVDY0X01JTiBvciBJTlQ2NF9NQVggdGhlbiBhIGlzIHBhc3NlZCB0aHJvdWdoIHVuY2hhbmdlZC4KKyAqIFRoZSBvcGVyYXRpb24gaXMgbWF0aGVtYXRpY2FsbHkgZXF1aXZhbGVudCB0byBgYSAqIGJxIC8gY3FgLgorICoKKyAqIEBzZWUgYXZfcmVzY2FsZSgpLCBhdl9yZXNjYWxlX3JuZCgpLCBhdl9yZXNjYWxlX3EoKQogICovCiBpbnQ2NF90IGF2X3Jlc2NhbGVfcV9ybmQoaW50NjRfdCBhLCBBVlJhdGlvbmFsIGJxLCBBVlJhdGlvbmFsIGNxLAotICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZSb3VuZGluZykgYXZfY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlJvdW5kaW5nIHJuZCkgYXZfY29uc3Q7CiAKIC8qKgotICogQ29tcGFyZSAyIHRpbWVzdGFtcHMgZWFjaCBpbiBpdHMgb3duIHRpbWViYXNlcy4KLSAqIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZCBpZiBvbmUgb2YgdGhlIHRpbWVzdGFtcHMKLSAqIGlzIG91dHNpZGUgdGhlIGludDY0X3QgcmFuZ2Ugd2hlbiByZXByZXNlbnRlZCBpbiB0aGUgb3RoZXJzIHRpbWViYXNlLgotICogQHJldHVybiAtMSBpZiB0c19hIGlzIGJlZm9yZSB0c19iLCAxIGlmIHRzX2EgaXMgYWZ0ZXIgdHNfYiBvciAwIGlmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIHBvc2l0aW9uCisgKiBDb21wYXJlIHR3byB0aW1lc3RhbXBzIGVhY2ggaW4gaXRzIG93biB0aW1lIGJhc2UuCisgKgorICogQHJldHVybiBPbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIC0gLTEgaWYgYHRzX2FgIGlzIGJlZm9yZSBgdHNfYmAKKyAqICAgICAgICAgLSAxIGlmIGB0c19hYCBpcyBhZnRlciBgdHNfYmAKKyAqICAgICAgICAgLSAwIGlmIHRoZXkgcmVwcmVzZW50IHRoZSBzYW1lIHBvc2l0aW9uCisgKgorICogQHdhcm5pbmcKKyAqIFRoZSByZXN1bHQgb2YgdGhlIGZ1bmN0aW9uIGlzIHVuZGVmaW5lZCBpZiBvbmUgb2YgdGhlIHRpbWVzdGFtcHMgaXMgb3V0c2lkZQorICogdGhlIGBpbnQ2NF90YCByYW5nZSB3aGVuIHJlcHJlc2VudGVkIGluIHRoZSBvdGhlcidzIHRpbWViYXNlLgogICovCiBpbnQgYXZfY29tcGFyZV90cyhpbnQ2NF90IHRzX2EsIEFWUmF0aW9uYWwgdGJfYSwgaW50NjRfdCB0c19iLCBBVlJhdGlvbmFsIHRiX2IpOwogCiAvKioKLSAqIENvbXBhcmUgMiBpbnRlZ2VycyBtb2R1bG8gbW9kLgotICogVGhhdCBpcyB3ZSBjb21wYXJlIGludGVnZXJzIGEgYW5kIGIgZm9yIHdoaWNoIG9ubHkgdGhlIGxlYXN0Ci0gKiBzaWduaWZpY2FudCBsb2cyKG1vZCkgYml0cyBhcmUga25vd24uCisgKiBDb21wYXJlIHRoZSByZW1haW5kZXJzIG9mIHR3byBpbnRlZ2VyIG9wZXJhbmRzIGRpdmlkZWQgYnkgYSBjb21tb24gZGl2aXNvci4KICAqCi0gKiBAcGFyYW0gbW9kIG11c3QgYmUgYSBwb3dlciBvZiAyCi0gKiBAcmV0dXJuIGEgbmVnYXRpdmUgdmFsdWUgaWYgYSBpcyBzbWFsbGVyIHRoYW4gYgotICogICAgICAgICBhIHBvc2l0aXZlIHZhbHVlIGlmIGEgaXMgZ3JlYXRlciB0aGFuIGIKLSAqICAgICAgICAgMCAgICAgICAgICAgICAgICBpZiBhIGVxdWFscyAgICAgICAgICBiCisgKiBJbiBvdGhlciB3b3JkcywgY29tcGFyZSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYGxvZzIobW9kKWAgYml0cyBvZiBpbnRlZ2VycworICogYGFgIGFuZCBgYmAuCisgKgorICogQGNvZGV7LmN9CisgKiBhdl9jb21wYXJlX21vZCgweDExLCAweDAyLCAweDEwKSA8IDAgLy8gc2luY2UgMHgxMSAlIDB4MTAgICgweDEpIDwgMHgwMiAlIDB4MTAgICgweDIpCisgKiBhdl9jb21wYXJlX21vZCgweDExLCAweDAyLCAweDIwKSA+IDAgLy8gc2luY2UgMHgxMSAlIDB4MjAgKDB4MTEpID4gMHgwMiAlIDB4MjAgKDB4MDIpCisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbSBhLGIgT3BlcmFuZHMKKyAqIEBwYXJhbSBtb2QgRGl2aXNvcjsgbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAqIEByZXR1cm4KKyAqICAgICAgICAgLSBhIG5lZ2F0aXZlIHZhbHVlIGlmIGBhICUgbW9kIDwgYiAlIG1vZGAKKyAqICAgICAgICAgLSBhIHBvc2l0aXZlIHZhbHVlIGlmIGBhICUgbW9kID4gYiAlIG1vZGAKKyAqICAgICAgICAgLSB6ZXJvICAgICAgICAgICAgIGlmIGBhICUgbW9kID09IGIgJSBtb2RgCiAgKi8KIGludDY0X3QgYXZfY29tcGFyZV9tb2QodWludDY0X3QgYSwgdWludDY0X3QgYiwgdWludDY0X3QgbW9kKTsKIAogLyoqCiAgKiBSZXNjYWxlIGEgdGltZXN0YW1wIHdoaWxlIHByZXNlcnZpbmcga25vd24gZHVyYXRpb25zLgogICoKLSAqIEBwYXJhbSBpbl90cyBJbnB1dCB0aW1lc3RhbXAKLSAqIEBwYXJhbSBpbl90YiBJbnB1dCB0aW1lYmFzZQotICogQHBhcmFtIGZzX3RiIER1cmF0aW9uIGFuZCAqbGFzdCB0aW1lYmFzZQotICogQHBhcmFtIGR1cmF0aW9uIGR1cmF0aW9uIHRpbGwgdGhlIG5leHQgY2FsbAotICogQHBhcmFtIG91dF90YiBPdXRwdXQgdGltZWJhc2UKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYmUgY2FsbGVkIHBlciBhdWRpbyBwYWNrZXQgdG8gc2NhbGUgdGhlIGlucHV0CisgKiB0aW1lc3RhbXAgdG8gYSBkaWZmZXJlbnQgdGltZSBiYXNlLiBDb21wYXJlZCB0byBhIHNpbXBsZSBhdl9yZXNjYWxlX3EoKQorICogY2FsbCwgdGhpcyBmdW5jdGlvbiBpcyByb2J1c3QgYWdhaW5zdCBwb3NzaWJsZSBpbmNvbnNpc3RlbnQgZnJhbWUgZHVyYXRpb25zLgorICoKKyAqIFRoZSBgbGFzdGAgcGFyYW1ldGVyIGlzIGEgc3RhdGUgdmFyaWFibGUgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBmb3IgYWxsCisgKiBzdWJzZXF1ZW50IGNhbGxzIGZvciB0aGUgc2FtZSBzdHJlYW0uIEZvciB0aGUgZmlyc3QgY2FsbCwgYCpsYXN0YCBzaG91bGQgYmUKKyAqIGluaXRpYWxpemVkIHRvICNBVl9OT1BUU19WQUxVRS4KKyAqCisgKiBAcGFyYW1baW5dICAgICBpbl90YiAgICBJbnB1dCB0aW1lIGJhc2UKKyAqIEBwYXJhbVtpbl0gICAgIGluX3RzICAgIElucHV0IHRpbWVzdGFtcAorICogQHBhcmFtW2luXSAgICAgZnNfdGIgICAgRHVyYXRpb24gdGltZSBiYXNlOyB0eXBpY2FsbHkgdGhpcyBpcyBmaW5lci1ncmFpbmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JlYXRlcikgdGhhbiBgaW5fdGJgIGFuZCBgb3V0X3RiYAorICogQHBhcmFtW2luXSAgICAgZHVyYXRpb24gRHVyYXRpb24gdGlsbCB0aGUgbmV4dCBjYWxsIHRvIHRoaXMgZnVuY3Rpb24gKGkuZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IHBhY2tldC9mcmFtZSkKKyAqIEBwYXJhbVtpbixvdXRdIGxhc3QgICAgIFBvaW50ZXIgdG8gYSB0aW1lc3RhbXAgZXhwcmVzc2VkIGluIHRlcm1zIG9mCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBgZnNfdGJgLCBhY3RpbmcgYXMgYSBzdGF0ZSB2YXJpYWJsZQorICogQHBhcmFtW2luXSAgICAgb3V0X3RiICAgT3V0cHV0IHRpbWViYXNlCisgKiBAcmV0dXJuICAgICAgICBUaW1lc3RhbXAgZXhwcmVzc2VkIGluIHRlcm1zIG9mIGBvdXRfdGJgCisgKgorICogQG5vdGUgSW4gdGhlIGNvbnRleHQgb2YgdGhpcyBmdW5jdGlvbiwgImR1cmF0aW9uIiBpcyBpbiB0ZXJtIG9mIHNhbXBsZXMsIG5vdAorICogICAgICAgc2Vjb25kcy4KICAqLwogaW50NjRfdCBhdl9yZXNjYWxlX2RlbHRhKEFWUmF0aW9uYWwgaW5fdGIsIGludDY0X3QgaW5fdHMsICBBVlJhdGlvbmFsIGZzX3RiLCBpbnQgZHVyYXRpb24sIGludDY0X3QgKmxhc3QsIEFWUmF0aW9uYWwgb3V0X3RiKTsKIApAQCAtMTUwLDE1ICsyMjcsMTUgQEAKICAqIFRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IHdoZW4gdGhlIHNhbWUgdmFsdWUgaXMgcmVwZWF0bHkgYWRkZWQgdGhhdAogICogbm8gYWNjdW11bGF0aW9uIG9mIHJvdW5kaW5nIGVycm9ycyBvY2N1cnMuCiAgKgotICogQHBhcmFtIHRzIElucHV0IHRpbWVzdGFtcAotICogQHBhcmFtIHRzX3RiIElucHV0IHRpbWVzdGFtcCB0aW1lYmFzZQotICogQHBhcmFtIGluYyB2YWx1ZSB0byBhZGQgdG8gdHMKLSAqIEBwYXJhbSBpbmNfdGIgaW5jIHRpbWViYXNlCisgKiBAcGFyYW1baW5dIHRzICAgICBJbnB1dCB0aW1lc3RhbXAKKyAqIEBwYXJhbVtpbl0gdHNfdGIgIElucHV0IHRpbWVzdGFtcCB0aW1lIGJhc2UKKyAqIEBwYXJhbVtpbl0gaW5jICAgIFZhbHVlIHRvIGJlIGFkZGVkCisgKiBAcGFyYW1baW5dIGluY190YiBUaW1lIGJhc2Ugb2YgYGluY2AKICAqLwogaW50NjRfdCBhdl9hZGRfc3RhYmxlKEFWUmF0aW9uYWwgdHNfdGIsIGludDY0X3QgdHMsIEFWUmF0aW9uYWwgaW5jX3RiLCBpbnQ2NF90IGluYyk7CiAKIAotICAgIC8qKgorLyoqCiAgKiBAfQogICovCiAKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9tZDUuYyBiL2xpYmF2dXRpbC9tZDUuYwppbmRleCA4NzZiZDU1Li4zMWU2OTkyIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvbWQ1LmMKKysrIGIvbGliYXZ1dGlsL21kNS5jCkBAIC04LDcgKzgsNyBAQAogICoKICAqIGJhc2VkIG9uIGh0dHA6Ly91YmlxeC5vcmcvbGliY2lmcy9zb3VyY2UvQXV0aC9NRDUuYwogICogICAgICAgICAgZnJvbSBDaHJpc3RvcGhlciBSLiBIZXJ0ZWwgKGNyaEB1YmlxeC5tbi5vcmcpCi0gKiBTaW1wbGlmaWVkLCBjbGVhbmVkIGFuZCBJTU8gcmVkdW5kYW50IGNvbW1lbnRzIHJlbW92ZWQgYnkgbWljaGFlbC4KKyAqIFNpbXBsaWZpZWQsIGNsZWFuZWQgYW5kIElNTyByZWR1bmRhbnQgY29tbWVudHMgcmVtb3ZlZCBieSBNaWNoYWVsLgogICoKICAqIElmIHlvdSB1c2UgZ2NjLCB0aGVuIHZlcnNpb24gNC4xIG9yIGxhdGVyIGFuZCAtZm9taXQtZnJhbWUtcG9pbnRlciBpcwogICogc3Ryb25nbHkgcmVjb21tZW5kZWQuCkBAIC0zMSwxMiArMzEsMTMgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisKICNpbmNsdWRlICJic3dhcC5oIgogI2luY2x1ZGUgImludHJlYWR3cml0ZS5oIgotI2luY2x1ZGUgIm1kNS5oIgogI2luY2x1ZGUgIm1lbS5oIgorI2luY2x1ZGUgIm1kNS5oIgogCi10eXBlZGVmIHN0cnVjdCBBVk1ENXsKK3R5cGVkZWYgc3RydWN0IEFWTUQ1IHsKICAgICB1aW50NjRfdCBsZW47CiAgICAgdWludDhfdCAgYmxvY2tbNjRdOwogICAgIHVpbnQzMl90IEFCQ0RbNF07CkBAIC03OCwyNSArNzksMzEgQEAKICAgICAweGY3NTM3ZTgyLCAweGJkM2FmMjM1LCAweDJhZDdkMmJiLCAweGViODZkMzkxLAogfTsKIAotI2RlZmluZSBDT1JFKGksIGEsIGIsIGMsIGQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0ID0gU1tpID4+IDRdW2kgJiAzXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBDT1JFKGksIGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ICA9IFNbaSA+PiA0XVtpICYgM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBhICs9IFRbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBpZiAoaSA8IDMyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKGkgPCAxNikgYSArPSAoZCBeIChiICYgKGMgXiBkKSkpICArIFhbICAgICAgIGkgICYgMTVdOyAgXAotICAgICAgICAgICAgZWxzZSAgICAgICAgYSArPSAoKGQgJiBiKSB8ICh+ZCAmIGMpKSArIFhbKDEgKyA1KmkpICYgMTVdOyAgXAorICAgICAgICAgICAgaWYgKGkgPCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGEgKz0gKGQgXiAoYiAmIChjIF4gZCkpKSAgKyBBVl9STDMyKFgrKCAgICAgICBpICAmIDE1KSk7XAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGEgKz0gKChkICYgYikgfCAofmQgJiBjKSkgKyBBVl9STDMyKFgrKCgxICsgNSppKSAmIDE1KSk7XAogICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKGkgPCA0OCkgYSArPSAoYiBeIGMgXiBkKSAgICAgICAgICArIFhbKDUgKyAzKmkpICYgMTVdOyAgXAotICAgICAgICAgICAgZWxzZSAgICAgICAgYSArPSAoYyBeIChiIHwgfmQpKSAgICAgICArIFhbKCAgICA3KmkpICYgMTVdOyAgXAorICAgICAgICAgICAgaWYgKGkgPCA0OCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGEgKz0gKGIgXiBjIF4gZCkgICAgICAgICAgKyBBVl9STDMyKFgrKCg1ICsgMyppKSAmIDE1KSk7XAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGEgKz0gKGMgXiAoYiB8IH5kKSkgICAgICAgKyBBVl9STDMyKFgrKCggICAgNyppKSAmIDE1KSk7XAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBhID0gYiArIChhIDw8IHQgfCBhID4+ICgzMiAtIHQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLXN0YXRpYyB2b2lkIGJvZHkodWludDMyX3QgQUJDRFs0XSwgdWludDMyX3QgKnNyYywgaW50IG5ibG9ja3MpCitzdGF0aWMgdm9pZCBib2R5KHVpbnQzMl90IEFCQ0RbNF0sIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IG5ibG9ja3MpCiB7CiAgICAgaW50IGkgYXZfdW51c2VkOwogICAgIGludCBuOwotICAgIHVpbnQzMl90IGEsIGIsIGMsIGQsIHQsICpYOworICAgIGNvbnN0IHVpbnQzMl90ICpYOworICAgIHVpbnQzMl90IGEsIGIsIGMsIGQsIHQ7CiAKICAgICBmb3IgKG4gPSAwOyBuIDwgbmJsb2NrczsgbisrKSB7CiAgICAgICAgIGEgPSBBQkNEWzNdOwpAQCAtMTA0LDEyICsxMTEsNyBAQAogICAgICAgICBjID0gQUJDRFsxXTsKICAgICAgICAgZCA9IEFCQ0RbMF07CiAKLSAgICAgICAgWCA9IHNyYyArIG4gKiAxNjsKLQotI2lmIEhBVkVfQklHRU5ESUFOCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQotICAgICAgICAgICAgWFtpXSA9IGF2X2Jzd2FwMzIoWFtpXSk7Ci0jZW5kaWYKKyAgICAgICAgWCA9IChjb25zdCB1aW50MzJfdCAqKXNyYyArIG4gKiAxNjsKIAogI2lmIENPTkZJR19TTUFMTAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewpAQCAtMTIyLDEwICsxMjQsMTMgQEAKICAgICAgICAgfQogI2Vsc2UKICNkZWZpbmUgQ09SRTIoaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ09SRSggaSwgICBhLGIsYyxkKTsgQ09SRSgoaSsxKSxkLGEsYixjKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ09SRSgoaSsyKSxjLGQsYSxiKTsgQ09SRSgoaSszKSxiLGMsZCxhKQotI2RlZmluZSBDT1JFNChpKSBDT1JFMihpKTsgQ09SRTIoKGkrNCkpOyBDT1JFMigoaSs4KSk7IENPUkUyKChpKzEyKSkKLSAgICAgICAgQ09SRTQoMCk7IENPUkU0KDE2KTsgQ09SRTQoMzIpOyBDT1JFNCg0OCk7CisgICAgICAgIENPUkUoaSwgYSwgYiwgYywgZCk7IENPUkUoKGkgKyAxKSwgZCwgYSwgYiwgYyk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIENPUkUoKGkgKyAyKSwgYywgZCwgYSwgYik7IENPUkUoKGkgKyAzKSwgYiwgYywgZCwgYSkKKyNkZWZpbmUgQ09SRTQoaSkgQ09SRTIoaSk7IENPUkUyKChpICsgNCkpOyBDT1JFMigoaSArIDgpKTsgQ09SRTIoKGkgKyAxMikpCisgICAgICAgIENPUkU0KDApOworICAgICAgICBDT1JFNCgxNik7CisgICAgICAgIENPUkU0KDMyKTsKKyAgICAgICAgQ09SRTQoNDgpOwogI2VuZGlmCiAKICAgICAgICAgQUJDRFswXSArPSBkOwpAQCAtMTQ1LDEyICsxNTAsMTYgQEAKICAgICBjdHgtPkFCQ0RbM10gPSAweDY3NDUyMzAxOwogfQogCisjaWYgRkZfQVBJX0NSWVBUT19TSVpFX1QKIHZvaWQgYXZfbWQ1X3VwZGF0ZShBVk1ENSAqY3R4LCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4pCisjZWxzZQordm9pZCBhdl9tZDVfdXBkYXRlKEFWTUQ1ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IGxlbikKKyNlbmRpZgogewogICAgIGNvbnN0IHVpbnQ4X3QgKmVuZDsKICAgICBpbnQgajsKIAotICAgIGogPSBjdHgtPmxlbiAmIDYzOworICAgIGogICAgICAgICA9IGN0eC0+bGVuICYgNjM7CiAgICAgY3R4LT5sZW4gKz0gbGVuOwogCiAgICAgaWYgKGopIHsKQEAgLTE2MCwxOSArMTY5LDE5IEBACiAgICAgICAgIGxlbiAtPSBjbnQ7CiAgICAgICAgIGlmIChqICsgY250IDwgNjQpCiAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGJvZHkoY3R4LT5BQkNELCAodWludDMyX3QgKiljdHgtPmJsb2NrLCAxKTsKKyAgICAgICAgYm9keShjdHgtPkFCQ0QsIGN0eC0+YmxvY2ssIDEpOwogICAgIH0KIAogICAgIGVuZCA9IHNyYyArIChsZW4gJiB+NjMpOwotICAgIGlmIChIQVZFX0JJR0VORElBTiB8fCAoIUhBVkVfRkFTVF9VTkFMSUdORUQgJiYgKChpbnRwdHJfdClzcmMgJiAzKSkpIHsKKyAgICBpZiAoIUhBVkVfRkFTVF9VTkFMSUdORUQgJiYgKChpbnRwdHJfdClzcmMgJiAzKSkgewogICAgICAgIHdoaWxlIChzcmMgPCBlbmQpIHsKICAgICAgICAgICAgbWVtY3B5KGN0eC0+YmxvY2ssIHNyYywgNjQpOwotICAgICAgICAgICBib2R5KGN0eC0+QUJDRCwgKHVpbnQzMl90ICopIGN0eC0+YmxvY2ssIDEpOworICAgICAgICAgICBib2R5KGN0eC0+QUJDRCwgY3R4LT5ibG9jaywgMSk7CiAgICAgICAgICAgIHNyYyArPSA2NDsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGludCBuYmxvY2tzID0gbGVuIC8gNjQ7Ci0gICAgICAgIGJvZHkoY3R4LT5BQkNELCAodWludDMyX3QgKilzcmMsIG5ibG9ja3MpOworICAgICAgICBib2R5KGN0eC0+QUJDRCwgc3JjLCBuYmxvY2tzKTsKICAgICAgICAgc3JjID0gZW5kOwogICAgIH0KICAgICBsZW4gJj0gNjM7CkBAIC0xODksMTMgKzE5OCwxNyBAQAogICAgIHdoaWxlICgoY3R4LT5sZW4gJiA2MykgIT0gNTYpCiAgICAgICAgIGF2X21kNV91cGRhdGUoY3R4LCAiIiwgMSk7CiAKLSAgICBhdl9tZDVfdXBkYXRlKGN0eCwgKHVpbnQ4X3QgKikmZmluYWxjb3VudCwgOCk7CisgICAgYXZfbWQ1X3VwZGF0ZShjdHgsICh1aW50OF90ICopICZmaW5hbGNvdW50LCA4KTsKIAogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIEFWX1dMMzIoZHN0ICsgNCppLCBjdHgtPkFCQ0RbMyAtIGldKTsKKyAgICAgICAgQVZfV0wzMihkc3QgKyA0ICogaSwgY3R4LT5BQkNEWzMgLSBpXSk7CiB9CiAKKyNpZiBGRl9BUElfQ1JZUFRPX1NJWkVfVAogdm9pZCBhdl9tZDVfc3VtKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCBpbnQgbGVuKQorI2Vsc2UKK3ZvaWQgYXZfbWQ1X3N1bSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IGxlbikKKyNlbmRpZgogewogICAgIEFWTUQ1IGN0eDsKIApAQCAtMjAzLDM0ICsyMTYsMyBAQAogICAgIGF2X21kNV91cGRhdGUoJmN0eCwgc3JjLCBsZW4pOwogICAgIGF2X21kNV9maW5hbCgmY3R4LCBkc3QpOwogfQotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLXN0YXRpYyB2b2lkIHByaW50X21kNSh1aW50OF90ICptZDUpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCi0gICAgICAgIHByaW50ZigiJTAyeCIsIG1kNVtpXSk7Ci0gICAgcHJpbnRmKCJcbiIpOwotfQotCi1pbnQgbWFpbih2b2lkKXsKLSAgICB1aW50OF90IG1kNXZhbFsxNl07Ci0gICAgaW50IGk7Ci0gICAgdm9sYXRpbGUgdWludDhfdCBpblsxMDAwXTsgLy8gdm9sYXRpbGUgdG8gd29ya2Fyb3VuZCBodHRwOi8vbGx2bS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4NDkKLSAgICAvLyBGSVhNRSByZW1vdmUgdm9sYXRpbGUgb25jZSBpdCBoYXMgYmVlbiBmaXhlZCBhbmQgYWxsIGZhdGUgY2xpZW50cyBhcmUgdXBkYXRlZAotCi0gICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKLSAgICAgICAgaW5baV0gPSBpICogaTsKLSAgICBhdl9tZDVfc3VtKG1kNXZhbCwgaW4sIDEwMDApOyBwcmludF9tZDUobWQ1dmFsKTsKLSAgICBhdl9tZDVfc3VtKG1kNXZhbCwgaW4sICAgNjMpOyBwcmludF9tZDUobWQ1dmFsKTsKLSAgICBhdl9tZDVfc3VtKG1kNXZhbCwgaW4sICAgNjQpOyBwcmludF9tZDUobWQ1dmFsKTsKLSAgICBhdl9tZDVfc3VtKG1kNXZhbCwgaW4sICAgNjUpOyBwcmludF9tZDUobWQ1dmFsKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQotICAgICAgICBpbltpXSA9IGkgJSAxMjc7Ci0gICAgYXZfbWQ1X3N1bShtZDV2YWwsIGluLCAgOTk5KTsgcHJpbnRfbWQ1KG1kNXZhbCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL21kNS5oIGIvbGliYXZ1dGlsL21kNS5oCmluZGV4IDc5NzAyYzguLmNhNzJjY2IgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9tZDUuaAorKysgYi9saWJhdnV0aWwvbWQ1LmgKQEAgLTE4LDkgKzE4LDE2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2dV9tZDUKKyAqIFB1YmxpYyBoZWFkZXIgZm9yIE1ENSBoYXNoIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLgorICovCisKICNpZm5kZWYgQVZVVElMX01ENV9ICiAjZGVmaW5lIEFWVVRJTF9NRDVfSAogCisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCkBAIC0yOCw3ICszNSw5IEBACiAKIC8qKgogICogQGRlZmdyb3VwIGxhdnVfbWQ1IE1ENQotICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEBpbmdyb3VwIGxhdnVfaGFzaAorICogTUQ1IGhhc2ggZnVuY3Rpb24gaW1wbGVtZW50YXRpb24uCisgKgogICogQHsKICAqLwogCkBAIC01NSw3ICs2NCwxMSBAQAogICogQHBhcmFtIHNyYyBpbnB1dCBkYXRhIHRvIHVwZGF0ZSBoYXNoIHdpdGgKICAqIEBwYXJhbSBsZW4gaW5wdXQgZGF0YSBsZW5ndGgKICAqLworI2lmIEZGX0FQSV9DUllQVE9fU0laRV9UCiB2b2lkIGF2X21kNV91cGRhdGUoc3RydWN0IEFWTUQ1ICpjdHgsIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IGxlbik7CisjZWxzZQordm9pZCBhdl9tZDVfdXBkYXRlKHN0cnVjdCBBVk1ENSAqY3R4LCBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBsZW4pOworI2VuZGlmCiAKIC8qKgogICogRmluaXNoIGhhc2hpbmcgYW5kIG91dHB1dCBkaWdlc3QgdmFsdWUuCkBAIC03Miw3ICs4NSwxMSBAQAogICogQHBhcmFtIHNyYyBUaGUgZGF0YSB0byBoYXNoCiAgKiBAcGFyYW0gbGVuIFRoZSBsZW5ndGggb2YgdGhlIGRhdGEsIGluIGJ5dGVzCiAgKi8KKyNpZiBGRl9BUElfQ1JZUFRPX1NJWkVfVAogdm9pZCBhdl9tZDVfc3VtKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCBpbnQgbGVuKTsKKyNlbHNlCit2b2lkIGF2X21kNV9zdW0odWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsIHNpemVfdCBsZW4pOworI2VuZGlmCiAKIC8qKgogICogQH0KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9tZW0uYyBiL2xpYmF2dXRpbC9tZW0uYwppbmRleCA4ZGZhYWQ4Li44OGZlMDliIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvbWVtLmMKKysrIGIvbGliYXZ1dGlsL21lbS5jCkBAIC02MSw3ICs2MSw3IEBACiAKICNpbmNsdWRlICJtZW1faW50ZXJuYWwuaCIKIAotI2RlZmluZSBBTElHTiAoSEFWRV9BVlggPyAzMiA6IDE2KQorI2RlZmluZSBBTElHTiAoSEFWRV9BVlg1MTIgPyA2NCA6IChIQVZFX0FWWCA/IDMyIDogMTYpKQogCiAvKiBOT1RFOiBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGVzZSBmdW5jdGlvbnMgd2l0aCB5b3VyIG93bgogICogaW1wbGVtZW50YXRpb25zIChub3QgcmVjb21tZW5kZWQpIHlvdSBoYXZlIHRvIGxpbmsgbGliYXYqIGFzCkBAIC03NywyMiArNzcsMTIgQEAKIHZvaWQgKmF2X21hbGxvYyhzaXplX3Qgc2l6ZSkKIHsKICAgICB2b2lkICpwdHIgPSBOVUxMOwotI2lmIENPTkZJR19NRU1BTElHTl9IQUNLCi0gICAgbG9uZyBkaWZmOwotI2VuZGlmCiAKICAgICAvKiBsZXQncyBkaXNhbGxvdyBwb3NzaWJseSBhbWJpZ3VvdXMgY2FzZXMgKi8KICAgICBpZiAoc2l6ZSA+IChtYXhfYWxsb2Nfc2l6ZSAtIDMyKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKLSNpZiBDT05GSUdfTUVNQUxJR05fSEFDSwotICAgIHB0ciA9IG1hbGxvYyhzaXplICsgQUxJR04pOwotICAgIGlmICghcHRyKQotICAgICAgICByZXR1cm4gcHRyOwotICAgIGRpZmYgICAgICAgICAgICAgID0gKCh+KGxvbmcpcHRyKSYoQUxJR04gLSAxKSkgKyAxOwotICAgIHB0ciAgICAgICAgICAgICAgID0gKGNoYXIgKilwdHIgKyBkaWZmOwotICAgICgoY2hhciAqKXB0cilbLTFdID0gZGlmZjsKLSNlbGlmIEhBVkVfUE9TSVhfTUVNQUxJR04KKyNpZiBIQVZFX1BPU0lYX01FTUFMSUdOCiAgICAgaWYgKHNpemUpIC8vT1MgWCBvbiBTREsgMTAuNiBoYXMgYSBicm9rZW4gcG9zaXhfbWVtYWxpZ24gaW1wbGVtZW50YXRpb24KICAgICBpZiAocG9zaXhfbWVtYWxpZ24oJnB0ciwgQUxJR04sIHNpemUpKQogICAgICAgICBwdHIgPSBOVUxMOwpAQCAtMTQ0LDI1ICsxMzQsMTEgQEAKIAogdm9pZCAqYXZfcmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKQogewotI2lmIENPTkZJR19NRU1BTElHTl9IQUNLCi0gICAgaW50IGRpZmY7Ci0jZW5kaWYKLQogICAgIC8qIGxldCdzIGRpc2FsbG93IHBvc3NpYmx5IGFtYmlndW91cyBjYXNlcyAqLwogICAgIGlmIChzaXplID4gKG1heF9hbGxvY19zaXplIC0gMzIpKQogICAgICAgICByZXR1cm4gTlVMTDsKIAotI2lmIENPTkZJR19NRU1BTElHTl9IQUNLCi0gICAgLy9GSVhNRSB0aGlzIGlzbid0IGFsaWduZWQgY29ycmVjdGx5LCB0aG91Z2ggaXQgcHJvYmFibHkgaXNuJ3QgbmVlZGVkCi0gICAgaWYgKCFwdHIpCi0gICAgICAgIHJldHVybiBhdl9tYWxsb2Moc2l6ZSk7Ci0gICAgZGlmZiA9ICgoY2hhciAqKXB0cilbLTFdOwotICAgIGF2X2Fzc2VydDAoZGlmZj4wICYmIGRpZmY8PUFMSUdOKTsKLSAgICBwdHIgPSByZWFsbG9jKChjaGFyICopcHRyIC0gZGlmZiwgc2l6ZSArIGRpZmYpOwotICAgIGlmIChwdHIpCi0gICAgICAgIHB0ciA9IChjaGFyICopcHRyICsgZGlmZjsKLSAgICByZXR1cm4gcHRyOwotI2VsaWYgSEFWRV9BTElHTkVEX01BTExPQworI2lmIEhBVkVfQUxJR05FRF9NQUxMT0MKICAgICByZXR1cm4gX2FsaWduZWRfcmVhbGxvYyhwdHIsIHNpemUgKyAhc2l6ZSwgQUxJR04pOwogI2Vsc2UKICAgICByZXR1cm4gcmVhbGxvYyhwdHIsIHNpemUgKyAhc2l6ZSk7CkBAIC0xNzksNyArMTU1LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogICAgIHIgPSBhdl9yZWFsbG9jKHB0ciwgc2l6ZSk7Ci0gICAgaWYgKCFyICYmIHNpemUpCisgICAgaWYgKCFyKQogICAgICAgICBhdl9mcmVlKHB0cik7CiAgICAgcmV0dXJuIHI7CiB9CkBAIC0yMDUsNiArMTgxLDIwIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKK3ZvaWQgKmF2X21hbGxvY19hcnJheShzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQoreworICAgIGlmICghc2l6ZSB8fCBubWVtYiA+PSBJTlRfTUFYIC8gc2l6ZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGF2X21hbGxvYyhubWVtYiAqIHNpemUpOworfQorCit2b2lkICphdl9tYWxsb2N6X2FycmF5KHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpCit7CisgICAgaWYgKCFzaXplIHx8IG5tZW1iID49IElOVF9NQVggLyBzaXplKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gYXZfbWFsbG9jeihubWVtYiAqIHNpemUpOworfQorCiB2b2lkICphdl9yZWFsbG9jX2FycmF5KHZvaWQgKnB0ciwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKIHsKICAgICBpZiAoIXNpemUgfHwgbm1lbWIgPj0gSU5UX01BWCAvIHNpemUpCkBAIC0yMjcsMTMgKzIxNyw3IEBACiAKIHZvaWQgYXZfZnJlZSh2b2lkICpwdHIpCiB7Ci0jaWYgQ09ORklHX01FTUFMSUdOX0hBQ0sKLSAgICBpZiAocHRyKSB7Ci0gICAgICAgIGludCB2PSAoKGNoYXIgKilwdHIpWy0xXTsKLSAgICAgICAgYXZfYXNzZXJ0MCh2PjAgJiYgdjw9QUxJR04pOwotICAgICAgICBmcmVlKChjaGFyICopcHRyIC0gdik7Ci0gICAgfQotI2VsaWYgSEFWRV9BTElHTkVEX01BTExPQworI2lmIEhBVkVfQUxJR05FRF9NQUxMT0MKICAgICBfYWxpZ25lZF9mcmVlKHB0cik7CiAjZWxzZQogICAgIGZyZWUocHRyKTsKQEAgLTMxMiw3ICsyOTYsNyBAQAogICAgIHZvaWQgKip0YWI7CiAgICAgbWVtY3B5KCZ0YWIsIHRhYl9wdHIsIHNpemVvZih0YWIpKTsKIAotICAgIEFWX0RZTkFSUkFZX0FERChJTlRfTUFYLCBzaXplb2YoKnRhYiksIHRhYiwgKm5iX3B0ciwgeworICAgIEZGX0RZTkFSUkFZX0FERChJTlRfTUFYLCBzaXplb2YoKnRhYiksIHRhYiwgKm5iX3B0ciwgewogICAgICAgICB0YWJbKm5iX3B0cl0gPSBlbGVtOwogICAgICAgICBtZW1jcHkodGFiX3B0ciwgJnRhYiwgc2l6ZW9mKHRhYikpOwogICAgIH0sIHsKQEAgLTMyNiw3ICszMTAsNyBAQAogICAgIHZvaWQgKip0YWI7CiAgICAgbWVtY3B5KCZ0YWIsIHRhYl9wdHIsIHNpemVvZih0YWIpKTsKIAotICAgIEFWX0RZTkFSUkFZX0FERChJTlRfTUFYLCBzaXplb2YoKnRhYiksIHRhYiwgKm5iX3B0ciwgeworICAgIEZGX0RZTkFSUkFZX0FERChJTlRfTUFYLCBzaXplb2YoKnRhYiksIHRhYiwgKm5iX3B0ciwgewogICAgICAgICB0YWJbKm5iX3B0cl0gPSBlbGVtOwogICAgICAgICBtZW1jcHkodGFiX3B0ciwgJnRhYiwgc2l6ZW9mKHRhYikpOwogICAgIH0sIHsKQEAgLTM0MCw3ICszMjQsNyBAQAogewogICAgIHVpbnQ4X3QgKnRhYl9lbGVtX2RhdGEgPSBOVUxMOwogCi0gICAgQVZfRFlOQVJSQVlfQUREKElOVF9NQVgsIGVsZW1fc2l6ZSwgKnRhYl9wdHIsICpuYl9wdHIsIHsKKyAgICBGRl9EWU5BUlJBWV9BREQoSU5UX01BWCwgZWxlbV9zaXplLCAqdGFiX3B0ciwgKm5iX3B0ciwgewogICAgICAgICB0YWJfZWxlbV9kYXRhID0gKHVpbnQ4X3QgKikqdGFiX3B0ciArICgqbmJfcHRyKSAqIGVsZW1fc2l6ZTsKICAgICAgICAgaWYgKGVsZW1fZGF0YSkKICAgICAgICAgICAgIG1lbWNweSh0YWJfZWxlbV9kYXRhLCBlbGVtX2RhdGEsIGVsZW1fc2l6ZSk7CkBAIC00MTUsNiArMzk5LDE4IEBACiB7CiAgICAgdWludDMyX3QgdiA9IEFWX1JOMzIoZHN0IC0gNCk7CiAKKyNpZiBIQVZFX0ZBU1RfNjRCSVQKKyAgICB1aW50NjRfdCB2Mj0gdiArICgodWludDY0X3Qpdjw8MzIpOworICAgIHdoaWxlIChsZW4gPj0gMzIpIHsKKyAgICAgICAgQVZfV042NChkc3QgICAsIHYyKTsKKyAgICAgICAgQVZfV042NChkc3QrIDgsIHYyKTsKKyAgICAgICAgQVZfV042NChkc3QrMTYsIHYyKTsKKyAgICAgICAgQVZfV042NChkc3QrMjQsIHYyKTsKKyAgICAgICAgZHN0ICs9IDMyOworICAgICAgICBsZW4gLT0gMzI7CisgICAgfQorI2VuZGlmCisKICAgICB3aGlsZSAobGVuID49IDQpIHsKICAgICAgICAgQVZfV04zMihkc3QsIHYpOwogICAgICAgICBkc3QgKz0gNDsKQEAgLTQ3OSwxMCArNDc1LDE1IEBACiAKIHZvaWQgKmF2X2Zhc3RfcmVhbGxvYyh2b2lkICpwdHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgc2l6ZV90IG1pbl9zaXplKQogewotICAgIGlmIChtaW5fc2l6ZSA8ICpzaXplKQorICAgIGlmIChtaW5fc2l6ZSA8PSAqc2l6ZSkKICAgICAgICAgcmV0dXJuIHB0cjsKIAotICAgIG1pbl9zaXplID0gRkZNQVgobWluX3NpemUgKyBtaW5fc2l6ZSAvIDE2ICsgMzIsIG1pbl9zaXplKTsKKyAgICBpZiAobWluX3NpemUgPiBtYXhfYWxsb2Nfc2l6ZSAtIDMyKSB7CisgICAgICAgICpzaXplID0gMDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWluX3NpemUgPSBGRk1JTihtYXhfYWxsb2Nfc2l6ZSAtIDMyLCBGRk1BWChtaW5fc2l6ZSArIG1pbl9zaXplIC8gMTYgKyAzMiwgbWluX3NpemUpKTsKIAogICAgIHB0ciA9IGF2X3JlYWxsb2MocHRyLCBtaW5fc2l6ZSk7CiAgICAgLyogd2UgY291bGQgc2V0IHRoaXMgdG8gdGhlIHVubW9kaWZpZWQgbWluX3NpemUgYnV0IHRoaXMgaXMgc2FmZXIKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9tZW0uaCBiL2xpYmF2dXRpbC9tZW0uaAppbmRleCBkMjViMzIyLi43ZTBiMTJhIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvbWVtLmgKKysrIGIvbGliYXZ1dGlsL21lbS5oCkBAIC0yMCw3ICsyMCw4IEBACiAKIC8qKgogICogQGZpbGUKLSAqIG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMKKyAqIEBpbmdyb3VwIGxhdnVfbWVtCisgKiBNZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zCiAgKi8KIAogI2lmbmRlZiBBVlVUSUxfTUVNX0gKQEAgLTM1LDM3ICszNiwxMzMgQEAKIAogLyoqCiAgKiBAYWRkdG9ncm91cCBsYXZ1X21lbQorICogVXRpbGl0aWVzIGZvciBtYW5pcHVsYXRpbmcgbWVtb3J5LgorICoKKyAqIEZGbXBlZyBoYXMgc2V2ZXJhbCBhcHBsaWNhdGlvbnMgb2YgbWVtb3J5IHRoYXQgYXJlIG5vdCByZXF1aXJlZCBvZiBhIHR5cGljYWwKKyAqIHByb2dyYW0uIEZvciBleGFtcGxlLCB0aGUgY29tcHV0aW5nLWhlYXZ5IGNvbXBvbmVudHMgbGlrZSB2aWRlbyBkZWNvZGluZyBhbmQKKyAqIGVuY29kaW5nIGNhbiBiZSBzcGVkIHVwIHNpZ25pZmljYW50bHkgdGhyb3VnaCB0aGUgdXNlIG9mIGFsaWduZWQgbWVtb3J5LgorICoKKyAqIEhvd2V2ZXIsIGZvciBlYWNoIG9mIEZGbXBlZydzIGFwcGxpY2F0aW9ucyBvZiBtZW1vcnksIHRoZXJlIG1pZ2h0IG5vdCBiZSBhCisgKiByZWNvZ25pemVkIG9yIHN0YW5kYXJkaXplZCBBUEkgZm9yIHRoYXQgc3BlY2lmaWMgdXNlLiBNZW1vcnkgYWxpZ25tZW50LCBmb3IKKyAqIGluc3RhbmNlLCB2YXJpZXMgd2lsZGx5IGRlcGVuZGluZyBvbiBvcGVyYXRpbmcgc3lzdGVtcywgYXJjaGl0ZWN0dXJlcywgYW5kCisgKiBjb21waWxlcnMuIEhlbmNlLCB0aGlzIGNvbXBvbmVudCBvZiBAcmVmIGxpYmF2dXRpbCBpcyBjcmVhdGVkIHRvIG1ha2UKKyAqIGRlYWxpbmcgd2l0aCBtZW1vcnkgY29uc2lzdGVudGx5IHBvc3NpYmxlIG9uIGFsbCBwbGF0Zm9ybXMuCisgKgorICogQHsKKyAqCisgKiBAZGVmZ3JvdXAgbGF2dV9tZW1fbWFjcm9zIEFsaWdubWVudCBNYWNyb3MKKyAqIEhlbHBlciBtYWNyb3MgZm9yIGRlY2xhcmluZyBhbGlnbmVkIHZhcmlhYmxlcy4KICAqIEB7CiAgKi8KIAorLyoqCisgKiBAZGVmIERFQ0xBUkVfQUxJR05FRChuLHQsdikKKyAqIERlY2xhcmUgYSB2YXJpYWJsZSB0aGF0IGlzIGFsaWduZWQgaW4gbWVtb3J5LgorICoKKyAqIEBjb2Rley5jfQorICogREVDTEFSRV9BTElHTkVEKDE2LCB1aW50MTZfdCwgYWxpZ25lZF9pbnQpID0gNDI7CisgKiBERUNMQVJFX0FMSUdORUQoMzIsIHVpbnQ4X3QsIGFsaWduZWRfYXJyYXkpWzEyOF07CisgKgorICogLy8gVGhlIGRlZmF1bHQtYWxpZ25tZW50IGVxdWl2YWxlbnQgd291bGQgYmUKKyAqIHVpbnQxNl90IGFsaWduZWRfaW50ID0gNDI7CisgKiB1aW50OF90IGFsaWduZWRfYXJyYXlbMTI4XTsKKyAqIEBlbmRjb2RlCisgKgorICogQHBhcmFtIG4gTWluaW11bSBhbGlnbm1lbnQgaW4gYnl0ZXMKKyAqIEBwYXJhbSB0IFR5cGUgb2YgdGhlIHZhcmlhYmxlIChvciBhcnJheSBlbGVtZW50KQorICogQHBhcmFtIHYgTmFtZSBvZiB0aGUgdmFyaWFibGUKKyAqLworCisvKioKKyAqIEBkZWYgREVDTEFSRV9BU01fQUxJR05FRChuLHQsdikKKyAqIERlY2xhcmUgYW4gYWxpZ25lZCB2YXJpYWJsZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIGlubGluZSBhc3NlbWJseSBjb2RlLgorICoKKyAqIEBjb2Rley5jfQorICogREVDTEFSRV9BU01fQUxJR05FRCgxNiwgdWludDY0X3QsIHB3XzA4KSA9IFVJTlQ2NF9DKDB4MDAwODAwMDgwMDA4MDAwOCk7CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbSBuIE1pbmltdW0gYWxpZ25tZW50IGluIGJ5dGVzCisgKiBAcGFyYW0gdCBUeXBlIG9mIHRoZSB2YXJpYWJsZSAob3IgYXJyYXkgZWxlbWVudCkKKyAqIEBwYXJhbSB2IE5hbWUgb2YgdGhlIHZhcmlhYmxlCisgKi8KKworLyoqCisgKiBAZGVmIERFQ0xBUkVfQVNNX0NPTlNUKG4sdCx2KQorICogRGVjbGFyZSBhIHN0YXRpYyBjb25zdGFudCBhbGlnbmVkIHZhcmlhYmxlIGFwcHJvcHJpYXRlIGZvciB1c2UgaW4gaW5saW5lCisgKiBhc3NlbWJseSBjb2RlLgorICoKKyAqIEBjb2Rley5jfQorICogREVDTEFSRV9BU01fQ09OU1QoMTYsIHVpbnQ2NF90LCBwd18wOCkgPSBVSU5UNjRfQygweDAwMDgwMDA4MDAwODAwMDgpOworICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gbiBNaW5pbXVtIGFsaWdubWVudCBpbiBieXRlcworICogQHBhcmFtIHQgVHlwZSBvZiB0aGUgdmFyaWFibGUgKG9yIGFycmF5IGVsZW1lbnQpCisgKiBAcGFyYW0gdiBOYW1lIG9mIHRoZSB2YXJpYWJsZQorICovCiAKICNpZiBkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIF9fSU5URUxfQ09NUElMRVIgPCAxMTEwIHx8IGRlZmluZWQoX19TVU5QUk9fQykKICAgICAjZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHQsdikgICAgICB0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpIHYKKyAgICAjZGVmaW5lIERFQ0xBUkVfQVNNX0FMSUdORUQobix0LHYpICB0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpIHYKICAgICAjZGVmaW5lIERFQ0xBUkVfQVNNX0NPTlNUKG4sdCx2KSAgICBjb25zdCB0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpIHYKLSNlbGlmIGRlZmluZWQoX19USV9DT01QSUxFUl9WRVJTSU9OX18pCi0gICAgI2RlZmluZSBERUNMQVJFX0FMSUdORUQobix0LHYpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQVZfUFJBR01BKERBVEFfQUxJR04odixuKSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0IF9fYXR0cmlidXRlX18oKGFsaWduZWQobikpKSB2Ci0gICAgI2RlZmluZSBERUNMQVJFX0FTTV9DT05TVChuLHQsdikgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQVZfUFJBR01BKERBVEFfQUxJR04odixuKSkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0aWMgY29uc3QgdCBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKG4pKSkgdgotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyNlbGlmIGRlZmluZWQoX19ESkdQUF9fKQorICAgICNkZWZpbmUgREVDTEFSRV9BTElHTkVEKG4sdCx2KSAgICAgIHQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKEZGTUlOKG4sIDE2KSkpKSB2CisgICAgI2RlZmluZSBERUNMQVJFX0FTTV9BTElHTkVEKG4sdCx2KSAgdCBhdl91c2VkIF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChGRk1JTihuLCAxNikpKSkgdgorICAgICNkZWZpbmUgREVDTEFSRV9BU01fQ09OU1Qobix0LHYpICAgIHN0YXRpYyBjb25zdCB0IGF2X3VzZWQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKEZGTUlOKG4sIDE2KSkpKSB2CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKICAgICAjZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHQsdikgICAgICB0IF9fYXR0cmlidXRlX18gKChhbGlnbmVkIChuKSkpIHYKKyAgICAjZGVmaW5lIERFQ0xBUkVfQVNNX0FMSUdORUQobix0LHYpICB0IGF2X3VzZWQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKG4pKSkgdgogICAgICNkZWZpbmUgREVDTEFSRV9BU01fQ09OU1Qobix0LHYpICAgIHN0YXRpYyBjb25zdCB0IGF2X3VzZWQgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKG4pKSkgdgogI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKICAgICAjZGVmaW5lIERFQ0xBUkVfQUxJR05FRChuLHQsdikgICAgICBfX2RlY2xzcGVjKGFsaWduKG4pKSB0IHYKKyAgICAjZGVmaW5lIERFQ0xBUkVfQVNNX0FMSUdORUQobix0LHYpICBfX2RlY2xzcGVjKGFsaWduKG4pKSB0IHYKICAgICAjZGVmaW5lIERFQ0xBUkVfQVNNX0NPTlNUKG4sdCx2KSAgICBfX2RlY2xzcGVjKGFsaWduKG4pKSBzdGF0aWMgY29uc3QgdCB2CiAjZWxzZQogICAgICNkZWZpbmUgREVDTEFSRV9BTElHTkVEKG4sdCx2KSAgICAgIHQgdgorICAgICNkZWZpbmUgREVDTEFSRV9BU01fQUxJR05FRChuLHQsdikgIHQgdgogICAgICNkZWZpbmUgREVDTEFSRV9BU01fQ09OU1Qobix0LHYpICAgIHN0YXRpYyBjb25zdCB0IHYKICNlbmRpZgogCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV9tZW1fYXR0cnMgRnVuY3Rpb24gQXR0cmlidXRlcworICogRnVuY3Rpb24gYXR0cmlidXRlcyBhcHBsaWNhYmxlIHRvIG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMuCisgKgorICogVGhlc2UgZnVuY3Rpb24gYXR0cmlidXRlcyBjYW4gaGVscCBjb21waWxlcnMgZW1pdCBtb3JlIHVzZWZ1bCB3YXJuaW5ncywgb3IKKyAqIGdlbmVyYXRlIGJldHRlciBjb2RlLgorICogQHsKKyAqLworCisvKioKKyAqIEBkZWYgYXZfbWFsbG9jX2F0dHJpYgorICogRnVuY3Rpb24gYXR0cmlidXRlIGRlbm90aW5nIGEgbWFsbG9jLWxpa2UgZnVuY3Rpb24uCisgKgorICogQHNlZSA8YSBocmVmPSJodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0NvbW1vbi1GdW5jdGlvbi1BdHRyaWJ1dGVzLmh0bWwjaW5kZXgtZ190XzAwNDBjb2RlXzAwN2JtYWxsb2NfMDA3ZC1mdW5jdGlvbi1hdHRyaWJ1dGUtMzI1MSI+RnVuY3Rpb24gYXR0cmlidXRlIGBtYWxsb2NgIGluIEdDQydzIGRvY3VtZW50YXRpb248L2E+CisgKi8KKwogI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDMsMSkKICAgICAjZGVmaW5lIGF2X21hbGxvY19hdHRyaWIgX19hdHRyaWJ1dGVfXygoX19tYWxsb2NfXykpCiAjZWxzZQogICAgICNkZWZpbmUgYXZfbWFsbG9jX2F0dHJpYgogI2VuZGlmCiAKKy8qKgorICogQGRlZiBhdl9hbGxvY19zaXplKC4uLikKKyAqIEZ1bmN0aW9uIGF0dHJpYnV0ZSB1c2VkIG9uIGEgZnVuY3Rpb24gdGhhdCBhbGxvY2F0ZXMgbWVtb3J5LCB3aG9zZSBzaXplIGlzCisgKiBnaXZlbiBieSB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcihzKS4KKyAqCisgKiBAY29kZXsuY30KKyAqIHZvaWQgKmF2X21hbGxvYyhzaXplX3Qgc2l6ZSkgYXZfYWxsb2Nfc2l6ZSgxKTsKKyAqIHZvaWQgKmF2X2NhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKSBhdl9hbGxvY19zaXplKDEsIDIpOworICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gLi4uIE9uZSBvciB0d28gcGFyYW1ldGVyIGluZGV4ZXMsIHNlcGFyYXRlZCBieSBhIGNvbW1hCisgKgorICogQHNlZSA8YSBocmVmPSJodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvZ2NjL0NvbW1vbi1GdW5jdGlvbi1BdHRyaWJ1dGVzLmh0bWwjaW5kZXgtZ190XzAwNDBjb2RlXzAwN2JhbGxvY18wMDVmc2l6ZV8wMDdkLWZ1bmN0aW9uLWF0dHJpYnV0ZS0zMjIwIj5GdW5jdGlvbiBhdHRyaWJ1dGUgYGFsbG9jX3NpemVgIGluIEdDQydzIGRvY3VtZW50YXRpb248L2E+CisgKi8KKwogI2lmIEFWX0dDQ19WRVJTSU9OX0FUX0xFQVNUKDQsMykKICAgICAjZGVmaW5lIGF2X2FsbG9jX3NpemUoLi4uKSBfX2F0dHJpYnV0ZV9fKChhbGxvY19zaXplKF9fVkFfQVJHU19fKSkpCiAjZWxzZQpAQCAtNzMsMjA0ICsxNzAsNDIzIEBACiAjZW5kaWYKIAogLyoqCi0gKiBBbGxvY2F0ZSBhIGJsb2NrIG9mIHNpemUgYnl0ZXMgd2l0aCBhbGlnbm1lbnQgc3VpdGFibGUgZm9yIGFsbAotICogbWVtb3J5IGFjY2Vzc2VzIChpbmNsdWRpbmcgdmVjdG9ycyBpZiBhdmFpbGFibGUgb24gdGhlIENQVSkuCi0gKiBAcGFyYW0gc2l6ZSBTaXplIGluIGJ5dGVzIGZvciB0aGUgbWVtb3J5IGJsb2NrIHRvIGJlIGFsbG9jYXRlZC4KLSAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLCBOVUxMIGlmIHRoZSBibG9jayBjYW5ub3QKLSAqIGJlIGFsbG9jYXRlZC4KKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV9tZW1fZnVuY3MgSGVhcCBNYW5hZ2VtZW50CisgKiBGdW5jdGlvbnMgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcsIGZyZWVpbmcsIGFuZCBjb3B5aW5nIG1lbW9yeS4KKyAqCisgKiBBbGwgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb25zIGhhdmUgYSBidWlsdC1pbiB1cHBlciBsaW1pdCBvZiBgSU5UX01BWGAKKyAqIGJ5dGVzLiBUaGlzIG1heSBiZSBjaGFuZ2VkIHdpdGggYXZfbWF4X2FsbG9jKCksIGFsdGhvdWdoIGV4ZXJjaXNlIGV4dHJlbWUKKyAqIGNhdXRpb24gd2hlbiBkb2luZyBzby4KKyAqCisgKiBAeworICovCisKKy8qKgorICogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgd2l0aCBhbGlnbm1lbnQgc3VpdGFibGUgZm9yIGFsbCBtZW1vcnkgYWNjZXNzZXMKKyAqIChpbmNsdWRpbmcgdmVjdG9ycyBpZiBhdmFpbGFibGUgb24gdGhlIENQVSkuCisgKgorICogQHBhcmFtIHNpemUgU2l6ZSBpbiBieXRlcyBmb3IgdGhlIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQKKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLCBvciBgTlVMTGAgaWYgdGhlIGJsb2NrIGNhbm5vdAorICogICAgICAgICBiZSBhbGxvY2F0ZWQKICAqIEBzZWUgYXZfbWFsbG9jeigpCiAgKi8KIHZvaWQgKmF2X21hbGxvYyhzaXplX3Qgc2l6ZSkgYXZfbWFsbG9jX2F0dHJpYiBhdl9hbGxvY19zaXplKDEpOwogCiAvKioKLSAqIEFsbG9jYXRlIGEgYmxvY2sgb2Ygc2l6ZSAqIG5tZW1iIGJ5dGVzIHdpdGggYXZfbWFsbG9jKCkuCi0gKiBAcGFyYW0gbm1lbWIgTnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gc2l6ZSBTaXplIG9mIHRoZSBzaW5nbGUgZWxlbWVudAotICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIE5VTEwgaWYgdGhlIGJsb2NrIGNhbm5vdAotICogYmUgYWxsb2NhdGVkLgotICogQHNlZSBhdl9tYWxsb2MoKQotICovCi1hdl9hbGxvY19zaXplKDEsIDIpIHN0YXRpYyBpbmxpbmUgdm9pZCAqYXZfbWFsbG9jX2FycmF5KHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpCi17Ci0gICAgaWYgKCFzaXplIHx8IG5tZW1iID49IElOVF9NQVggLyBzaXplKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gYXZfbWFsbG9jKG5tZW1iICogc2l6ZSk7Ci19Ci0KLS8qKgotICogQWxsb2NhdGUgb3IgcmVhbGxvY2F0ZSBhIGJsb2NrIG9mIG1lbW9yeS4KLSAqIElmIHB0ciBpcyBOVUxMIGFuZCBzaXplID4gMCwgYWxsb2NhdGUgYSBuZXcgYmxvY2suIElmCi0gKiBzaXplIGlzIHplcm8sIGZyZWUgdGhlIG1lbW9yeSBibG9jayBwb2ludGVkIHRvIGJ5IHB0ci4KLSAqIEBwYXJhbSBwdHIgUG9pbnRlciB0byBhIG1lbW9yeSBibG9jayBhbHJlYWR5IGFsbG9jYXRlZCB3aXRoCi0gKiBhdl9yZWFsbG9jKCkgb3IgTlVMTC4KLSAqIEBwYXJhbSBzaXplIFNpemUgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgb3IKLSAqIHJlYWxsb2NhdGVkLgotICogQHJldHVybiBQb2ludGVyIHRvIGEgbmV3bHktcmVhbGxvY2F0ZWQgYmxvY2sgb3IgTlVMTCBpZiB0aGUgYmxvY2sKLSAqIGNhbm5vdCBiZSByZWFsbG9jYXRlZCBvciB0aGUgZnVuY3Rpb24gaXMgdXNlZCB0byBmcmVlIHRoZSBtZW1vcnkgYmxvY2suCi0gKiBAd2FybmluZyBQb2ludGVycyBvcmlnaW5hdGluZyBmcm9tIHRoZSBhdl9tYWxsb2MoKSBmYW1pbHkgb2YgZnVuY3Rpb25zIG11c3QKLSAqICAgICAgICAgIG5vdCBiZSBwYXNzZWQgdG8gYXZfcmVhbGxvYygpLiBUaGUgZm9ybWVyIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZwotICogICAgICAgICAgbWVtYWxpZ24oKSAob3Igb3RoZXIgZnVuY3Rpb25zKSwgYW5kIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0Ci0gKiAgICAgICAgICBwb2ludGVycyBmcm9tIHN1Y2ggZnVuY3Rpb25zIGNhbiBiZSBwYXNzZWQgdG8gcmVhbGxvYygpIGF0IGFsbC4KLSAqICAgICAgICAgIFRoZSBzaXR1YXRpb24gaXMgdW5kZWZpbmVkIGFjY29yZGluZyB0byBQT1NJWCBhbmQgbWF5IGNyYXNoIHdpdGgKLSAqICAgICAgICAgIHNvbWUgbGliYyBpbXBsZW1lbnRhdGlvbnMuCi0gKiBAc2VlIGF2X2Zhc3RfcmVhbGxvYygpCi0gKi8KLXZvaWQgKmF2X3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgYXZfYWxsb2Nfc2l6ZSgyKTsKLQotLyoqCi0gKiBBbGxvY2F0ZSBvciByZWFsbG9jYXRlIGEgYmxvY2sgb2YgbWVtb3J5LgotICogVGhpcyBmdW5jdGlvbiBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIGF2X3JlYWxsb2MsIGV4Y2VwdDoKLSAqIC0gSXQgdGFrZXMgdHdvIGFyZ3VtZW50cyBhbmQgY2hlY2tzIHRoZSByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uIGZvcgotICogICBpbnRlZ2VyIG92ZXJmbG93LgotICogLSBJdCBmcmVlcyB0aGUgaW5wdXQgYmxvY2sgaW4gY2FzZSBvZiBmYWlsdXJlLCB0aHVzIGF2b2lkaW5nIHRoZSBtZW1vcnkKLSAqICAgbGVhayB3aXRoIHRoZSBjbGFzc2ljICJidWYgPSByZWFsbG9jKGJ1Zik7IGlmICghYnVmKSByZXR1cm4gLTE7Ii4KLSAqLwotdm9pZCAqYXZfcmVhbGxvY19mKHZvaWQgKnB0ciwgc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplKTsKLQotLyoqCi0gKiBBbGxvY2F0ZSBvciByZWFsbG9jYXRlIGEgYmxvY2sgb2YgbWVtb3J5LgotICogSWYgKnB0ciBpcyBOVUxMIGFuZCBzaXplID4gMCwgYWxsb2NhdGUgYSBuZXcgYmxvY2suIElmCi0gKiBzaXplIGlzIHplcm8sIGZyZWUgdGhlIG1lbW9yeSBibG9jayBwb2ludGVkIHRvIGJ5IHB0ci4KLSAqIEBwYXJhbSAgIHB0ciBQb2ludGVyIHRvIGEgcG9pbnRlciB0byBhIG1lbW9yeSBibG9jayBhbHJlYWR5IGFsbG9jYXRlZAotICogICAgICAgICAgd2l0aCBhdl9yZWFsbG9jKCksIG9yIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIE5VTEwuCi0gKiAgICAgICAgICBUaGUgcG9pbnRlciBpcyB1cGRhdGVkIG9uIHN1Y2Nlc3MsIG9yIGZyZWVkIG9uIGZhaWx1cmUuCi0gKiBAcGFyYW0gICBzaXplIFNpemUgaW4gYnl0ZXMgZm9yIHRoZSBtZW1vcnkgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIG9yCi0gKiAgICAgICAgICByZWFsbG9jYXRlZAotICogQHJldHVybiAgWmVybyBvbiBzdWNjZXNzLCBhbiBBVkVSUk9SIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqIEB3YXJuaW5nIFBvaW50ZXJzIG9yaWdpbmF0aW5nIGZyb20gdGhlIGF2X21hbGxvYygpIGZhbWlseSBvZiBmdW5jdGlvbnMgbXVzdAotICogICAgICAgICAgbm90IGJlIHBhc3NlZCB0byBhdl9yZWFsbG9jcCgpLiBUaGUgZm9ybWVyIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZwotICogICAgICAgICAgbWVtYWxpZ24oKSAob3Igb3RoZXIgZnVuY3Rpb25zKSwgYW5kIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0Ci0gKiAgICAgICAgICBwb2ludGVycyBmcm9tIHN1Y2ggZnVuY3Rpb25zIGNhbiBiZSBwYXNzZWQgdG8gcmVhbGxvYygpIGF0IGFsbC4KLSAqICAgICAgICAgIFRoZSBzaXR1YXRpb24gaXMgdW5kZWZpbmVkIGFjY29yZGluZyB0byBQT1NJWCBhbmQgbWF5IGNyYXNoIHdpdGgKLSAqICAgICAgICAgIHNvbWUgbGliYyBpbXBsZW1lbnRhdGlvbnMuCi0gKi8KLWF2X3dhcm5fdW51c2VkX3Jlc3VsdAotaW50IGF2X3JlYWxsb2NwKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwotCi0vKioKLSAqIEFsbG9jYXRlIG9yIHJlYWxsb2NhdGUgYW4gYXJyYXkuCi0gKiBJZiBwdHIgaXMgTlVMTCBhbmQgbm1lbWIgPiAwLCBhbGxvY2F0ZSBhIG5ldyBibG9jay4gSWYKLSAqIG5tZW1iIGlzIHplcm8sIGZyZWUgdGhlIG1lbW9yeSBibG9jayBwb2ludGVkIHRvIGJ5IHB0ci4KLSAqIEBwYXJhbSBwdHIgUG9pbnRlciB0byBhIG1lbW9yeSBibG9jayBhbHJlYWR5IGFsbG9jYXRlZCB3aXRoCi0gKiBhdl9yZWFsbG9jKCkgb3IgTlVMTC4KLSAqIEBwYXJhbSBubWVtYiBOdW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSBzaXplIFNpemUgb2YgdGhlIHNpbmdsZSBlbGVtZW50Ci0gKiBAcmV0dXJuIFBvaW50ZXIgdG8gYSBuZXdseS1yZWFsbG9jYXRlZCBibG9jayBvciBOVUxMIGlmIHRoZSBibG9jawotICogY2Fubm90IGJlIHJlYWxsb2NhdGVkIG9yIHRoZSBmdW5jdGlvbiBpcyB1c2VkIHRvIGZyZWUgdGhlIG1lbW9yeSBibG9jay4KLSAqIEB3YXJuaW5nIFBvaW50ZXJzIG9yaWdpbmF0aW5nIGZyb20gdGhlIGF2X21hbGxvYygpIGZhbWlseSBvZiBmdW5jdGlvbnMgbXVzdAotICogICAgICAgICAgbm90IGJlIHBhc3NlZCB0byBhdl9yZWFsbG9jKCkuIFRoZSBmb3JtZXIgY2FuIGJlIGltcGxlbWVudGVkIHVzaW5nCi0gKiAgICAgICAgICBtZW1hbGlnbigpIChvciBvdGhlciBmdW5jdGlvbnMpLCBhbmQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKLSAqICAgICAgICAgIHBvaW50ZXJzIGZyb20gc3VjaCBmdW5jdGlvbnMgY2FuIGJlIHBhc3NlZCB0byByZWFsbG9jKCkgYXQgYWxsLgotICogICAgICAgICAgVGhlIHNpdHVhdGlvbiBpcyB1bmRlZmluZWQgYWNjb3JkaW5nIHRvIFBPU0lYIGFuZCBtYXkgY3Jhc2ggd2l0aAotICogICAgICAgICAgc29tZSBsaWJjIGltcGxlbWVudGF0aW9ucy4KLSAqLwotYXZfYWxsb2Nfc2l6ZSgyLCAzKSB2b2lkICphdl9yZWFsbG9jX2FycmF5KHZvaWQgKnB0ciwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7Ci0KLS8qKgotICogQWxsb2NhdGUgb3IgcmVhbGxvY2F0ZSBhbiBhcnJheSB0aHJvdWdoIGEgcG9pbnRlciB0byBhIHBvaW50ZXIuCi0gKiBJZiAqcHRyIGlzIE5VTEwgYW5kIG5tZW1iID4gMCwgYWxsb2NhdGUgYSBuZXcgYmxvY2suIElmCi0gKiBubWVtYiBpcyB6ZXJvLCBmcmVlIHRoZSBtZW1vcnkgYmxvY2sgcG9pbnRlZCB0byBieSBwdHIuCi0gKiBAcGFyYW0gcHRyIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIGEgbWVtb3J5IGJsb2NrIGFscmVhZHkgYWxsb2NhdGVkCi0gKiB3aXRoIGF2X3JlYWxsb2MoKSwgb3IgcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gTlVMTC4KLSAqIFRoZSBwb2ludGVyIGlzIHVwZGF0ZWQgb24gc3VjY2Vzcywgb3IgZnJlZWQgb24gZmFpbHVyZS4KLSAqIEBwYXJhbSBubWVtYiBOdW1iZXIgb2YgZWxlbWVudHMKLSAqIEBwYXJhbSBzaXplIFNpemUgb2YgdGhlIHNpbmdsZSBlbGVtZW50Ci0gKiBAcmV0dXJuIFplcm8gb24gc3VjY2VzcywgYW4gQVZFUlJPUiBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCi0gKiBAd2FybmluZyBQb2ludGVycyBvcmlnaW5hdGluZyBmcm9tIHRoZSBhdl9tYWxsb2MoKSBmYW1pbHkgb2YgZnVuY3Rpb25zIG11c3QKLSAqICAgICAgICAgIG5vdCBiZSBwYXNzZWQgdG8gYXZfcmVhbGxvYygpLiBUaGUgZm9ybWVyIGNhbiBiZSBpbXBsZW1lbnRlZCB1c2luZwotICogICAgICAgICAgbWVtYWxpZ24oKSAob3Igb3RoZXIgZnVuY3Rpb25zKSwgYW5kIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0Ci0gKiAgICAgICAgICBwb2ludGVycyBmcm9tIHN1Y2ggZnVuY3Rpb25zIGNhbiBiZSBwYXNzZWQgdG8gcmVhbGxvYygpIGF0IGFsbC4KLSAqICAgICAgICAgIFRoZSBzaXR1YXRpb24gaXMgdW5kZWZpbmVkIGFjY29yZGluZyB0byBQT1NJWCBhbmQgbWF5IGNyYXNoIHdpdGgKLSAqICAgICAgICAgIHNvbWUgbGliYyBpbXBsZW1lbnRhdGlvbnMuCi0gKi8KLWF2X2FsbG9jX3NpemUoMiwgMykgaW50IGF2X3JlYWxsb2NwX2FycmF5KHZvaWQgKnB0ciwgc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7Ci0KLS8qKgotICogRnJlZSBhIG1lbW9yeSBibG9jayB3aGljaCBoYXMgYmVlbiBhbGxvY2F0ZWQgd2l0aCBhdl9tYWxsb2MoeikoKSBvcgotICogYXZfcmVhbGxvYygpLgotICogQHBhcmFtIHB0ciBQb2ludGVyIHRvIHRoZSBtZW1vcnkgYmxvY2sgd2hpY2ggc2hvdWxkIGJlIGZyZWVkLgotICogQG5vdGUgcHRyID0gTlVMTCBpcyBleHBsaWNpdGx5IGFsbG93ZWQuCi0gKiBAbm90ZSBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgYXZfZnJlZXAoKSBpbnN0ZWFkLgotICogQHNlZSBhdl9mcmVlcCgpCi0gKi8KLXZvaWQgYXZfZnJlZSh2b2lkICpwdHIpOwotCi0vKioKLSAqIEFsbG9jYXRlIGEgYmxvY2sgb2Ygc2l6ZSBieXRlcyB3aXRoIGFsaWdubWVudCBzdWl0YWJsZSBmb3IgYWxsCi0gKiBtZW1vcnkgYWNjZXNzZXMgKGluY2x1ZGluZyB2ZWN0b3JzIGlmIGF2YWlsYWJsZSBvbiB0aGUgQ1BVKSBhbmQKLSAqIHplcm8gYWxsIHRoZSBieXRlcyBvZiB0aGUgYmxvY2suCi0gKiBAcGFyYW0gc2l6ZSBTaXplIGluIGJ5dGVzIGZvciB0aGUgbWVtb3J5IGJsb2NrIHRvIGJlIGFsbG9jYXRlZC4KLSAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLCBOVUxMIGlmIGl0IGNhbm5vdCBiZSBhbGxvY2F0ZWQuCisgKiBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayB3aXRoIGFsaWdubWVudCBzdWl0YWJsZSBmb3IgYWxsIG1lbW9yeSBhY2Nlc3NlcworICogKGluY2x1ZGluZyB2ZWN0b3JzIGlmIGF2YWlsYWJsZSBvbiB0aGUgQ1BVKSBhbmQgemVybyBhbGwgdGhlIGJ5dGVzIG9mIHRoZQorICogYmxvY2suCisgKgorICogQHBhcmFtIHNpemUgU2l6ZSBpbiBieXRlcyBmb3IgdGhlIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQKKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLCBvciBgTlVMTGAgaWYgaXQgY2Fubm90IGJlIGFsbG9jYXRlZAogICogQHNlZSBhdl9tYWxsb2MoKQogICovCiB2b2lkICphdl9tYWxsb2N6KHNpemVfdCBzaXplKSBhdl9tYWxsb2NfYXR0cmliIGF2X2FsbG9jX3NpemUoMSk7CiAKIC8qKgotICogQWxsb2NhdGUgYSBibG9jayBvZiBubWVtYiAqIHNpemUgYnl0ZXMgd2l0aCBhbGlnbm1lbnQgc3VpdGFibGUgZm9yIGFsbAotICogbWVtb3J5IGFjY2Vzc2VzIChpbmNsdWRpbmcgdmVjdG9ycyBpZiBhdmFpbGFibGUgb24gdGhlIENQVSkgYW5kCi0gKiB6ZXJvIGFsbCB0aGUgYnl0ZXMgb2YgdGhlIGJsb2NrLgotICogVGhlIGFsbG9jYXRpb24gd2lsbCBmYWlsIGlmIG5tZW1iICogc2l6ZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwKLSAqIHRvIElOVF9NQVguCi0gKiBAcGFyYW0gbm1lbWIKLSAqIEBwYXJhbSBzaXplCi0gKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBibG9jaywgTlVMTCBpZiBpdCBjYW5ub3QgYmUgYWxsb2NhdGVkLgorICogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgZm9yIGFuIGFycmF5IHdpdGggYXZfbWFsbG9jKCkuCisgKgorICogVGhlIGFsbG9jYXRlZCBtZW1vcnkgd2lsbCBoYXZlIHNpemUgYHNpemUgKiBubWVtYmAgYnl0ZXMuCisgKgorICogQHBhcmFtIG5tZW1iIE51bWJlciBvZiBlbGVtZW50CisgKiBAcGFyYW0gc2l6ZSAgU2l6ZSBvZiBhIHNpbmdsZSBlbGVtZW50CisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBibG9jaywgb3IgYE5VTExgIGlmIHRoZSBibG9jayBjYW5ub3QKKyAqICAgICAgICAgYmUgYWxsb2NhdGVkCisgKiBAc2VlIGF2X21hbGxvYygpCisgKi8KK2F2X2FsbG9jX3NpemUoMSwgMikgdm9pZCAqYXZfbWFsbG9jX2FycmF5KHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpOworCisvKioKKyAqIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIGZvciBhbiBhcnJheSB3aXRoIGF2X21hbGxvY3ooKS4KKyAqCisgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSB3aWxsIGhhdmUgc2l6ZSBgc2l6ZSAqIG5tZW1iYCBieXRlcy4KKyAqCisgKiBAcGFyYW0gbm1lbWIgTnVtYmVyIG9mIGVsZW1lbnRzCisgKiBAcGFyYW0gc2l6ZSAgU2l6ZSBvZiB0aGUgc2luZ2xlIGVsZW1lbnQKKyAqIEByZXR1cm4gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJsb2NrLCBvciBgTlVMTGAgaWYgdGhlIGJsb2NrIGNhbm5vdAorICogICAgICAgICBiZSBhbGxvY2F0ZWQKKyAqCisgKiBAc2VlIGF2X21hbGxvY3ooKQorICogQHNlZSBhdl9tYWxsb2NfYXJyYXkoKQorICovCithdl9hbGxvY19zaXplKDEsIDIpIHZvaWQgKmF2X21hbGxvY3pfYXJyYXkoc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7CisKKy8qKgorICogTm9uLWlubGluZWQgZXF1aXZhbGVudCBvZiBhdl9tYWxsb2N6X2FycmF5KCkuCisgKgorICogQ3JlYXRlZCBmb3Igc3ltbWV0cnkgd2l0aCB0aGUgY2FsbG9jKCkgQyBmdW5jdGlvbi4KICAqLwogdm9pZCAqYXZfY2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpIGF2X21hbGxvY19hdHRyaWI7CiAKIC8qKgotICogQWxsb2NhdGUgYSBibG9jayBvZiBzaXplICogbm1lbWIgYnl0ZXMgd2l0aCBhdl9tYWxsb2N6KCkuCi0gKiBAcGFyYW0gbm1lbWIgTnVtYmVyIG9mIGVsZW1lbnRzCi0gKiBAcGFyYW0gc2l6ZSBTaXplIG9mIHRoZSBzaW5nbGUgZWxlbWVudAotICogQHJldHVybiBQb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgYmxvY2ssIE5VTEwgaWYgdGhlIGJsb2NrIGNhbm5vdAotICogYmUgYWxsb2NhdGVkLgotICogQHNlZSBhdl9tYWxsb2N6KCkKLSAqIEBzZWUgYXZfbWFsbG9jX2FycmF5KCkKKyAqIEFsbG9jYXRlLCByZWFsbG9jYXRlLCBvciBmcmVlIGEgYmxvY2sgb2YgbWVtb3J5LgorICoKKyAqIElmIGBwdHJgIGlzIGBOVUxMYCBhbmQgYHNpemVgID4gMCwgYWxsb2NhdGUgYSBuZXcgYmxvY2suIElmIGBzaXplYCBpcworICogemVybywgZnJlZSB0aGUgbWVtb3J5IGJsb2NrIHBvaW50ZWQgdG8gYnkgYHB0cmAuIE90aGVyd2lzZSwgZXhwYW5kIG9yCisgKiBzaHJpbmsgdGhhdCBibG9jayBvZiBtZW1vcnkgYWNjb3JkaW5nIHRvIGBzaXplYC4KKyAqCisgKiBAcGFyYW0gcHRyICBQb2ludGVyIHRvIGEgbWVtb3J5IGJsb2NrIGFscmVhZHkgYWxsb2NhdGVkIHdpdGgKKyAqICAgICAgICAgICAgIGF2X3JlYWxsb2MoKSBvciBgTlVMTGAKKyAqIEBwYXJhbSBzaXplIFNpemUgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSBibG9jayB0byBiZSBhbGxvY2F0ZWQgb3IKKyAqICAgICAgICAgICAgIHJlYWxsb2NhdGVkCisgKgorICogQHJldHVybiBQb2ludGVyIHRvIGEgbmV3bHktcmVhbGxvY2F0ZWQgYmxvY2sgb3IgYE5VTExgIGlmIHRoZSBibG9jaworICogICAgICAgICBjYW5ub3QgYmUgcmVhbGxvY2F0ZWQgb3IgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGJsb2NrCisgKgorICogQHdhcm5pbmcgVW5saWtlIGF2X21hbGxvYygpLCB0aGUgcmV0dXJuZWQgcG9pbnRlciBpcyBub3QgZ3VhcmFudGVlZCB0byBiZQorICogICAgICAgICAgY29ycmVjdGx5IGFsaWduZWQuCisgKiBAc2VlIGF2X2Zhc3RfcmVhbGxvYygpCisgKiBAc2VlIGF2X3JlYWxsb2NwKCkKICAqLwotYXZfYWxsb2Nfc2l6ZSgxLCAyKSBzdGF0aWMgaW5saW5lIHZvaWQgKmF2X21hbGxvY3pfYXJyYXkoc2l6ZV90IG5tZW1iLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBpZiAoIXNpemUgfHwgbm1lbWIgPj0gSU5UX01BWCAvIHNpemUpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHJldHVybiBhdl9tYWxsb2N6KG5tZW1iICogc2l6ZSk7Ci19Cit2b2lkICphdl9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpIGF2X2FsbG9jX3NpemUoMik7CiAKIC8qKgotICogRHVwbGljYXRlIHRoZSBzdHJpbmcgcy4KLSAqIEBwYXJhbSBzIHN0cmluZyB0byBiZSBkdXBsaWNhdGVkCi0gKiBAcmV0dXJuIFBvaW50ZXIgdG8gYSBuZXdseS1hbGxvY2F0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgYQotICogY29weSBvZiBzIG9yIE5VTEwgaWYgdGhlIHN0cmluZyBjYW5ub3QgYmUgYWxsb2NhdGVkLgorICogQWxsb2NhdGUsIHJlYWxsb2NhdGUsIG9yIGZyZWUgYSBibG9jayBvZiBtZW1vcnkgdGhyb3VnaCBhIHBvaW50ZXIgdG8gYQorICogcG9pbnRlci4KKyAqCisgKiBJZiBgKnB0cmAgaXMgYE5VTExgIGFuZCBgc2l6ZWAgPiAwLCBhbGxvY2F0ZSBhIG5ldyBibG9jay4gSWYgYHNpemVgIGlzCisgKiB6ZXJvLCBmcmVlIHRoZSBtZW1vcnkgYmxvY2sgcG9pbnRlZCB0byBieSBgKnB0cmAuIE90aGVyd2lzZSwgZXhwYW5kIG9yCisgKiBzaHJpbmsgdGhhdCBibG9jayBvZiBtZW1vcnkgYWNjb3JkaW5nIHRvIGBzaXplYC4KKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwdHIgIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIGEgbWVtb3J5IGJsb2NrIGFscmVhZHkgYWxsb2NhdGVkCisgKiAgICAgICAgICAgICAgICAgICAgIHdpdGggYXZfcmVhbGxvYygpLCBvciBhIHBvaW50ZXIgdG8gYE5VTExgLiBUaGUgcG9pbnRlcgorICogICAgICAgICAgICAgICAgICAgICBpcyB1cGRhdGVkIG9uIHN1Y2Nlc3MsIG9yIGZyZWVkIG9uIGZhaWx1cmUuCisgKiBAcGFyYW1baW5dICAgICBzaXplIFNpemUgaW4gYnl0ZXMgZm9yIHRoZSBtZW1vcnkgYmxvY2sgdG8gYmUgYWxsb2NhdGVkIG9yCisgKiAgICAgICAgICAgICAgICAgICAgIHJlYWxsb2NhdGVkCisgKgorICogQHJldHVybiBaZXJvIG9uIHN1Y2Nlc3MsIGFuIEFWRVJST1IgZXJyb3IgY29kZSBvbiBmYWlsdXJlCisgKgorICogQHdhcm5pbmcgVW5saWtlIGF2X21hbGxvYygpLCB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZQorICogICAgICAgICAgY29ycmVjdGx5IGFsaWduZWQuCiAgKi8KLWNoYXIgKmF2X3N0cmR1cChjb25zdCBjaGFyICpzKSBhdl9tYWxsb2NfYXR0cmliOworYXZfd2Fybl91bnVzZWRfcmVzdWx0CitpbnQgYXZfcmVhbGxvY3Aodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CiAKIC8qKgotICogRHVwbGljYXRlIGEgc3Vic3RyaW5nIG9mIHRoZSBzdHJpbmcgcy4KLSAqIEBwYXJhbSBzIHN0cmluZyB0byBiZSBkdXBsaWNhdGVkCi0gKiBAcGFyYW0gbGVuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZyAobm90IGNvdW50aW5nIHRoZQotICogICAgICAgICAgICB0ZXJtaW5hdGluZyBieXRlKS4KLSAqIEByZXR1cm4gUG9pbnRlciB0byBhIG5ld2x5LWFsbG9jYXRlZCBzdHJpbmcgY29udGFpbmluZyBhCi0gKiBjb3B5IG9mIHMgb3IgTlVMTCBpZiB0aGUgc3RyaW5nIGNhbm5vdCBiZSBhbGxvY2F0ZWQuCisgKiBBbGxvY2F0ZSwgcmVhbGxvY2F0ZSwgb3IgZnJlZSBhIGJsb2NrIG9mIG1lbW9yeS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgdGhlIHNhbWUgdGhpbmcgYXMgYXZfcmVhbGxvYygpLCBleGNlcHQ6CisgKiAtIEl0IHRha2VzIHR3byBzaXplIGFyZ3VtZW50cyBhbmQgYWxsb2NhdGVzIGBuZWxlbSAqIGVsc2l6ZWAgYnl0ZXMsCisgKiAgIGFmdGVyIGNoZWNraW5nIHRoZSByZXN1bHQgb2YgdGhlIG11bHRpcGxpY2F0aW9uIGZvciBpbnRlZ2VyIG92ZXJmbG93LgorICogLSBJdCBmcmVlcyB0aGUgaW5wdXQgYmxvY2sgaW4gY2FzZSBvZiBmYWlsdXJlLCB0aHVzIGF2b2lkaW5nIHRoZSBtZW1vcnkKKyAqICAgbGVhayB3aXRoIHRoZSBjbGFzc2ljCisgKiAgIEBjb2Rley5jfQorICogICBidWYgPSByZWFsbG9jKGJ1Zik7CisgKiAgIGlmICghYnVmKQorICogICAgICAgcmV0dXJuIC0xOworICogICBAZW5kY29kZQorICogICBwYXR0ZXJuLgogICovCi1jaGFyICphdl9zdHJuZHVwKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pIGF2X21hbGxvY19hdHRyaWI7Cit2b2lkICphdl9yZWFsbG9jX2Yodm9pZCAqcHRyLCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUpOwogCiAvKioKLSAqIER1cGxpY2F0ZSB0aGUgYnVmZmVyIHAuCi0gKiBAcGFyYW0gcCBidWZmZXIgdG8gYmUgZHVwbGljYXRlZAotICogQHJldHVybiBQb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBjb250YWluaW5nIGEKLSAqIGNvcHkgb2YgcCBvciBOVUxMIGlmIHRoZSBidWZmZXIgY2Fubm90IGJlIGFsbG9jYXRlZC4KKyAqIEFsbG9jYXRlLCByZWFsbG9jYXRlLCBvciBmcmVlIGFuIGFycmF5LgorICoKKyAqIElmIGBwdHJgIGlzIGBOVUxMYCBhbmQgYG5tZW1iYCA+IDAsIGFsbG9jYXRlIGEgbmV3IGJsb2NrLiBJZgorICogYG5tZW1iYCBpcyB6ZXJvLCBmcmVlIHRoZSBtZW1vcnkgYmxvY2sgcG9pbnRlZCB0byBieSBgcHRyYC4KKyAqCisgKiBAcGFyYW0gcHRyICAgUG9pbnRlciB0byBhIG1lbW9yeSBibG9jayBhbHJlYWR5IGFsbG9jYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgYXZfcmVhbGxvYygpIG9yIGBOVUxMYAorICogQHBhcmFtIG5tZW1iIE51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBzaXplICBTaXplIG9mIHRoZSBzaW5nbGUgZWxlbWVudCBvZiB0aGUgYXJyYXkKKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gYSBuZXdseS1yZWFsbG9jYXRlZCBibG9jayBvciBOVUxMIGlmIHRoZSBibG9jaworICogICAgICAgICBjYW5ub3QgYmUgcmVhbGxvY2F0ZWQgb3IgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZnJlZSB0aGUgbWVtb3J5IGJsb2NrCisgKgorICogQHdhcm5pbmcgVW5saWtlIGF2X21hbGxvYygpLCB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZQorICogICAgICAgICAgY29ycmVjdGx5IGFsaWduZWQuCisgKiBAc2VlIGF2X3JlYWxsb2NwX2FycmF5KCkKICAqLwotdm9pZCAqYXZfbWVtZHVwKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplKTsKK2F2X2FsbG9jX3NpemUoMiwgMykgdm9pZCAqYXZfcmVhbGxvY19hcnJheSh2b2lkICpwdHIsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpOwogCiAvKioKLSAqIEZyZWUgYSBtZW1vcnkgYmxvY2sgd2hpY2ggaGFzIGJlZW4gYWxsb2NhdGVkIHdpdGggYXZfbWFsbG9jKHopKCkgb3IKLSAqIGF2X3JlYWxsb2MoKSBhbmQgc2V0IHRoZSBwb2ludGVyIHBvaW50aW5nIHRvIGl0IHRvIE5VTEwuCi0gKiBAcGFyYW0gcHRyIFBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jayB3aGljaCBzaG91bGQKLSAqIGJlIGZyZWVkLgotICogQG5vdGUgcGFzc2luZyBhIHBvaW50ZXIgdG8gYSBOVUxMIHBvaW50ZXIgaXMgc2FmZSBhbmQgbGVhZHMgdG8gbm8gYWN0aW9uLgorICogQWxsb2NhdGUsIHJlYWxsb2NhdGUsIG9yIGZyZWUgYW4gYXJyYXkgdGhyb3VnaCBhIHBvaW50ZXIgdG8gYSBwb2ludGVyLgorICoKKyAqIElmIGAqcHRyYCBpcyBgTlVMTGAgYW5kIGBubWVtYmAgPiAwLCBhbGxvY2F0ZSBhIG5ldyBibG9jay4gSWYgYG5tZW1iYCBpcworICogemVybywgZnJlZSB0aGUgbWVtb3J5IGJsb2NrIHBvaW50ZWQgdG8gYnkgYCpwdHJgLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHB0ciAgIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIGEgbWVtb3J5IGJsb2NrIGFscmVhZHkKKyAqICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCB3aXRoIGF2X3JlYWxsb2MoKSwgb3IgYSBwb2ludGVyIHRvIGBOVUxMYC4KKyAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBwb2ludGVyIGlzIHVwZGF0ZWQgb24gc3VjY2Vzcywgb3IgZnJlZWQgb24gZmFpbHVyZS4KKyAqIEBwYXJhbVtpbl0gICAgIG5tZW1iIE51bWJlciBvZiBlbGVtZW50cworICogQHBhcmFtW2luXSAgICAgc2l6ZSAgU2l6ZSBvZiB0aGUgc2luZ2xlIGVsZW1lbnQKKyAqCisgKiBAcmV0dXJuIFplcm8gb24gc3VjY2VzcywgYW4gQVZFUlJPUiBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqCisgKiBAd2FybmluZyBVbmxpa2UgYXZfbWFsbG9jKCksIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlCisgKiAgICAgICAgICBjb3JyZWN0bHkgYWxpZ25lZC4KKyAqLworYXZfYWxsb2Nfc2l6ZSgyLCAzKSBpbnQgYXZfcmVhbGxvY3BfYXJyYXkodm9pZCAqcHRyLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBSZWFsbG9jYXRlIHRoZSBnaXZlbiBidWZmZXIgaWYgaXQgaXMgbm90IGxhcmdlIGVub3VnaCwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcuCisgKgorICogSWYgdGhlIGdpdmVuIGJ1ZmZlciBpcyBgTlVMTGAsIHRoZW4gYSBuZXcgdW5pbml0aWFsaXplZCBidWZmZXIgaXMgYWxsb2NhdGVkLgorICoKKyAqIElmIHRoZSBnaXZlbiBidWZmZXIgaXMgbm90IGxhcmdlIGVub3VnaCwgYW5kIHJlYWxsb2NhdGlvbiBmYWlscywgYE5VTExgIGlzCisgKiByZXR1cm5lZCBhbmQgYCpzaXplYCBpcyBzZXQgdG8gMCwgYnV0IHRoZSBvcmlnaW5hbCBidWZmZXIgaXMgbm90IGNoYW5nZWQgb3IKKyAqIGZyZWVkLgorICoKKyAqIEEgdHlwaWNhbCB1c2UgcGF0dGVybiBmb2xsb3dzOgorICoKKyAqIEBjb2Rley5jfQorICogdWludDhfdCAqYnVmID0gLi4uOworICogdWludDhfdCAqbmV3X2J1ZiA9IGF2X2Zhc3RfcmVhbGxvYyhidWYsICZjdXJyZW50X3NpemUsIHNpemVfbmVlZGVkKTsKKyAqIGlmICghbmV3X2J1ZikgeworICogICAgIC8vIEFsbG9jYXRpb24gZmFpbGVkOyBjbGVhbiB1cCBvcmlnaW5hbCBidWZmZXIKKyAqICAgICBhdl9mcmVlcCgmYnVmKTsKKyAqICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICogfQorICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW1baW4sb3V0XSBwdHIgICAgICBBbHJlYWR5IGFsbG9jYXRlZCBidWZmZXIsIG9yIGBOVUxMYAorICogQHBhcmFtW2luLG91dF0gc2l6ZSAgICAgUG9pbnRlciB0byBjdXJyZW50IHNpemUgb2YgYnVmZmVyIGBwdHJgLiBgKnNpemVgIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHRvIGBtaW5fc2l6ZWAgaW4gY2FzZSBvZiBzdWNjZXNzIG9yIDAgaW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2Ugb2YgZmFpbHVyZQorICogQHBhcmFtW2luXSAgICAgbWluX3NpemUgTmV3IHNpemUgb2YgYnVmZmVyIGBwdHJgCisgKiBAcmV0dXJuIGBwdHJgIGlmIHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoLCBhIHBvaW50ZXIgdG8gbmV3bHkgcmVhbGxvY2F0ZWQKKyAqICAgICAgICAgYnVmZmVyIGlmIHRoZSBidWZmZXIgd2FzIG5vdCBsYXJnZSBlbm91Z2gsIG9yIGBOVUxMYCBpbiBjYXNlIG9mCisgKiAgICAgICAgIGVycm9yCisgKiBAc2VlIGF2X3JlYWxsb2MoKQorICogQHNlZSBhdl9mYXN0X21hbGxvYygpCisgKi8KK3ZvaWQgKmF2X2Zhc3RfcmVhbGxvYyh2b2lkICpwdHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgc2l6ZV90IG1pbl9zaXplKTsKKworLyoqCisgKiBBbGxvY2F0ZSBhIGJ1ZmZlciwgcmV1c2luZyB0aGUgZ2l2ZW4gb25lIGlmIGxhcmdlIGVub3VnaC4KKyAqCisgKiBDb250cmFyeSB0byBhdl9mYXN0X3JlYWxsb2MoKSwgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG1pZ2h0IG5vdCBiZQorICogcHJlc2VydmVkIGFuZCBvbiBlcnJvciB0aGUgb2xkIGJ1ZmZlciBpcyBmcmVlZCwgdGh1cyBubyBzcGVjaWFsIGhhbmRsaW5nIHRvCisgKiBhdm9pZCBtZW1sZWFrcyBpcyBuZWNlc3NhcnkuCisgKgorICogYCpwdHJgIGlzIGFsbG93ZWQgdG8gYmUgYE5VTExgLCBpbiB3aGljaCBjYXNlIGFsbG9jYXRpb24gYWx3YXlzIGhhcHBlbnMgaWYKKyAqIGBzaXplX25lZWRlZGAgaXMgZ3JlYXRlciB0aGFuIDAuCisgKgorICogQGNvZGV7LmN9CisgKiB1aW50OF90ICpidWYgPSAuLi47CisgKiBhdl9mYXN0X21hbGxvYygmYnVmLCAmY3VycmVudF9zaXplLCBzaXplX25lZWRlZCk7CisgKiBpZiAoIWJ1ZikgeworICogICAgIC8vIEFsbG9jYXRpb24gZmFpbGVkOyBidWYgYWxyZWFkeSBmcmVlZAorICogICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgKiB9CisgKiBAZW5kY29kZQorICoKKyAqIEBwYXJhbVtpbixvdXRdIHB0ciAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byBhbiBhbHJlYWR5IGFsbG9jYXRlZCBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBgKnB0cmAgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHBvaW50ZXIgdG8gbmV3CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgb24gc3VjY2VzcyBvciBgTlVMTGAgb24gZmFpbHVyZQorICogQHBhcmFtW2luLG91dF0gc2l6ZSAgICAgUG9pbnRlciB0byBjdXJyZW50IHNpemUgb2YgYnVmZmVyIGAqcHRyYC4gYCpzaXplYCBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB0byBgbWluX3NpemVgIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciAwIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG9mIGZhaWx1cmUKKyAqIEBwYXJhbVtpbl0gICAgIG1pbl9zaXplIE5ldyBzaXplIG9mIGJ1ZmZlciBgKnB0cmAKKyAqIEBzZWUgYXZfcmVhbGxvYygpCisgKiBAc2VlIGF2X2Zhc3RfbWFsbG9jeigpCisgKi8KK3ZvaWQgYXZfZmFzdF9tYWxsb2Modm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgKnNpemUsIHNpemVfdCBtaW5fc2l6ZSk7CisKKy8qKgorICogQWxsb2NhdGUgYW5kIGNsZWFyIGEgYnVmZmVyLCByZXVzaW5nIHRoZSBnaXZlbiBvbmUgaWYgbGFyZ2UgZW5vdWdoLgorICoKKyAqIExpa2UgYXZfZmFzdF9tYWxsb2MoKSwgYnV0IGFsbCBuZXdseSBhbGxvY2F0ZWQgc3BhY2UgaXMgaW5pdGlhbGx5IGNsZWFyZWQuCisgKiBSZXVzZWQgYnVmZmVyIGlzIG5vdCBjbGVhcmVkLgorICoKKyAqIGAqcHRyYCBpcyBhbGxvd2VkIHRvIGJlIGBOVUxMYCwgaW4gd2hpY2ggY2FzZSBhbGxvY2F0aW9uIGFsd2F5cyBoYXBwZW5zIGlmCisgKiBgc2l6ZV9uZWVkZWRgIGlzIGdyZWF0ZXIgdGhhbiAwLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIHB0ciAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byBhbiBhbHJlYWR5IGFsbG9jYXRlZCBidWZmZXIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBgKnB0cmAgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHBvaW50ZXIgdG8gbmV3CisgKiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgb24gc3VjY2VzcyBvciBgTlVMTGAgb24gZmFpbHVyZQorICogQHBhcmFtW2luLG91dF0gc2l6ZSAgICAgUG9pbnRlciB0byBjdXJyZW50IHNpemUgb2YgYnVmZmVyIGAqcHRyYC4gYCpzaXplYCBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCB0byBgbWluX3NpemVgIGluIGNhc2Ugb2Ygc3VjY2VzcyBvciAwIGluCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIG9mIGZhaWx1cmUKKyAqIEBwYXJhbVtpbl0gICAgIG1pbl9zaXplIE5ldyBzaXplIG9mIGJ1ZmZlciBgKnB0cmAKKyAqIEBzZWUgYXZfZmFzdF9tYWxsb2MoKQorICovCit2b2lkIGF2X2Zhc3RfbWFsbG9jeih2b2lkICpwdHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgc2l6ZV90IG1pbl9zaXplKTsKKworLyoqCisgKiBGcmVlIGEgbWVtb3J5IGJsb2NrIHdoaWNoIGhhcyBiZWVuIGFsbG9jYXRlZCB3aXRoIGEgZnVuY3Rpb24gb2YgYXZfbWFsbG9jKCkKKyAqIG9yIGF2X3JlYWxsb2MoKSBmYW1pbHkuCisgKgorICogQHBhcmFtIHB0ciBQb2ludGVyIHRvIHRoZSBtZW1vcnkgYmxvY2sgd2hpY2ggc2hvdWxkIGJlIGZyZWVkLgorICoKKyAqIEBub3RlIGBwdHIgPSBOVUxMYCBpcyBleHBsaWNpdGx5IGFsbG93ZWQuCisgKiBAbm90ZSBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgYXZfZnJlZXAoKSBpbnN0ZWFkLCB0byBwcmV2ZW50IGxlYXZpbmcKKyAqICAgICAgIGJlaGluZCBkYW5nbGluZyBwb2ludGVycy4KKyAqIEBzZWUgYXZfZnJlZXAoKQorICovCit2b2lkIGF2X2ZyZWUodm9pZCAqcHRyKTsKKworLyoqCisgKiBGcmVlIGEgbWVtb3J5IGJsb2NrIHdoaWNoIGhhcyBiZWVuIGFsbG9jYXRlZCB3aXRoIGEgZnVuY3Rpb24gb2YgYXZfbWFsbG9jKCkKKyAqIG9yIGF2X3JlYWxsb2MoKSBmYW1pbHksIGFuZCBzZXQgdGhlIHBvaW50ZXIgcG9pbnRpbmcgdG8gaXQgdG8gYE5VTExgLgorICoKKyAqIEBjb2Rley5jfQorICogdWludDhfdCAqYnVmID0gYXZfbWFsbG9jKDE2KTsKKyAqIGF2X2ZyZWUoYnVmKTsKKyAqIC8vIGJ1ZiBub3cgY29udGFpbnMgYSBkYW5nbGluZyBwb2ludGVyIHRvIGZyZWVkIG1lbW9yeSwgYW5kIGFjY2lkZW50YWwKKyAqIC8vIGRlcmVmZXJlbmNlIG9mIGJ1ZiB3aWxsIHJlc3VsdCBpbiBhIHVzZS1hZnRlci1mcmVlLCB3aGljaCBtYXkgYmUgYQorICogLy8gc2VjdXJpdHkgcmlzay4KKyAqCisgKiB1aW50OF90ICpidWYgPSBhdl9tYWxsb2MoMTYpOworICogYXZfZnJlZXAoJmJ1Zik7CisgKiAvLyBidWYgaXMgbm93IE5VTEwsIGFuZCBhY2NpZGVudGFsIGRlcmVmZXJlbmNlIHdpbGwgb25seSByZXN1bHQgaW4gYQorICogLy8gTlVMTC1wb2ludGVyIGRlcmVmZXJlbmNlLgorICogQGVuZGNvZGUKKyAqCisgKiBAcGFyYW0gcHRyIFBvaW50ZXIgdG8gdGhlIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBibG9jayB3aGljaCBzaG91bGQgYmUgZnJlZWQKKyAqIEBub3RlIGAqcHRyID0gTlVMTGAgaXMgc2FmZSBhbmQgbGVhZHMgdG8gbm8gYWN0aW9uLgogICogQHNlZSBhdl9mcmVlKCkKICAqLwogdm9pZCBhdl9mcmVlcCh2b2lkICpwdHIpOwogCiAvKioKLSAqIEFkZCBhbiBlbGVtZW50IHRvIGEgZHluYW1pYyBhcnJheS4KKyAqIER1cGxpY2F0ZSBhIHN0cmluZy4KKyAqCisgKiBAcGFyYW0gcyBTdHJpbmcgdG8gYmUgZHVwbGljYXRlZAorICogQHJldHVybiBQb2ludGVyIHRvIGEgbmV3bHktYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIGEKKyAqICAgICAgICAgY29weSBvZiBgc2Agb3IgYE5VTExgIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlIGFsbG9jYXRlZAorICogQHNlZSBhdl9zdHJuZHVwKCkKKyAqLworY2hhciAqYXZfc3RyZHVwKGNvbnN0IGNoYXIgKnMpIGF2X21hbGxvY19hdHRyaWI7CisKKy8qKgorICogRHVwbGljYXRlIGEgc3Vic3RyaW5nIG9mIGEgc3RyaW5nLgorICoKKyAqIEBwYXJhbSBzICAgU3RyaW5nIHRvIGJlIGR1cGxpY2F0ZWQKKyAqIEBwYXJhbSBsZW4gTWF4aW11bSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZyBzdHJpbmcgKG5vdCBjb3VudGluZyB0aGUKKyAqICAgICAgICAgICAgdGVybWluYXRpbmcgYnl0ZSkKKyAqIEByZXR1cm4gUG9pbnRlciB0byBhIG5ld2x5LWFsbG9jYXRlZCBzdHJpbmcgY29udGFpbmluZyBhCisgKiAgICAgICAgIHN1YnN0cmluZyBvZiBgc2Agb3IgYE5VTExgIGlmIHRoZSBzdHJpbmcgY2Fubm90IGJlIGFsbG9jYXRlZAorICovCitjaGFyICphdl9zdHJuZHVwKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pIGF2X21hbGxvY19hdHRyaWI7CisKKy8qKgorICogRHVwbGljYXRlIGEgYnVmZmVyIHdpdGggYXZfbWFsbG9jKCkuCisgKgorICogQHBhcmFtIHAgICAgQnVmZmVyIHRvIGJlIGR1cGxpY2F0ZWQKKyAqIEBwYXJhbSBzaXplIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGJ1ZmZlciBjb3BpZWQKKyAqIEByZXR1cm4gUG9pbnRlciB0byBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgY29udGFpbmluZyBhCisgKiAgICAgICAgIGNvcHkgb2YgYHBgIG9yIGBOVUxMYCBpZiB0aGUgYnVmZmVyIGNhbm5vdCBiZSBhbGxvY2F0ZWQKKyAqLwordm9pZCAqYXZfbWVtZHVwKGNvbnN0IHZvaWQgKnAsIHNpemVfdCBzaXplKTsKKworLyoqCisgKiBPdmVybGFwcGluZyBtZW1jcHkoKSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAcGFyYW0gZHN0ICBEZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbSBiYWNrIE51bWJlciBvZiBieXRlcyBiYWNrIHRvIHN0YXJ0IGNvcHlpbmcgKGkuZS4gdGhlIGluaXRpYWwgc2l6ZSBvZgorICogICAgICAgICAgICAgdGhlIG92ZXJsYXBwaW5nIHdpbmRvdyk7IG11c3QgYmUgPiAwCisgKiBAcGFyYW0gY250ICBOdW1iZXIgb2YgYnl0ZXMgdG8gY29weTsgbXVzdCBiZSA+PSAwCisgKgorICogQG5vdGUgYGNudCA+IGJhY2tgIGlzIHZhbGlkLCB0aGlzIHdpbGwgY29weSB0aGUgYnl0ZXMgd2UganVzdCBjb3BpZWQsCisgKiAgICAgICB0aHVzIGNyZWF0aW5nIGEgcmVwZWF0aW5nIHBhdHRlcm4gd2l0aCBhIHBlcmlvZCBsZW5ndGggb2YgYGJhY2tgLgorICovCit2b2lkIGF2X21lbWNweV9iYWNrcHRyKHVpbnQ4X3QgKmRzdCwgaW50IGJhY2ssIGludCBjbnQpOworCisvKioKKyAqIEB9CisgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGF2dV9tZW1fZHluYXJyYXkgRHluYW1pYyBBcnJheQorICoKKyAqIFV0aWxpdGllcyB0byBtYWtlIGFuIGFycmF5IGdyb3cgd2hlbiBuZWVkZWQuCisgKgorICogU29tZXRpbWVzLCB0aGUgcHJvZ3JhbW1lciB3b3VsZCB3YW50IHRvIGhhdmUgYW4gYXJyYXkgdGhhdCBjYW4gZ3JvdyB3aGVuCisgKiBuZWVkZWQuIFRoZSBsaWJhdnV0aWwgZHluYW1pYyBhcnJheSB1dGlsaXRpZXMgZmlsbCB0aGF0IG5lZWQuCisgKgorICogbGliYXZ1dGlsIHN1cHBvcnRzIHR3byBzeXN0ZW1zIG9mIGFwcGVuZGluZyBlbGVtZW50cyBvbnRvIGEgZHluYW1pY2FsbHkKKyAqIGFsbG9jYXRlZCBhcnJheSwgdGhlIGZpcnN0IG9uZSBzdG9yaW5nIHRoZSBwb2ludGVyIHRvIHRoZSB2YWx1ZSBpbiB0aGUKKyAqIGFycmF5LCBhbmQgdGhlIHNlY29uZCBzdG9yaW5nIHRoZSB2YWx1ZSBkaXJlY3RseS4gSW4gYm90aCBzeXN0ZW1zLCB0aGUKKyAqIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgbWFpbnRhaW5pbmcgYSB2YXJpYWJsZSBjb250YWluaW5nIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBhcnJheSwgYXMgd2VsbCBhcyBmcmVlaW5nIG9mIHRoZSBhcnJheSBhZnRlciB1c2UuCisgKgorICogVGhlIGZpcnN0IHN5c3RlbSBzdG9yZXMgcG9pbnRlcnMgdG8gdmFsdWVzIGluIGEgYmxvY2sgb2YgZHluYW1pY2FsbHkKKyAqIGFsbG9jYXRlZCBtZW1vcnkuIFNpbmNlIG9ubHkgcG9pbnRlcnMgYXJlIHN0b3JlZCwgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IG5lZWQKKyAqIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIHR5cGUuIEJvdGggYXZfZHluYXJyYXlfYWRkKCkgYW5kCisgKiBhdl9keW5hcnJheV9hZGRfbm9mcmVlKCkgaW1wbGVtZW50IHRoaXMgc3lzdGVtLgorICoKKyAqIEBjb2RlCisgKiB0eXBlICoqYXJyYXkgPSBOVUxMOyAvLzwgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdmFsdWVzCisgKiBpbnQgICAgbmIgICAgPSAwOyAgICAvLzwgYSB2YXJpYWJsZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5CisgKgorICogdHlwZSB0b19iZV9hZGRlZCAgPSAuLi47CisgKiB0eXBlIHRvX2JlX2FkZGVkMiA9IC4uLjsKKyAqCisgKiBhdl9keW5hcnJheV9hZGQoJmFycmF5LCAmbmIsICZ0b19iZV9hZGRlZCk7CisgKiBpZiAobmIgPT0gMCkKKyAqICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICoKKyAqIGF2X2R5bmFycmF5X2FkZCgmYXJyYXksICZuYiwgJnRvX2JlX2FkZGVkMik7CisgKiBpZiAobmIgPT0gMCkKKyAqICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICoKKyAqIC8vIE5vdzoKKyAqIC8vICBuYiAgICAgICAgICAgPT0gMgorICogLy8gJnRvX2JlX2FkZGVkICA9PSBhcnJheVswXQorICogLy8gJnRvX2JlX2FkZGVkMiA9PSBhcnJheVsxXQorICoKKyAqIGF2X2ZyZWVwKCZhcnJheSk7CisgKiBAZW5kY29kZQorICoKKyAqIFRoZSBzZWNvbmQgc3lzdGVtIHN0b3JlcyB0aGUgdmFsdWUgZGlyZWN0bHkgaW4gYSBibG9jayBvZiBtZW1vcnkuIEFzIGEKKyAqIHJlc3VsdCwgdGhlIGZ1bmN0aW9uIGhhcyB0byBrbm93IHRoZSBzaXplIG9mIHRoZSB0eXBlLiBhdl9keW5hcnJheTJfYWRkKCkKKyAqIGltcGxlbWVudHMgdGhpcyBtZWNoYW5pc20uCisgKgorICogQGNvZGUKKyAqIHR5cGUgKmFycmF5ID0gTlVMTDsgLy88IGFuIGFycmF5IG9mIHZhbHVlcworICogaW50ICAgbmIgICAgPSAwOyAgICAvLzwgYSB2YXJpYWJsZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5CisgKgorICogdHlwZSB0b19iZV9hZGRlZCAgPSAuLi47CisgKiB0eXBlIHRvX2JlX2FkZGVkMiA9IC4uLjsKKyAqCisgKiB0eXBlICphZGRyID0gYXZfZHluYXJyYXkyX2FkZCgodm9pZCAqKikmYXJyYXksICZuYiwgc2l6ZW9mKCphcnJheSksIE5VTEwpOworICogaWYgKCFhZGRyKQorICogICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgKiBtZW1jcHkoYWRkciwgJnRvX2JlX2FkZGVkLCBzaXplb2YodG9fYmVfYWRkZWQpKTsKKyAqCisgKiAvLyBTaG9ydGN1dCBvZiB0aGUgYWJvdmUuCisgKiB0eXBlICphZGRyID0gYXZfZHluYXJyYXkyX2FkZCgodm9pZCAqKikmYXJyYXksICZuYiwgc2l6ZW9mKCphcnJheSksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3Qgdm9pZCAqKSZ0b19iZV9hZGRlZDIpOworICogaWYgKCFhZGRyKQorICogICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgKgorICogLy8gTm93OgorICogLy8gIG5iICAgICAgICAgICA9PSAyCisgKiAvLyAgdG9fYmVfYWRkZWQgID09IGFycmF5WzBdCisgKiAvLyAgdG9fYmVfYWRkZWQyID09IGFycmF5WzFdCisgKgorICogYXZfZnJlZXAoJmFycmF5KTsKKyAqIEBlbmRjb2RlCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEFkZCB0aGUgcG9pbnRlciB0byBhbiBlbGVtZW50IHRvIGEgZHluYW1pYyBhcnJheS4KICAqCiAgKiBUaGUgYXJyYXkgdG8gZ3JvdyBpcyBzdXBwb3NlZCB0byBiZSBhbiBhcnJheSBvZiBwb2ludGVycyB0bwogICogc3RydWN0dXJlcywgYW5kIHRoZSBlbGVtZW50IHRvIGFkZCBtdXN0IGJlIGEgcG9pbnRlciB0byBhbiBhbHJlYWR5CkBAIC0yODAsMTQgKzU5NiwxNCBAQAogICogVGhlcmVmb3JlLCB0aGUgYW1vcnRpemVkIGNvc3Qgb2YgYWRkaW5nIGFuIGVsZW1lbnQgaXMgY29uc3RhbnQuCiAgKgogICogSW4gY2FzZSBvZiBzdWNjZXNzLCB0aGUgcG9pbnRlciB0byB0aGUgYXJyYXkgaXMgdXBkYXRlZCBpbiBvcmRlciB0bwotICogcG9pbnQgdG8gdGhlIG5ldyBncm93biBhcnJheSwgYW5kIHRoZSBudW1iZXIgcG9pbnRlZCB0byBieSBuYl9wdHIKKyAqIHBvaW50IHRvIHRoZSBuZXcgZ3Jvd24gYXJyYXksIGFuZCB0aGUgbnVtYmVyIHBvaW50ZWQgdG8gYnkgYG5iX3B0cmAKICAqIGlzIGluY3JlbWVudGVkLgotICogSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgYXJyYXkgaXMgZnJlZWQsICp0YWJfcHRyIGlzIHNldCB0byBOVUxMIGFuZAotICogKm5iX3B0ciBpcyBzZXQgdG8gMC4KKyAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhlIGFycmF5IGlzIGZyZWVkLCBgKnRhYl9wdHJgIGlzIHNldCB0byBgTlVMTGAgYW5kCisgKiBgKm5iX3B0cmAgaXMgc2V0IHRvIDAuCiAgKgotICogQHBhcmFtIHRhYl9wdHIgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZ3JvdwotICogQHBhcmFtIG5iX3B0ciAgcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICogQHBhcmFtIGVsZW0gICAgZWxlbWVudCB0byBhZGQKKyAqIEBwYXJhbVtpbixvdXRdIHRhYl9wdHIgUG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZ3JvdworICogQHBhcmFtW2luLG91dF0gbmJfcHRyICBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5CisgKiBAcGFyYW1baW5dICAgICBlbGVtICAgIEVsZW1lbnQgdG8gYWRkCiAgKiBAc2VlIGF2X2R5bmFycmF5X2FkZF9ub2ZyZWUoKSwgYXZfZHluYXJyYXkyX2FkZCgpCiAgKi8KIHZvaWQgYXZfZHluYXJyYXlfYWRkKHZvaWQgKnRhYl9wdHIsIGludCAqbmJfcHRyLCB2b2lkICplbGVtKTsKQEAgLTI5OSw0OCArNjE1LDYyIEBACiAgKiBidXQgaXQgZG9lc24ndCBmcmVlIG1lbW9yeSBvbiBmYWlscy4gSXQgcmV0dXJucyBlcnJvciBjb2RlCiAgKiBpbnN0ZWFkIGFuZCBsZWF2ZSBjdXJyZW50IGJ1ZmZlciB1bnRvdWNoZWQuCiAgKgotICogQHBhcmFtIHRhYl9wdHIgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZ3JvdwotICogQHBhcmFtIG5iX3B0ciAgcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICogQHBhcmFtIGVsZW0gICAgZWxlbWVudCB0byBhZGQKLSAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG90aGVyd2lzZS4KKyAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIG90aGVyd2lzZQogICogQHNlZSBhdl9keW5hcnJheV9hZGQoKSwgYXZfZHluYXJyYXkyX2FkZCgpCiAgKi8KIGF2X3dhcm5fdW51c2VkX3Jlc3VsdAogaW50IGF2X2R5bmFycmF5X2FkZF9ub2ZyZWUodm9pZCAqdGFiX3B0ciwgaW50ICpuYl9wdHIsIHZvaWQgKmVsZW0pOwogCiAvKioKLSAqIEFkZCBhbiBlbGVtZW50IG9mIHNpemUgZWxlbV9zaXplIHRvIGEgZHluYW1pYyBhcnJheS4KKyAqIEFkZCBhbiBlbGVtZW50IG9mIHNpemUgYGVsZW1fc2l6ZWAgdG8gYSBkeW5hbWljIGFycmF5LgogICoKICAqIFRoZSBhcnJheSBpcyByZWFsbG9jYXRlZCB3aGVuIGl0cyBudW1iZXIgb2YgZWxlbWVudHMgcmVhY2hlcyBwb3dlcnMgb2YgMi4KICAqIFRoZXJlZm9yZSwgdGhlIGFtb3J0aXplZCBjb3N0IG9mIGFkZGluZyBhbiBlbGVtZW50IGlzIGNvbnN0YW50LgogICoKICAqIEluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlIHBvaW50ZXIgdG8gdGhlIGFycmF5IGlzIHVwZGF0ZWQgaW4gb3JkZXIgdG8KLSAqIHBvaW50IHRvIHRoZSBuZXcgZ3Jvd24gYXJyYXksIGFuZCB0aGUgbnVtYmVyIHBvaW50ZWQgdG8gYnkgbmJfcHRyCisgKiBwb2ludCB0byB0aGUgbmV3IGdyb3duIGFycmF5LCBhbmQgdGhlIG51bWJlciBwb2ludGVkIHRvIGJ5IGBuYl9wdHJgCiAgKiBpcyBpbmNyZW1lbnRlZC4KLSAqIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhlIGFycmF5IGlzIGZyZWVkLCAqdGFiX3B0ciBpcyBzZXQgdG8gTlVMTCBhbmQKLSAqICpuYl9wdHIgaXMgc2V0IHRvIDAuCisgKiBJbiBjYXNlIG9mIGZhaWx1cmUsIHRoZSBhcnJheSBpcyBmcmVlZCwgYCp0YWJfcHRyYCBpcyBzZXQgdG8gYE5VTExgIGFuZAorICogYCpuYl9wdHJgIGlzIHNldCB0byAwLgogICoKLSAqIEBwYXJhbSB0YWJfcHRyICAgcG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZ3JvdwotICogQHBhcmFtIG5iX3B0ciAgICBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5Ci0gKiBAcGFyYW0gZWxlbV9zaXplIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheQotICogQHBhcmFtIGVsZW1fZGF0YSBwb2ludGVyIHRvIHRoZSBkYXRhIG9mIHRoZSBlbGVtZW50IHRvIGFkZC4gSWYgTlVMTCwgdGhlIHNwYWNlIG9mCi0gKiAgICAgICAgICAgICAgICAgIHRoZSBuZXcgYWRkZWQgZWxlbWVudCBpcyBub3QgZmlsbGVkLgotICogQHJldHVybiAgICAgICAgICBwb2ludGVyIHRvIHRoZSBkYXRhIG9mIHRoZSBlbGVtZW50IHRvIGNvcHkgaW4gdGhlIG5ldyBhbGxvY2F0ZWQgc3BhY2UuCi0gKiAgICAgICAgICAgICAgICAgIElmIE5VTEwsIHRoZSBuZXcgYWxsb2NhdGVkIHNwYWNlIGlzIGxlZnQgdW5pbml0aWFsaXplZC4iCisgKiBAcGFyYW1baW4sb3V0XSB0YWJfcHRyICAgUG9pbnRlciB0byB0aGUgYXJyYXkgdG8gZ3JvdworICogQHBhcmFtW2luLG91dF0gbmJfcHRyICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkKKyAqIEBwYXJhbVtpbl0gICAgIGVsZW1fc2l6ZSBTaXplIGluIGJ5dGVzIG9mIGFuIGVsZW1lbnQgaW4gdGhlIGFycmF5CisgKiBAcGFyYW1baW5dICAgICBlbGVtX2RhdGEgUG9pbnRlciB0byB0aGUgZGF0YSBvZiB0aGUgZWxlbWVudCB0byBhZGQuIElmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYE5VTExgLCB0aGUgc3BhY2Ugb2YgdGhlIG5ld2x5IGFkZGVkIGVsZW1lbnQgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYnV0IGxlZnQgdW5pbml0aWFsaXplZC4KKyAqCisgKiBAcmV0dXJuIFBvaW50ZXIgdG8gdGhlIGRhdGEgb2YgdGhlIGVsZW1lbnQgdG8gY29weSBpbiB0aGUgbmV3bHkgYWxsb2NhdGVkCisgKiAgICAgICAgIHNwYWNlCiAgKiBAc2VlIGF2X2R5bmFycmF5X2FkZCgpLCBhdl9keW5hcnJheV9hZGRfbm9mcmVlKCkKICAqLwogdm9pZCAqYXZfZHluYXJyYXkyX2FkZCh2b2lkICoqdGFiX3B0ciwgaW50ICpuYl9wdHIsIHNpemVfdCBlbGVtX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVsZW1fZGF0YSk7CiAKIC8qKgotICogTXVsdGlwbHkgdHdvIHNpemVfdCB2YWx1ZXMgY2hlY2tpbmcgZm9yIG92ZXJmbG93LgotICogQHJldHVybiAgMCBpZiBzdWNjZXNzLCBBVkVSUk9SKEVJTlZBTCkgaWYgb3ZlcmZsb3cuCisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIGxhdnVfbWVtX21pc2MgTWlzY2VsbGFuZW91cyBGdW5jdGlvbnMKKyAqCisgKiBPdGhlciBmdW5jdGlvbnMgcmVsYXRlZCB0byBtZW1vcnkgYWxsb2NhdGlvbi4KKyAqCisgKiBAeworICovCisKKy8qKgorICogTXVsdGlwbHkgdHdvIGBzaXplX3RgIHZhbHVlcyBjaGVja2luZyBmb3Igb3ZlcmZsb3cuCisgKgorICogQHBhcmFtW2luXSAgYSxiIE9wZXJhbmRzIG9mIG11bHRpcGxpY2F0aW9uCisgKiBAcGFyYW1bb3V0XSByICAgUG9pbnRlciB0byB0aGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24KKyAqIEByZXR1cm4gMCBvbiBzdWNjZXNzLCBBVkVSUk9SKEVJTlZBTCkgb24gb3ZlcmZsb3cKICAqLwogc3RhdGljIGlubGluZSBpbnQgYXZfc2l6ZV9tdWx0KHNpemVfdCBhLCBzaXplX3QgYiwgc2l6ZV90ICpyKQogewogICAgIHNpemVfdCB0ID0gYSAqIGI7Ci0gICAgLyogSGFjayBpbnNwaXJlZCBmcm9tIGdsaWJjOiBvbmx5IHRyeSB0aGUgZGl2aXNpb24gaWYgbmVsZW0gYW5kIGVsc2l6ZQotICAgICAqIGFyZSBib3RoIGdyZWF0ZXIgdGhhbiBzcXJ0KFNJWkVfTUFYKS4gKi8KKyAgICAvKiBIYWNrIGluc3BpcmVkIGZyb20gZ2xpYmM6IGRvbid0IHRyeSB0aGUgZGl2aXNpb24gaWYgbmVsZW0gYW5kIGVsc2l6ZQorICAgICAqIGFyZSBib3RoIGxlc3MgdGhhbiBzcXJ0KFNJWkVfTUFYKS4gKi8KICAgICBpZiAoKGEgfCBiKSA+PSAoKHNpemVfdCkxIDw8IChzaXplb2Yoc2l6ZV90KSAqIDQpKSAmJiBhICYmIHQgLyBhICE9IGIpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgKnIgPSB0OwpAQCAtMzQ4LDU4ICs2NzgsMjIgQEAKIH0KIAogLyoqCi0gKiBTZXQgdGhlIG1heGltdW0gc2l6ZSB0aGF0IG1heSBtZSBhbGxvY2F0ZWQgaW4gb25lIGJsb2NrLgorICogU2V0IHRoZSBtYXhpbXVtIHNpemUgdGhhdCBtYXkgYmUgYWxsb2NhdGVkIGluIG9uZSBibG9jay4KKyAqCisgKiBUaGUgdmFsdWUgc3BlY2lmaWVkIHdpdGggdGhpcyBmdW5jdGlvbiBpcyBlZmZlY3RpdmUgZm9yIGFsbCBsaWJhdnV0aWwncyBAcmVmCisgKiBsYXZ1X21lbV9mdW5jcyAiaGVhcCBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4iCisgKgorICogQnkgZGVmYXVsdCwgdGhlIG1heCB2YWx1ZSBpcyBkZWZpbmVkIGFzIGBJTlRfTUFYYC4KKyAqCisgKiBAcGFyYW0gbWF4IFZhbHVlIHRvIGJlIHNldCBhcyB0aGUgbmV3IG1heGltdW0gc2l6ZQorICoKKyAqIEB3YXJuaW5nIEV4ZXJjaXNlIGV4dHJlbWUgY2F1dGlvbiB3aGVuIHVzaW5nIHRoaXMgZnVuY3Rpb24uIERvbid0IHRvdWNoCisgKiAgICAgICAgICB0aGlzIGlmIHlvdSBkbyBub3QgdW5kZXJzdGFuZCB0aGUgZnVsbCBjb25zZXF1ZW5jZSBvZiBkb2luZyBzby4KICAqLwogdm9pZCBhdl9tYXhfYWxsb2Moc2l6ZV90IG1heCk7CiAKIC8qKgotICogZGVsaWJlcmF0ZWx5IG92ZXJsYXBwaW5nIG1lbWNweSBpbXBsZW1lbnRhdGlvbgotICogQHBhcmFtIGRzdCBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIEBwYXJhbSBiYWNrIGhvdyBtYW55IGJ5dGVzIGJhY2sgd2Ugc3RhcnQgKHRoZSBpbml0aWFsIHNpemUgb2YgdGhlIG92ZXJsYXBwaW5nIHdpbmRvdyksIG11c3QgYmUgPiAwCi0gKiBAcGFyYW0gY250IG51bWJlciBvZiBieXRlcyB0byBjb3B5LCBtdXN0IGJlID49IDAKLSAqCi0gKiBjbnQgPiBiYWNrIGlzIHZhbGlkLCB0aGlzIHdpbGwgY29weSB0aGUgYnl0ZXMgd2UganVzdCBjb3BpZWQsCi0gKiB0aHVzIGNyZWF0aW5nIGEgcmVwZWF0aW5nIHBhdHRlcm4gd2l0aCBhIHBlcmlvZCBsZW5ndGggb2YgYmFjay4KLSAqLwotdm9pZCBhdl9tZW1jcHlfYmFja3B0cih1aW50OF90ICpkc3QsIGludCBiYWNrLCBpbnQgY250KTsKLQotLyoqCi0gKiBSZWFsbG9jYXRlIHRoZSBnaXZlbiBibG9jayBpZiBpdCBpcyBub3QgbGFyZ2UgZW5vdWdoLCBvdGhlcndpc2UgZG8gbm90aGluZy4KLSAqCi0gKiBAc2VlIGF2X3JlYWxsb2MKLSAqLwotdm9pZCAqYXZfZmFzdF9yZWFsbG9jKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50ICpzaXplLCBzaXplX3QgbWluX3NpemUpOwotCi0vKioKLSAqIEFsbG9jYXRlIGEgYnVmZmVyLCByZXVzaW5nIHRoZSBnaXZlbiBvbmUgaWYgbGFyZ2UgZW5vdWdoLgotICoKLSAqIENvbnRyYXJ5IHRvIGF2X2Zhc3RfcmVhbGxvYyB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMgbWlnaHQgbm90IGJlCi0gKiBwcmVzZXJ2ZWQgYW5kIG9uIGVycm9yIHRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkLCB0aHVzIG5vIHNwZWNpYWwKLSAqIGhhbmRsaW5nIHRvIGF2b2lkIG1lbWxlYWtzIGlzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gcHRyIHBvaW50ZXIgdG8gcG9pbnRlciB0byBhbHJlYWR5IGFsbG9jYXRlZCBidWZmZXIsIG92ZXJ3cml0dGVuIHdpdGggcG9pbnRlciB0byBuZXcgYnVmZmVyCi0gKiBAcGFyYW0gc2l6ZSBzaXplIG9mIHRoZSBidWZmZXIgKnB0ciBwb2ludHMgdG8KLSAqIEBwYXJhbSBtaW5fc2l6ZSBtaW5pbXVtIHNpemUgb2YgKnB0ciBidWZmZXIgYWZ0ZXIgcmV0dXJuaW5nLCAqcHRyIHdpbGwgYmUgTlVMTCBhbmQKLSAqICAgICAgICAgICAgICAgICAqc2l6ZSAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICovCi12b2lkIGF2X2Zhc3RfbWFsbG9jKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50ICpzaXplLCBzaXplX3QgbWluX3NpemUpOwotCi0vKioKLSAqIEFsbG9jYXRlIGEgYnVmZmVyLCByZXVzaW5nIHRoZSBnaXZlbiBvbmUgaWYgbGFyZ2UgZW5vdWdoLgotICoKLSAqIEFsbCBuZXdseSBhbGxvY2F0ZWQgc3BhY2UgaXMgaW5pdGlhbGx5IGNsZWFyZWQKLSAqIENvbnRyYXJ5IHRvIGF2X2Zhc3RfcmVhbGxvYyB0aGUgY3VycmVudCBidWZmZXIgY29udGVudHMgbWlnaHQgbm90IGJlCi0gKiBwcmVzZXJ2ZWQgYW5kIG9uIGVycm9yIHRoZSBvbGQgYnVmZmVyIGlzIGZyZWVkLCB0aHVzIG5vIHNwZWNpYWwKLSAqIGhhbmRsaW5nIHRvIGF2b2lkIG1lbWxlYWtzIGlzIG5lY2Vzc2FyeS4KLSAqCi0gKiBAcGFyYW0gcHRyIHBvaW50ZXIgdG8gcG9pbnRlciB0byBhbHJlYWR5IGFsbG9jYXRlZCBidWZmZXIsIG92ZXJ3cml0dGVuIHdpdGggcG9pbnRlciB0byBuZXcgYnVmZmVyCi0gKiBAcGFyYW0gc2l6ZSBzaXplIG9mIHRoZSBidWZmZXIgKnB0ciBwb2ludHMgdG8KLSAqIEBwYXJhbSBtaW5fc2l6ZSBtaW5pbXVtIHNpemUgb2YgKnB0ciBidWZmZXIgYWZ0ZXIgcmV0dXJuaW5nLCAqcHRyIHdpbGwgYmUgTlVMTCBhbmQKLSAqICAgICAgICAgICAgICAgICAqc2l6ZSAwIGlmIGFuIGVycm9yIG9jY3VycmVkLgotICovCi12b2lkIGF2X2Zhc3RfbWFsbG9jeih2b2lkICpwdHIsIHVuc2lnbmVkIGludCAqc2l6ZSwgc2l6ZV90IG1pbl9zaXplKTsKLQotLyoqCisgKiBAfQogICogQH0KICAqLwogCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvbWlwcy9hc21kZWZzLmggYi9saWJhdnV0aWwvbWlwcy9hc21kZWZzLmgKaW5kZXggZmRmODJhMC4uNzQ4MTE5OSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL21pcHMvYXNtZGVmcy5oCisrKyBiL2xpYmF2dXRpbC9taXBzL2FzbWRlZnMuaApAQCAtMjgsMTkgKzI4LDMxIEBACiAjZGVmaW5lIEFWVVRJTF9NSVBTX0FTTURFRlNfSAogCiAjaWYgZGVmaW5lZChfQUJJNjQpICYmIF9NSVBTX1NJTSA9PSBfQUJJNjQKKyMgZGVmaW5lIG1pcHNfcmVnICAgICAgIGludDY0X3QKICMgZGVmaW5lIFBUUlNJWkUgICAgICAgICIgOCAiCiAjIGRlZmluZSBQVFJMT0cgICAgICAgICAiIDMgIgogIyBkZWZpbmUgUFRSX0FERFUgICAgICAgImRhZGR1ICIKICMgZGVmaW5lIFBUUl9BRERJVSAgICAgICJkYWRkaXUgIgorIyBkZWZpbmUgUFRSX0FEREkgICAgICAgImRhZGRpICIKICMgZGVmaW5lIFBUUl9TVUJVICAgICAgICJkc3VidSAiCiAjIGRlZmluZSBQVFJfTCAgICAgICAgICAibGQgIgorIyBkZWZpbmUgUFRSX1MgICAgICAgICAgInNkICIKKyMgZGVmaW5lIFBUUl9TUkEgICAgICAgICJkc3JhICIKKyMgZGVmaW5lIFBUUl9TUkwgICAgICAgICJkc3JsICIKKyMgZGVmaW5lIFBUUl9TTEwgICAgICAgICJkc2xsICIKICNlbHNlCisjIGRlZmluZSBtaXBzX3JlZyAgICAgICBpbnQzMl90CiAjIGRlZmluZSBQVFJTSVpFICAgICAgICAiIDQgIgogIyBkZWZpbmUgUFRSTE9HICAgICAgICAgIiAyICIKICMgZGVmaW5lIFBUUl9BRERVICAgICAgICJhZGR1ICIKICMgZGVmaW5lIFBUUl9BRERJVSAgICAgICJhZGRpdSAiCisjIGRlZmluZSBQVFJfQURESSAgICAgICAiYWRkaSAiCiAjIGRlZmluZSBQVFJfU1VCVSAgICAgICAic3VidSAiCiAjIGRlZmluZSBQVFJfTCAgICAgICAgICAibHcgIgorIyBkZWZpbmUgUFRSX1MgICAgICAgICAgInN3ICIKKyMgZGVmaW5lIFBUUl9TUkEgICAgICAgICJzcmEgIgorIyBkZWZpbmUgUFRSX1NSTCAgICAgICAgInNybCAiCisjIGRlZmluZSBQVFJfU0xMICAgICAgICAic2xsICIKICNlbmRpZgogCiAjZW5kaWYgLyogQVZDT0RFQ19NSVBTX0FTTURFRlNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL21pcHMvZmxvYXRfZHNwX21pcHMuYyBiL2xpYmF2dXRpbC9taXBzL2Zsb2F0X2RzcF9taXBzLmMKaW5kZXggYjNhODEyYy4uMDk0M2Q2ZiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL21pcHMvZmxvYXRfZHNwX21pcHMuYworKysgYi9saWJhdnV0aWwvbWlwcy9mbG9hdF9kc3BfbWlwcy5jCkBAIC01Niw2ICs1Niw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL21pcHMvYXNtZGVmcy5oIgogCiAjaWYgSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfTUlQU0ZQVQorI2lmICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2CiBzdGF0aWMgdm9pZCB2ZWN0b3JfZm11bF9taXBzKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKIHsKQEAgLTMzOSwxNCArMzQwLDE3IEBACiAgICAgICAgICk7CiAgICAgfQogfQorI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfTUlQU0ZQVSAqLwogCiB2b2lkIGZmX2Zsb2F0X2RzcF9pbml0X21pcHMoQVZGbG9hdERTUENvbnRleHQgKmZkc3ApIHsKICNpZiBIQVZFX0lOTElORV9BU00gJiYgSEFWRV9NSVBTRlBVCisjaWYgIUhBVkVfTUlQUzMyUjYgJiYgIUhBVkVfTUlQUzY0UjYKICAgICBmZHNwLT52ZWN0b3JfZm11bCA9IHZlY3Rvcl9mbXVsX21pcHM7CiAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyICA9IHZlY3Rvcl9mbXVsX3NjYWxhcl9taXBzOwogICAgIGZkc3AtPnZlY3Rvcl9mbXVsX3dpbmRvdyA9IHZlY3Rvcl9mbXVsX3dpbmRvd19taXBzOwogICAgIGZkc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0ID0gYnV0dGVyZmxpZXNfZmxvYXRfbWlwczsKICAgICBmZHNwLT52ZWN0b3JfZm11bF9yZXZlcnNlID0gdmVjdG9yX2ZtdWxfcmV2ZXJzZV9taXBzOworI2VuZGlmIC8qICFIQVZFX01JUFMzMlI2ICYmICFIQVZFX01JUFM2NFI2ICovCiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICYmIEhBVkVfTUlQU0ZQVSAqLwogfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL21pcHMvZ2VuZXJpY19tYWNyb3NfbXNhLmggYi9saWJhdnV0aWwvbWlwcy9nZW5lcmljX21hY3Jvc19tc2EuaAppbmRleCBiMWQxOGRkLi42YTQ2NzA0IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvbWlwcy9nZW5lcmljX21hY3Jvc19tc2EuaAorKysgYi9saWJhdnV0aWwvbWlwcy9nZW5lcmljX21hY3Jvc19tc2EuaApAQCAtMjcsMjAyICsyNywxNjMgQEAKICNkZWZpbmUgQUxJR05NRU5UICAgICAgICAgICAxNgogI2RlZmluZSBBTExPQ19BTElHTkVEKGFsaWduKSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCgoYWxpZ24pIDw8IDEpKSkKIAotI2RlZmluZSBMRF9CKFJUWVBFLCBwc3JjKSAqKChSVFlQRSAqKShwc3JjKSkKLSNkZWZpbmUgTERfVUIoLi4uKSBMRF9CKHYxNnU4LCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTERfU0IoLi4uKSBMRF9CKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfVihSVFlQRSwgcHNyYykgKigoUlRZUEUgKikocHNyYykpCisjZGVmaW5lIExEX1VCKC4uLikgTERfVih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NCKC4uLikgTERfVih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1VIKC4uLikgTERfVih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NIKC4uLikgTERfVih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1VXKC4uLikgTERfVih2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NXKC4uLikgTERfVih2NGkzMiwgX19WQV9BUkdTX18pCiAKLSNkZWZpbmUgTERfSChSVFlQRSwgcHNyYykgKigoUlRZUEUgKikocHNyYykpCi0jZGVmaW5lIExEX1VIKC4uLikgTERfSCh2OHUxNiwgX19WQV9BUkdTX18pCi0jZGVmaW5lIExEX1NIKC4uLikgTERfSCh2OGkxNiwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgTERfVyhSVFlQRSwgcHNyYykgKigoUlRZUEUgKikocHNyYykpCi0jZGVmaW5lIExEX1VXKC4uLikgTERfVyh2NHUzMiwgX19WQV9BUkdTX18pCi0jZGVmaW5lIExEX1NXKC4uLikgTERfVyh2NGkzMiwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgU1RfQihSVFlQRSwgaW4sIHBkc3QpICooKFJUWVBFICopKHBkc3QpKSA9IChpbikKLSNkZWZpbmUgU1RfVUIoLi4uKSBTVF9CKHYxNnU4LCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfU0IoLi4uKSBTVF9CKHYxNmk4LCBfX1ZBX0FSR1NfXykKLQotI2RlZmluZSBTVF9IKFJUWVBFLCBpbiwgcGRzdCkgKigoUlRZUEUgKikocGRzdCkpID0gKGluKQotI2RlZmluZSBTVF9VSCguLi4pIFNUX0godjh1MTYsIF9fVkFfQVJHU19fKQotI2RlZmluZSBTVF9TSCguLi4pIFNUX0godjhpMTYsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIFNUX1coUlRZUEUsIGluLCBwZHN0KSAqKChSVFlQRSAqKShwZHN0KSkgPSAoaW4pCi0jZGVmaW5lIFNUX1VXKC4uLikgU1RfVyh2NHUzMiwgX19WQV9BUkdTX18pCi0jZGVmaW5lIFNUX1NXKC4uLikgU1RfVyh2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1YoUlRZUEUsIGluLCBwZHN0KSAqKChSVFlQRSAqKShwZHN0KSkgPSAoaW4pCisjZGVmaW5lIFNUX1VCKC4uLikgU1RfVih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NCKC4uLikgU1RfVih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1VIKC4uLikgU1RfVih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NIKC4uLikgU1RfVih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1VXKC4uLikgU1RfVih2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NXKC4uLikgU1RfVih2NGkzMiwgX19WQV9BUkdTX18pCiAKICNpZiAoX19taXBzX2lzYV9yZXYgPj0gNikKLSAgICAjZGVmaW5lIExXKHBzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVpbnQ4X3QgKnBzcmNfbSA9ICh1aW50OF90ICopIChwc3JjKTsgIFwKLSAgICAgICAgdWludDMyX3QgdmFsX207ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJsdyAgJVt2YWxfbV0sICAlW3BzcmNfbV0gIFxuXHQiICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6IFt2YWxfbV0gIj1yIiAodmFsX20pICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDogW3BzcmNfbV0gIm0iICgqcHNyY19tKSAgICAgICAgICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdmFsX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICNkZWZpbmUgTEgocHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDE2X3QgdmFsX2xoX20gPSAqKHVpbnQxNl90ICopKHBzcmMpOyAgXAorICAgICAgICB2YWxfbGhfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSApCisKKyAgICAjZGVmaW5lIExXKHBzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IHZhbF9sd19tID0gKih1aW50MzJfdCAqKShwc3JjKTsgIFwKKyAgICAgICAgdmFsX2x3X207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gKQogCiAgICAgI2lmIChfX21pcHMgPT0gNjQpCi0gICAgICAgICNkZWZpbmUgTEQocHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB1aW50OF90ICpwc3JjX20gPSAodWludDhfdCAqKSAocHNyYyk7ICBcCi0gICAgICAgICAgICB1aW50NjRfdCB2YWxfbSA9IDA7ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgImxkICAlW3ZhbF9tXSwgICVbcHNyY19tXSAgXG5cdCIgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiBbdmFsX21dICI9ciIgKHZhbF9tKSAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiBbcHNyY19tXSAibSIgKCpwc3JjX20pICAgICAgICAgICBcCi0gICAgICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB2YWxfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICNkZWZpbmUgTEQocHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbF9sZF9tID0gICoodWludDY0X3QgKikocHNyYyk7ICBcCisgICAgICAgICAgICB2YWxfbGRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICkKICAgICAjZWxzZSAgLy8gIShfX21pcHMgPT0gNjQpCi0gICAgICAgICNkZWZpbmUgTEQocHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHVpbnQ4X3QgKnBzcmNfbSA9ICh1aW50OF90ICopIChwc3JjKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdWludDY0X3QgdmFsX20gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB2YWwwX20gPSBMVyhwc3JjX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdmFsMV9tID0gTFcocHNyY19tICsgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB2YWxfbSA9ICh1aW50NjRfdCkgKHZhbDFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdmFsX20gPSAodWludDY0X3QpICgodmFsX20gPDwgMzIpICYgMHhGRkZGRkZGRjAwMDAwMDAwKTsgIFwKLSAgICAgICAgICAgIHZhbF9tID0gKHVpbnQ2NF90KSAodmFsX20gfCAodWludDY0X3QpIHZhbDBfbSk7ICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdmFsX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgI2RlZmluZSBMRChwc3JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDhfdCAqcHNyY19sZF9tID0gKHVpbnQ4X3QgKikgKHBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbDBfbGRfbSwgdmFsMV9sZF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50NjRfdCB2YWxfbGRfbSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZhbDBfbGRfbSA9IExXKHBzcmNfbGRfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWwxX2xkX20gPSBMVyhwc3JjX2xkX20gKyA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZhbF9sZF9tID0gKHVpbnQ2NF90KSAodmFsMV9sZF9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWxfbGRfbSA9ICh1aW50NjRfdCkgKCh2YWxfbGRfbSA8PCAzMikgJiAweEZGRkZGRkZGMDAwMDAwMDApOyAgXAorICAgICAgICAgICAgdmFsX2xkX20gPSAodWludDY0X3QpICh2YWxfbGRfbSB8ICh1aW50NjRfdCkgdmFsMF9sZF9tKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWxfbGRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICkKICAgICAjZW5kaWYgIC8vIChfX21pcHMgPT0gNjQpCiAKLSAgICAjZGVmaW5lIFNIKHZhbCwgcGRzdCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVpbnQ4X3QgKnBkc3RfbSA9ICh1aW50OF90ICopIChwZHN0KTsgIFwKLSAgICAgICAgdWludDE2X3QgdmFsX20gPSAodmFsKTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJzaCAgJVt2YWxfbV0sICAlW3Bkc3RfbV0gIFxuXHQiICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6IFtwZHN0X21dICI9bSIgKCpwZHN0X20pICAgICAgICAgIFwKLSAgICAgICAgICAgIDogW3ZhbF9tXSAiciIgKHZhbF9tKSAgICAgICAgICAgICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQorICAgICNkZWZpbmUgU0godmFsLCBwZHN0KSAgKih1aW50MTZfdCAqKShwZHN0KSA9ICh2YWwpOworICAgICNkZWZpbmUgU1codmFsLCBwZHN0KSAgKih1aW50MzJfdCAqKShwZHN0KSA9ICh2YWwpOworICAgICNkZWZpbmUgU0QodmFsLCBwZHN0KSAgKih1aW50NjRfdCAqKShwZHN0KSA9ICh2YWwpOwogCi0gICAgI2RlZmluZSBTVyh2YWwsIHBkc3QpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB1aW50OF90ICpwZHN0X20gPSAodWludDhfdCAqKSAocGRzdCk7ICBcCi0gICAgICAgIHVpbnQzMl90IHZhbF9tID0gKHZhbCk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAic3cgICVbdmFsX21dLCAgJVtwZHN0X21dICBcblx0IiAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOiBbcGRzdF9tXSAiPW0iICgqcGRzdF9tKSAgICAgICAgICBcCi0gICAgICAgICAgICA6IFt2YWxfbV0gInIiICh2YWxfbSkgICAgICAgICAgICAgIFwKLSAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotICAgICNkZWZpbmUgU0QodmFsLCBwZHN0KSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdWludDhfdCAqcGRzdF9tID0gKHVpbnQ4X3QgKikgKHBkc3QpOyAgXAotICAgICAgICB1aW50NjRfdCB2YWxfbSA9ICh2YWwpOyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgInNkICAlW3ZhbF9tXSwgICVbcGRzdF9tXSAgXG5cdCIgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDogW3Bkc3RfbV0gIj1tIiAoKnBkc3RfbSkgICAgICAgICAgXAotICAgICAgICAgICAgOiBbdmFsX21dICJyIiAodmFsX20pICAgICAgICAgICAgICBcCi0gICAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9CiAjZWxzZSAgLy8gIShfX21pcHNfaXNhX3JldiA+PSA2KQotICAgICNkZWZpbmUgTFcocHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdWludDhfdCAqcHNyY19tID0gKHVpbnQ4X3QgKikgKHBzcmMpOyAgXAotICAgICAgICB1aW50MzJfdCB2YWxfbTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgInVsdyAgJVt2YWxfbV0sICAlW3BzcmNfbV0gIFxuXHQiICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDogW3ZhbF9tXSAiPXIiICh2YWxfbSkgICAgICAgICAgICAgXAotICAgICAgICAgICAgOiBbcHNyY19tXSAibSIgKCpwc3JjX20pICAgICAgICAgICBcCi0gICAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB2YWxfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgI2RlZmluZSBMSChwc3JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50OF90ICpwc3JjX2xoX20gPSAodWludDhfdCAqKSAocHNyYyk7ICAgICBcCisgICAgICAgIHVpbnQxNl90IHZhbF9saF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAidWxoICAlW3ZhbF9saF9tXSwgICVbcHNyY19saF9tXSAgXG5cdCIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiBbdmFsX2xoX21dICI9ciIgKHZhbF9saF9tKSAgICAgICAgICAgICBcCisgICAgICAgICAgICA6IFtwc3JjX2xoX21dICJtIiAoKnBzcmNfbGhfbSkgICAgICAgICAgIFwKKyAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbF9saF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICkKKworICAgICNkZWZpbmUgTFcocHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDhfdCAqcHNyY19sd19tID0gKHVpbnQ4X3QgKikgKHBzcmMpOyAgICAgXAorICAgICAgICB1aW50MzJfdCB2YWxfbHdfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgInVsdyAgJVt2YWxfbHdfbV0sICAlW3BzcmNfbHdfbV0gIFxuXHQiICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDogW3ZhbF9sd19tXSAiPXIiICh2YWxfbHdfbSkgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiBbcHNyY19sd19tXSAibSIgKCpwc3JjX2x3X20pICAgICAgICAgICBcCisgICAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2YWxfbHdfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSApCiAKICAgICAjaWYgKF9fbWlwcyA9PSA2NCkKLSAgICAgICAgI2RlZmluZSBMRChwc3JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHVpbnQ4X3QgKnBzcmNfbSA9ICh1aW50OF90ICopIChwc3JjKTsgIFwKLSAgICAgICAgICAgIHVpbnQ2NF90IHZhbF9tID0gMDsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAidWxkICAlW3ZhbF9tXSwgICVbcHNyY19tXSAgXG5cdCIgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6IFt2YWxfbV0gIj1yIiAodmFsX20pICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6IFtwc3JjX21dICJtIiAoKnBzcmNfbSkgICAgICAgICAgIFwKLSAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHZhbF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgI2RlZmluZSBMRChwc3JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQ4X3QgKnBzcmNfbGRfbSA9ICh1aW50OF90ICopIChwc3JjKTsgICAgIFwKKyAgICAgICAgICAgIHVpbnQ2NF90IHZhbF9sZF9tID0gMDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAidWxkICAlW3ZhbF9sZF9tXSwgICVbcHNyY19sZF9tXSAgXG5cdCIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICA6IFt2YWxfbGRfbV0gIj1yIiAodmFsX2xkX20pICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICA6IFtwc3JjX2xkX21dICJtIiAoKnBzcmNfbGRfbSkgICAgICAgICAgIFwKKyAgICAgICAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZhbF9sZF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSApCiAgICAgI2Vsc2UgIC8vICEoX19taXBzID09IDY0KQotICAgICAgICAjZGVmaW5lIExEKHBzcmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB1aW50OF90ICpwc3JjX20xID0gKHVpbnQ4X3QgKikgKHBzcmMpOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHVpbnQ2NF90IHZhbF9tID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdmFsMF9tID0gTFcocHNyY19tMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHZhbDFfbSA9IExXKHBzcmNfbTEgKyA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdmFsX20gPSAodWludDY0X3QpICh2YWwxX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHZhbF9tID0gKHVpbnQ2NF90KSAoKHZhbF9tIDw8IDMyKSAmIDB4RkZGRkZGRkYwMDAwMDAwMCk7ICBcCi0gICAgICAgICAgICB2YWxfbSA9ICh1aW50NjRfdCkgKHZhbF9tIHwgKHVpbnQ2NF90KSB2YWwwX20pOyAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHZhbF9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICNkZWZpbmUgTEQocHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQ4X3QgKnBzcmNfbGRfbSA9ICh1aW50OF90ICopIChwc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCB2YWwwX2xkX20sIHZhbDFfbGRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdWludDY0X3QgdmFsX2xkX20gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWwwX2xkX20gPSBMVyhwc3JjX2xkX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsMV9sZF9tID0gTFcocHNyY19sZF9tICsgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB2YWxfbGRfbSA9ICh1aW50NjRfdCkgKHZhbDFfbGRfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsX2xkX20gPSAodWludDY0X3QpICgodmFsX2xkX20gPDwgMzIpICYgMHhGRkZGRkZGRjAwMDAwMDAwKTsgIFwKKyAgICAgICAgICAgIHZhbF9sZF9tID0gKHVpbnQ2NF90KSAodmFsX2xkX20gfCAodWludDY0X3QpIHZhbDBfbGRfbSk7ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsX2xkX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSApCiAgICAgI2VuZGlmICAvLyAoX19taXBzID09IDY0KQogCi0gICAgI2RlZmluZSBTSCh2YWwsIHBkc3QpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB1aW50OF90ICpwZHN0X20gPSAodWludDhfdCAqKSAocGRzdCk7ICBcCi0gICAgICAgIHVpbnQxNl90IHZhbF9tID0gKHZhbCk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAidXNoICAlW3ZhbF9tXSwgICVbcGRzdF9tXSAgXG5cdCIgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOiBbcGRzdF9tXSAiPW0iICgqcGRzdF9tKSAgICAgICAgICBcCi0gICAgICAgICAgICA6IFt2YWxfbV0gInIiICh2YWxfbSkgICAgICAgICAgICAgIFwKLSAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICNkZWZpbmUgU0godmFsLCBwZHN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDhfdCAqcGRzdF9zaF9tID0gKHVpbnQ4X3QgKikgKHBkc3QpOyAgICAgXAorICAgICAgICB1aW50MTZfdCB2YWxfc2hfbSA9ICh2YWwpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgInVzaCAgJVt2YWxfc2hfbV0sICAlW3Bkc3Rfc2hfbV0gIFxuXHQiICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDogW3Bkc3Rfc2hfbV0gIj1tIiAoKnBkc3Rfc2hfbSkgICAgICAgICAgXAorICAgICAgICAgICAgOiBbdmFsX3NoX21dICJyIiAodmFsX3NoX20pICAgICAgICAgICAgICBcCisgICAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CiAKLSAgICAjZGVmaW5lIFNXKHZhbCwgcGRzdCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVpbnQ4X3QgKnBkc3RfbSA9ICh1aW50OF90ICopIChwZHN0KTsgIFwKLSAgICAgICAgdWludDMyX3QgdmFsX20gPSAodmFsKTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICJ1c3cgICVbdmFsX21dLCAgJVtwZHN0X21dICBcblx0IiAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6IFtwZHN0X21dICI9bSIgKCpwZHN0X20pICAgICAgICAgIFwKLSAgICAgICAgICAgIDogW3ZhbF9tXSAiciIgKHZhbF9tKSAgICAgICAgICAgICAgXAotICAgICAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgI2RlZmluZSBTVyh2YWwsIHBkc3QpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50OF90ICpwZHN0X3N3X20gPSAodWludDhfdCAqKSAocGRzdCk7ICAgICBcCisgICAgICAgIHVpbnQzMl90IHZhbF9zd19tID0gKHZhbCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAidXN3ICAlW3ZhbF9zd19tXSwgICVbcGRzdF9zd19tXSAgXG5cdCIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOiBbcGRzdF9zd19tXSAiPW0iICgqcGRzdF9zd19tKSAgICAgICAgICBcCisgICAgICAgICAgICA6IFt2YWxfc3dfbV0gInIiICh2YWxfc3dfbSkgICAgICAgICAgICAgIFwKKyAgICAgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0KIAotICAgICNkZWZpbmUgU0QodmFsLCBwZHN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHVpbnQ4X3QgKnBkc3RfbTEgPSAodWludDhfdCAqKSAocGRzdCk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHZhbDBfbSA9ICh1aW50MzJfdCkgKCh2YWwpICYgMHgwMDAwMDAwMEZGRkZGRkZGKTsgICAgICAgICAgXAotICAgICAgICB2YWwxX20gPSAodWludDMyX3QpICgoKHZhbCkgPj4gMzIpICYgMHgwMDAwMDAwMEZGRkZGRkZGKTsgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFNXKHZhbDBfbSwgcGRzdF9tMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBTVyh2YWwxX20sIHBkc3RfbTEgKyA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAjZGVmaW5lIFNEKHZhbCwgcGRzdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50OF90ICpwZHN0X3NkX20gPSAodWludDhfdCAqKSAocGRzdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDMyX3QgdmFsMF9zZF9tLCB2YWwxX3NkX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB2YWwwX3NkX20gPSAodWludDMyX3QpICgodmFsKSAmIDB4MDAwMDAwMDBGRkZGRkZGRik7ICAgICAgICAgIFwKKyAgICAgICAgdmFsMV9zZF9tID0gKHVpbnQzMl90KSAoKCh2YWwpID4+IDMyKSAmIDB4MDAwMDAwMDBGRkZGRkZGRik7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBTVyh2YWwwX3NkX20sIHBkc3Rfc2RfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU1codmFsMV9zZF9tLCBwZHN0X3NkX20gKyA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfQogI2VuZGlmIC8vIChfX21pcHNfaXNhX3JldiA+PSA2KQogCkBAIC0yNDMsNiArMjA0LDEyIEBACiAgICAgb3V0MyA9IExXKChwc3JjKSArIDMgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICBcCiB9CiAKKyNkZWZpbmUgTFcyKHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQwID0gTFcoKHBzcmMpKTsgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQxID0gTFcoKHBzcmMpICsgc3RyaWRlKTsgICAgICAgIFwKK30KKwogLyogRGVzY3JpcHRpb24gOiBMb2FkIGRvdWJsZSB3b3JkcyB3aXRoIHN0cmlkZQogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gcHNyYyAgICAoc291cmNlIHBvaW50ZXIgdG8gbG9hZCBmcm9tKQogICAgICAgICAgICAgICAgICAgICAgICAgIC0gc3RyaWRlCkBAIC0yOTEsMTIyICsyNTgsOTEgQEAKICAgICBTRChpbjMsIChwZHN0KSArIDMgKiBzdHJpZGUpOyAgICAgICAgICAgICAgXAogfQogCi0vKiBEZXNjcmlwdGlvbiA6IExvYWQgdmVjdG9ycyB3aXRoIDE2IGJ5dGUgZWxlbWVudHMgd2l0aCBzdHJpZGUKKy8qIERlc2NyaXB0aW9uIDogTG9hZCB2ZWN0b3IgZWxlbWVudHMgd2l0aCBzdHJpZGUKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIHBzcmMgICAgKHNvdXJjZSBwb2ludGVyIHRvIGxvYWQgZnJvbSkKICAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0cmlkZQogICAgICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQogICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQotICAgRGV0YWlscyAgICAgOiBMb2FkcyAxNiBieXRlIGVsZW1lbnRzIGluICdvdXQwJyBmcm9tIChwc3JjKQotICAgICAgICAgICAgICAgICBMb2FkcyAxNiBieXRlIGVsZW1lbnRzIGluICdvdXQxJyBmcm9tIChwc3JjICsgc3RyaWRlKQorICAgRGV0YWlscyAgICAgOiBMb2FkcyBlbGVtZW50cyBpbiAnb3V0MCcgZnJvbSAocHNyYykKKyAgICAgICAgICAgICAgICAgTG9hZHMgZWxlbWVudHMgaW4gJ291dDEnIGZyb20gKHBzcmMgKyBzdHJpZGUpCiAqLwotI2RlZmluZSBMRF9CMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKSAgXAorI2RlZmluZSBMRF9WMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKSAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG91dDAgPSBMRF9CKFJUWVBFLCAocHNyYykpOyAgICAgICAgICAgICAgICAgXAotICAgIG91dDEgPSBMRF9CKFJUWVBFLCAocHNyYykgKyBzdHJpZGUpOyAgICAgICAgXAorICAgIG91dDAgPSBMRF9WKFJUWVBFLCAocHNyYykpOyAgICAgICAgICAgICAgICAgXAorICAgIG91dDEgPSBMRF9WKFJUWVBFLCAocHNyYykgKyBzdHJpZGUpOyAgICAgICAgXAogfQotI2RlZmluZSBMRF9VQjIoLi4uKSBMRF9CMih2MTZ1OCwgX19WQV9BUkdTX18pCi0jZGVmaW5lIExEX1NCMiguLi4pIExEX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfVUIyKC4uLikgTERfVjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQjIoLi4uKSBMRF9WMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1VIMiguLi4pIExEX1YyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0gyKC4uLikgTERfVjIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TVzIoLi4uKSBMRF9WMih2NGkzMiwgX19WQV9BUkdTX18pCiAKLSNkZWZpbmUgTERfQjMoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0MikgIFwKKyNkZWZpbmUgTERfVjMoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0MikgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBMRF9CMihSVFlQRSwgKHBzcmMpLCBzdHJpZGUsIG91dDAsIG91dDEpOyAgICAgICAgIFwKLSAgICBvdXQyID0gTERfQihSVFlQRSwgKHBzcmMpICsgMiAqIHN0cmlkZSk7ICAgICAgICAgIFwKKyAgICBMRF9WMihSVFlQRSwgKHBzcmMpLCBzdHJpZGUsIG91dDAsIG91dDEpOyAgICAgICAgIFwKKyAgICBvdXQyID0gTERfVihSVFlQRSwgKHBzcmMpICsgMiAqIHN0cmlkZSk7ICAgICAgICAgIFwKIH0KLSNkZWZpbmUgTERfVUIzKC4uLikgTERfQjModjE2dTgsIF9fVkFfQVJHU19fKQotI2RlZmluZSBMRF9TQjMoLi4uKSBMRF9CMyh2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1VCMyguLi4pIExEX1YzKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0IzKC4uLikgTERfVjModjE2aTgsIF9fVkFfQVJHU19fKQogCi0jZGVmaW5lIExEX0I0KFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpICAgXAorI2RlZmluZSBMRF9WNChSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTERfQjIoUlRZUEUsIChwc3JjKSwgc3RyaWRlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgXAotICAgIExEX0IyKFJUWVBFLCAocHNyYykgKyAyICogc3RyaWRlICwgc3RyaWRlLCBvdXQyLCBvdXQzKTsgIFwKKyAgICBMRF9WMihSVFlQRSwgKHBzcmMpLCBzdHJpZGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICBcCisgICAgTERfVjIoUlRZUEUsIChwc3JjKSArIDIgKiBzdHJpZGUgLCBzdHJpZGUsIG91dDIsIG91dDMpOyAgXAogfQotI2RlZmluZSBMRF9VQjQoLi4uKSBMRF9CNCh2MTZ1OCwgX19WQV9BUkdTX18pCi0jZGVmaW5lIExEX1NCNCguLi4pIExEX0I0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfVUI0KC4uLikgTERfVjQodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQjQoLi4uKSBMRF9WNCh2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1VINCguLi4pIExEX1Y0KHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0g0KC4uLikgTERfVjQodjhpMTYsIF9fVkFfQVJHU19fKQogCi0jZGVmaW5lIExEX0I1KFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQpICBcCisjZGVmaW5lIExEX1Y1KFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQpICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTERfQjQoUlRZUEUsIChwc3JjKSwgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICAgICBcCi0gICAgb3V0NCA9IExEX0IoUlRZUEUsIChwc3JjKSArIDQgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVjQoUlRZUEUsIChwc3JjKSwgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICAgICBcCisgICAgb3V0NCA9IExEX1YoUlRZUEUsIChwc3JjKSArIDQgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICBcCiB9Ci0jZGVmaW5lIExEX1VCNSguLi4pIExEX0I1KHYxNnU4LCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTERfU0I1KC4uLikgTERfQjUodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9VQjUoLi4uKSBMRF9WNSh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NCNSguLi4pIExEX1Y1KHYxNmk4LCBfX1ZBX0FSR1NfXykKIAotI2RlZmluZSBMRF9CNihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1KSAgXAorI2RlZmluZSBMRF9WNihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1KSAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIExEX0I0KFJUWVBFLCAocHNyYyksIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAotICAgIExEX0IyKFJUWVBFLCAocHNyYykgKyA0ICogc3RyaWRlLCBzdHJpZGUsIG91dDQsIG91dDUpOyAgICAgICAgICAgICAgXAorICAgIExEX1Y0KFJUWVBFLCAocHNyYyksIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorICAgIExEX1YyKFJUWVBFLCAocHNyYykgKyA0ICogc3RyaWRlLCBzdHJpZGUsIG91dDQsIG91dDUpOyAgICAgICAgICAgICAgXAogfQotI2RlZmluZSBMRF9VQjYoLi4uKSBMRF9CNih2MTZ1OCwgX19WQV9BUkdTX18pCi0jZGVmaW5lIExEX1NCNiguLi4pIExEX0I2KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfVUI2KC4uLikgTERfVjYodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQjYoLi4uKSBMRF9WNih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1VINiguLi4pIExEX1Y2KHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0g2KC4uLikgTERfVjYodjhpMTYsIF9fVkFfQVJHU19fKQogCi0jZGVmaW5lIExEX0I3KFJUWVBFLCBwc3JjLCBzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgTERfVjcoUlRZUEUsIHBzcmMsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2KSAgICAgICAgICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBMRF9CNShSVFlQRSwgKHBzcmMpLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQpOyAgXAotICAgIExEX0IyKFJUWVBFLCAocHNyYykgKyA1ICogc3RyaWRlLCBzdHJpZGUsIG91dDUsIG91dDYpOyAgICAgICBcCisgICAgTERfVjUoUlRZUEUsIChwc3JjKSwgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0KTsgIFwKKyAgICBMRF9WMihSVFlQRSwgKHBzcmMpICsgNSAqIHN0cmlkZSwgc3RyaWRlLCBvdXQ1LCBvdXQ2KTsgICAgICAgXAogfQotI2RlZmluZSBMRF9VQjcoLi4uKSBMRF9CNyh2MTZ1OCwgX19WQV9BUkdTX18pCi0jZGVmaW5lIExEX1NCNyguLi4pIExEX0I3KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfVUI3KC4uLikgTERfVjcodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQjcoLi4uKSBMRF9WNyh2MTZpOCwgX19WQV9BUkdTX18pCiAKLSNkZWZpbmUgTERfQjgoUlRZUEUsIHBzcmMsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgTERfVjgoUlRZUEUsIHBzcmMsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgb3V0Niwgb3V0NykgICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBMRF9CNChSVFlQRSwgKHBzcmMpLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKLSAgICBMRF9CNChSVFlQRSwgKHBzcmMpICsgNCAqIHN0cmlkZSwgc3RyaWRlLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsgIFwKKyAgICBMRF9WNChSVFlQRSwgKHBzcmMpLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKKyAgICBMRF9WNChSVFlQRSwgKHBzcmMpICsgNCAqIHN0cmlkZSwgc3RyaWRlLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsgIFwKIH0KLSNkZWZpbmUgTERfVUI4KC4uLikgTERfQjgodjE2dTgsIF9fVkFfQVJHU19fKQotI2RlZmluZSBMRF9TQjgoLi4uKSBMRF9COCh2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1VCOCguLi4pIExEX1Y4KHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0I4KC4uLikgTERfVjgodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9VSDgoLi4uKSBMRF9WOCh2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NIOCguLi4pIExEX1Y4KHY4aTE2LCBfX1ZBX0FSR1NfXykKIAotLyogRGVzY3JpcHRpb24gOiBMb2FkIHZlY3RvcnMgd2l0aCA4IGhhbGZ3b3JkIGVsZW1lbnRzIHdpdGggc3RyaWRlCi0gICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBwc3JjICAgIChzb3VyY2UgcG9pbnRlciB0byBsb2FkIGZyb20pCi0gICAgICAgICAgICAgICAgICAgICAgICAgLSBzdHJpZGUKLSAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKLSAgIERldGFpbHMgICAgIDogTG9hZHMgOCBoYWxmd29yZCBlbGVtZW50cyBpbiAnb3V0MCcgZnJvbSAocHNyYykKLSAgICAgICAgICAgICAgICAgTG9hZHMgOCBoYWxmd29yZCBlbGVtZW50cyBpbiAnb3V0MScgZnJvbSAocHNyYyArIHN0cmlkZSkKLSovCi0jZGVmaW5lIExEX0gyKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEpICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MCA9IExEX0goUlRZUEUsIChwc3JjKSk7ICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MSA9IExEX0goUlRZUEUsIChwc3JjKSArIChzdHJpZGUpKTsgICAgICBcCi19Ci0jZGVmaW5lIExEX1VIMiguLi4pIExEX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTERfU0gyKC4uLikgTERfSDIodjhpMTYsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIExEX0g0KFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTERfSDIoUlRZUEUsIChwc3JjKSwgc3RyaWRlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICBcCi0gICAgTERfSDIoUlRZUEUsIChwc3JjKSArIDIgKiBzdHJpZGUsIHN0cmlkZSwgb3V0Miwgb3V0Myk7ICBcCi19Ci0jZGVmaW5lIExEX1VINCguLi4pIExEX0g0KHY4dTE2LCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTERfU0g0KC4uLikgTERfSDQodjhpMTYsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIExEX0g2KFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUpICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTERfSDQoUlRZUEUsIChwc3JjKSwgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCi0gICAgTERfSDIoUlRZUEUsIChwc3JjKSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgb3V0NCwgb3V0NSk7ICAgICAgICAgICAgICBcCi19Ci0jZGVmaW5lIExEX1VINiguLi4pIExEX0g2KHY4dTE2LCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTERfU0g2KC4uLikgTERfSDYodjhpMTYsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIExEX0g4KFJUWVBFLCBwc3JjLCBzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDcpICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTERfSDQoUlRZUEUsIChwc3JjKSwgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCi0gICAgTERfSDQoUlRZUEUsIChwc3JjKSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgb3V0NCwgb3V0NSwgb3V0Niwgb3V0Nyk7ICBcCi19Ci0jZGVmaW5lIExEX1VIOCguLi4pIExEX0g4KHY4dTE2LCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgTERfU0g4KC4uLikgTERfSDgodjhpMTYsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIExEX0gxNihSVFlQRSwgcHNyYywgc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBMRF9WMTYoUlRZUEUsIHBzcmMsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDcsICAgICAgICBcCiAgICAgICAgICAgICAgICBvdXQ4LCBvdXQ5LCBvdXQxMCwgb3V0MTEsIG91dDEyLCBvdXQxMywgb3V0MTQsIG91dDE1KSAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBMRF9IOChSVFlQRSwgKHBzcmMpLCBzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVjgoUlRZUEUsIChwc3JjKSwgc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDcpOyAgICAgICAgICAgIFwKLSAgICBMRF9IOChSVFlQRSwgKHBzcmMpICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVjgoUlRZUEUsIChwc3JjKSArIDggKiBzdHJpZGUsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIG91dDgsIG91dDksIG91dDEwLCBvdXQxMSwgb3V0MTIsIG91dDEzLCBvdXQxNCwgb3V0MTUpOyAgICAgIFwKIH0KLSNkZWZpbmUgTERfU0gxNiguLi4pIExEX0gxNih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NIMTYoLi4uKSBMRF9WMTYodjhpMTYsIF9fVkFfQVJHU19fKQogCiAvKiBEZXNjcmlwdGlvbiA6IExvYWQgYXMgNHg0IGJsb2NrIG9mIHNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tIDFEIHNvdXJjZQogICAgICAgICAgICAgICAgICBkYXRhIGludG8gNCB2ZWN0b3JzIChFYWNoIHZlY3RvciB3aXRoIDQgc2lnbmVkIGhhbGZ3b3JkcykKQEAgLTQyMSwxMDMgKzM1Nyw0OCBAQAogICAgIG91dDMgPSAodjhpMTYpIF9fbXNhX2lsdmxfZCgodjJpNjQpIG91dDIsICh2Mmk2NCkgb3V0Mik7ICBcCiB9CiAKLS8qIERlc2NyaXB0aW9uIDogTG9hZCAyIHZlY3RvcnMgb2Ygc2lnbmVkIHdvcmQgZWxlbWVudHMgd2l0aCBzdHJpZGUKLSAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIHBzcmMgICAgKHNvdXJjZSBwb2ludGVyIHRvIGxvYWQgZnJvbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAtIHN0cmlkZQotICAgICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQotICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHNpZ25lZCB3b3JkCi0qLwotI2RlZmluZSBMRF9TVzIocHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKSAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG91dDAgPSBMRF9TVygocHNyYykpOyAgICAgICAgICAgICAgICAgXAotICAgIG91dDEgPSBMRF9TVygocHNyYykgKyBzdHJpZGUpOyAgICAgICAgXAotfQotCi0vKiBEZXNjcmlwdGlvbiA6IFN0b3JlIHZlY3RvcnMgb2YgMTYgYnl0ZSBlbGVtZW50cyB3aXRoIHN0cmlkZQorLyogRGVzY3JpcHRpb24gOiBTdG9yZSB2ZWN0b3JzIHdpdGggc3RyaWRlCiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgc3RyaWRlCiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBwZHN0ICAgIChkZXN0aW5hdGlvbiBwb2ludGVyIHRvIHN0b3JlIHRvKQotICAgRGV0YWlscyAgICAgOiBTdG9yZXMgMTYgYnl0ZSBlbGVtZW50cyBmcm9tICdpbjAnIHRvIChwZHN0KQotICAgICAgICAgICAgICAgICBTdG9yZXMgMTYgYnl0ZSBlbGVtZW50cyBmcm9tICdpbjEnIHRvIChwZHN0ICsgc3RyaWRlKQorICAgRGV0YWlscyAgICAgOiBTdG9yZXMgZWxlbWVudHMgZnJvbSAnaW4wJyB0byAocGRzdCkKKyAgICAgICAgICAgICAgICAgU3RvcmVzIGVsZW1lbnRzIGZyb20gJ2luMScgdG8gKHBkc3QgKyBzdHJpZGUpCiAqLwotI2RlZmluZSBTVF9CMihSVFlQRSwgaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSkgIFwKKyNkZWZpbmUgU1RfVjIoUlRZUEUsIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFNUX0IoUlRZUEUsIGluMCwgKHBkc3QpKTsgICAgICAgICAgICAgICAgIFwKLSAgICBTVF9CKFJUWVBFLCBpbjEsIChwZHN0KSArIHN0cmlkZSk7ICAgICAgICBcCisgICAgU1RfVihSVFlQRSwgaW4wLCAocGRzdCkpOyAgICAgICAgICAgICAgICAgXAorICAgIFNUX1YoUlRZUEUsIGluMSwgKHBkc3QpICsgc3RyaWRlKTsgICAgICAgIFwKIH0KLSNkZWZpbmUgU1RfVUIyKC4uLikgU1RfQjIodjE2dTgsIF9fVkFfQVJHU19fKQotI2RlZmluZSBTVF9TQjIoLi4uKSBTVF9CMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1VCMiguLi4pIFNUX1YyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU0IyKC4uLikgU1RfVjIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9VSDIoLi4uKSBTVF9WMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NIMiguLi4pIFNUX1YyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU1cyKC4uLikgU1RfVjIodjRpMzIsIF9fVkFfQVJHU19fKQogCi0jZGVmaW5lIFNUX0I0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSkgICAgXAorI2RlZmluZSBTVF9WNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUpICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU1RfQjIoUlRZUEUsIGluMCwgaW4xLCAocGRzdCksIHN0cmlkZSk7ICAgICAgICAgICAgICAgXAotICAgIFNUX0IyKFJUWVBFLCBpbjIsIGluMywgKHBkc3QpICsgMiAqIHN0cmlkZSwgc3RyaWRlKTsgIFwKKyAgICBTVF9WMihSVFlQRSwgaW4wLCBpbjEsIChwZHN0KSwgc3RyaWRlKTsgICAgICAgICAgICAgICBcCisgICAgU1RfVjIoUlRZUEUsIGluMiwgaW4zLCAocGRzdCkgKyAyICogc3RyaWRlLCBzdHJpZGUpOyAgXAogfQotI2RlZmluZSBTVF9VQjQoLi4uKSBTVF9CNCh2MTZ1OCwgX19WQV9BUkdTX18pCi0jZGVmaW5lIFNUX1NCNCguLi4pIFNUX0I0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfVUI0KC4uLikgU1RfVjQodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TQjQoLi4uKSBTVF9WNCh2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NINCguLi4pIFNUX1Y0KHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU1c0KC4uLikgU1RfVjQodjRpMzIsIF9fVkFfQVJHU19fKQogCi0jZGVmaW5lIFNUX0I4KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgICAgICAgIFwKLSAgICAgICAgICAgICAgcGRzdCwgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU1RfQjQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlKTsgICAgICAgICAgICAgICAgIFwKLSAgICBTVF9CNChSVFlQRSwgaW40LCBpbjUsIGluNiwgaW43LCAocGRzdCkgKyA0ICogc3RyaWRlLCBzdHJpZGUpOyAgXAotfQotI2RlZmluZSBTVF9VQjgoLi4uKSBTVF9COCh2MTZ1OCwgX19WQV9BUkdTX18pCi0KLS8qIERlc2NyaXB0aW9uIDogU3RvcmUgdmVjdG9ycyBvZiA4IGhhbGZ3b3JkIGVsZW1lbnRzIHdpdGggc3RyaWRlCi0gICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgc3RyaWRlCi0gICAgICAgICAgICAgICAgIE91dHB1dHMgLSBwZHN0ICAgIChkZXN0aW5hdGlvbiBwb2ludGVyIHRvIHN0b3JlIHRvKQotICAgRGV0YWlscyAgICAgOiBTdG9yZXMgOCBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdpbjAnIHRvIChwZHN0KQotICAgICAgICAgICAgICAgICBTdG9yZXMgOCBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdpbjEnIHRvIChwZHN0ICsgc3RyaWRlKQotKi8KLSNkZWZpbmUgU1RfSDIoUlRZUEUsIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFNUX0goUlRZUEUsIGluMCwgKHBkc3QpKTsgICAgICAgICAgICAgICAgIFwKLSAgICBTVF9IKFJUWVBFLCBpbjEsIChwZHN0KSArIHN0cmlkZSk7ICAgICAgICBcCi19Ci0jZGVmaW5lIFNUX1VIMiguLi4pIFNUX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKLSNkZWZpbmUgU1RfU0gyKC4uLikgU1RfSDIodjhpMTYsIF9fVkFfQVJHU19fKQotCi0jZGVmaW5lIFNUX0g0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSkgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTVF9IMihSVFlQRSwgaW4wLCBpbjEsIChwZHN0KSwgc3RyaWRlKTsgICAgICAgICAgICAgICBcCi0gICAgU1RfSDIoUlRZUEUsIGluMiwgaW4zLCAocGRzdCkgKyAyICogc3RyaWRlLCBzdHJpZGUpOyAgXAotfQotI2RlZmluZSBTVF9TSDQoLi4uKSBTVF9INCh2OGkxNiwgX19WQV9BUkdTX18pCi0KLSNkZWZpbmUgU1RfSDYoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIHBkc3QsIHN0cmlkZSkgIFwKKyNkZWZpbmUgU1RfVjYoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIHBkc3QsIHN0cmlkZSkgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTVF9INChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCAocGRzdCksIHN0cmlkZSk7ICAgICAgICAgICAgIFwKLSAgICBTVF9IMihSVFlQRSwgaW40LCBpbjUsIChwZHN0KSArIDQgKiBzdHJpZGUsIHN0cmlkZSk7ICAgICAgICAgIFwKKyAgICBTVF9WNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCAocGRzdCksIHN0cmlkZSk7ICAgICAgICAgICAgIFwKKyAgICBTVF9WMihSVFlQRSwgaW40LCBpbjUsIChwZHN0KSArIDQgKiBzdHJpZGUsIHN0cmlkZSk7ICAgICAgICAgIFwKIH0KLSNkZWZpbmUgU1RfU0g2KC4uLikgU1RfSDYodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TSDYoLi4uKSBTVF9WNih2OGkxNiwgX19WQV9BUkdTX18pCiAKLSNkZWZpbmUgU1RfSDgoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCBwZHN0LCBzdHJpZGUpICBcCisjZGVmaW5lIFNUX1Y4KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgcGRzdCwgc3RyaWRlKSAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTVF9INChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCAocGRzdCksIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU1RfSDQoUlRZUEUsIGluNCwgaW41LCBpbjYsIGluNywgKHBkc3QpICsgNCAqIHN0cmlkZSwgc3RyaWRlKTsgICAgICAgICAgXAorICAgIFNUX1Y0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIChwZHN0KSwgc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVF9WNChSVFlQRSwgaW40LCBpbjUsIGluNiwgaW43LCAocGRzdCkgKyA0ICogc3RyaWRlLCBzdHJpZGUpOyAgICAgICAgICBcCiB9Ci0jZGVmaW5lIFNUX1NIOCguLi4pIFNUX0g4KHY4aTE2LCBfX1ZBX0FSR1NfXykKLQotLyogRGVzY3JpcHRpb24gOiBTdG9yZSB2ZWN0b3JzIG9mIHdvcmQgZWxlbWVudHMgd2l0aCBzdHJpZGUKLSAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBzdHJpZGUKLSAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIHBkc3QgICAgKGRlc3RpbmF0aW9uIHBvaW50ZXIgdG8gc3RvcmUgdG8pCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIHdvcmQKLSAgIERldGFpbHMgICAgIDogU3RvcmVzIDQgd29yZCBlbGVtZW50cyBmcm9tICdpbjAnIHRvIChwZHN0KQotICAgICAgICAgICAgICAgICBTdG9yZXMgNCB3b3JkIGVsZW1lbnRzIGZyb20gJ2luMScgdG8gKHBkc3QgKyBzdHJpZGUpCi0qLwotI2RlZmluZSBTVF9TVzIoaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSkgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgU1RfU1coaW4wLCAocGRzdCkpOyAgICAgICAgICAgICAgICAgXAotICAgIFNUX1NXKGluMSwgKHBkc3QpICsgc3RyaWRlKTsgICAgICAgIFwKLX0KLSNkZWZpbmUgU1RfU1c4KGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgXAotICAgICAgICAgICAgICAgcGRzdCwgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBTVF9TVzIoaW4wLCBpbjEsIChwZHN0KSwgc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgXAotICAgIFNUX1NXMihpbjIsIGluMywgKHBkc3QpICsgMiAqIHN0cmlkZSwgc3RyaWRlKTsgICAgICBcCi0gICAgU1RfU1cyKGluNCwgaW41LCAocGRzdCkgKyA0ICogc3RyaWRlLCBzdHJpZGUpOyAgICAgIFwKLSAgICBTVF9TVzIoaW42LCBpbjcsIChwZHN0KSArIDYgKiBzdHJpZGUsIHN0cmlkZSk7ICAgICAgXAotfQorI2RlZmluZSBTVF9VQjgoLi4uKSBTVF9WOCh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NIOCguLi4pIFNUX1Y4KHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU1c4KC4uLikgU1RfVjgodjRpMzIsIF9fVkFfQVJHU19fKQogCiAvKiBEZXNjcmlwdGlvbiA6IFN0b3JlIGFzIDJ4NCBieXRlIGJsb2NrIHRvIGRlc3RpbmF0aW9uIG1lbW9yeSBmcm9tIGlucHV0IHZlY3RvcgogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4sIHN0aWR4LCBwZHN0LCBzdHJpZGUKQEAgLTc3Niw3ICs2NTcsNyBAQAogLyogRGVzY3JpcHRpb24gOiBhdmVyYWdlIHdpdGggcm91bmRpbmcgKGluMCArIGluMSArIDEpIC8gMi4KICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgYnl0ZQorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOiBFYWNoIGJ5dGUgZWxlbWVudCBmcm9tICdpbjAnIHZlY3RvciBpcyBhZGRlZCB3aXRoIGVhY2ggYnl0ZQogICAgICAgICAgICAgICAgICBlbGVtZW50IGZyb20gJ2luMScgdmVjdG9yLiBUaGUgYWRkaXRpb24gb2YgdGhlIGVsZW1lbnRzIHBsdXMgMQogICAgICAgICAgICAgICAgIChmb3Igcm91bmRpbmcpIGlzIGRvbmUgdW5zaWduZWQgd2l0aCBmdWxsIHByZWNpc2lvbiwKQEAgLTk0MSw3ICs4MjIsNyBAQAogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gbXVsdDAsIG11bHQxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnN0MCwgY25zdDEKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBoYWxmd29yZAorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOiBVbnNpZ25lZCBieXRlIGVsZW1lbnRzIGZyb20gbXVsdDAgYXJlIG11bHRpcGxpZWQgd2l0aAogICAgICAgICAgICAgICAgICB1bnNpZ25lZCBieXRlIGVsZW1lbnRzIGZyb20gY25zdDAgcHJvZHVjaW5nIGEgcmVzdWx0CiAgICAgICAgICAgICAgICAgIHR3aWNlIHRoZSBzaXplIG9mIGlucHV0IGkuZS4gdW5zaWduZWQgaGFsZndvcmQuCkBAIC05NjksNyArODUwLDcgQEAKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIG11bHQwLCBtdWx0MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY25zdDAsIGNuc3QxCiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIGhhbGZ3b3JkCisgICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCiAgICBEZXRhaWxzICAgICA6IFNpZ25lZCBieXRlIGVsZW1lbnRzIGZyb20gbXVsdDAgYXJlIG11bHRpcGxpZWQgd2l0aAogICAgICAgICAgICAgICAgICBzaWduZWQgYnl0ZSBlbGVtZW50cyBmcm9tIGNuc3QwIHByb2R1Y2luZyBhIHJlc3VsdAogICAgICAgICAgICAgICAgICB0d2ljZSB0aGUgc2l6ZSBvZiBpbnB1dCBpLmUuIHNpZ25lZCBoYWxmd29yZC4KQEAgLTEwMDQsNyArODg1LDcgQEAKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIG11bHQwLCBtdWx0MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY25zdDAsIGNuc3QxCiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIHdvcmQKKyAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKICAgIERldGFpbHMgICAgIDogU2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gbXVsdDAgYXJlIG11bHRpcGxpZWQgd2l0aAogICAgICAgICAgICAgICAgICBzaWduZWQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSBjbnN0MCBwcm9kdWNpbmcgYSByZXN1bHQKICAgICAgICAgICAgICAgICAgdHdpY2UgdGhlIHNpemUgb2YgaW5wdXQgaS5lLiBzaWduZWQgd29yZC4KQEAgLTEwMzIsNyArOTEzLDcgQEAKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIG11bHQwLCBtdWx0MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY25zdDAsIGNuc3QxCiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIGhhbGZ3b3JkCisgICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCiAgICBEZXRhaWxzICAgICA6IFNpZ25lZCBieXRlIGVsZW1lbnRzIGZyb20gbXVsdDAgYXJlIG11bHRpcGxpZWQgd2l0aAogICAgICAgICAgICAgICAgICBzaWduZWQgYnl0ZSBlbGVtZW50cyBmcm9tIGNuc3QwIHByb2R1Y2luZyBhIHJlc3VsdAogICAgICAgICAgICAgICAgICB0d2ljZSB0aGUgc2l6ZSBvZiBpbnB1dCBpLmUuIHNpZ25lZCBoYWxmd29yZC4KQEAgLTEwNjEsNyArOTQyLDcgQEAKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIG11bHQwLCBtdWx0MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY25zdDAsIGNuc3QxCiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gdW5zaWduZWQgaGFsZndvcmQKKyAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKICAgIERldGFpbHMgICAgIDogVW5zaWduZWQgYnl0ZSBlbGVtZW50cyBmcm9tIG11bHQwIGFyZSBtdWx0aXBsaWVkIHdpdGgKICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYnl0ZSBlbGVtZW50cyBmcm9tIGNuc3QwIHByb2R1Y2luZyBhIHJlc3VsdAogICAgICAgICAgICAgICAgICB0d2ljZSB0aGUgc2l6ZSBvZiBpbnB1dCBpLmUuIHVuc2lnbmVkIGhhbGZ3b3JkLgpAQCAtMTA4Miw3ICs5NjMsNyBAQAogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gbXVsdDAsIG11bHQxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnN0MCwgY25zdDEKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgd29yZAorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOiBTaWduZWQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSBtdWx0MCBhcmUgbXVsdGlwbGllZCB3aXRoCiAgICAgICAgICAgICAgICAgIHNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tIGNuc3QwIHByb2R1Y2luZyBhIHJlc3VsdAogICAgICAgICAgICAgICAgICB0d2ljZSB0aGUgc2l6ZSBvZiBpbnB1dCBpLmUuIHNpZ25lZCB3b3JkLgpAQCAtMTExMSw3ICs5OTIsNyBAQAogICAgICAgICAgICAgICAgICBlaXRoZXIgdmVjdG9yIGFyZSBjb3BpZWQgdG8gdGhlIG91dHB1dCB2ZWN0b3IKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBtaW5fdmVjCiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBpbjAsIGluMSwgKGluIHBsYWNlKQotICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHVuc2lnbmVkIGhhbGZ3b3JkCisgICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCiAgICBEZXRhaWxzICAgICA6IE1pbmltdW0gb2YgdW5zaWduZWQgaGFsZndvcmQgZWxlbWVudCB2YWx1ZXMgZnJvbSAnaW4wJyBhbmQKICAgICAgICAgICAgICAgICAgJ21pbl92YWx1ZScgYXJlIHdyaXR0ZW4gdG8gb3V0cHV0IHZlY3RvciAnaW4wJwogKi8KQEAgLTExNzIsNiArMTA1MywyNSBAQAogICAgIENMSVBfU0gyXzBfMjU1KGluMiwgaW4zKTsgICAgICAgICAgICAgICBcCiB9CiAKKyNkZWZpbmUgQ0xJUF9TSF8wXzI1NV9NQVhfU0FUVShpbikgICAgICAgICAgICAgICAgICAgIFwKKyggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2OGkxNiBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXRfbSA9IF9fbXNhX21heGlfc19oKCh2OGkxNikgaW4sIDApOyAgICAgICAgICAgIFwKKyAgICBvdXRfbSA9ICh2OGkxNikgX19tc2Ffc2F0X3VfaCgodjh1MTYpIG91dF9tLCA3KTsgIFwKKyAgICBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gKQorI2RlZmluZSBDTElQX1NIMl8wXzI1NV9NQVhfU0FUVShpbjAsIGluMSkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW4wID0gQ0xJUF9TSF8wXzI1NV9NQVhfU0FUVShpbjApOyAgICAgXAorICAgIGluMSA9IENMSVBfU0hfMF8yNTVfTUFYX1NBVFUoaW4xKTsgICAgIFwKK30KKyNkZWZpbmUgQ0xJUF9TSDRfMF8yNTVfTUFYX1NBVFUoaW4wLCBpbjEsIGluMiwgaW4zKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUF9TSDJfMF8yNTVfTUFYX1NBVFUoaW4wLCBpbjEpOyAgICAgICAgICAgICAgIFwKKyAgICBDTElQX1NIMl8wXzI1NV9NQVhfU0FUVShpbjIsIGluMyk7ICAgICAgICAgICAgICAgXAorfQorCiAvKiBEZXNjcmlwdGlvbiA6IENsaXBzIGFsbCBzaWduZWQgd29yZCBlbGVtZW50cyBvZiBpbnB1dCB2ZWN0b3IKICAgICAgICAgICAgICAgICAgYmV0d2VlbiAwICYgMjU1CiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbiAgICAgICAoaW5wdXQgdmVjdG9yKQpAQCAtMTE4OCw2ICsxMDg4LDI1IEBACiAgICAgb3V0X207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSApCiAKKyNkZWZpbmUgQ0xJUF9TV18wXzI1NV9NQVhfU0FUVShpbikgICAgICAgICAgICAgICAgICAgIFwKKyggeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2NGkzMiBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXRfbSA9IF9fbXNhX21heGlfc193KCh2NGkzMikgaW4sIDApOyAgICAgICAgICAgIFwKKyAgICBvdXRfbSA9ICh2NGkzMikgX19tc2Ffc2F0X3VfdygodjR1MzIpIG91dF9tLCA3KTsgIFwKKyAgICBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gKQorI2RlZmluZSBDTElQX1NXMl8wXzI1NV9NQVhfU0FUVShpbjAsIGluMSkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW4wID0gQ0xJUF9TV18wXzI1NV9NQVhfU0FUVShpbjApOyAgICAgXAorICAgIGluMSA9IENMSVBfU1dfMF8yNTVfTUFYX1NBVFUoaW4xKTsgICAgIFwKK30KKyNkZWZpbmUgQ0xJUF9TVzRfMF8yNTVfTUFYX1NBVFUoaW4wLCBpbjEsIGluMiwgaW4zKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0xJUF9TVzJfMF8yNTVfTUFYX1NBVFUoaW4wLCBpbjEpOyAgICAgICAgICAgICAgIFwKKyAgICBDTElQX1NXMl8wXzI1NV9NQVhfU0FUVShpbjIsIGluMyk7ICAgICAgICAgICAgICAgXAorfQorCiAvKiBEZXNjcmlwdGlvbiA6IEFkZGl0aW9uIG9mIDQgc2lnbmVkIHdvcmQgZWxlbWVudHMKICAgICAgICAgICAgICAgICAgNCBzaWduZWQgd29yZCBlbGVtZW50cyBvZiBpbnB1dCB2ZWN0b3IgYXJlIGFkZGVkIHRvZ2V0aGVyIGFuZAogICAgICAgICAgICAgICAgICByZXN1bHRlZCBpbnRlZ2VyIHN1bSBpcyByZXR1cm5lZApAQCAtMTIwMiw3ICsxMTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICByZXMwX20gPSBfX21zYV9oYWRkX3NfZCgodjRpMzIpIGluLCAodjRpMzIpIGluKTsgIFwKICAgICByZXMxX20gPSBfX21zYV9zcGxhdGlfZChyZXMwX20sIDEpOyAgICAgICAgICAgICAgIFwKLSAgICByZXMwX20gPSByZXMwX20gKyByZXMxX207ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXMwX20gKz0gcmVzMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBzdW1fbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMikgcmVzMF9tLCAwKTsgICAgICAgIFwKICAgICBzdW1fbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gKQpAQCAtMTIyMyw3ICsxMTQyLDcgQEAKICAgICByZXNfbSA9IF9fbXNhX2hhZGRfdV93KCh2OHUxNikgaW4sICh2OHUxNikgaW4pOyAgICAgIFwKICAgICByZXMwX20gPSBfX21zYV9oYWRkX3VfZChyZXNfbSwgcmVzX20pOyAgICAgICAgICAgICAgIFwKICAgICByZXMxX20gPSAodjJ1NjQpIF9fbXNhX3NwbGF0aV9kKCh2Mmk2NCkgcmVzMF9tLCAxKTsgIFwKLSAgICByZXMwX20gPSByZXMwX20gKyByZXMxX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXMwX20gKz0gcmVzMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBzdW1fbSA9IF9fbXNhX2NvcHlfdV93KCh2NGkzMikgcmVzMF9tLCAwKTsgICAgICAgICAgIFwKICAgICBzdW1fbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gKQpAQCAtMTM1Miw2ICsxMjcxLDcgQEAKIH0KICNkZWZpbmUgSU5TRVJUX1c0X1VCKC4uLikgSU5TRVJUX1c0KHYxNnU4LCBfX1ZBX0FSR1NfXykKICNkZWZpbmUgSU5TRVJUX1c0X1NCKC4uLikgSU5TRVJUX1c0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5TRVJUX1c0X1NIKC4uLikgSU5TRVJUX1c0KHY4aTE2LCBfX1ZBX0FSR1NfXykKICNkZWZpbmUgSU5TRVJUX1c0X1NXKC4uLikgSU5TRVJUX1c0KHY0aTMyLCBfX1ZBX0FSR1NfXykKIAogLyogRGVzY3JpcHRpb24gOiBJbnNlcnQgc3BlY2lmaWVkIGRvdWJsZSB3b3JkIGVsZW1lbnRzIGZyb20gaW5wdXQgdmVjdG9ycyB0byAxCkBAIC0xMzY3LDYgKzEyODcsNyBAQAogfQogI2RlZmluZSBJTlNFUlRfRDJfVUIoLi4uKSBJTlNFUlRfRDIodjE2dTgsIF9fVkFfQVJHU19fKQogI2RlZmluZSBJTlNFUlRfRDJfU0IoLi4uKSBJTlNFUlRfRDIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTlNFUlRfRDJfU0goLi4uKSBJTlNFUlRfRDIodjhpMTYsIF9fVkFfQVJHU19fKQogI2RlZmluZSBJTlNFUlRfRDJfU0QoLi4uKSBJTlNFUlRfRDIodjJpNjQsIF9fVkFfQVJHU19fKQogCiAvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgZXZlbiBieXRlIGVsZW1lbnRzIGZyb20gdmVjdG9ycwpAQCAtMTU0NCw2ICsxNDY1LDcgQEAKICAgICBvdXQyID0gKFJUWVBFKSBfX21zYV9pbHZyX2IoKHYxNmk4KSBpbjQsICh2MTZpOCkgaW41KTsgICAgICAgICAgICAgIFwKIH0KICNkZWZpbmUgSUxWUl9CM19VQiguLi4pIElMVlJfQjModjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0IzX1NCKC4uLikgSUxWUl9CMyh2MTZpOCwgX19WQV9BUkdTX18pCiAjZGVmaW5lIElMVlJfQjNfVUgoLi4uKSBJTFZSX0IzKHY4dTE2LCBfX1ZBX0FSR1NfXykKICNkZWZpbmUgSUxWUl9CM19TSCguLi4pIElMVlJfQjModjhpMTYsIF9fVkFfQVJHU19fKQogCkBAIC0xNTczLDcgKzE0OTUsNyBAQAogLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIHJpZ2h0IGhhbGYgb2YgaGFsZndvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNwogICAgICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MSwgb3V0Miwgb3V0MwotICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHNpZ25lZCBoYWxmd29yZAorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOiBSaWdodCBoYWxmIG9mIGhhbGZ3b3JkIGVsZW1lbnRzIG9mIGluMCBhbmQgcmlnaHQgaGFsZiBvZgogICAgICAgICAgICAgICAgICBoYWxmd29yZCBlbGVtZW50cyBvZiBpbjEgYXJlIGludGVybGVhdmVkIGFuZCBjb3BpZWQgdG8gb3V0MC4KICAgICAgICAgICAgICAgICAgUmlnaHQgaGFsZiBvZiBoYWxmd29yZCBlbGVtZW50cyBvZiBpbjIgYW5kIHJpZ2h0IGhhbGYgb2YKQEAgLTE2MjUsMTYgKzE1NDcsMTYgQEAKIC8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSByaWdodCBoYWxmIG9mIGRvdWJsZSB3b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycwogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMKLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBkb3VibGUgd29yZAorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOiBSaWdodCBoYWxmIG9mIGRvdWJsZSB3b3JkIGVsZW1lbnRzIG9mIGluMCBhbmQgcmlnaHQgaGFsZiBvZgogICAgICAgICAgICAgICAgICBkb3VibGUgd29yZCBlbGVtZW50cyBvZiBpbjEgYXJlIGludGVybGVhdmVkIGFuZCBjb3BpZWQgdG8gb3V0MC4KICAgICAgICAgICAgICAgICAgUmlnaHQgaGFsZiBvZiBkb3VibGUgd29yZCBlbGVtZW50cyBvZiBpbjIgYW5kIHJpZ2h0IGhhbGYgb2YKICAgICAgICAgICAgICAgICAgZG91YmxlIHdvcmQgZWxlbWVudHMgb2YgaW4zIGFyZSBpbnRlcmxlYXZlZCBhbmQgY29waWVkIHRvIG91dDEuCiAqLwotI2RlZmluZSBJTFZSX0QyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpICAgICAgICAgIFwKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb3V0MCA9IChSVFlQRSkgX19tc2FfaWx2cl9kKCh2Mmk2NCkgKGluMCksICh2Mmk2NCkgKGluMSkpOyAgXAotICAgIG91dDEgPSAoUlRZUEUpIF9fbXNhX2lsdnJfZCgodjJpNjQpIChpbjIpLCAodjJpNjQpIChpbjMpKTsgIFwKKyNkZWZpbmUgSUxWUl9EMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQwID0gKFJUWVBFKSBfX21zYV9pbHZyX2QoKHYyaTY0KSBpbjAsICh2Mmk2NCkgaW4xKTsgIFwKKyAgICBvdXQxID0gKFJUWVBFKSBfX21zYV9pbHZyX2QoKHYyaTY0KSBpbjIsICh2Mmk2NCkgaW4zKTsgIFwKIH0KICNkZWZpbmUgSUxWUl9EMl9VQiguLi4pIElMVlJfRDIodjE2dTgsIF9fVkFfQVJHU19fKQogI2RlZmluZSBJTFZSX0QyX1NCKC4uLikgSUxWUl9EMih2MTZpOCwgX19WQV9BUkdTX18pCkBAIC0xNjQzLDcgKzE1NjUsNyBAQAogI2RlZmluZSBJTFZSX0QzKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBvdXQwLCBvdXQxLCBvdXQyKSAgXAogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIElMVlJfRDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgIG91dDIgPSAoUlRZUEUpIF9fbXNhX2lsdnJfZCgodjJpNjQpIChpbjQpLCAodjJpNjQpIChpbjUpKTsgICAgICAgICAgXAorICAgIG91dDIgPSAoUlRZUEUpIF9fbXNhX2lsdnJfZCgodjJpNjQpIGluNCwgKHYyaTY0KSBpbjUpOyAgICAgICAgICAgICAgXAogfQogI2RlZmluZSBJTFZSX0QzX1NCKC4uLikgSUxWUl9EMyh2MTZpOCwgX19WQV9BUkdTX18pCiAKQEAgLTE2NTYsNiArMTU3OCwyNCBAQAogI2RlZmluZSBJTFZSX0Q0X1NCKC4uLikgSUxWUl9ENCh2MTZpOCwgX19WQV9BUkdTX18pCiAjZGVmaW5lIElMVlJfRDRfVUIoLi4uKSBJTFZSX0Q0KHYxNnU4LCBfX1ZBX0FSR1NfXykKIAorLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGxlZnQgaGFsZiBvZiBkb3VibGUgd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICAgICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICAgRGV0YWlscyAgICAgOiBMZWZ0IGhhbGYgb2YgZG91YmxlIHdvcmQgZWxlbWVudHMgb2YgaW4wIGFuZCBsZWZ0IGhhbGYgb2YKKyAgICAgICAgICAgICAgICAgZG91YmxlIHdvcmQgZWxlbWVudHMgb2YgaW4xIGFyZSBpbnRlcmxlYXZlZCBhbmQgY29waWVkIHRvIG91dDAuCisgICAgICAgICAgICAgICAgIExlZnQgaGFsZiBvZiBkb3VibGUgd29yZCBlbGVtZW50cyBvZiBpbjIgYW5kIGxlZnQgaGFsZiBvZgorICAgICAgICAgICAgICAgICBkb3VibGUgd29yZCBlbGVtZW50cyBvZiBpbjMgYXJlIGludGVybGVhdmVkIGFuZCBjb3BpZWQgdG8gb3V0MS4KKyovCisjZGVmaW5lIElMVkxfRDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0MCA9IChSVFlQRSkgX19tc2FfaWx2bF9kKCh2Mmk2NCkgaW4wLCAodjJpNjQpIGluMSk7ICBcCisgICAgb3V0MSA9IChSVFlQRSkgX19tc2FfaWx2bF9kKCh2Mmk2NCkgaW4yLCAodjJpNjQpIGluMyk7ICBcCit9CisjZGVmaW5lIElMVkxfRDJfVUIoLi4uKSBJTFZMX0QyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWTF9EMl9TQiguLi4pIElMVkxfRDIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZMX0QyX1NIKC4uLikgSUxWTF9EMih2OGkxNiwgX19WQV9BUkdTX18pCisKIC8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBib3RoIGxlZnQgYW5kIHJpZ2h0IGhhbGYgb2YgaW5wdXQgdmVjdG9ycwogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKQEAgLTE2ODEsNiArMTYyMSw3IEBACiAgICAgb3V0MCA9IChSVFlQRSkgX19tc2FfaWx2cl9oKCh2OGkxNikgaW4wLCAodjhpMTYpIGluMSk7ICBcCiAgICAgb3V0MSA9IChSVFlQRSkgX19tc2FfaWx2bF9oKCh2OGkxNikgaW4wLCAodjhpMTYpIGluMSk7ICBcCiB9CisjZGVmaW5lIElMVlJMX0gyX1VCKC4uLikgSUxWUkxfSDIodjE2dTgsIF9fVkFfQVJHU19fKQogI2RlZmluZSBJTFZSTF9IMl9TQiguLi4pIElMVlJMX0gyKHYxNmk4LCBfX1ZBX0FSR1NfXykKICNkZWZpbmUgSUxWUkxfSDJfU0goLi4uKSBJTFZSTF9IMih2OGkxNiwgX19WQV9BUkdTX18pCiAjZGVmaW5lIElMVlJMX0gyX1NXKC4uLikgSUxWUkxfSDIodjRpMzIsIF9fVkFfQVJHU19fKQpAQCAtMTY5OCwxNCArMTYzOSwxNCBAQAogICAgICAgICAgICAgICAgICA1LWJpdCBzaWduZWQgaW1tZWRpYXRlIHZhbHVlIGFyZSBjb3BpZWQgdG8gdGhlIG91dHB1dCB2ZWN0b3IKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgbWF4X3ZhbAogICAgICAgICAgICAgICAgICBPdXRwdXRzIC0gaW4wLCBpbjEsIGluMiwgaW4zIChpbiBwbGFjZSkKLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBoYWxmd29yZAorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOiBNYXhpbXVtIG9mIHNpZ25lZCBoYWxmd29yZCBlbGVtZW50IHZhbHVlcyBmcm9tICdpbjAnIGFuZAogICAgICAgICAgICAgICAgICAnbWF4X3ZhbCcgYXJlIHdyaXR0ZW4gdG8gb3V0cHV0IHZlY3RvciAnaW4wJwogKi8KLSNkZWZpbmUgTUFYSV9TSDIoUlRZUEUsIGluMCwgaW4xLCBtYXhfdmFsKSAgICAgICAgICAgICAgICAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW4wID0gKFJUWVBFKSBfX21zYV9tYXhpX3NfaCgodjhpMTYpIGluMCwgKG1heF92YWwpKTsgIFwKLSAgICBpbjEgPSAoUlRZUEUpIF9fbXNhX21heGlfc19oKCh2OGkxNikgaW4xLCAobWF4X3ZhbCkpOyAgXAorI2RlZmluZSBNQVhJX1NIMihSVFlQRSwgaW4wLCBpbjEsIG1heF92YWwpICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluMCA9IChSVFlQRSkgX19tc2FfbWF4aV9zX2goKHY4aTE2KSBpbjAsIG1heF92YWwpOyAgXAorICAgIGluMSA9IChSVFlQRSkgX19tc2FfbWF4aV9zX2goKHY4aTE2KSBpbjEsIG1heF92YWwpOyAgXAogfQogI2RlZmluZSBNQVhJX1NIMl9VSCguLi4pIE1BWElfU0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKICNkZWZpbmUgTUFYSV9TSDJfU0goLi4uKSBNQVhJX1NIMih2OGkxNiwgX19WQV9BUkdTX18pCkBAIC0xNzE2LDEzICsxNjU3LDIyIEBACiAgICAgTUFYSV9TSDIoUlRZUEUsIGluMiwgaW4zLCBtYXhfdmFsKTsgICAgICAgICAgICAgICBcCiB9CiAjZGVmaW5lIE1BWElfU0g0X1VIKC4uLikgTUFYSV9TSDQodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBNQVhJX1NINF9TSCguLi4pIE1BWElfU0g0KHY4aTE2LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBNQVhJX1NIOChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIG1heF92YWwpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNQVhJX1NINChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBtYXhfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1BWElfU0g0KFJUWVBFLCBpbjQsIGluNSwgaW42LCBpbjcsIG1heF92YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIE1BWElfU0g4X1VIKC4uLikgTUFYSV9TSDgodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBNQVhJX1NIOF9TSCguLi4pIE1BWElfU0g4KHY4aTE2LCBfX1ZBX0FSR1NfXykKIAogLyogRGVzY3JpcHRpb24gOiBTYXR1cmF0ZSB0aGUgaGFsZndvcmQgZWxlbWVudCB2YWx1ZXMgdG8gdGhlIG1heAogICAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWx1ZSBvZiAoc2F0X3ZhbCsxIGJpdHMpCiAgICAgICAgICAgICAgICAgIFRoZSBlbGVtZW50IGRhdGEgd2lkdGggcmVtYWlucyB1bmNoYW5nZWQKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgc2F0X3ZhbAogICAgICAgICAgICAgICAgICBPdXRwdXRzIC0gaW4wLCBpbjEsIGluMiwgaW4zIChpbiBwbGFjZSkKLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBoYWxmd29yZAorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOiBFYWNoIHVuc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnQgZnJvbSAnaW4wJyBpcyBzYXR1cmF0ZWQgdG8gdGhlCiAgICAgICAgICAgICAgICAgIHZhbHVlIGdlbmVyYXRlZCB3aXRoIChzYXRfdmFsKzEpIGJpdCByYW5nZQogICAgICAgICAgICAgICAgICBSZXN1bHRzIGFyZSBpbiBwbGFjZWQgdG8gb3JpZ2luYWwgdmVjdG9ycwpAQCAtMTczOCwxNiArMTY4OCwyNSBAQAogI2RlZmluZSBTQVRfVUg0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHNhdF92YWwpICBcCiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBTQVRfVUgyKFJUWVBFLCBpbjAsIGluMSwgc2F0X3ZhbCk7ICAgICAgICAgICAgICAgXAotICAgIFNBVF9VSDIoUlRZUEUsIGluMiwgaW4zLCBzYXRfdmFsKSAgICAgICAgICAgICAgICBcCisgICAgU0FUX1VIMihSVFlQRSwgaW4yLCBpbjMsIHNhdF92YWwpOyAgICAgICAgICAgICAgIFwKIH0KICNkZWZpbmUgU0FUX1VINF9VSCguLi4pIFNBVF9VSDQodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTQVRfVUg0X1NIKC4uLikgU0FUX1VINCh2OGkxNiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU0FUX1VIOChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIHNhdF92YWwpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNBVF9VSDQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgc2F0X3ZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTQVRfVUg0KFJUWVBFLCBpbjQsIGluNSwgaW42LCBpbjcsIHNhdF92YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIFNBVF9VSDhfVUgoLi4uKSBTQVRfVUg4KHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU0FUX1VIOF9TSCguLi4pIFNBVF9VSDgodjhpMTYsIF9fVkFfQVJHU19fKQogCiAvKiBEZXNjcmlwdGlvbiA6IFNhdHVyYXRlIHRoZSBoYWxmd29yZCBlbGVtZW50IHZhbHVlcyB0byB0aGUgbWF4CiAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbHVlIG9mIChzYXRfdmFsKzEgYml0cykKICAgICAgICAgICAgICAgICAgVGhlIGVsZW1lbnQgZGF0YSB3aWR0aCByZW1haW5zIHVuY2hhbmdlZAogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBzYXRfdmFsCiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBpbjAsIGluMSwgaW4yLCBpbjMgKGluIHBsYWNlKQotICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHVuc2lnbmVkIGhhbGZ3b3JkCisgICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCiAgICBEZXRhaWxzICAgICA6IEVhY2ggdW5zaWduZWQgaGFsZndvcmQgZWxlbWVudCBmcm9tICdpbjAnIGlzIHNhdHVyYXRlZCB0byB0aGUKICAgICAgICAgICAgICAgICAgdmFsdWUgZ2VuZXJhdGVkIHdpdGggKHNhdF92YWwrMSkgYml0IHJhbmdlCiAgICAgICAgICAgICAgICAgIFJlc3VsdHMgYXJlIGluIHBsYWNlZCB0byBvcmlnaW5hbCB2ZWN0b3JzCkBAIC0xNzYxLDcgKzE3MjAsNyBAQAogCiAjZGVmaW5lIFNBVF9TSDMoUlRZUEUsIGluMCwgaW4xLCBpbjIsIHNhdF92YWwpICAgICAgICAgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFNBVF9TSDIoUlRZUEUsIGluMCwgaW4xLCBzYXRfdmFsKSAgICAgICAgICAgICAgICAgICBcCisgICAgU0FUX1NIMihSVFlQRSwgaW4wLCBpbjEsIHNhdF92YWwpOyAgICAgICAgICAgICAgICAgIFwKICAgICBpbjIgPSAoUlRZUEUpIF9fbXNhX3NhdF9zX2goKHY4aTE2KSBpbjIsIHNhdF92YWwpOyAgXAogfQogI2RlZmluZSBTQVRfU0gzX1NIKC4uLikgU0FUX1NIMyh2OGkxNiwgX19WQV9BUkdTX18pCkBAIC0xNzc4LDcgKzE3MzcsNyBAQAogICAgICAgICAgICAgICAgICBUaGUgZWxlbWVudCBkYXRhIHdpZHRoIHJlbWFpbnMgdW5jaGFuZ2VkCiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIHNhdF92YWwKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIGluMCwgaW4xLCBpbjIsIGluMyAoaW4gcGxhY2UpCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gdW5zaWduZWQgd29yZAorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOiBFYWNoIHVuc2lnbmVkIHdvcmQgZWxlbWVudCBmcm9tICdpbjAnIGlzIHNhdHVyYXRlZCB0byB0aGUKICAgICAgICAgICAgICAgICAgdmFsdWUgZ2VuZXJhdGVkIHdpdGggKHNhdF92YWwrMSkgYml0IHJhbmdlCiAgICAgICAgICAgICAgICAgIFJlc3VsdHMgYXJlIGluIHBsYWNlZCB0byBvcmlnaW5hbCB2ZWN0b3JzCkBAIC0xOTMwLDcgKzE4ODksNyBAQAogLyogRGVzY3JpcHRpb24gOiBQYWNrIGV2ZW4gZG91YmxlIHdvcmQgZWxlbWVudHMgb2YgdmVjdG9yIHBhaXJzCiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBieXRlCisgICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCiAgICBEZXRhaWxzICAgICA6IEV2ZW4gZG91YmxlIGVsZW1lbnRzIG9mIGluMCBhcmUgY29waWVkIHRvIHRoZSBsZWZ0IGhhbGYgb2YKICAgICAgICAgICAgICAgICAgb3V0MCAmIGV2ZW4gZG91YmxlIGVsZW1lbnRzIG9mIGluMSBhcmUgY29waWVkIHRvIHRoZSByaWdodAogICAgICAgICAgICAgICAgICBoYWxmIG9mIG91dDAuCkBAIC0yMDM3LDYgKzE5OTYsNyBAQAogICAgIFhPUklfQjRfMTI4KFJUWVBFLCBpbjQsIGluNSwgaW42LCBpbjcpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAjZGVmaW5lIFhPUklfQjhfMTI4X1NCKC4uLikgWE9SSV9COF8xMjgodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBYT1JJX0I4XzEyOF9VQiguLi4pIFhPUklfQjhfMTI4KHYxNnU4LCBfX1ZBX0FSR1NfXykKIAogLyogRGVzY3JpcHRpb24gOiBBZGRpdGlvbiBvZiBzaWduZWQgaGFsZndvcmQgZWxlbWVudHMgYW5kIHNpZ25lZCBzYXR1cmF0aW9uCiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKQEAgLTIwNzEsNiArMjAzMSwxMSBAQAogICAgICAgICAgICAgICAgICByZXN1bHQgaXMgaW4gcGxhY2Ugd3JpdHRlbiB0byAnaW4wJwogICAgICAgICAgICAgICAgICBTaW1pbGFyIGZvciBvdGhlciBwYWlycwogKi8KKyNkZWZpbmUgU0xMSV8yVihpbjAsIGluMSwgc2hpZnQpICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGluMCA9IGluMCA8PCBzaGlmdDsgICAgICAgICAgIFwKKyAgICBpbjEgPSBpbjEgPDwgc2hpZnQ7ICAgICAgICAgICBcCit9CiAjZGVmaW5lIFNMTElfNFYoaW4wLCBpbjEsIGluMiwgaW4zLCBzaGlmdCkgIFwKIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGluMCA9IGluMCA8PCBzaGlmdDsgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMTAwLDcgKzIwNjUsNyBAQAogLyogRGVzY3JpcHRpb24gOiBTaGlmdCByaWdodCBsb2dpY2FsIGFsbCBoYWxmd29yZCBlbGVtZW50cyBvZiB2ZWN0b3IKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgc2hpZnQKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIGluMCwgaW4xLCBpbjIsIGluMyAoaW4gcGxhY2UpCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gdW5zaWduZWQgaGFsZndvcmQKKyAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKICAgIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IG9mIHZlY3RvciAnaW4wJyBpcyBzaGlmdGVkIHJpZ2h0IGxvZ2ljYWwgYnkKICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGJpdHMgcmVzcGVjdGl2ZSBlbGVtZW50IGhvbGRzIGluIHZlY3RvciAnc2hpZnQnIGFuZAogICAgICAgICAgICAgICAgICByZXN1bHQgaXMgaW4gcGxhY2Ugd3JpdHRlbiB0byAnaW4wJwpAQCAtMjExNiwxMCArMjA4MSwyOCBAQAogfQogI2RlZmluZSBTUkxfSDRfVUgoLi4uKSBTUkxfSDQodjh1MTYsIF9fVkFfQVJHU19fKQogCisjZGVmaW5lIFNSTFJfSDQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgc2hpZnQpICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbjAgPSAoUlRZUEUpIF9fbXNhX3NybHJfaCgodjhpMTYpIGluMCwgKHY4aTE2KSBzaGlmdCk7ICBcCisgICAgaW4xID0gKFJUWVBFKSBfX21zYV9zcmxyX2goKHY4aTE2KSBpbjEsICh2OGkxNikgc2hpZnQpOyAgXAorICAgIGluMiA9IChSVFlQRSkgX19tc2Ffc3Jscl9oKCh2OGkxNikgaW4yLCAodjhpMTYpIHNoaWZ0KTsgIFwKKyAgICBpbjMgPSAoUlRZUEUpIF9fbXNhX3NybHJfaCgodjhpMTYpIGluMywgKHY4aTE2KSBzaGlmdCk7ICBcCit9CisjZGVmaW5lIFNSTFJfSDRfVUgoLi4uKSBTUkxSX0g0KHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JMUl9INF9TSCguLi4pIFNSTFJfSDQodjhpMTYsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNSTFJfSDgoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCBzaGlmdCkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNSTFJfSDQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1JMUl9INChSVFlQRSwgaW40LCBpbjUsIGluNiwgaW43LCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgU1JMUl9IOF9VSCguLi4pIFNSTFJfSDgodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkxSX0g4X1NIKC4uLikgU1JMUl9IOCh2OGkxNiwgX19WQV9BUkdTX18pCisKIC8qIERlc2NyaXB0aW9uIDogU2hpZnQgcmlnaHQgYXJpdGhtZXRpYyByb3VuZGVkIGhhbGZ3b3JkcwogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIHNoaWZ0CiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBpbjAsIGluMSwgKGluIHBsYWNlKQotICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHVuc2lnbmVkIGhhbGZ3b3JkCisgICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCiAgICBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBvZiB2ZWN0b3IgJ2luMCcgaXMgc2hpZnRlZCByaWdodCBhcml0aG1ldGljIGJ5CiAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBiaXRzIHJlc3BlY3RpdmUgZWxlbWVudCBob2xkcyBpbiB2ZWN0b3IgJ3NoaWZ0Jy4KICAgICAgICAgICAgICAgICAgVGhlIGxhc3QgZGlzY2FyZGVkIGJpdCBpcyBhZGRlZCB0byBzaGlmdGVkIHZhbHVlIGZvciByb3VuZGluZwpAQCAtMjI4MCw2ICsyMjYzLDIyIEBACiAgICAgb3V0MyA9IGluNiAtIGluNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKKy8qIERlc2NyaXB0aW9uIDogU2lnbiBleHRlbmQgYnl0ZSBlbGVtZW50cyBmcm9tIHJpZ2h0IGhhbGYgb2YgdGhlIHZlY3RvcgorICAgQXJndW1lbnRzICAgOiBJbnB1dCAgLSBpbiAgICAoYnl0ZSB2ZWN0b3IpCisgICAgICAgICAgICAgICAgIE91dHB1dCAtIG91dCAgIChzaWduIGV4dGVuZGVkIGhhbGZ3b3JkIHZlY3RvcikKKyAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgaGFsZndvcmQKKyAgIERldGFpbHMgICAgIDogU2lnbiBiaXQgb2YgYnl0ZSBlbGVtZW50cyBmcm9tIGlucHV0IHZlY3RvciAnaW4nIGlzCisgICAgICAgICAgICAgICAgIGV4dHJhY3RlZCBhbmQgaW50ZXJsZWF2ZWQgd2l0aCBzYW1lIHZlY3RvciAnaW4nIHRvIGdlbmVyYXRlCisgICAgICAgICAgICAgICAgIDggaGFsZndvcmQgZWxlbWVudHMga2VlcGluZyBzaWduIGludGFjdAorKi8KKyNkZWZpbmUgVU5QQ0tfUl9TQl9TSChpbiwgb3V0KSAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjE2aTggc2lnbl9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpZ25fbSA9IF9fbXNhX2NsdGlfc19iKCh2MTZpOCkgaW4sIDApOyAgICAgICAgICBcCisgICAgb3V0ID0gKHY4aTE2KSBfX21zYV9pbHZyX2Ioc2lnbl9tLCAodjE2aTgpIGluKTsgIFwKK30KKwogLyogRGVzY3JpcHRpb24gOiBTaWduIGV4dGVuZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tIHJpZ2h0IGhhbGYgb2YgdGhlIHZlY3RvcgogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4gICAgKGlucHV0IGhhbGZ3b3JkIHZlY3RvcikKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dCAgIChzaWduIGV4dGVuZGVkIHdvcmQgdmVjdG9ycykKQEAgLTI0NDUsNyArMjQ0NCw3IEBACiAvKiBEZXNjcmlwdGlvbiA6IFRyYW5zcG9zZXMgaW5wdXQgOHg0IGJ5dGUgYmxvY2sgaW50byA0eDgKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMyAgICAgIChpbnB1dCA4eDQgYnl0ZSBibG9jaykKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMgIChvdXRwdXQgNHg4IGJ5dGUgYmxvY2spCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gdW5zaWduZWQgYnl0ZQorICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQogICAgRGV0YWlscyAgICAgOgogKi8KICNkZWZpbmUgVFJBTlNQT1NFOHg0X1VCKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgIFwKQEAgLTI0NzIsNyArMjQ3MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXQgOHg4IGJ5dGUgYmxvY2spCiAgICAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0cHV0IDh4OCBieXRlIGJsb2NrKQotICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHVuc2lnbmVkIGJ5dGUKKyAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKICAgIERldGFpbHMgICAgIDoKICovCiAjZGVmaW5lIFRSQU5TUE9TRTh4OF9VQihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICAgXApAQCAtMjU5Niw3ICsyNTk1LDcgQEAKIC8qIERlc2NyaXB0aW9uIDogVHJhbnNwb3NlcyA4eDggYmxvY2sgd2l0aCBoYWxmIHdvcmQgZWxlbWVudHMgaW4gdmVjdG9ycwogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcKICAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsIG91dDYsIG91dDcKLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgaGFsZndvcmQKKyAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKICAgIERldGFpbHMgICAgIDoKICovCiAjZGVmaW5lIFRSQU5TUE9TRTh4OF9IKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgICBcCkBAIC0yNjQ2LDggKzI2NDUsNiBAQAogLyogRGVzY3JpcHRpb24gOiBBdmVyYWdlIGJ5dGUgZWxlbWVudHMgZnJvbSBwYWlyIG9mIHZlY3RvcnMgYW5kIHN0b3JlIDh4NCBieXRlCiAgICAgICAgICAgICAgICAgIGJsb2NrIGluIGRlc3RpbmF0aW9uIG1lbW9yeQogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIHBkc3QsIHN0cmlkZQotICAgICAgICAgICAgICAgICBPdXRwdXRzIC0KLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLQogICAgRGV0YWlscyAgICAgOiBFYWNoIGJ5dGUgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciBwYWlyICdpbjAnIGFuZCAnaW4xJyBhcmUKICAgICAgICAgICAgICAgICAgYXZlcmFnZWQgKGEgKyBiKS8yIGFuZCBzdG9yZWQgaW4gJ3RtcDBfbScKICAgICAgICAgICAgICAgICAgRWFjaCBieXRlIGVsZW1lbnQgZnJvbSBpbnB1dCB2ZWN0b3IgcGFpciAnaW4yJyBhbmQgJ2luMycgYXJlCkBAIC0yNjc5LDggKzI2NzYsNiBAQAogLyogRGVzY3JpcHRpb24gOiBBdmVyYWdlIGJ5dGUgZWxlbWVudHMgZnJvbSBwYWlyIG9mIHZlY3RvcnMgYW5kIHN0b3JlIDE2eDQgYnl0ZQogICAgICAgICAgICAgICAgICBibG9jayBpbiBkZXN0aW5hdGlvbiBtZW1vcnkKICAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCBwZHN0LCBzdHJpZGUKLSAgICAgICAgICAgICAgICAgT3V0cHV0cyAtCi0gICAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0KICAgIERldGFpbHMgICAgIDogRWFjaCBieXRlIGVsZW1lbnQgZnJvbSBpbnB1dCB2ZWN0b3IgcGFpciAnaW4wJyBhbmQgJ2luMScgYXJlCiAgICAgICAgICAgICAgICAgIGF2ZXJhZ2VkIChhICsgYikvMiBhbmQgc3RvcmVkIGluICd0bXAwX20nCiAgICAgICAgICAgICAgICAgIEVhY2ggYnl0ZSBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yIHBhaXIgJ2luMicgYW5kICdpbjMnIGFyZQpAQCAtMjcwNyw4ICsyNzAyLDYgQEAKIC8qIERlc2NyaXB0aW9uIDogQXZlcmFnZSByb3VuZGVkIGJ5dGUgZWxlbWVudHMgZnJvbSBwYWlyIG9mIHZlY3RvcnMgYW5kIHN0b3JlCiAgICAgICAgICAgICAgICAgIDh4NCBieXRlIGJsb2NrIGluIGRlc3RpbmF0aW9uIG1lbW9yeQogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIHBkc3QsIHN0cmlkZQotICAgICAgICAgICAgICAgICBPdXRwdXRzIC0KLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLQogICAgRGV0YWlscyAgICAgOiBFYWNoIGJ5dGUgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciBwYWlyICdpbjAnIGFuZCAnaW4xJyBhcmUKICAgICAgICAgICAgICAgICAgYXZlcmFnZSByb3VuZGVkIChhICsgYiArIDEpLzIgYW5kIHN0b3JlZCBpbiAndG1wMF9tJwogICAgICAgICAgICAgICAgICBFYWNoIGJ5dGUgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciBwYWlyICdpbjInIGFuZCAnaW4zJyBhcmUKQEAgLTI3MzgsOCArMjczMSw2IEBACiAvKiBEZXNjcmlwdGlvbiA6IEF2ZXJhZ2Ugcm91bmRlZCBieXRlIGVsZW1lbnRzIGZyb20gcGFpciBvZiB2ZWN0b3JzIGFuZCBzdG9yZQogICAgICAgICAgICAgICAgICAxNng0IGJ5dGUgYmxvY2sgaW4gZGVzdGluYXRpb24gbWVtb3J5CiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgcGRzdCwgc3RyaWRlCi0gICAgICAgICAgICAgICAgIE91dHB1dHMgLQotICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtCiAgICBEZXRhaWxzICAgICA6IEVhY2ggYnl0ZSBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yIHBhaXIgJ2luMCcgYW5kICdpbjEnIGFyZQogICAgICAgICAgICAgICAgICBhdmVyYWdlIHJvdW5kZWQgKGEgKyBiICsgMSkvMiBhbmQgc3RvcmVkIGluICd0bXAwX20nCiAgICAgICAgICAgICAgICAgIEVhY2ggYnl0ZSBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yIHBhaXIgJ2luMicgYW5kICdpbjMnIGFyZQpAQCAtMjc2NCw4ICsyNzU1LDYgQEAKICAgICAgICAgICAgICAgICAgYXZlcmFnZSByb3VuZGVkIHdpdGggZGVzdGluYXRpb24gYW5kIHN0b3JlIDh4NCBieXRlIGJsb2NrCiAgICAgICAgICAgICAgICAgIGluIGRlc3RpbmF0aW9uIG1lbW9yeQogICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsIHBkc3QsIHN0cmlkZQotICAgICAgICAgICAgICAgICBPdXRwdXRzIC0KLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLQogICAgRGV0YWlscyAgICAgOiBFYWNoIGJ5dGUgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciBwYWlyICdpbjAnIGFuZCAnaW4xJyBhcmUKICAgICAgICAgICAgICAgICAgYXZlcmFnZSByb3VuZGVkIChhICsgYiArIDEpLzIgYW5kIHN0b3JlZCBpbiAndG1wMF9tJwogICAgICAgICAgICAgICAgICBFYWNoIGJ5dGUgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciBwYWlyICdpbjInIGFuZCAnaW4zJyBhcmUKQEAgLTI3OTQsOCArMjc4Myw2IEBACiAgICAgICAgICAgICAgICAgIGF2ZXJhZ2Ugcm91bmRlZCB3aXRoIGRlc3RpbmF0aW9uIGFuZCBzdG9yZSAxNng0IGJ5dGUgYmxvY2sKICAgICAgICAgICAgICAgICAgaW4gZGVzdGluYXRpb24gbWVtb3J5CiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgcGRzdCwgc3RyaWRlCi0gICAgICAgICAgICAgICAgIE91dHB1dHMgLQotICAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtCiAgICBEZXRhaWxzICAgICA6IEVhY2ggYnl0ZSBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yIHBhaXIgJ2luMCcgYW5kICdpbjEnIGFyZQogICAgICAgICAgICAgICAgICBhdmVyYWdlIHJvdW5kZWQgKGEgKyBiICsgMSkvMiBhbmQgc3RvcmVkIGluICd0bXAwX20nCiAgICAgICAgICAgICAgICAgIEVhY2ggYnl0ZSBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yIHBhaXIgJ2luMicgYW5kICdpbjMnIGFyZQpAQCAtMjgyMiw4ICsyODA5LDYgQEAKIAogLyogRGVzY3JpcHRpb24gOiBBZGQgYmxvY2sgNHg0CiAgICBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZQotICAgICAgICAgICAgICAgICBPdXRwdXRzIC0KLSAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSB1bnNpZ25lZCBieXRlcwogICAgRGV0YWlscyAgICAgOiBMZWFzdCBzaWduaWZpY2FudCA0IGJ5dGVzIGZyb20gZWFjaCBpbnB1dCB2ZWN0b3IgYXJlIGFkZGVkIHRvCiAgICAgICAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBieXRlcywgY2xpcHBlZCBiZXR3ZWVuIDAtMjU1IGFuZCB0aGVuIHN0b3JlZC4KICovCkBAIC0yODk0LDIwICsyODc5LDE4IEBACiAKIC8qIERlc2NyaXB0aW9uIDogQ29udmVydHMgaW5wdXRzIHRvIHVuc2lnbmVkIGJ5dGVzLCBpbnRlcmxlYXZlLCBhdmVyYWdlICYgc3RvcmUKICAgICAgICAgICAgICAgICAgYXMgOHg0IHVuc2lnbmVkIGJ5dGUgYmxvY2sKLSAgIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkc3QsIHN0cmlkZQorICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBkc3QwLCBkc3QxLCBwZHN0LCBzdHJpZGUKICovCi0jZGVmaW5lIENPTlZFUlRfVUJfQVZHX1NUOHg0X1VCKGluMCwgaW4xLCBpbjIsIGluMywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MywgcGRzdCwgc3RyaWRlKSAgXAoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdjE2dTggdG1wMF9tLCB0bXAxX20sIHRtcDJfbSwgdG1wM19tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50OF90ICpwZHN0X20gPSAodWludDhfdCAqKSAocGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG1wMF9tID0gUENLRVZfWE9SSTEyOF9VQihpbjAsIGluMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bXAxX20gPSBQQ0tFVl9YT1JJMTI4X1VCKGluMiwgaW4zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIElMVlJfRDJfVUIoZHN0MSwgZHN0MCwgZHN0MywgZHN0MiwgdG1wMl9tLCB0bXAzX20pOyAgICAgICAgICAgICAgICBcCi0gICAgQVZFUl9VQjJfVUIodG1wMF9tLCB0bXAyX20sIHRtcDFfbSwgdG1wM19tLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgIFwKLSAgICBTVDh4NF9VQih0bXAwX20sIHRtcDFfbSwgcGRzdF9tLCBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBDT05WRVJUX1VCX0FWR19TVDh4NF9VQihpbjAsIGluMSwgaW4yLCBpbjMsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEsIHBkc3QsIHN0cmlkZSkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHYxNnU4IHRtcDBfbSwgdG1wMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCAqcGRzdF9tID0gKHVpbnQ4X3QgKikgKHBkc3QpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRtcDBfbSA9IFBDS0VWX1hPUkkxMjhfVUIoaW4wLCBpbjEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG1wMV9tID0gUENLRVZfWE9SSTEyOF9VQihpbjIsIGluMyk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBVkVSX1VCMl9VQih0bXAwX20sIGRzdDAsIHRtcDFfbSwgZHN0MSwgdG1wMF9tLCB0bXAxX20pOyAgXAorICAgIFNUOHg0X1VCKHRtcDBfbSwgdG1wMV9tLCBwZHN0X20sIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCiB9CiAKIC8qIERlc2NyaXB0aW9uIDogUGFjayBldmVuIGJ5dGUgZWxlbWVudHMsIGV4dHJhY3QgMCAmIDIgaW5kZXggd29yZHMgZnJvbSBwYWlyCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvbWlwcy9tbWl1dGlscy5oIGIvbGliYXZ1dGlsL21pcHMvbW1pdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTE1NzllCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL21pcHMvbW1pdXRpbHMuaApAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIExvb25nc29uIFNJTUQgdXRpbHMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTG9vbmdzb24gVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiBMaW1pdGVkCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgWmhvdSBYaWFveW9uZyA8emhvdXhpYW95b25nQGxvb25nc29uLmNuPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIEFWVVRJTF9NSVBTX01NSVVUSUxTX0gKKyNkZWZpbmUgQVZVVElMX01JUFNfTU1JVVRJTFNfSAorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21pcHMvYXNtZGVmcy5oIgorCisjaWYgSEFWRV9MT09OR1NPTjIKKworI2RlZmluZSBERUNMQVJFX1ZBUl9MT1czMiAgICAgICBpbnQzMl90IGxvdzMyCisjZGVmaW5lIFJFU1RSSUNUX0FTTV9MT1czMiAgICAgIFtsb3czMl0iPSZyIihsb3czMiksCisjZGVmaW5lIERFQ0xBUkVfVkFSX0FMTDY0ICAgICAgIGludDY0X3QgYWxsNjQKKyNkZWZpbmUgUkVTVFJJQ1RfQVNNX0FMTDY0ICAgICAgW2FsbDY0XSI9JnIiKGFsbDY0KSwKKyNkZWZpbmUgREVDTEFSRV9WQVJfQUREUlQgICAgICAgbWlwc19yZWcgYWRkcnQKKyNkZWZpbmUgUkVTVFJJQ1RfQVNNX0FERFJUICAgICAgW2FkZHJ0XSI9JnIiKGFkZHJ0KSwKKworI2RlZmluZSBNTUlfTFdYKHJlZywgYWRkciwgc3RyaWRlLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVFJfQUREVSAgICAiJVthZGRydF0sICAiI2FkZHIiLCAgICAiI3N0cmlkZSIgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgImx3ICAgICAgICAgIiNyZWciLCAgICAgIiNiaWFzIiglW2FkZHJ0XSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1NXWChyZWcsIGFkZHIsIHN0cmlkZSwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFRSX0FERFUgICAgIiVbYWRkcnRdLCAgIiNhZGRyIiwgICAgIiNzdHJpZGUiICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJzdyAgICAgICAgICIjcmVnIiwgICAgICIjYmlhcyIoJVthZGRydF0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9MRFgocmVnLCBhZGRyLCBzdHJpZGUsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBUUl9BRERVICAgICIlW2FkZHJ0XSwgICIjYWRkciIsICAgICIjc3RyaWRlIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAibGQgICAgICAgICAiI3JlZyIsICAgICAiI2JpYXMiKCVbYWRkcnRdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBNTUlfU0RYKHJlZywgYWRkciwgc3RyaWRlLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQVFJfQUREVSAgICAiJVthZGRydF0sICAiI2FkZHIiLCAgICAiI3N0cmlkZSIgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgInNkICAgICAgICAgIiNyZWciLCAgICAgIiNiaWFzIiglW2FkZHJ0XSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX0xXQzEoZnAsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImx3YzEgICAgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1VMV0MxKGZwLCBhZGRyLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgJVtsb3czMl0sICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJtdGMxICAgICAgICVbbG93MzJdLCAgICIjZnAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9MV1hDMShmcCwgYWRkciwgc3RyaWRlLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBUUl9BRERVICAgICIlW2FkZHJ0XSwgICIjYWRkciIsICAgICIjc3RyaWRlIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICBNTUlfTFdDMShmcCwgJVthZGRydF0sIGJpYXMpCisKKyNkZWZpbmUgTU1JX1NXQzEoZnAsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInN3YzEgICAgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1VTV0MxKGZwLCBhZGRyLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIm1mYzEgICAgICAgJVtsb3czMl0sICAgIiNmcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJ1c3cgICAgICAgICVbbG93MzJdLCAgICIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9TV1hDMShmcCwgYWRkciwgc3RyaWRlLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBUUl9BRERVICAgICIlW2FkZHJ0XSwgICIjYWRkciIsICAgICIjc3RyaWRlIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICBNTUlfU1dDMShmcCwgJVthZGRydF0sIGJpYXMpCisKKyNkZWZpbmUgTU1JX0xEQzEoZnAsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImxkYzEgICAgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1VMREMxKGZwLCBhZGRyLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVsZCAgICAgICAgJVthbGw2NF0sICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJkbXRjMSAgICAgICVbYWxsNjRdLCAgICIjZnAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9MRFhDMShmcCwgYWRkciwgc3RyaWRlLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBUUl9BRERVICAgICIlW2FkZHJ0XSwgICIjYWRkciIsICAgICIjc3RyaWRlIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICBNTUlfTERDMShmcCwgJVthZGRydF0sIGJpYXMpCisKKyNkZWZpbmUgTU1JX1NEQzEoZnAsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNkYzEgICAgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1VTREMxKGZwLCBhZGRyLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImRtZmMxICAgICAgJVthbGw2NF0sICAgIiNmcCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJ1c2QgICAgICAgICVbYWxsNjRdLCAgICIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9TRFhDMShmcCwgYWRkciwgc3RyaWRlLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBUUl9BRERVICAgICIlW2FkZHJ0XSwgICIjYWRkciIsICAgICIjc3RyaWRlIiAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICBNTUlfU0RDMShmcCwgJVthZGRydF0sIGJpYXMpCisKKyNkZWZpbmUgTU1JX0xRKHJlZzEsIHJlZzIsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImxkICAgICAgICAgIiNyZWcxIiwgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJsZCAgICAgICAgICIjcmVnMiIsICA4KyIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9TUShyZWcxLCByZWcyLCBhZGRyLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJzZCAgICAgICAgICIjcmVnMSIsICAgICIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAic2QgICAgICAgICAiI3JlZzIiLCAgOCsiI2JpYXMiKCIjYWRkciIpICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBNTUlfTFFDMShmcDEsIGZwMiwgYWRkciwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAibGRjMSAgICAgICAiI2ZwMSIsICAgICAiI2JpYXMiKCIjYWRkciIpICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgImxkYzEgICAgICAgIiNmcDIiLCAgIDgrIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1NRQzEoZnAxLCBmcDIsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInNkYzEgICAgICAgIiNmcDEiLCAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJzZGMxICAgICAgICIjZnAyIiwgICA4KyIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZWxpZiBIQVZFX0xPT05HU09OMyAvKiAhSEFWRV9MT09OR1NPTjIgKi8KKworI2RlZmluZSBERUNMQVJFX1ZBUl9BTEw2NAorI2RlZmluZSBSRVNUUklDVF9BU01fQUxMNjQKKyNkZWZpbmUgREVDTEFSRV9WQVJfQUREUlQKKyNkZWZpbmUgUkVTVFJJQ1RfQVNNX0FERFJUCisKKyNkZWZpbmUgTU1JX0xXWChyZWcsIGFkZHIsIHN0cmlkZSwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzbHd4ICAgICAgIiNyZWciLCAgICAgIiNiaWFzIigiI2FkZHIiLCAiI3N0cmlkZSIpICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1NXWChyZWcsIGFkZHIsIHN0cmlkZSwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzc3d4ICAgICAgIiNyZWciLCAgICAgIiNiaWFzIigiI2FkZHIiLCAiI3N0cmlkZSIpICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX0xEWChyZWcsIGFkZHIsIHN0cmlkZSwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzbGR4ICAgICAgIiNyZWciLCAgICAgIiNiaWFzIigiI2FkZHIiLCAiI3N0cmlkZSIpICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1NEWChyZWcsIGFkZHIsIHN0cmlkZSwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzc2R4ICAgICAgIiNyZWciLCAgICAgIiNiaWFzIigiI2FkZHIiLCAiI3N0cmlkZSIpICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX0xXQzEoZnAsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImx3YzEgICAgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNpZiBfTUlQU19TSU0gPT0gX0FCSU8zMiAvKiB3b3JrYXJvdW5kIGZvciAzQTIwMDAgZ3Nsd2xjMSBidWcgKi8KKworI2RlZmluZSBERUNMQVJFX1ZBUl9MT1czMiAgICAgICBpbnQzMl90IGxvdzMyCisjZGVmaW5lIFJFU1RSSUNUX0FTTV9MT1czMiAgICAgIFtsb3czMl0iPSZyIihsb3czMiksCisKKyNkZWZpbmUgTU1JX1VMV0MxKGZwLCBhZGRyLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgJVtsb3czMl0sICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJtdGMxICAgICAgICVbbG93MzJdLCAgICIjZnAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZWxzZSAvKiBfTUlQU19TSU0gIT0gX0FCSU8zMiAqLworCisjZGVmaW5lIERFQ0xBUkVfVkFSX0xPVzMyCisjZGVmaW5lIFJFU1RSSUNUX0FTTV9MT1czMgorCisjZGVmaW5lIE1NSV9VTFdDMShmcCwgYWRkciwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJnc2x3bGMxICAgICIjZnAiLCAgICAzKyIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAiZ3Nsd3JjMSAgICAiI2ZwIiwgICAgICAiI2JpYXMiKCIjYWRkciIpICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2VuZGlmIC8qIF9NSVBTX1NJTSAhPSBfQUJJTzMyICovCisKKyNkZWZpbmUgTU1JX0xXWEMxKGZwLCBhZGRyLCBzdHJpZGUsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzbHd4YzEgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiLCAiI3N0cmlkZSIpICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1NXQzEoZnAsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInN3YzEgICAgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1VTV0MxKGZwLCBhZGRyLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzc3dsYzEgICAgIiNmcCIsICAgIDMrIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICJnc3N3cmMxICAgICIjZnAiLCAgICAgICIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9TV1hDMShmcCwgYWRkciwgc3RyaWRlLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJnc3N3eGMxICAgICIjZnAiLCAgICAgICIjYmlhcyIoIiNhZGRyIiwgIiNzdHJpZGUiKSAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9MREMxKGZwLCBhZGRyLCBiaWFzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJsZGMxICAgICAgICIjZnAiLCAgICAgICIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE1NSV9VTERDMShmcCwgYWRkciwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJnc2xkbGMxICAgICIjZnAiLCAgICA3KyIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAiZ3NsZHJjMSAgICAiI2ZwIiwgICAgICAiI2JpYXMiKCIjYWRkciIpICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBNTUlfTERYQzEoZnAsIGFkZHIsIHN0cmlkZSwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZ3NsZHhjMSAgICAiI2ZwIiwgICAgICAiI2JpYXMiKCIjYWRkciIsICIjc3RyaWRlIikgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBNTUlfU0RDMShmcCwgYWRkciwgYmlhcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2RjMSAgICAgICAiI2ZwIiwgICAgICAiI2JpYXMiKCIjYWRkciIpICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworI2RlZmluZSBNTUlfVVNEQzEoZnAsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiZ3NzZGxjMSAgICAiI2ZwIiwgICAgNysiI2JpYXMiKCIjYWRkciIpICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgImdzc2RyYzEgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1NEWEMxKGZwLCBhZGRyLCBzdHJpZGUsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzc2R4YzEgICAgIiNmcCIsICAgICAgIiNiaWFzIigiI2FkZHIiLCAiI3N0cmlkZSIpICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX0xRKHJlZzEsIHJlZzIsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzbHEgICAgICAgIiNyZWcxIiwgICAgIiNyZWcyIiwgICAgICIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1NRKHJlZzEsIHJlZzIsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzc3EgICAgICAgIiNyZWcxIiwgICAgIiNyZWcyIiwgICAgICIjYmlhcyIoIiNhZGRyIikgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX0xRQzEoZnAxLCBmcDIsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzbHFjMSAgICAgIiNmcDEiLCAgICAgIiNmcDIiLCAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgTU1JX1NRQzEoZnAxLCBmcDIsIGFkZHIsIGJpYXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImdzc3FjMSAgICAgIiNmcDEiLCAgICAgIiNmcDIiLCAgICAgIiNiaWFzIigiI2FkZHIiKSAgICAgICAgICAgIFxuXHQiCisKKyNlbmRpZiAvKiBIQVZFX0xPT05HU09OMiAqLworCisjZGVmaW5lIFRSQU5TUE9TRV80SChtMSwgbTIsIG0zLCBtNCwgdDEsIHQyLCB0MywgdDQsIHQ1LCByMSwgemVybywgc2hpZnQpIFwKKyAgICAgICAgImxpICAgICAgICAgIiNyMSIsICAweDkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAieG9yICAgICAgICAiI3plcm8iLCIjemVybyIsIiN6ZXJvIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJtdGMxICAgICAgICIjcjEiLCAgIiNzaGlmdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgInB1bnBja2xodyAgIiN0MSIsICAiI20xIiwgICIjemVybyIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAicHVucGNrbGh3ICAiI3Q1IiwgICIjbTIiLCAgIiN6ZXJvIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwc2h1ZmggICAgICIjdDUiLCAgIiN0NSIsICAiI3NoaWZ0IiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgIm9yICAgICAgICAgIiN0MSIsICAiI3QxIiwgICIjdDUiICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAicHVucGNraGh3ICAiI3QyIiwgICIjbTEiLCAgIiN6ZXJvIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwdW5wY2toaHcgICIjdDUiLCAgIiNtMiIsICAiI3plcm8iICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgInBzaHVmaCAgICAgIiN0NSIsICAiI3Q1IiwgICIjc2hpZnQiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAib3IgICAgICAgICAiI3QyIiwgICIjdDIiLCAgIiN0NSIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwdW5wY2tsaHcgICIjdDMiLCAgIiNtMyIsICAiI3plcm8iICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgInB1bnBja2xodyAgIiN0NSIsICAiI200IiwgICIjemVybyIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAicHNodWZoICAgICAiI3Q1IiwgICIjdDUiLCAgIiNzaGlmdCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJvciAgICAgICAgICIjdDMiLCAgIiN0MyIsICAiI3Q1IiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgInB1bnBja2hodyAgIiN0NCIsICAiI20zIiwgICIjemVybyIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAicHVucGNraGh3ICAiI3Q1IiwgICIjbTQiLCAgIiN6ZXJvIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwc2h1ZmggICAgICIjdDUiLCAgIiN0NSIsICAiI3NoaWZ0IiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgIm9yICAgICAgICAgIiN0NCIsICAiI3Q0IiwgICIjdDUiICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAicHVucGNrbHdkICAiI20xIiwgICIjdDEiLCAgIiN0MyIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiBcCisgICAgICAgICJwdW5wY2tod2QgICIjbTIiLCAgIiN0MSIsICAiI3QzIiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIFwKKyAgICAgICAgInB1bnBja2x3ZCAgIiNtMyIsICAiI3QyIiwgICIjdDQiICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgXAorICAgICAgICAicHVucGNraHdkICAiI200IiwgICIjdDIiLCAgIiN0NCIgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisKKyNkZWZpbmUgUFNSQUhfNF9NTUkoZnAxLCBmcDIsIGZwMywgZnA0LCBzaGlmdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJwc3JhaCAgICAgICIjZnAxIiwgICAgICIjZnAxIiwgICAgICIjc2hpZnQiICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAgICAgICAicHNyYWggICAgICAiI2ZwMiIsICAgICAiI2ZwMiIsICAgICAiI3NoaWZ0IiAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgICAgICAgInBzcmFoICAgICAgIiNmcDMiLCAgICAgIiNmcDMiLCAgICAgIiNzaGlmdCIgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICAgICAgICJwc3JhaCAgICAgICIjZnA0IiwgICAgICIjZnA0IiwgICAgICIjc2hpZnQiICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgUFNSQUhfOF9NTUkoZnAxLCBmcDIsIGZwMywgZnA0LCBmcDUsIGZwNiwgZnA3LCBmcDgsIHNoaWZ0KSAgICAgICAgICBcCisgICAgICAgIFBTUkFIXzRfTU1JKGZwMSwgZnAyLCBmcDMsIGZwNCwgc2hpZnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQU1JBSF80X01NSShmcDUsIGZwNiwgZnA3LCBmcDgsIHNoaWZ0KQorCisKKyNlbmRpZiAvKiBBVlVUSUxTX01JUFNfTU1JVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL211cm11cjMuYyBiL2xpYmF2dXRpbC9tdXJtdXIzLmMKaW5kZXggYzRkOGRjYi4uNzk2MTc1MiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL211cm11cjMuYworKysgYi9saWJhdnV0aWwvbXVybXVyMy5jCkBAIC02MCw3ICs2MCw3IEBACiAgICAgcmV0dXJuIGs7CiB9CiAKLXN0YXRpYyB1aW50NjRfdCBpbmxpbmUgZ2V0X2syKGNvbnN0IHVpbnQ4X3QgKnNyYykKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZ2V0X2syKGNvbnN0IHVpbnQ4X3QgKnNyYykKIHsKICAgICB1aW50NjRfdCBrID0gQVZfUkw2NChzcmMgKyA4KTsKICAgICBrICo9IGMyOwpAQCAtNjksNyArNjksNyBAQAogICAgIHJldHVybiBrOwogfQogCi1zdGF0aWMgdWludDY0X3QgaW5saW5lIHVwZGF0ZV9oMSh1aW50NjRfdCBrLCB1aW50NjRfdCBoMSwgdWludDY0X3QgaDIpCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IHVwZGF0ZV9oMSh1aW50NjRfdCBrLCB1aW50NjRfdCBoMSwgdWludDY0X3QgaDIpCiB7CiAgICAgayBePSBoMTsKICAgICBrID0gUk9UKGssIDI3KTsKQEAgLTc5LDcgKzc5LDcgQEAKICAgICByZXR1cm4gazsKIH0KIAotc3RhdGljIHVpbnQ2NF90IGlubGluZSB1cGRhdGVfaDIodWludDY0X3QgaywgdWludDY0X3QgaDEsIHVpbnQ2NF90IGgyKQorc3RhdGljIGlubGluZSB1aW50NjRfdCB1cGRhdGVfaDIodWludDY0X3QgaywgdWludDY0X3QgaDEsIHVpbnQ2NF90IGgyKQogewogICAgIGsgXj0gaDI7CiAgICAgayA9IFJPVChrLCAzMSk7CkBAIC04OSw3ICs4OSwxMSBAQAogICAgIHJldHVybiBrOwogfQogCisjaWYgRkZfQVBJX0NSWVBUT19TSVpFX1QKIHZvaWQgYXZfbXVybXVyM191cGRhdGUoQVZNdXJNdXIzICpjLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4pCisjZWxzZQordm9pZCBhdl9tdXJtdXIzX3VwZGF0ZShBVk11ck11cjMgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyYywgc2l6ZV90IGxlbikKKyNlbmRpZgogewogICAgIGNvbnN0IHVpbnQ4X3QgKmVuZDsKICAgICB1aW50NjRfdCBoMSA9IGMtPmgxLCBoMiA9IGMtPmgyOwpAQCAtMTUzLDQwICsxNTcsMyBAQAogICAgIEFWX1dMNjQoZHN0LCBoMSk7CiAgICAgQVZfV0w2NChkc3QgKyA4LCBoMik7CiB9Ci0KLSNpZmRlZiBURVNUCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCBpOwotICAgIHVpbnQ4X3QgaGFzaF9yZXN1bHRbMTZdID0gezB9OwotICAgIEFWTXVyTXVyMyAqY3R4ID0gYXZfbXVybXVyM19hbGxvYygpOwotI2lmIDEKLSAgICB1aW50OF90IGluWzI1Nl0gPSB7MH07Ci0gICAgdWludDhfdCAqaGFzaGVzID0gYXZfbWFsbG9jeigyNTYgKiAxNik7Ci0gICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQotICAgIHsKLSAgICAgICAgaW5baV0gPSBpOwotICAgICAgICBhdl9tdXJtdXIzX2luaXRfc2VlZGVkKGN0eCwgMjU2IC0gaSk7Ci0gICAgICAgIC8vIE5vdGU6IHRoaXMgYWN0dWFsbHkgdGVzdHMgaGFzaGluZyAwIGJ5dGVzCi0gICAgICAgIGF2X211cm11cjNfdXBkYXRlKGN0eCwgaW4sIGkpOwotICAgICAgICBhdl9tdXJtdXIzX2ZpbmFsKGN0eCwgaGFzaGVzICsgMTYgKiBpKTsKLSAgICB9Ci0gICAgYXZfbXVybXVyM19pbml0X3NlZWRlZChjdHgsIDApOwotICAgIGF2X211cm11cjNfdXBkYXRlKGN0eCwgaGFzaGVzLCAyNTYgKiAxNik7Ci0gICAgYXZfbXVybXVyM19maW5hbChjdHgsIGhhc2hfcmVzdWx0KTsKLSAgICBhdl9mcmVlKGhhc2hlcyk7Ci0gICAgYXZfZnJlZXAoJmN0eCk7Ci0gICAgcHJpbnRmKCJyZXN1bHQ6IDB4JSJQUkl4NjQiIDB4JSJQUkl4NjQiXG4iLCBBVl9STDY0KGhhc2hfcmVzdWx0KSwgQVZfUkw2NChoYXNoX3Jlc3VsdCArIDgpKTsKLSAgICAvLyBvZmZpY2lhbCByZWZlcmVuY2UgdmFsdWUgaXMgMzIgYml0Ci0gICAgcmV0dXJuIEFWX1JMMzIoaGFzaF9yZXN1bHQpICE9IDB4NjM4NGJhNjk7Ci0jZWxzZQotICAgIHVpbnQ4X3QgKmluID0gYXZfbWFsbG9jeig1MTIqMTAyNCk7Ci0gICAgYXZfbXVybXVyM19pbml0KGN0eCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDQwKjEwMjQ7IGkrKykKLSAgICAgICAgYXZfbXVybXVyM191cGRhdGUoY3R4LCBpbiwgNTEyKjEwMjQpOwotICAgIGF2X211cm11cjNfZmluYWwoY3R4LCBoYXNoX3Jlc3VsdCk7Ci0gICAgYXZfZnJlZShpbik7Ci0gICAgcmV0dXJuIGhhc2hfcmVzdWx0WzBdOwotI2VuZGlmCi19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9tdXJtdXIzLmggYi9saWJhdnV0aWwvbXVybXVyMy5oCmluZGV4IGYyOWVkOTcuLjFiMDkxNzUgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9tdXJtdXIzLmgKKysrIGIvbGliYXZ1dGlsL211cm11cjMuaApAQCAtMTgsMTUgKzE4LDEwMyBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdnVfbXVybXVyMworICogUHVibGljIGhlYWRlciBmb3IgTXVybXVySGFzaDMgaGFzaCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAqLworCiAjaWZuZGVmIEFWVVRJTF9NVVJNVVIzX0gKICNkZWZpbmUgQVZVVElMX01VUk1VUjNfSAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKKyNpbmNsdWRlICJ2ZXJzaW9uLmgiCisKKy8qKgorICogQGRlZmdyb3VwIGxhdnVfbXVybXVyMyBNdXJtdXIzCisgKiBAaW5ncm91cCBsYXZ1X2hhc2gKKyAqIE11cm11ckhhc2gzIGhhc2ggZnVuY3Rpb24gaW1wbGVtZW50YXRpb24uCisgKgorICogTXVybXVySGFzaDMgaXMgYSBub24tY3J5cHRvZ3JhcGhpYyBoYXNoIGZ1bmN0aW9uLCBvZiB3aGljaCB0aHJlZQorICogaW5jb21wYXRpYmxlIHZlcnNpb25zIHdlcmUgY3JlYXRlZCBieSBpdHMgaW52ZW50b3IgQXVzdGluIEFwcGxlYnk6CisgKgorICogLSAzMi1iaXQgb3V0cHV0CisgKiAtIDEyOC1iaXQgb3V0cHV0IGZvciAzMi1iaXQgcGxhdGZvcm1zCisgKiAtIDEyOC1iaXQgb3V0cHV0IGZvciA2NC1iaXQgcGxhdGZvcm1zCisgKgorICogRkZtcGVnIG9ubHkgaW1wbGVtZW50cyB0aGUgbGFzdCB2YXJpYW50OiAxMjgtYml0IG91dHB1dCBkZXNpZ25lZCBmb3IgNjQtYml0CisgKiBwbGF0Zm9ybXMuIEV2ZW4gdGhvdWdoIHRoZSBoYXNoIGZ1bmN0aW9uIHdhcyBkZXNpZ25lZCBmb3IgNjQtYml0IHBsYXRmb3JtcywKKyAqIHRoZSBmdW5jdGlvbiBpbiByZWFsaXR5IHdvcmtzIG9uIDMyLWJpdCBzeXN0ZW1zIHRvbywgb25seSB3aXRoIHJlZHVjZWQKKyAqIHBlcmZvcm1hbmNlLgorICoKKyAqIEBhbmNob3IgbGF2dV9tdXJtdXIzX3NlZWRpbmZvCisgKiBCeSBkZXNpZ24sIE11cm11ckhhc2gzIHJlcXVpcmVzIGEgc2VlZCB0byBvcGVyYXRlLiBJbiByZXNwb25zZSB0byB0aGlzLAorICogbGliYXZ1dGlsIHByb3ZpZGVzIHR3byBmdW5jdGlvbnMgZm9yIGhhc2ggaW5pdGlhdGlvbiwgb25lIHRoYXQgcmVxdWlyZXMgYQorICogc2VlZCAoYXZfbXVybXVyM19pbml0X3NlZWRlZCgpKSBhbmQgb25lIHRoYXQgdXNlcyBhIGZpeGVkIGFyYml0cmFyeSBpbnRlZ2VyCisgKiBhcyB0aGUgc2VlZCwgYW5kIHRoZXJlZm9yZSBkb2VzIG5vdCAoYXZfbXVybXVyM19pbml0KCkpLgorICoKKyAqIFRvIG1ha2UgaGFzaGVzIGNvbXBhcmFibGUsIHlvdSBzaG91bGQgcHJvdmlkZSB0aGUgc2FtZSBzZWVkIGZvciBhbGwgY2FsbHMgdG8KKyAqIHRoaXMgaGFzaCBmdW5jdGlvbiAtLSBpZiB5b3UgYXJlIHN1cHBseWluZyBvbmUgeW91cnNlbGYsIHRoYXQgaXMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEFsbG9jYXRlIGFuIEFWTXVyTXVyMyBoYXNoIGNvbnRleHQuCisgKgorICogQHJldHVybiBVbmluaXRpYWxpemVkIGhhc2ggY29udGV4dCBvciBgTlVMTGAgaW4gY2FzZSBvZiBlcnJvcgorICovCiBzdHJ1Y3QgQVZNdXJNdXIzICphdl9tdXJtdXIzX2FsbG9jKHZvaWQpOworCisvKioKKyAqIEluaXRpYWxpemUgb3IgcmVpbml0aWFsaXplIGFuIEFWTXVyTXVyMyBoYXNoIGNvbnRleHQgd2l0aCBhIHNlZWQuCisgKgorICogQHBhcmFtW291dF0gYyAgICBIYXNoIGNvbnRleHQKKyAqIEBwYXJhbVtpbl0gIHNlZWQgUmFuZG9tIHNlZWQKKyAqCisgKiBAc2VlIGF2X211cm11cjNfaW5pdCgpCisgKiBAc2VlIEByZWYgbGF2dV9tdXJtdXIzX3NlZWRpbmZvICJEZXRhaWxlZCBkZXNjcmlwdGlvbiIgb24gYSBkaXNjdXNzaW9uIG9mCisgKiBzZWVkcyBmb3IgTXVybXVySGFzaDMuCisgKi8KIHZvaWQgYXZfbXVybXVyM19pbml0X3NlZWRlZChzdHJ1Y3QgQVZNdXJNdXIzICpjLCB1aW50NjRfdCBzZWVkKTsKKworLyoqCisgKiBJbml0aWFsaXplIG9yIHJlaW5pdGlhbGl6ZSBhbiBBVk11ck11cjMgaGFzaCBjb250ZXh0LgorICoKKyAqIEVxdWl2YWxlbnQgdG8gYXZfbXVybXVyM19pbml0X3NlZWRlZCgpIHdpdGggYSBidWlsdC1pbiBzZWVkLgorICoKKyAqIEBwYXJhbVtvdXRdIGMgICAgSGFzaCBjb250ZXh0CisgKgorICogQHNlZSBhdl9tdXJtdXIzX2luaXRfc2VlZGVkKCkKKyAqIEBzZWUgQHJlZiBsYXZ1X211cm11cjNfc2VlZGluZm8gIkRldGFpbGVkIGRlc2NyaXB0aW9uIiBvbiBhIGRpc2N1c3Npb24gb2YKKyAqIHNlZWRzIGZvciBNdXJtdXJIYXNoMy4KKyAqLwogdm9pZCBhdl9tdXJtdXIzX2luaXQoc3RydWN0IEFWTXVyTXVyMyAqYyk7CisKKy8qKgorICogVXBkYXRlIGhhc2ggY29udGV4dCB3aXRoIG5ldyBkYXRhLgorICoKKyAqIEBwYXJhbVtvdXRdIGMgICAgSGFzaCBjb250ZXh0CisgKiBAcGFyYW1baW5dICBzcmMgIElucHV0IGRhdGEgdG8gdXBkYXRlIGhhc2ggd2l0aAorICogQHBhcmFtW2luXSAgbGVuICBOdW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBmcm9tIGBzcmNgCisgKi8KKyNpZiBGRl9BUElfQ1JZUFRPX1NJWkVfVAogdm9pZCBhdl9tdXJtdXIzX3VwZGF0ZShzdHJ1Y3QgQVZNdXJNdXIzICpjLCBjb25zdCB1aW50OF90ICpzcmMsIGludCBsZW4pOworI2Vsc2UKK3ZvaWQgYXZfbXVybXVyM191cGRhdGUoc3RydWN0IEFWTXVyTXVyMyAqYywgY29uc3QgdWludDhfdCAqc3JjLCBzaXplX3QgbGVuKTsKKyNlbmRpZgorCisvKioKKyAqIEZpbmlzaCBoYXNoaW5nIGFuZCBvdXRwdXQgZGlnZXN0IHZhbHVlLgorICoKKyAqIEBwYXJhbVtpbixvdXRdIGMgICAgSGFzaCBjb250ZXh0CisgKiBAcGFyYW1bb3V0XSAgICBkc3QgIEJ1ZmZlciB3aGVyZSBvdXRwdXQgZGlnZXN0IHZhbHVlIGlzIHN0b3JlZAorICovCiB2b2lkIGF2X211cm11cjNfZmluYWwoc3RydWN0IEFWTXVyTXVyMyAqYywgdWludDhfdCBkc3RbMTZdKTsKIAorLyoqCisgKiBAfQorICovCisKICNlbmRpZiAvKiBBVlVUSUxfTVVSTVVSM19IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvb3BlbmNsLmMgYi9saWJhdnV0aWwvb3BlbmNsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjUwMzQuLjAwMDAwMDAKLS0tIGEvbGliYXZ1dGlsL29wZW5jbC5jCisrKyAvZGV2L251bGwKQEAgLTEsODc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgUGVuZyAgR2FvICAgICA8cGVuZ0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMiBMaSAgICBDYW8gICAgIDxsaUBtdWx0aWNvcmV3YXJlaW5jLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMiBXZWkgICBHYW8gICAgIDx3ZWlnYW9AbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTMgTGVubnkgV2FuZyAgICA8bHdhbmdocGNAZ21haWwuY29tPgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSAib3BlbmNsLmgiCi0jaW5jbHVkZSAiYXZzdHJpbmcuaCIKLSNpbmNsdWRlICJsb2cuaCIKLSNpbmNsdWRlICJhdmFzc2VydC5oIgotI2luY2x1ZGUgIm9wdC5oIgotCi0jaWYgSEFWRV9USFJFQURTCi0jaW5jbHVkZSAidGhyZWFkLmgiCi0jaW5jbHVkZSAiYXRvbWljLmgiCi0KLXN0YXRpYyBwdGhyZWFkX211dGV4X3QgKiB2b2xhdGlsZSBhdG9taWNfb3BlbmNsX2xvY2sgPSBOVUxMOwotI2RlZmluZSBMT0NLX09QRU5DTCBwdGhyZWFkX211dGV4X2xvY2soYXRvbWljX29wZW5jbF9sb2NrKQotI2RlZmluZSBVTkxPQ0tfT1BFTkNMIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKGF0b21pY19vcGVuY2xfbG9jaykKLSNlbHNlCi0jZGVmaW5lIExPQ0tfT1BFTkNMCi0jZGVmaW5lIFVOTE9DS19PUEVOQ0wKLSNlbmRpZgotCi0jZGVmaW5lIE1BWF9LRVJORUxfQ09ERV9OVU0gMjAwCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBpbnQgaXNfY29tcGlsZWQ7Ci0gICAgY29uc3QgY2hhciAqa2VybmVsX3N0cmluZzsKLX0gS2VybmVsQ29kZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwotICAgIGludCBsb2dfb2Zmc2V0OwotICAgIHZvaWQgKmxvZ19jdHg7Ci0gICAgaW50IGluaXRfY291bnQ7Ci0gICAgaW50IG9wdF9pbml0X2ZsYWc7Ci0gICAgIC8qKgotICAgICAqIGlmIHNldCB0byAxLCB0aGUgT3BlbkNMIGVudmlyb25tZW50IHdhcyBjcmVhdGVkIGJ5IHRoZSB1c2VyIGFuZAotICAgICAqIHBhc3NlZCBhcyBBVk9wZW5DTEV4dGVybmFsRW52IHdoZW4gaW5pdGluZyAsMDpjcmVhdGVkIGJ5IG9wZW5jbCB3cmFwcGVyLgotICAgICAqLwotICAgIGludCBpc191c2VyX2NyZWF0ZWQ7Ci0gICAgaW50IHBsYXRmb3JtX2lkeDsKLSAgICBpbnQgZGV2aWNlX2lkeDsKLSAgICBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybV9pZDsKLSAgICBjbF9kZXZpY2VfdHlwZSBkZXZpY2VfdHlwZTsKLSAgICBjbF9jb250ZXh0IGNvbnRleHQ7Ci0gICAgY2xfZGV2aWNlX2lkIGRldmljZV9pZDsKLSAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWU7Ci0gICAgaW50IGtlcm5lbF9jb2RlX2NvdW50OwotICAgIEtlcm5lbENvZGUga2VybmVsX2NvZGVbTUFYX0tFUk5FTF9DT0RFX05VTV07Ci0gICAgQVZPcGVuQ0xEZXZpY2VMaXN0IGRldmljZV9saXN0OwotfSBPcGVuY2xDb250ZXh0OwotCi0jZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihPcGVuY2xDb250ZXh0LCB4KQotCi1zdGF0aWMgY29uc3QgQVZPcHRpb24gb3BlbmNsX29wdGlvbnNbXSA9IHsKLSAgICAgeyAicGxhdGZvcm1faWR4IiwgICAgICAgICJzZXQgcGxhdGZvcm0gaW5kZXggdmFsdWUiLCAgT0ZGU0VUKHBsYXRmb3JtX2lkeCksICBBVl9PUFRfVFlQRV9JTlQsICAgIHsuaTY0PS0xfSwgLTEsIElOVF9NQVh9LAotICAgICB7ICJkZXZpY2VfaWR4IiwgICAgICAgICAgInNldCBkZXZpY2UgaW5kZXggdmFsdWUiLCAgICBPRkZTRVQoZGV2aWNlX2lkeCksICAgIEFWX09QVF9UWVBFX0lOVCwgICAgey5pNjQ9LTF9LCAtMSwgSU5UX01BWH0sCi0gICAgIHsgTlVMTCB9Ci19OwotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyBvcGVuY2x1dGlsc19jbGFzcyA9IHsKLSAgICAuY2xhc3NfbmFtZSAgICAgICAgICAgICAgICA9ICJvcGVuY2wiLAotICAgIC5vcHRpb24gICAgICAgICAgICAgICAgICAgID0gb3BlbmNsX29wdGlvbnMsCi0gICAgLml0ZW1fbmFtZSAgICAgICAgICAgICAgICAgPSBhdl9kZWZhdWx0X2l0ZW1fbmFtZSwKLSAgICAudmVyc2lvbiAgICAgICAgICAgICAgICAgICA9IExJQkFWVVRJTF9WRVJTSU9OX0lOVCwKLSAgICAubG9nX2xldmVsX29mZnNldF9vZmZzZXQgICA9IG9mZnNldG9mKE9wZW5jbENvbnRleHQsIGxvZ19vZmZzZXQpLAotICAgIC5wYXJlbnRfbG9nX2NvbnRleHRfb2Zmc2V0ID0gb2Zmc2V0b2YoT3BlbmNsQ29udGV4dCwgbG9nX2N0eCksCi19OwotCi1zdGF0aWMgT3BlbmNsQ29udGV4dCBvcGVuY2xfY3R4ID0geyZvcGVuY2x1dGlsc19jbGFzc307Ci0KLXN0YXRpYyBjb25zdCBjbF9kZXZpY2VfdHlwZSBkZXZpY2VfdHlwZVtdID0ge0NMX0RFVklDRV9UWVBFX0dQVSwgQ0xfREVWSUNFX1RZUEVfQ1BVfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBlcnJfY29kZTsKLSAgICBjb25zdCBjaGFyICplcnJfc3RyOwotfSBPcGVuY2xFcnJvck1zZzsKLQotc3RhdGljIGNvbnN0IE9wZW5jbEVycm9yTXNnIG9wZW5jbF9lcnJfbXNnW10gPSB7Ci0gICAge0NMX0RFVklDRV9OT1RfRk9VTkQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJERVZJQ0UgTk9UIEZPVU5EIn0sCi0gICAge0NMX0RFVklDRV9OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICJERVZJQ0UgTk9UIEFWQUlMQUJMRSJ9LAotICAgIHtDTF9DT01QSUxFUl9OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAiQ09NUElMRVIgTk9UIEFWQUlMQUJMRSJ9LAotICAgIHtDTF9NRU1fT0JKRUNUX0FMTE9DQVRJT05fRkFJTFVSRSwgICAgICAgICAgICAgICAgICAiTUVNIE9CSkVDVCBBTExPQ0FUSU9OIEZBSUxVUkUifSwKLSAgICB7Q0xfT1VUX09GX1JFU09VUkNFUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9VVCBPRiBSRVNPVVJDRVMifSwKLSAgICB7Q0xfT1VUX09GX0hPU1RfTUVNT1JZLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9VVCBPRiBIT1NUIE1FTU9SWSJ9LAotICAgIHtDTF9QUk9GSUxJTkdfSU5GT19OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICAiUFJPRklMSU5HIElORk8gTk9UIEFWQUlMQUJMRSJ9LAotICAgIHtDTF9NRU1fQ09QWV9PVkVSTEFQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUVNIENPUFkgT1ZFUkxBUCJ9LAotICAgIHtDTF9JTUFHRV9GT1JNQVRfTUlTTUFUQ0gsICAgICAgICAgICAgICAgICAgICAgICAgICAiSU1BR0UgRk9STUFUIE1JU01BVENIIn0sCi0gICAge0NMX0lNQUdFX0ZPUk1BVF9OT1RfU1VQUE9SVEVELCAgICAgICAgICAgICAgICAgICAgICJJTUFHRSBGT1JNQVQgTk9UX1NVUFBPUlRFRCJ9LAotICAgIHtDTF9CVUlMRF9QUk9HUkFNX0ZBSUxVUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAiQlVJTEQgUFJPR1JBTSBGQUlMVVJFIn0sCi0gICAge0NMX01BUF9GQUlMVVJFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNQVAgRkFJTFVSRSJ9LAotICAgIHtDTF9NSVNBTElHTkVEX1NVQl9CVUZGRVJfT0ZGU0VULCAgICAgICAgICAgICAgICAgICAiTUlTQUxJR05FRCBTVUIgQlVGRkVSIE9GRlNFVCJ9LAotICAgIHtDTF9FWEVDX1NUQVRVU19FUlJPUl9GT1JfRVZFTlRTX0lOX1dBSVRfTElTVCwgICAgICAiRVhFQyBTVEFUVVMgRVJST1IgRk9SIEVWRU5UUyBJTiBXQUlUIExJU1QifSwKLSAgICB7Q0xfQ09NUElMRV9QUk9HUkFNX0ZBSUxVUkUsICAgICAgICAgICAgICAgICAgICAgICAgIkNPTVBJTEUgUFJPR1JBTSBGQUlMVVJFIn0sCi0gICAge0NMX0xJTktFUl9OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICJMSU5LRVIgTk9UIEFWQUlMQUJMRSJ9LAotICAgIHtDTF9MSU5LX1BST0dSQU1fRkFJTFVSRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAiTElOSyBQUk9HUkFNIEZBSUxVUkUifSwKLSAgICB7Q0xfREVWSUNFX1BBUlRJVElPTl9GQUlMRUQsICAgICAgICAgICAgICAgICAgICAgICAgIkRFVklDRSBQQVJUSVRJT04gRkFJTEVEIn0sCi0gICAge0NMX0tFUk5FTF9BUkdfSU5GT19OT1RfQVZBSUxBQkxFLCAgICAgICAgICAgICAgICAgICJLRVJORUwgQVJHIElORk8gTk9UIEFWQUlMQUJMRSJ9LAotICAgIHtDTF9JTlZBTElEX1ZBTFVFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBWQUxVRSJ9LAotICAgIHtDTF9JTlZBTElEX0RFVklDRV9UWVBFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBERVZJQ0UgVFlQRSJ9LAotICAgIHtDTF9JTlZBTElEX1BMQVRGT1JNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBQTEFURk9STSJ9LAotICAgIHtDTF9JTlZBTElEX0RFVklDRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBERVZJQ0UifSwKLSAgICB7Q0xfSU5WQUxJRF9DT05URVhULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgQ09OVEVYVCJ9LAotICAgIHtDTF9JTlZBTElEX1FVRVVFX1BST1BFUlRJRVMsICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBRVUVVRSBQUk9QRVJUSUVTIn0sCi0gICAge0NMX0lOVkFMSURfQ09NTUFORF9RVUVVRSwgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIENPTU1BTkQgUVVFVUUifSwKLSAgICB7Q0xfSU5WQUxJRF9IT1NUX1BUUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgSE9TVCBQVFIifSwKLSAgICB7Q0xfSU5WQUxJRF9NRU1fT0JKRUNULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgTUVNIE9CSkVDVCJ9LAotICAgIHtDTF9JTlZBTElEX0lNQUdFX0ZPUk1BVF9ERVNDUklQVE9SLCAgICAgICAgICAgICAgICAiSU5WQUxJRCBJTUFHRSBGT1JNQVQgREVTQ1JJUFRPUiJ9LAotICAgIHtDTF9JTlZBTElEX0lNQUdFX1NJWkUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBJTUFHRSBTSVpFIn0sCi0gICAge0NMX0lOVkFMSURfU0FNUExFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIFNBTVBMRVIifSwKLSAgICB7Q0xfSU5WQUxJRF9CSU5BUlksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgQklOQVJZIn0sCi0gICAge0NMX0lOVkFMSURfQlVJTERfT1BUSU9OUywgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEJVSUxEIE9QVElPTlMifSwKLSAgICB7Q0xfSU5WQUxJRF9QUk9HUkFNLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgUFJPR1JBTSJ9LAotICAgIHtDTF9JTlZBTElEX1BST0dSQU1fRVhFQ1VUQUJMRSwgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBQUk9HUkFNIEVYRUNVVEFCTEUifSwKLSAgICB7Q0xfSU5WQUxJRF9LRVJORUxfTkFNRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgS0VSTkVMIE5BTUUifSwKLSAgICB7Q0xfSU5WQUxJRF9LRVJORUxfREVGSU5JVElPTiwgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgS0VSTkVMIERFRklOSVRJT04ifSwKLSAgICB7Q0xfSU5WQUxJRF9LRVJORUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgS0VSTkVMIn0sCi0gICAge0NMX0lOVkFMSURfQVJHX0lOREVYLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEFSRyBJTkRFWCJ9LAotICAgIHtDTF9JTlZBTElEX0FSR19WQUxVRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBBUkcgVkFMVUUifSwKLSAgICB7Q0xfSU5WQUxJRF9BUkdfU0laRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgQVJHX1NJWkUifSwKLSAgICB7Q0xfSU5WQUxJRF9LRVJORUxfQVJHUywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgS0VSTkVMIEFSR1MifSwKLSAgICB7Q0xfSU5WQUxJRF9XT1JLX0RJTUVOU0lPTiwgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgV09SSyBESU1FTlNJT04ifSwKLSAgICB7Q0xfSU5WQUxJRF9XT1JLX0dST1VQX1NJWkUsICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgV09SSyBHUk9VUCBTSVpFIn0sCi0gICAge0NMX0lOVkFMSURfV09SS19JVEVNX1NJWkUsICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIFdPUksgSVRFTSBTSVpFIn0sCi0gICAge0NMX0lOVkFMSURfR0xPQkFMX09GRlNFVCwgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEdMT0JBTCBPRkZTRVQifSwKLSAgICB7Q0xfSU5WQUxJRF9FVkVOVF9XQUlUX0xJU1QsICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgRVZFTlQgV0FJVCBMSVNUIn0sCi0gICAge0NMX0lOVkFMSURfRVZFTlQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEVWRU5UIn0sCi0gICAge0NMX0lOVkFMSURfT1BFUkFUSU9OLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIE9QRVJBVElPTiJ9LAotICAgIHtDTF9JTlZBTElEX0dMX09CSkVDVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBHTCBPQkpFQ1QifSwKLSAgICB7Q0xfSU5WQUxJRF9CVUZGRVJfU0laRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgQlVGRkVSIFNJWkUifSwKLSAgICB7Q0xfSU5WQUxJRF9NSVBfTEVWRUwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgTUlQIExFVkVMIn0sCi0gICAge0NMX0lOVkFMSURfR0xPQkFMX1dPUktfU0laRSwgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIEdMT0JBTCBXT1JLIFNJWkUifSwKLSAgICB7Q0xfSU5WQUxJRF9QUk9QRVJUWSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgUFJPUEVSVFkifSwKLSAgICB7Q0xfSU5WQUxJRF9JTUFHRV9ERVNDUklQVE9SLCAgICAgICAgICAgICAgICAgICAgICAgIklOVkFMSUQgSU1BR0UgREVTQ1JJUFRPUiJ9LAotICAgIHtDTF9JTlZBTElEX0NPTVBJTEVSX09QVElPTlMsICAgICAgICAgICAgICAgICAgICAgICAiSU5WQUxJRCBDT01QSUxFUiBPUFRJT05TIn0sCi0gICAge0NMX0lOVkFMSURfTElOS0VSX09QVElPTlMsICAgICAgICAgICAgICAgICAgICAgICAgICJJTlZBTElEIExJTktFUiBPUFRJT05TIn0sCi0gICAge0NMX0lOVkFMSURfREVWSUNFX1BBUlRJVElPTl9DT1VOVCwgICAgICAgICAgICAgICAgICJJTlZBTElEIERFVklDRSBQQVJUSVRJT04gQ09VTlQifSwKLX07Ci0KLWNvbnN0IGNoYXIgKmF2X29wZW5jbF9lcnJzdHIoY2xfaW50IHN0YXR1cykKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMob3BlbmNsX2Vycl9tc2cpOyBpKyspIHsKLSAgICAgICAgaWYgKG9wZW5jbF9lcnJfbXNnW2ldLmVycl9jb2RlID09IHN0YXR1cykKLSAgICAgICAgICAgIHJldHVybiBvcGVuY2xfZXJyX21zZ1tpXS5lcnJfc3RyOwotICAgIH0KLSAgICByZXR1cm4gInVua25vd24gZXJyb3IiOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2RldmljZV9saXN0KEFWT3BlbkNMRGV2aWNlTGlzdCAqZGV2aWNlX2xpc3QpCi17Ci0gICAgaW50IGksIGo7Ci0gICAgaWYgKCFkZXZpY2VfbGlzdCkKLSAgICAgICAgcmV0dXJuOwotICAgIGZvciAoaSA9IDA7IGkgPCBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbnVtOyBpKyspIHsKLSAgICAgICAgaWYgKCFkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9udW07IGorKykgewotICAgICAgICAgICAgYXZfZnJlZXAoJihkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+ZGV2aWNlX25vZGVbal0tPmRldmljZV9uYW1lKSk7Ci0gICAgICAgICAgICBhdl9mcmVlcCgmKGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2Vfbm9kZVtqXSkpOwotICAgICAgICB9Ci0gICAgICAgIGF2X2ZyZWVwKCZkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+ZGV2aWNlX25vZGUpOwotICAgICAgICBhdl9mcmVlcCgmKGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5wbGF0Zm9ybV9uYW1lKSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXSk7Ci0gICAgfQotICAgIGF2X2ZyZWVwKCZkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZSk7Ci0gICAgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX251bSA9IDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2RldmljZV9saXN0KEFWT3BlbkNMRGV2aWNlTGlzdCAqZGV2aWNlX2xpc3QpCi17Ci0gICAgY2xfaW50IHN0YXR1czsKLSAgICBpbnQgaSwgaiwgaywgZGV2aWNlX251bSwgdG90YWxfZGV2aWNlc19udW0sIHJldCA9IDA7Ci0gICAgaW50ICpkZXZpY2VzX251bTsKLSAgICBjbF9wbGF0Zm9ybV9pZCAqcGxhdGZvcm1faWRzID0gTlVMTDsKLSAgICBjbF9kZXZpY2VfaWQgKmRldmljZV9pZHMgPSBOVUxMOwotICAgIEFWT3BlbkNMRGV2aWNlTm9kZSAqZGV2aWNlX25vZGUgPSBOVUxMOwotICAgIHNpemVfdCBwbGF0Zm9ybV9uYW1lX3NpemUgPSAwOwotICAgIHNpemVfdCBkZXZpY2VfbmFtZV9zaXplID0gMDsKLSAgICBzdGF0dXMgPSBjbEdldFBsYXRmb3JtSURzKDAsIE5VTEwsICZkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbnVtKTsKLSAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBPcGVuQ0wgcGxhdGZvcm0gaWRzOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Ci0gICAgfQotICAgIHBsYXRmb3JtX2lkcyA9IGF2X21hbGxvY3pfYXJyYXkoZGV2aWNlX2xpc3QtPnBsYXRmb3JtX251bSwgc2l6ZW9mKGNsX3BsYXRmb3JtX2lkKSk7Ci0gICAgaWYgKCFwbGF0Zm9ybV9pZHMpCi0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgc3RhdHVzID0gY2xHZXRQbGF0Zm9ybUlEcyhkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbnVtLCBwbGF0Zm9ybV9pZHMsIE5VTEwpOwotICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBPcGVuQ0wgcGxhdGZvcm0gaWRzOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlID0gYXZfbWFsbG9jel9hcnJheShkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbnVtLCBzaXplb2YoQVZPcGVuQ0xQbGF0Zm9ybU5vZGUgKikpOwotICAgIGlmICghZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGUpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBnb3RvIGVuZDsKLSAgICB9Ci0gICAgZGV2aWNlc19udW0gPSBhdl9tYWxsb2N6KHNpemVvZihpbnQpICogRkZfQVJSQVlfRUxFTVMoZGV2aWNlX3R5cGUpKTsKLSAgICBpZiAoIWRldmljZXNfbnVtKSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbnVtOyBpKyspIHsKLSAgICAgICAgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0gPSBhdl9tYWxsb2N6KHNpemVvZihBVk9wZW5DTFBsYXRmb3JtTm9kZSkpOwotICAgICAgICBpZiAoIWRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldKSB7Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgICAgICBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+cGxhdGZvcm1faWQgPSBwbGF0Zm9ybV9pZHNbaV07Ci0gICAgICAgIHN0YXR1cyA9IGNsR2V0UGxhdGZvcm1JbmZvKHBsYXRmb3JtX2lkc1tpXSwgQ0xfUExBVEZPUk1fVkVORE9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAmcGxhdGZvcm1fbmFtZV9zaXplKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBzaXplIG9mIHBsYXRmb3JtIG5hbWU6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPnBsYXRmb3JtX25hbWUgPSBhdl9tYWxsb2MocGxhdGZvcm1fbmFtZV9zaXplICogc2l6ZW9mKGNoYXIpKTsKLSAgICAgICAgICAgIGlmICghZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPnBsYXRmb3JtX25hbWUpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZSBuYW1lOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gY2xHZXRQbGF0Zm9ybUluZm8ocGxhdGZvcm1faWRzW2ldLCBDTF9QTEFURk9STV9WRU5ET1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm1fbmFtZV9zaXplICogc2l6ZW9mKGNoYXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5wbGF0Zm9ybV9uYW1lLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBwbGF0Zm9ybSBuYW1lOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdG90YWxfZGV2aWNlc19udW0gPSAwOwotICAgICAgICBmb3IgKGogPSAwOyBqIDwgRkZfQVJSQVlfRUxFTVMoZGV2aWNlX3R5cGUpOyBqKyspIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGNsR2V0RGV2aWNlSURzKGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5wbGF0Zm9ybV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlW2pdLCAwLCBOVUxMLCAmZGV2aWNlc19udW1bal0pOwotICAgICAgICAgICAgdG90YWxfZGV2aWNlc19udW0gKz0gZGV2aWNlc19udW1bal07Ci0gICAgICAgIH0KLSAgICAgICAgZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9ub2RlID0gYXZfbWFsbG9jel9hcnJheSh0b3RhbF9kZXZpY2VzX251bSwgc2l6ZW9mKEFWT3BlbkNMRGV2aWNlTm9kZSAqKSk7Ci0gICAgICAgIGlmICghZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9ub2RlKSB7Ci0gICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgRkZfQVJSQVlfRUxFTVMoZGV2aWNlX3R5cGUpOyBqKyspIHsKLSAgICAgICAgICAgIGlmIChkZXZpY2VzX251bVtqXSkgewotICAgICAgICAgICAgICAgIGRldmljZV9pZHMgPSBhdl9tYWxsb2N6X2FycmF5KGRldmljZXNfbnVtW2pdLCBzaXplb2YoY2xfZGV2aWNlX2lkKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfaWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKLSAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNsR2V0RGV2aWNlSURzKGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5wbGF0Zm9ybV9pZCwgZGV2aWNlX3R5cGVbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlc19udW1bal0sIGRldmljZV9pZHMsIE5VTEwpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IGRldmljZSBJRDogJXM6XG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICAgICAgICAgICAgICBhdl9mcmVlcCgmZGV2aWNlX2lkcyk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZGV2aWNlc19udW1bal07IGsrKykgewotICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbnVtID0gZGV2aWNlX2xpc3QtPnBsYXRmb3JtX25vZGVbaV0tPmRldmljZV9udW07Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2Vfbm9kZVtkZXZpY2VfbnVtXSA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWT3BlbkNMRGV2aWNlTm9kZSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2Vfbm9kZVtkZXZpY2VfbnVtXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25vZGUgPSBkZXZpY2VfbGlzdC0+cGxhdGZvcm1fbm9kZVtpXS0+ZGV2aWNlX25vZGVbZGV2aWNlX251bV07Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZV9ub2RlLT5kZXZpY2VfaWQgPSBkZXZpY2VfaWRzW2tdOwotICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfbm9kZS0+ZGV2aWNlX3R5cGUgPSBkZXZpY2VfdHlwZVtqXTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gY2xHZXREZXZpY2VJbmZvKGRldmljZV9ub2RlLT5kZXZpY2VfaWQsIENMX0RFVklDRV9OQU1FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgJmRldmljZV9uYW1lX3NpemUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IHNpemUgb2YgZGV2aWNlIG5hbWU6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25vZGUtPmRldmljZV9uYW1lID0gYXZfbWFsbG9jKGRldmljZV9uYW1lX3NpemUgKiBzaXplb2YoY2hhcikpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9ub2RlLT5kZXZpY2VfbmFtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZSBuYW1lOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGNsR2V0RGV2aWNlSW5mbyhkZXZpY2Vfbm9kZS0+ZGV2aWNlX2lkLCBDTF9ERVZJQ0VfTkFNRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lX3NpemUgKiBzaXplb2YoY2hhciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Vfbm9kZS0+ZGV2aWNlX25hbWUsIE5VTEwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0IGRldmljZSBuYW1lOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZV9saXN0LT5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2VfbnVtKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGF2X2ZyZWVwKCZkZXZpY2VfaWRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLWVuZDoKLSAgICBhdl9mcmVlcCgmcGxhdGZvcm1faWRzKTsKLSAgICBhdl9mcmVlcCgmZGV2aWNlc19udW0pOwotICAgIGF2X2ZyZWVwKCZkZXZpY2VfaWRzKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZnJlZV9kZXZpY2VfbGlzdChkZXZpY2VfbGlzdCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IGF2X29wZW5jbF9nZXRfZGV2aWNlX2xpc3QoQVZPcGVuQ0xEZXZpY2VMaXN0ICoqZGV2aWNlX2xpc3QpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgKmRldmljZV9saXN0ID0gYXZfbWFsbG9jeihzaXplb2YoQVZPcGVuQ0xEZXZpY2VMaXN0KSk7Ci0gICAgaWYgKCEoKmRldmljZV9saXN0KSkgewotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBhbGxvY2F0ZSBvcGVuY2wgZGV2aWNlIGxpc3RcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIH0KLSAgICByZXQgPSBnZXRfZGV2aWNlX2xpc3QoKmRldmljZV9saXN0KTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBnZXQgZGV2aWNlIGxpc3QgZnJvbSBlbnZpcm9ubWVudFxuIik7Ci0gICAgICAgIGZyZWVfZGV2aWNlX2xpc3QoKmRldmljZV9saXN0KTsKLSAgICAgICAgYXZfZnJlZXAoZGV2aWNlX2xpc3QpOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi12b2lkIGF2X29wZW5jbF9mcmVlX2RldmljZV9saXN0KEFWT3BlbkNMRGV2aWNlTGlzdCAqKmRldmljZV9saXN0KQotewotICAgIGZyZWVfZGV2aWNlX2xpc3QoKmRldmljZV9saXN0KTsKLSAgICBhdl9mcmVlcChkZXZpY2VfbGlzdCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGluaXRfb3BlbmNsX210eCh2b2lkKQotewotI2lmIEhBVkVfVEhSRUFEUwotICAgIGlmICghYXRvbWljX29wZW5jbF9sb2NrKSB7Ci0gICAgICAgIGludCBlcnI7Ci0gICAgICAgIHB0aHJlYWRfbXV0ZXhfdCAqdG1wID0gYXZfbWFsbG9jKHNpemVvZihwdGhyZWFkX211dGV4X3QpKTsKLSAgICAgICAgaWYgKCF0bXApCi0gICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgICAgICBpZiAoKGVyciA9IHB0aHJlYWRfbXV0ZXhfaW5pdCh0bXAsIE5VTEwpKSkgewotICAgICAgICAgICAgYXZfZnJlZSh0bXApOwotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoZXJyKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYXZwcml2X2F0b21pY19wdHJfY2FzKCh2b2lkICogdm9sYXRpbGUgKikmYXRvbWljX29wZW5jbF9sb2NrLCBOVUxMLCB0bXApKSB7Ci0gICAgICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3kodG1wKTsKLSAgICAgICAgICAgIGF2X2ZyZWUodG1wKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgotICAgIHJldHVybiAwOwotfQotCi1pbnQgYXZfb3BlbmNsX3NldF9vcHRpb24oY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpCi17Ci0gICAgaW50IHJldCA9IGluaXRfb3BlbmNsX210eCggKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICBMT0NLX09QRU5DTDsKLSAgICBpZiAoIW9wZW5jbF9jdHgub3B0X2luaXRfZmxhZykgewotICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKCZvcGVuY2xfY3R4KTsKLSAgICAgICAgb3BlbmNsX2N0eC5vcHRfaW5pdF9mbGFnID0gMTsKLSAgICB9Ci0gICAgcmV0ID0gYXZfb3B0X3NldCgmb3BlbmNsX2N0eCwga2V5LCB2YWwsIDApOwotICAgIFVOTE9DS19PUEVOQ0w7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IGF2X29wZW5jbF9nZXRfb3B0aW9uKGNvbnN0IGNoYXIgKmtleSwgdWludDhfdCAqKm91dF92YWwpCi17Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgTE9DS19PUEVOQ0w7Ci0gICAgcmV0ID0gYXZfb3B0X2dldCgmb3BlbmNsX2N0eCwga2V5LCAwLCBvdXRfdmFsKTsKLSAgICBVTkxPQ0tfT1BFTkNMOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgYXZfb3BlbmNsX2ZyZWVfb3B0aW9uKHZvaWQpCi17Ci0gICAgLypGSVhNRTogZnJlZSBvcGVuY2x1dGlscyBjb250ZXh0Ki8KLSAgICBMT0NLX09QRU5DTDsKLSAgICBhdl9vcHRfZnJlZSgmb3BlbmNsX2N0eCk7Ci0gICAgVU5MT0NLX09QRU5DTDsKLX0KLQotQVZPcGVuQ0xFeHRlcm5hbEVudiAqYXZfb3BlbmNsX2FsbG9jX2V4dGVybmFsX2Vudih2b2lkKQotewotICAgIEFWT3BlbkNMRXh0ZXJuYWxFbnYgKmV4dCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWT3BlbkNMRXh0ZXJuYWxFbnYpKTsKLSAgICBpZiAoIWV4dCkgewotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJDb3VsZCBub3QgbWFsbG9jIGV4dGVybmFsIG9wZW5jbCBlbnZpcm9ubWVudCBkYXRhIHNwYWNlXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dDsKLX0KLQotdm9pZCBhdl9vcGVuY2xfZnJlZV9leHRlcm5hbF9lbnYoQVZPcGVuQ0xFeHRlcm5hbEVudiAqKmV4dF9vcGVuY2xfZW52KQotewotICAgIGF2X2ZyZWVwKGV4dF9vcGVuY2xfZW52KTsKLX0KLQotaW50IGF2X29wZW5jbF9yZWdpc3Rlcl9rZXJuZWxfY29kZShjb25zdCBjaGFyICprZXJuZWxfY29kZSkKLXsKLSAgICBpbnQgaSwgcmV0ID0gaW5pdF9vcGVuY2xfbXR4KCApOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICByZXR1cm4gcmV0OwotICAgIExPQ0tfT1BFTkNMOwotICAgIGlmIChvcGVuY2xfY3R4Lmtlcm5lbF9jb2RlX2NvdW50ID49IE1BWF9LRVJORUxfQ09ERV9OVU0pIHsKLSAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiQ291bGQgbm90IHJlZ2lzdGVyIGtlcm5lbCBjb2RlLCBtYXhpbXVtIG51bWJlciBvZiByZWdpc3RlcmVkIGtlcm5lbCBjb2RlICVkIGFscmVhZHkgcmVhY2hlZFxuIiwKLSAgICAgICAgICAgICAgIE1BWF9LRVJORUxfQ09ERV9OVU0pOwotICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgb3BlbmNsX2N0eC5rZXJuZWxfY29kZV9jb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChvcGVuY2xfY3R4Lmtlcm5lbF9jb2RlW2ldLmtlcm5lbF9zdHJpbmcgPT0ga2VybmVsX2NvZGUpIHsKLSAgICAgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX1dBUk5JTkcsICJTYW1lIGtlcm5lbCBjb2RlIGhhcyBiZWVuIHJlZ2lzdGVyZWRcbiIpOwotICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgb3BlbmNsX2N0eC5rZXJuZWxfY29kZVtvcGVuY2xfY3R4Lmtlcm5lbF9jb2RlX2NvdW50XS5rZXJuZWxfc3RyaW5nID0ga2VybmVsX2NvZGU7Ci0gICAgb3BlbmNsX2N0eC5rZXJuZWxfY29kZVtvcGVuY2xfY3R4Lmtlcm5lbF9jb2RlX2NvdW50XS5pc19jb21waWxlZCA9IDA7Ci0gICAgb3BlbmNsX2N0eC5rZXJuZWxfY29kZV9jb3VudCsrOwotZW5kOgotICAgIFVOTE9DS19PUEVOQ0w7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotY2xfcHJvZ3JhbSBhdl9vcGVuY2xfY29tcGlsZShjb25zdCBjaGFyICpwcm9ncmFtX25hbWUsIGNvbnN0IGNoYXIgKmJ1aWxkX29wdHMpCi17Ci0gICAgaW50IGk7Ci0gICAgY2xfaW50IHN0YXR1cywgYnVpbGRfc3RhdHVzOwotICAgIGludCBrZXJuZWxfY29kZV9pZHggPSAwOwotICAgIGNvbnN0IGNoYXIgKmtlcm5lbF9zb3VyY2U7Ci0gICAgc2l6ZV90IGtlcm5lbF9jb2RlX2xlbjsKLSAgICBjaGFyKiBwdHIgPSBOVUxMOwotICAgIGNsX3Byb2dyYW0gcHJvZ3JhbSA9IE5VTEw7Ci0gICAgc2l6ZV90IGxvZ19zaXplOwotICAgIGNoYXIgKmxvZyA9IE5VTEw7Ci0KLSAgICBMT0NLX09QRU5DTDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgb3BlbmNsX2N0eC5rZXJuZWxfY29kZV9jb3VudDsgaSsrKSB7Ci0gICAgICAgIC8vIGlkZW50aWZ5IGEgcHJvZ3JhbSB1c2luZyBhIHVuaXF1ZSBuYW1lIHdpdGhpbiB0aGUga2VybmVsIHNvdXJjZQotICAgICAgICBwdHIgPSBhdl9zdHJpc3RyKG9wZW5jbF9jdHgua2VybmVsX2NvZGVbaV0ua2VybmVsX3N0cmluZywgcHJvZ3JhbV9uYW1lKTsKLSAgICAgICAgaWYgKHB0ciAmJiAhb3BlbmNsX2N0eC5rZXJuZWxfY29kZVtpXS5pc19jb21waWxlZCkgewotICAgICAgICAgICAga2VybmVsX3NvdXJjZSA9IG9wZW5jbF9jdHgua2VybmVsX2NvZGVbaV0ua2VybmVsX3N0cmluZzsKLSAgICAgICAgICAgIGtlcm5lbF9jb2RlX2xlbiA9IHN0cmxlbihvcGVuY2xfY3R4Lmtlcm5lbF9jb2RlW2ldLmtlcm5lbF9zdHJpbmcpOwotICAgICAgICAgICAga2VybmVsX2NvZGVfaWR4ID0gaTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICgha2VybmVsX3NvdXJjZSkgewotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJVbmFibGUgdG8gZmluZCBPcGVuQ0wga2VybmVsIHNvdXJjZSAnJXMnXG4iLCBwcm9ncmFtX25hbWUpOwotICAgICAgICBnb3RvIGVuZDsKLSAgICB9Ci0KLSAgICAvKiBjcmVhdGUgYSBDTCBwcm9ncmFtIGZyb20ga2VybmVsIHNvdXJjZSAqLwotICAgIHByb2dyYW0gPSBjbENyZWF0ZVByb2dyYW1XaXRoU291cmNlKG9wZW5jbF9jdHguY29udGV4dCwgMSwgJmtlcm5lbF9zb3VyY2UsICZrZXJuZWxfY29kZV9sZW4sICZzdGF0dXMpOwotICAgIGlmKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIlVuYWJsZSB0byBjcmVhdGUgT3BlbkNMIHByb2dyYW0gJyVzJzogJXNcbiIsIHByb2dyYW1fbmFtZSwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgcHJvZ3JhbSA9IE5VTEw7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLQotICAgIGJ1aWxkX3N0YXR1cyA9IGNsQnVpbGRQcm9ncmFtKHByb2dyYW0sIDEsICYob3BlbmNsX2N0eC5kZXZpY2VfaWQpLCBidWlsZF9vcHRzLCBOVUxMLCBOVUxMKTsKLSAgICBzdGF0dXMgPSBjbEdldFByb2dyYW1CdWlsZEluZm8ocHJvZ3JhbSwgb3BlbmNsX2N0eC5kZXZpY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX1BST0dSQU1fQlVJTERfTE9HLCAwLCBOVUxMLCAmbG9nX3NpemUpOwotICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19XQVJOSU5HLAotICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgY29tcGlsYXRpb24gbG9nOiAlc1xuIiwKLSAgICAgICAgICAgICAgIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbG9nID0gYXZfbWFsbG9jKGxvZ19zaXplKTsKLSAgICAgICAgaWYgKGxvZykgewotICAgICAgICAgICAgc3RhdHVzID0gY2xHZXRQcm9ncmFtQnVpbGRJbmZvKHByb2dyYW0sIG9wZW5jbF9jdHguZGV2aWNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX1BST0dSQU1fQlVJTERfTE9HLCBsb2dfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2csIE5VTEwpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBnZXQgY29tcGlsYXRpb24gbG9nOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGxldmVsID0gYnVpbGRfc3RhdHVzID09IENMX1NVQ0NFU1MgPyBBVl9MT0dfREVCVUcgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZfTE9HX0VSUk9SOwotICAgICAgICAgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgbGV2ZWwsICJDb21waWxhdGlvbiBsb2c6XG4lc1xuIiwgbG9nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhdl9mcmVlcCgmbG9nKTsKLSAgICB9Ci0gICAgaWYgKGJ1aWxkX3N0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNvbXBpbGF0aW9uIGZhaWxlZCB3aXRoIE9wZW5DTCBwcm9ncmFtICclcyc6ICVzXG4iLAotICAgICAgICAgICAgICAgcHJvZ3JhbV9uYW1lLCBhdl9vcGVuY2xfZXJyc3RyKGJ1aWxkX3N0YXR1cykpOwotICAgICAgICBwcm9ncmFtID0gTlVMTDsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotCi0gICAgb3BlbmNsX2N0eC5rZXJuZWxfY29kZVtrZXJuZWxfY29kZV9pZHhdLmlzX2NvbXBpbGVkID0gMTsKLWVuZDoKLSAgICBVTkxPQ0tfT1BFTkNMOwotICAgIHJldHVybiBwcm9ncmFtOwotfQotCi1jbF9jb21tYW5kX3F1ZXVlIGF2X29wZW5jbF9nZXRfY29tbWFuZF9xdWV1ZSh2b2lkKQotewotICAgIHJldHVybiBvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWU7Ci19Ci0KLXN0YXRpYyBpbnQgaW5pdF9vcGVuY2xfZW52KE9wZW5jbENvbnRleHQgKm9wZW5jbF9jdHgsIEFWT3BlbkNMRXh0ZXJuYWxFbnYgKmV4dF9vcGVuY2xfZW52KQotewotICAgIGNsX2ludCBzdGF0dXM7Ci0gICAgY2xfY29udGV4dF9wcm9wZXJ0aWVzIGNwc1szXTsKLSAgICBpbnQgaSwgcmV0ID0gMDsKLSAgICBBVk9wZW5DTERldmljZU5vZGUgKmRldmljZV9ub2RlID0gTlVMTDsKLQotICAgIGlmIChleHRfb3BlbmNsX2VudikgewotICAgICAgICBpZiAob3BlbmNsX2N0eC0+aXNfdXNlcl9jcmVhdGVkKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIG9wZW5jbF9jdHgtPnBsYXRmb3JtX2lkICAgICA9IGV4dF9vcGVuY2xfZW52LT5wbGF0Zm9ybV9pZDsKLSAgICAgICAgb3BlbmNsX2N0eC0+aXNfdXNlcl9jcmVhdGVkID0gMTsKLSAgICAgICAgb3BlbmNsX2N0eC0+Y29tbWFuZF9xdWV1ZSAgID0gZXh0X29wZW5jbF9lbnYtPmNvbW1hbmRfcXVldWU7Ci0gICAgICAgIG9wZW5jbF9jdHgtPmNvbnRleHQgICAgICAgICA9IGV4dF9vcGVuY2xfZW52LT5jb250ZXh0OwotICAgICAgICBvcGVuY2xfY3R4LT5kZXZpY2VfaWQgICAgICAgPSBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX2lkOwotICAgICAgICBvcGVuY2xfY3R4LT5kZXZpY2VfdHlwZSAgICAgPSBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX3R5cGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFvcGVuY2xfY3R4LT5pc191c2VyX2NyZWF0ZWQpIHsKLSAgICAgICAgICAgIGlmICghb3BlbmNsX2N0eC0+ZGV2aWNlX2xpc3QucGxhdGZvcm1fbnVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gZ2V0X2RldmljZV9saXN0KCZvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAob3BlbmNsX2N0eC0+ZGV2aWNlX2xpc3QucGxhdGZvcm1fbnVtIDwgb3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4ICsgMSkgewotICAgICAgICAgICAgICAgICAgICBhdl9sb2cob3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLCAiVXNlciBzZXQgcGxhdGZvcm0gaW5kZXggbm90IGV4aXN0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW29wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeF0tPmRldmljZV9udW0pIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKG9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwgIk5vIGRldmljZXMgaW4gdXNlciBzcGVjaWZpYyBwbGF0Zm9ybSB3aXRoIGluZGV4ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4KTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BlbmNsX2N0eC0+cGxhdGZvcm1faWQgPSBvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW29wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeF0tPnBsYXRmb3JtX2lkOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBnZXQgYSB1c2FibGUgcGxhdGZvcm0gYnkgZGVmYXVsdCovCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG9wZW5jbF9jdHgtPmRldmljZV9saXN0LnBsYXRmb3JtX251bTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW2ldLT5kZXZpY2VfbnVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGVuY2xfY3R4LT5wbGF0Zm9ybV9pZCA9IG9wZW5jbF9jdHgtPmRldmljZV9saXN0LnBsYXRmb3JtX25vZGVbaV0tPnBsYXRmb3JtX2lkOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4ID0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFvcGVuY2xfY3R4LT5wbGF0Zm9ybV9pZCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgZ2V0IE9wZW5DTCBwbGF0Zm9ybXNcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogZ2V0IGEgdXNhYmxlIGRldmljZSovCi0gICAgICAgICAgICBpZiAob3BlbmNsX2N0eC0+ZGV2aWNlX2lkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG9wZW5jbF9jdHgtPmRldmljZV9saXN0LnBsYXRmb3JtX25vZGVbb3BlbmNsX2N0eC0+cGxhdGZvcm1faWR4XS0+ZGV2aWNlX251bSA8IG9wZW5jbF9jdHgtPmRldmljZV9pZHggKyAxKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF2X2xvZyhvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBPcGVuQ0wgZGV2aWNlIGlkeCAlZCBpbiB0aGUgdXNlciBzZXQgcGxhdGZvcm1cbiIsIG9wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcGVuY2xfY3R4LT5kZXZpY2VfaWR4ID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGV2aWNlX25vZGUgPSBvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW29wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeF0tPmRldmljZV9ub2RlW29wZW5jbF9jdHgtPmRldmljZV9pZHhdOwotICAgICAgICAgICAgb3BlbmNsX2N0eC0+ZGV2aWNlX2lkID0gZGV2aWNlX25vZGUtPmRldmljZV9pZDsKLSAgICAgICAgICAgIG9wZW5jbF9jdHgtPmRldmljZV90eXBlID0gZGV2aWNlX25vZGUtPmRldmljZV90eXBlOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVXNlIGF2YWlsYWJsZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgYXZfbG9nKG9wZW5jbF9jdHgsIEFWX0xPR19WRVJCT1NFLCAiUGxhdGZvcm0gTmFtZTogJXMsIERldmljZSBOYW1lOiAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICBvcGVuY2xfY3R4LT5kZXZpY2VfbGlzdC5wbGF0Zm9ybV9ub2RlW29wZW5jbF9jdHgtPnBsYXRmb3JtX2lkeF0tPnBsYXRmb3JtX25hbWUsCi0gICAgICAgICAgICAgICAgICAgZGV2aWNlX25vZGUtPmRldmljZV9uYW1lKTsKLSAgICAgICAgICAgIGNwc1swXSA9IENMX0NPTlRFWFRfUExBVEZPUk07Ci0gICAgICAgICAgICBjcHNbMV0gPSAoY2xfY29udGV4dF9wcm9wZXJ0aWVzKW9wZW5jbF9jdHgtPnBsYXRmb3JtX2lkOwotICAgICAgICAgICAgY3BzWzJdID0gMDsKLQotICAgICAgICAgICAgb3BlbmNsX2N0eC0+Y29udGV4dCA9IGNsQ3JlYXRlQ29udGV4dEZyb21UeXBlKGNwcywgb3BlbmNsX2N0eC0+ZGV2aWNlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgJnN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cob3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGdldCBPcGVuQ0wgY29udGV4dCBmcm9tIGRldmljZSB0eXBlOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wZW5jbF9jdHgtPmNvbW1hbmRfcXVldWUgPSBjbENyZWF0ZUNvbW1hbmRRdWV1ZShvcGVuY2xfY3R4LT5jb250ZXh0LCBvcGVuY2xfY3R4LT5kZXZpY2VfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJnN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgICAgICBhdl9sb2cob3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBPcGVuQ0wgY29tbWFuZCBxdWV1ZTogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotaW50IGF2X29wZW5jbF9pbml0KEFWT3BlbkNMRXh0ZXJuYWxFbnYgKmV4dF9vcGVuY2xfZW52KQotewotICAgIGludCByZXQgPSBpbml0X29wZW5jbF9tdHgoICk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgTE9DS19PUEVOQ0w7Ci0gICAgaWYgKCFvcGVuY2xfY3R4LmluaXRfY291bnQpIHsKLSAgICAgICAgaWYgKCFvcGVuY2xfY3R4Lm9wdF9pbml0X2ZsYWcpIHsKLSAgICAgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMoJm9wZW5jbF9jdHgpOwotICAgICAgICAgICAgb3BlbmNsX2N0eC5vcHRfaW5pdF9mbGFnID0gMTsKLSAgICAgICAgfQotICAgICAgICByZXQgPSBpbml0X29wZW5jbF9lbnYoJm9wZW5jbF9jdHgsIGV4dF9vcGVuY2xfZW52KTsKLSAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgaWYgKG9wZW5jbF9jdHgua2VybmVsX2NvZGVfY291bnQgPD0gMCkgewotICAgICAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIk5vIGtlcm5lbCBjb2RlIGlzIHJlZ2lzdGVyZWQsIGNvbXBpbGUga2VybmVsIGZpbGUgZmFpbGVkXG4iKTsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgfQotICAgIG9wZW5jbF9jdHguaW5pdF9jb3VudCsrOwotZW5kOgotICAgIFVOTE9DS19PUEVOQ0w7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBhdl9vcGVuY2xfdW5pbml0KHZvaWQpCi17Ci0gICAgaW50IGk7Ci0gICAgY2xfaW50IHN0YXR1czsKLSAgICBMT0NLX09QRU5DTDsKLSAgICBvcGVuY2xfY3R4LmluaXRfY291bnQtLTsKLSAgICBpZiAob3BlbmNsX2N0eC5pc191c2VyX2NyZWF0ZWQpCi0gICAgICAgIGdvdG8gZW5kOwotICAgIGlmIChvcGVuY2xfY3R4LmluaXRfY291bnQgPiAwKQotICAgICAgICBnb3RvIGVuZDsKLSAgICBpZiAob3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlKSB7Ci0gICAgICAgIHN0YXR1cyA9IGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVsZWFzZSBPcGVuQ0wgY29tbWFuZCBxdWV1ZTogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlID0gTlVMTDsKLSAgICB9Ci0gICAgaWYgKG9wZW5jbF9jdHguY29udGV4dCkgewotICAgICAgICBzdGF0dXMgPSBjbFJlbGVhc2VDb250ZXh0KG9wZW5jbF9jdHguY29udGV4dCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCByZWxlYXNlIE9wZW5DTCBjb250ZXh0OiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgfQotICAgICAgICBvcGVuY2xfY3R4LmNvbnRleHQgPSBOVUxMOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgb3BlbmNsX2N0eC5rZXJuZWxfY29kZV9jb3VudDsgaSsrKSB7Ci0gICAgICAgIG9wZW5jbF9jdHgua2VybmVsX2NvZGVbaV0uaXNfY29tcGlsZWQgPSAwOwotICAgIH0KLSAgICBmcmVlX2RldmljZV9saXN0KCZvcGVuY2xfY3R4LmRldmljZV9saXN0KTsKLWVuZDoKLSAgICBpZiAob3BlbmNsX2N0eC5pbml0X2NvdW50IDw9IDApCi0gICAgICAgIGF2X29wdF9mcmVlKCZvcGVuY2xfY3R4KTsgLy9GSVhNRTogZnJlZSBvcGVuY2x1dGlscyBjb250ZXh0Ci0gICAgVU5MT0NLX09QRU5DTDsKLX0KLQotaW50IGF2X29wZW5jbF9idWZmZXJfY3JlYXRlKGNsX21lbSAqY2xfYnVmLCBzaXplX3QgY2xfYnVmX3NpemUsIGludCBmbGFncywgdm9pZCAqaG9zdF9wdHIpCi17Ci0gICAgY2xfaW50IHN0YXR1czsKLSAgICAqY2xfYnVmID0gY2xDcmVhdGVCdWZmZXIob3BlbmNsX2N0eC5jb250ZXh0LCBmbGFncywgY2xfYnVmX3NpemUsIGhvc3RfcHRyLCAmc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsICJDb3VsZCBub3QgY3JlYXRlIE9wZW5DTCBidWZmZXI6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgYXZfb3BlbmNsX2J1ZmZlcl9yZWxlYXNlKGNsX21lbSAqY2xfYnVmKQotewotICAgIGNsX2ludCBzdGF0dXMgPSAwOwotICAgIGlmICghY2xfYnVmKQotICAgICAgICByZXR1cm47Ci0gICAgc3RhdHVzID0gY2xSZWxlYXNlTWVtT2JqZWN0KCpjbF9idWYpOwotICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJDb3VsZCBub3QgcmVsZWFzZSBPcGVuQ0wgYnVmZmVyOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICB9Ci0gICAgbWVtc2V0KGNsX2J1ZiwgMCwgc2l6ZW9mKCpjbF9idWYpKTsKLX0KLQotaW50IGF2X29wZW5jbF9idWZmZXJfd3JpdGUoY2xfbWVtIGRzdF9jbF9idWYsIHVpbnQ4X3QgKnNyY19idWYsIHNpemVfdCBidWZfc2l6ZSkKLXsKLSAgICBjbF9pbnQgc3RhdHVzOwotICAgIHZvaWQgKm1hcHBlZCA9IGNsRW5xdWV1ZU1hcEJ1ZmZlcihvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsIGRzdF9jbF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMX1RSVUUsIENMX01BUF9XUklURSwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsICZzdGF0dXMpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBtYXAgT3BlbkNMIGJ1ZmZlcjogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwotICAgIH0KLSAgICBtZW1jcHkobWFwcGVkLCBzcmNfYnVmLCBidWZfc2l6ZSk7Ci0KLSAgICBzdGF0dXMgPSBjbEVucXVldWVVbm1hcE1lbU9iamVjdChvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsIGRzdF9jbF9idWYsIG1hcHBlZCwgMCwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB1bm1hcCBPcGVuQ0wgYnVmZmVyOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgYXZfb3BlbmNsX2J1ZmZlcl9yZWFkKHVpbnQ4X3QgKmRzdF9idWYsIGNsX21lbSBzcmNfY2xfYnVmLCBzaXplX3QgYnVmX3NpemUpCi17Ci0gICAgY2xfaW50IHN0YXR1czsKLSAgICB2b2lkICptYXBwZWQgPSBjbEVucXVldWVNYXBCdWZmZXIob3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlLCBzcmNfY2xfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9UUlVFLCBDTF9NQVBfUkVBRCwgMCwgYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsIE5VTEwsICZzdGF0dXMpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBtYXAgT3BlbkNMIGJ1ZmZlcjogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwotICAgIH0KLSAgICBtZW1jcHkoZHN0X2J1ZiwgbWFwcGVkLCBidWZfc2l6ZSk7Ci0KLSAgICBzdGF0dXMgPSBjbEVucXVldWVVbm1hcE1lbU9iamVjdChvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsIHNyY19jbF9idWYsIG1hcHBlZCwgMCwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB1bm1hcCBPcGVuQ0wgYnVmZmVyOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgYXZfb3BlbmNsX2J1ZmZlcl93cml0ZV9pbWFnZShjbF9tZW0gZHN0X2NsX2J1Ziwgc2l6ZV90IGNsX2J1ZmZlcl9zaXplLCBpbnQgZHN0X2NsX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipzcmNfZGF0YSwgaW50ICpwbGFuZV9zaXplLCBpbnQgcGxhbmVfbnVtKQotewotICAgIGludCBpLCBidWZmZXJfc2l6ZSA9IDA7Ci0gICAgdWludDhfdCAqdGVtcDsKLSAgICBjbF9pbnQgc3RhdHVzOwotICAgIHZvaWQgKm1hcHBlZDsKLSAgICBpZiAoKHVuc2lnbmVkIGludClwbGFuZV9udW0gPiA4KSB7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7aSA8IHBsYW5lX251bTtpKyspIHsKLSAgICAgICAgYnVmZmVyX3NpemUgKz0gcGxhbmVfc2l6ZVtpXTsKLSAgICB9Ci0gICAgaWYgKGJ1ZmZlcl9zaXplID4gY2xfYnVmZmVyX3NpemUpIHsKLSAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIGltYWdlIHRvIE9wZW5DTCBidWZmZXI6IGJ1ZmZlciB0b28gc21hbGxcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBtYXBwZWQgPSBjbEVucXVldWVNYXBCdWZmZXIob3BlbmNsX2N0eC5jb21tYW5kX3F1ZXVlLCBkc3RfY2xfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTF9UUlVFLCBDTF9NQVBfV1JJVEUsIDAsIGJ1ZmZlcl9zaXplICsgZHN0X2NsX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgTlVMTCwgTlVMTCwgJnN0YXR1cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBtYXAgT3BlbkNMIGJ1ZmZlcjogJXNcbiIsIGF2X29wZW5jbF9lcnJzdHIoc3RhdHVzKSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SX0VYVEVSTkFMOwotICAgIH0KLSAgICB0ZW1wID0gbWFwcGVkOwotICAgIHRlbXAgKz0gZHN0X2NsX29mZnNldDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVfbnVtOyBpKyspIHsKLSAgICAgICAgbWVtY3B5KHRlbXAsIHNyY19kYXRhW2ldLCBwbGFuZV9zaXplW2ldKTsKLSAgICAgICAgdGVtcCArPSBwbGFuZV9zaXplW2ldOwotICAgIH0KLSAgICBzdGF0dXMgPSBjbEVucXVldWVVbm1hcE1lbU9iamVjdChvcGVuY2xfY3R4LmNvbW1hbmRfcXVldWUsIGRzdF9jbF9idWYsIG1hcHBlZCwgMCwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKHN0YXR1cyAhPSBDTF9TVUNDRVNTKSB7Ci0gICAgICAgIGF2X2xvZygmb3BlbmNsX2N0eCwgQVZfTE9HX0VSUk9SLAotICAgICAgICAgICAgICAgIkNvdWxkIG5vdCB1bm1hcCBPcGVuQ0wgYnVmZmVyOiAlc1xuIiwgYXZfb3BlbmNsX2VycnN0cihzdGF0dXMpKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhURVJOQUw7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1pbnQgYXZfb3BlbmNsX2J1ZmZlcl9yZWFkX2ltYWdlKHVpbnQ4X3QgKipkc3RfZGF0YSwgaW50ICpwbGFuZV9zaXplLCBpbnQgcGxhbmVfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbF9tZW0gc3JjX2NsX2J1Ziwgc2l6ZV90IGNsX2J1ZmZlcl9zaXplKQotewotICAgIGludCBpLGJ1ZmZlcl9zaXplID0gMCxyZXQgPSAwOwotICAgIHVpbnQ4X3QgKnRlbXA7Ci0gICAgdm9pZCAqbWFwcGVkOwotICAgIGNsX2ludCBzdGF0dXM7Ci0gICAgaWYgKCh1bnNpZ25lZCBpbnQpcGxhbmVfbnVtID4gOCkgewotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICBmb3IgKGkgPSAwOyBpIDwgcGxhbmVfbnVtOyBpKyspIHsKLSAgICAgICAgYnVmZmVyX3NpemUgKz0gcGxhbmVfc2l6ZVtpXTsKLSAgICB9Ci0gICAgaWYgKGJ1ZmZlcl9zaXplID4gY2xfYnVmZmVyX3NpemUpIHsKLSAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIGltYWdlIHRvIENQVSBidWZmZXI6IE9wZW5DTCBidWZmZXIgdG9vIHNtYWxsXG4iKTsKLSAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKLSAgICB9Ci0gICAgbWFwcGVkID0gY2xFbnF1ZXVlTWFwQnVmZmVyKG9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSwgc3JjX2NsX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xfVFJVRSwgQ0xfTUFQX1JFQUQsIDAsIGJ1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCBOVUxMLCAmc3RhdHVzKTsKLQotICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUykgewotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwKLSAgICAgICAgICAgICAgICJDb3VsZCBub3QgbWFwIE9wZW5DTCBidWZmZXI6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICB9Ci0gICAgdGVtcCA9IG1hcHBlZDsKLSAgICBpZiAocmV0ID49IDApIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IHBsYW5lX251bTsgaSsrKSB7Ci0gICAgICAgICAgICBtZW1jcHkoZHN0X2RhdGFbaV0sIHRlbXAsIHBsYW5lX3NpemVbaV0pOwotICAgICAgICAgICAgdGVtcCArPSBwbGFuZV9zaXplW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIHN0YXR1cyA9IGNsRW5xdWV1ZVVubWFwTWVtT2JqZWN0KG9wZW5jbF9jdHguY29tbWFuZF9xdWV1ZSwgc3JjX2NsX2J1ZiwgbWFwcGVkLCAwLCBOVUxMLCBOVUxMKTsKLSAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfRVJST1IsCi0gICAgICAgICAgICAgICAiQ291bGQgbm90IHVubWFwIE9wZW5DTCBidWZmZXI6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICByZXR1cm4gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLWludDY0X3QgYXZfb3BlbmNsX2JlbmNobWFyayhBVk9wZW5DTERldmljZU5vZGUgKmRldmljZV9ub2RlLCBjbF9wbGF0Zm9ybV9pZCBwbGF0Zm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICgqYmVuY2htYXJrKShBVk9wZW5DTEV4dGVybmFsRW52ICpleHRfb3BlbmNsX2VudikpCi17Ci0gICAgaW50NjRfdCByZXQgPSAwOwotICAgIGNsX2ludCBzdGF0dXM7Ci0gICAgY2xfY29udGV4dF9wcm9wZXJ0aWVzIGNwc1szXTsKLSAgICBBVk9wZW5DTEV4dGVybmFsRW52ICpleHRfb3BlbmNsX2VudiA9IE5VTEw7Ci0KLSAgICBleHRfb3BlbmNsX2VudiA9IGF2X29wZW5jbF9hbGxvY19leHRlcm5hbF9lbnYoKTsKLSAgICBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX2lkID0gZGV2aWNlX25vZGUtPmRldmljZV9pZDsKLSAgICBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX3R5cGUgPSBkZXZpY2Vfbm9kZS0+ZGV2aWNlX3R5cGU7Ci0gICAgYXZfbG9nKCZvcGVuY2xfY3R4LCBBVl9MT0dfVkVSQk9TRSwgIlBlcmZvcm1pbmcgdGVzdCBvbiBPcGVuQ0wgZGV2aWNlICVzXG4iLAotICAgICAgICAgICBkZXZpY2Vfbm9kZS0+ZGV2aWNlX25hbWUpOwotCi0gICAgY3BzWzBdID0gQ0xfQ09OVEVYVF9QTEFURk9STTsKLSAgICBjcHNbMV0gPSAoY2xfY29udGV4dF9wcm9wZXJ0aWVzKXBsYXRmb3JtOwotICAgIGNwc1syXSA9IDA7Ci0gICAgZXh0X29wZW5jbF9lbnYtPmNvbnRleHQgPSBjbENyZWF0ZUNvbnRleHRGcm9tVHlwZShjcHMsIGV4dF9vcGVuY2xfZW52LT5kZXZpY2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsICZzdGF0dXMpOwotICAgIGlmIChzdGF0dXMgIT0gQ0xfU1VDQ0VTUyB8fCAhZXh0X29wZW5jbF9lbnYtPmNvbnRleHQpIHsKLSAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotICAgIGV4dF9vcGVuY2xfZW52LT5jb21tYW5kX3F1ZXVlID0gY2xDcmVhdGVDb21tYW5kUXVldWUoZXh0X29wZW5jbF9lbnYtPmNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRfb3BlbmNsX2Vudi0+ZGV2aWNlX2lkLCAwLCAmc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MgfHwgIWV4dF9vcGVuY2xfZW52LT5jb21tYW5kX3F1ZXVlKSB7Ci0gICAgICAgIHJldCA9IEFWRVJST1JfRVhURVJOQUw7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLSAgICByZXQgPSBiZW5jaG1hcmsoZXh0X29wZW5jbF9lbnYpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBhdl9sb2coJm9wZW5jbF9jdHgsIEFWX0xPR19FUlJPUiwgIkJlbmNobWFyayBmYWlsZWQgd2l0aCBPcGVuQ0wgZGV2aWNlICVzXG4iLAotICAgICAgICAgICAgICAgZGV2aWNlX25vZGUtPmRldmljZV9uYW1lKTsKLWVuZDoKLSAgICBpZiAoZXh0X29wZW5jbF9lbnYtPmNvbW1hbmRfcXVldWUpCi0gICAgICAgIGNsUmVsZWFzZUNvbW1hbmRRdWV1ZShleHRfb3BlbmNsX2Vudi0+Y29tbWFuZF9xdWV1ZSk7Ci0gICAgaWYgKGV4dF9vcGVuY2xfZW52LT5jb250ZXh0KQotICAgICAgICBjbFJlbGVhc2VDb250ZXh0KGV4dF9vcGVuY2xfZW52LT5jb250ZXh0KTsKLSAgICBhdl9vcGVuY2xfZnJlZV9leHRlcm5hbF9lbnYoJmV4dF9vcGVuY2xfZW52KTsKLSAgICByZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL29wZW5jbC5oIGIvbGliYXZ1dGlsL29wZW5jbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzA5OTI3Li4wMDAwMDAwCi0tLSBhL2xpYmF2dXRpbC9vcGVuY2wuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFBlbmcgIEdhbyAgICAgPHBlbmdAbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgTGkgICAgQ2FvICAgICA8bGlAbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgV2VpICAgR2FvICAgICA8d2VpZ2FvQG11bHRpY29yZXdhcmVpbmMuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEzIExlbm55IFdhbmcgICAgPGx3YW5naHBjQGdtYWlsLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotLyoqCi0gKiBAZmlsZQotICogT3BlbkNMIHdyYXBwZXIKLSAqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBjb25zaWRlcmVkIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaXRzIEFQSSBhbmQgQUJJIG1heQotICogY2hhbmdlIHdpdGhvdXQgcHJpb3Igbm90aWNlLgotICovCi0KLSNpZm5kZWYgQVZVVElMX09QRU5DTF9ICi0jZGVmaW5lIEFWVVRJTF9PUEVOQ0xfSAotCi0jZGVmaW5lIENMX1VTRV9ERVBSRUNBVEVEX09QRU5DTF8xXzJfQVBJUyAxCi0jaWZkZWYgX19BUFBMRV9fCi0jaW5jbHVkZSA8T3BlbkNML2NsLmg+Ci0jZWxzZQotI2luY2x1ZGUgPENML2NsLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlICJkaWN0LmgiCi0KLSNpbmNsdWRlICJsaWJhdnV0aWwvdmVyc2lvbi5oIgotCi0jZGVmaW5lIEFWX09QRU5DTF9LRVJORUwoIC4uLiApIyBfX1ZBX0FSR1NfXwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IGRldmljZV90eXBlOwotICAgIGNoYXIgKmRldmljZV9uYW1lOwotICAgIGNsX2RldmljZV9pZCBkZXZpY2VfaWQ7Ci19IEFWT3BlbkNMRGV2aWNlTm9kZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNsX3BsYXRmb3JtX2lkIHBsYXRmb3JtX2lkOwotICAgIGNoYXIgKnBsYXRmb3JtX25hbWU7Ci0gICAgaW50IGRldmljZV9udW07Ci0gICAgQVZPcGVuQ0xEZXZpY2VOb2RlICoqZGV2aWNlX25vZGU7Ci19IEFWT3BlbkNMUGxhdGZvcm1Ob2RlOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgaW50IHBsYXRmb3JtX251bTsKLSAgICBBVk9wZW5DTFBsYXRmb3JtTm9kZSAqKnBsYXRmb3JtX25vZGU7Ci19IEFWT3BlbkNMRGV2aWNlTGlzdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNsX3BsYXRmb3JtX2lkIHBsYXRmb3JtX2lkOwotICAgIGNsX2RldmljZV90eXBlIGRldmljZV90eXBlOwotICAgIGNsX2NvbnRleHQgY29udGV4dDsKLSAgICBjbF9kZXZpY2VfaWQgIGRldmljZV9pZDsKLSAgICBjbF9jb21tYW5kX3F1ZXVlIGNvbW1hbmRfcXVldWU7Ci0gICAgY2hhciAqcGxhdGZvcm1fbmFtZTsKLX0gQVZPcGVuQ0xFeHRlcm5hbEVudjsKLQotLyoqCi0gKiBHZXQgT3BlbkNMIGRldmljZSBsaXN0LgotICoKLSAqIEl0IG11c3QgYmUgZnJlZWQgd2l0aCBhdl9vcGVuY2xfZnJlZV9kZXZpY2VfbGlzdCgpLgotICoKLSAqIEBwYXJhbSBkZXZpY2VfbGlzdCBwb2ludGVyIHRvIE9wZW5DTCBlbnZpcm9ubWVudCBkZXZpY2UgbGlzdCwKLSAqICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgcmVsZWFzZWQgYnkgYXZfb3BlbmNsX2ZyZWVfZGV2aWNlX2xpc3QoKQotICoKLSAqIEByZXR1cm4gID49MCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCBhdl9vcGVuY2xfZ2V0X2RldmljZV9saXN0KEFWT3BlbkNMRGV2aWNlTGlzdCAqKmRldmljZV9saXN0KTsKLQotLyoqCi0gICogRnJlZSBPcGVuQ0wgZGV2aWNlIGxpc3QuCi0gICoKLSAgKiBAcGFyYW0gZGV2aWNlX2xpc3QgcG9pbnRlciB0byBPcGVuQ0wgZW52aXJvbm1lbnQgZGV2aWNlIGxpc3QKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSBhdl9vcGVuY2xfZ2V0X2RldmljZV9saXN0KCkKLSAgKi8KLXZvaWQgYXZfb3BlbmNsX2ZyZWVfZGV2aWNlX2xpc3QoQVZPcGVuQ0xEZXZpY2VMaXN0ICoqZGV2aWNlX2xpc3QpOwotCi0vKioKLSAqIFNldCBvcHRpb24gaW4gdGhlIGdsb2JhbCBPcGVuQ0wgY29udGV4dC4KLSAqCi0gKiBUaGlzIG9wdGlvbnMgYWZmZWN0IHRoZSBvcGVyYXRpb24gcGVyZm9ybWVkIGJ5IHRoZSBuZXh0Ci0gKiBhdl9vcGVuY2xfaW5pdCgpIG9wZXJhdGlvbi4KLSAqCi0gKiBUaGUgY3VycmVudGx5IGFjY2VwdGVkIG9wdGlvbnMgYXJlOgotICogLSBwbGF0Zm9ybTogc2V0IGluZGV4IG9mIHBsYXRmb3JtIGluIGRldmljZSBsaXN0Ci0gKiAtIGRldmljZTogc2V0IGluZGV4IG9mIGRldmljZSBpbiBkZXZpY2UgbGlzdAotICoKLSAqIFNlZSByZWZlcmVuY2UgIk9wZW5DTCBTcGVjaWZpY2F0aW9uIFZlcnNpb246IDEuMiBjaGFwdGVyIDUuNi40Ii4KLSAqCi0gKiBAcGFyYW0ga2V5ICAgICAgICAgICAgICAgICBvcHRpb24ga2V5Ci0gKiBAcGFyYW0gdmFsICAgICAgICAgICAgICAgICBvcHRpb24gdmFsdWUKLSAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqIEBzZWUgYXZfb3BlbmNsX2dldF9vcHRpb24oKQotICovCi1pbnQgYXZfb3BlbmNsX3NldF9vcHRpb24oY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWwpOwotCi0vKioKLSAqIEdldCBvcHRpb24gdmFsdWUgZnJvbSB0aGUgZ2xvYmFsIE9wZW5DTCBjb250ZXh0LgotICoKLSAqIEBwYXJhbSBrZXkgICAgICAgIG9wdGlvbiBrZXkKLSAqIEBwYXJhbSBvdXRfdmFsICBwb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIG9wdGlvbiB2YWx1ZSB3aWxsIGJlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuLCBtdXN0IGJlIGZyZWVkIHdpdGggYXZfZnJlZXAoKQotICogQHJldHVybiAgPj0wIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqIEBzZWUgYXZfb3BlbmNsX3NldF9vcHRpb24oKQotICovCi1pbnQgYXZfb3BlbmNsX2dldF9vcHRpb24oY29uc3QgY2hhciAqa2V5LCB1aW50OF90ICoqb3V0X3ZhbCk7Ci0KLS8qKgotICogRnJlZSBvcHRpb24gdmFsdWVzIG9mIHRoZSBnbG9iYWwgT3BlbkNMIGNvbnRleHQuCi0gKgotICovCi12b2lkIGF2X29wZW5jbF9mcmVlX29wdGlvbih2b2lkKTsKLQotLyoqCi0gKiBBbGxvY2F0ZSBPcGVuQ0wgZXh0ZXJuYWwgZW52aXJvbm1lbnQuCi0gKgotICogSXQgbXVzdCBiZSBmcmVlZCB3aXRoIGF2X29wZW5jbF9mcmVlX2V4dGVybmFsX2VudigpLgotICoKLSAqIEByZXR1cm4gcG9pbnRlciB0byBhbGxvY2F0ZWQgT3BlbkNMIGV4dGVybmFsIGVudmlyb25tZW50Ci0gKi8KLUFWT3BlbkNMRXh0ZXJuYWxFbnYgKmF2X29wZW5jbF9hbGxvY19leHRlcm5hbF9lbnYodm9pZCk7Ci0KLS8qKgotICogRnJlZSBPcGVuQ0wgZXh0ZXJuYWwgZW52aXJvbm1lbnQuCi0gKgotICogQHBhcmFtIGV4dF9vcGVuY2xfZW52IHBvaW50ZXIgdG8gT3BlbkNMIGV4dGVybmFsIGVudmlyb25tZW50Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBieSBhdl9vcGVuY2xfYWxsb2NfZXh0ZXJuYWxfZW52KCkKLSAqLwotdm9pZCBhdl9vcGVuY2xfZnJlZV9leHRlcm5hbF9lbnYoQVZPcGVuQ0xFeHRlcm5hbEVudiAqKmV4dF9vcGVuY2xfZW52KTsKLQotLyoqCi0gKiBHZXQgT3BlbkNMIGVycm9yIHN0cmluZy4KLSAqCi0gKiBAcGFyYW0gc3RhdHVzICAgIE9wZW5DTCBlcnJvciBjb2RlCi0gKiBAcmV0dXJuIE9wZW5DTCBlcnJvciBzdHJpbmcKLSAqLwotY29uc3QgY2hhciAqYXZfb3BlbmNsX2VycnN0cihjbF9pbnQgc3RhdHVzKTsKLQotLyoqCi0gKiBSZWdpc3RlciBrZXJuZWwgY29kZS4KLSAqCi0gKiAgVGhlIHJlZ2lzdGVyZWQga2VybmVsIGNvZGUgaXMgc3RvcmVkIGluIGEgZ2xvYmFsIGNvbnRleHQsIGFuZCBjb21waWxlZAotICogIGluIHRoZSBydW50aW1lIGVudmlyb25tZW50IHdoZW4gYXZfb3BlbmNsX2luaXQoKSBpcyBjYWxsZWQuCi0gKgotICogQHBhcmFtIGtlcm5lbF9jb2RlICAgIGtlcm5lbCBjb2RlIHRvIGJlIGNvbXBpbGVkIGluIHRoZSBPcGVuQ0wgcnVudGltZSBlbnZpcm9ubWVudAotICogQHJldHVybiAgPj0wIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqLwotaW50IGF2X29wZW5jbF9yZWdpc3Rlcl9rZXJuZWxfY29kZShjb25zdCBjaGFyICprZXJuZWxfY29kZSk7Ci0KLS8qKgotICogSW5pdGlhbGl6ZSB0aGUgcnVuIHRpbWUgT3BlbkNMIGVudmlyb25tZW50Ci0gKgotICogQHBhcmFtIGV4dF9vcGVuY2xfZW52IGV4dGVybmFsIE9wZW5DTCBlbnZpcm9ubWVudCwgY3JlYXRlZCBieSBhbgotICogICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHByb2dyYW0sIGlnbm9yZWQgaWYgc2V0IHRvIE5VTEwKLSAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqLwotaW50IGF2X29wZW5jbF9pbml0KEFWT3BlbkNMRXh0ZXJuYWxFbnYgKmV4dF9vcGVuY2xfZW52KTsKLQotLyoqCi0gKiBjb21waWxlIHNwZWNpZmljIE9wZW5DTCBrZXJuZWwgc291cmNlCi0gKgotICogQHBhcmFtIHByb2dyYW1fbmFtZSAgcG9pbnRlciB0byBhIHByb2dyYW0gbmFtZSB1c2VkIGZvciBpZGVudGlmaWNhdGlvbgotICogQHBhcmFtIGJ1aWxkX29wdHMgICAgcG9pbnRlciB0byBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgcHJlcHJvY2Vzc29yCi0gKiAgICAgICAgICAgICAgICAgICAgICBidWlsZCBvcHRpb25zIHRvIGJlIHVzZWQgZm9yIGJ1aWxkaW5nIHRoZSBwcm9ncmFtCi0gKiBAcmV0dXJuIGEgY2xfcHJvZ3JhbSBvYmplY3QKLSAqLwotY2xfcHJvZ3JhbSBhdl9vcGVuY2xfY29tcGlsZShjb25zdCBjaGFyICpwcm9ncmFtX25hbWUsIGNvbnN0IGNoYXIqIGJ1aWxkX29wdHMpOwotCi0vKioKLSAqIGdldCBPcGVuQ0wgY29tbWFuZCBxdWV1ZQotICoKLSAqIEByZXR1cm4gYSBjbF9jb21tYW5kX3F1ZXVlIG9iamVjdAotICovCi1jbF9jb21tYW5kX3F1ZXVlIGF2X29wZW5jbF9nZXRfY29tbWFuZF9xdWV1ZSh2b2lkKTsKLQotLyoqCi0gKiBDcmVhdGUgT3BlbkNMIGJ1ZmZlci4KLSAqCi0gKiBUaGUgYnVmZmVyIGlzIHVzZWQgdG8gc2F2ZSB0aGUgZGF0YSB1c2VkIG9yIGNyZWF0ZWQgYnkgYW4gT3BlbkNMCi0gKiBrZXJuZWwuCi0gKiBUaGUgY3JlYXRlZCBidWZmZXIgbXVzdCBiZSByZWxlYXNlZCB3aXRoIGF2X29wZW5jbF9idWZmZXJfcmVsZWFzZSgpLgotICoKLSAqIFNlZSBjbENyZWF0ZUJ1ZmZlcigpIGZ1bmN0aW9uIHJlZmVyZW5jZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAotICogdGhlIHBhcmFtZXRlcnMuCi0gKgotICogQHBhcmFtIGNsX2J1ZiAgICAgICBwb2ludGVyIHRvIE9wZW5DTCBidWZmZXIKLSAqIEBwYXJhbSBjbF9idWZfc2l6ZSAgc2l6ZSBpbiBieXRlcyBvZiB0aGUgT3BlbkNMIGJ1ZmZlciB0byBjcmVhdGUKLSAqIEBwYXJhbSBmbGFncyAgICAgICAgZmxhZ3MgdXNlZCB0byBjb250cm9sIGJ1ZmZlciBhdHRyaWJ1dGVzCi0gKiBAcGFyYW0gaG9zdF9wdHIgICAgIGhvc3QgcG9pbnRlciBvZiB0aGUgT3BlbkNMIGJ1ZmZlcgotICogQHJldHVybiA+PTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgYXZfb3BlbmNsX2J1ZmZlcl9jcmVhdGUoY2xfbWVtICpjbF9idWYsIHNpemVfdCBjbF9idWZfc2l6ZSwgaW50IGZsYWdzLCB2b2lkICpob3N0X3B0cik7Ci0KLS8qKgotICogV3JpdGUgT3BlbkNMIGJ1ZmZlciB3aXRoIGRhdGEgZnJvbSBzcmNfYnVmLgotICoKLSAqIEBwYXJhbSBkc3RfY2xfYnVmICAgICAgICBwb2ludGVyIHRvIE9wZW5DTCBkZXN0aW5hdGlvbiBidWZmZXIKLSAqIEBwYXJhbSBzcmNfYnVmICAgICAgICAgICBwb2ludGVyIHRvIHNvdXJjZSBidWZmZXIKLSAqIEBwYXJhbSBidWZfc2l6ZSAgICAgICAgICBzaXplIGluIGJ5dGVzIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMKLSAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqLwotaW50IGF2X29wZW5jbF9idWZmZXJfd3JpdGUoY2xfbWVtIGRzdF9jbF9idWYsIHVpbnQ4X3QgKnNyY19idWYsIHNpemVfdCBidWZfc2l6ZSk7Ci0KLS8qKgotICogUmVhZCBkYXRhIGZyb20gT3BlbkNMIGJ1ZmZlciB0byBtZW1vcnkgYnVmZmVyLgotICoKLSAqIEBwYXJhbSBkc3RfYnVmICAgICAgICAgICBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlciAoQ1BVIG1lbW9yeSkKLSAqIEBwYXJhbSBzcmNfY2xfYnVmICAgICAgICBwb2ludGVyIHRvIHNvdXJjZSBPcGVuQ0wgYnVmZmVyCi0gKiBAcGFyYW0gYnVmX3NpemUgICAgICAgICAgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBidWZmZXJzCi0gKiBAcmV0dXJuID49MCBvbiBzdWNjZXNzLCBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKi8KLWludCBhdl9vcGVuY2xfYnVmZmVyX3JlYWQodWludDhfdCAqZHN0X2J1ZiwgY2xfbWVtIHNyY19jbF9idWYsIHNpemVfdCBidWZfc2l6ZSk7Ci0KLS8qKgotICogV3JpdGUgaW1hZ2UgZGF0YSBmcm9tIG1lbW9yeSB0byBPcGVuQ0wgYnVmZmVyLgotICoKLSAqIFRoZSBzb3VyY2UgbXVzdCBiZSBhbiBhcnJheSBvZiBwb2ludGVycyB0byBpbWFnZSBwbGFuZSBidWZmZXJzLgotICoKLSAqIEBwYXJhbSBkc3RfY2xfYnVmICAgICAgICAgcG9pbnRlciB0byBkZXN0aW5hdGlvbiBPcGVuQ0wgYnVmZmVyCi0gKiBAcGFyYW0gZHN0X2NsX2J1Zl9zaXplICAgIHNpemUgaW4gYnl0ZXMgb2YgT3BlbkNMIGJ1ZmZlcgotICogQHBhcmFtIGRzdF9jbF9idWZfb2Zmc2V0ICB0aGUgb2Zmc2V0IG9mIHRoZSBPcGVuQ0wgYnVmZmVyIHN0YXJ0IHBvc2l0aW9uCi0gKiBAcGFyYW0gc3JjX2RhdGEgICAgICAgICAgIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNvdXJjZSBwbGFuZSBidWZmZXJzCi0gKiBAcGFyYW0gc3JjX3BsYW5lX3NpemVzICAgIGFycmF5IG9mIHNpemVzIGluIGJ5dGVzIG9mIHRoZSBzb3VyY2UgcGxhbmUgYnVmZmVycwotICogQHBhcmFtIHNyY19wbGFuZV9udW0gICAgICBudW1iZXIgb2Ygc291cmNlIGltYWdlIHBsYW5lcwotICogQHJldHVybiA+PTAgb24gc3VjY2VzcywgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZQotICovCi1pbnQgYXZfb3BlbmNsX2J1ZmZlcl93cml0ZV9pbWFnZShjbF9tZW0gZHN0X2NsX2J1Ziwgc2l6ZV90IGNsX2J1ZmZlcl9zaXplLCBpbnQgZHN0X2NsX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKipzcmNfZGF0YSwgaW50ICpwbGFuZV9zaXplLCBpbnQgcGxhbmVfbnVtKTsKLQotLyoqCi0gKiBSZWFkIGltYWdlIGRhdGEgZnJvbSBPcGVuQ0wgYnVmZmVyLgotICoKLSAqIEBwYXJhbSBkc3RfZGF0YSAgICAgICAgICAgYXJyYXkgb2YgcG9pbnRlcnMgdG8gZGVzdGluYXRpb24gcGxhbmUgYnVmZmVycwotICogQHBhcmFtIGRzdF9wbGFuZV9zaXplcyAgICBhcnJheSBvZiBwb2ludGVycyB0byBkZXN0aW5hdGlvbiBwbGFuZSBidWZmZXJzCi0gKiBAcGFyYW0gZHN0X3BsYW5lX251bSAgICAgIG51bWJlciBvZiBkZXN0aW5hdGlvbiBpbWFnZSBwbGFuZXMKLSAqIEBwYXJhbSBzcmNfY2xfYnVmICAgICAgICAgcG9pbnRlciB0byBzb3VyY2UgT3BlbkNMIGJ1ZmZlcgotICogQHBhcmFtIHNyY19jbF9idWZfc2l6ZSAgICBzaXplIGluIGJ5dGVzIG9mIE9wZW5DTCBidWZmZXIKLSAqIEByZXR1cm4gPj0wIG9uIHN1Y2Nlc3MsIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGZhaWx1cmUKLSAqLwotaW50IGF2X29wZW5jbF9idWZmZXJfcmVhZF9pbWFnZSh1aW50OF90ICoqZHN0X2RhdGEsIGludCAqcGxhbmVfc2l6ZSwgaW50IHBsYW5lX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xfbWVtIHNyY19jbF9idWYsIHNpemVfdCBjbF9idWZmZXJfc2l6ZSk7Ci0KLS8qKgotICogUmVsZWFzZSBPcGVuQ0wgYnVmZmVyLgotICoKLSAqIEBwYXJhbSBjbF9idWYgcG9pbnRlciB0byBPcGVuQ0wgYnVmZmVyIHRvIHJlbGVhc2UsIHdoaWNoIHdhcwotICogICAgICAgICAgICAgICBwcmV2aW91c2x5IGZpbGxlZCB3aXRoIGF2X29wZW5jbF9idWZmZXJfY3JlYXRlKCkKLSAqLwotdm9pZCBhdl9vcGVuY2xfYnVmZmVyX3JlbGVhc2UoY2xfbWVtICpjbF9idWYpOwotCi0vKioKLSAqIFJlbGVhc2UgT3BlbkNMIGVudmlyb25tZW50LgotICoKLSAqIFRoZSBPcGVuQ0wgZW52aXJvbm1lbnQgaXMgZWZmZWN0aXZlbHkgcmVsZWFzZWQgb25seSBpZiBhbGwgdGhlIGNyZWF0ZWQKLSAqIGtlcm5lbHMgaGFkIGJlZW4gcmVsZWFzZWQgd2l0aCBhdl9vcGVuY2xfcmVsZWFzZV9rZXJuZWwoKS4KLSAqLwotdm9pZCBhdl9vcGVuY2xfdW5pbml0KHZvaWQpOwotCi0vKioKLSAqIEJlbmNobWFyayBhbiBPcGVuQ0wgZGV2aWNlIHdpdGggYSB1c2VyIGRlZmluZWQgY2FsbGJhY2sgZnVuY3Rpb24uICBUaGlzIGZ1bmN0aW9uCi0gKiBzZXRzIHVwIGFuIGV4dGVybmFsIE9wZW5DTCBlbnZpcm9ubWVudCBpbmNsdWRpbmcgY29udGV4dCBhbmQgY29tbWFuZCBxdWV1ZSBvbgotICogdGhlIGRldmljZSB0aGVuIHRlYXJzIGl0IGRvd24gaW4gdGhlIGVuZC4gIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBzaG91bGQgcGVyZm9ybQotICogdGhlIHJlc3Qgb2YgdGhlIHdvcmsuCi0gKgotICogQHBhcmFtIGRldmljZSAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIE9wZW5DTCBkZXZpY2UgdG8gYmUgdXNlZAotICogQHBhcmFtIHBsYXRmb3JtICAgICAgICAgIGNsX3BsYXRmb3JtX2lkIGhhbmRsZSB0byB3aGljaCB0aGUgZGV2aWNlIGJlbG9uZ3MgdG8KLSAqIEBwYXJhbSBiZW5jaG1hcmsgICAgICAgICBjYWxsYmFjayBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBiZW5jaG1hcmssIHJldHVybiBhCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBmYWlsdXJlCi0gKiBAcmV0dXJuIHRoZSBzY29yZSBwYXNzZWQgZnJvbSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24sIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpbiBjYXNlCi0gKiBvZiBmYWlsdXJlCi0gKi8KLWludDY0X3QgYXZfb3BlbmNsX2JlbmNobWFyayhBVk9wZW5DTERldmljZU5vZGUgKmRldmljZSwgY2xfcGxhdGZvcm1faWQgcGxhdGZvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAoKmJlbmNobWFyaykoQVZPcGVuQ0xFeHRlcm5hbEVudiAqZXh0X29wZW5jbF9lbnYpKTsKLQotI2VuZGlmIC8qIEFWVVRJTF9PUEVOQ0xfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL29wZW5jbF9pbnRlcm5hbC5jIGIvbGliYXZ1dGlsL29wZW5jbF9pbnRlcm5hbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI0MTkzLi4wMDAwMDAwCi0tLSBhL2xpYmF2dXRpbC9vcGVuY2xfaW50ZXJuYWwuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgUGVuZyBHYW8gPHBlbmdAbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgTGkgICBDYW8gPGxpQG11bHRpY29yZXdhcmVpbmMuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEyIFdlaSAgR2FvIDx3ZWlnYW9AbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlICJvcGVuY2xfaW50ZXJuYWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCi0KLWludCBhdnByaXZfb3BlbmNsX3NldF9wYXJhbWV0ZXIoRkZPcGVuY2xQYXJhbSAqb3BlbmNsX3BhcmFtLCAuLi4pCi17Ci0gICAgaW50IHJldCA9IDA7Ci0gICAgdmFfbGlzdCBhcmdfcHRyOwotICAgIHZvaWQgKnBhcmFtOwotICAgIHNpemVfdCBwYXJhbV9zaXplOwotICAgIGNsX2ludCBzdGF0dXM7Ci0gICAgaWYgKCFvcGVuY2xfcGFyYW0tPmtlcm5lbCkgewotICAgICAgICBhdl9sb2cob3BlbmNsX3BhcmFtLT5jdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBrZXJuZWwgbXVzdCBiZSBzZXRcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwotICAgIH0KLSAgICB2YV9zdGFydChhcmdfcHRyLCBvcGVuY2xfcGFyYW0pOwotICAgIGRvIHsKLSAgICAgICAgcGFyYW0gPSB2YV9hcmcoYXJnX3B0ciwgdm9pZCAqKTsKLSAgICAgICAgaWYgKCFwYXJhbSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBwYXJhbV9zaXplID0gdmFfYXJnKGFyZ19wdHIsIHNpemVfdCk7Ci0gICAgICAgIGlmICghcGFyYW1fc2l6ZSkgewotICAgICAgICAgICAgYXZfbG9nKG9wZW5jbF9wYXJhbS0+Y3R4LCBBVl9MT0dfRVJST1IsICJQYXJhbWV0ZXIgc2l6ZSBtdXN0IG5vdCBiZSAwXG4iKTsKLSAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IGNsU2V0S2VybmVsQXJnKG9wZW5jbF9wYXJhbS0+a2VybmVsLCBvcGVuY2xfcGFyYW0tPnBhcmFtX251bSwgcGFyYW1fc2l6ZSwgcGFyYW0pOwotICAgICAgICBpZiAoc3RhdHVzICE9IENMX1NVQ0NFU1MpIHsKLSAgICAgICAgICAgIGF2X2xvZyhvcGVuY2xfcGFyYW0tPmN0eCwgQVZfTE9HX0VSUk9SLCAiQ2Fubm90IHNldCBrZXJuZWwgYXJndW1lbnQ6ICVzXG4iLCBhdl9vcGVuY2xfZXJyc3RyKHN0YXR1cykpOwotICAgICAgICAgICAgcmV0ID0gQVZFUlJPUl9FWFRFUk5BTDsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgICAgIG9wZW5jbF9wYXJhbS0+cGFyYW1fbnVtKys7Ci0gICAgfSB3aGlsZSAocGFyYW0gJiYgcGFyYW1fc2l6ZSk7Ci1lbmQ6Ci0gICAgdmFfZW5kKGFyZ19wdHIpOwotICAgIHJldHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvb3BlbmNsX2ludGVybmFsLmggYi9saWJhdnV0aWwvb3BlbmNsX2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYWJiN2IuLjAwMDAwMDAKLS0tIGEvbGliYXZ1dGlsL29wZW5jbF9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBQZW5nIEdhbyA8cGVuZ0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KLSAqIENvcHlyaWdodCAoQykgMjAxMiBMaSAgIENhbyA8bGlAbXVsdGljb3Jld2FyZWluYy5jb20+Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgV2VpICBHYW8gPHdlaWdhb0BtdWx0aWNvcmV3YXJlaW5jLmNvbT4KLSAqCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCi0gKgotICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCi0gKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCi0gKi8KLQotI2lmbmRlZiBBVlVUSUxfT1BFTkNMX0lOVEVSTkFMX0gKLSNkZWZpbmUgQVZVVElMX09QRU5DTF9JTlRFUk5BTF9ICi0KLSNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCi0jaW5jbHVkZSAib3BlbmNsLmgiCi0KLSNkZWZpbmUgRkZfT1BFTkNMX1BBUkFNX0lORk8oYSkgKCh2b2lkKikoJihhKSkpLCAoc2l6ZW9mKGEpKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY2xfa2VybmVsIGtlcm5lbDsKLSAgICBpbnQgcGFyYW1fbnVtOwotICAgIHZvaWQgKmN0eDsKLX0gRkZPcGVuY2xQYXJhbTsKLQotYXZfd2Fybl91bnVzZWRfcmVzdWx0Ci1pbnQgYXZwcml2X29wZW5jbF9zZXRfcGFyYW1ldGVyKEZGT3BlbmNsUGFyYW0gKm9wZW5jbF9wYXJhbSwgLi4uKTsKLQotI2VuZGlmIC8qIEFWVVRJTF9PUEVOQ0xfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL29wdC5jIGIvbGliYXZ1dGlsL29wdC5jCmluZGV4IGVhZTRmNzUuLjNiMGFhYjQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9vcHQuYworKysgYi9saWJhdnV0aWwvb3B0LmMKQEAgLTMwLDEzICszMCwxMyBAQAogI2luY2x1ZGUgImF2c3RyaW5nLmgiCiAjaW5jbHVkZSAiY2hhbm5lbF9sYXlvdXQuaCIKICNpbmNsdWRlICJjb21tb24uaCIKLSNpbmNsdWRlICJvcHQuaCIKLSNpbmNsdWRlICJldmFsLmgiCiAjaW5jbHVkZSAiZGljdC5oIgorI2luY2x1ZGUgImV2YWwuaCIKICNpbmNsdWRlICJsb2cuaCIKICNpbmNsdWRlICJwYXJzZXV0aWxzLmgiCiAjaW5jbHVkZSAicGl4ZGVzYy5oIgogI2luY2x1ZGUgIm1hdGhlbWF0aWNzLmgiCisjaW5jbHVkZSAib3B0LmgiCiAjaW5jbHVkZSAic2FtcGxlZm10LmgiCiAjaW5jbHVkZSAiYnByaW50LmgiCiAKQEAgLTU4LDIwICs1OCwzOCBAQAogc3RhdGljIGludCByZWFkX251bWJlcihjb25zdCBBVk9wdGlvbiAqbywgY29uc3Qgdm9pZCAqZHN0LCBkb3VibGUgKm51bSwgaW50ICpkZW4sIGludDY0X3QgKmludG51bSkKIHsKICAgICBzd2l0Y2ggKG8tPnR5cGUpIHsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0ZMQUdTOiAgICAgKmludG51bSA9ICoodW5zaWduZWQgaW50Kilkc3Q7cmV0dXJuIDA7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9QSVhFTF9GTVQ6ICppbnRudW0gPSAqKGVudW0gQVZQaXhlbEZvcm1hdCAqKWRzdDtyZXR1cm4gMDsKLSAgICBjYXNlIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQ6KmludG51bSA9ICooZW51bSBBVlNhbXBsZUZvcm1hdCopZHN0O3JldHVybiAwOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxBR1M6CisgICAgICAgICppbnRudW0gPSAqKHVuc2lnbmVkIGludCopZHN0OworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1BJWEVMX0ZNVDoKKyAgICAgICAgKmludG51bSA9ICooZW51bSBBVlBpeGVsRm9ybWF0ICopZHN0OworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQ6CisgICAgICAgICppbnRudW0gPSAqKGVudW0gQVZTYW1wbGVGb3JtYXQgKilkc3Q7CisgICAgICAgIHJldHVybiAwOwogICAgIGNhc2UgQVZfT1BUX1RZUEVfQk9PTDoKLSAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDogICAgICAgKmludG51bSA9ICooaW50ICAgICAgICAgKilkc3Q7cmV0dXJuIDA7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6CisgICAgICAgICppbnRudW0gPSAqKGludCAqKWRzdDsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVDoKICAgICBjYXNlIEFWX09QVF9UWVBFX0RVUkFUSU9OOgotICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6ICAgICAqaW50bnVtID0gKihpbnQ2NF90ICAgICAqKWRzdDtyZXR1cm4gMDsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0ZMT0FUOiAgICAgKm51bSAgICA9ICooZmxvYXQgICAgICAgKilkc3Q7cmV0dXJuIDA7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9ET1VCTEU6ICAgICpudW0gICAgPSAqKGRvdWJsZSAgICAgICopZHN0O3JldHVybiAwOwotICAgIGNhc2UgQVZfT1BUX1RZUEVfUkFUSU9OQUw6ICAqaW50bnVtID0gKChBVlJhdGlvbmFsKilkc3QpLT5udW07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpkZW4gICAgPSAoKEFWUmF0aW9uYWwqKWRzdCktPmRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9DT05TVDogICAgICpudW0gICAgPSBvLT5kZWZhdWx0X3ZhbC5kYmw7IHJldHVybiAwOworICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6CisgICAgY2FzZSBBVl9PUFRfVFlQRV9VSU5UNjQ6CisgICAgICAgICppbnRudW0gPSAqKGludDY0X3QgKilkc3Q7CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxPQVQ6CisgICAgICAgICpudW0gPSAqKGZsb2F0ICopZHN0OworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0RPVUJMRToKKyAgICAgICAgKm51bSA9ICooZG91YmxlICopZHN0OworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1JBVElPTkFMOgorICAgICAgICAqaW50bnVtID0gKChBVlJhdGlvbmFsICopZHN0KS0+bnVtOworICAgICAgICAqZGVuICAgID0gKChBVlJhdGlvbmFsICopZHN0KS0+ZGVuOworICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0NPTlNUOgorICAgICAgICAqbnVtID0gby0+ZGVmYXVsdF92YWwuZGJsOworICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIH0KQEAgLTc5LDggKzk3LDggQEAKIHN0YXRpYyBpbnQgd3JpdGVfbnVtYmVyKHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8sIHZvaWQgKmRzdCwgZG91YmxlIG51bSwgaW50IGRlbiwgaW50NjRfdCBpbnRudW0pCiB7CiAgICAgaWYgKG8tPnR5cGUgIT0gQVZfT1BUX1RZUEVfRkxBR1MgJiYKLSAgICAgICAgKG8tPm1heCAqIGRlbiA8IG51bSAqIGludG51bSB8fCBvLT5taW4gKiBkZW4gPiBudW0gKiBpbnRudW0pKSB7Ci0gICAgICAgIG51bSA9IGRlbiA/IG51bSppbnRudW0vZGVuIDogKG51bSppbnRudW0gPyBJTkZJTklUWSA6IE5BTik7CisgICAgICAgICghZGVuIHx8IG8tPm1heCAqIGRlbiA8IG51bSAqIGludG51bSB8fCBvLT5taW4gKiBkZW4gPiBudW0gKiBpbnRudW0pKSB7CisgICAgICAgIG51bSA9IGRlbiA/IG51bSAqIGludG51bSAvIGRlbiA6IChudW0gJiYgaW50bnVtID8gSU5GSU5JVFkgOiBOQU4pOwogICAgICAgICBhdl9sb2cob2JqLCBBVl9MT0dfRVJST1IsICJWYWx1ZSAlZiBmb3IgcGFyYW1ldGVyICclcycgb3V0IG9mIHJhbmdlIFslZyAtICVnXVxuIiwKICAgICAgICAgICAgICAgIG51bSwgby0+bmFtZSwgby0+bWluLCBvLT5tYXgpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFUkFOR0UpOwpAQCAtOTYsMTkgKzExNCw1MiBAQAogICAgIH0KIAogICAgIHN3aXRjaCAoby0+dHlwZSkgewotICAgIGNhc2UgQVZfT1BUX1RZUEVfUElYRUxfRk1UOiAqKGVudW0gQVZQaXhlbEZvcm1hdCAqKWRzdCA9IGxscmludChudW0vZGVuKSAqIGludG51bTsgYnJlYWs7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UOiooZW51bSBBVlNhbXBsZUZvcm1hdCopZHN0ID0gbGxyaW50KG51bS9kZW4pICogaW50bnVtOyBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1BJWEVMX0ZNVDoKKyAgICAgICAgKihlbnVtIEFWUGl4ZWxGb3JtYXQgKilkc3QgPSBsbHJpbnQobnVtIC8gZGVuKSAqIGludG51bTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UOgorICAgICAgICAqKGVudW0gQVZTYW1wbGVGb3JtYXQgKilkc3QgPSBsbHJpbnQobnVtIC8gZGVuKSAqIGludG51bTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9CT09MOgogICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxBR1M6Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6ICAgKihpbnQgICAgICAgKilkc3Q9IGxscmludChudW0vZGVuKSppbnRudW07IGJyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOgorICAgICAgICAqKGludCAqKWRzdCA9IGxscmludChudW0gLyBkZW4pICogaW50bnVtOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX09QVF9UWVBFX0RVUkFUSU9OOgogICAgIGNhc2UgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQ6Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDogKihpbnQ2NF90ICAgKilkc3Q9IGxscmludChudW0vZGVuKSppbnRudW07IGJyZWFrOwotICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxPQVQ6ICooZmxvYXQgICAgICopZHN0PSBudW0qaW50bnVtL2RlbjsgICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0RPVUJMRToqKGRvdWJsZSAgICAqKWRzdD0gbnVtKmludG51bS9kZW47ICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDp7CisgICAgICAgIGRvdWJsZSBkID0gbnVtIC8gZGVuOworICAgICAgICBpZiAoaW50bnVtID09IDEgJiYgZCA9PSAoZG91YmxlKUlOVDY0X01BWCkgeworICAgICAgICAgICAgKihpbnQ2NF90ICopZHN0ID0gSU5UNjRfTUFYOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICooaW50NjRfdCAqKWRzdCA9IGxscmludChkKSAqIGludG51bTsKKyAgICAgICAgYnJlYWs7fQorICAgIGNhc2UgQVZfT1BUX1RZUEVfVUlOVDY0OnsKKyAgICAgICAgZG91YmxlIGQgPSBudW0gLyBkZW47CisgICAgICAgIC8vIFdlIG11c3Qgc3BlY2lhbCBjYXNlIHVpbnQ2NF90IGhlcmUgYXMgbGxyaW50KCkgZG9lcyBub3Qgc3VwcG9ydCB2YWx1ZXMKKyAgICAgICAgLy8gb3V0c2lkZSB0aGUgaW50NjRfdCByYW5nZSBhbmQgdGhlcmUgaXMgbm8gcG9ydGFibGUgZnVuY3Rpb24gd2hpY2ggZG9lcworICAgICAgICAvLyAiSU5UNjRfTUFYICsgMVVMTCIgaXMgdXNlZCBhcyBpdCBpcyByZXByZXNlbnRhYmxlIGV4YWN0bHkgYXMgSUVFRSBkb3VibGUKKyAgICAgICAgLy8gd2hpbGUgSU5UNjRfTUFYIGlzIG5vdAorICAgICAgICBpZiAoaW50bnVtID09IDEgJiYgZCA9PSAoZG91YmxlKVVJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgICoodWludDY0X3QgKilkc3QgPSBVSU5UNjRfTUFYOworICAgICAgICB9IGVsc2UgaWYgKGQgPiBJTlQ2NF9NQVggKyAxVUxMKSB7CisgICAgICAgICAgICAqKHVpbnQ2NF90ICopZHN0ID0gKGxscmludChkIC0gKElOVDY0X01BWCArIDFVTEwpKSArIChJTlQ2NF9NQVggKyAxVUxMKSkqaW50bnVtOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKih1aW50NjRfdCAqKWRzdCA9IGxscmludChkKSAqIGludG51bTsKKyAgICAgICAgfQorICAgICAgICBicmVhazt9CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDoKKyAgICAgICAgKihmbG9hdCAqKWRzdCA9IG51bSAqIGludG51bSAvIGRlbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9ET1VCTEU6CisgICAgICAgICooZG91YmxlICAgICopZHN0ID0gbnVtICogaW50bnVtIC8gZGVuOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX09QVF9UWVBFX1JBVElPTkFMOgotICAgICAgICBpZiAoKGludCludW0gPT0gbnVtKSAqKEFWUmF0aW9uYWwqKWRzdD0gKEFWUmF0aW9uYWwpe251bSppbnRudW0sIGRlbn07Ci0gICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICooQVZSYXRpb25hbCopZHN0PSBhdl9kMnEobnVtKmludG51bS9kZW4sIDE8PDI0KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1ZJREVPX1JBVEU6CisgICAgICAgIGlmICgoaW50KSBudW0gPT0gbnVtKQorICAgICAgICAgICAgKihBVlJhdGlvbmFsICopZHN0ID0gKEFWUmF0aW9uYWwpIHsgbnVtICppbnRudW0sIGRlbiB9OworICAgICAgICBlbHNlCisgICAgICAgICAgICAqKEFWUmF0aW9uYWwgKilkc3QgPSBhdl9kMnEobnVtICogaW50bnVtIC8gZGVuLCAxIDw8IDI0KTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKQEAgLTExNyw5ICsxNjgsMTIgQEAKIH0KIAogc3RhdGljIGludCBoZXhjaGFyMmludChjaGFyIGMpIHsKLSAgICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHJldHVybiBjIC0gJzAnOwotICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykgcmV0dXJuIGMgLSAnYScgKyAxMDsKLSAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpIHJldHVybiBjIC0gJ0EnICsgMTA7CisgICAgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKQorICAgICAgICByZXR1cm4gYyAtICcwJzsKKyAgICBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisgICAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7CisgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorICAgICAgICByZXR1cm4gYyAtICdBJyArIDEwOwogICAgIHJldHVybiAtMTsKIH0KIApAQCAtMTUxLDcgKzIwNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgKnB0cisrID0gKGEgPDwgNCkgfCBiOwogICAgIH0KLSAgICAqZHN0ID0gYmluOworICAgICpkc3QgICAgPSBiaW47CiAgICAgKmxlbmRzdCA9IGxlbjsKIAogICAgIHJldHVybiAwOwpAQCAtMTY1LDEwICsyMTksMTIgQEAKIH0KIAogI2RlZmluZSBERUZBVUxUX05VTVZBTChvcHQpICgob3B0LT50eXBlID09IEFWX09QVF9UWVBFX0lOVDY0IHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdC0+dHlwZSA9PSBBVl9PUFRfVFlQRV9VSU5UNjQgfHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0LT50eXBlID09IEFWX09QVF9UWVBFX0NPTlNUIHx8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdC0+dHlwZSA9PSBBVl9PUFRfVFlQRV9GTEFHUyB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHQtPnR5cGUgPT0gQVZfT1BUX1RZUEVfSU5UKSA/IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0LT5kZWZhdWx0X3ZhbC5pNjQgOiBvcHQtPmRlZmF1bHRfdmFsLmRibCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdC0+dHlwZSA9PSBBVl9PUFRfVFlQRV9JTlQpICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gb3B0LT5kZWZhdWx0X3ZhbC5pNjQgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG9wdC0+ZGVmYXVsdF92YWwuZGJsKQogCiBzdGF0aWMgaW50IHNldF9zdHJpbmdfbnVtYmVyKHZvaWQgKm9iaiwgdm9pZCAqdGFyZ2V0X29iaiwgY29uc3QgQVZPcHRpb24gKm8sIGNvbnN0IGNoYXIgKnZhbCwgdm9pZCAqZHN0KQogewpAQCAtMjQzLDggKzI5OSwxMCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChvLT50eXBlID09IEFWX09QVF9UWVBFX0ZMQUdTKSB7CiAgICAgICAgICAgICByZWFkX251bWJlcihvLCBkc3QsIE5VTEwsIE5VTEwsICZpbnRudW0pOwotICAgICAgICAgICAgaWYgICAgICAoY21kID09ICcrJykgZCA9IGludG51bSB8IChpbnQ2NF90KWQ7Ci0gICAgICAgICAgICBlbHNlIGlmIChjbWQgPT0gJy0nKSBkID0gaW50bnVtICZ+KGludDY0X3QpZDsKKyAgICAgICAgICAgIGlmIChjbWQgPT0gJysnKQorICAgICAgICAgICAgICAgIGQgPSBpbnRudW0gfCAoaW50NjRfdClkOworICAgICAgICAgICAgZWxzZSBpZiAoY21kID09ICctJykKKyAgICAgICAgICAgICAgICBkID0gaW50bnVtICZ+KGludDY0X3QpZDsKICAgICAgICAgfQogCiAgICAgICAgIGlmICgocmV0ID0gd3JpdGVfbnVtYmVyKG9iaiwgbywgZHN0LCBkLCAxLCAxKSkgPCAwKQpAQCAtMjUzLDggKzMxMSw2IEBACiAgICAgICAgIGlmICghaSB8fCAhKnZhbCkKICAgICAgICAgICAgIHJldHVybiAwOwogICAgIH0KLQotICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHNldF9zdHJpbmdfaW1hZ2Vfc2l6ZSh2b2lkICpvYmosIGNvbnN0IEFWT3B0aW9uICpvLCBjb25zdCBjaGFyICp2YWwsIGludCAqZHN0KQpAQCAtNDA3LDIxICs0NjMsMzUgQEAKICAgICBpZiAoby0+ZmxhZ3MgJiBBVl9PUFRfRkxBR19SRUFET05MWSkKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIAotICAgIGRzdCA9ICgodWludDhfdCopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQ7CisgICAgZHN0ID0gKCh1aW50OF90ICopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQ7CiAgICAgc3dpdGNoIChvLT50eXBlKSB7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9CT09MOiAgICAgcmV0dXJuIHNldF9zdHJpbmdfYm9vbChvYmosIG8sIHZhbCwgZHN0KTsKLSAgICBjYXNlIEFWX09QVF9UWVBFX1NUUklORzogICByZXR1cm4gc2V0X3N0cmluZyhvYmosIG8sIHZhbCwgZHN0KTsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0JJTkFSWTogICByZXR1cm4gc2V0X3N0cmluZ19iaW5hcnkob2JqLCBvLCB2YWwsIGRzdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9CT09MOgorICAgICAgICByZXR1cm4gc2V0X3N0cmluZ19ib29sKG9iaiwgbywgdmFsLCBkc3QpOworICAgIGNhc2UgQVZfT1BUX1RZUEVfU1RSSU5HOgorICAgICAgICByZXR1cm4gc2V0X3N0cmluZyhvYmosIG8sIHZhbCwgZHN0KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0JJTkFSWToKKyAgICAgICAgcmV0dXJuIHNldF9zdHJpbmdfYmluYXJ5KG9iaiwgbywgdmFsLCBkc3QpOwogICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxBR1M6CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIEFWX09QVF9UWVBFX1VJTlQ2NDoKICAgICBjYXNlIEFWX09QVF9UWVBFX0ZMT0FUOgogICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOgotICAgIGNhc2UgQVZfT1BUX1RZUEVfUkFUSU9OQUw6IHJldHVybiBzZXRfc3RyaW5nX251bWJlcihvYmosIHRhcmdldF9vYmosIG8sIHZhbCwgZHN0KTsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0lNQUdFX1NJWkU6IHJldHVybiBzZXRfc3RyaW5nX2ltYWdlX3NpemUob2JqLCBvLCB2YWwsIGRzdCk7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9WSURFT19SQVRFOiByZXR1cm4gc2V0X3N0cmluZ192aWRlb19yYXRlKG9iaiwgbywgdmFsLCBkc3QpOwotICAgIGNhc2UgQVZfT1BUX1RZUEVfUElYRUxfRk1UOiAgcmV0dXJuIHNldF9zdHJpbmdfcGl4ZWxfZm10KG9iaiwgbywgdmFsLCBkc3QpOwotICAgIGNhc2UgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVDogcmV0dXJuIHNldF9zdHJpbmdfc2FtcGxlX2ZtdChvYmosIG8sIHZhbCwgZHN0KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1JBVElPTkFMOgorICAgICAgICByZXR1cm4gc2V0X3N0cmluZ19udW1iZXIob2JqLCB0YXJnZXRfb2JqLCBvLCB2YWwsIGRzdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFOgorICAgICAgICByZXR1cm4gc2V0X3N0cmluZ19pbWFnZV9zaXplKG9iaiwgbywgdmFsLCBkc3QpOworICAgIGNhc2UgQVZfT1BUX1RZUEVfVklERU9fUkFURTogeworICAgICAgICBBVlJhdGlvbmFsIHRtcDsKKyAgICAgICAgcmV0ID0gc2V0X3N0cmluZ192aWRlb19yYXRlKG9iaiwgbywgdmFsLCAmdG1wKTsKKyAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICByZXR1cm4gd3JpdGVfbnVtYmVyKG9iaiwgbywgZHN0LCAxLCB0bXAuZGVuLCB0bXAubnVtKTsKKyAgICB9CisgICAgY2FzZSBBVl9PUFRfVFlQRV9QSVhFTF9GTVQ6CisgICAgICAgIHJldHVybiBzZXRfc3RyaW5nX3BpeGVsX2ZtdChvYmosIG8sIHZhbCwgZHN0KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQ6CisgICAgICAgIHJldHVybiBzZXRfc3RyaW5nX3NhbXBsZV9mbXQob2JqLCBvLCB2YWwsIGRzdCk7CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9EVVJBVElPTjoKICAgICAgICAgaWYgKCF2YWwpIHsKICAgICAgICAgICAgICooaW50NjRfdCAqKWRzdCA9IDA7CkBAIC00MzIsNyArNTAyLDggQEAKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9DT0xPUjogICAgICByZXR1cm4gc2V0X3N0cmluZ19jb2xvcihvYmosIG8sIHZhbCwgZHN0KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0NPTE9SOgorICAgICAgICByZXR1cm4gc2V0X3N0cmluZ19jb2xvcihvYmosIG8sIHZhbCwgZHN0KTsKICAgICBjYXNlIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VUOgogICAgICAgICBpZiAoIXZhbCB8fCAhc3RyY21wKHZhbCwgIm5vbmUiKSkgewogICAgICAgICAgICAgKihpbnQ2NF90ICopZHN0ID0gMDsKQEAgLTQ1MiwxMyArNTIzLDE0IEBACiAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIH0KIAotI2RlZmluZSBPUFRfRVZBTF9OVU1CRVIobmFtZSwgb3B0dHlwZSwgdmFydHlwZSlcCi0gICAgaW50IGF2X29wdF9ldmFsXyAjIyBuYW1lKHZvaWQgKm9iaiwgY29uc3QgQVZPcHRpb24gKm8sIGNvbnN0IGNoYXIgKnZhbCwgdmFydHlwZSAqbmFtZSAjIyBfb3V0KVwKLSAgICB7XAotICAgICAgICBpZiAoIW8gfHwgby0+dHlwZSAhPSBvcHR0eXBlIHx8IG8tPmZsYWdzICYgQVZfT1BUX0ZMQUdfUkVBRE9OTFkpXAotICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTtcCi0gICAgICAgIHJldHVybiBzZXRfc3RyaW5nX251bWJlcihvYmosIG9iaiwgbywgdmFsLCBuYW1lICMjIF9vdXQpO1wKLSAgICB9CisjZGVmaW5lIE9QVF9FVkFMX05VTUJFUihuYW1lLCBvcHR0eXBlLCB2YXJ0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnQgYXZfb3B0X2V2YWxfICMjIG5hbWUodm9pZCAqb2JqLCBjb25zdCBBVk9wdGlvbiAqbywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsLCB2YXJ0eXBlICpuYW1lICMjIF9vdXQpICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFvIHx8IG8tPnR5cGUgIT0gb3B0dHlwZSB8fCBvLT5mbGFncyAmIEFWX09QVF9GTEFHX1JFQURPTkxZKSAgICBcCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHNldF9zdHJpbmdfbnVtYmVyKG9iaiwgb2JqLCBvLCB2YWwsIG5hbWUgIyMgX291dCk7ICAgICAgICAgICBcCit9CiAKIE9QVF9FVkFMX05VTUJFUihmbGFncywgIEFWX09QVF9UWVBFX0ZMQUdTLCAgICBpbnQpCiBPUFRfRVZBTF9OVU1CRVIoaW50LCAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgaW50KQpAQCAtNDY4LDcgKzU0MCw3IEBACiBPUFRfRVZBTF9OVU1CRVIocSwgICAgICBBVl9PUFRfVFlQRV9SQVRJT05BTCwgQVZSYXRpb25hbCkKIAogc3RhdGljIGludCBzZXRfbnVtYmVyKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgZG91YmxlIG51bSwgaW50IGRlbiwgaW50NjRfdCBpbnRudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlYXJjaF9mbGFncykKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VhcmNoX2ZsYWdzKQogewogICAgIHZvaWQgKmRzdCwgKnRhcmdldF9vYmo7CiAgICAgY29uc3QgQVZPcHRpb24gKm8gPSBhdl9vcHRfZmluZDIob2JqLCBuYW1lLCBOVUxMLCAwLCBzZWFyY2hfZmxhZ3MsICZ0YXJnZXRfb2JqKTsKQEAgLTQ3OSw3ICs1NTEsNyBAQAogICAgIGlmIChvLT5mbGFncyAmIEFWX09QVF9GTEFHX1JFQURPTkxZKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCi0gICAgZHN0ID0gKCh1aW50OF90Kil0YXJnZXRfb2JqKSArIG8tPm9mZnNldDsKKyAgICBkc3QgPSAoKHVpbnQ4X3QgKil0YXJnZXRfb2JqKSArIG8tPm9mZnNldDsKICAgICByZXR1cm4gd3JpdGVfbnVtYmVyKG9iaiwgbywgZHN0LCBudW0sIGRlbiwgaW50bnVtKTsKIH0KIApAQCAtNTE2LDExICs1ODgsMTEgQEAKICAgICBpZiAobGVuICYmICFwdHIpCiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAKLSAgICBkc3QgPSAodWludDhfdCAqKikoKCh1aW50OF90ICopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQpOworICAgIGRzdCAgICA9ICh1aW50OF90ICoqKSgoKHVpbnQ4X3QgKil0YXJnZXRfb2JqKSArIG8tPm9mZnNldCk7CiAgICAgbGVuZHN0ID0gKGludCAqKShkc3QgKyAxKTsKIAogICAgIGF2X2ZyZWUoKmRzdCk7Ci0gICAgKmRzdCA9IHB0cjsKKyAgICAqZHN0ICAgID0gcHRyOwogICAgICpsZW5kc3QgPSBsZW47CiAgICAgaWYgKGxlbikKICAgICAgICAgbWVtY3B5KHB0ciwgdmFsLCBsZW4pOwpAQCAtNjIyLDcgKzY5NCw4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBhdl9vcHRfc2V0X2RpY3RfdmFsKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgQVZEaWN0aW9uYXJ5ICp2YWwsIGludCBzZWFyY2hfZmxhZ3MpCitpbnQgYXZfb3B0X3NldF9kaWN0X3ZhbCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFWRGljdGlvbmFyeSAqdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlYXJjaF9mbGFncykKIHsKICAgICB2b2lkICp0YXJnZXRfb2JqOwogICAgIEFWRGljdGlvbmFyeSAqKmRzdDsKQEAgLTY4NiwyNCArNzU5LDQxIEBACiAgICAgaWYgKCFvIHx8ICF0YXJnZXRfb2JqIHx8IChvLT5vZmZzZXQ8PTAgJiYgby0+dHlwZSAhPSBBVl9PUFRfVFlQRV9DT05TVCkpCiAgICAgICAgIHJldHVybiBBVkVSUk9SX09QVElPTl9OT1RfRk9VTkQ7CiAKLSAgICBkc3QgPSAodWludDhfdCopdGFyZ2V0X29iaiArIG8tPm9mZnNldDsKKyAgICBkc3QgPSAodWludDhfdCAqKXRhcmdldF9vYmogKyBvLT5vZmZzZXQ7CiAKICAgICBidWZbMF0gPSAwOwogICAgIHN3aXRjaCAoby0+dHlwZSkgewogICAgIGNhc2UgQVZfT1BUX1RZUEVfQk9PTDoKICAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVzIiwgKGNoYXIgKilhdl94X2lmX251bGwoZ2V0X2Jvb2xfbmFtZSgqKGludCAqKWRzdCksICJpbnZhbGlkIikpOwogICAgICAgICBicmVhazsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0ZMQUdTOiAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIjB4JTA4WCIsICAqKGludCAgICAqKWRzdCk7YnJlYWs7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6ICAgICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIgLCAgICAgKihpbnQgICAgKilkc3QpO2JyZWFrOwotICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6ICAgICByZXQgPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJSJQUklkNjQsICooaW50NjRfdCopZHN0KTticmVhazsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0ZMT0FUOiAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVmIiAsICAgICAqKGZsb2F0ICAqKWRzdCk7YnJlYWs7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9ET1VCTEU6ICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZiIgLCAgICAgKihkb3VibGUgKilkc3QpO2JyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxBR1M6CisgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIweCUwOFgiLCAqKGludCAqKWRzdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOgorICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWQiLCAqKGludCAqKWRzdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6CisgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlIlBSSWQ2NCwgKihpbnQ2NF90ICopZHN0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9VSU5UNjQ6CisgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlIlBSSXU2NCwgKih1aW50NjRfdCAqKWRzdCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxPQVQ6CisgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZiIsICooZmxvYXQgKilkc3QpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0RPVUJMRToKKyAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVmIiwgKihkb3VibGUgKilkc3QpOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX09QVF9UWVBFX1ZJREVPX1JBVEU6Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9SQVRJT05BTDogIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZC8lZCIsICAgKChBVlJhdGlvbmFsKilkc3QpLT5udW0sICgoQVZSYXRpb25hbCopZHN0KS0+ZGVuKTticmVhazsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0NPTlNUOiAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVmIiAsICAgICBvLT5kZWZhdWx0X3ZhbC5kYmwpO2JyZWFrOworICAgIGNhc2UgQVZfT1BUX1RZUEVfUkFUSU9OQUw6CisgICAgICAgIHJldCA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZC8lZCIsICgoQVZSYXRpb25hbCAqKWRzdCktPm51bSwgKChBVlJhdGlvbmFsICopZHN0KS0+ZGVuKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9DT05TVDoKKyAgICAgICAgcmV0ID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVmIiwgby0+ZGVmYXVsdF92YWwuZGJsKTsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICgqKHVpbnQ4X3QqKilkc3QpIHsKLSAgICAgICAgICAgICpvdXRfdmFsID0gYXZfc3RyZHVwKCoodWludDhfdCoqKWRzdCk7CisgICAgICAgIGlmICgqKHVpbnQ4X3QgKiopZHN0KSB7CisgICAgICAgICAgICAqb3V0X3ZhbCA9IGF2X3N0cmR1cCgqKHVpbnQ4X3QgKiopZHN0KTsKICAgICAgICAgfSBlbHNlIGlmIChzZWFyY2hfZmxhZ3MgJiBBVl9PUFRfQUxMT1dfTlVMTCkgewogICAgICAgICAgICAgKm91dF92YWwgPSBOVUxMOwogICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC03MTIsMjIgKzgwMiwyMiBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiAqb3V0X3ZhbCA/IDAgOiBBVkVSUk9SKEVOT01FTSk7CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9CSU5BUlk6Ci0gICAgICAgIGlmICghKih1aW50OF90KiopZHN0ICYmIChzZWFyY2hfZmxhZ3MgJiBBVl9PUFRfQUxMT1dfTlVMTCkpIHsKKyAgICAgICAgaWYgKCEqKHVpbnQ4X3QgKiopZHN0ICYmIChzZWFyY2hfZmxhZ3MgJiBBVl9PUFRfQUxMT1dfTlVMTCkpIHsKICAgICAgICAgICAgICpvdXRfdmFsID0gTlVMTDsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGxlbiA9ICooaW50KikoKCh1aW50OF90ICopZHN0KSArIHNpemVvZih1aW50OF90ICopKTsKLSAgICAgICAgaWYgKCh1aW50NjRfdClsZW4qMiArIDEgPiBJTlRfTUFYKQorICAgICAgICBsZW4gPSAqKGludCAqKSgoKHVpbnQ4X3QgKilkc3QpICsgc2l6ZW9mKHVpbnQ4X3QgKikpOworICAgICAgICBpZiAoKHVpbnQ2NF90KWxlbiAqIDIgKyAxID4gSU5UX01BWCkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7Ci0gICAgICAgIGlmICghKCpvdXRfdmFsID0gYXZfbWFsbG9jKGxlbioyICsgMSkpKQorICAgICAgICBpZiAoISgqb3V0X3ZhbCA9IGF2X21hbGxvYyhsZW4gKiAyICsgMSkpKQogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgaWYgKCFsZW4pIHsKICAgICAgICAgICAgICpvdXRfdmFsWzBdID0gJ1wwJzsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGJpbiA9ICoodWludDhfdCoqKWRzdDsKKyAgICAgICAgYmluID0gKih1aW50OF90ICoqKWRzdDsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQotICAgICAgICAgICAgc25wcmludGYoKm91dF92YWwgKyBpKjIsIDMsICIlMDJYIiwgYmluW2ldKTsKKyAgICAgICAgICAgIHNucHJpbnRmKCpvdXRfdmFsICsgaSAqIDIsIDMsICIlMDJYIiwgYmluW2ldKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFOgogICAgICAgICByZXQgPSBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJWR4JWQiLCAoKGludCAqKWRzdClbMF0sICgoaW50ICopZHN0KVsxXSk7CkBAIC03NzAsNDYgKzg2MCw0NyBAQAogICAgIGlmICghbyB8fCAhdGFyZ2V0X29iaikKICAgICAgICAgZ290byBlcnJvcjsKIAotICAgIGRzdCA9ICgodWludDhfdCopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQ7CisgICAgZHN0ID0gKCh1aW50OF90ICopdGFyZ2V0X29iaikgKyBvLT5vZmZzZXQ7CiAKICAgICBpZiAob19vdXQpICpvX291dD0gbzsKIAogICAgIHJldHVybiByZWFkX251bWJlcihvLCBkc3QsIG51bSwgZGVuLCBpbnRudW0pOwogCiBlcnJvcjoKLSAgICAqZGVuPSppbnRudW09MDsKKyAgICAqZGVuICAgID0KKyAgICAqaW50bnVtID0gMDsKICAgICByZXR1cm4gLTE7CiB9CiAKIGludCBhdl9vcHRfZ2V0X2ludCh2b2lkICpvYmosIGNvbnN0IGNoYXIgKm5hbWUsIGludCBzZWFyY2hfZmxhZ3MsIGludDY0X3QgKm91dF92YWwpCiB7CiAgICAgaW50NjRfdCBpbnRudW0gPSAxOwotICAgIGRvdWJsZSAgICAgbnVtID0gMTsKLSAgICBpbnQgICByZXQsIGRlbiA9IDE7CisgICAgZG91YmxlIG51bSA9IDE7CisgICAgaW50IHJldCwgZGVuID0gMTsKIAogICAgIGlmICgocmV0ID0gZ2V0X251bWJlcihvYmosIG5hbWUsIE5VTEwsICZudW0sICZkZW4sICZpbnRudW0sIHNlYXJjaF9mbGFncykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAqb3V0X3ZhbCA9IG51bSppbnRudW0vZGVuOworICAgICpvdXRfdmFsID0gbnVtICogaW50bnVtIC8gZGVuOwogICAgIHJldHVybiAwOwogfQogCiBpbnQgYXZfb3B0X2dldF9kb3VibGUodm9pZCAqb2JqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgc2VhcmNoX2ZsYWdzLCBkb3VibGUgKm91dF92YWwpCiB7CiAgICAgaW50NjRfdCBpbnRudW0gPSAxOwotICAgIGRvdWJsZSAgICAgbnVtID0gMTsKLSAgICBpbnQgICByZXQsIGRlbiA9IDE7CisgICAgZG91YmxlIG51bSA9IDE7CisgICAgaW50IHJldCwgZGVuID0gMTsKIAogICAgIGlmICgocmV0ID0gZ2V0X251bWJlcihvYmosIG5hbWUsIE5VTEwsICZudW0sICZkZW4sICZpbnRudW0sIHNlYXJjaF9mbGFncykpIDwgMCkKICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAqb3V0X3ZhbCA9IG51bSppbnRudW0vZGVuOworICAgICpvdXRfdmFsID0gbnVtICogaW50bnVtIC8gZGVuOwogICAgIHJldHVybiAwOwogfQogCiBpbnQgYXZfb3B0X2dldF9xKHZvaWQgKm9iaiwgY29uc3QgY2hhciAqbmFtZSwgaW50IHNlYXJjaF9mbGFncywgQVZSYXRpb25hbCAqb3V0X3ZhbCkKIHsKICAgICBpbnQ2NF90IGludG51bSA9IDE7Ci0gICAgZG91YmxlICAgICBudW0gPSAxOwotICAgIGludCAgIHJldCwgZGVuID0gMTsKKyAgICBkb3VibGUgbnVtID0gMTsKKyAgICBpbnQgcmV0LCBkZW4gPSAxOwogCiAgICAgaWYgKChyZXQgPSBnZXRfbnVtYmVyKG9iaiwgbmFtZSwgTlVMTCwgJm51bSwgJmRlbiwgJmludG51bSwgc2VhcmNoX2ZsYWdzKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtODQ5LDkgKzk0MCw5IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAKICAgICBpZiAobnVtID09IDEuMCAmJiAoaW50KWludG51bSA9PSBpbnRudW0pCi0gICAgICAgICpvdXRfdmFsID0gKEFWUmF0aW9uYWwpe2ludG51bSwgZGVufTsKKyAgICAgICAgKm91dF92YWwgPSAoQVZSYXRpb25hbCkgeyBpbnRudW0sIGRlbiB9OwogICAgIGVsc2UKLSAgICAgICAgKm91dF92YWwgPSBhdl9kMnEobnVtKmludG51bS9kZW4sIDE8PDI0KTsKKyAgICAgICAgKm91dF92YWwgPSBhdl9kMnEobnVtICogaW50bnVtIC8gZGVuLCAxIDw8IDI0KTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtMTAwMCw3ICsxMDkxLDcgQEAKIHN0YXRpYyB2b2lkIG9wdF9saXN0KHZvaWQgKm9iaiwgdm9pZCAqYXZfbG9nX29iaiwgY29uc3QgY2hhciAqdW5pdCwKICAgICAgICAgICAgICAgICAgICAgIGludCByZXFfZmxhZ3MsIGludCByZWpfZmxhZ3MpCiB7Ci0gICAgY29uc3QgQVZPcHRpb24gKm9wdD1OVUxMOworICAgIGNvbnN0IEFWT3B0aW9uICpvcHQgPSBOVUxMOwogICAgIEFWT3B0aW9uUmFuZ2VzICpyOwogICAgIGludCBpOwogCkBAIC0xMDEyLDExICsxMTAzLDExIEBACiAgICAgICAgICAqIERvbid0IHByaW50IGFueXRoaW5nIGJ1dCBDT05TVCdzIG9uIGxldmVsIHR3by4KICAgICAgICAgICogT25seSBwcmludCBpdGVtcyBmcm9tIHRoZSByZXF1ZXN0ZWQgdW5pdC4KICAgICAgICAgICovCi0gICAgICAgIGlmICghdW5pdCAmJiBvcHQtPnR5cGU9PUFWX09QVF9UWVBFX0NPTlNUKQorICAgICAgICBpZiAoIXVuaXQgJiYgb3B0LT50eXBlID09IEFWX09QVF9UWVBFX0NPTlNUKQogICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGVsc2UgaWYgKHVuaXQgJiYgb3B0LT50eXBlIT1BVl9PUFRfVFlQRV9DT05TVCkKKyAgICAgICAgZWxzZSBpZiAodW5pdCAmJiBvcHQtPnR5cGUgIT0gQVZfT1BUX1RZUEVfQ09OU1QpCiAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZWxzZSBpZiAodW5pdCAmJiBvcHQtPnR5cGU9PUFWX09QVF9UWVBFX0NPTlNUICYmIHN0cmNtcCh1bml0LCBvcHQtPnVuaXQpKQorICAgICAgICBlbHNlIGlmICh1bml0ICYmIG9wdC0+dHlwZSA9PSBBVl9PUFRfVFlQRV9DT05TVCAmJiBzdHJjbXAodW5pdCwgb3B0LT51bml0KSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICBlbHNlIGlmICh1bml0ICYmIG9wdC0+dHlwZSA9PSBBVl9PUFRfVFlQRV9DT05TVCkKICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiAgICAgJS0xNXMgIiwgb3B0LT5uYW1lKTsKQEAgLTEwMzUsNiArMTEyNiw5IEBACiAgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDY0OgogICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiUtMTJzICIsICI8aW50NjQ+Iik7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1VJTlQ2NDoKKyAgICAgICAgICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlLTEycyAiLCAiPHVpbnQ2ND4iKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOgogICAgICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiUtMTJzICIsICI8ZG91YmxlPiIpOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA4Nyw2ICsxMTgxLDcgQEAKICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJWMiLCAob3B0LT5mbGFncyAmIEFWX09QVF9GTEFHX1NVQlRJVExFX1BBUkFNKSA/ICdTJyA6ICcuJyk7CiAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiVjIiwgKG9wdC0+ZmxhZ3MgJiBBVl9PUFRfRkxBR19FWFBPUlQpICAgICAgICAgPyAnWCcgOiAnLicpOwogICAgICAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlYyIsIChvcHQtPmZsYWdzICYgQVZfT1BUX0ZMQUdfUkVBRE9OTFkpICAgICAgID8gJ1InIDogJy4nKTsKKyAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJWMiLCAob3B0LT5mbGFncyAmIEFWX09QVF9GTEFHX0JTRl9QQVJBTSkgICAgICA/ICdCJyA6ICcuJyk7CiAKICAgICAgICAgaWYgKG9wdC0+aGVscCkKICAgICAgICAgICAgIGF2X2xvZyhhdl9sb2dfb2JqLCBBVl9MT0dfSU5GTywgIiAlcyIsIG9wdC0+aGVscCk7CkBAIC0xMDk1LDYgKzExOTAsNyBAQAogICAgICAgICAgICAgc3dpdGNoIChvcHQtPnR5cGUpIHsKICAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UOgogICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfVUlOVDY0OgogICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9ET1VCTEU6CiAgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0ZMT0FUOgogICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9SQVRJT05BTDoKQEAgLTExMzksNiArMTIzNSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDoKKyAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfVUlOVDY0OgogICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDogewogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlZl9jb25zdCA9IGdldF9vcHRfY29uc3RfbmFtZShvYmosIG9wdC0+dW5pdCwgb3B0LT5kZWZhdWx0X3ZhbC5pNjQpOwogICAgICAgICAgICAgICAgIGlmIChkZWZfY29uc3QpCkBAIC0xMTc1LDkgKzEyNzIsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiXG4iKTsKLSAgICAgICAgaWYgKG9wdC0+dW5pdCAmJiBvcHQtPnR5cGUgIT0gQVZfT1BUX1RZUEVfQ09OU1QpIHsKKyAgICAgICAgaWYgKG9wdC0+dW5pdCAmJiBvcHQtPnR5cGUgIT0gQVZfT1BUX1RZUEVfQ09OU1QpCiAgICAgICAgICAgICBvcHRfbGlzdChvYmosIGF2X2xvZ19vYmosIG9wdC0+dW5pdCwgcmVxX2ZsYWdzLCByZWpfZmxhZ3MpOwotICAgICAgICB9CiAgICAgfQogfQogCkBAIC0xMTg2LDcgKzEyODIsNyBAQAogICAgIGlmICghb2JqKQogICAgICAgICByZXR1cm4gLTE7CiAKLSAgICBhdl9sb2coYXZfbG9nX29iaiwgQVZfTE9HX0lORk8sICIlcyBBVk9wdGlvbnM6XG4iLCAoKihBVkNsYXNzKiopb2JqKS0+Y2xhc3NfbmFtZSk7CisgICAgYXZfbG9nKGF2X2xvZ19vYmosIEFWX0xPR19JTkZPLCAiJXMgQVZPcHRpb25zOlxuIiwgKCooQVZDbGFzcyAqKilvYmopLT5jbGFzc19uYW1lKTsKIAogICAgIG9wdF9saXN0KG9iaiwgYXZfbG9nX29iaiwgTlVMTCwgcmVxX2ZsYWdzLCByZWpfZmxhZ3MpOwogCkBAIC0xMjEzLDExICsxMzA5LDEyIEBACiAgICAgICAgIHN3aXRjaCAob3B0LT50eXBlKSB7CiAgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0NPTlNUOgogICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSBoZXJlICovCi0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfQk9PTDoKICAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfRkxBR1M6CiAgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDoKICAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6CisgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX1VJTlQ2NDoKICAgICAgICAgICAgIGNhc2UgQVZfT1BUX1RZUEVfRFVSQVRJT046CiAgICAgICAgICAgICBjYXNlIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VUOgogICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9QSVhFTF9GTVQ6CkBAIC0xMjU1LDggKzEzNTIsOSBAQAogICAgICAgICAgICAgY2FzZSBBVl9PUFRfVFlQRV9ESUNUOgogICAgICAgICAgICAgICAgIC8qIENhbm5vdCBzZXQgZGVmYXVsdHMgZm9yIHRoZXNlIHR5cGVzICovCiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19ERUJVRywgIkFWT3B0aW9uIHR5cGUgJWQgb2Ygb3B0aW9uICVzIG5vdCBpbXBsZW1lbnRlZCB5ZXRcbiIsIG9wdC0+dHlwZSwgb3B0LT5uYW1lKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJBVk9wdGlvbiB0eXBlICVkIG9mIG9wdGlvbiAlcyBub3QgaW1wbGVtZW50ZWQgeWV0XG4iLAorICAgICAgICAgICAgICAgICAgIG9wdC0+dHlwZSwgb3B0LT5uYW1lKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTEzMzIsNyArMTQzMCw3IEBACiAgICAgcmV0dXJuIGNvdW50OwogfQogCi0jZGVmaW5lIFdISVRFU1BBQ0VTICIgXG5cdCIKKyNkZWZpbmUgV0hJVEVTUEFDRVMgIiBcblx0XHIiCiAKIHN0YXRpYyBpbnQgaXNfa2V5X2NoYXIoY2hhciBjKQogewpAQCAtMTU0Niw3ICsxNjQ0LDcgQEAKIAogdm9pZCAqYXZfb3B0X2NoaWxkX25leHQodm9pZCAqb2JqLCB2b2lkICpwcmV2KQogewotICAgIGNvbnN0IEFWQ2xhc3MgKmMgPSAqKEFWQ2xhc3MqKilvYmo7CisgICAgY29uc3QgQVZDbGFzcyAqYyA9ICooQVZDbGFzcyAqKilvYmo7CiAgICAgaWYgKGMtPmNoaWxkX25leHQpCiAgICAgICAgIHJldHVybiBjLT5jaGlsZF9uZXh0KG9iaiwgcHJldik7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNTcyLDIyICsxNjcwLDM0IEBACiAgICAgc3dpdGNoKHR5cGUpIHsKICAgICBjYXNlIEFWX09QVF9UWVBFX0JPT0w6CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ6Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9GTEFHUzogICAgIHJldHVybiBzaXplb2YoaW50KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0ZMQUdTOgorICAgICAgICByZXR1cm4gc2l6ZW9mKGludCk7CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9EVVJBVElPTjoKICAgICBjYXNlIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VUOgotICAgIGNhc2UgQVZfT1BUX1RZUEVfSU5UNjQ6ICAgICByZXR1cm4gc2l6ZW9mKGludDY0X3QpOwotICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOiAgICByZXR1cm4gc2l6ZW9mKGRvdWJsZSk7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDogICAgIHJldHVybiBzaXplb2YoZmxvYXQpOwotICAgIGNhc2UgQVZfT1BUX1RZUEVfU1RSSU5HOiAgICByZXR1cm4gc2l6ZW9mKHVpbnQ4X3QqKTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDY0OgorICAgIGNhc2UgQVZfT1BUX1RZUEVfVUlOVDY0OgorICAgICAgICByZXR1cm4gc2l6ZW9mKGludDY0X3QpOworICAgIGNhc2UgQVZfT1BUX1RZUEVfRE9VQkxFOgorICAgICAgICByZXR1cm4gc2l6ZW9mKGRvdWJsZSk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9GTE9BVDoKKyAgICAgICAgcmV0dXJuIHNpemVvZihmbG9hdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiBzaXplb2YodWludDhfdCopOwogICAgIGNhc2UgQVZfT1BUX1RZUEVfVklERU9fUkFURToKLSAgICBjYXNlIEFWX09QVF9UWVBFX1JBVElPTkFMOiAgcmV0dXJuIHNpemVvZihBVlJhdGlvbmFsKTsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0JJTkFSWTogICAgcmV0dXJuIHNpemVvZih1aW50OF90KikgKyBzaXplb2YoaW50KTsKLSAgICBjYXNlIEFWX09QVF9UWVBFX0lNQUdFX1NJWkU6cmV0dXJuIHNpemVvZihpbnRbMl0pOwotICAgIGNhc2UgQVZfT1BUX1RZUEVfUElYRUxfRk1UOiByZXR1cm4gc2l6ZW9mKGVudW0gQVZQaXhlbEZvcm1hdCk7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9TQU1QTEVfRk1UOnJldHVybiBzaXplb2YoZW51bSBBVlNhbXBsZUZvcm1hdCk7Ci0gICAgY2FzZSBBVl9PUFRfVFlQRV9DT0xPUjogICAgIHJldHVybiA0OworICAgIGNhc2UgQVZfT1BUX1RZUEVfUkFUSU9OQUw6CisgICAgICAgIHJldHVybiBzaXplb2YoQVZSYXRpb25hbCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9CSU5BUlk6CisgICAgICAgIHJldHVybiBzaXplb2YodWludDhfdCopICsgc2l6ZW9mKGludCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFOgorICAgICAgICByZXR1cm4gc2l6ZW9mKGludFsyXSk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9QSVhFTF9GTVQ6CisgICAgICAgIHJldHVybiBzaXplb2YoZW51bSBBVlBpeGVsRm9ybWF0KTsKKyAgICBjYXNlIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQ6CisgICAgICAgIHJldHVybiBzaXplb2YoZW51bSBBVlNhbXBsZUZvcm1hdCk7CisgICAgY2FzZSBBVl9PUFRfVFlQRV9DT0xPUjoKKyAgICAgICAgcmV0dXJuIDQ7CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiB9CiAKIGludCBhdl9vcHRfY29weSh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYykKQEAgLTE1OTcsMTcgKzE3MDcsMTcgQEAKICAgICBpbnQgcmV0ID0gMDsKIAogICAgIGlmICghc3JjKQotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIAotICAgIGMgPSAqKEFWQ2xhc3MqKilzcmM7Ci0gICAgaWYgKCooQVZDbGFzcyoqKWRzdCAmJiBjICE9ICooQVZDbGFzcyoqKWRzdCkKKyAgICBjID0gKihBVkNsYXNzICoqKXNyYzsKKyAgICBpZiAoIWMgfHwgYyAhPSAqKEFWQ2xhc3MgKiopZHN0KQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCiAgICAgd2hpbGUgKChvID0gYXZfb3B0X25leHQoc3JjLCBvKSkpIHsKLSAgICAgICAgdm9pZCAqZmllbGRfZHN0ID0gKCh1aW50OF90Kilkc3QpICsgby0+b2Zmc2V0OwotICAgICAgICB2b2lkICpmaWVsZF9zcmMgPSAoKHVpbnQ4X3QqKXNyYykgKyBvLT5vZmZzZXQ7Ci0gICAgICAgIHVpbnQ4X3QgKipmaWVsZF9kc3Q4ID0gKHVpbnQ4X3QqKilmaWVsZF9kc3Q7Ci0gICAgICAgIHVpbnQ4X3QgKipmaWVsZF9zcmM4ID0gKHVpbnQ4X3QqKilmaWVsZF9zcmM7CisgICAgICAgIHZvaWQgKmZpZWxkX2RzdCA9ICh1aW50OF90ICopZHN0ICsgby0+b2Zmc2V0OworICAgICAgICB2b2lkICpmaWVsZF9zcmMgPSAodWludDhfdCAqKXNyYyArIG8tPm9mZnNldDsKKyAgICAgICAgdWludDhfdCAqKmZpZWxkX2RzdDggPSAodWludDhfdCAqKilmaWVsZF9kc3Q7CisgICAgICAgIHVpbnQ4X3QgKipmaWVsZF9zcmM4ID0gKHVpbnQ4X3QgKiopZmllbGRfc3JjOwogCiAgICAgICAgIGlmIChvLT50eXBlID09IEFWX09QVF9UWVBFX1NUUklORykgewogICAgICAgICAgICAgaWYgKCpmaWVsZF9kc3Q4ICE9ICpmaWVsZF9zcmM4KQpAQCAtMTYxNiw3ICsxNzI2LDcgQEAKICAgICAgICAgICAgIGlmICgqZmllbGRfc3JjOCAmJiAhKmZpZWxkX2RzdDgpCiAgICAgICAgICAgICAgICAgcmV0ID0gQVZFUlJPUihFTk9NRU0pOwogICAgICAgICB9IGVsc2UgaWYgKG8tPnR5cGUgPT0gQVZfT1BUX1RZUEVfQklOQVJZKSB7Ci0gICAgICAgICAgICBpbnQgbGVuID0gKihpbnQqKShmaWVsZF9zcmM4ICsgMSk7CisgICAgICAgICAgICBpbnQgbGVuID0gKihpbnQgKikoZmllbGRfc3JjOCArIDEpOwogICAgICAgICAgICAgaWYgKCpmaWVsZF9kc3Q4ICE9ICpmaWVsZF9zcmM4KQogICAgICAgICAgICAgICAgIGF2X2ZyZWVwKGZpZWxkX2RzdDgpOwogICAgICAgICAgICAgKmZpZWxkX2RzdDggPSBhdl9tZW1kdXAoKmZpZWxkX3NyYzgsIGxlbik7CkBAIC0xNjI0LDcgKzE3MzQsNyBAQAogICAgICAgICAgICAgICAgIHJldCA9IEFWRVJST1IoRU5PTUVNKTsKICAgICAgICAgICAgICAgICBsZW4gPSAwOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgKihpbnQqKShmaWVsZF9kc3Q4ICsgMSkgPSBsZW47CisgICAgICAgICAgICAqKGludCAqKShmaWVsZF9kc3Q4ICsgMSkgPSBsZW47CiAgICAgICAgIH0gZWxzZSBpZiAoby0+dHlwZSA9PSBBVl9PUFRfVFlQRV9DT05TVCkgewogICAgICAgICAgICAgLy8gZG8gbm90aGluZwogICAgICAgICB9IGVsc2UgaWYgKG8tPnR5cGUgPT0gQVZfT1BUX1RZUEVfRElDVCkgewpAQCAtMTYzNyw3ICsxNzQ3LDExIEBACiAgICAgICAgICAgICBpZiAoYXZfZGljdF9jb3VudCgqc2RpY3QpICE9IGF2X2RpY3RfY291bnQoKmRkaWN0KSkKICAgICAgICAgICAgICAgICByZXQgPSBBVkVSUk9SKEVOT01FTSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZW1jcHkoZmllbGRfZHN0LCBmaWVsZF9zcmMsIG9wdF9zaXplKG8tPnR5cGUpKTsKKyAgICAgICAgICAgIGludCBzaXplID0gb3B0X3NpemUoby0+dHlwZSk7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDApCisgICAgICAgICAgICAgICAgcmV0ID0gc2l6ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtZW1jcHkoZmllbGRfZHN0LCBmaWVsZF9zcmMsIHNpemUpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CkBAIC0xNjkxLDYgKzE4MDUsNyBAQAogICAgIGNhc2UgQVZfT1BUX1RZUEVfQk9PTDoKICAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDoKICAgICBjYXNlIEFWX09QVF9UWVBFX0lOVDY0OgorICAgIGNhc2UgQVZfT1BUX1RZUEVfVUlOVDY0OgogICAgIGNhc2UgQVZfT1BUX1RZUEVfUElYRUxfRk1UOgogICAgIGNhc2UgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVDoKICAgICBjYXNlIEFWX09QVF9UWVBFX0ZMT0FUOgpAQCAtMTc4MCw2ICsxODk1LDcgQEAKICAgICBjYXNlIEFWX09QVF9UWVBFX0NIQU5ORUxfTEFZT1VUOgogICAgIGNhc2UgQVZfT1BUX1RZUEVfRFVSQVRJT046CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9JTlQ2NDoKKyAgICBjYXNlIEFWX09QVF9UWVBFX1VJTlQ2NDoKICAgICAgICAgcmVhZF9udW1iZXIobywgZHN0LCBOVUxMLCBOVUxMLCAmaTY0KTsKICAgICAgICAgcmV0dXJuIG8tPmRlZmF1bHRfdmFsLmk2NCA9PSBpNjQ7CiAgICAgY2FzZSBBVl9PUFRfVFlQRV9TVFJJTkc6CkBAIC0xOTA4LDI5MSArMjAyNCwzIEBACiAgICAgYXZfYnByaW50X2ZpbmFsaXplKCZicHJpbnQsIGJ1ZmZlcik7CiAgICAgcmV0dXJuIDA7CiB9Ci0KLSNpZmRlZiBURVNUCi0KLXR5cGVkZWYgc3RydWN0IFRlc3RDb250ZXh0Ci17Ci0gICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7Ci0gICAgaW50IG51bTsKLSAgICBpbnQgdG9nZ2xlOwotICAgIGNoYXIgKnN0cmluZzsKLSAgICBpbnQgZmxhZ3M7Ci0gICAgQVZSYXRpb25hbCByYXRpb25hbDsKLSAgICBBVlJhdGlvbmFsIHZpZGVvX3JhdGU7Ci0gICAgaW50IHcsIGg7Ci0gICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7Ci0gICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10OwotICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgdWludDhfdCBjb2xvcls0XTsKLSAgICBpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OwotICAgIHZvaWQgKmJpbmFyeTsKLSAgICBpbnQgYmluYXJ5X3NpemU7Ci0gICAgdm9pZCAqYmluYXJ5MTsKLSAgICBpbnQgYmluYXJ5X3NpemUxOwotICAgIHZvaWQgKmJpbmFyeTI7Ci0gICAgaW50IGJpbmFyeV9zaXplMjsKLSAgICBpbnQ2NF90IG51bTY0OwotICAgIGZsb2F0IGZsdDsKLSAgICBkb3VibGUgZGJsOwotICAgIGNoYXIgKmVzY2FwZTsKLSAgICBpbnQgYm9vbDE7Ci0gICAgaW50IGJvb2wyOwotICAgIGludCBib29sMzsKLX0gVGVzdENvbnRleHQ7Ci0KLSNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRlc3RDb250ZXh0LCB4KQotCi0jZGVmaW5lIFRFU1RfRkxBR19DT09MIDAxCi0jZGVmaW5lIFRFU1RfRkxBR19MQU1FIDAyCi0jZGVmaW5lIFRFU1RfRkxBR19NVSAgIDA0Ci0KLXN0YXRpYyBjb25zdCBBVk9wdGlvbiB0ZXN0X29wdGlvbnNbXT0gewoteyJudW0iLCAgICAgICJzZXQgbnVtIiwgICAgICAgIE9GRlNFVChudW0pLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2NCA9IDB9LCAgICAgICAwLCAgICAgICAgMTAwLCAxICAgICAgICAgICAgICB9LAoteyJ0b2dnbGUiLCAgICJzZXQgdG9nZ2xlIiwgICAgIE9GRlNFVCh0b2dnbGUpLCAgIEFWX09QVF9UWVBFX0lOVCwgICAgICB7Lmk2NCA9IDF9LCAgICAgICAwLCAgICAgICAgMSwgICAxICAgICAgICAgICAgICB9LAoteyJyYXRpb25hbCIsICJzZXQgcmF0aW9uYWwiLCAgIE9GRlNFVChyYXRpb25hbCksIEFWX09QVF9UWVBFX1JBVElPTkFMLCB7LmRibCA9IDF9LCAgICAgICAwLCAgICAgICAgMTAsICAxICAgICAgICAgICAgICB9LAoteyJzdHJpbmciLCAgICJzZXQgc3RyaW5nIiwgICAgIE9GRlNFVChzdHJpbmcpLCAgIEFWX09QVF9UWVBFX1NUUklORywgICB7LnN0ciA9ICJkZWZhdWx0In0sIENIQVJfTUlOLCBDSEFSX01BWCwgMSAgICAgICB9LAoteyJlc2NhcGUiLCAgICJzZXQgZXNjYXBlIHN0ciIsIE9GRlNFVChlc2NhcGUpLCAgIEFWX09QVF9UWVBFX1NUUklORywgICB7LnN0ciA9ICJcXD0sIn0sIENIQVJfTUlOLCBDSEFSX01BWCwgMSAgICAgICAgICB9LAoteyJmbGFncyIsICAgICJzZXQgZmxhZ3MiLCAgICAgIE9GRlNFVChmbGFncyksICAgIEFWX09QVF9UWVBFX0ZMQUdTLCAgICB7Lmk2NCA9IDF9LCAgICAgICAwLCAgICAgICAgSU5UX01BWCwgMSwgImZsYWdzIiB9LAoteyJjb29sIiwgICAgICJzZXQgY29vbCBmbGFnIiwgIDAsICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgICB7Lmk2NCA9IFRFU1RfRkxBR19DT09MfSwgSU5UX01JTiwgIElOVF9NQVgsIDEsICJmbGFncyIgfSwKLXsibGFtZSIsICAgICAic2V0IGxhbWUgZmxhZyIsICAwLCAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICAgey5pNjQgPSBURVNUX0ZMQUdfTEFNRX0sIElOVF9NSU4sICBJTlRfTUFYLCAxLCAiZmxhZ3MiIH0sCi17Im11IiwgICAgICAgInNldCBtdSBmbGFnIiwgICAgMCwgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgIHsuaTY0ID0gVEVTVF9GTEFHX01VfSwgICBJTlRfTUlOLCAgSU5UX01BWCwgMSwgImZsYWdzIiB9LAoteyJzaXplIiwgICAgICJzZXQgc2l6ZSIsICAgICAgIE9GRlNFVCh3KSwgICAgICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsey5zdHI9IjIwMHgzMDAifSwgICAgICAgICAgICAgMCwgICAgICAgIDAsIDF9LAoteyJwaXhfZm10IiwgICJzZXQgcGl4Zm10IiwgICAgIE9GRlNFVChwaXhfZm10KSwgIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCwgey5pNjQgPSBBVl9QSVhfRk1UXzBCR1J9LCAtMSwgSU5UX01BWCwgMX0sCi17InNhbXBsZV9mbXQiLCAic2V0IHNhbXBsZWZtdCIsIE9GRlNFVChzYW1wbGVfZm10KSwgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVCwgey5pNjQgPSBBVl9TQU1QTEVfRk1UX1MxNn0sIC0xLCBJTlRfTUFYLCAxfSwKLXsidmlkZW9fcmF0ZSIsICJzZXQgdmlkZW9yYXRlIiwgT0ZGU0VUKHZpZGVvX3JhdGUpLCBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCAgey5zdHIgPSAiMjUifSwgMCwgICAgIDAgICAgICAgICAgICAgICAgICAgLCAxfSwKLXsiZHVyYXRpb24iLCAic2V0IGR1cmF0aW9uIiwgICBPRkZTRVQoZHVyYXRpb24pLCBBVl9PUFRfVFlQRV9EVVJBVElPTiwgey5pNjQgPSAxMDAwfSwgMCwgSU5UNjRfTUFYLCAxfSwKLXsiY29sb3IiLCAic2V0IGNvbG9yIiwgICBPRkZTRVQoY29sb3IpLCBBVl9PUFRfVFlQRV9DT0xPUiwgey5zdHIgPSAicGluayJ9LCAwLCAwLCAxfSwKLXsiY2wiLCAic2V0IGNoYW5uZWwgbGF5b3V0IiwgT0ZGU0VUKGNoYW5uZWxfbGF5b3V0KSwgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQsIHsuaTY0ID0gQVZfQ0hfTEFZT1VUX0hFWEFHT05BTH0sIDAsIElOVDY0X01BWCwgMX0sCi17ImJpbiIsICJzZXQgYmluYXJ5IHZhbHVlIiwgICAgT0ZGU0VUKGJpbmFyeSksICAgQVZfT1BUX1RZUEVfQklOQVJZLCAgIHsuc3RyPSI2MjY5NmUwMCJ9LCAwLCAgICAgICAgMCwgMSB9LAoteyJiaW4xIiwgInNldCBiaW5hcnkgdmFsdWUiLCAgIE9GRlNFVChiaW5hcnkxKSwgIEFWX09QVF9UWVBFX0JJTkFSWSwgICB7LnN0cj1OVUxMfSwgICAgICAgMCwgICAgICAgIDAsIDEgfSwKLXsiYmluMiIsICJzZXQgYmluYXJ5IHZhbHVlIiwgICBPRkZTRVQoYmluYXJ5MiksICBBVl9PUFRfVFlQRV9CSU5BUlksICAgey5zdHI9IiJ9LCAgICAgICAgIDAsICAgICAgICAwLCAxIH0sCi17Im51bTY0IiwgICAgInNldCBudW0gNjRiaXQiLCAgT0ZGU0VUKG51bTY0KSwgICAgQVZfT1BUX1RZUEVfSU5UNjQsICAgIHsuaTY0ID0gMX0sICAgICAgICAwLCAgICAgICAgMTAwLCAxIH0sCi17ImZsdCIsICAgICAgInNldCBmbG9hdCIsICAgICAgT0ZGU0VUKGZsdCksICAgICAgQVZfT1BUX1RZUEVfRkxPQVQsICAgIHsuZGJsID0gMS4wLzN9LCAgICAwLCAgICAgICAgMTAwLCAxfSwKLXsiZGJsIiwgICAgICAic2V0IGRvdWJsZSIsICAgICBPRkZTRVQoZGJsKSwgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICAgey5kYmwgPSAxLjAvM30sICAgIDAsICAgICAgICAxMDAsIDEgfSwKLXsiYm9vbDEiLCAic2V0IGJvb2xlYW4gdmFsdWUiLCAgT0ZGU0VUKGJvb2wxKSwgICBBVl9PUFRfVFlQRV9CT09MLCAgICAgey5pNjQgPSAtMX0sICAgICAgLTEsICAgICAgICAxLCAxIH0sCi17ImJvb2wyIiwgInNldCBib29sZWFuIHZhbHVlIiwgIE9GRlNFVChib29sMiksICAgQVZfT1BUX1RZUEVfQk9PTCwgICAgIHsuaTY0ID0gMX0sICAgICAgIC0xLCAgICAgICAgMSwgMSB9LAoteyJib29sMyIsICJzZXQgYm9vbGVhbiB2YWx1ZSIsICBPRkZTRVQoYm9vbDMpLCAgIEFWX09QVF9UWVBFX0JPT0wsICAgICB7Lmk2NCA9IDB9LCAgICAgICAgMCwgICAgICAgIDEsIDEgfSwKLXtOVUxMfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICp0ZXN0X2dldF9uYW1lKHZvaWQgKmN0eCkKLXsKLSAgICByZXR1cm4gInRlc3QiOwotfQotCi1zdGF0aWMgY29uc3QgQVZDbGFzcyB0ZXN0X2NsYXNzID0gewotICAgICJUZXN0Q29udGV4dCIsCi0gICAgdGVzdF9nZXRfbmFtZSwKLSAgICB0ZXN0X29wdGlvbnMKLX07Ci0KLXN0YXRpYyB2b2lkIGxvZ19jYWxsYmFja19oZWxwKHZvaWQgKnB0ciwgaW50IGxldmVsLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgdmwpCi17Ci0gICAgdmZwcmludGYoc3Rkb3V0LCBmbXQsIHZsKTsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgaTsKLQotICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKLSAgICBhdl9sb2dfc2V0X2NhbGxiYWNrKGxvZ19jYWxsYmFja19oZWxwKTsKLQotICAgIHByaW50ZigiVGVzdGluZyBkZWZhdWx0IHZhbHVlc1xuIik7Ci0gICAgewotICAgICAgICBUZXN0Q29udGV4dCB0ZXN0X2N0eCA9IHsgMCB9OwotICAgICAgICB0ZXN0X2N0eC5jbGFzcyA9ICZ0ZXN0X2NsYXNzOwotICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKCZ0ZXN0X2N0eCk7Ci0KLSAgICAgICAgcHJpbnRmKCJudW09JWRcbiIsIHRlc3RfY3R4Lm51bSk7Ci0gICAgICAgIHByaW50ZigidG9nZ2xlPSVkXG4iLCB0ZXN0X2N0eC50b2dnbGUpOwotICAgICAgICBwcmludGYoInN0cmluZz0lc1xuIiwgdGVzdF9jdHguc3RyaW5nKTsKLSAgICAgICAgcHJpbnRmKCJlc2NhcGU9JXNcbiIsIHRlc3RfY3R4LmVzY2FwZSk7Ci0gICAgICAgIHByaW50ZigiZmxhZ3M9JWRcbiIsIHRlc3RfY3R4LmZsYWdzKTsKLSAgICAgICAgcHJpbnRmKCJyYXRpb25hbD0lZC8lZFxuIiwgdGVzdF9jdHgucmF0aW9uYWwubnVtLCB0ZXN0X2N0eC5yYXRpb25hbC5kZW4pOwotICAgICAgICBwcmludGYoInZpZGVvX3JhdGU9JWQvJWRcbiIsIHRlc3RfY3R4LnZpZGVvX3JhdGUubnVtLCB0ZXN0X2N0eC52aWRlb19yYXRlLmRlbik7Ci0gICAgICAgIHByaW50Zigid2lkdGg9JWQgaGVpZ2h0PSVkXG4iLCB0ZXN0X2N0eC53LCB0ZXN0X2N0eC5oKTsKLSAgICAgICAgcHJpbnRmKCJwaXhfZm10PSVzXG4iLCBhdl9nZXRfcGl4X2ZtdF9uYW1lKHRlc3RfY3R4LnBpeF9mbXQpKTsKLSAgICAgICAgcHJpbnRmKCJzYW1wbGVfZm10PSVzXG4iLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKHRlc3RfY3R4LnNhbXBsZV9mbXQpKTsKLSAgICAgICAgcHJpbnRmKCJkdXJhdGlvbj0lIlBSSWQ2NCJcbiIsIHRlc3RfY3R4LmR1cmF0aW9uKTsKLSAgICAgICAgcHJpbnRmKCJjb2xvcj0lZCAlZCAlZCAlZFxuIiwgdGVzdF9jdHguY29sb3JbMF0sIHRlc3RfY3R4LmNvbG9yWzFdLCB0ZXN0X2N0eC5jb2xvclsyXSwgdGVzdF9jdHguY29sb3JbM10pOwotICAgICAgICBwcmludGYoImNoYW5uZWxfbGF5b3V0PSUiUFJJZDY0Ij0lIlBSSWQ2NCJcbiIsIHRlc3RfY3R4LmNoYW5uZWxfbGF5b3V0LCAoaW50NjRfdClBVl9DSF9MQVlPVVRfSEVYQUdPTkFMKTsKLSAgICAgICAgaWYgKHRlc3RfY3R4LmJpbmFyeSkKLSAgICAgICAgICAgIHByaW50ZigiYmluYXJ5PSV4ICV4ICV4ICV4XG4iLCAoKHVpbnQ4X3QqKXRlc3RfY3R4LmJpbmFyeSlbMF0sICgodWludDhfdCopdGVzdF9jdHguYmluYXJ5KVsxXSwgKCh1aW50OF90Kil0ZXN0X2N0eC5iaW5hcnkpWzJdLCAoKHVpbnQ4X3QqKXRlc3RfY3R4LmJpbmFyeSlbM10pOwotICAgICAgICBwcmludGYoImJpbmFyeV9zaXplPSVkXG4iLCB0ZXN0X2N0eC5iaW5hcnlfc2l6ZSk7Ci0gICAgICAgIHByaW50ZigibnVtNjQ9JSJQUklkNjQiXG4iLCB0ZXN0X2N0eC5udW02NCk7Ci0gICAgICAgIHByaW50ZigiZmx0PSUuNmZcbiIsIHRlc3RfY3R4LmZsdCk7Ci0gICAgICAgIHByaW50ZigiZGJsPSUuNmZcbiIsIHRlc3RfY3R4LmRibCk7Ci0KLSAgICAgICAgYXZfb3B0X3Nob3cyKCZ0ZXN0X2N0eCwgTlVMTCwgLTEsIDApOwotCi0gICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7Ci0gICAgfQotCi0gICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfb3B0X2lzX3NldF90b19kZWZhdWx0KClcbiIpOwotICAgIHsKLSAgICAgICAgaW50IHJldDsKLSAgICAgICAgVGVzdENvbnRleHQgdGVzdF9jdHggPSB7IDAgfTsKLSAgICAgICAgY29uc3QgQVZPcHRpb24gKm8gPSBOVUxMOwotICAgICAgICB0ZXN0X2N0eC5jbGFzcyA9ICZ0ZXN0X2NsYXNzOwotCi0gICAgICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX1FVSUVUKTsKLQotICAgICAgICB3aGlsZSAobyA9IGF2X29wdF9uZXh0KCZ0ZXN0X2N0eCwgbykpIHsKLSAgICAgICAgICAgIHJldCA9IGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdF9ieV9uYW1lKCZ0ZXN0X2N0eCwgby0+bmFtZSwgMCk7Ci0gICAgICAgICAgICBwcmludGYoIm5hbWU6JTEwcyBkZWZhdWx0OiVkIGVycm9yOiVzXG4iLCBvLT5uYW1lLCAhIXJldCwgcmV0IDwgMCA/IGF2X2VycjJzdHIocmV0KSA6ICIiKTsKLSAgICAgICAgfQotICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKCZ0ZXN0X2N0eCk7Ci0gICAgICAgIHdoaWxlIChvID0gYXZfb3B0X25leHQoJnRlc3RfY3R4LCBvKSkgewotICAgICAgICAgICAgcmV0ID0gYXZfb3B0X2lzX3NldF90b19kZWZhdWx0X2J5X25hbWUoJnRlc3RfY3R4LCBvLT5uYW1lLCAwKTsKLSAgICAgICAgICAgIHByaW50ZigibmFtZTolMTBzIGRlZmF1bHQ6JWQgZXJyb3I6JXNcbiIsIG8tPm5hbWUsICEhcmV0LCByZXQgPCAwID8gYXZfZXJyMnN0cihyZXQpIDogIiIpOwotICAgICAgICB9Ci0gICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7Ci0gICAgfQotCi0gICAgcHJpbnRmKCJcblRlc3QgYXZfb3B0X3NlcmlhbGl6ZSgpXG4iKTsKLSAgICB7Ci0gICAgICAgIFRlc3RDb250ZXh0IHRlc3RfY3R4ID0geyAwIH07Ci0gICAgICAgIGNoYXIgKmJ1ZjsKLSAgICAgICAgdGVzdF9jdHguY2xhc3MgPSAmdGVzdF9jbGFzczsKLQotICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19RVUlFVCk7Ci0KLSAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cygmdGVzdF9jdHgpOwotICAgICAgICBpZiAoYXZfb3B0X3NlcmlhbGl6ZSgmdGVzdF9jdHgsIDAsIDAsICZidWYsICc9JywgJywnKSA+PSAwKSB7Ci0gICAgICAgICAgICBwcmludGYoIiVzXG4iLCBidWYpOwotICAgICAgICAgICAgYXZfb3B0X2ZyZWUoJnRlc3RfY3R4KTsKLSAgICAgICAgICAgIG1lbXNldCgmdGVzdF9jdHgsIDAsIHNpemVvZih0ZXN0X2N0eCkpOwotICAgICAgICAgICAgdGVzdF9jdHguY2xhc3MgPSAmdGVzdF9jbGFzczsKLSAgICAgICAgICAgIGF2X3NldF9vcHRpb25zX3N0cmluZygmdGVzdF9jdHgsIGJ1ZiwgIj0iLCAiLCIpOwotICAgICAgICAgICAgYXZfZnJlZShidWYpOwotICAgICAgICAgICAgaWYgKGF2X29wdF9zZXJpYWxpemUoJnRlc3RfY3R4LCAwLCAwLCAmYnVmLCAnPScsICcsJykgPj0gMCkgewotICAgICAgICAgICAgICAgIHByaW50ZigiJXNcbiIsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgYXZfZnJlZShidWYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7Ci0gICAgfQotCi0gICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfc2V0X29wdGlvbnNfc3RyaW5nKClcbiIpOwotICAgIHsKLSAgICAgICAgVGVzdENvbnRleHQgdGVzdF9jdHggPSB7IDAgfTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvcHRpb25zW10gPSB7Ci0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICI6IiwKLSAgICAgICAgICAgICI9IiwKLSAgICAgICAgICAgICJmb289OiIsCi0gICAgICAgICAgICAiOj1mb28iLAotICAgICAgICAgICAgIj1mb28iLAotICAgICAgICAgICAgImZvbz0iLAotICAgICAgICAgICAgImZvbyIsCi0gICAgICAgICAgICAiZm9vPXZhbCIsCi0gICAgICAgICAgICAiZm9vPT12YWwiLAotICAgICAgICAgICAgInRvZ2dsZT06IiwKLSAgICAgICAgICAgICJzdHJpbmc9OiIsCi0gICAgICAgICAgICAidG9nZ2xlPTEgOiBmb28iLAotICAgICAgICAgICAgInRvZ2dsZT0xMDAiLAotICAgICAgICAgICAgInRvZ2dsZT09MSIsCi0gICAgICAgICAgICAiZmxhZ3M9K211LWxhbWUgOiBudW09NDI6IHRvZ2dsZT0wIiwKLSAgICAgICAgICAgICJudW09NDIgOiBzdHJpbmc9YmxhaGJsYWgiLAotICAgICAgICAgICAgInJhdGlvbmFsPTAgOiByYXRpb25hbD0xLzIgOiByYXRpb25hbD0xLy0xIiwKLSAgICAgICAgICAgICJyYXRpb25hbD0tMS8wIiwKLSAgICAgICAgICAgICJzaXplPTEwMjR4NzY4IiwKLSAgICAgICAgICAgICJzaXplPXBhbCIsCi0gICAgICAgICAgICAic2l6ZT1ib2d1cyIsCi0gICAgICAgICAgICAicGl4X2ZtdD15dXY0MjBwIiwKLSAgICAgICAgICAgICJwaXhfZm10PTIiLAotICAgICAgICAgICAgInBpeF9mbXQ9Ym9ndXMiLAotICAgICAgICAgICAgInNhbXBsZV9mbXQ9czE2IiwKLSAgICAgICAgICAgICJzYW1wbGVfZm10PTIiLAotICAgICAgICAgICAgInNhbXBsZV9mbXQ9Ym9ndXMiLAotICAgICAgICAgICAgInZpZGVvX3JhdGU9cGFsIiwKLSAgICAgICAgICAgICJ2aWRlb19yYXRlPTI1IiwKLSAgICAgICAgICAgICJ2aWRlb19yYXRlPTMwMDAwLzEwMDEiLAotICAgICAgICAgICAgInZpZGVvX3JhdGU9MzAvMS4wMDEiLAotICAgICAgICAgICAgInZpZGVvX3JhdGU9Ym9ndXMiLAotICAgICAgICAgICAgImR1cmF0aW9uPWJvZ3VzIiwKLSAgICAgICAgICAgICJkdXJhdGlvbj0xMjMuNDUiLAotICAgICAgICAgICAgImR1cmF0aW9uPTFcXDoyM1xcOjQ1LjY3IiwKLSAgICAgICAgICAgICJjb2xvcj1ibHVlIiwKLSAgICAgICAgICAgICJjb2xvcj0weDIyMzMwMCIsCi0gICAgICAgICAgICAiY29sb3I9MHg0MkZGMDdBQSIsCi0gICAgICAgICAgICAiY2w9c3RlcmVvK2Rvd25taXgiLAotICAgICAgICAgICAgImNsPWZvbyIsCi0gICAgICAgICAgICAiYmluPWJvZ3VzcyIsCi0gICAgICAgICAgICAiYmluPTExMSIsCi0gICAgICAgICAgICAiYmluPWZmZmYiLAotICAgICAgICAgICAgIm51bTY0PWJvZ3VzIiwKLSAgICAgICAgICAgICJudW02ND00NCIsCi0gICAgICAgICAgICAibnVtNjQ9NDQuNCIsCi0gICAgICAgICAgICAibnVtNjQ9LTEiLAotICAgICAgICAgICAgIm51bTY0PTEwMSIsCi0gICAgICAgICAgICAiZmx0PWJvZ3VzIiwKLSAgICAgICAgICAgICJmbHQ9MiIsCi0gICAgICAgICAgICAiZmx0PTIuMiIsCi0gICAgICAgICAgICAiZmx0PS0xIiwKLSAgICAgICAgICAgICJmbHQ9MTAxIiwKLSAgICAgICAgICAgICJkYmw9Ym9ndXMiLAotICAgICAgICAgICAgImRibD0yIiwKLSAgICAgICAgICAgICJkYmw9Mi4yIiwKLSAgICAgICAgICAgICJkYmw9LTEiLAotICAgICAgICAgICAgImRibD0xMDEiLAotICAgICAgICAgICAgImJvb2wxPXRydWUiLAotICAgICAgICAgICAgImJvb2wyPWF1dG8iLAotICAgICAgICB9OwotCi0gICAgICAgIHRlc3RfY3R4LmNsYXNzID0gJnRlc3RfY2xhc3M7Ci0gICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMoJnRlc3RfY3R4KTsKLQotICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19RVUlFVCk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBGRl9BUlJBWV9FTEVNUyhvcHRpb25zKTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQgc2lsZW5jZV9sb2cgPSAhc3RyY21wKG9wdGlvbnNbaV0sICJyYXRpb25hbD0tMS8wIik7IC8vIGluZiBmb3JtYXRpbmcgZGlmZmVycyBiZXR3ZWVuIHBsYXRmb3JtcwotICAgICAgICAgICAgYXZfbG9nKCZ0ZXN0X2N0eCwgQVZfTE9HX0RFQlVHLCAiU2V0dGluZyBvcHRpb25zIHN0cmluZyAnJXMnXG4iLCBvcHRpb25zW2ldKTsKLSAgICAgICAgICAgIGlmIChzaWxlbmNlX2xvZykKLSAgICAgICAgICAgICAgICBhdl9sb2dfc2V0X2NhbGxiYWNrKE5VTEwpOwotICAgICAgICAgICAgaWYgKGF2X3NldF9vcHRpb25zX3N0cmluZygmdGVzdF9jdHgsIG9wdGlvbnNbaV0sICI9IiwgIjoiKSA8IDApCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciAnJXMnXG4iLCBvcHRpb25zW2ldKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIk9LICAgICclcydcbiIsIG9wdGlvbnNbaV0pOwotICAgICAgICAgICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfaGVscCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfb3B0X2ZyZWUoJnRlc3RfY3R4KTsKLSAgICB9Ci0KLSAgICBwcmludGYoIlxuVGVzdGluZyBhdl9vcHRfc2V0X2Zyb21fc3RyaW5nKClcbiIpOwotICAgIHsKLSAgICAgICAgVGVzdENvbnRleHQgdGVzdF9jdHggPSB7IDAgfTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBvcHRpb25zW10gPSB7Ci0gICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICI1IiwKLSAgICAgICAgICAgICI1OmhlbGxvIiwKLSAgICAgICAgICAgICI1OmhlbGxvOnNpemU9cGFsIiwKLSAgICAgICAgICAgICI1OnNpemU9cGFsOmhlbGxvIiwKLSAgICAgICAgICAgICI6IiwKLSAgICAgICAgICAgICI9IiwKLSAgICAgICAgICAgICIgNSA6IGhlbGxvIDogc2l6ZSA9IHBhbCAiLAotICAgICAgICAgICAgImFfdmVyeV9sb25nX29wdGlvbl9uYW1lX3RoYXRfd2lsbF9uZWVkX3RvX2JlX2VsbGlwc2l6ZWRfYXJvdW5kX2hlcmU9NDIiCi0gICAgICAgIH07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc2hvcnRoYW5kW10gPSB7ICJudW0iLCAic3RyaW5nIiwgTlVMTCB9OwotCi0gICAgICAgIHRlc3RfY3R4LmNsYXNzID0gJnRlc3RfY2xhc3M7Ci0gICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMoJnRlc3RfY3R4KTsKLQotICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19RVUlFVCk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBGRl9BUlJBWV9FTEVNUyhvcHRpb25zKTsgaSsrKSB7Ci0gICAgICAgICAgICBhdl9sb2coJnRlc3RfY3R4LCBBVl9MT0dfREVCVUcsICJTZXR0aW5nIG9wdGlvbnMgc3RyaW5nICclcydcbiIsIG9wdGlvbnNbaV0pOwotICAgICAgICAgICAgaWYgKGF2X29wdF9zZXRfZnJvbV9zdHJpbmcoJnRlc3RfY3R4LCBvcHRpb25zW2ldLCBzaG9ydGhhbmQsICI9IiwgIjoiKSA8IDApCi0gICAgICAgICAgICAgICAgcHJpbnRmKCJFcnJvciAnJXMnXG4iLCBvcHRpb25zW2ldKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIk9LICAgICclcydcbiIsIG9wdGlvbnNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL29wdC5oIGIvbGliYXZ1dGlsL29wdC5oCmluZGV4IDc1MzQzNGQuLjA3ZGE2OGUgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9vcHQuaAorKysgYi9saWJhdnV0aWwvb3B0LmgKQEAgLTU4LDcgKzU4LDcgQEAKICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBhbiBBVk9wdGlvbnMtZW5hYmxlZCBzdHJ1Y3Q6CiAgKiBAY29kZQogICogdHlwZWRlZiBzdHJ1Y3QgdGVzdF9zdHJ1Y3QgewotICogICAgIEFWQ2xhc3MgKmNsYXNzOworICogICAgIGNvbnN0IEFWQ2xhc3MgKmNsYXNzOwogICogICAgIGludCAgICAgIGludF9vcHQ7CiAgKiAgICAgY2hhciAgICAqc3RyX29wdDsKICAqICAgICB1aW50OF90ICpiaW5fb3B0OwpAQCAtOTYsNyArOTYsNyBAQAogICogQGNvZGUKICAqIHRlc3Rfc3RydWN0ICphbGxvY190ZXN0X3N0cnVjdCh2b2lkKQogICogewotICogICAgIHRlc3Rfc3RydWN0ICpyZXQgPSBhdl9tYWxsb2Moc2l6ZW9mKCpyZXQpKTsKKyAqICAgICB0ZXN0X3N0cnVjdCAqcmV0ID0gYXZfbWFsbG9jeihzaXplb2YoKnJldCkpOwogICogICAgIHJldC0+Y2xhc3MgPSAmdGVzdF9jbGFzczsKICAqICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKHJldCk7CiAgKiAgICAgcmV0dXJuIHJldDsKQEAgLTIyOCwxNSArMjI4LDE2IEBACiAgICAgQVZfT1BUX1RZUEVfUkFUSU9OQUwsCiAgICAgQVZfT1BUX1RZUEVfQklOQVJZLCAgLy8vPCBvZmZzZXQgbXVzdCBwb2ludCB0byBhIHBvaW50ZXIgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYW4gaW50IGZvciB0aGUgbGVuZ3RoCiAgICAgQVZfT1BUX1RZUEVfRElDVCwKLSAgICBBVl9PUFRfVFlQRV9DT05TVCA9IDEyOCwKLSAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFID0gTUtCRVRBRygnUycsJ0knLCdaJywnRScpLCAvLy88IG9mZnNldCBtdXN0IHBvaW50IHRvIHR3byBjb25zZWN1dGl2ZSBpbnRlZ2VycwotICAgIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCAgPSBNS0JFVEFHKCdQJywnRicsJ00nLCdUJyksCi0gICAgQVZfT1BUX1RZUEVfU0FNUExFX0ZNVCA9IE1LQkVUQUcoJ1MnLCdGJywnTScsJ1QnKSwKLSAgICBBVl9PUFRfVFlQRV9WSURFT19SQVRFID0gTUtCRVRBRygnVicsJ1InLCdBJywnVCcpLCAvLy88IG9mZnNldCBtdXN0IHBvaW50IHRvIEFWUmF0aW9uYWwKLSAgICBBVl9PUFRfVFlQRV9EVVJBVElPTiAgID0gTUtCRVRBRygnRCcsJ1UnLCdSJywnICcpLAotICAgIEFWX09QVF9UWVBFX0NPTE9SICAgICAgPSBNS0JFVEFHKCdDJywnTycsJ0wnLCdSJyksCi0gICAgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQgPSBNS0JFVEFHKCdDJywnSCcsJ0wnLCdBJyksCi0gICAgQVZfT1BUX1RZUEVfQk9PTCAgICAgICAgICAgPSBNS0JFVEFHKCdCJywnTycsJ08nLCdMJyksCisgICAgQVZfT1BUX1RZUEVfVUlOVDY0LAorICAgIEFWX09QVF9UWVBFX0NPTlNULAorICAgIEFWX09QVF9UWVBFX0lNQUdFX1NJWkUsIC8vLzwgb2Zmc2V0IG11c3QgcG9pbnQgdG8gdHdvIGNvbnNlY3V0aXZlIGludGVnZXJzCisgICAgQVZfT1BUX1RZUEVfUElYRUxfRk1ULAorICAgIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQsCisgICAgQVZfT1BUX1RZUEVfVklERU9fUkFURSwgLy8vPCBvZmZzZXQgbXVzdCBwb2ludCB0byBBVlJhdGlvbmFsCisgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sCisgICAgQVZfT1BUX1RZUEVfQ09MT1IsCisgICAgQVZfT1BUX1RZUEVfQ0hBTk5FTF9MQVlPVVQsCisgICAgQVZfT1BUX1RZUEVfQk9PTCwKIH07CiAKIC8qKgpAQCAtMjc0LDE0ICsyNzUsMTEgQEAKICAgICBpbnQgZmxhZ3M7CiAjZGVmaW5lIEFWX09QVF9GTEFHX0VOQ09ESU5HX1BBUkFNICAxICAgLy8vPCBhIGdlbmVyaWMgcGFyYW1ldGVyIHdoaWNoIGNhbiBiZSBzZXQgYnkgdGhlIHVzZXIgZm9yIG11eGluZyBvciBlbmNvZGluZwogI2RlZmluZSBBVl9PUFRfRkxBR19ERUNPRElOR19QQVJBTSAgMiAgIC8vLzwgYSBnZW5lcmljIHBhcmFtZXRlciB3aGljaCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyIGZvciBkZW11eGluZyBvciBkZWNvZGluZwotI2lmIEZGX0FQSV9PUFRfVFlQRV9NRVRBREFUQQotI2RlZmluZSBBVl9PUFRfRkxBR19NRVRBREFUQSAgICAgICAgNCAgIC8vLzwgc29tZSBkYXRhIGV4dHJhY3RlZCBvciBpbnNlcnRlZCBpbnRvIHRoZSBmaWxlIGxpa2UgdGl0bGUsIGNvbW1lbnQsIC4uLgotI2VuZGlmCiAjZGVmaW5lIEFWX09QVF9GTEFHX0FVRElPX1BBUkFNICAgICA4CiAjZGVmaW5lIEFWX09QVF9GTEFHX1ZJREVPX1BBUkFNICAgICAxNgogI2RlZmluZSBBVl9PUFRfRkxBR19TVUJUSVRMRV9QQVJBTSAgMzIKIC8qKgotICogVGhlIG9wdGlvbiBpcyBpbnRlZGVkIGZvciBleHBvcnRpbmcgdmFsdWVzIHRvIHRoZSBjYWxsZXIuCisgKiBUaGUgb3B0aW9uIGlzIGludGVuZGVkIGZvciBleHBvcnRpbmcgdmFsdWVzIHRvIHRoZSBjYWxsZXIuCiAgKi8KICNkZWZpbmUgQVZfT1BUX0ZMQUdfRVhQT1JUICAgICAgICAgIDY0CiAvKioKQEAgLTI4OSw2ICsyODcsNyBAQAogICogVGhpcyBmbGFnIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBBVl9PUFRfRkxBR19FWFBPUlQgaXMgYWxzbyBzZXQuCiAgKi8KICNkZWZpbmUgQVZfT1BUX0ZMQUdfUkVBRE9OTFkgICAgICAgIDEyOAorI2RlZmluZSBBVl9PUFRfRkxBR19CU0ZfUEFSQU0gICAgICAgKDE8PDgpIC8vLzwgYSBnZW5lcmljIHBhcmFtZXRlciB3aGljaCBjYW4gYmUgc2V0IGJ5IHRoZSB1c2VyIGZvciBiaXQgc3RyZWFtIGZpbHRlcmluZwogI2RlZmluZSBBVl9PUFRfRkxBR19GSUxURVJJTkdfUEFSQU0gKDE8PDE2KSAvLy88IGEgZ2VuZXJpYyBwYXJhbWV0ZXIgd2hpY2ggY2FuIGJlIHNldCBieSB0aGUgdXNlciBmb3IgZmlsdGVyaW5nCiAvL0ZJWE1FIHRoaW5rIGFib3V0IGVuYy1hdWRpbywgLi4uIHN0eWxlIGZsYWdzCiAKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9wYXJzZXV0aWxzLmMgYi9saWJhdnV0aWwvcGFyc2V1dGlscy5jCmluZGV4IDAwOTdiZWMuLjkyNGM0OWQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9wYXJzZXV0aWxzLmMKKysrIGIvbGliYXZ1dGlsL3BhcnNldXRpbHMuYwpAQCAtMTQwLDYgKzE0MCwxMSBAQAogICAgIHsgIm50c2MtZmlsbSIsIHsgMjQwMDAsIDEwMDEgfSB9LAogfTsKIAorc3RhdGljIGNvbnN0IGNoYXIgKm1vbnRoc1sxMl0gPSB7CisgICAgImphbnVhcnkiLCAiZmVicnVhcnkiLCAibWFyY2giLCAiYXByaWwiLCAibWF5IiwgImp1bmUiLCAianVseSIsICJhdWd1c3QiLAorICAgICJzZXB0ZW1iZXIiLCAib2N0b2JlciIsICJub3ZlbWJlciIsICJkZWNlbWJlciIKK307CisKIGludCBhdl9wYXJzZV92aWRlb19zaXplKGludCAqd2lkdGhfcHRyLCBpbnQgKmhlaWdodF9wdHIsIGNvbnN0IGNoYXIgKnN0cikKIHsKICAgICBpbnQgaTsKQEAgLTQ2Niw2ICs0NzEsMjEgQEAKICAgICByZXR1cm4gdmFsOwogfQogCitzdGF0aWMgaW50IGRhdGVfZ2V0X21vbnRoKGNvbnN0IGNoYXIgKipwcCkgeworICAgIGludCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IDEyOyBpKyspIHsKKyAgICAgICAgaWYgKCFhdl9zdHJuY2FzZWNtcCgqcHAsIG1vbnRoc1tpXSwgMykpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1vX2Z1bGwgPSBtb250aHNbaV0gKyAzOworICAgICAgICAgICAgaW50IGxlbiA9IHN0cmxlbihtb19mdWxsKTsKKyAgICAgICAgICAgICpwcCArPSAzOworICAgICAgICAgICAgaWYgKGxlbiA+IDAgJiYgIWF2X3N0cm5jYXNlY21wKCpwcCwgbW9fZnVsbCwgbGVuKSkKKyAgICAgICAgICAgICAgICAqcHAgKz0gbGVuOworICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCiBjaGFyICphdl9zbWFsbF9zdHJwdGltZShjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpmbXQsIHN0cnVjdCB0bSAqZHQpCiB7CiAgICAgaW50IGMsIHZhbDsKQEAgLTUyNSw2ICs1NDUsMTQgQEAKICAgICAgICAgICAgIGlmICghcCkKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgIGNhc2UgJ2gnOgorICAgICAgICAgICAgdmFsID0gZGF0ZV9nZXRfbW9udGgoJnApOworICAgICAgICAgICAgaWYgKHZhbCA9PSAtMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGR0LT50bV9tb24gPSB2YWw7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAnJSc6CiAgICAgICAgICAgICBpZiAoKnArKyAhPSAnJScpCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01NjIsNyArNTkwLDcgQEAKICAgICBpbnQ2NF90IHQsIG5vdzY0OwogICAgIHRpbWVfdCBub3c7CiAgICAgc3RydWN0IHRtIGR0ID0geyAwIH0sIHRtYnVmOwotICAgIGludCB0b2RheSA9IDAsIG5lZ2F0aXZlID0gMCwgbWljcm9zZWNvbmRzID0gMDsKKyAgICBpbnQgdG9kYXkgPSAwLCBuZWdhdGl2ZSA9IDAsIG1pY3Jvc2Vjb25kcyA9IDAsIHN1ZmZpeCA9IDEwMDAwMDA7CiAgICAgaW50IGk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkYXRlX2ZtdFtdID0gewogICAgICAgICAiJVkgLSAlbSAtICVkIiwKQEAgLTY2MSw2ICs2ODksMTYgQEAKIAogICAgIGlmIChkdXJhdGlvbikgewogICAgICAgICB0ID0gZHQudG1faG91ciAqIDM2MDAgKyBkdC50bV9taW4gKiA2MCArIGR0LnRtX3NlYzsKKyAgICAgICAgaWYgKHFbMF0gPT0gJ20nICYmIHFbMV0gPT0gJ3MnKSB7CisgICAgICAgICAgICBzdWZmaXggPSAxMDAwOworICAgICAgICAgICAgbWljcm9zZWNvbmRzIC89IDEwMDA7CisgICAgICAgICAgICBxICs9IDI7CisgICAgICAgIH0gZWxzZSBpZiAocVswXSA9PSAndScgJiYgcVsxXSA9PSAncycpIHsKKyAgICAgICAgICAgIHN1ZmZpeCA9IDE7CisgICAgICAgICAgICBtaWNyb3NlY29uZHMgPSAwOworICAgICAgICAgICAgcSArPSAyOworICAgICAgICB9IGVsc2UgaWYgKCpxID09ICdzJykKKyAgICAgICAgICAgIHErKzsKICAgICB9IGVsc2UgewogICAgICAgICBpbnQgaXNfdXRjID0gKnEgPT0gJ1onIHx8ICpxID09ICd6JzsKICAgICAgICAgaW50IHR6b2Zmc2V0ID0gMDsKQEAgLTY4Nyw2ICs3MjUsNyBAQAogICAgICAgICAgICAgZHQyLnRtX3NlYyAgPSBkdC50bV9zZWM7CiAgICAgICAgICAgICBkdCA9IGR0MjsKICAgICAgICAgfQorICAgICAgICBkdC50bV9pc2RzdCA9IGlzX3V0YyA/IDAgOiAtMTsKICAgICAgICAgdCA9IGlzX3V0YyA/IGF2X3RpbWVnbSgmZHQpIDogbWt0aW1lKCZkdCk7CiAgICAgICAgIHQgKz0gdHpvZmZzZXQ7CiAgICAgfQpAQCAtNjk1LDcgKzczNCw3IEBACiAgICAgaWYgKCpxKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogCi0gICAgdCAqPSAxMDAwMDAwOworICAgIHQgKj0gc3VmZml4OwogICAgIHQgKz0gbWljcm9zZWNvbmRzOwogICAgICp0aW1ldmFsID0gbmVnYXRpdmUgPyAtdCA6IHQ7CiAgICAgcmV0dXJuIDA7CkBAIC03MzksMTkyICs3NzgsMyBAQAogICAgIH0KICAgICByZXR1cm4gMDsKIH0KLQotI2lmZGVmIFRFU1QKLQotc3RhdGljIHVpbnQzMl90IHJhbmRvbXYgPSBNS1RBRygnTCcsJ0EnLCdWJywnVScpOwotCi1zdGF0aWMgdWludDMyX3QgYXZfZ2V0X3JhbmRvbV9zZWVkX2RldGVybWluaXN0aWModm9pZCkKLXsKLSAgICByZXR1cm4gcmFuZG9tdiA9IHJhbmRvbXYgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMzsKLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBwcmludGYoIlRlc3RpbmcgYXZfcGFyc2VfdmlkZW9fcmF0ZSgpXG4iKTsKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmF0ZXNbXSA9IHsKLSAgICAgICAgICAgICItaW5mIiwKLSAgICAgICAgICAgICJpbmYiLAotICAgICAgICAgICAgIm5hbiIsCi0gICAgICAgICAgICAiMTIzLzAiLAotICAgICAgICAgICAgIi0xMjMgLyAwIiwKLSAgICAgICAgICAgICIiLAotICAgICAgICAgICAgIi8iLAotICAgICAgICAgICAgIiAxMjMgIC8gIDMyMSIsCi0gICAgICAgICAgICAiZm9vL2ZvbyIsCi0gICAgICAgICAgICAiZm9vLzEiLAotICAgICAgICAgICAgIjEvZm9vIiwKLSAgICAgICAgICAgICIwLzAiLAotICAgICAgICAgICAgIi8wIiwKLSAgICAgICAgICAgICIxLyIsCi0gICAgICAgICAgICAiMSIsCi0gICAgICAgICAgICAiMCIsCi0gICAgICAgICAgICAiLTEyMy8xMjMiLAotICAgICAgICAgICAgIi1mb28iLAotICAgICAgICAgICAgIjEyMy4yMyIsCi0gICAgICAgICAgICAiLjIzIiwKLSAgICAgICAgICAgICItLjIzIiwKLSAgICAgICAgICAgICItMC4yMzQiLAotICAgICAgICAgICAgIi0wLjAwMDAwMDEiLAotICAgICAgICAgICAgIiAgMjEzMzIuMjMyNCAgICIsCi0gICAgICAgICAgICAiIC0yMTMzMi4yMzI0ICAgIiwKLSAgICAgICAgfTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocmF0ZXMpOyBpKyspIHsKLSAgICAgICAgICAgIGludCByZXQ7Ci0gICAgICAgICAgICBBVlJhdGlvbmFsIHEgPSB7IDAsIDAgfTsKLSAgICAgICAgICAgIHJldCA9IGF2X3BhcnNlX3ZpZGVvX3JhdGUoJnEsIHJhdGVzW2ldKTsKLSAgICAgICAgICAgIHByaW50ZigiJyVzJyAtPiAlZC8lZCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICByYXRlc1tpXSwgcS5udW0sIHEuZGVuLCByZXQgPyAiRVJST1IiIDogIk9LIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcmludGYoIlxuVGVzdGluZyBhdl9wYXJzZV9jb2xvcigpXG4iKTsKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICB1aW50OF90IHJnYmFbNF07Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xvcl9uYW1lc1tdID0gewotICAgICAgICAgICAgImJpa2VzaGVkIiwKLSAgICAgICAgICAgICJSYU5kT20iLAotICAgICAgICAgICAgImZvbyIsCi0gICAgICAgICAgICAicmVkIiwKLSAgICAgICAgICAgICJSZWQgIiwKLSAgICAgICAgICAgICJSRUQiLAotICAgICAgICAgICAgIlZpb2xldCIsCi0gICAgICAgICAgICAiWWVsbG93IiwKLSAgICAgICAgICAgICJSZWQiLAotICAgICAgICAgICAgIjB4MDAwMDAwIiwKLSAgICAgICAgICAgICIweDAwMDAwMDAiLAotICAgICAgICAgICAgIjB4ZmYwMDAwMDAiLAotICAgICAgICAgICAgIjB4M2UzNGZmIiwKLSAgICAgICAgICAgICIweDNlMzRmZmFhIiwKLSAgICAgICAgICAgICIweGZmWFhlZSIsCi0gICAgICAgICAgICAiMHhmb29iYXIiLAotICAgICAgICAgICAgIjB4ZmZmZmVlZWVlZWVlIiwKLSAgICAgICAgICAgICIjZmYwMDAwIiwKLSAgICAgICAgICAgICIjZmZYWDAwIiwKLSAgICAgICAgICAgICJmZjAwMDAiLAotICAgICAgICAgICAgImZmWFgwMCIsCi0gICAgICAgICAgICAicmVkQGZvbyIsCi0gICAgICAgICAgICAicmFuZG9tQDEwIiwKLSAgICAgICAgICAgICIweGZmMDAwMEAxLjAiLAotICAgICAgICAgICAgInJlZEAiLAotICAgICAgICAgICAgInJlZEAweGZmZiIsCi0gICAgICAgICAgICAicmVkQDB4ZiIsCi0gICAgICAgICAgICAicmVkQDIiLAotICAgICAgICAgICAgInJlZEAwLjEiLAotICAgICAgICAgICAgInJlZEAtMSIsCi0gICAgICAgICAgICAicmVkQDAuNSIsCi0gICAgICAgICAgICAicmVkQDEuMCIsCi0gICAgICAgICAgICAicmVkQDI1NiIsCi0gICAgICAgICAgICAicmVkQDEwZm9vIiwKLSAgICAgICAgICAgICJyZWRALTEuMCIsCi0gICAgICAgICAgICAicmVkQC0wLjAiLAotICAgICAgICB9OwotCi0gICAgICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyAgaSA8IEZGX0FSUkFZX0VMRU1TKGNvbG9yX25hbWVzKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYXZfcGFyc2VfY29sb3IocmdiYSwgY29sb3JfbmFtZXNbaV0sIC0xLCBOVUxMKSA+PSAwKQotICAgICAgICAgICAgICAgIHByaW50ZigiJXMgLT4gUiglZCkgRyglZCkgQiglZCkgQSglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX25hbWVzW2ldLCByZ2JhWzBdLCByZ2JhWzFdLCByZ2JhWzJdLCByZ2JhWzNdKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwcmludGYoIiVzIC0+IGVycm9yXG4iLCBjb2xvcl9uYW1lc1tpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcmludGYoIlxuVGVzdGluZyBhdl9zbWFsbF9zdHJwdGltZSgpXG4iKTsKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBzdHJ1Y3QgdG0gdG0gPSB7IDAgfTsKLSAgICAgICAgc3RydWN0IGZtdF90aW1lc3BlY19lbnRyeSB7Ci0gICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsICp0aW1lc3BlYzsKLSAgICAgICAgfSBmbXRfdGltZXNwZWNfZW50cmllc1tdID0gewotICAgICAgICAgICAgeyAiJVktJW0tJWQiLCAgICAgICAgICAgICAgICAgICAgIjIwMTItMTItMjEiIH0sCi0gICAgICAgICAgICB7ICIlWSAtICVtIC0gJWQiLCAgICAgICAgICAgICAgICAiMjAxMi0xMi0yMSIgfSwKLSAgICAgICAgICAgIHsgIiVZLSVtLSVkICVIOiVNOiVTIiwgICAgICAgICAgICIyMDEyLTEyLTIxIDIwOjEyOjIxIiB9LAotICAgICAgICAgICAgeyAiICAlWSAtICVtIC0gJWQgJUggOiAlTSA6ICVTIiwgIiAgIDIwMTIgLSAxMiAtICAyMSAgIDIwIDogMTIgOiAyMSIgfSwKLSAgICAgICAgfTsKLQotICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7Ci0gICAgICAgIGZvciAoaSA9IDA7ICBpIDwgRkZfQVJSQVlfRUxFTVMoZm10X3RpbWVzcGVjX2VudHJpZXMpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgKnA7Ci0gICAgICAgICAgICBzdHJ1Y3QgZm10X3RpbWVzcGVjX2VudHJ5ICplID0gJmZtdF90aW1lc3BlY19lbnRyaWVzW2ldOwotICAgICAgICAgICAgcHJpbnRmKCJmbXQ6JyVzJyBzcGVjOiclcycgLT4gIiwgZS0+Zm10LCBlLT50aW1lc3BlYyk7Ci0gICAgICAgICAgICBwID0gYXZfc21hbGxfc3RycHRpbWUoZS0+dGltZXNwZWMsIGUtPmZtdCwgJnRtKTsKLSAgICAgICAgICAgIGlmIChwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlMDRkLSUwMmQtJTJkICUwMmQ6JTAyZDolMDJkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAxOTAwK3RtLnRtX3llYXIsIHRtLnRtX21vbisxLCB0bS50bV9tZGF5LAotICAgICAgICAgICAgICAgICAgICAgICB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3JcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfcGFyc2VfdGltZSgpXG4iKTsKLSAgICB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBpbnQ2NF90IHR2OwotICAgICAgICB0aW1lX3QgdHZpOwotICAgICAgICBzdHJ1Y3QgdG0gKnRtOwotICAgICAgICBzdGF0aWMgY2hhciB0enN0cltdID0gIlRaPUNFVC0xIjsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0aW1lX3N0cmluZ1tdID0gewotICAgICAgICAgICAgIm5vdyIsCi0gICAgICAgICAgICAiMTI6MzU6NDYiLAotICAgICAgICAgICAgIjIwMDAtMTItMjAgMDowMjo0Ny41eiIsCi0gICAgICAgICAgICAiMjAxMiAtIDAyLTIyICAxNzo0NDowNyIsCi0gICAgICAgICAgICAiMjAwMC0xMi0yMFQwMTAyNDcuNiIsCi0gICAgICAgICAgICAiMjAwMC0xMi0xMiAxOjM1OjQ2KzA1OjMwIiwKLSAgICAgICAgICAgICIyMDAyLTEyLTEyIDIyOjMwOjQwLTAyIiwKLSAgICAgICAgfTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkdXJhdGlvbl9zdHJpbmdbXSA9IHsKLSAgICAgICAgICAgICIyOjM0OjU2Ljc5IiwKLSAgICAgICAgICAgICItMToyMzo0NS42NyIsCi0gICAgICAgICAgICAiNDIuMTcyOSIsCi0gICAgICAgICAgICAiLTE3MjkuNDIiLAotICAgICAgICAgICAgIjEyOjM0IiwKLSAgICAgICAgfTsKLQotICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7Ci0gICAgICAgIHB1dGVudih0enN0cik7Ci0gICAgICAgIHByaW50ZigiKG5vdyBpcyAyMDEyLTAzLTE3IDA5OjE0OjEzLjIgKzAxMDAsIGxvY2FsIHRpbWUgaXMgVVRDKzEpXG4iKTsKLSAgICAgICAgZm9yIChpID0gMDsgIGkgPCBGRl9BUlJBWV9FTEVNUyh0aW1lX3N0cmluZyk7IGkrKykgewotICAgICAgICAgICAgcHJpbnRmKCIlLTI0cyAtPiAiLCB0aW1lX3N0cmluZ1tpXSk7Ci0gICAgICAgICAgICBpZiAoYXZfcGFyc2VfdGltZSgmdHYsIHRpbWVfc3RyaW5nW2ldLCAwKSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3JcbiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0dmkgPSB0diAvIDEwMDAwMDA7Ci0gICAgICAgICAgICAgICAgdG0gPSBnbXRpbWUoJnR2aSk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlMTQiUFJJaTY0Ii4lMDZkID0gJTA0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmRaXG4iLAotICAgICAgICAgICAgICAgICAgICAgICB0diAvIDEwMDAwMDAsIChpbnQpKHR2ICUgMTAwMDAwMCksCi0gICAgICAgICAgICAgICAgICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiArIDEsIHRtLT50bV9tZGF5LAotICAgICAgICAgICAgICAgICAgICAgICB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgIGkgPCBGRl9BUlJBWV9FTEVNUyhkdXJhdGlvbl9zdHJpbmcpOyBpKyspIHsKLSAgICAgICAgICAgIHByaW50ZigiJS0yNHMgLT4gIiwgZHVyYXRpb25fc3RyaW5nW2ldKTsKLSAgICAgICAgICAgIGlmIChhdl9wYXJzZV90aW1lKCZ0diwgZHVyYXRpb25fc3RyaW5nW2ldLCAxKSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiZXJyb3JcbiIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiUrMjEiUFJJaTY0IlxuIiwgdHYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvcGNhLmMgYi9saWJhdnV0aWwvcGNhLmMKaW5kZXggMWQ4OGZmMy4uNGU1MmM3YiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3BjYS5jCisrKyBiL2xpYmF2dXRpbC9wY2EuYwpAQCAtMTcxLDg2ICsxNzEsMyBAQAogCiAgICAgcmV0dXJuIC0xOwogfQotCi0jaWZkZWYgVEVTVAotCi0jdW5kZWYgcHJpbnRmCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlICJsZmcuaCIKLQotaW50IG1haW4odm9pZCl7Ci0gICAgUENBICpwY2E7Ci0gICAgaW50IGksIGosIGs7Ci0jZGVmaW5lIExFTiA4Ci0gICAgZG91YmxlIGVpZ2VudmVjdG9yW0xFTipMRU5dOwotICAgIGRvdWJsZSBlaWdlbnZhbHVlW0xFTl07Ci0gICAgQVZMRkcgcHJuZzsKLQotICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKLQotICAgIHBjYT0gZmZfcGNhX2luaXQoTEVOKTsKLQotICAgIGZvcihpPTA7IGk8OTAwMDAwMDsgaSsrKXsKLSAgICAgICAgZG91YmxlIHZbMipMRU4rMTAwXTsKLSAgICAgICAgZG91YmxlIHN1bT0wOwotICAgICAgICBpbnQgcG9zID0gYXZfbGZnX2dldCgmcHJuZykgJSBMRU47Ci0gICAgICAgIGludCB2MiAgPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDEwMSAtIDUwOwotICAgICAgICB2WzBdICAgID0gYXZfbGZnX2dldCgmcHJuZykgJSAxMDEgLSA1MDsKLSAgICAgICAgZm9yKGo9MTsgajw4OyBqKyspewotICAgICAgICAgICAgaWYoajw9cG9zKSB2W2pdPSB2WzBdOwotICAgICAgICAgICAgZWxzZSAgICAgICB2W2pdPSB2MjsKLSAgICAgICAgICAgIHN1bSArPSB2W2pdOwotICAgICAgICB9Ci0vKiAgICAgICAgZm9yKGo9MDsgajxMRU47IGorKyl7Ci0gICAgICAgICAgICB2W2pdIC09IHZbcG9zXTsKLSAgICAgICAgfSovCi0vLyAgICAgICAgc3VtICs9IGF2X2xmZ19nZXQoJnBybmcpICUgMTA7Ci0vKiAgICAgICAgZm9yKGo9MDsgajxMRU47IGorKyl7Ci0gICAgICAgICAgICB2W2pdIC09IHN1bS9MRU47Ci0gICAgICAgIH0qLwotLy8gICAgICAgIGxidDEodisxMDAsdisxMDAsTEVOKTsKLSAgICAgICAgZmZfcGNhX2FkZChwY2EsIHYpOwotICAgIH0KLQotCi0gICAgZmZfcGNhKHBjYSwgZWlnZW52ZWN0b3IsIGVpZ2VudmFsdWUpOwotICAgIGZvcihpPTA7IGk8TEVOOyBpKyspewotICAgICAgICBwY2EtPmNvdW50PSAxOwotICAgICAgICBwY2EtPm1lYW5baV09IDA7Ci0KLS8vICAgICAgICAoMC41Xnx4fCleMiA9IDAuNV4yfHh8ID0gMC4yNV58eHwKLQotCi0vLyAgICAgICAgcGNhLmNvdmFyaWFuY2VbaSArIGkqTEVOXT0gcG93KDAuNSwgZmFicwotICAgICAgICBmb3Ioaj1pOyBqPExFTjsgaisrKXsKLSAgICAgICAgICAgIHByaW50ZigiJWYgIiwgcGNhLT5jb3ZhcmlhbmNlW2kgKyBqKkxFTl0pOwotICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICB9Ci0KLSAgICBmb3IoaT0wOyBpPExFTjsgaSsrKXsKLSAgICAgICAgZG91YmxlIHZbTEVOXTsKLSAgICAgICAgZG91YmxlIGVycm9yPTA7Ci0gICAgICAgIG1lbXNldCh2LCAwLCBzaXplb2YodikpOwotICAgICAgICBmb3Ioaj0wOyBqPExFTjsgaisrKXsKLSAgICAgICAgICAgIGZvcihrPTA7IGs8TEVOOyBrKyspewotICAgICAgICAgICAgICAgIHZbal0gKz0gcGNhLT5jb3ZhcmlhbmNlW0ZGTUlOKGssaikgKyBGRk1BWChrLGopKkxFTl0gKiBlaWdlbnZlY3RvcltpICsgaypMRU5dOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdltqXSAvPSBlaWdlbnZhbHVlW2ldOwotICAgICAgICAgICAgZXJyb3IgKz0gZmFicyh2W2pdIC0gZWlnZW52ZWN0b3JbaSArIGoqTEVOXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCIlZiAiLCBlcnJvcik7Ci0gICAgfQotICAgIHByaW50ZigiXG4iKTsKLQotICAgIGZvcihpPTA7IGk8TEVOOyBpKyspewotICAgICAgICBmb3Ioaj0wOyBqPExFTjsgaisrKXsKLSAgICAgICAgICAgIHByaW50ZigiJTkuNmYgIiwgZWlnZW52ZWN0b3JbaSArIGoqTEVOXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCIgICU5LjFmICVmXG4iLCBlaWdlbnZhbHVlW2ldLCBlaWdlbnZhbHVlW2ldL2VpZ2VudmFsdWVbMF0pOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvcGl4ZGVzYy5jIGIvbGliYXZ1dGlsL3BpeGRlc2MuYwppbmRleCA1ODgzM2NmLi44ZWQ1Mjc1IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvcGl4ZGVzYy5jCisrKyBiL2xpYmF2dXRpbC9waXhkZXNjLmMKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgICAgICAuY29tcCA9IHsKICAgICAgICAgICAgIHsgMCwgMSwgMCwgMCwgOCwgMCwgNywgMSB9LCAgICAgICAgLyogWSAqLwogICAgICAgICB9LAotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMLAorICAgICAgICAuZmxhZ3MgPSBGRl9QU0VVRE9QQUwsCiAgICAgICAgIC5hbGlhcyA9ICJncmF5OCx5OCIsCiAgICAgfSwKICAgICBbQVZfUElYX0ZNVF9NT05PV0hJVEVdID0gewpAQCAtMzI2LDIyICszMjYsMTAgQEAKICAgICAgICAgfSwKICAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKICAgICB9LAotI2lmIEZGX0FQSV9YVk1DCi0gICAgW0FWX1BJWF9GTVRfWFZNQ19NUEVHMl9NQ10gPSB7Ci0gICAgICAgIC5uYW1lID0gInh2bWNtYyIsCi0gICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAotICAgIH0sCi0gICAgW0FWX1BJWF9GTVRfWFZNQ19NUEVHMl9JRENUXSA9IHsKLSAgICAgICAgLm5hbWUgPSAieHZtY2lkY3QiLAotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKLSAgICB9LAotI2VuZGlmIC8qIEZGX0FQSV9YVk1DICovCi0jaWYgIUZGX0FQSV9YVk1DCiAgICAgW0FWX1BJWF9GTVRfWFZNQ10gPSB7CiAgICAgICAgIC5uYW1lID0gInh2bWMiLAogICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKICAgICB9LAotI2VuZGlmIC8qICFGRl9BUElfWFZNQyAqLwogICAgIFtBVl9QSVhfRk1UX1VZVlk0MjJdID0gewogICAgICAgICAubmFtZSA9ICJ1eXZ5NDIyIiwKICAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAzLApAQCAtMzc0LDcgKzM2Miw3IEBACiAgICAgICAgICAgICB7IDAsIDEsIDAsIDMsIDMsIDAsIDIsIDEgfSwgICAgICAgIC8qIEcgKi8KICAgICAgICAgICAgIHsgMCwgMSwgMCwgNiwgMiwgMCwgMSwgMSB9LCAgICAgICAgLyogQiAqLwogICAgICAgICB9LAotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEZGX1BTRVVET1BBTCwKICAgICB9LAogICAgIFtBVl9QSVhfRk1UX0JHUjRdID0gewogICAgICAgICAubmFtZSA9ICJiZ3I0IiwKQEAgLTM5OCw3ICszODYsNyBAQAogICAgICAgICAgICAgeyAwLCAxLCAwLCAxLCAyLCAwLCAxLCAxIH0sICAgICAgICAvKiBHICovCiAgICAgICAgICAgICB7IDAsIDEsIDAsIDMsIDEsIDAsIDAsIDEgfSwgICAgICAgIC8qIEIgKi8KICAgICAgICAgfSwKLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBGRl9QU0VVRE9QQUwsCiAgICAgfSwKICAgICBbQVZfUElYX0ZNVF9SR0I4XSA9IHsKICAgICAgICAgLm5hbWUgPSAicmdiOCIsCkBAIC00MTAsNyArMzk4LDcgQEAKICAgICAgICAgICAgIHsgMCwgMSwgMCwgMywgMywgMCwgMiwgMSB9LCAgICAgICAgLyogRyAqLwogICAgICAgICAgICAgeyAwLCAxLCAwLCAwLCAzLCAwLCAyLCAxIH0sICAgICAgICAvKiBCICovCiAgICAgICAgIH0sCi0gICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgRkZfUFNFVURPUEFMLAogICAgIH0sCiAgICAgW0FWX1BJWF9GTVRfUkdCNF0gPSB7CiAgICAgICAgIC5uYW1lID0gInJnYjQiLApAQCAtNDM0LDcgKzQyMiw3IEBACiAgICAgICAgICAgICB7IDAsIDEsIDAsIDEsIDIsIDAsIDEsIDEgfSwgICAgICAgIC8qIEcgKi8KICAgICAgICAgICAgIHsgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMSB9LCAgICAgICAgLyogQiAqLwogICAgICAgICB9LAotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX1BTRVVET1BBTCwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEZGX1BTRVVET1BBTCwKICAgICB9LAogICAgIFtBVl9QSVhfRk1UX05WMTJdID0gewogICAgICAgICAubmFtZSA9ICJudjEyIiwKQEAgLTU2MCw2ICs1NDgsNjkgQEAKICAgICAgICAgfSwKICAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKICAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dSQVk5QkVdID0geworICAgICAgICAubmFtZSA9ICJncmF5OWJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDIsIDAsIDAsIDksIDEsIDgsIDEgfSwgICAgICAgLyogWSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUsCisgICAgICAgIC5hbGlhcyA9ICJ5OWJlIiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dSQVk5TEVdID0geworICAgICAgICAubmFtZSA9ICJncmF5OWxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDIsIDAsIDAsIDksIDEsIDgsIDEgfSwgICAgICAgLyogWSAqLworICAgICAgICB9LAorICAgICAgICAuYWxpYXMgPSAieTlsZSIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HUkFZMTBCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdyYXkxMGJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDIsIDAsIDAsIDEwLCAxLCA5LCAxIH0sICAgICAgIC8qIFkgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFLAorICAgICAgICAuYWxpYXMgPSAieTEwYmUiLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTEwTEVdID0geworICAgICAgICAubmFtZSA9ICJncmF5MTBsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAyLCAwLCAwLCAxMCwgMSwgOSwgMSB9LCAgICAgICAvKiBZICovCisgICAgICAgIH0sCisgICAgICAgIC5hbGlhcyA9ICJ5MTBsZSIsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HUkFZMTJCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdyYXkxMmJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDAsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBZICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSwKKyAgICAgICAgLmFsaWFzID0gInkxMmJlIiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dSQVkxMkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ3JheTEybGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDEsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMiwgMCwgMCwgMTIsIDEsIDExLCAxIH0sICAgICAgIC8qIFkgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmFsaWFzID0gInkxMmxlIiwKKyAgICB9LAogICAgIFtBVl9QSVhfRk1UX0dSQVkxNkJFXSA9IHsKICAgICAgICAgLm5hbWUgPSAiZ3JheTE2YmUiLAogICAgICAgICAubmJfY29tcG9uZW50cyA9IDEsCkBAIC05MjYsNDQgKzk3Nyw2IEBACiAgICAgICAgIH0sCiAgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCiAgICAgfSwKLSNpZiBGRl9BUElfVkRQQVUKLSAgICBbQVZfUElYX0ZNVF9WRFBBVV9IMjY0XSA9IHsKLSAgICAgICAgLm5hbWUgPSAidmRwYXVfaDI2NCIsCi0gICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKLSAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAxLAotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKLSAgICB9LAotICAgIFtBVl9QSVhfRk1UX1ZEUEFVX01QRUcxXSA9IHsKLSAgICAgICAgLm5hbWUgPSAidmRwYXVfbXBlZzEiLAotICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCi0gICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCi0gICAgfSwKLSAgICBbQVZfUElYX0ZNVF9WRFBBVV9NUEVHMl0gPSB7Ci0gICAgICAgIC5uYW1lID0gInZkcGF1X21wZWcyIiwKLSAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAotICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCi0gICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAotICAgIH0sCi0gICAgW0FWX1BJWF9GTVRfVkRQQVVfV01WM10gPSB7Ci0gICAgICAgIC5uYW1lID0gInZkcGF1X3dtdjMiLAotICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCi0gICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCi0gICAgfSwKLSAgICBbQVZfUElYX0ZNVF9WRFBBVV9WQzFdID0gewotICAgICAgICAubmFtZSA9ICJ2ZHBhdV92YzEiLAotICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCi0gICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCi0gICAgfSwKLSAgICBbQVZfUElYX0ZNVF9WRFBBVV9NUEVHNF0gPSB7Ci0gICAgICAgIC5uYW1lID0gInZkcGF1X21wZWc0IiwKLSAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAotICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCi0gICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAotICAgIH0sCi0jZW5kaWYKICAgICBbQVZfUElYX0ZNVF9SR0I0OEJFXSA9IHsKICAgICAgICAgLm5hbWUgPSAicmdiNDhiZSIsCiAgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKQEAgLTE2MDcsMTIgKzE2MjAsNiBAQAogICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCiAgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAogICAgIH0sCi0gICAgW0FWX1BJWF9GTVRfVkRBX1ZMRF0gPSB7Ci0gICAgICAgIC5uYW1lID0gInZkYV92bGQiLAotICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDEsCi0gICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMSwKLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCi0gICAgfSwKICAgICBbQVZfUElYX0ZNVF9ZQThdID0gewogICAgICAgICAubmFtZSA9ICJ5YTgiLAogICAgICAgICAubmJfY29tcG9uZW50cyA9IDIsCkBAIC0xODczLDYyICsxODgwLDYyIEBACiAgICAgW0FWX1BJWF9GTVRfQkFZRVJfQkdHUjhdID0gewogICAgICAgICAubmFtZSA9ICJiYXllcl9iZ2dyOCIsCiAgICAgICAgIEJBWUVSOF9ERVNDX0NPTU1PTgotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0JBWUVSLAogICAgIH0sCiAgICAgW0FWX1BJWF9GTVRfQkFZRVJfQkdHUjE2TEVdID0gewogICAgICAgICAubmFtZSA9ICJiYXllcl9iZ2dyMTZsZSIsCiAgICAgICAgIEJBWUVSMTZfREVTQ19DT01NT04KLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19CQVlFUiwKICAgICB9LAogICAgIFtBVl9QSVhfRk1UX0JBWUVSX0JHR1IxNkJFXSA9IHsKICAgICAgICAgLm5hbWUgPSAiYmF5ZXJfYmdncjE2YmUiLAogICAgICAgICBCQVlFUjE2X0RFU0NfQ09NTU9OCi0gICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBBVl9QSVhfRk1UX0ZMQUdfQkFZRVIsCiAgICAgfSwKICAgICBbQVZfUElYX0ZNVF9CQVlFUl9SR0dCOF0gPSB7CiAgICAgICAgIC5uYW1lID0gImJheWVyX3JnZ2I4IiwKICAgICAgICAgQkFZRVI4X0RFU0NfQ09NTU9OCi0gICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBBVl9QSVhfRk1UX0ZMQUdfQkFZRVIsCiAgICAgfSwKICAgICBbQVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZMRV0gPSB7CiAgICAgICAgIC5uYW1lID0gImJheWVyX3JnZ2IxNmxlIiwKICAgICAgICAgQkFZRVIxNl9ERVNDX0NPTU1PTgotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0JBWUVSLAogICAgIH0sCiAgICAgW0FWX1BJWF9GTVRfQkFZRVJfUkdHQjE2QkVdID0gewogICAgICAgICAubmFtZSA9ICJiYXllcl9yZ2diMTZiZSIsCiAgICAgICAgIEJBWUVSMTZfREVTQ19DT01NT04KLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0JFIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19CQVlFUiwKICAgICB9LAogICAgIFtBVl9QSVhfRk1UX0JBWUVSX0dCUkc4XSA9IHsKICAgICAgICAgLm5hbWUgPSAiYmF5ZXJfZ2JyZzgiLAogICAgICAgICBCQVlFUjhfREVTQ19DT01NT04KLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19CQVlFUiwKICAgICB9LAogICAgIFtBVl9QSVhfRk1UX0JBWUVSX0dCUkcxNkxFXSA9IHsKICAgICAgICAgLm5hbWUgPSAiYmF5ZXJfZ2JyZzE2bGUiLAogICAgICAgICBCQVlFUjE2X0RFU0NfQ09NTU9OCi0gICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBBVl9QSVhfRk1UX0ZMQUdfQkFZRVIsCiAgICAgfSwKICAgICBbQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZCRV0gPSB7CiAgICAgICAgIC5uYW1lID0gImJheWVyX2dicmcxNmJlIiwKICAgICAgICAgQkFZRVIxNl9ERVNDX0NPTU1PTgotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0JBWUVSLAogICAgIH0sCiAgICAgW0FWX1BJWF9GTVRfQkFZRVJfR1JCRzhdID0gewogICAgICAgICAubmFtZSA9ICJiYXllcl9ncmJnOCIsCiAgICAgICAgIEJBWUVSOF9ERVNDX0NPTU1PTgotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0JBWUVSLAogICAgIH0sCiAgICAgW0FWX1BJWF9GTVRfQkFZRVJfR1JCRzE2TEVdID0gewogICAgICAgICAubmFtZSA9ICJiYXllcl9ncmJnMTZsZSIsCiAgICAgICAgIEJBWUVSMTZfREVTQ19DT01NT04KLSAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19CQVlFUiwKICAgICB9LAogICAgIFtBVl9QSVhfRk1UX0JBWUVSX0dSQkcxNkJFXSA9IHsKICAgICAgICAgLm5hbWUgPSAiYmF5ZXJfZ3JiZzE2YmUiLAogICAgICAgICBCQVlFUjE2X0RFU0NfQ09NTU9OCi0gICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19SR0IsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19SR0IgfCBBVl9QSVhfRk1UX0ZMQUdfQkFZRVIsCiAgICAgfSwKICAgICBbQVZfUElYX0ZNVF9OVjE2XSA9IHsKICAgICAgICAgLm5hbWUgPSAibnYxNiIsCkBAIC0xOTY2LDE4ICsxOTczLDIyIEBACiAgICAgICAgIH0sCiAgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQkUsCiAgICAgfSwKLSAgICBbQVZfUElYX0ZNVF9WREFdID0gewotICAgICAgICAubmFtZSA9ICJ2ZGEiLAotICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKLSAgICB9LAogICAgIFtBVl9QSVhfRk1UX1FTVl0gPSB7CiAgICAgICAgIC5uYW1lID0gInFzdiIsCiAgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAogICAgIH0sCisgICAgW0FWX1BJWF9GTVRfTUVESUFDT0RFQ10gPSB7CisgICAgICAgIC5uYW1lID0gIm1lZGlhY29kZWMiLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKKyAgICB9LAogICAgIFtBVl9QSVhfRk1UX01NQUxdID0gewogICAgICAgICAubmFtZSA9ICJtbWFsIiwKICAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwsCiAgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9DVURBXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiY3VkYSIsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCiAgICAgW0FWX1BJWF9GTVRfQVlVVjY0TEVdID0gewogICAgICAgICAubmFtZSA9ICJheXV2NjRsZSIsCiAgICAgICAgIC5uYl9jb21wb25lbnRzID0gNCwKQEAgLTIwMjgsNDAgKzIwMzksMjMwIEBACiAgICAgICAgIH0sCiAgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfQkUsCiAgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9QMDE2TEVdID0geworICAgICAgICAubmFtZSA9ICJwMDE2bGUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDMsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMSwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAxLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMCwgMiwgMCwgMCwgMTYsIDEsIDE1LCAxIH0sICAgICAgIC8qIFkgKi8KKyAgICAgICAgICAgIHsgMSwgNCwgMCwgMCwgMTYsIDMsIDE1LCAxIH0sICAgICAgIC8qIFUgKi8KKyAgICAgICAgICAgIHsgMSwgNCwgMiwgMCwgMTYsIDMsIDE1LCAzIH0sICAgICAgIC8qIFYgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX1AwMTZCRV0gPSB7CisgICAgICAgIC5uYW1lID0gInAwMTZiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAxLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDEsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAwLCAyLCAwLCAwLCAxNiwgMSwgMTUsIDEgfSwgICAgICAgLyogWSAqLworICAgICAgICAgICAgeyAxLCA0LCAwLCAwLCAxNiwgMywgMTUsIDEgfSwgICAgICAgLyogVSAqLworICAgICAgICAgICAgeyAxLCA0LCAyLCAwLCAxNiwgMywgMTUsIDMgfSwgICAgICAgLyogViAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0JFLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSQVAxMkxFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ2JyYXAxMmxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDMsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfCBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwKKyAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSQVAxMkJFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ2JyYXAxMmJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBSICovCisgICAgICAgICAgICB7IDAsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDMsIDIsIDAsIDAsIDEyLCAxLCAxMSwgMSB9LCAgICAgICAvKiBBICovCisgICAgICAgIH0sCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19CRSB8IEFWX1BJWF9GTVRfRkxBR19QTEFOQVIgfAorICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0ZMQUdfUkdCIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfR0JSQVAxMExFXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZ2JyYXAxMGxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDIsIDAsIDAsIDEwLCAxLCA5LCAxIH0sICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgMiwgMCwgMCwgMTAsIDEsIDksIDEgfSwgICAgICAgLyogRyAqLworICAgICAgICAgICAgeyAxLCAyLCAwLCAwLCAxMCwgMSwgOSwgMSB9LCAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDMsIDIsIDAsIDAsIDEwLCAxLCA5LCAxIH0sICAgICAgIC8qIEEgKi8KKyAgICAgICAgfSwKKyAgICAgICAgLmZsYWdzID0gQVZfUElYX0ZNVF9GTEFHX1BMQU5BUiB8IEFWX1BJWF9GTVRfRkxBR19SR0IgfAorICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEsCisgICAgfSwKKyAgICBbQVZfUElYX0ZNVF9HQlJBUDEwQkVdID0geworICAgICAgICAubmFtZSA9ICJnYnJhcDEwYmUiLAorICAgICAgICAubmJfY29tcG9uZW50cyA9IDQsCisgICAgICAgIC5sb2cyX2Nocm9tYV93ID0gMCwKKyAgICAgICAgLmxvZzJfY2hyb21hX2ggPSAwLAorICAgICAgICAuY29tcCA9IHsKKyAgICAgICAgICAgIHsgMiwgMiwgMCwgMCwgMTAsIDEsIDksIDEgfSwgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCAyLCAwLCAwLCAxMCwgMSwgOSwgMSB9LCAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDIsIDAsIDAsIDEwLCAxLCA5LCAxIH0sICAgICAgIC8qIEIgKi8KKyAgICAgICAgICAgIHsgMywgMiwgMCwgMCwgMTAsIDEsIDksIDEgfSwgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwKKyAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19BTFBIQSwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0QzRDExXSA9IHsKKyAgICAgICAgLm5hbWUgPSAiZDNkMTEiLAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dCUlBGMzJCRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdicnBmMzJiZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAyLCA0LCAwLCAwLCAzMiwgMywgMzEsIDEgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgNCwgMCwgMCwgMzIsIDMsIDMxLCAxIH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDQsIDAsIDAsIDMyLCAzLCAzMSwgMSB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwKKyAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19GTE9BVCwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dCUlBGMzJMRV0gPSB7CisgICAgICAgIC5uYW1lID0gImdicnBmMzJsZSIsCisgICAgICAgIC5uYl9jb21wb25lbnRzID0gMywKKyAgICAgICAgLmxvZzJfY2hyb21hX3cgPSAwLAorICAgICAgICAubG9nMl9jaHJvbWFfaCA9IDAsCisgICAgICAgIC5jb21wID0geworICAgICAgICAgICAgeyAyLCA0LCAwLCAwLCAzMiwgMywgMzEsIDEgfSwgICAgICAgIC8qIFIgKi8KKyAgICAgICAgICAgIHsgMCwgNCwgMCwgMCwgMzIsIDMsIDMxLCAxIH0sICAgICAgICAvKiBHICovCisgICAgICAgICAgICB7IDEsIDQsIDAsIDAsIDMyLCAzLCAzMSwgMSB9LCAgICAgICAgLyogQiAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0ZMT0FUIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dCUkFQRjMyQkVdID0geworICAgICAgICAubmFtZSA9ICJnYnJhcGYzMmJlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDQsIDAsIDAsIDMyLCAzLCAzMSwgMSB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCA0LCAwLCAwLCAzMiwgMywgMzEsIDEgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMSwgNCwgMCwgMCwgMzIsIDMsIDMxLCAxIH0sICAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDMsIDQsIDAsIDAsIDMyLCAzLCAzMSwgMSB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfQkUgfCBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwKKyAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9GTEFHX0FMUEhBIHwgQVZfUElYX0ZNVF9GTEFHX1JHQiB8CisgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfRkxBR19GTE9BVCwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0dCUkFQRjMyTEVdID0geworICAgICAgICAubmFtZSA9ICJnYnJhcGYzMmxlIiwKKyAgICAgICAgLm5iX2NvbXBvbmVudHMgPSA0LAorICAgICAgICAubG9nMl9jaHJvbWFfdyA9IDAsCisgICAgICAgIC5sb2cyX2Nocm9tYV9oID0gMCwKKyAgICAgICAgLmNvbXAgPSB7CisgICAgICAgICAgICB7IDIsIDQsIDAsIDAsIDMyLCAzLCAzMSwgMSB9LCAgICAgICAgLyogUiAqLworICAgICAgICAgICAgeyAwLCA0LCAwLCAwLCAzMiwgMywgMzEsIDEgfSwgICAgICAgIC8qIEcgKi8KKyAgICAgICAgICAgIHsgMSwgNCwgMCwgMCwgMzIsIDMsIDMxLCAxIH0sICAgICAgICAvKiBCICovCisgICAgICAgICAgICB7IDMsIDQsIDAsIDAsIDMyLCAzLCAzMSwgMSB9LCAgICAgICAgLyogQSAqLworICAgICAgICB9LAorICAgICAgICAuZmxhZ3MgPSBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSIHwgQVZfUElYX0ZNVF9GTEFHX0FMUEhBIHwKKyAgICAgICAgICAgICAgICAgQVZfUElYX0ZNVF9GTEFHX1JHQiB8IEFWX1BJWF9GTVRfRkxBR19GTE9BVCwKKyAgICB9LAorICAgIFtBVl9QSVhfRk1UX0RSTV9QUklNRV0gPSB7CisgICAgICAgIC5uYW1lID0gImRybV9wcmltZSIsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCisgICAgW0FWX1BJWF9GTVRfT1BFTkNMXSA9IHsKKyAgICAgICAgLm5hbWUgID0gIm9wZW5jbCIsCisgICAgICAgIC5mbGFncyA9IEFWX1BJWF9GTVRfRkxBR19IV0FDQ0VMLAorICAgIH0sCiB9OwogI2lmIEZGX0FQSV9QTFVTMV9NSU5VUzEKIEZGX0VOQUJMRV9ERVBSRUNBVElPTl9XQVJOSU5HUwogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBjaGFyICpjb2xvcl9yYW5nZV9uYW1lc1tBVkNPTF9SQU5HRV9OQl0gPSB7Ci0gICAgInVua25vd24iLCAidHYiLCAicGMiLAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2xvcl9yYW5nZV9uYW1lc1tdID0geworICAgIFtBVkNPTF9SQU5HRV9VTlNQRUNJRklFRF0gPSAidW5rbm93biIsCisgICAgW0FWQ09MX1JBTkdFX01QRUddID0gInR2IiwKKyAgICBbQVZDT0xfUkFOR0VfSlBFR10gPSAicGMiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmNvbG9yX3ByaW1hcmllc19uYW1lc1tBVkNPTF9QUklfTkJdID0gewotICAgICJyZXNlcnZlZCIsICJidDcwOSIsICJ1bmtub3duIiwgInJlc2VydmVkIiwgImJ0NDcwbSIsCi0gICAgImJ0NDcwYmciLCAic21wdGUxNzBtIiwgInNtcHRlMjQwbSIsICJmaWxtIiwgImJ0MjAyMCIsCi0gICAgInNtcHRlNDI4LTEiLAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2xvcl9wcmltYXJpZXNfbmFtZXNbQVZDT0xfUFJJX05CXSA9IHsKKyAgICBbQVZDT0xfUFJJX1JFU0VSVkVEMF0gPSAicmVzZXJ2ZWQiLAorICAgIFtBVkNPTF9QUklfQlQ3MDldID0gImJ0NzA5IiwKKyAgICBbQVZDT0xfUFJJX1VOU1BFQ0lGSUVEXSA9ICJ1bmtub3duIiwKKyAgICBbQVZDT0xfUFJJX1JFU0VSVkVEXSA9ICJyZXNlcnZlZCIsCisgICAgW0FWQ09MX1BSSV9CVDQ3ME1dID0gImJ0NDcwbSIsCisgICAgW0FWQ09MX1BSSV9CVDQ3MEJHXSA9ICJidDQ3MGJnIiwKKyAgICBbQVZDT0xfUFJJX1NNUFRFMTcwTV0gPSAic21wdGUxNzBtIiwKKyAgICBbQVZDT0xfUFJJX1NNUFRFMjQwTV0gPSAic21wdGUyNDBtIiwKKyAgICBbQVZDT0xfUFJJX0ZJTE1dID0gImZpbG0iLAorICAgIFtBVkNPTF9QUklfQlQyMDIwXSA9ICJidDIwMjAiLAorICAgIFtBVkNPTF9QUklfU01QVEU0MjhdID0gInNtcHRlNDI4IiwKKyAgICBbQVZDT0xfUFJJX1NNUFRFNDMxXSA9ICJzbXB0ZTQzMSIsCisgICAgW0FWQ09MX1BSSV9TTVBURTQzMl0gPSAic21wdGU0MzIiLAorICAgIFtBVkNPTF9QUklfSkVERUNfUDIyXSA9ICJqZWRlYy1wMjIiLAogfTsKIAotc3RhdGljIGNvbnN0IGNoYXIgKmNvbG9yX3RyYW5zZmVyX25hbWVzW0FWQ09MX1RSQ19OQl0gPSB7Ci0gICAgInJlc2VydmVkIiwgImJ0NzA5IiwgInVua25vd24iLCAicmVzZXJ2ZWQiLCAiYnQ0NzBtIiwKLSAgICAiYnQ0NzBiZyIsICJzbXB0ZTE3MG0iLCAic21wdGUyNDBtIiwgImxpbmVhciIsICJsb2cxMDAiLAotICAgICJsb2czMTYiLCAiaWVjNjE5NjYtMi00IiwgImJ0MTM2MWUiLCAiaWVjNjE5NjYtMi0xIiwKLSAgICAiYnQyMDIwLTEwIiwgImJ0MjAyMC0yMCIsICJzbXB0ZTIwODQiLCAic21wdGU0MjgtMSIsCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbG9yX3RyYW5zZmVyX25hbWVzW10gPSB7CisgICAgW0FWQ09MX1RSQ19SRVNFUlZFRDBdID0gInJlc2VydmVkIiwKKyAgICBbQVZDT0xfVFJDX0JUNzA5XSA9ICJidDcwOSIsCisgICAgW0FWQ09MX1RSQ19VTlNQRUNJRklFRF0gPSAidW5rbm93biIsCisgICAgW0FWQ09MX1RSQ19SRVNFUlZFRF0gPSAicmVzZXJ2ZWQiLAorICAgIFtBVkNPTF9UUkNfR0FNTUEyMl0gPSAiYnQ0NzBtIiwKKyAgICBbQVZDT0xfVFJDX0dBTU1BMjhdID0gImJ0NDcwYmciLAorICAgIFtBVkNPTF9UUkNfU01QVEUxNzBNXSA9ICJzbXB0ZTE3MG0iLAorICAgIFtBVkNPTF9UUkNfU01QVEUyNDBNXSA9ICJzbXB0ZTI0MG0iLAorICAgIFtBVkNPTF9UUkNfTElORUFSXSA9ICJsaW5lYXIiLAorICAgIFtBVkNPTF9UUkNfTE9HXSA9ICJsb2cxMDAiLAorICAgIFtBVkNPTF9UUkNfTE9HX1NRUlRdID0gImxvZzMxNiIsCisgICAgW0FWQ09MX1RSQ19JRUM2MTk2Nl8yXzRdID0gImllYzYxOTY2LTItNCIsCisgICAgW0FWQ09MX1RSQ19CVDEzNjFfRUNHXSA9ICJidDEzNjFlIiwKKyAgICBbQVZDT0xfVFJDX0lFQzYxOTY2XzJfMV0gPSAiaWVjNjE5NjYtMi0xIiwKKyAgICBbQVZDT0xfVFJDX0JUMjAyMF8xMF0gPSAiYnQyMDIwLTEwIiwKKyAgICBbQVZDT0xfVFJDX0JUMjAyMF8xMl0gPSAiYnQyMDIwLTEyIiwKKyAgICBbQVZDT0xfVFJDX1NNUFRFMjA4NF0gPSAic21wdGUyMDg0IiwKKyAgICBbQVZDT0xfVFJDX1NNUFRFNDI4XSA9ICJzbXB0ZTQyOCIsCisgICAgW0FWQ09MX1RSQ19BUklCX1NURF9CNjddID0gImFyaWItc3RkLWI2NyIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqY29sb3Jfc3BhY2VfbmFtZXNbQVZDT0xfU1BDX05CXSA9IHsKLSAgICAiZ2JyIiwgImJ0NzA5IiwgInVua25vd24iLCAicmVzZXJ2ZWQiLCAiZmNjIiwKLSAgICAiYnQ0NzBiZyIsICJzbXB0ZTE3MG0iLCAic21wdGUyNDBtIiwgInljZ2NvIiwKLSAgICAiYnQyMDIwbmMiLCAiYnQyMDIwYyIsCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGNvbG9yX3NwYWNlX25hbWVzW10gPSB7CisgICAgW0FWQ09MX1NQQ19SR0JdID0gImdiciIsCisgICAgW0FWQ09MX1NQQ19CVDcwOV0gPSAiYnQ3MDkiLAorICAgIFtBVkNPTF9TUENfVU5TUEVDSUZJRURdID0gInVua25vd24iLAorICAgIFtBVkNPTF9TUENfUkVTRVJWRURdID0gInJlc2VydmVkIiwKKyAgICBbQVZDT0xfU1BDX0ZDQ10gPSAiZmNjIiwKKyAgICBbQVZDT0xfU1BDX0JUNDcwQkddID0gImJ0NDcwYmciLAorICAgIFtBVkNPTF9TUENfU01QVEUxNzBNXSA9ICJzbXB0ZTE3MG0iLAorICAgIFtBVkNPTF9TUENfU01QVEUyNDBNXSA9ICJzbXB0ZTI0MG0iLAorICAgIFtBVkNPTF9TUENfWUNHQ09dID0gInljZ2NvIiwKKyAgICBbQVZDT0xfU1BDX0JUMjAyMF9OQ0xdID0gImJ0MjAyMG5jIiwKKyAgICBbQVZDT0xfU1BDX0JUMjAyMF9DTF0gPSAiYnQyMDIwYyIsCisgICAgW0FWQ09MX1NQQ19TTVBURTIwODVdID0gInNtcHRlMjA4NSIsCisgICAgW0FWQ09MX1NQQ19DSFJPTUFfREVSSVZFRF9OQ0xdID0gImNocm9tYS1kZXJpdmVkLW5jIiwKKyAgICBbQVZDT0xfU1BDX0NIUk9NQV9ERVJJVkVEX0NMXSA9ICJjaHJvbWEtZGVyaXZlZC1jIiwKKyAgICBbQVZDT0xfU1BDX0lDVENQXSA9ICJpY3RjcCIsCiB9OwogCi1zdGF0aWMgY29uc3QgY2hhciAqY2hyb21hX2xvY2F0aW9uX25hbWVzW0FWQ0hST01BX0xPQ19OQl0gPSB7Ci0gICAgInVuc3BlY2lmaWVkIiwgImxlZnQiLCAiY2VudGVyIiwgInRvcGxlZnQiLAotICAgICJ0b3AiLCAiYm90dG9tbGVmdCIsICJib3R0b20iLAorc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjaHJvbWFfbG9jYXRpb25fbmFtZXNbXSA9IHsKKyAgICBbQVZDSFJPTUFfTE9DX1VOU1BFQ0lGSUVEXSA9ICJ1bnNwZWNpZmllZCIsCisgICAgW0FWQ0hST01BX0xPQ19MRUZUXSA9ICJsZWZ0IiwKKyAgICBbQVZDSFJPTUFfTE9DX0NFTlRFUl0gPSAiY2VudGVyIiwKKyAgICBbQVZDSFJPTUFfTE9DX1RPUExFRlRdID0gInRvcGxlZnQiLAorICAgIFtBVkNIUk9NQV9MT0NfVE9QXSA9ICJ0b3AiLAorICAgIFtBVkNIUk9NQV9MT0NfQk9UVE9NTEVGVF0gPSAiYm90dG9tbGVmdCIsCisgICAgW0FWQ0hST01BX0xPQ19CT1RUT01dID0gImJvdHRvbSIsCiB9OwogCi1GRl9ESVNBQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiBzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGdldF9waXhfZm10X2ludGVybmFsKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CkBAIC0yMTAzLDYgKzIzMDQsMTEgQEAKICAgICAgICAgc25wcmludGYobmFtZTIsIHNpemVvZihuYW1lMiksICIlcyVzIiwgbmFtZSwgWF9ORSgiYmUiLCAibGUiKSk7CiAgICAgICAgIHBpeF9mbXQgPSBnZXRfcGl4X2ZtdF9pbnRlcm5hbChuYW1lMik7CiAgICAgfQorCisjaWYgRkZfQVBJX1ZBQVBJCisgICAgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9OT05FICYmICFzdHJjbXAobmFtZSwgInZhYXBpIikpCisgICAgICAgIHBpeF9mbXQgPSBBVl9QSVhfRk1UX1ZBQVBJOworI2VuZGlmCiAgICAgcmV0dXJuIHBpeF9mbXQ7CiB9CiAKQEAgLTIyNDAsNyArMjQ0Niw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAoOCpjLT5zdGVwID49IGMtPmRlcHRoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc3RybmNtcChkLT5uYW1lLCAiYmF5ZXJfIiwgNikpCisgICAgICAgICAgICBpZiAoZC0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkFZRVIpCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICBhdl9yZWFkX2ltYWdlX2xpbmUodG1wLCAodm9pZCopZGF0YSwgbGluZXNpemUsIGQsIDAsIDAsIGosIDIsIDApOwogICAgICAgICAgICAgYXZfYXNzZXJ0MCh0bXBbMF0gPT0gMCAmJiB0bXBbMV0gPT0gMCk7CkBAIC0yMjQ5LDcgKzI0NTUsNiBAQAogICAgICAgICB9CiAgICAgfQogfQotRkZfRU5BQkxFX0RFUFJFQ0FUSU9OX1dBUk5JTkdTCiAKIAogZW51bSBBVlBpeGVsRm9ybWF0IGF2X3BpeF9mbXRfc3dhcF9lbmRpYW5uZXNzKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQpAQCAtMjI3NSw2ICsyNDgwLDcgQEAKICNkZWZpbmUgRkZfQ09MT1JfR1JBWSAgICAgMSAvKio8IGdyYXkgY29sb3Igc3BhY2UgKi8KICNkZWZpbmUgRkZfQ09MT1JfWVVWICAgICAgMiAvKio8IFlVViBjb2xvciBzcGFjZS4gMTYgPD0gWSA8PSAyMzUsIDE2IDw9IFUsIFYgPD0gMjQwICovCiAjZGVmaW5lIEZGX0NPTE9SX1lVVl9KUEVHIDMgLyoqPCBZVVYgY29sb3Igc3BhY2UuIDAgPD0gWSA8PSAyNTUsIDAgPD0gVSwgViA8PSAyNTUgKi8KKyNkZWZpbmUgRkZfQ09MT1JfWFlaICAgICAgNAogCiAjZGVmaW5lIHBpeGRlc2NfaGFzX2FscGhhKHBpeGRlc2MpIFwKICAgICAoKHBpeGRlc2MpLT5uYl9jb21wb25lbnRzID09IDIgfHwgKHBpeGRlc2MpLT5uYl9jb21wb25lbnRzID09IDQgfHwgKHBpeGRlc2MpLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QQUwpCkBAIC0yMjkwLDYgKzI0OTYsOSBAQAogICAgIGlmKGRlc2MtPm5hbWUgJiYgIXN0cm5jbXAoZGVzYy0+bmFtZSwgInl1dmoiLCA0KSkKICAgICAgICAgcmV0dXJuIEZGX0NPTE9SX1lVVl9KUEVHOwogCisgICAgaWYoZGVzYy0+bmFtZSAmJiAhc3RybmNtcChkZXNjLT5uYW1lLCAieHl6IiwgMykpCisgICAgICAgIHJldHVybiBGRl9DT0xPUl9YWVo7CisKICAgICBpZihkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19SR0IpCiAgICAgICAgIHJldHVybiAgRkZfQ09MT1JfUkdCOwogCkBAIC0yMzI4LDggKzI1MzcsMTYgQEAKICAgICBpbnQgcmV0LCBsb3NzLCBpLCBuYl9jb21wb25lbnRzOwogICAgIGludCBzY29yZSA9IElOVF9NQVggLSAxOwogCi0gICAgaWYgKGRzdF9waXhfZm10ID49IEFWX1BJWF9GTVRfTkIgfHwgZHN0X3BpeF9mbXQgPD0gQVZfUElYX0ZNVF9OT05FKQotICAgICAgICByZXR1cm4gfjA7CisgICAgaWYgKCFzcmNfZGVzYyB8fCAhZHN0X2Rlc2MpCisgICAgICAgIHJldHVybiAtNDsKKworICAgIGlmICgoc3JjX2Rlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpIHx8CisgICAgICAgIChkc3RfZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfSFdBQ0NFTCkpIHsKKyAgICAgICAgaWYgKGRzdF9waXhfZm10ID09IHNyY19waXhfZm10KQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgfQogCiAgICAgLyogY29tcHV0ZSBsb3NzICovCiAgICAgKmxvc3NwID0gbG9zcyA9IDA7CkBAIC0yMzM4LDkgKzI1NTUsOSBAQAogICAgICAgICByZXR1cm4gSU5UX01BWDsKIAogICAgIGlmICgocmV0ID0gZ2V0X3BpeF9mbXRfZGVwdGgoJnNyY19taW5fZGVwdGgsICZzcmNfbWF4X2RlcHRoLCBzcmNfcGl4X2ZtdCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0dXJuIC0zOwogICAgIGlmICgocmV0ID0gZ2V0X3BpeF9mbXRfZGVwdGgoJmRzdF9taW5fZGVwdGgsICZkc3RfbWF4X2RlcHRoLCBkc3RfcGl4X2ZtdCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0dXJuIC0zOwogCiAgICAgc3JjX2NvbG9yID0gZ2V0X2NvbG9yX3R5cGUoc3JjX2Rlc2MpOwogICAgIGRzdF9jb2xvciA9IGdldF9jb2xvcl90eXBlKGRzdF9kZXNjKTsKQEAgLTI0NDIsMjEgKzI2NTksMjcgQEAKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MyID0gYXZfcGl4X2ZtdF9kZXNjX2dldChkc3RfcGl4X2ZtdDIpOwogICAgIGludCBzY29yZTEsIHNjb3JlMjsKIAotICAgIGxvc3NfbWFzaz0gbG9zc19wdHI/fipsb3NzX3B0cjp+MDsgLyogdXNlIGxvc3MgbWFzayBpZiBwcm92aWRlZCAqLwotICAgIGlmKCFoYXNfYWxwaGEpCi0gICAgICAgIGxvc3NfbWFzayAmPSB+RkZfTE9TU19BTFBIQTsKLQotICAgIHNjb3JlMSA9IGdldF9waXhfZm10X3Njb3JlKGRzdF9waXhfZm10MSwgc3JjX3BpeF9mbXQsICZsb3NzMSwgbG9zc19tYXNrKTsKLSAgICBzY29yZTIgPSBnZXRfcGl4X2ZtdF9zY29yZShkc3RfcGl4X2ZtdDIsIHNyY19waXhfZm10LCAmbG9zczIsIGxvc3NfbWFzayk7Ci0KLSAgICBpZiAoc2NvcmUxID09IHNjb3JlMikgewotICAgICAgICBpZihhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MyKSAhPSBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MxKSkgewotICAgICAgICAgICAgZHN0X3BpeF9mbXQgPSBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MyKSA8IGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYzEpID8gZHN0X3BpeF9mbXQyIDogZHN0X3BpeF9mbXQxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0X3BpeF9mbXQgPSBkZXNjMi0+bmJfY29tcG9uZW50cyA8IGRlc2MxLT5uYl9jb21wb25lbnRzID8gZHN0X3BpeF9mbXQyIDogZHN0X3BpeF9mbXQxOwotICAgICAgICB9CisgICAgaWYgKCFkZXNjMSkgeworICAgICAgICBkc3RfcGl4X2ZtdCA9IGRzdF9waXhfZm10MjsKKyAgICB9IGVsc2UgaWYgKCFkZXNjMikgeworICAgICAgICBkc3RfcGl4X2ZtdCA9IGRzdF9waXhfZm10MTsKICAgICB9IGVsc2UgewotICAgICAgICBkc3RfcGl4X2ZtdCA9IHNjb3JlMSA8IHNjb3JlMiA/IGRzdF9waXhfZm10MiA6IGRzdF9waXhfZm10MTsKKyAgICAgICAgbG9zc19tYXNrPSBsb3NzX3B0cj9+Kmxvc3NfcHRyOn4wOyAvKiB1c2UgbG9zcyBtYXNrIGlmIHByb3ZpZGVkICovCisgICAgICAgIGlmKCFoYXNfYWxwaGEpCisgICAgICAgICAgICBsb3NzX21hc2sgJj0gfkZGX0xPU1NfQUxQSEE7CisKKyAgICAgICAgc2NvcmUxID0gZ2V0X3BpeF9mbXRfc2NvcmUoZHN0X3BpeF9mbXQxLCBzcmNfcGl4X2ZtdCwgJmxvc3MxLCBsb3NzX21hc2spOworICAgICAgICBzY29yZTIgPSBnZXRfcGl4X2ZtdF9zY29yZShkc3RfcGl4X2ZtdDIsIHNyY19waXhfZm10LCAmbG9zczIsIGxvc3NfbWFzayk7CisKKyAgICAgICAgaWYgKHNjb3JlMSA9PSBzY29yZTIpIHsKKyAgICAgICAgICAgIGlmKGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYzIpICE9IGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYzEpKSB7CisgICAgICAgICAgICAgICAgZHN0X3BpeF9mbXQgPSBhdl9nZXRfcGFkZGVkX2JpdHNfcGVyX3BpeGVsKGRlc2MyKSA8IGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYzEpID8gZHN0X3BpeF9mbXQyIDogZHN0X3BpeF9mbXQxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkc3RfcGl4X2ZtdCA9IGRlc2MyLT5uYl9jb21wb25lbnRzIDwgZGVzYzEtPm5iX2NvbXBvbmVudHMgPyBkc3RfcGl4X2ZtdDIgOiBkc3RfcGl4X2ZtdDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RfcGl4X2ZtdCA9IHNjb3JlMSA8IHNjb3JlMiA/IGRzdF9waXhfZm10MiA6IGRzdF9waXhfZm10MTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChsb3NzX3B0cikKQEAgLTI0NzAsNTUgKzI2OTMsOTEgQEAKICAgICAgICAgY29sb3JfcmFuZ2VfbmFtZXNbcmFuZ2VdIDogTlVMTDsKIH0KIAoraW50IGF2X2NvbG9yX3JhbmdlX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNvbG9yX3JhbmdlX25hbWVzKTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY29sb3JfcmFuZ2VfbmFtZXNbaV0pOworICAgICAgICBpZiAoIXN0cm5jbXAoY29sb3JfcmFuZ2VfbmFtZXNbaV0sIG5hbWUsIGxlbikpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCiBjb25zdCBjaGFyICphdl9jb2xvcl9wcmltYXJpZXNfbmFtZShlbnVtIEFWQ29sb3JQcmltYXJpZXMgcHJpbWFyaWVzKQogewogICAgIHJldHVybiAodW5zaWduZWQpIHByaW1hcmllcyA8IEFWQ09MX1BSSV9OQiA/CiAgICAgICAgIGNvbG9yX3ByaW1hcmllc19uYW1lc1twcmltYXJpZXNdIDogTlVMTDsKIH0KIAoraW50IGF2X2NvbG9yX3ByaW1hcmllc19mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjb2xvcl9wcmltYXJpZXNfbmFtZXMpOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihjb2xvcl9wcmltYXJpZXNfbmFtZXNbaV0pOworICAgICAgICBpZiAoIXN0cm5jbXAoY29sb3JfcHJpbWFyaWVzX25hbWVzW2ldLCBuYW1lLCBsZW4pKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKK30KKwogY29uc3QgY2hhciAqYXZfY29sb3JfdHJhbnNmZXJfbmFtZShlbnVtIEFWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljIHRyYW5zZmVyKQogewogICAgIHJldHVybiAodW5zaWduZWQpIHRyYW5zZmVyIDwgQVZDT0xfVFJDX05CID8KICAgICAgICAgY29sb3JfdHJhbnNmZXJfbmFtZXNbdHJhbnNmZXJdIDogTlVMTDsKIH0KIAoraW50IGF2X2NvbG9yX3RyYW5zZmVyX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNvbG9yX3RyYW5zZmVyX25hbWVzKTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY29sb3JfdHJhbnNmZXJfbmFtZXNbaV0pOworICAgICAgICBpZiAoIXN0cm5jbXAoY29sb3JfdHJhbnNmZXJfbmFtZXNbaV0sIG5hbWUsIGxlbikpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCiBjb25zdCBjaGFyICphdl9jb2xvcl9zcGFjZV9uYW1lKGVudW0gQVZDb2xvclNwYWNlIHNwYWNlKQogewogICAgIHJldHVybiAodW5zaWduZWQpIHNwYWNlIDwgQVZDT0xfU1BDX05CID8KICAgICAgICAgY29sb3Jfc3BhY2VfbmFtZXNbc3BhY2VdIDogTlVMTDsKIH0KIAoraW50IGF2X2NvbG9yX3NwYWNlX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKGNvbG9yX3NwYWNlX25hbWVzKTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY29sb3Jfc3BhY2VfbmFtZXNbaV0pOworICAgICAgICBpZiAoIXN0cm5jbXAoY29sb3Jfc3BhY2VfbmFtZXNbaV0sIG5hbWUsIGxlbikpCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCiBjb25zdCBjaGFyICphdl9jaHJvbWFfbG9jYXRpb25fbmFtZShlbnVtIEFWQ2hyb21hTG9jYXRpb24gbG9jYXRpb24pCiB7CiAgICAgcmV0dXJuICh1bnNpZ25lZCkgbG9jYXRpb24gPCBBVkNIUk9NQV9MT0NfTkIgPwogICAgICAgICBjaHJvbWFfbG9jYXRpb25fbmFtZXNbbG9jYXRpb25dIDogTlVMTDsKIH0KIAotI2lmZGVmIFRFU1QKLQotaW50IG1haW4odm9pZCl7CitpbnQgYXZfY2hyb21hX2xvY2F0aW9uX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKQorewogICAgIGludCBpOwotICAgIGludCBlcnI9MDsKLSAgICBpbnQgc2tpcCA9IDA7CiAKLSAgICBmb3IgKGk9MDsgaTxBVl9QSVhfRk1UX05CKjI7IGkrKykgewotICAgICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGkpOwotICAgICAgICBpZighZGVzYyB8fCAhZGVzYy0+bmFtZSkgewotICAgICAgICAgICAgc2tpcCArKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChza2lwKSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICIlM2QgdW51c2VkIHBpeGVsIGZvcm1hdCB2YWx1ZXNcbiIsIHNraXApOwotICAgICAgICAgICAgc2tpcCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAicGl4IGZtdCAlcyBhdmdfYnBwOiVkIGNvbG9ydHlwZTolZFxuIiwgZGVzYy0+bmFtZSwgYXZfZ2V0X3BhZGRlZF9iaXRzX3Blcl9waXhlbChkZXNjKSwgZ2V0X2NvbG9yX3R5cGUoZGVzYykpOwotICAgICAgICBpZiAoKCEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQUxQSEEpKSAhPSAoZGVzYy0+bmJfY29tcG9uZW50cyAhPSAyICYmIGRlc2MtPm5iX2NvbXBvbmVudHMgIT0gNCkpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJBbHBoYSBmbGFnIG1pc21hdGNoXG4iKTsKLSAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoY2hyb21hX2xvY2F0aW9uX25hbWVzKTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY2hyb21hX2xvY2F0aW9uX25hbWVzW2ldKTsKKyAgICAgICAgaWYgKCFzdHJuY21wKGNocm9tYV9sb2NhdGlvbl9uYW1lc1tpXSwgbmFtZSwgbGVuKSkKKyAgICAgICAgICAgIHJldHVybiBpOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKIH0KLQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9waXhkZXNjLmggYi9saWJhdnV0aWwvcGl4ZGVzYy5oCmluZGV4IGIxZDIxOGQuLjFhYjM3MjcgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9waXhkZXNjLmgKKysrIGIvbGliYXZ1dGlsL3BpeGRlc2MuaApAQCAtODUsMTYgKzg1LDE2IEBACiAgICAgLyoqCiAgICAgICogQW1vdW50IHRvIHNoaWZ0IHRoZSBsdW1hIHdpZHRoIHJpZ2h0IHRvIGZpbmQgdGhlIGNocm9tYSB3aWR0aC4KICAgICAgKiBGb3IgWVYxMiB0aGlzIGlzIDEgZm9yIGV4YW1wbGUuCi0gICAgICogY2hyb21hX3dpZHRoID0gLSgoLWx1bWFfd2lkdGgpID4+IGxvZzJfY2hyb21hX3cpCisgICAgICogY2hyb21hX3dpZHRoID0gQVZfQ0VJTF9SU0hJRlQobHVtYV93aWR0aCwgbG9nMl9jaHJvbWFfdykKICAgICAgKiBUaGUgbm90ZSBhYm92ZSBpcyBuZWVkZWQgdG8gZW5zdXJlIHJvdW5kaW5nIHVwLgogICAgICAqIFRoaXMgdmFsdWUgb25seSByZWZlcnMgdG8gdGhlIGNocm9tYSBjb21wb25lbnRzLgogICAgICAqLwotICAgIHVpbnQ4X3QgbG9nMl9jaHJvbWFfdzsgIC8vLzwgY2hyb21hX3dpZHRoID0gLSgoLWx1bWFfd2lkdGggKT4+bG9nMl9jaHJvbWFfdykKKyAgICB1aW50OF90IGxvZzJfY2hyb21hX3c7CiAKICAgICAvKioKICAgICAgKiBBbW91bnQgdG8gc2hpZnQgdGhlIGx1bWEgaGVpZ2h0IHJpZ2h0IHRvIGZpbmQgdGhlIGNocm9tYSBoZWlnaHQuCiAgICAgICogRm9yIFlWMTIgdGhpcyBpcyAxIGZvciBleGFtcGxlLgotICAgICAqIGNocm9tYV9oZWlnaHQ9IC0oKC1sdW1hX2hlaWdodCkgPj4gbG9nMl9jaHJvbWFfaCkKKyAgICAgKiBjaHJvbWFfaGVpZ2h0PSBBVl9DRUlMX1JTSElGVChsdW1hX2hlaWdodCwgbG9nMl9jaHJvbWFfaCkKICAgICAgKiBUaGUgbm90ZSBhYm92ZSBpcyBuZWVkZWQgdG8gZW5zdXJlIHJvdW5kaW5nIHVwLgogICAgICAqIFRoaXMgdmFsdWUgb25seSByZWZlcnMgdG8gdGhlIGNocm9tYSBjb21wb25lbnRzLgogICAgICAqLwpAQCAtMTU0LDYgKzE1NCwxNCBAQAogICogaW4gc29tZSBjYXNlcyBiZSBzaW1wbGVyLiBPciB0aGUgZGF0YSBjYW4gYmUgaW50ZXJwcmV0ZWQgcHVyZWx5IGJhc2VkIG9uCiAgKiB0aGUgcGl4ZWwgZm9ybWF0IHdpdGhvdXQgdXNpbmcgdGhlIHBhbGV0dGUuCiAgKiBBbiBleGFtcGxlIG9mIGEgcHNldWRvLXBhbGV0dGVkIGZvcm1hdCBpcyBBVl9QSVhfRk1UX0dSQVk4CisgKgorICogQGRlcHJlY2F0ZWQgVGhpcyBmbGFnIGlzIGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGJlIHJlbW92ZWQuIFdoZW4gaXQgaXMgcmVtb3ZlZCwKKyAqIHRoZSBleHRyYSBwYWxldHRlIGFsbG9jYXRpb24gaW4gQVZGcmFtZS5kYXRhWzFdIGlzIHJlbW92ZWQgYXMgd2VsbC4gT25seQorICogYWN0dWFsIHBhbGV0dGVkIGZvcm1hdHMgKGFzIGluZGljYXRlZCBieSBBVl9QSVhfRk1UX0ZMQUdfUEFMKSB3aWxsIGhhdmUgYQorICogcGFsZXR0ZS4gU3RhcnRpbmcgd2l0aCBGRm1wZWcgdmVyc2lvbnMgd2hpY2ggaGF2ZSB0aGlzIGZsYWcgZGVwcmVjYXRlZCwgdGhlCisgKiBleHRyYSAicHNldWRvIiBwYWxldHRlIGlzIGFscmVhZHkgaWdub3JlZCwgYW5kIEFQSSB1c2VycyBhcmUgbm90IHJlcXVpcmVkIHRvCisgKiBhbGxvY2F0ZSBhIHBhbGV0dGUgZm9yIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwgZm9ybWF0cyAoaXQgd2FzIHJlcXVpcmVkCisgKiBiZWZvcmUgdGhlIGRlcHJlY2F0aW9uLCB0aG91Z2gpLgogICovCiAjZGVmaW5lIEFWX1BJWF9GTVRfRkxBR19QU0VVRE9QQUwgICAgKDEgPDwgNikKIApAQCAtMTczLDc2ICsxODEsMTUgQEAKICNkZWZpbmUgQVZfUElYX0ZNVF9GTEFHX0FMUEhBICAgICAgICAoMSA8PCA3KQogCiAvKioKLSAqIFJlYWQgYSBsaW5lIGZyb20gYW4gaW1hZ2UsIGFuZCB3cml0ZSB0aGUgdmFsdWVzIG9mIHRoZQotICogcGl4ZWwgZm9ybWF0IGNvbXBvbmVudCBjIHRvIGRzdC4KLSAqCi0gKiBAcGFyYW0gZGF0YSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgcG9pbnRlcnMgdG8gdGhlIHBsYW5lcyBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBsaW5lc2l6ZSB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgbGluZXNpemVzIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGRlc2MgdGhlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UKLSAqIEBwYXJhbSB4IHRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IHBpeGVsIHRvIHJlYWQKLSAqIEBwYXJhbSB5IHRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwaXhlbCB0byByZWFkCi0gKiBAcGFyYW0gdyB0aGUgd2lkdGggb2YgdGhlIGxpbmUgdG8gcmVhZCwgdGhhdCBpcyB0aGUgbnVtYmVyIG9mCi0gKiB2YWx1ZXMgdG8gd3JpdGUgdG8gZHN0Ci0gKiBAcGFyYW0gcmVhZF9wYWxfY29tcG9uZW50IGlmIG5vdCB6ZXJvIGFuZCB0aGUgZm9ybWF0IGlzIGEgcGFsZXR0ZWQKLSAqIGZvcm1hdCB3cml0ZXMgdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwYWxldHRlCi0gKiBjb21wb25lbnQgYyBpbiBkYXRhWzFdIHRvIGRzdCwgcmF0aGVyIHRoYW4gdGhlIHBhbGV0dGUgaW5kZXhlcyBpbgotICogZGF0YVswXS4gVGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiB0aGUgZm9ybWF0IGlzIG5vdCBwYWxldHRlZC4KKyAqIFRoZSBwaXhlbCBmb3JtYXQgaXMgZm9sbG93aW5nIGEgQmF5ZXIgcGF0dGVybgogICovCi12b2lkIGF2X3JlYWRfaW1hZ2VfbGluZSh1aW50MTZfdCAqZHN0LCBjb25zdCB1aW50OF90ICpkYXRhWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbmVzaXplWzRdLCBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCBjLCBpbnQgdywgaW50IHJlYWRfcGFsX2NvbXBvbmVudCk7CisjZGVmaW5lIEFWX1BJWF9GTVRfRkxBR19CQVlFUiAgICAgICAgKDEgPDwgOCkKIAogLyoqCi0gKiBXcml0ZSB0aGUgdmFsdWVzIGZyb20gc3JjIHRvIHRoZSBwaXhlbCBmb3JtYXQgY29tcG9uZW50IGMgb2YgYW4KLSAqIGltYWdlIGxpbmUuCi0gKgotICogQHBhcmFtIHNyYyBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgdG8gd3JpdGUKLSAqIEBwYXJhbSBkYXRhIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBwb2ludGVycyB0byB0aGUgcGxhbmVzIG9mIHRoZQotICogaW1hZ2UgdG8gd3JpdGUgaW50by4gSXQgaXMgc3VwcG9zZWQgdG8gYmUgemVyb2VkLgotICogQHBhcmFtIGxpbmVzaXplIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBsaW5lc2l6ZXMgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gZGVzYyB0aGUgcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZQotICogQHBhcmFtIHggdGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gd3JpdGUKLSAqIEBwYXJhbSB5IHRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwaXhlbCB0byB3cml0ZQotICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHRvIHdyaXRlLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YKLSAqIHZhbHVlcyB0byB3cml0ZSB0byB0aGUgaW1hZ2UgbGluZQorICogVGhlIHBpeGVsIGZvcm1hdCBjb250YWlucyBJRUVFLTc1NCBmbG9hdGluZyBwb2ludCB2YWx1ZXMuIFByZWNpc2lvbiAoZG91YmxlLAorICogc2luZ2xlLCBvciBoYWxmKSBzaG91bGQgYmUgZGV0ZXJtaW5lZCBieSB0aGUgcGl4ZWwgc2l6ZSAoNjQsIDMyLCBvciAxNiBiaXRzKS4KICAqLwotdm9pZCBhdl93cml0ZV9pbWFnZV9saW5lKGNvbnN0IHVpbnQxNl90ICpzcmMsIHVpbnQ4X3QgKmRhdGFbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGxpbmVzaXplWzRdLCBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5LCBpbnQgYywgaW50IHcpOwotCi0vKioKLSAqIFJldHVybiB0aGUgcGl4ZWwgZm9ybWF0IGNvcnJlc3BvbmRpbmcgdG8gbmFtZS4KLSAqCi0gKiBJZiB0aGVyZSBpcyBubyBwaXhlbCBmb3JtYXQgd2l0aCBuYW1lIG5hbWUsIHRoZW4gbG9va3MgZm9yIGEKLSAqIHBpeGVsIGZvcm1hdCB3aXRoIHRoZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hdGl2ZSBlbmRpYW4KLSAqIGZvcm1hdCBvZiBuYW1lLgotICogRm9yIGV4YW1wbGUgaW4gYSBsaXR0bGUtZW5kaWFuIHN5c3RlbSwgZmlyc3QgbG9va3MgZm9yICJncmF5MTYiLAotICogdGhlbiBmb3IgImdyYXkxNmxlIi4KLSAqCi0gKiBGaW5hbGx5IGlmIG5vIHBpeGVsIGZvcm1hdCBoYXMgYmVlbiBmb3VuZCwgcmV0dXJucyBBVl9QSVhfRk1UX05PTkUuCi0gKi8KLWVudW0gQVZQaXhlbEZvcm1hdCBhdl9nZXRfcGl4X2ZtdChjb25zdCBjaGFyICpuYW1lKTsKLQotLyoqCi0gKiBSZXR1cm4gdGhlIHNob3J0IG5hbWUgZm9yIGEgcGl4ZWwgZm9ybWF0LCBOVUxMIGluIGNhc2UgcGl4X2ZtdCBpcwotICogdW5rbm93bi4KLSAqCi0gKiBAc2VlIGF2X2dldF9waXhfZm10KCksIGF2X2dldF9waXhfZm10X3N0cmluZygpCi0gKi8KLWNvbnN0IGNoYXIgKmF2X2dldF9waXhfZm10X25hbWUoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpOwotCi0vKioKLSAqIFByaW50IGluIGJ1ZiB0aGUgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpeGVsIGZvcm1hdCB3aXRoCi0gKiBudW1iZXIgcGl4X2ZtdCwgb3IgYSBoZWFkZXIgaWYgcGl4X2ZtdCBpcyBuZWdhdGl2ZS4KLSAqCi0gKiBAcGFyYW0gYnVmIHRoZSBidWZmZXIgd2hlcmUgdG8gd3JpdGUgdGhlIHN0cmluZwotICogQHBhcmFtIGJ1Zl9zaXplIHRoZSBzaXplIG9mIGJ1ZgotICogQHBhcmFtIHBpeF9mbXQgdGhlIG51bWJlciBvZiB0aGUgcGl4ZWwgZm9ybWF0IHRvIHByaW50IHRoZQotICogY29ycmVzcG9uZGluZyBpbmZvIHN0cmluZywgb3IgYSBuZWdhdGl2ZSB2YWx1ZSB0byBwcmludCB0aGUKLSAqIGNvcnJlc3BvbmRpbmcgaGVhZGVyLgotICovCi1jaGFyICphdl9nZXRfcGl4X2ZtdF9zdHJpbmcoY2hhciAqYnVmLCBpbnQgYnVmX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpOworI2RlZmluZSBBVl9QSVhfRk1UX0ZMQUdfRkxPQVQgICAgICAgICgxIDw8IDkpCiAKIC8qKgogICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgdXNlZCBieSB0aGUgcGl4ZWwgZm9ybWF0CkBAIC0yODYsMTEgKzIzMyw2IEBACiAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGFjY2VzcyBsb2cyX2Nocm9tYV93IGxvZzJfY2hyb21hX2ggZnJvbQogICogdGhlIHBpeGVsIGZvcm1hdCBBVlBpeEZtdERlc2NyaXB0b3IuCiAgKgotICogU2VlIGF2X2dldF9jaHJvbWFfc3ViX3NhbXBsZSgpIGZvciBhIGZ1bmN0aW9uIHRoYXQgYXNzZXJ0cyBhCi0gKiB2YWxpZCBwaXhlbCBmb3JtYXQgaW5zdGVhZCBvZiByZXR1cm5pbmcgYW4gZXJyb3IgY29kZS4KLSAqIEl0cyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UgYXZjb2RlY19nZXRfY2hyb21hX3N1Yl9zYW1wbGUgdW5sZXNzCi0gKiB5b3UgZG8gY2hlY2sgdGhlIHJldHVybiBjb2RlIQotICoKICAqIEBwYXJhbVtpbl0gIHBpeF9mbXQgdGhlIHBpeGVsIGZvcm1hdAogICogQHBhcmFtW291dF0gaF9zaGlmdCBzdG9yZSBsb2cyX2Nocm9tYV93IChob3Jpem9udGFsL3dpZHRoIHNoaWZ0KQogICogQHBhcmFtW291dF0gdl9zaGlmdCBzdG9yZSBsb2cyX2Nocm9tYV9oICh2ZXJ0aWNhbC9oZWlnaHQgc2hpZnQpCkBAIC0zMDcsNiArMjQ5LDEyOCBAQAogaW50IGF2X3BpeF9mbXRfY291bnRfcGxhbmVzKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKIAogLyoqCisgKiBAcmV0dXJuIHRoZSBuYW1lIGZvciBwcm92aWRlZCBjb2xvciByYW5nZSBvciBOVUxMIGlmIHVua25vd24uCisgKi8KK2NvbnN0IGNoYXIgKmF2X2NvbG9yX3JhbmdlX25hbWUoZW51bSBBVkNvbG9yUmFuZ2UgcmFuZ2UpOworCisvKioKKyAqIEByZXR1cm4gdGhlIEFWQ29sb3JSYW5nZSB2YWx1ZSBmb3IgbmFtZSBvciBhbiBBVkVycm9yIGlmIG5vdCBmb3VuZC4KKyAqLworaW50IGF2X2NvbG9yX3JhbmdlX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBAcmV0dXJuIHRoZSBuYW1lIGZvciBwcm92aWRlZCBjb2xvciBwcmltYXJpZXMgb3IgTlVMTCBpZiB1bmtub3duLgorICovCitjb25zdCBjaGFyICphdl9jb2xvcl9wcmltYXJpZXNfbmFtZShlbnVtIEFWQ29sb3JQcmltYXJpZXMgcHJpbWFyaWVzKTsKKworLyoqCisgKiBAcmV0dXJuIHRoZSBBVkNvbG9yUHJpbWFyaWVzIHZhbHVlIGZvciBuYW1lIG9yIGFuIEFWRXJyb3IgaWYgbm90IGZvdW5kLgorICovCitpbnQgYXZfY29sb3JfcHJpbWFyaWVzX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBAcmV0dXJuIHRoZSBuYW1lIGZvciBwcm92aWRlZCBjb2xvciB0cmFuc2ZlciBvciBOVUxMIGlmIHVua25vd24uCisgKi8KK2NvbnN0IGNoYXIgKmF2X2NvbG9yX3RyYW5zZmVyX25hbWUoZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyB0cmFuc2Zlcik7CisKKy8qKgorICogQHJldHVybiB0aGUgQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgdmFsdWUgZm9yIG5hbWUgb3IgYW4gQVZFcnJvciBpZiBub3QgZm91bmQuCisgKi8KK2ludCBhdl9jb2xvcl90cmFuc2Zlcl9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogQHJldHVybiB0aGUgbmFtZSBmb3IgcHJvdmlkZWQgY29sb3Igc3BhY2Ugb3IgTlVMTCBpZiB1bmtub3duLgorICovCitjb25zdCBjaGFyICphdl9jb2xvcl9zcGFjZV9uYW1lKGVudW0gQVZDb2xvclNwYWNlIHNwYWNlKTsKKworLyoqCisgKiBAcmV0dXJuIHRoZSBBVkNvbG9yU3BhY2UgdmFsdWUgZm9yIG5hbWUgb3IgYW4gQVZFcnJvciBpZiBub3QgZm91bmQuCisgKi8KK2ludCBhdl9jb2xvcl9zcGFjZV9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogQHJldHVybiB0aGUgbmFtZSBmb3IgcHJvdmlkZWQgY2hyb21hIGxvY2F0aW9uIG9yIE5VTEwgaWYgdW5rbm93bi4KKyAqLworY29uc3QgY2hhciAqYXZfY2hyb21hX2xvY2F0aW9uX25hbWUoZW51bSBBVkNocm9tYUxvY2F0aW9uIGxvY2F0aW9uKTsKKworLyoqCisgKiBAcmV0dXJuIHRoZSBBVkNocm9tYUxvY2F0aW9uIHZhbHVlIGZvciBuYW1lIG9yIGFuIEFWRXJyb3IgaWYgbm90IGZvdW5kLgorICovCitpbnQgYXZfY2hyb21hX2xvY2F0aW9uX2Zyb21fbmFtZShjb25zdCBjaGFyICpuYW1lKTsKKworLyoqCisgKiBSZXR1cm4gdGhlIHBpeGVsIGZvcm1hdCBjb3JyZXNwb25kaW5nIHRvIG5hbWUuCisgKgorICogSWYgdGhlcmUgaXMgbm8gcGl4ZWwgZm9ybWF0IHdpdGggbmFtZSBuYW1lLCB0aGVuIGxvb2tzIGZvciBhCisgKiBwaXhlbCBmb3JtYXQgd2l0aCB0aGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYXRpdmUgZW5kaWFuCisgKiBmb3JtYXQgb2YgbmFtZS4KKyAqIEZvciBleGFtcGxlIGluIGEgbGl0dGxlLWVuZGlhbiBzeXN0ZW0sIGZpcnN0IGxvb2tzIGZvciAiZ3JheTE2IiwKKyAqIHRoZW4gZm9yICJncmF5MTZsZSIuCisgKgorICogRmluYWxseSBpZiBubyBwaXhlbCBmb3JtYXQgaGFzIGJlZW4gZm91bmQsIHJldHVybnMgQVZfUElYX0ZNVF9OT05FLgorICovCitlbnVtIEFWUGl4ZWxGb3JtYXQgYXZfZ2V0X3BpeF9mbXQoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogUmV0dXJuIHRoZSBzaG9ydCBuYW1lIGZvciBhIHBpeGVsIGZvcm1hdCwgTlVMTCBpbiBjYXNlIHBpeF9mbXQgaXMKKyAqIHVua25vd24uCisgKgorICogQHNlZSBhdl9nZXRfcGl4X2ZtdCgpLCBhdl9nZXRfcGl4X2ZtdF9zdHJpbmcoKQorICovCitjb25zdCBjaGFyICphdl9nZXRfcGl4X2ZtdF9uYW1lKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKKworLyoqCisgKiBQcmludCBpbiBidWYgdGhlIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwaXhlbCBmb3JtYXQgd2l0aAorICogbnVtYmVyIHBpeF9mbXQsIG9yIGEgaGVhZGVyIGlmIHBpeF9mbXQgaXMgbmVnYXRpdmUuCisgKgorICogQHBhcmFtIGJ1ZiB0aGUgYnVmZmVyIHdoZXJlIHRvIHdyaXRlIHRoZSBzdHJpbmcKKyAqIEBwYXJhbSBidWZfc2l6ZSB0aGUgc2l6ZSBvZiBidWYKKyAqIEBwYXJhbSBwaXhfZm10IHRoZSBudW1iZXIgb2YgdGhlIHBpeGVsIGZvcm1hdCB0byBwcmludCB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgaW5mbyBzdHJpbmcsIG9yIGEgbmVnYXRpdmUgdmFsdWUgdG8gcHJpbnQgdGhlCisgKiBjb3JyZXNwb25kaW5nIGhlYWRlci4KKyAqLworY2hhciAqYXZfZ2V0X3BpeF9mbXRfc3RyaW5nKGNoYXIgKmJ1ZiwgaW50IGJ1Zl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKKworLyoqCisgKiBSZWFkIGEgbGluZSBmcm9tIGFuIGltYWdlLCBhbmQgd3JpdGUgdGhlIHZhbHVlcyBvZiB0aGUKKyAqIHBpeGVsIGZvcm1hdCBjb21wb25lbnQgYyB0byBkc3QuCisgKgorICogQHBhcmFtIGRhdGEgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIHBvaW50ZXJzIHRvIHRoZSBwbGFuZXMgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gbGluZXNpemUgdGhlIGFycmF5IGNvbnRhaW5pbmcgdGhlIGxpbmVzaXplcyBvZiB0aGUgaW1hZ2UKKyAqIEBwYXJhbSBkZXNjIHRoZSBwaXhlbCBmb3JtYXQgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlCisgKiBAcGFyYW0geCB0aGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwaXhlbCB0byByZWFkCisgKiBAcGFyYW0geSB0aGUgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gcmVhZAorICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHRvIHJlYWQsIHRoYXQgaXMgdGhlIG51bWJlciBvZgorICogdmFsdWVzIHRvIHdyaXRlIHRvIGRzdAorICogQHBhcmFtIHJlYWRfcGFsX2NvbXBvbmVudCBpZiBub3QgemVybyBhbmQgdGhlIGZvcm1hdCBpcyBhIHBhbGV0dGVkCisgKiBmb3JtYXQgd3JpdGVzIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgcGFsZXR0ZQorICogY29tcG9uZW50IGMgaW4gZGF0YVsxXSB0byBkc3QsIHJhdGhlciB0aGFuIHRoZSBwYWxldHRlIGluZGV4ZXMgaW4KKyAqIGRhdGFbMF0uIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgdGhlIGZvcm1hdCBpcyBub3QgcGFsZXR0ZWQuCisgKi8KK3ZvaWQgYXZfcmVhZF9pbWFnZV9saW5lKHVpbnQxNl90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKmRhdGFbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGluZXNpemVbNF0sIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwgaW50IGMsIGludCB3LCBpbnQgcmVhZF9wYWxfY29tcG9uZW50KTsKKworLyoqCisgKiBXcml0ZSB0aGUgdmFsdWVzIGZyb20gc3JjIHRvIHRoZSBwaXhlbCBmb3JtYXQgY29tcG9uZW50IGMgb2YgYW4KKyAqIGltYWdlIGxpbmUuCisgKgorICogQHBhcmFtIHNyYyBhcnJheSBjb250YWluaW5nIHRoZSB2YWx1ZXMgdG8gd3JpdGUKKyAqIEBwYXJhbSBkYXRhIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBwb2ludGVycyB0byB0aGUgcGxhbmVzIG9mIHRoZQorICogaW1hZ2UgdG8gd3JpdGUgaW50by4gSXQgaXMgc3VwcG9zZWQgdG8gYmUgemVyb2VkLgorICogQHBhcmFtIGxpbmVzaXplIHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBsaW5lc2l6ZXMgb2YgdGhlIGltYWdlCisgKiBAcGFyYW0gZGVzYyB0aGUgcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZQorICogQHBhcmFtIHggdGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSBvZiB0aGUgZmlyc3QgcGl4ZWwgdG8gd3JpdGUKKyAqIEBwYXJhbSB5IHRoZSB2ZXJ0aWNhbCBjb29yZGluYXRlIG9mIHRoZSBmaXJzdCBwaXhlbCB0byB3cml0ZQorICogQHBhcmFtIHcgdGhlIHdpZHRoIG9mIHRoZSBsaW5lIHRvIHdyaXRlLCB0aGF0IGlzIHRoZSBudW1iZXIgb2YKKyAqIHZhbHVlcyB0byB3cml0ZSB0byB0aGUgaW1hZ2UgbGluZQorICovCit2b2lkIGF2X3dyaXRlX2ltYWdlX2xpbmUoY29uc3QgdWludDE2X3QgKnNyYywgdWludDhfdCAqZGF0YVs0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbGluZXNpemVbNF0sIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksIGludCBjLCBpbnQgdyk7CisKKy8qKgogICogVXRpbGl0eSBmdW5jdGlvbiB0byBzd2FwIHRoZSBlbmRpYW5uZXNzIG9mIGEgcGl4ZWwgZm9ybWF0LgogICoKICAqIEBwYXJhbVtpbl0gIHBpeF9mbXQgdGhlIHBpeGVsIGZvcm1hdApAQCAtMzY2LDI5ICs0MzAsNCBAQAogZW51bSBBVlBpeGVsRm9ybWF0IGF2X2ZpbmRfYmVzdF9waXhfZm10X29mXzIoZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MSwgZW51bSBBVlBpeGVsRm9ybWF0IGRzdF9waXhfZm10MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNfcGl4X2ZtdCwgaW50IGhhc19hbHBoYSwgaW50ICpsb3NzX3B0cik7CiAKLS8qKgotICogQHJldHVybiB0aGUgbmFtZSBmb3IgcHJvdmlkZWQgY29sb3IgcmFuZ2Ugb3IgTlVMTCBpZiB1bmtub3duLgotICovCi1jb25zdCBjaGFyICphdl9jb2xvcl9yYW5nZV9uYW1lKGVudW0gQVZDb2xvclJhbmdlIHJhbmdlKTsKLQotLyoqCi0gKiBAcmV0dXJuIHRoZSBuYW1lIGZvciBwcm92aWRlZCBjb2xvciBwcmltYXJpZXMgb3IgTlVMTCBpZiB1bmtub3duLgotICovCi1jb25zdCBjaGFyICphdl9jb2xvcl9wcmltYXJpZXNfbmFtZShlbnVtIEFWQ29sb3JQcmltYXJpZXMgcHJpbWFyaWVzKTsKLQotLyoqCi0gKiBAcmV0dXJuIHRoZSBuYW1lIGZvciBwcm92aWRlZCBjb2xvciB0cmFuc2ZlciBvciBOVUxMIGlmIHVua25vd24uCi0gKi8KLWNvbnN0IGNoYXIgKmF2X2NvbG9yX3RyYW5zZmVyX25hbWUoZW51bSBBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYyB0cmFuc2Zlcik7Ci0KLS8qKgotICogQHJldHVybiB0aGUgbmFtZSBmb3IgcHJvdmlkZWQgY29sb3Igc3BhY2Ugb3IgTlVMTCBpZiB1bmtub3duLgotICovCi1jb25zdCBjaGFyICphdl9jb2xvcl9zcGFjZV9uYW1lKGVudW0gQVZDb2xvclNwYWNlIHNwYWNlKTsKLQotLyoqCi0gKiBAcmV0dXJuIHRoZSBuYW1lIGZvciBwcm92aWRlZCBjaHJvbWEgbG9jYXRpb24gb3IgTlVMTCBpZiB1bmtub3duLgotICovCi1jb25zdCBjaGFyICphdl9jaHJvbWFfbG9jYXRpb25fbmFtZShlbnVtIEFWQ2hyb21hTG9jYXRpb24gbG9jYXRpb24pOwotCiAjZW5kaWYgLyogQVZVVElMX1BJWERFU0NfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3BpeGVsdXRpbHMuYyBiL2xpYmF2dXRpbC9waXhlbHV0aWxzLmMKaW5kZXggMWVjNGZiYi4uYjY2MzAyNyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3BpeGVsdXRpbHMuYworKysgYi9saWJhdnV0aWwvcGl4ZWx1dGlscy5jCkBAIC04NSwxMzggKzg1LDMgQEAKICAgICByZXR1cm4gc2FkW3dfYml0cyAtIDFdOwogI2VuZGlmCiB9Ci0KLSNpZmRlZiBURVNUCi0jZGVmaW5lIFcxIDMyMAotI2RlZmluZSBIMSAyNDAKLSNkZWZpbmUgVzIgNjQwCi0jZGVmaW5lIEgyIDQ4MAotCi1zdGF0aWMgaW50IHJ1bl9zaW5nbGVfdGVzdChjb25zdCBjaGFyICp0ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYmxvY2sxLCBwdHJkaWZmX3Qgc3RyaWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJsb2NrMiwgcHRyZGlmZl90IHN0cmlkZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxpZ24sIGludCBuKQotewotICAgIGludCBvdXQsIHJlZjsKLSAgICBhdl9waXhlbHV0aWxzX3NhZF9mbiBmX3JlZiA9IHNhZF9jW24gLSAxXTsKLSAgICBhdl9waXhlbHV0aWxzX3NhZF9mbiBmX291dCA9IGF2X3BpeGVsdXRpbHNfZ2V0X3NhZF9mbihuLCBuLCBhbGlnbiwgTlVMTCk7Ci0KLSAgICBzd2l0Y2ggKGFsaWduKSB7Ci0gICAgY2FzZSAwOiBibG9jazErKzsgYmxvY2syKys7IGJyZWFrOwotICAgIGNhc2UgMTogICAgICAgICAgIGJsb2NrMisrOyBicmVhazsKLSAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgb3V0ID0gZl9vdXQoYmxvY2sxLCBzdHJpZGUxLCBibG9jazIsIHN0cmlkZTIpOwotICAgIHJlZiA9IGZfcmVmKGJsb2NrMSwgc3RyaWRlMSwgYmxvY2syLCBzdHJpZGUyKTsKLSAgICBwcmludGYoIlslc10gWyVjJWNdIFNBRCBbJXNdICVkeCVkPSVkIHJlZj0lZFxuIiwKLSAgICAgICAgICAgb3V0ID09IHJlZiA/ICJPSyIgOiAiRkFJTCIsCi0gICAgICAgICAgIGFsaWduID8gJ0EnIDogJ1UnLCBhbGlnbiA9PSAyID8gJ0EnIDogJ1UnLAotICAgICAgICAgICB0ZXN0LCAxPDxuLCAxPDxuLCBvdXQsIHJlZik7Ci0gICAgcmV0dXJuIG91dCAhPSByZWY7Ci19Ci0KLXN0YXRpYyBpbnQgcnVuX3Rlc3QoY29uc3QgY2hhciAqdGVzdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYjEsIGNvbnN0IHVpbnQ4X3QgKmIyKQotewotICAgIGludCBpLCBhLCByZXQgPSAwOwotCi0gICAgZm9yIChhID0gMDsgYSA8IDM7IGErKykgewotICAgICAgICBjb25zdCB1aW50OF90ICpibG9jazEgPSBiMTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqYmxvY2syID0gYjI7Ci0KLSAgICAgICAgc3dpdGNoIChhKSB7Ci0gICAgICAgIGNhc2UgMDogYmxvY2sxKys7IGJsb2NrMisrOyBicmVhazsKLSAgICAgICAgY2FzZSAxOiAgICAgICAgICAgYmxvY2syKys7IGJyZWFrOwotICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMTsgaSA8PSBGRl9BUlJBWV9FTEVNUyhzYWRfYyk7IGkrKykgewotICAgICAgICAgICAgaW50IHIgPSBydW5fc2luZ2xlX3Rlc3QodGVzdCwgYjEsIFcxLCBiMiwgVzIsIGEsIGkpOwotICAgICAgICAgICAgaWYgKHIpCi0gICAgICAgICAgICAgICAgcmV0ID0gcjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCBpLCBhbGlnbiwgcmV0OwotICAgIHVpbnQ4X3QgKmJ1ZjEgPSBhdl9tYWxsb2MoVzEqSDEpOwotICAgIHVpbnQ4X3QgKmJ1ZjIgPSBhdl9tYWxsb2MoVzIqSDIpOwotICAgIHVpbnQzMl90IHN0YXRlID0gMDsKLQotICAgIGlmICghYnVmMSB8fCAhYnVmMikgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlXG4iKTsKLSAgICAgICAgcmV0ID0gMTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotCi0gICAgZmZfY2hlY2tfcGl4Zm10X2Rlc2NyaXB0b3JzKCk7Ci0KLSNkZWZpbmUgUkFORE9NX0lOSVQoYnVmLCBzaXplKSBkbyB7ICAgICAgICAgICAgIFwKLSAgICBpbnQgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGsgPSAwOyBrIDwgc2l6ZTsgaysrKSB7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3RhdGUgPSBzdGF0ZSAqIDE2NjQ1MjUgKyAxMDEzOTA0MjIzOyAgIFwKLSAgICAgICAgYnVmW2tdID0gc3RhdGU+PjI0OyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLSAgICAvKiBOb3JtYWwgdGVzdCB3aXRoIGRpZmZlcmVudCBzdHJpZGVzICovCi0gICAgUkFORE9NX0lOSVQoYnVmMSwgVzEqSDEpOwotICAgIFJBTkRPTV9JTklUKGJ1ZjIsIFcyKkgyKTsKLSAgICByZXQgPSBydW5fdGVzdCgicmFuZG9tIiwgYnVmMSwgYnVmMik7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIGdvdG8gZW5kOwotCi0gICAgLyogQ2hlY2sgZm9yIG1heGltdW0gU0FEICovCi0gICAgbWVtc2V0KGJ1ZjEsIDB4ZmYsIFcxKkgxKTsKLSAgICBtZW1zZXQoYnVmMiwgMHgwMCwgVzIqSDIpOwotICAgIHJldCA9IHJ1bl90ZXN0KCJtYXgiLCBidWYxLCBidWYyKTsKLSAgICBpZiAocmV0IDwgMCkKLSAgICAgICAgZ290byBlbmQ7Ci0KLSAgICAvKiBDaGVjayBmb3IgbWluaW11bSBTQUQgKi8KLSAgICBtZW1zZXQoYnVmMSwgMHg5MCwgVzEqSDEpOwotICAgIG1lbXNldChidWYyLCAweDkwLCBXMipIMik7Ci0gICAgcmV0ID0gcnVuX3Rlc3QoIm1pbiIsIGJ1ZjEsIGJ1ZjIpOwotICAgIGlmIChyZXQgPCAwKQotICAgICAgICBnb3RvIGVuZDsKLQotICAgIC8qIEV4YWN0IGJ1ZmZlciBzaXplcywgdG8gY2hlY2sgZm9yIG92ZXJyZWFkcyAqLwotICAgIGZvciAoaSA9IDE7IGkgPD0gNDsgaSsrKSB7Ci0gICAgICAgIGZvciAoYWxpZ24gPSAwOyBhbGlnbiA8IDM7IGFsaWduKyspIHsKLSAgICAgICAgICAgIGludCBzaXplMSwgc2l6ZTI7Ci0KLSAgICAgICAgICAgIGF2X2ZyZWVwKCZidWYxKTsKLSAgICAgICAgICAgIGF2X2ZyZWVwKCZidWYyKTsKLQotICAgICAgICAgICAgc2l6ZTEgPSBzaXplMiA9IDEgPDwgKGkgPDwgMSk7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoYWxpZ24pIHsKLSAgICAgICAgICAgIGNhc2UgMDogc2l6ZTErKzsgc2l6ZTIrKzsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgIHNpemUyKys7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnVmMSA9IGF2X21hbGxvYyhzaXplMSk7Ci0gICAgICAgICAgICBidWYyID0gYXZfbWFsbG9jKHNpemUyKTsKLSAgICAgICAgICAgIGlmICghYnVmMSB8fCAhYnVmMikgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsbG9jIGZhaWx1cmVcbiIpOwotICAgICAgICAgICAgICAgIHJldCA9IDE7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSQU5ET01fSU5JVChidWYxLCBzaXplMSk7Ci0gICAgICAgICAgICBSQU5ET01fSU5JVChidWYyLCBzaXplMik7Ci0gICAgICAgICAgICByZXQgPSBydW5fc2luZ2xlX3Rlc3QoInNtYWxsIiwgYnVmMSwgMTw8aSwgYnVmMiwgMTw8aSwgYWxpZ24sIGkpOwotICAgICAgICAgICAgaWYgKHJldCA8IDApCi0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLWVuZDoKLSAgICBhdl9mcmVlKGJ1ZjEpOwotICAgIGF2X2ZyZWUoYnVmMik7Ci0gICAgcmV0dXJuIHJldDsKLX0KLSNlbmRpZiAvKiBURVNUICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvcGl4Zm10LmggYi9saWJhdnV0aWwvcGl4Zm10LmgKaW5kZXggYzAxYzA1Ny4uMzRhMTUzMSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3BpeGZtdC5oCisrKyBiL2xpYmF2dXRpbC9waXhmbXQuaApAQCAtMjQsNyArMjQsNiBAQAogLyoqCiAgKiBAZmlsZQogICogcGl4ZWwgZm9ybWF0IGRlZmluaXRpb25zCi0gKgogICovCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZjb25maWcuaCIKQEAgLTQzLDYgKzQyLDEwIEBACiAgKiBUaGlzIGlzIHN0b3JlZCBhcyBCR1JBIG9uIGxpdHRsZS1lbmRpYW4gQ1BVIGFyY2hpdGVjdHVyZXMgYW5kIEFSR0Igb24KICAqIGJpZy1lbmRpYW4gQ1BVcy4KICAqCisgKiBAbm90ZQorICogSWYgdGhlIHJlc29sdXRpb24gaXMgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGNocm9tYSBzdWJzYW1wbGluZyBmYWN0b3IKKyAqIHRoZW4gdGhlIGNocm9tYSBwbGFuZSByZXNvbHV0aW9uIG11c3QgYmUgcm91bmRlZCB1cC4KKyAqCiAgKiBAcGFyCiAgKiBXaGVuIHRoZSBwaXhlbCBmb3JtYXQgaXMgcGFsZXR0aXplZCBSR0IzMiAoQVZfUElYX0ZNVF9QQUw4KSwgdGhlIHBhbGV0dGl6ZWQKICAqIGltYWdlIGRhdGEgaXMgc3RvcmVkIGluIEFWRnJhbWUuZGF0YVswXS4gVGhlIHBhbGV0dGUgaXMgdHJhbnNwb3J0ZWQgaW4KQEAgLTU0LDcgKzU3LDcgQEAKICAqIHRvIHJ1biBvbiB0aGUgSUJNIFZHQSBncmFwaGljcyBhZGFwdGVyIHVzZSA2LWJpdCBwYWxldHRlIGNvbXBvbmVudHMuCiAgKgogICogQHBhcgotICogRm9yIGFsbCB0aGUgOGJpdCBwZXIgcGl4ZWwgZm9ybWF0cywgYW4gUkdCMzIgcGFsZXR0ZSBpcyBpbiBkYXRhWzFdIGxpa2UKKyAqIEZvciBhbGwgdGhlIDggYml0cyBwZXIgcGl4ZWwgZm9ybWF0cywgYW4gUkdCMzIgcGFsZXR0ZSBpcyBpbiBkYXRhWzFdIGxpa2UKICAqIGZvciBwYWw4LiBUaGlzIHBhbGV0dGUgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGZ1bmN0aW9uCiAgKiBhbGxvY2F0aW5nIHRoZSBwaWN0dXJlLgogICovCkBAIC03MSwxNSArNzQsMTAgQEAKICAgICBBVl9QSVhfRk1UX0dSQVk4LCAgICAgLy8vPCAgICAgICAgWSAgICAgICAgLCAgOGJwcAogICAgIEFWX1BJWF9GTVRfTU9OT1dISVRFLCAvLy88ICAgICAgICBZICAgICAgICAsICAxYnBwLCAwIGlzIHdoaXRlLCAxIGlzIGJsYWNrLCBpbiBlYWNoIGJ5dGUgcGl4ZWxzIGFyZSBvcmRlcmVkIGZyb20gdGhlIG1zYiB0byB0aGUgbHNiCiAgICAgQVZfUElYX0ZNVF9NT05PQkxBQ0ssIC8vLzwgICAgICAgIFkgICAgICAgICwgIDFicHAsIDAgaXMgYmxhY2ssIDEgaXMgd2hpdGUsIGluIGVhY2ggYnl0ZSBwaXhlbHMgYXJlIG9yZGVyZWQgZnJvbSB0aGUgbXNiIHRvIHRoZSBsc2IKLSAgICBBVl9QSVhfRk1UX1BBTDgsICAgICAgLy8vPCA4IGJpdCB3aXRoIEFWX1BJWF9GTVRfUkdCMzIgcGFsZXR0ZQorICAgIEFWX1BJWF9GTVRfUEFMOCwgICAgICAvLy88IDggYml0cyB3aXRoIEFWX1BJWF9GTVRfUkdCMzIgcGFsZXR0ZQogICAgIEFWX1BJWF9GTVRfWVVWSjQyMFAsICAvLy88IHBsYW5hciBZVVYgNDoyOjAsIDEyYnBwLCBmdWxsIHNjYWxlIChKUEVHKSwgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBBVl9QSVhfRk1UX1lVVjQyMFAgYW5kIHNldHRpbmcgY29sb3JfcmFuZ2UKICAgICBBVl9QSVhfRk1UX1lVVko0MjJQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLCAxNmJwcCwgZnVsbCBzY2FsZSAoSlBFRyksIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgQVZfUElYX0ZNVF9ZVVY0MjJQIGFuZCBzZXR0aW5nIGNvbG9yX3JhbmdlCiAgICAgQVZfUElYX0ZNVF9ZVVZKNDQ0UCwgIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgMjRicHAsIGZ1bGwgc2NhbGUgKEpQRUcpLCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIEFWX1BJWF9GTVRfWVVWNDQ0UCBhbmQgc2V0dGluZyBjb2xvcl9yYW5nZQotI2lmIEZGX0FQSV9YVk1DCi0gICAgQVZfUElYX0ZNVF9YVk1DX01QRUcyX01DLC8vLzwgWFZpZGVvIE1vdGlvbiBBY2NlbGVyYXRpb24gdmlhIGNvbW1vbiBwYWNrZXQgcGFzc2luZwotICAgIEFWX1BJWF9GTVRfWFZNQ19NUEVHMl9JRENULAotI2RlZmluZSBBVl9QSVhfRk1UX1hWTUMgQVZfUElYX0ZNVF9YVk1DX01QRUcyX0lEQ1QKLSNlbmRpZiAvKiBGRl9BUElfWFZNQyAqLwogICAgIEFWX1BJWF9GTVRfVVlWWTQyMiwgICAvLy88IHBhY2tlZCBZVVYgNDoyOjIsIDE2YnBwLCBDYiBZMCBDciBZMQogICAgIEFWX1BJWF9GTVRfVVlZVllZNDExLCAvLy88IHBhY2tlZCBZVVYgNDoxOjEsIDEyYnBwLCBDYiBZMCBZMSBDciBZMiBZMwogICAgIEFWX1BJWF9GTVRfQkdSOCwgICAgICAvLy88IHBhY2tlZCBSR0IgMzozOjIsICA4YnBwLCAobXNiKTJCIDNHIDNSKGxzYikKQEAgLTEwMSwxMyArOTksNiBAQAogICAgIEFWX1BJWF9GTVRfWVVWNDQwUCwgICAvLy88IHBsYW5hciBZVVYgNDo0OjAgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MiBZIHNhbXBsZXMpCiAgICAgQVZfUElYX0ZNVF9ZVVZKNDQwUCwgIC8vLzwgcGxhbmFyIFlVViA0OjQ6MCBmdWxsIHNjYWxlIChKUEVHKSwgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBBVl9QSVhfRk1UX1lVVjQ0MFAgYW5kIHNldHRpbmcgY29sb3JfcmFuZ2UKICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjowLCAyMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MiBZICYgQSBzYW1wbGVzKQotI2lmIEZGX0FQSV9WRFBBVQotICAgIEFWX1BJWF9GTVRfVkRQQVVfSDI2NCwvLy88IEguMjY0IEhXIGRlY29kaW5nIHdpdGggVkRQQVUsIGRhdGFbMF0gY29udGFpbnMgYSB2ZHBhdV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBiaXRzdHJlYW0gb2YgdGhlIHNsaWNlcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKLSAgICBBVl9QSVhfRk1UX1ZEUEFVX01QRUcxLC8vLzwgTVBFRy0xIEhXIGRlY29kaW5nIHdpdGggVkRQQVUsIGRhdGFbMF0gY29udGFpbnMgYSB2ZHBhdV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBiaXRzdHJlYW0gb2YgdGhlIHNsaWNlcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKLSAgICBBVl9QSVhfRk1UX1ZEUEFVX01QRUcyLC8vLzwgTVBFRy0yIEhXIGRlY29kaW5nIHdpdGggVkRQQVUsIGRhdGFbMF0gY29udGFpbnMgYSB2ZHBhdV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBiaXRzdHJlYW0gb2YgdGhlIHNsaWNlcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKLSAgICBBVl9QSVhfRk1UX1ZEUEFVX1dNVjMsLy8vPCBXTVYzIEhXIGRlY29kaW5nIHdpdGggVkRQQVUsIGRhdGFbMF0gY29udGFpbnMgYSB2ZHBhdV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBiaXRzdHJlYW0gb2YgdGhlIHNsaWNlcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKLSAgICBBVl9QSVhfRk1UX1ZEUEFVX1ZDMSwgLy8vPCBWQy0xIEhXIGRlY29kaW5nIHdpdGggVkRQQVUsIGRhdGFbMF0gY29udGFpbnMgYSB2ZHBhdV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIHRoZSBiaXRzdHJlYW0gb2YgdGhlIHNsaWNlcyBhcyB3ZWxsIGFzIHZhcmlvdXMgZmllbGRzIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMKLSNlbmRpZgogICAgIEFWX1BJWF9GTVRfUkdCNDhCRSwgICAvLy88IHBhY2tlZCBSR0IgMTY6MTY6MTYsIDQ4YnBwLCAxNlIsIDE2RywgMTZCLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgYmlnLWVuZGlhbgogICAgIEFWX1BJWF9GTVRfUkdCNDhMRSwgICAvLy88IHBhY2tlZCBSR0IgMTY6MTY6MTYsIDQ4YnBwLCAxNlIsIDE2RywgMTZCLCB0aGUgMi1ieXRlIHZhbHVlIGZvciBlYWNoIFIvRy9CIGNvbXBvbmVudCBpcyBzdG9yZWQgYXMgbGl0dGxlLWVuZGlhbgogCkBAIC0xMjYsNyArMTE3LDcgQEAKICAgICAvKipAeyovCiAgICAgQVZfUElYX0ZNVF9WQUFQSV9NT0NPLCAvLy88IEhXIGFjY2VsZXJhdGlvbiB0aHJvdWdoIFZBIEFQSSBhdCBtb3Rpb24gY29tcGVuc2F0aW9uIGVudHJ5LXBvaW50LCBQaWN0dXJlLmRhdGFbM10gY29udGFpbnMgYSB2YWFwaV9yZW5kZXJfc3RhdGUgc3RydWN0IHdoaWNoIGNvbnRhaW5zIG1hY3JvYmxvY2tzIGFzIHdlbGwgYXMgdmFyaW91cyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycwogICAgIEFWX1BJWF9GTVRfVkFBUElfSURDVCwgLy8vPCBIVyBhY2NlbGVyYXRpb24gdGhyb3VnaCBWQSBBUEkgYXQgSURDVCBlbnRyeS1wb2ludCwgUGljdHVyZS5kYXRhWzNdIGNvbnRhaW5zIGEgdmFhcGlfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyBmaWVsZHMgZXh0cmFjdGVkIGZyb20gaGVhZGVycwotICAgIEFWX1BJWF9GTVRfVkFBUElfVkxELCAgLy8vPCBIVyBkZWNvZGluZyB0aHJvdWdoIFZBIEFQSSwgUGljdHVyZS5kYXRhWzNdIGNvbnRhaW5zIGEgdmFhcGlfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyB0aGUgYml0c3RyZWFtIG9mIHRoZSBzbGljZXMgYXMgd2VsbCBhcyB2YXJpb3VzIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCisgICAgQVZfUElYX0ZNVF9WQUFQSV9WTEQsICAvLy88IEhXIGRlY29kaW5nIHRocm91Z2ggVkEgQVBJLCBQaWN0dXJlLmRhdGFbM10gY29udGFpbnMgYSBWQVN1cmZhY2VJRAogICAgIC8qKkB9Ki8KICAgICBBVl9QSVhfRk1UX1ZBQVBJID0gQVZfUElYX0ZNVF9WQUFQSV9WTEQsCiAjZWxzZQpAQCAtMTQzLDE2ICsxMzQsMTMgQEAKICAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNkJFLCAgLy8vPCBwbGFuYXIgWVVWIDQ6MjoyLCAzMmJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDJ4MSBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCiAgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTZMRSwgIC8vLzwgcGxhbmFyIFlVViA0OjQ6NCwgNDhicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgogICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDE2QkUsICAvLy88IHBsYW5hciBZVVYgNDo0OjQsIDQ4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KLSNpZiBGRl9BUElfVkRQQVUKLSAgICBBVl9QSVhfRk1UX1ZEUEFVX01QRUc0LCAgLy8vPCBNUEVHNCBIVyBkZWNvZGluZyB3aXRoIFZEUEFVLCBkYXRhWzBdIGNvbnRhaW5zIGEgdmRwYXVfcmVuZGVyX3N0YXRlIHN0cnVjdCB3aGljaCBjb250YWlucyB0aGUgYml0c3RyZWFtIG9mIHRoZSBzbGljZXMgYXMgd2VsbCBhcyB2YXJpb3VzIGZpZWxkcyBleHRyYWN0ZWQgZnJvbSBoZWFkZXJzCi0jZW5kaWYKICAgICBBVl9QSVhfRk1UX0RYVkEyX1ZMRCwgICAgLy8vPCBIVyBkZWNvZGluZyB0aHJvdWdoIERYVkEyLCBQaWN0dXJlLmRhdGFbM10gY29udGFpbnMgYSBMUERJUkVDVDNEU1VSRkFDRTkgcG9pbnRlcgogCiAgICAgQVZfUElYX0ZNVF9SR0I0NDRMRSwgIC8vLzwgcGFja2VkIFJHQiA0OjQ6NCwgMTZicHAsIChtc2IpNFggNFIgNEcgNEIobHNiKSwgbGl0dGxlLWVuZGlhbiwgWD11bnVzZWQvdW5kZWZpbmVkCiAgICAgQVZfUElYX0ZNVF9SR0I0NDRCRSwgIC8vLzwgcGFja2VkIFJHQiA0OjQ6NCwgMTZicHAsIChtc2IpNFggNFIgNEcgNEIobHNiKSwgYmlnLWVuZGlhbiwgICAgWD11bnVzZWQvdW5kZWZpbmVkCiAgICAgQVZfUElYX0ZNVF9CR1I0NDRMRSwgIC8vLzwgcGFja2VkIEJHUiA0OjQ6NCwgMTZicHAsIChtc2IpNFggNEIgNEcgNFIobHNiKSwgbGl0dGxlLWVuZGlhbiwgWD11bnVzZWQvdW5kZWZpbmVkCiAgICAgQVZfUElYX0ZNVF9CR1I0NDRCRSwgIC8vLzwgcGFja2VkIEJHUiA0OjQ6NCwgMTZicHAsIChtc2IpNFggNEIgNEcgNFIobHNiKSwgYmlnLWVuZGlhbiwgICAgWD11bnVzZWQvdW5kZWZpbmVkCi0gICAgQVZfUElYX0ZNVF9ZQTgsICAgICAgIC8vLzwgOGJpdCBncmF5LCA4Yml0IGFscGhhCisgICAgQVZfUElYX0ZNVF9ZQTgsICAgICAgIC8vLzwgOCBiaXRzIGdyYXksIDggYml0cyBhbHBoYQogCiAgICAgQVZfUElYX0ZNVF9ZNDAwQSA9IEFWX1BJWF9GTVRfWUE4LCAvLy88IGFsaWFzIGZvciBBVl9QSVhfRk1UX1lBOAogICAgIEFWX1BJWF9GTVRfR1JBWThBPSBBVl9QSVhfRk1UX1lBOCwgLy8vPCBhbGlhcyBmb3IgQVZfUElYX0ZNVF9ZQTgKQEAgLTE3Nyw4ICsxNjUsOCBAQAogICAgIEFWX1BJWF9GTVRfWVVWNDQ0UDEwTEUsLy8vPCBwbGFuYXIgWVVWIDQ6NDo0LCAzMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MSBZIHNhbXBsZXMpLCBsaXR0bGUtZW5kaWFuCiAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQOUJFLCAvLy88IHBsYW5hciBZVVYgNDoyOjIsIDE4YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMngxIFkgc2FtcGxlcyksIGJpZy1lbmRpYW4KICAgICBBVl9QSVhfRk1UX1lVVjQyMlA5TEUsIC8vLzwgcGxhbmFyIFlVViA0OjI6MiwgMThicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAyeDEgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgotICAgIEFWX1BJWF9GTVRfVkRBX1ZMRCwgICAgLy8vPCBoYXJkd2FyZSBkZWNvZGluZyB0aHJvdWdoIFZEQQogICAgIEFWX1BJWF9GTVRfR0JSUCwgICAgICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMjRicHAKKyAgICBBVl9QSVhfRk1UX0dCUjI0UCA9IEFWX1BJWF9GTVRfR0JSUCwgLy8gYWxpYXMgZm9yICNBVl9QSVhfRk1UX0dCUlAKICAgICBBVl9QSVhfRk1UX0dCUlA5QkUsICAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0IDI3YnBwLCBiaWctZW5kaWFuCiAgICAgQVZfUElYX0ZNVF9HQlJQOUxFLCAgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NCAyN2JwcCwgbGl0dGxlLWVuZGlhbgogICAgIEFWX1BJWF9GTVRfR0JSUDEwQkUsICAvLy88IHBsYW5hciBHQlIgNDo0OjQgMzBicHAsIGJpZy1lbmRpYW4KQEAgLTIyMSwxMCArMjA5LDggQEAKIAogICAgIEFWX1BJWF9GTVRfWVZZVTQyMiwgICAvLy88IHBhY2tlZCBZVVYgNDoyOjIsIDE2YnBwLCBZMCBDciBZMSBDYgogCi0gICAgQVZfUElYX0ZNVF9WREEsICAgICAgICAgIC8vLzwgSFcgYWNjZWxlcmF0aW9uIHRocm91Z2ggVkRBLCBkYXRhWzNdIGNvbnRhaW5zIGEgQ1ZQaXhlbEJ1ZmZlclJlZgotCi0gICAgQVZfUElYX0ZNVF9ZQTE2QkUsICAgICAgIC8vLzwgMTZiaXQgZ3JheSwgMTZiaXQgYWxwaGEgKGJpZy1lbmRpYW4pCi0gICAgQVZfUElYX0ZNVF9ZQTE2TEUsICAgICAgIC8vLzwgMTZiaXQgZ3JheSwgMTZiaXQgYWxwaGEgKGxpdHRsZS1lbmRpYW4pCisgICAgQVZfUElYX0ZNVF9ZQTE2QkUsICAgICAgIC8vLzwgMTYgYml0cyBncmF5LCAxNiBiaXRzIGFscGhhIChiaWctZW5kaWFuKQorICAgIEFWX1BJWF9GTVRfWUExNkxFLCAgICAgICAvLy88IDE2IGJpdHMgZ3JheSwgMTYgYml0cyBhbHBoYSAobGl0dGxlLWVuZGlhbikKIAogICAgIEFWX1BJWF9GTVRfR0JSQVAsICAgICAgICAvLy88IHBsYW5hciBHQlJBIDQ6NDo0OjQgMzJicHAKICAgICBBVl9QSVhfRk1UX0dCUkFQMTZCRSwgICAgLy8vPCBwbGFuYXIgR0JSQSA0OjQ6NDo0IDY0YnBwLCBiaWctZW5kaWFuCkBAIC0yNDAsOSArMjI2LDE1IEBACiAgICAgICovCiAgICAgQVZfUElYX0ZNVF9NTUFMLAogCi0gICAgQVZfUElYX0ZNVF9EM0QxMVZBX1ZMRCwgIC8vLzwgSFcgZGVjb2RpbmcgdGhyb3VnaCBEaXJlY3QzRDExLCBQaWN0dXJlLmRhdGFbM10gY29udGFpbnMgYSBJRDNEMTFWaWRlb0RlY29kZXJPdXRwdXRWaWV3IHBvaW50ZXIKKyAgICBBVl9QSVhfRk1UX0QzRDExVkFfVkxELCAgLy8vPCBIVyBkZWNvZGluZyB0aHJvdWdoIERpcmVjdDNEMTEgdmlhIG9sZCBBUEksIFBpY3R1cmUuZGF0YVszXSBjb250YWlucyBhIElEM0QxMVZpZGVvRGVjb2Rlck91dHB1dFZpZXcgcG9pbnRlcgogCi0gICAgQVZfUElYX0ZNVF8wUkdCPTB4MTIzKzQsLy8vPCBwYWNrZWQgUkdCIDg6ODo4LCAzMmJwcCwgWFJHQlhSR0IuLi4gICBYPXVudXNlZC91bmRlZmluZWQKKyAgICAvKioKKyAgICAgKiBIVyBhY2NlbGVyYXRpb24gdGhyb3VnaCBDVURBLiBkYXRhW2ldIGNvbnRhaW4gQ1VkZXZpY2VwdHIgcG9pbnRlcnMKKyAgICAgKiBleGFjdGx5IGFzIGZvciBzeXN0ZW0gbWVtb3J5IGZyYW1lcy4KKyAgICAgKi8KKyAgICBBVl9QSVhfRk1UX0NVREEsCisKKyAgICBBVl9QSVhfRk1UXzBSR0IsICAgICAgICAvLy88IHBhY2tlZCBSR0IgODo4OjgsIDMyYnBwLCBYUkdCWFJHQi4uLiAgIFg9dW51c2VkL3VuZGVmaW5lZAogICAgIEFWX1BJWF9GTVRfUkdCMCwgICAgICAgIC8vLzwgcGFja2VkIFJHQiA4Ojg6OCwgMzJicHAsIFJHQlhSR0JYLi4uICAgWD11bnVzZWQvdW5kZWZpbmVkCiAgICAgQVZfUElYX0ZNVF8wQkdSLCAgICAgICAgLy8vPCBwYWNrZWQgQkdSIDg6ODo4LCAzMmJwcCwgWEJHUlhCR1IuLi4gICBYPXVudXNlZC91bmRlZmluZWQKICAgICBBVl9QSVhfRk1UX0JHUjAsICAgICAgICAvLy88IHBhY2tlZCBCR1IgODo4OjgsIDMyYnBwLCBCR1JYQkdSWC4uLiAgIFg9dW51c2VkL3VuZGVmaW5lZApAQCAtMjc3LDkgKzI2OSw5IEBACiAgICAgQVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZCRSwgLy8vPCBiYXllciwgR0JHQi4uKG9kZCBsaW5lKSwgUkdSRy4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBiaWctZW5kaWFuICovCiAgICAgQVZfUElYX0ZNVF9CQVlFUl9HUkJHMTZMRSwgLy8vPCBiYXllciwgR1JHUi4uKG9kZCBsaW5lKSwgQkdCRy4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBsaXR0bGUtZW5kaWFuICovCiAgICAgQVZfUElYX0ZNVF9CQVlFUl9HUkJHMTZCRSwgLy8vPCBiYXllciwgR1JHUi4uKG9kZCBsaW5lKSwgQkdCRy4uKGV2ZW4gbGluZSksIDE2LWJpdCBzYW1wbGVzLCBiaWctZW5kaWFuICovCi0jaWYgIUZGX0FQSV9YVk1DCisKICAgICBBVl9QSVhfRk1UX1hWTUMsLy8vPCBYVmlkZW8gTW90aW9uIEFjY2VsZXJhdGlvbiB2aWEgY29tbW9uIHBhY2tldCBwYXNzaW5nCi0jZW5kaWYgLyogIUZGX0FQSV9YVk1DICovCisKICAgICBBVl9QSVhfRk1UX1lVVjQ0MFAxMExFLCAvLy88IHBsYW5hciBZVVYgNDo0OjAsMjBicHAsICgxIENyICYgQ2Igc2FtcGxlIHBlciAxeDIgWSBzYW1wbGVzKSwgbGl0dGxlLWVuZGlhbgogICAgIEFWX1BJWF9GTVRfWVVWNDQwUDEwQkUsIC8vLzwgcGxhbmFyIFlVViA0OjQ6MCwyMGJwcCwgKDEgQ3IgJiBDYiBzYW1wbGUgcGVyIDF4MiBZIHNhbXBsZXMpLCBiaWctZW5kaWFuCiAgICAgQVZfUElYX0ZNVF9ZVVY0NDBQMTJMRSwgLy8vPCBwbGFuYXIgWVVWIDQ6NDowLDI0YnBwLCAoMSBDciAmIENiIHNhbXBsZSBwZXIgMXgyIFkgc2FtcGxlcyksIGxpdHRsZS1lbmRpYW4KQEAgLTI5MiwxMSArMjg0LDU4IEBACiAgICAgQVZfUElYX0ZNVF9QMDEwTEUsIC8vLzwgbGlrZSBOVjEyLCB3aXRoIDEwYnBwIHBlciBjb21wb25lbnQsIGRhdGEgaW4gdGhlIGhpZ2ggYml0cywgemVyb3MgaW4gdGhlIGxvdyBiaXRzLCBsaXR0bGUtZW5kaWFuCiAgICAgQVZfUElYX0ZNVF9QMDEwQkUsIC8vLzwgbGlrZSBOVjEyLCB3aXRoIDEwYnBwIHBlciBjb21wb25lbnQsIGRhdGEgaW4gdGhlIGhpZ2ggYml0cywgemVyb3MgaW4gdGhlIGxvdyBiaXRzLCBiaWctZW5kaWFuCiAKLSAgICBBVl9QSVhfRk1UX05CLCAgICAgICAgLy8vPCBudW1iZXIgb2YgcGl4ZWwgZm9ybWF0cywgRE8gTk9UIFVTRSBUSElTIGlmIHlvdSB3YW50IHRvIGxpbmsgd2l0aCBzaGFyZWQgbGliYXYqIGJlY2F1c2UgdGhlIG51bWJlciBvZiBmb3JtYXRzIG1pZ2h0IGRpZmZlciBiZXR3ZWVuIHZlcnNpb25zCi19OworICAgIEFWX1BJWF9GTVRfR0JSQVAxMkJFLCAgLy8vPCBwbGFuYXIgR0JSIDQ6NDo0OjQgNDhicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUkFQMTJMRSwgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NDo0IDQ4YnBwLCBsaXR0bGUtZW5kaWFuCiAKLSNkZWZpbmUgQVZfUElYX0ZNVF9ZNDAwQSBBVl9QSVhfRk1UX0dSQVk4QQotI2RlZmluZSBBVl9QSVhfRk1UX0dCUjI0UCBBVl9QSVhfRk1UX0dCUlAKKyAgICBBVl9QSVhfRk1UX0dCUkFQMTBCRSwgIC8vLzwgcGxhbmFyIEdCUiA0OjQ6NDo0IDQwYnBwLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HQlJBUDEwTEUsICAvLy88IHBsYW5hciBHQlIgNDo0OjQ6NCA0MGJwcCwgbGl0dGxlLWVuZGlhbgorCisgICAgQVZfUElYX0ZNVF9NRURJQUNPREVDLCAvLy88IGhhcmR3YXJlIGRlY29kaW5nIHRocm91Z2ggTWVkaWFDb2RlYworCisgICAgQVZfUElYX0ZNVF9HUkFZMTJCRSwgICAvLy88ICAgICAgICBZICAgICAgICAsIDEyYnBwLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HUkFZMTJMRSwgICAvLy88ICAgICAgICBZICAgICAgICAsIDEyYnBwLCBsaXR0bGUtZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HUkFZMTBCRSwgICAvLy88ICAgICAgICBZICAgICAgICAsIDEwYnBwLCBiaWctZW5kaWFuCisgICAgQVZfUElYX0ZNVF9HUkFZMTBMRSwgICAvLy88ICAgICAgICBZICAgICAgICAsIDEwYnBwLCBsaXR0bGUtZW5kaWFuCisKKyAgICBBVl9QSVhfRk1UX1AwMTZMRSwgLy8vPCBsaWtlIE5WMTIsIHdpdGggMTZicHAgcGVyIGNvbXBvbmVudCwgbGl0dGxlLWVuZGlhbgorICAgIEFWX1BJWF9GTVRfUDAxNkJFLCAvLy88IGxpa2UgTlYxMiwgd2l0aCAxNmJwcCBwZXIgY29tcG9uZW50LCBiaWctZW5kaWFuCisKKyAgICAvKioKKyAgICAgKiBIYXJkd2FyZSBzdXJmYWNlcyBmb3IgRGlyZWN0M0QxMS4KKyAgICAgKgorICAgICAqIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdGhlIGxlZ2FjeSBBVl9QSVhfRk1UX0QzRDExVkFfVkxELiBUaGUgbmV3IEQzRDExCisgICAgICogaHdhY2NlbCBBUEkgYW5kIGZpbHRlcmluZyBzdXBwb3J0IEFWX1BJWF9GTVRfRDNEMTEgb25seS4KKyAgICAgKgorICAgICAqIGRhdGFbMF0gY29udGFpbnMgYSBJRDNEMTFUZXh0dXJlMkQgcG9pbnRlciwgYW5kIGRhdGFbMV0gY29udGFpbnMgdGhlCisgICAgICogdGV4dHVyZSBhcnJheSBpbmRleCBvZiB0aGUgZnJhbWUgYXMgaW50cHRyX3QgaWYgdGhlIElEM0QxMVRleHR1cmUyRCBpcworICAgICAqIGFuIGFycmF5IHRleHR1cmUgKG9yIGFsd2F5cyAwIGlmIGl0J3MgYSBub3JtYWwgdGV4dHVyZSkuCisgICAgICovCisgICAgQVZfUElYX0ZNVF9EM0QxMSwKKworICAgIEFWX1BJWF9GTVRfR1JBWTlCRSwgICAvLy88ICAgICAgICBZICAgICAgICAsIDlicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dSQVk5TEUsICAgLy8vPCAgICAgICAgWSAgICAgICAgLCA5YnBwLCBsaXR0bGUtZW5kaWFuCisKKyAgICBBVl9QSVhfRk1UX0dCUlBGMzJCRSwgIC8vLzwgSUVFRS03NTQgc2luZ2xlIHByZWNpc2lvbiBwbGFuYXIgR0JSIDQ6NDo0LCAgICAgOTZicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUlBGMzJMRSwgIC8vLzwgSUVFRS03NTQgc2luZ2xlIHByZWNpc2lvbiBwbGFuYXIgR0JSIDQ6NDo0LCAgICAgOTZicHAsIGxpdHRsZS1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUkFQRjMyQkUsIC8vLzwgSUVFRS03NTQgc2luZ2xlIHByZWNpc2lvbiBwbGFuYXIgR0JSQSA0OjQ6NDo0LCAxMjhicHAsIGJpZy1lbmRpYW4KKyAgICBBVl9QSVhfRk1UX0dCUkFQRjMyTEUsIC8vLzwgSUVFRS03NTQgc2luZ2xlIHByZWNpc2lvbiBwbGFuYXIgR0JSQSA0OjQ6NDo0LCAxMjhicHAsIGxpdHRsZS1lbmRpYW4KKworICAgIC8qKgorICAgICAqIERSTS1tYW5hZ2VkIGJ1ZmZlcnMgZXhwb3NlZCB0aHJvdWdoIFBSSU1FIGJ1ZmZlciBzaGFyaW5nLgorICAgICAqCisgICAgICogZGF0YVswXSBwb2ludHMgdG8gYW4gQVZEUk1GcmFtZURlc2NyaXB0b3IuCisgICAgICovCisgICAgQVZfUElYX0ZNVF9EUk1fUFJJTUUsCisgICAgLyoqCisgICAgICogSGFyZHdhcmUgc3VyZmFjZXMgZm9yIE9wZW5DTC4KKyAgICAgKgorICAgICAqIGRhdGFbaV0gY29udGFpbiAyRCBpbWFnZSBvYmplY3RzICh0eXBlZCBpbiBDIGFzIGNsX21lbSwgdXNlZAorICAgICAqIGluIE9wZW5DTCBhcyBpbWFnZTJkX3QpIGZvciBlYWNoIHBsYW5lIG9mIHRoZSBzdXJmYWNlLgorICAgICAqLworICAgIEFWX1BJWF9GTVRfT1BFTkNMLAorCisgICAgQVZfUElYX0ZNVF9OQiAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHBpeGVsIGZvcm1hdHMsIERPIE5PVCBVU0UgVEhJUyBpZiB5b3Ugd2FudCB0byBsaW5rIHdpdGggc2hhcmVkIGxpYmF2KiBiZWNhdXNlIHRoZSBudW1iZXIgb2YgZm9ybWF0cyBtaWdodCBkaWZmZXIgYmV0d2VlbiB2ZXJzaW9ucworfTsKIAogI2lmIEFWX0hBVkVfQklHRU5ESUFOCiAjICAgZGVmaW5lIEFWX1BJWF9GTVRfTkUoYmUsIGxlKSBBVl9QSVhfRk1UXyMjYmUKQEAgLTMxMSw2ICszNTAsOSBAQAogI2RlZmluZSBBVl9QSVhfRk1UXzBSR0IzMiAgQVZfUElYX0ZNVF9ORSgwUkdCLCBCR1IwKQogI2RlZmluZSBBVl9QSVhfRk1UXzBCR1IzMiAgQVZfUElYX0ZNVF9ORSgwQkdSLCBSR0IwKQogCisjZGVmaW5lIEFWX1BJWF9GTVRfR1JBWTkgIEFWX1BJWF9GTVRfTkUoR1JBWTlCRSwgIEdSQVk5TEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfR1JBWTEwIEFWX1BJWF9GTVRfTkUoR1JBWTEwQkUsIEdSQVkxMExFKQorI2RlZmluZSBBVl9QSVhfRk1UX0dSQVkxMiBBVl9QSVhfRk1UX05FKEdSQVkxMkJFLCBHUkFZMTJMRSkKICNkZWZpbmUgQVZfUElYX0ZNVF9HUkFZMTYgQVZfUElYX0ZNVF9ORShHUkFZMTZCRSwgR1JBWTE2TEUpCiAjZGVmaW5lIEFWX1BJWF9GTVRfWUExNiAgIEFWX1BJWF9GTVRfTkUoWUExNkJFLCAgIFlBMTZMRSkKICNkZWZpbmUgQVZfUElYX0ZNVF9SR0I0OCAgQVZfUElYX0ZNVF9ORShSR0I0OEJFLCAgUkdCNDhMRSkKQEAgLTM0Nyw2ICszODksOCBAQAogI2RlZmluZSBBVl9QSVhfRk1UX0dCUlAxMiAgICBBVl9QSVhfRk1UX05FKEdCUlAxMkJFLCAgICBHQlJQMTJMRSkKICNkZWZpbmUgQVZfUElYX0ZNVF9HQlJQMTQgICAgQVZfUElYX0ZNVF9ORShHQlJQMTRCRSwgICAgR0JSUDE0TEUpCiAjZGVmaW5lIEFWX1BJWF9GTVRfR0JSUDE2ICAgIEFWX1BJWF9GTVRfTkUoR0JSUDE2QkUsICAgIEdCUlAxNkxFKQorI2RlZmluZSBBVl9QSVhfRk1UX0dCUkFQMTAgICBBVl9QSVhfRk1UX05FKEdCUkFQMTBCRSwgICBHQlJBUDEwTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfR0JSQVAxMiAgIEFWX1BJWF9GTVRfTkUoR0JSQVAxMkJFLCAgIEdCUkFQMTJMRSkKICNkZWZpbmUgQVZfUElYX0ZNVF9HQlJBUDE2ICAgQVZfUElYX0ZNVF9ORShHQlJBUDE2QkUsICAgR0JSQVAxNkxFKQogCiAjZGVmaW5lIEFWX1BJWF9GTVRfQkFZRVJfQkdHUjE2IEFWX1BJWF9GTVRfTkUoQkFZRVJfQkdHUjE2QkUsICAgIEJBWUVSX0JHR1IxNkxFKQpAQCAtMzU0LDYgKzM5OCw4IEBACiAjZGVmaW5lIEFWX1BJWF9GTVRfQkFZRVJfR0JSRzE2IEFWX1BJWF9GTVRfTkUoQkFZRVJfR0JSRzE2QkUsICAgIEJBWUVSX0dCUkcxNkxFKQogI2RlZmluZSBBVl9QSVhfRk1UX0JBWUVSX0dSQkcxNiBBVl9QSVhfRk1UX05FKEJBWUVSX0dSQkcxNkJFLCAgICBCQVlFUl9HUkJHMTZMRSkKIAorI2RlZmluZSBBVl9QSVhfRk1UX0dCUlBGMzIgICAgQVZfUElYX0ZNVF9ORShHQlJQRjMyQkUsICBHQlJQRjMyTEUpCisjZGVmaW5lIEFWX1BJWF9GTVRfR0JSQVBGMzIgICBBVl9QSVhfRk1UX05FKEdCUkFQRjMyQkUsIEdCUkFQRjMyTEUpCiAKICNkZWZpbmUgQVZfUElYX0ZNVF9ZVVZBNDIwUDkgIEFWX1BJWF9GTVRfTkUoWVVWQTQyMFA5QkUgLCBZVVZBNDIwUDlMRSkKICNkZWZpbmUgQVZfUElYX0ZNVF9ZVVZBNDIyUDkgIEFWX1BJWF9GTVRfTkUoWVVWQTQyMlA5QkUgLCBZVVZBNDIyUDlMRSkKQEAgLTM2OSw5ICs0MTUsMTEgQEAKICNkZWZpbmUgQVZfUElYX0ZNVF9OVjIwICAgICAgIEFWX1BJWF9GTVRfTkUoTlYyMEJFLCAgTlYyMExFKQogI2RlZmluZSBBVl9QSVhfRk1UX0FZVVY2NCAgICAgQVZfUElYX0ZNVF9ORShBWVVWNjRCRSwgQVlVVjY0TEUpCiAjZGVmaW5lIEFWX1BJWF9GTVRfUDAxMCAgICAgICBBVl9QSVhfRk1UX05FKFAwMTBCRSwgIFAwMTBMRSkKKyNkZWZpbmUgQVZfUElYX0ZNVF9QMDE2ICAgICAgIEFWX1BJWF9GTVRfTkUoUDAxNkJFLCAgUDAxNkxFKQogCiAvKioKICAgKiBDaHJvbWF0aWNpdHkgY29vcmRpbmF0ZXMgb2YgdGhlIHNvdXJjZSBwcmltYXJpZXMuCisgICogVGhlc2UgdmFsdWVzIG1hdGNoIHRoZSBvbmVzIGRlZmluZWQgYnkgSVNPL0lFQyAyMzAwMS04XzIwMTMgwqcgNy4xLgogICAqLwogZW51bSBBVkNvbG9yUHJpbWFyaWVzIHsKICAgICBBVkNPTF9QUklfUkVTRVJWRUQwICAgPSAwLApAQCAtMzg1LDEyICs0MzMsMTcgQEAKICAgICBBVkNPTF9QUklfU01QVEUyNDBNICAgPSA3LCAgLy8vPCBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIGFib3ZlCiAgICAgQVZDT0xfUFJJX0ZJTE0gICAgICAgID0gOCwgIC8vLzwgY29sb3VyIGZpbHRlcnMgdXNpbmcgSWxsdW1pbmFudCBDCiAgICAgQVZDT0xfUFJJX0JUMjAyMCAgICAgID0gOSwgIC8vLzwgSVRVLVIgQlQyMDIwCi0gICAgQVZDT0xfUFJJX1NNUFRFU1Q0MjhfMT0gMTAsIC8vLzwgU01QVEUgU1QgNDI4LTEgKENJRSAxOTMxIFhZWikKLSAgICBBVkNPTF9QUklfTkIsICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKKyAgICBBVkNPTF9QUklfU01QVEU0MjggICAgPSAxMCwgLy8vPCBTTVBURSBTVCA0MjgtMSAoQ0lFIDE5MzEgWFlaKQorICAgIEFWQ09MX1BSSV9TTVBURVNUNDI4XzEgPSBBVkNPTF9QUklfU01QVEU0MjgsCisgICAgQVZDT0xfUFJJX1NNUFRFNDMxICAgID0gMTEsIC8vLzwgU01QVEUgU1QgNDMxLTIgKDIwMTEpIC8gRENJIFAzCisgICAgQVZDT0xfUFJJX1NNUFRFNDMyICAgID0gMTIsIC8vLzwgU01QVEUgU1QgNDMyLTEgKDIwMTApIC8gUDMgRDY1IC8gRGlzcGxheSBQMworICAgIEFWQ09MX1BSSV9KRURFQ19QMjIgICA9IDIyLCAvLy88IEpFREVDIFAyMiBwaG9zcGhvcnMKKyAgICBBVkNPTF9QUklfTkIgICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKIH07CiAKIC8qKgogICogQ29sb3IgVHJhbnNmZXIgQ2hhcmFjdGVyaXN0aWMuCisgKiBUaGVzZSB2YWx1ZXMgbWF0Y2ggdGhlIG9uZXMgZGVmaW5lZCBieSBJU08vSUVDIDIzMDAxLThfMjAxMyDCpyA3LjIuCiAgKi8KIGVudW0gQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWMgewogICAgIEFWQ09MX1RSQ19SRVNFUlZFRDAgICAgPSAwLApAQCAtNDA3LDE1ICs0NjAsMTkgQEAKICAgICBBVkNPTF9UUkNfSUVDNjE5NjZfMl80ID0gMTEsIC8vLzwgSUVDIDYxOTY2LTItNAogICAgIEFWQ09MX1RSQ19CVDEzNjFfRUNHICAgPSAxMiwgLy8vPCBJVFUtUiBCVDEzNjEgRXh0ZW5kZWQgQ29sb3VyIEdhbXV0CiAgICAgQVZDT0xfVFJDX0lFQzYxOTY2XzJfMSA9IDEzLCAvLy88IElFQyA2MTk2Ni0yLTEgKHNSR0Igb3Igc1lDQykKLSAgICBBVkNPTF9UUkNfQlQyMDIwXzEwICAgID0gMTQsIC8vLzwgSVRVLVIgQlQyMDIwIGZvciAxMCBiaXQgc3lzdGVtCi0gICAgQVZDT0xfVFJDX0JUMjAyMF8xMiAgICA9IDE1LCAvLy88IElUVS1SIEJUMjAyMCBmb3IgMTIgYml0IHN5c3RlbQotICAgIEFWQ09MX1RSQ19TTVBURVNUMjA4NCAgPSAxNiwgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMCwgMTIsIDE0IGFuZCAxNiBiaXQgc3lzdGVtcwotICAgIEFWQ09MX1RSQ19TTVBURVNUNDI4XzEgPSAxNywgLy8vPCBTTVBURSBTVCA0MjgtMQotICAgIEFWQ09MX1RSQ19OQiwgICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKKyAgICBBVkNPTF9UUkNfQlQyMDIwXzEwICAgID0gMTQsIC8vLzwgSVRVLVIgQlQyMDIwIGZvciAxMC1iaXQgc3lzdGVtCisgICAgQVZDT0xfVFJDX0JUMjAyMF8xMiAgICA9IDE1LCAvLy88IElUVS1SIEJUMjAyMCBmb3IgMTItYml0IHN5c3RlbQorICAgIEFWQ09MX1RSQ19TTVBURTIwODQgICAgPSAxNiwgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMC0sIDEyLSwgMTQtIGFuZCAxNi1iaXQgc3lzdGVtcworICAgIEFWQ09MX1RSQ19TTVBURVNUMjA4NCAgPSBBVkNPTF9UUkNfU01QVEUyMDg0LAorICAgIEFWQ09MX1RSQ19TTVBURTQyOCAgICAgPSAxNywgLy8vPCBTTVBURSBTVCA0MjgtMQorICAgIEFWQ09MX1RSQ19TTVBURVNUNDI4XzEgPSBBVkNPTF9UUkNfU01QVEU0MjgsCisgICAgQVZDT0xfVFJDX0FSSUJfU1REX0I2NyA9IDE4LCAvLy88IEFSSUIgU1RELUI2Nywga25vd24gYXMgIkh5YnJpZCBsb2ctZ2FtbWEiCisgICAgQVZDT0xfVFJDX05CICAgICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQogfTsKIAogLyoqCiAgKiBZVVYgY29sb3JzcGFjZSB0eXBlLgorICogVGhlc2UgdmFsdWVzIG1hdGNoIHRoZSBvbmVzIGRlZmluZWQgYnkgSVNPL0lFQyAyMzAwMS04XzIwMTMgwqcgNy4zLgogICovCiBlbnVtIEFWQ29sb3JTcGFjZSB7CiAgICAgQVZDT0xfU1BDX1JHQiAgICAgICAgID0gMCwgIC8vLzwgb3JkZXIgb2YgY29lZmZpY2llbnRzIGlzIGFjdHVhbGx5IEdCUiwgYWxzbyBJRUMgNjE5NjYtMi0xIChzUkdCKQpAQCAtNDI0LDE1ICs0ODEsMTggQEAKICAgICBBVkNPTF9TUENfUkVTRVJWRUQgICAgPSAzLAogICAgIEFWQ09MX1NQQ19GQ0MgICAgICAgICA9IDQsICAvLy88IEZDQyBUaXRsZSA0NyBDb2RlIG9mIEZlZGVyYWwgUmVndWxhdGlvbnMgNzMuNjgyIChhKSgyMCkKICAgICBBVkNPTF9TUENfQlQ0NzBCRyAgICAgPSA1LCAgLy8vPCBhbHNvIElUVS1SIEJUNjAxLTYgNjI1IC8gSVRVLVIgQlQxMzU4IDYyNSAvIElUVS1SIEJUMTcwMCA2MjUgUEFMICYgU0VDQU0gLyBJRUMgNjE5NjYtMi00IHh2WUNDNjAxCi0gICAgQVZDT0xfU1BDX1NNUFRFMTcwTSAgID0gNiwgIC8vLzwgYWxzbyBJVFUtUiBCVDYwMS02IDUyNSAvIElUVS1SIEJUMTM1OCA1MjUgLyBJVFUtUiBCVDE3MDAgTlRTQyAvIGZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gYWJvdmUKLSAgICBBVkNPTF9TUENfU01QVEUyNDBNICAgPSA3LAotICAgIEFWQ09MX1NQQ19ZQ09DRyAgICAgICA9IDgsICAvLy88IFVzZWQgYnkgRGlyYWMgLyBWQy0yIGFuZCBILjI2NCBGUmV4dCwgc2VlIElUVS1UIFNHMTYKKyAgICBBVkNPTF9TUENfU01QVEUxNzBNICAgPSA2LCAgLy8vPCBhbHNvIElUVS1SIEJUNjAxLTYgNTI1IC8gSVRVLVIgQlQxMzU4IDUyNSAvIElUVS1SIEJUMTcwMCBOVFNDCisgICAgQVZDT0xfU1BDX1NNUFRFMjQwTSAgID0gNywgIC8vLzwgZnVuY3Rpb25hbGx5IGlkZW50aWNhbCB0byBhYm92ZQorICAgIEFWQ09MX1NQQ19ZQ0dDTyAgICAgICA9IDgsICAvLy88IFVzZWQgYnkgRGlyYWMgLyBWQy0yIGFuZCBILjI2NCBGUmV4dCwgc2VlIElUVS1UIFNHMTYKKyAgICBBVkNPTF9TUENfWUNPQ0cgICAgICAgPSBBVkNPTF9TUENfWUNHQ08sCiAgICAgQVZDT0xfU1BDX0JUMjAyMF9OQ0wgID0gOSwgIC8vLzwgSVRVLVIgQlQyMDIwIG5vbi1jb25zdGFudCBsdW1pbmFuY2Ugc3lzdGVtCiAgICAgQVZDT0xfU1BDX0JUMjAyMF9DTCAgID0gMTAsIC8vLzwgSVRVLVIgQlQyMDIwIGNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KLSAgICBBVkNPTF9TUENfTkIsICAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKKyAgICBBVkNPTF9TUENfU01QVEUyMDg1ICAgPSAxMSwgLy8vPCBTTVBURSAyMDg1LCBZJ0QnekQneAorICAgIEFWQ09MX1NQQ19DSFJPTUFfREVSSVZFRF9OQ0wgPSAxMiwgLy8vPCBDaHJvbWF0aWNpdHktZGVyaXZlZCBub24tY29uc3RhbnQgbHVtaW5hbmNlIHN5c3RlbQorICAgIEFWQ09MX1NQQ19DSFJPTUFfREVSSVZFRF9DTCA9IDEzLCAvLy88IENocm9tYXRpY2l0eS1kZXJpdmVkIGNvbnN0YW50IGx1bWluYW5jZSBzeXN0ZW0KKyAgICBBVkNPTF9TUENfSUNUQ1AgICAgICAgPSAxNCwgLy8vPCBJVFUtUiBCVC4yMTAwLTAsIElDdENwCisgICAgQVZDT0xfU1BDX05CICAgICAgICAgICAgICAgIC8vLzwgTm90IHBhcnQgb2YgQUJJCiB9OwotI2RlZmluZSBBVkNPTF9TUENfWUNHQ08gQVZDT0xfU1BDX1lDT0NHCi0KIAogLyoqCiAgKiBNUEVHIHZzIEpQRUcgWVVWIHJhbmdlLgpAQCAtNDQxLDcgKzUwMSw3IEBACiAgICAgQVZDT0xfUkFOR0VfVU5TUEVDSUZJRUQgPSAwLAogICAgIEFWQ09MX1JBTkdFX01QRUcgICAgICAgID0gMSwgLy8vPCB0aGUgbm9ybWFsIDIxOSoyXihuLTgpICJNUEVHIiBZVVYgcmFuZ2VzCiAgICAgQVZDT0xfUkFOR0VfSlBFRyAgICAgICAgPSAyLCAvLy88IHRoZSBub3JtYWwgICAgIDJebi0xICAgIkpQRUciIFlVViByYW5nZXMKLSAgICBBVkNPTF9SQU5HRV9OQiwgICAgICAgICAgICAgIC8vLzwgTm90IHBhcnQgb2YgQUJJCisgICAgQVZDT0xfUkFOR0VfTkIgICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQogfTsKIAogLyoqCkBAIC00NjEsMTMgKzUyMSwxMyBAQAogICovCiBlbnVtIEFWQ2hyb21hTG9jYXRpb24gewogICAgIEFWQ0hST01BX0xPQ19VTlNQRUNJRklFRCA9IDAsCi0gICAgQVZDSFJPTUFfTE9DX0xFRlQgICAgICAgID0gMSwgLy8vPCBtcGVnMi80IDQ6MjowLCBoMjY0IGRlZmF1bHQgZm9yIDQ6MjowCi0gICAgQVZDSFJPTUFfTE9DX0NFTlRFUiAgICAgID0gMiwgLy8vPCBtcGVnMSA0OjI6MCwganBlZyA0OjI6MCwgaDI2MyA0OjI6MAorICAgIEFWQ0hST01BX0xPQ19MRUZUICAgICAgICA9IDEsIC8vLzwgTVBFRy0yLzQgNDoyOjAsIEguMjY0IGRlZmF1bHQgZm9yIDQ6MjowCisgICAgQVZDSFJPTUFfTE9DX0NFTlRFUiAgICAgID0gMiwgLy8vPCBNUEVHLTEgNDoyOjAsIEpQRUcgNDoyOjAsIEguMjYzIDQ6MjowCiAgICAgQVZDSFJPTUFfTE9DX1RPUExFRlQgICAgID0gMywgLy8vPCBJVFUtUiA2MDEsIFNNUFRFIDI3NE0gMjk2TSBTMzE0TShEViA0OjE6MSksIG1wZWcyIDQ6MjoyCiAgICAgQVZDSFJPTUFfTE9DX1RPUCAgICAgICAgID0gNCwKICAgICBBVkNIUk9NQV9MT0NfQk9UVE9NTEVGVCAgPSA1LAogICAgIEFWQ0hST01BX0xPQ19CT1RUT00gICAgICA9IDYsCi0gICAgQVZDSFJPTUFfTE9DX05CLCAgICAgICAgICAgICAgLy8vPCBOb3QgcGFydCBvZiBBQkkKKyAgICBBVkNIUk9NQV9MT0NfTkIgICAgICAgICAgICAgICAvLy88IE5vdCBwYXJ0IG9mIEFCSQogfTsKIAogI2VuZGlmIC8qIEFWVVRJTF9QSVhGTVRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3BwYy9jcHUuYyBiL2xpYmF2dXRpbC9wcGMvY3B1LmMKaW5kZXggMGYxZTk4Mi4uN2JiN2NkOCAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3BwYy9jcHUuYworKysgYi9saWJhdnV0aWwvcHBjL2NwdS5jCkBAIC0xNDgsMyArMTQ4LDE1IEBACiAjZW5kaWYgLyogSEFWRV9BTFRJVkVDICovCiAgICAgcmV0dXJuIDA7CiB9CisKK3NpemVfdCBmZl9nZXRfY3B1X21heF9hbGlnbl9wcGModm9pZCkKK3sKKyAgICBpbnQgZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoZmxhZ3MgJiAoQVZfQ1BVX0ZMQUdfQUxUSVZFQyAgIHwKKyAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfVlNYICAgICAgIHwKKyAgICAgICAgICAgICAgICAgQVZfQ1BVX0ZMQUdfUE9XRVI4KSkKKyAgICAgICAgcmV0dXJuIDE2OworCisgICAgcmV0dXJuIDg7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvcHBjL2NwdS5oIGIvbGliYXZ1dGlsL3BwYy9jcHUuaAppbmRleCAwNzQ0MTU3Li4zNjk3M2E1IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvcHBjL2NwdS5oCisrKyBiL2xpYmF2dXRpbC9wcGMvY3B1LmgKQEAgLTE5LDcgKzE5LDYgQEAKICNpZm5kZWYgQVZVVElMX1BQQ19DUFVfSAogI2RlZmluZSBBVlVUSUxfUFBDX0NQVV9ICiAKLSNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdV9pbnRlcm5hbC5oIgogCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvcHBjL3R5cGVzX2FsdGl2ZWMuaCBiL2xpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWQ4OTU3Li4wMDAwMDAwCi0tLSBhL2xpYmF2dXRpbC9wcGMvdHlwZXNfYWx0aXZlYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNiBHdWlsbGF1bWUgUG9pcmllciA8Z3BvaXJpZXJAbXBsYXllcmhxLmh1PgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZuZGVmIEFWVVRJTF9QUENfVFlQRVNfQUxUSVZFQ19ICi0jZGVmaW5lIEFWVVRJTF9QUENfVFlQRVNfQUxUSVZFQ19ICi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogVmVjdG9yIHR5cGVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNkZWZpbmUgdmVjX3U4ICB2ZWN0b3IgdW5zaWduZWQgY2hhcgotI2RlZmluZSB2ZWNfczggIHZlY3RvciBzaWduZWQgY2hhcgotI2RlZmluZSB2ZWNfdTE2IHZlY3RvciB1bnNpZ25lZCBzaG9ydAotI2RlZmluZSB2ZWNfczE2IHZlY3RvciBzaWduZWQgc2hvcnQKLSNkZWZpbmUgdmVjX3UzMiB2ZWN0b3IgdW5zaWduZWQgaW50Ci0jZGVmaW5lIHZlY19zMzIgdmVjdG9yIHNpZ25lZCBpbnQKLSNkZWZpbmUgdmVjX2YgICB2ZWN0b3IgZmxvYXQKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBOdWxsIHZlY3RvcgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jZGVmaW5lIExPQURfWkVSTyBjb25zdCB2ZWNfdTggemVyb3YgPSB2ZWNfc3BsYXRfdTgoIDAgKQotCi0jZGVmaW5lIHplcm9fdTh2ICAodmVjX3U4KSAgemVyb3YKLSNkZWZpbmUgemVyb19zOHYgICh2ZWNfczgpICB6ZXJvdgotI2RlZmluZSB6ZXJvX3UxNnYgKHZlY191MTYpIHplcm92Ci0jZGVmaW5lIHplcm9fczE2diAodmVjX3MxNikgemVyb3YKLSNkZWZpbmUgemVyb191MzJ2ICh2ZWNfdTMyKSB6ZXJvdgotI2RlZmluZSB6ZXJvX3MzMnYgKHZlY19zMzIpIHplcm92Ci0KLSNlbmRpZiAvKiBBVlVUSUxfUFBDX1RZUEVTX0FMVElWRUNfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCBiL2xpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgKaW5kZXggNTUyNzc0MC4uMjU0ODAxMSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaAorKysgYi9saWJhdnV0aWwvcHBjL3V0aWxfYWx0aXZlYy5oCkBAIC0yOCwxMyArMjgsMzEgQEAKIAogI2luY2x1ZGUgImNvbmZpZy5oIgogCi0jaWYgSEFWRV9BTFRJVkVDX0gKLSNpbmNsdWRlIDxhbHRpdmVjLmg+Ci0jZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVmVjdG9yIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgdmVjX3U4ICB2ZWN0b3IgdW5zaWduZWQgY2hhcgorI2RlZmluZSB2ZWNfczggIHZlY3RvciBzaWduZWQgY2hhcgorI2RlZmluZSB2ZWNfdTE2IHZlY3RvciB1bnNpZ25lZCBzaG9ydAorI2RlZmluZSB2ZWNfczE2IHZlY3RvciBzaWduZWQgc2hvcnQKKyNkZWZpbmUgdmVjX3UzMiB2ZWN0b3IgdW5zaWduZWQgaW50CisjZGVmaW5lIHZlY19zMzIgdmVjdG9yIHNpZ25lZCBpbnQKKyNkZWZpbmUgdmVjX2YgICB2ZWN0b3IgZmxvYXQKIAotI2luY2x1ZGUgInR5cGVzX2FsdGl2ZWMuaCIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTnVsbCB2ZWN0b3IKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT0FEX1pFUk8gY29uc3QgdmVjX3U4IHplcm92ID0gdmVjX3NwbGF0X3U4KCAwICkKKworI2RlZmluZSB6ZXJvX3U4diAgKHZlY191OCkgIHplcm92CisjZGVmaW5lIHplcm9fczh2ICAodmVjX3M4KSAgemVyb3YKKyNkZWZpbmUgemVyb191MTZ2ICh2ZWNfdTE2KSB6ZXJvdgorI2RlZmluZSB6ZXJvX3MxNnYgKHZlY19zMTYpIHplcm92CisjZGVmaW5lIHplcm9fdTMydiAodmVjX3UzMikgemVyb3YKKyNkZWZpbmUgemVyb19zMzJ2ICh2ZWNfczMyKSB6ZXJvdgogCiAjaWYgSEFWRV9BTFRJVkVDCisjaW5jbHVkZSA8YWx0aXZlYy5oPgogCiAvLyB1c2VkIHRvIGJ1aWxkIHJlZ2lzdGVycyBwZXJtdXRhdGlvbiB2ZWN0b3JzICh2Y3BybSkKIC8vIHRoZSAncycgYXJlIGZvciB3b3JkcyBpbiB0aGUgX3NfZWNvbmQgdmVjdG9yCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvcmFuZG9tX3NlZWQuYyBiL2xpYmF2dXRpbC9yYW5kb21fc2VlZC5jCmluZGV4IDIwNWE2MzYuLjcwZGM1MDkgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9yYW5kb21fc2VlZC5jCisrKyBiL2xpYmF2dXRpbC9yYW5kb21fc2VlZC5jCkBAIC0yNiw5ICsyNiw5IEBACiAjaWYgSEFWRV9JT19ICiAjaW5jbHVkZSA8aW8uaD4KICNlbmRpZgotI2lmIEhBVkVfQ1JZUFRHRU5SQU5ET00KKyNpZiBIQVZFX0JDUllQVAogI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNpbmNsdWRlIDx3aW5jcnlwdC5oPgorI2luY2x1ZGUgPGJjcnlwdC5oPgogI2VuZGlmCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxtYXRoLmg+CkBAIC02NCw5ICs2NCwxMSBAQAogCiBzdGF0aWMgdWludDMyX3QgZ2V0X2dlbmVyaWNfc2VlZCh2b2lkKQogewotICAgIHVpbnQ4X3QgdG1wWzEyMF07CisgICAgdWludDY0X3QgdG1wWzEyMC84XTsKICAgICBzdHJ1Y3QgQVZTSEEgKnNoYSA9ICh2b2lkKil0bXA7CiAgICAgY2xvY2tfdCBsYXN0X3QgID0gMDsKKyAgICBjbG9ja190IGxhc3RfdGQgPSAwOworICAgIGNsb2NrX3QgaW5pdF90ID0gMDsKICAgICBzdGF0aWMgdWludDY0X3QgaSA9IDA7CiAgICAgc3RhdGljIHVpbnQzMl90IGJ1ZmZlcls1MTJdID0geyAwIH07CiAgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbMjBdOwpAQCAtODYsMTkgKzg4LDI4IEBACiAKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIGNsb2NrX3QgdCA9IGNsb2NrKCk7Ci0KLSAgICAgICAgaWYgKGxhc3RfdCA9PSB0KSB7Ci0gICAgICAgICAgICBidWZmZXJbaSAmIDUxMV0rKzsKKyAgICAgICAgaWYgKGxhc3RfdCArIDIqbGFzdF90ZCArIChDTE9DS1NfUEVSX1NFQyA+IDEwMDApID49IHQpIHsKKyAgICAgICAgICAgIGxhc3RfdGQgPSB0IC0gbGFzdF90OworICAgICAgICAgICAgYnVmZmVyW2kgJiA1MTFdID0gMTY2NDUyNSpidWZmZXJbaSAmIDUxMV0gKyAxMDEzOTA0MjIzICsgKGxhc3RfdGQgJSAzMjk0NjM4NTIxVSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXJbKytpICYgNTExXSArPSAodCAtIGxhc3RfdCkgJSAzMjk0NjM4NTIxVTsKLSAgICAgICAgICAgIGlmIChsYXN0X2kgJiYgaSAtIGxhc3RfaSA+IDQgfHwgaSAtIGxhc3RfaSA+IDY0IHx8IFRFU1QgJiYgaSAtIGxhc3RfaSA+IDgpCi0gICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBsYXN0X3RkID0gdCAtIGxhc3RfdDsKKyAgICAgICAgICAgIGJ1ZmZlclsrK2kgJiA1MTFdICs9IGxhc3RfdGQgJSAzMjk0NjM4NTIxVTsKKyAgICAgICAgICAgIGlmICgodCAtIGluaXRfdCkgPj0gQ0xPQ0tTX1BFUl9TRUM+PjUpCisgICAgICAgICAgICAgICAgaWYgKGxhc3RfaSAmJiBpIC0gbGFzdF9pID4gNCB8fCBpIC0gbGFzdF9pID4gNjQgfHwgVEVTVCAmJiBpIC0gbGFzdF9pID4gOCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgbGFzdF90ID0gdDsKKyAgICAgICAgaWYgKCFpbml0X3QpCisgICAgICAgICAgICBpbml0X3QgPSB0OwogICAgIH0KIAotICAgIGlmKFRFU1QpCisgICAgaWYoVEVTVCkgewogICAgICAgICBidWZmZXJbMF0gPSBidWZmZXJbMV0gPSAwOworICAgIH0gZWxzZSB7CisjaWZkZWYgQVZfUkVBRF9USU1FCisgICAgICAgIGJ1ZmZlclsxMTFdICs9IEFWX1JFQURfVElNRSgpOworI2VuZGlmCisgICAgfQogCiAgICAgYXZfc2hhX2luaXQoc2hhLCAxNjApOwogICAgIGF2X3NoYV91cGRhdGUoc2hhLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwpAQCAtMTEwLDEzICsxMjEsMTQgQEAKIHsKICAgICB1aW50MzJfdCBzZWVkOwogCi0jaWYgSEFWRV9DUllQVEdFTlJBTkRPTQotICAgIEhDUllQVFBST1YgcHJvdmlkZXI7Ci0gICAgaWYgKENyeXB0QWNxdWlyZUNvbnRleHQoJnByb3ZpZGVyLCBOVUxMLCBOVUxMLCBQUk9WX1JTQV9GVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENSWVBUX1ZFUklGWUNPTlRFWFQgfCBDUllQVF9TSUxFTlQpKSB7Ci0gICAgICAgIEJPT0wgcmV0ID0gQ3J5cHRHZW5SYW5kb20ocHJvdmlkZXIsIHNpemVvZihzZWVkKSwgKFBCWVRFKSAmc2VlZCk7Ci0gICAgICAgIENyeXB0UmVsZWFzZUNvbnRleHQocHJvdmlkZXIsIDApOwotICAgICAgICBpZiAocmV0KQorI2lmIEhBVkVfQkNSWVBUCisgICAgQkNSWVBUX0FMR19IQU5ETEUgYWxnb19oYW5kbGU7CisgICAgTlRTVEFUVVMgcmV0ID0gQkNyeXB0T3BlbkFsZ29yaXRobVByb3ZpZGVyKCZhbGdvX2hhbmRsZSwgQkNSWVBUX1JOR19BTEdPUklUSE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TX1BSSU1JVElWRV9QUk9WSURFUiwgMCk7CisgICAgaWYgKEJDUllQVF9TVUNDRVNTKHJldCkpIHsKKyAgICAgICAgTlRTVEFUVVMgcmV0ID0gQkNyeXB0R2VuUmFuZG9tKGFsZ29faGFuZGxlLCAoVUNIQVIqKSZzZWVkLCBzaXplb2Yoc2VlZCksIDApOworICAgICAgICBCQ3J5cHRDbG9zZUFsZ29yaXRobVByb3ZpZGVyKGFsZ29faGFuZGxlLCAwKTsKKyAgICAgICAgaWYgKEJDUllQVF9TVUNDRVNTKHJldCkpCiAgICAgICAgICAgICByZXR1cm4gc2VlZDsKICAgICB9CiAjZW5kaWYKQEAgLTEzMSwyOSArMTQzLDMgQEAKICAgICAgICAgcmV0dXJuIHNlZWQ7CiAgICAgcmV0dXJuIGdldF9nZW5lcmljX3NlZWQoKTsKIH0KLQotI2lmIFRFU1QKLSN1bmRlZiBwcmludGYKLSNkZWZpbmUgTiAyNTYKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCBpLCBqLCByZXRyeTsKLSAgICB1aW50MzJfdCBzZWVkc1tOXTsKLQotICAgIGZvciAocmV0cnk9MDsgcmV0cnk8MzsgcmV0cnkrKyl7Ci0gICAgICAgIGZvciAoaT0wOyBpPE47IGkrKyl7Ci0gICAgICAgICAgICBzZWVkc1tpXSA9IGF2X2dldF9yYW5kb21fc2VlZCgpOwotICAgICAgICAgICAgZm9yIChqPTA7IGo8aTsgaisrKQotICAgICAgICAgICAgICAgIGlmIChzZWVkc1tqXSA9PSBzZWVkc1tpXSkKLSAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeTsKLSAgICAgICAgfQotICAgICAgICBwcmludGYoInNlZWRzIE9LXG4iKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIHJldHJ5OjsKLSAgICB9Ci0gICAgcHJpbnRmKCJGQUlMIGF0ICVkIHdpdGggJVhcbiIsIGosIHNlZWRzW2pdKTsKLSAgICByZXR1cm4gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3JhdGlvbmFsLmMgYi9saWJhdnV0aWwvcmF0aW9uYWwuYwppbmRleCA2YjNmNTBhLi4zNWVlMDg4IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvcmF0aW9uYWwuYworKysgYi9saWJhdnV0aWwvcmF0aW9uYWwuYwpAQCAtMTE1LDcgKzExNSw4IEBACiAgICAgZnJleHAoZCwgJmV4cG9uZW50KTsKICAgICBleHBvbmVudCA9IEZGTUFYKGV4cG9uZW50LTEsIDApOwogICAgIGRlbiA9IDFMTCA8PCAoNjEgLSBleHBvbmVudCk7Ci0gICAgLy8gKGludDY0X3QpcmludCgpIGFuZCBsbHJpbnQoKSBkbyBub3Qgd29yayB3aXRoIGdjYyBvbiBpYTY0IGFuZCBzcGFyYzY0CisgICAgLy8gKGludDY0X3QpcmludCgpIGFuZCBsbHJpbnQoKSBkbyBub3Qgd29yayB3aXRoIGdjYyBvbiBpYTY0IGFuZCBzcGFyYzY0LAorICAgIC8vIHNlZSBUaWNrZXQyNzEzIGZvciBhZmZlY3RlZCBnY2MvZ2xpYmMgdmVyc2lvbnMKICAgICBhdl9yZWR1Y2UoJmEubnVtLCAmYS5kZW4sIGZsb29yKGQgKiBkZW4gKyAwLjUpLCBkZW4sIG1heCk7CiAgICAgaWYgKCghYS5udW0gfHwgIWEuZGVuKSAmJiBkICYmIG1heD4wICYmIG1heDxJTlRfTUFYKQogICAgICAgICBhdl9yZWR1Y2UoJmEubnVtLCAmYS5kZW4sIGZsb29yKGQgKiBkZW4gKyAwLjUpLCBkZW4sIElOVF9NQVgpOwpAQCAtMTgxLDExOSArMTgyLDMgQEAKIAogICAgIHJldHVybiBzaWduPDwzMSB8ICgxNTAtc2hpZnQpPDwyMyB8IChuIC0gKDE8PDIzKSk7CiB9Ci0KLSNpZmRlZiBURVNUCi0KLSNpbmNsdWRlICJpbnRlZ2VyLmgiCi0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgQVZSYXRpb25hbCBhLGIscjsKLSAgICBpbnQgaSxqLGs7Ci0gICAgc3RhdGljIGNvbnN0IGludDY0X3QgbnVtbGlzdFtdID0gewotICAgICAgICBJTlQ2NF9NSU4sIElOVDY0X01JTisxLCBJTlQ2NF9NQVgsIElOVDMyX01JTiwgSU5UMzJfTUFYLCAxLDAsLTEsCi0gICAgICAgIDEyMzQ1Njc4OSwgSU5UMzJfTUFYLTEsIElOVDMyX01BWCsxTEwsIFVJTlQzMl9NQVgtMSwgVUlOVDMyX01BWCwgVUlOVDMyX01BWCsxTEwKLSAgICB9OwotCi0gICAgZm9yIChhLm51bSA9IC0yOyBhLm51bSA8PSAyOyBhLm51bSsrKSB7Ci0gICAgICAgIGZvciAoYS5kZW4gPSAtMjsgYS5kZW4gPD0gMjsgYS5kZW4rKykgewotICAgICAgICAgICAgZm9yIChiLm51bSA9IC0yOyBiLm51bSA8PSAyOyBiLm51bSsrKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChiLmRlbiA9IC0yOyBiLmRlbiA8PSAyOyBiLmRlbisrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBjID0gYXZfY21wX3EoYSxiKTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQgPSBhdl9xMmQoYSkgPT0gYXZfcTJkKGIpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogKGF2X3EyZChhKSAtIGF2X3EyZChiKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkID4gMCkgICAgICAgZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGQgPCAwKSAgZCA9IC0xOwotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkICE9IGQpIGQgPSBJTlRfTUlOOwotICAgICAgICAgICAgICAgICAgICBpZiAoYyAhPSBkKQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkLyVkICVkLyVkLCAlZCAlZlxuIiwgYS5udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5kZW4sIGIubnVtLCBiLmRlbiwgYyxkKTsKLSAgICAgICAgICAgICAgICAgICAgciA9IGF2X3N1Yl9xKGF2X2FkZF9xKGIsYSksIGIpOwotICAgICAgICAgICAgICAgICAgICBpZihiLmRlbiAmJiAoci5udW0qYS5kZW4gIT0gYS5udW0qci5kZW4gfHwgIXIubnVtICE9ICFhLm51bSB8fCAhci5kZW4gIT0gIWEuZGVuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZC8lZCAiLCByLm51bSwgci5kZW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhudW1saXN0KTsgaSsrKSB7Ci0gICAgICAgIGludDY0X3QgYSA9IG51bWxpc3RbaV07Ci0KLSAgICAgICAgZm9yIChqID0gMDsgaiA8IEZGX0FSUkFZX0VMRU1TKG51bWxpc3QpOyBqKyspIHsKLSAgICAgICAgICAgIGludDY0X3QgYiA9IG51bWxpc3Rbal07Ci0gICAgICAgICAgICBpZiAoYjw9MCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBGRl9BUlJBWV9FTEVNUyhudW1saXN0KTsgaysrKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBjID0gbnVtbGlzdFtrXTsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHJlczsKLSAgICAgICAgICAgICAgICBBVkludGVnZXIgYWk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoYzw9MCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgcmVzID0gYXZfcmVzY2FsZV9ybmQoYSxiLGMsIEFWX1JPVU5EX1pFUk8pOwotCi0gICAgICAgICAgICAgICAgYWkgPSBhdl9tdWxfaShhdl9pbnQyaShhKSwgYXZfaW50MmkoYikpOwotICAgICAgICAgICAgICAgIGFpID0gYXZfZGl2X2koYWksIGF2X2ludDJpKGMpKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdl9jbXBfaShhaSwgYXZfaW50MmkoSU5UNjRfTUFYKSkgPiAwICYmIHJlcyA9PSBJTlQ2NF9NSU4pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChhdl9jbXBfaShhaSwgYXZfaW50MmkoSU5UNjRfTUlOKSkgPCAwICYmIHJlcyA9PSBJTlQ2NF9NSU4pCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGlmIChhdl9jbXBfaShhaSwgYXZfaW50MmkocmVzKSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGV4Y2VwdGlvbiBmb3IgSU5UNjRfTUlOLCByZW1vdmUgdGhpcyBpbiBjYXNlIElOVDY0X01JTiBpcyBoYW5kbGVkIHdpdGhvdXQgb2ZmIGJ5IDEgZXJyb3IKLSAgICAgICAgICAgICAgICBpZiAoYXZfY21wX2koYWksIGF2X2ludDJpKHJlcy0xKSkgPT0gMCAmJiBhID09IElOVDY0X01JTikKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJSJQUklkNjQiICogJSJQUklkNjQiIC8gJSJQUklkNjQiID0gJSJQUklkNjQiIG9yICUiUFJJZDY0IlxuIiwgYSxiLGMsIHJlcywgYXZfaTJpbnQoYWkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoYS5udW0gPSAxOyBhLm51bSA8PSAxMDsgYS5udW0rKykgewotICAgICAgICBmb3IgKGEuZGVuID0gMTsgYS5kZW4gPD0gMTA7IGEuZGVuKyspIHsKLSAgICAgICAgICAgIGlmIChhdl9nY2QoYS5udW0sIGEuZGVuKSA+IDEpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBmb3IgKGIubnVtID0gMTsgYi5udW0gPD0gMTA7IGIubnVtKyspIHsKLSAgICAgICAgICAgICAgICBmb3IgKGIuZGVuID0gMTsgYi5kZW4gPD0gMTA7IGIuZGVuKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICBpZiAoYXZfZ2NkKGIubnVtLCBiLmRlbikgPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdl9jbXBfcShiLCBhKSA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgMTAgOyBzdGFydCsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNjPSBzdGFydDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpPDEwMDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4YWN0ID0gc3RhcnQgKyBhdl9yZXNjYWxlX3EoaSsxLCBiLCBhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2MgPSBhdl9hZGRfc3RhYmxlKGEsIGFjYywgYiwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEZGQUJTKGFjYyAtIGV4YWN0KSA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkLyVkICVkLyVkLCAlZCAlZFxuIiwgYS5udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLmRlbiwgYi5udW0sIGIuZGVuLCBhY2MsIGV4YWN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChhLmRlbiA9IDE7IGEuZGVuIDwgMHgxMDAwMDAwMDBVLzM7IGEuZGVuKj0zKSB7Ci0gICAgICAgIGZvciAoYS5udW0gPSAtMTsgYS5udW0gPCAoMTw8MjcpOyBhLm51bSArPSAxICsgYS5udW0vMTAwKSB7Ci0gICAgICAgICAgICBmbG9hdCBmICA9IGF2X2ludDJmbG9hdChhdl9xMmludGZsb2F0KGEpKTsKLSAgICAgICAgICAgIGZsb2F0IGYyID0gYXZfcTJkKGEpOwotICAgICAgICAgICAgaWYgKGZhYnMoZiAtIGYyKSA+IGZhYnMoZikvNTAwMDAwMCkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZC8lZCAlZiAlZlxuIiwgYS5udW0sCi0gICAgICAgICAgICAgICAgICAgICAgIGEuZGVuLCBmLCBmMik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvcmF0aW9uYWwuaCBiL2xpYmF2dXRpbC9yYXRpb25hbC5oCmluZGV4IDI4OTc0NjkuLjVjNmI2N2IgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9yYXRpb25hbC5oCisrKyBiL2xpYmF2dXRpbC9yYXRpb25hbC5oCkBAIC0yMSw3ICsyMSw4IEBACiAKIC8qKgogICogQGZpbGUKLSAqIHJhdGlvbmFsIG51bWJlcnMKKyAqIEBpbmdyb3VwIGxhdnVfbWF0aF9yYXRpb25hbAorICogVXRpbHRpZXMgZm9yIHJhdGlvbmFsIG51bWJlciBjYWxjdWxhdGlvbi4KICAqIEBhdXRob3IgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KICAqLwogCkBAIC0zMywyMiArMzQsMzkgQEAKICNpbmNsdWRlICJhdHRyaWJ1dGVzLmgiCiAKIC8qKgotICogQGFkZHRvZ3JvdXAgbGF2dV9tYXRoCisgKiBAZGVmZ3JvdXAgbGF2dV9tYXRoX3JhdGlvbmFsIEFWUmF0aW9uYWwKKyAqIEBpbmdyb3VwIGxhdnVfbWF0aAorICogUmF0aW9uYWwgbnVtYmVyIGNhbGN1bGF0aW9uLgorICoKKyAqIFdoaWxlIHJhdGlvbmFsIG51bWJlcnMgY2FuIGJlIGV4cHJlc3NlZCBhcyBmbG9hdGluZy1wb2ludCBudW1iZXJzLCB0aGUKKyAqIGNvbnZlcnNpb24gcHJvY2VzcyBpcyBhIGxvc3N5IG9uZSwgc28gYXJlIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMuIE9uIHRoZQorICogb3RoZXIgaGFuZCwgdGhlIG5hdHVyZSBvZiBGRm1wZWcgZGVtYW5kcyBoaWdobHkgYWNjdXJhdGUgY2FsY3VsYXRpb24gb2YKKyAqIHRpbWVzdGFtcHMuIFRoaXMgc2V0IG9mIHJhdGlvbmFsIG51bWJlciB1dGlsaXRpZXMgc2VydmVzIGFzIGEgZ2VuZXJpYworICogaW50ZXJmYWNlIGZvciBtYW5pcHVsYXRpbmcgcmF0aW9uYWwgbnVtYmVycyBhcyBwYWlycyBvZiBudW1lcmF0b3JzIGFuZAorICogZGVub21pbmF0b3JzLgorICoKKyAqIE1hbnkgb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IG9wZXJhdGUgb24gQVZSYXRpb25hbCdzIGhhdmUgdGhlIHN1ZmZpeCBgX3FgLCBpbgorICogcmVmZXJlbmNlIHRvIHRoZSBtYXRoZW1hdGljYWwgc3ltYm9sICLihJoiIChRKSB3aGljaCBkZW5vdGVzIHRoZSBzZXQgb2YgYWxsCisgKiByYXRpb25hbCBudW1iZXJzLgorICoKICAqIEB7CiAgKi8KIAogLyoqCi0gKiByYXRpb25hbCBudW1iZXIgbnVtZXJhdG9yL2Rlbm9taW5hdG9yCisgKiBSYXRpb25hbCBudW1iZXIgKHBhaXIgb2YgbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvcikuCiAgKi8KIHR5cGVkZWYgc3RydWN0IEFWUmF0aW9uYWx7Ci0gICAgaW50IG51bTsgLy8vPCBudW1lcmF0b3IKLSAgICBpbnQgZGVuOyAvLy88IGRlbm9taW5hdG9yCisgICAgaW50IG51bTsgLy8vPCBOdW1lcmF0b3IKKyAgICBpbnQgZGVuOyAvLy88IERlbm9taW5hdG9yCiB9IEFWUmF0aW9uYWw7CiAKIC8qKgotICogQ3JlYXRlIGEgcmF0aW9uYWwuCisgKiBDcmVhdGUgYW4gQVZSYXRpb25hbC4KKyAqCiAgKiBVc2VmdWwgZm9yIGNvbXBpbGVycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGNvbXBvdW5kIGxpdGVyYWxzLgotICogQG5vdGUgIFRoZSByZXR1cm4gdmFsdWUgaXMgbm90IHJlZHVjZWQuCisgKgorICogQG5vdGUgVGhlIHJldHVybiB2YWx1ZSBpcyBub3QgcmVkdWNlZC4KKyAqIEBzZWUgYXZfcmVkdWNlKCkKICAqLwogc3RhdGljIGlubGluZSBBVlJhdGlvbmFsIGF2X21ha2VfcShpbnQgbnVtLCBpbnQgZGVuKQogewpAQCAtNTgsMTAgKzc2LDE1IEBACiAKIC8qKgogICogQ29tcGFyZSB0d28gcmF0aW9uYWxzLgotICogQHBhcmFtIGEgZmlyc3QgcmF0aW9uYWwKLSAqIEBwYXJhbSBiIHNlY29uZCByYXRpb25hbAotICogQHJldHVybiAwIGlmIGE9PWIsIDEgaWYgYT5iLCAtMSBpZiBhPGIsIGFuZCBJTlRfTUlOIGlmIG9uZSBvZiB0aGUKLSAqIHZhbHVlcyBpcyBvZiB0aGUgZm9ybSAwLzAKKyAqCisgKiBAcGFyYW0gYSBGaXJzdCByYXRpb25hbAorICogQHBhcmFtIGIgU2Vjb25kIHJhdGlvbmFsCisgKgorICogQHJldHVybiBPbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisgKiAgICAgICAgIC0gMCBpZiBgYSA9PSBiYAorICogICAgICAgICAtIDEgaWYgYGEgPiBiYAorICogICAgICAgICAtIC0xIGlmIGBhIDwgYmAKKyAqICAgICAgICAgLSBgSU5UX01JTmAgaWYgb25lIG9mIHRoZSB2YWx1ZXMgaXMgb2YgdGhlIGZvcm0gYDAgLyAwYAogICovCiBzdGF0aWMgaW5saW5lIGludCBhdl9jbXBfcShBVlJhdGlvbmFsIGEsIEFWUmF0aW9uYWwgYil7CiAgICAgY29uc3QgaW50NjRfdCB0bXA9IGEubnVtICogKGludDY0X3QpYi5kZW4gLSBiLm51bSAqIChpbnQ2NF90KWEuZGVuOwpAQCAtNzMsOSArOTYsMTAgQEAKIH0KIAogLyoqCi0gKiBDb252ZXJ0IHJhdGlvbmFsIHRvIGRvdWJsZS4KLSAqIEBwYXJhbSBhIHJhdGlvbmFsIHRvIGNvbnZlcnQKLSAqIEByZXR1cm4gKGRvdWJsZSkgYQorICogQ29udmVydCBhbiBBVlJhdGlvbmFsIHRvIGEgYGRvdWJsZWAuCisgKiBAcGFyYW0gYSBBVlJhdGlvbmFsIHRvIGNvbnZlcnQKKyAqIEByZXR1cm4gYGFgIGluIGZsb2F0aW5nLXBvaW50IGZvcm0KKyAqIEBzZWUgYXZfZDJxKCkKICAqLwogc3RhdGljIGlubGluZSBkb3VibGUgYXZfcTJkKEFWUmF0aW9uYWwgYSl7CiAgICAgcmV0dXJuIGEubnVtIC8gKGRvdWJsZSkgYS5kZW47CkBAIC04Myw0NCArMTA3LDQ2IEBACiAKIC8qKgogICogUmVkdWNlIGEgZnJhY3Rpb24uCisgKgogICogVGhpcyBpcyB1c2VmdWwgZm9yIGZyYW1lcmF0ZSBjYWxjdWxhdGlvbnMuCi0gKiBAcGFyYW0gZHN0X251bSBkZXN0aW5hdGlvbiBudW1lcmF0b3IKLSAqIEBwYXJhbSBkc3RfZGVuIGRlc3RpbmF0aW9uIGRlbm9taW5hdG9yCi0gKiBAcGFyYW0gbnVtIHNvdXJjZSBudW1lcmF0b3IKLSAqIEBwYXJhbSBkZW4gc291cmNlIGRlbm9taW5hdG9yCi0gKiBAcGFyYW0gbWF4IHRoZSBtYXhpbXVtIGFsbG93ZWQgZm9yIGRzdF9udW0gJiBkc3RfZGVuCi0gKiBAcmV0dXJuIDEgaWYgZXhhY3QsIDAgb3RoZXJ3aXNlCisgKgorICogQHBhcmFtW291dF0gZHN0X251bSBEZXN0aW5hdGlvbiBudW1lcmF0b3IKKyAqIEBwYXJhbVtvdXRdIGRzdF9kZW4gRGVzdGluYXRpb24gZGVub21pbmF0b3IKKyAqIEBwYXJhbVtpbl0gICAgICBudW0gU291cmNlIG51bWVyYXRvcgorICogQHBhcmFtW2luXSAgICAgIGRlbiBTb3VyY2UgZGVub21pbmF0b3IKKyAqIEBwYXJhbVtpbl0gICAgICBtYXggTWF4aW11bSBhbGxvd2VkIHZhbHVlcyBmb3IgYGRzdF9udW1gICYgYGRzdF9kZW5gCisgKiBAcmV0dXJuIDEgaWYgdGhlIG9wZXJhdGlvbiBpcyBleGFjdCwgMCBvdGhlcndpc2UKICAqLwogaW50IGF2X3JlZHVjZShpbnQgKmRzdF9udW0sIGludCAqZHN0X2RlbiwgaW50NjRfdCBudW0sIGludDY0X3QgZGVuLCBpbnQ2NF90IG1heCk7CiAKIC8qKgogICogTXVsdGlwbHkgdHdvIHJhdGlvbmFscy4KLSAqIEBwYXJhbSBiIGZpcnN0IHJhdGlvbmFsCi0gKiBAcGFyYW0gYyBzZWNvbmQgcmF0aW9uYWwKKyAqIEBwYXJhbSBiIEZpcnN0IHJhdGlvbmFsCisgKiBAcGFyYW0gYyBTZWNvbmQgcmF0aW9uYWwKICAqIEByZXR1cm4gYipjCiAgKi8KIEFWUmF0aW9uYWwgYXZfbXVsX3EoQVZSYXRpb25hbCBiLCBBVlJhdGlvbmFsIGMpIGF2X2NvbnN0OwogCiAvKioKICAqIERpdmlkZSBvbmUgcmF0aW9uYWwgYnkgYW5vdGhlci4KLSAqIEBwYXJhbSBiIGZpcnN0IHJhdGlvbmFsCi0gKiBAcGFyYW0gYyBzZWNvbmQgcmF0aW9uYWwKKyAqIEBwYXJhbSBiIEZpcnN0IHJhdGlvbmFsCisgKiBAcGFyYW0gYyBTZWNvbmQgcmF0aW9uYWwKICAqIEByZXR1cm4gYi9jCiAgKi8KIEFWUmF0aW9uYWwgYXZfZGl2X3EoQVZSYXRpb25hbCBiLCBBVlJhdGlvbmFsIGMpIGF2X2NvbnN0OwogCiAvKioKICAqIEFkZCB0d28gcmF0aW9uYWxzLgotICogQHBhcmFtIGIgZmlyc3QgcmF0aW9uYWwKLSAqIEBwYXJhbSBjIHNlY29uZCByYXRpb25hbAorICogQHBhcmFtIGIgRmlyc3QgcmF0aW9uYWwKKyAqIEBwYXJhbSBjIFNlY29uZCByYXRpb25hbAogICogQHJldHVybiBiK2MKICAqLwogQVZSYXRpb25hbCBhdl9hZGRfcShBVlJhdGlvbmFsIGIsIEFWUmF0aW9uYWwgYykgYXZfY29uc3Q7CiAKIC8qKgogICogU3VidHJhY3Qgb25lIHJhdGlvbmFsIGZyb20gYW5vdGhlci4KLSAqIEBwYXJhbSBiIGZpcnN0IHJhdGlvbmFsCi0gKiBAcGFyYW0gYyBzZWNvbmQgcmF0aW9uYWwKKyAqIEBwYXJhbSBiIEZpcnN0IHJhdGlvbmFsCisgKiBAcGFyYW0gYyBTZWNvbmQgcmF0aW9uYWwKICAqIEByZXR1cm4gYi1jCiAgKi8KIEFWUmF0aW9uYWwgYXZfc3ViX3EoQVZSYXRpb25hbCBiLCBBVlJhdGlvbmFsIGMpIGF2X2NvbnN0OwpAQCAtMTM4LDMxICsxNjQsNDYgQEAKIAogLyoqCiAgKiBDb252ZXJ0IGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gYSByYXRpb25hbC4KLSAqIGluZiBpcyBleHByZXNzZWQgYXMgezEsMH0gb3Igey0xLDB9IGRlcGVuZGluZyBvbiB0aGUgc2lnbi4KICAqCi0gKiBAcGFyYW0gZCBkb3VibGUgdG8gY29udmVydAotICogQHBhcmFtIG1heCB0aGUgbWF4aW11bSBhbGxvd2VkIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IKLSAqIEByZXR1cm4gKEFWUmF0aW9uYWwpIGQKKyAqIEluIGNhc2Ugb2YgaW5maW5pdHksIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBleHByZXNzZWQgYXMgYHsxLCAwfWAgb3IKKyAqIGB7LTEsIDB9YCBkZXBlbmRpbmcgb24gdGhlIHNpZ24uCisgKgorICogQHBhcmFtIGQgICBgZG91YmxlYCB0byBjb252ZXJ0CisgKiBAcGFyYW0gbWF4IE1heGltdW0gYWxsb3dlZCBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yCisgKiBAcmV0dXJuIGBkYCBpbiBBVlJhdGlvbmFsIGZvcm0KKyAqIEBzZWUgYXZfcTJkKCkKICAqLwogQVZSYXRpb25hbCBhdl9kMnEoZG91YmxlIGQsIGludCBtYXgpIGF2X2NvbnN0OwogCiAvKioKLSAqIEByZXR1cm4gMSBpZiBxMSBpcyBuZWFyZXIgdG8gcSB0aGFuIHEyLCAtMSBpZiBxMiBpcyBuZWFyZXIKLSAqIHRoYW4gcTEsIDAgaWYgdGhleSBoYXZlIHRoZSBzYW1lIGRpc3RhbmNlLgorICogRmluZCB3aGljaCBvZiB0aGUgdHdvIHJhdGlvbmFscyBpcyBjbG9zZXIgdG8gYW5vdGhlciByYXRpb25hbC4KKyAqCisgKiBAcGFyYW0gcSAgICAgUmF0aW9uYWwgdG8gYmUgY29tcGFyZWQgYWdhaW5zdAorICogQHBhcmFtIHExLHEyIFJhdGlvbmFscyB0byBiZSB0ZXN0ZWQKKyAqIEByZXR1cm4gT25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICogICAgICAgICAtIDEgaWYgYHExYCBpcyBuZWFyZXIgdG8gYHFgIHRoYW4gYHEyYAorICogICAgICAgICAtIC0xIGlmIGBxMmAgaXMgbmVhcmVyIHRvIGBxYCB0aGFuIGBxMWAKKyAqICAgICAgICAgLSAwIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBkaXN0YW5jZQogICovCiBpbnQgYXZfbmVhcmVyX3EoQVZSYXRpb25hbCBxLCBBVlJhdGlvbmFsIHExLCBBVlJhdGlvbmFsIHEyKTsKIAogLyoqCi0gKiBGaW5kIHRoZSBuZWFyZXN0IHZhbHVlIGluIHFfbGlzdCB0byBxLgotICogQHBhcmFtIHFfbGlzdCBhbiBhcnJheSBvZiByYXRpb25hbHMgdGVybWluYXRlZCBieSB7MCwgMH0KLSAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBuZWFyZXN0IHZhbHVlIGZvdW5kIGluIHRoZSBhcnJheQorICogRmluZCB0aGUgdmFsdWUgaW4gYSBsaXN0IG9mIHJhdGlvbmFscyBuZWFyZXN0IGEgZ2l2ZW4gcmVmZXJlbmNlIHJhdGlvbmFsLgorICoKKyAqIEBwYXJhbSBxICAgICAgUmVmZXJlbmNlIHJhdGlvbmFsCisgKiBAcGFyYW0gcV9saXN0IEFycmF5IG9mIHJhdGlvbmFscyB0ZXJtaW5hdGVkIGJ5IGB7MCwgMH1gCisgKiBAcmV0dXJuIEluZGV4IG9mIHRoZSBuZWFyZXN0IHZhbHVlIGZvdW5kIGluIHRoZSBhcnJheQogICovCiBpbnQgYXZfZmluZF9uZWFyZXN0X3FfaWR4KEFWUmF0aW9uYWwgcSwgY29uc3QgQVZSYXRpb25hbCogcV9saXN0KTsKIAogLyoqCi0gKiBDb252ZXJ0cyBhIEFWUmF0aW9uYWwgdG8gYSBJRUVFIDMyYml0IGZsb2F0LgorICogQ29udmVydCBhbiBBVlJhdGlvbmFsIHRvIGEgSUVFRSAzMi1iaXQgYGZsb2F0YCBleHByZXNzZWQgaW4gZml4ZWQtcG9pbnQKKyAqIGZvcm1hdC4KICAqCi0gKiBUaGUgZmxvYXQgaXMgcmV0dXJuZWQgaW4gYSB1aW50MzJfdCBhbmQgaXRzIHZhbHVlIGlzIHBsYXRmb3JtIGluZGVwZW5hbnQuCisgKiBAcGFyYW0gcSBSYXRpb25hbCB0byBiZSBjb252ZXJ0ZWQKKyAqIEByZXR1cm4gRXF1aXZhbGVudCBmbG9hdGluZy1wb2ludCB2YWx1ZSwgZXhwcmVzc2VkIGFzIGFuIHVuc2lnbmVkIDMyLWJpdAorICogICAgICAgICBpbnRlZ2VyLgorICogQG5vdGUgVGhlIHJldHVybmVkIHZhbHVlIGlzIHBsYXRmb3JtLWluZGVwZWRhbnQuCiAgKi8KIHVpbnQzMl90IGF2X3EyaW50ZmxvYXQoQVZSYXRpb25hbCBxKTsKIApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3JlcGxheWdhaW4uaCBiL2xpYmF2dXRpbC9yZXBsYXlnYWluLmgKaW5kZXggNWMwM2UxOS4uYjQ5YmYxYSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3JlcGxheWdhaW4uaAorKysgYi9saWJhdnV0aWwvcmVwbGF5Z2Fpbi5oCkBAIC0xLDUgKzEsNCBAQAogLyoKLSAqCiAgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCiAgKgogICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3JldmVyc2UuaCBiL2xpYmF2dXRpbC9yZXZlcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViNjEyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9yZXZlcnNlLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1JFVkVSU0VfSAorI2RlZmluZSBBVlVUSUxfUkVWRVJTRV9ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZmZfcmV2ZXJzZVsyNTZdOworCisjZW5kaWYgLyogQVZVVElMX1JFVkVSU0VfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3JpcGVtZC5jIGIvbGliYXZ1dGlsL3JpcGVtZC5jCmluZGV4IDY3NzdjOTkuLjRmMWM0ZWEgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9yaXBlbWQuYworKysgYi9saWJhdnV0aWwvcmlwZW1kLmMKQEAgLTUxMCw3ICs1MTAsMTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorI2lmIEZGX0FQSV9DUllQVE9fU0laRV9UCiB2b2lkIGF2X3JpcGVtZF91cGRhdGUoQVZSSVBFTUQqIGN0eCwgY29uc3QgdWludDhfdCogZGF0YSwgdW5zaWduZWQgaW50IGxlbikKKyNlbHNlCit2b2lkIGF2X3JpcGVtZF91cGRhdGUoQVZSSVBFTUQqIGN0eCwgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbikKKyNlbmRpZgogewogICAgIHVuc2lnbmVkIGludCBpLCBqOwogCkBAIC01NDksNTcgKzU1MywzIEBACiAgICAgZm9yIChpID0gMDsgaSA8IGN0eC0+ZGlnZXN0X2xlbjsgaSsrKQogICAgICAgICBBVl9XTDMyKGRpZ2VzdCArIGkqNCwgY3R4LT5zdGF0ZVtpXSk7CiB9Ci0KLSNpZmRlZiBURVNUCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgaSwgaiwgazsKLSAgICBBVlJJUEVNRCBjdHg7Ci0gICAgdW5zaWduZWQgY2hhciBkaWdlc3RbNDBdOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuZ3Roc1s0XSA9IHsgMTI4LCAxNjAsIDI1NiwgMzIwIH07Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0gICAgICAgIHByaW50ZigiVGVzdGluZyBSSVBFTUQtJWRcbiIsIGxlbmd0aHNbal0pOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7Ci0gICAgICAgICAgICBhdl9yaXBlbWRfaW5pdCgmY3R4LCBsZW5ndGhzW2pdKTsKLSAgICAgICAgICAgIGlmIChrID09IDApCi0gICAgICAgICAgICAgICAgYXZfcmlwZW1kX3VwZGF0ZSgmY3R4LCAiYWJjIiwgMyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChrID09IDEpCi0gICAgICAgICAgICAgICAgYXZfcmlwZW1kX3VwZGF0ZSgmY3R4LCAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLCA1Nik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDAqMTAwMDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBhdl9yaXBlbWRfdXBkYXRlKCZjdHgsICJhIiwgMSk7Ci0gICAgICAgICAgICBhdl9yaXBlbWRfZmluYWwoJmN0eCwgZGlnZXN0KTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGhzW2pdID4+IDM7IGkrKykKLSAgICAgICAgICAgICAgICBwcmludGYoIiUwMlgiLCBkaWdlc3RbaV0pOwotICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGopIHsgLy90ZXN0IHZlY3RvcnMgKGZyb20gSVNPOklFQyAxMDExOC0zICgyMDA0KSBhbmQgaHR0cDovL2hvbWVzLmVzYXQua3VsZXV2ZW4uYmUvfmJvc3NlbGFlL3JpcGVtZDE2MC5odG1sKQotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBwcmludGYoImMxNGExMjE5IDljNjZlNGJhIDg0NjM2YjBmIDY5MTQ0Yzc3XG4iCi0gICAgICAgICAgICAgICAgICAgImExYWEwNjg5IGQwZmFmYTJkIGRjMjJlODhiIDQ5MTMzYTA2XG4iCi0gICAgICAgICAgICAgICAgICAgIjRhN2Y1NzIzIGY5NTRlYmExIDIxNmM5ZDhmIDYzMjA0MzFmXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICBwcmludGYoIjhlYjIwOGY3IGUwNWQ5ODdhIDliMDQ0YThlIDk4YzZiMDg3IGYxNWEwYmZjXG4iCi0gICAgICAgICAgICAgICAgICAgIjEyYTA1MzM4IDRhOWMwYzg4IGU0MDVhMDZjIDI3ZGNmNDlhIGRhNjJlYjJiXG4iCi0gICAgICAgICAgICAgICAgICAgIjUyNzgzMjQzIGMxNjk3YmRiIGUxNmQzN2Y5IDdmNjhmMDgzIDI1ZGMxNTI4XG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICBwcmludGYoImFmYmQ2ZTIyIDhiOWQ4Y2JiIGNlZjVjYTJkIDAzZTZkYmExIDBhYzBiYzdkIGNiZTQ2ODBlIDFlNDJkMmU5IDc1NDU5YjY1XG4iCi0gICAgICAgICAgICAgICAgICAgIjM4NDMwNDU1IDgzYWFjNmM4IGM4ZDkxMjg1IDczZTdhOTgwIDlhZmIyYTBmIDM0Y2NjMzZlIGE5ZTcyZjE2IGY2MzY4ZTNmXG4iCi0gICAgICAgICAgICAgICAgICAgImFjOTUzNzQ0IGUxMGUzMTUxIDRjMTUwZDRkIDhkN2I2NzczIDQyZTMzMzk5IDc4ODI5NmU0IDNhZTQ4NTBjIGU0Zjk3OTc4XG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICBwcmludGYoImRlNGMwMWIzIDA1NGY4OTMwIGE3OWQwOWFlIDczOGU5MjMwIDFlNWExNzA4IDViZWZmZGMxIGI4ZDExNjcxIDNlNzRmODJmIGE5NDJkNjRjIGRiYzQ2ODJkXG4iCi0gICAgICAgICAgICAgICAgICAgImQwMzRhNzk1IDBjZjcyMjAyIDFiYTRiODRkIGY3NjlhNWRlIDIwNjBlMjU5IGRmNGM5YmI0IGE0MjY4YzBlIDkzNWJiYzc0IDcwYTk2OWM5IGQwNzJhMWFjXG4iCi0gICAgICAgICAgICAgICAgICAgImJkZWUzN2Y0IDM3MWUyMDY0IDZiOGIwZDg2IDJkZGExNjI5IDJhZTM2ZjQwIDk2NWU4Yzg1IDA5ZTYzZDFkIGJkZGVjYzUwIDNlMmI2M2ViIDkyNDViYjY2XG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9yaXBlbWQuaCBiL2xpYmF2dXRpbC9yaXBlbWQuaAppbmRleCA3YjBjOGJjLi4wZGI2ODU4IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvcmlwZW1kLmgKKysrIGIvbGliYXZ1dGlsL3JpcGVtZC5oCkBAIC0xOSw2ICsxOSwxMiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdnVfcmlwZW1kCisgKiBQdWJsaWMgaGVhZGVyIGZvciBSSVBFTUQgaGFzaCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAqLworCiAjaWZuZGVmIEFWVVRJTF9SSVBFTURfSAogI2RlZmluZSBBVlVUSUxfUklQRU1EX0gKIApAQCAtMjksNyArMzUsOSBAQAogCiAvKioKICAqIEBkZWZncm91cCBsYXZ1X3JpcGVtZCBSSVBFTUQKLSAqIEBpbmdyb3VwIGxhdnVfY3J5cHRvCisgKiBAaW5ncm91cCBsYXZ1X2hhc2gKKyAqIFJJUEVNRCBoYXNoIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLgorICoKICAqIEB7CiAgKi8KIApAQCAtNTgsNyArNjYsMTEgQEAKICAqIEBwYXJhbSBkYXRhICAgIGlucHV0IGRhdGEgdG8gdXBkYXRlIGhhc2ggd2l0aAogICogQHBhcmFtIGxlbiAgICAgaW5wdXQgZGF0YSBsZW5ndGgKICAqLworI2lmIEZGX0FQSV9DUllQVE9fU0laRV9UCiB2b2lkIGF2X3JpcGVtZF91cGRhdGUoc3RydWN0IEFWUklQRU1EKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKTsKKyNlbHNlCit2b2lkIGF2X3JpcGVtZF91cGRhdGUoc3RydWN0IEFWUklQRU1EKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKTsKKyNlbmRpZgogCiAvKioKICAqIEZpbmlzaCBoYXNoaW5nIGFuZCBvdXRwdXQgZGlnZXN0IHZhbHVlLgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3NhbXBsZWZtdC5jIGIvbGliYXZ1dGlsL3NhbXBsZWZtdC5jCmluZGV4IGM2MDViNWUuLmZjMDc3ZjYgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC9zYW1wbGVmbXQuYworKysgYi9saWJhdnV0aWwvc2FtcGxlZm10LmMKQEAgLTM1LDExICszNSwxMyBAQAogICAgIFtBVl9TQU1QTEVfRk1UX1U4XSAgID0geyAubmFtZSA9ICAgInU4IiwgLmJpdHMgPSAgOCwgLnBsYW5hciA9IDAsIC5hbHRmb3JtID0gQVZfU0FNUExFX0ZNVF9VOFAgIH0sCiAgICAgW0FWX1NBTVBMRV9GTVRfUzE2XSAgPSB7IC5uYW1lID0gICJzMTYiLCAuYml0cyA9IDE2LCAucGxhbmFyID0gMCwgLmFsdGZvcm0gPSBBVl9TQU1QTEVfRk1UX1MxNlAgfSwKICAgICBbQVZfU0FNUExFX0ZNVF9TMzJdICA9IHsgLm5hbWUgPSAgInMzMiIsIC5iaXRzID0gMzIsIC5wbGFuYXIgPSAwLCAuYWx0Zm9ybSA9IEFWX1NBTVBMRV9GTVRfUzMyUCB9LAorICAgIFtBVl9TQU1QTEVfRk1UX1M2NF0gID0geyAubmFtZSA9ICAiczY0IiwgLmJpdHMgPSA2NCwgLnBsYW5hciA9IDAsIC5hbHRmb3JtID0gQVZfU0FNUExFX0ZNVF9TNjRQIH0sCiAgICAgW0FWX1NBTVBMRV9GTVRfRkxUXSAgPSB7IC5uYW1lID0gICJmbHQiLCAuYml0cyA9IDMyLCAucGxhbmFyID0gMCwgLmFsdGZvcm0gPSBBVl9TQU1QTEVfRk1UX0ZMVFAgfSwKICAgICBbQVZfU0FNUExFX0ZNVF9EQkxdICA9IHsgLm5hbWUgPSAgImRibCIsIC5iaXRzID0gNjQsIC5wbGFuYXIgPSAwLCAuYWx0Zm9ybSA9IEFWX1NBTVBMRV9GTVRfREJMUCB9LAogICAgIFtBVl9TQU1QTEVfRk1UX1U4UF0gID0geyAubmFtZSA9ICAidThwIiwgLmJpdHMgPSAgOCwgLnBsYW5hciA9IDEsIC5hbHRmb3JtID0gQVZfU0FNUExFX0ZNVF9VOCAgIH0sCiAgICAgW0FWX1NBTVBMRV9GTVRfUzE2UF0gPSB7IC5uYW1lID0gInMxNnAiLCAuYml0cyA9IDE2LCAucGxhbmFyID0gMSwgLmFsdGZvcm0gPSBBVl9TQU1QTEVfRk1UX1MxNiAgfSwKICAgICBbQVZfU0FNUExFX0ZNVF9TMzJQXSA9IHsgLm5hbWUgPSAiczMycCIsIC5iaXRzID0gMzIsIC5wbGFuYXIgPSAxLCAuYWx0Zm9ybSA9IEFWX1NBTVBMRV9GTVRfUzMyICB9LAorICAgIFtBVl9TQU1QTEVfRk1UX1M2NFBdID0geyAubmFtZSA9ICJzNjRwIiwgLmJpdHMgPSA2NCwgLnBsYW5hciA9IDEsIC5hbHRmb3JtID0gQVZfU0FNUExFX0ZNVF9TNjQgIH0sCiAgICAgW0FWX1NBTVBMRV9GTVRfRkxUUF0gPSB7IC5uYW1lID0gImZsdHAiLCAuYml0cyA9IDMyLCAucGxhbmFyID0gMSwgLmFsdGZvcm0gPSBBVl9TQU1QTEVfRk1UX0ZMVCAgfSwKICAgICBbQVZfU0FNUExFX0ZNVF9EQkxQXSA9IHsgLm5hbWUgPSAiZGJscCIsIC5iaXRzID0gNjQsIC5wbGFuYXIgPSAxLCAuYWx0Zm9ybSA9IEFWX1NBTVBMRV9GTVRfREJMICB9LAogfTsKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9zYW1wbGVmbXQuaCBiL2xpYmF2dXRpbC9zYW1wbGVmbXQuaAppbmRleCA2YThhMDMxLi44Y2Q0M2FlIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvc2FtcGxlZm10LmgKKysrIGIvbGliYXZ1dGlsL3NhbXBsZWZtdC5oCkBAIC0zMiw3ICszMiw2IEBACiAgKgogICogQXVkaW8gc2FtcGxlIGZvcm1hdCBlbnVtZXJhdGlvbiBhbmQgcmVsYXRlZCBjb252ZW5pZW5jZSBmdW5jdGlvbnMuCiAgKiBAewotICoKICAqLwogCiAvKioKQEAgLTY5LDYgKzY4LDggQEAKICAgICBBVl9TQU1QTEVfRk1UX1MzMlAsICAgICAgICAvLy88IHNpZ25lZCAzMiBiaXRzLCBwbGFuYXIKICAgICBBVl9TQU1QTEVfRk1UX0ZMVFAsICAgICAgICAvLy88IGZsb2F0LCBwbGFuYXIKICAgICBBVl9TQU1QTEVfRk1UX0RCTFAsICAgICAgICAvLy88IGRvdWJsZSwgcGxhbmFyCisgICAgQVZfU0FNUExFX0ZNVF9TNjQsICAgICAgICAgLy8vPCBzaWduZWQgNjQgYml0cworICAgIEFWX1NBTVBMRV9GTVRfUzY0UCwgICAgICAgIC8vLzwgc2lnbmVkIDY0IGJpdHMsIHBsYW5hcgogCiAgICAgQVZfU0FNUExFX0ZNVF9OQiAgICAgICAgICAgLy8vPCBOdW1iZXIgb2Ygc2FtcGxlIGZvcm1hdHMuIERPIE5PVCBVU0UgaWYgbGlua2luZyBkeW5hbWljYWxseQogfTsKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9zaGEuYyBiL2xpYmF2dXRpbC9zaGEuYwppbmRleCA3NDhiYjljLi5lZjZmYTQ0IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvc2hhLmMKKysrIGIvbGliYXZ1dGlsL3NoYS5jCkBAIC0zMTEsNyArMzExLDExIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXZfc2hhX3VwZGF0ZShBVlNIQSogY3R4LCBjb25zdCB1aW50OF90KiBkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQorI2lmIEZGX0FQSV9DUllQVE9fU0laRV9UCit2b2lkIGF2X3NoYV91cGRhdGUoc3RydWN0IEFWU0hBICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pCisjZWxzZQordm9pZCBhdl9zaGFfdXBkYXRlKHN0cnVjdCBBVlNIQSAqY3R4LCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgbGVuKQorI2VuZGlmCiB7CiAgICAgdW5zaWduZWQgaW50IGksIGo7CiAKQEAgLTM1MCw1NSArMzU0LDMgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgY3R4LT5kaWdlc3RfbGVuOyBpKyspCiAgICAgICAgIEFWX1dCMzIoZGlnZXN0ICsgaSo0LCBjdHgtPnN0YXRlW2ldKTsKIH0KLQotI2lmZGVmIFRFU1QKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1pbnQgbWFpbih2b2lkKQotewotICAgIGludCBpLCBqLCBrOwotICAgIEFWU0hBIGN0eDsKLSAgICB1bnNpZ25lZCBjaGFyIGRpZ2VzdFszMl07Ci0gICAgc3RhdGljIGNvbnN0IGludCBsZW5ndGhzWzNdID0geyAxNjAsIDIyNCwgMjU2IH07Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7Ci0gICAgICAgIHByaW50ZigiVGVzdGluZyBTSEEtJWRcbiIsIGxlbmd0aHNbal0pOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7Ci0gICAgICAgICAgICBhdl9zaGFfaW5pdCgmY3R4LCBsZW5ndGhzW2pdKTsKLSAgICAgICAgICAgIGlmIChrID09IDApCi0gICAgICAgICAgICAgICAgYXZfc2hhX3VwZGF0ZSgmY3R4LCAiYWJjIiwgMyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChrID09IDEpCi0gICAgICAgICAgICAgICAgYXZfc2hhX3VwZGF0ZSgmY3R4LCAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLCA1Nik7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDAqMTAwMDsgaSsrKQotICAgICAgICAgICAgICAgICAgICBhdl9zaGFfdXBkYXRlKCZjdHgsICJhIiwgMSk7Ci0gICAgICAgICAgICBhdl9zaGFfZmluYWwoJmN0eCwgZGlnZXN0KTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGhzW2pdID4+IDM7IGkrKykKLSAgICAgICAgICAgICAgICBwcmludGYoIiUwMlgiLCBkaWdlc3RbaV0pOwotICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKGopIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgLy90ZXN0IHZlY3RvcnMgKGZyb20gRklQUyBQVUIgMTgwLTEpCi0gICAgICAgICAgICBwcmludGYoIkE5OTkzRTM2IDQ3MDY4MTZBIEJBM0UyNTcxIDc4NTBDMjZDIDlDRDBEODlEXG4iCi0gICAgICAgICAgICAgICAgICAgIjg0OTgzRTQ0IDFDM0JEMjZFIEJBQUU0QUExIEY5NTEyOUU1IEU1NDY3MEYxXG4iCi0gICAgICAgICAgICAgICAgICAgIjM0QUE5NzNDIEQ0QzREQUE0IEY2MUVFQjJCIERCQUQyNzMxIDY1MzQwMTZGXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAvL3Rlc3QgdmVjdG9ycyAoZnJvbSBGSVBTIFBVQiAxODAtMiBBcHBlbmRpeCBBKQotICAgICAgICAgICAgcHJpbnRmKCIyMzA5N2QyMiAzNDA1ZDgyMiA4NjQyYTQ3NyBiZGEyNTViMyAyYWFkYmNlNCBiZGEwYjNmNyBlMzZjOWRhN1xuIgotICAgICAgICAgICAgICAgICAgICI3NTM4OGIxNiA1MTI3NzZjYyA1ZGJhNWRhMSBmZDg5MDE1MCBiMGM2NDU1YyBiNGY1OGIxOSA1MjUyMjUyNVxuIgotICAgICAgICAgICAgICAgICAgICIyMDc5NDY1NSA5ODBjOTFkOCBiYmI0YzFlYSA5NzYxOGE0YiBmMDNmNDI1OCAxOTQ4YjJlZSA0ZWU3YWQ2N1xuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgLy90ZXN0IHZlY3RvcnMgKGZyb20gRklQUyBQVUIgMTgwLTIpCi0gICAgICAgICAgICBwcmludGYoImJhNzgxNmJmIDhmMDFjZmVhIDQxNDE0MGRlIDVkYWUyMjIzIGIwMDM2MWEzIDk2MTc3YTljIGI0MTBmZjYxIGYyMDAxNWFkXG4iCi0gICAgICAgICAgICAgICAgICAgIjI0OGQ2YTYxIGQyMDYzOGI4IGU1YzAyNjkzIDBjM2U2MDM5IGEzM2NlNDU5IDY0ZmYyMTY3IGY2ZWNlZGQ0IDE5ZGIwNmMxXG4iCi0gICAgICAgICAgICAgICAgICAgImNkYzc2ZTVjIDk5MTRmYjkyIDgxYTFjN2UyIDg0ZDczZTY3IGYxODA5YTQ4IGE0OTcyMDBlIDA0NmQzOWNjIGM3MTEyY2QwXG4iKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9zaGEuaCBiL2xpYmF2dXRpbC9zaGEuaAppbmRleCBiZjQzNzdlLi5jMDE4MGU1IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvc2hhLmgKKysrIGIvbGliYXZ1dGlsL3NoYS5oCkBAIC0xOCw5ICsxOCwxNiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdnVfc2hhCisgKiBQdWJsaWMgaGVhZGVyIGZvciBTSEEtMSAmIFNIQS0yNTYgaGFzaCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKwogI2lmbmRlZiBBVlVUSUxfU0hBX0gKICNkZWZpbmUgQVZVVElMX1NIQV9ICiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKQEAgLTI4LDcgKzM1LDE3IEBACiAKIC8qKgogICogQGRlZmdyb3VwIGxhdnVfc2hhIFNIQQotICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEBpbmdyb3VwIGxhdnVfaGFzaAorICogU0hBLTEgYW5kIFNIQS0yNTYgKFNlY3VyZSBIYXNoIEFsZ29yaXRobSkgaGFzaCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBTSEEgaGFzaCBmdW5jdGlvbnM6CisgKgorICogLSBTSEEtMTogMTYwIGJpdHMKKyAqIC0gU0hBLTIyNDogMjI0IGJpdHMsIGFzIGEgdmFyaWFudCBvZiBTSEEtMgorICogLSBTSEEtMjU2OiAyNTYgYml0cywgYXMgYSB2YXJpYW50IG9mIFNIQS0yCisgKgorICogQHNlZSBGb3IgU0hBLTM4NCwgU0hBLTUxMiwgYW5kIHZhcmlhbnRzIHRoZXJlb2YsIHNlZSBAcmVmIGxhdnVfc2hhNTEyLgorICoKICAqIEB7CiAgKi8KIApAQCAtNTMsMTEgKzcwLDE1IEBACiAvKioKICAqIFVwZGF0ZSBoYXNoIHZhbHVlLgogICoKLSAqIEBwYXJhbSBjb250ZXh0IGhhc2ggZnVuY3Rpb24gY29udGV4dAorICogQHBhcmFtIGN0eCAgICAgaGFzaCBmdW5jdGlvbiBjb250ZXh0CiAgKiBAcGFyYW0gZGF0YSAgICBpbnB1dCBkYXRhIHRvIHVwZGF0ZSBoYXNoIHdpdGgKICAqIEBwYXJhbSBsZW4gICAgIGlucHV0IGRhdGEgbGVuZ3RoCiAgKi8KLXZvaWQgYXZfc2hhX3VwZGF0ZShzdHJ1Y3QgQVZTSEEqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVuc2lnbmVkIGludCBsZW4pOworI2lmIEZGX0FQSV9DUllQVE9fU0laRV9UCit2b2lkIGF2X3NoYV91cGRhdGUoc3RydWN0IEFWU0hBICpjdHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4pOworI2Vsc2UKK3ZvaWQgYXZfc2hhX3VwZGF0ZShzdHJ1Y3QgQVZTSEEgKmN0eCwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGxlbik7CisjZW5kaWYKIAogLyoqCiAgKiBGaW5pc2ggaGFzaGluZyBhbmQgb3V0cHV0IGRpZ2VzdCB2YWx1ZS4KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9zaGE1MTIuYyBiL2xpYmF2dXRpbC9zaGE1MTIuYwppbmRleCBlMmZjNThhLi42ZDA5MmE3IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvc2hhNTEyLmMKKysrIGIvbGliYXZ1dGlsL3NoYTUxMi5jCkBAIC0yMzksNyArMjM5LDExIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKKyNpZiBGRl9BUElfQ1JZUFRPX1NJWkVfVAogdm9pZCBhdl9zaGE1MTJfdXBkYXRlKEFWU0hBNTEyKiBjdHgsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVuc2lnbmVkIGludCBsZW4pCisjZWxzZQordm9pZCBhdl9zaGE1MTJfdXBkYXRlKEFWU0hBNTEyKiBjdHgsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW4pCisjZW5kaWYKIHsKICAgICB1bnNpZ25lZCBpbnQgaSwgajsKIApAQCAtMjgxLDY1ICsyODUsMyBAQAogICAgIGlmIChjdHgtPmRpZ2VzdF9sZW4gJiAxKSAvKiBTSEE1MTIvMjI0IGlzIDI4IGJ5dGVzLCBhbmQgaXMgbm90IGRpdmlzaWJsZSBieSA4LiAqLwogICAgICAgICBBVl9XQjMyKGRpZ2VzdCArIGkqOCwgY3R4LT5zdGF0ZVtpXSA+PiAzMik7CiB9Ci0KLSNpZmRlZiBURVNUCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBpbnQgaSwgaiwgazsKLSAgICBBVlNIQTUxMiBjdHg7Ci0gICAgdW5zaWduZWQgY2hhciBkaWdlc3RbNjRdOwotICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuZ3Roc1s0XSA9IHsgMjI0LCAyNTYsIDM4NCwgNTEyIH07Ci0KLSAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7Ci0gICAgICAgIGlmIChqIDwgMikgcHJpbnRmKCJUZXN0aW5nIFNIQS01MTIvJWRcbiIsIGxlbmd0aHNbal0pOwotICAgICAgICBlbHNlICAgICAgIHByaW50ZigiVGVzdGluZyBTSEEtJWRcbiIsIGxlbmd0aHNbal0pOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7Ci0gICAgICAgICAgICBhdl9zaGE1MTJfaW5pdCgmY3R4LCBsZW5ndGhzW2pdKTsKLSAgICAgICAgICAgIGlmIChrID09IDApCi0gICAgICAgICAgICAgICAgYXZfc2hhNTEyX3VwZGF0ZSgmY3R4LCAiYWJjIiwgMyk7Ci0gICAgICAgICAgICBlbHNlIGlmIChrID09IDEpCi0gICAgICAgICAgICAgICAgYXZfc2hhNTEyX3VwZGF0ZSgmY3R4LCAiYWJjZGVmZ2hiY2RlZmdoaWNkZWZnaGlqZGVmZ2hpamtlZmdoaWprbGZnaGlqa2xtZ2hpamtsbW4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiLCAxMTIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwKjEwMDA7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgYXZfc2hhNTEyX3VwZGF0ZSgmY3R4LCAiYSIsIDEpOwotICAgICAgICAgICAgYXZfc2hhNTEyX2ZpbmFsKCZjdHgsIGRpZ2VzdCk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3Roc1tqXSA+PiAzOyBpKyspCi0gICAgICAgICAgICAgICAgcHJpbnRmKCIlMDJYIiwgZGlnZXN0W2ldKTsKLSAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoIChqKSB7IC8vdGVzdCB2ZWN0b3JzIChmcm9tIEZJUFMgUFVCIDE4MC00IEFwZW5kaXggQSkKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgcHJpbnRmKCI0NjM0MjcwZiA3MDdiNmE1NCBkYWFlNzUzMCA0NjA4NDJlMiAwZTM3ZWQyNiA1Y2VlZTlhNCAzZTg5MjRhYVxuIgotICAgICAgICAgICAgICAgICAgICIyM2ZlYzViYiA5NGQ2MGIyMyAzMDgxOTI2NCAwYjBjNDUzMyAzNWQ2NjQ3MyA0ZmU0MGU3MiA2ODY3NGFmOVxuIgotICAgICAgICAgICAgICAgICAgICIzN2FiMzMxZCA3NmYwZDM2ZCBlNDIyYmQwZSBkZWIyMmEyOCBhY2NkNDg3YiA3YTg0NTNhZSA5NjVkZDI4N1xuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcHJpbnRmKCI1MzA0OGUyNiA4MTk0MWVmOSA5YjJlMjliNyA2YjRjN2RhYiBlNGMyZDBjNiAzNGZjNmQ0NiBlMGUyZjEzMSAwN2U3YWYyM1xuIgotICAgICAgICAgICAgICAgICAgICIzOTI4ZTE4NCBmYjg2OTBmOCA0MGRhMzk4OCAxMjFkMzFiZSA2NWNiOWQzZSBmODNlZTYxNCA2ZmVhYzg2MSBlMTliNTYzYVxuIgotICAgICAgICAgICAgICAgICAgICI5YTU5YTA1MiA5MzAxODdhOSA3MDM4Y2FlNiA5MmYzMDcwOCBhYTY0OTE5MiAzZWY1MTk0MyA5NGRjNjhkNSA2Yzc0ZmIyMVxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgcHJpbnRmKCJjYjAwNzUzZiA0NWEzNWU4YiBiNWEwM2Q2OSA5YWM2NTAwNyAyNzJjMzJhYiAwZWRlZDE2MyAiCi0gICAgICAgICAgICAgICAgICAgIjFhOGI2MDVhIDQzZmY1YmVkIDgwODYwNzJiIGExZTdjYzIzIDU4YmFlY2ExIDM0YzgyNWE3XG4iCi0gICAgICAgICAgICAgICAgICAgIjA5MzMwYzMzIGY3MTE0N2U4IDNkMTkyZmM3IDgyY2QxYjQ3IDUzMTExYjE3IDNiM2IwNWQyICIKLSAgICAgICAgICAgICAgICAgICAiMmZhMDgwODYgZTNiMGY3MTIgZmNjN2M3MWEgNTU3ZTJkYjkgNjZjM2U5ZmEgOTE3NDYwMzlcbiIKLSAgICAgICAgICAgICAgICAgICAiOWQwZTE4MDkgNzE2NDc0Y2IgMDg2ZTgzNGUgMzEwYTRhMWMgZWQxNDllOWMgMDBmMjQ4NTIgIgotICAgICAgICAgICAgICAgICAgICI3OTcyY2VjNSA3MDRjMmE1YiAwN2I4YjNkYyAzOGVjYzRlYiBhZTk3ZGRkOCA3ZjNkODk4NVxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgcHJpbnRmKCJkZGFmMzVhMSA5MzYxN2FiYSBjYzQxNzM0OSBhZTIwNDEzMSAxMmU2ZmE0ZSA4OWE5N2VhMiAwYTllZWVlNiA0YjU1ZDM5YSAiCi0gICAgICAgICAgICAgICAgICAgIjIxOTI5OTJhIDI3NGZjMWE4IDM2YmEzYzIzIGEzZmVlYmJkIDQ1NGQ0NDIzIDY0M2NlODBlIDJhOWFjOTRmIGE1NGNhNDlmXG4iCi0gICAgICAgICAgICAgICAgICAgIjhlOTU5Yjc1IGRhZTMxM2RhIDhjZjRmNzI4IDE0ZmMxNDNmIDhmNzc3OWM2IGViOWY3ZmExIDcyOTlhZWFkIGI2ODg5MDE4ICIKLSAgICAgICAgICAgICAgICAgICAiNTAxZDI4OWUgNDkwMGY3ZTQgMzMxYjk5ZGUgYzRiNTQzM2EgYzdkMzI5ZWUgYjZkZDI2NTQgNWU5NmU1NWIgODc0YmU5MDlcbiIKLSAgICAgICAgICAgICAgICAgICAiZTcxODQ4M2QgMGNlNzY5NjQgNGUyZTQyYzcgYmMxNWI0NjMgOGUxZjk4YjEgM2IyMDQ0MjggNTYzMmE4MDMgYWZhOTczZWIgIgotICAgICAgICAgICAgICAgICAgICJkZTBmZjI0NCA4NzdlYTYwYSA0Y2IwNDMyYyBlNTc3YzMxYiBlYjAwOWM1YyAyYzQ5YWEyZSA0ZWFkYjIxNyBhZDhjYzA5YlxuIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvc2hhNTEyLmggYi9saWJhdnV0aWwvc2hhNTEyLmgKaW5kZXggN2IwODcwMS4uYmVmNzE0YiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3NoYTUxMi5oCisrKyBiL2xpYmF2dXRpbC9zaGE1MTIuaApAQCAtMTksMTcgKzE5LDM1IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCiAgKi8KIAorLyoqCisgKiBAZmlsZQorICogQGluZ3JvdXAgbGF2dV9zaGE1MTIKKyAqIFB1YmxpYyBoZWFkZXIgZm9yIFNIQS01MTIgaW1wbGVtZW50YXRpb24uCisgKi8KKwogI2lmbmRlZiBBVlVUSUxfU0hBNTEyX0gKICNkZWZpbmUgQVZVVElMX1NIQTUxMl9ICiAKKyNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgImF0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAKIC8qKgotICogQGRlZmdyb3VwIGxhdnVfc2hhNTEyIFNIQTUxMgotICogQGluZ3JvdXAgbGF2dV9jcnlwdG8KKyAqIEBkZWZncm91cCBsYXZ1X3NoYTUxMiBTSEEtNTEyCisgKiBAaW5ncm91cCBsYXZ1X2hhc2gKKyAqIFNIQS01MTIgKFNlY3VyZSBIYXNoIEFsZ29yaXRobSkgaGFzaCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogVGhpcyBtb2R1bGUgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBTSEEtMiBoYXNoIGZ1bmN0aW9uczoKKyAqCisgKiAtIFNIQS01MTIvMjI0OiAyMjQgYml0cworICogLSBTSEEtNTEyLzI1NjogMjU2IGJpdHMKKyAqIC0gU0hBLTM4NDogMzg0IGJpdHMKKyAqIC0gU0hBLTUxMjogNTEyIGJpdHMKKyAqCisgKiBAc2VlIEZvciBTSEEtMSwgU0hBLTI1NiwgYW5kIHZhcmlhbnRzIHRoZXJlb2YsIHNlZSBAcmVmIGxhdnVfc2hhLgorICoKICAqIEB7CiAgKi8KIApAQCAtNTgsNyArNzYsMTEgQEAKICAqIEBwYXJhbSBkYXRhICAgIGlucHV0IGRhdGEgdG8gdXBkYXRlIGhhc2ggd2l0aAogICogQHBhcmFtIGxlbiAgICAgaW5wdXQgZGF0YSBsZW5ndGgKICAqLworI2lmIEZGX0FQSV9DUllQVE9fU0laRV9UCiB2b2lkIGF2X3NoYTUxMl91cGRhdGUoc3RydWN0IEFWU0hBNTEyKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKTsKKyNlbHNlCit2b2lkIGF2X3NoYTUxMl91cGRhdGUoc3RydWN0IEFWU0hBNTEyKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuKTsKKyNlbmRpZgogCiAvKioKICAqIEZpbmlzaCBoYXNoaW5nIGFuZCBvdXRwdXQgZGlnZXN0IHZhbHVlLgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3NsaWNldGhyZWFkLmMgYi9saWJhdnV0aWwvc2xpY2V0aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmJlNTUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3NsaWNldGhyZWFkLmMKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGF0b21pYy5oPgorI2luY2x1ZGUgInNsaWNldGhyZWFkLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAidGhyZWFkLmgiCisjaW5jbHVkZSAiYXZhc3NlcnQuaCIKKworI2lmIEhBVkVfUFRIUkVBRFMgfHwgSEFWRV9XMzJUSFJFQURTIHx8IEhBVkVfT1MyVEhSRUFEUworCit0eXBlZGVmIHN0cnVjdCBXb3JrZXJDb250ZXh0IHsKKyAgICBBVlNsaWNlVGhyZWFkICAgKmN0eDsKKyAgICBwdGhyZWFkX211dGV4X3QgbXV0ZXg7CisgICAgcHRocmVhZF9jb25kX3QgIGNvbmQ7CisgICAgcHRocmVhZF90ICAgICAgIHRocmVhZDsKKyAgICBpbnQgICAgICAgICAgICAgZG9uZTsKK30gV29ya2VyQ29udGV4dDsKKworc3RydWN0IEFWU2xpY2VUaHJlYWQgeworICAgIFdvcmtlckNvbnRleHQgICAqd29ya2VyczsKKyAgICBpbnQgICAgICAgICAgICAgbmJfdGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgbmJfYWN0aXZlX3RocmVhZHM7CisgICAgaW50ICAgICAgICAgICAgIG5iX2pvYnM7CisKKyAgICBhdG9taWNfdWludCAgICAgZmlyc3Rfam9iOworICAgIGF0b21pY191aW50ICAgICBjdXJyZW50X2pvYjsKKyAgICBwdGhyZWFkX211dGV4X3QgZG9uZV9tdXRleDsKKyAgICBwdGhyZWFkX2NvbmRfdCAgZG9uZV9jb25kOworICAgIGludCAgICAgICAgICAgICBkb25lOworICAgIGludCAgICAgICAgICAgICBmaW5pc2hlZDsKKworICAgIHZvaWQgICAgICAgICAgICAqcHJpdjsKKyAgICB2b2lkICAgICAgICAgICAgKCp3b3JrZXJfZnVuYykodm9pZCAqcHJpdiwgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIsIGludCBuYl9qb2JzLCBpbnQgbmJfdGhyZWFkcyk7CisgICAgdm9pZCAgICAgICAgICAgICgqbWFpbl9mdW5jKSh2b2lkICpwcml2KTsKK307CisKK3N0YXRpYyBpbnQgcnVuX2pvYnMoQVZTbGljZVRocmVhZCAqY3R4KQoreworICAgIHVuc2lnbmVkIG5iX2pvYnMgICAgPSBjdHgtPm5iX2pvYnM7CisgICAgdW5zaWduZWQgbmJfYWN0aXZlX3RocmVhZHMgPSBjdHgtPm5iX2FjdGl2ZV90aHJlYWRzOworICAgIHVuc2lnbmVkIGZpcnN0X2pvYiAgICA9IGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoJmN0eC0+Zmlyc3Rfam9iLCAxLCBtZW1vcnlfb3JkZXJfYWNxX3JlbCk7CisgICAgdW5zaWduZWQgY3VycmVudF9qb2IgID0gZmlyc3Rfam9iOworCisgICAgZG8geworICAgICAgICBjdHgtPndvcmtlcl9mdW5jKGN0eC0+cHJpdiwgY3VycmVudF9qb2IsIGZpcnN0X2pvYiwgbmJfam9icywgbmJfYWN0aXZlX3RocmVhZHMpOworICAgIH0gd2hpbGUgKChjdXJyZW50X2pvYiA9IGF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoJmN0eC0+Y3VycmVudF9qb2IsIDEsIG1lbW9yeV9vcmRlcl9hY3FfcmVsKSkgPCBuYl9qb2JzKTsKKworICAgIHJldHVybiBjdXJyZW50X2pvYiA9PSBuYl9qb2JzICsgbmJfYWN0aXZlX3RocmVhZHMgLSAxOworfQorCitzdGF0aWMgdm9pZCAqYXR0cmlidXRlX2FsaWduX2FyZyB0aHJlYWRfd29ya2VyKHZvaWQgKnYpCit7CisgICAgV29ya2VyQ29udGV4dCAqdyA9IHY7CisgICAgQVZTbGljZVRocmVhZCAqY3R4ID0gdy0+Y3R4OworCisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3LT5tdXRleCk7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmdy0+Y29uZCk7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB3LT5kb25lID0gMTsKKyAgICAgICAgd2hpbGUgKHctPmRvbmUpCisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmdy0+Y29uZCwgJnctPm11dGV4KTsKKworICAgICAgICBpZiAoY3R4LT5maW5pc2hlZCkgeworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnctPm11dGV4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJ1bl9qb2JzKGN0eCkpIHsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmY3R4LT5kb25lX211dGV4KTsKKyAgICAgICAgICAgIGN0eC0+ZG9uZSA9IDE7CisgICAgICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZjdHgtPmRvbmVfY29uZCk7CisgICAgICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmY3R4LT5kb25lX211dGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IGF2cHJpdl9zbGljZXRocmVhZF9jcmVhdGUoQVZTbGljZVRocmVhZCAqKnBjdHgsIHZvaWQgKnByaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqd29ya2VyX2Z1bmMpKHZvaWQgKnByaXYsIGludCBqb2JuciwgaW50IHRocmVhZG5yLCBpbnQgbmJfam9icywgaW50IG5iX3RocmVhZHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKm1haW5fZnVuYykodm9pZCAqcHJpdiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfdGhyZWFkcykKK3sKKyAgICBBVlNsaWNlVGhyZWFkICpjdHg7CisgICAgaW50IG5iX3dvcmtlcnMsIGk7CisKKyAgICBhdl9hc3NlcnQwKG5iX3RocmVhZHMgPj0gMCk7CisgICAgaWYgKCFuYl90aHJlYWRzKSB7CisgICAgICAgIGludCBuYl9jcHVzID0gYXZfY3B1X2NvdW50KCk7CisgICAgICAgIGlmIChuYl9jcHVzID4gMSkKKyAgICAgICAgICAgIG5iX3RocmVhZHMgPSBuYl9jcHVzICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbmJfdGhyZWFkcyA9IDE7CisgICAgfQorCisgICAgbmJfd29ya2VycyA9IG5iX3RocmVhZHM7CisgICAgaWYgKCFtYWluX2Z1bmMpCisgICAgICAgIG5iX3dvcmtlcnMtLTsKKworICAgICpwY3R4ID0gY3R4ID0gYXZfbWFsbG9jeihzaXplb2YoKmN0eCkpOworICAgIGlmICghY3R4KQorICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworCisgICAgaWYgKG5iX3dvcmtlcnMgJiYgIShjdHgtPndvcmtlcnMgPSBhdl9jYWxsb2MobmJfd29ya2Vycywgc2l6ZW9mKCpjdHgtPndvcmtlcnMpKSkpIHsKKyAgICAgICAgYXZfZnJlZXAocGN0eCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgfQorCisgICAgY3R4LT5wcml2ICAgICAgICA9IHByaXY7CisgICAgY3R4LT53b3JrZXJfZnVuYyA9IHdvcmtlcl9mdW5jOworICAgIGN0eC0+bWFpbl9mdW5jICAgPSBtYWluX2Z1bmM7CisgICAgY3R4LT5uYl90aHJlYWRzICA9IG5iX3RocmVhZHM7CisgICAgY3R4LT5uYl9hY3RpdmVfdGhyZWFkcyA9IDA7CisgICAgY3R4LT5uYl9qb2JzICAgICA9IDA7CisgICAgY3R4LT5maW5pc2hlZCAgICA9IDA7CisKKyAgICBhdG9taWNfaW5pdCgmY3R4LT5maXJzdF9qb2IsIDApOworICAgIGF0b21pY19pbml0KCZjdHgtPmN1cnJlbnRfam9iLCAwKTsKKyAgICBwdGhyZWFkX211dGV4X2luaXQoJmN0eC0+ZG9uZV9tdXRleCwgTlVMTCk7CisgICAgcHRocmVhZF9jb25kX2luaXQoJmN0eC0+ZG9uZV9jb25kLCBOVUxMKTsKKyAgICBjdHgtPmRvbmUgICAgICAgID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuYl93b3JrZXJzOyBpKyspIHsKKyAgICAgICAgV29ya2VyQ29udGV4dCAqdyA9ICZjdHgtPndvcmtlcnNbaV07CisgICAgICAgIGludCByZXQ7CisgICAgICAgIHctPmN0eCA9IGN0eDsKKyAgICAgICAgcHRocmVhZF9tdXRleF9pbml0KCZ3LT5tdXRleCwgTlVMTCk7CisgICAgICAgIHB0aHJlYWRfY29uZF9pbml0KCZ3LT5jb25kLCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3LT5tdXRleCk7CisgICAgICAgIHctPmRvbmUgPSAwOworCisgICAgICAgIGlmIChyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmdy0+dGhyZWFkLCBOVUxMLCB0aHJlYWRfd29ya2VyLCB3KSkgeworICAgICAgICAgICAgY3R4LT5uYl90aHJlYWRzID0gbWFpbl9mdW5jID8gaSA6IGkgKyAxOworICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnctPm11dGV4KTsKKyAgICAgICAgICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZ3LT5jb25kKTsKKyAgICAgICAgICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmdy0+bXV0ZXgpOworICAgICAgICAgICAgYXZwcml2X3NsaWNldGhyZWFkX2ZyZWUocGN0eCk7CisgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihyZXQpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKCF3LT5kb25lKQorICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJnctPmNvbmQsICZ3LT5tdXRleCk7CisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3LT5tdXRleCk7CisgICAgfQorCisgICAgcmV0dXJuIG5iX3RocmVhZHM7Cit9CisKK3ZvaWQgYXZwcml2X3NsaWNldGhyZWFkX2V4ZWN1dGUoQVZTbGljZVRocmVhZCAqY3R4LCBpbnQgbmJfam9icywgaW50IGV4ZWN1dGVfbWFpbikKK3sKKyAgICBpbnQgbmJfd29ya2VycywgaSwgaXNfbGFzdCA9IDA7CisKKyAgICBhdl9hc3NlcnQwKG5iX2pvYnMgPiAwKTsKKyAgICBjdHgtPm5iX2pvYnMgICAgICAgICAgID0gbmJfam9iczsKKyAgICBjdHgtPm5iX2FjdGl2ZV90aHJlYWRzID0gRkZNSU4obmJfam9icywgY3R4LT5uYl90aHJlYWRzKTsKKyAgICBhdG9taWNfc3RvcmVfZXhwbGljaXQoJmN0eC0+Zmlyc3Rfam9iLCAwLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgYXRvbWljX3N0b3JlX2V4cGxpY2l0KCZjdHgtPmN1cnJlbnRfam9iLCBjdHgtPm5iX2FjdGl2ZV90aHJlYWRzLCBtZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgbmJfd29ya2VycyAgICAgICAgICAgICA9IGN0eC0+bmJfYWN0aXZlX3RocmVhZHM7CisgICAgaWYgKCFjdHgtPm1haW5fZnVuYyB8fCAhZXhlY3V0ZV9tYWluKQorICAgICAgICBuYl93b3JrZXJzLS07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfd29ya2VyczsgaSsrKSB7CisgICAgICAgIFdvcmtlckNvbnRleHQgKncgPSAmY3R4LT53b3JrZXJzW2ldOworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJnctPm11dGV4KTsKKyAgICAgICAgdy0+ZG9uZSA9IDA7CisgICAgICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJnctPmNvbmQpOworICAgICAgICBwdGhyZWFkX211dGV4X3VubG9jaygmdy0+bXV0ZXgpOworICAgIH0KKworICAgIGlmIChjdHgtPm1haW5fZnVuYyAmJiBleGVjdXRlX21haW4pCisgICAgICAgIGN0eC0+bWFpbl9mdW5jKGN0eC0+cHJpdik7CisgICAgZWxzZQorICAgICAgICBpc19sYXN0ID0gcnVuX2pvYnMoY3R4KTsKKworICAgIGlmICghaXNfbGFzdCkgeworICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJmN0eC0+ZG9uZV9tdXRleCk7CisgICAgICAgIHdoaWxlICghY3R4LT5kb25lKQorICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmN0eC0+ZG9uZV9jb25kLCAmY3R4LT5kb25lX211dGV4KTsKKyAgICAgICAgY3R4LT5kb25lID0gMDsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmN0eC0+ZG9uZV9tdXRleCk7CisgICAgfQorfQorCit2b2lkIGF2cHJpdl9zbGljZXRocmVhZF9mcmVlKEFWU2xpY2VUaHJlYWQgKipwY3R4KQoreworICAgIEFWU2xpY2VUaHJlYWQgKmN0eDsKKyAgICBpbnQgbmJfd29ya2VycywgaTsKKworICAgIGlmICghcGN0eCB8fCAhKnBjdHgpCisgICAgICAgIHJldHVybjsKKworICAgIGN0eCA9ICpwY3R4OworICAgIG5iX3dvcmtlcnMgPSBjdHgtPm5iX3RocmVhZHM7CisgICAgaWYgKCFjdHgtPm1haW5fZnVuYykKKyAgICAgICAgbmJfd29ya2Vycy0tOworCisgICAgY3R4LT5maW5pc2hlZCA9IDE7CisgICAgZm9yIChpID0gMDsgaSA8IG5iX3dvcmtlcnM7IGkrKykgeworICAgICAgICBXb3JrZXJDb250ZXh0ICp3ID0gJmN0eC0+d29ya2Vyc1tpXTsKKyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3LT5tdXRleCk7CisgICAgICAgIHctPmRvbmUgPSAwOworICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ3LT5jb25kKTsKKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJnctPm11dGV4KTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmJfd29ya2VyczsgaSsrKSB7CisgICAgICAgIFdvcmtlckNvbnRleHQgKncgPSAmY3R4LT53b3JrZXJzW2ldOworICAgICAgICBwdGhyZWFkX2pvaW4ody0+dGhyZWFkLCBOVUxMKTsKKyAgICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnctPmNvbmQpOworICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJnctPm11dGV4KTsKKyAgICB9CisKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmY3R4LT5kb25lX2NvbmQpOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmY3R4LT5kb25lX211dGV4KTsKKyAgICBhdl9mcmVlcCgmY3R4LT53b3JrZXJzKTsKKyAgICBhdl9mcmVlcChwY3R4KTsKK30KKworI2Vsc2UgLyogSEFWRV9QVEhSRUFEUyB8fCBIQVZFX1czMlRIUkVBRFMgfHwgSEFWRV9PUzMyVEhSRUFEUyAqLworCitpbnQgYXZwcml2X3NsaWNldGhyZWFkX2NyZWF0ZShBVlNsaWNlVGhyZWFkICoqcGN0eCwgdm9pZCAqcHJpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCp3b3JrZXJfZnVuYykodm9pZCAqcHJpdiwgaW50IGpvYm5yLCBpbnQgdGhyZWFkbnIsIGludCBuYl9qb2JzLCBpbnQgbmJfdGhyZWFkcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICgqbWFpbl9mdW5jKSh2b2lkICpwcml2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl90aHJlYWRzKQoreworICAgICpwY3R4ID0gTlVMTDsKKyAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworfQorCit2b2lkIGF2cHJpdl9zbGljZXRocmVhZF9leGVjdXRlKEFWU2xpY2VUaHJlYWQgKmN0eCwgaW50IG5iX2pvYnMsIGludCBleGVjdXRlX21haW4pCit7CisgICAgYXZfYXNzZXJ0MCgwKTsKK30KKwordm9pZCBhdnByaXZfc2xpY2V0aHJlYWRfZnJlZShBVlNsaWNlVGhyZWFkICoqcGN0eCkKK3sKKyAgICBhdl9hc3NlcnQwKCFwY3R4IHx8ICEqcGN0eCk7Cit9CisKKyNlbmRpZiAvKiBIQVZFX1BUSFJFQURTIHx8IEhBVkVfVzMyVEhSRUFEUyB8fCBIQVZFX09TMzJUSFJFQURTICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvc2xpY2V0aHJlYWQuaCBiL2xpYmF2dXRpbC9zbGljZXRocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjZmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvc2xpY2V0aHJlYWQuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpZm5kZWYgQVZVVElMX1NMSUNFVEhSRUFEX0gKKyNkZWZpbmUgQVZVVElMX1NMSUNFVEhSRUFEX0gKKwordHlwZWRlZiBzdHJ1Y3QgQVZTbGljZVRocmVhZCBBVlNsaWNlVGhyZWFkOworCisvKioKKyAqIENyZWF0ZSBzbGljZSB0aHJlYWRpbmcgY29udGV4dC4KKyAqIEBwYXJhbSBwY3R4IHNsaWNlIHRocmVhZGluZyBjb250ZXh0IHJldHVybmVkIGhlcmUKKyAqIEBwYXJhbSBwcml2IHByaXZhdGUgcG9pbnRlciB0byBiZSBwYXNzZWQgdG8gY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBwYXJhbSB3b3JrZXJfZnVuYyBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBleGVjdXRlZAorICogQHBhcmFtIG1haW5fZnVuYyBzcGVjaWFsIGNhbGxiYWNrIGZ1bmN0aW9uLCBjYWxsZWQgZnJvbSBtYWluIHRocmVhZCwgbWF5IGJlIE5VTEwKKyAqIEBwYXJhbSBuYl90aHJlYWRzIG51bWJlciBvZiB0aHJlYWRzLCAwIGZvciBhdXRvbWF0aWMsIG11c3QgYmUgPj0gMAorICogQHJldHVybiByZXR1cm4gbnVtYmVyIG9mIHRocmVhZHMgb3IgbmVnYXRpdmUgQVZFUlJPUiBvbiBmYWlsdXJlCisgKi8KK2ludCBhdnByaXZfc2xpY2V0aHJlYWRfY3JlYXRlKEFWU2xpY2VUaHJlYWQgKipwY3R4LCB2b2lkICpwcml2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKndvcmtlcl9mdW5jKSh2b2lkICpwcml2LCBpbnQgam9ibnIsIGludCB0aHJlYWRuciwgaW50IG5iX2pvYnMsIGludCBuYl90aHJlYWRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCptYWluX2Z1bmMpKHZvaWQgKnByaXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3RocmVhZHMpOworCisvKioKKyAqIEV4ZWN1dGUgc2xpY2UgdGhyZWFkaW5nLgorICogQHBhcmFtIGN0eCBzbGljZSB0aHJlYWRpbmcgY29udGV4dAorICogQHBhcmFtIG5iX2pvYnMgbnVtYmVyIG9mIGpvYnMsIG11c3QgYmUgPiAwCisgKiBAcGFyYW0gZXhlY3V0ZV9tYWluIGFsc28gZXhlY3V0ZSBtYWluX2Z1bmMKKyAqLwordm9pZCBhdnByaXZfc2xpY2V0aHJlYWRfZXhlY3V0ZShBVlNsaWNlVGhyZWFkICpjdHgsIGludCBuYl9qb2JzLCBpbnQgZXhlY3V0ZV9tYWluKTsKKworLyoqCisgKiBEZXN0cm95IHNsaWNlIHRocmVhZGluZyBjb250ZXh0LgorICogQHBhcmFtIHBjdHggcG9pbnRlciB0byBjb250ZXh0CisgKi8KK3ZvaWQgYXZwcml2X3NsaWNldGhyZWFkX2ZyZWUoQVZTbGljZVRocmVhZCAqKnBjdHgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9zb2Z0ZmxvYXQuYyBiL2xpYmF2dXRpbC9zb2Z0ZmxvYXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJmYmJiMi4uMDAwMDAwMAotLS0gYS9saWJhdnV0aWwvc29mdGZsb2F0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlICJzb2Z0ZmxvYXQuaCIKLSNpbmNsdWRlICJjb21tb24uaCIKLSNpbmNsdWRlICJsb2cuaCIKLQotI2lmZGVmIFRFU1QKLSNpbmNsdWRlIDxzdGRpby5oPgotCi1zdGF0aWMgY29uc3QgU29mdEZsb2F0IEZMT0FUXzBfMDE3Nzc2NDg5MjU3ID0gezB4MTIzNCwgMTJ9Owotc3RhdGljIGNvbnN0IFNvZnRGbG9hdCBGTE9BVF8xMzc0XzQwNjI1ID0gezB4YWJjZCwgMjV9Owotc3RhdGljIGNvbnN0IFNvZnRGbG9hdCBGTE9BVF8wXzEyNDk2OTQ4MjQyMTggPSB7MHhGRkYsIDE1fTsKLQotCi1pbnQgbWFpbih2b2lkKXsKLSAgICBTb2Z0RmxvYXQgb25lPSBhdl9pbnQyc2YoMSwgMCk7Ci0gICAgU29mdEZsb2F0IHNmMSwgc2YyLCBzZjM7Ci0gICAgZG91YmxlIGQxLCBkMiwgZDM7Ci0gICAgaW50IGksIGo7Ci0gICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOwotCi0gICAgZDE9IDE7Ci0gICAgZm9yKGk9IDA7IGk8MTA7IGkrKyl7Ci0gICAgICAgIGQxPSAxLyhkMSsxKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0MSBkb3VibGU9JWRcbiIsIChpbnQpKGQxICogKDE8PDI0KSkpOwotCi0gICAgc2YxPSBvbmU7Ci0gICAgZm9yKGk9IDA7IGk8MTA7IGkrKyl7Ci0gICAgICAgIHNmMT0gYXZfZGl2X3NmKG9uZSwgYXZfbm9ybWFsaXplX3NmKGF2X2FkZF9zZihvbmUsIHNmMSkpKTsKLSAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0MSBzZiAgICA9JWRcbiIsIGF2X3NmMmludChzZjEsIDI0KSk7Ci0KLQotICAgIGZvcihpPSAwOyBpPDEwMDsgaSsrKXsKLSAgICAgICAgU1RBUlRfVElNRVIKLSAgICAgICAgZDE9IGk7Ci0gICAgICAgIGQyPSBpLzEwMC4wOwotICAgICAgICBmb3Ioaj0gMDsgajwxMDAwOyBqKyspewotICAgICAgICAgICAgZDE9IChkMSsxKSpkMjsKLSAgICAgICAgfQotICAgICAgICBTVE9QX1RJTUVSKCJmbG9hdCBhZGQgbXVsIikKLSAgICB9Ci0gICAgcHJpbnRmKCJ0ZXN0MiBkb3VibGU9JWRcbiIsIChpbnQpKGQxICogKDE8PDI0KSkpOwotCi0gICAgZm9yKGk9IDA7IGk8MTAwOyBpKyspewotICAgICAgICBTVEFSVF9USU1FUgotICAgICAgICBzZjE9IGF2X2ludDJzZihpLCAwKTsKLSAgICAgICAgc2YyPSBhdl9kaXZfc2YoYXZfaW50MnNmKGksIDIpLCBhdl9pbnQyc2YoMjAwLCAzKSk7Ci0gICAgICAgIGZvcihqPSAwOyBqPDEwMDA7IGorKyl7Ci0gICAgICAgICAgICBzZjE9IGF2X211bF9zZihhdl9hZGRfc2Yoc2YxLCBvbmUpLHNmMik7Ci0gICAgICAgIH0KLSAgICAgICAgU1RPUF9USU1FUigic29mdGZsb2F0IGFkZCBtdWwiKQotICAgIH0KLSAgICBwcmludGYoInRlc3QyIHNmICAgID0lZCAoJWQgJWQpXG4iLCBhdl9zZjJpbnQoc2YxLCAyNCksIHNmMS5leHAsIHNmMS5tYW50KTsKLQotICAgIGQxID0gMC4wMTc3NzY0ODkzOwotICAgIGQyID0gMTM3NC40MDYyNTsKLSAgICBkMyA9IDAuMTI0OTY5NDgyNDsKLSAgICBkMiArPSBkMTsKLSAgICBkMyArPSBkMjsKLSAgICBwcmludGYoInRlc3QzIGRvdWJsZTogJS4xMGxmXG4iLCBkMyk7Ci0KLSAgICBzZjEgPSBGTE9BVF8wXzAxNzc3NjQ4OTI1NzsKLSAgICBzZjIgPSBGTE9BVF8xMzc0XzQwNjI1OwotICAgIHNmMyA9IEZMT0FUXzBfMTI0OTY5NDgyNDIxODsKLSAgICBzZjIgPSBhdl9hZGRfc2Yoc2YxLCBzZjIpOwotICAgIHNmMyA9IGF2X2FkZF9zZihzZjMsIHNmMik7Ci0gICAgcHJpbnRmKCJ0ZXN0MyBzb2Z0ZmxvYXQ6ICUuMTBsZiAoMHglMDh4ICVkKVxuIiwgKGRvdWJsZSlhdl9zZjJkb3VibGUoc2YzKSwgc2YzLm1hbnQsIHNmMy5leHApOwotCi0gICAgc2YxID0gYXZfaW50MnNmKDB4RkZGRkZGRjAsIDApOwotICAgIHByaW50ZigidGVzdDQgc29mdGZsb2F0OiAlLjEwbGYgKDB4JTA4eCAlZClcbiIsIChkb3VibGUpYXZfc2YyZG91YmxlKHNmMSksIHNmMS5tYW50LCBzZjEuZXhwKTsKLSAgICBzZjEgPSBhdl9pbnQyc2YoMHgwMDAwMDAxMCwgMCk7Ci0gICAgcHJpbnRmKCJ0ZXN0NCBzb2Z0ZmxvYXQ6ICUuMTBsZiAoMHglMDh4ICVkKVxuIiwgKGRvdWJsZSlhdl9zZjJkb3VibGUoc2YxKSwgc2YxLm1hbnQsIHNmMS5leHApOwotCi0gICAgc2YxID0gYXZfaW50MnNmKDB4MUZGRkZGRkYsIDApOwotICAgIHByaW50ZigidGVzdDQgc29mdGZsb2F0OiAlLjEwbGYgKDB4JTA4eCAlZClcbiIsIChkb3VibGUpYXZfc2YyZG91YmxlKHNmMSksIHNmMS5tYW50LCBzZjEuZXhwKTsKLSAgICBzZjEgPSBhdl9pbnQyc2YoMHhFMDAwMDAwMSwgMCk7Ci0gICAgcHJpbnRmKCJ0ZXN0NCBzb2Z0ZmxvYXQ6ICUuMTBsZiAoMHglMDh4ICVkKVxuIiwgKGRvdWJsZSlhdl9zZjJkb3VibGUoc2YxKSwgc2YxLm1hbnQsIHNmMS5leHApOwotCi0KLSAgICBzZjEgPSAoU29mdEZsb2F0KXsgMHgyMDAwMDAwMCwgICBNSU5fRVhQIH07Ci0gICAgc2YxID0gYXZfbXVsX3NmKHNmMSwgc2YxKTsKLSAgICBwcmludGYoInRlc3Q1IHNvZnRmbG9hdDogJS4xMGxmICgweCUwOHggJWQpXG4iLCAoZG91YmxlKWF2X3NmMmRvdWJsZShzZjEpLCBzZjEubWFudCwgc2YxLmV4cCk7Ci0KLSAgICBzZjEgPSAoU29mdEZsb2F0KXsgMHgyMDAwMDAwMCwgICBNSU5fRVhQIH07Ci0gICAgc2YyID0gKFNvZnRGbG9hdCl7IDB4MjAwMDAwMDAsICAgTUFYX0VYUCB9OwotICAgIGkgPSBhdl9jbXBfc2Yoc2YxLCBzZjIpOwotICAgIGogPSBhdl9jbXBfc2Yoc2YyLCBzZjEpOwotICAgIHNmMSA9IGF2X2Rpdl9zZihzZjEsIHNmMik7Ci0gICAgcHJpbnRmKCJ0ZXN0NiBzb2Z0ZmxvYXQ6ICUuMTBsZiAoMHglMDh4ICVkKSAlZCAlZFxuIiwgKGRvdWJsZSlhdl9zZjJkb3VibGUoc2YxKSwgc2YxLm1hbnQsIHNmMS5leHAsIGksIGopOwotCi0gICAgZm9yKGk9IC01MDsgaTw1MDsgaSsrKSB7Ci0gICAgICAgIHNmMT0gYXZfaW50MnNmKGksIDApOwotICAgICAgICBmb3Ioaj0gLTUwOyBqPDUwOyBqKyspIHsKLSAgICAgICAgICAgIGludCBjOwotICAgICAgICAgICAgc2YyPSBhdl9pbnQyc2YoaiwgMCk7Ci0gICAgICAgICAgICBjID0gYXZfY21wX3NmKHNmMSwgc2YyKTsKLSAgICAgICAgICAgIGlmIChGRkRJRkZTSUdOKGksaikgIT0gYyAmJiAoRkZESUZGU0lHTihpLGopXmMpPDApIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImF2X2NtcF9zZiBmYWlsZWQgYXQgJWQgJWQgYXMgJVhcbiIsIGksIGosIGMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYyA9IGF2X2d0X3NmKHNmMSwgc2YyKTsKLSAgICAgICAgICAgIGlmICgoaT5qKSAhPSBjKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJhdl9ndF9zZiBmYWlsZWQgYXQgJWQgJWQgYXMgJVhcbiIsIGksIGosIGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNmMSA9IGF2X2ludDJzZigxLCBpKTsKLSAgICAgICAgZm9yKGogPSAtNTA7IGogPCA1MDsgaisrKSB7Ci0gICAgICAgICAgICBpbnQgYzsKLSAgICAgICAgICAgIHNmMiA9IGF2X2ludDJzZigxLCBqKTsKLSAgICAgICAgICAgIGMgPSBhdl9jbXBfc2Yoc2YyLCBzZjEpOwotICAgICAgICAgICAgaWYgKEZGRElGRlNJR04oaSxqKSAhPSBjICYmIChGRkRJRkZTSUdOKGksaileYykgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJhdl9jbXBfc2YgZmFpbGVkMiBhdCAlZCAlZCBhcyAlWFxuIiwgaSwgaiwgYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjID0gYXZfZ3Rfc2Yoc2YxLCBzZjIpOwotICAgICAgICAgICAgaWYgKChpPGopICE9IGMpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoImF2X2d0X3NmIGZhaWxlZDIgYXQgJWQgJWQgYXMgJVhcbiIsIGksIGosIGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBmb3IoaT0gMDsgaTw0KjM2OyBpKyspewotICAgICAgICBpbnQgcywgYzsKLSAgICAgICAgZG91YmxlIGVycnMsIGVycmM7Ci0KLSAgICAgICAgYXZfc2luY29zX3NmKGkqKDFVTEw8PDMyKS8zNi80LCAmcywgJmMpOwotICAgICAgICBlcnJzID0gKGRvdWJsZSlzLyAoMTw8MzApIC0gc2luKGkqTV9QSS8zNik7Ci0gICAgICAgIGVycmMgPSAoZG91YmxlKWMvICgxPDwzMCkgLSBjb3MoaSpNX1BJLzM2KTsKLSAgICAgICAgaWYgKGZhYnMoZXJycykgPiAwLjAwMDAwMDAyIHx8IGZhYnMoZXJyYykgPjAuMDAxKSB7Ci0gICAgICAgICAgICBwcmludGYoInNpbmNvcyBGQUlMICVkICVmICVmICVmICVmXG4iLCBpLCAoZmxvYXQpcy8gKDE8PDMwKSwgKGZsb2F0KWMvICgxPDwzMCksIHNpbihpKk1fUEkvMzYpLCBjb3MoaSpNX1BJLzM2KSk7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4gMDsKLQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvc29mdGZsb2F0LmggYi9saWJhdnV0aWwvc29mdGZsb2F0LmgKaW5kZXggNGI4OTVmMC4uYTY1MTQwNiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3NvZnRmbG9hdC5oCisrKyBiL2xpYmF2dXRpbC9zb2Z0ZmxvYXQuaApAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgImF2YXNzZXJ0LmgiCiAjaW5jbHVkZSAic29mdGZsb2F0X3RhYmxlcy5oIgogCi0jZGVmaW5lIE1JTl9FWFAgLTEyNgorI2RlZmluZSBNSU5fRVhQIC0xNDkKICNkZWZpbmUgTUFYX0VYUCAgMTI2CiAjZGVmaW5lIE9ORV9CSVRTIDI5CiAKQEAgLTM2LDE4ICszNiwyMiBAQAogICAgIGludDMyX3QgIGV4cDsKIH1Tb2Z0RmxvYXQ7CiAKLXN0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMCAgICAgICAgICA9IHsgICAgICAgICAgMCwgICBNSU5fRVhQfTsKLXN0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMDUgICAgICAgICA9IHsgMHgyMDAwMDAwMCwgICAwfTsKLXN0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMSAgICAgICAgICA9IHsgMHgyMDAwMDAwMCwgICAxfTsKLXN0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfRVBTSUxPTiAgICA9IHsgMHgyOUYxNkIxMiwgLTE2fTsKLXN0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMTU4NDg5MzE5MiA9IHsgMHgzMkI3NzFFRCwgICAxfTsKLXN0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMTAwMDAwICAgICA9IHsgMHgzMEQ0MDAwMCwgIDE3fTsKLXN0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMDk5OTk5OSAgICA9IHsgMHgzRkZGRkJDRSwgICAwfTsKK3N0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMCAgICAgICAgICA9IHsgICAgICAgICAgMCwgICBNSU5fRVhQfTsgICAgICAgICAgICAgLy8vPCAwLjAKK3N0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMDUgICAgICAgICA9IHsgMHgyMDAwMDAwMCwgICAwfTsgICAgICAgICAgICAgICAgICAgLy8vPCAwLjUKK3N0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfMSAgICAgICAgICA9IHsgMHgyMDAwMDAwMCwgICAxfTsgICAgICAgICAgICAgICAgICAgLy8vPCAxLjAKK3N0YXRpYyBjb25zdCBTb2Z0RmxvYXQgRkxPQVRfRVBTSUxPTiAgICA9IHsgMHgyOUYxNkIxMiwgLTE2fTsgICAgICAgICAgICAgICAgICAgLy8vPCBBIHNtYWxsIHZhbHVlCitzdGF0aWMgY29uc3QgU29mdEZsb2F0IEZMT0FUXzE1ODQ4OTMxOTIgPSB7IDB4MzJCNzcxRUQsICAgMX07ICAgICAgICAgICAgICAgICAgIC8vLzwgMS41ODQ4OTMxOTIgKDEwXi4yKQorc3RhdGljIGNvbnN0IFNvZnRGbG9hdCBGTE9BVF8xMDAwMDAgICAgID0geyAweDMwRDQwMDAwLCAgMTd9OyAgICAgICAgICAgICAgICAgICAvLy88IDEwMDAwMAorc3RhdGljIGNvbnN0IFNvZnRGbG9hdCBGTE9BVF8wOTk5OTk5ICAgID0geyAweDNGRkZGQkNFLCAgIDB9OyAgICAgICAgICAgICAgICAgICAvLy88IDAuOTk5OTk5CitzdGF0aWMgY29uc3QgU29mdEZsb2F0IEZMT0FUX01JTiAgICAgICAgPSB7IDB4MjAwMDAwMDAsICAgTUlOX0VYUH07CiAKKworLyoqCisgKiBDb252ZXJ0IGEgU29mdEZsb2F0IHRvIGEgZG91YmxlIHByZWNpc2lvbiBmbG9hdC4KKyAqLwogc3RhdGljIGlubGluZSBhdl9jb25zdCBkb3VibGUgYXZfc2YyZG91YmxlKFNvZnRGbG9hdCB2KSB7CiAgICAgdi5leHAgLT0gT05FX0JJVFMgKzE7Ci0gICAgaWYodi5leHAgPiAwKSByZXR1cm4gKGRvdWJsZSl2Lm1hbnQgKiAoZG91YmxlKSgxIDw8IHYuZXhwKTsKLSAgICBlbHNlICAgICAgICAgIHJldHVybiAoZG91YmxlKXYubWFudCAvIChkb3VibGUpKDEgPDwgKC12LmV4cCkpOworICAgIHJldHVybiBsZGV4cCh2Lm1hbnQsIHYuZXhwKTsKIH0KIAogc3RhdGljIGF2X2NvbnN0IFNvZnRGbG9hdCBhdl9ub3JtYWxpemVfc2YoU29mdEZsb2F0IGEpewpAQCAtMTEwLDE0ICsxMTQsMjcgQEAKICAqIEByZXR1cm4gV2lsbCBub3QgYmUgbW9yZSBkZW5vcm1hbGl6ZWQgdGhhbiBhLgogICovCiBzdGF0aWMgaW5saW5lIGF2X2NvbnN0IFNvZnRGbG9hdCBhdl9kaXZfc2YoU29mdEZsb2F0IGEsIFNvZnRGbG9hdCBiKXsKKyAgICBpbnQ2NF90IHRlbXAgPSAoaW50NjRfdClhLm1hbnQgKiAoMTw8KE9ORV9CSVRTKzEpKTsKKyAgICB0ZW1wIC89IGIubWFudDsKICAgICBhLmV4cCAtPSBiLmV4cDsKLSAgICBhLm1hbnQgPSAoKGludDY0X3QpYS5tYW50PDwoT05FX0JJVFMrMSkpIC8gYi5tYW50OworICAgIGEubWFudCA9IHRlbXA7CisgICAgd2hpbGUgKGEubWFudCAhPSB0ZW1wKSB7CisgICAgICAgIHRlbXAgLz0gMjsKKyAgICAgICAgYS5leHAtLTsKKyAgICAgICAgYS5tYW50ID0gdGVtcDsKKyAgICB9CiAgICAgYSA9IGF2X25vcm1hbGl6ZTFfc2YoYSk7CiAgICAgaWYgKCFhLm1hbnQgfHwgYS5leHAgPCBNSU5fRVhQKQogICAgICAgICByZXR1cm4gRkxPQVRfMDsKICAgICByZXR1cm4gYTsKIH0KIAorLyoqCisgKiBDb21wYXJlcyB0d28gU29mdEZsb2F0cy4KKyAqIEByZXR1cm5zIDwgMCBpZiB0aGUgZmlyc3QgaXMgbGVzcworICogICAgICAgICAgPiAwIGlmIHRoZSBmaXJzdCBpcyBncmVhdGVyCisgKiAgICAgICAgICAgIDAgaWYgdGhleSBhcmUgZXF1YWwKKyAqLwogc3RhdGljIGlubGluZSBhdl9jb25zdCBpbnQgYXZfY21wX3NmKFNvZnRGbG9hdCBhLCBTb2Z0RmxvYXQgYil7CiAgICAgaW50IHQ9IGEuZXhwIC0gYi5leHA7CiAgICAgaWYgICAgICAodCA8LTMxKSByZXR1cm4gICAgICAgICAgICAgICAgICAtICBiLm1hbnQgICAgICA7CkBAIC0xMjYsNiArMTQzLDEwIEBACiAgICAgZWxzZSAgICAgICAgICAgICByZXR1cm4gIGEubWFudCAgICAgICAgICAgICAgICAgICAgICAgICA7CiB9CiAKKy8qKgorICogQ29tcGFyZXMgdHdvIFNvZnRGbG9hdHMuCisgKiBAcmV0dXJucyAxIGlmIGEgaXMgZ3JlYXRlciB0aGFuIGIsIDAgb3RoZXJ3aXNlCisgKi8KIHN0YXRpYyBpbmxpbmUgYXZfY29uc3QgaW50IGF2X2d0X3NmKFNvZnRGbG9hdCBhLCBTb2Z0RmxvYXQgYikKIHsKICAgICBpbnQgdD0gYS5leHAgLSBiLmV4cDsKQEAgLTEzNSw2ICsxNTYsOSBAQAogICAgIGVsc2UgICAgICAgICAgICAgcmV0dXJuICBhLm1hbnQgICAgICAgICAgPiAgMCAgICAgICAgICAgOwogfQogCisvKioKKyAqIEByZXR1cm5zIHRoZSBzdW0gb2YgMiBTb2Z0RmxvYXRzLgorICovCiBzdGF0aWMgaW5saW5lIGF2X2NvbnN0IFNvZnRGbG9hdCBhdl9hZGRfc2YoU29mdEZsb2F0IGEsIFNvZnRGbG9hdCBiKXsKICAgICBpbnQgdD0gYS5leHAgLSBiLmV4cDsKICAgICBpZiAgICAgICh0IDwtMzEpIHJldHVybiBiOwpAQCAtMTQzLDYgKzE2Nyw5IEBACiAgICAgZWxzZSAgICAgICAgICAgICByZXR1cm4gYTsKIH0KIAorLyoqCisgKiBAcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBvZiAyIFNvZnRGbG9hdHMuCisgKi8KIHN0YXRpYyBpbmxpbmUgYXZfY29uc3QgU29mdEZsb2F0IGF2X3N1Yl9zZihTb2Z0RmxvYXQgYSwgU29mdEZsb2F0IGIpewogICAgIHJldHVybiBhdl9hZGRfc2YoYSwgKFNvZnRGbG9hdCl7IC1iLm1hbnQsIGIuZXhwfSk7CiB9CkBAIC0xNTAsMTIgKzE3NywxNCBAQAogLy9GSVhNRSBsb2csIGV4cCwgcG93CiAKIC8qKgotICogQ29udmVydHMgYSBtYW50aXNzZSBhbmQgZXhwb25lbnQgdG8gYSBTb2Z0RmxvYXQKLSAqIEByZXR1cm5zIGEgU29mdEZsb2F0IHdpdGggdmFsdWUgdiAqIDJeZnJhY19iaXRzCisgKiBDb252ZXJ0cyBhIG1hbnRpc3NlIGFuZCBleHBvbmVudCB0byBhIFNvZnRGbG9hdC4KKyAqIFRoaXMgY29udmVydHMgYSBmaXhlZCBwb2ludCB2YWx1ZSB2IHdpdGggZnJhY19iaXRzIGZyYWN0aW9uYWwgYml0cyB0byBhCisgKiBTb2Z0RmxvYXQuCisgKiBAcmV0dXJucyBhIFNvZnRGbG9hdCB3aXRoIHZhbHVlIHYgKiAyXi1mcmFjX2JpdHMKICAqLwogc3RhdGljIGlubGluZSBhdl9jb25zdCBTb2Z0RmxvYXQgYXZfaW50MnNmKGludCB2LCBpbnQgZnJhY19iaXRzKXsKICAgICBpbnQgZXhwX29mZnNldCA9IDA7Ci0gICAgaWYodiA9PSBJTlRfTUlOKXsKKyAgICBpZih2IDw9IElOVF9NSU4gKyAxKXsKICAgICAgICAgZXhwX29mZnNldCA9IDE7CiAgICAgICAgIHY+Pj0xOwogICAgIH0KQEAgLTE2Myw2ICsxOTIsNyBAQAogfQogCiAvKioKKyAqIENvbnZlcnRzIGEgU29mdEZsb2F0IHRvIGFuIGludGVnZXIuCiAgKiBSb3VuZGluZyBpcyB0byAtaW5mLgogICovCiBzdGF0aWMgaW5saW5lIGF2X2NvbnN0IGludCBhdl9zZjJpbnQoU29mdEZsb2F0IHYsIGludCBmcmFjX2JpdHMpewpAQCAtMjE0LDEyICsyNDQsMTIgQEAKICAgICBpbnQgc3QsIGN0OwogCiAgICAgaWR4ID0gYSA+PiAyNjsKLSAgICBzaWduID0gKGlkeCA8PCAyNykgPj4gMzE7CisgICAgc2lnbiA9IChpbnQzMl90KSgodW5zaWduZWQpaWR4IDw8IDI3KSA+PiAzMTsKICAgICBjdiA9IGF2X2Nvc3RibF8xX3NmW2lkeCAmIDB4Zl07CiAgICAgY3YgPSAoY3YgXiBzaWduKSAtIHNpZ247CiAKICAgICBpZHggLT0gODsKLSAgICBzaWduID0gKGlkeCA8PCAyNykgPj4gMzE7CisgICAgc2lnbiA9IChpbnQzMl90KSgodW5zaWduZWQpaWR4IDw8IDI3KSA+PiAzMTsKICAgICBzdiA9IGF2X2Nvc3RibF8xX3NmW2lkeCAmIDB4Zl07CiAgICAgc3YgPSAoc3YgXiBzaWduKSAtIHNpZ247CiAKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9zb2Z0ZmxvYXRfaWVlZTc1NC5oIGIvbGliYXZ1dGlsL3NvZnRmbG9hdF9pZWVlNzU0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5NTdmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9zb2Z0ZmxvYXRfaWVlZTc1NC5oCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFVtYWlyIEtoYW4gPG9tZXJqZXJrQGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBBVlVUSUxfU09GVEZMT0FUX0lFRUU3NTRfSAorI2RlZmluZSBBVlVUSUxfU09GVEZMT0FUX0lFRUU3NTRfSAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNkZWZpbmUgRVhQX0JJQVMgMTI3CisjZGVmaW5lIE1BTlRfQklUUyAyMworCit0eXBlZGVmIHN0cnVjdCBTb2Z0RmxvYXRfSUVFRTc1NCB7CisgICAgaW50MzJfdCBzaWduOworICAgIHVpbnQ2NF90IG1hbnQ7CisgICAgaW50MzJfdCAgZXhwOworfSBTb2Z0RmxvYXRfSUVFRTc1NDsKKworc3RhdGljIGNvbnN0IFNvZnRGbG9hdF9JRUVFNzU0IEZMT0FUXzAgPSB7MCwgMCwgLTEyNn07CitzdGF0aWMgY29uc3QgU29mdEZsb2F0X0lFRUU3NTQgRkxPQVRfMSA9IHswLCAwLCAgICAwfTsKKworLyoqIE5vcm1hbGl6ZSB0aGUgc29mdGZsb2F0IGFzIGRlZmluZWQgYnkgSUVFRSA3NTQgc2luZ2xlLXJlY2lzaW9uIGZsb2F0aW5nCisgKiAgcG9pbnQgc3BlY2lmaWNhdGlvbgorICovCitzdGF0aWMgaW5saW5lIFNvZnRGbG9hdF9JRUVFNzU0IGF2X25vcm1hbGl6ZV9zZl9pZWVlNzU0KFNvZnRGbG9hdF9JRUVFNzU0IHNmKSB7CisgICAgd2hpbGUoIHNmLm1hbnQgPj0gMHgxMDAwMDAwVUwgKSB7CisgICAgICAgIHNmLmV4cCsrOworICAgICAgICBzZi5tYW50ID4+PSAxOworICAgIH0KKyAgICBzZi5tYW50ICY9IDB4MDA3ZmZmZmZVTDsKKyAgICByZXR1cm4gc2Y7Cit9CisKKy8qKiBDb252ZXJ0IGludGVnZXIgdG8gc29mdGZsb2F0LgorICogIEByZXR1cm4gc29mdGZsb2F0IHdpdGggdmFsdWUgbiAqIDJeZQorICovCitzdGF0aWMgaW5saW5lIFNvZnRGbG9hdF9JRUVFNzU0IGF2X2ludDJzZl9pZWVlNzU0KGludDY0X3QgbiwgaW50IGUpIHsKKyAgICBpbnQgc2lnbiA9IDA7CisKKyAgICBpZiAobiA8IDApIHsKKyAgICAgICAgc2lnbiA9IDE7CisgICAgICAgIG4gICAgKj0gLTE7CisgICAgfQorICAgIHJldHVybiBhdl9ub3JtYWxpemVfc2ZfaWVlZTc1NCgoU29mdEZsb2F0X0lFRUU3NTQpIHtzaWduLCBuIDw8IE1BTlRfQklUUywgMCArIGV9KTsKK30KKworLyoqIE1ha2UgYSBzb2Z0ZmxvYXQgb3V0IG9mIHRoZSBiaXRzdHJlYW0uIEFzc3VtZXMgdGhlIGJpdHMgYXJlIGluIHRoZSBmb3JtIGFzIGRlZmluZWQKKyAqICBieSB0aGUgSUVFRSA3NTQgc3BlYy4KKyAqLworc3RhdGljIGlubGluZSBTb2Z0RmxvYXRfSUVFRTc1NCBhdl9iaXRzMnNmX2llZWU3NTQodWludDMyX3QgbikgeworICAgIHJldHVybiAoKFNvZnRGbG9hdF9JRUVFNzU0KSB7IChuICYgMHg4MDAwMDAwMFVMKSwgKG4gJiAweDdGRkZGRlVMKSwgKG4gJiAweDdGODAwMDAwVUwpIH0pOworfQorCisvKiogQ29udmVydCB0aGUgc29mdGZsb2F0IHRvIGludGVnZXIKKyAqLworc3RhdGljIGlubGluZSBpbnQgYXZfc2YyaW50X2llZWU3NTQoU29mdEZsb2F0X0lFRUU3NTQgYSkgeworICAgIGlmKGEuZXhwID49IDApIHJldHVybiBhLm1hbnQgPDwgIGEuZXhwIDsKKyAgICBlbHNlICAgICAgICAgICByZXR1cm4gYS5tYW50ID4+KC1hLmV4cCk7Cit9CisKKy8qKiBEaXZpZGUgYSBieSBiLiBiIHNob3VsZCBub3QgYmUgemVyby4KKyAqICBAcmV0dXJuIG5vcm1hbGl6ZWQgcmVzdWx0CisgKi8KK3N0YXRpYyBpbmxpbmUgU29mdEZsb2F0X0lFRUU3NTQgYXZfZGl2X3NmX2llZWU3NTQoU29mdEZsb2F0X0lFRUU3NTQgYSwgU29mdEZsb2F0X0lFRUU3NTQgYikgeworICAgIGludDMyX3QgbWFudCwgZXhwLCBzaWduOworICAgIGEgICAgPSBhdl9ub3JtYWxpemVfc2ZfaWVlZTc1NChhKTsKKyAgICBiICAgID0gYXZfbm9ybWFsaXplX3NmX2llZWU3NTQoYik7CisgICAgc2lnbiA9IGEuc2lnbiBeIGIuc2lnbjsKKyAgICBtYW50ID0gKCgoKHVpbnQ2NF90KSAoYS5tYW50IHwgMHgwMDgwMDAwMFVMKSkgPDwgTUFOVF9CSVRTKSAvIChiLm1hbnR8IDB4MDA4MDAwMDBVTCkpOworICAgIGV4cCAgPSBhLmV4cCAtIGIuZXhwOworICAgIHJldHVybiBhdl9ub3JtYWxpemVfc2ZfaWVlZTc1NCgoU29mdEZsb2F0X0lFRUU3NTQpIHtzaWduLCBtYW50LCBleHB9KTsKK30KKworLyoqIE11bHRpcGx5IGEgd2l0aCBiCisgKiAgI3JldHVybiBub3JtYWxpemVkIHJlc3VsdAorICovCitzdGF0aWMgaW5saW5lIFNvZnRGbG9hdF9JRUVFNzU0IGF2X211bF9zZl9pZWVlNzU0KFNvZnRGbG9hdF9JRUVFNzU0IGEsIFNvZnRGbG9hdF9JRUVFNzU0IGIpIHsKKyAgICBpbnQzMl90IHNpZ24sIG1hbnQsIGV4cDsKKyAgICBhICAgID0gYXZfbm9ybWFsaXplX3NmX2llZWU3NTQoYSk7CisgICAgYiAgICA9IGF2X25vcm1hbGl6ZV9zZl9pZWVlNzU0KGIpOworICAgIHNpZ24gPSBhLnNpZ24gXiBiLnNpZ247CisgICAgbWFudCA9ICgoKHVpbnQ2NF90KShhLm1hbnR8MHgwMDgwMDAwMFVMKSAqICh1aW50NjRfdCkoYi5tYW50fDB4MDA4MDAwMDBVTCkpPj5NQU5UX0JJVFMpOworICAgIGV4cCAgPSBhLmV4cCArIGIuZXhwOworICAgIHJldHVybiBhdl9ub3JtYWxpemVfc2ZfaWVlZTc1NCgoU29mdEZsb2F0X0lFRUU3NTQpIHtzaWduLCBtYW50LCBleHB9KTsKK30KKworLyoqIENvbXBhcmUgYSB3aXRoIGIgc3RyaWN0bHkKKyAqICBAcmV0dXJucyAxIGlmIHRoZSBhIGFuZCBiIGFyZSBlcXVhbCwgMCBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF2X2NtcF9zZl9pZWVlNzU0KFNvZnRGbG9hdF9JRUVFNzU0IGEsIFNvZnRGbG9hdF9JRUVFNzU0IGIpIHsKKyAgICBhID0gYXZfbm9ybWFsaXplX3NmX2llZWU3NTQoYSk7CisgICAgYiA9IGF2X25vcm1hbGl6ZV9zZl9pZWVlNzU0KGIpOworICAgIGlmIChhLnNpZ24gIT0gYi5zaWduKSByZXR1cm4gMDsKKyAgICBpZiAoYS5tYW50ICE9IGIubWFudCkgcmV0dXJuIDA7CisgICAgaWYgKGEuZXhwICAhPSBiLmV4cCApIHJldHVybiAwOworICAgIHJldHVybiAxOworfQorCisjZW5kaWYgLypBVlVUSUxfU09GVEZMT0FUX0lFRUU3NTRfSCovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvc3BoZXJpY2FsLmMgYi9saWJhdnV0aWwvc3BoZXJpY2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJlNTVmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC9zcGhlcmljYWwuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IFZpdHRvcmlvIEdpb3ZhcmEgPHZpdHRvcmlvLmdpb3ZhcmFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAic3BoZXJpY2FsLmgiCisKK0FWU3BoZXJpY2FsTWFwcGluZyAqYXZfc3BoZXJpY2FsX2FsbG9jKHNpemVfdCAqc2l6ZSkKK3sKKyAgICBBVlNwaGVyaWNhbE1hcHBpbmcgKnNwaGVyaWNhbCA9IGF2X21hbGxvY3ooc2l6ZW9mKEFWU3BoZXJpY2FsTWFwcGluZykpOworICAgIGlmICghc3BoZXJpY2FsKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGlmIChzaXplKQorICAgICAgICAqc2l6ZSA9IHNpemVvZigqc3BoZXJpY2FsKTsKKworICAgIHJldHVybiBzcGhlcmljYWw7Cit9CisKK3ZvaWQgYXZfc3BoZXJpY2FsX3RpbGVfYm91bmRzKGNvbnN0IEFWU3BoZXJpY2FsTWFwcGluZyAqbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpsZWZ0LCBzaXplX3QgKnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqcmlnaHQsIHNpemVfdCAqYm90dG9tKQoreworICAgIC8qIGNvbnZlcnNpb24gZnJvbSAwLjMyIGNvb3JkaW5hdGVzIHRvIHBpeGVscyAqLworICAgIHVpbnQ2NF90IG9yaWdfd2lkdGggID0gKHVpbnQ2NF90KSB3aWR0aCAgKiBVSU5UMzJfTUFYIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzJfTUFYIC0gbWFwLT5ib3VuZF9yaWdodCAgLSBtYXAtPmJvdW5kX2xlZnQpOworICAgIHVpbnQ2NF90IG9yaWdfaGVpZ2h0ID0gKHVpbnQ2NF90KSBoZWlnaHQgKiBVSU5UMzJfTUFYIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChVSU5UMzJfTUFYIC0gbWFwLT5ib3VuZF9ib3R0b20gLSBtYXAtPmJvdW5kX3RvcCk7CisKKyAgICAvKiBhZGQgYSAoVUlOVDMyX01BWCAtIDEpIHRvIHJvdW5kIHVwIGludGVnZXIgZGl2aXNpb24gKi8KKyAgICAqbGVmdCAgID0gKG9yaWdfd2lkdGggICogbWFwLT5ib3VuZF9sZWZ0ICsgVUlOVDMyX01BWCAtIDEpIC8gVUlOVDMyX01BWDsKKyAgICAqdG9wICAgID0gKG9yaWdfaGVpZ2h0ICogbWFwLT5ib3VuZF90b3AgICsgVUlOVDMyX01BWCAtIDEpIC8gVUlOVDMyX01BWDsKKyAgICAqcmlnaHQgID0gb3JpZ193aWR0aCAgLSB3aWR0aCAgLSAqbGVmdDsKKyAgICAqYm90dG9tID0gb3JpZ19oZWlnaHQgLSBoZWlnaHQgLSAqdG9wOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc3BoZXJpY2FsX3Byb2plY3Rpb25fbmFtZXNbXSA9IHsKKyAgICBbQVZfU1BIRVJJQ0FMX0VRVUlSRUNUQU5HVUxBUl0gICAgICA9ICJlcXVpcmVjdGFuZ3VsYXIiLAorICAgIFtBVl9TUEhFUklDQUxfQ1VCRU1BUF0gICAgICAgICAgICAgID0gImN1YmVtYXAiLAorICAgIFtBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSX1RJTEVdID0gInRpbGVkIGVxdWlyZWN0YW5ndWxhciIsCit9OworCitjb25zdCBjaGFyICphdl9zcGhlcmljYWxfcHJvamVjdGlvbl9uYW1lKGVudW0gQVZTcGhlcmljYWxQcm9qZWN0aW9uIHByb2plY3Rpb24pCit7CisgICAgaWYgKCh1bnNpZ25lZClwcm9qZWN0aW9uID49IEZGX0FSUkFZX0VMRU1TKHNwaGVyaWNhbF9wcm9qZWN0aW9uX25hbWVzKSkKKyAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKKworICAgIHJldHVybiBzcGhlcmljYWxfcHJvamVjdGlvbl9uYW1lc1twcm9qZWN0aW9uXTsKK30KKworaW50IGF2X3NwaGVyaWNhbF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzcGhlcmljYWxfcHJvamVjdGlvbl9uYW1lcyk7IGkrKykgeworICAgICAgICBzaXplX3QgbGVuID0gc3RybGVuKHNwaGVyaWNhbF9wcm9qZWN0aW9uX25hbWVzW2ldKTsKKyAgICAgICAgaWYgKCFzdHJuY21wKHNwaGVyaWNhbF9wcm9qZWN0aW9uX25hbWVzW2ldLCBuYW1lLCBsZW4pKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3NwaGVyaWNhbC5oIGIvbGliYXZ1dGlsL3NwaGVyaWNhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjc1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvc3BoZXJpY2FsLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgVml0dG9yaW8gR2lvdmFyYSA8dml0dG9yaW8uZ2lvdmFyYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIFNwaGVyaWNhbCB2aWRlbworICovCisKKyNpZm5kZWYgQVZVVElMX1NQSEVSSUNBTF9ICisjZGVmaW5lIEFWVVRJTF9TUEhFUklDQUxfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qKgorICogQGFkZHRvZ3JvdXAgbGF2dV92aWRlbworICogQHsKKyAqCisgKiBAZGVmZ3JvdXAgbGF2dV92aWRlb19zcGhlcmljYWwgU3BoZXJpY2FsIHZpZGVvIG1hcHBpbmcKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X3ZpZGVvX3NwaGVyaWNhbAorICogQSBzcGhlcmljYWwgdmlkZW8gZmlsZSBjb250YWlucyBzdXJmYWNlcyB0aGF0IG5lZWQgdG8gYmUgbWFwcGVkIG9udG8gYQorICogc3BoZXJlLiBEZXBlbmRpbmcgb24gaG93IHRoZSBmcmFtZSB3YXMgY29udmVydGVkLCBhIGRpZmZlcmVudCBkaXN0b3J0aW9uCisgKiB0cmFuc2Zvcm1hdGlvbiBvciBzdXJmYWNlIHJlY29tcG9zaXRpb24gZnVuY3Rpb24gbmVlZHMgdG8gYmUgYXBwbGllZCBiZWZvcmUKKyAqIHRoZSB2aWRlbyBzaG91bGQgYmUgbWFwcGVkIGFuZCBkaXNwbGF5ZWQuCisgKi8KKworLyoqCisgKiBQcm9qZWN0aW9uIG9mIHRoZSB2aWRlbyBzdXJmYWNlKHMpIG9uIGEgc3BoZXJlLgorICovCitlbnVtIEFWU3BoZXJpY2FsUHJvamVjdGlvbiB7CisgICAgLyoqCisgICAgICogVmlkZW8gcmVwcmVzZW50cyBhIHNwaGVyZSBtYXBwZWQgb24gYSBmbGF0IHN1cmZhY2UgdXNpbmcKKyAgICAgKiBlcXVpcmVjdGFuZ3VsYXIgcHJvamVjdGlvbi4KKyAgICAgKi8KKyAgICBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSLAorCisgICAgLyoqCisgICAgICogVmlkZW8gZnJhbWUgaXMgc3BsaXQgaW50byA2IGZhY2VzIG9mIGEgY3ViZSwgYW5kIGFycmFuZ2VkIG9uIGEKKyAgICAgKiAzeDIgbGF5b3V0LiBGYWNlcyBhcmUgb3JpZW50ZWQgdXB3YXJkcyBmb3IgdGhlIGZyb250LCBsZWZ0LCByaWdodCwKKyAgICAgKiBhbmQgYmFjayBmYWNlcy4gVGhlIHVwIGZhY2UgaXMgb3JpZW50ZWQgc28gdGhlIHRvcCBvZiB0aGUgZmFjZSBpcworICAgICAqIGZvcndhcmRzIGFuZCB0aGUgZG93biBmYWNlIGlzIG9yaWVudGVkIHNvIHRoZSB0b3Agb2YgdGhlIGZhY2UgaXMKKyAgICAgKiB0byB0aGUgYmFjay4KKyAgICAgKi8KKyAgICBBVl9TUEhFUklDQUxfQ1VCRU1BUCwKKworICAgIC8qKgorICAgICAqIFZpZGVvIHJlcHJlc2VudHMgYSBwb3J0aW9uIG9mIGEgc3BoZXJlIG1hcHBlZCBvbiBhIGZsYXQgc3VyZmFjZQorICAgICAqIHVzaW5nIGVxdWlyZWN0YW5ndWxhciBwcm9qZWN0aW9uLiBUaGUgQHJlZiBib3VuZGluZyBmaWVsZHMgaW5kaWNhdGUKKyAgICAgKiB0aGUgcG9zaXRpb24gb2YgdGhlIGN1cnJlbnQgdmlkZW8gaW4gYSBsYXJnZXIgc3VyZmFjZS4KKyAgICAgKi8KKyAgICBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSX1RJTEUsCit9OworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBob3cgdG8gaGFuZGxlIHNwaGVyaWNhbCB2aWRlb3MsIG91dGxpbmluZworICogaW5mb3JtYXRpb24gYWJvdXQgcHJvamVjdGlvbiwgaW5pdGlhbCBsYXlvdXQsIGFuZCBhbnkgb3RoZXIgdmlldyBtb2RpZmllci4KKyAqCisgKiBAbm90ZSBUaGUgc3RydWN0IG11c3QgYmUgYWxsb2NhdGVkIHdpdGggYXZfc3BoZXJpY2FsX2FsbG9jKCkgYW5kCisgKiAgICAgICBpdHMgc2l6ZSBpcyBub3QgYSBwYXJ0IG9mIHRoZSBwdWJsaWMgQUJJLgorICovCit0eXBlZGVmIHN0cnVjdCBBVlNwaGVyaWNhbE1hcHBpbmcgeworICAgIC8qKgorICAgICAqIFByb2plY3Rpb24gdHlwZS4KKyAgICAgKi8KKyAgICBlbnVtIEFWU3BoZXJpY2FsUHJvamVjdGlvbiBwcm9qZWN0aW9uOworCisgICAgLyoqCisgICAgICogQG5hbWUgSW5pdGlhbCBvcmllbnRhdGlvbgorICAgICAqIEB7CisgICAgICogVGhlcmUgZmllbGRzIGRlc2NyaWJlIGFkZGl0aW9uYWwgcm90YXRpb25zIGFwcGxpZWQgdG8gdGhlIHNwaGVyZSBhZnRlcgorICAgICAqIHRoZSB2aWRlbyBmcmFtZSBpcyBtYXBwZWQgb250byBpdC4gVGhlIHNwaGVyZSBpcyByb3RhdGVkIGFyb3VuZCB0aGUKKyAgICAgKiB2aWV3ZXIsIHdobyByZW1haW5zIHN0YXRpb25hcnkuIFRoZSBvcmRlciBvZiB0cmFuc2Zvcm1hdGlvbiBpcyBhbHdheXMKKyAgICAgKiB5YXcsIGZvbGxvd2VkIGJ5IHBpdGNoLCBhbmQgZmluYWxseSBieSByb2xsLgorICAgICAqCisgICAgICogVGhlIGNvb3JkaW5hdGUgc3lzdGVtIG1hdGNoZXMgdGhlIG9uZSBkZWZpbmVkIGluIE9wZW5HTCwgd2hlcmUgdGhlCisgICAgICogZm9yd2FyZCB2ZWN0b3IgKHopIGlzIGNvbWluZyBvdXQgb2Ygc2NyZWVuLCBhbmQgaXQgaXMgZXF1aXZhbGVudCB0bworICAgICAqIGEgcm90YXRpb24gbWF0cml4IG9mIFIgPSByX3koeWF3KSAqIHJfeChwaXRjaCkgKiByX3oocm9sbCkuCisgICAgICoKKyAgICAgKiBBIHBvc2l0aXZlIHlhdyByb3RhdGVzIHRoZSBwb3J0aW9uIG9mIHRoZSBzcGhlcmUgaW4gZnJvbnQgb2YgdGhlIHZpZXdlcgorICAgICAqIHRvd2FyZCB0aGVpciByaWdodC4gQSBwb3NpdGl2ZSBwaXRjaCByb3RhdGVzIHRoZSBwb3J0aW9uIG9mIHRoZSBzcGhlcmUKKyAgICAgKiBpbiBmcm9udCBvZiB0aGUgdmlld2VyIHVwd2FyZHMuIEEgcG9zaXRpdmUgcm9sbCB0aWx0cyB0aGUgcG9ydGlvbiBvZgorICAgICAqIHRoZSBzcGhlcmUgaW4gZnJvbnQgb2YgdGhlIHZpZXdlciB0byB0aGUgdmlld2VyJ3MgcmlnaHQuCisgICAgICoKKyAgICAgKiBUaGVzZSB2YWx1ZXMgYXJlIGV4cG9ydGVkIGFzIDE2LjE2IGZpeGVkIHBvaW50LgorICAgICAqCisgICAgICogU2VlIHRoaXMgZXF1aXJlY3Rhbmd1bGFyIHByb2plY3Rpb24gYXMgZXhhbXBsZToKKyAgICAgKgorICAgICAqIEBjb2Rley51bnBhcnNlZH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICBZYXcKKyAgICAgKiAgICAgLTE4MCAgICAgICAgICAgMCAgICAgICAgICAgMTgwCisgICAgICogICA5MCArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKyAgMTgwCisgICAgICogICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgIHVwCisgICAgICogUCAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgeXwgICAgZm9yd2FyZAorICAgICAqIGkgICAgfCAgICAgICAgICAgICBeICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8ICAgL3oKKyAgICAgKiB0ICAwICstLS0tLS0tLS0tLS0tWC0tLS0tLS0tLS0tLS0rICAgIDAgUm9sbCAgICAgICAgfCAgLworICAgICAqIGMgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICB8IC8KKyAgICAgKiBoICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAwfC9fX19fX3JpZ2h0CisgICAgICogICAgICB8ICAgICAgICAgICAgIHwgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHgKKyAgICAgKiAgLTkwICstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rIC0xODAKKyAgICAgKgorICAgICAqIFggLSB0aGUgZGVmYXVsdCBjYW1lcmEgY2VudGVyCisgICAgICogXiAtIHRoZSBkZWZhdWx0IHVwIHZlY3RvcgorICAgICAqIEBlbmRjb2RlCisgICAgICovCisgICAgaW50MzJfdCB5YXc7ICAgLy8vPCBSb3RhdGlvbiBhcm91bmQgdGhlIHVwIHZlY3RvciBbLTE4MCwgMTgwXS4KKyAgICBpbnQzMl90IHBpdGNoOyAvLy88IFJvdGF0aW9uIGFyb3VuZCB0aGUgcmlnaHQgdmVjdG9yIFstOTAsIDkwXS4KKyAgICBpbnQzMl90IHJvbGw7ICAvLy88IFJvdGF0aW9uIGFyb3VuZCB0aGUgZm9yd2FyZCB2ZWN0b3IgWy0xODAsIDE4MF0uCisgICAgLyoqCisgICAgICogQH0KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEBuYW1lIEJvdW5kaW5nIHJlY3RhbmdsZQorICAgICAqIEBhbmNob3IgYm91bmRpbmcKKyAgICAgKiBAeworICAgICAqIFRoZXNlIGZpZWxkcyBpbmRpY2F0ZSB0aGUgbG9jYXRpb24gb2YgdGhlIGN1cnJlbnQgdGlsZSwgYW5kIHdoZXJlCisgICAgICogaXQgc2hvdWxkIGJlIG1hcHBlZCByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwgc3VyZmFjZS4gVGhleSBhcmUKKyAgICAgKiBleHBvcnRlZCBhcyAwLjMyIGZpeGVkIHBvaW50LCBhbmQgY2FuIGJlIGNvbnZlcnRlZCB0byBjbGFzc2ljCisgICAgICogcGl4ZWwgdmFsdWVzIHdpdGggYXZfc3BoZXJpY2FsX2JvdW5kcygpLgorICAgICAqCisgICAgICogQGNvZGV7LnVucGFyc2VkfQorICAgICAqICAgICAgKy0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKKyAgICAgKiAgICAgIHwgICAgICAgICAgICAgICAgfGJvdW5kX3RvcCB8CisgICAgICogICAgICB8ICAgICAgICAgICAgKy0tLS0tLS0tKyAgICAgfAorICAgICAqICAgICAgfCBib3VuZF9sZWZ0IHx0aWxlICAgIHwgICAgIHwKKyAgICAgKiAgICAgICs8LS0tLS0tLS0tLT58ICAgICAgICB8PC0tLT4rYm91bmRfcmlnaHQKKyAgICAgKiAgICAgIHwgICAgICAgICAgICArLS0tLS0tLS0rICAgICB8CisgICAgICogICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAorICAgICAqICAgICAgfCAgICBib3VuZF9ib3R0b218ICAgICAgICAgIHwKKyAgICAgKiAgICAgICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rCisgICAgICogQGVuZGNvZGUKKyAgICAgKgorICAgICAqIElmIG5lZWRlZCwgdGhlIG9yaWdpbmFsIHZpZGVvIHN1cmZhY2UgZGltZW5zaW9ucyBjYW4gYmUgZGVyaXZlZAorICAgICAqIGJ5IGFkZGluZyB0aGUgY3VycmVudCBzdHJlYW0gb3IgZnJhbWUgc2l6ZSB0byB0aGUgcmVsYXRlZCBib3VuZHMsCisgICAgICogbGlrZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICoKKyAgICAgKiBAY29kZXtjfQorICAgICAqICAgICBvcmlnaW5hbF93aWR0aCAgPSB0aWxlLT53aWR0aCAgKyBib3VuZF9sZWZ0ICsgYm91bmRfcmlnaHQ7CisgICAgICogICAgIG9yaWdpbmFsX2hlaWdodCA9IHRpbGUtPmhlaWdodCArIGJvdW5kX3RvcCAgKyBib3VuZF9ib3R0b207CisgICAgICogQGVuZGNvZGUKKyAgICAgKgorICAgICAqIEBub3RlIFRoZXNlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgdGhlIHRpbGVkIGVxdWlyZWN0YW5ndWxhcgorICAgICAqICAgICAgIHByb2plY3Rpb24gdHlwZSAoQHJlZiBBVl9TUEhFUklDQUxfRVFVSVJFQ1RBTkdVTEFSX1RJTEUpLAorICAgICAqICAgICAgIGFuZCBzaG91bGQgYmUgaWdub3JlZCBpbiBhbGwgb3RoZXIgY2FzZXMuCisgICAgICovCisgICAgdWludDMyX3QgYm91bmRfbGVmdDsgICAvLy88IERpc3RhbmNlIGZyb20gdGhlIGxlZnQgZWRnZQorICAgIHVpbnQzMl90IGJvdW5kX3RvcDsgICAgLy8vPCBEaXN0YW5jZSBmcm9tIHRoZSB0b3AgZWRnZQorICAgIHVpbnQzMl90IGJvdW5kX3JpZ2h0OyAgLy8vPCBEaXN0YW5jZSBmcm9tIHRoZSByaWdodCBlZGdlCisgICAgdWludDMyX3QgYm91bmRfYm90dG9tOyAvLy88IERpc3RhbmNlIGZyb20gdGhlIGJvdHRvbSBlZGdlCisgICAgLyoqCisgICAgICogQH0KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBwaXhlbHMgdG8gcGFkIGZyb20gdGhlIGVkZ2Ugb2YgZWFjaCBjdWJlIGZhY2UuCisgICAgICoKKyAgICAgKiBAbm90ZSBUaGlzIHZhbHVlIGlzIHZhbGlkIGZvciBvbmx5IGZvciB0aGUgY3ViZW1hcCBwcm9qZWN0aW9uIHR5cGUKKyAgICAgKiAgICAgICAoQHJlZiBBVl9TUEhFUklDQUxfQ1VCRU1BUCksIGFuZCBzaG91bGQgYmUgaWdub3JlZCBpbiBhbGwgb3RoZXIKKyAgICAgKiAgICAgICBjYXNlcy4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBwYWRkaW5nOworfSBBVlNwaGVyaWNhbE1hcHBpbmc7CisKKy8qKgorICogQWxsb2NhdGUgYSBBVlNwaGVyaWNhbFZpZGVvIHN0cnVjdHVyZSBhbmQgaW5pdGlhbGl6ZSBpdHMgZmllbGRzIHRvIGRlZmF1bHQKKyAqIHZhbHVlcy4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgc3RydWN0IG9yIE5VTEwgb24gZmFpbHVyZQorICovCitBVlNwaGVyaWNhbE1hcHBpbmcgKmF2X3NwaGVyaWNhbF9hbGxvYyhzaXplX3QgKnNpemUpOworCisvKioKKyAqIENvbnZlcnQgdGhlIEByZWYgYm91bmRpbmcgZmllbGRzIGZyb20gYW4gQVZTcGhlcmljYWxWaWRlbworICogZnJvbSAwLjMyIGZpeGVkIHBvaW50IHRvIHBpeGVscy4KKyAqCisgKiBAcGFyYW0gbWFwICAgIFRoZSBBVlNwaGVyaWNhbFZpZGVvIG1hcCB0byByZWFkIGJvdW5kIHZhbHVlcyBmcm9tLgorICogQHBhcmFtIHdpZHRoICBXaWR0aCBvZiB0aGUgY3VycmVudCBmcmFtZSBvciBzdHJlYW0uCisgKiBAcGFyYW0gaGVpZ2h0IEhlaWdodCBvZiB0aGUgY3VycmVudCBmcmFtZSBvciBzdHJlYW0uCisgKiBAcGFyYW0gbGVmdCAgIFBpeGVscyBmcm9tIHRoZSBsZWZ0IGVkZ2UuCisgKiBAcGFyYW0gdG9wICAgIFBpeGVscyBmcm9tIHRoZSB0b3AgZWRnZS4KKyAqIEBwYXJhbSByaWdodCAgUGl4ZWxzIGZyb20gdGhlIHJpZ2h0IGVkZ2UuCisgKiBAcGFyYW0gYm90dG9tIFBpeGVscyBmcm9tIHRoZSBib3R0b20gZWRnZS4KKyAqLwordm9pZCBhdl9zcGhlcmljYWxfdGlsZV9ib3VuZHMoY29uc3QgQVZTcGhlcmljYWxNYXBwaW5nICptYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmxlZnQsIHNpemVfdCAqdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpyaWdodCwgc2l6ZV90ICpib3R0b20pOworCisvKioKKyAqIFByb3ZpZGUgYSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIGEgZ2l2ZW4gQVZTcGhlcmljYWxQcm9qZWN0aW9uLgorICoKKyAqIEBwYXJhbSBwcm9qZWN0aW9uIFRoZSBpbnB1dCBBVlNwaGVyaWNhbFByb2plY3Rpb24uCisgKgorICogQHJldHVybiBUaGUgbmFtZSBvZiB0aGUgQVZTcGhlcmljYWxQcm9qZWN0aW9uLCBvciAidW5rbm93biIuCisgKi8KK2NvbnN0IGNoYXIgKmF2X3NwaGVyaWNhbF9wcm9qZWN0aW9uX25hbWUoZW51bSBBVlNwaGVyaWNhbFByb2plY3Rpb24gcHJvamVjdGlvbik7CisKKy8qKgorICogR2V0IHRoZSBBVlNwaGVyaWNhbFByb2plY3Rpb24gZm9ybSBhIGh1bWFuLXJlYWRhYmxlIG5hbWUuCisgKgorICogQHBhcmFtIG5hbWUgVGhlIGlucHV0IHN0cmluZy4KKyAqCisgKiBAcmV0dXJuIFRoZSBBVlNwaGVyaWNhbFByb2plY3Rpb24gdmFsdWUsIG9yIC0xIGlmIG5vdCBmb3VuZC4KKyAqLworaW50IGF2X3NwaGVyaWNhbF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisvKioKKyAqIEB9CisgKiBAfQorICovCisKKyNlbmRpZiAvKiBBVlVUSUxfU1BIRVJJQ0FMX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC9zdGVyZW8zZC5jIGIvbGliYXZ1dGlsL3N0ZXJlbzNkLmMKaW5kZXggNTBjZDkyOC4uNmVkY2RiMSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3N0ZXJlbzNkLmMKKysrIGIvbGliYXZ1dGlsL3N0ZXJlbzNkLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAorI2luY2x1ZGUgImNvbW1vbi5oIgogI2luY2x1ZGUgIm1lbS5oIgogI2luY2x1ZGUgInN0ZXJlbzNkLmgiCiAKQEAgLTQxLDMgKzQyLDM1IEBACiAKICAgICByZXR1cm4gKEFWU3RlcmVvM0QgKilzaWRlX2RhdGEtPmRhdGE7CiB9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3RlcmVvM2RfdHlwZV9uYW1lc1tdID0geworICAgIFtBVl9TVEVSRU8zRF8yRF0gICAgICAgICAgICAgICAgICA9ICIyRCIsCisgICAgW0FWX1NURVJFTzNEX1NJREVCWVNJREVdICAgICAgICAgID0gInNpZGUgYnkgc2lkZSIsCisgICAgW0FWX1NURVJFTzNEX1RPUEJPVFRPTV0gICAgICAgICAgID0gInRvcCBhbmQgYm90dG9tIiwKKyAgICBbQVZfU1RFUkVPM0RfRlJBTUVTRVFVRU5DRV0gICAgICAgPSAiZnJhbWUgYWx0ZXJuYXRlIiwKKyAgICBbQVZfU1RFUkVPM0RfQ0hFQ0tFUkJPQVJEXSAgICAgICAgPSAiY2hlY2tlcmJvYXJkIiwKKyAgICBbQVZfU1RFUkVPM0RfU0lERUJZU0lERV9RVUlOQ1VOWF0gPSAic2lkZSBieSBzaWRlIChxdWluY3VueCBzdWJzYW1wbGluZykiLAorICAgIFtBVl9TVEVSRU8zRF9MSU5FU10gICAgICAgICAgICAgICA9ICJpbnRlcmxlYXZlZCBsaW5lcyIsCisgICAgW0FWX1NURVJFTzNEX0NPTFVNTlNdICAgICAgICAgICAgID0gImludGVybGVhdmVkIGNvbHVtbnMiLAorfTsKKworY29uc3QgY2hhciAqYXZfc3RlcmVvM2RfdHlwZV9uYW1lKHVuc2lnbmVkIGludCB0eXBlKQoreworICAgIGlmICh0eXBlID49IEZGX0FSUkFZX0VMRU1TKHN0ZXJlbzNkX3R5cGVfbmFtZXMpKQorICAgICAgICByZXR1cm4gInVua25vd24iOworCisgICAgcmV0dXJuIHN0ZXJlbzNkX3R5cGVfbmFtZXNbdHlwZV07Cit9CisKK2ludCBhdl9zdGVyZW8zZF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhzdGVyZW8zZF90eXBlX25hbWVzKTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oc3RlcmVvM2RfdHlwZV9uYW1lc1tpXSk7CisgICAgICAgIGlmICghc3RybmNtcChzdGVyZW8zZF90eXBlX25hbWVzW2ldLCBuYW1lLCBsZW4pKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3N0ZXJlbzNkLmggYi9saWJhdnV0aWwvc3RlcmVvM2QuaAppbmRleCAxMTM1ZGM5Li5kNDIxYWFjIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvc3RlcmVvM2QuaAorKysgYi9saWJhdnV0aWwvc3RlcmVvM2QuaApAQCAtMTgsNiArMTgsMTEgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisvKioKKyAqIEBmaWxlCisgKiBTdGVyZW9zY29waWMgdmlkZW8KKyAqLworCiAjaWZuZGVmIEFWVVRJTF9TVEVSRU8zRF9ICiAjZGVmaW5lIEFWVVRJTF9TVEVSRU8zRF9ICiAKQEAgLTI2LDYgKzMxLDIxIEBACiAjaW5jbHVkZSAiZnJhbWUuaCIKIAogLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X3ZpZGVvCisgKiBAeworICoKKyAqIEBkZWZncm91cCBsYXZ1X3ZpZGVvX3N0ZXJlbzNkIFN0ZXJlbzNEIHR5cGVzIGFuZCBmdW5jdGlvbnMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAYWRkdG9ncm91cCBsYXZ1X3ZpZGVvX3N0ZXJlbzNkCisgKiBBIHN0ZXJlb3Njb3BpYyB2aWRlbyBmaWxlIGNvbnNpc3RzIGluIG11bHRpcGxlIHZpZXdzIGVtYmVkZGVkIGluIGEgc2luZ2xlCisgKiBmcmFtZSwgdXN1YWxseSBkZXNjcmliaW5nIHR3byB2aWV3cyBvZiBhIHNjZW5lLiBUaGlzIGZpbGUgZGVzY3JpYmVzIGFsbAorICogcG9zc2libGUgY29kZWMtaW5kZXBlbmRlbnQgdmlldyBhcnJhbmdlbWVudHMuCisgKiAqLworCisvKioKICAqIExpc3Qgb2YgcG9zc2libGUgM0QgVHlwZXMKICAqLwogZW51bSBBVlN0ZXJlbzNEVHlwZSB7CkBAIC0zNyw0MSArNTcsNDkgQEAKICAgICAvKioKICAgICAgKiBWaWV3cyBhcmUgbmV4dCB0byBlYWNoIG90aGVyLgogICAgICAqCisgICAgICogQGNvZGV7LnVucGFyc2VkfQogICAgICAqICAgIExMTExSUlJSCiAgICAgICogICAgTExMTFJSUlIKICAgICAgKiAgICBMTExMUlJSUgogICAgICAqICAgIC4uLgorICAgICAqIEBlbmRjb2RlCiAgICAgICovCiAgICAgQVZfU1RFUkVPM0RfU0lERUJZU0lERSwKIAogICAgIC8qKgogICAgICAqIFZpZXdzIGFyZSBvbiB0b3Agb2YgZWFjaCBvdGhlci4KICAgICAgKgorICAgICAqIEBjb2Rley51bnBhcnNlZH0KICAgICAgKiAgICBMTExMTExMTAogICAgICAqICAgIExMTExMTExMCiAgICAgICogICAgUlJSUlJSUlIKICAgICAgKiAgICBSUlJSUlJSUgorICAgICAqIEBlbmRjb2RlCiAgICAgICovCiAgICAgQVZfU1RFUkVPM0RfVE9QQk9UVE9NLAogCiAgICAgLyoqCiAgICAgICogVmlld3MgYXJlIGFsdGVybmF0ZWQgdGVtcG9yYWxseS4KICAgICAgKgorICAgICAqIEBjb2Rley51bnBhcnNlZH0KICAgICAgKiAgICAgZnJhbWUwICAgZnJhbWUxICAgZnJhbWUyICAgLi4uCiAgICAgICogICAgTExMTExMTEwgUlJSUlJSUlIgTExMTExMTEwKICAgICAgKiAgICBMTExMTExMTCBSUlJSUlJSUiBMTExMTExMTAogICAgICAqICAgIExMTExMTExMIFJSUlJSUlJSIExMTExMTExMCiAgICAgICogICAgLi4uICAgICAgLi4uICAgICAgLi4uCisgICAgICogQGVuZGNvZGUKICAgICAgKi8KICAgICBBVl9TVEVSRU8zRF9GUkFNRVNFUVVFTkNFLAogCiAgICAgLyoqCiAgICAgICogVmlld3MgYXJlIHBhY2tlZCBpbiBhIGNoZWNrZXJib2FyZC1saWtlIHN0cnVjdHVyZSBwZXIgcGl4ZWwuCiAgICAgICoKKyAgICAgKiBAY29kZXsudW5wYXJzZWR9CiAgICAgICogICAgTFJMUkxSTFIKICAgICAgKiAgICBSTFJMUkxSTAogICAgICAqICAgIExSTFJMUkxSCiAgICAgICogICAgLi4uCisgICAgICogQGVuZGNvZGUKICAgICAgKi8KICAgICBBVl9TVEVSRU8zRF9DSEVDS0VSQk9BUkQsCiAKQEAgLTc5LDM0ICsxMDcsNTkgQEAKICAgICAgKiBWaWV3cyBhcmUgbmV4dCB0byBlYWNoIG90aGVyLCBidXQgd2hlbiB1cHNjYWxpbmcKICAgICAgKiBhcHBseSBhIGNoZWNrZXJib2FyZCBwYXR0ZXJuLgogICAgICAqCisgICAgICogQGNvZGV7LnVucGFyc2VkfQogICAgICAqICAgICBMTExMUlJSUiAgICAgICAgICBMIEwgTCBMICAgIFIgUiBSIFIKICAgICAgKiAgICAgTExMTFJSUlIgICAgPT4gICAgIEwgTCBMIEwgIFIgUiBSIFIKICAgICAgKiAgICAgTExMTFJSUlIgICAgICAgICAgTCBMIEwgTCAgICBSIFIgUiBSCiAgICAgICogICAgIExMTExSUlJSICAgICAgICAgICBMIEwgTCBMICBSIFIgUiBSCisgICAgICogQGVuZGNvZGUKICAgICAgKi8KICAgICBBVl9TVEVSRU8zRF9TSURFQllTSURFX1FVSU5DVU5YLAogCiAgICAgLyoqCiAgICAgICogVmlld3MgYXJlIHBhY2tlZCBwZXIgbGluZSwgYXMgaWYgaW50ZXJsYWNlZC4KICAgICAgKgorICAgICAqIEBjb2Rley51bnBhcnNlZH0KICAgICAgKiAgICBMTExMTExMTAogICAgICAqICAgIFJSUlJSUlJSCiAgICAgICogICAgTExMTExMTEwKICAgICAgKiAgICAuLi4KKyAgICAgKiBAZW5kY29kZQogICAgICAqLwogICAgIEFWX1NURVJFTzNEX0xJTkVTLAogCiAgICAgLyoqCiAgICAgICogVmlld3MgYXJlIHBhY2tlZCBwZXIgY29sdW1uLgogICAgICAqCisgICAgICogQGNvZGV7LnVucGFyc2VkfQogICAgICAqICAgIExSTFJMUkxSCiAgICAgICogICAgTFJMUkxSTFIKICAgICAgKiAgICBMUkxSTFJMUgogICAgICAqICAgIC4uLgorICAgICAqIEBlbmRjb2RlCiAgICAgICovCiAgICAgQVZfU1RFUkVPM0RfQ09MVU1OUywKIH07CiAKKy8qKgorICogTGlzdCBvZiBwb3NzaWJsZSB2aWV3IHR5cGVzLgorICovCitlbnVtIEFWU3RlcmVvM0RWaWV3IHsKKyAgICAvKioKKyAgICAgKiBGcmFtZSBjb250YWlucyB0d28gcGFja2VkIHZpZXdzLgorICAgICAqLworICAgIEFWX1NURVJFTzNEX1ZJRVdfUEFDS0VELAorCisgICAgLyoqCisgICAgICogRnJhbWUgY29udGFpbnMgb25seSB0aGUgbGVmdCB2aWV3LgorICAgICAqLworICAgIEFWX1NURVJFTzNEX1ZJRVdfTEVGVCwKKworICAgIC8qKgorICAgICAqIEZyYW1lIGNvbnRhaW5zIG9ubHkgdGhlIHJpZ2h0IHZpZXcuCisgICAgICovCisgICAgQVZfU1RFUkVPM0RfVklFV19SSUdIVCwKK307CiAKIC8qKgogICogSW52ZXJ0ZWQgdmlld3MsIFJpZ2h0L0JvdHRvbSByZXByZXNlbnRzIHRoZSBsZWZ0IHZpZXcuCkBAIC0xMzAsNiArMTgzLDExIEBACiAgICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZnJhbWUgcGFja2luZy4KICAgICAgKi8KICAgICBpbnQgZmxhZ3M7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoaWNoIHZpZXdzIGFyZSBwYWNrZWQuCisgICAgICovCisgICAgZW51bSBBVlN0ZXJlbzNEVmlldyB2aWV3OwogfSBBVlN0ZXJlbzNEOwogCiAvKioKQEAgLTE0OSw0ICsyMDcsMjcgQEAKICAqLwogQVZTdGVyZW8zRCAqYXZfc3RlcmVvM2RfY3JlYXRlX3NpZGVfZGF0YShBVkZyYW1lICpmcmFtZSk7CiAKKy8qKgorICogUHJvdmlkZSBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgYSBnaXZlbiBzdGVyZW8zZCB0eXBlLgorICoKKyAqIEBwYXJhbSB0eXBlIFRoZSBpbnB1dCBzdGVyZW8zZCB0eXBlIHZhbHVlLgorICoKKyAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIHN0ZXJlbzNkIHZhbHVlLCBvciAidW5rbm93biIuCisgKi8KK2NvbnN0IGNoYXIgKmF2X3N0ZXJlbzNkX3R5cGVfbmFtZSh1bnNpZ25lZCBpbnQgdHlwZSk7CisKKy8qKgorICogR2V0IHRoZSBBVlN0ZXJlbzNEVHlwZSBmb3JtIGEgaHVtYW4tcmVhZGFibGUgbmFtZS4KKyAqCisgKiBAcGFyYW0gbmFtZSBUaGUgaW5wdXQgc3RyaW5nLgorICoKKyAqIEByZXR1cm4gVGhlIEFWU3RlcmVvM0RUeXBlIHZhbHVlLCBvciAtMSBpZiBub3QgZm91bmQuCisgKi8KK2ludCBhdl9zdGVyZW8zZF9mcm9tX25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisKKy8qKgorICogQH0KKyAqIEB9CisgKi8KKwogI2VuZGlmIC8qIEFWVVRJTF9TVEVSRU8zRF9IICovCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVhLmMgYi9saWJhdnV0aWwvdGVhLmMKaW5kZXggYmY3NjcxOC4uYjEzOGY4YiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3RlYS5jCisrKyBiL2xpYmF2dXRpbC90ZWEuYwpAQCAtMTE5LDk1ICsxMTksMyBAQAogICAgICAgICB9CiAgICAgfQogfQotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgVEVBX05VTV9URVNUUyA0Ci0KLS8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2dhbmRyZXdzL1RlYUNyeXB0L2Jsb2IvbWFzdGVyL3RlYS90ZWFfdGVzdC5nbwotc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVhX3Rlc3Rfa2V5W1RFQV9OVU1fVEVTVFNdWzE2XSA9IHsKLSAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi0gICAgfSwKLSAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCi0gICAgfSwKLSAgICB7IDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsCi0gICAgICAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweERELCAweEVFLCAweEZGCi0gICAgfSwKLSAgICB7IDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4NzcsCi0gICAgICAweDg4LCAweDk5LCAweEFBLCAweEJCLCAweENDLCAweERELCAweEVFLCAweEZGCi0gICAgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgdGVhX3Rlc3RfcHRbVEVBX05VTV9URVNUU11bOF0gPSB7Ci0gICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgeyAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4IH0sCi0gICAgeyAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4IH0sCi0gICAgeyAweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweEFCLCAweENELCAweEVGIH0KLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHRlYV90ZXN0X2N0W1RFQV9OVU1fVEVTVFNdWzhdID0gewotICAgIHsgMHg0MSwgMHhFQSwgMHgzQSwgMHgwQSwgMHg5NCwgMHhCQSwgMHhBOSwgMHg0MCB9LAotICAgIHsgMHg2QSwgMHgyRiwgMHg5QywgMHhGMywgMHhGQywgMHhDRiwgMHgzQywgMHg1NSB9LAotICAgIHsgMHhERSwgMHhCMSwgMHhDMCwgMHhBMiwgMHg3RSwgMHg3NCwgMHg1RCwgMHhCMyB9LAotICAgIHsgMHgxMiwgMHg2QywgMHg2QiwgMHg5MiwgMHhDMCwgMHg2NSwgMHgzQSwgMHgzRSB9Ci19OwotCi1zdGF0aWMgdm9pZCB0ZXN0X3RlYShBVlRFQSAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlZiwgaW50IGxlbiwgdWludDhfdCAqaXYsIGludCBkaXIsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXN0KQotewotICAgIGF2X3RlYV9jcnlwdChjdHgsIGRzdCwgc3JjLCBsZW4sIGl2LCBkaXIpOwotICAgIGlmIChtZW1jbXAoZHN0LCByZWYsIDgqbGVuKSkgewotICAgICAgICBpbnQgaTsKLSAgICAgICAgcHJpbnRmKCIlcyBmYWlsZWRcbmdvdCAgICAgICIsIHRlc3QpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCpsZW47IGkrKykKLSAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBkc3RbaV0pOwotICAgICAgICBwcmludGYoIlxuZXhwZWN0ZWQgIik7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4KmxlbjsgaSsrKQotICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIHJlZltpXSk7Ci0gICAgICAgIHByaW50ZigiXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLWludCBtYWluKHZvaWQpCi17Ci0gICAgQVZURUEgKmN0eDsKLSAgICB1aW50OF90IGJ1Zls4XSwgaXZbOF07Ci0gICAgaW50IGk7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3JjWzMyXSA9ICJIZWxsb1dvcmxkSGVsbG9Xb3JsZEhlbGxvV29ybGQiOwotICAgIHVpbnQ4X3QgY3RbMzJdOwotICAgIHVpbnQ4X3QgcGxbMzJdOwotCi0gICAgY3R4ID0gYXZfdGVhX2FsbG9jKCk7Ci0gICAgaWYgKCFjdHgpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgZm9yIChpID0gMDsgaSA8IFRFQV9OVU1fVEVTVFM7IGkrKykgewotICAgICAgICBhdl90ZWFfaW5pdChjdHgsIHRlYV90ZXN0X2tleVtpXSwgNjQpOwotCi0gICAgICAgIHRlc3RfdGVhKGN0eCwgYnVmLCB0ZWFfdGVzdF9wdFtpXSwgdGVhX3Rlc3RfY3RbaV0sIDEsIE5VTEwsIDAsICJlbmNyeXB0aW9uIik7Ci0gICAgICAgIHRlc3RfdGVhKGN0eCwgYnVmLCB0ZWFfdGVzdF9jdFtpXSwgdGVhX3Rlc3RfcHRbaV0sIDEsIE5VTEwsIDEsICJkZWNyeXB0aW9uIik7Ci0KLSAgICAgICAgLyogZW5jcnlwdCAqLwotICAgICAgICBtZW1jcHkoaXYsICJIQUxMTzEyMyIsIDgpOwotICAgICAgICBhdl90ZWFfY3J5cHQoY3R4LCBjdCwgc3JjLCA0LCBpdiwgMCk7Ci0KLSAgICAgICAgLyogZGVjcnlwdCBpbnRvIHBsICovCi0gICAgICAgIG1lbWNweShpdiwgIkhBTExPMTIzIiwgOCk7Ci0gICAgICAgIHRlc3RfdGVhKGN0eCwgcGwsIGN0LCBzcmMsIDQsIGl2LCAxLCAiQ0JDIGRlY3J5cHRpb24iKTsKLQotICAgICAgICBtZW1jcHkoaXYsICJIQUxMTzEyMyIsIDgpOwotICAgICAgICB0ZXN0X3RlYShjdHgsIGN0LCBjdCwgc3JjLCA0LCBpdiwgMSwgIkNCQyBpbnBsYWNlIGRlY3J5cHRpb24iKTsKLSAgICB9Ci0KLSAgICBwcmludGYoIlRlc3QgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHN1Y2Nlc3MuXG4iKTsKLSAgICBhdl9mcmVlKGN0eCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvYWRsZXIzMi5jIGIvbGliYXZ1dGlsL3Rlc3RzL2FkbGVyMzIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Y3NjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL2FkbGVyMzIuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKy8vIExDT1ZfRVhDTF9TVEFSVAorCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWRsZXIzMi5oIgorCisjZGVmaW5lIExFTiA3MDAxCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY2hlY2tzdW07CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaTsKKyAgICB1aW50OF90IGRhdGFbTEVOXTsKKworICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMRU47IGkrKykKKyAgICAgICAgZGF0YVtpXSA9ICgoaSAqIGkpID4+IDMpICsgMTIzICogaTsKKworICAgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItdCIpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgICAgICAgIFNUQVJUX1RJTUVSOworICAgICAgICAgICAgY2hlY2tzdW0gPSBhdl9hZGxlcjMyX3VwZGF0ZSgxLCBkYXRhLCBMRU4pOworICAgICAgICAgICAgU1RPUF9USU1FUigiYWRsZXIiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNoZWNrc3VtID0gYXZfYWRsZXIzMl91cGRhdGUoMSwgZGF0YSwgTEVOKTsKKyAgICB9CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiJVggKGV4cGVjdGVkIDUwRTZFNTA4KVxuIiwgY2hlY2tzdW0pOworICAgIHJldHVybiBjaGVja3N1bSA9PSAweDUwZTZlNTA4ID8gMCA6IDE7Cit9CisvLyBMQ09WX0VYQ0xfU1RPUApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL2Flcy5jIGIvbGliYXZ1dGlsL3Rlc3RzL2Flcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Zjg0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvYWVzLmMKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLy8gTENPVl9FWENMX1NUQVJUCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Flcy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IGksIGo7CisgICAgc3RydWN0IEFWQUVTICpiOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHJrZXlbMl1bMTZdID0geworICAgICAgICB7IDAgfSwKKyAgICAgICAgeyAweDEwLCAweGE1LCAweDg4LCAweDY5LCAweGQ3LCAweDRiLCAweGU1LCAweGEzLAorICAgICAgICAgIDB4NzQsIDB4Y2YsIDB4ODYsIDB4N2MsIDB4ZmIsIDB4NDcsIDB4MzgsIDB4NTkgfQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgcnB0WzJdWzE2XSA9IHsKKyAgICAgICAgeyAweDZhLCAweDg0LCAweDg2LCAweDdjLCAweGQ3LCAweDdlLCAweDEyLCAweGFkLAorICAgICAgICAgIDB4MDcsIDB4ZWEsIDB4MWIsIDB4ZTgsIDB4OTUsIDB4YzUsIDB4M2YsIDB4YTMgfSwKKyAgICAgICAgeyAwIH0KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHJjdFsyXVsxNl0gPSB7CisgICAgICAgIHsgMHg3MywgMHgyMiwgMHg4MSwgMHhjMCwgMHhhMCwgMHhhYSwgMHhiOCwgMHhmNywKKyAgICAgICAgICAweGE1LCAweDRhLCAweDBjLCAweDY3LCAweGEwLCAweGM0LCAweDVlLCAweGNmIH0sCisgICAgICAgIHsgMHg2ZCwgMHgyNSwgMHgxZSwgMHg2OSwgMHg0NCwgMHhiMCwgMHg1MSwgMHhlMCwKKyAgICAgICAgICAweDRlLCAweGFhLCAweDZmLCAweGI0LCAweGRiLCAweGY3LCAweDg0LCAweDY1IH0KKyAgICB9OworICAgIHVpbnQ4X3QgcHRbMzJdOworICAgIHVpbnQ4X3QgdGVtcFszMl07CisgICAgdWludDhfdCBpdlsyXVsxNl07CisgICAgaW50IGVyciA9IDA7CisKKyAgICBiID0gYXZfYWVzX2FsbG9jKCk7CisgICAgaWYgKCFiKQorICAgICAgICByZXR1cm4gMTsKKworICAgIGF2X2xvZ19zZXRfbGV2ZWwoQVZfTE9HX0RFQlVHKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgYXZfYWVzX2luaXQoYiwgcmtleVtpXSwgMTI4LCAxKTsKKyAgICAgICAgYXZfYWVzX2NyeXB0KGIsIHRlbXAsIHJjdFtpXSwgMSwgTlVMTCwgMSk7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgICAgICBpZiAocnB0W2ldW2pdICE9IHRlbXBbal0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyWCAlMDJYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBqLCBycHRbaV1bal0sIHRlbXBbal0pOworICAgICAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZShiKTsKKworICAgIGlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItdCIpKSB7CisgICAgICAgIHN0cnVjdCBBVkFFUyAqYWUsICphZDsKKyAgICAgICAgQVZMRkcgcHJuZzsKKworICAgICAgICBhZSA9IGF2X2Flc19hbGxvYygpOworICAgICAgICBhZCA9IGF2X2Flc19hbGxvYygpOworCisgICAgICAgIGlmICghYWUgfHwgIWFkKSB7CisgICAgICAgICAgICBhdl9mcmVlKGFlKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoYWQpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBhdl9hZXNfaW5pdChhZSwgKGNvbnN0IHVpbnQ4X3QqKSJQST0zLjE0MTU5MjY1NC4uIiwgMTI4LCAwKTsKKyAgICAgICAgYXZfYWVzX2luaXQoYWQsIChjb25zdCB1aW50OF90KikiUEk9My4xNDE1OTI2NTQuLiIsIDEyOCwgMSk7CisgICAgICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDMyOyBqKyspCisgICAgICAgICAgICAgICAgcHRbal0gPSBhdl9sZmdfZ2V0KCZwcm5nKTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorICAgICAgICAgICAgICAgIGl2WzBdW2pdID0gaXZbMV1bal0gPSBhdl9sZmdfZ2V0KCZwcm5nKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTVEFSVF9USU1FUjsKKyAgICAgICAgICAgICAgICBhdl9hZXNfY3J5cHQoYWUsIHRlbXAsIHB0LCAyLCBpdlswXSwgMCk7CisgICAgICAgICAgICAgICAgaWYgKCEoaSAmIChpIC0gMSkpKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbMF0sIHRlbXBbNV0sIHRlbXBbMTBdLCB0ZW1wWzE1XSk7CisgICAgICAgICAgICAgICAgYXZfYWVzX2NyeXB0KGFkLCB0ZW1wLCB0ZW1wLCAyLCBpdlsxXSwgMSk7CisgICAgICAgICAgICAgICAgYXZfYWVzX2NyeXB0KGFlLCB0ZW1wLCBwdCwgMiwgTlVMTCwgMCk7CisgICAgICAgICAgICAgICAgaWYgKCEoaSAmIChpIC0gMSkpKQorICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJTAyWCAlMDJYICUwMlggJTAyWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBbMF0sIHRlbXBbNV0sIHRlbXBbMTBdLCB0ZW1wWzE1XSk7CisgICAgICAgICAgICAgICAgYXZfYWVzX2NyeXB0KGFkLCB0ZW1wLCB0ZW1wLCAyLCBOVUxMLCAxKTsKKyAgICAgICAgICAgICAgICBTVE9QX1RJTUVSKCJhZXMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKHB0W2pdICE9IHRlbXBbal0pIHsKKyAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICVkICUwMlggJTAyWFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIHB0W2pdLCB0ZW1wW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXZfZnJlZShhZSk7CisgICAgICAgIGF2X2ZyZWUoYWQpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorLy8gTENPVl9FWENMX1NUT1AKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9hZXNfY3RyLmMgYi9saWJhdnV0aWwvdGVzdHMvYWVzX2N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZmRiMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvYWVzX2N0ci5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Flc19jdHIuaCIKKworc3RhdGljIGNvbnN0IERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCBwbGFpbilbXSA9IHsKKyAgICAweDZkLCAweDZmLCAweDczLCAweDc0LCAweDIwLCAweDcyLCAweDYxLCAweDZlLCAweDY0LCAweDZmLCAweDZkCit9Oworc3RhdGljIERFQ0xBUkVfQUxJR05FRCg4LCB1aW50OF90LCB0bXApWzExXTsKKworaW50IG1haW4gKHZvaWQpCit7CisgICAgaW50IHJldCA9IDE7CisgICAgc3RydWN0IEFWQUVTQ1RSICphZSwgKmFkOworICAgIGNvbnN0IHVpbnQ4X3QgKml2OworCisgICAgYWUgPSBhdl9hZXNfY3RyX2FsbG9jKCk7CisgICAgYWQgPSBhdl9hZXNfY3RyX2FsbG9jKCk7CisKKyAgICBpZiAoIWFlIHx8ICFhZCkKKyAgICAgICAgZ290byBFUlJPUjsKKworICAgIGlmIChhdl9hZXNfY3RyX2luaXQoYWUsIChjb25zdCB1aW50OF90KikiMDEyMzQ1Njc4OWFiY2RlZiIpIDwgMCkKKyAgICAgICAgZ290byBFUlJPUjsKKworICAgIGlmIChhdl9hZXNfY3RyX2luaXQoYWQsIChjb25zdCB1aW50OF90KikiMDEyMzQ1Njc4OWFiY2RlZiIpIDwgMCkKKyAgICAgICAgZ290byBFUlJPUjsKKworICAgIGF2X2Flc19jdHJfc2V0X3JhbmRvbV9pdihhZSk7CisgICAgaXYgPSAgIGF2X2Flc19jdHJfZ2V0X2l2KGFlKTsKKyAgICBhdl9hZXNfY3RyX3NldF9mdWxsX2l2KGFkLCBpdik7CisKKyAgICBhdl9hZXNfY3RyX2NyeXB0KGFlLCB0bXAsIHBsYWluLCBzaXplb2YodG1wKSk7CisgICAgYXZfYWVzX2N0cl9jcnlwdChhZCwgdG1wLCB0bXAsICAgc2l6ZW9mKHRtcCkpOworCisgICAgaWYgKG1lbWNtcCh0bXAsIHBsYWluLCBzaXplb2YodG1wKSkgIT0gMCl7CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJ0ZXN0IGZhaWxlZFxuIik7CisgICAgICAgIGdvdG8gRVJST1I7CisgICAgfQorCisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAidGVzdCBwYXNzZWRcbiIpOworICAgIHJldCA9IDA7CisKK0VSUk9SOgorICAgIGF2X2Flc19jdHJfZnJlZShhZSk7CisgICAgYXZfYWVzX2N0cl9mcmVlKGFkKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL2F1ZGlvX2ZpZm8uYyBiL2xpYmF2dXRpbC90ZXN0cy9hdWRpb19maWZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEwNzE2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9hdWRpb19maWZvLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F1ZGlvX2ZpZm8uYyIKKworI2RlZmluZSBNQVhfQ0hBTk5FTFMgICAgMzIKKworCit0eXBlZGVmIHN0cnVjdCBUZXN0U3RydWN0IHsKKyAgICBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZvcm1hdDsKKyAgICBjb25zdCBpbnQgbmJfY2g7CisgICAgdm9pZCBjb25zdCAqZGF0YV9wbGFuZXNbTUFYX0NIQU5ORUxTXTsKKyAgICBjb25zdCBpbnQgbmJfc2FtcGxlc19wY2g7Cit9IFRlc3RTdHJ1Y3Q7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGRhdGFfVTggW10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGRhdGFfUzE2W10gPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExICAgICAgICAgICAgICAgICAgICAgICAgfTsKK3N0YXRpYyBjb25zdCBmbG9hdCAgIGRhdGFfRkxUW10gPSB7MC4wLCAxLjAsIDIuMCwgMy4wLCA0LjAsIDUuMCwgNi4wLCA3LjAsIDguMCwgOS4wLCAxMC4wLCAxMS4wfTsKKworc3RhdGljIGNvbnN0IFRlc3RTdHJ1Y3QgdGVzdF9zdHJ1Y3RbXSA9IHsKKyAgICB7LmZvcm1hdCA9IEFWX1NBTVBMRV9GTVRfVTggICAsIC5uYl9jaCA9IDEsIC5kYXRhX3BsYW5lcyA9IHtkYXRhX1U4ICwgICAgICAgICAgICAgfSwgLm5iX3NhbXBsZXNfcGNoID0gMTJ9LAorICAgIHsuZm9ybWF0ID0gQVZfU0FNUExFX0ZNVF9VOFAgICwgLm5iX2NoID0gMiwgLmRhdGFfcGxhbmVzID0ge2RhdGFfVTggLCBkYXRhX1U4ICs2LCB9LCAubmJfc2FtcGxlc19wY2ggPSA2IH0sCisgICAgey5mb3JtYXQgPSBBVl9TQU1QTEVfRk1UX1MxNiAgLCAubmJfY2ggPSAxLCAuZGF0YV9wbGFuZXMgPSB7ZGF0YV9TMTYsICAgICAgICAgICAgIH0sIC5uYl9zYW1wbGVzX3BjaCA9IDEyfSwKKyAgICB7LmZvcm1hdCA9IEFWX1NBTVBMRV9GTVRfUzE2UCAsIC5uYl9jaCA9IDIsIC5kYXRhX3BsYW5lcyA9IHtkYXRhX1MxNiwgZGF0YV9TMTYrNiwgfSwgLm5iX3NhbXBsZXNfcGNoID0gNiB9LAorICAgIHsuZm9ybWF0ID0gQVZfU0FNUExFX0ZNVF9GTFQgICwgLm5iX2NoID0gMSwgLmRhdGFfcGxhbmVzID0ge2RhdGFfRkxULCAgICAgICAgICAgICB9LCAubmJfc2FtcGxlc19wY2ggPSAxMn0sCisgICAgey5mb3JtYXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFAgLCAubmJfY2ggPSAyLCAuZGF0YV9wbGFuZXMgPSB7ZGF0YV9GTFQsIGRhdGFfRkxUKzYsIH0sIC5uYl9zYW1wbGVzX3BjaCA9IDYgfQorfTsKKworc3RhdGljIHZvaWQgZnJlZV9kYXRhX3BsYW5lcyhBVkF1ZGlvRmlmbyAqYWZpZm8sIHZvaWQgKipvdXRwdXRfZGF0YSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWZpZm8tPm5iX2J1ZmZlcnM7ICsraSl7CisgICAgICAgIGF2X2ZyZWVwKCZvdXRwdXRfZGF0YVtpXSk7CisgICAgfQorICAgIGF2X2ZyZWVwKCZvdXRwdXRfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIEVSUk9SKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBzdHIpOworICAgIGV4aXQoMSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2F1ZGlvX2J5dGVzKGNvbnN0IFRlc3RTdHJ1Y3QgKnRlc3Rfc2FtcGxlLCB2b2lkICoqZGF0YV9wbGFuZXMsIGludCBuYl9zYW1wbGVzKQoreworICAgIGludCBwLCBiLCBmOworICAgIGludCBieXRlX29mZnNldCAgICAgID0gYXZfZ2V0X2J5dGVzX3Blcl9zYW1wbGUodGVzdF9zYW1wbGUtPmZvcm1hdCk7CisgICAgaW50IGJ1ZmZlcnMgICAgICAgICAgPSBhdl9zYW1wbGVfZm10X2lzX3BsYW5hcih0ZXN0X3NhbXBsZS0+Zm9ybWF0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRlc3Rfc2FtcGxlLT5uYl9jaCA6IDE7CisgICAgaW50IGxpbmVfc2l6ZSAgICAgICAgPSAoYnVmZmVycyA+IDEpID8gbmJfc2FtcGxlcyAqIGJ5dGVfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmJfc2FtcGxlcyAqIGJ5dGVfb2Zmc2V0ICogdGVzdF9zYW1wbGUtPm5iX2NoOworICAgIGZvciAocCA9IDA7IHAgPCBidWZmZXJzOyArK3ApeworICAgICAgICBmb3IoYiA9IDA7IGIgPCBsaW5lX3NpemU7IGIrPWJ5dGVfb2Zmc2V0KXsKKyAgICAgICAgICAgIGZvciAoZiA9IDA7IGYgPCBieXRlX29mZnNldDsgZisrKXsKKyAgICAgICAgICAgICAgICBpbnQgb3JkZXIgPSAhSEFWRV9CSUdFTkRJQU4gPyAoYnl0ZV9vZmZzZXQgLSBmIC0gMSkgOiBmOworICAgICAgICAgICAgICAgIHByaW50ZigiJTAyeCIsICooKHVpbnQ4X3QqKWRhdGFfcGxhbmVzW3BdICsgYiArIG9yZGVyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXRjaGFyKCcgJyk7CisgICAgICAgIH0KKyAgICAgICAgcHV0Y2hhcignXG4nKTsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9zYW1wbGVzX2Zyb21fYXVkaW9fZmlmbyhBVkF1ZGlvRmlmbyogYWZpZm8sIHZvaWQgKioqb3V0cHV0LCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc2FtcGxlcyAgICAgICAgPSBGRk1JTihuYl9zYW1wbGVzLCBhZmlmby0+bmJfc2FtcGxlcyk7CisgICAgaW50IHRvdF9lbGVtZW50cyAgID0gIWF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGFmaWZvLT5zYW1wbGVfZm10KQorICAgICAgICAgICAgICAgICAgICAgICAgID8gc2FtcGxlcyA6IGFmaWZvLT5jaGFubmVscyAqIHNhbXBsZXM7CisgICAgdm9pZCAqKmRhdGFfcGxhbmVzID0gYXZfbWFsbG9jX2FycmF5KGFmaWZvLT5uYl9idWZmZXJzLCBzaXplb2Yodm9pZCopKTsKKyAgICBpZiAoIWRhdGFfcGxhbmVzKQorICAgICAgICBFUlJPUigiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSEiKTsKKyAgICBpZiAoKm91dHB1dCkKKyAgICAgICAgZnJlZV9kYXRhX3BsYW5lcyhhZmlmbywgKm91dHB1dCk7CisgICAgKm91dHB1dCAgICAgICAgICAgID0gZGF0YV9wbGFuZXM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgYWZpZm8tPm5iX2J1ZmZlcnM7ICsraSl7CisgICAgICAgIGRhdGFfcGxhbmVzW2ldID0gYXZfbWFsbG9jX2FycmF5KHRvdF9lbGVtZW50cywgYWZpZm8tPnNhbXBsZV9zaXplKTsKKyAgICAgICAgaWYgKCFkYXRhX3BsYW5lc1tpXSkKKyAgICAgICAgICAgIEVSUk9SKCJmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5ISIpOworICAgIH0KKworICAgIHJldHVybiBhdl9hdWRpb19maWZvX3JlYWQoYWZpZm8sICpvdXRwdXQsIG5iX3NhbXBsZXMpOworfQorCitzdGF0aWMgaW50IHdyaXRlX3NhbXBsZXNfdG9fYXVkaW9fZmlmbyhBVkF1ZGlvRmlmbyogYWZpZm8sIGNvbnN0IFRlc3RTdHJ1Y3QgKnRlc3Rfc2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5iX3NhbXBsZXMsIGludCBvZmZzZXQpCit7CisgICAgaW50IG9mZnNldF9zaXplLCBpOworICAgIHZvaWQgKmRhdGFfcGxhbmVzW01BWF9DSEFOTkVMU107CisKKyAgICBpZihuYl9zYW1wbGVzID4gdGVzdF9zYW1wbGUtPm5iX3NhbXBsZXNfcGNoIC0gb2Zmc2V0KXsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmKG9mZnNldCA+PSB0ZXN0X3NhbXBsZS0+bmJfc2FtcGxlc19wY2gpeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2Zmc2V0X3NpemUgID0gb2Zmc2V0ICogYWZpZm8tPnNhbXBsZV9zaXplOworCisgICAgZm9yIChpID0gMDsgaSA8IGFmaWZvLT5uYl9idWZmZXJzIDsgKytpKXsKKyAgICAgICAgZGF0YV9wbGFuZXNbaV0gPSAodWludDhfdCopdGVzdF9zYW1wbGUtPmRhdGFfcGxhbmVzW2ldICsgb2Zmc2V0X3NpemU7CisgICAgfQorCisgICAgcmV0dXJuIGF2X2F1ZGlvX2ZpZm9fd3JpdGUoYWZpZm8sIGRhdGFfcGxhbmVzLCBuYl9zYW1wbGVzKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9mdW5jdGlvbihjb25zdCBUZXN0U3RydWN0ICp0ZXN0X3NhbXBsZSkKK3sKKyAgICBpbnQgcmV0LCBpOworICAgIHZvaWQgKipvdXRwdXRfZGF0YSAgPSBOVUxMOworICAgIEFWQXVkaW9GaWZvICphZmlmbyAgPSBhdl9hdWRpb19maWZvX2FsbG9jKHRlc3Rfc2FtcGxlLT5mb3JtYXQsIHRlc3Rfc2FtcGxlLT5uYl9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zYW1wbGUtPm5iX3NhbXBsZXNfcGNoKTsKKyAgICBpZiAoIWFmaWZvKSB7CisgICAgICAgIEVSUk9SKCJFUlJPUjogYXZfYXVkaW9fZmlmb19hbGxvYyByZXR1cm5lZCBOVUxMISIpOworICAgIH0KKyAgICByZXQgPSB3cml0ZV9zYW1wbGVzX3RvX2F1ZGlvX2ZpZm8oYWZpZm8sIHRlc3Rfc2FtcGxlLCB0ZXN0X3NhbXBsZS0+bmJfc2FtcGxlc19wY2gsIDApOworICAgIGlmIChyZXQgPCAwKXsKKyAgICAgICAgRVJST1IoIkVSUk9SOiBhdl9hdWRpb19maWZvX3dyaXRlIGZhaWxlZCEiKTsKKyAgICB9CisgICAgcHJpbnRmKCJ3cml0dGVuOiAlZFxuIiwgcmV0KTsKKworICAgIHJldCA9IHdyaXRlX3NhbXBsZXNfdG9fYXVkaW9fZmlmbyhhZmlmbywgdGVzdF9zYW1wbGUsIHRlc3Rfc2FtcGxlLT5uYl9zYW1wbGVzX3BjaCwgMCk7CisgICAgaWYgKHJldCA8IDApeworICAgICAgICBFUlJPUigiRVJST1I6IGF2X2F1ZGlvX2ZpZm9fd3JpdGUgZmFpbGVkISIpOworICAgIH0KKyAgICBwcmludGYoIndyaXR0ZW46ICVkXG4iLCByZXQpOworICAgIHByaW50ZigicmVtYWluaW5nIHNhbXBsZXMgaW4gYXVkaW9fZmlmbzogJWRcblxuIiwgYXZfYXVkaW9fZmlmb19zaXplKGFmaWZvKSk7CisKKyAgICByZXQgPSByZWFkX3NhbXBsZXNfZnJvbV9hdWRpb19maWZvKGFmaWZvLCAmb3V0cHV0X2RhdGEsIHRlc3Rfc2FtcGxlLT5uYl9zYW1wbGVzX3BjaCk7CisgICAgaWYgKHJldCA8IDApeworICAgICAgICBFUlJPUigiRVJST1I6IGF2X2F1ZGlvX2ZpZm9fcmVhZCBmYWlsZWQhIik7CisgICAgfQorICAgIHByaW50ZigicmVhZDogJWRcbiIsIHJldCk7CisgICAgcHJpbnRfYXVkaW9fYnl0ZXModGVzdF9zYW1wbGUsIG91dHB1dF9kYXRhLCByZXQpOworICAgIHByaW50ZigicmVtYWluaW5nIHNhbXBsZXMgaW4gYXVkaW9fZmlmbzogJWRcblxuIiwgYXZfYXVkaW9fZmlmb19zaXplKGFmaWZvKSk7CisKKyAgICAvKiB0ZXN0IGF2X2F1ZGlvX2ZpZm9fcGVlayAqLworICAgIHJldCA9IGF2X2F1ZGlvX2ZpZm9fcGVlayhhZmlmbywgb3V0cHV0X2RhdGEsIGFmaWZvLT5uYl9zYW1wbGVzKTsKKyAgICBpZiAocmV0IDwgMCl7CisgICAgICAgIEVSUk9SKCJFUlJPUjogYXZfYXVkaW9fZmlmb19wZWVrIGZhaWxlZCEiKTsKKyAgICB9CisgICAgcHJpbnRmKCJwZWVrOlxuIik7CisgICAgcHJpbnRfYXVkaW9fYnl0ZXModGVzdF9zYW1wbGUsIG91dHB1dF9kYXRhLCByZXQpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIC8qIHRlc3QgYXZfYXVkaW9fZmlmb19wZWVrX2F0ICovCisgICAgcHJpbnRmKCJwZWVrX2F0OlxuIik7CisgICAgZm9yIChpID0gMDsgaSA8IGFmaWZvLT5uYl9zYW1wbGVzOyArK2kpeworICAgICAgICByZXQgPSBhdl9hdWRpb19maWZvX3BlZWtfYXQoYWZpZm8sIG91dHB1dF9kYXRhLCAxLCBpKTsKKyAgICAgICAgaWYgKHJldCA8IDApeworICAgICAgICAgICAgRVJST1IoIkVSUk9SOiBhdl9hdWRpb19maWZvX3BlZWtfYXQgZmFpbGVkISIpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiJWQ6XG4iLCBpKTsKKyAgICAgICAgcHJpbnRfYXVkaW9fYnl0ZXModGVzdF9zYW1wbGUsIG91dHB1dF9kYXRhLCByZXQpOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICAvKiB0ZXN0IGF2X2F1ZGlvX2ZpZm9fZHJhaW4gKi8KKyAgICByZXQgPSBhdl9hdWRpb19maWZvX2RyYWluKGFmaWZvLCBhZmlmby0+bmJfc2FtcGxlcyk7CisgICAgaWYgKHJldCA8IDApeworICAgICAgICBFUlJPUigiRVJST1I6IGF2X2F1ZGlvX2ZpZm9fZHJhaW4gZmFpbGVkISIpOworICAgIH0KKyAgICBpZiAoYWZpZm8tPm5iX3NhbXBsZXMpeworICAgICAgICBFUlJPUigiZHJhaW4gZmFpbGVkIHRvIGZsdXNoIGFsbCBzYW1wbGVzIGluIGF1ZGlvX2ZpZm8hIik7CisgICAgfQorCisgICAgLyogZGVhbGxvY2F0ZSAqLworICAgIGZyZWVfZGF0YV9wbGFuZXMoYWZpZm8sIG91dHB1dF9kYXRhKTsKKyAgICBhdl9hdWRpb19maWZvX2ZyZWUoYWZpZm8pOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCB0LCB0ZXN0cyA9IHNpemVvZih0ZXN0X3N0cnVjdCkvc2l6ZW9mKHRlc3Rfc3RydWN0WzBdKTsKKworICAgIGZvciAodCA9IDA7IHQgPCB0ZXN0czsgKyt0KXsKKyAgICAgICAgcHJpbnRmKCJcblRFU1Q6ICVkXG5cbiIsIHQrMSk7CisgICAgICAgIHRlc3RfZnVuY3Rpb24oJnRlc3Rfc3RydWN0W3RdKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvYXZzdHJpbmcuYyBiL2xpYmF2dXRpbC90ZXN0cy9hdnN0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4N2JkMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvYXZzdHJpbmcuYwpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgY2hhciAqZnVsbHBhdGgsICpwdHI7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdHJpbmdzW10gPSB7CisgICAgICAgICInJyIsCisgICAgICAgICIiLAorICAgICAgICAiOiIsCisgICAgICAgICJcXCIsCisgICAgICAgICInIiwKKyAgICAgICAgIiAgICAnJyAgICA6IiwKKyAgICAgICAgIiAgICAnJyAgJycgIDoiLAorICAgICAgICAiZm9vICAgJycgOiIsCisgICAgICAgICInZm9vJyIsCisgICAgICAgICJmb28gICAgICIsCisgICAgICAgICIgICcgIGZvbyAgJyAgIiwKKyAgICAgICAgImZvb1xcIiwKKyAgICAgICAgImZvbyc6ICBibGFoOmJsYWgiLAorICAgICAgICAiZm9vXFw6ICBibGFoOmJsYWgiLAorICAgICAgICAiZm9vXCciLAorICAgICAgICAiJ2ZvbyA6ICAnICA6YmxhaGJsYWgiLAorICAgICAgICAiXFwgOmJsYWgiLAorICAgICAgICAiICAgICBmb28iLAorICAgICAgICAiICAgICAgZm9vICAgICAgICIsCisgICAgICAgICIgICAgICBmb28gICAgIFxcICIsCisgICAgICAgICJmb28gJzpibGFoIiwKKyAgICAgICAgIiBmb28gICBiYXIgICAgOiAgIGJsYWhibGFoIiwKKyAgICAgICAgIlxcZlxcb1xcbyIsCisgICAgICAgICInZm9vIDogXFwgXFwgICcgICA6IGJsYWhibGFoIiwKKyAgICAgICAgIidcXGZvXFxvOic6IGJsYWhibGFoIiwKKyAgICAgICAgIlxcJ2ZvXFxvXFw6JzogIGZvbyAgJyAgOmJsYWhibGFoIgorICAgIH07CisgICAgY29uc3QgY2hhciAqaGF5c3RhY2sgPSAiRWR1Y2F0aW9uIGNvbnNpc3RzIG1haW5seSBpbiB3aGF0IHdlIGhhdmUgdW5sZWFybmVkLiI7CisgICAgY29uc3QgY2hhciAqIGNvbnN0IG5lZWRsZVtdID0geyJsZWFybmVkLiIsICJ1bmxlYXJuZWQuIiwgIlVubGVhcm5lZCJ9OworCisgICAgcHJpbnRmKCJUZXN0aW5nIGF2X2dldF90b2tlbigpXG4iKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoc3RyaW5ncyk7IGkrKykgeworICAgICAgICBjb25zdCBjaGFyICpwID0gc3RyaW5nc1tpXTsKKyAgICAgICAgY2hhciAqcTsKKyAgICAgICAgcHJpbnRmKCJ8JXN8IiwgcCk7CisgICAgICAgIHEgPSBhdl9nZXRfdG9rZW4oJnAsICI6Iik7CisgICAgICAgIHByaW50ZigiIC0+IHwlc3wiLCBxKTsKKyAgICAgICAgcHJpbnRmKCIgKyB8JXN8XG4iLCBwKTsKKyAgICAgICAgYXZfZnJlZShxKTsKKyAgICB9CisKKyAgICBwcmludGYoIlRlc3RpbmcgYXZfYXBwZW5kX3BhdGhfY29tcG9uZW50KClcbiIpOworICAgICNkZWZpbmUgVEVTVF9BUFBFTkRfUEFUSF9DT01QT05FTlQocGF0aCwgY29tcG9uZW50LCBleHBlY3RlZCkgXAorICAgICAgICBmdWxscGF0aCA9IGF2X2FwcGVuZF9wYXRoX2NvbXBvbmVudCgocGF0aCksIChjb21wb25lbnQpKTsgXAorICAgICAgICBwcmludGYoIiVzID0gJXNcbiIsIGZ1bGxwYXRoID8gZnVsbHBhdGggOiAiKG51bGwpIiwgZXhwZWN0ZWQpOyBcCisgICAgICAgIGF2X2ZyZWUoZnVsbHBhdGgpOworICAgIFRFU1RfQVBQRU5EX1BBVEhfQ09NUE9ORU5UKE5VTEwsIE5VTEwsICIobnVsbCkiKQorICAgIFRFU1RfQVBQRU5EX1BBVEhfQ09NUE9ORU5UKCJwYXRoIiwgTlVMTCwgInBhdGgiKTsKKyAgICBURVNUX0FQUEVORF9QQVRIX0NPTVBPTkVOVChOVUxMLCAiY29tcCIsICJjb21wIik7CisgICAgVEVTVF9BUFBFTkRfUEFUSF9DT01QT05FTlQoInBhdGgiLCAiY29tcCIsICJwYXRoL2NvbXAiKTsKKyAgICBURVNUX0FQUEVORF9QQVRIX0NPTVBPTkVOVCgicGF0aC8iLCAiY29tcCIsICJwYXRoL2NvbXAiKTsKKyAgICBURVNUX0FQUEVORF9QQVRIX0NPTVBPTkVOVCgicGF0aCIsICIvY29tcCIsICJwYXRoL2NvbXAiKTsKKyAgICBURVNUX0FQUEVORF9QQVRIX0NPTVBPTkVOVCgicGF0aC8iLCAiL2NvbXAiLCAicGF0aC9jb21wIik7CisgICAgVEVTVF9BUFBFTkRfUEFUSF9DT01QT05FTlQoInBhdGgvcGF0aDIvIiwgIi9jb21wL2NvbXAyIiwgInBhdGgvcGF0aDIvY29tcC9jb21wMiIpOworCisgICAgLypUZXN0aW5nIGF2X3N0cm5zdHIoKSovCisgICAgI2RlZmluZSBURVNUX1NUUk5TVFIoaGF5c3RhY2ssIG5lZWRsZSwgaGF5X2xlbmd0aCwgZXhwZWN0ZWQpIFwKKyAgICAgICAgcHRyID0gYXZfc3RybnN0cihoYXlzdGFjaywgbmVlZGxlLCBoYXlfbGVuZ3RoKTsgXAorICAgICAgICBpZiAocHRyICE9IGV4cGVjdGVkKXsgXAorICAgICAgICAgICAgcHJpbnRmKCJleHBlY3RlZDogJXAsIHJlY2VpdmVkICVwXG4iLCBleHBlY3RlZCwgcHRyKTsgXAorICAgICAgICB9CisgICAgVEVTVF9TVFJOU1RSKGhheXN0YWNrLCBuZWVkbGUgWzBdLCBzdHJsZW4oaGF5c3RhY2spLCBoYXlzdGFjays0NCk7CisgICAgVEVTVF9TVFJOU1RSKGhheXN0YWNrLCBuZWVkbGUgWzFdLCBzdHJsZW4oaGF5c3RhY2spLCBoYXlzdGFjays0Mik7CisgICAgVEVTVF9TVFJOU1RSKGhheXN0YWNrLCBuZWVkbGUgWzJdLCBzdHJsZW4oaGF5c3RhY2spLCBOVUxMICAgICAgICk7CisgICAgVEVTVF9TVFJOU1RSKGhheXN0YWNrLCBzdHJpbmdzWzFdLCBzdHJsZW4oaGF5c3RhY2spLCBoYXlzdGFjayAgICk7CisKKyAgICAvKlRlc3RpbmcgYXZfc3RyaXJlcGxhY2UoKSovCisgICAgI2RlZmluZSBURVNUX1NUUklSRVBMQUNFKGhheXN0YWNrLCBuZWVkbGUsIGV4cGVjdGVkKSBcCisgICAgICAgIHB0ciA9IGF2X3N0cmlyZXBsYWNlKGhheXN0YWNrLCBuZWVkbGUsICJpbnN0ZWFkIik7IFwKKyAgICAgICAgaWYgKHB0ciA9PSBOVUxMKSB7IFwKKyAgICAgICAgICAgIHByaW50ZigiZXJyb3IsIHJlY2VpdmVkIG51bGwgcG9pbnRlciFcbiIpOyBcCisgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgIGlmIChzdHJjbXAocHRyLCBleHBlY3RlZCkgIT0gMCkgXAorICAgICAgICAgICAgICAgIHByaW50ZiggImV4cGVjdGVkOiAlcywgcmVjZWl2ZWQ6ICVzXG4iLCBleHBlY3RlZCwgcHRyKTsgXAorICAgICAgICAgICAgYXZfZnJlZShwdHIpOyBcCisgICAgICAgIH0KKworICAgIFRFU1RfU1RSSVJFUExBQ0UoaGF5c3RhY2ssIG5lZWRsZSBbMF0sICJFZHVjYXRpb24gY29uc2lzdHMgbWFpbmx5IGluIHdoYXQgd2UgaGF2ZSB1bmluc3RlYWQiKTsKKyAgICBURVNUX1NUUklSRVBMQUNFKGhheXN0YWNrLCBuZWVkbGUgWzFdLCAiRWR1Y2F0aW9uIGNvbnNpc3RzIG1haW5seSBpbiB3aGF0IHdlIGhhdmUgaW5zdGVhZCIpOworICAgIFRFU1RfU1RSSVJFUExBQ0UoaGF5c3RhY2ssIG5lZWRsZSBbMl0sICJFZHVjYXRpb24gY29uc2lzdHMgbWFpbmx5IGluIHdoYXQgd2UgaGF2ZSBpbnN0ZWFkLiIpOworICAgIFRFU1RfU1RSSVJFUExBQ0UoaGF5c3RhY2ssIG5lZWRsZSBbMV0sICJFZHVjYXRpb24gY29uc2lzdHMgbWFpbmx5IGluIHdoYXQgd2UgaGF2ZSBpbnN0ZWFkIik7CisKKyAgICAvKlRlc3RpbmcgYXZfZDJzdHIoKSovCisgICAgI2RlZmluZSBURVNUX0QyU1RSKHZhbHVlLCBleHBlY3RlZCkgXAorICAgICAgICBpZigocHRyID0gYXZfZDJzdHIodmFsdWUpKSA9PSBOVUxMKXsgXAorICAgICAgICAgICAgcHJpbnRmKCJlcnJvciwgcmVjZWl2ZWQgbnVsbCBwb2ludGVyIVxuIik7IFwKKyAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgaWYoc3RyY21wKHB0ciwgZXhwZWN0ZWQpICE9IDApIFwKKyAgICAgICAgICAgICAgICBwcmludGYoICJleHBlY3RlZDogJXMsIHJlY2VpdmVkOiAlc1xuIiwgZXhwZWN0ZWQsIHB0cik7IFwKKyAgICAgICAgICAgIGF2X2ZyZWUocHRyKTsgXAorICAgICAgICB9CisgICAgVEVTVF9EMlNUUigwICAgICAgICAgLCAgIjAuMDAwMDAwIik7CisgICAgVEVTVF9EMlNUUigtMS4yMzMzMjM0LCAiLTEuMjMzMzIzIik7CisgICAgVEVTVF9EMlNUUigtMS4yMzMzMjM3LCAiLTEuMjMzMzI0Iik7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvYmFzZTY0LmMgYi9saWJhdnV0aWwvdGVzdHMvYmFzZTY0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwZTAxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9iYXNlNjQuYwpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvLyBMQ09WX0VYQ0xfU1RBUlQKKworI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYmFzZTY0LmgiCisKKyNkZWZpbmUgTUFYX0RBVEFfU0laRSAgICAxMDI0CisjZGVmaW5lIE1BWF9FTkNPREVEX1NJWkUgMjA0OAorCitzdGF0aWMgaW50IHRlc3RfZW5jb2RlX2RlY29kZShjb25zdCB1aW50OF90ICpkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5jb2RlZF9yZWYpCit7CisgICAgY2hhciAgZW5jb2RlZFtNQVhfRU5DT0RFRF9TSVpFXTsKKyAgICB1aW50OF90IGRhdGEyW01BWF9EQVRBX1NJWkVdOworICAgIGludCBkYXRhMl9zaXplLCBtYXhfZGF0YTJfc2l6ZSA9IE1BWF9EQVRBX1NJWkU7CisKKyAgICBpZiAoIWF2X2Jhc2U2NF9lbmNvZGUoZW5jb2RlZCwgTUFYX0VOQ09ERURfU0laRSwgZGF0YSwgZGF0YV9zaXplKSkgeworICAgICAgICBwcmludGYoIkZhaWxlZDogY2Fubm90IGVuY29kZSB0aGUgaW5wdXQgZGF0YVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoZW5jb2RlZF9yZWYgJiYgc3RyY21wKGVuY29kZWQsIGVuY29kZWRfcmVmKSkgeworICAgICAgICBwcmludGYoIkZhaWxlZDogZW5jb2RlZCBzdHJpbmcgZGlmZmVycyBmcm9tIHJlZmVyZW5jZVxuIgorICAgICAgICAgICAgICAgIkVuY29kZWQ6XG4lc1xuUmVmZXJlbmNlOlxuJXNcbiIsIGVuY29kZWQsIGVuY29kZWRfcmVmKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKChkYXRhMl9zaXplID0gYXZfYmFzZTY0X2RlY29kZShkYXRhMiwgZW5jb2RlZCwgbWF4X2RhdGEyX3NpemUpKSAhPSBkYXRhX3NpemUpIHsKKyAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IGNhbm5vdCBkZWNvZGUgdGhlIGVuY29kZWQgc3RyaW5nXG4iCisgICAgICAgICAgICAgICAiRW5jb2RlZDpcbiVzXG4iLCBlbmNvZGVkKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICgoZGF0YTJfc2l6ZSA9IGF2X2Jhc2U2NF9kZWNvZGUoZGF0YTIsIGVuY29kZWQsIGRhdGFfc2l6ZSkpICE9IGRhdGFfc2l6ZSkgeworICAgICAgICBwcmludGYoIkZhaWxlZDogY2Fubm90IGRlY29kZSB3aXRoIG1pbmltYWwgYnVmZmVyXG4iCisgICAgICAgICAgICAgICAiRW5jb2RlZDpcbiVzXG4iLCBlbmNvZGVkKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChtZW1jbXAoZGF0YTIsIGRhdGEsIGRhdGFfc2l6ZSkpIHsKKyAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IGVuY29kZWQvZGVjb2RlZCBkYXRhIGRpZmZlcnMgZnJvbSBvcmlnaW5hbCBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChhdl9iYXNlNjRfZGVjb2RlKE5VTEwsIGVuY29kZWQsIDApICE9IDApIHsKKyAgICAgICAgcHJpbnRmKCJGYWlsZWQ6IGRlY29kZSB0byBOVUxMIGJ1ZmZlclxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoc3RybGVuKGVuY29kZWQpKSB7CisgICAgICAgIGNoYXIgKmVuZCA9IHN0cmNocihlbmNvZGVkLCAnPScpOworICAgICAgICBpZiAoIWVuZCkKKyAgICAgICAgICAgIGVuZCA9IGVuY29kZWQgKyBzdHJsZW4oZW5jb2RlZCkgLSAxOworICAgICAgICAqZW5kID0gJyUnOworICAgICAgICBpZiAoYXZfYmFzZTY0X2RlY29kZShOVUxMLCBlbmNvZGVkLCAwKSA+PSAwKSB7CisgICAgICAgICAgICBwcmludGYoIkZhaWxlZDogZXJyb3IgZGV0ZWN0aW9uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpbnRmKCJQYXNzZWQhXG4iKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKK3sKKyAgICBpbnQgaSwgZXJyb3JfY291bnQgPSAwOworICAgIHN0cnVjdCB0ZXN0IHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YTsKKyAgICAgICAgY29uc3QgY2hhciAqZW5jb2RlZF9yZWY7CisgICAgfSB0ZXN0c1tdID0geworICAgICAgICB7ICIiLCAgICAgICAgIiJ9LAorICAgICAgICB7ICIxIiwgICAgICAgIk1RPT0ifSwKKyAgICAgICAgeyAiMjIiLCAgICAgICJNakk9In0sCisgICAgICAgIHsgIjMzMyIsICAgICAiTXpNeiJ9LAorICAgICAgICB7ICI0NDQ0IiwgICAgIk5EUTBOQT09In0sCisgICAgICAgIHsgIjU1NTU1IiwgICAiTlRVMU5UVT0ifSwKKyAgICAgICAgeyAiNjY2NjY2IiwgICJOalkyTmpZMiJ9LAorICAgICAgICB7ICJhYmM6ZGVmIiwgIllXSmpPbVJsWmc9PSJ9LAorICAgIH07CisgICAgY2hhciBpblsxMDI0XSwgb3V0WzIwNDhdOworCisgICAgcHJpbnRmKCJFbmNvZGluZy9kZWNvZGluZyB0ZXN0c1xuIik7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHRlc3RzKTsgaSsrKQorICAgICAgICBlcnJvcl9jb3VudCArPSB0ZXN0X2VuY29kZV9kZWNvZGUodGVzdHNbaV0uZGF0YSwgc3RybGVuKHRlc3RzW2ldLmRhdGEpLCB0ZXN0c1tpXS5lbmNvZGVkX3JlZik7CisKKyAgICBpZiAoYXJnYz4xICYmICFzdHJjbXAoYXJndlsxXSwgIi10IikpIHsKKyAgICAgICAgbWVtc2V0KGluLCAxMjMsIHNpemVvZihpbikpOworICAgICAgICBmb3IoaT0wOyBpPDEwMDAwOyBpKyspeworICAgICAgICAgICAgU1RBUlRfVElNRVIKKyAgICAgICAgICAgIGF2X2Jhc2U2NF9lbmNvZGUob3V0LCBzaXplb2Yob3V0KSwgaW4sIHNpemVvZihpbikpOworICAgICAgICAgICAgU1RPUF9USU1FUigiZW5jb2RlIikKKyAgICAgICAgfQorICAgICAgICBmb3IoaT0wOyBpPDEwMDAwOyBpKyspeworICAgICAgICAgICAgU1RBUlRfVElNRVIKKyAgICAgICAgICAgIGF2X2Jhc2U2NF9kZWNvZGUoaW4sIG91dCwgc2l6ZW9mKGluKSk7CisgICAgICAgICAgICBTVE9QX1RJTUVSKCJkZWNvZGUiKQorICAgICAgICB9CisKKyAgICAgICAgZm9yKGk9MDsgaTwxMDAwMDsgaSsrKXsKKyAgICAgICAgICAgIFNUQVJUX1RJTUVSCisgICAgICAgICAgICBhdl9iYXNlNjRfZGVjb2RlKE5VTEwsIG91dCwgMCk7CisgICAgICAgICAgICBTVE9QX1RJTUVSKCJzeW50YXggY2hlY2siKQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVycm9yX2NvdW50KQorICAgICAgICBwcmludGYoIkVycm9yIENvdW50OiAlZC5cbiIsIGVycm9yX2NvdW50KTsKKworICAgIHJldHVybiAhIWVycm9yX2NvdW50OworfQorCisvLyBMQ09WX0VYQ0xfU1RPUApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL2Jsb3dmaXNoLmMgYi9saWJhdnV0aWwvdGVzdHMvYmxvd2Zpc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGM5Y2VkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL2Jsb3dmaXNoLmMKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2Jsb3dmaXNoLmgiCisKKyNkZWZpbmUgTlVNX1ZBUklBQkxFX0tFWV9URVNUUyAzNAorCisvKiBwbGFpbnRleHQgYnl0ZXMgLS0gbGVmdCBoYWx2ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBwbGFpbnRleHRfbFtOVU1fVkFSSUFCTEVfS0VZX1RFU1RTXSA9IHsKKyAgICAweDAwMDAwMDAwLCAweEZGRkZGRkZGLCAweDEwMDAwMDAwLCAweDExMTExMTExLCAweDExMTExMTExLAorICAgIDB4MDEyMzQ1NjcsIDB4MDAwMDAwMDAsIDB4MDEyMzQ1NjcsIDB4MDFBMUQ2RDAsIDB4NUNENTRDQTgsCisgICAgMHgwMjQ4RDQzOCwgMHg1MTQ1NEI1OCwgMHg0MkZENDQzMCwgMHgwNTlCNUUwOCwgMHgwNzU2RDhFMCwKKyAgICAweDc2MjUxNEI4LCAweDNCREQxMTkwLCAweDI2OTU1RjY4LCAweDE2NEQ1RTQwLCAweDZCMDU2RTE4LAorICAgIDB4MDA0QkQ2RUYsIDB4NDgwRDM5MDAsIDB4NDM3NTQwQzgsIDB4MDcyRDQzQTAsIDB4MDJGRTU1NzcsCisgICAgMHgxRDlENUM1MCwgMHgzMDU1MzIyOCwgMHgwMTIzNDU2NywgMHgwMTIzNDU2NywgMHgwMTIzNDU2NywKKyAgICAweEZGRkZGRkZGLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweEZGRkZGRkZGCit9OworCisvKiBwbGFpbnRleHQgYnl0ZXMgLS0gcmlnaHQgaGFsdmVzICovCitzdGF0aWMgY29uc3QgdWludDMyX3QgcGxhaW50ZXh0X3JbTlVNX1ZBUklBQkxFX0tFWV9URVNUU10gPSB7CisgICAgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMSwgMHgxMTExMTExMSwgMHgxMTExMTExMSwKKyAgICAweDg5QUJDREVGLCAweDAwMDAwMDAwLCAweDg5QUJDREVGLCAweDM5Nzc2NzQyLCAweDNERUY1N0RBLAorICAgIDB4MDZGNjcxNzIsIDB4MkRERjQ0MEEsIDB4NTk1NzdGQTIsIDB4NTFDRjE0M0EsIDB4Nzc0NzYxRDIsCisgICAgMHgyOUJGNDg2QSwgMHg0OTM3MjgwMiwgMHgzNUFGNjA5QSwgMHg0RjI3NTIzMiwgMHg3NTlGNUNDQSwKKyAgICAweDA5MTc2MDYyLCAweDZFRTc2MkYyLCAweDY5OEYzQ0ZBLCAweDc3MDc1MjkyLCAweDgxMTdGMTJBLAorICAgIDB4MThGNzI4QzIsIDB4NkQ2RjI5NUEsIDB4ODlBQkNERUYsIDB4ODlBQkNERUYsIDB4ODlBQkNERUYsCisgICAgMHhGRkZGRkZGRiwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHhGRkZGRkZGRgorfTsKKworLyoga2V5IGJ5dGVzIGZvciB2YXJpYWJsZSBrZXkgdGVzdHMgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHZhcmlhYmxlX2tleVtOVU1fVkFSSUFCTEVfS0VZX1RFU1RTXVs4XSA9IHsKKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfSwKKyAgICB7IDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICB7IDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEgfSwKKyAgICB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUYgfSwKKyAgICB7IDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEsIDB4MTEgfSwKKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICB7IDB4RkUsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfSwKKyAgICB7IDB4N0MsIDB4QTEsIDB4MTAsIDB4NDUsIDB4NEEsIDB4MUEsIDB4NkUsIDB4NTcgfSwKKyAgICB7IDB4MDEsIDB4MzEsIDB4RDksIDB4NjEsIDB4OUQsIDB4QzEsIDB4MzcsIDB4NkUgfSwKKyAgICB7IDB4MDcsIDB4QTEsIDB4MTMsIDB4M0UsIDB4NEEsIDB4MEIsIDB4MjYsIDB4ODYgfSwKKyAgICB7IDB4MzgsIDB4NDksIDB4NjcsIDB4NEMsIDB4MjYsIDB4MDIsIDB4MzEsIDB4OUUgfSwKKyAgICB7IDB4MDQsIDB4QjksIDB4MTUsIDB4QkEsIDB4NDMsIDB4RkUsIDB4QjUsIDB4QjYgfSwKKyAgICB7IDB4MDEsIDB4MTMsIDB4QjksIDB4NzAsIDB4RkQsIDB4MzQsIDB4RjIsIDB4Q0UgfSwKKyAgICB7IDB4MDEsIDB4NzAsIDB4RjEsIDB4NzUsIDB4NDYsIDB4OEYsIDB4QjUsIDB4RTYgfSwKKyAgICB7IDB4NDMsIDB4MjksIDB4N0YsIDB4QUQsIDB4MzgsIDB4RTMsIDB4NzMsIDB4RkUgfSwKKyAgICB7IDB4MDcsIDB4QTcsIDB4MTMsIDB4NzAsIDB4NDUsIDB4REEsIDB4MkEsIDB4MTYgfSwKKyAgICB7IDB4MDQsIDB4NjgsIDB4OTEsIDB4MDQsIDB4QzIsIDB4RkQsIDB4M0IsIDB4MkYgfSwKKyAgICB7IDB4MzcsIDB4RDAsIDB4NkIsIDB4QjUsIDB4MTYsIDB4Q0IsIDB4NzUsIDB4NDYgfSwKKyAgICB7IDB4MUYsIDB4MDgsIDB4MjYsIDB4MEQsIDB4MUEsIDB4QzIsIDB4NDYsIDB4NUUgfSwKKyAgICB7IDB4NTgsIDB4NDAsIDB4MjMsIDB4NjQsIDB4MUEsIDB4QkEsIDB4NjEsIDB4NzYgfSwKKyAgICB7IDB4MDIsIDB4NTgsIDB4MTYsIDB4MTYsIDB4NDYsIDB4MjksIDB4QjAsIDB4MDcgfSwKKyAgICB7IDB4NDksIDB4NzksIDB4M0UsIDB4QkMsIDB4NzksIDB4QjMsIDB4MjUsIDB4OEYgfSwKKyAgICB7IDB4NEYsIDB4QjAsIDB4NUUsIDB4MTUsIDB4MTUsIDB4QUIsIDB4NzMsIDB4QTcgfSwKKyAgICB7IDB4NDksIDB4RTksIDB4NUQsIDB4NkQsIDB4NEMsIDB4QTIsIDB4MjksIDB4QkYgfSwKKyAgICB7IDB4MDEsIDB4ODMsIDB4MTAsIDB4REMsIDB4NDAsIDB4OUIsIDB4MjYsIDB4RDYgfSwKKyAgICB7IDB4MUMsIDB4NTgsIDB4N0YsIDB4MUMsIDB4MTMsIDB4OTIsIDB4NEYsIDB4RUYgfSwKKyAgICB7IDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEgfSwKKyAgICB7IDB4MUYsIDB4MUYsIDB4MUYsIDB4MUYsIDB4MEUsIDB4MEUsIDB4MEUsIDB4MEUgfSwKKyAgICB7IDB4RTAsIDB4RkUsIDB4RTAsIDB4RkUsIDB4RjEsIDB4RkUsIDB4RjEsIDB4RkUgfSwKKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfSwKKyAgICB7IDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4QUIsIDB4Q0QsIDB4RUYgfSwKKyAgICB7IDB4RkUsIDB4REMsIDB4QkEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfQorfTsKKworLyogY2lwaGVydGV4dCBieXRlcyAtLSBsZWZ0IGhhbHZlcyAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IGNpcGhlcnRleHRfbFtOVU1fVkFSSUFCTEVfS0VZX1RFU1RTXSA9IHsKKyAgICAweDRFRjk5NzQ1LCAweDUxODY2RkQ1LCAweDdEODU2RjlBLCAweDI0NjZERDg3LCAweDYxRjlDMzgwLAorICAgIDB4N0QwQ0M2MzAsIDB4NEVGOTk3NDUsIDB4MEFDRUFCMEYsIDB4NTlDNjgyNDUsIDB4QjFCOENDMEIsCisgICAgMHgxNzMwRTU3NywgMHhBMjVFNzg1NiwgMHgzNTM4ODJCMSwgMHg0OEY0RDA4OCwgMHg0MzIxOTNCNywKKyAgICAweDEzRjA0MTU0LCAweDJFRUREQTkzLCAweEQ4ODdFMDM5LCAweDVGOTlEMDRGLCAweDRBMDU3QTNCLAorICAgIDB4NDUyMDMxQzEsIDB4NzU1NUFFMzksIDB4NTNDNTVGOUMsIDB4N0E4RTdCRkEsIDB4Q0Y5QzVEN0EsCisgICAgMHhEMUFCQjI5MCwgMHg1NUNCMzc3NCwgMHhGQTM0RUM0OCwgMHhBNzkwNzk1MSwgMHhDMzlFMDcyRCwKKyAgICAweDAxNDkzM0UwLCAweEYyMUU5QTc3LCAweDI0NTk0Njg4LCAweDZCNUM1QTlDCit9OworCisvKiBjaXBoZXJ0ZXh0IGJ5dGVzIC0tIHJpZ2h0IGhhbHZlcyAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IGNpcGhlcnRleHRfcltOVU1fVkFSSUFCTEVfS0VZX1RFU1RTXSA9IHsKKyAgICAweDYxOThERDc4LCAweEI4NUVDQjhBLCAweDYxMzA2M0YyLCAweDhCOTYzQzlELCAweDIyODFCMDk2LAorICAgIDB4QUZEQTFFQzcsIDB4NjE5OERENzgsIDB4QzZBMEEyOEQsIDB4RUIwNTI4MkIsIDB4MjUwRjA5QTAsCisgICAgMHg4QkVBMURBNCwgMHhDRjI2NTFFQiwgMHgwOUNFOEYxQSwgMHg0QzM3OTkxOCwgMHg4OTUxRkM5OCwKKyAgICAweEQ2OUQxQUU1LCAweEZGRDM5Qzc5LCAweDNDMkRBNkUzLCAweDVCMTYzOTY5LCAweDI0RDM5NzdCLAorICAgIDB4RTRGQURBOEUsIDB4RjU5Qjg3QkQsIDB4QjQ5RkMwMTksIDB4OTM3RTg5QTMsIDB4NDk4NkFEQjUsCisgICAgMHg2NThCQzc3OCwgMHhEMTNFRjIwMSwgMHg0N0IyNjhCMiwgMHgwOEVBM0NBRSwgMHg5RkFDNjMxRCwKKyAgICAweENEQUZGNkU0LCAweEI3MUM0OUJDLCAweDU3NTQzNjlBLCAweDVEOUUwQTVBCit9OworCisvKiBwbGFpbnRleHQgYnl0ZXMgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IHBsYWludGV4dFs4XSA9ICJCTE9XRklTSCI7CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHBsYWludGV4dDJbMTZdID0gIkJMT1dGSVNIQkxPV0ZJU0giOworCisvKiBjaXBoZXJ0ZXh0IGJ5dGVzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBjaXBoZXJ0ZXh0WzhdID0geworICAgIDB4MzIsIDB4NEUsIDB4RDAsIDB4RkUsIDB4RjQsIDB4MTMsIDB4QTIsIDB4MDMKK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGNpcGhlcnRleHQyWzE2XSA9IHsKKyAgICAweDUzLCAweDAwLCAweDQwLCAweDA2LCAweDYzLCAweGYyLCAweDFkLCAweDk5LAorICAgIDB4M2IsIDB4OWIsIDB4MjcsIDB4NjQsIDB4NDYsIDB4ZmQsIDB4MjAsIDB4YzEsCit9OworCisjZGVmaW5lIElWICJibG93ZmlzaCIKKworc3RhdGljIHZvaWQgdGVzdF9ibG93ZmlzaChBVkJsb3dmaXNoICpjdHgsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIGludCBsZW4sIHVpbnQ4X3QgKml2LCBpbnQgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXN0KQoreworICAgIGF2X2Jsb3dmaXNoX2NyeXB0KGN0eCwgZHN0LCBzcmMsIGxlbiwgaXYsIGRpcik7CisgICAgaWYgKG1lbWNtcChkc3QsIHJlZiwgOCpsZW4pKSB7CisgICAgICAgIGludCBpOworICAgICAgICBwcmludGYoIiVzIGZhaWxlZFxuZ290ICAgICAgIiwgdGVzdCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4KmxlbjsgaSsrKQorICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGRzdFtpXSk7CisgICAgICAgIHByaW50ZigiXG5leHBlY3RlZCAiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDgqbGVuOyBpKyspCisgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgcmVmW2ldKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICB1aW50MzJfdCB0bXB0ZXh0X2xbTlVNX1ZBUklBQkxFX0tFWV9URVNUU107CisgICAgdWludDMyX3QgdG1wdGV4dF9yW05VTV9WQVJJQUJMRV9LRVlfVEVTVFNdOworICAgIHVpbnQ4X3QgdG1wWzE2XSwgaXZbOF07CisgICAgaW50IGk7CisgICAgQVZCbG93ZmlzaCAqY3R4ID0gYXZfYmxvd2Zpc2hfYWxsb2MoKTsKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBhdl9ibG93ZmlzaF9pbml0KGN0eCwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwgMjYpOworCisgICAgdGVzdF9ibG93ZmlzaChjdHgsIHRtcCwgcGxhaW50ZXh0LCBjaXBoZXJ0ZXh0LCAxLCBOVUxMLCAwLCAiZW5jcnlwdGlvbiIpOworICAgIHRlc3RfYmxvd2Zpc2goY3R4LCB0bXAsIGNpcGhlcnRleHQsIHBsYWludGV4dCwgMSwgTlVMTCwgMSwgImRlY3J5cHRpb24iKTsKKyAgICB0ZXN0X2Jsb3dmaXNoKGN0eCwgdG1wLCB0bXAsIGNpcGhlcnRleHQsIDEsIE5VTEwsIDAsICJJbnBsYWNlIGVuY3J5cHRpb24iKTsKKyAgICB0ZXN0X2Jsb3dmaXNoKGN0eCwgdG1wLCB0bXAsIHBsYWludGV4dCwgIDEsIE5VTEwsIDEsICJJbnBsYWNlIGRlY3J5cHRpb24iKTsKKyAgICBtZW1jcHkoaXYsIElWLCA4KTsKKyAgICB0ZXN0X2Jsb3dmaXNoKGN0eCwgdG1wLCBwbGFpbnRleHQyLCBjaXBoZXJ0ZXh0MiwgMiwgaXYsIDAsICJDQkMgZW5jcnlwdGlvbiIpOworICAgIG1lbWNweShpdiwgSVYsIDgpOworICAgIHRlc3RfYmxvd2Zpc2goY3R4LCB0bXAsIGNpcGhlcnRleHQyLCBwbGFpbnRleHQyLCAyLCBpdiwgMSwgIkNCQyBkZWNyeXB0aW9uIik7CisgICAgbWVtY3B5KGl2LCBJViwgOCk7CisgICAgdGVzdF9ibG93ZmlzaChjdHgsIHRtcCwgdG1wLCBjaXBoZXJ0ZXh0MiwgMiwgaXYsIDAsICJJbnBsYWNlIENCQyBlbmNyeXB0aW9uIik7CisgICAgbWVtY3B5KGl2LCBJViwgOCk7CisgICAgdGVzdF9ibG93ZmlzaChjdHgsIHRtcCwgdG1wLCBwbGFpbnRleHQyLCAgMiwgaXYsIDEsICJJbnBsYWNlIENCQyBkZWNyeXB0aW9uIik7CisKKyAgICBtZW1jcHkodG1wdGV4dF9sLCBwbGFpbnRleHRfbCwgc2l6ZW9mKCpwbGFpbnRleHRfbCkgKiBOVU1fVkFSSUFCTEVfS0VZX1RFU1RTKTsKKyAgICBtZW1jcHkodG1wdGV4dF9yLCBwbGFpbnRleHRfciwgc2l6ZW9mKCpwbGFpbnRleHRfcikgKiBOVU1fVkFSSUFCTEVfS0VZX1RFU1RTKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVkFSSUFCTEVfS0VZX1RFU1RTOyBpKyspIHsKKyAgICAgICAgYXZfYmxvd2Zpc2hfaW5pdChjdHgsIHZhcmlhYmxlX2tleVtpXSwgOCk7CisKKyAgICAgICAgYXZfYmxvd2Zpc2hfY3J5cHRfZWNiKGN0eCwgJnRtcHRleHRfbFtpXSwgJnRtcHRleHRfcltpXSwgMCk7CisgICAgICAgIGlmICh0bXB0ZXh0X2xbaV0gIT0gY2lwaGVydGV4dF9sW2ldIHx8IHRtcHRleHRfcltpXSAhPSBjaXBoZXJ0ZXh0X3JbaV0pIHsKKyAgICAgICAgICAgIHByaW50ZigiVGVzdCBlbmNyeXB0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKworICAgICAgICBhdl9ibG93ZmlzaF9jcnlwdF9lY2IoY3R4LCAmdG1wdGV4dF9sW2ldLCAmdG1wdGV4dF9yW2ldLCAxKTsKKyAgICAgICAgaWYgKHRtcHRleHRfbFtpXSAhPSBwbGFpbnRleHRfbFtpXSB8fCB0bXB0ZXh0X3JbaV0gIT0gcGxhaW50ZXh0X3JbaV0pIHsKKyAgICAgICAgICAgIHByaW50ZigiVGVzdCBkZWNyeXB0aW9uIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDM7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCJUZXN0IGVuY3J5cHRpb24vZGVjcnlwdGlvbiBzdWNjZXNzLlxuIik7CisgICAgYXZfZnJlZShjdHgpOworCisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9icHJpbnQuYyBiL2xpYmF2dXRpbC90ZXN0cy9icHJpbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2YzODFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL2JwcmludC5jCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgTmljb2xhcyBHZW9yZ2UKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9icHJpbnQuYyIKKworI3VuZGVmIHByaW50ZgorCitzdGF0aWMgdm9pZCBicHJpbnRfcGFzY2FsKEFWQlByaW50ICpiLCB1bnNpZ25lZCBzaXplKQoreworICAgIHVuc2lnbmVkIGksIGo7CisgICAgdW5zaWduZWQgcFs0Ml07CisKKyAgICBhdl9hc3NlcnQwKHNpemUgPCBGRl9BUlJBWV9FTEVNUyhwKSk7CisKKyAgICBwWzBdID0gMTsKKyAgICBhdl9icHJpbnRmKGIsICIlOGRcbiIsIDEpOworICAgIGZvciAoaSA9IDE7IGkgPD0gc2l6ZTsgaSsrKSB7CisgICAgICAgIHBbaV0gPSAxOworICAgICAgICBmb3IgKGogPSBpIC0gMTsgaiA+IDA7IGotLSkKKyAgICAgICAgICAgIHBbal0gPSBwW2pdICsgcFtqIC0gMV07CisgICAgICAgIGZvciAoaiA9IDA7IGogPD0gaTsgaisrKQorICAgICAgICAgICAgYXZfYnByaW50ZihiLCAiJThkIiwgcFtqXSk7CisgICAgICAgIGF2X2JwcmludGYoYiwgIlxuIik7CisgICAgfQorfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIEFWQlByaW50IGI7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBzdHJ1Y3QgdG0gdGVzdHRpbWUgPSB7IC50bV95ZWFyID0gMTAwLCAudG1fbW9uID0gMTEsIC50bV9tZGF5ID0gMjAgfTsKKworICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAtMSk7CisgICAgYnByaW50X3Bhc2NhbCgmYiwgNSk7CisgICAgcHJpbnRmKCJTaG9ydCB0ZXh0IGluIHVubGltaXRlZCBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGIuc3RyKSwgYi5sZW4pOworICAgIHByaW50ZigiJXNcbiIsIGIuc3RyKTsKKyAgICBhdl9icHJpbnRfZmluYWxpemUoJmIsIE5VTEwpOworCisgICAgYXZfYnByaW50X2luaXQoJmIsIDAsIC0xKTsKKyAgICBicHJpbnRfcGFzY2FsKCZiLCAyNSk7CisgICAgcHJpbnRmKCJMb25nIHRleHQgaW4gdW5saW1pdGVkIGJ1ZmZlcjogJXUvJXVcbiIsICh1bnNpZ25lZClzdHJsZW4oYi5zdHIpLCBiLmxlbik7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZiLCBOVUxMKTsKKworICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAyMDQ4KTsKKyAgICBicHJpbnRfcGFzY2FsKCZiLCAyNSk7CisgICAgcHJpbnRmKCJMb25nIHRleHQgaW4gbGltaXRlZCBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGIuc3RyKSwgYi5sZW4pOworICAgIGF2X2JwcmludF9maW5hbGl6ZSgmYiwgTlVMTCk7CisKKyAgICBhdl9icHJpbnRfaW5pdCgmYiwgMCwgMSk7CisgICAgYnByaW50X3Bhc2NhbCgmYiwgNSk7CisgICAgcHJpbnRmKCJTaG9ydCB0ZXh0IGluIGF1dG9tYXRpYyBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGIuc3RyKSwgYi5sZW4pOworCisgICAgYXZfYnByaW50X2luaXQoJmIsIDAsIDEpOworICAgIGJwcmludF9wYXNjYWwoJmIsIDI1KTsKKyAgICBwcmludGYoIkxvbmcgdGV4dCBpbiBhdXRvbWF0aWMgYnVmZmVyOiAldS8ldVxuIiwgKHVuc2lnbmVkKXN0cmxlbihiLnN0cikvOCo4LCBiLmxlbik7CisgICAgLyogTm90ZSB0aGF0IHRoZSBzaXplIG9mIHRoZSBhdXRvbWF0aWMgYnVmZmVyIGlzIGFyY2gtZGVwZW5kZW50LiAqLworCisgICAgYXZfYnByaW50X2luaXQoJmIsIDAsIDApOworICAgIGJwcmludF9wYXNjYWwoJmIsIDI1KTsKKyAgICBwcmludGYoIkxvbmcgdGV4dCBjb3VudCBvbmx5IGJ1ZmZlcjogJXUvJXVcbiIsICh1bnNpZ25lZClzdHJsZW4oYi5zdHIpLCBiLmxlbik7CisKKyAgICBhdl9icHJpbnRfaW5pdF9mb3JfYnVmZmVyKCZiLCBidWYsIHNpemVvZihidWYpKTsKKyAgICBicHJpbnRfcGFzY2FsKCZiLCAyNSk7CisgICAgcHJpbnRmKCJMb25nIHRleHQgY291bnQgb25seSBidWZmZXI6ICV1LyV1XG4iLCAodW5zaWduZWQpc3RybGVuKGJ1ZiksIGIubGVuKTsKKworICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCAtMSk7CisgICAgYXZfYnByaW50X3N0cmZ0aW1lKCZiLCAiJVktJW0tJWQiLCAmdGVzdHRpbWUpOworICAgIHByaW50Zigic3RyZnRpbWUgZnVsbDogJXUvJXUgXCIlc1wiXG4iLCAodW5zaWduZWQpc3RybGVuKGJ1ZiksIGIubGVuLCBiLnN0cik7CisgICAgYXZfYnByaW50X2ZpbmFsaXplKCZiLCBOVUxMKTsKKworICAgIGF2X2JwcmludF9pbml0KCZiLCAwLCA4KTsKKyAgICBhdl9icHJpbnRfc3RyZnRpbWUoJmIsICIlWS0lbS0lZCIsICZ0ZXN0dGltZSk7CisgICAgcHJpbnRmKCJzdHJmdGltZSB0cnVuY2F0ZWQ6ICV1LyV1IFwiJXNcIlxuIiwgKHVuc2lnbmVkKXN0cmxlbihidWYpLCBiLmxlbiwgYi5zdHIpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvY2FtZWxsaWEuYyBiL2xpYmF2dXRpbC90ZXN0cy9jYW1lbGxpYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MTZiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvY2FtZWxsaWEuYwpAQCAtMCwwICsxLDc1IEBACisvKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENBTUVMTElBIGFsZ29yaXRobSBhcyBtZW50aW9uZWQgaW4gUkZDMzcxMworICogQ29weXJpZ2h0IChjKSAyMDE0IFN1cHJhamEgTWVlZGludGkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jYW1lbGxpYS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBjb25zdCB1aW50OF90IEtleVszXVszMl0gPSB7CisgICAgICAgIHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwfSwKKyAgICAgICAgezB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsIDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAsIDB4MDAsIDB4MTEsIDB4MjIsIDB4MzMsIDB4NDQsIDB4NTUsIDB4NjYsIDB4Nzd9LAorICAgICAgICB7MHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCwgMHgwMCwgMHgxMSwgMHgyMiwgMHgzMywgMHg0NCwgMHg1NSwgMHg2NiwgMHg3NywgMHg4OCwgMHg5OSwgMHhhYSwgMHhiYiwgMHhjYywgMHhkZCwgMHhlZSwgMHhmZn0KKyAgICB9OworICAgIGNvbnN0IHVpbnQ4X3QgcmN0WzNdWzE2XSA9IHsKKyAgICAgICAgezB4NjcsIDB4NjcsIDB4MzEsIDB4MzgsIDB4NTQsIDB4OTYsIDB4NjksIDB4NzMsIDB4MDgsIDB4NTcsIDB4MDYsIDB4NTYsIDB4NDgsIDB4ZWEsIDB4YmUsIDB4NDN9LAorICAgICAgICB7MHhiNCwgMHg5OSwgMHgzNCwgMHgwMSwgMHhiMywgMHhlOSwweDk2LCAweGY4LCAweDRlLCAweGU1LCAweGNlLCAweGU3LCAweGQ3LCAweDliLCAweDA5LCAweGI5fSwKKyAgICAgICAgezB4OWEsIDB4Y2MsIDB4MjMsIDB4N2QsIDB4ZmYsIDB4MTYsIDB4ZDcsIDB4NmMsIDB4MjAsIDB4ZWYsIDB4N2MsIDB4OTEsIDB4OWUsIDB4M2EsIDB4NzUsIDB4MDl9CisgICAgfTsKKyAgICBjb25zdCB1aW50OF90IHJwdFszMl0gPSB7MHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMCwgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgMHhmZSwgMHhkYywgMHhiYSwgMHg5OCwgMHg3NiwgMHg1NCwgMHgzMiwgMHgxMH07CisgICAgY29uc3QgaW50IGtiaXRzWzNdID0gezEyOCwgMTkyLCAyNTZ9OworICAgIGludCBpLCBqLCBlcnIgPSAwOworICAgIHVpbnQ4X3QgdGVtcFszMl0sIGl2WzE2XTsKKyAgICBzdHJ1Y3QgQVZDQU1FTExJQSAqY3M7CisgICAgY3MgPSBhdl9jYW1lbGxpYV9hbGxvYygpOworICAgIGlmICghY3MpCisgICAgICAgIHJldHVybiAxOworICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgYXZfY2FtZWxsaWFfaW5pdChjcywgS2V5W2pdLCBrYml0c1tqXSk7CisgICAgICAgIGF2X2NhbWVsbGlhX2NyeXB0KGNzLCB0ZW1wLCBycHQsIDEsIE5VTEwsIDApOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgaWYgKHJjdFtqXVtpXSAhPSB0ZW1wW2ldKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICUwMnggJTAyeFxuIiwgaSwgcmN0W2pdW2ldLCB0ZW1wW2ldKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X2NhbWVsbGlhX2NyeXB0KGNzLCB0ZW1wLCByY3Rbal0sIDEsIE5VTEwsIDEpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgaWYgKHJwdFtpXSAhPSB0ZW1wW2ldKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICUwMnggJTAyeFxuIiwgaSwgcnB0W2ldLCB0ZW1wW2ldKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGF2X2NhbWVsbGlhX2luaXQoY3MsIEtleVswXSwgMTI4KTsKKyAgICBtZW1jcHkoaXYsICJIQUxMTzEyM0hBTExPMTIzIiwgMTYpOworICAgIGF2X2NhbWVsbGlhX2NyeXB0KGNzLCB0ZW1wLCBycHQsIDIsIGl2LCAwKTsKKyAgICBtZW1jcHkoaXYsICJIQUxMTzEyM0hBTExPMTIzIiwgMTYpOworICAgIGF2X2NhbWVsbGlhX2NyeXB0KGNzLCB0ZW1wLCB0ZW1wLCAyLCBpdiwgMSk7CisgICAgZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKyAgICAgICAgaWYgKHJwdFtpXSAhPSB0ZW1wW2ldKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCBycHRbaV0sIHRlbXBbaV0pOworICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlKGNzKTsKKyAgICByZXR1cm4gZXJyOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL2Nhc3Q1LmMgYi9saWJhdnV0aWwvdGVzdHMvY2FzdDUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTNhYTgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL2Nhc3Q1LmMKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ0FTVDEyOCBhbGdvcml0aG0gYXMgbWVudGlvbmVkIGluIFJGQzIxNDQKKyAqIENvcHlyaWdodCAoYykgMjAxNCBTdXByYWphIE1lZWRpbnRpCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2FzdDUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IEtleVszXVsxNl0gPSB7CisgICAgICAgIHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDEyLCAweDM0LCAweDU2LCAweDc4LCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweDM0LCAweDU2LCAweDc4LCAweDlhfSwKKyAgICAgICAgezB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4MjMsIDB4NDV9LAorICAgICAgICB7MHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHgxMn0KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHJwdFs4XSA9IHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmfTsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCByY3RbM11bOF0gPSB7CisgICAgICAgIHsweDIzLCAweDhiLCAweDRmLCAweGU1LCAweDg0LCAweDdlLCAweDQ0LCAweGIyfSwKKyAgICAgICAgezB4ZWIsIDB4NmEsIDB4NzEsIDB4MWEsIDB4MmMsIDB4MDIsIDB4MjcsIDB4MWJ9LAorICAgICAgICB7MHg3YSwgMHhjOCwgMHgxNiwgMHhkMSwgMHg2ZSwgMHg5YiwgMHgzMCwgMHgyZX0KKyAgICB9OworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IHJjdDJbMl1bMTZdID0geworICAgICAgICB7MHhlZSwgMHhhOSwgMHhkMCwgMHhhMiwgMHg0OSwgMHhmZCwgMHgzYiwgMHhhNiwgMHhiMywgMHg0MywgMHg2ZiwgMHhiOCwgMHg5ZCwgMHg2ZCwgMHhjYSwgMHg5Mn0sCisgICAgICAgIHsweGIyLCAweGM5LCAweDVlLCAweGIwLCAweDBjLCAweDMxLCAweGFkLCAweDcxLCAweDgwLCAweGFjLCAweDA1LCAweGI4LCAweGU4LCAweDNkLCAweDY5LCAweDZlfQorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgaXZbOF0gPSB7MHhlZSwgMHhhOSwgMHhkMCwgMHhhMiwgMHg0OSwgMHhmZCwgMHgzYiwgMHhhNn07CisgICAgc3RhdGljIHVpbnQ4X3QgcnB0MlsyXVsxNl07CisgICAgaW50IGksIGosIGVyciA9IDA7CisgICAgc3RhdGljIGNvbnN0IGludCBrZXlfYml0c1szXSA9IHsxMjgsIDgwLCA0MH07CisgICAgdWludDhfdCB0ZW1wWzhdOworICAgIHN0cnVjdCBBVkNBU1Q1ICpjczsKKyAgICBjcyA9IGF2X2Nhc3Q1X2FsbG9jKCk7CisgICAgaWYgKCFjcykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKyl7CisKKyAgICAgICAgYXZfY2FzdDVfaW5pdChjcywgS2V5W2pdLCBrZXlfYml0c1tqXSk7CisgICAgICAgIGF2X2Nhc3Q1X2NyeXB0KGNzLCB0ZW1wLCBycHQsIDEsIDApOworICAgICAgICBmb3IgKGkgPSAwO2kgPCA4OyBpKyspeworICAgICAgICAgICAgaWYgKHJjdFtqXVtpXSAhPSB0ZW1wW2ldKXsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCByY3Rbal1baV0sIHRlbXBbaV0pOworICAgICAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhdl9jYXN0NV9jcnlwdChjcywgdGVtcCwgcmN0W2pdLCAxLCAxKTsKKyAgICAgICAgZm9yIChpID0wOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAocnB0W2ldICE9IHRlbXBbaV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCBycHRbaV0sIHRlbXBbaV0pOworICAgICAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbWVtY3B5KHJwdDJbMF0sIEtleVswXSwgMTYpOworICAgIG1lbWNweShycHQyWzFdLCBLZXlbMF0sIDE2KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDAwMDsgaSsrKXsKKyAgICAgICAgYXZfY2FzdDVfaW5pdChjcywgcnB0MlsxXSwgMTI4KTsKKyAgICAgICAgYXZfY2FzdDVfY3J5cHQoY3MsIHJwdDJbMF0sIHJwdDJbMF0sIDIsIDApOworICAgICAgICBhdl9jYXN0NV9pbml0KGNzLCBycHQyWzBdLCAxMjgpOworICAgICAgICBhdl9jYXN0NV9jcnlwdChjcywgcnB0MlsxXSwgcnB0MlsxXSwgMiwgMCk7CisgICAgfQorICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChyY3QyW2pdW2ldICE9IHJwdDJbal1baV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCByY3QyW2pdW2ldLCBycHQyW2pdW2ldKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKworICAgICAgICBhdl9jYXN0NV9pbml0KGNzLCBLZXlbal0sIGtleV9iaXRzW2pdKTsKKyAgICAgICAgbWVtY3B5KHRlbXAsIGl2LCA4KTsKKyAgICAgICAgYXZfY2FzdDVfY3J5cHQyKGNzLCBycHQyWzBdLCByY3QyWzBdLCAyLCB0ZW1wLCAwKTsKKyAgICAgICAgbWVtY3B5KHRlbXAsIGl2LCA4KTsKKyAgICAgICAgYXZfY2FzdDVfY3J5cHQyKGNzLCBycHQyWzBdLCBycHQyWzBdLCAyLCB0ZW1wLCAxKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChyY3QyWzBdW2ldICE9IHJwdDJbMF1baV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCByY3QyWzBdW2ldLCBycHQyWzBdW2ldKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWUoY3MpOworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvY29sb3JfdXRpbHMuYyBiL2xpYmF2dXRpbC90ZXN0cy9jb2xvcl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMDEyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvY29sb3JfdXRpbHMuYwpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1IEtldmluIFdoZWF0bGV5IDxrZXZpbi5qLndoZWF0bGV5QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb2xvcl91dGlscy5jIgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICBpbnQgaSwgajsKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSB0ZXN0X2RhdGFbXSA9IHsKKyAgICAgIC0wLjEsIC0wLjAxODA1Mzk2ODUxMDgwNywgLTAuMDEsIC0wLjAwNDQ5LCAwLjAsIDAuMDAzMTYyMjc3NjAsIDAuMDA1LAorICAgICAgMC4wMDksIDAuMDE1LCAwLjEsIDEuMCwgNTIuMzcsIDEyNS4wOTg3NjUsIDE5OTkuMTExMjMsIDY5NDUuNDQzLAorICAgICAgMTUxMjMuNDU2NywgMTk4NDUuODg5MjMsIDk4Njc4LjQyMzEsIDk5OTk5Ljg5OTk5OAorICB9OworCisgIGZvcihpID0gMDsgaSA8IEFWQ09MX1RSQ19OQjsgaSsrKSB7CisgICAgICBhdnByaXZfdHJjX2Z1bmN0aW9uIGZ1bmMgPSBhdnByaXZfZ2V0X3RyY19mdW5jdGlvbl9mcm9tX3RyYyhpKTsKKyAgICAgIGZvcihqID0gMDsgaiA8IEZGX0FSUkFZX0VMRU1TKHRlc3RfZGF0YSk7IGorKykgeworICAgICAgICAgIGlmKGZ1bmMgIT0gTlVMTCkgeworICAgICAgICAgICAgICBkb3VibGUgcmVzdWx0ID0gZnVuYyh0ZXN0X2RhdGFbal0pOworICAgICAgICAgICAgICBwcmludGYoIkFWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPSVkIGNhbGxpbmcgZnVuYyglZikgZXhwZWN0ZWQ9JWZcbiIsCisgICAgICAgICAgICAgICAgICAgICBpLCB0ZXN0X2RhdGFbal0sIHJlc3VsdCk7CisgICAgICAgICAgfQorICAgICAgfQorICB9CisKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9jcHUuYyBiL2xpYmF2dXRpbC90ZXN0cy9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTQ1YjcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL2NwdS5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2c3RyaW5nLmgiCisKKyNpZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKyNpZiAhSEFWRV9HRVRPUFQKKyNpbmNsdWRlICJjb21wYXQvZ2V0b3B0LmMiCisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgaW50IGZsYWc7CisgICAgY29uc3QgY2hhciAqbmFtZTsKK30gY3B1X2ZsYWdfdGFiW10gPSB7CisjaWYgICBBUkNIX0FBUkNINjQKKyAgICB7IEFWX0NQVV9GTEFHX0FSTVY4LCAgICAgImFybXY4IiAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19ORU9OLCAgICAgICJuZW9uIiAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfVkZQLCAgICAgICAidmZwIiAgICAgICAgfSwKKyNlbGlmIEFSQ0hfQVJNCisgICAgeyBBVl9DUFVfRkxBR19BUk1WNVRFLCAgICJhcm12NXRlIiAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfQVJNVjYsICAgICAiYXJtdjYiICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0FSTVY2VDIsICAgImFybXY2dDIiICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19WRlAsICAgICAgICJ2ZnAiICAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfVkZQX1ZNLCAgICAidmZwX3ZtIiAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX1ZGUFYzLCAgICAgInZmcHYzIiAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19ORU9OLCAgICAgICJuZW9uIiAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfU0VURU5ELCAgICAic2V0ZW5kIiAgICAgfSwKKyNlbGlmIEFSQ0hfUFBDCisgICAgeyBBVl9DUFVfRkxBR19BTFRJVkVDLCAgICJhbHRpdmVjIiAgICB9LAorI2VsaWYgQVJDSF9YODYKKyAgICB7IEFWX0NQVV9GTEFHX01NWCwgICAgICAgIm1teCIgICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19NTVhFWFQsICAgICJtbXhleHQiICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfU1NFLCAgICAgICAic3NlIiAgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX1NTRTIsICAgICAgInNzZTIiICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19TU0UyU0xPVywgICJzc2Uyc2xvdyIgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfU1NFMywgICAgICAic3NlMyIgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX1NTRTNTTE9XLCAgInNzZTNzbG93IiAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19TU1NFMywgICAgICJzc3NlMyIgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfQVRPTSwgICAgICAiYXRvbSIgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX1NTRTQsICAgICAgInNzZTQuMSIgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19TU0U0MiwgICAgICJzc2U0LjIiICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfQVZYLCAgICAgICAiYXZ4IiAgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0FWWFNMT1csICAgImF2eHNsb3ciICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19YT1AsICAgICAgICJ4b3AiICAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfRk1BMywgICAgICAiZm1hMyIgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0ZNQTQsICAgICAgImZtYTQiICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR18zRE5PVywgICAgICIzZG5vdyIgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfM0ROT1dFWFQsICAiM2Rub3dleHQiICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0NNT1YsICAgICAgImNtb3YiICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19BVlgyLCAgICAgICJhdngyIiAgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfQk1JMSwgICAgICAiYm1pMSIgICAgICAgfSwKKyAgICB7IEFWX0NQVV9GTEFHX0JNSTIsICAgICAgImJtaTIiICAgICAgIH0sCisgICAgeyBBVl9DUFVfRkxBR19BRVNOSSwgICAgICJhZXNuaSIgICAgICB9LAorICAgIHsgQVZfQ1BVX0ZMQUdfQVZYNTEyLCAgICAiYXZ4NTEyIiAgICAgfSwKKyNlbmRpZgorICAgIHsgMCB9Cit9OworCitzdGF0aWMgdm9pZCBwcmludF9jcHVfZmxhZ3MoaW50IGNwdV9mbGFncywgY29uc3QgY2hhciAqdHlwZSkKK3sKKyAgICBpbnQgaTsKKworICAgIHByaW50ZigiY3B1X2ZsYWdzKCVzKSA9IDB4JTA4WFxuIiwgdHlwZSwgY3B1X2ZsYWdzKTsKKyAgICBwcmludGYoImNwdV9mbGFnc19zdHIoJXMpID0iLCB0eXBlKTsKKyAgICBmb3IgKGkgPSAwOyBjcHVfZmxhZ190YWJbaV0uZmxhZzsgaSsrKQorICAgICAgICBpZiAoY3B1X2ZsYWdzICYgY3B1X2ZsYWdfdGFiW2ldLmZsYWcpCisgICAgICAgICAgICBwcmludGYoIiAlcyIsIGNwdV9mbGFnX3RhYltpXS5uYW1lKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCBjcHVfZmxhZ3NfcmF3ID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGludCBjcHVfZmxhZ3NfZWZmOworICAgIGludCBjcHVfY291bnQgPSBhdl9jcHVfY291bnQoKTsKKyAgICBjaGFyIHRocmVhZHNbNV0gPSAiYXV0byI7CisgICAgaW50IGk7CisKKyAgICBmb3IoaSA9IDA7IGNwdV9mbGFnX3RhYltpXS5mbGFnOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgdG1wID0gMDsKKyAgICAgICAgaWYgKGF2X3BhcnNlX2NwdV9jYXBzKCZ0bXAsIGNwdV9mbGFnX3RhYltpXS5uYW1lKSA8IDApIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGFibGUgbWlzc2luZyAlc1xuIiwgY3B1X2ZsYWdfdGFiW2ldLm5hbWUpOworICAgICAgICAgICAgcmV0dXJuIDQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY3B1X2ZsYWdzX3JhdyA8IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiYzp0OiIpOworICAgICAgICBpZiAoYyA9PSAtMSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgY2FzZSAnYyc6CisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgICAgICAgICAgaWYgKGF2X3BhcnNlX2NwdV9jYXBzKCZmbGFncywgb3B0YXJnKSA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisKKyAgICAgICAgICAgIGF2X2ZvcmNlX2NwdV9mbGFncyhmbGFncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbiA9IGF2X3N0cmxjcHkodGhyZWFkcywgb3B0YXJnLCBzaXplb2YodGhyZWFkcykpOworICAgICAgICAgICAgaWYgKGxlbiA+PSBzaXplb2YodGhyZWFkcykpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgdGhyZWFkIGNvdW50ICclcydcbiIsIG9wdGFyZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNwdV9mbGFnc19lZmYgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoY3B1X2ZsYWdzX2VmZiA8IDApCisgICAgICAgIHJldHVybiAzOworCisgICAgcHJpbnRfY3B1X2ZsYWdzKGNwdV9mbGFnc19yYXcsICJyYXciKTsKKyAgICBwcmludF9jcHVfZmxhZ3MoY3B1X2ZsYWdzX2VmZiwgImVmZmVjdGl2ZSIpOworICAgIHByaW50ZigidGhyZWFkcyA9ICVzIChjcHVfY291bnQgPSAlZClcbiIsIHRocmVhZHMsIGNwdV9jb3VudCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9jcHVfaW5pdC5jIGIvbGliYXZ1dGlsL3Rlc3RzL2NwdV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3OWU0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9jcHVfaW5pdC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworLyoKKyAqIFRoaXMgdGVzdCBwcm9ncmFtIHRlc3RzIHdoZXRoZXIgdGhlIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIGluCisgKiBhdl9nZXRfY3B1X2ZsYWdzKCkgaGFzIGRhdGEgcmFjZXMuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RocmVhZC5oIgorCitzdGF0aWMgdm9pZCAqdGhyZWFkX21haW4odm9pZCAqYXJnKQoreworICAgIGludCAqZmxhZ3MgPSBhcmc7CisKKyAgICAqZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGNwdV9mbGFnczE7CisgICAgaW50IGNwdV9mbGFnczI7CisgICAgaW50IHJldDsKKyAgICBwdGhyZWFkX3QgdGhyZWFkMTsKKyAgICBwdGhyZWFkX3QgdGhyZWFkMjsKKworICAgIGlmICgocmV0ID0gcHRocmVhZF9jcmVhdGUoJnRocmVhZDEsIE5VTEwsIHRocmVhZF9tYWluLCAmY3B1X2ZsYWdzMSkpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAicHRocmVhZF9jcmVhdGUgZmFpbGVkOiAlcy5cbiIsIHN0cmVycm9yKHJldCkpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgaWYgKChyZXQgPSBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkMiwgTlVMTCwgdGhyZWFkX21haW4sICZjcHVfZmxhZ3MyKSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJwdGhyZWFkX2NyZWF0ZSBmYWlsZWQ6ICVzLlxuIiwgc3RyZXJyb3IocmV0KSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBwdGhyZWFkX2pvaW4odGhyZWFkMSwgTlVMTCk7CisgICAgcHRocmVhZF9qb2luKHRocmVhZDIsIE5VTEwpOworCisgICAgaWYgKGNwdV9mbGFnczEgPCAwKQorICAgICAgICByZXR1cm4gMjsKKyAgICBpZiAoY3B1X2ZsYWdzMiA8IDApCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChjcHVfZmxhZ3MxICE9IGNwdV9mbGFnczIpCisgICAgICAgIHJldHVybiAzOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvY3JjLmMgYi9saWJhdnV0aWwvdGVzdHMvY3JjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEzYWFkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9jcmMuYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NyYy5oIgorCitpbnQgbWFpbih2b2lkKQoreworICAgIHVpbnQ4X3QgYnVmWzE5OTldOworICAgIGludCBpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBwWzddWzNdID0geworICAgICAgICB7IEFWX0NSQ18zMl9JRUVFX0xFLCAweEVEQjg4MzIwLCAweDNENUNERDA0IH0sCisgICAgICAgIHsgQVZfQ1JDXzMyX0lFRUUgICAsIDB4MDRDMTFEQjcsIDB4QzBGNUJBRTAgfSwKKyAgICAgICAgeyBBVl9DUkNfMjRfSUVFRSAgICwgMHg4NjRDRkIgICwgMHhCNzA0Q0UgICB9LAorICAgICAgICB7IEFWX0NSQ18xNl9BTlNJX0xFLCAweEEwMDEgICAgLCAweEJGRDggICAgIH0sCisgICAgICAgIHsgQVZfQ1JDXzE2X0FOU0kgICAsIDB4ODAwNSAgICAsIDB4MUZCQiAgICAgfSwKKyAgICAgICAgeyBBVl9DUkNfOF9BVE0gICAgICwgMHgwNyAgICAgICwgMHhFMyAgICAgICB9LAorICAgICAgICB7IEFWX0NSQ184X0VCVSAgICAgLCAweDFEICAgICAgLCAweEQ2ICAgICAgIH0sCisgICAgfTsKKyAgICBjb25zdCBBVkNSQyAqY3R4OworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihidWYpOyBpKyspCisgICAgICAgIGJ1ZltpXSA9IGkgKyBpICogaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKyAgICAgICAgY3R4ID0gYXZfY3JjX2dldF90YWJsZShwW2ldWzBdKTsKKyAgICAgICAgcHJpbnRmKCJjcmMgJTA4WCA9ICVYXG4iLCBwW2ldWzFdLCBhdl9jcmMoY3R4LCAwLCBidWYsIHNpemVvZihidWYpKSk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL2Rlcy5jIGIvbGliYXZ1dGlsL3Rlc3RzL2Rlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTVjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvZGVzLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lci5oIgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Rlcy5jIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC90aW1lLmgiCisKK3N0YXRpYyB1aW50NjRfdCByYW5kNjQodm9pZCkKK3sKKyAgICB1aW50NjRfdCByID0gcmFuZCgpOworICAgIHIgPSAociA8PCAzMikgfCByYW5kKCk7CisgICAgcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRlc3Rfa2V5W10gPSB7IDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsIDB4OWEsIDB4YmMsIDB4ZGUsIDB4ZjAgfTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgcGxhaW4pW10gPSB7IDB4ZmUsIDB4ZGMsIDB4YmEsIDB4OTgsIDB4NzYsIDB4NTQsIDB4MzIsIDB4MTAgfTsKK3N0YXRpYyBjb25zdCBERUNMQVJFX0FMSUdORUQoOCwgdWludDhfdCwgY3J5cHRfcmVmKVtdID0geyAweDRhLCAweGI2LCAweDViLCAweDNkLCAweDRiLCAweDA2LCAweDE1LCAweDE4IH07CitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIHRtcClbOF07CitzdGF0aWMgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ4X3QsIGxhcmdlX2J1ZmZlcilbMTAwMDJdWzhdOworc3RhdGljIGNvbnN0IHVpbnQ4X3QgY2JjX2tleVtdID0geworICAgIDB4MDEsIDB4MjMsIDB4NDUsIDB4NjcsIDB4ODksIDB4YWIsIDB4Y2QsIDB4ZWYsCisgICAgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhhYiwgMHhjZCwgMHhlZiwgMHgwMSwKKyAgICAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAweDAxLCAweDIzCit9OworCitzdGF0aWMgaW50IHJ1bl90ZXN0KGludCBjYmMsIGludCBkZWNyeXB0KQoreworICAgIEFWREVTIGQ7CisgICAgaW50IGRlbGF5ID0gY2JjICYmICFkZWNyeXB0ID8gMiA6IDE7CisgICAgdWludDY0X3QgcmVzOworICAgIEFWX1dCNjQobGFyZ2VfYnVmZmVyWzBdLCAweDRlNmY3NzIwNjk3MzIwNzRVTEwpOworICAgIEFWX1dCNjQobGFyZ2VfYnVmZmVyWzFdLCAweDEyMzQ1Njc4OTBhYmNkZWZVTEwpOworICAgIEFWX1dCNjQodG1wLCAgICAgICAgICAgICAweDEyMzQ1Njc4OTBhYmNkZWZVTEwpOworICAgIGF2X2Rlc19pbml0KCZkLCBjYmNfa2V5LCAxOTIsIGRlY3J5cHQpOworICAgIGF2X2Rlc19jcnlwdCgmZCwgbGFyZ2VfYnVmZmVyW2RlbGF5XSwgbGFyZ2VfYnVmZmVyWzBdLCAxMDAwMCwgY2JjID8gdG1wIDogTlVMTCwgZGVjcnlwdCk7CisgICAgcmVzID0gQVZfUkI2NChsYXJnZV9idWZmZXJbOTk5OSArIGRlbGF5XSk7CisgICAgaWYgKGNiYykgeworICAgICAgICBpZiAoZGVjcnlwdCkKKyAgICAgICAgICAgIHJldHVybiByZXMgPT0gMHhjNWNlY2Y2M2VjZWM1MTRjVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcmVzID09IDB4Y2IxOTFmODVkMWVkODQzOVVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGVjcnlwdCkKKyAgICAgICAgICAgIHJldHVybiByZXMgPT0gMHg4MzI1Mzk3NjQ0MDkxYTBhVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gcmVzID09IDB4ZGQxN2U4YjhiNDM3ZDIzMlVMTDsKKyAgICB9Cit9CisKK3VuaW9uIHdvcmRfYnl0ZSB7CisgICAgdWludDY0X3Qgd29yZDsKKyAgICB1aW50OF90IGJ5dGVbOF07Cit9OworCitpbnQgbWFpbih2b2lkKQoreworICAgIEFWREVTIGQ7CisgICAgaW50IGk7CisgICAgdW5pb24gd29yZF9ieXRlIGtleVszXSwgZGF0YSwgY3Q7CisgICAgdWludDY0X3Qgcm91bmRrZXlzWzE2XTsKKyAgICBzcmFuZChhdl9nZXR0aW1lKCkpOworICAgIGtleVswXS53b3JkID0gQVZfUkI2NCh0ZXN0X2tleSk7CisgICAgZGF0YS53b3JkICAgPSBBVl9SQjY0KHBsYWluKTsKKyAgICBnZW5fcm91bmRrZXlzKHJvdW5ka2V5cywga2V5WzBdLndvcmQpOworICAgIGlmIChkZXNfZW5jZGVjKGRhdGEud29yZCwgcm91bmRrZXlzLCAwKSAhPSBBVl9SQjY0KGNyeXB0X3JlZikpIHsKKyAgICAgICAgcHJpbnRmKCJUZXN0IDEgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGF2X2Rlc19pbml0KCZkLCB0ZXN0X2tleSwgNjQsIDApOworICAgIGF2X2Rlc19jcnlwdCgmZCwgdG1wLCBwbGFpbiwgMSwgTlVMTCwgMCk7CisgICAgaWYgKG1lbWNtcCh0bXAsIGNyeXB0X3JlZiwgc2l6ZW9mKGNyeXB0X3JlZikpKSB7CisgICAgICAgIHByaW50ZigiUHVibGljIEFQSSBkZWNyeXB0aW9uIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoIXJ1bl90ZXN0KDAsIDApIHx8ICFydW5fdGVzdCgwLCAxKSB8fCAhcnVuX3Rlc3QoMSwgMCkgfHwgIXJ1bl90ZXN0KDEsIDEpKSB7CisgICAgICAgIHByaW50ZigiUGFydGlhbCBNb250ZS1DYXJsbyB0ZXN0IGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIGtleVswXS53b3JkID0gcmFuZDY0KCk7CisgICAgICAgIGtleVsxXS53b3JkID0gcmFuZDY0KCk7CisgICAgICAgIGtleVsyXS53b3JkID0gcmFuZDY0KCk7CisgICAgICAgIGRhdGEud29yZCAgID0gcmFuZDY0KCk7CisgICAgICAgIGF2X2Rlc19pbml0KCZkLCBrZXlbMF0uYnl0ZSwgMTkyLCAwKTsKKyAgICAgICAgYXZfZGVzX2NyeXB0KCZkLCBjdC5ieXRlLCBkYXRhLmJ5dGUsIDEsIE5VTEwsIDApOworICAgICAgICBhdl9kZXNfaW5pdCgmZCwga2V5WzBdLmJ5dGUsIDE5MiwgMSk7CisgICAgICAgIGF2X2Rlc19jcnlwdCgmZCwgY3QuYnl0ZSwgY3QuYnl0ZSwgMSwgTlVMTCwgMSk7CisgICAgICAgIGlmIChjdC53b3JkICE9IGRhdGEud29yZCkgeworICAgICAgICAgICAgcHJpbnRmKCJUZXN0IDIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorI2lmZGVmIEdFTlRBQkxFUworICAgIHByaW50Zigic3RhdGljIGNvbnN0IHVpbnQzMl90IFNfYm94ZXNfUF9zaHVmZmxlWzhdWzY0XSA9IHtcbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIHByaW50ZigiICAgIHsiKTsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDY0OyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHYgPSBTX2JveGVzW2ldW2ogPj4gMV07CisgICAgICAgICAgICB2ICAgPSBqICYgMSA/IHYgPj4gNCA6IHYgJiAweGY7CisgICAgICAgICAgICB2IDw8PSAyOCAtIDQgKiBpOworICAgICAgICAgICAgdiAgID0gc2h1ZmZsZSh2LCBQX3NodWZmbGUsIHNpemVvZihQX3NodWZmbGUpKTsKKyAgICAgICAgICAgIHByaW50ZigoaiAmIDcpID09IDAgPyAiXG4gICAgIiA6ICIgIik7CisgICAgICAgICAgICBwcmludGYoIjB4JTA4WCwiLCB2KTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuICAgIH0sXG4iKTsKKyAgICB9CisgICAgcHJpbnRmKCJ9O1xuIik7CisjZW5kaWYKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9kaWN0LmMgYi9saWJhdnV0aWwvdGVzdHMvZGljdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTk4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvZGljdC5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogY29weXJpZ2h0IChjKSAyMDA5IE1pY2hhZWwgTmllZGVybWF5ZXIKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9kaWN0LmMiCisKK3N0YXRpYyB2b2lkIHByaW50X2RpY3QoY29uc3QgQVZEaWN0aW9uYXJ5ICptKQoreworICAgIEFWRGljdGlvbmFyeUVudHJ5ICp0ID0gTlVMTDsKKyAgICB3aGlsZSAoKHQgPSBhdl9kaWN0X2dldChtLCAiIiwgdCwgQVZfRElDVF9JR05PUkVfU1VGRklYKSkpCisgICAgICAgIHByaW50ZigiJXMgJXMgICAiLCB0LT5rZXksIHQtPnZhbHVlKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2VwYXJhdG9ycyhjb25zdCBBVkRpY3Rpb25hcnkgKm0sIGNvbnN0IGNoYXIgcGFpciwgY29uc3QgY2hhciB2YWwpCit7CisgICAgQVZEaWN0aW9uYXJ5ICpkaWN0ID0gTlVMTDsKKyAgICBjaGFyIHBhaXJzW10gPSB7cGFpciAsICdcMCd9OworICAgIGNoYXIgdmFsc1tdICA9IHt2YWwsICdcMCd9OworCisgICAgY2hhciAqYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgcmV0OworCisgICAgYXZfZGljdF9jb3B5KCZkaWN0LCBtLCAwKTsKKyAgICBwcmludF9kaWN0KGRpY3QpOworICAgIGF2X2RpY3RfZ2V0X3N0cmluZyhkaWN0LCAmYnVmZmVyLCB2YWwsIHBhaXIpOworICAgIHByaW50ZigiJXNcbiIsIGJ1ZmZlcik7CisgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKKyAgICByZXQgPSBhdl9kaWN0X3BhcnNlX3N0cmluZygmZGljdCwgYnVmZmVyLCB2YWxzLCBwYWlycywgMCk7CisgICAgcHJpbnRmKCJyZXQgJWRcbiIsIHJldCk7CisgICAgYXZfZnJlZXAoJmJ1ZmZlcik7CisgICAgcHJpbnRfZGljdChkaWN0KTsKKyAgICBhdl9kaWN0X2ZyZWUoJmRpY3QpOworfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIEFWRGljdGlvbmFyeSAqZGljdCA9IE5VTEw7CisgICAgQVZEaWN0aW9uYXJ5RW50cnkgKmU7CisgICAgY2hhciAqYnVmZmVyID0gTlVMTDsKKworICAgIHByaW50ZigiVGVzdGluZyBhdl9kaWN0X2dldF9zdHJpbmcoKSBhbmQgYXZfZGljdF9wYXJzZV9zdHJpbmcoKVxuIik7CisgICAgYXZfZGljdF9nZXRfc3RyaW5nKGRpY3QsICZidWZmZXIsICc9JywgJywnKTsKKyAgICBwcmludGYoIiVzXG4iLCBidWZmZXIpOworICAgIGF2X2ZyZWVwKCZidWZmZXIpOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiYWFhIiwgImFhYSIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiYixiIiwgImJiYiIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiYz1jIiwgImNjYyIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZGRkIiwgImQsZCIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZWVlIiwgImU9ZSIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZixmIiwgImY9ZiIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZz1nIiwgImcsZyIsIDApOworICAgIHRlc3Rfc2VwYXJhdG9ycyhkaWN0LCAnLCcsICc9Jyk7CisgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImFhYSIsICJhYWEiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImJiYiIsICJiYmIiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImNjYyIsICJjY2MiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgIlxcLD1cJ1wiIiwgIlxcLD1cJ1wiIiwgMCk7CisgICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICciJywgICc9Jyk7CisgICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICdcJycsICc9Jyk7CisgICAgdGVzdF9zZXBhcmF0b3JzKGRpY3QsICcsJywgJyInKTsKKyAgICB0ZXN0X3NlcGFyYXRvcnMoZGljdCwgJywnLCAnXCcnKTsKKyAgICB0ZXN0X3NlcGFyYXRvcnMoZGljdCwgJ1wnJywgJyInKTsKKyAgICB0ZXN0X3NlcGFyYXRvcnMoZGljdCwgJyInLCAnXCcnKTsKKyAgICBhdl9kaWN0X2ZyZWUoJmRpY3QpOworCisgICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfZGljdF9zZXQoKVxuIik7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJhIiwgImEiLCAwKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImIiLCBhdl9zdHJkdXAoImIiKSwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCBhdl9zdHJkdXAoImMiKSwgImMiLCBBVl9ESUNUX0RPTlRfU1RSRFVQX0tFWSk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsIGF2X3N0cmR1cCgiZCIpLCBhdl9zdHJkdXAoImQiKSwgQVZfRElDVF9ET05UX1NUUkRVUF9LRVkgfCBBVl9ESUNUX0RPTlRfU1RSRFVQX1ZBTCk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJlIiwgImUiLCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImUiLCAiZiIsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCAiZiIsICJmIiwgMCk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJmIiwgTlVMTCwgMCk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJmZiIsICJmIiwgMCk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsICJmZiIsICJmIiwgQVZfRElDVF9BUFBFTkQpOworICAgIGUgPSBOVUxMOworICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgcHJpbnRmKCIlcyAlc1xuIiwgZS0+a2V5LCBlLT52YWx1ZSk7CisgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKKworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCBOVUxMLCAiYSIsIDApOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCBOVUxMLCAiYiIsIDApOworICAgIGF2X2RpY3RfZ2V0KGRpY3QsIE5VTEwsIE5VTEwsIDApOworICAgIGUgPSBOVUxMOworICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgcHJpbnRmKCInJXMnICclcydcbiIsIGUtPmtleSwgZS0+dmFsdWUpOworICAgIGF2X2RpY3RfZnJlZSgmZGljdCk7CisKKworICAgIC8vdmFsZ3JpbmQgc2Vuc2libGUgdGVzdAorICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X2RpY3Rfc2V0X2ludCgpXG4iKTsKKyAgICBhdl9kaWN0X3NldF9pbnQoJmRpY3QsICIxIiwgMSwgQVZfRElDVF9ET05UX1NUUkRVUF9WQUwpOworICAgIGF2X2RpY3Rfc2V0X2ludCgmZGljdCwgYXZfc3RyZHVwKCIyIiksIDIsIEFWX0RJQ1RfRE9OVF9TVFJEVVBfS0VZKTsKKyAgICBhdl9kaWN0X3NldF9pbnQoJmRpY3QsIGF2X3N0cmR1cCgiMyIpLCAzLCBBVl9ESUNUX0RPTlRfU1RSRFVQX0tFWSB8IEFWX0RJQ1RfRE9OVF9TVFJEVVBfVkFMKTsKKyAgICBhdl9kaWN0X3NldF9pbnQoJmRpY3QsICI0IiwgNCwgMCk7CisgICAgYXZfZGljdF9zZXRfaW50KCZkaWN0LCAiNSIsIDUsIEFWX0RJQ1RfRE9OVF9PVkVSV1JJVEUpOworICAgIGF2X2RpY3Rfc2V0X2ludCgmZGljdCwgIjUiLCA2LCBBVl9ESUNUX0RPTlRfT1ZFUldSSVRFKTsKKyAgICBhdl9kaWN0X3NldF9pbnQoJmRpY3QsICIxMiIsIDEsIDApOworICAgIGF2X2RpY3Rfc2V0X2ludCgmZGljdCwgIjEyIiwgMiwgQVZfRElDVF9BUFBFTkQpOworICAgIGUgPSBOVUxMOworICAgIHdoaWxlICgoZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICIiLCBlLCBBVl9ESUNUX0lHTk9SRV9TVUZGSVgpKSkKKyAgICAgICAgcHJpbnRmKCIlcyAlc1xuIiwgZS0+a2V5LCBlLT52YWx1ZSk7CisgICAgYXZfZGljdF9mcmVlKCZkaWN0KTsKKworICAgIC8vdmFsZ3JpbmQgc2Vuc2libGUgdGVzdAorICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X2RpY3Rfc2V0KCkgd2l0aCBleGlzdGluZyBBVkRpY3Rpb25hcnlFbnRyeS5rZXkgYXMga2V5XG4iKTsKKyAgICBhdl9kaWN0X3NldCgmZGljdCwgImtleSIsICJvbGQiLCAwKTsKKyAgICBlID0gYXZfZGljdF9nZXQoZGljdCwgImtleSIsIE5VTEwsIDApOworICAgIGF2X2RpY3Rfc2V0KCZkaWN0LCBlLT5rZXksICJuZXcgdmFsIE9LIiwgMCk7CisgICAgZSA9IGF2X2RpY3RfZ2V0KGRpY3QsICJrZXkiLCBOVUxMLCAwKTsKKyAgICBwcmludGYoIiVzXG4iLCBlLT52YWx1ZSk7CisgICAgYXZfZGljdF9zZXQoJmRpY3QsIGUtPmtleSwgZS0+dmFsdWUsIDApOworICAgIGUgPSBhdl9kaWN0X2dldChkaWN0LCAia2V5IiwgTlVMTCwgMCk7CisgICAgcHJpbnRmKCIlc1xuIiwgZS0+dmFsdWUpOworICAgIGF2X2RpY3RfZnJlZSgmZGljdCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9kaXNwbGF5LmMgYi9saWJhdnV0aWwvdGVzdHMvZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5M2ViYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvZGlzcGxheS5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgVml0dG9yaW8gR2lvdmFyYSA8dml0dG9yaW8uZ2lvdmFyYUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvZGlzcGxheS5jIgorCitzdGF0aWMgdm9pZCBwcmludF9tYXRyaXgoaW50MzJfdCBtYXRyaXhbOV0pCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCAzIC0gMTsgKytqKQorICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBtYXRyaXhbaSozICsgal0pOworCisgICAgICAgIHByaW50ZigiJWRcbiIsIG1hdHJpeFtpKjMgKyBqXSk7CisgICAgfQorfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludDMyX3QgbWF0cml4WzldOworCisgICAgLy8gU2V0IHRoZSBtYXRyaXggdG8gOTAgZGVncmVlcworICAgIGF2X2Rpc3BsYXlfcm90YXRpb25fc2V0KG1hdHJpeCwgOTApOworICAgIHByaW50X21hdHJpeChtYXRyaXgpOworICAgIHByaW50ZigiZGVncmVlczogJWZcbiIsIGF2X2Rpc3BsYXlfcm90YXRpb25fZ2V0KG1hdHJpeCkpOworCisgICAgLy8gU2V0IHRoZSBtYXRyaXggdG8gLTQ1IGRlZ3JlZXMKKyAgICBhdl9kaXNwbGF5X3JvdGF0aW9uX3NldChtYXRyaXgsIC00NSk7CisgICAgcHJpbnRfbWF0cml4KG1hdHJpeCk7CisgICAgcHJpbnRmKCJkZWdyZWVzOiAlZlxuIiwgYXZfZGlzcGxheV9yb3RhdGlvbl9nZXQobWF0cml4KSk7CisKKyAgICAvLyBmbGlwIGhvcml6b250YWwKKyAgICBhdl9kaXNwbGF5X21hdHJpeF9mbGlwKG1hdHJpeCwgMSwgMCk7CisgICAgcHJpbnRfbWF0cml4KG1hdHJpeCk7CisgICAgcHJpbnRmKCJkZWdyZWVzOiAlZlxuIiwgYXZfZGlzcGxheV9yb3RhdGlvbl9nZXQobWF0cml4KSk7CisKKyAgICAvLyBmbGlwIHZlcnRpY2FsCisgICAgYXZfZGlzcGxheV9tYXRyaXhfZmxpcChtYXRyaXgsIDAsIDEpOworICAgIHByaW50X21hdHJpeChtYXRyaXgpOworICAgIHByaW50ZigiZGVncmVlczogJWZcbiIsIGF2X2Rpc3BsYXlfcm90YXRpb25fZ2V0KG1hdHJpeCkpOworCisgICAgcmV0dXJuIDA7CisKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9lcnJvci5jIGIvbGliYXZ1dGlsL3Rlc3RzL2Vycm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlZmM4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9lcnJvci5jCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9lcnJvci5jIgorCisjdW5kZWYgcHJpbnRmCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMoZXJyb3JfZW50cmllcyk7IGkrKykgeworICAgICAgICBjb25zdCBzdHJ1Y3QgZXJyb3JfZW50cnkgKmVudHJ5ID0gJmVycm9yX2VudHJpZXNbaV07CisgICAgICAgIHByaW50ZigiJWQ6ICVzIFslc11cbiIsIGVudHJ5LT5udW0sIGF2X2VycjJzdHIoZW50cnktPm51bSksIGVudHJ5LT50YWcpOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworICAgICAgICBwcmludGYoIiVkOiAlc1xuIiwgLWksIGF2X2VycjJzdHIoLWkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9ldmFsLmMgYi9saWJhdnV0aWwvdGVzdHMvZXZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NGM2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvZXZhbC5jCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xpYm0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXZhbC5oIgorCitzdGF0aWMgY29uc3QgZG91YmxlIGNvbnN0X3ZhbHVlc1tdID0geworICAgIE1fUEksCisgICAgTV9FLAorICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb25zdF9uYW1lc1tdID0geworICAgICJQSSIsCisgICAgIkUiLAorICAgIDAKK307CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaTsKKyAgICBkb3VibGUgZDsKKyAgICBjb25zdCBjaGFyICpjb25zdCAqZXhwcjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZXhwcnNbXSA9IHsKKyAgICAgICAgIiIsCisgICAgICAgICIxOzIiLAorICAgICAgICAiLTIwIiwKKyAgICAgICAgIi1QSSIsCisgICAgICAgICIrUEkiLAorICAgICAgICAiMSsoNS0yKV4oMy0xKSsxLzIrc2luKFBJKS1tYXgoLTIuMiwtMy4xKSIsCisgICAgICAgICI4MEcvODBHaSIsCisgICAgICAgICIxayIsCisgICAgICAgICIxR2kiLAorICAgICAgICAiMWdpIiwKKyAgICAgICAgIjFHaUZvbyIsCisgICAgICAgICIxaysxayIsCisgICAgICAgICIxR2kqM2ZvbyIsCisgICAgICAgICJmb28iLAorICAgICAgICAiZm9vKCIsCisgICAgICAgICJmb28oKSIsCisgICAgICAgICJmb28pIiwKKyAgICAgICAgInNpbiIsCisgICAgICAgICJzaW4oIiwKKyAgICAgICAgInNpbigpIiwKKyAgICAgICAgInNpbikiLAorICAgICAgICAic2luIDEwIiwKKyAgICAgICAgInNpbigxLDIsMykiLAorICAgICAgICAic2luKDEgKSIsCisgICAgICAgICIxIiwKKyAgICAgICAgIjFmb28iLAorICAgICAgICAiYmFyICsgUEkgKyBFICsgMTAwZioyICsgZm9vIiwKKyAgICAgICAgIjEzayArIDEyZiAtIGZvbygxLCAyKSIsCisgICAgICAgICIxZ2kiLAorICAgICAgICAiMUdpIiwKKyAgICAgICAgInN0KDAsIDEyMykiLAorICAgICAgICAic3QoMSwgMTIzKTsgbGQoMSkiLAorICAgICAgICAibHRlKDAsIDEpIiwKKyAgICAgICAgImx0ZSgxLCAxKSIsCisgICAgICAgICJsdGUoMSwgMCkiLAorICAgICAgICAibHQoMCwgMSkiLAorICAgICAgICAibHQoMSwgMSkiLAorICAgICAgICAiZ3QoMSwgMCkiLAorICAgICAgICAiZ3QoMiwgNykiLAorICAgICAgICAiZ3RlKDEyMiwgMTIyKSIsCisgICAgICAgIC8qIGNvbXB1dGUgMSsyKy4uLitOICovCisgICAgICAgICJzdCgwLCAxKTsgd2hpbGUobHRlKGxkKDApLCAxMDApLCBzdCgxLCBsZCgxKStsZCgwKSk7c3QoMCwgbGQoMCkrMSkpOyBsZCgxKSIsCisgICAgICAgIC8qIGNvbXB1dGUgRmliKE4pICovCisgICAgICAgICJzdCgxLCAxKTsgc3QoMiwgMik7IHN0KDAsIDEpOyB3aGlsZShsdGUobGQoMCksMTApLCBzdCgzLCBsZCgxKStsZCgyKSk7IHN0KDEsIGxkKDIpKTsgc3QoMiwgbGQoMykpOyBzdCgwLCBsZCgwKSsxKSk7IGxkKDMpIiwKKyAgICAgICAgIndoaWxlKDAsIDEwKSIsCisgICAgICAgICJzdCgwLCAxKTsgd2hpbGUobHRlKGxkKDApLDEwMCksIHN0KDEsIGxkKDEpK2xkKDApKTsgc3QoMCwgbGQoMCkrMSkpIiwKKyAgICAgICAgImlzbmFuKDEpIiwKKyAgICAgICAgImlzbmFuKE5BTikiLAorICAgICAgICAiaXNuYW4oSU5GKSIsCisgICAgICAgICJpc2luZigxKSIsCisgICAgICAgICJpc2luZihOQU4pIiwKKyAgICAgICAgImlzaW5mKElORikiLAorICAgICAgICAiZmxvb3IoTkFOKSIsCisgICAgICAgICJmbG9vcigxMjMuMTIzKSIsCisgICAgICAgICJmbG9vcigtMTIzLjEyMykiLAorICAgICAgICAidHJ1bmMoMTIzLjEyMykiLAorICAgICAgICAidHJ1bmMoLTEyMy4xMjMpIiwKKyAgICAgICAgImNlaWwoMTIzLjEyMykiLAorICAgICAgICAiY2VpbCgtMTIzLjEyMykiLAorICAgICAgICAic3FydCgxNzY0KSIsCisgICAgICAgICJpc25hbihzcXJ0KC0xKSkiLAorICAgICAgICAibm90KDEpIiwKKyAgICAgICAgIm5vdChOQU4pIiwKKyAgICAgICAgIm5vdCgwKSIsCisgICAgICAgICI2LjAyMDZkQiIsCisgICAgICAgICItMy4wMTAzZEIiLAorICAgICAgICAicG93KDAsMS4yMykiLAorICAgICAgICAicG93KFBJLDEuMjMpIiwKKyAgICAgICAgIlBJXjEuMjMiLAorICAgICAgICAicG93KC0xLDEuMjMpIiwKKyAgICAgICAgImlmKDEsIDIpIiwKKyAgICAgICAgImlmKDEsIDEsIDIpIiwKKyAgICAgICAgImlmKDAsIDEsIDIpIiwKKyAgICAgICAgImlmbm90KDAsIDIzKSIsCisgICAgICAgICJpZm5vdCgxLCBOYU4pICsgaWYoMCwgMSkiLAorICAgICAgICAiaWZub3QoMSwgMSwgMikiLAorICAgICAgICAiaWZub3QoMCwgMSwgMikiLAorICAgICAgICAidGF5bG9yKDEsIDEpIiwKKyAgICAgICAgInRheWxvcihlcShtb2QobGQoMSksNCksMSktZXEobW9kKGxkKDEpLDQpLDMpLCBQSS8yLCAxKSIsCisgICAgICAgICJyb290KHNpbihsZCgwKSktMSwgMikiLAorICAgICAgICAicm9vdChzaW4obGQoMCkpKzYrc2luKGxkKDApLzEyKS1sb2cobGQoMCkpLCAxMDApIiwKKyAgICAgICAgIjcwMDAwMDBCKnJhbmRvbSgwKSIsCisgICAgICAgICJzcXVpc2goMikiLAorICAgICAgICAiZ2F1c3MoMC4xKSIsCisgICAgICAgICJoeXBvdCg0LDMpIiwKKyAgICAgICAgImdjZCgzMCw1NSkqcHJpbnQobWluKDksMSkpIiwKKyAgICAgICAgImJpdG9yKDQyLCAxMikiLAorICAgICAgICAiYml0YW5kKDQyLCAxMikiLAorICAgICAgICAiYml0YW5kKE5BTiwgMSkiLAorICAgICAgICAiYmV0d2VlbigxMCwgLTMsIDEwKSIsCisgICAgICAgICJiZXR3ZWVuKC00LCAtMiwgLTEpIiwKKyAgICAgICAgImJldHdlZW4oMSwyKSIsCisgICAgICAgICJjbGlwKDAsIDIsIDEpIiwKKyAgICAgICAgImNsaXAoMC8wLCAxLCAyKSIsCisgICAgICAgICJjbGlwKDAsIDAvMCwgMSkiLAorICAgICAgICBOVUxMCisgICAgfTsKKyAgICBpbnQgcmV0OworCisgICAgZm9yIChleHByID0gZXhwcnM7ICpleHByOyBleHByKyspIHsKKyAgICAgICAgcHJpbnRmKCJFdmFsdWF0aW5nICclcydcbiIsICpleHByKTsKKyAgICAgICAgcmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmZCwgKmV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfbmFtZXMsIGNvbnN0X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAwLCBOVUxMKTsKKyAgICAgICAgaWYgKGlzbmFuKGQpKQorICAgICAgICAgICAgcHJpbnRmKCInJXMnIC0+IG5hblxuXG4iLCAqZXhwcik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiJyVzJyAtPiAlZlxuXG4iLCAqZXhwciwgZCk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcHJpbnRmKCJhdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZFxuIik7CisgICAgfQorCisgICAgcmV0ID0gYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCgmZCwgIjErKDUtMileKDMtMSkrMS8yK3NpbihQSSktbWF4KC0yLjIsLTMuMSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfbmFtZXMsIGNvbnN0X3ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOworICAgIHByaW50ZigiJWYgPT0gMTIuN1xuIiwgZCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHByaW50ZigiYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWRcbiIpOworICAgIHJldCA9IGF2X2V4cHJfcGFyc2VfYW5kX2V2YWwoJmQsICI4MEcvODBHaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9uYW1lcywgY29uc3RfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCwgTlVMTCk7CisgICAgcHJpbnRmKCIlZiA9PSAwLjkzMTMyMjU3NVxuIiwgZCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHByaW50ZigiYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWRcbiIpOworCisgICAgaWYgKGFyZ2MgPiAxICYmICFzdHJjbXAoYXJndlsxXSwgIi10IikpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwNTA7IGkrKykgeworICAgICAgICAgICAgU1RBUlRfVElNRVI7CisgICAgICAgICAgICByZXQgPSBhdl9leHByX3BhcnNlX2FuZF9ldmFsKCZkLCAiMSsoNS0yKV4oMy0xKSsxLzIrc2luKFBJKS1tYXgoLTIuMiwtMy4xKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X25hbWVzLCBjb25zdF92YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAsIE5VTEwpOworICAgICAgICAgICAgaWYgKHJldCA8IDApCisgICAgICAgICAgICAgICAgcHJpbnRmKCJhdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZFxuIik7CisgICAgICAgICAgICBTVE9QX1RJTUVSKCJhdl9leHByX3BhcnNlX2FuZF9ldmFsIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9maWZvLmMgYi9saWJhdnV0aWwvdGVzdHMvZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNTUwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvZmlmby5jCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWZvLmgiCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgLyogY3JlYXRlIGEgRklGTyBidWZmZXIgKi8KKyAgICBBVkZpZm9CdWZmZXIgKmZpZm8gPSBhdl9maWZvX2FsbG9jKDEzICogc2l6ZW9mKGludCkpOworICAgIGludCBpLCBqLCBuLCAqcDsKKworICAgIC8qIGZpbGwgZGF0YSAqLworICAgIGZvciAoaSA9IDA7IGF2X2ZpZm9fc3BhY2UoZmlmbykgPj0gc2l6ZW9mKGludCk7IGkrKykKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGZpZm8sICZpLCBzaXplb2YoaW50KSwgTlVMTCk7CisKKyAgICAvKiBwZWVrIGF0IEZJRk8gKi8KKyAgICBuID0gYXZfZmlmb19zaXplKGZpZm8pIC8gc2l6ZW9mKGludCk7CisgICAgZm9yIChpID0gLW4gKyAxOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCAqdiA9IChpbnQgKilhdl9maWZvX3BlZWsyKGZpZm8sIGkgKiBzaXplb2YoaW50KSk7CisgICAgICAgIHByaW50ZigiJWQ6ICVkXG4iLCBpLCAqdik7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKworICAgIC8qIHBlZWtfYXQgYXQgRklGTyAqLworICAgIG4gPSBhdl9maWZvX3NpemUoZmlmbykgLyBzaXplb2YoaW50KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19wZWVrX2F0KGZpZm8sICZqLCBpICogc2l6ZW9mKGludCksIHNpemVvZihqKSwgTlVMTCk7CisgICAgICAgIHByaW50ZigiJWQ6ICVkXG4iLCBpLCBqKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgLyogZ2VuZXJpYyBwZWVrIGF0IEZJRk8gKi8KKworICAgIG4gPSBhdl9maWZvX3NpemUoZmlmbyk7CisgICAgcCA9IG1hbGxvYyhuKTsKKyAgICBpZiAocCA9PSBOVUxMKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgICh2b2lkKSBhdl9maWZvX2dlbmVyaWNfcGVlayhmaWZvLCBwLCBuLCBOVUxMKTsKKworICAgIC8qIHJlYWQgZGF0YSBhdCBwICovCisgICAgbiAvPSBzaXplb2YoaW50KTsKKyAgICBmb3IoaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgIHByaW50ZigiJWQ6ICVkXG4iLCBpLCBwW2ldKTsKKworICAgIHB1dGNoYXIoJ1xuJyk7CisKKyAgICAvKiByZWFkIGRhdGEgKi8KKyAgICBmb3IgKGkgPSAwOyBhdl9maWZvX3NpemUoZmlmbykgPj0gc2l6ZW9mKGludCk7IGkrKykgeworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcmVhZChmaWZvLCAmaiwgc2l6ZW9mKGludCksIE5VTEwpOworICAgICAgICBwcmludGYoIiVkICIsIGopOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICAvKiB0ZXN0ICpuZHggb3ZlcmZsb3cgKi8KKyAgICBhdl9maWZvX3Jlc2V0KGZpZm8pOworICAgIGZpZm8tPnJuZHggPSBmaWZvLT53bmR4ID0gfih1aW50MzJfdCkwIC0gNTsKKworICAgIC8qIGZpbGwgZGF0YSAqLworICAgIGZvciAoaSA9IDA7IGF2X2ZpZm9fc3BhY2UoZmlmbykgPj0gc2l6ZW9mKGludCk7IGkrKykKKyAgICAgICAgYXZfZmlmb19nZW5lcmljX3dyaXRlKGZpZm8sICZpLCBzaXplb2YoaW50KSwgTlVMTCk7CisKKyAgICAvKiBwZWVrX2F0IGF0IEZJRk8gKi8KKyAgICBuID0gYXZfZmlmb19zaXplKGZpZm8pIC8gc2l6ZW9mKGludCk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworICAgICAgICBhdl9maWZvX2dlbmVyaWNfcGVla19hdChmaWZvLCAmaiwgaSAqIHNpemVvZihpbnQpLCBzaXplb2YoaiksIE5VTEwpOworICAgICAgICBwcmludGYoIiVkOiAlZFxuIiwgaSwgaik7CisgICAgfQorICAgIHB1dGNoYXIoJ1xuJyk7CisKKyAgICAvKiB0ZXN0IGZpZm9fZ3JvdyAqLworICAgICh2b2lkKSBhdl9maWZvX2dyb3coZmlmbywgMTUgKiBzaXplb2YoaW50KSk7CisKKyAgICAvKiBmaWxsIGRhdGEgKi8KKyAgICBuID0gYXZfZmlmb19zaXplKGZpZm8pIC8gc2l6ZW9mKGludCk7CisgICAgZm9yIChpID0gbjsgYXZfZmlmb19zcGFjZShmaWZvKSA+PSBzaXplb2YoaW50KTsgKytpKQorICAgICAgICBhdl9maWZvX2dlbmVyaWNfd3JpdGUoZmlmbywgJmksIHNpemVvZihpbnQpLCBOVUxMKTsKKworICAgIC8qIHBlZWtfYXQgYXQgRklGTyAqLworICAgIG4gPSBhdl9maWZvX3NpemUoZmlmbykgLyBzaXplb2YoaW50KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGF2X2ZpZm9fZ2VuZXJpY19wZWVrX2F0KGZpZm8sICZqLCBpICogc2l6ZW9mKGludCksIHNpemVvZihqKSwgTlVMTCk7CisgICAgICAgIHByaW50ZigiJWQ6ICVkXG4iLCBpLCBqKTsKKyAgICB9CisKKyAgICBhdl9maWZvX2ZyZWUoZmlmbyk7CisgICAgZnJlZShwKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL2ZpbGUuYyBiL2xpYmF2dXRpbC90ZXN0cy9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwOGJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9maWxlLmMKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2ZpbGUuYyIKKworI3VuZGVmIHByaW50ZgorCitpbnQgbWFpbih2b2lkKQoreworICAgIHVpbnQ4X3QgKmJ1ZjsKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBpZiAoYXZfZmlsZV9tYXAoImZpbGUuYyIsICZidWYsICZzaXplLCAwLCBOVUxMKSA8IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgYnVmWzBdID0gJ3MnOworICAgIHByaW50ZigiJXMiLCBidWYpOworICAgIGF2X2ZpbGVfdW5tYXAoYnVmLCBzaXplKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9oYXNoLmMgYi9saWJhdnV0aWwvdGVzdHMvaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMmFkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvaGFzaC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgUmVpbWFyIETDtmZmaW5nZXIgPFJlaW1hci5Eb2VmZmluZ2VyQGdteC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaGFzaC5oIgorCisjZGVmaW5lIFNSQ19CVUZfU0laRSA2NAorI2RlZmluZSBEU1RfQlVGX1NJWkUgKEFWX0hBU0hfTUFYX1NJWkUgKiA4KQorCitpbnQgbWFpbih2b2lkKQoreworICAgc3RydWN0IEFWSGFzaENvbnRleHQgKmN0eCA9IE5VTEw7CisgICBpbnQgaSwgaiwgbnVtaGFzaGVzID0gMDsKKyAgIHN0YXRpYyBjb25zdCB1aW50OF90IHNyY1tTUkNfQlVGX1NJWkVdID0geyAwIH07CisgICB1aW50OF90IGRzdFtEU1RfQlVGX1NJWkVdOworCisgICB3aGlsZSAoYXZfaGFzaF9uYW1lcyhudW1oYXNoZXMpKQorICAgICAgIG51bWhhc2hlcysrOworCisgICBmb3IgKGkgPSAwOyBpIDwgbnVtaGFzaGVzOyBpKyspIHsKKyAgICAgICBpZiAoYXZfaGFzaF9hbGxvYygmY3R4LCBhdl9oYXNoX25hbWVzKGkpKSA8IDApCisgICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgYXZfaGFzaF9pbml0KGN0eCk7CisgICAgICAgYXZfaGFzaF91cGRhdGUoY3R4LCBzcmMsIFNSQ19CVUZfU0laRSk7CisgICAgICAgbWVtc2V0KGRzdCwgMCwgRFNUX0JVRl9TSVpFKTsKKyAgICAgICBhdl9oYXNoX2ZpbmFsX2hleChjdHgsIGRzdCwgRFNUX0JVRl9TSVpFKTsKKyAgICAgICBwcmludGYoIiVzIGhleDogJXNcbiIsIGF2X2hhc2hfZ2V0X25hbWUoY3R4KSwgZHN0KTsKKworICAgICAgIGF2X2hhc2hfaW5pdChjdHgpOworICAgICAgIGF2X2hhc2hfdXBkYXRlKGN0eCwgc3JjLCBTUkNfQlVGX1NJWkUpOworICAgICAgIGF2X2hhc2hfZmluYWxfYmluKGN0eCwgZHN0LCBEU1RfQlVGX1NJWkUpOworICAgICAgIHByaW50ZigiJXMgYmluOiAiLCBhdl9oYXNoX2dldF9uYW1lKGN0eCkpOworICAgICAgIGZvciAoaiA9IDA7IGogPCBhdl9oYXNoX2dldF9zaXplKGN0eCk7IGorKykgeworICAgICAgICAgICBwcmludGYoIiUjeCAiLCBkc3Rbal0pOworICAgICAgIH0KKyAgICAgICBwcmludGYoIlxuIik7CisKKyAgICAgICBhdl9oYXNoX2luaXQoY3R4KTsKKyAgICAgICBhdl9oYXNoX3VwZGF0ZShjdHgsIHNyYywgU1JDX0JVRl9TSVpFKTsKKyAgICAgICBhdl9oYXNoX2ZpbmFsX2I2NChjdHgsIGRzdCwgRFNUX0JVRl9TSVpFKTsKKyAgICAgICBwcmludGYoIiVzIGI2NDogJXNcbiIsIGF2X2hhc2hfZ2V0X25hbWUoY3R4KSwgZHN0KTsKKyAgICAgICBhdl9oYXNoX2ZyZWVwKCZjdHgpOworICAgfQorICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvaG1hYy5jIGIvbGliYXZ1dGlsL3Rlc3RzL2htYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmE1MGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL2htYWMuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaG1hYy5jIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworc3RhdGljIHZvaWQgdGVzdChBVkhNQUMgKmhtYWMsIGNvbnN0IHVpbnQ4X3QgKmtleSwgaW50IGtleWxlbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgaW50IGRhdGFsZW4pCit7CisgICAgdWludDhfdCBidWZbTUFYX0hBU0hMRU5dOworICAgIGludCBvdXQsIGk7CisgICAgLy8gU29tZSBvZiB0aGUgdGVzdCB2ZWN0b3JzIGFyZSBzdHJpbmdzLCB3aGVyZSBzaXplb2YoKSBpbmNsdWRlcyB0aGUKKyAgICAvLyB0cmFpbGluZyBudWxsIGJ5dGUgLSByZW1vdmUgdGhhdC4KKyAgICBpZiAoIWtleVtrZXlsZW4gLSAxXSkKKyAgICAgICAga2V5bGVuLS07CisgICAgaWYgKCFkYXRhW2RhdGFsZW4gLSAxXSkKKyAgICAgICAgZGF0YWxlbi0tOworICAgIG91dCA9IGF2X2htYWNfY2FsYyhobWFjLCBkYXRhLCBkYXRhbGVuLCBrZXksIGtleWxlbiwgYnVmLCBzaXplb2YoYnVmKSk7CisgICAgZm9yIChpID0gMDsgaSA8IG91dDsgaSsrKQorICAgICAgICBwcmludGYoIiUwMngiLCBidWZbaV0pOworICAgIHByaW50ZigiXG4iKTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICB1aW50OF90IGtleTFbMjBdLCBrZXkzWzEzMV0sIGRhdGEzWzUwXTsKKyAgICBBVkhNQUMgKmhtYWM7CisgICAgZW51bSBBVkhNQUNUeXBlIGk7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga2V5MltdICA9ICJKZWZlIjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkYXRhMVtdID0gIkhpIFRoZXJlIjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkYXRhMltdID0gIndoYXQgZG8geWEgd2FudCBmb3Igbm90aGluZz8iOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRhdGE0W10gPSAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IjsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBkYXRhNVtdID0gIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgYW5kIExhcmdlciBUaGFuIE9uZSBCbG9jay1TaXplIERhdGEiOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGRhdGE2W10gPSAiVGhpcyBpcyBhIHRlc3QgdXNpbmcgYSBsYXJnZXIgdGhhbiBibG9jay1zaXplIGtleSBhbmQgYSBsYXJnZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIGJsb2NrLXNpemUgZGF0YS4gVGhlIGtleSBuZWVkcyB0byBiZSBoYXNoZWQgYmVmb3JlIGJlaW5nIHVzZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBieSB0aGUgSE1BQyBhbGdvcml0aG0uIjsKKyAgICBtZW1zZXQoa2V5MSwgMHgwYiwgc2l6ZW9mKGtleTEpKTsKKyAgICBtZW1zZXQoa2V5MywgMHhhYSwgc2l6ZW9mKGtleTMpKTsKKyAgICBtZW1zZXQoZGF0YTMsIDB4ZGQsIHNpemVvZihkYXRhMykpOworCisgICAgLyogTUQ1LCBTSEEtMSAqLworICAgIGZvciAoaSA9IEFWX0hNQUNfTUQ1OyBpIDw9IEFWX0hNQUNfU0hBMTsgaSsrKSB7CisgICAgICAgIGhtYWMgPSBhdl9obWFjX2FsbG9jKGkpOworICAgICAgICBpZiAoIWhtYWMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgLy8gUkZDIDIyMDIgdGVzdCB2ZWN0b3JzCisgICAgICAgIHRlc3QoaG1hYywga2V5MSwgaG1hYy0+aGFzaGxlbiwgZGF0YTEsIHNpemVvZihkYXRhMSkpOworICAgICAgICB0ZXN0KGhtYWMsIGtleTIsIHNpemVvZihrZXkyKSwgIGRhdGEyLCBzaXplb2YoZGF0YTIpKTsKKyAgICAgICAgdGVzdChobWFjLCBrZXkzLCBobWFjLT5oYXNobGVuLCBkYXRhMywgc2l6ZW9mKGRhdGEzKSk7CisgICAgICAgIHRlc3QoaG1hYywga2V5MywgODAsICAgICAgICAgICAgZGF0YTQsIHNpemVvZihkYXRhNCkpOworICAgICAgICB0ZXN0KGhtYWMsIGtleTMsIDgwLCAgICAgICAgICAgIGRhdGE1LCBzaXplb2YoZGF0YTUpKTsKKyAgICAgICAgYXZfaG1hY19mcmVlKGhtYWMpOworICAgIH0KKworICAgIC8qIFNIQS0yICovCisgICAgZm9yIChpID0gQVZfSE1BQ19TSEEyMjQ7IGkgPD0gQVZfSE1BQ19TSEE1MTI7IGkrKykgeworICAgICAgICBobWFjID0gYXZfaG1hY19hbGxvYyhpKTsKKyAgICAgICAgaWYgKCFobWFjKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIC8vIFJGQyA0MjMxIHRlc3QgdmVjdG9ycworICAgICAgICB0ZXN0KGhtYWMsIGtleTEsIHNpemVvZihrZXkxKSwgZGF0YTEsIHNpemVvZihkYXRhMSkpOworICAgICAgICB0ZXN0KGhtYWMsIGtleTIsIHNpemVvZihrZXkyKSwgZGF0YTIsIHNpemVvZihkYXRhMikpOworICAgICAgICB0ZXN0KGhtYWMsIGtleTMsIDIwLCAgICAgICAgICAgZGF0YTMsIHNpemVvZihkYXRhMykpOworICAgICAgICB0ZXN0KGhtYWMsIGtleTMsIHNpemVvZihrZXkzKSwgZGF0YTQsIHNpemVvZihkYXRhNCkpOworICAgICAgICB0ZXN0KGhtYWMsIGtleTMsIHNpemVvZihrZXkzKSwgZGF0YTYsIHNpemVvZihkYXRhNikpOworICAgICAgICBhdl9obWFjX2ZyZWUoaG1hYyk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvaW1ndXRpbHMuYyBiL2xpYmF2dXRpbC90ZXN0cy9pbWd1dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTA0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvaW1ndXRpbHMuYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuYyIKKworI3VuZGVmIHByaW50ZgorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludDY0X3QgeCwgeTsKKworICAgIGZvciAoeSA9IC0xOyB5PFVJTlRfTUFYOyB5Kz0geS8yICsgMSkgeworICAgICAgICBmb3IgKHggPSAtMTsgeDxVSU5UX01BWDsgeCs9IHgvMiArIDEpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBhdl9pbWFnZV9jaGVja19zaXplKHgsIHksIDAsIE5VTEwpOworICAgICAgICAgICAgcHJpbnRmKCIlZCIsIHJldCA+PSAwKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvaW50ZWdlci5jIGIvbGliYXZ1dGlsL3Rlc3RzL2ludGVnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmM4ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL2ludGVnZXIuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlZ2VyLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludG1hdGguaCIKKworaW50IG1haW4odm9pZCl7CisgICAgaW50NjRfdCBhLGI7CisKKyAgICBmb3IoYT03OyBhPDI1NioyNTYqMjU2OyBhKz0xMzIxNSl7CisgICAgICAgIGZvcihiPTM7IGI8MjU2KjI1NioyNTY7IGIrPTI3MTE4KXsKKyAgICAgICAgICAgIEFWSW50ZWdlciBhaT0gYXZfaW50MmkoYSk7CisgICAgICAgICAgICBBVkludGVnZXIgYmk9IGF2X2ludDJpKGIpOworCisgICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGFpKSA9PSBhKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYmkpID09IGIpOworICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9hZGRfaShhaSxiaSkpID09IGErYik7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGF2X3N1Yl9pKGFpLGJpKSkgPT0gYS1iKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYXZfbXVsX2koYWksYmkpKSA9PSBhKmIpOworICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9zaHJfaShhaSwgOSkpID09IGE+PjkpOworICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9zaHJfaShhaSwtOSkpID09IGE8PDkpOworICAgICAgICAgICAgYXZfYXNzZXJ0MChhdl9pMmludChhdl9zaHJfaShhaSwgMTcpKSA9PSBhPj4xNyk7CisgICAgICAgICAgICBhdl9hc3NlcnQwKGF2X2kyaW50KGF2X3Nocl9pKGFpLC0xNykpID09IGE8PDE3KTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfbG9nMl9pKGFpKSA9PSBhdl9sb2cyKGEpKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAoYXZfaTJpbnQoYXZfZGl2X2koYWksYmkpKSA9PSBhL2IpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL2xmZy5jIGIvbGliYXZ1dGlsL3Rlc3RzL2xmZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMTI3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvbGZnLmMKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvdGltZXIuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgWl9UQUJMRVszMV1bMTBdID0geworICAgIHswLjUwMDAsICAwLjUwNDAsICAwLjUwODAsICAwLjUxMjAsICAwLjUxNjAsICAwLjUxOTksICAwLjUyMzksICAwLjUyNzksICAwLjUzMTksICAwLjUzNTl9LAorICAgIHswLjUzOTgsICAwLjU0MzgsICAwLjU0NzgsICAwLjU1MTcsICAwLjU1NTcsICAwLjU1OTYsICAwLjU2MzYsICAwLjU2NzUsICAwLjU3MTQsICAwLjU3NTN9LAorICAgIHswLjU3OTMsICAwLjU4MzIsICAwLjU4NzEsICAwLjU5MTAsICAwLjU5NDgsICAwLjU5ODcsICAwLjYwMjYsICAwLjYwNjQsICAwLjYxMDMsICAwLjYxNDF9LAorICAgIHswLjYxNzksICAwLjYyMTcsICAwLjYyNTUsICAwLjYyOTMsICAwLjYzMzEsICAwLjYzNjgsICAwLjY0MDYsICAwLjY0NDMsICAwLjY0ODAsICAwLjY1MTd9LAorICAgIHswLjY1NTQsICAwLjY1OTEsICAwLjY2MjgsICAwLjY2NjQsICAwLjY3MDAsICAwLjY3MzYsICAwLjY3NzIsICAwLjY4MDgsICAwLjY4NDQsICAwLjY4Nzl9LAorICAgIHswLjY5MTUsICAwLjY5NTAsICAwLjY5ODUsICAwLjcwMTksICAwLjcwNTQsICAwLjcwODgsICAwLjcxMjMsICAwLjcxNTcsICAwLjcxOTAsICAwLjcyMjR9LAorICAgIHswLjcyNTcsICAwLjcyOTEsICAwLjczMjQsICAwLjczNTcsICAwLjczODksICAwLjc0MjIsICAwLjc0NTQsICAwLjc0ODYsICAwLjc1MTcsICAwLjc1NDl9LAorICAgIHswLjc1ODAsICAwLjc2MTEsICAwLjc2NDIsICAwLjc2NzMsICAwLjc3MDQsICAwLjc3MzQsICAwLjc3NjQsICAwLjc3OTQsICAwLjc4MjMsICAwLjc4NTJ9LAorICAgIHswLjc4ODEsICAwLjc5MTAsICAwLjc5MzksICAwLjc5NjcsICAwLjc5OTUsICAwLjgwMjMsICAwLjgwNTEsICAwLjgwNzgsICAwLjgxMDYsICAwLjgxMzN9LAorICAgIHswLjgxNTksICAwLjgxODYsICAwLjgyMTIsICAwLjgyMzgsICAwLjgyNjQsICAwLjgyODksICAwLjgzMTUsICAwLjgzNDAsICAwLjgzNjUsICAwLjgzODl9LAorICAgIHswLjg0MTMsICAwLjg0MzgsICAwLjg0NjEsICAwLjg0ODUsICAwLjg1MDgsICAwLjg1MzEsICAwLjg1NTQsICAwLjg1NzcsICAwLjg1OTksICAwLjg2MjF9LAorICAgIHswLjg2NDMsICAwLjg2NjUsICAwLjg2ODYsICAwLjg3MDgsICAwLjg3MjksICAwLjg3NDksICAwLjg3NzAsICAwLjg3OTAsICAwLjg4MTAsICAwLjg4MzB9LAorICAgIHswLjg4NDksICAwLjg4NjksICAwLjg4ODgsICAwLjg5MDcsICAwLjg5MjUsICAwLjg5NDQsICAwLjg5NjIsICAwLjg5ODAsICAwLjg5OTcsICAwLjkwMTV9LAorICAgIHswLjkwMzIsICAwLjkwNDksICAwLjkwNjYsICAwLjkwODIsICAwLjkwOTksICAwLjkxMTUsICAwLjkxMzEsICAwLjkxNDcsICAwLjkxNjIsICAwLjkxNzd9LAorICAgIHswLjkxOTIsICAwLjkyMDcsICAwLjkyMjIsICAwLjkyMzYsICAwLjkyNTEsICAwLjkyNjUsICAwLjkyNzksICAwLjkyOTIsICAwLjkzMDYsICAwLjkzMTl9LAorICAgIHswLjkzMzIsICAwLjkzNDUsICAwLjkzNTcsICAwLjkzNzAsICAwLjkzODIsICAwLjkzOTQsICAwLjk0MDYsICAwLjk0MTgsICAwLjk0MjksICAwLjk0NDF9LAorICAgIHswLjk0NTIsICAwLjk0NjMsICAwLjk0NzQsICAwLjk0ODQsICAwLjk0OTUsICAwLjk1MDUsICAwLjk1MTUsICAwLjk1MjUsICAwLjk1MzUsICAwLjk1NDV9LAorICAgIHswLjk1NTQsICAwLjk1NjQsICAwLjk1NzMsICAwLjk1ODIsICAwLjk1OTEsICAwLjk1OTksICAwLjk2MDgsICAwLjk2MTYsICAwLjk2MjUsICAwLjk2MzN9LAorICAgIHswLjk2NDEsICAwLjk2NDksICAwLjk2NTYsICAwLjk2NjQsICAwLjk2NzEsICAwLjk2NzgsICAwLjk2ODYsICAwLjk2OTMsICAwLjk2OTksICAwLjk3MDZ9LAorICAgIHswLjk3MTMsICAwLjk3MTksICAwLjk3MjYsICAwLjk3MzIsICAwLjk3MzgsICAwLjk3NDQsICAwLjk3NTAsICAwLjk3NTYsICAwLjk3NjEsICAwLjk3Njd9LAorICAgIHswLjk3NzIsICAwLjk3NzgsICAwLjk3ODMsICAwLjk3ODgsICAwLjk3OTMsICAwLjk3OTgsICAwLjk4MDMsICAwLjk4MDgsICAwLjk4MTIsICAwLjk4MTd9LAorICAgIHswLjk4MjEsICAwLjk4MjYsICAwLjk4MzAsICAwLjk4MzQsICAwLjk4MzgsICAwLjk4NDIsICAwLjk4NDYsICAwLjk4NTAsICAwLjk4NTQsICAwLjk4NTd9LAorICAgIHswLjk4NjEsICAwLjk4NjQsICAwLjk4NjgsICAwLjk4NzEsICAwLjk4NzUsICAwLjk4NzgsICAwLjk4ODEsICAwLjk4ODQsICAwLjk4ODcsICAwLjk4OTB9LAorICAgIHswLjk4OTMsICAwLjk4OTYsICAwLjk4OTgsICAwLjk5MDEsICAwLjk5MDQsICAwLjk5MDYsICAwLjk5MDksICAwLjk5MTEsICAwLjk5MTMsICAwLjk5MTZ9LAorICAgIHswLjk5MTgsICAwLjk5MjAsICAwLjk5MjIsICAwLjk5MjUsICAwLjk5MjcsICAwLjk5MjksICAwLjk5MzEsICAwLjk5MzIsICAwLjk5MzQsICAwLjk5MzZ9LAorICAgIHswLjk5MzgsICAwLjk5NDAsICAwLjk5NDEsICAwLjk5NDMsICAwLjk5NDUsICAwLjk5NDYsICAwLjk5NDgsICAwLjk5NDksICAwLjk5NTEsICAwLjk5NTJ9LAorICAgIHswLjk5NTMsICAwLjk5NTUsICAwLjk5NTYsICAwLjk5NTcsICAwLjk5NTksICAwLjk5NjAsICAwLjk5NjEsICAwLjk5NjIsICAwLjk5NjMsICAwLjk5NjR9LAorICAgIHswLjk5NjUsICAwLjk5NjYsICAwLjk5NjcsICAwLjk5NjgsICAwLjk5NjksICAwLjk5NzAsICAwLjk5NzEsICAwLjk5NzIsICAwLjk5NzMsICAwLjk5NzR9LAorICAgIHswLjk5NzQsICAwLjk5NzUsICAwLjk5NzYsICAwLjk5NzcsICAwLjk5NzcsICAwLjk5NzgsICAwLjk5NzksICAwLjk5NzksICAwLjk5ODAsICAwLjk5ODF9LAorICAgIHswLjk5ODEsICAwLjk5ODIsICAwLjk5ODIsICAwLjk5ODMsICAwLjk5ODQsICAwLjk5ODQsICAwLjk5ODUsICAwLjk5ODUsICAwLjk5ODYsICAwLjk5ODZ9LAorICAgIHswLjk5ODcsICAwLjk5ODcsICAwLjk5ODcsICAwLjk5ODgsICAwLjk5ODgsICAwLjk5ODksICAwLjk5ODksICAwLjk5ODksICAwLjk5OTAsICAwLjk5OTB9IH07CisKKy8vIEludmVyc2UgY3VtdWxhdGl2ZSBkaXN0cmlidXRpb24gZnVuY3Rpb24KK3N0YXRpYyBkb3VibGUgaW52X2NkZihkb3VibGUgdSkKK3sKKyAgICBjb25zdCBkb3VibGUgYVs0XSA9IHsgMi41MDY2MjgyMzg4NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtMTguNjE1MDAwNjI1MjksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDQxLjM5MTE5NzczNTM0LAorICAgICAgICAgICAgICAgICAgICAgICAgIC0yNS40NDEwNjA0OTYzN307CisKKyAgICBjb25zdCBkb3VibGUgYls0XSA9IHstOC40NzM1MTA5MzA5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjMuMDgzMzY3NDM3NDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTIxLjA2MjI0MTAxODI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xMzA4MjkwOTgzM307CisKKyAgICBjb25zdCBkb3VibGUgY1s5XSA9IHswLjMzNzQ3NTQ4MjI3MjYxNDcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTc2MTY5MDE5MDkxNzE4NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjA3OTc5NzE0OTE4MjA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyNzY0Mzg4MTAzMzM4NjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAzODQwNTcyOTM3MzYwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAzOTUxODk2NTExOTE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzMjE3Njc4ODE3NjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMjg4ODE2NzM2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAzOTYwMzE1MTg3fTsKKworICAgIGRvdWJsZSByOworICAgIGRvdWJsZSB4ID0gdSAtIDAuNTsKKworICAgIC8vIEJlYXNsZXktU3ByaW5nZXIKKyAgICAgaWYgKGZhYnMoeCkgPCAwLjQyKSB7CisKKyAgICAgICAgZG91YmxlIHkgPSB4ICogeDsKKyAgICAgICAgciAgICAgICAgPSB4ICogKCgoYVszXSp5K2FbMl0pKnkrYVsxXSkqeSthWzBdKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAoKCgoYlszXSp5K2JbMl0pKnkrYlsxXSkqeStiWzBdKSp5KzEuMCk7CisgICAgfQorICAgIGVsc2Ugey8vIE1vcm8KKyAgICAgICAgciA9IHU7CisgICAgICAgIGlmICh4ID4gMC4wKQorICAgICAgICAgICAgciA9IDEuMCAtIHU7CisgICAgICAgIHIgPSBsb2coLWxvZyhyKSk7CisgICAgICAgIHIgPSBjWzBdICsgciooY1sxXStyKihjWzJdK3IqKGNbM10rciooY1s0XStyKihjWzVdK3IqKGNbNl0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIqKGNbN10rcipjWzhdKSkpKSkpKTsKKyAgICAgICAgaWYgKHggPCAwLjApCisgICAgICAgICAgICByID0gLXI7CisgICAgfQorCisgICAgcmV0dXJuIHI7Cit9CitpbnQgbWFpbih2b2lkKQoreworICAgIGludCB4ID0gMDsKKyAgICBpbnQgaSwgajsKKyAgICBBVkxGRyBzdGF0ZTsKKyAgICBhdl9sZmdfaW5pdCgmc3RhdGUsIDB4ZGVhZGJlZWYpOworICAgIGZvciAoaiA9IDA7IGogPCAxMDAwMDsgaisrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA2MjQ7IGkrKykgeworICAgICAgICAgICAgLy9hdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJVhcbiIsIGF2X2xmZ19nZXQoJnN0YXRlKSk7CisgICAgICAgICAgICB4ICs9IGF2X2xmZ19nZXQoJnN0YXRlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZmluYWwgdmFsdWU6JVhcbiIsIHgpOworCisgICAgLyogQk1HIHVzYWdlIGV4YW1wbGUgKi8KKyAgICB7CisgICAgICAgIGRvdWJsZSBtZWFuICAgPSAxMDAwOworICAgICAgICBkb3VibGUgc3RkZGV2ID0gNTM7CisgICAgICAgIGRvdWJsZSBzYW1wX21lYW4gPSAwLjAsIHNhbXBfc3RkZGV2ID0gMC4wLCBRSCA9IDA7CisgICAgICAgIGRvdWJsZSBaLCBwX3ZhbHVlID0gLTEsIHRvdF9zYW1wID0gMTAwMDsKKyAgICAgICAgZG91YmxlICpQUk5fYXJyID0gYXZfbWFsbG9jX2FycmF5KHRvdF9zYW1wLCBzaXplb2YoZG91YmxlKSk7CisKKyAgICAgICAgaWYgKCFQUk5fYXJyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkhXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgYXZfbGZnX2luaXQoJnN0YXRlLCA0Mik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3Rfc2FtcDsgaSArPSAyKSB7CisgICAgICAgICAgICBkb3VibGUgYm1nX291dFsyXTsKKyAgICAgICAgICAgIGF2X2JtZ19nZXQoJnN0YXRlLCBibWdfb3V0KTsKKyAgICAgICAgICAgIFBSTl9hcnJbaSAgXSA9IGJtZ19vdXRbMF0gKiBzdGRkZXYgKyBtZWFuOworICAgICAgICAgICAgUFJOX2FycltpKzFdID0gYm1nX291dFsxXSAqIHN0ZGRldiArIG1lYW47CisgICAgICAgICAgICBzYW1wX21lYW4gICArPSBQUk5fYXJyW2ldICsgUFJOX2FycltpKzFdOworICAgICAgICAgICAgc2FtcF9zdGRkZXYgKz0gUFJOX2FycltpXSAqIFBSTl9hcnJbaV0gKyBQUk5fYXJyW2krMV0gKiBQUk5fYXJyW2krMV07CisgICAgICAgICAgICBwcmludGYoIlBSTiVkIDogJWZcbiIKKyAgICAgICAgICAgICAgICAgICAiUFJOJWQgOiAlZlxuIiwKKyAgICAgICAgICAgICAgICAgICBpLCBQUk5fYXJyW2ldLCBpKzEsIFBSTl9hcnJbaSsxXSk7CisgICAgICAgIH0KKyAgICAgICAgc2FtcF9tZWFuIC89IHRvdF9zYW1wOworICAgICAgICBzYW1wX3N0ZGRldiAvPSAodG90X3NhbXAgLSAxKTsKKyAgICAgICAgc2FtcF9zdGRkZXYgLT0gKHRvdF9zYW1wICogMS4wIC8gKHRvdF9zYW1wIC0gMSkpKnNhbXBfbWVhbipzYW1wX21lYW47CisgICAgICAgIHNhbXBfc3RkZGV2ID0gc3FydChzYW1wX3N0ZGRldik7CisgICAgICAgIFogPSAobWVhbiAtIHNhbXBfbWVhbikgLyAoc3RkZGV2IC8gc3FydCh0b3Rfc2FtcCkpOworICAgICAgICB7CisgICAgICAgICAgICBpbnQgeCwgeSwgYSwgYiwgZmxhZyA9IDA7CisKKyAgICAgICAgICAgIGlmIChaIDwgMC4wKSB7CisgICAgICAgICAgICAgICAgZmxhZyA9ICFmbGFnOworICAgICAgICAgICAgICAgIFogPSBaICogLTEuMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYSA9IChpbnQpKFogKiAxMDApOworICAgICAgICAgICAgYiA9ICgoaW50KVogKiAxMDApOworICAgICAgICAgICAgeCA9IFogKiAxMDsKKyAgICAgICAgICAgIHkgPSAoYiA+IDApID8gYSAlIGIgOiBhOworICAgICAgICAgICAgeSA9IHkgJSAxMDsKKyAgICAgICAgICAgIGlmICh4ID4gMzAgfHwgeSA+IDkpIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlcnJvcjogb3V0IG9mIGJvdW5kcyEgdHJpZWQgdG8gYWNjZXNzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlpfVEFCTEVbJWRdWyVkXVxuIiwgeCwgeSk7CisgICAgICAgICAgICAgICAgZ290byBTS0lQOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF92YWx1ZSA9IGZsYWcgPyAxIC0gWl9UQUJMRVt4XVt5XSA6IFpfVEFCTEVbeF1beV07CisgICAgICAgIH0KKworU0tJUDogICBmb3IgKGkgPSAwOyBpIDwgdG90X3NhbXA7ICsraSkgeworCisgICAgICAgICAgICBpZiAoIGkgPCAodG90X3NhbXAgLSAxKSkgeworICAgICAgICAgICAgICAgIGRvdWJsZSBIX2RpZmY7CisgICAgICAgICAgICAgICAgSF9kaWZmICA9IGludl9jZGYoKGkgKyAyLjAgLSAoMy4wLzguMCkpIC8gKHRvdF9zYW1wICsgKDEuMC80LjApKSk7CisgICAgICAgICAgICAgICAgSF9kaWZmIC09IGludl9jZGYoKGkgKyAxLjAgLSAoMy4wLzguMCkpIC8gKHRvdF9zYW1wICsgKDEuMC80LjApKSk7CisKKyAgICAgICAgICAgICAgICBRSCAgICAgKz0gKChQUk5fYXJyW2kgKyAxXSAtIFBSTl9hcnJbaV0pIC8gSF9kaWZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBRSCA9IDEuMCAtIFFIIC8gKCh0b3Rfc2FtcCAtIDEuMCkgKiBzYW1wX3N0ZGRldik7CisKKyAgICAgICAgcHJpbnRmKCJzYW1wbGUgbWVhbiAgOiAlZlxuIgorICAgICAgICAgICAgICAgInRydWUgbWVhbiAgICA6ICVmXG4iCisgICAgICAgICAgICAgICAic2FtcGxlIHN0ZGRldjogJWZcbiIKKyAgICAgICAgICAgICAgICJ0cnVlIHN0ZGRldiAgOiAlZlxuIgorICAgICAgICAgICAgICAgInotc2NvcmUgICAgICA6ICVmXG4iCisgICAgICAgICAgICAgICAicC12YWx1ZSAgICAgIDogJWZcbiIKKyAgICAgICAgICAgICAgICJRSFtub3JtYWxpdHldOiAlZlxuIiwKKyAgICAgICAgICAgICAgIHNhbXBfbWVhbiwgbWVhbiwgc2FtcF9zdGRkZXYsIHN0ZGRldiwgWiwgcF92YWx1ZSwgUUgpOworCisgICAgICAgIGF2X2ZyZWVwKCZQUk5fYXJyKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvbGxzLmMgYi9saWJhdnV0aWwvdGVzdHMvbGxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1YjBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9sbHMuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sbHMuaCIKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBMTFNNb2RlbCBtOworICAgIGludCBpLCBvcmRlcjsKKyAgICBBVkxGRyBsZmc7CisKKyAgICBhdl9sZmdfaW5pdCgmbGZnLCAxKTsKKyAgICBhdnByaXZfaW5pdF9sbHMoJm0sIDMpOworCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgIExPQ0FMX0FMSUdORUQoMzIsIGRvdWJsZSwgdmFyLCBbNF0pOworICAgICAgICBkb3VibGUgZXZhbDsKKworICAgICAgICB2YXJbMF0gPSAgICAgICAgIChhdl9sZmdfZ2V0KCZsZmcpIC8gKGRvdWJsZSkgVUlOVF9NQVggLSAwLjUpICogMjsKKyAgICAgICAgdmFyWzFdID0gdmFyWzBdICsgYXZfbGZnX2dldCgmbGZnKSAvIChkb3VibGUpIFVJTlRfTUFYIC0gMC41OworICAgICAgICB2YXJbMl0gPSB2YXJbMV0gKyBhdl9sZmdfZ2V0KCZsZmcpIC8gKGRvdWJsZSkgVUlOVF9NQVggLSAwLjU7CisgICAgICAgIHZhclszXSA9IHZhclsyXSArIGF2X2xmZ19nZXQoJmxmZykgLyAoZG91YmxlKSBVSU5UX01BWCAtIDAuNTsKKyAgICAgICAgbS51cGRhdGVfbGxzKCZtLCB2YXIpOworICAgICAgICBhdnByaXZfc29sdmVfbGxzKCZtLCAwLjAwMSwgMCk7CisgICAgICAgIGZvciAob3JkZXIgPSAwOyBvcmRlciA8IDM7IG9yZGVyKyspIHsKKyAgICAgICAgICAgIGV2YWwgPSBtLmV2YWx1YXRlX2xscygmbSwgdmFyICsgMSwgb3JkZXIpOworICAgICAgICAgICAgcHJpbnRmKCJyZWFsOiU5ZiBvcmRlcjolZCBwcmVkOiU5ZiB2YXI6JWYgY29lZmZzOiVmICU5ZiAlOWZcbiIsCisgICAgICAgICAgICAgICAgICAgdmFyWzBdLCBvcmRlciwgZXZhbCwgc3FydChtLnZhcmlhbmNlW29yZGVyXSAvIChpICsgMSkpLAorICAgICAgICAgICAgICAgICAgIG0uY29lZmZbb3JkZXJdWzBdLCBtLmNvZWZmW29yZGVyXVsxXSwKKyAgICAgICAgICAgICAgICAgICBtLmNvZWZmW29yZGVyXVsyXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvbG9nLmMgYi9saWJhdnV0aWwvdGVzdHMvbG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZlOTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9sb2cuYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogbG9nIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hlbCBCYXJkaWF1eAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5jIgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKK3N0YXRpYyBpbnQgY2FsbF9sb2dfZm9ybWF0X2xpbmUyKGNvbnN0IGNoYXIgKmZtdCwgY2hhciAqYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgaW50IHJldDsKKyAgICBpbnQgcHJpbnRfcHJlZml4PTE7CisgICAgdmFfc3RhcnQoYXJncywgYnVmZmVyX3NpemUpOworICAgIHJldCA9IGF2X2xvZ19mb3JtYXRfbGluZTIoTlVMTCwgQVZfTE9HX0lORk8sIGZtdCwgYXJncywgYnVmZmVyLCBidWZmZXJfc2l6ZSwgJnByaW50X3ByZWZpeCk7CisgICAgdmFfZW5kKGFyZ3MpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaTsKKyAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisgICAgZm9yICh1c2VfY29sb3I9MDsgdXNlX2NvbG9yPD0yNTY7IHVzZV9jb2xvciA9IDI1NSp1c2VfY29sb3IrMSkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCAidXNlX2NvbG9yOiAlZFxuIiwgdXNlX2NvbG9yKTsKKyAgICAgICAgZm9yIChpID0gQVZfTE9HX0RFQlVHOyBpPj1BVl9MT0dfUVVJRVQ7IGktPTgpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBpLCAiICVkIiwgaSk7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlICIpOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIGkgKyAyNTYqMTIzLCAiQyVkIiwgaSk7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sICJlIik7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19QQU5JQywgIlxuIik7CisgICAgfQorICAgIHsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgY2hhciBidWZmZXJbNF07CisgICAgICAgIHJlc3VsdCA9IGNhbGxfbG9nX2Zvcm1hdF9saW5lMigiZm9vIiwgTlVMTCwgMCk7CisgICAgICAgIGlmKHJlc3VsdCAhPSAzKSB7CisgICAgICAgICAgICBwcmludGYoIlRlc3QgTlVMTCBidWZmZXIgZmFpbGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBjYWxsX2xvZ19mb3JtYXRfbGluZTIoImZvbyIsIGJ1ZmZlciwgMik7CisgICAgICAgIGlmKHJlc3VsdCAhPSAzIHx8IHN0cm5jbXAoYnVmZmVyLCAiZiIsIDIpKSB7CisgICAgICAgICAgICBwcmludGYoIlRlc3QgYnVmZmVyIHRvbyBzbWFsbCBmYWlsZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IGNhbGxfbG9nX2Zvcm1hdF9saW5lMigiZm9vIiwgYnVmZmVyLCA0KTsKKyAgICAgICAgaWYocmVzdWx0ICE9IDMgfHwgc3RybmNtcChidWZmZXIsICJmb28iLCA0KSkgeworICAgICAgICAgICAgcHJpbnRmKCJUZXN0IGJ1ZmZlciBzdWZmaWNpZW50bHkgYmlnIGZhaWxlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvbHpvLmMgYi9saWJhdnV0aWwvdGVzdHMvbHpvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE0N2FiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9sem8uYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA2IFJlaW1hciBEb2VmZmluZ2VyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGx6by9sem8xeC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sem8uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNkZWZpbmUgTUFYU1ogKDEwKjEwMjQqMTAyNCkKKworLyogRGVmaW5lIG9uZSBvZiB0aGVzZSB0byAxIGlmIHlvdSB3aXNoIHRvIGJlbmNobWFyayBsaWJsem8KKyAqIGluc3RlYWQgb2Ygb3VyIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbi4gKi8KKyNkZWZpbmUgQkVOQ0hNQVJLX0xJQkxaT19TQUZFICAgMAorI2RlZmluZSBCRU5DSE1BUktfTElCTFpPX1VOU0FGRSAwCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgICBGSUxFICppbiA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworICAgIGludCBjb21wX2xldmVsID0gYXJnYyA+IDIgPyBhdG9pKGFyZ3ZbMl0pIDogMDsKKyAgICB1aW50OF90ICpvcmlnID0gYXZfbWFsbG9jKE1BWFNaICsgMTYpOworICAgIHVpbnQ4X3QgKmNvbXAgPSBhdl9tYWxsb2MoMipNQVhTWiArIDE2KTsKKyAgICB1aW50OF90ICpkZWNvbXAgPSBhdl9tYWxsb2MoTUFYU1ogKyAxNik7CisgICAgc2l6ZV90IHMgPSBmcmVhZChvcmlnLCAxLCBNQVhTWiwgaW4pOworICAgIGx6b191aW50IGNsZW4gPSAwOworICAgIGxvbmcgdG1wW0xaTzFYX01FTV9DT01QUkVTU107CisgICAgaW50IGlubGVuLCBvdXRsZW47CisgICAgaW50IGk7CisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOworICAgIGlmIChjb21wX2xldmVsID09IDApIHsKKyAgICAgICAgbHpvMXhfMV9jb21wcmVzcyhvcmlnLCBzLCBjb21wLCAmY2xlbiwgdG1wKTsKKyAgICB9IGVsc2UgaWYgKGNvbXBfbGV2ZWwgPT0gMTEpIHsKKyAgICAgICAgbHpvMXhfMV8xMV9jb21wcmVzcyhvcmlnLCBzLCBjb21wLCAmY2xlbiwgdG1wKTsKKyAgICB9IGVsc2UgaWYgKGNvbXBfbGV2ZWwgPT0gMTIpIHsKKyAgICAgICAgbHpvMXhfMV8xMl9jb21wcmVzcyhvcmlnLCBzLCBjb21wLCAmY2xlbiwgdG1wKTsKKyAgICB9IGVsc2UgaWYgKGNvbXBfbGV2ZWwgPT0gMTUpIHsKKyAgICAgICAgbHpvMXhfMV8xNV9jb21wcmVzcyhvcmlnLCBzLCBjb21wLCAmY2xlbiwgdG1wKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbHpvMXhfOTk5X2NvbXByZXNzKG9yaWcsIHMsIGNvbXAsICZjbGVuLCB0bXApOworICAgIGZvciAoaSA9IDA7IGkgPCAzMDA7IGkrKykgeworU1RBUlRfVElNRVIKKyAgICAgICAgaW5sZW4gPSBjbGVuOyBvdXRsZW4gPSBNQVhTWjsKKyNpZiBCRU5DSE1BUktfTElCTFpPX1NBRkUKKyAgICAgICAgaWYgKGx6bzF4X2RlY29tcHJlc3Nfc2FmZShjb21wLCBpbmxlbiwgZGVjb21wLCAmb3V0bGVuLCBOVUxMKSkKKyNlbGlmIEJFTkNITUFSS19MSUJMWk9fVU5TQUZFCisgICAgICAgIGlmIChsem8xeF9kZWNvbXByZXNzKGNvbXAsIGlubGVuLCBkZWNvbXAsICZvdXRsZW4sIE5VTEwpKQorI2Vsc2UKKyAgICAgICAgaWYgKGF2X2x6bzF4X2RlY29kZShkZWNvbXAsICZvdXRsZW4sIGNvbXAsICZpbmxlbikpCisjZW5kaWYKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJkZWNvbXByZXNzaW9uIGVycm9yXG4iKTsKK1NUT1BfVElNRVIoImx6b2QiKQorICAgIH0KKyAgICBpZiAobWVtY21wKG9yaWcsIGRlY29tcCwgcykpCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJkZWNvbXByZXNzaW9uIGluY29ycmVjdFxuIik7CisgICAgZWxzZQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiZGVjb21wcmVzc2lvbiBPS1xuIik7CisgICAgZmNsb3NlKGluKTsKKyAgICBhdl9mcmVlKG9yaWcpOworICAgIGF2X2ZyZWUoY29tcCk7CisgICAgYXZfZnJlZShkZWNvbXApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL21kNS5jIGIvbGliYXZ1dGlsL3Rlc3RzL21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTQ1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvbWQ1LmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZDUuaCIKKworc3RhdGljIHZvaWQgcHJpbnRfbWQ1KHVpbnQ4X3QgKm1kNSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKyAgICAgICAgcHJpbnRmKCIlMDJ4IiwgbWQ1W2ldKTsKKyAgICBwcmludGYoIlxuIik7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgdWludDhfdCBtZDV2YWxbMTZdOworICAgIGludCBpOworICAgIHZvbGF0aWxlIHVpbnQ4X3QgaW5bMTAwMF07IC8vIHZvbGF0aWxlIHRvIHdvcmthcm91bmQgaHR0cDovL2xsdm0ub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIwODQ5CisgICAgLy8gRklYTUUgcmVtb3ZlIHZvbGF0aWxlIG9uY2UgaXQgaGFzIGJlZW4gZml4ZWQgYW5kIGFsbCBmYXRlIGNsaWVudHMgYXJlIHVwZGF0ZWQKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisgICAgICAgIGluW2ldID0gaSAqIGk7CisgICAgYXZfbWQ1X3N1bShtZDV2YWwsIGluLCAxMDAwKTsKKyAgICBwcmludF9tZDUobWQ1dmFsKTsKKyAgICBhdl9tZDVfc3VtKG1kNXZhbCwgaW4sIDYzKTsKKyAgICBwcmludF9tZDUobWQ1dmFsKTsKKyAgICBhdl9tZDVfc3VtKG1kNXZhbCwgaW4sIDY0KTsKKyAgICBwcmludF9tZDUobWQ1dmFsKTsKKyAgICBhdl9tZDVfc3VtKG1kNXZhbCwgaW4sIDY1KTsKKyAgICBwcmludF9tZDUobWQ1dmFsKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICBpbltpXSA9IGkgJSAxMjc7CisgICAgYXZfbWQ1X3N1bShtZDV2YWwsIGluLCA5OTkpOworICAgIHByaW50X21kNShtZDV2YWwpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvbXVybXVyMy5jIGIvbGliYXZ1dGlsL3Rlc3RzL211cm11cjMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGQ2YjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL211cm11cjMuYwpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFJlaW1hciBEw7ZmZmluZ2VyIDxSZWltYXIuRG9lZmZpbmdlckBnbXguZGU+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tdXJtdXIzLmgiCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgdWludDhfdCBoYXNoX3Jlc3VsdFsxNl0gPSB7MH07CisgICAgc3RydWN0IEFWTXVyTXVyMyAqY3R4ID0gYXZfbXVybXVyM19hbGxvYygpOworI2lmIDEKKyAgICB1aW50OF90IGluWzI1Nl0gPSB7MH07CisgICAgdWludDhfdCAqaGFzaGVzID0gYXZfbWFsbG9jeigyNTYgKiAxNik7CisgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgIHsKKyAgICAgICAgaW5baV0gPSBpOworICAgICAgICBhdl9tdXJtdXIzX2luaXRfc2VlZGVkKGN0eCwgMjU2IC0gaSk7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgYWN0dWFsbHkgdGVzdHMgaGFzaGluZyAwIGJ5dGVzCisgICAgICAgIGF2X211cm11cjNfdXBkYXRlKGN0eCwgaW4sIGkpOworICAgICAgICBhdl9tdXJtdXIzX2ZpbmFsKGN0eCwgaGFzaGVzICsgMTYgKiBpKTsKKyAgICB9CisgICAgYXZfbXVybXVyM19pbml0X3NlZWRlZChjdHgsIDApOworICAgIGF2X211cm11cjNfdXBkYXRlKGN0eCwgaGFzaGVzLCAyNTYgKiAxNik7CisgICAgYXZfbXVybXVyM19maW5hbChjdHgsIGhhc2hfcmVzdWx0KTsKKyAgICBhdl9mcmVlKGhhc2hlcyk7CisgICAgYXZfZnJlZXAoJmN0eCk7CisgICAgcHJpbnRmKCJyZXN1bHQ6IDB4JSJQUkl4NjQiIDB4JSJQUkl4NjQiXG4iLCBBVl9STDY0KGhhc2hfcmVzdWx0KSwgQVZfUkw2NChoYXNoX3Jlc3VsdCArIDgpKTsKKyAgICAvLyBvZmZpY2lhbCByZWZlcmVuY2UgdmFsdWUgaXMgMzIgYml0CisgICAgcmV0dXJuIEFWX1JMMzIoaGFzaF9yZXN1bHQpICE9IDB4NjM4NGJhNjk7CisjZWxzZQorICAgIHVpbnQ4X3QgKmluID0gYXZfbWFsbG9jeig1MTIqMTAyNCk7CisgICAgYXZfbXVybXVyM19pbml0KGN0eCk7CisgICAgZm9yIChpID0gMDsgaSA8IDQwKjEwMjQ7IGkrKykKKyAgICAgICAgYXZfbXVybXVyM191cGRhdGUoY3R4LCBpbiwgNTEyKjEwMjQpOworICAgIGF2X211cm11cjNfZmluYWwoY3R4LCBoYXNoX3Jlc3VsdCk7CisgICAgYXZfZnJlZShpbik7CisgICAgcmV0dXJuIGhhc2hfcmVzdWx0WzBdOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvb3B0LmMgYi9saWJhdnV0aWwvdGVzdHMvb3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZmE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9vcHQuYwpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY2hhbm5lbF9sYXlvdXQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorCit0eXBlZGVmIHN0cnVjdCBUZXN0Q29udGV4dCB7CisgICAgY29uc3QgQVZDbGFzcyAqY2xhc3M7CisgICAgaW50IG51bTsKKyAgICBpbnQgdG9nZ2xlOworICAgIGNoYXIgKnN0cmluZzsKKyAgICBpbnQgZmxhZ3M7CisgICAgQVZSYXRpb25hbCByYXRpb25hbDsKKyAgICBBVlJhdGlvbmFsIHZpZGVvX3JhdGU7CisgICAgaW50IHcsIGg7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQ7CisgICAgZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10OworICAgIGludDY0X3QgZHVyYXRpb247CisgICAgdWludDhfdCBjb2xvcls0XTsKKyAgICBpbnQ2NF90IGNoYW5uZWxfbGF5b3V0OworICAgIHZvaWQgKmJpbmFyeTsKKyAgICBpbnQgYmluYXJ5X3NpemU7CisgICAgdm9pZCAqYmluYXJ5MTsKKyAgICBpbnQgYmluYXJ5X3NpemUxOworICAgIHZvaWQgKmJpbmFyeTI7CisgICAgaW50IGJpbmFyeV9zaXplMjsKKyAgICBpbnQ2NF90IG51bTY0OworICAgIGZsb2F0IGZsdDsKKyAgICBkb3VibGUgZGJsOworICAgIGNoYXIgKmVzY2FwZTsKKyAgICBpbnQgYm9vbDE7CisgICAgaW50IGJvb2wyOworICAgIGludCBib29sMzsKK30gVGVzdENvbnRleHQ7CisKKyNkZWZpbmUgT0ZGU0VUKHgpIG9mZnNldG9mKFRlc3RDb250ZXh0LCB4KQorCisjZGVmaW5lIFRFU1RfRkxBR19DT09MIDAxCisjZGVmaW5lIFRFU1RfRkxBR19MQU1FIDAyCisjZGVmaW5lIFRFU1RfRkxBR19NVSAgIDA0CisKK3N0YXRpYyBjb25zdCBBVk9wdGlvbiB0ZXN0X29wdGlvbnNbXT0geworICAgIHsibnVtIiwgICAgICAgICJzZXQgbnVtIiwgICAgICAgICAgICBPRkZTRVQobnVtKSwgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgICAgICAgICAgeyAuaTY0ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAxMDAsIDEgfSwKKyAgICB7InRvZ2dsZSIsICAgICAic2V0IHRvZ2dsZSIsICAgICAgICAgT0ZGU0VUKHRvZ2dsZSksICAgICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICAgICAgICAgIHsgLmk2NCA9IDEgfSwgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAxLCAxIH0sCisgICAgeyJyYXRpb25hbCIsICAgInNldCByYXRpb25hbCIsICAgICAgIE9GRlNFVChyYXRpb25hbCksICAgICAgIEFWX09QVF9UWVBFX1JBVElPTkFMLCAgICAgICB7IC5kYmwgPSAxIH0sICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAxMCwgMSB9LAorICAgIHsic3RyaW5nIiwgICAgICJzZXQgc3RyaW5nIiwgICAgICAgICBPRkZTRVQoc3RyaW5nKSwgICAgICAgICBBVl9PUFRfVFlQRV9TVFJJTkcsICAgICAgICAgeyAuc3RyID0gImRlZmF1bHQiIH0sICAgICAgIENIQVJfTUlOLCAgQ0hBUl9NQVgsIDEgfSwKKyAgICB7ImVzY2FwZSIsICAgICAic2V0IGVzY2FwZSBzdHIiLCAgICAgT0ZGU0VUKGVzY2FwZSksICAgICAgICAgQVZfT1BUX1RZUEVfU1RSSU5HLCAgICAgICAgIHsgLnN0ciA9ICJcXD0sIiB9LCAgICAgICAgICBDSEFSX01JTiwgIENIQVJfTUFYLCAxIH0sCisgICAgeyJmbGFncyIsICAgICAgInNldCBmbGFncyIsICAgICAgICAgIE9GRlNFVChmbGFncyksICAgICAgICAgIEFWX09QVF9UWVBFX0ZMQUdTLCAgICAgICAgICB7IC5pNjQgPSAxIH0sICAgICAgICAgICAgICAgICAgICAgIDAsICAgSU5UX01BWCwgMSwgImZsYWdzIiB9LAorICAgIHsiY29vbCIsICAgICAgICJzZXQgY29vbCBmbGFnIiwgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9DT05TVCwgICAgICAgICAgeyAuaTY0ID0gVEVTVF9GTEFHX0NPT0wgfSwgICBJTlRfTUlOLCAgIElOVF9NQVgsIDEsICJmbGFncyIgfSwKKyAgICB7ImxhbWUiLCAgICAgICAic2V0IGxhbWUgZmxhZyIsICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgQVZfT1BUX1RZUEVfQ09OU1QsICAgICAgICAgIHsgLmk2NCA9IFRFU1RfRkxBR19MQU1FIH0sICAgSU5UX01JTiwgICBJTlRfTUFYLCAxLCAiZmxhZ3MiIH0sCisgICAgeyJtdSIsICAgICAgICAgInNldCBtdSBmbGFnIiwgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIEFWX09QVF9UWVBFX0NPTlNULCAgICAgICAgICB7IC5pNjQgPSBURVNUX0ZMQUdfTVUgfSwgICAgIElOVF9NSU4sICAgSU5UX01BWCwgMSwgImZsYWdzIiB9LAorICAgIHsic2l6ZSIsICAgICAgICJzZXQgc2l6ZSIsICAgICAgICAgICBPRkZTRVQodyksICAgICAgICAgICAgICBBVl9PUFRfVFlQRV9JTUFHRV9TSVpFLCAgICAgeyAuc3RyPSIyMDB4MzAwIiB9LCAgICAgICAgICAgICAgICAwLCAgICAgICAgIDAsIDEgfSwKKyAgICB7InBpeF9mbXQiLCAgICAic2V0IHBpeGZtdCIsICAgICAgICAgT0ZGU0VUKHBpeF9mbXQpLCAgICAgICAgQVZfT1BUX1RZUEVfUElYRUxfRk1ULCAgICAgIHsgLmk2NCA9IEFWX1BJWF9GTVRfMEJHUiB9LCAgICAgICAtMSwgICBJTlRfTUFYLCAxIH0sCisgICAgeyJzYW1wbGVfZm10IiwgInNldCBzYW1wbGVmbXQiLCAgICAgIE9GRlNFVChzYW1wbGVfZm10KSwgICAgIEFWX09QVF9UWVBFX1NBTVBMRV9GTVQsICAgICB7IC5pNjQgPSBBVl9TQU1QTEVfRk1UX1MxNiB9LCAgICAgLTEsICAgSU5UX01BWCwgMSB9LAorICAgIHsidmlkZW9fcmF0ZSIsICJzZXQgdmlkZW9yYXRlIiwgICAgICBPRkZTRVQodmlkZW9fcmF0ZSksICAgICBBVl9PUFRfVFlQRV9WSURFT19SQVRFLCAgICAgeyAuc3RyID0gIjI1IiB9LCAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgIElOVF9NQVgsIDEgfSwKKyAgICB7ImR1cmF0aW9uIiwgICAic2V0IGR1cmF0aW9uIiwgICAgICAgT0ZGU0VUKGR1cmF0aW9uKSwgICAgICAgQVZfT1BUX1RZUEVfRFVSQVRJT04sICAgICAgIHsgLmk2NCA9IDEwMDAgfSwgICAgICAgICAgICAgICAgICAgMCwgSU5UNjRfTUFYLCAxIH0sCisgICAgeyJjb2xvciIsICAgICAgInNldCBjb2xvciIsICAgICAgICAgIE9GRlNFVChjb2xvciksICAgICAgICAgIEFWX09QVF9UWVBFX0NPTE9SLCAgICAgICAgICB7IC5zdHIgPSAicGluayIgfSwgICAgICAgICAgICAgICAgIDAsICAgICAgICAgMCwgMSB9LAorICAgIHsiY2wiLCAgICAgICAgICJzZXQgY2hhbm5lbCBsYXlvdXQiLCBPRkZTRVQoY2hhbm5lbF9sYXlvdXQpLCBBVl9PUFRfVFlQRV9DSEFOTkVMX0xBWU9VVCwgeyAuaTY0ID0gQVZfQ0hfTEFZT1VUX0hFWEFHT05BTCB9LCAwLCBJTlQ2NF9NQVgsIDEgfSwKKyAgICB7ImJpbiIsICAgICAgICAic2V0IGJpbmFyeSB2YWx1ZSIsICAgT0ZGU0VUKGJpbmFyeSksICAgICAgICAgQVZfT1BUX1RZUEVfQklOQVJZLCAgICAgICAgIHsgLnN0cj0iNjI2OTZlMDAiIH0sICAgICAgICAgICAgICAgMCwgICAgICAgICAwLCAxIH0sCisgICAgeyJiaW4xIiwgICAgICAgInNldCBiaW5hcnkgdmFsdWUiLCAgIE9GRlNFVChiaW5hcnkxKSwgICAgICAgIEFWX09QVF9UWVBFX0JJTkFSWSwgICAgICAgICB7IC5zdHI9TlVMTCB9LCAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgMCwgMSB9LAorICAgIHsiYmluMiIsICAgICAgICJzZXQgYmluYXJ5IHZhbHVlIiwgICBPRkZTRVQoYmluYXJ5MiksICAgICAgICBBVl9PUFRfVFlQRV9CSU5BUlksICAgICAgICAgeyAuc3RyPSIiIH0sICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgIDAsIDEgfSwKKyAgICB7Im51bTY0IiwgICAgICAic2V0IG51bSA2NGJpdCIsICAgICAgT0ZGU0VUKG51bTY0KSwgICAgICAgICAgQVZfT1BUX1RZUEVfSU5UNjQsICAgICAgICAgIHsgLmk2NCA9IDEgfSwgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgMTAwLCAxIH0sCisgICAgeyJmbHQiLCAgICAgICAgInNldCBmbG9hdCIsICAgICAgICAgIE9GRlNFVChmbHQpLCAgICAgICAgICAgIEFWX09QVF9UWVBFX0ZMT0FULCAgICAgICAgICB7IC5kYmwgPSAxLjAgLyAzIH0sICAgICAgICAgICAgICAgIDAsICAgICAgIDEwMCwgMSB9LAorICAgIHsiZGJsIiwgICAgICAgICJzZXQgZG91YmxlIiwgICAgICAgICBPRkZTRVQoZGJsKSwgICAgICAgICAgICBBVl9PUFRfVFlQRV9ET1VCTEUsICAgICAgICAgeyAuZGJsID0gMS4wIC8gMyB9LCAgICAgICAgICAgICAgICAwLCAgICAgICAxMDAsIDEgfSwKKyAgICB7ImJvb2wxIiwgICAgICAic2V0IGJvb2xlYW4gdmFsdWUiLCAgT0ZGU0VUKGJvb2wxKSwgICAgICAgICAgQVZfT1BUX1RZUEVfQk9PTCwgICAgICAgICAgIHsgLmk2NCA9IC0xIH0sICAgICAgICAgICAgICAgICAgICAtMSwgICAgICAgICAxLCAxIH0sCisgICAgeyJib29sMiIsICAgICAgInNldCBib29sZWFuIHZhbHVlIiwgIE9GRlNFVChib29sMiksICAgICAgICAgIEFWX09QVF9UWVBFX0JPT0wsICAgICAgICAgICB7IC5pNjQgPSAxIH0sICAgICAgICAgICAgICAgICAgICAgLTEsICAgICAgICAgMSwgMSB9LAorICAgIHsiYm9vbDMiLCAgICAgICJzZXQgYm9vbGVhbiB2YWx1ZSIsICBPRkZTRVQoYm9vbDMpLCAgICAgICAgICBBVl9PUFRfVFlQRV9CT09MLCAgICAgICAgICAgeyAuaTY0ID0gMCB9LCAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgIDEsIDEgfSwKKyAgICB7IE5VTEwgfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp0ZXN0X2dldF9uYW1lKHZvaWQgKmN0eCkKK3sKKyAgICByZXR1cm4gInRlc3QiOworfQorCitzdGF0aWMgY29uc3QgQVZDbGFzcyB0ZXN0X2NsYXNzID0geworICAgIC5jbGFzc19uYW1lID0gIlRlc3RDb250ZXh0IiwKKyAgICAuaXRlbV9uYW1lICA9IHRlc3RfZ2V0X25hbWUsCisgICAgLm9wdGlvbiAgICAgPSB0ZXN0X29wdGlvbnMsCit9OworCitzdGF0aWMgdm9pZCBsb2dfY2FsbGJhY2tfaGVscCh2b2lkICpwdHIsIGludCBsZXZlbCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IHZsKQoreworICAgIHZmcHJpbnRmKHN0ZG91dCwgZm10LCB2bCk7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisgICAgYXZfbG9nX3NldF9jYWxsYmFjayhsb2dfY2FsbGJhY2tfaGVscCk7CisKKyAgICBwcmludGYoIlRlc3RpbmcgZGVmYXVsdCB2YWx1ZXNcbiIpOworICAgIHsKKyAgICAgICAgVGVzdENvbnRleHQgdGVzdF9jdHggPSB7IDAgfTsKKyAgICAgICAgdGVzdF9jdHguY2xhc3MgPSAmdGVzdF9jbGFzczsKKyAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cygmdGVzdF9jdHgpOworCisgICAgICAgIHByaW50ZigibnVtPSVkXG4iLCB0ZXN0X2N0eC5udW0pOworICAgICAgICBwcmludGYoInRvZ2dsZT0lZFxuIiwgdGVzdF9jdHgudG9nZ2xlKTsKKyAgICAgICAgcHJpbnRmKCJzdHJpbmc9JXNcbiIsIHRlc3RfY3R4LnN0cmluZyk7CisgICAgICAgIHByaW50ZigiZXNjYXBlPSVzXG4iLCB0ZXN0X2N0eC5lc2NhcGUpOworICAgICAgICBwcmludGYoImZsYWdzPSVkXG4iLCB0ZXN0X2N0eC5mbGFncyk7CisgICAgICAgIHByaW50ZigicmF0aW9uYWw9JWQvJWRcbiIsIHRlc3RfY3R4LnJhdGlvbmFsLm51bSwgdGVzdF9jdHgucmF0aW9uYWwuZGVuKTsKKyAgICAgICAgcHJpbnRmKCJ2aWRlb19yYXRlPSVkLyVkXG4iLCB0ZXN0X2N0eC52aWRlb19yYXRlLm51bSwgdGVzdF9jdHgudmlkZW9fcmF0ZS5kZW4pOworICAgICAgICBwcmludGYoIndpZHRoPSVkIGhlaWdodD0lZFxuIiwgdGVzdF9jdHgudywgdGVzdF9jdHguaCk7CisgICAgICAgIHByaW50ZigicGl4X2ZtdD0lc1xuIiwgYXZfZ2V0X3BpeF9mbXRfbmFtZSh0ZXN0X2N0eC5waXhfZm10KSk7CisgICAgICAgIHByaW50Zigic2FtcGxlX2ZtdD0lc1xuIiwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZSh0ZXN0X2N0eC5zYW1wbGVfZm10KSk7CisgICAgICAgIHByaW50ZigiZHVyYXRpb249JSJQUklkNjQiXG4iLCB0ZXN0X2N0eC5kdXJhdGlvbik7CisgICAgICAgIHByaW50ZigiY29sb3I9JWQgJWQgJWQgJWRcbiIsIHRlc3RfY3R4LmNvbG9yWzBdLCB0ZXN0X2N0eC5jb2xvclsxXSwgdGVzdF9jdHguY29sb3JbMl0sIHRlc3RfY3R4LmNvbG9yWzNdKTsKKyAgICAgICAgcHJpbnRmKCJjaGFubmVsX2xheW91dD0lIlBSSWQ2NCI9JSJQUklkNjQiXG4iLCB0ZXN0X2N0eC5jaGFubmVsX2xheW91dCwgKGludDY0X3QpQVZfQ0hfTEFZT1VUX0hFWEFHT05BTCk7CisgICAgICAgIGlmICh0ZXN0X2N0eC5iaW5hcnkpCisgICAgICAgICAgICBwcmludGYoImJpbmFyeT0leCAleCAleCAleFxuIiwgKCh1aW50OF90Kil0ZXN0X2N0eC5iaW5hcnkpWzBdLCAoKHVpbnQ4X3QqKXRlc3RfY3R4LmJpbmFyeSlbMV0sICgodWludDhfdCopdGVzdF9jdHguYmluYXJ5KVsyXSwgKCh1aW50OF90Kil0ZXN0X2N0eC5iaW5hcnkpWzNdKTsKKyAgICAgICAgcHJpbnRmKCJiaW5hcnlfc2l6ZT0lZFxuIiwgdGVzdF9jdHguYmluYXJ5X3NpemUpOworICAgICAgICBwcmludGYoIm51bTY0PSUiUFJJZDY0IlxuIiwgdGVzdF9jdHgubnVtNjQpOworICAgICAgICBwcmludGYoImZsdD0lLjZmXG4iLCB0ZXN0X2N0eC5mbHQpOworICAgICAgICBwcmludGYoImRibD0lLjZmXG4iLCB0ZXN0X2N0eC5kYmwpOworCisgICAgICAgIGF2X29wdF9zaG93MigmdGVzdF9jdHgsIE5VTEwsIC0xLCAwKTsKKworICAgICAgICBhdl9vcHRfZnJlZSgmdGVzdF9jdHgpOworICAgIH0KKworICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdCgpXG4iKTsKKyAgICB7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIFRlc3RDb250ZXh0IHRlc3RfY3R4ID0geyAwIH07CisgICAgICAgIGNvbnN0IEFWT3B0aW9uICpvID0gTlVMTDsKKyAgICAgICAgdGVzdF9jdHguY2xhc3MgPSAmdGVzdF9jbGFzczsKKworICAgICAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19RVUlFVCk7CisKKyAgICAgICAgd2hpbGUgKG8gPSBhdl9vcHRfbmV4dCgmdGVzdF9jdHgsIG8pKSB7CisgICAgICAgICAgICByZXQgPSBhdl9vcHRfaXNfc2V0X3RvX2RlZmF1bHRfYnlfbmFtZSgmdGVzdF9jdHgsIG8tPm5hbWUsIDApOworICAgICAgICAgICAgcHJpbnRmKCJuYW1lOiUxMHMgZGVmYXVsdDolZCBlcnJvcjolc1xuIiwgby0+bmFtZSwgISFyZXQsIHJldCA8IDAgPyBhdl9lcnIyc3RyKHJldCkgOiAiIik7CisgICAgICAgIH0KKyAgICAgICAgYXZfb3B0X3NldF9kZWZhdWx0cygmdGVzdF9jdHgpOworICAgICAgICB3aGlsZSAobyA9IGF2X29wdF9uZXh0KCZ0ZXN0X2N0eCwgbykpIHsKKyAgICAgICAgICAgIHJldCA9IGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdF9ieV9uYW1lKCZ0ZXN0X2N0eCwgby0+bmFtZSwgMCk7CisgICAgICAgICAgICBwcmludGYoIm5hbWU6JTEwcyBkZWZhdWx0OiVkIGVycm9yOiVzXG4iLCBvLT5uYW1lLCAhIXJldCwgcmV0IDwgMCA/IGF2X2VycjJzdHIocmV0KSA6ICIiKTsKKyAgICAgICAgfQorICAgICAgICBhdl9vcHRfZnJlZSgmdGVzdF9jdHgpOworICAgIH0KKworICAgIHByaW50ZigiXG5UZXN0IGF2X29wdF9zZXJpYWxpemUoKVxuIik7CisgICAgeworICAgICAgICBUZXN0Q29udGV4dCB0ZXN0X2N0eCA9IHsgMCB9OworICAgICAgICBjaGFyICpidWY7CisgICAgICAgIHRlc3RfY3R4LmNsYXNzID0gJnRlc3RfY2xhc3M7CisKKyAgICAgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfUVVJRVQpOworCisgICAgICAgIGF2X29wdF9zZXRfZGVmYXVsdHMoJnRlc3RfY3R4KTsKKyAgICAgICAgaWYgKGF2X29wdF9zZXJpYWxpemUoJnRlc3RfY3R4LCAwLCAwLCAmYnVmLCAnPScsICcsJykgPj0gMCkgeworICAgICAgICAgICAgcHJpbnRmKCIlc1xuIiwgYnVmKTsKKyAgICAgICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7CisgICAgICAgICAgICBtZW1zZXQoJnRlc3RfY3R4LCAwLCBzaXplb2YodGVzdF9jdHgpKTsKKyAgICAgICAgICAgIHRlc3RfY3R4LmNsYXNzID0gJnRlc3RfY2xhc3M7CisgICAgICAgICAgICBhdl9zZXRfb3B0aW9uc19zdHJpbmcoJnRlc3RfY3R4LCBidWYsICI9IiwgIiwiKTsKKyAgICAgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgICAgIGlmIChhdl9vcHRfc2VyaWFsaXplKCZ0ZXN0X2N0eCwgMCwgMCwgJmJ1ZiwgJz0nLCAnLCcpID49IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLCBidWYpOworICAgICAgICAgICAgICAgIGF2X2ZyZWUoYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdl9vcHRfZnJlZSgmdGVzdF9jdHgpOworICAgIH0KKworICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X3NldF9vcHRpb25zX3N0cmluZygpXG4iKTsKKyAgICB7CisgICAgICAgIFRlc3RDb250ZXh0IHRlc3RfY3R4ID0geyAwIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3B0aW9uc1tdID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiOiIsCisgICAgICAgICAgICAiPSIsCisgICAgICAgICAgICAiZm9vPToiLAorICAgICAgICAgICAgIjo9Zm9vIiwKKyAgICAgICAgICAgICI9Zm9vIiwKKyAgICAgICAgICAgICJmb289IiwKKyAgICAgICAgICAgICJmb28iLAorICAgICAgICAgICAgImZvbz12YWwiLAorICAgICAgICAgICAgImZvbz09dmFsIiwKKyAgICAgICAgICAgICJ0b2dnbGU9OiIsCisgICAgICAgICAgICAic3RyaW5nPToiLAorICAgICAgICAgICAgInRvZ2dsZT0xIDogZm9vIiwKKyAgICAgICAgICAgICJ0b2dnbGU9MTAwIiwKKyAgICAgICAgICAgICJ0b2dnbGU9PTEiLAorICAgICAgICAgICAgImZsYWdzPSttdS1sYW1lIDogbnVtPTQyOiB0b2dnbGU9MCIsCisgICAgICAgICAgICAibnVtPTQyIDogc3RyaW5nPWJsYWhibGFoIiwKKyAgICAgICAgICAgICJyYXRpb25hbD0wIDogcmF0aW9uYWw9MS8yIDogcmF0aW9uYWw9MS8tMSIsCisgICAgICAgICAgICAicmF0aW9uYWw9LTEvMCIsCisgICAgICAgICAgICAic2l6ZT0xMDI0eDc2OCIsCisgICAgICAgICAgICAic2l6ZT1wYWwiLAorICAgICAgICAgICAgInNpemU9Ym9ndXMiLAorICAgICAgICAgICAgInBpeF9mbXQ9eXV2NDIwcCIsCisgICAgICAgICAgICAicGl4X2ZtdD0yIiwKKyAgICAgICAgICAgICJwaXhfZm10PWJvZ3VzIiwKKyAgICAgICAgICAgICJzYW1wbGVfZm10PXMxNiIsCisgICAgICAgICAgICAic2FtcGxlX2ZtdD0yIiwKKyAgICAgICAgICAgICJzYW1wbGVfZm10PWJvZ3VzIiwKKyAgICAgICAgICAgICJ2aWRlb19yYXRlPXBhbCIsCisgICAgICAgICAgICAidmlkZW9fcmF0ZT0yNSIsCisgICAgICAgICAgICAidmlkZW9fcmF0ZT0zMDAwMC8xMDAxIiwKKyAgICAgICAgICAgICJ2aWRlb19yYXRlPTMwLzEuMDAxIiwKKyAgICAgICAgICAgICJ2aWRlb19yYXRlPWJvZ3VzIiwKKyAgICAgICAgICAgICJkdXJhdGlvbj1ib2d1cyIsCisgICAgICAgICAgICAiZHVyYXRpb249MTIzLjQ1IiwKKyAgICAgICAgICAgICJkdXJhdGlvbj0xXFw6MjNcXDo0NS42NyIsCisgICAgICAgICAgICAiY29sb3I9Ymx1ZSIsCisgICAgICAgICAgICAiY29sb3I9MHgyMjMzMDAiLAorICAgICAgICAgICAgImNvbG9yPTB4NDJGRjA3QUEiLAorICAgICAgICAgICAgImNsPXN0ZXJlbytkb3dubWl4IiwKKyAgICAgICAgICAgICJjbD1mb28iLAorICAgICAgICAgICAgImJpbj1ib2d1c3MiLAorICAgICAgICAgICAgImJpbj0xMTEiLAorICAgICAgICAgICAgImJpbj1mZmZmIiwKKyAgICAgICAgICAgICJudW02ND1ib2d1cyIsCisgICAgICAgICAgICAibnVtNjQ9NDQiLAorICAgICAgICAgICAgIm51bTY0PTQ0LjQiLAorICAgICAgICAgICAgIm51bTY0PS0xIiwKKyAgICAgICAgICAgICJudW02ND0xMDEiLAorICAgICAgICAgICAgImZsdD1ib2d1cyIsCisgICAgICAgICAgICAiZmx0PTIiLAorICAgICAgICAgICAgImZsdD0yLjIiLAorICAgICAgICAgICAgImZsdD0tMSIsCisgICAgICAgICAgICAiZmx0PTEwMSIsCisgICAgICAgICAgICAiZGJsPWJvZ3VzIiwKKyAgICAgICAgICAgICJkYmw9MiIsCisgICAgICAgICAgICAiZGJsPTIuMiIsCisgICAgICAgICAgICAiZGJsPS0xIiwKKyAgICAgICAgICAgICJkYmw9MTAxIiwKKyAgICAgICAgICAgICJib29sMT10cnVlIiwKKyAgICAgICAgICAgICJib29sMj1hdXRvIiwKKyAgICAgICAgfTsKKworICAgICAgICB0ZXN0X2N0eC5jbGFzcyA9ICZ0ZXN0X2NsYXNzOworICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKCZ0ZXN0X2N0eCk7CisKKyAgICAgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfUVVJRVQpOworCisgICAgICAgIGZvciAoaT0wOyBpIDwgRkZfQVJSQVlfRUxFTVMob3B0aW9ucyk7IGkrKykgeworICAgICAgICAgICAgaW50IHNpbGVuY2VfbG9nID0gIXN0cmNtcChvcHRpb25zW2ldLCAicmF0aW9uYWw9LTEvMCIpOyAvLyBpbmYgZm9ybWF0aW5nIGRpZmZlcnMgYmV0d2VlbiBwbGF0Zm9ybXMKKyAgICAgICAgICAgIGF2X2xvZygmdGVzdF9jdHgsIEFWX0xPR19ERUJVRywgIlNldHRpbmcgb3B0aW9ucyBzdHJpbmcgJyVzJ1xuIiwgb3B0aW9uc1tpXSk7CisgICAgICAgICAgICBpZiAoc2lsZW5jZV9sb2cpCisgICAgICAgICAgICAgICAgYXZfbG9nX3NldF9jYWxsYmFjayhOVUxMKTsKKyAgICAgICAgICAgIGlmIChhdl9zZXRfb3B0aW9uc19zdHJpbmcoJnRlc3RfY3R4LCBvcHRpb25zW2ldLCAiPSIsICI6IikgPCAwKQorICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgJyVzJ1xuIiwgb3B0aW9uc1tpXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJPSyAgICAnJXMnXG4iLCBvcHRpb25zW2ldKTsKKyAgICAgICAgICAgIGF2X2xvZ19zZXRfY2FsbGJhY2sobG9nX2NhbGxiYWNrX2hlbHApOworICAgICAgICB9CisgICAgICAgIGF2X29wdF9mcmVlKCZ0ZXN0X2N0eCk7CisgICAgfQorCisgICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfb3B0X3NldF9mcm9tX3N0cmluZygpXG4iKTsKKyAgICB7CisgICAgICAgIFRlc3RDb250ZXh0IHRlc3RfY3R4ID0geyAwIH07CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgb3B0aW9uc1tdID0geworICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiNSIsCisgICAgICAgICAgICAiNTpoZWxsbyIsCisgICAgICAgICAgICAiNTpoZWxsbzpzaXplPXBhbCIsCisgICAgICAgICAgICAiNTpzaXplPXBhbDpoZWxsbyIsCisgICAgICAgICAgICAiOiIsCisgICAgICAgICAgICAiPSIsCisgICAgICAgICAgICAiIDUgOiBoZWxsbyA6IHNpemUgPSBwYWwgIiwKKyAgICAgICAgICAgICJhX3ZlcnlfbG9uZ19vcHRpb25fbmFtZV90aGF0X3dpbGxfbmVlZF90b19iZV9lbGxpcHNpemVkX2Fyb3VuZF9oZXJlPTQyIgorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHNob3J0aGFuZFtdID0geyAibnVtIiwgInN0cmluZyIsIE5VTEwgfTsKKworICAgICAgICB0ZXN0X2N0eC5jbGFzcyA9ICZ0ZXN0X2NsYXNzOworICAgICAgICBhdl9vcHRfc2V0X2RlZmF1bHRzKCZ0ZXN0X2N0eCk7CisKKyAgICAgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfUVVJRVQpOworCisgICAgICAgIGZvciAoaT0wOyBpIDwgRkZfQVJSQVlfRUxFTVMob3B0aW9ucyk7IGkrKykgeworICAgICAgICAgICAgYXZfbG9nKCZ0ZXN0X2N0eCwgQVZfTE9HX0RFQlVHLCAiU2V0dGluZyBvcHRpb25zIHN0cmluZyAnJXMnXG4iLCBvcHRpb25zW2ldKTsKKyAgICAgICAgICAgIGlmIChhdl9vcHRfc2V0X2Zyb21fc3RyaW5nKCZ0ZXN0X2N0eCwgb3B0aW9uc1tpXSwgc2hvcnRoYW5kLCAiPSIsICI6IikgPCAwKQorICAgICAgICAgICAgICAgIHByaW50ZigiRXJyb3IgJyVzJ1xuIiwgb3B0aW9uc1tpXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJPSyAgICAnJXMnXG4iLCBvcHRpb25zW2ldKTsKKyAgICAgICAgfQorICAgICAgICBhdl9vcHRfZnJlZSgmdGVzdF9jdHgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL3BhcnNldXRpbHMuYyBiL2xpYmF2dXRpbC90ZXN0cy9wYXJzZXV0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwZjYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9wYXJzZXV0aWxzLmMKQEAgLTAsMCArMSwyNjcgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2RlZmluZSBURVNUCisjaW5jbHVkZSAibGliYXZ1dGlsL3BhcnNldXRpbHMuYyIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9yYXRpb25hbC5oIgorCitzdGF0aWMgdWludDMyX3QgcmFuZG9tdiA9IE1LVEFHKCdMJywnQScsJ1YnLCdVJyk7CisKK3N0YXRpYyB1aW50MzJfdCBhdl9nZXRfcmFuZG9tX3NlZWRfZGV0ZXJtaW5pc3RpYyh2b2lkKQoreworICAgIHJldHVybiByYW5kb212ID0gcmFuZG9tdiAqIDE2NjQ1MjUgKyAxMDEzOTA0MjIzOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2F2X3BhcnNlX3ZpZGVvX3JhdGUodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcmF0ZXNbXSA9IHsKKyAgICAgICAgIi1pbmYiLAorICAgICAgICAiaW5mIiwKKyAgICAgICAgIm5hbiIsCisgICAgICAgICIxMjMvMCIsCisgICAgICAgICItMTIzIC8gMCIsCisgICAgICAgICIiLAorICAgICAgICAiLyIsCisgICAgICAgICIgMTIzICAvICAzMjEiLAorICAgICAgICAiZm9vL2ZvbyIsCisgICAgICAgICJmb28vMSIsCisgICAgICAgICIxL2ZvbyIsCisgICAgICAgICIwLzAiLAorICAgICAgICAiLzAiLAorICAgICAgICAiMS8iLAorICAgICAgICAiMSIsCisgICAgICAgICIwIiwKKyAgICAgICAgIi0xMjMvMTIzIiwKKyAgICAgICAgIi1mb28iLAorICAgICAgICAiMTIzLjIzIiwKKyAgICAgICAgIi4yMyIsCisgICAgICAgICItLjIzIiwKKyAgICAgICAgIi0wLjIzNCIsCisgICAgICAgICItMC4wMDAwMDAxIiwKKyAgICAgICAgIiAgMjEzMzIuMjMyNCAgICIsCisgICAgICAgICIgLTIxMzMyLjIzMjQgICAiLAorICAgIH07CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocmF0ZXMpOyBpKyspIHsKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgQVZSYXRpb25hbCBxID0geyAwLCAwIH07CisgICAgICAgIHJldCA9IGF2X3BhcnNlX3ZpZGVvX3JhdGUoJnEsIHJhdGVzW2ldKTsKKyAgICAgICAgcHJpbnRmKCInJXMnIC0+ICVkLyVkICVzXG4iLAorICAgICAgICAgICAgICAgcmF0ZXNbaV0sIHEubnVtLCBxLmRlbiwgcmV0ID8gIkVSUk9SIiA6ICJPSyIpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGVzdF9hdl9wYXJzZV9jb2xvcih2b2lkKQoreworICAgIGludCBpOworICAgIHVpbnQ4X3QgcmdiYVs0XTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sb3JfbmFtZXNbXSA9IHsKKyAgICAgICAgImJpa2VzaGVkIiwKKyAgICAgICAgIlJhTmRPbSIsCisgICAgICAgICJmb28iLAorICAgICAgICAicmVkIiwKKyAgICAgICAgIlJlZCAiLAorICAgICAgICAiUkVEIiwKKyAgICAgICAgIlZpb2xldCIsCisgICAgICAgICJZZWxsb3ciLAorICAgICAgICAiUmVkIiwKKyAgICAgICAgIjB4MDAwMDAwIiwKKyAgICAgICAgIjB4MDAwMDAwMCIsCisgICAgICAgICIweGZmMDAwMDAwIiwKKyAgICAgICAgIjB4M2UzNGZmIiwKKyAgICAgICAgIjB4M2UzNGZmYWEiLAorICAgICAgICAiMHhmZlhYZWUiLAorICAgICAgICAiMHhmb29iYXIiLAorICAgICAgICAiMHhmZmZmZWVlZWVlZWUiLAorICAgICAgICAiI2ZmMDAwMCIsCisgICAgICAgICIjZmZYWDAwIiwKKyAgICAgICAgImZmMDAwMCIsCisgICAgICAgICJmZlhYMDAiLAorICAgICAgICAicmVkQGZvbyIsCisgICAgICAgICJyYW5kb21AMTAiLAorICAgICAgICAiMHhmZjAwMDBAMS4wIiwKKyAgICAgICAgInJlZEAiLAorICAgICAgICAicmVkQDB4ZmZmIiwKKyAgICAgICAgInJlZEAweGYiLAorICAgICAgICAicmVkQDIiLAorICAgICAgICAicmVkQDAuMSIsCisgICAgICAgICJyZWRALTEiLAorICAgICAgICAicmVkQDAuNSIsCisgICAgICAgICJyZWRAMS4wIiwKKyAgICAgICAgInJlZEAyNTYiLAorICAgICAgICAicmVkQDEwZm9vIiwKKyAgICAgICAgInJlZEAtMS4wIiwKKyAgICAgICAgInJlZEAtMC4wIiwKKyAgICB9OworCisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOworCisgICAgZm9yIChpID0gMDsgIGkgPCBGRl9BUlJBWV9FTEVNUyhjb2xvcl9uYW1lcyk7IGkrKykgeworICAgICAgICBpZiAoYXZfcGFyc2VfY29sb3IocmdiYSwgY29sb3JfbmFtZXNbaV0sIC0xLCBOVUxMKSA+PSAwKQorICAgICAgICAgICAgcHJpbnRmKCIlcyAtPiBSKCVkKSBHKCVkKSBCKCVkKSBBKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICBjb2xvcl9uYW1lc1tpXSwgcmdiYVswXSwgcmdiYVsxXSwgcmdiYVsyXSwgcmdiYVszXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiJXMgLT4gZXJyb3JcbiIsIGNvbG9yX25hbWVzW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYXZfc21hbGxfc3RycHRpbWUodm9pZCkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJ1Y3QgdG0gdG0gPSB7IDAgfTsKKyAgICBzdHJ1Y3QgZm10X3RpbWVzcGVjX2VudHJ5IHsKKyAgICAgICAgY29uc3QgY2hhciAqZm10LCAqdGltZXNwZWM7CisgICAgfSBmbXRfdGltZXNwZWNfZW50cmllc1tdID0geworICAgICAgICB7ICIlWS0lbS0lZCIsICAgICAgICAgICAgICAgICAgICAiMjAxMi0xMi0yMSIgfSwKKyAgICAgICAgeyAiJVkgLSAlbSAtICVkIiwgICAgICAgICAgICAgICAgIjIwMTItMTItMjEiIH0sCisgICAgICAgIHsgIiVZLSVtLSVkICVIOiVNOiVTIiwgICAgICAgICAgICIyMDEyLTEyLTIxIDIwOjEyOjIxIiB9LAorICAgICAgICB7ICIgICVZIC0gJW0gLSAlZCAlSCA6ICVNIDogJVMiLCAiICAgMjAxMiAtIDEyIC0gIDIxICAgMjAgOiAxMiA6IDIxIiB9LAorICAgICAgICB7ICIgICVZIC0gJWIgLSAlZCAlSCA6ICVNIDogJVMiLCAiICAgMjAxMiAtIG5PViAtICAyMSAgIDIwIDogMTIgOiAyMSIgfSwKKyAgICAgICAgeyAiICAlWSAtICVCIC0gJWQgJUggOiAlTSA6ICVTIiwgIiAgIDIwMTIgLSBuT1ZlbUJlUiAtICAyMSAgIDIwIDogMTIgOiAyMSIgfSwKKyAgICAgICAgeyAiICAlWSAtICVCJWQgJUggOiAlTSA6ICVTIiwgIiAgIDIwMTIgLSBtYXkyMSAgIDIwIDogMTIgOiAyMSIgfSwKKyAgICAgICAgeyAiICAlWSAtICVCJWQgJUggOiAlTSA6ICVTIiwgIiAgIDIwMTIgLSBtYnkyMSAgIDIwIDogMTIgOiAyMSIgfSwKKyAgICAgICAgeyAiICAlWSAtICVCIC0gJWQgJUggOiAlTSA6ICVTIiwgIiAgIDIwMTIgLSBKdW5FIC0gIDIxICAgMjAgOiAxMiA6IDIxIiB9LAorICAgICAgICB7ICIgICVZIC0gJUIgLSAlZCAlSCA6ICVNIDogJVMiLCAiICAgMjAxMiAtIEphbmUgLSAgMjEgICAyMCA6IDEyIDogMjEiIH0sCisgICAgICAgIHsgIiAgJVkgLSAlQiAtICVkICVIIDogJU0gOiAlUyIsICIgICAyMDEyIC0gSmFudWFyeSAtICAyMSAgIDIwIDogMTIgOiAyMSIgfSwKKyAgICB9OworCisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOworICAgIGZvciAoaSA9IDA7ICBpIDwgRkZfQVJSQVlfRUxFTVMoZm10X3RpbWVzcGVjX2VudHJpZXMpOyBpKyspIHsKKyAgICAgICAgY2hhciAqcDsKKyAgICAgICAgc3RydWN0IGZtdF90aW1lc3BlY19lbnRyeSAqZSA9ICZmbXRfdGltZXNwZWNfZW50cmllc1tpXTsKKyAgICAgICAgcHJpbnRmKCJmbXQ6JyVzJyBzcGVjOiclcycgLT4gIiwgZS0+Zm10LCBlLT50aW1lc3BlYyk7CisgICAgICAgIHAgPSBhdl9zbWFsbF9zdHJwdGltZShlLT50aW1lc3BlYywgZS0+Zm10LCAmdG0pOworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgcHJpbnRmKCIlMDRkLSUwMmQtJTJkICUwMmQ6JTAyZDolMDJkXG4iLAorICAgICAgICAgICAgICAgICAgIDE5MDArdG0udG1feWVhciwgdG0udG1fbW9uKzEsIHRtLnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgdG0udG1faG91ciwgdG0udG1fbWluLCB0bS50bV9zZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJlcnJvclxuIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfYXZfcGFyc2VfdGltZSh2b2lkKQoreworICAgIGludCBpOworICAgIGludDY0X3QgdHY7CisgICAgdGltZV90IHR2aTsKKyAgICBzdHJ1Y3QgdG0gKnRtOworICAgIHN0YXRpYyBjaGFyIHR6c3RyW10gPSAiVFo9Q0VULTEiOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGltZV9zdHJpbmdbXSA9IHsKKyAgICAgICAgIm5vdyIsCisgICAgICAgICIxMjozNTo0NiIsCisgICAgICAgICIyMDAwLTEyLTIwIDA6MDI6NDcuNXoiLAorICAgICAgICAiMjAxMiAtIDAyLTIyICAxNzo0NDowNyIsCisgICAgICAgICIyMDAwLTEyLTIwVDAxMDI0Ny42IiwKKyAgICAgICAgIjIwMDAtMTItMTIgMTozNTo0NiswNTozMCIsCisgICAgICAgICIyMDAyLTEyLTEyIDIyOjMwOjQwLTAyIiwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZHVyYXRpb25fc3RyaW5nW10gPSB7CisgICAgICAgICIyOjM0OjU2Ljc5IiwKKyAgICAgICAgIi0xOjIzOjQ1LjY3IiwKKyAgICAgICAgIjQyLjE3MjkiLAorICAgICAgICAiLTE3MjkuNDIiLAorICAgICAgICAiMTI6MzQiLAorICAgIH07CisKKyAgICBhdl9sb2dfc2V0X2xldmVsKEFWX0xPR19ERUJVRyk7CisgICAgcHV0ZW52KHR6c3RyKTsKKyAgICBwcmludGYoIihub3cgaXMgMjAxMi0wMy0xNyAwOToxNDoxMy4yICswMTAwLCBsb2NhbCB0aW1lIGlzIFVUQysxKVxuIik7CisgICAgZm9yIChpID0gMDsgIGkgPCBGRl9BUlJBWV9FTEVNUyh0aW1lX3N0cmluZyk7IGkrKykgeworICAgICAgICBwcmludGYoIiUtMjRzIC0+ICIsIHRpbWVfc3RyaW5nW2ldKTsKKyAgICAgICAgaWYgKGF2X3BhcnNlX3RpbWUoJnR2LCB0aW1lX3N0cmluZ1tpXSwgMCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiZXJyb3JcbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHZpID0gdHYgLyAxMDAwMDAwOworICAgICAgICAgICAgdG0gPSBnbXRpbWUoJnR2aSk7CisgICAgICAgICAgICBwcmludGYoIiUxNCJQUklpNjQiLiUwNmQgPSAlMDRkLSUwMmQtJTAyZFQlMDJkOiUwMmQ6JTAyZFpcbiIsCisgICAgICAgICAgICAgICAgICAgdHYgLyAxMDAwMDAwLCAoaW50KSh0diAlIDEwMDAwMDApLAorICAgICAgICAgICAgICAgICAgIHRtLT50bV95ZWFyICsgMTkwMCwgdG0tPnRtX21vbiArIDEsIHRtLT50bV9tZGF5LAorICAgICAgICAgICAgICAgICAgIHRtLT50bV9ob3VyLCB0bS0+dG1fbWluLCB0bS0+dG1fc2VjKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGkgPSAwOyAgaSA8IEZGX0FSUkFZX0VMRU1TKGR1cmF0aW9uX3N0cmluZyk7IGkrKykgeworICAgICAgICBwcmludGYoIiUtMjRzIC0+ICIsIGR1cmF0aW9uX3N0cmluZ1tpXSk7CisgICAgICAgIGlmIChhdl9wYXJzZV90aW1lKCZ0diwgZHVyYXRpb25fc3RyaW5nW2ldLCAxKSkgeworICAgICAgICAgICAgcHJpbnRmKCJlcnJvclxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmludGYoIiUrMjEiUFJJaTY0IlxuIiwgdHYpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2F2X2dldF9rbm93bl9jb2xvcl9uYW1lKHZvaWQpCit7CisgICAgaW50IGk7CisgICAgY29uc3QgdWludDhfdCAqcmdiYTsKKyAgICBjb25zdCBjaGFyICpjb2xvcjsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhjb2xvcl90YWJsZSk7ICsraSkgeworICAgICAgICBjb2xvciA9IGF2X2dldF9rbm93bl9jb2xvcl9uYW1lKGksICZyZ2JhKTsKKyAgICAgICAgaWYgKGNvbG9yKQorICAgICAgICAgICAgcHJpbnRmKCIlcyAtPiBSKCVkKSBHKCVkKSBCKCVkKSBBKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgY29sb3IsIHJnYmFbMF0sIHJnYmFbMV0sIHJnYmFbMl0sIHJnYmFbM10pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmludGYoIkNvbG9yIElEOiAlZCBub3QgZm91bmRcbiIsIGkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgdGVzdF9hdl9maW5kX2luZm9fdGFnKHZvaWQpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgYXJnc1tdID0gIj90YWcxPXZhbDEmdGFnMj12YWwyJnRhZzM9dmFsMyZ0YWc0MT12YWx1ZSA0MSZ0YWc0Mj1yYW5kb20xIjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqdGFnc1tdID0geyJ0YWcxIiwgInRhZzIiLCAidGFnMyIsICJ0YWc0IiwgInRhZzQxIiwgIjQxIiwgInJhbmRvbTEifTsKKyAgICBjaGFyIGJ1ZmZbMTZdOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHRhZ3MpOyArK2kpIHsKKyAgICAgICAgaWYgKGF2X2ZpbmRfaW5mb190YWcoYnVmZiwgc2l6ZW9mKGJ1ZmYpLCB0YWdzW2ldLCBhcmdzKSkKKyAgICAgICAgICAgIHByaW50ZigiJWQuICVzIGZvdW5kOiAlc1xuIiwgaSwgdGFnc1tpXSwgYnVmZik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByaW50ZigiJWQuICVzIG5vdCBmb3VuZFxuIiwgaSwgdGFnc1tpXSk7CisgICAgfQorfQorCitpbnQgbWFpbih2b2lkKQoreworICAgIHByaW50ZigiVGVzdGluZyBhdl9wYXJzZV92aWRlb19yYXRlKClcbiIpOworICAgIHRlc3RfYXZfcGFyc2VfdmlkZW9fcmF0ZSgpOworCisgICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfcGFyc2VfY29sb3IoKVxuIik7CisgICAgdGVzdF9hdl9wYXJzZV9jb2xvcigpOworCisgICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfc21hbGxfc3RycHRpbWUoKVxuIik7CisgICAgdGVzdF9hdl9zbWFsbF9zdHJwdGltZSgpOworCisgICAgcHJpbnRmKCJcblRlc3RpbmcgYXZfcGFyc2VfdGltZSgpXG4iKTsKKyAgICB0ZXN0X2F2X3BhcnNlX3RpbWUoKTsKKworICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X2dldF9rbm93bl9jb2xvcl9uYW1lKClcbiIpOworICAgIHRlc3RfYXZfZ2V0X2tub3duX2NvbG9yX25hbWUoKTsKKworICAgIHByaW50ZigiXG5UZXN0aW5nIGF2X2ZpbmRfaW5mb190YWcoKVxuIik7CisgICAgdGVzdF9hdl9maW5kX2luZm9fdGFnKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvcGNhLmMgYi9saWJhdnV0aWwvdGVzdHMvcGNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5ZWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9wY2EuYwpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIHByaW5jaXBhbCBjb21wb25lbnQgYW5hbHlzaXMgKFBDQSkKKyAqIENvcHlyaWdodCAoYykgMjAwNCBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3BjYS5jIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKworI3VuZGVmIHByaW50ZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKK2ludCBtYWluKHZvaWQpeworICAgIFBDQSAqcGNhOworICAgIGludCBpLCBqLCBrOworI2RlZmluZSBMRU4gOAorICAgIGRvdWJsZSBlaWdlbnZlY3RvcltMRU4qTEVOXTsKKyAgICBkb3VibGUgZWlnZW52YWx1ZVtMRU5dOworICAgIEFWTEZHIHBybmc7CisKKyAgICBhdl9sZmdfaW5pdCgmcHJuZywgMSk7CisKKyAgICBwY2E9IGZmX3BjYV9pbml0KExFTik7CisKKyAgICBmb3IoaT0wOyBpPDkwMDAwMDA7IGkrKyl7CisgICAgICAgIGRvdWJsZSB2WzIqTEVOKzEwMF07CisgICAgICAgIGRvdWJsZSBzdW09MDsKKyAgICAgICAgaW50IHBvcyA9IGF2X2xmZ19nZXQoJnBybmcpICUgTEVOOworICAgICAgICBpbnQgdjIgID0gYXZfbGZnX2dldCgmcHJuZykgJSAxMDEgLSA1MDsKKyAgICAgICAgdlswXSAgICA9IGF2X2xmZ19nZXQoJnBybmcpICUgMTAxIC0gNTA7CisgICAgICAgIGZvcihqPTE7IGo8ODsgaisrKXsKKyAgICAgICAgICAgIGlmKGo8PXBvcykgdltqXT0gdlswXTsKKyAgICAgICAgICAgIGVsc2UgICAgICAgdltqXT0gdjI7CisgICAgICAgICAgICBzdW0gKz0gdltqXTsKKyAgICAgICAgfQorLyogICAgICAgIGZvcihqPTA7IGo8TEVOOyBqKyspeworICAgICAgICAgICAgdltqXSAtPSB2W3Bvc107CisgICAgICAgIH0qLworLy8gICAgICAgIHN1bSArPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDEwOworLyogICAgICAgIGZvcihqPTA7IGo8TEVOOyBqKyspeworICAgICAgICAgICAgdltqXSAtPSBzdW0vTEVOOworICAgICAgICB9Ki8KKy8vICAgICAgICBsYnQxKHYrMTAwLHYrMTAwLExFTik7CisgICAgICAgIGZmX3BjYV9hZGQocGNhLCB2KTsKKyAgICB9CisKKworICAgIGZmX3BjYShwY2EsIGVpZ2VudmVjdG9yLCBlaWdlbnZhbHVlKTsKKyAgICBmb3IoaT0wOyBpPExFTjsgaSsrKXsKKyAgICAgICAgcGNhLT5jb3VudD0gMTsKKyAgICAgICAgcGNhLT5tZWFuW2ldPSAwOworCisvLyAgICAgICAgKDAuNV58eHwpXjIgPSAwLjVeMnx4fCA9IDAuMjVefHh8CisKKworLy8gICAgICAgIHBjYS5jb3ZhcmlhbmNlW2kgKyBpKkxFTl09IHBvdygwLjUsIGZhYnMKKyAgICAgICAgZm9yKGo9aTsgajxMRU47IGorKyl7CisgICAgICAgICAgICBwcmludGYoIiVmICIsIHBjYS0+Y292YXJpYW5jZVtpICsgaipMRU5dKTsKKyAgICAgICAgfQorICAgICAgICBwcmludGYoIlxuIik7CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxMRU47IGkrKyl7CisgICAgICAgIGRvdWJsZSB2W0xFTl07CisgICAgICAgIGRvdWJsZSBlcnJvcj0wOworICAgICAgICBtZW1zZXQodiwgMCwgc2l6ZW9mKHYpKTsKKyAgICAgICAgZm9yKGo9MDsgajxMRU47IGorKyl7CisgICAgICAgICAgICBmb3Ioaz0wOyBrPExFTjsgaysrKXsKKyAgICAgICAgICAgICAgICB2W2pdICs9IHBjYS0+Y292YXJpYW5jZVtGRk1JTihrLGopICsgRkZNQVgoayxqKSpMRU5dICogZWlnZW52ZWN0b3JbaSArIGsqTEVOXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZbal0gLz0gZWlnZW52YWx1ZVtpXTsKKyAgICAgICAgICAgIGVycm9yICs9IGZhYnModltqXSAtIGVpZ2VudmVjdG9yW2kgKyBqKkxFTl0pOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiJWYgIiwgZXJyb3IpOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisKKyAgICBmb3IoaT0wOyBpPExFTjsgaSsrKXsKKyAgICAgICAgZm9yKGo9MDsgajxMRU47IGorKyl7CisgICAgICAgICAgICBwcmludGYoIiU5LjZmICIsIGVpZ2VudmVjdG9yW2kgKyBqKkxFTl0pOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiICAlOS4xZiAlZlxuIiwgZWlnZW52YWx1ZVtpXSwgZWlnZW52YWx1ZVtpXS9laWdlbnZhbHVlWzBdKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9waXhkZXNjLmMgYi9saWJhdnV0aWwvdGVzdHMvcGl4ZGVzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYmZlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvcGl4ZGVzYy5jCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBwaXhlbCBmb3JtYXQgZGVzY3JpcHRvcgorICogQ29weXJpZ2h0IChjKSAyMDA5IE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5jIgorCitpbnQgbWFpbih2b2lkKXsKKyAgICBpbnQgaTsKKyAgICBpbnQgZXJyPTA7CisgICAgaW50IHNraXAgPSAwOworCisgICAgZm9yIChpPTA7IGk8QVZfUElYX0ZNVF9OQioyOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsKKyAgICAgICAgaWYoIWRlc2MgfHwgIWRlc2MtPm5hbWUpIHsKKyAgICAgICAgICAgIHNraXAgKys7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2tpcCkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiJTNkIHVudXNlZCBwaXhlbCBmb3JtYXQgdmFsdWVzXG4iLCBza2lwKTsKKyAgICAgICAgICAgIHNraXAgPSAwOworICAgICAgICB9CisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgInBpeCBmbXQgJXMgYXZnX2JwcDolZCBjb2xvcnR5cGU6JWRcbiIsIGRlc2MtPm5hbWUsIGF2X2dldF9wYWRkZWRfYml0c19wZXJfcGl4ZWwoZGVzYyksIGdldF9jb2xvcl90eXBlKGRlc2MpKTsKKyAgICAgICAgaWYgKCghKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBKSkgIT0gKGRlc2MtPm5iX2NvbXBvbmVudHMgIT0gMiAmJiBkZXNjLT5uYl9jb21wb25lbnRzICE9IDQpKSB7CisgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQWxwaGEgZmxhZyBtaXNtYXRjaFxuIik7CisgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvcGl4ZWx1dGlscy5jIGIvbGliYXZ1dGlsL3Rlc3RzL3BpeGVsdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRkYzhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL3BpeGVsdXRpbHMuYwpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGVsdXRpbHMuYyIKKworI2RlZmluZSBXMSAzMjAKKyNkZWZpbmUgSDEgMjQwCisjZGVmaW5lIFcyIDY0MAorI2RlZmluZSBIMiA0ODAKKworc3RhdGljIGludCBydW5fc2luZ2xlX3Rlc3QoY29uc3QgY2hhciAqdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJsb2NrMSwgcHRyZGlmZl90IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpibG9jazIsIHB0cmRpZmZfdCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsaWduLCBpbnQgbikKK3sKKyAgICBpbnQgb3V0LCByZWY7CisgICAgYXZfcGl4ZWx1dGlsc19zYWRfZm4gZl9yZWYgPSBzYWRfY1tuIC0gMV07CisgICAgYXZfcGl4ZWx1dGlsc19zYWRfZm4gZl9vdXQgPSBhdl9waXhlbHV0aWxzX2dldF9zYWRfZm4obiwgbiwgYWxpZ24sIE5VTEwpOworCisgICAgc3dpdGNoIChhbGlnbikgeworICAgIGNhc2UgMDogYmxvY2sxKys7IGJsb2NrMisrOyBicmVhazsKKyAgICBjYXNlIDE6ICAgICAgICAgICBibG9jazIrKzsgYnJlYWs7CisgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIG91dCA9IGZfb3V0KGJsb2NrMSwgc3RyaWRlMSwgYmxvY2syLCBzdHJpZGUyKTsKKyAgICByZWYgPSBmX3JlZihibG9jazEsIHN0cmlkZTEsIGJsb2NrMiwgc3RyaWRlMik7CisgICAgcHJpbnRmKCJbJXNdIFslYyVjXSBTQUQgWyVzXSAlZHglZD0lZCByZWY9JWRcbiIsCisgICAgICAgICAgIG91dCA9PSByZWYgPyAiT0siIDogIkZBSUwiLAorICAgICAgICAgICBhbGlnbiA/ICdBJyA6ICdVJywgYWxpZ24gPT0gMiA/ICdBJyA6ICdVJywKKyAgICAgICAgICAgdGVzdCwgMTw8biwgMTw8biwgb3V0LCByZWYpOworICAgIHJldHVybiBvdXQgIT0gcmVmOworfQorCitzdGF0aWMgaW50IHJ1bl90ZXN0KGNvbnN0IGNoYXIgKnRlc3QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmIxLCBjb25zdCB1aW50OF90ICpiMikKK3sKKyAgICBpbnQgaSwgYSwgcmV0ID0gMDsKKworICAgIGZvciAoYSA9IDA7IGEgPCAzOyBhKyspIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqYmxvY2sxID0gYjE7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJsb2NrMiA9IGIyOworCisgICAgICAgIHN3aXRjaCAoYSkgeworICAgICAgICBjYXNlIDA6IGJsb2NrMSsrOyBibG9jazIrKzsgYnJlYWs7CisgICAgICAgIGNhc2UgMTogICAgICAgICAgIGJsb2NrMisrOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gRkZfQVJSQVlfRUxFTVMoc2FkX2MpOyBpKyspIHsKKyAgICAgICAgICAgIGludCByID0gcnVuX3NpbmdsZV90ZXN0KHRlc3QsIGIxLCBXMSwgYjIsIFcyLCBhLCBpKTsKKyAgICAgICAgICAgIGlmIChyKQorICAgICAgICAgICAgICAgIHJldCA9IHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaSwgYWxpZ24sIHJldDsKKyAgICB1aW50OF90ICpidWYxID0gYXZfbWFsbG9jKFcxKkgxKTsKKyAgICB1aW50OF90ICpidWYyID0gYXZfbWFsbG9jKFcyKkgyKTsKKyAgICB1aW50MzJfdCBzdGF0ZSA9IDA7CisKKyAgICBpZiAoIWJ1ZjEgfHwgIWJ1ZjIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxsb2MgZmFpbHVyZVxuIik7CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGZmX2NoZWNrX3BpeGZtdF9kZXNjcmlwdG9ycygpOworCisjZGVmaW5lIFJBTkRPTV9JTklUKGJ1Ziwgc2l6ZSkgZG8geyAgICAgICAgICAgICBcCisgICAgaW50IGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykgeyAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRlID0gc3RhdGUgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMzsgICBcCisgICAgICAgIGJ1ZltrXSA9IHN0YXRlPj4yNDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisgICAgLyogTm9ybWFsIHRlc3Qgd2l0aCBkaWZmZXJlbnQgc3RyaWRlcyAqLworICAgIFJBTkRPTV9JTklUKGJ1ZjEsIFcxKkgxKTsKKyAgICBSQU5ET01fSU5JVChidWYyLCBXMipIMik7CisgICAgcmV0ID0gcnVuX3Rlc3QoInJhbmRvbSIsIGJ1ZjEsIGJ1ZjIpOworICAgIGlmIChyZXQgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKworICAgIC8qIENoZWNrIGZvciBtYXhpbXVtIFNBRCAqLworICAgIG1lbXNldChidWYxLCAweGZmLCBXMSpIMSk7CisgICAgbWVtc2V0KGJ1ZjIsIDB4MDAsIFcyKkgyKTsKKyAgICByZXQgPSBydW5fdGVzdCgibWF4IiwgYnVmMSwgYnVmMik7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIGdvdG8gZW5kOworCisgICAgLyogQ2hlY2sgZm9yIG1pbmltdW0gU0FEICovCisgICAgbWVtc2V0KGJ1ZjEsIDB4OTAsIFcxKkgxKTsKKyAgICBtZW1zZXQoYnVmMiwgMHg5MCwgVzIqSDIpOworICAgIHJldCA9IHJ1bl90ZXN0KCJtaW4iLCBidWYxLCBidWYyKTsKKyAgICBpZiAocmV0IDwgMCkKKyAgICAgICAgZ290byBlbmQ7CisKKyAgICAvKiBFeGFjdCBidWZmZXIgc2l6ZXMsIHRvIGNoZWNrIGZvciBvdmVycmVhZHMgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDw9IDQ7IGkrKykgeworICAgICAgICBmb3IgKGFsaWduID0gMDsgYWxpZ24gPCAzOyBhbGlnbisrKSB7CisgICAgICAgICAgICBpbnQgc2l6ZTEsIHNpemUyOworCisgICAgICAgICAgICBhdl9mcmVlcCgmYnVmMSk7CisgICAgICAgICAgICBhdl9mcmVlcCgmYnVmMik7CisKKyAgICAgICAgICAgIHNpemUxID0gc2l6ZTIgPSAxIDw8IChpIDw8IDEpOworCisgICAgICAgICAgICBzd2l0Y2ggKGFsaWduKSB7CisgICAgICAgICAgICBjYXNlIDA6IHNpemUxKys7IHNpemUyKys7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICBzaXplMisrOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZjEgPSBhdl9tYWxsb2Moc2l6ZTEpOworICAgICAgICAgICAgYnVmMiA9IGF2X21hbGxvYyhzaXplMik7CisgICAgICAgICAgICBpZiAoIWJ1ZjEgfHwgIWJ1ZjIpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlXG4iKTsKKyAgICAgICAgICAgICAgICByZXQgPSAxOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUkFORE9NX0lOSVQoYnVmMSwgc2l6ZTEpOworICAgICAgICAgICAgUkFORE9NX0lOSVQoYnVmMiwgc2l6ZTIpOworICAgICAgICAgICAgcmV0ID0gcnVuX3NpbmdsZV90ZXN0KCJzbWFsbCIsIGJ1ZjEsIDE8PGksIGJ1ZjIsIDE8PGksIGFsaWduLCBpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICB9CisgICAgfQorCitlbmQ6CisgICAgYXZfZnJlZShidWYxKTsKKyAgICBhdl9mcmVlKGJ1ZjIpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvcGl4Zm10X2Jlc3QuYyBiL2xpYmF2dXRpbC90ZXN0cy9waXhmbXRfYmVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OGZjYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvcGl4Zm10X2Jlc3QuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuYyIKKworc3RhdGljIGNvbnN0IGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXRfbGlzdFtdID0geworICAgIEFWX1BJWF9GTVRfTU9OT1dISVRFLAorICAgIEFWX1BJWF9GTVRfR1JBWTgsCisgICAgQVZfUElYX0ZNVF9HUkFZMTAsCisgICAgQVZfUElYX0ZNVF9HUkFZMTYsCisgICAgQVZfUElYX0ZNVF9ZVVY0MjBQLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwLAorICAgIEFWX1BJWF9GTVRfWVVWNDIwUDE2LAorICAgIEFWX1BJWF9GTVRfWVVWNDIyUCwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAxMCwKKyAgICBBVl9QSVhfRk1UX1lVVjQyMlAxNiwKKyAgICBBVl9QSVhfRk1UX1lVVjQ0NFAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTAsCisgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYsCisgICAgQVZfUElYX0ZNVF9SR0I1NjUsCisgICAgQVZfUElYX0ZNVF9SR0IyNCwKKyAgICBBVl9QSVhfRk1UX1JHQjQ4LAorICAgIEFWX1BJWF9GTVRfVkRQQVUsCisgICAgQVZfUElYX0ZNVF9WQUFQSSwKK307CisKK3N0YXRpYyBlbnVtIEFWUGl4ZWxGb3JtYXQgZmluZF9iZXN0KGVudW0gQVZQaXhlbEZvcm1hdCBwaXhmbXQpCit7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGJlc3QgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IEZGX0FSUkFZX0VMRU1TKHBpeGZtdF9saXN0KTsgaSsrKQorICAgICAgICBiZXN0ID0gYXZfZmluZF9iZXN0X3BpeF9mbXRfb2ZfMihiZXN0LCBwaXhmbXRfbGlzdFtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4Zm10LCAwLCBOVUxMKTsKKyAgICByZXR1cm4gYmVzdDsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgb3V0cHV0OworICAgIGludCBpLCBwYXNzID0gMCwgZmFpbCA9IDA7CisKKyNkZWZpbmUgVEVTVChpbnB1dCwgZXhwZWN0ZWQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG91dHB1dCA9IGZpbmRfYmVzdChpbnB1dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3V0cHV0ICE9IGV4cGVjdGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHByaW50ZigiTWF0Y2hpbmcgJXM6IGdvdCAlcywgZXhwZWN0ZWQgJXNcbiIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgYXZfZ2V0X3BpeF9mbXRfbmFtZShpbnB1dCksICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGF2X2dldF9waXhfZm10X25hbWUob3V0cHV0KSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKGV4cGVjdGVkKSk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICArK2ZhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICsrcGFzczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworICAgIC8vIFNhbWUgZm9ybWF0cy4KKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocGl4Zm10X2xpc3QpOyBpKyspCisgICAgICAgIFRFU1QocGl4Zm10X2xpc3RbaV0sIHBpeGZtdF9saXN0W2ldKTsKKworICAgIC8vIEZvcm1hdHMgY29udGFpbmluZyB0aGUgc2FtZSBkYXRhIGluIGRpZmZlcmVudCBsYXlvdXRzLgorICAgIFRFU1QoQVZfUElYX0ZNVF9NT05PQkxBQ0ssIEFWX1BJWF9GTVRfTU9OT1dISVRFKTsKKyAgICBURVNUKEFWX1BJWF9GTVRfTlYxMiwgICAgICBBVl9QSVhfRk1UX1lVVjQyMFApOworICAgIFRFU1QoQVZfUElYX0ZNVF9QMDEwLCAgICAgIEFWX1BJWF9GTVRfWVVWNDIwUDEwKTsKKyAgICBURVNUKEFWX1BJWF9GTVRfUDAxNiwgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAxNik7CisgICAgVEVTVChBVl9QSVhfRk1UX05WMTYsICAgICAgQVZfUElYX0ZNVF9ZVVY0MjJQKTsKKyAgICBURVNUKEFWX1BJWF9GTVRfWVVZVjQyMiwgICBBVl9QSVhfRk1UX1lVVjQyMlApOworICAgIFRFU1QoQVZfUElYX0ZNVF9VWVZZNDIyLCAgIEFWX1BJWF9GTVRfWVVWNDIyUCk7CisgICAgVEVTVChBVl9QSVhfRk1UX0JHUjU2NSwgICAgQVZfUElYX0ZNVF9SR0I1NjUpOworICAgIFRFU1QoQVZfUElYX0ZNVF9CR1IyNCwgICAgIEFWX1BJWF9GTVRfUkdCMjQpOworICAgIFRFU1QoQVZfUElYX0ZNVF9HQlJQLCAgICAgIEFWX1BJWF9GTVRfUkdCMjQpOworICAgIFRFU1QoQVZfUElYX0ZNVF8wUkdCLCAgICAgIEFWX1BJWF9GTVRfUkdCMjQpOworICAgIFRFU1QoQVZfUElYX0ZNVF9HQlJQMTYsICAgIEFWX1BJWF9GTVRfUkdCNDgpOworCisgICAgLy8gRm9ybWF0cyBhZGRpdGlvbmFsbHkgY29udGFpbmluZyBhbHBoYSAoaGVyZSBpZ25vcmVkKS4KKyAgICBURVNUKEFWX1BJWF9GTVRfWUE4LCAgICAgICBBVl9QSVhfRk1UX0dSQVk4KTsKKyAgICBURVNUKEFWX1BJWF9GTVRfWUExNiwgICAgICBBVl9QSVhfRk1UX0dSQVkxNik7CisgICAgVEVTVChBVl9QSVhfRk1UX1lVVkE0MjBQLCAgQVZfUElYX0ZNVF9ZVVY0MjBQKTsKKyAgICBURVNUKEFWX1BJWF9GTVRfWVVWQTQyMlAsICBBVl9QSVhfRk1UX1lVVjQyMlApOworICAgIFRFU1QoQVZfUElYX0ZNVF9ZVVZBNDQ0UCwgIEFWX1BJWF9GTVRfWVVWNDQ0UCk7CisgICAgVEVTVChBVl9QSVhfRk1UX0FZVVY2NCwgICAgQVZfUElYX0ZNVF9ZVVY0NDRQMTYpOworICAgIFRFU1QoQVZfUElYX0ZNVF9SR0JBLCAgICAgIEFWX1BJWF9GTVRfUkdCMjQpOworICAgIFRFU1QoQVZfUElYX0ZNVF9BQkdSLCAgICAgIEFWX1BJWF9GTVRfUkdCMjQpOworICAgIFRFU1QoQVZfUElYX0ZNVF9HQlJBUCwgICAgIEFWX1BJWF9GTVRfUkdCMjQpOworICAgIFRFU1QoQVZfUElYX0ZNVF9SR0JBNjQsICAgIEFWX1BJWF9GTVRfUkdCNDgpOworICAgIFRFU1QoQVZfUElYX0ZNVF9CR1JBNjQsICAgIEFWX1BJWF9GTVRfUkdCNDgpOworICAgIFRFU1QoQVZfUElYX0ZNVF9HQlJBUDE2LCAgIEFWX1BJWF9GTVRfUkdCNDgpOworCisgICAgLy8gRm9ybWF0cyByZXF1aXJpbmcgdXBzYW1wbGluZyB0byByZXByZXNlbnQgZXhhY3RseS4KKyAgICBURVNUKEFWX1BJWF9GTVRfR1JBWTEyLCAgICBBVl9QSVhfRk1UX0dSQVkxNik7CisgICAgVEVTVChBVl9QSVhfRk1UX1lVVjQxMFAsICAgQVZfUElYX0ZNVF9ZVVY0MjBQKTsKKyAgICBURVNUKEFWX1BJWF9GTVRfWVVWNDExUCwgICBBVl9QSVhfRk1UX1lVVjQyMlApOworICAgIFRFU1QoQVZfUElYX0ZNVF9VWVlWWVk0MTEsIEFWX1BJWF9GTVRfWVVWNDIyUCk7CisgICAgVEVTVChBVl9QSVhfRk1UX1lVVjQ0MFAsICAgQVZfUElYX0ZNVF9ZVVY0NDRQKTsKKyAgICBURVNUKEFWX1BJWF9GTVRfWVVWNDQwUDEwLCBBVl9QSVhfRk1UX1lVVjQ0NFAxMCk7CisgICAgVEVTVChBVl9QSVhfRk1UX1lVVjQ0MFAxMiwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYpOworICAgIFRFU1QoQVZfUElYX0ZNVF9ZVVY0MjBQOSwgIEFWX1BJWF9GTVRfWVVWNDIwUDEwKTsKKyAgICBURVNUKEFWX1BJWF9GTVRfWVVWNDIwUDEyLCBBVl9QSVhfRk1UX1lVVjQyMFAxNik7CisgICAgVEVTVChBVl9QSVhfRk1UX1lVVjQ0NFA5LCAgQVZfUElYX0ZNVF9ZVVY0NDRQMTApOworICAgIFRFU1QoQVZfUElYX0ZNVF9ZVVY0NDRQMTIsIEFWX1BJWF9GTVRfWVVWNDQ0UDE2KTsKKyAgICBURVNUKEFWX1BJWF9GTVRfQkdSNCwgICAgICBBVl9QSVhfRk1UX1JHQjU2NSk7CisgICAgVEVTVChBVl9QSVhfRk1UX1JHQjQ0NCwgICAgQVZfUElYX0ZNVF9SR0I1NjUpOworICAgIFRFU1QoQVZfUElYX0ZNVF9SR0I1NTUsICAgIEFWX1BJWF9GTVRfUkdCNTY1KTsKKyAgICBURVNUKEFWX1BJWF9GTVRfR0JSUDEwLCAgICBBVl9QSVhfRk1UX1JHQjQ4KTsKKyAgICBURVNUKEFWX1BJWF9GTVRfR0JSQVAxMCwgICBBVl9QSVhfRk1UX1JHQjQ4KTsKKyAgICBURVNUKEFWX1BJWF9GTVRfR0JSQVAxMiwgICBBVl9QSVhfRk1UX1JHQjQ4KTsKKworICAgIC8vIEZvcm1hdHMgY29udGFpbmluZyB0aGUgc2FtZSBkYXRhIGluIGRpZmZlcmVudCBlbmRpYW5uZXNzLgorICAgIFRFU1QoQVZfUElYX0ZNVF9HUkFZMTBCRSwgICAgQVZfUElYX0ZNVF9HUkFZMTApOworICAgIFRFU1QoQVZfUElYX0ZNVF9HUkFZMTBMRSwgICAgQVZfUElYX0ZNVF9HUkFZMTApOworICAgIFRFU1QoQVZfUElYX0ZNVF9HUkFZMTZCRSwgICAgQVZfUElYX0ZNVF9HUkFZMTYpOworICAgIFRFU1QoQVZfUElYX0ZNVF9HUkFZMTZMRSwgICAgQVZfUElYX0ZNVF9HUkFZMTYpOworICAgIFRFU1QoQVZfUElYX0ZNVF9ZVVY0MjJQMTBCRSwgQVZfUElYX0ZNVF9ZVVY0MjJQMTApOworICAgIFRFU1QoQVZfUElYX0ZNVF9ZVVY0MjJQMTBMRSwgQVZfUElYX0ZNVF9ZVVY0MjJQMTApOworICAgIFRFU1QoQVZfUElYX0ZNVF9ZVVY0NDRQMTZCRSwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYpOworICAgIFRFU1QoQVZfUElYX0ZNVF9ZVVY0NDRQMTZMRSwgQVZfUElYX0ZNVF9ZVVY0NDRQMTYpOworICAgIFRFU1QoQVZfUElYX0ZNVF9SR0I1NjVCRSwgICAgQVZfUElYX0ZNVF9SR0I1NjUpOworICAgIFRFU1QoQVZfUElYX0ZNVF9SR0I1NjVMRSwgICAgQVZfUElYX0ZNVF9SR0I1NjUpOworICAgIFRFU1QoQVZfUElYX0ZNVF9SR0I0OEJFLCAgICAgQVZfUElYX0ZNVF9SR0I0OCk7CisgICAgVEVTVChBVl9QSVhfRk1UX1JHQjQ4TEUsICAgICBBVl9QSVhfRk1UX1JHQjQ4KTsKKworICAgIC8vIE9wYXF1ZSBmb3JtYXRzIGFyZSBsZWFzdCB1bmxpa2UgZWFjaCBvdGhlci4KKyAgICBURVNUKEFWX1BJWF9GTVRfRFhWQTJfVkxELCBBVl9QSVhfRk1UX1ZEUEFVKTsKKworICAgIHByaW50ZigiJWQgdGVzdHMgcGFzc2VkLCAlZCB0ZXN0cyBmYWlsZWQuXG4iLCBwYXNzLCBmYWlsKTsKKyAgICByZXR1cm4gISFmYWlsOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL3JhbmRvbV9zZWVkLmMgYi9saWJhdnV0aWwvdGVzdHMvcmFuZG9tX3NlZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA2N2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL3JhbmRvbV9zZWVkLmMKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOSBCYXB0aXN0ZSBDb3VkdXJpZXIgPGJhcHRpc3RlLmNvdWR1cmllckBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNkZWZpbmUgVEVTVCAxCisjaW5jbHVkZSAibGliYXZ1dGlsL3JhbmRvbV9zZWVkLmMiCisKKyN1bmRlZiBwcmludGYKKyNkZWZpbmUgTiAyNTYKKyNkZWZpbmUgRiAyCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordHlwZWRlZiB1aW50MzJfdCAoKnJhbmRvbV9zZWVkX3B0cl90KSh2b2lkKTsKKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaSwgaiwgcnNmLCByZXRyeTsKKyAgICB1aW50MzJfdCBzZWVkc1tOXTsKKyAgICByYW5kb21fc2VlZF9wdHJfdCByYW5kb21fc2VlZFtGXSA9IHthdl9nZXRfcmFuZG9tX3NlZWQsIGdldF9nZW5lcmljX3NlZWR9OworCisgICAgZm9yIChyc2Y9MDsgcnNmPEY7ICsrcnNmKXsKKyAgICAgICAgZm9yIChyZXRyeT0wOyByZXRyeTwzOyByZXRyeSsrKXsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPE47IGkrKyl7CisgICAgICAgICAgICAgICAgc2VlZHNbaV0gPSByYW5kb21fc2VlZFtyc2ZdKCk7CisgICAgICAgICAgICAgICAgZm9yIChqPTA7IGo8aTsgaisrKQorICAgICAgICAgICAgICAgICAgICBpZiAoc2VlZHNbal0gPT0gc2VlZHNbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJldHJ5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJpbnRmKCJzZWVkcyBPS1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHJ5OjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0cnkgPj0gMykgeworICAgICAgICAgICAgcHJpbnRmKCJyc2YgJWQ6IEZBSUwgYXQgJWQgd2l0aCAlWFxuIiwgcnNmLCBqLCBzZWVkc1tqXSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9yYXRpb25hbC5jIGIvbGliYXZ1dGlsL3Rlc3RzL3JhdGlvbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlYzA3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9yYXRpb25hbC5jCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogcmF0aW9uYWwgbnVtYmVycworICogQ29weXJpZ2h0IChjKSAyMDAzIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmF0aW9uYWwuYyIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZWdlci5oIgorCitpbnQgbWFpbih2b2lkKQoreworICAgIEFWUmF0aW9uYWwgYSxiLHI7CisgICAgaW50IGksaixrOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IG51bWxpc3RbXSA9IHsKKyAgICAgICAgSU5UNjRfTUlOLCBJTlQ2NF9NSU4rMSwgSU5UNjRfTUFYLCBJTlQzMl9NSU4sIElOVDMyX01BWCwgMSwwLC0xLAorICAgICAgICAxMjM0NTY3ODksIElOVDMyX01BWC0xLCBJTlQzMl9NQVgrMUxMLCBVSU5UMzJfTUFYLTEsIFVJTlQzMl9NQVgsIFVJTlQzMl9NQVgrMUxMCisgICAgfTsKKworICAgIGZvciAoYS5udW0gPSAtMjsgYS5udW0gPD0gMjsgYS5udW0rKykgeworICAgICAgICBmb3IgKGEuZGVuID0gLTI7IGEuZGVuIDw9IDI7IGEuZGVuKyspIHsKKyAgICAgICAgICAgIGZvciAoYi5udW0gPSAtMjsgYi5udW0gPD0gMjsgYi5udW0rKykgeworICAgICAgICAgICAgICAgIGZvciAoYi5kZW4gPSAtMjsgYi5kZW4gPD0gMjsgYi5kZW4rKykgeworICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IGF2X2NtcF9xKGEsYik7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gYXZfcTJkKGEpID09IGF2X3EyZChiKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IChhdl9xMmQoYSkgLSBhdl9xMmQoYikpOworICAgICAgICAgICAgICAgICAgICBpZiAoZCA+IDApICAgICAgIGQgPSAxOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkIDwgMCkgIGQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZCAhPSBkKSBkID0gSU5UX01JTjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgIT0gZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZC8lZCAlZC8lZCwgJWQgJWZcbiIsIGEubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuZGVuLCBiLm51bSwgYi5kZW4sIGMsZCk7CisgICAgICAgICAgICAgICAgICAgIHIgPSBhdl9zdWJfcShhdl9hZGRfcShiLGEpLCBiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoYi5kZW4gJiYgKHIubnVtKmEuZGVuICE9IGEubnVtKnIuZGVuIHx8ICFyLm51bSAhPSAhYS5udW0gfHwgIXIuZGVuICE9ICFhLmRlbikpCisgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQvJWQgIiwgci5udW0sIHIuZGVuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMobnVtbGlzdCk7IGkrKykgeworICAgICAgICBpbnQ2NF90IGEgPSBudW1saXN0W2ldOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBGRl9BUlJBWV9FTEVNUyhudW1saXN0KTsgaisrKSB7CisgICAgICAgICAgICBpbnQ2NF90IGIgPSBudW1saXN0W2pdOworICAgICAgICAgICAgaWYgKGI8PTApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgRkZfQVJSQVlfRUxFTVMobnVtbGlzdCk7IGsrKykgeworICAgICAgICAgICAgICAgIGludDY0X3QgYyA9IG51bWxpc3Rba107CisgICAgICAgICAgICAgICAgaW50NjRfdCByZXM7CisgICAgICAgICAgICAgICAgQVZJbnRlZ2VyIGFpOworCisgICAgICAgICAgICAgICAgaWYgKGM8PTApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHJlcyA9IGF2X3Jlc2NhbGVfcm5kKGEsYixjLCBBVl9ST1VORF9aRVJPKTsKKworICAgICAgICAgICAgICAgIGFpID0gYXZfbXVsX2koYXZfaW50MmkoYSksIGF2X2ludDJpKGIpKTsKKyAgICAgICAgICAgICAgICBhaSA9IGF2X2Rpdl9pKGFpLCBhdl9pbnQyaShjKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXZfY21wX2koYWksIGF2X2ludDJpKElOVDY0X01BWCkpID4gMCAmJiByZXMgPT0gSU5UNjRfTUlOKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoYXZfY21wX2koYWksIGF2X2ludDJpKElOVDY0X01JTikpIDwgMCAmJiByZXMgPT0gSU5UNjRfTUlOKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAoYXZfY21wX2koYWksIGF2X2ludDJpKHJlcykpID09IDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBleGNlcHRpb24gZm9yIElOVDY0X01JTiwgcmVtb3ZlIHRoaXMgaW4gY2FzZSBJTlQ2NF9NSU4gaXMgaGFuZGxlZCB3aXRob3V0IG9mZiBieSAxIGVycm9yCisgICAgICAgICAgICAgICAgaWYgKGF2X2NtcF9pKGFpLCBhdl9pbnQyaShyZXMtMSkpID09IDAgJiYgYSA9PSBJTlQ2NF9NSU4pCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiUiUFJJZDY0IiAqICUiUFJJZDY0IiAvICUiUFJJZDY0IiA9ICUiUFJJZDY0IiBvciAlIlBSSWQ2NCJcbiIsIGEsYixjLCByZXMsIGF2X2kyaW50KGFpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGEubnVtID0gMTsgYS5udW0gPD0gMTA7IGEubnVtKyspIHsKKyAgICAgICAgZm9yIChhLmRlbiA9IDE7IGEuZGVuIDw9IDEwOyBhLmRlbisrKSB7CisgICAgICAgICAgICBpZiAoYXZfZ2NkKGEubnVtLCBhLmRlbikgPiAxKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChiLm51bSA9IDE7IGIubnVtIDw9IDEwOyBiLm51bSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChiLmRlbiA9IDE7IGIuZGVuIDw9IDEwOyBiLmRlbisrKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGFydDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2X2djZChiLm51bSwgYi5kZW4pID4gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBpZiAoYXZfY21wX3EoYiwgYSkgPCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc3RhcnQgPSAwOyBzdGFydCA8IDEwIDsgc3RhcnQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjYz0gc3RhcnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaTwxMDA7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGFjdCA9IHN0YXJ0ICsgYXZfcmVzY2FsZV9xKGkrMSwgYiwgYSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjID0gYXZfYWRkX3N0YWJsZShhLCBhY2MsIGIsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGRkFCUyhhY2MgLSBleGFjdCkgPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZC8lZCAlZC8lZCwgJWQgJWRcbiIsIGEubnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5kZW4sIGIubnVtLCBiLmRlbiwgYWNjLCBleGFjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYS5kZW4gPSAxOyBhLmRlbiA8IDB4MTAwMDAwMDAwVS8zOyBhLmRlbio9MykgeworICAgICAgICBmb3IgKGEubnVtID0gLTE7IGEubnVtIDwgKDE8PDI3KTsgYS5udW0gKz0gMSArIGEubnVtLzEwMCkgeworICAgICAgICAgICAgZmxvYXQgZiAgPSBhdl9pbnQyZmxvYXQoYXZfcTJpbnRmbG9hdChhKSk7CisgICAgICAgICAgICBmbG9hdCBmMiA9IGF2X3EyZChhKTsKKyAgICAgICAgICAgIGlmIChmYWJzKGYgLSBmMikgPiBmYWJzKGYpLzUwMDAwMDApIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQvJWQgJWYgJWZcbiIsIGEubnVtLAorICAgICAgICAgICAgICAgICAgICAgICBhLmRlbiwgZiwgZjIpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9yaXBlbWQuYyBiL2xpYmF2dXRpbC90ZXN0cy9yaXBlbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU1ZmNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL3JpcGVtZC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWljaGFlbCBOaWVkZXJtYXllciA8bWljaGFlbG5pQGdteC5hdD4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBKYW1lcyBBbG1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcmlwZW1kLmgiCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGksIGosIGs7CisgICAgc3RydWN0IEFWUklQRU1EICpjdHg7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbNDBdOworICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuZ3Roc1s0XSA9IHsgMTI4LCAxNjAsIDI1NiwgMzIwIH07CisKKyAgICBjdHggPSBhdl9yaXBlbWRfYWxsb2MoKTsKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIHByaW50ZigiVGVzdGluZyBSSVBFTUQtJWRcbiIsIGxlbmd0aHNbal0pOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7CisgICAgICAgICAgICBhdl9yaXBlbWRfaW5pdChjdHgsIGxlbmd0aHNbal0pOworICAgICAgICAgICAgaWYgKGsgPT0gMCkKKyAgICAgICAgICAgICAgICBhdl9yaXBlbWRfdXBkYXRlKGN0eCwgImFiYyIsIDMpOworICAgICAgICAgICAgZWxzZSBpZiAoayA9PSAxKQorICAgICAgICAgICAgICAgIGF2X3JpcGVtZF91cGRhdGUoY3R4LCAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLCA1Nik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwMDAqMTAwMDsgaSsrKQorICAgICAgICAgICAgICAgICAgICBhdl9yaXBlbWRfdXBkYXRlKGN0eCwgImEiLCAxKTsKKyAgICAgICAgICAgIGF2X3JpcGVtZF9maW5hbChjdHgsIGRpZ2VzdCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3Roc1tqXSA+PiAzOyBpKyspCisgICAgICAgICAgICAgICAgcHJpbnRmKCIlMDJYIiwgZGlnZXN0W2ldKTsKKyAgICAgICAgICAgIHB1dGNoYXIoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChqKSB7IC8vdGVzdCB2ZWN0b3JzIChmcm9tIElTTzpJRUMgMTAxMTgtMyAoMjAwNCkgYW5kIGh0dHA6Ly9ob21lcy5lc2F0Lmt1bGV1dmVuLmJlL35ib3NzZWxhZS9yaXBlbWQxNjAuaHRtbCkKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgcHJpbnRmKCJjMTRhMTIxOSA5YzY2ZTRiYSA4NDYzNmIwZiA2OTE0NGM3N1xuIgorICAgICAgICAgICAgICAgICAgICJhMWFhMDY4OSBkMGZhZmEyZCBkYzIyZTg4YiA0OTEzM2EwNlxuIgorICAgICAgICAgICAgICAgICAgICI0YTdmNTcyMyBmOTU0ZWJhMSAyMTZjOWQ4ZiA2MzIwNDMxZlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgcHJpbnRmKCI4ZWIyMDhmNyBlMDVkOTg3YSA5YjA0NGE4ZSA5OGM2YjA4NyBmMTVhMGJmY1xuIgorICAgICAgICAgICAgICAgICAgICIxMmEwNTMzOCA0YTljMGM4OCBlNDA1YTA2YyAyN2RjZjQ5YSBkYTYyZWIyYlxuIgorICAgICAgICAgICAgICAgICAgICI1Mjc4MzI0MyBjMTY5N2JkYiBlMTZkMzdmOSA3ZjY4ZjA4MyAyNWRjMTUyOFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgcHJpbnRmKCJhZmJkNmUyMiA4YjlkOGNiYiBjZWY1Y2EyZCAwM2U2ZGJhMSAwYWMwYmM3ZCBjYmU0NjgwZSAxZTQyZDJlOSA3NTQ1OWI2NVxuIgorICAgICAgICAgICAgICAgICAgICIzODQzMDQ1NSA4M2FhYzZjOCBjOGQ5MTI4NSA3M2U3YTk4MCA5YWZiMmEwZiAzNGNjYzM2ZSBhOWU3MmYxNiBmNjM2OGUzZlxuIgorICAgICAgICAgICAgICAgICAgICJhYzk1Mzc0NCBlMTBlMzE1MSA0YzE1MGQ0ZCA4ZDdiNjc3MyA0MmUzMzM5OSA3ODgyOTZlNCAzYWU0ODUwYyBlNGY5Nzk3OFxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgcHJpbnRmKCJkZTRjMDFiMyAwNTRmODkzMCBhNzlkMDlhZSA3MzhlOTIzMCAxZTVhMTcwOCA1YmVmZmRjMSBiOGQxMTY3MSAzZTc0ZjgyZiBhOTQyZDY0YyBkYmM0NjgyZFxuIgorICAgICAgICAgICAgICAgICAgICJkMDM0YTc5NSAwY2Y3MjIwMiAxYmE0Yjg0ZCBmNzY5YTVkZSAyMDYwZTI1OSBkZjRjOWJiNCBhNDI2OGMwZSA5MzViYmM3NCA3MGE5NjljOSBkMDcyYTFhY1xuIgorICAgICAgICAgICAgICAgICAgICJiZGVlMzdmNCAzNzFlMjA2NCA2YjhiMGQ4NiAyZGRhMTYyOSAyYWUzNmY0MCA5NjVlOGM4NSAwOWU2M2QxZCBiZGRlY2M1MCAzZTJiNjNlYiA5MjQ1YmI2NlxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlKGN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy9zaGEuYyBiL2xpYmF2dXRpbC90ZXN0cy9zaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTViM2EwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL3NoYS5jCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3NoYS5oIgorCitpbnQgbWFpbih2b2lkKQoreworICAgIGludCBpLCBqLCBrOworICAgIHN0cnVjdCBBVlNIQSAqY3R4OworICAgIHVuc2lnbmVkIGNoYXIgZGlnZXN0WzMyXTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGxlbmd0aHNbM10gPSB7IDE2MCwgMjI0LCAyNTYgfTsKKworICAgIGN0eCA9IGF2X3NoYV9hbGxvYygpOworICAgIGlmICghY3R4KQorICAgICAgICByZXR1cm4gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgcHJpbnRmKCJUZXN0aW5nIFNIQS0lZFxuIiwgbGVuZ3Roc1tqXSk7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCAzOyBrKyspIHsKKyAgICAgICAgICAgIGF2X3NoYV9pbml0KGN0eCwgbGVuZ3Roc1tqXSk7CisgICAgICAgICAgICBpZiAoayA9PSAwKQorICAgICAgICAgICAgICAgIGF2X3NoYV91cGRhdGUoY3R4LCAiYWJjIiwgMyk7CisgICAgICAgICAgICBlbHNlIGlmIChrID09IDEpCisgICAgICAgICAgICAgICAgYXZfc2hhX3VwZGF0ZShjdHgsICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsIDU2KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMCoxMDAwOyBpKyspCisgICAgICAgICAgICAgICAgICAgIGF2X3NoYV91cGRhdGUoY3R4LCAiYSIsIDEpOworICAgICAgICAgICAgYXZfc2hhX2ZpbmFsKGN0eCwgZGlnZXN0KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGhzW2pdID4+IDM7IGkrKykKKyAgICAgICAgICAgICAgICBwcmludGYoIiUwMlgiLCBkaWdlc3RbaV0pOworICAgICAgICAgICAgcHV0Y2hhcignXG4nKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGopIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgLy90ZXN0IHZlY3RvcnMgKGZyb20gRklQUyBQVUIgMTgwLTEpCisgICAgICAgICAgICBwcmludGYoIkE5OTkzRTM2IDQ3MDY4MTZBIEJBM0UyNTcxIDc4NTBDMjZDIDlDRDBEODlEXG4iCisgICAgICAgICAgICAgICAgICAgIjg0OTgzRTQ0IDFDM0JEMjZFIEJBQUU0QUExIEY5NTEyOUU1IEU1NDY3MEYxXG4iCisgICAgICAgICAgICAgICAgICAgIjM0QUE5NzNDIEQ0QzREQUE0IEY2MUVFQjJCIERCQUQyNzMxIDY1MzQwMTZGXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAvL3Rlc3QgdmVjdG9ycyAoZnJvbSBGSVBTIFBVQiAxODAtMiBBcHBlbmRpeCBBKQorICAgICAgICAgICAgcHJpbnRmKCIyMzA5N2QyMiAzNDA1ZDgyMiA4NjQyYTQ3NyBiZGEyNTViMyAyYWFkYmNlNCBiZGEwYjNmNyBlMzZjOWRhN1xuIgorICAgICAgICAgICAgICAgICAgICI3NTM4OGIxNiA1MTI3NzZjYyA1ZGJhNWRhMSBmZDg5MDE1MCBiMGM2NDU1YyBiNGY1OGIxOSA1MjUyMjUyNVxuIgorICAgICAgICAgICAgICAgICAgICIyMDc5NDY1NSA5ODBjOTFkOCBiYmI0YzFlYSA5NzYxOGE0YiBmMDNmNDI1OCAxOTQ4YjJlZSA0ZWU3YWQ2N1xuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgLy90ZXN0IHZlY3RvcnMgKGZyb20gRklQUyBQVUIgMTgwLTIpCisgICAgICAgICAgICBwcmludGYoImJhNzgxNmJmIDhmMDFjZmVhIDQxNDE0MGRlIDVkYWUyMjIzIGIwMDM2MWEzIDk2MTc3YTljIGI0MTBmZjYxIGYyMDAxNWFkXG4iCisgICAgICAgICAgICAgICAgICAgIjI0OGQ2YTYxIGQyMDYzOGI4IGU1YzAyNjkzIDBjM2U2MDM5IGEzM2NlNDU5IDY0ZmYyMTY3IGY2ZWNlZGQ0IDE5ZGIwNmMxXG4iCisgICAgICAgICAgICAgICAgICAgImNkYzc2ZTVjIDk5MTRmYjkyIDgxYTFjN2UyIDg0ZDczZTY3IGYxODA5YTQ4IGE0OTcyMDBlIDA0NmQzOWNjIGM3MTEyY2QwXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWUoY3R4KTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL3NoYTUxMi5jIGIvbGliYXZ1dGlsL3Rlc3RzL3NoYTUxMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjkwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvc2hhNTEyLmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICogQ29weXJpZ2h0IChDKSAyMDA5IEtvbnN0YW50aW4gU2hpc2hrb3YKKyAqIENvcHlyaWdodCAoQykgMjAxMyBKYW1lcyBBbG1lcgorICogYmFzZWQgb24gQlNELWxpY2Vuc2VkIFNIQS0yIGNvZGUgYnkgQWFyb24gRC4gR2lmZm9yZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvc2hhNTEyLmgiCisKK2ludCBtYWluKHZvaWQpCit7CisgICAgaW50IGksIGosIGs7CisgICAgc3RydWN0IEFWU0hBNTEyICpjdHg7CisgICAgdW5zaWduZWQgY2hhciBkaWdlc3RbNjRdOworICAgIHN0YXRpYyBjb25zdCBpbnQgbGVuZ3Roc1s0XSA9IHsgMjI0LCAyNTYsIDM4NCwgNTEyIH07CisKKyAgICBjdHggPSBhdl9zaGE1MTJfYWxsb2MoKTsKKyAgICBpZiAoIWN0eCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKSB7CisgICAgICAgIGlmIChqIDwgMikgcHJpbnRmKCJUZXN0aW5nIFNIQS01MTIvJWRcbiIsIGxlbmd0aHNbal0pOworICAgICAgICBlbHNlICAgICAgIHByaW50ZigiVGVzdGluZyBTSEEtJWRcbiIsIGxlbmd0aHNbal0pOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgMzsgaysrKSB7CisgICAgICAgICAgICBhdl9zaGE1MTJfaW5pdChjdHgsIGxlbmd0aHNbal0pOworICAgICAgICAgICAgaWYgKGsgPT0gMCkKKyAgICAgICAgICAgICAgICBhdl9zaGE1MTJfdXBkYXRlKGN0eCwgImFiYyIsIDMpOworICAgICAgICAgICAgZWxzZSBpZiAoayA9PSAxKQorICAgICAgICAgICAgICAgIGF2X3NoYTUxMl91cGRhdGUoY3R4LCAiYWJjZGVmZ2hiY2RlZmdoaWNkZWZnaGlqZGVmZ2hpamtlZmdoaWprbGZnaGlqa2xtZ2hpamtsbW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiLCAxMTIpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwKjEwMDA7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgYXZfc2hhNTEyX3VwZGF0ZShjdHgsICJhIiwgMSk7CisgICAgICAgICAgICBhdl9zaGE1MTJfZmluYWwoY3R4LCBkaWdlc3QpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aHNbal0gPj4gMzsgaSsrKQorICAgICAgICAgICAgICAgIHByaW50ZigiJTAyWCIsIGRpZ2VzdFtpXSk7CisgICAgICAgICAgICBwdXRjaGFyKCdcbicpOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoaikgeyAvL3Rlc3QgdmVjdG9ycyAoZnJvbSBGSVBTIFBVQiAxODAtNCBBcGVuZGl4IEEpCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHByaW50ZigiNDYzNDI3MGYgNzA3YjZhNTQgZGFhZTc1MzAgNDYwODQyZTIgMGUzN2VkMjYgNWNlZWU5YTQgM2U4OTI0YWFcbiIKKyAgICAgICAgICAgICAgICAgICAiMjNmZWM1YmIgOTRkNjBiMjMgMzA4MTkyNjQgMGIwYzQ1MzMgMzVkNjY0NzMgNGZlNDBlNzIgNjg2NzRhZjlcbiIKKyAgICAgICAgICAgICAgICAgICAiMzdhYjMzMWQgNzZmMGQzNmQgZTQyMmJkMGUgZGViMjJhMjggYWNjZDQ4N2IgN2E4NDUzYWUgOTY1ZGQyODdcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHByaW50ZigiNTMwNDhlMjYgODE5NDFlZjkgOWIyZTI5YjcgNmI0YzdkYWIgZTRjMmQwYzYgMzRmYzZkNDYgZTBlMmYxMzEgMDdlN2FmMjNcbiIKKyAgICAgICAgICAgICAgICAgICAiMzkyOGUxODQgZmI4NjkwZjggNDBkYTM5ODggMTIxZDMxYmUgNjVjYjlkM2UgZjgzZWU2MTQgNmZlYWM4NjEgZTE5YjU2M2FcbiIKKyAgICAgICAgICAgICAgICAgICAiOWE1OWEwNTIgOTMwMTg3YTkgNzAzOGNhZTYgOTJmMzA3MDggYWE2NDkxOTIgM2VmNTE5NDMgOTRkYzY4ZDUgNmM3NGZiMjFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHByaW50ZigiY2IwMDc1M2YgNDVhMzVlOGIgYjVhMDNkNjkgOWFjNjUwMDcgMjcyYzMyYWIgMGVkZWQxNjMgIgorICAgICAgICAgICAgICAgICAgICIxYThiNjA1YSA0M2ZmNWJlZCA4MDg2MDcyYiBhMWU3Y2MyMyA1OGJhZWNhMSAzNGM4MjVhN1xuIgorICAgICAgICAgICAgICAgICAgICIwOTMzMGMzMyBmNzExNDdlOCAzZDE5MmZjNyA4MmNkMWI0NyA1MzExMWIxNyAzYjNiMDVkMiAiCisgICAgICAgICAgICAgICAgICAgIjJmYTA4MDg2IGUzYjBmNzEyIGZjYzdjNzFhIDU1N2UyZGI5IDY2YzNlOWZhIDkxNzQ2MDM5XG4iCisgICAgICAgICAgICAgICAgICAgIjlkMGUxODA5IDcxNjQ3NGNiIDA4NmU4MzRlIDMxMGE0YTFjIGVkMTQ5ZTljIDAwZjI0ODUyICIKKyAgICAgICAgICAgICAgICAgICAiNzk3MmNlYzUgNzA0YzJhNWIgMDdiOGIzZGMgMzhlY2M0ZWIgYWU5N2RkZDggN2YzZDg5ODVcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHByaW50ZigiZGRhZjM1YTEgOTM2MTdhYmEgY2M0MTczNDkgYWUyMDQxMzEgMTJlNmZhNGUgODlhOTdlYTIgMGE5ZWVlZTYgNGI1NWQzOWEgIgorICAgICAgICAgICAgICAgICAgICIyMTkyOTkyYSAyNzRmYzFhOCAzNmJhM2MyMyBhM2ZlZWJiZCA0NTRkNDQyMyA2NDNjZTgwZSAyYTlhYzk0ZiBhNTRjYTQ5ZlxuIgorICAgICAgICAgICAgICAgICAgICI4ZTk1OWI3NSBkYWUzMTNkYSA4Y2Y0ZjcyOCAxNGZjMTQzZiA4Zjc3NzljNiBlYjlmN2ZhMSA3Mjk5YWVhZCBiNjg4OTAxOCAiCisgICAgICAgICAgICAgICAgICAgIjUwMWQyODllIDQ5MDBmN2U0IDMzMWI5OWRlIGM0YjU0MzNhIGM3ZDMyOWVlIGI2ZGQyNjU0IDVlOTZlNTViIDg3NGJlOTA5XG4iCisgICAgICAgICAgICAgICAgICAgImU3MTg0ODNkIDBjZTc2OTY0IDRlMmU0MmM3IGJjMTViNDYzIDhlMWY5OGIxIDNiMjA0NDI4IDU2MzJhODAzIGFmYTk3M2ViICIKKyAgICAgICAgICAgICAgICAgICAiZGUwZmYyNDQgODc3ZWE2MGEgNGNiMDQzMmMgZTU3N2MzMWIgZWIwMDljNWMgMmM0OWFhMmUgNGVhZGIyMTcgYWQ4Y2MwOWJcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgYXZfZnJlZShjdHgpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvc29mdGZsb2F0LmMgYi9saWJhdnV0aWwvdGVzdHMvc29mdGZsb2F0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2ZGU0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy9zb2Z0ZmxvYXQuYwpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIGNvcHlyaWdodCAoYykgMjAwNiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVyLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL3NvZnRmbG9hdC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCitzdGF0aWMgY29uc3QgU29mdEZsb2F0IEZMT0FUXzBfMDE3Nzc2NDg5MjU3ID0gezB4MTIzNCwgMTJ9Oworc3RhdGljIGNvbnN0IFNvZnRGbG9hdCBGTE9BVF8xMzc0XzQwNjI1ID0gezB4YWJjZCwgMjV9Oworc3RhdGljIGNvbnN0IFNvZnRGbG9hdCBGTE9BVF8wXzEyNDk2OTQ4MjQyMTggPSB7MHhGRkYsIDE1fTsKKworCitpbnQgbWFpbih2b2lkKXsKKyAgICBTb2Z0RmxvYXQgb25lPSBhdl9pbnQyc2YoMSwgMCk7CisgICAgU29mdEZsb2F0IHNmMSwgc2YyLCBzZjM7CisgICAgZG91YmxlIGQxLCBkMiwgZDM7CisgICAgaW50IGksIGo7CisgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfREVCVUcpOworCisgICAgZDE9IDE7CisgICAgZm9yKGk9IDA7IGk8MTA7IGkrKyl7CisgICAgICAgIGQxPSAxLyhkMSsxKTsKKyAgICB9CisgICAgcHJpbnRmKCJ0ZXN0MSBkb3VibGU9JWRcbiIsIChpbnQpKGQxICogKDE8PDI0KSkpOworCisgICAgc2YxPSBvbmU7CisgICAgZm9yKGk9IDA7IGk8MTA7IGkrKyl7CisgICAgICAgIHNmMT0gYXZfZGl2X3NmKG9uZSwgYXZfbm9ybWFsaXplX3NmKGF2X2FkZF9zZihvbmUsIHNmMSkpKTsKKyAgICB9CisgICAgcHJpbnRmKCJ0ZXN0MSBzZiAgICA9JWRcbiIsIGF2X3NmMmludChzZjEsIDI0KSk7CisKKworICAgIGZvcihpPSAwOyBpPDEwMDsgaSsrKXsKKyAgICAgICAgU1RBUlRfVElNRVIKKyAgICAgICAgZDE9IGk7CisgICAgICAgIGQyPSBpLzEwMC4wOworICAgICAgICBmb3Ioaj0gMDsgajwxMDAwOyBqKyspeworICAgICAgICAgICAgZDE9IChkMSsxKSpkMjsKKyAgICAgICAgfQorICAgICAgICBTVE9QX1RJTUVSKCJmbG9hdCBhZGQgbXVsIikKKyAgICB9CisgICAgcHJpbnRmKCJ0ZXN0MiBkb3VibGU9JWRcbiIsIChpbnQpKGQxICogKDE8PDI0KSkpOworCisgICAgZm9yKGk9IDA7IGk8MTAwOyBpKyspeworICAgICAgICBTVEFSVF9USU1FUgorICAgICAgICBzZjE9IGF2X2ludDJzZihpLCAwKTsKKyAgICAgICAgc2YyPSBhdl9kaXZfc2YoYXZfaW50MnNmKGksIDIpLCBhdl9pbnQyc2YoMjAwLCAzKSk7CisgICAgICAgIGZvcihqPSAwOyBqPDEwMDA7IGorKyl7CisgICAgICAgICAgICBzZjE9IGF2X211bF9zZihhdl9hZGRfc2Yoc2YxLCBvbmUpLHNmMik7CisgICAgICAgIH0KKyAgICAgICAgU1RPUF9USU1FUigic29mdGZsb2F0IGFkZCBtdWwiKQorICAgIH0KKyAgICBwcmludGYoInRlc3QyIHNmICAgID0lZCAoJWQgJWQpXG4iLCBhdl9zZjJpbnQoc2YxLCAyNCksIHNmMS5leHAsIHNmMS5tYW50KTsKKworICAgIGQxID0gMC4wMTc3NzY0ODkzOworICAgIGQyID0gMTM3NC40MDYyNTsKKyAgICBkMyA9IDAuMTI0OTY5NDgyNDsKKyAgICBkMiArPSBkMTsKKyAgICBkMyArPSBkMjsKKyAgICBwcmludGYoInRlc3QzIGRvdWJsZTogJS4xMGxmXG4iLCBkMyk7CisKKyAgICBzZjEgPSBGTE9BVF8wXzAxNzc3NjQ4OTI1NzsKKyAgICBzZjIgPSBGTE9BVF8xMzc0XzQwNjI1OworICAgIHNmMyA9IEZMT0FUXzBfMTI0OTY5NDgyNDIxODsKKyAgICBzZjIgPSBhdl9hZGRfc2Yoc2YxLCBzZjIpOworICAgIHNmMyA9IGF2X2FkZF9zZihzZjMsIHNmMik7CisgICAgcHJpbnRmKCJ0ZXN0MyBzb2Z0ZmxvYXQ6ICUuMTBsZiAoMHglMDh4ICVkKVxuIiwgKGRvdWJsZSlhdl9zZjJkb3VibGUoc2YzKSwgc2YzLm1hbnQsIHNmMy5leHApOworCisgICAgc2YxID0gYXZfaW50MnNmKDB4RkZGRkZGRjAsIDApOworICAgIHByaW50ZigidGVzdDQgc29mdGZsb2F0OiAlLjEwbGYgKDB4JTA4eCAlZClcbiIsIChkb3VibGUpYXZfc2YyZG91YmxlKHNmMSksIHNmMS5tYW50LCBzZjEuZXhwKTsKKyAgICBzZjEgPSBhdl9pbnQyc2YoMHgwMDAwMDAxMCwgMCk7CisgICAgcHJpbnRmKCJ0ZXN0NCBzb2Z0ZmxvYXQ6ICUuMTBsZiAoMHglMDh4ICVkKVxuIiwgKGRvdWJsZSlhdl9zZjJkb3VibGUoc2YxKSwgc2YxLm1hbnQsIHNmMS5leHApOworCisgICAgc2YxID0gYXZfaW50MnNmKDB4MUZGRkZGRkYsIDApOworICAgIHByaW50ZigidGVzdDQgc29mdGZsb2F0OiAlLjEwbGYgKDB4JTA4eCAlZClcbiIsIChkb3VibGUpYXZfc2YyZG91YmxlKHNmMSksIHNmMS5tYW50LCBzZjEuZXhwKTsKKyAgICBzZjEgPSBhdl9pbnQyc2YoMHhFMDAwMDAwMSwgMCk7CisgICAgcHJpbnRmKCJ0ZXN0NCBzb2Z0ZmxvYXQ6ICUuMTBsZiAoMHglMDh4ICVkKVxuIiwgKGRvdWJsZSlhdl9zZjJkb3VibGUoc2YxKSwgc2YxLm1hbnQsIHNmMS5leHApOworCisKKyAgICBzZjEgPSAoU29mdEZsb2F0KXsgMHgyMDAwMDAwMCwgICBNSU5fRVhQIH07CisgICAgc2YxID0gYXZfbXVsX3NmKHNmMSwgc2YxKTsKKyAgICBwcmludGYoInRlc3Q1IHNvZnRmbG9hdDogJS4xMGxmICgweCUwOHggJWQpXG4iLCAoZG91YmxlKWF2X3NmMmRvdWJsZShzZjEpLCBzZjEubWFudCwgc2YxLmV4cCk7CisKKyAgICBzZjEgPSAoU29mdEZsb2F0KXsgMHgyMDAwMDAwMCwgICBNSU5fRVhQIH07CisgICAgc2YyID0gKFNvZnRGbG9hdCl7IDB4MjAwMDAwMDAsICAgTUFYX0VYUCB9OworICAgIGkgPSBhdl9jbXBfc2Yoc2YxLCBzZjIpOworICAgIGogPSBhdl9jbXBfc2Yoc2YyLCBzZjEpOworICAgIHNmMSA9IGF2X2Rpdl9zZihzZjEsIHNmMik7CisgICAgcHJpbnRmKCJ0ZXN0NiBzb2Z0ZmxvYXQ6ICUuMTBsZiAoMHglMDh4ICVkKSAlZCAlZFxuIiwgKGRvdWJsZSlhdl9zZjJkb3VibGUoc2YxKSwgc2YxLm1hbnQsIHNmMS5leHAsIGksIGopOworCisgICAgZm9yKGk9IC01MDsgaTw1MDsgaSsrKSB7CisgICAgICAgIHNmMT0gYXZfaW50MnNmKGksIDApOworICAgICAgICBmb3Ioaj0gLTUwOyBqPDUwOyBqKyspIHsKKyAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgc2YyPSBhdl9pbnQyc2YoaiwgMCk7CisgICAgICAgICAgICBjID0gYXZfY21wX3NmKHNmMSwgc2YyKTsKKyAgICAgICAgICAgIGlmIChGRkRJRkZTSUdOKGksaikgIT0gYyAmJiAoRkZESUZGU0lHTihpLGopXmMpPDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImF2X2NtcF9zZiBmYWlsZWQgYXQgJWQgJWQgYXMgJVhcbiIsIGksIGosIGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYyA9IGF2X2d0X3NmKHNmMSwgc2YyKTsKKyAgICAgICAgICAgIGlmICgoaT5qKSAhPSBjKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJhdl9ndF9zZiBmYWlsZWQgYXQgJWQgJWQgYXMgJVhcbiIsIGksIGosIGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNmMSA9IGF2X2ludDJzZigxLCBpKTsKKyAgICAgICAgZm9yKGogPSAtNTA7IGogPCA1MDsgaisrKSB7CisgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgIHNmMiA9IGF2X2ludDJzZigxLCBqKTsKKyAgICAgICAgICAgIGMgPSBhdl9jbXBfc2Yoc2YyLCBzZjEpOworICAgICAgICAgICAgaWYgKEZGRElGRlNJR04oaSxqKSAhPSBjICYmIChGRkRJRkZTSUdOKGksaileYykgPCAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJhdl9jbXBfc2YgZmFpbGVkMiBhdCAlZCAlZCBhcyAlWFxuIiwgaSwgaiwgYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjID0gYXZfZ3Rfc2Yoc2YxLCBzZjIpOworICAgICAgICAgICAgaWYgKChpPGopICE9IGMpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoImF2X2d0X3NmIGZhaWxlZDIgYXQgJWQgJWQgYXMgJVhcbiIsIGksIGosIGMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBmb3IoaT0gMDsgaTw0KjM2OyBpKyspeworICAgICAgICBpbnQgcywgYzsKKyAgICAgICAgZG91YmxlIGVycnMsIGVycmM7CisKKyAgICAgICAgYXZfc2luY29zX3NmKGkqKDFVTEw8PDMyKS8zNi80LCAmcywgJmMpOworICAgICAgICBlcnJzID0gKGRvdWJsZSlzLyAoMTw8MzApIC0gc2luKGkqTV9QSS8zNik7CisgICAgICAgIGVycmMgPSAoZG91YmxlKWMvICgxPDwzMCkgLSBjb3MoaSpNX1BJLzM2KTsKKyAgICAgICAgaWYgKGZhYnMoZXJycykgPiAwLjAwMDAwMDAyIHx8IGZhYnMoZXJyYykgPjAuMDAxKSB7CisgICAgICAgICAgICBwcmludGYoInNpbmNvcyBGQUlMICVkICVmICVmICVmICVmXG4iLCBpLCAoZmxvYXQpcy8gKDE8PDMwKSwgKGZsb2F0KWMvICgxPDwzMCksIHNpbihpKk1fUEkvMzYpLCBjb3MoaSpNX1BJLzM2KSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gMDsKKworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL3RlYS5jIGIvbGliYXZ1dGlsL3Rlc3RzL3RlYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNWJiNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvdGVhLmMKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBBIDMyLWJpdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVEVBIGFsZ29yaXRobQorICogQ29weXJpZ2h0IChjKSAyMDE1IFZlc3NlbGluIEJvbnRjaGV2CisgKgorICogTG9vc2VseSBiYXNlZCBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgRGF2aWQgV2hlZWxlciBhbmQgUm9nZXIgTmVlZGhhbSwKKyAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RpbnlfRW5jcnlwdGlvbl9BbGdvcml0aG0jUmVmZXJlbmNlX2NvZGUKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3RlYS5oIgorCisjZGVmaW5lIFRFQV9OVU1fVEVTVFMgNAorCisvLyBodHRwczovL2dpdGh1Yi5jb20vbG9nYW5kcmV3cy9UZWFDcnlwdC9ibG9iL21hc3Rlci90ZWEvdGVhX3Rlc3QuZ28KK3N0YXRpYyBjb25zdCB1aW50OF90IHRlYV90ZXN0X2tleVtURUFfTlVNX1RFU1RTXVsxNl0gPSB7CisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorICAgIH0sCisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorICAgIH0sCisgICAgeyAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LAorICAgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhFRSwgMHhGRgorICAgIH0sCisgICAgeyAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LAorICAgICAgMHg4OCwgMHg5OSwgMHhBQSwgMHhCQiwgMHhDQywgMHhERCwgMHhFRSwgMHhGRgorICAgIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHRlYV90ZXN0X3B0W1RFQV9OVU1fVEVTVFNdWzhdID0geworICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCB9LAorICAgIHsgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCB9LAorICAgIHsgMHgwMSwgMHgyMywgMHg0NSwgMHg2NywgMHg4OSwgMHhBQiwgMHhDRCwgMHhFRiB9Cit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCB0ZWFfdGVzdF9jdFtURUFfTlVNX1RFU1RTXVs4XSA9IHsKKyAgICB7IDB4NDEsIDB4RUEsIDB4M0EsIDB4MEEsIDB4OTQsIDB4QkEsIDB4QTksIDB4NDAgfSwKKyAgICB7IDB4NkEsIDB4MkYsIDB4OUMsIDB4RjMsIDB4RkMsIDB4Q0YsIDB4M0MsIDB4NTUgfSwKKyAgICB7IDB4REUsIDB4QjEsIDB4QzAsIDB4QTIsIDB4N0UsIDB4NzQsIDB4NUQsIDB4QjMgfSwKKyAgICB7IDB4MTIsIDB4NkMsIDB4NkIsIDB4OTIsIDB4QzAsIDB4NjUsIDB4M0EsIDB4M0UgfQorfTsKKworc3RhdGljIHZvaWQgdGVzdF90ZWEoc3RydWN0IEFWVEVBICpjdHgsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBpbnQgbGVuLCB1aW50OF90ICppdiwgaW50IGRpciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRlc3QpCit7CisgICAgYXZfdGVhX2NyeXB0KGN0eCwgZHN0LCBzcmMsIGxlbiwgaXYsIGRpcik7CisgICAgaWYgKG1lbWNtcChkc3QsIHJlZiwgOCpsZW4pKSB7CisgICAgICAgIGludCBpOworICAgICAgICBwcmludGYoIiVzIGZhaWxlZFxuZ290ICAgICAgIiwgdGVzdCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4KmxlbjsgaSsrKQorICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGRzdFtpXSk7CisgICAgICAgIHByaW50ZigiXG5leHBlY3RlZCAiKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDgqbGVuOyBpKyspCisgICAgICAgICAgICBwcmludGYoIiUwMnggIiwgcmVmW2ldKTsKKyAgICAgICAgcHJpbnRmKCJcbiIpOworICAgICAgICBleGl0KDEpOworICAgIH0KK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBzdHJ1Y3QgQVZURUEgKmN0eDsKKyAgICB1aW50OF90IGJ1Zls4XSwgaXZbOF07CisgICAgaW50IGk7CisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3JjWzMyXSA9ICJIZWxsb1dvcmxkSGVsbG9Xb3JsZEhlbGxvV29ybGQiOworICAgIHVpbnQ4X3QgY3RbMzJdOworICAgIHVpbnQ4X3QgcGxbMzJdOworCisgICAgY3R4ID0gYXZfdGVhX2FsbG9jKCk7CisgICAgaWYgKCFjdHgpCisgICAgICAgIHJldHVybiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IFRFQV9OVU1fVEVTVFM7IGkrKykgeworICAgICAgICBhdl90ZWFfaW5pdChjdHgsIHRlYV90ZXN0X2tleVtpXSwgNjQpOworCisgICAgICAgIHRlc3RfdGVhKGN0eCwgYnVmLCB0ZWFfdGVzdF9wdFtpXSwgdGVhX3Rlc3RfY3RbaV0sIDEsIE5VTEwsIDAsICJlbmNyeXB0aW9uIik7CisgICAgICAgIHRlc3RfdGVhKGN0eCwgYnVmLCB0ZWFfdGVzdF9jdFtpXSwgdGVhX3Rlc3RfcHRbaV0sIDEsIE5VTEwsIDEsICJkZWNyeXB0aW9uIik7CisKKyAgICAgICAgLyogZW5jcnlwdCAqLworICAgICAgICBtZW1jcHkoaXYsICJIQUxMTzEyMyIsIDgpOworICAgICAgICBhdl90ZWFfY3J5cHQoY3R4LCBjdCwgc3JjLCA0LCBpdiwgMCk7CisKKyAgICAgICAgLyogZGVjcnlwdCBpbnRvIHBsICovCisgICAgICAgIG1lbWNweShpdiwgIkhBTExPMTIzIiwgOCk7CisgICAgICAgIHRlc3RfdGVhKGN0eCwgcGwsIGN0LCBzcmMsIDQsIGl2LCAxLCAiQ0JDIGRlY3J5cHRpb24iKTsKKworICAgICAgICBtZW1jcHkoaXYsICJIQUxMTzEyMyIsIDgpOworICAgICAgICB0ZXN0X3RlYShjdHgsIGN0LCBjdCwgc3JjLCA0LCBpdiwgMSwgIkNCQyBpbnBsYWNlIGRlY3J5cHRpb24iKTsKKyAgICB9CisKKyAgICBwcmludGYoIlRlc3QgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHN1Y2Nlc3MuXG4iKTsKKyAgICBhdl9mcmVlKGN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90ZXN0cy90cmVlLmMgYi9saWJhdnV0aWwvdGVzdHMvdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDMyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwvdGVzdHMvdHJlZS5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvdHJlZS5jIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2xmZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sb2cuaCIKKworc3RhdGljIGludCBjaGVjayhBVlRyZWVOb2RlICp0KQoreworICAgIGlmICh0KSB7CisgICAgICAgIGludCBsZWZ0ICA9IGNoZWNrKHQtPmNoaWxkWzBdKTsKKyAgICAgICAgaW50IHJpZ2h0ID0gY2hlY2sodC0+Y2hpbGRbMV0pOworCisgICAgICAgIGlmIChsZWZ0ID4gOTk5IHx8IHJpZ2h0ID4gOTk5KQorICAgICAgICAgICAgcmV0dXJuIDEwMDA7CisgICAgICAgIGlmIChyaWdodCAtIGxlZnQgIT0gdC0+c3RhdGUpCisgICAgICAgICAgICByZXR1cm4gMTAwMDsKKyAgICAgICAgaWYgKHQtPnN0YXRlID4gMSB8fCB0LT5zdGF0ZSA8IC0xKQorICAgICAgICAgICAgcmV0dXJuIDEwMDA7CisgICAgICAgIHJldHVybiBGRk1BWChsZWZ0LCByaWdodCkgKyAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnQoQVZUcmVlTm9kZSAqdCwgaW50IGRlcHRoKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBkZXB0aCAqIDQ7IGkrKykKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiAiKTsKKyAgICBpZiAodCkgeworICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTm9kZSAlcCAlMmQgJXBcbiIsIHQsIHQtPnN0YXRlLCB0LT5lbGVtKTsKKyAgICAgICAgcHJpbnQodC0+Y2hpbGRbMF0sIGRlcHRoICsgMSk7CisgICAgICAgIHByaW50KHQtPmNoaWxkWzFdLCBkZXB0aCArIDEpOworICAgIH0gZWxzZQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiTlVMTFxuIik7Cit9CisKK3N0YXRpYyBpbnQgY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgcmV0dXJuIChjb25zdCB1aW50OF90ICopIGEgLSAoY29uc3QgdWludDhfdCAqKSBiOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgaW50IGk7CisgICAgdm9pZCAqazsKKyAgICBBVlRyZWVOb2RlICpyb290ID0gTlVMTCwgKm5vZGUgPSBOVUxMOworICAgIEFWTEZHIHBybmc7CisgICAgaW50IGxvZ19sZXZlbCA9IGFyZ2MgPD0gMSA/IEFWX0xPR19JTkZPIDogYXRvaShhcmd2WzFdKTsKKworICAgIGF2X2xvZ19zZXRfbGV2ZWwobG9nX2xldmVsKTsKKworICAgIGF2X2xmZ19pbml0KCZwcm5nLCAxKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKSB7CisgICAgICAgIGludHB0cl90IGogPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDg2Mjk0OworCisgICAgICAgIGlmIChjaGVjayhyb290KSA+IDk5OSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkZBVEFMIGVycm9yICVkXG4iLCBpKTsKKyAgICAgICAgICAgIHByaW50KHJvb3QsIDApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgImluc2VydGluZyAlNGRcbiIsIChpbnQpaik7CisKKyAgICAgICAgaWYgKCFub2RlKQorICAgICAgICAgICAgbm9kZSA9IGF2X3RyZWVfbm9kZV9hbGxvYygpOworICAgICAgICBpZiAoIW5vZGUpIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBhdl90cmVlX2luc2VydCgmcm9vdCwgKHZvaWQgKikoaiArIDEpLCBjbXAsICZub2RlKTsKKworICAgICAgICBqID0gYXZfbGZnX2dldCgmcHJuZykgJSA4NjI5NDsKKyAgICAgICAgeworICAgICAgICAgICAgQVZUcmVlTm9kZSAqbm9kZTIgPSBOVUxMOworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19ERUJVRywgInJlbW92aW5nICU0ZFxuIiwgKGludClqKTsKKyAgICAgICAgICAgIGF2X3RyZWVfaW5zZXJ0KCZyb290LCAodm9pZCAqKShqICsgMSksIGNtcCwgJm5vZGUyKTsKKyAgICAgICAgICAgIGsgPSBhdl90cmVlX2ZpbmQocm9vdCwgKHZvaWQgKikoaiArIDEpLCBjbXAsIE5VTEwpOworICAgICAgICAgICAgaWYgKGspCisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgInJlbW92YWwgZmFpbHVyZSAlZFxuIiwgaSk7CisgICAgICAgICAgICBhdl9mcmVlKG5vZGUyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBhdl9mcmVlKG5vZGUpOworCisgICAgYXZfdHJlZV9kZXN0cm95KHJvb3QpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvdHdvZmlzaC5jIGIvbGliYXZ1dGlsL3Rlc3RzL3R3b2Zpc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGUwOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL3R3b2Zpc2guYwpAQCAtMCwwICsxLDk0IEBACisvKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFR3b0Zpc2ggYWxnb3JpdGhtCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgU3VwcmFqYSBNZWVkaW50aQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2xvZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC90d29maXNoLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworICAgIHVpbnQ4X3QgS2V5WzMyXSA9IHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwLCAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweGFhLCAweGJiLCAweGNjLCAweGRkLCAweGVlLCAweGZmCisgICAgfTsKKyAgICBjb25zdCB1aW50OF90IHJjdFs2XVsxNl0gPSB7CisgICAgICAgIHsweDlmLCAweDU4LCAweDlmLCAweDVjLCAweGY2LCAweDEyLCAweDJjLCAweDMyLCAweGI2LCAweGJmLCAweGVjLCAweDJmLCAweDJhLCAweGU4LCAweGMzLCAweDVhfSwKKyAgICAgICAgezB4Y2YsIDB4ZDEsIDB4ZDIsIDB4ZTUsIDB4YTksIDB4YmUsIDB4OWMsIDB4ZGYsIDB4NTAsIDB4MWYsIDB4MTMsIDB4YjgsIDB4OTIsIDB4YmQsIDB4MjIsIDB4NDh9LAorICAgICAgICB7MHgzNywgMHg1MiwgMHg3YiwgMHhlMCwgMHgwNSwgMHgyMywgMHgzNCwgMHhiOCwgMHg5ZiwgMHgwYywgMHhmYywgMHhjYSwgMHhlOCwgMHg3YywgMHhmYSwgMHgyMH0sCisgICAgICAgIHsweDVkLCAweDlkLCAweDRlLCAweGVmLCAweGZhLCAweDkxLCAweDUxLCAweDU3LCAweDU1LCAweDI0LCAweGYxLCAweDE1LCAweDgxLCAweDVhLCAweDEyLCAweGUwfSwKKyAgICAgICAgezB4ZTcsIDB4NTQsIDB4NDksIDB4MjEsIDB4MmIsIDB4ZWUsIDB4ZjksIDB4ZjQsIDB4YTMsIDB4OTAsIDB4YmQsIDB4ODYsIDB4MGEsIDB4NjQsIDB4MDksIDB4NDF9LAorICAgICAgICB7MHgzNywgMHhmZSwgMHgyNiwgMHhmZiwgMHgxYywgMHhmNiwgMHg2MSwgMHg3NSwgMHhmNSwgMHhkZCwgMHhmNCwgMHhjMywgMHgzYiwgMHg5NywgMHhhMiwgMHgwNX0KKyAgICB9OworICAgIHVpbnQ4X3QgdGVtcFszMl0sIGl2WzE2XSwgcnB0WzMyXSA9IHswfTsKKyAgICBjb25zdCBpbnQga2JpdHNbM10gPSB7MTI4LCAxOTIsIDI1Nn07CisgICAgaW50IGksIGosIGVyciA9IDA7CisgICAgc3RydWN0IEFWVFdPRklTSCAqY3M7CisgICAgY3MgPSBhdl90d29maXNoX2FsbG9jKCk7CisgICAgaWYgKCFjcykKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZm9yIChqID0gMTsgaiA8IDM7IGorKykgeworICAgICAgICBhdl90d29maXNoX2luaXQoY3MsIEtleSwga2JpdHNbal0pOworICAgICAgICBhdl90d29maXNoX2NyeXB0KGNzLCB0ZW1wLCBycHQsIDEsIE5VTEwsIDApOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgaWYgKHJjdFtqXVtpXSAhPSB0ZW1wW2ldKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICUwMnggJTAyeFxuIiwgaSwgcmN0W2pdW2ldLCB0ZW1wW2ldKTsKKyAgICAgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGF2X3R3b2Zpc2hfY3J5cHQoY3MsIHRlbXAsIHJjdFtqXSwgMSwgTlVMTCwgMSk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAocnB0W2ldICE9IHRlbXBbaV0pIHsKKyAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCBycHRbaV0sIHRlbXBbaV0pOworICAgICAgICAgICAgICAgIGVyciA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykgeworICAgICAgICBtZW1zZXQoS2V5LCAwLCBzaXplb2YoS2V5KSk7CisgICAgICAgIG1lbXNldChycHQsIDAsIHNpemVvZihycHQpKTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDUwOyBpKyspIHsKKyAgICAgICAgICAgIGF2X3R3b2Zpc2hfaW5pdChjcywgS2V5LCBrYml0c1tqXSk7CisgICAgICAgICAgICBhdl90d29maXNoX2NyeXB0KGNzLCB0ZW1wLCBycHQsIDEsIE5VTEwsIDApOworICAgICAgICAgICAgbWVtY3B5KEtleSsxNixLZXksKGtiaXRzW2pdLTEyOCkgPj4gMyk7CisgICAgICAgICAgICBtZW1jcHkoS2V5LHJwdCwxNik7CisgICAgICAgICAgICBtZW1jcHkocnB0LHRlbXAsMTYpOworICAgICAgICB9CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisgICAgICAgICAgICBpZiAocmN0WzMgKyBqXVtpXSAhPSB0ZW1wW2ldKSB7CisgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICUwMnggJTAyeFxuIiwgaSwgcmN0WzMgKyBqXVtpXSwgdGVtcFtpXSk7CisgICAgICAgICAgICAgICAgZXJyID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtZW1zZXQocnB0LCAwLCBzaXplb2YocnB0KSk7CisgICAgbWVtY3B5KGl2LCAiSEFMTE8xMjNIQUxMTzEyMyIsIDE2KTsKKyAgICBhdl90d29maXNoX2NyeXB0KGNzLCB0ZW1wLCBycHQsIDIsIGl2LCAwKTsKKyAgICBtZW1jcHkoaXYsICJIQUxMTzEyM0hBTExPMTIzIiwgMTYpOworICAgIGF2X3R3b2Zpc2hfY3J5cHQoY3MsIHRlbXAsIHRlbXAsIDIsIGl2LCAxKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworICAgICAgICBpZiAocnB0W2ldICE9IHRlbXBbaV0pIHsKKyAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCAlMDJ4ICUwMnhcbiIsIGksIHJwdFtpXSwgdGVtcFtpXSk7CisgICAgICAgICAgICBlcnIgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGF2X2ZyZWUoY3MpOworICAgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGVzdHMvdXRmOC5jIGIvbGliYXZ1dGlsL3Rlc3RzL3V0ZjguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2EyODAyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3Rlc3RzL3V0ZjguYwpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIFN0ZWZhbm8gU2FiYXRpbmkKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZmlsZS5oIgorCitzdGF0aWMgdm9pZCBwcmludF9zZXF1ZW5jZShjb25zdCBjaGFyICpwLCBpbnQgbCwgaW50IGluZGVudCkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKQorICAgICAgICBwcmludGYoIiUwMlgiLCAodWludDhfdClwW2ldKTsKKyAgICBwcmludGYoIiUqcyIsIGluZGVudC1sKjIsICIiKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGludCByZXQ7CisgICAgY2hhciAqZmlsZW5hbWUgPSBhcmd2WzFdOworICAgIHVpbnQ4X3QgKmZpbGVfYnVmOworICAgIHNpemVfdCBmaWxlX2J1Zl9zaXplOworICAgIHVpbnQzMl90IGNvZGU7CisgICAgY29uc3QgdWludDhfdCAqcCwgKmVuZHA7CisKKyAgICByZXQgPSBhdl9maWxlX21hcChmaWxlbmFtZSwgJmZpbGVfYnVmLCAmZmlsZV9idWZfc2l6ZSwgMCwgTlVMTCk7CisgICAgaWYgKHJldCA8IDApCisgICAgICAgIHJldHVybiAxOworCisgICAgcCA9IGZpbGVfYnVmOworICAgIGVuZHAgPSBmaWxlX2J1ZiArIGZpbGVfYnVmX3NpemU7CisgICAgd2hpbGUgKHAgPCBlbmRwKSB7CisgICAgICAgIGludCBsLCByOworICAgICAgICBjb25zdCB1aW50OF90ICpwMCA9IHA7CisgICAgICAgIGNvZGUgPSBVSU5UMzJfTUFYOworICAgICAgICByID0gYXZfdXRmOF9kZWNvZGUoJmNvZGUsICZwLCBlbmRwLCAwKTsKKyAgICAgICAgbCA9IChpbnQpKHAtcDApOworICAgICAgICBwcmludF9zZXF1ZW5jZShwMCwgbCwgMjApOworICAgICAgICBpZiAoY29kZSAhPSBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBwcmludGYoIiUtMTBkIDB4JS0xMFggJS01ZCAiLCBjb2RlLCBjb2RlLCBsKTsKKyAgICAgICAgICAgIGlmIChyID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKnAwID09ICdcbicpIHByaW50ZigiXFxuXG4iKTsKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgIHByaW50ZiAoIiUuKnNcbiIsIGwsIHAwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGNvZGUgcmFuZ2VcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCJpbnZhbGlkIHNlcXVlbmNlXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2ZpbGVfdW5tYXAoZmlsZV9idWYsIGZpbGVfYnVmX3NpemUpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3Rlc3RzL3h0ZWEuYyBiL2xpYmF2dXRpbC90ZXN0cy94dGVhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4YzY0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmF2dXRpbC90ZXN0cy94dGVhLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC94dGVhLmgiCisKKyNkZWZpbmUgWFRFQV9OVU1fVEVTVFMgNgorCitzdGF0aWMgY29uc3QgdWludDhfdCB4dGVhX3Rlc3Rfa2V5W1hURUFfTlVNX1RFU1RTXVsxNl0gPSB7CisgICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiB9LAorICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKKyAgICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYgfSwKKyAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCisgICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmIH0sCisgICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfSwKKyAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHh0ZWFfdGVzdF9wdFtYVEVBX05VTV9URVNUU11bOF0gPSB7CisgICAgeyAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4IH0sCisgICAgeyAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxIH0sCisgICAgeyAweDVhLCAweDViLCAweDZlLCAweDI3LCAweDg5LCAweDQ4LCAweGQ3LCAweDdmIH0sCisgICAgeyAweDQxLCAweDQyLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4IH0sCisgICAgeyAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxIH0sCisgICAgeyAweDcwLCAweGUxLCAweDIyLCAweDVkLCAweDZlLCAweDRlLCAweDc2LCAweDU1IH0KK307CisKK3N0YXRpYyBjb25zdCB1aW50OF90IHh0ZWFfdGVzdF9jdFtYVEVBX05VTV9URVNUU11bOF0gPSB7CisgICAgeyAweDQ5LCAweDdkLCAweGYzLCAweGQwLCAweDcyLCAweDYxLCAweDJjLCAweGI1IH0sCisgICAgeyAweGU3LCAweDhmLCAweDJkLCAweDEzLCAweDc0LCAweDQzLCAweDQxLCAweGQ4IH0sCisgICAgeyAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxIH0sCisgICAgeyAweGEwLCAweDM5LCAweDA1LCAweDg5LCAweGY4LCAweGI4LCAweGVmLCAweGE1IH0sCisgICAgeyAweGVkLCAweDIzLCAweDM3LCAweDVhLCAweDgyLCAweDFhLCAweDhjLCAweDJkIH0sCisgICAgeyAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxLCAweDQxIH0KK307CisKK3N0YXRpYyB2b2lkIHRlc3RfeHRlYShBVlhURUEgKmN0eCwgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqcmVmLCBpbnQgbGVuLCB1aW50OF90ICppdiwgaW50IGRpciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0ZXN0LAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpjcnlwdCkoQVZYVEVBICosIHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBpbnQsIHVpbnQ4X3QgKiwgaW50KSkKK3sKKyAgICBjcnlwdChjdHgsIGRzdCwgc3JjLCBsZW4sIGl2LCBkaXIpOworICAgIGlmIChtZW1jbXAoZHN0LCByZWYsIDgqbGVuKSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgcHJpbnRmKCIlcyBmYWlsZWRcbmdvdCAgICAgICIsIHRlc3QpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgOCpsZW47IGkrKykKKyAgICAgICAgICAgIHByaW50ZigiJTAyeCAiLCBkc3RbaV0pOworICAgICAgICBwcmludGYoIlxuZXhwZWN0ZWQgIik7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA4KmxlbjsgaSsrKQorICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIHJlZltpXSk7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisgICAgdWludDhfdCBidWZbMTZdLCBpdls4XTsKKyAgICBpbnQgaSwgajsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBzcmNbMzJdID0gIkhlbGxvV29ybGRIZWxsb1dvcmxkSGVsbG9Xb3JsZCI7CisgICAgdWludDhfdCBjdFszMl07CisgICAgdWludDhfdCBwbFszMl07CisgICAgQVZYVEVBICpjdHggPSBhdl94dGVhX2FsbG9jKCk7CisgICAgaWYgKCFjdHgpCisgICAgICAgIHJldHVybiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IFhURUFfTlVNX1RFU1RTOyBpKyspIHsKKyAgICAgICAgYXZfeHRlYV9pbml0KGN0eCwgeHRlYV90ZXN0X2tleVtpXSk7CisKKyAgICAgICAgdGVzdF94dGVhKGN0eCwgYnVmLCB4dGVhX3Rlc3RfcHRbaV0sIHh0ZWFfdGVzdF9jdFtpXSwgMSwgTlVMTCwgMCwgImVuY3J5cHRpb24iLCBhdl94dGVhX2NyeXB0KTsKKyAgICAgICAgdGVzdF94dGVhKGN0eCwgYnVmLCB4dGVhX3Rlc3RfY3RbaV0sIHh0ZWFfdGVzdF9wdFtpXSwgMSwgTlVMTCwgMSwgImRlY3J5cHRpb24iLCBhdl94dGVhX2NyeXB0KTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorICAgICAgICAgICAgQVZfV0wzMigmYnVmWzQqal0sIEFWX1JCMzIoJnh0ZWFfdGVzdF9rZXlbaV1bNCpqXSkpOworICAgICAgICBhdl94dGVhX2xlX2luaXQoY3R4LCBidWYpOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisgICAgICAgICAgICBBVl9XTDMyKCZjdFs0KmpdLCBBVl9SQjMyKCZ4dGVhX3Rlc3RfY3RbaV1bNCpqXSkpOworICAgICAgICAgICAgQVZfV0wzMigmcGxbNCpqXSwgQVZfUkIzMigmeHRlYV90ZXN0X3B0W2ldWzQqal0pKTsKKyAgICAgICAgfQorICAgICAgICB0ZXN0X3h0ZWEoY3R4LCBidWYsIHBsLCBjdCwgMSwgTlVMTCwgMCwgImVuY3J5cHRpb24iLCBhdl94dGVhX2xlX2NyeXB0KTsKKyAgICAgICAgdGVzdF94dGVhKGN0eCwgYnVmLCBjdCwgcGwsIDEsIE5VTEwsIDEsICJkZWNyeXB0aW9uIiwgYXZfeHRlYV9sZV9jcnlwdCk7CisKKyAgICAgICAgLyogZW5jcnlwdCAqLworICAgICAgICBtZW1jcHkoaXYsICJIQUxMTzEyMyIsIDgpOworICAgICAgICBhdl94dGVhX2NyeXB0KGN0eCwgY3QsIHNyYywgNCwgaXYsIDApOworCisgICAgICAgIC8qIGRlY3J5cHQgaW50byBwbCAqLworICAgICAgICBtZW1jcHkoaXYsICJIQUxMTzEyMyIsIDgpOworICAgICAgICB0ZXN0X3h0ZWEoY3R4LCBwbCwgY3QsIHNyYywgNCwgaXYsIDEsICJDQkMgZGVjcnlwdGlvbiIsIGF2X3h0ZWFfY3J5cHQpOworCisgICAgICAgIG1lbWNweShpdiwgIkhBTExPMTIzIiwgOCk7CisgICAgICAgIHRlc3RfeHRlYShjdHgsIGN0LCBjdCwgc3JjLCA0LCBpdiwgMSwgIkNCQyBpbnBsYWNlIGRlY3J5cHRpb24iLCBhdl94dGVhX2NyeXB0KTsKKyAgICB9CisKKyAgICBwcmludGYoIlRlc3QgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHN1Y2Nlc3MuXG4iKTsKKyAgICBhdl9mcmVlKGN0eCk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90aHJlYWQuaCBiL2xpYmF2dXRpbC90aHJlYWQuaAppbmRleCAzMmRkZjQwLi5jYzUyNzJkIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvdGhyZWFkLmgKKysrIGIvbGliYXZ1dGlsL3RocmVhZC5oCkBAIC0yNiw4ICsyNiw2IEBACiAKICNpZiBIQVZFX1BUSFJFQURTIHx8IEhBVkVfVzMyVEhSRUFEUyB8fCBIQVZFX09TMlRIUkVBRFMKIAotI2RlZmluZSBVU0VfQVRPTUlDUyAwCi0KICNpZiBIQVZFX1BUSFJFQURTCiAjaW5jbHVkZSA8cHRocmVhZC5oPgogCkBAIC0zOCw4ICszNiwxMSBAQAogI2RlZmluZSBBU1NFUlRfUFRIUkVBRF9OT1JFVChmdW5jLCAuLi4pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGludCByZXQgPSBmdW5jKF9fVkFfQVJHU19fKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGlmIChyZXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjaGFyIGVycmJ1ZltBVl9FUlJPUl9NQVhfU1RSSU5HX1NJWkVdID0gIiI7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0ZBVEFMLCBBVl9TVFJJTkdJRlkoZnVuYykgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIiBmYWlsZWQgd2l0aCBlcnJvcjogJXNcbiIsIGF2X2VycjJzdHIoQVZFUlJPUihyZXQpKSk7ICAgXAorICAgICAgICAgICAgICAgIiBmYWlsZWQgd2l0aCBlcnJvcjogJXNcbiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgYXZfbWFrZV9lcnJvcl9zdHJpbmcoZXJyYnVmLCBBVl9FUlJPUl9NQVhfU1RSSU5HX1NJWkUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVZFUlJPUihyZXQpKSk7ICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBhYm9ydCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSB3aGlsZSAoMCkKQEAgLTEzMyw2ICsxMzQsNyBAQAogI2VuZGlmCiAKICNkZWZpbmUgQVZNdXRleCBwdGhyZWFkX211dGV4X3QKKyNkZWZpbmUgQVZfTVVURVhfSU5JVElBTElaRVIgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgogCiAjZGVmaW5lIGZmX211dGV4X2luaXQgICAgcHRocmVhZF9tdXRleF9pbml0CiAjZGVmaW5lIGZmX211dGV4X2xvY2sgICAgcHRocmVhZF9tdXRleF9sb2NrCkBAIC0xNDYsMTQgKzE0OCwxMyBAQAogCiAjZWxzZQogCi0jZGVmaW5lIFVTRV9BVE9NSUNTIDEKLQogI2RlZmluZSBBVk11dGV4IGNoYXIKKyNkZWZpbmUgQVZfTVVURVhfSU5JVElBTElaRVIgMAogCi0jZGVmaW5lIGZmX211dGV4X2luaXQobXV0ZXgsIGF0dHIpICgwKQotI2RlZmluZSBmZl9tdXRleF9sb2NrKG11dGV4KSAoMCkKLSNkZWZpbmUgZmZfbXV0ZXhfdW5sb2NrKG11dGV4KSAoMCkKLSNkZWZpbmUgZmZfbXV0ZXhfZGVzdHJveShtdXRleCkgKDApCitzdGF0aWMgaW5saW5lIGludCBmZl9tdXRleF9pbml0KEFWTXV0ZXggKm11dGV4LCBjb25zdCB2b2lkICphdHRyKXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGZmX211dGV4X2xvY2soQVZNdXRleCAqbXV0ZXgpeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgZmZfbXV0ZXhfdW5sb2NrKEFWTXV0ZXggKm11dGV4KXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGZmX211dGV4X2Rlc3Ryb3koQVZNdXRleCAqbXV0ZXgpeyByZXR1cm4gMDsgfQogCiAjZGVmaW5lIEFWT25jZSBjaGFyCiAjZGVmaW5lIEFWX09OQ0VfSU5JVCAwCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGhyZWFkbWVzc2FnZS5jIGIvbGliYXZ1dGlsL3RocmVhZG1lc3NhZ2UuYwppbmRleCA3YzVjZDI0Li44NzJlOTM5IDEwMDY0NAotLS0gYS9saWJhdnV0aWwvdGhyZWFkbWVzc2FnZS5jCisrKyBiL2xpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmMKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJnJtcS0+Y29uZF9yZWN2KTsKICAgICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZybXEtPmxvY2spOwogICAgICAgICBhdl9mcmVlKHJtcSk7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKHJldCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogICAgIHJtcS0+ZWxzaXplID0gZWxzaXplOwogICAgICptcSA9IHJtcTsKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmggYi9saWJhdnV0aWwvdGhyZWFkbWVzc2FnZS5oCmluZGV4IGUyNTZjYWUuLjg0ODBhMGEgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC90aHJlYWRtZXNzYWdlLmgKKysrIGIvbGliYXZ1dGlsL3RocmVhZG1lc3NhZ2UuaApAQCAtNjksMTAgKzY5LDEwIEBACiAvKioKICAqIFNldCB0aGUgc2VuZGluZyBlcnJvciBjb2RlLgogICoKLSAqIElmIHRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBub24temVybywgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfcmVjdigpIHdpbGwKLSAqIHJldHVybiBpdCBpbW1lZGlhdGVseSB3aGVuIHRoZXJlIGFyZSBubyBsb25nZXIgYXZhaWxhYmxlIG1lc3NhZ2VzLgotICogQ29udmVudGlvbmFsIHZhbHVlcywgc3VjaCBhcyBBVkVSUk9SX0VPRiBvciBBVkVSUk9SKEVBR0FJTiksIGNhbiBiZSB1c2VkCi0gKiB0byBjYXVzZSB0aGUgcmVjZWl2aW5nIHRocmVhZCB0byBzdG9wIG9yIHN1c3BlbmQgaXRzIG9wZXJhdGlvbi4KKyAqIElmIHRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBub24temVybywgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2VuZCgpIHdpbGwKKyAqIHJldHVybiBpdCBpbW1lZGlhdGVseS4gQ29udmVudGlvbmFsIHZhbHVlcywgc3VjaCBhcyBBVkVSUk9SX0VPRiBvcgorICogQVZFUlJPUihFQUdBSU4pLCBjYW4gYmUgdXNlZCB0byBjYXVzZSB0aGUgc2VuZGluZyB0aHJlYWQgdG8gc3RvcCBvcgorICogc3VzcGVuZCBpdHMgb3BlcmF0aW9uLgogICovCiB2b2lkIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfc2VuZChBVlRocmVhZE1lc3NhZ2VRdWV1ZSAqbXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyKTsKQEAgLTgwLDEwICs4MCwxMCBAQAogLyoqCiAgKiBTZXQgdGhlIHJlY2VpdmluZyBlcnJvciBjb2RlLgogICoKLSAqIElmIHRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBub24temVybywgYXZfdGhyZWFkX21lc3NhZ2VfcXVldWVfc2VuZCgpIHdpbGwKLSAqIHJldHVybiBpdCBpbW1lZGlhdGVseS4gQ29udmVudGlvbmFsIHZhbHVlcywgc3VjaCBhcyBBVkVSUk9SX0VPRiBvcgotICogQVZFUlJPUihFQUdBSU4pLCBjYW4gYmUgdXNlZCB0byBjYXVzZSB0aGUgc2VuZGluZyB0aHJlYWQgdG8gc3RvcCBvcgotICogc3VzcGVuZCBpdHMgb3BlcmF0aW9uLgorICogSWYgdGhlIGVycm9yIGNvZGUgaXMgc2V0IHRvIG5vbi16ZXJvLCBhdl90aHJlYWRfbWVzc2FnZV9xdWV1ZV9yZWN2KCkgd2lsbAorICogcmV0dXJuIGl0IGltbWVkaWF0ZWx5IHdoZW4gdGhlcmUgYXJlIG5vIGxvbmdlciBhdmFpbGFibGUgbWVzc2FnZXMuCisgKiBDb252ZW50aW9uYWwgdmFsdWVzLCBzdWNoIGFzIEFWRVJST1JfRU9GIG9yIEFWRVJST1IoRUFHQUlOKSwgY2FuIGJlIHVzZWQKKyAqIHRvIGNhdXNlIHRoZSByZWNlaXZpbmcgdGhyZWFkIHRvIHN0b3Agb3Igc3VzcGVuZCBpdHMgb3BlcmF0aW9uLgogICovCiB2b2lkIGF2X3RocmVhZF9tZXNzYWdlX3F1ZXVlX3NldF9lcnJfcmVjdihBVlRocmVhZE1lc3NhZ2VRdWV1ZSAqbXEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyKTsKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90aW1lLmMgYi9saWJhdnV0aWwvdGltZS5jCmluZGV4IGRiYWVlMDIuLmFmYTY2NTggMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC90aW1lLmMKKysrIGIvbGliYXZ1dGlsL3RpbWUuYwpAQCAtNTYsMTcgKzU2LDI1IEBACiBpbnQ2NF90IGF2X2dldHRpbWVfcmVsYXRpdmUodm9pZCkKIHsKICNpZiBIQVZFX0NMT0NLX0dFVFRJTUUgJiYgZGVmaW5lZChDTE9DS19NT05PVE9OSUMpCi0gICAgc3RydWN0IHRpbWVzcGVjIHRzOwotICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOwotICAgIHJldHVybiAoaW50NjRfdCl0cy50dl9zZWMgKiAxMDAwMDAwICsgdHMudHZfbnNlYyAvIDEwMDA7Ci0jZWxzZQotICAgIHJldHVybiBhdl9nZXR0aW1lKCkgKyA0MiAqIDYwICogNjAgKiBJTlQ2NF9DKDEwMDAwMDApOworI2lmZGVmIF9fQVBQTEVfXworICAgIGlmIChjbG9ja19nZXR0aW1lKQogI2VuZGlmCisgICAgeworICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgICAgICByZXR1cm4gKGludDY0X3QpdHMudHZfc2VjICogMTAwMDAwMCArIHRzLnR2X25zZWMgLyAxMDAwOworICAgIH0KKyNlbmRpZgorICAgIHJldHVybiBhdl9nZXR0aW1lKCkgKyA0MiAqIDYwICogNjAgKiBJTlQ2NF9DKDEwMDAwMDApOwogfQogCiBpbnQgYXZfZ2V0dGltZV9yZWxhdGl2ZV9pc19tb25vdG9uaWModm9pZCkKIHsKICNpZiBIQVZFX0NMT0NLX0dFVFRJTUUgJiYgZGVmaW5lZChDTE9DS19NT05PVE9OSUMpCisjaWZkZWYgX19BUFBMRV9fCisgICAgaWYgKCFjbG9ja19nZXR0aW1lKQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgogICAgIHJldHVybiAxOwogI2Vsc2UKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90aW1lY29kZS5jIGIvbGliYXZ1dGlsL3RpbWVjb2RlLmMKaW5kZXggZmE5MmRmMS4uNjAwNzdiYSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3RpbWVjb2RlLmMKKysrIGIvbGliYXZ1dGlsL3RpbWVjb2RlLmMKQEAgLTEyOSw3ICsxMjksOCBAQAogCiBjaGFyICphdl90aW1lY29kZV9tYWtlX21wZWdfdGNfc3RyaW5nKGNoYXIgKmJ1ZiwgdWludDMyX3QgdGMyNWJpdCkKIHsKLSAgICBzbnByaW50ZihidWYsIEFWX1RJTUVDT0RFX1NUUl9TSVpFLCAiJTAydTolMDJ1OiUwMnUlYyUwMnUiLAorICAgIHNucHJpbnRmKGJ1ZiwgQVZfVElNRUNPREVfU1RSX1NJWkUsCisgICAgICAgICAgICAgIiUwMiJQUkl1MzIiOiUwMiJQUkl1MzIiOiUwMiJQUkl1MzIiJWMlMDIiUFJJdTMyLAogICAgICAgICAgICAgIHRjMjViaXQ+PjE5ICYgMHgxZiwgICAgICAgICAgICAgIC8vIDUtYml0IGhvdXJzCiAgICAgICAgICAgICAgdGMyNWJpdD4+MTMgJiAweDNmLCAgICAgICAgICAgICAgLy8gNi1iaXQgbWludXRlcwogICAgICAgICAgICAgIHRjMjViaXQ+PjYgICYgMHgzZiwgICAgICAgICAgICAgIC8vIDYtYml0IHNlY29uZHMKQEAgLTE1NCw3ICsxNTUsNyBAQAogc3RhdGljIGludCBjaGVja190aW1lY29kZSh2b2lkICpsb2dfY3R4LCBBVlRpbWVjb2RlICp0YykKIHsKICAgICBpZiAoKGludCl0Yy0+ZnBzIDw9IDApIHsKLSAgICAgICAgYXZfbG9nKGxvZ19jdHgsIEFWX0xPR19FUlJPUiwgIlRpbWVjb2RlIGZyYW1lIHJhdGUgbXVzdCBiZSBzcGVjaWZpZWRcbiIpOworICAgICAgICBhdl9sb2cobG9nX2N0eCwgQVZfTE9HX0VSUk9SLCAiVmFsaWQgdGltZWNvZGUgZnJhbWUgcmF0ZSBtdXN0IGJlIHNwZWNpZmllZC4gTWluaW11bSB2YWx1ZSBpcyAxXG4iKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAgICAgaWYgKCh0Yy0+ZmxhZ3MgJiBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSkgJiYgdGMtPmZwcyAhPSAzMCAmJiB0Yy0+ZnBzICE9IDYwKSB7CkBAIC0yMTMsNyArMjE0LDcgQEAKICAgICB0Yy0+c3RhcnQgPSAoaGgqMzYwMCArIG1tKjYwICsgc3MpICogdGMtPmZwcyArIGZmOwogICAgIGlmICh0Yy0+ZmxhZ3MgJiBBVl9USU1FQ09ERV9GTEFHX0RST1BGUkFNRSkgeyAvKiBhZGp1c3QgZnJhbWUgbnVtYmVyICovCiAgICAgICAgIGludCB0bWlucyA9IDYwKmhoICsgbW07Ci0gICAgICAgIHRjLT5zdGFydCAtPSAyICogKHRtaW5zIC0gdG1pbnMvMTApOworICAgICAgICB0Yy0+c3RhcnQgLT0gKHRjLT5mcHMgPT0gMzAgPyAyIDogNCkgKiAodG1pbnMgLSB0bWlucy8xMCk7CiAgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3RpbWVjb2RlLmggYi9saWJhdnV0aWwvdGltZWNvZGUuaAppbmRleCA1NmUzOTc1Li4zN2MxMzYxIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvdGltZWNvZGUuaAorKysgYi9saWJhdnV0aWwvdGltZWNvZGUuaApAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgInJhdGlvbmFsLmgiCiAKLSNkZWZpbmUgQVZfVElNRUNPREVfU1RSX1NJWkUgMTYKKyNkZWZpbmUgQVZfVElNRUNPREVfU1RSX1NJWkUgMjMKIAogZW51bSBBVlRpbWVjb2RlRmxhZyB7CiAgICAgQVZfVElNRUNPREVfRkxBR19EUk9QRlJBTUUgICAgICA9IDE8PDAsIC8vLzwgdGltZWNvZGUgaXMgZHJvcCBmcmFtZQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3RpbWVyLmggYi9saWJhdnV0aWwvdGltZXIuaAppbmRleCBlZDNiMDQ3Li4wYmIzNTNjIDEwMDY0NAotLS0gYS9saWJhdnV0aWwvdGltZXIuaAorKysgYi9saWJhdnV0aWwvdGltZXIuaApAQCAtMjYsMTMgKzI2LDIzIEBACiAjaWZuZGVmIEFWVVRJTF9USU1FUl9ICiAjZGVmaW5lIEFWVVRJTF9USU1FUl9ICiAKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIENPTkZJR19MSU5VWF9QRVJGCisjIGlmbmRlZiBfR05VX1NPVVJDRQorIyAgZGVmaW5lIF9HTlVfU09VUkNFCisjIGVuZGlmCisjIGluY2x1ZGUgPHVuaXN0ZC5oPiAvLyByZWFkKDMpCisjIGluY2x1ZGUgPHN5cy9pb2N0bC5oPgorIyBpbmNsdWRlIDxhc20vdW5pc3RkLmg+CisjIGluY2x1ZGUgPGxpbnV4L3BlcmZfZXZlbnQuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWYgSEFWRV9NQUNIX01BQ0hfVElNRV9ICisjaWYgSEFWRV9NQUNIX0FCU09MVVRFX1RJTUUKICNpbmNsdWRlIDxtYWNoL21hY2hfdGltZS5oPgogI2VuZGlmCiAKQEAgLTYwLDIzICs3MCwxNyBAQAogIyAgIGRlZmluZSBGRl9USU1FUl9VTklUUyAiVU5JVFMiCiAjZW5kaWYKIAotI2lmZGVmIEFWX1JFQURfVElNRQotI2RlZmluZSBTVEFSVF9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ2NF90IHRlbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQ2NF90IHRzdGFydCA9IEFWX1JFQURfVElNRSgpOyAgICAgICAgICAgXAotCi0jZGVmaW5lIFNUT1BfVElNRVIoaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW5kID0gQVZfUkVBRF9USU1FKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBUSU1FUl9SRVBPUlQoaWQsIHRkaWZmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgc3RhdGljIHVpbnQ2NF90IHRzdW0gICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBzdGF0aWMgaW50IHRjb3VudCAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHN0YXRpYyBpbnQgdHNraXBfY291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgc3RhdGljIGludCB0aGlzdG9ncmFtWzMyXSA9IHswfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0aGlzdG9ncmFtW2F2X2xvZzIodGVuZCAtIHRzdGFydCldKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICh0Y291bnQgPCAyICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHRlbmQgLSB0c3RhcnQgPCA4ICogdHN1bSAvIHRjb3VudCB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdGVuZCAtIHRzdGFydCA8IDIwMDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICB0c3VtKz0gdGVuZCAtIHRzdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGhpc3RvZ3JhbVthdl9sb2cyKHRkaWZmKV0rKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAodGNvdW50IDwgMiAgICAgICAgICAgICAgICB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAodGRpZmYpIDwgOCAqIHRzdW0gLyB0Y291bnQgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICh0ZGlmZikgPCAyMDAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHN1bSArPSAodGRpZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICB0Y291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgdHNraXBfY291bnQrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC05MCw2ICs5NCw0NSBAQAogICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICB9CisKKyNpZiBDT05GSUdfTElOVVhfUEVSRgorCisjZGVmaW5lIFNUQVJUX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBpbnQgbGludXhfcGVyZl9mZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjRfdCB0cGVyZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFsaW51eF9wZXJmX2ZkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIGF0dHIgPSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC50eXBlICAgICAgICAgICA9IFBFUkZfVFlQRV9IQVJEV0FSRSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAuc2l6ZSAgICAgICAgICAgPSBzaXplb2Yoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciksICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLmNvbmZpZyAgICAgICAgID0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC5kaXNhYmxlZCAgICAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAuZXhjbHVkZV9rZXJuZWwgPSAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLmV4Y2x1ZGVfaHYgICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxpbnV4X3BlcmZfZmQgPSBzeXNjYWxsKF9fTlJfcGVyZl9ldmVudF9vcGVuLCAmYXR0ciwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtMSwgLTEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGxpbnV4X3BlcmZfZmQgPT0gLTEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAicGVyZl9ldmVudF9vcGVuIGZhaWxlZDogJXNcbiIsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGF2X2VycjJzdHIoQVZFUlJPUihlcnJubykpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpb2N0bChsaW51eF9wZXJmX2ZkLCBQRVJGX0VWRU5UX0lPQ19SRVNFVCwgMCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW9jdGwobGludXhfcGVyZl9mZCwgUEVSRl9FVkVOVF9JT0NfRU5BQkxFLCAwKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIFNUT1BfVElNRVIoaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlvY3RsKGxpbnV4X3BlcmZfZmQsIFBFUkZfRVZFTlRfSU9DX0RJU0FCTEUsIDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZWFkKGxpbnV4X3BlcmZfZmQsICZ0cGVyZiwgc2l6ZW9mKHRwZXJmKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVElNRVJfUkVQT1JUKGlkLCB0cGVyZikKKworI2VsaWYgZGVmaW5lZChBVl9SRUFEX1RJTUUpCisjZGVmaW5lIFNUQVJUX1RJTUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDY0X3QgdGVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDY0X3QgdHN0YXJ0ID0gQVZfUkVBRF9USU1FKCk7ICAgICAgICAgICBcCisKKyNkZWZpbmUgU1RPUF9USU1FUihpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbmQgPSBBVl9SRUFEX1RJTUUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVElNRVJfUkVQT1JUKGlkLCB0ZW5kIC0gdHN0YXJ0KQogI2Vsc2UKICNkZWZpbmUgU1RBUlRfVElNRVIKICNkZWZpbmUgU1RPUF9USU1FUihpZCkgeyB9CmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdGltZXN0YW1wLmggYi9saWJhdnV0aWwvdGltZXN0YW1wLmgKaW5kZXggZjAxMGE3ZS4uZTA4MmYwMSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3RpbWVzdGFtcC5oCisrKyBiL2xpYmF2dXRpbC90aW1lc3RhbXAuaApAQCAtNDMsNyArNDMsNyBAQAogc3RhdGljIGlubGluZSBjaGFyICphdl90c19tYWtlX3N0cmluZyhjaGFyICpidWYsIGludDY0X3QgdHMpCiB7CiAgICAgaWYgKHRzID09IEFWX05PUFRTX1ZBTFVFKSBzbnByaW50ZihidWYsIEFWX1RTX01BWF9TVFJJTkdfU0laRSwgIk5PUFRTIik7Ci0gICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIEFWX1RTX01BWF9TVFJJTkdfU0laRSwgIiUiUFJJZDY0LCB0cyk7CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWYsIEFWX1RTX01BWF9TVFJJTkdfU0laRSwgIiUiIFBSSWQ2NCwgdHMpOwogICAgIHJldHVybiBidWY7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC90cmVlLmMgYi9saWJhdnV0aWwvdHJlZS5jCmluZGV4IDI0OTVjZGYuLjdiNTdiMmQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC90cmVlLmMKKysrIGIvbGliYXZ1dGlsL3RyZWUuYwpAQCAtMTY2LDkyICsxNjYsMyBAQAogICAgICAgICAgICAgYXZfdHJlZV9lbnVtZXJhdGUodC0+Y2hpbGRbMV0sIG9wYXF1ZSwgY21wLCBlbnUpOwogICAgIH0KIH0KLQotI2lmZGVmIFRFU1QKLQotI2luY2x1ZGUgImNvbW1vbi5oIgotI2luY2x1ZGUgImxmZy5oIgotCi1zdGF0aWMgaW50IGNoZWNrKEFWVHJlZU5vZGUgKnQpCi17Ci0gICAgaWYgKHQpIHsKLSAgICAgICAgaW50IGxlZnQgID0gY2hlY2sodC0+Y2hpbGRbMF0pOwotICAgICAgICBpbnQgcmlnaHQgPSBjaGVjayh0LT5jaGlsZFsxXSk7Ci0KLSAgICAgICAgaWYgKGxlZnQgPiA5OTkgfHwgcmlnaHQgPiA5OTkpCi0gICAgICAgICAgICByZXR1cm4gMTAwMDsKLSAgICAgICAgaWYgKHJpZ2h0IC0gbGVmdCAhPSB0LT5zdGF0ZSkKLSAgICAgICAgICAgIHJldHVybiAxMDAwOwotICAgICAgICBpZiAodC0+c3RhdGUgPiAxIHx8IHQtPnN0YXRlIDwgLTEpCi0gICAgICAgICAgICByZXR1cm4gMTAwMDsKLSAgICAgICAgcmV0dXJuIEZGTUFYKGxlZnQsIHJpZ2h0KSArIDE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwcmludChBVlRyZWVOb2RlICp0LCBpbnQgZGVwdGgpCi17Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGRlcHRoICogNDsgaSsrKQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiICIpOwotICAgIGlmICh0KSB7Ci0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJOb2RlICVwICUyZCAlcFxuIiwgdCwgdC0+c3RhdGUsIHQtPmVsZW0pOwotICAgICAgICBwcmludCh0LT5jaGlsZFswXSwgZGVwdGggKyAxKTsKLSAgICAgICAgcHJpbnQodC0+Y2hpbGRbMV0sIGRlcHRoICsgMSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJOVUxMXG4iKTsKLX0KLQotc3RhdGljIGludCBjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKLXsKLSAgICByZXR1cm4gKGNvbnN0IHVpbnQ4X3QgKikgYSAtIChjb25zdCB1aW50OF90ICopIGI7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgaTsKLSAgICB2b2lkICprOwotICAgIEFWVHJlZU5vZGUgKnJvb3QgPSBOVUxMLCAqbm9kZSA9IE5VTEw7Ci0gICAgQVZMRkcgcHJuZzsKLSAgICBpbnQgbG9nX2xldmVsID0gYXJnYyA8PSAxID8gQVZfTE9HX0lORk8gOiBhdG9pKGFyZ3ZbMV0pOwotCi0gICAgYXZfbG9nX3NldF9sZXZlbChsb2dfbGV2ZWwpOwotCi0gICAgYXZfbGZnX2luaXQoJnBybmcsIDEpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDEwMDAwOyBpKyspIHsKLSAgICAgICAgaW50cHRyX3QgaiA9IGF2X2xmZ19nZXQoJnBybmcpICUgODYyOTQ7Ci0KLSAgICAgICAgaWYgKGNoZWNrKHJvb3QpID4gOTk5KSB7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiRkFUQUwgZXJyb3IgJWRcbiIsIGkpOwotICAgICAgICAgICAgcHJpbnQocm9vdCwgMCk7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAiaW5zZXJ0aW5nICU0ZFxuIiwgKGludClqKTsKLQotICAgICAgICBpZiAoIW5vZGUpCi0gICAgICAgICAgICBub2RlID0gYXZfdHJlZV9ub2RlX2FsbG9jKCk7Ci0gICAgICAgIGlmICghbm9kZSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGF2X3RyZWVfaW5zZXJ0KCZyb290LCAodm9pZCAqKShqICsgMSksIGNtcCwgJm5vZGUpOwotCi0gICAgICAgIGogPSBhdl9sZmdfZ2V0KCZwcm5nKSAlIDg2Mjk0OwotICAgICAgICB7Ci0gICAgICAgICAgICBBVlRyZWVOb2RlICpub2RlMiA9IE5VTEw7Ci0gICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0RFQlVHLCAicmVtb3ZpbmcgJTRkXG4iLCAoaW50KWopOwotICAgICAgICAgICAgYXZfdHJlZV9pbnNlcnQoJnJvb3QsICh2b2lkICopKGogKyAxKSwgY21wLCAmbm9kZTIpOwotICAgICAgICAgICAgayA9IGF2X3RyZWVfZmluZChyb290LCAodm9pZCAqKShqICsgMSksIGNtcCwgTlVMTCk7Ci0gICAgICAgICAgICBpZiAoaykKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAicmVtb3ZhbCBmYWlsdXJlICVkXG4iLCBpKTsKLSAgICAgICAgICAgIGF2X2ZyZWUobm9kZTIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGF2X2ZyZWUobm9kZSk7Ci0KLSAgICBhdl90cmVlX2Rlc3Ryb3kocm9vdCk7Ci0KLSAgICByZXR1cm4gMDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3RyZWUuaCBiL2xpYmF2dXRpbC90cmVlLmgKaW5kZXggZTFhZWZhYS4uZDVlMGFlYiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3RyZWUuaAorKysgYi9saWJhdnV0aWwvdHJlZS5oCkBAIC01OCw3ICs1OCw3IEBACiAgKiAgICAgICAgICAgICB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIG5leHQgaXMgdW5jaGFuZ2VkLgogICogQHBhcmFtIGNtcCBjb21wYXJlIGZ1bmN0aW9uIHVzZWQgdG8gY29tcGFyZSBlbGVtZW50cyBpbiB0aGUgdHJlZSwKICAqICAgICAgICAgICAgQVBJIGlkZW50aWNhbCB0byB0aGF0IG9mIFN0YW5kYXJkIEMncyBxc29ydAotICogICAgICAgICAgICBJdCBpcyBndXJhbnRlZWQgdGhhdCB0aGUgZmlyc3QgYW5kIG9ubHkgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGNtcCgpCisgKiAgICAgICAgICAgIEl0IGlzIGd1YXJhbnRlZWQgdGhhdCB0aGUgZmlyc3QgYW5kIG9ubHkgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGNtcCgpCiAgKiAgICAgICAgICAgIHdpbGwgYmUgdGhlIGtleSBwYXJhbWV0ZXIgdG8gYXZfdHJlZV9maW5kKCksIHRodXMgaXQgY291bGQgaWYgdGhlCiAgKiAgICAgICAgICAgIHVzZXIgd2FudHMsIGJlIGEgZGlmZmVyZW50IHR5cGUgKGxpa2UgYW4gb3BhcXVlIGNvbnRleHQpLgogICogQHJldHVybiBBbiBlbGVtZW50IHdpdGggY21wKGtleSwgZWxlbSkgPT0gMCBvciBOVUxMIGlmIG5vIHN1Y2ggZWxlbWVudApAQCAtMTIwLDggKzEyMCw4IEBACiAvKioKICAqIEFwcGx5IGVudShvcGFxdWUsICZlbGVtKSB0byBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSB0cmVlIGluIGEgZ2l2ZW4gcmFuZ2UuCiAgKgotICogQHBhcmFtIGNtcCBhIGNvbXBhcmlzb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIDwgMCBmb3IgYSBlbGVtZW50IGJlbG93IHRoZQotICogICAgICAgICAgICByYW5nZSwgPiAwIGZvciBhIGVsZW1lbnQgYWJvdmUgdGhlIHJhbmdlIGFuZCA9PSAwIGZvciBhCisgKiBAcGFyYW0gY21wIGEgY29tcGFyaXNvbiBmdW5jdGlvbiB0aGF0IHJldHVybnMgPCAwIGZvciBhbiBlbGVtZW50IGJlbG93IHRoZQorICogICAgICAgICAgICByYW5nZSwgPiAwIGZvciBhbiBlbGVtZW50IGFib3ZlIHRoZSByYW5nZSBhbmQgPT0gMCBmb3IgYW4KICAqICAgICAgICAgICAgZWxlbWVudCBpbnNpZGUgdGhlIHJhbmdlCiAgKgogICogQG5vdGUgVGhlIGNtcCBmdW5jdGlvbiBzaG91bGQgdXNlIHRoZSBzYW1lIG9yZGVyaW5nIHVzZWQgdG8gY29uc3RydWN0IHRoZQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3R3b2Zpc2guYyBiL2xpYmF2dXRpbC90d29maXNoLmMKaW5kZXggMTYyMDY5Yi4uZDg0ZmE0ZiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3R3b2Zpc2guYworKysgYi9saWJhdnV0aWwvdHdvZmlzaC5jCkBAIC0zMjksNzcgKzMyOSwzIEBACiAgICAgICAgIGRzdCA9IGRzdCArIDE2OwogICAgIH0KIH0KLQotI2lmZGVmIFRFU1QKLSNpbmNsdWRlPHN0ZGlvLmg+Ci0jaW5jbHVkZTxzdGRsaWIuaD4KLSNpbmNsdWRlImxvZy5oIgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQotewotICAgIHVpbnQ4X3QgS2V5WzMyXSA9IHsweDAxLCAweDIzLCAweDQ1LCAweDY3LCAweDg5LCAweGFiLCAweGNkLCAweGVmLCAweGZlLCAweGRjLCAweGJhLCAweDk4LCAweDc2LCAweDU0LCAweDMyLCAweDEwLCAweDAwLCAweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4LCAweDk5LCAweGFhLCAweGJiLCAweGNjLCAweGRkLCAweGVlLCAweGZmCi0gICAgfTsKLSAgICBjb25zdCB1aW50OF90IHJjdFs2XVsxNl0gPSB7Ci0gICAgICAgIHsweDlmLCAweDU4LCAweDlmLCAweDVjLCAweGY2LCAweDEyLCAweDJjLCAweDMyLCAweGI2LCAweGJmLCAweGVjLCAweDJmLCAweDJhLCAweGU4LCAweGMzLCAweDVhfSwKLSAgICAgICAgezB4Y2YsIDB4ZDEsIDB4ZDIsIDB4ZTUsIDB4YTksIDB4YmUsIDB4OWMsIDB4ZGYsIDB4NTAsIDB4MWYsIDB4MTMsIDB4YjgsIDB4OTIsIDB4YmQsIDB4MjIsIDB4NDh9LAotICAgICAgICB7MHgzNywgMHg1MiwgMHg3YiwgMHhlMCwgMHgwNSwgMHgyMywgMHgzNCwgMHhiOCwgMHg5ZiwgMHgwYywgMHhmYywgMHhjYSwgMHhlOCwgMHg3YywgMHhmYSwgMHgyMH0sCi0gICAgICAgIHsweDVkLCAweDlkLCAweDRlLCAweGVmLCAweGZhLCAweDkxLCAweDUxLCAweDU3LCAweDU1LCAweDI0LCAweGYxLCAweDE1LCAweDgxLCAweDVhLCAweDEyLCAweGUwfSwKLSAgICAgICAgezB4ZTcsIDB4NTQsIDB4NDksIDB4MjEsIDB4MmIsIDB4ZWUsIDB4ZjksIDB4ZjQsIDB4YTMsIDB4OTAsIDB4YmQsIDB4ODYsIDB4MGEsIDB4NjQsIDB4MDksIDB4NDF9LAotICAgICAgICB7MHgzNywgMHhmZSwgMHgyNiwgMHhmZiwgMHgxYywgMHhmNiwgMHg2MSwgMHg3NSwgMHhmNSwgMHhkZCwgMHhmNCwgMHhjMywgMHgzYiwgMHg5NywgMHhhMiwgMHgwNX0KLSAgICB9OwotICAgIHVpbnQ4X3QgdGVtcFszMl0sIGl2WzE2XSwgcnB0WzMyXSA9IHswfTsKLSAgICBjb25zdCBpbnQga2JpdHNbM10gPSB7MTI4LCAxOTIsIDI1Nn07Ci0gICAgaW50IGksIGosIGVyciA9IDA7Ci0gICAgQVZUV09GSVNIICpjczsKLSAgICBjcyA9IGF2X3R3b2Zpc2hfYWxsb2MoKTsKLSAgICBpZiAoIWNzKQotICAgICAgICByZXR1cm4gMTsKLSAgICBmb3IgKGogPSAxOyBqIDwgMzsgaisrKSB7Ci0gICAgICAgIGF2X3R3b2Zpc2hfaW5pdChjcywgS2V5LCBrYml0c1tqXSk7Ci0gICAgICAgIGF2X3R3b2Zpc2hfY3J5cHQoY3MsIHRlbXAsIHJwdCwgMSwgTlVMTCwgMCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAocmN0W2pdW2ldICE9IHRlbXBbaV0pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCByY3Rbal1baV0sIHRlbXBbaV0pOwotICAgICAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYXZfdHdvZmlzaF9jcnlwdChjcywgdGVtcCwgcmN0W2pdLCAxLCBOVUxMLCAxKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChycHRbaV0gIT0gdGVtcFtpXSkgewotICAgICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICIlZCAlMDJ4ICUwMnhcbiIsIGksIHJwdFtpXSwgdGVtcFtpXSk7Ci0gICAgICAgICAgICAgICAgZXJyID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGogPSAwOyBqIDwgMzsgaisrKSB7Ci0gICAgICAgIG1lbXNldChLZXksIDAsIHNpemVvZihLZXkpKTsKLSAgICAgICAgbWVtc2V0KHJwdCwgMCwgc2l6ZW9mKHJwdCkpOwotICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNTA7IGkrKykgewotICAgICAgICAgICAgYXZfdHdvZmlzaF9pbml0KGNzLCBLZXksIGtiaXRzW2pdKTsKLSAgICAgICAgICAgIGF2X3R3b2Zpc2hfY3J5cHQoY3MsIHRlbXAsIHJwdCwgMSwgTlVMTCwgMCk7Ci0gICAgICAgICAgICBtZW1jcHkoS2V5KzE2LEtleSwoa2JpdHNbal0tMTI4KSA+PiAzKTsKLSAgICAgICAgICAgIG1lbWNweShLZXkscnB0LDE2KTsKLSAgICAgICAgICAgIG1lbWNweShycHQsdGVtcCwxNik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChyY3RbMyArIGpdW2ldICE9IHRlbXBbaV0pIHsKLSAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiJWQgJTAyeCAlMDJ4XG4iLCBpLCByY3RbMyArIGpdW2ldLCB0ZW1wW2ldKTsKLSAgICAgICAgICAgICAgICBlcnIgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIG1lbXNldChycHQsIDAsIHNpemVvZihycHQpKTsKLSAgICBtZW1jcHkoaXYsICJIQUxMTzEyM0hBTExPMTIzIiwgMTYpOwotICAgIGF2X3R3b2Zpc2hfY3J5cHQoY3MsIHRlbXAsIHJwdCwgMiwgaXYsIDApOwotICAgIG1lbWNweShpdiwgIkhBTExPMTIzSEFMTE8xMjMiLCAxNik7Ci0gICAgYXZfdHdvZmlzaF9jcnlwdChjcywgdGVtcCwgdGVtcCwgMiwgaXYsIDEpOwotICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0gICAgICAgIGlmIChycHRbaV0gIT0gdGVtcFtpXSkgewotICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVkICUwMnggJTAyeFxuIiwgaSwgcnB0W2ldLCB0ZW1wW2ldKTsKLSAgICAgICAgICAgIGVyciA9IDE7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgYXZfZnJlZShjcyk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3V0ZjguYyBiL2xpYmF2dXRpbC91dGY4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NDdhNTEuLjAwMDAwMDAKLS0tIGEvbGliYXZ1dGlsL3V0ZjguYworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTMgU3RlZmFubyBTYWJhdGluaQotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaWZkZWYgVEVTVAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNpbmNsdWRlICJsaWJhdnV0aWwvYXZzdHJpbmcuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvZmlsZS5oIgotCi1zdGF0aWMgdm9pZCBwcmludF9zZXF1ZW5jZShjb25zdCBjaGFyICpwLCBpbnQgbCwgaW50IGluZGVudCkKLXsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbDsgaSsrKQotICAgICAgICBwcmludGYoIiUwMlgiLCAodWludDhfdClwW2ldKTsKLSAgICBwcmludGYoIiUqcyIsIGluZGVudC1sKjIsICIiKTsKLX0KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQotewotICAgIGludCByZXQ7Ci0gICAgY2hhciAqZmlsZW5hbWUgPSBhcmd2WzFdOwotICAgIHVpbnQ4X3QgKmZpbGVfYnVmOwotICAgIHNpemVfdCBmaWxlX2J1Zl9zaXplOwotICAgIHVpbnQzMl90IGNvZGU7Ci0gICAgY29uc3QgdWludDhfdCAqcCwgKmVuZHA7Ci0KLSAgICByZXQgPSBhdl9maWxlX21hcChmaWxlbmFtZSwgJmZpbGVfYnVmLCAmZmlsZV9idWZfc2l6ZSwgMCwgTlVMTCk7Ci0gICAgaWYgKHJldCA8IDApCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgcCA9IGZpbGVfYnVmOwotICAgIGVuZHAgPSBmaWxlX2J1ZiArIGZpbGVfYnVmX3NpemU7Ci0gICAgd2hpbGUgKHAgPCBlbmRwKSB7Ci0gICAgICAgIGludCBsLCByOwotICAgICAgICBjb25zdCB1aW50OF90ICpwMCA9IHA7Ci0gICAgICAgIGNvZGUgPSBVSU5UMzJfTUFYOwotICAgICAgICByID0gYXZfdXRmOF9kZWNvZGUoJmNvZGUsICZwLCBlbmRwLCAwKTsKLSAgICAgICAgbCA9IChpbnQpKHAtcDApOwotICAgICAgICBwcmludF9zZXF1ZW5jZShwMCwgbCwgMjApOwotICAgICAgICBpZiAoY29kZSAhPSBVSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICBwcmludGYoIiUtMTBkIDB4JS0xMFggJS01ZCAiLCBjb2RlLCBjb2RlLCBsKTsKLSAgICAgICAgICAgIGlmIChyID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoKnAwID09ICdcbicpIHByaW50ZigiXFxuXG4iKTsKLSAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgIHByaW50ZiAoIiUuKnNcbiIsIGwsIHAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGNvZGUgcmFuZ2VcbiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRmKCJpbnZhbGlkIHNlcXVlbmNlXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGF2X2ZpbGVfdW5tYXAoZmlsZV9idWYsIGZpbGVfYnVmX3NpemUpOwotICAgIHJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9saWJhdnV0aWwvdXRpbHMuYyBiL2xpYmF2dXRpbC91dGlscy5jCmluZGV4IGY0MDlmMzIuLjIzMDA4MWUgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC91dGlscy5jCisrKyBiL2xpYmF2dXRpbC91dGlscy5jCkBAIC00MSw5ICs0MSw2IEBACiAgICAgaWYgKGNoZWNrc19kb25lKQogICAgICAgICByZXR1cm4gTElCQVZVVElMX1ZFUlNJT05fSU5UOwogCi0jaWYgRkZfQVBJX1ZEUEFVCi0gICAgYXZfYXNzZXJ0MChBVl9QSVhfRk1UX1ZEQV9WTEQgPT0gODEpOyAvL2NoZWNrIGlmIHRoZSBwaXggZm10IGVudW0gaGFzIG5vdCBoYWQgYW55dGhpbmcgaW5zZXJ0ZWQgb3IgcmVtb3ZlZCBieSBtaXN0YWtlCi0jZW5kaWYKICAgICBhdl9hc3NlcnQwKEFWX1NBTVBMRV9GTVRfREJMUCA9PSA5KTsKICAgICBhdl9hc3NlcnQwKEFWTUVESUFfVFlQRV9BVFRBQ0hNRU5UID09IDQpOwogICAgIGF2X2Fzc2VydDAoQVZfUElDVFVSRV9UWVBFX0JJID09IDcpOwpAQCAtMTIxLDcgKzExOCw0MyBAQAogICAgIHJldHVybiBpOwogfQogCitjaGFyICphdl9mb3VyY2NfbWFrZV9zdHJpbmcoY2hhciAqYnVmLCB1aW50MzJfdCBmb3VyY2MpCit7CisgICAgaW50IGk7CisgICAgY2hhciAqb3JpZ19idWYgPSBidWY7CisgICAgc2l6ZV90IGJ1Zl9zaXplID0gQVZfRk9VUkNDX01BWF9TVFJJTkdfU0laRTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgY29uc3QgaW50IGMgPSBmb3VyY2MgJiAweGZmOworICAgICAgICBjb25zdCBpbnQgcHJpbnRfY2hyID0gKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgJiYgc3RyY2hyKCIuIC1fIiwgYykpOworICAgICAgICBjb25zdCBpbnQgbGVuID0gc25wcmludGYoYnVmLCBidWZfc2l6ZSwgcHJpbnRfY2hyID8gIiVjIiA6ICJbJWRdIiwgYyk7CisgICAgICAgIGlmIChsZW4gPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJ1ZiArPSBsZW47CisgICAgICAgIGJ1Zl9zaXplID0gYnVmX3NpemUgPiBsZW4gPyBidWZfc2l6ZSAtIGxlbiA6IDA7CisgICAgICAgIGZvdXJjYyA+Pj0gODsKKyAgICB9CisKKyAgICByZXR1cm4gb3JpZ19idWY7Cit9CisKIEFWUmF0aW9uYWwgYXZfZ2V0X3RpbWVfYmFzZV9xKHZvaWQpCiB7CiAgICAgcmV0dXJuIChBVlJhdGlvbmFsKXsxLCBBVl9USU1FX0JBU0V9OwogfQorCit2b2lkIGF2X2Fzc2VydDBfZnB1KHZvaWQpIHsKKyNpZiBIQVZFX01NWF9JTkxJTkUKKyAgICB1aW50MTZfdCBzdGF0ZVsxNF07CisgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAiZnN0ZW52ICUwIFxuXHQiCisgICAgICAgIDogIittIiAoc3RhdGUpCisgICAgICAgIDoKKyAgICAgICAgOiAibWVtb3J5IgorICAgICk7CisgICAgYXZfYXNzZXJ0MCgoc3RhdGVbNF0gJiAzKSA9PSAzKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3ZlcnNpb24uaCBiL2xpYmF2dXRpbC92ZXJzaW9uLmgKaW5kZXggMGVhOGM3OS4uM2E2M2U2MyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3ZlcnNpb24uaAorKysgYi9saWJhdnV0aWwvdmVyc2lvbi5oCkBAIC0xOCw2ICsxOCwxMiBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKy8qKgorICogQGZpbGUKKyAqIEBpbmdyb3VwIGxhdnUKKyAqIExpYmF2dXRpbCB2ZXJzaW9uIG1hY3JvcworICovCisKICNpZm5kZWYgQVZVVElMX1ZFUlNJT05fSAogI2RlZmluZSBBVlVUSUxfVkVSU0lPTl9ICiAKQEAgLTI5LDYgKzM1LDIxIEBACiAgKiBVc2VmdWwgdG8gY2hlY2sgYW5kIG1hdGNoIGxpYnJhcnkgdmVyc2lvbiBpbiBvcmRlciB0byBtYWludGFpbgogICogYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAqCisgKiBUaGUgRkZtcGVnIGxpYnJhcmllcyBmb2xsb3cgYSB2ZXJzaW9uaW5nIHNoZW1lIHZlcnkgc2ltaWxhciB0bworICogU2VtYW50aWMgVmVyc2lvbmluZyAoaHR0cDovL3NlbXZlci5vcmcvKQorICogVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgY29tcG9uZW50IGNhbGxlZCBQQVRDSCBpcyBjYWxsZWQgTUlDUk8gaW4gRkZtcGVnCisgKiBhbmQgaXRzIHZhbHVlIGlzIHJlc2V0IHRvIDEwMCBpbnN0ZWFkIG9mIDAgdG8ga2VlcCBpdCBhYm92ZSBvciBlcXVhbCB0byAxMDAuCisgKiBBbHNvIHdlIGRvIG5vdCBpbmNyZWFzZSBNSUNSTyBmb3IgZXZlcnkgYnVnZml4IG9yIGNoYW5nZSBpbiBnaXQgbWFzdGVyLgorICoKKyAqIFByaW9yIHRvIEZGbXBlZyAzLjIgcG9pbnQgcmVsZWFzZXMgZGlkIG5vdCBjaGFuZ2UgYW55IGxpYiB2ZXJzaW9uIG51bWJlciB0bworICogYXZvaWQgYWxpYXNzaW5nIGRpZmZlcmVudCBnaXQgbWFzdGVyIGNoZWNrb3V0cy4KKyAqIFN0YXJ0aW5nIHdpdGggRkZtcGVnIDMuMiwgdGhlIHJlbGVhc2VkIGxpYnJhcnkgdmVyc2lvbnMgd2lsbCBvY2N1cHkKKyAqIGEgc2VwYXJhdGUgTUFKT1IuTUlOT1IgdGhhdCBpcyBub3QgdXNlZCBvbiB0aGUgbWFzdGVyIGRldmVsb3BtZW50IGJyYW5jaC4KKyAqIFRoYXQgaXMgaWYgd2UgYnJhbmNoIGEgcmVsZWFzZSBvZiBtYXN0ZXIgNTUuMTAuMTIzIHdlIHdpbGwgYnVtcCB0byA1NS4xMS4xMDAKKyAqIGZvciB0aGUgcmVsZWFzZSBhbmQgbWFzdGVyIHdpbGwgY29udGludWUgYXQgNTUuMTIuMTAwIGFmdGVyIGl0LiBFYWNoIG5ldworICogcG9pbnQgcmVsZWFzZSB3aWxsIHRoZW4gYnVtcCB0aGUgTUlDUk8gaW1wcm92aW5nIHRoZSB1c2VmdWxuZXNzIG9mIHRoZSBsaWIKKyAqIHZlcnNpb25zLgorICoKICAqIEB7CiAgKi8KIApAQCAtNDksMTIgKzcwLDYgQEAKICAqLwogCiAvKioKLSAqIEBmaWxlCi0gKiBAaW5ncm91cCBsYXZ1Ci0gKiBMaWJhdnV0aWwgdmVyc2lvbiBtYWNyb3MKLSAqLwotCi0vKioKICAqIEBkZWZncm91cCBsYXZ1X3ZlciBWZXJzaW9uIGFuZCBCdWlsZCBkaWFnbm9zdGljcwogICoKICAqIE1hY3JvcyBhbmQgZnVuY3Rpb24gdXNlZnVsIHRvIGNoZWNrIGF0IGNvbXBpbGV0aW1lIGFuZCBhdCBydW50aW1lCkBAIC02Myw5ICs3OCw5IEBACiAgKiBAewogICovCiAKLSNkZWZpbmUgTElCQVZVVElMX1ZFUlNJT05fTUFKT1IgIDU1Ci0jZGVmaW5lIExJQkFWVVRJTF9WRVJTSU9OX01JTk9SICAxNwotI2RlZmluZSBMSUJBVlVUSUxfVkVSU0lPTl9NSUNSTyAxMDMKKyNkZWZpbmUgTElCQVZVVElMX1ZFUlNJT05fTUFKT1IgIDU2CisjZGVmaW5lIExJQkFWVVRJTF9WRVJTSU9OX01JTk9SICAxNAorI2RlZmluZSBMSUJBVlVUSUxfVkVSU0lPTl9NSUNSTyAxMDAKIAogI2RlZmluZSBMSUJBVlVUSUxfVkVSU0lPTl9JTlQgICBBVl9WRVJTSU9OX0lOVChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJBVlVUSUxfVkVSU0lPTl9NSU5PUiwgXApAQCAtNzgsOSArOTMsNyBAQAogI2RlZmluZSBMSUJBVlVUSUxfSURFTlQgICAgICAgICAiTGF2dSIgQVZfU1RSSU5HSUZZKExJQkFWVVRJTF9WRVJTSU9OKQogCiAvKioKLSAqIEB9Ci0gKgotICogQGRlZmdyb3VwIGRlcHJfZ3VhcmRzIERlcHJlY2F0aW9uIGd1YXJkcworICogQGRlZmdyb3VwIGxhdnVfZGVwcl9ndWFyZHMgRGVwcmVjYXRpb24gR3VhcmRzCiAgKiBGRl9BUElfKiBkZWZpbmVzIG1heSBiZSBwbGFjZWQgYmVsb3cgdG8gaW5kaWNhdGUgcHVibGljIEFQSSB0aGF0IHdpbGwgYmUKICAqIGRyb3BwZWQgYXQgYSBmdXR1cmUgdmVyc2lvbiBidW1wLiBUaGUgZGVmaW5lcyB0aGVtc2VsdmVzIGFyZSBub3QgcGFydCBvZgogICogdGhlIHB1YmxpYyBBUEkgYW5kIG1heSBjaGFuZ2UsIGJyZWFrIG9yIGRpc2FwcGVhciBhdCBhbnkgdGltZS4KQEAgLTkyLDM3ICsxMDUsMzUgQEAKICAqIEB7CiAgKi8KIAotI2lmbmRlZiBGRl9BUElfVkRQQVUKLSNkZWZpbmUgRkZfQVBJX1ZEUEFVICAgICAgICAgICAgICAgICAgICAoTElCQVZVVElMX1ZFUlNJT05fTUFKT1IgPCA1NikKLSNlbmRpZgotI2lmbmRlZiBGRl9BUElfWFZNQwotI2RlZmluZSBGRl9BUElfWFZNQyAgICAgICAgICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU2KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9PUFRfVFlQRV9NRVRBREFUQQotI2RlZmluZSBGRl9BUElfT1BUX1RZUEVfTUVUQURBVEEgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU2KQotI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9ETE9HCi0jZGVmaW5lIEZGX0FQSV9ETE9HICAgICAgICAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTYpCi0jZW5kaWYKICNpZm5kZWYgRkZfQVBJX1ZBQVBJCi0jZGVmaW5lIEZGX0FQSV9WQUFQSSAgICAgICAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTYpCisjZGVmaW5lIEZGX0FQSV9WQUFQSSAgICAgICAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTcpCiAjZW5kaWYKICNpZm5kZWYgRkZfQVBJX0ZSQU1FX1FQCi0jZGVmaW5lIEZGX0FQSV9GUkFNRV9RUCAgICAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTYpCisjZGVmaW5lIEZGX0FQSV9GUkFNRV9RUCAgICAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTcpCiAjZW5kaWYKICNpZm5kZWYgRkZfQVBJX1BMVVMxX01JTlVTMQotI2RlZmluZSBGRl9BUElfUExVUzFfTUlOVVMxICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU2KQorI2RlZmluZSBGRl9BUElfUExVUzFfTUlOVVMxICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU3KQogI2VuZGlmCiAjaWZuZGVmIEZGX0FQSV9FUlJPUl9GUkFNRQotI2RlZmluZSBGRl9BUElfRVJST1JfRlJBTUUgICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU2KQorI2RlZmluZSBGRl9BUElfRVJST1JfRlJBTUUgICAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU3KQogI2VuZGlmCi0jaWZuZGVmIEZGX0FQSV9DUkNfQklHX1RBQkxFCi0jZGVmaW5lIEZGX0FQSV9DUkNfQklHX1RBQkxFICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTYpCisjaWZuZGVmIEZGX0FQSV9QS1RfUFRTCisjZGVmaW5lIEZGX0FQSV9QS1RfUFRTICAgICAgICAgICAgICAgICAgKExJQkFWVVRJTF9WRVJTSU9OX01BSk9SIDwgNTcpCisjZW5kaWYKKyNpZm5kZWYgRkZfQVBJX0NSWVBUT19TSVpFX1QKKyNkZWZpbmUgRkZfQVBJX0NSWVBUT19TSVpFX1QgICAgICAgICAgICAoTElCQVZVVElMX1ZFUlNJT05fTUFKT1IgPCA1NykKKyNlbmRpZgorI2lmbmRlZiBGRl9BUElfRlJBTUVfR0VUX1NFVAorI2RlZmluZSBGRl9BUElfRlJBTUVfR0VUX1NFVCAgICAgICAgICAgIChMSUJBVlVUSUxfVkVSU0lPTl9NQUpPUiA8IDU3KQorI2VuZGlmCisjaWZuZGVmIEZGX0FQSV9QU0VVRE9QQUwKKyNkZWZpbmUgRkZfQVBJX1BTRVVET1BBTCAgICAgICAgICAgICAgICAoTElCQVZVVElMX1ZFUlNJT05fTUFKT1IgPCA1NykKICNlbmRpZgogCiAKIC8qKgogICogQH0KKyAqIEB9CiAgKi8KIAogI2VuZGlmIC8qIEFWVVRJTF9WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC93Y2hhcl9maWxlbmFtZS5oIGIvbGliYXZ1dGlsL3djaGFyX2ZpbGVuYW1lLmgKaW5kZXggMmFkZTMyMS4uMTQyZDUwZSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3djaGFyX2ZpbGVuYW1lLmgKKysrIGIvbGliYXZ1dGlsL3djaGFyX2ZpbGVuYW1lLmgKQEAgLTE5LDcgKzE5LDcgQEAKICNpZm5kZWYgQVZVVElMX1dDSEFSX0ZJTEVOQU1FX0gKICNkZWZpbmUgQVZVVElMX1dDSEFSX0ZJTEVOQU1FX0gKIAotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX01JTkdXMzJDRV9fKQorI2lmZGVmIF9XSU4zMgogI2luY2x1ZGUgPHdpbmRvd3MuaD4KICNpbmNsdWRlICJtZW0uaCIKIApkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3g4Ni9NYWtlZmlsZSBiL2xpYmF2dXRpbC94ODYvTWFrZWZpbGUKaW5kZXggOTRkODgzMi4uNWY1MjQyYiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3g4Ni9NYWtlZmlsZQorKysgYi9saWJhdnV0aWwveDg2L01ha2VmaWxlCkBAIC0xLDE2ICsxLDE4IEBACiBPQkpTICs9IHg4Ni9jcHUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHg4Ni9maXhlZF9kc3BfaW5pdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHg4Ni9mbG9hdF9kc3BfaW5pdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHg4Ni9pbWd1dGlsc19pbml0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIHg4Ni9sbHNfaW5pdC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAKIE9CSlMtJChDT05GSUdfUElYRUxVVElMUykgKz0geDg2L3BpeGVsdXRpbHNfaW5pdC5vICAgICAgICAgICAgICAgICAgICAgIFwKIAogRU1NU19PQkpTXyQoSEFWRV9NTVhfSU5MSU5FKV8kKEhBVkVfTU1YX0VYVEVSTkFMKV8kKEhBVkVfTU1fRU1QVFkpID0geDg2L2VtbXMubwogCi1ZQVNNLU9CSlMgKz0geDg2L2NwdWlkLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitYODZBU00tT0JKUyArPSB4ODYvY3B1aWQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgJChFTU1TX09CSlNfX3llc18pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgeDg2L2ZpeGVkX2RzcC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgeDg2L2Zsb2F0X2RzcC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgeDg2L2ltZ3V0aWxzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgeDg2L2xscy5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAKLVlBU00tT0JKUy0kKENPTkZJR19QSVhFTFVUSUxTKSArPSB4ODYvcGl4ZWx1dGlscy5vICAgICAgICAgICAgICAgICAgICAgIFwKK1g4NkFTTS1PQkpTLSQoQ09ORklHX1BJWEVMVVRJTFMpICs9IHg4Ni9waXhlbHV0aWxzLm8gICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC94ODYvYXNtLmggYi9saWJhdnV0aWwveDg2L2FzbS5oCmluZGV4IDEwOWI2NWUuLjliZmY0MmQgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC94ODYvYXNtLmgKKysrIGIvbGliYXZ1dGlsL3g4Ni9hc20uaApAQCAtMjgsNDYgKzI4LDQ2IEBACiB0eXBlZGVmIHN0cnVjdCB5bW1fcmVnIHsgdWludDY0X3QgYSwgYiwgYywgZDsgfSB5bW1fcmVnOwogCiAjaWYgQVJDSF9YODZfNjQKLSMgICAgZGVmaW5lIE9QU0laRSAicSIKLSMgICAgZGVmaW5lIFJFR19hICJyYXgiCi0jICAgIGRlZmluZSBSRUdfYiAicmJ4IgotIyAgICBkZWZpbmUgUkVHX2MgInJjeCIKLSMgICAgZGVmaW5lIFJFR19kICJyZHgiCi0jICAgIGRlZmluZSBSRUdfRCAicmRpIgotIyAgICBkZWZpbmUgUkVHX1MgInJzaSIKLSMgICAgZGVmaW5lIFBUUl9TSVpFICI4IgorIyAgICBkZWZpbmUgRkZfT1BTSVpFICJxIgorIyAgICBkZWZpbmUgRkZfUkVHX2EgInJheCIKKyMgICAgZGVmaW5lIEZGX1JFR19iICJyYngiCisjICAgIGRlZmluZSBGRl9SRUdfYyAicmN4IgorIyAgICBkZWZpbmUgRkZfUkVHX2QgInJkeCIKKyMgICAgZGVmaW5lIEZGX1JFR19EICJyZGkiCisjICAgIGRlZmluZSBGRl9SRUdfUyAicnNpIgorIyAgICBkZWZpbmUgRkZfUFRSX1NJWkUgIjgiCiB0eXBlZGVmIGludDY0X3QgeDg2X3JlZzsKIAotLyogUkVHX1NQIGlzIGRlZmluZWQgaW4gU29sYXJpcyBzeXMgaGVhZGVycywgc28gdXNlIFJFR19zcCAqLwotIyAgICBkZWZpbmUgUkVHX3NwICJyc3AiCi0jICAgIGRlZmluZSBSRUdfQlAgInJicCIKLSMgICAgZGVmaW5lIFJFR0JQICAgcmJwCi0jICAgIGRlZmluZSBSRUdhICAgIHJheAotIyAgICBkZWZpbmUgUkVHYiAgICByYngKLSMgICAgZGVmaW5lIFJFR2MgICAgcmN4Ci0jICAgIGRlZmluZSBSRUdkICAgIHJkeAotIyAgICBkZWZpbmUgUkVHU1AgICByc3AKKy8qIEZGX1JFR19TUCBpcyBkZWZpbmVkIGluIFNvbGFyaXMgc3lzIGhlYWRlcnMsIHNvIHVzZSBGRl9SRUdfc3AgKi8KKyMgICAgZGVmaW5lIEZGX1JFR19zcCAicnNwIgorIyAgICBkZWZpbmUgRkZfUkVHX0JQICJyYnAiCisjICAgIGRlZmluZSBGRl9SRUdCUCAgIHJicAorIyAgICBkZWZpbmUgRkZfUkVHYSAgICByYXgKKyMgICAgZGVmaW5lIEZGX1JFR2IgICAgcmJ4CisjICAgIGRlZmluZSBGRl9SRUdjICAgIHJjeAorIyAgICBkZWZpbmUgRkZfUkVHZCAgICByZHgKKyMgICAgZGVmaW5lIEZGX1JFR1NQICAgcnNwCiAKICNlbGlmIEFSQ0hfWDg2XzMyCiAKLSMgICAgZGVmaW5lIE9QU0laRSAibCIKLSMgICAgZGVmaW5lIFJFR19hICJlYXgiCi0jICAgIGRlZmluZSBSRUdfYiAiZWJ4IgotIyAgICBkZWZpbmUgUkVHX2MgImVjeCIKLSMgICAgZGVmaW5lIFJFR19kICJlZHgiCi0jICAgIGRlZmluZSBSRUdfRCAiZWRpIgotIyAgICBkZWZpbmUgUkVHX1MgImVzaSIKLSMgICAgZGVmaW5lIFBUUl9TSVpFICI0IgorIyAgICBkZWZpbmUgRkZfT1BTSVpFICJsIgorIyAgICBkZWZpbmUgRkZfUkVHX2EgImVheCIKKyMgICAgZGVmaW5lIEZGX1JFR19iICJlYngiCisjICAgIGRlZmluZSBGRl9SRUdfYyAiZWN4IgorIyAgICBkZWZpbmUgRkZfUkVHX2QgImVkeCIKKyMgICAgZGVmaW5lIEZGX1JFR19EICJlZGkiCisjICAgIGRlZmluZSBGRl9SRUdfUyAiZXNpIgorIyAgICBkZWZpbmUgRkZfUFRSX1NJWkUgIjQiCiB0eXBlZGVmIGludDMyX3QgeDg2X3JlZzsKIAotIyAgICBkZWZpbmUgUkVHX3NwICJlc3AiCi0jICAgIGRlZmluZSBSRUdfQlAgImVicCIKLSMgICAgZGVmaW5lIFJFR0JQICAgZWJwCi0jICAgIGRlZmluZSBSRUdhICAgIGVheAotIyAgICBkZWZpbmUgUkVHYiAgICBlYngKLSMgICAgZGVmaW5lIFJFR2MgICAgZWN4Ci0jICAgIGRlZmluZSBSRUdkICAgIGVkeAotIyAgICBkZWZpbmUgUkVHU1AgICBlc3AKKyMgICAgZGVmaW5lIEZGX1JFR19zcCAiZXNwIgorIyAgICBkZWZpbmUgRkZfUkVHX0JQICJlYnAiCisjICAgIGRlZmluZSBGRl9SRUdCUCAgIGVicAorIyAgICBkZWZpbmUgRkZfUkVHYSAgICBlYXgKKyMgICAgZGVmaW5lIEZGX1JFR2IgICAgZWJ4CisjICAgIGRlZmluZSBGRl9SRUdjICAgIGVjeAorIyAgICBkZWZpbmUgRkZfUkVHZCAgICBlZHgKKyMgICAgZGVmaW5lIEZGX1JFR1NQICAgZXNwCiAjZWxzZQogdHlwZWRlZiBpbnQgeDg2X3JlZzsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3g4Ni9jcHUuYyBiL2xpYmF2dXRpbC94ODYvY3B1LmMKaW5kZXggYmI2M2RhYS4uYWNhODkzMSAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3g4Ni9jcHUuYworKysgYi9saWJhdnV0aWwveDg2L2NwdS5jCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHVfaW50ZXJuYWwuaCIKIAotI2lmIEhBVkVfWUFTTQorI2lmIEhBVkVfWDg2QVNNCiAKICNkZWZpbmUgY3B1aWQoaW5kZXgsIGVheCwgZWJ4LCBlY3gsIGVkeCkgICAgICAgIFwKICAgICBmZl9jcHVfY3B1aWQoaW5kZXgsICZlYXgsICZlYngsICZlY3gsICZlZHgpCkBAIC00MSw5ICs0MSw5IEBACiAvKiBlYnggc2F2aW5nIGlzIG5lY2Vzc2FyeSBmb3IgUElDLiBnY2Mgc2VlbXMgdW5hYmxlIHRvIHNlZSBpdCBhbG9uZSAqLwogI2RlZmluZSBjcHVpZChpbmRleCwgZWF4LCBlYngsIGVjeCwgZWR4KSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICJtb3YgICAgJSUiUkVHX2IiLCAlJSJSRUdfUyIgXG5cdCIgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibW92ICAgICUlIkZGX1JFR19iIiwgJSUiRkZfUkVHX1MiIFxuXHQiICAgICAgICAgICAgICAgIFwKICAgICAgICAgImNwdWlkICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICJ4Y2hnICAgJSUiUkVHX2IiLCAlJSJSRUdfUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAieGNoZyAgICUlIkZGX1JFR19iIiwgJSUiRkZfUkVHX1MgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgOiAiPWEiIChlYXgpLCAiPVMiIChlYngpLCAiPWMiIChlY3gpLCAiPWQiIChlZHgpICAgICAgICBcCiAgICAgICAgIDogIjAiIChpbmRleCksICIyIigwKSkKIApAQCAtNjYsNyArNjYsNyBAQAogCiAjZGVmaW5lIGNwdWlkX3Rlc3QoKSAxCiAKLSNlbGlmIEhBVkVfWUFTTQorI2VsaWYgSEFWRV9YODZBU00KIAogI2RlZmluZSBjcHVpZF90ZXN0IGZmX2NwdV9jcHVpZF90ZXN0CiAKQEAgLTk3LDYgKzk3LDcgQEAKICAgICBpbnQgbWF4X3N0ZF9sZXZlbCwgbWF4X2V4dF9sZXZlbCwgc3RkX2NhcHMgPSAwLCBleHRfY2FwcyA9IDA7CiAgICAgaW50IGZhbWlseSA9IDAsIG1vZGVsID0gMDsKICAgICB1bmlvbiB7IGludCBpWzNdOyBjaGFyIGNbMTJdOyB9IHZlbmRvcjsKKyAgICBpbnQgeGNyMF9sbyA9IDAsIHhjcjBfaGkgPSAwOwogCiAgICAgaWYgKCFjcHVpZF90ZXN0KCkpCiAgICAgICAgIHJldHVybiAwOyAvKiBDUFVJRCBub3Qgc3VwcG9ydGVkICovCkBAIC0xMzIsOCArMTMzLDggQEAKICAgICAgICAgLyogQ2hlY2sgT1hTQVZFIGFuZCBBVlggYml0cyAqLwogICAgICAgICBpZiAoKGVjeCAmIDB4MTgwMDAwMDApID09IDB4MTgwMDAwMDApIHsKICAgICAgICAgICAgIC8qIENoZWNrIGZvciBPUyBzdXBwb3J0ICovCi0gICAgICAgICAgICB4Z2V0YnYoMCwgZWF4LCBlZHgpOwotICAgICAgICAgICAgaWYgKChlYXggJiAweDYpID09IDB4NikgeworICAgICAgICAgICAgeGdldGJ2KDAsIHhjcjBfbG8sIHhjcjBfaGkpOworICAgICAgICAgICAgaWYgKCh4Y3IwX2xvICYgMHg2KSA9PSAweDYpIHsKICAgICAgICAgICAgICAgICBydmFsIHw9IEFWX0NQVV9GTEFHX0FWWDsKICAgICAgICAgICAgICAgICBpZiAoZWN4ICYgMHgwMDAwMTAwMCkKICAgICAgICAgICAgICAgICAgICAgcnZhbCB8PSBBVl9DUFVfRkxBR19GTUEzOwpAQCAtMTQ3LDYgKzE0OCwxMyBAQAogI2lmIEhBVkVfQVZYMgogICAgICAgICBpZiAoKHJ2YWwgJiBBVl9DUFVfRkxBR19BVlgpICYmIChlYnggJiAweDAwMDAwMDIwKSkKICAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfQVZYMjsKKyNpZiBIQVZFX0FWWDUxMiAvKiBGLCBDRCwgQlcsIERRLCBWTCAqLworICAgICAgICBpZiAoKHhjcjBfbG8gJiAweGUwKSA9PSAweGUwKSB7IC8qIE9QTUFTSy9aTU0gc3RhdGUgKi8KKyAgICAgICAgICAgIGlmICgocnZhbCAmIEFWX0NQVV9GTEFHX0FWWDIpICYmIChlYnggJiAweGQwMDMwMDAwKSA9PSAweGQwMDMwMDAwKQorICAgICAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfQVZYNTEyOworCisgICAgICAgIH0KKyNlbmRpZiAvKiBIQVZFX0FWWDUxMiAqLwogI2VuZGlmIC8qIEhBVkVfQVZYMiAqLwogICAgICAgICAvKiBCTUkxLzIgZG9uJ3QgbmVlZCBPUyBzdXBwb3J0ICovCiAgICAgICAgIGlmIChlYnggJiAweDAwMDAwMDA4KSB7CkBAIC0xODIsNyArMTkwLDcgQEAKIAogICAgICAgICAvKiBTaW1pbGFyIHRvIHRoZSBhYm92ZSBidXQgZm9yIEFWWCBmdW5jdGlvbnMgb24gQU1EIHByb2Nlc3NvcnMuCiAgICAgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgZm9yIGZ1bmN0aW9ucyB1c2luZyBZTU0gcmVnaXN0ZXJzIG9uIEJ1bGxkb3plcgotICAgICAgICAgICBhbmQgSmFndWFyIGJhc2VkIENQVXMgYXMgdGhleSBsYWNrIDI1Ni1iaXRzIGV4ZWN1dGlvbiB1bml0cy4gU1NFL0FWWAorICAgICAgICAgICBhbmQgSmFndWFyIGJhc2VkIENQVXMgYXMgdGhleSBsYWNrIDI1Ni1iaXQgZXhlY3V0aW9uIHVuaXRzLiBTU0UvQVZYCiAgICAgICAgICAgIGZ1bmN0aW9ucyB1c2luZyBYTU0gcmVnaXN0ZXJzIGFyZSBhbHdheXMgZmFzdGVyIG9uIHRoZW0uCiAgICAgICAgICAgIEFWX0NQVV9GTEFHX0FWWCBhbmQgQVZfQ1BVX0ZMQUdfQVZYU0xPVyBhcmUgYm90aCBzZXQgc28gdGhhdCBBVlggaXMKICAgICAgICAgICAgdXNlZCB1bmxlc3MgZXhwbGljaXRseSBkaXNhYmxlZCBieSBjaGVja2luZyBBVl9DUFVfRkxBR19BVlhTTE9XLiAqLwpAQCAtMjIxLDkgKzIyOSw0NCBAQAogICAgICAgICAgKiBmdW5jdGlvbnMgb24gdGhlIEF0b20uICovCiAgICAgICAgIGlmIChmYW1pbHkgPT0gNiAmJiBtb2RlbCA9PSAyOCkKICAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfQVRPTTsKKworICAgICAgICAvKiBDb25yb2UgaGFzIGEgc2xvdyBzaHVmZmxlIHVuaXQuIENoZWNrIHRoZSBtb2RlbCBudW1iZXIgdG8gZW5zdXJlIG5vdAorICAgICAgICAgKiB0byBpbmNsdWRlIGNyaXBwbGVkIGxvdy1lbmQgUGVucnlucyBhbmQgTmVoYWxlbXMgdGhhdCBsYWNrIFNTRTQuICovCisgICAgICAgIGlmICgocnZhbCAmIEFWX0NQVV9GTEFHX1NTU0UzKSAmJiAhKHJ2YWwgJiBBVl9DUFVfRkxBR19TU0U0KSAmJgorICAgICAgICAgICAgZmFtaWx5ID09IDYgJiYgbW9kZWwgPCAyMykKKyAgICAgICAgICAgIHJ2YWwgfD0gQVZfQ1BVX0ZMQUdfU1NTRTNTTE9XOwogICAgIH0KIAogI2VuZGlmIC8qIGNwdWlkICovCiAKICAgICByZXR1cm4gcnZhbDsKIH0KKworc2l6ZV90IGZmX2dldF9jcHVfbWF4X2FsaWduX3g4Nih2b2lkKQoreworICAgIGludCBmbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChmbGFncyAmIEFWX0NQVV9GTEFHX0FWWDUxMikKKyAgICAgICAgcmV0dXJuIDY0OworICAgIGlmIChmbGFncyAmIChBVl9DUFVfRkxBR19BVlgyICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19BVlggICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19YT1AgICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19GTUE0ICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19GTUEzICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19BVlhTTE9XKSkKKyAgICAgICAgcmV0dXJuIDMyOworICAgIGlmIChmbGFncyAmIChBVl9DUFVfRkxBR19BRVNOSSAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0U0MiAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0U0ICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU1NFMyAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0UzICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0UyICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0UgICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19BVE9NICAgICAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU1NFM1NMT1cgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0UzU0xPVyAgfAorICAgICAgICAgICAgICAgICBBVl9DUFVfRkxBR19TU0UyU0xPVykpCisgICAgICAgIHJldHVybiAxNjsKKworICAgIHJldHVybiA4OworfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3g4Ni9jcHUuaCBiL2xpYmF2dXRpbC94ODYvY3B1LmgKaW5kZXggZjE3MTAzNy4uOTM3YzY5NyAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3g4Ni9jcHUuaAorKysgYi9saWJhdnV0aWwveDg2L2NwdS5oCkBAIC0xOSw3ICsxOSw2IEBACiAjaWZuZGVmIEFWVVRJTF9YODZfQ1BVX0gKICNkZWZpbmUgQVZVVElMX1g4Nl9DUFVfSAogCi0jaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHVfaW50ZXJuYWwuaCIKIApAQCAtMzgsNiArMzcsOCBAQAogI2RlZmluZSBYODZfU1NFM19GQVNUKGZsYWdzKSAgICAgICAgQ1BVRVhUX0ZBU1QoZmxhZ3MsIFNTRTMpCiAjZGVmaW5lIFg4Nl9TU0UzX1NMT1coZmxhZ3MpICAgICAgICBDUFVFWFRfU0xPVyhmbGFncywgU1NFMykKICNkZWZpbmUgWDg2X1NTU0UzKGZsYWdzKSAgICAgICAgICAgIENQVUVYVChmbGFncywgU1NTRTMpCisjZGVmaW5lIFg4Nl9TU1NFM19GQVNUKGZsYWdzKSAgICAgICBDUFVFWFRfRkFTVChmbGFncywgU1NTRTMpCisjZGVmaW5lIFg4Nl9TU1NFM19TTE9XKGZsYWdzKSAgICAgICBDUFVFWFRfU0xPVyhmbGFncywgU1NTRTMpCiAjZGVmaW5lIFg4Nl9TU0U0KGZsYWdzKSAgICAgICAgICAgICBDUFVFWFQoZmxhZ3MsIFNTRTQpCiAjZGVmaW5lIFg4Nl9TU0U0MihmbGFncykgICAgICAgICAgICBDUFVFWFQoZmxhZ3MsIFNTRTQyKQogI2RlZmluZSBYODZfQVZYKGZsYWdzKSAgICAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBBVlgpCkBAIC00OCw2ICs0OSw3IEBACiAjZGVmaW5lIFg4Nl9GTUE0KGZsYWdzKSAgICAgICAgICAgICBDUFVFWFQoZmxhZ3MsIEZNQTQpCiAjZGVmaW5lIFg4Nl9BVlgyKGZsYWdzKSAgICAgICAgICAgICBDUFVFWFQoZmxhZ3MsIEFWWDIpCiAjZGVmaW5lIFg4Nl9BRVNOSShmbGFncykgICAgICAgICAgICBDUFVFWFQoZmxhZ3MsIEFFU05JKQorI2RlZmluZSBYODZfQVZYNTEyKGZsYWdzKSAgICAgICAgICAgQ1BVRVhUKGZsYWdzLCBBVlg1MTIpCiAKICNkZWZpbmUgRVhURVJOQUxfQU1EM0ROT1coZmxhZ3MpICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgQU1EM0ROT1cpCiAjZGVmaW5lIEVYVEVSTkFMX0FNRDNETk9XRVhUKGZsYWdzKSBDUFVFWFRfU1VGRklYKGZsYWdzLCBfRVhURVJOQUwsIEFNRDNETk9XRVhUKQpAQCAtNjEsNiArNjMsOCBAQAogI2RlZmluZSBFWFRFUk5BTF9TU0UzX0ZBU1QoZmxhZ3MpICAgQ1BVRVhUX1NVRkZJWF9GQVNUKGZsYWdzLCBfRVhURVJOQUwsIFNTRTMpCiAjZGVmaW5lIEVYVEVSTkFMX1NTRTNfU0xPVyhmbGFncykgICBDUFVFWFRfU1VGRklYX1NMT1coZmxhZ3MsIF9FWFRFUk5BTCwgU1NFMykKICNkZWZpbmUgRVhURVJOQUxfU1NTRTMoZmxhZ3MpICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgU1NTRTMpCisjZGVmaW5lIEVYVEVSTkFMX1NTU0UzX0ZBU1QoZmxhZ3MpICBDUFVFWFRfU1VGRklYX0ZBU1QoZmxhZ3MsIF9FWFRFUk5BTCwgU1NTRTMpCisjZGVmaW5lIEVYVEVSTkFMX1NTU0UzX1NMT1coZmxhZ3MpICBDUFVFWFRfU1VGRklYX1NMT1coZmxhZ3MsIF9FWFRFUk5BTCwgU1NTRTMpCiAjZGVmaW5lIEVYVEVSTkFMX1NTRTQoZmxhZ3MpICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfRVhURVJOQUwsIFNTRTQpCiAjZGVmaW5lIEVYVEVSTkFMX1NTRTQyKGZsYWdzKSAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfRVhURVJOQUwsIFNTRTQyKQogI2RlZmluZSBFWFRFUk5BTF9BVlgoZmxhZ3MpICAgICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0VYVEVSTkFMLCBBVlgpCkBAIC03NSw2ICs3OSw3IEBACiAjZGVmaW5lIEVYVEVSTkFMX0FWWDJfRkFTVChmbGFncykgICBDUFVFWFRfU1VGRklYX0ZBU1QyKGZsYWdzLCBfRVhURVJOQUwsIEFWWDIsIEFWWCkKICNkZWZpbmUgRVhURVJOQUxfQVZYMl9TTE9XKGZsYWdzKSAgIENQVUVYVF9TVUZGSVhfU0xPVzIoZmxhZ3MsIF9FWFRFUk5BTCwgQVZYMiwgQVZYKQogI2RlZmluZSBFWFRFUk5BTF9BRVNOSShmbGFncykgICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0VYVEVSTkFMLCBBRVNOSSkKKyNkZWZpbmUgRVhURVJOQUxfQVZYNTEyKGZsYWdzKSAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9FWFRFUk5BTCwgQVZYNTEyKQogCiAjZGVmaW5lIElOTElORV9BTUQzRE5PVyhmbGFncykgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfSU5MSU5FLCBBTUQzRE5PVykKICNkZWZpbmUgSU5MSU5FX0FNRDNETk9XRVhUKGZsYWdzKSAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9JTkxJTkUsIEFNRDNETk9XRVhUKQpAQCAtODgsNiArOTMsOCBAQAogI2RlZmluZSBJTkxJTkVfU1NFM19GQVNUKGZsYWdzKSAgICAgQ1BVRVhUX1NVRkZJWF9GQVNUKGZsYWdzLCBfSU5MSU5FLCBTU0UzKQogI2RlZmluZSBJTkxJTkVfU1NFM19TTE9XKGZsYWdzKSAgICAgQ1BVRVhUX1NVRkZJWF9TTE9XKGZsYWdzLCBfSU5MSU5FLCBTU0UzKQogI2RlZmluZSBJTkxJTkVfU1NTRTMoZmxhZ3MpICAgICAgICAgQ1BVRVhUX1NVRkZJWChmbGFncywgX0lOTElORSwgU1NTRTMpCisjZGVmaW5lIElOTElORV9TU1NFM19GQVNUKGZsYWdzKSAgICBDUFVFWFRfU1VGRklYX0ZBU1QoZmxhZ3MsIF9JTkxJTkUsIFNTU0UzKQorI2RlZmluZSBJTkxJTkVfU1NTRTNfU0xPVyhmbGFncykgICAgQ1BVRVhUX1NVRkZJWF9TTE9XKGZsYWdzLCBfSU5MSU5FLCBTU1NFMykKICNkZWZpbmUgSU5MSU5FX1NTRTQoZmxhZ3MpICAgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9JTkxJTkUsIFNTRTQpCiAjZGVmaW5lIElOTElORV9TU0U0MihmbGFncykgICAgICAgICBDUFVFWFRfU1VGRklYKGZsYWdzLCBfSU5MSU5FLCBTU0U0MikKICNkZWZpbmUgSU5MSU5FX0FWWChmbGFncykgICAgICAgICAgIENQVUVYVF9TVUZGSVgoZmxhZ3MsIF9JTkxJTkUsIEFWWCkKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC94ODYvZW1tcy5hc20gYi9saWJhdnV0aWwveDg2L2VtbXMuYXNtCmluZGV4IDBhYWQzNGEuLjg2MTE3NjIgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC94ODYvZW1tcy5hc20KKysrIGIvbGliYXZ1dGlsL3g4Ni9lbW1zLmFzbQpAQCAtMjMsOCArMjMsOCBAQAogU0VDVElPTiAudGV4dAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgdm9pZCBhdnByaXZfZW1tc195YXNtKHZvaWQpCis7IHZvaWQgYXZwcml2X2VtbXNfYXNtKHZvaWQpCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWN2aXNpYmxlIGVtbXNfeWFzbSwgMCwgMAorY3Zpc2libGUgZW1tc19hc20sIDAsIDAKICAgICBlbW1zCiAgICAgUkVUCmRpZmYgLS1naXQgYS9saWJhdnV0aWwveDg2L2VtbXMuaCBiL2xpYmF2dXRpbC94ODYvZW1tcy5oCmluZGV4IDZmZGE2ZTIuLmMyMWUzNGIgMTAwNjQ0Ci0tLSBhL2xpYmF2dXRpbC94ODYvZW1tcy5oCisrKyBiL2xpYmF2dXRpbC94ODYvZW1tcy5oCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2F0dHJpYnV0ZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAKLXZvaWQgYXZwcml2X2VtbXNfeWFzbSh2b2lkKTsKK3ZvaWQgYXZwcml2X2VtbXNfYXNtKHZvaWQpOwogCiAjaWYgSEFWRV9NTVhfSU5MSU5FCiAjICAgZGVmaW5lIGVtbXNfYyBlbW1zX2MKQEAgLTMxLDYgKzMxLDggQEAKICAqIEVtcHR5IG1teCBzdGF0ZS4KICAqIHRoaXMgbXVzdCBiZSBjYWxsZWQgYmV0d2VlbiBhbnkgZHNwIGZ1bmN0aW9uIGFuZCBmbG9hdC9kb3VibGUgY29kZS4KICAqIGZvciBleGFtcGxlIHNpbigpOyBkc3AtPmlkY3RfcHV0KCk7IGVtbXNfYygpOyBjb3MoKQorICogTm90ZSwgKmFsbG9jKCkgYW5kICpmcmVlKCkgYWxzbyB1c2UgZmxvYXQgY29kZSBpbiBzb21lIGxpYmMgaW1wbGVtZW50YXRpb25zCisgKiB0aHVzIHRoaXMgYWxzbyBhcHBsaWVzIHRvIHRoZW0gb3IgYW55IGZ1bmN0aW9uIHVzaW5nIHRoZW0uCiAgKi8KIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgZW1tc19jKHZvaWQpCiB7CkBAIC00Nyw3ICs0OSw3IEBACiAjICAgaW5jbHVkZSA8bW1pbnRyaW4uaD4KICMgICBkZWZpbmUgZW1tc19jIF9tbV9lbXB0eQogI2VsaWYgSEFWRV9NTVhfRVhURVJOQUwKLSMgICBkZWZpbmUgZW1tc19jIGF2cHJpdl9lbW1zX3lhc20KKyMgICBkZWZpbmUgZW1tc19jIGF2cHJpdl9lbW1zX2FzbQogI2VuZGlmIC8qIEhBVkVfTU1YX0lOTElORSAqLwogCiAjZW5kaWYgLyogQVZVVElMX1g4Nl9FTU1TX0ggKi8KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC94ODYvZmxvYXRfZHNwLmFzbSBiL2xpYmF2dXRpbC94ODYvZmxvYXRfZHNwLmFzbQppbmRleCAwMjFmZjAzLi4wNmQyZDJjIDEwMDY0NAotLS0gYS9saWJhdnV0aWwveDg2L2Zsb2F0X2RzcC5hc20KKysrIGIvbGliYXZ1dGlsL3g4Ni9mbG9hdF9kc3AuYXNtCkBAIC0yMiw2ICsyMiw5IEBACiAKICVpbmNsdWRlICJ4ODZ1dGlsLmFzbSIKIAorU0VDVElPTl9ST0RBVEEgMzIKK3BkX3JldmVyc2U6IGRkIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDAKKwogU0VDVElPTiAudGV4dAogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE0OSw2ICsxNTIsNjkgQEAKIFZFQ1RPUl9GTVVMX1NDQUxBUgogCiA7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7IHZvaWQgZmZfdmVjdG9yX2RtYWNfc2NhbGFyKGRvdWJsZSAqZHN0LCBjb25zdCBkb3VibGUgKnNyYywgZG91YmxlIG11bCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworJW1hY3JvIFZFQ1RPUl9ETUFDX1NDQUxBUiAwCislaWYgQVJDSF9YODZfMzIKK2NnbG9iYWwgdmVjdG9yX2RtYWNfc2NhbGFyLCAyLDQsNSwgZHN0LCBzcmMsIG11bCwgbGVuLCBsZW5hZGRyCisgICAgbW92ICAgICAgICAgIGxlbnEsIGxlbmFkZHJtCisgICAgVkJST0FEQ0FTVFNEIG0wLCBtdWxtCislZWxzZQorJWlmIFVOSVg2NAorY2dsb2JhbCB2ZWN0b3JfZG1hY19zY2FsYXIsIDMsMyw1LCBkc3QsIHNyYywgbGVuCislZWxzZQorY2dsb2JhbCB2ZWN0b3JfZG1hY19zY2FsYXIsIDQsNCw1LCBkc3QsIHNyYywgbXVsLCBsZW4KKyAgICBTV0FQIDAsIDIKKyVlbmRpZgorICAgIG1vdmxocHMgICAgIHhtMCwgeG0wCislaWYgY3B1ZmxhZyhhdngpCisgICAgdmluc2VydGYxMjggIG0wLCBtMCwgeG0wLCAxCislZW5kaWYKKyVlbmRpZgorICAgIGxlYSAgICBsZW5xLCBbbGVuZCo4LW1tc2l6ZSo0XQorLmxvb3A6CislaWYgY3B1ZmxhZyhmbWEzKQorICAgIG1vdmFwcyAgIG0xLCAgICAgW2RzdHErbGVucV0KKyAgICBtb3ZhcHMgICBtMiwgICAgIFtkc3RxK2xlbnErMSptbXNpemVdCisgICAgbW92YXBzICAgbTMsICAgICBbZHN0cStsZW5xKzIqbW1zaXplXQorICAgIG1vdmFwcyAgIG00LCAgICAgW2RzdHErbGVucSszKm1tc2l6ZV0KKyAgICBmbWFkZHBkICBtMSwgbTAsIFtzcmNxK2xlbnFdLCBtMQorICAgIGZtYWRkcGQgIG0yLCBtMCwgW3NyY3ErbGVucSsxKm1tc2l6ZV0sIG0yCisgICAgZm1hZGRwZCAgbTMsIG0wLCBbc3JjcStsZW5xKzIqbW1zaXplXSwgbTMKKyAgICBmbWFkZHBkICBtNCwgbTAsIFtzcmNxK2xlbnErMyptbXNpemVdLCBtNAorJWVsc2UgOyBjcHVmbGFnCisgICAgbXVscGQgICAgbTEsIG0wLCBbc3JjcStsZW5xXQorICAgIG11bHBkICAgIG0yLCBtMCwgW3NyY3ErbGVucSsxKm1tc2l6ZV0KKyAgICBtdWxwZCAgICBtMywgbTAsIFtzcmNxK2xlbnErMiptbXNpemVdCisgICAgbXVscGQgICAgbTQsIG0wLCBbc3JjcStsZW5xKzMqbW1zaXplXQorICAgIGFkZHBkICAgIG0xLCBtMSwgW2RzdHErbGVucV0KKyAgICBhZGRwZCAgICBtMiwgbTIsIFtkc3RxK2xlbnErMSptbXNpemVdCisgICAgYWRkcGQgICAgbTMsIG0zLCBbZHN0cStsZW5xKzIqbW1zaXplXQorICAgIGFkZHBkICAgIG00LCBtNCwgW2RzdHErbGVucSszKm1tc2l6ZV0KKyVlbmRpZiA7IGNwdWZsYWcKKyAgICBtb3ZhcHMgW2RzdHErbGVucV0sIG0xCisgICAgbW92YXBzIFtkc3RxK2xlbnErMSptbXNpemVdLCBtMgorICAgIG1vdmFwcyBbZHN0cStsZW5xKzIqbW1zaXplXSwgbTMKKyAgICBtb3ZhcHMgW2RzdHErbGVucSszKm1tc2l6ZV0sIG00CisgICAgc3ViICAgIGxlbnEsIG1tc2l6ZSo0CisgICAgamdlIC5sb29wCisgICAgUkVQX1JFVAorJWVuZG1hY3JvCisKK0lOSVRfWE1NIHNzZTIKK1ZFQ1RPUl9ETUFDX1NDQUxBUgorJWlmIEhBVkVfQVZYX0VYVEVSTkFMCitJTklUX1lNTSBhdngKK1ZFQ1RPUl9ETUFDX1NDQUxBUgorJWVuZGlmCislaWYgSEFWRV9GTUEzX0VYVEVSTkFMCitJTklUX1lNTSBmbWEzCitWRUNUT1JfRE1BQ19TQ0FMQVIKKyVlbmRpZgorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IHZvaWQgZmZfdmVjdG9yX2RtdWxfc2NhbGFyKGRvdWJsZSAqZHN0LCBjb25zdCBkb3VibGUgKnNyYywgZG91YmxlIG11bCwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbikKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3Nyw4ICsyNDMsOCBAQAogLmxvb3A6CiAgICAgbXVscGQgICAgICAgICAgbTEsIG0wLCBbc3JjcStsZW5xICAgICAgIF0KICAgICBtdWxwZCAgICAgICAgICBtMiwgbTAsIFtzcmNxK2xlbnErbW1zaXplXQotICAgIG1vdmEgICBbZHN0cStsZW5xICAgICAgIF0sIG0xCi0gICAgbW92YSAgIFtkc3RxK2xlbnErbW1zaXplXSwgbTIKKyAgICBtb3ZhcHMgW2RzdHErbGVucSAgICAgICBdLCBtMQorICAgIG1vdmFwcyBbZHN0cStsZW5xK21tc2l6ZV0sIG0yCiAgICAgc3ViICAgICAgICAgIGxlbnEsIDIqbW1zaXplCiAgICAgamdlIC5sb29wCiAgICAgUkVQX1JFVApAQCAtMjk2LDEwICszNjIsMTYgQEAKIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogJW1hY3JvIFZFQ1RPUl9GTVVMX1JFVkVSU0UgMAogY2dsb2JhbCB2ZWN0b3JfZm11bF9yZXZlcnNlLCA0LDQsMiwgZHN0LCBzcmMwLCBzcmMxLCBsZW4KKyVpZiBjcHVmbGFnKGF2eDIpCisgICAgbW92YXBzICBtMiwgW3BkX3JldmVyc2VdCislZW5kaWYKICAgICBsZWEgICAgICAgbGVucSwgW2xlbmQqNCAtIDIqbW1zaXplXQogQUxJR04gMTYKIC5sb29wOgotJWlmIGNwdWZsYWcoYXZ4KQorJWlmIGNwdWZsYWcoYXZ4MikKKyAgICB2cGVybXBzIG0wLCBtMiwgW3NyYzFxXQorICAgIHZwZXJtcHMgbTEsIG0yLCBbc3JjMXErbW1zaXplXQorJWVsaWYgY3B1ZmxhZyhhdngpCiAgICAgdm1vdmFwcyAgICAgeG1tMCwgW3NyYzFxICsgMTZdCiAgICAgdmluc2VydGYxMjggbTAsIG0wLCBbc3JjMXFdLCAxCiAgICAgdnNodWZwcyAgICAgbTAsIG0wLCBtMCwgcTAxMjMKQEAgLTMxNCw4ICszODYsOCBAQAogJWVuZGlmCiAgICAgbXVscHMgICBtMCwgbTAsIFtzcmMwcSArIGxlbnEgKyBtbXNpemVdCiAgICAgbXVscHMgICBtMSwgbTEsIFtzcmMwcSArIGxlbnFdCi0gICAgbW92YSAgICBbZHN0cSArIGxlbnEgKyBtbXNpemVdLCBtMAotICAgIG1vdmEgICAgW2RzdHEgKyBsZW5xXSwgbTEKKyAgICBtb3ZhcHMgIFtkc3RxICsgbGVucSArIG1tc2l6ZV0sIG0wCisgICAgbW92YXBzICBbZHN0cSArIGxlbnFdLCBtMQogICAgIGFkZCAgICAgc3JjMXEsIDIqbW1zaXplCiAgICAgc3ViICAgICBsZW5xLCAgMiptbXNpemUKICAgICBqZ2UgICAgIC5sb29wCkBAIC0zMjgsNiArNDAwLDEwIEBACiBJTklUX1lNTSBhdngKIFZFQ1RPUl9GTVVMX1JFVkVSU0UKICVlbmRpZgorJWlmIEhBVkVfQVZYMl9FWFRFUk5BTAorSU5JVF9ZTU0gYXZ4MgorVkVDVE9SX0ZNVUxfUkVWRVJTRQorJWVuZGlmCiAKIDsgZmxvYXQgc2NhbGFycHJvZHVjdF9mbG9hdF9zc2UoY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIsIGludCBsZW4pCiBJTklUX1hNTSBzc2UKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC94ODYvZmxvYXRfZHNwX2luaXQuYyBiL2xpYmF2dXRpbC94ODYvZmxvYXRfZHNwX2luaXQuYwppbmRleCBjODM2YTc4Li4xMjIwODdhIDEwMDY0NAotLS0gYS9saWJhdnV0aWwveDg2L2Zsb2F0X2RzcF9pbml0LmMKKysrIGIvbGliYXZ1dGlsL3g4Ni9mbG9hdF9kc3BfaW5pdC5jCkBAIC0zOSw2ICszOSwxMyBAQAogdm9pZCBmZl92ZWN0b3JfZm11bF9zY2FsYXJfc3NlKGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMsIGZsb2F0IG11bCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKIAordm9pZCBmZl92ZWN0b3JfZG1hY19zY2FsYXJfc3NlMihkb3VibGUgKmRzdCwgY29uc3QgZG91YmxlICpzcmMsIGRvdWJsZSBtdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4pOwordm9pZCBmZl92ZWN0b3JfZG1hY19zY2FsYXJfYXZ4KGRvdWJsZSAqZHN0LCBjb25zdCBkb3VibGUgKnNyYywgZG91YmxlIG11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKK3ZvaWQgZmZfdmVjdG9yX2RtYWNfc2NhbGFyX2ZtYTMoZG91YmxlICpkc3QsIGNvbnN0IGRvdWJsZSAqc3JjLCBkb3VibGUgbXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKTsKKwogdm9pZCBmZl92ZWN0b3JfZG11bF9zY2FsYXJfc3NlMihkb3VibGUgKmRzdCwgY29uc3QgZG91YmxlICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtdWwsIGludCBsZW4pOwogdm9pZCBmZl92ZWN0b3JfZG11bF9zY2FsYXJfYXZ4KGRvdWJsZSAqZHN0LCBjb25zdCBkb3VibGUgKnNyYywKQEAgLTYwLDEwICs2NywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMSwgaW50IGxlbik7CiB2b2lkIGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfYXZ4KGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMSwgaW50IGxlbik7Cit2b2lkIGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfYXZ4MihmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMxLCBpbnQgbGVuKTsKIAogZmxvYXQgZmZfc2NhbGFycHJvZHVjdF9mbG9hdF9zc2UoY29uc3QgZmxvYXQgKnYxLCBjb25zdCBmbG9hdCAqdjIsIGludCBvcmRlcik7CiAKLXZvaWQgZmZfYnV0dGVyZmxpZXNfZmxvYXRfc3NlKGZsb2F0ICpzcmMwLCBmbG9hdCAqc3JjMSwgaW50IGxlbik7Cit2b2lkIGZmX2J1dHRlcmZsaWVzX2Zsb2F0X3NzZShmbG9hdCAqYXZfcmVzdHJpY3Qgc3JjMCwgZmxvYXQgKmF2X3Jlc3RyaWN0IHNyYzEsIGludCBsZW4pOwogCiBhdl9jb2xkIHZvaWQgZmZfZmxvYXRfZHNwX2luaXRfeDg2KEFWRmxvYXREU1BDb250ZXh0ICpmZHNwKQogewpAQCAtODMsMTcgKzkyLDIzIEBACiAgICAgICAgIGZkc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0ICAgPSBmZl9idXR0ZXJmbGllc19mbG9hdF9zc2U7CiAgICAgfQogICAgIGlmIChFWFRFUk5BTF9TU0UyKGNwdV9mbGFncykpIHsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2RtYWNfc2NhbGFyID0gZmZfdmVjdG9yX2RtYWNfc2NhbGFyX3NzZTI7CiAgICAgICAgIGZkc3AtPnZlY3Rvcl9kbXVsX3NjYWxhciA9IGZmX3ZlY3Rvcl9kbXVsX3NjYWxhcl9zc2UyOwogICAgIH0KICAgICBpZiAoRVhURVJOQUxfQVZYX0ZBU1QoY3B1X2ZsYWdzKSkgewogICAgICAgICBmZHNwLT52ZWN0b3JfZm11bCA9IGZmX3ZlY3Rvcl9mbXVsX2F2eDsKICAgICAgICAgZmRzcC0+dmVjdG9yX2ZtYWNfc2NhbGFyID0gZmZfdmVjdG9yX2ZtYWNfc2NhbGFyX2F2eDsKICAgICAgICAgZmRzcC0+dmVjdG9yX2RtdWxfc2NhbGFyID0gZmZfdmVjdG9yX2RtdWxfc2NhbGFyX2F2eDsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2RtYWNfc2NhbGFyID0gZmZfdmVjdG9yX2RtYWNfc2NhbGFyX2F2eDsKICAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfYWRkICAgID0gZmZfdmVjdG9yX2ZtdWxfYWRkX2F2eDsKICAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZSA9IGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfYXZ4OwogICAgIH0KKyAgICBpZiAoRVhURVJOQUxfQVZYMl9GQVNUKGNwdV9mbGFncykpIHsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZSA9IGZmX3ZlY3Rvcl9mbXVsX3JldmVyc2VfYXZ4MjsKKyAgICB9CiAgICAgaWYgKEVYVEVSTkFMX0ZNQTNfRkFTVChjcHVfZmxhZ3MpKSB7CiAgICAgICAgIGZkc3AtPnZlY3Rvcl9mbWFjX3NjYWxhciA9IGZmX3ZlY3Rvcl9mbWFjX3NjYWxhcl9mbWEzOwogICAgICAgICBmZHNwLT52ZWN0b3JfZm11bF9hZGQgICAgPSBmZl92ZWN0b3JfZm11bF9hZGRfZm1hMzsKKyAgICAgICAgZmRzcC0+dmVjdG9yX2RtYWNfc2NhbGFyID0gZmZfdmVjdG9yX2RtYWNfc2NhbGFyX2ZtYTM7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3g4Ni9pbWd1dGlscy5hc20gYi9saWJhdnV0aWwveDg2L2ltZ3V0aWxzLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2NhNTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZ1dGlsL3g4Ni9pbWd1dGlscy5hc20KQEAgLTAsMCArMSw1MyBAQAorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCis7KiBDb3B5cmlnaHQgMjAxNiBBbnRvbiBLaGlybm92Cis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTiAudGV4dAorCitJTklUX1hNTSBzc2U0CitjZ2xvYmFsIGltYWdlX2NvcHlfcGxhbmVfdWNfZnJvbSwgNiwgNywgNCwgZHN0LCBkc3RfbGluZXNpemUsIHNyYywgc3JjX2xpbmVzaXplLCBidywgaGVpZ2h0LCByb3dwb3MKKyAgICBhZGQgZHN0cSwgYndxCisgICAgYWRkIHNyY3EsIGJ3cQorICAgIG5lZyBid3EKKworLnJvd19zdGFydDoKKyAgICBtb3Ygcm93cG9zcSwgYndxCisKKy5sb29wOgorICAgIG1vdm50ZHFhIG0wLCBbc3JjcSArIHJvd3Bvc3EgKyAwICogbW1zaXplXQorICAgIG1vdm50ZHFhIG0xLCBbc3JjcSArIHJvd3Bvc3EgKyAxICogbW1zaXplXQorICAgIG1vdm50ZHFhIG0yLCBbc3JjcSArIHJvd3Bvc3EgKyAyICogbW1zaXplXQorICAgIG1vdm50ZHFhIG0zLCBbc3JjcSArIHJvd3Bvc3EgKyAzICogbW1zaXplXQorCisgICAgbW92YSBbZHN0cSArIHJvd3Bvc3EgKyAwICogbW1zaXplXSwgbTAKKyAgICBtb3ZhIFtkc3RxICsgcm93cG9zcSArIDEgKiBtbXNpemVdLCBtMQorICAgIG1vdmEgW2RzdHEgKyByb3dwb3NxICsgMiAqIG1tc2l6ZV0sIG0yCisgICAgbW92YSBbZHN0cSArIHJvd3Bvc3EgKyAzICogbW1zaXplXSwgbTMKKworICAgIGFkZCByb3dwb3NxLCA0ICogbW1zaXplCisgICAgam56IC5sb29wCisKKyAgICBhZGQgc3JjcSwgc3JjX2xpbmVzaXplcQorICAgIGFkZCBkc3RxLCBkc3RfbGluZXNpemVxCisgICAgZGVjIGhlaWdodGQKKyAgICBqbnogLnJvd19zdGFydAorCisgICAgUkVUCmRpZmYgLS1naXQgYS9saWJhdnV0aWwveDg2L2ltZ3V0aWxzX2luaXQuYyBiL2xpYmF2dXRpbC94ODYvaW1ndXRpbHNfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTM5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJhdnV0aWwveDg2L2ltZ3V0aWxzX2luaXQuYwpAQCAtMCwwICsxLDQ5IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZXJyb3IuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHNfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImNwdS5oIgorCit2b2lkIGZmX2ltYWdlX2NvcHlfcGxhbmVfdWNfZnJvbV9zc2U0KHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IGRzdF9saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3QgYnl0ZXdpZHRoLCBpbnQgaGVpZ2h0KTsKKworaW50IGZmX2ltYWdlX2NvcHlfcGxhbmVfdWNfZnJvbV94ODYodWludDhfdCAgICAgICAqZHN0LCBwdHJkaWZmX3QgZHN0X2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3JjX2xpbmVzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGJ5dGV3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIHB0cmRpZmZfdCBid19hbGlnbmVkID0gRkZBTElHTihieXRld2lkdGgsIDY0KTsKKworICAgIGlmIChFWFRFUk5BTF9TU0U0KGNwdV9mbGFncykgJiYKKyAgICAgICAgYndfYWxpZ25lZCA8PSBkc3RfbGluZXNpemUgJiYgYndfYWxpZ25lZCA8PSBzcmNfbGluZXNpemUpCisgICAgICAgIGZmX2ltYWdlX2NvcHlfcGxhbmVfdWNfZnJvbV9zc2U0KGRzdCwgZHN0X2xpbmVzaXplLCBzcmMsIHNyY19saW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYndfYWxpZ25lZCwgaGVpZ2h0KTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT1NZUyk7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC94ODYvaW50bWF0aC5oIGIvbGliYXZ1dGlsL3g4Ni9pbnRtYXRoLmgKaW5kZXggZjU4YjBkMC4uNDA3NDNmZCAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3g4Ni9pbnRtYXRoLmgKKysrIGIvbGliYXZ1dGlsL3g4Ni9pbnRtYXRoLmgKQEAgLTQ3LDYgKzQ3LDggQEAKICMgICBlbmRpZgogIyAgIGRlZmluZSBmZl9sb2cyXzE2Yml0IGF2X2xvZzIKIAorI2lmIGRlZmluZWQoX19JTlRFTF9DT01QSUxFUikgfHwgKGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxNzAwKSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlZmluZWQoX19CTUlfXykgfHwgIWRlZmluZWQoX19jbGFuZ19fKSkpCiAjICAgZGVmaW5lIGZmX2N0eih2KSBfdHpjbnRfdTMyKHYpCiAKICMgICBpZiBBUkNIX1g4Nl82NApAQCAtNTgsNiArNjAsNyBAQAogICAgIHJldHVybiAoKHVpbnQzMl90KXYgPT0gMCkgPyBfdHpjbnRfdTMyKCh1aW50MzJfdCkodiA+PiAzMikpICsgMzIgOiBfdHpjbnRfdTMyKCh1aW50MzJfdCl2KTsKIH0KICMgICBlbmRpZgorI2VuZGlmIC8qIF9NU0NfVkVSICovCiAKICNlbmRpZiAvKiBfX0lOVEVMX0NPTVBJTEVSICovCiAKZGlmZiAtLWdpdCBhL2xpYmF2dXRpbC94ODYveDg2aW5jLmFzbSBiL2xpYmF2dXRpbC94ODYveDg2aW5jLmFzbQppbmRleCAzYTBhMjYxLi41MDQ0ZWU4IDEwMDY0NAotLS0gYS9saWJhdnV0aWwveDg2L3g4NmluYy5hc20KKysrIGIvbGliYXZ1dGlsL3g4Ni94ODZpbmMuYXNtCkBAIC0xLDEyICsxLDEyIEBACiA7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIDsqIHg4NmluYy5hc206IHgyNjRhc20gYWJzdHJhY3Rpb24gbGF5ZXIKIDsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotOyogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTYgeDI2NCBwcm9qZWN0Cis7KiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxOCB4MjY0IHByb2plY3QKIDsqCiA7KiBBdXRob3JzOiBMb3JlbiBNZXJyaXR0IDxsb3Jlbm1AdS53YXNoaW5ndG9uLmVkdT4KKzsqICAgICAgICAgIEhlbnJpayBHcmFtbmVyIDxoZW5yaWtAZ3JhbW5lci5jb20+CiA7KiAgICAgICAgICBBbnRvbiBNaXRyb2Zhbm92IDxCdWdNYXN0ZXJAbmFyb2QucnU+CiA7KiAgICAgICAgICBGaW9uYSBHbGFzZXIgPGZpb25hQHgyNjQuY29tPgotOyogICAgICAgICAgSGVucmlrIEdyYW1uZXIgPGhlbnJpa0BncmFtbmVyLmNvbT4KIDsqCiA7KiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKIDsqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKQEAgLTg3LDcgKzg3LDEzIEBACiA7IGtlZXAgc3VwcG9ydGluZyBPUy8yLgogJW1hY3JvIFNFQ1RJT05fUk9EQVRBIDAtMSAxNgogICAgICVpZmlkbiBfX09VVFBVVF9GT1JNQVRfXyxhb3V0Ci0gICAgICAgIHNlY3Rpb24gLnRleHQKKyAgICAgICAgU0VDVElPTiAudGV4dAorICAgICVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLGNvZmYKKyAgICAgICAgU0VDVElPTiAudGV4dAorICAgICVlbGlmaWRuIF9fT1VUUFVUX0ZPUk1BVF9fLHdpbjMyCisgICAgICAgIFNFQ1RJT04gLnJkYXRhIGFsaWduPSUxCisgICAgJWVsaWYgV0lONjQKKyAgICAgICAgU0VDVElPTiAucmRhdGEgYWxpZ249JTEKICAgICAlZWxzZQogICAgICAgICBTRUNUSU9OIC5yb2RhdGEgYWxpZ249JTEKICAgICAlZW5kaWYKQEAgLTMzNSw2ICszNDEsOCBAQAogJWVuZG1hY3JvCiAKICVkZWZpbmUgcmVxdWlyZWRfc3RhY2tfYWxpZ25tZW50ICgobW1zaXplICsgMTUpICYgfjE1KQorJWRlZmluZSB2emVyb3VwcGVyX3JlcXVpcmVkIChtbXNpemUgPiAxNiAmJiAoQVJDSF9YODZfNjQgPT0gMCB8fCB4bW1fcmVnc191c2VkID4gMTYgfHwgbm90Y3B1ZmxhZyhhdng1MTIpKSkKKyVkZWZpbmUgaGlnaF9tbV9yZWdzICgxNipjcHVmbGFnKGF2eDUxMikpCiAKICVtYWNybyBBTExPQ19TVEFDSyAxLTIgMCA7IHN0YWNrX3NpemUsIG5feG1tX3JlZ3MgKGZvciB3aW42NCBvbmx5KQogICAgICVpZm51bSAlMQpAQCAtMzg1LDcgKzM5MywxNCBAQAogICAgICVpZm51bSAlMQogICAgICAgICAlaWYgJTEgIT0gMCAmJiByZXF1aXJlZF9zdGFja19hbGlnbm1lbnQgPiBTVEFDS19BTElHTk1FTlQKICAgICAgICAgICAgICVpZiAlMSA+IDAKKyAgICAgICAgICAgICAgICA7IFJlc2VydmUgYW4gYWRkaXRpb25hbCByZWdpc3RlciBmb3Igc3RvcmluZyB0aGUgb3JpZ2luYWwgc3RhY2sgcG9pbnRlciwgYnV0IGF2b2lkIHVzaW5nCisgICAgICAgICAgICAgICAgOyBlYXgvcmF4IGZvciB0aGlzIHB1cnBvc2Ugc2luY2UgaXQgY2FuIHBvdGVudGlhbGx5IGdldCBvdmVyd3JpdHRlbiBhcyBhIHJldHVybiB2YWx1ZS4KICAgICAgICAgICAgICAgICAlYXNzaWduIHJlZ3NfdXNlZCAocmVnc191c2VkICsgMSkKKyAgICAgICAgICAgICAgICAlaWYgQVJDSF9YODZfNjQgJiYgcmVnc191c2VkID09IDcKKyAgICAgICAgICAgICAgICAgICAgJWFzc2lnbiByZWdzX3VzZWQgOAorICAgICAgICAgICAgICAgICVlbGlmIEFSQ0hfWDg2XzY0ID09IDAgJiYgcmVnc191c2VkID09IDEKKyAgICAgICAgICAgICAgICAgICAgJWFzc2lnbiByZWdzX3VzZWQgMgorICAgICAgICAgICAgICAgICVlbmRpZgogICAgICAgICAgICAgJWVuZGlmCiAgICAgICAgICAgICAlaWYgQVJDSF9YODZfNjQgJiYgcmVnc191c2VkIDwgNSArIFVOSVg2NCAqIDMKICAgICAgICAgICAgICAgICA7IEVuc3VyZSB0aGF0IHdlIGRvbid0IGNsb2JiZXIgYW55IHJlZ2lzdGVycyBjb250YWluaW5nIGFyZ3VtZW50cy4gRm9yIFVOSVg2NCB3ZSBhbHNvIHByZXNlcnZlIHI2IChyYXgpCkBAIC00MTksMTAgKzQzNCwxMCBAQAogREVDTEFSRV9SRUcgOCwgIHJzaSwgNzIKIERFQ0xBUkVfUkVHIDksICByYngsIDgwCiBERUNMQVJFX1JFRyAxMCwgcmJwLCA4OAotREVDTEFSRV9SRUcgMTEsIFIxMiwgOTYKLURFQ0xBUkVfUkVHIDEyLCBSMTMsIDEwNAotREVDTEFSRV9SRUcgMTMsIFIxNCwgMTEyCi1ERUNMQVJFX1JFRyAxNCwgUjE1LCAxMjAKK0RFQ0xBUkVfUkVHIDExLCBSMTQsIDk2CitERUNMQVJFX1JFRyAxMiwgUjE1LCAxMDQKK0RFQ0xBUkVfUkVHIDEzLCBSMTIsIDExMgorREVDTEFSRV9SRUcgMTQsIFIxMywgMTIwCiAKICVtYWNybyBQUk9MT0dVRSAyLTUrIDAgOyAjYXJncywgI3JlZ3MsICN4bW1fcmVncywgW3N0YWNrX3NpemUsXSBhcmdfbmFtZXMuLi4KICAgICAlYXNzaWduIG51bV9hcmdzICUxCkBAIC00NDEsMTUgKzQ1NiwxNiBAQAogCiAlbWFjcm8gV0lONjRfUFVTSF9YTU0gMAogICAgIDsgVXNlIHRoZSBzaGFkb3cgc3BhY2UgdG8gc3RvcmUgWE1NNiBhbmQgWE1NNywgdGhlIHJlc3QgbmVlZHMgc3RhY2sgc3BhY2UgYWxsb2NhdGVkLgotICAgICVpZiB4bW1fcmVnc191c2VkID4gNgorICAgICVpZiB4bW1fcmVnc191c2VkID4gNiArIGhpZ2hfbW1fcmVncwogICAgICAgICBtb3ZhcHMgW3JzdGsgKyBzdGFja19vZmZzZXQgKyAgOF0sIHhtbTYKICAgICAlZW5kaWYKLSAgICAlaWYgeG1tX3JlZ3NfdXNlZCA+IDcKKyAgICAlaWYgeG1tX3JlZ3NfdXNlZCA+IDcgKyBoaWdoX21tX3JlZ3MKICAgICAgICAgbW92YXBzIFtyc3RrICsgc3RhY2tfb2Zmc2V0ICsgMjRdLCB4bW03CiAgICAgJWVuZGlmCi0gICAgJWlmIHhtbV9yZWdzX3VzZWQgPiA4CisgICAgJWFzc2lnbiAlJXhtbV9yZWdzX29uX3N0YWNrIHhtbV9yZWdzX3VzZWQgLSBoaWdoX21tX3JlZ3MgLSA4CisgICAgJWlmICUleG1tX3JlZ3Nfb25fc3RhY2sgPiAwCiAgICAgICAgICVhc3NpZ24gJSVpIDgKLSAgICAgICAgJXJlcCB4bW1fcmVnc191c2VkLTgKKyAgICAgICAgJXJlcCAlJXhtbV9yZWdzX29uX3N0YWNrCiAgICAgICAgICAgICBtb3ZhcHMgW3JzcCArICglJWktOCkqMTYgKyBzdGFja19zaXplICsgMzJdLCB4bW0gJSsgJSVpCiAgICAgICAgICAgICAlYXNzaWduICUlaSAlJWkrMQogICAgICAgICAlZW5kcmVwCkBAIC00NTgsNTMgKzQ3NCw1NiBAQAogCiAlbWFjcm8gV0lONjRfU1BJTExfWE1NIDEKICAgICAlYXNzaWduIHhtbV9yZWdzX3VzZWQgJTEKLSAgICBBU1NFUlQgeG1tX3JlZ3NfdXNlZCA8PSAxNgotICAgICVpZiB4bW1fcmVnc191c2VkID4gOAorICAgIEFTU0VSVCB4bW1fcmVnc191c2VkIDw9IDE2ICsgaGlnaF9tbV9yZWdzCisgICAgJWFzc2lnbiAlJXhtbV9yZWdzX29uX3N0YWNrIHhtbV9yZWdzX3VzZWQgLSBoaWdoX21tX3JlZ3MgLSA4CisgICAgJWlmICUleG1tX3JlZ3Nfb25fc3RhY2sgPiAwCiAgICAgICAgIDsgQWxsb2NhdGUgc3RhY2sgc3BhY2UgZm9yIGNhbGxlZS1zYXZlZCB4bW0gcmVnaXN0ZXJzIHBsdXMgc2hhZG93IHNwYWNlIGFuZCBhbGlnbiB0aGUgc3RhY2suCi0gICAgICAgICVhc3NpZ24gJSVwYWQgKHhtbV9yZWdzX3VzZWQtOCkqMTYgKyAzMgorICAgICAgICAlYXNzaWduICUlcGFkICUleG1tX3JlZ3Nfb25fc3RhY2sqMTYgKyAzMgogICAgICAgICAlYXNzaWduIHN0YWNrX3NpemVfcGFkZGVkICUlcGFkICsgKCgtJSVwYWQtc3RhY2tfb2Zmc2V0LWdwcnNpemUpICYgKFNUQUNLX0FMSUdOTUVOVC0xKSkKICAgICAgICAgU1VCIHJzcCwgc3RhY2tfc2l6ZV9wYWRkZWQKICAgICAlZW5kaWYKICAgICBXSU42NF9QVVNIX1hNTQogJWVuZG1hY3JvCiAKLSVtYWNybyBXSU42NF9SRVNUT1JFX1hNTV9JTlRFUk5BTCAxCislbWFjcm8gV0lONjRfUkVTVE9SRV9YTU1fSU5URVJOQUwgMAogICAgICVhc3NpZ24gJSVwYWRfc2l6ZSAwCi0gICAgJWlmIHhtbV9yZWdzX3VzZWQgPiA4Ci0gICAgICAgICVhc3NpZ24gJSVpIHhtbV9yZWdzX3VzZWQKLSAgICAgICAgJXJlcCB4bW1fcmVnc191c2VkLTgKKyAgICAlYXNzaWduICUleG1tX3JlZ3Nfb25fc3RhY2sgeG1tX3JlZ3NfdXNlZCAtIGhpZ2hfbW1fcmVncyAtIDgKKyAgICAlaWYgJSV4bW1fcmVnc19vbl9zdGFjayA+IDAKKyAgICAgICAgJWFzc2lnbiAlJWkgeG1tX3JlZ3NfdXNlZCAtIGhpZ2hfbW1fcmVncworICAgICAgICAlcmVwICUleG1tX3JlZ3Nfb25fc3RhY2sKICAgICAgICAgICAgICVhc3NpZ24gJSVpICUlaS0xCi0gICAgICAgICAgICBtb3ZhcHMgeG1tICUrICUlaSwgWyUxICsgKCUlaS04KSoxNiArIHN0YWNrX3NpemUgKyAzMl0KKyAgICAgICAgICAgIG1vdmFwcyB4bW0gJSsgJSVpLCBbcnNwICsgKCUlaS04KSoxNiArIHN0YWNrX3NpemUgKyAzMl0KICAgICAgICAgJWVuZHJlcAogICAgICVlbmRpZgogICAgICVpZiBzdGFja19zaXplX3BhZGRlZCA+IDAKICAgICAgICAgJWlmIHN0YWNrX3NpemUgPiAwICYmIHJlcXVpcmVkX3N0YWNrX2FsaWdubWVudCA+IFNUQUNLX0FMSUdOTUVOVAogICAgICAgICAgICAgbW92IHJzcCwgcnN0a20KICAgICAgICAgJWVsc2UKLSAgICAgICAgICAgIGFkZCAlMSwgc3RhY2tfc2l6ZV9wYWRkZWQKKyAgICAgICAgICAgIGFkZCByc3AsIHN0YWNrX3NpemVfcGFkZGVkCiAgICAgICAgICAgICAlYXNzaWduICUlcGFkX3NpemUgc3RhY2tfc2l6ZV9wYWRkZWQKICAgICAgICAgJWVuZGlmCiAgICAgJWVuZGlmCi0gICAgJWlmIHhtbV9yZWdzX3VzZWQgPiA3Ci0gICAgICAgIG1vdmFwcyB4bW03LCBbJTEgKyBzdGFja19vZmZzZXQgLSAlJXBhZF9zaXplICsgMjRdCisgICAgJWlmIHhtbV9yZWdzX3VzZWQgPiA3ICsgaGlnaF9tbV9yZWdzCisgICAgICAgIG1vdmFwcyB4bW03LCBbcnNwICsgc3RhY2tfb2Zmc2V0IC0gJSVwYWRfc2l6ZSArIDI0XQogICAgICVlbmRpZgotICAgICVpZiB4bW1fcmVnc191c2VkID4gNgotICAgICAgICBtb3ZhcHMgeG1tNiwgWyUxICsgc3RhY2tfb2Zmc2V0IC0gJSVwYWRfc2l6ZSArICA4XQorICAgICVpZiB4bW1fcmVnc191c2VkID4gNiArIGhpZ2hfbW1fcmVncworICAgICAgICBtb3ZhcHMgeG1tNiwgW3JzcCArIHN0YWNrX29mZnNldCAtICUlcGFkX3NpemUgKyAgOF0KICAgICAlZW5kaWYKICVlbmRtYWNybwogCi0lbWFjcm8gV0lONjRfUkVTVE9SRV9YTU0gMQotICAgIFdJTjY0X1JFU1RPUkVfWE1NX0lOVEVSTkFMICUxCislbWFjcm8gV0lONjRfUkVTVE9SRV9YTU0gMAorICAgIFdJTjY0X1JFU1RPUkVfWE1NX0lOVEVSTkFMCiAgICAgJWFzc2lnbiBzdGFja19vZmZzZXQgKHN0YWNrX29mZnNldC1zdGFja19zaXplX3BhZGRlZCkKKyAgICAlYXNzaWduIHN0YWNrX3NpemVfcGFkZGVkIDAKICAgICAlYXNzaWduIHhtbV9yZWdzX3VzZWQgMAogJWVuZG1hY3JvCiAKLSVkZWZpbmUgaGFzX2VwaWxvZ3VlIHJlZ3NfdXNlZCA+IDcgfHwgeG1tX3JlZ3NfdXNlZCA+IDYgfHwgbW1zaXplID09IDMyIHx8IHN0YWNrX3NpemUgPiAwCislZGVmaW5lIGhhc19lcGlsb2d1ZSByZWdzX3VzZWQgPiA3IHx8IHN0YWNrX3NpemUgPiAwIHx8IHZ6ZXJvdXBwZXJfcmVxdWlyZWQgfHwgeG1tX3JlZ3NfdXNlZCA+IDYraGlnaF9tbV9yZWdzCiAKICVtYWNybyBSRVQgMAotICAgIFdJTjY0X1JFU1RPUkVfWE1NX0lOVEVSTkFMIHJzcAorICAgIFdJTjY0X1JFU1RPUkVfWE1NX0lOVEVSTkFMCiAgICAgUE9QX0lGX1VTRUQgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3Ci0gICAgJWlmIG1tc2l6ZSA9PSAzMgorICAgICVpZiB2emVyb3VwcGVyX3JlcXVpcmVkCiAgICAgICAgIHZ6ZXJvdXBwZXIKICAgICAlZW5kaWYKICAgICBBVVRPX1JFUF9SRVQKQEAgLTUyMywxNCArNTQyLDE1IEBACiBERUNMQVJFX1JFRyA4LCAgUjExLCAyNAogREVDTEFSRV9SRUcgOSwgIHJieCwgMzIKIERFQ0xBUkVfUkVHIDEwLCByYnAsIDQwCi1ERUNMQVJFX1JFRyAxMSwgUjEyLCA0OAotREVDTEFSRV9SRUcgMTIsIFIxMywgNTYKLURFQ0xBUkVfUkVHIDEzLCBSMTQsIDY0Ci1ERUNMQVJFX1JFRyAxNCwgUjE1LCA3MgorREVDTEFSRV9SRUcgMTEsIFIxNCwgNDgKK0RFQ0xBUkVfUkVHIDEyLCBSMTUsIDU2CitERUNMQVJFX1JFRyAxMywgUjEyLCA2NAorREVDTEFSRV9SRUcgMTQsIFIxMywgNzIKIAotJW1hY3JvIFBST0xPR1VFIDItNSsgOyAjYXJncywgI3JlZ3MsICN4bW1fcmVncywgW3N0YWNrX3NpemUsXSBhcmdfbmFtZXMuLi4KKyVtYWNybyBQUk9MT0dVRSAyLTUrIDAgOyAjYXJncywgI3JlZ3MsICN4bW1fcmVncywgW3N0YWNrX3NpemUsXSBhcmdfbmFtZXMuLi4KICAgICAlYXNzaWduIG51bV9hcmdzICUxCiAgICAgJWFzc2lnbiByZWdzX3VzZWQgJTIKKyAgICAlYXNzaWduIHhtbV9yZWdzX3VzZWQgJTMKICAgICBBU1NFUlQgcmVnc191c2VkID49IG51bV9hcmdzCiAgICAgU0VUVVBfU1RBQ0tfUE9JTlRFUiAlNAogICAgIEFTU0VSVCByZWdzX3VzZWQgPD0gMTUKQEAgLTU0MCw3ICs1NjAsNyBAQAogICAgIERFRklORV9BUkdTX0lOVEVSTkFMICUwLCAlNCwgJTUKICVlbmRtYWNybwogCi0lZGVmaW5lIGhhc19lcGlsb2d1ZSByZWdzX3VzZWQgPiA5IHx8IG1tc2l6ZSA9PSAzMiB8fCBzdGFja19zaXplID4gMAorJWRlZmluZSBoYXNfZXBpbG9ndWUgcmVnc191c2VkID4gOSB8fCBzdGFja19zaXplID4gMCB8fCB2emVyb3VwcGVyX3JlcXVpcmVkCiAKICVtYWNybyBSRVQgMAogICAgICVpZiBzdGFja19zaXplX3BhZGRlZCA+IDAKQEAgLTU1MSw3ICs1NzEsNyBAQAogICAgICAgICAlZW5kaWYKICAgICAlZW5kaWYKICAgICBQT1BfSUZfVVNFRCAxNCwgMTMsIDEyLCAxMSwgMTAsIDkKLSAgICAlaWYgbW1zaXplID09IDMyCisgICAgJWlmIHZ6ZXJvdXBwZXJfcmVxdWlyZWQKICAgICAgICAgdnplcm91cHBlcgogICAgICVlbmRpZgogICAgIEFVVE9fUkVQX1JFVApAQCAtNTk2LDcgKzYxNiw3IEBACiAgICAgREVGSU5FX0FSR1NfSU5URVJOQUwgJTAsICU0LCAlNQogJWVuZG1hY3JvCiAKLSVkZWZpbmUgaGFzX2VwaWxvZ3VlIHJlZ3NfdXNlZCA+IDMgfHwgbW1zaXplID09IDMyIHx8IHN0YWNrX3NpemUgPiAwCislZGVmaW5lIGhhc19lcGlsb2d1ZSByZWdzX3VzZWQgPiAzIHx8IHN0YWNrX3NpemUgPiAwIHx8IHZ6ZXJvdXBwZXJfcmVxdWlyZWQKIAogJW1hY3JvIFJFVCAwCiAgICAgJWlmIHN0YWNrX3NpemVfcGFkZGVkID4gMApAQCAtNjA3LDcgKzYyNyw3IEBACiAgICAgICAgICVlbmRpZgogICAgICVlbmRpZgogICAgIFBPUF9JRl9VU0VEIDYsIDUsIDQsIDMKLSAgICAlaWYgbW1zaXplID09IDMyCisgICAgJWlmIHZ6ZXJvdXBwZXJfcmVxdWlyZWQKICAgICAgICAgdnplcm91cHBlcgogICAgICVlbmRpZgogICAgIEFVVE9fUkVQX1JFVApAQCAtNjE4LDcgKzYzOCw3IEBACiAlaWYgV0lONjQgPT0gMAogICAgICVtYWNybyBXSU42NF9TUElMTF9YTU0gMQogICAgICVlbmRtYWNybwotICAgICVtYWNybyBXSU42NF9SRVNUT1JFX1hNTSAxCisgICAgJW1hY3JvIFdJTjY0X1JFU1RPUkVfWE1NIDAKICAgICAlZW5kbWFjcm8KICAgICAlbWFjcm8gV0lONjRfUFVTSF9YTU0gMAogICAgICVlbmRtYWNybwpAQCAtNjI5LDcgKzY0OSw3IEBACiA7IFdlIGNhbiBhdXRvbWF0aWNhbGx5IGRldGVjdCAiZm9sbG93cyBhIGJyYW5jaCIsIGJ1dCBub3QgYSBicmFuY2ggdGFyZ2V0LgogOyAoU1NTRTMgaXMgYSBzdWZmaWNpZW50IGNvbmRpdGlvbiB0byBrbm93IHRoYXQgeW91ciBjcHUgZG9lc24ndCBoYXZlIHRoaXMgcHJvYmxlbS4pCiAlbWFjcm8gUkVQX1JFVCAwCi0gICAgJWlmIGhhc19lcGlsb2d1ZQorICAgICVpZiBoYXNfZXBpbG9ndWUgfHwgY3B1ZmxhZyhzc3NlMykKICAgICAgICAgUkVUCiAgICAgJWVsc2UKICAgICAgICAgcmVwIHJldApAQCAtNzE3LDEyICs3MzcsMjIgQEAKICAgICAlYXNzaWduIHN0YWNrX29mZnNldCAwICAgICAgOyBzdGFjayBwb2ludGVyIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgcmV0dXJuIGFkZHJlc3MKICAgICAlYXNzaWduIHN0YWNrX3NpemUgMCAgICAgICAgOyBhbW91bnQgb2Ygc3RhY2sgc3BhY2UgdGhhdCBjYW4gYmUgZnJlZWx5IHVzZWQgaW5zaWRlIGEgZnVuY3Rpb24KICAgICAlYXNzaWduIHN0YWNrX3NpemVfcGFkZGVkIDAgOyB0b3RhbCBhbW91bnQgb2YgYWxsb2NhdGVkIHN0YWNrIHNwYWNlLCBpbmNsdWRpbmcgc3BhY2UgZm9yIGNhbGxlZS1zYXZlZCB4bW0gcmVnaXN0ZXJzIG9uIFdJTjY0IGFuZCBhbGlnbm1lbnQgcGFkZGluZwotICAgICVhc3NpZ24geG1tX3JlZ3NfdXNlZCAwICAgICA7IG51bWJlciBvZiBYTU0gcmVnaXN0ZXJzIHJlcXVlc3RlZCwgdXNlZCBmb3IgZGVhbGluZyB3aXRoIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgb24gV0lONjQKKyAgICAlYXNzaWduIHhtbV9yZWdzX3VzZWQgMCAgICAgOyBudW1iZXIgb2YgWE1NIHJlZ2lzdGVycyByZXF1ZXN0ZWQsIHVzZWQgZm9yIGRlYWxpbmcgd2l0aCBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIG9uIFdJTjY0IGFuZCB2emVyb3VwcGVyCiAgICAgJWlmbmlkbiAlMywgIiIKICAgICAgICAgUFJPTE9HVUUgJTMKICAgICAlZW5kaWYKICVlbmRtYWNybwogCis7IENyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgZnJvbSBhIGxvY2FsIGxhYmVsIHdpdGggdGhlIGNvcnJlY3QgbmFtZSBtYW5nbGluZyBhbmQgdHlwZQorJW1hY3JvIGNnbG9iYWxfbGFiZWwgMQorICAgICVpZiBGT1JNQVRfRUxGCisgICAgICAgIGdsb2JhbCBjdXJyZW50X2Z1bmN0aW9uICUrICUxOmZ1bmN0aW9uIGhpZGRlbgorICAgICVlbHNlCisgICAgICAgIGdsb2JhbCBjdXJyZW50X2Z1bmN0aW9uICUrICUxCisgICAgJWVuZGlmCisgICAgJTE6CislZW5kbWFjcm8KKwogJW1hY3JvIGNleHRlcm4gMQogICAgICV4ZGVmaW5lICUxIG1hbmdsZShwcml2YXRlX3ByZWZpeCAlKyBfICUrICUxKQogICAgIENBVF9YREVGSU5FIGNnbG9iYWxlZF8sICUxLCAxCkBAIC03ODAsMjUgKzgxMCwyNSBAQAogJWFzc2lnbiBjcHVmbGFnc19zc2UgICAgICAoMTw8NCkgfCBjcHVmbGFnc19tbXgyCiAlYXNzaWduIGNwdWZsYWdzX3NzZTIgICAgICgxPDw1KSB8IGNwdWZsYWdzX3NzZQogJWFzc2lnbiBjcHVmbGFnc19zc2Uyc2xvdyAoMTw8NikgfCBjcHVmbGFnc19zc2UyCi0lYXNzaWduIGNwdWZsYWdzX3NzZTMgICAgICgxPDw3KSB8IGNwdWZsYWdzX3NzZTIKLSVhc3NpZ24gY3B1ZmxhZ3Nfc3NzZTMgICAgKDE8PDgpIHwgY3B1ZmxhZ3Nfc3NlMwotJWFzc2lnbiBjcHVmbGFnc19zc2U0ICAgICAoMTw8OSkgfCBjcHVmbGFnc19zc3NlMwotJWFzc2lnbiBjcHVmbGFnc19zc2U0MiAgICAoMTw8MTApfCBjcHVmbGFnc19zc2U0Ci0lYXNzaWduIGNwdWZsYWdzX2F2eCAgICAgICgxPDwxMSl8IGNwdWZsYWdzX3NzZTQyCi0lYXNzaWduIGNwdWZsYWdzX3hvcCAgICAgICgxPDwxMil8IGNwdWZsYWdzX2F2eAotJWFzc2lnbiBjcHVmbGFnc19mbWE0ICAgICAoMTw8MTMpfCBjcHVmbGFnc19hdngKLSVhc3NpZ24gY3B1ZmxhZ3NfZm1hMyAgICAgKDE8PDE0KXwgY3B1ZmxhZ3NfYXZ4Ci0lYXNzaWduIGNwdWZsYWdzX2F2eDIgICAgICgxPDwxNSl8IGNwdWZsYWdzX2ZtYTMKKyVhc3NpZ24gY3B1ZmxhZ3NfbHpjbnQgICAgKDE8PDcpIHwgY3B1ZmxhZ3Nfc3NlMgorJWFzc2lnbiBjcHVmbGFnc19zc2UzICAgICAoMTw8OCkgfCBjcHVmbGFnc19zc2UyCislYXNzaWduIGNwdWZsYWdzX3Nzc2UzICAgICgxPDw5KSB8IGNwdWZsYWdzX3NzZTMKKyVhc3NpZ24gY3B1ZmxhZ3Nfc3NlNCAgICAgKDE8PDEwKXwgY3B1ZmxhZ3Nfc3NzZTMKKyVhc3NpZ24gY3B1ZmxhZ3Nfc3NlNDIgICAgKDE8PDExKXwgY3B1ZmxhZ3Nfc3NlNAorJWFzc2lnbiBjcHVmbGFnc19hZXNuaSAgICAoMTw8MTIpfCBjcHVmbGFnc19zc2U0MgorJWFzc2lnbiBjcHVmbGFnc19hdnggICAgICAoMTw8MTMpfCBjcHVmbGFnc19zc2U0MgorJWFzc2lnbiBjcHVmbGFnc194b3AgICAgICAoMTw8MTQpfCBjcHVmbGFnc19hdngKKyVhc3NpZ24gY3B1ZmxhZ3NfZm1hNCAgICAgKDE8PDE1KXwgY3B1ZmxhZ3NfYXZ4CislYXNzaWduIGNwdWZsYWdzX2ZtYTMgICAgICgxPDwxNil8IGNwdWZsYWdzX2F2eAorJWFzc2lnbiBjcHVmbGFnc19ibWkxICAgICAoMTw8MTcpfCBjcHVmbGFnc19hdnh8Y3B1ZmxhZ3NfbHpjbnQKKyVhc3NpZ24gY3B1ZmxhZ3NfYm1pMiAgICAgKDE8PDE4KXwgY3B1ZmxhZ3NfYm1pMQorJWFzc2lnbiBjcHVmbGFnc19hdngyICAgICAoMTw8MTkpfCBjcHVmbGFnc19mbWEzfGNwdWZsYWdzX2JtaTIKKyVhc3NpZ24gY3B1ZmxhZ3NfYXZ4NTEyICAgKDE8PDIwKXwgY3B1ZmxhZ3NfYXZ4MiA7IEYsIENELCBCVywgRFEsIFZMCiAKLSVhc3NpZ24gY3B1ZmxhZ3NfY2FjaGUzMiAgKDE8PDE2KQotJWFzc2lnbiBjcHVmbGFnc19jYWNoZTY0ICAoMTw8MTcpCi0lYXNzaWduIGNwdWZsYWdzX3Nsb3djdHogICgxPDwxOCkKLSVhc3NpZ24gY3B1ZmxhZ3NfbHpjbnQgICAgKDE8PDE5KQotJWFzc2lnbiBjcHVmbGFnc19hbGlnbmVkICAoMTw8MjApIDsgbm90IGEgY3B1IGZlYXR1cmUsIGJ1dCBhIGZ1bmN0aW9uIHZhcmlhbnQKLSVhc3NpZ24gY3B1ZmxhZ3NfYXRvbSAgICAgKDE8PDIxKQotJWFzc2lnbiBjcHVmbGFnc19ibWkxICAgICAoMTw8MjIpfGNwdWZsYWdzX2x6Y250Ci0lYXNzaWduIGNwdWZsYWdzX2JtaTIgICAgICgxPDwyMyl8Y3B1ZmxhZ3NfYm1pMQotJWFzc2lnbiBjcHVmbGFnc19hZXNuaSAgICAoMTw8MjQpfGNwdWZsYWdzX3NzZTQyCislYXNzaWduIGNwdWZsYWdzX2NhY2hlMzIgICgxPDwyMSkKKyVhc3NpZ24gY3B1ZmxhZ3NfY2FjaGU2NCAgKDE8PDIyKQorJWFzc2lnbiBjcHVmbGFnc19hbGlnbmVkICAoMTw8MjMpIDsgbm90IGEgY3B1IGZlYXR1cmUsIGJ1dCBhIGZ1bmN0aW9uIHZhcmlhbnQKKyVhc3NpZ24gY3B1ZmxhZ3NfYXRvbSAgICAgKDE8PDI0KQogCiA7IFJldHVybnMgYSBib29sZWFuIHZhbHVlIGV4cHJlc3Npbmcgd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBjcHVmbGFnIGlzIGVuYWJsZWQuCiAlZGVmaW5lICAgIGNwdWZsYWcoeCkgKCgoKChjcHVmbGFncyAmIChjcHVmbGFnc18gJSsgeCkpIF4gKGNwdWZsYWdzXyAlKyB4KSkgLSAxKSA+PiAzMSkgJiAxKQpAQCAtODQ2LDExICs4NzYsMTIgQEAKICAgICAlZW5kaWYKICVlbmRtYWNybwogCi07IE1lcmdlIG1teCBhbmQgc3NlKgorOyBNZXJnZSBtbXgsIHNzZSosIGFuZCBhdngqCiA7IG0jIGlzIGEgc2ltZCByZWdpc3RlciBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHNpemUKIDsgeG0jIGlzIHRoZSBjb3JyZXNwb25kaW5nIHhtbSByZWdpc3RlciBpZiBtbXNpemUgPj0gMTYsIG90aGVyd2lzZSB0aGUgc2FtZSBhcyBtIwogOyB5bSMgaXMgdGhlIGNvcnJlc3BvbmRpbmcgeW1tIHJlZ2lzdGVyIGlmIG1tc2l6ZSA+PSAzMiwgb3RoZXJ3aXNlIHRoZSBzYW1lIGFzIG0jCi07IChBbGwgMyByZW1haW4gaW4gc3luYyB0aHJvdWdoIFNXQVAuKQorOyB6bSMgaXMgdGhlIGNvcnJlc3BvbmRpbmcgem1tIHJlZ2lzdGVyIGlmIG1tc2l6ZSA+PSA2NCwgb3RoZXJ3aXNlIHRoZSBzYW1lIGFzIG0jCis7IChBbGwgNCByZW1haW4gaW4gc3luYyB0aHJvdWdoIFNXQVAuKQogCiAlbWFjcm8gQ0FUX1hERUZJTkUgMwogICAgICV4ZGVmaW5lICUxJTIgJTMKQEAgLTg2MCw2OSArODkxLDk5IEBACiAgICAgJXVuZGVmICUxJTIKICVlbmRtYWNybwogCislbWFjcm8gREVGSU5FX01NUkVHUyAxIDsgbW10eXBlCisgICAgJWFzc2lnbiAlJXByZXZfbW1yZWdzIDAKKyAgICAlaWZkZWYgbnVtX21tcmVncworICAgICAgICAlYXNzaWduICUlcHJldl9tbXJlZ3MgbnVtX21tcmVncworICAgICVlbmRpZgorCisgICAgJWFzc2lnbiBudW1fbW1yZWdzIDgKKyAgICAlaWYgQVJDSF9YODZfNjQgJiYgbW1zaXplID49IDE2CisgICAgICAgICVhc3NpZ24gbnVtX21tcmVncyAxNgorICAgICAgICAlaWYgY3B1ZmxhZyhhdng1MTIpIHx8IG1tc2l6ZSA9PSA2NAorICAgICAgICAgICAgJWFzc2lnbiBudW1fbW1yZWdzIDMyCisgICAgICAgICVlbmRpZgorICAgICVlbmRpZgorCisgICAgJWFzc2lnbiAlJWkgMAorICAgICVyZXAgbnVtX21tcmVncworICAgICAgICBDQVRfWERFRklORSBtLCAlJWksICUxICUrICUlaQorICAgICAgICBDQVRfWERFRklORSBubiUxLCAlJWksICUlaQorICAgICAgICAlYXNzaWduICUlaSAlJWkrMQorICAgICVlbmRyZXAKKyAgICAlaWYgJSVwcmV2X21tcmVncyA+IG51bV9tbXJlZ3MKKyAgICAgICAgJXJlcCAlJXByZXZfbW1yZWdzIC0gbnVtX21tcmVncworICAgICAgICAgICAgQ0FUX1VOREVGIG0sICUlaQorICAgICAgICAgICAgQ0FUX1VOREVGIG5uICUrIG1tdHlwZSwgJSVpCisgICAgICAgICAgICAlYXNzaWduICUlaSAlJWkrMQorICAgICAgICAlZW5kcmVwCisgICAgJWVuZGlmCisgICAgJXhkZWZpbmUgbW10eXBlICUxCislZW5kbWFjcm8KKworOyBQcmVmZXIgcmVnaXN0ZXJzIDE2LTMxIG92ZXIgMC0xNSB0byBhdm9pZCBoYXZpbmcgdG8gdXNlIHZ6ZXJvdXBwZXIKKyVtYWNybyBBVlg1MTJfTU1fUEVSTVVUQVRJT04gMC0xIDAgOyBzdGFydF9yZWcKKyAgICAlaWYgQVJDSF9YODZfNjQgJiYgY3B1ZmxhZyhhdng1MTIpCisgICAgICAgICVhc3NpZ24gJSVpICUxCisgICAgICAgICVyZXAgMTYtJTEKKyAgICAgICAgICAgICVhc3NpZ24gJSVpX2hpZ2ggJSVpKzE2CisgICAgICAgICAgICBTV0FQICUlaSwgJSVpX2hpZ2gKKyAgICAgICAgICAgICVhc3NpZ24gJSVpICUlaSsxCisgICAgICAgICVlbmRyZXAKKyAgICAlZW5kaWYKKyVlbmRtYWNybworCiAlbWFjcm8gSU5JVF9NTVggMC0xKwogICAgICVhc3NpZ24gYXZ4X2VuYWJsZWQgMAogICAgICVkZWZpbmUgUkVTRVRfTU1fUEVSTVVUQVRJT04gSU5JVF9NTVggJTEKICAgICAlZGVmaW5lIG1tc2l6ZSA4Ci0gICAgJWRlZmluZSBudW1fbW1yZWdzIDgKICAgICAlZGVmaW5lIG1vdmEgbW92cQogICAgICVkZWZpbmUgbW92dSBtb3ZxCiAgICAgJWRlZmluZSBtb3ZoIG1vdmQKICAgICAlZGVmaW5lIG1vdm50YSBtb3ZudHEKLSAgICAlYXNzaWduICUlaSAwCi0gICAgJXJlcCA4Ci0gICAgICAgIENBVF9YREVGSU5FIG0sICUlaSwgbW0gJSsgJSVpCi0gICAgICAgIENBVF9YREVGSU5FIG5ubW0sICUlaSwgJSVpCi0gICAgICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgJWVuZHJlcAotICAgICVyZXAgOAotICAgICAgICBDQVRfVU5ERUYgbSwgJSVpCi0gICAgICAgIENBVF9VTkRFRiBubm1tLCAlJWkKLSAgICAgICAgJWFzc2lnbiAlJWkgJSVpKzEKLSAgICAlZW5kcmVwCiAgICAgSU5JVF9DUFVGTEFHUyAlMQorICAgIERFRklORV9NTVJFR1MgbW0KICVlbmRtYWNybwogCiAlbWFjcm8gSU5JVF9YTU0gMC0xKwogICAgICVhc3NpZ24gYXZ4X2VuYWJsZWQgMAogICAgICVkZWZpbmUgUkVTRVRfTU1fUEVSTVVUQVRJT04gSU5JVF9YTU0gJTEKICAgICAlZGVmaW5lIG1tc2l6ZSAxNgotICAgICVkZWZpbmUgbnVtX21tcmVncyA4Ci0gICAgJWlmIEFSQ0hfWDg2XzY0Ci0gICAgICAgICVkZWZpbmUgbnVtX21tcmVncyAxNgotICAgICVlbmRpZgogICAgICVkZWZpbmUgbW92YSBtb3ZkcWEKICAgICAlZGVmaW5lIG1vdnUgbW92ZHF1CiAgICAgJWRlZmluZSBtb3ZoIG1vdnEKICAgICAlZGVmaW5lIG1vdm50YSBtb3ZudGRxCi0gICAgJWFzc2lnbiAlJWkgMAotICAgICVyZXAgbnVtX21tcmVncwotICAgICAgICBDQVRfWERFRklORSBtLCAlJWksIHhtbSAlKyAlJWkKLSAgICAgICAgQ0FUX1hERUZJTkUgbm54bW0sICUlaSwgJSVpCi0gICAgICAgICVhc3NpZ24gJSVpICUlaSsxCi0gICAgJWVuZHJlcAogICAgIElOSVRfQ1BVRkxBR1MgJTEKKyAgICBERUZJTkVfTU1SRUdTIHhtbQorICAgICVpZiBXSU42NAorICAgICAgICBBVlg1MTJfTU1fUEVSTVVUQVRJT04gNiA7IFN3YXAgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyB3aXRoIHZvbGF0aWxlIHJlZ2lzdGVycworICAgICVlbmRpZgogJWVuZG1hY3JvCiAKICVtYWNybyBJTklUX1lNTSAwLTErCiAgICAgJWFzc2lnbiBhdnhfZW5hYmxlZCAxCiAgICAgJWRlZmluZSBSRVNFVF9NTV9QRVJNVVRBVElPTiBJTklUX1lNTSAlMQogICAgICVkZWZpbmUgbW1zaXplIDMyCi0gICAgJWRlZmluZSBudW1fbW1yZWdzIDgKLSAgICAlaWYgQVJDSF9YODZfNjQKLSAgICAgICAgJWRlZmluZSBudW1fbW1yZWdzIDE2Ci0gICAgJWVuZGlmCiAgICAgJWRlZmluZSBtb3ZhIG1vdmRxYQogICAgICVkZWZpbmUgbW92dSBtb3ZkcXUKICAgICAldW5kZWYgbW92aAogICAgICVkZWZpbmUgbW92bnRhIG1vdm50ZHEKLSAgICAlYXNzaWduICUlaSAwCi0gICAgJXJlcCBudW1fbW1yZWdzCi0gICAgICAgIENBVF9YREVGSU5FIG0sICUlaSwgeW1tICUrICUlaQotICAgICAgICBDQVRfWERFRklORSBubnltbSwgJSVpLCAlJWkKLSAgICAgICAgJWFzc2lnbiAlJWkgJSVpKzEKLSAgICAlZW5kcmVwCiAgICAgSU5JVF9DUFVGTEFHUyAlMQorICAgIERFRklORV9NTVJFR1MgeW1tCisgICAgQVZYNTEyX01NX1BFUk1VVEFUSU9OCislZW5kbWFjcm8KKworJW1hY3JvIElOSVRfWk1NIDAtMSsKKyAgICAlYXNzaWduIGF2eF9lbmFibGVkIDEKKyAgICAlZGVmaW5lIFJFU0VUX01NX1BFUk1VVEFUSU9OIElOSVRfWk1NICUxCisgICAgJWRlZmluZSBtbXNpemUgNjQKKyAgICAlZGVmaW5lIG1vdmEgbW92ZHFhCisgICAgJWRlZmluZSBtb3Z1IG1vdmRxdQorICAgICV1bmRlZiBtb3ZoCisgICAgJWRlZmluZSBtb3ZudGEgbW92bnRkcQorICAgIElOSVRfQ1BVRkxBR1MgJTEKKyAgICBERUZJTkVfTU1SRUdTIHptbQorICAgIEFWWDUxMl9NTV9QRVJNVVRBVElPTgogJWVuZG1hY3JvCiAKIElOSVRfWE1NCkBAIC05MzEsMTggKzk5MiwyNiBAQAogICAgICVkZWZpbmUgIG1tbW0lMSAgIG1tJTEKICAgICAlZGVmaW5lICBtbXhtbSUxICBtbSUxCiAgICAgJWRlZmluZSAgbW15bW0lMSAgbW0lMQorICAgICVkZWZpbmUgIG1tem1tJTEgIG1tJTEKICAgICAlZGVmaW5lIHhtbW1tJTEgICBtbSUxCiAgICAgJWRlZmluZSB4bW14bW0lMSB4bW0lMQogICAgICVkZWZpbmUgeG1teW1tJTEgeG1tJTEKKyAgICAlZGVmaW5lIHhtbXptbSUxIHhtbSUxCiAgICAgJWRlZmluZSB5bW1tbSUxICAgbW0lMQogICAgICVkZWZpbmUgeW1teG1tJTEgeG1tJTEKICAgICAlZGVmaW5lIHltbXltbSUxIHltbSUxCisgICAgJWRlZmluZSB5bW16bW0lMSB5bW0lMQorICAgICVkZWZpbmUgem1tbW0lMSAgIG1tJTEKKyAgICAlZGVmaW5lIHptbXhtbSUxIHhtbSUxCisgICAgJWRlZmluZSB6bW15bW0lMSB5bW0lMQorICAgICVkZWZpbmUgem1tem1tJTEgem1tJTEKICAgICAlZGVmaW5lIHhtJTEgeG1tICUrIG0lMQogICAgICVkZWZpbmUgeW0lMSB5bW0gJSsgbSUxCisgICAgJWRlZmluZSB6bSUxIHptbSAlKyBtJTEKICVlbmRtYWNybwogCiAlYXNzaWduIGkgMAotJXJlcCAxNgorJXJlcCAzMgogICAgIERFQ0xBUkVfTU1DQVNUIGkKICAgICAlYXNzaWduIGkgaSsxCiAlZW5kcmVwCkBAIC0xMDMwLDcgKzEwOTksMTEgQEAKIAogOyBBcHBlbmQgY3B1ZmxhZ3MgdG8gdGhlIGNhbGxlZSdzIG5hbWUgaWZmIHRoZSBhcHBlbmRlZCBuYW1lIGlzIGtub3duIGFuZCB0aGUgcGxhaW4gbmFtZSBpc24ndAogJW1hY3JvIGNhbGwgMQotICAgIGNhbGxfaW50ZXJuYWwgJTEgJSsgU1VGRklYLCAlMQorICAgICVpZmlkICUxCisgICAgICAgIGNhbGxfaW50ZXJuYWwgJTEgJSsgU1VGRklYLCAlMQorICAgICVlbHNlCisgICAgICAgIGNhbGwgJTEKKyAgICAlZW5kaWYKICVlbmRtYWNybwogJW1hY3JvIGNhbGxfaW50ZXJuYWwgMgogICAgICV4ZGVmaW5lICUlaSAlMgpAQCAtMTA3MywxMiArMTE0NiwxNyBAQAogOz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKICVhc3NpZ24gaSAwCi0lcmVwIDE2CislcmVwIDMyCiAgICAgJWlmIGkgPCA4CiAgICAgICAgIENBVF9YREVGSU5FIHNpemVvZm1tLCBpLCA4CisgICAgICAgIENBVF9YREVGSU5FIHJlZ251bW9mbW0sIGksIGkKICAgICAlZW5kaWYKICAgICBDQVRfWERFRklORSBzaXplb2Z4bW0sIGksIDE2CiAgICAgQ0FUX1hERUZJTkUgc2l6ZW9meW1tLCBpLCAzMgorICAgIENBVF9YREVGSU5FIHNpemVvZnptbSwgaSwgNjQKKyAgICBDQVRfWERFRklORSByZWdudW1vZnhtbSwgaSwgaQorICAgIENBVF9YREVGSU5FIHJlZ251bW9meW1tLCBpLCBpCisgICAgQ0FUX1hERUZJTkUgcmVnbnVtb2Z6bW0sIGksIGkKICAgICAlYXNzaWduIGkgaSsxCiAlZW5kcmVwCiAldW5kZWYgaQpAQCAtMTA5Nyw3ICsxMTc1LDcgQEAKIDslMSA9PSBpbnN0cnVjdGlvbgogOyUyID09IG1pbmltYWwgaW5zdHJ1Y3Rpb24gc2V0CiA7JTMgPT0gMSBpZiBmbG9hdCwgMCBpZiBpbnQKLTslNCA9PSAxIGlmIG5vbi1kZXN0cnVjdGl2ZSBvciA0LW9wZXJhbmQgKHhtbSwgeG1tLCB4bW0sIGltbSksIDAgb3RoZXJ3aXNlCis7JTQgPT0gMSBpZiA0LW9wZXJhbmQgZW11bGF0aW9uLCAwIGlmIDMtb3BlcmFuZCBlbXVsYXRpb24sIDI1NSBvdGhlcndpc2UgKG5vIGVtdWxhdGlvbikKIDslNSA9PSAxIGlmIGNvbW11dGF0aXZlIChpLmUuIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHNyYyBhcmcgaXMgd2hpY2gpLCAwIGlmIG5vdAogOyU2Kzogb3BlcmFuZHMKICVtYWNybyBSVU5fQVZYX0lOU1RSIDYtOSsKQEAgLTExMzAsMTQgKzEyMDgsMTIgQEAKICAgICAlaWYgX19lbXVsYXRlX2F2eAogICAgICAgICAleGRlZmluZSBfX3NyYzEgJTcKICAgICAgICAgJXhkZWZpbmUgX19zcmMyICU4Ci0gICAgICAgICVpZm5pZG4gJTYsICU3Ci0gICAgICAgICAgICAlaWYgJTAgPj0gOQotICAgICAgICAgICAgICAgIENIRUNLX0FWWF9JTlNUUl9FTVUgeyUxICU2LCAlNywgJTgsICU5fSwgJTYsICU4LCAlOQotICAgICAgICAgICAgJWVsc2UKLSAgICAgICAgICAgICAgICBDSEVDS19BVlhfSU5TVFJfRU1VIHslMSAlNiwgJTcsICU4fSwgJTYsICU4Ci0gICAgICAgICAgICAlZW5kaWYKLSAgICAgICAgICAgICVpZiAlNSAmJiAlNCA9PSAwCi0gICAgICAgICAgICAgICAgJWlmbmlkICU4CisgICAgICAgICVpZiAlNSAmJiAlNCA9PSAwCisgICAgICAgICAgICAlaWZuaWRuICU2LCAlNworICAgICAgICAgICAgICAgICVpZmlkbiAlNiwgJTgKKyAgICAgICAgICAgICAgICAgICAgJXhkZWZpbmUgX19zcmMxICU4CisgICAgICAgICAgICAgICAgICAgICV4ZGVmaW5lIF9fc3JjMiAlNworICAgICAgICAgICAgICAgICVlbGlmbm51bSBzaXplb2YlOAogICAgICAgICAgICAgICAgICAgICA7IDMtb3BlcmFuZCBBVlggaW5zdHJ1Y3Rpb25zIHdpdGggYSBtZW1vcnkgYXJnIGNhbiBvbmx5IGhhdmUgaXQgaW4gc3JjMiwKICAgICAgICAgICAgICAgICAgICAgOyB3aGVyZWFzIFNTRSBlbXVsYXRpb24gcHJlZmVycyB0byBoYXZlIGl0IGluIHNyYzEgKGkuZS4gdGhlIG1vdikuCiAgICAgICAgICAgICAgICAgICAgIDsgU28sIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBjb21tdXRhdGl2ZSB3aXRoIGEgbWVtb3J5IGFyZywgc3dhcCB0aGVtLgpAQCAtMTE0NSw2ICsxMjIxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICV4ZGVmaW5lIF9fc3JjMiAlNwogICAgICAgICAgICAgICAgICVlbmRpZgogICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorICAgICAgICAlaWZuaWRuICU2LCBfX3NyYzEKKyAgICAgICAgICAgICVpZiAlMCA+PSA5CisgICAgICAgICAgICAgICAgQ0hFQ0tfQVZYX0lOU1RSX0VNVSB7JTEgJTYsICU3LCAlOCwgJTl9LCAlNiwgX19zcmMyLCAlOQorICAgICAgICAgICAgJWVsc2UKKyAgICAgICAgICAgICAgICBDSEVDS19BVlhfSU5TVFJfRU1VIHslMSAlNiwgJTcsICU4fSwgJTYsIF9fc3JjMgorICAgICAgICAgICAgJWVuZGlmCiAgICAgICAgICAgICAlaWYgX19zaXplb2ZyZWcgPT0gOAogICAgICAgICAgICAgICAgIE1PVlEgJTYsIF9fc3JjMQogICAgICAgICAgICAgJWVsaWYgJTMKQEAgLTExNzIsOSArMTI1NSw5IEBACiA7JTEgPT0gaW5zdHJ1Y3Rpb24KIDslMiA9PSBtaW5pbWFsIGluc3RydWN0aW9uIHNldAogOyUzID09IDEgaWYgZmxvYXQsIDAgaWYgaW50Ci07JTQgPT0gMSBpZiBub24tZGVzdHJ1Y3RpdmUgb3IgNC1vcGVyYW5kICh4bW0sIHhtbSwgeG1tLCBpbW0pLCAwIG90aGVyd2lzZQorOyU0ID09IDEgaWYgNC1vcGVyYW5kIGVtdWxhdGlvbiwgMCBpZiAzLW9wZXJhbmQgZW11bGF0aW9uLCAyNTUgb3RoZXJ3aXNlIChubyBlbXVsYXRpb24pCiA7JTUgPT0gMSBpZiBjb21tdXRhdGl2ZSAoaS5lLiBkb2Vzbid0IG1hdHRlciB3aGljaCBzcmMgYXJnIGlzIHdoaWNoKSwgMCBpZiBub3QKLSVtYWNybyBBVlhfSU5TVFIgMS01IGZub3JkLCAwLCAxLCAwCislbWFjcm8gQVZYX0lOU1RSIDEtNSBmbm9yZCwgMCwgMjU1LCAwCiAgICAgJW1hY3JvICUxIDEtMTAgZm5vcmQsIGZub3JkLCBmbm9yZCwgZm5vcmQsICUxLCAlMiwgJTMsICU0LCAlNQogICAgICAgICAlaWZpZG4gJTIsIGZub3JkCiAgICAgICAgICAgICBSVU5fQVZYX0lOU1RSICU2LCAlNywgJTgsICU5LCAlMTAsICUxCkBAIC0xMTkwLDEyICsxMjczLDEyIEBACiAgICAgJWVuZG1hY3JvCiAlZW5kbWFjcm8KIAotOyBJbnN0cnVjdGlvbnMgd2l0aCBib3RoIFZFWCBhbmQgbm9uLVZFWCBlbmNvZGluZ3MKKzsgSW5zdHJ1Y3Rpb25zIHdpdGggYm90aCBWRVgvRVZFWCBhbmQgbGVnYWN5IGVuY29kaW5ncwogOyBOb24tZGVzdHJ1Y3RpdmUgaW5zdHJ1Y3Rpb25zIGFyZSB3cml0dGVuIHdpdGhvdXQgcGFyYW1ldGVycwogQVZYX0lOU1RSIGFkZHBkLCBzc2UyLCAxLCAwLCAxCiBBVlhfSU5TVFIgYWRkcHMsIHNzZSwgMSwgMCwgMQotQVZYX0lOU1RSIGFkZHNkLCBzc2UyLCAxLCAwLCAxCi1BVlhfSU5TVFIgYWRkc3MsIHNzZSwgMSwgMCwgMQorQVZYX0lOU1RSIGFkZHNkLCBzc2UyLCAxLCAwLCAwCitBVlhfSU5TVFIgYWRkc3MsIHNzZSwgMSwgMCwgMAogQVZYX0lOU1RSIGFkZHN1YnBkLCBzc2UzLCAxLCAwLCAwCiBBVlhfSU5TVFIgYWRkc3VicHMsIHNzZTMsIDEsIDAsIDAKIEFWWF9JTlNUUiBhZXNkZWMsIGFlc25pLCAwLCAwLCAwCkBAIC0xMjA4LDE0ICsxMjkxLDQ2IEBACiBBVlhfSU5TVFIgYW5kbnBzLCBzc2UsIDEsIDAsIDAKIEFWWF9JTlNUUiBhbmRwZCwgc3NlMiwgMSwgMCwgMQogQVZYX0lOU1RSIGFuZHBzLCBzc2UsIDEsIDAsIDEKLUFWWF9JTlNUUiBibGVuZHBkLCBzc2U0LCAxLCAwLCAwCi1BVlhfSU5TVFIgYmxlbmRwcywgc3NlNCwgMSwgMCwgMAotQVZYX0lOU1RSIGJsZW5kdnBkLCBzc2U0LCAxLCAwLCAwCi1BVlhfSU5TVFIgYmxlbmR2cHMsIHNzZTQsIDEsIDAsIDAKK0FWWF9JTlNUUiBibGVuZHBkLCBzc2U0LCAxLCAxLCAwCitBVlhfSU5TVFIgYmxlbmRwcywgc3NlNCwgMSwgMSwgMAorQVZYX0lOU1RSIGJsZW5kdnBkLCBzc2U0IDsgY2FuJ3QgYmUgZW11bGF0ZWQKK0FWWF9JTlNUUiBibGVuZHZwcywgc3NlNCA7IGNhbid0IGJlIGVtdWxhdGVkCitBVlhfSU5TVFIgY21wZXFwZCwgc3NlMiwgMSwgMCwgMQorQVZYX0lOU1RSIGNtcGVxcHMsIHNzZSwgMSwgMCwgMQorQVZYX0lOU1RSIGNtcGVxc2QsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBlcXNzLCBzc2UsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBsZXBkLCBzc2UyLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wbGVwcywgc3NlLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wbGVzZCwgc3NlMiwgMSwgMCwgMAorQVZYX0lOU1RSIGNtcGxlc3MsIHNzZSwgMSwgMCwgMAorQVZYX0lOU1RSIGNtcGx0cGQsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBsdHBzLCBzc2UsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBsdHNkLCBzc2UyLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wbHRzcywgc3NlLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wbmVxcGQsIHNzZTIsIDEsIDAsIDEKK0FWWF9JTlNUUiBjbXBuZXFwcywgc3NlLCAxLCAwLCAxCitBVlhfSU5TVFIgY21wbmVxc2QsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBuZXFzcywgc3NlLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wbmxlcGQsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBubGVwcywgc3NlLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wbmxlc2QsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBubGVzcywgc3NlLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wbmx0cGQsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBubHRwcywgc3NlLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wbmx0c2QsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBubHRzcywgc3NlLCAxLCAwLCAwCitBVlhfSU5TVFIgY21wb3JkcGQsIHNzZTIgMSwgMCwgMQorQVZYX0lOU1RSIGNtcG9yZHBzLCBzc2UgMSwgMCwgMQorQVZYX0lOU1RSIGNtcG9yZHNkLCBzc2UyIDEsIDAsIDAKK0FWWF9JTlNUUiBjbXBvcmRzcywgc3NlIDEsIDAsIDAKIEFWWF9JTlNUUiBjbXBwZCwgc3NlMiwgMSwgMSwgMAogQVZYX0lOU1RSIGNtcHBzLCBzc2UsIDEsIDEsIDAKIEFWWF9JTlNUUiBjbXBzZCwgc3NlMiwgMSwgMSwgMAogQVZYX0lOU1RSIGNtcHNzLCBzc2UsIDEsIDEsIDAKK0FWWF9JTlNUUiBjbXB1bm9yZHBkLCBzc2UyLCAxLCAwLCAxCitBVlhfSU5TVFIgY21wdW5vcmRwcywgc3NlLCAxLCAwLCAxCitBVlhfSU5TVFIgY21wdW5vcmRzZCwgc3NlMiwgMSwgMCwgMAorQVZYX0lOU1RSIGNtcHVub3Jkc3MsIHNzZSwgMSwgMCwgMAogQVZYX0lOU1RSIGNvbWlzZCwgc3NlMgogQVZYX0lOU1RSIGNvbWlzcywgc3NlCiBBVlhfSU5TVFIgY3Z0ZHEycGQsIHNzZTIKQEAgLTEyMjUsMTAgKzEzNDAsMTAgQEAKIEFWWF9JTlNUUiBjdnRwczJkcSwgc3NlMgogQVZYX0lOU1RSIGN2dHBzMnBkLCBzc2UyCiBBVlhfSU5TVFIgY3Z0c2Qyc2ksIHNzZTIKLUFWWF9JTlNUUiBjdnRzZDJzcywgc3NlMgotQVZYX0lOU1RSIGN2dHNpMnNkLCBzc2UyCi1BVlhfSU5TVFIgY3Z0c2kyc3MsIHNzZQotQVZYX0lOU1RSIGN2dHNzMnNkLCBzc2UyCitBVlhfSU5TVFIgY3Z0c2Qyc3MsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBjdnRzaTJzZCwgc3NlMiwgMSwgMCwgMAorQVZYX0lOU1RSIGN2dHNpMnNzLCBzc2UsIDEsIDAsIDAKK0FWWF9JTlNUUiBjdnRzczJzZCwgc3NlMiwgMSwgMCwgMAogQVZYX0lOU1RSIGN2dHNzMnNpLCBzc2UKIEFWWF9JTlNUUiBjdnR0cGQyZHEsIHNzZTIKIEFWWF9JTlNUUiBjdnR0cHMyZHEsIHNzZTIKQEAgLTEyNTEsMTIgKzEzNjYsMTIgQEAKIEFWWF9JTlNUUiBtYXNrbW92ZHF1LCBzc2UyCiBBVlhfSU5TVFIgbWF4cGQsIHNzZTIsIDEsIDAsIDEKIEFWWF9JTlNUUiBtYXhwcywgc3NlLCAxLCAwLCAxCi1BVlhfSU5TVFIgbWF4c2QsIHNzZTIsIDEsIDAsIDEKLUFWWF9JTlNUUiBtYXhzcywgc3NlLCAxLCAwLCAxCitBVlhfSU5TVFIgbWF4c2QsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBtYXhzcywgc3NlLCAxLCAwLCAwCiBBVlhfSU5TVFIgbWlucGQsIHNzZTIsIDEsIDAsIDEKIEFWWF9JTlNUUiBtaW5wcywgc3NlLCAxLCAwLCAxCi1BVlhfSU5TVFIgbWluc2QsIHNzZTIsIDEsIDAsIDEKLUFWWF9JTlNUUiBtaW5zcywgc3NlLCAxLCAwLCAxCitBVlhfSU5TVFIgbWluc2QsIHNzZTIsIDEsIDAsIDAKK0FWWF9JTlNUUiBtaW5zcywgc3NlLCAxLCAwLCAwCiBBVlhfSU5TVFIgbW92YXBkLCBzc2UyCiBBVlhfSU5TVFIgbW92YXBzLCBzc2UKIEFWWF9JTlNUUiBtb3ZkLCBtbXgKQEAgLTEyODIsMTEgKzEzOTcsMTEgQEAKIEFWWF9JTlNUUiBtb3Zzcywgc3NlLCAxLCAwLCAwCiBBVlhfSU5TVFIgbW92dXBkLCBzc2UyCiBBVlhfSU5TVFIgbW92dXBzLCBzc2UKLUFWWF9JTlNUUiBtcHNhZGJ3LCBzc2U0CitBVlhfSU5TVFIgbXBzYWRidywgc3NlNCwgMCwgMSwgMAogQVZYX0lOU1RSIG11bHBkLCBzc2UyLCAxLCAwLCAxCiBBVlhfSU5TVFIgbXVscHMsIHNzZSwgMSwgMCwgMQotQVZYX0lOU1RSIG11bHNkLCBzc2UyLCAxLCAwLCAxCi1BVlhfSU5TVFIgbXVsc3MsIHNzZSwgMSwgMCwgMQorQVZYX0lOU1RSIG11bHNkLCBzc2UyLCAxLCAwLCAwCitBVlhfSU5TVFIgbXVsc3MsIHNzZSwgMSwgMCwgMAogQVZYX0lOU1RSIG9ycGQsIHNzZTIsIDEsIDAsIDEKIEFWWF9JTlNUUiBvcnBzLCBzc2UsIDEsIDAsIDEKIEFWWF9JTlNUUiBwYWJzYiwgc3NzZTMKQEAgLTEzMDQsMTQgKzE0MTksMTggQEAKIEFWWF9JTlNUUiBwYWRkc3csIG1teCwgMCwgMCwgMQogQVZYX0lOU1RSIHBhZGR1c2IsIG1teCwgMCwgMCwgMQogQVZYX0lOU1RSIHBhZGR1c3csIG1teCwgMCwgMCwgMQotQVZYX0lOU1RSIHBhbGlnbnIsIHNzc2UzCitBVlhfSU5TVFIgcGFsaWduciwgc3NzZTMsIDAsIDEsIDAKIEFWWF9JTlNUUiBwYW5kLCBtbXgsIDAsIDAsIDEKIEFWWF9JTlNUUiBwYW5kbiwgbW14LCAwLCAwLCAwCiBBVlhfSU5TVFIgcGF2Z2IsIG1teDIsIDAsIDAsIDEKIEFWWF9JTlNUUiBwYXZndywgbW14MiwgMCwgMCwgMQotQVZYX0lOU1RSIHBibGVuZHZiLCBzc2U0LCAwLCAwLCAwCi1BVlhfSU5TVFIgcGJsZW5kdywgc3NlNAotQVZYX0lOU1RSIHBjbG11bHFkcQorQVZYX0lOU1RSIHBibGVuZHZiLCBzc2U0IDsgY2FuJ3QgYmUgZW11bGF0ZWQKK0FWWF9JTlNUUiBwYmxlbmR3LCBzc2U0LCAwLCAxLCAwCitBVlhfSU5TVFIgcGNsbXVscWRxLCBmbm9yZCwgMCwgMSwgMAorQVZYX0lOU1RSIHBjbG11bGhxaHFkcSwgZm5vcmQsIDAsIDAsIDAKK0FWWF9JTlNUUiBwY2xtdWxocWxxZHEsIGZub3JkLCAwLCAwLCAwCitBVlhfSU5TVFIgcGNsbXVsbHFocWRxLCBmbm9yZCwgMCwgMCwgMAorQVZYX0lOU1RSIHBjbG11bGxxbHFkcSwgZm5vcmQsIDAsIDAsIDAKIEFWWF9JTlNUUiBwY21wZXN0cmksIHNzZTQyCiBBVlhfSU5TVFIgcGNtcGVzdHJtLCBzc2U0MgogQVZYX0lOU1RSIHBjbXBpc3RyaSwgc3NlNDIKQEAgLTEzMzUsMTAgKzE0NTQsMTAgQEAKIEFWWF9JTlNUUiBwaHN1YncsIHNzc2UzLCAwLCAwLCAwCiBBVlhfSU5TVFIgcGhzdWJkLCBzc3NlMywgMCwgMCwgMAogQVZYX0lOU1RSIHBoc3Vic3csIHNzc2UzLCAwLCAwLCAwCi1BVlhfSU5TVFIgcGluc3JiLCBzc2U0Ci1BVlhfSU5TVFIgcGluc3JkLCBzc2U0Ci1BVlhfSU5TVFIgcGluc3JxLCBzc2U0Ci1BVlhfSU5TVFIgcGluc3J3LCBtbXgyCitBVlhfSU5TVFIgcGluc3JiLCBzc2U0LCAwLCAxLCAwCitBVlhfSU5TVFIgcGluc3JkLCBzc2U0LCAwLCAxLCAwCitBVlhfSU5TVFIgcGluc3JxLCBzc2U0LCAwLCAxLCAwCitBVlhfSU5TVFIgcGluc3J3LCBtbXgyLCAwLCAxLCAwCiBBVlhfSU5TVFIgcG1hZGR3ZCwgbW14LCAwLCAwLCAxCiBBVlhfSU5TVFIgcG1hZGR1YnN3LCBzc3NlMywgMCwgMCwgMAogQVZYX0lOU1RSIHBtYXhzYiwgc3NlNCwgMCwgMCwgMQpAQCAtMTQxMCwxOCArMTUyOSwxOCBAQAogQVZYX0lOU1RSIHB1bnBja2xkcSwgbW14LCAwLCAwLCAwCiBBVlhfSU5TVFIgcHVucGNrbHFkcSwgc3NlMiwgMCwgMCwgMAogQVZYX0lOU1RSIHB4b3IsIG1teCwgMCwgMCwgMQotQVZYX0lOU1RSIHJjcHBzLCBzc2UsIDEsIDAsIDAKK0FWWF9JTlNUUiByY3Bwcywgc3NlCiBBVlhfSU5TVFIgcmNwc3MsIHNzZSwgMSwgMCwgMAogQVZYX0lOU1RSIHJvdW5kcGQsIHNzZTQKIEFWWF9JTlNUUiByb3VuZHBzLCBzc2U0Ci1BVlhfSU5TVFIgcm91bmRzZCwgc3NlNAotQVZYX0lOU1RSIHJvdW5kc3MsIHNzZTQKLUFWWF9JTlNUUiByc3FydHBzLCBzc2UsIDEsIDAsIDAKK0FWWF9JTlNUUiByb3VuZHNkLCBzc2U0LCAxLCAxLCAwCitBVlhfSU5TVFIgcm91bmRzcywgc3NlNCwgMSwgMSwgMAorQVZYX0lOU1RSIHJzcXJ0cHMsIHNzZQogQVZYX0lOU1RSIHJzcXJ0c3MsIHNzZSwgMSwgMCwgMAogQVZYX0lOU1RSIHNodWZwZCwgc3NlMiwgMSwgMSwgMAogQVZYX0lOU1RSIHNodWZwcywgc3NlLCAxLCAxLCAwCi1BVlhfSU5TVFIgc3FydHBkLCBzc2UyLCAxLCAwLCAwCi1BVlhfSU5TVFIgc3FydHBzLCBzc2UsIDEsIDAsIDAKK0FWWF9JTlNUUiBzcXJ0cGQsIHNzZTIKK0FWWF9JTlNUUiBzcXJ0cHMsIHNzZQogQVZYX0lOU1RSIHNxcnRzZCwgc3NlMiwgMSwgMCwgMAogQVZYX0lOU1RSIHNxcnRzcywgc3NlLCAxLCAwLCAwCiBBVlhfSU5TVFIgc3RteGNzciwgc3NlCkBAIC0xNDk3LDcgKzE2MTYsNyBAQAogICAgICAgICAgICAgICAgIHYlNSU2ICUxLCAlMiwgJTMsICU0CiAgICAgICAgICAgICAlZWxpZmlkbiAlMSwgJTIKICAgICAgICAgICAgICAgICA7IElmICUzIG9yICU0IGlzIGEgbWVtb3J5IG9wZXJhbmQgaXQgbmVlZHMgdG8gYmUgZW5jb2RlZCBhcyB0aGUgbGFzdCBvcGVyYW5kLgotICAgICAgICAgICAgICAgICVpZmlkICUzCisgICAgICAgICAgICAgICAgJWlmbnVtIHNpemVvZiUzCiAgICAgICAgICAgICAgICAgICAgIHYlezV9MjEzJTYgJTIsICUzLCAlNAogICAgICAgICAgICAgICAgICVlbHNlCiAgICAgICAgICAgICAgICAgICAgIHYlezV9MTMyJTYgJTIsICU0LCAlMwpAQCAtMTUyMiw2ICsxNjQxLDUyIEBACiBGTUE0X0lOU1RSIGZubWFkZCwgICBwZCwgcHMsIHNkLCBzcwogRk1BNF9JTlNUUiBmbm1zdWIsICAgcGQsIHBzLCBzZCwgc3MKIAorOyBNYWNyb3MgZm9yIGNvbnZlcnRpbmcgVkVYIGluc3RydWN0aW9ucyB0byBlcXVpdmFsZW50IEVWRVggb25lcy4KKyVtYWNybyBFVkVYX0lOU1RSIDItMyAwIDsgdmV4LCBldmV4LCBwcmVmZXJfZXZleAorICAgICVtYWNybyAlMSAyLTcgZm5vcmQsIGZub3JkLCAlMSwgJTIsICUzCisgICAgICAgICVpZmlkbiAlMywgZm5vcmQKKyAgICAgICAgICAgICVkZWZpbmUgJSVhcmdzICUxLCAlMgorICAgICAgICAlZWxpZmlkbiAlNCwgZm5vcmQKKyAgICAgICAgICAgICVkZWZpbmUgJSVhcmdzICUxLCAlMiwgJTMKKyAgICAgICAgJWVsc2UKKyAgICAgICAgICAgICVkZWZpbmUgJSVhcmdzICUxLCAlMiwgJTMsICU0CisgICAgICAgICVlbmRpZgorICAgICAgICAlYXNzaWduICUlZXZleF9yZXF1aXJlZCBjcHVmbGFnKGF2eDUxMikgJiAlNworICAgICAgICAlaWZudW0gcmVnbnVtb2YlMQorICAgICAgICAgICAgJWlmIHJlZ251bW9mJTEgPj0gMTYgfHwgc2l6ZW9mJTEgPiAzMgorICAgICAgICAgICAgICAgICVhc3NpZ24gJSVldmV4X3JlcXVpcmVkIDEKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYKKyAgICAgICAgJWlmbnVtIHJlZ251bW9mJTIKKyAgICAgICAgICAgICVpZiByZWdudW1vZiUyID49IDE2IHx8IHNpemVvZiUyID4gMzIKKyAgICAgICAgICAgICAgICAlYXNzaWduICUlZXZleF9yZXF1aXJlZCAxCisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgJWVuZGlmCisgICAgICAgICVpZiAlJWV2ZXhfcmVxdWlyZWQKKyAgICAgICAgICAgICU2ICUlYXJncworICAgICAgICAlZWxzZQorICAgICAgICAgICAgJTUgJSVhcmdzIDsgUHJlZmVyIFZFWCBvdmVyIEVWRVggZHVlIHRvIHNob3J0ZXIgaW5zdHJ1Y3Rpb24gbGVuZ3RoCisgICAgICAgICVlbmRpZgorICAgICVlbmRtYWNybworJWVuZG1hY3JvCisKK0VWRVhfSU5TVFIgdmJyb2FkY2FzdGYxMjgsIHZicm9hZGNhc3RmMzJ4NAorRVZFWF9JTlNUUiB2YnJvYWRjYXN0aTEyOCwgdmJyb2FkY2FzdGkzMng0CitFVkVYX0lOU1RSIHZleHRyYWN0ZjEyOCwgICB2ZXh0cmFjdGYzMng0CitFVkVYX0lOU1RSIHZleHRyYWN0aTEyOCwgICB2ZXh0cmFjdGkzMng0CitFVkVYX0lOU1RSIHZpbnNlcnRmMTI4LCAgICB2aW5zZXJ0ZjMyeDQKK0VWRVhfSU5TVFIgdmluc2VydGkxMjgsICAgIHZpbnNlcnRpMzJ4NAorRVZFWF9JTlNUUiB2bW92ZHFhLCAgICAgICAgdm1vdmRxYTMyCitFVkVYX0lOU1RSIHZtb3ZkcXUsICAgICAgICB2bW92ZHF1MzIKK0VWRVhfSU5TVFIgdnBhbmQsICAgICAgICAgIHZwYW5kZAorRVZFWF9JTlNUUiB2cGFuZG4sICAgICAgICAgdnBhbmRuZAorRVZFWF9JTlNUUiB2cG9yLCAgICAgICAgICAgdnBvcmQKK0VWRVhfSU5TVFIgdnB4b3IsICAgICAgICAgIHZweG9yZAorRVZFWF9JTlNUUiB2cmNwcHMsICAgICAgICAgdnJjcDE0cHMsICAgMSA7IEVWRVggdmVyc2lvbnMgaGF2ZSBoaWdoZXIgcHJlY2lzaW9uCitFVkVYX0lOU1RSIHZyY3BzcywgICAgICAgICB2cmNwMTRzcywgICAxCitFVkVYX0lOU1RSIHZyc3FydHBzLCAgICAgICB2cnNxcnQxNHBzLCAxCitFVkVYX0lOU1RSIHZyc3FydHNzLCAgICAgICB2cnNxcnQxNHNzLCAxCisKIDsgd29ya2Fyb3VuZDogdnBicm9hZGNhc3RxIGlzIGJyb2tlbiBpbiB4ODZfMzIgZHVlIHRvIGEgeWFzbSBidWcgKGZpeGVkIGluIDEuMy4wKQogJWlmZGVmIF9fWUFTTV9WRVJfXwogICAgICVpZiBfX1lBU01fVkVSU0lPTl9JRF9fIDwgMHgwMTAzMDAwMCAmJiBBUkNIX1g4Nl82NCA9PSAwCmRpZmYgLS1naXQgYS9saWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtIGIvbGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbQppbmRleCBiMDlmYTgxLi5kN2NkOTk2IDEwMDY0NAotLS0gYS9saWJhdnV0aWwveDg2L3g4NnV0aWwuYXNtCisrKyBiL2xpYmF2dXRpbC94ODYveDg2dXRpbC5hc20KQEAgLTI5LDggKzI5LDI2IEBACiAKICVpbmNsdWRlICJsaWJhdnV0aWwveDg2L3g4NmluYy5hc20iCiAKKzsgZXhwYW5kcyB0byBbYmFzZV0sLi4uLFtiYXNlKzcqc3RyaWRlXQorJWRlZmluZSBQQVNTOFJPV1MoYmFzZSwgYmFzZTMsIHN0cmlkZSwgc3RyaWRlMykgXAorICAgIFtiYXNlXSwgICAgICAgICAgIFtiYXNlICArIHN0cmlkZV0sICAgW2Jhc2UgICsgMipzdHJpZGVdLCBbYmFzZTNdLCBcCisgICAgW2Jhc2UzICsgc3RyaWRlXSwgW2Jhc2UzICsgMipzdHJpZGVdLCBbYmFzZTMgKyBzdHJpZGUzXSwgIFtiYXNlMyArIHN0cmlkZSo0XQorCis7IEludGVybGVhdmUgbG93IHNyYzAgd2l0aCBsb3cgc3JjMSBhbmQgc3RvcmUgaW4gc3JjMCwKKzsgaW50ZXJsZWF2ZSBoaWdoIHNyYzAgd2l0aCBoaWdoIHNyYzEgYW5kIHN0b3JlIGluIHNyYzEuCis7ICUxIC0gdHlwZXMKKzsgJTIgLSBpbmRleCBvZiB0aGUgcmVnaXN0ZXIgd2l0aCBzcmMwCis7ICUzIC0gaW5kZXggb2YgdGhlIHJlZ2lzdGVyIHdpdGggc3JjMQorOyAlNCAtIGluZGV4IG9mIHRoZSByZWdpc3RlciBmb3IgaW50ZXJtZWRpYXRlIHJlc3VsdHMKKzsgZXhhbXBsZSBmb3IgJTEgLSB3ZDogaW5wdXQ6IHNyYzA6IHgwIHgxIHgyIHgzIHowIHoxIHoyIHozCis7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxOiB5MCB5MSB5MiB5MyBxMCBxMSBxMiBxMworOyAgICAgICAgICAgICAgICAgICAgIG91dHB1dDogc3JjMDogeDAgeTAgeDEgeTEgeDIgeTIgeDMgeTMKKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzE6IHowIHEwIHoxIHExIHoyIHEyIHozIHEzCiAlbWFjcm8gU0JVVFRFUkZMWSA0Ci0laWYgYXZ4X2VuYWJsZWQgPT0gMAorJWlmaWRuICUxLCBkcXFxCisgICAgdnBlcm0yaTEyOCAgbSU0LCBtJTIsIG0lMywgcTAzMDEKKyAgICB2aW5zZXJ0aTEyOCBtJTIsIG0lMiwgeG0lMywgMQorJWVsaWYgYXZ4X2VuYWJsZWQgPT0gMAogICAgIG1vdmEgICAgICBtJTQsIG0lMgogICAgIHB1bnBja2wlMSBtJTIsIG0lMwogICAgIHB1bnBja2glMSBtJTQsIG0lMwpAQCAtNTMsNiArNzEsMTIgQEAKICAgICBTV0FQICUxLCAlMywgJTIKICVlbmRtYWNybwogCislbWFjcm8gU0JVVFRFUkZMWVBEIDMKKyAgICBtb3ZsaHBzIG0lMywgbSUxLCBtJTIKKyAgICBtb3ZobHBzIG0lMiwgbSUyLCBtJTEKKyAgICBTV0FQICUxLCAlMworJWVuZG1hY3JvCisKICVtYWNybyBUUkFOU1BPU0U0eDRCIDUKICAgICBTQlVUVEVSRkxZIGJ3LCAlMSwgJTIsICU1CiAgICAgU0JVVFRFUkZMWSBidywgJTMsICU0LCAlNQpAQCAtOTksMTIgKzEyMyw5IEBACiAlbWFjcm8gVFJBTlNQT1NFNHg0UFMgNQogICAgIFNCVVRURVJGTFlQUyAlMSwgJTIsICU1CiAgICAgU0JVVFRFUkZMWVBTICUzLCAlNCwgJTUKLSAgICBtb3ZsaHBzIG0lNSwgbSUxLCBtJTMKLSAgICBtb3ZobHBzIG0lMywgbSUxCi0gICAgU1dBUCAlNSwgJTEKLSAgICBtb3ZsaHBzIG0lNSwgbSUyLCBtJTQKLSAgICBtb3ZobHBzIG0lNCwgbSUyCi0gICAgU1dBUCAlNSwgJTIsICUzCisgICAgU0JVVFRFUkZMWVBEICUxLCAlMywgJTUKKyAgICBTQlVUVEVSRkxZUEQgJTIsICU0LCAlNQorICAgIFNXQVAgJTIsICUzCiAlZW5kbWFjcm8KIAogJW1hY3JvIFRSQU5TUE9TRTh4NEQgOS0xMQpAQCAtMTkzLDYgKzIxNCw4NSBAQAogJWVuZGlmCiAlZW5kbWFjcm8KIAorJW1hY3JvIFRSQU5TUE9TRTE2eDE2VyAxOC0xOQorOyBpbjogIG0wLi5tMTUsIHVubGVzcyAlMTkgaW4gd2hpY2ggY2FzZSBtNiBpcyBpbiAlMTcKKzsgb3V0OiBtMC4ubTE1LCB1bmxlc3MgJTE5IGluIHdoaWNoIGNhc2UgbTQgaXMgaW4gJTE4Cis7IHNwaWxscyBpbnRvICUxNyBhbmQgJTE4CislaWYgJTAgPCAxOQorICAgIG1vdmEgICAgICAgJTE3LCBtJTcKKyVlbmRpZgorCisgICAgU0JVVFRFUkZMWSBkcXFxLCAlMSwgICU5LCAlNworICAgIFNCVVRURVJGTFkgZHFxcSwgJTIsICUxMCwgJTcKKyAgICBTQlVUVEVSRkxZIGRxcXEsICUzLCAlMTEsICU3CisgICAgU0JVVFRFUkZMWSBkcXFxLCAlNCwgJTEyLCAlNworICAgIFNCVVRURVJGTFkgZHFxcSwgJTUsICUxMywgJTcKKyAgICBTQlVUVEVSRkxZIGRxcXEsICU2LCAlMTQsICU3CisgICAgbW92YSAgICAgICAlMTgsIG0lMTQKKyAgICBtb3ZhICAgICAgIG0lNywgJTE3CisgICAgU0JVVFRFUkZMWSBkcXFxLCAlNywgJTE1LCAlMTQKKyAgICBTQlVUVEVSRkxZIGRxcXEsICU4LCAlMTYsICUxNAorCisgICAgU0JVVFRFUkZMWSAgd2QsICAlMSwgICUyLCAlMTQKKyAgICBTQlVUVEVSRkxZICB3ZCwgICUzLCAgJTQsICUxNAorICAgIFNCVVRURVJGTFkgIHdkLCAgJTUsICAlNiwgJTE0CisgICAgU0JVVFRFUkZMWSAgd2QsICAlNywgICU4LCAlMTQKKyAgICBTQlVUVEVSRkxZICB3ZCwgICU5LCAlMTAsICUxNAorICAgIFNCVVRURVJGTFkgIHdkLCAlMTEsICUxMiwgJTE0CisgICAgbW92YSAgICAgICAlMTcsIG0lMTIKKyAgICBtb3ZhICAgICAgbSUxNCwgJTE4CisgICAgU0JVVFRFUkZMWSAgd2QsICUxMywgJTE0LCAlMTIKKyAgICBTQlVUVEVSRkxZICB3ZCwgJTE1LCAlMTYsICUxMgorCisgICAgU0JVVFRFUkZMWSAgZHEsICAlMSwgICUzLCAlMTIKKyAgICBTQlVUVEVSRkxZICBkcSwgICUyLCAgJTQsICUxMgorICAgIFNCVVRURVJGTFkgIGRxLCAgJTUsICAlNywgJTEyCisgICAgU0JVVFRFUkZMWSAgZHEsICAlNiwgICU4LCAlMTIKKyAgICBTQlVUVEVSRkxZICBkcSwgICU5LCAlMTEsICUxMgorICAgIG1vdmEgICAgICAgJTE4LCBtJTExCisgICAgbW92YSAgICAgIG0lMTIsICUxNworICAgIFNCVVRURVJGTFkgIGRxLCAlMTAsICUxMiwgJTExCisgICAgU0JVVFRFUkZMWSAgZHEsICUxMywgJTE1LCAlMTEKKyAgICBTQlVUVEVSRkxZICBkcSwgJTE0LCAlMTYsICUxMQorCisgICAgU0JVVFRFUkZMWSBxZHEsICAlMSwgICU1LCAlMTEKKyAgICBTQlVUVEVSRkxZIHFkcSwgICUyLCAgJTYsICUxMQorICAgIFNCVVRURVJGTFkgcWRxLCAgJTMsICAlNywgJTExCisgICAgU0JVVFRFUkZMWSBxZHEsICAlNCwgICU4LCAlMTEKKworICAgIFNXQVAgICAgICAgICUyLCAlNQorICAgIFNXQVAgICAgICAgICU0LCAlNworCisgICAgU0JVVFRFUkZMWSBxZHEsICAlOSwgJTEzLCAlMTEKKyAgICBTQlVUVEVSRkxZIHFkcSwgJTEwLCAlMTQsICUxMQorICAgIG1vdmEgICAgICBtJTExLCAlMTgKKyAgICBtb3ZhICAgICAgICUxOCwgbSU1CisgICAgU0JVVFRFUkZMWSBxZHEsICUxMSwgJTE1LCAlNQorICAgIFNCVVRURVJGTFkgcWRxLCAlMTIsICUxNiwgJTUKKworJWlmICUwIDwgMTkKKyAgICBtb3ZhICAgICAgIG0lNSwgJTE4CislZW5kaWYKKworICAgIFNXQVAgICAgICAgJTEwLCAlMTMKKyAgICBTV0FQICAgICAgICUxMiwgJTE1CislZW5kbWFjcm8KKworJW1hY3JvIFRSQU5TUE9TRV84WDhCIDgKKyAgICAlaWYgbW1zaXplID09IDgKKyAgICAgICAgJWVycm9yICJUaGlzIG1hY3JvIGRvZXMgbm90IHN1cHBvcnQgbW1zaXplID09IDgiCisgICAgJWVuZGlmCisgICAgcHVucGNrbGJ3IG0lMSwgbSUyCisgICAgcHVucGNrbGJ3IG0lMywgbSU0CisgICAgcHVucGNrbGJ3IG0lNSwgbSU2CisgICAgcHVucGNrbGJ3IG0lNywgbSU4CisgICAgVFJBTlNQT1NFNHg0VyAlMSwgJTMsICU1LCAlNywgJTIKKyAgICBNT1ZITCBtJTIsIG0lMQorICAgIE1PVkhMIG0lNCwgbSUzCisgICAgTU9WSEwgbSU2LCBtJTUKKyAgICBNT1ZITCBtJTgsIG0lNworJWVuZG1hY3JvCisKIDsgUEFCU1cgbWFjcm8gYXNzdW1lcyAlMSAhPSAlMiwgd2hpbGUgQUJTMS8yIG1hY3JvcyB3b3JrIGluLXBsYWNlCiAlbWFjcm8gUEFCU1cgMgogJWlmIGNwdWZsYWcoc3NzZTMpCkBAIC0yNTcsNyArMzU3LDcgQEAKICVlbmRpZgogJWVuZG1hY3JvCiAKLSVtYWNybyBBQlNCIDIgOyBzb3VyY2UgbW1yZWcsIHRlbXAgbW1yZWcgKHVudXNlZCBmb3Igc3NzZTMpCislbWFjcm8gQUJTQiAyIDsgc291cmNlIG1tcmVnLCB0ZW1wIG1tcmVnICh1bnVzZWQgZm9yIFNTU0UzKQogJWlmIGNwdWZsYWcoc3NzZTMpCiAgICAgcGFic2IgICAlMSwgJTEKICVlbHNlCkBAIC0yODEsNyArMzgxLDcgQEAKICVlbmRpZgogJWVuZG1hY3JvCiAKLSVtYWNybyBBQlNEMl9NTVggNAorJW1hY3JvIEFCU0QyIDQKICAgICBweG9yICAgICUzLCAlMwogICAgIHB4b3IgICAgJTQsICU0CiAgICAgcGNtcGd0ZCAlMywgJTEKQEAgLTM1Nyw2ICs0NTcsMTcgQEAKICVlbmRpZgogJWVuZG1hY3JvCiAKKyVtYWNybyBIQUREUFMgMyA7IGRzdCwgc3JjLCB0bXAKKyVpZiBjcHVmbGFnKHNzZTMpCisgICAgaGFkZHBzICAlMSwgJTEsICUyCislZWxzZQorICAgIG1vdmFwcyAgJTMsICUxCisgICAgc2h1ZnBzICAlMSwgJTIsIHEyMDIwCisgICAgc2h1ZnBzICAlMywgJTIsIHEzMTMxCisgICAgYWRkcHMgICAlMSwgJTMKKyVlbmRpZgorJWVuZG1hY3JvCisKICVtYWNybyBQQUxJR05SIDQtNQogJWlmIGNwdWZsYWcoc3NzZTMpCiAlaWYgJTA9PTUKQEAgLTM2NCw3ICs0NzUsNyBAQAogJWVsc2UKICAgICBwYWxpZ25yICUxLCAlMiwgJTMKICVlbmRpZgotJWVsaWYgY3B1ZmxhZyhtbXgpIDsgW2RzdCxdIHNyYzEsIHNyYzIsIGltbSwgdG1wCislZWxzZSA7IFtkc3QsXSBzcmMxLCBzcmMyLCBpbW0sIHRtcAogICAgICVkZWZpbmUgJSVkc3QgJTEKICVpZiAlMD09NQogJWlmbmlkbiAlMSwgJTIKQEAgLTY4OCw0NSArNzk5LDY4IEBACiAgICAgcG1pbnN3ICUxLCAlMwogJWVuZG1hY3JvCiAKLSVtYWNybyBQTUlOU0RfTU1YIDMgOyBkc3QsIHNyYywgdG1wCislbWFjcm8gUE1JTlNEIDMgOyBkc3QsIHNyYywgdG1wL3VudXNlZAorJWlmIGNwdWZsYWcoc3NlNCkKKyAgICBwbWluc2QgICAgJTEsICUyCislZWxpZiBjcHVmbGFnKHNzZTIpCisgICAgY3Z0ZHEycHMgICUxLCAlMQorICAgIG1pbnBzICAgICAlMSwgJTIKKyAgICBjdnRwczJkcSAgJTEsICUxCislZWxzZQogICAgIG1vdmEgICAgICAlMywgJTIKICAgICBwY21wZ3RkICAgJTMsICUxCiAgICAgcHhvciAgICAgICUxLCAlMgogICAgIHBhbmQgICAgICAlMSwgJTMKICAgICBweG9yICAgICAgJTEsICUyCislZW5kaWYKICVlbmRtYWNybwogCi0lbWFjcm8gUE1BWFNEX01NWCAzIDsgZHN0LCBzcmMsIHRtcAorJW1hY3JvIFBNQVhTRCAzIDsgZHN0LCBzcmMsIHRtcC91bnVzZWQKKyVpZiBjcHVmbGFnKHNzZTQpCisgICAgcG1heHNkICAgICUxLCAlMgorJWVsc2UKICAgICBtb3ZhICAgICAgJTMsICUxCiAgICAgcGNtcGd0ZCAgICUzLCAlMgogICAgIHBhbmQgICAgICAlMSwgJTMKICAgICBwYW5kbiAgICAgJTMsICUyCiAgICAgcG9yICAgICAgICUxLCAlMworJWVuZGlmCiAlZW5kbWFjcm8KIAotJW1hY3JvIENMSVBEX01NWCAzLTQgOyBzcmMvZHN0LCBtaW4sIG1heCwgdG1wCi0gICAgUE1JTlNEX01NWCAlMSwgJTMsICU0Ci0gICAgUE1BWFNEX01NWCAlMSwgJTIsICU0Ci0lZW5kbWFjcm8KLQotJW1hY3JvIENMSVBEX1NTRTIgMy00IDsgc3JjL2RzdCwgbWluIChmbG9hdCksIG1heCAoZmxvYXQpLCB1bnVzZWQKKyVtYWNybyBDTElQRCAzLTQKKyVpZiBjcHVmbGFnKHNzZTQpOyAgc3JjL2RzdCwgbWluLCBtYXgsIHVudXNlZAorICAgIHBtaW5zZCAgJTEsICUzCisgICAgcG1heHNkICAlMSwgJTIKKyVlbGlmIGNwdWZsYWcoc3NlMikgOyBzcmMvZHN0LCBtaW4gKGZsb2F0KSwgbWF4IChmbG9hdCksIHVudXNlZAogICAgIGN2dGRxMnBzICAlMSwgJTEKICAgICBtaW5wcyAgICAgJTEsICUzCiAgICAgbWF4cHMgICAgICUxLCAlMgogICAgIGN2dHBzMmRxICAlMSwgJTEKKyVlbHNlICAgICAgICAgICAgICAgOyBzcmMvZHN0LCBtaW4sIG1heCwgdG1wCisgICAgUE1JTlNEICAgICUxLCAlMywgJTQKKyAgICBQTUFYU0QgICAgJTEsICUyLCAlNAorJWVuZGlmCiAlZW5kbWFjcm8KIAotJW1hY3JvIENMSVBEX1NTRTQxIDMtNCA7ICBzcmMvZHN0LCBtaW4sIG1heCwgdW51c2VkCi0gICAgcG1pbnNkICAlMSwgJTMKLSAgICBwbWF4c2QgICUxLCAlMgotJWVuZG1hY3JvCi0KLSVtYWNybyBWQlJPQURDQVNUU1MgMiA7IGRzdCB4bW0veW1tLCBzcmMgbTMyCi0laWYgY3B1ZmxhZyhhdngpCi0gICAgdmJyb2FkY2FzdHNzICUxLCAlMgotJWVsc2UgOyBzc2UKLSAgICBtb3ZzcyAgICAgICAgJTEsICUyCi0gICAgc2h1ZnBzICAgICAgICUxLCAlMSwgMAorJW1hY3JvIFZCUk9BRENBU1RTUyAyIDsgZHN0IHhtbS95bW0sIHNyYyBtMzIveG1tCislaWYgY3B1ZmxhZyhhdngyKQorICAgIHZicm9hZGNhc3RzcyAgJTEsICUyCislZWxpZiBjcHVmbGFnKGF2eCkKKyAgICAlaWZudW0gc2l6ZW9mJTIgICAgICAgICA7IGF2eDEgcmVnaXN0ZXIKKyAgICAgICAgc2h1ZnBzICB4bW0lMSwgeG1tJTIsIHhtbSUyLCBxMDAwMAorICAgICAgICAlaWYgc2l6ZW9mJTEgPj0gMzIgIDsgbW1zaXplPj0zMgorICAgICAgICAgICAgdmluc2VydGYxMjggICUxLCAlMSwgeG1tJTEsIDEKKyAgICAgICAgJWVuZGlmCisgICAgJWVsc2UgICAgICAgICAgICAgICAgICAgOyBhdngxIG1lbW9yeQorICAgICAgICB2YnJvYWRjYXN0c3MgICUxLCAlMgorICAgICVlbmRpZgorJWVsc2UKKyAgICAlaWZudW0gc2l6ZW9mJTIgICAgICAgICA7IHNzZSByZWdpc3RlcgorICAgICAgICBzaHVmcHMgICUxLCAlMiwgJTIsIHEwMDAwCisgICAgJWVsc2UgICAgICAgICAgICAgICAgICAgOyBzc2UgbWVtb3J5CisgICAgICAgIG1vdnNzICAgJTEsICUyCisgICAgICAgIHNodWZwcyAgJTEsICUxLCAwCisgICAgJWVuZGlmCiAlZW5kaWYKICVlbmRtYWNybwogCkBAIC03NDEsNiArODc1LDI5IEBACiAlZW5kaWYKICVlbmRtYWNybwogCislbWFjcm8gVlBCUk9BRENBU1REIDIgOyBkc3QgeG1tL3ltbSwgc3JjIG0zMi94bW0KKyVpZiBjcHVmbGFnKGF2eDIpCisgICAgdnBicm9hZGNhc3RkICAlMSwgJTIKKyVlbGlmIGNwdWZsYWcoYXZ4KSAmJiBzaXplb2YlMSA+PSAzMgorICAgICVlcnJvciB2cGJyb2FkY2FzdGQgbm90IHBvc3NpYmxlIHdpdGggeW1tIG9uIGF2eDEuIHRyeSB2YnJvYWRjYXN0c3MKKyVlbHNlCisgICAgJWlmbnVtIHNpemVvZiUyICAgICAgICAgOyBzc2UyIHJlZ2lzdGVyCisgICAgICAgIHBzaHVmZCAgJTEsICUyLCBxMDAwMAorICAgICVlbHNlICAgICAgICAgICAgICAgICAgIDsgc3NlIG1lbW9yeQorICAgICAgICBtb3ZkICAgICUxLCAlMgorICAgICAgICBwc2h1ZmQgICUxLCAlMSwgMAorICAgICVlbmRpZgorJWVuZGlmCislZW5kbWFjcm8KKworJW1hY3JvIFZCUk9BRENBU1RJMTI4IDIgOyBkc3QgeG1tL3ltbSwgc3JjIDogMTI4Yml0cyB2YWwKKyVpZiBtbXNpemUgPiAxNgorICAgIHZicm9hZGNhc3RpMTI4ICUxLCAlMgorJWVsc2UKKyAgICBtb3ZhICAgICAgICAgICAlMSwgJTIKKyVlbmRpZgorJWVuZG1hY3JvCisKICVtYWNybyBTSFVGRkxFX01BU0tfVyA4CiAgICAgJXJlcCA4CiAgICAgICAgICVpZiAlMT49MHg4MApAQCAtNzkzLDMgKzk1MCw3OSBAQAogICAgIHBzcmxxICAgJTEsIDgqKCUyKQogJWVuZGlmCiAlZW5kbWFjcm8KKworJW1hY3JvIE1PVkhMIDIgOyBkc3QsIHNyYworJWlmaWRuICUxLCAlMgorICAgIHB1bnBja2hxZHEgJTEsICUyCislZWxpZiBjcHVmbGFnKGF2eCkKKyAgICBwdW5wY2tocWRxICUxLCAlMiwgJTIKKyVlbGlmIGNwdWZsYWcoc3NlNCkKKyAgICBwc2h1ZmQgICAgICUxLCAlMiwgcTMyMzIgOyBwc2h1ZmQgaXMgc2xvdyBvbiBzb21lIG9sZGVyIENQVXMsIHNvIG9ubHkgdXNlIGl0IG9uIG1vcmUgbW9kZXJuIG9uZXMKKyVlbHNlCisgICAgbW92aGxwcyAgICAlMSwgJTIgICAgICAgIDsgbWF5IGNhdXNlIGFuIGludC9mbG9hdCBkb21haW4gdHJhbnNpdGlvbiBhbmQgaGFzIGEgZGVwZW5kZW5jeSBvbiBkc3QKKyVlbmRpZgorJWVuZG1hY3JvCisKKzsgSG9yaXpvbnRhbCBTdW0gb2YgUGFja2VkIFNpbmdsZSBwcmVjaXNpb24gZmxvYXRzCis7IFRoZSByZXN1bHRpbmcgc3VtIGlzIGluIGFsbCBlbGVtZW50cy4KKyVtYWNybyBIU1VNUFMgMiA7IGRzdC9zcmMsIHRtcAorJWlmIGNwdWZsYWcoYXZ4KQorICAgICVpZiBzaXplb2YlMT49MzIgIDsgYXZ4CisgICAgICAgIHZwZXJtMmYxMjggICUyLCAlMSwgJTEsICgwKSoxNisoMSkKKyAgICAgICAgYWRkcHMgICAgICAgJTEsICUyCisgICAgJWVuZGlmCisgICAgc2h1ZnBzICAgICAgJTIsICUxLCAlMSwgcTEwMzIKKyAgICBhZGRwcyAgICAgICAlMSwgJTIKKyAgICBzaHVmcHMgICAgICAlMiwgJTEsICUxLCBxMDMyMQorICAgIGFkZHBzICAgICAgICUxLCAlMgorJWVsc2UgIDsgdGhpcyBmb3JtIGlzIGEgYml0IGZhc3RlciB0aGFuIHRoZSBzaG9ydCBhdngtbGlrZSBlbXVsYXRpb24uCisgICAgbW92YXBzICAgICAgJTIsICUxCisgICAgc2h1ZnBzICAgICAgJTEsICUxLCBxMTAzMgorICAgIGFkZHBzICAgICAgICUxLCAlMgorICAgIG1vdmFwcyAgICAgICUyLCAlMQorICAgIHNodWZwcyAgICAgICUxLCAlMSwgcTAzMjEKKyAgICBhZGRwcyAgICAgICAlMSwgJTIKKyAgICA7IGFsbCAlMSBtZW1iZXJzIHNob3VsZCBiZSBlcXVhbCBmb3IgYXMgbG9uZyBhcyBmbG9hdCBhK2I9PWIrYQorJWVuZGlmCislZW5kbWFjcm8KKworOyBFbXVsYXRlIGJsZW5kdnBzIGlmIG5vdCBhdmFpbGFibGUKKzsKKzsgc3JjX2IgaXMgZGVzdHJveWVkIHdoZW4gdXNpbmcgZW11bGF0aW9uIHdpdGggbG9naWNhbCBvcGVyYW5kcworOyBTU0U0MSBibGVuZHYgaW5zdHJ1Y3Rpb24gaXMgaGFyZCBjb2RlZCB0byB1c2UgeG1tMCBhcyBtYXNrCislbWFjcm8gQkxFTkRWUFMgMyA7IGRzdC9zcmNfYSwgc3JjX2IsIG1hc2sKKyVpZiBjcHVmbGFnKGF2eCkKKyAgICBibGVuZHZwcyAgJTEsICUxLCAlMiwgJTMKKyVlbGlmIGNwdWZsYWcoc3NlNCkKKyAgICAlaWZuaWRuICUzLHhtbTAKKyAgICAgICAgJWVycm9yIHNzZTQxIGJsZW5kdnBzIHVzZXMgeG1tMCBhcyBkZWZhdWx0IDNkIG9wZXJhbmQsIHlvdSB1c2VkICUzCisgICAgJWVuZGlmCisgICAgYmxlbmR2cHMgICUxLCAlMiwgJTMKKyVlbHNlCisgICAgeG9ycHMgICUyLCAlMQorICAgIGFuZHBzICAlMiwgJTMKKyAgICB4b3JwcyAgJTEsICUyCislZW5kaWYKKyVlbmRtYWNybworCis7IEVtdWxhdGUgcGJsZW5kdmIgaWYgbm90IGF2YWlsYWJsZQorOworOyBzcmNfYiBpcyBkZXN0cm95ZWQgd2hlbiB1c2luZyBlbXVsYXRpb24gd2l0aCBsb2dpY2FsIG9wZXJhbmRzCis7IFNTRTQxIGJsZW5kdiBpbnN0cnVjdGlvbiBpcyBoYXJkIGNvZGVkIHRvIHVzZSB4bW0wIGFzIG1hc2sKKyVtYWNybyBQQkxFTkRWQiAzIDsgZHN0L3NyY19hLCBzcmNfYiwgbWFzaworJWlmIGNwdWZsYWcoYXZ4KQorICAgICVpZiBjcHVmbGFnKGF2eCkgJiYgbm90Y3B1ZmxhZyhhdngyKSAmJiBzaXplb2YlMSA+PSAzMgorICAgICAgICAlZXJyb3IgcGJsZW5kYiBub3QgcG9zc2libGUgd2l0aCB5bW0gb24gYXZ4MSwgdHJ5IGJsZW5kdnBzLgorICAgICVlbmRpZgorICAgIHBibGVuZHZiICAlMSwgJTEsICUyLCAlMworJWVsaWYgY3B1ZmxhZyhzc2U0KQorICAgICVpZm5pZG4gJTMseG1tMAorICAgICAgICAlZXJyb3Igc3NlNDEgcGJsZW5kdmQgdXNlcyB4bW0wIGFzIGRlZmF1bHQgM2Qgb3BlcmFuZCwgeW91IHVzZWQgJTMKKyAgICAlZW5kaWYKKyAgICBwYmxlbmR2YiAgJTEsICUyLCAlMworJWVsc2UKKyAgICBweG9yICAlMiwgJTEKKyAgICBwYW5kICAlMiwgJTMKKyAgICBweG9yICAlMSwgJTIKKyVlbmRpZgorJWVuZG1hY3JvCmRpZmYgLS1naXQgYS9saWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5oIGIvbGliYXZ1dGlsL3hnYV9mb250X2RhdGEuaAppbmRleCA1ZTQwZjU0Li42OWRjMzM3IDEwMDY0NAotLS0gYS9saWJhdnV0aWwveGdhX2ZvbnRfZGF0YS5oCisrKyBiL2xpYmF2dXRpbC94Z2FfZm9udF9kYXRhLmgKQEAgLTI5LDcgKzI5LDcgQEAKICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgogCi1leHRlcm4gYXZfZXhwb3J0IGNvbnN0IHVpbnQ4X3QgYXZwcml2X2NnYV9mb250WzIwNDhdOwotZXh0ZXJuIGF2X2V4cG9ydCBjb25zdCB1aW50OF90IGF2cHJpdl92Z2ExNl9mb250WzQwOTZdOworZXh0ZXJuIGF2X2V4cG9ydF9hdnV0aWwgY29uc3QgdWludDhfdCBhdnByaXZfY2dhX2ZvbnRbMjA0OF07CitleHRlcm4gYXZfZXhwb3J0X2F2dXRpbCBjb25zdCB1aW50OF90IGF2cHJpdl92Z2ExNl9mb250WzQwOTZdOwogCiAjZW5kaWYgLyogQVZVVElMX1hHQV9GT05UX0RBVEFfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYXZ1dGlsL3h0ZWEuYyBiL2xpYmF2dXRpbC94dGVhLmMKaW5kZXggMjEzOWFhNS4uZjc4OTJhZiAxMDA2NDQKLS0tIGEvbGliYXZ1dGlsL3h0ZWEuYworKysgYi9saWJhdnV0aWwveHRlYS5jCkBAIC0yNTEsMTA0ICsyNTEsMyBAQAogewogICAgIHh0ZWFfY3J5cHQoY3R4LCBkc3QsIHNyYywgY291bnQsIGl2LCBkZWNyeXB0LCB4dGVhX2xlX2NyeXB0X2VjYik7CiB9Ci0KLSNpZmRlZiBURVNUCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBYVEVBX05VTV9URVNUUyA2Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHh0ZWFfdGVzdF9rZXlbWFRFQV9OVU1fVEVTVFNdWzE2XSA9IHsKLSAgICB7IDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsCi0gICAgICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmIH0sCi0gICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAotICAgICAgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiB9LAotICAgIHsgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywKLSAgICAgIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsIDB4MGMsIDB4MGQsIDB4MGUsIDB4MGYgfSwKLSAgICB7IDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwIH0sCi0gICAgeyAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCB9LAotICAgIHsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgeHRlYV90ZXN0X3B0W1hURUFfTlVNX1RFU1RTXVs4XSA9IHsKLSAgICB7IDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDggfSwKLSAgICB7IDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEgfSwKLSAgICB7IDB4NWEsIDB4NWIsIDB4NmUsIDB4MjcsIDB4ODksIDB4NDgsIDB4ZDcsIDB4N2YgfSwKLSAgICB7IDB4NDEsIDB4NDIsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDggfSwKLSAgICB7IDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEgfSwKLSAgICB7IDB4NzAsIDB4ZTEsIDB4MjIsIDB4NWQsIDB4NmUsIDB4NGUsIDB4NzYsIDB4NTUgfQotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3QgeHRlYV90ZXN0X2N0W1hURUFfTlVNX1RFU1RTXVs4XSA9IHsKLSAgICB7IDB4NDksIDB4N2QsIDB4ZjMsIDB4ZDAsIDB4NzIsIDB4NjEsIDB4MmMsIDB4YjUgfSwKLSAgICB7IDB4ZTcsIDB4OGYsIDB4MmQsIDB4MTMsIDB4NzQsIDB4NDMsIDB4NDEsIDB4ZDggfSwKLSAgICB7IDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEgfSwKLSAgICB7IDB4YTAsIDB4MzksIDB4MDUsIDB4ODksIDB4ZjgsIDB4YjgsIDB4ZWYsIDB4YTUgfSwKLSAgICB7IDB4ZWQsIDB4MjMsIDB4MzcsIDB4NWEsIDB4ODIsIDB4MWEsIDB4OGMsIDB4MmQgfSwKLSAgICB7IDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEsIDB4NDEgfQotfTsKLQotc3RhdGljIHZvaWQgdGVzdF94dGVhKEFWWFRFQSAqY3R4LCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpyZWYsIGludCBsZW4sIHVpbnQ4X3QgKml2LCBpbnQgZGlyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmNyeXB0KShBVlhURUEgKiwgdWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIGludCwgdWludDhfdCAqLCBpbnQpKQotewotICAgIGNyeXB0KGN0eCwgZHN0LCBzcmMsIGxlbiwgaXYsIGRpcik7Ci0gICAgaWYgKG1lbWNtcChkc3QsIHJlZiwgOCpsZW4pKSB7Ci0gICAgICAgIGludCBpOwotICAgICAgICBwcmludGYoIiVzIGZhaWxlZFxuZ290ICAgICAgIiwgdGVzdCk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA4KmxlbjsgaSsrKQotICAgICAgICAgICAgcHJpbnRmKCIlMDJ4ICIsIGRzdFtpXSk7Ci0gICAgICAgIHByaW50ZigiXG5leHBlY3RlZCAiKTsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDgqbGVuOyBpKyspCi0gICAgICAgICAgICBwcmludGYoIiUwMnggIiwgcmVmW2ldKTsKLSAgICAgICAgcHJpbnRmKCJcbiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLX0KLQotaW50IG1haW4odm9pZCkKLXsKLSAgICBBVlhURUEgY3R4OwotICAgIHVpbnQ4X3QgYnVmWzE2XSwgaXZbOF07Ci0gICAgaW50IGksIGo7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3JjWzMyXSA9ICJIZWxsb1dvcmxkSGVsbG9Xb3JsZEhlbGxvV29ybGQiOwotICAgIHVpbnQ4X3QgY3RbMzJdOwotICAgIHVpbnQ4X3QgcGxbMzJdOwotCi0gICAgZm9yIChpID0gMDsgaSA8IFhURUFfTlVNX1RFU1RTOyBpKyspIHsKLSAgICAgICAgYXZfeHRlYV9pbml0KCZjdHgsIHh0ZWFfdGVzdF9rZXlbaV0pOwotCi0gICAgICAgIHRlc3RfeHRlYSgmY3R4LCBidWYsIHh0ZWFfdGVzdF9wdFtpXSwgeHRlYV90ZXN0X2N0W2ldLCAxLCBOVUxMLCAwLCAiZW5jcnlwdGlvbiIsIGF2X3h0ZWFfY3J5cHQpOwotICAgICAgICB0ZXN0X3h0ZWEoJmN0eCwgYnVmLCB4dGVhX3Rlc3RfY3RbaV0sIHh0ZWFfdGVzdF9wdFtpXSwgMSwgTlVMTCwgMSwgImRlY3J5cHRpb24iLCBhdl94dGVhX2NyeXB0KTsKLQotICAgICAgICBmb3IgKGogPSAwOyBqIDwgNDsgaisrKQotICAgICAgICAgICAgQVZfV0wzMigmYnVmWzQqal0sIEFWX1JCMzIoJnh0ZWFfdGVzdF9rZXlbaV1bNCpqXSkpOwotICAgICAgICBhdl94dGVhX2xlX2luaXQoJmN0eCwgYnVmKTsKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IDI7IGorKykgewotICAgICAgICAgICAgQVZfV0wzMigmY3RbNCpqXSwgQVZfUkIzMigmeHRlYV90ZXN0X2N0W2ldWzQqal0pKTsKLSAgICAgICAgICAgIEFWX1dMMzIoJnBsWzQqal0sIEFWX1JCMzIoJnh0ZWFfdGVzdF9wdFtpXVs0KmpdKSk7Ci0gICAgICAgIH0KLSAgICAgICAgdGVzdF94dGVhKCZjdHgsIGJ1ZiwgcGwsIGN0LCAxLCBOVUxMLCAwLCAiZW5jcnlwdGlvbiIsIGF2X3h0ZWFfbGVfY3J5cHQpOwotICAgICAgICB0ZXN0X3h0ZWEoJmN0eCwgYnVmLCBjdCwgcGwsIDEsIE5VTEwsIDEsICJkZWNyeXB0aW9uIiwgYXZfeHRlYV9sZV9jcnlwdCk7Ci0KLSAgICAgICAgLyogZW5jcnlwdCAqLwotICAgICAgICBtZW1jcHkoaXYsICJIQUxMTzEyMyIsIDgpOwotICAgICAgICBhdl94dGVhX2NyeXB0KCZjdHgsIGN0LCBzcmMsIDQsIGl2LCAwKTsKLQotICAgICAgICAvKiBkZWNyeXB0IGludG8gcGwgKi8KLSAgICAgICAgbWVtY3B5KGl2LCAiSEFMTE8xMjMiLCA4KTsKLSAgICAgICAgdGVzdF94dGVhKCZjdHgsIHBsLCBjdCwgc3JjLCA0LCBpdiwgMSwgIkNCQyBkZWNyeXB0aW9uIiwgYXZfeHRlYV9jcnlwdCk7Ci0KLSAgICAgICAgbWVtY3B5KGl2LCAiSEFMTE8xMjMiLCA4KTsKLSAgICAgICAgdGVzdF94dGVhKCZjdHgsIGN0LCBjdCwgc3JjLCA0LCBpdiwgMSwgIkNCQyBpbnBsYWNlIGRlY3J5cHRpb24iLCBhdl94dGVhX2NyeXB0KTsKLSAgICB9Ci0KLSAgICBwcmludGYoIlRlc3QgZW5jcnlwdGlvbi9kZWNyeXB0aW9uIHN1Y2Nlc3MuXG4iKTsKLQotICAgIHJldHVybiAwOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnBvc3Rwcm9jL01ha2VmaWxlIGIvbGlicG9zdHByb2MvTWFrZWZpbGUKaW5kZXggYjliYjRiZS4uMzQzMTcxOSAxMDA2NDQKLS0tIGEvbGlicG9zdHByb2MvTWFrZWZpbGUKKysrIGIvbGlicG9zdHByb2MvTWFrZWZpbGUKQEAgLTEsNiArMSw1IEBACi1pbmNsdWRlICQoU1VCRElSKS4uL2NvbmZpZy5tYWsKLQogTkFNRSA9IHBvc3Rwcm9jCitERVNDID0gRkZtcGVnIHBvc3Rwcm9jZXNzaW5nIGxpYnJhcnkKIEZGTElCUyA9IGF2dXRpbAogCiBIRUFERVJTID0gcG9zdHByb2Nlc3MuaCAgICAgICAgXApkaWZmIC0tZ2l0IGEvbGlicG9zdHByb2MvbGlicG9zdHByb2MudiBiL2xpYnBvc3Rwcm9jL2xpYnBvc3Rwcm9jLnYKaW5kZXggZTY1ZDc2Zi4uMjczODFjNiAxMDA2NDQKLS0tIGEvbGlicG9zdHByb2MvbGlicG9zdHByb2MudgorKysgYi9saWJwb3N0cHJvYy9saWJwb3N0cHJvYy52CkBAIC0xLDQgKzEsNyBAQAotTElCUE9TVFBST0NfJE1BSk9SIHsKLSAgICAgICAgZ2xvYmFsOiBwb3N0cHJvY18qOyBwcF8qOwotICAgICAgICBsb2NhbDogKjsKK0xJQlBPU1RQUk9DX01BSk9SIHsKKyAgICBnbG9iYWw6CisgICAgICAgIHBvc3Rwcm9jXyo7CisgICAgICAgIHBwXyo7CisgICAgbG9jYWw6CisgICAgICAgICo7CiB9OwpkaWZmIC0tZ2l0IGEvbGlicG9zdHByb2MvcG9zdHByb2Nlc3MuYyBiL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzLmMKaW5kZXggM2I4NmY5My4uMWZlZjg3NCAxMDA2NDQKLS0tIGEvbGlicG9zdHByb2MvcG9zdHByb2Nlc3MuYworKysgYi9saWJwb3N0cHJvYy9wb3N0cHJvY2Vzcy5jCkBAIC04OSw2ICs4OSw3IEBACiAjaW5jbHVkZSAicG9zdHByb2Nlc3MuaCIKICNpbmNsdWRlICJwb3N0cHJvY2Vzc19pbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvdXRpbF9hbHRpdmVjLmgiCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvZmZ2ZXJzaW9uLmgiCiBjb25zdCBjaGFyIHBvc3Rwcm9jX2ZmdmVyc2lvbltdID0gIkZGbXBlZyB2ZXJzaW9uICIgRkZNUEVHX1ZFUlNJT047CkBAIC0xMTAsMTAgKzExMSw2IEBACiAgICAgcmV0dXJuIExJQ0VOU0VfUFJFRklYIEZGTVBFR19MSUNFTlNFICsgc2l6ZW9mKExJQ0VOU0VfUFJFRklYKSAtIDE7CiB9CiAKLSNpZiBIQVZFX0FMVElWRUNfSAotI2luY2x1ZGUgPGFsdGl2ZWMuaD4KLSNlbmRpZgotCiAjZGVmaW5lIEdFVF9NT0RFX0JVRkZFUl9TSVpFIDUwMAogI2RlZmluZSBPUFRJT05TX0FSUkFZX1NJWkUgMTAKICNkZWZpbmUgQkxPQ0tfU0laRSA4CkBAIC01NjEsMTAgKzU1OCwxMCBAQAogI2VuZGlmCiAKIHR5cGVkZWYgdm9pZCAoKnBwX2ZuKShjb25zdCB1aW50OF90IHNyY1tdLCBpbnQgc3JjU3RyaWRlLCB1aW50OF90IGRzdFtdLCBpbnQgZHN0U3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVBfU1RPUkVfVCBRUHNbXSwgaW50IFFQU3RyaWRlLCBpbnQgaXNDb2xvciwgUFBDb250ZXh0ICpjMik7CisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IFFQc1tdLCBpbnQgUVBTdHJpZGUsIGludCBpc0NvbG9yLCBQUENvbnRleHQgKmMyKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHBvc3RQcm9jZXNzKGNvbnN0IHVpbnQ4X3Qgc3JjW10sIGludCBzcmNTdHJpZGUsIHVpbnQ4X3QgZHN0W10sIGludCBkc3RTdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgY29uc3QgUVBfU1RPUkVfVCBRUHNbXSwgaW50IFFQU3RyaWRlLCBpbnQgaXNDb2xvciwgcHBfbW9kZSAqdm0sIHBwX2NvbnRleHQgKnZjKQorICAgICAgICBjb25zdCBpbnQ4X3QgUVBzW10sIGludCBRUFN0cmlkZSwgaW50IGlzQ29sb3IsIHBwX21vZGUgKnZtLCBwcF9jb250ZXh0ICp2YykKIHsKICAgICBwcF9mbiBwcCA9IHBvc3RQcm9jZXNzX0M7CiAgICAgUFBDb250ZXh0ICpjPSAoUFBDb250ZXh0ICopdmM7CkBAIC04NzMsOSArODcwLDkgQEAKICAgICB9CiAKICAgICByZWFsbG9jQWxpZ24oKHZvaWQgKiopJmMtPmRlaW50VGVtcCwgMip3aWR0aCszMik7Ci0gICAgcmVhbGxvY0FsaWduKCh2b2lkICoqKSZjLT5ub25CUVBUYWJsZSwgcXBTdHJpZGUqbWJIZWlnaHQqc2l6ZW9mKFFQX1NUT1JFX1QpKTsKLSAgICByZWFsbG9jQWxpZ24oKHZvaWQgKiopJmMtPnN0ZFFQVGFibGUsIHFwU3RyaWRlKm1iSGVpZ2h0KnNpemVvZihRUF9TVE9SRV9UKSk7Ci0gICAgcmVhbGxvY0FsaWduKCh2b2lkICoqKSZjLT5mb3JjZWRRUFRhYmxlLCBtYldpZHRoKnNpemVvZihRUF9TVE9SRV9UKSk7CisgICAgcmVhbGxvY0FsaWduKCh2b2lkICoqKSZjLT5ub25CUVBUYWJsZSwgcXBTdHJpZGUqbWJIZWlnaHQqc2l6ZW9mKGludDhfdCkpOworICAgIHJlYWxsb2NBbGlnbigodm9pZCAqKikmYy0+c3RkUVBUYWJsZSwgcXBTdHJpZGUqbWJIZWlnaHQqc2l6ZW9mKGludDhfdCkpOworICAgIHJlYWxsb2NBbGlnbigodm9pZCAqKikmYy0+Zm9yY2VkUVBUYWJsZSwgbWJXaWR0aCpzaXplb2YoaW50OF90KSk7CiB9CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29udGV4dF90b19uYW1lKHZvaWQgKiBwdHIpIHsKQEAgLTk0Myw3ICs5NDAsNyBAQAogdm9pZCAgcHBfcG9zdHByb2Nlc3MoY29uc3QgdWludDhfdCAqIHNyY1szXSwgY29uc3QgaW50IHNyY1N0cmlkZVszXSwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKiBkc3RbM10sIGNvbnN0IGludCBkc3RTdHJpZGVbM10sCiAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBRUF9TVE9SRV9UICpRUF9zdG9yZSwgIGludCBRUFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCAqUVBfc3RvcmUsICBpbnQgUVBTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICBwcF9tb2RlICp2bSwgIHZvaWQgKnZjLCBpbnQgcGljdF90eXBlKQogewogICAgIGludCBtYldpZHRoID0gKHdpZHRoKzE1KT4+NDsKQEAgLTk3Myw3ICs5NzAsNyBAQAogICAgICAgICBpbnQgaTsKICAgICAgICAgY29uc3QgaW50IGNvdW50PSBGRk1BWChtYkhlaWdodCAqIGFic1FQU3RyaWRlLCBtYldpZHRoKTsKICAgICAgICAgZm9yKGk9MDsgaTwoY291bnQ+PjIpOyBpKyspewotICAgICAgICAgICAgKCh1aW50MzJfdCopYy0+c3RkUVBUYWJsZSlbaV0gPSAoKChjb25zdCB1aW50MzJfdCopUVBfc3RvcmUpW2ldPj4xKSAmIDB4N0Y3RjdGN0Y7CisgICAgICAgICAgICBBVl9XTjMyKGMtPnN0ZFFQVGFibGUgKyAoaTw8MiksIEFWX1JOMzIoUVBfc3RvcmUgKyAoaTw8MikpID4+IDEgJiAweDdGN0Y3RjdGKTsKICAgICAgICAgfQogICAgICAgICBmb3IoaTw8PTI7IGk8Y291bnQ7IGkrKyl7CiAgICAgICAgICAgICBjLT5zdGRRUFRhYmxlW2ldID0gUVBfc3RvcmVbaV0+PjE7CmRpZmYgLS1naXQgYS9saWJwb3N0cHJvYy9wb3N0cHJvY2Vzcy5oIGIvbGlicG9zdHByb2MvcG9zdHByb2Nlc3MuaAppbmRleCAyYjU1ZWQ2Li4zNDhlZTdjIDEwMDY0NAotLS0gYS9saWJwb3N0cHJvYy9wb3N0cHJvY2Vzcy5oCisrKyBiL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzLmgKQEAgLTI4LDcgKzI4LDkgQEAKICAqLwogCiAvKioKLSAqIEBkZWZncm91cCBscHAgTGlicG9zdHByb2MKKyAqIEBkZWZncm91cCBscHAgbGlicG9zdHByb2MKKyAqIFZpZGVvIHBvc3Rwcm9jZXNzaW5nIGxpYnJhcnkuCisgKgogICogQHsKICAqLwogCkBAIC01MSwxMCArNTMsNiBAQAogCiAjZGVmaW5lIFBQX1FVQUxJVFlfTUFYIDYKIAotI2lmIEZGX0FQSV9RUF9UWVBFCi0jZGVmaW5lIFFQX1NUT1JFX1QgaW50OF90IC8vZGVwcmVjYXRlZAotI2VuZGlmCi0KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiB0eXBlZGVmIHZvaWQgcHBfY29udGV4dDsKZGlmZiAtLWdpdCBhL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX2ludGVybmFsLmggYi9saWJwb3N0cHJvYy9wb3N0cHJvY2Vzc19pbnRlcm5hbC5oCmluZGV4IGQxMjhkZmIuLjc2NWZkZWIgMTAwNjQ0Ci0tLSBhL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX2ludGVybmFsLmgKKysrIGIvbGlicG9zdHByb2MvcG9zdHByb2Nlc3NfaW50ZXJuYWwuaApAQCAtMTQ5LDkgKzE0OSw5IEBACiAgICAgREVDTEFSRV9BTElHTkVEKDMyLCB1aW50NjRfdCwgbW14RGNPZmZzZXQpWzY0XTsKICAgICBERUNMQVJFX0FMSUdORUQoMzIsIHVpbnQ2NF90LCBtbXhEY1RocmVzaG9sZClbNjRdOwogCi0gICAgUVBfU1RPUkVfVCAqc3RkUVBUYWJsZTsgICAgICAgLy8vPCB1c2VkIHRvIGZpeCBNUEVHMiBzdHlsZSBxc2NhbGUKLSAgICBRUF9TVE9SRV9UICpub25CUVBUYWJsZTsKLSAgICBRUF9TVE9SRV9UICpmb3JjZWRRUFRhYmxlOworICAgIGludDhfdCAqc3RkUVBUYWJsZTsgICAgICAgLy8vPCB1c2VkIHRvIGZpeCBNUEVHMiBzdHlsZSBxc2NhbGUKKyAgICBpbnQ4X3QgKm5vbkJRUFRhYmxlOworICAgIGludDhfdCAqZm9yY2VkUVBUYWJsZTsKIAogICAgIGludCBRUDsKICAgICBpbnQgbm9uQlFQOwpkaWZmIC0tZ2l0IGEvbGlicG9zdHByb2MvcG9zdHByb2Nlc3NfdGVtcGxhdGUuYyBiL2xpYnBvc3Rwcm9jL3Bvc3Rwcm9jZXNzX3RlbXBsYXRlLmMKaW5kZXggYjAxYmU1OC4uYjBhZGZkMSAxMDA2NDQKLS0tIGEvbGlicG9zdHByb2MvcG9zdHByb2Nlc3NfdGVtcGxhdGUuYworKysgYi9saWJwb3N0cHJvYy9wb3N0cHJvY2Vzc190ZW1wbGF0ZS5jCkBAIC0xMTgsMTIgKzExOCwxMiBAQAogICAgICAgICApOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgImxlYSAoJTIsICUzKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUyLCAlMyksICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgogLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5CiAvLyAgICAgICUxICAgICAgZWF4ICAgICBlYXgrJTIgIGVheCsyJTIgJTErNCUyICBlY3ggICAgIGVjeCslMiAgZWN4KzIlMiAlMSs4JTIgIGVjeCs0JTIKIAogICAgICAgICAibW92cSAoJTIpLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTAsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIFBNQVhVQiglJW1tMSwgJSVtbTQpCkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICAgICAgInBhZGRiICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgogCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsJTMpLCAlJW1tMiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCUzKSwgJSVtbTIgICAgICAgICAgXG5cdCIKICAgICAgICAgUE1BWFVCKCUlbW0yLCAlJW1tNCkKICAgICAgICAgUE1JTlVCKCUlbW0yLCAlJW1tMywgJSVtbTUpCiAgICAgICAgICJwc3ViYiAlJW1tMiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtMTQwLDcgKzE0MCw3IEBACiAgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMywgMiksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiwgJTMsIDIpLCAlJW1tMSAgICAgIFxuXHQiCiAgICAgICAgIFBNQVhVQiglJW1tMSwgJSVtbTQpCiAgICAgICAgIFBNSU5VQiglJW1tMSwgJSVtbTMsICUlbW01KQogICAgICAgICAicHN1YmIgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMywgNCksICUlIlJFR19hIiAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJTMsIDQpLCAlJSJGRl9SRUdfYSJcblx0IgogCiAgICAgICAgICJtb3ZxICglMiwgJTMsIDQpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICBQTUFYVUIoJSVtbTIsICUlbW00KQpAQCAtMTU4LDcgKzE1OCw3IEBACiAgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiksICUlbW0xICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIFBNQVhVQiglJW1tMSwgJSVtbTQpCiAgICAgICAgIFBNSU5VQiglJW1tMSwgJSVtbTMsICUlbW01KQogICAgICAgICAicHN1YmIgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTE2Niw3ICsxNjYsNyBAQAogICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTMpLCAlJW1tMiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUzKSwgJSVtbTIgICAgICAgICBcblx0IgogICAgICAgICBQTUFYVUIoJSVtbTIsICUlbW00KQogICAgICAgICBQTUlOVUIoJSVtbTIsICUlbW0zLCAlJW1tNSkKICAgICAgICAgInBzdWJiICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCkBAIC0xNzQsNyArMTc0LDcgQEAKICAgICAgICAgInBjbXBndGIgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgogCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUzLCAyKSwgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMywgMiksICUlbW0xICAgICAgXG5cdCIKICAgICAgICAgUE1BWFVCKCUlbW0xLCAlJW1tNCkKICAgICAgICAgUE1JTlVCKCUlbW0xLCAlJW1tMywgJSVtbTUpCiAgICAgICAgICJwc3ViYiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtMjA3LDcgKzIwNyw3IEBACiAKICAgICAgICAgOiAiPXIiIChudW1FcSksICI9ciIgKGRjT2spCiAgICAgICAgIDogInIiIChzcmMpLCAiciIgKCh4ODZfcmVnKXN0cmlkZSksICJtIiAoYy0+cFFQYikKLSAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICA6ICIlIkZGX1JFR19hCiAgICAgICAgICk7CiAKICAgICBudW1FcT0gKC1udW1FcSkgJjB4RkY7CkBAIC0yNDgsOSArMjQ4LDkgQEAKICAgICAgICAgInBvciAlJW1tMiwgJSVtbTYgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiLy8gRmlyc3QgTGluZSB0byBGaWx0ZXIKIAogICAgICAgICAibW92cSAoJTAsICUxLCA4KSwgJSVtbTUgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxlYSAoJTAsICUxLCA0KSwgJSUiUkVHX2EiICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZWEgKCUwLCAlMSwgOCksICUlIlJFR19jIiAgICAgICAgICAgICBcblx0IgotICAgICAgICAic3ViICUxLCAlJSJSRUdfYyIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJTAsICUxLCA0KSwgJSUiRkZfUkVHX2EiICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSwgOCksICUlIkZGX1JFR19jIiAgICAgICAgICBcblx0IgorICAgICAgICAic3ViICUxLCAlJSJGRl9SRUdfYyIgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgImFkZCAlMSwgJTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vICUwIHBvaW50cyB0byBsaW5lIDEgbm90IDAKICAgICAgICAgIm1vdnEgKCUwLCAlMSwgOCksICUlbW03ICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICUlbW01LCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtMjc5LDcgKzI3OSw3IEBACiAKICAgICAgICAgIm1vdnEgKCUwLCAlMSwgNCksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiIC8vICAgICAxCiAgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAgICAgMQotICAgICAgICBQQVZHQigoJSVSRUdhKSwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgMTEgICAgICAgIC8yCisgICAgICAgIFBBVkdCKCglJUZGX1JFR2EpLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAvLyAgICAxMSAgICAgICAgLzIKICAgICAgICAgUEFWR0IoKCUwLCAlMSwgMiksICUlbW0yKSAgICAgICAgICAgICAgICAgICAgIC8vICAgMjExICAgICAgICAvNAogICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAyMTEgICAgICAgIC80CiAgICAgICAgICJtb3ZxICglMCksICUlbW00ICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAxCkBAIC0yOTEsMTUgKzI5MSwxNSBAQAogICAgICAgICBQQVZHQiglJW1tNiwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8xIDEgICAgICAgIC8yCiAgICAgICAgICJtb3ZxICUlbW00LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAxCiAgICAgICAgIFBBVkdCKCglMCwlMSwyKSwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAvLyAxIDEgICAgICAgIC8yCi0gICAgICAgIFBBVkdCKCglJVJFR2EsJTEsMiksICUlbW01KSAgICAgICAgICAgICAgICAgICAvLyAgICAgMTEgICAgICAgIC8yCi0gICAgICAgIFBBVkdCKCglJVJFR2EpLCAlJW1tNSkgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAyMTEgLzQKKyAgICAgICAgUEFWR0IoKCUlRkZfUkVHYSwlMSwyKSwgJSVtbTUpICAgICAgICAgICAgICAgIC8vICAgICAxMSAgICAgICAgLzIKKyAgICAgICAgUEFWR0IoKCUlRkZfUkVHYSksICUlbW01KSAgICAgICAgICAgICAgICAgICAgIC8vICAgIDIxMSAvNAogICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiAyMjExIC84CiAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzQyNDIyMTEgLzE2CiAgICAgICAgICJtb3ZxICUlbW0zLCAoJTAsJTEpICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAgWAogICAgICAgICAvLyBtbTE9MiBtbTI9MygyMTEpIG1tND0xIG1tNT00KDIxMSkgbW02PTAgbW03PTkKICAgICAgICAgUEFWR0IoJSVtbTQsICUlbW02KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8xMSAgICAgICAgLzIKLSAgICAgICAgIm1vdnEgKCUlIlJFR19jIiksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vICAgICAgIDEKLSAgICAgICAgUEFWR0IoKCUlUkVHYSwgJTEsIDIpLCAlJW1tMCkgICAgICAgICAgICAgICAgIC8vICAgICAgMTEvMgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2MiKSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLy8gICAgICAgMQorICAgICAgICBQQVZHQigoJSVGRl9SRUdhLCAlMSwgMiksICUlbW0wKSAgICAgICAgICAgICAgLy8gICAgICAxMS8yCiAgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAgICAgIDExLzIKICAgICAgICAgUEFWR0IoJSVtbTEsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAyICAgMTEvNAogICAgICAgICBQQVZHQiglJW1tNiwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8yMjIgICAxMS84CkBAIC0zMDcsMTcgKzMwNywxNyBAQAogICAgICAgICAibW92cSAoJTAsICUxLCAyKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAxCiAgICAgICAgICJtb3ZxICUlbW0wLCAoJTAsICUxLCAyKSAgICAgICAgICAgICAgICBcblx0IiAvLyAgIFgKICAgICAgICAgLy8gbW0xPTIgbW0yPTMgbW0zPTYoMTEpIG1tND0xIG1tNT00KDIxMSkgbW02PTAoMTEpIG1tNz05Ci0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCA0KSwgJSVtbTAgICAgICAgICBcblx0IiAvLyAgICAgICAgMQotICAgICAgICBQQVZHQigoJSVSRUdjKSwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgMTEgICAgICAgIC8yCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSVtbTAgICAgICBcblx0IiAvLyAgICAgICAgMQorICAgICAgICBQQVZHQigoJSVGRl9SRUdjKSwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgMTEgICAgICAgIC8yCiAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLzExICAgICAxMSAgICAgICAgLzQKICAgICAgICAgUEFWR0IoJSVtbTEsICUlbW00KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExICAgICAgICAgICAgICAgIC8yCiAgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMTEgICAgICAgICAgICAgICAgLzIKICAgICAgICAgUEFWR0IoJSVtbTEsICUlbW02KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vMTEyMiAgIDExICAgICAgICAvOAogICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8xMTIyNDIyMTEgICAgICAgIC8xNgotICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTUgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAgMQotICAgICAgICAibW92cSAlJW1tNiwgKCUlIlJFR19hIikgICAgICAgICAgICAgICAgXG5cdCIgLy8gICAgWAorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiKSwgJSVtbTUgICAgICAgICAgICAgXG5cdCIgLy8gICAgMQorICAgICAgICAibW92cSAlJW1tNiwgKCUlIkZGX1JFR19hIikgICAgICAgICAgICAgXG5cdCIgLy8gICAgWAogICAgICAgICAvLyBtbTA9NygxMSkgbW0xPTIoMTEpIG1tMj0zIG1tMz02KDExKSBtbTQ9MSgxMSkgbW01PTQgbW03PTkKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJW1tNiAgICAgICAgIFxuXHQiIC8vICAgICAgICAxCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSVtbTYgICAgICBcblx0IiAvLyAgICAgICAgMQogICAgICAgICBQQVZHQiglJW1tNywgJSVtbTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIDExICAgICAgICAvMgogICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTEgICAgIDExICAgICAgICAvNAogICAgICAgICBQQVZHQiglJW1tMywgJSVtbTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTEgICAyMjExICAgICAgICAvOApAQCAtMzMwLDI5ICszMzAsMjkgQEAKICAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxMSAgICAgMiAgICAgICAgLzQKICAgICAgICAgUEFWR0IoJSVtbTQsICUlbW01KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIDExICAgICAgICAgICAgICAgIC8yCiAgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAxMSAxMSAgICAgICAgLzQKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tNiAgICAgICAgIFxuXHQiIC8vICAgICAgMQorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSwgMiksICUlbW02ICAgICAgXG5cdCIgLy8gICAgICAxCiAgICAgICAgIFBBVkdCKCUlbW02LCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMTEgIDQgIDIgICAgICAgIC84CiAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMTEyMjQyMjIgICAgICAgIC8xNgotICAgICAgICAibW92cSAlJW1tMSwgKCUlIlJFR19hIiwgJTEsIDIpICAgICAgICAgXG5cdCIgLy8gICAgICBYCisgICAgICAgICJtb3ZxICUlbW0xLCAoJSUiRkZfUkVHX2EiLCAlMSwgMikgICAgICBcblx0IiAvLyAgICAgIFgKICAgICAgICAgLy8gbW0yPTMoMTEyKSBtbTM9NigxMSkgbW00PTUgbW01PTQoMTEpIG1tNj02IG1tNz05Ci0gICAgICAgIFBBVkdCKCglJVJFR2MpLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDExMiA0ICAgICAgICAvOAotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgNCksICUlbW0wICAgICAgICAgXG5cdCIgLy8gICAgICAgIDEKKyAgICAgICAgUEFWR0IoKCUlRkZfUkVHYyksICUlbW0yKSAgICAgICAgICAgICAgICAgICAgIC8vICAgMTEyIDQgICAgICAgIC84CisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSVtbTAgICAgICBcblx0IiAvLyAgICAgICAgMQogICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAxIDEgICAgICAgIC8yCiAgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIDEgMTIgICAgICAgIC80CiAgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDExMjI0MjQgICAgICAgIC80Ci0gICAgICAgICJtb3ZxICUlbW02LCAoJSUiUkVHX2MiKSAgICAgICAgICAgICAgICBcblx0IiAvLyAgICAgICBYCisgICAgICAgICJtb3ZxICUlbW02LCAoJSUiRkZfUkVHX2MiKSAgICAgICAgICAgICBcblx0IiAvLyAgICAgICBYCiAgICAgICAgIC8vIG1tMD04IG1tMz02KDExKSBtbTQ9NSBtbTU9NCgxMSkgbW03PTkKICAgICAgICAgUEFWR0IoJSVtbTcsICUlbW01KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIDExICAgMiAgICAgICAgLzQKICAgICAgICAgUEFWR0IoJSVtbTcsICUlbW01KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIDExICAgNiAgICAgICAgLzgKIAogICAgICAgICBQQVZHQiglJW1tMywgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAxMTIgICAgICAgIC80CiAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAxMTIyNDYgICAgICAgIC8xNgotICAgICAgICAibW92cSAlJW1tNSwgKCUlIlJFR19hIiwgJTEsIDQpICAgICAgICAgXG5cdCIgLy8gICAgICAgIFgKKyAgICAgICAgIm1vdnEgJSVtbTUsICglJSJGRl9SRUdfYSIsICUxLCA0KSAgICAgIFxuXHQiIC8vICAgICAgICBYCiAgICAgICAgICJzdWIgJTEsICUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogCiAgICAgICAgIDoKICAgICAgICAgOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKSwgIm0iIChjLT5wUVBiKQotICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfYworICAgICAgICA6ICIlIkZGX1JFR19hLCAiJSJGRl9SRUdfYwogICAgICk7CiAjZWxzZSAvL1RFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVwogICAgIGNvbnN0IGludCBsMT0gc3RyaWRlOwpAQCAtNDExLDE4ICs0MTEsMTggQEAKIAogICAgIF9fYXNtX18gdm9sYXRpbGUoCiAgICAgICAgICJweG9yICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAwCi0gICAgICAgICJsZWEgKCUwLCAlMSksICUlIlJFR19hIiAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGVhICglJSJSRUdfYSIsICUxLCA0KSwgJSUiUkVHX2MiICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiRkZfUkVHX2EiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJTEsIDQpLCAlJSJGRl9SRUdfYyJcblx0IgogLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5CiAvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlY3ggICAgIGVjeCslMSAgZWN4KzIlMSAlMCs4JTEgIGVjeCs0JTEKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMCAgICAgICAgIFxuXHQiIC8vIGxpbmUgMworICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSwgMiksICUlbW0wICAgICAgXG5cdCIgLy8gbGluZSAzCiAgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDQKICAgICAgICAgIm1vdnEgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgNAogICAgICAgICAicHN1YnVzYiAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzdWJ1c2IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwb3IgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyB8bDIgLSBsM3wKLSAgICAgICAgIm1vdnEgKCUlIlJFR19jIiksICUlbW0zICAgICAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgNQotICAgICAgICAibW92cSAoJSUiUkVHX2MiLCAlMSksICUlbW00ICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA2CisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYyIpLCAlJW1tMyAgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDUKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19jIiwgJTEpLCAlJW1tNCAgICAgICAgIFxuXHQiIC8vIGxpbmUgNgogICAgICAgICAibW92cSAlJW1tMywgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA1CiAgICAgICAgICJwc3VidXNiICUlbW00LCAlJW1tMyAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHN1YnVzYiAlJW1tNSwgJSVtbTQgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTQ1NCw0NCArNDU0LDQ0IEBACiAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMCwgKCUwLCAlMSwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA0CiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19jIiksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgNQorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2MiKSwgJSVtbTAgICAgICAgICAgICAgXG5cdCIgLy8gbGluZSA1CiAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyhsNCAtIGw1KSA8PSAwID8gLWw1LTEgOiBsNQogICAgICAgICAicGFkZHVzYiAlJW1tMywgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2MiKSAgICAgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDUKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJGRl9SRUdfYyIpICAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgNQogCiAgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkLzQKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0wICAgICAgICAgXG5cdCIgLy8gbGluZSAzCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCAyKSwgJSVtbTAgICAgICBcblx0IiAvLyBsaW5lIDMKICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vKGw0IC0gbDUpIDw9IDAgPyAtbDQtMSA6IGw0CiAgICAgICAgICJwc3VidXNiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfYSIsICUxLCAyKSAgICAgICAgIFxuXHQiIC8vIGxpbmUgMworICAgICAgICAibW92cSAlJW1tMCwgKCUlIkZGX1JFR19hIiwgJTEsIDIpICAgICAgXG5cdCIgLy8gbGluZSAzCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19jIiwgJTEpLCAlJW1tMCAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgNgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2MiLCAlMSksICUlbW0wICAgICAgICAgXG5cdCIgLy8gbGluZSA2CiAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyhsNCAtIGw1KSA8PSAwID8gLWw1LTEgOiBsNQogICAgICAgICAicGFkZHVzYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2MiLCAlMSkgICAgICAgICAgICBcblx0IiAvLyBsaW5lIDYKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJGRl9SRUdfYyIsICUxKSAgICAgICAgIFxuXHQiIC8vIGxpbmUgNgogCiAgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkLzgKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSksICUlbW0wICAgICAgICAgICAgXG5cdCIgLy8gbGluZSAyCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxKSwgJSVtbTAgICAgICAgICBcblx0IiAvLyBsaW5lIDIKICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vKGw0IC0gbDUpIDw9IDAgPyAtbDItMSA6IGwyCiAgICAgICAgICJwc3VidXNiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHhvciAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfYSIsICUxKSAgICAgICAgICAgIFxuXHQiIC8vIGxpbmUgMgorICAgICAgICAibW92cSAlJW1tMCwgKCUlIkZGX1JFR19hIiwgJTEpICAgICAgICAgXG5cdCIgLy8gbGluZSAyCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19jIiwgJTEsIDIpLCAlJW1tMCAgICAgICAgIFxuXHQiIC8vIGxpbmUgNworICAgICAgICAibW92cSAoJSUiRkZfUkVHX2MiLCAlMSwgMiksICUlbW0wICAgICAgXG5cdCIgLy8gbGluZSA3CiAgICAgICAgICJweG9yICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyhsNCAtIGw1KSA8PSAwID8gLWw3LTEgOiBsNwogICAgICAgICAicGFkZHVzYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInB4b3IgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2MiLCAlMSwgMikgICAgICAgICBcblx0IiAvLyBsaW5lIDcKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJGRl9SRUdfYyIsICUxLCAyKSAgICAgIFxuXHQiIC8vIGxpbmUgNwogCiAgICAgICAgIDoKICAgICAgICAgOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKSwgIm0iIChjby0+cFFQYikKICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYjAxKQotICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfYworICAgICAgICA6ICIlIkZGX1JFR19hLCAiJSJGRl9SRUdfYwogICAgICk7CiAjZWxzZSAvL1RFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVwogCkBAIC01NTMsOCArNTUzLDggQEAKIAogI2lmIDAgLy9zbGlnaHRseSBtb3JlIGFjY3VyYXRlIGFuZCBzbGlnaHRseSBzbG93ZXIKICAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDAKLSAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfYyIgICAgICBcblx0IgorICAgICAgICAibGVhICglMCwgJTEpLCAlJSJGRl9SRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2EiLCAlMSwgNCksICUlIkZGX1JFR19jIlxuXHQiCiAvLyAgICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNwogLy8gICAgICAlMCAgICAgICUwKyUxICAgJTArMiUxICBlYXgrMiUxICUwKzQlMSAgZWF4KzQlMSBlY3grJTEgIGVjeCsyJTEKIC8vICAgICAgJTAgICAgICBlYXggICAgIGVheCslMSAgZWF4KzIlMSAlMCs0JTEgIGVjeCAgICAgZWN4KyUxICBlY3grMiUxCkBAIC01NjcsOCArNTY3LDggQEAKICAgICAgICAgUEFWR0IoJSVtbTEsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH4obDIgKyAybDApLzQKICAgICAgICAgUEFWR0IoJSVtbTIsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH4oNWwyICsgMmwwKS84CiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiIC8vIGwxCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCAyKSwgJSVtbTMgICAgICAgICBcblx0IiAvLyBsMworICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLy8gbDEKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiwgJTEsIDIpLCAlJW1tMyAgICAgIFxuXHQiIC8vIGwzCiAgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBsMQogICAgICAgICBQQVZHQiglJW1tNywgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfmwxLzIKICAgICAgICAgUEFWR0IoJSVtbTMsICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH4obDEgKyAybDMpLzQKQEAgLTU4Niw3ICs1ODYsNyBAQAogICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfihsNCArIDJsMikvNAogICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfig1bDQgKyAybDIpLzgKIAotICAgICAgICAibW92cSAoJSUiUkVHX2MiKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDUKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19jIiksICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8vIGw1CiAgICAgICAgICJtb3ZxICUlbW0zLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBsMwogICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfmwzLzIKICAgICAgICAgUEFWR0IoJSVtbTIsICUlbW0zKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH4obDMgKyAybDUpLzQKQEAgLTU5OSwxMyArNTk5LDEzIEBACiAgICAgICAgICJwY21wZXFiICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBTSUdOKDJsMiAtIDVsMyArIDVsNCAtIDJsNSkKIC8vIG1tMD0gU0lHTihtZW5lcmd5KSwgbW0xPSB8bGVuZXJneXwsIG1tMj0gbDUsIG1tMz0gfG1lbmVyZ3l8LCBtbTQ9bDQsIG1tNT0gbDMsIG1tNz0wCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19jIiwgJTEpLCAlJW1tNiAgICAgICAgICAgIFxuXHQiIC8vIGw2CisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYyIsICUxKSwgJSVtbTYgICAgICAgICBcblx0IiAvLyBsNgogICAgICAgICAibW92cSAlJW1tNiwgJSVtbTUgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDYKICAgICAgICAgUEFWR0IoJSVtbTcsICUlbW02KSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH5sNi8yCiAgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGw2ICsgMmw0KS80CiAgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tNikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KDVsNiArIDJsNCkvOAogCi0gICAgICAgICJtb3ZxICglJSJSRUdfYyIsICUxLCAyKSwgJSVtbTUgICAgICAgICBcblx0IiAvLyBsNworICAgICAgICAibW92cSAoJSUiRkZfUkVHX2MiLCAlMSwgMiksICUlbW01ICAgICAgXG5cdCIgLy8gbDcKICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGw1CiAgICAgICAgIFBBVkdCKCUlbW03LCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+bDUvMgogICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfihsNSArIDJsNykvNApAQCAtNjMyLDcgKzYzMiw3IEBACiAgICAgICAgICJwYWRkdXNiICUlbW0xLCAlJW1tMyAgICAgICAgICAgICAgICAgICBcblx0IgogLy8gICAgICAgICJwYWRkdXNiICJNQU5HTEUoYjAxKSIsICUlbW0zICAgICAgICAgICBcblx0IgogCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCAyKSwgJSVtbTYgICAgICAgICBcblx0IiAvL2wzCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCAyKSwgJSVtbTYgICAgICBcblx0IiAvL2wzCiAgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tNSAgICAgICAgICAgICAgICBcblx0IiAvL2w0CiAgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tNCAgICAgICAgICAgICAgICBcblx0IiAvL2w0CiAgICAgICAgICJwc3VidXNiICUlbW02LCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtNjQ2LDcgKzY0Niw3IEBACiAgICAgICAgICJwc3VidXNiICJNQU5HTEUoYjAxKSIsICUlbW0zICAgICAgICAgICBcblx0IgogICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCAyKSwgJSVtbTAgICAgICBcblx0IgogICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInB4b3IgJSVtbTYsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJweG9yICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtNjU0LDM2ICs2NTQsMzYgQEAKICAgICAgICAgInBhZGRiICUlbW0zLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJweG9yICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHhvciAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfYSIsICUxLCAyKSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJSUiRkZfUkVHX2EiLCAlMSwgMikgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlMSwgNCkgICAgICAgICAgICAgICAgXG5cdCIKICNlbmRpZiAvLzAKIAotICAgICAgICAibGVhICglMCwgJTEpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiRkZfUkVHX2EiICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwY21wZXFiICUlbW02LCAlJW1tNiAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAtMQogLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcKIC8vICAgICAgJTAgICAgICAlMCslMSAgICUwKzIlMSAgZWF4KzIlMSAlMCs0JTEgIGVheCs0JTEgZWN4KyUxICBlY3grMiUxCiAvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlY3ggICAgIGVjeCslMSAgZWN4KzIlMQogCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMSAgICAgICAgIFxuXHQiIC8vIGwzCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCAyKSwgJSVtbTEgICAgICBcblx0IiAvLyBsMwogICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDQKICAgICAgICAgInB4b3IgJSVtbTYsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIC1sMy0xCiAgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAtcSsxMjggPSAobDQtbDMrMjU2KS8yCiAvLyBtbTE9LWwzLTEsIG1tMD0xMjgtcQogCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCA0KSwgJSVtbTIgICAgICAgICBcblx0IiAvLyBsNQotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSksICUlbW0zICAgICAgICAgICAgXG5cdCIgLy8gbDIKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiwgJTEsIDQpLCAlJW1tMiAgICAgIFxuXHQiIC8vIGw1CisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxKSwgJSVtbTMgICAgICAgICBcblx0IiAvLyBsMgogICAgICAgICAicHhvciAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gLWw1LTEKICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW01ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIC1sNS0xCiAgICAgICAgICJtb3ZxICJNQU5HTEUoYjgwKSIsICUlbW00ICAgICAgICAgICAgICBcblx0IiAvLyAxMjgKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMSwgNCksICUlIlJFR19jIiAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJTEsIDQpLCAlJSJGRl9SRUdfYyJcblx0IgogICAgICAgICBQQVZHQiglJW1tMywgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGwyLWw1KzI1NikvMgogICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTQpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfihsNC1sMykvNCArIDEyOAogICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTQpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfihsMi1sNSkvNCArKGw0LWwzKS84ICsgMTI4CiAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGwyLWw1KS84ICs1KGw0LWwzKS8xNiArIDEyOAogLy8gbW0xPS1sMy0xLCBtbTA9MTI4LXEsIG1tMz1sMiwgbW00PW1lbmVyZ3kvMTYgKyAxMjgsIG1tNT0gLWw1LTEKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gbDEKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiksICUlbW0yICAgICAgICAgICAgIFxuXHQiIC8vIGwxCiAgICAgICAgICJweG9yICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAtbDEtMQogICAgICAgICBQQVZHQiglJW1tMywgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGwyLWwxKzI1NikvMgogICAgICAgICBQQVZHQigoJTApLCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGwwLWwzKzI1NikvMgpAQCAtNjkzLDggKzY5Myw4IEBACiAgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB+KGwwLWwzKS84ICs1KGwyLWwxKS8xNiArIDEyOAogLy8gbW0wPTEyOC1xLCBtbTM9bGVuZXJneS8xNiArIDEyOCwgbW00PSBtZW5lcmd5LzE2ICsgMTI4LCBtbTU9IC1sNS0xCiAKLSAgICAgICAgUEFWR0IoKCUlUkVHYywgJTEpLCAlJW1tNSkgICAgICAgICAgICAgICAgICAgIC8vIChsNi1sNSsyNTYpLzIKLSAgICAgICAgIm1vdnEgKCUlIlJFR19jIiwgJTEsIDIpLCAlJW1tMSAgICAgICAgIFxuXHQiIC8vIGw3CisgICAgICAgIFBBVkdCKCglJUZGX1JFR2MsICUxKSwgJSVtbTUpICAgICAgICAgICAgICAgICAvLyAobDYtbDUrMjU2KS8yCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYyIsICUxLCAyKSwgJSVtbTEgICAgICBcblx0IiAvLyBsNwogICAgICAgICAicHhvciAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gLWw3LTEKICAgICAgICAgUEFWR0IoKCUwLCAlMSwgNCksICUlbW0xKSAgICAgICAgICAgICAgICAgICAgIC8vIChsNC1sNysyNTYpLzIKICAgICAgICAgIm1vdnEgIk1BTkdMRShiODApIiwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8vIDEyOApAQCAtNzQzLDcgKzc0Myw3IEBACiAgICAgICAgICJweG9yICUlbW0xLCAlJW1tNyAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBTSUdOKGQqcSkKIAogICAgICAgICAicGFuZCAlJW1tNywgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMCAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCAyKSwgJSVtbTAgICAgICBcblx0IgogICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInB4b3IgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJweG9yICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtNzUxLDEzICs3NTEsMTMgQEAKICAgICAgICAgInBzdWJiICUlbW00LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJweG9yICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHhvciAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfYSIsICUxLCAyKSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJSUiRkZfUkVHX2EiLCAlMSwgMikgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlMSwgNCkgICAgICAgICAgICAgICAgXG5cdCIKIAogICAgICAgICA6CiAgICAgICAgIDogInIiIChzcmMpLCAiciIgKCh4ODZfcmVnKXN0cmlkZSksICJtIiAoYy0+cFFQYikKICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYjgwLGIwMCxiMDEpCi0gICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19jCisgICAgICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19jCiAgICAgKTsKIAogLyoKQEAgLTgzMCwxMiArODMwLDEyIEBACiAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IiAvLyBoaWdoIHBhcnQgb2YgbGluZSAwCiAKICAgICAgICAgIm1vdnEgKCUwLCAlMSksICUlbW0yICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZWEgKCUwLCAlMSwgMiksICUlIlJFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglMCwgJTEsIDIpLCAlJSJGRl9SRUdfYSIgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IiAvLyBsb3cgcGFydCBvZiBsaW5lIDEKICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGhpZ2ggcGFydCBvZiBsaW5lIDEKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTQgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiksICUlbW00ICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tNCAgICAgICAgICAgICAgICAgXG5cdCIgLy8gbG93IHBhcnQgb2YgbGluZSAyCiAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW01ICAgICAgICAgICAgICAgICBcblx0IiAvLyBoaWdoIHBhcnQgb2YgbGluZSAyCkBAIC04NTIsNyArODUyLDcgQEAKICAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMCAtIDVMMSArIDVMMgogICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgwIC0gNUgxICsgNUgyCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEpLCAlJW1tMiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxKSwgJSVtbTIgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwzCiAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0zICAgICAgICAgICAgICAgICBcblx0IiAvLyBIMwpAQCAtODY0LDcgKzg2NCw3IEBACiAgICAgICAgICJtb3ZxICUlbW0wLCAoJTMpICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDAgLSA1TDEgKyA1TDIgLSAyTDMKICAgICAgICAgIm1vdnEgJSVtbTEsIDgoJTMpICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMCAtIDVIMSArIDVIMiAtIDJIMwogCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCAyKSwgJSVtbTAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSwgMiksICUlbW0wICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IiAvLyBMNAogICAgICAgICAicHVucGNraGJ3ICUlbW03LCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIgLy8gSDQKQEAgLTg3OCw3ICs4NzgsNyBAQAogICAgICAgICAicHN1YncgJSVtbTIsICUlbW00ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwyIC0gTDMgKyBMNAogICAgICAgICAicHN1YncgJSVtbTMsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgyIC0gSDMgKyBINAogCi0gICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEpLCAlMCAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsICUxKSwgJTAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzbGx3ICQyLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDRMMyAtIDRMNAogICAgICAgICAicHNsbHcgJDIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gNEgzIC0gNEg0CiAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDIgLSA1TDMgKyA1TDQKQEAgLTg5MywxMCArODkzLDEwIEBACiAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDIgLSA1TDMgKyA1TDQgLSAyTDUKICAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMiAtIDVIMyArIDVINCAtIDJINQogCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCA0KSwgJSVtbTYgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSwgNCksICUlbW02ICAgICAgXG5cdCIKICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw2CiAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMNSAtIEw2Ci0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCA0KSwgJSVtbTYgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSwgNCksICUlbW02ICAgICAgXG5cdCIKICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEg2CiAgICAgICAgICJwc3VidyAlJW1tNiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBINSAtIEg2CiAKQEAgLTEwNDUsNyArMTA0NSw3IEBACiAgICAgICAgIDogIityIiAoc3JjKQogICAgICAgICA6ICJyIiAoKHg4Nl9yZWcpc3RyaWRlKSwgIm0iIChjLT5wUVBiKSwgInIiKHRtcCkKICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQodzA1LHcyMCkKLSAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICA6ICIlIkZGX1JFR19hCiAgICAgKTsKICNlbHNlIC8vVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCiAgICAgY29uc3QgaW50IGwxPSBzdHJpZGU7CkBAIC0xMTA0LDggKzExMDQsOCBAQAogICAgICAgICAicGFja3Vzd2IgJSVtbTAsICUlbW0wICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTAsICUzICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfZCIgICAgICBcblx0IgorICAgICAgICAibGVhICglMCwgJTEpLCAlJSJGRl9SRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2EiLCAlMSwgNCksICUlIkZGX1JFR19kIlxuXHQiCiAKIC8vICAgICAgICAwICAgICAgICAxICAgICAgICAyICAgICAgICAzICAgICAgICA0ICAgICAgICA1ICAgICAgICA2ICAgICAgICA3ICAgICAgICA4ICAgICAgICA5CiAvLyAgICAgICAgJTAgICAgICAgIGVheCAgICAgICAgZWF4KyUxICAgICAgICBlYXgrMiUxICAgICAgICAlMCs0JTEgICAgICAgIGVkeCAgICAgICAgZWR4KyUxICAgICAgICBlZHgrMiUxICAgICAgICAlMCs4JTEgICAgICAgIGVkeCs0JTEKQEAgLTExMjgsMTMgKzExMjgsMTMgQEAKICNlbmRpZgogI2RlZmluZSBGSU5EX01JTl9NQVgoYWRkcikgIFJFQUxfRklORF9NSU5fTUFYKGFkZHIpCiAKLUZJTkRfTUlOX01BWCgoJSVSRUdhKSkKLUZJTkRfTUlOX01BWCgoJSVSRUdhLCAlMSkpCi1GSU5EX01JTl9NQVgoKCUlUkVHYSwgJTEsIDIpKQorRklORF9NSU5fTUFYKCglJUZGX1JFR2EpKQorRklORF9NSU5fTUFYKCglJUZGX1JFR2EsICUxKSkKK0ZJTkRfTUlOX01BWCgoJSVGRl9SRUdhLCAlMSwgMikpCiBGSU5EX01JTl9NQVgoKCUwLCAlMSwgNCkpCi1GSU5EX01JTl9NQVgoKCUlUkVHZCkpCi1GSU5EX01JTl9NQVgoKCUlUkVHZCwgJTEpKQotRklORF9NSU5fTUFYKCglJVJFR2QsICUxLCAyKSkKK0ZJTkRfTUlOX01BWCgoJSVGRl9SRUdkKSkKK0ZJTkRfTUlOX01BWCgoJSVGRl9SRUdkLCAlMSkpCitGSU5EX01JTl9NQVgoKCUlRkZfUkVHZCwgJTEsIDIpKQogRklORF9NSU5fTUFYKCglMCwgJTEsIDgpKQogCiAgICAgICAgICJtb3ZxICUlbW03LCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtMTE4NCwxMCArMTE4NCwxMCBAQAogI2VuZGlmCiAgICAgICAgICJtb3ZxICUlbW02LCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBtYXgKICAgICAgICAgInBzdWJiICUlbW03LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIG1heCAtIG1pbgotICAgICAgICAicHVzaCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZkICUlbW02LCAlazQgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiY21wYiAiTUFOR0xFKGRlcmluZ1RocmVzaG9sZCkiLCAlYjQgICAgXG5cdCIKLSAgICAgICAgInBvcCAlNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVzaCAlJSJGRl9SRUdfYSIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTYsICUlZWF4ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJjbXBiICJNQU5HTEUoZGVyaW5nVGhyZXNob2xkKSIsICUlYWwgICBcblx0IgorICAgICAgICAicG9wICUlIkZGX1JFR19hIiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIiBqYiAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tNykgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhPShtYXggKyBtaW4pLzIKICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgIFxuXHQiCkBAIC0xMjE4LDEzICsxMjE4LDEzIEBACiAgICAgICAgICJwYWRkYiAlJW1tMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZGIgJSVtbTMsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDExCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIpLCAlJW1tMiAgICAgICAgICAgICBcblx0IiAvLyBMMTEKICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwxMQogICAgICAgICAibW92cSAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDExCiAgICAgICAgICJwc2xscSAkOCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHNybHEgJDgsICUlbW00ICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdmQgLTQoJSUiUkVHX2EiKSwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZkIDgoJSUiUkVHX2EiKSwgJSVtbTYgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAtNCglJSJGRl9SRUdfYSIpLCAlJW1tNSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgOCglJSJGRl9SRUdfYSIpLCAlJW1tNiAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3JscSAkMjQsICUlbW01ICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHNsbHEgJDU2LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBvciAlJW1tNSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwMQpAQCAtMTMwNCwyMCArMTMwNCwyMCBAQAogMTExMDExMQogCiAqLwotLy9ERVJJTkdfQ09SRShkc3QgICAgICAgICAgLHNyYyAgICAgICAgICAgICxwcHN4ICxwc3ggICxzeCAgICxwcGx4ICxwbHggICxseCAgICx0MCAgICx0MSkKLURFUklOR19DT1JFKCglJVJFR2EpICAgICAgICwoJSVSRUdhLCAlMSkgICAsJSVtbTAsJSVtbTIsJSVtbTQsJSVtbTEsJSVtbTMsJSVtbTUsJSVtbTYsJSVtbTcpCi1ERVJJTkdfQ09SRSgoJSVSRUdhLCAlMSkgICAsKCUlUkVHYSwgJTEsIDIpLCUlbW0yLCUlbW00LCUlbW0wLCUlbW0zLCUlbW01LCUlbW0xLCUlbW02LCUlbW03KQotREVSSU5HX0NPUkUoKCUlUkVHYSwgJTEsIDIpLCglMCwgJTEsIDQpICAgICwlJW1tNCwlJW1tMCwlJW1tMiwlJW1tNSwlJW1tMSwlJW1tMywlJW1tNiwlJW1tNykKLURFUklOR19DT1JFKCglMCwgJTEsIDQpICAgICwoJSVSRUdkKSAgICAgICAsJSVtbTAsJSVtbTIsJSVtbTQsJSVtbTEsJSVtbTMsJSVtbTUsJSVtbTYsJSVtbTcpCi1ERVJJTkdfQ09SRSgoJSVSRUdkKSAgICAgICAsKCUlUkVHZCwgJTEpICAgLCUlbW0yLCUlbW00LCUlbW0wLCUlbW0zLCUlbW01LCUlbW0xLCUlbW02LCUlbW03KQotREVSSU5HX0NPUkUoKCUlUkVHZCwgJTEpICAgLCglJVJFR2QsICUxLCAyKSwlJW1tNCwlJW1tMCwlJW1tMiwlJW1tNSwlJW1tMSwlJW1tMywlJW1tNiwlJW1tNykKLURFUklOR19DT1JFKCglJVJFR2QsICUxLCAyKSwoJTAsICUxLCA4KSAgICAsJSVtbTAsJSVtbTIsJSVtbTQsJSVtbTEsJSVtbTMsJSVtbTUsJSVtbTYsJSVtbTcpCi1ERVJJTkdfQ09SRSgoJTAsICUxLCA4KSAgICAsKCUlUkVHZCwgJTEsIDQpLCUlbW0yLCUlbW00LCUlbW0wLCUlbW0zLCUlbW01LCUlbW0xLCUlbW02LCUlbW03KQorLy9ERVJJTkdfQ09SRShkc3QgICAgICAgICAgICAgLHNyYyAgICAgICAgICAgICAgICxwcHN4ICxwc3ggICxzeCAgICxwcGx4ICxwbHggICxseCAgICx0MCAgICx0MSkKK0RFUklOR19DT1JFKCglJUZGX1JFR2EpICAgICAgICwoJSVGRl9SRUdhLCAlMSkgICAsJSVtbTAsJSVtbTIsJSVtbTQsJSVtbTEsJSVtbTMsJSVtbTUsJSVtbTYsJSVtbTcpCitERVJJTkdfQ09SRSgoJSVGRl9SRUdhLCAlMSkgICAsKCUlRkZfUkVHYSwgJTEsIDIpLCUlbW0yLCUlbW00LCUlbW0wLCUlbW0zLCUlbW01LCUlbW0xLCUlbW02LCUlbW03KQorREVSSU5HX0NPUkUoKCUlRkZfUkVHYSwgJTEsIDIpLCglMCwgJTEsIDQpICAgICAgICwlJW1tNCwlJW1tMCwlJW1tMiwlJW1tNSwlJW1tMSwlJW1tMywlJW1tNiwlJW1tNykKK0RFUklOR19DT1JFKCglMCwgJTEsIDQpICAgICAgICwoJSVGRl9SRUdkKSAgICAgICAsJSVtbTAsJSVtbTIsJSVtbTQsJSVtbTEsJSVtbTMsJSVtbTUsJSVtbTYsJSVtbTcpCitERVJJTkdfQ09SRSgoJSVGRl9SRUdkKSAgICAgICAsKCUlRkZfUkVHZCwgJTEpICAgLCUlbW0yLCUlbW00LCUlbW0wLCUlbW0zLCUlbW01LCUlbW0xLCUlbW02LCUlbW03KQorREVSSU5HX0NPUkUoKCUlRkZfUkVHZCwgJTEpICAgLCglJUZGX1JFR2QsICUxLCAyKSwlJW1tNCwlJW1tMCwlJW1tMiwlJW1tNSwlJW1tMSwlJW1tMywlJW1tNiwlJW1tNykKK0RFUklOR19DT1JFKCglJUZGX1JFR2QsICUxLCAyKSwoJTAsICUxLCA4KSAgICAgICAsJSVtbTAsJSVtbTIsJSVtbTQsJSVtbTEsJSVtbTMsJSVtbTUsJSVtbTYsJSVtbTcpCitERVJJTkdfQ09SRSgoJTAsICUxLCA4KSAgICAgICAsKCUlRkZfUkVHZCwgJTEsIDQpLCUlbW0yLCUlbW00LCUlbW0wLCUlbW0zLCUlbW01LCUlbW0xLCUlbW02LCUlbW03KQogCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIDogOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKSwgIm0iIChjLT5wUVBiKSwgIm0iKGMtPnBRUGIyKSwgInEiKHRtcCkKICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZGVyaW5nVGhyZXNob2xkLGIwMCxiMDIsYjA4KQotICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfZCwgIiUiUkVHX3NwCisgICAgICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19kCiAgICAgKTsKICNlbHNlIC8vIEhBVkVfN1JFR1MgJiYgKFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVykKICAgICBpbnQgeTsKQEAgLTE0NTIsMjcgKzE0NTIsMjcgQEAKICNpZiBURU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cKICAgICBzcmMrPSA0KnN0cmlkZTsKICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAibGVhICglMCwgJTEpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMSwgNCksICUlIlJFR19jIiAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSUiRkZfUkVHX2MiXG5cdCIKIC8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOQogLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWN4ICAgICBlY3grJTEgIGVjeCsyJTEgJTArOCUxICBlY3grNCUxCiAKICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTEgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSksICUlbW0xICAgICAgICAgXG5cdCIKICAgICAgICAgUEFWR0IoJSVtbTEsICUlbW0wKQotICAgICAgICAibW92cSAlJW1tMCwgKCUlIlJFR19hIikgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJGRl9SRUdfYSIpICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICglMCwgJTEsIDQpLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTEpCi0gICAgICAgICJtb3ZxICUlbW0xLCAoJSUiUkVHX2EiLCAlMSwgMikgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAoJSUiUkVHX2MiLCAlMSksICUlbW0xICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTEsICglJSJGRl9SRUdfYSIsICUxLCAyKSAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYyIsICUxKSwgJSVtbTEgICAgICAgICBcblx0IgogICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTApCi0gICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2MiKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgKCUlIkZGX1JFR19jIikgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgKCUwLCAlMSwgOCksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMSkKLSAgICAgICAgIm1vdnEgJSVtbTEsICglJSJSRUdfYyIsICUxLCAyKSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAoJSUiRkZfUkVHX2MiLCAlMSwgMikgICAgICBcblx0IgogCiAgICAgICAgIDogOiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3RyaWRlKQotICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfYworICAgICAgICA6ICIlIkZGX1JFR19hLCAiJSJGRl9SRUdfYwogICAgICk7CiAjZWxzZQogICAgIGludCBhLCBiLCB4OwpAQCAtMTUwNSwxMCArMTUwNSwxMCBAQAogI2lmIFRFTVBMQVRFX1BQX1NTRTIgfHwgVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCiAgICAgc3JjKz0gc3RyaWRlKjM7CiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfZCIgICAgICBcblx0IgotICAgICAgICAibGVhICglJSJSRUdfZCIsICUxLCA0KSwgJSUiUkVHX2MiICAgICAgXG5cdCIKLSAgICAgICAgImFkZCAlMSwgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSUiRkZfUkVHX2QiXG5cdCIKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2QiLCAlMSwgNCksICUlIkZGX1JFR19jIlxuXHQiCisgICAgICAgICJhZGQgJTEsICUlIkZGX1JFR19jIiAgICAgICAgICAgICAgICAgICBcblx0IgogI2lmIFRFTVBMQVRFX1BQX1NTRTIKICAgICAgICAgInB4b3IgJSV4bW03LCAlJXhtbTcgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAjZGVmaW5lIFJFQUxfREVJTlRfQ1VCSUMoYSxiLGMsZCxlKVwKQEAgLTE1NTQsMTcgKzE1NTQsMTcgQEAKICNlbmRpZiAvL1RFTVBMQVRFX1BQX1NTRTIKICNkZWZpbmUgREVJTlRfQ1VCSUMoYSxiLGMsZCxlKSAgUkVBTF9ERUlOVF9DVUJJQyhhLGIsYyxkLGUpCiAKLURFSU5UX0NVQklDKCglMCkgICAgICAgICwgKCUlUkVHYSwgJTEpLCAoJSVSRUdhLCAlMSwgMiksICglMCwgJTEsIDQpICwgKCUlUkVHZCwgJTEpKQotREVJTlRfQ1VCSUMoKCUlUkVHYSwgJTEpLCAoJTAsICUxLCA0KSAsICglJVJFR2QpICAgICAgICwgKCUlUkVHZCwgJTEpLCAoJTAsICUxLCA4KSkKLURFSU5UX0NVQklDKCglMCwgJTEsIDQpICwgKCUlUkVHZCwgJTEpLCAoJSVSRUdkLCAlMSwgMiksICglMCwgJTEsIDgpICwgKCUlUkVHYykpCi1ERUlOVF9DVUJJQygoJSVSRUdkLCAlMSksICglMCwgJTEsIDgpICwgKCUlUkVHZCwgJTEsIDQpLCAoJSVSRUdjKSAgICAsICglJVJFR2MsICUxLCAyKSkKK0RFSU5UX0NVQklDKCglMCkgICAgICAgICAgICwgKCUlRkZfUkVHYSwgJTEpLCAoJSVGRl9SRUdhLCAlMSwgMiksICglMCwgJTEsIDQpICAgICwgKCUlRkZfUkVHZCwgJTEpKQorREVJTlRfQ1VCSUMoKCUlRkZfUkVHYSwgJTEpLCAoJTAsICUxLCA0KSAgICAsICglJUZGX1JFR2QpICAgICAgICwgKCUlRkZfUkVHZCwgJTEpLCAoJTAsICUxLCA4KSkKK0RFSU5UX0NVQklDKCglMCwgJTEsIDQpICAgICwgKCUlRkZfUkVHZCwgJTEpLCAoJSVGRl9SRUdkLCAlMSwgMiksICglMCwgJTEsIDgpICAgICwgKCUlRkZfUkVHYykpCitERUlOVF9DVUJJQygoJSVGRl9SRUdkLCAlMSksICglMCwgJTEsIDgpICAgICwgKCUlRkZfUkVHZCwgJTEsIDQpLCAoJSVGRl9SRUdjKSAgICAsICglJUZGX1JFR2MsICUxLCAyKSkKIAogICAgICAgICA6IDogInIiIChzcmMpLCAiciIgKCh4ODZfcmVnKXN0cmlkZSkKICAgICAgICAgOgogI2lmIFRFTVBMQVRFX1BQX1NTRTIKICAgICAgICAgWE1NX0NMT0JCRVJTKCIleG1tMCIsICIleG1tMSIsICIleG1tMiIsICIleG1tMyIsICIleG1tNyIsKQogI2VuZGlmCi0gICAgICAgICIlIlJFR19hLCAiJSJSRUdfZCwgIiUiUkVHX2MKKyAgICAgICAgIiUiRkZfUkVHX2EsICIlIkZGX1JFR19kLCAiJSJGRl9SRUdfYwogICAgICk7CiAjdW5kZWYgUkVBTF9ERUlOVF9DVUJJQwogI2Vsc2UgLy9URU1QTEFURV9QUF9TU0UyIHx8IFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVwpAQCAtMTU5Miw4ICsxNTkyLDggQEAKICNpZiBURU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cKICAgICBzcmMrPSBzdHJpZGUqNDsKICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAibGVhICglMCwgJTEpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMSwgNCksICUlIlJFR19kIiAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSUiRkZfUkVHX2QiXG5cdCIKICAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICglMiksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5ICAgICAgIDEwCkBAIC0xNjI5LDE0ICsxNjI5LDE0IEBACiAKICNkZWZpbmUgREVJTlRfRkYoYSxiLGMsZCkgIFJFQUxfREVJTlRfRkYoYSxiLGMsZCkKIAotREVJTlRfRkYoKCUwKSAgICAgICAgLCAoJSVSRUdhKSAgICAgICAsICglJVJFR2EsICUxKSwgKCUlUkVHYSwgJTEsIDIpKQotREVJTlRfRkYoKCUlUkVHYSwgJTEpLCAoJSVSRUdhLCAlMSwgMiksICglMCwgJTEsIDQpICwgKCUlUkVHZCkgICAgICAgKQotREVJTlRfRkYoKCUwLCAlMSwgNCkgLCAoJSVSRUdkKSAgICAgICAsICglJVJFR2QsICUxKSwgKCUlUkVHZCwgJTEsIDIpKQotREVJTlRfRkYoKCUlUkVHZCwgJTEpLCAoJSVSRUdkLCAlMSwgMiksICglMCwgJTEsIDgpICwgKCUlUkVHZCwgJTEsIDQpKQorREVJTlRfRkYoKCUwKSAgICAgICAgICAgLCAoJSVGRl9SRUdhKSAgICAgICAsICglJUZGX1JFR2EsICUxKSwgKCUlRkZfUkVHYSwgJTEsIDIpKQorREVJTlRfRkYoKCUlRkZfUkVHYSwgJTEpLCAoJSVGRl9SRUdhLCAlMSwgMiksICglMCwgJTEsIDQpICAgICwgKCUlRkZfUkVHZCkgICAgICAgKQorREVJTlRfRkYoKCUwLCAlMSwgNCkgICAgLCAoJSVGRl9SRUdkKSAgICAgICAsICglJUZGX1JFR2QsICUxKSwgKCUlRkZfUkVHZCwgJTEsIDIpKQorREVJTlRfRkYoKCUlRkZfUkVHZCwgJTEpLCAoJSVGRl9SRUdkLCAlMSwgMiksICglMCwgJTEsIDgpICAgICwgKCUlRkZfUkVHZCwgJTEsIDQpKQogCiAgICAgICAgICJtb3ZxICUlbW0wLCAoJTIpICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICA6IDogInIiIChzcmMpLCAiciIgKCh4ODZfcmVnKXN0cmlkZSksICJyIih0bXApCi0gICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19kCiAgICAgKTsKICNlbHNlIC8vVEVNUExBVEVfUFBfTU1YRVhUIHx8IFRFTVBMQVRFX1BQXzNETk9XCiAgICAgaW50IHg7CkBAIC0xNjcxLDggKzE2NzEsOCBAQAogI2lmIChURU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cpICYmIEhBVkVfNlJFR1MKICAgICBzcmMrPSBzdHJpZGUqNDsKICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAibGVhICglMCwgJTEpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMSwgNCksICUlIlJFR19kIiAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSUiRkZfUkVHX2QiXG5cdCIKICAgICAgICAgInB4b3IgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICglMiksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAoJTMpLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTE3MTQsMTkgKzE3MTQsMTkgQEAKIAogI2RlZmluZSBERUlOVF9MNSh0MSx0MixhLGIsYykgIFJFQUxfREVJTlRfTDUodDEsdDIsYSxiLGMpCiAKLURFSU5UX0w1KCUlbW0wLCAlJW1tMSwgKCUwKSAgICAgICAgICAgLCAoJSVSRUdhKSAgICAgICAsICglJVJFR2EsICUxKSAgICkKLURFSU5UX0w1KCUlbW0xLCAlJW1tMCwgKCUlUkVHYSkgICAgICAgLCAoJSVSRUdhLCAlMSkgICAsICglJVJFR2EsICUxLCAyKSkKLURFSU5UX0w1KCUlbW0wLCAlJW1tMSwgKCUlUkVHYSwgJTEpICAgLCAoJSVSRUdhLCAlMSwgMiksICglMCwgJTEsIDQpICAgKQotREVJTlRfTDUoJSVtbTEsICUlbW0wLCAoJSVSRUdhLCAlMSwgMiksICglMCwgJTEsIDQpICAgICwgKCUlUkVHZCkgICAgICAgKQotREVJTlRfTDUoJSVtbTAsICUlbW0xLCAoJTAsICUxLCA0KSAgICAsICglJVJFR2QpICAgICAgICwgKCUlUkVHZCwgJTEpICAgKQotREVJTlRfTDUoJSVtbTEsICUlbW0wLCAoJSVSRUdkKSAgICAgICAsICglJVJFR2QsICUxKSAgICwgKCUlUkVHZCwgJTEsIDIpKQotREVJTlRfTDUoJSVtbTAsICUlbW0xLCAoJSVSRUdkLCAlMSkgICAsICglJVJFR2QsICUxLCAyKSwgKCUwLCAlMSwgOCkgICApCi1ERUlOVF9MNSglJW1tMSwgJSVtbTAsICglJVJFR2QsICUxLCAyKSwgKCUwLCAlMSwgOCkgICAgLCAoJSVSRUdkLCAlMSwgNCkpCitERUlOVF9MNSglJW1tMCwgJSVtbTEsICglMCkgICAgICAgICAgICAgICwgKCUlRkZfUkVHYSkgICAgICAgLCAoJSVGRl9SRUdhLCAlMSkgICApCitERUlOVF9MNSglJW1tMSwgJSVtbTAsICglJUZGX1JFR2EpICAgICAgICwgKCUlRkZfUkVHYSwgJTEpICAgLCAoJSVGRl9SRUdhLCAlMSwgMikpCitERUlOVF9MNSglJW1tMCwgJSVtbTEsICglJUZGX1JFR2EsICUxKSAgICwgKCUlRkZfUkVHYSwgJTEsIDIpLCAoJTAsICUxLCA0KSAgICkKK0RFSU5UX0w1KCUlbW0xLCAlJW1tMCwgKCUlRkZfUkVHYSwgJTEsIDIpLCAoJTAsICUxLCA0KSAgICAgICAsICglJUZGX1JFR2QpICAgICAgICkKK0RFSU5UX0w1KCUlbW0wLCAlJW1tMSwgKCUwLCAlMSwgNCkgICAgICAgLCAoJSVGRl9SRUdkKSAgICAgICAsICglJUZGX1JFR2QsICUxKSAgICkKK0RFSU5UX0w1KCUlbW0xLCAlJW1tMCwgKCUlRkZfUkVHZCkgICAgICAgLCAoJSVGRl9SRUdkLCAlMSkgICAsICglJUZGX1JFR2QsICUxLCAyKSkKK0RFSU5UX0w1KCUlbW0wLCAlJW1tMSwgKCUlRkZfUkVHZCwgJTEpICAgLCAoJSVGRl9SRUdkLCAlMSwgMiksICglMCwgJTEsIDgpICAgKQorREVJTlRfTDUoJSVtbTEsICUlbW0wLCAoJSVGRl9SRUdkLCAlMSwgMiksICglMCwgJTEsIDgpICAgICAgICwgKCUlRkZfUkVHZCwgJTEsIDQpKQogCiAgICAgICAgICJtb3ZxICUlbW0wLCAoJTIpICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMSwgKCUzKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgOiA6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzdHJpZGUpLCAiciIodG1wKSwgInIiKHRtcDIpCi0gICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19kCiAgICAgKTsKICNlbHNlIC8vKFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVykgJiYgSEFWRV82UkVHUwogICAgIGludCB4OwpAQCAtMTc3Miw0OSArMTc3Miw0OSBAQAogI2lmIFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVwogICAgIHNyYys9IDQqc3RyaWRlOwogICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICJsZWEgKCUwLCAlMSksICUlIlJFR19hIiAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGVhICglJSJSRUdfYSIsICUxLCA0KSwgJSUiUkVHX2QiICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiRkZfUkVHX2EiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJTEsIDQpLCAlJSJGRl9SRUdfZCJcblx0IgogLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5CiAvLyAgICAgICUwICAgICAgZWF4ICAgICBlYXgrJTEgIGVheCsyJTEgJTArNCUxICBlZHggICAgIGVkeCslMSAgZWR4KzIlMSAlMCs4JTEgIGVkeCs0JTEKIAogICAgICAgICAibW92cSAoJTIpLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IiAvLyBMMgogICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTDArTDIKICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwxCiAgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMCkKICAgICAgICAgIm1vdnEgJSVtbTAsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTAgICAgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSksICUlbW0wICAgICAgICAgXG5cdCIgLy8gTDMKICAgICAgICAgUEFWR0IoJSVtbTAsICUlbW0yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEwxK0wzCiAgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyTDIgKyBMMSArIEwzCi0gICAgICAgICJtb3ZxICUlbW0yLCAoJSUiUkVHX2EiKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0yICAgICAgICAgXG5cdCIgLy8gTDQKKyAgICAgICAgIm1vdnEgJSVtbTIsICglJSJGRl9SRUdfYSIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCAyKSwgJSVtbTIgICAgICBcblx0IiAvLyBMNAogICAgICAgICBQQVZHQiglJW1tMiwgJSVtbTEpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTDIrTDQKICAgICAgICAgUEFWR0IoJSVtbTAsICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDJMMyArIEwyICsgTDQKLSAgICAgICAgIm1vdnEgJSVtbTEsICglJSJSRUdfYSIsICUxKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0xLCAoJSUiRkZfUkVHX2EiLCAlMSkgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDUKICAgICAgICAgUEFWR0IoJSVtbTEsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEwzK0w1CiAgICAgICAgIFBBVkdCKCUlbW0yLCAlJW1tMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyTDQgKyBMMyArIEw1Ci0gICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2EiLCAlMSwgMikgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAoJSUiUkVHX2QiKSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgIm1vdnEgJSVtbTAsICglJSJGRl9SRUdfYSIsICUxLCAyKSAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfZCIpLCAlJW1tMCAgICAgICAgICAgICBcblx0IiAvLyBMNgogICAgICAgICBQQVZHQiglJW1tMCwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTDQrTDYKICAgICAgICAgUEFWR0IoJSVtbTEsICUlbW0yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDJMNSArIEw0ICsgTDYKICAgICAgICAgIm1vdnEgJSVtbTIsICglMCwgJTEsIDQpICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglJSJSRUdfZCIsICUxKSwgJSVtbTIgICAgICAgICAgICBcblx0IiAvLyBMNworICAgICAgICAibW92cSAoJSUiRkZfUkVHX2QiLCAlMSksICUlbW0yICAgICAgICAgXG5cdCIgLy8gTDcKICAgICAgICAgUEFWR0IoJSVtbTIsICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEw1K0w3CiAgICAgICAgIFBBVkdCKCUlbW0wLCAlJW1tMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyTDYgKyBMNSArIEw3Ci0gICAgICAgICJtb3ZxICUlbW0xLCAoJSUiUkVHX2QiKSAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAoJSUiUkVHX2QiLCAlMSwgMiksICUlbW0xICAgICAgICAgXG5cdCIgLy8gTDgKKyAgICAgICAgIm1vdnEgJSVtbTEsICglJSJGRl9SRUdfZCIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfZCIsICUxLCAyKSwgJSVtbTEgICAgICBcblx0IiAvLyBMOAogICAgICAgICBQQVZHQiglJW1tMSwgJSVtbTApICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTDYrTDgKICAgICAgICAgUEFWR0IoJSVtbTIsICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDJMNyArIEw2ICsgTDgKLSAgICAgICAgIm1vdnEgJSVtbTAsICglJSJSRUdfZCIsICUxKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICUlbW0wLCAoJSUiRkZfUkVHX2QiLCAlMSkgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAoJTAsICUxLCA4KSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDkKICAgICAgICAgUEFWR0IoJSVtbTAsICUlbW0yKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEw3K0w5CiAgICAgICAgIFBBVkdCKCUlbW0xLCAlJW1tMikgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyTDggKyBMNyArIEw5Ci0gICAgICAgICJtb3ZxICUlbW0yLCAoJSUiUkVHX2QiLCAlMSwgMikgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgKCUlIkZGX1JFR19kIiwgJTEsIDIpICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTEsICglMikgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKICAgICAgICAgOiA6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzdHJpZGUpLCAiciIgKHRtcCkKLSAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICAgICAgOiAiJSJGRl9SRUdfYSwgIiUiRkZfUkVHX2QKICAgICApOwogI2Vsc2UgLy9URU1QTEFURV9QUF9NTVhFWFQgfHwgVEVNUExBVEVfUFBfM0ROT1cKICAgICBpbnQgYSwgYiwgYywgeDsKQEAgLTE4NzQsNTcgKzE4NzQsNTcgQEAKICAgICBzcmMrPSA0KnN0cmlkZTsKICNpZiBURU1QTEFURV9QUF9NTVhFWFQKICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAibGVhICglMCwgJTEpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMSwgNCksICUlIlJFR19kIiAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSUiRkZfUkVHX2QiXG5cdCIKIC8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOQogLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWR4ICAgICBlZHgrJTEgIGVkeCsyJTEgJTArOCUxICBlZHgrNCUxCiAKICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTIgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiwgJTEpLCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMCwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBtYXh1YiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwbWludWIgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicG1heHViICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBtaW51YiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICUlbW0wLCAoJSUiUkVHX2EiKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMCwgKCUlIkZGX1JFR19hIikgICAgICAgICAgICAgXG5cdCIKIAogICAgICAgICAibW92cSAoJTAsICUxLCA0KSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCAyKSwgJSVtbTEgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBtYXh1YiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwbWludWIgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicG1heHViICUlbW0wLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBtaW51YiAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICUlbW0yLCAoJSUiUkVHX2EiLCAlMSwgMikgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAlJW1tMiwgKCUlIkZGX1JFR19hIiwgJTEsIDIpICAgICAgXG5cdCIKIAotICAgICAgICAibW92cSAoJSUiUkVHX2QiKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUlIlJFR19kIiwgJTEpLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfZCIpLCAlJW1tMiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2QiLCAlMSksICUlbW0xICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwbWF4dWIgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicG1pbnViICUlbW0zLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBtYXh1YiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwbWludWIgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAlJW1tMiwgKCUlIlJFR19kIikgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICglJSJGRl9SRUdfZCIpICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19kIiwgJTEsIDIpLCAlJW1tMiAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfZCIsICUxLCAyKSwgJSVtbTIgICAgICBcblx0IgogICAgICAgICAibW92cSAoJTAsICUxLCA4KSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwbWF4dWIgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicG1pbnViICUlbW0zLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBtYXh1YiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwbWludWIgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAlJW1tMiwgKCUlIlJFR19kIiwgJTEsIDIpICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgJSVtbTIsICglJSJGRl9SRUdfZCIsICUxLCAyKSAgICAgIFxuXHQiCiAKIAogICAgICAgICA6IDogInIiIChzcmMpLCAiciIgKCh4ODZfcmVnKXN0cmlkZSkKLSAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICAgICAgOiAiJSJGRl9SRUdfYSwgIiUiRkZfUkVHX2QKICAgICApOwogCiAjZWxzZSAvLyBNTVggd2l0aG91dCBNTVgyCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgImxlYSAoJTAsICUxKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZWEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJSJSRUdfZCIgICAgICBcblx0IgorICAgICAgICAibGVhICglMCwgJTEpLCAlJSJGRl9SRUdfYSIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2EiLCAlMSwgNCksICUlIkZGX1JFR19kIlxuXHQiCiAvLyAgICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNyAgICAgICA4ICAgICAgIDkKIC8vICAgICAgJTAgICAgICBlYXggICAgIGVheCslMSAgZWF4KzIlMSAlMCs0JTEgIGVkeCAgICAgZWR4KyUxICBlZHgrMiUxICUwKzglMSAgZWR4KzQlMQogICAgICAgICAicHhvciAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTE5NTQsMTMgKzE5NTQsMTMgQEAKICAgICAgICAgIm1vdnEgJSVtbTAsICIgI2IgIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAjZGVmaW5lIE1FRElBTihhLGIsYykgIFJFQUxfTUVESUFOKGEsYixjKQogCi1NRURJQU4oKCUwKSAgICAgICAgLCAoJSVSRUdhKSAgICAgICAsICglJVJFR2EsICUxKSkKLU1FRElBTigoJSVSRUdhLCAlMSksICglJVJFR2EsICUxLCAyKSwgKCUwLCAlMSwgNCkpCi1NRURJQU4oKCUwLCAlMSwgNCkgLCAoJSVSRUdkKSAgICAgICAsICglJVJFR2QsICUxKSkKLU1FRElBTigoJSVSRUdkLCAlMSksICglJVJFR2QsICUxLCAyKSwgKCUwLCAlMSwgOCkpCitNRURJQU4oKCUwKSAgICAgICAgICAgLCAoJSVGRl9SRUdhKSAgICAgICAsICglJUZGX1JFR2EsICUxKSkKK01FRElBTigoJSVGRl9SRUdhLCAlMSksICglJUZGX1JFR2EsICUxLCAyKSwgKCUwLCAlMSwgNCkpCitNRURJQU4oKCUwLCAlMSwgNCkgICAgLCAoJSVGRl9SRUdkKSAgICAgICAsICglJUZGX1JFR2QsICUxKSkKK01FRElBTigoJSVGRl9SRUdkLCAlMSksICglJUZGX1JFR2QsICUxLCAyKSwgKCUwLCAlMSwgOCkpCiAKICAgICAgICAgOiA6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzdHJpZGUpCi0gICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19kCiAgICAgKTsKICNlbmRpZiAvL1RFTVBMQVRFX1BQX01NWEVYVAogI2Vsc2UgLy9URU1QTEFURV9QUF9NTVgKQEAgLTE5OTIsMTcgKzE5OTIsMTcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBSRU5BTUUodHJhbnNwb3NlMSkodWludDhfdCAqZHN0MSwgdWludDhfdCAqZHN0MiwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjU3RyaWRlKQogewogICAgIF9fYXNtX18oCi0gICAgICAgICJsZWEgKCUwLCAlMSksICUlIlJFR19hIiAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglMCwgJTEpLCAlJSJGRl9SRUdfYSIgICAgICAgICAgICAgXG5cdCIKIC8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOQogLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWR4ICAgICBlZHgrJTEgIGVkeCsyJTEgJTArOCUxICBlZHgrNCUxCiAgICAgICAgICJtb3ZxICglMCksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAxMjM0NTY3OAotICAgICAgICAibW92cSAoJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgICAgXG5cdCIgLy8gYWJjZGVmZ2gKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiksICUlbW0xICAgICAgICAgICAgIFxuXHQiIC8vIGFiY2RlZmdoCiAgICAgICAgICJtb3ZxICUlbW0wLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAxMjM0NTY3OAogICAgICAgICAicHVucGNrbGJ3ICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMWEyYjNjNGQKICAgICAgICAgInB1bnBja2hidyAlJW1tMSwgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDVlNmY3ZzhoCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEpLCAlJW1tMSAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxLCAyKSwgJSVtbTMgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiwgJTEsIDIpLCAlJW1tMyAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICUlbW0xLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHVucGNrbGJ3ICUlbW0zLCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInB1bnBja2hidyAlJW1tMywgJSVtbTQgICAgICAgICAgICAgICAgIFxuXHQiCkBAIC0yMDI5LDE2ICsyMDI5LDE2IEBACiAgICAgICAgICJwc3JscSAkMzIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92ZCAlJW1tMSwgMTEyKCUzKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAibGVhICglJSJSRUdfYSIsICUxLCA0KSwgJSUiUkVHX2EiICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2EiLCAlMSwgNCksICUlIkZGX1JFR19hIlxuXHQiCiAKICAgICAgICAgIm1vdnEgKCUwLCAlMSwgNCksICUlbW0wICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEyMzQ1Njc4Ci0gICAgICAgICJtb3ZxICglJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgICBcblx0IiAvLyBhYmNkZWZnaAorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgXG5cdCIgLy8gYWJjZGVmZ2gKICAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0yICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDEyMzQ1Njc4CiAgICAgICAgICJwdW5wY2tsYncgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICBcblx0IiAvLyAxYTJiM2M0ZAogICAgICAgICAicHVucGNraGJ3ICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgXG5cdCIgLy8gNWU2ZjdnOGgKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSksICUlbW0xICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDIpLCAlJW1tMyAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxKSwgJSVtbTEgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSwgMiksICUlbW0zICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTEsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHVucGNraGJ3ICUlbW0zLCAlJW1tNCAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTIwNjcsNyArMjA2Nyw3IEBACiAKIAogICAgICAgICA6OiAiciIgKHNyYyksICJyIiAoKHg4Nl9yZWcpc3JjU3RyaWRlKSwgInIiIChkc3QxKSwgInIiIChkc3QyKQotICAgICAgICA6ICIlIlJFR19hCisgICAgICAgIDogIiUiRkZfUkVHX2EKICAgICApOwogfQogCkBAIC0yMDc3LDggKzIwNzcsOCBAQAogc3RhdGljIGlubGluZSB2b2lkIFJFTkFNRSh0cmFuc3Bvc2UyKSh1aW50OF90ICpkc3QsIGludCBkc3RTdHJpZGUsIGNvbnN0IHVpbnQ4X3QgKnNyYykKIHsKICAgICBfX2FzbV9fKAotICAgICAgICAibGVhICglMCwgJTEpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCUxLDQpLCAlJSJSRUdfZCIgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUwLCAlMSksICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsJTEsNCksICUlIkZGX1JFR19kIiAgXG5cdCIKIC8vICAgICAgMCAgICAgICAxICAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAgICAgICA3ICAgICAgIDggICAgICAgOQogLy8gICAgICAlMCAgICAgIGVheCAgICAgZWF4KyUxICBlYXgrMiUxICUwKzQlMSAgZWR4ICAgICBlZHgrJTEgIGVkeCsyJTEgJTArOCUxICBlZHgrNCUxCiAgICAgICAgICJtb3ZxICglMiksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAxMjM0NTY3OApAQCAtMjEwMiwxNiArMjEwMiwxNiBAQAogCiAgICAgICAgICJtb3ZkICUlbW0wLCAoJTApICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHNybHEgJDMyLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdmQgJSVtbTAsICglJSJSRUdfYSIpICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZkICUlbW0zLCAoJSUiUkVHX2EiLCAlMSkgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMCwgKCUlIkZGX1JFR19hIikgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTMsICglJSJGRl9SRUdfYSIsICUxKSAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3JscSAkMzIsICUlbW0zICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92ZCAlJW1tMywgKCUlIlJFR19hIiwgJTEsIDIpICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTMsICglJSJGRl9SRUdfYSIsICUxLCAyKSAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZkICUlbW0yLCAoJTAsICUxLCA0KSAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHNybHEgJDMyLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdmQgJSVtbTIsICglJSJSRUdfZCIpICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZkICUlbW0xLCAoJSUiUkVHX2QiLCAlMSkgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ZCAlJW1tMiwgKCUlIkZGX1JFR19kIikgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTEsICglJSJGRl9SRUdfZCIsICUxKSAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3JscSAkMzIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92ZCAlJW1tMSwgKCUlIlJFR19kIiwgJTEsIDIpICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTEsICglJSJGRl9SRUdfZCIsICUxLCAyKSAgICAgIFxuXHQiCiAKIAogICAgICAgICAibW92cSA2NCglMiksICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMTIzNDU2NzgKQEAgLTIxMzUsMTkgKzIxMzUsMTkgQEAKIAogICAgICAgICAibW92ZCAlJW1tMCwgNCglMCkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzcmxxICQzMiwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZkICUlbW0wLCA0KCUlIlJFR19hIikgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92ZCAlJW1tMywgNCglJSJSRUdfYSIsICUxKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTAsIDQoJSUiRkZfUkVHX2EiKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0zLCA0KCUlIkZGX1JFR19hIiwgJTEpICAgICAgICBcblx0IgogICAgICAgICAicHNybHEgJDMyLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdmQgJSVtbTMsIDQoJSUiUkVHX2EiLCAlMSwgMikgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0zLCA0KCUlIkZGX1JFR19hIiwgJTEsIDIpICAgICBcblx0IgogICAgICAgICAibW92ZCAlJW1tMiwgNCglMCwgJTEsIDQpICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzcmxxICQzMiwgJSVtbTIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZkICUlbW0yLCA0KCUlIlJFR19kIikgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92ZCAlJW1tMSwgNCglJSJSRUdfZCIsICUxKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmQgJSVtbTIsIDQoJSUiRkZfUkVHX2QiKSAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0xLCA0KCUlIkZGX1JFR19kIiwgJTEpICAgICAgICBcblx0IgogICAgICAgICAicHNybHEgJDMyLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdmQgJSVtbTEsIDQoJSUiUkVHX2QiLCAlMSwgMikgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZkICUlbW0xLCA0KCUlIkZGX1JFR19kIiwgJTEsIDIpICAgICBcblx0IgogCiAgICAgICAgIDo6ICJyIiAoZHN0KSwgInIiICgoeDg2X3JlZylkc3RTdHJpZGUpLCAiciIgKHNyYykKLSAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICAgICAgOiAiJSJGRl9SRUdfYSwgIiUiRkZfUkVHX2QKICAgICApOwogfQogI2VuZGlmIC8vVEVNUExBVEVfUFBfTU1YCkBAIC0yMTY2LDkgKzIxNjYsOSBAQAogLy8jZGVmaW5lIEwxX0RJRkYgLy91IHNob3VsZCBjaGFuZ2UgdGhlIHRocmVzaG9sZHMgdG9vIGlmIHUgdHJ5IHRoYXQgb25lCiAjaWYgKFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVykgJiYgSEFWRV82UkVHUwogICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICJsZWEgKCUyLCAlMiwgMiksICUlIlJFR19hIiAgICAgICAgICAgICBcblx0IiAvLyAzKnN0cmlkZQotICAgICAgICAibGVhICglMiwgJTIsIDQpLCAlJSJSRUdfZCIgICAgICAgICAgICAgXG5cdCIgLy8gNSpzdHJpZGUKLSAgICAgICAgImxlYSAoJSUiUkVHX2QiLCAlMiwgMiksICUlIlJFR19jIiAgICAgIFxuXHQiIC8vIDcqc3RyaWRlCisgICAgICAgICJsZWEgKCUyLCAlMiwgMiksICUlIkZGX1JFR19hIiAgICAgICAgICBcblx0IiAvLyAzKnN0cmlkZQorICAgICAgICAibGVhICglMiwgJTIsIDQpLCAlJSJGRl9SRUdfZCIgICAgICAgICAgXG5cdCIgLy8gNSpzdHJpZGUKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2QiLCAlMiwgMiksICUlIkZGX1JFR19jIlxuXHQiIC8vIDcqc3RyaWRlCiAvLyAgICAgIDAgICAgICAgMSAgICAgICAyICAgICAgIDMgICAgICAgNCAgICAgICA1ICAgICAgIDYgICAgICAgNyAgICAgICA4ICAgICAgIDkKIC8vICAgICAgJXggICAgICAleCslMiAgICV4KzIlMiAgJXgrZWF4ICAleCs0JTIgICV4K2VkeCAgJXgrMmVheCAleCtlY3ggICV4KzglMgogLy9GSVhNRSByZW9yZGVyPwpAQCAtMjE3OSwyMSArMjE3OSwyMSBAQAogICAgICAgICAicHNhZGJ3ICglMSwgJTIpLCAlJW1tMSAgICAgICAgICAgICAgICAgXG5cdCIgLy8gfEwxLVIxfAogICAgICAgICAibW92cSAoJTAsICUyLCAyKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDIKICAgICAgICAgInBzYWRidyAoJTEsICUyLCAyKSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8vIHxMMi1SMnwKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vIEwzCi0gICAgICAgICJwc2FkYncgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgICBcblx0IiAvLyB8TDMtUjN8CisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTMgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAicHNhZGJ3ICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTMgICAgICAgXG5cdCIgLy8gfEwzLVIzfAogCiAgICAgICAgICJtb3ZxICglMCwgJTIsIDQpLCAlJW1tNCAgICAgICAgICAgICAgICBcblx0IiAvLyBMNAogICAgICAgICAicGFkZHcgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzYWRidyAoJTEsICUyLCA0KSwgJSVtbTQgICAgICAgICAgICAgIFxuXHQiIC8vIHxMNC1SNHwKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfZCIpLCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2QiKSwgJSVtbTUgICAgICAgICBcblx0IiAvLyBMNQogICAgICAgICAicGFkZHcgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInBzYWRidyAoJTEsICUlIlJFR19kIiksICUlbW01ICAgICAgICAgIFxuXHQiIC8vIHxMNS1SNXwKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIsIDIpLCAlJW1tNiAgICAgICAgIFxuXHQiIC8vIEw2CisgICAgICAgICJwc2FkYncgKCUxLCAlJSJGRl9SRUdfZCIpLCAlJW1tNSAgICAgICBcblx0IiAvLyB8TDUtUjV8CisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2EiLCAyKSwgJSVtbTYgICAgICBcblx0IiAvLyBMNgogICAgICAgICAicGFkZHcgJSVtbTMsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInBzYWRidyAoJTEsICUlIlJFR19hIiwgMiksICUlbW02ICAgICAgIFxuXHQiIC8vIHxMNi1SNnwKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYyIpLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vIEw3CisgICAgICAgICJwc2FkYncgKCUxLCAlJSJGRl9SRUdfYSIsIDIpLCAlJW1tNiAgICBcblx0IiAvLyB8TDYtUjZ8CisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2MiKSwgJSVtbTcgICAgICAgICBcblx0IiAvLyBMNwogICAgICAgICAicGFkZHcgJSVtbTQsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgInBzYWRidyAoJTEsICUlIlJFR19jIiksICUlbW03ICAgICAgICAgIFxuXHQiIC8vIHxMNy1SN3wKKyAgICAgICAgInBzYWRidyAoJTEsICUlIkZGX1JFR19jIiksICUlbW03ICAgICAgIFxuXHQiIC8vIHxMNy1SN3wKICAgICAgICAgInBhZGR3ICUlbW01LCAlJW1tNiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdyAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHcgJSVtbTYsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTIyMzksMTQgKzIyMzksMTQgQEAKIAogI2RlZmluZSBMMl9ESUZGX0NPUkUoYSwgYikgIFJFQUxfTDJfRElGRl9DT1JFKGEsIGIpCiAKLUwyX0RJRkZfQ09SRSgoJTApICAgICAgICAgICwgKCUxKSkKLUwyX0RJRkZfQ09SRSgoJTAsICUyKSAgICAgICwgKCUxLCAlMikpCi1MMl9ESUZGX0NPUkUoKCUwLCAlMiwgMikgICAsICglMSwgJTIsIDIpKQotTDJfRElGRl9DT1JFKCglMCwgJSVSRUdhKSAgLCAoJTEsICUlUkVHYSkpCi1MMl9ESUZGX0NPUkUoKCUwLCAlMiwgNCkgICAsICglMSwgJTIsIDQpKQotTDJfRElGRl9DT1JFKCglMCwgJSVSRUdkKSAgLCAoJTEsICUlUkVHZCkpCi1MMl9ESUZGX0NPUkUoKCUwLCAlJVJFR2EsMiksICglMSwgJSVSRUdhLDIpKQotTDJfRElGRl9DT1JFKCglMCwgJSVSRUdjKSAgLCAoJTEsICUlUkVHYykpCitMMl9ESUZGX0NPUkUoKCUwKSAgICAgICAgICAgICAsICglMSkpCitMMl9ESUZGX0NPUkUoKCUwLCAlMikgICAgICAgICAsICglMSwgJTIpKQorTDJfRElGRl9DT1JFKCglMCwgJTIsIDIpICAgICAgLCAoJTEsICUyLCAyKSkKK0wyX0RJRkZfQ09SRSgoJTAsICUlRkZfUkVHYSkgICwgKCUxLCAlJUZGX1JFR2EpKQorTDJfRElGRl9DT1JFKCglMCwgJTIsIDQpICAgICAgLCAoJTEsICUyLCA0KSkKK0wyX0RJRkZfQ09SRSgoJTAsICUlRkZfUkVHZCkgICwgKCUxLCAlJUZGX1JFR2QpKQorTDJfRElGRl9DT1JFKCglMCwgJSVGRl9SRUdhLDIpLCAoJTEsICUlRkZfUkVHYSwyKSkKK0wyX0RJRkZfQ09SRSgoJTAsICUlRkZfUkVHYykgICwgKCUxLCAlJUZGX1JFR2MpKQogCiAjZW5kaWYgLy9MMV9ESUZGCiAKQEAgLTIyNTUsOTQgKzIyNTUsOTQgQEAKICAgICAgICAgInBhZGRkICUlbW0wLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZkICUlbW00LCAlJWVjeCAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAic2hsbCAkMiwgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdiAlMywgJSUiUkVHX2QiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJhZGRsIC00KCUlIlJFR19kIiksICUlZWN4ICAgICAgICAgICAgICBcblx0IgotICAgICAgICAiYWRkbCA0KCUlIlJFR19kIiksICUlZWN4ICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZGwgLTEwMjQoJSUiUkVHX2QiKSwgJSVlY3ggICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3YgJTMsICUlIkZGX1JFR19kIiAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkbCAtNCglJSJGRl9SRUdfZCIpLCAlJWVjeCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGwgNCglJSJGRl9SRUdfZCIpLCAlJWVjeCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRsIC0xMDI0KCUlIkZGX1JFR19kIiksICUlZWN4ICAgICAgICBcblx0IgogICAgICAgICAiYWRkbCAkNCwgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgImFkZGwgMTAyNCglJSJSRUdfZCIpLCAlJWVjeCAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRsIDEwMjQoJSUiRkZfUkVHX2QiKSwgJSVlY3ggICAgICAgICBcblx0IgogICAgICAgICAic2hybCAkMywgJSVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdmwgJSVlY3gsICglJSJSRUdfZCIpICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZsICUlZWN4LCAoJSUiRkZfUkVHX2QiKSAgICAgICAgICAgICBcblx0IgogCi0vLyAgICAgICAgIm1vdiAlMywgJSUiUkVHX2MiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0vLyAgICAgICAgIm1vdiAlJSJSRUdfYyIsIHRlc3QgICAgICAgICAgICAgICAgICAgIFxuXHQiCisvLyAgICAgICAgIm1vdiAlMywgJSUiRkZfUkVHX2MiICAgICAgICAgICAgICAgICAgIFxuXHQiCisvLyAgICAgICAgIm1vdiAlJSJGRl9SRUdfYyIsIHRlc3QgICAgICAgICAgICAgICAgIFxuXHQiCiAvLyAgICAgICAgImptcCA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJjbXBsIDUxMiglJSJSRUdfZCIpLCAlJWVjeCAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY21wbCA1MTIoJSUiRkZfUkVHX2QiKSwgJSVlY3ggICAgICAgICAgXG5cdCIKICAgICAgICAgIiBqYiAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJjbXBsIDUxNiglJSJSRUdfZCIpLCAlJWVjeCAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY21wbCA1MTYoJSUiRkZfUkVHX2QiKSwgJSVlY3ggICAgICAgICAgXG5cdCIKICAgICAgICAgIiBqYiAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMiwgMiksICUlIlJFR19kIiAgICAgIFxuXHQiIC8vIDUqc3RyaWRlCi0gICAgICAgICJsZWEgKCUlIlJFR19kIiwgJTIsIDIpLCAlJSJSRUdfYyIgICAgICBcblx0IiAvLyA3KnN0cmlkZQorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsICUyLCAyKSwgJSUiRkZfUkVHX2QiXG5cdCIgLy8gNSpzdHJpZGUKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2QiLCAlMiwgMiksICUlIkZGX1JFR19jIlxuXHQiIC8vIDcqc3RyaWRlCiAgICAgICAgICJtb3ZxICglMCksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMAogICAgICAgICAibW92cSAoJTAsICUyKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKICAgICAgICAgIm1vdnEgKCUwLCAlMiwgMiksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCi0gICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiKSwgJSVtbTMgICAgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19hIiksICUlbW0zICAgICAgICAgXG5cdCIgLy8gTDMKICAgICAgICAgIm1vdnEgKCUwLCAlMiwgNCksICUlbW00ICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw0Ci0gICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2QiKSwgJSVtbTUgICAgICAgICAgICBcblx0IiAvLyBMNQotICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiwgMiksICUlbW02ICAgICAgICAgXG5cdCIgLy8gTDYKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYyIpLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vIEw3CisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2QiKSwgJSVtbTUgICAgICAgICBcblx0IiAvLyBMNQorICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19hIiwgMiksICUlbW02ICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJGRl9SRUdfYyIpLCAlJW1tNyAgICAgICAgIFxuXHQiIC8vIEw3CiAgICAgICAgICJtb3ZxICUlbW0wLCAoJTEpICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMAogICAgICAgICAibW92cSAlJW1tMSwgKCUxLCAlMikgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKICAgICAgICAgIm1vdnEgJSVtbTIsICglMSwgJTIsIDIpICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCi0gICAgICAgICJtb3ZxICUlbW0zLCAoJTEsICUlIlJFR19hIikgICAgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAibW92cSAlJW1tMywgKCUxLCAlJSJGRl9SRUdfYSIpICAgICAgICAgXG5cdCIgLy8gTDMKICAgICAgICAgIm1vdnEgJSVtbTQsICglMSwgJTIsIDQpICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw0Ci0gICAgICAgICJtb3ZxICUlbW01LCAoJTEsICUlIlJFR19kIikgICAgICAgICAgICBcblx0IiAvLyBMNQotICAgICAgICAibW92cSAlJW1tNiwgKCUxLCAlJSJSRUdfYSIsIDIpICAgICAgICAgXG5cdCIgLy8gTDYKLSAgICAgICAgIm1vdnEgJSVtbTcsICglMSwgJSUiUkVHX2MiKSAgICAgICAgICAgIFxuXHQiIC8vIEw3CisgICAgICAgICJtb3ZxICUlbW01LCAoJTEsICUlIkZGX1JFR19kIikgICAgICAgICBcblx0IiAvLyBMNQorICAgICAgICAibW92cSAlJW1tNiwgKCUxLCAlJSJGRl9SRUdfYSIsIDIpICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgIm1vdnEgJSVtbTcsICglMSwgJSUiRkZfUkVHX2MiKSAgICAgICAgIFxuXHQiIC8vIEw3CiAgICAgICAgICJqbXAgNGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGVhICglJSJSRUdfYSIsICUyLCAyKSwgJSUiUkVHX2QiICAgICAgXG5cdCIgLy8gNSpzdHJpZGUKLSAgICAgICAgImxlYSAoJSUiUkVHX2QiLCAlMiwgMiksICUlIlJFR19jIiAgICAgIFxuXHQiIC8vIDcqc3RyaWRlCisgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJTIsIDIpLCAlJSJGRl9SRUdfZCJcblx0IiAvLyA1KnN0cmlkZQorICAgICAgICAibGVhICglJSJGRl9SRUdfZCIsICUyLCAyKSwgJSUiRkZfUkVHX2MiXG5cdCIgLy8gNypzdHJpZGUKICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCiAgICAgICAgIFBBVkdCKCglMSksICUlbW0wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMMAogICAgICAgICAibW92cSAoJTAsICUyKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKICAgICAgICAgUEFWR0IoKCUxLCAlMiksICUlbW0xKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEwxCiAgICAgICAgICJtb3ZxICglMCwgJTIsIDIpLCAlJW1tMiAgICAgICAgICAgICAgICBcblx0IiAvLyBMMgogICAgICAgICBQQVZHQigoJTEsICUyLCAyKSwgJSVtbTIpICAgICAgICAgICAgICAgICAgICAgLy8gTDIKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vIEwzCi0gICAgICAgIFBBVkdCKCglMSwgJSVSRUdhKSwgJSVtbTMpICAgICAgICAgICAgICAgICAgICAvLyBMMworICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19hIiksICUlbW0zICAgICAgICAgXG5cdCIgLy8gTDMKKyAgICAgICAgUEFWR0IoKCUxLCAlJUZGX1JFR2EpLCAlJW1tMykgICAgICAgICAgICAgICAgIC8vIEwzCiAgICAgICAgICJtb3ZxICglMCwgJTIsIDQpLCAlJW1tNCAgICAgICAgICAgICAgICBcblx0IiAvLyBMNAogICAgICAgICBQQVZHQigoJTEsICUyLCA0KSwgJSVtbTQpICAgICAgICAgICAgICAgICAgICAgLy8gTDQKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfZCIpLCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vIEw1Ci0gICAgICAgIFBBVkdCKCglMSwgJSVSRUdkKSwgJSVtbTUpICAgICAgICAgICAgICAgICAgICAvLyBMNQotICAgICAgICAibW92cSAoJTAsICUlIlJFR19hIiwgMiksICUlbW02ICAgICAgICAgXG5cdCIgLy8gTDYKLSAgICAgICAgUEFWR0IoKCUxLCAlJVJFR2EsIDIpLCAlJW1tNikgICAgICAgICAgICAgICAgIC8vIEw2Ci0gICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2MiKSwgJSVtbTcgICAgICAgICAgICBcblx0IiAvLyBMNwotICAgICAgICBQQVZHQigoJTEsICUlUkVHYyksICUlbW03KSAgICAgICAgICAgICAgICAgICAgLy8gTDcKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tNSAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgIFBBVkdCKCglMSwgJSVGRl9SRUdkKSwgJSVtbTUpICAgICAgICAgICAgICAgICAvLyBMNQorICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19hIiwgMiksICUlbW02ICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgUEFWR0IoKCUxLCAlJUZGX1JFR2EsIDIpLCAlJW1tNikgICAgICAgICAgICAgIC8vIEw2CisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2MiKSwgJSVtbTcgICAgICAgICBcblx0IiAvLyBMNworICAgICAgICBQQVZHQigoJTEsICUlRkZfUkVHYyksICUlbW03KSAgICAgICAgICAgICAgICAgLy8gTDcKICAgICAgICAgIm1vdnEgJSVtbTAsICglMSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIwCiAgICAgICAgICJtb3ZxICUlbW0xLCAoJTEsICUyKSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBSMQogICAgICAgICAibW92cSAlJW1tMiwgKCUxLCAlMiwgMikgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjIKLSAgICAgICAgIm1vdnEgJSVtbTMsICglMSwgJSUiUkVHX2EiKSAgICAgICAgICAgIFxuXHQiIC8vIFIzCisgICAgICAgICJtb3ZxICUlbW0zLCAoJTEsICUlIkZGX1JFR19hIikgICAgICAgICBcblx0IiAvLyBSMwogICAgICAgICAibW92cSAlJW1tNCwgKCUxLCAlMiwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjQKLSAgICAgICAgIm1vdnEgJSVtbTUsICglMSwgJSUiUkVHX2QiKSAgICAgICAgICAgIFxuXHQiIC8vIFI1Ci0gICAgICAgICJtb3ZxICUlbW02LCAoJTEsICUlIlJFR19hIiwgMikgICAgICAgICBcblx0IiAvLyBSNgotICAgICAgICAibW92cSAlJW1tNywgKCUxLCAlJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIgLy8gUjcKKyAgICAgICAgIm1vdnEgJSVtbTUsICglMSwgJSUiRkZfUkVHX2QiKSAgICAgICAgIFxuXHQiIC8vIFI1CisgICAgICAgICJtb3ZxICUlbW02LCAoJTEsICUlIkZGX1JFR19hIiwgMikgICAgICBcblx0IiAvLyBSNgorICAgICAgICAibW92cSAlJW1tNywgKCUxLCAlJSJGRl9SRUdfYyIpICAgICAgICAgXG5cdCIgLy8gUjcKICAgICAgICAgIm1vdnEgJSVtbTAsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCiAgICAgICAgICJtb3ZxICUlbW0xLCAoJTAsICUyKSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMQogICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlMiwgMikgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDIKLSAgICAgICAgIm1vdnEgJSVtbTMsICglMCwgJSUiUkVHX2EiKSAgICAgICAgICAgIFxuXHQiIC8vIEwzCisgICAgICAgICJtb3ZxICUlbW0zLCAoJTAsICUlIkZGX1JFR19hIikgICAgICAgICBcblx0IiAvLyBMMwogICAgICAgICAibW92cSAlJW1tNCwgKCUwLCAlMiwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDQKLSAgICAgICAgIm1vdnEgJSVtbTUsICglMCwgJSUiUkVHX2QiKSAgICAgICAgICAgIFxuXHQiIC8vIEw1Ci0gICAgICAgICJtb3ZxICUlbW02LCAoJTAsICUlIlJFR19hIiwgMikgICAgICAgICBcblx0IiAvLyBMNgotICAgICAgICAibW92cSAlJW1tNywgKCUwLCAlJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIgLy8gTDcKKyAgICAgICAgIm1vdnEgJSVtbTUsICglMCwgJSUiRkZfUkVHX2QiKSAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgICJtb3ZxICUlbW02LCAoJTAsICUlIkZGX1JFR19hIiwgMikgICAgICBcblx0IiAvLyBMNgorICAgICAgICAibW92cSAlJW1tNywgKCUwLCAlJSJGRl9SRUdfYyIpICAgICAgICAgXG5cdCIgLy8gTDcKICAgICAgICAgImptcCA0ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKICAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJjbXBsIDUwOCglJSJSRUdfZCIpLCAlJWVjeCAgICAgICAgICAgICBcblx0IgorICAgICAgICAiY21wbCA1MDgoJSUiRkZfUkVHX2QiKSwgJSVlY3ggICAgICAgICAgXG5cdCIKICAgICAgICAgIiBqYiAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlMiwgMiksICUlIlJFR19kIiAgICAgIFxuXHQiIC8vIDUqc3RyaWRlCi0gICAgICAgICJsZWEgKCUlIlJFR19kIiwgJTIsIDIpLCAlJSJSRUdfYyIgICAgICBcblx0IiAvLyA3KnN0cmlkZQorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsICUyLCAyKSwgJSUiRkZfUkVHX2QiXG5cdCIgLy8gNSpzdHJpZGUKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2QiLCAlMiwgMiksICUlIkZGX1JFR19jIlxuXHQiIC8vIDcqc3RyaWRlCiAgICAgICAgICJtb3ZxICglMCksICUlbW0wICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMAogICAgICAgICAibW92cSAoJTAsICUyKSwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKICAgICAgICAgIm1vdnEgKCUwLCAlMiwgMiksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCi0gICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiKSwgJSVtbTMgICAgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19hIiksICUlbW0zICAgICAgICAgXG5cdCIgLy8gTDMKICAgICAgICAgIm1vdnEgKCUxKSwgJSVtbTQgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIwCiAgICAgICAgICJtb3ZxICglMSwgJTIpLCAlJW1tNSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBSMQogICAgICAgICAibW92cSAoJTEsICUyLCAyKSwgJSVtbTYgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjIKLSAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYSIpLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vIFIzCisgICAgICAgICJtb3ZxICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTcgICAgICAgICBcblx0IiAvLyBSMwogICAgICAgICBQQVZHQiglJW1tNCwgJSVtbTApCiAgICAgICAgIFBBVkdCKCUlbW01LCAlJW1tMSkKICAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0yKQpAQCAtMjM1NCwyMCArMjM1NCwyMCBAQAogICAgICAgICAibW92cSAlJW1tMCwgKCUxKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjAKICAgICAgICAgIm1vdnEgJSVtbTEsICglMSwgJTIpICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIxCiAgICAgICAgICJtb3ZxICUlbW0yLCAoJTEsICUyLCAyKSAgICAgICAgICAgICAgICBcblx0IiAvLyBSMgotICAgICAgICAibW92cSAlJW1tMywgKCUxLCAlJSJSRUdfYSIpICAgICAgICAgICAgXG5cdCIgLy8gUjMKKyAgICAgICAgIm1vdnEgJSVtbTMsICglMSwgJSUiRkZfUkVHX2EiKSAgICAgICAgIFxuXHQiIC8vIFIzCiAgICAgICAgICJtb3ZxICUlbW0wLCAoJTApICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMAogICAgICAgICAibW92cSAlJW1tMSwgKCUwLCAlMikgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDEKICAgICAgICAgIm1vdnEgJSVtbTIsICglMCwgJTIsIDIpICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwyCi0gICAgICAgICJtb3ZxICUlbW0zLCAoJTAsICUlIlJFR19hIikgICAgICAgICAgICBcblx0IiAvLyBMMworICAgICAgICAibW92cSAlJW1tMywgKCUwLCAlJSJGRl9SRUdfYSIpICAgICAgICAgXG5cdCIgLy8gTDMKIAogICAgICAgICAibW92cSAoJTAsICUyLCA0KSwgJSVtbTAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDQKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfZCIpLCAlJW1tMSAgICAgICAgICAgIFxuXHQiIC8vIEw1Ci0gICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2EiLCAyKSwgJSVtbTIgICAgICAgICBcblx0IiAvLyBMNgotICAgICAgICAibW92cSAoJTAsICUlIlJFR19jIiksICUlbW0zICAgICAgICAgICAgXG5cdCIgLy8gTDcKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMSAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2EiLCAyKSwgJSVtbTIgICAgICBcblx0IiAvLyBMNgorICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19jIiksICUlbW0zICAgICAgICAgXG5cdCIgLy8gTDcKICAgICAgICAgIm1vdnEgKCUxLCAlMiwgNCksICUlbW00ICAgICAgICAgICAgICAgIFxuXHQiIC8vIFI0Ci0gICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2QiKSwgJSVtbTUgICAgICAgICAgICBcblx0IiAvLyBSNQotICAgICAgICAibW92cSAoJTEsICUlIlJFR19hIiwgMiksICUlbW02ICAgICAgICAgXG5cdCIgLy8gUjYKLSAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfYyIpLCAlJW1tNyAgICAgICAgICAgIFxuXHQiIC8vIFI3CisgICAgICAgICJtb3ZxICglMSwgJSUiRkZfUkVHX2QiKSwgJSVtbTUgICAgICAgICBcblx0IiAvLyBSNQorICAgICAgICAibW92cSAoJTEsICUlIkZGX1JFR19hIiwgMiksICUlbW02ICAgICAgXG5cdCIgLy8gUjYKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJGRl9SRUdfYyIpLCAlJW1tNyAgICAgICAgIFxuXHQiIC8vIFI3CiAgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tMCkKICAgICAgICAgUEFWR0IoJSVtbTUsICUlbW0xKQogICAgICAgICBQQVZHQiglJW1tNiwgJSVtbTIpCkBAIC0yMzc3LDI2ICsyMzc3LDI2IEBACiAgICAgICAgIFBBVkdCKCUlbW02LCAlJW1tMikKICAgICAgICAgUEFWR0IoJSVtbTcsICUlbW0zKQogICAgICAgICAibW92cSAlJW1tMCwgKCUxLCAlMiwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjQKLSAgICAgICAgIm1vdnEgJSVtbTEsICglMSwgJSUiUkVHX2QiKSAgICAgICAgICAgIFxuXHQiIC8vIFI1Ci0gICAgICAgICJtb3ZxICUlbW0yLCAoJTEsICUlIlJFR19hIiwgMikgICAgICAgICBcblx0IiAvLyBSNgotICAgICAgICAibW92cSAlJW1tMywgKCUxLCAlJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIgLy8gUjcKKyAgICAgICAgIm1vdnEgJSVtbTEsICglMSwgJSUiRkZfUkVHX2QiKSAgICAgICAgIFxuXHQiIC8vIFI1CisgICAgICAgICJtb3ZxICUlbW0yLCAoJTEsICUlIkZGX1JFR19hIiwgMikgICAgICBcblx0IiAvLyBSNgorICAgICAgICAibW92cSAlJW1tMywgKCUxLCAlJSJGRl9SRUdfYyIpICAgICAgICAgXG5cdCIgLy8gUjcKICAgICAgICAgIm1vdnEgJSVtbTAsICglMCwgJTIsIDQpICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw0Ci0gICAgICAgICJtb3ZxICUlbW0xLCAoJTAsICUlIlJFR19kIikgICAgICAgICAgICBcblx0IiAvLyBMNQotICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlJSJSRUdfYSIsIDIpICAgICAgICAgXG5cdCIgLy8gTDYKLSAgICAgICAgIm1vdnEgJSVtbTMsICglMCwgJSUiUkVHX2MiKSAgICAgICAgICAgIFxuXHQiIC8vIEw3CisgICAgICAgICJtb3ZxICUlbW0xLCAoJTAsICUlIkZGX1JFR19kIikgICAgICAgICBcblx0IiAvLyBMNQorICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlJSJGRl9SRUdfYSIsIDIpICAgICAgXG5cdCIgLy8gTDYKKyAgICAgICAgIm1vdnEgJSVtbTMsICglMCwgJSUiRkZfUkVHX2MiKSAgICAgICAgIFxuXHQiIC8vIEw3CiAgICAgICAgICJqbXAgNGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogCiAgICAgICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibGVhICglJSJSRUdfYSIsICUyLCAyKSwgJSUiUkVHX2QiICAgICAgXG5cdCIgLy8gNSpzdHJpZGUKLSAgICAgICAgImxlYSAoJSUiUkVHX2QiLCAlMiwgMiksICUlIlJFR19jIiAgICAgIFxuXHQiIC8vIDcqc3RyaWRlCisgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJTIsIDIpLCAlJSJGRl9SRUdfZCJcblx0IiAvLyA1KnN0cmlkZQorICAgICAgICAibGVhICglJSJGRl9SRUdfZCIsICUyLCAyKSwgJSUiRkZfUkVHX2MiXG5cdCIgLy8gNypzdHJpZGUKICAgICAgICAgIm1vdnEgKCUwKSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCiAgICAgICAgICJtb3ZxICglMCwgJTIpLCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMQogICAgICAgICAibW92cSAoJTAsICUyLCAyKSwgJSVtbTIgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDIKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgICAgIFxuXHQiIC8vIEwzCisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTMgICAgICAgICBcblx0IiAvLyBMMwogICAgICAgICAibW92cSAoJTEpLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjAKICAgICAgICAgIm1vdnEgKCUxLCAlMiksICUlbW01ICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIxCiAgICAgICAgICJtb3ZxICglMSwgJTIsIDIpLCAlJW1tNiAgICAgICAgICAgICAgICBcblx0IiAvLyBSMgotICAgICAgICAibW92cSAoJTEsICUlIlJFR19hIiksICUlbW03ICAgICAgICAgICAgXG5cdCIgLy8gUjMKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tNyAgICAgICAgIFxuXHQiIC8vIFIzCiAgICAgICAgIFBBVkdCKCUlbW00LCAlJW1tMCkKICAgICAgICAgUEFWR0IoJSVtbTUsICUlbW0xKQogICAgICAgICBQQVZHQiglJW1tNiwgJSVtbTIpCkBAIC0yNDEyLDIwICsyNDEyLDIwIEBACiAgICAgICAgICJtb3ZxICUlbW0wLCAoJTEpICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBSMAogICAgICAgICAibW92cSAlJW1tMSwgKCUxLCAlMikgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjEKICAgICAgICAgIm1vdnEgJSVtbTIsICglMSwgJTIsIDIpICAgICAgICAgICAgICAgIFxuXHQiIC8vIFIyCi0gICAgICAgICJtb3ZxICUlbW0zLCAoJTEsICUlIlJFR19hIikgICAgICAgICAgICBcblx0IiAvLyBSMworICAgICAgICAibW92cSAlJW1tMywgKCUxLCAlJSJGRl9SRUdfYSIpICAgICAgICAgXG5cdCIgLy8gUjMKICAgICAgICAgIm1vdnEgJSVtbTAsICglMCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEwwCiAgICAgICAgICJtb3ZxICUlbW0xLCAoJTAsICUyKSAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMQogICAgICAgICAibW92cSAlJW1tMiwgKCUwLCAlMiwgMikgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDIKLSAgICAgICAgIm1vdnEgJSVtbTMsICglMCwgJSUiUkVHX2EiKSAgICAgICAgICAgIFxuXHQiIC8vIEwzCisgICAgICAgICJtb3ZxICUlbW0zLCAoJTAsICUlIkZGX1JFR19hIikgICAgICAgICBcblx0IiAvLyBMMwogCiAgICAgICAgICJtb3ZxICglMCwgJTIsIDQpLCAlJW1tMCAgICAgICAgICAgICAgICBcblx0IiAvLyBMNAotICAgICAgICAibW92cSAoJTAsICUlIlJFR19kIiksICUlbW0xICAgICAgICAgICAgXG5cdCIgLy8gTDUKLSAgICAgICAgIm1vdnEgKCUwLCAlJSJSRUdfYSIsIDIpLCAlJW1tMiAgICAgICAgIFxuXHQiIC8vIEw2Ci0gICAgICAgICJtb3ZxICglMCwgJSUiUkVHX2MiKSwgJSVtbTMgICAgICAgICAgICBcblx0IiAvLyBMNworICAgICAgICAibW92cSAoJTAsICUlIkZGX1JFR19kIiksICUlbW0xICAgICAgICAgXG5cdCIgLy8gTDUKKyAgICAgICAgIm1vdnEgKCUwLCAlJSJGRl9SRUdfYSIsIDIpLCAlJW1tMiAgICAgIFxuXHQiIC8vIEw2CisgICAgICAgICJtb3ZxICglMCwgJSUiRkZfUkVHX2MiKSwgJSVtbTMgICAgICAgICBcblx0IiAvLyBMNwogICAgICAgICAibW92cSAoJTEsICUyLCA0KSwgJSVtbTQgICAgICAgICAgICAgICAgXG5cdCIgLy8gUjQKLSAgICAgICAgIm1vdnEgKCUxLCAlJSJSRUdfZCIpLCAlJW1tNSAgICAgICAgICAgIFxuXHQiIC8vIFI1Ci0gICAgICAgICJtb3ZxICglMSwgJSUiUkVHX2EiLCAyKSwgJSVtbTYgICAgICAgICBcblx0IiAvLyBSNgotICAgICAgICAibW92cSAoJTEsICUlIlJFR19jIiksICUlbW03ICAgICAgICAgICAgXG5cdCIgLy8gUjcKKyAgICAgICAgIm1vdnEgKCUxLCAlJSJGRl9SRUdfZCIpLCAlJW1tNSAgICAgICAgIFxuXHQiIC8vIFI1CisgICAgICAgICJtb3ZxICglMSwgJSUiRkZfUkVHX2EiLCAyKSwgJSVtbTYgICAgICBcblx0IiAvLyBSNgorICAgICAgICAibW92cSAoJTEsICUlIkZGX1JFR19jIiksICUlbW03ICAgICAgICAgXG5cdCIgLy8gUjcKICAgICAgICAgUEFWR0IoJSVtbTQsICUlbW0wKQogICAgICAgICBQQVZHQiglJW1tNSwgJSVtbTEpCiAgICAgICAgIFBBVkdCKCUlbW02LCAlJW1tMikKQEAgLTI0MzksMTkgKzI0MzksMTkgQEAKICAgICAgICAgUEFWR0IoJSVtbTYsICUlbW0yKQogICAgICAgICBQQVZHQiglJW1tNywgJSVtbTMpCiAgICAgICAgICJtb3ZxICUlbW0wLCAoJTEsICUyLCA0KSAgICAgICAgICAgICAgICBcblx0IiAvLyBSNAotICAgICAgICAibW92cSAlJW1tMSwgKCUxLCAlJSJSRUdfZCIpICAgICAgICAgICAgXG5cdCIgLy8gUjUKLSAgICAgICAgIm1vdnEgJSVtbTIsICglMSwgJSUiUkVHX2EiLCAyKSAgICAgICAgIFxuXHQiIC8vIFI2Ci0gICAgICAgICJtb3ZxICUlbW0zLCAoJTEsICUlIlJFR19jIikgICAgICAgICAgICBcblx0IiAvLyBSNworICAgICAgICAibW92cSAlJW1tMSwgKCUxLCAlJSJGRl9SRUdfZCIpICAgICAgICAgXG5cdCIgLy8gUjUKKyAgICAgICAgIm1vdnEgJSVtbTIsICglMSwgJSUiRkZfUkVHX2EiLCAyKSAgICAgIFxuXHQiIC8vIFI2CisgICAgICAgICJtb3ZxICUlbW0zLCAoJTEsICUlIkZGX1JFR19jIikgICAgICAgICBcblx0IiAvLyBSNwogICAgICAgICAibW92cSAlJW1tMCwgKCUwLCAlMiwgNCkgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDQKLSAgICAgICAgIm1vdnEgJSVtbTEsICglMCwgJSUiUkVHX2QiKSAgICAgICAgICAgIFxuXHQiIC8vIEw1Ci0gICAgICAgICJtb3ZxICUlbW0yLCAoJTAsICUlIlJFR19hIiwgMikgICAgICAgICBcblx0IiAvLyBMNgotICAgICAgICAibW92cSAlJW1tMywgKCUwLCAlJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIgLy8gTDcKKyAgICAgICAgIm1vdnEgJSVtbTEsICglMCwgJSUiRkZfUkVHX2QiKSAgICAgICAgIFxuXHQiIC8vIEw1CisgICAgICAgICJtb3ZxICUlbW0yLCAoJTAsICUlIkZGX1JFR19hIiwgMikgICAgICBcblx0IiAvLyBMNgorICAgICAgICAibW92cSAlJW1tMywgKCUwLCAlJSJGRl9SRUdfYyIpICAgICAgICAgXG5cdCIgLy8gTDcKIAogICAgICAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKIAogICAgICAgICA6OiAiciIgKHNyYyksICJyIiAodGVtcEJsdXJyZWQpLCAiciIoKHg4Nl9yZWcpc3RyaWRlKSwgIm0iICh0ZW1wQmx1cnJlZFBhc3QpCiAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGI4MCkKLSAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QsICIlIlJFR19jLCAibWVtb3J5IgorICAgICAgICA6ICIlIkZGX1JFR19hLCAiJSJGRl9SRUdfZCwgIiUiRkZfUkVHX2MsICJtZW1vcnkiCiAgICAgKTsKICNlbHNlIC8vKFRFTVBMQVRFX1BQX01NWEVYVCB8fCBURU1QTEFURV9QUF8zRE5PVykgJiYgSEFWRV82UkVHUwogewpAQCAtMjU1NiwxOSArMjU1NiwxOSBAQAogICAgICAgICApOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgImxlYSAoJTIsICUzKSwgJSUiUkVHX2EiICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUyLCAlMyksICUlIkZGX1JFR19hIiAgICAgICAgICAgICBcblx0IgogLy8gICAgICAwICAgICAgIDEgICAgICAgMiAgICAgICAzICAgICAgIDQgICAgICAgNSAgICAgICA2ICAgICAgIDcgICAgICAgOCAgICAgICA5CiAvLyAgICAgICUxICAgICAgZWF4ICAgICBlYXgrJTIgIGVheCsyJTIgJTErNCUyICBlY3ggICAgIGVjeCslMiAgZWN4KzIlMiAlMSs4JTIgIGVjeCs0JTIKIAogICAgICAgICAibW92cSAoJTIpLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IgogICAgICAgICAibW92cSAlJW1tMSwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIm1vdnEgJSVtbTEsICUlbW00ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3ViYiAlJW1tMSwgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyBtbTAgPSBkaWZmZXJlbmNlCiAgICAgICAgICJwYWRkYiAlJW1tNywgJSVtbTAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCUzKSwgJSVtbTIgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiwlMyksICUlbW0yICAgICAgICAgIFxuXHQiCiAgICAgICAgIFBNQVhVQiglJW1tMiwgJSVtbTQpCiAgICAgICAgIFBNSU5VQiglJW1tMiwgJSVtbTMsICUlbW01KQogICAgICAgICAicHN1YmIgJSVtbTIsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTI1NzYsNyArMjU3Niw3IEBACiAgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMSAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZGIgJSVtbTEsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMywgMiksICUlbW0xICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiwgJTMsIDIpLCAlJW1tMSAgICAgIFxuXHQiCiAgICAgICAgIFBNQVhVQiglJW1tMSwgJSVtbTQpCiAgICAgICAgIFBNSU5VQiglJW1tMSwgJSVtbTMsICUlbW01KQogICAgICAgICAicHN1YmIgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKQEAgLTI1ODQsNyArMjU4NCw3IEBACiAgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZGIgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAibGVhICglJSJSRUdfYSIsICUzLCA0KSwgJSUiUkVHX2EiICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2EiLCAlMywgNCksICUlIkZGX1JFR19hIlxuXHQiCiAKICAgICAgICAgIm1vdnEgKCUyLCAlMywgNCksICUlbW0yICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIFBNQVhVQiglJW1tMiwgJSVtbTQpCkBAIC0yNTk0LDcgKzI1OTQsNyBAQAogICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGRiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICBcblx0IgogICAgICAgICBQTUFYVUIoJSVtbTEsICUlbW00KQogICAgICAgICBQTUlOVUIoJSVtbTEsICUlbW0zLCAlJW1tNSkKICAgICAgICAgInBzdWJiICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCkBAIC0yNjAyLDcgKzI2MDIsNyBAQAogICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTIgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGRiICUlbW0yLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTMpLCAlJW1tMiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUzKSwgJSVtbTIgICAgICAgICBcblx0IgogICAgICAgICBQTUFYVUIoJSVtbTIsICUlbW00KQogICAgICAgICBQTUlOVUIoJSVtbTIsICUlbW0zLCAlJW1tNSkKICAgICAgICAgInBzdWJiICUlbW0yLCAlJW1tMSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCkBAIC0yNjEwLDcgKzI2MTAsNyBAQAogICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGRiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTMsIDIpLCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUzLCAyKSwgJSVtbTEgICAgICBcblx0IgogICAgICAgICBQTUFYVUIoJSVtbTEsICUlbW00KQogICAgICAgICBQTUlOVUIoJSVtbTEsICUlbW0zLCAlJW1tNSkKICAgICAgICAgInBzdWJiICUlbW0xLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCkBAIC0yNjI2LDcgKzI2MjYsNyBAQAogICAgICAgICAicGNtcGd0YiAlJW1tNiwgJSVtbTEgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGRiICUlbW0xLCAlJW1tMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTMsIDQpLCAlJW1tMSAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUzLCA0KSwgJSVtbTEgICAgICBcblx0IgogICAgICAgICAicHN1YmIgJSVtbTEsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGRiICUlbW03LCAlJW1tMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwY21wZ3RiICUlbW02LCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgpAQCAtMjY1MSw3ICsyNjUxLDcgQEAKIAogICAgICAgICA6ICI9bSIgKGVxX21hc2spLCAiPW0iIChkY19tYXNrKQogICAgICAgICA6ICJyIiAoc3JjKSwgInIiICgoeDg2X3JlZylzdGVwKSwgIm0iIChjLT5wUVBiKSwgIm0iKGMtPnBwTW9kZS5mbGF0bmVzc1RocmVzaG9sZCkKLSAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICA6ICIlIkZGX1JFR19hCiAgICAgKTsKIAogICAgIGJvdGhfbWFza3MgPSBkY19tYXNrICYgZXFfbWFzazsKQEAgLTI4NTEsMTIgKzI4NTEsMTIgQEAKICAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IiAvLyBoaWdoIHBhcnQgb2YgbGluZSAwCiAKICAgICAgICAgICAgICJtb3ZxICglMCwgJTEpLCAlJW1tMiAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgImxlYSAoJTAsICUxLCAyKSwgJSUiUkVHX2EiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibGVhICglMCwgJTEsIDIpLCAlJSJGRl9SRUdfYSIgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJtb3ZxICUlbW0yLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTIgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGxvdyBwYXJ0IG9mIGxpbmUgMQogICAgICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGhpZ2ggcGFydCBvZiBsaW5lIDEKIAotICAgICAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW00ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiKSwgJSVtbTQgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJtb3ZxICUlbW00LCAlJW1tNSAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTQgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGxvdyBwYXJ0IG9mIGxpbmUgMgogICAgICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTUgICAgICAgICAgICAgICAgIFxuXHQiIC8vIGhpZ2ggcGFydCBvZiBsaW5lIDIKQEAgLTI4NzMsNyArMjg3Myw3IEBACiAgICAgICAgICAgICAicHN1YncgJSVtbTIsICUlbW0wICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkwwIC0gNUwxICsgNUwyCiAgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW0xICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgwIC0gNUgxICsgNUgyCiAKLSAgICAgICAgICAgICJtb3ZxICglJSJSRUdfYSIsICUxKSwgJSVtbTIgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgKCUlIkZGX1JFR19hIiwgJTEpLCAlJW1tMiAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAibW92cSAlJW1tMiwgJSVtbTMgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2tsYncgJSVtbTcsICUlbW0yICAgICAgICAgICAgICAgICBcblx0IiAvLyBMMwogICAgICAgICAgICAgInB1bnBja2hidyAlJW1tNywgJSVtbTMgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEgzCkBAIC0yODg1LDcgKzI4ODUsNyBAQAogICAgICAgICAgICAgIm1vdnEgJSVtbTAsICglNCkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMCAtIDVMMSArIDVMMiAtIDJMMwogICAgICAgICAgICAgIm1vdnEgJSVtbTEsIDgoJTQpICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMCAtIDVIMSArIDVIMiAtIDJIMwogCi0gICAgICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgMiksICUlbW0wICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCAyKSwgJSVtbTAgICAgICBcblx0IgogICAgICAgICAgICAgIm1vdnEgJSVtbTAsICUlbW0xICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicHVucGNrbGJ3ICUlbW03LCAlJW1tMCAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDQKICAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW0xICAgICAgICAgICAgICAgICBcblx0IiAvLyBINApAQCAtMjg5OSw3ICsyODk5LDcgQEAKICAgICAgICAgICAgICJwc3VidyAlJW1tMiwgJSVtbTQgICAgICAgICAgICAgICAgICAgICBcblx0IiAvLyAyTDIgLSBMMyArIEw0CiAgICAgICAgICAgICAicHN1YncgJSVtbTMsICUlbW01ICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gMkgyIC0gSDMgKyBINAogCi0gICAgICAgICAgICAibGVhICglJSJSRUdfYSIsICUxKSwgJTAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJTEpLCAlMCAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInBzbGx3ICQyLCAlJW1tMiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDRMMyAtIDRMNAogICAgICAgICAgICAgInBzbGx3ICQyLCAlJW1tMyAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDRIMyAtIDRINAogICAgICAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMiAtIDVMMyArIDVMNApAQCAtMjkxNCwxMCArMjkxNCwxMCBAQAogICAgICAgICAgICAgInBzdWJ3ICUlbW0yLCAlJW1tNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJMMiAtIDVMMyArIDVMNCAtIDJMNQogICAgICAgICAgICAgInBzdWJ3ICUlbW0zLCAlJW1tNSAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIDJIMiAtIDVIMyArIDVINCAtIDJINQogCi0gICAgICAgICAgICAibW92cSAoJSUiUkVHX2EiLCAlMSwgNCksICUlbW02ICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICglJSJGRl9SRUdfYSIsICUxLCA0KSwgJSVtbTYgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAlJW1tNywgJSVtbTYgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEw2CiAgICAgICAgICAgICAicHN1YncgJSVtbTYsICUlbW0yICAgICAgICAgICAgICAgICAgICAgXG5cdCIgLy8gTDUgLSBMNgotICAgICAgICAgICAgIm1vdnEgKCUlIlJFR19hIiwgJTEsIDQpLCAlJW1tNiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiLCAlMSwgNCksICUlbW02ICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2toYncgJSVtbTcsICUlbW02ICAgICAgICAgICAgICAgICBcblx0IiAvLyBINgogICAgICAgICAgICAgInBzdWJ3ICUlbW02LCAlJW1tMyAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8vIEg1IC0gSDYKIApAQCAtMzA2OCw3ICszMDY4LDcgQEAKICAgICAgICAgICAgIDogIityIiAodGVtcF9zcmMpCiAgICAgICAgICAgICA6ICJyIiAoKHg4Nl9yZWcpc3RlcCksICJtIiAoYy0+cFFQYiksICJtIihlcV9tYXNrKSwgInIiKHRtcCkKICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKHcwNSx3MjApCi0gICAgICAgICAgICA6ICIlIlJFR19hCisgICAgICAgICAgICA6ICIlIkZGX1JFR19hCiAgICAgICAgICk7CiAgICAgfQogLyppZihzdGVwPT0xNil7CkBAIC0zMDgxLDcgKzMwODEsNyBAQAogI2VuZGlmIC8vVEVNUExBVEVfUFBfTU1YCiAKIHN0YXRpYyB2b2lkIFJFTkFNRShwb3N0UHJvY2VzcykoY29uc3QgdWludDhfdCBzcmNbXSwgaW50IHNyY1N0cmlkZSwgdWludDhfdCBkc3RbXSwgaW50IGRzdFN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBRUF9TVE9SRV9UIFFQc1tdLCBpbnQgUVBTdHJpZGUsIGludCBpc0NvbG9yLCBQUENvbnRleHQgKmMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ4X3QgUVBzW10sIGludCBRUFN0cmlkZSwgaW50IGlzQ29sb3IsIFBQQ29udGV4dCAqYyk7CiAKIC8qKgogICogQ29weSBhIGJsb2NrIGZyb20gc3JjIHRvIGRzdCBhbmQgZml4ZXMgdGhlIGJsYWNrbGV2ZWwuCkBAIC0zMDk5LDEwICszMDk5LDEwIEBACiAgICAgaWYobGV2ZWxGaXgpewogI2lmIFRFTVBMQVRFX1BQX01NWCAmJiBIQVZFXzZSRUdTCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgIm1vdnEgKCUlIlJFR19hIiksICUlbW0yICAgICAgICBcblx0IiAvLyBwYWNrZWRZT2Zmc2V0Ci0gICAgICAgICJtb3ZxIDgoJSUiUkVHX2EiKSwgJSVtbTMgICAgICAgXG5cdCIgLy8gcGFja2VkWVNjYWxlCi0gICAgICAgICJsZWEgKCUyLCU0KSwgJSUiUkVHX2EiICAgICAgICAgXG5cdCIKLSAgICAgICAgImxlYSAoJTMsJTUpLCAlJSJSRUdfZCIgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAoJSUiRkZfUkVHX2EiKSwgJSVtbTIgICAgIFxuXHQiIC8vIHBhY2tlZFlPZmZzZXQKKyAgICAgICAgIm1vdnEgOCglJSJGRl9SRUdfYSIpLCAlJW1tMyAgICBcblx0IiAvLyBwYWNrZWRZU2NhbGUKKyAgICAgICAgImxlYSAoJTIsJTQpLCAlJSJGRl9SRUdfYSIgICAgICBcblx0IgorICAgICAgICAibGVhICglMywlNSksICUlIkZGX1JFR19kIiAgICAgIFxuXHQiCiAgICAgICAgICJweG9yICUlbW00LCAlJW1tNCAgICAgICAgICAgICAgXG5cdCIKICNpZiBURU1QTEFURV9QUF9NTVhFWFQKICNkZWZpbmUgUkVBTF9TQ0FMRURfQ1BZKHNyYzEsIHNyYzIsIGRzdDEsIGRzdDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzE1OSwxMSArMzE1OSwxMSBAQAogICAgUkVBTF9TQ0FMRURfQ1BZKHNyYzEsIHNyYzIsIGRzdDEsIGRzdDIpCiAKIFNDQUxFRF9DUFkoKCUyKSAgICAgICAsICglMiwgJTQpICAgICAgLCAoJTMpICAgICAgICwgKCUzLCAlNSkpCi1TQ0FMRURfQ1BZKCglMiwgJTQsIDIpLCAoJSVSRUdhLCAlNCwgMiksICglMywgJTUsIDIpLCAoJSVSRUdkLCAlNSwgMikpCi1TQ0FMRURfQ1BZKCglMiwgJTQsIDQpLCAoJSVSRUdhLCAlNCwgNCksICglMywgJTUsIDQpLCAoJSVSRUdkLCAlNSwgNCkpCi0gICAgICAgICJsZWEgKCUlIlJFR19hIiwlNCw0KSwgJSUiUkVHX2EiICAgICAgICBcblx0IgotICAgICAgICAibGVhICglJSJSRUdfZCIsJTUsNCksICUlIlJFR19kIiAgICAgICAgXG5cdCIKLVNDQUxFRF9DUFkoKCUlUkVHYSwgJTQpLCAoJSVSRUdhLCAlNCwgMiksICglJVJFR2QsICU1KSwgKCUlUkVHZCwgJTUsIDIpKQorU0NBTEVEX0NQWSgoJTIsICU0LCAyKSwgKCUlRkZfUkVHYSwgJTQsIDIpLCAoJTMsICU1LCAyKSwgKCUlRkZfUkVHZCwgJTUsIDIpKQorU0NBTEVEX0NQWSgoJTIsICU0LCA0KSwgKCUlRkZfUkVHYSwgJTQsIDQpLCAoJTMsICU1LCA0KSwgKCUlRkZfUkVHZCwgJTUsIDQpKQorICAgICAgICAibGVhICglJSJGRl9SRUdfYSIsJTQsNCksICUlIkZGX1JFR19hIiAgICAgICAgXG5cdCIKKyAgICAgICAgImxlYSAoJSUiRkZfUkVHX2QiLCU1LDQpLCAlJSJGRl9SRUdfZCIgICAgICAgIFxuXHQiCitTQ0FMRURfQ1BZKCglJUZGX1JFR2EsICU0KSwgKCUlRkZfUkVHYSwgJTQsIDIpLCAoJSVGRl9SRUdkLCAlNSksICglJUZGX1JFR2QsICU1LCAyKSkKIAogCiAgICAgICAgIDogIj0mYSIgKHBhY2tlZE9mZnNldEFuZFNjYWxlKQpAQCAtMzE3Miw3ICszMTcyLDcgQEAKICAgICAgICAgInIiKGRzdCksCiAgICAgICAgICJyIiAoKHg4Nl9yZWcpc3JjU3RyaWRlKSwKICAgICAgICAgInIiICgoeDg2X3JlZylkc3RTdHJpZGUpCi0gICAgICAgIDogIiUiUkVHX2QKKyAgICAgICAgOiAiJSJGRl9SRUdfZAogICAgICk7CiAjZWxzZSAvL1RFTVBMQVRFX1BQX01NWCAmJiBIQVZFXzZSRUdTCiAgICAgZm9yKGk9MDsgaTw4OyBpKyspCkBAIC0zMTgyLDggKzMxODIsOCBAQAogICAgIH1lbHNlewogI2lmIFRFTVBMQVRFX1BQX01NWCAmJiBIQVZFXzZSRUdTCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgImxlYSAoJTAsJTIpLCAlJSJSRUdfYSIgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJsZWEgKCUxLCUzKSwgJSUiUkVHX2QiICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGVhICglMCwlMiksICUlIkZGX1JFR19hIiAgICAgIFxuXHQiCisgICAgICAgICJsZWEgKCUxLCUzKSwgJSUiRkZfUkVHX2QiICAgICAgXG5cdCIKIAogI2RlZmluZSBSRUFMX1NJTVBMRV9DUFkoc3JjMSwgc3JjMiwgZHN0MSwgZHN0MikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICJtb3ZxICIgI3NyYzEgIiwgJSVtbTAgICAgICAgICAgXG5cdCJcCkBAIC0zMTk0LDE4ICszMTk0LDE4IEBACiAjZGVmaW5lIFNJTVBMRV9DUFkoc3JjMSwgc3JjMiwgZHN0MSwgZHN0MilcCiAgICBSRUFMX1NJTVBMRV9DUFkoc3JjMSwgc3JjMiwgZHN0MSwgZHN0MikKIAotU0lNUExFX0NQWSgoJTApICAgICAgICwgKCUwLCAlMikgICAgICAgLCAoJTEpICAgICAgICwgKCUxLCAlMykpCi1TSU1QTEVfQ1BZKCglMCwgJTIsIDIpLCAoJSVSRUdhLCAlMiwgMiksICglMSwgJTMsIDIpLCAoJSVSRUdkLCAlMywgMikpCi1TSU1QTEVfQ1BZKCglMCwgJTIsIDQpLCAoJSVSRUdhLCAlMiwgNCksICglMSwgJTMsIDQpLCAoJSVSRUdkLCAlMywgNCkpCi0gICAgICAgICJsZWEgKCUlIlJFR19hIiwlMiw0KSwgJSUiUkVHX2EiICAgICAgICBcblx0IgotICAgICAgICAibGVhICglJSJSRUdfZCIsJTMsNCksICUlIlJFR19kIiAgICAgICAgXG5cdCIKLVNJTVBMRV9DUFkoKCUlUkVHYSwgJTIpLCAoJSVSRUdhLCAlMiwgMiksICglJVJFR2QsICUzKSwgKCUlUkVHZCwgJTMsIDIpKQorU0lNUExFX0NQWSgoJTApICAgICAgICwgKCUwLCAlMikgICAgICAgICAgLCAoJTEpICAgICAgICwgKCUxLCAlMykpCitTSU1QTEVfQ1BZKCglMCwgJTIsIDIpLCAoJSVGRl9SRUdhLCAlMiwgMiksICglMSwgJTMsIDIpLCAoJSVGRl9SRUdkLCAlMywgMikpCitTSU1QTEVfQ1BZKCglMCwgJTIsIDQpLCAoJSVGRl9SRUdhLCAlMiwgNCksICglMSwgJTMsIDQpLCAoJSVGRl9SRUdkLCAlMywgNCkpCisgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwlMiw0KSwgJSUiRkZfUkVHX2EiICAgICAgICBcblx0IgorICAgICAgICAibGVhICglJSJGRl9SRUdfZCIsJTMsNCksICUlIkZGX1JFR19kIiAgICAgICAgXG5cdCIKK1NJTVBMRV9DUFkoKCUlRkZfUkVHYSwgJTIpLCAoJSVGRl9SRUdhLCAlMiwgMiksICglJUZGX1JFR2QsICUzKSwgKCUlRkZfUkVHZCwgJTMsIDIpKQogCiAgICAgICAgIDogOiAiciIgKHNyYyksCiAgICAgICAgICJyIiAoZHN0KSwKICAgICAgICAgInIiICgoeDg2X3JlZylzcmNTdHJpZGUpLAogICAgICAgICAiciIgKCh4ODZfcmVnKWRzdFN0cmlkZSkKLSAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICAgICAgOiAiJSJGRl9SRUdfYSwgIiUiRkZfUkVHX2QKICAgICApOwogI2Vsc2UgLy9URU1QTEFURV9QUF9NTVggJiYgSEFWRV82UkVHUwogICAgIGZvcihpPTA7IGk8ODsgaSsrKQpAQCAtMzMwOSw3ICszMzA5LDcgQEAKICAqIEZpbHRlciBhcnJheSBvZiBieXRlcyAoWSBvciBVIG9yIFYgdmFsdWVzKQogICovCiBzdGF0aWMgdm9pZCBSRU5BTUUocG9zdFByb2Nlc3MpKGNvbnN0IHVpbnQ4X3Qgc3JjW10sIGludCBzcmNTdHJpZGUsIHVpbnQ4X3QgZHN0W10sIGludCBkc3RTdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUVBfU1RPUkVfVCBRUHNbXSwgaW50IFFQU3RyaWRlLCBpbnQgaXNDb2xvciwgUFBDb250ZXh0ICpjMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90IFFQc1tdLCBpbnQgUVBTdHJpZGUsIGludCBpc0NvbG9yLCBQUENvbnRleHQgKmMyKQogewogICAgIERFQ0xBUkVfQUxJR05FRCg4LCBQUENvbnRleHQsIGMpPSAqYzI7IC8vY29weSB0byBzdGFjayBmb3IgZmFzdGVyIGFjY2VzcwogICAgIGludCB4LHk7CmRpZmYgLS1naXQgYS9saWJwb3N0cHJvYy92ZXJzaW9uLmggYi9saWJwb3N0cHJvYy92ZXJzaW9uLmgKaW5kZXggOGY2MjU4Mi4uYzY3NzIwNSAxMDA2NDQKLS0tIGEvbGlicG9zdHByb2MvdmVyc2lvbi5oCisrKyBiL2xpYnBvc3Rwcm9jL3ZlcnNpb24uaApAQCAtMjgsOCArMjgsOCBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgogCi0jZGVmaW5lIExJQlBPU1RQUk9DX1ZFUlNJT05fTUFKT1IgIDU0Ci0jZGVmaW5lIExJQlBPU1RQUk9DX1ZFUlNJT05fTUlOT1IgICAwCisjZGVmaW5lIExJQlBPU1RQUk9DX1ZFUlNJT05fTUFKT1IgIDU1CisjZGVmaW5lIExJQlBPU1RQUk9DX1ZFUlNJT05fTUlOT1IgICAxCiAjZGVmaW5lIExJQlBPU1RQUk9DX1ZFUlNJT05fTUlDUk8gMTAwCiAKICNkZWZpbmUgTElCUE9TVFBST0NfVkVSU0lPTl9JTlQgQVZfVkVSU0lPTl9JTlQoTElCUE9TVFBST0NfVkVSU0lPTl9NQUpPUiwgXApAQCAtNDIsOCArNDIsNCBAQAogCiAjZGVmaW5lIExJQlBPU1RQUk9DX0lERU5UICAgICAgICJwb3N0cHJvYyIgQVZfU1RSSU5HSUZZKExJQlBPU1RQUk9DX1ZFUlNJT04pCiAKLSNpZm5kZWYgRkZfQVBJX1FQX1RZUEUKLSNkZWZpbmUgRkZfQVBJX1FQX1RZUEUgICAgIChMSUJQT1NUUFJPQ19WRVJTSU9OX01BSk9SIDwgNTUpCi0jZW5kaWYKLQogI2VuZGlmIC8qIFBPU1RQUk9DX1ZFUlNJT05fSCAqLwpkaWZmIC0tZ2l0IGEvbGlicmFyeS5tYWsgYi9saWJyYXJ5Lm1hawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxMDgyYy4uMDAwMDAwMAotLS0gYS9saWJyYXJ5Lm1haworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi1pbmNsdWRlICQoU1JDX1BBVEgpL2NvbW1vbi5tYWsKLQotTElCVkVSU0lPTiA6PSAkKGxpYiQoTkFNRSlfVkVSU0lPTikKLUxJQk1BSk9SICAgOj0gJChsaWIkKE5BTUUpX1ZFUlNJT05fTUFKT1IpCi1MSUJNSU5PUiAgIDo9ICQobGliJChOQU1FKV9WRVJTSU9OX01JTk9SKQotSU5DSU5TVERJUiA6PSAkKElOQ0RJUikvbGliJChOQU1FKQotCi1JTlNUSEVBREVSUyA6PSAkKElOU1RIRUFERVJTKSAkKEhFQURFUlM6JT0kKFNVQkRJUiklKQotCi1hbGwtJChDT05GSUdfU1RBVElDKTogJChTVUJESVIpJChMSUJOQU1FKQotYWxsLSQoQ09ORklHX1NIQVJFRCk6ICQoU1VCRElSKSQoU0xJQk5BTUUpCi0KLSQoU1VCRElSKSUtdGVzdC5vOiAkKFNVQkRJUiklLXRlc3QuYwotCSQoQ09NUElMRV9DKQotCi0kKFNVQkRJUiklLXRlc3QubzogJChTVUJESVIpJS5jCi0JJChDT01QSUxFX0MpCi0KLSQoU1VCRElSKSUtdGVzdC5pOiAkKFNVQkRJUiklLXRlc3QuYwotCSQoQ0MpICQoQ0NGTEFHUykgJChDQ19FKSAkPAotCi0kKFNVQkRJUiklLXRlc3QuaTogJChTVUJESVIpJS5jCi0JJChDQykgJChDQ0ZMQUdTKSAkKENDX0UpICQ8Ci0KLSQoU1VCRElSKXg4Ni8lJChERUZBVUxUX1lBU01EKS5hc206ICQoU1VCRElSKXg4Ni8lLmFzbQotCSQoREVQWUFTTSkgJChZQVNNRkxBR1MpIC1JICQoPEQpLyAtTSAtbyAkQCAkPCA+ICQoQDouYXNtPS5kKQotCSQoWUFTTSkgJChZQVNNRkxBR1MpIC1JICQoPEQpLyAtZSAkPCB8IHNlZCAnL14lL2Q7L14kJC9kOycgPiAkQAotCi0kKFNVQkRJUil4ODYvJS5vOiAkKFNVQkRJUil4ODYvJSQoWUFTTUQpLmFzbQotCSQoREVQWUFTTSkgJChZQVNNRkxBR1MpIC1JICQoPEQpLyAtTSAtbyAkQCAkPCA+ICQoQDoubz0uZCkKLQkkKFlBU00pICQoWUFTTUZMQUdTKSAtSSAkKDxEKS8gLW8gJEAgJChwYXRzdWJzdCAkKFNSQ19QQVRIKS8lLCQoU1JDX0xJTkspLyUsJDwpCi0JLSQoaWYgJChBU01TVFJJUEZMQUdTKSwgJChTVFJJUCkgJChBU01TVFJJUEZMQUdTKSAkQCkKLQotTElCT0JKUyA6PSAkKE9CSlMpICQoU1VCRElSKSUuaC5vICQoVEVTVE9CSlMpCi0kKExJQk9CSlMpICQoTElCT0JKUzoubz0ucykgJChMSUJPQkpTOi5vPS5pKTogICBDUFBGTEFHUyArPSAtREhBVkVfQVZfQ09ORklHX0gKLSQoVEVTVE9CSlMpICQoVEVTVE9CSlM6Lm89LmkpOiBDUFBGTEFHUyArPSAtRFRFU1QKLSQoVEVTVE9CSlMpICQoVEVTVE9CSlM6Lm89LmkpOiBDRkxBR1MgKz0gLVVtYWluCi0KLSQoU1VCRElSKSQoTElCTkFNRSk6ICQoT0JKUykKLQkkKFJNKSAkQAotCSQoQVIpICQoQVJGTEFHUykgJChBUl9PKSAkXgotCSQoUkFOTElCKSAkQAotCi1pbnN0YWxsLWhlYWRlcnM6IGluc3RhbGwtbGliJChOQU1FKS1oZWFkZXJzIGluc3RhbGwtbGliJChOQU1FKS1wa2djb25maWcKLQotaW5zdGFsbC1saWJzLSQoQ09ORklHX1NUQVRJQyk6IGluc3RhbGwtbGliJChOQU1FKS1zdGF0aWMKLWluc3RhbGwtbGlicy0kKENPTkZJR19TSEFSRUQpOiBpbnN0YWxsLWxpYiQoTkFNRSktc2hhcmVkCi0KLWRlZmluZSBSVUxFUwotJChUT09MUyk6ICAgICBUSElTTElCID0gJChGVUxMTkFNRTolPSQoTERfTElCKSkKLSQoVEVTVFBST0dTKTogVEhJU0xJQiA9ICQoU1VCRElSKSQoTElCTkFNRSkKLQotJChURVNUUFJPR1MpICQoVE9PTFMpOiAlJChFWEVTVUYpOiAlLm8gJChFWEVPQkpTKQotCSQkKExEKSAkKExERkxBR1MpICQoTERFWEVGTEFHUykgJCQoTERfTykgJCQoZmlsdGVyICUubywkJF4pICQkKFRISVNMSUIpICQoRkZFWFRSQUxJQlMpICQkKEVMSUJTKQotCi0kKFNVQkRJUikkKFNMSUJOQU1FKTogJChTVUJESVIpJChTTElCTkFNRV9XSVRIX01BSk9SKQotCSQoUSljZCAuLyQoU1VCRElSKSAmJiAkKExOX1MpICQoU0xJQk5BTUVfV0lUSF9NQUpPUikgJChTTElCTkFNRSkKLQotJChTVUJESVIpJChTTElCTkFNRV9XSVRIX01BSk9SKTogJChPQkpTKSAkKFNMSUJPQkpTKSAkKFNVQkRJUilsaWIkKE5BTUUpLnZlcgotCSQoU0xJQl9DUkVBVEVfREVGX0NNRCkKLQkkJChMRCkgJChTSEZMQUdTKSAkKExERkxBR1MpICQoTERMSUJGTEFHUykgJCQoTERfTykgJCQoZmlsdGVyICUubywkJF4pICQoRkZFWFRSQUxJQlMpCi0JJChTTElCX0VYVFJBX0NNRCkKLQotaWZkZWYgU1VCRElSCi0kKFNVQkRJUikkKFNMSUJOQU1FX1dJVEhfTUFKT1IpOiAkKERFUF9MSUJTKQotZW5kaWYKLQotY2xlYW46OgotCSQoUk0pICQoYWRkcHJlZml4ICQoU1VCRElSKSwqLXRlc3QkKEVYRVNVRikgJChDTEVBTkZJTEVTKSAkKENMRUFOU1VGRklYRVMpICQoTElCU1VGRklYRVMpKSBcCi0JICAgICQoQ0xFQU5TVUZGSVhFUzolPSQoU1VCRElSKSQoQVJDSCkvJSkKLQotZGlzdGNsZWFuOjogY2xlYW4KLQkkKFJNKSAkKERJU1RDTEVBTlNVRkZJWEVTOiU9JChTVUJESVIpJSkgJChESVNUQ0xFQU5TVUZGSVhFUzolPSQoU1VCRElSKSQoQVJDSCkvJSkKLQotaW5zdGFsbC1saWIkKE5BTUUpLXNoYXJlZDogJChTVUJESVIpJChTTElCTkFNRSkKLQkkKFEpbWtkaXIgLXAgIiQoU0hMSUJESVIpIgotCSQkKElOU1RBTEwpIC1tIDc1NSAkJDwgIiQoU0hMSUJESVIpLyQoU0xJQl9JTlNUQUxMX05BTUUpIgotCSQkKFNUUklQKSAiJChTSExJQkRJUikvJChTTElCX0lOU1RBTExfTkFNRSkiCi0JJChRKSQoZm9yZWFjaCBGLCQoU0xJQl9JTlNUQUxMX0xJTktTKSwoY2QgIiQoU0hMSUJESVIpIiAmJiAkKExOX1MpICQoU0xJQl9JTlNUQUxMX05BTUUpICQoRikpOykKLQkkKGlmICQoU0xJQl9JTlNUQUxMX0VYVFJBX1NITElCKSwkJChJTlNUQUxMKSAtbSA2NDQgJChTTElCX0lOU1RBTExfRVhUUkFfU0hMSUI6JT0kKFNVQkRJUiklKSAiJChTSExJQkRJUikiKQotCSQoaWYgJChTTElCX0lOU1RBTExfRVhUUkFfTElCKSwkKFEpbWtkaXIgLXAgIiQoTElCRElSKSIpCi0JJChpZiAkKFNMSUJfSU5TVEFMTF9FWFRSQV9MSUIpLCQkKElOU1RBTEwpIC1tIDY0NCAkKFNMSUJfSU5TVEFMTF9FWFRSQV9MSUI6JT0kKFNVQkRJUiklKSAiJChMSUJESVIpIikKLQotaW5zdGFsbC1saWIkKE5BTUUpLXN0YXRpYzogJChTVUJESVIpJChMSUJOQU1FKQotCSQoUSlta2RpciAtcCAiJChMSUJESVIpIgotCSQkKElOU1RBTEwpIC1tIDY0NCAkJDwgIiQoTElCRElSKSIKLQkkKExJQl9JTlNUQUxMX0VYVFJBX0NNRCkKLQotaW5zdGFsbC1saWIkKE5BTUUpLWhlYWRlcnM6ICQoYWRkcHJlZml4ICQoU1VCRElSKSwkKEhFQURFUlMpICQoQlVJTFRfSEVBREVSUykpCi0JJChRKW1rZGlyIC1wICIkKElOQ0lOU1RESVIpIgotCSQkKElOU1RBTEwpIC1tIDY0NCAkJF4gIiQoSU5DSU5TVERJUikiCi0KLWluc3RhbGwtbGliJChOQU1FKS1wa2djb25maWc6ICQoU1VCRElSKWxpYiQoRlVMTE5BTUUpLnBjCi0JJChRKW1rZGlyIC1wICIkKFBLR0NPTkZJR0RJUikiCi0JJCQoSU5TVEFMTCkgLW0gNjQ0ICQkXiAiJChQS0dDT05GSUdESVIpIgotCi11bmluc3RhbGwtbGliczo6Ci0JLSQoUk0pICIkKFNITElCRElSKS8kKFNMSUJOQU1FX1dJVEhfTUFKT1IpIiBcCi0JICAgICAgICIkKFNITElCRElSKS8kKFNMSUJOQU1FKSIgICAgICAgICAgICBcCi0JICAgICAgICIkKFNITElCRElSKS8kKFNMSUJOQU1FX1dJVEhfVkVSU0lPTikiCi0JLSQoUk0pICAkKFNMSUJfSU5TVEFMTF9FWFRSQV9TSExJQjolPSIkKFNITElCRElSKS8lIikKLQktJChSTSkgICQoU0xJQl9JTlNUQUxMX0VYVFJBX0xJQjolPSIkKExJQkRJUikvJSIpCi0JLSQoUk0pICIkKExJQkRJUikvJChMSUJOQU1FKSIKLQotdW5pbnN0YWxsLWhlYWRlcnM6OgotCSQoUk0pICQoYWRkcHJlZml4ICIkKElOQ0lOU1RESVIpLyIsJChIRUFERVJTKSAkKEJVSUxUX0hFQURFUlMpKQotCSQoUk0pICIkKFBLR0NPTkZJR0RJUikvbGliJChGVUxMTkFNRSkucGMiCi0JLXJtZGlyICIkKElOQ0lOU1RESVIpIgotZW5kZWYKLQotJChldmFsICQoUlVMRVMpKQotCi0kKFRPT0xTKTogICAgICQoREVQX0xJQlMpICQoU1VCRElSKSQoJChDT05GSUdfU0hBUkVEOnllcz1TKUxJQk5BTUUpCi0kKFRFU1RQUk9HUyk6ICQoREVQX0xJQlMpICQoU1VCRElSKSQoTElCTkFNRSkKLQotdGVzdHByb2dzOiAkKFRFU1RQUk9HUykKZGlmZiAtLWdpdCBhL2xpYnN3cmVzYW1wbGUvTWFrZWZpbGUgYi9saWJzd3Jlc2FtcGxlL01ha2VmaWxlCmluZGV4IDEyMGVlMzMuLjQyNjY2ZTQgMTAwNjQ0Ci0tLSBhL2xpYnN3cmVzYW1wbGUvTWFrZWZpbGUKKysrIGIvbGlic3dyZXNhbXBsZS9NYWtlZmlsZQpAQCAtMSw2ICsxLDUgQEAKLWluY2x1ZGUgJChTVUJESVIpLi4vY29uZmlnLm1hawotCiBOQU1FID0gc3dyZXNhbXBsZQorREVTQyA9IEZGbXBlZyBhdWRpbyByZXNhbXBsaW5nIGxpYnJhcnkKIEZGTElCUyA9IGF2dXRpbAogCiBIRUFERVJTID0gc3dyZXNhbXBsZS5oICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL2FhcmNoNjQvTWFrZWZpbGUgYi9saWJzd3Jlc2FtcGxlL2FhcmNoNjQvTWFrZWZpbGUKaW5kZXggMzIwZWQ2Ny4uNWMzNGY4ZCAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS9hYXJjaDY0L01ha2VmaWxlCisrKyBiL2xpYnN3cmVzYW1wbGUvYWFyY2g2NC9NYWtlZmlsZQpAQCAtMSw1ICsxLDcgQEAKLU9CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvYXVkaW9fY29udmVydF9pbml0Lm8KK09CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvYXVkaW9fY29udmVydF9pbml0Lm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFyY2g2NC9yZXNhbXBsZV9pbml0Lm8KIAogT0JKUy0kKENPTkZJR19ORU9OX0NMT0JCRVJfVEVTVCkgKz0gYWFyY2g2NC9uZW9udGVzdC5vCiAKLU5FT04tT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvYXVkaW9fY29udmVydF9uZW9uLm8KK05FT04tT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICs9IGFhcmNoNjQvYXVkaW9fY29udmVydF9uZW9uLm8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWFyY2g2NC9yZXNhbXBsZS5vCmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL2FhcmNoNjQvcmVzYW1wbGUuUyBiL2xpYnN3cmVzYW1wbGUvYWFyY2g2NC9yZXNhbXBsZS5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWQ2MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzd3Jlc2FtcGxlL2FhcmNoNjQvcmVzYW1wbGUuUwpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uIGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIgorCitmdW5jdGlvbiBmZl9yZXNhbXBsZV9jb21tb25fYXBwbHlfZmlsdGVyX3g0X2Zsb2F0X25lb24sIGV4cG9ydD0xCisgICAgbW92aSAgICAgICAgICAgICAgICB2MC40UywgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdG9yCisxOiAgbGQxICAgICAgICAgICAgICAgICB7djEuNFN9LCBbeDFdLCAjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyY1swLi4zXQorICAgIGxkMSAgICAgICAgICAgICAgICAge3YyLjRTfSwgW3gyXSwgIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXJbMC4uM10KKyAgICBmbWxhICAgICAgICAgICAgICAgIHYwLjRTLCB2MS40UywgdjIuNFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0b3IgKz0gc3JjWzAuLjNdICogZmlsdGVyWzAuLjNdCisgICAgc3VicyAgICAgICAgICAgICAgICB3MywgdzMsICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlcl9sZW5ndGggLT0gNAorICAgIGIuZ3QgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHVudGlsIGZpbHRlcl9sZW5ndGgKKyAgICBmYWRkcCAgICAgICAgICAgICAgIHYwLjRTLCB2MC40UywgdjAuNFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFpciBhZGRpbmcgb2YgdGhlIDR4MzItYml0IGFjY3VtdWxhdGVkIHZhbHVlcworICAgIGZhZGRwICAgICAgICAgICAgICAgdjAuNFMsIHYwLjRTLCB2MC40UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWlyIGFkZGluZyBvZiB0aGUgNHgzMi1iaXQgYWNjdW11bGF0ZWQgdmFsdWVzCisgICAgc3QxICAgICAgICAgICAgICAgICB7djAuU31bMF0sIFt4MF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFjY3VtdWxhdG9yCisgICAgcmV0CitlbmRmdW5jCisKK2Z1bmN0aW9uIGZmX3Jlc2FtcGxlX2NvbW1vbl9hcHBseV9maWx0ZXJfeDhfZmxvYXRfbmVvbiwgZXhwb3J0PTEKKyAgICBtb3ZpICAgICAgICAgICAgICAgIHYwLjRTLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0b3IKKzE6ICBsZDEgICAgICAgICAgICAgICAgIHt2MS40U30sIFt4MV0sICMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjWzAuLjNdCisgICAgbGQxICAgICAgICAgICAgICAgICB7djIuNFN9LCBbeDJdLCAjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlclswLi4zXQorICAgIGxkMSAgICAgICAgICAgICAgICAge3YzLjRTfSwgW3gxXSwgIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmNbNC4uN10KKyAgICBsZDEgICAgICAgICAgICAgICAgIHt2NC40U30sIFt4Ml0sICMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyWzQuLjddCisgICAgZm1sYSAgICAgICAgICAgICAgICB2MC40UywgdjEuNFMsIHYyLjRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjY3VtdWxhdG9yICs9IHNyY1swLi4zXSAqIGZpbHRlclswLi4zXQorICAgIGZtbGEgICAgICAgICAgICAgICAgdjAuNFMsIHYzLjRTLCB2NC40UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2N1bXVsYXRvciArPSBzcmNbNC4uN10gKiBmaWx0ZXJbNC4uN10KKyAgICBzdWJzICAgICAgICAgICAgICAgIHczLCB3MywgIzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyX2xlbmd0aCAtPSA4CisgICAgYi5ndCAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgdW50aWwgZmlsdGVyX2xlbmd0aAorICAgIGZhZGRwICAgICAgICAgICAgICAgdjAuNFMsIHYwLjRTLCB2MC40UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWlyIGFkZGluZyBvZiB0aGUgNHgzMi1iaXQgYWNjdW11bGF0ZWQgdmFsdWVzCisgICAgZmFkZHAgICAgICAgICAgICAgICB2MC40UywgdjAuNFMsIHYwLjRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhaXIgYWRkaW5nIG9mIHRoZSA0eDMyLWJpdCBhY2N1bXVsYXRlZCB2YWx1ZXMKKyAgICBzdDEgICAgICAgICAgICAgICAgIHt2MC5TfVswXSwgW3gwXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYWNjdW11bGF0b3IKKyAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcmVzYW1wbGVfY29tbW9uX2FwcGx5X2ZpbHRlcl94NF9zMTZfbmVvbiwgZXhwb3J0PTEKKyAgICBtb3ZpICAgICAgICAgICAgICAgIHYwLjRTLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0b3IKKzE6ICBsZDEgICAgICAgICAgICAgICAgIHt2MS40SH0sIFt4MV0sICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjWzAuLjNdCisgICAgbGQxICAgICAgICAgICAgICAgICB7djIuNEh9LCBbeDJdLCAjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlclswLi4zXQorICAgIHNtbGFsICAgICAgICAgICAgICAgdjAuNFMsIHYxLjRILCB2Mi40SCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2N1bXVsYXRvciArPSBzcmNbMC4uM10gKiBmaWx0ZXJbMC4uM10KKyAgICBzdWJzICAgICAgICAgICAgICAgIHczLCB3MywgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsdGVyX2xlbmd0aCAtPSA0CisgICAgYi5ndCAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgdW50aWwgZmlsdGVyX2xlbmd0aAorICAgIGFkZHAgICAgICAgICAgICAgICAgdjAuNFMsIHYwLjRTLCB2MC40UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWlyIGFkZGluZyBvZiB0aGUgNHgzMi1iaXQgYWNjdW11bGF0ZWQgdmFsdWVzCisgICAgYWRkcCAgICAgICAgICAgICAgICB2MC40UywgdjAuNFMsIHYwLjRTICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhaXIgYWRkaW5nIG9mIHRoZSA0eDMyLWJpdCBhY2N1bXVsYXRlZCB2YWx1ZXMKKyAgICBzdDEgICAgICAgICAgICAgICAgIHt2MC5TfVswXSwgW3gwXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYWNjdW11bGF0b3IKKyAgICByZXQKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcmVzYW1wbGVfY29tbW9uX2FwcGx5X2ZpbHRlcl94OF9zMTZfbmVvbiwgZXhwb3J0PTEKKyAgICBtb3ZpICAgICAgICAgICAgICAgIHYwLjRTLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0b3IKKzE6ICBsZDEgICAgICAgICAgICAgICAgIHt2MS44SH0sIFt4MV0sICMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjWzAuLjddCisgICAgbGQxICAgICAgICAgICAgICAgICB7djIuOEh9LCBbeDJdLCAjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlclswLi43XQorICAgIHNtbGFsICAgICAgICAgICAgICAgdjAuNFMsIHYxLjRILCB2Mi40SCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY2N1bXVsYXRvciArPSBzcmNbMC4uM10gKiBmaWx0ZXJbMC4uM10KKyAgICBzbWxhbDIgICAgICAgICAgICAgIHYwLjRTLCB2MS44SCwgdjIuOEggICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0b3IgKz0gc3JjWzQuLjddICogZmlsdGVyWzQuLjddCisgICAgc3VicyAgICAgICAgICAgICAgICB3MywgdzMsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlcl9sZW5ndGggLT0gOAorICAgIGIuZ3QgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHVudGlsIGZpbHRlcl9sZW5ndGgKKyAgICBhZGRwICAgICAgICAgICAgICAgIHYwLjRTLCB2MC40UywgdjAuNFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFpciBhZGRpbmcgb2YgdGhlIDR4MzItYml0IGFjY3VtdWxhdGVkIHZhbHVlcworICAgIGFkZHAgICAgICAgICAgICAgICAgdjAuNFMsIHYwLjRTLCB2MC40UyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYWlyIGFkZGluZyBvZiB0aGUgNHgzMi1iaXQgYWNjdW11bGF0ZWQgdmFsdWVzCisgICAgc3QxICAgICAgICAgICAgICAgICB7djAuU31bMF0sIFt4MF0sICM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGFjY3VtdWxhdG9yCisgICAgcmV0CitlbmRmdW5jCmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL2FhcmNoNjQvcmVzYW1wbGVfaW5pdC5jIGIvbGlic3dyZXNhbXBsZS9hYXJjaDY0L3Jlc2FtcGxlX2luaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDFlYzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlic3dyZXNhbXBsZS9hYXJjaDY0L3Jlc2FtcGxlX2luaXQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIEF1ZGlvIHJlc2FtcGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9jcHUuaCIKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3Jlc2FtcGxlLmgiCisKKyNkZWZpbmUgREVDTEFSRV9SRVNBTVBMRV9DT01NT05fVEVNUExBVEUoVFlQRSwgREVMRU0sIEZFTEVNLCBGRUxFTTIsIE9VVCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3Jlc2FtcGxlX2NvbW1vbl9hcHBseV9maWx0ZXJfeDRfIyNUWVBFIyNfbmVvbihGRUxFTTIgKmFjYywgY29uc3QgREVMRU0gKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZFTEVNICpmaWx0ZXIsIGludCBsZW5ndGgpOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIGZmX3Jlc2FtcGxlX2NvbW1vbl9hcHBseV9maWx0ZXJfeDhfIyNUWVBFIyNfbmVvbihGRUxFTTIgKmFjYywgY29uc3QgREVMRU0gKnNyYywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZFTEVNICpmaWx0ZXIsIGludCBsZW5ndGgpOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgaW50IGZmX3Jlc2FtcGxlX2NvbW1vbl8jI1RZUEUjI19uZW9uKFJlc2FtcGxlQ29udGV4dCAqYywgdm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc291cmNlLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCB1cGRhdGVfY3R4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgREVMRU0gKmRzdCA9IGRlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBERUxFTSAqc3JjID0gc291cmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBkc3RfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGluZGV4ID0gYy0+aW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZnJhYyA9IGMtPmZyYWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBzYW1wbGVfaW5kZXggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHg0X2FsaWduZWRfZmlsdGVyX2xlbmd0aCA9IGMtPmZpbHRlcl9sZW5ndGggJiB+MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeDhfYWxpZ25lZF9maWx0ZXJfbGVuZ3RoID0gYy0+ZmlsdGVyX2xlbmd0aCAmIH43OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKGluZGV4ID49IGMtPnBoYXNlX2NvdW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2FtcGxlX2luZGV4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbmRleCAtPSBjLT5waGFzZV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoZHN0X2luZGV4ID0gMDsgZHN0X2luZGV4IDwgbjsgZHN0X2luZGV4KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZFTEVNICpmaWx0ZXIgPSAoKEZFTEVNICopIGMtPmZpbHRlcl9iYW5rKSArIGMtPmZpbHRlcl9hbGxvYyAqIGluZGV4OyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGRUxFTTIgdmFsID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoeDhfYWxpZ25lZF9maWx0ZXJfbGVuZ3RoID49IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmZl9yZXNhbXBsZV9jb21tb25fYXBwbHlfZmlsdGVyX3g4XyMjVFlQRSMjX25lb24oJnZhbCwgJnNyY1tzYW1wbGVfaW5kZXhdLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIHg4X2FsaWduZWRfZmlsdGVyX2xlbmd0aCk7ICAgXAorICAgICAgICAgICAgaSArPSB4OF9hbGlnbmVkX2ZpbHRlcl9sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIGlmICh4NF9hbGlnbmVkX2ZpbHRlcl9sZW5ndGggPj0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmZfcmVzYW1wbGVfY29tbW9uX2FwcGx5X2ZpbHRlcl94NF8jI1RZUEUjI19uZW9uKCZ2YWwsICZzcmNbc2FtcGxlX2luZGV4XSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCB4NF9hbGlnbmVkX2ZpbHRlcl9sZW5ndGgpOyAgIFwKKyAgICAgICAgICAgIGkgKz0geDRfYWxpZ25lZF9maWx0ZXJfbGVuZ3RoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoOyBpIDwgYy0+ZmlsdGVyX2xlbmd0aDsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHZhbCArPSBzcmNbc2FtcGxlX2luZGV4ICsgaV0gKiAoRkVMRU0yKWZpbHRlcltpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9VVChkc3RbZHN0X2luZGV4XSwgdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmcmFjICArPSBjLT5kc3RfaW5jcl9tb2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGluZGV4ICs9IGMtPmRzdF9pbmNyX2RpdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZyYWMgPj0gYy0+c3JjX2luY3IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZnJhYyAtPSBjLT5zcmNfaW5jcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbmRleCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChpbmRleCA+PSBjLT5waGFzZV9jb3VudCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNhbXBsZV9pbmRleCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW5kZXggLT0gYy0+cGhhc2VfY291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHVwZGF0ZV9jdHgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+ZnJhYyA9IGZyYWM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjLT5pbmRleCA9IGluZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzYW1wbGVfaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBPVVQoZCwgdikgZCA9IHYKK0RFQ0xBUkVfUkVTQU1QTEVfQ09NTU9OX1RFTVBMQVRFKGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBPVVQpCisjdW5kZWYgT1VUCisKKyNkZWZpbmUgT1VUKGQsIHYpICh2KSA9ICgodikgKyAoMTw8KDE0KSkpPj4xNTsgKGQpID0gYXZfY2xpcF9pbnQxNih2KQorREVDTEFSRV9SRVNBTVBMRV9DT01NT05fVEVNUExBVEUoczE2LCBpbnQxNl90LCBpbnQxNl90LCBpbnQzMl90LCBPVVQpCisjdW5kZWYgT1VUCisKK2F2X2NvbGQgdm9pZCBzd3JpX3Jlc2FtcGxlX2RzcF9hYXJjaDY0X2luaXQoUmVzYW1wbGVDb250ZXh0ICpjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoIWhhdmVfbmVvbihjcHVfZmxhZ3MpKQorICAgICAgICByZXR1cm47CisKKyAgICBzd2l0Y2goYy0+Zm9ybWF0KSB7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6CisgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9jb21tb24gPSBmZl9yZXNhbXBsZV9jb21tb25fZmxvYXRfbmVvbjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNlA6CisgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9jb21tb24gPSBmZl9yZXNhbXBsZV9jb21tb25fczE2X25lb247CisgICAgICAgIGJyZWFrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2xpYnN3cmVzYW1wbGUvYXJtL01ha2VmaWxlIGIvbGlic3dyZXNhbXBsZS9hcm0vTWFrZWZpbGUKaW5kZXggNjBmM2Y2ZC4uNTNhYjQ2MiAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS9hcm0vTWFrZWZpbGUKKysrIGIvbGlic3dyZXNhbXBsZS9hcm0vTWFrZWZpbGUKQEAgLTEsNSArMSw4IEBACi1PQkpTICAgICAgKz0gYXJtL2F1ZGlvX2NvbnZlcnRfaW5pdC5vCitPQkpTICAgICAgKz0gYXJtL2F1ZGlvX2NvbnZlcnRfaW5pdC5vIFwKKyAgICAgICAgICAgICBhcm0vcmVzYW1wbGVfaW5pdC5vCisKIAogT0JKUy0kKENPTkZJR19ORU9OX0NMT0JCRVJfVEVTVCkgKz0gYXJtL25lb250ZXN0Lm8KIAotTkVPTi1PQkpTICs9IGFybS9hdWRpb19jb252ZXJ0X25lb24ubworTkVPTi1PQkpTICs9IGFybS9hdWRpb19jb252ZXJ0X25lb24ubyBcCisgICAgICAgICAgICAgYXJtL3Jlc2FtcGxlLm8KZGlmZiAtLWdpdCBhL2xpYnN3cmVzYW1wbGUvYXJtL2F1ZGlvX2NvbnZlcnRfbmVvbi5TIGIvbGlic3dyZXNhbXBsZS9hcm0vYXVkaW9fY29udmVydF9uZW9uLlMKaW5kZXggMWY4ODMxNi4uMDg1ZDUwYSAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS9hcm0vYXVkaW9fY29udmVydF9uZW9uLlMKKysrIGIvbGlic3dyZXNhbXBsZS9hcm0vYXVkaW9fY29udmVydF9uZW9uLlMKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgogCiBmdW5jdGlvbiBzd3JpX29sZGFwaV9jb252X2ZsdF90b19zMTZfbmVvbiwgZXhwb3J0PTEKKy5MX3N3cmlfb2xkYXBpX2NvbnZfZmx0X3RvX3MxNl9uZW9uOgogICAgICAgICBzdWJzICAgICAgICAgICAgcjIsICByMiwgICM4CiAgICAgICAgIHZsZDEuMzIgICAgICAgICB7cTB9LCAgICAgW3IxLDoxMjhdIQogICAgICAgICB2Y3Z0LnMzMi5mMzIgICAgcTgsICBxMCwgICMzMQpAQCAtNjYsNiArNjcsNyBAQAogZW5kZnVuYwogCiBmdW5jdGlvbiBzd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uLCBleHBvcnQ9MQorLkxfc3dyaV9vbGRhcGlfY29udl9mbHRwX3RvX3MxNl8yY2hfbmVvbjoKICAgICAgICAgbGRtICAgICAgICAgICAgIHIxLCAge3IxLCByM30KICAgICAgICAgc3VicyAgICAgICAgICAgIHIyLCAgcjIsICAjOAogICAgICAgICB2bGQxLjMyICAgICAgICAge3EwfSwgICAgIFtyMSw6MTI4XSEKQEAgLTEzMyw4ICsxMzUsOCBAQAogICAgICAgICBjbXAgICAgICAgICAgICAgcjMsICAjMgogICAgICAgICBpdHQgICAgICAgICAgICAgbHQKICAgICAgICAgbGRybHQgICAgICAgICAgIHIxLCAgW3IxXQotICAgICAgICBibHQgICAgICAgICAgICAgWChzd3JpX29sZGFwaV9jb252X2ZsdF90b19zMTZfbmVvbikKLSAgICAgICAgYmVxICAgICAgICAgICAgIFgoc3dyaV9vbGRhcGlfY29udl9mbHRwX3RvX3MxNl8yY2hfbmVvbikKKyAgICAgICAgYmx0ICAgICAgICAgICAgIC5MX3N3cmlfb2xkYXBpX2NvbnZfZmx0X3RvX3MxNl9uZW9uCisgICAgICAgIGJlcSAgICAgICAgICAgICAuTF9zd3JpX29sZGFwaV9jb252X2ZsdHBfdG9fczE2XzJjaF9uZW9uCiAKICAgICAgICAgcHVzaCAgICAgICAgICAgIHtyNC1yOCwgbHJ9CiAgICAgICAgIGNtcCAgICAgICAgICAgICByMywgICM0CmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL2FybS9yZXNhbXBsZS5TIGIvbGlic3dyZXNhbXBsZS9hcm0vcmVzYW1wbGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2U3NjIzCi0tLSAvZGV2L251bGwKKysrIGIvbGlic3dyZXNhbXBsZS9hcm0vcmVzYW1wbGUuUwpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uIHN0dXBlZmxpeC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2FzbS5TIgorCitmdW5jdGlvbiBmZl9yZXNhbXBsZV9jb21tb25fYXBwbHlfZmlsdGVyX3g0X2Zsb2F0X25lb24sIGV4cG9ydD0xCisgICAgdm1vdi5mMzIgICAgICAgICAgICBxMCwgIzAuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgYWNjdW11bGF0b3IKKzE6ICB2bGQxLjMyICAgICAgICAgICAgIHtxMX0sIFtyMV0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNbMC4uM10KKyAgICB2bGQxLjMyICAgICAgICAgICAgIHtxMn0sIFtyMl0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXJbMC4uM10KKyAgICB2bWxhLmYzMiAgICAgICAgICAgIHEwLCBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBhY2N1bXVsYXRvciArPSBzcmNbMC4uM10gKiBmaWx0ZXJbMC4uM10KKyAgICBzdWJzICAgICAgICAgICAgICAgIHIzLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXJfbGVuZ3RoIC09IDQKKyAgICBiZ3QgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb29wIHVudGlsIGZpbHRlcl9sZW5ndGgKKyAgICB2cGFkZC5mMzIgICAgICAgICAgIGQwLCBkMCwgZDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBwYWlyIGFkZGluZyBvZiB0aGUgNHgzMi1iaXQgYWNjdW11bGF0ZWQgdmFsdWVzCisgICAgdnBhZGQuZjMyICAgICAgICAgICBkMCwgZDAsIGQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcGFpciBhZGRpbmcgb2YgdGhlIDR4MzItYml0IGFjY3VtdWxhdG9yIHZhbHVlcworICAgIHZzdDEuMzIgICAgICAgICAgICAge2QwWzBdfSwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHdyaXRlIGFjY3VtdWxhdG9yCisgICAgbW92IHBjLCBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9yZXNhbXBsZV9jb21tb25fYXBwbHlfZmlsdGVyX3g4X2Zsb2F0X25lb24sIGV4cG9ydD0xCisgICAgdm1vdi5mMzIgICAgICAgICAgICBxMCwgIzAuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgYWNjdW11bGF0b3IKKzE6ICB2bGQxLjMyICAgICAgICAgICAgIHtxMX0sIFtyMV0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNbMC4uM10KKyAgICB2bGQxLjMyICAgICAgICAgICAgIHtxMn0sIFtyMl0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXJbMC4uM10KKyAgICB2bGQxLjMyICAgICAgICAgICAgIHtxOH0sIFtyMV0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNbNC4uN10KKyAgICB2bGQxLjMyICAgICAgICAgICAgIHtxOX0sIFtyMl0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXJbNC4uN10KKyAgICB2bWxhLmYzMiAgICAgICAgICAgIHEwLCBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBhY2N1bXVsYXRvciArPSBzcmNbMC4uM10gKiBmaWx0ZXJbMC4uM10KKyAgICB2bWxhLmYzMiAgICAgICAgICAgIHEwLCBxOCwgcTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBhY2N1bXVsYXRvciArPSBzcmNbNC4uN10gKiBmaWx0ZXJbNC4uN10KKyAgICBzdWJzICAgICAgICAgICAgICAgIHIzLCAjOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXJfbGVuZ3RoIC09IDgKKyAgICBiZ3QgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb29wIHVudGlsIGZpbHRlcl9sZW5ndGgKKyAgICB2cGFkZC5mMzIgICAgICAgICAgIGQwLCBkMCwgZDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBwYWlyIGFkZGluZyBvZiB0aGUgNHgzMi1iaXQgYWNjdW11bGF0ZWQgdmFsdWVzCisgICAgdnBhZGQuZjMyICAgICAgICAgICBkMCwgZDAsIGQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcGFpciBhZGRpbmcgb2YgdGhlIDR4MzItYml0IGFjY3VtdWxhdG9yIHZhbHVlcworICAgIHZzdDEuMzIgICAgICAgICAgICAge2QwWzBdfSwgW3IwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHdyaXRlIGFjY3VtdWxhdG9yCisgICAgbW92IHBjLCBscgorZW5kZnVuYworCitmdW5jdGlvbiBmZl9yZXNhbXBsZV9jb21tb25fYXBwbHlfZmlsdGVyX3g0X3MxNl9uZW9uLCBleHBvcnQ9MQorICAgIHZtb3YuczMyICAgICAgICAgICAgcTAsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGFjY3VtdWxhdG9yCisxOiAgdmxkMS4xNiAgICAgICAgICAgICB7ZDJ9LCBbcjFdISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc3JjWzAuLjNdCisgICAgdmxkMS4xNiAgICAgICAgICAgICB7ZDR9LCBbcjJdISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZmlsdGVyWzAuLjNdCisgICAgdm1sYWwuczE2ICAgICAgICAgICBxMCwgZDIsIGQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgYWNjdW11bGF0b3IgKz0gc3JjWzAuLjNdICogZmlsdGVyWzAuLjNdCisgICAgc3VicyAgICAgICAgICAgICAgICByMywgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZmlsdGVyX2xlbmd0aCAtPSA0CisgICAgYmd0ICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9vcCB1bnRpbCBmaWx0ZXJfbGVuZ3RoCisgICAgdnBhZGQuczMyICAgICAgICAgICBkMCwgZDAsIGQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcGFpciBhZGRpbmcgb2YgdGhlIDR4MzItYml0IGFjY3VtdWxhdGVkIHZhbHVlcworICAgIHZwYWRkLnMzMiAgICAgICAgICAgZDAsIGQwLCBkMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHBhaXIgYWRkaW5nIG9mIHRoZSA0eDMyLWJpdCBhY2N1bXVsYXRvciB2YWx1ZXMKKyAgICB2c3QxLjMyICAgICAgICAgICAgIHtkMFswXX0sIFtyMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB3cml0ZSBhY2N1bXVsYXRvcgorICAgIG1vdiBwYywgbHIKK2VuZGZ1bmMKKworZnVuY3Rpb24gZmZfcmVzYW1wbGVfY29tbW9uX2FwcGx5X2ZpbHRlcl94OF9zMTZfbmVvbiwgZXhwb3J0PTEKKyAgICB2bW92LnMzMiAgICAgICAgICAgIHEwLCAjMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBhY2N1bXVsYXRvcgorMTogIHZsZDEuMTYgICAgICAgICAgICAge3ExfSwgW3IxXSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY1swLi43XQorICAgIHZsZDEuMTYgICAgICAgICAgICAge3EyfSwgW3IyXSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGZpbHRlclswLi43XQorICAgIHZtbGFsLnMxNiAgICAgICAgICAgcTAsIGQyLCBkNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGFjY3VtdWxhdG9yICs9IHNyY1swLi4zXSAqIGZpbHRlclswLi4zXQorICAgIHZtbGFsLnMxNiAgICAgICAgICAgcTAsIGQzLCBkNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGFjY3VtdWxhdG9yICs9IHNyY1s0Li43XSAqIGZpbHRlcls0Li43XQorICAgIHN1YnMgICAgICAgICAgICAgICAgcjMsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGZpbHRlcl9sZW5ndGggLT0gOAorICAgIGJndCAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGxvb3AgdW50aWwgZmlsdGVyX2xlbmd0aAorICAgIHZwYWRkLnMzMiAgICAgICAgICAgZDAsIGQwLCBkMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHBhaXIgYWRkaW5nIG9mIHRoZSA0eDMyLWJpdCBhY2N1bXVsYXRlZCB2YWx1ZXMKKyAgICB2cGFkZC5zMzIgICAgICAgICAgIGQwLCBkMCwgZDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBwYWlyIGFkZGluZyBvZiB0aGUgNHgzMi1iaXQgYWNjdW11bGF0b3IgdmFsdWVzCisgICAgdnN0MS4zMiAgICAgICAgICAgICB7ZDBbMF19LCBbcjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgd3JpdGUgYWNjdW11bGF0b3IKKyAgICBtb3YgcGMsIGxyCitlbmRmdW5jCmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL2FybS9yZXNhbXBsZV9pbml0LmMgYi9saWJzd3Jlc2FtcGxlL2FybS9yZXNhbXBsZV9pbml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliOTc2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnN3cmVzYW1wbGUvYXJtL3Jlc2FtcGxlX2luaXQuYwpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIEF1ZGlvIHJlc2FtcGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvcmVzYW1wbGUuaCIKKworI2RlZmluZSBERUNMQVJFX1JFU0FNUExFX0NPTU1PTl9URU1QTEFURShUWVBFLCBERUxFTSwgRkVMRU0sIEZFTEVNMiwgT1VUKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfcmVzYW1wbGVfY29tbW9uX2FwcGx5X2ZpbHRlcl94NF8jI1RZUEUjI19uZW9uKEZFTEVNMiAqYWNjLCBjb25zdCBERUxFTSAqc3JjLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkVMRU0gKmZpbHRlciwgaW50IGxlbmd0aCk7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgZmZfcmVzYW1wbGVfY29tbW9uX2FwcGx5X2ZpbHRlcl94OF8jI1RZUEUjI19uZW9uKEZFTEVNMiAqYWNjLCBjb25zdCBERUxFTSAqc3JjLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkVMRU0gKmZpbHRlciwgaW50IGxlbmd0aCk7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgZmZfcmVzYW1wbGVfY29tbW9uXyMjVFlQRSMjX25lb24oUmVzYW1wbGVDb250ZXh0ICpjLCB2b2lkICpkZXN0LCBjb25zdCB2b2lkICpzb3VyY2UsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50IHVwZGF0ZV9jdHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBERUxFTSAqZHN0ID0gZGVzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IERFTEVNICpzcmMgPSBzb3VyY2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGRzdF9pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaW5kZXggPSBjLT5pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBmcmFjID0gYy0+ZnJhYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNhbXBsZV9pbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeDRfYWxpZ25lZF9maWx0ZXJfbGVuZ3RoID0gYy0+ZmlsdGVyX2xlbmd0aCAmIH4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4OF9hbGlnbmVkX2ZpbHRlcl9sZW5ndGggPSBjLT5maWx0ZXJfbGVuZ3RoICYgfjc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAoaW5kZXggPj0gYy0+cGhhc2VfY291bnQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzYW1wbGVfaW5kZXgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGluZGV4IC09IGMtPnBoYXNlX2NvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChkc3RfaW5kZXggPSAwOyBkc3RfaW5kZXggPCBuOyBkc3RfaW5kZXgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRkVMRU0gKmZpbHRlciA9ICgoRkVMRU0gKikgYy0+ZmlsdGVyX2JhbmspICsgYy0+ZmlsdGVyX2FsbG9jICogaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZFTEVNMiB2YWwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICh4OF9hbGlnbmVkX2ZpbHRlcl9sZW5ndGggPj0gOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZmX3Jlc2FtcGxlX2NvbW1vbl9hcHBseV9maWx0ZXJfeDhfIyNUWVBFIyNfbmVvbigmdmFsLCAmc3JjW3NhbXBsZV9pbmRleF0sICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciwgeDhfYWxpZ25lZF9maWx0ZXJfbGVuZ3RoKTsgICBcCisgICAgICAgICAgICBpICs9IHg4X2FsaWduZWRfZmlsdGVyX2xlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgaWYgKHg0X2FsaWduZWRfZmlsdGVyX2xlbmd0aCA+PSA0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmZl9yZXNhbXBsZV9jb21tb25fYXBwbHlfZmlsdGVyX3g0XyMjVFlQRSMjX25lb24oJnZhbCwgJnNyY1tzYW1wbGVfaW5kZXhdLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIHg0X2FsaWduZWRfZmlsdGVyX2xlbmd0aCk7ICAgXAorICAgICAgICAgICAgaSArPSB4NF9hbGlnbmVkX2ZpbHRlcl9sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICg7IGkgPCBjLT5maWx0ZXJfbGVuZ3RoOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdmFsICs9IHNyY1tzYW1wbGVfaW5kZXggKyBpXSAqIChGRUxFTTIpZmlsdGVyW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1VUKGRzdFtkc3RfaW5kZXhdLCB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZyYWMgICs9IGMtPmRzdF9pbmNyX21vZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW5kZXggKz0gYy0+ZHN0X2luY3JfZGl2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnJhYyA+PSBjLT5zcmNfaW5jcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmcmFjIC09IGMtPnNyY19pbmNyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGluZGV4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKGluZGV4ID49IGMtPnBoYXNlX2NvdW50KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2FtcGxlX2luZGV4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbmRleCAtPSBjLT5waGFzZV9jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodXBkYXRlX2N0eCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjLT5mcmFjID0gZnJhYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGMtPmluZGV4ID0gaW5kZXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHNhbXBsZV9pbmRleDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIE9VVChkLCB2KSBkID0gdgorREVDTEFSRV9SRVNBTVBMRV9DT01NT05fVEVNUExBVEUoZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIE9VVCkKKyN1bmRlZiBPVVQKKworI2RlZmluZSBPVVQoZCwgdikgKHYpID0gKCh2KSArICgxPDwoMTQpKSk+PjE1OyAoZCkgPSBhdl9jbGlwX2ludDE2KHYpCitERUNMQVJFX1JFU0FNUExFX0NPTU1PTl9URU1QTEFURShzMTYsIGludDE2X3QsIGludDE2X3QsIGludDMyX3QsIE9VVCkKKyN1bmRlZiBPVVQKKworYXZfY29sZCB2b2lkIHN3cmlfcmVzYW1wbGVfZHNwX2FybV9pbml0KFJlc2FtcGxlQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworCisgICAgaWYgKCFoYXZlX25lb24oY3B1X2ZsYWdzKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoKGMtPmZvcm1hdCkgeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFRQOgorICAgICAgICBjLT5kc3AucmVzYW1wbGVfY29tbW9uID0gZmZfcmVzYW1wbGVfY29tbW9uX2Zsb2F0X25lb247CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgorICAgICAgICBjLT5kc3AucmVzYW1wbGVfY29tbW9uID0gZmZfcmVzYW1wbGVfY29tbW9uX3MxNl9uZW9uOworICAgICAgICBicmVhazsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL2F1ZGlvY29udmVydC5jIGIvbGlic3dyZXNhbXBsZS9hdWRpb2NvbnZlcnQuYwppbmRleCA1OGIwYmYzLi45NmNlODRhIDEwMDY0NAotLS0gYS9saWJzd3Jlc2FtcGxlL2F1ZGlvY29udmVydC5jCisrKyBiL2xpYnN3cmVzYW1wbGUvYXVkaW9jb252ZXJ0LmMKQEAgLTU0LDI2ICs1NCwzNyBAQAogQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCB1aW50OF90LCBBVl9TQU1QTEVfRk1UX1U4ICwgICooY29uc3QgdWludDhfdCopcGkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfVTggLCAoKihjb25zdCB1aW50OF90KilwaSAtIDB4ODBVKTw8OCkKIENPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgQVZfU0FNUExFX0ZNVF9VOCAsICgqKGNvbnN0IHVpbnQ4X3QqKXBpIC0gMHg4MFUpPDwyNCkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1M2NCwgaW50NjRfdCwgQVZfU0FNUExFX0ZNVF9VOCAsICh1aW50NjRfdCkoKCooY29uc3QgdWludDhfdCopcGkgLSAweDgwVSkpPDw1NikKIENPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX0ZMVCwgZmxvYXQgICwgQVZfU0FNUExFX0ZNVF9VOCAsICgqKGNvbnN0IHVpbnQ4X3QqKXBpIC0gMHg4MCkqKDEuMGYvICgxPDw3KSkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfVTggLCAoKihjb25zdCB1aW50OF90KilwaSAtIDB4ODApKigxLjAgLyAoMTw8NykpKQogQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCB1aW50OF90LCBBVl9TQU1QTEVfRk1UX1MxNiwgKCooY29uc3QgaW50MTZfdCopcGk+PjgpICsgMHg4MCkKIENPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgaW50MTZfdCwgQVZfU0FNUExFX0ZNVF9TMTYsICAqKGNvbnN0IGludDE2X3QqKXBpKQogQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX1MxNiwgICooY29uc3QgaW50MTZfdCopcGk8PDE2KQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzY0LCBpbnQ2NF90LCBBVl9TQU1QTEVfRk1UX1MxNiwgKHVpbnQ2NF90KSgqKGNvbnN0IGludDE2X3QqKXBpKTw8NDgpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0ICAsIEFWX1NBTVBMRV9GTVRfUzE2LCAgKihjb25zdCBpbnQxNl90KilwaSooMS4wZi8gKDE8PDE1KSkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfUzE2LCAgKihjb25zdCBpbnQxNl90KilwaSooMS4wIC8gKDE8PDE1KSkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9VOCAsIHVpbnQ4X3QsIEFWX1NBTVBMRV9GTVRfUzMyLCAoKihjb25zdCBpbnQzMl90KilwaT4+MjQpICsgMHg4MCkKIENPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgaW50MTZfdCwgQVZfU0FNUExFX0ZNVF9TMzIsICAqKGNvbnN0IGludDMyX3QqKXBpPj4xNikKIENPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgQVZfU0FNUExFX0ZNVF9TMzIsICAqKGNvbnN0IGludDMyX3QqKXBpKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzY0LCBpbnQ2NF90LCBBVl9TQU1QTEVfRk1UX1MzMiwgKHVpbnQ2NF90KSgqKGNvbnN0IGludDMyX3QqKXBpKTw8MzIpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0ICAsIEFWX1NBTVBMRV9GTVRfUzMyLCAgKihjb25zdCBpbnQzMl90KilwaSooMS4wZi8gKDFVPDwzMSkpKQogQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfREJMLCBkb3VibGUgLCBBVl9TQU1QTEVfRk1UX1MzMiwgICooY29uc3QgaW50MzJfdCopcGkqKDEuMCAvICgxVTw8MzEpKSkKK0NPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9TNjQsICgqKGNvbnN0IGludDY0X3QqKXBpPj41NikgKyAweDgwKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX1M2NCwgICooY29uc3QgaW50NjRfdCopcGk+PjQ4KQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX1M2NCwgICooY29uc3QgaW50NjRfdCopcGk+PjMyKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzY0LCBpbnQ2NF90LCBBVl9TQU1QTEVfRk1UX1M2NCwgICooY29uc3QgaW50NjRfdCopcGkpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0ICAsIEFWX1NBTVBMRV9GTVRfUzY0LCAgKihjb25zdCBpbnQ2NF90KilwaSooMS4wZi8gKElOVDY0X0MoMSk8PDYzKSkpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfUzY0LCAgKihjb25zdCBpbnQ2NF90KilwaSooMS4wIC8gKElOVDY0X0MoMSk8PDYzKSkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9VOCAsIHVpbnQ4X3QsIEFWX1NBTVBMRV9GTVRfRkxULCBhdl9jbGlwX3VpbnQ4KCAgbHJpbnRmKCooY29uc3QgZmxvYXQqKXBpICogKDE8PDcpKSArIDB4ODApKQogQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzE2LCBpbnQxNl90LCBBVl9TQU1QTEVfRk1UX0ZMVCwgYXZfY2xpcF9pbnQxNiggIGxyaW50ZigqKGNvbnN0IGZsb2F0KilwaSAqICgxPDwxNSkpKSkKIENPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1MzMiwgaW50MzJfdCwgQVZfU0FNUExFX0ZNVF9GTFQsIGF2X2NsaXBsX2ludDMyKGxscmludGYoKihjb25zdCBmbG9hdCopcGkgKiAoMVU8PDMxKSkpKQorQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzY0LCBpbnQ2NF90LCBBVl9TQU1QTEVfRk1UX0ZMVCwgbGxyaW50ZigqKGNvbnN0IGZsb2F0KilwaSAqIChJTlQ2NF9DKDEpPDw2MykpKQogQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfRkxULCBmbG9hdCAgLCBBVl9TQU1QTEVfRk1UX0ZMVCwgKihjb25zdCBmbG9hdCopcGkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfRkxULCAqKGNvbnN0IGZsb2F0KilwaSkKIENPTlZfRlVOQyhBVl9TQU1QTEVfRk1UX1U4ICwgdWludDhfdCwgQVZfU0FNUExFX0ZNVF9EQkwsIGF2X2NsaXBfdWludDgoICBscmludCgqKGNvbnN0IGRvdWJsZSopcGkgKiAoMTw8NykpICsgMHg4MCkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMTYsIGludDE2X3QsIEFWX1NBTVBMRV9GTVRfREJMLCBhdl9jbGlwX2ludDE2KCAgbHJpbnQoKihjb25zdCBkb3VibGUqKXBpICogKDE8PDE1KSkpKQogQ09OVl9GVU5DKEFWX1NBTVBMRV9GTVRfUzMyLCBpbnQzMl90LCBBVl9TQU1QTEVfRk1UX0RCTCwgYXZfY2xpcGxfaW50MzIobGxyaW50KCooY29uc3QgZG91YmxlKilwaSAqICgxVTw8MzEpKSkpCitDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9TNjQsIGludDY0X3QsIEFWX1NBTVBMRV9GTVRfREJMLCBsbHJpbnQoKihjb25zdCBkb3VibGUqKXBpICogKElOVDY0X0MoMSk8PDYzKSkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9GTFQsIGZsb2F0ICAsIEFWX1NBTVBMRV9GTVRfREJMLCAqKGNvbnN0IGRvdWJsZSopcGkpCiBDT05WX0ZVTkMoQVZfU0FNUExFX0ZNVF9EQkwsIGRvdWJsZSAsIEFWX1NBTVBMRV9GTVRfREJMLCAqKGNvbnN0IGRvdWJsZSopcGkpCiAKQEAgLTg1LDI2ICs5NiwzNyBAQAogICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfVTggKSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1U4ICksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9VOCApLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TNjQsIEFWX1NBTVBMRV9GTVRfVTggKSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCBBVl9TQU1QTEVfRk1UX1MxNiksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9TMTYpLAogICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfUzE2KSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1MxNiksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9TMTYpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TNjQsIEFWX1NBTVBMRV9GTVRfUzE2KSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCBBVl9TQU1QTEVfRk1UX1MzMiksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9TMzIpLAogICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfUzMyKSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1MzMiksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9TMzIpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TNjQsIEFWX1NBTVBMRV9GTVRfUzMyKSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCBBVl9TQU1QTEVfRk1UX0ZMVCksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9GTFQpLAogICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfRkxUKSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX0ZMVCksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9GTFQpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TNjQsIEFWX1NBTVBMRV9GTVRfRkxUKSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCBBVl9TQU1QTEVfRk1UX0RCTCksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9EQkwpLAogICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfREJMKSwKICAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX0RCTCksCiAgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9EQkwpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TNjQsIEFWX1NBTVBMRV9GTVRfREJMKSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfVTggLCBBVl9TQU1QTEVfRk1UX1M2NCksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX1MxNiwgQVZfU0FNUExFX0ZNVF9TNjQpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TMzIsIEFWX1NBTVBMRV9GTVRfUzY0KSwKKyAgICBGTVRfUEFJUl9GVU5DKEFWX1NBTVBMRV9GTVRfRkxULCBBVl9TQU1QTEVfRk1UX1M2NCksCisgICAgRk1UX1BBSVJfRlVOQyhBVl9TQU1QTEVfRk1UX0RCTCwgQVZfU0FNUExFX0ZNVF9TNjQpLAorICAgIEZNVF9QQUlSX0ZVTkMoQVZfU0FNUExFX0ZNVF9TNjQsIEFWX1NBTVBMRV9GTVRfUzY0KSwKIH07CiAKIHN0YXRpYyB2b2lkIGNweTEodWludDhfdCAqKmRzdCwgY29uc3QgdWludDhfdCAqKnNyYywgaW50IGxlbil7CkBAIC0xNTQsNyArMTc2LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmKEhBVkVfWUFTTSAmJiBIQVZFX01NWCkgc3dyaV9hdWRpb19jb252ZXJ0X2luaXRfeDg2KGN0eCwgb3V0X2ZtdCwgaW5fZm10LCBjaGFubmVscyk7CisgICAgaWYoSEFWRV9YODZBU00gJiYgSEFWRV9NTVgpIHN3cmlfYXVkaW9fY29udmVydF9pbml0X3g4NihjdHgsIG91dF9mbXQsIGluX2ZtdCwgY2hhbm5lbHMpOwogICAgIGlmKEFSQ0hfQVJNKSAgICAgICAgICAgICAgc3dyaV9hdWRpb19jb252ZXJ0X2luaXRfYXJtKGN0eCwgb3V0X2ZtdCwgaW5fZm10LCBjaGFubmVscyk7CiAgICAgaWYoQVJDSF9BQVJDSDY0KSAgICAgICAgICBzd3JpX2F1ZGlvX2NvbnZlcnRfaW5pdF9hYXJjaDY0KGN0eCwgb3V0X2ZtdCwgaW5fZm10LCBjaGFubmVscyk7CiAKZGlmZiAtLWdpdCBhL2xpYnN3cmVzYW1wbGUvZGl0aGVyLmMgYi9saWJzd3Jlc2FtcGxlL2RpdGhlci5jCmluZGV4IDA4Yzc5M2QuLjY0MDY4ZDMgMTAwNjQ0Ci0tLSBhL2xpYnN3cmVzYW1wbGUvZGl0aGVyLmMKKysrIGIvbGlic3dyZXNhbXBsZS9kaXRoZXIuYwpAQCAtMTAyLDYgKzEwMiwxMSBAQAogICAgIGlmIChvdXRfZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyICYmIHMtPmRpdGhlci5vdXRwdXRfc2FtcGxlX2JpdHMpCiAgICAgICAgIHNjYWxlICo9IDE8PCgzMi1zLT5kaXRoZXIub3V0cHV0X3NhbXBsZV9iaXRzKTsKIAorICAgIGlmIChzY2FsZSA9PSAwKSB7CisgICAgICAgIHMtPmRpdGhlci5tZXRob2QgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKICAgICBzLT5kaXRoZXIubnNfcG9zID0gMDsKICAgICBzLT5kaXRoZXIubm9pc2Vfc2NhbGU9ICAgc2NhbGU7CiAgICAgcy0+ZGl0aGVyLm5zX3NjYWxlICAgPSAgIHNjYWxlOwpAQCAtMTIzLDE1ICsxMjgsNiBAQAogICAgICAgICBzLT5kaXRoZXIubWV0aG9kID0gU1dSX0RJVEhFUl9UUklBTkdVTEFSX0hJR0hQQVNTOwogICAgIH0KIAotICAgIGF2X2Fzc2VydDAoIXMtPnByZW91dC5jb3VudCk7Ci0gICAgcy0+ZGl0aGVyLm5vaXNlID0gcy0+cHJlb3V0OwotICAgIHMtPmRpdGhlci50ZW1wICA9IHMtPnByZW91dDsKLSAgICBpZiAocy0+ZGl0aGVyLm1ldGhvZCA+IFNXUl9ESVRIRVJfTlMpIHsKLSAgICAgICAgcy0+ZGl0aGVyLm5vaXNlLmJwcyA9IDQ7Ci0gICAgICAgIHMtPmRpdGhlci5ub2lzZS5mbXQgPSBBVl9TQU1QTEVfRk1UX0ZMVFA7Ci0gICAgICAgIHMtPmRpdGhlci5ub2lzZV9zY2FsZSA9IDE7Ci0gICAgfQotCiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2xpYnN3cmVzYW1wbGUvbGlic3dyZXNhbXBsZS52IGIvbGlic3dyZXNhbXBsZS9saWJzd3Jlc2FtcGxlLnYKaW5kZXggMGQ1ZWZlNC4uM2IzNTA4ZCAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS9saWJzd3Jlc2FtcGxlLnYKKysrIGIvbGlic3dyZXNhbXBsZS9saWJzd3Jlc2FtcGxlLnYKQEAgLTEsNCArMSw3IEBACi1MSUJTV1JFU0FNUExFXyRNQUpPUiB7Ci0gICAgICAgIGdsb2JhbDogc3dyXyo7IHN3cmVzYW1wbGVfKjsKLSAgICAgICAgbG9jYWw6ICo7CitMSUJTV1JFU0FNUExFX01BSk9SIHsKKyAgICBnbG9iYWw6CisgICAgICAgIHN3cl8qOworICAgICAgICBzd3Jlc2FtcGxlXyo7CisgICAgbG9jYWw6CisgICAgICAgICo7CiB9OwpkaWZmIC0tZ2l0IGEvbGlic3dyZXNhbXBsZS9vcHRpb25zLmMgYi9saWJzd3Jlc2FtcGxlL29wdGlvbnMuYwppbmRleCBlYWMxYTdjLi4wMGQ0ZjdjIDEwMDY0NAotLS0gYS9saWJzd3Jlc2FtcGxlL29wdGlvbnMuYworKysgYi9saWJzd3Jlc2FtcGxlL29wdGlvbnMuYwpAQCAtNzAsNyArNzAsNyBAQAogCiB7ImRpdGhlcl9zY2FsZSIgICAgICAgICAsICJzZXQgZGl0aGVyIHNjYWxlIiAgICAgICAgICAgICwgT0ZGU0VUKGRpdGhlci5zY2FsZSAgICksIEFWX09QVF9UWVBFX0ZMT0FULCB7LmRibD0xICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgSU5UX01BWCAgICwgUEFSQU19LAogCi17ImRpdGhlcl9tZXRob2QiICAgICAgICAsICJzZXQgZGl0aGVyIG1ldGhvZCIgICAgICAgICAgICwgT0ZGU0VUKGRpdGhlci5tZXRob2QgICksIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND0wICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgU1dSX0RJVEhFUl9OQi0xLCBQQVJBTSwgImRpdGhlcl9tZXRob2QifSwKK3siZGl0aGVyX21ldGhvZCIgICAgICAgICwgInNldCBkaXRoZXIgbWV0aG9kIiAgICAgICAgICAgLCBPRkZTRVQodXNlcl9kaXRoZXJfbWV0aG9kKSxBVl9PUFRfVFlQRV9JTlQsIHsuaTY0PTAgICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCBTV1JfRElUSEVSX05CLTEsIFBBUkFNLCAiZGl0aGVyX21ldGhvZCJ9LAogeyJyZWN0YW5ndWxhciIgICAgICAgICAgLCAic2VsZWN0IHJlY3Rhbmd1bGFyIGRpdGhlciIgICAsIDAgICAgICAgICAgICAgICAgICAgICAgLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U1dSX0RJVEhFUl9SRUNUQU5HVUxBUn0sIElOVF9NSU4sIElOVF9NQVggICAsIFBBUkFNLCAiZGl0aGVyX21ldGhvZCJ9LAogeyJ0cmlhbmd1bGFyIiAgICAgICAgICAgLCAic2VsZWN0IHRyaWFuZ3VsYXIgZGl0aGVyIiAgICAsIDAgICAgICAgICAgICAgICAgICAgICAgLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U1dSX0RJVEhFUl9UUklBTkdVTEFSIH0sIElOVF9NSU4sIElOVF9NQVggICAsIFBBUkFNLCAiZGl0aGVyX21ldGhvZCJ9LAogeyJ0cmlhbmd1bGFyX2hwIiAgICAgICAgLCAic2VsZWN0IHRyaWFuZ3VsYXIgZGl0aGVyIHdpdGggaGlnaCBwYXNzIiAsIDAgICAgICAgICAgLCBBVl9PUFRfVFlQRV9DT05TVCwgey5pNjQ9U1dSX0RJVEhFUl9UUklBTkdVTEFSX0hJR0hQQVNTIH0sIElOVF9NSU4sIElOVF9NQVgsIFBBUkFNLCAiZGl0aGVyX21ldGhvZCJ9LApAQCAtODQsNyArODQsOCBAQAogCiB7ImZpbHRlcl9zaXplIiAgICAgICAgICAsICJzZXQgc3dyIHJlc2FtcGxpbmcgZmlsdGVyIHNpemUiLCBPRkZTRVQoZmlsdGVyX3NpemUpICAsIEFWX09QVF9UWVBFX0lOVCAgLCB7Lmk2ND0zMiAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgSU5UX01BWCAgICwgUEFSQU0gfSwKIHsicGhhc2Vfc2hpZnQiICAgICAgICAgICwgInNldCBzd3IgcmVzYW1wbGluZyBwaGFzZSBzaGlmdCIsIE9GRlNFVChwaGFzZV9zaGlmdCkgICwgQVZfT1BUX1RZUEVfSU5UICAsIHsuaTY0PTEwICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCAyNCAgICAgICAgLCBQQVJBTSB9LAoteyJsaW5lYXJfaW50ZXJwIiAgICAgICAgLCAiZW5hYmxlIGxpbmVhciBpbnRlcnBvbGF0aW9uIiAsIE9GRlNFVChsaW5lYXJfaW50ZXJwKSAgLCBBVl9PUFRfVFlQRV9CT09MICwgey5pNjQ9MCAgICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIDEgICAgICAgICAsIFBBUkFNIH0sCit7ImxpbmVhcl9pbnRlcnAiICAgICAgICAsICJlbmFibGUgbGluZWFyIGludGVycG9sYXRpb24iICwgT0ZGU0VUKGxpbmVhcl9pbnRlcnApICAsIEFWX09QVF9UWVBFX0JPT0wgLCB7Lmk2ND0xICAgICAgICAgICAgICAgICAgICAgfSwgMCAgICAgICwgMSAgICAgICAgICwgUEFSQU0gfSwKK3siZXhhY3RfcmF0aW9uYWwiICAgICAgICwgImVuYWJsZSBleGFjdCByYXRpb25hbCIgICAgICAgLCBPRkZTRVQoZXhhY3RfcmF0aW9uYWwpICwgQVZfT1BUX1RZUEVfQk9PTCAsIHsuaTY0PTEgICAgICAgICAgICAgICAgICAgICB9LCAwICAgICAgLCAxICAgICAgICAgLCBQQVJBTSB9LAogeyJjdXRvZmYiICAgICAgICAgICAgICAgLCAic2V0IGN1dG9mZiBmcmVxdWVuY3kgcmF0aW8iICAsIE9GRlNFVChjdXRvZmYpICAgICAgICAgLCBBVl9PUFRfVFlQRV9ET1VCTEUsey5kYmw9MC4gICAgICAgICAgICAgICAgICAgIH0sIDAgICAgICAsIDEgICAgICAgICAsIFBBUkFNIH0sCiAKIC8qIGR1cGxpY2F0ZSBvcHRpb24gaW4gb3JkZXIgdG8gd29yayB3aXRoIGF2Y29udiAqLwpkaWZmIC0tZ2l0IGEvbGlic3dyZXNhbXBsZS9yZW1hdHJpeC5jIGIvbGlic3dyZXNhbXBsZS9yZW1hdHJpeC5jCmluZGV4IDkzMjA4OGYuLjgyMjc3MzAgMTAwNjQ0Ci0tLSBhL2xpYnN3cmVzYW1wbGUvcmVtYXRyaXguYworKysgYi9saWJzd3Jlc2FtcGxlL3JlbWF0cml4LmMKQEAgLTMyLDYgKzMyLDkgQEAKIAogI2RlZmluZSBURU1QTEFURV9SRU1BVFJJWF9TMTYKICNpbmNsdWRlICJyZW1hdHJpeF90ZW1wbGF0ZS5jIgorI2RlZmluZSBURU1QTEFURV9DTElQCisjaW5jbHVkZSAicmVtYXRyaXhfdGVtcGxhdGUuYyIKKyN1bmRlZiBURU1QTEFURV9DTElQCiAjdW5kZWYgVEVNUExBVEVfUkVNQVRSSVhfUzE2CiAKICNkZWZpbmUgVEVNUExBVEVfUkVNQVRSSVhfUzMyCkBAIC02NSwxMSArNjgsMTQgQEAKICAgICBpZiAoIXMgfHwgcy0+aW5fY29udmVydCkgLy8gcyBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgYnV0IG5vdCBpbml0aWFsaXplZAogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIG1lbXNldChzLT5tYXRyaXgsIDAsIHNpemVvZihzLT5tYXRyaXgpKTsKLSAgICBuYl9pbiAgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+dXNlcl9pbl9jaF9sYXlvdXQpOwotICAgIG5iX291dCA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT51c2VyX291dF9jaF9sYXlvdXQpOworICAgIG1lbXNldChzLT5tYXRyaXhfZmx0LCAwLCBzaXplb2Yocy0+bWF0cml4X2ZsdCkpOworICAgIG5iX2luID0gKHMtPnVzZXJfaW5fY2hfY291bnQgPiAwKSA/IHMtPnVzZXJfaW5fY2hfY291bnQgOgorICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+dXNlcl9pbl9jaF9sYXlvdXQpOworICAgIG5iX291dCA9IChzLT51c2VyX291dF9jaF9jb3VudCA+IDApID8gcy0+dXNlcl9vdXRfY2hfY291bnQgOgorICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+dXNlcl9vdXRfY2hfbGF5b3V0KTsKICAgICBmb3IgKG91dCA9IDA7IG91dCA8IG5iX291dDsgb3V0KyspIHsKICAgICAgICAgZm9yIChpbiA9IDA7IGluIDwgbmJfaW47IGluKyspCi0gICAgICAgICAgICBzLT5tYXRyaXhbb3V0XVtpbl0gPSBtYXRyaXhbaW5dOworICAgICAgICAgICAgcy0+bWF0cml4X2ZsdFtvdXRdW2luXSA9IHMtPm1hdHJpeFtvdXRdW2luXSA9IG1hdHJpeFtpbl07CiAgICAgICAgIG1hdHJpeCArPSBzdHJpZGU7CiAgICAgfQogICAgIHMtPnJlbWF0cml4X2N1c3RvbSA9IDE7CkBAIC04Miw3ICs4OCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY2xlYW5fbGF5b3V0KFN3ckNvbnRleHQgKnMsIGludDY0X3QgbGF5b3V0KXsKK3N0YXRpYyBpbnQgY2xlYW5fbGF5b3V0KHZvaWQgKnMsIGludDY0X3QgbGF5b3V0KXsKICAgICBpZihsYXlvdXQgJiYgbGF5b3V0ICE9IEFWX0NIX0ZST05UX0NFTlRFUiAmJiAhKGxheW91dCYobGF5b3V0LTEpKSkgewogICAgICAgICBjaGFyIGJ1ZlsxMjhdOwogICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCBsYXlvdXQpOwpAQCAtMTEwLDE4ICsxMTYsMjAgQEAKICAgICByZXR1cm4gMTsKIH0KIAotYXZfY29sZCBzdGF0aWMgaW50IGF1dG9fbWF0cml4KFN3ckNvbnRleHQgKnMpCithdl9jb2xkIGludCBzd3JfYnVpbGRfbWF0cml4KHVpbnQ2NF90IGluX2NoX2xheW91dF9wYXJhbSwgdWludDY0X3Qgb3V0X2NoX2xheW91dF9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNlbnRlcl9taXhfbGV2ZWwsIGRvdWJsZSBzdXJyb3VuZF9taXhfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZmVfbWl4X2xldmVsLCBkb3VibGUgbWF4dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmVtYXRyaXhfdm9sdW1lLCBkb3VibGUgKm1hdHJpeF9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgZW51bSBBVk1hdHJpeEVuY29kaW5nIG1hdHJpeF9lbmNvZGluZywgdm9pZCAqbG9nX2NvbnRleHQpCiB7CiAgICAgaW50IGksIGosIG91dF9pOwogICAgIGRvdWJsZSBtYXRyaXhbTlVNX05BTUVEX0NIQU5ORUxTXVtOVU1fTkFNRURfQ0hBTk5FTFNdPXt7MH19OwogICAgIGludDY0X3QgdW5hY2NvdW50ZWQsIGluX2NoX2xheW91dCwgb3V0X2NoX2xheW91dDsKICAgICBkb3VibGUgbWF4Y29lZj0wOwogICAgIGNoYXIgYnVmWzEyOF07Ci0gICAgY29uc3QgaW50IG1hdHJpeF9lbmNvZGluZyA9IHMtPm1hdHJpeF9lbmNvZGluZzsKLSAgICBmbG9hdCBtYXh2YWw7CiAKLSAgICBpbl9jaF9sYXlvdXQgPSBjbGVhbl9sYXlvdXQocywgcy0+aW5fY2hfbGF5b3V0KTsKLSAgICBvdXRfY2hfbGF5b3V0ID0gY2xlYW5fbGF5b3V0KHMsIHMtPm91dF9jaF9sYXlvdXQpOworICAgICBpbl9jaF9sYXlvdXQgPSBjbGVhbl9sYXlvdXQobG9nX2NvbnRleHQsICBpbl9jaF9sYXlvdXRfcGFyYW0pOworICAgIG91dF9jaF9sYXlvdXQgPSBjbGVhbl9sYXlvdXQobG9nX2NvbnRleHQsIG91dF9jaF9sYXlvdXRfcGFyYW0pOwogCiAgICAgaWYoICAgb3V0X2NoX2xheW91dCA9PSBBVl9DSF9MQVlPVVRfU1RFUkVPX0RPV05NSVgKICAgICAgICAmJiAoaW5fY2hfbGF5b3V0ICYgQVZfQ0hfTEFZT1VUX1NURVJFT19ET1dOTUlYKSA9PSAwCkBAIC0xMzQsMTggKzE0MiwxNyBAQAogICAgICAgICBpbl9jaF9sYXlvdXQgPSBBVl9DSF9MQVlPVVRfU1RFUkVPOwogCiAgICAgaWYoIXNhbmVfbGF5b3V0KGluX2NoX2xheW91dCkpewotICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCBzLT5pbl9jaF9sYXlvdXQpOwotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiSW5wdXQgY2hhbm5lbCBsYXlvdXQgJyVzJyBpcyBub3Qgc3VwcG9ydGVkXG4iLCBidWYpOworICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCBpbl9jaF9sYXlvdXRfcGFyYW0pOworICAgICAgICBhdl9sb2cobG9nX2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIklucHV0IGNoYW5uZWwgbGF5b3V0ICclcycgaXMgbm90IHN1cHBvcnRlZFxuIiwgYnVmKTsKICAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKICAgICB9CiAKICAgICBpZighc2FuZV9sYXlvdXQob3V0X2NoX2xheW91dCkpewotICAgICAgICBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfc3RyaW5nKGJ1Ziwgc2l6ZW9mKGJ1ZiksIC0xLCBzLT5vdXRfY2hfbGF5b3V0KTsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIk91dHB1dCBjaGFubmVsIGxheW91dCAnJXMnIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGJ1Zik7CisgICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoYnVmLCBzaXplb2YoYnVmKSwgLTEsIG91dF9jaF9sYXlvdXRfcGFyYW0pOworICAgICAgICBhdl9sb2cobG9nX2NvbnRleHQsIEFWX0xPR19FUlJPUiwgIk91dHB1dCBjaGFubmVsIGxheW91dCAnJXMnIGlzIG5vdCBzdXBwb3J0ZWRcbiIsIGJ1Zik7CiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CiAgICAgfQogCi0gICAgbWVtc2V0KHMtPm1hdHJpeCwgMCwgc2l6ZW9mKHMtPm1hdHJpeCkpOwogICAgIGZvcihpPTA7IGk8RkZfQVJSQVlfRUxFTVMobWF0cml4KTsgaSsrKXsKICAgICAgICAgaWYoaW5fY2hfbGF5b3V0ICYgb3V0X2NoX2xheW91dCAmICgxVUxMPDxpKSkKICAgICAgICAgICAgIG1hdHJpeFtpXVtpXT0gMS4wOwpAQCAtMTYwLDggKzE2Nyw4IEBACiAgICAgaWYodW5hY2NvdW50ZWQgJiBBVl9DSF9GUk9OVF9DRU5URVIpewogICAgICAgICBpZigob3V0X2NoX2xheW91dCAmIEFWX0NIX0xBWU9VVF9TVEVSRU8pID09IEFWX0NIX0xBWU9VVF9TVEVSRU8pewogICAgICAgICAgICAgaWYoaW5fY2hfbGF5b3V0ICYgQVZfQ0hfTEFZT1VUX1NURVJFTykgewotICAgICAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfTEVGVF1bRlJPTlRfQ0VOVEVSXSs9IHMtPmNsZXY7Ci0gICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtGUk9OVF9DRU5URVJdKz0gcy0+Y2xldjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbIEZST05UX0xFRlRdW0ZST05UX0NFTlRFUl0rPSBjZW50ZXJfbWl4X2xldmVsOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bRlJPTlRfQ0VOVEVSXSs9IGNlbnRlcl9taXhfbGV2ZWw7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfTEVGVF1bRlJPTlRfQ0VOVEVSXSs9IE1fU1FSVDFfMjsKICAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0ZST05UX0NFTlRFUl0rPSBNX1NRUlQxXzI7CkBAIC0xNzQsNyArMTgxLDcgQEAKICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9DRU5URVJdWyBGUk9OVF9MRUZUXSs9IE1fU1FSVDFfMjsKICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9DRU5URVJdW0ZST05UX1JJR0hUXSs9IE1fU1FSVDFfMjsKICAgICAgICAgICAgIGlmKGluX2NoX2xheW91dCAmIEFWX0NIX0ZST05UX0NFTlRFUikKLSAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVsgRlJPTlRfQ0VOVEVSXSA9IHMtPmNsZXYqc3FydCgyKTsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVsgRlJPTlRfQ0VOVEVSXSA9IGNlbnRlcl9taXhfbGV2ZWwqc3FydCgyKTsKICAgICAgICAgfWVsc2UKICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CiAgICAgfQpAQCAtMTkwLDE4ICsxOTcsMTggQEAKICAgICAgICAgICAgIGlmIChtYXRyaXhfZW5jb2RpbmcgPT0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZIHx8CiAgICAgICAgICAgICAgICAgbWF0cml4X2VuY29kaW5nID09IEFWX01BVFJJWF9FTkNPRElOR19EUExJSSkgewogICAgICAgICAgICAgICAgIGlmICh1bmFjY291bnRlZCAmIChBVl9DSF9CQUNLX0xFRlQgfCBBVl9DSF9TSURFX0xFRlQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19DRU5URVJdIC09IHMtPnNsZXYgKiBNX1NRUlQxXzI7Ci0gICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19DRU5URVJdICs9IHMtPnNsZXYgKiBNX1NRUlQxXzI7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19DRU5URVJdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX0NFTlRFUl0gKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19DRU5URVJdIC09IHMtPnNsZXY7Ci0gICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19DRU5URVJdICs9IHMtPnNsZXY7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19DRU5URVJdIC09IHN1cnJvdW5kX21peF9sZXZlbDsKKyAgICAgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX0NFTlRFUl0gKz0gc3Vycm91bmRfbWl4X2xldmVsOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9MRUZUXVtCQUNLX0NFTlRFUl0rPSBzLT5zbGV2Kk1fU1FSVDFfMjsKLSAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0JBQ0tfQ0VOVEVSXSs9IHMtPnNsZXYqTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfTEVGVF1bQkFDS19DRU5URVJdKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19DRU5URVJdKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOwogICAgICAgICAgICAgfQogICAgICAgICB9ZWxzZSBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfQ0VOVEVSKXsKLSAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfQ0VOVEVSXVtCQUNLX0NFTlRFUl0rPSBzLT5zbGV2Kk1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfQ0VOVEVSXVtCQUNLX0NFTlRFUl0rPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBNX1NRUlQxXzI7CiAgICAgICAgIH1lbHNlCiAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOwogICAgIH0KQEAgLTIxOSwyMiArMjI2LDIyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH1lbHNlIGlmKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9MRUZUKXsKICAgICAgICAgICAgIGlmIChtYXRyaXhfZW5jb2RpbmcgPT0gQVZfTUFUUklYX0VOQ09ESU5HX0RPTEJZKSB7Ci0gICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX0xFRlQgXSAtPSBzLT5zbGV2ICogTV9TUVJUMV8yOwotICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19SSUdIVF0gLT0gcy0+c2xldiAqIE1fU1FSVDFfMjsKLSAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0JBQ0tfTEVGVCBdICs9IHMtPnNsZXYgKiBNX1NRUlQxXzI7Ci0gICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX1JJR0hUXSArPSBzLT5zbGV2ICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19MRUZUIF0gLT0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19SSUdIVF0gLT0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19MRUZUIF0gKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19SSUdIVF0gKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRyaXhfZW5jb2RpbmcgPT0gQVZfTUFUUklYX0VOQ09ESU5HX0RQTElJKSB7Ci0gICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX0xFRlQgXSAtPSBzLT5zbGV2ICogU1FSVDNfMjsKLSAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW0JBQ0tfUklHSFRdIC09IHMtPnNsZXYgKiBNX1NRUlQxXzI7Ci0gICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtCQUNLX0xFRlQgXSArPSBzLT5zbGV2ICogTV9TUVJUMV8yOwotICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19SSUdIVF0gKz0gcy0+c2xldiAqIFNRUlQzXzI7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtCQUNLX0xFRlQgXSAtPSBzdXJyb3VuZF9taXhfbGV2ZWwgKiBTUVJUM18yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bQkFDS19SSUdIVF0gLT0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19MRUZUIF0gKz0gc3Vycm91bmRfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19SSUdIVF0gKz0gc3Vycm91bmRfbWl4X2xldmVsICogU1FSVDNfMjsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9MRUZUXVsgQkFDS19MRUZUXSArPSBzLT5zbGV2OwotICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bQkFDS19SSUdIVF0gKz0gcy0+c2xldjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbIEZST05UX0xFRlRdWyBCQUNLX0xFRlRdICs9IHN1cnJvdW5kX21peF9sZXZlbDsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW0JBQ0tfUklHSFRdICs9IHN1cnJvdW5kX21peF9sZXZlbDsKICAgICAgICAgICAgIH0KICAgICAgICAgfWVsc2UgaWYob3V0X2NoX2xheW91dCAmIEFWX0NIX0ZST05UX0NFTlRFUil7Ci0gICAgICAgICAgICBtYXRyaXhbIEZST05UX0NFTlRFUl1bQkFDS19MRUZUIF0rPSBzLT5zbGV2Kk1fU1FSVDFfMjsKLSAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfQ0VOVEVSXVtCQUNLX1JJR0hUXSs9IHMtPnNsZXYqTV9TUVJUMV8yOworICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9DRU5URVJdW0JBQ0tfTEVGVCBdKz0gc3Vycm91bmRfbWl4X2xldmVsKk1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfQ0VOVEVSXVtCQUNLX1JJR0hUXSs9IHN1cnJvdW5kX21peF9sZXZlbCpNX1NRUlQxXzI7CiAgICAgICAgIH1lbHNlCiAgICAgICAgICAgICBhdl9hc3NlcnQwKDApOwogICAgIH0KQEAgLTI1NSwyMiArMjYyLDIyIEBACiAgICAgICAgICAgICBtYXRyaXhbQkFDS19DRU5URVJdW1NJREVfUklHSFRdKz0gTV9TUVJUMV8yOwogICAgICAgICB9ZWxzZSBpZihvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfTEVGVCl7CiAgICAgICAgICAgICBpZiAobWF0cml4X2VuY29kaW5nID09IEFWX01BVFJJWF9FTkNPRElOR19ET0xCWSkgewotICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bU0lERV9MRUZUIF0gLT0gcy0+c2xldiAqIE1fU1FSVDFfMjsKLSAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW1NJREVfUklHSFRdIC09IHMtPnNsZXYgKiBNX1NRUlQxXzI7Ci0gICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtTSURFX0xFRlQgXSArPSBzLT5zbGV2ICogTV9TUVJUMV8yOwotICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bU0lERV9SSUdIVF0gKz0gcy0+c2xldiAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW1NJREVfTEVGVCBdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW1NJREVfUklHSFRdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfTEVGVCBdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfUklHSFRdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0cml4X2VuY29kaW5nID09IEFWX01BVFJJWF9FTkNPRElOR19EUExJSSkgewotICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bU0lERV9MRUZUIF0gLT0gcy0+c2xldiAqIFNRUlQzXzI7Ci0gICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtTSURFX1JJR0hUXSAtPSBzLT5zbGV2ICogTV9TUVJUMV8yOwotICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9SSUdIVF1bU0lERV9MRUZUIF0gKz0gcy0+c2xldiAqIE1fU1FSVDFfMjsKLSAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfUklHSFRdICs9IHMtPnNsZXYgKiBTUVJUM18yOworICAgICAgICAgICAgICAgIG1hdHJpeFtGUk9OVF9MRUZUIF1bU0lERV9MRUZUIF0gLT0gc3Vycm91bmRfbWl4X2xldmVsICogU1FSVDNfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfTEVGVCBdW1NJREVfUklHSFRdIC09IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfTEVGVCBdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfUklHSFRdICs9IHN1cnJvdW5kX21peF9sZXZlbCAqIFNRUlQzXzI7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfTEVGVF1bIFNJREVfTEVGVF0gKz0gcy0+c2xldjsKLSAgICAgICAgICAgICAgICBtYXRyaXhbRlJPTlRfUklHSFRdW1NJREVfUklHSFRdICs9IHMtPnNsZXY7CisgICAgICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9MRUZUXVsgU0lERV9MRUZUXSArPSBzdXJyb3VuZF9taXhfbGV2ZWw7CisgICAgICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtTSURFX1JJR0hUXSArPSBzdXJyb3VuZF9taXhfbGV2ZWw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH1lbHNlIGlmKG91dF9jaF9sYXlvdXQgJiBBVl9DSF9GUk9OVF9DRU5URVIpewotICAgICAgICAgICAgbWF0cml4WyBGUk9OVF9DRU5URVJdW1NJREVfTEVGVCBdKz0gcy0+c2xldipNX1NRUlQxXzI7Ci0gICAgICAgICAgICBtYXRyaXhbIEZST05UX0NFTlRFUl1bU0lERV9SSUdIVF0rPSBzLT5zbGV2Kk1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfQ0VOVEVSXVtTSURFX0xFRlQgXSs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKKyAgICAgICAgICAgIG1hdHJpeFsgRlJPTlRfQ0VOVEVSXVtTSURFX1JJR0hUXSs9IHN1cnJvdW5kX21peF9sZXZlbCAqIE1fU1FSVDFfMjsKICAgICAgICAgfWVsc2UKICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CiAgICAgfQpAQCAtMjg4LDEwICsyOTUsMTAgQEAKICAgICAvKiBtaXggTEZFIGludG8gZnJvbnQgbGVmdC9yaWdodCBvciBjZW50ZXIgKi8KICAgICBpZiAodW5hY2NvdW50ZWQgJiBBVl9DSF9MT1dfRlJFUVVFTkNZKSB7CiAgICAgICAgIGlmIChvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfQ0VOVEVSKSB7Ci0gICAgICAgICAgICBtYXRyaXhbRlJPTlRfQ0VOVEVSXVtMT1dfRlJFUVVFTkNZXSArPSBzLT5sZmVfbWl4X2xldmVsOworICAgICAgICAgICAgbWF0cml4W0ZST05UX0NFTlRFUl1bTE9XX0ZSRVFVRU5DWV0gKz0gbGZlX21peF9sZXZlbDsKICAgICAgICAgfSBlbHNlIGlmIChvdXRfY2hfbGF5b3V0ICYgQVZfQ0hfRlJPTlRfTEVGVCkgewotICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtMT1dfRlJFUVVFTkNZXSArPSBzLT5sZmVfbWl4X2xldmVsICogTV9TUVJUMV8yOwotICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtMT1dfRlJFUVVFTkNZXSArPSBzLT5sZmVfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgbWF0cml4W0ZST05UX0xFRlQgXVtMT1dfRlJFUVVFTkNZXSArPSBsZmVfbWl4X2xldmVsICogTV9TUVJUMV8yOworICAgICAgICAgICAgbWF0cml4W0ZST05UX1JJR0hUXVtMT1dfRlJFUVVFTkNZXSArPSBsZmVfbWl4X2xldmVsICogTV9TUVJUMV8yOwogICAgICAgICB9IGVsc2UKICAgICAgICAgICAgIGF2X2Fzc2VydDAoMCk7CiAgICAgfQpAQCAtMzA1LDE3ICszMTIsNTEgQEAKICAgICAgICAgICAgIGlmKChpbl9jaF9sYXlvdXQgJiAoMVVMTDw8aikpID09IDApCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIGlmIChpIDwgRkZfQVJSQVlfRUxFTVMobWF0cml4KSAmJiBqIDwgRkZfQVJSQVlfRUxFTVMobWF0cml4WzBdKSkKLSAgICAgICAgICAgICAgICBzLT5tYXRyaXhbb3V0X2ldW2luX2ldPSBtYXRyaXhbaV1bal07CisgICAgICAgICAgICAgICAgbWF0cml4X3BhcmFtW3N0cmlkZSpvdXRfaSArIGluX2ldID0gbWF0cml4W2ldW2pdOwogICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHMtPm1hdHJpeFtvdXRfaV1baW5faV09IGkgPT0gaiAmJiAoaW5fY2hfbGF5b3V0ICYgb3V0X2NoX2xheW91dCAmICgxVUxMPDxpKSk7Ci0gICAgICAgICAgICBzdW0gKz0gZmFicyhzLT5tYXRyaXhbb3V0X2ldW2luX2ldKTsKKyAgICAgICAgICAgICAgICBtYXRyaXhfcGFyYW1bc3RyaWRlKm91dF9pICsgaW5faV0gPSBpID09IGogJiYgKGluX2NoX2xheW91dCAmIG91dF9jaF9sYXlvdXQgJiAoMVVMTDw8aSkpOworICAgICAgICAgICAgc3VtICs9IGZhYnMobWF0cml4X3BhcmFtW3N0cmlkZSpvdXRfaSArIGluX2ldKTsKICAgICAgICAgICAgIGluX2krKzsKICAgICAgICAgfQogICAgICAgICBtYXhjb2VmPSBGRk1BWChtYXhjb2VmLCBzdW0pOwogICAgICAgICBvdXRfaSsrOwogICAgIH0KLSAgICBpZihzLT5yZW1hdHJpeF92b2x1bWUgIDwgMCkKLSAgICAgICAgbWF4Y29lZiA9IC1zLT5yZW1hdHJpeF92b2x1bWU7CisgICAgaWYocmVtYXRyaXhfdm9sdW1lICA8IDApCisgICAgICAgIG1heGNvZWYgPSAtcmVtYXRyaXhfdm9sdW1lOworCisgICAgaWYobWF4Y29lZiA+IG1heHZhbCB8fCByZW1hdHJpeF92b2x1bWUgIDwgMCl7CisgICAgICAgIG1heGNvZWYgLz0gbWF4dmFsOworICAgICAgICBmb3IoaT0wOyBpPFNXUl9DSF9NQVg7IGkrKykKKyAgICAgICAgICAgIGZvcihqPTA7IGo8U1dSX0NIX01BWDsgaisrKXsKKyAgICAgICAgICAgICAgICBtYXRyaXhfcGFyYW1bc3RyaWRlKmkgKyBqXSAvPSBtYXhjb2VmOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmKHJlbWF0cml4X3ZvbHVtZSA+IDApeworICAgICAgICBmb3IoaT0wOyBpPFNXUl9DSF9NQVg7IGkrKykKKyAgICAgICAgICAgIGZvcihqPTA7IGo8U1dSX0NIX01BWDsgaisrKXsKKyAgICAgICAgICAgICAgICBtYXRyaXhfcGFyYW1bc3RyaWRlKmkgKyBqXSAqPSByZW1hdHJpeF92b2x1bWU7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgYXZfbG9nKGxvZ19jb250ZXh0LCBBVl9MT0dfREVCVUcsICJNYXRyaXggY29lZmZpY2llbnRzOlxuIik7CisgICAgZm9yKGk9MDsgaTxhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMob3V0X2NoX2xheW91dCk7IGkrKyl7CisgICAgICAgIGNvbnN0IGNoYXIgKmMgPQorICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbmFtZShhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwob3V0X2NoX2xheW91dCwgaSkpOworICAgICAgICBhdl9sb2cobG9nX2NvbnRleHQsIEFWX0xPR19ERUJVRywgIiVzOiAiLCBjID8gYyA6ICI/Iik7CisgICAgICAgIGZvcihqPTA7IGo8YXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKGluX2NoX2xheW91dCk7IGorKyl7CisgICAgICAgICAgICBjID0gYXZfZ2V0X2NoYW5uZWxfbmFtZShhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwoaW5fY2hfbGF5b3V0LCBqKSk7CisgICAgICAgICAgICBhdl9sb2cobG9nX2NvbnRleHQsIEFWX0xPR19ERUJVRywgIiVzOiVmICIsIGMgPyBjIDogIj8iLCBtYXRyaXhfcGFyYW1bc3RyaWRlKmkgKyBqXSk7CisgICAgICAgIH0KKyAgICAgICAgYXZfbG9nKGxvZ19jb250ZXh0LCBBVl9MT0dfREVCVUcsICJcbiIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworYXZfY29sZCBzdGF0aWMgaW50IGF1dG9fbWF0cml4KFN3ckNvbnRleHQgKnMpCit7CisgICAgZG91YmxlIG1heHZhbDsKKyAgICBpbnQgcmV0OwogCiAgICAgaWYgKHMtPnJlbWF0cml4X21heHZhbCA+IDApIHsKICAgICAgICAgbWF4dmFsID0gcy0+cmVtYXRyaXhfbWF4dmFsOwpAQCAtMzI1LDMzICszNjYsMjAgQEAKICAgICB9IGVsc2UKICAgICAgICAgbWF4dmFsID0gSU5UX01BWDsKIAotICAgIGlmKG1heGNvZWYgPiBtYXh2YWwgfHwgcy0+cmVtYXRyaXhfdm9sdW1lICA8IDApewotICAgICAgICBtYXhjb2VmIC89IG1heHZhbDsKLSAgICAgICAgZm9yKGk9MDsgaTxTV1JfQ0hfTUFYOyBpKyspCi0gICAgICAgICAgICBmb3Ioaj0wOyBqPFNXUl9DSF9NQVg7IGorKyl7Ci0gICAgICAgICAgICAgICAgcy0+bWF0cml4W2ldW2pdIC89IG1heGNvZWY7Ci0gICAgICAgICAgICB9CisgICAgbWVtc2V0KHMtPm1hdHJpeCwgMCwgc2l6ZW9mKHMtPm1hdHJpeCkpOworICAgIHJldCA9IHN3cl9idWlsZF9tYXRyaXgocy0+aW5fY2hfbGF5b3V0LCBzLT5vdXRfY2hfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+Y2xldiwgcy0+c2xldiwgcy0+bGZlX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHZhbCwgcy0+cmVtYXRyaXhfdm9sdW1lLCAoZG91YmxlKilzLT5tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5tYXRyaXhbMV0gLSBzLT5tYXRyaXhbMF0sIHMtPm1hdHJpeF9lbmNvZGluZywgcyk7CisKKyAgICBpZiAocmV0ID49IDAgJiYgcy0+aW50X3NhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQKSB7CisgICAgICAgIGludCBpLCBqOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRkZfQVJSQVlfRUxFTVMocy0+bWF0cml4WzBdKTsgaSsrKQorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IEZGX0FSUkFZX0VMRU1TKHMtPm1hdHJpeFswXSk7IGorKykKKyAgICAgICAgICAgICAgICBzLT5tYXRyaXhfZmx0W2ldW2pdID0gcy0+bWF0cml4W2ldW2pdOwogICAgIH0KIAotICAgIGlmKHMtPnJlbWF0cml4X3ZvbHVtZSA+IDApewotICAgICAgICBmb3IoaT0wOyBpPFNXUl9DSF9NQVg7IGkrKykKLSAgICAgICAgICAgIGZvcihqPTA7IGo8U1dSX0NIX01BWDsgaisrKXsKLSAgICAgICAgICAgICAgICBzLT5tYXRyaXhbaV1bal0gKj0gcy0+cmVtYXRyaXhfdm9sdW1lOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICJNYXRyaXggY29lZmZpY2llbnRzOlxuIik7Ci0gICAgZm9yKGk9MDsgaTxhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMob3V0X2NoX2xheW91dCk7IGkrKyl7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmMgPQotICAgICAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbmFtZShhdl9jaGFubmVsX2xheW91dF9leHRyYWN0X2NoYW5uZWwob3V0X2NoX2xheW91dCwgaSkpOwotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiJXM6ICIsIGMgPyBjIDogIj8iKTsKLSAgICAgICAgZm9yKGo9MDsgajxhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoaW5fY2hfbGF5b3V0KTsgaisrKXsKLSAgICAgICAgICAgIGMgPSBhdl9nZXRfY2hhbm5lbF9uYW1lKGF2X2NoYW5uZWxfbGF5b3V0X2V4dHJhY3RfY2hhbm5lbChpbl9jaF9sYXlvdXQsIGopKTsKLSAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfREVCVUcsICIlczolZiAiLCBjID8gYyA6ICI/Iiwgcy0+bWF0cml4W2ldW2pdKTsKLSAgICAgICAgfQotICAgICAgICBhdl9sb2cocywgQVZfTE9HX0RFQlVHLCAiXG4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJldDsKIH0KIAogYXZfY29sZCBpbnQgc3dyaV9yZW1hdHJpeF9pbml0KFN3ckNvbnRleHQgKnMpewpAQCAtMzY3LDE3ICszOTUsMzMgQEAKICAgICAgICAgICAgIHJldHVybiByOwogICAgIH0KICAgICBpZiAocy0+bWlkYnVmLmZtdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlApeworICAgICAgICBpbnQgbWF4c3VtID0gMDsKICAgICAgICAgcy0+bmF0aXZlX21hdHJpeCA9IGF2X2NhbGxvYyhuYl9pbiAqIG5iX291dCwgc2l6ZW9mKGludCkpOwogICAgICAgICBzLT5uYXRpdmVfb25lICAgID0gYXZfbWFsbG9jeihzaXplb2YoaW50KSk7CiAgICAgICAgIGlmICghcy0+bmF0aXZlX21hdHJpeCB8fCAhcy0+bmF0aXZlX29uZSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXQ7IGkrKykKLSAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9pbjsgaisrKQotICAgICAgICAgICAgICAgICgoaW50KilzLT5uYXRpdmVfbWF0cml4KVtpICogbmJfaW4gKyBqXSA9IGxyaW50ZihzLT5tYXRyaXhbaV1bal0gKiAzMjc2OCk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXQ7IGkrKykgeworICAgICAgICAgICAgZG91YmxlIHJlbSA9IDA7CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5iX2luOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdGFyZ2V0ID0gcy0+bWF0cml4W2ldW2pdICogMzI3NjggKyByZW07CisgICAgICAgICAgICAgICAgKChpbnQqKXMtPm5hdGl2ZV9tYXRyaXgpW2kgKiBuYl9pbiArIGpdID0gbHJpbnRmKHRhcmdldCk7CisgICAgICAgICAgICAgICAgcmVtICs9IHRhcmdldCAtICgoaW50KilzLT5uYXRpdmVfbWF0cml4KVtpICogbmJfaW4gKyBqXTsKKyAgICAgICAgICAgICAgICBzdW0gKz0gRkZBQlMoKChpbnQqKXMtPm5hdGl2ZV9tYXRyaXgpW2kgKiBuYl9pbiArIGpdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heHN1bSA9IEZGTUFYKG1heHN1bSwgc3VtKTsKKyAgICAgICAgfQogICAgICAgICAqKChpbnQqKXMtPm5hdGl2ZV9vbmUpID0gMzI3Njg7Ci0gICAgICAgIHMtPm1peF8xXzFfZiA9IChtaXhfMV8xX2Z1bmNfdHlwZSopY29weV9zMTY7Ci0gICAgICAgIHMtPm1peF8yXzFfZiA9IChtaXhfMl8xX2Z1bmNfdHlwZSopc3VtMl9zMTY7Ci0gICAgICAgIHMtPm1peF9hbnlfZiA9IChtaXhfYW55X2Z1bmNfdHlwZSopZ2V0X21peF9hbnlfZnVuY19zMTYocyk7CisgICAgICAgIGlmIChtYXhzdW0gPD0gMzI3NjgpIHsKKyAgICAgICAgICAgIHMtPm1peF8xXzFfZiA9IChtaXhfMV8xX2Z1bmNfdHlwZSopY29weV9zMTY7CisgICAgICAgICAgICBzLT5taXhfMl8xX2YgPSAobWl4XzJfMV9mdW5jX3R5cGUqKXN1bTJfczE2OworICAgICAgICAgICAgcy0+bWl4X2FueV9mID0gKG1peF9hbnlfZnVuY190eXBlKilnZXRfbWl4X2FueV9mdW5jX3MxNihzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHMtPm1peF8xXzFfZiA9IChtaXhfMV8xX2Z1bmNfdHlwZSopY29weV9jbGlwX3MxNjsKKyAgICAgICAgICAgIHMtPm1peF8yXzFfZiA9IChtaXhfMl8xX2Z1bmNfdHlwZSopc3VtMl9jbGlwX3MxNjsKKyAgICAgICAgICAgIHMtPm1peF9hbnlfZiA9IChtaXhfYW55X2Z1bmNfdHlwZSopZ2V0X21peF9hbnlfZnVuY19jbGlwX3MxNihzKTsKKyAgICAgICAgfQogICAgIH1lbHNlIGlmKHMtPm1pZGJ1Zi5mbXQgPT0gQVZfU0FNUExFX0ZNVF9GTFRQKXsKICAgICAgICAgcy0+bmF0aXZlX21hdHJpeCA9IGF2X2NhbGxvYyhuYl9pbiAqIG5iX291dCwgc2l6ZW9mKGZsb2F0KSk7CiAgICAgICAgIHMtPm5hdGl2ZV9vbmUgICAgPSBhdl9tYWxsb2N6KHNpemVvZihmbG9hdCkpOwpAQCAtNDAzLDE0ICs0NDcsMjMgQEAKICAgICAgICAgcy0+bWl4XzJfMV9mID0gKG1peF8yXzFfZnVuY190eXBlKilzdW0yX2RvdWJsZTsKICAgICAgICAgcy0+bWl4X2FueV9mID0gKG1peF9hbnlfZnVuY190eXBlKilnZXRfbWl4X2FueV9mdW5jX2RvdWJsZShzKTsKICAgICB9ZWxzZSBpZihzLT5taWRidWYuZm10ID09IEFWX1NBTVBMRV9GTVRfUzMyUCl7Ci0gICAgICAgIC8vIE9ubHkgZm9yIGRpdGhlcmluZyBjdXJyZW50bHkKLS8vICAgICAgICAgcy0+bmF0aXZlX21hdHJpeCA9IGF2X2NhbGxvYyhuYl9pbiAqIG5iX291dCwgc2l6ZW9mKGRvdWJsZSkpOwogICAgICAgICBzLT5uYXRpdmVfb25lICAgID0gYXZfbWFsbG9jeihzaXplb2YoaW50KSk7CiAgICAgICAgIGlmICghcy0+bmF0aXZlX29uZSkKICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7Ci0vLyAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYl9vdXQ7IGkrKykKLS8vICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBuYl9pbjsgaisrKQotLy8gICAgICAgICAgICAgICAgICgoZG91YmxlKilzLT5uYXRpdmVfbWF0cml4KVtpICogbmJfaW4gKyBqXSA9IHMtPm1hdHJpeFtpXVtqXTsKKyAgICAgICAgcy0+bmF0aXZlX21hdHJpeCA9IGF2X2NhbGxvYyhuYl9pbiAqIG5iX291dCwgc2l6ZW9mKGludCkpOworICAgICAgICBpZiAoIXMtPm5hdGl2ZV9tYXRyaXgpIHsKKyAgICAgICAgICAgIGF2X2ZyZWVwKCZzLT5uYXRpdmVfb25lKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX291dDsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgcmVtID0gMDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5iX2luOyBqKyspIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdGFyZ2V0ID0gcy0+bWF0cml4W2ldW2pdICogMzI3NjggKyByZW07CisgICAgICAgICAgICAgICAgKChpbnQqKXMtPm5hdGl2ZV9tYXRyaXgpW2kgKiBuYl9pbiArIGpdID0gbHJpbnRmKHRhcmdldCk7CisgICAgICAgICAgICAgICAgcmVtICs9IHRhcmdldCAtICgoaW50KilzLT5uYXRpdmVfbWF0cml4KVtpICogbmJfaW4gKyBqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAqKChpbnQqKXMtPm5hdGl2ZV9vbmUpID0gMzI3Njg7CiAgICAgICAgIHMtPm1peF8xXzFfZiA9IChtaXhfMV8xX2Z1bmNfdHlwZSopY29weV9zMzI7CiAgICAgICAgIHMtPm1peF8yXzFfZiA9IChtaXhfMl8xX2Z1bmNfdHlwZSopc3VtMl9zMzI7CkBAIC00MjgsNyArNDgxLDcgQEAKICAgICAgICAgcy0+bWF0cml4X2NoW2ldWzBdPSBjaF9pbjsKICAgICB9CiAKLSAgICBpZihIQVZFX1lBU00gJiYgSEFWRV9NTVgpCisgICAgaWYoSEFWRV9YODZBU00gJiYgSEFWRV9NTVgpCiAgICAgICAgIHJldHVybiBzd3JpX3JlbWF0cml4X2luaXRfeDg2KHMpOwogCiAgICAgcmV0dXJuIDA7CkBAIC00OTQsNyArNTQ3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdj0wOwogICAgICAgICAgICAgICAgICAgICBmb3Ioaj0wOyBqPHMtPm1hdHJpeF9jaFtvdXRfaV1bMF07IGorKyl7CiAgICAgICAgICAgICAgICAgICAgICAgICBpbl9pPSBzLT5tYXRyaXhfY2hbb3V0X2ldWzEral07Ci0gICAgICAgICAgICAgICAgICAgICAgICB2Kz0gKChmbG9hdCopaW4tPmNoW2luX2ldKVtpXSAqIHMtPm1hdHJpeFtvdXRfaV1baW5faV07CisgICAgICAgICAgICAgICAgICAgICAgICB2Kz0gKChmbG9hdCopaW4tPmNoW2luX2ldKVtpXSAqIHMtPm1hdHJpeF9mbHRbb3V0X2ldW2luX2ldOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQqKW91dC0+Y2hbb3V0X2ldKVtpXT0gdjsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL3JlbWF0cml4X3RlbXBsYXRlLmMgYi9saWJzd3Jlc2FtcGxlL3JlbWF0cml4X3RlbXBsYXRlLmMKaW5kZXggOTVhM2I5YS4uYWRkNjVlMyAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS9yZW1hdHJpeF90ZW1wbGF0ZS5jCisrKyBiL2xpYnN3cmVzYW1wbGUvcmVtYXRyaXhfdGVtcGxhdGUuYwpAQCAtMzEsMTEgKzMxLDE2IEBACiAjICAgIGRlZmluZSBJTlRFUiBkb3VibGUKICMgICAgZGVmaW5lIFJFTkFNRSh4KSB4ICMjIF9kb3VibGUKICNlbGlmIGRlZmluZWQoVEVNUExBVEVfUkVNQVRSSVhfUzE2KQotIyAgICBkZWZpbmUgUih4KSAoKCh4KSArIDE2Mzg0KT4+MTUpCiAjICAgIGRlZmluZSBTQU1QTEUgaW50MTZfdAogIyAgICBkZWZpbmUgQ09FRkYgaW50CiAjICAgIGRlZmluZSBJTlRFUiBpbnQKKyMgIGlmZGVmIFRFTVBMQVRFX0NMSVAKKyMgICAgZGVmaW5lIFIoeCkgYXZfY2xpcF9pbnQxNigoKHgpICsgMTYzODQpPj4xNSkKKyMgICAgZGVmaW5lIFJFTkFNRSh4KSB4ICMjIF9jbGlwX3MxNgorIyAgZWxzZQorIyAgICBkZWZpbmUgUih4KSAoKCh4KSArIDE2Mzg0KT4+MTUpCiAjICAgIGRlZmluZSBSRU5BTUUoeCkgeCAjIyBfczE2CisjICBlbmRpZgogI2VsaWYgZGVmaW5lZChURU1QTEFURV9SRU1BVFJJWF9TMzIpCiAjICAgIGRlZmluZSBSKHgpICgoKHgpICsgMTYzODQpPj4xNSkKICMgICAgZGVmaW5lIFNBTVBMRSBpbnQzMl90CmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL3Jlc2FtcGxlLmMgYi9saWJzd3Jlc2FtcGxlL3Jlc2FtcGxlLmMKaW5kZXggNzg4OGU1Ny4uZGY0OTUwNSAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS9yZXNhbXBsZS5jCisrKyBiL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGUuYwpAQCAtMTQ0LDI4ICsxNDQsMzAgQEAKIHN0YXRpYyBpbnQgYnVpbGRfZmlsdGVyKFJlc2FtcGxlQ29udGV4dCAqYywgdm9pZCAqZmlsdGVyLCBkb3VibGUgZmFjdG9yLCBpbnQgdGFwX2NvdW50LCBpbnQgYWxsb2MsIGludCBwaGFzZV9jb3VudCwgaW50IHNjYWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRlcl90eXBlLCBkb3VibGUga2Fpc2VyX2JldGEpewogICAgIGludCBwaCwgaTsKKyAgICBpbnQgcGhfbmIgPSBwaGFzZV9jb3VudCAlIDIgPyBwaGFzZV9jb3VudCA6IHBoYXNlX2NvdW50IC8gMiArIDE7CiAgICAgZG91YmxlIHgsIHksIHcsIHQsIHM7CiAgICAgZG91YmxlICp0YWIgPSBhdl9tYWxsb2NfYXJyYXkodGFwX2NvdW50KzEsICBzaXplb2YoKnRhYikpOwotICAgIGRvdWJsZSAqc2luX2x1dCA9IGF2X21hbGxvY19hcnJheShwaGFzZV9jb3VudCAvIDIgKyAxLCBzaXplb2YoKnNpbl9sdXQpKTsKKyAgICBkb3VibGUgKnNpbl9sdXQgPSBhdl9tYWxsb2NfYXJyYXkocGhfbmIsIHNpemVvZigqc2luX2x1dCkpOwogICAgIGNvbnN0IGludCBjZW50ZXI9ICh0YXBfY291bnQtMSkvMjsKKyAgICBkb3VibGUgbm9ybSA9IDA7CisgICAgaW50IHJldCA9IEFWRVJST1IoRU5PTUVNKTsKIAogICAgIGlmICghdGFiIHx8ICFzaW5fbHV0KQogICAgICAgICBnb3RvIGZhaWw7CiAKKyAgICBhdl9hc3NlcnQwKHRhcF9jb3VudCA9PSAxIHx8IHRhcF9jb3VudCAlIDIgPT0gMCk7CisKICAgICAvKiBpZiB1cHNhbXBsaW5nLCBvbmx5IG5lZWQgdG8gaW50ZXJwb2xhdGUsIG5vIGZpbHRlciAqLwogICAgIGlmIChmYWN0b3IgPiAxLjApCiAgICAgICAgIGZhY3RvciA9IDEuMDsKIAotICAgIGF2X2Fzc2VydDAocGhhc2VfY291bnQgPT0gMSB8fCBwaGFzZV9jb3VudCAlIDIgPT0gMCk7Ci0KICAgICBpZiAoZmFjdG9yID09IDEuMCkgewotICAgICAgICBmb3IgKHBoID0gMDsgcGggPD0gcGhhc2VfY291bnQgLyAyOyBwaCsrKQotICAgICAgICAgICAgc2luX2x1dFtwaF0gPSBzaW4oTV9QSSAqIHBoIC8gcGhhc2VfY291bnQpOworICAgICAgICBmb3IgKHBoID0gMDsgcGggPCBwaF9uYjsgcGgrKykKKyAgICAgICAgICAgIHNpbl9sdXRbcGhdID0gc2luKE1fUEkgKiBwaCAvIHBoYXNlX2NvdW50KSAqIChjZW50ZXIgJiAxID8gMSA6IC0xKTsKICAgICB9Ci0gICAgZm9yKHBoID0gMDsgcGggPD0gcGhhc2VfY291bnQgLyAyOyBwaCsrKSB7Ci0gICAgICAgIGRvdWJsZSBub3JtID0gMDsKKyAgICBmb3IocGggPSAwOyBwaCA8IHBoX25iOyBwaCsrKSB7CiAgICAgICAgIHMgPSBzaW5fbHV0W3BoXTsKLSAgICAgICAgZm9yKGk9MDtpPD10YXBfY291bnQ7aSsrKSB7CisgICAgICAgIGZvcihpPTA7aTx0YXBfY291bnQ7aSsrKSB7CiAgICAgICAgICAgICB4ID0gTV9QSSAqICgoZG91YmxlKShpIC0gY2VudGVyKSAtIChkb3VibGUpcGggLyBwaGFzZV9jb3VudCkgKiBmYWN0b3I7CiAgICAgICAgICAgICBpZiAoeCA9PSAwKSB5ID0gMS4wOwogICAgICAgICAgICAgZWxzZSBpZiAoZmFjdG9yID09IDEuMCkKQEAgLTE5NCw3ICsxOTYsNyBAQAogCiAgICAgICAgICAgICB0YWJbaV0gPSB5OwogICAgICAgICAgICAgcyA9IC1zOwotICAgICAgICAgICAgaWYgKGkgPCB0YXBfY291bnQpCisgICAgICAgICAgICBpZiAoIXBoKQogICAgICAgICAgICAgICAgIG5vcm0gKz0geTsKICAgICAgICAgfQogCkBAIC0yMDMsNTIgKzIwNSwzMCBAQAogICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2UDoKICAgICAgICAgICAgIGZvcihpPTA7aTx0YXBfY291bnQ7aSsrKQogICAgICAgICAgICAgICAgICgoaW50MTZfdCopZmlsdGVyKVtwaCAqIGFsbG9jICsgaV0gPSBhdl9jbGlwX2ludDE2KGxyaW50Zih0YWJbaV0gKiBzY2FsZSAvIG5vcm0pKTsKLSAgICAgICAgICAgIGlmICh0YXBfY291bnQgJSAyID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFwX2NvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICgoaW50MTZfdCopZmlsdGVyKVsocGhhc2VfY291bnQtcGgpICogYWxsb2MgKyB0YXBfY291bnQtMS1pXSA9ICgoaW50MTZfdCopZmlsdGVyKVtwaCAqIGFsbG9jICsgaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IHRhcF9jb3VudDsgaSsrKQotICAgICAgICAgICAgICAgICAgICAoKGludDE2X3QqKWZpbHRlcilbKHBoYXNlX2NvdW50LXBoKSAqIGFsbG9jICsgdGFwX2NvdW50LWldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF2X2NsaXBfaW50MTYobHJpbnRmKHRhYltpXSAqIHNjYWxlIC8gKG5vcm0gLSB0YWJbMF0gKyB0YWJbdGFwX2NvdW50XSkpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwaGFzZV9jb3VudCAlIDIpIGJyZWFrOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhcF9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICgoaW50MTZfdCopZmlsdGVyKVsocGhhc2VfY291bnQtcGgpICogYWxsb2MgKyB0YXBfY291bnQtMS1pXSA9ICgoaW50MTZfdCopZmlsdGVyKVtwaCAqIGFsbG9jICsgaV07CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMlA6CiAgICAgICAgICAgICBmb3IoaT0wO2k8dGFwX2NvdW50O2krKykKICAgICAgICAgICAgICAgICAoKGludDMyX3QqKWZpbHRlcilbcGggKiBhbGxvYyArIGldID0gYXZfY2xpcGxfaW50MzIobGxyaW50KHRhYltpXSAqIHNjYWxlIC8gbm9ybSkpOwotICAgICAgICAgICAgaWYgKHRhcF9jb3VudCAlIDIgPT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YXBfY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgKChpbnQzMl90KilmaWx0ZXIpWyhwaGFzZV9jb3VudC1waCkgKiBhbGxvYyArIHRhcF9jb3VudC0xLWldID0gKChpbnQzMl90KilmaWx0ZXIpW3BoICogYWxsb2MgKyBpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gdGFwX2NvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICgoaW50MzJfdCopZmlsdGVyKVsocGhhc2VfY291bnQtcGgpICogYWxsb2MgKyB0YXBfY291bnQtaV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgYXZfY2xpcGxfaW50MzIobGxyaW50KHRhYltpXSAqIHNjYWxlIC8gKG5vcm0gLSB0YWJbMF0gKyB0YWJbdGFwX2NvdW50XSkpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwaGFzZV9jb3VudCAlIDIpIGJyZWFrOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhcF9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICgoaW50MzJfdCopZmlsdGVyKVsocGhhc2VfY291bnQtcGgpICogYWxsb2MgKyB0YXBfY291bnQtMS1pXSA9ICgoaW50MzJfdCopZmlsdGVyKVtwaCAqIGFsbG9jICsgaV07CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6CiAgICAgICAgICAgICBmb3IoaT0wO2k8dGFwX2NvdW50O2krKykKICAgICAgICAgICAgICAgICAoKGZsb2F0KilmaWx0ZXIpW3BoICogYWxsb2MgKyBpXSA9IHRhYltpXSAqIHNjYWxlIC8gbm9ybTsKLSAgICAgICAgICAgIGlmICh0YXBfY291bnQgJSAyID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFwX2NvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQqKWZpbHRlcilbKHBoYXNlX2NvdW50LXBoKSAqIGFsbG9jICsgdGFwX2NvdW50LTEtaV0gPSAoKGZsb2F0KilmaWx0ZXIpW3BoICogYWxsb2MgKyBpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gdGFwX2NvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQqKWZpbHRlcilbKHBoYXNlX2NvdW50LXBoKSAqIGFsbG9jICsgdGFwX2NvdW50LWldID0gdGFiW2ldICogc2NhbGUgLyAobm9ybSAtIHRhYlswXSArIHRhYlt0YXBfY291bnRdKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwaGFzZV9jb3VudCAlIDIpIGJyZWFrOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhcF9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICgoZmxvYXQqKWZpbHRlcilbKHBoYXNlX2NvdW50LXBoKSAqIGFsbG9jICsgdGFwX2NvdW50LTEtaV0gPSAoKGZsb2F0KilmaWx0ZXIpW3BoICogYWxsb2MgKyBpXTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMUDoKICAgICAgICAgICAgIGZvcihpPTA7aTx0YXBfY291bnQ7aSsrKQogICAgICAgICAgICAgICAgICgoZG91YmxlKilmaWx0ZXIpW3BoICogYWxsb2MgKyBpXSA9IHRhYltpXSAqIHNjYWxlIC8gbm9ybTsKLSAgICAgICAgICAgIGlmICh0YXBfY291bnQgJSAyID09IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFwX2NvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICgoZG91YmxlKilmaWx0ZXIpWyhwaGFzZV9jb3VudC1waCkgKiBhbGxvYyArIHRhcF9jb3VudC0xLWldID0gKChkb3VibGUqKWZpbHRlcilbcGggKiBhbGxvYyArIGldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSB0YXBfY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgKChkb3VibGUqKWZpbHRlcilbKHBoYXNlX2NvdW50LXBoKSAqIGFsbG9jICsgdGFwX2NvdW50LWldID0gdGFiW2ldICogc2NhbGUgLyAobm9ybSAtIHRhYlswXSArIHRhYlt0YXBfY291bnRdKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwaGFzZV9jb3VudCAlIDIpIGJyZWFrOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRhcF9jb3VudDsgaSsrKQorICAgICAgICAgICAgICAgICgoZG91YmxlKilmaWx0ZXIpWyhwaGFzZV9jb3VudC1waCkgKiBhbGxvYyArIHRhcF9jb3VudC0xLWldID0gKChkb3VibGUqKWZpbHRlcilbcGggKiBhbGxvYyArIGldOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0yODksMjMgKzI2OSw0OCBAQAogICAgIH0KICNlbmRpZgogCisgICAgcmV0ID0gMDsKIGZhaWw6CiAgICAgYXZfZnJlZSh0YWIpOwogICAgIGF2X2ZyZWUoc2luX2x1dCk7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmVzYW1wbGVfZnJlZShSZXNhbXBsZUNvbnRleHQgKipjYyl7CisgICAgUmVzYW1wbGVDb250ZXh0ICpjID0gKmNjOworICAgIGlmKCFjKQorICAgICAgICByZXR1cm47CisgICAgYXZfZnJlZXAoJmMtPmZpbHRlcl9iYW5rKTsKKyAgICBhdl9mcmVlcChjYyk7CiB9CiAKIHN0YXRpYyBSZXNhbXBsZUNvbnRleHQgKnJlc2FtcGxlX2luaXQoUmVzYW1wbGVDb250ZXh0ICpjLCBpbnQgb3V0X3JhdGUsIGludCBpbl9yYXRlLCBpbnQgZmlsdGVyX3NpemUsIGludCBwaGFzZV9zaGlmdCwgaW50IGxpbmVhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjdXRvZmYwLCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZvcm1hdCwgZW51bSBTd3JGaWx0ZXJUeXBlIGZpbHRlcl90eXBlLCBkb3VibGUga2Fpc2VyX2JldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uLCBpbnQgY2hlYnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uLCBpbnQgY2hlYnksIGludCBleGFjdF9yYXRpb25hbCkKIHsKICAgICBkb3VibGUgY3V0b2ZmID0gY3V0b2ZmMD8gY3V0b2ZmMCA6IDAuOTc7CiAgICAgZG91YmxlIGZhY3Rvcj0gRkZNSU4ob3V0X3JhdGUgKiBjdXRvZmYgLyBpbl9yYXRlLCAxLjApOwogICAgIGludCBwaGFzZV9jb3VudD0gMTw8cGhhc2Vfc2hpZnQ7CisgICAgaW50IHBoYXNlX2NvdW50X2NvbXBlbnNhdGlvbiA9IHBoYXNlX2NvdW50OworICAgIGludCBmaWx0ZXJfbGVuZ3RoID0gRkZNQVgoKGludCljZWlsKGZpbHRlcl9zaXplL2ZhY3RvciksIDEpOwogCi0gICAgaWYgKCFjIHx8IGMtPnBoYXNlX3NoaWZ0ICE9IHBoYXNlX3NoaWZ0IHx8IGMtPmxpbmVhciE9bGluZWFyIHx8IGMtPmZhY3RvciAhPSBmYWN0b3IKLSAgICAgICAgICAgfHwgYy0+ZmlsdGVyX2xlbmd0aCAhPSBGRk1BWCgoaW50KWNlaWwoZmlsdGVyX3NpemUvZmFjdG9yKSwgMSkgfHwgYy0+Zm9ybWF0ICE9IGZvcm1hdAorICAgIGlmIChmaWx0ZXJfbGVuZ3RoID4gMSkKKyAgICAgICAgZmlsdGVyX2xlbmd0aCA9IEZGQUxJR04oZmlsdGVyX2xlbmd0aCwgMik7CisKKyAgICBpZiAoZXhhY3RfcmF0aW9uYWwpIHsKKyAgICAgICAgaW50IHBoYXNlX2NvdW50X2V4YWN0LCBwaGFzZV9jb3VudF9leGFjdF9kZW47CisKKyAgICAgICAgYXZfcmVkdWNlKCZwaGFzZV9jb3VudF9leGFjdCwgJnBoYXNlX2NvdW50X2V4YWN0X2Rlbiwgb3V0X3JhdGUsIGluX3JhdGUsIElOVF9NQVgpOworICAgICAgICBpZiAocGhhc2VfY291bnRfZXhhY3QgPD0gcGhhc2VfY291bnQpIHsKKyAgICAgICAgICAgIHBoYXNlX2NvdW50X2NvbXBlbnNhdGlvbiA9IHBoYXNlX2NvdW50X2V4YWN0ICogKHBoYXNlX2NvdW50IC8gcGhhc2VfY291bnRfZXhhY3QpOworICAgICAgICAgICAgcGhhc2VfY291bnQgPSBwaGFzZV9jb3VudF9leGFjdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghYyB8fCBjLT5waGFzZV9jb3VudCAhPSBwaGFzZV9jb3VudCB8fCBjLT5saW5lYXIhPWxpbmVhciB8fCBjLT5mYWN0b3IgIT0gZmFjdG9yCisgICAgICAgICAgIHx8IGMtPmZpbHRlcl9sZW5ndGggIT0gZmlsdGVyX2xlbmd0aCB8fCBjLT5mb3JtYXQgIT0gZm9ybWF0CiAgICAgICAgICAgIHx8IGMtPmZpbHRlcl90eXBlICE9IGZpbHRlcl90eXBlIHx8IGMtPmthaXNlcl9iZXRhICE9IGthaXNlcl9iZXRhKSB7CisgICAgICAgIHJlc2FtcGxlX2ZyZWUoJmMpOwogICAgICAgICBjID0gYXZfbWFsbG9jeihzaXplb2YoKmMpKTsKICAgICAgICAgaWYgKCFjKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zMzUsMTUgKzM0MCwxNSBAQAogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQogCi0gICAgICAgIGMtPnBoYXNlX3NoaWZ0ICAgPSBwaGFzZV9zaGlmdDsKLSAgICAgICAgYy0+cGhhc2VfbWFzayAgICA9IHBoYXNlX2NvdW50IC0gMTsKKyAgICAgICAgYy0+cGhhc2VfY291bnQgICA9IHBoYXNlX2NvdW50OwogICAgICAgICBjLT5saW5lYXIgICAgICAgID0gbGluZWFyOwogICAgICAgICBjLT5mYWN0b3IgICAgICAgID0gZmFjdG9yOwotICAgICAgICBjLT5maWx0ZXJfbGVuZ3RoID0gRkZNQVgoKGludCljZWlsKGZpbHRlcl9zaXplL2ZhY3RvciksIDEpOworICAgICAgICBjLT5maWx0ZXJfbGVuZ3RoID0gZmlsdGVyX2xlbmd0aDsKICAgICAgICAgYy0+ZmlsdGVyX2FsbG9jICA9IEZGQUxJR04oYy0+ZmlsdGVyX2xlbmd0aCwgOCk7CiAgICAgICAgIGMtPmZpbHRlcl9iYW5rICAgPSBhdl9jYWxsb2MoYy0+ZmlsdGVyX2FsbG9jLCAocGhhc2VfY291bnQrMSkqYy0+ZmVsZW1fc2l6ZSk7CiAgICAgICAgIGMtPmZpbHRlcl90eXBlICAgPSBmaWx0ZXJfdHlwZTsKICAgICAgICAgYy0+a2Fpc2VyX2JldGEgICA9IGthaXNlcl9iZXRhOworICAgICAgICBjLT5waGFzZV9jb3VudF9jb21wZW5zYXRpb24gPSBwaGFzZV9jb3VudF9jb21wZW5zYXRpb247CiAgICAgICAgIGlmICghYy0+ZmlsdGVyX2JhbmspCiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICBpZiAoYnVpbGRfZmlsdGVyKGMsICh2b2lkKiljLT5maWx0ZXJfYmFuaywgZmFjdG9yLCBjLT5maWx0ZXJfbGVuZ3RoLCBjLT5maWx0ZXJfYWxsb2MsIHBoYXNlX2NvdW50LCAxPDxjLT5maWx0ZXJfc2hpZnQsIGZpbHRlcl90eXBlLCBrYWlzZXJfYmV0YSkpCkBAIC0zNzUsMTQgKzM4MCw2MyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCByZXNhbXBsZV9mcmVlKFJlc2FtcGxlQ29udGV4dCAqKmMpewotICAgIGlmKCEqYykKLSAgICAgICAgcmV0dXJuOwotICAgIGF2X2ZyZWVwKCYoKmMpLT5maWx0ZXJfYmFuayk7Ci0gICAgYXZfZnJlZXAoYyk7CitzdGF0aWMgaW50IHJlYnVpbGRfZmlsdGVyX2Jhbmtfd2l0aF9jb21wZW5zYXRpb24oUmVzYW1wbGVDb250ZXh0ICpjKQoreworICAgIHVpbnQ4X3QgKm5ld19maWx0ZXJfYmFuazsKKyAgICBpbnQgbmV3X3NyY19pbmNyLCBuZXdfZHN0X2luY3I7CisgICAgaW50IHBoYXNlX2NvdW50ID0gYy0+cGhhc2VfY291bnRfY29tcGVuc2F0aW9uOworICAgIGludCByZXQ7CisKKyAgICBpZiAocGhhc2VfY291bnQgPT0gYy0+cGhhc2VfY291bnQpCisgICAgICAgIHJldHVybiAwOworCisgICAgYXZfYXNzZXJ0MCghYy0+ZnJhYyAmJiAhYy0+ZHN0X2luY3JfbW9kKTsKKworICAgIG5ld19maWx0ZXJfYmFuayA9IGF2X2NhbGxvYyhjLT5maWx0ZXJfYWxsb2MsIChwaGFzZV9jb3VudCArIDEpICogYy0+ZmVsZW1fc2l6ZSk7CisgICAgaWYgKCFuZXdfZmlsdGVyX2JhbmspCisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyAgICByZXQgPSBidWlsZF9maWx0ZXIoYywgbmV3X2ZpbHRlcl9iYW5rLCBjLT5mYWN0b3IsIGMtPmZpbHRlcl9sZW5ndGgsIGMtPmZpbHRlcl9hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgcGhhc2VfY291bnQsIDEgPDwgYy0+ZmlsdGVyX3NoaWZ0LCBjLT5maWx0ZXJfdHlwZSwgYy0+a2Fpc2VyX2JldGEpOworICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgIGF2X2ZyZWVwKCZuZXdfZmlsdGVyX2JhbmspOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtZW1jcHkobmV3X2ZpbHRlcl9iYW5rICsgKGMtPmZpbHRlcl9hbGxvYypwaGFzZV9jb3VudCsxKSpjLT5mZWxlbV9zaXplLCBuZXdfZmlsdGVyX2JhbmssIChjLT5maWx0ZXJfYWxsb2MtMSkqYy0+ZmVsZW1fc2l6ZSk7CisgICAgbWVtY3B5KG5ld19maWx0ZXJfYmFuayArIChjLT5maWx0ZXJfYWxsb2MqcGhhc2VfY291bnQgICkqYy0+ZmVsZW1fc2l6ZSwgbmV3X2ZpbHRlcl9iYW5rICsgKGMtPmZpbHRlcl9hbGxvYyAtIDEpKmMtPmZlbGVtX3NpemUsIGMtPmZlbGVtX3NpemUpOworCisgICAgaWYgKCFhdl9yZWR1Y2UoJm5ld19zcmNfaW5jciwgJm5ld19kc3RfaW5jciwgYy0+c3JjX2luY3IsCisgICAgICAgICAgICAgICAgICAgYy0+ZHN0X2luY3IgKiAoaW50NjRfdCkocGhhc2VfY291bnQvYy0+cGhhc2VfY291bnQpLCBJTlQzMl9NQVgvMikpCisgICAgeworICAgICAgICBhdl9mcmVlcCgmbmV3X2ZpbHRlcl9iYW5rKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRUlOVkFMKTsKKyAgICB9CisKKyAgICBjLT5zcmNfaW5jciA9IG5ld19zcmNfaW5jcjsKKyAgICBjLT5kc3RfaW5jciA9IG5ld19kc3RfaW5jcjsKKyAgICB3aGlsZSAoYy0+ZHN0X2luY3IgPCAoMTw8MjApICYmIGMtPnNyY19pbmNyIDwgKDE8PDIwKSkgeworICAgICAgICBjLT5kc3RfaW5jciAqPSAyOworICAgICAgICBjLT5zcmNfaW5jciAqPSAyOworICAgIH0KKyAgICBjLT5pZGVhbF9kc3RfaW5jciA9IGMtPmRzdF9pbmNyOworICAgIGMtPmRzdF9pbmNyX2RpdiAgID0gYy0+ZHN0X2luY3IgLyBjLT5zcmNfaW5jcjsKKyAgICBjLT5kc3RfaW5jcl9tb2QgICA9IGMtPmRzdF9pbmNyICUgYy0+c3JjX2luY3I7CisgICAgYy0+aW5kZXggICAgICAgICAqPSBwaGFzZV9jb3VudCAvIGMtPnBoYXNlX2NvdW50OworICAgIGMtPnBoYXNlX2NvdW50ICAgID0gcGhhc2VfY291bnQ7CisgICAgYXZfZnJlZXAoJmMtPmZpbHRlcl9iYW5rKTsKKyAgICBjLT5maWx0ZXJfYmFuayA9IG5ld19maWx0ZXJfYmFuazsKKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzZXRfY29tcGVuc2F0aW9uKFJlc2FtcGxlQ29udGV4dCAqYywgaW50IHNhbXBsZV9kZWx0YSwgaW50IGNvbXBlbnNhdGlvbl9kaXN0YW5jZSl7CisgICAgaW50IHJldDsKKworICAgIGlmIChjb21wZW5zYXRpb25fZGlzdGFuY2UgJiYgc2FtcGxlX2RlbHRhKSB7CisgICAgICAgIHJldCA9IHJlYnVpbGRfZmlsdGVyX2Jhbmtfd2l0aF9jb21wZW5zYXRpb24oYyk7CisgICAgICAgIGlmIChyZXQgPCAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKICAgICBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2U9IGNvbXBlbnNhdGlvbl9kaXN0YW5jZTsKICAgICBpZiAoY29tcGVuc2F0aW9uX2Rpc3RhbmNlKQogICAgICAgICBjLT5kc3RfaW5jciA9IGMtPmlkZWFsX2RzdF9pbmNyIC0gYy0+aWRlYWxfZHN0X2luY3IgKiAoaW50NjRfdClzYW1wbGVfZGVsdGEgLyBjb21wZW5zYXRpb25fZGlzdGFuY2U7CkBAIC0zOTUsNjQgKzQ0OSw2MSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN3cmlfcmVzYW1wbGUoUmVzYW1wbGVDb250ZXh0ICpjLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBpbnQgKmNvbnN1bWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfc2l6ZSwgaW50IGRzdF9zaXplLCBpbnQgdXBkYXRlX2N0eCkKLXsKLSAgICBpZiAoYy0+ZmlsdGVyX2xlbmd0aCA9PSAxICYmIGMtPnBoYXNlX3NoaWZ0ID09IDApIHsKLSAgICAgICAgaW50IGluZGV4PSBjLT5pbmRleDsKLSAgICAgICAgaW50IGZyYWM9IGMtPmZyYWM7Ci0gICAgICAgIGludDY0X3QgaW5kZXgyPSAoMUxMPDwzMikqYy0+ZnJhYy9jLT5zcmNfaW5jciArICgxTEw8PDMyKSppbmRleDsKLSAgICAgICAgaW50NjRfdCBpbmNyPSAoMUxMPDwzMikgKiBjLT5kc3RfaW5jciAvIGMtPnNyY19pbmNyOwotICAgICAgICBpbnQgbmV3X3NpemUgPSAoc3JjX3NpemUgKiAoaW50NjRfdCljLT5zcmNfaW5jciAtIGZyYWMgKyBjLT5kc3RfaW5jciAtIDEpIC8gYy0+ZHN0X2luY3I7Ci0KLSAgICAgICAgZHN0X3NpemU9IEZGTUlOKGRzdF9zaXplLCBuZXdfc2l6ZSk7Ci0gICAgICAgIGMtPmRzcC5yZXNhbXBsZV9vbmUoZHN0LCBzcmMsIGRzdF9zaXplLCBpbmRleDIsIGluY3IpOwotCi0gICAgICAgIGluZGV4ICs9IGRzdF9zaXplICogYy0+ZHN0X2luY3JfZGl2OwotICAgICAgICBpbmRleCArPSAoZnJhYyArIGRzdF9zaXplICogKGludDY0X3QpYy0+ZHN0X2luY3JfbW9kKSAvIGMtPnNyY19pbmNyOwotICAgICAgICBhdl9hc3NlcnQyKGluZGV4ID49IDApOwotICAgICAgICAqY29uc3VtZWQ9IGluZGV4OwotICAgICAgICBpZiAodXBkYXRlX2N0eCkgewotICAgICAgICAgICAgYy0+ZnJhYyAgID0gKGZyYWMgKyBkc3Rfc2l6ZSAqIChpbnQ2NF90KWMtPmRzdF9pbmNyX21vZCkgJSBjLT5zcmNfaW5jcjsKLSAgICAgICAgICAgIGMtPmluZGV4ID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDY0X3QgZW5kX2luZGV4ID0gKDFMTCArIHNyY19zaXplIC0gYy0+ZmlsdGVyX2xlbmd0aCkgPDwgYy0+cGhhc2Vfc2hpZnQ7Ci0gICAgICAgIGludDY0X3QgZGVsdGFfZnJhYyA9IChlbmRfaW5kZXggLSBjLT5pbmRleCkgKiBjLT5zcmNfaW5jciAtIGMtPmZyYWM7Ci0gICAgICAgIGludCBkZWx0YV9uID0gKGRlbHRhX2ZyYWMgKyBjLT5kc3RfaW5jciAtIDEpIC8gYy0+ZHN0X2luY3I7Ci0KLSAgICAgICAgZHN0X3NpemUgPSBGRk1JTihkc3Rfc2l6ZSwgZGVsdGFfbik7Ci0gICAgICAgIGlmIChkc3Rfc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICpjb25zdW1lZCA9IGMtPmRzcC5yZXNhbXBsZShjLCBkc3QsIHNyYywgZHN0X3NpemUsIHVwZGF0ZV9jdHgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmNvbnN1bWVkID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBkc3Rfc2l6ZTsKLX0KLQogc3RhdGljIGludCBtdWx0aXBsZV9yZXNhbXBsZShSZXNhbXBsZUNvbnRleHQgKmMsIEF1ZGlvRGF0YSAqZHN0LCBpbnQgZHN0X3NpemUsIEF1ZGlvRGF0YSAqc3JjLCBpbnQgc3JjX3NpemUsIGludCAqY29uc3VtZWQpewotICAgIGludCBpLCByZXQ9IC0xOworICAgIGludCBpOwogICAgIGludCBhdl91bnVzZWQgbW1fZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAgICAgaW50IG5lZWRfZW1tcyA9IGMtPmZvcm1hdCA9PSBBVl9TQU1QTEVfRk1UX1MxNlAgJiYgQVJDSF9YODZfMzIgJiYKICAgICAgICAgICAgICAgICAgICAgKG1tX2ZsYWdzICYgKEFWX0NQVV9GTEFHX01NWDIgfCBBVl9DUFVfRkxBR19TU0UyKSkgPT0gQVZfQ1BVX0ZMQUdfTU1YMjsKLSAgICBpbnQ2NF90IG1heF9zcmNfc2l6ZSA9IChJTlQ2NF9NQVggPj4gKGMtPnBoYXNlX3NoaWZ0KzEpKSAvIGMtPnNyY19pbmNyOworICAgIGludDY0X3QgbWF4X3NyY19zaXplID0gKElOVDY0X01BWC8yIC8gYy0+cGhhc2VfY291bnQpIC8gYy0+c3JjX2luY3I7CiAKICAgICBpZiAoYy0+Y29tcGVuc2F0aW9uX2Rpc3RhbmNlKQogICAgICAgICBkc3Rfc2l6ZSA9IEZGTUlOKGRzdF9zaXplLCBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2UpOwogICAgIHNyY19zaXplID0gRkZNSU4oc3JjX3NpemUsIG1heF9zcmNfc2l6ZSk7CiAKLSAgICBmb3IoaT0wOyBpPGRzdC0+Y2hfY291bnQ7IGkrKyl7Ci0gICAgICAgIHJldD0gc3dyaV9yZXNhbXBsZShjLCBkc3QtPmNoW2ldLCBzcmMtPmNoW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZWQsIHNyY19zaXplLCBkc3Rfc2l6ZSwgaSsxPT1kc3QtPmNoX2NvdW50KTsKKyAgICAqY29uc3VtZWQgPSAwOworCisgICAgaWYgKGMtPmZpbHRlcl9sZW5ndGggPT0gMSAmJiBjLT5waGFzZV9jb3VudCA9PSAxKSB7CisgICAgICAgIGludDY0X3QgaW5kZXgyPSAoMUxMPDwzMikqYy0+ZnJhYy9jLT5zcmNfaW5jciArICgxTEw8PDMyKSpjLT5pbmRleDsKKyAgICAgICAgaW50NjRfdCBpbmNyPSAoMUxMPDwzMikgKiBjLT5kc3RfaW5jciAvIGMtPnNyY19pbmNyOworICAgICAgICBpbnQgbmV3X3NpemUgPSAoc3JjX3NpemUgKiAoaW50NjRfdCljLT5zcmNfaW5jciAtIGMtPmZyYWMgKyBjLT5kc3RfaW5jciAtIDEpIC8gYy0+ZHN0X2luY3I7CisKKyAgICAgICAgZHN0X3NpemUgPSBGRk1BWChGRk1JTihkc3Rfc2l6ZSwgbmV3X3NpemUpLCAwKTsKKyAgICAgICAgaWYgKGRzdF9zaXplID4gMCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdC0+Y2hfY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9vbmUoZHN0LT5jaFtpXSwgc3JjLT5jaFtpXSwgZHN0X3NpemUsIGluZGV4MiwgaW5jcik7CisgICAgICAgICAgICAgICAgaWYgKGkrMSA9PSBkc3QtPmNoX2NvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIGMtPmluZGV4ICs9IGRzdF9zaXplICogYy0+ZHN0X2luY3JfZGl2OworICAgICAgICAgICAgICAgICAgICBjLT5pbmRleCArPSAoYy0+ZnJhYyArIGRzdF9zaXplICogKGludDY0X3QpYy0+ZHN0X2luY3JfbW9kKSAvIGMtPnNyY19pbmNyOworICAgICAgICAgICAgICAgICAgICBhdl9hc3NlcnQyKGMtPmluZGV4ID49IDApOworICAgICAgICAgICAgICAgICAgICAqY29uc3VtZWQgPSBjLT5pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgYy0+ZnJhYyAgID0gKGMtPmZyYWMgKyBkc3Rfc2l6ZSAqIChpbnQ2NF90KWMtPmRzdF9pbmNyX21vZCkgJSBjLT5zcmNfaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgYy0+aW5kZXggPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDY0X3QgZW5kX2luZGV4ID0gKDFMTCArIHNyY19zaXplIC0gYy0+ZmlsdGVyX2xlbmd0aCkgKiBjLT5waGFzZV9jb3VudDsKKyAgICAgICAgaW50NjRfdCBkZWx0YV9mcmFjID0gKGVuZF9pbmRleCAtIGMtPmluZGV4KSAqIGMtPnNyY19pbmNyIC0gYy0+ZnJhYzsKKyAgICAgICAgaW50IGRlbHRhX24gPSAoZGVsdGFfZnJhYyArIGMtPmRzdF9pbmNyIC0gMSkgLyBjLT5kc3RfaW5jcjsKKyAgICAgICAgaW50ICgqcmVzYW1wbGVfZnVuYykoc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqYywgdm9pZCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmMsIGludCBuLCBpbnQgdXBkYXRlX2N0eCk7CisKKyAgICAgICAgZHN0X3NpemUgPSBGRk1BWChGRk1JTihkc3Rfc2l6ZSwgZGVsdGFfbiksIDApOworICAgICAgICBpZiAoZHN0X3NpemUgPiAwKSB7CisgICAgICAgICAgICAvKiByZXNhbXBsZV9saW5lYXIgYW5kIHJlc2FtcGxlX2NvbW1vbiBzaG91bGQgaGF2ZSBzYW1lIGJlaGF2aW9yCisgICAgICAgICAgICAgKiB3aGVuIGZyYWMgYW5kIGRzdF9pbmNyX21vZCBhcmUgemVybyAqLworICAgICAgICAgICAgcmVzYW1wbGVfZnVuYyA9IChjLT5saW5lYXIgJiYgKGMtPmZyYWMgfHwgYy0+ZHN0X2luY3JfbW9kKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgOiBjLT5kc3AucmVzYW1wbGVfY29tbW9uOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdC0+Y2hfY291bnQ7IGkrKykKKyAgICAgICAgICAgICAgICAqY29uc3VtZWQgPSByZXNhbXBsZV9mdW5jKGMsIGRzdC0+Y2hbaV0sIHNyYy0+Y2hbaV0sIGRzdF9zaXplLCBpKzEgPT0gZHN0LT5jaF9jb3VudCk7CisgICAgICAgIH0KICAgICB9CisKICAgICBpZihuZWVkX2VtbXMpCiAgICAgICAgIGVtbXNfYygpOwogCiAgICAgaWYgKGMtPmNvbXBlbnNhdGlvbl9kaXN0YW5jZSkgewotICAgICAgICBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2UgLT0gcmV0OworICAgICAgICBjLT5jb21wZW5zYXRpb25fZGlzdGFuY2UgLT0gZHN0X3NpemU7CiAgICAgICAgIGlmICghYy0+Y29tcGVuc2F0aW9uX2Rpc3RhbmNlKSB7CiAgICAgICAgICAgICBjLT5kc3RfaW5jciAgICAgPSBjLT5pZGVhbF9kc3RfaW5jcjsKICAgICAgICAgICAgIGMtPmRzdF9pbmNyX2RpdiA9IGMtPmRzdF9pbmNyIC8gYy0+c3JjX2luY3I7CkBAIC00NjAsMTcgKzUxMSwxNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHJldDsKKyAgICByZXR1cm4gZHN0X3NpemU7CiB9CiAKIHN0YXRpYyBpbnQ2NF90IGdldF9kZWxheShzdHJ1Y3QgU3dyQ29udGV4dCAqcywgaW50NjRfdCBiYXNlKXsKICAgICBSZXNhbXBsZUNvbnRleHQgKmMgPSBzLT5yZXNhbXBsZTsKICAgICBpbnQ2NF90IG51bSA9IHMtPmluX2J1ZmZlcl9jb3VudCAtIChjLT5maWx0ZXJfbGVuZ3RoLTEpLzI7Ci0gICAgbnVtICo9IDEgPDwgYy0+cGhhc2Vfc2hpZnQ7CisgICAgbnVtICo9IGMtPnBoYXNlX2NvdW50OwogICAgIG51bSAtPSBjLT5pbmRleDsKICAgICBudW0gKj0gYy0+c3JjX2luY3I7CiAgICAgbnVtIC09IGMtPmZyYWM7Ci0gICAgcmV0dXJuIGF2X3Jlc2NhbGUobnVtLCBiYXNlLCBzLT5pbl9zYW1wbGVfcmF0ZSooaW50NjRfdCljLT5zcmNfaW5jciA8PCBjLT5waGFzZV9zaGlmdCk7CisgICAgcmV0dXJuIGF2X3Jlc2NhbGUobnVtLCBiYXNlLCBzLT5pbl9zYW1wbGVfcmF0ZSooaW50NjRfdCljLT5zcmNfaW5jciAqIGMtPnBoYXNlX2NvdW50KTsKIH0KIAogc3RhdGljIGludDY0X3QgZ2V0X291dF9zYW1wbGVzKHN0cnVjdCBTd3JDb250ZXh0ICpzLCBpbnQgaW5fc2FtcGxlcykgewpAQCAtNDc5LDkgKzUzMCw5IEBACiAgICAgLy8gVGhleSBhbHNvIG1ha2UgaXQgZWFzaWVyIHRvIHByb29mIHRoYXQgY2hhbmdlcyBhbmQgb3B0aW1pemF0aW9ucyBkbyBub3QKICAgICAvLyBicmVhayB0aGUgdXBwZXIgYm91bmQuCiAgICAgaW50NjRfdCBudW0gPSBzLT5pbl9idWZmZXJfY291bnQgKyAyTEwgKyBpbl9zYW1wbGVzOwotICAgIG51bSAqPSAxIDw8IGMtPnBoYXNlX3NoaWZ0OworICAgIG51bSAqPSBjLT5waGFzZV9jb3VudDsKICAgICBudW0gLT0gYy0+aW5kZXg7Ci0gICAgbnVtID0gYXZfcmVzY2FsZV9ybmQobnVtLCBzLT5vdXRfc2FtcGxlX3JhdGUsICgoaW50NjRfdClzLT5pbl9zYW1wbGVfcmF0ZSkgPDwgYy0+cGhhc2Vfc2hpZnQsIEFWX1JPVU5EX1VQKSArIDI7CisgICAgbnVtID0gYXZfcmVzY2FsZV9ybmQobnVtLCBzLT5vdXRfc2FtcGxlX3JhdGUsICgoaW50NjRfdClzLT5pbl9zYW1wbGVfcmF0ZSkgKiBjLT5waGFzZV9jb3VudCwgQVZfUk9VTkRfVVApICsgMjsKIAogICAgIGlmIChjLT5jb21wZW5zYXRpb25fZGlzdGFuY2UpIHsKICAgICAgICAgaWYgKG51bSA+IElOVF9NQVgpCkBAIC00OTMsMTggKzU0NCwyMSBAQAogfQogCiBzdGF0aWMgaW50IHJlc2FtcGxlX2ZsdXNoKHN0cnVjdCBTd3JDb250ZXh0ICpzKSB7CisgICAgUmVzYW1wbGVDb250ZXh0ICpjID0gcy0+cmVzYW1wbGU7CiAgICAgQXVkaW9EYXRhICphPSAmcy0+aW5fYnVmZmVyOwogICAgIGludCBpLCBqLCByZXQ7Ci0gICAgaWYoKHJldCA9IHN3cmlfcmVhbGxvY19hdWRpbyhhLCBzLT5pbl9idWZmZXJfaW5kZXggKyAyKnMtPmluX2J1ZmZlcl9jb3VudCkpIDwgMCkKKyAgICBpbnQgcmVmbGVjdGlvbiA9IChGRk1JTihzLT5pbl9idWZmZXJfY291bnQsIGMtPmZpbHRlcl9sZW5ndGgpICsgMSkgLyAyOworCisgICAgaWYoKHJldCA9IHN3cmlfcmVhbGxvY19hdWRpbyhhLCBzLT5pbl9idWZmZXJfaW5kZXggKyBzLT5pbl9idWZmZXJfY291bnQgKyByZWZsZWN0aW9uKSkgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwogICAgIGF2X2Fzc2VydDAoYS0+cGxhbmFyKTsKICAgICBmb3IoaT0wOyBpPGEtPmNoX2NvdW50OyBpKyspewotICAgICAgICBmb3Ioaj0wOyBqPHMtPmluX2J1ZmZlcl9jb3VudDsgaisrKXsKKyAgICAgICAgZm9yKGo9MDsgajxyZWZsZWN0aW9uOyBqKyspewogICAgICAgICAgICAgbWVtY3B5KGEtPmNoW2ldICsgKHMtPmluX2J1ZmZlcl9pbmRleCtzLT5pbl9idWZmZXJfY291bnQraiAgKSphLT5icHMsCiAgICAgICAgICAgICAgICAgYS0+Y2hbaV0gKyAocy0+aW5fYnVmZmVyX2luZGV4K3MtPmluX2J1ZmZlcl9jb3VudC1qLTEpKmEtPmJwcywgYS0+YnBzKTsKICAgICAgICAgfQogICAgIH0KLSAgICBzLT5pbl9idWZmZXJfY291bnQgKz0gKHMtPmluX2J1ZmZlcl9jb3VudCsxKS8yOworICAgIHMtPmluX2J1ZmZlcl9jb3VudCArPSByZWZsZWN0aW9uOwogICAgIHJldHVybiAwOwogfQogCkBAIC01NDUsMTAgKzU5OSwxMyBAQAogICAgIH0KIAogICAgIHJlcyA9IG51bSAtICpvdXRfc3o7Ci0gICAgKm91dF9pZHggPSBjLT5maWx0ZXJfbGVuZ3RoICsgKGMtPmluZGV4ID4+IGMtPnBoYXNlX3NoaWZ0KTsKKyAgICAqb3V0X2lkeCA9IGMtPmZpbHRlcl9sZW5ndGg7CisgICAgd2hpbGUgKGMtPmluZGV4IDwgMCkgeworICAgICAgICAtLSpvdXRfaWR4OworICAgICAgICBjLT5pbmRleCArPSBjLT5waGFzZV9jb3VudDsKKyAgICB9CiAgICAgKm91dF9zeiA9IEZGTUFYKCpvdXRfc3ogKyBjLT5maWx0ZXJfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAxICsgYy0+ZmlsdGVyX2xlbmd0aCAqIDIpIC0gKm91dF9pZHg7Ci0gICAgYy0+aW5kZXggJj0gYy0+cGhhc2VfbWFzazsKIAogICAgIHJldHVybiBGRk1BWChyZXMsIDApOwogfQpkaWZmIC0tZ2l0IGEvbGlic3dyZXNhbXBsZS9yZXNhbXBsZS5oIGIvbGlic3dyZXNhbXBsZS9yZXNhbXBsZS5oCmluZGV4IGExMjZiMTEuLjE3MzFkYWQgMTAwNjQ0Ci0tLSBhL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGUuaAorKysgYi9saWJzd3Jlc2FtcGxlL3Jlc2FtcGxlLmgKQEAgLTQwLDggKzQwLDcgQEAKICAgICBpbnQgZnJhYzsKICAgICBpbnQgc3JjX2luY3I7CiAgICAgaW50IGNvbXBlbnNhdGlvbl9kaXN0YW5jZTsKLSAgICBpbnQgcGhhc2Vfc2hpZnQ7Ci0gICAgaW50IHBoYXNlX21hc2s7CisgICAgaW50IHBoYXNlX2NvdW50OwogICAgIGludCBsaW5lYXI7CiAgICAgZW51bSBTd3JGaWx0ZXJUeXBlIGZpbHRlcl90eXBlOwogICAgIGRvdWJsZSBrYWlzZXJfYmV0YTsKQEAgLTQ5LDE2ICs0OCwyMSBAQAogICAgIGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0OwogICAgIGludCBmZWxlbV9zaXplOwogICAgIGludCBmaWx0ZXJfc2hpZnQ7CisgICAgaW50IHBoYXNlX2NvdW50X2NvbXBlbnNhdGlvbjsgICAgICAvKiBkZXNpcmVkIHBoYXNlX2NvdW50IHdoZW4gY29tcGVuc2F0aW9uIGlzIGVuYWJsZWQgKi8KIAogICAgIHN0cnVjdCB7CiAgICAgICAgIHZvaWQgKCpyZXNhbXBsZV9vbmUpKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgaW50NjRfdCBpbmRleCwgaW50NjRfdCBpbmNyKTsKLSAgICAgICAgaW50ICgqcmVzYW1wbGUpKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIHZvaWQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyYywgaW50IG4sIGludCB1cGRhdGVfY3R4KTsKKyAgICAgICAgaW50ICgqcmVzYW1wbGVfY29tbW9uKShzdHJ1Y3QgUmVzYW1wbGVDb250ZXh0ICpjLCB2b2lkICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqc3JjLCBpbnQgbiwgaW50IHVwZGF0ZV9jdHgpOworICAgICAgICBpbnQgKCpyZXNhbXBsZV9saW5lYXIpKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIHZvaWQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmMsIGludCBuLCBpbnQgdXBkYXRlX2N0eCk7CiAgICAgfSBkc3A7CiB9IFJlc2FtcGxlQ29udGV4dDsKIAogdm9pZCBzd3JpX3Jlc2FtcGxlX2RzcF9pbml0KFJlc2FtcGxlQ29udGV4dCAqYyk7CiB2b2lkIHN3cmlfcmVzYW1wbGVfZHNwX3g4Nl9pbml0KFJlc2FtcGxlQ29udGV4dCAqYyk7Cit2b2lkIHN3cmlfcmVzYW1wbGVfZHNwX2FybV9pbml0KFJlc2FtcGxlQ29udGV4dCAqYyk7Cit2b2lkIHN3cmlfcmVzYW1wbGVfZHNwX2FhcmNoNjRfaW5pdChSZXNhbXBsZUNvbnRleHQgKmMpOwogCiAjZW5kaWYgLyogU1dSRVNBTVBMRV9SRVNBTVBMRV9IICovCmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL3Jlc2FtcGxlX2RzcC5jIGIvbGlic3dyZXNhbXBsZS9yZXNhbXBsZV9kc3AuYwppbmRleCBhODExYjhiLi5iMjQyNGViIDEwMDY0NAotLS0gYS9saWJzd3Jlc2FtcGxlL3Jlc2FtcGxlX2RzcC5jCisrKyBiL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGVfZHNwLmMKQEAgLTQ4LDIxICs0OCwyNyBAQAogICAgIHN3aXRjaChjLT5mb3JtYXQpewogICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgogICAgICAgICBjLT5kc3AucmVzYW1wbGVfb25lID0gcmVzYW1wbGVfb25lX2ludDE2OwotICAgICAgICBjLT5kc3AucmVzYW1wbGUgICAgID0gYy0+bGluZWFyID8gcmVzYW1wbGVfbGluZWFyX2ludDE2IDogcmVzYW1wbGVfY29tbW9uX2ludDE2OworICAgICAgICBjLT5kc3AucmVzYW1wbGVfY29tbW9uID0gcmVzYW1wbGVfY29tbW9uX2ludDE2OworICAgICAgICBjLT5kc3AucmVzYW1wbGVfbGluZWFyID0gcmVzYW1wbGVfbGluZWFyX2ludDE2OwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyUDoKICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX29uZSA9IHJlc2FtcGxlX29uZV9pbnQzMjsKLSAgICAgICAgYy0+ZHNwLnJlc2FtcGxlICAgICA9IGMtPmxpbmVhciA/IHJlc2FtcGxlX2xpbmVhcl9pbnQzMiA6IHJlc2FtcGxlX2NvbW1vbl9pbnQzMjsKKyAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX2NvbW1vbiA9IHJlc2FtcGxlX2NvbW1vbl9pbnQzMjsKKyAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX2xpbmVhciA9IHJlc2FtcGxlX2xpbmVhcl9pbnQzMjsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVFA6CiAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9vbmUgPSByZXNhbXBsZV9vbmVfZmxvYXQ7Ci0gICAgICAgIGMtPmRzcC5yZXNhbXBsZSAgICAgPSBjLT5saW5lYXIgPyByZXNhbXBsZV9saW5lYXJfZmxvYXQgOiByZXNhbXBsZV9jb21tb25fZmxvYXQ7CisgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9jb21tb24gPSByZXNhbXBsZV9jb21tb25fZmxvYXQ7CisgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgPSByZXNhbXBsZV9saW5lYXJfZmxvYXQ7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkxQOgogICAgICAgICBjLT5kc3AucmVzYW1wbGVfb25lID0gcmVzYW1wbGVfb25lX2RvdWJsZTsKLSAgICAgICAgYy0+ZHNwLnJlc2FtcGxlICAgICA9IGMtPmxpbmVhciA/IHJlc2FtcGxlX2xpbmVhcl9kb3VibGUgOiByZXNhbXBsZV9jb21tb25fZG91YmxlOworICAgICAgICBjLT5kc3AucmVzYW1wbGVfY29tbW9uID0gcmVzYW1wbGVfY29tbW9uX2RvdWJsZTsKKyAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX2xpbmVhciA9IHJlc2FtcGxlX2xpbmVhcl9kb3VibGU7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIAogICAgIGlmIChBUkNIX1g4Nikgc3dyaV9yZXNhbXBsZV9kc3BfeDg2X2luaXQoYyk7CisgICAgZWxzZSBpZiAoQVJDSF9BUk0pIHN3cmlfcmVzYW1wbGVfZHNwX2FybV9pbml0KGMpOworICAgIGVsc2UgaWYgKEFSQ0hfQUFSQ0g2NCkgc3dyaV9yZXNhbXBsZV9kc3BfYWFyY2g2NF9pbml0KGMpOwogfQpkaWZmIC0tZ2l0IGEvbGlic3dyZXNhbXBsZS9yZXNhbXBsZV90ZW1wbGF0ZS5jIGIvbGlic3dyZXNhbXBsZS9yZXNhbXBsZV90ZW1wbGF0ZS5jCmluZGV4IGQ3MWVmZDYuLjRjMjI3YjkgMTAwNjQ0Ci0tLSBhL2xpYnN3cmVzYW1wbGUvcmVzYW1wbGVfdGVtcGxhdGUuYworKysgYi9saWJzd3Jlc2FtcGxlL3Jlc2FtcGxlX3RlbXBsYXRlLmMKQEAgLTMyLDYgKzMyLDcgQEAKICMgICAgZGVmaW5lIERFTEVNICBkb3VibGUKICMgICAgZGVmaW5lIEZFTEVNICBkb3VibGUKICMgICAgZGVmaW5lIEZFTEVNMiBkb3VibGUKKyMgICAgZGVmaW5lIEZPRkZTRVQgMAogIyAgICBkZWZpbmUgT1VUKGQsIHYpIGQgPSB2CiAKICNlbGlmICAgIGRlZmluZWQoVEVNUExBVEVfUkVTQU1QTEVfRkxUKQpAQCAtNDEsNiArNDIsNyBAQAogIyAgICBkZWZpbmUgREVMRU0gIGZsb2F0CiAjICAgIGRlZmluZSBGRUxFTSAgZmxvYXQKICMgICAgZGVmaW5lIEZFTEVNMiBmbG9hdAorIyAgICBkZWZpbmUgRk9GRlNFVCAwCiAjICAgIGRlZmluZSBPVVQoZCwgdikgZCA9IHYKIAogI2VsaWYgZGVmaW5lZChURU1QTEFURV9SRVNBTVBMRV9TMzIpCkBAIC01Miw4ICs1NCw4IEBACiAjICAgIGRlZmluZSBGRUxFTTIgaW50NjRfdAogIyAgICBkZWZpbmUgRkVMRU1fTUFYIElOVDMyX01BWAogIyAgICBkZWZpbmUgRkVMRU1fTUlOIElOVDMyX01JTgotIyAgICBkZWZpbmUgT1VUKGQsIHYpICh2KSA9ICgodikgKyAoMTw8KEZJTFRFUl9TSElGVC0xKSkpPj5GSUxURVJfU0hJRlQ7XAotICAgICAgICAgICAgICAgICAgICAgIChkKSA9IGF2X2NsaXBsX2ludDMyKHYpCisjICAgIGRlZmluZSBGT0ZGU0VUICgxPDwoRklMVEVSX1NISUZULTEpKQorIyAgICBkZWZpbmUgT1VUKGQsIHYpIChkKSA9IGF2X2NsaXBsX2ludDMyKCh2KT4+RklMVEVSX1NISUZUKQogCiAjZWxpZiAgICBkZWZpbmVkKFRFTVBMQVRFX1JFU0FNUExFX1MxNikKIApAQCAtNjUsOCArNjcsOCBAQAogIyAgICBkZWZpbmUgRkVMRU1MIGludDY0X3QKICMgICAgZGVmaW5lIEZFTEVNX01BWCBJTlQxNl9NQVgKICMgICAgZGVmaW5lIEZFTEVNX01JTiBJTlQxNl9NSU4KLSMgICAgZGVmaW5lIE9VVChkLCB2KSAodikgPSAoKHYpICsgKDE8PChGSUxURVJfU0hJRlQtMSkpKT4+RklMVEVSX1NISUZUO1wKLSAgICAgICAgICAgICAgICAgICAgICAoZCkgPSBhdl9jbGlwX2ludDE2KHYpCisjICAgIGRlZmluZSBGT0ZGU0VUICgxPDwoRklMVEVSX1NISUZULTEpKQorIyAgICBkZWZpbmUgT1VUKGQsIHYpIChkKSA9IGF2X2NsaXBfaW50MTYoKHYpPj5GSUxURVJfU0hJRlQpCiAKICNlbmRpZgogCkBAIC05MiwxOCArOTQsMzAgQEAKICAgICBpbnQgZHN0X2luZGV4OwogICAgIGludCBpbmRleD0gYy0+aW5kZXg7CiAgICAgaW50IGZyYWM9IGMtPmZyYWM7Ci0gICAgaW50IHNhbXBsZV9pbmRleCA9IGluZGV4ID4+IGMtPnBoYXNlX3NoaWZ0OworICAgIGludCBzYW1wbGVfaW5kZXggPSAwOwogCi0gICAgaW5kZXggJj0gYy0+cGhhc2VfbWFzazsKKyAgICB3aGlsZSAoaW5kZXggPj0gYy0+cGhhc2VfY291bnQpIHsKKyAgICAgICAgc2FtcGxlX2luZGV4Kys7CisgICAgICAgIGluZGV4IC09IGMtPnBoYXNlX2NvdW50OworICAgIH0KKwogICAgIGZvciAoZHN0X2luZGV4ID0gMDsgZHN0X2luZGV4IDwgbjsgZHN0X2luZGV4KyspIHsKICAgICAgICAgRkVMRU0gKmZpbHRlciA9ICgoRkVMRU0gKikgYy0+ZmlsdGVyX2JhbmspICsgYy0+ZmlsdGVyX2FsbG9jICogaW5kZXg7CiAKLSAgICAgICAgRkVMRU0yIHZhbD0wOworICAgICAgICBGRUxFTTIgdmFsID0gRk9GRlNFVDsKKyAgICAgICAgRkVMRU0yIHZhbDI9IDA7CiAgICAgICAgIGludCBpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYy0+ZmlsdGVyX2xlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICB2YWwgKz0gc3JjW3NhbXBsZV9pbmRleCArIGldICogKEZFTEVNMilmaWx0ZXJbaV07CisgICAgICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgYy0+ZmlsdGVyX2xlbmd0aDsgaSs9MikgeworICAgICAgICAgICAgdmFsICArPSBzcmNbc2FtcGxlX2luZGV4ICsgaSAgICBdICogKEZFTEVNMilmaWx0ZXJbaSAgICBdOworICAgICAgICAgICAgdmFsMiArPSBzcmNbc2FtcGxlX2luZGV4ICsgaSArIDFdICogKEZFTEVNMilmaWx0ZXJbaSArIDFdOwogICAgICAgICB9Ci0gICAgICAgIE9VVChkc3RbZHN0X2luZGV4XSwgdmFsKTsKKyAgICAgICAgaWYgKGkgPCBjLT5maWx0ZXJfbGVuZ3RoKQorICAgICAgICAgICAgdmFsICArPSBzcmNbc2FtcGxlX2luZGV4ICsgaSAgICBdICogKEZFTEVNMilmaWx0ZXJbaSAgICBdOworI2lmZGVmIEZFTEVNTAorICAgICAgICBPVVQoZHN0W2RzdF9pbmRleF0sIHZhbCArIChGRUxFTUwpdmFsMik7CisjZWxzZQorICAgICAgICBPVVQoZHN0W2RzdF9pbmRleF0sIHZhbCArIHZhbDIpOworI2VuZGlmCiAKICAgICAgICAgZnJhYyAgKz0gYy0+ZHN0X2luY3JfbW9kOwogICAgICAgICBpbmRleCArPSBjLT5kc3RfaW5jcl9kaXY7CkBAIC0xMTEsOCArMTI1LDExIEBACiAgICAgICAgICAgICBmcmFjIC09IGMtPnNyY19pbmNyOwogICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgfQotICAgICAgICBzYW1wbGVfaW5kZXggKz0gaW5kZXggPj4gYy0+cGhhc2Vfc2hpZnQ7Ci0gICAgICAgIGluZGV4ICY9IGMtPnBoYXNlX21hc2s7CisKKyAgICAgICAgd2hpbGUgKGluZGV4ID49IGMtPnBoYXNlX2NvdW50KSB7CisgICAgICAgICAgICBzYW1wbGVfaW5kZXgrKzsKKyAgICAgICAgICAgIGluZGV4IC09IGMtPnBoYXNlX2NvdW50OworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYodXBkYXRlX2N0eCl7CkBAIC0xMzIsMTUgKzE0OSwxOSBAQAogICAgIGludCBkc3RfaW5kZXg7CiAgICAgaW50IGluZGV4PSBjLT5pbmRleDsKICAgICBpbnQgZnJhYz0gYy0+ZnJhYzsKLSAgICBpbnQgc2FtcGxlX2luZGV4ID0gaW5kZXggPj4gYy0+cGhhc2Vfc2hpZnQ7CisgICAgaW50IHNhbXBsZV9pbmRleCA9IDA7CiAjaWYgRklMVEVSX1NISUZUID09IDAKICAgICBkb3VibGUgaW52X3NyY19pbmNyID0gMS4wIC8gYy0+c3JjX2luY3I7CiAjZW5kaWYKIAotICAgIGluZGV4ICY9IGMtPnBoYXNlX21hc2s7CisgICAgd2hpbGUgKGluZGV4ID49IGMtPnBoYXNlX2NvdW50KSB7CisgICAgICAgIHNhbXBsZV9pbmRleCsrOworICAgICAgICBpbmRleCAtPSBjLT5waGFzZV9jb3VudDsKKyAgICB9CisKICAgICBmb3IgKGRzdF9pbmRleCA9IDA7IGRzdF9pbmRleCA8IG47IGRzdF9pbmRleCsrKSB7CiAgICAgICAgIEZFTEVNICpmaWx0ZXIgPSAoKEZFTEVNICopIGMtPmZpbHRlcl9iYW5rKSArIGMtPmZpbHRlcl9hbGxvYyAqIGluZGV4OwotICAgICAgICBGRUxFTTIgdmFsPTAsIHYyID0gMDsKKyAgICAgICAgRkVMRU0yIHZhbCA9IEZPRkZTRVQsIHYyID0gRk9GRlNFVDsKIAogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpID0gMDsgaSA8IGMtPmZpbHRlcl9sZW5ndGg7IGkrKykgewpAQCAtMTY0LDggKzE4NSwxMSBAQAogICAgICAgICAgICAgZnJhYyAtPSBjLT5zcmNfaW5jcjsKICAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgIH0KLSAgICAgICAgc2FtcGxlX2luZGV4ICs9IGluZGV4ID4+IGMtPnBoYXNlX3NoaWZ0OwotICAgICAgICBpbmRleCAmPSBjLT5waGFzZV9tYXNrOworCisgICAgICAgIHdoaWxlIChpbmRleCA+PSBjLT5waGFzZV9jb3VudCkgeworICAgICAgICAgICAgc2FtcGxlX2luZGV4Kys7CisgICAgICAgICAgICBpbmRleCAtPSBjLT5waGFzZV9jb3VudDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmKHVwZGF0ZV9jdHgpewpAQCAtMTg1LDMgKzIwOSw0IEBACiAjdW5kZWYgRkVMRU1fTUFYCiAjdW5kZWYgRkVMRU1fTUlOCiAjdW5kZWYgT1VUCisjdW5kZWYgRk9GRlNFVApkaWZmIC0tZ2l0IGEvbGlic3dyZXNhbXBsZS9zb3hyX3Jlc2FtcGxlLmMgYi9saWJzd3Jlc2FtcGxlL3NveHJfcmVzYW1wbGUuYwppbmRleCA4MDdmNTA4Li44MTgxYzc0IDEwMDY0NAotLS0gYS9saWJzd3Jlc2FtcGxlL3NveHJfcmVzYW1wbGUuYworKysgYi9saWJzd3Jlc2FtcGxlL3NveHJfcmVzYW1wbGUuYwpAQCAtMzAsNyArMzAsNyBAQAogI2luY2x1ZGUgPHNveHIuaD4KIAogc3RhdGljIHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmNyZWF0ZShzdHJ1Y3QgUmVzYW1wbGVDb250ZXh0ICpjLCBpbnQgb3V0X3JhdGUsIGludCBpbl9yYXRlLCBpbnQgZmlsdGVyX3NpemUsIGludCBwaGFzZV9zaGlmdCwgaW50IGxpbmVhciwKLSAgICAgICAgZG91YmxlIGN1dG9mZiwgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQsIGVudW0gU3dyRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZSwgZG91YmxlIGthaXNlcl9iZXRhLCBkb3VibGUgcHJlY2lzaW9uLCBpbnQgY2hlYnkpeworICAgICAgICBkb3VibGUgY3V0b2ZmLCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZvcm1hdCwgZW51bSBTd3JGaWx0ZXJUeXBlIGZpbHRlcl90eXBlLCBkb3VibGUga2Fpc2VyX2JldGEsIGRvdWJsZSBwcmVjaXNpb24sIGludCBjaGVieSwgaW50IGV4YWN0X3JhdGlvbmFsKXsKICAgICBzb3hyX2Vycm9yX3QgZXJyb3I7CiAKICAgICBzb3hyX2RhdGF0eXBlX3QgdHlwZSA9CkBAIC00Niw3ICs0Niw3IEBACiAgICAgc294cl9pb19zcGVjX3QgaW9fc3BlYyA9IHNveHJfaW9fc3BlYyh0eXBlLCB0eXBlKTsKIAogICAgIHNveHJfcXVhbGl0eV9zcGVjX3QgcV9zcGVjID0gc294cl9xdWFsaXR5X3NwZWMoKGludCkoKHByZWNpc2lvbi0yKS80KSwgKFNPWFJfSElfUFJFQ19DTE9DS3xTT1hSX1JPTExPRkZfTk9ORSkqISFjaGVieSk7Ci0gICAgcV9zcGVjLnByZWNpc2lvbiA9IGxpbmVhcj8gMCA6IHByZWNpc2lvbjsKKyAgICBxX3NwZWMucHJlY2lzaW9uID0gcHJlY2lzaW9uOwogI2lmICFkZWZpbmVkIFNPWFJfVkVSU0lPTiAvKiBEZXByZWNhdGVkIEAgTWFyY2ggMjAxMzogKi8KICAgICBxX3NwZWMuYndfcGMgPSBjdXRvZmY/IEZGTUFYKEZGTUlOKGN1dG9mZiwuOTk1KSwuOCkqMTAwIDogcV9zcGVjLmJ3X3BjOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS10ZXN0LmMgYi9saWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE0N2M4Li4wMDAwMDAwCi0tLSBhL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMS0yMDEyIE1pY2hhZWwgTmllZGVybWF5ZXIgKG1pY2hhZWxuaUBnbXguYXQpCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgRmFicmljZSBCZWxsYXJkCi0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgbGlic3dyZXNhbXBsZQotICoKLSAqIGxpYnN3cmVzYW1wbGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCi0gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIGxpYnN3cmVzYW1wbGUgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIGxpYnN3cmVzYW1wbGU7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0LmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKLSNpbmNsdWRlICJzd3Jlc2FtcGxlLmgiCi0KLSN1bmRlZiB0aW1lCi0jaW5jbHVkZSAidGltZS5oIgotI3VuZGVmIGZwcmludGYKLQotI2RlZmluZSBTQU1QTEVTIDEwMDAKLQotI2RlZmluZSBTV1JfQ0hfTUFYIDMyCi0KLSNkZWZpbmUgQVNTRVJUX0xFVkVMIDIKLQotc3RhdGljIGRvdWJsZSBnZXQodWludDhfdCAqYVtdLCBpbnQgY2gsIGludCBpbmRleCwgaW50IGNoX2NvdW50LCBlbnVtIEFWU2FtcGxlRm9ybWF0IGYpewotICAgIGNvbnN0IHVpbnQ4X3QgKnA7Ci0gICAgaWYoYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZikpewotICAgICAgICBmPSBhdl9nZXRfYWx0X3NhbXBsZV9mbXQoZiwgMCk7Ci0gICAgICAgIHA9IGFbY2hdOwotICAgIH1lbHNlewotICAgICAgICBwPSBhWzBdOwotICAgICAgICBpbmRleD0gY2ggKyBpbmRleCpjaF9jb3VudDsKLSAgICB9Ci0KLSAgICBzd2l0Y2goZil7Ci0gICAgY2FzZSBBVl9TQU1QTEVfRk1UX1U4IDogcmV0dXJuICgoY29uc3QgdWludDhfdCopcClbaW5kZXhdLzEyNy4wLTEuMDsKLSAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzE2OiByZXR1cm4gKChjb25zdCBpbnQxNl90KilwKVtpbmRleF0vMzI3NjcuMDsKLSAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOiByZXR1cm4gKChjb25zdCBpbnQzMl90KilwKVtpbmRleF0vMjE0NzQ4MzY0Ny4wOwotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6IHJldHVybiAoKGNvbnN0IGZsb2F0ICAqKXApW2luZGV4XTsKLSAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMOiByZXR1cm4gKChjb25zdCBkb3VibGUgKilwKVtpbmRleF07Ci0gICAgZGVmYXVsdDogYXZfYXNzZXJ0MCgwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkICBzZXQodWludDhfdCAqYVtdLCBpbnQgY2gsIGludCBpbmRleCwgaW50IGNoX2NvdW50LCBlbnVtIEFWU2FtcGxlRm9ybWF0IGYsIGRvdWJsZSB2KXsKLSAgICB1aW50OF90ICpwOwotICAgIGlmKGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGYpKXsKLSAgICAgICAgZj0gYXZfZ2V0X2FsdF9zYW1wbGVfZm10KGYsIDApOwotICAgICAgICBwPSBhW2NoXTsKLSAgICB9ZWxzZXsKLSAgICAgICAgcD0gYVswXTsKLSAgICAgICAgaW5kZXg9IGNoICsgaW5kZXgqY2hfY291bnQ7Ci0gICAgfQotICAgIHN3aXRjaChmKXsKLSAgICBjYXNlIEFWX1NBTVBMRV9GTVRfVTggOiAoKHVpbnQ4X3QqKXApW2luZGV4XT0gYXZfY2xpcF91aW50OCAobHJpbnQoKHYrMS4wKSoxMjcpKTsgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6ICgoaW50MTZfdCopcClbaW5kZXhdPSBhdl9jbGlwX2ludDE2IChscmludCh2KjMyNzY3KSk7ICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MzMjogKChpbnQzMl90KilwKVtpbmRleF09IGF2X2NsaXBsX2ludDMyKGxscmludCh2KjIxNDc0ODM2NDcpKTsgICBicmVhazsKLSAgICBjYXNlIEFWX1NBTVBMRV9GTVRfRkxUOiAoKGZsb2F0ICAqKXApW2luZGV4XT0gdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkw6ICgoZG91YmxlICopcClbaW5kZXhdPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogYXZfYXNzZXJ0MigwKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNoaWZ0KHVpbnQ4X3QgKmFbXSwgaW50IGluZGV4LCBpbnQgY2hfY291bnQsIGVudW0gQVZTYW1wbGVGb3JtYXQgZil7Ci0gICAgaW50IGNoOwotCi0gICAgaWYoYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZikpewotICAgICAgICBmPSBhdl9nZXRfYWx0X3NhbXBsZV9mbXQoZiwgMCk7Ci0gICAgICAgIGZvcihjaD0gMDsgY2g8Y2hfY291bnQ7IGNoKyspCi0gICAgICAgICAgICBhW2NoXSArPSBpbmRleCphdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShmKTsKLSAgICB9ZWxzZXsKLSAgICAgICAgYVswXSArPSBpbmRleCpjaF9jb3VudCphdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShmKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZvcm1hdHNbXSA9IHsKLSAgICBBVl9TQU1QTEVfRk1UX1MxNiwKLSAgICBBVl9TQU1QTEVfRk1UX0ZMVFAsCi0gICAgQVZfU0FNUExFX0ZNVF9TMTZQLAotICAgIEFWX1NBTVBMRV9GTVRfRkxULAotICAgIEFWX1NBTVBMRV9GTVRfUzMyUCwKLSAgICBBVl9TQU1QTEVfRk1UX1MzMiwKLSAgICBBVl9TQU1QTEVfRk1UX1U4UCwKLSAgICBBVl9TQU1QTEVfRk1UX1U4LAotICAgIEFWX1NBTVBMRV9GTVRfREJMUCwKLSAgICBBVl9TQU1QTEVfRk1UX0RCTCwKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgcmF0ZXNbXSA9IHsKLSAgICA4MDAwLAotICAgIDExMDI1LAotICAgIDE2MDAwLAotICAgIDIyMDUwLAotICAgIDMyMDAwLAotICAgIDQ4MDAwLAotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQ2NF90IGxheW91dHNbXT17Ci0gICAgQVZfQ0hfTEFZT1VUX01PTk8gICAgICAgICAgICAgICAgICAgICwKLSAgICBBVl9DSF9MQVlPVVRfU1RFUkVPICAgICAgICAgICAgICAgICAgLAotICAgIEFWX0NIX0xBWU9VVF8yXzEgICAgICAgICAgICAgICAgICAgICAsCi0gICAgQVZfQ0hfTEFZT1VUX1NVUlJPVU5EICAgICAgICAgICAgICAgICwKLSAgICBBVl9DSF9MQVlPVVRfNFBPSU5UMCAgICAgICAgICAgICAgICAgLAotICAgIEFWX0NIX0xBWU9VVF8yXzIgICAgICAgICAgICAgICAgICAgICAsCi0gICAgQVZfQ0hfTEFZT1VUX1FVQUQgICAgICAgICAgICAgICAgICAgICwKLSAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMCAgICAgICAgICAgICAgICAgLAotICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxICAgICAgICAgICAgICAgICAsCi0gICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDBfQkFDSyAgICAgICAgICAgICwKLSAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMV9CQUNLICAgICAgICAgICAgLAotICAgIEFWX0NIX0xBWU9VVF83UE9JTlQwICAgICAgICAgICAgICAgICAsCi0gICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDEgICAgICAgICAgICAgICAgICwKLSAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMV9XSURFICAgICAgICAgICAgLAotfTsKLQotc3RhdGljIHZvaWQgc2V0dXBfYXJyYXkodWludDhfdCAqb3V0W1NXUl9DSF9NQVhdLCB1aW50OF90ICppbiwgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQsIGludCBzYW1wbGVzKXsKLSAgICBpZihhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihmb3JtYXQpKXsKLSAgICAgICAgaW50IGk7Ci0gICAgICAgIGludCBwbGFuZV9zaXplPSBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQmMHhGRikqc2FtcGxlczsKLSAgICAgICAgZm9ybWF0Jj0weEZGOwotICAgICAgICBmb3IoaT0wOyBpPFNXUl9DSF9NQVg7IGkrKyl7Ci0gICAgICAgICAgICBvdXRbaV09IGluICsgaSpwbGFuZV9zaXplOwotICAgICAgICB9Ci0gICAgfWVsc2V7Ci0gICAgICAgIG91dFswXT0gaW47Ci0gICAgfQotfQotCi1zdGF0aWMgaW50IGNtcChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKXsKLSAgICByZXR1cm4gKihjb25zdCBpbnQgKilhIC0gKihjb25zdCBpbnQgKiliOwotfQotCi1zdGF0aWMgdm9pZCBhdWRpb2dlbih2b2lkICpkYXRhLCBlbnVtIEFWU2FtcGxlRm9ybWF0IHNhbXBsZV9mbXQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCBzYW1wbGVfcmF0ZSwgaW50IG5iX3NhbXBsZXMpCi17Ci0gICAgaW50IGksIGNoLCBrOwotICAgIGRvdWJsZSB2LCBmLCBhLCBhbXBhOwotICAgIGRvdWJsZSB0YWJmMVtTV1JfQ0hfTUFYXTsKLSAgICBkb3VibGUgdGFiZjJbU1dSX0NIX01BWF07Ci0gICAgZG91YmxlIHRhYmFbU1dSX0NIX01BWF07Ci0gICAgdW5zaWduZWQgc3RhdGljIHJuZDsKLQotI2RlZmluZSBQVVRfU0FNUExFIHNldChkYXRhLCBjaCwgaywgY2hhbm5lbHMsIHNhbXBsZV9mbXQsIHYpOwotI2RlZmluZSB1aW50X3JhbmQoeCkgKCh4KSA9ICh4KSAqIDE2NjQ1MjUgKyAxMDEzOTA0MjIzKQotI2RlZmluZSBkYmxfcmFuZCh4KSAodWludF9yYW5kKHgpKjIuMCAvIChkb3VibGUpVUlOVF9NQVggLSAxKQotICAgIGsgPSAwOwotCi0gICAgLyogMSBzZWNvbmQgb2Ygc2luZ2xlIGZyZXEgc2ludXMgYXQgMTAwMCBIeiAqLwotICAgIGEgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCAxICogc2FtcGxlX3JhdGUgJiYgayA8IG5iX3NhbXBsZXM7IGkrKywgaysrKSB7Ci0gICAgICAgIHYgPSBzaW4oYSkgKiAwLjMwOwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKLSAgICAgICAgICAgIFBVVF9TQU1QTEUKLSAgICAgICAgYSArPSBNX1BJICogMTAwMC4wICogMi4wIC8gc2FtcGxlX3JhdGU7Ci0gICAgfQotCi0gICAgLyogMSBzZWNvbmQgb2YgdmFyeWluZyBmcmVxdWVuY3kgYmV0d2VlbiAxMDAgYW5kIDEwMDAwIEh6ICovCi0gICAgYSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IDEgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKLSAgICAgICAgdiA9IHNpbihhKSAqIDAuMzA7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgUFVUX1NBTVBMRQotICAgICAgICBmICA9IDEwMC4wICsgKCgoMTAwMDAuMCAtIDEwMC4wKSAqIGkpIC8gc2FtcGxlX3JhdGUpOwotICAgICAgICBhICs9IE1fUEkgKiBmICogMi4wIC8gc2FtcGxlX3JhdGU7Ci0gICAgfQotCi0gICAgLyogMC41IHNlY29uZCBvZiBsb3cgYW1wbGl0dWRlIHdoaXRlIG5vaXNlICovCi0gICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZV9yYXRlIC8gMiAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKLSAgICAgICAgdiA9IGRibF9yYW5kKHJuZCkgKiAwLjMwOwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykKLSAgICAgICAgICAgIFBVVF9TQU1QTEUKLSAgICB9Ci0KLSAgICAvKiAwLjUgc2Vjb25kIG9mIGhpZ2ggYW1wbGl0dWRlIHdoaXRlIG5vaXNlICovCi0gICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZV9yYXRlIC8gMiAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKLSAgICAgICAgdiA9IGRibF9yYW5kKHJuZCk7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQotICAgICAgICAgICAgUFVUX1NBTVBMRQotICAgIH0KLQotICAgIC8qIDEgc2Vjb25kIG9mIHVucmVsYXRlZCByYW1wcyBmb3IgZWFjaCBjaGFubmVsICovCi0gICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKLSAgICAgICAgdGFiYVtjaF0gID0gMDsKLSAgICAgICAgdGFiZjFbY2hdID0gMTAwICsgdWludF9yYW5kKHJuZCkgJSA1MDAwOwotICAgICAgICB0YWJmMltjaF0gPSAxMDAgKyB1aW50X3JhbmQocm5kKSAlIDUwMDA7Ci0gICAgfQotICAgIGZvciAoaSA9IDA7IGkgPCAxICogc2FtcGxlX3JhdGUgJiYgayA8IG5iX3NhbXBsZXM7IGkrKywgaysrKSB7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICB2ID0gc2luKHRhYmFbY2hdKSAqIDAuMzA7Ci0gICAgICAgICAgICBQVVRfU0FNUExFCi0gICAgICAgICAgICBmID0gdGFiZjFbY2hdICsgKCgodGFiZjJbY2hdIC0gdGFiZjFbY2hdKSAqIGkpIC8gc2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgdGFiYVtjaF0gKz0gTV9QSSAqIGYgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIDIgc2Vjb25kcyBvZiA1MDAgSHogd2l0aCB2YXJ5aW5nIHZvbHVtZSAqLwotICAgIGEgICAgPSAwOwotICAgIGFtcGEgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCAyICogc2FtcGxlX3JhdGUgJiYgayA8IG5iX3NhbXBsZXM7IGkrKywgaysrKSB7Ci0gICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKSB7Ci0gICAgICAgICAgICBkb3VibGUgYW1wID0gKDEuMCArIHNpbihhbXBhKSkgKiAwLjE1OwotICAgICAgICAgICAgaWYgKGNoICYgMSkKLSAgICAgICAgICAgICAgICBhbXAgPSAwLjMwIC0gYW1wOwotICAgICAgICAgICAgdiA9IHNpbihhKSAqIGFtcDsKLSAgICAgICAgICAgIFBVVF9TQU1QTEUKLSAgICAgICAgICAgIGEgICAgKz0gTV9QSSAqIDUwMC4wICogMi4wIC8gc2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBhbXBhICs9IE1fUEkgKiAgMi4wIC8gc2FtcGxlX3JhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndil7Ci0gICAgaW50IGluX3NhbXBsZV9yYXRlLCBvdXRfc2FtcGxlX3JhdGUsIGNoICxpLCBmbHVzaF9jb3VudDsKLSAgICB1aW50NjRfdCBpbl9jaF9sYXlvdXQsIG91dF9jaF9sYXlvdXQ7Ci0gICAgZW51bSBBVlNhbXBsZUZvcm1hdCBpbl9zYW1wbGVfZm10LCBvdXRfc2FtcGxlX2ZtdDsKLSAgICB1aW50OF90IGFycmF5X2luW1NBTVBMRVMqOCo4XTsKLSAgICB1aW50OF90IGFycmF5X21pZFtTQU1QTEVTKjgqOCozXTsKLSAgICB1aW50OF90IGFycmF5X291dFtTQU1QTEVTKjgqOCsxMDBdOwotICAgIHVpbnQ4X3QgKmFpbltTV1JfQ0hfTUFYXTsKLSAgICB1aW50OF90ICphb3V0W1NXUl9DSF9NQVhdOwotICAgIHVpbnQ4X3QgKmFtaWRbU1dSX0NIX01BWF07Ci0gICAgaW50IGZsdXNoX2k9MDsKLSAgICBpbnQgbW9kZTsKLSAgICBpbnQgbnVtX3Rlc3RzID0gMTAwMDA7Ci0gICAgdWludDMyX3Qgc2VlZCA9IDA7Ci0gICAgdWludDMyX3QgcmFuZF9zZWVkID0gMDsKLSAgICBpbnQgcmVtYWluaW5nX3Rlc3RzW0ZGX0FSUkFZX0VMRU1TKHJhdGVzKSAqIEZGX0FSUkFZX0VMRU1TKGxheW91dHMpICogRkZfQVJSQVlfRUxFTVMoZm9ybWF0cykgKiBGRl9BUlJBWV9FTEVNUyhsYXlvdXRzKSAqIEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpXTsKLSAgICBpbnQgbWF4X3Rlc3RzID0gRkZfQVJSQVlfRUxFTVMocmVtYWluaW5nX3Rlc3RzKTsKLSAgICBpbnQgdGVzdDsKLSAgICBpbnQgc3BlY2lmaWNfdGVzdD0gLTE7Ci0KLSAgICBzdHJ1Y3QgU3dyQ29udGV4dCAqIGZvcndfY3R4PSBOVUxMOwotICAgIHN0cnVjdCBTd3JDb250ZXh0ICpiYWNrd19jdHg9IE5VTEw7Ci0KLSAgICBpZiAoYXJnYyA+IDEpIHsKLSAgICAgICAgaWYgKCFzdHJjbXAoYXJndlsxXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikpIHsKLSAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIlVzYWdlOiBzd3Jlc2FtcGxlLXRlc3QgWzxudW1fdGVzdHM+WyA8dGVzdD5dXSAgXG4iCi0gICAgICAgICAgICAgICAgICAgIm51bV90ZXN0cyAgICAgICAgICAgRGVmYXVsdCBpcyAlZFxuIiwgbnVtX3Rlc3RzKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG51bV90ZXN0cyA9IHN0cnRvbChhcmd2WzFdLCBOVUxMLCAwKTsKLSAgICAgICAgaWYobnVtX3Rlc3RzIDwgMCkgewotICAgICAgICAgICAgbnVtX3Rlc3RzID0gLW51bV90ZXN0czsKLSAgICAgICAgICAgIHJhbmRfc2VlZCA9IHRpbWUoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYobnVtX3Rlc3RzPD0gMCB8fCBudW1fdGVzdHM+bWF4X3Rlc3RzKQotICAgICAgICAgICAgbnVtX3Rlc3RzID0gbWF4X3Rlc3RzOwotICAgICAgICBpZihhcmdjID4gMikgewotICAgICAgICAgICAgc3BlY2lmaWNfdGVzdCA9IHN0cnRvbChhcmd2WzFdLCBOVUxMLCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvcihpPTA7IGk8bWF4X3Rlc3RzOyBpKyspCi0gICAgICAgIHJlbWFpbmluZ190ZXN0c1tpXSA9IGk7Ci0KLSAgICBmb3IodGVzdD0wOyB0ZXN0PG51bV90ZXN0czsgdGVzdCsrKXsKLSAgICAgICAgdW5zaWduZWQgcjsKLSAgICAgICAgdWludF9yYW5kKHNlZWQpOwotICAgICAgICByID0gKHNlZWQgKiAodWludDY0X3QpKG1heF90ZXN0cyAtIHRlc3QpKSA+PjMyOwotICAgICAgICBGRlNXQVAoaW50LCByZW1haW5pbmdfdGVzdHNbcl0sIHJlbWFpbmluZ190ZXN0c1ttYXhfdGVzdHMgLSB0ZXN0IC0gMV0pOwotICAgIH0KLSAgICBxc29ydChyZW1haW5pbmdfdGVzdHMgKyBtYXhfdGVzdHMgLSBudW1fdGVzdHMsIG51bV90ZXN0cywgc2l6ZW9mKHJlbWFpbmluZ190ZXN0c1swXSksIGNtcCk7Ci0gICAgaW5fc2FtcGxlX3JhdGU9MTYwMDA7Ci0gICAgZm9yKHRlc3Q9MDsgdGVzdDxudW1fdGVzdHM7IHRlc3QrKyl7Ci0gICAgICAgIGNoYXIgIGluX2xheW91dF9zdHJpbmdbMjU2XTsKLSAgICAgICAgY2hhciBvdXRfbGF5b3V0X3N0cmluZ1syNTZdOwotICAgICAgICB1bnNpZ25lZCB2ZWN0b3I9IHJlbWFpbmluZ190ZXN0c1ttYXhfdGVzdHMgLSB0ZXN0IC0gMV07Ci0gICAgICAgIGludCBpbl9jaF9jb3VudDsKLSAgICAgICAgaW50IG91dF9jb3VudCwgbWlkX2NvdW50LCBvdXRfY2hfY291bnQ7Ci0KLSAgICAgICAgaW5fY2hfbGF5b3V0ICAgID0gbGF5b3V0c1t2ZWN0b3IgJSBGRl9BUlJBWV9FTEVNUyhsYXlvdXRzKV07IHZlY3RvciAvPSBGRl9BUlJBWV9FTEVNUyhsYXlvdXRzKTsKLSAgICAgICAgb3V0X2NoX2xheW91dCAgID0gbGF5b3V0c1t2ZWN0b3IgJSBGRl9BUlJBWV9FTEVNUyhsYXlvdXRzKV07IHZlY3RvciAvPSBGRl9BUlJBWV9FTEVNUyhsYXlvdXRzKTsKLSAgICAgICAgaW5fc2FtcGxlX2ZtdCAgID0gZm9ybWF0c1t2ZWN0b3IgJSBGRl9BUlJBWV9FTEVNUyhmb3JtYXRzKV07IHZlY3RvciAvPSBGRl9BUlJBWV9FTEVNUyhmb3JtYXRzKTsKLSAgICAgICAgb3V0X3NhbXBsZV9mbXQgID0gZm9ybWF0c1t2ZWN0b3IgJSBGRl9BUlJBWV9FTEVNUyhmb3JtYXRzKV07IHZlY3RvciAvPSBGRl9BUlJBWV9FTEVNUyhmb3JtYXRzKTsKLSAgICAgICAgb3V0X3NhbXBsZV9yYXRlID0gcmF0ZXMgIFt2ZWN0b3IgJSBGRl9BUlJBWV9FTEVNUyhyYXRlcyAgKV07IHZlY3RvciAvPSBGRl9BUlJBWV9FTEVNUyhyYXRlcyk7Ci0gICAgICAgIGF2X2Fzc2VydDAoIXZlY3Rvcik7Ci0KLSAgICAgICAgaWYoc3BlY2lmaWNfdGVzdCA9PSAwKXsKLSAgICAgICAgICAgIGlmKG91dF9zYW1wbGVfcmF0ZSAhPSBpbl9zYW1wbGVfcmF0ZSB8fCBpbl9jaF9sYXlvdXQgIT0gb3V0X2NoX2xheW91dCkKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGluX2NoX2NvdW50PSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMoaW5fY2hfbGF5b3V0KTsKLSAgICAgICAgb3V0X2NoX2NvdW50PSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMob3V0X2NoX2xheW91dCk7Ci0gICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcoIGluX2xheW91dF9zdHJpbmcsIHNpemVvZiggaW5fbGF5b3V0X3N0cmluZyksICBpbl9jaF9jb3VudCwgIGluX2NoX2xheW91dCk7Ci0gICAgICAgIGF2X2dldF9jaGFubmVsX2xheW91dF9zdHJpbmcob3V0X2xheW91dF9zdHJpbmcsIHNpemVvZihvdXRfbGF5b3V0X3N0cmluZyksIG91dF9jaF9jb3VudCwgb3V0X2NoX2xheW91dCk7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVEVTVDogJXMtPiVzLCByYXRlOiU1ZC0+JTVkLCBmbXQ6JXMtPiVzXG4iLAotICAgICAgICAgICAgICAgIGluX2xheW91dF9zdHJpbmcsIG91dF9sYXlvdXRfc3RyaW5nLAotICAgICAgICAgICAgICAgIGluX3NhbXBsZV9yYXRlLCBvdXRfc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShpbl9zYW1wbGVfZm10KSwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShvdXRfc2FtcGxlX2ZtdCkpOwotICAgICAgICBmb3J3X2N0eCAgPSBzd3JfYWxsb2Nfc2V0X29wdHMoZm9yd19jdHgsIG91dF9jaF9sYXlvdXQsIG91dF9zYW1wbGVfZm10LCAgb3V0X3NhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2NoX2xheW91dCwgIGluX3NhbXBsZV9mbXQsICBpbl9zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKLSAgICAgICAgYmFja3dfY3R4ID0gc3dyX2FsbG9jX3NldF9vcHRzKGJhY2t3X2N0eCwgaW5fY2hfbGF5b3V0LCAgaW5fc2FtcGxlX2ZtdCwgICAgICAgICAgICAgaW5fc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2NoX2xheW91dCwgb3V0X3NhbXBsZV9mbXQsIG91dF9zYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKLSAgICAgICAgaWYoIWZvcndfY3R4KSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBpbml0IGZvcndfY3RzXG4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmKCFiYWNrd19jdHgpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXQgYmFja3dfY3R4XG4iKTsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1aW50X3JhbmQocmFuZF9zZWVkKSAlIDMgPT0gMCkKLSAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KGZvcndfY3R4LCAiaWNoIiwgMCwgMCk7Ci0gICAgICAgIGlmICh1aW50X3JhbmQocmFuZF9zZWVkKSAlIDMgPT0gMCkKLSAgICAgICAgICAgIGF2X29wdF9zZXRfaW50KGZvcndfY3R4LCAib2NoIiwgMCwgMCk7Ci0KLSAgICAgICAgaWYoc3dyX2luaXQoIGZvcndfY3R4KSA8IDApCi0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInN3cl9pbml0KC0+KSBmYWlsZWRcbiIpOwotICAgICAgICBpZihzd3JfaW5pdChiYWNrd19jdHgpIDwgMCkKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3dyX2luaXQoPC0pIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgLy9GSVhNRSB0ZXN0IHBsYW5hcgotICAgICAgICBzZXR1cF9hcnJheShhaW4gLCBhcnJheV9pbiAsICBpbl9zYW1wbGVfZm10LCAgIFNBTVBMRVMpOwotICAgICAgICBzZXR1cF9hcnJheShhbWlkLCBhcnJheV9taWQsIG91dF9zYW1wbGVfZm10LCAzKlNBTVBMRVMpOwotICAgICAgICBzZXR1cF9hcnJheShhb3V0LCBhcnJheV9vdXQsICBpbl9zYW1wbGVfZm10ICAgICAgICAgICAsICAgU0FNUExFUyk7Ci0jaWYgMAotICAgICAgICBmb3IoY2g9MDsgY2g8aW5fY2hfY291bnQ7IGNoKyspewotICAgICAgICAgICAgZm9yKGk9MDsgaTxTQU1QTEVTOyBpKyspCi0gICAgICAgICAgICAgICAgc2V0KGFpbiwgY2gsIGksIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10LCBzaW4oaSppKjMvU0FNUExFUykpOwotICAgICAgICB9Ci0jZWxzZQotICAgICAgICBhdWRpb2dlbihhaW4sIGluX3NhbXBsZV9mbXQsIGluX2NoX2NvdW50LCBTQU1QTEVTLzYrMSwgU0FNUExFUyk7Ci0jZW5kaWYKLSAgICAgICAgbW9kZSA9IHVpbnRfcmFuZChyYW5kX3NlZWQpICUgMzsKLSAgICAgICAgaWYobW9kZT09MCAvKnx8IG91dF9zYW1wbGVfcmF0ZSA9PSBpbl9zYW1wbGVfcmF0ZSovKSB7Ci0gICAgICAgICAgICBtaWRfY291bnQ9IHN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAzKlNBTVBMRVMsIChjb25zdCB1aW50OF90ICoqKWFpbiwgU0FNUExFUyk7Ci0gICAgICAgIH0gZWxzZSBpZihtb2RlPT0xKXsKLSAgICAgICAgICAgIG1pZF9jb3VudD0gc3dyX2NvbnZlcnQoZm9yd19jdHgsIGFtaWQsICAgICAgICAgMCwgKGNvbnN0IHVpbnQ4X3QgKiopYWluLCBTQU1QTEVTKTsKLSAgICAgICAgICAgIG1pZF9jb3VudCs9c3dyX2NvbnZlcnQoZm9yd19jdHgsIGFtaWQsIDMqU0FNUExFUywgKGNvbnN0IHVpbnQ4X3QgKiopYWluLCAgICAgICAwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludCB0bXBfY291bnQ7Ci0gICAgICAgICAgICBtaWRfY291bnQ9IHN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAgICAgICAgIDAsIChjb25zdCB1aW50OF90ICoqKWFpbiwgICAgICAgMSk7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKG1pZF9jb3VudD09MCk7Ci0gICAgICAgICAgICBzaGlmdChhaW4sICAxLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7Ci0gICAgICAgICAgICBtaWRfY291bnQrPXN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAzKlNBTVBMRVMsIChjb25zdCB1aW50OF90ICoqKWFpbiwgICAgICAgMCk7Ci0gICAgICAgICAgICBzaGlmdChhbWlkLCAgbWlkX2NvdW50LCBvdXRfY2hfY291bnQsIG91dF9zYW1wbGVfZm10KTsgdG1wX2NvdW50ID0gbWlkX2NvdW50OwotICAgICAgICAgICAgbWlkX2NvdW50Kz1zd3JfY29udmVydChmb3J3X2N0eCwgYW1pZCwgICAgICAgICAyLCAoY29uc3QgdWludDhfdCAqKilhaW4sICAgICAgIDIpOwotICAgICAgICAgICAgc2hpZnQoYW1pZCwgIG1pZF9jb3VudC10bXBfY291bnQsIG91dF9jaF9jb3VudCwgb3V0X3NhbXBsZV9mbXQpOyB0bXBfY291bnQgPSBtaWRfY291bnQ7Ci0gICAgICAgICAgICBzaGlmdChhaW4sICAyLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7Ci0gICAgICAgICAgICBtaWRfY291bnQrPXN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAgICAgICAgIDEsIChjb25zdCB1aW50OF90ICoqKWFpbiwgU0FNUExFUy0zKTsKLSAgICAgICAgICAgIHNoaWZ0KGFtaWQsICBtaWRfY291bnQtdG1wX2NvdW50LCBvdXRfY2hfY291bnQsIG91dF9zYW1wbGVfZm10KTsgdG1wX2NvdW50ID0gbWlkX2NvdW50OwotICAgICAgICAgICAgc2hpZnQoYWluLCAtMywgaW5fY2hfY291bnQsIGluX3NhbXBsZV9mbXQpOwotICAgICAgICAgICAgbWlkX2NvdW50Kz1zd3JfY29udmVydChmb3J3X2N0eCwgYW1pZCwgMypTQU1QTEVTLCAoY29uc3QgdWludDhfdCAqKilhaW4sICAgICAgIDApOwotICAgICAgICAgICAgc2hpZnQoYW1pZCwgIC10bXBfY291bnQsIG91dF9jaF9jb3VudCwgb3V0X3NhbXBsZV9mbXQpOwotICAgICAgICB9Ci0gICAgICAgIG91dF9jb3VudD0gc3dyX2NvbnZlcnQoYmFja3dfY3R4LGFvdXQsIFNBTVBMRVMsIChjb25zdCB1aW50OF90ICoqKWFtaWQsIG1pZF9jb3VudCk7Ci0KLSAgICAgICAgZm9yKGNoPTA7IGNoPGluX2NoX2NvdW50OyBjaCsrKXsKLSAgICAgICAgICAgIGRvdWJsZSBzc2UsIG1heGRpZmY9MDsKLSAgICAgICAgICAgIGRvdWJsZSBzdW1fYT0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBzdW1fYj0gMDsKLSAgICAgICAgICAgIGRvdWJsZSBzdW1fYWE9IDA7Ci0gICAgICAgICAgICBkb3VibGUgc3VtX2JiPSAwOwotICAgICAgICAgICAgZG91YmxlIHN1bV9hYj0gMDsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8b3V0X2NvdW50OyBpKyspewotICAgICAgICAgICAgICAgIGRvdWJsZSBhPSBnZXQoYWluICwgY2gsIGksIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKLSAgICAgICAgICAgICAgICBkb3VibGUgYj0gZ2V0KGFvdXQsIGNoLCBpLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7Ci0gICAgICAgICAgICAgICAgc3VtX2EgKz0gYTsKLSAgICAgICAgICAgICAgICBzdW1fYiArPSBiOwotICAgICAgICAgICAgICAgIHN1bV9hYSs9IGEqYTsKLSAgICAgICAgICAgICAgICBzdW1fYmIrPSBiKmI7Ci0gICAgICAgICAgICAgICAgc3VtX2FiKz0gYSpiOwotICAgICAgICAgICAgICAgIG1heGRpZmY9IEZGTUFYKG1heGRpZmYsIGZhYnMoYS1iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzc2U9IHN1bV9hYSArIHN1bV9iYiAtIDIqc3VtX2FiOwotICAgICAgICAgICAgaWYoc3NlIDwgMCAmJiBzc2UgPiAtMC4wMDAwMSkgc3NlPTA7IC8vZml4IHJvdW5kaW5nIGVycm9yCi0KLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiW2U6JWYgYzolZiBtYXg6JWZdIGxlbjolNWRcbiIsIG91dF9jb3VudCA/IHNxcnQoc3NlL291dF9jb3VudCkgOiAwLCBzdW1fYWIvKHNxcnQoc3VtX2FhKnN1bV9iYikpLCBtYXhkaWZmLCBvdXRfY291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmx1c2hfaSsrOwotICAgICAgICBmbHVzaF9pJT0yMTsKLSAgICAgICAgZmx1c2hfY291bnQgPSBzd3JfY29udmVydChiYWNrd19jdHgsYW91dCwgZmx1c2hfaSwgMCwgMCk7Ci0gICAgICAgIHNoaWZ0KGFvdXQsICBmbHVzaF9pLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7Ci0gICAgICAgIGZsdXNoX2NvdW50Kz0gc3dyX2NvbnZlcnQoYmFja3dfY3R4LGFvdXQsIFNBTVBMRVMtZmx1c2hfaSwgMCwgMCk7Ci0gICAgICAgIHNoaWZ0KGFvdXQsIC1mbHVzaF9pLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7Ci0gICAgICAgIGlmKGZsdXNoX2NvdW50KXsKLSAgICAgICAgICAgIGZvcihjaD0wOyBjaDxpbl9jaF9jb3VudDsgY2grKyl7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHNzZSwgbWF4ZGlmZj0wOwotICAgICAgICAgICAgICAgIGRvdWJsZSBzdW1fYT0gMDsKLSAgICAgICAgICAgICAgICBkb3VibGUgc3VtX2I9IDA7Ci0gICAgICAgICAgICAgICAgZG91YmxlIHN1bV9hYT0gMDsKLSAgICAgICAgICAgICAgICBkb3VibGUgc3VtX2JiPSAwOwotICAgICAgICAgICAgICAgIGRvdWJsZSBzdW1fYWI9IDA7Ci0gICAgICAgICAgICAgICAgZm9yKGk9MDsgaTxmbHVzaF9jb3VudDsgaSsrKXsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIGE9IGdldChhaW4gLCBjaCwgaStvdXRfY291bnQsIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIGI9IGdldChhb3V0LCBjaCwgaSwgaW5fY2hfY291bnQsIGluX3NhbXBsZV9mbXQpOwotICAgICAgICAgICAgICAgICAgICBzdW1fYSArPSBhOwotICAgICAgICAgICAgICAgICAgICBzdW1fYiArPSBiOwotICAgICAgICAgICAgICAgICAgICBzdW1fYWErPSBhKmE7Ci0gICAgICAgICAgICAgICAgICAgIHN1bV9iYis9IGIqYjsKLSAgICAgICAgICAgICAgICAgICAgc3VtX2FiKz0gYSpiOwotICAgICAgICAgICAgICAgICAgICBtYXhkaWZmPSBGRk1BWChtYXhkaWZmLCBmYWJzKGEtYikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzc2U9IHN1bV9hYSArIHN1bV9iYiAtIDIqc3VtX2FiOwotICAgICAgICAgICAgICAgIGlmKHNzZSA8IDAgJiYgc3NlID4gLTAuMDAwMDEpIHNzZT0wOyAvL2ZpeCByb3VuZGluZyBlcnJvcgotCi0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJbZTolZiBjOiVmIG1heDolZl0gbGVuOiU1ZCBGOiUzZFxuIiwgc3FydChzc2UvZmx1c2hfY291bnQpLCBzdW1fYWIvKHNxcnQoc3VtX2FhKnN1bV9iYikpLCBtYXhkaWZmLCBmbHVzaF9jb3VudCwgZmx1c2hfaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5jIGIvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmMKaW5kZXggOGUyMzg5OS4uNmQyOGU2YSAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmMKKysrIGIvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmMKQEAgLTg0LDkgKzg0LDYgQEAKICAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgImlzciIsIGluX3NhbXBsZV9yYXRlLCAgMCkgPCAwKQogICAgICAgICBnb3RvIGZhaWw7CiAKLSAgICBpZiAoYXZfb3B0X3NldF9pbnQocywgInRzZiIsIEFWX1NBTVBMRV9GTVRfTk9ORSwgICAwKSA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKLQogICAgIGlmIChhdl9vcHRfc2V0X2ludChzLCAiaWNoIiwgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X25iX2NoYW5uZWxzKHMtPiB1c2VyX2luX2NoX2xheW91dCksIDApIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogCkBAIC0xNzYsNiArMTczLDggQEAKIAogICAgIHMtPmludF9zYW1wbGVfZm10PSBzLT51c2VyX2ludF9zYW1wbGVfZm10OwogCisgICAgcy0+ZGl0aGVyLm1ldGhvZCA9IHMtPnVzZXJfZGl0aGVyX21ldGhvZDsKKwogICAgIGlmKGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT4gaW5fY2hfbGF5b3V0KSA+IFNXUl9DSF9NQVgpIHsKICAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19XQVJOSU5HLCAiSW5wdXQgY2hhbm5lbCBsYXlvdXQgMHglIlBSSXg2NCIgaXMgaW52YWxpZCBvciB1bnN1cHBvcnRlZC5cbiIsIHMtPiBpbl9jaF9sYXlvdXQpOwogICAgICAgICBzLT5pbl9jaF9sYXlvdXQgPSAwOwpAQCAtMjEzLDEwICsyMTIsMTAgQEAKICAgICAgICAgICAgICAgICAgcy0+cmVtYXRyaXhfY3VzdG9tOwogCiAgICAgaWYocy0+aW50X3NhbXBsZV9mbXQgPT0gQVZfU0FNUExFX0ZNVF9OT05FKXsKLSAgICAgICAgaWYoICAgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KHMtPiBpbl9zYW1wbGVfZm10KSA8PSBBVl9TQU1QTEVfRk1UX1MxNlAKLSAgICAgICAgICAgJiYgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KHMtPm91dF9zYW1wbGVfZm10KSA8PSBBVl9TQU1QTEVfRk1UX1MxNlApeworICAgICAgICBpZiggICBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzLT4gaW5fc2FtcGxlX2ZtdCkgPD0gMgorICAgICAgICAgICAmJiBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzLT5vdXRfc2FtcGxlX2ZtdCkgPD0gMil7CiAgICAgICAgICAgICBzLT5pbnRfc2FtcGxlX2ZtdD0gQVZfU0FNUExFX0ZNVF9TMTZQOwotICAgICAgICB9ZWxzZSBpZiggICBhdl9nZXRfcGxhbmFyX3NhbXBsZV9mbXQocy0+IGluX3NhbXBsZV9mbXQpIDw9IEFWX1NBTVBMRV9GTVRfUzE2UAorICAgICAgICB9ZWxzZSBpZiggICBhdl9nZXRfYnl0ZXNfcGVyX3NhbXBsZShzLT4gaW5fc2FtcGxlX2ZtdCkgPD0gMgogICAgICAgICAgICAmJiAhcy0+cmVtYXRyaXgKICAgICAgICAgICAgJiYgcy0+b3V0X3NhbXBsZV9yYXRlPT1zLT5pbl9zYW1wbGVfcmF0ZQogICAgICAgICAgICAmJiAhKHMtPmZsYWdzICYgU1dSX0ZMQUdfUkVTQU1QTEUpKXsKQEAgLTIyNCw5ICsyMjMsMTEgQEAKICAgICAgICAgfWVsc2UgaWYoICAgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KHMtPiBpbl9zYW1wbGVfZm10KSA9PSBBVl9TQU1QTEVfRk1UX1MzMlAKICAgICAgICAgICAgICAgICAgJiYgYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KHMtPm91dF9zYW1wbGVfZm10KSA9PSBBVl9TQU1QTEVfRk1UX1MzMlAKICAgICAgICAgICAgICAgICAgJiYgIXMtPnJlbWF0cml4CisgICAgICAgICAgICAgICAgICYmIHMtPm91dF9zYW1wbGVfcmF0ZSA9PSBzLT5pbl9zYW1wbGVfcmF0ZQorICAgICAgICAgICAgICAgICAmJiAhKHMtPmZsYWdzICYgU1dSX0ZMQUdfUkVTQU1QTEUpCiAgICAgICAgICAgICAgICAgICYmIHMtPmVuZ2luZSAhPSBTV1JfRU5HSU5FX1NPWFIpewogICAgICAgICAgICAgcy0+aW50X3NhbXBsZV9mbXQ9IEFWX1NBTVBMRV9GTVRfUzMyUDsKLSAgICAgICAgfWVsc2UgaWYoYXZfZ2V0X3BsYW5hcl9zYW1wbGVfZm10KHMtPmluX3NhbXBsZV9mbXQpIDw9IEFWX1NBTVBMRV9GTVRfRkxUUCl7CisgICAgICAgIH1lbHNlIGlmKGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKHMtPmluX3NhbXBsZV9mbXQpIDw9IDQpewogICAgICAgICAgICAgcy0+aW50X3NhbXBsZV9mbXQ9IEFWX1NBTVBMRV9GTVRfRkxUUDsKICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICBzLT5pbnRfc2FtcGxlX2ZtdD0gQVZfU0FNUExFX0ZNVF9EQkxQOwpAQCAtMjM2LDkgKzIzNywxMCBAQAogCiAgICAgaWYoICAgcy0+aW50X3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9TMTZQCiAgICAgICAgICYmcy0+aW50X3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9TMzJQCisgICAgICAgICYmcy0+aW50X3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9TNjRQCiAgICAgICAgICYmcy0+aW50X3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9GTFRQCiAgICAgICAgICYmcy0+aW50X3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9EQkxQKXsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJlcXVlc3RlZCBzYW1wbGUgZm9ybWF0ICVzIGlzIG5vdCBzdXBwb3J0ZWQgaW50ZXJuYWxseSwgUzE2L1MzMi9GTFQvREJMIGlzIHN1cHBvcnRlZFxuIiwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShzLT5pbnRfc2FtcGxlX2ZtdCkpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVxdWVzdGVkIHNhbXBsZSBmb3JtYXQgJXMgaXMgbm90IHN1cHBvcnRlZCBpbnRlcm5hbGx5LCBzMTZwL3MzMnAvczY0cC9mbHRwL2RibHAgYXJlIHN1cHBvcnRlZFxuIiwgYXZfZ2V0X3NhbXBsZV9mbXRfbmFtZShzLT5pbnRfc2FtcGxlX2ZtdCkpOwogICAgICAgICByZXR1cm4gQVZFUlJPUihFSU5WQUwpOwogICAgIH0KIApAQCAtMjYyLDcgKzI2NCw3IEBACiAgICAgfQogCiAgICAgaWYgKHMtPm91dF9zYW1wbGVfcmF0ZSE9cy0+aW5fc2FtcGxlX3JhdGUgfHwgKHMtPmZsYWdzICYgU1dSX0ZMQUdfUkVTQU1QTEUpKXsKLSAgICAgICAgcy0+cmVzYW1wbGUgPSBzLT5yZXNhbXBsZXItPmluaXQocy0+cmVzYW1wbGUsIHMtPm91dF9zYW1wbGVfcmF0ZSwgcy0+aW5fc2FtcGxlX3JhdGUsIHMtPmZpbHRlcl9zaXplLCBzLT5waGFzZV9zaGlmdCwgcy0+bGluZWFyX2ludGVycCwgcy0+Y3V0b2ZmLCBzLT5pbnRfc2FtcGxlX2ZtdCwgcy0+ZmlsdGVyX3R5cGUsIHMtPmthaXNlcl9iZXRhLCBzLT5wcmVjaXNpb24sIHMtPmNoZWJ5KTsKKyAgICAgICAgcy0+cmVzYW1wbGUgPSBzLT5yZXNhbXBsZXItPmluaXQocy0+cmVzYW1wbGUsIHMtPm91dF9zYW1wbGVfcmF0ZSwgcy0+aW5fc2FtcGxlX3JhdGUsIHMtPmZpbHRlcl9zaXplLCBzLT5waGFzZV9zaGlmdCwgcy0+bGluZWFyX2ludGVycCwgcy0+Y3V0b2ZmLCBzLT5pbnRfc2FtcGxlX2ZtdCwgcy0+ZmlsdGVyX3R5cGUsIHMtPmthaXNlcl9iZXRhLCBzLT5wcmVjaXNpb24sIHMtPmNoZWJ5LCBzLT5leGFjdF9yYXRpb25hbCk7CiAgICAgICAgIGlmICghcy0+cmVzYW1wbGUpIHsKICAgICAgICAgICAgIGF2X2xvZyhzLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSByZXNhbXBsZXJcbiIpOwogICAgICAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVNKTsKQEAgLTI3NCw3ICsyNzYsNyBAQAogICAgICAgICAmJiBzLT5pbnRfc2FtcGxlX2ZtdCAhPSBBVl9TQU1QTEVfRk1UX0ZMVFAKICAgICAgICAgJiYgcy0+aW50X3NhbXBsZV9mbXQgIT0gQVZfU0FNUExFX0ZNVF9EQkxQCiAgICAgICAgICYmIHMtPnJlc2FtcGxlKXsKLSAgICAgICAgYXZfbG9nKHMsIEFWX0xPR19FUlJPUiwgIlJlc2FtcGxpbmcgb25seSBzdXBwb3J0ZWQgd2l0aCBpbnRlcm5hbCBzMTYvczMyL2ZsdC9kYmxcbiIpOworICAgICAgICBhdl9sb2cocywgQVZfTE9HX0VSUk9SLCAiUmVzYW1wbGluZyBvbmx5IHN1cHBvcnRlZCB3aXRoIGludGVybmFsIHMxNnAvczMycC9mbHRwL2RibHBcbiIpOwogICAgICAgICByZXQgPSBBVkVSUk9SKEVJTlZBTCk7CiAgICAgICAgIGdvdG8gZmFpbDsKICAgICB9CkBAIC0zMTYsMTIgKzMxOCwxNSBAQAogCiBhdl9hc3NlcnQwKHMtPnVzZWRfY2hfY291bnQpOwogYXZfYXNzZXJ0MChzLT5vdXQuY2hfY291bnQpOwotICAgIHMtPnJlc2FtcGxlX2ZpcnN0PSBSU0Mqcy0+b3V0LmNoX2NvdW50L3MtPmluLmNoX2NvdW50IC0gUlNDIDwgcy0+b3V0X3NhbXBsZV9yYXRlLyhmbG9hdClzLT4gaW5fc2FtcGxlX3JhdGUgLSAxLjA7CisgICAgcy0+cmVzYW1wbGVfZmlyc3Q9IFJTQypzLT5vdXQuY2hfY291bnQvcy0+dXNlZF9jaF9jb3VudCAtIFJTQyA8IHMtPm91dF9zYW1wbGVfcmF0ZS8oZmxvYXQpcy0+IGluX3NhbXBsZV9yYXRlIC0gMS4wOwogCiAgICAgcy0+aW5fYnVmZmVyPSBzLT5pbjsKICAgICBzLT5zaWxlbmNlICA9IHMtPmluOwogICAgIHMtPmRyb3BfdGVtcD0gcy0+b3V0OwogCisgICAgaWYgKChyZXQgPSBzd3JpX2RpdGhlcl9pbml0KHMsIHMtPm91dF9zYW1wbGVfZm10LCBzLT5pbnRfc2FtcGxlX2ZtdCkpIDwgMCkKKyAgICAgICAgZ290byBmYWlsOworCiAgICAgaWYoIXMtPnJlc2FtcGxlICYmICFzLT5yZW1hdHJpeCAmJiAhcy0+Y2hhbm5lbF9tYXAgJiYgIXMtPmRpdGhlci5tZXRob2QpewogICAgICAgICBzLT5mdWxsX2NvbnZlcnQgPSBzd3JpX2F1ZGlvX2NvbnZlcnRfYWxsb2Mocy0+b3V0X3NhbXBsZV9mbXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT4gaW5fc2FtcGxlX2ZtdCwgcy0+IGluLmNoX2NvdW50LCBOVUxMLCAwKTsKQEAgLTM2Miw4ICszNjcsMTQgQEAKICAgICAgICAgc2V0X2F1ZGlvZGF0YV9mbXQoJnMtPmluX2J1ZmZlciwgcy0+aW50X3NhbXBsZV9mbXQpOwogICAgIH0KIAotICAgIGlmICgocmV0ID0gc3dyaV9kaXRoZXJfaW5pdChzLCBzLT5vdXRfc2FtcGxlX2ZtdCwgcy0+aW50X3NhbXBsZV9mbXQpKSA8IDApCi0gICAgICAgIGdvdG8gZmFpbDsKKyAgICBhdl9hc3NlcnQwKCFzLT5wcmVvdXQuY291bnQpOworICAgIHMtPmRpdGhlci5ub2lzZSA9IHMtPnByZW91dDsKKyAgICBzLT5kaXRoZXIudGVtcCAgPSBzLT5wcmVvdXQ7CisgICAgaWYgKHMtPmRpdGhlci5tZXRob2QgPiBTV1JfRElUSEVSX05TKSB7CisgICAgICAgIHMtPmRpdGhlci5ub2lzZS5icHMgPSA0OworICAgICAgICBzLT5kaXRoZXIubm9pc2UuZm10ID0gQVZfU0FNUExFX0ZNVF9GTFRQOworICAgICAgICBzLT5kaXRoZXIubm9pc2Vfc2NhbGUgPSAxOworICAgIH0KIAogICAgIGlmKHMtPnJlbWF0cml4IHx8IHMtPmRpdGhlci5tZXRob2QpIHsKICAgICAgICAgcmV0ID0gc3dyaV9yZW1hdHJpeF9pbml0KHMpOwpAQCAtNDAxLDkgKzQxMiw5IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgZm9yKGk9MDsgaTxhLT5jaF9jb3VudDsgaSsrKXsKICAgICAgICAgYS0+Y2hbaV09IGEtPmRhdGEgKyBpKihhLT5wbGFuYXIgPyBjb3VudGIgOiBhLT5icHMpOwotICAgICAgICBpZihhLT5wbGFuYXIpIG1lbWNweShhLT5jaFtpXSwgb2xkLmNoW2ldLCBhLT5jb3VudCphLT5icHMpOworICAgICAgICBpZihhLT5jb3VudCAmJiBhLT5wbGFuYXIpIG1lbWNweShhLT5jaFtpXSwgb2xkLmNoW2ldLCBhLT5jb3VudCphLT5icHMpOwogICAgIH0KLSAgICBpZighYS0+cGxhbmFyKSBtZW1jcHkoYS0+Y2hbMF0sIG9sZC5jaFswXSwgYS0+Y291bnQqYS0+Y2hfY291bnQqYS0+YnBzKTsKKyAgICBpZihhLT5jb3VudCAmJiAhYS0+cGxhbmFyKSBtZW1jcHkoYS0+Y2hbMF0sIG9sZC5jaFswXSwgYS0+Y291bnQqYS0+Y2hfY291bnQqYS0+YnBzKTsKICAgICBhdl9mcmVlcCgmb2xkLmRhdGEpOwogICAgIGEtPmNvdW50PSBjb3VudDsKIApAQCAtNjY3LDcgKzY3OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWl4XzJfMV9zaW1kKGNvbnZfc3JjLT5jaFtjaF0sIHByZW91dC0+Y2hbY2hdLCBzLT5kaXRoZXIubm9pc2UuY2hbY2hdICsgcy0+ZGl0aGVyLm5vaXNlLmJwcyAqIHMtPmRpdGhlci5ub2lzZV9wb3MsIHMtPm5hdGl2ZV9zaW1kX29uZSwgMCwgMCwgbGVuMSk7CiAgICAgICAgICAgICAgICAgICAgIGlmKG91dF9jb3VudCAhPSBsZW4xKQogICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGNoPTA7IGNoPHByZW91dC0+Y2hfY291bnQ7IGNoKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWl4XzJfMV9mKGNvbnZfc3JjLT5jaFtjaF0gKyBvZmYsIHByZW91dC0+Y2hbY2hdICsgb2ZmLCBzLT5kaXRoZXIubm9pc2UuY2hbY2hdICsgcy0+ZGl0aGVyLm5vaXNlLmJwcyAqIHMtPmRpdGhlci5ub2lzZV9wb3MgKyBvZmYgKyBsZW4xLCBzLT5uYXRpdmVfb25lLCAwLCAwLCBvdXRfY291bnQgLSBsZW4xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5taXhfMl8xX2YoY29udl9zcmMtPmNoW2NoXSArIG9mZiwgcHJlb3V0LT5jaFtjaF0gKyBvZmYsIHMtPmRpdGhlci5ub2lzZS5jaFtjaF0gKyBzLT5kaXRoZXIubm9pc2UuYnBzICogcy0+ZGl0aGVyLm5vaXNlX3BvcyArIG9mZiwgcy0+bmF0aXZlX29uZSwgMCwgMCwgb3V0X2NvdW50IC0gbGVuMSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgZm9yKGNoPTA7IGNoPHByZW91dC0+Y2hfY291bnQ7IGNoKyspCiAgICAgICAgICAgICAgICAgICAgICAgICBzLT5taXhfMl8xX2YoY29udl9zcmMtPmNoW2NoXSwgcHJlb3V0LT5jaFtjaF0sIHMtPmRpdGhlci5ub2lzZS5jaFtjaF0gKyBzLT5kaXRoZXIubm9pc2UuYnBzICogcy0+ZGl0aGVyLm5vaXNlX3Bvcywgcy0+bmF0aXZlX29uZSwgMCwgMCwgb3V0X2NvdW50KTsKZGlmZiAtLWdpdCBhL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZS5oIGIvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgKaW5kZXggMTBlYWViYy4uYzdiODRmYiAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgKKysrIGIvbGlic3dyZXNhbXBsZS9zd3Jlc2FtcGxlLmgKQEAgLTI4LDExICsyOCwxMCBAQAogICovCiAKIC8qKgotICogQGRlZmdyb3VwIGxzd3IgTGlic3dyZXNhbXBsZQorICogQGRlZmdyb3VwIGxzd3IgbGlic3dyZXNhbXBsZQogICogQHsKICAqCi0gKiBMaWJzd3Jlc2FtcGxlIChsc3dyKSBpcyBhIGxpYnJhcnkgdGhhdCBoYW5kbGVzIGF1ZGlvIHJlc2FtcGxpbmcsIHNhbXBsZQotICogZm9ybWF0IGNvbnZlcnNpb24gYW5kIG1peGluZy4KKyAqIEF1ZGlvIHJlc2FtcGxpbmcsIHNhbXBsZSBmb3JtYXQgY29udmVyc2lvbiBhbmQgbWl4aW5nIGxpYnJhcnkuCiAgKgogICogSW50ZXJhY3Rpb24gd2l0aCBsc3dyIGlzIGRvbmUgdGhyb3VnaCBTd3JDb250ZXh0LCB3aGljaCBpcwogICogYWxsb2NhdGVkIHdpdGggc3dyX2FsbG9jKCkgb3Igc3dyX2FsbG9jX3NldF9vcHRzKCkuIEl0IGlzIG9wYXF1ZSwgc28gYWxsIHBhcmFtZXRlcnMKQEAgLTEyMSwxNSArMTIwLDEyIEBACiAgKi8KIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9mcmFtZS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9zYW1wbGVmbXQuaCIKIAogI2luY2x1ZGUgImxpYnN3cmVzYW1wbGUvdmVyc2lvbi5oIgogCi0jaWYgTElCU1dSRVNBTVBMRV9WRVJTSU9OX01BSk9SIDwgMQotI2RlZmluZSBTV1JfQ0hfTUFYIDMyICAgLy8vPCBNYXhpbXVtIG51bWJlciBvZiBjaGFubmVscwotI2VuZGlmCi0KIC8qKgogICogQG5hbWUgT3B0aW9uIGNvbnN0YW50cwogICogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIGZvciB0aGUgQHJlZiBhdm9wdGlvbnMgaW50ZXJmYWNlIGZvciBsc3dyLgpAQCAtMzY3LDYgKzM2MywzNiBAQAogaW50IHN3cl9zZXRfY2hhbm5lbF9tYXBwaW5nKHN0cnVjdCBTd3JDb250ZXh0ICpzLCBjb25zdCBpbnQgKmNoYW5uZWxfbWFwKTsKIAogLyoqCisgKiBHZW5lcmF0ZSBhIGNoYW5uZWwgbWl4aW5nIG1hdHJpeC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBvbmUgdXNlZCBpbnRlcm5hbGx5IGJ5IGxpYnN3cmVzYW1wbGUgZm9yIGJ1aWxkaW5nIHRoZQorICogZGVmYXVsdCBtaXhpbmcgbWF0cml4LiBJdCBpcyBtYWRlIHB1YmxpYyBqdXN0IGFzIGEgdXRpbGl0eSBmdW5jdGlvbiBmb3IKKyAqIGJ1aWxkaW5nIGN1c3RvbSBtYXRyaWNlcy4KKyAqCisgKiBAcGFyYW0gaW5fbGF5b3V0ICAgICAgICAgICBpbnB1dCBjaGFubmVsIGxheW91dAorICogQHBhcmFtIG91dF9sYXlvdXQgICAgICAgICAgb3V0cHV0IGNoYW5uZWwgbGF5b3V0CisgKiBAcGFyYW0gY2VudGVyX21peF9sZXZlbCAgICBtaXggbGV2ZWwgZm9yIHRoZSBjZW50ZXIgY2hhbm5lbAorICogQHBhcmFtIHN1cnJvdW5kX21peF9sZXZlbCAgbWl4IGxldmVsIGZvciB0aGUgc3Vycm91bmQgY2hhbm5lbChzKQorICogQHBhcmFtIGxmZV9taXhfbGV2ZWwgICAgICAgbWl4IGxldmVsIGZvciB0aGUgbG93LWZyZXF1ZW5jeSBlZmZlY3RzIGNoYW5uZWwKKyAqIEBwYXJhbSByZW1hdHJpeF9tYXh2YWwgICAgIGlmIDEuMCwgY29lZmZpY2llbnRzIHdpbGwgYmUgbm9ybWFsaXplZCB0byBwcmV2ZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy4gaWYgSU5UX01BWCwgY29lZmZpY2llbnRzIHdpbGwgbm90IGJlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkLgorICogQHBhcmFtW291dF0gbWF0cml4ICAgICAgICAgbWl4aW5nIGNvZWZmaWNpZW50czsgbWF0cml4W2kgKyBzdHJpZGUgKiBvXSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdlaWdodCBvZiBpbnB1dCBjaGFubmVsIGkgaW4gb3V0cHV0IGNoYW5uZWwgby4KKyAqIEBwYXJhbSBzdHJpZGUgICAgICAgICAgICAgIGRpc3RhbmNlIGJldHdlZW4gYWRqYWNlbnQgaW5wdXQgY2hhbm5lbHMgaW4gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXggYXJyYXkKKyAqIEBwYXJhbSBtYXRyaXhfZW5jb2RpbmcgICAgIG1hdHJpeGVkIHN0ZXJlbyBkb3dubWl4IG1vZGUgKGUuZy4gZHBsaWkpCisgKiBAcGFyYW0gbG9nX2N0eCAgICAgICAgICAgICBwYXJlbnQgbG9nZ2luZyBjb250ZXh0LCBjYW4gYmUgTlVMTAorICogQHJldHVybiAgICAgICAgICAgICAgICAgICAgMCBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBBVkVSUk9SIGNvZGUgb24gZmFpbHVyZQorICovCitpbnQgc3dyX2J1aWxkX21hdHJpeCh1aW50NjRfdCBpbl9sYXlvdXQsIHVpbnQ2NF90IG91dF9sYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY2VudGVyX21peF9sZXZlbCwgZG91YmxlIHN1cnJvdW5kX21peF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZmVfbWl4X2xldmVsLCBkb3VibGUgcmVtYXRyaXhfbWF4dmFsLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlbWF0cml4X3ZvbHVtZSwgZG91YmxlICptYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBlbnVtIEFWTWF0cml4RW5jb2RpbmcgbWF0cml4X2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCAqbG9nX2N0eCk7CisKKy8qKgogICogU2V0IGEgY3VzdG9taXplZCByZW1peCBtYXRyaXguCiAgKgogICogQHBhcmFtIHMgICAgICAgYWxsb2NhdGVkIFN3ciBjb250ZXh0LCBub3QgeWV0IGluaXRpYWxpemVkCmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGVfZnJhbWUuYyBiL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZV9mcmFtZS5jCmluZGV4IDcxZDNlZDcuLjI4NTMyNjYgMTAwNjQ0Ci0tLSBhL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZV9mcmFtZS5jCisrKyBiL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZV9mcmFtZS5jCkBAIC0xMzksOSArMTM5LDEwIEBACiAKICAgICBpZiAob3V0KSB7CiAgICAgICAgIGlmICghb3V0LT5saW5lc2l6ZVswXSkgewotICAgICAgICAgICAgb3V0LT5uYl9zYW1wbGVzID0gICBzd3JfZ2V0X2RlbGF5KHMsIHMtPm91dF9zYW1wbGVfcmF0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaW4tPm5iX3NhbXBsZXMqKGludDY0X3Qpcy0+b3V0X3NhbXBsZV9yYXRlIC8gcy0+aW5fc2FtcGxlX3JhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgMzsKKyAgICAgICAgICAgIG91dC0+bmJfc2FtcGxlcyA9IHN3cl9nZXRfZGVsYXkocywgcy0+b3V0X3NhbXBsZV9yYXRlKSArIDM7CisgICAgICAgICAgICBpZiAoaW4pIHsKKyAgICAgICAgICAgICAgICBvdXQtPm5iX3NhbXBsZXMgKz0gaW4tPm5iX3NhbXBsZXMqKGludDY0X3Qpcy0+b3V0X3NhbXBsZV9yYXRlIC8gcy0+aW5fc2FtcGxlX3JhdGU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoKHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIob3V0LCAwKSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKHNldHVwKQogICAgICAgICAgICAgICAgICAgICBzd3JfY2xvc2Uocyk7CmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGVfaW50ZXJuYWwuaCBiL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZV9pbnRlcm5hbC5oCmluZGV4IDVkNjFkZTQuLmYyZWE1YTIgMTAwNjQ0Ci0tLSBhL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZV9pbnRlcm5hbC5oCisrKyBiL2xpYnN3cmVzYW1wbGUvc3dyZXNhbXBsZV9pbnRlcm5hbC5oCkBAIC02OSw3ICs2OSw3IEBACiB9OwogCiB0eXBlZGVmIHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKiAoKiByZXNhbXBsZV9pbml0X2Z1bmMpKHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKmMsIGludCBvdXRfcmF0ZSwgaW50IGluX3JhdGUsIGludCBmaWx0ZXJfc2l6ZSwgaW50IHBoYXNlX3NoaWZ0LCBpbnQgbGluZWFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGN1dG9mZiwgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQsIGVudW0gU3dyRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZSwgZG91YmxlIGthaXNlcl9iZXRhLCBkb3VibGUgcHJlY2lzaW9uLCBpbnQgY2hlYnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGN1dG9mZiwgZW51bSBBVlNhbXBsZUZvcm1hdCBmb3JtYXQsIGVudW0gU3dyRmlsdGVyVHlwZSBmaWx0ZXJfdHlwZSwgZG91YmxlIGthaXNlcl9iZXRhLCBkb3VibGUgcHJlY2lzaW9uLCBpbnQgY2hlYnksIGludCBleGFjdF9yYXRpb25hbCk7CiB0eXBlZGVmIHZvaWQgICAgKCogcmVzYW1wbGVfZnJlZV9mdW5jKShzdHJ1Y3QgUmVzYW1wbGVDb250ZXh0ICoqYyk7CiB0eXBlZGVmIGludCAgICAgKCogbXVsdGlwbGVfcmVzYW1wbGVfZnVuYykoc3RydWN0IFJlc2FtcGxlQ29udGV4dCAqYywgQXVkaW9EYXRhICpkc3QsIGludCBkc3Rfc2l6ZSwgQXVkaW9EYXRhICpzcmMsIGludCBzcmNfc2l6ZSwgaW50ICpjb25zdW1lZCk7CiB0eXBlZGVmIGludCAgICAgKCogcmVzYW1wbGVfZmx1c2hfZnVuYykoc3RydWN0IFN3ckNvbnRleHQgKmMpOwpAQCAtMTIwLDEyICsxMjAsMTQgQEAKICAgICBpbnQ2NF90IHVzZXJfaW5fY2hfbGF5b3V0OyAgICAgICAgICAgICAgICAgICAgICAvLy88IFVzZXIgc2V0IGlucHV0IGNoYW5uZWwgbGF5b3V0CiAgICAgaW50NjRfdCB1c2VyX291dF9jaF9sYXlvdXQ7ICAgICAgICAgICAgICAgICAgICAgLy8vPCBVc2VyIHNldCBvdXRwdXQgY2hhbm5lbCBsYXlvdXQKICAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IHVzZXJfaW50X3NhbXBsZV9mbXQ7ICAgICAgICAvLy88IFVzZXIgc2V0IGludGVybmFsIHNhbXBsZSBmb3JtYXQKKyAgICBpbnQgdXNlcl9kaXRoZXJfbWV0aG9kOyAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFVzZXIgc2V0IGRpdGhlciBtZXRob2QKIAogICAgIHN0cnVjdCBEaXRoZXJDb250ZXh0IGRpdGhlcjsKIAogICAgIGludCBmaWx0ZXJfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgbGVuZ3RoIG9mIGVhY2ggRklSIGZpbHRlciBpbiB0aGUgcmVzYW1wbGluZyBmaWx0ZXJiYW5rIHJlbGF0aXZlIHRvIHRoZSBjdXRvZmYgZnJlcXVlbmN5ICovCiAgICAgaW50IHBoYXNlX3NoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBsb2cyIG9mIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcmVzYW1wbGluZyBwb2x5cGhhc2UgZmlsdGVyYmFuayAqLwogICAgIGludCBsaW5lYXJfaW50ZXJwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgaWYgMSB0aGVuIHRoZSByZXNhbXBsaW5nIEZJUiBmaWx0ZXIgd2lsbCBiZSBsaW5lYXJseSBpbnRlcnBvbGF0ZWQgKi8KKyAgICBpbnQgZXhhY3RfcmF0aW9uYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IGlmIDEgdGhlbiBlbmFibGUgbm9uIHBvd2VyIG9mIDIgcGhhc2VfY291bnQgKi8KICAgICBkb3VibGUgY3V0b2ZmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHJlc2FtcGxpbmcgY3V0b2ZmIGZyZXF1ZW5jeSAoc3dyOiA2ZEIgcG9pbnQ7IHNveHI6IDBkQiBwb2ludCkuIDEuMCBjb3JyZXNwb25kcyB0byBoYWxmIHRoZSBvdXRwdXQgc2FtcGxlIHJhdGUgKi8KICAgICBpbnQgZmlsdGVyX3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHN3ciByZXNhbXBsaW5nIGZpbHRlciB0eXBlICovCiAgICAgZG91YmxlIGthaXNlcl9iZXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzd3IgYmV0YSB2YWx1ZSBmb3IgS2Fpc2VyIHdpbmRvdyAob25seSBhcHBsaWNhYmxlIGlmIGZpbHRlcl90eXBlID09IEFWX0ZJTFRFUl9UWVBFX0tBSVNFUikgKi8KQEAgLTE2Niw3ICsxNjgsOCBAQAogICAgIHN0cnVjdCBSZXNhbXBsZUNvbnRleHQgKnJlc2FtcGxlOyAgICAgICAgICAgICAgIC8vLzwgcmVzYW1wbGluZyBjb250ZXh0CiAgICAgc3RydWN0IFJlc2FtcGxlciBjb25zdCAqcmVzYW1wbGVyOyAgICAgICAgICAgICAgLy8vPCByZXNhbXBsZXIgdmlydHVhbCBmdW5jdGlvbiB0YWJsZQogCi0gICAgZmxvYXQgbWF0cml4W1NXUl9DSF9NQVhdW1NXUl9DSF9NQVhdOyAgICAgICAgICAgLy8vPCBmbG9hdGluZyBwb2ludCByZW1hdHJpeGluZyBjb2VmZmljaWVudHMKKyAgICBkb3VibGUgbWF0cml4W1NXUl9DSF9NQVhdW1NXUl9DSF9NQVhdOyAgICAgICAgICAvLy88IGZsb2F0aW5nIHBvaW50IHJlbWF0cml4aW5nIGNvZWZmaWNpZW50cworICAgIGZsb2F0IG1hdHJpeF9mbHRbU1dSX0NIX01BWF1bU1dSX0NIX01BWF07ICAgICAgIC8vLzwgc2luZ2xlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCByZW1hdHJpeGluZyBjb2VmZmljaWVudHMKICAgICB1aW50OF90ICpuYXRpdmVfbWF0cml4OwogICAgIHVpbnQ4X3QgKm5hdGl2ZV9vbmU7CiAgICAgdWludDhfdCAqbmF0aXZlX3NpbWRfb25lOwpkaWZmIC0tZ2l0IGEvbGlic3dyZXNhbXBsZS90ZXN0cy9zd3Jlc2FtcGxlLmMgYi9saWJzd3Jlc2FtcGxlL3Rlc3RzL3N3cmVzYW1wbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzg5NjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGlic3dyZXNhbXBsZS90ZXN0cy9zd3Jlc2FtcGxlLmMKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiBNaWNoYWVsIE5pZWRlcm1heWVyIChtaWNoYWVsbmlAZ214LmF0KQorICogQ29weXJpZ2h0IChjKSAyMDAyIEZhYnJpY2UgQmVsbGFyZAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGxpYnN3cmVzYW1wbGUKKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBsaWJzd3Jlc2FtcGxlIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBsaWJzd3Jlc2FtcGxlOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jaGFubmVsX2xheW91dC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisKKyNpbmNsdWRlICJsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaCIKKworI3VuZGVmIHRpbWUKKyNpbmNsdWRlIDx0aW1lLmg+CisjdW5kZWYgZnByaW50ZgorCisjZGVmaW5lIFNBTVBMRVMgMTAwMAorCisjZGVmaW5lIFNXUl9DSF9NQVggMzIKKworI2RlZmluZSBBU1NFUlRfTEVWRUwgMgorCitzdGF0aWMgZG91YmxlIGdldCh1aW50OF90ICphW10sIGludCBjaCwgaW50IGluZGV4LCBpbnQgY2hfY291bnQsIGVudW0gQVZTYW1wbGVGb3JtYXQgZil7CisgICAgY29uc3QgdWludDhfdCAqcDsKKyAgICBpZihhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihmKSl7CisgICAgICAgIGY9IGF2X2dldF9hbHRfc2FtcGxlX2ZtdChmLCAwKTsKKyAgICAgICAgcD0gYVtjaF07CisgICAgfWVsc2V7CisgICAgICAgIHA9IGFbMF07CisgICAgICAgIGluZGV4PSBjaCArIGluZGV4KmNoX2NvdW50OworICAgIH0KKworICAgIHN3aXRjaChmKXsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfVTggOiByZXR1cm4gKChjb25zdCB1aW50OF90KilwKVtpbmRleF0vMTI3LjAtMS4wOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTY6IHJldHVybiAoKGNvbnN0IGludDE2X3QqKXApW2luZGV4XS8zMjc2Ny4wOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMzI6IHJldHVybiAoKGNvbnN0IGludDMyX3QqKXApW2luZGV4XS8yMTQ3NDgzNjQ3LjA7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0ZMVDogcmV0dXJuICgoY29uc3QgZmxvYXQgICopcClbaW5kZXhdOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9EQkw6IHJldHVybiAoKGNvbnN0IGRvdWJsZSAqKXApW2luZGV4XTsKKyAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgIHNldCh1aW50OF90ICphW10sIGludCBjaCwgaW50IGluZGV4LCBpbnQgY2hfY291bnQsIGVudW0gQVZTYW1wbGVGb3JtYXQgZiwgZG91YmxlIHYpeworICAgIHVpbnQ4X3QgKnA7CisgICAgaWYoYXZfc2FtcGxlX2ZtdF9pc19wbGFuYXIoZikpeworICAgICAgICBmPSBhdl9nZXRfYWx0X3NhbXBsZV9mbXQoZiwgMCk7CisgICAgICAgIHA9IGFbY2hdOworICAgIH1lbHNleworICAgICAgICBwPSBhWzBdOworICAgICAgICBpbmRleD0gY2ggKyBpbmRleCpjaF9jb3VudDsKKyAgICB9CisgICAgc3dpdGNoKGYpeworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9VOCA6ICgodWludDhfdCopcClbaW5kZXhdPSBhdl9jbGlwX3VpbnQ4IChscmludCgodisxLjApKjEyNykpOyAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX1MxNjogKChpbnQxNl90KilwKVtpbmRleF09IGF2X2NsaXBfaW50MTYgKGxyaW50KHYqMzI3NjcpKTsgICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1NBTVBMRV9GTVRfUzMyOiAoKGludDMyX3QqKXApW2luZGV4XT0gYXZfY2xpcGxfaW50MzIobGxyaW50KHYqMjE0NzQ4MzY0NykpOyAgIGJyZWFrOworICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFQ6ICgoZmxvYXQgICopcClbaW5kZXhdPSB2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9TQU1QTEVfRk1UX0RCTDogKChkb3VibGUgKilwKVtpbmRleF09IHY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiBhdl9hc3NlcnQyKDApOworICAgIH0KK30KKworc3RhdGljIHZvaWQgc2hpZnQodWludDhfdCAqYVtdLCBpbnQgaW5kZXgsIGludCBjaF9jb3VudCwgZW51bSBBVlNhbXBsZUZvcm1hdCBmKXsKKyAgICBpbnQgY2g7CisKKyAgICBpZihhdl9zYW1wbGVfZm10X2lzX3BsYW5hcihmKSl7CisgICAgICAgIGY9IGF2X2dldF9hbHRfc2FtcGxlX2ZtdChmLCAwKTsKKyAgICAgICAgZm9yKGNoPSAwOyBjaDxjaF9jb3VudDsgY2grKykKKyAgICAgICAgICAgIGFbY2hdICs9IGluZGV4KmF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGYpOworICAgIH1lbHNleworICAgICAgICBhWzBdICs9IGluZGV4KmNoX2NvdW50KmF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGYpOworICAgIH0KK30KKworc3RhdGljIGNvbnN0IGVudW0gQVZTYW1wbGVGb3JtYXQgZm9ybWF0c1tdID0geworICAgIEFWX1NBTVBMRV9GTVRfUzE2LAorICAgIEFWX1NBTVBMRV9GTVRfRkxUUCwKKyAgICBBVl9TQU1QTEVfRk1UX1MxNlAsCisgICAgQVZfU0FNUExFX0ZNVF9GTFQsCisgICAgQVZfU0FNUExFX0ZNVF9TMzJQLAorICAgIEFWX1NBTVBMRV9GTVRfUzMyLAorICAgIEFWX1NBTVBMRV9GTVRfVThQLAorICAgIEFWX1NBTVBMRV9GTVRfVTgsCisgICAgQVZfU0FNUExFX0ZNVF9EQkxQLAorICAgIEFWX1NBTVBMRV9GTVRfREJMLAorfTsKKworc3RhdGljIGNvbnN0IGludCByYXRlc1tdID0geworICAgIDgwMDAsCisgICAgMTEwMjUsCisgICAgMTYwMDAsCisgICAgMjIwNTAsCisgICAgMzIwMDAsCisgICAgNDgwMDAsCit9OworCitzdGF0aWMgY29uc3QgdWludDY0X3QgbGF5b3V0c1tdPXsKKyAgICBBVl9DSF9MQVlPVVRfTU9OTyAgICAgICAgICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF9TVEVSRU8gICAgICAgICAgICAgICAgICAsCisgICAgQVZfQ0hfTEFZT1VUXzJfMSAgICAgICAgICAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfU1VSUk9VTkQgICAgICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF80UE9JTlQwICAgICAgICAgICAgICAgICAsCisgICAgQVZfQ0hfTEFZT1VUXzJfMiAgICAgICAgICAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfUVVBRCAgICAgICAgICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQwICAgICAgICAgICAgICAgICAsCisgICAgQVZfQ0hfTEFZT1VUXzVQT0lOVDEgICAgICAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfNVBPSU5UMF9CQUNLICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF81UE9JTlQxX0JBQ0sgICAgICAgICAgICAsCisgICAgQVZfQ0hfTEFZT1VUXzdQT0lOVDAgICAgICAgICAgICAgICAgICwKKyAgICBBVl9DSF9MQVlPVVRfN1BPSU5UMSAgICAgICAgICAgICAgICAgLAorICAgIEFWX0NIX0xBWU9VVF83UE9JTlQxX1dJREUgICAgICAgICAgICAsCit9OworCitzdGF0aWMgdm9pZCBzZXR1cF9hcnJheSh1aW50OF90ICpvdXRbU1dSX0NIX01BWF0sIHVpbnQ4X3QgKmluLCBlbnVtIEFWU2FtcGxlRm9ybWF0IGZvcm1hdCwgaW50IHNhbXBsZXMpeworICAgIGlmKGF2X3NhbXBsZV9mbXRfaXNfcGxhbmFyKGZvcm1hdCkpeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHBsYW5lX3NpemU9IGF2X2dldF9ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCYweEZGKSpzYW1wbGVzOworICAgICAgICBmb3JtYXQmPTB4RkY7CisgICAgICAgIGZvcihpPTA7IGk8U1dSX0NIX01BWDsgaSsrKXsKKyAgICAgICAgICAgIG91dFtpXT0gaW4gKyBpKnBsYW5lX3NpemU7CisgICAgICAgIH0KKyAgICB9ZWxzZXsKKyAgICAgICAgb3V0WzBdPSBpbjsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQgY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpeworICAgIHJldHVybiAqKGNvbnN0IGludCAqKWEgLSAqKGNvbnN0IGludCAqKWI7Cit9CisKK3N0YXRpYyB2b2lkIGF1ZGlvZ2VuKHZvaWQgKmRhdGEsIGVudW0gQVZTYW1wbGVGb3JtYXQgc2FtcGxlX2ZtdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsZV9yYXRlLCBpbnQgbmJfc2FtcGxlcykKK3sKKyAgICBpbnQgaSwgY2gsIGs7CisgICAgZG91YmxlIHYsIGYsIGEsIGFtcGE7CisgICAgZG91YmxlIHRhYmYxW1NXUl9DSF9NQVhdOworICAgIGRvdWJsZSB0YWJmMltTV1JfQ0hfTUFYXTsKKyAgICBkb3VibGUgdGFiYVtTV1JfQ0hfTUFYXTsKKyAgICB1bnNpZ25lZCBzdGF0aWMgcm5kOworCisjZGVmaW5lIFBVVF9TQU1QTEUgc2V0KGRhdGEsIGNoLCBrLCBjaGFubmVscywgc2FtcGxlX2ZtdCwgdik7CisjZGVmaW5lIHVpbnRfcmFuZCh4KSAoKHgpID0gKHgpICogMTY2NDUyNSArIDEwMTM5MDQyMjMpCisjZGVmaW5lIGRibF9yYW5kKHgpICh1aW50X3JhbmQoeCkqMi4wIC8gKGRvdWJsZSlVSU5UX01BWCAtIDEpCisgICAgayA9IDA7CisKKyAgICAvKiAxIHNlY29uZCBvZiBzaW5nbGUgZnJlcSBzaW51cyBhdCAxMDAwIEh6ICovCisgICAgYSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDEgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgdiA9IHNpbihhKSAqIDAuMzA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgICAgICBhICs9IE1fUEkgKiAxMDAwLjAgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKKyAgICB9CisKKyAgICAvKiAxIHNlY29uZCBvZiB2YXJ5aW5nIGZyZXF1ZW5jeSBiZXR3ZWVuIDEwMCBhbmQgMTAwMDAgSHogKi8KKyAgICBhID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMSAqIHNhbXBsZV9yYXRlICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICB2ID0gc2luKGEpICogMC4zMDsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBQVVRfU0FNUExFCisgICAgICAgIGYgID0gMTAwLjAgKyAoKCgxMDAwMC4wIC0gMTAwLjApICogaSkgLyBzYW1wbGVfcmF0ZSk7CisgICAgICAgIGEgKz0gTV9QSSAqIGYgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKKyAgICB9CisKKyAgICAvKiAwLjUgc2Vjb25kIG9mIGxvdyBhbXBsaXR1ZGUgd2hpdGUgbm9pc2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX3JhdGUgLyAyICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICB2ID0gZGJsX3JhbmQocm5kKSAqIDAuMzA7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyBjaCsrKQorICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgIH0KKworICAgIC8qIDAuNSBzZWNvbmQgb2YgaGlnaCBhbXBsaXR1ZGUgd2hpdGUgbm9pc2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgc2FtcGxlX3JhdGUgLyAyICYmIGsgPCBuYl9zYW1wbGVzOyBpKyssIGsrKykgeworICAgICAgICB2ID0gZGJsX3JhbmQocm5kKTsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspCisgICAgICAgICAgICBQVVRfU0FNUExFCisgICAgfQorCisgICAgLyogMSBzZWNvbmQgb2YgdW5yZWxhdGVkIHJhbXBzIGZvciBlYWNoIGNoYW5uZWwgKi8KKyAgICBmb3IgKGNoID0gMDsgY2ggPCBjaGFubmVsczsgY2grKykgeworICAgICAgICB0YWJhW2NoXSAgPSAwOworICAgICAgICB0YWJmMVtjaF0gPSAxMDAgKyB1aW50X3JhbmQocm5kKSAlIDUwMDA7CisgICAgICAgIHRhYmYyW2NoXSA9IDEwMCArIHVpbnRfcmFuZChybmQpICUgNTAwMDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDEgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIHYgPSBzaW4odGFiYVtjaF0pICogMC4zMDsKKyAgICAgICAgICAgIFBVVF9TQU1QTEUKKyAgICAgICAgICAgIGYgPSB0YWJmMVtjaF0gKyAoKCh0YWJmMltjaF0gLSB0YWJmMVtjaF0pICogaSkgLyBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICB0YWJhW2NoXSArPSBNX1BJICogZiAqIDIuMCAvIHNhbXBsZV9yYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgLyogMiBzZWNvbmRzIG9mIDUwMCBIeiB3aXRoIHZhcnlpbmcgdm9sdW1lICovCisgICAgYSAgICA9IDA7CisgICAgYW1wYSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDIgKiBzYW1wbGVfcmF0ZSAmJiBrIDwgbmJfc2FtcGxlczsgaSsrLCBrKyspIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgY2hhbm5lbHM7IGNoKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBhbXAgPSAoMS4wICsgc2luKGFtcGEpKSAqIDAuMTU7CisgICAgICAgICAgICBpZiAoY2ggJiAxKQorICAgICAgICAgICAgICAgIGFtcCA9IDAuMzAgLSBhbXA7CisgICAgICAgICAgICB2ID0gc2luKGEpICogYW1wOworICAgICAgICAgICAgUFVUX1NBTVBMRQorICAgICAgICAgICAgYSAgICArPSBNX1BJICogNTAwLjAgKiAyLjAgLyBzYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgIGFtcGEgKz0gTV9QSSAqICAyLjAgLyBzYW1wbGVfcmF0ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KXsKKyAgICBpbnQgaW5fc2FtcGxlX3JhdGUsIG91dF9zYW1wbGVfcmF0ZSwgY2ggLGksIGZsdXNoX2NvdW50OworICAgIHVpbnQ2NF90IGluX2NoX2xheW91dCwgb3V0X2NoX2xheW91dDsKKyAgICBlbnVtIEFWU2FtcGxlRm9ybWF0IGluX3NhbXBsZV9mbXQsIG91dF9zYW1wbGVfZm10OworICAgIHVpbnQ4X3QgYXJyYXlfaW5bU0FNUExFUyo4KjhdOworICAgIHVpbnQ4X3QgYXJyYXlfbWlkW1NBTVBMRVMqOCo4KjNdOworICAgIHVpbnQ4X3QgYXJyYXlfb3V0W1NBTVBMRVMqOCo4KzEwMF07CisgICAgdWludDhfdCAqYWluW1NXUl9DSF9NQVhdOworICAgIHVpbnQ4X3QgKmFvdXRbU1dSX0NIX01BWF07CisgICAgdWludDhfdCAqYW1pZFtTV1JfQ0hfTUFYXTsKKyAgICBpbnQgZmx1c2hfaT0wOworICAgIGludCBtb2RlOworICAgIGludCBudW1fdGVzdHMgPSAxMDAwMDsKKyAgICB1aW50MzJfdCBzZWVkID0gMDsKKyAgICB1aW50MzJfdCByYW5kX3NlZWQgPSAwOworICAgIGludCByZW1haW5pbmdfdGVzdHNbRkZfQVJSQVlfRUxFTVMocmF0ZXMpICogRkZfQVJSQVlfRUxFTVMobGF5b3V0cykgKiBGRl9BUlJBWV9FTEVNUyhmb3JtYXRzKSAqIEZGX0FSUkFZX0VMRU1TKGxheW91dHMpICogRkZfQVJSQVlfRUxFTVMoZm9ybWF0cyldOworICAgIGludCBtYXhfdGVzdHMgPSBGRl9BUlJBWV9FTEVNUyhyZW1haW5pbmdfdGVzdHMpOworICAgIGludCB0ZXN0OworICAgIGludCBzcGVjaWZpY190ZXN0PSAtMTsKKworICAgIHN0cnVjdCBTd3JDb250ZXh0ICogZm9yd19jdHg9IE5VTEw7CisgICAgc3RydWN0IFN3ckNvbnRleHQgKmJhY2t3X2N0eD0gTlVMTDsKKworICAgIGlmIChhcmdjID4gMSkgeworICAgICAgICBpZiAoIXN0cmNtcChhcmd2WzFdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSkgeworICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAiVXNhZ2U6IHN3cmVzYW1wbGUtdGVzdCBbPG51bV90ZXN0cz5bIDx0ZXN0Pl1dICBcbiIKKyAgICAgICAgICAgICAgICAgICAibnVtX3Rlc3RzICAgICAgICAgICBEZWZhdWx0IGlzICVkXG4iLCBudW1fdGVzdHMpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgbnVtX3Rlc3RzID0gc3RydG9sKGFyZ3ZbMV0sIE5VTEwsIDApOworICAgICAgICBpZihudW1fdGVzdHMgPCAwKSB7CisgICAgICAgICAgICBudW1fdGVzdHMgPSAtbnVtX3Rlc3RzOworICAgICAgICAgICAgcmFuZF9zZWVkID0gdGltZSgwKTsKKyAgICAgICAgfQorICAgICAgICBpZihudW1fdGVzdHM8PSAwIHx8IG51bV90ZXN0cz5tYXhfdGVzdHMpCisgICAgICAgICAgICBudW1fdGVzdHMgPSBtYXhfdGVzdHM7CisgICAgICAgIGlmKGFyZ2MgPiAyKSB7CisgICAgICAgICAgICBzcGVjaWZpY190ZXN0ID0gc3RydG9sKGFyZ3ZbMV0sIE5VTEwsIDApOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKGk9MDsgaTxtYXhfdGVzdHM7IGkrKykKKyAgICAgICAgcmVtYWluaW5nX3Rlc3RzW2ldID0gaTsKKworICAgIGZvcih0ZXN0PTA7IHRlc3Q8bnVtX3Rlc3RzOyB0ZXN0KyspeworICAgICAgICB1bnNpZ25lZCByOworICAgICAgICB1aW50X3JhbmQoc2VlZCk7CisgICAgICAgIHIgPSAoc2VlZCAqICh1aW50NjRfdCkobWF4X3Rlc3RzIC0gdGVzdCkpID4+MzI7CisgICAgICAgIEZGU1dBUChpbnQsIHJlbWFpbmluZ190ZXN0c1tyXSwgcmVtYWluaW5nX3Rlc3RzW21heF90ZXN0cyAtIHRlc3QgLSAxXSk7CisgICAgfQorICAgIHFzb3J0KHJlbWFpbmluZ190ZXN0cyArIG1heF90ZXN0cyAtIG51bV90ZXN0cywgbnVtX3Rlc3RzLCBzaXplb2YocmVtYWluaW5nX3Rlc3RzWzBdKSwgY21wKTsKKyAgICBpbl9zYW1wbGVfcmF0ZT0xNjAwMDsKKyAgICBmb3IodGVzdD0wOyB0ZXN0PG51bV90ZXN0czsgdGVzdCsrKXsKKyAgICAgICAgY2hhciAgaW5fbGF5b3V0X3N0cmluZ1syNTZdOworICAgICAgICBjaGFyIG91dF9sYXlvdXRfc3RyaW5nWzI1Nl07CisgICAgICAgIHVuc2lnbmVkIHZlY3Rvcj0gcmVtYWluaW5nX3Rlc3RzW21heF90ZXN0cyAtIHRlc3QgLSAxXTsKKyAgICAgICAgaW50IGluX2NoX2NvdW50OworICAgICAgICBpbnQgb3V0X2NvdW50LCBtaWRfY291bnQsIG91dF9jaF9jb3VudDsKKworICAgICAgICBpbl9jaF9sYXlvdXQgICAgPSBsYXlvdXRzW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKGxheW91dHMpXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKGxheW91dHMpOworICAgICAgICBvdXRfY2hfbGF5b3V0ICAgPSBsYXlvdXRzW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKGxheW91dHMpXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKGxheW91dHMpOworICAgICAgICBpbl9zYW1wbGVfZm10ICAgPSBmb3JtYXRzW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpOworICAgICAgICBvdXRfc2FtcGxlX2ZtdCAgPSBmb3JtYXRzW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKGZvcm1hdHMpOworICAgICAgICBvdXRfc2FtcGxlX3JhdGUgPSByYXRlcyAgW3ZlY3RvciAlIEZGX0FSUkFZX0VMRU1TKHJhdGVzICApXTsgdmVjdG9yIC89IEZGX0FSUkFZX0VMRU1TKHJhdGVzKTsKKyAgICAgICAgYXZfYXNzZXJ0MCghdmVjdG9yKTsKKworICAgICAgICBpZihzcGVjaWZpY190ZXN0ID09IDApeworICAgICAgICAgICAgaWYob3V0X3NhbXBsZV9yYXRlICE9IGluX3NhbXBsZV9yYXRlIHx8IGluX2NoX2xheW91dCAhPSBvdXRfY2hfbGF5b3V0KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaW5fY2hfY291bnQ9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhpbl9jaF9sYXlvdXQpOworICAgICAgICBvdXRfY2hfY291bnQ9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhvdXRfY2hfbGF5b3V0KTsKKyAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyggaW5fbGF5b3V0X3N0cmluZywgc2l6ZW9mKCBpbl9sYXlvdXRfc3RyaW5nKSwgIGluX2NoX2NvdW50LCAgaW5fY2hfbGF5b3V0KTsKKyAgICAgICAgYXZfZ2V0X2NoYW5uZWxfbGF5b3V0X3N0cmluZyhvdXRfbGF5b3V0X3N0cmluZywgc2l6ZW9mKG91dF9sYXlvdXRfc3RyaW5nKSwgb3V0X2NoX2NvdW50LCBvdXRfY2hfbGF5b3V0KTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJURVNUOiAlcy0+JXMsIHJhdGU6JTVkLT4lNWQsIGZtdDolcy0+JXNcbiIsCisgICAgICAgICAgICAgICAgaW5fbGF5b3V0X3N0cmluZywgb3V0X2xheW91dF9zdHJpbmcsCisgICAgICAgICAgICAgICAgaW5fc2FtcGxlX3JhdGUsIG91dF9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKGluX3NhbXBsZV9mbXQpLCBhdl9nZXRfc2FtcGxlX2ZtdF9uYW1lKG91dF9zYW1wbGVfZm10KSk7CisgICAgICAgIGZvcndfY3R4ICA9IHN3cl9hbGxvY19zZXRfb3B0cyhmb3J3X2N0eCwgb3V0X2NoX2xheW91dCwgb3V0X3NhbXBsZV9mbXQsICBvdXRfc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fY2hfbGF5b3V0LCAgaW5fc2FtcGxlX2ZtdCwgIGluX3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICBiYWNrd19jdHggPSBzd3JfYWxsb2Nfc2V0X29wdHMoYmFja3dfY3R4LCBpbl9jaF9sYXlvdXQsICBpbl9zYW1wbGVfZm10LCAgICAgICAgICAgICBpbl9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfY2hfbGF5b3V0LCBvdXRfc2FtcGxlX2ZtdCwgb3V0X3NhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOworICAgICAgICBpZighZm9yd19jdHgpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXQgZm9yd19jdHNcbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYoIWJhY2t3X2N0eCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gaW5pdCBiYWNrd19jdHhcbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVpbnRfcmFuZChyYW5kX3NlZWQpICUgMyA9PSAwKQorICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQoZm9yd19jdHgsICJpY2giLCAwLCAwKTsKKyAgICAgICAgaWYgKHVpbnRfcmFuZChyYW5kX3NlZWQpICUgMyA9PSAwKQorICAgICAgICAgICAgYXZfb3B0X3NldF9pbnQoZm9yd19jdHgsICJvY2giLCAwLCAwKTsKKworICAgICAgICBpZihzd3JfaW5pdCggZm9yd19jdHgpIDwgMCkKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic3dyX2luaXQoLT4pIGZhaWxlZFxuIik7CisgICAgICAgIGlmKHN3cl9pbml0KGJhY2t3X2N0eCkgPCAwKQorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzd3JfaW5pdCg8LSkgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAvL0ZJWE1FIHRlc3QgcGxhbmFyCisgICAgICAgIHNldHVwX2FycmF5KGFpbiAsIGFycmF5X2luICwgIGluX3NhbXBsZV9mbXQsICAgU0FNUExFUyk7CisgICAgICAgIHNldHVwX2FycmF5KGFtaWQsIGFycmF5X21pZCwgb3V0X3NhbXBsZV9mbXQsIDMqU0FNUExFUyk7CisgICAgICAgIHNldHVwX2FycmF5KGFvdXQsIGFycmF5X291dCwgIGluX3NhbXBsZV9mbXQgICAgICAgICAgICwgICBTQU1QTEVTKTsKKyNpZiAwCisgICAgICAgIGZvcihjaD0wOyBjaDxpbl9jaF9jb3VudDsgY2grKyl7CisgICAgICAgICAgICBmb3IoaT0wOyBpPFNBTVBMRVM7IGkrKykKKyAgICAgICAgICAgICAgICBzZXQoYWluLCBjaCwgaSwgaW5fY2hfY291bnQsIGluX3NhbXBsZV9mbXQsIHNpbihpKmkqMy9TQU1QTEVTKSk7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGF1ZGlvZ2VuKGFpbiwgaW5fc2FtcGxlX2ZtdCwgaW5fY2hfY291bnQsIFNBTVBMRVMvNisxLCBTQU1QTEVTKTsKKyNlbmRpZgorICAgICAgICBtb2RlID0gdWludF9yYW5kKHJhbmRfc2VlZCkgJSAzOworICAgICAgICBpZihtb2RlPT0wIC8qfHwgb3V0X3NhbXBsZV9yYXRlID09IGluX3NhbXBsZV9yYXRlKi8pIHsKKyAgICAgICAgICAgIG1pZF9jb3VudD0gc3dyX2NvbnZlcnQoZm9yd19jdHgsIGFtaWQsIDMqU0FNUExFUywgKGNvbnN0IHVpbnQ4X3QgKiopYWluLCBTQU1QTEVTKTsKKyAgICAgICAgfSBlbHNlIGlmKG1vZGU9PTEpeworICAgICAgICAgICAgbWlkX2NvdW50PSBzd3JfY29udmVydChmb3J3X2N0eCwgYW1pZCwgICAgICAgICAwLCAoY29uc3QgdWludDhfdCAqKilhaW4sIFNBTVBMRVMpOworICAgICAgICAgICAgbWlkX2NvdW50Kz1zd3JfY29udmVydChmb3J3X2N0eCwgYW1pZCwgMypTQU1QTEVTLCAoY29uc3QgdWludDhfdCAqKilhaW4sICAgICAgIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHRtcF9jb3VudDsKKyAgICAgICAgICAgIG1pZF9jb3VudD0gc3dyX2NvbnZlcnQoZm9yd19jdHgsIGFtaWQsICAgICAgICAgMCwgKGNvbnN0IHVpbnQ4X3QgKiopYWluLCAgICAgICAxKTsKKyAgICAgICAgICAgIGF2X2Fzc2VydDAobWlkX2NvdW50PT0wKTsKKyAgICAgICAgICAgIHNoaWZ0KGFpbiwgIDEsIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKKyAgICAgICAgICAgIG1pZF9jb3VudCs9c3dyX2NvbnZlcnQoZm9yd19jdHgsIGFtaWQsIDMqU0FNUExFUywgKGNvbnN0IHVpbnQ4X3QgKiopYWluLCAgICAgICAwKTsKKyAgICAgICAgICAgIHNoaWZ0KGFtaWQsICBtaWRfY291bnQsIG91dF9jaF9jb3VudCwgb3V0X3NhbXBsZV9mbXQpOyB0bXBfY291bnQgPSBtaWRfY291bnQ7CisgICAgICAgICAgICBtaWRfY291bnQrPXN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAgICAgICAgIDIsIChjb25zdCB1aW50OF90ICoqKWFpbiwgICAgICAgMik7CisgICAgICAgICAgICBzaGlmdChhbWlkLCAgbWlkX2NvdW50LXRtcF9jb3VudCwgb3V0X2NoX2NvdW50LCBvdXRfc2FtcGxlX2ZtdCk7IHRtcF9jb3VudCA9IG1pZF9jb3VudDsKKyAgICAgICAgICAgIHNoaWZ0KGFpbiwgIDIsIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKKyAgICAgICAgICAgIG1pZF9jb3VudCs9c3dyX2NvbnZlcnQoZm9yd19jdHgsIGFtaWQsICAgICAgICAgMSwgKGNvbnN0IHVpbnQ4X3QgKiopYWluLCBTQU1QTEVTLTMpOworICAgICAgICAgICAgc2hpZnQoYW1pZCwgIG1pZF9jb3VudC10bXBfY291bnQsIG91dF9jaF9jb3VudCwgb3V0X3NhbXBsZV9mbXQpOyB0bXBfY291bnQgPSBtaWRfY291bnQ7CisgICAgICAgICAgICBzaGlmdChhaW4sIC0zLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7CisgICAgICAgICAgICBtaWRfY291bnQrPXN3cl9jb252ZXJ0KGZvcndfY3R4LCBhbWlkLCAzKlNBTVBMRVMsIChjb25zdCB1aW50OF90ICoqKWFpbiwgICAgICAgMCk7CisgICAgICAgICAgICBzaGlmdChhbWlkLCAgLXRtcF9jb3VudCwgb3V0X2NoX2NvdW50LCBvdXRfc2FtcGxlX2ZtdCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0X2NvdW50PSBzd3JfY29udmVydChiYWNrd19jdHgsYW91dCwgU0FNUExFUywgKGNvbnN0IHVpbnQ4X3QgKiopYW1pZCwgbWlkX2NvdW50KTsKKworICAgICAgICBmb3IoY2g9MDsgY2g8aW5fY2hfY291bnQ7IGNoKyspeworICAgICAgICAgICAgZG91YmxlIHNzZSwgbWF4ZGlmZj0wOworICAgICAgICAgICAgZG91YmxlIHN1bV9hPSAwOworICAgICAgICAgICAgZG91YmxlIHN1bV9iPSAwOworICAgICAgICAgICAgZG91YmxlIHN1bV9hYT0gMDsKKyAgICAgICAgICAgIGRvdWJsZSBzdW1fYmI9IDA7CisgICAgICAgICAgICBkb3VibGUgc3VtX2FiPSAwOworICAgICAgICAgICAgZm9yKGk9MDsgaTxvdXRfY291bnQ7IGkrKyl7CisgICAgICAgICAgICAgICAgZG91YmxlIGE9IGdldChhaW4gLCBjaCwgaSwgaW5fY2hfY291bnQsIGluX3NhbXBsZV9mbXQpOworICAgICAgICAgICAgICAgIGRvdWJsZSBiPSBnZXQoYW91dCwgY2gsIGksIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKKyAgICAgICAgICAgICAgICBzdW1fYSArPSBhOworICAgICAgICAgICAgICAgIHN1bV9iICs9IGI7CisgICAgICAgICAgICAgICAgc3VtX2FhKz0gYSphOworICAgICAgICAgICAgICAgIHN1bV9iYis9IGIqYjsKKyAgICAgICAgICAgICAgICBzdW1fYWIrPSBhKmI7CisgICAgICAgICAgICAgICAgbWF4ZGlmZj0gRkZNQVgobWF4ZGlmZiwgZmFicyhhLWIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzZT0gc3VtX2FhICsgc3VtX2JiIC0gMipzdW1fYWI7CisgICAgICAgICAgICBpZihzc2UgPCAwICYmIHNzZSA+IC0wLjAwMDAxKSBzc2U9MDsgLy9maXggcm91bmRpbmcgZXJyb3IKKworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJbZTolZiBjOiVmIG1heDolZl0gbGVuOiU1ZFxuIiwgb3V0X2NvdW50ID8gc3FydChzc2Uvb3V0X2NvdW50KSA6IDAsIHN1bV9hYi8oc3FydChzdW1fYWEqc3VtX2JiKSksIG1heGRpZmYsIG91dF9jb3VudCk7CisgICAgICAgIH0KKworICAgICAgICBmbHVzaF9pKys7CisgICAgICAgIGZsdXNoX2klPTIxOworICAgICAgICBmbHVzaF9jb3VudCA9IHN3cl9jb252ZXJ0KGJhY2t3X2N0eCxhb3V0LCBmbHVzaF9pLCAwLCAwKTsKKyAgICAgICAgc2hpZnQoYW91dCwgIGZsdXNoX2ksIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKKyAgICAgICAgZmx1c2hfY291bnQrPSBzd3JfY29udmVydChiYWNrd19jdHgsYW91dCwgU0FNUExFUy1mbHVzaF9pLCAwLCAwKTsKKyAgICAgICAgc2hpZnQoYW91dCwgLWZsdXNoX2ksIGluX2NoX2NvdW50LCBpbl9zYW1wbGVfZm10KTsKKyAgICAgICAgaWYoZmx1c2hfY291bnQpeworICAgICAgICAgICAgZm9yKGNoPTA7IGNoPGluX2NoX2NvdW50OyBjaCsrKXsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3NlLCBtYXhkaWZmPTA7CisgICAgICAgICAgICAgICAgZG91YmxlIHN1bV9hPSAwOworICAgICAgICAgICAgICAgIGRvdWJsZSBzdW1fYj0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3VtX2FhPSAwOworICAgICAgICAgICAgICAgIGRvdWJsZSBzdW1fYmI9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlIHN1bV9hYj0gMDsKKyAgICAgICAgICAgICAgICBmb3IoaT0wOyBpPGZsdXNoX2NvdW50OyBpKyspeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgYT0gZ2V0KGFpbiAsIGNoLCBpK291dF9jb3VudCwgaW5fY2hfY291bnQsIGluX3NhbXBsZV9mbXQpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgYj0gZ2V0KGFvdXQsIGNoLCBpLCBpbl9jaF9jb3VudCwgaW5fc2FtcGxlX2ZtdCk7CisgICAgICAgICAgICAgICAgICAgIHN1bV9hICs9IGE7CisgICAgICAgICAgICAgICAgICAgIHN1bV9iICs9IGI7CisgICAgICAgICAgICAgICAgICAgIHN1bV9hYSs9IGEqYTsKKyAgICAgICAgICAgICAgICAgICAgc3VtX2JiKz0gYipiOworICAgICAgICAgICAgICAgICAgICBzdW1fYWIrPSBhKmI7CisgICAgICAgICAgICAgICAgICAgIG1heGRpZmY9IEZGTUFYKG1heGRpZmYsIGZhYnMoYS1iKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNzZT0gc3VtX2FhICsgc3VtX2JiIC0gMipzdW1fYWI7CisgICAgICAgICAgICAgICAgaWYoc3NlIDwgMCAmJiBzc2UgPiAtMC4wMDAwMSkgc3NlPTA7IC8vZml4IHJvdW5kaW5nIGVycm9yCisKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIltlOiVmIGM6JWYgbWF4OiVmXSBsZW46JTVkIEY6JTNkXG4iLCBzcXJ0KHNzZS9mbHVzaF9jb3VudCksIHN1bV9hYi8oc3FydChzdW1fYWEqc3VtX2JiKSksIG1heGRpZmYsIGZsdXNoX2NvdW50LCBmbHVzaF9pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlic3dyZXNhbXBsZS92ZXJzaW9uLmggYi9saWJzd3Jlc2FtcGxlL3ZlcnNpb24uaAppbmRleCA4MzBmMDBlLi5lZmM0NjJmIDEwMDY0NAotLS0gYS9saWJzd3Jlc2FtcGxlL3ZlcnNpb24uaAorKysgYi9saWJzd3Jlc2FtcGxlL3ZlcnNpb24uaApAQCAtMjgsOSArMjgsOSBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgogCi0jZGVmaW5lIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiAgIDIKLSNkZWZpbmUgTElCU1dSRVNBTVBMRV9WRVJTSU9OX01JTk9SICAgMAotI2RlZmluZSBMSUJTV1JFU0FNUExFX1ZFUlNJT05fTUlDUk8gMTAxCisjZGVmaW5lIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NQUpPUiAgIDMKKyNkZWZpbmUgTElCU1dSRVNBTVBMRV9WRVJTSU9OX01JTk9SICAgMQorI2RlZmluZSBMSUJTV1JFU0FNUExFX1ZFUlNJT05fTUlDUk8gMTAwCiAKICNkZWZpbmUgTElCU1dSRVNBTVBMRV9WRVJTSU9OX0lOVCAgQVZfVkVSU0lPTl9JTlQoTElCU1dSRVNBTVBMRV9WRVJTSU9OX01BSk9SLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQlNXUkVTQU1QTEVfVkVSU0lPTl9NSU5PUiwgXApkaWZmIC0tZ2l0IGEvbGlic3dyZXNhbXBsZS94ODYvTWFrZWZpbGUgYi9saWJzd3Jlc2FtcGxlL3g4Ni9NYWtlZmlsZQppbmRleCBiZTQ0ZGY1Li5mYTA2NDFmIDEwMDY0NAotLS0gYS9saWJzd3Jlc2FtcGxlL3g4Ni9NYWtlZmlsZQorKysgYi9saWJzd3Jlc2FtcGxlL3g4Ni9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLVlBU00tT0JKUyAgICAgICAgICAgICAgICAgICAgICAgKz0geDg2L2F1ZGlvX2NvbnZlcnQub1wKK1g4NkFTTS1PQkpTICAgICAgICAgICAgICAgICAgICAgKz0geDg2L2F1ZGlvX2NvbnZlcnQub1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3JlbWF0cml4Lm9cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg4Ni9yZXNhbXBsZS5vXAogCmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL3g4Ni9yZW1hdHJpeF9pbml0LmMgYi9saWJzd3Jlc2FtcGxlL3g4Ni9yZW1hdHJpeF9pbml0LmMKaW5kZXggNWYyYzVmZS4uZDcxYjQxYSAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS94ODYvcmVtYXRyaXhfaW5pdC5jCisrKyBiL2xpYnN3cmVzYW1wbGUveDg2L3JlbWF0cml4X2luaXQuYwpAQCAtMzEsNyArMzEsNyBAQAogRChpbnQxNiwgc3NlMikKIAogYXZfY29sZCBpbnQgc3dyaV9yZW1hdHJpeF9pbml0X3g4NihzdHJ1Y3QgU3dyQ29udGV4dCAqcyl7Ci0jaWYgSEFWRV9ZQVNNCisjaWYgSEFWRV9YODZBU00KICAgICBpbnQgbW1fZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CiAgICAgaW50IG5iX2luICA9IGF2X2dldF9jaGFubmVsX2xheW91dF9uYl9jaGFubmVscyhzLT5pbl9jaF9sYXlvdXQpOwogICAgIGludCBuYl9vdXQgPSBhdl9nZXRfY2hhbm5lbF9sYXlvdXRfbmJfY2hhbm5lbHMocy0+b3V0X2NoX2xheW91dCk7CmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL3g4Ni9yZXNhbXBsZS5hc20gYi9saWJzd3Jlc2FtcGxlL3g4Ni9yZXNhbXBsZS5hc20KaW5kZXggNDk4OWFhNi4uNzEwN2NmOSAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS94ODYvcmVzYW1wbGUuYXNtCisrKyBiL2xpYnN3cmVzYW1wbGUveDg2L3Jlc2FtcGxlLmFzbQpAQCAtNDEsOCArNDEsNyBAQAogICAgIC5mcmFjOiAgICAgICAgICAgICAgICAgIHJlc2QgMQogICAgIC5zcmNfaW5jcjogICAgICAgICAgICAgIHJlc2QgMQogICAgIC5jb21wZW5zYXRpb25fZGlzdGFuY2U6IHJlc2QgMQotICAgIC5waGFzZV9zaGlmdDogICAgICAgICAgIHJlc2QgMQotICAgIC5waGFzZV9tYXNrOiAgICAgICAgICAgIHJlc2QgMQorICAgIC5waGFzZV9jb3VudDogICAgICAgICAgIHJlc2QgMQogCiAgICAgOyB0aGVyZSdzIGEgZmV3IG1vcmUgaGVyZSBidXQgd2Ugb25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCBmZXcKIGVuZHN0cnVjCkBAIC01NSwxMSArNTQsMTIgQEAKIAogU0VDVElPTiAudGV4dAogCis7IEZJWE1FIHJlbW92ZSB1bm5lZWRlZCB2YXJpYWJsZXMgKGluZGV4X2luY3IsIHBoYXNlX21hc2spCiAlbWFjcm8gUkVTQU1QTEVfRk5TIDMtNSA7IGZvcm1hdCBbZmxvYXQgb3IgaW50MTZdLCBicHMsIGxvZzJfYnBzLCBmbG9hdCBvcCBzdWZmaXggW3Mgb3IgZF0sIDEuMCBjb25zdGFudAogOyBpbnQgcmVzYW1wbGVfY29tbW9uXyRmb3JtYXQoUmVzYW1wbGVDb250ZXh0ICpjdHgsICRmb3JtYXQgKmRzdCwKIDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICRmb3JtYXQgKnNyYywgaW50IHNpemUsIGludCB1cGRhdGVfY3R4KQogJWlmIEFSQ0hfWDg2XzY0IDsgdW5peDY0IGFuZCB3aW42NAotY2dsb2JhbCByZXNhbXBsZV9jb21tb25fJTEsIDAsIDE1LCAyLCBjdHgsIGRzdCwgc3JjLCBwaGFzZV9zaGlmdCwgaW5kZXgsIGZyYWMsIFwKK2NnbG9iYWwgcmVzYW1wbGVfY29tbW9uXyUxLCAwLCAxNSwgMiwgY3R4LCBkc3QsIHNyYywgcGhhc2VfY291bnQsIGluZGV4LCBmcmFjLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9pbmNyX21vZCwgc2l6ZSwgbWluX2ZpbHRlcl9jb3VudF94NCwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZmlsdGVyX2xlbl94NCwgZHN0X2luY3JfZGl2LCBzcmNfaW5jciwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZV9tYXNrLCBkc3RfZW5kLCBmaWx0ZXJfYmFuawpAQCAtNzYsNyArNzYsNiBAQAogICAgIDsgbG9hZCBhcyBtYW55IHZhcmlhYmxlcyBpbiByZWdpc3RlcnMgYXMgcG9zc2libGU7IGZvciB0aGUgcmVzdCwgc3RvcmUKICAgICA7IG9uIHN0YWNrIHNvIHRoYXQgd2UgaGF2ZSAnY3R4JyBhdmFpbGFibGUgYXMgb25lIGV4dHJhIHJlZ2lzdGVyCiAgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZWQsIHIzZAotICAgIG1vdiAgICAgICAgICAgICAgICAgIHBoYXNlX21hc2tkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQucGhhc2VfbWFza10KICVpZiBVTklYNjQKICAgICBtb3YgICAgICAgIHVwZGF0ZV9jb250ZXh0X3N0YWNrZCwgcjRkCiAlZW5kaWYKQEAgLTkyLDE3ICs5MSwxNyBAQAogICAgIGxlYSAgICAgICAgICAgICAgICAgICAgIGRzdF9lbmRxLCBbZHN0cStzaXplcSolMl0KIAogJWlmIFVOSVg2NAotICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgZWN4LCBbY3R4cStSZXNhbXBsZUNvbnRleHQucGhhc2Vfc2hpZnRdCisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgICBlY3gsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9jb3VudF0KICAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaSwgW2N0eHErUmVzYW1wbGVDb250ZXh0LmZpbHRlcl9hbGxvY10KIAotICAgIERFRklORV9BUkdTIGZpbHRlcl9hbGxvYywgZHN0LCBzcmMsIHBoYXNlX3NoaWZ0LCBpbmRleCwgZnJhYywgZHN0X2luY3JfbW9kLCBcCisgICAgREVGSU5FX0FSR1MgZmlsdGVyX2FsbG9jLCBkc3QsIHNyYywgcGhhc2VfY291bnQsIGluZGV4LCBmcmFjLCBkc3RfaW5jcl9tb2QsIFwKICAgICAgICAgICAgICAgICBmaWx0ZXIsIG1pbl9maWx0ZXJfY291bnRfeDQsIG1pbl9maWx0ZXJfbGVuX3g0LCBkc3RfaW5jcl9kaXYsIFwKICAgICAgICAgICAgICAgICBzcmNfaW5jciwgcGhhc2VfbWFzaywgZHN0X2VuZCwgZmlsdGVyX2JhbmsKICVlbGlmIFdJTjY0CiAgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgICBSOWQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfYWxsb2NdCi0gICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgICBlY3gsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9zaGlmdF0KKyAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgIGVjeCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX2NvdW50XQogCi0gICAgREVGSU5FX0FSR1MgcGhhc2Vfc2hpZnQsIGRzdCwgc3JjLCBmaWx0ZXJfYWxsb2MsIGluZGV4LCBmcmFjLCBkc3RfaW5jcl9tb2QsIFwKKyAgICBERUZJTkVfQVJHUyBwaGFzZV9jb3VudCwgZHN0LCBzcmMsIGZpbHRlcl9hbGxvYywgaW5kZXgsIGZyYWMsIGRzdF9pbmNyX21vZCwgXAogICAgICAgICAgICAgICAgIGZpbHRlciwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIGRzdF9pbmNyX2RpdiwgXAogICAgICAgICAgICAgICAgIHNyY19pbmNyLCBwaGFzZV9tYXNrLCBkc3RfZW5kLCBmaWx0ZXJfYmFuawogJWVuZGlmCkBAIC0xMTIsNyArMTExLDcgQEAKICAgICBzdWIgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcSwgbWluX2ZpbHRlcl9sZW5feDRxCiAgICAgbW92ICAgICAgICAgICAgICAgICAgIHNyY19zdGFja3EsIHNyY3EKICVlbHNlIDsgeDg2LTMyCi1jZ2xvYmFsIHJlc2FtcGxlX2NvbW1vbl8lMSwgMSwgNywgMiwgY3R4LCBwaGFzZV9zaGlmdCwgZHN0LCBmcmFjLCBcCitjZ2xvYmFsIHJlc2FtcGxlX2NvbW1vbl8lMSwgMSwgNywgMiwgY3R4LCBwaGFzZV9jb3VudCwgZHN0LCBmcmFjLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIG1pbl9maWx0ZXJfbGVuZ3RoX3g0LCBmaWx0ZXJfYmFuawogCiAgICAgOyBwdXNoIHRlbXAgdmFyaWFibGVzIHRvIHN0YWNrCkBAIC0xMjcsNyArMTI2LDcgQEAKICAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdvcmQgW2N0eHErUmVzYW1wbGVDb250ZXh0LmRzdF9pbmNyX21vZF0KICAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdvcmQgW2N0eHErUmVzYW1wbGVDb250ZXh0LmZpbHRlcl9hbGxvY10KICAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjMKLSAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdvcmQgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX21hc2tdCisgICAgUFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3b3JkIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9jb3VudF0gIDsgdW5uZWVkZWQgcmVwbGFjZW1lbnQgZm9yIHBoYXNlX21hc2sKICAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdvcmQgW2N0eHErUmVzYW1wbGVDb250ZXh0LnNyY19pbmNyXQogICAgIG1vdiAgICAgICAgbWluX2ZpbHRlcl9sZW5ndGhfeDRkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZmlsdGVyX2xlbmd0aF0KICAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LmluZGV4XQpAQCAtMTM5LDkgKzEzOCw5IEBACiAgICAgc3ViICAgICAgICAgICAgICAgICBmaWx0ZXJfYmFua3EsIG1pbl9maWx0ZXJfbGVuZ3RoX3g0cQogICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZmlsdGVyX2xlbmd0aF94NHEKICAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2JhbmtxCi0gICAgbW92ICAgICAgICAgICAgICAgICBwaGFzZV9zaGlmdGQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9zaGlmdF0KKyAgICBtb3YgICAgICAgICAgICAgICAgIHBoYXNlX2NvdW50ZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX2NvdW50XQogCi0gICAgREVGSU5FX0FSR1Mgc3JjLCBwaGFzZV9zaGlmdCwgZHN0LCBmcmFjLCBpbmRleCwgbWluX2ZpbHRlcl9jb3VudF94NCwgZmlsdGVyCisgICAgREVGSU5FX0FSR1Mgc3JjLCBwaGFzZV9jb3VudCwgZHN0LCBmcmFjLCBpbmRleCwgbWluX2ZpbHRlcl9jb3VudF94NCwgZmlsdGVyCiAKICVkZWZpbmUgZmlsdGVyX2JhbmtxICAgICAgICAgIGR3b3JkIFtyc3ArMHgwXQogJWRlZmluZSBtaW5fZmlsdGVyX2xlbmd0aF94NHEgZHdvcmQgW3JzcCsweDRdCkBAIC0yMDQsNyArMjAzLDcgQEAKICAgICA7IGhvcml6b250YWwgc3VtICYgc3RvcmUKICVpZiBtbXNpemUgPT0gMzIKICAgICB2ZXh0cmFjdGYxMjggICAgICAgICAgICAgICAgIHhtMSwgbTAsIDB4MQotICAgIGFkZHBzICAgICAgICAgICAgICAgICAgICAgICAgeG0wLCB4bTEKKyAgICBhZGRwJTQgICAgICAgICAgICAgICAgICAgICAgIHhtMCwgeG0xCiAlZW5kaWYKICAgICBtb3ZobHBzICAgICAgICAgICAgICAgICAgICAgIHhtMSwgeG0wCiAlaWZpZG4gJTEsIGZsb2F0CkBAIC0yMjIsMjggKzIyMSwzMiBAQAogICAgIGluYyAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkCiAKICVpZiBVTklYNjQKLSAgICBERUZJTkVfQVJHUyBmaWx0ZXJfYWxsb2MsIGRzdCwgc3JjLCBwaGFzZV9zaGlmdCwgaW5kZXgsIGZyYWMsIGRzdF9pbmNyX21vZCwgXAorICAgIERFRklORV9BUkdTIGZpbHRlcl9hbGxvYywgZHN0LCBzcmMsIHBoYXNlX2NvdW50LCBpbmRleCwgZnJhYywgZHN0X2luY3JfbW9kLCBcCiAgICAgICAgICAgICAgICAgaW5kZXhfaW5jciwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIGRzdF9pbmNyX2RpdiwgXAogICAgICAgICAgICAgICAgIHNyY19pbmNyLCBwaGFzZV9tYXNrLCBkc3RfZW5kLCBmaWx0ZXJfYmFuawogJWVsaWYgV0lONjQKLSAgICBERUZJTkVfQVJHUyBwaGFzZV9zaGlmdCwgZHN0LCBzcmMsIGZpbHRlcl9hbGxvYywgaW5kZXgsIGZyYWMsIGRzdF9pbmNyX21vZCwgXAorICAgIERFRklORV9BUkdTIHBoYXNlX2NvdW50LCBkc3QsIHNyYywgZmlsdGVyX2FsbG9jLCBpbmRleCwgZnJhYywgZHN0X2luY3JfbW9kLCBcCiAgICAgICAgICAgICAgICAgaW5kZXhfaW5jciwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIGRzdF9pbmNyX2RpdiwgXAogICAgICAgICAgICAgICAgIHNyY19pbmNyLCBwaGFzZV9tYXNrLCBkc3RfZW5kLCBmaWx0ZXJfYmFuawogJWVsc2UgOyB4ODYtMzIKLSAgICBERUZJTkVfQVJHUyBzcmMsIHBoYXNlX3NoaWZ0LCBkc3QsIGZyYWMsIGluZGV4LCBpbmRleF9pbmNyCisgICAgREVGSU5FX0FSR1Mgc3JjLCBwaGFzZV9jb3VudCwgZHN0LCBmcmFjLCBpbmRleCwgaW5kZXhfaW5jcgogJWVuZGlmCiAKIC5za2lwOgotICAgIG1vdiAgICAgICAgICAgICAgICAgIGluZGV4X2luY3JkLCBpbmRleGQKICAgICBhZGQgICAgICAgICAgICAgICAgICAgICAgICAgZHN0cSwgJTIKLSAgICBhbmQgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZCwgcGhhc2VfbWFza2QKLSAgICBzYXIgICAgICAgICAgICAgICAgICBpbmRleF9pbmNyZCwgcGhhc2Vfc2hpZnRiCi0gICAgbGVhICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3EsIFtzcmNxK2luZGV4X2luY3JxKiUyXQorICAgIGNtcCAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkLCBwaGFzZV9jb3VudGQKKyAgICBqYiAuaW5kZXhfc2tpcAorLmluZGV4X3doaWxlOgorICAgIHN1YiAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkLCBwaGFzZV9jb3VudGQKKyAgICBsZWEgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcSwgW3NyY3ErJTJdCisgICAgY21wICAgICAgICAgICAgICAgICAgICAgICBpbmRleGQsIHBoYXNlX2NvdW50ZAorICAgIGpuYiAuaW5kZXhfd2hpbGUKKy5pbmRleF9za2lwOgogICAgIGNtcCAgICAgICAgICAgICAgICAgICAgICAgICBkc3RxLCBkc3RfZW5kcQogICAgIGpuZSAubG9vcAogCiAlaWYgQVJDSF9YODZfNjQKLSAgICBERUZJTkVfQVJHUyBjdHgsIGRzdCwgc3JjLCBwaGFzZV9zaGlmdCwgaW5kZXgsIGZyYWMKKyAgICBERUZJTkVfQVJHUyBjdHgsIGRzdCwgc3JjLCBwaGFzZV9jb3VudCwgaW5kZXgsIGZyYWMKICVlbHNlIDsgeDg2LTMyCiAgICAgREVGSU5FX0FSR1Mgc3JjLCBjdHgsIHVwZGF0ZV9jb250ZXh0LCBmcmFjLCBpbmRleAogJWVuZGlmCkBAIC0yNzAsMTQgKzI3MywxNCBAQAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYywgaW50IHNpemUsIGludCB1cGRhdGVfY3R4KQogJWlmIEFSQ0hfWDg2XzY0IDsgdW5peDY0IGFuZCB3aW42NAogJWlmIFVOSVg2NAotY2dsb2JhbCByZXNhbXBsZV9saW5lYXJfJTEsIDAsIDE1LCA1LCBjdHgsIGRzdCwgcGhhc2VfbWFzaywgcGhhc2Vfc2hpZnQsIGluZGV4LCBmcmFjLCBcCitjZ2xvYmFsIHJlc2FtcGxlX2xpbmVhcl8lMSwgMCwgMTUsIDUsIGN0eCwgZHN0LCBwaGFzZV9tYXNrLCBwaGFzZV9jb3VudCwgaW5kZXgsIGZyYWMsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgZHN0X2luY3JfbW9kLCBtaW5fZmlsdGVyX2NvdW50X3g0LCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9maWx0ZXJfbGVuX3g0LCBkc3RfaW5jcl9kaXYsIHNyY19pbmNyLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0X2VuZCwgZmlsdGVyX2JhbmsKIAogICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICBzcmNxLCByMm1wCiAlZWxzZSA7IHdpbjY0Ci1jZ2xvYmFsIHJlc2FtcGxlX2xpbmVhcl8lMSwgMCwgMTUsIDUsIGN0eCwgcGhhc2VfbWFzaywgc3JjLCBwaGFzZV9zaGlmdCwgaW5kZXgsIGZyYWMsIFwKK2NnbG9iYWwgcmVzYW1wbGVfbGluZWFyXyUxLCAwLCAxNSwgNSwgY3R4LCBwaGFzZV9tYXNrLCBzcmMsIHBoYXNlX2NvdW50LCBpbmRleCwgZnJhYywgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBkc3RfaW5jcl9tb2QsIG1pbl9maWx0ZXJfY291bnRfeDQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX2ZpbHRlcl9sZW5feDQsIGRzdF9pbmNyX2Rpdiwgc3JjX2luY3IsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBkc3RfZW5kLCBmaWx0ZXJfYmFuawpAQCAtMjk4LDcgKzMwMSw2IEBACiAgICAgOyBsb2FkIGFzIG1hbnkgdmFyaWFibGVzIGluIHJlZ2lzdGVycyBhcyBwb3NzaWJsZTsgZm9yIHRoZSByZXN0LCBzdG9yZQogICAgIDsgb24gc3RhY2sgc28gdGhhdCB3ZSBoYXZlICdjdHgnIGF2YWlsYWJsZSBhcyBvbmUgZXh0cmEgcmVnaXN0ZXIKICAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICBzaXplZCwgcjNkCi0gICAgbW92ICAgICAgICAgICAgICAgICAgcGhhc2VfbWFza2QsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9tYXNrXQogJWlmIFVOSVg2NAogICAgIG1vdiAgICAgICAgdXBkYXRlX2NvbnRleHRfc3RhY2tkLCByNGQKICVlbmRpZgpAQCAtMzA4LDcgKzMxMCw2IEBACiAgICAgbW92ICAgICAgICAgICAgICAgICBmaWx0ZXJfYmFua3EsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfYmFua10KICAgICBtb3YgICAgICAgICAgICAgICAgICAgIHNyY19pbmNyZCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LnNyY19pbmNyXQogICAgIG1vdiAgICAgICAgICAgICAgICAgICBjdHhfc3RhY2txLCBjdHhxCi0gICAgbW92ICAgICAgICAgICAgcGhhc2VfbWFza19zdGFja2QsIHBoYXNlX21hc2tkCiAgICAgbW92ICAgICAgICAgICBtaW5fZmlsdGVyX2xlbl94NGQsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfbGVuZ3RoXQogJWlmaWRuICUxLCBpbnQxNgogICAgIG1vdmQgICAgICAgICAgICAgICAgICAgICAgICAgIG00LCBbcGRfMHg0MDAwXQpAQCAtMzIyLDE3ICszMjMsMTcgQEAKICAgICBsZWEgICAgICAgICAgICAgICAgICAgICBkc3RfZW5kcSwgW2RzdHErc2l6ZXEqJTJdCiAKICVpZiBVTklYNjQKLSAgICBtb3YgICAgICAgICAgICAgICAgICAgICAgICAgIGVjeCwgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX3NoaWZ0XQorICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgZWN4LCBbY3R4cStSZXNhbXBsZUNvbnRleHQucGhhc2VfY291bnRdCiAgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgICBlZGksIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5maWx0ZXJfYWxsb2NdCiAKLSAgICBERUZJTkVfQVJHUyBmaWx0ZXJfYWxsb2MsIGRzdCwgZmlsdGVyMiwgcGhhc2Vfc2hpZnQsIGluZGV4LCBmcmFjLCBmaWx0ZXIxLCBcCisgICAgREVGSU5FX0FSR1MgZmlsdGVyX2FsbG9jLCBkc3QsIGZpbHRlcjIsIHBoYXNlX2NvdW50LCBpbmRleCwgZnJhYywgZmlsdGVyMSwgXAogICAgICAgICAgICAgICAgIGRzdF9pbmNyX21vZCwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIFwKICAgICAgICAgICAgICAgICBkc3RfaW5jcl9kaXYsIHNyY19pbmNyLCBzcmMsIGRzdF9lbmQsIGZpbHRlcl9iYW5rCiAlZWxpZiBXSU42NAogICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgUjlkLCBbY3R4cStSZXNhbXBsZUNvbnRleHQuZmlsdGVyX2FsbG9jXQotICAgIG1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgZWN4LCBbY3R4cStSZXNhbXBsZUNvbnRleHQucGhhc2Vfc2hpZnRdCisgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgICBlY3gsIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9jb3VudF0KIAotICAgIERFRklORV9BUkdTIHBoYXNlX3NoaWZ0LCBmaWx0ZXIyLCBzcmMsIGZpbHRlcl9hbGxvYywgaW5kZXgsIGZyYWMsIGZpbHRlcjEsIFwKKyAgICBERUZJTkVfQVJHUyBwaGFzZV9jb3VudCwgZmlsdGVyMiwgc3JjLCBmaWx0ZXJfYWxsb2MsIGluZGV4LCBmcmFjLCBmaWx0ZXIxLCBcCiAgICAgICAgICAgICAgICAgZHN0X2luY3JfbW9kLCBtaW5fZmlsdGVyX2NvdW50X3g0LCBtaW5fZmlsdGVyX2xlbl94NCwgXAogICAgICAgICAgICAgICAgIGRzdF9pbmNyX2Rpdiwgc3JjX2luY3IsIGRzdCwgZHN0X2VuZCwgZmlsdGVyX2JhbmsKICVlbmRpZgpAQCAtMzYxLDcgKzM2Miw3IEBACiAgICAgc2hsICAgICAgICAgICAgICAgICAgICAgICAgICAgcjMsICUzCiAgICAgUFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIzCiAgICAgbW92ICAgICAgICAgICAgICAgICAgICAgICAgICAgcjMsIGR3b3JkIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5zcmNfaW5jcl0KLSAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdvcmQgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX21hc2tdCisgICAgUFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3b3JkIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9jb3VudF0gIDsgdW5uZWVkZWQgcmVwbGFjZW1lbnQgb2YgcGhhc2VfbWFzawogICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICByM2QKICVpZmlkbiAlMSwgaW50MTYKICAgICBtb3ZkICAgICAgICAgICAgICAgICAgICAgICAgICBtNCwgW3BkXzB4NDAwMF0KQEAgLTM4MCwxMSArMzgxLDExIEBACiAgICAgc3ViICAgICAgICAgICAgICAgICBmaWx0ZXJfYmFua3EsIG1pbl9maWx0ZXJfbGVuZ3RoX3g0cQogICAgIFBVU0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZmlsdGVyX2xlbmd0aF94NHEKICAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2JhbmtxCi0gICAgUFVTSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3b3JkIFtjdHhxK1Jlc2FtcGxlQ29udGV4dC5waGFzZV9zaGlmdF0KKyAgICBQVVNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdvcmQgW2N0eHErUmVzYW1wbGVDb250ZXh0LnBoYXNlX2NvdW50XQogCiAgICAgREVGSU5FX0FSR1MgZmlsdGVyMSwgbWluX2ZpbHRlcl9jb3VudF94NCwgZmlsdGVyMiwgZnJhYywgaW5kZXgsIGRzdCwgc3JjCiAKLSVkZWZpbmUgcGhhc2Vfc2hpZnRfc3RhY2tkICAgIGR3b3JkIFtyc3ArMHgwXQorJWRlZmluZSBwaGFzZV9jb3VudF9zdGFja2QgICAgZHdvcmQgW3JzcCsweDBdCiAlZGVmaW5lIGZpbHRlcl9iYW5rcSAgICAgICAgICBkd29yZCBbcnNwKzB4NF0KICVkZWZpbmUgbWluX2ZpbHRlcl9sZW5ndGhfeDRxIGR3b3JkIFtyc3ArMHg4XQogJWRlZmluZSBzcmNfaW5jcmQgICAgICAgICAgICAgZHdvcmQgW3JzcCsweGNdCkBAIC00ODgsOCArNDg5LDggQEAKICVpZiBtbXNpemUgPT0gMzIKICAgICB2ZXh0cmFjdGYxMjggICAgICAgICAgICAgICAgIHhtMSwgbTAsIDB4MQogICAgIHZleHRyYWN0ZjEyOCAgICAgICAgICAgICAgICAgeG0zLCBtMiwgMHgxCi0gICAgYWRkcHMgICAgICAgICAgICAgICAgICAgICAgICB4bTAsIHhtMQotICAgIGFkZHBzICAgICAgICAgICAgICAgICAgICAgICAgeG0yLCB4bTMKKyAgICBhZGRwJTQgICAgICAgICAgICAgICAgICAgICAgIHhtMCwgeG0xCisgICAgYWRkcCU0ICAgICAgICAgICAgICAgICAgICAgICB4bTIsIHhtMwogJWVuZGlmCiAgICAgY3Z0c2kycyU0ICAgICAgICAgICAgICAgICAgICB4bTEsIGZyYWNkCiAgICAgc3VicCU0ICAgICAgICAgICAgICAgICAgICAgICB4bTIsIHhtMApAQCAtNTE5LDM1ICs1MjAsMzkgQEAKICAgICBpbmMgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZAogCiAlaWYgVU5JWDY0Ci0gICAgREVGSU5FX0FSR1MgZmlsdGVyX2FsbG9jLCBkc3QsIGZpbHRlcjIsIHBoYXNlX3NoaWZ0LCBpbmRleCwgZnJhYywgaW5kZXhfaW5jciwgXAorICAgIERFRklORV9BUkdTIGZpbHRlcl9hbGxvYywgZHN0LCBmaWx0ZXIyLCBwaGFzZV9jb3VudCwgaW5kZXgsIGZyYWMsIGluZGV4X2luY3IsIFwKICAgICAgICAgICAgICAgICBkc3RfaW5jcl9tb2QsIG1pbl9maWx0ZXJfY291bnRfeDQsIG1pbl9maWx0ZXJfbGVuX3g0LCBcCiAgICAgICAgICAgICAgICAgZHN0X2luY3JfZGl2LCBzcmNfaW5jciwgc3JjLCBkc3RfZW5kLCBmaWx0ZXJfYmFuawogJWVsaWYgV0lONjQKLSAgICBERUZJTkVfQVJHUyBwaGFzZV9zaGlmdCwgZmlsdGVyMiwgc3JjLCBmaWx0ZXJfYWxsb2MsIGluZGV4LCBmcmFjLCBpbmRleF9pbmNyLCBcCisgICAgREVGSU5FX0FSR1MgcGhhc2VfY291bnQsIGZpbHRlcjIsIHNyYywgZmlsdGVyX2FsbG9jLCBpbmRleCwgZnJhYywgaW5kZXhfaW5jciwgXAogICAgICAgICAgICAgICAgIGRzdF9pbmNyX21vZCwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIFwKICAgICAgICAgICAgICAgICBkc3RfaW5jcl9kaXYsIHNyY19pbmNyLCBkc3QsIGRzdF9lbmQsIGZpbHRlcl9iYW5rCiAlZWxzZSA7IHg4Ni0zMgotICAgIERFRklORV9BUkdTIGZpbHRlcjEsIHBoYXNlX3NoaWZ0LCBpbmRleF9pbmNyLCBmcmFjLCBpbmRleCwgZHN0LCBzcmMKKyAgICBERUZJTkVfQVJHUyBmaWx0ZXIxLCBwaGFzZV9jb3VudCwgaW5kZXhfaW5jciwgZnJhYywgaW5kZXgsIGRzdCwgc3JjCiAlZW5kaWYKIAogLnNraXA6CiAlaWYgQVJDSF9YODZfMzIKLSAgICBtb3YgICAgICAgICAgICAgICAgIHBoYXNlX3NoaWZ0ZCwgcGhhc2Vfc2hpZnRfc3RhY2tkCisgICAgbW92ICAgICAgICAgICAgICAgICBwaGFzZV9jb3VudGQsIHBoYXNlX2NvdW50X3N0YWNrZAogJWVuZGlmCi0gICAgbW92ICAgICAgICAgICAgICAgICAgaW5kZXhfaW5jcmQsIGluZGV4ZAogICAgIGFkZCAgICAgICAgICAgICAgICAgICAgICAgICBkc3RxLCAlMgotICAgIGFuZCAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhkLCBwaGFzZV9tYXNrX3N0YWNrZAotICAgIHNhciAgICAgICAgICAgICAgICAgIGluZGV4X2luY3JkLCBwaGFzZV9zaGlmdGIKLSAgICBsZWEgICAgICAgICAgICAgICAgICAgICAgICAgc3JjcSwgW3NyY3EraW5kZXhfaW5jcnEqJTJdCisgICAgY21wICAgICAgICAgICAgICAgICAgICAgICBpbmRleGQsIHBoYXNlX2NvdW50ZAorICAgIGpiIC5pbmRleF9za2lwCisuaW5kZXhfd2hpbGU6CisgICAgc3ViICAgICAgICAgICAgICAgICAgICAgICBpbmRleGQsIHBoYXNlX2NvdW50ZAorICAgIGxlYSAgICAgICAgICAgICAgICAgICAgICAgICBzcmNxLCBbc3JjcSslMl0KKyAgICBjbXAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZCwgcGhhc2VfY291bnRkCisgICAgam5iIC5pbmRleF93aGlsZQorLmluZGV4X3NraXA6CiAgICAgY21wICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHEsIGRzdF9lbmRxCiAgICAgam5lIC5sb29wCiAKICVpZiBVTklYNjQKLSAgICBERUZJTkVfQVJHUyBjdHgsIGRzdCwgZmlsdGVyMiwgcGhhc2Vfc2hpZnQsIGluZGV4LCBmcmFjLCBpbmRleF9pbmNyLCBcCisgICAgREVGSU5FX0FSR1MgY3R4LCBkc3QsIGZpbHRlcjIsIHBoYXNlX2NvdW50LCBpbmRleCwgZnJhYywgaW5kZXhfaW5jciwgXAogICAgICAgICAgICAgICAgIGRzdF9pbmNyX21vZCwgbWluX2ZpbHRlcl9jb3VudF94NCwgbWluX2ZpbHRlcl9sZW5feDQsIFwKICAgICAgICAgICAgICAgICBkc3RfaW5jcl9kaXYsIHNyY19pbmNyLCBzcmMsIGRzdF9lbmQsIGZpbHRlcl9iYW5rCiAlZWxpZiBXSU42NAotICAgIERFRklORV9BUkdTIGN0eCwgZmlsdGVyMiwgc3JjLCBwaGFzZV9zaGlmdCwgaW5kZXgsIGZyYWMsIGluZGV4X2luY3IsIFwKKyAgICBERUZJTkVfQVJHUyBjdHgsIGZpbHRlcjIsIHNyYywgcGhhc2VfY291bnQsIGluZGV4LCBmcmFjLCBpbmRleF9pbmNyLCBcCiAgICAgICAgICAgICAgICAgZHN0X2luY3JfbW9kLCBtaW5fZmlsdGVyX2NvdW50X3g0LCBtaW5fZmlsdGVyX2xlbl94NCwgXAogICAgICAgICAgICAgICAgIGRzdF9pbmNyX2Rpdiwgc3JjX2luY3IsIGRzdCwgZHN0X2VuZCwgZmlsdGVyX2JhbmsKICVlbHNlIDsgeDg2LTMyCkBAIC02MDMsMyArNjA4LDEyIEBACiAKIElOSVRfWE1NIHNzZTIKIFJFU0FNUExFX0ZOUyBkb3VibGUsIDgsIDMsIGQsIHBkYmxfMQorCislaWYgSEFWRV9BVlhfRVhURVJOQUwKK0lOSVRfWU1NIGF2eAorUkVTQU1QTEVfRk5TIGRvdWJsZSwgOCwgMywgZCwgcGRibF8xCislZW5kaWYKKyVpZiBIQVZFX0ZNQTNfRVhURVJOQUwKK0lOSVRfWU1NIGZtYTMKK1JFU0FNUExFX0ZOUyBkb3VibGUsIDgsIDMsIGQsIHBkYmxfMQorJWVuZGlmCmRpZmYgLS1naXQgYS9saWJzd3Jlc2FtcGxlL3g4Ni9yZXNhbXBsZV9pbml0LmMgYi9saWJzd3Jlc2FtcGxlL3g4Ni9yZXNhbXBsZV9pbml0LmMKaW5kZXggOWQ3ZDVjZi4uYzZiMmEzNiAxMDA2NDQKLS0tIGEvbGlic3dyZXNhbXBsZS94ODYvcmVzYW1wbGVfaW5pdC5jCisrKyBiL2xpYnN3cmVzYW1wbGUveDg2L3Jlc2FtcGxlX2luaXQuYwpAQCAtNDIsNiArNDIsOCBAQAogUkVTQU1QTEVfRlVOQ1MoZmxvYXQsICBmbWEzKTsKIFJFU0FNUExFX0ZVTkNTKGZsb2F0LCAgZm1hNCk7CiBSRVNBTVBMRV9GVU5DUyhkb3VibGUsIHNzZTIpOworUkVTQU1QTEVfRlVOQ1MoZG91YmxlLCBhdngpOworUkVTQU1QTEVfRlVOQ1MoZG91YmxlLCBmbWEzKTsKIAogYXZfY29sZCB2b2lkIHN3cmlfcmVzYW1wbGVfZHNwX3g4Nl9pbml0KFJlc2FtcGxlQ29udGV4dCAqYykKIHsKQEAgLTUwLDQwICs1Miw0OCBAQAogICAgIHN3aXRjaChjLT5mb3JtYXQpewogICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9TMTZQOgogICAgICAgICBpZiAoQVJDSF9YODZfMzIgJiYgRVhURVJOQUxfTU1YRVhUKG1tX2ZsYWdzKSkgewotICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlID0gYy0+bGluZWFyID8gZmZfcmVzYW1wbGVfbGluZWFyX2ludDE2X21teGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfcmVzYW1wbGVfY29tbW9uX2ludDE2X21teGV4dDsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgPSBmZl9yZXNhbXBsZV9saW5lYXJfaW50MTZfbW14ZXh0OworICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX2NvbW1vbiA9IGZmX3Jlc2FtcGxlX2NvbW1vbl9pbnQxNl9tbXhleHQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIobW1fZmxhZ3MpKSB7Ci0gICAgICAgICAgICBjLT5kc3AucmVzYW1wbGUgPSBjLT5saW5lYXIgPyBmZl9yZXNhbXBsZV9saW5lYXJfaW50MTZfc3NlMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfcmVzYW1wbGVfY29tbW9uX2ludDE2X3NzZTI7CisgICAgICAgICAgICBjLT5kc3AucmVzYW1wbGVfbGluZWFyID0gZmZfcmVzYW1wbGVfbGluZWFyX2ludDE2X3NzZTI7CisgICAgICAgICAgICBjLT5kc3AucmVzYW1wbGVfY29tbW9uID0gZmZfcmVzYW1wbGVfY29tbW9uX2ludDE2X3NzZTI7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEVYVEVSTkFMX1hPUChtbV9mbGFncykpIHsKLSAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZSA9IGMtPmxpbmVhciA/IGZmX3Jlc2FtcGxlX2xpbmVhcl9pbnQxNl94b3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZmX3Jlc2FtcGxlX2NvbW1vbl9pbnQxNl94b3A7CisgICAgICAgICAgICBjLT5kc3AucmVzYW1wbGVfbGluZWFyID0gZmZfcmVzYW1wbGVfbGluZWFyX2ludDE2X3hvcDsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9jb21tb24gPSBmZl9yZXNhbXBsZV9jb21tb25faW50MTZfeG9wOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfU0FNUExFX0ZNVF9GTFRQOgogICAgICAgICBpZiAoRVhURVJOQUxfU1NFKG1tX2ZsYWdzKSkgewotICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlID0gYy0+bGluZWFyID8gZmZfcmVzYW1wbGVfbGluZWFyX2Zsb2F0X3NzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfcmVzYW1wbGVfY29tbW9uX2Zsb2F0X3NzZTsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgPSBmZl9yZXNhbXBsZV9saW5lYXJfZmxvYXRfc3NlOworICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX2NvbW1vbiA9IGZmX3Jlc2FtcGxlX2NvbW1vbl9mbG9hdF9zc2U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEVYVEVSTkFMX0FWWF9GQVNUKG1tX2ZsYWdzKSkgewotICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlID0gYy0+bGluZWFyID8gZmZfcmVzYW1wbGVfbGluZWFyX2Zsb2F0X2F2eAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmZfcmVzYW1wbGVfY29tbW9uX2Zsb2F0X2F2eDsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgPSBmZl9yZXNhbXBsZV9saW5lYXJfZmxvYXRfYXZ4OworICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX2NvbW1vbiA9IGZmX3Jlc2FtcGxlX2NvbW1vbl9mbG9hdF9hdng7CiAgICAgICAgIH0KICAgICAgICAgaWYgKEVYVEVSTkFMX0ZNQTNfRkFTVChtbV9mbGFncykpIHsKLSAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZSA9IGMtPmxpbmVhciA/IGZmX3Jlc2FtcGxlX2xpbmVhcl9mbG9hdF9mbWEzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmZl9yZXNhbXBsZV9jb21tb25fZmxvYXRfZm1hMzsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgPSBmZl9yZXNhbXBsZV9saW5lYXJfZmxvYXRfZm1hMzsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9jb21tb24gPSBmZl9yZXNhbXBsZV9jb21tb25fZmxvYXRfZm1hMzsKICAgICAgICAgfQogICAgICAgICBpZiAoRVhURVJOQUxfRk1BNChtbV9mbGFncykpIHsKLSAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZSA9IGMtPmxpbmVhciA/IGZmX3Jlc2FtcGxlX2xpbmVhcl9mbG9hdF9mbWE0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmZl9yZXNhbXBsZV9jb21tb25fZmxvYXRfZm1hNDsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgPSBmZl9yZXNhbXBsZV9saW5lYXJfZmxvYXRfZm1hNDsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9jb21tb24gPSBmZl9yZXNhbXBsZV9jb21tb25fZmxvYXRfZm1hNDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIEFWX1NBTVBMRV9GTVRfREJMUDoKICAgICAgICAgaWYgKEVYVEVSTkFMX1NTRTIobW1fZmxhZ3MpKSB7Ci0gICAgICAgICAgICBjLT5kc3AucmVzYW1wbGUgPSBjLT5saW5lYXIgPyBmZl9yZXNhbXBsZV9saW5lYXJfZG91YmxlX3NzZTIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZmX3Jlc2FtcGxlX2NvbW1vbl9kb3VibGVfc3NlMjsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgPSBmZl9yZXNhbXBsZV9saW5lYXJfZG91YmxlX3NzZTI7CisgICAgICAgICAgICBjLT5kc3AucmVzYW1wbGVfY29tbW9uID0gZmZfcmVzYW1wbGVfY29tbW9uX2RvdWJsZV9zc2UyOworICAgICAgICB9CisgICAgICAgIGlmIChFWFRFUk5BTF9BVlhfRkFTVChtbV9mbGFncykpIHsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9saW5lYXIgPSBmZl9yZXNhbXBsZV9saW5lYXJfZG91YmxlX2F2eDsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9jb21tb24gPSBmZl9yZXNhbXBsZV9jb21tb25fZG91YmxlX2F2eDsKKyAgICAgICAgfQorICAgICAgICBpZiAoRVhURVJOQUxfRk1BM19GQVNUKG1tX2ZsYWdzKSkgeworICAgICAgICAgICAgYy0+ZHNwLnJlc2FtcGxlX2xpbmVhciA9IGZmX3Jlc2FtcGxlX2xpbmVhcl9kb3VibGVfZm1hMzsKKyAgICAgICAgICAgIGMtPmRzcC5yZXNhbXBsZV9jb21tb24gPSBmZl9yZXNhbXBsZV9jb21tb25fZG91YmxlX2ZtYTM7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9NYWtlZmlsZSBiL2xpYnN3c2NhbGUvTWFrZWZpbGUKaW5kZXggYTlmOWUwMy4uNWUwM2U2ZiAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9NYWtlZmlsZQorKysgYi9saWJzd3NjYWxlL01ha2VmaWxlCkBAIC0xLDI0ICsxLDIzIEBACi1pbmNsdWRlICQoU1VCRElSKS4uL2NvbmZpZy5tYWsKLQogTkFNRSA9IHN3c2NhbGUKK0RFU0MgPSBGRm1wZWcgaW1hZ2UgcmVzY2FsaW5nIGxpYnJhcnkKIAogSEVBREVSUyA9IHN3c2NhbGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIHZlcnNpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiBPQkpTID0gYWxwaGFibGVuZC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBoc2NhbGUubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIGhzY2FsZV9mYXN0X2JpbGluZWFyLm8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgZ2FtbWEubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBpbnB1dC5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIG9wdGlvbnMubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgb3V0cHV0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICByZ2IycmdiLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIHNsaWNlLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc3dzY2FsZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBzd3NjYWxlX3Vuc2NhbGVkLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgIHV0aWxzLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgeXV2MnJnYi5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBzbGljZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGhzY2FsZS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdnNjYWxlLm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBnYW1tYS5vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiBPQkpTLSQoQ09ORklHX1NIQVJFRCkgICAgICAgICs9IGxvZzJfdGFiLm8KIApAQCAtMjYsNCArMjUsNSBAQAogU0xJQk9CSlMtJChIQVZFX0dOVV9XSU5EUkVTKSArPSBzd3NjYWxlcmVzLm8KIAogVEVTVFBST0dTID0gY29sb3JzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcGl4ZGVzY19xdWVyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgc3dzY2FsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9hYXJjaDY0L01ha2VmaWxlIGIvbGlic3dzY2FsZS9hYXJjaDY0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTNmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzd3NjYWxlL2FhcmNoNjQvTWFrZWZpbGUKQEAgLTAsMCArMSw2IEBACitPQkpTICAgICAgICArPSBhYXJjaDY0L3N3c2NhbGUubyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICBhYXJjaDY0L3N3c2NhbGVfdW5zY2FsZWQubyAgICAgICBcCisKK05FT04tT0JKUyAgICs9IGFhcmNoNjQvaHNjYWxlLm8gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGFhcmNoNjQvb3V0cHV0Lm8gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGFhcmNoNjQveXV2MnJnYl9uZW9uLm8gICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvYWFyY2g2NC9oc2NhbGUuUyBiL2xpYnN3c2NhbGUvYWFyY2g2NC9oc2NhbGUuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzc4YzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGlic3dzY2FsZS9hYXJjaDY0L2hzY2FsZS5TCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2zDqW1lbnQgQsWTc2NoIDxjbGVtZW50IHN0dXBlZmxpeC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKworZnVuY3Rpb24gZmZfaHNjYWxlXzhfdG9fMTVfbmVvbiwgZXhwb3J0PTEKKyAgICAgICAgYWRkICAgICAgICAgICAgICAgICB4MTAsIHg0LCB3NiwgVVhUVyAjMSAgICAgICAgLy8gZmlsdGVyMiA9IGZpbHRlciArIGZpbHRlclNpemUqMiAoeDIgYmVjYXVzZSBpbnQxNikKKzE6ICAgICAgbGRyICAgICAgICAgICAgICAgICB3OCwgW3g1XSwgIzQgICAgICAgICAgICAgICAgLy8gZmlsdGVyUG9zWzBdCisgICAgICAgIGxkciAgICAgICAgICAgICAgICAgdzksIFt4NV0sICM0ICAgICAgICAgICAgICAgIC8vIGZpbHRlclBvc1sxXQorICAgICAgICBtb3ZpICAgICAgICAgICAgICAgIHY0LjRTLCAjMCAgICAgICAgICAgICAgICAgICAvLyB2YWwgc3VtIHBhcnQgMSAoZm9yIGRzdFswXSkKKyAgICAgICAgbW92aSAgICAgICAgICAgICAgICB2NS40UywgIzAgICAgICAgICAgICAgICAgICAgLy8gdmFsIHN1bSBwYXJ0IDIgKGZvciBkc3RbMV0pCisgICAgICAgIG1vdiAgICAgICAgICAgICAgICAgdzcsIHc2ICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbHRlclNpemUgY291bnRlcgorICAgICAgICBtb3YgICAgICAgICAgICAgICAgIHgxMywgeDMgICAgICAgICAgICAgICAgICAgICAvLyBzcmNwID0gc3JjCisyOiAgICAgIGFkZCAgICAgICAgICAgICAgICAgeDExLCB4MTMsIHc4LCBVWFRXICAgICAgICAgIC8vIHNyY3AgKyBmaWx0ZXJQb3NbMF0KKyAgICAgICAgYWRkICAgICAgICAgICAgICAgICB4MTIsIHgxMywgdzksIFVYVFcgICAgICAgICAgLy8gc3JjcCArIGZpbHRlclBvc1sxXQorICAgICAgICBsZDEgICAgICAgICAgICAgICAgIHt2MC44Qn0sIFt4MTFdICAgICAgICAgICAgICAvLyBzcmNwW2ZpbHRlclBvc1swXSArIHswLi43fV0KKyAgICAgICAgbGQxICAgICAgICAgICAgICAgICB7djEuOEJ9LCBbeDEyXSAgICAgICAgICAgICAgLy8gc3JjcFtmaWx0ZXJQb3NbMV0gKyB7MC4uN31dCisgICAgICAgIGxkMSAgICAgICAgICAgICAgICAge3YyLjhIfSwgW3g0XSwgICMxNiAgICAgICAgIC8vIGxvYWQgOHgxNi1iaXQgZmlsdGVyIHZhbHVlcywgcGFydCAxCisgICAgICAgIGxkMSAgICAgICAgICAgICAgICAge3YzLjhIfSwgW3gxMF0sICMxNiAgICAgICAgIC8vIGRpdHRvIGF0IGZpbHRlcitmaWx0ZXJTaXplIGZvciBwYXJ0IDIKKyAgICAgICAgdXh0bCAgICAgICAgICAgICAgICB2MC44SCwgdjAuOEIgICAgICAgICAgICAgICAgLy8gdW5wYWNrIHBhcnQgMSB0byAxNi1iaXQKKyAgICAgICAgdXh0bCAgICAgICAgICAgICAgICB2MS44SCwgdjEuOEIgICAgICAgICAgICAgICAgLy8gdW5wYWNrIHBhcnQgMiB0byAxNi1iaXQKKyAgICAgICAgc211bGwgICAgICAgICAgICAgICB2MTYuNFMsIHYwLjRILCB2Mi40SCAgICAgICAgLy8gdjE2LmkzMnswLi4zfSA9IHBhcnQgMSBvZjogc3JjcFtmaWx0ZXJQb3NbMF0gKyB7MC4uN31dICogZmlsdGVyW3swLi43fV0KKyAgICAgICAgc211bGwgICAgICAgICAgICAgICB2MTguNFMsIHYxLjRILCB2My40SCAgICAgICAgLy8gdjE4LmkzMnswLi4zfSA9IHBhcnQgMSBvZjogc3JjcFtmaWx0ZXJQb3NbMV0gKyB7MC4uN31dICogZmlsdGVyW3swLi43fV0KKyAgICAgICAgc211bGwyICAgICAgICAgICAgICB2MTcuNFMsIHYwLjhILCB2Mi44SCAgICAgICAgLy8gdjE3LmkzMnswLi4zfSA9IHBhcnQgMiBvZjogc3JjcFtmaWx0ZXJQb3NbMF0gKyB7MC4uN31dICogZmlsdGVyW3swLi43fV0KKyAgICAgICAgc211bGwyICAgICAgICAgICAgICB2MTkuNFMsIHYxLjhILCB2My44SCAgICAgICAgLy8gdjE5LmkzMnswLi4zfSA9IHBhcnQgMiBvZjogc3JjcFtmaWx0ZXJQb3NbMV0gKyB7MC4uN31dICogZmlsdGVyW3swLi43fV0KKyAgICAgICAgYWRkcCAgICAgICAgICAgICAgICB2MTYuNFMsIHYxNi40UywgdjE3LjRTICAgICAgLy8gaG9yaXpvbnRhbCBwYWlyIGFkZGluZyBvZiB0aGUgOHgzMi1iaXQgbXVsdGlwbGllZCB2YWx1ZXMgZm9yIHBhcnQgMSBpbnRvIDR4MzItYml0CisgICAgICAgIGFkZHAgICAgICAgICAgICAgICAgdjE4LjRTLCB2MTguNFMsIHYxOS40UyAgICAgIC8vIGhvcml6b250YWwgcGFpciBhZGRpbmcgb2YgdGhlIDh4MzItYml0IG11bHRpcGxpZWQgdmFsdWVzIGZvciBwYXJ0IDIgaW50byA0eDMyLWJpdAorICAgICAgICBhZGQgICAgICAgICAgICAgICAgIHY0LjRTLCB2NC40UywgdjE2LjRTICAgICAgICAvLyB1cGRhdGUgdmFsIGFjY3VtdWxhdG9yIGZvciBwYXJ0IDEKKyAgICAgICAgYWRkICAgICAgICAgICAgICAgICB2NS40UywgdjUuNFMsIHYxOC40UyAgICAgICAgLy8gdXBkYXRlIHZhbCBhY2N1bXVsYXRvciBmb3IgcGFydCAyCisgICAgICAgIGFkZCAgICAgICAgICAgICAgICAgeDEzLCB4MTMsICM4ICAgICAgICAgICAgICAgIC8vIHNyY3AgKz0gOAorICAgICAgICBzdWJzICAgICAgICAgICAgICAgIHc3LCB3NywgIzggICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzZWQgOC9maWx0ZXJTaXplCisgICAgICAgIGIuZ3QgICAgICAgICAgICAgICAgMmIgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlubmVyIGxvb3AgaWYgZmlsdGVyU2l6ZSBub3QgY29uc3VtZWQgY29tcGxldGVseQorICAgICAgICBtb3YgICAgICAgICAgICAgICAgIHg0LCB4MTAgICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgPSBmaWx0ZXIyCisgICAgICAgIGFkZCAgICAgICAgICAgICAgICAgeDEwLCB4MTAsIHc2LCBVWFRXICMxICAgICAgIC8vIGZpbHRlcjIgKz0gZmlsdGVyU2l6ZSoyCisgICAgICAgIGFkZHAgICAgICAgICAgICAgICAgdjQuNFMsIHY0LjRTLCB2NS40UyAgICAgICAgIC8vIGhvcml6b250YWwgcGFpciBhZGRpbmcgb2YgdGhlIDh4MzItYml0IHN1bXMgaW50byA0eDMyLWJpdAorICAgICAgICBhZGRwICAgICAgICAgICAgICAgIHY0LjRTLCB2NC40UywgdjQuNFMgICAgICAgICAvLyBob3Jpem9udGFsIHBhaXIgYWRkaW5nIG9mIHRoZSA0eDMyLWJpdCBzdW1zIGludG8gMngzMi1iaXQKKyAgICAgICAgc3FzaHJuICAgICAgICAgICAgICB2NC40SCwgdjQuNFMsICM3ICAgICAgICAgICAgLy8gc2hpZnQgYW5kIGNsaXAgdGhlIDJ4MTYtYml0IGZpbmFsIHZhbHVlcworICAgICAgICBzdDEgICAgICAgICAgICAgICAgIHt2NC5TfVswXSwgW3gxXSwgIzQgICAgICAgICAvLyB3cml0ZSB0byBkZXN0aW5hdGlvbgorICAgICAgICBzdWJzICAgICAgICAgICAgICAgIHcyLCB3MiwgIzIgICAgICAgICAgICAgICAgICAvLyBkc3RXIC09IDIKKyAgICAgICAgYi5ndCAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCB1bnRpbCBlbmQgb2YgbGluZQorICAgICAgICByZXQKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvYWFyY2g2NC9vdXRwdXQuUyBiL2xpYnN3c2NhbGUvYWFyY2g2NC9vdXRwdXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQzYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGlic3dzY2FsZS9hYXJjaDY0L291dHB1dC5TCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2zDqW1lbnQgQsWTc2NoIDxjbGVtZW50IHN0dXBlZmxpeC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKworZnVuY3Rpb24gZmZfeXV2MnBsYW5lWF84X25lb24sIGV4cG9ydD0xCisgICAgICAgIGxkMSAgICAgICAgICAgICAgICAge3YwLjhCfSwgW3g1XSAgICAgICAgICAgICAgICAgICAvLyBsb2FkIDh4OC1iaXQgZGl0aGVyCisgICAgICAgIGNieiAgICAgICAgICAgICAgICAgdzYsIDFmICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBvZmZzZXR0aW5nIHByZXNlbnQKKyAgICAgICAgZXh0ICAgICAgICAgICAgICAgICB2MC44QiwgdjAuOEIsIHYwLjhCLCAjMyAgICAgICAgIC8vIGhvbm9yIG9mZnNldHRpbmcgd2hpY2ggY2FuIGJlIDAgb3IgMyBvbmx5CisxOiAgICAgIHV4dGwgICAgICAgICAgICAgICAgdjAuOEgsIHYwLjhCICAgICAgICAgICAgICAgICAgICAvLyBleHRlbmQgZGl0aGVyIHRvIDE2LWJpdAorICAgICAgICB1c2hsbCAgICAgICAgICAgICAgIHYxLjRTLCB2MC40SCwgIzEyICAgICAgICAgICAgICAgLy8gZXh0ZW5kIGRpdGhlciB0byAzMi1iaXQgd2l0aCBsZWZ0IHNoaWZ0IGJ5IDEyIChwYXJ0IDEpCisgICAgICAgIHVzaGxsMiAgICAgICAgICAgICAgdjIuNFMsIHYwLjhILCAjMTIgICAgICAgICAgICAgICAvLyBleHRlbmQgZGl0aGVyIHRvIDMyLWJpdCB3aXRoIGxlZnQgc2hpZnQgYnkgMTIgKHBhcnQgMikKKyAgICAgICAgbW92ICAgICAgICAgICAgICAgICB4NywgIzAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGkgPSAwCisyOiAgICAgIG1vdiAgICAgICAgICAgICAgICAgdjMuMTZCLCB2MS4xNkIgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGFjY3VtdWxhdG9yIHBhcnQgMSB3aXRoIGRpdGhlcmluZyB2YWx1ZQorICAgICAgICBtb3YgICAgICAgICAgICAgICAgIHY0LjE2QiwgdjIuMTZCICAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBhY2N1bXVsYXRvciBwYXJ0IDIgd2l0aCBkaXRoZXJpbmcgdmFsdWUKKyAgICAgICAgbW92ICAgICAgICAgICAgICAgICB3OCwgdzEgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRtcGZpbHRlclNpemUgPSBmaWx0ZXJTaXplCisgICAgICAgIG1vdiAgICAgICAgICAgICAgICAgeDksIHgyICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmNwICAgID0gc3JjCisgICAgICAgIG1vdiAgICAgICAgICAgICAgICAgeDEwLCB4MCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXJwID0gZmlsdGVyCiszOiAgICAgIGxkcCAgICAgICAgICAgICAgICAgeDExLCB4MTIsIFt4OV0sICMxNiAgICAgICAgICAgICAvLyBnZXQgMiBwb2ludGVyczogc3JjW2pdIGFuZCBzcmNbaisxXQorICAgICAgICBhZGQgICAgICAgICAgICAgICAgIHgxMSwgeDExLCB4NywgbHNsICMxICAgICAgICAgICAgLy8gJnNyY1tqICBdW2ldCisgICAgICAgIGFkZCAgICAgICAgICAgICAgICAgeDEyLCB4MTIsIHg3LCBsc2wgIzEgICAgICAgICAgICAvLyAmc3JjW2orMV1baV0KKyAgICAgICAgbGQxICAgICAgICAgICAgICAgICB7djUuOEh9LCBbeDExXSAgICAgICAgICAgICAgICAgIC8vIHJlYWQgOHgxNi1iaXQgQCBzcmNbaiAgXVtpICsgezAuLjd9XTogQSxCLEMsRCxFLEYsRyxICisgICAgICAgIGxkMSAgICAgICAgICAgICAgICAge3Y2LjhIfSwgW3gxMl0gICAgICAgICAgICAgICAgICAvLyByZWFkIDh4MTYtYml0IEAgc3JjW2orMV1baSArIHswLi43fV06IEksSixLLEwsTSxOLE8sUAorICAgICAgICBsZHIgICAgICAgICAgICAgICAgIHcxMSwgW3gxMF0sICM0ICAgICAgICAgICAgICAgICAgLy8gcmVhZCAyeDE2LWJpdCBjb2VmZnMgKFgsIFkpIGF0IChmaWx0ZXJbal0sIGZpbHRlcltqKzFdKQorICAgICAgICB6aXAxICAgICAgICAgICAgICAgIHYxNi44SCwgdjUuOEgsIHY2LjhIICAgICAgICAgICAgLy8gQSxJLEIsSixDLEssRCxMCisgICAgICAgIHppcDIgICAgICAgICAgICAgICAgdjE3LjhILCB2NS44SCwgdjYuOEggICAgICAgICAgICAvLyBFLE0sRixOLEYsTyxILFAKKyAgICAgICAgZHVwICAgICAgICAgICAgICAgICB2Ny40UywgdzExICAgICAgICAgICAgICAgICAgICAgIC8vIFgsWSxYLFksWCxZLFgsWQorICAgICAgICBzbXVsbCAgICAgICAgICAgICAgIHYxOC40UywgdjE2LjRILCB2Ny40SCAgICAgICAgICAgLy8gQS5YIEkuWSBCLlggSi5ZCisgICAgICAgIHNtdWxsICAgICAgICAgICAgICAgdjIwLjRTLCB2MTcuNEgsIHY3LjRIICAgICAgICAgICAvLyBFLlggTS5ZIEYuWCBOLlkKKyAgICAgICAgc211bGwyICAgICAgICAgICAgICB2MTkuNFMsIHYxNi44SCwgdjcuOEggICAgICAgICAgIC8vIEMuWCBLLlkgRC5YIEwuWQorICAgICAgICBzbXVsbDIgICAgICAgICAgICAgIHYyMS40UywgdjE3LjhILCB2Ny44SCAgICAgICAgICAgLy8gRy5YIE8uWSBILlggUC5ZCisgICAgICAgIGFkZHAgICAgICAgICAgICAgICAgdjE2LjRTLCB2MTguNFMsIHYxOS40UyAgICAgICAgICAvLyBBLlgrSS5ZIEIuWCtKLlkgQy5YK0suWSBELlgrTC5ZCisgICAgICAgIGFkZHAgICAgICAgICAgICAgICAgdjE3LjRTLCB2MjAuNFMsIHYyMS40UyAgICAgICAgICAvLyBFLlgrTS5ZIEYuWCtOLlkgRi5YK08uWSBILlgrUC5ZCisgICAgICAgIGFkZCAgICAgICAgICAgICAgICAgdjMuNFMsIHYzLjRTLCB2MTYuNFMgICAgICAgICAgICAvLyB1cGRhdGUgdmFsIGFjY3VtdWxhdG9yIGZvciBwYXJ0IDEKKyAgICAgICAgYWRkICAgICAgICAgICAgICAgICB2NC40UywgdjQuNFMsIHYxNy40UyAgICAgICAgICAgIC8vIHVwZGF0ZSB2YWwgYWNjdW11bGF0b3IgZm9yIHBhcnQgMgorICAgICAgICBzdWJzICAgICAgICAgICAgICAgIHc4LCB3OCwgIzIgICAgICAgICAgICAgICAgICAgICAgLy8gdG1wZmlsdGVyU2l6ZSAtPSAyCisgICAgICAgIGIuZ3QgICAgICAgICAgICAgICAgM2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29wIHVudGlsIGZpbHRlclNpemUgY29uc3VtZWQKKyAgICAgICAgc3NociAgICAgICAgICAgICAgICB2My40UywgdjMuNFMsICMxOSAgICAgICAgICAgICAgIC8vIHZhbD4+MTkgKHBhcnQgMSkKKyAgICAgICAgc3NociAgICAgICAgICAgICAgICB2NC40UywgdjQuNFMsICMxOSAgICAgICAgICAgICAgIC8vIHZhbD4+MTkgKHBhcnQgMikKKyAgICAgICAgc3F4dHVuICAgICAgICAgICAgICB2My40SCwgdjMuNFMgICAgICAgICAgICAgICAgICAgIC8vIGNsaXAxNih2YWw+PjE5KSAocGFydCAxKQorICAgICAgICBzcXh0dW4gICAgICAgICAgICAgIHY0LjRILCB2NC40UyAgICAgICAgICAgICAgICAgICAgLy8gY2xpcDE2KHZhbD4+MTkpIChwYXJ0IDIpCisgICAgICAgIG1vdiAgICAgICAgICAgICAgICAgdjMuRFsxXSwgdjQuRFswXSAgICAgICAgICAgICAgICAvLyBtZXJnZSBwYXJ0IDEgYW5kIHBhcnQgMgorICAgICAgICB1cXh0biAgICAgICAgICAgICAgIHYzLjhCLCB2My44SCAgICAgICAgICAgICAgICAgICAgLy8gY2xpcDgodmFsPj4xOSkKKyAgICAgICAgc3QxICAgICAgICAgICAgICAgICB7djMuMUR9LCBbeDNdLCAjOCAgICAgICAgICAgICAgIC8vIHdyaXRlIHRvIGRlc3RpbmF0aW9uCisgICAgICAgIGFkZCAgICAgICAgICAgICAgICAgeDcsIHg3LCAjOCAgICAgICAgICAgICAgICAgICAgICAvLyBpICs9IDgKKyAgICAgICAgc3VicyAgICAgICAgICAgICAgICB3NCwgdzQsICM4ICAgICAgICAgICAgICAgICAgICAgIC8vIGRzdFcgLT0gOAorICAgICAgICBiLmd0ICAgICAgICAgICAgICAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9vcCB1bnRpbCB3aWR0aCBjb25zdW1lZAorICAgICAgICByZXQKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvYWFyY2g2NC9zd3NjYWxlLmMgYi9saWJzd3NjYWxlL2FhcmNoNjQvc3dzY2FsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YTNiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzd3NjYWxlL2FhcmNoNjQvc3dzY2FsZS5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZS5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgorCit2b2lkIGZmX2hzY2FsZV84X3RvXzE1X25lb24oU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IGludDE2X3QgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpmaWx0ZXJQb3MsIGludCBmaWx0ZXJTaXplKTsKKwordm9pZCBmZl95dXYycGxhbmVYXzhfbmVvbihjb25zdCBpbnQxNl90ICpmaWx0ZXIsIGludCBmaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqc3JjLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KTsKKworYXZfY29sZCB2b2lkIGZmX3N3c19pbml0X3N3c2NhbGVfYWFyY2g2NChTd3NDb250ZXh0ICpjKQoreworICAgIGludCBjcHVfZmxhZ3MgPSBhdl9nZXRfY3B1X2ZsYWdzKCk7CisKKyAgICBpZiAoaGF2ZV9uZW9uKGNwdV9mbGFncykpIHsKKyAgICAgICAgaWYgKGMtPnNyY0JwYyA9PSA4ICYmIGMtPmRzdEJwYyA8PSAxNCkgeworICAgICAgICAgICAgYy0+aHlTY2FsZSA9IGMtPmhjU2NhbGUgPSBmZl9oc2NhbGVfOF90b18xNV9uZW9uOworICAgICAgICB9CisgICAgICAgIGlmIChjLT5kc3RCcGMgPT0gOCkgeworICAgICAgICAgICAgYy0+eXV2MnBsYW5lWCA9IGZmX3l1djJwbGFuZVhfOF9uZW9uOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9hYXJjaDY0L3N3c2NhbGVfdW5zY2FsZWQuYyBiL2xpYnN3c2NhbGUvYWFyY2g2NC9zd3NjYWxlX3Vuc2NhbGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxZGFhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYnN3c2NhbGUvYWFyY2g2NC9zd3NjYWxlX3Vuc2NhbGVkLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZS5oIgorI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgorCisjZGVmaW5lIFlVVl9UT19SR0JfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+eXV2MnJnYl92MnJfY29lZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjLT55dXYycmdiX3UyZ19jb2VmZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGMtPnl1djJyZ2JfdjJnX2NvZWZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+eXV2MnJnYl91MmJfY29lZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIERFQ0xBUkVfRkZfWVVWWF9UT19SR0JYX0ZVTkNTKGlmbXQsIG9mbXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ludCBmZl8jI2lmbXQjI190b18jI29mbXQjI19uZW9uKGludCB3LCBpbnQgaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgbGluZXNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBpbnQgbGluZXNpemVZLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UsIGludCBsaW5lc2l6ZVUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViwgaW50IGxpbmVzaXplViwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICp0YWJsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X29mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfY29lZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBpbnQgaWZtdCMjX3RvXyMjb2ZtdCMjX25lb25fd3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkgeyAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNl90IHl1djJyZ2JfdGFibGVbXSA9IHsgWVVWX1RPX1JHQl9UQUJMRSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmZfIyNpZm10IyNfdG9fIyNvZm10IyNfbmVvbihjLT5zcmNXLCBzcmNTbGljZUgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXSwgZHN0U3RyaWRlWzBdLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWzBdLCBzcmNTdHJpZGVbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbMV0sIHNyY1N0cmlkZVsxXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1syXSwgc3JjU3RyaWRlWzJdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnJnYl90YWJsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT55dXYycmdiX3lfb2Zmc2V0ID4+IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnl1djJyZ2JfeV9jb2VmZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBERUNMQVJFX0ZGX1lVVlhfVE9fQUxMX1JHQlhfRlVOQ1MoeXV2eCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitERUNMQVJFX0ZGX1lVVlhfVE9fUkdCWF9GVU5DUyh5dXZ4LCBhcmdiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFQ0xBUkVfRkZfWVVWWF9UT19SR0JYX0ZVTkNTKHl1dngsIHJnYmEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVDTEFSRV9GRl9ZVVZYX1RPX1JHQlhfRlVOQ1MoeXV2eCwgYWJncikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitERUNMQVJFX0ZGX1lVVlhfVE9fUkdCWF9GVU5DUyh5dXZ4LCBiZ3JhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworREVDTEFSRV9GRl9ZVVZYX1RPX0FMTF9SR0JYX0ZVTkNTKHl1djQyMHApCitERUNMQVJFX0ZGX1lVVlhfVE9fQUxMX1JHQlhfRlVOQ1MoeXV2NDIycCkKKworI2RlZmluZSBERUNMQVJFX0ZGX05WWF9UT19SR0JYX0ZVTkNTKGlmbXQsIG9mbXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnQgZmZfIyNpZm10IyNfdG9fIyNvZm10IyNfbmVvbihpbnQgdywgaW50IGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgaW50IGxpbmVzaXplWSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNDLCBpbnQgbGluZXNpemVDLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnRhYmxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfb2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9jb2VmZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIGludCBpZm10IyNfdG9fIyNvZm10IyNfbmVvbl93cmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLCBpbnQgc3JjU2xpY2VILCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RbXSwgaW50IGRzdFN0cmlkZVtdKSB7ICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2X3QgeXV2MnJnYl90YWJsZVtdID0geyBZVVZfVE9fUkdCX1RBQkxFIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8jI2lmbXQjI190b18jI29mbXQjI19uZW9uKGMtPnNyY1csIHNyY1NsaWNlSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdICsgc3JjU2xpY2VZICogZHN0U3RyaWRlWzBdLCBkc3RTdHJpZGVbMF0sICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbMF0sIHNyY1N0cmlkZVswXSwgc3JjWzFdLCBzcmNTdHJpZGVbMV0sICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl1djJyZ2JfdGFibGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+eXV2MnJnYl95X29mZnNldCA+PiA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT55dXYycmdiX3lfY29lZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworI2RlZmluZSBERUNMQVJFX0ZGX05WWF9UT19BTExfUkdCWF9GVU5DUyhudngpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitERUNMQVJFX0ZGX05WWF9UT19SR0JYX0ZVTkNTKG52eCwgYXJnYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFQ0xBUkVfRkZfTlZYX1RPX1JHQlhfRlVOQ1MobnZ4LCByZ2JhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVDTEFSRV9GRl9OVlhfVE9fUkdCWF9GVU5DUyhudngsIGFiZ3IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitERUNMQVJFX0ZGX05WWF9UT19SR0JYX0ZVTkNTKG52eCwgYmdyYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworREVDTEFSRV9GRl9OVlhfVE9fQUxMX1JHQlhfRlVOQ1MobnYxMikKK0RFQ0xBUkVfRkZfTlZYX1RPX0FMTF9SR0JYX0ZVTkNTKG52MjEpCisKKy8qIFdlIG5lZWQgYSAxNiBwaXhlbCB3aWR0aCBhbGlnbm1lbnQuIFRoaXMgY29uc3RyYWludCBjYW4gZWFzaWx5IGJlIHJlbW92ZWQKKyAqIGZvciBpbnB1dCByZWFkaW5nIGJ1dCBmb3IgdGhlIG91dHB1dCB3aGljaCBpcyA0LWJ5dGVzIHBlciBwaXhlbCAoUkdCQSkgdGhlCisgKiBhc3NlbWJseSBtaWdodCBiZSB3cml0aW5nIGFzIG11Y2ggYXMgNCoxNT02MCBleHRyYSBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZQorICogbGluZSwgd2hpY2ggd29uJ3QgZml0IHRoZSAzMi1ieXRlcyBidWZmZXIgYWxpZ25tZW50LiAqLworI2RlZmluZSBTRVRfRkZfTlZYX1RPX1JHQlhfRlVOQyhpZm10LCBJRk1ULCBvZm10LCBPRk1ULCBhY2N1cmF0ZV9ybmQpIGRvIHsgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGMtPnNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UXyMjSUZNVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgJiYgYy0+ZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfIyNPRk1UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAmJiAhKGMtPnNyY0ggJiAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICYmICEoYy0+c3JjVyAmIDE1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgJiYgIWFjY3VyYXRlX3JuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjLT5zd3NjYWxlID0gaWZtdCMjX3RvXyMjb2ZtdCMjX25lb25fd3JhcHBlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNFVF9GRl9OVlhfVE9fQUxMX1JHQlhfRlVOQyhudngsIE5WWCwgYWNjdXJhdGVfcm5kKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfRkZfTlZYX1RPX1JHQlhfRlVOQyhudngsIE5WWCwgYXJnYiwgQVJHQiwgYWNjdXJhdGVfcm5kKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNFVF9GRl9OVlhfVE9fUkdCWF9GVU5DKG52eCwgTlZYLCByZ2JhLCBSR0JBLCBhY2N1cmF0ZV9ybmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0VUX0ZGX05WWF9UT19SR0JYX0ZVTkMobnZ4LCBOVlgsIGFiZ3IsIEFCR1IsIGFjY3VyYXRlX3JuZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTRVRfRkZfTlZYX1RPX1JHQlhfRlVOQyhudngsIE5WWCwgYmdyYSwgQkdSQSwgYWNjdXJhdGVfcm5kKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfbmVvbihTd3NDb250ZXh0ICpjKSB7CisgICAgaW50IGFjY3VyYXRlX3JuZCA9IGMtPmZsYWdzICYgU1dTX0FDQ1VSQVRFX1JORDsKKworICAgIFNFVF9GRl9OVlhfVE9fQUxMX1JHQlhfRlVOQyhudjEyLCBOVjEyLCBhY2N1cmF0ZV9ybmQpOworICAgIFNFVF9GRl9OVlhfVE9fQUxMX1JHQlhfRlVOQyhudjIxLCBOVjIxLCBhY2N1cmF0ZV9ybmQpOworICAgIFNFVF9GRl9OVlhfVE9fQUxMX1JHQlhfRlVOQyh5dXY0MjBwLCBZVVY0MjBQLCBhY2N1cmF0ZV9ybmQpOworICAgIFNFVF9GRl9OVlhfVE9fQUxMX1JHQlhfRlVOQyh5dXY0MjJwLCBZVVY0MjJQLCBhY2N1cmF0ZV9ybmQpOworfQorCit2b2lkIGZmX2dldF91bnNjYWxlZF9zd3NjYWxlX2FhcmNoNjQoU3dzQ29udGV4dCAqYykKK3sKKyAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkKKyAgICAgICAgZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfbmVvbihjKTsKK30KZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvYWFyY2g2NC95dXYycmdiX25lb24uUyBiL2xpYnN3c2NhbGUvYWFyY2g2NC95dXYycmdiX25lb24uUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzQ0NmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGlic3dzY2FsZS9hYXJjaDY0L3l1djJyZ2JfbmVvbi5TCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IE1hdHRoaWV1IEJvdXJvbiA8bWF0dGhpZXUuYm91cm9uIHN0dXBlZmxpeC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2zDqW1lbnQgQsWTc2NoIDxjbGVtZW50IHN0dXBlZmxpeC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvYWFyY2g2NC9hc20uUyIKKworLm1hY3JvIGxvYWRfeW9mZl95Y29lZmYgeW9mZiB5Y29lZmYKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyAgICBsZHAgICAgICAgICAgICAgICAgIHc5LCB3MTAsIFtzcCwgI1x5b2ZmXQorI2Vsc2UKKyAgICBsZHIgICAgICAgICAgICAgICAgIHc5LCAgW3NwLCAjXHlvZmZdCisgICAgbGRyICAgICAgICAgICAgICAgICB3MTAsIFtzcCwgI1x5Y29lZmZdCisjZW5kaWYKKy5lbmRtCisKKy5tYWNybyBsb2FkX2FyZ3NfbnYxMgorICAgIGxkciAgICAgICAgICAgICAgICAgeDgsICBbc3BdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFibGUKKyAgICBsb2FkX3lvZmZfeWNvZWZmICAgIDgsIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHlfb2Zmc2V0LCB5X2NvZWZmCisgICAgbGQxICAgICAgICAgICAgICAgICB7djEuMUR9LCBbeDhdCisgICAgZHVwICAgICAgICAgICAgICAgICB2MC44SCwgdzEwCisgICAgZHVwICAgICAgICAgICAgICAgICB2My44SCwgdzkKKyAgICBzdWIgICAgICAgICAgICAgICAgIHczLCB3MywgdzAsIGxzbCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHczID0gbGluZXNpemUgIC0gd2lkdGggKiA0IChwYWRkaW5nKQorICAgIHN1YiAgICAgICAgICAgICAgICAgdzUsIHc1LCB3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdzUgPSBsaW5lc2l6ZVkgLSB3aWR0aCAgICAgKHBhZGRpbmdZKQorICAgIHN1YiAgICAgICAgICAgICAgICAgdzcsIHc3LCB3MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdzcgPSBsaW5lc2l6ZUMgLSB3aWR0aCAgICAgKHBhZGRpbmdDKQorICAgIG5lZyAgICAgICAgICAgICAgICAgdzExLCB3MAorLmVuZG0KKworLm1hY3JvIGxvYWRfYXJnc19udjIxCisgICAgbG9hZF9hcmdzX252MTIKKy5lbmRtCisKKy5tYWNybyBsb2FkX2FyZ3NfeXV2NDIwcAorICAgIGxkciAgICAgICAgICAgICAgICAgeDEzLCBbc3BdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjVgorICAgIGxkciAgICAgICAgICAgICAgICAgdzE0LCBbc3AsICM4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGluZXNpemVWCisgICAgbGRyICAgICAgICAgICAgICAgICB4OCwgIFtzcCwgIzE2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZQorICAgIGxvYWRfeW9mZl95Y29lZmYgICAgMjQsIDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geV9vZmZzZXQsIHlfY29lZmYKKyAgICBsZDEgICAgICAgICAgICAgICAgIHt2MS4xRH0sIFt4OF0KKyAgICBkdXAgICAgICAgICAgICAgICAgIHYwLjhILCB3MTAKKyAgICBkdXAgICAgICAgICAgICAgICAgIHYzLjhILCB3OQorICAgIHN1YiAgICAgICAgICAgICAgICAgdzMsIHczLCB3MCwgbHNsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdzMgPSBsaW5lc2l6ZSAgLSB3aWR0aCAqIDQgKHBhZGRpbmcpCisgICAgc3ViICAgICAgICAgICAgICAgICB3NSwgdzUsIHcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3NSA9IGxpbmVzaXplWSAtIHdpZHRoICAgICAocGFkZGluZ1kpCisgICAgc3ViICAgICAgICAgICAgICAgICB3NywgIHc3LCAgdzAsIGxzciAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3NyAgPSBsaW5lc2l6ZVUgLSB3aWR0aCAvIDIgKHBhZGRpbmdVKQorICAgIHN1YiAgICAgICAgICAgICAgICAgdzE0LCB3MTQsIHcwLCBsc3IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdzE0ID0gbGluZXNpemVWIC0gd2lkdGggLyAyIChwYWRkaW5nVikKKyAgICBsc3IgICAgICAgICAgICAgICAgIHcxMSwgdzAsICMxCisgICAgbmVnICAgICAgICAgICAgICAgICB3MTEsIHcxMQorLmVuZG0KKworLm1hY3JvIGxvYWRfYXJnc195dXY0MjJwCisgICAgbGRyICAgICAgICAgICAgICAgICB4MTMsIFtzcF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmNWCisgICAgbGRyICAgICAgICAgICAgICAgICB3MTQsIFtzcCwgIzhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaW5lc2l6ZVYKKyAgICBsZHIgICAgICAgICAgICAgICAgIHg4LCAgW3NwLCAjMTZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlCisgICAgbG9hZF95b2ZmX3ljb2VmZiAgICAyNCwgMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB5X29mZnNldCwgeV9jb2VmZgorICAgIGxkMSAgICAgICAgICAgICAgICAge3YxLjFEfSwgW3g4XQorICAgIGR1cCAgICAgICAgICAgICAgICAgdjAuOEgsIHcxMAorICAgIGR1cCAgICAgICAgICAgICAgICAgdjMuOEgsIHc5CisgICAgc3ViICAgICAgICAgICAgICAgICB3MywgdzMsIHcwLCBsc2wgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3MyA9IGxpbmVzaXplICAtIHdpZHRoICogNCAocGFkZGluZykKKyAgICBzdWIgICAgICAgICAgICAgICAgIHc1LCB3NSwgdzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHc1ID0gbGluZXNpemVZIC0gd2lkdGggICAgIChwYWRkaW5nWSkKKyAgICBzdWIgICAgICAgICAgICAgICAgIHc3LCAgdzcsICB3MCwgbHNyICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHc3ICA9IGxpbmVzaXplVSAtIHdpZHRoIC8gMiAocGFkZGluZ1UpCisgICAgc3ViICAgICAgICAgICAgICAgICB3MTQsIHcxNCwgdzAsIGxzciAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3MTQgPSBsaW5lc2l6ZVYgLSB3aWR0aCAvIDIgKHBhZGRpbmdWKQorLmVuZG0KKworLm1hY3JvIGxvYWRfY2hyb21hX252MTIKKyAgICBsZDIgICAgICAgICAgICAgICAgIHt2MTYuOEIsIHYxNy44Qn0sIFt4Nl0sICMxNgorICAgIHVzaGxsICAgICAgICAgICAgICAgdjE4LjhILCB2MTYuOEIsICMzCisgICAgdXNobGwgICAgICAgICAgICAgICB2MTkuOEgsIHYxNy44QiwgIzMKKy5lbmRtCisKKy5tYWNybyBsb2FkX2Nocm9tYV9udjIxCisgICAgbGQyICAgICAgICAgICAgICAgICB7djE2LjhCLCB2MTcuOEJ9LCBbeDZdLCAjMTYKKyAgICB1c2hsbCAgICAgICAgICAgICAgIHYxOS44SCwgdjE2LjhCLCAjMworICAgIHVzaGxsICAgICAgICAgICAgICAgdjE4LjhILCB2MTcuOEIsICMzCisuZW5kbQorCisubWFjcm8gbG9hZF9jaHJvbWFfeXV2NDIwcAorICAgIGxkMSAgICAgICAgICAgICAgICAge3YxNi44Qn0sIFsgeDZdLCAjOAorICAgIGxkMSAgICAgICAgICAgICAgICAge3YxNy44Qn0sIFt4MTNdLCAjOAorICAgIHVzaGxsICAgICAgICAgICAgICAgdjE4LjhILCB2MTYuOEIsICMzCisgICAgdXNobGwgICAgICAgICAgICAgICB2MTkuOEgsIHYxNy44QiwgIzMKKy5lbmRtCisKKy5tYWNybyBsb2FkX2Nocm9tYV95dXY0MjJwCisgICAgbG9hZF9jaHJvbWFfeXV2NDIwcAorLmVuZG0KKworLm1hY3JvIGluY3JlbWVudF9udjEyCisgICAgYW5kcyAgICAgICAgICAgICAgICB3MTUsIHcxLCAjMQorICAgIGNzZWwgICAgICAgICAgICAgICAgdzE2LCB3NywgdzExLCBuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jQyA9IChoICYgMSkgPyBwYWRkaW5jQyA6IC13aWR0aAorICAgIGFkZCAgICAgICAgICAgICAgICAgeDYsICB4NiwgdzE2LCBTWFRXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjQyArPSBpbmNDCisuZW5kbQorCisubWFjcm8gaW5jcmVtZW50X252MjEKKyAgICBpbmNyZW1lbnRfbnYxMgorLmVuZG0KKworLm1hY3JvIGluY3JlbWVudF95dXY0MjBwCisgICAgYW5kcyAgICAgICAgICAgICAgICB3MTUsIHcxLCAjMQorICAgIGNzZWwgICAgICAgICAgICAgICAgdzE2LCAgdzcsIHcxMSwgbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jVSA9IChoICYgMSkgPyBwYWRkaW5jVSA6IC13aWR0aC8yCisgICAgY3NlbCAgICAgICAgICAgICAgICB3MTcsIHcxNCwgdzExLCBuZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNWID0gKGggJiAxKSA/IHBhZGRpbmNWIDogLXdpZHRoLzIKKyAgICBhZGQgICAgICAgICAgICAgICAgIHg2LCAgeDYsICB3MTYsIFNYVFcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyY1UgKz0gaW5jVQorICAgIGFkZCAgICAgICAgICAgICAgICAgeDEzLCB4MTMsIHcxNywgU1hUVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjViArPSBpbmNWCisuZW5kbQorCisubWFjcm8gaW5jcmVtZW50X3l1djQyMnAKKyAgICBhZGQgICAgICAgICAgICAgICAgIHg2LCAgeDYsICB3NywgVVhUVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNyY1UgKz0gaW5jVQorICAgIGFkZCAgICAgICAgICAgICAgICAgeDEzLCB4MTMsIHcxNCwgVVhUVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3JjViArPSBpbmNWCisuZW5kbQorCisubWFjcm8gY29tcHV0ZV9yZ2JhIHIxIGcxIGIxIGExIHIyIGcyIGIyIGEyCisgICAgYWRkICAgICAgICAgICAgICAgICB2MjAuOEgsIHYyNi44SCwgdjIwLjhIICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZMSArIFIxCisgICAgYWRkICAgICAgICAgICAgICAgICB2MjEuOEgsIHYyNy44SCwgdjIxLjhIICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZMiArIFIyCisgICAgYWRkICAgICAgICAgICAgICAgICB2MjIuOEgsIHYyNi44SCwgdjIyLjhIICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZMSArIEcxCisgICAgYWRkICAgICAgICAgICAgICAgICB2MjMuOEgsIHYyNy44SCwgdjIzLjhIICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZMiArIEcyCisgICAgYWRkICAgICAgICAgICAgICAgICB2MjQuOEgsIHYyNi44SCwgdjI0LjhIICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZMSArIEIxCisgICAgYWRkICAgICAgICAgICAgICAgICB2MjUuOEgsIHYyNy44SCwgdjI1LjhIICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZMiArIEIyCisgICAgc3Fyc2hydW4gICAgICAgICAgICBccjEsIHYyMC44SCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGlwX3U4KChZMSArIFIxKSA+PiAxKQorICAgIHNxcnNocnVuICAgICAgICAgICAgXHIyLCB2MjEuOEgsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xpcF91OCgoWTIgKyBSMSkgPj4gMSkKKyAgICBzcXJzaHJ1biAgICAgICAgICAgIFxnMSwgdjIyLjhILCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaXBfdTgoKFkxICsgRzEpID4+IDEpCisgICAgc3Fyc2hydW4gICAgICAgICAgICBcZzIsIHYyMy44SCwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGlwX3U4KChZMiArIEcxKSA+PiAxKQorICAgIHNxcnNocnVuICAgICAgICAgICAgXGIxLCB2MjQuOEgsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xpcF91OCgoWTEgKyBCMSkgPj4gMSkKKyAgICBzcXJzaHJ1biAgICAgICAgICAgIFxiMiwgdjI1LjhILCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaXBfdTgoKFkyICsgQjEpID4+IDEpCisgICAgbW92aSAgICAgICAgICAgICAgICBcYTEsICMyNTUKKyAgICBtb3ZpICAgICAgICAgICAgICAgIFxhMiwgIzI1NQorLmVuZG0KKworLm1hY3JvIGRlY2xhcmVfZnVuYyBpZm10IG9mbXQKK2Z1bmN0aW9uIGZmX1xpZm10XCgpX3RvX1xvZm10XCgpX25lb24sIGV4cG9ydD0xCisgICAgbG9hZF9hcmdzX1xpZm10CisxOgorICAgIG1vdiAgICAgICAgICAgICAgICAgdzgsIHcwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdzggPSB3aWR0aAorMjoKKyAgICBtb3ZpICAgICAgICAgICAgICAgIHY1LjhILCAjNCwgbHNsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEyOCAqICgxPDwzKQorICAgIGxvYWRfY2hyb21hX1xpZm10CisgICAgc3ViICAgICAgICAgICAgICAgICB2MTguOEgsIHYxOC44SCwgdjUuOEggICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVKigxPDwzKSAtIDEyOCooMTw8MykKKyAgICBzdWIgICAgICAgICAgICAgICAgIHYxOS44SCwgdjE5LjhILCB2NS44SCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFYqKDE8PDMpIC0gMTI4KigxPDwzKQorICAgIHNxZG11bGggICAgICAgICAgICAgdjIwLjhILCB2MTkuOEgsIHYxLkhbMF0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gViAqIHYyciAgICAgICAgICAgIChSKQorICAgIHNxZG11bGggICAgICAgICAgICAgdjIyLjhILCB2MTguOEgsIHYxLkhbMV0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gVSAqIHUyZworICAgIHNxZG11bGggICAgICAgICAgICAgdjE5LjhILCB2MTkuOEgsIHYxLkhbMl0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIFYgKiB2MmcKKyAgICBhZGQgICAgICAgICAgICAgICAgIHYyMi44SCwgdjIyLjhILCB2MTkuOEggICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFUgKiB1MmcgKyBWICogdjJnICAoRykKKyAgICBzcWRtdWxoICAgICAgICAgICAgIHYyNC44SCwgdjE4LjhILCB2MS5IWzNdICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFUgKiB1MmIgICAgICAgICAgICAoQikKKyAgICB6aXAyICAgICAgICAgICAgICAgIHYyMS44SCwgdjIwLjhILCB2MjAuOEggICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFIyCisgICAgemlwMSAgICAgICAgICAgICAgICB2MjAuOEgsIHYyMC44SCwgdjIwLjhIICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSMQorICAgIHppcDIgICAgICAgICAgICAgICAgdjIzLjhILCB2MjIuOEgsIHYyMi44SCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRzIKKyAgICB6aXAxICAgICAgICAgICAgICAgIHYyMi44SCwgdjIyLjhILCB2MjIuOEggICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEcxCisgICAgemlwMiAgICAgICAgICAgICAgICB2MjUuOEgsIHYyNC44SCwgdjI0LjhIICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCMgorICAgIHppcDEgICAgICAgICAgICAgICAgdjI0LjhILCB2MjQuOEgsIHYyNC44SCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQjEKKyAgICBsZDEgICAgICAgICAgICAgICAgIHt2Mi4xNkJ9LCBbeDRdLCAjMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgbHVtYQorICAgIHVzaGxsICAgICAgICAgICAgICAgdjI2LjhILCB2Mi44QiwgICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWTEqKDE8PDMpCisgICAgdXNobGwyICAgICAgICAgICAgICB2MjcuOEgsIHYyLjE2QiwgIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZMiooMTw8MykKKyAgICBzdWIgICAgICAgICAgICAgICAgIHYyNi44SCwgdjI2LjhILCB2My44SCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFkxKigxPDwzKSAtIHlfb2Zmc2V0CisgICAgc3ViICAgICAgICAgICAgICAgICB2MjcuOEgsIHYyNy44SCwgdjMuOEggICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBZMiooMTw8MykgLSB5X29mZnNldAorICAgIHNxZG11bGggICAgICAgICAgICAgdjI2LjhILCB2MjYuOEgsIHYwLjhIICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKChZMSooMTw8MykgLSB5X29mZnNldCkgKiB5X2NvZWZmKSA+PiAxNQorICAgIHNxZG11bGggICAgICAgICAgICAgdjI3LjhILCB2MjcuOEgsIHYwLjhIICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKChZMiooMTw8MykgLSB5X29mZnNldCkgKiB5X2NvZWZmKSA+PiAxNQorCisuaWZjIFxvZm10LGFyZ2IgLy8gMSAyIDMgMAorICAgIGNvbXB1dGVfcmdiYSAgICAgICAgdjUuOEIsdjYuOEIsdjcuOEIsdjQuOEIsIHYxNy44Qix2MTguOEIsdjE5LjhCLHYxNi44QgorLmVuZGlmCisKKy5pZmMgXG9mbXQscmdiYSAvLyAwIDEgMiAzCisgICAgY29tcHV0ZV9yZ2JhICAgICAgICB2NC44Qix2NS44Qix2Ni44Qix2Ny44QiwgdjE2LjhCLHYxNy44Qix2MTguOEIsdjE5LjhCCisuZW5kaWYKKworLmlmYyBcb2ZtdCxhYmdyIC8vIDMgMiAxIDAKKyAgICBjb21wdXRlX3JnYmEgICAgICAgIHY3LjhCLHY2LjhCLHY1LjhCLHY0LjhCLCB2MTkuOEIsdjE4LjhCLHYxNy44Qix2MTYuOEIKKy5lbmRpZgorCisuaWZjIFxvZm10LGJncmEgLy8gMiAxIDAgMworICAgIGNvbXB1dGVfcmdiYSAgICAgICAgdjYuOEIsdjUuOEIsdjQuOEIsdjcuOEIsIHYxOC44Qix2MTcuOEIsdjE2LjhCLHYxOS44QgorLmVuZGlmCisKKyAgICBzdDQgICAgICAgICAgICAgICAgIHsgdjQuOEIsIHY1LjhCLCB2Ni44QiwgdjcuOEJ9LCBbeDJdLCAjMzIKKyAgICBzdDQgICAgICAgICAgICAgICAgIHt2MTYuOEIsdjE3LjhCLHYxOC44Qix2MTkuOEJ9LCBbeDJdLCAjMzIKKyAgICBzdWJzICAgICAgICAgICAgICAgIHc4LCB3OCwgIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpZHRoIC09IDE2CisgICAgYi5ndCAgICAgICAgICAgICAgICAyYgorICAgIGFkZCAgICAgICAgICAgICAgICAgeDIsIHgyLCB3MywgVVhUVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHN0ICArPSBwYWRkaW5nCisgICAgYWRkICAgICAgICAgICAgICAgICB4NCwgeDQsIHc1LCBVWFRXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcmNZICs9IHBhZGRpbmdZCisgICAgaW5jcmVtZW50X1xpZm10CisgICAgc3VicyAgICAgICAgICAgICAgICB3MSwgdzEsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoZWlnaHQgLT0gMQorICAgIGIuZ3QgICAgICAgICAgICAgICAgMWIKKyAgICByZXQKK2VuZGZ1bmMKKy5lbmRtCisKKy5tYWNybyBkZWNsYXJlX3JnYl9mdW5jcyBpZm10CisgICAgZGVjbGFyZV9mdW5jIFxpZm10LCBhcmdiCisgICAgZGVjbGFyZV9mdW5jIFxpZm10LCByZ2JhCisgICAgZGVjbGFyZV9mdW5jIFxpZm10LCBhYmdyCisgICAgZGVjbGFyZV9mdW5jIFxpZm10LCBiZ3JhCisuZW5kbQorCitkZWNsYXJlX3JnYl9mdW5jcyBudjEyCitkZWNsYXJlX3JnYl9mdW5jcyBudjIxCitkZWNsYXJlX3JnYl9mdW5jcyB5dXY0MjBwCitkZWNsYXJlX3JnYl9mdW5jcyB5dXY0MjJwCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL2FybS9NYWtlZmlsZSBiL2xpYnN3c2NhbGUvYXJtL01ha2VmaWxlCmluZGV4IDk3YjM1NjEuLjc5MmRhNmIgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvYXJtL01ha2VmaWxlCisrKyBiL2xpYnN3c2NhbGUvYXJtL01ha2VmaWxlCkBAIC0xLDUgKzEsOCBAQAotT0JKUyAgICAgICAgKz0gYXJtL3N3c2NhbGVfdW5zY2FsZWQubworT0JKUyAgICAgICAgKz0gYXJtL3N3c2NhbGUubyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgYXJtL3N3c2NhbGVfdW5zY2FsZWQubyAgICAgICAgICAgXAogCi0jIE5FT04tT0JKUyAgICs9IGFybS9yZ2IyeXV2X25lb25fMzIubwotIyBORU9OLU9CSlMgICArPSBhcm0vcmdiMnl1dl9uZW9uXzE2Lm8KLU5FT04tT0JKUyAgICs9IGFybS95dXYycmdiX25lb24ubworTkVPTi1PQkpTICAgKz0gYXJtL3JnYjJ5dXZfbmVvbl8zMi5vCitORU9OLU9CSlMgICArPSBhcm0vcmdiMnl1dl9uZW9uXzE2Lm8KK05FT04tT0JKUyAgICs9IGFybS9oc2NhbGUubyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGFybS9vdXRwdXQubyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGFybS95dXYycmdiX25lb24ubyAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvYXJtL2hzY2FsZS5TIGIvbGlic3dzY2FsZS9hcm0vaHNjYWxlLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0ZDQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYnN3c2NhbGUvYXJtL2hzY2FsZS5TCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQ2zDqW1lbnQgQsWTc2NoIDxjbGVtZW50IHN0dXBlZmxpeC5jb20+CisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgTWF0dGhpZXUgQm91cm9uIDxtYXR0aGlldS5ib3Vyb24gc3R1cGVmbGl4LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vYXNtLlMiCisKK2Z1bmN0aW9uIGZmX2hzY2FsZV84X3RvXzE1X25lb24sIGV4cG9ydD0xCisgICAgcHVzaCAgICAgICAgICAgICAgICB7cjQtcjEyLCBscn0KKyAgICB2cHVzaCAgICAgICAgICAgICAgIHtxNC1xN30KKyAgICBsZHIgICAgICAgICAgICAgICAgIHI0LCBbc3AsICMxMDRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXIKKyAgICBsZHIgICAgICAgICAgICAgICAgIHI1LCBbc3AsICMxMDhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXJQb3MKKyAgICBsZHIgICAgICAgICAgICAgICAgIHI2LCBbc3AsICMxMTJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXJTaXplCisgICAgYWRkICAgICAgICAgICAgICAgICByMTAsIHI0LCByNiwgbHNsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZmlsdGVyMiA9IGZpbHRlciArIGZpbHRlclNpemUgKiAyCisxOiAgbGRyICAgICAgICAgICAgICAgICByOCwgW3I1XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZmlsdGVyUG9zWzBdCisgICAgbGRyICAgICAgICAgICAgICAgICByOSwgW3I1XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZmlsdGVyUG9zWzFdCisgICAgdm1vdi5zMzIgICAgICAgICAgICBxNCwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdmFsIGFjY3VtdWxhdG9yCisgICAgdm1vdi5zMzIgICAgICAgICAgICBxNSwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdmFsIGFjY3VtdWxhdG9yCisgICAgbW92ICAgICAgICAgICAgICAgICByNywgcjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdG1wZmlsdGVyU2l6ZSA9IGZpbHRlclNpemUKKyAgICBtb3YgICAgICAgICAgICAgICAgIHIwLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNwCisyOiAgYWRkICAgICAgICAgICAgICAgICByMTEsIHIwLCByOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc3JjcCArIGZpbHRlclBvc1swXQorICAgIGFkZCAgICAgICAgICAgICAgICAgcjEyLCByMCwgcjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY3AgKyBmaWx0ZXJQb3NbMV0KKyAgICB2bGQxLjggICAgICAgICAgICAgIGQwLCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNwW2ZpbHRlclBvc1swXSArIHswLi43fV0KKyAgICB2bGQxLjggICAgICAgICAgICAgIGQyLCBbcjEyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNwW2ZpbHRlclBvc1sxXSArIHswLi43fV0KKyAgICB2bGQxLjE2ICAgICAgICAgICAgIHtxMn0sIFtyNF0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIDh4MTYtYml0IGZpbHRlciB2YWx1ZXMKKyAgICB2bGQxLjE2ICAgICAgICAgICAgIHtxM30sIFtyMTBdISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBsb2FkIDh4MTYtYml0IGZpbHRlciB2YWx1ZXMKKyAgICB2bW92bC51OCAgICAgICAgICAgIHEwLCBkMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB1bnBhY2sgc3JjIHZhbHVlcyB0byAxNi1iaXQKKyAgICB2bW92bC51OCAgICAgICAgICAgIHExLCBkMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB1bnBhY2sgc3JjIHZhbHVlcyB0byAxNi1iaXQKKyAgICB2bXVsbC5zMTYgICAgICAgICAgIHE4LCBkMCwgZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNwW2ZpbHRlclBvc1swXSArIHswLi43fV0gKiBmaWx0ZXJbezAuLjd9XSAocGFydCAxKQorICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTksIGQxLCBkNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY3BbZmlsdGVyUG9zWzBdICsgezAuLjd9XSAqIGZpbHRlclt7MC4uN31dIChwYXJ0IDIpCisgICAgdm11bGwuczE2ICAgICAgICAgICBxMTAsIGQyLCBkNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc3JjcFtmaWx0ZXJQb3NbMV0gKyB7MC4uN31dICogZmlsdGVyW3swLi43fV0gKHBhcnQgMSkKKyAgICB2bXVsbC5zMTYgICAgICAgICAgIHExMSwgZDMsIGQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNwW2ZpbHRlclBvc1sxXSArIHswLi43fV0gKiBmaWx0ZXJbezAuLjd9XSAocGFydCAyKQorICAgIHZwYWRkLnMzMiAgICAgICAgICAgZDE2LCBkMTYsIGQxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGhvcml6b250YWwgcGFpciBhZGRpbmcgb2YgdGhlIDh4MzItYml0IG11bHRpcGxpZWQgdmFsdWVzIGludG8gNHgzMi1iaXQgKHBhcnQgMSkKKyAgICB2cGFkZC5zMzIgICAgICAgICAgIGQxNywgZDE4LCBkMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBob3Jpem9udGFsIHBhaXIgYWRkaW5nIG9mIHRoZSA4eDMyLWJpdCBtdWx0aXBsaWVkIHZhbHVlcyBpbnRvIDR4MzItYml0IChwYXJ0IDIpCisgICAgdnBhZGQuczMyICAgICAgICAgICBkMjAsIGQyMCwgZDIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaG9yaXpvbnRhbCBwYWlyIGFkZGluZyBvZiB0aGUgOHgzMi1iaXQgbXVsdGlwbGllZCB2YWx1ZXMgaW50byA0eDMyLWJpdCAocGFydCAxKQorICAgIHZwYWRkLnMzMiAgICAgICAgICAgZDIxLCBkMjIsIGQyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGhvcml6b250YWwgcGFpciBhZGRpbmcgb2YgdGhlIDh4MzItYml0IG11bHRpcGxpZWQgdmFsdWVzIGludG8gNHgzMi1iaXQgKHBhcnQgMikKKyAgICB2YWRkLnMzMiAgICAgICAgICAgIHE0LCBxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB1cGRhdGUgdmFsIGFjY3VtdWxhdG9yCisgICAgdmFkZC5zMzIgICAgICAgICAgICBxNSwgcTEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdXBkYXRlIHZhbCBhY2N1bXVsYXRvcgorICAgIGFkZCAgICAgICAgICAgICAgICAgcjAsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY3AgKz0gOAorICAgIHN1YnMgICAgICAgICAgICAgICAgcjcsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRtcGZpbHRlclNpemUgLT0gOAorICAgIGJndCAgICAgICAgICAgICAgICAgMmIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGxvb3AgdW50aWwgdG1wZmlsdGVyU2l6ZSBpcyBjb25zdW1lZAorICAgIG1vdiAgICAgICAgICAgICAgICAgcjQsIHIxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGZpbHRlciA9IGZpbHRlcjIKKyAgICBhZGQgICAgICAgICAgICAgICAgIHIxMCwgcjEwLCByNiwgbHNsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaWx0ZXIyICs9IGZpbHRlclNpemUgKiAyCisgICAgdnBhZGQuczMyICAgICAgICAgICBkOCwgZDgsIGQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaG9yaXpvbnRhbCBwYWlyIGFkZGluZyBvZiB0aGUgOHgzMi1iaXQgc3VtcyBpbnRvIDR4MzItYml0IChwYXJ0IDEpCisgICAgdnBhZGQuczMyICAgICAgICAgICBkOSwgZDEwLCBkMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaG9yaXpvbnRhbCBwYWlyIGFkZGluZyBvZiB0aGUgOHgzMi1iaXQgc3VtcyBpbnRvIDR4MzItYml0IChwYXJ0IDIpCisgICAgdnBhZGQuczMyICAgICAgICAgICBkOCwgZDgsIGQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaG9yaXpvbnRhbCBwYWlyIGFkZGluZyBvZiB0aGUgNHgzMi1iaXQgc3VtcyBpbnRvIDJ4MzItYml0CisgICAgdnFzaHJuLnMzMiAgICAgICAgICBkOCwgcTQsICM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2hpZnQgYW5kIGNsaXAgdGhlIDJ4MTYtYml0IGZpbmFsIHZhbHVlcworICAgIHZzdDEuMzIgICAgICAgICAgICAge2Q4WzBdfSxbcjFdISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHdyaXRlIGRlc3RpbmF0aW9uCisgICAgc3VicyAgICAgICAgICAgICAgICByMiwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHN0VyAtPSAyCisgICAgYmd0ICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9vcCB1bnRpbCBlbmQgb2YgbGluZQorICAgIHZwb3AgICAgICAgICAgICAgICAge3E0LXE3fQorICAgIHBvcCAgICAgICAgICAgICAgICAge3I0LXIxMiwgbHJ9CisgICAgbW92IHBjLCBscgorZW5kZnVuYwpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9hcm0vb3V0cHV0LlMgYi9saWJzd3NjYWxlL2FybS9vdXRwdXQuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDg0NmRlCi0tLSAvZGV2L251bGwKKysrIGIvbGlic3dzY2FsZS9hcm0vb3V0cHV0LlMKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBDbMOpbWVudCBCxZNzY2ggPGNsZW1lbnQgc3R1cGVmbGl4LmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxNiBNYXR0aGlldSBCb3Vyb24gPG1hdHRoaWV1LmJvdXJvbiBzdHVwZWZsaXguY29tPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKKworZnVuY3Rpb24gZmZfeXV2MnBsYW5lWF84X25lb24sIGV4cG9ydD0xCisgICAgcHVzaCB7cjQtcjEyLCBscn0KKyAgICB2cHVzaCB7cTQtcTd9CisgICAgbGRyICAgICAgICAgICAgICAgICByNCwgW3NwLCAjMTA0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHN0VworICAgIGxkciAgICAgICAgICAgICAgICAgcjUsIFtzcCwgIzEwOF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRpdGhlcgorICAgIGxkciAgICAgICAgICAgICAgICAgcjYsIFtzcCwgIzExMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIG9mZnNldAorICAgIHZsZDEuOCAgICAgICAgICAgICAge2QwfSwgW3I1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGxvYWQgOHg4LWJpdCBkaXRoZXIgdmFsdWVzCisgICAgY21wICAgICAgICAgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY2hlY2sgb2Zmc2V0dGluZyB3aGljaCBjYW4gYmUgMCBvciAzIG9ubHkKKyAgICBiZXEgICAgICAgICAgICAgICAgIDFmCisgICAgdmV4dC51OCAgICAgICAgICAgICBkMCwgZDAsIGQwLCAjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaG9ub3Igb2Zmc2V0aW5nIHdoaWNoIGNhbiBiZSAzIG9ubHkKKzE6ICB2bW92bC51OCAgICAgICAgICAgIHEwLCBkMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBleHRlbmQgZGl0aGVyIHRvIDE2LWJpdAorICAgIHZzaGxsLnUxNiAgICAgICAgICAgcTEsIGQwLCAjMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGV4dGVuZCBkaXRoZXIgdG8gMzItYml0IHdpdGggbGVmdCBzaGlmdCBieSAxMiAocGFydCAxKQorICAgIHZzaGxsLnUxNiAgICAgICAgICAgcTIsIGQxLCAjMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGV4dGVuZCBkaXRoZXIgdG8gMzItYml0IHdpdGggbGVmdCBzaGlmdCBieSAxMiAocGFydCAyKQorICAgIG1vdiAgICAgICAgICAgICAgICAgcjcsICMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGkgPSAwCisyOiAgdm1vdi51OCAgICAgICAgICAgICBxMywgcTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaW5pdGlhbGl6ZSBhY2N1bXVsYXRvciB3aXRoIGRpdGhlcmluZyB2YWx1ZXMgKHBhcnQgMSkKKyAgICB2bW92LnU4ICAgICAgICAgICAgIHE0LCBxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBpbml0aWFsaXplIGFjY3VtdWxhdG9yIHdpdGggZGl0aGVyaW5nIHZhbHVlcyAocGFydCAyKQorICAgIG1vdiAgICAgICAgICAgICAgICAgcjgsIHIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHRtcEZpbHRlclNpemUgPSBmaWx0ZXJTaXplCisgICAgbW92ICAgICAgICAgICAgICAgICByOSwgcjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc3JjcAorICAgIG1vdiAgICAgICAgICAgICAgICAgcjEwLCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGZpbHRlcnAKKzM6ICBsZHIgICAgICAgICAgICAgICAgIHIxMSwgW3I5XSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBnZXQgcG9pbnRlciBAIHNyY1tqXQorICAgIGxkciAgICAgICAgICAgICAgICAgcjEyLCBbcjldLCAjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGdldCBwb2ludGVyIEAgc3JjW2orMV0KKyAgICBhZGQgICAgICAgICAgICAgICAgIHIxMSwgcjExLCByNywgbHNsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAmc3JjW2pdW2ldCisgICAgYWRkICAgICAgICAgICAgICAgICByMTIsIHIxMiwgcjcsIGxzbCAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgJnNyY1tqKzFdW2ldCisgICAgdmxkMS4xNiAgICAgICAgICAgICB7cTV9LCBbcjExXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcmVhZCA4eDE2LWJpdCBAIHNyY1tqICBdW2kgKyB7MC4uN31dOiBBLEIsQyxELEUsRixHLEgKKyAgICB2bGQxLjE2ICAgICAgICAgICAgIHtxNn0sIFtyMTJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByZWFkIDh4MTYtYml0IEAgc3JjW2orMV1baSArIHswLi43fV06IEksSixLLEwsTSxOLE8sUAorICAgIGxkciAgICAgICAgICAgICAgICAgcjExLCBbcjEwXSwgIzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHJlYWQgMngxNi1iaXQgY29lZmZzIChYLCBZKSBhdCAoZmlsdGVyW2pdLCBmaWx0ZXJbaisxXSkKKyAgICB2bW92LjE2ICAgICAgICAgICAgIHE3LCBxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IDh4MTYtYml0IEAgc3JjW2ogIF1baSArIHswLi43fV0gZm9yIGZvbGxvd2luZyBpbnBsYWNlIHppcCBpbnN0cnVjdGlvbgorICAgIHZtb3YuMTYgICAgICAgICAgICAgcTgsIHE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgOHgxNi1iaXQgQCBzcmNbaisxXVtpICsgezAuLjd9XSBmb3IgZm9sbG93aW5nIGlucGxhY2UgemlwIGluc3RydWN0aW9uCisgICAgdnppcC4xNiAgICAgICAgICAgICBxNywgcTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgQSxJLEIsSixDLEssRCxMLEUsTSxGLE4sRyxPLEgsUAorICAgIHZkdXAuMzIgICAgICAgICAgICAgcTE1LCByMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFgsWSxYLFksWCxZLFgsWQorICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTksIGQxNCwgZDMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEEqWCxJKlksQipYLEoqWQorICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTEwLCBkMTUsIGQzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEMqWCxLKlksRCpYLEwqWQorICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTExLCBkMTYsIGQzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEUqWCxNKlksRipYLE4qWQorICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTEyLCBkMTcsIGQzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEcqWCxPKlksSCpYLFAqWQorICAgIHZwYWRkLnMzMiAgICAgICAgICAgZDEwLCBkMTgsIGQxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEEqWCtJKlksQipYK0oqWQorICAgIHZwYWRkLnMzMiAgICAgICAgICAgZDExLCBkMjAsIGQyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEMqWCtLKlksRCpYK0wqWQorICAgIHZwYWRkLnMzMiAgICAgICAgICAgZDEyLCBkMjIsIGQyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEUqWCtNKlksRipYK04qWQorICAgIHZwYWRkLnMzMiAgICAgICAgICAgZDEzLCBkMjQsIGQyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIEcqWCtPKlksSCpYK1AqWQorICAgIHZhZGQuczMyICAgICAgICAgICAgcTMsIHE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHVwZGF0ZSB2YWwgYWNjdW11bGF0b3IgKHBhcnQgMSkKKyAgICB2YWRkLnMzMiAgICAgICAgICAgIHE0LCBxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB1cGRhdGUgdmFsIGFjY3VtdWxhdG9yIChwYXJ0IDIpCisgICAgc3VicyAgICAgICAgICAgICAgICByOCwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdG1wRmlsdGVyU2l6ZSAtPSAyCisgICAgYmd0ICAgICAgICAgICAgICAgICAzYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9vcCB1bnRpbCBmaWx0ZXJTaXplIGlzIGNvbnN1bWVkCisgICAgdnNoci5zMzIgICAgICAgICAgICBxMywgcTMsICMxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgdmFsPj4xOSAocGFydCAxKQorICAgIHZzaHIuczMyICAgICAgICAgICAgcTQsIHE0LCAjMTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHZhbD4+MTkgKHBhcnQgMikKKyAgICB2cW1vdnVuLnMzMiAgICAgICAgIGQ2LCBxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjbGlwMTYodmFsPj4xOSkgKHBhcnQgMSkKKyAgICB2cW1vdnVuLnMzMiAgICAgICAgIGQ3LCBxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjbGlwMTYodmFsPj4xOSkgKHBhcnQgMikKKyAgICB2cW1vdm4udTE2ICAgICAgICAgIGQ2LCBxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBtZXJnZSBwYXJ0IDEgYW5kIHBhcnQgMgorICAgIHZzdDEuOCAgICAgICAgICAgICAge2Q2fSwgW3IzXSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHdyaXRlIGRlc3RpbmF0aW9uCisgICAgYWRkICAgICAgICAgICAgICAgICByNywgIzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaSArPSA4CisgICAgc3VicyAgICAgICAgICAgICAgICByNCwgcjQsICM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZHN0VyAtPSA4CisgICAgYmd0ICAgICAgICAgICAgICAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgbG9vcCB1bnRpbCB3aWR0aCBpcyBjb25zdW1lZAorICAgIHZwb3AgICAgICAgICAgICAgICAge3E0LXE3fQorICAgIHBvcCAgICAgICAgICAgICAgICAge3I0LXIxMiwgbHJ9CisgICAgbW92ICAgICAgICAgICAgICAgICBwYywgbHIKK2VuZGZ1bmMKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvYXJtL3JnYjJ5dXZfbmVvbl8xNi5TIGIvbGlic3dzY2FsZS9hcm0vcmdiMnl1dl9uZW9uXzE2LlMKaW5kZXggNjAxYmM5YS4uYWQ3ZTY3OSAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9hcm0vcmdiMnl1dl9uZW9uXzE2LlMKKysrIGIvbGlic3dzY2FsZS9hcm0vcmdiMnl1dl9uZW9uXzE2LlMKQEAgLTE4LDYgKzE4LDggQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKICAqLwogCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaWYgSEFWRV9BU19ETl9ESVJFQ1RJVkUKICNpbmNsdWRlICJyZ2IyeXV2X25lb25fY29tbW9uLlMiCiAKIC8qIGRvd25zYW1wbGVkIFIxNkcxNkIxNiB4OCAqLwpAQCAtNzgsMyArODAsNCBAQAogLmVuZG0KIAogICAgIGxvb3BfNDIwc3AgIHJnYngsIG52MTIsIGluaXQsIGtlcm5lbF80MjBfMTZ4MiwgMTYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9hcm0vcmdiMnl1dl9uZW9uXzMyLlMgYi9saWJzd3NjYWxlL2FybS9yZ2IyeXV2X25lb25fMzIuUwppbmRleCBmNTFhNWYxLi40ZmQwZjY0IDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL2FybS9yZ2IyeXV2X25lb25fMzIuUworKysgYi9saWJzd3NjYWxlL2FybS9yZ2IyeXV2X25lb25fMzIuUwpAQCAtMTgsNiArMTgsOCBAQAogICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQogICovCiAKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpZiBIQVZFX0FTX0ROX0RJUkVDVElWRQogI2luY2x1ZGUgInJnYjJ5dXZfbmVvbl9jb21tb24uUyIKIAogLyogZG93bnNhbXBsZWQgUjE2RzE2QjE2IHg4ICovCkBAIC0xMTcsMyArMTE5LDQgQEAKIAogCiAgICAgbG9vcF80MjBzcCAgcmdieCwgbnYxMiwgaW5pdCwga2VybmVsXzQyMF8xNngyLCAzMgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL2FybS9zd3NjYWxlLmMgYi9saWJzd3NjYWxlL2FybS9zd3NjYWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjMzYwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYnN3c2NhbGUvYXJtL3N3c2NhbGUuYwpAQCAtMCwwICsxLDQ0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGUuaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGVfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXJtL2NwdS5oIgorCit2b2lkIGZmX2hzY2FsZV84X3RvXzE1X25lb24oU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmMsIGNvbnN0IGludDE2X3QgKmZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpmaWx0ZXJQb3MsIGludCBmaWx0ZXJTaXplKTsKKwordm9pZCBmZl95dXYycGxhbmVYXzhfbmVvbihjb25zdCBpbnQxNl90ICpmaWx0ZXIsIGludCBmaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqc3JjLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyLCBpbnQgb2Zmc2V0KTsKKworYXZfY29sZCB2b2lkIGZmX3N3c19pbml0X3N3c2NhbGVfYXJtKFN3c0NvbnRleHQgKmMpCit7CisgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKworICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkgeworICAgICAgICBpZiAoYy0+c3JjQnBjID09IDggJiYgYy0+ZHN0QnBjIDw9IDE0KSB7CisgICAgICAgICAgICBjLT5oeVNjYWxlID0gYy0+aGNTY2FsZSA9IGZmX2hzY2FsZV84X3RvXzE1X25lb247CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMtPmRzdEJwYyA9PSA4KSB7CisgICAgICAgICAgICBjLT55dXYycGxhbmVYID0gZmZfeXV2MnBsYW5lWF84X25lb247CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL2FybS9zd3NjYWxlX3Vuc2NhbGVkLmMgYi9saWJzd3NjYWxlL2FybS9zd3NjYWxlX3Vuc2NhbGVkLmMKaW5kZXggYWMxZTRhOS4uZTQxZjI5NCAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9hcm0vc3dzY2FsZV91bnNjYWxlZC5jCisrKyBiL2xpYnN3c2NhbGUvYXJtL3N3c2NhbGVfdW5zY2FsZWQuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9hcm0vY3B1LmgiCiAKLSNpZiAwCisjaWYgSEFWRV9BU19ETl9ESVJFQ1RJVkUKIGV4dGVybiB2b2lkIHJnYnhfdG9fbnYxMl9uZW9uXzMyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqeSwgdWludDhfdCAqY2hyb21hLAogICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICBpbnQgeV9zdHJpZGUsIGludCBjX3N0cmlkZSwgaW50IHNyY19zdHJpZGUsCkBAIC02MSwxNiArNjEsMTUgQEAKIAogICAgIHJldHVybiAwOwogfQotI2VuZGlmCiAKLSNkZWZpbmUgWVVWX1RPX1JHQl9UQUJMRShwcmVjaXNpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjLT55dXYycmdiX3Yycl9jb2VmZiAvICgocHJlY2lzaW9uKSA9PSAxNiA/IDEgPDwgNyA6IDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGMtPnl1djJyZ2JfdTJnX2NvZWZmIC8gKChwcmVjaXNpb24pID09IDE2ID8gMSA8PCA3IDogMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYy0+eXV2MnJnYl92MmdfY29lZmYgLyAoKHByZWNpc2lvbikgPT0gMTYgPyAxIDw8IDcgOiAxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjLT55dXYycmdiX3UyYl9jb2VmZiAvICgocHJlY2lzaW9uKSA9PSAxNiA/IDEgPDwgNyA6IDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFlVVl9UT19SR0JfVEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+eXV2MnJnYl92MnJfY29lZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjLT55dXYycmdiX3UyZ19jb2VmZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGMtPnl1djJyZ2JfdjJnX2NvZWZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+eXV2MnJnYl91MmJfY29lZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCi0jZGVmaW5lIERFQ0xBUkVfRkZfWVVWWF9UT19SR0JYX0ZVTkNTKGlmbXQsIG9mbXQsIHByZWNpc2lvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWludCBmZl8jI2lmbXQjI190b18jI29mbXQjI19uZW9uXyMjcHJlY2lzaW9uKGludCB3LCBpbnQgaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBERUNMQVJFX0ZGX1lVVlhfVE9fUkdCWF9GVU5DUyhpZm10LCBvZm10KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnQgZmZfIyNpZm10IyNfdG9fIyNvZm10IyNfbmVvbihpbnQgdywgaW50IGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgaW50IGxpbmVzaXplWSwgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVLCBpbnQgbGluZXNpemVVLCAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTc5LDM3ICs3OCwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfb2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9jb2VmZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGludCBpZm10IyNfdG9fIyNvZm10IyNfbmVvbl93cmFwcGVyXyMjcHJlY2lzaW9uKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLCBcCitzdGF0aWMgaW50IGlmbXQjI190b18jI29mbXQjI19uZW9uX3dyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sIGludCBzcmNTbGljZVksIGludCBzcmNTbGljZUgsICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdFtdLCBpbnQgZHN0U3RyaWRlW10pIHsgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50MTZfdCB5dXYycmdiX3RhYmxlW10gPSB7IFlVVl9UT19SR0JfVEFCTEUocHJlY2lzaW9uKSB9OyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQxNl90IHl1djJyZ2JfdGFibGVbXSA9IHsgWVVWX1RPX1JHQl9UQUJMRSB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmZfIyNpZm10IyNfdG9fIyNvZm10IyNfbmVvbl8jI3ByZWNpc2lvbihjLT5zcmNXLCBzcmNTbGljZUgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl8jI2lmbXQjI190b18jI29mbXQjI19uZW9uKGMtPnNyY1csIHNyY1NsaWNlSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdICsgc3JjU2xpY2VZICogZHN0U3RyaWRlWzBdLCBkc3RTdHJpZGVbMF0sICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbMF0sIHNyY1N0cmlkZVswXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1sxXSwgc3JjU3RyaWRlWzFdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWzJdLCBzcmNTdHJpZGVbMl0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXYycmdiX3RhYmxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnl1djJyZ2JfeV9vZmZzZXQgPj4gOSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+eXV2MnJnYl95X2NvZWZmIC8gKChwcmVjaXNpb24pID09IDE2ID8gMSA8PCA3IDogMSkpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT55dXYycmdiX3lfb2Zmc2V0ID4+IDYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnl1djJyZ2JfeV9jb2VmZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCi0jZGVmaW5lIERFQ0xBUkVfRkZfWVVWWF9UT19BTExfUkdCWF9GVU5DUyh5dXZ4LCBwcmVjaXNpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLURFQ0xBUkVfRkZfWVVWWF9UT19SR0JYX0ZVTkNTKHl1dngsIGFyZ2IsIHByZWNpc2lvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotREVDTEFSRV9GRl9ZVVZYX1RPX1JHQlhfRlVOQ1MoeXV2eCwgcmdiYSwgcHJlY2lzaW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1ERUNMQVJFX0ZGX1lVVlhfVE9fUkdCWF9GVU5DUyh5dXZ4LCBhYmdyLCBwcmVjaXNpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLURFQ0xBUkVfRkZfWVVWWF9UT19SR0JYX0ZVTkNTKHl1dngsIGJncmEsIHByZWNpc2lvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBERUNMQVJFX0ZGX1lVVlhfVE9fQUxMX1JHQlhfRlVOQ1MoeXV2eCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitERUNMQVJFX0ZGX1lVVlhfVE9fUkdCWF9GVU5DUyh5dXZ4LCBhcmdiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFQ0xBUkVfRkZfWVVWWF9UT19SR0JYX0ZVTkNTKHl1dngsIHJnYmEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVDTEFSRV9GRl9ZVVZYX1RPX1JHQlhfRlVOQ1MoeXV2eCwgYWJncikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitERUNMQVJFX0ZGX1lVVlhfVE9fUkdCWF9GVU5DUyh5dXZ4LCBiZ3JhKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAotI2RlZmluZSBERUNMQVJFX0ZGX1lVVlhfVE9fQUxMX1JHQlhfQUxMX1BSRUNJU0lPTl9GVU5DUyh5dXZ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1ERUNMQVJFX0ZGX1lVVlhfVE9fQUxMX1JHQlhfRlVOQ1MoeXV2eCwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFQ0xBUkVfRkZfWVVWWF9UT19BTExfUkdCWF9GVU5DUyh5dXY0MjBwKQorREVDTEFSRV9GRl9ZVVZYX1RPX0FMTF9SR0JYX0ZVTkNTKHl1djQyMnApCiAKLURFQ0xBUkVfRkZfWVVWWF9UT19BTExfUkdCWF9BTExfUFJFQ0lTSU9OX0ZVTkNTKHl1djQyMHApCi1ERUNMQVJFX0ZGX1lVVlhfVE9fQUxMX1JHQlhfQUxMX1BSRUNJU0lPTl9GVU5DUyh5dXY0MjJwKQotCi0jZGVmaW5lIERFQ0xBUkVfRkZfTlZYX1RPX1JHQlhfRlVOQ1MoaWZtdCwgb2ZtdCwgcHJlY2lzaW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLWludCBmZl8jI2lmbXQjI190b18jI29mbXQjI19uZW9uXyMjcHJlY2lzaW9uKGludCB3LCBpbnQgaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorI2RlZmluZSBERUNMQVJFX0ZGX05WWF9UT19SR0JYX0ZVTkNTKGlmbXQsIG9mbXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpbnQgZmZfIyNpZm10IyNfdG9fIyNvZm10IyNfbmVvbihpbnQgdywgaW50IGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IGxpbmVzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgaW50IGxpbmVzaXplWSwgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNDLCBpbnQgbGluZXNpemVDLCAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTExNywzMiArMTEzLDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9vZmZzZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X2NvZWZmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgaW50IGlmbXQjI190b18jI29mbXQjI19uZW9uX3dyYXBwZXJfIyNwcmVjaXNpb24oU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sIFwKK3N0YXRpYyBpbnQgaWZtdCMjX3RvXyMjb2ZtdCMjX25lb25fd3JhcHBlcihTd3NDb250ZXh0ICpjLCBjb25zdCB1aW50OF90ICpzcmNbXSwgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0W10sIGludCBkc3RTdHJpZGVbXSkgeyAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQxNl90IHl1djJyZ2JfdGFibGVbXSA9IHsgWVVWX1RPX1JHQl9UQUJMRShwcmVjaXNpb24pIH07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2X3QgeXV2MnJnYl90YWJsZVtdID0geyBZVVZfVE9fUkdCX1RBQkxFIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmZl8jI2lmbXQjI190b18jI29mbXQjI19uZW9uXyMjcHJlY2lzaW9uKGMtPnNyY1csIHNyY1NsaWNlSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZmXyMjaWZtdCMjX3RvXyMjb2ZtdCMjX25lb24oYy0+c3JjVywgc3JjU2xpY2VILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMF0gKyBzcmNTbGljZVkgKiBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVswXSwgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1swXSwgc3JjU3RyaWRlWzBdLCBzcmNbMV0sIHNyY1N0cmlkZVsxXSwgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnJnYl90YWJsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT55dXYycmdiX3lfb2Zmc2V0ID4+IDksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPnl1djJyZ2JfeV9jb2VmZiAvICgocHJlY2lzaW9uKSA9PSAxNiA/IDEgPDwgNyA6IDEpKTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+eXV2MnJnYl95X29mZnNldCA+PiA2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT55dXYycmdiX3lfY29lZmYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHJldHVybiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAotI2RlZmluZSBERUNMQVJFX0ZGX05WWF9UT19BTExfUkdCWF9GVU5DUyhudngsIHByZWNpc2lvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1ERUNMQVJFX0ZGX05WWF9UT19SR0JYX0ZVTkNTKG52eCwgYXJnYiwgcHJlY2lzaW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLURFQ0xBUkVfRkZfTlZYX1RPX1JHQlhfRlVOQ1MobnZ4LCByZ2JhLCBwcmVjaXNpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotREVDTEFSRV9GRl9OVlhfVE9fUkdCWF9GVU5DUyhudngsIGFiZ3IsIHByZWNpc2lvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1ERUNMQVJFX0ZGX05WWF9UT19SR0JYX0ZVTkNTKG52eCwgYmdyYSwgcHJlY2lzaW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgREVDTEFSRV9GRl9OVlhfVE9fQUxMX1JHQlhfRlVOQ1MobnZ4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVDTEFSRV9GRl9OVlhfVE9fUkdCWF9GVU5DUyhudngsIGFyZ2IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitERUNMQVJFX0ZGX05WWF9UT19SR0JYX0ZVTkNTKG52eCwgcmdiYSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0RFQ0xBUkVfRkZfTlZYX1RPX1JHQlhfRlVOQ1MobnZ4LCBhYmdyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorREVDTEFSRV9GRl9OVlhfVE9fUkdCWF9GVU5DUyhudngsIGJncmEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAKLSNkZWZpbmUgREVDTEFSRV9GRl9OVlhfVE9fQUxMX1JHQlhfQUxMX1BSRUNJU0lPTl9GVU5DUyhudngpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotREVDTEFSRV9GRl9OVlhfVE9fQUxMX1JHQlhfRlVOQ1MobnZ4LCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLURFQ0xBUkVfRkZfTlZYX1RPX0FMTF9SR0JYX0FMTF9QUkVDSVNJT05fRlVOQ1MobnYxMikKLURFQ0xBUkVfRkZfTlZYX1RPX0FMTF9SR0JYX0FMTF9QUkVDSVNJT05fRlVOQ1MobnYyMSkKK0RFQ0xBUkVfRkZfTlZYX1RPX0FMTF9SR0JYX0ZVTkNTKG52MTIpCitERUNMQVJFX0ZGX05WWF9UT19BTExfUkdCWF9GVU5DUyhudjIxKQogCiAvKiBXZSBuZWVkIGEgMTYgcGl4ZWwgd2lkdGggYWxpZ25tZW50LiBUaGlzIGNvbnN0cmFpbnQgY2FuIGVhc2lseSBiZSByZW1vdmVkCiAgKiBmb3IgaW5wdXQgcmVhZGluZyBidXQgZm9yIHRoZSBvdXRwdXQgd2hpY2ggaXMgNC1ieXRlcyBwZXIgcGl4ZWwgKFJHQkEpIHRoZQpAQCAtMTU0LDcgKzE0Nyw3IEBACiAgICAgICAgICYmICEoYy0+c3JjSCAmIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgJiYgIShjLT5zcmNXICYgMTUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAmJiAhYWNjdXJhdGVfcm5kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGMtPnN3c2NhbGUgPSBpZm10IyNfdG9fIyNvZm10IyNfbmVvbl93cmFwcGVyXzE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYy0+c3dzY2FsZSA9IGlmbXQjI190b18jI29mbXQjI19uZW9uX3dyYXBwZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9IHdoaWxlICgwKQogCkBAIC0xNjcsMTQgKzE2MCwxMiBAQAogCiBzdGF0aWMgdm9pZCBnZXRfdW5zY2FsZWRfc3dzY2FsZV9uZW9uKFN3c0NvbnRleHQgKmMpIHsKICAgICBpbnQgYWNjdXJhdGVfcm5kID0gYy0+ZmxhZ3MgJiBTV1NfQUNDVVJBVEVfUk5EOwotI2lmIDAKICAgICBpZiAoYy0+c3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfUkdCQQogICAgICAgICAgICAgJiYgYy0+ZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfTlYxMgogICAgICAgICAgICAgJiYgKGMtPnNyY1cgPj0gMTYpKSB7CiAgICAgICAgIGMtPnN3c2NhbGUgPSBhY2N1cmF0ZV9ybmQgPyByZ2J4X3RvX252MTJfbmVvbl8zMl93cmFwcGVyCiAgICAgICAgICAgICAgICAgICAgICAgICA6IHJnYnhfdG9fbnYxMl9uZW9uXzE2X3dyYXBwZXI7CiAgICAgfQotI2VuZGlmCiAKICAgICBTRVRfRkZfTlZYX1RPX0FMTF9SR0JYX0ZVTkMobnYxMiwgTlYxMiwgYWNjdXJhdGVfcm5kKTsKICAgICBTRVRfRkZfTlZYX1RPX0FMTF9SR0JYX0ZVTkMobnYyMSwgTlYyMSwgYWNjdXJhdGVfcm5kKTsKQEAgLTE4OCwzICsxNzksOCBAQAogICAgIGlmIChoYXZlX25lb24oY3B1X2ZsYWdzKSkKICAgICAgICAgZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfbmVvbihjKTsKIH0KKyNlbHNlCit2b2lkIGZmX2dldF91bnNjYWxlZF9zd3NjYWxlX2FybShTd3NDb250ZXh0ICpjKQoreworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL2FybS95dXYycmdiX25lb24uUyBiL2xpYnN3c2NhbGUvYXJtL3l1djJyZ2JfbmVvbi5TCmluZGV4IDgyOWUxYjYuLjEwOTUwZTcgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvYXJtL3l1djJyZ2JfbmVvbi5TCisrKyBiL2xpYnN3c2NhbGUvYXJtL3l1djJyZ2JfbmVvbi5TCkBAIC0yMiwxODYgKzIyLDgwIEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKIAogCi0ubWFjcm8gY29tcHV0ZV9wcmVtdWx0XzE2IGhhbGZfdTEsIGhhbGZfdTIsIGhhbGZfdjEsIGhhbGZfdjIKLSAgICB2bW92ICAgICAgICAgICAgICAgIGQyLCBcaGFsZl91MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IGxlZnQgcTE0IHRvIGxlZnQgcTEKLSAgICB2bW92ICAgICAgICAgICAgICAgIGQzLCBcaGFsZl91MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IGxlZnQgcTE0IHRvIHJpZ2h0IHExCi0gICAgdm1vdiAgICAgICAgICAgICAgICBkNCwgXGhhbGZfdTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSByaWdodCBxMTQgdG8gbGVmdCBxMgotICAgIHZtb3YgICAgICAgICAgICAgICAgZDUsIFxoYWxmX3UyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgcmlnaHQgcTE0IHRvIHJpZ2h0IHEyCi0KLSAgICB2bW92ICAgICAgICAgICAgICAgIGQ2LCBcaGFsZl92MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IGxlZnQgcTE1IHRvIGxlZnQgcTMKLSAgICB2bW92ICAgICAgICAgICAgICAgIGQ3LCBcaGFsZl92MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IGxlZnQgcTE1IHRvIHJpZ2h0IHEzCi0gICAgdm1vdiAgICAgICAgICAgICAgICBkOCwgXGhhbGZfdjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSByaWdodCBxMTUgdG8gbGVmdCBxNAotICAgIHZtb3YgICAgICAgICAgICAgICAgZDksIFxoYWxmX3YyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGNvcHkgcmlnaHQgcTE1IHRvIHJpZ2h0IHE0Ci0KLSAgICB2emlwLjE2ICAgICAgICAgICAgIGQyLCBkMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBVMVUxVTJVMlUzVTNVNFU0Ci0gICAgdnppcC4xNiAgICAgICAgICAgICBkNCwgZDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgVTVVNVU2VTZVN1U3VThVOAotCi0gICAgdnppcC4xNiAgICAgICAgICAgICBkNiwgZDcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgVjFWMVYyVjJWM1YzVjRWNAotICAgIHZ6aXAuMTYgICAgICAgICAgICAgZDgsIGQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFY1VjVWNlY2VjdWN1Y4VjgKLQotICAgIHZtdWwuczE2ICAgICAgICAgICAgcTgsICBxMywgZDFbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBWICogdjJyICAgICAgICAgICAgIChsZWZ0LCAgcmVkKQotICAgIHZtdWwuczE2ICAgICAgICAgICAgcTksICBxNCwgZDFbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBWICogdjJyICAgICAgICAgICAgIChyaWdodCwgcmVkKQotICAgIHZtdWwuczE2ICAgICAgICAgICAgcTEwLCBxMSwgZDFbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBVICogdTJnCi0gICAgdm11bC5zMTYgICAgICAgICAgICBxMTEsIHEyLCBkMVsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgIFUgKiB1MmcKLSAgICB2bWxhLnMxNiAgICAgICAgICAgIHExMCwgcTMsIGQxWzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgVSAqIHUyZyArIFYgKiB2MmcgICAobGVmdCwgIGdyZWVuKQotICAgIHZtbGEuczE2ICAgICAgICAgICAgcTExLCBxNCwgZDFbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBVICogdTJnICsgViAqIHYyZyAgIChyaWdodCwgZ3JlZW4pCi0gICAgdm11bC5zMTYgICAgICAgICAgICBxMTIsIHExLCBkMVszXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgIFUgKiB1MmIgICAgICAgICAgICAgKGxlZnQsICBibHVlKQotICAgIHZtdWwuczE2ICAgICAgICAgICAgcTEzLCBxMiwgZDFbM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBVICogdTJiICAgICAgICAgICAgIChyaWdodCwgYmx1ZSkKKy5tYWNybyBjb21wdXRlX3ByZW11bHQKKyAgICB2c3ViLnUxNiAgICAgICAgICAgIHExNCxxMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTQgPSBVICogKDEgPDwgMykgLSAxMjggKiAoMSA8PCAzKQorICAgIHZzdWIudTE2ICAgICAgICAgICAgcTE1LHExMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNSA9IFYgKiAoMSA8PCAzKSAtIDEyOCAqICgxIDw8IDMpCisgICAgdnFkbXVsaC5zMTYgICAgICAgICBxOCwgcTE1LCBkMVswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTggID0gViAqIHYycgorICAgIHZxZG11bGguczE2ICAgICAgICAgcTksIHExNCwgZDFbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHE5ICA9IFUgKiB1MmcKKyAgICB2cWRtdWxoLnMxNiAgICAgICAgIHE1LCBxMTUsIGQxWzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxNSAgPSBWICogdjJnCisgICAgdmFkZC5zMTYgICAgICAgICAgICBxOSwgcTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTkgID0gVSAqIHUyZyArIFYgKiB2MmcKKyAgICB2cWRtdWxoLnMxNiAgICAgICAgIHExMCxxMTQsIGQxWzNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTAgPSBVICogdTJiCiAuZW5kbQogCi0ubWFjcm8gY29tcHV0ZV9wcmVtdWx0XzMyIGhhbGZfdSBoYWxmX3YKLSAgICB2bW92ICAgICAgICAgICAgICAgIGQyLCBcaGFsZl91ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IGxlZnQgcTE0IHRvIGxlZnQgcTEKLSAgICB2bW92ICAgICAgICAgICAgICAgIGQzLCBcaGFsZl91ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBjb3B5IGxlZnQgcTE0IHRvIHJpZ2h0IHExCi0gICAgdm1vdiAgICAgICAgICAgICAgICBkNCwgXGhhbGZfdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSBsZWZ0IHExNSB0byBsZWZ0IHEyCi0gICAgdm1vdiAgICAgICAgICAgICAgICBkNSwgXGhhbGZfdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgY29weSBsZWZ0IHExNSB0byByaWdodCBxMgotCi0gICAgdnppcC4xNiAgICAgICAgICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgVTFVMVUyVTJVM1UzVTRVNAotICAgIHZ6aXAuMTYgICAgICAgICAgICAgZDQsIGQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIFYxVjFWMlYyVjNWM1Y0VjQKLQotICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTgsICBkNCwgZDFbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBWICogdjJyICAgICAgICAgICAgIChsZWZ0LCAgcmVkKQotICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTksICBkNSwgZDFbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBWICogdjJyICAgICAgICAgICAgIChyaWdodCwgcmVkKQotICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTEwLCBkMiwgZDFbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBVICogdTJnCi0gICAgdm11bGwuczE2ICAgICAgICAgICBxMTEsIGQzLCBkMVsxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgIFUgKiB1MmcKLSAgICB2bWxhbC5zMTYgICAgICAgICAgIHExMCwgZDQsIGQxWzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCAgVSAqIHUyZyArIFYgKiB2MmcgICAobGVmdCwgIGdyZWVuKQotICAgIHZtbGFsLnMxNiAgICAgICAgICAgcTExLCBkNSwgZDFbMl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBVICogdTJnICsgViAqIHYyZyAgIChyaWdodCwgZ3JlZW4pCi0gICAgdm11bGwuczE2ICAgICAgICAgICBxMTIsIGQyLCBkMVszXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgIFUgKiB1MmIgICAgICAgICAgICAgKGxlZnQsICBibHVlKQotICAgIHZtdWxsLnMxNiAgICAgICAgICAgcTEzLCBkMywgZDFbM10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAICBVICogdTJiICAgICAgICAgICAgIChyaWdodCwgYmx1ZSkKKy5tYWNybyBjb21wdXRlX2NvbG9yIGRzdF9jb21wMSBkc3RfY29tcDIgcHJlCisgICAgdmFkZC5zMTYgICAgICAgICAgICBxMSwgcTE0LCBccHJlCisgICAgdmFkZC5zMTYgICAgICAgICAgICBxMiwgcTE1LCBccHJlCisgICAgdnFyc2hydW4uczE2ICAgICAgICBcZHN0X2NvbXAxLCBxMSwgIzEKKyAgICB2cXJzaHJ1bi5zMTYgICAgICAgIFxkc3RfY29tcDIsIHEyLCAjMQogLmVuZG0KIAotLm1hY3JvIGNvbXB1dGVfY29sb3JfMTYgZHN0X2NvbXAxIGRzdF9jb21wMiBwcmUxIHByZTIKLSAgICB2YWRkLnMxNiAgICAgICAgICAgIHExLCBxMTQsIFxwcmUxCi0gICAgdmFkZC5zMTYgICAgICAgICAgICBxMiwgcTE1LCBccHJlMgotICAgIHZxcnNocnVuLnMxNiAgICAgICAgXGRzdF9jb21wMSwgcTEsICM2Ci0gICAgdnFyc2hydW4uczE2ICAgICAgICBcZHN0X2NvbXAyLCBxMiwgIzYKLS5lbmRtCi0KLS5tYWNybyBjb21wdXRlX2NvbG9yXzMyIGRzdF9jb21wIHByZTEgcHJlMgotICAgIHZhZGQuczMyICAgICAgICAgICAgcTMsIHExLCBccHJlMQotICAgIHZhZGQuczMyICAgICAgICAgICAgcTQsIHEyLCBccHJlMgotICAgIHZxcnNocnVuLnMzMiAgICAgICAgZDEwLCBxMywgIzEzCi0gICAgdnFyc2hydW4uczMyICAgICAgICBkMTEsIHE0LCAjMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTUgPSAoe3EzLHE0fSArICgxPDwxMikpID4+IDEzCi0gICAgdnFtb3ZuLnUxNiAgICAgICAgICBcZHN0X2NvbXAsIHE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2F0dXJhdGUgMTZiaXQgLT4gOGJpdAotLmVuZG0KLQotLm1hY3JvIGNvbXB1dGVfcmdiYV8xNiByMSByMiBnMSBnMiBiMSBiMiBhMSBhMgotICAgIGNvbXB1dGVfY29sb3JfMTYgICAgXHIxLCBccjIsIHE4LCAgcTkKLSAgICBjb21wdXRlX2NvbG9yXzE2ICAgIFxnMSwgXGcyLCBxMTAsIHExMQotICAgIGNvbXB1dGVfY29sb3JfMTYgICAgXGIxLCBcYjIsIHExMiwgcTEzCisubWFjcm8gY29tcHV0ZV9yZ2JhIHIxIGcxIGIxIGExIHIyIGcyIGIyIGEyCisgICAgY29tcHV0ZV9jb2xvciAgICAgICBccjEsIFxyMiwgcTgKKyAgICBjb21wdXRlX2NvbG9yICAgICAgIFxnMSwgXGcyLCBxOQorICAgIGNvbXB1dGVfY29sb3IgICAgICAgXGIxLCBcYjIsIHExMAogICAgIHZtb3YudTggICAgICAgICAgICAgXGExLCAjMjU1CiAgICAgdm1vdi51OCAgICAgICAgICAgICBcYTIsICMyNTUKIC5lbmRtCiAKLS5tYWNybyBjb21wdXRlX3JnYmFfMzIgciBnIGIgYQotICAgIGNvbXB1dGVfY29sb3JfMzIgICAgXHIsIHE4LCAgcTkKLSAgICBjb21wdXRlX2NvbG9yXzMyICAgIFxnLCBxMTAsIHExMQotICAgIGNvbXB1dGVfY29sb3JfMzIgICAgXGIsIHExMiwgcTEzCi0gICAgdm1vdi51OCAgICAgICAgICAgICBcYSwgIzI1NQotLmVuZG0KLQotLm1hY3JvIGNvbXB1dGVfMTZweF8xNiBkc3QgeTAgeTEgb2ZtdAotICAgIHZtb3ZsLnU4ICAgICAgICAgICAgcTE0LCBceTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIDhweCBvZiB5Ci0gICAgdm1vdmwudTggICAgICAgICAgICBxMTUsIFx5MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgOHB4IG9mIHkKLQotICAgIHZkdXAuMTYgICAgICAgICAgICAgcTUsIHI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHE1ICA9IHlfb2Zmc2V0Ci0gICAgdm1vdiAgICAgICAgICAgICAgICBkMTQsIGQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTcgID0geV9jb2VmZgotICAgIHZtb3YgICAgICAgICAgICAgICAgZDE1LCBkMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHE3ICA9IHlfY29lZmYKLQotICAgIHZzdWIuczE2ICAgICAgICAgICAgcTE0LCBxNQotICAgIHZzdWIuczE2ICAgICAgICAgICAgcTE1LCBxNQotCi0gICAgdm11bC5zMTYgICAgICAgICAgICBxMTQsIHE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE0ID0gKHNyY1kgLSB5X29mZnNldCkgKiB5X2NvZWZmIChsZWZ0KQotICAgIHZtdWwuczE2ICAgICAgICAgICAgcTE1LCBxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNSA9IChzcmNZIC0geV9vZmZzZXQpICogeV9jb2VmZiAocmlnaHQpCi0KKy5tYWNybyBjb21wdXRlIGRzdCBvZm10CisgICAgdnNobGwudTggICAgICAgICAgICBxMTQsIGQxNCwgIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE0ID0gWSAqICgxIDw8IDMpCisgICAgdnNobGwudTggICAgICAgICAgICBxMTUsIGQxNSwgIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE1ID0gWSAqICgxIDw8IDMpCisgICAgdnN1Yi5zMTYgICAgICAgICAgICBxMTQsIHExMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE0ID0gKFkgLSB5X29mZnNldCkKKyAgICB2c3ViLnMxNiAgICAgICAgICAgIHExNSwgcTEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTUgPSAoWSAtIHlfb2Zmc2V0KQorICAgIHZxZG11bGguczE2ICAgICAgICAgcTE0LCBxMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNCA9IChZIC0geV9vZmZzZXQpICogeV9jb2VmZgorICAgIHZxZG11bGguczE2ICAgICAgICAgcTE1LCBxMTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNSA9IChZIC0geV9vZmZzZXQpICogeV9jb2VmZgogCiAuaWZjIFxvZm10LGFyZ2IKLSAgICBjb21wdXRlX3JnYmFfMTYgICAgIGQ3LCBkMTEsIGQ4LCBkMTIsIGQ5LCBkMTMsIGQ2LCBkMTAKKyAgICBjb21wdXRlX3JnYmEgICAgICAgIGQ3LCBkOCwgZDksIGQ2LCBkMTEsIGQxMiwgZDEzLCBkMTAKIC5lbmRpZgogCiAuaWZjIFxvZm10LHJnYmEKLSAgICBjb21wdXRlX3JnYmFfMTYgICAgIGQ2LCBkMTAsIGQ3LCBkMTEsIGQ4LCBkMTIsIGQ5LCBkMTMKKyAgICBjb21wdXRlX3JnYmEgICAgICAgIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMKIC5lbmRpZgogCiAuaWZjIFxvZm10LGFiZ3IKLSAgICBjb21wdXRlX3JnYmFfMTYgICAgIGQ5LCBkMTMsIGQ4LCBkMTIsIGQ3LCBkMTEsIGQ2LCBkMTAKKyAgICBjb21wdXRlX3JnYmEgICAgICAgIGQ5LCBkOCwgZDcsIGQ2LCBkMTMsIGQxMiwgZDExLCBkMTAKIC5lbmRpZgogCiAuaWZjIFxvZm10LGJncmEKLSAgICBjb21wdXRlX3JnYmFfMTYgICAgIGQ4LCBkMTIsIGQ3LCBkMTEsIGQ2LCBkMTAsIGQ5LCBkMTMKKyAgICBjb21wdXRlX3JnYmEgICAgICAgIGQ4LCBkNywgZDYsIGQ5LCBkMTIsIGQxMSwgZDEwLCBkMTMKIC5lbmRpZgorCisgICAgdnppcC44ICAgICAgICAgICAgICBkNiwgZDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDYgPSBSMVIyUjNSNFI1UjZSN1I4IGQxMCA9IFI5UjEwUjExUjEyUjEzUjE0UjE1UjE2CisgICAgdnppcC44ICAgICAgICAgICAgICBkNywgZDExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDcgPSBHMUcyRzNHNEc1RzZHN0c4IGQxMSA9IEc5RzEwRzExRzEyRzEzRzE0RzE1RzE2CisgICAgdnppcC44ICAgICAgICAgICAgICBkOCwgZDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDggPSBCMUIyQjNCNEI1QjZCN0I4IGQxMiA9IEI5QjEwQjExQjEyQjEzQjE0QjE1QjE2CisgICAgdnppcC44ICAgICAgICAgICAgICBkOSwgZDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDkgPSBBMUEyQTNBNEE1QTZBN0E4IGQxMyA9IEE5QTEwQTExQTEyQTEzQTE0QTE1QTE2CiAgICAgdnN0NC44ICAgICAgICAgICAgICB7cTMsIHE0fSwgW1xkc3QsOjEyOF0hCiAgICAgdnN0NC44ICAgICAgICAgICAgICB7cTUsIHE2fSwgW1xkc3QsOjEyOF0hCi0KIC5lbmRtCiAKLS5tYWNybyBjb21wdXRlXzhweF8zMiBkc3QgaGFsZl95IG9mbXQKLSAgICB2bW92bC51OCAgICAgICAgICAgIHE3LCBcaGFsZl95ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCA4cHggb2YgWQotICAgIHZkdXAuMTYgICAgICAgICAgICAgcTUsIHI5Ci0gICAgdnN1Yi5zMTYgICAgICAgICAgICBxNywgcTUKLSAgICB2bXVsbC5zMTYgICAgICAgICAgIHExLCBkMTQsIGQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMSA9IChzcmNZIC0geV9vZmZzZXQpICogeV9jb2VmZiAobGVmdCkKLSAgICB2bXVsbC5zMTYgICAgICAgICAgIHEyLCBkMTUsIGQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMiA9IChzcmNZIC0geV9vZmZzZXQpICogeV9jb2VmZiAocmlnaHQpCi0KLS5pZmMgXG9mbXQsYXJnYgotICAgIGNvbXB1dGVfcmdiYV8zMiAgICAgZDEzLCBkMTQsIGQxNSwgZDEyCi0uZW5kaWYKLQotLmlmYyBcb2ZtdCxyZ2JhCi0gICAgY29tcHV0ZV9yZ2JhXzMyICAgICBkMTIsIGQxMywgZDE0LCBkMTUKLS5lbmRpZgotCi0uaWZjIFxvZm10LGFiZ3IKLSAgICBjb21wdXRlX3JnYmFfMzIgICAgIGQxNSwgZDE0LCBkMTMsIGQxMgotLmVuZGlmCi0KLS5pZmMgXG9mbXQsYmdyYQotICAgIGNvbXB1dGVfcmdiYV8zMiAgICAgZDE0LCBkMTMsIGQxMiwgZDE1Ci0uZW5kaWYKLQotICAgIHZzdDQuOCAgICAgICAgICAgICAge3E2LCBxN30sIFtcZHN0LDoxMjhdIQorLm1hY3JvIHByb2Nlc3NfMWxfaW50ZXJuYWwgZHN0IHNyYyBvZm10CisgICAgdmxkMi44ICAgICAgICAgICAgICB7ZDE0LCBkMTV9LCBbXHNyY10hICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTcgPSBZIChpbnRlcmxlYXZlZCkKKyAgICBjb21wdXRlICAgICAgICAgICAgIFxkc3QsIFxvZm10CiAuZW5kbQogCi0ubWFjcm8gcHJvY2Vzc18xbF8xNnB4XzE2IG9mbXQKLSAgICBjb21wdXRlX3ByZW11bHRfMTYgIGQyOCwgZDI5LCBkMzAsIGQzMQotICAgIHZsZDEuOCAgICAgICAgICAgICAge3E3fSwgW3I0XSEKLSAgICBjb21wdXRlXzE2cHhfMTYgICAgIHIyLCBkMTQsIGQxNSwgXG9mbXQKKy5tYWNybyBwcm9jZXNzXzFsIG9mbXQKKyAgICBjb21wdXRlX3ByZW11bHQKKyAgICBwcm9jZXNzXzFsX2ludGVybmFsIHIyLCByNCwgXG9mbXQKIC5lbmRtCiAKLS5tYWNybyBwcm9jZXNzXzFsXzE2cHhfMzIgb2ZtdAotICAgIGNvbXB1dGVfcHJlbXVsdF8zMiAgZDI4LCBkMzAKLSAgICB2bGQxLjggICAgICAgICAgICAgIHtxN30sIFtyNF0hCi0gICAgdm1vdiAgICAgICAgICAgICAgICBkMjgsIGQxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc2F2ZSByaWdodCBvZiB0aGUgbGluZSBvZiBsdW1hIGZvciBsYXRlciB1c2UKLSAgICBjb21wdXRlXzhweF8zMiAgICAgIHIyLCBkMTQsIFxvZm10Ci0KLSAgICBjb21wdXRlX3ByZW11bHRfMzIgIGQyOSwgZDMxCi0gICAgY29tcHV0ZV84cHhfMzIgICAgICByMiwgIGQyOCwgXG9mbXQKKy5tYWNybyBwcm9jZXNzXzJsIG9mbXQKKyAgICBjb21wdXRlX3ByZW11bHQKKyAgICBwcm9jZXNzXzFsX2ludGVybmFsIHIyLCByNCwgXG9mbXQKKyAgICBwcm9jZXNzXzFsX2ludGVybmFsIHIxMSxyMTIsXG9mbXQKIC5lbmRtCiAKLS5tYWNybyBwcm9jZXNzXzJsXzE2cHhfMTYgb2ZtdAotICAgIGNvbXB1dGVfcHJlbXVsdF8xNiAgZDI4LCBkMjksIGQzMCwgZDMxCi0KLSAgICB2bGQxLjggICAgICAgICAgICAgIHtxN30sIFtyNF0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaXJzdCBsaW5lIG9mIGx1bWEKLSAgICBjb21wdXRlXzE2cHhfMTYgICAgIHIyLCBkMTQsIGQxNSwgXG9mbXQKLQotICAgIHZsZDEuOCAgICAgICAgICAgICAge3E3fSwgW3IxMl0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNlY29uZCBsaW5lIG9mIGx1bWEKLSAgICBjb21wdXRlXzE2cHhfMTYgICAgIHIxMSwgZDE0LCBkMTUsIFxvZm10Ci0uZW5kbQotCi0ubWFjcm8gcHJvY2Vzc18ybF8xNnB4XzMyIG9mbXQKLSAgICBjb21wdXRlX3ByZW11bHRfMzIgIGQyOCwgZDMwCi0KLSAgICB2bGQxLjggICAgICAgICAgICAgIHtxN30sIFtyNF0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBmaXJzdCBsaW5lIG9mIGx1bWEKLSAgICB2bW92ICAgICAgICAgICAgICAgIGQyOCwgZDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzYXZlIHJpZ2h0IG9mIHRoZSBmaXJzdCBsaW5lIG9mIGx1bWEgZm9yIGxhdGVyIHVzZQotICAgIGNvbXB1dGVfOHB4XzMyICAgICAgcjIsIGQxNCwgXG9mbXQKLQotICAgIHZsZDEuOCAgICAgICAgICAgICAge3E3fSwgW3IxMl0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNlY29uZCBsaW5lIG9mIGx1bWEKLSAgICB2bW92ICAgICAgICAgICAgICAgIGQzMCwgZDE1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzYXZlIHJpZ2h0IG9mIHRoZSBzZWNvbmQgbGluZSBvZiBsdW1hIGZvciBsYXRlciB1c2UKLSAgICBjb21wdXRlXzhweF8zMiAgICAgIHIxMSwgZDE0LCBcb2ZtdAotCi0gICAgY29tcHV0ZV9wcmVtdWx0XzMyICBkMjksIGQzMQotICAgIGNvbXB1dGVfOHB4XzMyICAgICAgcjIsICBkMjgsIFxvZm10Ci0gICAgY29tcHV0ZV84cHhfMzIgICAgICByMTEsIGQzMCwgXG9mbXQKLS5lbmRtCi0KLS5tYWNybyBsb2FkX2FyZ3NfbnZ4CisubWFjcm8gbG9hZF9hcmdzX252MTIKICAgICBwdXNoICAgICAgICAgICAgICAgIHtyNC1yMTIsIGxyfQogICAgIHZwdXNoICAgICAgICAgICAgICAge3E0LXE3fQogICAgIGxkciAgICAgICAgICAgICAgICAgcjQsIFtzcCwgIzEwNF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHI0ICA9IHNyY1kKQEAgLTIxNywxMiArMTExLDE1IEBACiAgICAgYWRkICAgICAgICAgICAgICAgICByMTIsIHI0LCByNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjEyID0gc3JjWSArIGxpbmVzaXplWSAoc3JjWTIpCiAgICAgbHNsICAgICAgICAgICAgICAgICByMywgcjMsICMxCiAgICAgbHNsICAgICAgICAgICAgICAgICByNSwgcjUsICMxCi0gICAgbHNsICAgICAgICAgICAgICAgICByOCwgcjAsICMyCi0gICAgc3ViICAgICAgICAgICAgICAgICByMywgcjMsIHI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjMgPSBsaW5lc2l6ZSAgKiAyIC0gd2lkdGggKiA0IChwYWRkaW5nKQorICAgIHN1YiAgICAgICAgICAgICAgICAgcjMsIHIzLCByMCwgbHNsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIzID0gbGluZXNpemUgICogMiAtIHdpZHRoICogNCAocGFkZGluZykKICAgICBzdWIgICAgICAgICAgICAgICAgIHI1LCByNSwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByNSA9IGxpbmVzaXplWSAqIDIgLSB3aWR0aCAgICAgKHBhZGRpbmdZKQogICAgIHN1YiAgICAgICAgICAgICAgICAgcjcsIHI3LCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHI3ID0gbGluZXNpemVDICAgICAtIHdpZHRoICAgICAocGFkZGluZ0MpCiAuZW5kbQogCisubWFjcm8gbG9hZF9hcmdzX252MjEKKyAgICBsb2FkX2FyZ3NfbnYxMgorLmVuZG0KKwogLm1hY3JvIGxvYWRfYXJnc195dXY0MjBwCiAgICAgcHVzaCAgICAgICAgICAgICAgICB7cjQtcjEyLCBscn0KICAgICB2cHVzaCAgICAgICAgICAgICAgIHtxNC1xN30KQEAgLTIzOCw4ICsxMzUsNyBAQAogICAgIGFkZCAgICAgICAgICAgICAgICAgcjEyLCByNCwgcjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIxMiA9IHNyY1kgKyBsaW5lc2l6ZVkgKHNyY1kyKQogICAgIGxzbCAgICAgICAgICAgICAgICAgcjMsIHIzLCAjMQogICAgIGxzbCAgICAgICAgICAgICAgICAgcjUsIHI1LCAjMQotICAgIGxzbCAgICAgICAgICAgICAgICAgcjgsIHIwLCAjMgotICAgIHN1YiAgICAgICAgICAgICAgICAgcjMsIHIzLCByOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIzID0gbGluZXNpemUgICogMiAtIHdpZHRoICogNCAocGFkZGluZykKKyAgICBzdWIgICAgICAgICAgICAgICAgIHIzLCByMywgcjAsIGxzbCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByMyA9IGxpbmVzaXplICAqIDIgLSB3aWR0aCAqIDQgKHBhZGRpbmcpCiAgICAgc3ViICAgICAgICAgICAgICAgICByNSwgcjUsIHIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjUgPSBsaW5lc2l6ZVkgKiAyIC0gd2lkdGggICAgIChwYWRkaW5nWSkKICAgICBsZHIgICAgICAgICAgICAgICAgIHIxMCxbc3AsICMxMjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByMTAgPSBzcmNWCiAuZW5kbQpAQCAtMjU3LDE1MSArMTUzLDEyOCBAQAogICAgIGxkciAgICAgICAgICAgICAgICAgcjEwLFtzcCwgIzEzNl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIxMCA9IHlfY29lZmYKICAgICB2ZHVwLjE2ICAgICAgICAgICAgIGQwLCByMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMCAgPSB5X2NvZWZmCiAgICAgdmxkMS4xNiAgICAgICAgICAgICB7ZDF9LCBbcjhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDEgID0gKnRhYmxlCi0gICAgYWRkICAgICAgICAgICAgICAgICByMTEsIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjExID0gZHN0ICsgbGluZXNpemUgKGRzdDIpCi0gICAgbHNsICAgICAgICAgICAgICAgICByOCwgcjAsICMyCi0gICAgc3ViICAgICAgICAgICAgICAgICByMywgcjMsIHI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjMgPSBsaW5lc2l6ZSAgKiAyIC0gd2lkdGggKiA0IChwYWRkaW5nKQotICAgIHN1YiAgICAgICAgICAgICAgICAgcjUsIHI1LCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHI1ID0gbGluZXNpemVZICogMiAtIHdpZHRoICAgICAocGFkZGluZ1kpCi0gICAgc3ViICAgICAgICAgICAgICAgICByNywgcjcsIHIwLCBsc3IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjcgPSBsaW5lc2l6ZVUgICAgIC0gd2lkdGggLyAyIChwYWRkaW5nVSkKLSAgICBzdWIgICAgICAgICAgICAgICAgIHIxMixyMTIscjAsIGxzciAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByMTIgPSBsaW5lc2l6ZVYgICAgLSB3aWR0aCAvIDIgKHBhZGRpbmdWKQorICAgIHN1YiAgICAgICAgICAgICAgICAgcjMsIHIzLCByMCwgbHNsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHIzICA9IGxpbmVzaXplICAtIHdpZHRoICogNCAocGFkZGluZykKKyAgICBzdWIgICAgICAgICAgICAgICAgIHI1LCByNSwgcjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByNSAgPSBsaW5lc2l6ZVkgLSB3aWR0aCAgICAgKHBhZGRpbmdZKQorICAgIHN1YiAgICAgICAgICAgICAgICAgcjcsIHI3LCByMCwgbHNyICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHI3ICA9IGxpbmVzaXplVSAtIHdpZHRoIC8gMiAocGFkZGluZ1UpCisgICAgc3ViICAgICAgICAgICAgICAgICByMTIscjEyLHIwLCBsc3IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjEyID0gbGluZXNpemVWIC0gd2lkdGggLyAyIChwYWRkaW5nVikKICAgICBsZHIgICAgICAgICAgICAgICAgIHIxMCxbc3AsICMxMjBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByMTAgPSBzcmNWCiAuZW5kbQogCi0ubWFjcm8gZGVjbGFyZV9mdW5jIGlmbXQgb2ZtdCBwcmVjaXNpb24KLWZ1bmN0aW9uIGZmX1xpZm10XCgpX3RvX1xvZm10XCgpX25lb25fXHByZWNpc2lvblwoKSwgZXhwb3J0PTEKKy5tYWNybyBsb2FkX2Nocm9tYV9udjEyCisgICAgcGxkIFtyMTIsICM2NCozXQogCi0uaWZjIFxpZm10LG52MTIKLSAgICBsb2FkX2FyZ3NfbnZ4Ci0uZW5kaWYKKyAgICB2bGQyLjggICAgICAgICAgICAgIHtkMiwgZDN9LCBbcjZdISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTogaW50ZXJsZWF2ZWQgY2hyb21hIGxpbmUKKyAgICB2c2hsbC51OCAgICAgICAgICAgIHExNCwgZDIsICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTQgPSBVICogKDEgPDwgMykKKyAgICB2c2hsbC51OCAgICAgICAgICAgIHExNSwgZDMsICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTUgPSBWICogKDEgPDwgMykKKy5lbmRtCiAKLS5pZmMgXGlmbXQsbnYyMQotICAgIGxvYWRfYXJnc19udngKLS5lbmRpZgorLm1hY3JvIGxvYWRfY2hyb21hX252MjEKKyAgICBwbGQgW3IxMiwgIzY0KjNdCiAKLS5pZmMgXGlmbXQseXV2NDIwcAotICAgIGxvYWRfYXJnc195dXY0MjBwCi0uZW5kaWYKKyAgICB2bGQyLjggICAgICAgICAgICAgIHtkMiwgZDN9LCBbcjZdISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTogaW50ZXJsZWF2ZWQgY2hyb21hIGxpbmUKKyAgICB2c2hsbC51OCAgICAgICAgICAgIHExNCwgZDMsICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTQgPSBVICogKDEgPDwgMykKKyAgICB2c2hsbC51OCAgICAgICAgICAgIHExNSwgZDIsICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTUgPSBWICogKDEgPDwgMykKKy5lbmRtCiAKKy5tYWNybyBsb2FkX2Nocm9tYV95dXY0MjBwCisgICAgcGxkIFtyMTAsICM2NCozXQorICAgIHBsZCBbcjEyLCAjNjQqM10KIAotLmlmYyBcaWZtdCx5dXY0MjJwCi0gICAgbG9hZF9hcmdzX3l1djQyMnAKLS5lbmRpZgorICAgIHZsZDEuOCAgICAgICAgICAgICAgZDIsIFtyNl0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGQyOiBjaHJvbWEgcmVkIGxpbmUKKyAgICB2bGQxLjggICAgICAgICAgICAgIGQzLCBbcjEwXSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMzogY2hyb21hIGJsdWUgbGluZQorICAgIHZzaGxsLnU4ICAgICAgICAgICAgcTE0LCBkMiwgIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNCA9IFUgKiAoMSA8PCAzKQorICAgIHZzaGxsLnU4ICAgICAgICAgICAgcTE1LCBkMywgIzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNSA9IFYgKiAoMSA8PCAzKQorLmVuZG0KIAorLm1hY3JvIGxvYWRfY2hyb21hX3l1djQyMnAKKyAgICBwbGQgW3IxMCwgIzY0KjNdCisKKyAgICB2bGQxLjggICAgICAgICAgICAgIGQyLCBbcjZdISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMjogY2hyb21hIHJlZCBsaW5lCisgICAgdmxkMS44ICAgICAgICAgICAgICBkMywgW3IxMF0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgZDM6IGNocm9tYSBibHVlIGxpbmUKKyAgICB2c2hsbC51OCAgICAgICAgICAgIHExNCwgZDIsICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTQgPSBVICogKDEgPDwgMykKKyAgICB2c2hsbC51OCAgICAgICAgICAgIHExNSwgZDMsICMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTUgPSBWICogKDEgPDwgMykKKy5lbmRtCisKKy5tYWNybyBpbmNyZW1lbnRfYW5kX3Rlc3RfbnYxMgorICAgIGFkZCAgICAgICAgICAgICAgICAgcjExLCByMTEsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRzdDIgICs9IHBhZGRpbmcKKyAgICBhZGQgICAgICAgICAgICAgICAgIHIxMiwgcjEyLCByNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNZMiArPSBwYWRkaW5nWQorICAgIGFkZCAgICAgICAgICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY0MgICs9IHBhZGRpbmdDCisgICAgc3VicyAgICAgICAgICAgICAgICByMSwgcjEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaGVpZ2h0IC09IDIKKy5lbmRtCisKKy5tYWNybyBpbmNyZW1lbnRfYW5kX3Rlc3RfbnYyMQorICAgIGluY3JlbWVudF9hbmRfdGVzdF9udjEyCisuZW5kbQorCisubWFjcm8gaW5jcmVtZW50X2FuZF90ZXN0X3l1djQyMHAKKyAgICBhZGQgICAgICAgICAgICAgICAgIHIxMSwgcjExLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkc3QyICArPSBwYWRkaW5nCisgICAgYWRkICAgICAgICAgICAgICAgICByMTIsIHIxMiwgcjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc3JjWTIgKz0gcGFkZGluZ1kKKyAgICBsZHIgICAgICAgICAgICAgICAgIHI3LCBbc3AsICMxMTZdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByNyAgICAgPSBsaW5lc2l6ZVUKKyAgICBzdWIgICAgICAgICAgICAgICAgIHI3LCByNywgcjAsIGxzciAjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByNyAgICAgPSBsaW5lc2l6ZVUgLSB3aWR0aCAvIDIgKHBhZGRpbmdVKQorICAgIGFkZCAgICAgICAgICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY1UgICs9IHBhZGRpbmdVCisgICAgbGRyICAgICAgICAgICAgICAgICByNywgW3NwLCAjMTI0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjcgICAgID0gbGluZXNpemVWCisgICAgc3ViICAgICAgICAgICAgICAgICByNywgcjcsIHIwLCBsc3IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjcgICAgID0gbGluZXNpemVWIC0gd2lkdGggLyAyIChwYWRkaW5nVikKKyAgICBhZGQgICAgICAgICAgICAgICAgIHIxMCwgcjEwLCByNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNWICArPSBwYWRkaW5nVgorICAgIHN1YnMgICAgICAgICAgICAgICAgcjEsIHIxLCAjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGhlaWdodCAtPSAyCisuZW5kbQorCisubWFjcm8gaW5jcmVtZW50X2FuZF90ZXN0X3l1djQyMnAKKyAgICBhZGQgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNVICArPSBwYWRkaW5nVQorICAgIGFkZCAgICAgICAgICAgICAgICAgcjEwLHIxMCxyMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY1YgICs9IHBhZGRpbmdWCisgICAgc3VicyAgICAgICAgICAgICAgICByMSwgcjEsICMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaGVpZ2h0IC09IDEKKy5lbmRtCisKKy5tYWNybyBwcm9jZXNzX252MTIgb2ZtdAorICAgIHByb2Nlc3NfMmwgXG9mbXQKKy5lbmRtCisKKy5tYWNybyBwcm9jZXNzX252MjEgb2ZtdAorICAgIHByb2Nlc3NfMmwgXG9mbXQKKy5lbmRtCisKKy5tYWNybyBwcm9jZXNzX3l1djQyMHAgb2ZtdAorICAgIHByb2Nlc3NfMmwgXG9mbXQKKy5lbmRtCisKKy5tYWNybyBwcm9jZXNzX3l1djQyMnAgb2ZtdAorICAgIHByb2Nlc3NfMWwgXG9mbXQKKy5lbmRtCisKKy5tYWNybyBkZWNsYXJlX2Z1bmMgaWZtdCBvZm10CitmdW5jdGlvbiBmZl9caWZtdFwoKV90b19cb2ZtdFwoKV9uZW9uLCBleHBvcnQ9MQorICAgIGxvYWRfYXJnc19caWZtdAorICAgIHZtb3YudTE2ICAgICAgICAgICAgcTExLCAjMTAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExMSA9IDEyOCAqICgxIDw8IDMpCisgICAgdmR1cC4xNiAgICAgICAgICAgICBxMTIsIHI5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTEyID0geV9vZmZzZXQKKyAgICB2bW92ICAgICAgICAgICAgICAgIGQyNiwgZDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTMgPSB5X2NvZWZmCisgICAgdm1vdiAgICAgICAgICAgICAgICBkMjcsIGQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTEzID0geV9jb2VmZgogMToKICAgICBtb3YgICAgICAgICAgICAgICAgIHI4LCByMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCByOCA9IHdpZHRoCiAyOgogICAgIHBsZCBbcjYsICM2NCozXQogICAgIHBsZCBbcjQsICM2NCozXQotCiAgICAgdm1vdi5pOCAgICAgICAgICAgICBkMTAsICMxMjgKLQotLmlmYyBcaWZtdCxudjEyCi0gICAgcGxkIFtyMTIsICM2NCozXQotCi0gICAgdmxkMi44ICAgICAgICAgICAgICB7ZDIsIGQzfSwgW3I2XSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE6IGludGVybGVhdmVkIGNocm9tYSBsaW5lCi0gICAgdnN1YmwudTggICAgICAgICAgICBxMTQsIGQyLCBkMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE0ID0gVSAtIDEyOAotICAgIHZzdWJsLnU4ICAgICAgICAgICAgcTE1LCBkMywgZDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNSA9IFYgLSAxMjgKLQotICAgIHByb2Nlc3NfMmxfMTZweF9ccHJlY2lzaW9uIFxvZm10Ci0uZW5kaWYKLQotLmlmYyBcaWZtdCxudjIxCi0gICAgcGxkIFtyMTIsICM2NCozXQotCi0gICAgdmxkMi44ICAgICAgICAgICAgICB7ZDIsIGQzfSwgW3I2XSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE6IGludGVybGVhdmVkIGNocm9tYSBsaW5lCi0gICAgdnN1YmwudTggICAgICAgICAgICBxMTQsIGQzLCBkMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcTE0ID0gVSAtIDEyOAotICAgIHZzdWJsLnU4ICAgICAgICAgICAgcTE1LCBkMiwgZDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNSA9IFYgLSAxMjgKLQotICAgIHByb2Nlc3NfMmxfMTZweF9ccHJlY2lzaW9uIFxvZm10Ci0uZW5kaWYKLQotLmlmYyBcaWZtdCx5dXY0MjBwCi0gICAgcGxkIFtyMTAsICM2NCozXQotICAgIHBsZCBbcjEyLCAjNjQqM10KLQotICAgIHZsZDEuOCAgICAgICAgICAgICAgZDIsIFtyNl0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGQyOiBjaHJvbWEgcmVkIGxpbmUKLSAgICB2bGQxLjggICAgICAgICAgICAgIGQzLCBbcjEwXSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMzogY2hyb21hIGJsdWUgbGluZQotICAgIHZzdWJsLnU4ICAgICAgICAgICAgcTE0LCBkMiwgZDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNCA9IFUgLSAxMjgKLSAgICB2c3VibC51OCAgICAgICAgICAgIHExNSwgZDMsIGQxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTUgPSBWIC0gMTI4Ci0KLSAgICBwcm9jZXNzXzJsXzE2cHhfXHByZWNpc2lvbiBcb2ZtdAotLmVuZGlmCi0KLS5pZmMgXGlmbXQseXV2NDIycAotICAgIHBsZCBbcjEwLCAjNjQqM10KLQotICAgIHZsZDEuOCAgICAgICAgICAgICAgZDIsIFtyNl0hICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGQyOiBjaHJvbWEgcmVkIGxpbmUKLSAgICB2bGQxLjggICAgICAgICAgICAgIGQzLCBbcjEwXSEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkMzogY2hyb21hIGJsdWUgbGluZQotICAgIHZzdWJsLnU4ICAgICAgICAgICAgcTE0LCBkMiwgZDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHExNCA9IFUgLSAxMjgKLSAgICB2c3VibC51OCAgICAgICAgICAgIHExNSwgZDMsIGQxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBxMTUgPSBWIC0gMTI4Ci0KLSAgICBwcm9jZXNzXzFsXzE2cHhfXHByZWNpc2lvbiBcb2ZtdAotLmVuZGlmCi0KKyAgICBsb2FkX2Nocm9tYV9caWZtdAorICAgIHByb2Nlc3NfXGlmbXQgXG9mbXQKICAgICBzdWJzICAgICAgICAgICAgICAgIHI4LCByOCwgIzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCB3aWR0aCAtPSAxNgogICAgIGJndCAgICAgICAgICAgICAgICAgMmIKLQogICAgIGFkZCAgICAgICAgICAgICAgICAgcjIsIHIyLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRzdCAgICs9IHBhZGRpbmcKICAgICBhZGQgICAgICAgICAgICAgICAgIHI0LCByNCwgcjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNZICArPSBwYWRkaW5nWQotCi0uaWZjIFxpZm10LG52MTIKLSAgICBhZGQgICAgICAgICAgICAgICAgIHIxMSwgcjExLCByMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBkc3QyICArPSBwYWRkaW5nCi0gICAgYWRkICAgICAgICAgICAgICAgICByMTIsIHIxMiwgcjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc3JjWTIgKz0gcGFkZGluZ1kKLQotICAgIGFkZCAgICAgICAgICAgICAgICAgcjYsIHI2LCByNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY0MgICs9IHBhZGRpbmdDCi0KLSAgICBzdWJzICAgICAgICAgICAgICAgIHIxLCByMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBoZWlnaHQgLT0gMgotLmVuZGlmCi0KLS5pZmMgXGlmbXQsbnYyMQotICAgIGFkZCAgICAgICAgICAgICAgICAgcjExLCByMTEsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRzdDIgICs9IHBhZGRpbmcKLSAgICBhZGQgICAgICAgICAgICAgICAgIHIxMiwgcjEyLCByNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNZMiArPSBwYWRkaW5nWQotCi0gICAgYWRkICAgICAgICAgICAgICAgICByNiwgcjYsIHI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgc3JjQyAgKz0gcGFkZGluZ0MKLSAgICBzdWJzICAgICAgICAgICAgICAgIHIxLCByMSwgIzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBoZWlnaHQgLT0gMgotLmVuZGlmCi0KLS5pZmMgXGlmbXQseXV2NDIwcAotICAgIGFkZCAgICAgICAgICAgICAgICAgcjExLCByMTEsIHIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIGRzdDIgICs9IHBhZGRpbmcKLSAgICBhZGQgICAgICAgICAgICAgICAgIHIxMiwgcjEyLCByNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNZMiArPSBwYWRkaW5nWQotCi0gICAgbGRyICAgICAgICAgICAgICAgICByNywgW3NwLCAjMTE2XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjcgICAgID0gbGluZXNpemVVCi0gICAgc3ViICAgICAgICAgICAgICAgICByNywgcjcsIHIwLCBsc3IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjcgICAgID0gbGluZXNpemVVIC0gd2lkdGggLyAyIChwYWRkaW5nVSkKLSAgICBhZGQgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNVICArPSBwYWRkaW5nVQotCi0gICAgbGRyICAgICAgICAgICAgICAgICByNywgW3NwLCAjMTI0XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjcgICAgID0gbGluZXNpemVWCi0gICAgc3ViICAgICAgICAgICAgICAgICByNywgcjcsIHIwLCBsc3IgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgcjcgICAgID0gbGluZXNpemVWIC0gd2lkdGggLyAyIChwYWRkaW5nVikKLSAgICBhZGQgICAgICAgICAgICAgICAgIHIxMCwgcjEwLCByNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNWICArPSBwYWRkaW5nVgotCi0gICAgc3VicyAgICAgICAgICAgICAgICByMSwgcjEsICMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAgaGVpZ2h0IC09IDIKLS5lbmRpZgotCi0uaWZjIFxpZm10LHl1djQyMnAKLSAgICBhZGQgICAgICAgICAgICAgICAgIHI2LCByNiwgcjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBzcmNVICArPSBwYWRkaW5nVQotICAgIGFkZCAgICAgICAgICAgICAgICAgcjEwLHIxMCxyMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAIHNyY1YgICs9IHBhZGRpbmdWCi0KLSAgICBzdWJzICAgICAgICAgICAgICAgIHIxLCByMSwgIzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQCBoZWlnaHQgLT0gMQotLmVuZGlmCi0KKyAgICBpbmNyZW1lbnRfYW5kX3Rlc3RfXGlmbXQKICAgICBiZ3QgICAgICAgICAgICAgICAgIDFiCi0KICAgICB2cG9wICAgICAgICAgICAgICAgIHtxNC1xN30KICAgICBwb3AgICAgICAgICAgICAgICAgIHtyNC1yMTIsIGxyfQogICAgIG1vdiAgICAgICAgICAgICAgICAgcGMsIGxyCiBlbmRmdW5jCiAuZW5kbQogCi0ubWFjcm8gZGVjbGFyZV9yZ2JfZnVuY3MgaWZtdCBwcmVjaXNpb24KLSAgICBkZWNsYXJlX2Z1bmMgXGlmbXQsIGFyZ2IsIFxwcmVjaXNpb24KLSAgICBkZWNsYXJlX2Z1bmMgXGlmbXQsIHJnYmEsIFxwcmVjaXNpb24KLSAgICBkZWNsYXJlX2Z1bmMgXGlmbXQsIGFiZ3IsIFxwcmVjaXNpb24KLSAgICBkZWNsYXJlX2Z1bmMgXGlmbXQsIGJncmEsIFxwcmVjaXNpb24KKy5tYWNybyBkZWNsYXJlX3JnYl9mdW5jcyBpZm10CisgICAgZGVjbGFyZV9mdW5jIFxpZm10LCBhcmdiCisgICAgZGVjbGFyZV9mdW5jIFxpZm10LCByZ2JhCisgICAgZGVjbGFyZV9mdW5jIFxpZm10LCBhYmdyCisgICAgZGVjbGFyZV9mdW5jIFxpZm10LCBiZ3JhCiAuZW5kbQogCi1kZWNsYXJlX3JnYl9mdW5jcyBudjEyLCAxNgotZGVjbGFyZV9yZ2JfZnVuY3MgbnYyMSwgMTYKLWRlY2xhcmVfcmdiX2Z1bmNzIG52MTIsIDMyCi1kZWNsYXJlX3JnYl9mdW5jcyBudjIxLCAzMgotZGVjbGFyZV9yZ2JfZnVuY3MgeXV2NDIwcCwgMTYKLWRlY2xhcmVfcmdiX2Z1bmNzIHl1djQyMHAsIDMyCi1kZWNsYXJlX3JnYl9mdW5jcyB5dXY0MjJwLCAxNgotZGVjbGFyZV9yZ2JfZnVuY3MgeXV2NDIycCwgMzIKK2RlY2xhcmVfcmdiX2Z1bmNzIG52MTIKK2RlY2xhcmVfcmdiX2Z1bmNzIG52MjEKK2RlY2xhcmVfcmdiX2Z1bmNzIHl1djQyMHAKK2RlY2xhcmVfcmdiX2Z1bmNzIHl1djQyMnAKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvY29sb3JzcGFjZS10ZXN0LmMgYi9saWJzd3NjYWxlL2NvbG9yc3BhY2UtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmUwYzkyLi4wMDAwMDAwCi0tLSBhL2xpYnN3c2NhbGUvY29sb3JzcGFjZS10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgotICoKLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KLSAqCi0gKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKLSAqLwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgIC8qIGZvciBtZW1zZXQoKSAqLwotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlICJzd3NjYWxlLmgiCi0jaW5jbHVkZSAicmdiMnJnYi5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKLQotI2RlZmluZSBTSVpFICAgIDEwMDAKLSNkZWZpbmUgc3JjQnl0ZSAweDU1Ci0jZGVmaW5lIGRzdEJ5dGUgMHhCQgotCi0jZGVmaW5lIEZVTkMocywgZCwgbikgeyBzLCBkLCAjbiwgbiB9Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBpbnQgaSwgZnVuY051bTsKLSAgICB1aW50OF90ICpzcmNCdWZmZXIgPSBhdl9tYWxsb2MoU0laRSk7Ci0gICAgdWludDhfdCAqZHN0QnVmZmVyID0gYXZfbWFsbG9jKFNJWkUpOwotICAgIGludCBmYWlsZWROdW0gICAgICA9IDA7Ci0gICAgaW50IHBhc3NlZE51bSAgICAgID0gMDsKLQotICAgIGlmICghc3JjQnVmZmVyIHx8ICFkc3RCdWZmZXIpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIm1lbW9yeSBjb3JydXB0aW9uIHRlc3QgLi4uXG4iKTsKLSAgICBmZl9zd3NfcmdiMnJnYl9pbml0KCk7Ci0KLSAgICBmb3IgKGZ1bmNOdW0gPSAwOyA7IGZ1bmNOdW0rKykgewotICAgICAgICBzdHJ1Y3QgZnVuY19pbmZvX3MgewotICAgICAgICAgICAgaW50IHNyY19icHA7Ci0gICAgICAgICAgICBpbnQgZHN0X2JwcDsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0gICAgICAgICAgICB2b2lkICgqZnVuYykoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Ci0gICAgICAgIH0gZnVuY19pbmZvW10gPSB7Ci0gICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjEydG8xNSksCi0gICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG8xNiksCi0gICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE1dG8yNCksCi0gICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE1dG8zMiksCi0gICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE2dG8yNCksCi0gICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE2dG8zMiksCi0gICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG8xNSksCi0gICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG8xNiksCi0gICAgICAgICAgICBGVU5DKDMsIDQsIHJnYjI0dG8zMiksCi0gICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG8xNSksCi0gICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG8xNiksCi0gICAgICAgICAgICBGVU5DKDQsIDMsIHJnYjMydG8yNCksCi0gICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG8xNSksCi0gICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjEydG9iZ3IxMiksCi0gICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG9iZ3IxNSksCi0gICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG9iZ3IxNiksCi0gICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE1dG9iZ3IyNCksCi0gICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE1dG9iZ3IzMiksCi0gICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG9iZ3IxNSksCi0gICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG9iZ3IxNiksCi0gICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE2dG9iZ3IyNCksCi0gICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE2dG9iZ3IzMiksCi0gICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG9iZ3IxNSksCi0gICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG9iZ3IxNiksCi0gICAgICAgICAgICBGVU5DKDMsIDMsIHJnYjI0dG9iZ3IyNCksCi0gICAgICAgICAgICBGVU5DKDMsIDQsIHJnYjI0dG9iZ3IzMiksCi0gICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG9iZ3IxNSksCi0gICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG9iZ3IxNiksCi0gICAgICAgICAgICBGVU5DKDQsIDMsIHJnYjMydG9iZ3IyNCksCi0gICAgICAgICAgICBGVU5DKDQsIDQsIHNodWZmbGVfYnl0ZXNfMjEwMyksIC8qIHJnYjMydG9iZ3IzMiAqLwotICAgICAgICAgICAgRlVOQyg2LCA2LCByZ2I0OHRvYmdyNDhfbm9ic3dhcCksCi0gICAgICAgICAgICBGVU5DKDYsIDYsIHJnYjQ4dG9iZ3I0OF9ic3dhcCksCi0gICAgICAgICAgICBGVU5DKDgsIDYsIHJnYjY0dG80OF9ub2Jzd2FwKSwKLSAgICAgICAgICAgIEZVTkMoOCwgNiwgcmdiNjR0bzQ4X2Jzd2FwKSwKLSAgICAgICAgICAgIEZVTkMoOCwgNiwgcmdiNjR0b2JncjQ4X25vYnN3YXApLAotICAgICAgICAgICAgRlVOQyg4LCA2LCByZ2I2NHRvYmdyNDhfYnN3YXApLAotICAgICAgICAgICAgRlVOQygwLCAwLCBOVUxMKQotICAgICAgICB9OwotICAgICAgICBpbnQgd2lkdGg7Ci0gICAgICAgIGludCBmYWlsZWQgPSAwOwotICAgICAgICBpbnQgc3JjQnBwID0gMDsKLSAgICAgICAgaW50IGRzdEJwcCA9IDA7Ci0KLSAgICAgICAgaWYgKCFmdW5jX2luZm9bZnVuY051bV0uZnVuYykKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIi4iKTsKLSAgICAgICAgbWVtc2V0KHNyY0J1ZmZlciwgc3JjQnl0ZSwgU0laRSk7Ci0KLSAgICAgICAgZm9yICh3aWR0aCA9IDYzOyB3aWR0aCA+IDA7IHdpZHRoLS0pIHsKLSAgICAgICAgICAgIGludCBkc3RPZmZzZXQ7Ci0gICAgICAgICAgICBmb3IgKGRzdE9mZnNldCA9IDEyODsgZHN0T2Zmc2V0IDwgMTk2OyBkc3RPZmZzZXQgKz0gNCkgewotICAgICAgICAgICAgICAgIGludCBzcmNPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGRzdEJ1ZmZlciwgZHN0Qnl0ZSwgU0laRSk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKHNyY09mZnNldCA9IDEyODsgc3JjT2Zmc2V0IDwgMTk2OyBzcmNPZmZzZXQgKz0gNCkgewotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMgICAgID0gc3JjQnVmZmVyICsgc3JjT2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgICAgID0gZHN0QnVmZmVyICsgZHN0T2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBmaWxsIHRoZSBzY3JlZW4gd2l0aCBzaGl0IC4uLgotICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3JjQnBwID0gZnVuY19pbmZvW2Z1bmNOdW1dLnNyY19icHA7Ci0gICAgICAgICAgICAgICAgICAgIGRzdEJwcCA9IGZ1bmNfaW5mb1tmdW5jTnVtXS5kc3RfYnBwOwotICAgICAgICAgICAgICAgICAgICBuYW1lICAgPSBmdW5jX2luZm9bZnVuY051bV0ubmFtZTsKLQotICAgICAgICAgICAgICAgICAgICBmdW5jX2luZm9bZnVuY051bV0uZnVuYyhzcmMsIGRzdCwgd2lkdGggKiBzcmNCcHApOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghc3JjQnBwKQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0J1ZmZlcltpXSAhPSBzcmNCeXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjIGRhbWFnZWQgYXQgJWQgdzolZCBzcmM6JWQgZHN0OiVkICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB3aWR0aCwgc3JjT2Zmc2V0LCBkc3RPZmZzZXQsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdE9mZnNldDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0QnVmZmVyW2ldICE9IGRzdEJ5dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc3QgZGFtYWdlZCBhdCAlZCB3OiVkIHNyYzolZCBkc3Q6JWQgJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHdpZHRoLCBzcmNPZmZzZXQsIGRzdE9mZnNldCwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBkc3RPZmZzZXQgKyB3aWR0aCAqIGRzdEJwcDsgaSA8IFNJWkU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdEJ1ZmZlcltpXSAhPSBkc3RCeXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHN0IGRhbWFnZWQgYXQgJWQgdzolZCBzcmM6JWQgZHN0OiVkICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB3aWR0aCwgc3JjT2Zmc2V0LCBkc3RPZmZzZXQsIG5hbWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZhaWxlZCkKLSAgICAgICAgICAgIGZhaWxlZE51bSsrOwotICAgICAgICBlbHNlIGlmIChzcmNCcHApCi0gICAgICAgICAgICBwYXNzZWROdW0rKzsKLSAgICB9Ci0KLSAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCi0gICAgICAgICAgICJcbiVkIGNvbnZlcnRlcnMgcGFzc2VkLCAlZCBjb252ZXJ0ZXJzIHJhbmRvbWx5IG92ZXJ3cm90ZSBtZW1vcnlcbiIsCi0gICAgICAgICAgIHBhc3NlZE51bSwgZmFpbGVkTnVtKTsKLSAgICByZXR1cm4gZmFpbGVkTnVtOwotfQpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9pbnB1dC5jIGIvbGlic3dzY2FsZS9pbnB1dC5jCmluZGV4IDFkZjg0YTkuLmJiMmY0OTMgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvaW5wdXQuYworKysgYi9saWJzd3NjYWxlL2lucHV0LmMKQEAgLTcxOSw2ICs3MTksMjggQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIHAwMTZMRVRvVVZfYyh1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp1bnVzZWQwLCBjb25zdCB1aW50OF90ICpzcmMxLCBjb25zdCB1aW50OF90ICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIHVpbnQzMl90ICp1bnVzZWQpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgQVZfV04xNihkc3RVICsgaSAqIDIsIEFWX1JMMTYoc3JjMSArIGkgKiA0ICsgMCkpOworICAgICAgICBBVl9XTjE2KGRzdFYgKyBpICogMiwgQVZfUkwxNihzcmMxICsgaSAqIDQgKyAyKSk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBwMDE2QkVUb1VWX2ModWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdW51c2VkMCwgY29uc3QgdWludDhfdCAqc3JjMSwgY29uc3QgdWludDhfdCAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCB1aW50MzJfdCAqdW51c2VkKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7CisgICAgICAgIEFWX1dOMTYoZHN0VSArIGkgKiAyLCBBVl9SQjE2KHNyYzEgKyBpICogNCArIDApKTsKKyAgICAgICAgQVZfV04xNihkc3RWICsgaSAqIDIsIEFWX1JCMTYoc3JjMSArIGkgKiA0ICsgMikpOworICAgIH0KK30KKwogI2RlZmluZSBpbnB1dF9waXhlbChwb3MpIChpc0JFKG9yaWdpbikgPyBBVl9SQjE2KHBvcykgOiBBVl9STDE2KHBvcykpCiAKIHN0YXRpYyB2b2lkIGJncjI0VG9ZX2ModWludDhfdCAqX2RzdCwgY29uc3QgdWludDhfdCAqc3JjLCBjb25zdCB1aW50OF90ICp1bnVzZWQxLCBjb25zdCB1aW50OF90ICp1bnVzZWQyLApAQCAtODg1LDYgKzkwNywxOSBAQAogICAgIH0KIH0KIAorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBwbGFuYXJfcmdiMTZfdG9fYSh1aW50OF90ICpfZHN0LCBjb25zdCB1aW50OF90ICpfc3JjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBicGMsIGludCBpc19iZSwgaW50MzJfdCAqcmdiMnl1dikKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCB1aW50MTZfdCAqKnNyYyA9IChjb25zdCB1aW50MTZfdCAqKilfc3JjOworICAgIHVpbnQxNl90ICpkc3QgICAgICAgID0gKHVpbnQxNl90ICopX2RzdDsKKyAgICBpbnQgc2hpZnQgPSBicGMgPCAxNiA/IGJwYyA6IDE0OworCisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKKyAgICAgICAgZHN0W2ldID0gcmRweChzcmNbM10gKyBpKSA8PCAoMTQgLSBzaGlmdCk7CisgICAgfQorfQorCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIHBsYW5hcl9yZ2IxNl90b191dih1aW50OF90ICpfZHN0VSwgdWludDhfdCAqX2RzdFYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpfc3JjWzRdLCBpbnQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLCBpbnQgaXNfYmUsIGludDMyX3QgKnJnYjJ5dXYpCkBAIC05MTksNiArOTU0LDE4IEBACiAgICAgcGxhbmFyX3JnYjE2X3RvX3V2KGRzdFUsIGRzdFYsIHNyYywgdywgbmJpdHMsIGVuZGlhbiwgcmdiMnl1dik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAorI2RlZmluZSByZ2I5cGx1c19wbGFuYXJfdHJhbnNwYXJlbmN5X2Z1bmNzKG5iaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHBsYW5hcl9yZ2IjI25iaXRzIyNsZV90b19hKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWzRdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50MzJfdCAqcmdiMnl1dikgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuYXJfcmdiMTZfdG9fYShkc3QsIHNyYywgdywgbmJpdHMsIDAsIHJnYjJ5dXYpOyAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgcGxhbmFyX3JnYiMjbmJpdHMjI2JlX3RvX2EodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNbNF0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQzMl90ICpyZ2IyeXV2KSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBsYW5hcl9yZ2IxNl90b19hKGRzdCwgc3JjLCB3LCBuYml0cywgMSwgcmdiMnl1dik7ICAgICAgICAgICAgICAgICAgICAgIFwKK30KKwogI2RlZmluZSByZ2I5cGx1c19wbGFuYXJfZnVuY3MobmJpdHMpICAgICAgICAgICAgXAogICAgIHJnYjlwbHVzX3BsYW5hcl9mdW5jc19lbmRpYW4obmJpdHMsIGxlLCAwKSAgXAogICAgIHJnYjlwbHVzX3BsYW5hcl9mdW5jc19lbmRpYW4obmJpdHMsIGJlLCAxKQpAQCAtOTI5LDYgKzk3NiwxMCBAQAogcmdiOXBsdXNfcGxhbmFyX2Z1bmNzKDE0KQogcmdiOXBsdXNfcGxhbmFyX2Z1bmNzKDE2KQogCityZ2I5cGx1c19wbGFuYXJfdHJhbnNwYXJlbmN5X2Z1bmNzKDEwKQorcmdiOXBsdXNfcGxhbmFyX3RyYW5zcGFyZW5jeV9mdW5jcygxMikKK3JnYjlwbHVzX3BsYW5hcl90cmFuc3BhcmVuY3lfZnVuY3MoMTYpCisKIGF2X2NvbGQgdm9pZCBmZl9zd3NfaW5pdF9pbnB1dF9mdW5jcyhTd3NDb250ZXh0ICpjKQogewogICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQgPSBjLT5zcmNGb3JtYXQ7CkBAIC05NjAsOSArMTAxMSwxMSBAQAogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOUxFOgogICAgICAgICBjLT5yZWFkQ2hyUGxhbmFyID0gcGxhbmFyX3JnYjlsZV90b191djsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTBMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwTEU6CiAgICAgICAgIGMtPnJlYWRDaHJQbGFuYXIgPSBwbGFuYXJfcmdiMTBsZV90b191djsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTJMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyTEU6CiAgICAgICAgIGMtPnJlYWRDaHJQbGFuYXIgPSBwbGFuYXJfcmdiMTJsZV90b191djsKICAgICAgICAgYnJlYWs7CkBAIC05NzYsOSArMTAyOSwxMSBAQAogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQOUJFOgogICAgICAgICBjLT5yZWFkQ2hyUGxhbmFyID0gcGxhbmFyX3JnYjliZV90b191djsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTBCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEwQkU6CiAgICAgICAgIGMtPnJlYWRDaHJQbGFuYXIgPSBwbGFuYXJfcmdiMTBiZV90b191djsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTJCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDEyQkU6CiAgICAgICAgIGMtPnJlYWRDaHJQbGFuYXIgPSBwbGFuYXJfcmdiMTJiZV90b191djsKICAgICAgICAgYnJlYWs7CkBAIC05OTQsNjAgKzEwNDksNjAgQEAKICAgICAgICAgYy0+cmVhZENoclBsYW5hciA9IHBsYW5hcl9yZ2JfdG9fdXY7CiAgICAgICAgIGJyZWFrOwogI2lmIEhBVkVfQklHRU5ESUFOCi0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA5TEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA5TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMExFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTBMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDEwTEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMExFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMkxFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQMTJMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyTEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTRMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE0TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNExFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTRMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNkxFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTZMRToKIAotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDlMRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA5TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOUxFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwTEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA5TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOUxFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMExFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTZMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNkxFOgogICAgICAgICBjLT5jaHJUb1lWMTIgPSBic3dhcDE2VVZfYzsKICAgICAgICAgYnJlYWs7CiAjZWxzZQotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOUJFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOUJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEwQkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMEJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTBCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEwQkU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyQkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMkJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTJCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyQkU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMkJFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTRCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE0QkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTRCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE0QkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNkJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTZCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2QkU6CiAKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA5QkU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQOUJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDlCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMEJFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDlCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFAxMEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTBCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFAxNkJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDE2QkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTZCRToKQEAgLTEwNjMsNiArMTExOCwxMiBAQAogICAgIGNhc2UgQVZfUElYX0ZNVF9QMDEwQkU6CiAgICAgICAgIGMtPmNoclRvWVYxMiA9IHAwMTBCRVRvVVZfYzsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVl9QSVhfRk1UX1AwMTZMRToKKyAgICAgICAgYy0+Y2hyVG9ZVjEyID0gcDAxNkxFVG9VVl9jOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUDAxNkJFOgorICAgICAgICBjLT5jaHJUb1lWMTIgPSBwMDE2QkVUb1VWX2M7CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAoYy0+Y2hyU3JjSFN1YlNhbXBsZSkgewogICAgICAgICBzd2l0Y2ggKHNyY0Zvcm1hdCkgewpAQCAtMTIzOCw5ICsxMjk5LDEzIEBACiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA5TEU6CiAgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIgPSBwbGFuYXJfcmdiOWxlX3RvX3k7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEwTEU6CisgICAgICAgIGMtPnJlYWRBbHBQbGFuYXIgPSBwbGFuYXJfcmdiMTBsZV90b19hOwogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTBMRToKICAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2IxMGxlX3RvX3k7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEyTEU6CisgICAgICAgIGMtPnJlYWRBbHBQbGFuYXIgPSBwbGFuYXJfcmdiMTJsZV90b19hOwogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTJMRToKICAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2IxMmxlX3RvX3k7CiAgICAgICAgIGJyZWFrOwpAQCAtMTI0OCwxNSArMTMxMywyMCBAQAogICAgICAgICBjLT5yZWFkTHVtUGxhbmFyID0gcGxhbmFyX3JnYjE0bGVfdG9feTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTZMRToKKyAgICAgICAgYy0+cmVhZEFscFBsYW5hciA9IHBsYW5hcl9yZ2IxNmxlX3RvX2E7CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNkxFOgogICAgICAgICBjLT5yZWFkTHVtUGxhbmFyID0gcGxhbmFyX3JnYjE2bGVfdG9feTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlA5QkU6CiAgICAgICAgIGMtPnJlYWRMdW1QbGFuYXIgPSBwbGFuYXJfcmdiOWJlX3RvX3k7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEwQkU6CisgICAgICAgIGMtPnJlYWRBbHBQbGFuYXIgPSBwbGFuYXJfcmdiMTBiZV90b19hOwogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTBCRToKICAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2IxMGJlX3RvX3k7CiAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEyQkU6CisgICAgICAgIGMtPnJlYWRBbHBQbGFuYXIgPSBwbGFuYXJfcmdiMTJiZV90b19hOwogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTJCRToKICAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2IxMmJlX3RvX3k7CiAgICAgICAgIGJyZWFrOwpAQCAtMTI2NCw2ICsxMzM0LDcgQEAKICAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2IxNGJlX3RvX3k7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDE2QkU6CisgICAgICAgIGMtPnJlYWRBbHBQbGFuYXIgPSBwbGFuYXJfcmdiMTZiZV90b19hOwogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZCRToKICAgICAgICAgYy0+cmVhZEx1bVBsYW5hciA9IHBsYW5hcl9yZ2IxNmJlX3RvX3k7CiAgICAgICAgIGJyZWFrOwpAQCAtMTI3MywzMyArMTM0NCwzOCBAQAogICAgICAgICBjLT5yZWFkTHVtUGxhbmFyID0gcGxhbmFyX3JnYl90b195OwogICAgICAgICBicmVhazsKICNpZiBIQVZFX0JJR0VORElBTgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOUxFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOUxFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQOUxFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTBMRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQwUDEwTEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQOUxFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjBQMTBMRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyTEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMkxFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTJMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEwTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTBMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEyTEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxNExFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTRMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyTEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTJMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE0TEU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTRMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDE2TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxNkxFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTZMRToKIAorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTEyTEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNkxFOgorCisgICAgY2FzZSBBVl9QSVhfRk1UX1AwMTZMRToKICAgICAgICAgYy0+bHVtVG9ZVjEyID0gYnN3YXAxNllfYzsKICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOUxFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDlMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMFA5TEU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQMTBMRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIyUDlMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFA5TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxMExFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwTEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQMTZMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlAxNkxFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDE2TEU6CkBAIC0xMzA3LDMzICsxMzgzLDM4IEBACiAgICAgICAgIGMtPmFscFRvWVYxMiA9IGJzd2FwMTZZX2M7CiAgICAgICAgIGJyZWFrOwogI2Vsc2UKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDlCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDlCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDlCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwQkU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0MFAxMEJFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDlCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIwUDEwQkU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQ0NFAxMkJFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQMTJCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDEyQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEwQkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxMkJFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDRQMTRCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDIyUDE0QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMlAxMkJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0NDBQMTJCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDEyQkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNEJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTRCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE0QkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVjQyMFAxNkJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVY0MjJQMTZCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWNDQ0UDE2QkU6CiAKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTlCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxMkJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTZCRToKKworICAgIGNhc2UgQVZfUElYX0ZNVF9QMDE2QkU6CiAgICAgICAgIGMtPmx1bVRvWVYxMiA9IGJzd2FwMTZZX2M7CiAgICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDlCRToKLSAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA5QkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjBQOUJFOgotICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDQ0UDEwQkU6Ci0gICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQyMlA5QkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0NDRQOUJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTBCRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxMEJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVZBNDIwUDE2QkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX1lVVkE0MjJQMTZCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfWVVWQTQ0NFAxNkJFOgpAQCAtMTQ1Niw5ICsxNTM3LDkgQEAKICAgICAgICAgYy0+bHVtVG9ZVjEyID0gcDAxMEJFVG9ZX2M7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgaWYgKGMtPm5lZWRBbHBoYSkgewogICAgICAgICBpZiAoaXMxNkJQUyhzcmNGb3JtYXQpIHx8IGlzTkJQUyhzcmNGb3JtYXQpKSB7Ci0gICAgICAgICAgICBpZiAoSEFWRV9CSUdFTkRJQU4gPT0gIWlzQkUoc3JjRm9ybWF0KSkKKyAgICAgICAgICAgIGlmIChIQVZFX0JJR0VORElBTiA9PSAhaXNCRShzcmNGb3JtYXQpICYmICFjLT5yZWFkQWxwUGxhbmFyKQogICAgICAgICAgICAgICAgIGMtPmFscFRvWVYxMiA9IGJzd2FwMTZZX2M7CiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoIChzcmNGb3JtYXQpIHsKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvbGlic3dzY2FsZS52IGIvbGlic3dzY2FsZS9saWJzd3NjYWxlLnYKaW5kZXggOGI5YTk2YS4uOTYxNzBhMSAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9saWJzd3NjYWxlLnYKKysrIGIvbGlic3dzY2FsZS9saWJzd3NjYWxlLnYKQEAgLTEsNCArMSw3IEBACi1MSUJTV1NDQUxFXyRNQUpPUiB7Ci0gICAgICAgIGdsb2JhbDogc3dzY2FsZV8qOyBzd3NfKjsKLSAgICAgICAgbG9jYWw6ICo7CitMSUJTV1NDQUxFX01BSk9SIHsKKyAgICBnbG9iYWw6CisgICAgICAgIHN3c2NhbGVfKjsKKyAgICAgICAgc3dzXyo7CisgICAgbG9jYWw6CisgICAgICAgICo7CiB9OwpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9vcHRpb25zLmMgYi9saWJzd3NjYWxlL29wdGlvbnMuYwppbmRleCBjMWVhMzM2Li43ZWIyNzUyIDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL29wdGlvbnMuYworKysgYi9saWJzd3NjYWxlL29wdGlvbnMuYwpAQCAtNTcsOCArNTcsOCBAQAogICAgIHsgInNyY2giLCAgICAgICAgICAgICJzb3VyY2UgaGVpZ2h0IiwgICAgICAgICAgICAgICAgIE9GRlNFVChzcmNIKSwgICAgICBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IDE2ICAgICAgICAgICAgICAgICB9LCAxLCAgICAgICBJTlRfTUFYLCAgICAgICAgVkUgfSwKICAgICB7ICJkc3R3IiwgICAgICAgICAgICAiZGVzdGluYXRpb24gd2lkdGgiLCAgICAgICAgICAgICBPRkZTRVQoZHN0VyksICAgICAgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSAxNiAgICAgICAgICAgICAgICAgfSwgMSwgICAgICAgSU5UX01BWCwgICAgICAgIFZFIH0sCiAgICAgeyAiZHN0aCIsICAgICAgICAgICAgImRlc3RpbmF0aW9uIGhlaWdodCIsICAgICAgICAgICAgT0ZGU0VUKGRzdEgpLCAgICAgIEFWX09QVF9UWVBFX0lOVCwgICAgeyAuaTY0ID0gMTYgICAgICAgICAgICAgICAgIH0sIDEsICAgICAgIElOVF9NQVgsICAgICAgICBWRSB9LAotICAgIHsgInNyY19mb3JtYXQiLCAgICAgICJzb3VyY2UgZm9ybWF0IiwgICAgICAgICAgICAgICAgIE9GRlNFVChzcmNGb3JtYXQpLCBBVl9PUFRfVFlQRV9JTlQsICAgIHsgLmk2NCA9IERFRkFVTFQgICAgICAgICAgICB9LCAwLCAgICAgICBBVl9QSVhfRk1UX05CIC0gMSwgVkUgfSwKLSAgICB7ICJkc3RfZm9ybWF0IiwgICAgICAiZGVzdGluYXRpb24gZm9ybWF0IiwgICAgICAgICAgICBPRkZTRVQoZHN0Rm9ybWF0KSwgQVZfT1BUX1RZUEVfSU5ULCAgICB7IC5pNjQgPSBERUZBVUxUICAgICAgICAgICAgfSwgMCwgICAgICAgQVZfUElYX0ZNVF9OQiAtIDEsIFZFIH0sCisgICAgeyAic3JjX2Zvcm1hdCIsICAgICAgInNvdXJjZSBmb3JtYXQiLCAgICAgICAgICAgICAgICAgT0ZGU0VUKHNyY0Zvcm1hdCksIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCx7IC5pNjQgPSBERUZBVUxUICAgICAgICAgIH0sIDAsICAgICAgIElOVF9NQVgsIFZFIH0sCisgICAgeyAiZHN0X2Zvcm1hdCIsICAgICAgImRlc3RpbmF0aW9uIGZvcm1hdCIsICAgICAgICAgICAgT0ZGU0VUKGRzdEZvcm1hdCksIEFWX09QVF9UWVBFX1BJWEVMX0ZNVCx7IC5pNjQgPSBERUZBVUxUICAgICAgICAgIH0sIDAsICAgICAgIElOVF9NQVgsIFZFIH0sCiAgICAgeyAic3JjX3JhbmdlIiwgICAgICAgInNvdXJjZSBpcyBmdWxsIHJhbmdlIiwgICAgICAgICAgT0ZGU0VUKHNyY1JhbmdlKSwgIEFWX09QVF9UWVBFX0JPT0wsICAgeyAuaTY0ID0gREVGQVVMVCAgICAgICAgICAgIH0sIDAsICAgICAgIDEsICAgICAgICAgICAgICBWRSB9LAogICAgIHsgImRzdF9yYW5nZSIsICAgICAgICJkZXN0aW5hdGlvbiBpcyBmdWxsIHJhbmdlIiwgICAgIE9GRlNFVChkc3RSYW5nZSksICBBVl9PUFRfVFlQRV9CT09MLCAgIHsgLmk2NCA9IERFRkFVTFQgICAgICAgICAgICB9LCAwLCAgICAgICAxLCAgICAgICAgICAgICAgVkUgfSwKICAgICB7ICJwYXJhbTAiLCAgICAgICAgICAic2NhbGVyIHBhcmFtIDAiLCAgICAgICAgICAgICAgICBPRkZTRVQocGFyYW1bMF0pLCAgQVZfT1BUX1RZUEVfRE9VQkxFLCB7IC5kYmwgPSBTV1NfUEFSQU1fREVGQVVMVCAgfSwgSU5UX01JTiwgSU5UX01BWCwgICAgICAgIFZFIH0sCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL291dHB1dC5jIGIvbGlic3dzY2FsZS9vdXRwdXQuYwppbmRleCAwYzc2M2MzLi4wYWYyZmZmIDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL291dHB1dC5jCisrKyBiL2xpYnN3c2NhbGUvb3V0cHV0LmMKQEAgLTE4MCw2ICsxODAsMzQgQEAKICAgICB9CiB9CiAKK3N0YXRpYyB2b2lkIHl1djJwMDE2Y1hfYyhTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpjaHJGaWx0ZXIsIGludCBjaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJVU3JjLCBjb25zdCBpbnQxNl90ICoqY2hyVlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0OCwgaW50IGNockRzdFcpCit7CisgICAgdWludDE2X3QgKmRlc3QgPSAodWludDE2X3QqKWRlc3Q4OworICAgIGNvbnN0IGludDMyX3QgKip1U3JjID0gKGNvbnN0IGludDMyX3QgKiopY2hyVVNyYzsKKyAgICBjb25zdCBpbnQzMl90ICoqdlNyYyA9IChjb25zdCBpbnQzMl90ICoqKWNoclZTcmM7CisgICAgaW50IHNoaWZ0ID0gMTU7CisgICAgaW50IGJpZ19lbmRpYW4gPSBjLT5kc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9QMDE2QkU7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgY2hyRHN0VzsgaSsrKSB7CisgICAgICAgIGludCB1ID0gMSA8PCAoc2hpZnQgLSAxKTsKKyAgICAgICAgaW50IHYgPSAxIDw8IChzaGlmdCAtIDEpOworCisgICAgICAgIC8qIFNlZSB5dXYycGxhbmVYXzE2X2NfdGVtcGxhdGUgZm9yIGRldGFpbHMuICovCisgICAgICAgIHUgLT0gMHg0MDAwMDAwMDsKKyAgICAgICAgdiAtPSAweDQwMDAwMDAwOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hyRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICB1ICs9IHVTcmNbal1baV0gKiAodW5zaWduZWQpY2hyRmlsdGVyW2pdOworICAgICAgICAgICAgdiArPSB2U3JjW2pdW2ldICogKHVuc2lnbmVkKWNockZpbHRlcltqXTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsyKmldICAsIHUsIDB4ODAwMCwgaW50KTsKKyAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzIqaSsxXSwgdiwgMHg4MDAwLCBpbnQpOworICAgIH0KK30KKwogI3VuZGVmIG91dHB1dF9waXhlbAogCiAjZGVmaW5lIG91dHB1dF9waXhlbChwb3MsIHZhbCkgXApAQCAtMzExLDYgKzMzOSw5OCBAQAogICAgICAgICB9CiB9CiAKKworI2RlZmluZSBvdXRwdXRfcGl4ZWwocG9zLCB2YWwpIFwKKyAgICBpZiAoYmlnX2VuZGlhbikgeyBcCisgICAgICAgIEFWX1dCMTYocG9zLCBhdl9jbGlwX3VpbnRwMih2YWwgPj4gc2hpZnQsIDEwKSA8PCA2KTsgXAorICAgIH0gZWxzZSB7IFwKKyAgICAgICAgQVZfV0wxNihwb3MsIGF2X2NsaXBfdWludHAyKHZhbCA+PiBzaGlmdCwgMTApIDw8IDYpOyBcCisgICAgfQorCitzdGF0aWMgdm9pZCB5dXYycDAxMGwxX2MoY29uc3QgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmlnX2VuZGlhbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc2hpZnQgPSA1OworCisgICAgZm9yIChpID0gMDsgaSA8IGRzdFc7IGkrKykgeworICAgICAgICBpbnQgdmFsID0gc3JjW2ldICsgKDEgPDwgKHNoaWZ0IC0gMSkpOworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbaV0sIHZhbCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB5dXYycDAxMGxYX2MoY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqc3JjLCB1aW50MTZfdCAqZGVzdCwgaW50IGRzdFcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpZ19lbmRpYW4pCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHNoaWZ0ID0gMTc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgIGludCB2YWwgPSAxIDw8IChzaGlmdCAtIDEpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBmaWx0ZXJTaXplOyBqKyspCisgICAgICAgICAgICB2YWwgKz0gc3JjW2pdW2ldICogZmlsdGVyW2pdOworCisgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFtpXSwgdmFsKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIHl1djJwMDEwY1hfYyhTd3NDb250ZXh0ICpjLCBjb25zdCBpbnQxNl90ICpjaHJGaWx0ZXIsIGludCBjaHJGaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJVU3JjLCBjb25zdCBpbnQxNl90ICoqY2hyVlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkZXN0OCwgaW50IGNockRzdFcpCit7CisgICAgdWludDE2X3QgKmRlc3QgPSAodWludDE2X3QqKWRlc3Q4OworICAgIGludCBzaGlmdCA9IDE3OworICAgIGludCBiaWdfZW5kaWFuID0gYy0+ZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUDAxMEJFOworICAgIGludCBpLCBqOworCisgICAgZm9yIChpID0gMDsgaSA8IGNockRzdFc7IGkrKykgeworICAgICAgICBpbnQgdSA9IDEgPDwgKHNoaWZ0IC0gMSk7CisgICAgICAgIGludCB2ID0gMSA8PCAoc2hpZnQgLSAxKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hyRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICB1ICs9IGNoclVTcmNbal1baV0gKiBjaHJGaWx0ZXJbal07CisgICAgICAgICAgICB2ICs9IGNoclZTcmNbal1baV0gKiBjaHJGaWx0ZXJbal07CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXRfcGl4ZWwoJmRlc3RbMippXSAgLCB1KTsKKyAgICAgICAgb3V0cHV0X3BpeGVsKCZkZXN0WzIqaSsxXSwgdik7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB5dXYycDAxMGwxX0xFX2MoY29uc3QgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCkKK3sKKyAgICB5dXYycDAxMGwxX2Moc3JjLCAodWludDE2X3QqKWRlc3QsIGRzdFcsIDApOworfQorCitzdGF0aWMgdm9pZCB5dXYycDAxMGwxX0JFX2MoY29uc3QgaW50MTZfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3QsIGludCBkc3RXLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlciwgaW50IG9mZnNldCkKK3sKKyAgICB5dXYycDAxMGwxX2Moc3JjLCAodWludDE2X3QqKWRlc3QsIGRzdFcsIDEpOworfQorCitzdGF0aWMgdm9pZCB5dXYycDAxMGxYX0xFX2MoY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqc3JjLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaXRoZXIsIGludCBvZmZzZXQpCit7CisgICAgeXV2MnAwMTBsWF9jKGZpbHRlciwgZmlsdGVyU2l6ZSwgc3JjLCAodWludDE2X3QqKWRlc3QsIGRzdFcsIDApOworfQorCitzdGF0aWMgdm9pZCB5dXYycDAxMGxYX0JFX2MoY29uc3QgaW50MTZfdCAqZmlsdGVyLCBpbnQgZmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqc3JjLCB1aW50OF90ICpkZXN0LCBpbnQgZHN0VywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaXRoZXIsIGludCBvZmZzZXQpCit7CisgICAgeXV2MnAwMTBsWF9jKGZpbHRlciwgZmlsdGVyU2l6ZSwgc3JjLCAodWludDE2X3QqKWRlc3QsIGRzdFcsIDEpOworfQorCisjdW5kZWYgb3V0cHV0X3BpeGVsCisKKwogI2RlZmluZSBhY2N1bXVsYXRlX2JpdChhY2MsIHZhbCkgXAogICAgIGFjYyA8PD0gMTsgXAogICAgIGFjYyB8PSAodmFsKSA+PSAyMzQKQEAgLTcyMiw3ICs4NDIsNyBAQAogICAgICAgICAgICAgQTIgKz0gMHgyMDAwMjAwMDsKICAgICAgICAgfQogCi0gICAgICAgIC8vIDhiaXQ6IDEyKzE1PTI3OyAxNi1iaXQ6IDEyKzE5PTMxCisgICAgICAgIC8vIDggYml0czogMTIrMTU9Mjc7IDE2IGJpdHM6IDEyKzE5PTMxCiAgICAgICAgIFkxID4+PSAxNDsgLy8gMTAKICAgICAgICAgWTEgKz0gMHgxMDAwMDsKICAgICAgICAgWTIgPj49IDE0OwpAQCAtNzMwLDIwICs4NTAsMjAgQEAKICAgICAgICAgVSAgPj49IDE0OwogICAgICAgICBWICA+Pj0gMTQ7CiAKLSAgICAgICAgLy8gOGJpdDogMjcgLT4gMTdiaXQsIDE2Yml0OiAzMSAtIDE0ID0gMTdiaXQKKyAgICAgICAgLy8gOCBiaXRzOiAyNyAtPiAxNyBiaXRzLCAxNiBiaXRzOiAzMSAtIDE0ID0gMTcgYml0cwogICAgICAgICBZMSAtPSBjLT55dXYycmdiX3lfb2Zmc2V0OwogICAgICAgICBZMiAtPSBjLT55dXYycmdiX3lfb2Zmc2V0OwogICAgICAgICBZMSAqPSBjLT55dXYycmdiX3lfY29lZmY7CiAgICAgICAgIFkyICo9IGMtPnl1djJyZ2JfeV9jb2VmZjsKICAgICAgICAgWTEgKz0gMSA8PCAxMzsgLy8gMjEKICAgICAgICAgWTIgKz0gMSA8PCAxMzsKLSAgICAgICAgLy8gOGJpdDogMTcgKyAxM2JpdCA9IDMwYml0LCAxNmJpdDogMTcgKyAxM2JpdCA9IDMwYml0CisgICAgICAgIC8vIDggYml0czogMTcgKyAxMyBiaXRzID0gMzAgYml0cywgMTYgYml0czogMTcgKyAxMyBiaXRzID0gMzAgYml0cwogCiAgICAgICAgIFIgPSBWICogYy0+eXV2MnJnYl92MnJfY29lZmY7CiAgICAgICAgIEcgPSBWICogYy0+eXV2MnJnYl92MmdfY29lZmYgKyBVICogYy0+eXV2MnJnYl91MmdfY29lZmY7CiAgICAgICAgIEIgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVICogYy0+eXV2MnJnYl91MmJfY29lZmY7CiAKLSAgICAgICAgLy8gOGJpdDogMzAgLSAyMiA9IDhiaXQsIDE2Yml0OiAzMGJpdCAtIDE0ID0gMTZiaXQKKyAgICAgICAgLy8gOCBiaXRzOiAzMCAtIDIyID0gOCBiaXRzLCAxNiBiaXRzOiAzMCBiaXRzIC0gMTQgPSAxNiBiaXRzCiAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFswXSwgYXZfY2xpcF91aW50cDIoUl9CICsgWTEsIDMwKSA+PiAxNCk7CiAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsxXSwgYXZfY2xpcF91aW50cDIoICBHICsgWTEsIDMwKSA+PiAxNCk7CiAgICAgICAgIG91dHB1dF9waXhlbCgmZGVzdFsyXSwgYXZfY2xpcF91aW50cDIoQl9SICsgWTEsIDMwKSA+PiAxNCk7CkBAIC0xMjk0LDcgKzE0MTQsNyBAQAogCiAgICAgICAgIGRlc3RbaSAqIDIgKyAwXSA9IHJbWTEgKyBkcjFdICsgZ1tZMSArIGRnMV0gKyBiW1kxICsgZGIxXTsKICAgICAgICAgZGVzdFtpICogMiArIDFdID0gcltZMiArIGRyMl0gKyBnW1kyICsgZGcyXSArIGJbWTIgKyBkYjJdOwotICAgIH0gZWxzZSAvKiA4LzQtYml0ICovIHsKKyAgICB9IGVsc2UgLyogOC80IGJpdHMgKi8gewogICAgICAgICB1aW50OF90ICpkZXN0ID0gKHVpbnQ4X3QgKikgX2Rlc3Q7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnIgPSAoY29uc3QgdWludDhfdCAqKSBfcjsKICAgICAgICAgY29uc3QgdWludDhfdCAqZyA9IChjb25zdCB1aW50OF90ICopIF9nOwpAQCAtMTUxMyw4ICsxNjMzLDggQEAKIH0KIAogI2lmIENPTkZJR19TTUFMTAotWVVWMlJHQldSQVBQRVIoeXV2MnJnYiwsICAzMl8xLCAgQVZfUElYX0ZNVF9SR0IzMl8xLCAgIENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikKLVlVVjJSR0JXUkFQUEVSKHl1djJyZ2IsLCAgMzIsICAgIEFWX1BJWF9GTVRfUkdCMzIsICAgICBDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5hbHBQaXhCdWYpCitZVVYyUkdCV1JBUFBFUih5dXYycmdiLCwgIDMyXzEsICBBVl9QSVhfRk1UX1JHQjMyXzEsICAgQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+bmVlZEFscGhhKQorWVVWMlJHQldSQVBQRVIoeXV2MnJnYiwsICAzMiwgICAgQVZfUElYX0ZNVF9SR0IzMiwgICAgIENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPm5lZWRBbHBoYSkKICNlbHNlCiAjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKIFlVVjJSR0JXUkFQUEVSKHl1djJyZ2IsLCBhMzJfMSwgIEFWX1BJWF9GTVRfUkdCMzJfMSwgICAxKQpAQCAtMTgyMywxMCArMTk0MywxMCBAQAogfQogCiAjaWYgQ09ORklHX1NNQUxMCi1ZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgYmdyYTMyX2Z1bGwsIEFWX1BJWF9GTVRfQkdSQSwgIENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikKLVlVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCBhYmdyMzJfZnVsbCwgQVZfUElYX0ZNVF9BQkdSLCAgQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+YWxwUGl4QnVmKQotWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIHJnYmEzMl9mdWxsLCBBVl9QSVhfRk1UX1JHQkEsICBDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5hbHBQaXhCdWYpCi1ZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgYXJnYjMyX2Z1bGwsIEFWX1BJWF9GTVRfQVJHQiwgIENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikKK1lVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCBiZ3JhMzJfZnVsbCwgQVZfUElYX0ZNVF9CR1JBLCAgQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+bmVlZEFscGhhKQorWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIGFiZ3IzMl9mdWxsLCBBVl9QSVhfRk1UX0FCR1IsICBDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5uZWVkQWxwaGEpCitZVVYyUkdCV1JBUFBFUih5dXYyLCByZ2JfZnVsbCwgcmdiYTMyX2Z1bGwsIEFWX1BJWF9GTVRfUkdCQSwgIENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPm5lZWRBbHBoYSkKK1lVVjJSR0JXUkFQUEVSKHl1djIsIHJnYl9mdWxsLCBhcmdiMzJfZnVsbCwgQVZfUElYX0ZNVF9BUkdCLCAgQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+bmVlZEFscGhhKQogI2Vsc2UKICNpZiBDT05GSUdfU1dTQ0FMRV9BTFBIQQogWVVWMlJHQldSQVBQRVIoeXV2MiwgcmdiX2Z1bGwsIGJncmEzMl9mdWxsLCBBVl9QSVhfRk1UX0JHUkEsICAxKQpAQCAtMTg4NywxNSArMjAwNywxMyBAQAogICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGx1bUZpbHRlclNpemU7IGorKykKICAgICAgICAgICAgICAgICBBICs9IGFscFNyY1tqXVtpXSAqIGx1bUZpbHRlcltqXTsKIAotICAgICAgICAgICAgQSA+Pj0gMTk7Ci0KLSAgICAgICAgICAgIGlmIChBICYgMHgxMDApCi0gICAgICAgICAgICAgICAgQSA9IGF2X2NsaXBfdWludDgoQSk7CisgICAgICAgICAgICBpZiAoQSAmIDB4RjgwMDAwMDApCisgICAgICAgICAgICAgICAgQSA9ICBhdl9jbGlwX3VpbnRwMihBLCAyNyk7CiAgICAgICAgIH0KIAogICAgICAgICBZIC09IGMtPnl1djJyZ2JfeV9vZmZzZXQ7CiAgICAgICAgIFkgKj0gYy0+eXV2MnJnYl95X2NvZWZmOwotICAgICAgICBZICs9IDEgPDwgMjE7CisgICAgICAgIFkgKz0gMSA8PCAoU0gtMSk7CiAgICAgICAgIFIgPSBZICsgViAqIGMtPnl1djJyZ2JfdjJyX2NvZWZmOwogICAgICAgICBHID0gWSArIFYgKiBjLT55dXYycmdiX3YyZ19jb2VmZiArIFUgKiBjLT55dXYycmdiX3UyZ19jb2VmZjsKICAgICAgICAgQiA9IFkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVICogYy0+eXV2MnJnYl91MmJfY29lZmY7CkBAIC0xOTExLDEzICsyMDI5LDEzIEBACiAgICAgICAgICAgICBkZXN0MTZbMV1baV0gPSBCID4+IFNIOwogICAgICAgICAgICAgZGVzdDE2WzJdW2ldID0gUiA+PiBTSDsKICAgICAgICAgICAgIGlmIChoYXNBbHBoYSkKLSAgICAgICAgICAgICAgICBkZXN0MTZbM11baV0gPSBBOworICAgICAgICAgICAgICAgIGRlc3QxNlszXVtpXSA9IEEgPj4gKFNIIC0gMyk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBkZXN0WzBdW2ldID0gRyA+PiAyMjsKICAgICAgICAgICAgIGRlc3RbMV1baV0gPSBCID4+IDIyOwogICAgICAgICAgICAgZGVzdFsyXVtpXSA9IFIgPj4gMjI7CiAgICAgICAgICAgICBpZiAoaGFzQWxwaGEpCi0gICAgICAgICAgICAgICAgZGVzdFszXVtpXSA9IEE7CisgICAgICAgICAgICAgICAgZGVzdFszXVtpXSA9IEEgPj4gMTk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKFNIICE9IDIyICYmICghaXNCRShjLT5kc3RGb3JtYXQpKSAhPSAoIUhBVkVfQklHRU5ESUFOKSkgewpAQCAtMTkzMiw2ICsyMDUwLDgxIEBACiB9CiAKIHN0YXRpYyB2b2lkCit5dXYyZ2JycDE2X2Z1bGxfWF9jKFN3c0NvbnRleHQgKmMsIGNvbnN0IGludDE2X3QgKmx1bUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyY3gsIGludCBsdW1GaWx0ZXJTaXplLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpjaHJGaWx0ZXIsIGNvbnN0IGludDE2X3QgKipjaHJVU3JjeCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmN4LCBpbnQgY2hyRmlsdGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyY3gsIHVpbnQ4X3QgKipkZXN0LAorICAgICAgICAgICAgICAgICAgICBpbnQgZHN0VywgaW50IHkpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChjLT5kc3RGb3JtYXQpOworICAgIGludCBpOworICAgIGludCBoYXNBbHBoYSA9IChkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQSkgJiYgYWxwU3JjeDsKKyAgICB1aW50MTZfdCAqKmRlc3QxNiA9ICh1aW50MTZfdCoqKWRlc3Q7CisgICAgY29uc3QgaW50MzJfdCAqKmx1bVNyYyAgPSAoY29uc3QgaW50MzJfdCoqKWx1bVNyY3g7CisgICAgY29uc3QgaW50MzJfdCAqKmNoclVTcmMgPSAoY29uc3QgaW50MzJfdCoqKWNoclVTcmN4OworICAgIGNvbnN0IGludDMyX3QgKipjaHJWU3JjID0gKGNvbnN0IGludDMyX3QqKiljaHJWU3JjeDsKKyAgICBjb25zdCBpbnQzMl90ICoqYWxwU3JjICA9IChjb25zdCBpbnQzMl90KiopYWxwU3JjeDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBkc3RXOyBpKyspIHsKKyAgICAgICAgaW50IGo7CisgICAgICAgIGludCBZID0gLTB4NDAwMDAwMDA7CisgICAgICAgIGludCBVID0gLSgxMjggPDwgMjMpOworICAgICAgICBpbnQgViA9IC0oMTI4IDw8IDIzKTsKKyAgICAgICAgaW50IFIsIEcsIEIsIEE7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGx1bUZpbHRlclNpemU7IGorKykKKyAgICAgICAgICAgIFkgKz0gbHVtU3JjW2pdW2ldICogKHVuc2lnbmVkKWx1bUZpbHRlcltqXTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2hyRmlsdGVyU2l6ZTsgaisrKSB7CisgICAgICAgICAgICBVICs9IGNoclVTcmNbal1baV0gKiAodW5zaWduZWQpY2hyRmlsdGVyW2pdOworICAgICAgICAgICAgViArPSBjaHJWU3JjW2pdW2ldICogKHVuc2lnbmVkKWNockZpbHRlcltqXTsKKyAgICAgICAgfQorCisgICAgICAgIFkgPj49IDE0OworICAgICAgICBZICs9IDB4MTAwMDA7CisgICAgICAgIFUgPj49IDE0OworICAgICAgICBWID4+PSAxNDsKKworICAgICAgICBpZiAoaGFzQWxwaGEpIHsKKyAgICAgICAgICAgIEEgPSAtMHg0MDAwMDAwMDsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGx1bUZpbHRlclNpemU7IGorKykKKyAgICAgICAgICAgICAgICBBICs9IGFscFNyY1tqXVtpXSAqIGx1bUZpbHRlcltqXTsKKworICAgICAgICAgICAgQSA+Pj0gMTsKKyAgICAgICAgICAgIEEgKz0gMHgyMDAwMjAwMDsKKyAgICAgICAgfQorCisgICAgICAgIFkgLT0gYy0+eXV2MnJnYl95X29mZnNldDsKKyAgICAgICAgWSAqPSBjLT55dXYycmdiX3lfY29lZmY7CisgICAgICAgIFkgKz0gMSA8PCAxMzsKKyAgICAgICAgUiA9IFYgKiBjLT55dXYycmdiX3Yycl9jb2VmZjsKKyAgICAgICAgRyA9IFYgKiBjLT55dXYycmdiX3YyZ19jb2VmZiArIFUgKiBjLT55dXYycmdiX3UyZ19jb2VmZjsKKyAgICAgICAgQiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUgKiBjLT55dXYycmdiX3UyYl9jb2VmZjsKKworICAgICAgICBSID0gYXZfY2xpcF91aW50cDIoWSArIFIsIDMwKTsKKyAgICAgICAgRyA9IGF2X2NsaXBfdWludHAyKFkgKyBHLCAzMCk7CisgICAgICAgIEIgPSBhdl9jbGlwX3VpbnRwMihZICsgQiwgMzApOworCisgICAgICAgIGRlc3QxNlswXVtpXSA9IEcgPj4gMTQ7CisgICAgICAgIGRlc3QxNlsxXVtpXSA9IEIgPj4gMTQ7CisgICAgICAgIGRlc3QxNlsyXVtpXSA9IFIgPj4gMTQ7CisgICAgICAgIGlmIChoYXNBbHBoYSkKKyAgICAgICAgICAgIGRlc3QxNlszXVtpXSA9IGF2X2NsaXBfdWludHAyKEEsIDMwKSA+PiAxNDsKKyAgICB9CisgICAgaWYgKCghaXNCRShjLT5kc3RGb3JtYXQpKSAhPSAoIUhBVkVfQklHRU5ESUFOKSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZHN0VzsgaSsrKSB7CisgICAgICAgICAgICBkZXN0MTZbMF1baV0gPSBhdl9ic3dhcDE2KGRlc3QxNlswXVtpXSk7CisgICAgICAgICAgICBkZXN0MTZbMV1baV0gPSBhdl9ic3dhcDE2KGRlc3QxNlsxXVtpXSk7CisgICAgICAgICAgICBkZXN0MTZbMl1baV0gPSBhdl9ic3dhcDE2KGRlc3QxNlsyXVtpXSk7CisgICAgICAgICAgICBpZiAoaGFzQWxwaGEpCisgICAgICAgICAgICAgICAgZGVzdDE2WzNdW2ldID0gYXZfYnN3YXAxNihkZXN0MTZbM11baV0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAogeXV2MnlhOF8xX2MoU3dzQ29udGV4dCAqYywgY29uc3QgaW50MTZfdCAqYnVmMCwKICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWZbMl0sIGNvbnN0IGludDE2X3QgKnZidWZbMl0sCiAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICphYnVmMCwgdWludDhfdCAqZGVzdCwgaW50IGRzdFcsCkBAIC0yMDg1LDEwICsyMjc4LDE3IEBACiAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdCA9IGMtPmRzdEZvcm1hdDsKICAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGRzdEZvcm1hdCk7CiAKLSAgICBpZiAoaXMxNkJQUyhkc3RGb3JtYXQpKSB7CisgICAgaWYgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1AwMTBMRSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9QMDEwQkUpIHsKKyAgICAgICAgKnl1djJwbGFuZTEgPSBpc0JFKGRzdEZvcm1hdCkgPyB5dXYycDAxMGwxX0JFX2MgOiB5dXYycDAxMGwxX0xFX2M7CisgICAgICAgICp5dXYycGxhbmVYID0gaXNCRShkc3RGb3JtYXQpID8geXV2MnAwMTBsWF9CRV9jIDogeXV2MnAwMTBsWF9MRV9jOworICAgICAgICAqeXV2Mm52MTJjWCA9IHl1djJwMDEwY1hfYzsKKyAgICB9IGVsc2UgaWYgKGlzMTZCUFMoZHN0Rm9ybWF0KSkgewogICAgICAgICAqeXV2MnBsYW5lWCA9IGlzQkUoZHN0Rm9ybWF0KSA/IHl1djJwbGFuZVhfMTZCRV9jICA6IHl1djJwbGFuZVhfMTZMRV9jOwogICAgICAgICAqeXV2MnBsYW5lMSA9IGlzQkUoZHN0Rm9ybWF0KSA/IHl1djJwbGFuZTFfMTZCRV9jICA6IHl1djJwbGFuZTFfMTZMRV9jOwotICAgIH0gZWxzZSBpZiAoaXM5X09SXzEwQlBTKGRzdEZvcm1hdCkpIHsKKyAgICAgICAgaWYgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1AwMTZMRSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9QMDE2QkUpIHsKKyAgICAgICAgICAqeXV2Mm52MTJjWCA9IHl1djJwMDE2Y1hfYzsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXNOQlBTKGRzdEZvcm1hdCkpIHsKICAgICAgICAgaWYgKGRlc2MtPmNvbXBbMF0uZGVwdGggPT0gOSkgewogICAgICAgICAgICAgKnl1djJwbGFuZVggPSBpc0JFKGRzdEZvcm1hdCkgPyB5dXYycGxhbmVYXzlCRV9jICA6IHl1djJwbGFuZVhfOUxFX2M7CiAgICAgICAgICAgICAqeXV2MnBsYW5lMSA9IGlzQkUoZHN0Rm9ybWF0KSA/IHl1djJwbGFuZTFfOUJFX2MgIDogeXV2MnBsYW5lMV85TEVfYzsKQEAgLTIxMTksNyArMjMxOSw3IEBACiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYmEzMl9mdWxsXzFfYzsKICNlbHNlCiAjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKLSAgICAgICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICAgICAgaWYgKGMtPm5lZWRBbHBoYSkgewogICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiYTMyX2Z1bGxfWF9jOwogICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiYTMyX2Z1bGxfMl9jOwogICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiYTMyX2Z1bGxfMV9jOwpAQCAtMjEzOSw3ICsyMzM5LDcgQEAKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYXJnYjMyX2Z1bGxfMV9jOwogI2Vsc2UKICNpZiBDT05GSUdfU1dTQ0FMRV9BTFBIQQotICAgICAgICAgICAgICAgIGlmIChjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgICAgICAgICBpZiAoYy0+bmVlZEFscGhhKSB7CiAgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJhcmdiMzJfZnVsbF9YX2M7CiAgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJhcmdiMzJfZnVsbF8yX2M7CiAgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJhcmdiMzJfZnVsbF8xX2M7CkBAIC0yMTU5LDcgKzIzNTksNyBAQAogICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJiZ3JhMzJfZnVsbF8xX2M7CiAjZWxzZQogI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCi0gICAgICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgIGlmIChjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MmJncmEzMl9mdWxsX1hfYzsKICAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncmEzMl9mdWxsXzJfYzsKICAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MmJncmEzMl9mdWxsXzFfYzsKQEAgLTIxNzksNyArMjM3OSw3IEBACiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MmFiZ3IzMl9mdWxsXzFfYzsKICNlbHNlCiAjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKLSAgICAgICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICAgICAgaWYgKGMtPm5lZWRBbHBoYSkgewogICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyYWJncjMyX2Z1bGxfWF9jOwogICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYyYWJncjMyX2Z1bGxfMl9jOwogICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYWJncjMyX2Z1bGxfMV9jOwpAQCAtMjE5NCw3ICsyMzk0LDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NExFOgogI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCi0gICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICBpZiAoYy0+bmVlZEFscGhhKSB7CiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYmE2NGxlX2Z1bGxfWF9jOwogICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJyZ2JhNjRsZV9mdWxsXzJfYzsKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiYTY0bGVfZnVsbF8xX2M7CkBAIC0yMjA4LDcgKzI0MDgsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRCRToKICNpZiBDT05GSUdfU1dTQ0FMRV9BTFBIQQotICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgaWYgKGMtPm5lZWRBbHBoYSkgewogICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2JhNjRiZV9mdWxsX1hfYzsKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiYTY0YmVfZnVsbF8yX2M7CiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYmE2NGJlX2Z1bGxfMV9jOwpAQCAtMjIyMiw3ICsyNDIyLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTY0TEU6CiAjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKLSAgICAgICAgICAgIGlmIChjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgICAgIGlmIChjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYyYmdyYTY0bGVfZnVsbF9YX2M7CiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MmJncmE2NGxlX2Z1bGxfMl9jOwogICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJiZ3JhNjRsZV9mdWxsXzFfYzsKQEAgLTIyMzYsNyArMjQzNiw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NEJFOgogI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCi0gICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICBpZiAoYy0+bmVlZEFscGhhKSB7CiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MmJncmE2NGJlX2Z1bGxfWF9jOwogICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJiZ3JhNjRiZV9mdWxsXzJfYzsKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYmdyYTY0YmVfZnVsbF8xX2M7CkBAIC0yMzA4LDEwICsyNTA4LDE4IEBACiAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTJMRToKICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNEJFOgogICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSUDE0TEU6CisgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDoKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTBCRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTBMRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTJCRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTJMRToKKyAgICAgICAgICAgICp5dXYyYW55WCA9IHl1djJnYnJwX2Z1bGxfWF9jOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJQMTZCRToKICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUlAxNkxFOgotICAgICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVA6Ci0gICAgICAgICAgICAqeXV2MmFueVggPSB5dXYyZ2JycF9mdWxsX1hfYzsKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTZCRToKKyAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTZMRToKKyAgICAgICAgICAgICp5dXYyYW55WCA9IHl1djJnYnJwMTZfZnVsbF9YX2M7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoISp5dXYycGFja2VkWCAmJiAhKnl1djJhbnlYKQpAQCAtMjMyMSw3ICsyNTI5LDcgQEAKICAgICAgICAgc3dpdGNoIChkc3RGb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1JHQkE2NExFOgogI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCi0gICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICBpZiAoYy0+bmVlZEFscGhhKSB7CiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYmE2NGxlXzFfYzsKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYycmdiYTY0bGVfMl9jOwogICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2JhNjRsZV9YX2M7CkBAIC0yMzM1LDcgKzI1NDMsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRCRToKICNpZiBDT05GSUdfU1dTQ0FMRV9BTFBIQQotICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgaWYgKGMtPm5lZWRBbHBoYSkgewogICAgICAgICAgICAgICAgICp5dXYycGFja2VkMSA9IHl1djJyZ2JhNjRiZV8xX2M7CiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MnJnYmE2NGJlXzJfYzsKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiYTY0YmVfWF9jOwpAQCAtMjM0OSw3ICsyNTU3LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQkdSQTY0TEU6CiAjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKLSAgICAgICAgICAgIGlmIChjLT5hbHBQaXhCdWYpIHsKKyAgICAgICAgICAgIGlmIChjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYyYmdyYTY0bGVfMV9jOwogICAgICAgICAgICAgICAgICp5dXYycGFja2VkMiA9IHl1djJiZ3JhNjRsZV8yX2M7CiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MmJncmE2NGxlX1hfYzsKQEAgLTIzNjMsNyArMjU3MSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NEJFOgogI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCi0gICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICBpZiAoYy0+bmVlZEFscGhhKSB7CiAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MmJncmE2NGJlXzFfYzsKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDIgPSB5dXYyYmdyYTY0YmVfMl9jOwogICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJiZ3JhNjRiZV9YX2M7CkBAIC0yNDAzLDcgKzI2MTEsNyBAQAogICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYjMyX1hfYzsKICNlbHNlCiAjaWYgQ09ORklHX1NXU0NBTEVfQUxQSEEKLSAgICAgICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKSB7CisgICAgICAgICAgICAgICAgaWYgKGMtPm5lZWRBbHBoYSkgewogICAgICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZDEgPSB5dXYycmdiYTMyXzFfYzsKICAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MnJnYmEzMl8yX2M7CiAgICAgICAgICAgICAgICAgICAgICp5dXYycGFja2VkWCA9IHl1djJyZ2JhMzJfWF9jOwpAQCAtMjQyNCw3ICsyNjMyLDcgQEAKICAgICAgICAgICAgICAgICAqeXV2MnBhY2tlZFggPSB5dXYycmdiMzJfMV9YX2M7CiAjZWxzZQogI2lmIENPTkZJR19TV1NDQUxFX0FMUEhBCi0gICAgICAgICAgICAgICAgaWYgKGMtPmFscFBpeEJ1ZikgeworICAgICAgICAgICAgICAgIGlmIChjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQxID0geXV2MnJnYmEzMl8xXzFfYzsKICAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWQyID0geXV2MnJnYmEzMl8xXzJfYzsKICAgICAgICAgICAgICAgICAgICAgKnl1djJwYWNrZWRYID0geXV2MnJnYmEzMl8xX1hfYzsKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvcHBjL3N3c2NhbGVfYWx0aXZlYy5jIGIvbGlic3dzY2FsZS9wcGMvc3dzY2FsZV9hbHRpdmVjLmMKaW5kZXggYWY5ZmM4OC4uOTQzOGE2MyAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9wcGMvc3dzY2FsZV9hbHRpdmVjLmMKKysrIGIvbGlic3dzY2FsZS9wcGMvc3dzY2FsZV9hbHRpdmVjLmMKQEAgLTMzNywxNSArMzM3LDE1IEBACiAgICAgaWYgKGMtPnNyY0JwYyA9PSA4ICYmIGMtPmRzdEJwYyA8PSAxNCkgewogICAgICAgICBjLT5oeVNjYWxlID0gYy0+aGNTY2FsZSA9IGhTY2FsZV9hbHRpdmVjX3JlYWw7CiAgICAgfQotICAgIGlmICghaXMxNkJQUyhkc3RGb3JtYXQpICYmICFpczlfT1JfMTBCUFMoZHN0Rm9ybWF0KSAmJgorICAgIGlmICghaXMxNkJQUyhkc3RGb3JtYXQpICYmICFpc05CUFMoZHN0Rm9ybWF0KSAmJgogICAgICAgICBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9OVjEyICYmIGRzdEZvcm1hdCAhPSBBVl9QSVhfRk1UX05WMjEgJiYKLSAgICAgICAgIWMtPmFscFBpeEJ1ZikgeworICAgICAgICAhYy0+bmVlZEFscGhhKSB7CiAgICAgICAgIGMtPnl1djJwbGFuZVggPSB5dXYycGxhbmVYX2FsdGl2ZWM7CiAgICAgfQogCiAgICAgLyogVGhlIGZvbGxvd2luZyBsaXN0IG9mIHN1cHBvcnRlZCBkc3RGb3JtYXQgdmFsdWVzIHNob3VsZAogICAgICAqIG1hdGNoIHdoYXQncyBmb3VuZCBpbiB0aGUgYm9keSBvZiBmZl95dXYycGFja2VkWF9hbHRpdmVjKCkgKi8KLSAgICBpZiAoIShjLT5mbGFncyAmIChTV1NfQklURVhBQ1QgfCBTV1NfRlVMTF9DSFJfSF9JTlQpKSAmJiAhYy0+YWxwUGl4QnVmKSB7CisgICAgaWYgKCEoYy0+ZmxhZ3MgJiAoU1dTX0JJVEVYQUNUIHwgU1dTX0ZVTExfQ0hSX0hfSU5UKSkgJiYgIWMtPm5lZWRBbHBoYSkgewogICAgICAgICBzd2l0Y2ggKGMtPmRzdEZvcm1hdCkgewogICAgICAgICBjYXNlIEFWX1BJWF9GTVRfQUJHUjoKICAgICAgICAgICAgIGMtPnl1djJwYWNrZWRYID0gZmZfeXV2MmFiZ3JfWF9hbHRpdmVjOwpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS9wcGMveXV2MnJnYl9hbHRpdmVjLmMgYi9saWJzd3NjYWxlL3BwYy95dXYycmdiX2FsdGl2ZWMuYwppbmRleCA2Mzg3MDZmLi5jMWUyODUyIDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL3BwYy95dXYycmdiX2FsdGl2ZWMuYworKysgYi9saWJzd3NjYWxlL3BwYy95dXYycmdiX2FsdGl2ZWMuYwpAQCAtODksNyArODksNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJsaWJzd3NjYWxlL3JnYjJyZ2IuaCIKQEAgLTE0Miw3ICsxNDEsNiBAQAogICogICAgICAgICAgIGJyZ2J8cmdicnxnYnJnfGJyZ2IKICAqICAgICAgICAgICAxMDAxIDAwMTAgMDEwMCAxMDAxCiAgKiAgICAgICAgICAgYTY3YiA4OWNBIEJkQ0QgZUVGZgotICoKICAqLwogc3RhdGljIGNvbnN0IHZlY3RvciB1bnNpZ25lZCBjaGFyCiAgICAgcGVybV9yZ2JfMCA9IHsgMHgwMCwgMHgwMSwgMHgxMCwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvcmdiMnJnYi5jIGIvbGlic3dzY2FsZS9yZ2IycmdiLmMKaW5kZXggZjdmODE4OC4uZWFiOGU2YSAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9yZ2IycmdiLmMKKysrIGIvbGlic3dzY2FsZS9yZ2IycmdiLmMKQEAgLTUzLDYgKzUzLDEwIEBACiAKIHZvaWQgKCpzaHVmZmxlX2J5dGVzXzAzMjEpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwogdm9pZCAoKnNodWZmbGVfYnl0ZXNfMjEwMykoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICgqc2h1ZmZsZV9ieXRlc18xMjMwKShjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgKCpzaHVmZmxlX2J5dGVzXzMwMTIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAoKnNodWZmbGVfYnl0ZXNfMzIxMCkoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CisKIAogdm9pZCAoKnl2MTJ0b3l1eTIpKGNvbnN0IHVpbnQ4X3QgKnlzcmMsIGNvbnN0IHVpbnQ4X3QgKnVzcmMsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdnNyYywgdWludDhfdCAqZHN0LApAQCAtMzE5LDI1ICszMjMsNiBAQAogICAgIH0KIH0KIAotCi0jZGVmaW5lIERFRklORV9TSFVGRkxFX0JZVEVTKGEsIGIsIGMsIGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi12b2lkIHNodWZmbGVfYnl0ZXNfICMjIGEgIyMgYiAjIyBjICMjIGQoY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpICAgICBcCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpID0gMDsgaSA8IHNyY19zaXplOyBpICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRzdFtpICsgMF0gPSBzcmNbaSArIGFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRzdFtpICsgMV0gPSBzcmNbaSArIGJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRzdFtpICsgMl0gPSBzcmNbaSArIGNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRzdFtpICsgM10gPSBzcmNbaSArIGRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLURFRklORV9TSFVGRkxFX0JZVEVTKDEsIDIsIDMsIDApCi1ERUZJTkVfU0hVRkZMRV9CWVRFUygzLCAwLCAxLCAyKQotREVGSU5FX1NIVUZGTEVfQllURVMoMywgMiwgMSwgMCkKLQogI2RlZmluZSBERUZJTkVfUkdCNDhUT0JHUjQ4KG5lZWRfYnN3YXAsIHN3YXApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogdm9pZCByZ2I0OHRvYmdyNDhfICMjIG5lZWRfYnN3YXAoY29uc3QgdWludDhfdCAqc3JjLCAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpICAgICAgICAgICAgXApAQCAtMzkxLDMgKzM3Niw0MSBAQAogCiBERUZJTkVfUkdCNjRUTzQ4KG5vYnN3YXAsIDApCiBERUZJTkVfUkdCNjRUTzQ4KGJzd2FwLCAxKQorCisjZGVmaW5lIERFRklORV9SR0I0OFRPQkdSNjQobmVlZF9ic3dhcCwgc3dhcCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIHJnYjQ4dG9iZ3I2NF8gIyMgbmVlZF9ic3dhcChjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgKmQgPSAodWludDE2X3QgKilkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDE2X3QgKnMgPSAodWludDE2X3QgKilzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIG51bV9waXhlbHMgPSBzcmNfc2l6ZSAvIDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRbNCAqIGkgICAgXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbMyAqIGkgKyAyXSkgOiBzWzMgKiBpICsgMl07ICBcCisgICAgICAgIGRbNCAqIGkgKyAxXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbMyAqIGkgKyAxXSkgOiBzWzMgKiBpICsgMV07ICBcCisgICAgICAgIGRbNCAqIGkgKyAyXSA9IHN3YXAgPyBhdl9ic3dhcDE2KHNbMyAqIGkgICAgXSkgOiBzWzMgKiBpICAgIF07ICBcCisgICAgICAgIGRbNCAqIGkgKyAzXSA9IDB4RkZGRjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0RFRklORV9SR0I0OFRPQkdSNjQobm9ic3dhcCwgMCkKK0RFRklORV9SR0I0OFRPQkdSNjQoYnN3YXAsIDEpCisKKyNkZWZpbmUgREVGSU5FX1JHQjQ4VE82NChuZWVkX2Jzd2FwLCBzd2FwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgcmdiNDh0bzY0XyAjIyBuZWVkX2Jzd2FwKGNvbnN0IHVpbnQ4X3QgKnNyYywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCAqZCA9ICh1aW50MTZfdCAqKWRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCAqcyA9ICh1aW50MTZfdCAqKXNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgbnVtX3BpeGVscyA9IHNyY19zaXplIC8gNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZFs0ICogaSAgICBdID0gc3dhcCA/IGF2X2Jzd2FwMTYoc1szICogaSAgICBdKSA6IHNbMyAqIGkgICAgXTsgIFwKKyAgICAgICAgZFs0ICogaSArIDFdID0gc3dhcCA/IGF2X2Jzd2FwMTYoc1szICogaSArIDFdKSA6IHNbMyAqIGkgKyAxXTsgIFwKKyAgICAgICAgZFs0ICogaSArIDJdID0gc3dhcCA/IGF2X2Jzd2FwMTYoc1szICogaSArIDJdKSA6IHNbMyAqIGkgKyAyXTsgIFwKKyAgICAgICAgZFs0ICogaSArIDNdID0gMHhGRkZGOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVGSU5FX1JHQjQ4VE82NChub2Jzd2FwLCAwKQorREVGSU5FX1JHQjQ4VE82NChic3dhcCwgMSkKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvcmdiMnJnYi5oIGIvbGlic3dzY2FsZS9yZ2IycmdiLmgKaW5kZXggMDY0NTQwNC4uMzU2OTI1NCAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9yZ2IycmdiLmgKKysrIGIvbGlic3dzY2FsZS9yZ2IycmdiLmgKQEAgLTUyLDYgKzUyLDkgQEAKIAogZXh0ZXJuIHZvaWQgKCpzaHVmZmxlX2J5dGVzXzAzMjEpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwogZXh0ZXJuIHZvaWQgKCpzaHVmZmxlX2J5dGVzXzIxMDMpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpzaHVmZmxlX2J5dGVzXzEyMzApKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpzaHVmZmxlX2J5dGVzXzMwMTIpKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOworZXh0ZXJuIHZvaWQgKCpzaHVmZmxlX2J5dGVzXzMyMTApKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwogCiB2b2lkIHJnYjY0dG9iZ3I0OF9ub2Jzd2FwKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwogdm9pZCAgIHJnYjY0dG9iZ3I0OF9ic3dhcChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKQEAgLTU5LDYgKzYyLDEwIEBACiB2b2lkICAgcmdiNDh0b2JncjQ4X2Jzd2FwKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwogdm9pZCAgICByZ2I2NHRvNDhfbm9ic3dhcChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKIHZvaWQgICAgICByZ2I2NHRvNDhfYnN3YXAoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkIHJnYjQ4dG9iZ3I2NF9ub2Jzd2FwKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCAgIHJnYjQ4dG9iZ3I2NF9ic3dhcChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgICAgcmdiNDh0bzY0X25vYnN3YXAoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkICAgICAgcmdiNDh0bzY0X2Jzd2FwKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwogdm9pZCAgICByZ2IyNHRvMzIoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CiB2b2lkICAgIHJnYjMydG8yNChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKIHZvaWQgcmdiMTZ0b2JncjMyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwpAQCAtNzIsMTAgKzc5LDYgQEAKIHZvaWQgcmdiMTJ0b2JncjEyKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwogdm9pZCAgICByZ2IxMnRvMTUoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CiAKLXZvaWQgc2h1ZmZsZV9ieXRlc18xMjMwKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwotdm9pZCBzaHVmZmxlX2J5dGVzXzMwMTIoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Ci12b2lkIHNodWZmbGVfYnl0ZXNfMzIxMChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKLQogdm9pZCBmZl9yZ2IyNHRveXYxMl9jKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqeWRzdCwgdWludDhfdCAqdWRzdCwKICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp2ZHN0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsdW1TdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGNocm9tU3RyaWRlLCBpbnQgc3JjU3RyaWRlLCBpbnQzMl90ICpyZ2IyeXV2KTsKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvcmdiMnJnYl90ZW1wbGF0ZS5jIGIvbGlic3dzY2FsZS9yZ2IycmdiX3RlbXBsYXRlLmMKaW5kZXggNDk5ZDI1Yi4uZmI3ZDY2MyAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9yZ2IycmdiX3RlbXBsYXRlLmMKKysrIGIvbGlic3dzY2FsZS9yZ2IycmdiX3RlbXBsYXRlLmMKQEAgLTM0Miw2ICszNDIsMjQgQEAKICAgICB9CiB9CiAKKyNkZWZpbmUgREVGSU5FX1NIVUZGTEVfQllURVMobmFtZSwgYSwgYiwgYywgZCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHNodWZmbGVfYnl0ZXNfIyNuYW1lIChjb25zdCB1aW50OF90ICpzcmMsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgc3JjX3NpemU7IGkgKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2kgKyAwXSA9IHNyY1tpICsgYV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2kgKyAxXSA9IHNyY1tpICsgYl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2kgKyAyXSA9IHNyY1tpICsgY107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2kgKyAzXSA9IHNyY1tpICsgZF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworREVGSU5FX1NIVUZGTEVfQllURVMoMTIzMF9jLCAxLCAyLCAzLCAwKQorREVGSU5FX1NIVUZGTEVfQllURVMoMzAxMl9jLCAzLCAwLCAxLCAyKQorREVGSU5FX1NIVUZGTEVfQllURVMoMzIxMF9jLCAzLCAyLCAxLCAwKQorCiBzdGF0aWMgaW5saW5lIHZvaWQgcmdiMjR0b2JncjI0X2MoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSkKIHsKICAgICB1bnNpZ25lZCBpOwpAQCAtOTQ5LDYgKzk2Nyw5IEBACiAjZWxzZQogICAgIHNodWZmbGVfYnl0ZXNfMDMyMSA9IHNodWZmbGVfYnl0ZXNfMDMyMV9jOwogICAgIHNodWZmbGVfYnl0ZXNfMjEwMyA9IHNodWZmbGVfYnl0ZXNfMjEwM19jOworICAgIHNodWZmbGVfYnl0ZXNfMTIzMCA9IHNodWZmbGVfYnl0ZXNfMTIzMF9jOworICAgIHNodWZmbGVfYnl0ZXNfMzAxMiA9IHNodWZmbGVfYnl0ZXNfMzAxMl9jOworICAgIHNodWZmbGVfYnl0ZXNfMzIxMCA9IHNodWZmbGVfYnl0ZXNfMzIxMF9jOwogI2VuZGlmCiAgICAgcmdiMzJ0b2JncjE2ICAgICAgID0gcmdiMzJ0b2JncjE2X2M7CiAgICAgcmdiMzJ0b2JncjE1ICAgICAgID0gcmdiMzJ0b2JncjE1X2M7CmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3NsaWNlLmMgYi9saWJzd3NjYWxlL3NsaWNlLmMKaW5kZXggNjZmZTQxMy4uZGI0ZmE4NyAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9zbGljZS5jCisrKyBiL2xpYnN3c2NhbGUvc2xpY2UuYwpAQCAtMTU4LDEwICsxNTgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNoclkgKyBjaHJILAogICAgICAgICAgICAgICAgICAgICAgICAgbHVtWSArIGx1bUh9OwogCi0gICAgY29uc3QgdWludDhfdCAqc3JjX1s0XSA9IHtzcmNbMF0gKyAocmVsYXRpdmUgPyAwIDogc3RhcnRbMF0pICogc3RyaWRlWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWzFdICsgKHJlbGF0aXZlID8gMCA6IHN0YXJ0WzFdKSAqIHN0cmlkZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1syXSArIChyZWxhdGl2ZSA/IDAgOiBzdGFydFsyXSkgKiBzdHJpZGVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbM10gKyAocmVsYXRpdmUgPyAwIDogc3RhcnRbM10pICogc3RyaWRlWzBdfTsKKyAgICB1aW50OF90ICpjb25zdCBzcmNfWzRdID0ge3NyY1swXSArIChyZWxhdGl2ZSA/IDAgOiBzdGFydFswXSkgKiBzdHJpZGVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbMV0gKyAocmVsYXRpdmUgPyAwIDogc3RhcnRbMV0pICogc3RyaWRlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWzJdICsgKHJlbGF0aXZlID8gMCA6IHN0YXJ0WzJdKSAqIHN0cmlkZVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1szXSArIChyZWxhdGl2ZSA/IDAgOiBzdGFydFszXSkgKiBzdHJpZGVbM119OwogCiAgICAgcy0+d2lkdGggPSBzcmNXOwogCkBAIC0yMTAsNiArMjEwLDQyIEBACiAgICAgfQogfQogCisvKgorIENhbGN1bGF0ZXMgdGhlIG1pbmltdW0gcmluZyBidWZmZXIgc2l6ZSwgaXQgc2hvdWxkIGJlIGFibGUgdG8gc3RvcmUgdkZpbHRlclNpemUKKyBtb3JlIG4gbGluZXMgd2hlcmUgbiBpcyB0aGUgbWF4IGRpZmZlcmVuY2UgYmV0d2VlbiBlYWNoIGFkamFjZW50IHNsaWNlIHdoaWNoCisgb3V0cHV0cyBhIGxpbmUuCisgVGhlIG4gbGluZXMgYXJlIG5lZWRlZCBvbmx5IHdoZW4gdGhlcmUgaXMgbm90IGVub3VnaCBzcmMgbGluZXMgdG8gb3V0cHV0IGEgc2luZ2xlCisgZHN0IGxpbmUsIHRoZW4gd2Ugc2hvdWxkIGJ1ZmZlciB0aGVzZSBsaW5lcyB0byBwcm9jZXNzIHRoZW0gb24gdGhlIG5leHQgY2FsbCB0byBzY2FsZS4KKyovCitzdGF0aWMgdm9pZCBnZXRfbWluX2J1ZmZlcl9zaXplKFN3c0NvbnRleHQgKmMsIGludCAqb3V0X2x1bV9zaXplLCBpbnQgKm91dF9jaHJfc2l6ZSkKK3sKKyAgICBpbnQgbHVtWTsKKyAgICBpbnQgZHN0SCA9IGMtPmRzdEg7CisgICAgaW50IGNockRzdEggPSBjLT5jaHJEc3RIOworICAgIGludCAqbHVtRmlsdGVyUG9zID0gYy0+dkx1bUZpbHRlclBvczsKKyAgICBpbnQgKmNockZpbHRlclBvcyA9IGMtPnZDaHJGaWx0ZXJQb3M7CisgICAgaW50IGx1bUZpbHRlclNpemUgPSBjLT52THVtRmlsdGVyU2l6ZTsKKyAgICBpbnQgY2hyRmlsdGVyU2l6ZSA9IGMtPnZDaHJGaWx0ZXJTaXplOworICAgIGludCBjaHJTdWJTYW1wbGUgPSBjLT5jaHJTcmNWU3ViU2FtcGxlOworCisgICAgKm91dF9sdW1fc2l6ZSA9IGx1bUZpbHRlclNpemU7CisgICAgKm91dF9jaHJfc2l6ZSA9IGNockZpbHRlclNpemU7CisKKyAgICBmb3IgKGx1bVkgPSAwOyBsdW1ZIDwgZHN0SDsgbHVtWSsrKSB7CisgICAgICAgIGludCBjaHJZICAgICAgPSAoaW50NjRfdClsdW1ZICogY2hyRHN0SCAvIGRzdEg7CisgICAgICAgIGludCBuZXh0U2xpY2UgPSBGRk1BWChsdW1GaWx0ZXJQb3NbbHVtWV0gKyBsdW1GaWx0ZXJTaXplIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY2hyRmlsdGVyUG9zW2NoclldICsgY2hyRmlsdGVyU2l6ZSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgY2hyU3ViU2FtcGxlKSk7CisKKyAgICAgICAgbmV4dFNsaWNlID4+PSBjaHJTdWJTYW1wbGU7CisgICAgICAgIG5leHRTbGljZSA8PD0gY2hyU3ViU2FtcGxlOworICAgICAgICAoKm91dF9sdW1fc2l6ZSkgPSBGRk1BWCgoKm91dF9sdW1fc2l6ZSksIG5leHRTbGljZSAtIGx1bUZpbHRlclBvc1tsdW1ZXSk7CisgICAgICAgICgqb3V0X2Nocl9zaXplKSA9IEZGTUFYKCgqb3V0X2Nocl9zaXplKSwgKG5leHRTbGljZSA+PiBjaHJTdWJTYW1wbGUpIC0gY2hyRmlsdGVyUG9zW2NoclldKTsKKyAgICB9Cit9CisKKworCiBpbnQgZmZfaW5pdF9maWx0ZXJzKFN3c0NvbnRleHQgKiBjKQogewogICAgIGludCBpOwpAQCAtMjI2LDYgKzI2MiwxMyBAQAogICAgIHVpbnQzMl90ICogcGFsID0gdXNlUGFsKGMtPnNyY0Zvcm1hdCkgPyBjLT5wYWxfeXV2IDogKHVpbnQzMl90KiljLT5pbnB1dF9yZ2IyeXV2X3RhYmxlOwogICAgIGludCByZXMgPSAwOwogCisgICAgaW50IGx1bUJ1ZlNpemU7CisgICAgaW50IGNockJ1ZlNpemU7CisKKyAgICBnZXRfbWluX2J1ZmZlcl9zaXplKGMsICZsdW1CdWZTaXplLCAmY2hyQnVmU2l6ZSk7CisgICAgbHVtQnVmU2l6ZSA9IEZGTUFYKGx1bUJ1ZlNpemUsIGMtPnZMdW1GaWx0ZXJTaXplICsgTUFYX0xJTkVTX0FIRUFEKTsKKyAgICBjaHJCdWZTaXplID0gRkZNQVgoY2hyQnVmU2l6ZSwgYy0+dkNockZpbHRlclNpemUgKyBNQVhfTElORVNfQUhFQUQpOworCiAgICAgaWYgKGMtPmRzdEJwYyA9PSAxNikKICAgICAgICAgZHN0X3N0cmlkZSA8PD0gMTsKIApAQCAtMjQ4LDEzICsyOTEsMTMgQEAKICAgICByZXMgPSBhbGxvY19zbGljZSgmYy0+c2xpY2VbMF0sIGMtPnNyY0Zvcm1hdCwgYy0+c3JjSCwgYy0+Y2hyU3JjSCwgYy0+Y2hyU3JjSFN1YlNhbXBsZSwgYy0+Y2hyU3JjVlN1YlNhbXBsZSwgMCk7CiAgICAgaWYgKHJlcyA8IDApIGdvdG8gY2xlYW51cDsKICAgICBmb3IgKGkgPSAxOyBpIDwgYy0+bnVtU2xpY2UtMjsgKytpKSB7Ci0gICAgICAgIHJlcyA9IGFsbG9jX3NsaWNlKCZjLT5zbGljZVtpXSwgYy0+c3JjRm9ybWF0LCBjLT52THVtRmlsdGVyU2l6ZSArIE1BWF9MSU5FU19BSEVBRCwgYy0+dkNockZpbHRlclNpemUgKyBNQVhfTElORVNfQUhFQUQsIGMtPmNoclNyY0hTdWJTYW1wbGUsIGMtPmNoclNyY1ZTdWJTYW1wbGUsIDApOworICAgICAgICByZXMgPSBhbGxvY19zbGljZSgmYy0+c2xpY2VbaV0sIGMtPnNyY0Zvcm1hdCwgbHVtQnVmU2l6ZSwgY2hyQnVmU2l6ZSwgYy0+Y2hyU3JjSFN1YlNhbXBsZSwgYy0+Y2hyU3JjVlN1YlNhbXBsZSwgMCk7CiAgICAgICAgIGlmIChyZXMgPCAwKSBnb3RvIGNsZWFudXA7CiAgICAgICAgIHJlcyA9IGFsbG9jX2xpbmVzKCZjLT5zbGljZVtpXSwgRkZBTElHTihjLT5zcmNXKjIrNzgsIDE2KSwgYy0+c3JjVyk7CiAgICAgICAgIGlmIChyZXMgPCAwKSBnb3RvIGNsZWFudXA7CiAgICAgfQogICAgIC8vIGhvcml6b250YWwgc2NhbGVyIG91dHB1dAotICAgIHJlcyA9IGFsbG9jX3NsaWNlKCZjLT5zbGljZVtpXSwgYy0+c3JjRm9ybWF0LCBjLT52THVtRmlsdGVyU2l6ZSArIE1BWF9MSU5FU19BSEVBRCwgYy0+dkNockZpbHRlclNpemUgKyBNQVhfTElORVNfQUhFQUQsIGMtPmNockRzdEhTdWJTYW1wbGUsIGMtPmNockRzdFZTdWJTYW1wbGUsIDEpOworICAgIHJlcyA9IGFsbG9jX3NsaWNlKCZjLT5zbGljZVtpXSwgYy0+c3JjRm9ybWF0LCBsdW1CdWZTaXplLCBjaHJCdWZTaXplLCBjLT5jaHJEc3RIU3ViU2FtcGxlLCBjLT5jaHJEc3RWU3ViU2FtcGxlLCAxKTsKICAgICBpZiAocmVzIDwgMCkgZ290byBjbGVhbnVwOwogICAgIHJlcyA9IGFsbG9jX2xpbmVzKCZjLT5zbGljZVtpXSwgZHN0X3N0cmlkZSwgYy0+ZHN0Vyk7CiAgICAgaWYgKHJlcyA8IDApIGdvdG8gY2xlYW51cDsKQEAgLTI3OSw3ICszMjIsNyBAQAogICAgIGlmIChuZWVkX2x1bV9jb252KSB7CiAgICAgICAgIHJlcyA9IGZmX2luaXRfZGVzY19mbXRfY29udmVydCgmYy0+ZGVzY1tpbmRleF0sICZjLT5zbGljZVtzcmNJZHhdLCAmYy0+c2xpY2VbZHN0SWR4XSwgcGFsKTsKICAgICAgICAgaWYgKHJlcyA8IDApIGdvdG8gY2xlYW51cDsKLSAgICAgICAgYy0+ZGVzY1tpbmRleF0uYWxwaGEgPSBjLT5hbHBQaXhCdWYgIT0gMDsKKyAgICAgICAgYy0+ZGVzY1tpbmRleF0uYWxwaGEgPSBjLT5uZWVkQWxwaGE7CiAgICAgICAgICsraW5kZXg7CiAgICAgICAgIHNyY0lkeCA9IGRzdElkeDsKICAgICB9CkBAIC0yODgsNyArMzMxLDcgQEAKICAgICBkc3RJZHggPSBGRk1BWChudW1feWRlc2MsIG51bV9jZGVzYyk7CiAgICAgcmVzID0gZmZfaW5pdF9kZXNjX2hzY2FsZSgmYy0+ZGVzY1tpbmRleF0sICZjLT5zbGljZVtzcmNJZHhdLCAmYy0+c2xpY2VbZHN0SWR4XSwgYy0+aEx1bUZpbHRlciwgYy0+aEx1bUZpbHRlclBvcywgYy0+aEx1bUZpbHRlclNpemUsIGMtPmx1bVhJbmMpOwogICAgIGlmIChyZXMgPCAwKSBnb3RvIGNsZWFudXA7Ci0gICAgYy0+ZGVzY1tpbmRleF0uYWxwaGEgPSBjLT5hbHBQaXhCdWYgIT0gMDsKKyAgICBjLT5kZXNjW2luZGV4XS5hbHBoYSA9IGMtPm5lZWRBbHBoYTsKIAogCiAgICAgKytpbmRleDsKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvc3dzY2FsZS10ZXN0LmMgYi9saWJzd3NjYWxlL3N3c2NhbGUtdGVzdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDhkMDhiLi4wMDAwMDAwCi0tLSBhL2xpYnN3c2NhbGUvc3dzY2FsZS10ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMy0yMDExIE1pY2hhZWwgTmllZGVybWF5ZXIgPG1pY2hhZWxuaUBnbXguYXQ+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgotICoKLSAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgotICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSN1bmRlZiBIQVZFX0FWX0NPTkZJR19ICi0jaW5jbHVkZSAibGliYXZ1dGlsL2ltZ3V0aWxzLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC9hdnV0aWwuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvY3JjLmgiCi0jaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKLSNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCi0jaW5jbHVkZSAic3dzY2FsZS5oIgotCi0vKiBIQUNLIER1cGxpY2F0ZWQgZnJvbSBzd3NjYWxlX2ludGVybmFsLmguCi0gKiBTaG91bGQgYmUgcmVtb3ZlZCB3aGVuIGEgY2xlYW5lciBwaXhlbCBmb3JtYXQgc3lzdGVtIGV4aXN0cy4gKi8KLSNkZWZpbmUgaXNHcmF5KHgpICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoKHgpID09IEFWX1BJWF9GTVRfR1JBWTggICAgICAgfHwgICAgIFwKLSAgICAgKHgpID09IEFWX1BJWF9GTVRfWUE4ICAgICAgICAgfHwgICAgIFwKLSAgICAgKHgpID09IEFWX1BJWF9GTVRfR1JBWTE2QkUgICAgfHwgICAgIFwKLSAgICAgKHgpID09IEFWX1BJWF9GTVRfR1JBWTE2TEUgICAgfHwgICAgIFwKLSAgICAgKHgpID09IEFWX1BJWF9GTVRfWUExNkJFICAgICAgfHwgICAgIFwKLSAgICAgKHgpID09IEFWX1BJWF9GTVRfWUExNkxFKQotI2RlZmluZSBoYXNDaHJvbWEoeCkgICAgICAgICAgICAgICAgICAgXAotICAgICghKGlzR3JheSh4KSAgICAgICAgICAgICAgICB8fCAgICAgXAotICAgICAgICh4KSA9PSBBVl9QSVhfRk1UX01PTk9CTEFDSyB8fCAgICAgXAotICAgICAgICh4KSA9PSBBVl9QSVhfRk1UX01PTk9XSElURSkpCi0jZGVmaW5lIGlzQUxQSEEoeCkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKCh4KSA9PSBBVl9QSVhfRk1UX0JHUjMyICAgfHwgICAgICAgICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjMyXzEgfHwgICAgICAgICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX1JHQjMyICAgfHwgICAgICAgICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX1JHQjMyXzEgfHwgICAgICAgICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKQotCi1zdGF0aWMgdWludDY0X3QgZ2V0U1NEKGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsIGludCBzdHJpZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlMiwgaW50IHcsIGludCBoKQotewotICAgIGludCB4LCB5OwotICAgIHVpbnQ2NF90IHNzZCA9IDA7Ci0KLSAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKLSAgICAgICAgICAgIGludCBkID0gc3JjMVt4ICsgeSAqIHN0cmlkZTFdIC0gc3JjMlt4ICsgeSAqIHN0cmlkZTJdOwotICAgICAgICAgICAgc3NkICs9IGQgKiBkOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzc2Q7Ci19Ci0KLXN0cnVjdCBSZXN1bHRzIHsKLSAgICB1aW50NjRfdCBzc2RZOwotICAgIHVpbnQ2NF90IHNzZFU7Ci0gICAgdWludDY0X3Qgc3NkVjsKLSAgICB1aW50NjRfdCBzc2RBOwotICAgIHVpbnQzMl90IGNyYzsKLX07Ci0KLS8vIHRlc3QgYnkgcmVmIC0+IHNyYyAtPiBkc3QgLT4gb3V0ICYgY29tcGFyZSBvdXQgYWdhaW5zdCByZWYKLS8vIHJlZiAmIG91dCBhcmUgWVYxMgotc3RhdGljIGludCBkb1Rlc3QodWludDhfdCAqcmVmWzRdLCBpbnQgcmVmU3RyaWRlWzRdLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0LCBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgaW50IHNyY1csIGludCBzcmNILCBpbnQgZHN0VywgaW50IGRzdEgsIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgIHN0cnVjdCBSZXN1bHRzICpyKQotewotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzY195dXZhNDIwcCA9IGF2X3BpeF9mbXRfZGVzY19nZXQoQVZfUElYX0ZNVF9ZVVZBNDIwUCk7Ci0gICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjX3NyYyAgICAgID0gYXZfcGl4X2ZtdF9kZXNjX2dldChzcmNGb3JtYXQpOwotICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzY19kc3QgICAgICA9IGF2X3BpeF9mbXRfZGVzY19nZXQoZHN0Rm9ybWF0KTsKLSAgICBzdGF0aWMgZW51bSBBVlBpeGVsRm9ybWF0IGN1cl9zcmNGb3JtYXQ7Ci0gICAgc3RhdGljIGludCBjdXJfc3JjVywgY3VyX3NyY0g7Ci0gICAgc3RhdGljIHVpbnQ4X3QgKnNyY1s0XTsKLSAgICBzdGF0aWMgaW50IHNyY1N0cmlkZVs0XTsKLSAgICB1aW50OF90ICpkc3RbNF0gPSB7IDAgfTsKLSAgICB1aW50OF90ICpvdXRbNF0gPSB7IDAgfTsKLSAgICBpbnQgZHN0U3RyaWRlWzRdID0gezB9OwotICAgIGludCBpOwotICAgIHVpbnQ2NF90IHNzZFksIHNzZFUgPSAwLCBzc2RWID0gMCwgc3NkQSA9IDA7Ci0gICAgc3RydWN0IFN3c0NvbnRleHQgKmRzdENvbnRleHQgPSBOVUxMLCAqb3V0Q29udGV4dCA9IE5VTEw7Ci0gICAgdWludDMyX3QgY3JjID0gMDsKLSAgICBpbnQgcmVzICAgICAgPSAwOwotCi0gICAgaWYgKGN1cl9zcmNGb3JtYXQgIT0gc3JjRm9ybWF0IHx8IGN1cl9zcmNXICE9IHNyY1cgfHwgY3VyX3NyY0ggIT0gc3JjSCkgewotICAgICAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqc3JjQ29udGV4dCA9IE5VTEw7Ci0gICAgICAgIGludCBwOwotCi0gICAgICAgIGZvciAocCA9IDA7IHAgPCA0OyBwKyspCi0gICAgICAgICAgICBhdl9mcmVlcCgmc3JjW3BdKTsKLQotICAgICAgICByZXMgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhzcmNTdHJpZGUsIHNyY0Zvcm1hdCwgc3JjVyk7Ci0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImF2X2ltYWdlX2ZpbGxfbGluZXNpemVzIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHAgPSAwOyBwIDwgNDsgcCsrKSB7Ci0gICAgICAgICAgICBzcmNTdHJpZGVbcF0gPSBGRkFMSUdOKHNyY1N0cmlkZVtwXSwgMTYpOwotICAgICAgICAgICAgaWYgKHNyY1N0cmlkZVtwXSkKLSAgICAgICAgICAgICAgICBzcmNbcF0gPSBhdl9tYWxsb2N6KHNyY1N0cmlkZVtwXSAqIHNyY0ggKyAxNik7Ci0gICAgICAgICAgICBpZiAoc3JjU3RyaWRlW3BdICYmICFzcmNbcF0pIHsKLSAgICAgICAgICAgICAgICBwZXJyb3IoIk1hbGxvYyIpOwotICAgICAgICAgICAgICAgIHJlcyA9IC0xOwotICAgICAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHNyY0NvbnRleHQgPSBzd3NfZ2V0Q29udGV4dCh3LCBoLCBBVl9QSVhfRk1UX1lVVkE0MjBQLCBzcmNXLCBzcmNILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBTV1NfQklMSU5FQVIsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICAgICBpZiAoIXNyY0NvbnRleHQpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCAlcyAtLS0+ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBkZXNjX3l1dmE0MjBwLT5uYW1lLAotICAgICAgICAgICAgICAgICAgICBkZXNjX3NyYy0+bmFtZSk7Ci0gICAgICAgICAgICByZXMgPSAtMTsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgICAgIHN3c19zY2FsZShzcmNDb250ZXh0LCAoY29uc3QgdWludDhfdCAqIGNvbnN0KilyZWYsIHJlZlN0cmlkZSwgMCwgaCwgc3JjLCBzcmNTdHJpZGUpOwotICAgICAgICBzd3NfZnJlZUNvbnRleHQoc3JjQ29udGV4dCk7Ci0KLSAgICAgICAgY3VyX3NyY0Zvcm1hdCA9IHNyY0Zvcm1hdDsKLSAgICAgICAgY3VyX3NyY1cgICAgICA9IHNyY1c7Ci0gICAgICAgIGN1cl9zcmNIICAgICAgPSBzcmNIOwotICAgIH0KLQotICAgIHJlcyA9IGF2X2ltYWdlX2ZpbGxfbGluZXNpemVzKGRzdFN0cmlkZSwgZHN0Rm9ybWF0LCBkc3RXKTsKLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImF2X2ltYWdlX2ZpbGxfbGluZXNpemVzIGZhaWxlZFxuIik7Ci0gICAgICAgIGdvdG8gZW5kOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgLyogSW1hZ2UgYnVmZmVycyBwYXNzZWQgaW50byBsaWJzd3NjYWxlIGNhbiBiZSBhbGxvY2F0ZWQgYW55IHdheSB5b3UKLSAgICAgICAgICogcHJlZmVyLCBhcyBsb25nIGFzIHRoZXkncmUgYWxpZ25lZCBlbm91Z2ggZm9yIHRoZSBhcmNoaXRlY3R1cmUsIGFuZAotICAgICAgICAgKiB0aGV5J3JlIGZyZWVkIGFwcHJvcHJpYXRlbHkgKHN1Y2ggYXMgdXNpbmcgYXZfZnJlZSBmb3IgYnVmZmVycwotICAgICAgICAgKiBhbGxvY2F0ZWQgd2l0aCBhdl9tYWxsb2MpLiAqLwotICAgICAgICAvKiBBbiBleHRyYSAxNiBieXRlcyBpcyBiZWluZyBhbGxvY2F0ZWQgYmVjYXVzZSBzb21lIHNjYWxlcnMgbWF5IHdyaXRlCi0gICAgICAgICAqIG91dCBvZiBib3VuZHMuICovCi0gICAgICAgIGRzdFN0cmlkZVtpXSA9IEZGQUxJR04oZHN0U3RyaWRlW2ldLCAxNik7Ci0gICAgICAgIGlmIChkc3RTdHJpZGVbaV0pCi0gICAgICAgICAgICBkc3RbaV0gPSBhdl9tYWxsb2N6KGRzdFN0cmlkZVtpXSAqIGRzdEggKyAxNik7Ci0gICAgICAgIGlmIChkc3RTdHJpZGVbaV0gJiYgIWRzdFtpXSkgewotICAgICAgICAgICAgcGVycm9yKCJNYWxsb2MiKTsKLSAgICAgICAgICAgIHJlcyA9IC0xOwotCi0gICAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGRzdENvbnRleHQgPSBzd3NfZ2V0Q29udGV4dChzcmNXLCBzcmNILCBzcmNGb3JtYXQsIGRzdFcsIGRzdEgsIGRzdEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgIGlmICghZHN0Q29udGV4dCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgJXMgLS0tPiAlc1xuIiwKLSAgICAgICAgICAgICAgICBkZXNjX3NyYy0+bmFtZSwgZGVzY19kc3QtPm5hbWUpOwotICAgICAgICByZXMgPSAtMTsKLSAgICAgICAgZ290byBlbmQ7Ci0gICAgfQotCi0gICAgcHJpbnRmKCIgJXMgJWR4JWQgLT4gJXMgJTNkeCUzZCBmbGFncz0lMmQiLAotICAgICAgICAgICBkZXNjX3NyYy0+bmFtZSwgc3JjVywgc3JjSCwKLSAgICAgICAgICAgZGVzY19kc3QtPm5hbWUsIGRzdFcsIGRzdEgsCi0gICAgICAgICAgIGZsYWdzKTsKLSAgICBmZmx1c2goc3Rkb3V0KTsKLQotICAgIHN3c19zY2FsZShkc3RDb250ZXh0LCAoY29uc3QgdWludDhfdCAqIGNvbnN0KilzcmMsIHNyY1N0cmlkZSwgMCwgc3JjSCwgZHN0LCBkc3RTdHJpZGUpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDQgJiYgZHN0U3RyaWRlW2ldOyBpKyspCi0gICAgICAgIGNyYyA9IGF2X2NyYyhhdl9jcmNfZ2V0X3RhYmxlKEFWX0NSQ18zMl9JRUVFKSwgY3JjLCBkc3RbaV0sCi0gICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGVbaV0gKiBkc3RIKTsKLQotICAgIGlmIChyICYmIGNyYyA9PSByLT5jcmMpIHsKLSAgICAgICAgc3NkWSA9IHItPnNzZFk7Ci0gICAgICAgIHNzZFUgPSByLT5zc2RVOwotICAgICAgICBzc2RWID0gci0+c3NkVjsKLSAgICAgICAgc3NkQSA9IHItPnNzZEE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgICAgICAgcmVmU3RyaWRlW2ldID0gRkZBTElHTihyZWZTdHJpZGVbaV0sIDE2KTsKLSAgICAgICAgICAgIGlmIChyZWZTdHJpZGVbaV0pCi0gICAgICAgICAgICAgICAgb3V0W2ldID0gYXZfbWFsbG9jeihyZWZTdHJpZGVbaV0gKiBoKTsKLSAgICAgICAgICAgIGlmIChyZWZTdHJpZGVbaV0gJiYgIW91dFtpXSkgewotICAgICAgICAgICAgICAgIHBlcnJvcigiTWFsbG9jIik7Ci0gICAgICAgICAgICAgICAgcmVzID0gLTE7Ci0gICAgICAgICAgICAgICAgZ290byBlbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgb3V0Q29udGV4dCA9IHN3c19nZXRDb250ZXh0KGRzdFcsIGRzdEgsIGRzdEZvcm1hdCwgdywgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsIFNXU19CSUxJTkVBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwpOwotICAgICAgICBpZiAoIW91dENvbnRleHQpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGdldCAlcyAtLS0+ICVzXG4iLAotICAgICAgICAgICAgICAgICAgICBkZXNjX2RzdC0+bmFtZSwKLSAgICAgICAgICAgICAgICAgICAgZGVzY195dXZhNDIwcC0+bmFtZSk7Ci0gICAgICAgICAgICByZXMgPSAtMTsKLSAgICAgICAgICAgIGdvdG8gZW5kOwotICAgICAgICB9Ci0gICAgICAgIHN3c19zY2FsZShvdXRDb250ZXh0LCAoY29uc3QgdWludDhfdCAqIGNvbnN0Kilkc3QsIGRzdFN0cmlkZSwgMCwgZHN0SCwgb3V0LCByZWZTdHJpZGUpOwotCi0gICAgICAgIHNzZFkgPSBnZXRTU0QocmVmWzBdLCBvdXRbMF0sIHJlZlN0cmlkZVswXSwgcmVmU3RyaWRlWzBdLCB3LCBoKTsKLSAgICAgICAgaWYgKGhhc0Nocm9tYShzcmNGb3JtYXQpICYmIGhhc0Nocm9tYShkc3RGb3JtYXQpKSB7Ci0gICAgICAgICAgICAvL0ZJWE1FIGNoZWNrIHRoYXQgb3V0cHV0IGlzIHJlYWxseSBncmF5Ci0gICAgICAgICAgICBzc2RVID0gZ2V0U1NEKHJlZlsxXSwgb3V0WzFdLCByZWZTdHJpZGVbMV0sIHJlZlN0cmlkZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHcgKyAxKSA+PiAxLCAoaCArIDEpID4+IDEpOwotICAgICAgICAgICAgc3NkViA9IGdldFNTRChyZWZbMl0sIG91dFsyXSwgcmVmU3RyaWRlWzJdLCByZWZTdHJpZGVbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgMSkgPj4gMSwgKGggKyAxKSA+PiAxKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXNBTFBIQShzcmNGb3JtYXQpICYmIGlzQUxQSEEoZHN0Rm9ybWF0KSkKLSAgICAgICAgICAgIHNzZEEgPSBnZXRTU0QocmVmWzNdLCBvdXRbM10sIHJlZlN0cmlkZVszXSwgcmVmU3RyaWRlWzNdLCB3LCBoKTsKLQotICAgICAgICBzc2RZIC89IHcgKiBoOwotICAgICAgICBzc2RVIC89IHcgKiBoIC8gNDsKLSAgICAgICAgc3NkViAvPSB3ICogaCAvIDQ7Ci0gICAgICAgIHNzZEEgLz0gdyAqIGg7Ci0KLSAgICAgICAgc3dzX2ZyZWVDb250ZXh0KG91dENvbnRleHQpOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICBpZiAocmVmU3RyaWRlW2ldKQotICAgICAgICAgICAgICAgIGF2X2ZyZWUob3V0W2ldKTsKLSAgICB9Ci0KLSAgICBwcmludGYoIiBDUkM9JTA4eCBTU0Q9JTUiUFJJZDY0ICIsJTUiUFJJZDY0ICIsJTUiUFJJZDY0ICIsJTUiUFJJZDY0ICJcbiIsCi0gICAgICAgICAgIGNyYywgc3NkWSwgc3NkVSwgc3NkViwgc3NkQSk7Ci0KLWVuZDoKLSAgICBzd3NfZnJlZUNvbnRleHQoZHN0Q29udGV4dCk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICBpZiAoZHN0U3RyaWRlW2ldKQotICAgICAgICAgICAgYXZfZnJlZShkc3RbaV0pOwotCi0gICAgcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIHZvaWQgc2VsZlRlc3QodWludDhfdCAqcmVmWzRdLCBpbnQgcmVmU3RyaWRlWzRdLCBpbnQgdywgaW50IGgsCi0gICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0X2luLAotICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdF9pbikKLXsKLSAgICBjb25zdCBpbnQgZmxhZ3NbXSA9IHsgU1dTX0ZBU1RfQklMSU5FQVIsIFNXU19CSUxJTkVBUiwgU1dTX0JJQ1VCSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNXU19YLCBTV1NfUE9JTlQsIFNXU19BUkVBLCAwIH07Ci0gICAgY29uc3QgaW50IHNyY1cgICA9IHc7Ci0gICAgY29uc3QgaW50IHNyY0ggICA9IGg7Ci0gICAgY29uc3QgaW50IGRzdFdbXSA9IHsgc3JjVyAtIHNyY1cgLyAzLCBzcmNXLCBzcmNXICsgc3JjVyAvIDMsIDAgfTsKLSAgICBjb25zdCBpbnQgZHN0SFtdID0geyBzcmNIIC0gc3JjSCAvIDMsIHNyY0gsIHNyY0ggKyBzcmNIIC8gMywgMCB9OwotICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQsIGRzdEZvcm1hdDsKLSAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2Nfc3JjLCAqZGVzY19kc3Q7Ci0KLSAgICBmb3IgKHNyY0Zvcm1hdCA9IHNyY0Zvcm1hdF9pbiAhPSBBVl9QSVhfRk1UX05PTkUgPyBzcmNGb3JtYXRfaW4gOiAwOwotICAgICAgICAgc3JjRm9ybWF0IDwgQVZfUElYX0ZNVF9OQjsgc3JjRm9ybWF0KyspIHsKLSAgICAgICAgaWYgKCFzd3NfaXNTdXBwb3J0ZWRJbnB1dChzcmNGb3JtYXQpIHx8Ci0gICAgICAgICAgICAhc3dzX2lzU3VwcG9ydGVkT3V0cHV0KHNyY0Zvcm1hdCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBkZXNjX3NyYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoc3JjRm9ybWF0KTsKLQotICAgICAgICBmb3IgKGRzdEZvcm1hdCA9IGRzdEZvcm1hdF9pbiAhPSBBVl9QSVhfRk1UX05PTkUgPyBkc3RGb3JtYXRfaW4gOiAwOwotICAgICAgICAgICAgIGRzdEZvcm1hdCA8IEFWX1BJWF9GTVRfTkI7IGRzdEZvcm1hdCsrKSB7Ci0gICAgICAgICAgICBpbnQgaSwgaiwgazsKLSAgICAgICAgICAgIGludCByZXMgPSAwOwotCi0gICAgICAgICAgICBpZiAoIXN3c19pc1N1cHBvcnRlZElucHV0KGRzdEZvcm1hdCkgfHwKLSAgICAgICAgICAgICAgICAhc3dzX2lzU3VwcG9ydGVkT3V0cHV0KGRzdEZvcm1hdCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgIGRlc2NfZHN0ID0gYXZfcGl4X2ZtdF9kZXNjX2dldChkc3RGb3JtYXQpOwotCi0gICAgICAgICAgICBwcmludGYoIiVzIC0+ICVzXG4iLCBkZXNjX3NyYy0+bmFtZSwgZGVzY19kc3QtPm5hbWUpOwotICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7Ci0KLSAgICAgICAgICAgIGZvciAoayA9IDA7IGZsYWdzW2tdICYmICFyZXM7IGsrKykKLSAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBkc3RXW2ldICYmICFyZXM7IGkrKykKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgZHN0SFtqXSAmJiAhcmVzOyBqKyspCi0gICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBkb1Rlc3QocmVmLCByZWZTdHJpZGUsIHcsIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBkc3RGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVywgc3JjSCwgZHN0V1tpXSwgZHN0SFtqXSwgZmxhZ3Nba10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgICAgICAgICBpZiAoZHN0Rm9ybWF0X2luICE9IEFWX1BJWF9GTVRfTk9ORSkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjRm9ybWF0X2luICE9IEFWX1BJWF9GTVRfTk9ORSkKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotc3RhdGljIGludCBmaWxlVGVzdCh1aW50OF90ICpyZWZbNF0sIGludCByZWZTdHJpZGVbNF0sIGludCB3LCBpbnQgaCwgRklMRSAqZnAsCi0gICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXRfaW4sCi0gICAgICAgICAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXRfaW4pCi17Ci0gICAgY2hhciBidWZbMjU2XTsKLQotICAgIHdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKLSAgICAgICAgc3RydWN0IFJlc3VsdHMgcjsKLSAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdDsKLSAgICAgICAgY2hhciBzcmNTdHJbMTJdOwotICAgICAgICBpbnQgc3JjVywgc3JjSDsKLSAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdDsKLSAgICAgICAgY2hhciBkc3RTdHJbMTJdOwotICAgICAgICBpbnQgZHN0VywgZHN0SDsKLSAgICAgICAgaW50IGZsYWdzOwotICAgICAgICBpbnQgcmV0OwotCi0gICAgICAgIHJldCA9IHNzY2FuZihidWYsCi0gICAgICAgICAgICAgICAgICAgICAiICUxMnMgJWR4JWQgLT4gJTEycyAlZHglZCBmbGFncz0lZCBDUkM9JXgiCi0gICAgICAgICAgICAgICAgICAgICAiIFNTRD0lIlNDTmQ2NCAiLCAlIlNDTmQ2NCAiLCAlIlNDTmQ2NCAiLCAlIlNDTmQ2NCAiXG4iLAotICAgICAgICAgICAgICAgICAgICAgc3JjU3RyLCAmc3JjVywgJnNyY0gsIGRzdFN0ciwgJmRzdFcsICZkc3RILAotICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCAmci5jcmMsICZyLnNzZFksICZyLnNzZFUsICZyLnNzZFYsICZyLnNzZEEpOwotICAgICAgICBpZiAocmV0ICE9IDEyKSB7Ci0gICAgICAgICAgICBzcmNTdHJbMF0gPSBkc3RTdHJbMF0gPSAwOwotICAgICAgICAgICAgcmV0ICAgICAgID0gc3NjYW5mKGJ1ZiwgIiUxMnMgLT4gJTEyc1xuIiwgc3JjU3RyLCBkc3RTdHIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3JjRm9ybWF0ID0gYXZfZ2V0X3BpeF9mbXQoc3JjU3RyKTsKLSAgICAgICAgZHN0Rm9ybWF0ID0gYXZfZ2V0X3BpeF9mbXQoZHN0U3RyKTsKLQotICAgICAgICBpZiAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfTk9ORSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FIHx8Ci0gICAgICAgICAgICBzcmNXID4gODE5MlUgfHwgc3JjSCA+IDgxOTJVIHx8IGRzdFcgPiA4MTkyVSB8fCBkc3RIID4gODE5MlUpIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsZm9ybWVkIGlucHV0IGZpbGVcbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc3JjRm9ybWF0X2luICE9IEFWX1BJWF9GTVRfTk9ORSAmJiBzcmNGb3JtYXRfaW4gIT0gc3JjRm9ybWF0KSB8fAotICAgICAgICAgICAgKGRzdEZvcm1hdF9pbiAhPSBBVl9QSVhfRk1UX05PTkUgJiYgZHN0Rm9ybWF0X2luICE9IGRzdEZvcm1hdCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKHJldCAhPSAxMikgewotICAgICAgICAgICAgcHJpbnRmKCIlcyIsIGJ1Zik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGRvVGVzdChyZWYsIHJlZlN0cmlkZSwgdywgaCwKLSAgICAgICAgICAgICAgIHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LAotICAgICAgICAgICAgICAgc3JjVywgc3JjSCwgZHN0VywgZHN0SCwgZmxhZ3MsCi0gICAgICAgICAgICAgICAmcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgVyA5NgotI2RlZmluZSBIIDk2Ci0KLWludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLSAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0ID0gQVZfUElYX0ZNVF9OT05FOwotICAgIGVudW0gQVZQaXhlbEZvcm1hdCBkc3RGb3JtYXQgPSBBVl9QSVhfRk1UX05PTkU7Ci0gICAgdWludDhfdCAqcmdiX2RhdGEgICA9IGF2X21hbGxvYyhXICogSCAqIDQpOwotICAgIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCByZ2Jfc3JjWzRdID0geyByZ2JfZGF0YSwgTlVMTCwgTlVMTCwgTlVMTCB9OwotICAgIGludCByZ2Jfc3RyaWRlWzRdICAgPSB7IDQgKiBXLCAwLCAwLCAwIH07Ci0gICAgdWludDhfdCAqZGF0YSAgICAgICA9IGF2X21hbGxvYyg0ICogVyAqIEgpOwotICAgIHVpbnQ4X3QgKnNyY1s0XSAgICAgPSB7IGRhdGEsIGRhdGEgKyBXICogSCwgZGF0YSArIFcgKiBIICogMiwgZGF0YSArIFcgKiBIICogMyB9OwotICAgIGludCBzdHJpZGVbNF0gICAgICAgPSB7IFcsIFcsIFcsIFcgfTsKLSAgICBpbnQgeCwgeTsKLSAgICBzdHJ1Y3QgU3dzQ29udGV4dCAqc3dzOwotICAgIEFWTEZHIHJhbmQ7Ci0gICAgaW50IHJlcyA9IC0xOwotICAgIGludCBpOwotICAgIEZJTEUgKmZwID0gTlVMTDsKLQotICAgIGlmICghcmdiX2RhdGEgfHwgIWRhdGEpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpICs9IDIpIHsKLSAgICAgICAgaWYgKGFyZ3ZbaV1bMF0gIT0gJy0nIHx8IGkgKyAxID09IGFyZ2MpCi0gICAgICAgICAgICBnb3RvIGJhZF9vcHRpb247Ci0gICAgICAgIGlmICghc3RyY21wKGFyZ3ZbaV0sICItcmVmIikpIHsKLSAgICAgICAgICAgIGZwID0gZm9wZW4oYXJndltpICsgMV0sICJyIik7Ci0gICAgICAgICAgICBpZiAoIWZwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgb3BlbiAnJXMnXG4iLCBhcmd2W2kgKyAxXSk7Ci0gICAgICAgICAgICAgICAgZ290byBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItc3JjIikpIHsKLSAgICAgICAgICAgIHNyY0Zvcm1hdCA9IGF2X2dldF9waXhfZm10KGFyZ3ZbaSArIDFdKTsKLSAgICAgICAgICAgIGlmIChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHBpeGVsIGZvcm1hdCAlc1xuIiwgYXJndltpICsgMV0pOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZHN0IikpIHsKLSAgICAgICAgICAgIGRzdEZvcm1hdCA9IGF2X2dldF9waXhfZm10KGFyZ3ZbaSArIDFdKTsKLSAgICAgICAgICAgIGlmIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIHBpeGVsIGZvcm1hdCAlc1xuIiwgYXJndltpICsgMV0pOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLWJhZF9vcHRpb246Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImJhZCBvcHRpb24gb3IgYXJndW1lbnQgbWlzc2luZyAoJXMpXG4iLCBhcmd2W2ldKTsKLSAgICAgICAgICAgIGdvdG8gZXJyb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzd3MgPSBzd3NfZ2V0Q29udGV4dChXIC8gMTIsIEggLyAxMiwgQVZfUElYX0ZNVF9SR0IzMiwgVywgSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBTV1NfQklMSU5FQVIsIE5VTEwsIE5VTEwsIE5VTEwpOwotCi0gICAgYXZfbGZnX2luaXQoJnJhbmQsIDEpOwotCi0gICAgZm9yICh5ID0gMDsgeSA8IEg7IHkrKykKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IFcgKiA0OyB4KyspCi0gICAgICAgICAgICByZ2JfZGF0YVsgeCArIHkgKiA0ICogV10gPSBhdl9sZmdfZ2V0KCZyYW5kKTsKLSAgICBzd3Nfc2NhbGUoc3dzLCByZ2Jfc3JjLCByZ2Jfc3RyaWRlLCAwLCBIIC8gMTIsIHNyYywgc3RyaWRlKTsKLSAgICBzd3NfZnJlZUNvbnRleHQoc3dzKTsKLSAgICBhdl9mcmVlKHJnYl9kYXRhKTsKLQotICAgIGlmKGZwKSB7Ci0gICAgICAgIHJlcyA9IGZpbGVUZXN0KHNyYywgc3RyaWRlLCBXLCBILCBmcCwgc3JjRm9ybWF0LCBkc3RGb3JtYXQpOwotICAgICAgICBmY2xvc2UoZnApOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNlbGZUZXN0KHNyYywgc3RyaWRlLCBXLCBILCBzcmNGb3JtYXQsIGRzdEZvcm1hdCk7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgfQotZXJyb3I6Ci0gICAgYXZfZnJlZShkYXRhKTsKLQotICAgIHJldHVybiByZXM7Ci19CmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3N3c2NhbGUuYyBiL2xpYnN3c2NhbGUvc3dzY2FsZS5jCmluZGV4IDhkMjA1NzcuLjdmM2UyMjMgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvc3dzY2FsZS5jCisrKyBiL2xpYnN3c2NhbGUvc3dzY2FsZS5jCkBAIC01MiwyNCArNTIsNiBAQAogICAgIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NAogfTsKIAotI2lmbmRlZiBORVdfRklMVEVSCi1zdGF0aWMgdm9pZCBnYW1tYV9jb252ZXJ0KHVpbnQ4X3QgKiBzcmNbXSwgaW50IHdpZHRoLCB1aW50MTZfdCAqZ2FtbWEpCi17Ci0gICAgaW50IGk7Ci0gICAgdWludDE2X3QgKnNyYzEgPSAodWludDE2X3QqKXNyY1swXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7Ci0gICAgICAgIHVpbnQxNl90IHIgPSBBVl9STDE2KHNyYzEgKyBpKjQgKyAwKTsKLSAgICAgICAgdWludDE2X3QgZyA9IEFWX1JMMTYoc3JjMSArIGkqNCArIDEpOwotICAgICAgICB1aW50MTZfdCBiID0gQVZfUkwxNihzcmMxICsgaSo0ICsgMik7Ci0KLSAgICAgICAgQVZfV0wxNihzcmMxICsgaSo0ICsgMCwgZ2FtbWFbcl0pOwotICAgICAgICBBVl9XTDE2KHNyYzEgKyBpKjQgKyAxLCBnYW1tYVtnXSk7Ci0gICAgICAgIEFWX1dMMTYoc3JjMSArIGkqNCArIDIsIGdhbW1hW2JdKTsKLSAgICB9Ci19Ci0jZW5kaWYKLQogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgdm9pZCBmaWxsUGxhbmUodWludDhfdCAqcGxhbmUsIGludCBzdHJpZGUsIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCB5LCB1aW50OF90IHZhbCkKIHsKQEAgLTI0MCw3OSArMjIyLDYgQEAKICAgICAgICAgZHN0W2ldID0gKGRzdFtpXSooMTQwNzEvNCkgKyAoMzM1NjE5NDc8PDQpLzQpPj4xMjsKIH0KIAotI2lmbmRlZiBORVdfRklMVEVSCi0vLyAqKiogaG9yaXpvbnRhbCBzY2FsZSBZIGxpbmUgdG8gdGVtcCBidWZmZXIKLXN0YXRpYyBhdl9hbHdheXNfaW5saW5lIHZvaWQgaHlzY2FsZShTd3NDb250ZXh0ICpjLCBpbnQxNl90ICpkc3QsIGludCBkc3RXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfaW5bNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1csIGludCB4SW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKmhMdW1GaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCAqaEx1bUZpbHRlclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaEx1bUZpbHRlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqZm9ybWF0Q29udkJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqcGFsLCBpbnQgaXNBbHBoYSkKLXsKLSAgICB2b2lkICgqdG9ZVjEyKSh1aW50OF90ICosIGNvbnN0IHVpbnQ4X3QgKiwgY29uc3QgdWludDhfdCAqLCBjb25zdCB1aW50OF90ICosIGludCwgdWludDMyX3QgKikgPQotICAgICAgICBpc0FscGhhID8gYy0+YWxwVG9ZVjEyIDogYy0+bHVtVG9ZVjEyOwotICAgIHZvaWQgKCpjb252ZXJ0UmFuZ2UpKGludDE2X3QgKiwgaW50KSA9IGlzQWxwaGEgPyBOVUxMIDogYy0+bHVtQ29udmVydFJhbmdlOwotICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9IHNyY19pbltpc0FscGhhID8gMyA6IDBdOwotCi0gICAgaWYgKHRvWVYxMikgewotICAgICAgICB0b1lWMTIoZm9ybWF0Q29udkJ1ZmZlciwgc3JjLCBzcmNfaW5bMV0sIHNyY19pblsyXSwgc3JjVywgcGFsKTsKLSAgICAgICAgc3JjID0gZm9ybWF0Q29udkJ1ZmZlcjsKLSAgICB9IGVsc2UgaWYgKGMtPnJlYWRMdW1QbGFuYXIgJiYgIWlzQWxwaGEpIHsKLSAgICAgICAgYy0+cmVhZEx1bVBsYW5hcihmb3JtYXRDb252QnVmZmVyLCBzcmNfaW4sIHNyY1csIGMtPmlucHV0X3JnYjJ5dXZfdGFibGUpOwotICAgICAgICBzcmMgPSBmb3JtYXRDb252QnVmZmVyOwotICAgIH0gZWxzZSBpZiAoYy0+cmVhZEFscFBsYW5hciAmJiBpc0FscGhhKSB7Ci0gICAgICAgIGMtPnJlYWRBbHBQbGFuYXIoZm9ybWF0Q29udkJ1ZmZlciwgc3JjX2luLCBzcmNXLCBOVUxMKTsKLSAgICAgICAgc3JjID0gZm9ybWF0Q29udkJ1ZmZlcjsKLSAgICB9Ci0KLSAgICBpZiAoIWMtPmh5c2NhbGVfZmFzdCkgewotICAgICAgICBjLT5oeVNjYWxlKGMsIGRzdCwgZHN0V2lkdGgsIHNyYywgaEx1bUZpbHRlciwKLSAgICAgICAgICAgICAgICAgICBoTHVtRmlsdGVyUG9zLCBoTHVtRmlsdGVyU2l6ZSk7Ci0gICAgfSBlbHNlIHsgLy8gZmFzdCBiaWxpbmVhciB1cHNjYWxlIC8gY3JhcCBkb3duc2NhbGUKLSAgICAgICAgYy0+aHlzY2FsZV9mYXN0KGMsIGRzdCwgZHN0V2lkdGgsIHNyYywgc3JjVywgeEluYyk7Ci0gICAgfQotCi0gICAgaWYgKGNvbnZlcnRSYW5nZSkKLSAgICAgICAgY29udmVydFJhbmdlKGRzdCwgZHN0V2lkdGgpOwotfQotCi1zdGF0aWMgYXZfYWx3YXlzX2lubGluZSB2b2lkIGhjc2NhbGUoU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkc3QyLCBpbnQgZHN0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX2luWzRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNXLCBpbnQgeEluYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpoQ2hyRmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgKmhDaHJGaWx0ZXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhDaHJGaWx0ZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmZvcm1hdENvbnZCdWZmZXIsIHVpbnQzMl90ICpwYWwpCi17Ci0gICAgY29uc3QgdWludDhfdCAqc3JjMSA9IHNyY19pblsxXSwgKnNyYzIgPSBzcmNfaW5bMl07Ci0gICAgaWYgKGMtPmNoclRvWVYxMikgewotICAgICAgICB1aW50OF90ICpidWYyID0gZm9ybWF0Q29udkJ1ZmZlciArCi0gICAgICAgICAgICAgICAgICAgICAgICBGRkFMSUdOKHNyY1cqMis3OCwgMTYpOwotICAgICAgICBjLT5jaHJUb1lWMTIoZm9ybWF0Q29udkJ1ZmZlciwgYnVmMiwgc3JjX2luWzBdLCBzcmMxLCBzcmMyLCBzcmNXLCBwYWwpOwotICAgICAgICBzcmMxPSBmb3JtYXRDb252QnVmZmVyOwotICAgICAgICBzcmMyPSBidWYyOwotICAgIH0gZWxzZSBpZiAoYy0+cmVhZENoclBsYW5hcikgewotICAgICAgICB1aW50OF90ICpidWYyID0gZm9ybWF0Q29udkJ1ZmZlciArCi0gICAgICAgICAgICAgICAgICAgICAgICBGRkFMSUdOKHNyY1cqMis3OCwgMTYpOwotICAgICAgICBjLT5yZWFkQ2hyUGxhbmFyKGZvcm1hdENvbnZCdWZmZXIsIGJ1ZjIsIHNyY19pbiwgc3JjVywgYy0+aW5wdXRfcmdiMnl1dl90YWJsZSk7Ci0gICAgICAgIHNyYzEgPSBmb3JtYXRDb252QnVmZmVyOwotICAgICAgICBzcmMyID0gYnVmMjsKLSAgICB9Ci0KLSAgICBpZiAoIWMtPmhjc2NhbGVfZmFzdCkgewotICAgICAgICBjLT5oY1NjYWxlKGMsIGRzdDEsIGRzdFdpZHRoLCBzcmMxLCBoQ2hyRmlsdGVyLCBoQ2hyRmlsdGVyUG9zLCBoQ2hyRmlsdGVyU2l6ZSk7Ci0gICAgICAgIGMtPmhjU2NhbGUoYywgZHN0MiwgZHN0V2lkdGgsIHNyYzIsIGhDaHJGaWx0ZXIsIGhDaHJGaWx0ZXJQb3MsIGhDaHJGaWx0ZXJTaXplKTsKLSAgICB9IGVsc2UgeyAvLyBmYXN0IGJpbGluZWFyIHVwc2NhbGUgLyBjcmFwIGRvd25zY2FsZQotICAgICAgICBjLT5oY3NjYWxlX2Zhc3QoYywgZHN0MSwgZHN0MiwgZHN0V2lkdGgsIHNyYzEsIHNyYzIsIHNyY1csIHhJbmMpOwotICAgIH0KLQotICAgIGlmIChjLT5jaHJDb252ZXJ0UmFuZ2UpCi0gICAgICAgIGMtPmNockNvbnZlcnRSYW5nZShkc3QxLCBkc3QyLCBkc3RXaWR0aCk7Ci19Ci0jZW5kaWYgLyogTkVXX0ZJTFRFUiAqLwogCiAjZGVmaW5lIERFQlVHX1NXU0NBTEVfQlVGRkVSUyAwCiAjZGVmaW5lIERFQlVHX0JVRkZFUlMoLi4uKSAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMjUsNDYgKzIzNCwxNyBAQAogewogICAgIC8qIGxvYWQgYSBmZXcgdGhpbmdzIGludG8gbG9jYWwgdmFycyB0byBtYWtlIHRoZSBjb2RlIG1vcmUgcmVhZGFibGU/CiAgICAgICogYW5kIGZhc3RlciAqLwotI2lmbmRlZiBORVdfRklMVEVSCi0gICAgY29uc3QgaW50IHNyY1cgICAgICAgICAgICAgICAgICAgPSBjLT5zcmNXOwotI2VuZGlmCiAgICAgY29uc3QgaW50IGRzdFcgICAgICAgICAgICAgICAgICAgPSBjLT5kc3RXOwogICAgIGNvbnN0IGludCBkc3RIICAgICAgICAgICAgICAgICAgID0gYy0+ZHN0SDsKLSNpZm5kZWYgTkVXX0ZJTFRFUgotICAgIGNvbnN0IGludCBjaHJEc3RXICAgICAgICAgICAgICAgID0gYy0+Y2hyRHN0VzsKLSAgICBjb25zdCBpbnQgY2hyU3JjVyAgICAgICAgICAgICAgICA9IGMtPmNoclNyY1c7Ci0gICAgY29uc3QgaW50IGx1bVhJbmMgICAgICAgICAgICAgICAgPSBjLT5sdW1YSW5jOwotICAgIGNvbnN0IGludCBjaHJYSW5jICAgICAgICAgICAgICAgID0gYy0+Y2hyWEluYzsKLSNlbmRpZgorCiAgICAgY29uc3QgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdCA9IGMtPmRzdEZvcm1hdDsKICAgICBjb25zdCBpbnQgZmxhZ3MgICAgICAgICAgICAgICAgICA9IGMtPmZsYWdzOwogICAgIGludDMyX3QgKnZMdW1GaWx0ZXJQb3MgICAgICAgICAgID0gYy0+dkx1bUZpbHRlclBvczsKICAgICBpbnQzMl90ICp2Q2hyRmlsdGVyUG9zICAgICAgICAgICA9IGMtPnZDaHJGaWx0ZXJQb3M7Ci0jaWZuZGVmIE5FV19GSUxURVIKLSAgICBpbnQzMl90ICpoTHVtRmlsdGVyUG9zICAgICAgICAgICA9IGMtPmhMdW1GaWx0ZXJQb3M7Ci0gICAgaW50MzJfdCAqaENockZpbHRlclBvcyAgICAgICAgICAgPSBjLT5oQ2hyRmlsdGVyUG9zOwotICAgIGludDE2X3QgKmhMdW1GaWx0ZXIgICAgICAgICAgICAgID0gYy0+aEx1bUZpbHRlcjsKLSAgICBpbnQxNl90ICpoQ2hyRmlsdGVyICAgICAgICAgICAgICA9IGMtPmhDaHJGaWx0ZXI7Ci0gICAgaW50MzJfdCAqbHVtTW14RmlsdGVyICAgICAgICAgICAgPSBjLT5sdW1NbXhGaWx0ZXI7Ci0gICAgaW50MzJfdCAqY2hyTW14RmlsdGVyICAgICAgICAgICAgPSBjLT5jaHJNbXhGaWx0ZXI7Ci0jZW5kaWYKKwogICAgIGNvbnN0IGludCB2THVtRmlsdGVyU2l6ZSAgICAgICAgID0gYy0+dkx1bUZpbHRlclNpemU7CiAgICAgY29uc3QgaW50IHZDaHJGaWx0ZXJTaXplICAgICAgICAgPSBjLT52Q2hyRmlsdGVyU2l6ZTsKLSNpZm5kZWYgTkVXX0ZJTFRFUgotICAgIGNvbnN0IGludCBoTHVtRmlsdGVyU2l6ZSAgICAgICAgID0gYy0+aEx1bUZpbHRlclNpemU7Ci0gICAgY29uc3QgaW50IGhDaHJGaWx0ZXJTaXplICAgICAgICAgPSBjLT5oQ2hyRmlsdGVyU2l6ZTsKLSAgICBpbnQxNl90ICoqbHVtUGl4QnVmICAgICAgICAgICAgICA9IGMtPmx1bVBpeEJ1ZjsKLSAgICBpbnQxNl90ICoqY2hyVVBpeEJ1ZiAgICAgICAgICAgICA9IGMtPmNoclVQaXhCdWY7Ci0gICAgaW50MTZfdCAqKmNoclZQaXhCdWYgICAgICAgICAgICAgPSBjLT5jaHJWUGl4QnVmOwotI2VuZGlmCi0gICAgaW50MTZfdCAqKmFscFBpeEJ1ZiAgICAgICAgICAgICAgPSBjLT5hbHBQaXhCdWY7Ci0gICAgY29uc3QgaW50IHZMdW1CdWZTaXplICAgICAgICAgICAgPSBjLT52THVtQnVmU2l6ZTsKLSAgICBjb25zdCBpbnQgdkNockJ1ZlNpemUgICAgICAgICAgICA9IGMtPnZDaHJCdWZTaXplOwotI2lmbmRlZiBORVdfRklMVEVSCi0gICAgdWludDhfdCAqZm9ybWF0Q29udkJ1ZmZlciAgICAgICAgPSBjLT5mb3JtYXRDb252QnVmZmVyOwotICAgIHVpbnQzMl90ICpwYWwgICAgICAgICAgICAgICAgICAgID0gYy0+cGFsX3l1djsKLSAgICBpbnQgcGVyZm9ybV9nYW1tYSA9IGMtPmlzX2ludGVybmFsX2dhbW1hOwotI2VuZGlmCisKICAgICB5dXYycGxhbmFyMV9mbiB5dXYycGxhbmUxICAgICAgICA9IGMtPnl1djJwbGFuZTE7CiAgICAgeXV2MnBsYW5hclhfZm4geXV2MnBsYW5lWCAgICAgICAgPSBjLT55dXYycGxhbmVYOwogICAgIHl1djJpbnRlcmxlYXZlZFhfZm4geXV2Mm52MTJjWCAgID0gYy0+eXV2Mm52MTJjWDsKQEAgLTM3NCw3ICsyNTQsNyBAQAogICAgIHl1djJhbnlYX2ZuIHl1djJhbnlYICAgICAgICAgICAgID0gYy0+eXV2MmFueVg7CiAgICAgY29uc3QgaW50IGNoclNyY1NsaWNlWSAgICAgICAgICAgPSAgICAgICAgICAgICAgICBzcmNTbGljZVkgPj4gYy0+Y2hyU3JjVlN1YlNhbXBsZTsKICAgICBjb25zdCBpbnQgY2hyU3JjU2xpY2VIICAgICAgICAgICA9IEFWX0NFSUxfUlNISUZUKHNyY1NsaWNlSCwgICBjLT5jaHJTcmNWU3ViU2FtcGxlKTsKLSAgICBpbnQgc2hvdWxkX2RpdGhlciAgICAgICAgICAgICAgICA9IGlzOV9PUl8xMEJQUyhjLT5zcmNGb3JtYXQpIHx8CisgICAgaW50IHNob3VsZF9kaXRoZXIgICAgICAgICAgICAgICAgPSBpc05CUFMoYy0+c3JjRm9ybWF0KSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMxNkJQUyhjLT5zcmNGb3JtYXQpOwogICAgIGludCBsYXN0RHN0WTsKIApAQCAtMzg1LDcgKzI2NSw3IEBACiAgICAgaW50IGxhc3RJbkx1bUJ1ZiA9IGMtPmxhc3RJbkx1bUJ1ZjsKICAgICBpbnQgbGFzdEluQ2hyQnVmID0gYy0+bGFzdEluQ2hyQnVmOwogCi0jaWZkZWYgTkVXX0ZJTFRFUgorCiAgICAgaW50IGx1bVN0YXJ0ID0gMDsKICAgICBpbnQgbHVtRW5kID0gYy0+ZGVzY0luZGV4WzBdOwogICAgIGludCBjaHJTdGFydCA9IGx1bUVuZDsKQEAgLTM5NywxNSArMjc3LDEyIEBACiAgICAgU3dzU2xpY2UgKnZvdXRfc2xpY2UgPSAmYy0+c2xpY2VbYy0+bnVtU2xpY2UtMV07CiAgICAgU3dzRmlsdGVyRGVzY3JpcHRvciAqZGVzYyA9IGMtPmRlc2M7CiAKKworICAgIGludCBuZWVkQWxwaGEgPSBjLT5uZWVkQWxwaGE7CisKICAgICBpbnQgaGFzTHVtSG9sZXMgPSAxOwogICAgIGludCBoYXNDaHJIb2xlcyA9IDE7Ci0jZW5kaWYKIAotI2lmbmRlZiBORVdfRklMVEVSCi0gICAgaWYgKCF1c2VQYWwoYy0+c3JjRm9ybWF0KSkgewotICAgICAgICBwYWwgPSBjLT5pbnB1dF9yZ2IyeXV2X3RhYmxlOwotICAgIH0KLSNlbmRpZgogCiAgICAgaWYgKGlzUGFja2VkKGMtPnNyY0Zvcm1hdCkpIHsKICAgICAgICAgc3JjWzBdID0KQEAgLTQyNyw4ICszMDQsOCBAQAogICAgICAgICAgICAgICAgICAgZHN0WzJdLCBkc3RTdHJpZGVbMl0sIGRzdFszXSwgZHN0U3RyaWRlWzNdKTsKICAgICBERUJVR19CVUZGRVJTKCJzcmNTbGljZVk6ICVkIHNyY1NsaWNlSDogJWQgZHN0WTogJWQgZHN0SDogJWRcbiIsCiAgICAgICAgICAgICAgICAgICBzcmNTbGljZVksIHNyY1NsaWNlSCwgZHN0WSwgZHN0SCk7Ci0gICAgREVCVUdfQlVGRkVSUygidkx1bUZpbHRlclNpemU6ICVkIHZMdW1CdWZTaXplOiAlZCB2Q2hyRmlsdGVyU2l6ZTogJWQgdkNockJ1ZlNpemU6ICVkXG4iLAotICAgICAgICAgICAgICAgICAgdkx1bUZpbHRlclNpemUsIHZMdW1CdWZTaXplLCB2Q2hyRmlsdGVyU2l6ZSwgdkNockJ1ZlNpemUpOworICAgIERFQlVHX0JVRkZFUlMoInZMdW1GaWx0ZXJTaXplOiAlZCB2Q2hyRmlsdGVyU2l6ZTogJWRcbiIsCisgICAgICAgICAgICAgICAgICB2THVtRmlsdGVyU2l6ZSwgdkNockZpbHRlclNpemUpOwogCiAgICAgaWYgKGRzdFN0cmlkZVswXSYxNSB8fCBkc3RTdHJpZGVbMV0mMTUgfHwKICAgICAgICAgZHN0U3RyaWRlWzJdJjE1IHx8IGRzdFN0cmlkZVszXSYxNSkgewpAQCAtNDQ5LDcgKzMyNiw3IEBACiAgICAgICAgIHN0YXRpYyBpbnQgd2FybmVkQWxyZWFkeT0wOwogICAgICAgICBpbnQgY3B1X2ZsYWdzID0gYXZfZ2V0X2NwdV9mbGFncygpOwogICAgICAgICBpZiAoSEFWRV9NTVhFWFQgJiYgKGNwdV9mbGFncyAmIEFWX0NQVV9GTEFHX1NTRTIpICYmICF3YXJuZWRBbHJlYWR5KXsKLSAgICAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfV0FSTklORywgIldhcm5pbmc6IGRhdGEgaXMgbm90IGFsaWduZWQhIFRoaXMgY2FuIGxlYWQgdG8gYSBzcGVlZGxvc3NcbiIpOworICAgICAgICAgICAgYXZfbG9nKGMsIEFWX0xPR19XQVJOSU5HLCAiV2FybmluZzogZGF0YSBpcyBub3QgYWxpZ25lZCEgVGhpcyBjYW4gbGVhZCB0byBhIHNwZWVkIGxvc3NcbiIpOwogICAgICAgICAgICAgd2FybmVkQWxyZWFkeT0xOwogICAgICAgICB9CiAgICAgfQpAQCAtNDcwLDcgKzM0Nyw2IEBACiAgICAgfQogICAgIGxhc3REc3RZID0gZHN0WTsKIAotI2lmZGVmIE5FV19GSUxURVIKICAgICBmZl9pbml0X3ZzY2FsZV9wZm4oYywgeXV2MnBsYW5lMSwgeXV2MnBsYW5lWCwgeXV2Mm52MTJjWCwKICAgICAgICAgICAgICAgICAgICB5dXYycGFja2VkMSwgeXV2MnBhY2tlZDIsIHl1djJwYWNrZWRYLCB5dXYyYW55WCwgYy0+dXNlX21teF92ZmlsdGVyKTsKIApAQCAtNDkyLDE4ICszNjgsOSBAQAogICAgICAgICBob3V0X3NsaWNlLT5wbGFuZVszXS5zbGljZUggPSAwOwogICAgICAgICBob3V0X3NsaWNlLT53aWR0aCA9IGRzdFc7CiAgICAgfQotI2VuZGlmCiAKICAgICBmb3IgKDsgZHN0WSA8IGRzdEg7IGRzdFkrKykgewogICAgICAgICBjb25zdCBpbnQgY2hyRHN0WSA9IGRzdFkgPj4gYy0+Y2hyRHN0VlN1YlNhbXBsZTsKLSNpZm5kZWYgTkVXX0ZJTFRFUgotICAgICAgICB1aW50OF90ICpkZXN0WzRdICA9IHsKLSAgICAgICAgICAgIGRzdFswXSArIGRzdFN0cmlkZVswXSAqIGRzdFksCi0gICAgICAgICAgICBkc3RbMV0gKyBkc3RTdHJpZGVbMV0gKiBjaHJEc3RZLAotICAgICAgICAgICAgZHN0WzJdICsgZHN0U3RyaWRlWzJdICogY2hyRHN0WSwKLSAgICAgICAgICAgIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBhbHBQaXhCdWYpID8gZHN0WzNdICsgZHN0U3RyaWRlWzNdICogZHN0WSA6IE5VTEwsCi0gICAgICAgIH07Ci0jZW5kaWYKICAgICAgICAgaW50IHVzZV9tbXhfdmZpbHRlcj0gYy0+dXNlX21teF92ZmlsdGVyOwogCiAgICAgICAgIC8vIEZpcnN0IGxpbmUgbmVlZGVkIGFzIGlucHV0CkBAIC01MTcsMTQgKzM4NCwxMyBAQAogICAgICAgICBpbnQgbGFzdEx1bVNyY1kyID0gRkZNSU4oYy0+c3JjSCwgICAgZmlyc3RMdW1TcmNZMiArIHZMdW1GaWx0ZXJTaXplKSAtIDE7CiAgICAgICAgIGludCBsYXN0Q2hyU3JjWSAgPSBGRk1JTihjLT5jaHJTcmNILCBmaXJzdENoclNyY1kgICsgdkNockZpbHRlclNpemUpIC0gMTsKICAgICAgICAgaW50IGVub3VnaF9saW5lczsKLSNpZmRlZiBORVdfRklMVEVSCisKICAgICAgICAgaW50IGk7CiAgICAgICAgIGludCBwb3NZLCBjUG9zWSwgZmlyc3RQb3NZLCBsYXN0UG9zWSwgZmlyc3RDUG9zWSwgbGFzdENQb3NZOwotI2VuZGlmCiAKICAgICAgICAgLy8gaGFuZGxlIGhvbGVzIChGQVNUX0JJTElORUFSICYgd2VpcmQgZmlsdGVycykKICAgICAgICAgaWYgKGZpcnN0THVtU3JjWSA+IGxhc3RJbkx1bUJ1ZikgewotI2lmZGVmIE5FV19GSUxURVIKKwogICAgICAgICAgICAgaGFzTHVtSG9sZXMgPSBsYXN0SW5MdW1CdWYgIT0gZmlyc3RMdW1TcmNZIC0gMTsKICAgICAgICAgICAgIGlmIChoYXNMdW1Ib2xlcykgewogICAgICAgICAgICAgICAgIGhvdXRfc2xpY2UtPnBsYW5lWzBdLnNsaWNlWSA9IGZpcnN0THVtU3JjWTsKQEAgLTUzMiwxMSArMzk4LDExIEBACiAgICAgICAgICAgICAgICAgaG91dF9zbGljZS0+cGxhbmVbMF0uc2xpY2VIID0KICAgICAgICAgICAgICAgICBob3V0X3NsaWNlLT5wbGFuZVszXS5zbGljZUggPSAwOwogICAgICAgICAgICAgfQotI2VuZGlmCisKICAgICAgICAgICAgIGxhc3RJbkx1bUJ1ZiA9IGZpcnN0THVtU3JjWSAtIDE7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGZpcnN0Q2hyU3JjWSA+IGxhc3RJbkNockJ1ZikgewotI2lmZGVmIE5FV19GSUxURVIKKwogICAgICAgICAgICAgaGFzQ2hySG9sZXMgPSBsYXN0SW5DaHJCdWYgIT0gZmlyc3RDaHJTcmNZIC0gMTsKICAgICAgICAgICAgIGlmIChoYXNDaHJIb2xlcykgewogICAgICAgICAgICAgICAgIGhvdXRfc2xpY2UtPnBsYW5lWzFdLnNsaWNlWSA9IGZpcnN0Q2hyU3JjWTsKQEAgLTU0NCwxMSArNDEwLDkgQEAKICAgICAgICAgICAgICAgICBob3V0X3NsaWNlLT5wbGFuZVsxXS5zbGljZUggPQogICAgICAgICAgICAgICAgIGhvdXRfc2xpY2UtPnBsYW5lWzJdLnNsaWNlSCA9IDA7CiAgICAgICAgICAgICB9Ci0jZW5kaWYKKwogICAgICAgICAgICAgbGFzdEluQ2hyQnVmID0gZmlyc3RDaHJTcmNZIC0gMTsKICAgICAgICAgfQotICAgICAgICBhdl9hc3NlcnQwKGZpcnN0THVtU3JjWSA+PSBsYXN0SW5MdW1CdWYgLSB2THVtQnVmU2l6ZSArIDEpOwotICAgICAgICBhdl9hc3NlcnQwKGZpcnN0Q2hyU3JjWSA+PSBsYXN0SW5DaHJCdWYgLSB2Q2hyQnVmU2l6ZSArIDEpOwogCiAgICAgICAgIERFQlVHX0JVRkZFUlMoImRzdFk6ICVkXG4iLCBkc3RZKTsKICAgICAgICAgREVCVUdfQlVGRkVSUygiXHRmaXJzdEx1bVNyY1k6ICVkIGxhc3RMdW1TcmNZOiAlZCBsYXN0SW5MdW1CdWY6ICVkXG4iLApAQCAtNTY3LDIyICs0MzEsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEx1bVNyY1ksIGxhc3RDaHJTcmNZKTsKICAgICAgICAgfQogCi0jaWZkZWYgTkVXX0ZJTFRFUgorICAgICAgICBhdl9hc3NlcnQwKChsYXN0THVtU3JjWSAtIGZpcnN0THVtU3JjWSArIDEpIDw9IGhvdXRfc2xpY2UtPnBsYW5lWzBdLmF2YWlsYWJsZV9saW5lcyk7CisgICAgICAgIGF2X2Fzc2VydDAoKGxhc3RDaHJTcmNZIC0gZmlyc3RDaHJTcmNZICsgMSkgPD0gaG91dF9zbGljZS0+cGxhbmVbMV0uYXZhaWxhYmxlX2xpbmVzKTsKKworCiAgICAgICAgIHBvc1kgPSBob3V0X3NsaWNlLT5wbGFuZVswXS5zbGljZVkgKyBob3V0X3NsaWNlLT5wbGFuZVswXS5zbGljZUg7CiAgICAgICAgIGlmIChwb3NZIDw9IGxhc3RMdW1TcmNZICYmICFoYXNMdW1Ib2xlcykgewogICAgICAgICAgICAgZmlyc3RQb3NZID0gRkZNQVgoZmlyc3RMdW1TcmNZLCBwb3NZKTsKLSAgICAgICAgICAgIGxhc3RQb3NZID0gRkZNSU4obGFzdEx1bVNyY1kgKyBNQVhfTElORVNfQUhFQUQsIHNyY1NsaWNlWSArIHNyY1NsaWNlSCAtIDEpOworICAgICAgICAgICAgbGFzdFBvc1kgPSBGRk1JTihmaXJzdEx1bVNyY1kgKyBob3V0X3NsaWNlLT5wbGFuZVswXS5hdmFpbGFibGVfbGluZXMgLSAxLCBzcmNTbGljZVkgKyBzcmNTbGljZUggLSAxKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpcnN0UG9zWSA9IGxhc3RJbkx1bUJ1ZiArIDE7CisgICAgICAgICAgICBmaXJzdFBvc1kgPSBwb3NZOwogICAgICAgICAgICAgbGFzdFBvc1kgPSBsYXN0THVtU3JjWTsKICAgICAgICAgfQogCiAgICAgICAgIGNQb3NZID0gaG91dF9zbGljZS0+cGxhbmVbMV0uc2xpY2VZICsgaG91dF9zbGljZS0+cGxhbmVbMV0uc2xpY2VIOwogICAgICAgICBpZiAoY1Bvc1kgPD0gbGFzdENoclNyY1kgJiYgIWhhc0NockhvbGVzKSB7CiAgICAgICAgICAgICBmaXJzdENQb3NZID0gRkZNQVgoZmlyc3RDaHJTcmNZLCBjUG9zWSk7Ci0gICAgICAgICAgICBsYXN0Q1Bvc1kgPSBGRk1JTihsYXN0Q2hyU3JjWSArIE1BWF9MSU5FU19BSEVBRCwgQVZfQ0VJTF9SU0hJRlQoc3JjU2xpY2VZICsgc3JjU2xpY2VILCBjLT5jaHJTcmNWU3ViU2FtcGxlKSAtIDEpOworICAgICAgICAgICAgbGFzdENQb3NZID0gRkZNSU4oZmlyc3RDaHJTcmNZICsgaG91dF9zbGljZS0+cGxhbmVbMV0uYXZhaWxhYmxlX2xpbmVzIC0gMSwgQVZfQ0VJTF9SU0hJRlQoc3JjU2xpY2VZICsgc3JjU2xpY2VILCBjLT5jaHJTcmNWU3ViU2FtcGxlKSAtIDEpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmlyc3RDUG9zWSA9IGxhc3RJbkNockJ1ZiArIDE7CisgICAgICAgICAgICBmaXJzdENQb3NZID0gY1Bvc1k7CiAgICAgICAgICAgICBsYXN0Q1Bvc1kgPSBsYXN0Q2hyU3JjWTsKICAgICAgICAgfQogCkBAIC02MDQsNjIgKzQ3MSwxMSBAQAogICAgICAgICBjaHJCdWZJbmRleCArPSBsYXN0Q2hyU3JjWSAtIGxhc3RJbkNockJ1ZjsKICAgICAgICAgbGFzdEluQ2hyQnVmID0gbGFzdENoclNyY1k7CiAKLSNlbHNlCi0gICAgICAgIC8vIERvIGhvcml6b250YWwgc2NhbGluZwotICAgICAgICB3aGlsZSAobGFzdEluTHVtQnVmIDwgbGFzdEx1bVNyY1kpIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzFbNF0gPSB7Ci0gICAgICAgICAgICAgICAgc3JjWzBdICsgKGxhc3RJbkx1bUJ1ZiArIDEgLSBzcmNTbGljZVkpICogc3JjU3RyaWRlWzBdLAotICAgICAgICAgICAgICAgIHNyY1sxXSArIChsYXN0SW5MdW1CdWYgKyAxIC0gc3JjU2xpY2VZKSAqIHNyY1N0cmlkZVsxXSwKLSAgICAgICAgICAgICAgICBzcmNbMl0gKyAobGFzdEluTHVtQnVmICsgMSAtIHNyY1NsaWNlWSkgKiBzcmNTdHJpZGVbMl0sCi0gICAgICAgICAgICAgICAgc3JjWzNdICsgKGxhc3RJbkx1bUJ1ZiArIDEgLSBzcmNTbGljZVkpICogc3JjU3RyaWRlWzNdLAotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGx1bUJ1ZkluZGV4Kys7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKGx1bUJ1ZkluZGV4IDwgMiAqIHZMdW1CdWZTaXplKTsKLSAgICAgICAgICAgIGF2X2Fzc2VydDAobGFzdEluTHVtQnVmICsgMSAtIHNyY1NsaWNlWSA8IHNyY1NsaWNlSCk7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKGxhc3RJbkx1bUJ1ZiArIDEgLSBzcmNTbGljZVkgPj0gMCk7Ci0KLSAgICAgICAgICAgIGlmIChwZXJmb3JtX2dhbW1hKQotICAgICAgICAgICAgICAgIGdhbW1hX2NvbnZlcnQoKHVpbnQ4X3QgKiopc3JjMSwgc3JjVywgYy0+aW52X2dhbW1hKTsKLQotICAgICAgICAgICAgaHlzY2FsZShjLCBsdW1QaXhCdWZbbHVtQnVmSW5kZXhdLCBkc3RXLCBzcmMxLCBzcmNXLCBsdW1YSW5jLAotICAgICAgICAgICAgICAgICAgICBoTHVtRmlsdGVyLCBoTHVtRmlsdGVyUG9zLCBoTHVtRmlsdGVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q29udkJ1ZmZlciwgcGFsLCAwKTsKLSAgICAgICAgICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBhbHBQaXhCdWYpCi0gICAgICAgICAgICAgICAgaHlzY2FsZShjLCBhbHBQaXhCdWZbbHVtQnVmSW5kZXhdLCBkc3RXLCBzcmMxLCBzcmNXLAotICAgICAgICAgICAgICAgICAgICAgICAgbHVtWEluYywgaEx1bUZpbHRlciwgaEx1bUZpbHRlclBvcywgaEx1bUZpbHRlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRDb252QnVmZmVyLCBwYWwsIDEpOwotICAgICAgICAgICAgbGFzdEluTHVtQnVmKys7Ci0gICAgICAgICAgICBERUJVR19CVUZGRVJTKCJcdFx0bHVtQnVmSW5kZXggJWQ6IGxhc3RJbkx1bUJ1ZjogJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGx1bUJ1ZkluZGV4LCBsYXN0SW5MdW1CdWYpOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChsYXN0SW5DaHJCdWYgPCBsYXN0Q2hyU3JjWSkgewotICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMVs0XSA9IHsKLSAgICAgICAgICAgICAgICBzcmNbMF0gKyAobGFzdEluQ2hyQnVmICsgMSAtIGNoclNyY1NsaWNlWSkgKiBzcmNTdHJpZGVbMF0sCi0gICAgICAgICAgICAgICAgc3JjWzFdICsgKGxhc3RJbkNockJ1ZiArIDEgLSBjaHJTcmNTbGljZVkpICogc3JjU3RyaWRlWzFdLAotICAgICAgICAgICAgICAgIHNyY1syXSArIChsYXN0SW5DaHJCdWYgKyAxIC0gY2hyU3JjU2xpY2VZKSAqIHNyY1N0cmlkZVsyXSwKLSAgICAgICAgICAgICAgICBzcmNbM10gKyAobGFzdEluQ2hyQnVmICsgMSAtIGNoclNyY1NsaWNlWSkgKiBzcmNTdHJpZGVbM10sCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgY2hyQnVmSW5kZXgrKzsKLSAgICAgICAgICAgIGF2X2Fzc2VydDAoY2hyQnVmSW5kZXggPCAyICogdkNockJ1ZlNpemUpOwotICAgICAgICAgICAgYXZfYXNzZXJ0MChsYXN0SW5DaHJCdWYgKyAxIC0gY2hyU3JjU2xpY2VZIDwgKGNoclNyY1NsaWNlSCkpOwotICAgICAgICAgICAgYXZfYXNzZXJ0MChsYXN0SW5DaHJCdWYgKyAxIC0gY2hyU3JjU2xpY2VZID49IDApOwotICAgICAgICAgICAgLy8gRklYTUUgcmVwbGFjZSBwYXJhbWV0ZXJzIHRocm91Z2ggY29udGV4dCBzdHJ1Y3QgKHNvbWUgYXQgbGVhc3QpCi0KLSAgICAgICAgICAgIGlmIChjLT5uZWVkc19oY3NjYWxlKQotICAgICAgICAgICAgICAgIGhjc2NhbGUoYywgY2hyVVBpeEJ1ZltjaHJCdWZJbmRleF0sIGNoclZQaXhCdWZbY2hyQnVmSW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hyRHN0Vywgc3JjMSwgY2hyU3JjVywgY2hyWEluYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGhDaHJGaWx0ZXIsIGhDaHJGaWx0ZXJQb3MsIGhDaHJGaWx0ZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q29udkJ1ZmZlciwgcGFsKTsKLSAgICAgICAgICAgIGxhc3RJbkNockJ1ZisrOwotICAgICAgICAgICAgREVCVUdfQlVGRkVSUygiXHRcdGNockJ1ZkluZGV4ICVkOiBsYXN0SW5DaHJCdWY6ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaHJCdWZJbmRleCwgbGFzdEluQ2hyQnVmKTsKLSAgICAgICAgfQotI2VuZGlmCiAgICAgICAgIC8vIHdyYXAgYnVmIGluZGV4IGFyb3VuZCB0byBzdGF5IGluc2lkZSB0aGUgcmluZyBidWZmZXIKLSAgICAgICAgaWYgKGx1bUJ1ZkluZGV4ID49IHZMdW1CdWZTaXplKQotICAgICAgICAgICAgbHVtQnVmSW5kZXggLT0gdkx1bUJ1ZlNpemU7Ci0gICAgICAgIGlmIChjaHJCdWZJbmRleCA+PSB2Q2hyQnVmU2l6ZSkKLSAgICAgICAgICAgIGNockJ1ZkluZGV4IC09IHZDaHJCdWZTaXplOworICAgICAgICBpZiAobHVtQnVmSW5kZXggPj0gdkx1bUZpbHRlclNpemUpCisgICAgICAgICAgICBsdW1CdWZJbmRleCAtPSB2THVtRmlsdGVyU2l6ZTsKKyAgICAgICAgaWYgKGNockJ1ZkluZGV4ID49IHZDaHJGaWx0ZXJTaXplKQorICAgICAgICAgICAgY2hyQnVmSW5kZXggLT0gdkNockZpbHRlclNpemU7CiAgICAgICAgIGlmICghZW5vdWdoX2xpbmVzKQogICAgICAgICAgICAgYnJlYWs7ICAvLyB3ZSBjYW4ndCBvdXRwdXQgYSBkc3RZIGxpbmUgc28gbGV0J3MgdHJ5IHdpdGggdGhlIG5leHQgc2xpY2UKIApAQCAtNjgyLDExOSArNDk4LDExIEBACiAgICAgICAgIH0KIAogICAgICAgICB7Ci0jaWZkZWYgTkVXX0ZJTFRFUgogICAgICAgICAgICAgZm9yIChpID0gdlN0YXJ0OyBpIDwgdkVuZDsgKytpKQogICAgICAgICAgICAgICAgIGRlc2NbaV0ucHJvY2VzcyhjLCAmZGVzY1tpXSwgZHN0WSwgMSk7Ci0jZWxzZQotICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmx1bVNyY1B0ciAgPSAoY29uc3QgaW50MTZfdCAqKikodm9pZCopIGx1bVBpeEJ1ZiAgKyBsdW1CdWZJbmRleCArIGZpcnN0THVtU3JjWSAtIGxhc3RJbkx1bUJ1ZiArIHZMdW1CdWZTaXplOwotICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclVTcmNQdHIgPSAoY29uc3QgaW50MTZfdCAqKikodm9pZCopIGNoclVQaXhCdWYgKyBjaHJCdWZJbmRleCArIGZpcnN0Q2hyU3JjWSAtIGxhc3RJbkNockJ1ZiArIHZDaHJCdWZTaXplOwotICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmNoclZTcmNQdHIgPSAoY29uc3QgaW50MTZfdCAqKikodm9pZCopIGNoclZQaXhCdWYgKyBjaHJCdWZJbmRleCArIGZpcnN0Q2hyU3JjWSAtIGxhc3RJbkNockJ1ZiArIHZDaHJCdWZTaXplOwotICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyY1B0ciAgPSAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYWxwUGl4QnVmKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICoqKSh2b2lkKikgYWxwUGl4QnVmICsgbHVtQnVmSW5kZXggKyBmaXJzdEx1bVNyY1kgLSBsYXN0SW5MdW1CdWYgKyB2THVtQnVmU2l6ZSA6IE5VTEw7Ci0gICAgICAgICAgICBpbnQxNl90ICp2THVtRmlsdGVyID0gYy0+dkx1bUZpbHRlcjsKLSAgICAgICAgICAgIGludDE2X3QgKnZDaHJGaWx0ZXIgPSBjLT52Q2hyRmlsdGVyOwotCi0gICAgICAgICAgICBpZiAoaXNQbGFuYXJZVVYoZHN0Rm9ybWF0KSB8fAotICAgICAgICAgICAgICAgIChpc0dyYXkoZHN0Rm9ybWF0KSAmJiAhaXNBTFBIQShkc3RGb3JtYXQpKSkgeyAvLyBZVjEyIGxpa2UKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgY2hyU2tpcE1hc2sgPSAoMSA8PCBjLT5jaHJEc3RWU3ViU2FtcGxlKSAtIDE7Ci0KLSAgICAgICAgICAgICAgICB2THVtRmlsdGVyICs9ICAgIGRzdFkgKiB2THVtRmlsdGVyU2l6ZTsKLSAgICAgICAgICAgICAgICB2Q2hyRmlsdGVyICs9IGNockRzdFkgKiB2Q2hyRmlsdGVyU2l6ZTsKLQotLy8gICAgICAgICAgICAgICAgIGF2X2Fzc2VydDAodXNlX21teF92ZmlsdGVyICE9ICgKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXYycGxhbmVYID09IHl1djJwbGFuZVhfMTBCRV9jCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeXV2MnBsYW5lWCA9PSB5dXYycGxhbmVYXzEwTEVfYwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHl1djJwbGFuZVggPT0geXV2MnBsYW5lWF85QkVfYwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHl1djJwbGFuZVggPT0geXV2MnBsYW5lWF85TEVfYwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHl1djJwbGFuZVggPT0geXV2MnBsYW5lWF8xNkJFX2MKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB5dXYycGxhbmVYID09IHl1djJwbGFuZVhfMTZMRV9jCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeXV2MnBsYW5lWCA9PSB5dXYycGxhbmVYXzhfYykgfHwgIUFSQ0hfWDg2KTsKLQotICAgICAgICAgICAgICAgIGlmKHVzZV9tbXhfdmZpbHRlcil7Ci0gICAgICAgICAgICAgICAgICAgIHZMdW1GaWx0ZXI9IChpbnQxNl90ICopYy0+bHVtTW14RmlsdGVyOwotICAgICAgICAgICAgICAgICAgICB2Q2hyRmlsdGVyPSAoaW50MTZfdCAqKWMtPmNock1teEZpbHRlcjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodkx1bUZpbHRlclNpemUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICB5dXYycGxhbmUxKGx1bVNyY1B0clswXSwgZGVzdFswXSwgZHN0VywgYy0+bHVtRGl0aGVyOCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5lWCh2THVtRmlsdGVyLCB2THVtRmlsdGVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdW1TcmNQdHIsIGRlc3RbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VywgYy0+bHVtRGl0aGVyOCwgMCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCEoKGRzdFkgJiBjaHJTa2lwTWFzaykgfHwgaXNHcmF5KGRzdEZvcm1hdCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh5dXYybnYxMmNYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5dXYybnYxMmNYKGMsIHZDaHJGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZDaHJGaWx0ZXJTaXplLCBjaHJVU3JjUHRyLCBjaHJWU3JjUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0WzFdLCBjaHJEc3RXKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2Q2hyRmlsdGVyU2l6ZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB5dXYycGxhbmUxKGNoclVTcmNQdHJbMF0sIGRlc3RbMV0sIGNockRzdFcsIGMtPmNockRpdGhlcjgsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5lMShjaHJWU3JjUHRyWzBdLCBkZXN0WzJdLCBjaHJEc3RXLCBjLT5jaHJEaXRoZXI4LCAzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHl1djJwbGFuZVgodkNockZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkNockZpbHRlclNpemUsIGNoclVTcmNQdHIsIGRlc3RbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNockRzdFcsIGMtPmNockRpdGhlcjgsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5lWCh2Q2hyRmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Q2hyRmlsdGVyU2l6ZSwgY2hyVlNyY1B0ciwgZGVzdFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyRHN0VywgYy0+Y2hyRGl0aGVyOCwgdXNlX21teF92ZmlsdGVyID8gKGMtPnV2X29mZngyID4+IDEpIDogMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYWxwUGl4QnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHVzZV9tbXhfdmZpbHRlcil7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2THVtRmlsdGVyPSAoaW50MTZfdCAqKWMtPmFscE1teEZpbHRlcjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAodkx1bUZpbHRlclNpemUgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5lMShhbHBTcmNQdHJbMF0sIGRlc3RbM10sIGRzdFcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmx1bURpdGhlcjgsIDApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgeXV2MnBsYW5lWCh2THVtRmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2THVtRmlsdGVyU2l6ZSwgYWxwU3JjUHRyLCBkZXN0WzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RXLCBjLT5sdW1EaXRoZXI4LCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoeXV2MnBhY2tlZFgpIHsKLSAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKGx1bVNyY1B0ciAgKyB2THVtRmlsdGVyU2l6ZSAtIDEgPCAoY29uc3QgaW50MTZfdCAqKilsdW1QaXhCdWYgICsgdkx1bUJ1ZlNpemUgKiAyKTsKLSAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKGNoclVTcmNQdHIgKyB2Q2hyRmlsdGVyU2l6ZSAtIDEgPCAoY29uc3QgaW50MTZfdCAqKiljaHJVUGl4QnVmICsgdkNockJ1ZlNpemUgKiAyKTsKLSAgICAgICAgICAgICAgICBpZiAoYy0+eXV2MnBhY2tlZDEgJiYgdkx1bUZpbHRlclNpemUgPT0gMSAmJgotICAgICAgICAgICAgICAgICAgICB2Q2hyRmlsdGVyU2l6ZSA8PSAyKSB7IC8vIHVuc2NhbGVkIFJHQgotICAgICAgICAgICAgICAgICAgICBpbnQgY2hyQWxwaGEgPSB2Q2hyRmlsdGVyU2l6ZSA9PSAxID8gMCA6IHZDaHJGaWx0ZXJbMiAqIGRzdFkgKyAxXTsKLSAgICAgICAgICAgICAgICAgICAgeXV2MnBhY2tlZDEoYywgKmx1bVNyY1B0ciwgY2hyVVNyY1B0ciwgY2hyVlNyY1B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwUGl4QnVmID8gKmFscFNyY1B0ciA6IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbMF0sIGRzdFcsIGNockFscGhhLCBkc3RZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMtPnl1djJwYWNrZWQyICYmIHZMdW1GaWx0ZXJTaXplID09IDIgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZDaHJGaWx0ZXJTaXplID09IDIpIHsgLy8gYmlsaW5lYXIgdXBzY2FsZSBSR0IKLSAgICAgICAgICAgICAgICAgICAgaW50IGx1bUFscGhhID0gdkx1bUZpbHRlclsyICogZHN0WSArIDFdOwotICAgICAgICAgICAgICAgICAgICBpbnQgY2hyQWxwaGEgPSB2Q2hyRmlsdGVyWzIgKiBkc3RZICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIGx1bU1teEZpbHRlclsyXSA9Ci0gICAgICAgICAgICAgICAgICAgIGx1bU1teEZpbHRlclszXSA9IHZMdW1GaWx0ZXJbMiAqIGRzdFldICAgICogMHgxMDAwMTsKLSAgICAgICAgICAgICAgICAgICAgY2hyTW14RmlsdGVyWzJdID0KLSAgICAgICAgICAgICAgICAgICAgY2hyTW14RmlsdGVyWzNdID0gdkNockZpbHRlclsyICogY2hyRHN0WV0gKiAweDEwMDAxOwotICAgICAgICAgICAgICAgICAgICB5dXYycGFja2VkMihjLCBsdW1TcmNQdHIsIGNoclVTcmNQdHIsIGNoclZTcmNQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscFBpeEJ1ZiA/IGFscFNyY1B0ciA6IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbMF0sIGRzdFcsIGx1bUFscGhhLCBjaHJBbHBoYSwgZHN0WSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZ2VuZXJhbCBSR0IKLSAgICAgICAgICAgICAgICAgICAgeXV2MnBhY2tlZFgoYywgdkx1bUZpbHRlciArIGRzdFkgKiB2THVtRmlsdGVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVtU3JjUHRyLCB2THVtRmlsdGVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdkNockZpbHRlciArIGRzdFkgKiB2Q2hyRmlsdGVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyVVNyY1B0ciwgY2hyVlNyY1B0ciwgdkNockZpbHRlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscFNyY1B0ciwgZGVzdFswXSwgZHN0VywgZHN0WSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhdl9hc3NlcnQxKCF5dXYycGFja2VkMSAmJiAheXV2MnBhY2tlZDIpOwotICAgICAgICAgICAgICAgIHl1djJhbnlYKGMsIHZMdW1GaWx0ZXIgKyBkc3RZICogdkx1bUZpbHRlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbHVtU3JjUHRyLCB2THVtRmlsdGVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2Q2hyRmlsdGVyICsgZHN0WSAqIHZDaHJGaWx0ZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNoclVTcmNQdHIsIGNoclZTcmNQdHIsIHZDaHJGaWx0ZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFscFNyY1B0ciwgZGVzdCwgZHN0VywgZHN0WSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGVyZm9ybV9nYW1tYSkKLSAgICAgICAgICAgICAgICBnYW1tYV9jb252ZXJ0KGRlc3QsIGRzdFcsIGMtPmdhbW1hKTsKLSNlbmRpZgogICAgICAgICB9CiAgICAgfQotICAgIGlmIChpc1BsYW5hcihkc3RGb3JtYXQpICYmIGlzQUxQSEEoZHN0Rm9ybWF0KSAmJiAhYWxwUGl4QnVmKSB7CisgICAgaWYgKGlzUGxhbmFyKGRzdEZvcm1hdCkgJiYgaXNBTFBIQShkc3RGb3JtYXQpICYmICFuZWVkQWxwaGEpIHsKICAgICAgICAgaW50IGxlbmd0aCA9IGRzdFc7CiAgICAgICAgIGludCBoZWlnaHQgPSBkc3RZIC0gbGFzdERzdFk7CiAKQEAgLTg4OSw2ICs1OTcsMTAgQEAKICAgICAgICAgZmZfc3dzX2luaXRfc3dzY2FsZV9wcGMoYyk7CiAgICAgaWYgKEFSQ0hfWDg2KQogICAgICAgICBmZl9zd3NfaW5pdF9zd3NjYWxlX3g4NihjKTsKKyAgICBpZiAoQVJDSF9BQVJDSDY0KQorICAgICAgICBmZl9zd3NfaW5pdF9zd3NjYWxlX2FhcmNoNjQoYyk7CisgICAgaWYgKEFSQ0hfQVJNKQorICAgICAgICBmZl9zd3NfaW5pdF9zd3NjYWxlX2FybShjKTsKIAogICAgIHJldHVybiBzd3NjYWxlOwogfQpAQCAtMTA0OSwxMiArNzYxLDIxIEBACiAgICAgdWludDhfdCAqZHN0Mls0XTsKICAgICB1aW50OF90ICpyZ2IwX3RtcCA9IE5VTEw7CiAgICAgaW50IG1hY3JvX2hlaWdodCA9IGlzQmF5ZXIoYy0+c3JjRm9ybWF0KSA/IDIgOiAoMSA8PCBjLT5jaHJTcmNWU3ViU2FtcGxlKTsKKyAgICAvLyBjb3B5IHN0cmlkZXMsIHNvIHRoZXkgY2FuIHNhZmVseSBiZSBtb2RpZmllZAorICAgIGludCBzcmNTdHJpZGUyWzRdOworICAgIGludCBkc3RTdHJpZGUyWzRdOworICAgIGludCBzcmNTbGljZVlfaW50ZXJuYWwgPSBzcmNTbGljZVk7CiAKICAgICBpZiAoIXNyY1N0cmlkZSB8fCAhZHN0U3RyaWRlIHx8ICFkc3QgfHwgIXNyY1NsaWNlKSB7CiAgICAgICAgIGF2X2xvZyhjLCBBVl9MT0dfRVJST1IsICJPbmUgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgdG8gc3dzX3NjYWxlKCkgaXMgTlVMTCwgcGxlYXNlIGNoZWNrIHRoZSBjYWxsaW5nIGNvZGVcbiIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgc3JjU3RyaWRlMltpXSA9IHNyY1N0cmlkZVtpXTsKKyAgICAgICAgZHN0U3RyaWRlMltpXSA9IGRzdFN0cmlkZVtpXTsKKyAgICB9CisKICAgICBpZiAoKHNyY1NsaWNlWSAmIChtYWNyb19oZWlnaHQtMSkpIHx8CiAgICAgICAgICgoc3JjU2xpY2VIJiAobWFjcm9faGVpZ2h0LTEpKSAmJiBzcmNTbGljZVkgKyBzcmNTbGljZUggIT0gYy0+c3JjSCkgfHwKICAgICAgICAgc3JjU2xpY2VZICsgc3JjU2xpY2VIID4gYy0+c3JjSCkgewpAQCAtMTIzMSwzMCArOTUyLDEyIEBACiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgICAgICBtZW1zZXQoYy0+ZGl0aGVyX2Vycm9yW2ldLCAwLCBzaXplb2YoYy0+ZGl0aGVyX2Vycm9yWzBdWzBdKSAqIChjLT5kc3RXKzIpKTsKIAotCi0gICAgLy8gY29weSBzdHJpZGVzLCBzbyB0aGV5IGNhbiBzYWZlbHkgYmUgbW9kaWZpZWQKLSAgICBpZiAoYy0+c2xpY2VEaXIgPT0gMSkgewotICAgICAgICAvLyBzbGljZXMgZ28gZnJvbSB0b3AgdG8gYm90dG9tCi0gICAgICAgIGludCBzcmNTdHJpZGUyWzRdID0geyBzcmNTdHJpZGVbMF0sIHNyY1N0cmlkZVsxXSwgc3JjU3RyaWRlWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU3RyaWRlWzNdIH07Ci0gICAgICAgIGludCBkc3RTdHJpZGUyWzRdID0geyBkc3RTdHJpZGVbMF0sIGRzdFN0cmlkZVsxXSwgZHN0U3RyaWRlWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlWzNdIH07Ci0KLSAgICAgICAgcmVzZXRfcHRyKHNyYzIsIGMtPnNyY0Zvcm1hdCk7Ci0gICAgICAgIHJlc2V0X3B0cigodm9pZCopZHN0MiwgYy0+ZHN0Rm9ybWF0KTsKLQotICAgICAgICAvKiByZXNldCBzbGljZSBkaXJlY3Rpb24gYXQgZW5kIG9mIGZyYW1lICovCi0gICAgICAgIGlmIChzcmNTbGljZVkgKyBzcmNTbGljZUggPT0gYy0+c3JjSCkKLSAgICAgICAgICAgIGMtPnNsaWNlRGlyID0gMDsKLQotICAgICAgICByZXQgPSBjLT5zd3NjYWxlKGMsIHNyYzIsIHNyY1N0cmlkZTIsIHNyY1NsaWNlWSwgc3JjU2xpY2VILCBkc3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RTdHJpZGUyKTsKLSAgICB9IGVsc2UgeworICAgIGlmIChjLT5zbGljZURpciAhPSAxKSB7CiAgICAgICAgIC8vIHNsaWNlcyBnbyBmcm9tIGJvdHRvbSB0byB0b3AgPT4gd2UgZmxpcCB0aGUgaW1hZ2UgaW50ZXJuYWxseQotICAgICAgICBpbnQgc3JjU3RyaWRlMls0XSA9IHsgLXNyY1N0cmlkZVswXSwgLXNyY1N0cmlkZVsxXSwgLXNyY1N0cmlkZVsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1zcmNTdHJpZGVbM10gfTsKLSAgICAgICAgaW50IGRzdFN0cmlkZTJbNF0gPSB7IC1kc3RTdHJpZGVbMF0sIC1kc3RTdHJpZGVbMV0sIC1kc3RTdHJpZGVbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZHN0U3RyaWRlWzNdIH07CisgICAgICAgIGZvciAoaT0wOyBpPDQ7IGkrKykgeworICAgICAgICAgICAgc3JjU3RyaWRlMltpXSAqPSAtMTsKKyAgICAgICAgICAgIGRzdFN0cmlkZTJbaV0gKj0gLTE7CisgICAgICAgIH0KIAogICAgICAgICBzcmMyWzBdICs9IChzcmNTbGljZUggLSAxKSAqIHNyY1N0cmlkZVswXTsKICAgICAgICAgaWYgKCF1c2VQYWwoYy0+c3JjRm9ybWF0KSkKQEAgLTEyNjYsMjEgKzk2OSwyNiBAQAogICAgICAgICBkc3QyWzJdICs9ICgoYy0+ZHN0SCA+PiBjLT5jaHJEc3RWU3ViU2FtcGxlKSAtIDEpICogZHN0U3RyaWRlWzJdOwogICAgICAgICBkc3QyWzNdICs9ICggYy0+ZHN0SCAgICAgICAgICAgICAgICAgICAgICAgICAtIDEpICogZHN0U3RyaWRlWzNdOwogCi0gICAgICAgIHJlc2V0X3B0cihzcmMyLCBjLT5zcmNGb3JtYXQpOwotICAgICAgICByZXNldF9wdHIoKHZvaWQqKWRzdDIsIGMtPmRzdEZvcm1hdCk7Ci0KLSAgICAgICAgLyogcmVzZXQgc2xpY2UgZGlyZWN0aW9uIGF0IGVuZCBvZiBmcmFtZSAqLwotICAgICAgICBpZiAoIXNyY1NsaWNlWSkKLSAgICAgICAgICAgIGMtPnNsaWNlRGlyID0gMDsKLQotICAgICAgICByZXQgPSBjLT5zd3NjYWxlKGMsIHNyYzIsIHNyY1N0cmlkZTIsIGMtPnNyY0gtc3JjU2xpY2VZLXNyY1NsaWNlSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjU2xpY2VILCBkc3QyLCBkc3RTdHJpZGUyKTsKKyAgICAgICAgc3JjU2xpY2VZX2ludGVybmFsID0gYy0+c3JjSC1zcmNTbGljZVktc3JjU2xpY2VIOwogICAgIH0KKyAgICByZXNldF9wdHIoc3JjMiwgYy0+c3JjRm9ybWF0KTsKKyAgICByZXNldF9wdHIoKHZvaWQqKWRzdDIsIGMtPmRzdEZvcm1hdCk7CisKKyAgICAvKiByZXNldCBzbGljZSBkaXJlY3Rpb24gYXQgZW5kIG9mIGZyYW1lICovCisgICAgaWYgKHNyY1NsaWNlWV9pbnRlcm5hbCArIHNyY1NsaWNlSCA9PSBjLT5zcmNIKQorICAgICAgICBjLT5zbGljZURpciA9IDA7CisgICAgcmV0ID0gYy0+c3dzY2FsZShjLCBzcmMyLCBzcmNTdHJpZGUyLCBzcmNTbGljZVlfaW50ZXJuYWwsIHNyY1NsaWNlSCwgZHN0MiwgZHN0U3RyaWRlMik7CiAKIAogICAgIGlmIChjLT5kc3RYWVogJiYgIShjLT5zcmNYWVogJiYgYy0+c3JjVz09Yy0+ZHN0VyAmJiBjLT5zcmNIPT1jLT5kc3RIKSkgeworICAgICAgICBpbnQgZHN0WSA9IGMtPmRzdFkgPyBjLT5kc3RZIDogc3JjU2xpY2VZICsgc3JjU2xpY2VIOworICAgICAgICB1aW50MTZfdCAqZHN0MTYgPSAodWludDE2X3QqKShkc3QyWzBdICsgKGRzdFkgLSByZXQpICogZHN0U3RyaWRlMlswXSk7CisgICAgICAgIGF2X2Fzc2VydDAoZHN0WSA+PSByZXQpOworICAgICAgICBhdl9hc3NlcnQwKHJldCA+PSAwKTsKKyAgICAgICAgYXZfYXNzZXJ0MChjLT5kc3RIID49IGRzdFkpOworCiAgICAgICAgIC8qIHJlcGxhY2Ugb24gdGhlIHNhbWUgZGF0YSAqLwotICAgICAgICByZ2I0OFRveHl6MTIoYywgKHVpbnQxNl90Kilkc3QyWzBdLCAoY29uc3QgdWludDE2X3QqKWRzdDJbMF0sIGRzdFN0cmlkZVswXS8yLCByZXQpOworICAgICAgICByZ2I0OFRveHl6MTIoYywgZHN0MTYsIGRzdDE2LCBkc3RTdHJpZGUyWzBdLzIsIHJldCk7CiAgICAgfQogCiAgICAgYXZfZnJlZShyZ2IwX3RtcCk7CmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3N3c2NhbGUuaCBiL2xpYnN3c2NhbGUvc3dzY2FsZS5oCmluZGV4IGRhOWRkMmUuLjc3MTNmNTEgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvc3dzY2FsZS5oCisrKyBiL2xpYnN3c2NhbGUvc3dzY2FsZS5oCkBAIC0zNSw3ICszNSw5IEBACiAjaW5jbHVkZSAidmVyc2lvbi5oIgogCiAvKioKLSAqIEBkZWZncm91cCBsaWJzd3MgQ29sb3IgY29udmVyc2lvbiBhbmQgc2NhbGluZworICogQGRlZmdyb3VwIGxpYnN3cyBsaWJzd3NjYWxlCisgKiBDb2xvciBjb252ZXJzaW9uIGFuZCBzY2FsaW5nIGxpYnJhcnkuCisgKgogICogQHsKICAqCiAgKiBSZXR1cm4gdGhlIExJQlNXU0NBTEVfVkVSU0lPTl9JTlQgY29uc3RhbnQuCkBAIC03Myw3ICs3NSw3IEBACiAjZGVmaW5lIFNXU19QUklOVF9JTkZPICAgICAgICAgICAgICAweDEwMDAKIAogLy90aGUgZm9sbG93aW5nIDMgZmxhZ3MgYXJlIG5vdCBjb21wbGV0ZWx5IGltcGxlbWVudGVkCi0vL2ludGVybmFsIGNocm9taW5hY2Ugc3Vic2FtcGxpbmcgaW5mbworLy9pbnRlcm5hbCBjaHJvbWluYW5jZSBzdWJzYW1wbGluZyBpbmZvCiAjZGVmaW5lIFNXU19GVUxMX0NIUl9IX0lOVCAgICAweDIwMDAKIC8vaW5wdXQgc3Vic2FtcGxpbmcgaW5mbwogI2RlZmluZSBTV1NfRlVMTF9DSFJfSF9JTlAgICAgMHg0MDAwCkBAIC05MSw2ICs5Myw3IEBACiAjZGVmaW5lIFNXU19DU19TTVBURTE3ME0gICAgICA1CiAjZGVmaW5lIFNXU19DU19TTVBURTI0ME0gICAgICA3CiAjZGVmaW5lIFNXU19DU19ERUZBVUxUICAgICAgICA1CisjZGVmaW5lIFNXU19DU19CVDIwMjAgICAgICAgICA5CiAKIC8qKgogICogUmV0dXJuIGEgcG9pbnRlciB0byB5dXY8LT5yZ2IgY29lZmZpY2llbnRzIGZvciB0aGUgZ2l2ZW4gY29sb3JzcGFjZQpAQCAtMjQ4LDE4ICsyNTEsNiBAQAogU3dzVmVjdG9yICpzd3NfZ2V0R2F1c3NpYW5WZWMoZG91YmxlIHZhcmlhbmNlLCBkb3VibGUgcXVhbGl0eSk7CiAKIC8qKgotICogQWxsb2NhdGUgYW5kIHJldHVybiBhIHZlY3RvciB3aXRoIGxlbmd0aCBjb2VmZmljaWVudHMsIGFsbAotICogd2l0aCB0aGUgc2FtZSB2YWx1ZSBjLgotICovCi1Td3NWZWN0b3IgKnN3c19nZXRDb25zdFZlYyhkb3VibGUgYywgaW50IGxlbmd0aCk7Ci0KLS8qKgotICogQWxsb2NhdGUgYW5kIHJldHVybiBhIHZlY3RvciB3aXRoIGp1c3Qgb25lIGNvZWZmaWNpZW50LCB3aXRoCi0gKiB2YWx1ZSAxLjAuCi0gKi8KLVN3c1ZlY3RvciAqc3dzX2dldElkZW50aXR5VmVjKHZvaWQpOwotCi0vKioKICAqIFNjYWxlIGFsbCB0aGUgY29lZmZpY2llbnRzIG9mIGEgYnkgdGhlIHNjYWxhciB2YWx1ZS4KICAqLwogdm9pZCBzd3Nfc2NhbGVWZWMoU3dzVmVjdG9yICphLCBkb3VibGUgc2NhbGFyKTsKQEAgLTI2OCwyMiArMjU5LDE3IEBACiAgKiBTY2FsZSBhbGwgdGhlIGNvZWZmaWNpZW50cyBvZiBhIHNvIHRoYXQgdGhlaXIgc3VtIGVxdWFscyBoZWlnaHQuCiAgKi8KIHZvaWQgc3dzX25vcm1hbGl6ZVZlYyhTd3NWZWN0b3IgKmEsIGRvdWJsZSBoZWlnaHQpOwotdm9pZCBzd3NfY29udlZlYyhTd3NWZWN0b3IgKmEsIFN3c1ZlY3RvciAqYik7Ci12b2lkIHN3c19hZGRWZWMoU3dzVmVjdG9yICphLCBTd3NWZWN0b3IgKmIpOwotdm9pZCBzd3Nfc3ViVmVjKFN3c1ZlY3RvciAqYSwgU3dzVmVjdG9yICpiKTsKLXZvaWQgc3dzX3NoaWZ0VmVjKFN3c1ZlY3RvciAqYSwgaW50IHNoaWZ0KTsKIAotLyoqCi0gKiBBbGxvY2F0ZSBhbmQgcmV0dXJuIGEgY2xvbmUgb2YgdGhlIHZlY3RvciBhLCB0aGF0IGlzIGEgdmVjdG9yCi0gKiB3aXRoIHRoZSBzYW1lIGNvZWZmaWNpZW50cyBhcyBhLgotICovCi1Td3NWZWN0b3IgKnN3c19jbG9uZVZlYyhTd3NWZWN0b3IgKmEpOwotCi0vKioKLSAqIFByaW50IHdpdGggYXZfbG9nKCkgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3IgYQotICogaWYgbG9nX2xldmVsIDw9IGF2X2xvZ19sZXZlbC4KLSAqLwotdm9pZCBzd3NfcHJpbnRWZWMyKFN3c1ZlY3RvciAqYSwgQVZDbGFzcyAqbG9nX2N0eCwgaW50IGxvZ19sZXZlbCk7CisjaWYgRkZfQVBJX1NXU19WRUNUT1IKK2F0dHJpYnV0ZV9kZXByZWNhdGVkIFN3c1ZlY3RvciAqc3dzX2dldENvbnN0VmVjKGRvdWJsZSBjLCBpbnQgbGVuZ3RoKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkIFN3c1ZlY3RvciAqc3dzX2dldElkZW50aXR5VmVjKHZvaWQpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQgdm9pZCBzd3NfY29udlZlYyhTd3NWZWN0b3IgKmEsIFN3c1ZlY3RvciAqYik7CithdHRyaWJ1dGVfZGVwcmVjYXRlZCB2b2lkIHN3c19hZGRWZWMoU3dzVmVjdG9yICphLCBTd3NWZWN0b3IgKmIpOworYXR0cmlidXRlX2RlcHJlY2F0ZWQgdm9pZCBzd3Nfc3ViVmVjKFN3c1ZlY3RvciAqYSwgU3dzVmVjdG9yICpiKTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkIHZvaWQgc3dzX3NoaWZ0VmVjKFN3c1ZlY3RvciAqYSwgaW50IHNoaWZ0KTsKK2F0dHJpYnV0ZV9kZXByZWNhdGVkIFN3c1ZlY3RvciAqc3dzX2Nsb25lVmVjKFN3c1ZlY3RvciAqYSk7CithdHRyaWJ1dGVfZGVwcmVjYXRlZCB2b2lkIHN3c19wcmludFZlYzIoU3dzVmVjdG9yICphLCBBVkNsYXNzICpsb2dfY3R4LCBpbnQgbG9nX2xldmVsKTsKKyNlbmRpZgogCiB2b2lkIHN3c19mcmVlVmVjKFN3c1ZlY3RvciAqYSk7CiAKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUvc3dzY2FsZV9pbnRlcm5hbC5oIGIvbGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmgKaW5kZXggMWUyOWVjMy4uMTcwMzg1NiAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmgKKysrIGIvbGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmgKQEAgLTIyLDExICsyMiw2IEBACiAjZGVmaW5lIFNXU0NBTEVfU1dTQ0FMRV9JTlRFUk5BTF9ICiAKICNpbmNsdWRlICJjb25maWcuaCIKLQotI2lmIEhBVkVfQUxUSVZFQ19ICi0jaW5jbHVkZSA8YWx0aXZlYy5oPgotI2VuZGlmCi0KICNpbmNsdWRlICJ2ZXJzaW9uLmgiCiAKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKQEAgLTM2LDYgKzMxLDcgQEAKICNpbmNsdWRlICJsaWJhdnV0aWwvbG9nLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGZtdC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9waXhkZXNjLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BwYy91dGlsX2FsdGl2ZWMuaCIKIAogI2RlZmluZSBTVFIocykgQVZfVE9TVFJJTkcocykgLy8gQVZfU1RSSU5HSUZZIGlzIHRvbyBsb25nCiAKQEAgLTkxLDkgKzg3LDkgQEAKICAqIFdyaXRlIG9uZSBsaW5lIG9mIGhvcml6b250YWxseSBzY2FsZWQgZGF0YSB0byBwbGFuYXIgb3V0cHV0CiAgKiB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHZlcnRpY2FsIHNjYWxpbmcgKG9yIHBvaW50LXNjYWxpbmcpLgogICoKLSAqIEBwYXJhbSBzcmMgICAgIHNjYWxlZCBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gZGVzdCAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgcGxhbmUuIEZvciA+OGJpdAorICogQHBhcmFtIHNyYyAgICAgc2NhbGVkIHNvdXJjZSBkYXRhLCAxNSBiaXRzIGZvciA4LTEwLWJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAxOSBiaXRzIGZvciAxNi1iaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGRlc3QgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IHBsYW5lLiBGb3IgPjgtYml0CiAgKiAgICAgICAgICAgICAgICBvdXRwdXQsIHRoaXMgaXMgaW4gdWludDE2X3QKICAqIEBwYXJhbSBkc3RXICAgIHdpZHRoIG9mIGRlc3RpbmF0aW9uIGluIHBpeGVscwogICogQHBhcmFtIGRpdGhlciAgb3JkZXJlZCBkaXRoZXIgYXJyYXkgb2YgdHlwZSBpbnQxNl90IGFuZCBzaXplIDgKQEAgLTEwNiwxMSArMTAyLDExIEBACiAgKiBXcml0ZSBvbmUgbGluZSBvZiBob3Jpem9udGFsbHkgc2NhbGVkIGRhdGEgdG8gcGxhbmFyIG91dHB1dAogICogd2l0aCBtdWx0aS1wb2ludCB2ZXJ0aWNhbCBzY2FsaW5nIGJldHdlZW4gaW5wdXQgcGl4ZWxzLgogICoKLSAqIEBwYXJhbSBmaWx0ZXIgICAgICAgIHZlcnRpY2FsIGx1bWEvYWxwaGEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyYml0IFswLDQwOTZdCi0gKiBAcGFyYW0gc3JjICAgICAgICAgICBzY2FsZWQgbHVtYSAoWSkgb3IgYWxwaGEgKEEpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBmaWx0ZXIgICAgICAgIHZlcnRpY2FsIGx1bWEvYWxwaGEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyIGJpdHMgWzAsNDA5Nl0KKyAqIEBwYXJhbSBzcmMgICAgICAgICAgIHNjYWxlZCBsdW1hIChZKSBvciBhbHBoYSAoQSkgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICA4LTEwLWJpdCBvdXRwdXQsIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCiAgKiBAcGFyYW0gZmlsdGVyU2l6ZSAgICBudW1iZXIgb2YgdmVydGljYWwgaW5wdXQgbGluZXMgdG8gc2NhbGUKLSAqIEBwYXJhbSBkZXN0ICAgICAgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHBsYW5lLiBGb3IgPjhiaXQKKyAqIEBwYXJhbSBkZXN0ICAgICAgICAgIHBvaW50ZXIgdG8gb3V0cHV0IHBsYW5lLiBGb3IgPjgtYml0CiAgKiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIHRoaXMgaXMgaW4gdWludDE2X3QKICAqIEBwYXJhbSBkc3RXICAgICAgICAgIHdpZHRoIG9mIGRlc3RpbmF0aW9uIHBpeGVscwogICogQHBhcmFtIG9mZnNldCAgICAgICAgRGl0aGVyIG9mZnNldApAQCAtMTI0LDEzICsxMjAsMTMgQEAKICAqIHdpdGggbXVsdGktcG9pbnQgdmVydGljYWwgc2NhbGluZyBiZXR3ZWVuIGlucHV0IHBpeGVscy4KICAqCiAgKiBAcGFyYW0gYyAgICAgICAgICAgICBTV1Mgc2NhbGluZyBjb250ZXh0Ci0gKiBAcGFyYW0gY2hyRmlsdGVyICAgICB2ZXJ0aWNhbCBjaHJvbWEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyYml0IFswLDQwOTZdCi0gKiBAcGFyYW0gY2hyVVNyYyAgICAgICBzY2FsZWQgY2hyb21hIChVKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gY2hyVlNyYyAgICAgICBzY2FsZWQgY2hyb21hIChWKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gY2hyRmlsdGVyICAgICB2ZXJ0aWNhbCBjaHJvbWEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyIGJpdHMgWzAsNDA5Nl0KKyAqIEBwYXJhbSBjaHJVU3JjICAgICAgIHNjYWxlZCBjaHJvbWEgKFUpIHNvdXJjZSBkYXRhLCAxNSBiaXRzIGZvciA4LTEwLWJpdAorICogICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCAxOSBiaXRzIGZvciAxNi1iaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGNoclZTcmMgICAgICAgc2NhbGVkIGNocm9tYSAoVikgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yIDgtMTAtYml0CisgKiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCiAgKiBAcGFyYW0gY2hyRmlsdGVyU2l6ZSBudW1iZXIgb2YgdmVydGljYWwgY2hyb21hIGlucHV0IGxpbmVzIHRvIHNjYWxlCi0gKiBAcGFyYW0gZGVzdCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgcGxhbmUuIEZvciA+OGJpdAorICogQHBhcmFtIGRlc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IHBsYW5lLiBGb3IgPjgtYml0CiAgKiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIHRoaXMgaXMgaW4gdWludDE2X3QKICAqIEBwYXJhbSBkc3RXICAgICAgICAgIHdpZHRoIG9mIGNocm9tYSBwbGFuZXMKICAqLwpAQCAtMTQ3LDE1ICsxNDMsMTUgQEAKICAqIHRoYXQgdGhpcyBmdW5jdGlvbiBtYXkgZG8gY2hyb21hIHNjYWxpbmcsIHNlZSB0aGUgInV2YWxwaGEiIGFyZ3VtZW50LgogICoKICAqIEBwYXJhbSBjICAgICAgIFNXUyBzY2FsaW5nIGNvbnRleHQKLSAqIEBwYXJhbSBsdW1TcmMgIHNjYWxlZCBsdW1hIChZKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gY2hyVVNyYyBzY2FsZWQgY2hyb21hIChVKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gY2hyVlNyYyBzY2FsZWQgY2hyb21hIChWKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gYWxwU3JjICBzY2FsZWQgYWxwaGEgKEEpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCi0gKiAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKLSAqIEBwYXJhbSBkZXN0ICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBwbGFuZS4gRm9yIDE2Yml0IG91dHB1dCwgdGhpcyBpcworICogQHBhcmFtIGx1bVNyYyAgc2NhbGVkIGx1bWEgKFkpIHNvdXJjZSBkYXRhLCAxNSBiaXRzIGZvciA4LTEwLWJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAxOSBiaXRzIGZvciAxNi1iaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGNoclVTcmMgc2NhbGVkIGNocm9tYSAoVSkgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yIDgtMTAtYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gY2hyVlNyYyBzY2FsZWQgY2hyb21hIChWKSBzb3VyY2UgZGF0YSwgMTUgYml0cyBmb3IgOC0xMC1iaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgMTkgYml0cyBmb3IgMTYtYml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBhbHBTcmMgIHNjYWxlZCBhbHBoYSAoQSkgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yIDgtMTAtYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gZGVzdCAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgcGxhbmUuIEZvciAxNi1iaXQgb3V0cHV0LCB0aGlzIGlzCiAgKiAgICAgICAgICAgICAgICB1aW50MTZfdAogICogQHBhcmFtIGRzdFcgICAgd2lkdGggb2YgbHVtU3JjIGFuZCBhbHBTcmMgaW4gcGl4ZWxzLCBudW1iZXIgb2YgcGl4ZWxzCiAgKiAgICAgICAgICAgICAgICB0byB3cml0ZSBpbnRvIGRlc3RbXQpAQCAtMTgwLDE1ICsxNzYsMTUgQEAKICAqIG91dHB1dCBieSBkb2luZyBiaWxpbmVhciBzY2FsaW5nIGJldHdlZW4gdHdvIGlucHV0IGxpbmVzLgogICoKICAqIEBwYXJhbSBjICAgICAgIFNXUyBzY2FsaW5nIGNvbnRleHQKLSAqIEBwYXJhbSBsdW1TcmMgIHNjYWxlZCBsdW1hIChZKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gY2hyVVNyYyBzY2FsZWQgY2hyb21hIChVKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gY2hyVlNyYyBzY2FsZWQgY2hyb21hIChWKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gYWxwU3JjICBzY2FsZWQgYWxwaGEgKEEpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCi0gKiAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKLSAqIEBwYXJhbSBkZXN0ICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBwbGFuZS4gRm9yIDE2Yml0IG91dHB1dCwgdGhpcyBpcworICogQHBhcmFtIGx1bVNyYyAgc2NhbGVkIGx1bWEgKFkpIHNvdXJjZSBkYXRhLCAxNSBiaXRzIGZvciA4LTEwLWJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAxOSBiaXRzIGZvciAxNi1iaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGNoclVTcmMgc2NhbGVkIGNocm9tYSAoVSkgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yIDgtMTAtYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gY2hyVlNyYyBzY2FsZWQgY2hyb21hIChWKSBzb3VyY2UgZGF0YSwgMTUgYml0cyBmb3IgOC0xMC1iaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgMTkgYml0cyBmb3IgMTYtYml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBhbHBTcmMgIHNjYWxlZCBhbHBoYSAoQSkgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yIDgtMTAtYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gZGVzdCAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgcGxhbmUuIEZvciAxNi1iaXQgb3V0cHV0LCB0aGlzIGlzCiAgKiAgICAgICAgICAgICAgICB1aW50MTZfdAogICogQHBhcmFtIGRzdFcgICAgd2lkdGggb2YgbHVtU3JjIGFuZCBhbHBTcmMgaW4gcGl4ZWxzLCBudW1iZXIgb2YgcGl4ZWxzCiAgKiAgICAgICAgICAgICAgICB0byB3cml0ZSBpbnRvIGRlc3RbXQpAQCAtMjE0LDE5ICsyMTAsMTkgQEAKICAqIG91dHB1dCBieSBkb2luZyBtdWx0aS1wb2ludCB2ZXJ0aWNhbCBzY2FsaW5nIGJldHdlZW4gaW5wdXQgcGl4ZWxzLgogICoKICAqIEBwYXJhbSBjICAgICAgICAgICAgIFNXUyBzY2FsaW5nIGNvbnRleHQKLSAqIEBwYXJhbSBsdW1GaWx0ZXIgICAgIHZlcnRpY2FsIGx1bWEvYWxwaGEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyYml0IFswLDQwOTZdCi0gKiBAcGFyYW0gbHVtU3JjICAgICAgICBzY2FsZWQgbHVtYSAoWSkgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKLSAqICAgICAgICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGx1bUZpbHRlciAgICAgdmVydGljYWwgbHVtYS9hbHBoYSBzY2FsaW5nIGNvZWZmaWNpZW50cywgMTIgYml0cyBbMCw0MDk2XQorICogQHBhcmFtIGx1bVNyYyAgICAgICAgc2NhbGVkIGx1bWEgKFkpIHNvdXJjZSBkYXRhLCAxNSBiaXRzIGZvciA4LTEwLWJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAxOSBiaXRzIGZvciAxNi1iaXQgb3V0cHV0IChpbiBpbnQzMl90KQogICogQHBhcmFtIGx1bUZpbHRlclNpemUgbnVtYmVyIG9mIHZlcnRpY2FsIGx1bWEvYWxwaGEgaW5wdXQgbGluZXMgdG8gc2NhbGUKLSAqIEBwYXJhbSBjaHJGaWx0ZXIgICAgIHZlcnRpY2FsIGNocm9tYSBzY2FsaW5nIGNvZWZmaWNpZW50cywgMTJiaXQgWzAsNDA5Nl0KLSAqIEBwYXJhbSBjaHJVU3JjICAgICAgIHNjYWxlZCBjaHJvbWEgKFUpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKLSAqIEBwYXJhbSBjaHJWU3JjICAgICAgIHNjYWxlZCBjaHJvbWEgKFYpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBjaHJGaWx0ZXIgICAgIHZlcnRpY2FsIGNocm9tYSBzY2FsaW5nIGNvZWZmaWNpZW50cywgMTIgYml0cyBbMCw0MDk2XQorICogQHBhcmFtIGNoclVTcmMgICAgICAgc2NhbGVkIGNocm9tYSAoVSkgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yIDgtMTAtYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgICAgICAgIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gY2hyVlNyYyAgICAgICBzY2FsZWQgY2hyb21hIChWKSBzb3VyY2UgZGF0YSwgMTUgYml0cyBmb3IgOC0xMC1iaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgICAgICAgMTkgYml0cyBmb3IgMTYtYml0IG91dHB1dCAoaW4gaW50MzJfdCkKICAqIEBwYXJhbSBjaHJGaWx0ZXJTaXplIG51bWJlciBvZiB2ZXJ0aWNhbCBjaHJvbWEgaW5wdXQgbGluZXMgdG8gc2NhbGUKLSAqIEBwYXJhbSBhbHBTcmMgICAgICAgIHNjYWxlZCBhbHBoYSAoQSkgc291cmNlIGRhdGEsIDE1Yml0IGZvciA4LTEwYml0IG91dHB1dCwKLSAqICAgICAgICAgICAgICAgICAgICAgIDE5LWJpdCBmb3IgMTZiaXQgb3V0cHV0IChpbiBpbnQzMl90KQotICogQHBhcmFtIGRlc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IHBsYW5lLiBGb3IgMTZiaXQgb3V0cHV0LCB0aGlzIGlzCisgKiBAcGFyYW0gYWxwU3JjICAgICAgICBzY2FsZWQgYWxwaGEgKEEpIHNvdXJjZSBkYXRhLCAxNSBiaXRzIGZvciA4LTEwLWJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAxOSBiaXRzIGZvciAxNi1iaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGRlc3QgICAgICAgICAgcG9pbnRlciB0byB0aGUgb3V0cHV0IHBsYW5lLiBGb3IgMTYtYml0IG91dHB1dCwgdGhpcyBpcwogICogICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QKICAqIEBwYXJhbSBkc3RXICAgICAgICAgIHdpZHRoIG9mIGx1bVNyYyBhbmQgYWxwU3JjIGluIHBpeGVscywgbnVtYmVyIG9mIHBpeGVscwogICogICAgICAgICAgICAgICAgICAgICAgdG8gd3JpdGUgaW50byBkZXN0W10KQEAgLTI0OCwxOSArMjQ0LDE5IEBACiAgKiBvdXRwdXQgYnkgZG9pbmcgbXVsdGktcG9pbnQgdmVydGljYWwgc2NhbGluZyBiZXR3ZWVuIGlucHV0IHBpeGVscy4KICAqCiAgKiBAcGFyYW0gYyAgICAgICAgICAgICBTV1Mgc2NhbGluZyBjb250ZXh0Ci0gKiBAcGFyYW0gbHVtRmlsdGVyICAgICB2ZXJ0aWNhbCBsdW1hL2FscGhhIHNjYWxpbmcgY29lZmZpY2llbnRzLCAxMmJpdCBbMCw0MDk2XQotICogQHBhcmFtIGx1bVNyYyAgICAgICAgc2NhbGVkIGx1bWEgKFkpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKKyAqIEBwYXJhbSBsdW1GaWx0ZXIgICAgIHZlcnRpY2FsIGx1bWEvYWxwaGEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyIGJpdHMgWzAsNDA5Nl0KKyAqIEBwYXJhbSBsdW1TcmMgICAgICAgIHNjYWxlZCBsdW1hIChZKSBzb3VyY2UgZGF0YSwgMTUgYml0cyBmb3IgOC0xMC1iaXQgb3V0cHV0LAorICogICAgICAgICAgICAgICAgICAgICAgMTkgYml0cyBmb3IgMTYtYml0IG91dHB1dCAoaW4gaW50MzJfdCkKICAqIEBwYXJhbSBsdW1GaWx0ZXJTaXplIG51bWJlciBvZiB2ZXJ0aWNhbCBsdW1hL2FscGhhIGlucHV0IGxpbmVzIHRvIHNjYWxlCi0gKiBAcGFyYW0gY2hyRmlsdGVyICAgICB2ZXJ0aWNhbCBjaHJvbWEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyYml0IFswLDQwOTZdCi0gKiBAcGFyYW0gY2hyVVNyYyAgICAgICBzY2FsZWQgY2hyb21hIChVKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCi0gKiBAcGFyYW0gY2hyVlNyYyAgICAgICBzY2FsZWQgY2hyb21hIChWKSBzb3VyY2UgZGF0YSwgMTViaXQgZm9yIDgtMTBiaXQgb3V0cHV0LAotICogICAgICAgICAgICAgICAgICAgICAgMTktYml0IGZvciAxNmJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gY2hyRmlsdGVyICAgICB2ZXJ0aWNhbCBjaHJvbWEgc2NhbGluZyBjb2VmZmljaWVudHMsIDEyIGJpdHMgWzAsNDA5Nl0KKyAqIEBwYXJhbSBjaHJVU3JjICAgICAgIHNjYWxlZCBjaHJvbWEgKFUpIHNvdXJjZSBkYXRhLCAxNSBiaXRzIGZvciA4LTEwLWJpdCBvdXRwdXQsCisgKiAgICAgICAgICAgICAgICAgICAgICAxOSBiaXRzIGZvciAxNi1iaXQgb3V0cHV0IChpbiBpbnQzMl90KQorICogQHBhcmFtIGNoclZTcmMgICAgICAgc2NhbGVkIGNocm9tYSAoVikgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yIDgtMTAtYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgICAgICAgIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCiAgKiBAcGFyYW0gY2hyRmlsdGVyU2l6ZSBudW1iZXIgb2YgdmVydGljYWwgY2hyb21hIGlucHV0IGxpbmVzIHRvIHNjYWxlCi0gKiBAcGFyYW0gYWxwU3JjICAgICAgICBzY2FsZWQgYWxwaGEgKEEpIHNvdXJjZSBkYXRhLCAxNWJpdCBmb3IgOC0xMGJpdCBvdXRwdXQsCi0gKiAgICAgICAgICAgICAgICAgICAgICAxOS1iaXQgZm9yIDE2Yml0IG91dHB1dCAoaW4gaW50MzJfdCkKLSAqIEBwYXJhbSBkZXN0ICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBwbGFuZXMuIEZvciAxNmJpdCBvdXRwdXQsIHRoaXMgaXMKKyAqIEBwYXJhbSBhbHBTcmMgICAgICAgIHNjYWxlZCBhbHBoYSAoQSkgc291cmNlIGRhdGEsIDE1IGJpdHMgZm9yIDgtMTAtYml0IG91dHB1dCwKKyAqICAgICAgICAgICAgICAgICAgICAgIDE5IGJpdHMgZm9yIDE2LWJpdCBvdXRwdXQgKGluIGludDMyX3QpCisgKiBAcGFyYW0gZGVzdCAgICAgICAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgcGxhbmVzLiBGb3IgMTYtYml0IG91dHB1dCwgdGhpcyBpcwogICogICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QKICAqIEBwYXJhbSBkc3RXICAgICAgICAgIHdpZHRoIG9mIGx1bVNyYyBhbmQgYWxwU3JjIGluIHBpeGVscywgbnVtYmVyIG9mIHBpeGVscwogICogICAgICAgICAgICAgICAgICAgICAgdG8gd3JpdGUgaW50byBkZXN0W10KQEAgLTM1MCwxMiArMzQ2LDYgQEAKICAgICAgKiB2ZXJ0aWNhbCBzY2FsZXIgaXMgY2FsbGVkLgogICAgICAqLwogICAgIC8vQHsKLSAgICBpbnQxNl90ICoqbHVtUGl4QnVmOyAgICAgICAgICAvLy88IFJpbmcgYnVmZmVyIGZvciBzY2FsZWQgaG9yaXpvbnRhbCBsdW1hICAgcGxhbmUgbGluZXMgdG8gYmUgZmVkIHRvIHRoZSB2ZXJ0aWNhbCBzY2FsZXIuCi0gICAgaW50MTZfdCAqKmNoclVQaXhCdWY7ICAgICAgICAgLy8vPCBSaW5nIGJ1ZmZlciBmb3Igc2NhbGVkIGhvcml6b250YWwgY2hyb21hIHBsYW5lIGxpbmVzIHRvIGJlIGZlZCB0byB0aGUgdmVydGljYWwgc2NhbGVyLgotICAgIGludDE2X3QgKipjaHJWUGl4QnVmOyAgICAgICAgIC8vLzwgUmluZyBidWZmZXIgZm9yIHNjYWxlZCBob3Jpem9udGFsIGNocm9tYSBwbGFuZSBsaW5lcyB0byBiZSBmZWQgdG8gdGhlIHZlcnRpY2FsIHNjYWxlci4KLSAgICBpbnQxNl90ICoqYWxwUGl4QnVmOyAgICAgICAgICAvLy88IFJpbmcgYnVmZmVyIGZvciBzY2FsZWQgaG9yaXpvbnRhbCBhbHBoYSAgcGxhbmUgbGluZXMgdG8gYmUgZmVkIHRvIHRoZSB2ZXJ0aWNhbCBzY2FsZXIuCi0gICAgaW50IHZMdW1CdWZTaXplOyAgICAgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgdmVydGljYWwgbHVtYS9hbHBoYSBsaW5lcyBhbGxvY2F0ZWQgaW4gdGhlIHJpbmcgYnVmZmVyLgotICAgIGludCB2Q2hyQnVmU2l6ZTsgICAgICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIHZlcnRpY2FsIGNocm9tYSAgICAgbGluZXMgYWxsb2NhdGVkIGluIHRoZSByaW5nIGJ1ZmZlci4KICAgICBpbnQgbGFzdEluTHVtQnVmOyAgICAgICAgICAgICAvLy88IExhc3Qgc2NhbGVkIGhvcml6b250YWwgbHVtYS9hbHBoYSBsaW5lIGZyb20gc291cmNlIGluIHRoZSByaW5nIGJ1ZmZlci4KICAgICBpbnQgbGFzdEluQ2hyQnVmOyAgICAgICAgICAgICAvLy88IExhc3Qgc2NhbGVkIGhvcml6b250YWwgY2hyb21hICAgICBsaW5lIGZyb20gc291cmNlIGluIHRoZSByaW5nIGJ1ZmZlci4KICAgICBpbnQgbHVtQnVmSW5kZXg7ICAgICAgICAgICAgICAvLy88IEluZGV4IGluIHJpbmcgYnVmZmVyIG9mIHRoZSBsYXN0IHNjYWxlZCBob3Jpem9udGFsIGx1bWEvYWxwaGEgbGluZSBmcm9tIHNvdXJjZS4KQEAgLTM2Myw2ICszNTMsNyBAQAogICAgIC8vQH0KIAogICAgIHVpbnQ4X3QgKmZvcm1hdENvbnZCdWZmZXI7CisgICAgaW50IG5lZWRBbHBoYTsKIAogICAgIC8qKgogICAgICAqIEBuYW1lIEhvcml6b250YWwgYW5kIHZlcnRpY2FsIGZpbHRlcnMuCkBAIC01NTksNyArNTUwLDcgQEAKICAgICAgKiBTY2FsZSBvbmUgaG9yaXpvbnRhbCBsaW5lIG9mIGlucHV0IGRhdGEgdXNpbmcgYSBiaWxpbmVhciBmaWx0ZXIKICAgICAgKiB0byBwcm9kdWNlIG9uZSBsaW5lIG9mIG91dHB1dCBkYXRhLiBDb21wYXJlZCB0byBTd3NDb250ZXh0LT5oU2NhbGUoKSwKICAgICAgKiBwbGVhc2UgdGFrZSBub3RlIG9mIHRoZSBmb2xsb3dpbmcgY2F2ZWF0cyB3aGVuIHVzaW5nIHRoZXNlOgotICAgICAqIC0gU2NhbGluZyBpcyBkb25lIHVzaW5nIG9ubHkgN2JpdCBpbnN0ZWFkIG9mIDE0Yml0IGNvZWZmaWNpZW50cy4KKyAgICAgKiAtIFNjYWxpbmcgaXMgZG9uZSB1c2luZyBvbmx5IDcgYml0cyBpbnN0ZWFkIG9mIDE0LWJpdCBjb2VmZmljaWVudHMuCiAgICAgICogLSBZb3UgY2FuIHVzZSBubyBtb3JlIHRoYW4gNSBpbnB1dCBwaXhlbHMgdG8gcHJvZHVjZSA0IG91dHB1dAogICAgICAqICAgcGl4ZWxzLiBUaGVyZWZvcmUsIHRoaXMgZmlsdGVyIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgZG93bnNjYWxpbmcKICAgICAgKiAgIGJ5IG1vcmUgdGhhbiB+MjAlIGluIHdpZHRoIChiZWNhdXNlIHRoYXQgZXF1YWxzIG1vcmUgdGhhbiA1LzR0aApAQCAtNTkwLDE1ICs1ODEsMTUgQEAKICAgICAgKiBAcGFyYW0gZHN0ICAgICAgICBwb2ludGVyIHRvIGRlc3RpbmF0aW9uIGJ1ZmZlciBmb3IgaG9yaXpvbnRhbGx5IHNjYWxlZAogICAgICAqICAgICAgICAgICAgICAgICAgIGRhdGEuIElmIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgY29tcG9uZW50IG9mIG9uZQogICAgICAqICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uIHBpeGVsIChTd3NDb250ZXh0LT5kc3RCcGMpIGlzIDw9IDEwLCBkYXRhCi0gICAgICogICAgICAgICAgICAgICAgICAgd2lsbCBiZSAxNWJwYyBpbiAxNmJpdHMgKGludDE2X3QpIHdpZHRoLiBFbHNlIChpLmUuCisgICAgICogICAgICAgICAgICAgICAgICAgd2lsbCBiZSAxNSBicGMgaW4gMTYgYml0cyAoaW50MTZfdCkgd2lkdGguIEVsc2UgKGkuZS4KICAgICAgKiAgICAgICAgICAgICAgICAgICBTd3NDb250ZXh0LT5kc3RCcGMgPT0gMTYpLCBkYXRhIHdpbGwgYmUgMTlicGMgaW4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAzMmJpdHMgKGludDMyX3QpIHdpZHRoLgorICAgICAqICAgICAgICAgICAgICAgICAgIDMyIGJpdHMgKGludDMyX3QpIHdpZHRoLgogICAgICAqIEBwYXJhbSBkc3RXICAgICAgIHdpZHRoIG9mIGRlc3RpbmF0aW9uIGltYWdlCiAgICAgICogQHBhcmFtIHNyYyAgICAgICAgcG9pbnRlciB0byBzb3VyY2UgZGF0YSB0byBiZSBzY2FsZWQuIElmIHRoZSBudW1iZXIgb2YKICAgICAgKiAgICAgICAgICAgICAgICAgICBiaXRzIHBlciBjb21wb25lbnQgb2YgYSBzb3VyY2UgcGl4ZWwgKFN3c0NvbnRleHQtPnNyY0JwYykKLSAgICAgKiAgICAgICAgICAgICAgICAgICBpcyA4LCB0aGlzIGlzIDhicGMgaW4gOGJpdHMgKHVpbnQ4X3QpIHdpZHRoLiBFbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgaXMgOCwgdGhpcyBpcyA4YnBjIGluIDggYml0cyAodWludDhfdCkgd2lkdGguIEVsc2UKICAgICAgKiAgICAgICAgICAgICAgICAgICAoaS5lLiBTd3NDb250ZXh0LT5kc3RCcGMgPiA4KSwgdGhpcyBpcyBuYXRpdmUgZGVwdGgKLSAgICAgKiAgICAgICAgICAgICAgICAgICBpbiAxNmJpdHMgKHVpbnQxNl90KSB3aWR0aC4gSW4gb3RoZXIgd29yZHMsIGZvciA5LWJpdAorICAgICAqICAgICAgICAgICAgICAgICAgIGluIDE2IGJpdHMgKHVpbnQxNl90KSB3aWR0aC4gSW4gb3RoZXIgd29yZHMsIGZvciA5LWJpdAogICAgICAqICAgICAgICAgICAgICAgICAgIFlVViBpbnB1dCwgdGhpcyBpcyA5YnBjLCBmb3IgMTAtYml0IFlVViBpbnB1dCwgdGhpcyBpcwogICAgICAqICAgICAgICAgICAgICAgICAgIDEwYnBjLCBhbmQgZm9yIDE2LWJpdCBSR0Igb3IgWVVWLCB0aGlzIGlzIDE2YnBjLgogICAgICAqIEBwYXJhbSBmaWx0ZXIgICAgIGZpbHRlciBjb2VmZmljaWVudHMgdG8gYmUgdXNlZCBwZXIgb3V0cHV0IHBpeGVsIGZvcgpAQCAtNjU3LDE1ICs2NDgsMTMgQEAKICAgICByZXR1cm4gZGVzYy0+Y29tcFswXS5kZXB0aCA9PSAxNjsKIH0KIAotc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzOV9PUl8xMEJQUyhlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBpc05CUFMoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCiB7CiAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKICAgICBhdl9hc3NlcnQwKGRlc2MpOwogICAgIHJldHVybiBkZXNjLT5jb21wWzBdLmRlcHRoID49IDkgJiYgZGVzYy0+Y29tcFswXS5kZXB0aCA8PSAxNDsKIH0KIAotI2RlZmluZSBpc05CUFMoeCkgaXM5X09SXzEwQlBTKHgpCi0KIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBpc0JFKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQogewogICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CkBAIC02ODcsNiArNjc2LDE3IEBACiAgICAgcmV0dXJuICgoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSKSAmJiBpc1lVVihwaXhfZm10KSk7CiB9CiAKKy8qCisgKiBJZGVudGl0eSBzZW1pLXBsYW5hciBZVVYgZm9ybWF0cy4gU3BlY2lmaWNhbGx5LCB0aG9zZSBhcmUgWVVWIGZvcm1hdHMKKyAqIHdoZXJlIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGNvbXBvbmVudHMgKFUgJiBWKSBhcmUgb24gdGhlIHNhbWUgcGxhbmUuCisgKi8KK3N0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCBpc1NlbWlQbGFuYXJZVVYoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiAoaXNQbGFuYXJZVVYocGl4X2ZtdCkgJiYgZGVzYy0+Y29tcFsxXS5wbGFuZSA9PSBkZXNjLT5jb21wWzJdLnBsYW5lKTsKK30KKwogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzUkdCKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQogewogICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CkBAIC02OTQsMTA0ICs2OTQsNzUgQEAKICAgICByZXR1cm4gKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX1JHQik7CiB9CiAKLSNpZiAwIC8vIEZJWE1FCi0jZGVmaW5lIGlzR3JheSh4KSBcCi0gICAgKCEoYXZfcGl4X2ZtdF9kZXNjX2dldCh4KS0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMKSAmJiBcCi0gICAgIGF2X3BpeF9mbXRfZGVzY19nZXQoeCktPm5iX2NvbXBvbmVudHMgPD0gMikKLSNlbHNlCi0jZGVmaW5lIGlzR3JheSh4KSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKCh4KSA9PSBBVl9QSVhfRk1UX0dSQVk4ICAgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX1lBOCAgICAgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0dSQVkxNkJFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0dSQVkxNkxFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX1lBMTZCRSAgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX1lBMTZMRSkKLSNlbmRpZgorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzR3JheShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2MgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KHBpeF9mbXQpOworICAgIGF2X2Fzc2VydDAoZGVzYyk7CisgICAgcmV0dXJuICEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMKSAmJgorICAgICAgICAgICAhKGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0hXQUNDRUwpICYmCisgICAgICAgICAgIGRlc2MtPm5iX2NvbXBvbmVudHMgPD0gMiAmJgorICAgICAgICAgICBwaXhfZm10ICE9IEFWX1BJWF9GTVRfTU9OT0JMQUNLICYmCisgICAgICAgICAgIHBpeF9mbXQgIT0gQVZfUElYX0ZNVF9NT05PV0hJVEU7Cit9CiAKLSNkZWZpbmUgaXNSR0JpbkludCh4KSBcCi0gICAgKCAgICAgICAgICAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0OEJFICAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0OExFICAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0IzMiAgICAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0IzMl8xICAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0IyNCAgICAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I1NjVCRSAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I1NjVMRSAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I1NTVCRSAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I1NTVMRSAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0NDRCRSAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0NDRMRSAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I4ICAgICAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0ICAgICAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0I0X0JZVEUgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0JBNjRCRSAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9SR0JBNjRMRSAgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0sgICB8fCAgXAotICAgICAoeCkgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEUgICBcCi0gICAgKQotI2RlZmluZSBpc0JHUmluSW50KHgpIFwKLSAgICAoICAgICAgICAgICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ4QkUgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ4TEUgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjMyICAgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjMyXzEgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjI0ICAgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjU2NUJFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjU2NUxFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjU1NUJFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjU1NUxFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ0NEJFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ0NExFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjggICAgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQgICAgICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjRfQllURSAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUkE2NEJFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUkE2NExFICAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX01PTk9CTEFDSyAgIHx8ICBcCi0gICAgICh4KSA9PSBBVl9QSVhfRk1UX01PTk9XSElURSAgIFwKLSAgICApCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNSR0JpbkludChlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICByZXR1cm4gcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjQ4QkUgICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I0OExFICAgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfUkdCMzIgICAgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjMyXzEgICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IyNCAgICAgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNTY1QkUgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjU2NUxFICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I1NTVCRSAgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfUkdCNTU1TEUgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjQ0NEJFICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I0NDRMRSAgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfUkdCOCAgICAgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjQgICAgICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0I0X0JZVEUgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfUkdCQTY0QkUgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQkE2NExFICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0sgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfTU9OT1dISVRFOworfQogCi0jZGVmaW5lIGlzUkdCaW5CeXRlcyh4KSAoICAgICAgICAgICBcCi0gICAgICAgICAgICh4KSA9PSBBVl9QSVhfRk1UX1JHQjQ4QkUgICAgIFwKLSAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfUkdCNDhMRSAgICAgXAotICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9SR0JBNjRCRSAgICBcCi0gICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX1JHQkE2NExFICAgIFwKLSAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfUkdCQSAgICAgICAgXAotICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9BUkdCICAgICAgICBcCi0gICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX1JHQjI0ICAgICAgIFwKLSAgICApCi0jZGVmaW5lIGlzQkdSaW5CeXRlcyh4KSAoICAgICAgICAgICBcCi0gICAgICAgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjQ4QkUgICAgIFwKLSAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfQkdSNDhMRSAgICAgXAotICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9CR1JBNjRCRSAgICBcCi0gICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX0JHUkE2NExFICAgIFwKLSAgICAgICAgfHwgKHgpID09IEFWX1BJWF9GTVRfQkdSQSAgICAgICAgXAotICAgICAgICB8fCAoeCkgPT0gQVZfUElYX0ZNVF9BQkdSICAgICAgICBcCi0gICAgICAgIHx8ICh4KSA9PSBBVl9QSVhfRk1UX0JHUjI0ICAgICAgIFwKLSAgICApCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNCR1JpbkludChlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKK3sKKyAgICByZXR1cm4gcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjQ4QkUgICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1I0OExFICAgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfQkdSMzIgICAgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjMyXzEgICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1IyNCAgICAgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfQkdSNTY1QkUgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjU2NUxFICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1I1NTVCRSAgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfQkdSNTU1TEUgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjQ0NEJFICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1I0NDRMRSAgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfQkdSOCAgICAgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjQgICAgICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1I0X0JZVEUgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfQkdSQTY0QkUgICAgfHwKKyAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUkE2NExFICAgIHx8CisgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PQkxBQ0sgICB8fAorICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfTU9OT1dISVRFOworfQogCi0jZGVmaW5lIGlzQmF5ZXIoeCkgKCBcCi0gICAgICAgICAgICh4KT09QVZfUElYX0ZNVF9CQVlFUl9CR0dSOCAgICBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9CR0dSMTZMRSBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9CR0dSMTZCRSBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9SR0dCOCAgICBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZMRSBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9SR0dCMTZCRSBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9HQlJHOCAgICBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZMRSBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9HQlJHMTZCRSBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9HUkJHOCAgICBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9HUkJHMTZMRSBcCi0gICAgICAgIHx8ICh4KT09QVZfUElYX0ZNVF9CQVlFUl9HUkJHMTZCRSBcCi0gICAgKQorc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzQmF5ZXIoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiAhIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19CQVlFUik7Cit9CiAKLSNkZWZpbmUgaXNBbnlSR0IoeCkgXAotICAgICggICAgICAgICAgIFwKLSAgICAgICAgICBpc0JheWVyKHgpICAgICAgICAgIHx8ICAgIFwKLSAgICAgICAgICBpc1JHQmluSW50KHgpICAgICAgIHx8ICAgIFwKLSAgICAgICAgICBpc0JHUmluSW50KHgpICAgICAgIHx8ICAgIFwKLSAgICAgICAgICBpc1JHQih4KSAgICAgIFwKLSAgICApCitzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNBbnlSR0IoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCit7CisgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKKyAgICBhdl9hc3NlcnQwKGRlc2MpOworICAgIHJldHVybiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUkdCKSB8fAorICAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX01PTk9CTEFDSyB8fCBwaXhfZm10ID09IEFWX1BJWF9GTVRfTU9OT1dISVRFOworfQogCiBzdGF0aWMgYXZfYWx3YXlzX2lubGluZSBpbnQgaXNBTFBIQShlbnVtIEFWUGl4ZWxGb3JtYXQgcGl4X2ZtdCkKIHsKQEAgLTgwMiwzMCArNzczLDE1IEBACiAgICAgcmV0dXJuIGRlc2MtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0FMUEhBOwogfQogCi0jaWYgMQotI2RlZmluZSBpc1BhY2tlZCh4KSAgICAgICAgICggICAgICAgXAotICAgICAgICAgICAoeCk9PUFWX1BJWF9GTVRfUEFMOCAgICAgICAgXAotICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfWVVZVjQyMiAgICAgXAotICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfWVZZVTQyMiAgICAgXAotICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfVVlWWTQyMiAgICAgXAotICAgICAgICB8fCAoeCk9PUFWX1BJWF9GTVRfWUE4ICAgICAgIFwKLSAgICAgICAgfHwgKHgpPT1BVl9QSVhfRk1UX1lBMTZMRSAgICAgIFwKLSAgICAgICAgfHwgKHgpPT1BVl9QSVhfRk1UX1lBMTZCRSAgICAgIFwKLSAgICAgICAgfHwgKHgpPT1BVl9QSVhfRk1UX0FZVVY2NExFICAgIFwKLSAgICAgICAgfHwgKHgpPT1BVl9QSVhfRk1UX0FZVVY2NEJFICAgIFwKLSAgICAgICAgfHwgIGlzUkdCaW5JbnQoeCkgICAgICAgICAgIFwKLSAgICAgICAgfHwgIGlzQkdSaW5JbnQoeCkgICAgICAgICAgIFwKLSAgICApCi0jZWxzZQogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzUGFja2VkKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQogewogICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CiAgICAgYXZfYXNzZXJ0MChkZXNjKTsKLSAgICByZXR1cm4gKChkZXNjLT5uYl9jb21wb25lbnRzID49IDIgJiYgIShkZXNjLT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19QTEFOQVIpKSB8fAotICAgICAgICAgICAgcGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1BBTDgpOworICAgIHJldHVybiAoZGVzYy0+bmJfY29tcG9uZW50cyA+PSAyICYmICEoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUExBTkFSKSkgfHwKKyAgICAgICAgICAgIHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9QQUw4IHx8CisgICAgICAgICAgICBwaXhfZm10ID09IEFWX1BJWF9GTVRfTU9OT0JMQUNLIHx8IHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9NT05PV0hJVEU7CiB9CiAKLSNlbmRpZgogc3RhdGljIGF2X2Fsd2F5c19pbmxpbmUgaW50IGlzUGxhbmFyKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KQogewogICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQocGl4X2ZtdCk7CkBAIC04NTAsOSArODA2LDE3IEBACiAKIHN0YXRpYyBhdl9hbHdheXNfaW5saW5lIGludCB1c2VQYWwoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCiB7Ci0gICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpkZXNjID0gYXZfcGl4X2ZtdF9kZXNjX2dldChwaXhfZm10KTsKLSAgICBhdl9hc3NlcnQwKGRlc2MpOwotICAgIHJldHVybiAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUEFMKSB8fCAoZGVzYy0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfUFNFVURPUEFMKTsKKyAgICBzd2l0Y2ggKHBpeF9mbXQpIHsKKyAgICBjYXNlIEFWX1BJWF9GTVRfUEFMODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfQkdSNF9CWVRFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9CR1I4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKKyAgICBjYXNlIEFWX1BJWF9GTVRfUkdCNF9CWVRFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I4OgorICAgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gMDsKKyAgICB9CiB9CiAKIGV4dGVybiBjb25zdCB1aW50NjRfdCBmZl9kaXRoZXI0WzJdOwpAQCAtODY2LDcgKzgzMCw3IEBACiBleHRlcm4gY29uc3QgdWludDhfdCBmZl9kaXRoZXJfOHg4XzEyOFs5XVs4XTsKIGV4dGVybiBjb25zdCB1aW50OF90IGZmX2RpdGhlcl84eDhfMjIwWzldWzhdOwogCi1leHRlcm4gY29uc3QgaW50MzJfdCBmZl95dXYycmdiX2NvZWZmc1s4XVs0XTsKK2V4dGVybiBjb25zdCBpbnQzMl90IGZmX3l1djJyZ2JfY29lZmZzWzExXVs0XTsKIAogZXh0ZXJuIGNvbnN0IEFWQ2xhc3MgZmZfc3dzX2NvbnRleHRfY2xhc3M7CiAKQEAgLTg3Nyw2ICs4NDEsNyBAQAogdm9pZCBmZl9nZXRfdW5zY2FsZWRfc3dzY2FsZShTd3NDb250ZXh0ICpjKTsKIHZvaWQgZmZfZ2V0X3Vuc2NhbGVkX3N3c2NhbGVfcHBjKFN3c0NvbnRleHQgKmMpOwogdm9pZCBmZl9nZXRfdW5zY2FsZWRfc3dzY2FsZV9hcm0oU3dzQ29udGV4dCAqYyk7Cit2b2lkIGZmX2dldF91bnNjYWxlZF9zd3NjYWxlX2FhcmNoNjQoU3dzQ29udGV4dCAqYyk7CiAKIC8qKgogICogUmV0dXJuIGZ1bmN0aW9uIHBvaW50ZXIgdG8gZmFzdGVzdCBtYWluIHNjYWxlciBwYXRoIGZ1bmN0aW9uIGRlcGVuZGluZwpAQCAtODk1LDYgKzg2MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5dXYyYW55WF9mbiAqeXV2MmFueVgpOwogdm9pZCBmZl9zd3NfaW5pdF9zd3NjYWxlX3BwYyhTd3NDb250ZXh0ICpjKTsKIHZvaWQgZmZfc3dzX2luaXRfc3dzY2FsZV94ODYoU3dzQ29udGV4dCAqYyk7Cit2b2lkIGZmX3N3c19pbml0X3N3c2NhbGVfYWFyY2g2NChTd3NDb250ZXh0ICpjKTsKK3ZvaWQgZmZfc3dzX2luaXRfc3dzY2FsZV9hcm0oU3dzQ29udGV4dCAqYyk7CiAKIHZvaWQgZmZfaHlzY2FsZV9mYXN0X2MoU3dzQ29udGV4dCAqYywgaW50MTZfdCAqZHN0LCBpbnQgZHN0V2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY1csIGludCB4SW5jKTsKQEAgLTk1OSw3ICs5MjYsNyBAQAogfSBTd3NQbGFuZTsKIAogLyoqCi0gKiBTdHJ1Y3Qgd2hpY2ggZGVmaW5lcyBhIHNsaWNlIG9mIGFuIGltYWdlIHRvIGJlIHNjYWxlZCBvciBhIG91dHB1dCBmb3IKKyAqIFN0cnVjdCB3aGljaCBkZWZpbmVzIGEgc2xpY2Ugb2YgYW4gaW1hZ2UgdG8gYmUgc2NhbGVkIG9yIGFuIG91dHB1dCBmb3IKICAqIGEgc2NhbGVkIHNsaWNlLgogICogQSBzbGljZSBjYW4gYWxzbyBiZSB1c2VkIGFzIGludGVybWVkaWF0ZSByaW5nIGJ1ZmZlciBmb3Igc2NhbGluZyBzdGVwcy4KICAqLwpAQCAtMTAzNiw3ICsxMDAzLDQgQEAKIC8vbnVtYmVyIG9mIGV4dHJhIGxpbmVzIHRvIHByb2Nlc3MKICNkZWZpbmUgTUFYX0xJTkVTX0FIRUFEIDQKIAotLy8gZW5hYmxlIHVzZSBvZiByZWZhY3RvcmVkIHNjYWxlciBjb2RlCi0jZGVmaW5lIE5FV19GSUxURVIKLQogI2VuZGlmIC8qIFNXU0NBTEVfU1dTQ0FMRV9JTlRFUk5BTF9IICovCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3N3c2NhbGVfdW5zY2FsZWQuYyBiL2xpYnN3c2NhbGUvc3dzY2FsZV91bnNjYWxlZC5jCmluZGV4IDc0ZjM0NjcuLjEzZjljZDggMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvc3dzY2FsZV91bnNjYWxlZC5jCisrKyBiL2xpYnN3c2NhbGUvc3dzY2FsZV91bnNjYWxlZC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXZhc3NlcnQuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvYXZjb25maWcuaCIKIAogREVDTEFSRV9BTElHTkVEKDgsIHN0YXRpYyBjb25zdCB1aW50OF90LCBkaXRoZXJzKVs4XVs4XVs4XT17CiB7CkBAIC0xMDksMjQgKzExMCw2IEBACiAgIHsgMTEyLCAxNiwxMDQsICA4LDExOCwgMjIsMTEwLCAxNCx9LAogfX07CiAKLXN0YXRpYyBjb25zdCB1aW50MTZfdCBkaXRoZXJfc2NhbGVbMTVdWzE2XT17Ci17ICAgIDIsICAgIDMsICAgIDMsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsICAgIDUsfSwKLXsgICAgMiwgICAgMywgICAgNywgICAgNywgICAxMywgICAxMywgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSwgICAyNSx9LAoteyAgICAzLCAgICAzLCAgICA0LCAgIDE1LCAgIDE1LCAgIDI5LCAgIDU3LCAgIDU3LCAgIDU3LCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLCAgMTEzLH0sCi17ICAgIDMsICAgIDQsICAgIDQsICAgIDUsICAgMzEsICAgMzEsICAgNjEsICAxMjEsICAyNDEsICAyNDEsICAyNDEsICAyNDEsICA0ODEsICA0ODEsICA0ODEsICA0ODEsfSwKLXsgICAgMywgICAgNCwgICAgNSwgICAgNSwgICAgNiwgICA2MywgICA2MywgIDEyNSwgIDI0OSwgIDQ5NywgIDk5MywgIDk5MywgIDk5MywgIDk5MywgIDk5MywgMTk4NSx9LAoteyAgICAzLCAgICA1LCAgICA2LCAgICA2LCAgICA2LCAgICA3LCAgMTI3LCAgMTI3LCAgMjUzLCAgNTA1LCAxMDA5LCAyMDE3LCA0MDMzLCA0MDMzLCA0MDMzLCA0MDMzLH0sCi17ICAgIDMsICAgIDUsICAgIDYsICAgIDcsICAgIDcsICAgIDcsICAgIDgsICAyNTUsICAyNTUsICA1MDksIDEwMTcsIDIwMzMsIDQwNjUsIDgxMjksMTYyNTcsMTYyNTcsfSwKLXsgICAgMywgICAgNSwgICAgNiwgICAgOCwgICAgOCwgICAgOCwgICAgOCwgICAgOSwgIDUxMSwgIDUxMSwgMTAyMSwgMjA0MSwgNDA4MSwgODE2MSwxNjMyMSwzMjY0MSx9LAoteyAgICAzLCAgICA1LCAgICA3LCAgICA4LCAgICA5LCAgICA5LCAgICA5LCAgICA5LCAgIDEwLCAxMDIzLCAxMDIzLCAyMDQ1LCA0MDg5LCA4MTc3LDE2MzUzLDMyNzA1LH0sCi17ICAgIDMsICAgIDUsICAgIDcsICAgIDgsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTEsIDIwNDcsIDIwNDcsIDQwOTMsIDgxODUsMTYzNjksMzI3MzcsfSwKLXsgICAgMywgICAgNSwgICAgNywgICAgOCwgICAxMCwgICAxMSwgICAxMSwgICAxMSwgICAxMSwgICAxMSwgICAxMiwgNDA5NSwgNDA5NSwgODE4OSwxNjM3NywzMjc1Myx9LAoteyAgICAzLCAgICA1LCAgICA3LCAgICA5LCAgIDEwLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEzLCA4MTkxLCA4MTkxLDE2MzgxLDMyNzYxLH0sCi17ICAgIDMsICAgIDUsICAgIDcsICAgIDksICAgMTAsICAgMTIsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTQsMTYzODMsMTYzODMsMzI3NjUsfSwKLXsgICAgMywgICAgNSwgICAgNywgICAgOSwgICAxMCwgICAxMiwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNCwgICAxNSwzMjc2NywzMjc2Nyx9LAoteyAgICAzLCAgICA1LCAgICA3LCAgICA5LCAgIDExLCAgIDEyLCAgIDE0LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE2LDY1NTM1LH0sCi19OwotCiAKIHN0YXRpYyB2b2lkIGZpbGxQbGFuZSh1aW50OF90ICpwbGFuZSwgaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeSwKICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHZhbCkKQEAgLTE5Nyw2ICsxODAsMTA4IEBACiAgICAgcmV0dXJuIHNyY1NsaWNlSDsKIH0KIAorc3RhdGljIGludCBwbGFuYXJUb1AwMXhXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyYzhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjU3RyaWRlW10sIGludCBzcmNTbGljZVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1NsaWNlSCwgdWludDhfdCAqZHN0UGFyYW04W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdFN0cmlkZVtdKQoreworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqc3JjX2Zvcm1hdCA9IGF2X3BpeF9mbXRfZGVzY19nZXQoYy0+c3JjRm9ybWF0KTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRzdF9mb3JtYXQgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGMtPmRzdEZvcm1hdCk7CisgICAgY29uc3QgdWludDE2X3QgKipzcmMgPSAoY29uc3QgdWludDE2X3QqKilzcmM4OworICAgIHVpbnQxNl90ICpkc3RZID0gKHVpbnQxNl90KikoZHN0UGFyYW04WzBdICsgZHN0U3RyaWRlWzBdICogc3JjU2xpY2VZKTsKKyAgICB1aW50MTZfdCAqZHN0VVYgPSAodWludDE2X3QqKShkc3RQYXJhbThbMV0gKyBkc3RTdHJpZGVbMV0gKiBzcmNTbGljZVkgLyAyKTsKKyAgICBpbnQgeCwgeTsKKworICAgIC8qIENhbGN1bGF0ZSBuZXQgc2hpZnQgcmVxdWlyZWQgZm9yIHZhbHVlcy4gKi8KKyAgICBjb25zdCBpbnQgc2hpZnRbM10gPSB7CisgICAgICAgIGRzdF9mb3JtYXQtPmNvbXBbMF0uZGVwdGggKyBkc3RfZm9ybWF0LT5jb21wWzBdLnNoaWZ0IC0KKyAgICAgICAgc3JjX2Zvcm1hdC0+Y29tcFswXS5kZXB0aCAtIHNyY19mb3JtYXQtPmNvbXBbMF0uc2hpZnQsCisgICAgICAgIGRzdF9mb3JtYXQtPmNvbXBbMV0uZGVwdGggKyBkc3RfZm9ybWF0LT5jb21wWzFdLnNoaWZ0IC0KKyAgICAgICAgc3JjX2Zvcm1hdC0+Y29tcFsxXS5kZXB0aCAtIHNyY19mb3JtYXQtPmNvbXBbMV0uc2hpZnQsCisgICAgICAgIGRzdF9mb3JtYXQtPmNvbXBbMl0uZGVwdGggKyBkc3RfZm9ybWF0LT5jb21wWzJdLnNoaWZ0IC0KKyAgICAgICAgc3JjX2Zvcm1hdC0+Y29tcFsyXS5kZXB0aCAtIHNyY19mb3JtYXQtPmNvbXBbMl0uc2hpZnQsCisgICAgfTsKKworICAgIGF2X2Fzc2VydDAoIShzcmNTdHJpZGVbMF0gJSAyIHx8IHNyY1N0cmlkZVsxXSAlIDIgfHwgc3JjU3RyaWRlWzJdICUgMiB8fAorICAgICAgICAgICAgICAgICBkc3RTdHJpZGVbMF0gJSAyIHx8IGRzdFN0cmlkZVsxXSAlIDIpKTsKKworICAgIGZvciAoeSA9IDA7IHkgPCBzcmNTbGljZUg7IHkrKykgeworICAgICAgICB1aW50MTZfdCAqdGRzdFkgPSBkc3RZOworICAgICAgICBjb25zdCB1aW50MTZfdCAqdHNyYzAgPSBzcmNbMF07CisgICAgICAgIGZvciAoeCA9IGMtPnNyY1c7IHggPiAwOyB4LS0pIHsKKyAgICAgICAgICAgICp0ZHN0WSsrID0gKnRzcmMwKysgPDwgc2hpZnRbMF07CisgICAgICAgIH0KKyAgICAgICAgc3JjWzBdICs9IHNyY1N0cmlkZVswXSAvIDI7CisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlWzBdIC8gMjsKKworICAgICAgICBpZiAoISh5ICYgMSkpIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICp0ZHN0VVYgPSBkc3RVVjsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICp0c3JjMSA9IHNyY1sxXTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICp0c3JjMiA9IHNyY1syXTsKKyAgICAgICAgICAgIGZvciAoeCA9IGMtPnNyY1cgLyAyOyB4ID4gMDsgeC0tKSB7CisgICAgICAgICAgICAgICAgKnRkc3RVVisrID0gKnRzcmMxKysgPDwgc2hpZnRbMV07CisgICAgICAgICAgICAgICAgKnRkc3RVVisrID0gKnRzcmMyKysgPDwgc2hpZnRbMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcmNbMV0gKz0gc3JjU3RyaWRlWzFdIC8gMjsKKyAgICAgICAgICAgIHNyY1syXSArPSBzcmNTdHJpZGVbMl0gLyAyOworICAgICAgICAgICAgZHN0VVYgKz0gZHN0U3RyaWRlWzFdIC8gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKKyNpZiBBVl9IQVZFX0JJR0VORElBTgorI2RlZmluZSBvdXRwdXRfcGl4ZWwocCwgdikgZG8geyBcCisgICAgICAgIHVpbnQxNl90ICpwcCA9IChwKTsgXAorICAgICAgICBBVl9XTDE2KHBwLCAodikpOyBcCisgICAgfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgb3V0cHV0X3BpeGVsKHAsIHYpICgqcCkgPSAodikKKyNlbmRpZgorCitzdGF0aWMgaW50IHBsYW5hcjhUb1AwMXhsZVdyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1N0cmlkZVtdLCBpbnQgc3JjU2xpY2VZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTbGljZUgsIHVpbnQ4X3QgKmRzdFBhcmFtOFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RTdHJpZGVbXSkKK3sKKyAgICB1aW50MTZfdCAqZHN0WSA9ICh1aW50MTZfdCopKGRzdFBhcmFtOFswXSArIGRzdFN0cmlkZVswXSAqIHNyY1NsaWNlWSk7CisgICAgdWludDE2X3QgKmRzdFVWID0gKHVpbnQxNl90KikoZHN0UGFyYW04WzFdICsgZHN0U3RyaWRlWzFdICogc3JjU2xpY2VZIC8gMik7CisgICAgaW50IHgsIHksIHQ7CisKKyAgICBhdl9hc3NlcnQwKCEoZHN0U3RyaWRlWzBdICUgMiB8fCBkc3RTdHJpZGVbMV0gJSAyKSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgc3JjU2xpY2VIOyB5KyspIHsKKyAgICAgICAgdWludDE2X3QgKnRkc3RZID0gZHN0WTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdHNyYzAgPSBzcmNbMF07CisgICAgICAgIGZvciAoeCA9IGMtPnNyY1c7IHggPiAwOyB4LS0pIHsKKyAgICAgICAgICAgIHQgPSAqdHNyYzArKzsKKyAgICAgICAgICAgIG91dHB1dF9waXhlbCh0ZHN0WSsrLCB0IHwgKHQgPDwgOCkpOworICAgICAgICB9CisgICAgICAgIHNyY1swXSArPSBzcmNTdHJpZGVbMF07CisgICAgICAgIGRzdFkgKz0gZHN0U3RyaWRlWzBdIC8gMjsKKworICAgICAgICBpZiAoISh5ICYgMSkpIHsKKyAgICAgICAgICAgIHVpbnQxNl90ICp0ZHN0VVYgPSBkc3RVVjsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRzcmMxID0gc3JjWzFdOworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdHNyYzIgPSBzcmNbMl07CisgICAgICAgICAgICBmb3IgKHggPSBjLT5zcmNXIC8gMjsgeCA+IDA7IHgtLSkgeworICAgICAgICAgICAgICAgIHQgPSAqdHNyYzErKzsKKyAgICAgICAgICAgICAgICBvdXRwdXRfcGl4ZWwodGRzdFVWKyssIHQgfCAodCA8PCA4KSk7CisgICAgICAgICAgICAgICAgdCA9ICp0c3JjMisrOworICAgICAgICAgICAgICAgIG91dHB1dF9waXhlbCh0ZHN0VVYrKywgdCB8ICh0IDw8IDgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNyY1sxXSArPSBzcmNTdHJpZGVbMV07CisgICAgICAgICAgICBzcmNbMl0gKz0gc3JjU3RyaWRlWzJdOworICAgICAgICAgICAgZHN0VVYgKz0gZHN0U3RyaWRlWzFdIC8gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzcmNTbGljZUg7Cit9CisKKyN1bmRlZiBvdXRwdXRfcGl4ZWwKKwogc3RhdGljIGludCBwbGFuYXJUb1l1eTJXcmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QgKnNyY1tdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNTdHJpZGVbXSwgaW50IHNyY1NsaWNlWSwgaW50IHNyY1NsaWNlSCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3RQYXJhbVtdLCBpbnQgZHN0U3RyaWRlW10pCkBAIC0zNTIsNiArNDM3LDcgQEAKICAgICAgICAgaW50IG1pbl9zdHJpZGUgICAgICAgICA9IEZGTUlOKEZGQUJTKHNyY3N0ciksIEZGQUJTKGRzdHN0cikpOwogICAgICAgICBpZighZHN0UHRyIHx8ICFzcmNQdHIpCiAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZHN0UHRyICs9IChzcmNTbGljZVkgPj4gYy0+Y2hyRHN0VlN1YlNhbXBsZSkgKiBkc3RzdHI7CiAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoc3JjU2xpY2VIID4+IGMtPmNockRzdFZTdWJTYW1wbGUpOyBpKyspIHsKICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtaW5fc3RyaWRlOyBqKyspIHsKICAgICAgICAgICAgICAgICBkc3RQdHJbal0gPSBhdl9ic3dhcDE2KHNyY1B0cltqXSk7CkBAIC01NTcsNiArNjQzLDggQEAKICAgICBpbnQgYnBjID0gZHN0X2Zvcm1hdC0+Y29tcFswXS5kZXB0aDsKICAgICBpbnQgYWxwaGEgPSBzcmNfZm9ybWF0LT5mbGFncyAmIEFWX1BJWF9GTVRfRkxBR19BTFBIQTsKICAgICBpbnQgc3dhcCA9IDA7CisgICAgaW50IGk7CisKICAgICBpZiAoIEhBVkVfQklHRU5ESUFOICYmICEoc3JjX2Zvcm1hdC0+ZmxhZ3MgJiBBVl9QSVhfRk1UX0ZMQUdfQkUpIHx8CiAgICAgICAgICFIQVZFX0JJR0VORElBTiAmJiAgIHNyY19mb3JtYXQtPmZsYWdzICYgQVZfUElYX0ZNVF9GTEFHX0JFKQogICAgICAgICBzd2FwKys7CkBAIC01NzAsMTIgKzY1OCwxOCBAQAogICAgICAgICAgICAgICAgc3JjX2Zvcm1hdC0+bmFtZSwgZHN0X2Zvcm1hdC0+bmFtZSk7CiAgICAgICAgIHJldHVybiBzcmNTbGljZUg7CiAgICAgfQorCisgICAgZm9yKGk9MDsgaTw0OyBpKyspIHsKKyAgICAgICAgZHN0MjAxM1tpXSArPSBzdHJpZGUyMDEzW2ldICogc3JjU2xpY2VZIC8gMjsKKyAgICAgICAgZHN0MTAyM1tpXSArPSBzdHJpZGUxMDIzW2ldICogc3JjU2xpY2VZIC8gMjsKKyAgICB9CisKICAgICBzd2l0Y2ggKGMtPnNyY0Zvcm1hdCkgewogICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OExFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9SR0I0OEJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9SR0JBNjRMRToKICAgICBjYXNlIEFWX1BJWF9GTVRfUkdCQTY0QkU6Ci0gICAgICAgIHBhY2tlZDE2dG9nYnJhMTYoc3JjWzBdICsgc3JjU2xpY2VZICogc3JjU3RyaWRlWzBdLCBzcmNTdHJpZGVbMF0sCisgICAgICAgIHBhY2tlZDE2dG9nYnJhMTYoc3JjWzBdLCBzcmNTdHJpZGVbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MjAxMywgc3RyaWRlMjAxMywgc3JjU2xpY2VILCBhbHBoYSwgc3dhcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAxNiAtIGJwYywgYy0+c3JjVyk7CiAgICAgICAgIGJyZWFrOwpAQCAtNTgzLDcgKzY3Nyw3IEBACiAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUjQ4QkU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0JHUkE2NExFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9CR1JBNjRCRToKLSAgICAgICAgcGFja2VkMTZ0b2dicmExNihzcmNbMF0gKyBzcmNTbGljZVkgKiBzcmNTdHJpZGVbMF0sIHNyY1N0cmlkZVswXSwKKyAgICAgICAgcGFja2VkMTZ0b2dicmExNihzcmNbMF0sIHNyY1N0cmlkZVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QxMDIzLCBzdHJpZGUxMDIzLCBzcmNTbGljZUgsIGFscGhhLCBzd2FwLAogICAgICAgICAgICAgICAgICAgICAgICAgIDE2IC0gYnBjLCBjLT5zcmNXKTsKICAgICAgICAgYnJlYWs7CkBAIC0xMDMyLDcgKzExMjYsNyBAQAogc3RhdGljIGludCBiYXllcl90b19yZ2IyNF93cmFwcGVyKFN3c0NvbnRleHQgKmMsIGNvbnN0IHVpbnQ4X3QqIHNyY1tdLCBpbnQgc3JjU3RyaWRlW10sIGludCBzcmNTbGljZVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1NsaWNlSCwgdWludDhfdCogZHN0W10sIGludCBkc3RTdHJpZGVbXSkKIHsKLSAgICB1aW50OF90ICpkc3RQdHI9IGRzdFswXTsKKyAgICB1aW50OF90ICpkc3RQdHI9IGRzdFswXSArIHNyY1NsaWNlWSAqIGRzdFN0cmlkZVswXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNQdHI9IHNyY1swXTsKICAgICBpbnQgaTsKICAgICB2b2lkICgqY29weSkgICAgICAgKGNvbnN0IHVpbnQ4X3QgKnNyYywgaW50IHNyY19zdHJpZGUsIHVpbnQ4X3QgKmRzdCwgaW50IGRzdF9zdHJpZGUsIGludCB3aWR0aCk7CkBAIC0xMDgyLDkgKzExNzYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY1NsaWNlSCwgdWludDhfdCogZHN0W10sIGludCBkc3RTdHJpZGVbXSkKIHsKICAgICBjb25zdCB1aW50OF90ICpzcmNQdHI9IHNyY1swXTsKLSAgICB1aW50OF90ICpkc3RZPSBkc3RbMF07Ci0gICAgdWludDhfdCAqZHN0VT0gZHN0WzFdOwotICAgIHVpbnQ4X3QgKmRzdFY9IGRzdFsyXTsKKyAgICB1aW50OF90ICpkc3RZPSBkc3RbMF0gKyBzcmNTbGljZVkgKiBkc3RTdHJpZGVbMF07CisgICAgdWludDhfdCAqZHN0VT0gZHN0WzFdICsgc3JjU2xpY2VZICogZHN0U3RyaWRlWzFdIC8gMjsKKyAgICB1aW50OF90ICpkc3RWPSBkc3RbMl0gKyBzcmNTbGljZVkgKiBkc3RTdHJpZGVbMl0gLyAyOwogICAgIGludCBpOwogICAgIHZvaWQgKCpjb3B5KSAgICAgICAoY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgaW50IGx1bWFfc3RyaWRlLCBpbnQgd2lkdGgsIGludDMyX3QgKnJnYjJ5dXYpOwogICAgIHZvaWQgKCppbnRlcnBvbGF0ZSkoY29uc3QgdWludDhfdCAqc3JjLCBpbnQgc3JjX3N0cmlkZSwgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwgaW50IGx1bWFfc3RyaWRlLCBpbnQgd2lkdGgsIGludDMyX3QgKnJnYjJ5dXYpOwpAQCAtMTE5Miw2ICsxMjg2LDIzIEBACiAgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSNDhMRSwgUkdCNDhCRSkKICAgICAgICAgICAgICAgfHwgQ09OVl9JUyhSR0I0OEJFLCBCR1I0OExFKQogICAgICAgICAgICAgICB8fCBDT05WX0lTKEJHUjQ4QkUsIFJHQjQ4TEUpKSBjb252ID0gcmdiNDh0b2JncjQ4X2Jzd2FwOworICAgIH0gZWxzZSBpZiAoaXNSR0I0OChzcmNGb3JtYXQpICYmIGlzUkdCQTY0KGRzdEZvcm1hdCkpIHsKKyAgICAgICAgaWYgICAgICAoQ09OVl9JUyhSR0I0OExFLCBCR1JBNjRMRSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhCR1I0OExFLCBSR0JBNjRMRSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhSR0I0OEJFLCBCR1JBNjRCRSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhCR1I0OEJFLCBSR0JBNjRCRSkpIGNvbnYgPSByZ2I0OHRvYmdyNjRfbm9ic3dhcDsKKyAgICAgICAgZWxzZSBpZiAoQ09OVl9JUyhSR0I0OExFLCBCR1JBNjRCRSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhCR1I0OExFLCBSR0JBNjRCRSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhSR0I0OEJFLCBCR1JBNjRMRSkKKyAgICAgICAgICAgICAgfHwgQ09OVl9JUyhCR1I0OEJFLCBSR0JBNjRMRSkpIGNvbnYgPSByZ2I0OHRvYmdyNjRfYnN3YXA7CisgICAgICAgIGlmICAgICAgKENPTlZfSVMoUkdCNDhMRSwgUkdCQTY0TEUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSNDhMRSwgQkdSQTY0TEUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoUkdCNDhCRSwgUkdCQTY0QkUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSNDhCRSwgQkdSQTY0QkUpKSBjb252ID0gcmdiNDh0bzY0X25vYnN3YXA7CisgICAgICAgIGVsc2UgaWYgKENPTlZfSVMoUkdCNDhMRSwgUkdCQTY0QkUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSNDhMRSwgQkdSQTY0QkUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoUkdCNDhCRSwgUkdCQTY0TEUpCisgICAgICAgICAgICAgIHx8IENPTlZfSVMoQkdSNDhCRSwgQkdSQTY0TEUpKSBjb252ID0gcmdiNDh0bzY0X2Jzd2FwOwogICAgIH0gZWxzZSBpZiAoaXNSR0JBNjQoc3JjRm9ybWF0KSAmJiBpc1JHQjQ4KGRzdEZvcm1hdCkpIHsKICAgICAgICAgaWYgICAgICAoQ09OVl9JUyhSR0JBNjRMRSwgQkdSNDhMRSkKICAgICAgICAgICAgICAgfHwgQ09OVl9JUyhCR1JBNjRMRSwgUkdCNDhMRSkKQEAgLTEzODUsMjQgKzE0OTYsNjMgQEAKIH0KIAogI2RlZmluZSBESVRIRVJfQ09QWShkc3QsIGRzdFN0cmlkZSwgc3JjLCBzcmNTdHJpZGUsIGJzd2FwLCBkYnN3YXApXAotICAgIHVpbnQxNl90IHNjYWxlPSBkaXRoZXJfc2NhbGVbZHN0X2RlcHRoLTFdW3NyY19kZXB0aC0xXTtcCi0gICAgaW50IHNoaWZ0PSBzcmNfZGVwdGgtZHN0X2RlcHRoICsgZGl0aGVyX3NjYWxlW3NyY19kZXB0aC0yXVtkc3RfZGVwdGgtMV07XAotICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1wKLSAgICAgICAgY29uc3QgdWludDhfdCAqZGl0aGVyPSBkaXRoZXJzW3NyY19kZXB0aC05XVtpJjddO1wKLSAgICAgICAgZm9yIChqID0gMDsgaiA8IGxlbmd0aC03OyBqKz04KXtcCi0gICAgICAgICAgICBkc3RbaiswXSA9IGRic3dhcCgoYnN3YXAoc3JjW2orMF0pICsgZGl0aGVyWzBdKSpzY2FsZT4+c2hpZnQpO1wKLSAgICAgICAgICAgIGRzdFtqKzFdID0gZGJzd2FwKChic3dhcChzcmNbaisxXSkgKyBkaXRoZXJbMV0pKnNjYWxlPj5zaGlmdCk7XAotICAgICAgICAgICAgZHN0W2orMl0gPSBkYnN3YXAoKGJzd2FwKHNyY1tqKzJdKSArIGRpdGhlclsyXSkqc2NhbGU+PnNoaWZ0KTtcCi0gICAgICAgICAgICBkc3RbaiszXSA9IGRic3dhcCgoYnN3YXAoc3JjW2orM10pICsgZGl0aGVyWzNdKSpzY2FsZT4+c2hpZnQpO1wKLSAgICAgICAgICAgIGRzdFtqKzRdID0gZGJzd2FwKChic3dhcChzcmNbais0XSkgKyBkaXRoZXJbNF0pKnNjYWxlPj5zaGlmdCk7XAotICAgICAgICAgICAgZHN0W2orNV0gPSBkYnN3YXAoKGJzd2FwKHNyY1tqKzVdKSArIGRpdGhlcls1XSkqc2NhbGU+PnNoaWZ0KTtcCi0gICAgICAgICAgICBkc3Rbais2XSA9IGRic3dhcCgoYnN3YXAoc3JjW2orNl0pICsgZGl0aGVyWzZdKSpzY2FsZT4+c2hpZnQpO1wKLSAgICAgICAgICAgIGRzdFtqKzddID0gZGJzd2FwKChic3dhcChzcmNbais3XSkgKyBkaXRoZXJbN10pKnNjYWxlPj5zaGlmdCk7XAorICAgIHVuc2lnbmVkIHNoaWZ0PSBzcmNfZGVwdGgtZHN0X2RlcHRoLCB0bXA7XAorICAgIGlmIChjLT5kaXRoZXIgPT0gU1dTX0RJVEhFUl9OT05FKSB7XAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoLTc7IGorPTgpIHtcCisgICAgICAgICAgICAgICAgZHN0W2orMF0gPSBkYnN3YXAoYnN3YXAoc3JjW2orMF0pPj5zaGlmdCk7XAorICAgICAgICAgICAgICAgIGRzdFtqKzFdID0gZGJzd2FwKGJzd2FwKHNyY1tqKzFdKT4+c2hpZnQpO1wKKyAgICAgICAgICAgICAgICBkc3RbaisyXSA9IGRic3dhcChic3dhcChzcmNbaisyXSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgZHN0W2orM10gPSBkYnN3YXAoYnN3YXAoc3JjW2orM10pPj5zaGlmdCk7XAorICAgICAgICAgICAgICAgIGRzdFtqKzRdID0gZGJzd2FwKGJzd2FwKHNyY1tqKzRdKT4+c2hpZnQpO1wKKyAgICAgICAgICAgICAgICBkc3Rbais1XSA9IGRic3dhcChic3dhcChzcmNbais1XSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgZHN0W2orNl0gPSBkYnN3YXAoYnN3YXAoc3JjW2orNl0pPj5zaGlmdCk7XAorICAgICAgICAgICAgICAgIGRzdFtqKzddID0gZGJzd2FwKGJzd2FwKHNyY1tqKzddKT4+c2hpZnQpO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgICAgICBmb3IgKDsgaiA8IGxlbmd0aDsgaisrKSB7XAorICAgICAgICAgICAgICAgIGRzdFtqXSA9IGRic3dhcChic3dhcChzcmNbal0pPj5zaGlmdCk7XAorICAgICAgICAgICAgfVwKKyAgICAgICAgICAgIGRzdCArPSBkc3RTdHJpZGU7XAorICAgICAgICAgICAgc3JjICs9IHNyY1N0cmlkZTtcCiAgICAgICAgIH1cCi0gICAgICAgIGZvciAoOyBqIDwgbGVuZ3RoOyBqKyspXAotICAgICAgICAgICAgZHN0W2pdID0gZGJzd2FwKChic3dhcChzcmNbal0pICsgZGl0aGVyW2omN10pKnNjYWxlPj5zaGlmdCk7XAotICAgICAgICBkc3QgKz0gZHN0U3RyaWRlO1wKLSAgICAgICAgc3JjICs9IHNyY1N0cmlkZTtcCisgICAgfSBlbHNlIGlmIChzaGlmdG9ubHkpIHtcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykge1wKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRpdGhlcj0gZGl0aGVyc1tzaGlmdC0xXVtpJjddO1wKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW5ndGgtNzsgais9OCkge1wKKyAgICAgICAgICAgICAgICB0bXAgPSAoYnN3YXAoc3JjW2orMF0pICsgZGl0aGVyWzBdKT4+c2hpZnQ7IGRzdFtqKzBdID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSAoYnN3YXAoc3JjW2orMV0pICsgZGl0aGVyWzFdKT4+c2hpZnQ7IGRzdFtqKzFdID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSAoYnN3YXAoc3JjW2orMl0pICsgZGl0aGVyWzJdKT4+c2hpZnQ7IGRzdFtqKzJdID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSAoYnN3YXAoc3JjW2orM10pICsgZGl0aGVyWzNdKT4+c2hpZnQ7IGRzdFtqKzNdID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSAoYnN3YXAoc3JjW2orNF0pICsgZGl0aGVyWzRdKT4+c2hpZnQ7IGRzdFtqKzRdID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSAoYnN3YXAoc3JjW2orNV0pICsgZGl0aGVyWzVdKT4+c2hpZnQ7IGRzdFtqKzVdID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSAoYnN3YXAoc3JjW2orNl0pICsgZGl0aGVyWzZdKT4+c2hpZnQ7IGRzdFtqKzZdID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgICAgICB0bXAgPSAoYnN3YXAoc3JjW2orN10pICsgZGl0aGVyWzddKT4+c2hpZnQ7IGRzdFtqKzddID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgICAgICBmb3IgKDsgaiA8IGxlbmd0aDsgaisrKSB7XAorICAgICAgICAgICAgICAgIHRtcCA9IChic3dhcChzcmNbal0pICsgZGl0aGVyW2omN10pPj5zaGlmdDsgZHN0W2pdID0gZGJzd2FwKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkpO1wKKyAgICAgICAgICAgIH1cCisgICAgICAgICAgICBkc3QgKz0gZHN0U3RyaWRlO1wKKyAgICAgICAgICAgIHNyYyArPSBzcmNTdHJpZGU7XAorICAgICAgICB9XAorICAgIH0gZWxzZSB7XAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHtcCisgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaXRoZXI9IGRpdGhlcnNbc2hpZnQtMV1baSY3XTtcCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbGVuZ3RoLTc7IGorPTgpIHtcCisgICAgICAgICAgICAgICAgdG1wID0gYnN3YXAoc3JjW2orMF0pOyBkc3RbaiswXSA9IGRic3dhcCgodG1wIC0gKHRtcD4+ZHN0X2RlcHRoKSArIGRpdGhlclswXSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgdG1wID0gYnN3YXAoc3JjW2orMV0pOyBkc3RbaisxXSA9IGRic3dhcCgodG1wIC0gKHRtcD4+ZHN0X2RlcHRoKSArIGRpdGhlclsxXSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgdG1wID0gYnN3YXAoc3JjW2orMl0pOyBkc3RbaisyXSA9IGRic3dhcCgodG1wIC0gKHRtcD4+ZHN0X2RlcHRoKSArIGRpdGhlclsyXSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgdG1wID0gYnN3YXAoc3JjW2orM10pOyBkc3RbaiszXSA9IGRic3dhcCgodG1wIC0gKHRtcD4+ZHN0X2RlcHRoKSArIGRpdGhlclszXSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgdG1wID0gYnN3YXAoc3JjW2orNF0pOyBkc3Rbais0XSA9IGRic3dhcCgodG1wIC0gKHRtcD4+ZHN0X2RlcHRoKSArIGRpdGhlcls0XSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgdG1wID0gYnN3YXAoc3JjW2orNV0pOyBkc3Rbais1XSA9IGRic3dhcCgodG1wIC0gKHRtcD4+ZHN0X2RlcHRoKSArIGRpdGhlcls1XSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgdG1wID0gYnN3YXAoc3JjW2orNl0pOyBkc3Rbais2XSA9IGRic3dhcCgodG1wIC0gKHRtcD4+ZHN0X2RlcHRoKSArIGRpdGhlcls2XSk+PnNoaWZ0KTtcCisgICAgICAgICAgICAgICAgdG1wID0gYnN3YXAoc3JjW2orN10pOyBkc3Rbais3XSA9IGRic3dhcCgodG1wIC0gKHRtcD4+ZHN0X2RlcHRoKSArIGRpdGhlcls3XSk+PnNoaWZ0KTtcCisgICAgICAgICAgICB9XAorICAgICAgICAgICAgZm9yICg7IGogPCBsZW5ndGg7IGorKykge1wKKyAgICAgICAgICAgICAgICB0bXAgPSBic3dhcChzcmNbal0pOyBkc3Rbal0gPSBkYnN3YXAoKHRtcCAtICh0bXA+PmRzdF9kZXB0aCkgKyBkaXRoZXJbaiY3XSk+PnNoaWZ0KTtcCisgICAgICAgICAgICB9XAorICAgICAgICAgICAgZHN0ICs9IGRzdFN0cmlkZTtcCisgICAgICAgICAgICBzcmMgKz0gc3JjU3RyaWRlO1wKKyAgICAgICAgfVwKICAgICB9CiAKIHN0YXRpYyBpbnQgcGxhbmFyQ29weVdyYXBwZXIoU3dzQ29udGV4dCAqYywgY29uc3QgdWludDhfdCAqc3JjW10sCkBAIC0xNjAwLDYgKzE3NTAsMTkgQEAKICAgICAgICAgIShmbGFncyAmIFNXU19BQ0NVUkFURV9STkQpICYmIChjLT5kaXRoZXIgPT0gU1dTX0RJVEhFUl9CQVlFUiB8fCBjLT5kaXRoZXIgPT0gU1dTX0RJVEhFUl9BVVRPKSAmJiAhKGRzdEggJiAxKSkgewogICAgICAgICBjLT5zd3NjYWxlID0gZmZfeXV2MnJnYl9nZXRfZnVuY19wdHIoYyk7CiAgICAgfQorICAgIC8qIHl1djQyMHAxeF90b19wMDF4ICovCisgICAgaWYgKChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQMTAgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWQTQyMFAxMCB8fAorICAgICAgICAgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUDEyIHx8CisgICAgICAgICBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVY0MjBQMTQgfHwKKyAgICAgICAgIHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAxNiB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUDE2KSAmJgorICAgICAgICAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUDAxMCB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9QMDE2KSkgeworICAgICAgICBjLT5zd3NjYWxlID0gcGxhbmFyVG9QMDF4V3JhcHBlcjsKKyAgICB9CisgICAgLyogeXV2NDIwcF90b19wMDF4bGUgKi8KKyAgICBpZiAoKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX1lVVjQyMFAgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWQTQyMFApICYmCisgICAgICAgIChkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9QMDEwTEUgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfUDAxNkxFKSkgeworICAgICAgICBjLT5zd3NjYWxlID0gcGxhbmFyOFRvUDAxeGxlV3JhcHBlcjsKKyAgICB9CiAKICAgICBpZiAoc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDEwUCAmJiAhKGRzdEggJiAzKSAmJgogICAgICAgICAoZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfWVVWNDIwUCB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9ZVVZBNDIwUCkgJiYKQEAgLTE2NDMsNiArMTgwNiw3IEBACiAgICAgICAgICBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTJMRSB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTJCRSB8fAogICAgICAgICAgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDE0TEUgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDE0QkUgfHwKICAgICAgICAgIGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxNkxFIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxNkJFIHx8CisgICAgICAgICBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJBUDEyTEUgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSQVAxMkJFIHx8CiAgICAgICAgICBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJBUDE2TEUgfHwgZHN0Rm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSQVAxNkJFICkpCiAgICAgICAgIGMtPnN3c2NhbGUgPSBSZ2IxNlRvUGxhbmFyUmdiMTZXcmFwcGVyOwogCkBAIC0xNjUxLDYgKzE4MTUsNyBAQAogICAgICAgICAgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDEwTEUgfHwgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSUDEwQkUgfHwKICAgICAgICAgIHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxMkxFIHx8IHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUlAxMkJFIHx8CiAgICAgICAgICBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTRMRSB8fCBzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9HQlJQMTRCRSB8fAorICAgICAgICAgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSQVAxMkxFIHx8IHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUkFQMTJCRSB8fAogICAgICAgICAgc3JjRm9ybWF0ID09IEFWX1BJWF9GTVRfR0JSQVAxNkxFIHx8IHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX0dCUkFQMTZCRSkgJiYKICAgICAgICAgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjQ4TEUgIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX1JHQjQ4QkUgIHx8CiAgICAgICAgICBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1I0OExFICB8fCBkc3RGb3JtYXQgPT0gQVZfUElYX0ZNVF9CR1I0OEJFICB8fApAQCAtMTY4NCw2ICsxODQ5LDkgQEAKICAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9CR1I1NTUpIHx8CiAgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfQkdSNTY1KSB8fAogICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0JHUkE2NCkgfHwKKyAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9HUkFZOSkgIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfR1JBWTEwKSB8fAorICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0dSQVkxMikgfHwKICAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9HUkFZMTYpIHx8CiAgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfWUExNikgICB8fAogICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0FZVVY2NCkgfHwKQEAgLTE2OTIsNiArMTg2MCw3IEBACiAgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfR0JSUDEyKSB8fAogICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX0dCUlAxNCkgfHwKICAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9HQlJQMTYpIHx8CisgICAgICAgIElTX0RJRkZFUkVOVF9FTkRJQU5FU1Moc3JjRm9ybWF0LCBkc3RGb3JtYXQsIEFWX1BJWF9GTVRfR0JSQVAxMikgfHwKICAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9HQlJBUDE2KSB8fAogICAgICAgICBJU19ESUZGRVJFTlRfRU5ESUFORVNTKHNyY0Zvcm1hdCwgZHN0Rm9ybWF0LCBBVl9QSVhfRk1UX1JHQjQ0NCkgfHwKICAgICAgICAgSVNfRElGRkVSRU5UX0VORElBTkVTUyhzcmNGb3JtYXQsIGRzdEZvcm1hdCwgQVZfUElYX0ZNVF9SR0I0OCkgIHx8CkBAIC0xNzYxLDEwICsxOTMwLDcgQEAKICAgICAgICAgKGlzUGxhbmFyWVVWKHNyY0Zvcm1hdCkgJiYgaXNQbGFuYXJZVVYoZHN0Rm9ybWF0KSAmJgogICAgICAgICAgYy0+Y2hyRHN0SFN1YlNhbXBsZSA9PSBjLT5jaHJTcmNIU3ViU2FtcGxlICYmCiAgICAgICAgICBjLT5jaHJEc3RWU3ViU2FtcGxlID09IGMtPmNoclNyY1ZTdWJTYW1wbGUgJiYKLSAgICAgICAgIGRzdEZvcm1hdCAhPSBBVl9QSVhfRk1UX05WMTIgJiYgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfTlYyMSAmJgotICAgICAgICAgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfUDAxMExFICYmIGRzdEZvcm1hdCAhPSBBVl9QSVhfRk1UX1AwMTBCRSAmJgotICAgICAgICAgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfTlYxMiAmJiBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9OVjIxICYmCi0gICAgICAgICBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9QMDEwTEUgJiYgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfUDAxMEJFKSkKKyAgICAgICAgICFpc1NlbWlQbGFuYXJZVVYoc3JjRm9ybWF0KSAmJiAhaXNTZW1pUGxhbmFyWVVWKGRzdEZvcm1hdCkpKQogICAgIHsKICAgICAgICAgaWYgKGlzUGFja2VkKGMtPnNyY0Zvcm1hdCkpCiAgICAgICAgICAgICBjLT5zd3NjYWxlID0gcGFja2VkQ29weVdyYXBwZXI7CkBAIC0xNzc2LDYgKzE5NDIsOCBAQAogICAgICAgICBmZl9nZXRfdW5zY2FsZWRfc3dzY2FsZV9wcGMoYyk7CiAgICAgIGlmIChBUkNIX0FSTSkKICAgICAgICAgIGZmX2dldF91bnNjYWxlZF9zd3NjYWxlX2FybShjKTsKKyAgICBpZiAoQVJDSF9BQVJDSDY0KQorICAgICAgICBmZl9nZXRfdW5zY2FsZWRfc3dzY2FsZV9hYXJjaDY0KGMpOwogfQogCiAvKiBDb252ZXJ0IHRoZSBwYWxldHRlIHRvIHRoZSBzYW1lIHBhY2tlZCAzMi1iaXQgZm9ybWF0IGFzIHRoZSBwYWxldHRlICovCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3Rlc3RzL2NvbG9yc3BhY2UuYyBiL2xpYnN3c2NhbGUvdGVzdHMvY29sb3JzcGFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZWRkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzd3NjYWxlL3Rlc3RzL2NvbG9yc3BhY2UuYwpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgICAgIC8qIGZvciBtZW1zZXQoKSAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3N3c2NhbGUuaCIKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3JnYjJyZ2IuaCIKKworI2RlZmluZSBTSVpFICAgIDEwMDAKKyNkZWZpbmUgc3JjQnl0ZSAweDU1CisjZGVmaW5lIGRzdEJ5dGUgMHhCQgorCisjZGVmaW5lIEZVTkMocywgZCwgbikgeyBzLCBkLCAjbiwgbiB9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKyAgICBpbnQgaSwgZnVuY051bTsKKyAgICB1aW50OF90ICpzcmNCdWZmZXIgPSBhdl9tYWxsb2MoU0laRSk7CisgICAgdWludDhfdCAqZHN0QnVmZmVyID0gYXZfbWFsbG9jKFNJWkUpOworICAgIGludCBmYWlsZWROdW0gICAgICA9IDA7CisgICAgaW50IHBhc3NlZE51bSAgICAgID0gMDsKKworICAgIGlmICghc3JjQnVmZmVyIHx8ICFkc3RCdWZmZXIpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIm1lbW9yeSBjb3JydXB0aW9uIHRlc3QgLi4uXG4iKTsKKyAgICBmZl9zd3NfcmdiMnJnYl9pbml0KCk7CisKKyAgICBmb3IgKGZ1bmNOdW0gPSAwOyA7IGZ1bmNOdW0rKykgeworICAgICAgICBzdHJ1Y3QgZnVuY19pbmZvX3MgeworICAgICAgICAgICAgaW50IHNyY19icHA7CisgICAgICAgICAgICBpbnQgZHN0X2JwcDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CisgICAgICAgICAgICB2b2lkICgqZnVuYykoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CisgICAgICAgIH0gZnVuY19pbmZvW10gPSB7CisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjEydG8xNSksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG8xNiksCisgICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE1dG8yNCksCisgICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE1dG8zMiksCisgICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE2dG8yNCksCisgICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE2dG8zMiksCisgICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG8xNSksCisgICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG8xNiksCisgICAgICAgICAgICBGVU5DKDMsIDQsIHJnYjI0dG8zMiksCisgICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG8xNSksCisgICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG8xNiksCisgICAgICAgICAgICBGVU5DKDQsIDMsIHJnYjMydG8yNCksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG8xNSksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjEydG9iZ3IxMiksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG9iZ3IxNSksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE1dG9iZ3IxNiksCisgICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE1dG9iZ3IyNCksCisgICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE1dG9iZ3IzMiksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG9iZ3IxNSksCisgICAgICAgICAgICBGVU5DKDIsIDIsIHJnYjE2dG9iZ3IxNiksCisgICAgICAgICAgICBGVU5DKDIsIDMsIHJnYjE2dG9iZ3IyNCksCisgICAgICAgICAgICBGVU5DKDIsIDQsIHJnYjE2dG9iZ3IzMiksCisgICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG9iZ3IxNSksCisgICAgICAgICAgICBGVU5DKDMsIDIsIHJnYjI0dG9iZ3IxNiksCisgICAgICAgICAgICBGVU5DKDMsIDMsIHJnYjI0dG9iZ3IyNCksCisgICAgICAgICAgICBGVU5DKDMsIDQsIHJnYjI0dG9iZ3IzMiksCisgICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG9iZ3IxNSksCisgICAgICAgICAgICBGVU5DKDQsIDIsIHJnYjMydG9iZ3IxNiksCisgICAgICAgICAgICBGVU5DKDQsIDMsIHJnYjMydG9iZ3IyNCksCisgICAgICAgICAgICBGVU5DKDQsIDQsIHNodWZmbGVfYnl0ZXNfMjEwMyksIC8qIHJnYjMydG9iZ3IzMiAqLworICAgICAgICAgICAgRlVOQyg2LCA2LCByZ2I0OHRvYmdyNDhfbm9ic3dhcCksCisgICAgICAgICAgICBGVU5DKDYsIDYsIHJnYjQ4dG9iZ3I0OF9ic3dhcCksCisgICAgICAgICAgICBGVU5DKDgsIDYsIHJnYjY0dG80OF9ub2Jzd2FwKSwKKyAgICAgICAgICAgIEZVTkMoOCwgNiwgcmdiNjR0bzQ4X2Jzd2FwKSwKKyAgICAgICAgICAgIEZVTkMoOCwgNiwgcmdiNjR0b2JncjQ4X25vYnN3YXApLAorICAgICAgICAgICAgRlVOQyg4LCA2LCByZ2I2NHRvYmdyNDhfYnN3YXApLAorICAgICAgICAgICAgRlVOQygwLCAwLCBOVUxMKQorICAgICAgICB9OworICAgICAgICBpbnQgd2lkdGg7CisgICAgICAgIGludCBmYWlsZWQgPSAwOworICAgICAgICBpbnQgc3JjQnBwID0gMDsKKyAgICAgICAgaW50IGRzdEJwcCA9IDA7CisKKyAgICAgICAgaWYgKCFmdW5jX2luZm9bZnVuY051bV0uZnVuYykKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgIi4iKTsKKyAgICAgICAgbWVtc2V0KHNyY0J1ZmZlciwgc3JjQnl0ZSwgU0laRSk7CisKKyAgICAgICAgZm9yICh3aWR0aCA9IDYzOyB3aWR0aCA+IDA7IHdpZHRoLS0pIHsKKyAgICAgICAgICAgIGludCBkc3RPZmZzZXQ7CisgICAgICAgICAgICBmb3IgKGRzdE9mZnNldCA9IDEyODsgZHN0T2Zmc2V0IDwgMTk2OyBkc3RPZmZzZXQgKz0gNCkgeworICAgICAgICAgICAgICAgIGludCBzcmNPZmZzZXQ7CisgICAgICAgICAgICAgICAgbWVtc2V0KGRzdEJ1ZmZlciwgZHN0Qnl0ZSwgU0laRSk7CisKKyAgICAgICAgICAgICAgICBmb3IgKHNyY09mZnNldCA9IDEyODsgc3JjT2Zmc2V0IDwgMTk2OyBzcmNPZmZzZXQgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmMgICAgID0gc3JjQnVmZmVyICsgc3JjT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QgICAgID0gZHN0QnVmZmVyICsgZHN0T2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBmaWxsIHRoZSBzY3JlZW4gd2l0aCBzaGl0IC4uLgorICAgICAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgc3JjQnBwID0gZnVuY19pbmZvW2Z1bmNOdW1dLnNyY19icHA7CisgICAgICAgICAgICAgICAgICAgIGRzdEJwcCA9IGZ1bmNfaW5mb1tmdW5jTnVtXS5kc3RfYnBwOworICAgICAgICAgICAgICAgICAgICBuYW1lICAgPSBmdW5jX2luZm9bZnVuY051bV0ubmFtZTsKKworICAgICAgICAgICAgICAgICAgICBmdW5jX2luZm9bZnVuY051bV0uZnVuYyhzcmMsIGRzdCwgd2lkdGggKiBzcmNCcHApOworCisgICAgICAgICAgICAgICAgICAgIGlmICghc3JjQnBwKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNJWkU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0J1ZmZlcltpXSAhPSBzcmNCeXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjIGRhbWFnZWQgYXQgJWQgdzolZCBzcmM6JWQgZHN0OiVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB3aWR0aCwgc3JjT2Zmc2V0LCBkc3RPZmZzZXQsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRzdE9mZnNldDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0QnVmZmVyW2ldICE9IGRzdEJ5dGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkc3QgZGFtYWdlZCBhdCAlZCB3OiVkIHNyYzolZCBkc3Q6JWQgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHdpZHRoLCBzcmNPZmZzZXQsIGRzdE9mZnNldCwgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBkc3RPZmZzZXQgKyB3aWR0aCAqIGRzdEJwcDsgaSA8IFNJWkU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdEJ1ZmZlcltpXSAhPSBkc3RCeXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHN0IGRhbWFnZWQgYXQgJWQgdzolZCBzcmM6JWQgZHN0OiVkICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCB3aWR0aCwgc3JjT2Zmc2V0LCBkc3RPZmZzZXQsIG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhaWxlZCkKKyAgICAgICAgICAgIGZhaWxlZE51bSsrOworICAgICAgICBlbHNlIGlmIChzcmNCcHApCisgICAgICAgICAgICBwYXNzZWROdW0rKzsKKyAgICB9CisKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0lORk8sCisgICAgICAgICAgICJcbiVkIGNvbnZlcnRlcnMgcGFzc2VkLCAlZCBjb252ZXJ0ZXJzIHJhbmRvbWx5IG92ZXJ3cm90ZSBtZW1vcnlcbiIsCisgICAgICAgICAgIHBhc3NlZE51bSwgZmFpbGVkTnVtKTsKKyAgICByZXR1cm4gZmFpbGVkTnVtOworfQpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS90ZXN0cy9waXhkZXNjX3F1ZXJ5LmMgYi9saWJzd3NjYWxlL3Rlc3RzL3BpeGRlc2NfcXVlcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTU4NWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGlic3dzY2FsZS90ZXN0cy9waXhkZXNjX3F1ZXJ5LmMKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNyBDbMOpbWVudCBCxZNzY2ggPHUgcGtoIG1lPgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGlic3dzY2FsZS9zd3NjYWxlX2ludGVybmFsLmgiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIgKmNsYXNzOworICAgIGludCAoKmNvbmQpKGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10KTsKK30gcXVlcnlfdGFiW10gPSB7CisgICAgeyJpczE2QlBTIiwgICAgIGlzMTZCUFN9LAorICAgIHsiaXNOQlBTIiwgICAgICBpc05CUFN9LAorICAgIHsiaXNCRSIsICAgICAgICBpc0JFfSwKKyAgICB7ImlzWVVWIiwgICAgICAgaXNZVVZ9LAorICAgIHsiaXNQbGFuYXJZVVYiLCBpc1BsYW5hcllVVn0sCisgICAgeyJpc1JHQiIsICAgICAgIGlzUkdCfSwKKyAgICB7IkdyYXkiLCAgICAgICAgaXNHcmF5fSwKKyAgICB7IlJHQmluSW50IiwgICAgaXNSR0JpbkludH0sCisgICAgeyJCR1JpbkludCIsICAgIGlzQkdSaW5JbnR9LAorICAgIHsiQmF5ZXIiLCAgICAgICBpc0JheWVyfSwKKyAgICB7IkFueVJHQiIsICAgICAgaXNBbnlSR0J9LAorICAgIHsiQUxQSEEiLCAgICAgICBpc0FMUEhBfSwKKyAgICB7IlBhY2tlZCIsICAgICAgaXNQYWNrZWR9LAorICAgIHsiUGxhbmFyIiwgICAgICBpc1BsYW5hcn0sCisgICAgeyJQYWNrZWRSR0IiLCAgIGlzUGFja2VkUkdCfSwKKyAgICB7IlBsYW5hclJHQiIsICAgaXNQbGFuYXJSR0J9LAorICAgIHsidXNlUGFsIiwgICAgICB1c2VQYWx9LAorfTsKKworc3RhdGljIGludCBjbXBfc3RyKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgY2hhciAqczEgPSAqKGNvbnN0IGNoYXIgKiopYTsKKyAgICBjb25zdCBjaGFyICpzMiA9ICooY29uc3QgY2hhciAqKiliOworICAgIHJldHVybiBzdHJjbXAoczEsIHMyKTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciAoaSA9IDA7IGkgPCBGRl9BUlJBWV9FTEVNUyhxdWVyeV90YWIpOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciAqKnBpeF9mbXRzID0gTlVMTDsKKyAgICAgICAgaW50IG5iX3BpeF9mbXRzID0gMDsKKyAgICAgICAgY29uc3QgQVZQaXhGbXREZXNjcmlwdG9yICpwaXhfZGVzYyA9IE5VTEw7CisKKyAgICAgICAgd2hpbGUgKChwaXhfZGVzYyA9IGF2X3BpeF9mbXRfZGVzY19uZXh0KHBpeF9kZXNjKSkpIHsKKyAgICAgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBwaXhfZm10ID0gYXZfcGl4X2ZtdF9kZXNjX2dldF9pZChwaXhfZGVzYyk7CisgICAgICAgICAgICBpZiAocXVlcnlfdGFiW2ldLmNvbmQocGl4X2ZtdCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwaXhfbmFtZSA9IHBpeF9kZXNjLT5uYW1lOworICAgICAgICAgICAgICAgIGlmICAgICAgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9SR0IzMikgICBwaXhfbmFtZSA9ICJyZ2IzMiI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX1JHQjMyXzEpIHBpeF9uYW1lID0gInJnYjMyXzEiOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBpeF9mbXQgPT0gQVZfUElYX0ZNVF9CR1IzMikgICBwaXhfbmFtZSA9ICJiZ3IzMiI7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocGl4X2ZtdCA9PSBBVl9QSVhfRk1UX0JHUjMyXzEpIHBpeF9uYW1lID0gImJncjMyXzEiOworCisgICAgICAgICAgICAgICAgYXZfZHluYXJyYXlfYWRkKCZwaXhfZm10cywgJm5iX3BpeF9mbXRzLCAodm9pZCAqKXBpeF9uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwaXhfZm10cykgeworICAgICAgICAgICAgcXNvcnQocGl4X2ZtdHMsIG5iX3BpeF9mbXRzLCBzaXplb2YoKnBpeF9mbXRzKSwgY21wX3N0cik7CisKKyAgICAgICAgICAgIHByaW50ZigiJXM6XG4iLCBxdWVyeV90YWJbaV0uY2xhc3MpOworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5iX3BpeF9mbXRzOyBqKyspCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICVzXG4iLCBwaXhfZm10c1tqXSk7CisgICAgICAgICAgICBwcmludGYoIlxuIik7CisKKyAgICAgICAgICAgIGF2X2ZyZWUocGl4X2ZtdHMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS90ZXN0cy9zd3NjYWxlLmMgYi9saWJzd3NjYWxlL3Rlc3RzL3N3c2NhbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzJjNGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGlic3dzY2FsZS90ZXN0cy9zd3NjYWxlLmMKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAxMSBNaWNoYWVsIE5pZWRlcm1heWVyIDxtaWNoYWVsbmlAZ214LmF0PgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjdW5kZWYgSEFWRV9BVl9DT05GSUdfSAorI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW1ndXRpbHMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2F2dXRpbC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jcmMuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9sZmcuaCIKKworI2luY2x1ZGUgImxpYnN3c2NhbGUvc3dzY2FsZS5oIgorCisvKiBIQUNLIER1cGxpY2F0ZWQgZnJvbSBzd3NjYWxlX2ludGVybmFsLmguCisgKiBTaG91bGQgYmUgcmVtb3ZlZCB3aGVuIGEgY2xlYW5lciBwaXhlbCBmb3JtYXQgc3lzdGVtIGV4aXN0cy4gKi8KKyNkZWZpbmUgaXNHcmF5KHgpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKHgpID09IEFWX1BJWF9GTVRfR1JBWTggICAgICAgfHwgICAgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfWUE4ICAgICAgICAgfHwgICAgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfR1JBWTE2QkUgICAgfHwgICAgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfR1JBWTE2TEUgICAgfHwgICAgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfWUExNkJFICAgICAgfHwgICAgIFwKKyAgICAgKHgpID09IEFWX1BJWF9GTVRfWUExNkxFKQorI2RlZmluZSBoYXNDaHJvbWEoeCkgICAgICAgICAgICAgICAgICAgXAorICAgICghKGlzR3JheSh4KSAgICAgICAgICAgICAgICB8fCAgICAgXAorICAgICAgICh4KSA9PSBBVl9QSVhfRk1UX01PTk9CTEFDSyB8fCAgICAgXAorICAgICAgICh4KSA9PSBBVl9QSVhfRk1UX01PTk9XSElURSkpCisjZGVmaW5lIGlzQUxQSEEoeCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCh4KSA9PSBBVl9QSVhfRk1UX0JHUjMyICAgfHwgICAgICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX0JHUjMyXzEgfHwgICAgICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX1JHQjMyICAgfHwgICAgICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX1JHQjMyXzEgfHwgICAgICAgICBcCisgICAgICh4KSA9PSBBVl9QSVhfRk1UX1lVVkE0MjBQKQorCitzdGF0aWMgdWludDY0X3QgZ2V0U1NEKGNvbnN0IHVpbnQ4X3QgKnNyYzEsIGNvbnN0IHVpbnQ4X3QgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUxLCBpbnQgc3RyaWRlMiwgaW50IHcsIGludCBoKQoreworICAgIGludCB4LCB5OworICAgIHVpbnQ2NF90IHNzZCA9IDA7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgICAgIGludCBkID0gc3JjMVt4ICsgeSAqIHN0cmlkZTFdIC0gc3JjMlt4ICsgeSAqIHN0cmlkZTJdOworICAgICAgICAgICAgc3NkICs9IGQgKiBkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzc2Q7Cit9CisKK3N0cnVjdCBSZXN1bHRzIHsKKyAgICB1aW50NjRfdCBzc2RZOworICAgIHVpbnQ2NF90IHNzZFU7CisgICAgdWludDY0X3Qgc3NkVjsKKyAgICB1aW50NjRfdCBzc2RBOworICAgIHVpbnQzMl90IGNyYzsKK307CisKKy8vIHRlc3QgYnkgcmVmIC0+IHNyYyAtPiBkc3QgLT4gb3V0ICYgY29tcGFyZSBvdXQgYWdhaW5zdCByZWYKKy8vIHJlZiAmIG91dCBhcmUgWVYxMgorc3RhdGljIGludCBkb1Rlc3QoY29uc3QgdWludDhfdCAqIGNvbnN0IHJlZls0XSwgaW50IHJlZlN0cmlkZVs0XSwgaW50IHcsIGludCBoLAorICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IHNyY0Zvcm1hdCwgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgIGludCBzcmNXLCBpbnQgc3JjSCwgaW50IGRzdFcsIGludCBkc3RILCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUmVzdWx0cyAqcikKK3sKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2NfeXV2YTQyMHAgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KEFWX1BJWF9GTVRfWVVWQTQyMFApOworICAgIGNvbnN0IEFWUGl4Rm10RGVzY3JpcHRvciAqZGVzY19zcmMgICAgICA9IGF2X3BpeF9mbXRfZGVzY19nZXQoc3JjRm9ybWF0KTsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2NfZHN0ICAgICAgPSBhdl9waXhfZm10X2Rlc2NfZ2V0KGRzdEZvcm1hdCk7CisgICAgc3RhdGljIGVudW0gQVZQaXhlbEZvcm1hdCBjdXJfc3JjRm9ybWF0OworICAgIHN0YXRpYyBpbnQgY3VyX3NyY1csIGN1cl9zcmNIOworICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpzcmNbNF07CisgICAgc3RhdGljIGludCBzcmNTdHJpZGVbNF07CisgICAgdWludDhfdCAqZHN0WzRdID0geyAwIH07CisgICAgdWludDhfdCAqb3V0WzRdID0geyAwIH07CisgICAgaW50IGRzdFN0cmlkZVs0XSA9IHswfTsKKyAgICBpbnQgaTsKKyAgICB1aW50NjRfdCBzc2RZLCBzc2RVID0gMCwgc3NkViA9IDAsIHNzZEEgPSAwOworICAgIHN0cnVjdCBTd3NDb250ZXh0ICpkc3RDb250ZXh0ID0gTlVMTCwgKm91dENvbnRleHQgPSBOVUxMOworICAgIHVpbnQzMl90IGNyYyA9IDA7CisgICAgaW50IHJlcyAgICAgID0gMDsKKworICAgIGlmIChjdXJfc3JjRm9ybWF0ICE9IHNyY0Zvcm1hdCB8fCBjdXJfc3JjVyAhPSBzcmNXIHx8IGN1cl9zcmNIICE9IHNyY0gpIHsKKyAgICAgICAgc3RydWN0IFN3c0NvbnRleHQgKnNyY0NvbnRleHQgPSBOVUxMOworICAgICAgICBpbnQgcDsKKworICAgICAgICBmb3IgKHAgPSAwOyBwIDwgNDsgcCsrKQorICAgICAgICAgICAgYXZfZnJlZXAoJnNyY1twXSk7CisKKyAgICAgICAgcmVzID0gYXZfaW1hZ2VfZmlsbF9saW5lc2l6ZXMoc3JjU3RyaWRlLCBzcmNGb3JtYXQsIHNyY1cpOworICAgICAgICBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJhdl9pbWFnZV9maWxsX2xpbmVzaXplcyBmYWlsZWRcbiIpOworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChwID0gMDsgcCA8IDQ7IHArKykgeworICAgICAgICAgICAgc3JjU3RyaWRlW3BdID0gRkZBTElHTihzcmNTdHJpZGVbcF0sIDE2KTsKKyAgICAgICAgICAgIGlmIChzcmNTdHJpZGVbcF0pCisgICAgICAgICAgICAgICAgc3JjW3BdID0gYXZfbWFsbG9jeihzcmNTdHJpZGVbcF0gKiBzcmNIICsgMTYpOworICAgICAgICAgICAgaWYgKHNyY1N0cmlkZVtwXSAmJiAhc3JjW3BdKSB7CisgICAgICAgICAgICAgICAgcGVycm9yKCJNYWxsb2MiKTsKKyAgICAgICAgICAgICAgICByZXMgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcmNDb250ZXh0ID0gc3dzX2dldENvbnRleHQodywgaCwgQVZfUElYX0ZNVF9ZVVZBNDIwUCwgc3JjVywgc3JjSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0Zvcm1hdCwgU1dTX0JJTElORUFSLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFzcmNDb250ZXh0KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgJXMgLS0tPiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVzY195dXZhNDIwcC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGVzY19zcmMtPm5hbWUpOworICAgICAgICAgICAgcmVzID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBzd3Nfc2NhbGUoc3JjQ29udGV4dCwgcmVmLCByZWZTdHJpZGUsIDAsIGgsCisgICAgICAgICAgICAgICAgICAodWludDhfdCAqIGNvbnN0ICopIHNyYywgc3JjU3RyaWRlKTsKKyAgICAgICAgc3dzX2ZyZWVDb250ZXh0KHNyY0NvbnRleHQpOworCisgICAgICAgIGN1cl9zcmNGb3JtYXQgPSBzcmNGb3JtYXQ7CisgICAgICAgIGN1cl9zcmNXICAgICAgPSBzcmNXOworICAgICAgICBjdXJfc3JjSCAgICAgID0gc3JjSDsKKyAgICB9CisKKyAgICByZXMgPSBhdl9pbWFnZV9maWxsX2xpbmVzaXplcyhkc3RTdHJpZGUsIGRzdEZvcm1hdCwgZHN0Vyk7CisgICAgaWYgKHJlcyA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJhdl9pbWFnZV9maWxsX2xpbmVzaXplcyBmYWlsZWRcbiIpOworICAgICAgICBnb3RvIGVuZDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIC8qIEltYWdlIGJ1ZmZlcnMgcGFzc2VkIGludG8gbGlic3dzY2FsZSBjYW4gYmUgYWxsb2NhdGVkIGFueSB3YXkgeW91CisgICAgICAgICAqIHByZWZlciwgYXMgbG9uZyBhcyB0aGV5J3JlIGFsaWduZWQgZW5vdWdoIGZvciB0aGUgYXJjaGl0ZWN0dXJlLCBhbmQKKyAgICAgICAgICogdGhleSdyZSBmcmVlZCBhcHByb3ByaWF0ZWx5IChzdWNoIGFzIHVzaW5nIGF2X2ZyZWUgZm9yIGJ1ZmZlcnMKKyAgICAgICAgICogYWxsb2NhdGVkIHdpdGggYXZfbWFsbG9jKS4gKi8KKyAgICAgICAgLyogQW4gZXh0cmEgMTYgYnl0ZXMgaXMgYmVpbmcgYWxsb2NhdGVkIGJlY2F1c2Ugc29tZSBzY2FsZXJzIG1heSB3cml0ZQorICAgICAgICAgKiBvdXQgb2YgYm91bmRzLiAqLworICAgICAgICBkc3RTdHJpZGVbaV0gPSBGRkFMSUdOKGRzdFN0cmlkZVtpXSwgMTYpOworICAgICAgICBpZiAoZHN0U3RyaWRlW2ldKQorICAgICAgICAgICAgZHN0W2ldID0gYXZfbWFsbG9jeihkc3RTdHJpZGVbaV0gKiBkc3RIICsgMTYpOworICAgICAgICBpZiAoZHN0U3RyaWRlW2ldICYmICFkc3RbaV0pIHsKKyAgICAgICAgICAgIHBlcnJvcigiTWFsbG9jIik7CisgICAgICAgICAgICByZXMgPSAtMTsKKworICAgICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkc3RDb250ZXh0ID0gc3dzX2dldENvbnRleHQoc3JjVywgc3JjSCwgc3JjRm9ybWF0LCBkc3RXLCBkc3RILCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIWRzdENvbnRleHQpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gZ2V0ICVzIC0tLT4gJXNcbiIsCisgICAgICAgICAgICAgICAgZGVzY19zcmMtPm5hbWUsIGRlc2NfZHN0LT5uYW1lKTsKKyAgICAgICAgcmVzID0gLTE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIHByaW50ZigiICVzICVkeCVkIC0+ICVzICUzZHglM2QgZmxhZ3M9JTJkIiwKKyAgICAgICAgICAgZGVzY19zcmMtPm5hbWUsIHNyY1csIHNyY0gsCisgICAgICAgICAgIGRlc2NfZHN0LT5uYW1lLCBkc3RXLCBkc3RILAorICAgICAgICAgICBmbGFncyk7CisgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICBzd3Nfc2NhbGUoZHN0Q29udGV4dCwgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCopc3JjLCBzcmNTdHJpZGUsIDAsIHNyY0gsIGRzdCwgZHN0U3RyaWRlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0ICYmIGRzdFN0cmlkZVtpXTsgaSsrKQorICAgICAgICBjcmMgPSBhdl9jcmMoYXZfY3JjX2dldF90YWJsZShBVl9DUkNfMzJfSUVFRSksIGNyYywgZHN0W2ldLAorICAgICAgICAgICAgICAgICAgICAgZHN0U3RyaWRlW2ldICogZHN0SCk7CisKKyAgICBpZiAociAmJiBjcmMgPT0gci0+Y3JjKSB7CisgICAgICAgIHNzZFkgPSByLT5zc2RZOworICAgICAgICBzc2RVID0gci0+c3NkVTsKKyAgICAgICAgc3NkViA9IHItPnNzZFY7CisgICAgICAgIHNzZEEgPSByLT5zc2RBOworICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIHJlZlN0cmlkZVtpXSA9IEZGQUxJR04ocmVmU3RyaWRlW2ldLCAxNik7CisgICAgICAgICAgICBpZiAocmVmU3RyaWRlW2ldKQorICAgICAgICAgICAgICAgIG91dFtpXSA9IGF2X21hbGxvY3oocmVmU3RyaWRlW2ldICogaCk7CisgICAgICAgICAgICBpZiAocmVmU3RyaWRlW2ldICYmICFvdXRbaV0pIHsKKyAgICAgICAgICAgICAgICBwZXJyb3IoIk1hbGxvYyIpOworICAgICAgICAgICAgICAgIHJlcyA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG91dENvbnRleHQgPSBzd3NfZ2V0Q29udGV4dChkc3RXLCBkc3RILCBkc3RGb3JtYXQsIHcsIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVkE0MjBQLCBTV1NfQklMSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKCFvdXRDb250ZXh0KSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgJXMgLS0tPiAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgZGVzY19kc3QtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgIGRlc2NfeXV2YTQyMHAtPm5hbWUpOworICAgICAgICAgICAgcmVzID0gLTE7CisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgfQorICAgICAgICBzd3Nfc2NhbGUob3V0Q29udGV4dCwgKGNvbnN0IHVpbnQ4X3QgKiBjb25zdCAqKSBkc3QsIGRzdFN0cmlkZSwgMCwgZHN0SCwKKyAgICAgICAgICAgICAgICAgIG91dCwgcmVmU3RyaWRlKTsKKworICAgICAgICBzc2RZID0gZ2V0U1NEKHJlZlswXSwgb3V0WzBdLCByZWZTdHJpZGVbMF0sIHJlZlN0cmlkZVswXSwgdywgaCk7CisgICAgICAgIGlmIChoYXNDaHJvbWEoc3JjRm9ybWF0KSAmJiBoYXNDaHJvbWEoZHN0Rm9ybWF0KSkgeworICAgICAgICAgICAgLy9GSVhNRSBjaGVjayB0aGF0IG91dHB1dCBpcyByZWFsbHkgZ3JheQorICAgICAgICAgICAgc3NkVSA9IGdldFNTRChyZWZbMV0sIG91dFsxXSwgcmVmU3RyaWRlWzFdLCByZWZTdHJpZGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICh3ICsgMSkgPj4gMSwgKGggKyAxKSA+PiAxKTsKKyAgICAgICAgICAgIHNzZFYgPSBnZXRTU0QocmVmWzJdLCBvdXRbMl0sIHJlZlN0cmlkZVsyXSwgcmVmU3RyaWRlWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAodyArIDEpID4+IDEsIChoICsgMSkgPj4gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzQUxQSEEoc3JjRm9ybWF0KSAmJiBpc0FMUEhBKGRzdEZvcm1hdCkpCisgICAgICAgICAgICBzc2RBID0gZ2V0U1NEKHJlZlszXSwgb3V0WzNdLCByZWZTdHJpZGVbM10sIHJlZlN0cmlkZVszXSwgdywgaCk7CisKKyAgICAgICAgc3NkWSAvPSB3ICogaDsKKyAgICAgICAgc3NkVSAvPSB3ICogaCAvIDQ7CisgICAgICAgIHNzZFYgLz0gdyAqIGggLyA0OworICAgICAgICBzc2RBIC89IHcgKiBoOworCisgICAgICAgIHN3c19mcmVlQ29udGV4dChvdXRDb250ZXh0KTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgaWYgKHJlZlN0cmlkZVtpXSkKKyAgICAgICAgICAgICAgICBhdl9mcmVlKG91dFtpXSk7CisgICAgfQorCisgICAgcHJpbnRmKCIgQ1JDPSUwOHggU1NEPSU1IlBSSWQ2NCAiLCU1IlBSSWQ2NCAiLCU1IlBSSWQ2NCAiLCU1IlBSSWQ2NCAiXG4iLAorICAgICAgICAgICBjcmMsIHNzZFksIHNzZFUsIHNzZFYsIHNzZEEpOworCitlbmQ6CisgICAgc3dzX2ZyZWVDb250ZXh0KGRzdENvbnRleHQpOworCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgaWYgKGRzdFN0cmlkZVtpXSkKKyAgICAgICAgICAgIGF2X2ZyZWUoZHN0W2ldKTsKKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIHNlbGZUZXN0KGNvbnN0IHVpbnQ4X3QgKiBjb25zdCByZWZbNF0sIGludCByZWZTdHJpZGVbNF0sCisgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsCisgICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0X2luLAorICAgICAgICAgICAgICAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdF9pbikKK3sKKyAgICBjb25zdCBpbnQgZmxhZ3NbXSA9IHsgU1dTX0ZBU1RfQklMSU5FQVIsIFNXU19CSUxJTkVBUiwgU1dTX0JJQ1VCSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNXU19YLCBTV1NfUE9JTlQsIFNXU19BUkVBLCAwIH07CisgICAgY29uc3QgaW50IHNyY1cgICA9IHc7CisgICAgY29uc3QgaW50IHNyY0ggICA9IGg7CisgICAgY29uc3QgaW50IGRzdFdbXSA9IHsgc3JjVyAtIHNyY1cgLyAzLCBzcmNXLCBzcmNXICsgc3JjVyAvIDMsIDAgfTsKKyAgICBjb25zdCBpbnQgZHN0SFtdID0geyBzcmNIIC0gc3JjSCAvIDMsIHNyY0gsIHNyY0ggKyBzcmNIIC8gMywgMCB9OworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQsIGRzdEZvcm1hdDsKKyAgICBjb25zdCBBVlBpeEZtdERlc2NyaXB0b3IgKmRlc2Nfc3JjLCAqZGVzY19kc3Q7CisKKyAgICBmb3IgKHNyY0Zvcm1hdCA9IHNyY0Zvcm1hdF9pbiAhPSBBVl9QSVhfRk1UX05PTkUgPyBzcmNGb3JtYXRfaW4gOiAwOworICAgICAgICAgc3JjRm9ybWF0IDwgQVZfUElYX0ZNVF9OQjsgc3JjRm9ybWF0KyspIHsKKyAgICAgICAgaWYgKCFzd3NfaXNTdXBwb3J0ZWRJbnB1dChzcmNGb3JtYXQpIHx8CisgICAgICAgICAgICAhc3dzX2lzU3VwcG9ydGVkT3V0cHV0KHNyY0Zvcm1hdCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBkZXNjX3NyYyA9IGF2X3BpeF9mbXRfZGVzY19nZXQoc3JjRm9ybWF0KTsKKworICAgICAgICBmb3IgKGRzdEZvcm1hdCA9IGRzdEZvcm1hdF9pbiAhPSBBVl9QSVhfRk1UX05PTkUgPyBkc3RGb3JtYXRfaW4gOiAwOworICAgICAgICAgICAgIGRzdEZvcm1hdCA8IEFWX1BJWF9GTVRfTkI7IGRzdEZvcm1hdCsrKSB7CisgICAgICAgICAgICBpbnQgaSwgaiwgazsKKyAgICAgICAgICAgIGludCByZXMgPSAwOworCisgICAgICAgICAgICBpZiAoIXN3c19pc1N1cHBvcnRlZElucHV0KGRzdEZvcm1hdCkgfHwKKyAgICAgICAgICAgICAgICAhc3dzX2lzU3VwcG9ydGVkT3V0cHV0KGRzdEZvcm1hdCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGRlc2NfZHN0ID0gYXZfcGl4X2ZtdF9kZXNjX2dldChkc3RGb3JtYXQpOworCisgICAgICAgICAgICBwcmludGYoIiVzIC0+ICVzXG4iLCBkZXNjX3NyYy0+bmFtZSwgZGVzY19kc3QtPm5hbWUpOworICAgICAgICAgICAgZmZsdXNoKHN0ZG91dCk7CisKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGZsYWdzW2tdICYmICFyZXM7IGsrKykKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBkc3RXW2ldICYmICFyZXM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgZHN0SFtqXSAmJiAhcmVzOyBqKyspCisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBkb1Rlc3QocmVmLCByZWZTdHJpZGUsIHcsIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVywgc3JjSCwgZHN0V1tpXSwgZHN0SFtqXSwgZmxhZ3Nba10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICBpZiAoZHN0Rm9ybWF0X2luICE9IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3JjRm9ybWF0X2luICE9IEFWX1BJWF9GTVRfTk9ORSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIGludCBmaWxlVGVzdChjb25zdCB1aW50OF90ICogY29uc3QgcmVmWzRdLCBpbnQgcmVmU3RyaWRlWzRdLAorICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIEZJTEUgKmZwLAorICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgc3JjRm9ybWF0X2luLAorICAgICAgICAgICAgICAgICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0X2luKQoreworICAgIGNoYXIgYnVmWzI1Nl07CisKKyAgICB3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisgICAgICAgIHN0cnVjdCBSZXN1bHRzIHI7CisgICAgICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQ7CisgICAgICAgIGNoYXIgc3JjU3RyWzEyXTsKKyAgICAgICAgaW50IHNyY1cgPSAwLCBzcmNIID0gMDsKKyAgICAgICAgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdDsKKyAgICAgICAgY2hhciBkc3RTdHJbMTJdOworICAgICAgICBpbnQgZHN0VyA9IDAsIGRzdEggPSAwOworICAgICAgICBpbnQgZmxhZ3M7CisgICAgICAgIGludCByZXQ7CisKKyAgICAgICAgcmV0ID0gc3NjYW5mKGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICIgJTEycyAlZHglZCAtPiAlMTJzICVkeCVkIGZsYWdzPSVkIENSQz0leCIKKyAgICAgICAgICAgICAgICAgICAgICIgU1NEPSUiU0NOdTY0ICIsICUiU0NOdTY0ICIsICUiU0NOdTY0ICIsICUiU0NOdTY0ICJcbiIsCisgICAgICAgICAgICAgICAgICAgICBzcmNTdHIsICZzcmNXLCAmc3JjSCwgZHN0U3RyLCAmZHN0VywgJmRzdEgsCisgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsICZyLmNyYywgJnIuc3NkWSwgJnIuc3NkVSwgJnIuc3NkViwgJnIuc3NkQSk7CisgICAgICAgIGlmIChyZXQgIT0gMTIpIHsKKyAgICAgICAgICAgIHNyY1N0clswXSA9IGRzdFN0clswXSA9IDA7CisgICAgICAgICAgICByZXQgICAgICAgPSBzc2NhbmYoYnVmLCAiJTEycyAtPiAlMTJzXG4iLCBzcmNTdHIsIGRzdFN0cik7CisgICAgICAgIH0KKworICAgICAgICBzcmNGb3JtYXQgPSBhdl9nZXRfcGl4X2ZtdChzcmNTdHIpOworICAgICAgICBkc3RGb3JtYXQgPSBhdl9nZXRfcGl4X2ZtdChkc3RTdHIpOworCisgICAgICAgIGlmIChzcmNGb3JtYXQgPT0gQVZfUElYX0ZNVF9OT05FIHx8IGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUgfHwKKyAgICAgICAgICAgIHNyY1cgPiA4MTkyVSB8fCBzcmNIID4gODE5MlUgfHwgZHN0VyA+IDgxOTJVIHx8IGRzdEggPiA4MTkyVSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxmb3JtZWQgaW5wdXQgZmlsZVxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzcmNGb3JtYXRfaW4gIT0gQVZfUElYX0ZNVF9OT05FICYmIHNyY0Zvcm1hdF9pbiAhPSBzcmNGb3JtYXQpIHx8CisgICAgICAgICAgICAoZHN0Rm9ybWF0X2luICE9IEFWX1BJWF9GTVRfTk9ORSAmJiBkc3RGb3JtYXRfaW4gIT0gZHN0Rm9ybWF0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocmV0ICE9IDEyKSB7CisgICAgICAgICAgICBwcmludGYoIiVzIiwgYnVmKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZG9UZXN0KHJlZiwgcmVmU3RyaWRlLCB3LCBoLAorICAgICAgICAgICAgICAgc3JjRm9ybWF0LCBkc3RGb3JtYXQsCisgICAgICAgICAgICAgICBzcmNXLCBzcmNILCBkc3RXLCBkc3RILCBmbGFncywKKyAgICAgICAgICAgICAgICZyKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworI2RlZmluZSBXIDk2CisjZGVmaW5lIEggOTYKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICAgIGVudW0gQVZQaXhlbEZvcm1hdCBzcmNGb3JtYXQgPSBBVl9QSVhfRk1UX05PTkU7CisgICAgZW51bSBBVlBpeGVsRm9ybWF0IGRzdEZvcm1hdCA9IEFWX1BJWF9GTVRfTk9ORTsKKyAgICB1aW50OF90ICpyZ2JfZGF0YSAgID0gYXZfbWFsbG9jKFcgKiBIICogNCk7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IHJnYl9zcmNbNF0gPSB7IHJnYl9kYXRhLCBOVUxMLCBOVUxMLCBOVUxMIH07CisgICAgaW50IHJnYl9zdHJpZGVbNF0gICA9IHsgNCAqIFcsIDAsIDAsIDAgfTsKKyAgICB1aW50OF90ICpkYXRhICAgICAgID0gYXZfbWFsbG9jKDQgKiBXICogSCk7CisgICAgY29uc3QgdWludDhfdCAqIGNvbnN0IHNyY1s0XSA9IHsgZGF0YSwgZGF0YSArIFcgKiBILCBkYXRhICsgVyAqIEggKiAyLCBkYXRhICsgVyAqIEggKiAzIH07CisgICAgaW50IHN0cmlkZVs0XSAgICAgICA9IHsgVywgVywgVywgVyB9OworICAgIGludCB4LCB5OworICAgIHN0cnVjdCBTd3NDb250ZXh0ICpzd3M7CisgICAgQVZMRkcgcmFuZDsKKyAgICBpbnQgcmVzID0gLTE7CisgICAgaW50IGk7CisgICAgRklMRSAqZnAgPSBOVUxMOworCisgICAgaWYgKCFyZ2JfZGF0YSB8fCAhZGF0YSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkgKz0gMikgeworICAgICAgICBpZiAoYXJndltpXVswXSAhPSAnLScgfHwgaSArIDEgPT0gYXJnYykKKyAgICAgICAgICAgIGdvdG8gYmFkX29wdGlvbjsKKyAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1yZWYiKSkgeworICAgICAgICAgICAgZnAgPSBmb3Blbihhcmd2W2kgKyAxXSwgInIiKTsKKyAgICAgICAgICAgIGlmICghZnApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBvcGVuICclcydcbiIsIGFyZ3ZbaSArIDFdKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1jcHVmbGFncyIpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBmbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKKyAgICAgICAgICAgIGludCByZXQgPSBhdl9wYXJzZV9jcHVfY2FwcygmZmxhZ3MsIGFyZ3ZbaSArIDFdKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJpbnZhbGlkIGNwdSBmbGFncyAlc1xuIiwgYXJndltpICsgMV0pOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdl9mb3JjZV9jcHVfZmxhZ3MoZmxhZ3MpOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1zcmMiKSkgeworICAgICAgICAgICAgc3JjRm9ybWF0ID0gYXZfZ2V0X3BpeF9mbXQoYXJndltpICsgMV0pOworICAgICAgICAgICAgaWYgKHNyY0Zvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgcGl4ZWwgZm9ybWF0ICVzXG4iLCBhcmd2W2kgKyAxXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1kc3QiKSkgeworICAgICAgICAgICAgZHN0Rm9ybWF0ID0gYXZfZ2V0X3BpeF9mbXQoYXJndltpICsgMV0pOworICAgICAgICAgICAgaWYgKGRzdEZvcm1hdCA9PSBBVl9QSVhfRk1UX05PTkUpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgcGl4ZWwgZm9ybWF0ICVzXG4iLCBhcmd2W2kgKyAxXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworYmFkX29wdGlvbjoKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiYmFkIG9wdGlvbiBvciBhcmd1bWVudCBtaXNzaW5nICglcylcbiIsIGFyZ3ZbaV0pOworICAgICAgICAgICAgZ290byBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3cyA9IHN3c19nZXRDb250ZXh0KFcgLyAxMiwgSCAvIDEyLCBBVl9QSVhfRk1UX1JHQjMyLCBXLCBILAorICAgICAgICAgICAgICAgICAgICAgICAgIEFWX1BJWF9GTVRfWVVWQTQyMFAsIFNXU19CSUxJTkVBUiwgTlVMTCwgTlVMTCwgTlVMTCk7CisKKyAgICBhdl9sZmdfaW5pdCgmcmFuZCwgMSk7CisKKyAgICBmb3IgKHkgPSAwOyB5IDwgSDsgeSsrKQorICAgICAgICBmb3IgKHggPSAwOyB4IDwgVyAqIDQ7IHgrKykKKyAgICAgICAgICAgIHJnYl9kYXRhWyB4ICsgeSAqIDQgKiBXXSA9IGF2X2xmZ19nZXQoJnJhbmQpOworICAgIHN3c19zY2FsZShzd3MsIHJnYl9zcmMsIHJnYl9zdHJpZGUsIDAsIEggLyAxMiwgKHVpbnQ4X3QgKiBjb25zdCAqKSBzcmMsIHN0cmlkZSk7CisgICAgc3dzX2ZyZWVDb250ZXh0KHN3cyk7CisgICAgYXZfZnJlZShyZ2JfZGF0YSk7CisKKyAgICBpZihmcCkgeworICAgICAgICByZXMgPSBmaWxlVGVzdChzcmMsIHN0cmlkZSwgVywgSCwgZnAsIHNyY0Zvcm1hdCwgZHN0Rm9ybWF0KTsKKyAgICAgICAgZmNsb3NlKGZwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzZWxmVGVzdChzcmMsIHN0cmlkZSwgVywgSCwgc3JjRm9ybWF0LCBkc3RGb3JtYXQpOworICAgICAgICByZXMgPSAwOworICAgIH0KK2Vycm9yOgorICAgIGF2X2ZyZWUoZGF0YSk7CisKKyAgICByZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS91dGlscy5jIGIvbGlic3dzY2FsZS91dGlscy5jCmluZGV4IGVmNDI0MWEuLjk4YTZiOTkgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvdXRpbHMuYworKysgYi9saWJzd3NjYWxlL3V0aWxzLmMKQEAgLTI3LDcgKzI3LDcgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZiBIQVZFX1NZU19NTUFOX0gKKyNpZiBIQVZFX01NQVAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2lmIGRlZmluZWQoTUFQX0FOT04pICYmICFkZWZpbmVkKE1BUF9BTk9OWU1PVVMpCiAjZGVmaW5lIE1BUF9BTk9OWU1PVVMgTUFQX0FOT04KQEAgLTQ5LDEzICs0OSwyNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9tYXRoZW1hdGljcy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9vcHQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvcGl4ZGVzYy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2NwdS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9wcGMvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9hc20uaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveDg2L2NwdS5oIgorCisvLyBXZSBoYXZlIHRvIGltcGxlbWVudCBkZXByZWNhdGVkIGZ1bmN0aW9ucyB1bnRpbCB0aGV5IGFyZSByZW1vdmVkLCB0aGlzIGlzIHRoZQorLy8gc2ltcGxlc3Qgd2F5IHRvIHByZXZlbnQgd2FybmluZ3MKKyN1bmRlZiBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorI2RlZmluZSBhdHRyaWJ1dGVfZGVwcmVjYXRlZAorCiAjaW5jbHVkZSAicmdiMnJnYi5oIgogI2luY2x1ZGUgInN3c2NhbGUuaCIKICNpbmNsdWRlICJzd3NjYWxlX2ludGVybmFsLmgiCiAKKyNpZiAhRkZfQVBJX1NXU19WRUNUT1IKK3N0YXRpYyBTd3NWZWN0b3IgKnN3c19nZXRJZGVudGl0eVZlYyh2b2lkKTsKK3N0YXRpYyB2b2lkIHN3c19hZGRWZWMoU3dzVmVjdG9yICphLCBTd3NWZWN0b3IgKmIpOworc3RhdGljIHZvaWQgc3dzX3NoaWZ0VmVjKFN3c1ZlY3RvciAqYSwgaW50IHNoaWZ0KTsKK3N0YXRpYyB2b2lkIHN3c19wcmludFZlYzIoU3dzVmVjdG9yICphLCBBVkNsYXNzICpsb2dfY3R4LCBpbnQgbG9nX2xldmVsKTsKKyNlbmRpZgorCiBzdGF0aWMgdm9pZCBoYW5kbGVfZm9ybWF0cyhTd3NDb250ZXh0ICpjKTsKIAogdW5zaWduZWQgc3dzY2FsZV92ZXJzaW9uKHZvaWQpCkBAIC0xMTcsNiArMTMxLDEyIEBACiAgICAgW0FWX1BJWF9GTVRfUkdCMF0gICAgICAgID0geyAxLCAxIH0sCiAgICAgW0FWX1BJWF9GTVRfMEJHUl0gICAgICAgID0geyAxLCAxIH0sCiAgICAgW0FWX1BJWF9GTVRfQkdSMF0gICAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTlCRV0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTlMRV0gICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTEwQkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTEwTEVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTEyQkVdICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfR1JBWTEyTEVdICAgID0geyAxLCAxIH0sCiAgICAgW0FWX1BJWF9GTVRfR1JBWTE2QkVdICAgID0geyAxLCAxIH0sCiAgICAgW0FWX1BJWF9GTVRfR1JBWTE2TEVdICAgID0geyAxLCAxIH0sCiAgICAgW0FWX1BJWF9GTVRfWVVWNDQwUF0gICAgID0geyAxLCAxIH0sCkBAIC0yMDQsMTUgKzIyNCwxOSBAQAogICAgIFtBVl9QSVhfRk1UX0dCUlA5QkVdICAgICA9IHsgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0dCUlAxMExFXSAgICA9IHsgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0dCUlAxMEJFXSAgICA9IHsgMSwgMSB9LAorICAgIFtBVl9QSVhfRk1UX0dCUkFQMTBMRV0gICA9IHsgMSwgMSB9LAorICAgIFtBVl9QSVhfRk1UX0dCUkFQMTBCRV0gICA9IHsgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0dCUlAxMkxFXSAgICA9IHsgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0dCUlAxMkJFXSAgICA9IHsgMSwgMSB9LAorICAgIFtBVl9QSVhfRk1UX0dCUkFQMTJMRV0gICA9IHsgMSwgMSB9LAorICAgIFtBVl9QSVhfRk1UX0dCUkFQMTJCRV0gICA9IHsgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0dCUlAxNExFXSAgICA9IHsgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0dCUlAxNEJFXSAgICA9IHsgMSwgMSB9LAotICAgIFtBVl9QSVhfRk1UX0dCUlAxNkxFXSAgICA9IHsgMSwgMCB9LAotICAgIFtBVl9QSVhfRk1UX0dCUlAxNkJFXSAgICA9IHsgMSwgMCB9LAorICAgIFtBVl9QSVhfRk1UX0dCUlAxNkxFXSAgICA9IHsgMSwgMSB9LAorICAgIFtBVl9QSVhfRk1UX0dCUlAxNkJFXSAgICA9IHsgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0dCUkFQXSAgICAgICA9IHsgMSwgMSB9LAotICAgIFtBVl9QSVhfRk1UX0dCUkFQMTZMRV0gICA9IHsgMSwgMCB9LAotICAgIFtBVl9QSVhfRk1UX0dCUkFQMTZCRV0gICA9IHsgMSwgMCB9LAorICAgIFtBVl9QSVhfRk1UX0dCUkFQMTZMRV0gICA9IHsgMSwgMSB9LAorICAgIFtBVl9QSVhfRk1UX0dCUkFQMTZCRV0gICA9IHsgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0JBWUVSX0JHR1I4XSA9IHsgMSwgMCB9LAogICAgIFtBVl9QSVhfRk1UX0JBWUVSX1JHR0I4XSA9IHsgMSwgMCB9LAogICAgIFtBVl9QSVhfRk1UX0JBWUVSX0dCUkc4XSA9IHsgMSwgMCB9LApAQCAtMjI4LDggKzI1MiwxMCBAQAogICAgIFtBVl9QSVhfRk1UX1hZWjEyQkVdICAgICA9IHsgMSwgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX1hZWjEyTEVdICAgICA9IHsgMSwgMSwgMSB9LAogICAgIFtBVl9QSVhfRk1UX0FZVVY2NExFXSAgICA9IHsgMSwgMX0sCi0gICAgW0FWX1BJWF9GTVRfUDAxMExFXSAgICAgID0geyAxLCAwIH0sCi0gICAgW0FWX1BJWF9GTVRfUDAxMEJFXSAgICAgID0geyAxLCAwIH0sCisgICAgW0FWX1BJWF9GTVRfUDAxMExFXSAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUDAxMEJFXSAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUDAxNkxFXSAgICAgID0geyAxLCAxIH0sCisgICAgW0FWX1BJWF9GTVRfUDAxNkJFXSAgICAgID0geyAxLCAxIH0sCiB9OwogCiBpbnQgc3dzX2lzU3VwcG9ydGVkSW5wdXQoZW51bSBBVlBpeGVsRm9ybWF0IHBpeF9mbXQpCkBAIC00MjIsMTUgKzQ0OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4ICogQiArIDI0ICogQykgKiAoMSA8PCAzMCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29lZmYgLz0gKDFMTDw8NTQpL2ZvbmU7Ci0gICAgICAgICAgICAgICAgfQotI2lmIDAKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChmbGFncyAmIFNXU19YKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwICA9IHBhcmFtID8gcGFyYW0gKiAwLjAxIDogMC4zOwotICAgICAgICAgICAgICAgICAgICBjb2VmZiAgICAgPSBkID8gc2luKGQgKiBNX1BJKSAvIChkICogTV9QSSkgOiAxLjA7Ci0gICAgICAgICAgICAgICAgICAgIGNvZWZmICAgICo9IHBvdygyLjAsIC1wICogZCAqIGQpOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZsYWdzICYgU1dTX1gpIHsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZsYWdzICYgU1dTX1gpIHsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIEEgPSBwYXJhbVswXSAhPSBTV1NfUEFSQU1fREVGQVVMVCA/IHBhcmFtWzBdIDogMS4wOwogICAgICAgICAgICAgICAgICAgICBkb3VibGUgYzsKIApAQCAtMTAwMCw2ICsxMDE4LDEyIEBACiAgICAgICAgIHJldHVybiAxOwogICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZODoKICAgICBjYXNlIEFWX1BJWF9GTVRfWUE4OgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZOUxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZOUJFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTBMRToKKyAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTEwQkU6CisgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxMkxFOgorICAgIGNhc2UgQVZfUElYX0ZNVF9HUkFZMTJCRToKICAgICBjYXNlIEFWX1BJWF9GTVRfR1JBWTE2TEU6CiAgICAgY2FzZSBBVl9QSVhfRk1UX0dSQVkxNkJFOgogICAgIGNhc2UgQVZfUElYX0ZNVF9ZQTE2QkU6CkBAIC0xMDgzLDYgKzExMDcsMTIgQEAKIAogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDogICAgICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX0dCUlA7CiAKKyAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxMExFOiAgICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9HQlJQMTA7CisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTBCRTogICAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfR0JSUDEwOworCisgICAgY2FzZSBBVl9QSVhfRk1UX0dCUkFQMTJMRTogICAgICAgICAgcmV0dXJuIEFWX1BJWF9GTVRfR0JSUDEyOworICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDEyQkU6ICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX0dCUlAxMjsKKwogICAgIGNhc2UgQVZfUElYX0ZNVF9HQlJBUDE2TEU6ICAgICAgICAgIHJldHVybiBBVl9QSVhfRk1UX0dCUlAxNjsKICAgICBjYXNlIEFWX1BJWF9GTVRfR0JSQVAxNkJFOiAgICAgICAgICByZXR1cm4gQVZfUElYX0ZNVF9HQlJQMTY7CiAKQEAgLTExMjMsNyArMTE1Myw3IEBACiBhdl9jb2xkIGludCBzd3NfaW5pdF9jb250ZXh0KFN3c0NvbnRleHQgKmMsIFN3c0ZpbHRlciAqc3JjRmlsdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd3NGaWx0ZXIgKmRzdEZpbHRlcikKIHsKLSAgICBpbnQgaSwgajsKKyAgICBpbnQgaTsKICAgICBpbnQgdXNlc1ZGaWx0ZXIsIHVzZXNIRmlsdGVyOwogICAgIGludCB1bnNjYWxlZDsKICAgICBTd3NGaWx0ZXIgZHVtbXlGaWx0ZXIgPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfTsKQEAgLTEzNTEsOSArMTM4MSwxMiBAQAogICAgICAgICBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9SR0I0X0JZVEUgJiYgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfQkdSNF9CWVRFICYmCiAgICAgICAgIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUlA5QkUgICAmJiBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9HQlJQOUxFICAmJgogICAgICAgICBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9HQlJQMTBCRSAgJiYgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSUDEwTEUgJiYKKyAgICAgICAgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSQVAxMEJFICYmIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUkFQMTBMRSAmJgogICAgICAgICBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9HQlJQMTJCRSAgJiYgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSUDEyTEUgJiYKKyAgICAgICAgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSQVAxMkJFICYmIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUkFQMTJMRSAmJgogICAgICAgICBzcmNGb3JtYXQgIT0gQVZfUElYX0ZNVF9HQlJQMTRCRSAgJiYgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSUDE0TEUgJiYKICAgICAgICAgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSUDE2QkUgICYmIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUlAxNkxFICYmCisgICAgICAgIHNyY0Zvcm1hdCAhPSBBVl9QSVhfRk1UX0dCUkFQMTZCRSAgJiYgc3JjRm9ybWF0ICE9IEFWX1BJWF9GTVRfR0JSQVAxNkxFICYmCiAgICAgICAgICgoZHN0VyA+PiBjLT5jaHJEc3RIU3ViU2FtcGxlKSA8PSAoc3JjVyA+PiAxKSB8fAogICAgICAgICAgKGZsYWdzICYgU1dTX0ZBU1RfQklMSU5FQVIpKSkKICAgICAgICAgYy0+Y2hyU3JjSFN1YlNhbXBsZSA9IDE7CkBAIC0xNTQxLDcgKzE1NzQsMTEgQEAKICAgICAgICAgfQogICAgIH0KIAotI2RlZmluZSBVU0VfTU1BUCAoSEFWRV9NTUFQICYmIEhBVkVfTVBST1RFQ1QgJiYgZGVmaW5lZCBNQVBfQU5PTllNT1VTKQorI2lmIEhBVkVfTU1BUCAmJiBIQVZFX01QUk9URUNUICYmIGRlZmluZWQoTUFQX0FOT05ZTU9VUykKKyNkZWZpbmUgVVNFX01NQVAgMQorI2Vsc2UKKyNkZWZpbmUgVVNFX01NQVAgMAorI2VuZGlmCiAKICAgICAvKiBwcmVjYWxjdWxhdGUgaG9yaXpvbnRhbCBzY2FsZXIgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogICAgIHsKQEAgLTE2MDcsNyArMTY0NCw4IEBACiAjZW5kaWYgLyogSEFWRV9NTVhFWFRfSU5MSU5FICovCiAgICAgICAgIHsKICAgICAgICAgICAgIGNvbnN0IGludCBmaWx0ZXJBbGlnbiA9IFg4Nl9NTVgoY3B1X2ZsYWdzKSAgICAgPyA0IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19BTFRJVkVDKGNwdV9mbGFncykgPyA4IDogMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19BTFRJVkVDKGNwdV9mbGFncykgPyA4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVfbmVvbihjcHVfZmxhZ3MpICAgPyA4IDogMTsKIAogICAgICAgICAgICAgaWYgKChyZXQgPSBpbml0RmlsdGVyKCZjLT5oTHVtRmlsdGVyLCAmYy0+aEx1bUZpbHRlclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjLT5oTHVtRmlsdGVyU2l6ZSwgYy0+bHVtWEluYywKQEAgLTE2MzMsNyArMTY3MSw4IEBACiAgICAgLyogcHJlY2FsY3VsYXRlIHZlcnRpY2FsIHNjYWxlciBmaWx0ZXIgY29lZmZpY2llbnRzICovCiAgICAgewogICAgICAgICBjb25zdCBpbnQgZmlsdGVyQWxpZ24gPSBYODZfTU1YKGNwdV9mbGFncykgICAgID8gMiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQQ19BTFRJVkVDKGNwdV9mbGFncykgPyA4IDogMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFBDX0FMVElWRUMoY3B1X2ZsYWdzKSA/IDggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX25lb24oY3B1X2ZsYWdzKSAgID8gMiA6IDE7CiAKICAgICAgICAgaWYgKChyZXQgPSBpbml0RmlsdGVyKCZjLT52THVtRmlsdGVyLCAmYy0+dkx1bUZpbHRlclBvcywgJmMtPnZMdW1GaWx0ZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgICBjLT5sdW1ZSW5jLCBzcmNILCBkc3RILCBmaWx0ZXJBbGlnbiwgKDEgPDwgMTIpLApAQCAtMTY3NCw2OSArMTcxMywxNCBAQAogI2VuZGlmCiAgICAgfQogCi0gICAgLy8gY2FsY3VsYXRlIGJ1ZmZlciBzaXplcyBzbyB0aGF0IHRoZXkgd29uJ3QgcnVuIG91dCB3aGlsZSBoYW5kbGluZyB0aGVzZSBkYW1uIHNsaWNlcwotICAgIGMtPnZMdW1CdWZTaXplID0gYy0+dkx1bUZpbHRlclNpemU7Ci0gICAgYy0+dkNockJ1ZlNpemUgPSBjLT52Q2hyRmlsdGVyU2l6ZTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgZHN0SDsgaSsrKSB7Ci0gICAgICAgIGludCBjaHJJICAgICAgPSAoaW50NjRfdClpICogYy0+Y2hyRHN0SCAvIGRzdEg7Ci0gICAgICAgIGludCBuZXh0U2xpY2UgPSBGRk1BWChjLT52THVtRmlsdGVyUG9zW2ldICsgYy0+dkx1bUZpbHRlclNpemUgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjLT52Q2hyRmlsdGVyUG9zW2NockldICsgYy0+dkNockZpbHRlclNpemUgLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGMtPmNoclNyY1ZTdWJTYW1wbGUpKTsKLQotICAgICAgICBuZXh0U2xpY2UgPj49IGMtPmNoclNyY1ZTdWJTYW1wbGU7Ci0gICAgICAgIG5leHRTbGljZSA8PD0gYy0+Y2hyU3JjVlN1YlNhbXBsZTsKLSAgICAgICAgaWYgKGMtPnZMdW1GaWx0ZXJQb3NbaV0gKyBjLT52THVtQnVmU2l6ZSA8IG5leHRTbGljZSkKLSAgICAgICAgICAgIGMtPnZMdW1CdWZTaXplID0gbmV4dFNsaWNlIC0gYy0+dkx1bUZpbHRlclBvc1tpXTsKLSAgICAgICAgaWYgKGMtPnZDaHJGaWx0ZXJQb3NbY2hySV0gKyBjLT52Q2hyQnVmU2l6ZSA8Ci0gICAgICAgICAgICAobmV4dFNsaWNlID4+IGMtPmNoclNyY1ZTdWJTYW1wbGUpKQotICAgICAgICAgICAgYy0+dkNockJ1ZlNpemUgPSAobmV4dFNsaWNlID4+IGMtPmNoclNyY1ZTdWJTYW1wbGUpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+dkNockZpbHRlclBvc1tjaHJJXTsKLSAgICB9Ci0KICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhjLCBjLT5kaXRoZXJfZXJyb3JbaV0sIChjLT5kc3RXKzIpICogc2l6ZW9mKGludCksIGZhaWwpOwogCi0gICAgLyogQWxsb2NhdGUgcGl4YnVmcyAod2UgdXNlIGR5bmFtaWMgYWxsb2NhdGlvbiBiZWNhdXNlIG90aGVyd2lzZSB3ZSB3b3VsZAotICAgICAqIG5lZWQgdG8gYWxsb2NhdGUgc2V2ZXJhbCBtZWdhYnl0ZXMgdG8gaGFuZGxlIGFsbCBwb3NzaWJsZSBjYXNlcykgKi8KLSAgICBGRl9BTExPQ1pfT1JfR09UTyhjLCBjLT5sdW1QaXhCdWYsICBjLT52THVtQnVmU2l6ZSAqIDMgKiBzaXplb2YoaW50MTZfdCAqKSwgZmFpbCk7Ci0gICAgRkZfQUxMT0NaX09SX0dPVE8oYywgYy0+Y2hyVVBpeEJ1ZiwgYy0+dkNockJ1ZlNpemUgKiAzICogc2l6ZW9mKGludDE2X3QgKiksIGZhaWwpOwotICAgIEZGX0FMTE9DWl9PUl9HT1RPKGMsIGMtPmNoclZQaXhCdWYsIGMtPnZDaHJCdWZTaXplICogMyAqIHNpemVvZihpbnQxNl90ICopLCBmYWlsKTsKLSAgICBpZiAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgaXNBTFBIQShjLT5zcmNGb3JtYXQpICYmIGlzQUxQSEEoYy0+ZHN0Rm9ybWF0KSkKLSAgICAgICAgRkZfQUxMT0NaX09SX0dPVE8oYywgYy0+YWxwUGl4QnVmLCBjLT52THVtQnVmU2l6ZSAqIDMgKiBzaXplb2YoaW50MTZfdCAqKSwgZmFpbCk7Ci0gICAgLyogTm90ZSB3ZSBuZWVkIGF0IGxlYXN0IG9uZSBwaXhlbCBtb3JlIGF0IHRoZSBlbmQgYmVjYXVzZSBvZiB0aGUgTU1YIGNvZGUKLSAgICAgKiAoanVzdCBpbiBjYXNlIHNvbWVvbmUgd2FudHMgdG8gcmVwbGFjZSB0aGUgNDAwMC84MDAwKS4gKi8KLSAgICAvKiBhbGlnbiBhdCAxNiBieXRlcyBmb3IgQWx0aVZlYyAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBjLT52THVtQnVmU2l6ZTsgaSsrKSB7Ci0gICAgICAgIEZGX0FMTE9DWl9PUl9HT1RPKGMsIGMtPmx1bVBpeEJ1ZltpICsgYy0+dkx1bUJ1ZlNpemVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RyaWRlICsgMTYsIGZhaWwpOwotICAgICAgICBjLT5sdW1QaXhCdWZbaV0gPSBjLT5sdW1QaXhCdWZbaSArIGMtPnZMdW1CdWZTaXplXTsKLSAgICB9CisgICAgYy0+bmVlZEFscGhhID0gKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGlzQUxQSEEoYy0+c3JjRm9ybWF0KSAmJiBpc0FMUEhBKGMtPmRzdEZvcm1hdCkpID8gMSA6IDA7CisKICAgICAvLyA2NCAvIGMtPnNjYWxpbmdCcHAgaXMgdGhlIHNhbWUgYXMgMTYgLyBzaXplb2Yoc2NhbGluZ19pbnRlcm1lZGlhdGUpCiAgICAgYy0+dXZfb2ZmICAgPSAoZHN0X3N0cmlkZT4+MSkgKyA2NCAvIChjLT5kc3RCcGMgJn4gNyk7CiAgICAgYy0+dXZfb2ZmeDIgPSBkc3Rfc3RyaWRlICsgMTY7Ci0gICAgZm9yIChpID0gMDsgaSA8IGMtPnZDaHJCdWZTaXplOyBpKyspIHsKLSAgICAgICAgRkZfQUxMT0NfT1JfR09UTyhjLCBjLT5jaHJVUGl4QnVmW2kgKyBjLT52Q2hyQnVmU2l6ZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0cmlkZSAqIDIgKyAzMiwgZmFpbCk7Ci0gICAgICAgIGMtPmNoclVQaXhCdWZbaV0gPSBjLT5jaHJVUGl4QnVmW2kgKyBjLT52Q2hyQnVmU2l6ZV07Ci0gICAgICAgIGMtPmNoclZQaXhCdWZbaV0gPSBjLT5jaHJWUGl4QnVmW2kgKyBjLT52Q2hyQnVmU2l6ZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICA9IGMtPmNoclVQaXhCdWZbaV0gKyAoZHN0X3N0cmlkZSA+PiAxKSArIDg7Ci0gICAgfQotICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5hbHBQaXhCdWYpCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT52THVtQnVmU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBGRl9BTExPQ1pfT1JfR09UTyhjLCBjLT5hbHBQaXhCdWZbaSArIGMtPnZMdW1CdWZTaXplXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdHJpZGUgKyAxNiwgZmFpbCk7Ci0gICAgICAgICAgICBjLT5hbHBQaXhCdWZbaV0gPSBjLT5hbHBQaXhCdWZbaSArIGMtPnZMdW1CdWZTaXplXTsKLSAgICAgICAgfQotCi0gICAgLy8gdHJ5IHRvIGF2b2lkIGRyYXdpbmcgZ3JlZW4gc3R1ZmYgYmV0d2VlbiB0aGUgcmlnaHQgZW5kIGFuZCB0aGUgc3RyaWRlIGVuZAotICAgIGZvciAoaSA9IDA7IGkgPCBjLT52Q2hyQnVmU2l6ZTsgaSsrKQotICAgICAgICBpZihkZXNjX2RzdC0+Y29tcFswXS5kZXB0aCA9PSAxNil7Ci0gICAgICAgICAgICBhdl9hc3NlcnQwKGMtPmRzdEJwYyA+IDE0KTsKLSAgICAgICAgICAgIGZvcihqPTA7IGo8ZHN0X3N0cmlkZS8yKzE7IGorKykKLSAgICAgICAgICAgICAgICAoKGludDMyX3QqKShjLT5jaHJVUGl4QnVmW2ldKSlbal0gPSAxPDwxODsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBmb3Ioaj0wOyBqPGRzdF9zdHJpZGUrMTsgaisrKQotICAgICAgICAgICAgICAgICgoaW50MTZfdCopKGMtPmNoclVQaXhCdWZbaV0pKVtqXSA9IDE8PDE0OwogCiAgICAgYXZfYXNzZXJ0MChjLT5jaHJEc3RIIDw9IGRzdEgpOwogCkBAIC0yMDQwLDYgKzIwMjQsMTMgQEAKICAgICByZXR1cm4gdmVjOwogfQogCisvKioKKyAqIEFsbG9jYXRlIGFuZCByZXR1cm4gYSB2ZWN0b3Igd2l0aCBsZW5ndGggY29lZmZpY2llbnRzLCBhbGwKKyAqIHdpdGggdGhlIHNhbWUgdmFsdWUgYy4KKyAqLworI2lmICFGRl9BUElfU1dTX1ZFQ1RPUgorc3RhdGljCisjZW5kaWYKIFN3c1ZlY3RvciAqc3dzX2dldENvbnN0VmVjKGRvdWJsZSBjLCBpbnQgbGVuZ3RoKQogewogICAgIGludCBpOwpAQCAtMjA1NCw2ICsyMDQ1LDEzIEBACiAgICAgcmV0dXJuIHZlYzsKIH0KIAorLyoqCisgKiBBbGxvY2F0ZSBhbmQgcmV0dXJuIGEgdmVjdG9yIHdpdGgganVzdCBvbmUgY29lZmZpY2llbnQsIHdpdGgKKyAqIHZhbHVlIDEuMC4KKyAqLworI2lmICFGRl9BUElfU1dTX1ZFQ1RPUgorc3RhdGljCisjZW5kaWYKIFN3c1ZlY3RvciAqc3dzX2dldElkZW50aXR5VmVjKHZvaWQpCiB7CiAgICAgcmV0dXJuIHN3c19nZXRDb25zdFZlYygxLjAsIDEpOwpAQCAtMjA4Myw2ICsyMDgxLDcgQEAKICAgICBzd3Nfc2NhbGVWZWMoYSwgaGVpZ2h0IC8gc3dzX2RjVmVjKGEpKTsKIH0KIAorI2lmIEZGX0FQSV9TV1NfVkVDVE9SCiBzdGF0aWMgU3dzVmVjdG9yICpzd3NfZ2V0Q29udlZlYyhTd3NWZWN0b3IgKmEsIFN3c1ZlY3RvciAqYikKIHsKICAgICBpbnQgbGVuZ3RoID0gYS0+bGVuZ3RoICsgYi0+bGVuZ3RoIC0gMTsKQEAgLTIxMDAsNiArMjA5OSw3IEBACiAKICAgICByZXR1cm4gdmVjOwogfQorI2VuZGlmCiAKIHN0YXRpYyBTd3NWZWN0b3IgKnN3c19zdW1WZWMoU3dzVmVjdG9yICphLCBTd3NWZWN0b3IgKmIpCiB7CkBAIC0yMTE4LDYgKzIxMTgsNyBAQAogICAgIHJldHVybiB2ZWM7CiB9CiAKKyNpZiBGRl9BUElfU1dTX1ZFQ1RPUgogc3RhdGljIFN3c1ZlY3RvciAqc3dzX2RpZmZWZWMoU3dzVmVjdG9yICphLCBTd3NWZWN0b3IgKmIpCiB7CiAgICAgaW50IGxlbmd0aCA9IEZGTUFYKGEtPmxlbmd0aCwgYi0+bGVuZ3RoKTsKQEAgLTIxMzQsNiArMjEzNSw3IEBACiAKICAgICByZXR1cm4gdmVjOwogfQorI2VuZGlmCiAKIC8qIHNoaWZ0IGxlZnQgLyBvciByaWdodCBpZiAic2hpZnQiIGlzIG5lZ2F0aXZlICovCiBzdGF0aWMgU3dzVmVjdG9yICpzd3NfZ2V0U2hpZnRlZFZlYyhTd3NWZWN0b3IgKmEsIGludCBzaGlmdCkKQEAgLTIxNTMsNiArMjE1NSw5IEBACiAgICAgcmV0dXJuIHZlYzsKIH0KIAorI2lmICFGRl9BUElfU1dTX1ZFQ1RPUgorc3RhdGljCisjZW5kaWYKIHZvaWQgc3dzX3NoaWZ0VmVjKFN3c1ZlY3RvciAqYSwgaW50IHNoaWZ0KQogewogICAgIFN3c1ZlY3RvciAqc2hpZnRlZCA9IHN3c19nZXRTaGlmdGVkVmVjKGEsIHNoaWZ0KTsKQEAgLTIxNjYsNiArMjE3MSw5IEBACiAgICAgYXZfZnJlZShzaGlmdGVkKTsKIH0KIAorI2lmICFGRl9BUElfU1dTX1ZFQ1RPUgorc3RhdGljCisjZW5kaWYKIHZvaWQgc3dzX2FkZFZlYyhTd3NWZWN0b3IgKmEsIFN3c1ZlY3RvciAqYikKIHsKICAgICBTd3NWZWN0b3IgKnN1bSA9IHN3c19zdW1WZWMoYSwgYik7CkBAIC0yMTc5LDYgKzIxODcsNyBAQAogICAgIGF2X2ZyZWUoc3VtKTsKIH0KIAorI2lmIEZGX0FQSV9TV1NfVkVDVE9SCiB2b2lkIHN3c19zdWJWZWMoU3dzVmVjdG9yICphLCBTd3NWZWN0b3IgKmIpCiB7CiAgICAgU3dzVmVjdG9yICpkaWZmID0gc3dzX2RpZmZWZWMoYSwgYik7CkBAIC0yMjE2LDcgKzIyMjUsMTUgQEAKIAogICAgIHJldHVybiB2ZWM7CiB9CisjZW5kaWYKIAorLyoqCisgKiBQcmludCB3aXRoIGF2X2xvZygpIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yIGEKKyAqIGlmIGxvZ19sZXZlbCA8PSBhdl9sb2dfbGV2ZWwuCisgKi8KKyNpZiAhRkZfQVBJX1NXU19WRUNUT1IKK3N0YXRpYworI2VuZGlmCiB2b2lkIHN3c19wcmludFZlYzIoU3dzVmVjdG9yICphLCBBVkNsYXNzICpsb2dfY3R4LCBpbnQgbG9nX2xldmVsKQogewogICAgIGludCBpOwpAQCAtMjI3MCwyNSArMjI4Nyw2IEBACiAgICAgaWYgKCFjKQogICAgICAgICByZXR1cm47CiAKLSAgICBpZiAoYy0+bHVtUGl4QnVmKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT52THVtQnVmU2l6ZTsgaSsrKQotICAgICAgICAgICAgYXZfZnJlZXAoJmMtPmx1bVBpeEJ1ZltpXSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZjLT5sdW1QaXhCdWYpOwotICAgIH0KLQotICAgIGlmIChjLT5jaHJVUGl4QnVmKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT52Q2hyQnVmU2l6ZTsgaSsrKQotICAgICAgICAgICAgYXZfZnJlZXAoJmMtPmNoclVQaXhCdWZbaV0pOwotICAgICAgICBhdl9mcmVlcCgmYy0+Y2hyVVBpeEJ1Zik7Ci0gICAgICAgIGF2X2ZyZWVwKCZjLT5jaHJWUGl4QnVmKTsKLSAgICB9Ci0KLSAgICBpZiAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+YWxwUGl4QnVmKSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjLT52THVtQnVmU2l6ZTsgaSsrKQotICAgICAgICAgICAgYXZfZnJlZXAoJmMtPmFscFBpeEJ1ZltpXSk7Ci0gICAgICAgIGF2X2ZyZWVwKCZjLT5hbHBQaXhCdWYpOwotICAgIH0KLQogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgICAgIGF2X2ZyZWVwKCZjLT5kaXRoZXJfZXJyb3JbaV0pOwogCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3ZlcnNpb24uaCBiL2xpYnN3c2NhbGUvdmVyc2lvbi5oCmluZGV4IDI0OTA4YjguLjZkODA1MjcgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUvdmVyc2lvbi5oCisrKyBiL2xpYnN3c2NhbGUvdmVyc2lvbi5oCkBAIC0yNiw4ICsyNiw4IEBACiAKICNpbmNsdWRlICJsaWJhdnV0aWwvdmVyc2lvbi5oIgogCi0jZGVmaW5lIExJQlNXU0NBTEVfVkVSU0lPTl9NQUpPUiAgIDQKLSNkZWZpbmUgTElCU1dTQ0FMRV9WRVJTSU9OX01JTk9SICAgMAorI2RlZmluZSBMSUJTV1NDQUxFX1ZFUlNJT05fTUFKT1IgICA1CisjZGVmaW5lIExJQlNXU0NBTEVfVkVSU0lPTl9NSU5PUiAgIDEKICNkZWZpbmUgTElCU1dTQ0FMRV9WRVJTSU9OX01JQ1JPIDEwMAogCiAjZGVmaW5lIExJQlNXU0NBTEVfVkVSU0lPTl9JTlQgIEFWX1ZFUlNJT05fSU5UKExJQlNXU0NBTEVfVkVSU0lPTl9NQUpPUiwgXApAQCAtNDYsNCArNDYsOCBAQAogICogdGhlIHB1YmxpYyBBUEkgYW5kIG1heSBjaGFuZ2UsIGJyZWFrIG9yIGRpc2FwcGVhciBhdCBhbnkgdGltZS4KICAqLwogCisjaWZuZGVmIEZGX0FQSV9TV1NfVkVDVE9SCisjZGVmaW5lIEZGX0FQSV9TV1NfVkVDVE9SICAgICAgICAgICAgKExJQlNXU0NBTEVfVkVSU0lPTl9NQUpPUiA8IDYpCisjZW5kaWYKKwogI2VuZGlmIC8qIFNXU0NBTEVfVkVSU0lPTl9IICovCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3ZzY2FsZS5jIGIvbGlic3dzY2FsZS92c2NhbGUuYwppbmRleCA3MmY3OTlkLi43MjM1MmRlIDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL3ZzY2FsZS5jCisrKyBiL2xpYnN3c2NhbGUvdnNjYWxlLmMKQEAgLTIxOCw3ICsyMTgsNyBAQAogICAgICAgICBkZXNjWzBdLmluc3RhbmNlID0gbHVtQ3R4OwogICAgICAgICBkZXNjWzBdLnNyYyA9IHNyYzsKICAgICAgICAgZGVzY1swXS5kc3QgPSBkc3Q7Ci0gICAgICAgIGRlc2NbMF0uYWxwaGEgPSBjLT5hbHBQaXhCdWYgIT0gMDsKKyAgICAgICAgZGVzY1swXS5hbHBoYSA9IGMtPm5lZWRBbHBoYTsKIAogICAgICAgICBpZiAoIWlzR3JheShjLT5kc3RGb3JtYXQpKSB7CiAgICAgICAgICAgICBjaHJDdHggPSBhdl9tYWxsb2N6KHNpemVvZihWU2NhbGVyQ29udGV4dCkpOwpAQCAtMjM5LDcgKzIzOSw3IEBACiAgICAgICAgIGRlc2NbMF0uaW5zdGFuY2UgPSBsdW1DdHg7CiAgICAgICAgIGRlc2NbMF0uc3JjID0gc3JjOwogICAgICAgICBkZXNjWzBdLmRzdCA9IGRzdDsKLSAgICAgICAgZGVzY1swXS5hbHBoYSA9IGMtPmFscFBpeEJ1ZiAhPSAwOworICAgICAgICBkZXNjWzBdLmFscGhhID0gYy0+bmVlZEFscGhhOwogICAgIH0KIAogICAgIGZmX2luaXRfdnNjYWxlX3BmbihjLCBjLT55dXYycGxhbmUxLCBjLT55dXYycGxhbmVYLCBjLT55dXYybnYxMmNYLApkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS94ODYvTWFrZWZpbGUgYi9saWJzd3NjYWxlL3g4Ni9NYWtlZmlsZQppbmRleCA2OTAxMjA3Li5mMzE3ZDVkIDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL3g4Ni9NYWtlZmlsZQorKysgYi9saWJzd3NjYWxlL3g4Ni9NYWtlZmlsZQpAQCAtOCw2ICs4LDcgQEAKIAogT0JKUy0kKENPTkZJR19YTU1fQ0xPQkJFUl9URVNUKSArPSB4ODYvdzY0eG1tdGVzdC5vCiAKLVlBU00tT0JKUyAgICAgICAgICAgICAgICAgICAgICAgKz0geDg2L2lucHV0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1g4NkFTTS1PQkpTICAgICAgICAgICAgICAgICAgICAgKz0geDg2L2lucHV0Lm8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L291dHB1dC5vICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3NjYWxlLm8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDg2L3JnYl8yX3JnYi5vICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUveDg2L2hzY2FsZV9mYXN0X2JpbGluZWFyX3NpbWQuYyBiL2xpYnN3c2NhbGUveDg2L2hzY2FsZV9mYXN0X2JpbGluZWFyX3NpbWQuYwppbmRleCBiMzdiNjNjLi42MGEyY2JmIDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL3g4Ni9oc2NhbGVfZmFzdF9iaWxpbmVhcl9zaW1kLmMKKysrIGIvbGlic3dzY2FsZS94ODYvaHNjYWxlX2Zhc3RfYmlsaW5lYXJfc2ltZC5jCkBAIC01NSw5ICs1NSw5IEBACiAgICAgICAgICJqbXAgICAgICAgICAgICAgICAgICAgICAgICAgOWYgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIC8vIEJlZ2luCiAgICAgICAgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAgICglJSJSRUdfZCIsICUlIlJFR19hIiksICUlbW0zICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZkICAgICglJSJSRUdfYyIsICUlIlJFR19TIiksICUlbW0wICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZkICAgMSglJSJSRUdfYyIsICUlIlJFR19TIiksICUlbW0xICAgICAgICAgIFxuXHQiCisgICAgICAgICJtb3ZxICAgICglJSJGRl9SRUdfZCIsICUlIkZGX1JFR19hIiksICUlbW0zICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgICglJSJGRl9SRUdfYyIsICUlIkZGX1JFR19TIiksICUlbW0wICAgIFxuXHQiCisgICAgICAgICJtb3ZkICAgMSglJSJGRl9SRUdfYyIsICUlIkZGX1JFR19TIiksICUlbW0xICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0wICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc2h1ZncgICAgICAgICAgICAgICAgICAgJDB4RkYsICUlbW0xLCAlJW1tMSAgIFxuXHQiCkBAIC02NSwxNCArNjUsMTQgQEAKICAgICAgICAgInBzaHVmdyAgICAgICAgICAgICAgICAgICAkMHhGRiwgJSVtbTAsICUlbW0wICAgXG5cdCIKICAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzdWJ3ICAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgICAgXG5cdCIKLSAgICAgICAgIm1vdmwgICA4KCUlIlJFR19iIiwgJSUiUkVHX2EiKSwgJSVlc2kgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdmwgICA4KCUlIkZGX1JFR19iIiwgJSUiRkZfUkVHX2EiKSwgJSVlc2kgICAgXG5cdCIKICAgICAgICAgInBtdWxsdyAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTAgICAgICAgICAgXG5cdCIKICAgICAgICAgInBzbGx3ICAgICAgICAgICAgICAgICAgICAgICAkNywgJSVtbTEgICAgICAgICAgXG5cdCIKICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgICAgXG5cdCIKIAotICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICUlbW0wLCAoJSUiUkVHX0QiLCAlJSJSRUdfYSIpIFxuXHQiCisgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgJSVtbTAsICglJSJGRl9SRUdfRCIsICUlIkZGX1JFR19hIikgXG5cdCIKIAotICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJSJSRUdfYSIgICAgICBcblx0IgorICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJSJGRl9SRUdfYSIgICBcblx0IgogICAgICAgICAvLyBFbmQKICAgICAgICAgIjk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgImxlYSAgICAgICAiIExPQ0FMX01BTkdMRSgwYikgIiwgJTAgICAgICAgICAgICAgXG5cdCIKQEAgLTk0LDIyICs5NCwyMiBAQAogICAgICAgICAiam1wICAgICAgICAgICAgICAgICAgICAgICAgIDlmICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAvLyBCZWdpbgogICAgICAgICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAgICAoJSUiUkVHX2QiLCAlJSJSRUdfYSIpLCAlJW1tMyAgICAgICAgICBcblx0IgotICAgICAgICAibW92ZCAgICAoJSUiUkVHX2MiLCAlJSJSRUdfUyIpLCAlJW1tMCAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICAoJSUiRkZfUkVHX2QiLCAlJSJGRl9SRUdfYSIpLCAlJW1tMyAgICBcblx0IgorICAgICAgICAibW92ZCAgICAoJSUiRkZfUkVHX2MiLCAlJSJGRl9SRUdfUyIpLCAlJW1tMCAgICBcblx0IgogICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgICAgICAgICBcblx0IgogICAgICAgICAicHNodWZ3ICAgICAgICAgICAgICAgICAgICQweEZGLCAlJW1tMCwgJSVtbTEgICBcblx0IgogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHNodWZ3ICAgICAgICAgICAgICAgICAgICQweEZGLCAlJW1tMCwgJSVtbTAgICBcblx0IgogICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicHN1YncgICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICAgICBcblx0IgotICAgICAgICAibW92bCAgIDgoJSUiUkVHX2IiLCAlJSJSRUdfYSIpLCAlJWVzaSAgICAgICAgICBcblx0IgorICAgICAgICAibW92bCAgIDgoJSUiRkZfUkVHX2IiLCAlJSJGRl9SRUdfYSIpLCAlJWVzaSAgICBcblx0IgogICAgICAgICAicG11bGx3ICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMCAgICAgICAgICBcblx0IgogICAgICAgICAicHNsbHcgICAgICAgICAgICAgICAgICAgICAgICQ3LCAlJW1tMSAgICAgICAgICBcblx0IgogICAgICAgICAicGFkZHcgICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICAgICBcblx0IgogCi0gICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgJSVtbTAsICglJSJSRUdfRCIsICUlIlJFR19hIikgXG5cdCIKKyAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgKCUlIkZGX1JFR19EIiwgJSUiRkZfUkVHX2EiKSBcblx0IgogCi0gICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgICAgIFxuXHQiCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIkZGX1JFR19hIiAgIFxuXHQiCiAgICAgICAgIC8vIEVuZAogICAgICAgICAiOTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAibGVhICAgICAgICIgTE9DQUxfTUFOR0xFKDBiKSAiLCAlMCAgICAgICAgICAgICBcblx0IgpAQCAtMTk5LDQ2ICsxOTksNDYgQEAKICNpZiBBUkNIX1g4Nl82NAogICAgIHVpbnQ2NF90IHJldHNhdmU7CiAjZWxzZQotI2lmIGRlZmluZWQoUElDKQorI2lmICFIQVZFX0VCWF9BVkFJTEFCTEUKICAgICB1aW50NjRfdCBlYnhzYXZlOwogI2VuZGlmCiAjZW5kaWYKIAogICAgIF9fYXNtX18gdm9sYXRpbGUoCiAjaWYgQVJDSF9YODZfNjQKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgIC04KCUlcnNwKSwgJSUiUkVHX2EiIFxuXHQiCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAlJSJSRUdfYSIsICU1ICAgICAgICBcblx0IiAgLy8gcmV0c2F2ZQorICAgICAgICAibW92ICAgICAgICAgICAgICAgLTgoJSVyc3ApLCAlJSJGRl9SRUdfYSIgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICUlIkZGX1JFR19hIiwgJTUgICAgICAgICAgICAgIFxuXHQiICAvLyByZXRzYXZlCiAjZWxzZQotI2lmIGRlZmluZWQoUElDKQotICAgICAgICAibW92ICAgICAgICAgICAgICAgJSUiUkVHX2IiLCAlNSAgICAgICAgXG5cdCIgIC8vIGVieHNhdmUKKyNpZiAhSEFWRV9FQlhfQVZBSUxBQkxFCisgICAgICAgICJtb3YgICAgICAgICAgICAlJSJGRl9SRUdfYiIsICU1ICAgICAgICAgICAgICBcblx0IiAgLy8gZWJ4c2F2ZQogI2VuZGlmCiAjZW5kaWYKLSAgICAgICAgInB4b3IgICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTcgICAgIFxuXHQiCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgJTAsICUlIlJFR19jIiBcblx0IgotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICUxLCAlJSJSRUdfRCIgXG5cdCIKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAlMiwgJSUiUkVHX2QiIFxuXHQiCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgJTMsICUlIlJFR19iIiBcblx0IgotICAgICAgICAieG9yICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgXG5cdCIgLy8gaQotICAgICAgICBQUkVGRVRDSCIgICAgICAgICglJSJSRUdfYyIpICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgUFJFRkVUQ0giICAgICAgMzIoJSUiUkVHX2MiKSAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIFBSRUZFVENIIiAgICAgIDY0KCUlIlJFR19jIikgICAgICAgICAgICBcblx0IgorICAgICAgICAicHhvciAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAlMCwgJSUiRkZfUkVHX2MiICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgJTEsICUlIkZGX1JFR19EIiAgICBcblx0IgorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICUyLCAlJSJGRl9SRUdfZCIgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAlMywgJSUiRkZfUkVHX2IiICAgIFxuXHQiCisgICAgICAgICJ4b3IgICAgICAgICAgICAlJSJGRl9SRUdfYSIsICUlIkZGX1JFR19hIiAgICBcblx0IiAvLyBpCisgICAgICAgIFBSRUZFVENIIiAgICAgICglJSJGRl9SRUdfYyIpICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQUkVGRVRDSCIgICAgMzIoJSUiRkZfUkVHX2MiKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giICAgIDY0KCUlIkZGX1JFR19jIikgICAgICAgICAgICAgICAgIFxuXHQiCiAKICNpZiBBUkNIX1g4Nl82NAogI2RlZmluZSBDQUxMX01NWEVYVF9GSUxURVJfQ09ERSBcCi0gICAgICAgICJtb3ZsICAgICAgICAgICAgKCUlIlJFR19iIiksICUlZXNpICAgICBcblx0IlwKLSAgICAgICAgImNhbGwgICAgICAgICAgICAgICAgICAgIColNCAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibW92bCAoJSUiUkVHX2IiLCAlJSJSRUdfYSIpLCAlJWVzaSAgICAgXG5cdCJcCi0gICAgICAgICJhZGQgICAgICAgICAgICAgICAlJSJSRUdfUyIsICUlIlJFR19jIiBcblx0IlwKLSAgICAgICAgImFkZCAgICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX0QiIFxuXHQiXAotICAgICAgICAieG9yICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgXG5cdCJcCisgICAgICAgICJtb3ZsICAgICAgICAgICAgICAgKCUlIkZGX1JFR19iIiksICUlZXNpICAgICAgICBcblx0IlwKKyAgICAgICAgImNhbGwgICAgICAgICAgICAgICAgICAgICAgICAgIColNCAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92bCAoJSUiRkZfUkVHX2IiLCAlJSJGRl9SRUdfYSIpLCAlJWVzaSAgICAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAlJSJGRl9SRUdfUyIsICUlIkZGX1JFR19jIiBcblx0IlwKKyAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX0QiIFxuXHQiXAorICAgICAgICAieG9yICAgICAgICAgICAgICAgICAgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSIgXG5cdCJcCiAKICNlbHNlCiAjZGVmaW5lIENBTExfTU1YRVhUX0ZJTFRFUl9DT0RFIFwKLSAgICAgICAgIm1vdmwgKCUlIlJFR19iIiksICUlZXNpICAgICAgICBcblx0IlwKLSAgICAgICAgImNhbGwgICAgICAgICAqJTQgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAiYWRkbCAoJSUiUkVHX2IiLCAlJSJSRUdfYSIpLCAlJSJSRUdfYyIgXG5cdCJcCi0gICAgICAgICJhZGQgICAgICAgICAgICAgICAlJSJSRUdfYSIsICUlIlJFR19EIiBcblx0IlwKLSAgICAgICAgInhvciAgICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiIFxuXHQiXAorICAgICAgICAibW92bCAgICAgICAgICAgICAgICglJSJGRl9SRUdfYiIpLCAlJWVzaSAgICAgICAgXG5cdCJcCisgICAgICAgICJjYWxsICAgICAgICAgICAgICAgICAgICAgICAgICAqJTQgICAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgImFkZGwgKCUlIkZGX1JFR19iIiwgJSUiRkZfUkVHX2EiKSwgJSUiRkZfUkVHX2MiIFxuXHQiXAorICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfRCIgXG5cdCJcCisgICAgICAgICJ4b3IgICAgICAgICAgICAgICAgICAlJSJGRl9SRUdfYSIsICUlIkZGX1JFR19hIiBcblx0IlwKIAogI2VuZGlmIC8qIEFSQ0hfWDg2XzY0ICovCiAKQEAgLTI1MiwxMSArMjUyLDExIEBACiAgICAgICAgIENBTExfTU1YRVhUX0ZJTFRFUl9DT0RFCiAKICNpZiBBUkNIX1g4Nl82NAotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICU1LCAlJSJSRUdfYSIgXG5cdCIKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICUlIlJFR19hIiwgLTgoJSVyc3ApIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgJTUsICUlIkZGX1JFR19hIiBcblx0IgorICAgICAgICAibW92ICAgICAgICAgICAgJSUiRkZfUkVHX2EiLCAtOCglJXJzcCkgICAgXG5cdCIKICNlbHNlCi0jaWYgZGVmaW5lZChQSUMpCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgJTUsICUlIlJFR19iIiBcblx0IgorI2lmICFIQVZFX0VCWF9BVkFJTEFCTEUKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAlNSwgJSUiRkZfUkVHX2IiIFxuXHQiCiAjZW5kaWYKICNlbmRpZgogICAgICAgICA6OiAibSIgKHNyYyksICJtIiAoZHN0KSwgIm0iIChmaWx0ZXIpLCAibSIgKGZpbHRlclBvcyksCkBAIC0yNjQsMTMgKzI2NCwxMyBAQAogI2lmIEFSQ0hfWDg2XzY0CiAgICAgICAgICAgLCJtIihyZXRzYXZlKQogI2Vsc2UKLSNpZiBkZWZpbmVkKFBJQykKKyNpZiAhSEFWRV9FQlhfQVZBSUxBQkxFCiAgICAgICAgICAgLCJtIiAoZWJ4c2F2ZSkKICNlbmRpZgogI2VuZGlmCi0gICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19jLCAiJSJSRUdfZCwgIiUiUkVHX1MsICIlIlJFR19ECi0jaWYgQVJDSF9YODZfNjQgfHwgIWRlZmluZWQoUElDKQotICAgICAgICAgLCIlIlJFR19iCisgICAgICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19jLCAiJSJGRl9SRUdfZCwgIiUiRkZfUkVHX1MsICIlIkZGX1JFR19ECisjaWYgQVJDSF9YODZfNjQgfHwgSEFWRV9FQlhfQVZBSUxBQkxFCisgICAgICAgICAsIiUiRkZfUkVHX2IKICNlbmRpZgogICAgICk7CiAKQEAgLTI4OSwzOSArMjg5LDM5IEBACiAjaWYgQVJDSF9YODZfNjQKICAgICBERUNMQVJFX0FMSUdORUQoOCwgdWludDY0X3QsIHJldHNhdmUpOwogI2Vsc2UKLSNpZiBkZWZpbmVkKFBJQykKKyNpZiAhSEFWRV9FQlhfQVZBSUxBQkxFCiAgICAgREVDTEFSRV9BTElHTkVEKDgsIHVpbnQ2NF90LCBlYnhzYXZlKTsKICNlbmRpZgogI2VuZGlmCiAgICAgX19hc21fXyB2b2xhdGlsZSgKICNpZiBBUkNIX1g4Nl82NAotICAgICAgICAibW92ICAgICAgICAgIC04KCUlcnNwKSwgJSUiUkVHX2EiICBcblx0IgotICAgICAgICAibW92ICAgICAgICAgICUlIlJFR19hIiwgJTcgICAgICAgICBcblx0IiAgLy8gcmV0c2F2ZQorICAgICAgICAibW92ICAgICAgICAgIC04KCUlcnNwKSwgJSUiRkZfUkVHX2EiICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgJSUiRkZfUkVHX2EiLCAlNyAgICAgICAgICAgICAgXG5cdCIgIC8vIHJldHNhdmUKICNlbHNlCi0jaWYgZGVmaW5lZChQSUMpCi0gICAgICAgICJtb3YgICAgICAgICAgJSUiUkVHX2IiLCAlNyAgICAgICAgIFxuXHQiICAvLyBlYnhzYXZlCisjaWYgIUhBVkVfRUJYX0FWQUlMQUJMRQorICAgICAgICAibW92ICAgICAgICUlIkZGX1JFR19iIiwgJTcgICAgICAgICAgICAgIFxuXHQiICAvLyBlYnhzYXZlCiAjZW5kaWYKICNlbmRpZgotICAgICAgICAicHhvciAgICAgICAgICAgICAlJW1tNywgJSVtbTcgICAgICBcblx0IgotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAlMCwgJSUiUkVHX2MiICBcblx0IgotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAlMSwgJSUiUkVHX0QiICBcblx0IgotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAlMiwgJSUiUkVHX2QiICBcblx0IgotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAlMywgJSUiUkVHX2IiICBcblx0IgotICAgICAgICAieG9yICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICBcblx0IiAvLyBpCi0gICAgICAgIFBSRUZFVENIIiAgICglJSJSRUdfYyIpICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIFBSRUZFVENIIiAzMiglJSJSRUdfYyIpICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIFBSRUZFVENIIiA2NCglJSJSRUdfYyIpICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJweG9yICAgICAgICAgICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgJTAsICUlIkZGX1JFR19jIiAgICBcblx0IgorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAlMSwgJSUiRkZfUkVHX0QiICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICUyLCAlJSJGRl9SRUdfZCIgICAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgJTMsICUlIkZGX1JFR19iIiAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAgICUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiIFxuXHQiIC8vIGkKKyAgICAgICAgUFJFRkVUQ0giICAgKCUlIkZGX1JFR19jIikgICAgICAgICAgICAgICBcblx0IgorICAgICAgICBQUkVGRVRDSCIgMzIoJSUiRkZfUkVHX2MiKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBSRUZFVENIIiA2NCglJSJGRl9SRUdfYyIpICAgICAgICAgICAgICAgXG5cdCIKIAogICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQogICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQogICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQogICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQotICAgICAgICAieG9yICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICBcblx0IiAvLyBpCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAgICU1LCAlJSJSRUdfYyIgIFxuXHQiIC8vIHNyYzIKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgJTYsICUlIlJFR19EIiAgXG5cdCIgLy8gZHN0MgotICAgICAgICBQUkVGRVRDSCIgICAoJSUiUkVHX2MiKSAgICAgICAgICAgICBcblx0IgotICAgICAgICBQUkVGRVRDSCIgMzIoJSUiUkVHX2MiKSAgICAgICAgICAgICBcblx0IgotICAgICAgICBQUkVGRVRDSCIgNjQoJSUiUkVHX2MiKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAieG9yICAgICAgICAgICUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiIFxuXHQiIC8vIGkKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgJTUsICUlIkZGX1JFR19jIiBcblx0IiAvLyBzcmMyCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICU2LCAlJSJGRl9SRUdfRCIgXG5cdCIgLy8gZHN0MgorICAgICAgICBQUkVGRVRDSCIgICAoJSUiRkZfUkVHX2MiKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgIFBSRUZFVENIIiAzMiglJSJGRl9SRUdfYyIpICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgUFJFRkVUQ0giIDY0KCUlIkZGX1JFR19jIikgICAgICAgICAgICAgICBcblx0IgogCiAgICAgICAgIENBTExfTU1YRVhUX0ZJTFRFUl9DT0RFCiAgICAgICAgIENBTExfTU1YRVhUX0ZJTFRFUl9DT0RFCkBAIC0zMjksMTEgKzMyOSwxMSBAQAogICAgICAgICBDQUxMX01NWEVYVF9GSUxURVJfQ09ERQogCiAjaWYgQVJDSF9YODZfNjQKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgJTcsICUlIlJFR19hIiAgXG5cdCIKLSAgICAgICAgIm1vdiAgICAgICAgICAlJSJSRUdfYSIsIC04KCUlcnNwKSAgXG5cdCIKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgJTcsICUlIkZGX1JFR19hIiBcblx0IgorICAgICAgICAibW92ICAgICAgICAgICUlIkZGX1JFR19hIiwgLTgoJSVyc3ApICAgIFxuXHQiCiAjZWxzZQotI2lmIGRlZmluZWQoUElDKQotICAgICAgICAibW92ICU3LCAlJSJSRUdfYiIgICAgXG5cdCIKKyNpZiAhSEFWRV9FQlhfQVZBSUxBQkxFCisgICAgICAgICJtb3YgJTcsICUlIkZGX1JFR19iIiAgICBcblx0IgogI2VuZGlmCiAjZW5kaWYKICAgICAgICAgOjogIm0iIChzcmMxKSwgIm0iIChkc3QxKSwgIm0iIChmaWx0ZXIpLCAibSIgKGZpbHRlclBvcyksCkBAIC0zNDEsMTMgKzM0MSwxMyBAQAogI2lmIEFSQ0hfWDg2XzY0CiAgICAgICAgICAgLCJtIihyZXRzYXZlKQogI2Vsc2UKLSNpZiBkZWZpbmVkKFBJQykKKyNpZiAhSEFWRV9FQlhfQVZBSUxBQkxFCiAgICAgICAgICAgLCJtIiAoZWJ4c2F2ZSkKICNlbmRpZgogI2VuZGlmCi0gICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19jLCAiJSJSRUdfZCwgIiUiUkVHX1MsICIlIlJFR19ECi0jaWYgQVJDSF9YODZfNjQgfHwgIWRlZmluZWQoUElDKQotICAgICAgICAgLCIlIlJFR19iCisgICAgICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19jLCAiJSJGRl9SRUdfZCwgIiUiRkZfUkVHX1MsICIlIkZGX1JFR19ECisjaWYgQVJDSF9YODZfNjQgfHwgSEFWRV9FQlhfQVZBSUxBQkxFCisgICAgICAgICAsIiUiRkZfUkVHX2IKICNlbmRpZgogICAgICk7CiAKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUveDg2L291dHB1dC5hc20gYi9saWJzd3NjYWxlL3g4Ni9vdXRwdXQuYXNtCmluZGV4IDllYTRhZjkuLmRiM2U5OTMgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUveDg2L291dHB1dC5hc20KKysrIGIvbGlic3dzY2FsZS94ODYvb3V0cHV0LmFzbQpAQCAtNTAsMTAgKzUwLDEyMiBAQAogOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkaXRoZXIsIGludCBvZmZzZXQpCiA7CiA7IFNjYWxlIG9uZSBvciAkZmlsdGVyU2l6ZSBsaW5lcyBvZiBzb3VyY2UgZGF0YSB0byBnZW5lcmF0ZSBvbmUgbGluZSBvZiBvdXRwdXQKLTsgZGF0YS4gVGhlIGlucHV0IGlzIDE1LWJpdCBpbiBpbnQxNl90IGlmICRvdXRwdXRfc2l6ZSBpcyBbOCwxMF0gYW5kIDE5LWJpdCBpbgotOyBpbnQzMl90IGlmICRvdXRwdXRfc2l6ZSBpcyAxNi4gJGZpbHRlciBpcyAxMi1iaXRzLiAkZmlsdGVyU2l6ZSBpcyBhIG11bHRpcGxlCis7IGRhdGEuIFRoZSBpbnB1dCBpcyAxNSBiaXRzIGluIGludDE2X3QgaWYgJG91dHB1dF9zaXplIGlzIFs4LDEwXSBhbmQgMTkgYml0cyBpbgorOyBpbnQzMl90IGlmICRvdXRwdXRfc2l6ZSBpcyAxNi4gJGZpbHRlciBpcyAxMiBiaXRzLiAkZmlsdGVyU2l6ZSBpcyBhIG11bHRpcGxlCiA7IG9mIDIuICRvZmZzZXQgaXMgZWl0aGVyIDAgb3IgMy4gJGRpdGhlciBob2xkcyA4IHZhbHVlcy4KIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorJW1hY3JvIHl1djJwbGFuZVhfbWFpbmxvb3AgMgorLnBpeGVsbG9vcF8lMjoKKyVhc3NpZ24gJSVpIDAKKyAgICA7IHRoZSByZXAgaGVyZSBpcyBmb3IgdGhlIDgtYml0IG91dHB1dCBNTVggY2FzZSwgd2hlcmUgZGl0aGVyIGNvdmVycworICAgIDsgOCBwaXhlbHMgYnV0IHdlIGNhbiBvbmx5IGhhbmRsZSAyIHBpeGVscyBwZXIgcmVnaXN0ZXIsIGFuZCB0aHVzIDQKKyAgICA7IHBpeGVscyBwZXIgaXRlcmF0aW9uLiBJbiBvcmRlciB0byBub3QgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHdoZXJlCisgICAgOyB3ZSBhcmUgdy5yLnQuIGRpdGhlcmluZywgd2UgdW5yb2xsIHRoZSBNTVgvOC1iaXQgbG9vcCB4Mi4KKyVpZiAlMSA9PSA4CislYXNzaWduICUlcmVwY250IDE2L21tc2l6ZQorJWVsc2UKKyVhc3NpZ24gJSVyZXBjbnQgMQorJWVuZGlmCisKKyVyZXAgJSVyZXBjbnQKKworJWlmICUxID09IDgKKyVpZiBBUkNIX1g4Nl8zMgorICAgIG1vdmEgICAgICAgICAgICBtMiwgW3JzcCttbXNpemUqKDArJSVpKV0KKyAgICBtb3ZhICAgICAgICAgICAgbTEsIFtyc3ArbW1zaXplKigxKyUlaSldCislZWxzZSA7IHg4Ni02NAorICAgIG1vdmEgICAgICAgICAgICBtMiwgIG04CisgICAgbW92YSAgICAgICAgICAgIG0xLCAgbV9kaXRoCislZW5kaWYgOyB4ODYtMzIvNjQKKyVlbHNlIDsgJTEgPT0gOS8xMC8xNgorICAgIG1vdmEgICAgICAgICAgICBtMSwgW3l1djJ5dXZYXyUxX3N0YXJ0XQorICAgIG1vdmEgICAgICAgICAgICBtMiwgIG0xCislZW5kaWYgOyAlMSA9PSA4LzkvMTAvMTYKKyAgICBtb3ZzeCAgICAgY250cl9yZWcsICBmbHRzaXplbQorLmZpbHRlcmxvb3BfJTJfICUrICUlaToKKyAgICA7IGlucHV0IHBpeGVscworICAgIG1vdiAgICAgICAgICAgICByNiwgW3NyY3ErZ3Byc2l6ZSpjbnRyX3JlZy0yKmdwcnNpemVdCislaWYgJTEgPT0gMTYKKyAgICBtb3ZhICAgICAgICAgICAgbTMsIFtyNityNSo0XQorICAgIG1vdmEgICAgICAgICAgICBtNSwgW3I2K3I1KjQrbW1zaXplXQorJWVsc2UgOyAlMSA9PSA4LzkvMTAKKyAgICBtb3ZhICAgICAgICAgICAgbTMsIFtyNityNSoyXQorJWVuZGlmIDsgJTEgPT0gOC85LzEwLzE2CisgICAgbW92ICAgICAgICAgICAgIHI2LCBbc3JjcStncHJzaXplKmNudHJfcmVnLWdwcnNpemVdCislaWYgJTEgPT0gMTYKKyAgICBtb3ZhICAgICAgICAgICAgbTQsIFtyNityNSo0XQorICAgIG1vdmEgICAgICAgICAgICBtNiwgW3I2K3I1KjQrbW1zaXplXQorJWVsc2UgOyAlMSA9PSA4LzkvMTAKKyAgICBtb3ZhICAgICAgICAgICAgbTQsIFtyNityNSoyXQorJWVuZGlmIDsgJTEgPT0gOC85LzEwLzE2CisKKyAgICA7IGNvZWZmaWNpZW50cworICAgIG1vdmQgICAgICAgICAgICBtMCwgW2ZpbHRlcnErMipjbnRyX3JlZy00XSA7IGNvZWZmWzBdLCBjb2VmZlsxXQorJWlmICUxID09IDE2CisgICAgcHNodWZsdyAgICAgICAgIG03LCAgbTAsICAwICAgICAgICAgIDsgY29lZmZbMF0KKyAgICBwc2h1Zmx3ICAgICAgICAgbTAsICBtMCwgIDB4NTUgICAgICAgOyBjb2VmZlsxXQorICAgIHBtb3ZzeHdkICAgICAgICBtNywgIG03ICAgICAgICAgICAgICA7IHdvcmQgLT4gZHdvcmQKKyAgICBwbW92c3h3ZCAgICAgICAgbTAsICBtMCAgICAgICAgICAgICAgOyB3b3JkIC0+IGR3b3JkCisKKyAgICBwbXVsbGQgICAgICAgICAgbTMsICBtNworICAgIHBtdWxsZCAgICAgICAgICBtNSwgIG03CisgICAgcG11bGxkICAgICAgICAgIG00LCAgbTAKKyAgICBwbXVsbGQgICAgICAgICAgbTYsICBtMAorCisgICAgcGFkZGQgICAgICAgICAgIG0yLCAgbTMKKyAgICBwYWRkZCAgICAgICAgICAgbTEsICBtNQorICAgIHBhZGRkICAgICAgICAgICBtMiwgIG00CisgICAgcGFkZGQgICAgICAgICAgIG0xLCAgbTYKKyVlbHNlIDsgJTEgPT0gMTAvOS84CisgICAgcHVucGNrbHdkICAgICAgIG01LCAgbTMsICBtNAorICAgIHB1bnBja2h3ZCAgICAgICBtMywgIG00CisgICAgU1BMQVREICAgICAgICAgIG0wCisKKyAgICBwbWFkZHdkICAgICAgICAgbTUsICBtMAorICAgIHBtYWRkd2QgICAgICAgICBtMywgIG0wCisKKyAgICBwYWRkZCAgICAgICAgICAgbTIsICBtNQorICAgIHBhZGRkICAgICAgICAgICBtMSwgIG0zCislZW5kaWYgOyAlMSA9PSA4LzkvMTAvMTYKKworICAgIHN1YiAgICAgICBjbnRyX3JlZywgIDIKKyAgICBqZyAuZmlsdGVybG9vcF8lMl8gJSsgJSVpCisKKyVpZiAlMSA9PSAxNgorICAgIHBzcmFkICAgICAgICAgICBtMiwgIDMxIC0gJTEKKyAgICBwc3JhZCAgICAgICAgICAgbTEsICAzMSAtICUxCislZWxzZSA7ICUxID09IDEwLzkvOAorICAgIHBzcmFkICAgICAgICAgICBtMiwgIDI3IC0gJTEKKyAgICBwc3JhZCAgICAgICAgICAgbTEsICAyNyAtICUxCislZW5kaWYgOyAlMSA9PSA4LzkvMTAvMTYKKworJWlmICUxID09IDgKKyAgICBwYWNrc3NkdyAgICAgICAgbTIsICBtMQorICAgIHBhY2t1c3diICAgICAgICBtMiwgIG0yCisgICAgbW92aCAgIFtkc3RxK3I1KjFdLCAgbTIKKyVlbHNlIDsgJTEgPT0gOS8xMC8xNgorJWlmICUxID09IDE2CisgICAgcGFja3NzZHcgICAgICAgIG0yLCAgbTEKKyAgICBwYWRkdyAgICAgICAgICAgbTIsIFttaW5zaG9ydF0KKyVlbHNlIDsgJTEgPT0gOS8xMAorJWlmIGNwdWZsYWcoc3NlNCkKKyAgICBwYWNrdXNkdyAgICAgICAgbTIsICBtMQorJWVsc2UgOyBtbXhleHQvc3NlMgorICAgIHBhY2tzc2R3ICAgICAgICBtMiwgIG0xCisgICAgcG1heHN3ICAgICAgICAgIG0yLCAgbTYKKyVlbmRpZiA7IG1teGV4dC9zc2UyL3NzZTQvYXZ4CisgICAgcG1pbnN3ICAgICAgICAgIG0yLCBbeXV2Mnl1dlhfJTFfdXBwZXJdCislZW5kaWYgOyAlMSA9PSA5LzEwLzE2CisgICAgbW92JTIgICBbZHN0cStyNSoyXSwgIG0yCislZW5kaWYgOyAlMSA9PSA4LzkvMTAvMTYKKworICAgIGFkZCAgICAgICAgICAgICByNSwgIG1tc2l6ZS8yCisgICAgc3ViICAgICAgICAgICAgIHdkLCAgbW1zaXplLzIKKworJWFzc2lnbiAlJWkgJSVpKzIKKyVlbmRyZXAKKyAgICBqZyAucGl4ZWxsb29wXyUyCislZW5kbWFjcm8KIAogJW1hY3JvIHl1djJwbGFuZVhfZm4gMwogCkBAIC0xMjMsMTE2ICsyMzUsMTYgQEAKIAogICAgIHhvciAgICAgICAgICAgICByNSwgIHI1CiAKLS5waXhlbGxvb3A6Ci0lYXNzaWduICUlaSAwCi0gICAgOyB0aGUgcmVwIGhlcmUgaXMgZm9yIHRoZSA4Yml0IG91dHB1dCBtbXggY2FzZSwgd2hlcmUgZGl0aGVyIGNvdmVycwotICAgIDsgOCBwaXhlbHMgYnV0IHdlIGNhbiBvbmx5IGhhbmRsZSAyIHBpeGVscyBwZXIgcmVnaXN0ZXIsIGFuZCB0aHVzIDQKLSAgICA7IHBpeGVscyBwZXIgaXRlcmF0aW9uLiBJbiBvcmRlciB0byBub3QgaGF2ZSB0byBrZWVwIHRyYWNrIG9mIHdoZXJlCi0gICAgOyB3ZSBhcmUgdy5yLnQuIGRpdGhlcmluZywgd2UgdW5yb2xsIHRoZSBtbXgvOGJpdCBsb29wIHgyLgotJWlmICUxID09IDgKLSVhc3NpZ24gJSVyZXBjbnQgMTYvbW1zaXplCi0lZWxzZQotJWFzc2lnbiAlJXJlcGNudCAxCi0lZW5kaWYKLQotJXJlcCAlJXJlcGNudAotCi0laWYgJTEgPT0gOAotJWlmIEFSQ0hfWDg2XzMyCi0gICAgbW92YSAgICAgICAgICAgIG0yLCBbcnNwK21tc2l6ZSooMCslJWkpXQotICAgIG1vdmEgICAgICAgICAgICBtMSwgW3JzcCttbXNpemUqKDErJSVpKV0KLSVlbHNlIDsgeDg2LTY0Ci0gICAgbW92YSAgICAgICAgICAgIG0yLCAgbTgKLSAgICBtb3ZhICAgICAgICAgICAgbTEsICBtX2RpdGgKLSVlbmRpZiA7IHg4Ni0zMi82NAotJWVsc2UgOyAlMSA9PSA5LzEwLzE2Ci0gICAgbW92YSAgICAgICAgICAgIG0xLCBbeXV2Mnl1dlhfJTFfc3RhcnRdCi0gICAgbW92YSAgICAgICAgICAgIG0yLCAgbTEKLSVlbmRpZiA7ICUxID09IDgvOS8xMC8xNgotICAgIG1vdnN4ICAgICBjbnRyX3JlZywgIGZsdHNpemVtCi0uZmlsdGVybG9vcF8gJSsgJSVpOgotICAgIDsgaW5wdXQgcGl4ZWxzCi0gICAgbW92ICAgICAgICAgICAgIHI2LCBbc3JjcStncHJzaXplKmNudHJfcmVnLTIqZ3Byc2l6ZV0KLSVpZiAlMSA9PSAxNgotICAgIG1vdmEgICAgICAgICAgICBtMywgW3I2K3I1KjRdCi0gICAgbW92YSAgICAgICAgICAgIG01LCBbcjYrcjUqNCttbXNpemVdCi0lZWxzZSA7ICUxID09IDgvOS8xMAotICAgIG1vdmEgICAgICAgICAgICBtMywgW3I2K3I1KjJdCi0lZW5kaWYgOyAlMSA9PSA4LzkvMTAvMTYKLSAgICBtb3YgICAgICAgICAgICAgcjYsIFtzcmNxK2dwcnNpemUqY250cl9yZWctZ3Byc2l6ZV0KLSVpZiAlMSA9PSAxNgotICAgIG1vdmEgICAgICAgICAgICBtNCwgW3I2K3I1KjRdCi0gICAgbW92YSAgICAgICAgICAgIG02LCBbcjYrcjUqNCttbXNpemVdCi0lZWxzZSA7ICUxID09IDgvOS8xMAotICAgIG1vdmEgICAgICAgICAgICBtNCwgW3I2K3I1KjJdCi0lZW5kaWYgOyAlMSA9PSA4LzkvMTAvMTYKLQotICAgIDsgY29lZmZpY2llbnRzCi0gICAgbW92ZCAgICAgICAgICAgIG0wLCBbZmlsdGVycSsyKmNudHJfcmVnLTRdIDsgY29lZmZbMF0sIGNvZWZmWzFdCi0laWYgJTEgPT0gMTYKLSAgICBwc2h1Zmx3ICAgICAgICAgbTcsICBtMCwgIDAgICAgICAgICAgOyBjb2VmZlswXQotICAgIHBzaHVmbHcgICAgICAgICBtMCwgIG0wLCAgMHg1NSAgICAgICA7IGNvZWZmWzFdCi0gICAgcG1vdnN4d2QgICAgICAgIG03LCAgbTcgICAgICAgICAgICAgIDsgd29yZCAtPiBkd29yZAotICAgIHBtb3ZzeHdkICAgICAgICBtMCwgIG0wICAgICAgICAgICAgICA7IHdvcmQgLT4gZHdvcmQKLQotICAgIHBtdWxsZCAgICAgICAgICBtMywgIG03Ci0gICAgcG11bGxkICAgICAgICAgIG01LCAgbTcKLSAgICBwbXVsbGQgICAgICAgICAgbTQsICBtMAotICAgIHBtdWxsZCAgICAgICAgICBtNiwgIG0wCi0KLSAgICBwYWRkZCAgICAgICAgICAgbTIsICBtMwotICAgIHBhZGRkICAgICAgICAgICBtMSwgIG01Ci0gICAgcGFkZGQgICAgICAgICAgIG0yLCAgbTQKLSAgICBwYWRkZCAgICAgICAgICAgbTEsICBtNgotJWVsc2UgOyAlMSA9PSAxMC85LzgKLSAgICBwdW5wY2tsd2QgICAgICAgbTUsICBtMywgIG00Ci0gICAgcHVucGNraHdkICAgICAgIG0zLCAgbTQKLSAgICBTUExBVEQgICAgICAgICAgbTAKLQotICAgIHBtYWRkd2QgICAgICAgICBtNSwgIG0wCi0gICAgcG1hZGR3ZCAgICAgICAgIG0zLCAgbTAKLQotICAgIHBhZGRkICAgICAgICAgICBtMiwgIG01Ci0gICAgcGFkZGQgICAgICAgICAgIG0xLCAgbTMKLSVlbmRpZiA7ICUxID09IDgvOS8xMC8xNgotCi0gICAgc3ViICAgICAgIGNudHJfcmVnLCAgMgotICAgIGpnIC5maWx0ZXJsb29wXyAlKyAlJWkKLQotJWlmICUxID09IDE2Ci0gICAgcHNyYWQgICAgICAgICAgIG0yLCAgMzEgLSAlMQotICAgIHBzcmFkICAgICAgICAgICBtMSwgIDMxIC0gJTEKLSVlbHNlIDsgJTEgPT0gMTAvOS84Ci0gICAgcHNyYWQgICAgICAgICAgIG0yLCAgMjcgLSAlMQotICAgIHBzcmFkICAgICAgICAgICBtMSwgIDI3IC0gJTEKLSVlbmRpZiA7ICUxID09IDgvOS8xMC8xNgotCi0laWYgJTEgPT0gOAotICAgIHBhY2tzc2R3ICAgICAgICBtMiwgIG0xCi0gICAgcGFja3Vzd2IgICAgICAgIG0yLCAgbTIKLSAgICBtb3ZoICAgW2RzdHErcjUqMV0sICBtMgotJWVsc2UgOyAlMSA9PSA5LzEwLzE2Ci0laWYgJTEgPT0gMTYKLSAgICBwYWNrc3NkdyAgICAgICAgbTIsICBtMQotICAgIHBhZGR3ICAgICAgICAgICBtMiwgW21pbnNob3J0XQotJWVsc2UgOyAlMSA9PSA5LzEwCi0laWYgY3B1ZmxhZyhzc2U0KQotICAgIHBhY2t1c2R3ICAgICAgICBtMiwgIG0xCi0lZWxzZSA7IG1teGV4dC9zc2UyCi0gICAgcGFja3NzZHcgICAgICAgIG0yLCAgbTEKLSAgICBwbWF4c3cgICAgICAgICAgbTIsICBtNgotJWVuZGlmIDsgbW14ZXh0L3NzZTIvc3NlNC9hdngKLSAgICBwbWluc3cgICAgICAgICAgbTIsIFt5dXYyeXV2WF8lMV91cHBlcl0KLSVlbmRpZiA7ICUxID09IDkvMTAvMTYKLSAgICBtb3ZhICAgW2RzdHErcjUqMl0sICBtMgotJWVuZGlmIDsgJTEgPT0gOC85LzEwLzE2Ci0KLSAgICBhZGQgICAgICAgICAgICAgcjUsICBtbXNpemUvMgotICAgIHN1YiAgICAgICAgICAgICB3ZCwgIG1tc2l6ZS8yCi0KLSVhc3NpZ24gJSVpICUlaSsyCi0lZW5kcmVwCi0gICAgamcgLnBpeGVsbG9vcAorJWlmIG1tc2l6ZSA9PSA4IHx8ICUxID09IDgKKyAgICB5dXYycGxhbmVYX21haW5sb29wICUxLCBhCislZWxzZSA7IG1tc2l6ZSA9PSAxNgorICAgIHRlc3QgICAgICAgICAgZHN0cSwgMTUKKyAgICBqbnogLnVuYWxpZ25lZAorICAgIHl1djJwbGFuZVhfbWFpbmxvb3AgJTEsIGEKKyAgICBSRVBfUkVUCisudW5hbGlnbmVkOgorICAgIHl1djJwbGFuZVhfbWFpbmxvb3AgJTEsIHUKKyVlbmRpZiA7IG1tc2l6ZSA9PSA4LzE2CiAKICVpZiAlMSA9PSA4CiAlaWYgQVJDSF9YODZfMzIKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUveDg2L3JnYjJyZ2IuYyBiL2xpYnN3c2NhbGUveDg2L3JnYjJyZ2IuYwppbmRleCBiODBlODY5Li5lNWYzMThhIDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL3g4Ni9yZ2IycmdiLmMKKysrIGIvbGlic3dzY2FsZS94ODYvcmdiMnJnYi5jCkBAIC0yNyw3ICsyNyw2IEBACiAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvYXR0cmlidXRlcy5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2Jzd2FwLmgiCkBAIC0xNDUsMTEgKzE0NCwxNyBAQAogCiAjZW5kaWYgLyogSEFWRV9JTkxJTkVfQVNNICovCiAKK3ZvaWQgZmZfc2h1ZmZsZV9ieXRlc18yMTAzX3Nzc2UzKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCBmZl9zaHVmZmxlX2J5dGVzXzAzMjFfc3NzZTMoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7Cit2b2lkIGZmX3NodWZmbGVfYnl0ZXNfMTIzMF9zc3NlMyhjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKTsKK3ZvaWQgZmZfc2h1ZmZsZV9ieXRlc18zMDEyX3Nzc2UzKGNvbnN0IHVpbnQ4X3QgKnNyYywgdWludDhfdCAqZHN0LCBpbnQgc3JjX3NpemUpOwordm9pZCBmZl9zaHVmZmxlX2J5dGVzXzMyMTBfc3NzZTMoY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CisKIGF2X2NvbGQgdm9pZCByZ2IycmdiX2luaXRfeDg2KHZvaWQpCiB7Ci0jaWYgSEFWRV9JTkxJTkVfQVNNCiAgICAgaW50IGNwdV9mbGFncyA9IGF2X2dldF9jcHVfZmxhZ3MoKTsKIAorI2lmIEhBVkVfSU5MSU5FX0FTTQogICAgIGlmIChJTkxJTkVfTU1YKGNwdV9mbGFncykpCiAgICAgICAgIHJnYjJyZ2JfaW5pdF9tbXgoKTsKICAgICBpZiAoSU5MSU5FX0FNRDNETk9XKGNwdV9mbGFncykpCkBAIC0xNjEsNCArMTY2LDEyIEBACiAgICAgaWYgKElOTElORV9BVlgoY3B1X2ZsYWdzKSkKICAgICAgICAgcmdiMnJnYl9pbml0X2F2eCgpOwogI2VuZGlmIC8qIEhBVkVfSU5MSU5FX0FTTSAqLworCisgICAgaWYgKEVYVEVSTkFMX1NTU0UzKGNwdV9mbGFncykpIHsKKyAgICAgICAgc2h1ZmZsZV9ieXRlc18wMzIxID0gZmZfc2h1ZmZsZV9ieXRlc18wMzIxX3Nzc2UzOworICAgICAgICBzaHVmZmxlX2J5dGVzXzIxMDMgPSBmZl9zaHVmZmxlX2J5dGVzXzIxMDNfc3NzZTM7CisgICAgICAgIHNodWZmbGVfYnl0ZXNfMTIzMCA9IGZmX3NodWZmbGVfYnl0ZXNfMTIzMF9zc3NlMzsKKyAgICAgICAgc2h1ZmZsZV9ieXRlc18zMDEyID0gZmZfc2h1ZmZsZV9ieXRlc18zMDEyX3Nzc2UzOworICAgICAgICBzaHVmZmxlX2J5dGVzXzMyMTAgPSBmZl9zaHVmZmxlX2J5dGVzXzMyMTBfc3NzZTM7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS94ODYvcmdiMnJnYl90ZW1wbGF0ZS5jIGIvbGlic3dzY2FsZS94ODYvcmdiMnJnYl90ZW1wbGF0ZS5jCmluZGV4IDk1ZDRmOGYuLmQ1OWJkNTYgMTAwNjQ0Ci0tLSBhL2xpYnN3c2NhbGUveDg2L3JnYjJyZ2JfdGVtcGxhdGUuYworKysgYi9saWJzd3NjYWxlL3g4Ni9yZ2IycmdiX3RlbXBsYXRlLmMKQEAgLTExMDEsNDMgKzExMDEsNDMgQEAKICAgICB1bnNpZ25lZCBpOwogICAgIHg4Nl9yZWcgbW14X3NpemU9IDIzIC0gc3JjX3NpemU7CiAgICAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgICAgICJ0ZXN0ICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICAgICAgICAgIFxuXHQiCisgICAgICAgICJ0ZXN0ICAgICAgICAgICAgICUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiICAgIFxuXHQiCiAgICAgICAgICJqbnMgICAgICAgICAgICAgICAgICAgICAyZiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgICAiTUFOR0xFKG1hc2syNHIpIiwgJSVtbTUgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgICAiTUFOR0xFKG1hc2syNGcpIiwgJSVtbTYgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJtb3ZxICAgICAiTUFOR0xFKG1hc2syNGIpIiwgJSVtbTcgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIFBSRUZFVENIIiAzMiglMSwgJSUiUkVHX2EiKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3ZxICAgICAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiIC8vIEJHUiBCR1IgQkcKLSAgICAgICAgIm1vdnEgICAgICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLy8gQkdSIEJHUiBCRwotICAgICAgICAibW92cSAgICAgIDIoJTEsICUlIlJFR19hIiksICUlbW0yICAgICAgICAgICAgICBcblx0IiAvLyBSIEJHUiBCR1IgQgorICAgICAgICBQUkVGRVRDSCIgMzIoJTEsICUlIkZGX1JFR19hIikgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92cSAgICAoJTEsICUlIkZGX1JFR19hIiksICUlbW0wICAgICAgICAgICAgICBcblx0IiAvLyBCR1IgQkdSIEJHCisgICAgICAgICJtb3ZxICAgICglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiIC8vIEJHUiBCR1IgQkcKKyAgICAgICAgIm1vdnEgICAyKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLy8gUiBCR1IgQkdSIEIKICAgICAgICAgInBzbGxxICAgICAgICAgICAgICAgICAgJDE2LCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIgLy8gMDAgQkdSIEJHUgogICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW0wICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgJSVtbTYsICUlbW0xICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0yICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicG9yICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0xICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicG9yICAgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0xICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAgICAgIDYoJTEsICUlIlJFR19hIiksICUlbW0wICAgICAgICAgICAgICBcblx0IiAvLyBCR1IgQkdSIEJHCi0gICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAlJW1tMSwgICAoJTIsICUlIlJFR19hIikgIFxuXHQiIC8vIFJHQiBSR0IgUkcKLSAgICAgICAgIm1vdnEgICAgICA4KCUxLCAlJSJSRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLy8gUiBCR1IgQkdSIEIKLSAgICAgICAgIm1vdnEgICAgIDEwKCUxLCAlJSJSRUdfYSIpLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLy8gR1IgQkdSIEJHUgorICAgICAgICAibW92cSAgIDYoJTEsICUlIkZGX1JFR19hIiksICUlbW0wICAgICAgICAgICAgICBcblx0IiAvLyBCR1IgQkdSIEJHCisgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAlJW1tMSwoJTIsICUlIkZGX1JFR19hIikgIFxuXHQiIC8vIFJHQiBSR0IgUkcKKyAgICAgICAgIm1vdnEgICA4KCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLy8gUiBCR1IgQkdSIEIKKyAgICAgICAgIm1vdnEgIDEwKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMiAgICAgICAgICAgICAgXG5cdCIgLy8gR1IgQkdSIEJHUgogICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0wICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW0xICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgJSVtbTYsICUlbW0yICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicG9yICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0xICAgICAgICAgICAgICBcblx0IgogICAgICAgICAicG9yICAgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0xICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92cSAgICAgMTQoJTEsICUlIlJFR19hIiksICUlbW0wICAgICAgICAgICAgICBcblx0IiAvLyBSIEJHUiBCR1IgQgotICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgJSVtbTEsICA4KCUyLCAlJSJSRUdfYSIpICBcblx0IiAvLyBCIFJHQiBSR0IgUgotICAgICAgICAibW92cSAgICAgMTYoJTEsICUlIlJFR19hIiksICUlbW0xICAgICAgICAgICAgICBcblx0IiAvLyBHUiBCR1IgQkdSCi0gICAgICAgICJtb3ZxICAgICAxOCglMSwgJSUiUkVHX2EiKSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiIC8vIEJHUiBCR1IgQkcKKyAgICAgICAgIm1vdnEgIDE0KCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCAgICAgICAgICAgICAgXG5cdCIgLy8gUiBCR1IgQkdSIEIKKyAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICUlbW0xLCA4KCUyLCAlJSJGRl9SRUdfYSIpXG5cdCIgLy8gQiBSR0IgUkdCIFIKKyAgICAgICAgIm1vdnEgIDE2KCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICAgICAgICAgXG5cdCIgLy8gR1IgQkdSIEJHUgorICAgICAgICAibW92cSAgMTgoJTEsICUlIkZGX1JFR19hIiksICUlbW0yICAgICAgICAgICAgICBcblx0IiAvLyBCR1IgQkdSIEJHCiAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTIgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwb3IgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICJwb3IgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTEgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAlJW1tMSwgMTYoJTIsICUlIlJFR19hIikgIFxuXHQiCi0gICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICQyNCwgJSUiUkVHX2EiICAgICAgICAgIFxuXHQiCisgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAlJW1tMSwgMTYoJTIsICUlIkZGX1JFR19hIikgXG5cdCIKKyAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgJDI0LCAlJSJGRl9SRUdfYSIgICAgICAgXG5cdCIKICAgICAgICAgIiBqcyAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgOiAiK2EiIChtbXhfc2l6ZSkKQEAgLTExNzMsMjAgKzExNzMsMjAgQEAKICAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7IHkrKykgewogICAgICAgICAvL0ZJWE1FIGhhbmRsZSAyIGxpbmVzIGF0IG9uY2UgKGZld2VyIHByZWZldGNoZXMsIHJldXNlIHNvbWUgY2hyb21hLCBidXQgdmVyeSBsaWtlbHkgbWVtb3J5LWxpbWl0ZWQgYW55d2F5KQogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgICAgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSIgXG5cdCIKICAgICAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFBSRUZFVENIIiAgICAzMiglMSwgJSUiUkVHX2EiLCAyKSAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFBSRUZFVENIIiAgICAzMiglMiwgJSUiUkVHX2EiKSAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFBSRUZFVENIIiAgICAzMiglMywgJSUiUkVHX2EiKSAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgICAgICglMiwgJSUiUkVHX2EiKSwgJSVtbTAgICAgICAgXG5cdCIgLy8gVSgwKQorICAgICAgICAgICAgUFJFRkVUQ0giIDMyKCUxLCAlJSJGRl9SRUdfYSIsIDIpICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFJFRkVUQ0giIDMyKCUyLCAlJSJGRl9SRUdfYSIpICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgUFJFRkVUQ0giIDMyKCUzLCAlJSJGRl9SRUdfYSIpICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgKCUyLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCAgICAgICBcblx0IiAvLyBVKDApCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgICAgIFxuXHQiIC8vIFUoMCkKLSAgICAgICAgICAgICJtb3ZxICAgICAgICAgICglMywgJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgXG5cdCIgLy8gVigwKQorICAgICAgICAgICAgIm1vdnEgICAgICAgKCUzLCAlJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICBcblx0IiAvLyBWKDApCiAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgIFxuXHQiIC8vIFVWVVYgVVZVVigwKQogICAgICAgICAgICAgInB1bnBja2hidyAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMiAgICAgICBcblx0IiAvLyBVVlVWIFVWVVYoOCkKIAotICAgICAgICAgICAgIm1vdnEgICAgICAgICglMSwgJSUiUkVHX2EiLDIpLCAlJW1tMyAgICAgICBcblx0IiAvLyBZKDApCi0gICAgICAgICAgICAibW92cSAgICAgICA4KCUxLCAlJSJSRUdfYSIsMiksICUlbW01ICAgICAgIFxuXHQiIC8vIFkoOCkKKyAgICAgICAgICAgICJtb3ZxICAgICAoJTEsICUlIkZGX1JFR19hIiwyKSwgJSVtbTMgICAgICAgXG5cdCIgLy8gWSgwKQorICAgICAgICAgICAgIm1vdnEgICAgOCglMSwgJSUiRkZfUkVHX2EiLDIpLCAlJW1tNSAgICAgICBcblx0IiAvLyBZKDgpCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW00ICAgICAgIFxuXHQiIC8vIFkoMCkKICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTYgICAgICAgXG5cdCIgLy8gWSg4KQogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMyAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMCkKQEAgLTExOTQsMTYgKzExOTQsMTYgQEAKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTUgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDgpCiAgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICAgICAgICAgJSVtbTIsICUlbW02ICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVigxMikKIAotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0zLCAgICglMCwgJSUiUkVHX2EiLCA0KSAgICBcblx0IgotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW00LCAgOCglMCwgJSUiUkVHX2EiLCA0KSAgICBcblx0IgotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW01LCAxNiglMCwgJSUiUkVHX2EiLCA0KSAgICBcblx0IgotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW02LCAyNCglMCwgJSUiUkVHX2EiLCA0KSAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0zLCAgICglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW00LCAgOCglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW01LCAxNiglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW02LCAyNCglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICBcblx0IgogCi0gICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgIFxuXHQiCi0gICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIlJFR19hIiAgIFxuXHQiCi0gICAgICAgICAgICAiIGpiICAgICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIkZGX1JFR19hIiBcblx0IgorICAgICAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICAgICU0LCAlJSJGRl9SRUdfYSIgXG5cdCIKKyAgICAgICAgICAgICIgamIgICAgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiJyIihkc3QpLCAiciIoeXNyYyksICJyIih1c3JjKSwgInIiKHZzcmMpLCAiZyIgKGNocm9tV2lkdGgpCi0gICAgICAgICAgICA6ICIlIlJFR19hCisgICAgICAgICAgICA6ICIlIkZGX1JFR19hCiAgICAgICAgICk7CiAgICAgICAgIGlmICgoeSYodmVydEx1bVBlckNocm9tYS0xKSkgPT0gdmVydEx1bVBlckNocm9tYS0xKSB7CiAgICAgICAgICAgICB1c3JjICs9IGNocm9tU3RyaWRlOwpAQCAtMTIzOCwyMCArMTIzOCwyMCBAQAogICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSsrKSB7CiAgICAgICAgIC8vRklYTUUgaGFuZGxlIDIgbGluZXMgYXQgb25jZSAoZmV3ZXIgcHJlZmV0Y2hlcywgcmV1c2Ugc29tZSBjaHJvbWEsIGJ1dCB2ZXJ5IGxpa2VseSBtZW1vcnktbGltaXRlZCBhbnl3YXkpCiAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICAgICAieG9yICAgICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICAgIFxuXHQiCisgICAgICAgICAgICAieG9yICAgICAgICAgICAgICUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiIFxuXHQiCiAgICAgICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICBQUkVGRVRDSCIgICAzMiglMSwgJSUiUkVHX2EiLCAyKSAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICBQUkVGRVRDSCIgICAzMiglMiwgJSUiUkVHX2EiKSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICBQUkVGRVRDSCIgICAzMiglMywgJSUiUkVHX2EiKSAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAgICAgICglMiwgJSUiUkVHX2EiKSwgJSVtbTAgICAgICAgIFxuXHQiIC8vIFUoMCkKKyAgICAgICAgICAgIFBSRUZFVENIIiAzMiglMSwgJSUiRkZfUkVHX2EiLCAyKSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiAzMiglMiwgJSUiRkZfUkVHX2EiKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiAzMiglMywgJSUiRkZfUkVHX2EiKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgKCUyLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCAgICAgICAgXG5cdCIgLy8gVSgwKQogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgICAgICBcblx0IiAvLyBVKDApCi0gICAgICAgICAgICAibW92cSAgICAgICAgICglMywgJSUiUkVHX2EiKSwgJSVtbTEgICAgICAgIFxuXHQiIC8vIFYoMCkKKyAgICAgICAgICAgICJtb3ZxICAgICAgKCUzLCAlJSJGRl9SRUdfYSIpLCAlJW1tMSAgICAgICAgXG5cdCIgLy8gVigwKQogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgICBcblx0IiAvLyBVVlVWIFVWVVYoMCkKICAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgICAgICAgICUlbW0xLCAlJW1tMiAgICAgICAgXG5cdCIgLy8gVVZVViBVVlVWKDgpCiAKLSAgICAgICAgICAgICJtb3ZxICAgICAgICglMSwgJSUiUkVHX2EiLDIpLCAlJW1tMyAgICAgICAgXG5cdCIgLy8gWSgwKQotICAgICAgICAgICAgIm1vdnEgICAgICA4KCUxLCAlJSJSRUdfYSIsMiksICUlbW01ICAgICAgICBcblx0IiAvLyBZKDgpCisgICAgICAgICAgICAibW92cSAgICAoJTEsICUlIkZGX1JFR19hIiwyKSwgJSVtbTMgICAgICAgIFxuXHQiIC8vIFkoMCkKKyAgICAgICAgICAgICJtb3ZxICAgOCglMSwgJSUiRkZfUkVHX2EiLDIpLCAlJW1tNSAgICAgICAgXG5cdCIgLy8gWSg4KQogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW00ICAgICAgICBcblx0IiAvLyBZKDApCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTYgICAgICAgIFxuXHQiIC8vIFkoOCkKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICUlbW0zLCAlJW1tMCAgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDApCkBAIC0xMjU5LDE2ICsxMjU5LDE2IEBACiAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAlJW1tNSwgJSVtbTIgICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig4KQogICAgICAgICAgICAgInB1bnBja2hidyAgICAgICAgICAgICAgJSVtbTUsICUlbW02ICAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMTIpCiAKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW0wLCAgICglMCwgJSUiUkVHX2EiLCA0KSAgICAgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW00LCAgOCglMCwgJSUiUkVHX2EiLCA0KSAgICAgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW0yLCAxNiglMCwgJSUiUkVHX2EiLCA0KSAgICAgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW02LCAyNCglMCwgJSUiUkVHX2EiLCA0KSAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW0wLCAgICglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW00LCAgOCglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW0yLCAxNiglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW02LCAyNCglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICAgXG5cdCIKIAotICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgICBcblx0IgotICAgICAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIlJFR19hIiAgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIkZGX1JFR19hIiBcblx0IgorICAgICAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIkZGX1JFR19hIiBcblx0IgogICAgICAgICAgICAgIiBqYiAgICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgOjoiciIoZHN0KSwgInIiKHlzcmMpLCAiciIodXNyYyksICJyIih2c3JjKSwgImciIChjaHJvbVdpZHRoKQotICAgICAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICAgICAgOiAiJSJGRl9SRUdfYQogICAgICAgICApOwogICAgICAgICBpZiAoKHkmKHZlcnRMdW1QZXJDaHJvbWEtMSkpID09IHZlcnRMdW1QZXJDaHJvbWEtMSkgewogICAgICAgICAgICAgdXNyYyArPSBjaHJvbVN0cmlkZTsKQEAgLTEzMjYsMTQgKzEzMjYsMTQgQEAKICAgICBjb25zdCB4ODZfcmVnIGNocm9tV2lkdGg9IHdpZHRoPj4xOwogICAgIGZvciAoeT0wOyB5PGhlaWdodDsgeSs9MikgewogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSJcblx0IgogICAgICAgICAgICAgInBjbXBlcXcgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tNyAgICAgICBcblx0IgogICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tNyAgICAgICBcblx0IiAvLyBGRiwwMCxGRiwwMC4uLgogICAgICAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTAsICUlIlJFR19hIiwgNCkgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAgICAoJTAsICUlIlJFR19hIiwgNCksICUlbW0wICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVigwKQotICAgICAgICAgICAgIm1vdnEgICAgICA4KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMSAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoNCkKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICglMCwgJSUiRkZfUkVHX2EiLCA0KSwgJSVtbTAgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDApCisgICAgICAgICAgICAibW92cSAgIDgoJTAsICUlIkZGX1JFR19hIiwgNCksICUlbW0xICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig0KQogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMiAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMCkKICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTMgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDQpCiAgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAgICAgJDgsICUlbW0wICAgICAgIFxuXHQiIC8vIFUwVjAgVTBWMCgwKQpAQCAtMTM0MywxMCArMTM0MywxMCBAQAogICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICBcblx0IiAvLyBVVlVWIFVWVVYoMCkKICAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgICAgXG5cdCIgLy8gWVlZWSBZWVlZKDApCiAKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICAlJW1tMiwgKCUxLCAlJSJSRUdfYSIsIDIpICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0yLCAoJTEsICUlIkZGX1JFR19hIiwgMikgXG5cdCIKIAotICAgICAgICAgICAgIm1vdnEgICAgIDE2KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMSAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoOCkKLSAgICAgICAgICAgICJtb3ZxICAgICAyNCglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTIgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDEyKQorICAgICAgICAgICAgIm1vdnEgIDE2KCUwLCAlJSJGRl9SRUdfYSIsIDQpLCAlJW1tMSAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoOCkKKyAgICAgICAgICAgICJtb3ZxICAyNCglMCwgJSUiRkZfUkVHX2EiLCA0KSwgJSVtbTIgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDEyKQogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMyAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoOCkKICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTQgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDEyKQogICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMSAgICAgICBcblx0IiAvLyBVMFYwIFUwVjAoOCkKQEAgLTEzNTYsNyArMTM1Niw3IEBACiAgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0xICAgICAgIFxuXHQiIC8vIFVWVVYgVVZVVig4KQogICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgICAgICUlbW00LCAlJW1tMyAgICAgICBcblx0IiAvLyBZWVlZIFlZWVkoOCkKIAotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0zLCA4KCUxLCAlJSJSRUdfYSIsIDIpIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTMsIDgoJTEsICUlIkZGX1JFR19hIiwgMikgXG5cdCIKIAogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMiAgICAgICBcblx0IiAvLyBVVlVWIFVWVVYoMCkKICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTMgICAgICAgXG5cdCIgLy8gVVZVViBVVlVWKDgpCkBAIC0xMzY3LDI4ICsxMzY3LDI4IEBACiAgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgIFxuXHQiIC8vIFZWVlYgVlZWVigwKQogICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IiAvLyBVVVVVIFVVVVUoMCkKIAotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0wLCAoJTMsICUlIlJFR19hIikgICAgIFxuXHQiCi0gICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTIsICglMiwgJSUiUkVHX2EiKSAgICAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICAlJW1tMCwgKCUzLCAlJSJGRl9SRUdfYSIpICAgICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0yLCAoJTIsICUlIkZGX1JFR19hIikgICAgIFxuXHQiCiAKLSAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAkOCwgJSUiUkVHX2EiICAgXG5cdCIKLSAgICAgICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICAgICAlNCwgJSUiUkVHX2EiICAgXG5cdCIKLSAgICAgICAgICAgICIgamIgICAgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAkOCwgJSUiRkZfUkVHX2EiIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIkZGX1JFR19hIiBcblx0IgorICAgICAgICAgICAgIiBqYiAgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgIDo6InIiKHNyYyksICJyIih5ZHN0KSwgInIiKHVkc3QpLCAiciIodmRzdCksICJnIiAoY2hyb21XaWR0aCkKLSAgICAgICAgICAgIDogIm1lbW9yeSIsICIlIlJFR19hCisgICAgICAgICAgICA6ICJtZW1vcnkiLCAiJSJGRl9SRUdfYQogICAgICAgICApOwogCiAgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOwogICAgICAgICBzcmMgICs9IHNyY1N0cmlkZTsKIAogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgICAgJSUiUkVHX2EiLCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSJcblx0IgogICAgICAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgUFJFRkVUQ0giIDY0KCUwLCAlJSJSRUdfYSIsIDQpICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAgICAgKCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMCAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMCkKLSAgICAgICAgICAgICJtb3ZxICAgICAgOCglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTEgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDQpCi0gICAgICAgICAgICAibW92cSAgICAgMTYoJTAsICUlIlJFR19hIiwgNCksICUlbW0yICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVig4KQotICAgICAgICAgICAgIm1vdnEgICAgIDI0KCUwLCAlJSJSRUdfYSIsIDQpLCAlJW1tMyAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoMTIpCisgICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTAsICUlIkZGX1JFR19hIiwgNCkgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAoJTAsICUlIkZGX1JFR19hIiwgNCksICUlbW0wICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVigwKQorICAgICAgICAgICAgIm1vdnEgICA4KCUwLCAlJSJGRl9SRUdfYSIsIDQpLCAlJW1tMSAgICAgICBcblx0IiAvLyBZVVlWIFlVWVYoNCkKKyAgICAgICAgICAgICJtb3ZxICAxNiglMCwgJSUiRkZfUkVHX2EiLCA0KSwgJSVtbTIgICAgICAgXG5cdCIgLy8gWVVZViBZVVlWKDgpCisgICAgICAgICAgICAibW92cSAgMjQoJTAsICUlIkZGX1JFR19hIiwgNCksICUlbW0zICAgICAgIFxuXHQiIC8vIFlVWVYgWVVZVigxMikKICAgICAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTAgICAgICAgXG5cdCIgLy8gWTBZMCBZMFkwKDApCiAgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgIFxuXHQiIC8vIFkwWTAgWTBZMCg0KQogICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICBcblx0IiAvLyBZMFkwIFkwWTAoOCkKQEAgLTEzOTYsMTUgKzEzOTYsMTUgQEAKICAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgXG5cdCIgLy8gWVlZWSBZWVlZKDApCiAgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICAgIFxuXHQiIC8vIFlZWVkgWVlZWSg4KQogCi0gICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTAsICAoJTEsICUlIlJFR19hIiwgMikgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICAlJW1tMiwgOCglMSwgJSUiUkVHX2EiLCAyKSBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgICUlbW0wLCAgKCUxLCAlJSJGRl9SRUdfYSIsIDIpIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTIsIDgoJTEsICUlIkZGX1JFR19hIiwgMikgXG5cdCIKIAotICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJSJSRUdfYSIgICBcblx0IgotICAgICAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICAgICU0LCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJSJGRl9SRUdfYSJcblx0IgorICAgICAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICAgICU0LCAlJSJGRl9SRUdfYSJcblx0IgogICAgICAgICAgICAgIiBqYiAgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICBcblx0IgogCiAgICAgICAgICAgICA6OiJyIihzcmMpLCAiciIoeWRzdCksICJyIih1ZHN0KSwgInIiKHZkc3QpLCAiZyIgKGNocm9tV2lkdGgpCi0gICAgICAgICAgICA6ICJtZW1vcnkiLCAiJSJSRUdfYQorICAgICAgICAgICAgOiAibWVtb3J5IiwgIiUiRkZfUkVHX2EKICAgICAgICAgKTsKICAgICAgICAgdWRzdCArPSBjaHJvbVN0cmlkZTsKICAgICAgICAgdmRzdCArPSBjaHJvbVN0cmlkZTsKQEAgLTE0MzgsMjMgKzE0MzgsMjMgQEAKIAogICAgICAgICBpZiAobW14U2l6ZSkgewogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAgICAgICAgICAgJTQsICUlIlJFR19hIiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAlNCwgJSUiRkZfUkVHX2EiIFxuXHQiCiAgICAgICAgICAgICAibW92cSAgICAgICAgIk1BTkdMRShtbXhfZmYpIiwgJSVtbTAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgICAgKCUwLCAlJSJSRUdfYSIpLCAlJW1tNCAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAoJTAsICUlIkZGX1JFR19hIiksICUlbW00ICAgIFxuXHQiCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTIgICAgXG5cdCIKICAgICAgICAgICAgICJwc2xscSAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tNCAgICBcblx0IgogICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgIFxuXHQiCiAgICAgICAgICAgICAicG9yICAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTQgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgICAgKCUxLCAlJSJSRUdfYSIpLCAlJW1tNSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAoJTEsICUlIkZGX1JFR19hIiksICUlbW01ICAgIFxuXHQiCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAlJW1tNSwgJSVtbTMgICAgXG5cdCIKICAgICAgICAgICAgICJwc2xscSAgICAgICAgICAgICAgICAgICAgICQ4LCAlJW1tNSAgICBcblx0IgogICAgICAgICAgICAgInBhbmQgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0zICAgIFxuXHQiCiAgICAgICAgICAgICAicG9yICAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTUgICAgXG5cdCIKICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAgICAgICAoJTAsICUlIlJFR19hIiksICUlbW0wICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAgICAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTEgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgICAxKCUwLCAlJSJSRUdfYSIpLCAlJW1tMiAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAgICAgIDEoJTEsICUlIlJFR19hIiksICUlbW0zICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICglMCwgJSUiRkZfUkVHX2EiKSwgJSVtbTAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZxICAgICAgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMSAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgIDEoJTAsICUlIkZGX1JFR19hIiksICUlbW0yICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgMSglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTMgICAgXG5cdCIKICAgICAgICAgICAgIFBBVkdCIiAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tNSAgICBcblx0IgogICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0zICAgIFxuXHQiCiAgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTUgICAgXG5cdCIKQEAgLTE0NjksMTkgKzE0NjksMTkgQEAKICAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgICAgICAgICUlbW0zLCAlJW1tNyAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgJSVtbTIsICUlbW00ICAgIFxuXHQiCiAgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICAgICAgICAlJW1tMiwgJSVtbTYgICAgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW01LCAgKCUyLCAlJSJSRUdfYSIsIDIpICBcblx0IgotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgJSVtbTcsIDgoJTIsICUlIlJFR19hIiwgMikgIFxuXHQiCi0gICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tNCwgICglMywgJSUiUkVHX2EiLCAyKSAgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW02LCA4KCUzLCAlJSJSRUdfYSIsIDIpICBcblx0IgotICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAgICAtMSglMCwgJSUiUkVHX2EiKSwgJSVtbTQgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgIC0xKCUxLCAlJSJSRUdfYSIpLCAlJW1tNSAgICBcblx0IgotICAgICAgICAgICAgIiBqcyAgICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tNSwgICglMiwgJSUiRkZfUkVHX2EiLCAyKSAgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAgICUlbW03LCA4KCUyLCAlJSJGRl9SRUdfYSIsIDIpICBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICAgJSVtbTQsICAoJTMsICUlIkZGX1JFR19hIiwgMikgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAlJW1tNiwgOCglMywgJSUiRkZfUkVHX2EiLCAyKSAgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICQ4LCAlJSJGRl9SRUdfYSIgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgLTEoJTAsICUlIkZGX1JFR19hIiksICUlbW00ICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAtMSglMSwgJSUiRkZfUkVHX2EiKSwgJSVtbTUgICAgXG5cdCIKKyAgICAgICAgICAgICIganMgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgOjogInIiIChzcmMgKyBtbXhTaXplICApLCAiciIgKHNyYyArIHNyY1N0cmlkZSArIG1teFNpemUgICksCiAgICAgICAgICAgICAgICAiciIgKGRzdCArIG1teFNpemUqMiksICJyIiAoZHN0ICsgZHN0U3RyaWRlICsgbW14U2l6ZSoyKSwKICAgICAgICAgICAgICAgICJnIiAoLW1teFNpemUpCiAgICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQobW14X2ZmKQotICAgICAgICAgICAgOiAiJSJSRUdfYQorICAgICAgICAgICAgOiAiJSJGRl9SRUdfYQogICAgICAgICApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbW14U2l6ZSA9IDE7CkBAIC0xNTMyLDE0ICsxNTMyLDE0IEBACiAgICAgY29uc3QgeDg2X3JlZyBjaHJvbVdpZHRoPSB3aWR0aD4+MTsKICAgICBmb3IgKHk9MDsgeTxoZWlnaHQ7IHkrPTIpIHsKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJ4b3IgICAgICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICAgXG5cdCIKKyAgICAgICAgICAgICJ4b3IgICAgICAgICAgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSIgXG5cdCIKICAgICAgICAgICAgICJwY21wZXF3ICAgICAgICAgICAgICUlbW03LCAlJW1tNyAgIFxuXHQiCiAgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAkOCwgJSVtbTcgICBcblx0IiAvLyBGRiwwMCxGRiwwMC4uLgogICAgICAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTAsICUlIlJFR19hIiwgNCkgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgICglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTAgICBcblx0IiAvLyBVWVZZIFVZVlkoMCkKLSAgICAgICAgICAgICJtb3ZxICAgICAgOCglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTEgICBcblx0IiAvLyBVWVZZIFVZVlkoNCkKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMCwgJSUiRkZfUkVHX2EiLCA0KSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgKCUwLCAlJSJGRl9SRUdfYSIsIDQpLCAlJW1tMCAgIFxuXHQiIC8vIFVZVlkgVVlWWSgwKQorICAgICAgICAgICAgIm1vdnEgICAgICA4KCUwLCAlJSJGRl9SRUdfYSIsIDQpLCAlJW1tMSAgIFxuXHQiIC8vIFVZVlkgVVlWWSg0KQogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgXG5cdCIgLy8gVVlWWSBVWVZZKDApCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTMgICBcblx0IiAvLyBVWVZZIFVZVlkoNCkKICAgICAgICAgICAgICJwYW5kICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgIFxuXHQiIC8vIFUwVjAgVTBWMCgwKQpAQCAtMTU0OSwxMCArMTU0OSwxMCBAQAogICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgXG5cdCIgLy8gVVZVViBVVlVWKDApCiAgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAlJW1tMywgJSVtbTIgICBcblx0IiAvLyBZWVlZIFlZWVkoMCkKIAotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgJSVtbTIsICAoJTEsICUlIlJFR19hIiwgMikgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0yLCAgKCUxLCAlJSJGRl9SRUdfYSIsIDIpIFxuXHQiCiAKLSAgICAgICAgICAgICJtb3ZxICAgICAxNiglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTEgICBcblx0IiAvLyBVWVZZIFVZVlkoOCkKLSAgICAgICAgICAgICJtb3ZxICAgICAyNCglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTIgICBcblx0IiAvLyBVWVZZIFVZVlkoMTIpCisgICAgICAgICAgICAibW92cSAgICAgMTYoJTAsICUlIkZGX1JFR19hIiwgNCksICUlbW0xICAgXG5cdCIgLy8gVVlWWSBVWVZZKDgpCisgICAgICAgICAgICAibW92cSAgICAgMjQoJTAsICUlIkZGX1JFR19hIiwgNCksICUlbW0yICAgXG5cdCIgLy8gVVlWWSBVWVZZKDEyKQogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0zICAgXG5cdCIgLy8gVVlWWSBVWVZZKDgpCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTQgICBcblx0IiAvLyBVWVZZIFVZVlkoMTIpCiAgICAgICAgICAgICAicGFuZCAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICBcblx0IiAvLyBVMFYwIFUwVjAoOCkKQEAgLTE1NjIsNyArMTU2Miw3IEBACiAgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAlJW1tMiwgJSVtbTEgICBcblx0IiAvLyBVVlVWIFVWVVYoOCkKICAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICUlbW00LCAlJW1tMyAgIFxuXHQiIC8vIFlZWVkgWVlZWSg4KQogCi0gICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAlJW1tMywgOCglMSwgJSUiUkVHX2EiLCAyKSBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgJSVtbTMsIDgoJTEsICUlIkZGX1JFR19hIiwgMikgXG5cdCIKIAogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgXG5cdCIgLy8gVVZVViBVVlVWKDApCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTMgICBcblx0IiAvLyBVVlVWIFVWVVYoOCkKQEAgLTE1NzMsMjggKzE1NzMsMjggQEAKICAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgIFxuXHQiIC8vIFZWVlYgVlZWVigwKQogICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgXG5cdCIgLy8gVVVVVSBVVVVVKDApCiAKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0wLCAoJTMsICUlIlJFR19hIikgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0yLCAoJTIsICUlIlJFR19hIikgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0wLCAoJTMsICUlIkZGX1JFR19hIikgXG5cdCIKKyAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0yLCAoJTIsICUlIkZGX1JFR19hIikgXG5cdCIKIAotICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgIFxuXHQiCi0gICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAlNCwgJSUiUkVHX2EiICAgXG5cdCIKLSAgICAgICAgICAgICIgamIgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAkOCwgJSUiRkZfUkVHX2EiIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAlNCwgJSUiRkZfUkVHX2EiIFxuXHQiCisgICAgICAgICAgICAiIGpiICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiJyIihzcmMpLCAiciIoeWRzdCksICJyIih1ZHN0KSwgInIiKHZkc3QpLCAiZyIgKGNocm9tV2lkdGgpCi0gICAgICAgICAgICA6ICJtZW1vcnkiLCAiJSJSRUdfYQorICAgICAgICAgICAgOiAibWVtb3J5IiwgIiUiRkZfUkVHX2EKICAgICAgICAgKTsKIAogICAgICAgICB5ZHN0ICs9IGx1bVN0cmlkZTsKICAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CiAKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJ4b3IgICAgICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICAgXG5cdCIKLSAgICAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTAsICUlIlJFR19hIiwgNCkgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgICglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTAgICBcblx0IiAvLyBZVVlWIFlVWVYoMCkKLSAgICAgICAgICAgICJtb3ZxICAgICAgOCglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTEgICBcblx0IiAvLyBZVVlWIFlVWVYoNCkKLSAgICAgICAgICAgICJtb3ZxICAgICAxNiglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTIgICBcblx0IiAvLyBZVVlWIFlVWVYoOCkKLSAgICAgICAgICAgICJtb3ZxICAgICAyNCglMCwgJSUiUkVHX2EiLCA0KSwgJSVtbTMgICBcblx0IiAvLyBZVVlWIFlVWVYoMTIpCisgICAgICAgICAgICAieG9yICAgICAgICAgICUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiICBcblx0IgorICAgICAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTAsICUlIkZGX1JFR19hIiwgNCkgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgICAgKCUwLCAlJSJGRl9SRUdfYSIsIDQpLCAlJW1tMCAgXG5cdCIgLy8gWVVZViBZVVlWKDApCisgICAgICAgICAgICAibW92cSAgICAgIDgoJTAsICUlIkZGX1JFR19hIiwgNCksICUlbW0xICBcblx0IiAvLyBZVVlWIFlVWVYoNCkKKyAgICAgICAgICAgICJtb3ZxICAgICAxNiglMCwgJSUiRkZfUkVHX2EiLCA0KSwgJSVtbTIgIFxuXHQiIC8vIFlVWVYgWVVZVig4KQorICAgICAgICAgICAgIm1vdnEgICAgIDI0KCUwLCAlJSJGRl9SRUdfYSIsIDQpLCAlJW1tMyAgXG5cdCIgLy8gWVVZViBZVVlWKDEyKQogICAgICAgICAgICAgInBzcmx3ICAgICAgICAgICAgICAgICAgJDgsICUlbW0wICAgXG5cdCIgLy8gWTBZMCBZMFkwKDApCiAgICAgICAgICAgICAicHNybHcgICAgICAgICAgICAgICAgICAkOCwgJSVtbTEgICBcblx0IiAvLyBZMFkwIFkwWTAoNCkKICAgICAgICAgICAgICJwc3JsdyAgICAgICAgICAgICAgICAgICQ4LCAlJW1tMiAgIFxuXHQiIC8vIFkwWTAgWTBZMCg4KQpAQCAtMTYwMiwxNSArMTYwMiwxNSBAQAogICAgICAgICAgICAgInBhY2t1c3diICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgXG5cdCIgLy8gWVlZWSBZWVlZKDApCiAgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAlJW1tMywgJSVtbTIgICBcblx0IiAvLyBZWVlZIFlZWVkoOCkKIAotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgJSVtbTAsICAoJTEsICUlIlJFR19hIiwgMikgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICUlbW0yLCA4KCUxLCAlJSJSRUdfYSIsIDIpIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAlJW1tMCwgICglMSwgJSUiRkZfUkVHX2EiLCAyKSBcblx0IgorICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgJSVtbTIsIDgoJTEsICUlIkZGX1JFR19hIiwgMikgXG5cdCIKIAotICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgJDgsICUlIlJFR19hIiAgIFxuXHQiCi0gICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAlNCwgJSUiUkVHX2EiICAgXG5cdCIKLSAgICAgICAgICAgICIgamIgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAkOCwgJSUiRkZfUkVHX2EiIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAlNCwgJSUiRkZfUkVHX2EiIFxuXHQiCisgICAgICAgICAgICAiIGpiICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgIFxuXHQiCiAKICAgICAgICAgICAgIDo6InIiKHNyYyksICJyIih5ZHN0KSwgInIiKHVkc3QpLCAiciIodmRzdCksICJnIiAoY2hyb21XaWR0aCkKLSAgICAgICAgICAgIDogIm1lbW9yeSIsICIlIlJFR19hCisgICAgICAgICAgICA6ICJtZW1vcnkiLCAiJSJGRl9SRUdfYQogICAgICAgICApOwogICAgICAgICB1ZHN0ICs9IGNocm9tU3RyaWRlOwogICAgICAgICB2ZHN0ICs9IGNocm9tU3RyaWRlOwpAQCAtMTY1NSwyMCArMTY1NSwyMCBAQAogICAgICAgICBpbnQgaTsKICAgICAgICAgZm9yIChpPTA7IGk8MjsgaSsrKSB7CiAgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAlMiwgJSUiUkVHX2EiICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgJTIsICUlIkZGX1JFR19hIlxuXHQiCiAgICAgICAgICAgICAgICAgIm1vdnEgICAgICAgICAgIkJHUjJZX0lEWCIoJTMpLCAlJW1tNiAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJtb3ZxICAgICAgICJNQU5HTEUoZmZfdzExMTEpIiwgJSVtbTUgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHhvciAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW03ICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlJSJSRUdfYSIsIDIpLCAlJSJSRUdfZCIgICBcblx0IgorICAgICAgICAgICAgICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiLCAyKSwgJSUiRkZfUkVHX2QiIFxuXHQiCiAgICAgICAgICAgICAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICBQUkVGRVRDSCIgICAgNjQoJTAsICUlIlJFR19kIikgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdmQgICAgICAgICAgKCUwLCAlJSJSRUdfZCIpLCAlJW1tMCAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZkICAgICAgICAgMyglMCwgJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTAsICUlIkZGX1JFR19kIikgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgICAgICAgKCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkICAgICAgMyglMCwgJSUiRkZfUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0wICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZkICAgICAgICAgNiglMCwgJSUiUkVHX2QiKSwgJSVtbTIgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92ZCAgICAgICAgIDkoJTAsICUlIlJFR19kIiksICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgICAgICA2KCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3ZkICAgICAgOSglMCwgJSUiRkZfUkVHX2QiKSwgJSVtbTMgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0yICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMyAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwbWFkZHdkICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTAgICAgICAgXG5cdCIKQEAgLTE2ODYsMTIgKzE2ODYsMTIgQEAKICAgICAgICAgICAgICAgICAicGFja3NzZHcgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0wICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgICAgICQ3LCAlJW1tMCAgICAgICBcblx0IgogCi0gICAgICAgICAgICAgICAgIm1vdmQgICAgICAgIDEyKCUwLCAlJSJSRUdfZCIpLCAlJW1tNCAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZkICAgICAgICAxNSglMCwgJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZCAgICAgMTIoJTAsICUlIkZGX1JFR19kIiksICUlbW00ICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgICAgIDE1KCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTQgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0xICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdmQgICAgICAgIDE4KCUwLCAlJSJSRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3ZkICAgICAgICAyMSglMCwgJSUiUkVHX2QiKSwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ZCAgICAgMTgoJTAsICUlIkZGX1JFR19kIiksICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdmQgICAgIDIxKCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0zICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICUlbW02LCAlJW1tNCAgICAgICBcblx0IgpAQCAtMTcwNiw0MCArMTcwNiw0MCBAQAogICAgICAgICAgICAgICAgICJwYWNrc3NkdyAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW00ICAgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICUlbW01LCAlJW1tMiAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICQyNCwgJSUiUkVHX2QiICAgXG5cdCIKKyAgICAgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAkMjQsICUlIkZGX1JFR19kIlxuXHQiCiAgICAgICAgICAgICAgICAgInBhY2tzc2R3ICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tNCAgICAgICBcblx0IgogICAgICAgICAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAkNywgJSVtbTQgICAgICAgXG5cdCIKIAogICAgICAgICAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICAicGFkZHVzYiAiTUFOR0xFKGZmX2JncjJZT2Zmc2V0KSIsICUlbW0wICAgIFxuXHQiCiAKLSAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTAsICglMSwgJSUiUkVHX2EiKSBcblx0IgotICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAkOCwgICAgICAlJSJSRUdfYSIgIFxuXHQiCi0gICAgICAgICAgICAgICAgIiBqcyAgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgICAgJSVtbTAsICglMSwgJSUiRkZfUkVHX2EiKSBcblx0IgorICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAkOCwgICAgICAlJSJGRl9SRUdfYSIgIFxuXHQiCisgICAgICAgICAgICAgICAgIiBqcyAgICAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICAgICA6IDogInIiIChzcmMrd2lkdGgqMyksICJyIiAoeWRzdCt3aWR0aCksICJnIiAoKHg4Nl9yZWcpLXdpZHRoKSwgInIiKHJnYjJ5dXYpCiAgICAgICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfdzExMTEsZmZfYmdyMllPZmZzZXQpCi0gICAgICAgICAgICAgICAgOiAiJSJSRUdfYSwgIiUiUkVHX2QKKyAgICAgICAgICAgICAgICA6ICIlIkZGX1JFR19hLCAiJSJGRl9SRUdfZAogICAgICAgICAgICAgKTsKICAgICAgICAgICAgIHlkc3QgKz0gbHVtU3RyaWRlOwogICAgICAgICAgICAgc3JjICArPSBzcmNTdHJpZGU7CiAgICAgICAgIH0KICAgICAgICAgc3JjIC09IHNyY1N0cmlkZSoyOwogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICU0LCAlJSJSRUdfYSIgICBcblx0IgorICAgICAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICU0LCAlJSJGRl9SRUdfYSJcblx0IgogICAgICAgICAgICAgIm1vdnEgICAgICAgIk1BTkdMRShmZl93MTExMSkiLCAlJW1tNSAgICAgICBcblx0IgogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgIkJHUjJVX0lEWCIoJTUpLCAlJW1tNiAgICAgICBcblx0IgogICAgICAgICAgICAgInB4b3IgICAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tNyAgICAgICBcblx0IgotICAgICAgICAgICAgImxlYSAoJSUiUkVHX2EiLCAlJSJSRUdfYSIsIDIpLCAlJSJSRUdfZCIgICBcblx0IgotICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgJSUiUkVHX2QiLCAlJSJSRUdfZCIgICBcblx0IgorICAgICAgICAgICAgImxlYSAoJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSIsIDIpLCAlJSJGRl9SRUdfZCIgXG5cdCIKKyAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICUlIkZGX1JFR19kIiwgJSUiRkZfUkVHX2QiXG5cdCIKICAgICAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFBSRUZFVENIIiAgICA2NCglMCwgJSUiUkVHX2QiKSAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFBSRUZFVENIIiAgICA2NCglMSwgJSUiUkVHX2QiKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMCwgJSUiRkZfUkVHX2QiKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMSwgJSUiRkZfUkVHX2QiKSAgICAgICAgICAgICAgXG5cdCIKICNpZiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVCB8fCBDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XCi0gICAgICAgICAgICAibW92cSAgICAgICAgICAoJTAsICUlIlJFR19kIiksICUlbW0wICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAgICAgICAoJTEsICUlIlJFR19kIiksICUlbW0xICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAgICAgIDYoJTAsICUlIlJFR19kIiksICUlbW0yICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAgICAgIDYoJTEsICUlIlJFR19kIiksICUlbW0zICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAoJTAsICUlIkZGX1JFR19kIiksICUlbW0wICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgICAoJTEsICUlIkZGX1JFR19kIiksICUlbW0xICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgIDYoJTAsICUlIkZGX1JFR19kIiksICUlbW0yICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgICAgIDYoJTEsICUlIkZGX1JFR19kIiksICUlbW0zICAgICAgIFxuXHQiCiAgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgIFxuXHQiCiAgICAgICAgICAgICBQQVZHQiIgICAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICAgIFxuXHQiCiAgICAgICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0xICAgICAgIFxuXHQiCkBAIC0xNzUxLDEwICsxNzUxLDEwIEBACiAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0wICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgICAgJSVtbTcsICUlbW0yICAgICAgIFxuXHQiCiAjZWxzZQotICAgICAgICAgICAgIm1vdmQgICAgICAgICAgKCUwLCAlJSJSRUdfZCIpLCAlJW1tMCAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmQgICAgICAgICAgKCUxLCAlJSJSRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmQgICAgICAgICAzKCUwLCAlJSJSRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmQgICAgICAgICAzKCUxLCAlJSJSRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgKCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMCAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgKCUxLCAlJSJGRl9SRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAzKCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAzKCUxLCAlJSJGRl9SRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMCAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICBcblx0IgpAQCAtMTc2MiwxMCArMTc2MiwxMCBAQAogICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICBcblx0IgogICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IgogICAgICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tMCAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmQgICAgICAgICA2KCUwLCAlJSJSRUdfZCIpLCAlJW1tNCAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmQgICAgICAgICA2KCUxLCAlJSJSRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmQgICAgICAgICA5KCUwLCAlJSJSRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmQgICAgICAgICA5KCUxLCAlJSJSRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICA2KCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICA2KCUxLCAlJSJGRl9SRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICA5KCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICA5KCUxLCAlJSJGRl9SRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tNCAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICBcblx0IgpAQCAtMTc5NSwxMCArMTc5NSwxMCBAQAogICAgICAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgICAgICQ3LCAlJW1tMCAgICAgICBcblx0IgogCiAjaWYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgfHwgQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVwotICAgICAgICAgICAgIm1vdnEgICAgICAgIDEyKCUwLCAlJSJSRUdfZCIpLCAlJW1tNCAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAgICAgIDEyKCUxLCAlJSJSRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAgICAgIDE4KCUwLCAlJSJSRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAgICAgIDE4KCUxLCAlJSJSRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgIDEyKCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tNCAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgIDEyKCUxLCAlJSJGRl9SRUdfZCIpLCAlJW1tMSAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgIDE4KCUwLCAlJSJGRl9SRUdfZCIpLCAlJW1tMiAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgIDE4KCUxLCAlJSJGRl9SRUdfZCIpLCAlJW1tMyAgICAgICBcblx0IgogICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tNCAgICAgICBcblx0IgogICAgICAgICAgICAgUEFWR0IiICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICBcblx0IgogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICUlbW00LCAlJW1tMSAgICAgICBcblx0IgpAQCAtMTgxMCwxMCArMTgxMCwxMCBAQAogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tNCAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgICAgICUlbW03LCAlJW1tMiAgICAgICBcblx0IgogI2Vsc2UKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAxMiglMCwgJSUiUkVHX2QiKSwgJSVtbTQgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAxMiglMSwgJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAxNSglMCwgJSUiUkVHX2QiKSwgJSVtbTIgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAxNSglMSwgJSUiUkVHX2QiKSwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAxMiglMCwgJSUiRkZfUkVHX2QiKSwgJSVtbTQgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAxMiglMSwgJSUiRkZfUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAxNSglMCwgJSUiRkZfUkVHX2QiKSwgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAxNSglMSwgJSUiRkZfUkVHX2QiKSwgJSVtbTMgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTQgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIKQEAgLTE4MjEsMTAgKzE4MjEsMTAgQEAKICAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTQgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTIgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTQgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAxOCglMCwgJSUiUkVHX2QiKSwgJSVtbTUgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAxOCglMSwgJSUiUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAyMSglMCwgJSUiUkVHX2QiKSwgJSVtbTIgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAyMSglMSwgJSUiUkVHX2QiKSwgJSVtbTMgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAxOCglMCwgJSUiRkZfUkVHX2QiKSwgJSVtbTUgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAxOCglMSwgJSUiRkZfUkVHX2QiKSwgJSVtbTEgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAyMSglMCwgJSUiRkZfUkVHX2QiKSwgJSVtbTIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkICAgICAyMSglMSwgJSUiRkZfUkVHX2QiKSwgJSVtbTMgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTUgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAgICAlJW1tNywgJSVtbTIgICAgICAgXG5cdCIKQEAgLTE4NTEsNyArMTg1MSw3IEBACiAgICAgICAgICAgICAicGFja3NzZHcgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0xICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW00ICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW0xICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAkMjQsICUlIlJFR19kIiAgIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAkMjQsICUlIkZGX1JFR19kIlxuXHQiCiAgICAgICAgICAgICAicGFja3NzZHcgICAgICAgICAgICAgICAgJSVtbTEsICUlbW00ICAgICAgIFxuXHQiIC8vIFYzIFYyIFUzIFUyCiAgICAgICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAgICAgJDcsICUlbW00ICAgICAgIFxuXHQiCiAKQEAgLTE4NjAsMTQgKzE4NjAsMTQgQEAKICAgICAgICAgICAgICJwdW5wY2toZHEgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTEgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicGFja3Nzd2IgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0wICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInBhZGRiICJNQU5HTEUoZmZfYmdyMlVWT2Zmc2V0KSIsICUlbW0wICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkICAgICAgICAgICAgICAgICAgICAlJW1tMCwgKCUyLCAlJSJSRUdfYSIpIFxuXHQiCi0gICAgICAgICAgICAicHVucGNraGRxICAgICAgICAgICAgICAgJSVtbTAsICUlbW0wICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmQgICAgICAgICAgICAgICAgICAgICUlbW0wLCAoJTMsICUlIlJFR19hIikgXG5cdCIKLSAgICAgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAkNCwgJSUiUkVHX2EiICAgICAgIFxuXHQiCi0gICAgICAgICAgICAiIGpzICAgICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmQgICAgICAgICAgICAgICAgICAgICUlbW0wLCAoJTIsICUlIkZGX1JFR19hIikgXG5cdCIKKyAgICAgICAgICAgICJwdW5wY2toZHEgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZCAgICAgICAgICAgICAgICAgICAgJSVtbTAsICglMywgJSUiRkZfUkVHX2EiKSBcblx0IgorICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICQ0LCAlJSJGRl9SRUdfYSIgICAgICAgXG5cdCIKKyAgICAgICAgICAgICIganMgICAgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgIDogOiAiciIgKHNyYytjaHJvbVdpZHRoKjYpLCAiciIgKHNyYytzcmNTdHJpZGUrY2hyb21XaWR0aCo2KSwgInIiICh1ZHN0K2Nocm9tV2lkdGgpLCAiciIgKHZkc3QrY2hyb21XaWR0aCksICJnIiAoLWNocm9tV2lkdGgpLCAiciIocmdiMnl1dikKICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGZmX3cxMTExLGZmX2JncjJVVk9mZnNldCkKLSAgICAgICAgICAgIDogIiUiUkVHX2EsICIlIlJFR19kCisgICAgICAgICAgICA6ICIlIkZGX1JFR19hLCAiJSJGRl9SRUdfZAogICAgICAgICApOwogCiAgICAgICAgIHVkc3QgKz0gY2hyb21TdHJpZGU7CkBAIC0xODk4LDQ5ICsxODk4LDQ5IEBACiAjaWYgQ09NUElMRV9URU1QTEFURV9TU0UyCiAgICAgICAgICAgICBpZiAoISgoKChpbnRwdHJfdClzcmMxKSB8ICgoaW50cHRyX3Qpc3JjMikgfCAoKGludHB0cl90KWRlc3QpKSYxNSkpIHsKICAgICAgICAgX19hc21fXygKLSAgICAgICAgICAgICJ4b3IgICAgICAgICAgICAgICUlIlJFR19hIiwgJSUiUkVHX2EiICBcblx0IgorICAgICAgICAgICAgInhvciAgICAgICAgICAgICAgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSIgIFxuXHQiCiAgICAgICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMSwgJSUiUkVHX2EiKSAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgUFJFRkVUQ0giIDY0KCUyLCAlJSJSRUdfYSIpICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ZHFhICAgICAoJTEsICUlIlJFR19hIiksICUleG1tMCAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZkcWEgICAgICglMSwgJSUiUkVHX2EiKSwgJSV4bW0xICAgICBcblx0IgotICAgICAgICAgICAgIm1vdmRxYSAgICAgKCUyLCAlJSJSRUdfYSIpLCAlJXhtbTIgICAgIFxuXHQiCisgICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTEsICUlIkZGX1JFR19hIikgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMiwgJSUiRkZfUkVHX2EiKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdmRxYSAgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJXhtbTAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ZHFhICAoJTEsICUlIkZGX1JFR19hIiksICUleG1tMSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3ZkcWEgICglMiwgJSUiRkZfUkVHX2EiKSwgJSV4bW0yICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2xidyAgICAgICAgICAgJSV4bW0yLCAlJXhtbTAgICAgIFxuXHQiCiAgICAgICAgICAgICAicHVucGNraGJ3ICAgICAgICAgICAlJXhtbTIsICUleG1tMSAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZudGRxICAgICAgICAgICAgICUleG1tMCwgICAoJTAsICUlIlJFR19hIiwgMikgICBcblx0IgotICAgICAgICAgICAgIm1vdm50ZHEgICAgICAgICAgICAgJSV4bW0xLCAxNiglMCwgJSUiUkVHX2EiLCAyKSAgIFxuXHQiCi0gICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAkMTYsICUlIlJFR19hIiAgXG5cdCIKLSAgICAgICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICAlMywgJSUiUkVHX2EiICBcblx0IgorICAgICAgICAgICAgIm1vdm50ZHEgICAgICAgICAgICAgJSV4bW0wLCAgICglMCwgJSUiRkZfUkVHX2EiLCAyKSBcblx0IgorICAgICAgICAgICAgIm1vdm50ZHEgICAgICAgICAgICAgJSV4bW0xLCAxNiglMCwgJSUiRkZfUkVHX2EiLCAyKSBcblx0IgorICAgICAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJGRl9SRUdfYSIgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICUzLCAlJSJGRl9SRUdfYSIgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIiBqYiAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiJyIihkZXN0KSwgInIiKHNyYzEpLCAiciIoc3JjMiksICJyIiAoKHg4Nl9yZWcpd2lkdGgtMTUpCi0gICAgICAgICAgICA6ICJtZW1vcnkiLCBYTU1fQ0xPQkJFUlMoInhtbTAiLCAieG1tMSIsICJ4bW0yIiwpICIlIlJFR19hCisgICAgICAgICAgICA6ICJtZW1vcnkiLCBYTU1fQ0xPQkJFUlMoInhtbTAiLCAieG1tMSIsICJ4bW0yIiwpICIlIkZGX1JFR19hCiAgICAgICAgICk7CiAgICAgICAgICAgICB9IGVsc2UKICNlbmRpZgogICAgICAgICBfX2FzbV9fKAotICAgICAgICAgICAgInhvciAlJSJSRUdfYSIsICUlIlJFR19hIiAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAieG9yICUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgUFJFRkVUQ0giIDY0KCUxLCAlJSJSRUdfYSIpICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTIsICUlIlJFR19hIikgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgICglMSwgJSUiUkVHX2EiKSwgJSVtbTAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdnEgICAgICA4KCUxLCAlJSJSRUdfYSIpLCAlJW1tMiAgICAgIFxuXHQiCisgICAgICAgICAgICBQUkVGRVRDSCIgNjQoJTEsICUlIkZGX1JFR19hIikgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFBSRUZFVENIIiA2NCglMiwgJSUiRkZfUkVHX2EiKSAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgKCUxLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgIDgoJTEsICUlIkZGX1JFR19hIiksICUlbW0yICAgICAgXG5cdCIKICAgICAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTEgICAgICBcblx0IgogICAgICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICUlbW0yLCAlJW1tMyAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92cSAgICAgICAoJTIsICUlIlJFR19hIiksICUlbW00ICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3ZxICAgICAgOCglMiwgJSUiUkVHX2EiKSwgJSVtbTUgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdnEgICAgKCUyLCAlJSJGRl9SRUdfYSIpLCAlJW1tNCAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92cSAgIDgoJTIsICUlIkZGX1JFR19hIiksICUlbW01ICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2tsYncgICAgICAgICAgICAlJW1tNCwgJSVtbTAgICAgICBcblx0IgogICAgICAgICAgICAgInB1bnBja2hidyAgICAgICAgICAgICUlbW00LCAlJW1tMSAgICAgIFxuXHQiCiAgICAgICAgICAgICAicHVucGNrbGJ3ICAgICAgICAgICAgJSVtbTUsICUlbW0yICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdW5wY2toYncgICAgICAgICAgICAlJW1tNSwgJSVtbTMgICAgICBcblx0IgotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICUlbW0wLCAgICglMCwgJSUiUkVHX2EiLCAyKSAgIFxuXHQiCi0gICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgJSVtbTEsICA4KCUwLCAlJSJSRUdfYSIsIDIpICAgXG5cdCIKLSAgICAgICAgICAgIE1PVk5UUSIgICAgICAgICAgICAgICAlJW1tMiwgMTYoJTAsICUlIlJFR19hIiwgMikgICBcblx0IgotICAgICAgICAgICAgTU9WTlRRIiAgICAgICAgICAgICAgICUlbW0zLCAyNCglMCwgJSUiUkVHX2EiLCAyKSAgIFxuXHQiCi0gICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAkMTYsICUlIlJFR19hIiAgXG5cdCIKLSAgICAgICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICAlMywgJSUiUkVHX2EiICBcblx0IgotICAgICAgICAgICAgIiBqYiAgICAgICAgICAgICAgICAgICAgIDFiICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgJSVtbTAsICAgKCUwLCAlJSJGRl9SRUdfYSIsIDIpIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgJSVtbTEsICA4KCUwLCAlJSJGRl9SRUdfYSIsIDIpIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgJSVtbTIsIDE2KCUwLCAlJSJGRl9SRUdfYSIsIDIpIFxuXHQiCisgICAgICAgICAgICBNT1ZOVFEiICAgICAgICAgICAgICAgJSVtbTMsIDI0KCUwLCAlJSJGRl9SRUdfYSIsIDIpIFxuXHQiCisgICAgICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAkMTYsICUlIkZGX1JFR19hIiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAgJTMsICUlIkZGX1JFR19hIiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAiIGpiICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiJyIihkZXN0KSwgInIiKHNyYzEpLCAiciIoc3JjMiksICJyIiAoKHg4Nl9yZWcpd2lkdGgtMTUpCi0gICAgICAgICAgICA6ICJtZW1vcnkiLCAiJSJSRUdfYQorICAgICAgICAgICAgOiAibWVtb3J5IiwgIiUiRkZfUkVHX2EKICAgICAgICAgKTsKIAogICAgICAgICB9CkBAIC0xOTYxLDcgKzE5NjEsNyBAQAogI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmICFDT01QSUxFX1RFTVBMQVRFX0FWWCAqLwogCiAjaWYgIUNPTVBJTEVfVEVNUExBVEVfQVZYIHx8IEhBVkVfQVZYX0VYVEVSTkFMCi0jaWYgIUNPTVBJTEVfVEVNUExBVEVfQU1EM0ROT1cgJiYgKEFSQ0hfWDg2XzMyIHx8IENPTVBJTEVfVEVNUExBVEVfU1NFMikgJiYgQ09NUElMRV9URU1QTEFURV9NTVhFWFQgPT0gQ09NUElMRV9URU1QTEFURV9TU0UyICYmIEhBVkVfWUFTTQorI2lmICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmIChBUkNIX1g4Nl8zMiB8fCBDT01QSUxFX1RFTVBMQVRFX1NTRTIpICYmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUID09IENPTVBJTEVfVEVNUExBVEVfU1NFMiAmJiBIQVZFX1g4NkFTTQogdm9pZCBSRU5BTUUoZmZfbnYxMlRvVVYpKHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdW51c2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCkBAIC0yNjAxLDcgKzI2MDEsNyBAQAogICAgIGludGVybGVhdmVCeXRlcyAgICA9IFJFTkFNRShpbnRlcmxlYXZlQnl0ZXMpOwogI2VuZGlmIC8qICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmICFDT01QSUxFX1RFTVBMQVRFX0FWWCAqLwogI2lmICFDT01QSUxFX1RFTVBMQVRFX0FWWCB8fCBIQVZFX0FWWF9FWFRFUk5BTAotI2lmICFDT01QSUxFX1RFTVBMQVRFX0FNRDNETk9XICYmIChBUkNIX1g4Nl8zMiB8fCBDT01QSUxFX1RFTVBMQVRFX1NTRTIpICYmIENPTVBJTEVfVEVNUExBVEVfTU1YRVhUID09IENPTVBJTEVfVEVNUExBVEVfU1NFMiAmJiBIQVZFX1lBU00KKyNpZiAhQ09NUElMRV9URU1QTEFURV9BTUQzRE5PVyAmJiAoQVJDSF9YODZfMzIgfHwgQ09NUElMRV9URU1QTEFURV9TU0UyKSAmJiBDT01QSUxFX1RFTVBMQVRFX01NWEVYVCA9PSBDT01QSUxFX1RFTVBMQVRFX1NTRTIgJiYgSEFWRV9YODZBU00KICAgICBkZWludGVybGVhdmVCeXRlcyAgPSBSRU5BTUUoZGVpbnRlcmxlYXZlQnl0ZXMpOwogI2VuZGlmCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYnN3c2NhbGUveDg2L3JnYl8yX3JnYi5hc20gYi9saWJzd3NjYWxlL3g4Ni9yZ2JfMl9yZ2IuYXNtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNDVlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJzd3NjYWxlL3g4Ni9yZ2JfMl9yZ2IuYXNtCkBAIC0wLDAgKzEsODYgQEAKKzsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKzsqIENvcHlyaWdodCBOaWNrIEt1cnNoZXYKKzsqIENvcHlyaWdodCBNaWNoYWVsIChtaWNoYWVsbmlAZ214LmF0KQorOyogQ29weXJpZ2h0IDIwMTggSm9reW8gSW1hZ2VzCis7KgorOyogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorOyoKKzsqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKzsqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKzsqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorOyogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCis7KgorOyogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCis7KiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorOyogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKzsqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCis7KgorOyogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworOyogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorOyogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCislaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni94ODZ1dGlsLmFzbSIKKworU0VDVElPTl9ST0RBVEEKKworcGJfc2h1ZmZsZTIxMDM6IGRiIDIsIDEsIDAsIDMsIDYsIDUsIDQsIDcsIDEwLCA5LCA4LCAxMSwgMTQsIDEzLCAxMiwgMTUKK3BiX3NodWZmbGUwMzIxOiBkYiAwLCAzLCAyLCAxLCA0LCA3LCA2LCA1LCA4LCAxMSwgMTAsIDksIDEyLCAxNSwgMTQsIDEzCitwYl9zaHVmZmxlMTIzMDogZGIgMSwgMiwgMywgMCwgNSwgNiwgNywgNCwgOSwgMTAsIDExLCA4LCAxMywgMTQsIDE1LCAxMgorcGJfc2h1ZmZsZTMwMTI6IGRiIDMsIDAsIDEsIDIsIDcsIDQsIDUsIDYsIDExLCA4LCA5LCAxMCwgMTUsIDEyLCAxMywgMTQKK3BiX3NodWZmbGUzMjEwOiBkYiAzLCAyLCAxLCAwLCA3LCA2LCA1LCA0LCAxMSwgMTAsIDksIDgsIDE1LCAxNCwgMTMsIDEyCisKK1NFQ1RJT04gLnRleHQKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyBzaHVmZmxlX2J5dGVzXyMjIChjb25zdCB1aW50OF90ICpzcmMsIHVpbnQ4X3QgKmRzdCwgaW50IHNyY19zaXplKQorOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOyAlMS00IGluZGV4IHNodWZmbGUKKyVtYWNybyBTSFVGRkxFX0JZVEVTIDQKK2NnbG9iYWwgc2h1ZmZsZV9ieXRlc18lMSUyJTMlNCwgMywgNSwgMiwgc3JjLCBkc3QsIHcsIHRtcCwgeAorICAgIFZCUk9BRENBU1RJMTI4ICAgIG0wLCBbcGJfc2h1ZmZsZSUxJTIlMyU0XQorICAgIG1vdnN4ZGlmbmlkbiB3cSwgd2QKKyAgICBtb3YgeHEsIHdxCisKKyAgICBhZGQgICAgICAgIHNyY3EsIHdxCisgICAgYWRkICAgICAgICBkc3RxLCB3cQorICAgIG5lZyAgICAgICAgICB3cQorCis7Y2FsYyBzY2FsYXIgbG9vcAorICAgIGFuZCB4cSwgbW1zaXplLTQKKyAgICBqZSAubG9vcF9zaW1kCisKKy5sb29wX3NjYWxhcjoKKyAgIG1vdiAgICAgICAgICB0bXBiLCBbc3JjcSArIHdxICsgJTFdCisgICBtb3YgW2RzdHErd3EgKyAwXSwgdG1wYgorICAgbW92ICAgICAgICAgIHRtcGIsIFtzcmNxICsgd3EgKyAlMl0KKyAgIG1vdiBbZHN0cSt3cSArIDFdLCB0bXBiCisgICBtb3YgICAgICAgICAgdG1wYiwgW3NyY3EgKyB3cSArICUzXQorICAgbW92IFtkc3RxK3dxICsgMl0sIHRtcGIKKyAgIG1vdiAgICAgICAgICB0bXBiLCBbc3JjcSArIHdxICsgJTRdCisgICBtb3YgW2RzdHErd3EgKyAzXSwgdG1wYgorICAgYWRkICAgICAgICAgICAgd3EsIDQKKyAgIHN1YiAgICAgICAgICAgIHhxLCA0CisgICBqZyAubG9vcF9zY2FsYXIKKworO2NoZWNrIGlmIHNyY19zaXplIDwgbW1zaXplCitjbXAgd3EsIDAKK2pnZSAuZW5kCisKKy5sb29wX3NpbWQ6CisgICAgbW92dSAgICAgICAgICAgbTEsIFtzcmNxK3dxXQorICAgIHBzaHVmYiAgICAgICAgIG0xLCBtMAorICAgIG1vdnUgICAgW2RzdHErd3FdLCBtMQorICAgIGFkZCAgICAgICAgICAgIHdxLCBtbXNpemUKKyAgICBqbCAubG9vcF9zaW1kCisKKy5lbmQ6CisgICAgUkVUCislZW5kbWFjcm8KKworSU5JVF9YTU0gc3NzZTMKK1NIVUZGTEVfQllURVMgMiwgMSwgMCwgMworU0hVRkZMRV9CWVRFUyAwLCAzLCAyLCAxCitTSFVGRkxFX0JZVEVTIDEsIDIsIDMsIDAKK1NIVUZGTEVfQllURVMgMywgMCwgMSwgMgorU0hVRkZMRV9CWVRFUyAzLCAyLCAxLCAwCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3g4Ni9zY2FsZS5hc20gYi9saWJzd3NjYWxlL3g4Ni9zY2FsZS5hc20KaW5kZXggN2FmOTJmNy4uODNjYWJmZiAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS94ODYvc2NhbGUuYXNtCisrKyBiL2xpYnN3c2NhbGUveDg2L3NjYWxlLmFzbQpAQCAtMzksMTAgKzM5LDEwIEBACiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICpmaWx0ZXIsCiA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90ICpmaWx0ZXJQb3MsIGludCBmaWx0ZXJTaXplKTsKIDsKLTsgU2NhbGUgb25lIGhvcml6b250YWwgbGluZS4gSW5wdXQgaXMgZWl0aGVyIDgtYml0cyB3aWR0aCBvciAxNi1iaXRzIHdpZHRoCis7IFNjYWxlIG9uZSBob3Jpem9udGFsIGxpbmUuIElucHV0IGlzIGVpdGhlciA4LWJpdCB3aWR0aCBvciAxNi1iaXQgd2lkdGgKIDsgKCRzb3VyY2Vfd2lkdGggY2FuIGJlIGVpdGhlciA4LCA5LCAxMCBvciAxNiwgZGlmZmVyZW5jZSBpcyB3aGV0aGVyIHdlIGhhdmUgdG8KLTsgZG93bnNjYWxlIGJlZm9yZSBtdWx0aXBseWluZykuIEZpbHRlciBpcyAxNC1iaXRzLiBPdXRwdXQgaXMgZWl0aGVyIDE1Yml0cwotOyAoaW4gaW50MTZfdCkgb3IgMTliaXRzIChpbiBpbnQzMl90KSwgYXMgZ2l2ZW4gaW4gJGludGVybWVkaWF0ZV9uYml0cy4gRWFjaAorOyBkb3duc2NhbGUgYmVmb3JlIG11bHRpcGx5aW5nKS4gRmlsdGVyIGlzIDE0IGJpdHMuIE91dHB1dCBpcyBlaXRoZXIgMTUgYml0cworOyAoaW4gaW50MTZfdCkgb3IgMTkgYml0cyAoaW4gaW50MzJfdCksIGFzIGdpdmVuIGluICRpbnRlcm1lZGlhdGVfbmJpdHMuIEVhY2gKIDsgb3V0cHV0IHBpeGVsIGlzIGdlbmVyYXRlZCBmcm9tICRmaWx0ZXJTaXplIGlucHV0IHBpeGVscywgdGhlIHBvc2l0aW9uIG9mCiA7IHRoZSBmaXJzdCBwaXhlbCBpcyBnaXZlbiBpbiBmaWx0ZXJQb3Nbbk91dHB1dFBpeGVsXS4KIDstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzY0LDE1ICszNjQsNyBAQAogICAgIG1vdmQgW2RzdHErd3EqMl0sIG0wCiAlZW5kaWYgOyAlMyA9PS8hPSBYCiAlZWxzZSA7ICUyID09IDE5Ci0laWYgbW1zaXplID09IDgKLSAgICBQTUlOU0RfTU1YICAgIG0wLCBtMiwgbTQKLSVlbGlmIGNwdWZsYWcoc3NlNCkKLSAgICBwbWluc2QgICAgICAgIG0wLCBtMgotJWVsc2UgOyBzc2UyL3Nzc2UzCi0gICAgY3Z0ZHEycHMgICAgICBtMCwgbTAKLSAgICBtaW5wcyAgICAgICAgIG0wLCBtMgotICAgIGN2dHBzMmRxICAgICAgbTAsIG0wCi0lZW5kaWYgOyBtbXgvc3NlMi9zc3NlMy9zc2U0CisgICAgUE1JTlNEICAgICAgICBtMCwgbTIsIG00CiAlaWZuaWRuICUzLCBYCiAgICAgbW92YSBbZHN0cSt3cSooND4+d3NocildLCBtMAogJWVsc2UgOyAlMyA9PSBYCmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3g4Ni9zd3NjYWxlLmMgYi9saWJzd3NjYWxlL3g4Ni9zd3NjYWxlLmMKaW5kZXggNjZhYzdkNS4uN2RjMmQ3MCAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS94ODYvc3dzY2FsZS5jCisrKyBiL2xpYnN3c2NhbGUveDg2L3N3c2NhbGUuYwpAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9hdHRyaWJ1dGVzLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2F2YXNzZXJ0LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgotI2luY2x1ZGUgImxpYmF2dXRpbC94ODYvYXNtLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3g4Ni9jcHUuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY3B1LmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIKQEAgLTU0LDEzICs1MywxMyBAQAogREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIGcxNU1hc2spPSAgIDB4MDNFMDAzRTAwM0UwMDNFMExMOwogREVDTEFSRV9BU01fQ09OU1QoOCwgdWludDY0X3QsIHIxNU1hc2spPSAgIDB4N0MwMDdDMDA3QzAwN0MwMExMOwogCi1ERUNMQVJFX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX00yNEEpICAgICAgICAgPSAweDAwRkYwMDAwRkYwMDAwRkZMTDsKLURFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfTTI0QikgICAgICAgICA9IDB4RkYwMDAwRkYwMDAwRkYwMExMOwotREVDTEFSRV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBmZl9NMjRDKSAgICAgICAgID0gMHgwMDAwRkYwMDAwRkYwMDAwTEw7CitERUNMQVJFX0FTTV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBmZl9NMjRBKSAgICAgICAgID0gMHgwMEZGMDAwMEZGMDAwMEZGTEw7CitERUNMQVJFX0FTTV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBmZl9NMjRCKSAgICAgICAgID0gMHhGRjAwMDBGRjAwMDBGRjAwTEw7CitERUNMQVJFX0FTTV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBmZl9NMjRDKSAgICAgICAgID0gMHgwMDAwRkYwMDAwRkYwMDAwTEw7CiAKLURFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfYmdyMllPZmZzZXQpICA9IDB4MTAxMDEwMTAxMDEwMTAxMFVMTDsKLURFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfYmdyMlVWT2Zmc2V0KSA9IDB4ODA4MDgwODA4MDgwODA4MFVMTDsKLURFQ0xBUkVfQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfdzExMTEpICAgICAgICA9IDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKK0RFQ0xBUkVfQVNNX0FMSUdORUQoOCwgY29uc3QgdWludDY0X3QsIGZmX2JncjJZT2Zmc2V0KSAgPSAweDEwMTAxMDEwMTAxMDEwMTBVTEw7CitERUNMQVJFX0FTTV9BTElHTkVEKDgsIGNvbnN0IHVpbnQ2NF90LCBmZl9iZ3IyVVZPZmZzZXQpID0gMHg4MDgwODA4MDgwODA4MDgwVUxMOworREVDTEFSRV9BU01fQUxJR05FRCg4LCBjb25zdCB1aW50NjRfdCwgZmZfdzExMTEpICAgICAgICA9IDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKIAogCiAvL01NWCB2ZXJzaW9ucwpAQCAtODUsMTggKzg0LDEyIEBACiB7CiAgICAgY29uc3QgaW50IGRzdEg9IGMtPmRzdEg7CiAgICAgY29uc3QgaW50IGZsYWdzPSBjLT5mbGFnczsKLSNpZmRlZiBORVdfRklMVEVSCisKICAgICBTd3NQbGFuZSAqbHVtUGxhbmUgPSAmYy0+c2xpY2VbYy0+bnVtU2xpY2UtMl0ucGxhbmVbMF07CiAgICAgU3dzUGxhbmUgKmNoclVQbGFuZSA9ICZjLT5zbGljZVtjLT5udW1TbGljZS0yXS5wbGFuZVsxXTsKICAgICBTd3NQbGFuZSAqYWxwUGxhbmUgPSAmYy0+c2xpY2VbYy0+bnVtU2xpY2UtMl0ucGxhbmVbM107Ci0jZWxzZQotICAgIGludDE2X3QgKipsdW1QaXhCdWY9IGMtPmx1bVBpeEJ1ZjsKLSAgICBpbnQxNl90ICoqY2hyVVBpeEJ1Zj0gYy0+Y2hyVVBpeEJ1ZjsKLSAgICBpbnQxNl90ICoqYWxwUGl4QnVmPSBjLT5hbHBQaXhCdWY7Ci0gICAgY29uc3QgaW50IHZMdW1CdWZTaXplPSBjLT52THVtQnVmU2l6ZTsKLSAgICBjb25zdCBpbnQgdkNockJ1ZlNpemU9IGMtPnZDaHJCdWZTaXplOwotI2VuZGlmCi0gICAgaW50IGhhc0FscGhhID0gYy0+YWxwUGl4QnVmICE9IE5VTEw7CisKKyAgICBpbnQgaGFzQWxwaGEgPSBjLT5uZWVkQWxwaGE7CiAgICAgaW50MzJfdCAqdkx1bUZpbHRlclBvcz0gYy0+dkx1bUZpbHRlclBvczsKICAgICBpbnQzMl90ICp2Q2hyRmlsdGVyUG9zPSBjLT52Q2hyRmlsdGVyUG9zOwogICAgIGludDE2X3QgKnZMdW1GaWx0ZXI9IGMtPnZMdW1GaWx0ZXI7CkBAIC0xMTcsMjIgKzExMCwxNCBAQAogICAgICAgICBjLT5ncmVlbkRpdGhlcj0gZmZfZGl0aGVyNFtkc3RZJjFdOwogICAgIGMtPnJlZERpdGhlcj0gZmZfZGl0aGVyOFsoZHN0WSsxKSYxXTsKICAgICBpZiAoZHN0WSA8IGRzdEggLSAyKSB7Ci0jaWZkZWYgTkVXX0ZJTFRFUgogICAgICAgICBjb25zdCBpbnQxNl90ICoqbHVtU3JjUHRyICA9IChjb25zdCBpbnQxNl90ICoqKSh2b2lkKikgbHVtUGxhbmUtPmxpbmUgKyBmaXJzdEx1bVNyY1kgLSBsdW1QbGFuZS0+c2xpY2VZOwogICAgICAgICBjb25zdCBpbnQxNl90ICoqY2hyVVNyY1B0ciA9IChjb25zdCBpbnQxNl90ICoqKSh2b2lkKikgY2hyVVBsYW5lLT5saW5lICsgZmlyc3RDaHJTcmNZIC0gY2hyVVBsYW5lLT5zbGljZVk7Ci0gICAgICAgIGNvbnN0IGludDE2X3QgKiphbHBTcmNQdHIgID0gKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgPyAoY29uc3QgaW50MTZfdCAqKikodm9pZCopIGFscFBsYW5lLT5saW5lICsgZmlyc3RMdW1TcmNZIC0gYWxwUGxhbmUtPnNsaWNlWSA6IE5VTEw7Ci0jZWxzZQotICAgICAgICBjb25zdCBpbnQxNl90ICoqbHVtU3JjUHRyPSAoY29uc3QgaW50MTZfdCAqKikodm9pZCopIGx1bVBpeEJ1ZiArIGx1bUJ1ZkluZGV4ICsgZmlyc3RMdW1TcmNZIC0gbGFzdEluTHVtQnVmICsgdkx1bUJ1ZlNpemU7Ci0gICAgICAgIGNvbnN0IGludDE2X3QgKipjaHJVU3JjUHRyPSAoY29uc3QgaW50MTZfdCAqKikodm9pZCopIGNoclVQaXhCdWYgKyBjaHJCdWZJbmRleCArIGZpcnN0Q2hyU3JjWSAtIGxhc3RJbkNockJ1ZiArIHZDaHJCdWZTaXplOwotICAgICAgICBjb25zdCBpbnQxNl90ICoqYWxwU3JjUHRyPSAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYWxwUGl4QnVmKSA/IChjb25zdCBpbnQxNl90ICoqKSh2b2lkKikgYWxwUGl4QnVmICsgbHVtQnVmSW5kZXggKyBmaXJzdEx1bVNyY1kgLSBsYXN0SW5MdW1CdWYgKyB2THVtQnVmU2l6ZSA6IE5VTEw7Ci0jZW5kaWYKKyAgICAgICAgY29uc3QgaW50MTZfdCAqKmFscFNyY1B0ciAgPSAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgaGFzQWxwaGEpID8gKGNvbnN0IGludDE2X3QgKiopKHZvaWQqKSBhbHBQbGFuZS0+bGluZSArIGZpcnN0THVtU3JjWSAtIGFscFBsYW5lLT5zbGljZVkgOiBOVUxMOworCiAgICAgICAgIGludCBpOwogICAgICAgICBpZiAoZmlyc3RMdW1TcmNZIDwgMCB8fCBmaXJzdEx1bVNyY1kgKyB2THVtRmlsdGVyU2l6ZSA+IGMtPnNyY0gpIHsKLSNpZmRlZiBORVdfRklMVEVSCiAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqdG1wWSA9IChjb25zdCBpbnQxNl90ICoqKSBsdW1QbGFuZS0+dG1wOwotI2Vsc2UKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKip0bXBZID0gKGNvbnN0IGludDE2X3QgKiopIGx1bVBpeEJ1ZiArIDIgKiB2THVtQnVmU2l6ZTsKLSNlbmRpZgorCiAgICAgICAgICAgICBpbnQgbmVnID0gLWZpcnN0THVtU3JjWSwgaSwgZW5kID0gRkZNSU4oYy0+c3JjSCAtIGZpcnN0THVtU3JjWSwgdkx1bUZpbHRlclNpemUpOwogICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5lZzsgICAgICAgICAgICBpKyspCiAgICAgICAgICAgICAgICAgdG1wWVtpXSA9IGx1bVNyY1B0cltuZWddOwpAQCAtMTQzLDExICsxMjgsNyBAQAogICAgICAgICAgICAgbHVtU3JjUHRyID0gdG1wWTsKIAogICAgICAgICAgICAgaWYgKGFscFNyY1B0cikgewotI2lmZGVmIE5FV19GSUxURVIKICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqdG1wQSA9IChjb25zdCBpbnQxNl90ICoqKSBhbHBQbGFuZS0+dG1wOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICoqdG1wQSA9IChjb25zdCBpbnQxNl90ICoqKSBhbHBQaXhCdWYgKyAyICogdkx1bUJ1ZlNpemU7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmVnOyAgICAgICAgICAgIGkrKykKICAgICAgICAgICAgICAgICAgICAgdG1wQVtpXSA9IGFscFNyY1B0cltuZWddOwogICAgICAgICAgICAgICAgIGZvciAoICAgICA7IGkgPCBlbmQ7ICAgICAgICAgICAgaSsrKQpAQCAtMTU4LDExICsxMzksNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChmaXJzdENoclNyY1kgPCAwIHx8IGZpcnN0Q2hyU3JjWSArIHZDaHJGaWx0ZXJTaXplID4gYy0+Y2hyU3JjSCkgewotI2lmZGVmIE5FV19GSUxURVIKICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKip0bXBVID0gKGNvbnN0IGludDE2X3QgKiopIGNoclVQbGFuZS0+dG1wOwotI2Vsc2UKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKip0bXBVID0gKGNvbnN0IGludDE2X3QgKiopIGNoclVQaXhCdWYgKyAyICogdkNockJ1ZlNpemU7Ci0jZW5kaWYKICAgICAgICAgICAgIGludCBuZWcgPSAtZmlyc3RDaHJTcmNZLCBpLCBlbmQgPSBGRk1JTihjLT5jaHJTcmNIIC0gZmlyc3RDaHJTcmNZLCB2Q2hyRmlsdGVyU2l6ZSk7CiAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmVnOyAgICAgICAgICAgIGkrKykgewogICAgICAgICAgICAgICAgIHRtcFVbaV0gPSBjaHJVU3JjUHRyW25lZ107CkBAIC0yNDMsMTYgKzIyMCwxNiBAQAogICAgICAgICAibW92ZHFhICAgICAlJXhtbTMsICUleG1tNCBcblx0IiBcCiAgICAgICAgICJtb3ZkcWEgICAgICUleG1tMywgJSV4bW03IFxuXHQiIFwKICAgICAgICAgIm1vdmwgICAgICAgICAgICUzLCAlJWVjeCAgXG5cdCIgXAotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTAsICUlIlJFR19kIiAgXG5cdCJcCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUwLCAlJSJGRl9SRUdfZCIgICAgICAgIFxuXHQiXAorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgKCUlIkZGX1JFR19kIiksICUlIkZGX1JFR19TIiAgICAgXG5cdCJcCiAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICBcblx0IiAvKiBGSVhNRSBVbnJvbGw/ICovXAogICAgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZkZHVwICAgICAgICAgICAgICAgICAgOCglJSJSRUdfZCIpLCAlJXhtbTAgICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKLSAgICAgICAgIm1vdmRxYSAgICAgICAgICAgICAgKCUlIlJFR19TIiwgJSUiUkVHX2MiLCAyKSwgJSV4bW0yICAgICAgXG5cdCIgLyogc3JjRGF0YSAqL1wKLSAgICAgICAgIm1vdmRxYSAgICAgICAgICAgIDE2KCUlIlJFR19TIiwgJSUiUkVHX2MiLCAyKSwgJSV4bW01ICAgICAgXG5cdCIgLyogc3JjRGF0YSAqL1wKLSAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJSRUdfZCIgIFxuXHQiXAotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgKCUlIlJFR19kIiksICUlIlJFR19TIiAgXG5cdCJcCi0gICAgICAgICJ0ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICUlIlJFR19TIiwgJSUiUkVHX1MiICBcblx0IlwKKyAgICAgICAgIm1vdmRkdXAgICAgICAgICAgICAgICAgICA4KCUlIkZGX1JFR19kIiksICUleG1tMCAgIFxuXHQiIC8qIGZpbHRlckNvZWZmICovXAorICAgICAgICAibW92ZHFhICAgICAgICAgICAgICAoJSUiRkZfUkVHX1MiLCAlJSJGRl9SRUdfYyIsIDIpLCAlJXhtbTIgXG5cdCIgLyogc3JjRGF0YSAqL1wKKyAgICAgICAgIm1vdmRxYSAgICAgICAgICAgIDE2KCUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX2MiLCAyKSwgJSV4bW01IFxuXHQiIC8qIHNyY0RhdGEgKi9cCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQxNiwgJSUiRkZfUkVHX2QiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICglJSJGRl9SRUdfZCIpLCAlJSJGRl9SRUdfUyIgICAgIFxuXHQiXAorICAgICAgICAidGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAlJSJGRl9SRUdfUyIsICUlIkZGX1JFR19TIiAgICAgXG5cdCJcCiAgICAgICAgICJwbXVsaHcgICAgICAgICAgICAgICAgICAgICAgICAgICAlJXhtbTAsICUleG1tMiAgICAgIFxuXHQiXAogICAgICAgICAicG11bGh3ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSV4bW0wLCAlJXhtbTUgICAgICBcblx0IlwKICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICUleG1tMiwgJSV4bW0zICAgICAgXG5cdCJcCkBAIC0yNjEsMTMgKzIzOCwxMyBAQAogICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUleG1tMyAgICAgIFxuXHQiXAogICAgICAgICAicHNyYXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDMsICUleG1tNCAgICAgIFxuXHQiXAogICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgICAgICAgICAgJSV4bW00LCAlJXhtbTMgICAgICBcblx0IlwKLSAgICAgICAgIm1vdm50ZHEgICAgICAgICAgICAgICAgICAgICAgICAgICUleG1tMywgKCUxLCAlJSJSRUdfYyIpXG5cdCJcCi0gICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJSRUdfYyIgICAgICAgICBcblx0IlwKLSAgICAgICAgImNtcCAgICAgICAgICAgICAgICAgICAgICAgICAgJTIsICUlIlJFR19jIiAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92bnRkcSAgICAgICAgICAgICAgICAgICAgICAgICAgJSV4bW0zLCAoJTEsICUlIkZGX1JFR19jIikgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJGRl9SRUdfYyIgICAgICAgIFxuXHQiXAorICAgICAgICAiY21wICAgICAgICAgICAgICAgICAgICAgICAgICAlMiwgJSUiRkZfUkVHX2MiICAgICAgICBcblx0IlwKICAgICAgICAgIm1vdmRxYSAgICAgICAgICAgICAgICAgICAlJXhtbTcsICUleG1tMyAgICAgICAgICAgIFxuXHQiIFwKICAgICAgICAgIm1vdmRxYSAgICAgICAgICAgICAgICAgICAlJXhtbTcsICUleG1tNCAgICAgICAgICAgIFxuXHQiIFwKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUwLCAlJSJSRUdfZCIgIFxuXHQiXAotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgKCUlIlJFR19kIiksICUlIlJFR19TIiAgXG5cdCJcCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMCwgJSUiRkZfUkVHX2QiICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICglJSJGRl9SRUdfZCIpLCAlJSJGRl9SRUdfUyIgICAgIFxuXHQiXAogICAgICAgICAiamIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMWIgICAgICAgICAgICAgXG5cdCIKIAogICAgIGlmIChvZmZzZXQpIHsKQEAgLTI4Miw3ICsyNTksNyBAQAogICAgICAgICAgICAgICAiciIgKGRlc3Qtb2Zmc2V0KSwgImciICgoeDg2X3JlZykoZHN0VytvZmZzZXQpKSwgIm0iIChvZmZzZXQpLAogICAgICAgICAgICAgICAibSIoZmlsdGVyU2l6ZSksICJtIigoKHVpbnQ2NF90ICopIGRpdGhlcilbMF0pCiAgICAgICAgICAgICAgIDogWE1NX0NMT0JCRVJTKCIleG1tMCIgLCAiJXhtbTEiICwgIiV4bW0yIiAsICIleG1tMyIgLCAiJXhtbTQiICwgIiV4bW01IiAsICIleG1tNyIgLCkKLSAgICAgICAgICAgICAgICAiJSJSRUdfZCwgIiUiUkVHX1MsICIlIlJFR19jCisgICAgICAgICAgICAgICAgIiUiRkZfUkVHX2QsICIlIkZGX1JFR19TLCAiJSJGRl9SRUdfYwogICAgICAgICAgICAgICApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCkBAIC0yOTIsNyArMjY5LDcgQEAKICAgICAgICAgICAgICAgInIiIChkZXN0LW9mZnNldCksICJnIiAoKHg4Nl9yZWcpKGRzdFcrb2Zmc2V0KSksICJtIiAob2Zmc2V0KSwKICAgICAgICAgICAgICAgIm0iKGZpbHRlclNpemUpLCAibSIoKCh1aW50NjRfdCAqKSBkaXRoZXIpWzBdKQogICAgICAgICAgICAgICA6IFhNTV9DTE9CQkVSUygiJXhtbTAiICwgIiV4bW0xIiAsICIleG1tMiIgLCAiJXhtbTMiICwgIiV4bW00IiAsICIleG1tNSIgLCAiJXhtbTciICwpCi0gICAgICAgICAgICAgICAgIiUiUkVHX2QsICIlIlJFR19TLCAiJSJSRUdfYworICAgICAgICAgICAgICAgICIlIkZGX1JFR19kLCAiJSJGRl9SRUdfUywgIiUiRkZfUkVHX2MKICAgICAgICAgICAgICAgKTsKICAgICB9CiB9CkBAIC00NTIsMTQgKzQyOSwxNCBAQAogI2RlZmluZSBBU1NJR05fVlNDQUxFWF9GVU5DKHZzY2FsZWZuLCBvcHQsIGRvXzE2X2Nhc2UsIGNvbmRpdGlvbl84Yml0KSBcCiBzd2l0Y2goYy0+ZHN0QnBjKXsgXAogICAgIGNhc2UgMTY6ICAgICAgICAgICAgICAgICAgICAgICAgICBkb18xNl9jYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IFwKLSAgICBjYXNlIDEwOiBpZiAoIWlzQkUoYy0+ZHN0Rm9ybWF0KSkgdnNjYWxlZm4gPSBmZl95dXYycGxhbmVYXzEwXyAjIyBvcHQ7IGJyZWFrOyBcCisgICAgY2FzZSAxMDogaWYgKCFpc0JFKGMtPmRzdEZvcm1hdCkgJiYgYy0+ZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfUDAxMExFKSB2c2NhbGVmbiA9IGZmX3l1djJwbGFuZVhfMTBfICMjIG9wdDsgYnJlYWs7IFwKICAgICBjYXNlIDk6ICBpZiAoIWlzQkUoYy0+ZHN0Rm9ybWF0KSkgdnNjYWxlZm4gPSBmZl95dXYycGxhbmVYXzlfICAjIyBvcHQ7IGJyZWFrOyBcCiAgICAgY2FzZSA4OiBpZiAoKGNvbmRpdGlvbl84Yml0KSAmJiAhYy0+dXNlX21teF92ZmlsdGVyKSB2c2NhbGVmbiA9IGZmX3l1djJwbGFuZVhfOF8gICMjIG9wdDsgYnJlYWs7IFwKICAgICB9CiAjZGVmaW5lIEFTU0lHTl9WU0NBTEVfRlVOQyh2c2NhbGVmbiwgb3B0MSwgb3B0Miwgb3B0MmNoaykgXAogICAgIHN3aXRjaChjLT5kc3RCcGMpeyBcCiAgICAgY2FzZSAxNjogaWYgKCFpc0JFKGMtPmRzdEZvcm1hdCkpICAgICAgICAgICAgdnNjYWxlZm4gPSBmZl95dXYycGxhbmUxXzE2XyAjIyBvcHQxOyBicmVhazsgXAotICAgIGNhc2UgMTA6IGlmICghaXNCRShjLT5kc3RGb3JtYXQpICYmIG9wdDJjaGspIHZzY2FsZWZuID0gZmZfeXV2MnBsYW5lMV8xMF8gIyMgb3B0MjsgYnJlYWs7IFwKKyAgICBjYXNlIDEwOiBpZiAoIWlzQkUoYy0+ZHN0Rm9ybWF0KSAmJiBjLT5kc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9QMDEwTEUgJiYgb3B0MmNoaykgdnNjYWxlZm4gPSBmZl95dXYycGxhbmUxXzEwXyAjIyBvcHQyOyBicmVhazsgXAogICAgIGNhc2UgOTogIGlmICghaXNCRShjLT5kc3RGb3JtYXQpICYmIG9wdDJjaGspIHZzY2FsZWZuID0gZmZfeXV2MnBsYW5lMV85XyAgIyMgb3B0MjsgIGJyZWFrOyBcCiAgICAgY2FzZSA4OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjYWxlZm4gPSBmZl95dXYycGxhbmUxXzhfICAjIyBvcHQxOyAgYnJlYWs7IFwKICAgICBkZWZhdWx0OiBhdl9hc3NlcnQwKGMtPmRzdEJwYz44KTsgXApAQCAtNDc5LDcgKzQ1Niw3IEBACiAgICAgICAgIHN3aXRjaCAoYy0+c3JjRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZQTg6CiAgICAgICAgICAgICBjLT5sdW1Ub1lWMTIgPSBmZl95dXl2VG9ZX21teDsKLSAgICAgICAgICAgIGlmIChjLT5hbHBQaXhCdWYpCisgICAgICAgICAgICBpZiAoYy0+bmVlZEFscGhhKQogICAgICAgICAgICAgICAgIGMtPmFscFRvWVYxMiA9IGZmX3V5dnlUb1lfbW14OwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZVVlWNDIyOgpAQCAtNTI4LDcgKzUwNSw3IEBACiAgICAgICAgIHN3aXRjaCAoYy0+c3JjRm9ybWF0KSB7CiAgICAgICAgIGNhc2UgQVZfUElYX0ZNVF9ZQTg6CiAgICAgICAgICAgICBjLT5sdW1Ub1lWMTIgPSBmZl95dXl2VG9ZX3NzZTI7Ci0gICAgICAgICAgICBpZiAoYy0+YWxwUGl4QnVmKQorICAgICAgICAgICAgaWYgKGMtPm5lZWRBbHBoYSkKICAgICAgICAgICAgICAgICBjLT5hbHBUb1lWMTIgPSBmZl91eXZ5VG9ZX3NzZTI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVl9QSVhfRk1UX1lVWVY0MjI6CmRpZmYgLS1naXQgYS9saWJzd3NjYWxlL3g4Ni9zd3NjYWxlX3RlbXBsYXRlLmMgYi9saWJzd3NjYWxlL3g4Ni9zd3NjYWxlX3RlbXBsYXRlLmMKaW5kZXggYmJkYTZkMC4uYjhiZGNkNCAxMDA2NDQKLS0tIGEvbGlic3dzY2FsZS94ODYvc3dzY2FsZV90ZW1wbGF0ZS5jCisrKyBiL2xpYnN3c2NhbGUveDg2L3N3c2NhbGVfdGVtcGxhdGUuYwpAQCAtODgsMTYgKzg4LDE2IEBACiAgICAgICAgICJtb3ZxICAgICUlbW0zLCAlJW1tNlxuXHQiCiAgICAgICAgICJtb3ZxICAgICUlbW00LCAlJW1tN1xuXHQiCiAgICAgICAgICJtb3ZsICUzLCAlJWVjeFxuXHQiCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMCwgJSUiUkVHX2QiICBcblx0IlwKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICglJSJSRUdfZCIpLCAlJSJSRUdfUyIgIFxuXHQiXAotICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgXG5cdCIgLyogRklYTUUgVW5yb2xsPyAqL1wKLSAgICAgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICA4KCUlIlJFR19kIiksICUlbW0wICAgICAgXG5cdCIgLyogZmlsdGVyQ29lZmYgKi9cCi0gICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICglJSJSRUdfUyIsICUlIlJFR19jIiwgMiksICUlbW0yICAgICAgXG5cdCIgLyogc3JjRGF0YSAqL1wKLSAgICAgICAgIm1vdnEgICAgICAgICAgICAgICA4KCUlIlJFR19TIiwgJSUiUkVHX2MiLCAyKSwgJSVtbTUgICAgICBcblx0IiAvKiBzcmNEYXRhICovXAotICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMTYsICUlIlJFR19kIiAgXG5cdCJcCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICBcblx0IlwKLSAgICAgICAgInRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgIFxuXHQiXAorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTAsICUlIkZGX1JFR19kIiAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICglJSJGRl9SRUdfZCIpLCAlJSJGRl9SRUdfUyIgICAgXG5cdCJcCisgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgIFxuXHQiIC8qIEZJWE1FIFVucm9sbD8gKi9cCisgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgICA4KCUlIkZGX1JFR19kIiksICUlbW0wICAgICAgICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKKyAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgKCUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX2MiLCAyKSwgJSVtbTIgXG5cdCIgLyogc3JjRGF0YSAqL1wKKyAgICAgICAgIm1vdnEgICAgICAgICAgICAgICA4KCUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX2MiLCAyKSwgJSVtbTUgXG5cdCIgLyogc3JjRGF0YSAqL1wKKyAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJGRl9SRUdfZCIgICAgICAgXG5cdCJcCisgICAgICAgICJtb3YgICAgICAgICAgICAgICAgICAgICAgICAoJSUiRkZfUkVHX2QiKSwgJSUiRkZfUkVHX1MiICAgIFxuXHQiXAorICAgICAgICAidGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAlJSJGRl9SRUdfUyIsICUlIkZGX1JFR19TIiAgICBcblx0IlwKICAgICAgICAgInBtdWxodyAgICAgICAgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMiAgICAgIFxuXHQiXAogICAgICAgICAicG11bGh3ICAgICAgICAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW01ICAgICAgXG5cdCJcCiAgICAgICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTMgICAgICBcblx0IlwKQEAgLTEwNiw2MiArMTA2LDYyIEBACiAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMywgJSVtbTMgICAgICBcblx0IlwKICAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQzLCAlJW1tNCAgICAgIFxuXHQiXAogICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAgICAgICAgICAgICAgJSVtbTQsICUlbW0zICAgICAgXG5cdCIKLSAgICAgICAgTU9WTlRRMiAiICAgICAgICAgICAgICAgICAgICAgICAgICUlbW0zLCAoJTEsICUlIlJFR19jIilcblx0IgotICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAkOCwgJSUiUkVHX2MiICAgICAgICAgXG5cdCJcCi0gICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICAgICAgICUyLCAlJSJSRUdfYyIgICAgICAgICBcblx0IlwKKyAgICAgICAgTU9WTlRRMiAiICAgICAgICAgICAgICAgICAgICAgICAgICUlbW0zLCAoJTEsICUlIkZGX1JFR19jIilcblx0IgorICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAkOCwgJSUiRkZfUkVHX2MiICAgICAgXG5cdCJcCisgICAgICAgICJjbXAgICAgICAgICAgICAgICAgICAgICAgICAgICUyLCAlJSJGRl9SRUdfYyIgICAgICBcblx0IlwKICAgICAgICAgIm1vdnEgICAgJSVtbTYsICUlbW0zXG5cdCIKICAgICAgICAgIm1vdnEgICAgJSVtbTcsICUlbW00XG5cdCIKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUwLCAlJSJSRUdfZCIgIFxuXHQiXAotICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgKCUlIlJFR19kIiksICUlIlJFR19TIiAgXG5cdCJcCi0gICAgICAgICJqYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICBcblx0IlwKKyAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUwLCAlJSJGRl9SRUdfZCIgICAgIFxuXHQiXAorICAgICAgICAibW92ICAgICAgICAgICAgICAgICAgICAgICAgKCUlIkZGX1JFR19kIiksICUlIkZGX1JFR19TIiAgXG5cdCJcCisgICAgICAgICJqYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxYiAgICAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgOjogImciIChmaWx0ZXIpLAogICAgICAgICAgICAiciIgKGRlc3Qtb2Zmc2V0KSwgImciICgoeDg2X3JlZykoZHN0VytvZmZzZXQpKSwgIm0iIChvZmZzZXQpCi0gICAgICAgIDogIiUiUkVHX2QsICIlIlJFR19TLCAiJSJSRUdfYworICAgICAgICA6ICIlIkZGX1JFR19kLCAiJSJGRl9SRUdfUywgIiUiRkZfUkVHX2MKICAgICApOwogfQogCiAjZGVmaW5lIFlTQ0FMRVlVVjJQQUNLRURYX1VWIFwKICAgICBfX2FzbV9fIHZvbGF0aWxlKFwKLSAgICAgICAgInhvciAgICAgICAgICAgICAgICAgICAlJSJSRUdfYSIsICUlIlJFR19hIiAgICAgXG5cdCJcCisgICAgICAgICJ4b3IgICAgICAgICAgICAgICAgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSIgIFxuXHQiXAogICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgIm5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibGVhICJDSFJfTU1YX0ZJTFRFUl9PRkZTRVQiKCUwKSwgJSUiUkVHX2QiICAgICBcblx0IlwKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgKCUlIlJFR19kIiksICUlIlJFR19TIiAgICAgXG5cdCJcCisgICAgICAgICJsZWEgIkNIUl9NTVhfRklMVEVSX09GRlNFVCIoJTApLCAlJSJGRl9SRUdfZCIgIFxuXHQiXAorICAgICAgICAibW92ICAgICAgICAgICAgICAoJSUiRkZfUkVHX2QiKSwgJSUiRkZfUkVHX1MiICBcblx0IlwKICAgICAgICAgIm1vdnEgICAgICAiVlJPVU5ERVJfT0ZGU0VUIiglMCksICUlbW0zICAgICAgICAgXG5cdCJcCiAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tNCAgICAgICAgIFxuXHQiXAogICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgICAgICJtb3ZxICAgICAgICAgICAgICAgOCglJSJSRUdfZCIpLCAlJW1tMCAgICAgICAgIFxuXHQiIC8qIGZpbHRlckNvZWZmICovXAotICAgICAgICAibW92cSAgICAgKCUlIlJFR19TIiwgJSUiUkVHX2EiKSwgJSVtbTIgICAgICAgICBcblx0IiAvKiBVc3JjRGF0YSAqL1wKLSAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgJTYsICUlIlJFR19TIiAgICAgXG5cdCIgXAotICAgICAgICAibW92cSAgICAgKCUlIlJFR19TIiwgJSUiUkVHX2EiKSwgJSVtbTUgICAgICAgICBcblx0IiAvKiBWc3JjRGF0YSAqL1wKLSAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICAkMTYsICUlIlJFR19kIiAgICAgXG5cdCJcCi0gICAgICAgICJtb3YgICAgICAgICAgICAgICAgICglJSJSRUdfZCIpLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICAgICAibW92cSAgICAgICAgICAgIDgoJSUiRkZfUkVHX2QiKSwgJSVtbTAgICAgICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKKyAgICAgICAgIm1vdnEgICglJSJGRl9SRUdfUyIsICUlIkZGX1JFR19hIiksICUlbW0yICAgICAgXG5cdCIgLyogVXNyY0RhdGEgKi9cCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICU2LCAlJSJGRl9SRUdfUyIgIFxuXHQiIFwKKyAgICAgICAgIm1vdnEgICglJSJGRl9SRUdfUyIsICUlIkZGX1JFR19hIiksICUlbW01ICAgICAgXG5cdCIgLyogVnNyY0RhdGEgKi9cCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJGRl9SRUdfZCIgIFxuXHQiXAorICAgICAgICAibW92ICAgICAgICAgICAgICAoJSUiRkZfUkVHX2QiKSwgJSUiRkZfUkVHX1MiICBcblx0IlwKICAgICAgICAgInBtdWxodyAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0yICAgICAgICAgXG5cdCJcCiAgICAgICAgICJwbXVsaHcgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tNSAgICAgICAgIFxuXHQiXAogICAgICAgICAicGFkZHcgICAgICAgICAgICAgICAgICAgICAlJW1tMiwgJSVtbTMgICAgICAgICBcblx0IlwKICAgICAgICAgInBhZGR3ICAgICAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW00ICAgICAgICAgXG5cdCJcCi0gICAgICAgICJ0ZXN0ICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICAgICAidGVzdCAgICAgICAgICAgICAgICUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX1MiICBcblx0IlwKICAgICAgICAgIiBqbnogICAgICAgICAgICAgICAgICAgICAgICAgMmIgICAgICAgICAgICAgICAgXG5cdCJcCiAKICNkZWZpbmUgWVNDQUxFWVVWMlBBQ0tFRFhfWUEob2Zmc2V0LGNvZWZmLHNyYzEsc3JjMixkc3QxLGRzdDIpIFwKLSAgICAibGVhICAgICAgICAgICAgICAgICJvZmZzZXQiKCUwKSwgJSUiUkVHX2QiICAgICBcblx0IlwKLSAgICAibW92ICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICAgICBcblx0IlwKKyAgICAibGVhICAgICAgICAgICAgICAgICJvZmZzZXQiKCUwKSwgJSUiRkZfUkVHX2QiICBcblx0IlwKKyAgICAibW92ICAgICAgICAgICAgICAoJSUiRkZfUkVHX2QiKSwgJSUiRkZfUkVHX1MiICBcblx0IlwKICAgICAibW92cSAgICAgICJWUk9VTkRFUl9PRkZTRVQiKCUwKSwgIiNkc3QxIiAgICAgICBcblx0IlwKICAgICAibW92cSAgICAgICAgICAgICAgICAgICAgIiNkc3QxIiwgIiNkc3QyIiAgICAgICBcblx0IlwKICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICBcblx0IlwKICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAibW92cSAgICAgICAgICAgICAgIDgoJSUiUkVHX2QiKSwgIiNjb2VmZiIgICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKLSAgICAibW92cSAgKCUlIlJFR19TIiwgJSUiUkVHX2EiLCAyKSwgIiNzcmMxIiAgICAgICBcblx0IiAvKiBZMXNyY0RhdGEgKi9cCi0gICAgIm1vdnEgOCglJSJSRUdfUyIsICUlIlJFR19hIiwgMiksICIjc3JjMiIgICAgICAgXG5cdCIgLyogWTJzcmNEYXRhICovXAotICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJSRUdfZCIgICAgICAgICAgICBcblx0IlwKLSAgICAibW92ICAgICAgICAgICAgICAgICAoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICAgICBcblx0IlwKKyAgICAibW92cSAgICAgICAgICAgIDgoJSUiRkZfUkVHX2QiKSwgIiNjb2VmZiIgICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKKyAgICAibW92cSAgKCUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX2EiLCAyKSwgIiNzcmMxIiBcblx0IiAvKiBZMXNyY0RhdGEgKi9cCisgICAgIm1vdnEgOCglJSJGRl9SRUdfUyIsICUlIkZGX1JFR19hIiwgMiksICIjc3JjMiIgXG5cdCIgLyogWTJzcmNEYXRhICovXAorICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgJDE2LCAlJSJGRl9SRUdfZCIgIFxuXHQiXAorICAgICJtb3YgICAgICAgICAgICAgICglJSJGRl9SRUdfZCIpLCAlJSJGRl9SRUdfUyIgIFxuXHQiXAogICAgICJwbXVsaHcgICAgICAgICAgICAgICAgICIjY29lZmYiLCAiI3NyYzEiICAgICAgIFxuXHQiXAogICAgICJwbXVsaHcgICAgICAgICAgICAgICAgICIjY29lZmYiLCAiI3NyYzIiICAgICAgIFxuXHQiXAogICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAiI3NyYzEiLCAiI2RzdDEiICAgICAgIFxuXHQiXAogICAgICJwYWRkdyAgICAgICAgICAgICAgICAgICAiI3NyYzIiLCAiI2RzdDIiICAgICAgIFxuXHQiXAotICAgICJ0ZXN0ICAgICAgICAgICAgICAgICAgJSUiUkVHX1MiLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICJ0ZXN0ICAgICAgICAgICAgICAgJSUiRkZfUkVHX1MiLCAlJSJGRl9SRUdfUyIgIFxuXHQiXAogICAgICIgam56ICAgICAgICAgICAgICAgICAgICAgICAgIDJiICAgICAgICAgICAgICAgIFxuXHQiXAogCiAjZGVmaW5lIFlTQ0FMRVlVVjJQQUNLRURYIFwKQEAgLTE3Myw0MSArMTczLDQxIEBACiAgICAgICAgICAgICAibSIgKGR1bW15KSwgIm0iIChkdW1teSksICJtIiAoZHVtbXkpLFwKICAgICAgICAgICAgICJyIiAoZGVzdCksICJtIiAoZHN0V19yZWcpLCAibSIodXZfb2ZmKSBcCiAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYkY4LGJGQykgXAotICAgICAgICA6ICIlIlJFR19hLCAiJSJSRUdfZCwgIiUiUkVHX1MgICAgICAgICAgICBcCisgICAgICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19kLCAiJSJGRl9SRUdfUyAgICAgICAgICAgIFwKICAgICApOwogCiAjZGVmaW5lIFlTQ0FMRVlVVjJQQUNLRURYX0FDQ1VSQVRFX1VWIFwKICAgICBfX2FzbV9fIHZvbGF0aWxlKFwKLSAgICAgICAgInhvciAlJSJSRUdfYSIsICUlIlJFR19hIiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCisgICAgICAgICJ4b3IgJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSIgICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAiLnAyYWxpZ24gICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgICAgICAgICBcblx0IlwKICAgICAgICAgIm5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiXAotICAgICAgICAibGVhICJDSFJfTU1YX0ZJTFRFUl9PRkZTRVQiKCUwKSwgJSUiUkVHX2QiICAgICBcblx0IlwKLSAgICAgICAgIm1vdiAgICAgICAgICAgICAgICAgKCUlIlJFR19kIiksICUlIlJFR19TIiAgICAgXG5cdCJcCisgICAgICAgICJsZWEgIkNIUl9NTVhfRklMVEVSX09GRlNFVCIoJTApLCAlJSJGRl9SRUdfZCIgIFxuXHQiXAorICAgICAgICAibW92ICAgICAgICAgICAgICAoJSUiRkZfUkVHX2QiKSwgJSUiRkZfUkVHX1MiICBcblx0IlwKICAgICAgICAgInB4b3IgICAgICAgICAgICAgICAgICAgICAgJSVtbTQsICUlbW00ICAgICAgICAgXG5cdCJcCiAgICAgICAgICJweG9yICAgICAgICAgICAgICAgICAgICAgICUlbW01LCAlJW1tNSAgICAgICAgIFxuXHQiXAogICAgICAgICAicHhvciAgICAgICAgICAgICAgICAgICAgICAlJW1tNiwgJSVtbTYgICAgICAgICBcblx0IlwKICAgICAgICAgInB4b3IgICAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW03ICAgICAgICAgXG5cdCJcCiAgICAgICAgICIucDJhbGlnbiAgICAgICAgICAgICAgICAgICAgICA0ICAgICAgICAgICAgICAgIFxuXHQiXAogICAgICAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgICAgICglJSJSRUdfUyIsICUlIlJFR19hIiksICUlbW0wICAgICAgICAgXG5cdCIgLyogVXNyY0RhdGEgKi9cCi0gICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICU2LCAlJSJSRUdfUyIgICAgICBcblx0IiBcCi0gICAgICAgICJtb3ZxICAgICAoJSUiUkVHX1MiLCAlJSJSRUdfYSIpLCAlJW1tMiAgICAgICAgIFxuXHQiIC8qIFZzcmNEYXRhICovXAotICAgICAgICAibW92ICJTVFIoQVBDS19QVFIyKSIoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgICAgICglJSJSRUdfUyIsICUlIlJFR19hIiksICUlbW0xICAgICAgICAgXG5cdCIgLyogVXNyY0RhdGEgKi9cCisgICAgICAgICJtb3ZxICAoJSUiRkZfUkVHX1MiLCAlJSJGRl9SRUdfYSIpLCAlJW1tMCAgICAgIFxuXHQiIC8qIFVzcmNEYXRhICovXAorICAgICAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAlNiwgJSUiRkZfUkVHX1MiICBcblx0IiBcCisgICAgICAgICJtb3ZxICAoJSUiRkZfUkVHX1MiLCAlJSJGRl9SRUdfYSIpLCAlJW1tMiAgICAgIFxuXHQiIC8qIFZzcmNEYXRhICovXAorICAgICAgICAibW92ICJTVFIoQVBDS19QVFIyKSIoJSUiRkZfUkVHX2QiKSwgJSUiRkZfUkVHX1MiIFxuXHQiXAorICAgICAgICAibW92cSAgKCUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX2EiKSwgJSVtbTEgICAgICBcblx0IiAvKiBVc3JjRGF0YSAqL1wKICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICAgJSVtbTAsICUlbW0zICAgICAgICAgXG5cdCJcCiAgICAgICAgICJwdW5wY2tsd2QgICAgICAgICAgICAgICAgICUlbW0xLCAlJW1tMCAgICAgICAgIFxuXHQiXAogICAgICAgICAicHVucGNraHdkICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTMgICAgICAgICBcblx0IlwKLSAgICAgICAgIm1vdnEgIlNUUihBUENLX0NPRUYpIiglJSJSRUdfZCIpLCUlbW0xICAgICAgICAgXG5cdCIgLyogZmlsdGVyQ29lZmYgKi9cCisgICAgICAgICJtb3ZxICJTVFIoQVBDS19DT0VGKSIoJSUiRkZfUkVHX2QiKSwlJW1tMSAgICAgIFxuXHQiIC8qIGZpbHRlckNvZWZmICovXAogICAgICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgICAlJW1tMSwgJSVtbTAgICAgICAgICBcblx0IlwKICAgICAgICAgInBtYWRkd2QgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0zICAgICAgICAgXG5cdCJcCiAgICAgICAgICJwYWRkZCAgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tNCAgICAgICAgIFxuXHQiXAogICAgICAgICAicGFkZGQgICAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTUgICAgICAgICBcblx0IlwKLSAgICAgICAgImFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgJTYsICUlIlJFR19TIiAgICAgIFxuXHQiIFwKLSAgICAgICAgIm1vdnEgICAgICglJSJSRUdfUyIsICUlIlJFR19hIiksICUlbW0zICAgICAgICAgXG5cdCIgLyogVnNyY0RhdGEgKi9cCi0gICAgICAgICJtb3YgIlNUUihBUENLX1NJWkUpIiglJSJSRUdfZCIpLCAlJSJSRUdfUyIgICAgIFxuXHQiXAotICAgICAgICAiYWRkICAgICAgICAgICAkIlNUUihBUENLX1NJWkUpIiwgJSUiUkVHX2QiICAgICBcblx0IlwKLSAgICAgICAgInRlc3QgICAgICAgICAgICAgICAgICAlJSJSRUdfUyIsICUlIlJFR19TIiAgICAgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICU2LCAlJSJGRl9SRUdfUyIgIFxuXHQiIFwKKyAgICAgICAgIm1vdnEgICglJSJGRl9SRUdfUyIsICUlIkZGX1JFR19hIiksICUlbW0zICAgICAgXG5cdCIgLyogVnNyY0RhdGEgKi9cCisgICAgICAgICJtb3YgIlNUUihBUENLX1NJWkUpIiglJSJGRl9SRUdfZCIpLCAlJSJGRl9SRUdfUyIgXG5cdCJcCisgICAgICAgICJhZGQgICAgICAgICAgICQiU1RSKEFQQ0tfU0laRSkiLCAlJSJGRl9SRUdfZCIgIFxuXHQiXAorICAgICAgICAidGVzdCAgICAgICAgICAgICAgICUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX1MiICBcblx0IlwKICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0wICAgICAgICAgXG5cdCJcCiAgICAgICAgICJwdW5wY2tsd2QgICAgICAgICAgICAgICAgICUlbW0zLCAlJW1tMiAgICAgICAgIFxuXHQiXAogICAgICAgICAicHVucGNraHdkICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTAgICAgICAgICBcblx0IlwKQEAgLTIyOSwzMCArMjI5LDMwIEBACiAgICAgICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgICUlbW02LCAiVl9URU1QIiglMCkgIFxuXHQiXAogCiAjZGVmaW5lIFlTQ0FMRVlVVjJQQUNLRURYX0FDQ1VSQVRFX1lBKG9mZnNldCkgXAotICAgICJsZWEgICAgICAgICAgICAgICAgIm9mZnNldCIoJTApLCAlJSJSRUdfZCIgICAgIFxuXHQiXAotICAgICJtb3YgICAgICAgICAgICAgICAgICglJSJSRUdfZCIpLCAlJSJSRUdfUyIgICAgIFxuXHQiXAorICAgICJsZWEgICAgICAgICAgICAgICAgIm9mZnNldCIoJTApLCAlJSJGRl9SRUdfZCIgICAgICBcblx0IlwKKyAgICAibW92ICAgICAgICAgICAgICAgICAoJSUiRkZfUkVHX2QiKSwgJSUiRkZfUkVHX1MiICAgXG5cdCJcCiAgICAgInB4b3IgICAgICAgICAgICAgICAgICAgICAgJSVtbTEsICUlbW0xICAgICAgICAgXG5cdCJcCiAgICAgInB4b3IgICAgICAgICAgICAgICAgICAgICAgJSVtbTUsICUlbW01ICAgICAgICAgXG5cdCJcCiAgICAgInB4b3IgICAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW03ICAgICAgICAgXG5cdCJcCiAgICAgInB4b3IgICAgICAgICAgICAgICAgICAgICAgJSVtbTYsICUlbW02ICAgICAgICAgXG5cdCJcCiAgICAgIi5wMmFsaWduICAgICAgICAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgXG5cdCJcCiAgICAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCJcCi0gICAgIm1vdnEgICglJSJSRUdfUyIsICUlIlJFR19hIiwgMiksICUlbW0wICAgICAgICAgXG5cdCIgLyogWTFzcmNEYXRhICovXAotICAgICJtb3ZxIDgoJSUiUkVHX1MiLCAlJSJSRUdfYSIsIDIpLCAlJW1tMiAgICAgICAgIFxuXHQiIC8qIFkyc3JjRGF0YSAqL1wKLSAgICAibW92ICJTVFIoQVBDS19QVFIyKSIoJSUiUkVHX2QiKSwgJSUiUkVHX1MiICAgICBcblx0IlwKLSAgICAibW92cSAgKCUlIlJFR19TIiwgJSUiUkVHX2EiLCAyKSwgJSVtbTQgICAgICAgICBcblx0IiAvKiBZMXNyY0RhdGEgKi9cCisgICAgIm1vdnEgICglJSJGRl9SRUdfUyIsICUlIkZGX1JFR19hIiwgMiksICUlbW0wICAgICAgIFxuXHQiIC8qIFkxc3JjRGF0YSAqL1wKKyAgICAibW92cSA4KCUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX2EiLCAyKSwgJSVtbTIgICAgICAgXG5cdCIgLyogWTJzcmNEYXRhICovXAorICAgICJtb3YgIlNUUihBUENLX1BUUjIpIiglJSJGRl9SRUdfZCIpLCAlJSJGRl9SRUdfUyIgICBcblx0IlwKKyAgICAibW92cSAgKCUlIkZGX1JFR19TIiwgJSUiRkZfUkVHX2EiLCAyKSwgJSVtbTQgICAgICAgXG5cdCIgLyogWTFzcmNEYXRhICovXAogICAgICJtb3ZxICAgICAgICAgICAgICAgICAgICAgICUlbW0wLCAlJW1tMyAgICAgICAgIFxuXHQiXAogICAgICJwdW5wY2tsd2QgICAgICAgICAgICAgICAgICUlbW00LCAlJW1tMCAgICAgICAgIFxuXHQiXAogICAgICJwdW5wY2tod2QgICAgICAgICAgICAgICAgICUlbW00LCAlJW1tMyAgICAgICAgIFxuXHQiXAotICAgICJtb3ZxICJTVFIoQVBDS19DT0VGKSIoJSUiUkVHX2QiKSwgJSVtbTQgICAgICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKKyAgICAibW92cSAiU1RSKEFQQ0tfQ09FRikiKCUlIkZGX1JFR19kIiksICUlbW00ICAgICBcblx0IiAvKiBmaWx0ZXJDb2VmZiAqL1wKICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTAgICAgICAgICBcblx0IlwKICAgICAicG1hZGR3ZCAgICAgICAgICAgICAgICAgICAlJW1tNCwgJSVtbTMgICAgICAgICBcblx0IlwKICAgICAicGFkZGQgICAgICAgICAgICAgICAgICAgICAlJW1tMCwgJSVtbTEgICAgICAgICBcblx0IlwKICAgICAicGFkZGQgICAgICAgICAgICAgICAgICAgICAlJW1tMywgJSVtbTUgICAgICAgICBcblx0IlwKLSAgICAibW92cSA4KCUlIlJFR19TIiwgJSUiUkVHX2EiLCAyKSwgJSVtbTMgICAgICAgICBcblx0IiAvKiBZMnNyY0RhdGEgKi9cCi0gICAgIm1vdiAiU1RSKEFQQ0tfU0laRSkiKCUlIlJFR19kIiksICUlIlJFR19TIiAgICAgXG5cdCJcCi0gICAgImFkZCAgICAgICAgICAgJCJTVFIoQVBDS19TSVpFKSIsICUlIlJFR19kIiAgICAgXG5cdCJcCi0gICAgInRlc3QgICAgICAgICAgICAgICAgICAlJSJSRUdfUyIsICUlIlJFR19TIiAgICAgXG5cdCJcCisgICAgIm1vdnEgOCglJSJGRl9SRUdfUyIsICUlIkZGX1JFR19hIiwgMiksICUlbW0zICAgXG5cdCIgLyogWTJzcmNEYXRhICovXAorICAgICJtb3YgIlNUUihBUENLX1NJWkUpIiglJSJGRl9SRUdfZCIpLCAlJSJGRl9SRUdfUyIgXG5cdCJcCisgICAgImFkZCAgICAgICAgICAgJCJTVFIoQVBDS19TSVpFKSIsICUlIkZGX1JFR19kIiAgXG5cdCJcCisgICAgInRlc3QgICAgICAgICAgICAgICAlJSJGRl9SRUdfUyIsICUlIkZGX1JFR19TIiAgXG5cdCJcCiAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICAgJSVtbTIsICUlbW0wICAgICAgICAgXG5cdCJcCiAgICAgInB1bnBja2x3ZCAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0yICAgICAgICAgXG5cdCJcCiAgICAgInB1bnBja2h3ZCAgICAgICAgICAgICAgICAgJSVtbTMsICUlbW0wICAgICAgICAgXG5cdCJcCkBAIC0zNDgsNyArMzQ4LDcgQEAKICAgICB4ODZfcmVnIGRzdFdfcmVnID0gZHN0VzsKICAgICB4ODZfcmVnIHV2X29mZiA9IGMtPnV2X29mZngyOwogCi0gICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgeworICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfQUNDVVJBVEUKICAgICAgICAgWVNDQUxFWVVWMlJHQlgKICAgICAgICAgIm1vdnEgICAgICAgICAgICAgICAgICAgICAgJSVtbTIsICJVX1RFTVAiKCUwKSAgXG5cdCIKQEAgLTM1OSwxMyArMzU5LDEzIEBACiAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAgICQzLCAlJW1tMSAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAgICQzLCAlJW1tNyAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICAgIFxuXHQiCi0gICAgICAgIFdSSVRFQkdSMzIoJTQsICIlNSIsICUlUkVHYSwgJSVtbTMsICUlbW00LCAlJW1tNSwgJSVtbTEsICUlbW0wLCAlJW1tNywgJSVtbTIsICUlbW02KQorICAgICAgICBXUklURUJHUjMyKCU0LCAiJTUiLCAlJUZGX1JFR2EsICUlbW0zLCAlJW1tNCwgJSVtbTUsICUlbW0xLCAlJW1tMCwgJSVtbTcsICUlbW0yLCAlJW1tNikKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECiAgICAgfSBlbHNlIHsKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfQUNDVVJBVEUKICAgICAgICAgWVNDQUxFWVVWMlJHQlgKICAgICAgICAgInBjbXBlcWQgJSVtbTcsICUlbW03IFxuXHQiCi0gICAgICAgIFdSSVRFQkdSMzIoJTQsICIlNSIsICUlUkVHYSwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQorICAgICAgICBXUklURUJHUjMyKCU0LCAiJTUiLCAlJUZGX1JFR2EsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW03LCAlJW1tMCwgJSVtbTEsICUlbW0zLCAlJW1tNikKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECiAgICAgfQogfQpAQCAtMzgxLDIwICszODEsMjAgQEAKICAgICB4ODZfcmVnIGRzdFdfcmVnID0gZHN0VzsKICAgICB4ODZfcmVnIHV2X29mZiA9IGMtPnV2X29mZngyOwogCi0gICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgeworICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFgKICAgICAgICAgWVNDQUxFWVVWMlJHQlgKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfWUEoQUxQX01NWF9GSUxURVJfT0ZGU0VULCAlJW1tMCwgJSVtbTMsICUlbW02LCAlJW1tMSwgJSVtbTcpCiAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAgICQzLCAlJW1tMSAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAgICQzLCAlJW1tNyAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICAgIFxuXHQiCi0gICAgICAgIFdSSVRFQkdSMzIoJTQsICIlNSIsICUlUkVHYSwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTEsICUlbW0wLCAlJW1tNywgJSVtbTMsICUlbW02KQorICAgICAgICBXUklURUJHUjMyKCU0LCAiJTUiLCAlJUZGX1JFR2EsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW0xLCAlJW1tMCwgJSVtbTcsICUlbW0zLCAlJW1tNikKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECiAgICAgfSBlbHNlIHsKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFgKICAgICAgICAgWVNDQUxFWVVWMlJHQlgKICAgICAgICAgInBjbXBlcWQgJSVtbTcsICUlbW03IFxuXHQiCi0gICAgICAgIFdSSVRFQkdSMzIoJTQsICIlNSIsICUlUkVHYSwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQorICAgICAgICBXUklURUJHUjMyKCU0LCAiJTUiLCAlJUZGX1JFR2EsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW03LCAlJW1tMCwgJSVtbTEsICUlbW0zLCAlJW1tNikKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECiAgICAgfQogfQpAQCAtNDEwLDIwICs0MTAsMjAgQEAKICAgICB4ODZfcmVnIGRzdFdfcmVnID0gZHN0VzsKICAgICB4ODZfcmVnIHV2X29mZiA9IGMtPnV2X29mZngyOwogCi0gICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgeworICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFgKICAgICAgICAgWVNDQUxFWVVWMlJHQlgKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfWUEoQUxQX01NWF9GSUxURVJfT0ZGU0VULCAlJW1tMCwgJSVtbTMsICUlbW02LCAlJW1tMSwgJSVtbTcpCiAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAgICQzLCAlJW1tMSAgICAgICAgIFxuXHQiCiAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICAgICAgICQzLCAlJW1tNyAgICAgICAgIFxuXHQiCiAgICAgICAgICJwYWNrdXN3YiAgICAgICAgICAgICAgICAgICUlbW03LCAlJW1tMSAgICAgICAgIFxuXHQiCi0gICAgICAgIFdSSVRFQkdSMzIoJTQsICIlNSIsICUlUkVHYSwgJSVtbTUsICUlbW00LCAlJW1tMiwgJSVtbTEsICUlbW0wLCAlJW1tNywgJSVtbTMsICUlbW02KQorICAgICAgICBXUklURUJHUjMyKCU0LCAiJTUiLCAlJUZGX1JFR2EsICUlbW01LCAlJW1tNCwgJSVtbTIsICUlbW0xLCAlJW1tMCwgJSVtbTcsICUlbW0zLCAlJW1tNikKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECiAgICAgfSBlbHNlIHsKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFgKICAgICAgICAgWVNDQUxFWVVWMlJHQlgKICAgICAgICAgInBjbXBlcWQgJSVtbTcsICUlbW03IFxuXHQiCi0gICAgICAgIFdSSVRFQkdSMzIoJTQsICIlNSIsICUlUkVHYSwgJSVtbTUsICUlbW00LCAlJW1tMiwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQorICAgICAgICBXUklURUJHUjMyKCU0LCAiJTUiLCAlJUZGX1JFR2EsICUlbW01LCAlJW1tNCwgJSVtbTIsICUlbW03LCAlJW1tMCwgJSVtbTEsICUlbW0zLCAlJW1tNikKICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECiAgICAgfQogfQpAQCAtNDc2LDcgKzQ3Niw3IEBACiAgICAgInBhZGR1c2IgIkdSRUVOX0RJVEhFUiIoJTApLCAlJW1tNFxuXHQiCiAgICAgInBhZGR1c2IgIlJFRF9ESVRIRVIiKCUwKSwgJSVtbTVcblx0IgogI2VuZGlmCi0gICAgV1JJVEVSR0IxNiglNCwgIiU1IiwgJSVSRUdhKQorICAgIFdSSVRFUkdCMTYoJTQsICIlNSIsICUlRkZfUkVHYSkKICAgICBZU0NBTEVZVVYyUEFDS0VEWF9FTkQKIH0KIApAQCAtNTAwLDcgKzUwMCw3IEBACiAgICAgInBhZGR1c2IgIkdSRUVOX0RJVEhFUiIoJTApLCAlJW1tNCAgXG5cdCIKICAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTApLCAlJW1tNSAgXG5cdCIKICNlbmRpZgotICAgIFdSSVRFUkdCMTYoJTQsICIlNSIsICUlUkVHYSkKKyAgICBXUklURVJHQjE2KCU0LCAiJTUiLCAlJUZGX1JFR2EpCiAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECiB9CiAKQEAgLTU1Myw3ICs1NTMsNyBAQAogICAgICJwYWRkdXNiICJHUkVFTl9ESVRIRVIiKCUwKSwgJSVtbTRcblx0IgogICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglMCksICUlbW01XG5cdCIKICNlbmRpZgotICAgIFdSSVRFUkdCMTUoJTQsICIlNSIsICUlUkVHYSkKKyAgICBXUklURVJHQjE1KCU0LCAiJTUiLCAlJUZGX1JFR2EpCiAgICAgWVNDQUxFWVVWMlBBQ0tFRFhfRU5ECiB9CiAKQEAgLTU3Nyw3ICs1NzcsNyBAQAogICAgICJwYWRkdXNiICJHUkVFTl9ESVRIRVIiKCUwKSwgJSVtbTQgIFxuXHQiCiAgICAgInBhZGR1c2IgIlJFRF9ESVRIRVIiKCUwKSwgJSVtbTUgIFxuXHQiCiAjZW5kaWYKLSAgICBXUklURVJHQjE1KCU0LCAiJTUiLCAlJVJFR2EpCisgICAgV1JJVEVSR0IxNSglNCwgIiU1IiwgJSVGRl9SRUdhKQogICAgIFlTQ0FMRVlVVjJQQUNLRURYX0VORAogfQogCkBAIC03MDUsMTQgKzcwNSwxNCBAQAogICAgIFlTQ0FMRVlVVjJQQUNLRURYX0FDQ1VSQVRFCiAgICAgWVNDQUxFWVVWMlJHQlgKICAgICAicHhvciAlJW1tNywgJSVtbTcgXG5cdCIKLSAgICAibGVhICglJSJSRUdfYSIsICUlIlJFR19hIiwgMiksICUlIlJFR19jIlxuXHQiIC8vRklYTUUgb3B0aW1pemUKLSAgICAiYWRkICU0LCAlJSJSRUdfYyIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgIFdSSVRFQkdSMjQoJSVSRUdjLCAiJTUiLCAlJVJFR2EpCisgICAgImxlYSAoJSUiRkZfUkVHX2EiLCAlJSJGRl9SRUdfYSIsIDIpLCAlJSJGRl9SRUdfYyJcblx0IiAvL0ZJWE1FIG9wdGltaXplCisgICAgImFkZCAlNCwgJSUiRkZfUkVHX2MiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBXUklURUJHUjI0KCUlRkZfUkVHYywgIiU1IiwgJSVGRl9SRUdhKQogICAgIDo6ICJyIiAoJmMtPnJlZERpdGhlciksCiAgICAgICAgIm0iIChkdW1teSksICJtIiAoZHVtbXkpLCAibSIgKGR1bW15KSwKICAgICAgICAiciIgKGRlc3QpLCAibSIgKGRzdFdfcmVnKSwgIm0iKHV2X29mZikKICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfTTI0QSxmZl9NMjRDLGZmX00yNEIpCi0gICAgOiAiJSJSRUdfYSwgIiUiUkVHX2MsICIlIlJFR19kLCAiJSJSRUdfUworICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19jLCAiJSJGRl9SRUdfZCwgIiUiRkZfUkVHX1MKICAgICApOwogfQogCkBAIC03MjksMTUgKzcyOSwxNSBAQAogCiAgICAgWVNDQUxFWVVWMlBBQ0tFRFgKICAgICBZU0NBTEVZVVYyUkdCWAotICAgICJweG9yICAgICAgICAgICAgICAgICAgICAlJW1tNywgJSVtbTcgICAgICAgXG5cdCIKLSAgICAibGVhICglJSJSRUdfYSIsICUlIlJFR19hIiwgMiksICUlIlJFR19jIiAgIFxuXHQiIC8vRklYTUUgb3B0aW1pemUKLSAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIlJFR19jIiAgIFxuXHQiCi0gICAgV1JJVEVCR1IyNCglJVJFR2MsICIlNSIsICUlUkVHYSkKKyAgICAicHhvciAgICAgICAgICAgICAgICAgICAgJSVtbTcsICUlbW03ICAgICAgICAgICAgICBcblx0IgorICAgICJsZWEgKCUlIkZGX1JFR19hIiwgJSUiRkZfUkVHX2EiLCAyKSwgJSUiRkZfUkVHX2MiIFxuXHQiIC8vRklYTUUgb3B0aW1pemUKKyAgICAiYWRkICAgICAgICAgICAgICAgICAgICAgICAgJTQsICUlIkZGX1JFR19jIiAgICAgICBcblx0IgorICAgIFdSSVRFQkdSMjQoJSVGRl9SRUdjLCAiJTUiLCAlJUZGX1JFR2EpCiAgICAgOjogInIiICgmYy0+cmVkRGl0aGVyKSwKICAgICAgICAibSIgKGR1bW15KSwgIm0iIChkdW1teSksICJtIiAoZHVtbXkpLAogICAgICAgICJyIiAoZGVzdCksICAibSIgKGRzdFdfcmVnKSwgIm0iKHV2X29mZikKICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfTTI0QSxmZl9NMjRDLGZmX00yNEIpCi0gICAgOiAiJSJSRUdfYSwgIiUiUkVHX2MsICIlIlJFR19kLCAiJSJSRUdfUworICAgIDogIiUiRkZfUkVHX2EsICIlIkZGX1JFR19jLCAiJSJGRl9SRUdfZCwgIiUiRkZfUkVHX1MKICAgICApOwogfQogI2VuZGlmIC8qIEhBVkVfNlJFR1MgKi8KQEAgLTc3Niw3ICs3NzYsNyBAQAogICAgICJwc3JhdyAkMywgJSVtbTQgICAgXG5cdCIKICAgICAicHNyYXcgJDMsICUlbW0xICAgIFxuXHQiCiAgICAgInBzcmF3ICQzLCAlJW1tNyAgICBcblx0IgotICAgIFdSSVRFWVVZMiglNCwgIiU1IiwgJSVSRUdhKQorICAgIFdSSVRFWVVZMiglNCwgIiU1IiwgJSVGRl9SRUdhKQogICAgIFlTQ0FMRVlVVjJQQUNLRURYX0VORAogfQogCkBAIC03OTcsNyArNzk3LDcgQEAKICAgICAicHNyYXcgJDMsICUlbW00ICAgIFxuXHQiCiAgICAgInBzcmF3ICQzLCAlJW1tMSAgICBcblx0IgogICAgICJwc3JhdyAkMywgJSVtbTcgICAgXG5cdCIKLSAgICBXUklURVlVWTIoJTQsICIlNSIsICUlUkVHYSkKKyAgICBXUklURVlVWTIoJTQsICIlNSIsICUlRkZfUkVHYSkKICAgICBZU0NBTEVZVVYyUEFDS0VEWF9FTkQKIH0KIApAQCAtODg5LDcgKzg4OSw3IEBACiAgICAgY29uc3QgaW50MTZfdCAqYnVmMCAgPSBidWZbMF0sICAqYnVmMSAgPSBidWZbMV0sCiAgICAgICAgICAgICAgICAgICAqdWJ1ZjAgPSB1YnVmWzBdLCAqdWJ1ZjEgPSB1YnVmWzFdOwogCi0gICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgeworICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgY29uc3QgaW50MTZfdCAqYWJ1ZjAgPSBhYnVmWzBdLCAqYWJ1ZjEgPSBhYnVmWzFdOwogI2lmIEFSQ0hfWDg2XzY0CiAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCkBAIC05MDgsMzcgKzkwOCwzNyBAQAogICAgICAgICBjLT51X3RlbXA9KGludHB0cl90KWFidWYwOwogICAgICAgICBjLT52X3RlbXA9KGludHB0cl90KWFidWYxOwogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgWVNDQUxFWVVWMlJHQiglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICJtb3YgJSUiRkZfUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIkZGX1JFR19iIiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVzaCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IoJSVGRl9SRUdCUCwgJTUpCiAgICAgICAgICAgICAicHVzaCAgICAgICAgICAgICAgICAgICAlMCAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwdXNoICAgICAgICAgICAgICAgICAgICUxICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgIm1vdiAgICAgICAgICAiVV9URU1QIiglNSksICUwICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAibW92ICAgICAgICAgICJWX1RFTVAiKCU1KSwgJTEgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0JfWUEoJSVSRUdCUCwgJTUsICUwLCAlMSkKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0JfWUEoJSVGRl9SRUdCUCwgJTUsICUwLCAlMSkKICAgICAgICAgICAgICJwc3JhdyAgICAgICAgICAgICAgICAgICQzLCAlJW1tMSAgICAgICBcblx0IiAvKiBhYnVmMFtlYXhdIC0gYWJ1ZjFbZWF4XSA+PjcqLwogICAgICAgICAgICAgInBzcmF3ICAgICAgICAgICAgICAgICAgJDMsICUlbW03ICAgICAgIFxuXHQiIC8qIGFidWYwW2VheF0gLSBhYnVmMVtlYXhdID4+NyovCiAgICAgICAgICAgICAicGFja3Vzd2IgICAgICAgICAgICAlJW1tNywgJSVtbTEgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwb3AgICAgICAgICAgICAgICAgICAgICUxICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgInBvcCAgICAgICAgICAgICAgICAgICAgJTAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICBXUklURUJHUjMyKCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlAsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW0xLCAlJW1tMCwgJSVtbTcsICUlbW0zLCAlJW1tNikKLSAgICAgICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICBXUklURUJHUjMyKCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlAsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW0xLCAlJW1tMCwgJSVtbTcsICUlbW0zLCAlJW1tNikKKyAgICAgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJGRl9SRUdfYiIgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCiAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICk7CiAjZW5kaWYKICAgICB9IGVsc2UgewogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgWVNDQUxFWVVWMlJHQiglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICJtb3YgJSUiRkZfUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIkZGX1JFR19iIiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVzaCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IoJSVGRl9SRUdCUCwgJTUpCiAgICAgICAgICAgICAicGNtcGVxZCAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFdSSVRFQkdSMzIoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQotICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFdSSVRFQkdSMzIoJSVGRl9SRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVGRl9SRUdCUCwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQorICAgICAgICAgICAgInBvcCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIkZGX1JFR19iIiAgICAgXG5cdCIKICAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKICAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKICAgICAgICAgKTsKQEAgLTk1NCwxNCArOTU0LDE0IEBACiAgICAgICAgICAgICAgICAgICAqdWJ1ZjAgPSB1YnVmWzBdLCAqdWJ1ZjEgPSB1YnVmWzFdOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3YgICAgICAgICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgWVNDQUxFWVVWMlJHQiglJVJFR0JQLCAlNSkKKyAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICU0LCAlJSJGRl9SRUdfYiIgICAgICAgICBcblx0IgorICAgICAgICAicHVzaCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgWVNDQUxFWVVWMlJHQiglJUZGX1JFR0JQLCAlNSkKICAgICAgICAgInB4b3IgICAgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgIFdSSVRFQkdSMjQoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCkKLSAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICBXUklURUJHUjI0KCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlApCisgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIkZGX1JFR19iIiAgICAgXG5cdCIKICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAogICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChmZl9NMjRBLGZmX00yNEMsZmZfTTI0QikKQEAgLTk3NywyMCArOTc3LDIwIEBACiAgICAgICAgICAgICAgICAgICAqdWJ1ZjAgPSB1YnVmWzBdLCAqdWJ1ZjEgPSB1YnVmWzFdOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3YgICAgICAgICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgWVNDQUxFWVVWMlJHQiglJVJFR0JQLCAlNSkKKyAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICU0LCAlJSJGRl9SRUdfYiIgICAgICAgICAgICBcblx0IgorICAgICAgICAicHVzaCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgWVNDQUxFWVVWMlJHQiglJUZGX1JFR0JQLCAlNSkKICAgICAgICAgInB4b3IgICAgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovCiAjaWZkZWYgRElUSEVSMVhCUFAKLSAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdXNiICJHUkVFTl9ESVRIRVIiKCU1KSwgJSVtbTQgICAgICBcblx0IgotICAgICAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTUpLCAlJW1tNSAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglNSksICUlbW01ICAgICAgICBcblx0IgogI2VuZGlmCi0gICAgICAgIFdSSVRFUkdCMTUoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCkKLSAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICBXUklURVJHQjE1KCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlApCisgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIkZGX1JFR19iIiAgICAgXG5cdCIKICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAogICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChiRjgpCkBAIC0xMDA2LDIwICsxMDA2LDIwIEBACiAgICAgICAgICAgICAgICAgICAqdWJ1ZjAgPSB1YnVmWzBdLCAqdWJ1ZjEgPSB1YnVmWzFdOwogCiAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3YgICAgICAgICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgWVNDQUxFWVVWMlJHQiglJVJFR0JQLCAlNSkKKyAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICU0LCAlJSJGRl9SRUdfYiIgICAgICAgICBcblx0IgorICAgICAgICAicHVzaCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgWVNDQUxFWVVWMlJHQiglJUZGX1JFR0JQLCAlNSkKICAgICAgICAgInB4b3IgICAgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovCiAjaWZkZWYgRElUSEVSMVhCUFAKLSAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgXG5cdCIKKyAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgIFxuXHQiCiAgICAgICAgICJwYWRkdXNiICJHUkVFTl9ESVRIRVIiKCU1KSwgJSVtbTQgICAgICBcblx0IgotICAgICAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTUpLCAlJW1tNSAgICAgIFxuXHQiCisgICAgICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglNSksICUlbW01ICAgICAgICBcblx0IgogI2VuZGlmCi0gICAgICAgIFdSSVRFUkdCMTYoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCkKLSAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICBXUklURVJHQjE2KCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlApCisgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIkZGX1JFR19iIiAgICAgXG5cdCIKICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAogICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChiRjgsYkZDKQpAQCAtMTA3NSwxMyArMTA3NSwxMyBAQAogICAgICAgICAgICAgICAgICAgKnVidWYwID0gdWJ1ZlswXSwgKnVidWYxID0gdWJ1ZlsxXTsKIAogICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgotICAgICAgICAibW92ICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRCglJVJFR0JQLCAlNSkKLSAgICAgICAgV1JJVEVZVVkyKCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlApCi0gICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICJtb3YgICAgICAgICAgICU0LCAlJSJGRl9SRUdfYiIgICAgICAgICBcblx0IgorICAgICAgICAicHVzaCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRCglJUZGX1JFR0JQLCAlNSkKKyAgICAgICAgV1JJVEVZVVkyKCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlApCisgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIkZGX1JFR19iIiAgICAgXG5cdCIKICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAogICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgKTsKQEAgLTEyMTUsNTggKzEyMTUsNTggQEAKIAogICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeyAvLyBub3RlIHRoaXMgaXMgbm90IGNvcnJlY3QgKHNoaWZ0cyBjaHJvbWluYW5jZSBieSAwLjUgcGl4ZWxzKSBidXQgaXQgaXMgYSBiaXQgZmFzdGVyCiAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlswXTsKLSAgICAgICAgaWYgKENPTkZJR19TV1NDQUxFX0FMUEhBICYmIGMtPmFscFBpeEJ1ZikgeworICAgICAgICBpZiAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+bmVlZEFscGhhKSB7CiAgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3YgICAgICAgICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxKCUlUkVHQlAsICU1KQotICAgICAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxX0FMUEhBKCUlUkVHQlApCi0gICAgICAgICAgICAgICAgV1JJVEVCR1IzMiglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQLCAlJW1tMiwgJSVtbTQsICUlbW01LCAlJW1tNywgJSVtbTAsICUlbW0xLCAlJW1tMywgJSVtbTYpCi0gICAgICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAgICAgICAgICAgJTQsICUlIkZGX1JFR19iIiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1c2ggJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjEoJSVGRl9SRUdCUCwgJTUpCisgICAgICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjFfQUxQSEEoJSVGRl9SRUdCUCkKKyAgICAgICAgICAgICAgICBXUklURUJHUjMyKCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlAsICUlbW0yLCAlJW1tNCwgJSVtbTUsICUlbW03LCAlJW1tMCwgJSVtbTEsICUlbW0zLCAlJW1tNikKKyAgICAgICAgICAgICAgICAicG9wICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIkZGX1JFR19iIiAgICAgXG5cdCIKICAgICAgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGFidWYwKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAogICAgICAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKICAgICAgICAgICAgICk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3YgICAgICAgICU0LCAlJSJSRUdfYiIgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxKCUlUkVHQlAsICU1KQorICAgICAgICAgICAgICAgICJtb3YgJSUiRkZfUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgICAgICAgICAgICU0LCAlJSJGRl9SRUdfYiIgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJwdXNoICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxKCUlRkZfUkVHQlAsICU1KQogICAgICAgICAgICAgICAgICJwY21wZXFkICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgIFdSSVRFQkdSMzIoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQotICAgICAgICAgICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIFdSSVRFQkdSMzIoJSVGRl9SRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVGRl9SRUdCUCwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQorICAgICAgICAgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiRkZfUkVHX2IiICAgICBcblx0IgogICAgICAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKICAgICAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgICApOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjEgPSB1YnVmWzFdOwotICAgICAgICBpZiAoQ09ORklHX1NXU0NBTEVfQUxQSEEgJiYgYy0+YWxwUGl4QnVmKSB7CisgICAgICAgIGlmIChDT05GSUdfU1dTQ0FMRV9BTFBIQSAmJiBjLT5uZWVkQWxwaGEpIHsKICAgICAgICAgICAgIF9fYXNtX18gdm9sYXRpbGUoCi0gICAgICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgInB1c2ggJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjFiKCUlUkVHQlAsICU1KQotICAgICAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxX0FMUEhBKCUlUkVHQlApCi0gICAgICAgICAgICAgICAgV1JJVEVCR1IzMiglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQLCAlJW1tMiwgJSVtbTQsICUlbW01LCAlJW1tNywgJSVtbTAsICUlbW0xLCAlJW1tMywgJSVtbTYpCi0gICAgICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAgICAgICAgICAgJTQsICUlIkZGX1JFR19iIiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1c2ggJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjFiKCUlRkZfUkVHQlAsICU1KQorICAgICAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxX0FMUEhBKCUlRkZfUkVHQlApCisgICAgICAgICAgICAgICAgV1JJVEVCR1IzMiglJUZGX1JFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJUZGX1JFR0JQLCAlJW1tMiwgJSVtbTQsICUlbW01LCAlJW1tNywgJSVtbTAsICUlbW0xLCAlJW1tMywgJSVtbTYpCisgICAgICAgICAgICAgICAgInBvcCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJGRl9SRUdfYiIgICAgIFxuXHQiCiAgICAgICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChhYnVmMCksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKICAgICAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgICApOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICAgICAibW92ICUlIlJFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICAgICBZU0NBTEVZVVYyUkdCMWIoJSVSRUdCUCwgJTUpCisgICAgICAgICAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgIm1vdiAgICAgICAgICAgJTQsICUlIkZGX1JFR19iIiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgInB1c2ggJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjFiKCUlRkZfUkVHQlAsICU1KQogICAgICAgICAgICAgICAgICJwY21wZXFkICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgIFdSSVRFQkdSMzIoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQotICAgICAgICAgICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgIFdSSVRFQkdSMzIoJSVGRl9SRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVGRl9SRUdCUCwgJSVtbTIsICUlbW00LCAlJW1tNSwgJSVtbTcsICUlbW0wLCAlJW1tMSwgJSVtbTMsICUlbW02KQorICAgICAgICAgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiRkZfUkVHX2IiICAgICBcblx0IgogICAgICAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKICAgICAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgICApOwpAQCAtMTI4NSwxNCArMTI4NSwxNCBAQAogICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeyAvLyBub3RlIHRoaXMgaXMgbm90IGNvcnJlY3QgKHNoaWZ0cyBjaHJvbWluYW5jZSBieSAwLjUgcGl4ZWxzKSBidXQgaXQgaXMgYSBiaXQgZmFzdGVyCiAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlswXTsKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxKCUlUkVHQlAsICU1KQorICAgICAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAgICAlNCwgJSUiRkZfUkVHX2IiICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjEoJSVGRl9SRUdCUCwgJTUpCiAgICAgICAgICAgICAicHhvciAgICAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFdSSVRFQkdSMjQoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCkKLSAgICAgICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICBXUklURUJHUjI0KCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlApCisgICAgICAgICAgICAicG9wICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiRkZfUkVHX2IiICAgICBcblx0IgogICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAogICAgICAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQogICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGZmX00yNEEsZmZfTTI0QyxmZl9NMjRCKQpAQCAtMTMwMCwxNCArMTMwMCwxNCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlsxXTsKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxYiglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICJtb3YgJSUiRkZfUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAgICAgICAgICAgJTQsICUlIkZGX1JFR19iIiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVzaCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxYiglJUZGX1JFR0JQLCAlNSkKICAgICAgICAgICAgICJweG9yICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgV1JJVEVCR1IyNCglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQKQotICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFdSSVRFQkdSMjQoJSVGRl9SRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVGRl9SRUdCUCkKKyAgICAgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJGRl9SRUdfYiIgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCiAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoZmZfTTI0QSxmZl9NMjRDLGZmX00yNEIpCkBAIC0xMzI2LDIwICsxMzI2LDIwIEBACiAgICAgaWYgKHV2YWxwaGEgPCAyMDQ4KSB7IC8vIG5vdGUgdGhpcyBpcyBub3QgY29ycmVjdCAoc2hpZnRzIGNocm9taW5hbmNlIGJ5IDAuNSBwaXhlbHMpIGJ1dCBpdCBpcyBhIGJpdCBmYXN0ZXIKICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjEgPSB1YnVmWzBdOwogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjEoJSVSRUdCUCwgJTUpCisgICAgICAgICAgICAibW92ICUlIkZGX1JFR19iIiwgIkVTUF9PRkZTRVQiKCU1KSAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgICAgICAgICAgICU0LCAlJSJGRl9SRUdfYiIgICAgICAgICBcblx0IgorICAgICAgICAgICAgInB1c2ggJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICBZU0NBTEVZVVYyUkdCMSglJUZGX1JFR0JQLCAlNSkKICAgICAgICAgICAgICJweG9yICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgLyogbW0yPUIsICUlbW00PUcsICUlbW01PVIsICUlbW03PTAgKi8KICNpZmRlZiBESVRIRVIxWEJQUAotICAgICAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdXNiICJCTFVFX0RJVEhFUiIoJTUpLCAlJW1tMiAgICAgICBcblx0IgogICAgICAgICAgICAgInBhZGR1c2IgIkdSRUVOX0RJVEhFUiIoJTUpLCAlJW1tNCAgICAgIFxuXHQiCi0gICAgICAgICAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTUpLCAlJW1tNSAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTUpLCAlJW1tNSAgICAgICAgXG5cdCIKICNlbmRpZgotICAgICAgICAgICAgV1JJVEVSR0IxNSglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQKQotICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFdSSVRFUkdCMTUoJSVGRl9SRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVGRl9SRUdCUCkKKyAgICAgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJGRl9SRUdfYiIgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCiAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYkY4KQpAQCAtMTM0NywyMCArMTM0NywyMCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlsxXTsKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxYiglJVJFR0JQLCAlNSkKKyAgICAgICAgICAgICJtb3YgJSUiRkZfUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAgICAgICAgICAgJTQsICUlIkZGX1JFR19iIiAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAicHVzaCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxYiglJUZGX1JFR0JQLCAlNSkKICAgICAgICAgICAgICJweG9yICAgICUlbW03LCAlJW1tNyAgICAgICAgICAgICAgICAgICBcblx0IgogICAgICAgICAgICAgLyogbW0yPUIsICUlbW00PUcsICUlbW01PVIsICUlbW03PTAgKi8KICNpZmRlZiBESVRIRVIxWEJQUAotICAgICAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdXNiICJCTFVFX0RJVEhFUiIoJTUpLCAlJW1tMiAgICAgICBcblx0IgogICAgICAgICAgICAgInBhZGR1c2IgIkdSRUVOX0RJVEhFUiIoJTUpLCAlJW1tNCAgICAgIFxuXHQiCi0gICAgICAgICAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTUpLCAlJW1tNSAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHVzYiAiUkVEX0RJVEhFUiIoJTUpLCAlJW1tNSAgICAgICAgXG5cdCIKICNlbmRpZgotICAgICAgICAgICAgV1JJVEVSR0IxNSglJVJFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJVJFR0JQKQotICAgICAgICAgICAgInBvcCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIlJFR19iIiAgICAgICAgXG5cdCIKKyAgICAgICAgICAgIFdSSVRFUkdCMTUoJSVGRl9SRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVGRl9SRUdCUCkKKyAgICAgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJGRl9SRUdfYiIgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCiAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICAgICAgICBOQU1FRF9DT05TVFJBSU5UU19BREQoYkY4KQpAQCAtMTM3OSwyMCArMTM3OSwyMCBAQAogICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeyAvLyBub3RlIHRoaXMgaXMgbm90IGNvcnJlY3QgKHNoaWZ0cyBjaHJvbWluYW5jZSBieSAwLjUgcGl4ZWxzKSBidXQgaXQgaXMgYSBiaXQgZmFzdGVyCiAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlswXTsKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFlTQ0FMRVlVVjJSR0IxKCUlUkVHQlAsICU1KQorICAgICAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAgICAlNCwgJSUiRkZfUkVHX2IiICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjEoJSVGRl9SRUdCUCwgJTUpCiAgICAgICAgICAgICAicHhvciAgICAlJW1tNywgJSVtbTcgICAgICAgICAgICAgICAgICAgXG5cdCIKICAgICAgICAgICAgIC8qIG1tMj1CLCAlJW1tND1HLCAlJW1tNT1SLCAlJW1tNz0wICovCiAjaWZkZWYgRElUSEVSMVhCUFAKLSAgICAgICAgICAgICJwYWRkdXNiICJCTFVFX0RJVEhFUiIoJTUpLCAlJW1tMiAgICAgIFxuXHQiCisgICAgICAgICAgICAicGFkZHVzYiAiQkxVRV9ESVRIRVIiKCU1KSwgJSVtbTIgICAgICAgXG5cdCIKICAgICAgICAgICAgICJwYWRkdXNiICJHUkVFTl9ESVRIRVIiKCU1KSwgJSVtbTQgICAgICBcblx0IgotICAgICAgICAgICAgInBhZGR1c2IgIlJFRF9ESVRIRVIiKCU1KSwgJSVtbTUgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR1c2IgIlJFRF9ESVRIRVIiKCU1KSwgJSVtbTUgICAgICAgIFxuXHQiCiAjZW5kaWYKLSAgICAgICAgICAgIFdSSVRFUkdCMTYoJSVSRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVSRUdCUCkKLSAgICAgICAgICAgICJwb3AgJSUiUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJSRUdfYiIgICAgICAgIFxuXHQiCisgICAgICAgICAgICBXUklURVJHQjE2KCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlApCisgICAgICAgICAgICAicG9wICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiRkZfUkVHX2IiICAgICBcblx0IgogICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAogICAgICAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQogICAgICAgICAgICAgICAgTkFNRURfQ09OU1RSQUlOVFNfQUREKGJGOCxiRkMpCkBAIC0xNDAwLDIwICsxNDAwLDIwIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjEgPSB1YnVmWzFdOwogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjFiKCUlUkVHQlAsICU1KQorICAgICAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAgICAlNCwgJSUiRkZfUkVHX2IiICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlJHQjFiKCUlRkZfUkVHQlAsICU1KQogICAgICAgICAgICAgInB4b3IgICAgJSVtbTcsICUlbW03ICAgICAgICAgICAgICAgICAgIFxuXHQiCiAgICAgICAgICAgICAvKiBtbTI9QiwgJSVtbTQ9RywgJSVtbTU9UiwgJSVtbTc9MCAqLwogI2lmZGVmIERJVEhFUjFYQlBQCi0gICAgICAgICAgICAicGFkZHVzYiAiQkxVRV9ESVRIRVIiKCU1KSwgJSVtbTIgICAgICBcblx0IgorICAgICAgICAgICAgInBhZGR1c2IgIkJMVUVfRElUSEVSIiglNSksICUlbW0yICAgICAgIFxuXHQiCiAgICAgICAgICAgICAicGFkZHVzYiAiR1JFRU5fRElUSEVSIiglNSksICUlbW00ICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglNSksICUlbW01ICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwYWRkdXNiICJSRURfRElUSEVSIiglNSksICUlbW01ICAgICAgICBcblx0IgogI2VuZGlmCi0gICAgICAgICAgICBXUklURVJHQjE2KCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlApCi0gICAgICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgV1JJVEVSR0IxNiglJUZGX1JFR2IsIERTVFdfT0ZGU0VUIiglNSkiLCAlJUZGX1JFR0JQKQorICAgICAgICAgICAgInBvcCAlJSJGRl9SRUdfQlAiICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICJFU1BfT0ZGU0VUIiglNSksICUlIkZGX1JFR19iIiAgICAgXG5cdCIKICAgICAgICAgICAgIDo6ICJjIiAoYnVmMCksICJkIiAoYnVmMSksICJTIiAodWJ1ZjApLCAiRCIgKHVidWYxKSwgIm0iIChkZXN0KSwKICAgICAgICAgICAgICAgICJhIiAoJmMtPnJlZERpdGhlcikKICAgICAgICAgICAgICAgIE5BTUVEX0NPTlNUUkFJTlRTX0FERChiRjgsYkZDKQpAQCAtMTQ2OSwyNiArMTQ2OSwyNiBAQAogICAgIGlmICh1dmFscGhhIDwgMjA0OCkgeyAvLyBub3RlIHRoaXMgaXMgbm90IGNvcnJlY3QgKHNoaWZ0cyBjaHJvbWluYW5jZSBieSAwLjUgcGl4ZWxzKSBidXQgaXQgaXMgYSBiaXQgZmFzdGVyCiAgICAgICAgIGNvbnN0IGludDE2X3QgKnVidWYxID0gdWJ1ZlswXTsKICAgICAgICAgX19hc21fXyB2b2xhdGlsZSgKLSAgICAgICAgICAgICJtb3YgJSUiUkVHX2IiLCAiRVNQX09GRlNFVCIoJTUpICAgICAgICBcblx0IgotICAgICAgICAgICAgIm1vdiAgICAgICAgJTQsICUlIlJFR19iIiAgICAgICAgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAicHVzaCAlJSJSRUdfQlAiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgIFlTQ0FMRVlVVjJQQUNLRUQxKCUlUkVHQlAsICU1KQotICAgICAgICAgICAgV1JJVEVZVVkyKCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlApCi0gICAgICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAgICAlNCwgJSUiRkZfUkVHX2IiICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRDEoJSVGRl9SRUdCUCwgJTUpCisgICAgICAgICAgICBXUklURVlVWTIoJSVGRl9SRUdiLCBEU1RXX09GRlNFVCIoJTUpIiwgJSVGRl9SRUdCUCkKKyAgICAgICAgICAgICJwb3AgJSUiRkZfUkVHX0JQIiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAiRVNQX09GRlNFVCIoJTUpLCAlJSJGRl9SRUdfYiIgICAgIFxuXHQiCiAgICAgICAgICAgICA6OiAiYyIgKGJ1ZjApLCAiZCIgKGJ1ZjEpLCAiUyIgKHVidWYwKSwgIkQiICh1YnVmMSksICJtIiAoZGVzdCksCiAgICAgICAgICAgICAgICAiYSIgKCZjLT5yZWREaXRoZXIpCiAgICAgICAgICk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgY29uc3QgaW50MTZfdCAqdWJ1ZjEgPSB1YnVmWzFdOwogICAgICAgICBfX2FzbV9fIHZvbGF0aWxlKAotICAgICAgICAgICAgIm1vdiAlJSJSRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgICAgIFxuXHQiCi0gICAgICAgICAgICAibW92ICAgICAgICAlNCwgJSUiUkVHX2IiICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJwdXNoICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgotICAgICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRDFiKCUlUkVHQlAsICU1KQotICAgICAgICAgICAgV1JJVEVZVVkyKCUlUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlUkVHQlApCi0gICAgICAgICAgICAicG9wICUlIlJFR19CUCIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKLSAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiUkVHX2IiICAgICAgICBcblx0IgorICAgICAgICAgICAgIm1vdiAlJSJGRl9SRUdfYiIsICJFU1BfT0ZGU0VUIiglNSkgICAgIFxuXHQiCisgICAgICAgICAgICAibW92ICAgICAgICAgICAlNCwgJSUiRkZfUkVHX2IiICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJwdXNoICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAgICAgWVNDQUxFWVVWMlBBQ0tFRDFiKCUlRkZfUkVHQlAsICU1KQorICAgICAgICAgICAgV1JJVEVZVVkyKCUlRkZfUkVHYiwgRFNUV19PRkZTRVQiKCU1KSIsICUlRkZfUkVHQlApCisgICAgICAgICAgICAicG9wICUlIkZGX1JFR19CUCIgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAgICJtb3YgIkVTUF9PRkZTRVQiKCU1KSwgJSUiRkZfUkVHX2IiICAgICBcblx0IgogICAgICAgICAgICAgOjogImMiIChidWYwKSwgImQiIChidWYxKSwgIlMiICh1YnVmMCksICJEIiAodWJ1ZjEpLCAibSIgKGRlc3QpLAogICAgICAgICAgICAgICAgImEiICgmYy0+cmVkRGl0aGVyKQogICAgICAgICApOwpAQCAtMTQ5OSw3ICsxNDk5LDcgQEAKICAgICBlbnVtIEFWUGl4ZWxGb3JtYXQgZHN0Rm9ybWF0ID0gYy0+ZHN0Rm9ybWF0OwogCiAgICAgYy0+dXNlX21teF92ZmlsdGVyPSAwOwotICAgIGlmICghaXMxNkJQUyhkc3RGb3JtYXQpICYmICFpczlfT1JfMTBCUFMoZHN0Rm9ybWF0KSAmJiBkc3RGb3JtYXQgIT0gQVZfUElYX0ZNVF9OVjEyCisgICAgaWYgKCFpczE2QlBTKGRzdEZvcm1hdCkgJiYgIWlzTkJQUyhkc3RGb3JtYXQpICYmIGRzdEZvcm1hdCAhPSBBVl9QSVhfRk1UX05WMTIKICAgICAgICAgJiYgZHN0Rm9ybWF0ICE9IEFWX1BJWF9GTVRfTlYyMSAmJiAhKGMtPmZsYWdzICYgU1dTX0JJVEVYQUNUKSkgewogICAgICAgICAgICAgaWYgKGMtPmZsYWdzICYgU1dTX0FDQ1VSQVRFX1JORCkgewogICAgICAgICAgICAgICAgIGlmICghKGMtPmZsYWdzICYgU1dTX0ZVTExfQ0hSX0hfSU5UKSkgewpkaWZmIC0tZ2l0IGEvbGlic3dzY2FsZS95dXYycmdiLmMgYi9saWJzd3NjYWxlL3l1djJyZ2IuYwppbmRleCAzNjcxZmUzLi43MzdjYmIwIDEwMDY0NAotLS0gYS9saWJzd3NjYWxlL3l1djJyZ2IuYworKysgYi9saWJzd3NjYWxlL3l1djJyZ2IuYwpAQCAtNDYsMjAgKzQ2LDIzIEBACiAgKgogICogd2hlcmUgWSA9IGNyICogUiArIGNnICogRyArIGNiICogQiBhbmQgY3IgKyBjZyArIGNiID0gMS4KICAqLwotY29uc3QgaW50MzJfdCBmZl95dXYycmdiX2NvZWZmc1s4XVs0XSA9IHsKLSAgICB7IDExNzUwNCwgMTM4NDUzLCAxMzk1NCwgMzQ5MDMgfSwgLyogbm8gc2VxdWVuY2VfZGlzcGxheV9leHRlbnNpb24gKi8KLSAgICB7IDExNzUwNCwgMTM4NDUzLCAxMzk1NCwgMzQ5MDMgfSwgLyogSVRVLVIgUmVjLiA3MDkgKDE5OTApICovCitjb25zdCBpbnQzMl90IGZmX3l1djJyZ2JfY29lZmZzWzExXVs0XSA9IHsKKyAgICB7IDExNzQ4OSwgMTM4NDM4LCAxMzk3NSwgMzQ5MjUgfSwgLyogbm8gc2VxdWVuY2VfZGlzcGxheV9leHRlbnNpb24gKi8KKyAgICB7IDExNzQ4OSwgMTM4NDM4LCAxMzk3NSwgMzQ5MjUgfSwgLyogSVRVLVIgUmVjLiA3MDkgKDE5OTApICovCiAgICAgeyAxMDQ1OTcsIDEzMjIwMSwgMjU2NzUsIDUzMjc5IH0sIC8qIHVuc3BlY2lmaWVkICovCiAgICAgeyAxMDQ1OTcsIDEzMjIwMSwgMjU2NzUsIDUzMjc5IH0sIC8qIHJlc2VydmVkICovCiAgICAgeyAxMDQ0NDgsIDEzMjc5OCwgMjQ3NTksIDUzMTA5IH0sIC8qIEZDQyAqLwogICAgIHsgMTA0NTk3LCAxMzIyMDEsIDI1Njc1LCA1MzI3OSB9LCAvKiBJVFUtUiBSZWMuIDYyNC00IFN5c3RlbSBCLCBHICovCiAgICAgeyAxMDQ1OTcsIDEzMjIwMSwgMjU2NzUsIDUzMjc5IH0sIC8qIFNNUFRFIDE3ME0gKi8KLSAgICB7IDExNzU3OSwgMTM2MjMwLCAxNjkwNywgMzU1NTkgfSAgLyogU01QVEUgMjQwTSAoMTk4NykgKi8KKyAgICB7IDExNzU3OSwgMTM2MjMwLCAxNjkwNywgMzU1NTkgfSwgLyogU01QVEUgMjQwTSAoMTk4NykgKi8KKyAgICB7ICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgfSwgLyogWUNnQ28gKi8KKyAgICB7IDExMDAxMywgMTQwMzYzLCAxMjI3NywgNDI2MjYgfSwgLyogQnQtMjAyMC1OQ0wgKi8KKyAgICB7IDExMDAxMywgMTQwMzYzLCAxMjI3NywgNDI2MjYgfSwgLyogQnQtMjAyMC1DTCAqLwogfTsKIAogY29uc3QgaW50ICpzd3NfZ2V0Q29lZmZpY2llbnRzKGludCBjb2xvcnNwYWNlKQogewotICAgIGlmIChjb2xvcnNwYWNlID4gNyB8fCBjb2xvcnNwYWNlIDwgMCkKKyAgICBpZiAoY29sb3JzcGFjZSA+IDEwIHx8IGNvbG9yc3BhY2UgPCAwIHx8IGNvbG9yc3BhY2UgPT0gOCkKICAgICAgICAgY29sb3JzcGFjZSA9IFNXU19DU19ERUZBVUxUOwogICAgIHJldHVybiBmZl95dXYycmdiX2NvZWZmc1tjb2xvcnNwYWNlXTsKIH0KQEAgLTI2NCw3ICsyNjcsMTEgQEAKICAgICBQVVRSR0IoZHN0XzIsIHB5XzIsIDApOwogRU5EWVVWMlJHQkZVTkMoKQogCisjaWYgSEFWRV9CSUdFTkRJQU4KK1lVVjJSR0JGVU5DKHl1dmEyYXJnYl9jLCB1aW50MzJfdCwgMSkKKyNlbHNlCiBZVVYyUkdCRlVOQyh5dXZhMnJnYmFfYywgdWludDMyX3QsIDEpCisjZW5kaWYKICAgICBMT0FEQ0hST01BKDApOwogICAgIFBVVFJHQkEoZHN0XzEsIHB5XzEsIHBhXzEsIDAsIDI0KTsKICAgICBQVVRSR0JBKGRzdF8yLCBweV8yLCBwYV8yLCAwLCAyNCk7CkBAIC0yOTgsNyArMzA1LDExIEBACiAgICAgUFVUUkdCQShkc3RfMiwgcHlfMiwgcGFfMiwgMCwgMjQpOwogRU5EWVVWMlJHQkZVTkMoKQogCisjaWYgSEFWRV9CSUdFTkRJQU4KK1lVVjJSR0JGVU5DKHl1dmEycmdiYV9jLCB1aW50MzJfdCwgMSkKKyNlbHNlCiBZVVYyUkdCRlVOQyh5dXZhMmFyZ2JfYywgdWludDMyX3QsIDEpCisjZW5kaWYKICAgICBMT0FEQ0hST01BKDApOwogICAgIFBVVFJHQkEoZHN0XzEsIHB5XzEsIHBhXzEsIDAsIDApOwogICAgIFBVVFJHQkEoZHN0XzIsIHB5XzIsIHBhXzIsIDAsIDApOwpAQCAtODE3LDI1ICs4MjgsMjUgQEAKIAogICAgIGMtPnVPZmZzZXQgPSAweDA0MDAwNDAwMDQwMDA0MDBMTDsKICAgICBjLT52T2Zmc2V0ID0gMHgwNDAwMDQwMDA0MDAwNDAwTEw7Ci0gICAgYy0+eUNvZWZmICA9IHJvdW5kVG9JbnQxNihjeSAgKiA4MTkyKSAqIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKLSAgICBjLT52ckNvZWZmID0gcm91bmRUb0ludDE2KGNydiAqIDgxOTIpICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOwotICAgIGMtPnViQ29lZmYgPSByb3VuZFRvSW50MTYoY2J1ICogODE5MikgKiAweDAwMDEwMDAxMDAwMTAwMDFVTEw7Ci0gICAgYy0+dmdDb2VmZiA9IHJvdW5kVG9JbnQxNihjZ3YgKiA4MTkyKSAqIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKLSAgICBjLT51Z0NvZWZmID0gcm91bmRUb0ludDE2KGNndSAqIDgxOTIpICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOwotICAgIGMtPnlPZmZzZXQgPSByb3VuZFRvSW50MTYob3kgICogICAgOCkgKiAweDAwMDEwMDAxMDAwMTAwMDFVTEw7CisgICAgYy0+eUNvZWZmICA9IHJvdW5kVG9JbnQxNihjeSAgKiAoMSA8PCAxMykpICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOworICAgIGMtPnZyQ29lZmYgPSByb3VuZFRvSW50MTYoY3J2ICogKDEgPDwgMTMpKSAqIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKKyAgICBjLT51YkNvZWZmID0gcm91bmRUb0ludDE2KGNidSAqICgxIDw8IDEzKSkgKiAweDAwMDEwMDAxMDAwMTAwMDFVTEw7CisgICAgYy0+dmdDb2VmZiA9IHJvdW5kVG9JbnQxNihjZ3YgKiAoMSA8PCAxMykpICogMHgwMDAxMDAwMTAwMDEwMDAxVUxMOworICAgIGMtPnVnQ29lZmYgPSByb3VuZFRvSW50MTYoY2d1ICogKDEgPDwgMTMpKSAqIDB4MDAwMTAwMDEwMDAxMDAwMVVMTDsKKyAgICBjLT55T2Zmc2V0ID0gcm91bmRUb0ludDE2KG95ICAqICgxIDw8ICAzKSkgKiAweDAwMDEwMDAxMDAwMTAwMDFVTEw7CiAKLSAgICBjLT55dXYycmdiX3lfY29lZmYgICA9IChpbnQxNl90KXJvdW5kVG9JbnQxNihjeSAgPDwgMTMpOwotICAgIGMtPnl1djJyZ2JfeV9vZmZzZXQgID0gKGludDE2X3Qpcm91bmRUb0ludDE2KG95ICA8PCAgOSk7Ci0gICAgYy0+eXV2MnJnYl92MnJfY29lZmYgPSAoaW50MTZfdClyb3VuZFRvSW50MTYoY3J2IDw8IDEzKTsKLSAgICBjLT55dXYycmdiX3YyZ19jb2VmZiA9IChpbnQxNl90KXJvdW5kVG9JbnQxNihjZ3YgPDwgMTMpOwotICAgIGMtPnl1djJyZ2JfdTJnX2NvZWZmID0gKGludDE2X3Qpcm91bmRUb0ludDE2KGNndSA8PCAxMyk7Ci0gICAgYy0+eXV2MnJnYl91MmJfY29lZmYgPSAoaW50MTZfdClyb3VuZFRvSW50MTYoY2J1IDw8IDEzKTsKKyAgICBjLT55dXYycmdiX3lfY29lZmYgICA9IChpbnQxNl90KXJvdW5kVG9JbnQxNihjeSAgKiAoMSA8PCAxMykpOworICAgIGMtPnl1djJyZ2JfeV9vZmZzZXQgID0gKGludDE2X3Qpcm91bmRUb0ludDE2KG95ICAqICgxIDw8ICA5KSk7CisgICAgYy0+eXV2MnJnYl92MnJfY29lZmYgPSAoaW50MTZfdClyb3VuZFRvSW50MTYoY3J2ICogKDEgPDwgMTMpKTsKKyAgICBjLT55dXYycmdiX3YyZ19jb2VmZiA9IChpbnQxNl90KXJvdW5kVG9JbnQxNihjZ3YgKiAoMSA8PCAxMykpOworICAgIGMtPnl1djJyZ2JfdTJnX2NvZWZmID0gKGludDE2X3Qpcm91bmRUb0ludDE2KGNndSAqICgxIDw8IDEzKSk7CisgICAgYy0+eXV2MnJnYl91MmJfY29lZmYgPSAoaW50MTZfdClyb3VuZFRvSW50MTYoY2J1ICogKDEgPDwgMTMpKTsKIAogICAgIC8vc2NhbGUgY29lZmZpY2llbnRzIGJ5IGN5Ci0gICAgY3J2ID0gKChjcnYgPDwgMTYpICsgMHg4MDAwKSAvIEZGTUFYKGN5LCAxKTsKLSAgICBjYnUgPSAoKGNidSA8PCAxNikgKyAweDgwMDApIC8gRkZNQVgoY3ksIDEpOwotICAgIGNndSA9ICgoY2d1IDw8IDE2KSArIDB4ODAwMCkgLyBGRk1BWChjeSwgMSk7Ci0gICAgY2d2ID0gKChjZ3YgPDwgMTYpICsgMHg4MDAwKSAvIEZGTUFYKGN5LCAxKTsKKyAgICBjcnYgPSAoKGNydiAqICgxIDw8IDE2KSkgKyAweDgwMDApIC8gRkZNQVgoY3ksIDEpOworICAgIGNidSA9ICgoY2J1ICogKDEgPDwgMTYpKSArIDB4ODAwMCkgLyBGRk1BWChjeSwgMSk7CisgICAgY2d1ID0gKChjZ3UgKiAoMSA8PCAxNikpICsgMHg4MDAwKSAvIEZGTUFYKGN5LCAxKTsKKyAgICBjZ3YgPSAoKGNndiAqICgxIDw8IDE2KSkgKyAweDgwMDApIC8gRkZNQVgoY3ksIDEpOwogCiAgICAgYXZfZnJlZXAoJmMtPnl1dlRhYmxlKTsKIApkaWZmIC0tZ2l0IGEvdGVzdHMvTWFrZWZpbGUgYi90ZXN0cy9NYWtlZmlsZQppbmRleCA2ZTVkZmE2Li42MDc0YWM3IDEwMDY0NAotLS0gYS90ZXN0cy9NYWtlZmlsZQorKysgYi90ZXN0cy9NYWtlZmlsZQpAQCAtMSw1ICsxLDMgQEAKLUZGU0VSVkVSX1JFRkZJTEUgPSAkKFNSQ19QQVRIKS90ZXN0cy9mZnNlcnZlci5yZWdyZXNzaW9uLnJlZgotCiBUSFJFQURTID0gMQogVlJFRiA9IHRlc3RzL3ZzeW50aDEvMDAucGdtCiBBUkVGID0gdGVzdHMvZGF0YS9hc3ludGgxLnN3CkBAIC0xMSwxNCArOSw2IEBACiAKICQoQVJFRik6IENNUD0KIAotZmZzZXJ2ZXJ0ZXN0OiBleHBvcnQgUFJPR1NVRiA9ICQoUFJPR1NTVUYpCi1mZnNlcnZlcnRlc3Q6IGZmc2VydmVyJChQUk9HU1NVRikkKEVYRVNVRikgdGVzdHMvdnN5bnRoMS8wMC5wZ20gdGVzdHMvZGF0YS9hc3ludGgxLnN3Ci0JQGVjaG8KLQlAZWNobyAiVW5mb3J0dW5hdGVseSBmZnNlcnZlciBpcyBicm9rZW4gYW5kIHRoZXJlZm9yZSBpdHMgcmVncmVzc2lvbiIKLQlAZWNobyAidGVzdCBmYWlscyByYW5kb21seS4gVHJlYXQgdGhlIHJlc3VsdHMgYWNjb3JkaW5nbHkuIgotCUBlY2hvCi0JJChTUkNfUEFUSCkvdGVzdHMvZmZzZXJ2ZXItcmVncmVzc2lvbi5zaCAkKEZGU0VSVkVSX1JFRkZJTEUpICQoU1JDX1BBVEgpL3Rlc3RzL2Zmc2VydmVyLmNvbmYKLQogQVBJVEVTVFNESVIgOj0gdGVzdHMvYXBpCiBPQkpESVJTICs9IHRlc3RzL2RhdGEgdGVzdHMvdnN5bnRoMSB0ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocyAkKEFQSVRFU1RTRElSKS8KIApAQCAtOTcsNiArODcsNyBAQAogCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvYWNvZGVjLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL3Zjb2RlYy5tYWsKKwogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2F2Zm9ybWF0Lm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL3NlZWsubWFrCiAKQEAgLTEwOCw5ICs5OSwxMyBAQAogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2Ftcm5iLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2FtcndiLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2FwaS5tYWsKK2luY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9hcG5nLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2F0cmFjLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2F1ZGlvLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2JtcC5tYWsKK2luY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9idWlsZC5tYWsKK2luY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9jYW5vcHVzLm1haworaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2Nicy5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9jZHhsLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2NoZWNrYXNtLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2NvbmNhdGRlYy5tYWsKQEAgLTEyNCwxNCArMTE5LDE5IEBACiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvZXhpZi5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9mZm1wZWcubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvZmZwcm9iZS5tYWsKK2luY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9mZnQubWFrCitpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvZmlmby1tdXhlci5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9maWx0ZXItYXVkaW8ubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvZmlsdGVyLXZpZGVvLm1haworaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2ZpdHMubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvZmxhYy5tYWsKLWluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9mZnQubWFrCitpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvZmx2ZW5jLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2dhcGxlc3MubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvZ2lmLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2gyNjQubWFrCitpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvaGFwLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2hldmMubWFrCitpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvaWQzdjIubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvaW1hZ2UubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvaW5kZW8ubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvbGliYXZjb2RlYy5tYWsKQEAgLTE0MCwxNiArMTQwLDIyIEBACiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvbGliYXZyZXNhbXBsZS5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9saWJhdnV0aWwubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvbGlic3dyZXNhbXBsZS5tYWsKK2luY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9saWJzd3NjYWxlLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2xvc3NsZXNzLWF1ZGlvLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL2xvc3NsZXNzLXZpZGVvLm1haworaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL21hdHJvc2thLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL21pY3Jvc29mdC5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9tb25rZXlzYXVkaW8ubWFrCitpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvbW92Lm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL21wMy5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9tcGMubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvbXBlZzQubWFrCitpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvbXBlZ3BzLm1haworaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL21wZWd0cy5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9teGYubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvb3B1cy5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9wY20ubWFrCitpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvcGl4bGV0Lm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL3Byb2JlLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL3Byb3Jlcy5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9xdC5tYWsKQEAgLTE1Nyw2ICsxNjMsNyBAQAogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL3JlYWwubWFrCiBpbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2ZhdGUvc2NyZWVuLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL3NvdXJjZS5tYWsKK2luY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS9zcGVlZGhxLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL3N1YnRpdGxlcy5tYWsKIGluY2x1ZGUgJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS91dHZpZGVvLm1hawogaW5jbHVkZSAkKFNSQ19QQVRIKS90ZXN0cy9mYXRlL3ZpZGVvLm1hawpAQCAtMjAwLDE2ICsyMDcsMTggQEAKIAlAZWNobyAiJEAgcmVxdWlyZXMgZXh0ZXJuYWwgc2FtcGxlcyBhbmQgU0FNUExFUyBub3Qgc3BlY2lmaWVkIjsgZmFsc2UKIGVuZGlmCiAKLUZBVEVfVVRJTFMgPSBiYXNlNjQgdGlueV9wc25yIHRpbnlfc3NpbQorRkFURV9VVElMUyA9IGJhc2U2NCB0aW55X3BzbnIgdGlueV9zc2ltIGF1ZGlvbWF0Y2gKIAogVE9PTCA9IGZmbXBlZwogCiskKGFkZHByZWZpeCBmYXRlLSwgJChJR05PUkVfVEVTVFMpKTogUkVQT1JUPWlnbm9yZQorCiBmYXRlOjogJChGQVRFKQogCiAkKEZBVEUpICQoRkFURV9URVNUUy1ubyk6IGV4cG9ydCBQUk9HU1VGID0gJChQUk9HU1NVRikKICQoRkFURSkgJChGQVRFX1RFU1RTLW5vKTogJChGQVRFX1VUSUxTOiU9dGVzdHMvJSQoSE9TVEVYRVNVRikpCiAJQGVjaG8gIlRFU1QgICAgJChAOmZhdGUtJT0lKSIKLQkkKFEpJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS1ydW4uc2ggJEAgIiQoVEFSR0VUX1NBTVBMRVMpIiAiJChUQVJHRVRfRVhFQykiICIkKFRBUkdFVF9QQVRIKSIgJyQoQ01EKScgJyQoQ01QKScgJyQoUkVGKScgJyQoRlVaWiknICckKFRIUkVBRFMpJyAnJChUSFJFQURfVFlQRSknICckKENQVUZMQUdTKScgJyQoQ01QX1NISUZUKScgJyQoQ01QX1RBUkdFVCknICckKFNJWkVfVE9MRVJBTkNFKScgJyQoQ01QX1VOSVQpJyAnJChHRU4pJyAnJChIV0FDQ0VMKScKKwkkKFEpJChTUkNfUEFUSCkvdGVzdHMvZmF0ZS1ydW4uc2ggJEAgIiQoVEFSR0VUX1NBTVBMRVMpIiAiJChUQVJHRVRfRVhFQykiICIkKFRBUkdFVF9QQVRIKSIgJyQoQ01EKScgJyQoQ01QKScgJyQoUkVGKScgJyQoRlVaWiknICckKFRIUkVBRFMpJyAnJChUSFJFQURfVFlQRSknICckKENQVUZMQUdTKScgJyQoQ01QX1NISUZUKScgJyQoQ01QX1RBUkdFVCknICckKFNJWkVfVE9MRVJBTkNFKScgJyQoQ01QX1VOSVQpJyAnJChHRU4pJyAnJChIV0FDQ0VMKScgJyQoUkVQT1JUKScKIAogZmF0ZS1saXN0OgogCUBwcmludGYgJyVzXG4nICQoc29ydCAkKEZBVEUpKQpAQCAtMjI3LDcgKzIzNiw3IEBACiAKIGxjb3YtcmVzZXQ6IFRBRyA9IExDT1YKIGxjb3YtcmVzZXQ6Ci0JJChNKWxjb3YgLWQgJChDVVJESVIpIC0temVyb2NvdW50ZXJzCisJJChNKWxjb3YgLXEgLWQgJChDVVJESVIpIC0temVyb2NvdW50ZXJzCiAJJChRKSQoUk0pIC1mIGNvdmVyYWdlLmluZm8KIAogY2xlYW46OiB0ZXN0Y2xlYW4KZGlmZiAtLWdpdCBhL3Rlc3RzL2FwaS9NYWtlZmlsZSBiL3Rlc3RzL2FwaS9NYWtlZmlsZQppbmRleCBlYzBlMTI1Li43NTlkZDlkIDEwMDY0NAotLS0gYS90ZXN0cy9hcGkvTWFrZWZpbGUKKysrIGIvdGVzdHMvYXBpL01ha2VmaWxlCkBAIC0xNCw3ICsxNCw3IEBACiAkKEFQSVRFU1RPQkpTKSAkKEFQSVRFU1RPQkpTOi5vPS5pKTogQ1BQRkxBR1MgKz0gLURURVNUCiAkKEFQSVRFU1RPQkpTKSAkKEFQSVRFU1RPQkpTOi5vPS5pKTogQ0ZMQUdTICs9IC1VbWFpbgogCi0kKEFQSVRFU1RQUk9HUyk6ICUkKEVYRVNVRik6ICUubyAkKEVYRU9CSlMpICQoRkZfREVQX0xJQlMpCiskKEFQSVRFU1RQUk9HUyk6ICUkKEVYRVNVRik6ICUubyAkKEZGX0RFUF9MSUJTKQogCSQoTEQpICQoTERGTEFHUykgJChMREVYRUZMQUdTKSAkKExEX08pICQoZmlsdGVyICUubywkXikgJChGRl9FWFRSQUxJQlMpICQoRUxJQlMpCiAKIHRlc3RjbGVhbjo6CmRpZmYgLS1naXQgYS90ZXN0cy9hcGkvYXBpLWJhbmQtdGVzdC5jIGIvdGVzdHMvYXBpL2FwaS1iYW5kLXRlc3QuYwppbmRleCA4NjQ0ZTdkLi5hODRmNmI3IDEwMDY0NAotLS0gYS90ZXN0cy9hcGkvYXBpLWJhbmQtdGVzdC5jCisrKyBiL3Rlc3RzL2FwaS9hcGktYmFuZC10ZXN0LmMKQEAgLTY3LDcgKzY3LDggQEAKIHN0YXRpYyBpbnQgdmlkZW9fZGVjb2RlKGNvbnN0IGNoYXIgKmlucHV0X2ZpbGVuYW1lKQogewogICAgIEFWQ29kZWMgKmNvZGVjID0gTlVMTDsKLSAgICBBVkNvZGVjQ29udGV4dCAqb3JpZ2luX2N0eCA9IE5VTEwsICpjdHg9IE5VTEw7CisgICAgQVZDb2RlY0NvbnRleHQgKmN0eD0gTlVMTDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqb3JpZ2luX3BhciA9IE5VTEw7CiAgICAgdWludDhfdCAqYnl0ZV9idWZmZXIgPSBOVUxMOwogICAgIEFWRnJhbWUgKmZyID0gTlVMTDsKICAgICBBVlBhY2tldCBwa3Q7CkBAIC05OSw5ICsxMDAsOSBAQAogICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIG9yaWdpbl9jdHggPSBmbXRfY3R4LT5zdHJlYW1zW3ZpZGVvX3N0cmVhbV0tPmNvZGVjOworICAgIG9yaWdpbl9wYXIgPSBmbXRfY3R4LT5zdHJlYW1zW3ZpZGVvX3N0cmVhbV0tPmNvZGVjcGFyOwogCi0gICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihvcmlnaW5fY3R4LT5jb2RlY19pZCk7CisgICAgY29kZWMgPSBhdmNvZGVjX2ZpbmRfZGVjb2RlcihvcmlnaW5fcGFyLT5jb2RlY19pZCk7CiAgICAgaWYgKCFjb2RlYykgewogICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgZmluZCBkZWNvZGVyXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTEzLDcgKzExNCw3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQoY3R4LCBvcmlnaW5fY3R4KTsKKyAgICByZXN1bHQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChjdHgsIG9yaWdpbl9wYXIpOwogICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbid0IGNvcHkgZGVjb2RlciBjb250ZXh0XG4iKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTIxMyw4ICsyMTQsNiBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGlmICh2aWRlb19kZWNvZGUoYXJndlsxXSkgIT0gMCkKICAgICAgICAgcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwaS9hcGktY29kZWMtcGFyYW0tdGVzdC5jIGIvdGVzdHMvYXBpL2FwaS1jb2RlYy1wYXJhbS10ZXN0LmMKaW5kZXggZmE1MTk2NC4uMDg2ODMyMiAxMDA2NDQKLS0tIGEvdGVzdHMvYXBpL2FwaS1jb2RlYy1wYXJhbS10ZXN0LmMKKysrIGIvdGVzdHMvYXBpL2FwaS1jb2RlYy1wYXJhbS10ZXN0LmMKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgZ290byBlbmQ7CiAgICAgfQogCi0gICAgaWYgKCFkZWNvZGUgJiYgY29kZWNfY3R4LT5jb2RlYy0+Y2Fwc19pbnRlcm5hbCAmIEZGX0NPREVDX0NBUF9TS0lQX0ZSQU1FX0ZJTExfUEFSQU0pIHsKKyAgICBpZiAoIWRlY29kZSAmJiBhdnByaXZfY29kZWNfZ2V0X2NhcF9za2lwX2ZyYW1lX2ZpbGxfcGFyYW0oY29kZWNfY3R4LT5jb2RlYykpIHsKICAgICAgICAgY29kZWNfY3R4LT5za2lwX2ZyYW1lID0gQVZESVNDQVJEX0FMTDsKICAgICB9CiAKQEAgLTIzMSw4ICsyMzEsNiBAQAogICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCA9IE5VTEw7CiAgICAgQVZGb3JtYXRDb250ZXh0ICpmbXRfY3R4X25vX2RlY29kZSA9IE5VTEw7CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGlmIChhcmdjIDwgMikgewogICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiVXNhZ2U6ICVzIDxpbnB1dD5cbiIsIGFyZ3ZbMF0pOwogICAgICAgICByZXR1cm4gLTE7CmRpZmYgLS1naXQgYS90ZXN0cy9hcGkvYXBpLWZsYWMtdGVzdC5jIGIvdGVzdHMvYXBpL2FwaS1mbGFjLXRlc3QuYwppbmRleCA3YjQ4MDU5Li4yZTkwODEyIDEwMDY0NAotLS0gYS90ZXN0cy9hcGkvYXBpLWZsYWMtdGVzdC5jCisrKyBiL3Rlc3RzL2FwaS9hcGktZmxhYy10ZXN0LmMKQEAgLTE1Niw3ICsxNTYsNyBAQAogCiAgICAgICAgIGdlbmVyYXRlX3Jhd19mcmFtZSgodWludDE2X3QqKShpbl9mcmFtZS0+ZGF0YVswXSksIGksIGVuY19jdHgtPnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jX2N0eC0+Y2hhbm5lbHMsIGVuY19jdHgtPmZyYW1lX3NpemUpOwotICAgICAgICBpbl9mcmFtZV9ieXRlcyA9IGluX2ZyYW1lLT5uYl9zYW1wbGVzICogYXZfZnJhbWVfZ2V0X2NoYW5uZWxzKGluX2ZyYW1lKSAqIHNpemVvZih1aW50MTZfdCk7CisgICAgICAgIGluX2ZyYW1lX2J5dGVzID0gaW5fZnJhbWUtPm5iX3NhbXBsZXMgKiBpbl9mcmFtZS0+Y2hhbm5lbHMgKiBzaXplb2YodWludDE2X3QpOwogICAgICAgICBpZiAoaW5fZnJhbWVfYnl0ZXMgPiBpbl9mcmFtZS0+bGluZXNpemVbMF0pIHsKICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJJbmNvcnJlY3QgdmFsdWUgb2YgaW5wdXQgZnJhbWUgbGluZXNpemVcbiIpOwogICAgICAgICAgICAgcmV0dXJuIDE7CkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkVycm9yIGZyYW1lcyBiZWZvcmUgYW5kIGFmdGVyIGRlY29kaW5nIGhhcyBkaWZmZXJlbnQgc2FtcGxlIGZvcm1hdFxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBVkVSUk9SX1VOS05PV047CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG91dF9mcmFtZV9ieXRlcyA9IG91dF9mcmFtZS0+bmJfc2FtcGxlcyAqIGF2X2ZyYW1lX2dldF9jaGFubmVscyhvdXRfZnJhbWUpICogc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBvdXRfZnJhbWVfYnl0ZXMgPSBvdXRfZnJhbWUtPm5iX3NhbXBsZXMgKiBvdXRfZnJhbWUtPmNoYW5uZWxzICogc2l6ZW9mKHVpbnQxNl90KTsKICAgICAgICAgICAgICAgICBpZiAob3V0X2ZyYW1lX2J5dGVzID4gb3V0X2ZyYW1lLT5saW5lc2l6ZVswXSkgewogICAgICAgICAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiSW5jb3JyZWN0IHZhbHVlIG9mIG91dHB1dCBmcmFtZSBsaW5lc2l6ZVxuIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwpAQCAtMjQ1LDggKzI0NSw2IEBACiAgICAgaW50IHNhbXBsZV9yYXRlc1tdID0gezgwMDAsIDQ0MTAwLCA0ODAwMCwgMTkyMDAwfTsKICAgICBpbnQgY2wsIHNyOwogCi0gICAgYXZjb2RlY19yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGVuYyA9IGF2Y29kZWNfZmluZF9lbmNvZGVyKEFWX0NPREVDX0lEX0ZMQUMpOwogICAgIGlmICghZW5jKSB7CiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW4ndCBmaW5kIGVuY29kZXJcbiIpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXBpL2FwaS1oMjY0LXRlc3QuYyBiL3Rlc3RzL2FwaS9hcGktaDI2NC10ZXN0LmMKaW5kZXggYWNmMTYzNi4uNjY2NjlmYSAxMDA2NDQKLS0tIGEvdGVzdHMvYXBpL2FwaS1oMjY0LXRlc3QuYworKysgYi90ZXN0cy9hcGkvYXBpLWgyNjQtdGVzdC5jCkBAIC0zMiw3ICszMiw4IEBACiBzdGF0aWMgaW50IHZpZGVvX2RlY29kZV9leGFtcGxlKGNvbnN0IGNoYXIgKmlucHV0X2ZpbGVuYW1lKQogewogICAgIEFWQ29kZWMgKmNvZGVjID0gTlVMTDsKLSAgICBBVkNvZGVjQ29udGV4dCAqb3JpZ2luX2N0eCA9IE5VTEwsICpjdHg9IE5VTEw7CisgICAgQVZDb2RlY0NvbnRleHQgKmN0eD0gTlVMTDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqb3JpZ2luX3BhciA9IE5VTEw7CiAgICAgQVZGcmFtZSAqZnIgPSBOVUxMOwogICAgIHVpbnQ4X3QgKmJ5dGVfYnVmZmVyID0gTlVMTDsKICAgICBBVlBhY2tldCBwa3Q7CkBAIC02Myw5ICs2NCw5IEBACiAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgb3JpZ2luX2N0eCA9IGZtdF9jdHgtPnN0cmVhbXNbdmlkZW9fc3RyZWFtXS0+Y29kZWM7CisgICAgb3JpZ2luX3BhciA9IGZtdF9jdHgtPnN0cmVhbXNbdmlkZW9fc3RyZWFtXS0+Y29kZWNwYXI7CiAKLSAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKG9yaWdpbl9jdHgtPmNvZGVjX2lkKTsKKyAgICBjb2RlYyA9IGF2Y29kZWNfZmluZF9kZWNvZGVyKG9yaWdpbl9wYXItPmNvZGVjX2lkKTsKICAgICBpZiAoIWNvZGVjKSB7CiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW4ndCBmaW5kIGRlY29kZXJcbiIpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC03Nyw3ICs3OCw3IEBACiAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQoY3R4LCBvcmlnaW5fY3R4KTsKKyAgICByZXN1bHQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChjdHgsIG9yaWdpbl9wYXIpOwogICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbid0IGNvcHkgZGVjb2RlciBjb250ZXh0XG4iKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTEzMSw3ICsxMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyX29mX3dyaXR0ZW5fYnl0ZXM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHByaW50ZigiJWQsICUxMCJQUklkNjQiLCAlMTAiUFJJZDY0IiwgJTgiUFJJZDY0IiwgJThkLCAweCUwOGx4XG4iLCB2aWRlb19zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBmci0+cGt0X3B0cywgZnItPnBrdF9kdHMsIGF2X2ZyYW1lX2dldF9wa3RfZHVyYXRpb24oZnIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZnItPnB0cywgZnItPnBrdF9kdHMsIGZyLT5wa3RfZHVyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfb2Zfd3JpdHRlbl9ieXRlcywgYXZfYWRsZXIzMl91cGRhdGUoMCwgKGNvbnN0IHVpbnQ4X3QqKWJ5dGVfYnVmZmVyLCBudW1iZXJfb2Zfd3JpdHRlbl9ieXRlcykpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwpAQCAtMTU3LDggKzE1OCw2IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwotCiAgICAgaWYgKHZpZGVvX2RlY29kZV9leGFtcGxlKGFyZ3ZbMV0pICE9IDApCiAgICAgICAgIHJldHVybiAxOwogCmRpZmYgLS1naXQgYS90ZXN0cy9hcGkvYXBpLXNlZWstdGVzdC5jIGIvdGVzdHMvYXBpL2FwaS1zZWVrLXRlc3QuYwppbmRleCAxMzViOTcyLi5kMDUzMWEyIDEwMDY0NAotLS0gYS90ZXN0cy9hcGkvYXBpLXNlZWstdGVzdC5jCisrKyBiL3Rlc3RzL2FwaS9hcGktc2Vlay10ZXN0LmMKQEAgLTMwLDE4ICszMCwxOCBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgogCiBpbnQ2NF90ICpwdHNfYXJyYXk7Ci1pbnQ2NF90ICpjcmNfYXJyYXk7Cit1aW50MzJfdCAqY3JjX2FycmF5OwogaW50IHNpemVfb2ZfYXJyYXk7CiBpbnQgbnVtYmVyX29mX2VsZW1lbnRzOwogCi1zdGF0aWMgaW50IGFkZF9jcmNfdG9fYXJyYXkoaW50NjRfdCBjcmMsIGludDY0X3QgcHRzKQorc3RhdGljIGludCBhZGRfY3JjX3RvX2FycmF5KHVpbnQzMl90IGNyYywgaW50NjRfdCBwdHMpCiB7CiAgICAgaWYgKHNpemVfb2ZfYXJyYXkgPD0gbnVtYmVyX29mX2VsZW1lbnRzKSB7CiAgICAgICAgIGlmIChzaXplX29mX2FycmF5ID09IDApCiAgICAgICAgICAgICBzaXplX29mX2FycmF5ID0gMTA7CiAgICAgICAgIHNpemVfb2ZfYXJyYXkgKj0gMjsKLSAgICAgICAgY3JjX2FycmF5ID0gYXZfcmVhbGxvYyhjcmNfYXJyYXksIHNpemVfb2ZfYXJyYXkgKiBzaXplb2YoaW50NjRfdCkpOwotICAgICAgICBwdHNfYXJyYXkgPSBhdl9yZWFsbG9jKHB0c19hcnJheSwgc2l6ZV9vZl9hcnJheSAqIHNpemVvZihpbnQ2NF90KSk7CisgICAgICAgIGNyY19hcnJheSA9IGF2X3JlYWxsb2NfZihjcmNfYXJyYXksIHNpemVfb2ZfYXJyYXksIHNpemVvZih1aW50MzJfdCkpOworICAgICAgICBwdHNfYXJyYXkgPSBhdl9yZWFsbG9jX2YocHRzX2FycmF5LCBzaXplX29mX2FycmF5LCBzaXplb2YoaW50NjRfdCkpOwogICAgICAgICBpZiAoKGNyY19hcnJheSA9PSBOVUxMKSB8fCAocHRzX2FycmF5ID09IE5VTEwpKSB7CiAgICAgICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgYXJyYXkgdG8gc3RvcmUgY3Jjc1xuIik7CiAgICAgICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwpAQCAtNTMsMTMgKzUzLDEzIEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgY29tcGFyZV9jcmNfaW5fYXJyYXkoaW50NjRfdCBjcmMsIGludDY0X3QgcHRzKQorc3RhdGljIGludCBjb21wYXJlX2NyY19pbl9hcnJheSh1aW50MzJfdCBjcmMsIGludDY0X3QgcHRzKQogewogICAgIGludCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBudW1iZXJfb2ZfZWxlbWVudHM7IGkrKykgewogICAgICAgICBpZiAocHRzX2FycmF5W2ldID09IHB0cykgewogICAgICAgICAgICAgaWYgKGNyY19hcnJheVtpXSA9PSBjcmMpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIkNvbXBhcmluZyAweCUwOGx4ICUiUFJJZDY0IiAlZCBpcyBPS1xuIiwgY3JjLCBwdHMsIGkpOworICAgICAgICAgICAgICAgIHByaW50ZigiQ29tcGFyaW5nIDB4JTA4IlBSSXgzMiIgJSJQUklkNjQiICVkIGlzIE9LXG4iLCBjcmMsIHB0cywgaSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKQEAgLTgxLDcgKzgxLDcgQEAKICAgICBpbnQgZW5kX29mX3N0cmVhbSA9IDA7CiAgICAgaW50IGJ5dGVfYnVmZmVyX3NpemU7CiAgICAgdWludDhfdCAqYnl0ZV9idWZmZXI7Ci0gICAgaW50NjRfdCBjcmM7CisgICAgdWludDMyX3QgY3JjOwogICAgIEFWUGFja2V0IHBrdDsKIAogICAgIGJ5dGVfYnVmZmVyX3NpemUgPSBhdl9pbWFnZV9nZXRfYnVmZmVyX3NpemUoY3R4LT5waXhfZm10LCBjdHgtPndpZHRoLCBjdHgtPmhlaWdodCwgMTYpOwpAQCAtMTI5LDIzICsxMjksMjMgQEAKICAgICAgICAgICAgICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbid0IGNvcHkgaW1hZ2UgdG8gYnVmZmVyXG4iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcl9vZl93cml0dGVuX2J5dGVzOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGZyLT5wa3RfcHRzID4gdHNfZW5kKSAmJiAoIW5vX3NlZWtpbmcpKQorICAgICAgICAgICAgICAgIGlmICgoIW5vX3NlZWtpbmcpICYmIChmci0+cHRzID4gdHNfZW5kKSkKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY3JjID0gYXZfYWRsZXIzMl91cGRhdGUoMCwgKGNvbnN0IHVpbnQ4X3QqKWJ5dGVfYnVmZmVyLCBudW1iZXJfb2Zfd3JpdHRlbl9ieXRlcyk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCIlMTAiUFJJZDY0IiwgMHglMDhseFxuIiwgZnItPnBrdF9wdHMsIGNyYyk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlMTAiUFJJZDY0IiwgMHglMDgiUFJJeDMyIlxuIiwgZnItPnB0cywgY3JjKTsKICAgICAgICAgICAgICAgICBpZiAobm9fc2Vla2luZykgewotICAgICAgICAgICAgICAgICAgICBpZiAoYWRkX2NyY190b19hcnJheShjcmMsIGZyLT5wa3RfcHRzKSA8IDApCisgICAgICAgICAgICAgICAgICAgIGlmIChhZGRfY3JjX3RvX2FycmF5KGNyYywgZnItPnB0cykgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVfY3JjX2luX2FycmF5KGNyYywgZnItPnBrdF9wdHMpIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVfY3JjX2luX2FycmF5KGNyYywgZnItPnB0cykgPCAwKQogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBhdl9wYWNrZXRfdW5yZWYoJnBrdCk7CiAgICAgICAgIGF2X2luaXRfcGFja2V0KCZwa3QpOwotICAgIH0gd2hpbGUgKCghZW5kX29mX3N0cmVhbSB8fCBnb3RfZnJhbWUpICYmIChub19zZWVraW5nIHx8IChmci0+cGt0X3B0cyArIGF2X2ZyYW1lX2dldF9wa3RfZHVyYXRpb24oZnIpIDw9IHRzX2VuZCkpKTsKKyAgICB9IHdoaWxlICgoIWVuZF9vZl9zdHJlYW0gfHwgZ290X2ZyYW1lKSAmJiAobm9fc2Vla2luZyB8fCAoZnItPnB0cyArIGZyLT5wa3RfZHVyYXRpb24gPD0gdHNfZW5kKSkpOwogCiAgICAgYXZfcGFja2V0X3VucmVmKCZwa3QpOwogICAgIGF2X2ZyZWVwKCZieXRlX2J1ZmZlcik7CkBAIC0xNzQsNyArMTc0LDggQEAKIHN0YXRpYyBpbnQgc2Vla190ZXN0KGNvbnN0IGNoYXIgKmlucHV0X2ZpbGVuYW1lLCBjb25zdCBjaGFyICpzdGFydCwgY29uc3QgY2hhciAqZW5kKQogewogICAgIEFWQ29kZWMgKmNvZGVjID0gTlVMTDsKLSAgICBBVkNvZGVjQ29udGV4dCAqb3JpZ2luX2N0eCA9IE5VTEwsICpjdHg9IE5VTEw7CisgICAgQVZDb2RlY0NvbnRleHQgKmN0eD0gTlVMTDsKKyAgICBBVkNvZGVjUGFyYW1ldGVycyAqb3JpZ2luX3BhciA9IE5VTEw7CiAgICAgQVZGcmFtZSAqZnIgPSBOVUxMOwogICAgIEFWRm9ybWF0Q29udGV4dCAqZm10X2N0eCA9IE5VTEw7CiAgICAgaW50IHZpZGVvX3N0cmVhbTsKQEAgLTE4NCw3ICsxODUsOCBAQAogCiAgICAgc2l6ZV9vZl9hcnJheSA9IDA7CiAgICAgbnVtYmVyX29mX2VsZW1lbnRzID0gMDsKLSAgICBjcmNfYXJyYXkgPSBwdHNfYXJyYXkgPSBOVUxMOworICAgIGNyY19hcnJheSA9IE5VTEw7CisgICAgcHRzX2FycmF5ID0gTlVMTDsKIAogICAgIHJlc3VsdCA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmZtdF9jdHgsIGlucHV0X2ZpbGVuYW1lLCBOVUxMLCBOVUxMKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewpAQCAtMTk1LDcxICsxOTcsNzkgQEAKICAgICByZXN1bHQgPSBhdmZvcm1hdF9maW5kX3N0cmVhbV9pbmZvKGZtdF9jdHgsIE5VTEwpOwogICAgIGlmIChyZXN1bHQgPCAwKSB7CiAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJDYW4ndCBnZXQgc3RyZWFtIGluZm9cbiIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKICAgICBzdGFydF90cyA9IHJlYWRfc2Vla19yYW5nZShzdGFydCk7CiAgICAgZW5kX3RzID0gcmVhZF9zZWVrX3JhbmdlKGVuZCk7Ci0gICAgaWYgKChzdGFydF90cyA8IDApIHx8IChlbmRfdHMgPCAwKSkKLSAgICAgICAgcmV0dXJuIC0xOworICAgIGlmICgoc3RhcnRfdHMgPCAwKSB8fCAoZW5kX3RzIDwgMCkpIHsKKyAgICAgICAgcmVzdWx0ID0gLTE7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KIAogICAgIC8vVE9ETzogYWRkIGFiaWxpdHkgdG8gd29yayB3aXRoIGF1ZGlvIGZvcm1hdAogICAgIHZpZGVvX3N0cmVhbSA9IGF2X2ZpbmRfYmVzdF9zdHJlYW0oZm10X2N0eCwgQVZNRURJQV9UWVBFX1ZJREVPLCAtMSwgLTEsIE5VTEwsIDApOwogICAgIGlmICh2aWRlb19zdHJlYW0gPCAwKSB7CiAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgZmluZCB2aWRlbyBzdHJlYW0gaW4gaW5wdXQgZmlsZVxuIik7Ci0gICAgICByZXR1cm4gLTE7CisgICAgICByZXN1bHQgPSB2aWRlb19zdHJlYW07CisgICAgICBnb3RvIGVuZDsKICAgICB9CiAKLSAgICBvcmlnaW5fY3R4ID0gZm10X2N0eC0+c3RyZWFtc1t2aWRlb19zdHJlYW1dLT5jb2RlYzsKKyAgICBvcmlnaW5fcGFyID0gZm10X2N0eC0+c3RyZWFtc1t2aWRlb19zdHJlYW1dLT5jb2RlY3BhcjsKIAotICAgIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIob3JpZ2luX2N0eC0+Y29kZWNfaWQpOworICAgIGNvZGVjID0gYXZjb2RlY19maW5kX2RlY29kZXIob3JpZ2luX3Bhci0+Y29kZWNfaWQpOwogICAgIGlmICghY29kZWMpIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbid0IGZpbmQgZGVjb2RlclxuIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmVzdWx0ID0gQVZFUlJPUl9ERUNPREVSX05PVF9GT1VORDsKKyAgICAgICAgZ290byBlbmQ7CiAgICAgfQogCiAgICAgY3R4ID0gYXZjb2RlY19hbGxvY19jb250ZXh0Myhjb2RlYyk7CiAgICAgaWYgKCFjdHgpIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbid0IGFsbG9jYXRlIGRlY29kZXIgY29udGV4dFxuIik7Ci0gICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIHJlc3VsdCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CiAgICAgfQogCi0gICAgcmVzdWx0ID0gYXZjb2RlY19jb3B5X2NvbnRleHQoY3R4LCBvcmlnaW5fY3R4KTsKKyAgICByZXN1bHQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfdG9fY29udGV4dChjdHgsIG9yaWdpbl9wYXIpOwogICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIkNhbid0IGNvcHkgZGVjb2RlciBjb250ZXh0XG4iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgZ290byBlbmQ7CiAgICAgfQogCiAgICAgcmVzdWx0ID0gYXZjb2RlY19vcGVuMihjdHgsIGNvZGVjLCBOVUxMKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICBhdl9sb2coY3R4LCBBVl9MT0dfRVJST1IsICJDYW4ndCBvcGVuIGRlY29kZXJcbiIpOwotICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKICAgICBmciA9IGF2X2ZyYW1lX2FsbG9jKCk7CiAgICAgaWYgKCFmcikgewogICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX0VSUk9SLCAiQ2FuJ3QgYWxsb2NhdGUgZnJhbWVcbiIpOwotICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICByZXN1bHQgPSBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIGdvdG8gZW5kOwogICAgIH0KIAotICAgIHJlc3VsdCA9IGNvbXB1dGVfY3JjX29mX3BhY2tldHMoZm10X2N0eCwgdmlkZW9fc3RyZWFtLCBjdHgsIGZyLCBpLCBqLCAxKTsKKyAgICByZXN1bHQgPSBjb21wdXRlX2NyY19vZl9wYWNrZXRzKGZtdF9jdHgsIHZpZGVvX3N0cmVhbSwgY3R4LCBmciwgMCwgMCwgMSk7CiAgICAgaWYgKHJlc3VsdCAhPSAwKQotICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGdvdG8gZW5kOwogCiAgICAgZm9yIChpID0gc3RhcnRfdHM7IGkgPCBlbmRfdHM7IGkgKz0gMTAwKSB7Ci0gICAgICAgIGZvciAoaiA9IGkgKyAxMDA7IGogPCBlbmRfdHM7IGogKz0gMTAwKQotICAgICAgICByZXN1bHQgPSBjb21wdXRlX2NyY19vZl9wYWNrZXRzKGZtdF9jdHgsIHZpZGVvX3N0cmVhbSwgY3R4LCBmciwgaSwgaiwgMCk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZm9yIChqID0gaSArIDEwMDsgaiA8IGVuZF90czsgaiArPSAxMDApIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGNvbXB1dGVfY3JjX29mX3BhY2tldHMoZm10X2N0eCwgdmlkZW9fc3RyZWFtLCBjdHgsIGZyLCBpLCBqLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIAorZW5kOgogICAgIGF2X2ZyZWVwKCZjcmNfYXJyYXkpOwogICAgIGF2X2ZyZWVwKCZwdHNfYXJyYXkpOwogICAgIGF2X2ZyYW1lX2ZyZWUoJmZyKTsKICAgICBhdmNvZGVjX2Nsb3NlKGN0eCk7CiAgICAgYXZmb3JtYXRfY2xvc2VfaW5wdXQoJmZtdF9jdHgpOwogICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZjdHgpOwotICAgIHJldHVybiAwOworICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKQEAgLTI2OSw4ICsyNzksNiBAQAogICAgICAgICByZXR1cm4gMTsKICAgICB9CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGlmIChzZWVrX3Rlc3QoYXJndlsxXSwgYXJndlsyXSwgYXJndlszXSkgIT0gMCkKICAgICAgICAgcmV0dXJuIDE7CiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2FwaS9hcGktdGhyZWFkbWVzc2FnZS10ZXN0LmMgYi90ZXN0cy9hcGkvYXBpLXRocmVhZG1lc3NhZ2UtdGVzdC5jCmluZGV4IDNlMGFjNWMuLjA1YTgwNjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2FwaS9hcGktdGhyZWFkbWVzc2FnZS10ZXN0LmMKKysrIGIvdGVzdHMvYXBpL2FwaS10aHJlYWRtZXNzYWdlLXRlc3QuYwpAQCAtOTUsNyArOTUsNyBAQAogICAgICAgICAgICAgICAgIGF2X2ZyYW1lX2ZyZWUoJm1zZy5mcmFtZSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdl9mcmFtZV9zZXRfbWV0YWRhdGEobXNnLmZyYW1lLCBtZXRhKTsKKyAgICAgICAgICAgIG1zZy5mcmFtZS0+bWV0YWRhdGEgPSBtZXRhOwogCiAgICAgICAgICAgICAvKiBhbGxvY2F0ZSBhIHJlYWwgZnJhbWUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgInJlYWwiIHdvcmsgKi8KICAgICAgICAgICAgIG1zZy5mcmFtZS0+Zm9ybWF0ID0gQVZfUElYX0ZNVF9SR0JBOwpAQCAtMTQxLDcgKzE0MSw3IEBACiAgICAgICAgICAgICBpZiAocmV0IDwgMCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGF2X2Fzc2VydDAobXNnLm1hZ2ljID09IE1BR0lDKTsKLSAgICAgICAgICAgIG1ldGEgPSBhdl9mcmFtZV9nZXRfbWV0YWRhdGEobXNnLmZyYW1lKTsKKyAgICAgICAgICAgIG1ldGEgPSBtc2cuZnJhbWUtPm1ldGFkYXRhOwogICAgICAgICAgICAgZSA9IGF2X2RpY3RfZ2V0KG1ldGEsICJzaWciLCBOVUxMLCAwKTsKICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfSU5GTywgImdvdCBcIiVzXCIgKCVwKVxuIiwgZS0+dmFsdWUsIG1zZy5mcmFtZSk7CiAgICAgICAgICAgICBhdl9mcmFtZV9mcmVlKCZtc2cuZnJhbWUpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvYXVkaW9tYXRjaC5jIGIvdGVzdHMvYXVkaW9tYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NGM0MDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9hdWRpb21hdGNoLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNkZWZpbmUgRkZNSU4oYSxiKSAoKGEpID4gKGIpID8gKGIpIDogKGEpKQorI2RlZmluZSBGRk1BWChhLGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisKK3N0YXRpYyBpbnQ2NF90IGZzaXplKEZJTEUgKmYpIHsKKyAgICBpbnQ2NF90IGVuZCwgcG9zID0gZnRlbGwoZik7CisgICAgZnNlZWsoZiwgMCwgU0VFS19FTkQpOworICAgIGVuZCA9IGZ0ZWxsKGYpOworICAgIGZzZWVrKGYsIHBvcywgU0VFS19TRVQpOworICAgIHJldHVybiBlbmQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIEZJTEUgKmZbMl07CisgICAgaW50IGksIHBvczsKKyAgICBpbnQgc2lnbGVuLCBkYXRsZW47CisgICAgaW50IGJlc3Rwb3MgPSAwOworICAgIGRvdWJsZSBiZXN0YyA9IDA7CisgICAgZG91YmxlIHNpZ2FtcCA9IDA7CisgICAgaW50MTZfdCAqc2lnbmFsLCAqZGF0YTsKKyAgICBpbnQgbWF4c2hpZnQgPSAxNjM4NDsKKworICAgIGlmIChhcmdjIDwgMykgeworICAgICAgICBwcmludGYoImF1ZGlvbWF0Y2ggPHRlc3RmaWxlPiA8cmVmZmlsZT5cbiIpOworICAgICAgICBwcmludGYoIldBViBoZWFkZXJzIGFyZSBza2lwcGVkIGF1dG9tYXRpY2FsbHkuXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgZlswXSA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworICAgIGZbMV0gPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKKyAgICBpZiAoIWZbMF0gfHwgIWZbMV0pIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3Qgb3BlbiBpbnB1dCBmaWxlcy5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgcFsxMDBdOworICAgICAgICBpZiAoZnJlYWQocCwgMSwgMTIsIGZbaV0pICE9IDEyKQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmICghbWVtY21wKHAsICJSSUZGIiwgNCkgJiYKKyAgICAgICAgICAgICFtZW1jbXAocCArIDgsICJXQVZFIiwgNCkpIHsKKyAgICAgICAgICAgIGlmIChmcmVhZChwLCAxLCA4LCBmW2ldKSAhPSA4KQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgd2hpbGUgKG1lbWNtcChwLCAiZGF0YSIsIDQpKSB7CisgICAgICAgICAgICAgICAgaW50IHMgPSBwWzRdIHwgcFs1XSA8PCA4IHwgcFs2XSA8PCAxNiB8IHBbN10gPDwgMjQ7CisgICAgICAgICAgICAgICAgZnNlZWsoZltpXSwgcywgU0VFS19DVVIpOworICAgICAgICAgICAgICAgIGlmIChmcmVhZChwLCAxLCA4LCBmW2ldKSAhPSA4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZzZWVrKGZbaV0sIC0xMiwgU0VFS19DVVIpOworICAgICAgICB9CisgICAgfQorCisgICAgZGF0bGVuID0gZnNpemUoZlswXSkgLSBmdGVsbChmWzBdKTsKKyAgICBzaWdsZW4gPSBmc2l6ZShmWzFdKSAtIGZ0ZWxsKGZbMV0pOworICAgIGRhdGEgICA9IG1hbGxvYyhkYXRsZW4gKiBzaXplb2YoKmRhdGEpKTsKKyAgICBzaWduYWwgPSBtYWxsb2Moc2lnbGVuICogc2l6ZW9mKCpzaWduYWwpKTsKKworICAgIGlmIChmcmVhZChkYXRhICAsIDEsIGRhdGxlbiwgZlswXSkgIT0gZGF0bGVuKQorICAgICAgICByZXR1cm4gMTsKKyAgICBpZiAoZnJlYWQoc2lnbmFsLCAxLCBzaWdsZW4sIGZbMV0pICE9IHNpZ2xlbikKKyAgICAgICAgcmV0dXJuIDE7CisgICAgZGF0bGVuIC89IDI7CisgICAgc2lnbGVuIC89IDI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2lnbGVuOyBpKyspIHsKKyAgICAgICAgc2lnbmFsW2ldID0gKCh1aW50OF90Kikoc2lnbmFsICsgaSkpWzBdICsgMjU2KigodWludDhfdCopKHNpZ25hbCArIGkpKVsxXTsKKyAgICAgICAgc2lnYW1wICs9IHNpZ25hbFtpXSAqIHNpZ25hbFtpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGRhdGxlbjsgaSsrKQorICAgICAgICBkYXRhW2ldID0gKCh1aW50OF90KikoZGF0YSArIGkpKVswXSArIDI1NiooKHVpbnQ4X3QqKShkYXRhICsgaSkpWzFdOworCisgICAgZm9yIChwb3MgPSAwOyBwb3MgPCBtYXhzaGlmdDsgcG9zID0gcG9zIDwgMCA/IC1wb3M6IC1wb3MtMSkgeworICAgICAgICBpbnQ2NF90IGMgPSAwOworICAgICAgICBpbnQgdGVzdGxlbiA9IEZGTUlOKHNpZ2xlbiwgZGF0bGVuLXBvcyk7CisgICAgICAgIGZvciAoaSA9IEZGTUFYKDAsIC1wb3MpOyBpIDwgdGVzdGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaiA9IHBvcyArIGk7CisgICAgICAgICAgICBjICs9IHNpZ25hbFtpXSAqIGRhdGFbal07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZhYnMoYykgPiBzaWdhbXAgKiAwLjk0KQorICAgICAgICAgICAgbWF4c2hpZnQgPSBGRk1JTihtYXhzaGlmdCwgZmFicyhwb3MpKzMyKTsKKyAgICAgICAgaWYgKGZhYnMoYykgPiBmYWJzKGJlc3RjKSkgeworICAgICAgICAgICAgYmVzdGMgPSBjOworICAgICAgICAgICAgYmVzdHBvcyA9IHBvczsKKyAgICAgICAgfQorICAgIH0KKyAgICBwcmludGYoInByZXNpZzogJWQgcG9zdHNpZzolZCBjOiU3LjRmIGxlbmVycjolZFxuIiwgYmVzdHBvcywgZGF0bGVuIC0gc2lnbGVuIC0gYmVzdHBvcywgYmVzdGMgLyBzaWdhbXAsIGRhdGxlbiAtIHNpZ2xlbik7CisKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL01ha2VmaWxlIGIvdGVzdHMvY2hlY2thc20vTWFrZWZpbGUKaW5kZXggYmZkN2MxMS4uMDIzM2QyZiAxMDA2NDQKLS0tIGEvdGVzdHMvY2hlY2thc20vTWFrZWZpbGUKKysrIGIvdGVzdHMvY2hlY2thc20vTWFrZWZpbGUKQEAgLTEsMjIgKzEsNTcgQEAKICMgbGliYXZjb2RlYyB0ZXN0cwotQVZDT0RFQ09CSlMtJChDT05GSUdfQUxBQ19ERUNPREVSKSArPSBhbGFjZHNwLm8KLUFWQ09ERUNPQkpTLSQoQ09ORklHX0JMRU5EX0ZJTFRFUikgKz0gdmZfYmxlbmQubwotQVZDT0RFQ09CSlMtJChDT05GSUdfQlNXQVBEU1ApICs9IGJzd2FwZHNwLm8KLUFWQ09ERUNPQkpTLSQoQ09ORklHX0RDQV9ERUNPREVSKSArPSBzeW50aF9maWx0ZXIubwotQVZDT0RFQ09CSlMtJChDT05GSUdfRkxBQ0RTUCkgICs9IGZsYWNkc3AubwotQVZDT0RFQ09CSlMtJChDT05GSUdfRk1UQ09OVkVSVCkgICArPSBmbXRjb252ZXJ0Lm8KLUFWQ09ERUNPQkpTLSQoQ09ORklHX0gyNjRQUkVEKSArPSBoMjY0cHJlZC5vCi1BVkNPREVDT0JKUy0kKENPTkZJR19IMjY0UVBFTCkgKz0gaDI2NHFwZWwubwotQVZDT0RFQ09CSlMtJChDT05GSUdfSlBFRzIwMDBfREVDT0RFUikgKz0ganBlZzIwMDBkc3AubwotQVZDT0RFQ09CSlMtJChDT05GSUdfUElYQkxPQ0tEU1ApICs9IHBpeGJsb2NrZHNwLm8KLUFWQ09ERUNPQkpTLSQoQ09ORklHX1YyMTBfRU5DT0RFUikgKz0gdjIxMGVuYy5vCi1BVkNPREVDT0JKUy0kKENPTkZJR19WUDlfREVDT0RFUikgKz0gdnA5ZHNwLm8KLUFWQ09ERUNPQkpTLSQoQ09ORklHX1ZJREVPRFNQKSArPSB2aWRlb2RzcC5vCisjIHN1YnN5c3RlbXMKK0FWQ09ERUNPQkpTLSQoQ09ORklHX0FVRElPRFNQKSAgICAgICAgICArPSBhdWRpb2RzcC5vCitBVkNPREVDT0JKUy0kKENPTkZJR19CTE9DS0RTUCkgICAgICAgICAgKz0gYmxvY2tkc3AubworQVZDT0RFQ09CSlMtJChDT05GSUdfQlNXQVBEU1ApICAgICAgICAgICs9IGJzd2FwZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX0ZMQUNEU1ApICAgICAgICAgICArPSBmbGFjZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX0ZNVENPTlZFUlQpICAgICAgICArPSBmbXRjb252ZXJ0Lm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX0c3MjJEU1ApICAgICAgICAgICArPSBnNzIyZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX0gyNjREU1ApICAgICAgICAgICArPSBoMjY0ZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX0gyNjRQUkVEKSAgICAgICAgICArPSBoMjY0cHJlZC5vCitBVkNPREVDT0JKUy0kKENPTkZJR19IMjY0UVBFTCkgICAgICAgICAgKz0gaDI2NHFwZWwubworQVZDT0RFQ09CSlMtJChDT05GSUdfTExWSUREU1ApICAgICAgICAgICs9IGxsdmlkZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX0xMVklERU5DRFNQKSAgICAgICArPSBsbHZpZGRzcGVuYy5vCitBVkNPREVDT0JKUy0kKENPTkZJR19WUDhEU1ApICAgICAgICAgICAgKz0gdnA4ZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX1ZJREVPRFNQKSAgICAgICAgICArPSB2aWRlb2RzcC5vCiAKLUNIRUNLQVNNT0JKUy0kKENPTkZJR19BVkNPREVDKSArPSAkKEFWQ09ERUNPQkpTLXllcykKKyMgZGVjb2RlcnMvZW5jb2RlcnMKK0FWQ09ERUNPQkpTLSQoQ09ORklHX0FBQ19ERUNPREVSKSAgICAgICArPSBhYWNwc2RzcC5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYnJkc3AubworQVZDT0RFQ09CSlMtJChDT05GSUdfQUxBQ19ERUNPREVSKSAgICAgICs9IGFsYWNkc3AubworQVZDT0RFQ09CSlMtJChDT05GSUdfRENBX0RFQ09ERVIpICAgICAgICs9IHN5bnRoX2ZpbHRlci5vCitBVkNPREVDT0JKUy0kKENPTkZJR19FWFJfREVDT0RFUikgICAgICAgKz0gZXhyZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX0hVRkZZVVZfREVDT0RFUikgICArPSBodWZmeXV2ZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX0pQRUcyMDAwX0RFQ09ERVIpICArPSBqcGVnMjAwMGRzcC5vCitBVkNPREVDT0JKUy0kKENPTkZJR19QSVhCTE9DS0RTUCkgICAgICAgKz0gcGl4YmxvY2tkc3AubworQVZDT0RFQ09CSlMtJChDT05GSUdfSEVWQ19ERUNPREVSKSAgICAgICs9IGhldmNfYWRkX3Jlcy5vIGhldmNfaWRjdC5vIGhldmNfc2FvLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX1VUVklERU9fREVDT0RFUikgICArPSB1dHZpZGVvZHNwLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX1YyMTBfRU5DT0RFUikgICAgICArPSB2MjEwZW5jLm8KK0FWQ09ERUNPQkpTLSQoQ09ORklHX1ZQOV9ERUNPREVSKSAgICAgICArPSB2cDlkc3AubwogCitDSEVDS0FTTU9CSlMtJChDT05GSUdfQVZDT0RFQykgICAgICAgICAgKz0gJChBVkNPREVDT0JKUy15ZXMpCiAKLS1pbmNsdWRlICQoU1JDX1BBVEgpL3Rlc3RzL2NoZWNrYXNtLyQoQVJDSCkvTWFrZWZpbGUKKyMgbGliYXZmaWx0ZXIgdGVzdHMKK0FWRklMVEVST0JKUy0kKENPTkZJR19CTEVORF9GSUxURVIpICs9IHZmX2JsZW5kLm8KK0FWRklMVEVST0JKUy0kKENPTkZJR19DT0xPUlNQQUNFX0ZJTFRFUikgKz0gdmZfY29sb3JzcGFjZS5vCitBVkZJTFRFUk9CSlMtJChDT05GSUdfSEZMSVBfRklMVEVSKSAgICAgICs9IHZmX2hmbGlwLm8KK0FWRklMVEVST0JKUy0kKENPTkZJR19USFJFU0hPTERfRklMVEVSKSAgKz0gdmZfdGhyZXNob2xkLm8KKworQ0hFQ0tBU01PQkpTLSQoQ09ORklHX0FWRklMVEVSKSArPSAkKEFWRklMVEVST0JKUy15ZXMpCisKKyMgc3dzY2FsZSB0ZXN0cworU1dTQ0FMRU9CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHN3X3JnYi5vCisKK0NIRUNLQVNNT0JKUy0kKENPTkZJR19TV1NDQUxFKSAgKz0gJChTV1NDQUxFT0JKUykKKworIyBsaWJhdnV0aWwgdGVzdHMKK0FWVVRJTE9CSlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArPSBmaXhlZF9kc3AubworQVZVVElMT0JKUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IGZsb2F0X2RzcC5vCisKK0NIRUNLQVNNT0JKUy0kKENPTkZJR19BVlVUSUwpICArPSAkKEFWVVRJTE9CSlMpCisKK0NIRUNLQVNNT0JKUy0kKEFSQ0hfQUFSQ0g2NCkgICAgICAgICAgICArPSBhYXJjaDY0L2NoZWNrYXNtLm8KK0NIRUNLQVNNT0JKUy0kKEhBVkVfQVJNVjVURV9FWFRFUk5BTCkgICArPSBhcm0vY2hlY2thc20ubworQ0hFQ0tBU01PQkpTLSQoSEFWRV9YODZBU00pICAgICAgICAgICAgICs9IHg4Ni9jaGVja2FzbS5vCiAKIENIRUNLQVNNT0JKUyArPSAkKENIRUNLQVNNT0JKUy15ZXMpIGNoZWNrYXNtLm8KIENIRUNLQVNNT0JKUyA6PSAkKHNvcnQgJChDSEVDS0FTTU9CSlM6JT10ZXN0cy9jaGVja2FzbS8lKSkKQEAgLTMxLDggKzY2LDggQEAKIAogQ0hFQ0tBU00gOj0gdGVzdHMvY2hlY2thc20vY2hlY2thc20kKEVYRVNVRikKIAotJChDSEVDS0FTTSk6ICQoRVhFT0JKUykgJChDSEVDS0FTTU9CSlMpICQoRkZfU1RBVElDX0RFUF9MSUJTKQotCSQoTEQpICQoTERGTEFHUykgJChMREVYRUZMQUdTKSAkKExEX08pICQoQ0hFQ0tBU01PQkpTKSAkKEZGX1NUQVRJQ19ERVBfTElCUykgJChFWFRSQUxJQlMpCiskKENIRUNLQVNNKTogJChDSEVDS0FTTU9CSlMpICQoRkZfU1RBVElDX0RFUF9MSUJTKQorCSQoTEQpICQoTERGTEFHUykgJChMREVYRUZMQUdTKSAkKExEX08pICQoQ0hFQ0tBU01PQkpTKSAkKEZGX1NUQVRJQ19ERVBfTElCUykgJChFWFRSQUxJQlMtYXZjb2RlYykgJChFWFRSQUxJQlMtYXZmaWx0ZXIpICQoRVhUUkFMSUJTLWF2Zm9ybWF0KSAkKEVYVFJBTElCUy1hdnV0aWwpICQoRVhUUkFMSUJTLXN3cmVzYW1wbGUpICQoRVhUUkFMSUJTKQogCiBjaGVja2FzbTogJChDSEVDS0FTTSkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vYWFjcHNkc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL2FhY3BzZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2OGIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2FhY3BzZHNwLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSAibGliYXZjb2RlYy9hYWNwc2RzcC5oIgorCisjaW5jbHVkZSAiY2hlY2thc20uaCIKKworI2RlZmluZSBOIDMyCisjZGVmaW5lIFNUUklERSAxMjgKKyNkZWZpbmUgQlVGX1NJWkUgKE4gKiBTVFJJREUpCisKKyNkZWZpbmUgcmFuZG9taXplKGJ1ZiwgbGVuKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgSU5URkxPQVQgZiA9IChJTlRGTE9BVClybmQoKSAvIFVJTlRfTUFYOyAgICAgICAgICBcCisgICAgICAgIChidWYpW2ldID0gZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRVBTIDAuMDA1CisKK3N0YXRpYyB2b2lkIHRlc3RfYWRkX3NxdWFyZXModm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QwLCBbQlVGX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QxLCBbQlVGX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBzcmMsIFtCVUZfU0laRV0sIFsyXSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgSU5URkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgSU5URkxPQVQgKCpzcmMpWzJdLCBpbnQgbik7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopc3JjLCBCVUZfU0laRSAqIDIpOworICAgIHJhbmRvbWl6ZShkc3QwLCBCVUZfU0laRSk7CisgICAgbWVtY3B5KGRzdDEsIGRzdDAsIEJVRl9TSVpFICogc2l6ZW9mKElOVEZMT0FUKSk7CisgICAgY2FsbF9yZWYoZHN0MCwgc3JjLCBCVUZfU0laRSk7CisgICAgY2FsbF9uZXcoZHN0MSwgc3JjLCBCVUZfU0laRSk7CisgICAgaWYgKCFmbG9hdF9uZWFyX2Fic19lcHNfYXJyYXkoZHN0MCwgZHN0MSwgRVBTLCBCVUZfU0laRSkpCisgICAgICAgIGZhaWwoKTsKKyAgICBiZW5jaF9uZXcoZHN0MSwgc3JjLCBCVUZfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbXVsX3BhaXJfc2luZ2xlKHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MCwgW0JVRl9TSVpFXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QxLCBbQlVGX1NJWkVdLCBbMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIHNyYzAsIFtCVUZfU0laRV0sIFsyXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgc3JjMSwgW0JVRl9TSVpFXSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgSU5URkxPQVQgKCpkc3QpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBJTlRGTE9BVCAoKnNyYzApWzJdLCBJTlRGTE9BVCAqc3JjMSwgaW50IG4pOworCisgICAgcmFuZG9taXplKChJTlRGTE9BVCAqKXNyYzAsIEJVRl9TSVpFICogMik7CisgICAgcmFuZG9taXplKHNyYzEsIEJVRl9TSVpFKTsKKyAgICBjYWxsX3JlZihkc3QwLCBzcmMwLCBzcmMxLCBCVUZfU0laRSk7CisgICAgY2FsbF9uZXcoZHN0MSwgc3JjMCwgc3JjMSwgQlVGX1NJWkUpOworICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzX2FycmF5KChmbG9hdCAqKWRzdDAsIChmbG9hdCAqKWRzdDEsIEVQUywgQlVGX1NJWkUgKiAyKSkKKyAgICAgICAgZmFpbCgpOworICAgIGJlbmNoX25ldyhkc3QxLCBzcmMwLCBzcmMxLCBCVUZfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfaHlicmlkX2FuYWx5c2lzKHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MCwgW0JVRl9TSVpFXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QxLCBbQlVGX1NJWkVdLCBbMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGluLCBbMTNdLCBbMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGZpbHRlciwgW05dLCBbOF1bMl0pOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIElOVEZMT0FUICgqb3V0KVsyXSwgSU5URkxPQVQgKCppbilbMl0sCisgICAgICAgICAgICAgICAgIGNvbnN0IElOVEZMT0FUICgqZmlsdGVyKVs4XVsyXSwKKyAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSwgaW50IG4pOworCisgICAgcmFuZG9taXplKChJTlRGTE9BVCAqKWluLCAxMyAqIDIpOworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilmaWx0ZXIsIE4gKiA4ICogMik7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopZHN0MCwgQlVGX1NJWkUgKiAyKTsKKyAgICBtZW1jcHkoZHN0MSwgZHN0MCwgQlVGX1NJWkUgKiAyICogc2l6ZW9mKElOVEZMT0FUKSk7CisKKyAgICBjYWxsX3JlZihkc3QwLCBpbiwgZmlsdGVyLCBTVFJJREUsIE4pOworICAgIGNhbGxfbmV3KGRzdDEsIGluLCBmaWx0ZXIsIFNUUklERSwgTik7CisKKyAgICBpZiAoIWZsb2F0X25lYXJfYWJzX2Vwc19hcnJheSgoZmxvYXQgKilkc3QwLCAoZmxvYXQgKilkc3QxLCBFUFMsIEJVRl9TSVpFICogMikpCisgICAgICAgIGZhaWwoKTsKKyAgICBiZW5jaF9uZXcoZHN0MSwgaW4sIGZpbHRlciwgU1RSSURFLCBOKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9oeWJyaWRfYW5hbHlzaXNfaWxlYXZlKHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgaW4sICAgWzJdLCBbMzhdWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgb3V0MCwgWzkxXSwgWzMyXVsyXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgb3V0MSwgWzkxXSwgWzMyXVsyXSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgSU5URkxPQVQgKCpvdXQpWzMyXVsyXSwgSU5URkxPQVQgTFsyXVszOF1bNjRdLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgaW50IGxlbik7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopb3V0MCwgOTEgKiAzMiAqIDIpOworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilpbiwgICAgMiAqIDM4ICogNjQpOworICAgIG1lbWNweShvdXQxLCBvdXQwLCA5MSAqIDMyICogMiAqIHNpemVvZihJTlRGTE9BVCkpOworCisgICAgLyogbGVuIGlzIGhhcmRjb2RlZCB0byAzMiBhcyB0aGF0J3MgdGhlIG9ubHkgdmFsdWUgdXNlZCBpbgorICAgICAgIGxpYmF2Y29kZWMuIGFzbSBmdW5jdGlvbnMgYXJlIGxpa2VseSB0byBiZSBvcHRpbWl6ZWQKKyAgICAgICBoYXJkY29kaW5nIHRoaXMgdmFsdWUgaW4gdGhlaXIgbG9vcHMgYW5kIGNvdWxkIGZhaWwgd2l0aAorICAgICAgIGFueXRoaW5nIGVsc2UuCisgICAgICAgaSBpcyBoYXJkY29kZWQgdG8gdGhlIHR3byB2YWx1ZXMgY3VycmVudGx5IHVzZWQgYnkgdGhlCisgICAgICAgYWFjIGRlY29kZXIgYmVjYXVzZSB0aGUgYXJtIG5lb24gaW1wbGVtZW50YXRpb24gaXMKKyAgICAgICBtaWNyby1vcHRpbWl6ZWQgZm9yIHRoZW0gYW5kIHdpbGwgZmFpbCBmb3IgYWxtb3N0IGV2ZXJ5CisgICAgICAgb3RoZXIgdmFsdWUuICovCisgICAgY2FsbF9yZWYob3V0MCwgaW4sIDMsIDMyKTsKKyAgICBjYWxsX25ldyhvdXQxLCBpbiwgMywgMzIpOworCisgICAgLyogdGhlIGZ1bmN0aW9uIGp1c3QgbW92ZXMgZGF0YSBhcm91bmQsIHNvIG1lbWNtcCBpcyBlbm91Z2ggKi8KKyAgICBpZiAobWVtY21wKG91dDAsIG91dDEsIDkxICogMzIgKiAyICogc2l6ZW9mKElOVEZMT0FUKSkpCisgICAgICAgIGZhaWwoKTsKKworICAgIGNhbGxfcmVmKG91dDAsIGluLCA1LCAzMik7CisgICAgY2FsbF9uZXcob3V0MSwgaW4sIDUsIDMyKTsKKworICAgIGlmIChtZW1jbXAob3V0MCwgb3V0MSwgOTEgKiAzMiAqIDIgKiBzaXplb2YoSU5URkxPQVQpKSkKKyAgICAgICAgZmFpbCgpOworCisgICAgYmVuY2hfbmV3KG91dDEsIGluLCAzLCAzMik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfaHlicmlkX3N5bnRoZXNpc19kZWludCh2b2lkKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIG91dDAsIFsyXSwgWzM4XVs2NF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIG91dDEsIFsyXSwgWzM4XVs2NF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGluLCAgWzkxXSwgWzMyXVsyXSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgSU5URkxPQVQgb3V0WzJdWzM4XVs2NF0sIElOVEZMT0FUICgqaW4pWzMyXVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGksIGludCBsZW4pOworCisgICAgcmFuZG9taXplKChJTlRGTE9BVCAqKWluLCAgOTEgKiAzMiAqIDIpOworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilvdXQwLCAyICogMzggKiA2NCk7CisgICAgbWVtY3B5KG91dDEsIG91dDAsIDIgKiAzOCAqIDY0ICogc2l6ZW9mKElOVEZMT0FUKSk7CisKKyAgICAvKiBsZW4gaXMgaGFyZGNvZGVkIHRvIDMyIGFzIHRoYXQncyB0aGUgb25seSB2YWx1ZSB1c2VkIGluCisgICAgICAgbGliYXZjb2RlYy4gYXNtIGZ1bmN0aW9ucyBhcmUgbGlrZWx5IHRvIGJlIG9wdGltaXplZAorICAgICAgIGhhcmRjb2RpbmcgdGhpcyB2YWx1ZSBpbiB0aGVpciBsb29wcyBhbmQgY291bGQgZmFpbCB3aXRoCisgICAgICAgYW55dGhpbmcgZWxzZS4KKyAgICAgICBpIGlzIGhhcmRjb2RlZCB0byB0aGUgdHdvIHZhbHVlcyBjdXJyZW50bHkgdXNlZCBieSB0aGUKKyAgICAgICBhYWMgZGVjb2RlciBiZWNhdXNlIHRoZSBhcm0gbmVvbiBpbXBsZW1lbnRhdGlvbiBpcworICAgICAgIG1pY3JvLW9wdGltaXplZCBmb3IgdGhlbSBhbmQgd2lsbCBmYWlsIGZvciBhbG1vc3QgZXZlcnkKKyAgICAgICBvdGhlciB2YWx1ZS4gKi8KKyAgICBjYWxsX3JlZihvdXQwLCBpbiwgMywgMzIpOworICAgIGNhbGxfbmV3KG91dDEsIGluLCAzLCAzMik7CisKKyAgICAvKiB0aGUgZnVuY3Rpb24ganVzdCBtb3ZlcyBkYXRhIGFyb3VuZCwgc28gbWVtY21wIGlzIGVub3VnaCAqLworICAgIGlmIChtZW1jbXAob3V0MCwgb3V0MSwgMiAqIDM4ICogNjQgKiBzaXplb2YoSU5URkxPQVQpKSkKKyAgICAgICAgZmFpbCgpOworCisgICAgY2FsbF9yZWYob3V0MCwgaW4sIDUsIDMyKTsKKyAgICBjYWxsX25ldyhvdXQxLCBpbiwgNSwgMzIpOworCisgICAgaWYgKG1lbWNtcChvdXQwLCBvdXQxLCAyICogMzggKiA2NCAqIHNpemVvZihJTlRGTE9BVCkpKQorICAgICAgICBmYWlsKCk7CisKKyAgICBiZW5jaF9uZXcob3V0MSwgaW4sIDMsIDMyKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zdGVyZW9faW50ZXJwb2xhdGUoUFNEU1BDb250ZXh0ICpwc2RzcCkKK3sKKyAgICBpbnQgaTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBsLCAgW0JVRl9TSVpFXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCByLCAgW0JVRl9TSVpFXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBsMCwgW0JVRl9TSVpFXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCByMCwgW0JVRl9TSVpFXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBsMSwgW0JVRl9TSVpFXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCByMSwgW0JVRl9TSVpFXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBoLCBbMl0sIFs0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgaF9zdGVwLCBbMl0sIFs0XSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgSU5URkxPQVQgKCpsKVsyXSwgSU5URkxPQVQgKCpyKVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5URkxPQVQgaFsyXVs0XSwgSU5URkxPQVQgaF9zdGVwWzJdWzRdLCBpbnQgbGVuKTsKKworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilsLCBCVUZfU0laRSAqIDIpOworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilyLCBCVUZfU0laRSAqIDIpOworCisgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworICAgICAgICBpZiAoY2hlY2tfZnVuYyhwc2RzcC0+c3RlcmVvX2ludGVycG9sYXRlW2ldLCAicHNfc3RlcmVvX2ludGVycG9sYXRlJXMiLCBpID8gIl9pcGRvcGQiIDogIiIpKSB7CisgICAgICAgICAgICBtZW1jcHkobDAsIGwsIEJVRl9TSVpFICogMiAqIHNpemVvZihJTlRGTE9BVCkpOworICAgICAgICAgICAgbWVtY3B5KGwxLCBsLCBCVUZfU0laRSAqIDIgKiBzaXplb2YoSU5URkxPQVQpKTsKKyAgICAgICAgICAgIG1lbWNweShyMCwgciwgQlVGX1NJWkUgKiAyICogc2l6ZW9mKElOVEZMT0FUKSk7CisgICAgICAgICAgICBtZW1jcHkocjEsIHIsIEJVRl9TSVpFICogMiAqIHNpemVvZihJTlRGTE9BVCkpOworCisgICAgICAgICAgICByYW5kb21pemUoKElOVEZMT0FUICopaCwgMiAqIDQpOworICAgICAgICAgICAgcmFuZG9taXplKChJTlRGTE9BVCAqKWhfc3RlcCwgMiAqIDQpOworCisgICAgICAgICAgICBjYWxsX3JlZihsMCwgcjAsIGgsIGhfc3RlcCwgQlVGX1NJWkUpOworICAgICAgICAgICAgY2FsbF9uZXcobDEsIHIxLCBoLCBoX3N0ZXAsIEJVRl9TSVpFKTsKKyAgICAgICAgICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzX2FycmF5KChmbG9hdCAqKWwwLCAoZmxvYXQgKilsMSwgRVBTLCBCVUZfU0laRSAqIDIpIHx8CisgICAgICAgICAgICAgICAgIWZsb2F0X25lYXJfYWJzX2Vwc19hcnJheSgoZmxvYXQgKilyMCwgKGZsb2F0ICopcjEsIEVQUywgQlVGX1NJWkUgKiAyKSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisKKyAgICAgICAgICAgIG1lbWNweShsMSwgbCwgQlVGX1NJWkUgKiAyICogc2l6ZW9mKElOVEZMT0FUKSk7CisgICAgICAgICAgICBtZW1jcHkocjEsIHIsIEJVRl9TSVpFICogMiAqIHNpemVvZihJTlRGTE9BVCkpOworICAgICAgICAgICAgYmVuY2hfbmV3KGwxLCByMSwgaCwgaF9zdGVwLCBCVUZfU0laRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfYWFjcHNkc3Aodm9pZCkKK3sKKyAgICBQU0RTUENvbnRleHQgcHNkc3A7CisKKyAgICBmZl9wc2RzcF9pbml0KCZwc2RzcCk7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhwc2RzcC5hZGRfc3F1YXJlcywgInBzX2FkZF9zcXVhcmVzIikpCisgICAgICAgIHRlc3RfYWRkX3NxdWFyZXMoKTsKKyAgICByZXBvcnQoImFkZF9zcXVhcmVzIik7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhwc2RzcC5tdWxfcGFpcl9zaW5nbGUsICJwc19tdWxfcGFpcl9zaW5nbGUiKSkKKyAgICAgICAgdGVzdF9tdWxfcGFpcl9zaW5nbGUoKTsKKyAgICByZXBvcnQoIm11bF9wYWlyX3NpbmdsZSIpOworCisgICAgaWYgKGNoZWNrX2Z1bmMocHNkc3AuaHlicmlkX2FuYWx5c2lzLCAicHNfaHlicmlkX2FuYWx5c2lzIikpCisgICAgICAgIHRlc3RfaHlicmlkX2FuYWx5c2lzKCk7CisgICAgcmVwb3J0KCJoeWJyaWRfYW5hbHlzaXMiKTsKKworICAgIGlmIChjaGVja19mdW5jKHBzZHNwLmh5YnJpZF9hbmFseXNpc19pbGVhdmUsICJwc19oeWJyaWRfYW5hbHlzaXNfaWxlYXZlIikpCisgICAgICAgIHRlc3RfaHlicmlkX2FuYWx5c2lzX2lsZWF2ZSgpOworICAgIHJlcG9ydCgiaHlicmlkX2FuYWx5c2lzX2lsZWF2ZSIpOworCisgICAgaWYgKGNoZWNrX2Z1bmMocHNkc3AuaHlicmlkX3N5bnRoZXNpc19kZWludCwgInBzX2h5YnJpZF9zeW50aGVzaXNfZGVpbnQiKSkKKyAgICAgICAgdGVzdF9oeWJyaWRfc3ludGhlc2lzX2RlaW50KCk7CisgICAgcmVwb3J0KCJoeWJyaWRfc3ludGhlc2lzX2RlaW50Iik7CisKKyAgICB0ZXN0X3N0ZXJlb19pbnRlcnBvbGF0ZSgmcHNkc3ApOworICAgIHJlcG9ydCgic3RlcmVvX2ludGVycG9sYXRlIik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS9hYXJjaDY0L01ha2VmaWxlIGIvdGVzdHMvY2hlY2thc20vYWFyY2g2NC9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJiYTZjYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9jaGVja2FzbS9hYXJjaDY0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQ0hFQ0tBU01PQkpTICs9IGFhcmNoNjQvY2hlY2thc20ubwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vYWFyY2g2NC9jaGVja2FzbS5TIGIvdGVzdHMvY2hlY2thc20vYWFyY2g2NC9jaGVja2FzbS5TCmluZGV4IDYzMTdkODAuLjg5ZjJiNzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NoZWNrYXNtL2FhcmNoNjQvY2hlY2thc20uUworKysgYi90ZXN0cy9jaGVja2FzbS9hYXJjaDY0L2NoZWNrYXNtLlMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgImxpYmF2dXRpbC9hYXJjaDY0L2FzbS5TIgogCi1jb25zdCByZWdpc3Rlcl9pbml0Citjb25zdCByZWdpc3Rlcl9pbml0LCBhbGlnbj00CiAgICAgLnF1YWQgMHgyMWY4NmQ2NmM4Y2EwMGNlCiAgICAgLnF1YWQgMHg3NWI2YmEyMTA3N2M0OGFkCiAgICAgLnF1YWQgMHhlZDU2YmIyZGNiM2M3NzM2CkBAIC01Miw3ICs1MiwyMCBAQAogLy8gbWF4IG51bWJlciBvZiBhcmdzIHVzZWQgYnkgYW55IGFzbSBmdW5jdGlvbi4KICNkZWZpbmUgTUFYX0FSR1MgMTUKIAotI2RlZmluZSBBUkdfU1RBQ0sgKCg4KihNQVhfQVJHUyAtIDcpICsgMTUpICYgfjE1KQorI2RlZmluZSBDTE9CQkVSX1NUQUNLICgoOCpNQVhfQVJHUyArIDE1KSAmIH4xNSkKKworZnVuY3Rpb24gY2hlY2thc21fc3RhY2tfY2xvYmJlciwgZXhwb3J0PTEKKyAgICBtb3YgICAgICAgICB4MywgIHNwCisgICAgbW92ICAgICAgICAgeDIsICAjQ0xPQkJFUl9TVEFDSworMToKKyAgICBzdHAgICAgICAgICB4MCwgIHgxLCAgW3NwLCAjLTE2XSEKKyAgICBzdWJzICAgICAgICB4MiwgIHgyLCAgIzE2CisgICAgYi5ndCAgICAgICAgMWIKKyAgICBtb3YgICAgICAgICBzcCwgIHgzCisgICAgcmV0CitlbmRmdW5jCisKKyNkZWZpbmUgQVJHX1NUQUNLICgoOCooTUFYX0FSR1MgLSA4KSArIDE1KSAmIH4xNSkKIAogZnVuY3Rpb24gY2hlY2thc21fY2hlY2tlZF9jYWxsLCBleHBvcnQ9MQogICAgIHN0cCAgICAgICAgIHgyOSwgeDMwLCBbc3AsICMtMTZdIQpAQCAtODAsMjIgKzkzLDE4IEBACiAKICAgICBzdWIgICAgICAgICBzcCwgIHNwLCAgI0FSR19TVEFDSwogLmVxdSBwb3MsIDAKLS8vIHRoZSBmaXJzdCBzdGFja2VkIGFyZyBpcyBjb3BpZWQgdG8geDcKLS5yZXB0IE1BWF9BUkdTLTcKLSAgICBsZHIgICAgICAgICB4OSwgW3gyOSwgIzE2ICsgOCArIHBvc10KKy5yZXB0IE1BWF9BUkdTLTgKKyAgICAvLyBTa2lwIHRoZSBmaXJzdCA4IGFyZ3MsIHRoYXQgYXJlIGxvYWRlZCBpbnRvIHJlZ2lzdGVycworICAgIGxkciAgICAgICAgIHg5LCBbeDI5LCAjMTYgKyA4KjggKyBwb3NdCiAgICAgc3RyICAgICAgICAgeDksIFtzcCwgI3Bvc10KIC5lcXUgcG9zLCBwb3MgKyA4CiAuZW5kcgogCiAgICAgbW92ICAgICAgICAgeDEyLCB4MAotICAgIG1vdiAgICAgICAgIHgwLCAgeDEKLSAgICBtb3YgICAgICAgICB4MSwgIHgyCi0gICAgbW92ICAgICAgICAgeDIsICB4MwotICAgIG1vdiAgICAgICAgIHgzLCAgeDQKLSAgICBtb3YgICAgICAgICB4NCwgIHg1Ci0gICAgbW92ICAgICAgICAgeDUsICB4NgotICAgIG1vdiAgICAgICAgIHg2LCAgeDcKLSAgICBsZHIgICAgICAgICB4NywgIFt4MjksICMxNl0KKyAgICBsZHAgICAgICAgICB4MCwgIHgxLCAgW3gyOSwgIzE2XQorICAgIGxkcCAgICAgICAgIHgyLCAgeDMsICBbeDI5LCAjMzJdCisgICAgbGRwICAgICAgICAgeDQsICB4NSwgIFt4MjksICM0OF0KKyAgICBsZHAgICAgICAgICB4NiwgIHg3LCAgW3gyOSwgIzY0XQogICAgIGJsciAgICAgICAgIHgxMgogICAgIGFkZCAgICAgICAgIHNwLCAgc3AsICAjQVJHX1NUQUNLCiAgICAgc3RwICAgICAgICAgeDAsICB4MSwgIFtzcCwgIy0xNl0hCkBAIC0xMDMsMTAgKzExMiwxMCBAQAogICAgIG1vdmkgICAgICAgIHYzLjhoLCAgIzAKIAogLm1hY3JvIGNoZWNrX3JlZ19uZW9uIHJlZzEsIHJlZzIKLSAgICBsZHIgICAgICAgICBxMCwgIFt4OV0sICMxNgotICAgIHV6cDEgICAgICAgIHYxLjJkLCAgdlxyZWcxXCgpLjJkLCB2XHJlZzJcKCkuMmQKLSAgICBlb3IgICAgICAgICB2MC4xNmIsIHYwLjE2YiwgdjEuMTZiCi0gICAgb3JyICAgICAgICAgdjMuMTZiLCB2My4xNmIsIHYwLjE2YgorICAgIGxkciAgICAgICAgIHExLCAgW3g5XSwgIzE2CisgICAgdXpwMSAgICAgICAgdjIuMmQsICB2XHJlZzFcKCkuMmQsIHZccmVnMlwoKS4yZAorICAgIGVvciAgICAgICAgIHYxLjE2YiwgdjEuMTZiLCB2Mi4xNmIKKyAgICBvcnIgICAgICAgICB2My4xNmIsIHYzLjE2YiwgdjEuMTZiCiAuZW5kbQogICAgIGNoZWNrX3JlZ19uZW9uICA4LCAgOQogICAgIGNoZWNrX3JlZ19uZW9uICAxMCwgMTEKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL2FybS9NYWtlZmlsZSBiL3Rlc3RzL2NoZWNrYXNtL2FybS9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmMjM4My4uMDAwMDAwMAotLS0gYS90ZXN0cy9jaGVja2FzbS9hcm0vTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1DSEVDS0FTTU9CSlMtJChIQVZFX0FSTVY1VEVfRVhURVJOQUwpICs9IGFybS9jaGVja2FzbS5vCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS9hcm0vY2hlY2thc20uUyBiL3Rlc3RzL2NoZWNrYXNtL2FybS9jaGVja2FzbS5TCmluZGV4IDNlMzgwNmIuLjIwNTFiMjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NoZWNrYXNtL2FybS9jaGVja2FzbS5TCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2FybS9jaGVja2FzbS5TCkBAIC0yMiw3ICsyMiwxMyBAQAogCiAjaW5jbHVkZSAibGliYXZ1dGlsL2FybS9hc20uUyIKIAotY29uc3QgcmVnaXN0ZXJfaW5pdAorLyogb3ZlcnJpZGUgZnB1IHNvIHRoYXQgTkVPTiBpbnN0cnVjdGlvbnMgYXJlIHJlamVjdGVkICovCisjaWYgSEFWRV9WRlAKK0ZQVSAgICAgLmZwdSAgICAgICAgICAgIHZmcAorRUxGICAgICAuZWFiaV9hdHRyaWJ1dGUgMTAsIDAgICAgICAgICAgIEAgc3VwcHJlc3MgVGFnX0ZQX2FyY2gKKyNlbmRpZgorCitjb25zdCByZWdpc3Rlcl9pbml0LCBhbGlnbj0zCiAgICAgLnF1YWQgMHgyMWY4NmQ2NmM4Y2EwMGNlCiAgICAgLnF1YWQgMHg3NWI2YmEyMTA3N2M0OGFkCiAgICAgLnF1YWQgMHhlZDU2YmIyZGNiM2M3NzM2CkBAIC0zMywxNCArMzksMjEgQEAKICAgICAucXVhZCAweDI0OTIxNDEwOWQ1ZDFjODgKIGVuZGNvbnN0CiAKLWNvbnN0IGVycm9yX21lc3NhZ2UKLSAgICAuYXNjaXogImZhaWxlZCB0byBwcmVzZXJ2ZSByZWdpc3RlciIKK2NvbnN0IGVycm9yX21lc3NhZ2VfZnBzY3IKKyAgICAuYXNjaXogImZhaWxlZCB0byBwcmVzZXJ2ZSByZWdpc3RlciBGUFNDUiwgY2hhbmdlZCBiaXRzOiAleCIKK2Vycm9yX21lc3NhZ2VfZ3ByOgorICAgIC5hc2NpeiAiZmFpbGVkIHRvIHByZXNlcnZlIHJlZ2lzdGVyIHIlZCIKK2Vycm9yX21lc3NhZ2VfdmZwOgorICAgIC5hc2NpeiAiZmFpbGVkIHRvIHByZXNlcnZlIHJlZ2lzdGVyIGQlZCIKIGVuZGNvbnN0CiAKIEAgbWF4IG51bWJlciBvZiBhcmdzIHVzZWQgYnkgYW55IGFzbSBmdW5jdGlvbi4KICNkZWZpbmUgTUFYX0FSR1MgMTUKIAotI2RlZmluZSBBUkdfU1RBQ0sgNCooTUFYX0FSR1MgLSAyKQorI2RlZmluZSBBUkdfU1RBQ0sgNCooTUFYX0FSR1MgLSA0KQorCitAIGFsaWduIHRoZSB1c2VkIHN0YWNrIHNwYWNlIHRvIDggdG8gcHJlc2VydmUgdGhlIHN0YWNrIGFsaWdubWVudAorI2RlZmluZSBBUkdfU1RBQ0tfQSAoKChBUkdfU1RBQ0sgKyBwdXNoZWQgKyA3KSAmIH43KSAtIHB1c2hlZCkKIAogLm1hY3JvIGNsb2JiZXJjaGVjayB2YXJpYW50CiAuZXF1IHB1c2hlZCwgNCo5CkBAIC01OSwxMCArNzIsMTAgQEAKIC5lbmRpZgogICAgIGxkbSAgICAgICAgIHIxMiwge3I0LXIxMX0KIAotICAgIHN1YiAgICAgICAgIHNwLCAgc3AsICAjQVJHX1NUQUNLCisgICAgc3ViICAgICAgICAgc3AsICBzcCwgICNBUkdfU1RBQ0tfQQogLmVxdSBwb3MsIDAKLS5yZXB0IE1BWF9BUkdTLTIKLSAgICBsZHIgICAgICAgICByMTIsIFtzcCwgI0FSR19TVEFDSyArIHB1c2hlZCArIDggKyBwb3NdCisucmVwdCBNQVhfQVJHUy00CisgICAgbGRyICAgICAgICAgcjEyLCBbc3AsICNBUkdfU1RBQ0tfQSArIHB1c2hlZCArIDggKyBwb3NdCiAgICAgc3RyICAgICAgICAgcjEyLCBbc3AsICNwb3NdCiAuZXF1IHBvcywgcG9zICsgNAogLmVuZHIKQEAgLTcwLDQ1ICs4Myw1MSBAQAogICAgIG1vdiAgICAgICAgIHIxMiwgcjAKICAgICBtb3YgICAgICAgICByMCwgIHIyCiAgICAgbW92ICAgICAgICAgcjEsICByMwotICAgIGxkcmQgICAgICAgIHIyLCAgcjMsICBbc3AsICNBUkdfU1RBQ0sgKyBwdXNoZWRdCisgICAgbGRyZCAgICAgICAgcjIsICByMywgIFtzcCwgI0FSR19TVEFDS19BICsgcHVzaGVkXQogICAgIGJseCAgICAgICAgIHIxMgotICAgIGFkZCAgICAgICAgIHNwLCAgc3AsICAjQVJHX1NUQUNLCisgICAgYWRkICAgICAgICAgc3AsICBzcCwgICNBUkdfU1RBQ0tfQQogCiAgICAgcHVzaCAgICAgICAge3IwLCByMX0KICAgICBtb3ZyZWwgICAgICByMTIsIHJlZ2lzdGVyX2luaXQKLSAgICBtb3YgICAgICAgICByMywgICMwCiAuaWZjIFx2YXJpYW50LCB2ZnAKLS5tYWNybyBjaGVja19yZWdfdmZwLCBkcmVnLCBpbmM9OAotICAgIGxkcmQgICAgICAgIHIwLCAgcjEsICBbcjEyXSwgI1xpbmMKLSAgICB2bW92ICAgICAgICByMiwgIGxyLCAgXGRyZWcKLSAgICBlb3IgICAgICAgICByMCwgIHIwLCAgcjIKLSAgICBlb3IgICAgICAgICByMSwgIHIxLCAgbHIKLSAgICBvcnIgICAgICAgICByMywgIHIzLCAgcjAKLSAgICBvcnIgICAgICAgICByMywgIHIzLCAgcjEKKy5tYWNybyBjaGVja19yZWdfdmZwLCBkcmVnLCBvZmZzZXQKKyAgICBsZHJkICAgICAgICByMiwgIHIzLCAgW3IxMiwgIzggKiAoXG9mZnNldCldCisgICAgdm1vdiAgICAgICAgcjAsICBsciwgIFxkcmVnCisgICAgZW9yICAgICAgICAgcjIsICByMiwgIHIwCisgICAgZW9yICAgICAgICAgcjMsICByMywgIGxyCisgICAgb3JycyAgICAgICAgcjIsICByMiwgIHIzCisgICAgYm5lICAgICAgICAgNGYKIC5lbmRtCiAKLS5pcnAgbiwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0Ci0gICAgY2hlY2tfcmVnX3ZmcCBkXG4KKy5pcnAgbiwgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorICAgIEAga2VlcCB0cmFjayBvZiB0aGUgY2hlY2tlZCBkb3VibGUvU0lNRCByZWdpc3RlcgorICAgIG1vdiAgICAgICAgIHIxLCAgI1xuCisgICAgY2hlY2tfcmVnX3ZmcCBkXG4sIFxuLTgKIC5lbmRyCi0gICAgY2hlY2tfcmVnX3ZmcCBkMTUsIC01NgogLnB1cmdlbSBjaGVja19yZWdfdmZwCiAKLSAgICBmbXJ4ICAgICAgICByMCwgIEZQU0NSCi0gICAgbGRyICAgICAgICAgcjEsICBbc3AsICM4XQotICAgIGVvciAgICAgICAgIHIwLCAgcjAsICByMQorICAgIGZtcnggICAgICAgIHIxLCAgRlBTQ1IKKyAgICBsZHIgICAgICAgICByMywgIFtzcCwgIzhdCisgICAgZW9yICAgICAgICAgcjEsICByMSwgIHIzCisgICAgQCBJZ25vcmUgY2hhbmdlcyBpbiBiaXRzIDAtNCBhbmQgNworICAgIGJpYyAgICAgICAgIHIxLCAgcjEsICAjMHg5ZgogICAgIEAgSWdub3JlIGNoYW5nZXMgaW4gdGhlIHRvcG1vc3QgNSBiaXRzCi0gICAgbHNsICAgICAgICAgcjAsICByMCwgICM1Ci0gICAgb3JyICAgICAgICAgcjMsICByMywgIHIwCisgICAgYmljcyAgICAgICAgcjEsICByMSwgICMweGY4MDAwMDAwCisgICAgYm5lICAgICAgICAgM2YKIC5lbmRpZgogCisgICAgQCBrZWVwIHRyYWNrIG9mIHRoZSBjaGVja2VkIEdQUgorICAgIG1vdiAgICAgICAgIHIxLCAgIzQKIC5tYWNybyBjaGVja19yZWcgcmVnMSwgcmVnMj0KLSAgICBsZHJkICAgICAgICByMCwgIHIxLCAgW3IxMl0sICM4Ci0gICAgZW9yICAgICAgICAgcjAsICByMCwgIFxyZWcxCi0gICAgb3JycyAgICAgICAgcjMsICByMywgIHIwCisgICAgbGRyZCAgICAgICAgcjIsICByMywgIFtyMTJdLCAjOAorICAgIGVvcnMgICAgICAgIHIyLCAgcjIsICBccmVnMQorICAgIGJuZSAgICAgICAgIDJmCisgICAgYWRkICAgICAgICAgcjEsICByMSwgICMxCiAuaWZuYiBccmVnMgotICAgIGVvciAgICAgICAgIHIxLCAgcjEsICBccmVnMgotICAgIG9ycnMgICAgICAgIHIzLCAgcjMsICByMQorICAgIGVvcnMgICAgICAgIHIzLCAgcjMsICBccmVnMgorICAgIGJuZSAgICAgICAgIDJmCiAuZW5kaWYKKyAgICBhZGQgICAgICAgICByMSwgIHIxLCAgIzEKIC5lbmRtCiAgICAgY2hlY2tfcmVnICAgcjQsICByNQogICAgIGNoZWNrX3JlZyAgIHI2LCAgcjcKQEAgLTEyMSw5ICsxNDAsMTYgQEAKICAgICBjaGVja19yZWcgICByMTAsIHIxMQogLnB1cmdlbSBjaGVja19yZWcKIAotICAgIGJlcSAgICAgICAgIDBmCi0KLSAgICBtb3ZyZWwgICAgICByMCwgZXJyb3JfbWVzc2FnZQorICAgIGIgICAgICAgICAgIDBmCis0OgorICAgIG1vdnJlbCAgICAgIHIwLCBlcnJvcl9tZXNzYWdlX3ZmcAorICAgIGIgICAgICAgICAgIDFmCiszOgorICAgIG1vdnJlbCAgICAgIHIwLCBlcnJvcl9tZXNzYWdlX2Zwc2NyCisgICAgYiAgICAgICAgICAgMWYKKzI6CisgICAgbW92cmVsICAgICAgcjAsIGVycm9yX21lc3NhZ2VfZ3ByCisxOgogICAgIGJseCAgICAgICAgIFgoY2hlY2thc21fZmFpbF9mdW5jKQogMDoKICAgICBwb3AgICAgICAgICB7cjAsIHIxfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vYXVkaW9kc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL2F1ZGlvZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0ZTE2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2F1ZGlvZHNwLmMKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F1ZGlvZHNwLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAiY2hlY2thc20uaCIKKworI2RlZmluZSBNQVhfU0laRSAoMzIgKiAxMjgpCisKKyNkZWZpbmUgcmFuZG9taXplX2Zsb2F0KGJ1ZiwgbGVuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmbG9hdCBmID0gKGZsb2F0KXJuZCgpIC8gKFVJTlRfTUFYID4+IDUpIC0gMTYuMGY7ICAgXAorICAgICAgICAgICAgYnVmW2ldID0gZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSByYW5kb21pemVfaW50KGJ1ZiwgbGVuLCBzaXplLCBiaXRzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50ICMjIHNpemUgIyMgX3QgciA9IHJuZCgpICYgKCgxTEwgPDwgYml0cykgLSAxKTsgICAgIFwKKyAgICAgICAgICAgIEFWX1dOICMjIHNpemUgIyMgQShidWYgKyBpLCAtKDFMTCA8PCAoYml0cyAtIDEpKSArIHIpOyAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKwordm9pZCBjaGVja2FzbV9jaGVja19hdWRpb2RzcCh2b2lkKQoreworICAgIEF1ZGlvRFNQQ29udGV4dCBhZHNwOworCisgICAgZmZfYXVkaW9kc3BfaW5pdCgmYWRzcCk7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhhZHNwLnNjYWxhcnByb2R1Y3RfaW50MTYsICJhdWRpb2RzcC5zY2FsYXJwcm9kdWN0X2ludDE2IikpIHsKKyAgICAgICAgTE9DQUxfQUxJR05FRCgzMiwgaW50MTZfdCwgdjEsIFtNQVhfU0laRV0pOworICAgICAgICBMT0NBTF9BTElHTkVEKDMyLCBpbnQxNl90LCB2MiwgW01BWF9TSVpFXSk7CisgICAgICAgIHVuc2lnbmVkIGludCBsZW5fYml0c19taW51czQsIHYxX2JpdHMsIHYyX2JpdHMsIGxlbjsKKyAgICAgICAgaW50MzJfdCByZXMwLCByZXMxOworCisgICAgICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgaW50MzJfdCwgY29uc3QgaW50MTZfdCAqdjEsIGNvbnN0IGludDE2X3QgKnYyLCBpbnQgbGVuKTsKKworICAgICAgICAvLyBnZW5lcmF0ZSByYW5kb20gNS0xMmJpdCB2ZWN0b3IgbGVuZ3RoCisgICAgICAgIGxlbl9iaXRzX21pbnVzNCA9IHJuZCgpICUgODsKKyAgICAgICAgbGVuID0gcm5kKCkgJiAoKDEgPDwgbGVuX2JpdHNfbWludXM0KSAtIDEpOworICAgICAgICBsZW4gPSAxNiAqIEZGTUFYKGxlbiwgMSk7CisKKyAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIGJpdCBjb3VudHMgZm9yIGVhY2ggb2YgdGhlIHZlY3RvcnMgc3VjaCB0aGF0IHRoZSByZXN1bHQKKyAgICAgICAgLy8gZml0cyBpbnRvIGludDMyCisgICAgICAgIHYxX2JpdHMgPSAxICsgcm5kKCkgJSAxNTsKKyAgICAgICAgdjJfYml0cyA9IEZGTUlOKDMyIC0gKGxlbl9iaXRzX21pbnVzNCArIDQpIC0gdjFfYml0cyAtIDEsIDE1KTsKKworICAgICAgICByYW5kb21pemVfaW50KHYxLCBNQVhfU0laRSwgMTYsIHYxX2JpdHMgKyAxKTsKKyAgICAgICAgcmFuZG9taXplX2ludCh2MiwgTUFYX1NJWkUsIDE2LCB2Ml9iaXRzICsgMSk7CisKKyAgICAgICAgcmVzMCA9IGNhbGxfcmVmKHYxLCB2MiwgbGVuKTsKKyAgICAgICAgcmVzMSA9IGNhbGxfbmV3KHYxLCB2MiwgbGVuKTsKKyAgICAgICAgaWYgKHJlczAgIT0gcmVzMSkKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgYmVuY2hfbmV3KHYxLCB2MiwgTUFYX1NJWkUpOworICAgIH0KKworICAgIGlmIChjaGVja19mdW5jKGFkc3AudmVjdG9yX2NsaXBfaW50MzIsICJhdWRpb2RzcC52ZWN0b3JfY2xpcF9pbnQzMiIpKSB7CisgICAgICAgIExPQ0FMX0FMSUdORUQoMzIsIGludDMyX3QsIHNyYywgIFtNQVhfU0laRV0pOworICAgICAgICBMT0NBTF9BTElHTkVEKDMyLCBpbnQzMl90LCBkc3QwLCBbTUFYX1NJWkVdKTsKKyAgICAgICAgTE9DQUxfQUxJR05FRCgzMiwgaW50MzJfdCwgZHN0MSwgW01BWF9TSVpFXSk7CisgICAgICAgIGludDMyX3QgdmFsMSwgdmFsMiwgbWluLCBtYXg7CisgICAgICAgIGludCBsZW47CisKKyAgICAgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCBpbnQzMl90ICpkc3QsIGNvbnN0IGludDMyX3QgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW4sIGludDMyX3QgbWF4LCB1bnNpZ25lZCBpbnQgbGVuKTsKKworICAgICAgICB2YWwxID0gKChpbnQzMl90KXJuZCgpKTsKKyAgICAgICAgdmFsMSA9IEZGU0lHTih2YWwxKSAqICh2YWwxICYgKCgxIDw8IDI0KSAtIDEpKTsKKyAgICAgICAgdmFsMiA9ICgoaW50MzJfdClybmQoKSk7CisgICAgICAgIHZhbDIgPSBGRlNJR04odmFsMikgKiAodmFsMiAmICgoMSA8PCAyNCkgLSAxKSk7CisKKyAgICAgICAgbWluID0gRkZNSU4odmFsMSwgdmFsMik7CisgICAgICAgIG1heCA9IEZGTUFYKHZhbDEsIHZhbDIpOworCisgICAgICAgIHJhbmRvbWl6ZV9pbnQoc3JjLCBNQVhfU0laRSwgMzIsIDMyKTsKKworICAgICAgICBsZW4gPSBybmQoKSAlIDEyODsKKyAgICAgICAgbGVuID0gMzIgKiBGRk1BWChsZW4sIDEpOworCisgICAgICAgIGNhbGxfcmVmKGRzdDAsIHNyYywgbWluLCBtYXgsIGxlbik7CisgICAgICAgIGNhbGxfbmV3KGRzdDEsIHNyYywgbWluLCBtYXgsIGxlbik7CisgICAgICAgIGlmIChtZW1jbXAoZHN0MCwgZHN0MSwgbGVuICogc2l6ZW9mKCpkc3QwKSkpCisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIGJlbmNoX25ldyhkc3QxLCBzcmMsIG1pbiwgbWF4LCBNQVhfU0laRSk7CisgICAgfQorCisgICAgaWYgKGNoZWNrX2Z1bmMoYWRzcC52ZWN0b3JfY2xpcGYsICJhdWRpb2RzcC52ZWN0b3JfY2xpcGYiKSkgeworICAgICAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgc3JjLCBbTUFYX1NJWkVdKTsKKyAgICAgICAgTE9DQUxfQUxJR05FRCgzMiwgZmxvYXQsIGRzdDAsIFtNQVhfU0laRV0pOworICAgICAgICBMT0NBTF9BTElHTkVEKDMyLCBmbG9hdCwgZHN0MSwgW01BWF9TSVpFXSk7CisgICAgICAgIGZsb2F0IHZhbDEsIHZhbDIsIG1pbiwgbWF4OworICAgICAgICBpbnQgaSwgbGVuOworCisgICAgICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgdm9pZCwgZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgZmxvYXQgbWluLCBmbG9hdCBtYXgpOworCisgICAgICAgIHZhbDEgPSAoZmxvYXQpcm5kKCkgLyAoVUlOVF9NQVggPj4gMSkgLSAxLjBmOworICAgICAgICB2YWwyID0gKGZsb2F0KXJuZCgpIC8gKFVJTlRfTUFYID4+IDEpIC0gMS4wZjsKKworICAgICAgICBtaW4gPSBGRk1JTih2YWwxLCB2YWwyKTsKKyAgICAgICAgbWF4ID0gRkZNQVgodmFsMSwgdmFsMik7CisKKyAgICAgICAgcmFuZG9taXplX2Zsb2F0KHNyYywgTUFYX1NJWkUpOworCisgICAgICAgIGxlbiA9IHJuZCgpICUgMTI4OworICAgICAgICBsZW4gPSAxNiAqIEZGTUFYKGxlbiwgMSk7CisKKyAgICAgICAgY2FsbF9yZWYoZHN0MCwgc3JjLCBsZW4sIG1pbiwgbWF4KTsKKyAgICAgICAgY2FsbF9uZXcoZHN0MSwgc3JjLCBsZW4sIG1pbiwgbWF4KTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWZsb2F0X25lYXJfdWxwX2FycmF5KGRzdDAsIGRzdDEsIDMsIGxlbikpCisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisgICAgICAgIGJlbmNoX25ldyhkc3QxLCBzcmMsIE1BWF9TSVpFLCBtaW4sIG1heCk7CisgICAgfQorCisgICAgcmVwb3J0KCJhdWRpb2RzcCIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vYmxvY2tkc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL2Jsb2NrZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1MzUwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2Jsb2NrZHNwLmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBIZW5yaWsgR3JhbW5lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImNoZWNrYXNtLmgiCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2Jsb2NrZHNwLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXJzKHNpemUpICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQxNl90IHIgPSBybmQoKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfV04xNkEoYnVmMCArIGksIHIpOyAgICAgICAgICBcCisgICAgICAgICAgICBBVl9XTjE2QShidWYxICsgaSwgcik7ICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgY2hlY2tfY2xlYXIoZnVuYywgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGNoZWNrX2Z1bmMoaC5mdW5jLCAiYmxvY2tkc3AuIiAjZnVuYykpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCBpbnQxNl90ICpibG9jayk7ICAgXAorICAgICAgICByYW5kb21pemVfYnVmZmVycyhzaXplKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhbGxfcmVmKGJ1ZjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FsbF9uZXcoYnVmMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobWVtY21wKGJ1ZjAsIGJ1ZjEsIHNpemVvZigqYnVmMCkgKiBzaXplKSkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmYWlsKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmVuY2hfbmV3KGJ1ZjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCit2b2lkIGNoZWNrYXNtX2NoZWNrX2Jsb2NrZHNwKHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50MTZfdCwgYnVmMCwgWzYgKiA4ICogOF0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDE2X3QsIGJ1ZjEsIFs2ICogOCAqIDhdKTsKKworICAgIEFWQ29kZWNDb250ZXh0IGF2Y3R4ID0geyAwIH07CisgICAgQmxvY2tEU1BDb250ZXh0IGg7CisKKyAgICBmZl9ibG9ja2RzcF9pbml0KCZoLCAmYXZjdHgpOworCisgICAgY2hlY2tfY2xlYXIoY2xlYXJfYmxvY2ssICA4ICogOCk7CisgICAgY2hlY2tfY2xlYXIoY2xlYXJfYmxvY2tzLCA4ICogOCAqIDYpOworCisgICAgcmVwb3J0KCJibG9ja2RzcCIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vY2hlY2thc20uYyBiL3Rlc3RzL2NoZWNrYXNtL2NoZWNrYXNtLmMKaW5kZXggMWU3M2UzNC4uYmExZDFkMCAxMDA2NDQKLS0tIGEvdGVzdHMvY2hlY2thc20vY2hlY2thc20uYworKysgYi90ZXN0cy9jaGVja2FzbS9jaGVja2FzbS5jCkBAIC0yMCw2ICsyMCwxNCBAQAogICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KICAqLwogCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBDT05GSUdfTElOVVhfUEVSRgorIyBpZm5kZWYgX0dOVV9TT1VSQ0UKKyMgIGRlZmluZSBfR05VX1NPVVJDRSAvLyBmb3Igc3lzY2FsbCAocGVyZm9ybWFuY2UgbW9uaXRvcmluZyBBUEkpCisjIGVuZGlmCisjZW5kaWYKKwogI2luY2x1ZGUgPHN0ZGFyZy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC02NSwxMSArNzMsMTggQEAKICAgICB2b2lkICgqZnVuYykodm9pZCk7CiB9IHRlc3RzW10gPSB7CiAjaWYgQ09ORklHX0FWQ09ERUMKKyAgICAjaWYgQ09ORklHX0FBQ19ERUNPREVSCisgICAgICAgIHsgImFhY3BzZHNwIiwgY2hlY2thc21fY2hlY2tfYWFjcHNkc3AgfSwKKyAgICAgICAgeyAic2JyZHNwIiwgICBjaGVja2FzbV9jaGVja19zYnJkc3AgfSwKKyAgICAjZW5kaWYKICAgICAjaWYgQ09ORklHX0FMQUNfREVDT0RFUgogICAgICAgICB7ICJhbGFjZHNwIiwgY2hlY2thc21fY2hlY2tfYWxhY2RzcCB9LAogICAgICNlbmRpZgotICAgICNpZiBDT05GSUdfQkxFTkRfRklMVEVSCi0gICAgICAgIHsgInZmX2JsZW5kIiwgY2hlY2thc21fY2hlY2tfYmxlbmQgfSwKKyAgICAjaWYgQ09ORklHX0FVRElPRFNQCisgICAgICAgIHsgImF1ZGlvZHNwIiwgY2hlY2thc21fY2hlY2tfYXVkaW9kc3AgfSwKKyAgICAjZW5kaWYKKyAgICAjaWYgQ09ORklHX0JMT0NLRFNQCisgICAgICAgIHsgImJsb2NrZHNwIiwgY2hlY2thc21fY2hlY2tfYmxvY2tkc3AgfSwKICAgICAjZW5kaWYKICAgICAjaWYgQ09ORklHX0JTV0FQRFNQCiAgICAgICAgIHsgImJzd2FwZHNwIiwgY2hlY2thc21fY2hlY2tfYnN3YXBkc3AgfSwKQEAgLTc3LDI3ICs5Miw1NiBAQAogICAgICNpZiBDT05GSUdfRENBX0RFQ09ERVIKICAgICAgICAgeyAic3ludGhfZmlsdGVyIiwgY2hlY2thc21fY2hlY2tfc3ludGhfZmlsdGVyIH0sCiAgICAgI2VuZGlmCisgICAgI2lmIENPTkZJR19FWFJfREVDT0RFUgorICAgICAgICB7ICJleHJkc3AiLCBjaGVja2FzbV9jaGVja19leHJkc3AgfSwKKyAgICAjZW5kaWYKICAgICAjaWYgQ09ORklHX0ZMQUNEU1AKICAgICAgICAgeyAiZmxhY2RzcCIsIGNoZWNrYXNtX2NoZWNrX2ZsYWNkc3AgfSwKICAgICAjZW5kaWYKICAgICAjaWYgQ09ORklHX0ZNVENPTlZFUlQKICAgICAgICAgeyAiZm10Y29udmVydCIsIGNoZWNrYXNtX2NoZWNrX2ZtdGNvbnZlcnQgfSwKICAgICAjZW5kaWYKKyAgICAjaWYgQ09ORklHX0c3MjJEU1AKKyAgICAgICAgeyAiZzcyMmRzcCIsIGNoZWNrYXNtX2NoZWNrX2c3MjJkc3AgfSwKKyAgICAjZW5kaWYKKyAgICAjaWYgQ09ORklHX0gyNjREU1AKKyAgICAgICAgeyAiaDI2NGRzcCIsIGNoZWNrYXNtX2NoZWNrX2gyNjRkc3AgfSwKKyAgICAjZW5kaWYKICAgICAjaWYgQ09ORklHX0gyNjRQUkVECiAgICAgICAgIHsgImgyNjRwcmVkIiwgY2hlY2thc21fY2hlY2tfaDI2NHByZWQgfSwKICAgICAjZW5kaWYKICAgICAjaWYgQ09ORklHX0gyNjRRUEVMCiAgICAgICAgIHsgImgyNjRxcGVsIiwgY2hlY2thc21fY2hlY2tfaDI2NHFwZWwgfSwKICAgICAjZW5kaWYKKyAgICAjaWYgQ09ORklHX0hFVkNfREVDT0RFUgorICAgICAgICB7ICJoZXZjX2FkZF9yZXMiLCBjaGVja2FzbV9jaGVja19oZXZjX2FkZF9yZXMgfSwKKyAgICAgICAgeyAiaGV2Y19pZGN0IiwgY2hlY2thc21fY2hlY2tfaGV2Y19pZGN0IH0sCisgICAgICAgIHsgImhldmNfc2FvIiwgY2hlY2thc21fY2hlY2tfaGV2Y19zYW8gfSwKKyAgICAjZW5kaWYKKyAgICAjaWYgQ09ORklHX0hVRkZZVVZfREVDT0RFUgorICAgICAgICB7ICJodWZmeXV2ZHNwIiwgY2hlY2thc21fY2hlY2tfaHVmZnl1dmRzcCB9LAorICAgICNlbmRpZgogICAgICNpZiBDT05GSUdfSlBFRzIwMDBfREVDT0RFUgogICAgICAgICB7ICJqcGVnMjAwMGRzcCIsIGNoZWNrYXNtX2NoZWNrX2pwZWcyMDAwZHNwIH0sCiAgICAgI2VuZGlmCisgICAgI2lmIENPTkZJR19IVUZGWVVWRFNQCisgICAgICAgIHsgImxsdmlkZHNwIiwgY2hlY2thc21fY2hlY2tfbGx2aWRkc3AgfSwKKyAgICAjZW5kaWYKKyAgICAjaWYgQ09ORklHX0xMVklERU5DRFNQCisgICAgICAgIHsgImxsdmlkZHNwZW5jIiwgY2hlY2thc21fY2hlY2tfbGx2aWRkc3BlbmMgfSwKKyAgICAjZW5kaWYKICAgICAjaWYgQ09ORklHX1BJWEJMT0NLRFNQCiAgICAgICAgIHsgInBpeGJsb2NrZHNwIiwgY2hlY2thc21fY2hlY2tfcGl4YmxvY2tkc3AgfSwKICAgICAjZW5kaWYKKyAgICAjaWYgQ09ORklHX1VUVklERU9fREVDT0RFUgorICAgICAgICB7ICJ1dHZpZGVvZHNwIiwgY2hlY2thc21fY2hlY2tfdXR2aWRlb2RzcCB9LAorICAgICNlbmRpZgogICAgICNpZiBDT05GSUdfVjIxMF9FTkNPREVSCiAgICAgICAgIHsgInYyMTBlbmMiLCBjaGVja2FzbV9jaGVja192MjEwZW5jIH0sCiAgICAgI2VuZGlmCisgICAgI2lmIENPTkZJR19WUDhEU1AKKyAgICAgICAgeyAidnA4ZHNwIiwgY2hlY2thc21fY2hlY2tfdnA4ZHNwIH0sCisgICAgI2VuZGlmCiAgICAgI2lmIENPTkZJR19WUDlfREVDT0RFUgogICAgICAgICB7ICJ2cDlkc3AiLCBjaGVja2FzbV9jaGVja192cDlkc3AgfSwKICAgICAjZW5kaWYKQEAgLTEwNSw2ICsxNDksMjcgQEAKICAgICAgICAgeyAidmlkZW9kc3AiLCBjaGVja2FzbV9jaGVja192aWRlb2RzcCB9LAogICAgICNlbmRpZgogI2VuZGlmCisjaWYgQ09ORklHX0FWRklMVEVSCisgICAgI2lmIENPTkZJR19CTEVORF9GSUxURVIKKyAgICAgICAgeyAidmZfYmxlbmQiLCBjaGVja2FzbV9jaGVja19ibGVuZCB9LAorICAgICNlbmRpZgorICAgICNpZiBDT05GSUdfQ09MT1JTUEFDRV9GSUxURVIKKyAgICAgICAgeyAidmZfY29sb3JzcGFjZSIsIGNoZWNrYXNtX2NoZWNrX2NvbG9yc3BhY2UgfSwKKyAgICAjZW5kaWYKKyAgICAjaWYgQ09ORklHX0hGTElQX0ZJTFRFUgorICAgICAgICB7ICJ2Zl9oZmxpcCIsIGNoZWNrYXNtX2NoZWNrX3ZmX2hmbGlwIH0sCisgICAgI2VuZGlmCisgICAgI2lmIENPTkZJR19USFJFU0hPTERfRklMVEVSCisgICAgICAgIHsgInZmX3RocmVzaG9sZCIsIGNoZWNrYXNtX2NoZWNrX3ZmX3RocmVzaG9sZCB9LAorICAgICNlbmRpZgorI2VuZGlmCisjaWYgQ09ORklHX1NXU0NBTEUKKyAgICB7ICJzd19yZ2IiLCBjaGVja2FzbV9jaGVja19zd19yZ2IgfSwKKyNlbmRpZgorI2lmIENPTkZJR19BVlVUSUwKKyAgICAgICAgeyAiZml4ZWRfZHNwIiwgY2hlY2thc21fY2hlY2tfZml4ZWRfZHNwIH0sCisgICAgICAgIHsgImZsb2F0X2RzcCIsIGNoZWNrYXNtX2NoZWNrX2Zsb2F0X2RzcCB9LAorI2VuZGlmCiAgICAgeyBOVUxMIH0KIH07CiAKQEAgLTE0Niw2ICsyMTEsNyBAQAogICAgIHsgIkZNQTMiLCAgICAgImZtYTMiLCAgICAgQVZfQ1BVX0ZMQUdfRk1BMyB9LAogICAgIHsgIkZNQTQiLCAgICAgImZtYTQiLCAgICAgQVZfQ1BVX0ZMQUdfRk1BNCB9LAogICAgIHsgIkFWWDIiLCAgICAgImF2eDIiLCAgICAgQVZfQ1BVX0ZMQUdfQVZYMiB9LAorICAgIHsgIkFWWC01MTIiLCAgImF2eDUxMiIsICAgQVZfQ1BVX0ZMQUdfQVZYNTEyIH0sCiAjZW5kaWYKICAgICB7IE5VTEwgfQogfTsKQEAgLTE1NSw4ICsyMjEsNyBAQAogICAgIHZvaWQgKmZ1bmM7CiAgICAgaW50IG9rOwogICAgIGludCBjcHU7Ci0gICAgaW50IGl0ZXJhdGlvbnM7Ci0gICAgdWludDY0X3QgY3ljbGVzOworICAgIENoZWNrYXNtUGVyZiBwZXJmOwogfSBDaGVja2FzbUZ1bmNWZXJzaW9uOwogCiAvKiBCaW5hcnkgc2VhcmNoIHRyZWUgbm9kZSAqLwpAQCAtMTc3LDkgKzI0MiwxNCBAQAogICAgIGludCBiZW5jaF9wYXR0ZXJuX2xlbjsKICAgICBpbnQgbnVtX2NoZWNrZWQ7CiAgICAgaW50IG51bV9mYWlsZWQ7CisKKyAgICAvKiBwZXJmICovCiAgICAgaW50IG5vcF90aW1lOworICAgIGludCBzeXNmZDsKKwogICAgIGludCBjcHVfZmxhZzsKICAgICBjb25zdCBjaGFyICpjcHVfZmxhZ19uYW1lOworICAgIGNvbnN0IGNoYXIgKnRlc3RfbmFtZTsKIH0gc3RhdGU7CiAKIC8qIFBSTkcgc3RhdGUgKi8KQEAgLTIwMyw3ICsyNzMsNyBAQAogICAgICAgICByZXR1cm4gYSA9PSBiOwogICAgIH0KIAotICAgIGlmIChhYnMoeC5pIC0geS5pKSA8PSBtYXhfdWxwKQorICAgIGlmIChsbGFicygoaW50NjRfdCl4LmkgLSB5LmkpIDw9IG1heF91bHApCiAgICAgICAgIHJldHVybiAxOwogCiAgICAgcmV0dXJuIDA7CkBAIC0yMjQsOCArMjk0LDEyIEBACiBpbnQgZmxvYXRfbmVhcl9hYnNfZXBzKGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IGVwcykKIHsKICAgICBmbG9hdCBhYnNfZGlmZiA9IGZhYnNmKGEgLSBiKTsKKyAgICBpZiAoYWJzX2RpZmYgPCBlcHMpCisgICAgICAgIHJldHVybiAxOwogCi0gICAgcmV0dXJuIGFic19kaWZmIDwgZXBzOworICAgIGZwcmludGYoc3RkZXJyLCAidGVzdCBmYWlsZWQgY29tcGFyaW5nICVnIHdpdGggJWcgKGFicyBkaWZmPSVnIHdpdGggRVBTPSVnKVxuIiwgYSwgYiwgYWJzX2RpZmYsIGVwcyk7CisKKyAgICByZXR1cm4gMDsKIH0KIAogaW50IGZsb2F0X25lYXJfYWJzX2Vwc19hcnJheShjb25zdCBmbG9hdCAqYSwgY29uc3QgZmxvYXQgKmIsIGZsb2F0IGVwcywKQEAgLTI1Nyw2ICszMzEsMjUgQEAKICAgICByZXR1cm4gMTsKIH0KIAoraW50IGRvdWJsZV9uZWFyX2Fic19lcHMoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgZXBzKQoreworICAgIGRvdWJsZSBhYnNfZGlmZiA9IGZhYnMoYSAtIGIpOworCisgICAgcmV0dXJuIGFic19kaWZmIDwgZXBzOworfQorCitpbnQgZG91YmxlX25lYXJfYWJzX2Vwc19hcnJheShjb25zdCBkb3VibGUgKmEsIGNvbnN0IGRvdWJsZSAqYiwgZG91YmxlIGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxlbikKK3sKKyAgICB1bnNpZ25lZCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgIGlmICghZG91YmxlX25lYXJfYWJzX2VwcyhhW2ldLCBiW2ldLCBlcHMpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworfQorCiAvKiBQcmludCBjb2xvcmVkIHRleHQgdG8gc3RkZXJyIGlmIHRoZSB0ZXJtaW5hbCBzdXBwb3J0cyBpdCAqLwogc3RhdGljIHZvaWQgY29sb3JfcHJpbnRmKGludCBjb2xvciwgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CkBAIC0zNDEsNyArNDM0LDYgQEAKICAgICByZXR1cm4gImMiOwogfQogCi0jaWZkZWYgQVZfUkVBRF9USU1FCiBzdGF0aWMgaW50IGNtcF9ub3AoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKIHsKICAgICByZXR1cm4gKihjb25zdCB1aW50MTZfdCopYSAtICooY29uc3QgdWludDE2X3QqKWI7CkBAIC0zNTIsMTAgKzQ0NCwxMyBAQAogewogICAgIHVpbnQxNl90IG5vcHNbMTAwMDBdOwogICAgIGludCBpLCBub3Bfc3VtID0gMDsKKyAgICBhdl91bnVzZWQgY29uc3QgaW50IHN5c2ZkID0gc3RhdGUuc3lzZmQ7CiAKKyAgICB1aW50NjRfdCB0ID0gMDsKICAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgewotICAgICAgICB1aW50NjRfdCB0ID0gQVZfUkVBRF9USU1FKCk7Ci0gICAgICAgIG5vcHNbaV0gPSBBVl9SRUFEX1RJTUUoKSAtIHQ7CisgICAgICAgIFBFUkZfU1RBUlQodCk7CisgICAgICAgIFBFUkZfU1RPUCh0KTsKKyAgICAgICAgbm9wc1tpXSA9IHQ7CiAgICAgfQogCiAgICAgcXNvcnQobm9wcywgMTAwMDAsIHNpemVvZih1aW50MTZfdCksIGNtcF9ub3ApOwpAQCAtMzc1LDggKzQ3MCw5IEBACiAgICAgICAgIGlmIChmLT52ZXJzaW9ucy5jcHUgfHwgZi0+dmVyc2lvbnMubmV4dCkgewogICAgICAgICAgICAgQ2hlY2thc21GdW5jVmVyc2lvbiAqdiA9ICZmLT52ZXJzaW9uczsKICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAodi0+aXRlcmF0aW9ucykgewotICAgICAgICAgICAgICAgICAgICBpbnQgZGVjaWN5Y2xlcyA9ICgxMCp2LT5jeWNsZXMvdi0+aXRlcmF0aW9ucyAtIHN0YXRlLm5vcF90aW1lKSAvIDQ7CisgICAgICAgICAgICAgICAgQ2hlY2thc21QZXJmICpwID0gJnYtPnBlcmY7CisgICAgICAgICAgICAgICAgaWYgKHAtPml0ZXJhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRlY2ljeWNsZXMgPSAoMTAqcC0+Y3ljbGVzL3AtPml0ZXJhdGlvbnMgLSBzdGF0ZS5ub3BfdGltZSkgLyA0OwogICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzXyVzOiAlZC4lZFxuIiwgZi0+bmFtZSwgY3B1X3N1ZmZpeCh2LT5jcHUpLCBkZWNpY3ljbGVzLzEwLCBkZWNpY3ljbGVzJTEwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IHdoaWxlICgodiA9IHYtPm5leHQpKTsKQEAgLTM4NSw3ICs0ODEsNiBAQAogICAgICAgICBwcmludF9iZW5jaHMoZi0+Y2hpbGRbMV0pOwogICAgIH0KIH0KLSNlbmRpZgogCiAvKiBBU0NJSWJldGljYWwgc29ydCBleGNlcHQgcHJlc2VydmluZyBuYXR1cmFsIG9yZGVyIGZvciBudW1iZXJzICovCiBzdGF0aWMgaW50IGNtcF9mdW5jX25hbWVzKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCkBAIC00NzEsNiArNTY2LDggQEAKIAogICAgICAgICBzdGF0ZS5jcHVfZmxhZ19uYW1lID0gbmFtZTsKICAgICAgICAgZm9yIChpID0gMDsgdGVzdHNbaV0uZnVuYzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc3RhdGUudGVzdF9uYW1lICYmIHN0cmNtcCh0ZXN0c1tpXS5uYW1lLCBzdGF0ZS50ZXN0X25hbWUpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgc3RhdGUuY3VycmVudF90ZXN0X25hbWUgPSB0ZXN0c1tpXS5uYW1lOwogICAgICAgICAgICAgdGVzdHNbaV0uZnVuYygpOwogICAgICAgICB9CkBAIC00ODYsOSArNTgzLDY3IEBACiAgICAgfQogfQogCisjaWYgQ09ORklHX0xJTlVYX1BFUkYKK3N0YXRpYyBpbnQgYmVuY2hfaW5pdF9saW51eCh2b2lkKQoreworICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgYXR0ciA9IHsKKyAgICAgICAgLnR5cGUgICAgICAgICAgID0gUEVSRl9UWVBFX0hBUkRXQVJFLAorICAgICAgICAuc2l6ZSAgICAgICAgICAgPSBzaXplb2Yoc3RydWN0IHBlcmZfZXZlbnRfYXR0ciksCisgICAgICAgIC5jb25maWcgICAgICAgICA9IFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUywKKyAgICAgICAgLmRpc2FibGVkICAgICAgID0gMSwgLy8gc3RhcnQgY291bnRpbmcgb25seSBvbiBkZW1hbmQKKyAgICAgICAgLmV4Y2x1ZGVfa2VybmVsID0gMSwKKyAgICAgICAgLmV4Y2x1ZGVfaHYgICAgID0gMSwKKyAgICB9OworCisgICAgcHJpbnRmKCJiZW5jaG1hcmtpbmcgd2l0aCBMaW51eCBQZXJmIE1vbml0b3JpbmcgQVBJXG4iKTsKKworICAgIHN0YXRlLnN5c2ZkID0gc3lzY2FsbChfX05SX3BlcmZfZXZlbnRfb3BlbiwgJmF0dHIsIDAsIC0xLCAtMSwgMCk7CisgICAgaWYgKHN0YXRlLnN5c2ZkID09IC0xKSB7CisgICAgICAgIHBlcnJvcigic3lzY2FsbCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgYmVuY2hfaW5pdF9mZm1wZWcodm9pZCkKK3sKKyNpZmRlZiBBVl9SRUFEX1RJTUUKKyAgICBwcmludGYoImJlbmNobWFya2luZyB3aXRoIG5hdGl2ZSBGRm1wZWcgdGltZXJzXG4iKTsKKyAgICByZXR1cm4gMDsKKyNlbHNlCisgICAgZnByaW50ZihzdGRlcnIsICJjaGVja2FzbTogLS1iZW5jaCBpcyBub3Qgc3VwcG9ydGVkIG9uIHlvdXIgc3lzdGVtXG4iKTsKKyAgICByZXR1cm4gLTE7CisjZW5kaWYKK30KKworc3RhdGljIGludCBiZW5jaF9pbml0KHZvaWQpCit7CisjaWYgQ09ORklHX0xJTlVYX1BFUkYKKyAgICBpbnQgcmV0ID0gYmVuY2hfaW5pdF9saW51eCgpOworI2Vsc2UKKyAgICBpbnQgcmV0ID0gYmVuY2hfaW5pdF9mZm1wZWcoKTsKKyNlbmRpZgorICAgIGlmIChyZXQgPCAwKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgc3RhdGUubm9wX3RpbWUgPSBtZWFzdXJlX25vcF90aW1lKCk7CisgICAgcHJpbnRmKCJub3A6ICVkLiVkXG4iLCBzdGF0ZS5ub3BfdGltZS8xMCwgc3RhdGUubm9wX3RpbWUlMTApOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBiZW5jaF91bmluaXQodm9pZCkKK3sKKyNpZiBDT05GSUdfTElOVVhfUEVSRgorICAgIGlmIChzdGF0ZS5zeXNmZCA+IDApCisgICAgICAgIGNsb3NlKHN0YXRlLnN5c2ZkKTsKKyNlbmRpZgorfQorCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotICAgIGludCBpLCBzZWVkLCByZXQgPSAwOworICAgIHVuc2lnbmVkIGludCBzZWVkID0gYXZfZ2V0X3JhbmRvbV9zZWVkKCk7CisgICAgaW50IGksIHJldCA9IDA7CiAKICNpZiBBUkNIX0FSTSAmJiBIQVZFX0FSTVY1VEVfRVhURVJOQUwKICAgICBpZiAoaGF2ZV92ZnAoYXZfZ2V0X2NwdV9mbGFncygpKSB8fCBoYXZlX25lb24oYXZfZ2V0X2NwdV9mbGFncygpKSkKQEAgLTUwMCwyMiArNjU1LDI1IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIGlmIChhcmdjID4gMSAmJiAhc3RybmNtcChhcmd2WzFdLCAiLS1iZW5jaCIsIDcpKSB7Ci0jaWZuZGVmIEFWX1JFQURfVElNRQotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNoZWNrYXNtOiAtLWJlbmNoIGlzIG5vdCBzdXBwb3J0ZWQgb24geW91ciBzeXN0ZW1cbiIpOwotICAgICAgICByZXR1cm4gMTsKLSNlbmRpZgotICAgICAgICBpZiAoYXJndlsxXVs3XSA9PSAnPScpIHsKLSAgICAgICAgICAgIHN0YXRlLmJlbmNoX3BhdHRlcm4gPSBhcmd2WzFdICsgODsKLSAgICAgICAgICAgIHN0YXRlLmJlbmNoX3BhdHRlcm5fbGVuID0gc3RybGVuKHN0YXRlLmJlbmNoX3BhdHRlcm4pOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIHN0YXRlLmJlbmNoX3BhdHRlcm4gPSAiIjsKKyAgICB3aGlsZSAoYXJnYyA+IDEpIHsKKyAgICAgICAgaWYgKCFzdHJuY21wKGFyZ3ZbMV0sICItLWJlbmNoIiwgNykpIHsKKyAgICAgICAgICAgIGlmIChiZW5jaF9pbml0KCkgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgaWYgKGFyZ3ZbMV1bN10gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgc3RhdGUuYmVuY2hfcGF0dGVybiA9IGFyZ3ZbMV0gKyA4OworICAgICAgICAgICAgICAgIHN0YXRlLmJlbmNoX3BhdHRlcm5fbGVuID0gc3RybGVuKHN0YXRlLmJlbmNoX3BhdHRlcm4pOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgc3RhdGUuYmVuY2hfcGF0dGVybiA9ICIiOworICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbMV0sICItLXRlc3Q9IiwgNykpIHsKKyAgICAgICAgICAgIHN0YXRlLnRlc3RfbmFtZSA9IGFyZ3ZbMV0gKyA3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VlZCA9IHN0cnRvdWwoYXJndlsxXSwgTlVMTCwgMTApOworICAgICAgICB9CiAKICAgICAgICAgYXJnYy0tOwogICAgICAgICBhcmd2Kys7CiAgICAgfQogCi0gICAgc2VlZCA9IChhcmdjID4gMSkgPyBhdG9pKGFyZ3ZbMV0pIDogYXZfZ2V0X3JhbmRvbV9zZWVkKCk7CiAgICAgZnByaW50ZihzdGRlcnIsICJjaGVja2FzbTogdXNpbmcgcmFuZG9tIHNlZWQgJXVcbiIsIHNlZWQpOwogICAgIGF2X2xmZ19pbml0KCZjaGVja2FzbV9sZmcsIHNlZWQpOwogCkBAIC01MjgsMTYgKzY4NiwxMyBAQAogICAgICAgICByZXQgPSAxOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2hlY2thc206IGFsbCAlZCB0ZXN0cyBwYXNzZWRcbiIsIHN0YXRlLm51bV9jaGVja2VkKTsKLSNpZmRlZiBBVl9SRUFEX1RJTUUKICAgICAgICAgaWYgKHN0YXRlLmJlbmNoX3BhdHRlcm4pIHsKLSAgICAgICAgICAgIHN0YXRlLm5vcF90aW1lID0gbWVhc3VyZV9ub3BfdGltZSgpOwotICAgICAgICAgICAgcHJpbnRmKCJub3A6ICVkLiVkXG4iLCBzdGF0ZS5ub3BfdGltZS8xMCwgc3RhdGUubm9wX3RpbWUlMTApOwogICAgICAgICAgICAgcHJpbnRfYmVuY2hzKHN0YXRlLmZ1bmNzKTsKICAgICAgICAgfQotI2VuZGlmCiAgICAgfQogCiAgICAgZGVzdHJveV9mdW5jX3RyZWUoc3RhdGUuZnVuY3MpOworICAgIGJlbmNoX3VuaW5pdCgpOwogICAgIHJldHVybiByZXQ7CiB9CiAKQEAgLTYxNSwxMSArNzcwLDEzIEBACiAgICAgfQogfQogCi0vKiBVcGRhdGUgYmVuY2htYXJrIHJlc3VsdHMgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gKi8KLXZvaWQgY2hlY2thc21fdXBkYXRlX2JlbmNoKGludCBpdGVyYXRpb25zLCB1aW50NjRfdCBjeWNsZXMpCisvKiBHZXQgdGhlIGJlbmNobWFyayBjb250ZXh0IG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uICovCitDaGVja2FzbVBlcmYgKmNoZWNrYXNtX2dldF9wZXJmX2NvbnRleHQodm9pZCkKIHsKLSAgICBzdGF0ZS5jdXJyZW50X2Z1bmNfdmVyLT5pdGVyYXRpb25zICs9IGl0ZXJhdGlvbnM7Ci0gICAgc3RhdGUuY3VycmVudF9mdW5jX3Zlci0+Y3ljbGVzICs9IGN5Y2xlczsKKyAgICBDaGVja2FzbVBlcmYgKnBlcmYgPSAmc3RhdGUuY3VycmVudF9mdW5jX3Zlci0+cGVyZjsKKyAgICBtZW1zZXQocGVyZiwgMCwgc2l6ZW9mKCpwZXJmKSk7CisgICAgcGVyZi0+c3lzZmQgPSBzdGF0ZS5zeXNmZDsKKyAgICByZXR1cm4gcGVyZjsKIH0KIAogLyogUHJpbnQgdGhlIG91dGNvbWUgb2YgYWxsIHRlc3RzIHBlcmZvcm1lZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCAqLwpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vY2hlY2thc20uaCBiL3Rlc3RzL2NoZWNrYXNtL2NoZWNrYXNtLmgKaW5kZXggMGM4YmMyZC4uZGNhYjc0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvY2hlY2thc20vY2hlY2thc20uaAorKysgYi90ZXN0cy9jaGVja2FzbS9jaGVja2FzbS5oCkBAIC0yNSwyOSArMjUsNjEgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgQ09ORklHX0xJTlVYX1BFUkYKKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gcmVhZCgzKQorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjZW5kaWYKKwogI2luY2x1ZGUgImxpYmF2dXRpbC9hdnN0cmluZy5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jcHUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50ZXJuYWwuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvbGZnLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL3RpbWVyLmgiCiAKK3ZvaWQgY2hlY2thc21fY2hlY2tfYWFjcHNkc3Aodm9pZCk7CiB2b2lkIGNoZWNrYXNtX2NoZWNrX2FsYWNkc3Aodm9pZCk7Cit2b2lkIGNoZWNrYXNtX2NoZWNrX2F1ZGlvZHNwKHZvaWQpOwogdm9pZCBjaGVja2FzbV9jaGVja19ibGVuZCh2b2lkKTsKK3ZvaWQgY2hlY2thc21fY2hlY2tfYmxvY2tkc3Aodm9pZCk7CiB2b2lkIGNoZWNrYXNtX2NoZWNrX2Jzd2FwZHNwKHZvaWQpOwordm9pZCBjaGVja2FzbV9jaGVja19jb2xvcnNwYWNlKHZvaWQpOwordm9pZCBjaGVja2FzbV9jaGVja19leHJkc3Aodm9pZCk7Cit2b2lkIGNoZWNrYXNtX2NoZWNrX2ZpeGVkX2RzcCh2b2lkKTsKIHZvaWQgY2hlY2thc21fY2hlY2tfZmxhY2RzcCh2b2lkKTsKK3ZvaWQgY2hlY2thc21fY2hlY2tfZmxvYXRfZHNwKHZvaWQpOwogdm9pZCBjaGVja2FzbV9jaGVja19mbXRjb252ZXJ0KHZvaWQpOwordm9pZCBjaGVja2FzbV9jaGVja19nNzIyZHNwKHZvaWQpOwordm9pZCBjaGVja2FzbV9jaGVja19oMjY0ZHNwKHZvaWQpOwogdm9pZCBjaGVja2FzbV9jaGVja19oMjY0cHJlZCh2b2lkKTsKIHZvaWQgY2hlY2thc21fY2hlY2tfaDI2NHFwZWwodm9pZCk7Cit2b2lkIGNoZWNrYXNtX2NoZWNrX2hldmNfYWRkX3Jlcyh2b2lkKTsKK3ZvaWQgY2hlY2thc21fY2hlY2tfaGV2Y19pZGN0KHZvaWQpOwordm9pZCBjaGVja2FzbV9jaGVja19oZXZjX3Nhbyh2b2lkKTsKK3ZvaWQgY2hlY2thc21fY2hlY2tfaHVmZnl1dmRzcCh2b2lkKTsKIHZvaWQgY2hlY2thc21fY2hlY2tfanBlZzIwMDBkc3Aodm9pZCk7Cit2b2lkIGNoZWNrYXNtX2NoZWNrX2xsdmlkZHNwKHZvaWQpOwordm9pZCBjaGVja2FzbV9jaGVja19sbHZpZGRzcGVuYyh2b2lkKTsKIHZvaWQgY2hlY2thc21fY2hlY2tfcGl4YmxvY2tkc3Aodm9pZCk7Cit2b2lkIGNoZWNrYXNtX2NoZWNrX3NicmRzcCh2b2lkKTsKIHZvaWQgY2hlY2thc21fY2hlY2tfc3ludGhfZmlsdGVyKHZvaWQpOwordm9pZCBjaGVja2FzbV9jaGVja19zd19yZ2Iodm9pZCk7Cit2b2lkIGNoZWNrYXNtX2NoZWNrX3V0dmlkZW9kc3Aodm9pZCk7CiB2b2lkIGNoZWNrYXNtX2NoZWNrX3YyMTBlbmModm9pZCk7Cit2b2lkIGNoZWNrYXNtX2NoZWNrX3ZmX2hmbGlwKHZvaWQpOwordm9pZCBjaGVja2FzbV9jaGVja192Zl90aHJlc2hvbGQodm9pZCk7Cit2b2lkIGNoZWNrYXNtX2NoZWNrX3ZwOGRzcCh2b2lkKTsKIHZvaWQgY2hlY2thc21fY2hlY2tfdnA5ZHNwKHZvaWQpOwogdm9pZCBjaGVja2FzbV9jaGVja192aWRlb2RzcCh2b2lkKTsKIAorc3RydWN0IENoZWNrYXNtUGVyZjsKKwogdm9pZCAqY2hlY2thc21fY2hlY2tfZnVuYyh2b2lkICpmdW5jLCBjb25zdCBjaGFyICpuYW1lLCAuLi4pIGF2X3ByaW50Zl9mb3JtYXQoMiwgMyk7CiBpbnQgY2hlY2thc21fYmVuY2hfZnVuYyh2b2lkKTsKIHZvaWQgY2hlY2thc21fZmFpbF9mdW5jKGNvbnN0IGNoYXIgKm1zZywgLi4uKSBhdl9wcmludGZfZm9ybWF0KDEsIDIpOwotdm9pZCBjaGVja2FzbV91cGRhdGVfYmVuY2goaW50IGl0ZXJhdGlvbnMsIHVpbnQ2NF90IGN5Y2xlcyk7CitzdHJ1Y3QgQ2hlY2thc21QZXJmICpjaGVja2FzbV9nZXRfcGVyZl9jb250ZXh0KHZvaWQpOwogdm9pZCBjaGVja2FzbV9yZXBvcnQoY29uc3QgY2hhciAqbmFtZSwgLi4uKSBhdl9wcmludGZfZm9ybWF0KDEsIDIpOwogCiAvKiBmbG9hdCBjb21wYXJlIHV0aWxpdGllcyAqLwpAQCAtNjAsNiArOTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pOwogaW50IGZsb2F0X25lYXJfYWJzX2Vwc19hcnJheV91bHAoY29uc3QgZmxvYXQgKmEsIGNvbnN0IGZsb2F0ICpiLCBmbG9hdCBlcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBtYXhfdWxwLCB1bnNpZ25lZCBsZW4pOworaW50IGRvdWJsZV9uZWFyX2Fic19lcHMoZG91YmxlIGEsIGRvdWJsZSBiLCBkb3VibGUgZXBzKTsKK2ludCBkb3VibGVfbmVhcl9hYnNfZXBzX2FycmF5KGNvbnN0IGRvdWJsZSAqYSwgY29uc3QgZG91YmxlICpiLCBkb3VibGUgZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGVuKTsKIAogZXh0ZXJuIEFWTEZHIGNoZWNrYXNtX2xmZzsKICNkZWZpbmUgcm5kKCkgYXZfbGZnX2dldCgmY2hlY2thc21fbGZnKQpAQCAtNzQsNiArMTA5LDcgQEAKIC8qIERlY2xhcmUgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZS4gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSByZXR1cm4gdmFsdWUsIHRoZSByZW1haW5pbmcKICAqIGFyZ3VtZW50cyBhcmUgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMuIE5hbWluZyBwYXJhbWV0ZXJzIGlzIG9wdGlvbmFsLiAqLwogI2RlZmluZSBkZWNsYXJlX2Z1bmMocmV0LCAuLi4pIGRlY2xhcmVfbmV3KHJldCwgX19WQV9BUkdTX18pIHR5cGVkZWYgcmV0IGZ1bmNfdHlwZShfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZGVjbGFyZV9mdW5jX2Zsb2F0KHJldCwgLi4uKSBkZWNsYXJlX25ld19mbG9hdChyZXQsIF9fVkFfQVJHU19fKSB0eXBlZGVmIHJldCBmdW5jX3R5cGUoX19WQV9BUkdTX18pCiAjZGVmaW5lIGRlY2xhcmVfZnVuY19lbW1zKGNwdV9mbGFncywgcmV0LCAuLi4pIGRlY2xhcmVfbmV3X2VtbXMoY3B1X2ZsYWdzLCByZXQsIF9fVkFfQVJHU19fKSB0eXBlZGVmIHJldCBmdW5jX3R5cGUoX19WQV9BUkdTX18pCiAKIC8qIEluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdGVzdCBoYXMgZmFpbGVkICovCkBAIC04NSwxMyArMTIxLDE2IEBACiAvKiBDYWxsIHRoZSByZWZlcmVuY2UgZnVuY3Rpb24gKi8KICNkZWZpbmUgY2FsbF9yZWYoLi4uKSAoKGZ1bmNfdHlwZSAqKWZ1bmNfcmVmKShfX1ZBX0FSR1NfXykKIAotI2lmIEFSQ0hfWDg2ICYmIEhBVkVfWUFTTQorI2lmIEFSQ0hfWDg2ICYmIEhBVkVfWDg2QVNNCiAvKiBWZXJpZmllcyB0aGF0IGNsb2JiZXJlZCBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIGFyZSBwcm9wZXJseSBzYXZlZCBhbmQgcmVzdG9yZWQKICAqIGFuZCB0aGF0IGVpdGhlciBubyBNTVggcmVnaXN0ZXJzIGFyZSB0b3VjaGVkIG9yIGVtbXMgaXMgaXNzdWVkICovCiB2b2lkIGNoZWNrYXNtX2NoZWNrZWRfY2FsbCh2b2lkICpmdW5jLCAuLi4pOwogLyogVmVyaWZpZXMgdGhhdCBjbG9iYmVyZWQgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyBhcmUgcHJvcGVybHkgc2F2ZWQgYW5kIHJlc3RvcmVkCiAgKiBhbmQgaXNzdWVzIGVtbXMgZm9yIGFzbSBmdW5jdGlvbnMgd2hpY2ggYXJlIG5vdCByZXF1aXJlZCB0byBkbyBzbyAqLwogdm9pZCBjaGVja2FzbV9jaGVja2VkX2NhbGxfZW1tcyh2b2lkICpmdW5jLCAuLi4pOworLyogVmVyaWZpZXMgdGhhdCBjbG9iYmVyZWQgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyBhcmUgcHJvcGVybHkgc2F2ZWQgYW5kIHJlc3RvcmVkCisgKiBidXQgZG9lc24ndCBpc3N1ZSBlbW1zLiBNZWFudCBmb3IgZHNwIGZ1bmN0aW9ucyByZXR1cm5pbmcgZmxvYXQgb3IgZG91YmxlICovCit2b2lkIGNoZWNrYXNtX2NoZWNrZWRfY2FsbF9mbG9hdCh2b2lkICpmdW5jLCAuLi4pOwogCiAjaWYgQVJDSF9YODZfNjQKIC8qIEV2aWwgaGFjazogZGV0ZWN0IGluY29ycmVjdCBhc3N1bXB0aW9ucyB0aGF0IDMyLWJpdCBpbnRzIGFyZSB6ZXJvLWV4dGVuZGVkIHRvIDY0LWJpdC4KQEAgLTEwNiw2ICsxNDUsOCBAQAogdm9pZCBjaGVja2FzbV9zdGFja19jbG9iYmVyKHVpbnQ2NF90IGNsb2JiZXIsIC4uLik7CiAjZGVmaW5lIGRlY2xhcmVfbmV3KHJldCwgLi4uKSByZXQgKCpjaGVja2VkX2NhbGwpKHZvaWQgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIF9fVkFfQVJHU19fKVwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKHZvaWQgKiljaGVja2FzbV9jaGVja2VkX2NhbGw7CisjZGVmaW5lIGRlY2xhcmVfbmV3X2Zsb2F0KHJldCwgLi4uKSByZXQgKCpjaGVja2VkX2NhbGwpKHZvaWQgKiwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIF9fVkFfQVJHU19fKVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gKHZvaWQgKiljaGVja2FzbV9jaGVja2VkX2NhbGxfZmxvYXQ7CiAjZGVmaW5lIGRlY2xhcmVfbmV3X2VtbXMoY3B1X2ZsYWdzLCByZXQsIC4uLikgXAogICAgIHJldCAoKmNoZWNrZWRfY2FsbCkodm9pZCAqLCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgX19WQV9BUkdTX18pID0gXAogICAgICAgICAoKGNwdV9mbGFncykgJiBhdl9nZXRfY3B1X2ZsYWdzKCkpID8gKHZvaWQgKiljaGVja2FzbV9jaGVja2VkX2NhbGxfZW1tcyA6IFwKQEAgLTExNiw2ICsxNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRfY2FsbChmdW5jX25ldywgMCwgMCwgMCwgMCwgMCwgX19WQV9BUkdTX18pKQogI2VsaWYgQVJDSF9YODZfMzIKICNkZWZpbmUgZGVjbGFyZV9uZXcocmV0LCAuLi4pIHJldCAoKmNoZWNrZWRfY2FsbCkodm9pZCAqLCBfX1ZBX0FSR1NfXykgPSAodm9pZCAqKWNoZWNrYXNtX2NoZWNrZWRfY2FsbDsKKyNkZWZpbmUgZGVjbGFyZV9uZXdfZmxvYXQocmV0LCAuLi4pIHJldCAoKmNoZWNrZWRfY2FsbCkodm9pZCAqLCBfX1ZBX0FSR1NfXykgPSAodm9pZCAqKWNoZWNrYXNtX2NoZWNrZWRfY2FsbF9mbG9hdDsKICNkZWZpbmUgZGVjbGFyZV9uZXdfZW1tcyhjcHVfZmxhZ3MsIHJldCwgLi4uKSByZXQgKCpjaGVja2VkX2NhbGwpKHZvaWQgKiwgX19WQV9BUkdTX18pID0gXAogICAgICAgICAoKGNwdV9mbGFncykgJiBhdl9nZXRfY3B1X2ZsYWdzKCkpID8gKHZvaWQgKiljaGVja2FzbV9jaGVja2VkX2NhbGxfZW1tcyA6ICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNoZWNrYXNtX2NoZWNrZWRfY2FsbDsKQEAgLTEzMSwxMSArMTczLDE3IEBACiAjZGVmaW5lIGRlY2xhcmVfbmV3KHJldCwgLi4uKSByZXQgKCpjaGVja2VkX2NhbGwpKHZvaWQgKiwgaW50IGR1bW15LCBfX1ZBX0FSR1NfXykgPSAodm9pZCAqKWNoZWNrYXNtX2NoZWNrZWRfY2FsbDsKICNkZWZpbmUgY2FsbF9uZXcoLi4uKSBjaGVja2VkX2NhbGwoZnVuY19uZXcsIDAsIF9fVkFfQVJHU19fKQogI2VsaWYgQVJDSF9BQVJDSDY0ICYmICFkZWZpbmVkKF9fQVBQTEVfXykKK3ZvaWQgY2hlY2thc21fc3RhY2tfY2xvYmJlcih1aW50NjRfdCBjbG9iYmVyLCAuLi4pOwogdm9pZCBjaGVja2FzbV9jaGVja2VkX2NhbGwodm9pZCAqZnVuYywgLi4uKTsKLSNkZWZpbmUgZGVjbGFyZV9uZXcocmV0LCAuLi4pIHJldCAoKmNoZWNrZWRfY2FsbCkodm9pZCAqLCBfX1ZBX0FSR1NfXykgPSAodm9pZCAqKWNoZWNrYXNtX2NoZWNrZWRfY2FsbDsKLSNkZWZpbmUgY2FsbF9uZXcoLi4uKSBjaGVja2VkX2NhbGwoZnVuY19uZXcsIF9fVkFfQVJHU19fKQorI2RlZmluZSBkZWNsYXJlX25ldyhyZXQsIC4uLikgcmV0ICgqY2hlY2tlZF9jYWxsKSh2b2lkICosIGludCwgaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgX19WQV9BUkdTX18pXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAodm9pZCAqKWNoZWNrYXNtX2NoZWNrZWRfY2FsbDsKKyNkZWZpbmUgQ0xPQiAoVUlOVDY0X0MoMHhkZWFkYmVlZmRlYWRiZWVmKSkKKyNkZWZpbmUgY2FsbF9uZXcoLi4uKSAoY2hlY2thc21fc3RhY2tfY2xvYmJlcihDTE9CLENMT0IsQ0xPQixDTE9CLENMT0IsQ0xPQixDTE9CLENMT0IsQ0xPQixDTE9CLENMT0IsQ0xPQixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPQixDTE9CLENMT0IsQ0xPQixDTE9CLENMT0IsQ0xPQixDTE9CLENMT0IsQ0xPQixDTE9CKSxcCisgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZF9jYWxsKGZ1bmNfbmV3LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBfX1ZBX0FSR1NfXykpCiAjZWxzZQogI2RlZmluZSBkZWNsYXJlX25ldyhyZXQsIC4uLikKKyNkZWZpbmUgZGVjbGFyZV9uZXdfZmxvYXQocmV0LCAuLi4pCiAjZGVmaW5lIGRlY2xhcmVfbmV3X2VtbXMoY3B1X2ZsYWdzLCByZXQsIC4uLikKIC8qIENhbGwgdGhlIGZ1bmN0aW9uICovCiAjZGVmaW5lIGNhbGxfbmV3KC4uLikgKChmdW5jX3R5cGUgKilmdW5jX25ldykoX19WQV9BUkdTX18pCkBAIC0xNDQsMzIgKzE5Miw2MyBAQAogI2lmbmRlZiBkZWNsYXJlX25ld19lbW1zCiAjZGVmaW5lIGRlY2xhcmVfbmV3X2VtbXMoY3B1X2ZsYWdzLCByZXQsIC4uLikgZGVjbGFyZV9uZXcocmV0LCBfX1ZBX0FSR1NfXykKICNlbmRpZgorI2lmbmRlZiBkZWNsYXJlX25ld19mbG9hdAorI2RlZmluZSBkZWNsYXJlX25ld19mbG9hdChyZXQsIC4uLikgZGVjbGFyZV9uZXcocmV0LCBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBDaGVja2FzbVBlcmYgeworICAgIGludCBzeXNmZDsKKyAgICB1aW50NjRfdCBjeWNsZXM7CisgICAgaW50IGl0ZXJhdGlvbnM7Cit9IENoZWNrYXNtUGVyZjsKKworI2lmIGRlZmluZWQoQVZfUkVBRF9USU1FKSB8fCBDT05GSUdfTElOVVhfUEVSRgorCisjaWYgQ09ORklHX0xJTlVYX1BFUkYKKyNkZWZpbmUgUEVSRl9TVEFSVCh0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlvY3RsKHN5c2ZkLCBQRVJGX0VWRU5UX0lPQ19SRVNFVCwgMCk7ICAgICAgICAgICAgICBcCisgICAgaW9jdGwoc3lzZmQsIFBFUkZfRVZFTlRfSU9DX0VOQUJMRSwgMCk7ICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFBFUkZfU1RPUCh0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpb2N0bChzeXNmZCwgUEVSRl9FVkVOVF9JT0NfRElTQUJMRSwgMCk7ICAgICAgICAgICAgXAorICAgIHJlYWQoc3lzZmQsICZ0LCBzaXplb2YodCkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgUEVSRl9TVEFSVCh0KSB0ID0gQVZfUkVBRF9USU1FKCkKKyNkZWZpbmUgUEVSRl9TVE9QKHQpICB0ID0gQVZfUkVBRF9USU1FKCkgLSB0CisjZW5kaWYKIAogLyogQmVuY2htYXJrIHRoZSBmdW5jdGlvbiAqLwotI2lmZGVmIEFWX1JFQURfVElNRQogI2RlZmluZSBiZW5jaF9uZXcoLi4uKVwKICAgICBkbyB7XAogICAgICAgICBpZiAoY2hlY2thc21fYmVuY2hfZnVuYygpKSB7XAorICAgICAgICAgICAgc3RydWN0IENoZWNrYXNtUGVyZiAqcGVyZiA9IGNoZWNrYXNtX2dldF9wZXJmX2NvbnRleHQoKTtcCisgICAgICAgICAgICBhdl91bnVzZWQgY29uc3QgaW50IHN5c2ZkID0gcGVyZi0+c3lzZmQ7XAogICAgICAgICAgICAgZnVuY190eXBlICp0ZnVuYyA9IGZ1bmNfbmV3O1wKICAgICAgICAgICAgIHVpbnQ2NF90IHRzdW0gPSAwO1wKICAgICAgICAgICAgIGludCB0aSwgdGNvdW50ID0gMDtcCisgICAgICAgICAgICB1aW50NjRfdCB0ID0gMDsgXAogICAgICAgICAgICAgZm9yICh0aSA9IDA7IHRpIDwgQkVOQ0hfUlVOUzsgdGkrKykge1wKLSAgICAgICAgICAgICAgICB1aW50NjRfdCB0ID0gQVZfUkVBRF9USU1FKCk7XAorICAgICAgICAgICAgICAgIFBFUkZfU1RBUlQodCk7XAogICAgICAgICAgICAgICAgIHRmdW5jKF9fVkFfQVJHU19fKTtcCiAgICAgICAgICAgICAgICAgdGZ1bmMoX19WQV9BUkdTX18pO1wKICAgICAgICAgICAgICAgICB0ZnVuYyhfX1ZBX0FSR1NfXyk7XAogICAgICAgICAgICAgICAgIHRmdW5jKF9fVkFfQVJHU19fKTtcCi0gICAgICAgICAgICAgICAgdCA9IEFWX1JFQURfVElNRSgpIC0gdDtcCisgICAgICAgICAgICAgICAgUEVSRl9TVE9QKHQpO1wKICAgICAgICAgICAgICAgICBpZiAodCp0Y291bnQgPD0gdHN1bSo0ICYmIHRpID4gMCkge1wKICAgICAgICAgICAgICAgICAgICAgdHN1bSArPSB0O1wKICAgICAgICAgICAgICAgICAgICAgdGNvdW50Kys7XAogICAgICAgICAgICAgICAgIH1cCiAgICAgICAgICAgICB9XAotICAgICAgICAgICAgY2hlY2thc21fdXBkYXRlX2JlbmNoKHRjb3VudCwgdHN1bSk7XAorICAgICAgICAgICAgZW1tc19jKCk7XAorICAgICAgICAgICAgcGVyZi0+Y3ljbGVzICs9IHQ7XAorICAgICAgICAgICAgcGVyZi0+aXRlcmF0aW9ucysrO1wKICAgICAgICAgfVwKICAgICB9IHdoaWxlICgwKQogI2Vsc2UKICNkZWZpbmUgYmVuY2hfbmV3KC4uLikgd2hpbGUoMCkKKyNkZWZpbmUgUEVSRl9TVEFSVCh0KSAgd2hpbGUoMCkKKyNkZWZpbmUgUEVSRl9TVE9QKHQpICAgd2hpbGUoMCkKICNlbmRpZgogCi0jZW5kaWYKKyNlbmRpZiAvKiBURVNUU19DSEVDS0FTTV9DSEVDS0FTTV9IICovCmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS9leHJkc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL2V4cmRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NGEwNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2FzbS9leHJkc3AuYwpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IEphbWVzIEFsbWVyCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiY2hlY2thc20uaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2F2Y29kZWMuaCIKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2V4cmRzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2RlZmluZSBCVUZfU0laRSA1MTIwCisjZGVmaW5lIFBBRERFRF9CVUZfU0laRSBCVUZfU0laRStBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKjIKKworI2RlZmluZSByYW5kb21pemVfYnVmZmVycygpICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQlVGX1NJWkU7IGkgKz0gNCkgeyBcCisgICAgICAgICAgICB1aW50MzJfdCByID0gcm5kKCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFWX1dOMzJBKHNyYyArIGksIHIpOyAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgY2hlY2tfcmVvcmRlcl9waXhlbHModm9pZCkgeworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgc3JjLCAgICAgW1BBRERFRF9CVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0X3JlZiwgW1BBRERFRF9CVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0X25ldywgW1BBRERFRF9CVUZfU0laRV0pOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc2l6ZSk7CisKKyAgICBtZW1zZXQoc3JjLCAgICAgMCwgUEFEREVEX0JVRl9TSVpFKTsKKyAgICBtZW1zZXQoZHN0X3JlZiwgMCwgUEFEREVEX0JVRl9TSVpFKTsKKyAgICBtZW1zZXQoZHN0X25ldywgMCwgUEFEREVEX0JVRl9TSVpFKTsKKyAgICByYW5kb21pemVfYnVmZmVycygpOworICAgIGNhbGxfcmVmKGRzdF9yZWYsIHNyYywgQlVGX1NJWkUpOworICAgIGNhbGxfbmV3KGRzdF9uZXcsIHNyYywgQlVGX1NJWkUpOworICAgIGlmIChtZW1jbXAoZHN0X3JlZiwgZHN0X25ldywgQlVGX1NJWkUpKQorICAgICAgICBmYWlsKCk7CisgICAgYmVuY2hfbmV3KGRzdF9uZXcsIHNyYywgQlVGX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19wcmVkaWN0b3Iodm9pZCkgeworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgc3JjLCAgICAgW1BBRERFRF9CVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0X3JlZiwgW1BBRERFRF9CVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0X25ldywgW1BBRERFRF9CVUZfU0laRV0pOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHNpemUpOworCisgICAgbWVtc2V0KHNyYywgICAgIDAsIFBBRERFRF9CVUZfU0laRSk7CisgICAgcmFuZG9taXplX2J1ZmZlcnMoKTsKKyAgICBtZW1jcHkoZHN0X3JlZiwgc3JjLCBQQURERURfQlVGX1NJWkUpOworICAgIG1lbWNweShkc3RfbmV3LCBzcmMsIFBBRERFRF9CVUZfU0laRSk7CisgICAgY2FsbF9yZWYoZHN0X3JlZiwgQlVGX1NJWkUpOworICAgIGNhbGxfbmV3KGRzdF9uZXcsIEJVRl9TSVpFKTsKKyAgICBpZiAobWVtY21wKGRzdF9yZWYsIGRzdF9uZXcsIEJVRl9TSVpFKSkKKyAgICAgICAgZmFpbCgpOworICAgIGJlbmNoX25ldyhkc3RfbmV3LCBCVUZfU0laRSk7Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfZXhyZHNwKHZvaWQpCit7CisgICAgRXhyRFNQQ29udGV4dCBoOworCisgICAgZmZfZXhyZHNwX2luaXQoJmgpOworCisgICAgaWYgKGNoZWNrX2Z1bmMoaC5yZW9yZGVyX3BpeGVscywgInJlb3JkZXJfcGl4ZWxzIikpCisgICAgICAgIGNoZWNrX3Jlb3JkZXJfcGl4ZWxzKCk7CisKKyAgICByZXBvcnQoInJlb3JkZXJfcGl4ZWxzIik7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhoLnByZWRpY3RvciwgInByZWRpY3RvciIpKQorICAgICAgICBjaGVja19wcmVkaWN0b3IoKTsKKworICAgIHJlcG9ydCgicHJlZGljdG9yIik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS9maXhlZF9kc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL2ZpeGVkX2RzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTFmMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2FzbS9maXhlZF9kc3AuYwpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSBKYW1lcyBBbG1lcgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlICJjaGVja2FzbS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvZml4ZWRfZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjZGVmaW5lIEJVRl9TSVpFIDI1NgorCisjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXJzKCkgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCVUZfU0laRTsgaSsrKSB7ICAgICAgXAorICAgICAgICAgICAgc3JjMFtpXSA9IHNpZ25fZXh0ZW5kKHJuZCgpLCAyNCk7IFwKKyAgICAgICAgICAgIHNyYzFbaV0gPSBzaWduX2V4dGVuZChybmQoKSwgMjQpOyBcCisgICAgICAgICAgICBzcmMyW2ldID0gc2lnbl9leHRlbmQocm5kKCksIDI0KTsgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBjaGVja192ZWN0b3JfZm11bChjb25zdCBpbnQgKnNyYzAsIGNvbnN0IGludCAqc3JjMSkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludCwgcmVmLCBbQlVGX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludCwgbmV3LCBbQlVGX1NJWkVdKTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBpbnQgKmRzdCwgY29uc3QgaW50ICpzcmMwLCBjb25zdCBpbnQgKnNyYzEsIGludCBsZW4pOworCisgICAgY2FsbF9yZWYocmVmLCBzcmMwLCBzcmMxLCBCVUZfU0laRSk7CisgICAgY2FsbF9uZXcobmV3LCBzcmMwLCBzcmMxLCBCVUZfU0laRSk7CisgICAgaWYgKG1lbWNtcChyZWYsIG5ldywgQlVGX1NJWkUgKiBzaXplb2YoaW50KSkpCisgICAgICAgIGZhaWwoKTsKKyAgICBiZW5jaF9uZXcobmV3LCBzcmMwLCBzcmMxLCBCVUZfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3ZlY3Rvcl9mbXVsX2FkZChjb25zdCBpbnQgKnNyYzAsIGNvbnN0IGludCAqc3JjMSwgY29uc3QgaW50ICpzcmMyKQoreworICAgIExPQ0FMX0FMSUdORURfMzIoaW50LCByZWYsIFtCVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50LCBuZXcsIFtCVUZfU0laRV0pOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIGludCAqZHN0LCBjb25zdCBpbnQgKnNyYzAsIGNvbnN0IGludCAqc3JjMSwgY29uc3QgaW50ICpzcmMyLCBpbnQgbGVuKTsKKworICAgIGNhbGxfcmVmKHJlZiwgc3JjMCwgc3JjMSwgc3JjMiwgQlVGX1NJWkUpOworICAgIGNhbGxfbmV3KG5ldywgc3JjMCwgc3JjMSwgc3JjMiwgQlVGX1NJWkUpOworICAgIGlmIChtZW1jbXAocmVmLCBuZXcsIEJVRl9TSVpFICogc2l6ZW9mKGludCkpKQorICAgICAgICBmYWlsKCk7CisgICAgYmVuY2hfbmV3KG5ldywgc3JjMCwgc3JjMSwgc3JjMiwgQlVGX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBjaGVja192ZWN0b3JfZm11bF93aW5kb3coY29uc3QgaW50MzJfdCAqc3JjMCwgY29uc3QgaW50MzJfdCAqc3JjMSwgY29uc3QgaW50MzJfdCAqd2luKQoreworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MzJfdCwgcmVmLCBbQlVGX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDMyX3QsIG5ldywgW0JVRl9TSVpFXSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgaW50MzJfdCAqZHN0LCBjb25zdCBpbnQzMl90ICpzcmMwLCBjb25zdCBpbnQzMl90ICpzcmMxLCBjb25zdCBpbnQzMl90ICp3aW4sIGludCBsZW4pOworCisgICAgY2FsbF9yZWYocmVmLCBzcmMwLCBzcmMxLCB3aW4sIEJVRl9TSVpFIC8gMik7CisgICAgY2FsbF9uZXcobmV3LCBzcmMwLCBzcmMxLCB3aW4sIEJVRl9TSVpFIC8gMik7CisgICAgaWYgKG1lbWNtcChyZWYsIG5ldywgQlVGX1NJWkUgKiBzaXplb2YoaW50MzJfdCkpKQorICAgICAgICBmYWlsKCk7CisgICAgYmVuY2hfbmV3KG5ldywgc3JjMCwgc3JjMSwgd2luLCBCVUZfU0laRSAvIDIpOworfQorCitzdGF0aWMgdm9pZCBjaGVja192ZWN0b3JfZm11bF93aW5kb3dfc2NhbGVkKGNvbnN0IGludDMyX3QgKnNyYzAsIGNvbnN0IGludDMyX3QgKnNyYzEsIGNvbnN0IGludDMyX3QgKndpbikKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIHJlZiwgW0JVRl9TSVpFXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBuZXcsIFtCVUZfU0laRV0pOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIGludDE2X3QgKmRzdCwgY29uc3QgaW50MzJfdCAqc3JjMCwgY29uc3QgaW50MzJfdCAqc3JjMSwgY29uc3QgaW50MzJfdCAqd2luLCBpbnQgbGVuLCB1aW50OF90IGJpdHMpOworCisgICAgY2FsbF9yZWYocmVmLCBzcmMwLCBzcmMxLCB3aW4sIEJVRl9TSVpFIC8gMiwgMik7CisgICAgY2FsbF9uZXcobmV3LCBzcmMwLCBzcmMxLCB3aW4sIEJVRl9TSVpFIC8gMiwgMik7CisgICAgaWYgKG1lbWNtcChyZWYsIG5ldywgQlVGX1NJWkUgKiBzaXplb2YoaW50MTZfdCkpKQorICAgICAgICBmYWlsKCk7CisgICAgYmVuY2hfbmV3KG5ldywgc3JjMCwgc3JjMSwgd2luLCBCVUZfU0laRSAvIDIsIDIpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19idXR0ZXJmbGllcyhjb25zdCBpbnQgKnNyYzAsIGNvbnN0IGludCAqc3JjMSkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludCwgcmVmMCwgW0JVRl9TSVpFXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQsIHJlZjEsIFtCVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50LCBuZXcwLCBbQlVGX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludCwgbmV3MSwgW0JVRl9TSVpFXSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgaW50ICphdl9yZXN0cmljdCBzcmMwLCBpbnQgKmF2X3Jlc3RyaWN0IHNyYzEsIGludCBsZW4pOworCisgICAgbWVtY3B5KHJlZjAsIHNyYzAsIEJVRl9TSVpFICogc2l6ZW9mKCpzcmMwKSk7CisgICAgbWVtY3B5KHJlZjEsIHNyYzEsIEJVRl9TSVpFICogc2l6ZW9mKCpzcmMxKSk7CisgICAgbWVtY3B5KG5ldzAsIHNyYzAsIEJVRl9TSVpFICogc2l6ZW9mKCpzcmMwKSk7CisgICAgbWVtY3B5KG5ldzEsIHNyYzEsIEJVRl9TSVpFICogc2l6ZW9mKCpzcmMxKSk7CisKKyAgICBjYWxsX3JlZihyZWYwLCByZWYxLCBCVUZfU0laRSk7CisgICAgY2FsbF9uZXcobmV3MCwgbmV3MSwgQlVGX1NJWkUpOworICAgIGlmIChtZW1jbXAocmVmMCwgbmV3MCwgQlVGX1NJWkUgKiBzaXplb2YoKnJlZjApKSB8fAorICAgICAgICBtZW1jbXAocmVmMSwgbmV3MSwgQlVGX1NJWkUgKiBzaXplb2YoKnJlZjEpKSkKKyAgICAgICAgZmFpbCgpOworICAgIG1lbWNweShuZXcwLCBzcmMwLCBCVUZfU0laRSAqIHNpemVvZigqc3JjMCkpOworICAgIG1lbWNweShuZXcxLCBzcmMxLCBCVUZfU0laRSAqIHNpemVvZigqc3JjMSkpOworICAgIGJlbmNoX25ldyhuZXcwLCBuZXcxLCBCVUZfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3NjYWxhcnByb2R1Y3RfZml4ZWQoY29uc3QgaW50ICpzcmMwLCBjb25zdCBpbnQgKnNyYzEpCit7CisgICAgaW50IHJlZiwgbmV3OworCisgICAgZGVjbGFyZV9mdW5jKGludCwgY29uc3QgaW50ICpzcmMwLCBjb25zdCBpbnQgKnNyYzEsIGludCBsZW4pOworCisgICAgcmVmID0gY2FsbF9yZWYoc3JjMCwgc3JjMSwgQlVGX1NJWkUpOworICAgIG5ldyA9IGNhbGxfbmV3KHNyYzAsIHNyYzEsIEJVRl9TSVpFKTsKKyAgICBpZiAocmVmICE9IG5ldykKKyAgICAgICAgZmFpbCgpOworICAgIGJlbmNoX25ldyhzcmMwLCBzcmMxLCBCVUZfU0laRSk7Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfZml4ZWRfZHNwKHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQzMl90LCBzcmMwLCBbQlVGX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDMyX3QsIHNyYzEsIFtCVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MzJfdCwgc3JjMiwgW0JVRl9TSVpFXSk7CisgICAgQVZGaXhlZERTUENvbnRleHQgKmZkc3AgPSBhdnByaXZfYWxsb2NfZml4ZWRfZHNwKDEpOworCisgICAgcmFuZG9taXplX2J1ZmZlcnMoKTsKKyAgICBpZiAoY2hlY2tfZnVuYyhmZHNwLT52ZWN0b3JfZm11bCwgInZlY3Rvcl9mbXVsX2ZpeGVkIikpCisgICAgICAgIGNoZWNrX3ZlY3Rvcl9mbXVsKHNyYzAsIHNyYzEpOworICAgIGlmIChjaGVja19mdW5jKGZkc3AtPnZlY3Rvcl9mbXVsX2FkZCwgInZlY3Rvcl9mbXVsX2FkZF9maXhlZCIpKQorICAgICAgICBjaGVja192ZWN0b3JfZm11bF9hZGQoc3JjMCwgc3JjMSwgc3JjMik7CisgICAgaWYgKGNoZWNrX2Z1bmMoZmRzcC0+dmVjdG9yX2ZtdWxfcmV2ZXJzZSwgInZlY3Rvcl9mbXVsX3JldmVyc2VfZml4ZWQiKSkKKyAgICAgICAgY2hlY2tfdmVjdG9yX2ZtdWwoc3JjMCwgc3JjMSk7CisgICAgaWYgKGNoZWNrX2Z1bmMoZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93LCAidmVjdG9yX2ZtdWxfd2luZG93X2ZpeGVkIikpCisgICAgICAgIGNoZWNrX3ZlY3Rvcl9mbXVsX3dpbmRvdyhzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICBpZiAoY2hlY2tfZnVuYyhmZHNwLT52ZWN0b3JfZm11bF93aW5kb3dfc2NhbGVkLCAidmVjdG9yX2ZtdWxfd2luZG93X3NjYWxlZF9maXhlZCIpKQorICAgICAgICBjaGVja192ZWN0b3JfZm11bF93aW5kb3dfc2NhbGVkKHNyYzAsIHNyYzEsIHNyYzIpOworICAgIHJlcG9ydCgidmVjdG9yX2ZtdWwiKTsKKyAgICBpZiAoY2hlY2tfZnVuYyhmZHNwLT5idXR0ZXJmbGllc19maXhlZCwgImJ1dHRlcmZsaWVzX2ZpeGVkIikpCisgICAgICAgIGNoZWNrX2J1dHRlcmZsaWVzKHNyYzAsIHNyYzEpOworICAgIHJlcG9ydCgiYnV0dGVyZmxpZXNfZml4ZWQiKTsKKyAgICBpZiAoY2hlY2tfZnVuYyhmZHNwLT5zY2FsYXJwcm9kdWN0X2ZpeGVkLCAic2NhbGFycHJvZHVjdF9maXhlZCIpKQorICAgICAgICBjaGVja19zY2FsYXJwcm9kdWN0X2ZpeGVkKHNyYzAsIHNyYzEpOworICAgIHJlcG9ydCgic2NhbGFycHJvZHVjdF9maXhlZCIpOworCisgICAgYXZfZnJlZXAoJmZkc3ApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vZmxvYXRfZHNwLmMgYi90ZXN0cy9jaGVja2FzbS9mbG9hdF9kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjk5OWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2thc20vZmxvYXRfZHNwLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2Zsb2F0X2RzcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRlcm5hbC5oIgorI2luY2x1ZGUgImNoZWNrYXNtLmgiCisKKyNkZWZpbmUgTEVOIDI1NgorCisjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXIoYnVmKSAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIGJtZ1syXSwgc3RkZGV2ID0gMTAuMCwgbWVhbiA9IDAuMDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgTEVOOyBpICs9IDIpIHsgICAgICAgICAgICBcCisgICAgICAgIGF2X2JtZ19nZXQoJmNoZWNrYXNtX2xmZywgYm1nKTsgICAgICAgXAorICAgICAgICBidWZbaV0gICAgID0gYm1nWzBdICogc3RkZGV2ICsgbWVhbjsgIFwKKyAgICAgICAgYnVmW2kgKyAxXSA9IGJtZ1sxXSAqIHN0ZGRldiArIG1lYW47ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSgwKTsKKworc3RhdGljIHZvaWQgdGVzdF92ZWN0b3JfZm11bChjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEpCit7CisgICAgTE9DQUxfQUxJR05FRF8zMihmbG9hdCwgY2RzdCwgW0xFTl0pOworICAgIExPQ0FMX0FMSUdORURfMzIoZmxvYXQsIG9kc3QsIFtMRU5dKTsKKyAgICBpbnQgaTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsCisgICAgICAgICAgICAgICAgIGludCBsZW4pOworCisgICAgY2FsbF9yZWYoY2RzdCwgc3JjMCwgc3JjMSwgTEVOKTsKKyAgICBjYWxsX25ldyhvZHN0LCBzcmMwLCBzcmMxLCBMRU4pOworICAgIGZvciAoaSA9IDA7IGkgPCBMRU47IGkrKykgeworICAgICAgICBpZiAoIWZsb2F0X25lYXJfYWJzX2VwcyhjZHN0W2ldLCBvZHN0W2ldLCBGTFRfRVBTSUxPTikpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQ6ICUtIC4xMmYgLSAlLSAuMTJmID0gJSAuMTJnXG4iLAorICAgICAgICAgICAgICAgICAgICBpLCBjZHN0W2ldLCBvZHN0W2ldLCBjZHN0W2ldIC0gb2RzdFtpXSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBiZW5jaF9uZXcob2RzdCwgc3JjMCwgc3JjMSwgTEVOKTsKK30KKworI2RlZmluZSBBUkJJVFJBUllfRk1VTF9BRERfQ09OU1QgMC4wMDUKK3N0YXRpYyB2b2lkIHRlc3RfdmVjdG9yX2ZtdWxfYWRkKGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKnNyYzIpCit7CisgICAgTE9DQUxfQUxJR05FRF8zMihmbG9hdCwgY2RzdCwgW0xFTl0pOworICAgIExPQ0FMX0FMSUdORURfMzIoZmxvYXQsIG9kc3QsIFtMRU5dKTsKKyAgICBpbnQgaTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjMCwgY29uc3QgZmxvYXQgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMiwgaW50IGxlbik7CisKKyAgICBjYWxsX3JlZihjZHN0LCBzcmMwLCBzcmMxLCBzcmMyLCBMRU4pOworICAgIGNhbGxfbmV3KG9kc3QsIHNyYzAsIHNyYzEsIHNyYzIsIExFTik7CisgICAgZm9yIChpID0gMDsgaSA8IExFTjsgaSsrKSB7CisgICAgICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzKGNkc3RbaV0sIG9kc3RbaV0sIEFSQklUUkFSWV9GTVVMX0FERF9DT05TVCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQ6ICUtIC4xMmYgLSAlLSAuMTJmID0gJSAuMTJnXG4iLAorICAgICAgICAgICAgICAgICAgICBpLCBjZHN0W2ldLCBvZHN0W2ldLCBjZHN0W2ldIC0gb2RzdFtpXSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBiZW5jaF9uZXcob2RzdCwgc3JjMCwgc3JjMSwgc3JjMiwgTEVOKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF92ZWN0b3JfZm11bF9zY2FsYXIoY29uc3QgZmxvYXQgKnNyYzAsIGNvbnN0IGZsb2F0ICpzcmMxKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoZmxvYXQsIGNkc3QsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBvZHN0LCBbTEVOXSk7CisgICAgaW50IGk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgZmxvYXQgKmRzdCwgY29uc3QgZmxvYXQgKnNyYywgZmxvYXQgbXVsLCBpbnQgbGVuKTsKKworICAgIGNhbGxfcmVmKGNkc3QsIHNyYzAsIHNyYzFbMF0sIExFTik7CisgICAgY2FsbF9uZXcob2RzdCwgc3JjMCwgc3JjMVswXSwgTEVOKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExFTjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWZsb2F0X25lYXJfYWJzX2VwcyhjZHN0W2ldLCBvZHN0W2ldLCBGTFRfRVBTSUxPTikpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkOiAlLSAuMTJmIC0gJS0gLjEyZiA9ICUgLjEyZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGksIGNkc3RbaV0sIG9kc3RbaV0sIGNkc3RbaV0gLSBvZHN0W2ldKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBiZW5jaF9uZXcob2RzdCwgc3JjMCwgc3JjMVswXSwgTEVOKTsKK30KKworI2RlZmluZSBBUkJJVFJBUllfRk1VTF9XSU5ET1dfQ09OU1QgMC4wMDgKK3N0YXRpYyB2b2lkIHRlc3RfdmVjdG9yX2ZtdWxfd2luZG93KGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKndpbikKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCBjZHN0LCBbTEVOXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihmbG9hdCwgb2RzdCwgW0xFTl0pOworICAgIGludCBpOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIGZsb2F0ICpkc3QsIGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwKKyAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKndpbiwgaW50IGxlbik7CisKKyAgICBjYWxsX3JlZihjZHN0LCBzcmMwLCBzcmMxLCB3aW4sIExFTiAvIDIpOworICAgIGNhbGxfbmV3KG9kc3QsIHNyYzAsIHNyYzEsIHdpbiwgTEVOIC8gMik7CisgICAgZm9yIChpID0gMDsgaSA8IExFTjsgaSsrKSB7CisgICAgICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzKGNkc3RbaV0sIG9kc3RbaV0sIEFSQklUUkFSWV9GTVVMX1dJTkRPV19DT05TVCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQ6ICUtIC4xMmYgLSAlLSAuMTJmID0gJSAuMTJnXG4iLAorICAgICAgICAgICAgICAgICAgICBpLCBjZHN0W2ldLCBvZHN0W2ldLCBjZHN0W2ldIC0gb2RzdFtpXSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBiZW5jaF9uZXcob2RzdCwgc3JjMCwgc3JjMSwgd2luLCBMRU4gLyAyKTsKK30KKworI2RlZmluZSBBUkJJVFJBUllfRk1BQ19TQ0FMQVJfQ09OU1QgMC4wMDUKK3N0YXRpYyB2b2lkIHRlc3RfdmVjdG9yX2ZtYWNfc2NhbGFyKGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwgY29uc3QgZmxvYXQgKnNyYzIpCit7CisgICAgTE9DQUxfQUxJR05FRF8zMihmbG9hdCwgY2RzdCwgW0xFTl0pOworICAgIExPQ0FMX0FMSUdORURfMzIoZmxvYXQsIG9kc3QsIFtMRU5dKTsKKyAgICBpbnQgaTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBmbG9hdCAqZHN0LCBjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCBtdWwsIGludCBsZW4pOworCisgICAgbWVtY3B5KGNkc3QsIHNyYzIsIExFTiAqIHNpemVvZigqc3JjMikpOworICAgIG1lbWNweShvZHN0LCBzcmMyLCBMRU4gKiBzaXplb2YoKnNyYzIpKTsKKworICAgIGNhbGxfcmVmKGNkc3QsIHNyYzAsIHNyYzFbMF0sIExFTik7CisgICAgY2FsbF9uZXcob2RzdCwgc3JjMCwgc3JjMVswXSwgTEVOKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTEVOOyBpKyspIHsKKyAgICAgICAgaWYgKCFmbG9hdF9uZWFyX2Fic19lcHMoY2RzdFtpXSwgb2RzdFtpXSwgQVJCSVRSQVJZX0ZNQUNfU0NBTEFSX0NPTlNUKSkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZDogJS0gLjEyZiAtICUtIC4xMmYgPSAlIC4xMmdcbiIsCisgICAgICAgICAgICAgICAgICAgIGksIGNkc3RbaV0sIG9kc3RbaV0sIGNkc3RbaV0gLSBvZHN0W2ldKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1lbWNweShvZHN0LCBzcmMyLCBMRU4gKiBzaXplb2YoKnNyYzIpKTsKKyAgICBiZW5jaF9uZXcob2RzdCwgc3JjMCwgc3JjMVswXSwgTEVOKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF92ZWN0b3JfZG11bF9zY2FsYXIoY29uc3QgZG91YmxlICpzcmMwLCBjb25zdCBkb3VibGUgKnNyYzEpCit7CisgICAgTE9DQUxfQUxJR05FRF8zMihkb3VibGUsIGNkc3QsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGRvdWJsZSwgb2RzdCwgW0xFTl0pOworICAgIGludCBpOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIGRvdWJsZSAqZHN0LCBjb25zdCBkb3VibGUgKnNyYywgZG91YmxlIG11bCwgaW50IGxlbik7CisKKyAgICBjYWxsX3JlZihjZHN0LCBzcmMwLCBzcmMxWzBdLCBMRU4pOworICAgIGNhbGxfbmV3KG9kc3QsIHNyYzAsIHNyYzFbMF0sIExFTik7CisgICAgZm9yIChpID0gMDsgaSA8IExFTjsgaSsrKSB7CisgICAgICAgIGRvdWJsZSB0ID0gZmFicyhzcmMxWzBdKSArIGZhYnMoc3JjMFtpXSkgKyBmYWJzKHNyYzFbMF0gKiBzcmMwW2ldKSArIDEuMDsKKyAgICAgICAgaWYgKCFkb3VibGVfbmVhcl9hYnNfZXBzKGNkc3RbaV0sIG9kc3RbaV0sIHQgKiAyICogREJMX0VQU0lMT04pKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkOiAlLSAuMTJmIC0gJS0gLjEyZiA9ICUgLjEyZ1xuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgY2RzdFtpXSwgb2RzdFtpXSwgY2RzdFtpXSAtIG9kc3RbaV0pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgYmVuY2hfbmV3KG9kc3QsIHNyYzAsIHNyYzFbMF0sIExFTik7Cit9CisKKyNkZWZpbmUgQVJCSVRSQVJZX0RNQUNfU0NBTEFSX0NPTlNUIDAuMDA1CitzdGF0aWMgdm9pZCB0ZXN0X3ZlY3Rvcl9kbWFjX3NjYWxhcihjb25zdCBkb3VibGUgKnNyYzAsIGNvbnN0IGRvdWJsZSAqc3JjMSwgY29uc3QgZG91YmxlICpzcmMyKQoreworICAgIExPQ0FMX0FMSUdORURfMzIoZG91YmxlLCBjZHN0LCBbTEVOXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihkb3VibGUsIG9kc3QsIFtMRU5dKTsKKyAgICBpbnQgaTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBkb3VibGUgKmRzdCwgY29uc3QgZG91YmxlICpzcmMsIGRvdWJsZSBtdWwsIGludCBsZW4pOworCisgICAgbWVtY3B5KGNkc3QsIHNyYzIsIExFTiAqIHNpemVvZigqc3JjMikpOworICAgIG1lbWNweShvZHN0LCBzcmMyLCBMRU4gKiBzaXplb2YoKnNyYzIpKTsKKyAgICBjYWxsX3JlZihjZHN0LCBzcmMwLCBzcmMxWzBdLCBMRU4pOworICAgIGNhbGxfbmV3KG9kc3QsIHNyYzAsIHNyYzFbMF0sIExFTik7CisgICAgZm9yIChpID0gMDsgaSA8IExFTjsgaSsrKSB7CisgICAgICAgIGlmICghZG91YmxlX25lYXJfYWJzX2VwcyhjZHN0W2ldLCBvZHN0W2ldLCBBUkJJVFJBUllfRE1BQ19TQ0FMQVJfQ09OU1QpKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkOiAlLSAuMTJmIC0gJS0gLjEyZiA9ICUgLjEyZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgY2RzdFtpXSwgb2RzdFtpXSwgY2RzdFtpXSAtIG9kc3RbaV0pOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgbWVtY3B5KG9kc3QsIHNyYzIsIExFTiAqIHNpemVvZigqc3JjMikpOworICAgIGJlbmNoX25ldyhvZHN0LCBzcmMwLCBzcmMxWzBdLCBMRU4pOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2J1dHRlcmZsaWVzX2Zsb2F0KGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCAgY2RzdCwgIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCAgb2RzdCwgIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCAgY2RzdDEsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCAgb2RzdDEsIFtMRU5dKTsKKyAgICBpbnQgaTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBmbG9hdCAqYXZfcmVzdHJpY3Qgc3JjMCwgZmxvYXQgKmF2X3Jlc3RyaWN0IHNyYzEsCisgICAgaW50IGxlbik7CisKKyAgICBtZW1jcHkoY2RzdCwgIHNyYzAsIExFTiAqIHNpemVvZigqc3JjMCkpOworICAgIG1lbWNweShjZHN0MSwgc3JjMSwgTEVOICogc2l6ZW9mKCpzcmMxKSk7CisgICAgbWVtY3B5KG9kc3QsICBzcmMwLCBMRU4gKiBzaXplb2YoKnNyYzApKTsKKyAgICBtZW1jcHkob2RzdDEsIHNyYzEsIExFTiAqIHNpemVvZigqc3JjMSkpOworCisgICAgY2FsbF9yZWYoY2RzdCwgY2RzdDEsIExFTik7CisgICAgY2FsbF9uZXcob2RzdCwgb2RzdDEsIExFTik7CisgICAgZm9yIChpID0gMDsgaSA8IExFTjsgaSsrKSB7CisgICAgICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzKGNkc3RbaV0sICBvZHN0W2ldLCAgRkxUX0VQU0lMT04pIHx8CisgICAgICAgICAgICAhZmxvYXRfbmVhcl9hYnNfZXBzKGNkc3QxW2ldLCBvZHN0MVtpXSwgRkxUX0VQU0lMT04pKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkOiAlLSAuMTJmIC0gJS0gLjEyZiA9ICUgLjEyZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgY2RzdFtpXSwgb2RzdFtpXSwgY2RzdFtpXSAtIG9kc3RbaV0pOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlZDogJS0gLjEyZiAtICUtIC4xMmYgPSAlIC4xMmdcbiIsCisgICAgICAgICAgICAgICAgICAgIGksIGNkc3QxW2ldLCBvZHN0MVtpXSwgY2RzdDFbaV0gLSBvZHN0MVtpXSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZW1jcHkob2RzdCwgIHNyYzAsIExFTiAqIHNpemVvZigqc3JjMCkpOworICAgIG1lbWNweShvZHN0MSwgc3JjMSwgTEVOICogc2l6ZW9mKCpzcmMxKSk7CisgICAgYmVuY2hfbmV3KG9kc3QsIG9kc3QxLCBMRU4pOworfQorCisjZGVmaW5lIEFSQklUUkFSWV9TQ0FMQVJQUk9EVUNUX0NPTlNUIDAuMgorc3RhdGljIHZvaWQgdGVzdF9zY2FsYXJwcm9kdWN0X2Zsb2F0KGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSkKK3sKKyAgICBmbG9hdCBjcHJvZCwgb3Byb2Q7CisKKyAgICBkZWNsYXJlX2Z1bmNfZmxvYXQoZmxvYXQsIGNvbnN0IGZsb2F0ICpzcmMwLCBjb25zdCBmbG9hdCAqc3JjMSwgaW50IGxlbik7CisKKyAgICBjcHJvZCA9IGNhbGxfcmVmKHNyYzAsIHNyYzEsIExFTik7CisgICAgb3Byb2QgPSBjYWxsX25ldyhzcmMwLCBzcmMxLCBMRU4pOworICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzKGNwcm9kLCBvcHJvZCwgQVJCSVRSQVJZX1NDQUxBUlBST0RVQ1RfQ09OU1QpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJS0gLjEyZiAtICUtIC4xMmYgPSAlIC4xMmdcbiIsCisgICAgICAgICAgICAgICAgY3Byb2QsIG9wcm9kLCBjcHJvZCAtIG9wcm9kKTsKKyAgICAgICAgZmFpbCgpOworICAgIH0KKyAgICBiZW5jaF9uZXcoc3JjMCwgc3JjMSwgTEVOKTsKK30KKwordm9pZCBjaGVja2FzbV9jaGVja19mbG9hdF9kc3Aodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzMyKGZsb2F0LCAgc3JjMCwgICAgIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGZsb2F0LCAgc3JjMSwgICAgIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGZsb2F0LCAgc3JjMiwgICAgIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCAgc3JjMywgICAgIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCAgc3JjNCwgICAgIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGZsb2F0LCAgc3JjNSwgICAgIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGRvdWJsZSwgZGJsX3NyYzAsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGRvdWJsZSwgZGJsX3NyYzEsIFtMRU5dKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGRvdWJsZSwgZGJsX3NyYzIsIFtMRU5dKTsKKyAgICBBVkZsb2F0RFNQQ29udGV4dCAqZmRzcCA9IGF2cHJpdl9mbG9hdF9kc3BfYWxsb2MoMSk7CisKKyAgICBpZiAoIWZkc3ApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJmbG9hdGRzcDogT3V0IG9mIG1lbW9yeSBlcnJvclxuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByYW5kb21pemVfYnVmZmVyKHNyYzApOworICAgIHJhbmRvbWl6ZV9idWZmZXIoc3JjMSk7CisgICAgcmFuZG9taXplX2J1ZmZlcihzcmMyKTsKKyAgICByYW5kb21pemVfYnVmZmVyKHNyYzMpOworICAgIHJhbmRvbWl6ZV9idWZmZXIoc3JjNCk7CisgICAgcmFuZG9taXplX2J1ZmZlcihzcmM1KTsKKyAgICByYW5kb21pemVfYnVmZmVyKGRibF9zcmMwKTsKKyAgICByYW5kb21pemVfYnVmZmVyKGRibF9zcmMxKTsKKyAgICByYW5kb21pemVfYnVmZmVyKGRibF9zcmMyKTsKKworICAgIGlmIChjaGVja19mdW5jKGZkc3AtPnZlY3Rvcl9mbXVsLCAidmVjdG9yX2ZtdWwiKSkKKyAgICAgICAgdGVzdF92ZWN0b3JfZm11bChzcmMwLCBzcmMxKTsKKyAgICBpZiAoY2hlY2tfZnVuYyhmZHNwLT52ZWN0b3JfZm11bF9hZGQsICJ2ZWN0b3JfZm11bF9hZGQiKSkKKyAgICAgICAgdGVzdF92ZWN0b3JfZm11bF9hZGQoc3JjMCwgc3JjMSwgc3JjMik7CisgICAgaWYgKGNoZWNrX2Z1bmMoZmRzcC0+dmVjdG9yX2ZtdWxfc2NhbGFyLCAidmVjdG9yX2ZtdWxfc2NhbGFyIikpCisgICAgICAgIHRlc3RfdmVjdG9yX2ZtdWxfc2NhbGFyKHNyYzMsIHNyYzQpOworICAgIGlmIChjaGVja19mdW5jKGZkc3AtPnZlY3Rvcl9mbXVsX3JldmVyc2UsICJ2ZWN0b3JfZm11bF9yZXZlcnNlIikpCisgICAgICAgIHRlc3RfdmVjdG9yX2ZtdWwoc3JjMCwgc3JjMSk7CisgICAgaWYgKGNoZWNrX2Z1bmMoZmRzcC0+dmVjdG9yX2ZtdWxfd2luZG93LCAidmVjdG9yX2ZtdWxfd2luZG93IikpCisgICAgICAgIHRlc3RfdmVjdG9yX2ZtdWxfd2luZG93KHNyYzMsIHNyYzQsIHNyYzUpOworICAgIHJlcG9ydCgidmVjdG9yX2ZtdWwiKTsKKyAgICBpZiAoY2hlY2tfZnVuYyhmZHNwLT52ZWN0b3JfZm1hY19zY2FsYXIsICJ2ZWN0b3JfZm1hY19zY2FsYXIiKSkKKyAgICAgICAgdGVzdF92ZWN0b3JfZm1hY19zY2FsYXIoc3JjMCwgc3JjMSwgc3JjMik7CisgICAgcmVwb3J0KCJ2ZWN0b3JfZm1hYyIpOworICAgIGlmIChjaGVja19mdW5jKGZkc3AtPnZlY3Rvcl9kbXVsX3NjYWxhciwgInZlY3Rvcl9kbXVsX3NjYWxhciIpKQorICAgICAgICB0ZXN0X3ZlY3Rvcl9kbXVsX3NjYWxhcihkYmxfc3JjMCwgZGJsX3NyYzEpOworICAgIHJlcG9ydCgidmVjdG9yX2RtdWwiKTsKKyAgICBpZiAoY2hlY2tfZnVuYyhmZHNwLT52ZWN0b3JfZG1hY19zY2FsYXIsICJ2ZWN0b3JfZG1hY19zY2FsYXIiKSkKKyAgICAgICAgdGVzdF92ZWN0b3JfZG1hY19zY2FsYXIoZGJsX3NyYzAsIGRibF9zcmMxLCBkYmxfc3JjMik7CisgICAgcmVwb3J0KCJ2ZWN0b3JfZG1hYyIpOworICAgIGlmIChjaGVja19mdW5jKGZkc3AtPmJ1dHRlcmZsaWVzX2Zsb2F0LCAiYnV0dGVyZmxpZXNfZmxvYXQiKSkKKyAgICAgICAgdGVzdF9idXR0ZXJmbGllc19mbG9hdChzcmMzLCBzcmM0KTsKKyAgICByZXBvcnQoImJ1dHRlcmZsaWVzX2Zsb2F0Iik7CisgICAgaWYgKGNoZWNrX2Z1bmMoZmRzcC0+c2NhbGFycHJvZHVjdF9mbG9hdCwgInNjYWxhcnByb2R1Y3RfZmxvYXQiKSkKKyAgICAgICAgdGVzdF9zY2FsYXJwcm9kdWN0X2Zsb2F0KHNyYzMsIHNyYzQpOworICAgIHJlcG9ydCgic2NhbGFycHJvZHVjdF9mbG9hdCIpOworCisgICAgYXZfZnJlZXAoJmZkc3ApOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vZzcyMmRzcC5jIGIvdGVzdHMvY2hlY2thc20vZzcyMmRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiY2ZmMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2FzbS9nNzIyZHNwLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjaGVja2FzbS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZzcyMi5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvZzcyMmRzcC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvbWF0aG9wcy5oIgorCisjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXJzKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQUkVWX1NBTVBMRVNfQlVGX1NJWkU7IGkrKykgeyAgIFwKKyAgICAgICAgICAgIHNyYzBbaV0gPSBzcmMxW2ldID0gc2lnbl9leHRlbmQocm5kKCksIDE2KTsgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgY2hlY2tfcW1mKHZvaWQpIHsKKyAgICBpbnQxNl90IHNyYzBbUFJFVl9TQU1QTEVTX0JVRl9TSVpFXTsKKyAgICBpbnQxNl90IHNyYzFbUFJFVl9TQU1QTEVTX0JVRl9TSVpFXTsKKyAgICBjb25zdCBpbnQxNl90ICp0bXAwID0gc3JjMDsKKyAgICBjb25zdCBpbnQxNl90ICp0bXAxID0gc3JjMTsKKyAgICBpbnQgZHN0MFsyXSwgZHN0MVsyXTsKKyAgICBpbnQgaTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBjb25zdCBpbnQxNl90ICpwcmV2X3NhbXBsZXMsIGludCB4b3V0WzJdKTsKKworICAgIHJhbmRvbWl6ZV9idWZmZXJzKCk7CisgICAgZm9yIChpID0gMDsgaSA8IFBSRVZfU0FNUExFU19CVUZfU0laRSAtIDI0OyBpKyspIHsKKyAgICAgICAgY2FsbF9yZWYodG1wMCsrLCBkc3QwKTsKKyAgICAgICAgY2FsbF9uZXcodG1wMSsrLCBkc3QxKTsKKyAgICAgICAgaWYgKG1lbWNtcChkc3QwLCBkc3QxLCBzaXplb2YoZHN0MCkpKQorICAgICAgICAgICAgZmFpbCgpOworICAgIH0KKyAgICBiZW5jaF9uZXcoc3JjMSwgZHN0MSk7Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfZzcyMmRzcCh2b2lkKQoreworICAgIEc3MjJEU1BDb250ZXh0IGg7CisKKyAgICBmZl9nNzIyZHNwX2luaXQoJmgpOworCisgICAgaWYgKGNoZWNrX2Z1bmMoaC5hcHBseV9xbWYsICJnNzIyX2FwcGx5X3FtZiIpKQorICAgICAgICBjaGVja19xbWYoKTsKKworICAgIHJlcG9ydCgiYXBwbHlfcW1mIik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS9oMjY0ZHNwLmMgYi90ZXN0cy9jaGVja2FzbS9oMjY0ZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3M2JjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2gyNjRkc3AuYwpAQCAtMCwwICsxLDMyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjaGVja2FzbS5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NGRzcC5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvaDI2NGRhdGEuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCitzdGF0aWMgY29uc3QgdWludDMyX3QgcGl4ZWxfbWFza1szXSA9IHsgMHhmZmZmZmZmZiwgMHgwMWZmMDFmZiwgMHgwM2ZmMDNmZiB9OworCisjZGVmaW5lIFNJWkVPRl9QSVhFTCAoKGJpdF9kZXB0aCArIDcpIC8gOCkKKyNkZWZpbmUgU0laRU9GX0NPRUYgICgyICogKChiaXRfZGVwdGggKyA3KSAvIDgpKQorI2RlZmluZSBQSVhFTF9TVFJJREUgMTYKKworI2RlZmluZSByYW5kb21pemVfYnVmZmVycygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHgsIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBtYXNrID0gcGl4ZWxfbWFza1tiaXRfZGVwdGggLSA4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzejsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBQSVhFTF9TVFJJREU7IHggKz0gNCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEFWX1dOMzJBKHNyYyArIHkgKiBQSVhFTF9TVFJJREUgKyB4LCBybmQoKSAmIG1hc2spOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQVZfV04zMkEoZHN0ICsgeSAqIFBJWEVMX1NUUklERSArIHgsIHJuZCgpICYgbWFzayk7ICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IHN6OyB4KyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGJpdF9kZXB0aCA9PSA4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY29lZlt5ICogc3ogKyB4XSA9IHNyY1t5ICogUElYRUxfU1RSSURFICsgeF0gLSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3kgKiBQSVhFTF9TVFJJREUgKyB4XTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKChpbnQzMl90ICopY29lZilbeSAqIHN6ICsgeF0gPSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCAqKXNyYylbeSAqIChQSVhFTF9TVFJJREUvMikgKyB4XSAtICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQxNl90ICopZHN0KVt5ICogKFBJWEVMX1NUUklERS8yKSArIHhdOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIGRjdDR4NF9pbXBsKHNpemUsIGRjdGNvZWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGRjdDR4NF8jI3NpemUoZGN0Y29lZiAqY29lZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIHksIHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkY3Rjb2VmIHRtcFsxNl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCB6MCA9IGNvZWZbaSo0ICsgMF0gKyBjb2VmW2kqNCArIDNdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHoxID0gY29lZltpKjQgKyAxXSArIGNvZWZbaSo0ICsgMl07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgejIgPSBjb2VmW2kqNCArIDBdIC0gY29lZltpKjQgKyAzXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCB6MyA9IGNvZWZbaSo0ICsgMV0gLSBjb2VmW2kqNCArIDJdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG1wW2kgKyA0KjBdID0gICB6MCArICAgejE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0bXBbaSArIDQqMV0gPSAyKnoyICsgICB6MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRtcFtpICsgNCoyXSA9ICAgejAgLSAgIHoxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdG1wW2kgKyA0KjNdID0gICB6MiAtIDIqejM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHowID0gdG1wW2kqNCArIDBdICsgdG1wW2kqNCArIDNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBpbnQgejEgPSB0bXBbaSo0ICsgMV0gKyB0bXBbaSo0ICsgMl07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCB6MiA9IHRtcFtpKjQgKyAwXSAtIHRtcFtpKjQgKyAzXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50IHozID0gdG1wW2kqNCArIDFdIC0gdG1wW2kqNCArIDJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb2VmW2kqNCArIDBdID0gICB6MCArICAgejE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvZWZbaSo0ICsgMV0gPSAyKnoyICsgICB6MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29lZltpKjQgKyAyXSA9ICAgejAgLSAgIHoxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb2VmW2kqNCArIDNdID0gICB6MiAtIDIqejM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHggPSAwOyB4IDwgNDsgeCsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHNjYWxlW10gPSB7IDEzMTA3ICogMTAsIDgwNjYgKiAxMywgNTI0MyAqIDE2IH07IFwKKyAgICAgICAgICAgIGNvbnN0IGludCBpZHggPSAoeSAmIDEpICsgKHggJiAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29lZlt5KjQgKyB4XSA9IChjb2VmW3kqNCArIHhdICogc2NhbGVbaWR4XSArICgxIDw8IDE0KSkgPj4gMTU7ICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIERDVDhfMUQoc3JjLCBzcmNzdHJpZGUsIGRzdCwgZHN0c3RyaWRlKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYTAgPSAoc3JjKVtzcmNzdHJpZGUgKiAwXSArIChzcmMpW3NyY3N0cmlkZSAqIDddOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBhMSA9IChzcmMpW3NyY3N0cmlkZSAqIDBdIC0gKHNyYylbc3Jjc3RyaWRlICogN107ICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGEyID0gKHNyYylbc3Jjc3RyaWRlICogMV0gKyAoc3JjKVtzcmNzdHJpZGUgKiA2XTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYTMgPSAoc3JjKVtzcmNzdHJpZGUgKiAxXSAtIChzcmMpW3NyY3N0cmlkZSAqIDZdOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBhNCA9IChzcmMpW3NyY3N0cmlkZSAqIDJdICsgKHNyYylbc3Jjc3RyaWRlICogNV07ICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGE1ID0gKHNyYylbc3Jjc3RyaWRlICogMl0gLSAoc3JjKVtzcmNzdHJpZGUgKiA1XTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYTYgPSAoc3JjKVtzcmNzdHJpZGUgKiAzXSArIChzcmMpW3NyY3N0cmlkZSAqIDRdOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBhNyA9IChzcmMpW3NyY3N0cmlkZSAqIDNdIC0gKHNyYylbc3Jjc3RyaWRlICogNF07ICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGIwID0gYTAgKyBhNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYjEgPSBhMiArIGE0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBiMiA9IGEwIC0gYTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGIzID0gYTIgLSBhNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYjQgPSBhMyArIGE1ICsgKGExICsgKGExID4+IDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBiNSA9IGExIC0gYTcgLSAoYTUgKyAoYTUgPj4gMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGI2ID0gYTEgKyBhNyAtIChhMyArIChhMyA+PiAxKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgYjcgPSBhMyAtIGE1ICsgKGE3ICsgKGE3ID4+IDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChkc3QpW2RzdHN0cmlkZSAqIDBdID0gIGIwICsgIGIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGRzdClbZHN0c3RyaWRlICogMV0gPSAgYjQgKyAoYjcgPj4gMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZHN0KVtkc3RzdHJpZGUgKiAyXSA9ICBiMiArIChiMyA+PiAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChkc3QpW2RzdHN0cmlkZSAqIDNdID0gIGI1ICsgKGI2ID4+IDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGRzdClbZHN0c3RyaWRlICogNF0gPSAgYjAgIC0gYjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoZHN0KVtkc3RzdHJpZGUgKiA1XSA9ICBiNiAtIChiNSA+PiAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChkc3QpW2RzdHN0cmlkZSAqIDZdID0gKGIyID4+IDEpIC0gYjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGRzdClbZHN0c3RyaWRlICogN10gPSAoYjQgPj4gMikgLSBiNzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZGN0OHg4X2ltcGwoc2l6ZSwgZGN0Y29lZikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgZGN0OHg4XyMjc2l6ZShkY3Rjb2VmICpjb2VmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRjdGNvZWYgdG1wWzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRENUOF8xRChjb2VmICsgaSwgOCwgdG1wICsgaSwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRENUOF8xRCh0bXAgKyA4KmksIDEsIGNvZWYgKyBpLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh5ID0gMDsgeSA8IDg7IHkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDg7IHgrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBzY2FsZVtdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgMTMxMDcgKiAyMCwgMTE0MjggKiAxOCwgMjA5NzIgKiAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAxMjIyMiAqIDE5LCAxNjc3NyAqIDI1LCAxNTQ4MSAqIDI0LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGlkeG1hcFtdID0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAwLCAzLCA0LCAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIDMsIDEsIDUsIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgNCwgNSwgMiwgNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAzLCAxLCA1LCAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBpbnQgaWR4ID0gaWR4bWFwWyh5ICYgMykgKiA0ICsgKHggJiAzKV07ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvZWZbeSo4ICsgeF0gPSAoKGludDY0X3QpY29lZlt5KjggKyB4XSAqICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVtpZHhdICsgKDEgPDwgMTcpKSA+PiAxODsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitkY3Q0eDRfaW1wbCgxNiwgaW50MTZfdCkKK2RjdDR4NF9pbXBsKDMyLCBpbnQzMl90KQorCitkY3Q4eDhfaW1wbCgxNiwgaW50MTZfdCkKK2RjdDh4OF9pbXBsKDMyLCBpbnQzMl90KQorCitzdGF0aWMgdm9pZCBkY3Q0eDQoaW50MTZfdCAqY29lZiwgaW50IGJpdF9kZXB0aCkKK3sKKyAgICBpZiAoYml0X2RlcHRoID09IDgpCisgICAgICAgIGRjdDR4NF8xNihjb2VmKTsKKyAgICBlbHNlCisgICAgICAgIGRjdDR4NF8zMigoaW50MzJfdCAqKSBjb2VmKTsKK30KKworc3RhdGljIHZvaWQgZGN0OHg4KGludDE2X3QgKmNvZWYsIGludCBiaXRfZGVwdGgpCit7CisgICAgaWYgKGJpdF9kZXB0aCA9PSA4KSB7CisgICAgICAgIGRjdDh4OF8xNihjb2VmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkY3Q4eDhfMzIoKGludDMyX3QgKikgY29lZik7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX2lkY3Qodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIHNyYywgIFs4ICogOCAqIDJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGRzdCwgIFs4ICogOCAqIDJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGRzdDAsIFs4ICogOCAqIDJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGRzdDFfYmFzZSwgWzggKiA4ICogMiArIDMyXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBjb2VmLCBbOCAqIDggKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBzdWJjb2VmMCwgWzggKiA4ICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgc3ViY29lZjEsIFs4ICogOCAqIDJdKTsKKyAgICBIMjY0RFNQQ29udGV4dCBoOworICAgIGludCBiaXRfZGVwdGgsIHN6LCBhbGlnbiwgZGM7CisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBpbnQgc3RyaWRlKTsKKworICAgIGZvciAoYml0X2RlcHRoID0gODsgYml0X2RlcHRoIDw9IDEwOyBiaXRfZGVwdGgrKykgeworICAgICAgICBmZl9oMjY0ZHNwX2luaXQoJmgsIGJpdF9kZXB0aCwgMSk7CisgICAgICAgIGZvciAoc3ogPSA0OyBzeiA8PSA4OyBzeiArPSA0KSB7CisgICAgICAgICAgICByYW5kb21pemVfYnVmZmVycygpOworCisgICAgICAgICAgICBpZiAoc3ogPT0gNCkKKyAgICAgICAgICAgICAgICBkY3Q0eDQoY29lZiwgYml0X2RlcHRoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkY3Q4eDgoY29lZiwgYml0X2RlcHRoKTsKKworICAgICAgICAgICAgZm9yIChkYyA9IDA7IGRjIDw9IDE7IGRjKyspIHsKKyAgICAgICAgICAgICAgICB2b2lkICgqaWRjdCkodWludDhfdCAqLCBpbnQxNl90ICosIGludCkgPSBOVUxMOworICAgICAgICAgICAgICAgIHN3aXRjaCAoKHN6IDw8IDEpIHwgZGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICg0IDw8IDEpIHwgMDogaWRjdCA9IGguaDI2NF9pZGN0X2FkZDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAoNCA8PCAxKSB8IDE6IGlkY3QgPSBoLmgyNjRfaWRjdF9kY19hZGQ7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgKDggPDwgMSkgfCAwOiBpZGN0ID0gaC5oMjY0X2lkY3Q4X2FkZDsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAoOCA8PCAxKSB8IDE6IGlkY3QgPSBoLmgyNjRfaWRjdDhfZGNfYWRkOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrX2Z1bmMoaWRjdCwgImgyNjRfaWRjdCVkX2FkZCVzXyVkYnBwIiwgc3osIGRjID8gIl9kYyIgOiAiIiwgYml0X2RlcHRoKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGFsaWduID0gMDsgYWxpZ24gPCAxNjsgYWxpZ24gKz0gc3ogKiBTSVpFT0ZfUElYRUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdDEgPSBkc3QxX2Jhc2UgKyBhbGlnbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChzdWJjb2VmMCwgMCwgc3ogKiBzeiAqIFNJWkVPRl9DT0VGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoc3ViY29lZjAsIGNvZWYsIFNJWkVPRl9DT0VGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHN1YmNvZWYwLCBjb2VmLCBzeiAqIHN6ICogU0laRU9GX0NPRUYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdDAsIGRzdCwgc3ogKiBQSVhFTF9TVFJJREUpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRzdDEsIGRzdCwgc3ogKiBQSVhFTF9TVFJJREUpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHN1YmNvZWYxLCBzdWJjb2VmMCwgc3ogKiBzeiAqIFNJWkVPRl9DT0VGKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfcmVmKGRzdDAsIHN1YmNvZWYwLCBQSVhFTF9TVFJJREUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9uZXcoZHN0MSwgc3ViY29lZjEsIFBJWEVMX1NUUklERSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVtY21wKGRzdDAsIGRzdDEsIHN6ICogUElYRUxfU1RSSURFKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNtcChzdWJjb2VmMCwgc3ViY29lZjEsIHN6ICogc3ogKiBTSVpFT0ZfQ09FRikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYmVuY2hfbmV3KGRzdDEsIHN1YmNvZWYxLCBzeiAqIFNJWkVPRl9QSVhFTCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2lkY3RfbXVsdGlwbGUodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGRzdF9mdWxsLCAgWzE2ICogMTYgKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBjb2VmX2Z1bGwsIFsxNiAqIDE2ICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgZHN0MCwgIFsxNiAqIDE2ICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgZHN0MSwgIFsxNiAqIDE2ICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgY29lZjAsIFsxNiAqIDE2ICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgY29lZjEsIFsxNiAqIDE2ICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgbm56YywgIFsxNSAqIDhdKTsKKyAgICBIMjY0RFNQQ29udGV4dCBoOworICAgIGludCBiaXRfZGVwdGgsIGksIHksIGZ1bmM7CisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICpkc3QsIGNvbnN0IGludCAqYmxvY2tfb2Zmc2V0LCBpbnQxNl90ICpibG9jaywgaW50IHN0cmlkZSwgY29uc3QgdWludDhfdCBubnpjWzE1KjhdKTsKKworICAgIGZvciAoYml0X2RlcHRoID0gODsgYml0X2RlcHRoIDw9IDEwOyBiaXRfZGVwdGgrKykgeworICAgICAgICBmZl9oMjY0ZHNwX2luaXQoJmgsIGJpdF9kZXB0aCwgMSk7CisgICAgICAgIGZvciAoZnVuYyA9IDA7IGZ1bmMgPCAzOyBmdW5jKyspIHsKKyAgICAgICAgICAgIHZvaWQgKCppZGN0KSh1aW50OF90ICosIGNvbnN0IGludCAqLCBpbnQxNl90ICosIGludCwgY29uc3QgdWludDhfdFtdKSA9IE5VTEw7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICAgICAgaW50IHN6ID0gNCwgaW50cmEgPSAwOworICAgICAgICAgICAgaW50IGJsb2NrX29mZnNldFsxNl0gPSB7IDAgfTsKKyAgICAgICAgICAgIHN3aXRjaCAoZnVuYykgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGlkY3QgPSBoLmgyNjRfaWRjdF9hZGQxNjsKKyAgICAgICAgICAgICAgICBuYW1lID0gImgyNjRfaWRjdF9hZGQxNiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWRjdCA9IGguaDI2NF9pZGN0X2FkZDE2aW50cmE7CisgICAgICAgICAgICAgICAgbmFtZSA9ICJoMjY0X2lkY3RfYWRkMTZpbnRyYSI7CisgICAgICAgICAgICAgICAgaW50cmEgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIGlkY3QgPSBoLmgyNjRfaWRjdDhfYWRkNDsKKyAgICAgICAgICAgICAgICBuYW1lID0gImgyNjRfaWRjdDhfYWRkNCI7CisgICAgICAgICAgICAgICAgc3ogPSA4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KG5uemMsIDAsIDE1ICogOCk7CisgICAgICAgICAgICBtZW1zZXQoY29lZl9mdWxsLCAwLCAxNiAqIDE2ICogU0laRU9GX0NPRUYpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2ICogMTY7IGkgKz0gc3ogKiBzeikgeworICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3JjWzggKiA4ICogMl07CisgICAgICAgICAgICAgICAgdWludDhfdCBkc3RbOCAqIDggKiAyXTsKKyAgICAgICAgICAgICAgICBpbnQxNl90IGNvZWZbOCAqIDggKiAyXTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBpIC8gc3o7CisgICAgICAgICAgICAgICAgaW50IGJsb2NrX3kgPSAoaW5kZXggLyAxNikgKiBzejsKKyAgICAgICAgICAgICAgICBpbnQgYmxvY2tfeCA9IGluZGV4ICUgMTY7CisgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IChibG9ja195ICogMTYgKyBibG9ja194KSAqIFNJWkVPRl9QSVhFTDsKKyAgICAgICAgICAgICAgICBpbnQgbm56ID0gcm5kKCkgJSAzOworCisgICAgICAgICAgICAgICAgcmFuZG9taXplX2J1ZmZlcnMoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3ogPT0gNCkKKyAgICAgICAgICAgICAgICAgICAgZGN0NHg0KGNvZWYsIGJpdF9kZXB0aCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkY3Q4eDgoY29lZiwgYml0X2RlcHRoKTsKKworICAgICAgICAgICAgICAgIGZvciAoeSA9IDA7IHkgPCBzejsgeSsrKQorICAgICAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdF9mdWxsW29mZnNldCArIHkgKiAxNiAqIFNJWkVPRl9QSVhFTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHN0W1BJWEVMX1NUUklERSAqIHldLCBzeiAqIFNJWkVPRl9QSVhFTCk7CisKKyAgICAgICAgICAgICAgICBpZiAobm56ID4gMSkKKyAgICAgICAgICAgICAgICAgICAgbm56ID0gc3ogKiBzejsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJmNvZWZfZnVsbFtpICogU0laRU9GX0NPRUYvc2l6ZW9mKGNvZWZbMF0pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29lZiwgbm56ICogU0laRU9GX0NPRUYpOworCisgICAgICAgICAgICAgICAgaWYgKGludHJhICYmIG5ueiA9PSAxKQorICAgICAgICAgICAgICAgICAgICBubnogPSAwOworCisgICAgICAgICAgICAgICAgbm56Y1tzY2FuOFtpIC8gMTZdXSA9IG5uejsKKyAgICAgICAgICAgICAgICBibG9ja19vZmZzZXRbaSAvIDE2XSA9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNoZWNrX2Z1bmMoaWRjdCwgIiVzXyVkYnBwIiwgbmFtZSwgYml0X2RlcHRoKSkgeworICAgICAgICAgICAgICAgIG1lbWNweShjb2VmMCwgY29lZl9mdWxsLCAxNiAqIDE2ICogU0laRU9GX0NPRUYpOworICAgICAgICAgICAgICAgIG1lbWNweShjb2VmMSwgY29lZl9mdWxsLCAxNiAqIDE2ICogU0laRU9GX0NPRUYpOworICAgICAgICAgICAgICAgIG1lbWNweShkc3QwLCBkc3RfZnVsbCwgMTYgKiAxNiAqIFNJWkVPRl9QSVhFTCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdDEsIGRzdF9mdWxsLCAxNiAqIDE2ICogU0laRU9GX1BJWEVMKTsKKyAgICAgICAgICAgICAgICBjYWxsX3JlZihkc3QwLCBibG9ja19vZmZzZXQsIGNvZWYwLCAxNiAqIFNJWkVPRl9QSVhFTCwgbm56Yyk7CisgICAgICAgICAgICAgICAgY2FsbF9uZXcoZHN0MSwgYmxvY2tfb2Zmc2V0LCBjb2VmMSwgMTYgKiBTSVpFT0ZfUElYRUwsIG5uemMpOworICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoZHN0MCwgZHN0MSwgMTYgKiAxNiAqIFNJWkVPRl9QSVhFTCkgfHwKKyAgICAgICAgICAgICAgICAgICAgbWVtY21wKGNvZWYwLCBjb2VmMSwgMTYgKiAxNiAqIFNJWkVPRl9DT0VGKSkKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAgIGJlbmNoX25ldyhkc3QxLCBibG9ja19vZmZzZXQsIGNvZWYxLCAxNiAqIFNJWkVPRl9QSVhFTCwgbm56Yyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfaDI2NGRzcCh2b2lkKQoreworICAgIGNoZWNrX2lkY3QoKTsKKyAgICBjaGVja19pZGN0X211bHRpcGxlKCk7CisgICAgcmVwb3J0KCJpZGN0Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS9oMjY0cHJlZC5jIGIvdGVzdHMvY2hlY2thc20vaDI2NHByZWQuYwppbmRleCA0MDI4NDA1Li41OWRjYjJmIDEwMDY0NAotLS0gYS90ZXN0cy9jaGVja2FzbS9oMjY0cHJlZC5jCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2gyNjRwcmVkLmMKQEAgLTI5LDcgKzI5LDcgQEAKIHN0YXRpYyBjb25zdCBpbnQgY29kZWNfaWRzWzRdID0geyBBVl9DT0RFQ19JRF9IMjY0LCBBVl9DT0RFQ19JRF9WUDgsIEFWX0NPREVDX0lEX1JWNDAsIEFWX0NPREVDX0lEX1NWUTMgfTsKIAogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwcmVkNHg0X21vZGVzWzRdWzE1XSA9IHsKLSAgICB7IC8qIEgyNjQgKi8KKyAgICB7IC8qIEguMjY0ICovCiAgICAgICAgIFtWRVJUX1BSRUQgICAgICAgICAgIF0gPSAidmVydGljYWwiLAogICAgICAgICBbSE9SX1BSRUQgICAgICAgICAgICBdID0gImhvcml6b250YWwiLAogICAgICAgICBbRENfUFJFRCAgICAgICAgICAgICBdID0gImRjIiwKQEAgLTY1LDcgKzY1LDcgQEAKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcHJlZDh4OF9tb2Rlc1s0XVsxMV0gPSB7Ci0gICAgeyAvKiBIMjY0ICovCisgICAgeyAvKiBILjI2NCAqLwogICAgICAgICBbRENfUFJFRDh4OCAgICAgICAgICAgICAgXSA9ICJkYyIsCiAgICAgICAgIFtIT1JfUFJFRDh4OCAgICAgICAgICAgICBdID0gImhvcml6b250YWwiLAogICAgICAgICBbVkVSVF9QUkVEOHg4ICAgICAgICAgICAgXSA9ICJ2ZXJ0aWNhbCIsCkBAIC05Miw3ICs5Miw3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHByZWQxNngxNl9tb2Rlc1s0XVs5XSA9IHsKLSAgICB7IC8qIEgyNjQgKi8KKyAgICB7IC8qIEguMjY0ICovCiAgICAgICAgIFtEQ19QUkVEOHg4ICAgICBdID0gImRjIiwKICAgICAgICAgW0hPUl9QUkVEOHg4ICAgIF0gPSAiaG9yaXpvbnRhbCIsCiAgICAgICAgIFtWRVJUX1BSRUQ4eDggICBdID0gInZlcnRpY2FsIiwKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL2hldmNfYWRkX3Jlcy5jIGIvdGVzdHMvY2hlY2thc20vaGV2Y19hZGRfcmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyYzZiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2hldmNfYWRkX3Jlcy5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZHJhIEjDoWprb3bDoQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaGV2Y2RzcC5oIgorCisjaW5jbHVkZSAiY2hlY2thc20uaCIKKworI2RlZmluZSByYW5kb21pemVfYnVmZmVycyhidWYsIHNpemUpICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7ICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50MTZfdCByID0gcm5kKCk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfV04xNkEoYnVmICsgaiwgciA+PiAzKTsgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgcmFuZG9taXplX2J1ZmZlcnMyKGJ1Ziwgc2l6ZSkgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfV04xNkEoYnVmICsgaiAqIDIsIHJuZCgpICYgMHgzRkYpOyBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgY2hlY2tfYWRkX3JlcyhIRVZDRFNQQ29udGV4dCBoLCBpbnQgYml0X2RlcHRoKQoreworICAgIGludCBpOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MTZfdCwgcmVzMCwgWzMyICogMzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIHJlczEsIFszMiAqIDMyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBkc3QwLCBbMzIgKiAzMiAqIDJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdDEsIFszMiAqIDMyICogMl0pOworCisgICAgZm9yIChpID0gMjsgaSA8PSA1OyBpKyspIHsKKyAgICAgICAgaW50IGJsb2NrX3NpemUgPSAxIDw8IGk7CisgICAgICAgIGludCBzaXplID0gYmxvY2tfc2l6ZSAqIGJsb2NrX3NpemU7CisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUgPSBibG9ja19zaXplIDw8IChiaXRfZGVwdGggPiA4KTsKKyAgICAgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICpkc3QsIGludDE2X3QgKnJlcywgcHRyZGlmZl90IHN0cmlkZSk7CisKKyAgICAgICAgcmFuZG9taXplX2J1ZmZlcnMocmVzMCwgc2l6ZSk7CisgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzMihkc3QwLCBzaXplKTsKKyAgICAgICAgbWVtY3B5KHJlczEsIHJlczAsIHNpemVvZigqcmVzMCkgKiBzaXplKTsKKyAgICAgICAgbWVtY3B5KGRzdDEsIGRzdDAsIHNpemVvZihpbnQxNl90KSAqIHNpemUpOworCisgICAgICAgIGlmIChjaGVja19mdW5jKGguYWRkX3Jlc2lkdWFsW2kgLSAyXSwgImhldmNfYWRkX3Jlc18lZHglZF8lZCIsIGJsb2NrX3NpemUsIGJsb2NrX3NpemUsIGJpdF9kZXB0aCkpIHsKKyAgICAgICAgICAgIGNhbGxfcmVmKGRzdDAsIHJlczAsIHN0cmlkZSk7CisgICAgICAgICAgICBjYWxsX25ldyhkc3QxLCByZXMxLCBzdHJpZGUpOworICAgICAgICAgICAgaWYgKG1lbWNtcChkc3QwLCBkc3QxLCBzaXplKSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBiZW5jaF9uZXcoZHN0MSwgcmVzMSwgc3RyaWRlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjaGVja2FzbV9jaGVja19oZXZjX2FkZF9yZXModm9pZCkKK3sKKyAgICBpbnQgYml0X2RlcHRoOworCisgICAgZm9yIChiaXRfZGVwdGggPSA4OyBiaXRfZGVwdGggPD0gMTA7IGJpdF9kZXB0aCsrKSB7CisgICAgICAgIEhFVkNEU1BDb250ZXh0IGg7CisKKyAgICAgICAgZmZfaGV2Y19kc3BfaW5pdCgmaCwgYml0X2RlcHRoKTsKKyAgICAgICAgY2hlY2tfYWRkX3JlcyhoLCBiaXRfZGVwdGgpOworICAgIH0KKyAgICByZXBvcnQoImFkZF9yZXNpZHVhbCIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vaGV2Y19pZGN0LmMgYi90ZXN0cy9jaGVja2FzbS9oZXZjX2lkY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjAxMTFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2thc20vaGV2Y19pZGN0LmMKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZHJhIEjDoWprb3bDoQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvaGV2Y2RzcC5oIgorCisjaW5jbHVkZSAiY2hlY2thc20uaCIKKworI2RlZmluZSByYW5kb21pemVfYnVmZmVycyhidWYsIHNpemUpICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7ICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50MTZfdCByID0gcm5kKCk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQVZfV04xNkEoYnVmICsgaiwgcik7ICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGNoZWNrX2lkY3QoSEVWQ0RTUENvbnRleHQgaCwgaW50IGJpdF9kZXB0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBMT0NBTF9BTElHTkVEKDMyLCBpbnQxNl90LCBjb2VmZnMwLCBbMzIgKiAzMl0pOworICAgIExPQ0FMX0FMSUdORUQoMzIsIGludDE2X3QsIGNvZWZmczEsIFszMiAqIDMyXSk7CisKKyAgICBmb3IgKGkgPSAyOyBpIDw9IDU7IGkrKykgeworICAgICAgICBpbnQgYmxvY2tfc2l6ZSA9IDEgPDwgaTsKKyAgICAgICAgaW50IHNpemUgPSBibG9ja19zaXplICogYmxvY2tfc2l6ZTsKKyAgICAgICAgaW50IGNvbF9saW1pdCA9IGJsb2NrX3NpemU7CisgICAgICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBpbnQxNl90ICpjb2VmZnMsIGludCBjb2xfbGltaXQpOworCisgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKGNvZWZmczAsIHNpemUpOworICAgICAgICBtZW1jcHkoY29lZmZzMSwgY29lZmZzMCwgc2l6ZW9mKCpjb2VmZnMwKSAqIHNpemUpOworICAgICAgICBpZiAoY2hlY2tfZnVuYyhoLmlkY3RbaSAtIDJdLCAiaGV2Y19pZGN0XyVkeCVkXyVkIiwgYmxvY2tfc2l6ZSwgYmxvY2tfc2l6ZSwgYml0X2RlcHRoKSkgeworICAgICAgICAgICAgY2FsbF9yZWYoY29lZmZzMCwgY29sX2xpbWl0KTsKKyAgICAgICAgICAgIGNhbGxfbmV3KGNvZWZmczEsIGNvbF9saW1pdCk7CisgICAgICAgICAgICBpZiAobWVtY21wKGNvZWZmczAsIGNvZWZmczEsIHNpemVvZigqY29lZmZzMCkgKiBzaXplKSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBiZW5jaF9uZXcoY29lZmZzMSwgY29sX2xpbWl0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfaWRjdF9kYyhIRVZDRFNQQ29udGV4dCBoLCBpbnQgYml0X2RlcHRoKQoreworICAgIGludCBpOworICAgIExPQ0FMX0FMSUdORUQoMzIsIGludDE2X3QsIGNvZWZmczAsIFszMiAqIDMyXSk7CisgICAgTE9DQUxfQUxJR05FRCgzMiwgaW50MTZfdCwgY29lZmZzMSwgWzMyICogMzJdKTsKKworICAgIGZvciAoaSA9IDI7IGkgPD0gNTsgaSsrKSB7CisgICAgICAgIGludCBibG9ja19zaXplID0gMSA8PCBpOworICAgICAgICBpbnQgc2l6ZSA9IGJsb2NrX3NpemUgKiBibG9ja19zaXplOworICAgICAgICBkZWNsYXJlX2Z1bmNfZW1tcyhBVl9DUFVfRkxBR19NTVhFWFQsIHZvaWQsIGludDE2X3QgKmNvZWZmcyk7CisKKyAgICAgICAgcmFuZG9taXplX2J1ZmZlcnMoY29lZmZzMCwgc2l6ZSk7CisgICAgICAgIG1lbWNweShjb2VmZnMxLCBjb2VmZnMwLCBzaXplb2YoKmNvZWZmczApICogc2l6ZSk7CisKKyAgICAgICAgaWYgKGNoZWNrX2Z1bmMoaC5pZGN0X2RjW2kgLSAyXSwgImhldmNfaWRjdF8lZHglZF9kY18lZCIsIGJsb2NrX3NpemUsIGJsb2NrX3NpemUsIGJpdF9kZXB0aCkpIHsKKyAgICAgICAgICAgIGNhbGxfcmVmKGNvZWZmczApOworICAgICAgICAgICAgY2FsbF9uZXcoY29lZmZzMSk7CisgICAgICAgICAgICBpZiAobWVtY21wKGNvZWZmczAsIGNvZWZmczEsIHNpemVvZigqY29lZmZzMCkgKiBzaXplKSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBiZW5jaF9uZXcoY29lZmZzMSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfaGV2Y19pZGN0KHZvaWQpCit7CisgICAgaW50IGJpdF9kZXB0aDsKKworICAgIGZvciAoYml0X2RlcHRoID0gODsgYml0X2RlcHRoIDw9IDEyOyBiaXRfZGVwdGggKz0gMikgeworICAgICAgICBIRVZDRFNQQ29udGV4dCBoOworCisgICAgICAgIGZmX2hldmNfZHNwX2luaXQoJmgsIGJpdF9kZXB0aCk7CisgICAgICAgIGNoZWNrX2lkY3RfZGMoaCwgYml0X2RlcHRoKTsKKyAgICB9CisgICAgcmVwb3J0KCJpZGN0X2RjIik7CisKKyAgICBmb3IgKGJpdF9kZXB0aCA9IDg7IGJpdF9kZXB0aCA8PSAxMjsgYml0X2RlcHRoICs9IDIpIHsKKyAgICAgICAgSEVWQ0RTUENvbnRleHQgaDsKKworICAgICAgICBmZl9oZXZjX2RzcF9pbml0KCZoLCBiaXRfZGVwdGgpOworICAgICAgICBjaGVja19pZGN0KGgsIGJpdF9kZXB0aCk7CisgICAgfQorICAgIHJlcG9ydCgiaWRjdCIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vaGV2Y19zYW8uYyBiL3Rlc3RzL2NoZWNrYXNtL2hldmNfc2FvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQwY2Y4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2hldmNfc2FvLmMKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggWWluZ21pbmcgRmFuIDx5aW5nbWluZ2ZhbkBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisKKyNpbmNsdWRlICJsaWJhdmNvZGVjL2hldmNkc3AuaCIKKworI2luY2x1ZGUgImNoZWNrYXNtLmgiCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBwaXhlbF9tYXNrWzNdID0geyAweGZmZmZmZmZmLCAweDAzZmYwM2ZmLCAweDBmZmYwZmZmIH07CitzdGF0aWMgY29uc3QgdWludDMyX3Qgc2FvX3NpemVbNV0gPSB7OCwgMTYsIDMyLCA0OCwgNjR9OworCisjZGVmaW5lIFNJWkVPRl9QSVhFTCAoKGJpdF9kZXB0aCArIDcpIC8gOCkKKyNkZWZpbmUgUElYRUxfU1RSSURFICgyKk1BWF9QQl9TSVpFICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSkgLy9zYW1lIHdpdGggc2FvX2VkZ2Ugc3JjX3N0cmlkZQorI2RlZmluZSBCVUZfU0laRSAoUElYRUxfU1RSSURFICogKDY0KzIpICogMikgLy8rMiBmb3IgdG9wIGFuZCBib3R0b20gcm93LCAqMiBmb3IgaGlnaCBiaXQgZGVwdGgKKyNkZWZpbmUgT0ZGU0VUX1RIUkVTSCAoMSA8PCAoYml0X2RlcHRoIC0gNSkpCisjZGVmaW5lIE9GRlNFVF9MRU5HVEggNQorCisjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXJzKGJ1ZjAsIGJ1ZjEsIHNpemUpICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IG1hc2sgPSBwaXhlbF9tYXNrWyhiaXRfZGVwdGggLSA4KSA+PiAxXTsgICBcCisgICAgICAgIGludCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoayA9IDA7IGsgPCBzaXplOyBrICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCByID0gcm5kKCkgJiBtYXNrOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBVl9XTjMyQShidWYwICsgaywgcik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBVl9XTjMyQShidWYxICsgaywgcik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSByYW5kb21pemVfYnVmZmVyczIoYnVmLCBzaXplKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1aW50MzJfdCBtYXhfb2Zmc2V0ID0gT0ZGU0VUX1RIUkVTSDsgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoYml0X2RlcHRoID09IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgciA9IHJuZCgpICUgbWF4X29mZnNldDsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJ1ZltrXSA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHNpemU7IGsrKykgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHVpbnQxNl90IHIgPSBybmQoKSAlIG1heF9vZmZzZXQ7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJ1ZltrXSA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGNoZWNrX3Nhb19iYW5kKEhFVkNEU1BDb250ZXh0IGgsIGludCBiaXRfZGVwdGgpCit7CisgICAgaW50IGk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBkc3QwLCBbQlVGX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdDEsIFtCVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgc3JjMCwgW0JVRl9TSVpFXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBzcmMxLCBbQlVGX1NJWkVdKTsKKyAgICBpbnQxNl90IG9mZnNldF92YWxbT0ZGU0VUX0xFTkdUSF07CisgICAgaW50IGxlZnRfY2xhc3MgPSBybmQoKSUzMjsKKworICAgIGZvciAoaSA9IDA7IGkgPD0gNDsgaSsrKSB7CisgICAgICAgIGludCBibG9ja19zaXplID0gc2FvX3NpemVbaV07CisgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUgPSBQSVhFTF9TVFJJREUqU0laRU9GX1BJWEVMOworICAgICAgICBkZWNsYXJlX2Z1bmNfZW1tcyhBVl9DUFVfRkxBR19NTVgsIHZvaWQsIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3QgZHN0X3N0cmlkZSwgcHRyZGlmZl90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKnNhb19vZmZzZXRfdmFsLCBpbnQgc2FvX2xlZnRfY2xhc3MsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAgICAgcmFuZG9taXplX2J1ZmZlcnMoc3JjMCwgc3JjMSwgQlVGX1NJWkUpOworICAgICAgICByYW5kb21pemVfYnVmZmVyczIob2Zmc2V0X3ZhbCwgT0ZGU0VUX0xFTkdUSCk7CisgICAgICAgIG1lbXNldChkc3QwLCAwLCBCVUZfU0laRSk7CisgICAgICAgIG1lbXNldChkc3QxLCAwLCBCVUZfU0laRSk7CisKKyAgICAgICAgaWYgKGNoZWNrX2Z1bmMoaC5zYW9fYmFuZF9maWx0ZXJbaV0sICJoZXZjX3Nhb19iYW5kXyVkeCVkXyVkIiwgYmxvY2tfc2l6ZSwgYmxvY2tfc2l6ZSwgYml0X2RlcHRoKSkgeworICAgICAgICAgICAgY2FsbF9yZWYoZHN0MCwgc3JjMCwgc3RyaWRlLCBzdHJpZGUsIG9mZnNldF92YWwsIGxlZnRfY2xhc3MsIGJsb2NrX3NpemUsIGJsb2NrX3NpemUpOworICAgICAgICAgICAgY2FsbF9uZXcoZHN0MSwgc3JjMSwgc3RyaWRlLCBzdHJpZGUsIG9mZnNldF92YWwsIGxlZnRfY2xhc3MsIGJsb2NrX3NpemUsIGJsb2NrX3NpemUpOworICAgICAgICAgICAgaWYgKG1lbWNtcChkc3QwLCBkc3QxLCBCVUZfU0laRSkpCisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgYmVuY2hfbmV3KGRzdDEsIHNyYzEsIHN0cmlkZSwgc3RyaWRlLCBvZmZzZXRfdmFsLCBsZWZ0X2NsYXNzLCBibG9ja19zaXplLCBibG9ja19zaXplKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfc2FvX2VkZ2UoSEVWQ0RTUENvbnRleHQgaCwgaW50IGJpdF9kZXB0aCkKK3sKKyAgICBpbnQgaTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdDAsIFtCVUZfU0laRV0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0MSwgW0JVRl9TSVpFXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBzcmMwLCBbQlVGX1NJWkVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIHNyYzEsIFtCVUZfU0laRV0pOworICAgIGludDE2X3Qgb2Zmc2V0X3ZhbFtPRkZTRVRfTEVOR1RIXTsKKyAgICBpbnQgZW8gPSBybmQoKSU0OworCisgICAgZm9yIChpID0gMDsgaSA8PSA0OyBpKyspIHsKKyAgICAgICAgaW50IGJsb2NrX3NpemUgPSBzYW9fc2l6ZVtpXTsKKyAgICAgICAgcHRyZGlmZl90IHN0cmlkZSA9IFBJWEVMX1NUUklERSpTSVpFT0ZfUElYRUw7CisgICAgICAgIGludCBvZmZzZXQgPSAoQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRSArIFBJWEVMX1NUUklERSkqU0laRU9GX1BJWEVMOworICAgICAgICBkZWNsYXJlX2Z1bmNfZW1tcyhBVl9DUFVfRkxBR19NTVgsIHZvaWQsIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLCBwdHJkaWZmX3Qgc3RyaWRlX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqc2FvX29mZnNldF92YWwsIGludCBlbywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgICAgICByYW5kb21pemVfYnVmZmVycyhzcmMwLCBzcmMxLCBCVUZfU0laRSk7CisgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzMihvZmZzZXRfdmFsLCBPRkZTRVRfTEVOR1RIKTsKKyAgICAgICAgbWVtc2V0KGRzdDAsIDAsIEJVRl9TSVpFKTsKKyAgICAgICAgbWVtc2V0KGRzdDEsIDAsIEJVRl9TSVpFKTsKKworICAgICAgICBpZiAoY2hlY2tfZnVuYyhoLnNhb19lZGdlX2ZpbHRlcltpXSwgImhldmNfc2FvX2VkZ2VfJWR4JWRfJWQiLCBibG9ja19zaXplLCBibG9ja19zaXplLCBiaXRfZGVwdGgpKSB7CisgICAgICAgICAgICBjYWxsX3JlZihkc3QwLCBzcmMwICsgb2Zmc2V0LCBzdHJpZGUsIG9mZnNldF92YWwsIGVvLCBibG9ja19zaXplLCBibG9ja19zaXplKTsKKyAgICAgICAgICAgIGNhbGxfbmV3KGRzdDEsIHNyYzEgKyBvZmZzZXQsIHN0cmlkZSwgb2Zmc2V0X3ZhbCwgZW8sIGJsb2NrX3NpemUsIGJsb2NrX3NpemUpOworICAgICAgICAgICAgaWYgKG1lbWNtcChkc3QwLCBkc3QxLCBCVUZfU0laRSkpCisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgYmVuY2hfbmV3KGRzdDEsIHNyYzEgKyBvZmZzZXQsIHN0cmlkZSwgb2Zmc2V0X3ZhbCwgZW8sIGJsb2NrX3NpemUsIGJsb2NrX3NpemUpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGNoZWNrYXNtX2NoZWNrX2hldmNfc2FvKHZvaWQpCit7CisgICAgaW50IGJpdF9kZXB0aDsKKworICAgIGZvciAoYml0X2RlcHRoID0gODsgYml0X2RlcHRoIDw9IDEyOyBiaXRfZGVwdGggKz0gMikgeworICAgICAgICBIRVZDRFNQQ29udGV4dCBoOworCisgICAgICAgIGZmX2hldmNfZHNwX2luaXQoJmgsIGJpdF9kZXB0aCk7CisgICAgICAgIGNoZWNrX3Nhb19iYW5kKGgsIGJpdF9kZXB0aCk7CisgICAgfQorICAgIHJlcG9ydCgic2FvX2JhbmQiKTsKKworICAgIGZvciAoYml0X2RlcHRoID0gODsgYml0X2RlcHRoIDw9IDEyOyBiaXRfZGVwdGggKz0gMikgeworICAgICAgICBIRVZDRFNQQ29udGV4dCBoOworCisgICAgICAgIGZmX2hldmNfZHNwX2luaXQoJmgsIGJpdF9kZXB0aCk7CisgICAgICAgIGNoZWNrX3Nhb19lZGdlKGgsIGJpdF9kZXB0aCk7CisgICAgfQorICAgIHJlcG9ydCgic2FvX2VkZ2UiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL2h1ZmZ5dXZkc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL2h1ZmZ5dXZkc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkyMDIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2thc20vaHVmZnl1dmRzcC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZHJhIEjDoWprb3bDoQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9odWZmeXV2ZHNwLmgiCisKKyNpbmNsdWRlICJjaGVja2FzbS5oIgorCisjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXJzKGJ1Ziwgc2l6ZSkgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspICAgICAgIFwKKyAgICAgICAgICAgIGJ1ZltqXSA9IHJuZCgpICYgMHhGRkZGOyAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgY2hlY2tfYWRkX2ludDE2KEh1ZmZZVVZEU1BDb250ZXh0IGMsIHVuc2lnbmVkIG1hc2ssIGludCB3aWR0aCwgY29uc3QgY2hhciAqIG5hbWUpCit7CisgICAgdWludDE2X3QgKnNyYzAgPSBhdl9tYWxsb2N6KHdpZHRoICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgdWludDE2X3QgKnNyYzEgPSBhdl9tYWxsb2N6KHdpZHRoICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgdWludDE2X3QgKmRzdDAgPSBhdl9tYWxsb2N6KHdpZHRoICogc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgdWludDE2X3QgKmRzdDEgPSBhdl9tYWxsb2N6KHdpZHRoICogc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgICBkZWNsYXJlX2Z1bmNfZW1tcyhBVl9DUFVfRkxBR19NTVgsIHZvaWQsIHVpbnQxNl90ICpkc3QsIHVpbnQxNl90ICpzcmMsIHVuc2lnbmVkIG1hc2ssIGludCB3KTsKKworICAgIGlmICghc3JjMCB8fCAhc3JjMSB8fCAhZHN0MCB8fCAhZHN0MSkKKyAgICAgICAgZmFpbCgpOworCisgICAgcmFuZG9taXplX2J1ZmZlcnMoc3JjMCwgd2lkdGgpOworICAgIG1lbWNweShzcmMxLCBzcmMwLCB3aWR0aCAqIHNpemVvZih1aW50MTZfdCkpOworCisgICAgaWYgKGNoZWNrX2Z1bmMoYy5hZGRfaW50MTYsICIlcyIsIG5hbWUpKSB7CisgICAgICAgIGNhbGxfcmVmKGRzdDAsIHNyYzAsIG1hc2ssIHdpZHRoKTsKKyAgICAgICAgY2FsbF9uZXcoZHN0MSwgc3JjMSwgbWFzaywgd2lkdGgpOworICAgICAgICBpZiAobWVtY21wKGRzdDAsIGRzdDEsIHdpZHRoICogc2l6ZW9mKHVpbnQxNl90KSkpCisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIGJlbmNoX25ldyhkc3QxLCBzcmMxLCBtYXNrLCB3aWR0aCk7CisgICAgfQorCisgICAgYXZfZnJlZShzcmMwKTsKKyAgICBhdl9mcmVlKHNyYzEpOworICAgIGF2X2ZyZWUoZHN0MCk7CisgICAgYXZfZnJlZShkc3QxKTsKK30KKwordm9pZCBjaGVja2FzbV9jaGVja19odWZmeXV2ZHNwKHZvaWQpCit7CisgICAgSHVmZllVVkRTUENvbnRleHQgYzsKKyAgICBpbnQgd2lkdGggPSAxNiAqIGF2X2NsaXAocm5kKCksIDE2LCAxMjgpOworCisgICAgZmZfaHVmZnl1dmRzcF9pbml0KCZjLCBBVl9QSVhfRk1UX1lVVjQyMlApOworCisgICAgLyohIHRlc3Qgd2lkdGggbm90IG11bHRpcGxlIG9mIG1tc2l6ZSAqLworICAgIGNoZWNrX2FkZF9pbnQxNihjLCA2NTUzNSwgd2lkdGgsICJhZGRfaW50MTZfcm5kX3dpZHRoIik7CisgICAgcmVwb3J0KCJhZGRfaW50MTZfcm5kX3dpZHRoIik7CisKKyAgICAvKiEgdGVzdCBhbHdheXMgd2l0aCB0aGUgc2FtZSBzaXplIChmb3IgcGVyZiB0ZXN0KSAqLworICAgIGNoZWNrX2FkZF9pbnQxNihjLCA2NTUzNSwgMTYqMTI4LCAiYWRkX2ludDE2XzEyOCIpOworICAgIHJlcG9ydCgiYWRkX2ludDE2XzEyOCIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vanBlZzIwMDBkc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL2pwZWcyMDAwZHNwLmMKaW5kZXggNDg1NTlkZi4uYmNlNTM0ZCAxMDA2NDQKLS0tIGEvdGVzdHMvY2hlY2thc20vanBlZzIwMDBkc3AuYworKysgYi90ZXN0cy9jaGVja2FzbS9qcGVnMjAwMGRzcC5jCkBAIC0yOSw0MyArMjksNzUgQEAKICNkZWZpbmUgcmFuZG9taXplX2J1ZmZlcnMoKSAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IEJVRl9TSVpFOyBpICs9IDQpIHsgXAotICAgICAgICAgICAgdWludDMyX3QgciA9IHJuZCgpOyAgICAgICAgICAgICBcCi0gICAgICAgICAgICBBVl9XTjMyQShyZWYwICsgaSwgcik7ICAgICAgICAgIFwKLSAgICAgICAgICAgIEFWX1dOMzJBKG5ldzAgKyBpLCByKTsgICAgICAgICAgXAotICAgICAgICAgICAgciA9IHJuZCgpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBBVl9XTjMyQShyZWYxICsgaSwgcik7ICAgICAgICAgIFwKLSAgICAgICAgICAgIEFWX1dOMzJBKG5ldzEgKyBpLCByKTsgICAgICAgICAgXAotICAgICAgICAgICAgciA9IHJuZCgpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBBVl9XTjMyQShyZWYyICsgaSwgcik7ICAgICAgICAgIFwKLSAgICAgICAgICAgIEFWX1dOMzJBKG5ldzIgKyBpLCByKTsgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBCVUZfU0laRSozOyBpKyspICAgIFwKKyAgICAgICAgICAgIHNyY1tpXSA9IHJuZCgpOyAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLXN0YXRpYyB2b2lkIGNoZWNrX21jdCh1aW50OF90ICpyZWYwLCB1aW50OF90ICpyZWYxLCB1aW50OF90ICpyZWYyLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKm5ldzAsIHVpbnQ4X3QgKm5ldzEsIHVpbnQ4X3QgKm5ldzIpIHsKKyNkZWZpbmUgcmFuZG9taXplX2J1ZmZlcnNfZmxvYXQoKSAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IEJVRl9TSVpFKjM7IGkrKykgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3JjW2ldID0gKGZsb2F0KXJuZCgpIC8gKFVJTlRfTUFYID4+IDUpOyBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgY2hlY2tfcmN0X2ludCh2b2lkKQoreworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MzJfdCwgc3JjLCBbQlVGX1NJWkUqM10pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MzJfdCwgcmVmLCBbQlVGX1NJWkUqM10pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MzJfdCwgbmV3LCBbQlVGX1NJWkUqM10pOworICAgIGludDMyX3QgKnJlZjAgPSAmcmVmW0JVRl9TSVpFKjBdLCAqbmV3MCA9ICZuZXdbQlVGX1NJWkUqMF07CisgICAgaW50MzJfdCAqcmVmMSA9ICZyZWZbQlVGX1NJWkUqMV0sICpuZXcxID0gJm5ld1tCVUZfU0laRSoxXTsKKyAgICBpbnQzMl90ICpyZWYyID0gJnJlZltCVUZfU0laRSoyXSwgKm5ldzIgPSAmbmV3W0JVRl9TSVpFKjJdOworCiAgICAgZGVjbGFyZV9mdW5jKHZvaWQsIHZvaWQgKnNyYzAsIHZvaWQgKnNyYzEsIHZvaWQgKnNyYzIsIGludCBjc2l6ZSk7CiAKICAgICByYW5kb21pemVfYnVmZmVycygpOwotICAgIGNhbGxfcmVmKHJlZjAsIHJlZjEsIHJlZjIsIEJVRl9TSVpFIC8gc2l6ZW9mKGludDMyX3QpKTsKLSAgICBjYWxsX25ldyhuZXcwLCBuZXcxLCBuZXcyLCBCVUZfU0laRSAvIHNpemVvZihpbnQzMl90KSk7Ci0gICAgaWYgKG1lbWNtcChyZWYwLCBuZXcwLCBCVUZfU0laRSkgfHwgbWVtY21wKHJlZjEsIG5ldzEsIEJVRl9TSVpFKSB8fAotICAgICAgICBtZW1jbXAocmVmMiwgbmV3MiwgQlVGX1NJWkUpKQorICAgIG1lbWNweShyZWYsIHNyYywgQlVGX1NJWkUgKiAzICogc2l6ZW9mKCpzcmMpKTsKKyAgICBtZW1jcHkobmV3LCBzcmMsIEJVRl9TSVpFICogMyAqIHNpemVvZigqc3JjKSk7CisgICAgY2FsbF9yZWYocmVmMCwgcmVmMSwgcmVmMiwgQlVGX1NJWkUpOworICAgIGNhbGxfbmV3KG5ldzAsIG5ldzEsIG5ldzIsIEJVRl9TSVpFKTsKKyAgICBpZiAobWVtY21wKHJlZjAsIG5ldzAsIEJVRl9TSVpFICogc2l6ZW9mKCpzcmMpKSB8fAorICAgICAgICBtZW1jbXAocmVmMSwgbmV3MSwgQlVGX1NJWkUgKiBzaXplb2YoKnNyYykpIHx8CisgICAgICAgIG1lbWNtcChyZWYyLCBuZXcyLCBCVUZfU0laRSAqIHNpemVvZigqc3JjKSkpCiAgICAgICAgIGZhaWwoKTsKLSAgICBiZW5jaF9uZXcobmV3MCwgbmV3MSwgbmV3MiwgQlVGX1NJWkUgLyBzaXplb2YoaW50MzJfdCkpOworICAgIG1lbWNweShuZXcsIHNyYywgQlVGX1NJWkUgKiAzICogc2l6ZW9mKCpzcmMpKTsKKyAgICBiZW5jaF9uZXcobmV3MCwgbmV3MSwgbmV3MiwgQlVGX1NJWkUpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19pY3RfZmxvYXQodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzMyKGZsb2F0LCBzcmMsIFtCVUZfU0laRSozXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihmbG9hdCwgcmVmLCBbQlVGX1NJWkUqM10pOworICAgIExPQ0FMX0FMSUdORURfMzIoZmxvYXQsIG5ldywgW0JVRl9TSVpFKjNdKTsKKyAgICBmbG9hdCAqcmVmMCA9ICZyZWZbQlVGX1NJWkUqMF0sICpuZXcwID0gJm5ld1tCVUZfU0laRSowXTsKKyAgICBmbG9hdCAqcmVmMSA9ICZyZWZbQlVGX1NJWkUqMV0sICpuZXcxID0gJm5ld1tCVUZfU0laRSoxXTsKKyAgICBmbG9hdCAqcmVmMiA9ICZyZWZbQlVGX1NJWkUqMl0sICpuZXcyID0gJm5ld1tCVUZfU0laRSoyXTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCB2b2lkICpzcmMwLCB2b2lkICpzcmMxLCB2b2lkICpzcmMyLCBpbnQgY3NpemUpOworCisgICAgcmFuZG9taXplX2J1ZmZlcnNfZmxvYXQoKTsKKyAgICBtZW1jcHkocmVmLCBzcmMsIEJVRl9TSVpFICogMyAqIHNpemVvZigqc3JjKSk7CisgICAgbWVtY3B5KG5ldywgc3JjLCBCVUZfU0laRSAqIDMgKiBzaXplb2YoKnNyYykpOworICAgIGNhbGxfcmVmKHJlZjAsIHJlZjEsIHJlZjIsIEJVRl9TSVpFKTsKKyAgICBjYWxsX25ldyhuZXcwLCBuZXcxLCBuZXcyLCBCVUZfU0laRSk7CisgICAgaWYgKCFmbG9hdF9uZWFyX2Fic19lcHNfYXJyYXkocmVmMCwgbmV3MCwgMS4wZS01LCBCVUZfU0laRSkgfHwKKyAgICAgICAgIWZsb2F0X25lYXJfYWJzX2Vwc19hcnJheShyZWYxLCBuZXcxLCAxLjBlLTUsIEJVRl9TSVpFKSB8fAorICAgICAgICAhZmxvYXRfbmVhcl9hYnNfZXBzX2FycmF5KHJlZjIsIG5ldzIsIDEuMGUtNSwgQlVGX1NJWkUpKQorICAgICAgICBmYWlsKCk7CisgICAgbWVtY3B5KG5ldywgc3JjLCBCVUZfU0laRSAqIDMgKiBzaXplb2YoKnNyYykpOworICAgIGJlbmNoX25ldyhuZXcwLCBuZXcxLCBuZXcyLCBCVUZfU0laRSk7CiB9CiAKIHZvaWQgY2hlY2thc21fY2hlY2tfanBlZzIwMDBkc3Aodm9pZCkKIHsKLSAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIHJlZiwgW0JVRl9TSVpFKjNdKTsKLSAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIG5ldywgW0JVRl9TSVpFKjNdKTsKICAgICBKcGVnMjAwMERTUENvbnRleHQgaDsKIAogICAgIGZmX2pwZWcyMDAwZHNwX2luaXQoJmgpOwogCiAgICAgaWYgKGNoZWNrX2Z1bmMoaC5tY3RfZGVjb2RlW0ZGX0RXVDUzXSwgImpwZWcyMDAwX3JjdF9pbnQiKSkKLSAgICAgICAgY2hlY2tfbWN0KCZyZWZbQlVGX1NJWkUqMF0sICZyZWZbQlVGX1NJWkUqMV0sICZyZWZbQlVGX1NJWkUqMl0sCi0gICAgICAgICAgICAgICAgICAmbmV3W0JVRl9TSVpFKjBdLCAmbmV3W0JVRl9TSVpFKjFdLCAmbmV3W0JVRl9TSVpFKjJdKTsKKyAgICAgICAgY2hlY2tfcmN0X2ludCgpOworICAgIGlmIChjaGVja19mdW5jKGgubWN0X2RlY29kZVtGRl9EV1Q5N10sICJqcGVnMjAwMF9pY3RfZmxvYXQiKSkKKyAgICAgICAgY2hlY2tfaWN0X2Zsb2F0KCk7CiAKICAgICByZXBvcnQoIm1jdF9kZWNvZGUiKTsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL2xsdmlkZHNwLmMgYi90ZXN0cy9jaGVja2FzbS9sbHZpZGRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNzVmZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2FzbS9sbHZpZGRzcC5jCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2IEFsZXhhbmRyYSBIw6Fqa292w6EKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9tZW0uaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvbG9zc2xlc3NfdmlkZW9kc3AuaCIKKworI2luY2x1ZGUgImNoZWNrYXNtLmgiCisKKyNkZWZpbmUgcmFuZG9taXplX2J1ZmZlcnMoYnVmLCBzaXplKSAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDhfdCAqdG1wX2J1ZiA9ICh1aW50OF90ICopYnVmO1wKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgICAgICAgXAorICAgICAgICAgICAgdG1wX2J1ZltqXSA9IHJuZCgpICYgMHhGRjsgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgaW5pdF9idWZmZXIoYTAsIGExLCB0eXBlLCB3aWR0aClcCisgICAgaWYgKCFhMCB8fCAhYTEpXAorICAgICAgICBmYWlsKCk7XAorICAgIHJhbmRvbWl6ZV9idWZmZXJzKGEwLCB3aWR0aCAqIHNpemVvZih0eXBlKSk7XAorICAgIG1lbWNweShhMSwgYTAsIHdpZHRoKnNpemVvZih0eXBlKSk7XAorCitzdGF0aWMgdm9pZCBjaGVja19hZGRfYnl0ZXMoTExWaWREU1BDb250ZXh0IGMsIGludCB3aWR0aCkKK3sKKyAgICB1aW50OF90ICpkc3QwID0gYXZfbWFsbG9jeih3aWR0aCk7CisgICAgdWludDhfdCAqZHN0MSA9IGF2X21hbGxvY3ood2lkdGgpOworICAgIHVpbnQ4X3QgKnNyYzAgPSBhdl9tYWxsb2N6X2FycmF5KHdpZHRoLCBzaXplb2YodWludDhfdCkpOworICAgIHVpbnQ4X3QgKnNyYzEgPSBhdl9tYWxsb2N6X2FycmF5KHdpZHRoLCBzaXplb2YodWludDhfdCkpOworICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgdm9pZCwgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsIHB0cmRpZmZfdCB3KTsKKworICAgIGluaXRfYnVmZmVyKHNyYzAsIHNyYzEsIHVpbnQ4X3QsIHdpZHRoKTsKKworICAgIGlmICghZHN0MCB8fCAhZHN0MSkKKyAgICAgICAgZmFpbCgpOworCisKKyAgICBpZiAoY2hlY2tfZnVuYyhjLmFkZF9ieXRlcywgImFkZF9ieXRlcyIpKSB7CisgICAgICAgIGNhbGxfcmVmKGRzdDAsIHNyYzAsIHdpZHRoKTsKKyAgICAgICAgY2FsbF9uZXcoZHN0MSwgc3JjMSwgd2lkdGgpOworICAgICAgICBpZiAobWVtY21wKGRzdDAsIGRzdDEsIHdpZHRoKSkKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgYmVuY2hfbmV3KGRzdDEsIHNyYzEsIHdpZHRoKTsKKyAgICB9CisKKyAgICBhdl9mcmVlKHNyYzApOworICAgIGF2X2ZyZWUoc3JjMSk7CisgICAgYXZfZnJlZShkc3QwKTsKKyAgICBhdl9mcmVlKGRzdDEpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19hZGRfbWVkaWFuX3ByZWQoTExWaWREU1BDb250ZXh0IGMsIGludCB3aWR0aCkgeworICAgIGludCBBMCwgQTEsIEIwLCBCMTsKKyAgICB1aW50OF90ICpkc3QwID0gYXZfbWFsbG9jeih3aWR0aCk7CisgICAgdWludDhfdCAqZHN0MSA9IGF2X21hbGxvY3ood2lkdGgpOworICAgIHVpbnQ4X3QgKnNyYzAgPSBhdl9tYWxsb2N6X2FycmF5KHdpZHRoLCBzaXplb2YodWludDhfdCkpOworICAgIHVpbnQ4X3QgKnNyYzEgPSBhdl9tYWxsb2N6X2FycmF5KHdpZHRoLCBzaXplb2YodWludDhfdCkpOworICAgIHVpbnQ4X3QgKmRpZmYwID0gYXZfbWFsbG9jel9hcnJheSh3aWR0aCwgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICB1aW50OF90ICpkaWZmMSA9IGF2X21hbGxvY3pfYXJyYXkod2lkdGgsIHNpemVvZih1aW50OF90KSk7CisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGlmZiwgcHRyZGlmZl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpsZWZ0LCBpbnQgKmxlZnRfdG9wKTsKKworICAgIGluaXRfYnVmZmVyKHNyYzAsIHNyYzEsIHVpbnQ4X3QsIHdpZHRoKTsKKyAgICBpbml0X2J1ZmZlcihkaWZmMCwgZGlmZjEsIHVpbnQ4X3QsIHdpZHRoKTsKKworICAgIEEwID0gcm5kKCkgJiAweEZGOworICAgIEIwID0gcm5kKCkgJiAweEZGOworICAgIEExID0gQTA7CisgICAgQjEgPSBCMDsKKworCisgICAgaWYgKGNoZWNrX2Z1bmMoYy5hZGRfbWVkaWFuX3ByZWQsICJhZGRfbWVkaWFuX3ByZWQiKSkgeworICAgICAgICBjYWxsX3JlZihkc3QwLCBzcmMwLCBkaWZmMCwgd2lkdGgsICZBMCwgJkIwKTsKKyAgICAgICAgY2FsbF9uZXcoZHN0MSwgc3JjMSwgZGlmZjEsIHdpZHRoLCAmQTEsICZCMSk7CisgICAgICAgIGlmIChtZW1jbXAoZHN0MCwgZHN0MSwgd2lkdGgpIHx8IChBMCAhPSBBMSkgfHwgKEIwICE9IEIxKSkKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgYmVuY2hfbmV3KGRzdDEsIHNyYzEsIGRpZmYxLCB3aWR0aCwgJkExLCAmQjEpOworICAgIH0KKworICAgIGF2X2ZyZWUoc3JjMCk7CisgICAgYXZfZnJlZShzcmMxKTsKKyAgICBhdl9mcmVlKGRpZmYwKTsKKyAgICBhdl9mcmVlKGRpZmYxKTsKKyAgICBhdl9mcmVlKGRzdDApOworICAgIGF2X2ZyZWUoZHN0MSk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2FkZF9sZWZ0X3ByZWQoTExWaWREU1BDb250ZXh0IGMsIGludCB3aWR0aCwgaW50IGFjYywgY29uc3QgY2hhciAqIHJlcG9ydCkKK3sKKyAgICBpbnQgcmVzMCwgcmVzMTsKKyAgICB1aW50OF90ICpkc3QwID0gYXZfbWFsbG9jeih3aWR0aCk7CisgICAgdWludDhfdCAqZHN0MSA9IGF2X21hbGxvY3ood2lkdGgpOworICAgIHVpbnQ4X3QgKnNyYzAgPSBhdl9tYWxsb2N6X2FycmF5KHdpZHRoLCBzaXplb2YodWludDhfdCkpOworICAgIHVpbnQ4X3QgKnNyYzEgPSBhdl9tYWxsb2N6X2FycmF5KHdpZHRoLCBzaXplb2YodWludDhfdCkpOworICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgaW50LCB1aW50OF90ICpkc3QsIHVpbnQ4X3QgKnNyYywgcHRyZGlmZl90IHcsIGludCBhY2MpOworCisgICAgaW5pdF9idWZmZXIoc3JjMCwgc3JjMSwgdWludDhfdCwgd2lkdGgpOworCisgICAgaWYgKCFkc3QwIHx8ICFkc3QxKQorICAgICAgICBmYWlsKCk7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhjLmFkZF9sZWZ0X3ByZWQsICIlcyIsIHJlcG9ydCkpIHsKKyAgICAgICAgcmVzMCA9IGNhbGxfcmVmKGRzdDAsIHNyYzAsIHdpZHRoLCBhY2MpOworICAgICAgICByZXMxID0gY2FsbF9uZXcoZHN0MSwgc3JjMSwgd2lkdGgsIGFjYyk7CisgICAgICAgIGlmICgocmVzMCAmIDB4RkYpICE9IChyZXMxICYgMHhGRil8fFwKKyAgICAgICAgICAgIG1lbWNtcChkc3QwLCBkc3QxLCB3aWR0aCkpCisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIGJlbmNoX25ldyhkc3QxLCBzcmMxLCB3aWR0aCwgYWNjKTsKKyAgICB9CisKKyAgICBhdl9mcmVlKHNyYzApOworICAgIGF2X2ZyZWUoc3JjMSk7CisgICAgYXZfZnJlZShkc3QwKTsKKyAgICBhdl9mcmVlKGRzdDEpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19hZGRfbGVmdF9wcmVkXzE2KExMVmlkRFNQQ29udGV4dCBjLCB1bnNpZ25lZCBtYXNrLCBpbnQgd2lkdGgsIHVuc2lnbmVkIGFjYywgY29uc3QgY2hhciAqIHJlcG9ydCkKK3sKKyAgICBpbnQgcmVzMCwgcmVzMTsKKyAgICB1aW50MTZfdCAqZHN0MCA9IGF2X21hbGxvY3pfYXJyYXkod2lkdGgsIHNpemVvZih1aW50MTZfdCkpOworICAgIHVpbnQxNl90ICpkc3QxID0gYXZfbWFsbG9jel9hcnJheSh3aWR0aCwgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgdWludDE2X3QgKnNyYzAgPSBhdl9tYWxsb2N6X2FycmF5KHdpZHRoLCBzaXplb2YodWludDE2X3QpKTsKKyAgICB1aW50MTZfdCAqc3JjMSA9IGF2X21hbGxvY3pfYXJyYXkod2lkdGgsIHNpemVvZih1aW50MTZfdCkpOworICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgaW50LCB1aW50MTZfdCAqZHN0LCB1aW50MTZfdCAqc3JjLCB1bnNpZ25lZCBtYXNrLCBwdHJkaWZmX3QgdywgdW5zaWduZWQgYWNjKTsKKworICAgIGluaXRfYnVmZmVyKHNyYzAsIHNyYzEsIHVpbnQxNl90LCB3aWR0aCk7CisKKyAgICBpZiAoIWRzdDAgfHwgIWRzdDEpCisgICAgICAgIGZhaWwoKTsKKworICAgIGlmIChjaGVja19mdW5jKGMuYWRkX2xlZnRfcHJlZF9pbnQxNiwgIiVzIiwgcmVwb3J0KSkgeworICAgICAgICByZXMwID0gY2FsbF9yZWYoZHN0MCwgc3JjMCwgbWFzaywgd2lkdGgsIGFjYyk7CisgICAgICAgIHJlczEgPSBjYWxsX25ldyhkc3QxLCBzcmMxLCBtYXNrLCB3aWR0aCwgYWNjKTsKKyAgICAgICAgaWYgKChyZXMwICYweEZGRkYpICE9IChyZXMxICYweEZGRkYpfHxcCisgICAgICAgICAgICBtZW1jbXAoZHN0MCwgZHN0MSwgd2lkdGgpKQorICAgICAgICAgICAgZmFpbCgpOworICAgICAgICBiZW5jaF9uZXcoZHN0MSwgc3JjMSwgbWFzaywgd2lkdGgsIGFjYyk7CisgICAgfQorCisgICAgYXZfZnJlZShzcmMwKTsKKyAgICBhdl9mcmVlKHNyYzEpOworICAgIGF2X2ZyZWUoZHN0MCk7CisgICAgYXZfZnJlZShkc3QxKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfYWRkX2dyYWRpZW50X3ByZWQoTExWaWREU1BDb250ZXh0IGMsIGludCB3KSB7CisgICAgaW50IHNyY19zaXplLCBzdHJpZGU7CisgICAgdWludDhfdCAqc3JjMCwgKnNyYzE7CisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICpzcmMsIGNvbnN0IHB0cmRpZmZfdCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRyZGlmZl90IHdpZHRoKTsKKworICAgIHN0cmlkZSA9IHcgKyAzMjsKKyAgICBzcmNfc2l6ZSA9IChzdHJpZGUgKyAzMikgKiAyOyAvKiBkc3AgbmVlZCBwcmV2aW91cyBsaW5lLCBhbmQgaWdub3JlIHRoZSBzdGFydCBvZiB0aGUgbGluZSAqLworICAgIHNyYzAgPSBhdl9tYWxsb2N6KHNyY19zaXplKTsKKyAgICBzcmMxID0gYXZfbWFsbG9jeihzcmNfc2l6ZSk7CisKKyAgICBpbml0X2J1ZmZlcihzcmMwLCBzcmMxLCB1aW50OF90LCBzcmNfc2l6ZSk7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhjLmFkZF9ncmFkaWVudF9wcmVkLCAiYWRkX2dyYWRpZW50X3ByZWQiKSkgeworICAgICAgICBjYWxsX3JlZihzcmMwICsgc3RyaWRlICsgMzIsIHN0cmlkZSwgdyk7CisgICAgICAgIGNhbGxfbmV3KHNyYzEgKyBzdHJpZGUgKyAzMiwgc3RyaWRlLCB3KTsKKyAgICAgICAgaWYgKG1lbWNtcChzcmMwLCBzcmMxLCBzdHJpZGUpfHwvKiBwcmV2aW91cyBsaW5lIGRvZXNuJ3QgY2hhbmdlICovCisgICAgICAgICAgICBtZW1jbXAoc3JjMCtzdHJpZGUsIHNyYzEgKyBzdHJpZGUsIHcgKyAzMikpIHsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgICAgICBiZW5jaF9uZXcoc3JjMSArIHN0cmlkZSArIDMyLCBzdHJpZGUsIHcpOworICAgIH0KKworICAgIGF2X2ZyZWUoc3JjMCk7CisgICAgYXZfZnJlZShzcmMxKTsKK30KKwordm9pZCBjaGVja2FzbV9jaGVja19sbHZpZGRzcCh2b2lkKQoreworICAgIExMVmlkRFNQQ29udGV4dCBjOworICAgIGludCB3aWR0aCA9IDE2ICogYXZfY2xpcChybmQoKSwgMTYsIDEyOCk7CisgICAgaW50IGFjY1JuZCA9IHJuZCgpICYgMHhGRjsKKworICAgIGZmX2xsdmlkZHNwX2luaXQoJmMpOworCisgICAgY2hlY2tfYWRkX2J5dGVzKGMsIHdpZHRoKTsKKyAgICByZXBvcnQoImFkZF9ieXRlcyIpOworCisgICAgY2hlY2tfYWRkX21lZGlhbl9wcmVkKGMsIHdpZHRoKTsKKyAgICByZXBvcnQoImFkZF9tZWRpYW5fcHJlZCIpOworCisgICAgY2hlY2tfYWRkX2xlZnRfcHJlZChjLCB3aWR0aCwgMCwgImFkZF9sZWZ0X3ByZWRfemVybyIpOworICAgIHJlcG9ydCgiYWRkX2xlZnRfcHJlZF96ZXJvIik7CisKKyAgICBjaGVja19hZGRfbGVmdF9wcmVkKGMsIHdpZHRoLCBhY2NSbmQsICJhZGRfbGVmdF9wcmVkX3JuZF9hY2MiKTsKKyAgICByZXBvcnQoImFkZF9sZWZ0X3ByZWRfcm5kX2FjYyIpOworCisgICAgY2hlY2tfYWRkX2xlZnRfcHJlZF8xNihjLCAyNTUsIHdpZHRoLCBhY2NSbmQsICJhZGRfbGVmdF9wcmVkX2ludDE2Iik7CisgICAgcmVwb3J0KCJhZGRfbGVmdF9wcmVkX2ludDE2Iik7CisKKyAgICBjaGVja19hZGRfZ3JhZGllbnRfcHJlZChjLCB3aWR0aCk7CisgICAgcmVwb3J0KCJhZGRfZ3JhZGllbnRfcHJlZCIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vbGx2aWRkc3BlbmMuYyBiL3Rlc3RzL2NoZWNrYXNtL2xsdmlkZHNwZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlYWZkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL2xsdmlkZHNwZW5jLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQWxleGFuZHJhIEjDoWprb3bDoQorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2dXRpbC9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvaW50cmVhZHdyaXRlLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL21lbS5oIgorCisjaW5jbHVkZSAibGliYXZjb2RlYy9sb3NzbGVzc192aWRlb2VuY2RzcC5oIgorCisjaW5jbHVkZSAiY2hlY2thc20uaCIKKworI2RlZmluZSByYW5kb21pemVfYnVmZmVycyhidWYsIHNpemUpICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgais9NCkgICAgICAgXAorICAgICAgICAgICAgQVZfV04zMihidWYgKyBqLCBybmQoKSk7ICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qge3VpbnQ4X3QgdywgaCwgczt9IHBsYW5lc1tdID0geworICAgIHsxNiwxNiwxNn0sIHsyMSwyMywyNX0sIHszMiwxNyw0OH0sIHsxNSwxMjgsMTZ9LCB7MTI4LDEyNywxMjh9Cit9OworCisjZGVmaW5lIE1BWF9TVFJJREUgMTI4CisjZGVmaW5lIE1BWF9IRUlHSFQgMTI3CisKK3N0YXRpYyB2b2lkIGNoZWNrX2RpZmZfYnl0ZXMoTExWaWRFbmNEU1BDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0MCwgW01BWF9TVFJJREVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdDEsIFtNQVhfU1RSSURFXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBzcmMwLCBbTUFYX1NUUklERV0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgc3JjMSwgW01BWF9TVFJJREVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIHNyYzIsIFtNQVhfU1RSSURFXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBzcmMzLCBbTUFYX1NUUklERV0pOworCisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjMiwgaW50cHRyX3Qgdyk7CisKKyAgICBtZW1zZXQoZHN0MCwgMCwgTUFYX1NUUklERSk7CisgICAgbWVtc2V0KGRzdDEsIDAsIE1BWF9TVFJJREUpOworICAgIHJhbmRvbWl6ZV9idWZmZXJzKHNyYzAsIE1BWF9TVFJJREUpOworICAgIG1lbWNweShzcmMxLCBzcmMwLCBNQVhfU1RSSURFKTsKKyAgICByYW5kb21pemVfYnVmZmVycyhzcmMyLCBNQVhfU1RSSURFKTsKKyAgICBtZW1jcHkoc3JjMywgc3JjMiwgTUFYX1NUUklERSk7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhjLT5kaWZmX2J5dGVzLCAiZGlmZl9ieXRlcyIpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpICsrKSB7CisgICAgICAgICAgICBjYWxsX3JlZihkc3QwLCBzcmMwLCBzcmMyLCBwbGFuZXNbaV0udyk7CisgICAgICAgICAgICBjYWxsX25ldyhkc3QxLCBzcmMxLCBzcmMzLCBwbGFuZXNbaV0udyk7CisgICAgICAgICAgICBpZiAobWVtY21wKGRzdDAsIGRzdDEsIHBsYW5lc1tpXS53KSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgYmVuY2hfbmV3KGRzdDEsIHNyYzAsIHNyYzIsIHBsYW5lc1s0XS53KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N1Yl9sZWZ0X3ByZWQoTExWaWRFbmNEU1BDb250ZXh0ICpjKQoreworICAgIGludCBpOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0MCwgW01BWF9TVFJJREUgKiBNQVhfSEVJR0hUXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBkc3QxLCBbTUFYX1NUUklERSAqIE1BWF9IRUlHSFRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIHNyYzAsIFtNQVhfU1RSSURFICogTUFYX0hFSUdIVF0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgc3JjMSwgW01BWF9TVFJJREUgKiBNQVhfSEVJR0hUXSk7CisKKyAgICBkZWNsYXJlX2Z1bmNfZW1tcyhBVl9DUFVfRkxBR19NTVgsIHZvaWQsIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzdHJpZGUsIHB0cmRpZmZfdCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICBtZW1zZXQoZHN0MCwgMCwgTUFYX1NUUklERSAqIE1BWF9IRUlHSFQpOworICAgIG1lbXNldChkc3QxLCAwLCBNQVhfU1RSSURFICogTUFYX0hFSUdIVCk7CisgICAgcmFuZG9taXplX2J1ZmZlcnMoc3JjMCwgTUFYX1NUUklERSAqIE1BWF9IRUlHSFQpOworICAgIG1lbWNweShzcmMxLCBzcmMwLCBNQVhfU1RSSURFICogTUFYX0hFSUdIVCk7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhjLT5zdWJfbGVmdF9wcmVkaWN0LCAic3ViX2xlZnRfcHJlZGljdCIpKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCA1OyBpICsrKSB7CisgICAgICAgICAgICBjYWxsX3JlZihkc3QwLCBzcmMwLCBwbGFuZXNbaV0ucywgcGxhbmVzW2ldLncsIHBsYW5lc1tpXS5oKTsKKyAgICAgICAgICAgIGNhbGxfbmV3KGRzdDEsIHNyYzEsIHBsYW5lc1tpXS5zLCBwbGFuZXNbaV0udywgcGxhbmVzW2ldLmgpOworICAgICAgICAgICAgaWYgKG1lbWNtcChkc3QwLCBkc3QxLCBwbGFuZXNbaV0udyAqIHBsYW5lc1tpXS5oKSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBiZW5jaF9uZXcoZHN0MSwgc3JjMCwgcGxhbmVzWzRdLnMsIHBsYW5lc1s0XS53LCBwbGFuZXNbNF0uaCk7CisgICAgfQorfQorCit2b2lkIGNoZWNrYXNtX2NoZWNrX2xsdmlkZHNwZW5jKHZvaWQpCit7CisgICAgTExWaWRFbmNEU1BDb250ZXh0IGM7CisgICAgZmZfbGx2aWRlbmNkc3BfaW5pdCgmYyk7CisKKyAgICBjaGVja19kaWZmX2J5dGVzKCZjKTsKKyAgICByZXBvcnQoImRpZmZfYnl0ZXMiKTsKKworICAgIGNoZWNrX3N1Yl9sZWZ0X3ByZWQoJmMpOworICAgIHJlcG9ydCgic3ViX2xlZnRfcHJlZGljdCIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vcGl4YmxvY2tkc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL3BpeGJsb2NrZHNwLmMKaW5kZXggNjZiZmRiNy4uZTE0YjBhOSAxMDA2NDQKLS0tIGEvdGVzdHMvY2hlY2thc20vcGl4YmxvY2tkc3AuYworKysgYi90ZXN0cy9jaGVja2FzbS9waXhibG9ja2RzcC5jCkBAIC0yNiw3ICsyNiw3IEBACiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgogCiAjZGVmaW5lIEJVRl9VTklUUyA4Ci0jZGVmaW5lIEJVRl9TSVpFIChCVUZfVU5JVFMgKiAxMjggKyBCVUZfVU5JVFMpCisjZGVmaW5lIEJVRl9TSVpFIChCVUZfVU5JVFMgKiAxMjggKyA4ICogQlVGX1VOSVRTKQogCiAjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXJzKCkgICAgICAgICAgICAgICAgIFwKICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTAsNyArNTAsNyBAQAogICAgICAgICBkZWNsYXJlX2Z1bmNfZW1tcyhBVl9DUFVfRkxBR19NTVgsIHZvaWQsIGludDE2X3QgKmJsb2NrLCBjb25zdCB1aW50OF90ICpwaXhlbHMsIHB0cmRpZmZfdCBsaW5lX3NpemUpOyAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQlVGX1VOSVRTOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaW50IHNyY19vZmZzZXQgPSBpICogNjQgKiBzaXplb2YodHlwZSkgKyBpOyAvKiBUZXN0IHZhcmlvdXMgYWxpZ25tZW50cyAqLyAgICAgIFwKKyAgICAgICAgICAgIGludCBzcmNfb2Zmc2V0ID0gaSAqIDY0ICogc2l6ZW9mKHR5cGUpICsgOCAqIGk7IC8qIFRlc3QgdmFyaW91cyBhbGlnbm1lbnRzICovICAgICAgXAogICAgICAgICAgICAgaW50IGRzdF9vZmZzZXQgPSBpICogNjQ7IC8qIGRzdCBtdXN0IGJlIGFsaWduZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBjYWxsX3JlZihkc3QwICsgZHN0X29mZnNldCwgc3JjMTAgKyBzcmNfb2Zmc2V0LCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjQsMTAgKzY0LDEwIEBACiAjZGVmaW5lIGNoZWNrX2RpZmZfcGl4ZWxzKHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgdm9pZCwgaW50MTZfdCAqYXZfcmVzdHJpY3QgYmxvY2ssIGNvbnN0IHVpbnQ4X3QgKnMxLCBjb25zdCB1aW50OF90ICpzMiwgaW50IHN0cmlkZSk7IFwKKyAgICAgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCBpbnQxNl90ICphdl9yZXN0cmljdCBibG9jaywgY29uc3QgdWludDhfdCAqczEsIGNvbnN0IHVpbnQ4X3QgKnMyLCBwdHJkaWZmX3Qgc3RyaWRlKTsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZm9yIChpID0gMDsgaSA8IEJVRl9VTklUUzsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGludCBzcmNfb2Zmc2V0ID0gaSAqIDY0ICogc2l6ZW9mKHR5cGUpICsgaTsgLyogVGVzdCB2YXJpb3VzIGFsaWdubWVudHMgKi8gICAgICBcCisgICAgICAgICAgICBpbnQgc3JjX29mZnNldCA9IGkgKiA2NCAqIHNpemVvZih0eXBlKSArIDggKiBpOyAvKiBUZXN0IHZhcmlvdXMgYWxpZ25tZW50cyAqLyAgICAgIFwKICAgICAgICAgICAgIGludCBkc3Rfb2Zmc2V0ID0gaSAqIDY0OyAvKiBkc3QgbXVzdCBiZSBhbGlnbmVkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICByYW5kb21pemVfYnVmZmVycygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgY2FsbF9yZWYoZHN0MCArIGRzdF9vZmZzZXQsIHNyYzEwICsgc3JjX29mZnNldCwgc3JjMjAgKyBzcmNfb2Zmc2V0LCA4KTsgICAgICAgIFwKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL3NicmRzcC5jIGIvdGVzdHMvY2hlY2thc20vc2JyZHNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU4ZjQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL3NicmRzcC5jCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvc2JyZHNwLmgiCisKKyNpbmNsdWRlICJjaGVja2FzbS5oIgorCisjZGVmaW5lIHJhbmRvbWl6ZShidWYsIGxlbikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IElOVEZMT0FUIGYgPSAoSU5URkxPQVQpcm5kKCkgLyBVSU5UX01BWDsgICAgICAgICAgXAorICAgICAgICAoYnVmKVtpXSA9IGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEVQUyAwLjAwMDEKKworc3RhdGljIHZvaWQgdGVzdF9zdW02NHg1KHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MCwgWzY0ICsgMjU2XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MSwgWzY0ICsgMjU2XSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgSU5URkxPQVQgKnopOworCisgICAgcmFuZG9taXplKChJTlRGTE9BVCAqKWRzdDAsIDY0ICsgMjU2KTsKKyAgICBtZW1jcHkoZHN0MSwgZHN0MCwgKDY0ICsgMjU2KSAqIHNpemVvZihJTlRGTE9BVCkpOworICAgIGNhbGxfcmVmKGRzdDApOworICAgIGNhbGxfbmV3KGRzdDEpOworICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzX2FycmF5KGRzdDAsIGRzdDEsIEVQUywgNjQgKyAyNTYpKQorICAgICAgICBmYWlsKCk7CisgICAgYmVuY2hfbmV3KGRzdDEpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3N1bV9zcXVhcmUodm9pZCkKK3sKKyAgICBJTlRGTE9BVCByZXMwOworICAgIElOVEZMT0FUIHJlczE7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgc3JjLCBbMjU2XSwgWzJdKTsKKworICAgIGRlY2xhcmVfZnVuY19mbG9hdChJTlRGTE9BVCwgSU5URkxPQVQgKCp4KVsyXSwgaW50IG4pOworCisgICAgcmFuZG9taXplKChJTlRGTE9BVCAqKXNyYywgMjU2ICogMik7CisgICAgcmVzMCA9IGNhbGxfcmVmKHNyYywgMjU2KTsKKyAgICByZXMxID0gY2FsbF9uZXcoc3JjLCAyNTYpOworICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzKHJlczAsIHJlczEsIEVQUykpCisgICAgICAgIGZhaWwoKTsKKyAgICBiZW5jaF9uZXcoc3JjLCAyNTYpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X25lZ19vZGRfNjQodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QwLCBbNjRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QxLCBbNjRdKTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBJTlRGTE9BVCAqeCk7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopZHN0MCwgNjQpOworICAgIG1lbWNweShkc3QxLCBkc3QwLCAoNjQpICogc2l6ZW9mKElOVEZMT0FUKSk7CisgICAgY2FsbF9yZWYoZHN0MCk7CisgICAgY2FsbF9uZXcoZHN0MSk7CisgICAgaWYgKCFmbG9hdF9uZWFyX2Fic19lcHNfYXJyYXkoZHN0MCwgZHN0MSwgRVBTLCA2NCkpCisgICAgICAgIGZhaWwoKTsKKyAgICBiZW5jaF9uZXcoZHN0MSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcW1mX3ByZV9zaHVmZmxlKHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MCwgWzEyOF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGRzdDEsIFsxMjhdKTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBJTlRGTE9BVCAqeik7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopZHN0MCwgMTI4KTsKKyAgICBtZW1jcHkoZHN0MSwgZHN0MCwgKDEyOCkgKiBzaXplb2YoSU5URkxPQVQpKTsKKyAgICBjYWxsX3JlZihkc3QwKTsKKyAgICBjYWxsX25ldyhkc3QxKTsKKyAgICBpZiAoIWZsb2F0X25lYXJfYWJzX2Vwc19hcnJheShkc3QwLCBkc3QxLCBFUFMsIDEyOCkpCisgICAgICAgIGZhaWwoKTsKKyAgICBiZW5jaF9uZXcoZHN0MSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcW1mX3Bvc3Rfc2h1ZmZsZSh2b2lkKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIHNyYywgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MCwgWzMyXSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QxLCBbMzJdLCBbMl0pOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIElOVEZMT0FUIFdbMzJdWzJdLCBjb25zdCBJTlRGTE9BVCAqeik7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopc3JjLCA2NCk7CisgICAgY2FsbF9yZWYoZHN0MCwgc3JjKTsKKyAgICBjYWxsX25ldyhkc3QxLCBzcmMpOworICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzX2FycmF5KChJTlRGTE9BVCAqKWRzdDAsIChJTlRGTE9BVCAqKWRzdDEsIEVQUywgNjQpKQorICAgICAgICBmYWlsKCk7CisgICAgYmVuY2hfbmV3KGRzdDEsIHNyYyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcW1mX2RlaW50X25lZyh2b2lkKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIHNyYywgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MCwgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MSwgWzY0XSk7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgSU5URkxPQVQgKnYsIGNvbnN0IElOVEZMT0FUICpzcmMpOworCisgICAgcmFuZG9taXplKChJTlRGTE9BVCAqKXNyYywgNjQpOworICAgIGNhbGxfcmVmKGRzdDAsIHNyYyk7CisgICAgY2FsbF9uZXcoZHN0MSwgc3JjKTsKKyAgICBpZiAoIWZsb2F0X25lYXJfYWJzX2Vwc19hcnJheShkc3QwLCBkc3QxLCBFUFMsIDY0KSkKKyAgICAgICAgZmFpbCgpOworICAgIGJlbmNoX25ldyhkc3QxLCBzcmMpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3FtZl9kZWludF9iZmx5KHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgc3JjMCwgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgc3JjMSwgWzY0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MCwgWzEyOF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGRzdDEsIFsxMjhdKTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBJTlRGTE9BVCAqdiwgY29uc3QgSU5URkxPQVQgKnNyYzAsIGNvbnN0IElOVEZMT0FUICpzcmMxKTsKKworICAgIG1lbXNldChkc3QwLCAwLCAxMjggKiBzaXplb2YoSU5URkxPQVQpKTsKKyAgICBtZW1zZXQoZHN0MSwgMCwgMTI4ICogc2l6ZW9mKElOVEZMT0FUKSk7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopc3JjMCwgNjQpOworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilzcmMxLCA2NCk7CisgICAgY2FsbF9yZWYoZHN0MCwgc3JjMCwgc3JjMSk7CisgICAgY2FsbF9uZXcoZHN0MSwgc3JjMCwgc3JjMSk7CisgICAgaWYgKCFmbG9hdF9uZWFyX2Fic19lcHNfYXJyYXkoZHN0MCwgZHN0MSwgRVBTLCAxMjgpKQorICAgICAgICBmYWlsKCk7CisgICAgYmVuY2hfbmV3KGRzdDEsIHNyYzAsIHNyYzEpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2F1dG9jb3JyZWxhdGUodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBzcmMsIFs0MF0sIFsyXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgZHN0MCwgWzNdLCBbMl1bMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGRzdDEsIFszXSwgWzJdWzJdKTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBjb25zdCBJTlRGTE9BVCB4WzQwXVsyXSwgSU5URkxPQVQgcGhpWzNdWzJdWzJdKTsKKworICAgIG1lbXNldChkc3QwLCAwLCAzICogMiAqIDIgKiBzaXplb2YoSU5URkxPQVQpKTsKKyAgICBtZW1zZXQoZHN0MSwgMCwgMyAqIDIgKiAyICogc2l6ZW9mKElOVEZMT0FUKSk7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopc3JjLCA4MCk7CisgICAgY2FsbF9yZWYoc3JjLCBkc3QwKTsKKyAgICBjYWxsX25ldyhzcmMsIGRzdDEpOworICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzX2FycmF5KChJTlRGTE9BVCAqKWRzdDAsIChJTlRGTE9BVCAqKWRzdDEsIEVQUywgMyAqIDIgKiAyKSkKKyAgICAgICAgZmFpbCgpOworICAgIGJlbmNoX25ldyhzcmMsIGRzdDEpOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2hmX2dlbih2b2lkKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGxvdywgWzEyOF0sIFsyXSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihJTlRGTE9BVCwgYWxwaGEwLCBbMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGFscGhhMSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QwLCBbMTI4XSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QxLCBbMTI4XSwgWzJdKTsKKyAgICBJTlRGTE9BVCBidyA9IChJTlRGTE9BVClybmQoKSAvIFVJTlRfTUFYOworICAgIGludCBpOworCisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIElOVEZMT0FUICgqWF9oaWdoKVsyXSwgY29uc3QgSU5URkxPQVQgKCpYX2xvdylbMl0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVEZMT0FUIGFscGhhMFsyXSwgY29uc3QgSU5URkxPQVQgYWxwaGExWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBJTlRGTE9BVCBidywgaW50IHN0YXJ0LCBpbnQgZW5kKTsKKworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilsb3csIDEyOCAqIDIpOworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilhbHBoYTAsIDIpOworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilhbHBoYTEsIDIpOworICAgIGZvciAoaSA9IDI7IGkgPCA2NDsgaSArPSAyKSB7CisgICAgICAgIG1lbXNldChkc3QwLCAwLCAxMjggKiAyICogc2l6ZW9mKElOVEZMT0FUKSk7CisgICAgICAgIG1lbXNldChkc3QxLCAwLCAxMjggKiAyICogc2l6ZW9mKElOVEZMT0FUKSk7CisgICAgICAgIGNhbGxfcmVmKGRzdDAsIGxvdywgYWxwaGEwLCBhbHBoYTEsIDAuMCwgaSwgMTI4KTsKKyAgICAgICAgY2FsbF9uZXcoZHN0MSwgbG93LCBhbHBoYTAsIGFscGhhMSwgMC4wLCBpLCAxMjgpOworICAgICAgICBpZiAoIWZsb2F0X25lYXJfYWJzX2Vwc19hcnJheSgoSU5URkxPQVQgKilkc3QwLCAoSU5URkxPQVQgKilkc3QxLCBFUFMsIDEyOCAqIDIpKQorICAgICAgICAgICAgZmFpbCgpOworICAgICAgICBiZW5jaF9uZXcoZHN0MSwgbG93LCBhbHBoYTAsIGFscGhhMSwgYncsIGksIDEyOCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2hmX2dfZmlsdCh2b2lkKQoreworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGhpZ2gsIFsxMjhdLCBbNDBdWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBnX2ZpbHQsIFsxMjhdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QwLCBbMTI4XSwgWzJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCBkc3QxLCBbMTI4XSwgWzJdKTsKKworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBJTlRGTE9BVCAoKlkpWzJdLCBjb25zdCBJTlRGTE9BVCAoKlhfaGlnaClbNDBdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlRGTE9BVCAqZ19maWx0LCBpbnQgbV9tYXgsIGludHB0cl90IGl4aCk7CisKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopaGlnaCwgMTI4ICogNDAgKiAyKTsKKyAgICByYW5kb21pemUoKElOVEZMT0FUICopZ19maWx0LCAxMjgpOworCisgICAgY2FsbF9yZWYoZHN0MCwgaGlnaCwgZ19maWx0LCAxMjgsIDIwKTsKKyAgICBjYWxsX25ldyhkc3QxLCBoaWdoLCBnX2ZpbHQsIDEyOCwgMjApOworICAgIGlmICghZmxvYXRfbmVhcl9hYnNfZXBzX2FycmF5KChJTlRGTE9BVCAqKWRzdDAsIChJTlRGTE9BVCAqKWRzdDEsIEVQUywgMTI4ICogMikpCisgICAgICAgIGZhaWwoKTsKKyAgICBiZW5jaF9uZXcoZHN0MSwgaGlnaCwgZ19maWx0LCAxMjgsIDIwKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9oZl9hcHBseV9ub2lzZShjb25zdCBTQlJEU1BDb250ZXh0ICpzYnJkc3ApCit7CisgICAgTE9DQUxfQUxJR05FRF8xNihBQUNfRkxPQVQsIHNfbSwgWzEyOF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoQUFDX0ZMT0FULCBxX2ZpbHQsIFsxMjhdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KElOVEZMT0FULCByZWYsIFsxMjhdLCBbMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGRzdDAsIFsxMjhdLCBbMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoSU5URkxPQVQsIGRzdDEsIFsxMjhdLCBbMl0pOworICAgIGludCBub2lzZSA9IDB4MmE7CisgICAgaW50IGksIGo7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgSU5URkxPQVQgKCpZKVsyXSwgY29uc3QgQUFDX0ZMT0FUICpzX20sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBQ19GTE9BVCAqcV9maWx0LCBpbnQgbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBreCwgaW50IG1fbWF4KTsKKworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilyZWYsIDEyOCAqIDIpOworICAgIHJhbmRvbWl6ZSgoSU5URkxPQVQgKilzX20sIDEyOCk7CisgICAgcmFuZG9taXplKChJTlRGTE9BVCAqKXFfZmlsdCwgMTI4KTsKKworICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaWYgKGNoZWNrX2Z1bmMoc2JyZHNwLT5oZl9hcHBseV9ub2lzZVtpXSwgImhmX2FwcGx5X25vaXNlXyVkIiwgaSkpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoZHN0MCwgcmVmLCAxMjggKiAyICogc2l6ZW9mKElOVEZMT0FUKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRzdDEsIHJlZiwgMTI4ICogMiAqIHNpemVvZihJTlRGTE9BVCkpOworICAgICAgICAgICAgICAgIGNhbGxfcmVmKGRzdDAsIHNfbSwgcV9maWx0LCBub2lzZSwgaiwgMTI4KTsKKyAgICAgICAgICAgICAgICBjYWxsX25ldyhkc3QxLCBzX20sIHFfZmlsdCwgbm9pc2UsIGosIDEyOCk7CisgICAgICAgICAgICAgICAgaWYgKCFmbG9hdF9uZWFyX2Fic19lcHNfYXJyYXkoKElOVEZMT0FUICopZHN0MCwgKElOVEZMT0FUICopZHN0MSwgRVBTLCAxMjggKiAyKSkKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAgIGJlbmNoX25ldyhkc3QxLCBzX20sIHFfZmlsdCwgbm9pc2UsIGosIDEyOCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfc2JyZHNwKHZvaWQpCit7CisgICAgU0JSRFNQQ29udGV4dCBzYnJkc3A7CisKKyAgICBmZl9zYnJkc3BfaW5pdCgmc2JyZHNwKTsKKworICAgIGlmIChjaGVja19mdW5jKHNicmRzcC5zdW02NHg1LCAic3VtNjR4NSIpKQorICAgICAgICB0ZXN0X3N1bTY0eDUoKTsKKyAgICByZXBvcnQoInN1bTY0eDUiKTsKKworICAgIGlmIChjaGVja19mdW5jKHNicmRzcC5zdW1fc3F1YXJlLCAic3VtX3NxdWFyZSIpKQorICAgICAgICB0ZXN0X3N1bV9zcXVhcmUoKTsKKyAgICByZXBvcnQoInN1bV9zcXVhcmUiKTsKKworICAgIGlmIChjaGVja19mdW5jKHNicmRzcC5uZWdfb2RkXzY0LCAibmVnX29kZF82NCIpKQorICAgICAgICB0ZXN0X25lZ19vZGRfNjQoKTsKKyAgICByZXBvcnQoIm5lZ19vZGRfNjQiKTsKKworICAgIGlmIChjaGVja19mdW5jKHNicmRzcC5xbWZfcHJlX3NodWZmbGUsICJxbWZfcHJlX3NodWZmbGUiKSkKKyAgICAgICAgdGVzdF9xbWZfcHJlX3NodWZmbGUoKTsKKyAgICByZXBvcnQoInFtZl9wcmVfc2h1ZmZsZSIpOworCisgICAgaWYgKGNoZWNrX2Z1bmMoc2JyZHNwLnFtZl9wb3N0X3NodWZmbGUsICJxbWZfcG9zdF9zaHVmZmxlIikpCisgICAgICAgIHRlc3RfcW1mX3Bvc3Rfc2h1ZmZsZSgpOworICAgIHJlcG9ydCgicW1mX3Bvc3Rfc2h1ZmZsZSIpOworCisgICAgaWYgKGNoZWNrX2Z1bmMoc2JyZHNwLnFtZl9kZWludF9uZWcsICJxbWZfZGVpbnRfbmVnIikpCisgICAgICAgIHRlc3RfcW1mX2RlaW50X25lZygpOworICAgIHJlcG9ydCgicW1mX2RlaW50X25lZyIpOworCisgICAgaWYgKGNoZWNrX2Z1bmMoc2JyZHNwLnFtZl9kZWludF9iZmx5LCAicW1mX2RlaW50X2JmbHkiKSkKKyAgICAgICAgdGVzdF9xbWZfZGVpbnRfYmZseSgpOworICAgIHJlcG9ydCgicW1mX2RlaW50X2JmbHkiKTsKKworICAgIGlmIChjaGVja19mdW5jKHNicmRzcC5hdXRvY29ycmVsYXRlLCAiYXV0b2NvcnJlbGF0ZSIpKQorICAgICAgICB0ZXN0X2F1dG9jb3JyZWxhdGUoKTsKKyAgICByZXBvcnQoImF1dG9jb3JyZWxhdGUiKTsKKworICAgIGlmIChjaGVja19mdW5jKHNicmRzcC5oZl9nZW4sICJoZl9nZW4iKSkKKyAgICAgICAgdGVzdF9oZl9nZW4oKTsKKyAgICByZXBvcnQoImhmX2dlbiIpOworCisgICAgaWYgKGNoZWNrX2Z1bmMoc2JyZHNwLmhmX2dfZmlsdCwgImhmX2dfZmlsdCIpKQorICAgICAgICB0ZXN0X2hmX2dfZmlsdCgpOworICAgIHJlcG9ydCgiaGZfZ19maWx0Iik7CisKKyAgICB0ZXN0X2hmX2FwcGx5X25vaXNlKCZzYnJkc3ApOworICAgIHJlcG9ydCgiaGZfYXBwbHlfbm9pc2UiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL3N3X3JnYi5jIGIvdGVzdHMvY2hlY2thc20vc3dfcmdiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjMmNmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL3N3X3JnYi5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAibGliYXZ1dGlsL2NvbW1vbi5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvbWVtLmgiCisKKyNpbmNsdWRlICJsaWJzd3NjYWxlL3JnYjJyZ2IuaCIKKworI2luY2x1ZGUgImNoZWNrYXNtLmgiCisKKyNkZWZpbmUgcmFuZG9taXplX2J1ZmZlcnMoYnVmLCBzaXplKSAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorPTQpICAgICAgIFwKKyAgICAgICAgICAgIEFWX1dOMzIoYnVmICsgaiwgcm5kKCkpOyAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgY29uc3QgdWludDhfdCB3aWR0aFtdID0gezEyLCAxNiwgMjAsIDMyLCAzNiwgMTI4fTsKKworI2RlZmluZSBNQVhfU1RSSURFIDEyOAorCitzdGF0aWMgdm9pZCBjaGVja19zaHVmZmxlX2J5dGVzKHZvaWQgKiBmdW5jLCBjb25zdCBjaGFyICogcmVwb3J0KQoreworICAgIGludCBpOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgc3JjMCwgW01BWF9TVFJJREVdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIHNyYzEsIFtNQVhfU1RSSURFXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBkc3QwLCBbTUFYX1NUUklERV0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0MSwgW01BWF9TVFJJREVdKTsKKworICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgdm9pZCwgY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCBzcmNfc2l6ZSk7CisKKyAgICBtZW1zZXQoZHN0MCwgMCwgTUFYX1NUUklERSk7CisgICAgbWVtc2V0KGRzdDEsIDAsIE1BWF9TVFJJREUpOworICAgIHJhbmRvbWl6ZV9idWZmZXJzKHNyYzAsIE1BWF9TVFJJREUpOworICAgIG1lbWNweShzcmMxLCBzcmMwLCBNQVhfU1RSSURFKTsKKworICAgIGlmIChjaGVja19mdW5jKGZ1bmMsICIlcyIsIHJlcG9ydCkpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkgKyspIHsKKyAgICAgICAgICAgIGNhbGxfcmVmKHNyYzAsIGRzdDAsIHdpZHRoW2ldKTsKKyAgICAgICAgICAgIGNhbGxfbmV3KHNyYzEsIGRzdDEsIHdpZHRoW2ldKTsKKyAgICAgICAgICAgIGlmIChtZW1jbXAoZHN0MCwgZHN0MSwgTUFYX1NUUklERSkpCisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisgICAgICAgIGJlbmNoX25ldyhzcmMwLCBkc3QwLCB3aWR0aFs1XSk7CisgICAgfQorfQorCit2b2lkIGNoZWNrYXNtX2NoZWNrX3N3X3JnYih2b2lkKQoreworICAgIGZmX3N3c19yZ2IycmdiX2luaXQoKTsKKworICAgIGNoZWNrX3NodWZmbGVfYnl0ZXMoc2h1ZmZsZV9ieXRlc18yMTAzLCAic2h1ZmZsZV9ieXRlc18yMTAzIik7CisgICAgcmVwb3J0KCJzaHVmZmxlX2J5dGVzXzIxMDMiKTsKKworICAgIGNoZWNrX3NodWZmbGVfYnl0ZXMoc2h1ZmZsZV9ieXRlc18wMzIxLCAic2h1ZmZsZV9ieXRlc18wMzIxIik7CisgICAgcmVwb3J0KCJzaHVmZmxlX2J5dGVzXzAzMjEiKTsKKworICAgIGNoZWNrX3NodWZmbGVfYnl0ZXMoc2h1ZmZsZV9ieXRlc18xMjMwLCAic2h1ZmZsZV9ieXRlc18xMjMwIik7CisgICAgcmVwb3J0KCJzaHVmZmxlX2J5dGVzXzEyMzAiKTsKKworICAgIGNoZWNrX3NodWZmbGVfYnl0ZXMoc2h1ZmZsZV9ieXRlc18zMDEyLCAic2h1ZmZsZV9ieXRlc18zMDEyIik7CisgICAgcmVwb3J0KCJzaHVmZmxlX2J5dGVzXzMwMTIiKTsKKworICAgIGNoZWNrX3NodWZmbGVfYnl0ZXMoc2h1ZmZsZV9ieXRlc18zMjEwLCAic2h1ZmZsZV9ieXRlc18zMjEwIik7CisgICAgcmVwb3J0KCJzaHVmZmxlX2J5dGVzXzMyMTAiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL3V0dmlkZW9kc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL3V0dmlkZW9kc3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODBiNDI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2thc20vdXR2aWRlb2RzcC5jCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IEpva3lvIEltYWdlcworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImNoZWNrYXNtLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy9hdmNvZGVjLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy91dHZpZGVvZHNwLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjZGVmaW5lIFdJRFRIIDI0MAorI2RlZmluZSBIRUlHSFQgMTIwCisjZGVmaW5lIFdJRFRIX1BBRERFRCAoV0lEVEggKyAxNikgLyogcGFkZGVkIHRvIDMyICovCisjZGVmaW5lIEJVRkZFUl9TSVpFIChXSURUSF9QQURERUQgKiBIRUlHSFQpCisKKworI2RlZmluZSByYW5kb21pemVfcGxhbmUoYnVmLCB0eXBlKSAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHcsIGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlICogdG1wID0gYnVmOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciAoaCA9IDA7IGggPCBIRUlHSFQ7IGgrKykgeyAgICAgIFwKKyAgICAgICAgICAgIGZvciAodyA9IDA7IHcgPCBXSURUSDsgdysrKSAgICAgXAorICAgICAgICAgICAgICAgIHRtcFt3XSA9IHJuZCgpICYgMHhGRjsgICAgICBcCisgICAgICAgICAgICB0bXAgKz0gV0lEVEhfUEFEREVEOyAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgY21wX3BsYW5lKGJ1ZjAsIGJ1ZjEsIHMpICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChoID0gMDsgaCA8IEhFSUdIVDsgaCsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAobWVtY21wKGJ1ZjAgKyBoKldJRFRIX1BBRERFRCwgICAgICAgXAorICAgICAgICAgICAgICAgIGJ1ZjEgKyBoKldJRFRIX1BBRERFRCwgV0lEVEggKnMpKSAgIFwKKyAgICAgICAgICAgICAgICBmYWlsKCk7XAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgQ0hFQ0tfUkVTVE9SRSh0eXBlKVwKK0xPQ0FMX0FMSUdORURfMzIodHlwZSwgc3JjX3IwLCBbQlVGRkVSX1NJWkVdKTsgIFwKK0xPQ0FMX0FMSUdORURfMzIodHlwZSwgc3JjX2cwLCBbQlVGRkVSX1NJWkVdKTsgIFwKK0xPQ0FMX0FMSUdORURfMzIodHlwZSwgc3JjX2IwLCBbQlVGRkVSX1NJWkVdKTsgIFwKK0xPQ0FMX0FMSUdORURfMzIodHlwZSwgc3JjX3IxLCBbQlVGRkVSX1NJWkVdKTsgIFwKK0xPQ0FMX0FMSUdORURfMzIodHlwZSwgc3JjX2cxLCBbQlVGRkVSX1NJWkVdKTsgIFwKK0xPQ0FMX0FMSUdORURfMzIodHlwZSwgc3JjX2IxLCBbQlVGRkVSX1NJWkVdKTsgIFwKK2RlY2xhcmVfZnVuYyh2b2lkLCB0eXBlICpzcmNfciwgdHlwZSAqc3JjX2csIHR5cGUgKnNyY19iLCAgIFwKKyAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemVfciwgcHRyZGlmZl90IGxpbmVzaXplX2csICAgIFwKKyAgICAgICAgICAgICBwdHJkaWZmX3QgbGluZXNpemVfYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsgIFwKK21lbXNldChzcmNfcjAsIDAsIEJVRkZFUl9TSVpFICogc2l6ZW9mKHR5cGUpKTsgIFwKK21lbXNldChzcmNfZzAsIDAsIEJVRkZFUl9TSVpFICogc2l6ZW9mKHR5cGUpKTsgIFwKK21lbXNldChzcmNfYjAsIDAsIEJVRkZFUl9TSVpFICogc2l6ZW9mKHR5cGUpKTsgIFwKK3JhbmRvbWl6ZV9wbGFuZShzcmNfcjAsIHR5cGUpOyAgICAgICAgICAgICAgICAgIFwKK3JhbmRvbWl6ZV9wbGFuZShzcmNfZzAsIHR5cGUpOyAgICAgICAgICAgICAgICAgIFwKK3JhbmRvbWl6ZV9wbGFuZShzcmNfYjAsIHR5cGUpOyAgICAgICAgICAgICAgICAgIFwKK21lbWNweShzcmNfcjEsIHNyY19yMCwgQlVGRkVSX1NJWkUgKiBzaXplb2YodHlwZSkpOyAgICAgICAgIFwKK21lbWNweShzcmNfZzEsIHNyY19nMCwgQlVGRkVSX1NJWkUgKiBzaXplb2YodHlwZSkpOyAgICAgICAgIFwKK21lbWNweShzcmNfYjEsIHNyY19iMCwgQlVGRkVSX1NJWkUgKiBzaXplb2YodHlwZSkpOyAgICAgICAgIFwKK2NhbGxfcmVmKHNyY19yMCwgc3JjX2cwLCBzcmNfYjAsIFdJRFRIX1BBRERFRCwgV0lEVEhfUEFEREVELCBXSURUSF9QQURERUQsIFdJRFRILCBIRUlHSFQpO1wKK2NhbGxfbmV3KHNyY19yMSwgc3JjX2cxLCBzcmNfYjEsIFdJRFRIX1BBRERFRCwgV0lEVEhfUEFEREVELCBXSURUSF9QQURERUQsIFdJRFRILCBIRUlHSFQpO1wKK2NtcF9wbGFuZShzcmNfcjAsIHNyY19yMSwgc2l6ZW9mKHR5cGUpKTsgICAgXAorY21wX3BsYW5lKHNyY19nMCwgc3JjX2cxLCBzaXplb2YodHlwZSkpOyAgICBcCitjbXBfcGxhbmUoc3JjX2IwLCBzcmNfYjEsIHNpemVvZih0eXBlKSk7ICAgIFwKK2JlbmNoX25ldyhzcmNfcjEsIHNyY19nMSwgc3JjX2IxLCBXSURUSF9QQURERUQsIFdJRFRIX1BBRERFRCwgV0lEVEhfUEFEREVELCBXSURUSCwgSEVJR0hUKQorCitzdGF0aWMgdm9pZCBjaGVja19yZXN0b3JlX3JnYl9wbGFuZXModm9pZCkgeworICAgIENIRUNLX1JFU1RPUkUodWludDhfdCk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3Jlc3RvcmVfcmdiX3BsYW5lczEwKHZvaWQpIHsKKyAgICBDSEVDS19SRVNUT1JFKHVpbnQxNl90KTsKK30KKwordm9pZCBjaGVja2FzbV9jaGVja191dHZpZGVvZHNwKHZvaWQpCit7CisgICAgVVRWaWRlb0RTUENvbnRleHQgaDsKKworICAgIGZmX3V0dmlkZW9kc3BfaW5pdCgmaCk7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhoLnJlc3RvcmVfcmdiX3BsYW5lcywgInJlc3RvcmVfcmdiX3BsYW5lcyIpKQorICAgICAgICBjaGVja19yZXN0b3JlX3JnYl9wbGFuZXMoKTsKKworICAgIHJlcG9ydCgicmVzdG9yZV9yZ2JfcGxhbmVzIik7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhoLnJlc3RvcmVfcmdiX3BsYW5lczEwLCAicmVzdG9yZV9yZ2JfcGxhbmVzMTAiKSkKKyAgICAgICAgY2hlY2tfcmVzdG9yZV9yZ2JfcGxhbmVzMTAoKTsKKworICAgIHJlcG9ydCgicmVzdG9yZV9yZ2JfcGxhbmVzMTAiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL3ZmX2JsZW5kLmMgYi90ZXN0cy9jaGVja2FzbS92Zl9ibGVuZC5jCmluZGV4IGNmYzM4OWIuLjkxMmYzYTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NoZWNrYXNtL3ZmX2JsZW5kLmMKKysrIGIvdGVzdHMvY2hlY2thc20vdmZfYmxlbmQuYwpAQCAtNjAsMjggKzYwLDI5IEBACiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgY2hlY2tfYmxlbmRfZnVuYygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIGNoZWNrX2JsZW5kX2Z1bmMoZGVwdGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpLCB3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBkZWNsYXJlX2Z1bmModm9pZCwgY29uc3QgdWludDhfdCAqdG9wLCBwdHJkaWZmX3QgdG9wX2xpbmVzaXplLCAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJvdHRvbSwgcHRyZGlmZl90IGJvdHRvbV9saW5lc2l6ZSwgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpkc3QsIHB0cmRpZmZfdCBkc3RfbGluZXNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLCBwdHJkaWZmX3QgaGVpZ2h0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGaWx0ZXJQYXJhbXMgKnBhcmFtLCBkb3VibGUgKnZhbHVlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHcgPSBXSURUSCAvIGRlcHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgZm9yIChpID0gMDsgaSA8IEJVRl9VTklUUyAtIDE7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBpbnQgc3JjX29mZnNldCA9IGkgKiBTSVpFX1BFUl9VTklUICsgaTsgLyogVGVzdCB2YXJpb3VzIGFsaWdubWVudHMgKi8gICAgICAgICAgXAogICAgICAgICAgICAgaW50IGRzdF9vZmZzZXQgPSBpICogU0laRV9QRVJfVU5JVDsgLyogZHN0IG11c3QgYmUgYWxpZ25lZCAqLyAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjYWxsX3JlZih0b3AxICsgc3JjX29mZnNldCwgV0lEVEgsIGJvdDEgKyBzcmNfb2Zmc2V0LCBXSURUSCwgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgZHN0MSArIGRzdF9vZmZzZXQsIFdJRFRILCBXSURUSCwgSEVJR0hULCAmcGFyYW0sIE5VTEwpOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNhbGxfbmV3KHRvcDIgKyBzcmNfb2Zmc2V0LCBXSURUSCwgYm90MiArIHNyY19vZmZzZXQsIFdJRFRILCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICBkc3QyICsgZHN0X29mZnNldCwgV0lEVEgsIFdJRFRILCBIRUlHSFQsICZwYXJhbSwgTlVMTCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2FsbF9yZWYodG9wMSArIHNyY19vZmZzZXQsIHcsIGJvdDEgKyBzcmNfb2Zmc2V0LCB3LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGRzdDEgKyBkc3Rfb2Zmc2V0LCB3LCB3LCBIRUlHSFQsICZwYXJhbSwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjYWxsX25ldyh0b3AyICsgc3JjX29mZnNldCwgdywgYm90MiArIHNyY19vZmZzZXQsIHcsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgZHN0MiArIGRzdF9vZmZzZXQsIHcsIHcsIEhFSUdIVCwgJnBhcmFtLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgIGlmIChtZW1jbXAodG9wMSwgdG9wMiwgQlVGX1NJWkUpIHx8IG1lbWNtcChib3QxLCBib3QyLCBCVUZfU0laRSkgfHwgbWVtY21wKGRzdDEsIGRzdDIsIEJVRl9TSVpFKSkgXAogICAgICAgICAgICAgICAgIGZhaWwoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJlbmNoX25ldyh0b3AyICsgc3JjX29mZnNldCwgV0lEVEgsIGJvdDIgKyBzcmNfb2Zmc2V0LCBXSURUSCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgZHN0MiwgV0lEVEgsIFdJRFRILCBIRUlHSFQsICZwYXJhbSwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmVuY2hfbmV3KHRvcDIsIHcgLyA0LCBib3QyLCB3IC8gNCwgZHN0MiwgdyAvIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB3IC8gNCwgSEVJR0hUIC8gNCwgJnBhcmFtLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKDApCiAKIHZvaWQgY2hlY2thc21fY2hlY2tfYmxlbmQodm9pZCkKQEAgLTk2LDMxICs5Nyw0OSBAQAogICAgICAgICAub3BhY2l0eSA9IDEuMCwKICAgICB9OwogCi0jZGVmaW5lIGNoZWNrX2FuZF9yZXBvcnQobmFtZSwgdmFsKSAgICAgICAgICAgICAgIFwKKyNkZWZpbmUgY2hlY2tfYW5kX3JlcG9ydChuYW1lLCB2YWwsIGRlcHRoKSAgICAgICAgXAogICAgIHBhcmFtLm1vZGUgPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmZfYmxlbmRfaW5pdCgmcGFyYW0sIDApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmZl9ibGVuZF9pbml0KCZwYXJhbSwgZGVwdGggLSAxKTsgICAgICAgICAgICAgXAogICAgIGlmIChjaGVja19mdW5jKHBhcmFtLmJsZW5kLCAjbmFtZSkpICAgICAgICAgICBcCi0gICAgICAgIGNoZWNrX2JsZW5kX2Z1bmMoKTsKKyAgICAgICAgY2hlY2tfYmxlbmRfZnVuYyhkZXB0aCk7CiAKLSAgICBjaGVja19hbmRfcmVwb3J0KGFkZGl0aW9uLCBCTEVORF9BRERJVElPTikKLSAgICBjaGVja19hbmRfcmVwb3J0KGFkZGl0aW9uMTI4LCBCTEVORF9BRERJVElPTjEyOCkKLSAgICBjaGVja19hbmRfcmVwb3J0KGFuZCwgQkxFTkRfQU5EKQotICAgIGNoZWNrX2FuZF9yZXBvcnQoYXZlcmFnZSwgQkxFTkRfQVZFUkFHRSkKLSAgICBjaGVja19hbmRfcmVwb3J0KGRhcmtlbiwgQkxFTkRfREFSS0VOKQotICAgIGNoZWNrX2FuZF9yZXBvcnQoZGlmZmVyZW5jZTEyOCwgQkxFTkRfRElGRkVSRU5DRTEyOCkKLSAgICBjaGVja19hbmRfcmVwb3J0KGhhcmRtaXgsIEJMRU5EX0hBUkRNSVgpCi0gICAgY2hlY2tfYW5kX3JlcG9ydChsaWdodGVuLCBCTEVORF9MSUdIVEVOKQotICAgIGNoZWNrX2FuZF9yZXBvcnQobXVsdGlwbHksIEJMRU5EX01VTFRJUExZKQotICAgIGNoZWNrX2FuZF9yZXBvcnQob3IsIEJMRU5EX09SKQotICAgIGNoZWNrX2FuZF9yZXBvcnQocGhvZW5peCwgQkxFTkRfUEhPRU5JWCkKLSAgICBjaGVja19hbmRfcmVwb3J0KHNjcmVlbiwgQkxFTkRfU0NSRUVOKQotICAgIGNoZWNrX2FuZF9yZXBvcnQoc3VidHJhY3QsIEJMRU5EX1NVQlRSQUNUKQotICAgIGNoZWNrX2FuZF9yZXBvcnQoeG9yLCBCTEVORF9YT1IpCi0gICAgY2hlY2tfYW5kX3JlcG9ydChkaWZmZXJlbmNlLCBCTEVORF9ESUZGRVJFTkNFKQotICAgIGNoZWNrX2FuZF9yZXBvcnQobmVnYXRpb24sIEJMRU5EX05FR0FUSU9OKQorICAgIGNoZWNrX2FuZF9yZXBvcnQoYWRkaXRpb24sIEJMRU5EX0FERElUSU9OLCAxKQorICAgIGNoZWNrX2FuZF9yZXBvcnQoZ3JhaW5tZXJnZSwgQkxFTkRfR1JBSU5NRVJHRSwgMSkKKyAgICBjaGVja19hbmRfcmVwb3J0KGFuZCwgQkxFTkRfQU5ELCAxKQorICAgIGNoZWNrX2FuZF9yZXBvcnQoYXZlcmFnZSwgQkxFTkRfQVZFUkFHRSwgMSkKKyAgICBjaGVja19hbmRfcmVwb3J0KGRhcmtlbiwgQkxFTkRfREFSS0VOLCAxKQorICAgIGNoZWNrX2FuZF9yZXBvcnQoZ3JhaW5leHRyYWN0LCBCTEVORF9HUkFJTkVYVFJBQ1QsIDEpCisgICAgY2hlY2tfYW5kX3JlcG9ydChoYXJkbWl4LCBCTEVORF9IQVJETUlYLCAxKQorICAgIGNoZWNrX2FuZF9yZXBvcnQobGlnaHRlbiwgQkxFTkRfTElHSFRFTiwgMSkKKyAgICBjaGVja19hbmRfcmVwb3J0KG11bHRpcGx5LCBCTEVORF9NVUxUSVBMWSwgMSkKKyAgICBjaGVja19hbmRfcmVwb3J0KG9yLCBCTEVORF9PUiwgMSkKKyAgICBjaGVja19hbmRfcmVwb3J0KHBob2VuaXgsIEJMRU5EX1BIT0VOSVgsIDEpCisgICAgY2hlY2tfYW5kX3JlcG9ydChzY3JlZW4sIEJMRU5EX1NDUkVFTiwgMSkKKyAgICBjaGVja19hbmRfcmVwb3J0KHN1YnRyYWN0LCBCTEVORF9TVUJUUkFDVCwgMSkKKyAgICBjaGVja19hbmRfcmVwb3J0KHhvciwgQkxFTkRfWE9SLCAxKQorICAgIGNoZWNrX2FuZF9yZXBvcnQoZGlmZmVyZW5jZSwgQkxFTkRfRElGRkVSRU5DRSwgMSkKKyAgICBjaGVja19hbmRfcmVwb3J0KGV4dHJlbWl0eSwgQkxFTkRfRVhUUkVNSVRZLCAxKQorICAgIGNoZWNrX2FuZF9yZXBvcnQobmVnYXRpb24sIEJMRU5EX05FR0FUSU9OLCAxKQogCiAgICAgcmVwb3J0KCI4Yml0Iik7CiAKKyAgICBjaGVja19hbmRfcmVwb3J0KGFkZGl0aW9uXzE2LCBCTEVORF9BRERJVElPTiwgMikKKyAgICBjaGVja19hbmRfcmVwb3J0KGdyYWlubWVyZ2VfMTYsIEJMRU5EX0dSQUlOTUVSR0UsIDIpCisgICAgY2hlY2tfYW5kX3JlcG9ydChhbmRfMTYsIEJMRU5EX0FORCwgMikKKyAgICBjaGVja19hbmRfcmVwb3J0KGF2ZXJhZ2VfMTYsIEJMRU5EX0FWRVJBR0UsIDIpCisgICAgY2hlY2tfYW5kX3JlcG9ydChkYXJrZW5fMTYsIEJMRU5EX0RBUktFTiwgMikKKyAgICBjaGVja19hbmRfcmVwb3J0KGdyYWluZXh0cmFjdF8xNiwgQkxFTkRfR1JBSU5FWFRSQUNULCAyKQorICAgIGNoZWNrX2FuZF9yZXBvcnQoZGlmZmVyZW5jZV8xNiwgQkxFTkRfRElGRkVSRU5DRSwgMikKKyAgICBjaGVja19hbmRfcmVwb3J0KGV4dHJlbWl0eV8xNiwgQkxFTkRfRVhUUkVNSVRZLCAyKQorICAgIGNoZWNrX2FuZF9yZXBvcnQobmVnYXRpb25fMTYsIEJMRU5EX05FR0FUSU9OLCAyKQorICAgIGNoZWNrX2FuZF9yZXBvcnQobGlnaHRlbl8xNiwgQkxFTkRfTElHSFRFTiwgMikKKyAgICBjaGVja19hbmRfcmVwb3J0KG9yXzE2LCBCTEVORF9PUiwgMikKKyAgICBjaGVja19hbmRfcmVwb3J0KHBob2VuaXhfMTYsIEJMRU5EX1BIT0VOSVgsIDIpCisgICAgY2hlY2tfYW5kX3JlcG9ydChzdWJ0cmFjdF8xNiwgQkxFTkRfU1VCVFJBQ1QsIDIpCisgICAgY2hlY2tfYW5kX3JlcG9ydCh4b3JfMTYsIEJMRU5EX1NVQlRSQUNULCAyKQorCisgICAgcmVwb3J0KCIxNmJpdCIpOworCiAgICAgYXZfZnJlZXAoJnRvcDEpOwogICAgIGF2X2ZyZWVwKCZ0b3AyKTsKICAgICBhdl9mcmVlcCgmYm90MSk7CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS92Zl9jb2xvcnNwYWNlLmMgYi90ZXN0cy9jaGVja2FzbS92Zl9jb2xvcnNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiN2I4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2NoZWNrYXNtL3ZmX2NvbG9yc3BhY2UuYwpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBSb25hbGQgUy4gQnVsdGplIDxyc2J1bHRqZUBnbWFpbC5jb20+CisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjaGVja2FzbS5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL2NvbG9yc3BhY2Vkc3AuaCIKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjZGVmaW5lIFcgNjQKKyNkZWZpbmUgSCA2NAorCisjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXJzKCkgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIG1hc2sgPSBicHBfbWFza1tpZGVwdGhdOyAgICAgICBcCisgICAgICAgIGludCBuLCBtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBicHAgPSAxICsgKCEhaWRlcHRoKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBidWZfc2l6ZSA9IFcgKiBIICogYnBwOyAgICAgICAgICAgICBcCisgICAgICAgIGZvciAobSA9IDA7IG0gPCAzOyBtKyspIHsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgc3MgPSBtID8gc3NfdyArIHNzX2ggOiAwOyAgICAgICBcCisgICAgICAgICAgICBpbnQgcGxhbmVfc3ogPSBidWZfc2l6ZSA+PiBzczsgICAgICBcCisgICAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgcGxhbmVfc3o7IG4gKz0gNCkgeyBcCisgICAgICAgICAgICAgICAgdW5zaWduZWQgciA9IHJuZCgpICYgbWFzazsgICAgICBcCisgICAgICAgICAgICAgICAgQVZfV04zMkEoJnNyY1ttXVtuXSwgcik7ICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIGNvbnN0IGNoYXIgKmZvcm1hdF9zdHJpbmdbXSA9IHsKKyAgICAiNDQ0IiwgIjQyMiIsICI0MjAiCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYnBwX21hc2tbXSA9IHsgMHhmZmZmZmZmZiwgMHgwM2ZmMDNmZiwgMHgwZmZmMGZmZiB9OworCitzdGF0aWMgdm9pZCBjaGVja195dXYyeXV2KHZvaWQpCit7CisgICAgZGVjbGFyZV9mdW5jKHZvaWQsIHVpbnQ4X3QgKmRzdFszXSwgcHRyZGlmZl90IGRzdF9zdHJpZGVbM10sCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnNyY1szXSwgcHRyZGlmZl90IHNyY19zdHJpZGVbM10sCisgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgY29uc3QgaW50MTZfdCBjb2VmZlszXVszXVs4XSwKKyAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCBvZmZbMl1bOF0pOworICAgIENvbG9yU3BhY2VEU1BDb250ZXh0IGRzcDsKKyAgICBpbnQgaWRlcHRoLCBvZGVwdGgsIGZtdCwgbjsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIHNyY195LCBbVyAqIEggKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBzcmNfdSwgW1cgKiBIICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgc3JjX3YsIFtXICogSCAqIDJdKTsKKyAgICB1aW50OF90ICpzcmNbM10gPSB7IHNyY195LCBzcmNfdSwgc3JjX3YgfTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdDBfeSwgW1cgKiBIICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0MF91LCBbVyAqIEggKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBkc3QwX3YsIFtXICogSCAqIDJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdDFfeSwgW1cgKiBIICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0MV91LCBbVyAqIEggKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBkc3QxX3YsIFtXICogSCAqIDJdKTsKKyAgICB1aW50OF90ICpkc3QwWzNdID0geyBkc3QwX3ksIGRzdDBfdSwgZHN0MF92IH0sICpkc3QxWzNdID0geyBkc3QxX3ksIGRzdDFfdSwgZHN0MV92IH07CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBvZmZzZXRfYnVmLCBbMTZdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGNvZWZmX2J1ZiwgWzMgKiAzICogOF0pOworICAgIGludDE2X3QgKCpvZmZzZXQpWzhdID0gKGludDE2X3QoKilbOF0pIG9mZnNldF9idWY7CisgICAgaW50MTZfdCAoKmNvZWZmKVszXVs4XSA9IChpbnQxNl90KCopWzNdWzhdKSBjb2VmZl9idWY7CisKKyAgICBmZl9jb2xvcnNwYWNlZHNwX2luaXQoJmRzcCk7CisgICAgZm9yIChuID0gMDsgbiA8IDg7IG4rKykgeworICAgICAgICBvZmZzZXRbMF1bbl0gPSBvZmZzZXRbMV1bbl0gPSAxNjsKKworICAgICAgICBjb2VmZlswXVswXVtuXSA9ICgxIDw8IDE0KSArICgxIDw8IDcpICsgMTsKKyAgICAgICAgY29lZmZbMF1bMV1bbl0gPSAoMSA8PCA3KSAtIDE7CisgICAgICAgIGNvZWZmWzBdWzJdW25dID0gLSgxIDw8IDgpOworICAgICAgICBjb2VmZlsxXVswXVtuXSA9IGNvZWZmWzJdWzBdW25dID0gMDsKKyAgICAgICAgY29lZmZbMV1bMV1bbl0gPSAoMSA8PCAxNCkgKyAoMSA8PCA3KTsKKyAgICAgICAgY29lZmZbMV1bMl1bbl0gPSAtKDEgPDwgNyk7CisgICAgICAgIGNvZWZmWzJdWzJdW25dID0gKDEgPDwgMTQpIC0gKDEgPDwgNik7CisgICAgICAgIGNvZWZmWzJdWzFdW25dID0gMSA8PCA2OworICAgIH0KKyAgICBmb3IgKGlkZXB0aCA9IDA7IGlkZXB0aCA8IDM7IGlkZXB0aCsrKSB7CisgICAgICAgIGZvciAob2RlcHRoID0gMDsgb2RlcHRoIDwgMzsgb2RlcHRoKyspIHsKKyAgICAgICAgICAgIGZvciAoZm10ID0gMDsgZm10IDwgMzsgZm10KyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tfZnVuYyhkc3AueXV2Mnl1dltpZGVwdGhdW29kZXB0aF1bZm10XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmZfY29sb3JzcGFjZWRzcF95dXYyeXV2XyVzcCVkdG8lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZ1tmbXRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZXB0aCAqIDIgKyA4LCBvZGVwdGggKiAyICsgOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNzX3cgPSAhIWZtdCwgc3NfaCA9IGZtdCA9PSAyOworICAgICAgICAgICAgICAgICAgICBpbnQgeV9zcmNfc3RyaWRlID0gVyA8PCAhIWlkZXB0aCwgeV9kc3Rfc3RyaWRlID0gVyA8PCAhIW9kZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHV2X3NyY19zdHJpZGUgPSB5X3NyY19zdHJpZGUgPj4gc3NfdywgdXZfZHN0X3N0cmlkZSA9IHlfZHN0X3N0cmlkZSA+PiBzc193OworCisgICAgICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKCk7CisgICAgICAgICAgICAgICAgICAgIGNhbGxfcmVmKGRzdDAsIChwdHJkaWZmX3RbM10pIHsgeV9kc3Rfc3RyaWRlLCB1dl9kc3Rfc3RyaWRlLCB1dl9kc3Rfc3RyaWRlIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgKHB0cmRpZmZfdFszXSkgeyB5X3NyY19zdHJpZGUsIHV2X3NyY19zdHJpZGUsIHV2X3NyY19zdHJpZGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVywgSCwgY29lZmYsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGNhbGxfbmV3KGRzdDEsIChwdHJkaWZmX3RbM10pIHsgeV9kc3Rfc3RyaWRlLCB1dl9kc3Rfc3RyaWRlLCB1dl9kc3Rfc3RyaWRlIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgKHB0cmRpZmZfdFszXSkgeyB5X3NyY19zdHJpZGUsIHV2X3NyY19zdHJpZGUsIHV2X3NyY19zdHJpZGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVywgSCwgY29lZmYsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoZHN0MFswXSwgZHN0MVswXSwgeV9kc3Rfc3RyaWRlICogSCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNtcChkc3QwWzFdLCBkc3QxWzFdLCB1dl9kc3Rfc3RyaWRlICogSCA+PiBzc19oKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY21wKGRzdDBbMl0sIGRzdDFbMl0sIHV2X2RzdF9zdHJpZGUgKiBIID4+IHNzX2gpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXBvcnQoInl1djJ5dXYiKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfeXV2MnJnYih2b2lkKQoreworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBpbnQxNl90ICpkc3RbM10sIHB0cmRpZmZfdCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICB1aW50OF90ICpzcmNbM10sIHB0cmRpZmZfdCBzcmNfc3RyaWRlWzNdLAorICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgY29lZmZbM11bM11bOF0sCisgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3Qgb2ZmWzhdKTsKKyAgICBDb2xvclNwYWNlRFNQQ29udGV4dCBkc3A7CisgICAgaW50IGlkZXB0aCwgZm10LCBuOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgc3JjX3ksIFtXICogSCAqIDJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIHNyY191LCBbVyAqIEggKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBzcmNfdiwgW1cgKiBIICogMl0pOworICAgIHVpbnQ4X3QgKnNyY1szXSA9IHsgc3JjX3ksIHNyY191LCBzcmNfdiB9OworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MTZfdCwgZHN0MF95LCBbVyAqIEhdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGRzdDBfdSwgW1cgKiBIXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBkc3QwX3YsIFtXICogSF0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MTZfdCwgZHN0MV95LCBbVyAqIEhdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGRzdDFfdSwgW1cgKiBIXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBkc3QxX3YsIFtXICogSF0pOworICAgIGludDE2X3QgKmRzdDBbM10gPSB7IGRzdDBfeSwgZHN0MF91LCBkc3QwX3YgfSwgKmRzdDFbM10gPSB7IGRzdDFfeSwgZHN0MV91LCBkc3QxX3YgfTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIG9mZnNldCwgWzhdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGNvZWZmX2J1ZiwgWzMgKiAzICogOF0pOworICAgIGludDE2X3QgKCpjb2VmZilbM11bOF0gPSAoaW50MTZfdCgqKVszXVs4XSkgY29lZmZfYnVmOworCisgICAgZmZfY29sb3JzcGFjZWRzcF9pbml0KCZkc3ApOworICAgIGZvciAobiA9IDA7IG4gPCA4OyBuKyspIHsKKyAgICAgICAgb2Zmc2V0W25dID0gMTY7CisKKyAgICAgICAgY29lZmZbMF1bMF1bbl0gPSBjb2VmZlsxXVswXVtuXSA9IGNvZWZmWzJdWzBdW25dID0gKDEgPDwgMTQpIHwgMTsKKyAgICAgICAgY29lZmZbMF1bMV1bbl0gPSBjb2VmZlsyXVsyXVtuXSA9IDA7CisgICAgICAgIGNvZWZmWzBdWzJdW25dID0gMSA8PCAxMzsKKyAgICAgICAgY29lZmZbMV1bMV1bbl0gPSAtKDEgPDwgMTIpOworICAgICAgICBjb2VmZlsxXVsyXVtuXSA9IDEgPDwgMTI7CisgICAgICAgIGNvZWZmWzJdWzFdW25dID0gMSA8PCAxMTsKKyAgICB9CisgICAgZm9yIChpZGVwdGggPSAwOyBpZGVwdGggPCAzOyBpZGVwdGgrKykgeworICAgICAgICBmb3IgKGZtdCA9IDA7IGZtdCA8IDM7IGZtdCsrKSB7CisgICAgICAgICAgICBpZiAoY2hlY2tfZnVuYyhkc3AueXV2MnJnYltpZGVwdGhdW2ZtdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmZfY29sb3JzcGFjZWRzcF95dXYycmdiXyVzcCVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmdbZm10XSwgaWRlcHRoICogMiArIDgpKSB7CisgICAgICAgICAgICAgICAgaW50IHNzX3cgPSAhIWZtdCwgc3NfaCA9IGZtdCA9PSAyOworICAgICAgICAgICAgICAgIGludCB5X3NyY19zdHJpZGUgPSBXIDw8ICEhaWRlcHRoOworICAgICAgICAgICAgICAgIGludCB1dl9zcmNfc3RyaWRlID0geV9zcmNfc3RyaWRlID4+IHNzX3c7CisKKyAgICAgICAgICAgICAgICByYW5kb21pemVfYnVmZmVycygpOworICAgICAgICAgICAgICAgIGNhbGxfcmVmKGRzdDAsIFcsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHRyZGlmZl90WzNdKSB7IHlfc3JjX3N0cmlkZSwgdXZfc3JjX3N0cmlkZSwgdXZfc3JjX3N0cmlkZSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgIFcsIEgsIGNvZWZmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIGNhbGxfbmV3KGRzdDEsIFcsIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAocHRyZGlmZl90WzNdKSB7IHlfc3JjX3N0cmlkZSwgdXZfc3JjX3N0cmlkZSwgdXZfc3JjX3N0cmlkZSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgIFcsIEgsIGNvZWZmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoZHN0MFswXSwgZHN0MVswXSwgVyAqIEggKiBzaXplb2YoaW50MTZfdCkpIHx8CisgICAgICAgICAgICAgICAgICAgIG1lbWNtcChkc3QwWzFdLCBkc3QxWzFdLCBXICogSCAqIHNpemVvZihpbnQxNl90KSkgfHwKKyAgICAgICAgICAgICAgICAgICAgbWVtY21wKGRzdDBbMl0sIGRzdDFbMl0sIFcgKiBIICogc2l6ZW9mKGludDE2X3QpKSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmVwb3J0KCJ5dXYycmdiIik7Cit9CisKKyN1bmRlZiByYW5kb21pemVfYnVmZmVycworI2RlZmluZSByYW5kb21pemVfYnVmZmVycygpICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeSwgeCwgcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHAgPSAwOyBwIDwgMzsgcCsrKSB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICh5ID0gMDsgeSA8IEg7IHkrKykgeyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBXOyB4KyspIHsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbnQgciA9IHJuZCgpICYgMHg3ZmZmOyAgICAgXAorICAgICAgICAgICAgICAgICAgICByIC09ICgzMjc2OCAtIDI4NjcyKSA+PiAxOyAgXAorICAgICAgICAgICAgICAgICAgICBzcmNbcF1beSAqIFcgKyB4XSA9IHI7ICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGNoZWNrX3JnYjJ5dXYodm9pZCkKK3sKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgdWludDhfdCAqZHN0WzNdLCBwdHJkaWZmX3QgZHN0X3N0cmlkZVszXSwKKyAgICAgICAgICAgICAgICAgaW50MTZfdCAqc3JjWzNdLCBwdHJkaWZmX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBjb25zdCBpbnQxNl90IGNvZWZmWzNdWzNdWzhdLAorICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90IG9mZls4XSk7CisgICAgQ29sb3JTcGFjZURTUENvbnRleHQgZHNwOworICAgIGludCBvZGVwdGgsIGZtdCwgbjsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIHNyY195LCBbVyAqIEggKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBzcmNfdSwgW1cgKiBIICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MTZfdCwgc3JjX3YsIFtXICogSCAqIDJdKTsKKyAgICBpbnQxNl90ICpzcmNbM10gPSB7IHNyY195LCBzcmNfdSwgc3JjX3YgfTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdDBfeSwgW1cgKiBIICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0MF91LCBbVyAqIEggKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBkc3QwX3YsIFtXICogSCAqIDJdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdDFfeSwgW1cgKiBIICogMl0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgZHN0MV91LCBbVyAqIEggKiAyXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBkc3QxX3YsIFtXICogSCAqIDJdKTsKKyAgICB1aW50OF90ICpkc3QwWzNdID0geyBkc3QwX3ksIGRzdDBfdSwgZHN0MF92IH0sICpkc3QxWzNdID0geyBkc3QxX3ksIGRzdDFfdSwgZHN0MV92IH07CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBvZmZzZXQsIFs4XSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBjb2VmZl9idWYsIFszICogMyAqIDhdKTsKKyAgICBpbnQxNl90ICgqY29lZmYpWzNdWzhdID0gKGludDE2X3QoKilbM11bOF0pIGNvZWZmX2J1ZjsKKworICAgIGZmX2NvbG9yc3BhY2Vkc3BfaW5pdCgmZHNwKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7CisgICAgICAgIG9mZnNldFtuXSA9IDE2OworCisgICAgICAgIC8vIHRoZXNlIHNvbWV3aGF0IHJlc2VtYmxlIGJ0NjAxL3NtcHRlMTcwbSBjb2VmZmljaWVudHMKKyAgICAgICAgY29lZmZbMF1bMF1bbl0gPSBscmludCgwLjMgKiAoMSA8PCAxNCkpOworICAgICAgICBjb2VmZlswXVsxXVtuXSA9IGxyaW50KDAuNiAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzBdWzJdW25dID0gbHJpbnQoMC4xICogKDEgPDwgMTQpKTsKKyAgICAgICAgY29lZmZbMV1bMF1bbl0gPSBscmludCgtMC4xNSAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzFdWzFdW25dID0gbHJpbnQoLTAuMzUgKiAoMSA8PCAxNCkpOworICAgICAgICBjb2VmZlsxXVsyXVtuXSA9IGxyaW50KDAuNSAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzJdWzBdW25dID0gbHJpbnQoMC41ICogKDEgPDwgMTQpKTsKKyAgICAgICAgY29lZmZbMl1bMV1bbl0gPSBscmludCgtMC40MiAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzJdWzJdW25dID0gbHJpbnQoLTAuMDggKiAoMSA8PCAxNCkpOworICAgIH0KKyAgICBmb3IgKG9kZXB0aCA9IDA7IG9kZXB0aCA8IDM7IG9kZXB0aCsrKSB7CisgICAgICAgIGZvciAoZm10ID0gMDsgZm10IDwgMzsgZm10KyspIHsKKyAgICAgICAgICAgIGlmIChjaGVja19mdW5jKGRzcC5yZ2IyeXV2W29kZXB0aF1bZm10XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZl9jb2xvcnNwYWNlZHNwX3JnYjJ5dXZfJXNwJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZ1tmbXRdLCBvZGVwdGggKiAyICsgOCkpIHsKKyAgICAgICAgICAgICAgICBpbnQgc3NfdyA9ICEhZm10LCBzc19oID0gZm10ID09IDI7CisgICAgICAgICAgICAgICAgaW50IHlfZHN0X3N0cmlkZSA9IFcgPDwgISFvZGVwdGg7CisgICAgICAgICAgICAgICAgaW50IHV2X2RzdF9zdHJpZGUgPSB5X2RzdF9zdHJpZGUgPj4gc3NfdzsKKworICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKCk7CisgICAgICAgICAgICAgICAgY2FsbF9yZWYoZHN0MCwgKHB0cmRpZmZfdFszXSkgeyB5X2RzdF9zdHJpZGUsIHV2X2RzdF9zdHJpZGUsIHV2X2RzdF9zdHJpZGUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIFcsIFcsIEgsIGNvZWZmLCBvZmZzZXQpOworICAgICAgICAgICAgICAgIGNhbGxfbmV3KGRzdDEsIChwdHJkaWZmX3RbM10pIHsgeV9kc3Rfc3RyaWRlLCB1dl9kc3Rfc3RyaWRlLCB1dl9kc3Rfc3RyaWRlIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBXLCBXLCBILCBjb2VmZiwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAobWVtY21wKGRzdDBbMF0sIGRzdDFbMF0sIEggKiB5X2RzdF9zdHJpZGUpIHx8CisgICAgICAgICAgICAgICAgICAgIG1lbWNtcChkc3QwWzFdLCBkc3QxWzFdLCBIICogdXZfZHN0X3N0cmlkZSA+PiBzc19oKSB8fAorICAgICAgICAgICAgICAgICAgICBtZW1jbXAoZHN0MFsyXSwgZHN0MVsyXSwgSCAqIHV2X2RzdF9zdHJpZGUgPj4gc3NfaCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcG9ydCgicmdiMnl1diIpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19tdWx0aXBseTN4Myh2b2lkKQoreworICAgIGRlY2xhcmVfZnVuYyh2b2lkLCBpbnQxNl90ICpkYXRhWzNdLCBwdHJkaWZmX3Qgc3RyaWRlLAorICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGNvbnN0IGludDE2X3QgY29lZmZbM11bM11bOF0pOworICAgIENvbG9yU3BhY2VEU1BDb250ZXh0IGRzcDsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGRzdDBfeSwgW1cgKiBIXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBkc3QwX3UsIFtXICogSF0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MTZfdCwgZHN0MF92LCBbVyAqIEhdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKGludDE2X3QsIGRzdDFfeSwgW1cgKiBIXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBkc3QxX3UsIFtXICogSF0pOworICAgIExPQ0FMX0FMSUdORURfMzIoaW50MTZfdCwgZHN0MV92LCBbVyAqIEhdKTsKKyAgICBpbnQxNl90ICpkc3QwWzNdID0geyBkc3QwX3ksIGRzdDBfdSwgZHN0MF92IH0sICpkc3QxWzNdID0geyBkc3QxX3ksIGRzdDFfdSwgZHN0MV92IH07CisgICAgaW50MTZfdCAqKnNyYyA9IGRzdDA7CisgICAgTE9DQUxfQUxJR05FRF8zMihpbnQxNl90LCBjb2VmZl9idWYsIFszICogMyAqIDhdKTsKKyAgICBpbnQxNl90ICgqY29lZmYpWzNdWzhdID0gKGludDE2X3QoKilbM11bOF0pIGNvZWZmX2J1ZjsKKyAgICBpbnQgbjsKKworICAgIGZmX2NvbG9yc3BhY2Vkc3BfaW5pdCgmZHNwKTsKKyAgICBmb3IgKG4gPSAwOyBuIDwgODsgbisrKSB7CisgICAgICAgIGNvZWZmWzBdWzBdW25dID0gbHJpbnQoMC44NSAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzBdWzFdW25dID0gbHJpbnQoMC4xMCAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzBdWzJdW25dID0gbHJpbnQoMC4wNSAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzFdWzBdW25dID0gbHJpbnQoLTAuMSAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzFdWzFdW25dID0gbHJpbnQoMC45NSAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzFdWzJdW25dID0gbHJpbnQoMC4xNSAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzJdWzBdW25dID0gbHJpbnQoLTAuMiAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzJdWzFdW25dID0gbHJpbnQoMC4zMCAqICgxIDw8IDE0KSk7CisgICAgICAgIGNvZWZmWzJdWzJdW25dID0gbHJpbnQoMC45MCAqICgxIDw8IDE0KSk7CisgICAgfQorICAgIGlmIChjaGVja19mdW5jKGRzcC5tdWx0aXBseTN4MywgImZmX2NvbG9yc3BhY2Vkc3BfbXVsdGlwbHkzeDMiKSkgeworICAgICAgICByYW5kb21pemVfYnVmZmVycygpOworICAgICAgICBtZW1jcHkoZHN0MV95LCBkc3QwX3ksIFcgKiBIICogc2l6ZW9mKCpkc3QxX3kpKTsKKyAgICAgICAgbWVtY3B5KGRzdDFfdSwgZHN0MF91LCBXICogSCAqIHNpemVvZigqZHN0MV91KSk7CisgICAgICAgIG1lbWNweShkc3QxX3YsIGRzdDBfdiwgVyAqIEggKiBzaXplb2YoKmRzdDFfdikpOworICAgICAgICBjYWxsX3JlZihkc3QwLCBXLCBXLCBILCBjb2VmZik7CisgICAgICAgIGNhbGxfbmV3KGRzdDEsIFcsIFcsIEgsIGNvZWZmKTsKKyAgICAgICAgaWYgKG1lbWNtcChkc3QwWzBdLCBkc3QxWzBdLCBIICogVyAqIHNpemVvZigqZHN0MF95KSkgfHwKKyAgICAgICAgICAgIG1lbWNtcChkc3QwWzFdLCBkc3QxWzFdLCBIICogVyAqIHNpemVvZigqZHN0MF91KSkgfHwKKyAgICAgICAgICAgIG1lbWNtcChkc3QwWzJdLCBkc3QxWzJdLCBIICogVyAqIHNpemVvZigqZHN0MF92KSkpIHsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcG9ydCgibXVsdGlwbHkzeDMiKTsKK30KKwordm9pZCBjaGVja2FzbV9jaGVja19jb2xvcnNwYWNlKHZvaWQpCit7CisgICAgY2hlY2tfeXV2Mnl1digpOworICAgIGNoZWNrX3l1djJyZ2IoKTsKKyAgICBjaGVja19yZ2IyeXV2KCk7CisgICAgY2hlY2tfbXVsdGlwbHkzeDMoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL3ZmX2hmbGlwLmMgYi90ZXN0cy9jaGVja2FzbS92Zl9oZmxpcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjRkMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2FzbS92Zl9oZmxpcC5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBGRm1wZWcuCisgKgorICogRkZtcGVnIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIEZGbXBlZzsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAiY2hlY2thc20uaCIKKyNpbmNsdWRlICJsaWJhdmZpbHRlci9oZmxpcC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2RlZmluZSBXSURUSCAyNTYKKyNkZWZpbmUgV0lEVEhfUEFEREVEIDI1NiArIDMyCisKKyNkZWZpbmUgcmFuZG9taXplX2J1ZmZlcnMoYnVmLCBzaXplKSAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDhfdCAqdG1wX2J1ZiA9ICh1aW50OF90ICopYnVmO1wKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHNpemU7IGorKykgICAgICAgIFwKKyAgICAgICAgICAgIHRtcF9idWZbal0gPSBybmQoKSAmIDB4RkY7ICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBjaGVja19oZmxpcChpbnQgc3RlcCwgY29uc3QgY2hhciAqIHJlcG9ydF9uYW1lKXsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIHNyYywgICAgIFtXSURUSF9QQURERURdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdF9yZWYsIFtXSURUSF9QQURERURdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGRzdF9uZXcsIFtXSURUSF9QQURERURdKTsKKyAgICBpbnQgdyA9IFdJRFRIOworICAgIGludCBpOworICAgIGludCBzdGVwX2FycmF5WzRdID0gezEsIDEsIDEsIDF9OworICAgIEZsaXBDb250ZXh0IHM7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgY29uc3QgdWludDhfdCAqc3JjLCB1aW50OF90ICpkc3QsIGludCB3KTsKKworICAgIG1lbXNldChzcmMsICAgICAwLCBXSURUSF9QQURERUQpOworICAgIG1lbXNldChkc3RfcmVmLCAwLCBXSURUSF9QQURERUQpOworICAgIG1lbXNldChkc3RfbmV3LCAwLCBXSURUSF9QQURERUQpOworICAgIHJhbmRvbWl6ZV9idWZmZXJzKHNyYywgV0lEVEhfUEFEREVEKTsKKworICAgIGlmIChzdGVwID09IDIpIHsKKyAgICAgICAgdyAvPSAyOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAgICAgICAgICAgc3RlcF9hcnJheVtpXSA9IHN0ZXA7CisgICAgfQorCisgICAgZmZfaGZsaXBfaW5pdCgmcywgc3RlcF9hcnJheSwgNCk7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhzLmZsaXBfbGluZVswXSwgImhmbGlwXyVzIiwgcmVwb3J0X25hbWUpKSB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCB3OyBpKyspIHsKKyAgICAgICAgICAgIGNhbGxfcmVmKHNyYyArICh3IC0gMSkgKiBzdGVwLCBkc3RfcmVmLCBpKTsKKyAgICAgICAgICAgIGNhbGxfbmV3KHNyYyArICh3IC0gMSkgKiBzdGVwLCBkc3RfbmV3LCBpKTsKKyAgICAgICAgICAgIGlmIChtZW1jbXAoZHN0X3JlZiwgZHN0X25ldywgaSAqIHN0ZXApKQorICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgICAgICBiZW5jaF9uZXcoc3JjICsgKHcgLSAxKSAqIHN0ZXAsIGRzdF9uZXcsIHcpOworICAgIH0KK30KK3ZvaWQgY2hlY2thc21fY2hlY2tfdmZfaGZsaXAodm9pZCkKK3sKKyAgICBjaGVja19oZmxpcCgxLCAiYnl0ZSIpOworICAgIHJlcG9ydCgiaGZsaXBfYnl0ZSIpOworCisgICAgY2hlY2tfaGZsaXAoMiwgInNob3J0Iik7CisgICAgcmVwb3J0KCJoZmxpcF9zaG9ydCIpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvY2hlY2thc20vdmZfdGhyZXNob2xkLmMgYi90ZXN0cy9jaGVja2FzbS92Zl90aHJlc2hvbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTJmYzBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvY2hlY2thc20vdmZfdGhyZXNob2xkLmMKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJjaGVja2FzbS5oIgorI2luY2x1ZGUgImxpYmF2ZmlsdGVyL3RocmVzaG9sZC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2RlZmluZSBXSURUSCAyNTYKKyNkZWZpbmUgV0lEVEhfUEFEREVEIDI1NiArIDMyCisKKyNkZWZpbmUgcmFuZG9taXplX2J1ZmZlcnMoYnVmLCBzaXplKSAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICB1aW50OF90ICp0bXBfYnVmID0gKHVpbnQ4X3QgKilidWY7XAorICAgICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyBqKyspICAgICAgICBcCisgICAgICAgICAgIHRtcF9idWZbal0gPSBybmQoKSAmIDB4RkY7ICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBjaGVja190aHJlc2hvbGQoaW50IGRlcHRoKXsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIGluICAgICAgICwgW1dJRFRIX1BBRERFRF0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgdGhyZXNob2xkLCBbV0lEVEhfUEFEREVEXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBtaW4gICAgICAsIFtXSURUSF9QQURERURdKTsKKyAgICBMT0NBTF9BTElHTkVEXzMyKHVpbnQ4X3QsIG1heCAgICAgICwgW1dJRFRIX1BBRERFRF0pOworICAgIExPQ0FMX0FMSUdORURfMzIodWludDhfdCwgb3V0X3JlZiAgLCBbV0lEVEhfUEFEREVEXSk7CisgICAgTE9DQUxfQUxJR05FRF8zMih1aW50OF90LCBvdXRfbmV3ICAsIFtXSURUSF9QQURERURdKTsKKyAgICBwdHJkaWZmX3QgbGluZV9zaXplID0gV0lEVEhfUEFEREVEOworICAgIGludCB3ID0gV0lEVEg7CisKKyAgICBkZWNsYXJlX2Z1bmModm9pZCwgY29uc3QgdWludDhfdCAqaW4sIGNvbnN0IHVpbnQ4X3QgKnRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWluLCBjb25zdCB1aW50OF90ICptYXgsIHVpbnQ4X3QgKm91dCwKKyAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGlsaW5lc2l6ZSwgcHRyZGlmZl90IHRsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgcHRyZGlmZl90IGZsaW5lc2l6ZSwgcHRyZGlmZl90IHNsaW5lc2l6ZSwKKyAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG9saW5lc2l6ZSwgaW50IHcsIGludCBoKTsKKworICAgIFRocmVzaG9sZENvbnRleHQgczsKKyAgICBzLmRlcHRoID0gZGVwdGg7CisgICAgZmZfdGhyZXNob2xkX2luaXQoJnMpOworCisgICAgbWVtc2V0KGluLCAgICAgMCwgV0lEVEhfUEFEREVEKTsKKyAgICBtZW1zZXQodGhyZXNob2xkLCAwLCBXSURUSF9QQURERUQpOworICAgIG1lbXNldChtaW4sIDAsIFdJRFRIX1BBRERFRCk7CisgICAgbWVtc2V0KG1heCwgMCwgV0lEVEhfUEFEREVEKTsKKyAgICBtZW1zZXQob3V0X3JlZiwgMCwgV0lEVEhfUEFEREVEKTsKKyAgICBtZW1zZXQob3V0X25ldywgMCwgV0lEVEhfUEFEREVEKTsKKyAgICByYW5kb21pemVfYnVmZmVycyhpbiwgV0lEVEgpOworICAgIHJhbmRvbWl6ZV9idWZmZXJzKHRocmVzaG9sZCwgV0lEVEgpOworICAgIHJhbmRvbWl6ZV9idWZmZXJzKG1pbiwgV0lEVEgpOworICAgIHJhbmRvbWl6ZV9idWZmZXJzKG1heCwgV0lEVEgpOworCisgICAgaWYgKGRlcHRoID09IDE2KQorICAgICAgICB3IC89IDI7CisKKyAgICBpZiAoY2hlY2tfZnVuYyhzLnRocmVzaG9sZCwgInRocmVzaG9sZCVkIiwgZGVwdGgpKSB7CisgICAgICAgIGNhbGxfcmVmKGluLCB0aHJlc2hvbGQsIG1pbiwgbWF4LCBvdXRfcmVmLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgdywgMSk7CisgICAgICAgIGNhbGxfbmV3KGluLCB0aHJlc2hvbGQsIG1pbiwgbWF4LCBvdXRfbmV3LCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgdywgMSk7CisgICAgICAgIGlmIChtZW1jbXAob3V0X3JlZiwgb3V0X25ldywgV0lEVEgpKQorICAgICAgICAgICAgZmFpbCgpOworICAgICAgICBiZW5jaF9uZXcoaW4sIHRocmVzaG9sZCwgbWluLCBtYXgsIG91dF9uZXcsIGxpbmVfc2l6ZSwgbGluZV9zaXplLCBsaW5lX3NpemUsIGxpbmVfc2l6ZSwgbGluZV9zaXplLCB3LCAxKTsKKyAgICB9Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfdmZfdGhyZXNob2xkKHZvaWQpCit7CisgICAgY2hlY2tfdGhyZXNob2xkKDgpOworICAgIHJlcG9ydCgidGhyZXNob2xkOCIpOworCisgICAgY2hlY2tfdGhyZXNob2xkKDE2KTsKKyAgICByZXBvcnQoInRocmVzaG9sZDE2Iik7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS92cDhkc3AuYyBiL3Rlc3RzL2NoZWNrYXNtL3ZwOGRzcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5M2Y3MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9jaGVja2FzbS92cDhkc3AuYwpAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiBNYXJ0aW4gU3RvcnNqbworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvdnA4ZHNwLmgiCisKKyNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgorCisjaW5jbHVkZSAiY2hlY2thc20uaCIKKworI2RlZmluZSBQSVhFTF9TVFJJREUgMTYKKworI2RlZmluZSByYW5kb21pemVfYnVmZmVycyhzcmMsIGRzdCwgc3RyaWRlLCBjb2VmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHgsIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IgKHkgPSAwOyB5IDwgNDsgeSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBVl9XTjMyQSgoc3JjKSArIHkgKiAoc3RyaWRlKSwgcm5kKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFWX1dOMzJBKChkc3QpICsgeSAqIChzdHJpZGUpLCBybmQoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7IHgrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKGNvZWYpW3kgKiA0ICsgeF0gPSAoc3JjKVt5ICogKHN0cmlkZSkgKyB4XSAtICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkc3QpW3kgKiAoc3RyaWRlKSArIHhdOyAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZGN0NHg0KGludDE2X3QgKmNvZWYpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgYTEgPSAoY29lZltpKjQgKyAwXSArIGNvZWZbaSo0ICsgM10pICogODsKKyAgICAgICAgY29uc3QgaW50IGIxID0gKGNvZWZbaSo0ICsgMV0gKyBjb2VmW2kqNCArIDJdKSAqIDg7CisgICAgICAgIGNvbnN0IGludCBjMSA9IChjb2VmW2kqNCArIDFdIC0gY29lZltpKjQgKyAyXSkgKiA4OworICAgICAgICBjb25zdCBpbnQgZDEgPSAoY29lZltpKjQgKyAwXSAtIGNvZWZbaSo0ICsgM10pICogODsKKyAgICAgICAgY29lZltpKjQgKyAwXSA9ICBhMSArIGIxOworICAgICAgICBjb2VmW2kqNCArIDFdID0gKGMxICogMjIxNyArIGQxICogNTM1MiArIDE0NTAwKSA+PiAxMjsKKyAgICAgICAgY29lZltpKjQgKyAyXSA9ICBhMSAtIGIxOworICAgICAgICBjb2VmW2kqNCArIDNdID0gKGQxICogMjIxNyAtIGMxICogNTM1MiArICA3NTAwKSA+PiAxMjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBjb25zdCBpbnQgYTEgPSBjb2VmW2kgKyAwKjRdICsgY29lZltpICsgMyo0XTsKKyAgICAgICAgY29uc3QgaW50IGIxID0gY29lZltpICsgMSo0XSArIGNvZWZbaSArIDIqNF07CisgICAgICAgIGNvbnN0IGludCBjMSA9IGNvZWZbaSArIDEqNF0gLSBjb2VmW2kgKyAyKjRdOworICAgICAgICBjb25zdCBpbnQgZDEgPSBjb2VmW2kgKyAwKjRdIC0gY29lZltpICsgMyo0XTsKKyAgICAgICAgY29lZltpICsgMCo0XSA9ICAoYTEgKyBiMSArIDcpID4+IDQ7CisgICAgICAgIGNvZWZbaSArIDEqNF0gPSAoKGMxICogMjIxNyArIGQxICogNTM1MiArIDEyMDAwKSA+PiAxNikgKyAhIWQxOworICAgICAgICBjb2VmW2kgKyAyKjRdID0gIChhMSAtIGIxICsgNykgPj4gNDsKKyAgICAgICAgY29lZltpICsgMyo0XSA9ICAoZDEgKiAyMjE3IC0gYzEgKiA1MzUyICsgNTEwMDApID4+IDE2OworICAgIH0KK30KKworc3RhdGljIHZvaWQgd2h0NHg0KGludDE2X3QgKmNvZWYpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpbnQgYTEgPSBjb2VmWzAgKiA0ICsgaV07CisgICAgICAgIGludCBiMSA9IGNvZWZbMSAqIDQgKyBpXTsKKyAgICAgICAgaW50IGMxID0gY29lZlsyICogNCArIGldOworICAgICAgICBpbnQgZDEgPSBjb2VmWzMgKiA0ICsgaV07CisgICAgICAgIGludCBlMTsKKyAgICAgICAgYTEgKz0gYjE7CisgICAgICAgIGQxIC09IGMxOworICAgICAgICBlMSA9IChhMSAtIGQxKSA+PiAxOworICAgICAgICBiMSA9IGUxIC0gYjE7CisgICAgICAgIGMxID0gZTEgLSBjMTsKKyAgICAgICAgYTEgLT0gYzE7CisgICAgICAgIGQxICs9IGIxOworICAgICAgICBjb2VmWzAgKiA0ICsgaV0gPSBhMTsKKyAgICAgICAgY29lZlsxICogNCArIGldID0gYzE7CisgICAgICAgIGNvZWZbMiAqIDQgKyBpXSA9IGQxOworICAgICAgICBjb2VmWzMgKiA0ICsgaV0gPSBiMTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgICBpbnQgYTEgPSBjb2VmW2kgKiA0ICsgMF07CisgICAgICAgIGludCBiMSA9IGNvZWZbaSAqIDQgKyAxXTsKKyAgICAgICAgaW50IGMxID0gY29lZltpICogNCArIDJdOworICAgICAgICBpbnQgZDEgPSBjb2VmW2kgKiA0ICsgM107CisgICAgICAgIGludCBlMTsKKyAgICAgICAgYTEgKz0gYjE7CisgICAgICAgIGQxIC09IGMxOworICAgICAgICBlMSA9IChhMSAtIGQxKSA+PiAxOworICAgICAgICBiMSA9IGUxIC0gYjE7CisgICAgICAgIGMxID0gZTEgLSBjMTsKKyAgICAgICAgYTEgLT0gYzE7CisgICAgICAgIGQxICs9IGIxOworICAgICAgICBjb2VmW2kgKiA0ICsgMF0gPSBhMSAqIDI7CisgICAgICAgIGNvZWZbaSAqIDQgKyAxXSA9IGMxICogMjsKKyAgICAgICAgY29lZltpICogNCArIDJdID0gZDEgKiAyOworICAgICAgICBjb2VmW2kgKiA0ICsgM10gPSBiMSAqIDI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjaGVja19pZGN0KHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBzcmMsICBbNCAqIDRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGRzdCwgIFs0ICogNF0pOworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgZHN0MCwgWzQgKiA0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBkc3QxLCBbNCAqIDRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGNvZWYsIFs0ICogNF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgc3ViY29lZjAsIFs0ICogNF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgc3ViY29lZjEsIFs0ICogNF0pOworICAgIFZQOERTUENvbnRleHQgZDsKKyAgICBpbnQgZGM7CisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICpkc3QsIGludDE2X3QgKmJsb2NrLCBwdHJkaWZmX3Qgc3RyaWRlKTsKKworICAgIGZmX3ZwOGRzcF9pbml0KCZkKTsKKyAgICByYW5kb21pemVfYnVmZmVycyhzcmMsIGRzdCwgNCwgY29lZik7CisKKyAgICBkY3Q0eDQoY29lZik7CisKKyAgICBmb3IgKGRjID0gMDsgZGMgPD0gMTsgZGMrKykgeworICAgICAgICB2b2lkICgqaWRjdCkodWludDhfdCAqLCBpbnQxNl90ICosIHB0cmRpZmZfdCkgPSBkYyA/IGQudnA4X2lkY3RfZGNfYWRkIDogZC52cDhfaWRjdF9hZGQ7CisKKyAgICAgICAgaWYgKGNoZWNrX2Z1bmMoaWRjdCwgInZwOF9pZGN0XyVzYWRkIiwgZGMgPyAiZGNfIiA6ICIiKSkgeworICAgICAgICAgICAgaWYgKGRjKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KHN1YmNvZWYwLCAwLCA0ICogNCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICAgICAgc3ViY29lZjBbMF0gPSBjb2VmWzBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoc3ViY29lZjAsIGNvZWYsIDQgKiA0ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShkc3QwLCBkc3QsIDQgKiA0KTsKKyAgICAgICAgICAgIG1lbWNweShkc3QxLCBkc3QsIDQgKiA0KTsKKyAgICAgICAgICAgIG1lbWNweShzdWJjb2VmMSwgc3ViY29lZjAsIDQgKiA0ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIC8vIE5vdGUsIHRoaXMgdXNlcyBhIHBpeGVsIHN0cmlkZSBvZiA0LCBldmVuIHRob3VnaCB0aGUgcmVhbCBkZWNvZGVyIHVzZXMgYSBzdHJpZGUgYXMgYQorICAgICAgICAgICAgLy8gbXVsdGlwbGUgb2YgMTYuIElmIG9wdGltaXphdGlvbnMgd2FudCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGF0LCB0aGlzIHRlc3QgbmVlZHMgdG8gYmUKKyAgICAgICAgICAgIC8vIHVwZGF0ZWQgdG8gbWFrZSBpdCBtb3JlIGxpa2UgdGhlIGgyNjRkc3AgdGVzdHMuCisgICAgICAgICAgICBjYWxsX3JlZihkc3QwLCBzdWJjb2VmMCwgNCk7CisgICAgICAgICAgICBjYWxsX25ldyhkc3QxLCBzdWJjb2VmMSwgNCk7CisgICAgICAgICAgICBpZiAobWVtY21wKGRzdDAsIGRzdDEsIDQgKiA0KSB8fAorICAgICAgICAgICAgICAgIG1lbWNtcChzdWJjb2VmMCwgc3ViY29lZjEsIDQgKiA0ICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisKKyAgICAgICAgICAgIGJlbmNoX25ldyhkc3QxLCBzdWJjb2VmMSwgNCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2lkY3RfZGM0KHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBzcmMsICBbNCAqIDQgKiA0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBkc3QsICBbNCAqIDQgKiA0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBkc3QwLCBbNCAqIDQgKiA0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBkc3QxLCBbNCAqIDQgKiA0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBjb2VmLCBbNF0sIFs0ICogNF0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgc3ViY29lZjAsIFs0XSwgWzQgKiA0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBzdWJjb2VmMSwgWzRdLCBbNCAqIDRdKTsKKyAgICBWUDhEU1BDb250ZXh0IGQ7CisgICAgaW50IGksIGNocm9tYTsKKyAgICBkZWNsYXJlX2Z1bmNfZW1tcyhBVl9DUFVfRkxBR19NTVgsIHZvaWQsIHVpbnQ4X3QgKmRzdCwgaW50MTZfdCBibG9ja1s0XVsxNl0sIHB0cmRpZmZfdCBzdHJpZGUpOworCisgICAgZmZfdnA4ZHNwX2luaXQoJmQpOworCisgICAgZm9yIChjaHJvbWEgPSAwOyBjaHJvbWEgPD0gMTsgY2hyb21hKyspIHsKKyAgICAgICAgdm9pZCAoKmlkY3Q0ZGMpKHVpbnQ4X3QgKiwgaW50MTZfdFs0XVsxNl0sIHB0cmRpZmZfdCkgPSBjaHJvbWEgPyBkLnZwOF9pZGN0X2RjX2FkZDR1diA6IGQudnA4X2lkY3RfZGNfYWRkNHk7CisgICAgICAgIGlmIChjaGVja19mdW5jKGlkY3Q0ZGMsICJ2cDhfaWRjdF9kY19hZGQ0JXMiLCBjaHJvbWEgPyAidXYiIDogInkiKSkgeworICAgICAgICAgICAgcHRyZGlmZl90IHN0cmlkZSA9IGNocm9tYSA/IDggOiAxNjsKKyAgICAgICAgICAgIGludCB3ICAgICAgPSBjaHJvbWEgPyAyIDogNDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgYmxvY2t4ID0gNCAqIChpICUgdyk7CisgICAgICAgICAgICAgICAgaW50IGJsb2NreSA9IDQgKiAoaSAvIHcpOworICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKHNyYyArIHN0cmlkZSAqIGJsb2NreSArIGJsb2NreCwgZHN0ICsgc3RyaWRlICogYmxvY2t5ICsgYmxvY2t4LCBzdHJpZGUsIGNvZWZbaV0pOworICAgICAgICAgICAgICAgIGRjdDR4NChjb2VmW2ldKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJmNvZWZbaV1bMV0sIDAsIDE1ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KGRzdDAsIGRzdCwgNCAqIDQgKiA0KTsKKyAgICAgICAgICAgIG1lbWNweShkc3QxLCBkc3QsIDQgKiA0ICogNCk7CisgICAgICAgICAgICBtZW1jcHkoc3ViY29lZjAsIGNvZWYsIDQgKiA0ICogNCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICBtZW1jcHkoc3ViY29lZjEsIGNvZWYsIDQgKiA0ICogNCAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICBjYWxsX3JlZihkc3QwLCBzdWJjb2VmMCwgc3RyaWRlKTsKKyAgICAgICAgICAgIGNhbGxfbmV3KGRzdDEsIHN1YmNvZWYxLCBzdHJpZGUpOworICAgICAgICAgICAgaWYgKG1lbWNtcChkc3QwLCBkc3QxLCA0ICogNCAqIDQpIHx8CisgICAgICAgICAgICAgICAgbWVtY21wKHN1YmNvZWYwLCBzdWJjb2VmMSwgNCAqIDQgKiA0ICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBiZW5jaF9uZXcoZHN0MSwgc3ViY29lZjEsIHN0cmlkZSk7CisgICAgICAgIH0KKyAgICB9CisKK30KKworc3RhdGljIHZvaWQgY2hlY2tfbHVtYV9kY193aHQodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGRjLCBbNCAqIDRdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KGludDE2X3QsIGRjMCwgWzQgKiA0XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNihpbnQxNl90LCBkYzEsIFs0ICogNF0pOworICAgIGludDE2X3QgYmxvY2tbNF1bNF1bMTZdOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgYmxvY2swLCBbNF0sIFs0XVsxNl0pOworICAgIExPQ0FMX0FMSUdORURfMTYoaW50MTZfdCwgYmxvY2sxLCBbNF0sIFs0XVsxNl0pOworICAgIFZQOERTUENvbnRleHQgZDsKKyAgICBpbnQgZGNfb25seTsKKyAgICBpbnQgYmxvY2t4LCBibG9ja3k7CisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCBpbnQxNl90IGJsb2NrWzRdWzRdWzE2XSwgaW50MTZfdCBkY1sxNl0pOworCisgICAgZmZfdnA4ZHNwX2luaXQoJmQpOworCisgICAgZm9yIChibG9ja3kgPSAwOyBibG9ja3kgPCA0OyBibG9ja3krKykgeworICAgICAgICBmb3IgKGJsb2NreCA9IDA7IGJsb2NreCA8IDQ7IGJsb2NreCsrKSB7CisgICAgICAgICAgICB1aW50OF90IHNyY1sxNl0sIGRzdFsxNl07CisgICAgICAgICAgICByYW5kb21pemVfYnVmZmVycyhzcmMsIGRzdCwgNCwgYmxvY2tbYmxvY2t5XVtibG9ja3hdKTsKKworICAgICAgICAgICAgZGN0NHg0KGJsb2NrW2Jsb2NreV1bYmxvY2t4XSk7CisgICAgICAgICAgICBkY1tibG9ja3kgKiA0ICsgYmxvY2t4XSA9IGJsb2NrW2Jsb2NreV1bYmxvY2t4XVswXTsKKyAgICAgICAgICAgIGJsb2NrW2Jsb2NreV1bYmxvY2t4XVswXSA9IHJuZCgpOworICAgICAgICB9CisgICAgfQorICAgIHdodDR4NChkYyk7CisKKyAgICBmb3IgKGRjX29ubHkgPSAwOyBkY19vbmx5IDw9IDE7IGRjX29ubHkrKykgeworICAgICAgICB2b2lkICgqaWRjdCkoaW50MTZfdCBbNF1bNF1bMTZdLCBpbnQxNl90IFsxNl0pID0gZGNfb25seSA/IGQudnA4X2x1bWFfZGNfd2h0X2RjIDogZC52cDhfbHVtYV9kY193aHQ7CisKKyAgICAgICAgaWYgKGNoZWNrX2Z1bmMoaWRjdCwgInZwOF9sdW1hX2RjX3dodCVzIiwgZGNfb25seSA/ICJfZGMiIDogIiIpKSB7CisgICAgICAgICAgICBpZiAoZGNfb25seSkgeworICAgICAgICAgICAgICAgIG1lbXNldChkYzAsIDAsIDE2ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgICAgICBkYzBbMF0gPSBkY1swXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRjMCwgZGMsIDE2ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShkYzEsIGRjMCwgMTYgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtY3B5KGJsb2NrMCwgYmxvY2ssIDQgKiA0ICogMTYgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtY3B5KGJsb2NrMSwgYmxvY2ssIDQgKiA0ICogMTYgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgY2FsbF9yZWYoYmxvY2swLCBkYzApOworICAgICAgICAgICAgY2FsbF9uZXcoYmxvY2sxLCBkYzEpOworICAgICAgICAgICAgaWYgKG1lbWNtcChibG9jazAsIGJsb2NrMSwgNCAqIDQgKiAxNiAqIHNpemVvZihpbnQxNl90KSkgfHwKKyAgICAgICAgICAgICAgICBtZW1jbXAoZGMwLCBkYzEsIDE2ICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBiZW5jaF9uZXcoYmxvY2sxLCBkYzEpOworICAgICAgICB9CisgICAgfQorfQorCisjZGVmaW5lIFNSQ19CVUZfU1RSSURFIDMyCisjZGVmaW5lIFNSQ19CVUZfU0laRSAoKChzaXplIDw8IChzaXplIDwgMTYpKSArIDUpICogU1JDX0JVRl9TVFJJREUpCisvLyBUaGUgbWMgc3VicGl4ZWwgaW50ZXJwb2xhdGlvbiBmaWx0ZXIgbmVlZHMgdGhlIDIgcHJldmlvdXMgcGl4ZWxzIGluIGVpdGhlcgorLy8gZGlyZWN0aW9uLCB0aGUgKzEgaXMgdG8gbWFrZSBzdXJlIHRoZSBhY3R1YWwgbG9hZCBhZGRyZXNzZXMgYWx3YXlzIGFyZQorLy8gdW5hbGlnbmVkLgorI2RlZmluZSBzcmMgKGJ1ZiArIDIgKiBTUkNfQlVGX1NUUklERSArIDIgKyAxKQorCisjdW5kZWYgcmFuZG9taXplX2J1ZmZlcnMKKyNkZWZpbmUgcmFuZG9taXplX2J1ZmZlcnMoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yIChrID0gMDsgayA8IFNSQ19CVUZfU0laRTsgayArPSA0KSB7ICAgICAgICAgICBcCisgICAgICAgICAgICBBVl9XTjMyQShidWYgKyBrLCBybmQoKSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBjaGVja19tYyh2b2lkKQoreworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgYnVmLCBbMzIgKiAzMl0pOworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgZHN0MCwgWzE2ICogMTZdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGRzdDEsIFsxNiAqIDE2XSk7CisgICAgVlA4RFNQQ29udGV4dCBkOworICAgIGludCB0eXBlLCBrLCBkeCwgZHk7CisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICosIHB0cmRpZmZfdCwgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCwgaW50LCBpbnQpOworCisgICAgZmZfdnA3OGRzcF9pbml0KCZkKTsKKworICAgIGZvciAodHlwZSA9IDA7IHR5cGUgPCAyOyB0eXBlKyspIHsKKyAgICAgICAgdnA4X21jX2Z1bmMgKCp0YWIpWzNdWzNdID0gdHlwZSA/IGQucHV0X3ZwOF9iaWxpbmVhcl9waXhlbHNfdGFiIDogZC5wdXRfdnA4X2VwZWxfcGl4ZWxzX3RhYjsKKyAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykgeworICAgICAgICAgICAgaW50IGhzaXplICA9IGsgLyAzOworICAgICAgICAgICAgaW50IHNpemUgICA9IDE2ID4+IGhzaXplOworICAgICAgICAgICAgaW50IGhlaWdodCA9IChzaXplIDw8IDEpID4+IChrICUgMyk7CisgICAgICAgICAgICBmb3IgKGR5ID0gMDsgZHkgPCAzOyBkeSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChkeCA9IDA7IGR4IDwgMzsgZHgrKykgeworICAgICAgICAgICAgICAgICAgICBjaGFyIHN0clsxMDBdOworICAgICAgICAgICAgICAgICAgICBpZiAoZHggfHwgZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqZHhfbmFtZXNbXSA9IHsgIiIsICJoNCIsICJoNiIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqZHlfbmFtZXNbXSA9IHsgIiIsICJ2NCIsICJ2NiIgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiZXBlbCVkXyVzJXMiLCBzaXplLCBkeF9uYW1lc1tkeF0sIGR5X25hbWVzW2R5XSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICJiaWxpbiVkXyVzJXMiLCBzaXplLCBkeCA/ICJoIiA6ICIiLCBkeSA/ICJ2IiA6ICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICJwaXhlbHMlZCIsIHNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja19mdW5jKHRhYltoc2l6ZV1bZHldW2R4XSwgInZwOF9wdXRfJXMiLCBzdHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbXgsIG15OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXggPSBkeCA9PSAyID8gMiArIDIgKiAocm5kKCkgJSAzKSA6IGR4ID09IDEgPyAxICsgMiAqIChybmQoKSAlIDQpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSA9IGR5ID09IDIgPyAyICsgMiAqIChybmQoKSAlIDMpIDogZHkgPT0gMSA/IDEgKyAyICogKHJuZCgpICUgNCkgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteCA9IGR4ID8gMSArIChybmQoKSAlIDcpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSA9IGR5ID8gMSArIChybmQoKSAlIDcpIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAtMjsgaSA8PSAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsID0gKGkgPT0gLTEgfHwgaSA9PSAyKSA/IDAgOiAweGZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBwaXhlbHMgaW4gdGhlIGZpcnN0IHJvdyBhbmQgY29sdW1uIHRvIHRoZSBtYXhpbXVtIHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGVzdCBmb3IgcG90ZW50aWFsIG92ZXJmbG93cyBpbiB0aGUgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tpICAgICAgICAgICAgICAgICBdID0gdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tpICogU1JDX0JVRl9TVFJJREVdID0gdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9yZWYoZHN0MCwgc2l6ZSwgc3JjLCBTUkNfQlVGX1NUUklERSwgaGVpZ2h0LCBteCwgbXkpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF9uZXcoZHN0MSwgc2l6ZSwgc3JjLCBTUkNfQlVGX1NUUklERSwgaGVpZ2h0LCBteCwgbXkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChkc3QwLCBkc3QxLCBzaXplICogaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBiZW5jaF9uZXcoZHN0MSwgc2l6ZSwgc3JjLCBTUkNfQlVGX1NUUklERSwgaGVpZ2h0LCBteCwgbXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjdW5kZWYgcmFuZG9taXplX2J1ZmZlcnMKKworI2RlZmluZSBzZXRweChhLCBiLCBjKSBidWZbKGEpICsgKGIpICoganN0cmlkZV0gPSBhdl9jbGlwX3VpbnQ4KGMpCisvLyBTZXQgdGhlIHBpeGVsIHRvIGMgKy8tIFswLGRdCisjZGVmaW5lIHNldGR4KGEsIGIsIGMsIGQpIHNldHB4KGEsIGIsIGMgLSAoZCkgKyAocm5kKCkgJSAoKGQpICogMiArIDEpKSkKKy8vIFNldCB0aGUgcGl4ZWwgdG8gYyArLy0gW2QsZCtlXSAobWFraW5nIHN1cmUgaXQgd29uJ3QgYmUgY2xpcHBlZCkKKyNkZWZpbmUgc2V0ZHgyKGEsIGIsIG8sIGMsIGQsIGUpIHNldHB4KGEsIGIsIG8gPSBjICsgKChkKSArIChybmQoKSAlIChlKSkpICogKGMgPj0gMTI4ID8gLTEgOiAxKSkKKworc3RhdGljIHZvaWQgcmFuZG9taXplX2xvb3BmaWx0ZXJfYnVmZmVycyhpbnQgbGluZW9mZiwgaW50IHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpciwgaW50IGZsaW1fRSwgaW50IGZsaW1fSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhldl90aHJlc2gsIHVpbnQ4X3QgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcmNlX2hldikKK3sKKyAgICB1aW50MzJfdCBtYXNrID0gMHhmZjsKKyAgICBpbnQgb2ZmID0gZGlyID8gbGluZW9mZiA6IGxpbmVvZmYgKiBzdHI7CisgICAgaW50IGlzdHJpZGUgPSBkaXIgPyAxIDogc3RyOworICAgIGludCBqc3RyaWRlID0gZGlyID8gc3RyIDogMTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAyKSB7CisgICAgICAgIC8vIFJvdyAwIHdpbGwgdHJpZ2dlciBoZXYgZm9yIHEwL3ExLCByb3cgMiB3aWxsIHRyaWdnZXIgaGV2IGZvciBwMC9wMSwKKyAgICAgICAgLy8gcm93cyA0IGFuZCA2IHdpbGwgbm90IHRyaWdnZXIgaGV2LgorICAgICAgICAvLyBmb3JjZV9oZXYgMSB3aWxsIG1ha2Ugc3VyZSBhbGwgcm93cyB0cmlnZ2VyIGhldiwgd2hpbGUgZm9yY2VfaGV2IC0xCisgICAgICAgIC8vIG1ha2VzIG5vbmUgb2YgdGhlbSB0cmlnZ2VyIGl0LgorICAgICAgICBpbnQgaWR4ID0gb2ZmICsgaSAqIGlzdHJpZGUsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTI7CisgICAgICAgIHNldHB4KGlkeCwgIDAsIHEwID0gcm5kKCkgJiBtYXNrKTsKKyAgICAgICAgaWYgKGkgPT0gMCAmJiBmb3JjZV9oZXYgPj0gMCB8fCBmb3JjZV9oZXYgPiAwKQorICAgICAgICAgICAgc2V0ZHgyKGlkeCwgMSwgcTEsIHEwLCBoZXZfdGhyZXNoICsgMSwgZmxpbV9JIC0gaGV2X3RocmVzaCAtIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRkeChpZHgsICAxLCBxMSA9IHEwLCBoZXZfdGhyZXNoKTsKKyAgICAgICAgc2V0ZHgoaWR4LCAgMiwgcTIgPSBxMSwgZmxpbV9JKTsKKyAgICAgICAgc2V0ZHgoaWR4LCAgMywgcTIsICAgICAgZmxpbV9JKTsKKyAgICAgICAgc2V0ZHgoaWR4LCAtMSwgcDAgPSBxMCwgZmxpbV9FID4+IDIpOworICAgICAgICBpZiAoaSA9PSAyICYmIGZvcmNlX2hldiA+PSAwIHx8IGZvcmNlX2hldiA+IDApCisgICAgICAgICAgICBzZXRkeDIoaWR4LCAtMiwgcDEsIHAwLCBoZXZfdGhyZXNoICsgMSwgZmxpbV9JIC0gaGV2X3RocmVzaCAtIDEpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRkeChpZHgsIC0yLCBwMSA9IHAwLCBoZXZfdGhyZXNoKTsKKyAgICAgICAgc2V0ZHgoaWR4LCAtMywgcDIgPSBwMSwgZmxpbV9JKTsKKyAgICAgICAgc2V0ZHgoaWR4LCAtNCwgcDIsICAgICAgZmxpbV9JKTsKKyAgICB9Cit9CisKKy8vIEZpbGwgdGhlIGJ1ZmZlciB3aXRoIHJhbmRvbSBwaXhlbHMKK3N0YXRpYyB2b2lkIGZpbGxfbG9vcGZpbHRlcl9idWZmZXJzKHVpbnQ4X3QgKmJ1ZiwgcHRyZGlmZl90IHN0cmlkZSwgaW50IHcsIGludCBoKQoreworICAgIGludCB4LCB5OworICAgIGZvciAoeSA9IDA7IHkgPCBoOyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICBidWZbeSAqIHN0cmlkZSArIHhdID0gcm5kKCkgJiAweGZmOworfQorCisjZGVmaW5lIHJhbmRvbWl6ZV9idWZmZXJzKGJ1ZiwgbGluZW9mZiwgc3RyLCBmb3JjZV9oZXYpIFwKKyAgICByYW5kb21pemVfbG9vcGZpbHRlcl9idWZmZXJzKGxpbmVvZmYsIHN0ciwgZGlyLCBmbGltX0UsIGZsaW1fSSwgaGV2X3RocmVzaCwgYnVmLCBmb3JjZV9oZXYpCisKK3N0YXRpYyB2b2lkIGNoZWNrX2xvb3BmaWx0ZXJfMTZ5KHZvaWQpCit7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBiYXNlMCwgWzMyICsgMTYgKiAxNl0pOworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgYmFzZTEsIFszMiArIDE2ICogMTZdKTsKKyAgICBWUDhEU1BDb250ZXh0IGQ7CisgICAgaW50IGRpciwgZWRnZSwgZm9yY2VfaGV2OworICAgIGludCBmbGltX0UgPSAyMCwgZmxpbV9JID0gMTAsIGhldl90aHJlc2ggPSA3OworICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgdm9pZCwgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCwgaW50LCBpbnQpOworCisgICAgZmZfdnA4ZHNwX2luaXQoJmQpOworCisgICAgZm9yIChkaXIgPSAwOyBkaXIgPCAyOyBkaXIrKykgeworICAgICAgICBpbnQgbWlkb2ZmID0gZGlyID8gNCAqIDE2IDogNDsKKyAgICAgICAgaW50IG1pZG9mZl9hbGlnbmVkID0gZGlyID8gNCAqIDE2IDogMTY7CisgICAgICAgIHVpbnQ4X3QgKmJ1ZjAgPSBiYXNlMCArIG1pZG9mZl9hbGlnbmVkOworICAgICAgICB1aW50OF90ICpidWYxID0gYmFzZTEgKyBtaWRvZmZfYWxpZ25lZDsKKyAgICAgICAgZm9yIChlZGdlID0gMDsgZWRnZSA8IDI7IGVkZ2UrKykgeworICAgICAgICAgICAgdm9pZCAoKmZ1bmMpKHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQsIGludCwgaW50KSA9IE5VTEw7CisgICAgICAgICAgICBzd2l0Y2ggKGRpciA8PCAxIHwgZWRnZSkgeworICAgICAgICAgICAgY2FzZSAoMCA8PCAxKSB8IDA6IGZ1bmMgPSBkLnZwOF9oX2xvb3BfZmlsdGVyMTZ5OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgKDEgPDwgMSkgfCAwOiBmdW5jID0gZC52cDhfdl9sb29wX2ZpbHRlcjE2eTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICgwIDw8IDEpIHwgMTogZnVuYyA9IGQudnA4X2hfbG9vcF9maWx0ZXIxNnlfaW5uZXI7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAoMSA8PCAxKSB8IDE6IGZ1bmMgPSBkLnZwOF92X2xvb3BfZmlsdGVyMTZ5X2lubmVyOyBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaGVja19mdW5jKGZ1bmMsICJ2cDhfbG9vcF9maWx0ZXIxNnklc18lcyIsIGVkZ2UgPyAiX2lubmVyIiA6ICIiLCBkaXIgPyAidiIgOiAiaCIpKSB7CisgICAgICAgICAgICAgICAgZm9yIChmb3JjZV9oZXYgPSAtMTsgZm9yY2VfaGV2IDw9IDE7IGZvcmNlX2hldisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfbG9vcGZpbHRlcl9idWZmZXJzKGJ1ZjAgLSBtaWRvZmYsIDE2LCAxNiwgMTYpOworICAgICAgICAgICAgICAgICAgICByYW5kb21pemVfYnVmZmVycyhidWYwLCAwLCAxNiwgZm9yY2VfaGV2KTsKKyAgICAgICAgICAgICAgICAgICAgcmFuZG9taXplX2J1ZmZlcnMoYnVmMCwgOCwgMTYsIGZvcmNlX2hldik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWYxIC0gbWlkb2ZmLCBidWYwIC0gbWlkb2ZmLCAxNiAqIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbF9yZWYoYnVmMCwgMTYsIGZsaW1fRSwgZmxpbV9JLCBoZXZfdGhyZXNoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbF9uZXcoYnVmMSwgMTYsIGZsaW1fRSwgZmxpbV9JLCBoZXZfdGhyZXNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChidWYwIC0gbWlkb2ZmLCBidWYxIC0gbWlkb2ZmLCAxNiAqIDE2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsbF9sb29wZmlsdGVyX2J1ZmZlcnMoYnVmMCAtIG1pZG9mZiwgMTYsIDE2LCAxNik7CisgICAgICAgICAgICAgICAgcmFuZG9taXplX2J1ZmZlcnMoYnVmMCwgMCwgMTYsIDApOworICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKGJ1ZjAsIDgsIDE2LCAwKTsKKyAgICAgICAgICAgICAgICBiZW5jaF9uZXcoYnVmMCwgMTYsIGZsaW1fRSwgZmxpbV9JLCBoZXZfdGhyZXNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfbG9vcGZpbHRlcl84dXYodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGJhc2UwdSwgWzMyICsgMTYgKiAxNl0pOworICAgIExPQ0FMX0FMSUdORURfMTYodWludDhfdCwgYmFzZTB2LCBbMzIgKyAxNiAqIDE2XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBiYXNlMXUsIFszMiArIDE2ICogMTZdKTsKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGJhc2UxdiwgWzMyICsgMTYgKiAxNl0pOworICAgIFZQOERTUENvbnRleHQgZDsKKyAgICBpbnQgZGlyLCBlZGdlLCBmb3JjZV9oZXY7CisgICAgaW50IGZsaW1fRSA9IDIwLCBmbGltX0kgPSAxMCwgaGV2X3RocmVzaCA9IDc7CisgICAgZGVjbGFyZV9mdW5jX2VtbXMoQVZfQ1BVX0ZMQUdfTU1YLCB2b2lkLCB1aW50OF90ICosIHVpbnQ4X3QgKiwgcHRyZGlmZl90LCBpbnQsIGludCwgaW50KTsKKworICAgIGZmX3ZwOGRzcF9pbml0KCZkKTsKKworICAgIGZvciAoZGlyID0gMDsgZGlyIDwgMjsgZGlyKyspIHsKKyAgICAgICAgaW50IG1pZG9mZiA9IGRpciA/IDQgKiAxNiA6IDQ7CisgICAgICAgIGludCBtaWRvZmZfYWxpZ25lZCA9IGRpciA/IDQgKiAxNiA6IDE2OworICAgICAgICB1aW50OF90ICpidWYwdSA9IGJhc2UwdSArIG1pZG9mZl9hbGlnbmVkOworICAgICAgICB1aW50OF90ICpidWYwdiA9IGJhc2UwdiArIG1pZG9mZl9hbGlnbmVkOworICAgICAgICB1aW50OF90ICpidWYxdSA9IGJhc2UxdSArIG1pZG9mZl9hbGlnbmVkOworICAgICAgICB1aW50OF90ICpidWYxdiA9IGJhc2UxdiArIG1pZG9mZl9hbGlnbmVkOworICAgICAgICBmb3IgKGVkZ2UgPSAwOyBlZGdlIDwgMjsgZWRnZSsrKSB7CisgICAgICAgICAgICB2b2lkICgqZnVuYykodWludDhfdCAqLCB1aW50OF90ICosIHB0cmRpZmZfdCwgaW50LCBpbnQsIGludCkgPSBOVUxMOworICAgICAgICAgICAgc3dpdGNoIChkaXIgPDwgMSB8IGVkZ2UpIHsKKyAgICAgICAgICAgIGNhc2UgKDAgPDwgMSkgfCAwOiBmdW5jID0gZC52cDhfaF9sb29wX2ZpbHRlcjh1djsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICgxIDw8IDEpIHwgMDogZnVuYyA9IGQudnA4X3ZfbG9vcF9maWx0ZXI4dXY7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAoMCA8PCAxKSB8IDE6IGZ1bmMgPSBkLnZwOF9oX2xvb3BfZmlsdGVyOHV2X2lubmVyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgKDEgPDwgMSkgfCAxOiBmdW5jID0gZC52cDhfdl9sb29wX2ZpbHRlcjh1dl9pbm5lcjsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hlY2tfZnVuYyhmdW5jLCAidnA4X2xvb3BfZmlsdGVyOHV2JXNfJXMiLCBlZGdlID8gIl9pbm5lciIgOiAiIiwgZGlyID8gInYiIDogImgiKSkgeworICAgICAgICAgICAgICAgIGZvciAoZm9yY2VfaGV2ID0gLTE7IGZvcmNlX2hldiA8PSAxOyBmb3JjZV9oZXYrKykgeworICAgICAgICAgICAgICAgICAgICBmaWxsX2xvb3BmaWx0ZXJfYnVmZmVycyhidWYwdSAtIG1pZG9mZiwgMTYsIDE2LCAxNik7CisgICAgICAgICAgICAgICAgICAgIGZpbGxfbG9vcGZpbHRlcl9idWZmZXJzKGJ1ZjB2IC0gbWlkb2ZmLCAxNiwgMTYsIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgcmFuZG9taXplX2J1ZmZlcnMoYnVmMHUsIDAsIDE2LCBmb3JjZV9oZXYpOworICAgICAgICAgICAgICAgICAgICByYW5kb21pemVfYnVmZmVycyhidWYwdiwgMCwgMTYsIGZvcmNlX2hldik7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShidWYxdSAtIG1pZG9mZiwgYnVmMHUgLSBtaWRvZmYsIDE2ICogMTYpOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmMXYgLSBtaWRvZmYsIGJ1ZjB2IC0gbWlkb2ZmLCAxNiAqIDE2KTsKKworICAgICAgICAgICAgICAgICAgICBjYWxsX3JlZihidWYwdSwgYnVmMHYsIDE2LCBmbGltX0UsIGZsaW1fSSwgaGV2X3RocmVzaCk7CisgICAgICAgICAgICAgICAgICAgIGNhbGxfbmV3KGJ1ZjF1LCBidWYxdiwgMTYsIGZsaW1fRSwgZmxpbV9JLCBoZXZfdGhyZXNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lbWNtcChidWYwdSAtIG1pZG9mZiwgYnVmMXUgLSBtaWRvZmYsIDE2ICogMTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jbXAoYnVmMHYgLSBtaWRvZmYsIGJ1ZjF2IC0gbWlkb2ZmLCAxNiAqIDE2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsbF9sb29wZmlsdGVyX2J1ZmZlcnMoYnVmMHUgLSBtaWRvZmYsIDE2LCAxNiwgMTYpOworICAgICAgICAgICAgICAgIGZpbGxfbG9vcGZpbHRlcl9idWZmZXJzKGJ1ZjB2IC0gbWlkb2ZmLCAxNiwgMTYsIDE2KTsKKyAgICAgICAgICAgICAgICByYW5kb21pemVfYnVmZmVycyhidWYwdSwgMCwgMTYsIDApOworICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKGJ1ZjB2LCAwLCAxNiwgMCk7CisgICAgICAgICAgICAgICAgYmVuY2hfbmV3KGJ1ZjB1LCBidWYwdiwgMTYsIGZsaW1fRSwgZmxpbV9JLCBoZXZfdGhyZXNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tfbG9vcGZpbHRlcl9zaW1wbGUodm9pZCkKK3sKKyAgICBMT0NBTF9BTElHTkVEXzE2KHVpbnQ4X3QsIGJhc2UwLCBbMzIgKyAxNiAqIDE2XSk7CisgICAgTE9DQUxfQUxJR05FRF8xNih1aW50OF90LCBiYXNlMSwgWzMyICsgMTYgKiAxNl0pOworICAgIFZQOERTUENvbnRleHQgZDsKKyAgICBpbnQgZGlyOworICAgIGludCBmbGltX0UgPSAyMCwgZmxpbV9JID0gMzAsIGhldl90aHJlc2ggPSAwOworICAgIGRlY2xhcmVfZnVuY19lbW1zKEFWX0NQVV9GTEFHX01NWCwgdm9pZCwgdWludDhfdCAqLCBwdHJkaWZmX3QsIGludCk7CisKKyAgICBmZl92cDhkc3BfaW5pdCgmZCk7CisKKyAgICBmb3IgKGRpciA9IDA7IGRpciA8IDI7IGRpcisrKSB7CisgICAgICAgIGludCBtaWRvZmYgPSBkaXIgPyA0ICogMTYgOiA0OworICAgICAgICBpbnQgbWlkb2ZmX2FsaWduZWQgPSBkaXIgPyA0ICogMTYgOiAxNjsKKyAgICAgICAgdWludDhfdCAqYnVmMCA9IGJhc2UwICsgbWlkb2ZmX2FsaWduZWQ7CisgICAgICAgIHVpbnQ4X3QgKmJ1ZjEgPSBiYXNlMSArIG1pZG9mZl9hbGlnbmVkOworICAgICAgICB2b2lkICgqZnVuYykodWludDhfdCAqLCBwdHJkaWZmX3QsIGludCkgPSBkaXIgPyBkLnZwOF92X2xvb3BfZmlsdGVyX3NpbXBsZSA6IGQudnA4X2hfbG9vcF9maWx0ZXJfc2ltcGxlOworICAgICAgICBpZiAoY2hlY2tfZnVuYyhmdW5jLCAidnA4X2xvb3BfZmlsdGVyX3NpbXBsZV8lcyIsIGRpciA/ICJ2IiA6ICJoIikpIHsKKyAgICAgICAgICAgIGZpbGxfbG9vcGZpbHRlcl9idWZmZXJzKGJ1ZjAgLSBtaWRvZmYsIDE2LCAxNiwgMTYpOworICAgICAgICAgICAgcmFuZG9taXplX2J1ZmZlcnMoYnVmMCwgMCwgMTYsIC0xKTsKKyAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKGJ1ZjAsIDgsIDE2LCAtMSk7CisgICAgICAgICAgICBtZW1jcHkoYnVmMSAtIG1pZG9mZiwgYnVmMCAtIG1pZG9mZiwgMTYgKiAxNik7CisgICAgICAgICAgICBjYWxsX3JlZihidWYwLCAxNiwgZmxpbV9FKTsKKyAgICAgICAgICAgIGNhbGxfbmV3KGJ1ZjEsIDE2LCBmbGltX0UpOworICAgICAgICAgICAgaWYgKG1lbWNtcChidWYwIC0gbWlkb2ZmLCBidWYxIC0gbWlkb2ZmLCAxNiAqIDE2KSkKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICBiZW5jaF9uZXcoYnVmMCwgMTYsIGZsaW1fRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgY2hlY2thc21fY2hlY2tfdnA4ZHNwKHZvaWQpCit7CisgICAgY2hlY2tfaWRjdCgpOworICAgIGNoZWNrX2lkY3RfZGM0KCk7CisgICAgY2hlY2tfbHVtYV9kY193aHQoKTsKKyAgICByZXBvcnQoImlkY3QiKTsKKyAgICBjaGVja19tYygpOworICAgIHJlcG9ydCgibWMiKTsKKyAgICBjaGVja19sb29wZmlsdGVyXzE2eSgpOworICAgIGNoZWNrX2xvb3BmaWx0ZXJfOHV2KCk7CisgICAgY2hlY2tfbG9vcGZpbHRlcl9zaW1wbGUoKTsKKyAgICByZXBvcnQoImxvb3BmaWx0ZXIiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL3ZwOWRzcC5jIGIvdGVzdHMvY2hlY2thc20vdnA5ZHNwLmMKaW5kZXggOTMxZjc4OC4uYTkxNTc3YiAxMDA2NDQKLS0tIGEvdGVzdHMvY2hlY2thc20vdnA5ZHNwLmMKKysrIGIvdGVzdHMvY2hlY2thc20vdnA5ZHNwLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJjaGVja2FzbS5oIgogI2luY2x1ZGUgImxpYmF2Y29kZWMvdnA5ZGF0YS5oIgotI2luY2x1ZGUgImxpYmF2Y29kZWMvdnA5ZHNwLmgiCisjaW5jbHVkZSAibGliYXZjb2RlYy92cDkuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvY29tbW9uLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludGVybmFsLmgiCiAjaW5jbHVkZSAibGliYXZ1dGlsL2ludHJlYWR3cml0ZS5oIgpAQCAtMjU5LDcgKzI1OSw3IEBACiAgICAgLy8gdGVzdAogCiAgICAgaW50IG47Ci0gICAgY29uc3QgaW50MTZfdCAqc2NhbiA9IHZwOV9zY2Fuc1t0eF1bdHh0cF07CisgICAgY29uc3QgaW50MTZfdCAqc2NhbiA9IGZmX3ZwOV9zY2Fuc1t0eF1bdHh0cF07CiAgICAgaW50IGVvYjsKIAogICAgIGZvciAobiA9IDA7IG4gPCBzeiAqIHN6OyBuKyspIHsKQEAgLTMzMSwxNSArMzMxLDIyIEBACiAgICAgICAgICAgICBpbnQgbl90eHRwcyA9IHR4IDwgVFhfMzJYMzIgPyBOX1RYRk1fVFlQRVMgOiAxOwogCiAgICAgICAgICAgICBmb3IgKHR4dHAgPSAwOyB0eHRwIDwgbl90eHRwczsgdHh0cCsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoZWNrX2Z1bmMoZHNwLml0eGZtX2FkZFt0eF1bdHh0cF0sICJ2cDlfaW52XyVzXyVkeCVkX2FkZF8lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHggPT0gNCA/ICJ3aHRfd2h0IiA6IHR4dHBfdHlwZXNbdHh0cF0sIHN6LCBzeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfZGVwdGgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZ0eChjb2VmLCB0eCwgdHh0cCwgc3osIGJpdF9kZXB0aCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChzdWIgPSAodHh0cCA9PSAwKSA/IDEgOiAyOyBzdWIgPD0gc3o7IHN1YiA8PD0gMSkgeworICAgICAgICAgICAgICAgIC8vIHNraXAgdGVzdGluZyBzdWItSURDVHMgZm9yIFdIVCBvciBBRFNUIHNpbmNlIHRoZXkgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyBpbXBsZW1lbnQgaXQgaW4gYW55IG9mIHRoZSBTSU1EIGZ1bmN0aW9ucy4gSWYgdGhleSBkbywKKyAgICAgICAgICAgICAgICAvLyBjb25zaWRlciBjaGFuZ2luZyB0aGlzIHRvIGVuc3VyZSB3ZSBoYXZlIGNvbXBsZXRlIHRlc3QKKyAgICAgICAgICAgICAgICAvLyBjb3ZlcmFnZS4gVGVzdCBzdWI9MSBmb3IgZGMtb25seSwgdGhlbiAyLCA0LCA4LCAxMiwgZXRjLAorICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBhcm0gdmVyc2lvbiBjYW4gZGlzdGluZ3Vpc2ggdGhlbSBhdCB0aGF0IGxldmVsLgorICAgICAgICAgICAgICAgIGZvciAoc3ViID0gKHR4dHAgPT0gMCAmJiB0eCA8IDQpID8gMSA6IHN6OyBzdWIgPD0gc3o7CisgICAgICAgICAgICAgICAgICAgICBzdWIgPCA0ID8gKHN1YiA8PD0gMSkgOiAoc3ViICs9IDQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja19mdW5jKGRzcC5pdHhmbV9hZGRbdHhdW3R4dHBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnA5X2ludl8lc18lZHglZF9zdWIlZF9hZGRfJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eCA9PSA0ID8gIndodF93aHQiIDogdHh0cF90eXBlc1t0eHRwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3osIHN6LCBzdWIsIGJpdF9kZXB0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlb2I7CiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbWl6ZV9idWZmZXJzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmdHgoY29lZiwgdHgsIHR4dHAsIHN6LCBiaXRfZGVwdGgpOworCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViIDwgc3opIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2IgPSBjb3B5X3N1YmNvZWZzKHN1YmNvZWYwLCBjb2VmLCB0eCwgdHh0cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6LCBzdWIsIGJpdF9kZXB0aCk7CkBAIC0zNTcsOCArMzY0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaXN6ZXJvKHN1YmNvZWYwLCBzeiAqIHN6ICogU0laRU9GX0NPRUYpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzemVybyhzdWJjb2VmMSwgc3ogKiBzeiAqIFNJWkVPRl9DT0VGKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlbmNoX25ldyhkc3QsIHN6ICogU0laRU9GX1BJWEVMLCBjb2VmLCBlb2IpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJlbmNoX25ldyhkc3QsIHN6ICogU0laRU9GX1BJWEVMLCBjb2VmLCBzeiAqIHN6KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ0OCw3ICs0NTYsNyBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBkaXJfbmFtZVsyXSA9IHsgImgiLCAidiIgfTsKICAgICBzdGF0aWMgY29uc3QgaW50IEVbMl0gPSB7IDIwLCAyOCB9LCBJWzJdID0geyAxMCwgMTYgfTsKICAgICBzdGF0aWMgY29uc3QgaW50IEhbMl0gPSB7IDcsIDExIH0sIEZbMl0gPSB7IDEsIDEgfTsKLSAgICBkZWNsYXJlX2Z1bmModm9pZCwgdWludDhfdCAqZHN0LCBwdHJkaWZmX3Qgc3RyaWRlLCBpbnQgRSwgaW50IEksIGludCBIKTsKKyAgICBkZWNsYXJlX2Z1bmNfZW1tcyhBVl9DUFVfRkxBR19NTVggfCBBVl9DUFVfRkxBR19NTVhFWFQsIHZvaWQsIHVpbnQ4X3QgKmRzdCwgcHRyZGlmZl90IHN0cmlkZSwgaW50IEUsIGludCBJLCBpbnQgSCk7CiAKICAgICBmb3IgKGJpdF9kZXB0aCA9IDg7IGJpdF9kZXB0aCA8PSAxMjsgYml0X2RlcHRoICs9IDIpIHsKICAgICAgICAgZmZfdnA5ZHNwX2luaXQoJmRzcCwgYml0X2RlcHRoLCAwKTsKZGlmZiAtLWdpdCBhL3Rlc3RzL2NoZWNrYXNtL3g4Ni9NYWtlZmlsZSBiL3Rlc3RzL2NoZWNrYXNtL3g4Ni9NYWtlZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmZTA4OC4uMDAwMDAwMAotLS0gYS90ZXN0cy9jaGVja2FzbS94ODYvTWFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLUNIRUNLQVNNT0JKUy0kKEhBVkVfWUFTTSkgKz0geDg2L2NoZWNrYXNtLm8KLQotdGVzdHMvY2hlY2thc20veDg2LyUubzogdGVzdHMvY2hlY2thc20veDg2LyUuYXNtCi0JJChERVBZQVNNKSAkKFlBU01GTEFHUykgLUkgJCg8RCkvIC1NIC1vICRAICQ8ID4gJChAOi5vPS5kKQotCSQoWUFTTSkgJChZQVNNRkxBR1MpIC1JICQoPEQpLyAtbyAkQCAkPAotCS0kKFNUUklQKSAkKEFTTVNUUklQRkxBR1MpICRACmRpZmYgLS1naXQgYS90ZXN0cy9jaGVja2FzbS94ODYvY2hlY2thc20uYXNtIGIvdGVzdHMvY2hlY2thc20veDg2L2NoZWNrYXNtLmFzbQppbmRleCBkMTIzMzNiLi42ODNhYWU4IDEwMDY0NAotLS0gYS90ZXN0cy9jaGVja2FzbS94ODYvY2hlY2thc20uYXNtCisrKyBiL3Rlc3RzL2NoZWNrYXNtL3g4Ni9jaGVja2FzbS5hc20KQEAgLTE2OSwxNSArMTY5LDE1IEBACiAgICAganogLmNsb2JiZXJfb2sKICAgICByZXBvcnRfZmFpbCBlcnJvcl9tZXNzYWdlCiAuY2xvYmJlcl9vazoKLSVpZm5pZCAlMSwgX2VtbXMKKyVpZmlkbiAlMSwgX2VtbXMKKyAgICBlbW1zCislZWxpZm5pZG4gJTEsIF9mbG9hdAogICAgIGZzdGVudiBbcnNwXQogICAgIGNtcCAgd29yZCBbcnNwICsgOF0sIDB4ZmZmZgogICAgIGplICAgLmVtbXNfb2sKICAgICByZXBvcnRfZmFpbCBlcnJvcl9tZXNzYWdlX2VtbXMKICAgICBlbW1zCiAuZW1tc19vazoKLSVlbHNlCi0gICAgZW1tcwogJWVuZGlmCiAgICAgUkVUCiAlZW5kbWFjcm8KQEAgLTIyMywxNSArMjIzLDE1IEBACiAgICAganogLmNsb2JiZXJfb2sKICAgICByZXBvcnRfZmFpbCBlcnJvcl9tZXNzYWdlCiAuY2xvYmJlcl9vazoKLSVpZm5pZCAlMSwgX2VtbXMKKyVpZmlkbiAlMSwgX2VtbXMKKyAgICBlbW1zCislZWxpZm5pZG4gJTEsIF9mbG9hdAogICAgIGZzdGVudiBbZXNwXQogICAgIGNtcCAgd29yZCBbZXNwICsgOF0sIDB4ZmZmZgogICAgIGplICAgLmVtbXNfb2sKICAgICByZXBvcnRfZmFpbCBlcnJvcl9tZXNzYWdlX2VtbXMKICAgICBlbW1zCiAuZW1tc19vazoKLSVlbHNlCi0gICAgZW1tcwogJWVuZGlmCiAgICAgYWRkICBlc3AsIG1heF9hcmdzKjQKICAgICBSRVBfUkVUCkBAIC0yNDEsMyArMjQxLDQgQEAKIAogQ0hFQ0tFRF9DQUxMCiBDSEVDS0VEX0NBTEwgX2VtbXMKK0NIRUNLRURfQ0FMTCBfZmxvYXQKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUtcnVuLnNoIGIvdGVzdHMvZmF0ZS1ydW4uc2gKaW5kZXggMTYwODdjYi4uNDU3NzYxYyAxMDA3NTUKLS0tIGEvdGVzdHMvZmF0ZS1ydW4uc2gKKysrIGIvdGVzdHMvZmF0ZS1ydW4uc2gKQEAgLTI0LDYgKzI0LDcgQEAKIGNtcF91bml0PSR7MTU6LTJ9CiBnZW49JHsxNjotbm99CiBod2FjY2VsPSR7MTc6LW5vbmV9CityZXBvcnRfdHlwZT0kezE4Oi1zdGFuZGFyZH0KIAogb3V0ZGlyPSJ0ZXN0cy9kYXRhL2ZhdGUiCiBvdXRmaWxlPSIke291dGRpcn0vJHt0ZXN0fSIKQEAgLTg3LDYgKzg4LDEwIEBACiAgICAgcnVuIGZmcHJvYmUke1BST0dTVUZ9IC1zaG93X2VudHJpZXMgZm9ybWF0PWZvcm1hdF9uYW1lIC1wcmludF9mb3JtYXQgZGVmYXVsdD1udz0xOm5rPTEgLXYgMCAiJEAiCiB9CiAKK3Byb2JldGFncygpeworICAgIHJ1biBmZnByb2JlJHtQUk9HU1VGfSAtc2hvd19lbnRyaWVzIGZvcm1hdF90YWdzIC12IDAgIiRAIgorfQorCiBydW5sb2NhbCgpewogICAgIHRlc3QgIiR7VjotMH0iIC1ndCAwICYmIGVjaG8gJHtiYXNlfS8iJEAiICR7YmFzZX0gPiYzCiAgICAgJHtiYXNlfS8iJEAiICR7YmFzZX0KQEAgLTk2LDYgKzEwMSwyNSBAQAogICAgIHJ1biBmZnByb2JlJHtQUk9HU1VGfSAtc2hvd19mcmFtZXMgLXYgMCAiJEAiCiB9CiAKK3Byb2JlY2hhcHRlcnMoKXsKKyAgICBydW4gZmZwcm9iZSR7UFJPR1NVRn0gLXNob3dfY2hhcHRlcnMgLXYgMCAiJEAiCit9CisKK3Byb2JlZ2FwbGVzc2luZm8oKXsKKyAgICBmaWxlbmFtZT0iJDEiCisgICAgc2hpZnQKKyAgICBydW4gZmZwcm9iZSR7UFJPR1NVRn0gLWJpdGV4YWN0IC1zZWxlY3Rfc3RyZWFtcyBhIC1zaG93X2VudHJpZXMgZm9ybWF0PXN0YXJ0X3RpbWUsZHVyYXRpb246c3RyZWFtPWluZGV4LHN0YXJ0X3B0cyxkdXJhdGlvbl90cyAtdiAwICIkZmlsZW5hbWUiICIkQCIKKyAgICBwa3RmaWxlMT0iJHtvdXRkaXJ9LyR7dGVzdH0ucGt0cyIKKyAgICBmcmFtZWZpbGUxPSIke291dGRpcn0vJHt0ZXN0fS5mcmFtZXMiCisgICAgY2xlYW5maWxlcz0iJGNsZWFuZmlsZXMgJHBrdGZpbGUxICRmcmFtZWZpbGUxIgorICAgIHJ1biBmZnByb2JlJHtQUk9HU1VGfSAtYml0ZXhhY3QgLXNlbGVjdF9zdHJlYW1zIGEgLW9mIGNvbXBhY3QgLWNvdW50X3BhY2tldHMgLXNob3dfZW50cmllcyBwYWNrZXQ9cHRzLGR0cyxkdXJhdGlvbixmbGFnczpzdHJlYW09bmJfcmVhZF9wYWNrZXRzIC12IDAgIiRmaWxlbmFtZSIgIiRAIiA+ICIkcGt0ZmlsZTEiCisgICAgaGVhZCAtbiA4ICIkcGt0ZmlsZTEiCisgICAgdGFpbCAtbiA5ICIkcGt0ZmlsZTEiCisgICAgcnVuIGZmcHJvYmUke1BST0dTVUZ9IC1iaXRleGFjdCAtc2VsZWN0X3N0cmVhbXMgYSAtb2YgY29tcGFjdCAtY291bnRfZnJhbWVzIC1zaG93X2VudHJpZXMgZnJhbWU9cGt0X3B0cyxwa3RfZHRzLGJlc3RfZWZmb3J0X3RpbWVzdGFtcCxwa3RfZHVyYXRpb24sbmJfc2FtcGxlczpzdHJlYW09bmJfcmVhZF9mcmFtZXMgLXYgMCAiJGZpbGVuYW1lIiAiJEAiID4gIiRmcmFtZWZpbGUxIgorICAgIGhlYWQgLW4gOCAiJGZyYW1lZmlsZTEiCisgICAgdGFpbCAtbiA5ICIkZnJhbWVmaWxlMSIKK30KKwogZmZtcGVnKCl7CiAgICAgZGVjX29wdHM9Ii1od2FjY2VsICRod2FjY2VsIC10aHJlYWRzICR0aHJlYWRzIC10aHJlYWRfdHlwZSAkdGhyZWFkX3R5cGUiCiAgICAgZmZtcGVnX2FyZ3M9Ii1ub3N0ZGluIC1ub3N0YXRzIC1jcHVmbGFncyAkY3B1ZmxhZ3MiCkBAIC0xMDcsMjEgKzEzMSwzMiBAQAogfQogCiBmcmFtZWNyYygpewotICAgIGZmbXBlZyAiJEAiIC1mbGFncyArYml0ZXhhY3QgLWZmbGFncyArYml0ZXhhY3QgLWYgZnJhbWVjcmMgLQorICAgIGZmbXBlZyAiJEAiIC1iaXRleGFjdCAtZiBmcmFtZWNyYyAtCit9CisKK2ZmbWV0YWRhdGEoKXsKKyAgICBmZm1wZWcgIiRAIiAtYml0ZXhhY3QgLWYgZmZtZXRhZGF0YSAtCiB9CiAKIGZyYW1lbWQ1KCl7Ci0gICAgZmZtcGVnICIkQCIgLWZsYWdzICtiaXRleGFjdCAtZmZsYWdzICtiaXRleGFjdCAtZiBmcmFtZW1kNSAtCisgICAgZmZtcGVnICIkQCIgLWJpdGV4YWN0IC1mIGZyYW1lbWQ1IC0KIH0KIAogY3JjKCl7CiAgICAgZmZtcGVnICIkQCIgLWYgY3JjIC0KIH0KIAotbWQ1KCl7CittZDVwaXBlKCl7CiAgICAgZmZtcGVnICIkQCIgbWQ1OgogfQogCittZDUoKXsKKyAgICBlbmNmaWxlPSIke291dGRpcn0vJHt0ZXN0fS5vdXQiCisgICAgY2xlYW5maWxlcz0iJGNsZWFuZmlsZXMgJGVuY2ZpbGUiCisgICAgZmZtcGVnICIkQCIgJGVuY2ZpbGUKKyAgICBkb19tZDVzdW0gJGVuY2ZpbGUgfCBhd2sgJ3twcmludCAkMX0nCit9CisKIHBjbSgpewogICAgIGZmbXBlZyAiJEAiIC12biAtZiBzMTZsZSAtCiB9CkBAIC0xMjksNyArMTY0LDcgQEAKIGZtdHN0ZG91dCgpewogICAgIGZtdD0kMQogICAgIHNoaWZ0IDEKLSAgICBmZm1wZWcgLWZsYWdzICtiaXRleGFjdCAtZmZsYWdzICtiaXRleGFjdCAiJEAiIC1mICRmbXQgLQorICAgIGZmbXBlZyAtYml0ZXhhY3QgIiRAIiAtZiAkZm10IC0KIH0KIAogZW5jX2RlY19wY20oKXsKQEAgLTE0Miw3ICsxNzcsNyBAQAogICAgIGNsZWFuZmlsZXM9JGVuY2ZpbGUKICAgICBlbmNmaWxlPSQodGFyZ2V0X3BhdGggJHtlbmNmaWxlfSkKICAgICBmZm1wZWcgLWkgJHNyY19maWxlICIkQCIgLWYgJG91dF9mbXQgLXkgJHtlbmNmaWxlfSB8fCByZXR1cm4KLSAgICBmZm1wZWcgLWZsYWdzICtiaXRleGFjdCAtZmZsYWdzICtiaXRleGFjdCAtaSAke2VuY2ZpbGV9IC1jOmEgcGNtXyR7cGNtX2ZtdH0gLWZmbGFncyArYml0ZXhhY3QgLWYgJHtkZWNfZm10fSAtCisgICAgZmZtcGVnIC1iaXRleGFjdCAtaSAke2VuY2ZpbGV9IC1jOmEgcGNtXyR7cGNtX2ZtdH0gLWZmbGFncyArYml0ZXhhY3QgLWYgJHtkZWNfZm10fSAtCiB9CiAKIEZMQUdTPSItZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtZmZsYWdzICtiaXRleGFjdCIKQEAgLTE3Myw2ICsyMDgsNDAgQEAKICAgICB0ZXN0cy90aW55X3BzbnIgJHNyY2ZpbGUgJGRlY2ZpbGUgJGNtcF91bml0ICRjbXBfc2hpZnQKIH0KIAordHJhbnNjb2RlKCl7CisgICAgc3JjX2ZtdD0kMQorICAgIHNyY2ZpbGU9JDIKKyAgICBlbmNfZm10PSQzCisgICAgZW5jX29wdD0kNAorICAgIGZpbmFsX2RlY29kZT0kNQorICAgIGVuY2ZpbGU9IiR7b3V0ZGlyfS8ke3Rlc3R9LiR7ZW5jX2ZtdH0iCisgICAgdGVzdCAiJDciID0gLWtlZXAgfHwgY2xlYW5maWxlcz0iJGNsZWFuZmlsZXMgJGVuY2ZpbGUiCisgICAgdHNyY2ZpbGU9JCh0YXJnZXRfcGF0aCAkc3JjZmlsZSkKKyAgICB0ZW5jZmlsZT0kKHRhcmdldF9wYXRoICRlbmNmaWxlKQorICAgIGZmbXBlZyAtZiAkc3JjX2ZtdCAkREVDX09QVFMgLWkgJHRzcmNmaWxlICRFTkNfT1BUUyAkZW5jX29wdCAkRkxBR1MgXAorICAgICAgICAtZiAkZW5jX2ZtdCAteSAkdGVuY2ZpbGUgfHwgcmV0dXJuCisgICAgZG9fbWQ1c3VtICRlbmNmaWxlCisgICAgZWNobyAkKHdjIC1jICRlbmNmaWxlKQorICAgIGZmbXBlZyAkREVDX09QVFMgLWkgJGVuY2ZpbGUgJEVOQ19PUFRTICRGTEFHUyAkZmluYWxfZGVjb2RlIFwKKyAgICAgICAgLWYgZnJhbWVjcmMgLSB8fCByZXR1cm4KK30KKworc3RyZWFtX3JlbXV4KCl7CisgICAgc3JjX2ZtdD0kMQorICAgIHNyY2ZpbGU9JDIKKyAgICBlbmNfZm10PSQzCisgICAgc3RyZWFtX21hcHM9JDQKKyAgICBmaW5hbF9kZWNvZGU9JDUKKyAgICBlbmNmaWxlPSIke291dGRpcn0vJHt0ZXN0fS4ke2VuY19mbXR9IgorICAgIHRlc3QgIiQ3IiA9IC1rZWVwIHx8IGNsZWFuZmlsZXM9IiRjbGVhbmZpbGVzICRlbmNmaWxlIgorICAgIHRzcmNmaWxlPSQodGFyZ2V0X3BhdGggJHNyY2ZpbGUpCisgICAgdGVuY2ZpbGU9JCh0YXJnZXRfcGF0aCAkZW5jZmlsZSkKKyAgICBmZm1wZWcgLWYgJHNyY19mbXQgLWkgJHRzcmNmaWxlICRzdHJlYW1fbWFwcyAtY29kZWMgY29weSAkRkxBR1MgXAorICAgICAgICAtZiAkZW5jX2ZtdCAteSAkdGVuY2ZpbGUgfHwgcmV0dXJuCisgICAgZmZtcGVnICRERUNfT1BUUyAtaSAkZW5jZmlsZSAkRU5DX09QVFMgJEZMQUdTICRmaW5hbF9kZWNvZGUgXAorICAgICAgICAtZiBmcmFtZWNyYyAtIHx8IHJldHVybgorfQorCiBsYXZmZmF0ZXRlc3QoKXsKICAgICB0PSIke3Rlc3QjbGF2Zi1mYXRlLX0iCiAgICAgcmVmPSR7YmFzZX0vcmVmL2xhdmYtZmF0ZS8kdApAQCAtMTg1LDYgKzI1NCwxNSBAQAogICAgICR7YmFzZX0vbGF2Zi1yZWdyZXNzaW9uLnNoICR0IGxhdmYgdGVzdHMvdnN5bnRoMSAiJHRhcmdldF9leGVjIiAiJHRhcmdldF9wYXRoIiAiJHRocmVhZHMiICIkdGhyZWFkX3R5cGUiICIkY3B1ZmxhZ3MiICIkdGFyZ2V0X3NhbXBsZXMiCiB9CiAKK3JlZmNtcF9tZXRhZGF0YSgpeworICAgIHJlZmNtcD0kMQorICAgIHBpeGZtdD0kMgorICAgIGZ1eno9JHszOi0wLjAwMX0KKyAgICBmZm1wZWcgJEZMQUdTICRFTkNfT1BUUyBcCisgICAgICAgIC1sYXZmaSAidGVzdHNyYzI9c2l6ZT0zMDB4MjAwOnJhdGU9MTpkdXJhdGlvbj01LGZvcm1hdD0ke3BpeGZtdH0sc3BsaXRbcmVmXVt0bXBdO1t0bXBdYXZnYmx1cj00W2VuY107W2VuY11bcmVmXSR7cmVmY21wfSxtZXRhZGF0YT1wcmludDpmaWxlPS0iIFwKKyAgICAgICAgLWYgbnVsbCAvZGV2L251bGwgfCBhd2sgLXYgcmVmPSR7cmVmfSAtdiBmdXp6PSR7ZnV6en0gLWYgJHtiYXNlfS9yZWZjbXAtbWV0YWRhdGEuYXdrIC0KK30KKwogdmlkZW9fZmlsdGVyKCl7CiAgICAgZmlsdGVycz0kMQogICAgIHNoaWZ0CkBAIC0yMDIsNyArMjgwLDcgQEAKICAgICBwcmVmaWx0ZXJfY2hhaW49JDIKICAgICBuZnJhbWVzPSR7MzotMX0KIAotICAgIHNob3dmaWx0Zm10cz0iJHRhcmdldF9leGVjICR0YXJnZXRfcGF0aC9saWJhdmZpbHRlci9maWx0Zm10cy10ZXN0IgorICAgIHNob3dmaWx0Zm10cz0iJHRhcmdldF9leGVjICR0YXJnZXRfcGF0aC9saWJhdmZpbHRlci90ZXN0cy9maWx0Zm10cyIKICAgICBzY2FsZV9leGNsdWRlX2ZtdHM9JHtvdXRmaWxlfV9zY2FsZV9leGNsdWRlX2ZtdHMKICAgICBzY2FsZV9pbl9mbXRzPSR7b3V0ZmlsZX1fc2NhbGVfaW5fZm10cwogICAgIHNjYWxlX291dF9mbXRzPSR7b3V0ZmlsZX1fc2NhbGVfb3V0X2ZtdHMKQEAgLTIzNiwxOSArMzE0LDQ0IEBACiAgICAgY2xlYW5maWxlcz0iJGNsZWFuZmlsZXMgJGRlY2ZpbGUxICRkZWNmaWxlMiAkZGVjZmlsZTMiCiAKICAgICAjIHRlc3QgcGFja2V0IGRhdGEKLSAgICBmZm1wZWcgJGV4dHJhX2FyZ3MgLWkgIiRzYW1wbGUiIC1mbGFncyArYml0ZXhhY3QgLWZmbGFncyArYml0ZXhhY3QgLWM6YSBjb3B5IC1mIGZyYW1lY3JjIC15ICRkZWNmaWxlMQorICAgIGZmbXBlZyAkZXh0cmFfYXJncyAtaSAiJHNhbXBsZSIgLWJpdGV4YWN0IC1jOmEgY29weSAtZiBmcmFtZWNyYyAteSAkZGVjZmlsZTEKICAgICBkb19tZDVzdW0gJGRlY2ZpbGUxCiAgICAgIyB0ZXN0IGRlY29kZWQgKGFuZCBjdXQpIGRhdGEKLSAgICBmZm1wZWcgJGV4dHJhX2FyZ3MgLWkgIiRzYW1wbGUiIC1mbGFncyArYml0ZXhhY3QgLWZmbGFncyArYml0ZXhhY3QgLWYgd2F2IG1kNToKKyAgICBmZm1wZWcgJGV4dHJhX2FyZ3MgLWkgIiRzYW1wbGUiIC1iaXRleGFjdCAtZiB3YXYgbWQ1OgogICAgICMgdGhlIHNhbWUgYXMgYWJvdmUgYWdhaW4sIHdpdGggc2Vla2luZyB0byB0aGUgc3RhcnQKLSAgICBmZm1wZWcgJGV4dHJhX2FyZ3MgLXNzIDAgLXNlZWtfdGltZXN0YW1wIDEgLWkgIiRzYW1wbGUiIC1mbGFncyArYml0ZXhhY3QgLWZmbGFncyArYml0ZXhhY3QgLWM6YSBjb3B5IC1mIGZyYW1lY3JjIC15ICRkZWNmaWxlMgorICAgIGZmbXBlZyAkZXh0cmFfYXJncyAtc3MgMCAtc2Vla190aW1lc3RhbXAgMSAtaSAiJHNhbXBsZSIgLWJpdGV4YWN0IC1jOmEgY29weSAtZiBmcmFtZWNyYyAteSAkZGVjZmlsZTIKICAgICBkb19tZDVzdW0gJGRlY2ZpbGUyCi0gICAgZmZtcGVnICRleHRyYV9hcmdzIC1zcyAwIC1zZWVrX3RpbWVzdGFtcCAxIC1pICIkc2FtcGxlIiAtZmxhZ3MgK2JpdGV4YWN0IC1mZmxhZ3MgK2JpdGV4YWN0IC1mIHdhdiBtZDU6CisgICAgZmZtcGVnICRleHRyYV9hcmdzIC1zcyAwIC1zZWVrX3RpbWVzdGFtcCAxIC1pICIkc2FtcGxlIiAtYml0ZXhhY3QgLWYgd2F2IG1kNToKICAgICAjIHRlc3QgcGFja2V0IGRhdGEsIHdpdGggc2Vla2luZyB0byBhIHNwZWNpZmljIHBvc2l0aW9uCi0gICAgZmZtcGVnICRleHRyYV9hcmdzIC1zcyA1IC1zZWVrX3RpbWVzdGFtcCAxIC1pICIkc2FtcGxlIiAtZmxhZ3MgK2JpdGV4YWN0IC1mZmxhZ3MgK2JpdGV4YWN0IC1jOmEgY29weSAtZiBmcmFtZWNyYyAteSAkZGVjZmlsZTMKKyAgICBmZm1wZWcgJGV4dHJhX2FyZ3MgLXNzIDUgLXNlZWtfdGltZXN0YW1wIDEgLWkgIiRzYW1wbGUiIC1iaXRleGFjdCAtYzphIGNvcHkgLWYgZnJhbWVjcmMgLXkgJGRlY2ZpbGUzCiAgICAgZG9fbWQ1c3VtICRkZWNmaWxlMwogfQogCitnYXBsZXNzZW5jKCl7CisgICAgc2FtcGxlPSQodGFyZ2V0X3BhdGggJDEpCisgICAgZm9ybWF0PSQyCisgICAgY29kZWM9JDMKKworICAgIGZpbGUxPSIke291dGRpcn0vJHt0ZXN0fS5vdXQtMSIKKyAgICBjbGVhbmZpbGVzPSIkY2xlYW5maWxlcyAkZmlsZTEiCisKKyAgICAjIHRlc3QgZGF0YSBhZnRlciByZWVuY29kaW5nCisgICAgZmZtcGVnIC1pICIkc2FtcGxlIiAtYml0ZXhhY3QgLW1hcCAwOmEgLWM6YSAkY29kZWMgLWYgJGZvcm1hdCAteSAiJGZpbGUxIgorICAgIHByb2JlZ2FwbGVzc2luZm8gIiRmaWxlMSIKK30KKworYXVkaW9fbWF0Y2goKXsKKyAgICBzYW1wbGU9JCh0YXJnZXRfcGF0aCAkMSkKKyAgICB0cmVmaWxlPSQodGFyZ2V0X3BhdGggJDIpCisgICAgZXh0cmFfYXJncz0kMworCisgICAgZGVjZmlsZT0iJHtvdXRkaXJ9LyR7dGVzdH0ud2F2IgorICAgIGNsZWFuZmlsZXM9IiRjbGVhbmZpbGVzICRkZWNmaWxlIgorCisgICAgZmZtcGVnIC1pICIkc2FtcGxlIiAtYml0ZXhhY3QgJGV4dHJhX2FyZ3MgLXkgJGRlY2ZpbGUKKyAgICB0ZXN0cy9hdWRpb21hdGNoICRkZWNmaWxlICR0cmVmaWxlCit9CisKIGNvbmNhdCgpewogICAgIHRlbXBsYXRlPSQxCiAgICAgc2FtcGxlPSQyCkBAIC0yNjksNiArMzcyLDEwIEBACiAgICAgZmkKIH0KIAorbnVsbCgpeworICAgIDoKK30KKwogbWtkaXIgLXAgIiRvdXRkaXIiCiAKICMgRGlzYWJsZSBnbG9iYmluZzogY29tbWFuZCBhcmd1bWVudHMgbWF5IGNvbnRhaW4gZ2xvYmJpbmcgY2hhcmFjdGVycyBhbmQKQEAgLTI4NCwyNCArMzkxLDI5IEBACiAgICAgdGVzdCAiJHtzaWd9IiA9ICIke3NpZyVbIUEtWmEtel0qfSIgfHwgdW5zZXQgc2lnCiBmaQogCi1pZiB0ZXN0IC1lICIkcmVmIiB8fCB0ZXN0ICRjbXAgPSAib25lbGluZSIgOyB0aGVuCitpZiB0ZXN0IC1lICIkcmVmIiB8fCB0ZXN0ICRjbXAgPSAib25lbGluZSIgfHwgdGVzdCAkY21wID0gIm51bGwiIHx8IHRlc3QgJGNtcCA9ICJncmVwIiA7IHRoZW4KICAgICBjYXNlICRjbXAgaW4KICAgICAgICAgZGlmZikgICBkaWZmIC11IC1iICIkcmVmIiAiJG91dGZpbGUiICAgICAgICAgICAgPiRjbXBmaWxlIDs7CiAgICAgICAgIHJhd2RpZmYpZGlmZiAtdSAgICAiJHJlZiIgIiRvdXRmaWxlIiAgICAgICAgICAgID4kY21wZmlsZSA7OwogICAgICAgICBvbmVvZmYpIG9uZW9mZiAgICAgIiRyZWYiICIkb3V0ZmlsZSIgICAgICAgICAgICA+JGNtcGZpbGUgOzsKICAgICAgICAgc3RkZGV2KSBzdGRkZXYgICAgICIkcmVmIiAiJG91dGZpbGUiICAgICAgICAgICAgPiRjbXBmaWxlIDs7CiAgICAgICAgIG9uZWxpbmUpb25lbGluZSAgICAiJHJlZiIgIiRvdXRmaWxlIiAgICAgICAgICAgID4kY21wZmlsZSA7OworICAgICAgICBncmVwKSAgIGdyZXAgICAgICAgIiRyZWYiICIkZXJyZmlsZSIgICAgICAgICAgICA+JGNtcGZpbGUgOzsKICAgICAgICAgbnVsbCkgICBjYXQgICAgICAgICAgICAgICAiJG91dGZpbGUiICAgICAgICAgICAgPiRjbXBmaWxlIDs7CiAgICAgZXNhYwogICAgIGNtcGVycj0kPwogICAgIHRlc3QgJGVyciA9IDAgJiYgZXJyPSRjbXBlcnIKLSAgICB0ZXN0ICRlcnIgPSAwIHx8IGNhdCAkY21wZmlsZQorICAgIGlmIFsgIiRyZXBvcnRfdHlwZSIgPSAiaWdub3JlIiBdOyB0aGVuCisgICAgICAgIHRlc3QgJGVyciA9IDAgfHwgZWNobyAiSUdOT1JFXHQke3Rlc3R9IiAmJiBlcnI9MCAmJiB1bnNldCBzaWcKKyAgICBlbHNlCisgICAgICAgIHRlc3QgJGVyciA9IDAgfHwgY2F0ICRjbXBmaWxlCisgICAgZmkKIGVsc2UKICAgICBlY2hvICJyZWZlcmVuY2UgZmlsZSAnJHJlZicgbm90IGZvdW5kIgogICAgIGVycj0xCiBmaQogCi1pZiBbICRlcnIgLWVxIDAgXTsgdGhlbgoraWYgWyAkZXJyIC1lcSAwIF0gJiYgdGVzdCAkcmVwb3J0X3R5cGUgPSAic3RhbmRhcmQiIDsgdGhlbgogICAgIHVuc2V0IGNtcG8gZXJybwogZWxzZQogICAgIGNtcG89IiQoJGJhc2U2NCA8JGNtcGZpbGUpIgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS5zaCBiL3Rlc3RzL2ZhdGUuc2gKaW5kZXggNmNlOGM0OC4uMGVkZWU3ZiAxMDA3NTUKLS0tIGEvdGVzdHMvZmF0ZS5zaAorKysgYi90ZXN0cy9mYXRlLnNoCkBAIC0zNyw3ICszNyw3IEBACiB1cGRhdGUoKSgKICAgICBjZCAke3NyY30gfHwgcmV0dXJuCiAgICAgY2FzZSAiJHJlcG8iIGluCi0gICAgICAgIGdpdDoqKSBnaXQgZmV0Y2ggLS1mb3JjZSAmJiBnaXQgcmVzZXQgLS1oYXJkICJvcmlnaW4vJGJyYW5jaCIgOzsKKyAgICAgICAgZ2l0OiopIGdpdCBmZXRjaCAtLXF1aWV0IC0tZm9yY2UgJiYgZ2l0IHJlc2V0IC0tcXVpZXQgLS1oYXJkICJvcmlnaW4vJGJyYW5jaCIgOzsKICAgICBlc2FjCiApCiAKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgLS1lbmFibGUtZ3BsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgLS1lbmFibGUtbWVtb3J5LXBvaXNvbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgLS1lbmFibGUtYXZyZXNhbXBsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgJHtpZ25vcmVfdGVzdHM6Ky0taWdub3JlLXRlc3RzPSIkaWdub3JlX3Rlc3RzIn0gICAgICAgICAgICAgICAgIFwKICAgICAgICAgJHthcmNoOistLWFyY2g9JGFyY2h9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgJHtjcHU6Ky0tY3B1PSIkY3B1In0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgJHt0b29sY2hhaW46Ky0tdG9vbGNoYWluPSIkdG9vbGNoYWluIn0gICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTc1LDcgKzc2LDcgQEAKIGZhdGUoKSgKICAgICB0ZXN0ICIkYnVpbGRfb25seSIgPSAieWVzIiAmJiByZXR1cm4KICAgICBjZCAke2J1aWxkfSB8fCByZXR1cm4KLSAgICAke21ha2V9ICR7bWFrZW9wdHN9IC1rIGZhdGUKKyAgICAke21ha2V9ICR7bWFrZW9wdHNfZmF0ZS0ke21ha2VvcHRzfX0gLWsgZmF0ZQogKQogCiBjbGVhbigpewpAQCAtODUsOCArODYsOCBAQAogcmVwb3J0KCl7CiAgICAgZGF0ZT0kKGRhdGUgLXUgKyVZJW0lZCVIJU0lUykKICAgICBlY2hvICJmYXRlOjE6JHtkYXRlfToke3Nsb3R9OiR7dmVyc2lvbn06JDE6JDI6JHticmFuY2h9OiR7Y29tbWVudH0iID5yZXBvcnQKLSAgICBjYXQgJHtidWlsZH0vY29uZmlnLmZhdGUgPj5yZXBvcnQKLSAgICBjYXQgJHtidWlsZH0vdGVzdHMvZGF0YS9mYXRlLyoucmVwID4+cmVwb3J0IHx8IGZvciBpIGluICR7YnVpbGR9L3Rlc3RzL2RhdGEvZmF0ZS8qLnJlcCA7IGRvIGNhdCAiJGkiID4+cmVwb3J0IDsgZG9uZQorICAgIGNhdCAke2J1aWxkfS9mZmJ1aWxkL2NvbmZpZy5mYXRlID4+cmVwb3J0CisgICAgY2F0ICR7YnVpbGR9L3Rlc3RzL2RhdGEvZmF0ZS8qLnJlcCA+PnJlcG9ydCAyPi9kZXYvbnVsbCB8fCBmb3IgaSBpbiAke2J1aWxkfS90ZXN0cy9kYXRhL2ZhdGUvKi5yZXAgOyBkbyBjYXQgIiRpIiA+PnJlcG9ydCAyPi9kZXYvbnVsbDsgZG9uZQogICAgIHRlc3QgLW4gIiRmYXRlX3JlY3YiICYmICR0YXIgcmVwb3J0ICoubG9nIHwgZ3ppcCB8ICRmYXRlX3JlY3YKIH0KIApAQCAtMTA4LDcgKzEwOSw3IEBACiAKIGNkICR7d29ya2Rpcn0KIAotdmVyc2lvbj0kKCR7c3JjfS92ZXJzaW9uLnNoICR7c3JjfSkKK3ZlcnNpb249JCgke3NyY30vZmZidWlsZC92ZXJzaW9uLnNoICR7c3JjfSkKIHRlc3QgIiR2ZXJzaW9uIiA9ICIkKGNhdCB2ZXJzaW9uLSRzbG90IDI+L2Rldi9udWxsKSIgJiYgZXhpdCAwCiBlY2hvICR7dmVyc2lvbn0gPnZlcnNpb24tJHNsb3QKIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9hYWMubWFrIGIvdGVzdHMvZmF0ZS9hYWMubWFrCmluZGV4IDhkMWUzMDMuLmJkMjgzMjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvYWFjLm1haworKysgYi90ZXN0cy9mYXRlL2FhYy5tYWsKQEAgLTIsNiArMiwxMCBAQAogZmF0ZS1hYWMtYWwwNF80NDogQ01EID0gcGNtIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FhYy9hbDA0XzQ0Lm1wNAogZmF0ZS1hYWMtYWwwNF80NDogUkVGID0gJChTQU1QTEVTKS9hYWMvYWwwNF80NC5zMTYKIAorRkFURV9BQUMgKz0gZmF0ZS1hYWMtYWwwNHNmXzQ4CitmYXRlLWFhYy1hbDA0c2ZfNDg6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9hYWMvYWwwNHNmXzQ4Lm1wNAorZmF0ZS1hYWMtYWwwNHNmXzQ4OiBSRUYgPSAkKFNBTVBMRVMpL2FhYy9hbDA0c2ZfNDguczE2CisKIEZBVEVfQUFDICs9IGZhdGUtYWFjLWFsMDVfNDQKIGZhdGUtYWFjLWFsMDVfNDQ6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9hYWMvYWwwNV80NC5tcDQKIGZhdGUtYWFjLWFsMDVfNDQ6IFJFRiA9ICQoU0FNUExFUykvYWFjL2FsMDVfNDQuczE2CkBAIC00Niw2ICs1MCwxMCBAQAogZmF0ZS1hYWMtYWxfc2JyX2hxX3NyXzQ4XzJfZnNhYWM0ODogQ01EID0gcGNtIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FhYy9hbF9zYnJfc3JfNDhfMl9mc2FhYzQ4Lm1wNAogZmF0ZS1hYWMtYWxfc2JyX2hxX3NyXzQ4XzJfZnNhYWM0ODogUkVGID0gJChTQU1QTEVTKS9hYWMvYWxfc2JyX2hxX3NyXzQ4XzJfZnNhYWM0OC5zMTYKIAorRkFURV9BQUMgKz0gZmF0ZS1hYWMtYWxfc2JyX3BzXzA0X3VyCitmYXRlLWFhYy1hbF9zYnJfcHNfMDRfdXI6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9hYWMvYWxfc2JyX3BzXzA0X25ldy5tcDQKK2ZhdGUtYWFjLWFsX3Nicl9wc18wNF91cjogUkVGID0gJChTQU1QTEVTKS9hYWMvYWxfc2JyX3BzXzA0X3VyLnMxNgorCiBGQVRFX0FBQyArPSBmYXRlLWFhYy1hbF9zYnJfcHNfMDZfdXIKIGZhdGUtYWFjLWFsX3Nicl9wc18wNl91cjogQ01EID0gcGNtIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FhYy9hbF9zYnJfcHNfMDZfbmV3Lm1wNAogZmF0ZS1hYWMtYWxfc2JyX3BzXzA2X3VyOiBSRUYgPSAkKFNBTVBMRVMpL2FhYy9hbF9zYnJfcHNfMDZfdXIuczE2CkBAIC0xNDYsNyArMTU0LDcgQEAKIGZhdGUtYWFjLWFyZWYtZW5jb2RlOiBDTVAgPSBzdGRkZXYKIGZhdGUtYWFjLWFyZWYtZW5jb2RlOiBSRUYgPSAuL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CiBmYXRlLWFhYy1hcmVmLWVuY29kZTogQ01QX1NISUZUID0gLTQwOTYKLWZhdGUtYWFjLWFyZWYtZW5jb2RlOiBDTVBfVEFSR0VUID0gNjY5CitmYXRlLWFhYy1hcmVmLWVuY29kZTogQ01QX1RBUkdFVCA9IDU5NgogZmF0ZS1hYWMtYXJlZi1lbmNvZGU6IFNJWkVfVE9MRVJBTkNFID0gMjQ2NAogZmF0ZS1hYWMtYXJlZi1lbmNvZGU6IEZVWlogPSA4OQogCkBAIC0xNTUsNyArMTYzLDcgQEAKIGZhdGUtYWFjLWxuLWVuY29kZTogQ01QID0gc3RkZGV2CiBmYXRlLWFhYy1sbi1lbmNvZGU6IFJFRiA9ICQoU0FNUExFUykvYXVkaW8tcmVmZXJlbmNlL2x1Y2t5bmlnaHRfMmNoXzQ0a0h6X3MxNi53YXYKIGZhdGUtYWFjLWxuLWVuY29kZTogQ01QX1NISUZUID0gLTQwOTYKLWZhdGUtYWFjLWxuLWVuY29kZTogQ01QX1RBUkdFVCA9IDYxCitmYXRlLWFhYy1sbi1lbmNvZGU6IENNUF9UQVJHRVQgPSA3MgogZmF0ZS1hYWMtbG4tZW5jb2RlOiBTSVpFX1RPTEVSQU5DRSA9IDM1NjAKIGZhdGUtYWFjLWxuLWVuY29kZTogRlVaWiA9IDMwCiAKQEAgLTE2NCw3ICsxNzIsNyBAQAogZmF0ZS1hYWMtbG4tZW5jb2RlLTEyOGs6IENNUCA9IHN0ZGRldgogZmF0ZS1hYWMtbG4tZW5jb2RlLTEyOGs6IFJFRiA9ICQoU0FNUExFUykvYXVkaW8tcmVmZXJlbmNlL2x1Y2t5bmlnaHRfMmNoXzQ0a0h6X3MxNi53YXYKIGZhdGUtYWFjLWxuLWVuY29kZS0xMjhrOiBDTVBfU0hJRlQgPSAtNDA5NgotZmF0ZS1hYWMtbG4tZW5jb2RlLTEyOGs6IENNUF9UQVJHRVQgPSA4MDAKK2ZhdGUtYWFjLWxuLWVuY29kZS0xMjhrOiBDTVBfVEFSR0VUID0gNjIyCiBmYXRlLWFhYy1sbi1lbmNvZGUtMTI4azogU0laRV9UT0xFUkFOQ0UgPSAzNTYwCiBmYXRlLWFhYy1sbi1lbmNvZGUtMTI4azogRlVaWiA9IDUKIApAQCAtMTczLDE2ICsxODEsMTYgQEAKIGZhdGUtYWFjLXBucy1lbmNvZGU6IENNUCA9IHN0ZGRldgogZmF0ZS1hYWMtcG5zLWVuY29kZTogUkVGID0gJChTQU1QTEVTKS9hdWRpby1yZWZlcmVuY2UvbHVja3luaWdodF8yY2hfNDRrSHpfczE2LndhdgogZmF0ZS1hYWMtcG5zLWVuY29kZTogQ01QX1NISUZUID0gLTQwOTYKLWZhdGUtYWFjLXBucy1lbmNvZGU6IENNUF9UQVJHRVQgPSA2MTYKK2ZhdGUtYWFjLXBucy1lbmNvZGU6IENNUF9UQVJHRVQgPSA2NTUKIGZhdGUtYWFjLXBucy1lbmNvZGU6IFNJWkVfVE9MRVJBTkNFID0gMzU2MAotZmF0ZS1hYWMtcG5zLWVuY29kZTogRlVaWiA9IDcyCitmYXRlLWFhYy1wbnMtZW5jb2RlOiBGVVpaID0gNzQKIAogRkFURV9BQUNfRU5DT0RFICs9IGZhdGUtYWFjLXRucy1lbmNvZGUKIGZhdGUtYWFjLXRucy1lbmNvZGU6IENNRCA9IGVuY19kZWNfcGNtIGFkdHMgd2F2IHMxNmxlICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvLXJlZmVyZW5jZS9sdWNreW5pZ2h0XzJjaF80NGtIel9zMTYud2F2IC1jOmEgYWFjIC1hYWNfdG5zIDEgLWFhY19pcyAwIC1hYWNfcG5zIDAgLWFhY19tcyAwIC1iOmEgMTI4ayAtY3V0b2ZmIDIyMDUwICAtZmZsYWdzICtiaXRleGFjdCAtZmxhZ3MgK2JpdGV4YWN0CiBmYXRlLWFhYy10bnMtZW5jb2RlOiBDTVAgPSBzdGRkZXYKIGZhdGUtYWFjLXRucy1lbmNvZGU6IFJFRiA9ICQoU0FNUExFUykvYXVkaW8tcmVmZXJlbmNlL2x1Y2t5bmlnaHRfMmNoXzQ0a0h6X3MxNi53YXYKIGZhdGUtYWFjLXRucy1lbmNvZGU6IENNUF9TSElGVCA9IC00MDk2Ci1mYXRlLWFhYy10bnMtZW5jb2RlOiBDTVBfVEFSR0VUID0gODE3CitmYXRlLWFhYy10bnMtZW5jb2RlOiBDTVBfVEFSR0VUID0gNjM3CiBmYXRlLWFhYy10bnMtZW5jb2RlOiBGVVpaID0gNwogZmF0ZS1hYWMtdG5zLWVuY29kZTogU0laRV9UT0xFUkFOQ0UgPSAzNTYwCiAKQEAgLTE5MSw3ICsxOTksNyBAQAogZmF0ZS1hYWMtaXMtZW5jb2RlOiBDTVAgPSBzdGRkZXYKIGZhdGUtYWFjLWlzLWVuY29kZTogUkVGID0gJChTQU1QTEVTKS9hdWRpby1yZWZlcmVuY2UvbHVja3luaWdodF8yY2hfNDRrSHpfczE2LndhdgogZmF0ZS1hYWMtaXMtZW5jb2RlOiBDTVBfU0hJRlQgPSAtNDA5NgotZmF0ZS1hYWMtaXMtZW5jb2RlOiBDTVBfVEFSR0VUID0gNjE1CitmYXRlLWFhYy1pcy1lbmNvZGU6IENNUF9UQVJHRVQgPSA1MTQKIGZhdGUtYWFjLWlzLWVuY29kZTogU0laRV9UT0xFUkFOQ0UgPSAzNTYwCiBmYXRlLWFhYy1pcy1lbmNvZGU6IEZVWlogPSAxMAogCkBAIC0yMDAsMjUgKzIwOCwyNyBAQAogZmF0ZS1hYWMtbXMtZW5jb2RlOiBDTVAgPSBzdGRkZXYKIGZhdGUtYWFjLW1zLWVuY29kZTogUkVGID0gJChTQU1QTEVTKS9hdWRpby1yZWZlcmVuY2UvbHVja3luaWdodF8yY2hfNDRrSHpfczE2LndhdgogZmF0ZS1hYWMtbXMtZW5jb2RlOiBDTVBfU0hJRlQgPSAtNDA5NgotZmF0ZS1hYWMtbXMtZW5jb2RlOiBDTVBfVEFSR0VUID0gNjc1CitmYXRlLWFhYy1tcy1lbmNvZGU6IENNUF9UQVJHRVQgPSA1NTgKIGZhdGUtYWFjLW1zLWVuY29kZTogU0laRV9UT0xFUkFOQ0UgPSAzNTYwCiBmYXRlLWFhYy1tcy1lbmNvZGU6IEZVWlogPSAxNQogCi1GQVRFX0FBQ19FTkNPREUgKz0gZmF0ZS1hYWMtbHRwLWVuY29kZQotZmF0ZS1hYWMtbHRwLWVuY29kZTogQ01EID0gZW5jX2RlY19wY20gYWR0cyB3YXYgczE2bGUgJChUQVJHRVRfU0FNUExFUykvYXVkaW8tcmVmZXJlbmNlL2x1Y2t5bmlnaHRfMmNoXzQ0a0h6X3MxNi53YXYgLXN0cmljdCAtMiAtYzphIGFhYyAtcHJvZmlsZTphIGFhY19sdHAgLWFhY19wbnMgMCAtYWFjX2lzIDAgLWFhY19tcyAwIC1hYWNfdG5zIDAgLWI6YSAzNmsgLWZmbGFncyArYml0ZXhhY3QgLWZsYWdzICtiaXRleGFjdAotZmF0ZS1hYWMtbHRwLWVuY29kZTogQ01QID0gc3RkZGV2Ci1mYXRlLWFhYy1sdHAtZW5jb2RlOiBSRUYgPSAkKFNBTVBMRVMpL2F1ZGlvLXJlZmVyZW5jZS9sdWNreW5pZ2h0XzJjaF80NGtIel9zMTYud2F2Ci1mYXRlLWFhYy1sdHAtZW5jb2RlOiBDTVBfU0hJRlQgPSAtNDA5NgotZmF0ZS1hYWMtbHRwLWVuY29kZTogQ01QX1RBUkdFVCA9IDEyNzAKLWZhdGUtYWFjLWx0cC1lbmNvZGU6IFNJWkVfVE9MRVJBTkNFID0gMzU2MAotZmF0ZS1hYWMtbHRwLWVuY29kZTogRlVaWiA9IDE3CisjVGlja2V0MTc4NAorRkFURV9BQUNfRU5DT0RFICs9IGZhdGUtYWFjLXlvcmF3LWVuY29kZQorZmF0ZS1hYWMteW9yYXctZW5jb2RlOiBDTUQgPSBlbmNfZGVjX3BjbSBhZHRzIHdhdiBzMTZsZSAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpby1yZWZlcmVuY2UveW8ucmF3LXNob3J0LndhdiAtYzphIGFhYyAtZmZsYWdzICtiaXRleGFjdCAtZmxhZ3MgK2JpdGV4YWN0CitmYXRlLWFhYy15b3Jhdy1lbmNvZGU6IENNUCA9IHN0ZGRldgorZmF0ZS1hYWMteW9yYXctZW5jb2RlOiBSRUYgPSAkKFNBTVBMRVMpL2F1ZGlvLXJlZmVyZW5jZS95by5yYXctc2hvcnQud2F2CitmYXRlLWFhYy15b3Jhdy1lbmNvZGU6IENNUF9TSElGVCA9IC0xMjI4OAorZmF0ZS1hYWMteW9yYXctZW5jb2RlOiBDTVBfVEFSR0VUID0gMjI2CitmYXRlLWFhYy15b3Jhdy1lbmNvZGU6IFNJWkVfVE9MRVJBTkNFID0gMzU2MAorZmF0ZS1hYWMteW9yYXctZW5jb2RlOiBGVVpaID0gMTcKKwogCiBGQVRFX0FBQ19FTkNPREUgKz0gZmF0ZS1hYWMtcHJlZC1lbmNvZGUKIGZhdGUtYWFjLXByZWQtZW5jb2RlOiBDTUQgPSBlbmNfZGVjX3BjbSBhZHRzIHdhdiBzMTZsZSAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpby1yZWZlcmVuY2UvbHVja3luaWdodF8yY2hfNDRrSHpfczE2LndhdiAtcHJvZmlsZTphIGFhY19tYWluIC1jOmEgYWFjIC1hYWNfaXMgMCAtYWFjX3BucyAwIC1hYWNfbXMgMCAtYWFjX3RucyAwIC1iOmEgMTI4ayAtY3V0b2ZmIDIyMDUwCiBmYXRlLWFhYy1wcmVkLWVuY29kZTogQ01QID0gc3RkZGV2CiBmYXRlLWFhYy1wcmVkLWVuY29kZTogUkVGID0gJChTQU1QTEVTKS9hdWRpby1yZWZlcmVuY2UvbHVja3luaWdodF8yY2hfNDRrSHpfczE2LndhdgogZmF0ZS1hYWMtcHJlZC1lbmNvZGU6IENNUF9TSElGVCA9IC00MDk2Ci1mYXRlLWFhYy1wcmVkLWVuY29kZTogQ01QX1RBUkdFVCA9IDg0MQorZmF0ZS1hYWMtcHJlZC1lbmNvZGU6IENNUF9UQVJHRVQgPSA2NjIKIGZhdGUtYWFjLXByZWQtZW5jb2RlOiBGVVpaID0gMTIKIGZhdGUtYWFjLXByZWQtZW5jb2RlOiBTSVpFX1RPTEVSQU5DRSA9IDM1NjAKIApAQCAtMjMwLDYgKzI0MCw5IEBACiBmYXRlLWFhYy1sYXRtX3N0ZXJlb190b181MTogQ01EID0gcGNtIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FhYy9sYXRtX3N0ZXJlb190b181MS50cyAtY2hhbm5lbF9sYXlvdXQgNS4xCiBmYXRlLWFhYy1sYXRtX3N0ZXJlb190b181MTogUkVGID0gJChTQU1QTEVTKS9hYWMvbGF0bV9zdGVyZW9fdG9fNTFfcmVmLnMxNgogCitmYXRlLWFhYy1hdXRvYnNmLWFkdHN0b2FzYzogQ01EID0gdHJhbnNjb2RlICJhYWMiICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfYWZjb252ZXJ0XzE2MDAwX21vbm9fYWFjX2xjLmFkdHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyb3NrYSAiLWM6YSBjb3B5IiAiLWM6YSBjb3B5IgorCiBGQVRFX0FBQy0kKGNhbGwgICAgICBERU1ERUMsIEFBQywgICAgQUFDKSAgICAgICs9ICQoRkFURV9BQUNfQ1RfUkFXKQogRkFURV9BQUMtJChjYWxsICAgICAgREVNREVDLCBNT1YsICAgIEFBQykgICAgICArPSAkKEZBVEVfQUFDKQogRkFURV9BQUNfTEFUTS0kKGNhbGwgREVNREVDLCBNUEVHVFMsIEFBQ19MQVRNKSArPSAkKEZBVEVfQUFDX0xBVE0pCkBAIC0yNDIsNyArMjU1LDkgQEAKIAogRkFURV9BQUNfRU5DT0RFLSQoY2FsbCBFTkNNVVgsIEFBQywgQURUUykgKz0gJChGQVRFX0FBQ19FTkNPREUpCiAKLUZBVEVfU0FNUExFU19GRk1QRUcgKz0gJChGQVRFX0FBQ19BTEwpICQoRkFURV9BQUNfRU5DT0RFLXllcykKK0ZBVEVfQUFDX0JTRi0kKGNhbGwgQUxMWUVTLCBBQUNfREVNVVhFUiBBQUNfQURUU1RPQVNDX0JTRiBNQVRST1NLQV9NVVhFUikgKz0gZmF0ZS1hYWMtYXV0b2JzZi1hZHRzdG9hc2MKIAotZmF0ZS1hYWM6ICQoRkFURV9BQUNfQUxMKSAkKEZBVEVfQUFDX0VOQ09ERSkKK0ZBVEVfU0FNUExFU19GRk1QRUcgKz0gJChGQVRFX0FBQ19BTEwpICQoRkFURV9BQUNfRU5DT0RFLXllcykgJChGQVRFX0FBQ19CU0YteWVzKQorCitmYXRlLWFhYzogJChGQVRFX0FBQ19BTEwpICQoRkFURV9BQUNfRU5DT0RFKSAkKEZBVEVfQUFDX0JTRi15ZXMpCiBmYXRlLWFhYy1sYXRtOiAkKEZBVEVfQUFDX0xBVE0teWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9hYzMubWFrIGIvdGVzdHMvZmF0ZS9hYzMubWFrCmluZGV4IGU2MzYyNzEuLmJiMDJkMzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvYWMzLm1haworKysgYi90ZXN0cy9mYXRlL2FjMy5tYWsKQEAgLTM2LDYgKzM2LDE0IEBACiBmYXRlLWFjMy1maXhlZC00LjAtZG93bm1peC1tb25vOiBDTUQgPSBwY20gLWMgYWMzX2ZpeGVkIC1yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0IDQgLWkgJChUQVJHRVRfU0FNUExFUykvYWMzL21pbGxlcnNfY3Jvc3NpbmdfNC4wLmFjMwogZmF0ZS1hYzMtZml4ZWQtNC4wLWRvd25taXgtbW9ubzogUkVGID0gJChTQU1QTEVTKS9hYzMvbWlsbGVyc19jcm9zc2luZ180LjBfbW9ub192Mi5wY20KIAorRkFURV9BQzMgKz0gZmF0ZS1hYzMtZml4ZWQtNS4xLWRvd25taXgtbW9ubworZmF0ZS1hYzMtZml4ZWQtNS4xLWRvd25taXgtbW9ubzogQ01EID0gcGNtIC1jIGFjM19maXhlZCAtcmVxdWVzdF9jaGFubmVsX2xheW91dCA0IC1pICQoVEFSR0VUX1NBTVBMRVMpL2FjMy9tb25zdGVyc19pbmNfNS4xXzQ0OF9zbWFsbC5hYzMKK2ZhdGUtYWMzLWZpeGVkLTUuMS1kb3dubWl4LW1vbm86IFJFRiA9ICQoU0FNUExFUykvYWMzL21vbnN0ZXJzX2luY181LjFfNDQ4X3NtYWxsX21vbm9fdjIucGNtCisKK0ZBVEVfQUMzICs9IGZhdGUtYWMzLWZpeGVkLTUuMS1kb3dubWl4LXN0ZXJlbworZmF0ZS1hYzMtZml4ZWQtNS4xLWRvd25taXgtc3RlcmVvOiBDTUQgPSBwY20gLWMgYWMzX2ZpeGVkIC1yZXF1ZXN0X2NoYW5uZWxfbGF5b3V0IDMgLWkgJChUQVJHRVRfU0FNUExFUykvYWMzL21vbnN0ZXJzX2luY181LjFfNDQ4X3NtYWxsLmFjMworZmF0ZS1hYzMtZml4ZWQtNS4xLWRvd25taXgtc3RlcmVvOiBSRUYgPSAkKFNBTVBMRVMpL2FjMy9tb25zdGVyc19pbmNfNS4xXzQ0OF9zbWFsbF9zdGVyZW9fdjIucGNtCisKIEZBVEVfRUFDMyArPSBmYXRlLWVhYzMtMQogZmF0ZS1lYWMzLTE6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9lYWMzL2NzaV9taWFtaV81LjFfMjU2X3NweF9zbWFsbC5lYWMzCiBmYXRlLWVhYzMtMTogUkVGID0gJChTQU1QTEVTKS9lYWMzL2NzaV9taWFtaV81LjFfMjU2X3NweF9zbWFsbF92Mi5wY20KQEAgLTUyLDYgKzYwLDEwIEBACiBmYXRlLWVhYzMtNDogQ01EID0gcGNtIC1pICQoVEFSR0VUX1NBTVBMRVMpL2VhYzMvc2VyZW5pdHlfZW5nbGlzaF81LjFfMTUzNl9zbWFsbC5lYWMzCiBmYXRlLWVhYzMtNDogUkVGID0gJChTQU1QTEVTKS9lYWMzL3NlcmVuaXR5X2VuZ2xpc2hfNS4xXzE1MzZfc21hbGxfdjIucGNtCiAKK0ZBVEVfRUFDMyArPSBmYXRlLWVhYzMtNQorZmF0ZS1lYWMzLTU6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9lYWMzL3RoZV9ncmVhdF93YWxsXzcuMS5lYWMzCitmYXRlLWVhYzMtNTogUkVGID0gJChTQU1QTEVTKS9lYWMzL3RoZV9ncmVhdF93YWxsXzcuMS5wY20KKwogJChGQVRFX0FDMykgJChGQVRFX0VBQzMpOiBDTVAgPSBvbmVvZmYKIAogRkFURV9BQzMtJChjYWxsICBERU1ERUMsIEFDMywgIEFDMykgICs9ICQoRkFURV9BQzMpCkBAIC04MCw2ICs5MiwxMSBAQAogZmF0ZS1hYzMtZml4ZWQtZW5jb2RlOiBDTVAgPSBvbmVsaW5lCiBmYXRlLWFjMy1maXhlZC1lbmNvZGU6IFJFRiA9IGExZDFmYzExNjQ2M2I3NzFhYmY1YWVmN2VkMzdkN2IxCiAKK0ZBVEVfRUFDMy0kKGNhbGwgQUxMWUVTLCBFQUMzX0RFTVVYRVIgRUFDM19NVVhFUiBFQUMzX0NPUkVfQlNGKSArPSBmYXRlLWVhYzMtY29yZS1ic2YKK2ZhdGUtZWFjMy1jb3JlLWJzZjogQ01EID0gbWQ1cGlwZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9lYWMzL3RoZV9ncmVhdF93YWxsXzcuMS5lYWMzIC1jOmEgY29weSAtYnNmOmEgZWFjM19jb3JlIC1mZmxhZ3MgK2JpdGV4YWN0IC1mIGVhYzMKK2ZhdGUtZWFjMy1jb3JlLWJzZjogQ01QID0gb25lbGluZQorZmF0ZS1lYWMzLWNvcmUtYnNmOiBSRUYgPSBiNzA0YmY4NTFlOTliNzQ0MmU5YmVkMzY4YjYwZTZjYQorCiBGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9BQzMteWVzKSAkKEZBVEVfRUFDMy15ZXMpCiAKIGZhdGUtYWMzOiAkKEZBVEVfQUMzLXllcykgJChGQVRFX0VBQzMteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9hY29kZWMubWFrIGIvdGVzdHMvZmF0ZS9hY29kZWMubWFrCmluZGV4IGUwZjIzMjAuLjgwZDI2ZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvYWNvZGVjLm1haworKysgYi90ZXN0cy9mYXRlL2Fjb2RlYy5tYWsKQEAgLTEwNCwxNCArMTA0LDE0IEBACiBmYXRlLWFjb2RlYy1kY2E6IFNSQyA9IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CiBmYXRlLWFjb2RlYy1kY2E6IENNRCA9IG1kNSAtaSAkKFRBUkdFVF9QQVRIKS8kKFNSQykgLWM6YSBkY2EgLXN0cmljdCAtMiAtZiBkdHMgLWZsYWdzICtiaXRleGFjdAogZmF0ZS1hY29kZWMtZGNhOiBDTVAgPSBvbmVsaW5lCi1mYXRlLWFjb2RlYy1kY2E6IFJFRiA9IDdmZmRlZmRmNDcwNjkyODk5OTA3NTVjNzkzODdjYzkwCitmYXRlLWFjb2RlYy1kY2E6IFJFRiA9IDJhYTU4MGFjNjc4MjBmY2U0ZjU4MWI5NmViYjM0YWNjCiAKIEZBVEVfQUNPREVDLSQoY2FsbCBFTkNERUMsIERDQSwgV0FWKSArPSBmYXRlLWFjb2RlYy1kY2EyCiBmYXRlLWFjb2RlYy1kY2EyOiBDTUQgPSBlbmNfZGVjX3BjbSBkdHMgd2F2IHMxNmxlICQoU1JDKSAtYzphIGRjYSAtc3RyaWN0IC0yIC1mbGFncyArYml0ZXhhY3QKIGZhdGUtYWNvZGVjLWRjYTI6IFJFRiA9ICQoU1JDKQogZmF0ZS1hY29kZWMtZGNhMjogQ01QID0gc3RkZGV2CiBmYXRlLWFjb2RlYy1kY2EyOiBDTVBfU0hJRlQgPSAtMjA0OAotZmF0ZS1hY29kZWMtZGNhMjogQ01QX1RBUkdFVCA9IDUyNworZmF0ZS1hY29kZWMtZGNhMjogQ01QX1RBUkdFVCA9IDUzNQogZmF0ZS1hY29kZWMtZGNhMjogU0laRV9UT0xFUkFOQ0UgPSAxNjMyCiAKIEZBVEVfQUNPREVDLSQoY2FsbCBFTkNERUMsIEZMQUMsIEZMQUMpICs9IGZhdGUtYWNvZGVjLWZsYWMgZmF0ZS1hY29kZWMtZmxhYy1leGFjdC1yaWNlCkBAIC0xNTQsOCArMTU0LDggQEAKIGZhdGUtYWNvZGVjLXdhdnBhY2s6IEZNVCA9IHd2CiBmYXRlLWFjb2RlYy13YXZwYWNrOiBDT0RFQyA9IHdhdnBhY2sgLWNvbXByZXNzaW9uX2xldmVsIDEKIAotRkFURV9BQ09ERUMtJChjYWxsIEVOQ0RFQywgVFRBLCBNQVRST1NLQSkgKz0gZmF0ZS1hY29kZWMtdHRhCi1mYXRlLWFjb2RlYy10dGE6IEZNVCA9IG1hdHJvc2thCitGQVRFX0FDT0RFQy0kKGNhbGwgRU5DREVDLCBUVEEsIFRUQSkgKz0gZmF0ZS1hY29kZWMtdHRhCitmYXRlLWFjb2RlYy10dGE6IEZNVCA9IHR0YQogCiBGQVRFX0FDT0RFQyArPSAkKEZBVEVfQUNPREVDLXllcykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9hcGkubWFrIGIvdGVzdHMvZmF0ZS9hcGkubWFrCmluZGV4IDJlYmM1MzEuLmViNjU2ZTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvYXBpLm1haworKysgYi90ZXN0cy9mYXRlL2FwaS5tYWsKQEAgLTIsMjMgKzIsMjAgQEAKIGZhdGUtYXBpLWZsYWM6ICQoQVBJVEVTVFNESVIpL2FwaS1mbGFjLXRlc3QkKEVYRVNVRikKIGZhdGUtYXBpLWZsYWM6IENNRCA9IHJ1biAkKEFQSVRFU1RTRElSKS9hcGktZmxhYy10ZXN0CiBmYXRlLWFwaS1mbGFjOiBDTVAgPSBudWxsCi1mYXRlLWFwaS1mbGFjOiBSRUYgPSAvZGV2L251bGwKIAogRkFURV9BUElfU0FNUExFU19MSUJBVkZPUk1BVC0kKGNhbGwgREVNREVDLCBGTFYsIEZMVikgKz0gZmF0ZS1hcGktYmFuZAogZmF0ZS1hcGktYmFuZDogJChBUElURVNUU0RJUikvYXBpLWJhbmQtdGVzdCQoRVhFU1VGKQogZmF0ZS1hcGktYmFuZDogQ01EID0gcnVuICQoQVBJVEVTVFNESVIpL2FwaS1iYW5kLXRlc3QgJChUQVJHRVRfU0FNUExFUykvbXBlZzQvcmVzaXplX2Rvd24tdXAuaDI2MwogZmF0ZS1hcGktYmFuZDogQ01QID0gbnVsbAotZmF0ZS1hcGktYmFuZDogUkVGID0gL2Rldi9udWxsCiAKIEZBVEVfQVBJX1NBTVBMRVNfTElCQVZGT1JNQVQtJChjYWxsIERFTURFQywgSDI2NCwgSDI2NCkgKz0gZmF0ZS1hcGktaDI2NAogZmF0ZS1hcGktaDI2NDogJChBUElURVNUU0RJUikvYXBpLWgyNjQtdGVzdCQoRVhFU1VGKQogZmF0ZS1hcGktaDI2NDogQ01EID0gcnVuICQoQVBJVEVTVFNESVIpL2FwaS1oMjY0LXRlc3QgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9TVkFfTkwyX0UuMjY0CiAKLUZBVEVfQVBJX0xJQkFWRk9STUFULXllcyArPSBmYXRlLWFwaS1zZWVrCi1mYXRlLWFwaS1zZWVrOiAkKEFQSVRFU1RTRElSKS9hcGktc2Vlay10ZXN0JChFWEVTVUYpIGZhdGUtbGF2ZgorRkFURV9BUElfTElCQVZGT1JNQVQtJChjYWxsIERFTURFQywgRkxWLCBGTFYpICs9IGZhdGUtYXBpLXNlZWsKK2ZhdGUtYXBpLXNlZWs6ICQoQVBJVEVTVFNESVIpL2FwaS1zZWVrLXRlc3QkKEVYRVNVRikgZmF0ZS1sYXZmLWZsdl9mbXQKIGZhdGUtYXBpLXNlZWs6IENNRCA9IHJ1biAkKEFQSVRFU1RTRElSKS9hcGktc2Vlay10ZXN0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmZsdiAwIDcyMAogZmF0ZS1hcGktc2VlazogQ01QID0gbnVsbAotZmF0ZS1hcGktc2VlazogUkVGID0gL2Rldi9udWxsCiAKIEZBVEVfQVBJX1NBTVBMRVNfTElCQVZGT1JNQVQtJChjYWxsIERFTURFQywgSU1BR0UyLCBQTkcpICs9IGZhdGUtYXBpLXBuZy1jb2RlYy1wYXJhbQogZmF0ZS1hcGktcG5nLWNvZGVjLXBhcmFtOiAkKEFQSVRFU1RTRElSKS9hcGktY29kZWMtcGFyYW0tdGVzdCQoRVhFU1VGKQpAQCAtMzIsNyArMjksNiBAQAogZmF0ZS1hcGktdGhyZWFkbWVzc2FnZTogJChBUElURVNUU0RJUikvYXBpLXRocmVhZG1lc3NhZ2UtdGVzdCQoRVhFU1VGKQogZmF0ZS1hcGktdGhyZWFkbWVzc2FnZTogQ01EID0gcnVuICQoQVBJVEVTVFNESVIpL2FwaS10aHJlYWRtZXNzYWdlLXRlc3QgMyAxMCAzMCA1MCAyIDIwIDQwCiBmYXRlLWFwaS10aHJlYWRtZXNzYWdlOiBDTVAgPSBudWxsCi1mYXRlLWFwaS10aHJlYWRtZXNzYWdlOiBSRUYgPSAvZGV2L251bGwKIAogRkFURV9BUElfU0FNUExFUy0kKENPTkZJR19BVkZPUk1BVCkgKz0gJChGQVRFX0FQSV9TQU1QTEVTX0xJQkFWRk9STUFULXllcykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9hcG5nLm1hayBiL3Rlc3RzL2ZhdGUvYXBuZy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxMzhiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZhdGUvYXBuZy5tYWsKQEAgLTAsMCArMSwxMCBAQAorRkFURV9BUE5HICs9IGZhdGUtYXBuZy1jbG9jaworZmF0ZS1hcG5nLWNsb2NrOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9hcG5nL2Nsb2NrLnBuZworCitGQVRFX0FQTkcgKz0gZmF0ZS1hcG5nLW9zYW1wbGUKK2ZhdGUtYXBuZy1vc2FtcGxlOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9hcG5nL29fc2FtcGxlLnBuZworCitGQVRFX0FQTkctJChjYWxsIERFTURFQywgQVBORywgQVBORykgKz0gJChGQVRFX0FQTkcpCisKK0ZBVEVfU0FNUExFU19GRk1QRUcgKz0gJChGQVRFX0FQTkcteWVzKQorZmF0ZS1hcG5nOiAkKEZBVEVfQVBORy15ZXMpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2F1ZGlvLm1hayBiL3Rlc3RzL2ZhdGUvYXVkaW8ubWFrCmluZGV4IGU4ODJhY2UuLjQwYzRjYTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvYXVkaW8ubWFrCisrKyBiL3Rlc3RzL2ZhdGUvYXVkaW8ubWFrCkBAIC0yNiw3ICsyNiw3IEBACiBGQVRFX1NBTVBMRVNfQVVESU8tJChjYWxsIERFTURFQywgQVZJLCBJTUMpICs9IGZhdGUtaW1jCiBmYXRlLWltYzogQ01EID0gcGNtIC1pICQoVEFSR0VUX1NBTVBMRVMpL2ltYy9pbWMuYXZpCiBmYXRlLWltYzogQ01QID0gb25lb2ZmCi1mYXRlLWltYzogUkVGID0gJChTQU1QTEVTKS9pbWMvaW1jLnBjbQorZmF0ZS1pbWM6IFJFRiA9ICQoU0FNUExFUykvaW1jL2ltYy0yMDE3MDYucGNtCiAKIEZBVEVfU0FNUExFU19BVURJTy0kKGNhbGwgREVNREVDLCBGTFYsIE5FTExZTU9TRVIpICs9IGZhdGUtbmVsbHltb3NlcgogZmF0ZS1uZWxseW1vc2VyOiBDTUQgPSBwY20gLWkgJChUQVJHRVRfU0FNUExFUykvbmVsbHltb3Nlci9uZWxseW1vc2VyLmZsdgpAQCAtNTcsNyArNTcsMTEgQEAKIEZBVEVfU0FNUExFU19BVURJTy0kKGNhbGwgREVNREVDLCBXU1ZRQSwgV1NfU05EMSkgKz0gZmF0ZS13c19zbmQKIGZhdGUtd3Nfc25kOiBDTUQgPSBtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvdnFhL3dzX3NuZC52cWEgLWYgczE2bGUKIAorZmF0ZS1mbGNsMTkwNTogQ01EID0gcnVuIGZmcHJvYmUkKFBST0dTU1VGKSQoRVhFU1VGKSAtc2hvd19mcmFtZXMgLXNob3dfcGFja2V0cyAtcHJpbnRfZm9ybWF0IGNvbXBhY3QgJChUQVJHRVRfU0FNUExFUykvd2F2L0ZMQ0xfRW5kaW5nX015LXNob3J0LndhdgorCiBGQVRFX1NBTVBMRVNfQVVESU8gKz0gJChGQVRFX1NBTVBMRVNfQVVESU8teWVzKQogCitGQVRFX1NBTVBMRVNfRkZQUk9CRSArPSBmYXRlLWZsY2wxOTA1CisKIEZBVEVfU0FNUExFU19GRk1QRUcgKz0gJChGQVRFX1NBTVBMRVNfQVVESU8pCi1mYXRlLWF1ZGlvOiAkKEZBVEVfU0FNUExFU19BVURJTykKK2ZhdGUtYXVkaW86ICQoRkFURV9TQU1QTEVTX0FVRElPKSBmYXRlLWZsY2wxOTA1CmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2F2Zm9ybWF0Lm1hayBiL3Rlc3RzL2ZhdGUvYXZmb3JtYXQubWFrCmluZGV4IDU0YmZiOTcuLmExMmY5Y2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvYXZmb3JtYXQubWFrCisrKyBiL3Rlc3RzL2ZhdGUvYXZmb3JtYXQubWFrCkBAIC0xLDUgKzEsNiBAQAogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBQQ01fUzE2QkUsICAgICAgICAgICAgIEFJRkYpICAgICAgICAgICAgICAgKz0gYWlmZgogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBQQ01fQUxBVywgICAgICAgICAgICAgIFBDTV9BTEFXKSAgICAgICAgICAgKz0gYWxhdworRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBBUE5HLCAgICAgICAgICAgICAgICAgIEFQTkcpICAgICAgICAgICAgICAgKz0gYXBuZwogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMyLCBNU01QRUc0VjMsICBNUDIsICAgICAgIEFTRikgICAgICAgICAgICAgICAgKz0gYXNmCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIFBDTV9TMTZCRV9QTEFOQVIsICAgICAgQVNUKSAgICAgICAgICAgICAgICArPSBhc3QKIEZBVEVfTEFWRi0kKGNhbGwgRU5DREVDLCAgUENNX1MxNkJFLCAgICAgICAgICAgICBBVSkgICAgICAgICAgICAgICAgICs9IGF1CkBAIC04LDEzICs5LDE0IEBACiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIFBDTV9TMTZCRSwgICAgICAgICAgICAgQ0FGKSAgICAgICAgICAgICAgICArPSBjYWYKIEZBVEVfTEFWRi0kKGNhbGwgRU5DREVDLCAgRFBYLCAgICAgICAgICAgICAgICAgICBJTUFHRTIpICAgICAgICAgICAgICs9IGRweAogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMyLCBEVlZJREVPLCAgICBQQ01fUzE2TEUsIEFWSSkgICAgICAgICAgICAgICAgKz0gZHZfZm10Ci1GQVRFX0xBVkYtJChjYWxsIEVOQ0RFQzIsIE1QRUcxVklERU8sIE1QMiwgICAgICAgRkZNKSAgICAgICAgICAgICAgICArPSBmZm0KK0ZBVEVfTEFWRi0kKGNhbGwgRU5DREVDLCAgRklUUywgICAgICAgICAgICAgICAgICBGSVRTKSAgICAgICAgICAgICAgICs9IGZpdHMKIEZBVEVfTEFWRi0kKGNhbGwgRU5DREVDLCAgUkFXVklERU8sICAgICAgICAgICAgICBGSUxNU1RSSVApICAgICAgICAgICs9IGZsbQogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBGTFYsICAgICAgICAgICAgICAgICAgIEZMVikgICAgICAgICAgICAgICAgKz0gZmx2X2ZtdAogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBHSUYsICAgICAgICAgICAgICAgICAgIElNQUdFMikgICAgICAgICAgICAgKz0gZ2lmCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQzIsIE1QRUcyVklERU8sIFBDTV9TMTZMRSwgR1hGKSAgICAgICAgICAgICAgICArPSBneGYKIEZBVEVfTEFWRi0kKGNhbGwgRU5DREVDLCAgUENNX1MxNkxFLCAgICAgICAgICAgICBJUkNBTSkgICAgICAgICAgICAgICs9IGlyY2FtCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIE1KUEVHLCAgICAgICAgICAgICAgICAgSU1BR0UyKSAgICAgICAgICAgICArPSBqcGcKK0ZBVEVfTEFWRi0kKGNhbGwgRU5DTVVYLCAgVFRBLCAgICAgICAgICAgICAgICAgICBNQVRST1NLQV9BVURJTykgICAgICs9IG1rYQogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMyLCBNUEVHNCwgICAgICBNUDIsICAgICAgIE1BVFJPU0tBKSAgICAgICAgICAgKz0gbWt2CiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIEFEUENNX1lBTUFIQSwgICAgICAgICAgTU1GKSAgICAgICAgICAgICAgICArPSBtbWYKIEZBVEVfTEFWRi0kKGNhbGwgRU5DREVDMiwgTVBFRzQsICAgICAgUENNX0FMQVcsICBNT1YpICAgICAgICAgICAgICAgICs9IG1vdiBpc212CkBAIC0yMiw2ICsyNCw4IEBACiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIFBDTV9NVUxBVywgICAgICAgICAgICAgUENNX01VTEFXKSAgICAgICAgICArPSBtdWxhdwogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMyLCBNUEVHMlZJREVPLCBQQ01fUzE2TEUsIE1YRikgICAgICAgICAgICAgICAgKz0gbXhmCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQzIsIE1QRUcyVklERU8sIFBDTV9TMTZMRSwgTVhGX0QxMCBNWEYpICAgICAgICArPSBteGZfZDEwCitGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQzIsIERWVklERU8sICAgIFBDTV9TMTZMRSwgTVhGKSAgICAgICAgICAgICAgICArPSBteGZfZHYyNQorRkFURV9MQVZGLSQoY2FsbCBFTkNERUMyLCBEVlZJREVPLCAgICBQQ01fUzE2TEUsIE1YRikgICAgICAgICAgICAgICAgKz0gbXhmX2R2Y3BybzUwCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQzIsIEROWEhELCAgICAgIFBDTV9TMTZMRSwgTVhGX09QQVRPTSBNWEYpICAgICArPSBteGZfb3BhdG9tCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQzIsIEROWEhELCAgICAgIFBDTV9TMTZMRSwgTVhGX09QQVRPTSBNWEYpICAgICArPSBteGZfb3BhdG9tX2F1ZGlvCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQzIsIE1QRUc0LCAgICAgIE1QMiwgICAgICAgTlVUKSAgICAgICAgICAgICAgICArPSBudXQKQEAgLTQ0LDYgKzQ4LDcgQEAKIEZBVEVfTEFWRi0kKGNhbGwgRU5DREVDLCAgVEFSR0EsICAgICAgICAgICAgICAgICBJTUFHRTIpICAgICAgICAgICAgICs9IHRnYQogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBUSUZGLCAgICAgICAgICAgICAgICAgIElNQUdFMikgICAgICAgICAgICAgKz0gdGlmZgogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMyLCBNUEVHMlZJREVPLCBNUDIsICAgICAgIE1QRUdUUykgICAgICAgICAgICAgKz0gdHMKK0ZBVEVfTEFWRi0kKGNhbGwgRU5DREVDLCAgVFRBLCAgICAgICAgICAgICAgICAgICBUVEEpICAgICAgICAgICAgICAgICs9IHR0YQogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBQQ01fVTgsICAgICAgICAgICAgICAgIFZPQykgICAgICAgICAgICAgICAgKz0gdm9jCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIFBDTV9TMTZMRSwgICAgICAgICAgICAgVk9DKSAgICAgICAgICAgICAgICArPSB2b2NfczE2CiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIFBDTV9TMTZMRSwgICAgICAgICAgICAgV0FWKSAgICAgICAgICAgICAgICArPSB3YXYKQEAgLTUxLDYgKzU2LDcgQEAKIEZBVEVfTEFWRi0kKGNhbGwgRU5DREVDLCAgUENNX1MxNkxFLCAgICAgICAgICAgICBXQVYpICAgICAgICAgICAgICAgICs9IHdhdl9wZWFrX29ubHkKIEZBVEVfTEFWRi0kKGNhbGwgRU5DTVVYLCAgUENNX1MxNkxFLCAgICAgICAgICAgICBXNjQpICAgICAgICAgICAgICAgICs9IHc2NAogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBNUDIsICAgICAgICAgICAgICAgICAgIFdUVikgICAgICAgICAgICAgICAgKz0gd3R2CitGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIFdBVlBBQ0ssICAgICAgICAgICAgICAgV1YpICAgICAgICAgICAgICAgICArPSB3dgogRkFURV9MQVZGLSQoY2FsbCBFTkNERUMsICBYQk0sICAgICAgICAgICAgICAgICAgIElNQUdFMikgICAgICAgICAgICAgKz0geGJtCiBGQVRFX0xBVkYtJChjYWxsIEVOQ0RFQywgIFhXRCwgICAgICAgICAgICAgICAgICAgSU1BR0UyKSAgICAgICAgICAgICArPSB4d2QKIEZBVEVfTEFWRi0kKENPTkZJR19ZVVY0TVBFR1BJUEVfTVVYRVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHl1djRtcGVnCkBAIC02NywxMSArNzMsNzAgQEAKIGZhdGUtbGF2ZjogICAgICQoRkFURV9MQVZGKQogCiBGQVRFX0xBVkZfRkFURS0kKGNhbGwgQUxMWUVTLCBNQVRST1NLQV9ERU1VWEVSICAgT0dHX01VWEVSKSAgICAgICAgICArPSBvZ2dfdnAzCitGQVRFX0xBVkZfRkFURS0kKGNhbGwgQUxMWUVTLCBNQVRST1NLQV9ERU1VWEVSICAgT0dWX01VWEVSKSAgICAgICAgICArPSBvZ2dfdnA4CiBGQVRFX0xBVkZfRkFURS0kKGNhbGwgQUxMWUVTLCBNT1ZfREVNVVhFUiAgICAgICAgTEFUTV9NVVhFUikgICAgICAgICArPSBsYXRtCiBGQVRFX0xBVkZfRkFURS0kKGNhbGwgQUxMWUVTLCBNUDNfREVNVVhFUiAgICAgICAgTVAzX01VWEVSKSAgICAgICAgICArPSBtcDMKK0ZBVEVfTEFWRl9GQVRFLSQoY2FsbCBBTExZRVMsIE1PVl9ERU1VWEVSICAgICAgICBNT1ZfTVVYRVIpICAgICAgICAgICs9IG1vdl9xdHJsZV9tYWNlNgorRkFURV9MQVZGX0ZBVEUtJChjYWxsIEFMTFlFUywgQVZJX0RFTVVYRVIgICAgICAgIEFWSV9NVVhFUikgICAgICAgICAgKz0gYXZpX2NyYW0KIAogRkFURV9MQVZGX0ZBVEUgKz0gICQoRkFURV9MQVZGX0ZBVEUteWVzOiU9ZmF0ZS1sYXZmLWZhdGUtJSkKICQoRkFURV9MQVZGX0ZBVEUpOiBDTUQgPSBsYXZmZmF0ZXRlc3QKIAogRkFURV9TQU1QTEVTX0ZGTVBFRyArPSAkKEZBVEVfTEFWRl9GQVRFKQogZmF0ZS1sYXZmLWZhdGU6ICAgICAgICAkKEZBVEVfTEFWRl9GQVRFKQorCit0ZXN0cy9kYXRhL21wNC10by10cy5tM3U4OiBUQUcgPSBHRU4KK3Rlc3RzL2RhdGEvbXA0LXRvLXRzLm0zdTg6IGZmbXBlZyQoUFJPR1NTVUYpJChFWEVTVUYpIHwgdGVzdHMvZGF0YQorCSQoTSkkKFRBUkdFVF9FWEVDKSAkKFRBUkdFVF9QQVRIKS8kPCBcCisgICAgICAgIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvaW50ZXJsYWNlZF9jcm9wLm1wNCBcCisgICAgICAgIC1mIHNzZWdtZW50IC1zZWdtZW50X3RpbWUgMSAtbWFwIDAgLWZsYWdzICtiaXRleGFjdCAtY29kZWMgY29weSBcCisgICAgICAgIC1zZWdtZW50X2xpc3QgJChUQVJHRVRfUEFUSCkvJEAgLXkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9tcDQtdG8tdHMtJTAzZC50cyAyPi9kZXYvbnVsbAorCit0ZXN0cy9kYXRhL2FkdHMtdG8tbWt2Lm0zdTg6IFRBRyA9IEdFTgordGVzdHMvZGF0YS9hZHRzLXRvLW1rdi5tM3U4OiBmZm1wZWckKFBST0dTU1VGKSQoRVhFU1VGKSB8IHRlc3RzL2RhdGEKKwkkKE0pJChUQVJHRVRfRVhFQykgJChUQVJHRVRfUEFUSCkvJDwgXAorICAgICAgICAtaSAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF8xNjAwMF9tb25vX2FhY19sYy5tNGEgXAorICAgICAgICAtZiBzZWdtZW50IC1zZWdtZW50X3RpbWUgMSAtbWFwIDAgLWZsYWdzICtiaXRleGFjdCAtY29kZWMgY29weSAtc2VnbWVudF9mb3JtYXRfb3B0aW9ucyBsaXZlPTEgXAorICAgICAgICAtc2VnbWVudF9saXN0ICQoVEFSR0VUX1BBVEgpLyRAIC15ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYWR0cy10by1ta3YtJTAzZC5ta3YgMj4vZGV2L251bGwKKwordGVzdHMvZGF0YS9hZHRzLXRvLW1rdi1oZWFkZXIubWt2OiBUQUcgPSBHRU4KK3Rlc3RzL2RhdGEvYWR0cy10by1ta3YtaGVhZGVyLm1rdjogZmZtcGVnJChQUk9HU1NVRikkKEVYRVNVRikgfCB0ZXN0cy9kYXRhCisJJChNKSQoVEFSR0VUX0VYRUMpICQoVEFSR0VUX1BBVEgpLyQ8IFwKKyAgICAgICAgLWkgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19hZmNvbnZlcnRfMTYwMDBfbW9ub19hYWNfbGMubTRhIFwKKyAgICAgICAgLWYgc2VnbWVudCAtc2VnbWVudF90aW1lIDEgLW1hcCAwIC1mbGFncyArYml0ZXhhY3QgLWNvZGVjIGNvcHkgLXNlZ21lbnRfZm9ybWF0X29wdGlvbnMgbGl2ZT0xIFwKKyAgICAgICAgLXNlZ21lbnRfaGVhZGVyX2ZpbGVuYW1lICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYWR0cy10by1ta3YtaGVhZGVyLm1rdiBcCisgICAgICAgIC15ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYWR0cy10by1ta3YtaGVhZGVyLSUwM2QubWt2IDI+L2Rldi9udWxsCisKK3Rlc3RzL2RhdGEvYWR0cy10by1ta3YtaGVhZGVyLSUubWt2OiB0ZXN0cy9kYXRhL2FkdHMtdG8tbWt2LWhlYWRlci5ta3YgOworCitGQVRFX1NFR01FTlRfUEFSVFMgKz0gMDAwIDAwMSAwMDIKKwordGVzdHMvZGF0YS9hZHRzLXRvLW1rdi1jYXRlZC1hbGwubWt2OiBUQUcgPSBHRU4KK3Rlc3RzL2RhdGEvYWR0cy10by1ta3YtY2F0ZWQtYWxsLm1rdjogdGVzdHMvZGF0YS9hZHRzLXRvLW1rdi1oZWFkZXIubWt2ICQoRkFURV9TRUdNRU5UX1BBUlRTOiU9dGVzdHMvZGF0YS9hZHRzLXRvLW1rdi1oZWFkZXItJS5ta3YpIHwgdGVzdHMvZGF0YQorCSQoTSljYXQgJF4gPiRACisKK3Rlc3RzL2RhdGEvYWR0cy10by1ta3YtY2F0ZWQtJS5ta3Y6IFRBRyA9IEdFTgordGVzdHMvZGF0YS9hZHRzLXRvLW1rdi1jYXRlZC0lLm1rdjogdGVzdHMvZGF0YS9hZHRzLXRvLW1rdi1oZWFkZXIubWt2IHRlc3RzL2RhdGEvYWR0cy10by1ta3YtaGVhZGVyLSUubWt2IHwgdGVzdHMvZGF0YQorCSQoTSljYXQgJF4gPiRACisKK0ZBVEVfU0VHTUVOVCArPSBmYXRlLXNlZ21lbnQtbXA0LXRvLXRzCitmYXRlLXNlZ21lbnQtbXA0LXRvLXRzOiB0ZXN0cy9kYXRhL21wNC10by10cy5tM3U4CitmYXRlLXNlZ21lbnQtbXA0LXRvLXRzOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvbXA0LXRvLXRzLm0zdTggLWMgY29weQorRkFURV9TRUdNRU5ULSQoY2FsbCBBTExZRVMsIE1PVl9ERU1VWEVSIEgyNjRfTVA0VE9BTk5FWEJfQlNGIE1QRUdUU19NVVhFUiBNQVRST1NLQV9ERU1VWEVSIFNFR01FTlRfTVVYRVIgSExTX0RFTVVYRVIpICs9IGZhdGUtc2VnbWVudC1tcDQtdG8tdHMKKworRkFURV9TRUdNRU5UICs9IGZhdGUtc2VnbWVudC1hZHRzLXRvLW1rdgorZmF0ZS1zZWdtZW50LWFkdHMtdG8tbWt2OiB0ZXN0cy9kYXRhL2FkdHMtdG8tbWt2Lm0zdTgKK2ZhdGUtc2VnbWVudC1hZHRzLXRvLW1rdjogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FkdHMtdG8tbWt2Lm0zdTggLWMgY29weQorZmF0ZS1zZWdtZW50LWFkdHMtdG8tbWt2OiBSRUYgPSAkKFNSQ19QQVRIKS90ZXN0cy9yZWYvZmF0ZS9zZWdtZW50LWFkdHMtdG8tbWt2LWhlYWRlci1hbGwKK0ZBVEVfU0VHTUVOVC0kKGNhbGwgQUxMWUVTLCBBQUNfREVNVVhFUiBBQUNfQURUU1RPQVNDX0JTRiBNQVRST1NLQV9NVVhFUiBNQVRST1NLQV9ERU1VWEVSIFNFR01FTlRfTVVYRVIgSExTX0RFTVVYRVIpICs9IGZhdGUtc2VnbWVudC1hZHRzLXRvLW1rdgorCitGQVRFX1NFR01FTlRfQUxMUEFSVFMgPSAkKEZBVEVfU0VHTUVOVF9QQVJUUykKK0ZBVEVfU0VHTUVOVF9BTExQQVJUUyArPSBhbGwKK0ZBVEVfU0VHTUVOVF9TUExJVCArPSAkKEZBVEVfU0VHTUVOVF9BTExQQVJUUzolPWZhdGUtc2VnbWVudC1hZHRzLXRvLW1rdi1oZWFkZXItJSkKKyQoZm9yZWFjaCBOLCQoRkFURV9TRUdNRU5UX0FMTFBBUlRTKSwkKGV2YWwgJChOOiU9ZmF0ZS1zZWdtZW50LWFkdHMtdG8tbWt2LWhlYWRlci0lKTogdGVzdHMvZGF0YS9hZHRzLXRvLW1rdi1jYXRlZC0kKE4pLm1rdikpCitmYXRlLXNlZ21lbnQtYWR0cy10by1ta3YtaGVhZGVyLSU6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS8kKEA6ZmF0ZS1zZWdtZW50LWFkdHMtdG8tbWt2LWhlYWRlci0lPWFkdHMtdG8tbWt2LWNhdGVkLSUpLm1rdiAtYyBjb3B5CitGQVRFX1NFR01FTlQtJChjYWxsIEFMTFlFUywgQUFDX0RFTVVYRVIgQUFDX0FEVFNUT0FTQ19CU0YgTUFUUk9TS0FfTVVYRVIgTUFUUk9TS0FfREVNVVhFUiBTRUdNRU5UX01VWEVSIEhMU19ERU1VWEVSKSArPSAkKEZBVEVfU0VHTUVOVF9TUExJVCkKKworRkFURV9TQU1QTEVTX0ZGTVBFRyArPSAkKEZBVEVfU0VHTUVOVC15ZXMpCisKK2ZhdGUtc2VnbWVudDogJChGQVRFX1NFR01FTlQteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9idWlsZC5tYWsgYi90ZXN0cy9mYXRlL2J1aWxkLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTdmOWViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9idWlsZC5tYWsKQEAgLTAsMCArMSwxNyBAQAorRkFURV9CVUlMRCArPSBmYXRlLWJ1aWxkLWFsbHRvb2xzCitmYXRlLWJ1aWxkLWFsbHRvb2xzOiBhbGx0b29scworCitGQVRFX0JVSUxEICs9IGZhdGUtYnVpbGQtY2hlY2toZWFkZXJzCitmYXRlLWJ1aWxkLWNoZWNraGVhZGVyczogY2hlY2toZWFkZXJzCisKK0ZBVEVfQlVJTEQgKz0gZmF0ZS1idWlsZC1leGFtcGxlcworZmF0ZS1idWlsZC1leGFtcGxlczogZXhhbXBsZXMKKworRkFURV9CVUlMRCArPSBmYXRlLWJ1aWxkLXRlc3Rwcm9ncworZmF0ZS1idWlsZC10ZXN0cHJvZ3M6IHRlc3Rwcm9ncworCiskKEZBVEVfQlVJTEQpOiBDTUQgPSBudWxsCiskKEZBVEVfQlVJTEQpOiBDTVAgPSBudWxsCisKKyMgRkFURSArPSAkKEZBVEVfQlVJTEQpCitmYXRlLWJ1aWxkOiAkKEZBVEVfQlVJTEQpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2Nhbm9wdXMubWFrIGIvdGVzdHMvZmF0ZS9jYW5vcHVzLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDE5MjExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9jYW5vcHVzLm1hawpAQCAtMCwwICsxLDM0IEBACisjbG9zc2xlc3MKK0ZBVEVfQ0FOT1BVU19DTExDICs9IGZhdGUtY2Fub3B1cy1jbGxjLWFyZ2IKK2ZhdGUtY2Fub3B1cy1jbGxjLWFyZ2I6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2NsbGMvc2FtcGxlLWNsbGMtYXJnYi5hdmkKKworRkFURV9DQU5PUFVTX0NMTEMgKz0gZmF0ZS1jYW5vcHVzLWNsbGMtcmdiCitmYXRlLWNhbm9wdXMtY2xsYy1yZ2I6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2NsbGMvc2FtcGxlLWNsbGMtcmdiLmF2aQorCitGQVRFX0NBTk9QVVNfQ0xMQyArPSBmYXRlLWNhbm9wdXMtY2xsYy15dXkyLW5vYmxvY2sKK2ZhdGUtY2Fub3B1cy1jbGxjLXl1eTItbm9ibG9jazogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvY2xsYy9zYW1wbGUtY2xsYy15dXkyLW5vYmxvY2suYXZpCisKK0ZBVEVfU0FNUExFU19GRk1QRUctJChjYWxsIERFTURFQywgQVZJLCBDTExDKSArPSAkKEZBVEVfQ0FOT1BVU19DTExDKQorZmF0ZS1jYW5vcHVzLWNsbGM6ICQoRkFURV9DQU5PUFVTX0NMTEMpCisKKyNsb3NzeQorRkFURV9DQU5PUFVTX0hRX0hRQSArPSBmYXRlLWNhbm9wdXMtaHFfaHFhLWhxCitmYXRlLWNhbm9wdXMtaHFfaHFhLWhxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jYW5vcHVzL2hxLmF2aQorCitGQVRFX0NBTk9QVVNfSFFfSFFBICs9IGZhdGUtY2Fub3B1cy1ocV9ocWEtaHFhCitmYXRlLWNhbm9wdXMtaHFfaHFhLWhxYTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvY2Fub3B1cy9ocWEuYXZpCisKK0ZBVEVfQ0FOT1BVU19IUV9IUUEgKz0gZmF0ZS1jYW5vcHVzLWhxX2hxYS1pbnRlcgorZmF0ZS1jYW5vcHVzLWhxX2hxYS1pbnRlcjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvY2Fub3B1cy9ocTI1aS5hdmkKKworRkFURV9TQU1QTEVTX0ZGTVBFRy0kKGNhbGwgREVNREVDLCBBVkksIEhRX0hRQSkgKz0gJChGQVRFX0NBTk9QVVNfSFFfSFFBKQorZmF0ZS1jYW5vcHVzLWhxX2hxYTogJChGQVRFX0NBTk9QVVNfSFFfSFFBKQorCitGQVRFX0NBTk9QVVNfSFFYICs9IGZhdGUtY2Fub3B1cy1ocXg0MjIKK2ZhdGUtY2Fub3B1cy1ocXg0MjI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2Nhbm9wdXMvaHF4NDIyLmF2aSAtcGl4X2ZtdCB5dXY0MjJwMTZiZSAtYW4KKworRkFURV9DQU5PUFVTX0hRWCArPSBmYXRlLWNhbm9wdXMtaHF4NDIyYQorZmF0ZS1jYW5vcHVzLWhxeDQyMmE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2Nhbm9wdXMvaHF4NDIyYS5hdmkgLXBpeF9mbXQgeXV2NDIycDE2YmUgLWFuCisKK0ZBVEVfU0FNUExFU19GRk1QRUctJChjYWxsIERFTURFQywgQVZJLCBIUVgpICs9ICQoRkFURV9DQU5PUFVTX0hRWCkKK2ZhdGUtY2Fub3B1cy1ocXg6ICQoRkFURV9DQU5PUFVTX0hRWCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvY2JzLm1hayBiL3Rlc3RzL2ZhdGUvY2JzLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzU5NjdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9jYnMubWFrCkBAIC0wLDAgKzEsNzkgQEAKKyMgUmVhZC93cml0ZSB0ZXN0czogdGhpcyB1c2VzIHRoZSBjb2RlYyBtZXRhZGF0YSBmaWx0ZXIgLSB3aXRoIG5vCisjIGFyZ3VtZW50cywgaXQgZGVjb21wb3NlcyB0aGUgc3RyZWFtIGZ1bGx5IGFuZCB0aGVuIHJlY29tcG9zZXMgaXQKKyMgd2l0aG91dCBtYWtpbmcgYW55IGNoYW5nZXMuCisKK2ZhdGUtY2JzOiBmYXRlLWNicy1oMjY0IGZhdGUtY2JzLWhldmMgZmF0ZS1jYnMtbXBlZzIKKworRkFURV9DQlNfREVQUyA9ICQoY2FsbCBBTExZRVMsICQoMSlfREVNVVhFUiAkKDEpX1BBUlNFUiAkKDIpX01FVEFEQVRBX0JTRiAkKDMpX0RFQ09ERVIgJCgzKV9NVVhFUikKKworZGVmaW5lIEZBVEVfQ0JTX1RFU1QKKyMgKGNvZGVjLCB0ZXN0X25hbWUsIHNhbXBsZV9maWxlLCBvdXRwdXRfZm9ybWF0KQorRkFURV9DQlNfJCgxKSArPSBmYXRlLWNicy0kKDEpLSQoMikKK2ZhdGUtY2JzLSQoMSktJCgyKTogQ01EID0gbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpLyQoMykgLWM6diBjb3B5IC1ic2Y6diAkKDEpX21ldGFkYXRhIC1mICQoNCkKK2VuZGVmCisKKyMgSC4yNjQgcmVhZC93cml0ZQorCitGQVRFX0NCU19IMjY0X1NBTVBMRVMgPSAgIFwKKyAgICBTVkFfQmFzZV9CLjI2NCAgICAgICAgXAorICAgIEJBU1FQMV9Tb255X0MuanN2ICAgICBcCisgICAgRk0xX0JUX0IuaDI2NCAgICAgICAgIFwKKyAgICBDVkZDMV9Tb255X0MuanN2ICAgICAgXAorICAgIEFVRF9NV19FLjI2NCAgICAgICAgICBcCisgICAgQ1ZCUzNfU29ueV9DLmpzdiAgICAgIFwKKyAgICBNUjFfQlRfQS5oMjY0ICAgICAgICAgXAorICAgIENWV1AxX1RPU0hJQkFfRS4yNjQgICBcCisgICAgQ1ZOTEZJMV9Tb255X0MuanN2ICAgIFwKKyAgICBTaGFycF9NUF9QQUZGXzFyMi5qdnQgXAorICAgIENWTUFOTDFfVE9TSElCQV9CLjI2NCBcCisgICAgc3AxX2J0X2EuaDI2NCAgICAgICAgIFwKKyAgICBDVlNFMl9Tb255X0IuanN2ICAgICAgXAorICAgIENBQkFDSTNfU29ueV9CLmpzdgorCiskKGZvcmVhY2ggTiwkKEZBVEVfQ0JTX0gyNjRfU0FNUExFUyksJChldmFsICQoY2FsbCBGQVRFX0NCU19URVNULGgyNjQsJChiYXNlbmFtZSAkKE4pKSxoMjY0LWNvbmZvcm1hbmNlLyQoTiksaDI2NCkpKQorCitGQVRFX0NCU19IMjY0LSQoY2FsbCBGQVRFX0NCU19ERVBTLCBIMjY0LCBIMjY0LCBIMjY0KSA9ICQoRkFURV9DQlNfaDI2NCkKK0ZBVEVfU0FNUExFU19BVkNPTlYgKz0gJChGQVRFX0NCU19IMjY0LXllcykKK2ZhdGUtY2JzLWgyNjQ6ICQoRkFURV9DQlNfSDI2NC15ZXMpCisKKyMgSC4yNjUgcmVhZC93cml0ZQorCitGQVRFX0NCU19IRVZDX1NBTVBMRVMgPSAgICAgICBcCisgICAgU1RSVUNUX0FfU2Ftc3VuZ181LmJpdCAgICBcCisgICAgV1BfQV9Ub3NoaWJhXzMuYml0ICAgICAgICBcCisgICAgU0xJU1RfQV9Tb255XzQuYml0ICAgICAgICBcCisgICAgU0xJU1RfRF9Tb255XzkuYml0ICAgICAgICBcCisgICAgQ0FJTklUX0VfU0hBUlBfMy5iaXQgICAgICBcCisgICAgQ0FJTklUX0hfU0hBUlBfMy5iaXQgICAgICBcCisgICAgVElMRVNfQl9DaXNjb18xLmJpdCAgICAgICBcCisgICAgV1BQX0FfZXJpY3Nzb25fTUFJTl8yLmJpdCBcCisgICAgV1BQX0ZfZXJpY3Nzb25fTUFJTl8yLmJpdCBcCisgICAgaXBjbV9FX05FQ18yLmJpdCAgICAgICAgICBcCisgICAgTlVUX0FfZXJpY3Nzb25fNS5iaXQgICAgICBcCisgICAgUElDU0laRV9BX0Jvc3Nlbl8xLmJpdCAgICBcCisgICAgUElDU0laRV9CX0Jvc3Nlbl8xLmJpdCAgICBcCisgICAgUlBTX0FfZG9jb21vXzQuYml0ICAgICAgICBcCisgICAgUlBTX0VfcXVhbGNvbW1fNS5iaXQgICAgICBcCisgICAgTFRSUFNQU19BX1F1YWxjb21tXzEuYml0ICBcCisgICAgUlBMTV9BX3F1YWxjb21tXzQuYml0ICAgICBcCisgICAgQ09ORldJTl9BX1NvbnlfMS5iaXQgICAgICBcCisgICAgSFJEX0FfRnVqaXRzdV8yLmJpdAorCiskKGZvcmVhY2ggTiwkKEZBVEVfQ0JTX0hFVkNfU0FNUExFUyksJChldmFsICQoY2FsbCBGQVRFX0NCU19URVNULGhldmMsJChiYXNlbmFtZSAkKE4pKSxoZXZjLWNvbmZvcm1hbmNlLyQoTiksaGV2YykpKQorCitGQVRFX0NCU19IRVZDLSQoY2FsbCBGQVRFX0NCU19ERVBTLCBIRVZDLCBIRVZDLCBIRVZDKSA9ICQoRkFURV9DQlNfaGV2YykKK0ZBVEVfU0FNUExFU19BVkNPTlYgKz0gJChGQVRFX0NCU19IRVZDLXllcykKK2ZhdGUtY2JzLWhldmM6ICQoRkFURV9DQlNfSEVWQy15ZXMpCisKKyMgTVBFRy0yIHJlYWQvd3JpdGUKKworRkFURV9DQlNfTVBFRzJfU0FNUExFUyA9ICAgICBcCisgICAgaGhpX2J1cnN0XzQyMl9zaG9ydC5iaXRzIFwKKyAgICBzb255LWN0My5icyAgICAgICAgICAgICAgXAorICAgIHRjZWxhLTYuYml0cworCiskKGZvcmVhY2ggTiwkKEZBVEVfQ0JTX01QRUcyX1NBTVBMRVMpLCQoZXZhbCAkKGNhbGwgRkFURV9DQlNfVEVTVCxtcGVnMiwkKGJhc2VuYW1lICQoTikpLG1wZWcyLyQoTiksbXBlZzJ2aWRlbykpKQorCitGQVRFX0NCU19NUEVHMi0kKGNhbGwgRkFURV9DQlNfREVQUywgTVBFR1ZJREVPLCBNUEVHMiwgTVBFRzJWSURFTykgPSAkKEZBVEVfQ0JTX21wZWcyKQorRkFURV9TQU1QTEVTX0FWQ09OViArPSAkKEZBVEVfQ0JTX01QRUcyLXllcykKK2ZhdGUtY2JzLW1wZWcyOiAkKEZBVEVfQ0JTX01QRUcyLXllcykKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvY2hlY2thc20ubWFrIGIvdGVzdHMvZmF0ZS9jaGVja2FzbS5tYWsKaW5kZXggZGFlZmU2OS4uYTcyMmI0YSAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9jaGVja2FzbS5tYWsKKysrIGIvdGVzdHMvZmF0ZS9jaGVja2FzbS5tYWsKQEAgLTEsNSArMSwzOSBAQAotZmF0ZS1jaGVja2FzbTogdGVzdHMvY2hlY2thc20vY2hlY2thc20kKEVYRVNVRikKLWZhdGUtY2hlY2thc206IENNRCA9IHJ1biB0ZXN0cy9jaGVja2FzbS9jaGVja2FzbQotZmF0ZS1jaGVja2FzbTogUkVGID0gL2Rldi9udWxsCitGQVRFX0NIRUNLQVNNID0gZmF0ZS1jaGVja2FzbS1hYWNwc2RzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1hbGFjZHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1hdWRpb2RzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1ibG9ja2RzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1ic3dhcGRzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1leHJkc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1maXhlZF9kc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1mbGFjZHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1mbG9hdF9kc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1mbXRjb252ZXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1nNzIyZHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1oMjY0ZHNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1oMjY0cHJlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1oMjY0cXBlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1oZXZjX2FkZF9yZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1oZXZjX2lkY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1oZXZjX3NhbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1qcGVnMjAwMGRzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1sbHZpZGRzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1sbHZpZGRzcGVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1waXhibG9ja2RzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1zYnJkc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1zeW50aF9maWx0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS1zd19yZ2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS12MjEwZW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS12Zl9ibGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS12Zl9jb2xvcnNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS12Zl9oZmxpcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS12Zl90aHJlc2hvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS12aWRlb2RzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS12cDhkc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmF0ZS1jaGVja2FzbS12cDlkc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAKLUZBVEUgKz0gZmF0ZS1jaGVja2FzbQorJChGQVRFX0NIRUNLQVNNKTogdGVzdHMvY2hlY2thc20vY2hlY2thc20kKEVYRVNVRikKKyQoRkFURV9DSEVDS0FTTSk6IENNRCA9IHJ1biB0ZXN0cy9jaGVja2FzbS9jaGVja2FzbSAtLXRlc3Q9JChAOmZhdGUtY2hlY2thc20tJT0lKQorJChGQVRFX0NIRUNLQVNNKTogQ01QID0gbnVsbAorCitGQVRFICs9ICQoRkFURV9DSEVDS0FTTSkKK2ZhdGUtY2hlY2thc206ICQoRkFURV9DSEVDS0FTTSkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvZGNhLm1hayBiL3Rlc3RzL2ZhdGUvZGNhLm1hawppbmRleCA2YTY2MTRkLi5mYWQzYTc1IDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL2RjYS5tYWsKKysrIGIvdGVzdHMvZmF0ZS9kY2EubWFrCkBAIC02MCw3ICs2MCw3IEBACiAkKEZBVEVfRENBREVDX0xPU1NZKTogQ01QX1VOSVQgPSBmMzIKICQoRkFURV9EQ0FERUNfTE9TU1kpOiBGVVpaID0gOQogCi1GQVRFX0RDQS0kKGNhbGwgREVNREVDLCBEVFMsIERDQSkgKz0gJChGQVRFX0RDQURFQ19MT1NTTEVTUykgJChGQVRFX0RDQURFQ19MT1NTWSkKK0ZBVEVfRENBLSQoY2FsbCBERU1ERUMsIERUU0hELCBEQ0EpICs9ICQoRkFURV9EQ0FERUNfTE9TU0xFU1MpICQoRkFURV9EQ0FERUNfTE9TU1kpCiAKIEZBVEVfRENBLSQoY2FsbCBERU1ERUMsIE1QRUdUUywgRENBKSArPSBmYXRlLWRjYS1jb3JlCiBmYXRlLWRjYS1jb3JlOiBDTUQgPSBwY20gLWkgJChUQVJHRVRfU0FNUExFUykvZHRzL2R0cy50cwpAQCAtNzUsNSArNzUsMTAgQEAKIGZhdGUtZHRzX2VzOiBDTVAgPSBvbmVvZmYKIGZhdGUtZHRzX2VzOiBSRUYgPSAkKFNBTVBMRVMpL2R0cy9kdHNfZXNfMi5wY20KIAorRkFURV9EQ0EtJChjYWxsIEFMTFlFUywgRFRTX0RFTVVYRVIgRFRTX01VWEVSIERDQV9DT1JFX0JTRikgKz0gZmF0ZS1kY2EtY29yZS1ic2YKK2ZhdGUtZGNhLWNvcmUtYnNmOiBDTUQgPSBtZDVwaXBlIC1pICQoVEFSR0VUX1NBTVBMRVMpL2R0cy9tYXN0ZXJfYXVkaW9fNy4xXzI0Yml0LmR0cyAtYzphIGNvcHkgLWJzZjphIGRjYV9jb3JlIC1mZmxhZ3MgK2JpdGV4YWN0IC1mIGR0cworZmF0ZS1kY2EtY29yZS1ic2Y6IENNUCA9IG9uZWxpbmUKK2ZhdGUtZGNhLWNvcmUtYnNmOiBSRUYgPSBjYTIyYjAwZDhjNjQxY2QxNjhlMmY3Y2E4ZDJmMzQwZQorCiBGQVRFX1NBTVBMRVNfQVVESU8gKz0gJChGQVRFX0RDQS15ZXMpCiBmYXRlLWRjYTogJChGQVRFX0RDQS15ZXMpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2RlbXV4Lm1hayBiL3Rlc3RzL2ZhdGUvZGVtdXgubWFrCmluZGV4IGU0OGQzOTguLmVmOWU2NzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvZGVtdXgubWFrCisrKyBiL3Rlc3RzL2ZhdGUvZGVtdXgubWFrCkBAIC0xLDUxICsxLDYxIEBACiBGQVRFX1NBTVBMRVNfREVNVVgtJChjYWxsIERFTURFQywgQVZJLCBGUkFQUykgKz0gZmF0ZS1hdmlvLWRpcmVjdAogZmF0ZS1hdmlvLWRpcmVjdDogQ01EID0gZnJhbWVjcmMgLWF2aW9mbGFncyBkaXJlY3QgLWkgJChUQVJHRVRfU0FNUExFUykvZnJhcHMvZnJhcHMtdjUtYm91bmNpbmctYmFsbHMtcGFydGlhbC5hdmkgLWF2aW9mbGFncyBkaXJlY3QKIAotRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX0FBQ19ERU1VWEVSKSArPSBmYXRlLWFkdHMtZGVtdXgKLWZhdGUtYWR0cy1kZW11eDogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FhYy9jdF9mYWFjLWFkdHMuYWFjIC1hY29kZWMgY29weQorRkFURV9TQU1QTEVTX0RFTVVYLSQoY2FsbCBERU1ERUMsIEFBQywgQUFDKSArPSBmYXRlLWFkdHMtZGVtdXggZmF0ZS1hZHRzLWlkM3YxLWRlbXV4IGZhdGUtYWR0cy1pZDN2Mi1kZW11eCBmYXRlLWFkdHMtaWQzdjItdHdvLXRhZ3MtZGVtdXgKK2ZhdGUtYWR0cy1kZW11eDogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FhYy9jdF9mYWFjLWFkdHMuYWFjIC1jOmEgY29weQorZmF0ZS1hZHRzLWlkM3YxLWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtZiBhYWMgLWkgJChUQVJHRVRfU0FNUExFUykvYWFjL2lkM3YxLmFhYyAtYzphIGNvcHkKK2ZhdGUtYWR0cy1pZDN2Mi1kZW11eDogQ01EID0gZnJhbWVjcmMgLWYgYWFjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FhYy9pZDN2Mi5hYWMgLWM6YSBjb3B5CitmYXRlLWFkdHMtaWQzdjItdHdvLXRhZ3MtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FhYy9pZDN2Ml90d29fdGFncy5hYWMgLWM6YSBjb3B5CiAKIEZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19BRUFfREVNVVhFUikgKz0gZmF0ZS1hZWEtZGVtdXgKLWZhdGUtYWVhLWRlbXV4OiBDTUQgPSBjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvYWVhL2NoaXJwLmFlYSAtYWNvZGVjIGNvcHkKK2ZhdGUtYWVhLWRlbXV4OiBDTUQgPSBjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvYWVhL2NoaXJwLmFlYSAtYzphIGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX0FTVF9ERU1VWEVSKSArPSBmYXRlLWFzdAogZmF0ZS1hc3Q6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9hc3QvZGVtbzExXzAyX3BhcnRpYWwuYXN0IC1jIGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX0JJTktfREVNVVhFUikgKz0gZmF0ZS1iaW5rLWRlbXV4Ci1mYXRlLWJpbmstZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9iaW5rL1NuZDBhN2Q5YjU4LmRlZSAtdm4gLWFjb2RlYyBjb3B5CitmYXRlLWJpbmstZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9iaW5rL1NuZDBhN2Q5YjU4LmRlZSAtdm4gLWM6YSBjb3B5CiAKIEZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19CRlNUTV9ERU1VWEVSKSArPSBmYXRlLWJmc3RtIGZhdGUtYmNzdG0KLWZhdGUtYmZzdG06IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9iZnN0bS9zcGwtZm9yZXN0LWRheS5iZnN0bSAtYWNvZGVjIGNvcHkKLWZhdGUtYmNzdG06IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9iZnN0bS9sb3otbW0tbWlrYXUuYmNzdG0gLWFjb2RlYyBjb3B5CitmYXRlLWJmc3RtOiBDTUQgPSBjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvYmZzdG0vc3BsLWZvcmVzdC1kYXkuYmZzdG0gLWM6YSBjb3B5CitmYXRlLWJjc3RtOiBDTUQgPSBjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvYmZzdG0vbG96LW1tLW1pa2F1LmJjc3RtIC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfQlJTVE1fREVNVVhFUikgKz0gZmF0ZS1icnN0bQotZmF0ZS1icnN0bTogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2Jyc3RtL2xvenN3ZF9wYXJ0aWFsLmJyc3RtIC1hY29kZWMgY29weQorZmF0ZS1icnN0bTogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2Jyc3RtL2xvenN3ZF9wYXJ0aWFsLmJyc3RtIC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfQ0FGX0RFTVVYRVIpICs9IGZhdGUtY2FmCiBmYXRlLWNhZjogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2NhZi9jYWYtcGNtMTYuY2FmIC1jIGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX0NEWExfREVNVVhFUikgKz0gZmF0ZS1jZHhsLWRlbXV4Ci1mYXRlLWNkeGwtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2NkeGwvbWlyYWdlLmNkeGwgLXZjb2RlYyBjb3B5IC1hY29kZWMgY29weQorZmF0ZS1jZHhsLWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jZHhsL21pcmFnZS5jZHhsIC1jOnYgY29weSAtYzphIGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX0NJTkVfREVNVVhFUikgKz0gZmF0ZS1jaW5lLWRlbXV4CiBmYXRlLWNpbmUtZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jaW5lL2JheWVyX2dicmc4LmNpbmUgLWMgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfREFVRF9ERU1VWEVSKSArPSBmYXRlLWQtY2luZW1hLWRlbXV4Ci1mYXRlLWQtY2luZW1hLWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9kLWNpbmVtYS9USFhfU2NpZW5jZV9GTFRfMTkyMC1wYXJ0aWFsLjMwMiAtYWNvZGVjIGNvcHkKK2ZhdGUtZC1jaW5lbWEtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2QtY2luZW1hL1RIWF9TY2llbmNlX0ZMVF8xOTIwLXBhcnRpYWwuMzAyIC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfRUFfREVNVVhFUikgKz0gZmF0ZS1kLWVhdnA2LWRlbXV4Ci1mYXRlLWQtZWF2cDYtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2VhLXZwNi9TbWFsbFJpbmcudnA2IC1tYXAgMCAtdmNvZGVjIGNvcHkKK2ZhdGUtZC1lYXZwNi1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZWEtdnA2L1NtYWxsUmluZy52cDYgLW1hcCAwIC1jOnYgY29weQorCitGQVRFX1NBTVBMRVNfREVNVVgtJChjYWxsIEFMTFlFUywgR0lGX0RFTVVYRVIgRklUU19ERU1VWEVSIEdJRl9ERUNPREVSIEZJVFNfRU5DT0RFUiBGSVRTX01VWEVSKSArPSBmYXRlLWZpdHMtZGVtdXgKK2ZhdGUtZml0cy1kZW11eDogdGVzdHMvZGF0YS9maXRzLW11bHRpLmZpdHMKK2ZhdGUtZml0cy1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9maXRzLW11bHRpLmZpdHMgLWM6diBjb3B5CisKK0ZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19GTFZfREVNVVhFUikgKz0gZmF0ZS1mbHYtZGVtdXgKK2ZhdGUtZmx2LWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9mbHYvRW5pZ21hX1ByaW5jaXBsZXNfb2ZfTHVzdC1wYXJ0LmZsdiAtY29kZWMgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfR0lGX0RFTVVYRVIpICs9IGZhdGUtZ2lmLWRlbXV4Ci1mYXRlLWdpZi1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZ2lmL05ld3RvbnNfY3JhZGxlX2FuaW1hdGlvbl9ib29rXzIuZ2lmIC12Y29kZWMgY29weQorZmF0ZS1naWYtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2dpZi9OZXd0b25zX2NyYWRsZV9hbmltYXRpb25fYm9va18yLmdpZiAtYzp2IGNvcHkKIAotRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX0lWOF9ERU1VWEVSKSArPSBmYXRlLWl2OC1kZW11eAotZmF0ZS1pdjgtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2l2OC96enotcGFydGlhbC5tcGcgLXZjb2RlYyBjb3B5CitGQVRFX1NBTVBMRVNfREVNVVgtJChjYWxsIEFMTFlFUywgSVY4X0RFTVVYRVIgTVBFRzRWSURFT19QQVJTRVIpICs9IGZhdGUtaXY4LWRlbXV4CitmYXRlLWl2OC1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaXY4L3p6ei1wYXJ0aWFsLm1wZyAtYzp2IGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX0pWX0RFTVVYRVIpICs9IGZhdGUtanYtZGVtdXgKLWZhdGUtanYtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2p2L2ludHJvLmp2IC12Y29kZWMgY29weSAtYWNvZGVjIGNvcHkKK2ZhdGUtanYtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2p2L2ludHJvLmp2IC1jOnYgY29weSAtYzphIGNvcHkKIAotRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX0xNTE00X0RFTVVYRVIpICs9IGZhdGUtbG1sbTQtZGVtdXgKLWZhdGUtbG1sbTQtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2xtbG00L0xNTE00X0NJRmF0MzBmcHMuZGl2eCAtdCAzIC1hY29kZWMgY29weSAtdmNvZGVjIGNvcHkKK0ZBVEVfU0FNUExFU19ERU1VWC0kKGNhbGwgQUxMWUVTLCBMTUxNNF9ERU1VWEVSIE1QRUc0VklERU9fUEFSU0VSKSArPSBmYXRlLWxtbG00LWRlbXV4CitmYXRlLWxtbG00LWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9sbWxtNC9MTUxNNF9DSUZhdDMwZnBzLmRpdnggLXQgMyAtYzphIGNvcHkgLWM6diBjb3B5CiAKIEZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19YQV9ERU1VWEVSKSArPSBmYXRlLW1heGlzLXhhCiBmYXRlLW1heGlzLXhhOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tYXhpcy14YS9TQzJLQlVHLlhBIC1mcmFtZXM6YSAzMCAtYzphIGNvcHkKQEAgLTUzLDMyICs2Myw0NSBAQAogRkFURV9TQU1QTEVTX0RFTVVYLSQoY2FsbCBERU1ERUMsIE1BVFJPU0tBLCBIMjY0KSArPSBmYXRlLW1rdgogZmF0ZS1ta3Y6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL21rdi90ZXN0N19jdXQubWt2IC1jIGNvcHkKIAorI05vIGR0cyBlcnJvcnMgb3IgZHVwbGljYXRlIERUUyBzaG91bGQgYmUgaW4gdGhpcworRkFURV9TQU1QTEVTX0RFTVVYLSQoY2FsbCBERU1ERUMsIE1BVFJPU0tBLCBIMjY0KSArPSBmYXRlLW1rdi0xMjQyCitmYXRlLW1rdi0xMjQyOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9ta3YvMTI0Mi1zbWFsbC5ta3YgLWMgY29weSAtZnJhbWVzOnYgMTEKKwogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX01MVl9ERU1VWEVSKSArPSBmYXRlLW1sdi1kZW11eAogZmF0ZS1tbHYtZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tbHYvTTE5LTAzMzMtY3V0Lk1MViAtYyBjb3B5CiAKK0ZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1tb3YtbXAzLWRlbXV4CitmYXRlLW1vdi1tcDMtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWdhdWRpby9wYWNrZWRfbWFpbmRhdGEubXAzLm1wNCAtYyBjb3B5CisKK0ZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19NUEVHVFNfREVNVVhFUikgKz0gZmF0ZS10cy1vcHVzLWRlbXV4CitmYXRlLXRzLW9wdXMtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL29wdXMvdGVzdC04LTcuMS5vcHVzLXNtYWxsLnRzIC1jIGNvcHkKKwogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX01UVl9ERU1VWEVSKSArPSBmYXRlLW10dgogZmF0ZS1tdHY6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL210di9jb21lZGlhbl9hdXRvLXBhcnRpYWwubXR2IC1jIGNvcHkKIAotRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX01YRl9ERU1VWEVSKSArPSBmYXRlLW14Zi1kZW11eAotZmF0ZS1teGYtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL214Zi9DMDAyM1MwMS5teGYgLWFjb2RlYyBjb3B5IC12Y29kZWMgY29weQorRkFURV9TQU1QTEVTX0RFTVVYLSQoY2FsbCBERU1ERUMsIE1YRiwgTVBFRzQpICs9IGZhdGUtbXhmLWRlbXV4CitmYXRlLW14Zi1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbXhmL0MwMDIzUzAxLm14ZiAtYzphIGNvcHkgLWM6diBjb3B5CiAKLUZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19OQ19ERU1VWEVSKSArPSBmYXRlLW5jLWRlbXV4Ci1mYXRlLW5jLWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9uYy1jYW1lcmEvbmMtc2FtcGxlLXBhcnRpYWwgLXZjb2RlYyBjb3B5CitGQVRFX1NBTVBMRVNfREVNVVgtJChjYWxsIEFMTFlFUywgTkNfREVNVVhFUiBNUEVHNFZJREVPX1BBUlNFUikgKz0gZmF0ZS1uYy1kZW11eAorZmF0ZS1uYy1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbmMtY2FtZXJhL25jLXNhbXBsZS1wYXJ0aWFsIC1jOnYgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfTklTVFNQSEVSRV9ERU1VWEVSKSArPSBmYXRlLW5pc3RzcGhlcmUtZGVtdXgKLWZhdGUtbmlzdHNwaGVyZS1kZW11eDogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL25pc3RzcGhlcmUvbmlzdC11bGF3Lm5pc3QgLWFjb2RlYyBjb3B5CitmYXRlLW5pc3RzcGhlcmUtZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9uaXN0c3BoZXJlL25pc3QtdWxhdy5uaXN0IC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfTlNWX0RFTVVYRVIpICs9IGZhdGUtbnN2LWRlbXV4Ci1mYXRlLW5zdi1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbnN2L3dpdGNoYmxhZGUtNTFrYnBzLm5zdiAtdCA2IC12Y29kZWMgY29weSAtYWNvZGVjIGNvcHkKK2ZhdGUtbnN2LWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9uc3Yvd2l0Y2hibGFkZS01MWticHMubnN2IC10IDYgLWM6diBjb3B5IC1jOmEgY29weQorCitGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfT0dHX0RFTVVYRVIpICs9IGZhdGUtb2dnb3B1cy1kZW11eAorZmF0ZS1vZ2dvcHVzLWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9vZ2cvaW50cm8tcGFydGlhbC5vcHVzIC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfT0dHX0RFTVVYRVIpICs9IGZhdGUtb2dndnA4LWRlbXV4CiBmYXRlLW9nZ3ZwOC1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvb2dnL3ZpZGVvdGVzdC5vZ3YgLWM6diBjb3B5CiAKIEZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19PTUFfREVNVVhFUikgKz0gZmF0ZS1vbWEtZGVtdXgKLWZhdGUtb21hLWRlbXV4OiBDTUQgPSBjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvb21hLzAxLVVudGl0bGVkLXBhcnRpYWwub21hIC1hY29kZWMgY29weQorZmF0ZS1vbWEtZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9vbWEvMDEtVW50aXRsZWQtcGFydGlhbC5vbWEgLWM6YSBjb3B5CiAKIEZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19QQUZfREVNVVhFUikgKz0gZmF0ZS1wYWYtZGVtdXgKLWZhdGUtcGFmLWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9wYWYvaG9kMS1wYXJ0aWFsLnBhZiAtdmNvZGVjIGNvcHkgLWFjb2RlYyBjb3B5CitmYXRlLXBhZi1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcGFmL2hvZDEtcGFydGlhbC5wYWYgLWM6diBjb3B5IC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfUE1QX0RFTVVYRVIpICs9IGZhdGUtcG1wLWRlbXV4CiBmYXRlLXBtcC1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcG1wL2RlbW8ucG1wIC12biAtYzphIGNvcHkKQEAgLTkzLDEzICsxMTYsMTMgQEAKIGZhdGUtcHN4LXN0ci1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcHN4LXN0ci9kZXNjZW50LXBhcnRpYWwuc3RyIC1jIGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX1BWQV9ERU1VWEVSKSArPSBmYXRlLXB2YS1kZW11eAotZmF0ZS1wdmEtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9wdmEvUFZBX3Rlc3QtcGFydGlhbC5wdmEgLXQgMC42IC1hY29kZWMgY29weQorZmF0ZS1wdmEtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9wdmEvUFZBX3Rlc3QtcGFydGlhbC5wdmEgLXQgMC42IC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfUUNQX0RFTVVYRVIpICs9IGZhdGUtcWNwLWRlbXV4Ci1mYXRlLXFjcC1kZW11eDogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3FjcC8wMDM2NTgwODQ3LlFDUCAtYWNvZGVjIGNvcHkKK2ZhdGUtcWNwLWRlbXV4OiBDTUQgPSBjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcWNwLzAwMzY1ODA4NDcuUUNQIC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfUjNEX0RFTVVYRVIpICs9IGZhdGUtcmVkY29kZS1kZW11eAotZmF0ZS1yZWRjb2RlLWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9yM2QvNE1CLXNhbXBsZS5yM2QgLXZjb2RlYyBjb3B5IC1hY29kZWMgY29weQorZmF0ZS1yZWRjb2RlLWRlbXV4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9yM2QvNE1CLXNhbXBsZS5yM2QgLWM6diBjb3B5IC1jOmEgY29weQogCiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfU0lGRl9ERU1VWEVSKSArPSBmYXRlLXNpZmYtZGVtdXgKIGZhdGUtc2lmZi1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvU0lGRi9JTlRST19CLlZCIC1jIGNvcHkKQEAgLTEwNywxNyArMTMwLDIzIEBACiBGQVRFX1NBTVBMRVNfREVNVVgtJChDT05GSUdfU01KUEVHX0RFTVVYRVIpICs9IGZhdGUtc21qcGVnLWRlbXV4CiBmYXRlLXNtanBlZy1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvc21qcGVnL3NjZW53aW4ubWpwZyAtYyBjb3B5CiAKK0ZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19XQVZfREVNVVhFUikgKz0gZmF0ZS13YXYtYWMzCitmYXRlLXdhdi1hYzM6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FjMy9kaWF0b25pc19pbnZpc2libGVfb3JkZXJfYW5mb3NfYWMzLXNtYWxsLndhdiAtYyBjb3B5CisKIEZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19XU0FVRF9ERU1VWEVSKSArPSBmYXRlLXdlc3R3b29kLWF1ZAogZmF0ZS13ZXN0d29vZC1hdWQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3dlc3R3b29kLWF1ZC9leGNlbGxlbnQuYXVkIC1jIGNvcHkKIAotRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX1dUVl9ERU1VWEVSKSArPSBmYXRlLXd0di1kZW11eAotZmF0ZS13dHYtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3d0di9sYXctYW5kLW9yZGVyLXBhcnRpYWwud3R2IC12Y29kZWMgY29weSAtYWNvZGVjIGNvcHkKK0ZBVEVfU0FNUExFU19ERU1VWC0kKGNhbGwgQUxMWUVTLCBXVFZfREVNVVhFUiBNUEVHVklERU9fUEFSU0VSKSArPSBmYXRlLXd0di1kZW11eAorZmF0ZS13dHYtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3d0di9sYXctYW5kLW9yZGVyLXBhcnRpYWwud3R2IC1jOnYgY29weSAtYzphIGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX1hNVl9ERU1VWEVSKSArPSBmYXRlLXhtdi1kZW11eAotZmF0ZS14bXYtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3htdi9sb2dvczFwLmZtdiAtdmNvZGVjIGNvcHkgLWFjb2RlYyBjb3B5CitmYXRlLXhtdi1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykveG12L2xvZ29zMXAuZm12IC1jOnYgY29weSAtYzphIGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYLSQoQ09ORklHX1hXTUFfREVNVVhFUikgKz0gZmF0ZS14d21hLWRlbXV4Ci1mYXRlLXh3bWEtZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS94d21hL2VyZ29uLnh3bWEgLWFjb2RlYyBjb3B5CitmYXRlLXh3bWEtZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS94d21hL2VyZ29uLnh3bWEgLWM6YSBjb3B5CisKK0ZBVEVfU0FNUExFU19ERU1VWC0kKENPTkZJR19NUEVHVFNfREVNVVhFUikgKz0gZmF0ZS10cy1kZW11eAorZmF0ZS10cy1kZW11eDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvYWMzL21wM2FjMzI1LTQ4NjQtc21hbGwudHMgLWNvZGVjIGNvcHkKIAogRkFURV9TQU1QTEVTX0RFTVVYICs9ICQoRkFURV9TQU1QTEVTX0RFTVVYLXllcykKIEZBVEVfU0FNUExFU19GRk1QRUcgKz0gJChGQVRFX1NBTVBMRVNfREVNVVgpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2RueGhkLm1hayBiL3Rlc3RzL2ZhdGUvZG54aGQubWFrCmluZGV4IDZkNzlmM2IuLjYwYmZkMzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvZG54aGQubWFrCisrKyBiL3Rlc3RzL2ZhdGUvZG54aGQubWFrCkBAIC0xLDggKzEsMjIgQEAKIEZBVEVfRE5YSEQgPSBmYXRlLWRueGhkLW1iYWZmICAgICBcCi0gICAgICAgICAgICAgZmF0ZS1kbnhoci00NDQKKyAgICAgICAgICAgICBmYXRlLWRueGhyLTQ0NCAgICAgICBcCisgICAgICAgICAgICAgZmF0ZS1kbnhoci0xMmJpdCAgICAgXAorICAgICAgICAgICAgIGZhdGUtZG54aHItcGFyc2UgICAgIFwKKyAgICAgICAgICAgICBmYXRlLWRueGhyLXByZWZpeDEgICBcCisgICAgICAgICAgICAgZmF0ZS1kbnhoci1wcmVmaXgyICAgXAorICAgICAgICAgICAgIGZhdGUtZG54aHItcHJlZml4MyAgIFwKKyAgICAgICAgICAgICBmYXRlLWRueGhyLXByZWZpeDQgICBcCisgICAgICAgICAgICAgZmF0ZS1kbnhoci1wcmVmaXg1CiAKIEZBVEVfU0FNUExFU19BVkNPTlYtJChjYWxsIERFTURFQywgTU9WLCBETlhIRCkgKz0gJChGQVRFX0ROWEhEKQogZmF0ZS1kbnhoZDogJChGQVRFX0ROWEhEKSAkKEZBVEVfVkNPREVDX0ROWEhEKQogCiBmYXRlLWRueGhkLW1iYWZmOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9kbnhoZC9kbnhoZDEwMF9jaWQxMjYwLm1vdiAtcGl4X2ZtdCB5dXY0MjJwMTBsZQogZmF0ZS1kbnhoci00NDQ6ICAgQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvZG54aGQvZG54aHI0NDRfY2lkMTI3MC5tb3YgLXBpeF9mbXQgeXV2NDQ0cDEwbGUKK2ZhdGUtZG54aHItMTJiaXQ6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL2RueGhkL2RueGhyX2NpZDEyNzFfMTJiaXQubW92IC1waXhfZm10IHl1djQyMnAxMmxlCitmYXRlLWRueGhyLXBhcnNlOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9kbnhoZC9kbnhocl9jaWQxMjc0LmRueGhyIC1waXhfZm10IHl1djQyMnAKK2ZhdGUtZG54aHItcHJlZml4MTogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvZG54aGQvcHJlZml4LTI1NngxNTM2LmRueGhyIC1waXhfZm10IHl1djQyMnAKK2ZhdGUtZG54aHItcHJlZml4MjogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvZG54aGQvcHJlZml4LTI1NngxNzE2LmRueGhyIC1waXhfZm10IHl1djQyMnAKK2ZhdGUtZG54aHItcHJlZml4MzogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvZG54aGQvcHJlZml4LTI1NngyMDQ4LmRueGhyIC1waXhfZm10IHl1djQyMnAKK2ZhdGUtZG54aHItcHJlZml4NDogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvZG54aGQvcHJlZml4LTI1NngyMTYwLmRueGhyIC1waXhfZm10IHl1djQyMnAKK2ZhdGUtZG54aHItcHJlZml4NTogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvZG54aGQvcHJlZml4LTI1NngzMjEyLmRueGhyIC1waXhfZm10IHl1djQyMnAKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvZmZtcGVnLm1hayBiL3Rlc3RzL2ZhdGUvZmZtcGVnLm1hawppbmRleCAzYjkxYzEyLi4wOTc1YWYyIDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL2ZmbXBlZy5tYWsKKysrIGIvdGVzdHMvZmF0ZS9mZm1wZWcubWFrCkBAIC0xMCw2ICsxMCwxNCBAQAogZmF0ZS1tYXBjaGFuLXNpbGVudC1tb25vOiB0ZXN0cy9kYXRhL2FzeW50aC0yMjA1MC0xLndhdgogZmF0ZS1tYXBjaGFuLXNpbGVudC1tb25vOiBDTUQgPSBtZDUgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtMjIwNTAtMS53YXYgLW1hcF9jaGFubmVsIC0xIC1tYXBfY2hhbm5lbCAwLjAuMCAtZmZsYWdzICtiaXRleGFjdCAtZiB3YXYKIAorRkFURV9NQVBDSEFOLSQoQ09ORklHX0NIQU5ORUxNQVBfRklMVEVSKSArPSBmYXRlLW1hcGNoYW4tMmNoLWV4dHJhY3QtY2gwLWNoMi10cmFpbGluZworZmF0ZS1tYXBjaGFuLTJjaC1leHRyYWN0LWNoMC1jaDItdHJhaWxpbmc6IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLW1hcGNoYW4tMmNoLWV4dHJhY3QtY2gwLWNoMi10cmFpbGluZzogQ01EID0gbWQ1IC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2IC1tYXBfY2hhbm5lbCAwLjAuMCAtbWFwX2NoYW5uZWwgMC4wLjI/IC1mZmxhZ3MgK2JpdGV4YWN0IC1mIHdhdgorCitGQVRFX01BUENIQU4tJChDT05GSUdfQ0hBTk5FTE1BUF9GSUxURVIpICs9IGZhdGUtbWFwY2hhbi0zY2gtZXh0cmFjdC1jaDAtY2gyLXRyYWlsaW5nCitmYXRlLW1hcGNoYW4tM2NoLWV4dHJhY3QtY2gwLWNoMi10cmFpbGluZzogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMy53YXYKK2ZhdGUtbWFwY2hhbi0zY2gtZXh0cmFjdC1jaDAtY2gyLXRyYWlsaW5nOiBDTUQgPSBtZDUgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMy53YXYgLW1hcF9jaGFubmVsIDAuMC4wIC1tYXBfY2hhbm5lbCAwLjAuMj8gLWZmbGFncyArYml0ZXhhY3QgLWYgd2F2CisKIEZBVEVfTUFQQ0hBTiA9ICQoRkFURV9NQVBDSEFOLXllcykKIAogRkFURV9GRk1QRUcgKz0gJChGQVRFX01BUENIQU4pCkBAIC0xOCw5ICsyNiwxNyBAQAogRkFURV9GRk1QRUctJChDT05GSUdfQ09MT1JfRklMVEVSKSArPSBmYXRlLWZmbXBlZy1maWx0ZXJfY29tcGxleAogZmF0ZS1mZm1wZWctZmlsdGVyX2NvbXBsZXg6IENNRCA9IGZyYW1lY3JjIC1maWx0ZXJfY29tcGxleCBjb2xvcj1kPTE6cj01IC1mZmxhZ3MgK2JpdGV4YWN0CiAKKyMgVGlja2V0IDY2MDMKK0ZBVEVfRkZNUEVHLSQoY2FsbCBBTExZRVMsIEFFVkFMU1JDX0ZJTFRFUiBBU0VUTlNBTVBMRVNfRklMVEVSIEFDM19GSVhFRF9FTkNPREVSKSArPSBmYXRlLWZmbXBlZy1maWx0ZXJfY29tcGxleF9hdWRpbworZmF0ZS1mZm1wZWctZmlsdGVyX2NvbXBsZXhfYXVkaW86IENNRCA9IGZyYW1lY3JjIC1maWx0ZXJfY29tcGxleCAiYWV2YWxzcmM9MDpkPTAuMSxhc2V0bnNhbXBsZXM9MTUzNyIgLWMgYWMzX2ZpeGVkCisKKyMgVGlja2V0IDYzNzUsIHVzZSBjYXNlIG9mIE5vWAorRkFURV9TQU1QTEVTX0ZGTVBFRy0kKGNhbGwgQUxMWUVTLCBNT1ZfREVNVVhFUiBQTkdfREVDT0RFUiBBTEFDX0RFQ09ERVIgUENNX1MxNkxFX0VOQ09ERVIgUkFXVklERU9fRU5DT0RFUikgKz0gZmF0ZS1mZm1wZWctYXR0YWNoZWRfcGljcworZmF0ZS1mZm1wZWctYXR0YWNoZWRfcGljczogQ01EID0gdGhyZWFkcz0yIGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2xvc3NsZXNzLWF1ZGlvL2luc2lkZS5tNGEgLWM6YSBwY21fczE2bGUgLW1heF9tdXhpbmdfcXVldWVfc2l6ZSAxNgorCiBGQVRFX1NBTVBMRVNfRkZNUEVHLSQoQ09ORklHX0NPTE9SS0VZX0ZJTFRFUikgKz0gZmF0ZS1mZm1wZWctZmlsdGVyX2NvbG9ya2V5CiBmYXRlLWZmbXBlZy1maWx0ZXJfY29sb3JrZXk6IHRlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL2NvbG9ya2V5Ci1mYXRlLWZmbXBlZy1maWx0ZXJfY29sb3JrZXk6IENNRCA9IGZyYW1lY3JjIC1pZGN0IHNpbXBsZSAtZmZsYWdzICtiaXRleGFjdCAtZmxhZ3MgK2JpdGV4YWN0ICAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLWkgJChUQVJHRVRfU0FNUExFUykvY2F2cy9jYXZzLm1wZyAtZmZsYWdzICtiaXRleGFjdCAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9sZW5hLnBubSAtZmlsdGVyX2NvbXBsZXhfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL2NvbG9ya2V5IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtZmZsYWdzICtiaXRleGFjdCAtZmxhZ3MgK2JpdGV4YWN0IC1xc2NhbGUgMiAtdmZyYW1lcyAxMAorZmF0ZS1mZm1wZWctZmlsdGVyX2NvbG9ya2V5OiBDTUQgPSBmcmFtZWNyYyAtaWRjdCBzaW1wbGUgLWZmbGFncyArYml0ZXhhY3QgLWZsYWdzICtiaXRleGFjdCAgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL2NhdnMvY2F2cy5tcGcgLWZmbGFncyArYml0ZXhhY3QgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLWkgJChUQVJHRVRfU0FNUExFUykvbGVuYS5wbm0gLWFuIC1maWx0ZXJfY29tcGxleF9zY3JpcHQgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvY29sb3JrZXkgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC1mZmxhZ3MgK2JpdGV4YWN0IC1mbGFncyArYml0ZXhhY3QgLXFzY2FsZSAyIC1mcmFtZXM6diAxMAogCiBGQVRFX0ZGTVBFRy0kKENPTkZJR19DT0xPUl9GSUxURVIpICs9IGZhdGUtZmZtcGVnLWxhdmZpCiBmYXRlLWZmbXBlZy1sYXZmaTogQ01EID0gZnJhbWVjcmMgLWxhdmZpIGNvbG9yPWQ9MTpyPTUgLWZmbGFncyArYml0ZXhhY3QKQEAgLTUxLDggKzY3LDgyIEBACiAgIC1ndWVzc19sYXlvdXRfbWF4IDAgLWYgczE2bGUgLWFjIDEgLWFyIDQ0MTAwIC1pICQoVEFSR0VUX1BBVEgpLyQoQVJFRikgXAogICAtZiBhYzMgLWZsYWdzICtiaXRleGFjdCAtYyBhYzNfZml4ZWQKIAotRkFURV9TQU1QTEVTX0ZGTVBFRy0kKGNhbGwgREVNTVVYLCBPR0csIE9HRykgKz0gZmF0ZS1saW1pdGVkX2lucHV0X3NlZWsgZmF0ZS1saW1pdGVkX2lucHV0X3NlZWstY29weXRzCisKK0ZBVEVfU1RSRUFNQ09QWS0kKGNhbGwgQUxMWUVTLCBFQUMzX0RFTVVYRVIgTU9WX01VWEVSKSArPSBmYXRlLWNvcHktdHJhYzMwNzQKK2ZhdGUtY29weS10cmFjMzA3NDogJChUQVJHRVRfU0FNUExFUykvZWFjMy9jc2lfbWlhbWlfc3RlcmVvXzEyOF9zcHguZWFjMworZmF0ZS1jb3B5LXRyYWMzMDc0OiBDTUQgPSB0cmFuc2NvZGUgZWFjMyAkKFRBUkdFVF9TQU1QTEVTKS9lYWMzL2NzaV9taWFtaV9zdGVyZW9fMTI4X3NweC5lYWMzXAorICAgICAgICAgICAgICAgICAgICAgbXA0ICItY29kZWMgY29weSAtbWFwIDAiICItY29kZWMgY29weSIKKworRkFURV9TVFJFQU1DT1BZLSQoY2FsbCBBTExZRVMsIE1PVl9ERU1VWEVSIE1PVl9NVVhFUikgKz0gZmF0ZS1jb3B5LXRyYWMyMzYKK2ZhdGUtY29weS10cmFjMjM2OiAkKFRBUkdFVF9TQU1QTEVTKS9tb3YvZmNwX2V4cG9ydDgtMjM2Lm1vdgorZmF0ZS1jb3B5LXRyYWMyMzY6IENNRCA9IHRyYW5zY29kZSBtb3YgJChUQVJHRVRfU0FNUExFUykvbW92L2ZjcF9leHBvcnQ4LTIzNi5tb3ZcCisgICAgICAgICAgICAgICAgICAgICBtb3YgIi1jb2RlYyBjb3B5IC1tYXAgMCIKKworRkFURV9TVFJFQU1DT1BZLSQoY2FsbCBBTExZRVMsIE1QRUdUU19ERU1VWEVSIE1YRl9NVVhFUiBQQ01fUzE2TEVfRU5DT0RFUikgKz0gZmF0ZS1jb3B5LXRyYWM0OTE0CitmYXRlLWNvcHktdHJhYzQ5MTQ6ICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL3hkY2FtOG1wMi0xc19zbWFsbC50cworZmF0ZS1jb3B5LXRyYWM0OTE0OiBDTUQgPSB0cmFuc2NvZGUgbXBlZ3RzICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL3hkY2FtOG1wMi0xc19zbWFsbC50c1wKKyAgICAgICAgICAgICAgICAgICAgICBteGYgIi1jOmEgcGNtX3MxNmxlIC1jOnYgY29weSIKKworRkFURV9TVFJFQU1DT1BZLSQoY2FsbCBBTExZRVMsIE1QRUdUU19ERU1VWEVSIEFWSV9NVVhFUikgKz0gZmF0ZS1jb3B5LXRyYWM0OTE0LWF2aQorZmF0ZS1jb3B5LXRyYWM0OTE0LWF2aTogJChUQVJHRVRfU0FNUExFUykvbXBlZzIveGRjYW04bXAyLTFzX3NtYWxsLnRzCitmYXRlLWNvcHktdHJhYzQ5MTQtYXZpOiBDTUQgPSB0cmFuc2NvZGUgbXBlZ3RzICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL3hkY2FtOG1wMi0xc19zbWFsbC50c1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpICItYzphIGNvcHkgLWM6diBjb3B5IgorCitGQVRFX1NUUkVBTUNPUFktJChjYWxsIEFMTFlFUywgSDI2NF9ERU1VWEVSIEFWSV9NVVhFUikgKz0gZmF0ZS1jb3B5LXRyYWMyMjExLWF2aQorZmF0ZS1jb3B5LXRyYWMyMjExLWF2aTogJChUQVJHRVRfU0FNUExFUykvaDI2NC9iYmMyLnNhbXBsZS5oMjY0CitmYXRlLWNvcHktdHJhYzIyMTEtYXZpOiBDTUQgPSB0cmFuc2NvZGUgImgyNjQgLXIgMTQiICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvYmJjMi5zYW1wbGUuaDI2NFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpICItYzphIGNvcHkgLWM6diBjb3B5IgorCitGQVRFX1NUUkVBTUNPUFktJChjYWxsIERFTU1VWCwgT0dHLCBPR0cpICs9IGZhdGUtbGltaXRlZF9pbnB1dF9zZWVrIGZhdGUtbGltaXRlZF9pbnB1dF9zZWVrLWNvcHl0cwogZmF0ZS1saW1pdGVkX2lucHV0X3NlZWs6ICQoVEFSR0VUX1NBTVBMRVMpL3ZvcmJpcy9tb29nX3NtYWxsLm9nZwogZmF0ZS1saW1pdGVkX2lucHV0X3NlZWs6IENNRCA9IG1kNSAtc3MgMS41IC10IDEuMyAtaSAkKFRBUkdFVF9TQU1QTEVTKS92b3JiaXMvbW9vZ19zbWFsbC5vZ2cgLWM6YSBjb3B5IC1mZmxhZ3MgK2JpdGV4YWN0IC1mIG9nZwogZmF0ZS1saW1pdGVkX2lucHV0X3NlZWstY29weXRzOiAkKFRBUkdFVF9TQU1QTEVTKS92b3JiaXMvbW9vZ19zbWFsbC5vZ2cKIGZhdGUtbGltaXRlZF9pbnB1dF9zZWVrLWNvcHl0czogQ01EID0gbWQ1IC1zcyAxLjUgLXQgMS4zIC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZvcmJpcy9tb29nX3NtYWxsLm9nZyAtYzphIGNvcHkgLWNvcHl0cyAtZmZsYWdzICtiaXRleGFjdCAtZiBvZ2cKKworRkFURV9TVFJFQU1DT1BZLSQoY2FsbCBBTExZRVMsIE1PVl9ERU1VWEVSIE1PVl9NVVhFUikgKz0gZmF0ZS1jb3B5LXBzcAorZmF0ZS1jb3B5LXBzcDogJChUQVJHRVRfU0FNUExFUykvaDI2NC93d3dxX2N1dC5tcDQKK2ZhdGUtY29weS1wc3A6IENNRCA9IHRyYW5zY29kZSAibW92IiAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L3d3d3FfY3V0Lm1wNFwKKyAgICAgICAgICAgICAgICAgICAgICBwc3AgIi1jIGNvcHkiICItY29kZWMgY29weSIKKworZmF0ZS1zdHJlYW1jb3B5OiAkKEZBVEVfU1RSRUFNQ09QWS15ZXMpCisKK0ZBVEVfU0FNUExFU19GRk1QRUctJChjYWxsIEFMTFlFUywgTU9WX0RFTVVYRVIgTUFUUk9TS0FfTVVYRVIpICs9IGZhdGUtcmdiMjQtbWt2CitmYXRlLXJnYjI0LW1rdjogJChUQVJHRVRfU0FNUExFUykvcXRybGUvYWxldHJlay1ybGUubW92CitmYXRlLXJnYjI0LW1rdjogQ01EID0gdHJhbnNjb2RlICJtb3YiICQoVEFSR0VUX1NBTVBMRVMpL3F0cmxlL2FsZXRyZWstcmxlLm1vdlwKKyAgICAgICAgICAgICAgICAgICAgICBtYXRyb3NrYSAiLWM6diByYXd2aWRlbyAtcGl4X2ZtdCByZ2IyNCAtYWxsb3dfcmF3X3ZmdyAxIC1mcmFtZXM6diAxIgorCitGQVRFX1NBTVBMRVNfRkZNUEVHLSQoY2FsbCBBTExZRVMsIEFBQ19ERU1VWEVSIE1PVl9NVVhFUikgKz0gZmF0ZS1hZHRzdG9hc2NfdGlja2V0MzcxNQorZmF0ZS1hZHRzdG9hc2NfdGlja2V0MzcxNTogJChUQVJHRVRfU0FNUExFUykvYWFjL2Zvby5hYWMKK2ZhdGUtYWR0c3RvYXNjX3RpY2tldDM3MTU6IENNRCA9IHRyYW5zY29kZSAiYWFjIiAkKFRBUkdFVF9TQU1QTEVTKS9hYWMvZm9vLmFhY1wKKyAgICAgICAgICAgICAgICAgICAgICBtb3YgIi1jIGNvcHkgLWJzZjphIGFhY19hZHRzdG9hc2MiICItY29kZWMgY29weSIKKworRkFURV9TQU1QTEVTX0ZGTVBFRy0kKGNhbGwgQUxMWUVTLCBNT1ZfREVNVVhFUiBIMjY0X01VWEVSIEgyNjRfTVA0VE9BTk5FWEJfQlNGKSArPSBmYXRlLWgyNjRfbXA0dG9hbm5leGJfdGlja2V0Mjk5MQorZmF0ZS1oMjY0X21wNHRvYW5uZXhiX3RpY2tldDI5OTE6ICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvd3d3cV9jdXQubXA0CitmYXRlLWgyNjRfbXA0dG9hbm5leGJfdGlja2V0Mjk5MTogQ01EID0gdHJhbnNjb2RlICJtcDQiICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvd3d3cV9jdXQubXA0XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgyNjQgIi1jOnYgY29weSAtYnNmOnYgaDI2NF9tcDR0b2FubmV4YiIgIi1jb2RlYyBjb3B5IgorCitGQVRFX1NBTVBMRVNfRkZNUEVHLSQoY2FsbCBBTExZRVMsIE1PVl9ERU1VWEVSIEgyNjRfTVVYRVIgSDI2NF9NUDRUT0FOTkVYQl9CU0YpICs9IGZhdGUtaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQ1OTI3IGZhdGUtaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQ1OTI3XzIKK2ZhdGUtaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQ1OTI3OiAgIENNRCA9IHRyYW5zY29kZSAibXA0IiAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L3RoZXplcm90aGVvcmVtLWN1dC5tcDQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NCAiLWM6diBjb3B5IC1ic2Y6diBoMjY0X21wNHRvYW5uZXhiIC1hbiIgIi1jOnYgY29weSIKK2ZhdGUtaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQ1OTI3XzI6IENNRCA9IHRyYW5zY29kZSAibXA0IiAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L3RoZXplcm90aGVvcmVtLWN1dC5tcDQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDI2NCAiLWM6diBjb3B5IC1hbiIgIi1jOnYgY29weSIKKworRkFURV9TQU1QTEVTX0ZGTVBFRy0kKGNhbGwgQUxMWUVTLCBNUEVHUFNfREVNVVhFUiBBVklfTVVYRVIgUkVNT1ZFX0VYVFJBREFUQV9CU0YpICs9IGZhdGUtZmZtcGVnLWJzZi1yZW1vdmUtayBmYXRlLWZmbXBlZy1ic2YtcmVtb3ZlLXIgZmF0ZS1mZm1wZWctYnNmLXJlbW92ZS1lCitmYXRlLWZmbXBlZy1ic2YtcmVtb3ZlLWs6ICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL21hdHJpeGJlbmNoX21wZWcyLmxxMS5tcGcKK2ZhdGUtZmZtcGVnLWJzZi1yZW1vdmUtazogQ01EID0gdHJhbnNjb2RlICJtcGVnIiAkKFRBUkdFVF9TQU1QTEVTKS9tcGVnMi9tYXRyaXhiZW5jaF9tcGVnMi5scTEubXBnXAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdmkgIi12YnNmIHJlbW92ZV9leHRyYT1rIiAiLWNvZGVjIGNvcHkiCitmYXRlLWZmbXBlZy1ic2YtcmVtb3ZlLXI6ICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL21hdHJpeGJlbmNoX21wZWcyLmxxMS5tcGcKK2ZhdGUtZmZtcGVnLWJzZi1yZW1vdmUtcjogQ01EID0gdHJhbnNjb2RlICJtcGVnIiAkKFRBUkdFVF9TQU1QTEVTKS9tcGVnMi9tYXRyaXhiZW5jaF9tcGVnMi5scTEubXBnXAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdmkgIi12YnNmIHJlbW92ZV9leHRyYT1rZXlmcmFtZSIgIi1jb2RlYyBjb3B5IgorZmF0ZS1mZm1wZWctYnNmLXJlbW92ZS1lOiAkKFRBUkdFVF9TQU1QTEVTKS9tcGVnMi9tYXRyaXhiZW5jaF9tcGVnMi5scTEubXBnCitmYXRlLWZmbXBlZy1ic2YtcmVtb3ZlLWU6IENNRCA9IHRyYW5zY29kZSAibXBlZyIgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbWF0cml4YmVuY2hfbXBlZzIubHExLm1wZ1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXZpICItdmJzZiByZW1vdmVfZXh0cmE9ZSIgIi1jb2RlYyBjb3B5IgorCisKK0ZBVEVfU0FNUExFU19GRk1QRUcteWVzICs9ICQoRkFURV9TVFJFQU1DT1BZLXllcykKKworRkFURV9USU1FX0JBU0UtJChjYWxsIEFMTFlFUywgTVBFR1BTX0RFTVVYRVIgTVhGX01VWEVSKSArPSBmYXRlLXRpbWVfYmFzZQorZmF0ZS10aW1lX2Jhc2U6ICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL2R2ZF9zaW5nbGVfZnJhbWUudm9iCitmYXRlLXRpbWVfYmFzZTogQ01EID0gbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL2R2ZF9zaW5nbGVfZnJhbWUudm9iIC1hbiAtc24gLWM6diBjb3B5IC1yIDI1IC10aW1lX2Jhc2UgMTAwMTozMDAwMCAtZmZsYWdzICtiaXRleGFjdCAtZiBteGYKKworRkFURV9TQU1QTEVTX0ZGTVBFRy15ZXMgKz0gJChGQVRFX1RJTUVfQkFTRS15ZXMpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2ZmdC5tYWsgYi90ZXN0cy9mYXRlL2ZmdC5tYWsKaW5kZXggOWZkY2EyYi4uYzdjMjZjZCAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9mZnQubWFrCisrKyBiL3Rlc3RzL2ZhdGUvZmZ0Lm1hawpAQCAtMSw4ICsxLDggQEAKIGRlZmluZSBERUZfRkZUCi1GQVRFX0ZGVC0kKENPTkZJR19EQ1QpICArPSBmYXRlLWRjdDFkLSQoMSkgZmF0ZS1pZGN0MWQtJCgxKQotRkFURV9GRlQtJChDT05GSUdfRkZUKSAgKz0gZmF0ZS1mZnQtJCgxKSAgIGZhdGUtaWZmdC0kKDEpCi1GQVRFX0ZGVC0kKENPTkZJR19NRENUKSArPSBmYXRlLW1kY3QtJCgxKSAgZmF0ZS1pbWRjdC0kKDEpCi1GQVRFX0ZGVC0kKENPTkZJR19SREZUKSArPSBmYXRlLXJkZnQtJCgxKSAgZmF0ZS1pcmRmdC0kKDEpCitGQVRFX0RDVC0kKENPTkZJR19EQ1QpICAgKz0gZmF0ZS1kY3QxZC0kKDEpIGZhdGUtaWRjdDFkLSQoMSkKK0ZBVEVfRkZULSQoQ09ORklHX0ZGVCkgICArPSBmYXRlLWZmdC0kKDEpICAgZmF0ZS1pZmZ0LSQoMSkKK0ZBVEVfTURDVC0kKENPTkZJR19NRENUKSArPSBmYXRlLW1kY3QtJCgxKSAgZmF0ZS1pbWRjdC0kKDEpCitGQVRFX1JERlQtJChDT05GSUdfUkRGVCkgKz0gZmF0ZS1yZGZ0LSQoMSkgIGZhdGUtaXJkZnQtJCgxKQogCiBmYXRlLWZmdC0kKE4pOiAgICBBUkdTID0gLW4kKDEpCiBmYXRlLWlmZnQtJChOKTogICBBUkdTID0gLW4kKDEpIC1pCkBAIC0xNiwxNCArMTYsMTkgQEAKIAogJChmb3JlYWNoIE4sIDQgNSA2IDcgOCA5IDEwIDExIDEyLCAkKGV2YWwgJChjYWxsIERFRl9GRlQsJChOKSkpKQogCitmYXRlLWRjdC1mbG9hdDogJChGQVRFX0RDVC15ZXMpCiBmYXRlLWZmdC1mbG9hdDogJChGQVRFX0ZGVC15ZXMpCi0kKEZBVEVfRkZULXllcyk6IGxpYmF2Y29kZWMvZmZ0LXRlc3QkKEVYRVNVRikKLSQoRkFURV9GRlQteWVzKTogQ01EID0gcnVuIGxpYmF2Y29kZWMvZmZ0LXRlc3QgJChDUFVGTEFHUzolPS1jJSkgJChBUkdTKQotJChGQVRFX0ZGVC15ZXMpOiBSRUYgPSAvZGV2L251bGwKK2ZhdGUtbWRjdC1mbG9hdDogJChGQVRFX01EQ1QteWVzKQorZmF0ZS1yZGZ0LWZsb2F0OiAkKEZBVEVfUkRGVC15ZXMpCisKK0ZBVEVfRkZUX0FMTCA9ICQoRkFURV9EQ1QteWVzKSAkKEZBVEVfRkZULXllcykgJChGQVRFX01EQ1QteWVzKSAkKEZBVEVfUkRGVC15ZXMpCisKKyQoRkFURV9GRlRfQUxMKTogbGliYXZjb2RlYy90ZXN0cy9mZnQkKEVYRVNVRikKKyQoRkFURV9GRlRfQUxMKTogQ01EID0gcnVuIGxpYmF2Y29kZWMvdGVzdHMvZmZ0ICQoQ1BVRkxBR1M6JT0tYyUpICQoQVJHUykKIAogZGVmaW5lIERFRl9GRlRfRklYRUQKLUZBVEVfRkZUX0ZJWEVELSQoQ09ORklHX0ZGVCkgICs9IGZhdGUtZmZ0LWZpeGVkLSQoMSkgIGZhdGUtaWZmdC1maXhlZC0kKDEpCi1GQVRFX0ZGVF9GSVhFRC0kKENPTkZJR19NRENUKSArPSBmYXRlLW1kY3QtZml4ZWQtJCgxKSBmYXRlLWltZGN0LWZpeGVkLSQoMSkKK0ZBVEVfRkZUX0ZJWEVELSQoQ09ORklHX0ZGVCkgICArPSBmYXRlLWZmdC1maXhlZC0kKDEpICBmYXRlLWlmZnQtZml4ZWQtJCgxKQorRkFURV9NRENUX0ZJWEVELSQoQ09ORklHX01EQ1QpICs9IGZhdGUtbWRjdC1maXhlZC0kKDEpIGZhdGUtaW1kY3QtZml4ZWQtJCgxKQogCiBmYXRlLWZmdC1maXhlZC0kKDEpOiAgIEFSR1MgPSAtbiQoMSkKIGZhdGUtaWZmdC1maXhlZC0kKDEpOiAgQVJHUyA9IC1uJCgxKSAtaQpAQCAtMzQsOSArMzksMTQgQEAKICQoZm9yZWFjaCBOLCA0IDUgNiA3IDggOSAxMCAxMSAxMiwgJChldmFsICQoY2FsbCBERUZfRkZUX0ZJWEVELCQoTikpKSkKIAogZmF0ZS1mZnQtZml4ZWQ6ICQoRkFURV9GRlRfRklYRUQteWVzKQotJChGQVRFX0ZGVF9GSVhFRC15ZXMpOiBsaWJhdmNvZGVjL2ZmdC1maXhlZC10ZXN0JChFWEVTVUYpCi0kKEZBVEVfRkZUX0ZJWEVELXllcyk6IENNRCA9IHJ1biBsaWJhdmNvZGVjL2ZmdC1maXhlZC10ZXN0ICQoQ1BVRkxBR1M6JT0tYyUpICQoQVJHUykKLSQoRkFURV9GRlRfRklYRUQteWVzKTogUkVGID0gL2Rldi9udWxsCitmYXRlLW1kY3QtZml4ZWQ6ICQoRkFURV9NRENUX0ZJWEVELXllcykKKworRkFURV9GRlRfRklYRURfQUxMID0gJChGQVRFX0ZGVF9GSVhFRC15ZXMpICQoRkFURV9NRENUX0ZJWEVELXllcykKKworJChGQVRFX0ZGVF9GSVhFRF9BTEwpOiBsaWJhdmNvZGVjL3Rlc3RzL2ZmdC1maXhlZCQoRVhFU1VGKQorJChGQVRFX0ZGVF9GSVhFRF9BTEwpOiBDTUQgPSBydW4gbGliYXZjb2RlYy90ZXN0cy9mZnQtZml4ZWQgJChDUFVGTEFHUzolPS1jJSkgJChBUkdTKQorCiskKEZBVEVfRkZUX0FMTCkgJChGQVRFX0ZGVF9GSVhFRF9BTEwpOiBDTVAgPSBudWxsCiAKIGRlZmluZSBERUZfRkZUX0ZJWEVEMzIKIEZBVEVfRkZUX0ZJWEVEMzIgKz0gZmF0ZS1mZnQtZml4ZWQzMi0kKDEpICAgZmF0ZS1pZmZ0LWZpeGVkMzItJCgxKSAgXApAQCAtNTAsMTAgKzYwLDQ0IEBACiAKICQoZm9yZWFjaCBOLCA0IDUgNiA3IDggOSAxMCAxMSAxMiwgJChldmFsICQoY2FsbCBERUZfRkZUX0ZJWEVEMzIsJChOKSkpKQogCi1mYXRlLWZmdC1maXhlZDMyLXRlc3Q6ICQoRkFURV9GRlRfRklYRUQzMikKLSQoRkFURV9GRlRfRklYRUQzMik6IGxpYmF2Y29kZWMvZmZ0LWZpeGVkMzItdGVzdCQoRVhFU1VGKQotJChGQVRFX0ZGVF9GSVhFRDMyKTogQ01EID0gcnVuIGxpYmF2Y29kZWMvZmZ0LWZpeGVkMzItdGVzdCAkKENQVUZMQUdTOiU9LWMlKSAkKEFSR1MpCi0kKEZBVEVfRkZUX0ZJWEVEMzIpOiBSRUYgPSAvZGV2L251bGwKK2ZhdGUtZmZ0LWZpeGVkMzI6ICQoRkFURV9GRlRfRklYRUQzMikKKyQoRkFURV9GRlRfRklYRUQzMik6IGxpYmF2Y29kZWMvdGVzdHMvZmZ0LWZpeGVkMzIkKEVYRVNVRikKKyQoRkFURV9GRlRfRklYRUQzMik6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL2ZmdC1maXhlZDMyICQoQ1BVRkxBR1M6JT0tYyUpICQoQVJHUykKKyQoRkFURV9GRlRfRklYRUQzMik6IENNUCA9IG51bGwKIAotRkFURS0kKGNhbGwgQUxMWUVTLCBBVkNPREVDIEZGVCBNRENUKSArPSAkKEZBVEVfRkZULXllcykgJChGQVRFX0ZGVF9GSVhFRC15ZXMpICQoRkFURV9GRlRfRklYRUQzMikKLWZhdGUtZmZ0OiAkKEZBVEVfRkZULXllcykgJChGQVRFX0ZGVF9GSVhFRC15ZXMpICQoRkFURV9GRlRfRklYRUQzMikKK2RlZmluZSBERUZfQVZfRkZUCitGQVRFX0FWX0RDVC0kKENPTkZJR19EQ1QpICAgKz0gZmF0ZS1hdi1kY3QxZC0kKDEpIGZhdGUtYXYtaWRjdDFkLSQoMSkKK0ZBVEVfQVZfRkZULSQoQ09ORklHX0ZGVCkgICArPSBmYXRlLWF2LWZmdC0kKDEpICAgZmF0ZS1hdi1pZmZ0LSQoMSkKK0ZBVEVfQVZfTURDVC0kKENPTkZJR19NRENUKSArPSBmYXRlLWF2LW1kY3QtJCgxKSAgZmF0ZS1hdi1pbWRjdC0kKDEpCitGQVRFX0FWX1JERlQtJChDT05GSUdfUkRGVCkgKz0gZmF0ZS1hdi1yZGZ0LSQoMSkgIGZhdGUtYXYtaXJkZnQtJCgxKQorCitmYXRlLWF2LWZmdC0kKE4pOiAgICBBUkdTID0gLW4kKDEpCitmYXRlLWF2LWlmZnQtJChOKTogICBBUkdTID0gLW4kKDEpIC1pCitmYXRlLWF2LW1kY3QtJChOKTogICBBUkdTID0gLW4kKDEpIC1tCitmYXRlLWF2LWltZGN0LSQoTik6ICBBUkdTID0gLW4kKDEpIC1tIC1pCitmYXRlLWF2LXJkZnQtJChOKTogICBBUkdTID0gLW4kKDEpIC1yCitmYXRlLWF2LWlyZGZ0LSQoTik6ICBBUkdTID0gLW4kKDEpIC1yIC1pCitmYXRlLWF2LWRjdDFkLSQoTik6ICBBUkdTID0gLW4kKDEpIC1kCitmYXRlLWF2LWlkY3QxZC0kKE4pOiBBUkdTID0gLW4kKDEpIC1kIC1pCitlbmRlZgorCiskKGZvcmVhY2ggTiwgNCA1IDYgNyA4IDkgMTAgMTEgMTIsICQoZXZhbCAkKGNhbGwgREVGX0FWX0ZGVCwkKE4pKSkpCisKK2ZhdGUtYXYtZGN0LWZsb2F0OiAkKEZBVEVfQVZfRENULXllcykKK2ZhdGUtYXYtZmZ0LWZsb2F0OiAkKEZBVEVfQVZfRkZULXllcykKK2ZhdGUtYXYtbWRjdC1mbG9hdDogJChGQVRFX0FWX01EQ1QteWVzKQorZmF0ZS1hdi1yZGZ0LWZsb2F0OiAkKEZBVEVfQVZfUkRGVC15ZXMpCisKK0ZBVEVfQVZfRkZUX0FMTCA9ICQoRkFURV9BVl9EQ1QteWVzKSAkKEZBVEVfQVZfRkZULXllcykgJChGQVRFX0FWX01EQ1QteWVzKSAkKEZBVEVfQVZfUkRGVC15ZXMpCisKKyQoRkFURV9BVl9GRlRfQUxMKTogbGliYXZjb2RlYy90ZXN0cy9hdmZmdCQoRVhFU1VGKQorJChGQVRFX0FWX0ZGVF9BTEwpOiBDTUQgPSBydW4gbGliYXZjb2RlYy90ZXN0cy9hdmZmdCAkKENQVUZMQUdTOiU9LWMlKSAkKEFSR1MpCiskKEZBVEVfQVZfRkZUX0FMTCk6IENNUCA9IG51bGwKKworZmF0ZS1kY3Q6IGZhdGUtZGN0LWZsb2F0CitmYXRlLWZmdDogZmF0ZS1mZnQtZmxvYXQgZmF0ZS1mZnQtZml4ZWQgZmF0ZS1mZnQtZml4ZWQzMgorZmF0ZS1tZGN0OiBmYXRlLW1kY3QtZmxvYXQgZmF0ZS1tZGN0LWZpeGVkCitmYXRlLXJkZnQ6IGZhdGUtcmRmdC1mbG9hdAorCitGQVRFLSQoY2FsbCBBTExZRVMsIEFWQ09ERUMgRkZUIE1EQ1QpICs9ICQoRkFURV9GRlRfQUxMKSAkKEZBVEVfRkZUX0ZJWEVEX0FMTCkgJChGQVRFX0ZGVF9GSVhFRDMyKSAkKEZBVEVfQVZfRkZUX0FMTCkKK2ZhdGUtZmZ0LWFsbDogJChGQVRFX0ZGVF9BTEwpICQoRkFURV9GRlRfRklYRURfQUxMKSAkKEZBVEVfRkZUX0ZJWEVEMzIpICQoRkFURV9BVl9GRlRfQUxMKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9maWZvLW11eGVyLm1hayBiL3Rlc3RzL2ZhdGUvZmlmby1tdXhlci5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxMzk1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZhdGUvZmlmby1tdXhlci5tYWsKQEAgLTAsMCArMSwyMCBAQAorZmF0ZS1maWZvLW11eGVyLWgyNjQ6IENNRCA9IGZmbXBlZyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9ta3YvMTI0Mi1zbWFsbC5ta3YgLWZyYW1lczp2IDExXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1jOnYgY29weSAtYzphIGNvcHkgLW1hcCB2OjAgLW1hcCBhOjAgLWZsYWdzICtiaXRleGFjdFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZmZsYWdzICtiaXRleGFjdCAtZiBmaWZvIC1maWZvX2Zvcm1hdCBmcmFtZWNyYyAtCitmYXRlLWZpZm8tbXV4ZXItaDI2NDogUkVGID0gJChTUkNfUEFUSCkvdGVzdHMvcmVmL2ZhdGUvbWt2LTEyNDIKK0ZBVEVfU0FNUExFU19GSUZPX01VWEVSLSQoY2FsbCBBTExZRVMsIEZJRk9fTVVYRVIsIE1BVFJPU0tBX0RFTVVYRVIsIEgyNjRfREVDT0RFUikgKz0gZmF0ZS1maWZvLW11eGVyLWgyNjQKKworZmF0ZS1maWZvLW11eGVyLXdhdjogQ01EID0gZmZtcGVnIC1pICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvLXJlZmVyZW5jZS9jaG9ydXNub2lzZV8yY2hfNDRrSHpfczE2LndhdlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC1jOmEgY29weSAtbWFwIGE6MCAtZmxhZ3MgK2JpdGV4YWN0XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLWZmbGFncyArYml0ZXhhY3QgLWYgZmlmbyAtZmlmb19mb3JtYXQgd2F2IG1kNToKK2ZhdGUtZmlmby1tdXhlci13YXY6IENNUCA9IG9uZWxpbmUKK2ZhdGUtZmlmby1tdXhlci13YXY6IFJFRiA9IDRkZGE1ZGNjN2VjZGMyMjE4YjA3MzlhMTUyYWRhODAyCitGQVRFX1NBTVBMRVNfRklGT19NVVhFUi0kKGNhbGwgQUxMWUVTLCBGSUZPX01VWEVSLCBXQVZfREVNVVhFUikgKz0gZmF0ZS1maWZvLW11eGVyLXdhdgorCitmYXRlLWZpZm8tbXV4ZXItdHN0OiBsaWJhdmZvcm1hdC90ZXN0cy9maWZvX211eGVyJChFWEVTVUYpCitmYXRlLWZpZm8tbXV4ZXItdHN0OiBDTUQgPSBydW4gbGliYXZmb3JtYXQvdGVzdHMvZmlmb19tdXhlciQoRVhFU1VGKQorRkFURV9GSUZPX01VWEVSLSQoY2FsbCBBTExZRVMsIEZJRk9fTVVYRVIgTkVUV09SSykgKz0gZmF0ZS1maWZvLW11eGVyLXRzdAorCitGQVRFX1NBTVBMRVNfRkZNUEVHICs9ICQoRkFURV9TQU1QTEVTX0ZJRk9fTVVYRVIteWVzKQorRkFURV9GRk1QRUcgKz0gJChGQVRFX0ZJRk9fTVVYRVIteWVzKQorZmF0ZS1maWZvLW11eGVyOiAkKEZBVEVfRklGT19NVVhFUi15ZXMpICQoRkFURV9TQU1QTEVTX0ZJRk9fTVVYRVIteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9maWx0ZXItYXVkaW8ubWFrIGIvdGVzdHMvZmF0ZS9maWx0ZXItYXVkaW8ubWFrCmluZGV4IDg1YTM2ZDIuLjJhM2JhMTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvZmlsdGVyLWF1ZGlvLm1haworKysgYi90ZXN0cy9mYXRlL2ZpbHRlci1hdWRpby5tYWsKQEAgLTMsNiArMywyMDQgQEAKIGZhdGUtZmlsdGVyLWFkZWxheTogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKIGZhdGUtZmlsdGVyLWFkZWxheTogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhZGVsYXk9NDIKIAorRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEFFQ0hPLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLWFlY2hvCitmYXRlLWZpbHRlci1hZWNobzogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFlY2hvOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYWVjaG86IENNRCA9IGZyYW1lY3JjIC1pICQoU1JDKSAtYWYgYWVjaG89MC41OjAuNTozMjowLjUKKworRkFURV9GSUxURVJfQUVNUEhBU0lTICs9IGZhdGUtZmlsdGVyLWFlbXBoYXNpcy01MGZtCitmYXRlLWZpbHRlci1hZW1waGFzaXMtNTBmbTogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFlbXBoYXNpcy01MGZtOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYWVtcGhhc2lzLTUwZm06IENNRCA9IGZyYW1lY3JjIC1pICQoU1JDKSAtYWYgYWVtcGhhc2lzPTE6NTpyZXByb2R1Y3Rpb246NTBmbQorCitGQVRFX0ZJTFRFUl9BRU1QSEFTSVMgKz0gZmF0ZS1maWx0ZXItYWVtcGhhc2lzLTc1a2YKK2ZhdGUtZmlsdGVyLWFlbXBoYXNpcy03NWtmOiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYWVtcGhhc2lzLTc1a2Y6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hZW1waGFzaXMtNzVrZjogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhZW1waGFzaXM9Mjo4OnJlcHJvZHVjdGlvbjo3NWtmCisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBBRU1QSEFTSVMsIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gJChGQVRFX0ZJTFRFUl9BRU1QSEFTSVMpCisKK0ZBVEVfRklMVEVSX0FGQURFICs9IGZhdGUtZmlsdGVyLWFmYWRlLXFzaW4KK2ZhdGUtZmlsdGVyLWFmYWRlLXFzaW46IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hZmFkZS1xc2luOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYWZhZGUtcXNpbjogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhZmFkZT10PWluOnNzPTA6ZD0yOmN1cnZlPXFzaW4KKworRkFURV9GSUxURVJfQUZBREUgKz0gZmF0ZS1maWx0ZXItYWZhZGUtaXFzaW4KK2ZhdGUtZmlsdGVyLWFmYWRlLWlxc2luOiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYWZhZGUtaXFzaW46IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hZmFkZS1pcXNpbjogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhZmFkZT10PWluOnNzPTA6ZD0yOmN1cnZlPWlxc2luCisKK0ZBVEVfRklMVEVSX0FGQURFICs9IGZhdGUtZmlsdGVyLWFmYWRlLWVzaW4KK2ZhdGUtZmlsdGVyLWFmYWRlLWVzaW46IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hZmFkZS1lc2luOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYWZhZGUtZXNpbjogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhZmFkZT10PWluOnNzPTA6ZD0yOmN1cnZlPWVzaW4KKworRkFURV9GSUxURVJfQUZBREUgKz0gZmF0ZS1maWx0ZXItYWZhZGUtaHNpbgorZmF0ZS1maWx0ZXItYWZhZGUtaHNpbjogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFmYWRlLWhzaW46IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hZmFkZS1oc2luOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLWFmIGFmYWRlPXQ9aW46c3M9MDpkPTI6Y3VydmU9aHNpbgorCitGQVRFX0ZJTFRFUl9BRkFERSArPSBmYXRlLWZpbHRlci1hZmFkZS1leHAKK2ZhdGUtZmlsdGVyLWFmYWRlLWV4cDogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFmYWRlLWV4cDogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFmYWRlLWV4cDogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhZmFkZT10PWluOnNzPTA6ZD0yOmN1cnZlPWV4cAorCitGQVRFX0ZJTFRFUl9BRkFERSArPSBmYXRlLWZpbHRlci1hZmFkZS1sb2cKK2ZhdGUtZmlsdGVyLWFmYWRlLWxvZzogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFmYWRlLWxvZzogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFmYWRlLWxvZzogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhZmFkZT10PWluOnNzPTE6ZD0yLjU6Y3VydmU9bG9nCisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBBRkFERSwgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSAkKEZBVEVfRklMVEVSX0FGQURFKQorCitGQVRFX0FGSUxURVJfU0FNUExFUy0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBBQ1JPU1NGQURFLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLWFjcm9zc2ZhZGUKK2ZhdGUtZmlsdGVyLWFjcm9zc2ZhZGU6IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hY3Jvc3NmYWRlOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYWNyb3NzZmFkZTogU1JDMiA9ICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvLXJlZmVyZW5jZS9sdWNreW5pZ2h0XzJjaF80NGtIel9zMTYud2F2CitmYXRlLWZpbHRlci1hY3Jvc3NmYWRlOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLWkgJChTUkMyKSAtZmlsdGVyX2NvbXBsZXggYWNyb3NzZmFkZT1kPTI6YzE9bG9nOmMyPWV4cAorCitGQVRFX0FGSUxURVItJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgQUZBREUsIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gZmF0ZS1maWx0ZXItYWdhdGUKK2ZhdGUtZmlsdGVyLWFnYXRlOiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYWdhdGU6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hZ2F0ZTogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhZ2F0ZT1sZXZlbF9pbj0xMDpyYW5nZT0wOnRocmVzaG9sZD0xOnJhdGlvPTE6YXR0YWNrPTE6a25lZT0xOm1ha2V1cD00CisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBBRkFERSwgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSBmYXRlLWZpbHRlci1hbGltaXRlcgorZmF0ZS1maWx0ZXItYWxpbWl0ZXI6IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hbGltaXRlcjogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFsaW1pdGVyOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLWFmIGFsaW1pdGVyPWxldmVsX2luPTE6bGV2ZWxfb3V0PTI6bGltaXQ9MC4yCisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBBTUVSR0UsIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gZmF0ZS1maWx0ZXItYW1lcmdlCitmYXRlLWZpbHRlci1hbWVyZ2U6IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTEud2F2CitmYXRlLWZpbHRlci1hbWVyZ2U6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTEud2F2CitmYXRlLWZpbHRlci1hbWVyZ2U6IENNRCA9IGZyYW1lY3JjIC1pICQoU1JDKSAtaSAkKFNSQykgLWZpbHRlcl9jb21wbGV4ICJbMDphXVsxOmFdYW1lcmdlPWlucHV0cz0yW2FvdXRdIiAtbWFwICJbYW91dF0iCisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBBUEFELCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLWFwYWQKK2ZhdGUtZmlsdGVyLWFwYWQ6IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hcGFkOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYXBhZDogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhcGFkPXBhZF9sZW49MTAKKworRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEFORVFVQUxJWkVSLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLWFuZXF1YWxpemVyCitmYXRlLWZpbHRlci1hbmVxdWFsaXplcjogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFuZXF1YWxpemVyOiB0ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9hbmVxdWFsaXplcgorZmF0ZS1maWx0ZXItYW5lcXVhbGl6ZXI6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hbmVxdWFsaXplcjogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1maWx0ZXJfY29tcGxleF9zY3JpcHQgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvYW5lcXVhbGl6ZXIKKworRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEFTRVROU0FNUExFUywgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSBmYXRlLWZpbHRlci1hc2V0bnNhbXBsZXMtcGFkCitmYXRlLWZpbHRlci1hc2V0bnNhbXBsZXMtcGFkOiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYXNldG5zYW1wbGVzLXBhZDogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFzZXRuc2FtcGxlcy1wYWQ6IENNRCA9IGZyYW1lY3JjIC1pICQoU1JDKSAtYWYgYXNldG5zYW1wbGVzPTUxMjpwPTEKKworRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEFTRVROU0FNUExFUywgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSBmYXRlLWZpbHRlci1hc2V0bnNhbXBsZXMtbm9wYWQKK2ZhdGUtZmlsdGVyLWFzZXRuc2FtcGxlcy1ub3BhZDogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFzZXRuc2FtcGxlcy1ub3BhZDogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWFzZXRuc2FtcGxlcy1ub3BhZDogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1hZiBhc2V0bnNhbXBsZXM9NTEyOnA9MAorCitGQVRFX0FGSUxURVItJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgQVNFVFJBVEUsIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gZmF0ZS1maWx0ZXItYXNldHJhdGUKK2ZhdGUtZmlsdGVyLWFzZXRyYXRlOiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItYXNldHJhdGU6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1hc2V0cmF0ZTogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1mcmFtZXM6YSAyMCAtYWYgYXNldHJhdGU9MjAwMDAKKworRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIENIT1JVUywgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSBmYXRlLWZpbHRlci1jaG9ydXMKK2ZhdGUtZmlsdGVyLWNob3J1czogdGVzdHMvZGF0YS9hc3ludGgtMjIwNTAtMS53YXYKK2ZhdGUtZmlsdGVyLWNob3J1czogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtMjIwNTAtMS53YXYKK2ZhdGUtZmlsdGVyLWNob3J1czogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1mcmFtZXM6YSAxMCAtYWYgY2hvcnVzPTAuMDUwMDAxOjAuMDUwMDAyOjY0OjAuMDUwMDAxOjAuMDI1MDAzOjIuMDAwMDQKKworRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIERDU0hJRlQsIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gZmF0ZS1maWx0ZXItZGNzaGlmdAorZmF0ZS1maWx0ZXItZGNzaGlmdDogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWRjc2hpZnQ6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1kY3NoaWZ0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLWZyYW1lczphIDIwIC1hZiBkY3NoaWZ0PXNoaWZ0PTAuMjU6bGltaXRlcmdhaW49MC4wNQorCitGQVRFX0FGSUxURVItJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgRUFSV0FYLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLWVhcndheAorZmF0ZS1maWx0ZXItZWFyd2F4OiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItZWFyd2F4OiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItZWFyd2F4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLWZyYW1lczphIDIwIC1hZiBlYXJ3YXgKKworRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEVYVFJBU1RFUkVPLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLWV4dHJhc3RlcmVvCitmYXRlLWZpbHRlci1leHRyYXN0ZXJlbzogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWV4dHJhc3RlcmVvOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItZXh0cmFzdGVyZW86IENNRCA9IGZyYW1lY3JjIC1pICQoU1JDKSAtZnJhbWVzOmEgMjAgLWFmIGV4dHJhc3RlcmVvPW09MgorCitGQVRFX0FGSUxURVItJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgRklSRVFVQUxJWkVSIEFUUklNIFZPTFVNRSwgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSBmYXRlLWZpbHRlci1maXJlcXVhbGl6ZXIKK2ZhdGUtZmlsdGVyLWZpcmVxdWFsaXplcjogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLWZpcmVxdWFsaXplcjogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvZmlyZXF1YWxpemVyCitmYXRlLWZpbHRlci1maXJlcXVhbGl6ZXI6IFJFRiA9IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1maXJlcXVhbGl6ZXI6IENNRCA9IGZmbXBlZyAtaSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdiAtZmlsdGVyX3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9maXJlcXVhbGl6ZXIgLWYgd2F2IC1jOmEgcGNtX3MxNmxlIC0KK2ZhdGUtZmlsdGVyLWZpcmVxdWFsaXplcjogQ01QID0gb25lb2ZmCitmYXRlLWZpbHRlci1maXJlcXVhbGl6ZXI6IENNUF9VTklUID0gczE2CitmYXRlLWZpbHRlci1maXJlcXVhbGl6ZXI6IFNJWkVfVE9MRVJBTkNFID0gMTA1ODQwMCAtIDEwOTcyMDgKKworRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIFBBTiwgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSBmYXRlLWZpbHRlci1wYW4tbW9ubzEKK2ZhdGUtZmlsdGVyLXBhbi1tb25vMTogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLXBhbi1tb25vMTogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLXBhbi1tb25vMTogQ01EID0gZnJhbWVjcmMgLXNzIDMuMTQgLWkgJChTUkMpIC1mcmFtZXM6YSAyMCAtZmlsdGVyOmEgInBhbj1tb25vfEZDPUZMIgorCitGQVRFX0FGSUxURVItJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgUEFOLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLXBhbi1tb25vMgorZmF0ZS1maWx0ZXItcGFuLW1vbm8yOiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItcGFuLW1vbm8yOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItcGFuLW1vbm8yOiBDTUQgPSBmcmFtZWNyYyAtc3MgMy4xNCAtaSAkKFNSQykgLWZyYW1lczphIDIwIC1maWx0ZXI6YSAicGFuPTFDfGMwPWMwK2MxIgorCitGQVRFX0FGSUxURVItJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgUEFOLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLXBhbi1zdGVyZW8xCitmYXRlLWZpbHRlci1wYW4tc3RlcmVvMTogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMy53YXYKK2ZhdGUtZmlsdGVyLXBhbi1zdGVyZW8xOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0zLndhdgorZmF0ZS1maWx0ZXItcGFuLXN0ZXJlbzE6IENNRCA9IGZyYW1lY3JjIC1zcyAzLjE0IC1pICQoU1JDKSAtZnJhbWVzOmEgMjAgLWZpbHRlcjphICJwYW49MmN8Rkw9RlJ8RlI9RkwiCisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBQQU4sIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gZmF0ZS1maWx0ZXItcGFuLXN0ZXJlbzIKK2ZhdGUtZmlsdGVyLXBhbi1zdGVyZW8yOiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0zLndhdgorZmF0ZS1maWx0ZXItcGFuLXN0ZXJlbzI6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTMud2F2CitmYXRlLWZpbHRlci1wYW4tc3RlcmVvMjogQ01EID0gZnJhbWVjcmMgLXNzIDMuMTQgLWkgJChTUkMpIC1mcmFtZXM6YSAyMCAtZmlsdGVyOmEgInBhbj1zdGVyZW98YzA9YzAtYzJ8YzE9YzEtYzIiCisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBQQU4sIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gZmF0ZS1maWx0ZXItcGFuLXN0ZXJlbzMKK2ZhdGUtZmlsdGVyLXBhbi1zdGVyZW8zOiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItcGFuLXN0ZXJlbzM6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1wYW4tc3RlcmVvMzogQ01EID0gZnJhbWVjcmMgLXNzIDMuMTQgLWkgJChTUkMpIC1mcmFtZXM6YSAyMCAtZmlsdGVyOmEgInBhbj1GTCtGUnxGTDwzKmMwKzIqYzF8RlI8MipjMCszKmMxIgorCitGQVRFX0FGSUxURVItJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgUEFOLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLXBhbi1zdGVyZW80CitmYXRlLWZpbHRlci1wYW4tc3RlcmVvNDogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLXBhbi1zdGVyZW80OiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItcGFuLXN0ZXJlbzQ6IENNRCA9IGZyYW1lY3JjIC1zcyAzLjE0IC1ndWVzc19sYXlvdXRfbWF4IDAgLWkgJChTUkMpIC1mcmFtZXM6YSAyMCAtZmlsdGVyOmEgInBhbj00Q3xjMD1jMC0wLjUqYzF8YzE9YzErMC41KmMwfGMyPTAqYzB8YzM9MCpjMCIKKworRkFURV9BRklMVEVSX1NBTVBMRVMtJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgU0lMRU5DRVJFTU9WRSwgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSBmYXRlLWZpbHRlci1zaWxlbmNlcmVtb3ZlCitmYXRlLWZpbHRlci1zaWxlbmNlcmVtb3ZlOiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpby1yZWZlcmVuY2UvZGl2ZXJ0aW1lbnRpXzJjaF85NmtIel9zMjQud2F2CitmYXRlLWZpbHRlci1zaWxlbmNlcmVtb3ZlOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLWZyYW1lczphIDMwIC1hZiBzaWxlbmNlcmVtb3ZlPTA6MDowOi0xOjA6LTkwZEIKKworRkFURV9BRklMVEVSX1NBTVBMRVMtJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgU1RFUkVPVE9PTFMsIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gZmF0ZS1maWx0ZXItc3RlcmVvdG9vbHMKK2ZhdGUtZmlsdGVyLXN0ZXJlb3Rvb2xzOiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpby1yZWZlcmVuY2UvbHVja3luaWdodF8yY2hfNDRrSHpfczE2LndhdgorZmF0ZS1maWx0ZXItc3RlcmVvdG9vbHM6IENNRCA9IGZyYW1lY3JjIC1pICQoU1JDKSAtZnJhbWVzOmEgMjAgLWFmIHN0ZXJlb3Rvb2xzPW1sZXY9MC4wMTU2MjUKKworRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIFRSRU1PTE8sIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gZmF0ZS1maWx0ZXItdHJlbW9sbworZmF0ZS1maWx0ZXItdHJlbW9sbzogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKK2ZhdGUtZmlsdGVyLXRyZW1vbG86IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci10cmVtb2xvOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLWZyYW1lczphIDIwIC1hZiB0cmVtb2xvCisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBDT01QQU5ELCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtZmlsdGVyLWNvbXBhbmQKK2ZhdGUtZmlsdGVyLWNvbXBhbmQ6IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CitmYXRlLWZpbHRlci1jb21wYW5kOiB0ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9jb21wYW5kCitmYXRlLWZpbHRlci1jb21wYW5kOiBTUkMgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLndhdgorZmF0ZS1maWx0ZXItY29tcGFuZDogQ01EID0gZnJhbWVjcmMgLWkgJChTUkMpIC1mcmFtZXM6YSAyMCAtZmlsdGVyX2NvbXBsZXhfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL2NvbXBhbmQKKwordGVzdHMvZGF0YS9obHMtbGlzdC5tM3U4OiBUQUcgPSBHRU4KK3Rlc3RzL2RhdGEvaGxzLWxpc3QubTN1ODogZmZtcGVnJChQUk9HU1NVRikkKEVYRVNVRikgfCB0ZXN0cy9kYXRhCisJJChNKSQoVEFSR0VUX0VYRUMpICQoVEFSR0VUX1BBVEgpLyQ8IFwKKyAgICAgICAgLWYgbGF2ZmkgLWkgImFldmFsc3JjPWNvcygyKlBJKnQpKnNpbigyKlBJKig0NDArNCp0KSp0KTpkPTIwIiAtZiBzZWdtZW50IC1zZWdtZW50X3RpbWUgMTAgLW1hcCAwIC1mbGFncyArYml0ZXhhY3QgLWNvZGVjOmEgbXAyZml4ZWQgXAorICAgICAgICAtc2VnbWVudF9saXN0ICQoVEFSR0VUX1BBVEgpLyRAIC15ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvaGxzLW91dC0lMDNkLnRzIDI+L2Rldi9udWxsCisKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgQUxMWUVTLCBITFNfREVNVVhFUiBNUEVHVFNfTVVYRVIgTVBFR1RTX0RFTVVYRVIgQUVWQUxTUkNfRklMVEVSIExBVkZJX0lOREVWIE1QMkZJWEVEX0VOQ09ERVIpICs9IGZhdGUtZmlsdGVyLWhscworZmF0ZS1maWx0ZXItaGxzOiB0ZXN0cy9kYXRhL2hscy1saXN0Lm0zdTgKK2ZhdGUtZmlsdGVyLWhsczogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2hscy1saXN0Lm0zdTgKKwordGVzdHMvZGF0YS9obHMtbGlzdC1hcHBlbmQubTN1ODogVEFHID0gR0VOCit0ZXN0cy9kYXRhL2hscy1saXN0LWFwcGVuZC5tM3U4OiBmZm1wZWckKFBST0dTU1VGKSQoRVhFU1VGKSB8IHRlc3RzL2RhdGEKKwkkKE0pJChUQVJHRVRfRVhFQykgJChUQVJHRVRfUEFUSCkvJDwgXAorICAgICAgICAtZiBsYXZmaSAtaSAiYWV2YWxzcmM9Y29zKDIqUEkqdCkqc2luKDIqUEkqKDQ0MCs0KnQpKnQpOmQ9MjAiIC1mIHNlZ21lbnQgLXNlZ21lbnRfdGltZSAxMCAtbWFwIDAgLWZsYWdzICtiaXRleGFjdCAtY29kZWM6YSBtcDJmaXhlZCBcCisgICAgICAgIC1zZWdtZW50X2xpc3QgJChUQVJHRVRfUEFUSCkvJEAgLXkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9obHMtYXBwZW5kLW91dC0lMDNkLnRzIDI+L2Rldi9udWxsOyBcCisgICAgICAgICQoVEFSR0VUX0VYRUMpICQoVEFSR0VUX1BBVEgpLyQ8IFwKKyAgICAgICAgLWYgbGF2ZmkgLWkgImFldmFsc3JjPWNvcygyKlBJKnQpKnNpbigyKlBJKig0NDArNCp0KSp0KTpkPTIwIiAtZiBobHMgLWhsc190aW1lIDEwIC1tYXAgMCAtZmxhZ3MgK2JpdGV4YWN0IFwKKyAgICAgICAgLWhsc19mbGFncyBhcHBlbmRfbGlzdCAtY29kZWM6YSBtcDJmaXhlZCAtaGxzX3NlZ21lbnRfZmlsZW5hbWUgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9obHMtYXBwZW5kLW91dC0lMDNkLnRzIFwKKyAgICAgICAgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9obHMtbGlzdC1hcHBlbmQubTN1OCAyPi9kZXYvbnVsbAorCitGQVRFX0FGSUxURVItJChjYWxsIEFMTFlFUywgSExTX0RFTVVYRVIgTVBFR1RTX01VWEVSIE1QRUdUU19ERU1VWEVSIEFFVkFMU1JDX0ZJTFRFUiBMQVZGSV9JTkRFViBNUDJGSVhFRF9FTkNPREVSKSArPSBmYXRlLWZpbHRlci1obHMtYXBwZW5kCitmYXRlLWZpbHRlci1obHMtYXBwZW5kOiB0ZXN0cy9kYXRhL2hscy1saXN0LWFwcGVuZC5tM3U4CitmYXRlLWZpbHRlci1obHMtYXBwZW5kOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvaGxzLWxpc3QtYXBwZW5kLm0zdTggLWFmIGFzZXRwdHM9UlRDVElNRQorCiBGQVRFX0FNSVggKz0gZmF0ZS1maWx0ZXItYW1peC1zaW1wbGUKIGZhdGUtZmlsdGVyLWFtaXgtc2ltcGxlOiBDTUQgPSBmZm1wZWcgLWZpbHRlcl9jb21wbGV4IGFtaXggLWkgJChTUkMpIC1zcyAzIC1pICQoU1JDMSkgLWYgZjMybGUgLQogZmF0ZS1maWx0ZXItYW1peC1zaW1wbGU6IFJFRiA9ICQoU0FNUExFUykvZmlsdGVyL2FtaXhfc2ltcGxlLnBjbQpAQCAtMTcsMjAgKzIxNSwxNCBAQAogZmF0ZS1maWx0ZXItYW1peC10cmFuc2l0aW9uOiBDTUQgPSBmZm1wZWcgLWZpbHRlcl9jb21wbGV4IGFtaXg9aW5wdXRzPTM6ZHJvcG91dF90cmFuc2l0aW9uPTAuNSAtaSAkKFNSQykgLXNzIDIgLWkgJChTUkMxKSAtc3MgNCAtaSAkKFNSQzIpIC1mIGYzMmxlIC0KIGZhdGUtZmlsdGVyLWFtaXgtdHJhbnNpdGlvbjogUkVGID0gJChTQU1QTEVTKS9maWx0ZXIvYW1peF90cmFuc2l0aW9uLnBjbQogCi1GQVRFX0FGSUxURVItJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgQU1JWCwgV0FWLCBQQ01fUzE2TEUsIFBDTV9GMzJMRSwgUENNX0YzMkxFKSArPSAkKEZBVEVfQU1JWCkKK0ZBVEVfQUZJTFRFUl9TQU1QTEVTLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEFNSVgsIFdBViwgUENNX1MxNkxFLCBQQ01fRjMyTEUsIFBDTV9GMzJMRSkgKz0gJChGQVRFX0FNSVgpCiAkKEZBVEVfQU1JWCk6IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTItMi53YXYKICQoRkFURV9BTUlYKTogU1JDICA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CiAkKEZBVEVfQU1JWCk6IFNSQzEgPSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0yLTIud2F2CiAkKEZBVEVfQU1JWCk6IENNUCAgPSBvbmVvZmYKICQoRkFURV9BTUlYKTogQ01QX1VOSVQgPSBmMzIKIAotRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNNVVgsIEFTWU5DVFMsIEZMViwgTkVMTFlNT1NFUiwgUENNX1MxNkxFKSArPSBmYXRlLWZpbHRlci1hc3luY3RzCi1mYXRlLWZpbHRlci1hc3luY3RzOiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9uZWxseW1vc2VyL25lbGx5bW9zZXItZGlzY29udC5mbHYKLWZhdGUtZmlsdGVyLWFzeW5jdHM6IENNRCA9IHBjbSAtYW5hbHl6ZWR1cmF0aW9uIDEwMDAwMDAwIC1pICQoU1JDKSAtYWYgYXN5bmN0cwotZmF0ZS1maWx0ZXItYXN5bmN0czogQ01QID0gb25lb2ZmCi1mYXRlLWZpbHRlci1hc3luY3RzOiBSRUYgPSAkKFNBTVBMRVMpL25lbGx5bW9zZXIvbmVsbHltb3Nlci1kaXNjb250LWFzeW5jLXYzLnBjbQotCi1GQVRFX0ZJTFRFUi0kKENPTkZJR19BUkVTQU1QTEVfRklMVEVSKSArPSBmYXRlLWZpbHRlci1hcmVzYW1wbGUKK0ZBVEVfQUZJTFRFUl9TQU1QTEVTLSQoQ09ORklHX0FSRVNBTVBMRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLWFyZXNhbXBsZQogZmF0ZS1maWx0ZXItYXJlc2FtcGxlOiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9uZWxseW1vc2VyL25lbGx5bW9zZXItZGlzY29udC5mbHYKIGZhdGUtZmlsdGVyLWFyZXNhbXBsZTogQ01EID0gcGNtIC1hbmFseXplZHVyYXRpb24gMTAwMDAwMDAgLWkgJChTUkMpIC1hZiBhcmVzYW1wbGU9bWluX2NvbXA9MC4wMDE6bWluX2hhcmRfY29tcD0wLjE6Zmlyc3RfcHRzPTAKIGZhdGUtZmlsdGVyLWFyZXNhbXBsZTogQ01QID0gb25lb2ZmCkBAIC01MCw3ICsyNDIsNyBAQAogJChGQVRFX0FUUklNKTogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMi53YXYKICQoRkFURV9BVFJJTSk6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CiAKLUZBVEVfRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEFUUklNLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9ICQoRkFURV9BVFJJTSkKK0ZBVEVfQUZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBBVFJJTSwgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSAkKEZBVEVfQVRSSU0pCiAKIEZBVEVfRklMVEVSX0NIQU5ORUxNQVAgKz0gZmF0ZS1maWx0ZXItY2hhbm5lbG1hcC1vbmUtaW50CiBmYXRlLWZpbHRlci1jaGFubmVsbWFwLW9uZS1pbnQ6IHRlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL2NoYW5uZWxtYXBfb25lX2ludApAQCAtNTgsNyArMjUwLDcgQEAKIGZhdGUtZmlsdGVyLWNoYW5uZWxtYXAtb25lLWludDogdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtNi53YXYKIGZhdGUtZmlsdGVyLWNoYW5uZWxtYXAtb25lLWludDogQ01EID0gbWQ1IC1pICQoU1JDKSAtZmlsdGVyX2NvbXBsZXhfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL2NoYW5uZWxtYXBfb25lX2ludCAtZiB3YXYgLWZmbGFncyArYml0ZXhhY3QKIGZhdGUtZmlsdGVyLWNoYW5uZWxtYXAtb25lLWludDogQ01QID0gb25lbGluZQotZmF0ZS1maWx0ZXItY2hhbm5lbG1hcC1vbmUtaW50OiBSRUYgPSA0MjhiOGY5ZmFjNmQ1NzE0NzA2OWI5NzMzNTAxOWVmNQorZmF0ZS1maWx0ZXItY2hhbm5lbG1hcC1vbmUtaW50OiBSRUYgPSA4Y2ZlNTUzZDY1ZWQ0Njk2NzU2ZDhjMWI4MjRmY2RkMwogCiBGQVRFX0ZJTFRFUl9DSEFOTkVMTUFQICs9IGZhdGUtZmlsdGVyLWNoYW5uZWxtYXAtb25lLXN0cgogZmF0ZS1maWx0ZXItY2hhbm5lbG1hcC1vbmUtc3RyOiB0ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9jaGFubmVsbWFwX29uZV9zdHIKQEAgLTY2LDcgKzI1OCw3IEBACiBmYXRlLWZpbHRlci1jaGFubmVsbWFwLW9uZS1zdHI6IHRlc3RzL2RhdGEvYXN5bnRoLTQ0MTAwLTIud2F2CiBmYXRlLWZpbHRlci1jaGFubmVsbWFwLW9uZS1zdHI6IENNRCA9IG1kNSAtaSAkKFNSQykgLWZpbHRlcl9jb21wbGV4X3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9jaGFubmVsbWFwX29uZV9zdHIgLWYgd2F2IC1mZmxhZ3MgK2JpdGV4YWN0CiBmYXRlLWZpbHRlci1jaGFubmVsbWFwLW9uZS1zdHI6IENNUCA9IG9uZWxpbmUKLWZhdGUtZmlsdGVyLWNoYW5uZWxtYXAtb25lLXN0cjogUkVGID0gZTc4ODg5MGRiNmExMWMyZmIyOWQ3YzQyMjkwNzJkNDkKK2ZhdGUtZmlsdGVyLWNoYW5uZWxtYXAtb25lLXN0cjogUkVGID0gMGVhMzA1MmU0ODJjOTVkNWQzYmQ5ZGE2ZGFjMWI1ZmEKIAogRkFURV9BRklMVEVSLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIENIQU5ORUxNQVAsIFdBViwgUENNX1MxNkxFLCBQQ01fUzE2TEUsIFdBVikgKz0gJChGQVRFX0ZJTFRFUl9DSEFOTkVMTUFQKQogCkBAIC05Miw5ICsyODQsOTYgQEAKIGZhdGUtZmlsdGVyLXZvbHVtZTogQ01QID0gb25lbGluZQogZmF0ZS1maWx0ZXItdm9sdW1lOiBSRUYgPSA0ZDZiYTc1ZWYzZTMyZDMwNWQwNjZiOWJjNzcxZDZmNAogCi1GQVRFX0FGSUxURVIteWVzICs9IGZhdGUtZmlsdGVyLWZvcm1hdHMKLWZhdGUtZmlsdGVyLWZvcm1hdHM6IGxpYmF2ZmlsdGVyL2Zvcm1hdHMtdGVzdCQoRVhFU1VGKQotZmF0ZS1maWx0ZXItZm9ybWF0czogQ01EID0gcnVuIGxpYmF2ZmlsdGVyL2Zvcm1hdHMtdGVzdAorIyBoZGNkLW1peC5mbGFjIGlzIGEgbWl4IG9mIHRocmVlIGRpZmZlcmVudCBzb3VyY2VzIHdoaWNoIGFyZSBpbnRlcmVzdGluZyBmb3IgdmFyaW91cyByZWFzb25zOgorIyBmaXJzdCA1IHNlY29uZHMgdXNlcyBwYWNrZXQgZm9ybWF0IEEgYW5kIG1heCBMTEUgb2YgLTcuMGRiCisjIHNlY29uZCA1IHNlY29uZHMgdXNlcyBwYWNrZXQgZm9ybWF0IEIgYW5kIGhhcyBhIGdhaW4gbWlzbWF0Y2ggYmV0d2VlbiBjaGFubmVscworIyBsYXN0IDEwIHNlY29uZHMgaXMgbm90IEhEQ0QgYnV0IGhhcyBhIGNvaW5jaWRlbnRhbCBIRENEIHBhY2tldCwgaXQgbmVlZHMgdG8gYmUgMTAgc2Vjb25kcyBiZWNhdXNlIGl0IGFsc28gdGVzdHMgdGhlIGNkdCBleHBpcmF0aW9uCitGQVRFX0FGSUxURVJfU0FNUExFUy0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBIRENELCBGTEFDLCBGTEFDLCBQQ01fUzI0TEUsIFBDTV9TMjRMRSkgKz0gZmF0ZS1maWx0ZXItaGRjZC1taXgKK2ZhdGUtZmlsdGVyLWhkY2QtbWl4OiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9maWx0ZXIvaGRjZC1taXguZmxhYworZmF0ZS1maWx0ZXItaGRjZC1taXg6IENNRCA9IG1kNSAtaSAkKFNSQykgLWFmIGhkY2QgLWYgczI0bGUKK2ZhdGUtZmlsdGVyLWhkY2QtbWl4OiBDTVAgPSBvbmVsaW5lCitmYXRlLWZpbHRlci1oZGNkLW1peDogUkVGID0gZTcwNzk5MTNlOTBjMTI0NDYwY2RiYzcxMmRmNWI4NGMKIAotRkFURV9TQU1QTEVTX0FWQ09OViArPSAkKEZBVEVfQUZJTFRFUi15ZXMpCi1mYXRlLWFmaWx0ZXI6ICQoRkFURV9BRklMVEVSLXllcykKKyMgb3V0cHV0IHdpbGwgYmUgZGlmZmVyZW50IGJlY2F1c2Ugb2YgdGhlIGdhaW4gbWlzbWF0Y2ggaW4gdGhlIHNlY29uZCBhbmQgdGhpcmQgcGFydHMKK0ZBVEVfQUZJTFRFUl9TQU1QTEVTLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEhEQ0QsIEZMQUMsIEZMQUMsIFBDTV9TMjRMRSwgUENNX1MyNExFKSArPSBmYXRlLWZpbHRlci1oZGNkLW1peC1wc29mZgorZmF0ZS1maWx0ZXItaGRjZC1taXgtcHNvZmY6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9oZGNkLW1peC5mbGFjCitmYXRlLWZpbHRlci1oZGNkLW1peC1wc29mZjogQ01EID0gbWQ1IC1pICQoU1JDKSAtYWYgaGRjZD1wcm9jZXNzX3N0ZXJlbz1mYWxzZSAtZiBzMjRsZQorZmF0ZS1maWx0ZXItaGRjZC1taXgtcHNvZmY6IENNUCA9IG9uZWxpbmUKK2ZhdGUtZmlsdGVyLWhkY2QtbWl4LXBzb2ZmOiBSRUYgPSBiZDBlODFmZTE3Njk2YjgyNWVlMzUxNWFiOTI4ZTZiYgorCisjIHRlc3QgdGhlIGRpZmZlcmVudCBhbmFseXplIG1vZGVzCitGQVRFX0FGSUxURVJfU0FNUExFUy0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBIRENELCBGTEFDLCBGTEFDLCBQQ01fUzI0TEUsIFBDTV9TMjRMRSkgKz0gZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLXBlCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtcGU6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9oZGNkLW1peC5mbGFjCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtcGU6IENNRCA9IG1kNSAtaSAkKFNSQykgLWFmIGhkY2Q9YW5hbHl6ZV9tb2RlPXBlIC1mIHMyNGxlCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtcGU6IENNUCA9IG9uZWxpbmUKK2ZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1wZTogUkVGID0gYmI4M2U5N2JiZDAwNjRiOWIxYzBlZjJmMmM4ZjBjNzcKK0ZBVEVfQUZJTFRFUl9TQU1QTEVTLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEhEQ0QsIEZMQUMsIEZMQUMsIFBDTV9TMjRMRSwgUENNX1MyNExFKSArPSBmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtbGxlCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtbGxlOiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9maWx0ZXIvaGRjZC1taXguZmxhYworZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLWxsZTogQ01EID0gbWQ1IC1pICQoU1JDKSAtYWYgaGRjZD1hbmFseXplX21vZGU9bGxlIC1mIHMyNGxlCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtbGxlOiBDTVAgPSBvbmVsaW5lCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtbGxlOiBSRUYgPSAxMjFjYzRhNjgxYWEwY2FlZjVjNjY0ZmVjZTdhM2RkYworRkFURV9BRklMVEVSX1NBTVBMRVMtJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgSERDRCwgRkxBQywgRkxBQywgUENNX1MyNExFLCBQQ01fUzI0TEUpICs9IGZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1jZHQKK2ZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1jZHQ6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9oZGNkLW1peC5mbGFjCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtY2R0OiBDTUQgPSBtZDUgLWkgJChTUkMpIC1hZiBoZGNkPWFuYWx5emVfbW9kZT1jZHQgLWYgczI0bGUKK2ZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1jZHQ6IENNUCA9IG9uZWxpbmUKK2ZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1jZHQ6IFJFRiA9IDEyMTM2ZTZhMDBkZDUzMjk5NGY2ZWRjYzM0N2FmMWQ0CitGQVRFX0FGSUxURVJfU0FNUExFUy0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBIRENELCBGTEFDLCBGTEFDLCBQQ01fUzI0TEUsIFBDTV9TMjRMRSkgKz0gZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLXRnbQorZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLXRnbTogU1JDID0gJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL2hkY2QtbWl4LmZsYWMKK2ZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS10Z206IENNRCA9IG1kNSAtaSAkKFNSQykgLWFmIGhkY2Q9YW5hbHl6ZV9tb2RlPXRnbSAtZiBzMjRsZQorZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLXRnbTogQ01QID0gb25lbGluZQorZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLXRnbTogUkVGID0gYTNjMzlmNjJlOWI5YjQyYzljNDQwZDAwNDVkNWZiMmYKKyMgdGhlIHR3byBhZGRpdGlvbmFsIGFuYWx5emUgbW9kZXMgZnJvbSBsaWJoZGNkCitGQVRFX0FGSUxURVJfU0FNUExFUy0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBIRENELCBGTEFDLCBGTEFDLCBQQ01fUzI0TEUsIFBDTV9TMjRMRSkgKz0gZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLWx0Z20KK2ZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1sdGdtOiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9maWx0ZXIvaGRjZC1taXguZmxhYworZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLWx0Z206IENNRCA9IG1kNSAtaSAkKFNSQykgLWFmIGhkY2Q9YW5hbHl6ZV9tb2RlPWxsZTpwcm9jZXNzX3N0ZXJlbz1mYWxzZSAtZiBzMjRsZQorZmF0ZS1maWx0ZXItaGRjZC1hbmFseXplLWx0Z206IENNUCA9IG9uZWxpbmUKK2ZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1sdGdtOiBSRUYgPSA3NmZmZDg2Yjc2MmI1YTkzMzMyMDM5ZjI3ZTRjMGMwZQorRkFURV9BRklMVEVSX1NBTVBMRVMtJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgSERDRCwgRkxBQywgRkxBQywgUENNX1MyNExFLCBQQ01fUzI0TEUpICs9IGZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1wZWwKK2ZhdGUtZmlsdGVyLWhkY2QtYW5hbHl6ZS1wZWw6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9oZGNkLW1peC5mbGFjCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtcGVsOiBDTUQgPSBtZDUgLWkgJChTUkMpIC1hZiBoZGNkPWFuYWx5emVfbW9kZT1wZTpmb3JjZV9wZT10cnVlIC1mIHMyNGxlCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtcGVsOiBDTVAgPSBvbmVsaW5lCitmYXRlLWZpbHRlci1oZGNkLWFuYWx5emUtcGVsOiBSRUYgPSA4MTU2YzVhMzY1OGQ3ODlhYjQ2NDQ3ZDYyMTUxZjVlOQorCitGQVRFX0FGSUxURVJfU0FNUExFUy0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBIRENELCBGTEFDLCBGTEFDLCBQQ01fUzI0TEUsIFBDTV9TMjRMRSkgKz0gZmF0ZS1maWx0ZXItaGRjZC1mYWxzZS1wb3NpdGl2ZQorZmF0ZS1maWx0ZXItaGRjZC1mYWxzZS1wb3NpdGl2ZTogU1JDID0gJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL2hkY2QtZmFsc2UtcG9zaXRpdmUuZmxhYworZmF0ZS1maWx0ZXItaGRjZC1mYWxzZS1wb3NpdGl2ZTogQ01EID0gbWQ1IC1pICQoU1JDKSAtYWYgaGRjZCAtZiBzMjRsZQorZmF0ZS1maWx0ZXItaGRjZC1mYWxzZS1wb3NpdGl2ZTogQ01QID0gZ3JlcAorZmF0ZS1maWx0ZXItaGRjZC1mYWxzZS1wb3NpdGl2ZTogUkVGID0gSERDRCBkZXRlY3RlZDogbm8KKworRkFURV9BRklMVEVSX1NBTVBMRVMtJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgSERDRCwgRkxBQywgRkxBQywgUENNX1MyNExFLCBQQ01fUzI0TEUpICs9IGZhdGUtZmlsdGVyLWhkY2QtZGV0ZWN0LWVycm9ycworZmF0ZS1maWx0ZXItaGRjZC1kZXRlY3QtZXJyb3JzOiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9maWx0ZXIvaGRjZC1lbmNvZGluZy1lcnJvcnMuZmxhYworZmF0ZS1maWx0ZXItaGRjZC1kZXRlY3QtZXJyb3JzOiBDTUQgPSBtZDUgLWkgJChTUkMpIC1hZiBoZGNkIC1mIHMyNGxlCitmYXRlLWZpbHRlci1oZGNkLWRldGVjdC1lcnJvcnM6IENNUCA9IGdyZXAKK2ZhdGUtZmlsdGVyLWhkY2QtZGV0ZWN0LWVycm9yczogUkVGID0gZGV0ZWN0YWJsZSBlcnJvcnM6IFsxLTldCisKKyMgMjBiaXQgSERDRAorRkFURV9BRklMVEVSX1NBTVBMRVMtJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgSERDRCwgRkxBQywgRkxBQywgUENNX1MzMkxFLCBQQ01fUzMyTEUpICs9IGZhdGUtZmlsdGVyLWhkY2QtMjBiaXQKK2ZhdGUtZmlsdGVyLWhkY2QtMjBiaXQ6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9oZGNkLWZha2UyMGJpdC5mbGFjCitmYXRlLWZpbHRlci1oZGNkLTIwYml0OiBDTUQgPSBtZDUgLWkgJChTUkMpIC1hZiBoZGNkPWJpdHNfcGVyX3NhbXBsZT0yMCAtZiBzMzJsZQorZmF0ZS1maWx0ZXItaGRjZC0yMGJpdDogQ01QID0gb25lbGluZQorZmF0ZS1maWx0ZXItaGRjZC0yMGJpdDogUkVGID0gMzY1ZGVkODgzYTRhOTI0ODNiMTViNjliYWJjODEzOTAKKworIyBub24taGRjZCB0ZXN0cyBvZiBkaWZmZXJlbnQgaW5wdXQgZm9ybWF0cyBmb3IgY29kZSBjb3ZlcmFnZQorRkFURV9BRklMVEVSX1NBTVBMRVMtJChjYWxsIEZJTFRFUkRFTURFQ0VOQ01VWCwgSERDRCwgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMjRMRSwgUENNX1MyNExFKSArPSBmYXRlLWZpbHRlci1oZGNkLW1vbm8KK2ZhdGUtZmlsdGVyLWhkY2QtbW9ubzogU1JDID0gJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc180NDEwMF9tb25vLndhdgorZmF0ZS1maWx0ZXItaGRjZC1tb25vOiBDTUQgPSBtZDUgLWkgJChTUkMpIC1hZiBoZGNkIC1mIHMyNGxlCitmYXRlLWZpbHRlci1oZGNkLW1vbm86IENNUCA9IG9uZWxpbmUKK2ZhdGUtZmlsdGVyLWhkY2QtbW9ubzogUkVGID0gZjUxYjExNGIyMDcyOGU2YTQ2M2E5NDkxYzY0M2QxNjYKK0ZBVEVfQUZJTFRFUl9TQU1QTEVTLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEhEQ0QsIFdWLCBXQVZQQUNLLCBQQ01fUzMyTEUsIFBDTV9TMzJMRSkgKz0gZmF0ZS1maWx0ZXItaGRjZC1zMTZwCitmYXRlLWZpbHRlci1oZGNkLXMxNnA6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL3dhdnBhY2svbG9zc2xlc3MvMTZiaXQtcGFydGlhbC53dgorZmF0ZS1maWx0ZXItaGRjZC1zMTZwOiBDTUQgPSBtZDUgLWkgJChTUkMpIC1hZiBoZGNkIC1mIHMzMmxlCitmYXRlLWZpbHRlci1oZGNkLXMxNnA6IENNUCA9IG9uZWxpbmUKK2ZhdGUtZmlsdGVyLWhkY2QtczE2cDogUkVGID0gNGU3NjdmNDM2Yjg5MWFjNTk4MTBhOGIyYjFkN2U5NmIKK0ZBVEVfQUZJTFRFUl9TQU1QTEVTLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEhEQ0QsIFdWLCBXQVZQQUNLLCBQQ01fUzMyTEUsIFBDTV9TMzJMRSkgKz0gZmF0ZS1maWx0ZXItaGRjZC1zMzJwCitmYXRlLWZpbHRlci1oZGNkLXMzMnA6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL3dhdnBhY2svbG9zc2xlc3MvMjRiaXQtcGFydGlhbC53dgorZmF0ZS1maWx0ZXItaGRjZC1zMzJwOiBDTUQgPSBtZDUgLWkgJChTUkMpIC1hZiBoZGNkIC1mIHMzMmxlCitmYXRlLWZpbHRlci1oZGNkLXMzMnA6IENNUCA9IG9uZWxpbmUKK2ZhdGUtZmlsdGVyLWhkY2QtczMycDogUkVGID0gMGM1NTEzZTgzZWVkYWExMGFiNmZhYzlkZGMxNzNjZjUKKworRkFURV9BRklMVEVSLXllcyArPSBmYXRlLWZpbHRlci1mb3JtYXRzCitmYXRlLWZpbHRlci1mb3JtYXRzOiBsaWJhdmZpbHRlci90ZXN0cy9mb3JtYXRzJChFWEVTVUYpCitmYXRlLWZpbHRlci1mb3JtYXRzOiBDTUQgPSBydW4gbGliYXZmaWx0ZXIvdGVzdHMvZm9ybWF0cworCitGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9BRklMVEVSX1NBTVBMRVMteWVzKQorRkFURV9GRk1QRUcgKz0gJChGQVRFX0FGSUxURVIteWVzKQorZmF0ZS1hZmlsdGVyOiAkKEZBVEVfQUZJTFRFUi15ZXMpICQoRkFURV9BRklMVEVSX1NBTVBMRVMteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9maWx0ZXItdmlkZW8ubWFrIGIvdGVzdHMvZmF0ZS9maWx0ZXItdmlkZW8ubWFrCmluZGV4IDQxODY5OTYuLjBhOWJmOTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvZmlsdGVyLXZpZGVvLm1haworKysgYi90ZXN0cy9mYXRlL2ZpbHRlci12aWRlby5tYWsKQEAgLTEsNDAgKzEsNDcgQEAKLUZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIFBFUk1TX0ZJTFRFUiBERUxPR09fRklMVEVSIFJNX0RFTVVYRVIgUlYzMF9ERUNPREVSKSArPSBmYXRlLWZpbHRlci1kZWxvZ28KK0ZBVEVfRklMVEVSX1NBTVBMRVMtJChjYWxsIEFMTFlFUywgU01KUEVHX0RFTVVYRVIgTUpQRUdfREVDT0RFUiBQRVJNU19GSUxURVIgT1dERU5PSVNFX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItb3dkZW5vaXNlLXNhbXBsZQorZmF0ZS1maWx0ZXItb3dkZW5vaXNlLXNhbXBsZTogQ01EID0gZmZtcGVnIC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9zbWpwZWcvc2Nlbndpbi5tanBnIC12ZiAidHJpbT1kdXJhdGlvbj0wLjUscGVybXM9cmFuZG9tLG93ZGVub2lzZT0xMDoyMDoyMDplbmFibGU9bm90KGJldHdlZW4odFwsMC4yXCwxLjIpKSIgLWFuIC1mIHJhd3ZpZGVvIC0KK2ZhdGUtZmlsdGVyLW93ZGVub2lzZS1zYW1wbGU6IFJFRiA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci1yZWZlcmVuY2Uvb3dkZW5vaXNlLXNjZW53aW4ucmF3CitmYXRlLWZpbHRlci1vd2Rlbm9pc2Utc2FtcGxlOiBDTVBfVEFSR0VUID0gMQorZmF0ZS1maWx0ZXItb3dkZW5vaXNlLXNhbXBsZTogRlVaWiA9IDM1MzkKK2ZhdGUtZmlsdGVyLW93ZGVub2lzZS1zYW1wbGU6IENNUCA9IG9uZW9mZgorCitGQVRFX0ZJTFRFUl9TQU1QTEVTLSQoY2FsbCBBTExZRVMsIFBFUk1TX0ZJTFRFUiBERUxPR09fRklMVEVSIFJNX0RFTVVYRVIgUlYzMF9ERUNPREVSKSArPSBmYXRlLWZpbHRlci1kZWxvZ28KIGZhdGUtZmlsdGVyLWRlbG9nbzogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcmVhbC9ydjMwLnJtIC12ZiBwZXJtcz1yYW5kb20sZGVsb2dvPXNob3c9MDp4PTI5MDp5PTI1Onc9MjY6aD0xNiAtYW4KIAogRkFURV9ZQURJRiArPSBmYXRlLWZpbHRlci15YWRpZi1tb2RlMAotZmF0ZS1maWx0ZXIteWFkaWYtbW9kZTA6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLXZmcmFtZXMgMzAgLXZmIHlhZGlmPTAKK2ZhdGUtZmlsdGVyLXlhZGlmLW1vZGUwOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL21wZWcyX2ZpZWxkX2VuY29kaW5nLnRzIC1mcmFtZXM6diAzMCAtdmYgeWFkaWY9MAogCiBGQVRFX1lBRElGICs9IGZhdGUtZmlsdGVyLXlhZGlmLW1vZGUxCi1mYXRlLWZpbHRlci15YWRpZi1tb2RlMTogQ01EID0gZnJhbWVjcmMgLWZsYWdzIGJpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcGVnMi9tcGVnMl9maWVsZF9lbmNvZGluZy50cyAtdmZyYW1lcyA1OSAtdmYgeWFkaWY9MQorZmF0ZS1maWx0ZXIteWFkaWYtbW9kZTE6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLWZyYW1lczp2IDU5IC12ZiB5YWRpZj0xCiAKIEZBVEVfWUFESUYgKz0gZmF0ZS1maWx0ZXIteWFkaWYxMAotZmF0ZS1maWx0ZXIteWFkaWYxMDogQ01EID0gZnJhbWVjcmMgLWZsYWdzIGJpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcGVnMi9tcGVnMl9maWVsZF9lbmNvZGluZy50cyAtZmxhZ3MgYml0ZXhhY3QgLXBpeF9mbXQgeXV2NDIwcDEwbGUgLXZmcmFtZXMgMzAgLXZmIHlhZGlmPTAKK2ZhdGUtZmlsdGVyLXlhZGlmMTA6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLWZsYWdzIGJpdGV4YWN0IC1waXhfZm10IHl1djQyMHAxMGxlIC1mcmFtZXM6diAzMCAtdmYgeWFkaWY9MAogCiBGQVRFX1lBRElGICs9IGZhdGUtZmlsdGVyLXlhZGlmMTYKLWZhdGUtZmlsdGVyLXlhZGlmMTY6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLWZsYWdzIGJpdGV4YWN0IC1waXhfZm10IHl1djQyMHAxNmxlIC12ZnJhbWVzIDMwIC12ZiB5YWRpZj0wCitmYXRlLWZpbHRlci15YWRpZjE2OiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL21wZWcyX2ZpZWxkX2VuY29kaW5nLnRzIC1mbGFncyBiaXRleGFjdCAtcGl4X2ZtdCB5dXY0MjBwMTZsZSAtZnJhbWVzOnYgMzAgLXZmIHlhZGlmPTAKIAotRkFURV9GSUxURVItJChjYWxsIEZJTFRFUkRFTURFQywgWUFESUYsIE1QRUdUUywgTVBFRzJWSURFTykgKz0gJChGQVRFX1lBRElGKQorRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgRklMVEVSREVNREVDLCBZQURJRiwgTVBFR1RTLCBNUEVHMlZJREVPKSArPSAkKEZBVEVfWUFESUYpCiAKIEZBVEVfVzNGRElGICs9IGZhdGUtZmlsdGVyLXczZmRpZi1zaW1wbGUKLWZhdGUtZmlsdGVyLXczZmRpZi1zaW1wbGU6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLXZmcmFtZXMgMzAgLXZmIHczZmRpZj0wCitmYXRlLWZpbHRlci13M2ZkaWYtc2ltcGxlOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL21wZWcyX2ZpZWxkX2VuY29kaW5nLnRzIC1mcmFtZXM6diAzMCAtdmYgdzNmZGlmPTAKIAogRkFURV9XM0ZESUYgKz0gZmF0ZS1maWx0ZXItdzNmZGlmLWNvbXBsZXgKLWZhdGUtZmlsdGVyLXczZmRpZi1jb21wbGV4OiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL21wZWcyX2ZpZWxkX2VuY29kaW5nLnRzIC12ZnJhbWVzIDMwIC12ZiB3M2ZkaWY9MQorZmF0ZS1maWx0ZXItdzNmZGlmLWNvbXBsZXg6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLWZyYW1lczp2IDMwIC12ZiB3M2ZkaWY9MQogCi1GQVRFX0ZJTFRFUi0kKGNhbGwgRklMVEVSREVNREVDLCBXM0ZESUYsIE1QRUdUUywgTVBFRzJWSURFTykgKz0gJChGQVRFX1czRkRJRikKK0ZBVEVfRklMVEVSX1NBTVBMRVMtJChjYWxsIEZJTFRFUkRFTURFQywgVzNGRElGLCBNUEVHVFMsIE1QRUcyVklERU8pICs9ICQoRkFURV9XM0ZESUYpCiAKIEZBVEVfTUNERUlOVCArPSBmYXRlLWZpbHRlci1tY2RlaW50LWZhc3QKLWZhdGUtZmlsdGVyLW1jZGVpbnQtZmFzdDogQ01EID0gZnJhbWVjcmMgLWZsYWdzIGJpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcGVnMi9tcGVnMl9maWVsZF9lbmNvZGluZy50cyAtdmZyYW1lcyAzMCAtdmYgbWNkZWludD1mYXN0CitmYXRlLWZpbHRlci1tY2RlaW50LWZhc3Q6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLWZyYW1lczp2IDMwIC12ZiBtY2RlaW50PWZhc3QKIAogRkFURV9NQ0RFSU5UICs9IGZhdGUtZmlsdGVyLW1jZGVpbnQtbWVkaXVtCi1mYXRlLWZpbHRlci1tY2RlaW50LW1lZGl1bTogQ01EID0gZnJhbWVjcmMgLWZsYWdzIGJpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcGVnMi9tcGVnMl9maWVsZF9lbmNvZGluZy50cyAtdmZyYW1lcyAzMCAtdmYgbWNkZWludD1tb2RlPW1lZGl1bQorZmF0ZS1maWx0ZXItbWNkZWludC1tZWRpdW06IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLWZyYW1lczp2IDMwIC12ZiBtY2RlaW50PW1vZGU9bWVkaXVtCiAKLUZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIE1DREVJTlRfRklMVEVSLCBNUEVHVFNfREVNVVhFUiwgTVBFRzJWSURFT19ERUNPREVSIFNOT1dfRU5DT0RFUikgKz0gJChGQVRFX01DREVJTlQpCitGQVRFX0ZJTFRFUl9TQU1QTEVTLSQoY2FsbCBBTExZRVMsIE1DREVJTlRfRklMVEVSLCBNUEVHVFNfREVNVVhFUiwgTVBFRzJWSURFT19ERUNPREVSIFNOT1dfRU5DT0RFUikgKz0gJChGQVRFX01DREVJTlQpCiAKLUZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIENPREVDVklFV19GSUxURVIgUk1fREVNVVhFUiBSVjQwX0RFQ09ERVIpICs9IGZhdGUtZmlsdGVyLWNvZGVjdmlldy1tdnMKLWZhdGUtZmlsdGVyLWNvZGVjdmlldy1tdnM6IENNRCA9IGZyYW1lY3JjIC1mbGFnczIgK2V4cG9ydF9tdnMgLWkgJChUQVJHRVRfU0FNUExFUykvcmVhbC9zcHlnYW1lcy0yTUIucm12YiAtdmYgY29kZWN2aWV3PW12PXBmK2JmK2JiIC12ZnJhbWVzIDYwIC1hbgorRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgQUxMWUVTLCBDT0RFQ1ZJRVdfRklMVEVSIFJNX0RFTVVYRVIgUlY0MF9ERUNPREVSKSArPSBmYXRlLWZpbHRlci1jb2RlY3ZpZXctbXZzCitmYXRlLWZpbHRlci1jb2RlY3ZpZXctbXZzOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MyICtleHBvcnRfbXZzIC1pICQoVEFSR0VUX1NBTVBMRVMpL3JlYWwvc3B5Z2FtZXMtMk1CLnJtdmIgLXZmIGNvZGVjdmlldz1tdj1wZitiZitiYiAtZnJhbWVzOnYgNjAgLWFuCiAKLUZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIFNIT1dQQUxFVFRFX0ZJTFRFUiBGTElDX0RFTVVYRVIgRkxJQ19ERUNPREVSKSArPSBmYXRlLWZpbHRlci1zaG93cGFsZXR0ZQorRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgQUxMWUVTLCBTSE9XUEFMRVRURV9GSUxURVIgRkxJQ19ERU1VWEVSIEZMSUNfREVDT0RFUikgKz0gZmF0ZS1maWx0ZXItc2hvd3BhbGV0dGUKIGZhdGUtZmlsdGVyLXNob3dwYWxldHRlOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9mbGkvZmxpLWVuZ2luZXMuZmxpIC12ZiBzaG93cGFsZXR0ZT0zIC1waXhfZm10IGJncmEKIAogRkFURV9GSUxURVJfUEFMRVRURUdFTiArPSBmYXRlLWZpbHRlci1wYWxldHRlZ2VuLTEKQEAgLTQ0LDcgKzUxLDcgQEAKIGZhdGUtZmlsdGVyLXBhbGV0dGVnZW4tMjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL2FuaW0ubWt2IC12ZiBwYWxldHRlZ2VuPW1heF9jb2xvcnM9MTI4OnJlc2VydmVfdHJhbnNwYXJlbnQ9MDpzdGF0c19tb2RlPWRpZmYgLXBpeF9mbXQgYmdyYQogCiBmYXRlLWZpbHRlci1wYWxldHRlZ2VuOiAkKEZBVEVfRklMVEVSX1BBTEVUVEVHRU4pCi1GQVRFX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCBQQUxFVFRFR0VOX0ZJTFRFUiBNQVRST1NLQV9ERU1VWEVSIEgyNjRfREVDT0RFUikgKz0gJChGQVRFX0ZJTFRFUl9QQUxFVFRFR0VOKQorRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgQUxMWUVTLCBQQUxFVFRFR0VOX0ZJTFRFUiBNQVRST1NLQV9ERU1VWEVSIEgyNjRfREVDT0RFUikgKz0gJChGQVRFX0ZJTFRFUl9QQUxFVFRFR0VOKQogCiBGQVRFX0ZJTFRFUl9QQUxFVFRFVVNFICs9IGZhdGUtZmlsdGVyLXBhbGV0dGV1c2Utbm9kaXRoZXIKIGZhdGUtZmlsdGVyLXBhbGV0dGV1c2Utbm9kaXRoZXI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9hbmltLm1rdiAtaSAkKFRBUkdFVF9TQU1QTEVTKS9maWx0ZXIvYW5pbS1wYWxldHRlLnBuZyAtbGF2ZmkgcGFsZXR0ZXVzZT1ub25lIC1waXhfZm10IGJncmEKQEAgLTU2LDkgKzYzLDcgQEAKIGZhdGUtZmlsdGVyLXBhbGV0dGV1c2Utc2llcnJhMl80YTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL2FuaW0ubWt2IC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9hbmltLXBhbGV0dGUucG5nIC1sYXZmaSBwYWxldHRldXNlPXNpZXJyYTJfNGE6ZGlmZl9tb2RlPXJlY3RhbmdsZSAtcGl4X2ZtdCBiZ3JhCiAKIGZhdGUtZmlsdGVyLXBhbGV0dGV1c2U6ICQoRkFURV9GSUxURVJfUEFMRVRURVVTRSkKLUZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIFBBTEVUVEVVU0VfRklMVEVSIE1BVFJPU0tBX0RFTVVYRVIgSDI2NF9ERUNPREVSIElNQUdFMl9ERU1VWEVSIFBOR19ERUNPREVSKSArPSAkKEZBVEVfRklMVEVSX1BBTEVUVEVVU0UpCi0KLUZBVEVfU0FNUExFU19BVkNPTlYgKz0gJChGQVRFX0ZJTFRFUi15ZXMpCitGQVRFX0ZJTFRFUl9TQU1QTEVTLSQoY2FsbCBBTExZRVMsIFBBTEVUVEVVU0VfRklMVEVSIE1BVFJPU0tBX0RFTVVYRVIgSDI2NF9ERUNPREVSIElNQUdFMl9ERU1VWEVSIFBOR19ERUNPREVSKSArPSAkKEZBVEVfRklMVEVSX1BBTEVUVEVVU0UpCiAKIEZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIEFWREVWSUNFIExJRkVfRklMVEVSKSArPSBmYXRlLWZpbHRlci1sYXZkLWxpZmUKIGZhdGUtZmlsdGVyLWxhdmQtbGlmZTogQ01EID0gZnJhbWVjcmMgLWYgbGF2ZmkgLWkgbGlmZT1zPTQweDQwOnI9NTpzZWVkPTQyOm1vbGQ9NjQ6cmF0aW89MC4xOmRlYXRoX2NvbG9yPXJlZDpsaWZlX2NvbG9yPWdyZWVuIC10IDIKQEAgLTc1LDEwICs4MCw0MSBAQAogRkFURV9GSUxURVItJChjYWxsIEFMTFlFUywgVEVTVFNSQzJfRklMVEVSKSArPSBmYXRlLWZpbHRlci10ZXN0c3JjMi1yZ2IyNAogZmF0ZS1maWx0ZXItdGVzdHNyYzItcmdiMjQ6IENNRCA9IGZyYW1lY3JjIC1sYXZmaSB0ZXN0c3JjMj1yPTc6ZD0xMCAtcGl4X2ZtdCByZ2IyNAogCitGQVRFX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCBMQVZGSV9JTkRFViBURVNUU1JDMl9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXRlc3RzcmMyLXJnYmEKK2ZhdGUtZmlsdGVyLXRlc3RzcmMyLXJnYmE6IENNRCA9IGZyYW1lY3JjIC1sYXZmaSB0ZXN0c3JjMj1yPTc6ZD0xMCAtcGl4X2ZtdCByZ2JhCisKK0ZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIExBVkZJX0lOREVWIEFMTFJHQl9GSUxURVIpICs9IGZhdGUtZmlsdGVyLWFsbHJnYgorZmF0ZS1maWx0ZXItYWxscmdiOiBDTUQgPSBmcmFtZWNyYyAtbGF2ZmkgYWxscmdiPXJhdGU9NTpkdXJhdGlvbj0xIC1waXhfZm10IHJnYjI0CisKK0ZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIExBVkZJX0lOREVWIEFMTFlVVl9GSUxURVIpICs9IGZhdGUtZmlsdGVyLWFsbHl1dgorZmF0ZS1maWx0ZXItYWxseXV2OiBDTUQgPSBmcmFtZWNyYyAtbGF2ZmkgYWxseXV2PXJhdGU9NTpkdXJhdGlvbj0xIC1waXhfZm10IHl1djQ0NHAKKworRkFURV9GSUxURVItJChjYWxsIEFMTFlFUywgTEFWRklfSU5ERVYgUkdCVEVTVFNSQ19GSUxURVIpICs9IGZhdGUtZmlsdGVyLXJnYnRlc3RzcmMKK2ZhdGUtZmlsdGVyLXJnYnRlc3RzcmM6IENNRCA9IGZyYW1lY3JjIC1sYXZmaSByZ2J0ZXN0c3JjPXJhdGU9NTpkdXJhdGlvbj0xIC1waXhfZm10IHJnYjI0CisKK0ZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIExBVkZJX0lOREVWIFNNUFRFQkFSU19GSUxURVIpICs9IGZhdGUtZmlsdGVyLXNtcHRlYmFycworZmF0ZS1maWx0ZXItc21wdGViYXJzOiBDTUQgPSBmcmFtZWNyYyAtbGF2Zmkgc21wdGViYXJzPXJhdGU9NTpkdXJhdGlvbj0xIC1waXhfZm10IHl1djQyMHAKKworRkFURV9GSUxURVItJChjYWxsIEFMTFlFUywgTEFWRklfSU5ERVYgU01QVEVIREJBUlNfRklMVEVSKSArPSBmYXRlLWZpbHRlci1zbXB0ZWhkYmFycworZmF0ZS1maWx0ZXItc21wdGVoZGJhcnM6IENNRCA9IGZyYW1lY3JjIC1sYXZmaSBzbXB0ZWhkYmFycz1yYXRlPTU6ZHVyYXRpb249MSAtcGl4X2ZtdCB5dXY0NDRwCisKK0ZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIExBVkZJX0lOREVWIFlVVlRFU1RTUkNfRklMVEVSKSArPSBmYXRlLWZpbHRlci15dXZ0ZXN0c3JjLXl1djQ0NHAKK2ZhdGUtZmlsdGVyLXl1dnRlc3RzcmMteXV2NDQ0cDogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHl1dnRlc3RzcmM9cmF0ZT01OmR1cmF0aW9uPTEgLXBpeF9mbXQgeXV2NDQ0cAorCitGQVRFX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCBMQVZGSV9JTkRFViBZVVZURVNUU1JDX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXIteXV2dGVzdHNyYy15dXY0NDRwMTIKK2ZhdGUtZmlsdGVyLXl1dnRlc3RzcmMteXV2NDQ0cDEyOiBDTUQgPSBmcmFtZWNyYyAtbGF2ZmkgeXV2dGVzdHNyYz1yYXRlPTU6ZHVyYXRpb249MSxmb3JtYXQ9eXV2NDQ0cDEyIC1waXhfZm10IHl1djQ0NHAxMmxlCisKIEZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIEFWREVWSUNFIFRFU1RTUkNfRklMVEVSIEZPUk1BVF9GSUxURVIgQ09OQ0FUX0ZJTFRFUiBTQ0FMRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLWxhdmQtc2NhbGVub3JtCiBmYXRlLWZpbHRlci1sYXZkLXNjYWxlbm9ybTogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvc2NhbGVub3JtCiBmYXRlLWZpbHRlci1sYXZkLXNjYWxlbm9ybTogQ01EID0gZnJhbWVjcmMgLWYgbGF2ZmkgLWdyYXBoX2ZpbGUgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvc2NhbGVub3JtIC1pIGR1bW15CiAKK0ZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIEZSQU1FUkFURV9GSUxURVIgVEVTVFNSQzJfRklMVEVSKSArPSBmYXRlLWZpbHRlci1mcmFtZXJhdGUtdXAgZmF0ZS1maWx0ZXItZnJhbWVyYXRlLWRvd24KK2ZhdGUtZmlsdGVyLWZyYW1lcmF0ZS11cDogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHRlc3RzcmMyPXI9MjpkPTEwLGZyYW1lcmF0ZT1mcHM9MTAgLXQgMQorZmF0ZS1maWx0ZXItZnJhbWVyYXRlLWRvd246IENNRCA9IGZyYW1lY3JjIC1sYXZmaSB0ZXN0c3JjMj1yPTI6ZD0xMCxmcmFtZXJhdGU9ZnBzPTEgLXQgMQorCitGQVRFX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCBGUkFNRVJBVEVfRklMVEVSIFRFU1RTUkMyX0ZJTFRFUiBGT1JNQVRfRklMVEVSKSArPSBmYXRlLWZpbHRlci1mcmFtZXJhdGUtMTJiaXQtdXAgZmF0ZS1maWx0ZXItZnJhbWVyYXRlLTEyYml0LWRvd24KK2ZhdGUtZmlsdGVyLWZyYW1lcmF0ZS0xMmJpdC11cDogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHRlc3RzcmMyPXI9NTA6ZD0xLGZvcm1hdD1waXhfZm10cz15dXY0MjJwMTJsZSxmcmFtZXJhdGU9ZnBzPTYwIC10IDEgLXBpeF9mbXQgeXV2NDIycDEybGUKK2ZhdGUtZmlsdGVyLWZyYW1lcmF0ZS0xMmJpdC1kb3duOiBDTUQgPSBmcmFtZWNyYyAtbGF2ZmkgdGVzdHNyYzI9cj02MDpkPTEsZm9ybWF0PXBpeF9mbXRzPXl1djQyMnAxMmxlLGZyYW1lcmF0ZT1mcHM9NTAgLXQgMSAtcGl4X2ZtdCB5dXY0MjJwMTJsZQogCiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfQk9YQkxVUl9GSUxURVIpICs9IGZhdGUtZmlsdGVyLWJveGJsdXIKIGZhdGUtZmlsdGVyLWJveGJsdXI6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmYgYm94Ymx1cj0yOjEKQEAgLTExNCw2ICsxNTAsOSBAQAogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX0lOVEVSTEFDRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLWludGVybGFjZQogZmF0ZS1maWx0ZXItaW50ZXJsYWNlOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmIGludGVybGFjZQogCitGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfSU5URVJMQUNFX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItaW50ZXJsYWNlLWNvbXBsZXgKK2ZhdGUtZmlsdGVyLWludGVybGFjZS1jb21wbGV4OiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmIGludGVybGFjZT1sb3dwYXNzPWNvbXBsZXgKKwogRkFURV9GSUxURVJfVlNZTlRILSQoY2FsbCBBTExZRVMsIE5FR0FURV9GSUxURVIgUEVSTVNfRklMVEVSKSArPSBmYXRlLWZpbHRlci1uZWdhdGUKIGZhdGUtZmlsdGVyLW5lZ2F0ZTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiBwZXJtcz1yYW5kb20sbmVnYXRlCiAKQEAgLTEzMywyNyArMTcyLDM1IEBACiBmYXRlLWZpbHRlci13YXZlZm9ybV91djogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiB3YXZlZm9ybT1jPTYgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QKIAogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1ZFQ1RPUlNDT1BFX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItdmVjdG9yc2NvcGVfZ3JheQotZmF0ZS1maWx0ZXItdmVjdG9yc2NvcGVfZ3JheTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiB2ZWN0b3JzY29wZT1ncmF5IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmZyYW1lcyAzCitmYXRlLWZpbHRlci12ZWN0b3JzY29wZV9ncmF5OiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmIHZlY3RvcnNjb3BlPWdyYXkgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC1mcmFtZXM6diAzCiAKIEZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19WRUNUT1JTQ09QRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yCi1mYXRlLWZpbHRlci12ZWN0b3JzY29wZV9jb2xvcjogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiB2ZWN0b3JzY29wZT1jb2xvciAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmcmFtZXMgMworZmF0ZS1maWx0ZXItdmVjdG9yc2NvcGVfY29sb3I6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmYgdmVjdG9yc2NvcGU9Y29sb3IgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC1mcmFtZXM6diAzCiAKIEZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19WRUNUT1JTQ09QRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yMgotZmF0ZS1maWx0ZXItdmVjdG9yc2NvcGVfY29sb3IyOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmIHZlY3RvcnNjb3BlPWNvbG9yMiAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmcmFtZXMgMworZmF0ZS1maWx0ZXItdmVjdG9yc2NvcGVfY29sb3IyOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmIHZlY3RvcnNjb3BlPWNvbG9yMiAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLWZyYW1lczp2IDMKIAogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1ZFQ1RPUlNDT1BFX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItdmVjdG9yc2NvcGVfY29sb3IzCi1mYXRlLWZpbHRlci12ZWN0b3JzY29wZV9jb2xvcjM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmYgdmVjdG9yc2NvcGU9Y29sb3IzIC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmZyYW1lcyAzCitmYXRlLWZpbHRlci12ZWN0b3JzY29wZV9jb2xvcjM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmYgdmVjdG9yc2NvcGU9Y29sb3IzIC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtZnJhbWVzOnYgMwogCiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfVkVDVE9SU0NPUEVfRklMVEVSKSArPSBmYXRlLWZpbHRlci12ZWN0b3JzY29wZV9jb2xvcjQKLWZhdGUtZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yNDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiB2ZWN0b3JzY29wZT1jb2xvcjQgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZnJhbWVzIDMKK2ZhdGUtZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yNDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiB2ZWN0b3JzY29wZT1jb2xvcjQgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC1mcmFtZXM6diAzCiAKIEZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19WRUNUT1JTQ09QRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXZlY3RvcnNjb3BlX3h5Ci1mYXRlLWZpbHRlci12ZWN0b3JzY29wZV94eTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiB2ZWN0b3JzY29wZT14PTA6eT0xIC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmZyYW1lcyAzCitmYXRlLWZpbHRlci12ZWN0b3JzY29wZV94eTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiB2ZWN0b3JzY29wZT14PTA6eT0xIC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtZnJhbWVzOnYgMwogCiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfTUVSR0VQTEFORVNfRklMVEVSKSArPSBmYXRlLWZpbHRlci1tZXJnZXBsYW5lcwogZmF0ZS1maWx0ZXItbWVyZ2VwbGFuZXM6IHRlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL21lcmdlcGxhbmVzCiBmYXRlLWZpbHRlci1tZXJnZXBsYW5lczogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZmlsdGVyX2NvbXBsZXhfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL21lcmdlcGxhbmVzCiAKK0ZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19IU1RBQ0tfRklMVEVSKSArPSBmYXRlLWZpbHRlci1oc3RhY2sKK2ZhdGUtZmlsdGVyLWhzdGFjazogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvaHN0YWNrCitmYXRlLWZpbHRlci1oc3RhY2s6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZpbHRlcl9jb21wbGV4X3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9oc3RhY2sKKworRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1ZTVEFDS19GSUxURVIpICs9IGZhdGUtZmlsdGVyLXZzdGFjaworZmF0ZS1maWx0ZXItdnN0YWNrOiB0ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy92c3RhY2sKK2ZhdGUtZmlsdGVyLXZzdGFjazogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZmlsdGVyX2NvbXBsZXhfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL3ZzdGFjaworCiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfT1ZFUkxBWV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLW92ZXJsYXkKIGZhdGUtZmlsdGVyLW92ZXJsYXk6IHRlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL292ZXJsYXkKIGZhdGUtZmlsdGVyLW92ZXJsYXk6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZpbHRlcl9jb21wbGV4X3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9vdmVybGF5CkBAIC0xNjYsNiArMjEzLDE2IEBACiBmYXRlLWZpbHRlci1vdmVybGF5X3l1djQyMDogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvb3ZlcmxheV95dXY0MjAKIGZhdGUtZmlsdGVyLW92ZXJsYXlfeXV2NDIwOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZpbHRlcl9jb21wbGV4X3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9vdmVybGF5X3l1djQyMAogCitGQVRFX0ZJTFRFUl9WU1lOVEgtJChjYWxsIEFMTFlFUywgU1BMSVRfRklMVEVSIFNDQUxFX0ZJTFRFUiBQQURfRklMVEVSIE9WRVJMQVlfRklMVEVSKSArPSBmYXRlLWZpbHRlci1vdmVybGF5X252MTIKK2ZhdGUtZmlsdGVyLW92ZXJsYXlfbnYxMjogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvb3ZlcmxheV9udjEyCitmYXRlLWZpbHRlci1vdmVybGF5X252MTI6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZmlsdGVyX2NvbXBsZXhfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL292ZXJsYXlfbnYxMgorZmF0ZS1maWx0ZXItb3ZlcmxheV9udjEyOiBSRUYgPSAkKFNSQ19QQVRIKS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV95dXY0MjAKKworRkFURV9GSUxURVJfVlNZTlRILSQoY2FsbCBBTExZRVMsIFNQTElUX0ZJTFRFUiBTQ0FMRV9GSUxURVIgUEFEX0ZJTFRFUiBPVkVSTEFZX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItb3ZlcmxheV9udjIxCitmYXRlLWZpbHRlci1vdmVybGF5X252MjE6IHRlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL292ZXJsYXlfbnYyMQorZmF0ZS1maWx0ZXItb3ZlcmxheV9udjIxOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZpbHRlcl9jb21wbGV4X3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9vdmVybGF5X252MjEKK2ZhdGUtZmlsdGVyLW92ZXJsYXlfbnYyMTogUkVGID0gJChTUkNfUEFUSCkvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2NDIwCisKIEZBVEVfRklMVEVSX1ZTWU5USC0kKGNhbGwgQUxMWUVTLCBTUExJVF9GSUxURVIgU0NBTEVfRklMVEVSIFBBRF9GSUxURVIgT1ZFUkxBWV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLW92ZXJsYXlfeXV2NDIyCiBmYXRlLWZpbHRlci1vdmVybGF5X3l1djQyMjogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvb3ZlcmxheV95dXY0MjIKIGZhdGUtZmlsdGVyLW92ZXJsYXlfeXV2NDIyOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZpbHRlcl9jb21wbGV4X3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9vdmVybGF5X3l1djQyMgpAQCAtMTc0LDgzICsyMzEsMTAyIEBACiBmYXRlLWZpbHRlci1vdmVybGF5X3l1djQ0NDogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvb3ZlcmxheV95dXY0NDQKIGZhdGUtZmlsdGVyLW92ZXJsYXlfeXV2NDQ0OiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZpbHRlcl9jb21wbGV4X3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9vdmVybGF5X3l1djQ0NAogCitGQVRFX0ZJTFRFUl9PVkVSTEFZX0FMUEhBICs9IGZhdGUtZmlsdGVyLW92ZXJsYXlfeXV2NDIwX3l1dmE0MjAgIGZhdGUtZmlsdGVyLW92ZXJsYXlfeXV2NDIyX3l1dmE0MjIgIGZhdGUtZmlsdGVyLW92ZXJsYXlfeXV2NDQ0X3l1dmE0NDQgIGZhdGUtZmlsdGVyLW92ZXJsYXlfcmdiX3JnYmEgIGZhdGUtZmlsdGVyLW92ZXJsYXlfZ2JycF9nYnJhcAorRkFURV9GSUxURVJfT1ZFUkxBWV9BTFBIQSArPSBmYXRlLWZpbHRlci1vdmVybGF5X3l1dmE0MjBfeXV2YTQyMCBmYXRlLWZpbHRlci1vdmVybGF5X3l1dmE0MjJfeXV2YTQyMiBmYXRlLWZpbHRlci1vdmVybGF5X3l1dmE0NDRfeXV2YTQ0NCBmYXRlLWZpbHRlci1vdmVybGF5X3JnYmFfcmdiYSBmYXRlLWZpbHRlci1vdmVybGF5X2dicmFwX2dicmFwCiskKEZBVEVfRklMVEVSX09WRVJMQVlfQUxQSEEpOiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9wbmcxL2xlbmEtcmdiYS5wbmcKKyQoRkFURV9GSUxURVJfT1ZFUkxBWV9BTFBIQSk6IENNRCA9IGZyYW1lY3JjIC1pICQoU1JDKSAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmICQoRklMVEVSKSAtZnJhbWVzOnYgMQorCitmYXRlLWZpbHRlci1vdmVybGF5X3l1djQyMF95dXZhNDIwOiAgRklMVEVSID0gImZvcm1hdD15dXZhNDIwcFtvdmVyXTtjb2xvcj1ibGFjazoxMjh4MTI4LGZvcm1hdD15dXY0MjBwW21haW5dO1ttYWluXVtvdmVyXW92ZXJsYXk9Zm9ybWF0PXl1djQyMCIKK2ZhdGUtZmlsdGVyLW92ZXJsYXlfeXV2NDIyX3l1dmE0MjI6ICBGSUxURVIgPSAiZm9ybWF0PXl1dmE0MjJwW292ZXJdO2NvbG9yPWJsYWNrOjEyOHgxMjgsZm9ybWF0PXl1djQyMnBbbWFpbl07W21haW5dW292ZXJdb3ZlcmxheT1mb3JtYXQ9eXV2NDIyIgorZmF0ZS1maWx0ZXItb3ZlcmxheV95dXY0NDRfeXV2YTQ0NDogIEZJTFRFUiA9ICJmb3JtYXQ9eXV2YTQ0NHBbb3Zlcl07Y29sb3I9YmxhY2s6MTI4eDEyOCxmb3JtYXQ9eXV2NDQ0cFttYWluXTtbbWFpbl1bb3Zlcl1vdmVybGF5PWZvcm1hdD15dXY0NDQiCitmYXRlLWZpbHRlci1vdmVybGF5X3JnYl9yZ2JhOiAgICAgICAgRklMVEVSID0gImZvcm1hdD1yZ2JhW292ZXJdO2NvbG9yPWJsYWNrOjEyOHgxMjgsZm9ybWF0PXJnYjI0W21haW5dO1ttYWluXVtvdmVyXW92ZXJsYXk9Zm9ybWF0PXJnYiIKK2ZhdGUtZmlsdGVyLW92ZXJsYXlfZ2JycF9nYnJhcDogICAgICBGSUxURVIgPSAiZm9ybWF0PWdicmFwW292ZXJdO2NvbG9yPWJsYWNrOjEyOHgxMjgsZm9ybWF0PWdicnBbbWFpbl07W21haW5dW292ZXJdb3ZlcmxheT1mb3JtYXQ9Z2JycCIKKworZmF0ZS1maWx0ZXItb3ZlcmxheV95dXZhNDIwX3l1dmE0MjA6IEZJTFRFUiA9ICJmb3JtYXQ9eXV2YTQyMHBbb3Zlcl07Y29sb3I9YmxhY2s6MTI4eDEyOCxmb3JtYXQ9eXV2YTQyMHBbbWFpbl07W21haW5dW292ZXJdb3ZlcmxheT1mb3JtYXQ9eXV2NDIwIgorZmF0ZS1maWx0ZXItb3ZlcmxheV95dXZhNDIyX3l1dmE0MjI6IEZJTFRFUiA9ICJmb3JtYXQ9eXV2YTQyMnBbb3Zlcl07Y29sb3I9YmxhY2s6MTI4eDEyOCxmb3JtYXQ9eXV2YTQyMnBbbWFpbl07W21haW5dW292ZXJdb3ZlcmxheT1mb3JtYXQ9eXV2NDIyIgorZmF0ZS1maWx0ZXItb3ZlcmxheV95dXZhNDQ0X3l1dmE0NDQ6IEZJTFRFUiA9ICJmb3JtYXQ9eXV2YTQ0NHBbb3Zlcl07Y29sb3I9YmxhY2s6MTI4eDEyOCxmb3JtYXQ9eXV2YTQ0NHBbbWFpbl07W21haW5dW292ZXJdb3ZlcmxheT1mb3JtYXQ9eXV2NDQ0IgorZmF0ZS1maWx0ZXItb3ZlcmxheV9yZ2JhX3JnYmE6ICAgICAgIEZJTFRFUiA9ICJmb3JtYXQ9cmdiYVtvdmVyXTtjb2xvcj1ibGFjazoxMjh4MTI4LGZvcm1hdD1yZ2JhW21haW5dO1ttYWluXVtvdmVyXW92ZXJsYXk9Zm9ybWF0PXJnYiIKK2ZhdGUtZmlsdGVyLW92ZXJsYXlfZ2JyYXBfZ2JyYXA6ICAgICBGSUxURVIgPSAiZm9ybWF0PWdicmFwW292ZXJdO2NvbG9yPWJsYWNrOjEyOHgxMjgsZm9ybWF0PWdicmFwW21haW5dO1ttYWluXVtvdmVyXW92ZXJsYXk9Zm9ybWF0PWdicnAiCisKK0ZBVEVfRklMVEVSX1NBTVBMRVMtJChjYWxsIEFMTFlFUywgUE5HX0RFQ09ERVIgQVBOR19ERU1VWEVSIEZPUk1BVF9GSUxURVIgQ09MT1JfRklMVEVSIE9WRVJMQVlfRklMVEVSKSArPSAkKEZBVEVfRklMVEVSX09WRVJMQVlfQUxQSEEpCisKIEZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19QSEFTRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXBoYXNlCiBmYXRlLWZpbHRlci1waGFzZTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiBwaGFzZQogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDAKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDA6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0wOjA6MAorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0wOjA6MAogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDEKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDE6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xOjE6MQorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xOjE6MQogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDIKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDI6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0yOjI6MgorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMjogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0yOjI6MgogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDMKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0zOjM6MworZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0zOjM6MwogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDQKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDQ6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj00OjQ6NAorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wNDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj00OjQ6NAogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDUKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDU6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj01OjU6NQorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wNTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj01OjU6NQogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDYKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDY6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj02OjY6NgorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wNjogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj02OjY6NgogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDcKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDc6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj03Ojc6NworZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wNzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj03Ojc6NwogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDgKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDg6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj04Ojg6OAorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wODogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj04Ojg6OAogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDkKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDk6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj05Ojk6OQorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wOTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj05Ojk6OQogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTAKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTA6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xMDoxMDoxMAorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xMDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xMDoxMDoxMAogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTEKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTE6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xMToxMToxMQorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xMTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xMToxMToxMQogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTIKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTI6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xMjoxMjoxMgorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xMjogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xMjoxMjoxMgogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTMKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xMzoxMzoxMworZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xMzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xMzoxMzoxMwogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTQKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTQ6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xNDoxNDoxNAorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xNDoxNDoxNAogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTUKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTU6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xNToxNToxNQorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xNToxNToxNQogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTYKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTY6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xNjoxNjoxNgorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNjogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xNjoxNjoxNgogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTcKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTc6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xNzoxNzoxNworZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xNzoxNzoxNwogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTgKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTg6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xODoxODoxOAorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xODogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xODoxODoxOAogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTkKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTk6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0xOToxOToxOQorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xOTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0xOToxOToxOQogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjAKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjA6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0yMDoyMDoyMAorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0yMDoyMDoyMAogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjEKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjE6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0yMToyMToyMQorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0yMToyMToyMQogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjIKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjI6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0yMjoyMjoyMgorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMjogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0yMjoyMjoyMgogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjMKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0yMzoyMzoyMworZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0yMzoyMzoyMwogCiBGQVRFX1JFTU9WRUdSQUlOICs9IGZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjQKLWZhdGUtZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjQ6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyAxIC12ZiByZW1vdmVncmFpbj0yNDoyNDoyNAorZmF0ZS1maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yNDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diAxIC12ZiByZW1vdmVncmFpbj0yNDoyNDoyNAogCiBmYXRlLWZpbHRlci1yZW1vdmVncmFpbjogJChGQVRFX1JFTU9WRUdSQUlOKQogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1JFTU9WRUdSQUlOX0ZJTFRFUikgKz0gJChGQVRFX1JFTU9WRUdSQUlOKQpAQCAtMjU4LDYgKzMzNCw5IEBACiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfU0VQQVJBVEVGSUVMRFNfRklMVEVSKSArPSBmYXRlLWZpbHRlci1zZXBhcmF0ZWZpZWxkcwogZmF0ZS1maWx0ZXItc2VwYXJhdGVmaWVsZHM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmYgc2VwYXJhdGVmaWVsZHMKIAorRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1dFQVZFX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItd2VhdmUKK2ZhdGUtZmlsdGVyLXdlYXZlOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmIHdlYXZlPWJvdHRvbQorCiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfU0VMRUNUX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItc2VsZWN0LWFsdGVybmF0ZQogZmF0ZS1maWx0ZXItc2VsZWN0LWFsdGVybmF0ZTogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvc2VsZWN0LWFsdGVybmF0ZQogZmF0ZS1maWx0ZXItc2VsZWN0LWFsdGVybmF0ZTogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1maWx0ZXJfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL3NlbGVjdC1hbHRlcm5hdGUKQEAgLTI2Niw2ICszNDUsMTEgQEAKIGZhdGUtZmlsdGVyLXNldHB0czogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvc2V0cHRzCiBmYXRlLWZpbHRlci1zZXRwdHM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZmlsdGVyX3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9zZXRwdHMKIAorRkFURV9TSFVGRkxFRlJBTUVTICs9IGZhdGUtZmlsdGVyLXNodWZmbGVmcmFtZXMKK2ZhdGUtZmlsdGVyLXNodWZmbGVmcmFtZXM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmYgc2h1ZmZsZWZyYW1lcz0iMnwxfDAiCisKK0ZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19TSFVGRkxFRlJBTUVTX0ZJTFRFUikgKz0gJChGQVRFX1NIVUZGTEVGUkFNRVMpCisKIEZBVEVfU0hVRkZMRVBMQU5FUyArPSBmYXRlLWZpbHRlci1zaHVmZmxlcGxhbmVzLWR1cC1sdW1hCiBmYXRlLWZpbHRlci1zaHVmZmxlcGxhbmVzLWR1cC1sdW1hOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmIGZvcm1hdD15dXZhNDQ0cCxzaHVmZmxlcGxhbmVzPTA6MDowOjAKIApAQCAtMjc0LDYgKzM1OCwxMSBAQAogCiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfU0hVRkZMRVBMQU5FU19GSUxURVIpICs9ICQoRkFURV9TSFVGRkxFUExBTkVTKQogCitGQVRFX1NXQVBSRUNUICs9IGZhdGUtZmlsdGVyLXN3YXByZWN0CitmYXRlLWZpbHRlci1zd2FwcmVjdDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiBzd2FwcmVjdAorCitGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfU1dBUFJFQ1RfRklMVEVSKSArPSAkKEZBVEVfU1dBUFJFQ1QpCisKIEZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19UQkxFTkRfRklMVEVSKSArPSBmYXRlLWZpbHRlci10YmxlbmQKIGZhdGUtZmlsdGVyLXRibGVuZDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZiB0YmxlbmQ9YWxsX21vZGU9ZGlmZmVyZW5jZTEyOAogCkBAIC0zMDAsMjggKzM4OSwzMiBAQAogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1VOU0hBUlBfRklMVEVSKSArPSBmYXRlLWZpbHRlci11bnNoYXJwCiBmYXRlLWZpbHRlci11bnNoYXJwOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmIHVuc2hhcnA9MTE6MTE6LTEuNToxMToxMTotMS41CiAKLUZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIFNNSlBFR19ERU1VWEVSIE1KUEVHX0RFQ09ERVIgUEVSTVNfRklMVEVSIEhRRE4zRF9GSUxURVIpICs9IGZhdGUtZmlsdGVyLWhxZG4zZC1zYW1wbGUKK0ZBVEVfRklMVEVSX1NBTVBMRVMtJChjYWxsIEFMTFlFUywgU01KUEVHX0RFTVVYRVIgTUpQRUdfREVDT0RFUiBQRVJNU19GSUxURVIgSFFETjNEX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItaHFkbjNkLXNhbXBsZQogZmF0ZS1maWx0ZXItaHFkbjNkLXNhbXBsZTogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvaHFkbjNkCiBmYXRlLWZpbHRlci1ocWRuM2Qtc2FtcGxlOiBDTUQgPSBmcmFtZWNyYyAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvc21qcGVnL3NjZW53aW4ubWpwZyAtZmlsdGVyX2NvbXBsZXhfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL2hxZG4zZCAtYW4KIAorRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgQUxMWUVTLCBNQVRST1NLQV9ERU1VWEVSIE9WRVJMQVlfRklMVEVSIEgyNjRfREVDT0RFUiBEVkRTVUJfREVDT0RFUikgKz0gZmF0ZS1maWx0ZXItb3ZlcmxheS1kdmRzdWItMjM5NworZmF0ZS1maWx0ZXItb3ZlcmxheS1kdmRzdWItMjM5NzogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvb3ZlcmxheS1kdmRzdWItMjM5NworZmF0ZS1maWx0ZXItb3ZlcmxheS1kdmRzdWItMjM5NzogQ01EID0gZnJhbWVjcmMgLWZsYWdzIGJpdGV4YWN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci8yNDJfNC5ta3YgLWZpbHRlcl9jb21wbGV4X3NjcmlwdCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9vdmVybGF5LWR2ZHN1Yi0yMzk3IC1jOmEgY29weQorCiBGQVRFX0ZJTFRFUl9IUVgtJChjYWxsIEFMTFlFUywgSU1BR0UyX0RFTVVYRVIgUE5HX0RFQ09ERVIgSFFYX0ZJTFRFUikgPSBmYXRlLWZpbHRlci1ocTJ4IGZhdGUtZmlsdGVyLWhxM3ggZmF0ZS1maWx0ZXItaHE0eAotRkFURV9GSUxURVIteWVzICs9ICQoRkFURV9GSUxURVJfSFFYLXllcykKK0ZBVEVfRklMVEVSX1NBTVBMRVMteWVzICs9ICQoRkFURV9GSUxURVJfSFFYLXllcykKIGZhdGUtZmlsdGVyLWhxMng6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9waXhlbGFydCVkLnBuZyAtdmYgaHF4PTIgLXBpeF9mbXQgYmdyYQogZmF0ZS1maWx0ZXItaHEzeDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL3BpeGVsYXJ0JWQucG5nIC12ZiBocXg9MyAtcGl4X2ZtdCBiZ3JhCiBmYXRlLWZpbHRlci1ocTR4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9maWx0ZXIvcGl4ZWxhcnQlZC5wbmcgLXZmIGhxeD00IC1waXhfZm10IGJncmEKIGZhdGUtZmlsdGVyLWhxeDogJChGQVRFX0ZJTFRFUl9IUVgteWVzKQogCiBGQVRFX0ZJTFRFUl9YQlItJChjYWxsIEFMTFlFUywgSU1BR0UyX0RFTVVYRVIgUE5HX0RFQ09ERVIgWEJSX0ZJTFRFUikgPSBmYXRlLWZpbHRlci0yeGJyIGZhdGUtZmlsdGVyLTN4YnIgZmF0ZS1maWx0ZXItNHhicgotRkFURV9GSUxURVIteWVzICs9ICQoRkFURV9GSUxURVJfWEJSLXllcykKK0ZBVEVfRklMVEVSX1NBTVBMRVMteWVzICs9ICQoRkFURV9GSUxURVJfWEJSLXllcykKIGZhdGUtZmlsdGVyLTJ4YnI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9waXhlbGFydCVkLnBuZyAtdmYgeGJyPTIgLXBpeF9mbXQgYmdyYQogZmF0ZS1maWx0ZXItM3hicjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL3BpeGVsYXJ0JWQucG5nIC12ZiB4YnI9MyAtcGl4X2ZtdCBiZ3JhCiBmYXRlLWZpbHRlci00eGJyOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9maWx0ZXIvcGl4ZWxhcnQlZC5wbmcgLXZmIHhicj00IC1waXhfZm10IGJncmEKIGZhdGUtZmlsdGVyLXhicjogJChGQVRFX0ZJTFRFUl9YQlIteWVzKQogCi1GQVRFX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCBVVFZJREVPX0RFQ09ERVIgQVZJX0RFTVVYRVIgUEVSTVNfRklMVEVSIENVUlZFU19GSUxURVIpICs9IGZhdGUtZmlsdGVyLWN1cnZlcworRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgQUxMWUVTLCBVVFZJREVPX0RFQ09ERVIgQVZJX0RFTVVYRVIgUEVSTVNfRklMVEVSIENVUlZFU19GSUxURVIpICs9IGZhdGUtZmlsdGVyLWN1cnZlcwogZmF0ZS1maWx0ZXItY3VydmVzOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS91dHZpZGVvL3V0dmlkZW9fcmdiX21lZGlhbi5hdmkgLXZmIHBlcm1zPXJhbmRvbSxjdXJ2ZXM9dmludGFnZQogCi1GQVRFX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCBWTURfREVNVVhFUiBWTURWSURFT19ERUNPREVSIEZPUk1BVF9GSUxURVIgUEVSTVNfRklMVEVSIEdSQURGVU5fRklMVEVSKSArPSBmYXRlLWZpbHRlci1ncmFkZnVuLXNhbXBsZQorRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgQUxMWUVTLCBWTURfREVNVVhFUiBWTURWSURFT19ERUNPREVSIEZPUk1BVF9GSUxURVIgUEVSTVNfRklMVEVSIEdSQURGVU5fRklMVEVSKSArPSBmYXRlLWZpbHRlci1ncmFkZnVuLXNhbXBsZQogZmF0ZS1maWx0ZXItZ3JhZGZ1bi1zYW1wbGU6IHRlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL2dyYWRmdW4KIGZhdGUtZmlsdGVyLWdyYWRmdW4tc2FtcGxlOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS92bWQvMTIudm1kIC1maWx0ZXJfc2NyaXB0ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsdGVyZ3JhcGhzL2dyYWRmdW4gLWFuIC1mcmFtZXM6diAyMAogCkBAIC0zMzIsNiArNDI1LDIyIEBACiBGQVRFX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCBURVNUU1JDMl9GSUxURVIgRlBTX0ZJTFRFUiBNUERFQ0lNQVRFX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItbXBkZWNpbWF0ZQogZmF0ZS1maWx0ZXItbXBkZWNpbWF0ZTogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHRlc3RzcmMyPXI9MjpkPTEwLGZwcz0zLG1wZGVjaW1hdGUgLXIgMyAtcGl4X2ZtdCB5dXY0MjBwCiAKK0ZBVEVfRklMVEVSLSQoY2FsbCBBTExZRVMsIEZQU19GSUxURVIgVEVTVFNSQzJfRklMVEVSKSArPSBmYXRlLWZpbHRlci1mcHMtdXAgZmF0ZS1maWx0ZXItZnBzLXVwLXJvdW5kLWRvd24gZmF0ZS1maWx0ZXItZnBzLXVwLXJvdW5kLXVwIGZhdGUtZmlsdGVyLWZwcy1kb3duIGZhdGUtZmlsdGVyLWZwcy1kb3duLXJvdW5kLWRvd24gZmF0ZS1maWx0ZXItZnBzLWRvd24tcm91bmQtdXAgZmF0ZS1maWx0ZXItZnBzLWRvd24tZW9mLXBhc3MgZmF0ZS1maWx0ZXItZnBzLXN0YXJ0LWRyb3AgZmF0ZS1maWx0ZXItZnBzLXN0YXJ0LWZpbGwKK2ZhdGUtZmlsdGVyLWZwcy11cDogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHRlc3RzcmMyPXI9MzpkPTIsZnBzPTcKK2ZhdGUtZmlsdGVyLWZwcy11cC1yb3VuZC1kb3duOiBDTUQgPSBmcmFtZWNyYyAtbGF2ZmkgdGVzdHNyYzI9cj0zOmQ9MixmcHM9Nzpyb3VuZD1kb3duCitmYXRlLWZpbHRlci1mcHMtdXAtcm91bmQtdXA6IENNRCA9IGZyYW1lY3JjIC1sYXZmaSB0ZXN0c3JjMj1yPTM6ZD0yLGZwcz03OnJvdW5kPXVwCitmYXRlLWZpbHRlci1mcHMtZG93bjogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHRlc3RzcmMyPXI9NzpkPTMuNSxmcHM9MworZmF0ZS1maWx0ZXItZnBzLWRvd24tcm91bmQtZG93bjogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHRlc3RzcmMyPXI9NzpkPTMuNSxmcHM9Mzpyb3VuZD1kb3duCitmYXRlLWZpbHRlci1mcHMtZG93bi1yb3VuZC11cDogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHRlc3RzcmMyPXI9NzpkPTMuNSxmcHM9Mzpyb3VuZD11cAorZmF0ZS1maWx0ZXItZnBzLWRvd24tZW9mLXBhc3M6IENNRCA9IGZyYW1lY3JjIC1sYXZmaSB0ZXN0c3JjMj1yPTc6ZD0zLjUsZnBzPTM6ZW9mX2FjdGlvbj1wYXNzCitmYXRlLWZpbHRlci1mcHMtc3RhcnQtZHJvcDogQ01EID0gZnJhbWVjcmMgLWxhdmZpIHRlc3RzcmMyPXI9NzpkPTMuNSxmcHM9MzpzdGFydF90aW1lPTEuNQorZmF0ZS1maWx0ZXItZnBzLXN0YXJ0LWZpbGw6IENNRCA9IGZyYW1lY3JjIC1sYXZmaSB0ZXN0c3JjMj1yPTc6ZD0xLjUsc2V0cHRzPVBUUysxNCxmcHM9MzpzdGFydF90aW1lPTEuNQorCitGQVRFX0ZJTFRFUl9TQU1QTEVTLSQoY2FsbCBBTExZRVMsIE1PVl9ERU1VWEVSIEZQU19GSUxURVIgUVRSTEVfREVDT0RFUikgKz0gZmF0ZS1maWx0ZXItZnBzLWNmciBmYXRlLWZpbHRlci1mcHMgZmF0ZS1maWx0ZXItZnBzLXIKK2ZhdGUtZmlsdGVyLWZwcy1jZnI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3F0cmxlL2FwcGxlLWFuaW1hdGlvbi12YXJpYWJsZS1mcHMtYnVnLm1vdiAtciAzMCAtdnN5bmMgY2ZyIC1waXhfZm10IHl1djQyMHAKK2ZhdGUtZmlsdGVyLWZwcy1yOiAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3F0cmxlL2FwcGxlLWFuaW1hdGlvbi12YXJpYWJsZS1mcHMtYnVnLm1vdiAtciAzMCAtdmYgZnBzIC1waXhfZm10IHl1djQyMHAKK2ZhdGUtZmlsdGVyLWZwczogICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3F0cmxlL2FwcGxlLWFuaW1hdGlvbi12YXJpYWJsZS1mcHMtYnVnLm1vdiAtdmYgZnBzPTMwIC1waXhfZm10IHl1djQyMHAKKwogRkFURV9GSUxURVJfVlNZTlRILSQoY2FsbCBBTExZRVMsIEZPUk1BVF9GSUxURVIgU1BMSVRfRklMVEVSIEFMUEhBRVhUUkFDVF9GSUxURVIgQUxQSEFNRVJHRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLWFscGhhZXh0cmFjdF9hbHBoYW1lcmdlX3JnYgogZmF0ZS1maWx0ZXItYWxwaGFleHRyYWN0X2FscGhhbWVyZ2VfcmdiOiB0ZXN0cy9kYXRhL2ZpbHRlcmdyYXBocy9hbHBoYW1lcmdlX2FscGhhZXh0cmFjdF9yZ2IKIGZhdGUtZmlsdGVyLWFscGhhZXh0cmFjdF9hbHBoYW1lcmdlX3JnYjogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1maWx0ZXJfY29tcGxleF9zY3JpcHQgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvYWxwaGFtZXJnZV9hbHBoYWV4dHJhY3RfcmdiCkBAIC0zNjEsNiArNDcwLDEwIEBACiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfU0NBTEVfRklMVEVSKSArPSBmYXRlLWZpbHRlci1zY2FsZTUwMAogZmF0ZS1maWx0ZXItc2NhbGU1MDA6IENNRCA9IHZpZGVvX2ZpbHRlciAic2NhbGU9dz01MDA6aD01MDAiCiAKK0ZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19TQ0FMRTJSRUZfRklMVEVSKSArPSBmYXRlLWZpbHRlci1zY2FsZTJyZWZfa2VlcF9hc3BlY3QKK2ZhdGUtZmlsdGVyLXNjYWxlMnJlZl9rZWVwX2FzcGVjdDogdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvc2NhbGUycmVmX2tlZXBfYXNwZWN0CitmYXRlLWZpbHRlci1zY2FsZTJyZWZfa2VlcF9hc3BlY3Q6IENNRCA9IGZyYW1lbWQ1IC1mcmFtZXM6diA1IC1maWx0ZXJfY29tcGxleF9zY3JpcHQgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9maWx0ZXJncmFwaHMvc2NhbGUycmVmX2tlZXBfYXNwZWN0IC1tYXAgIlttYWluXSIKKwogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1NDQUxFX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItc2NhbGVjaHJvbWEKIGZhdGUtZmlsdGVyLXNjYWxlY2hyb21hOiB0ZXN0cy9kYXRhL3ZzeW50aDEueXV2CiBmYXRlLWZpbHRlci1zY2FsZWNocm9tYTogQ01EID0gZnJhbWVjcmMgLWZsYWdzIGJpdGV4YWN0IC1zIDM1MngyODggLXBpeF9mbXQgeXV2NDQ0cCAtaSB0ZXN0cy9kYXRhL3ZzeW50aDEueXV2IC1waXhfZm10IHl1djQyMHAgLXN3c19mbGFncyArYml0ZXhhY3QgLXZmIHNjYWxlPW91dF92X2Nocl9wb3M9MzM6b3V0X2hfY2hyX3Bvcz0xNTEKQEAgLTM4MSwxNiArNDk0LDE2IEBACiBmYXRlLWZpbHRlci12ZmxpcF92ZmxpcDogQ01EID0gdmlkZW9fZmlsdGVyICJ2ZmxpcCx2ZmxpcCIKIAogRkFURV9GSUxURVJfVlNZTlRILSQoY2FsbCBBTExZRVMsIEZPUk1BVF9GSUxURVIgUEVSTVNfRklMVEVSIEVER0VERVRFQ1RfRklMVEVSKSArPSBmYXRlLWZpbHRlci1lZGdlZGV0ZWN0Ci1mYXRlLWZpbHRlci1lZGdlZGV0ZWN0OiBDTUQgPSB2aWRlb19maWx0ZXIgImZvcm1hdD1ncmF5LHBlcm1zPXJhbmRvbSxlZGdlZGV0ZWN0IiAtdmZyYW1lcyAyMAorZmF0ZS1maWx0ZXItZWRnZWRldGVjdDogQ01EID0gdmlkZW9fZmlsdGVyICJmb3JtYXQ9Z3JheSxwZXJtcz1yYW5kb20sZWRnZWRldGVjdCIgLWZyYW1lczp2IDIwCiAKIEZBVEVfRklMVEVSX1ZTWU5USC0kKGNhbGwgQUxMWUVTLCBGT1JNQVRfRklMVEVSIFBFUk1TX0ZJTFRFUiBFREdFREVURUNUX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItZWRnZWRldGVjdC1jb2xvcm1peAotZmF0ZS1maWx0ZXItZWRnZWRldGVjdC1jb2xvcm1peDogQ01EID0gdmlkZW9fZmlsdGVyICJmb3JtYXQ9Z2JycCxwZXJtcz1yYW5kb20sZWRnZWRldGVjdD1tb2RlPWNvbG9ybWl4IiAtdmZyYW1lcyAyMAorZmF0ZS1maWx0ZXItZWRnZWRldGVjdC1jb2xvcm1peDogQ01EID0gdmlkZW9fZmlsdGVyICJmb3JtYXQ9Z2JycCxwZXJtcz1yYW5kb20sZWRnZWRldGVjdD1tb2RlPWNvbG9ybWl4IiAtZnJhbWVzOnYgMjAKIAogRkFURV9GSUxURVJfVlNZTlRILSQoY2FsbCBBTExZRVMsIFBFUk1TX0ZJTFRFUiBIVUVfRklMVEVSKSArPSBmYXRlLWZpbHRlci1odWUKLWZhdGUtZmlsdGVyLWh1ZTogQ01EID0gdmlkZW9fZmlsdGVyICJwZXJtcz1yYW5kb20saHVlPXM9c2luKDIqUEkqdCkrMSIgLXZmcmFtZXMgMjAKK2ZhdGUtZmlsdGVyLWh1ZTogQ01EID0gdmlkZW9fZmlsdGVyICJwZXJtcz1yYW5kb20saHVlPXM9c2luKDIqUEkqdCkrMSIgLWZyYW1lczp2IDIwCiAKIEZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19JREVUX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItaWRldAotZmF0ZS1maWx0ZXItaWRldDogQ01EID0gZnJhbWVjcmMgLWZsYWdzIGJpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFNSQykgLXZmIGlkZXQgLXZmcmFtZXMgMjUgLWZsYWdzICtiaXRleGFjdAorZmF0ZS1maWx0ZXItaWRldDogQ01EID0gZnJhbWVjcmMgLWZsYWdzIGJpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFNSQykgLXZmIGlkZXQgLWZyYW1lczp2IDI1IC1mbGFncyArYml0ZXhhY3QKIAogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1BBRF9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXBhZAogZmF0ZS1maWx0ZXItcGFkOiBDTUQgPSB2aWRlb19maWx0ZXIgInBhZD1pdyoxLjU6aWgqMS41Oml3KjAuMzppaCowLjIiCkBAIC0zOTksNyArNTEyLDcgQEAKIEZBVEVfRklMVEVSX1ZTWU5USC0kKENPTkZJR19QUF9GSUxURVIpICs9ICQoRkFURV9GSUxURVJfUFApCiAkKEZBVEVfRklMVEVSX1BQKTogZmF0ZS12c3ludGgxLW1wZWc0LXFwcmQKIAotZmF0ZS1maWx0ZXItcHA6ICBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1wZWc0LXFwcmQuYXZpIC12ZnJhbWVzIDUgLWZsYWdzICtiaXRleGFjdCAtdmYgInBwPWJlL2hiL3ZiL3RuL2w1L2FsIgorZmF0ZS1maWx0ZXItcHA6ICBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1wZWc0LXFwcmQuYXZpIC1mcmFtZXM6diA1IC1mbGFncyArYml0ZXhhY3QgLXZmICJwcD1iZS9oYi92Yi90bi9sNS9hbCIKIGZhdGUtZmlsdGVyLXBwMTogQ01EID0gdmlkZW9fZmlsdGVyICJwcD1mcXw0L2JlL2hiL3ZiL3RuL2w1L2FsIgogZmF0ZS1maWx0ZXItcHAyOiBDTUQgPSB2aWRlb19maWx0ZXIgInFwPXgreSxwcD1iZS9oMS92MS9sYiIKIGZhdGUtZmlsdGVyLXBwMzogQ01EID0gdmlkZW9fZmlsdGVyICJxcD14K3kscHA9YmUvaGF8MTI4fDcvdmEvbGkiCkBAIC00MTEsNyArNTI0LDcgQEAKIGZhdGUtZmlsdGVyLXFwOiBDTUQgPSB2aWRlb19maWx0ZXIgInFwPTE3LHBwPWJlL2hiL3ZiL3RuL2w1L2FsIgogCiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfU0VMRUNUX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItc2VsZWN0Ci1mYXRlLWZpbHRlci1zZWxlY3Q6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChTUkMpIC12ZiAic2VsZWN0PW5vdChlcShtb2QoblwsMilcLDApK2VxKG1vZChuXCwzKVwsMCkpIiAtdmZyYW1lcyAyNSAtZmxhZ3MgK2JpdGV4YWN0CitmYXRlLWZpbHRlci1zZWxlY3Q6IENNRCA9IGZyYW1lY3JjIC1mbGFncyBiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChTUkMpIC12ZiAic2VsZWN0PW5vdChlcShtb2QoblwsMilcLDApK2VxKG1vZChuXCwzKVwsMCkpIiAtZnJhbWVzOnYgMjUgLWZsYWdzICtiaXRleGFjdAogCiBGQVRFX0ZJTFRFUl9WU1lOVEgtJChDT05GSUdfU0VUREFSX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItc2V0ZGFyCiBmYXRlLWZpbHRlci1zZXRkYXI6IENNRCA9IHZpZGVvX2ZpbHRlciAic2V0ZGFyPWRhcj0xNi85IgpAQCAtNDIwLDcwICs1MzMsNzAgQEAKIGZhdGUtZmlsdGVyLXNldHNhcjogQ01EID0gdmlkZW9fZmlsdGVyICJzZXRzYXI9c2FyPTE2LzExIgogCiBGQVRFX1NURVJFTzNEICs9IGZhdGUtZmlsdGVyLXN0ZXJlbzNkLWFsLXNic2wKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLWFsLXNic2w6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1hbDpzYnNsCitmYXRlLWZpbHRlci1zdGVyZW8zZC1hbC1zYnNsOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPWFsOnNic2wKIAogRkFURV9TVEVSRU8zRCArPSBmYXRlLWZpbHRlci1zdGVyZW8zZC1hci1hYmwKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLWFyLWFibDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZnJhbWVzIDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPWFyOmFibAorZmF0ZS1maWx0ZXItc3RlcmVvM2QtYXItYWJsOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPWFyOmFibAogCiBGQVRFX1NURVJFTzNEICs9IGZhdGUtZmlsdGVyLXN0ZXJlbzNkLWFici1tcgotZmF0ZS1maWx0ZXItc3RlcmVvM2QtYWJyLW1yOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmcmFtZXMgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9YWJyOm1yCitmYXRlLWZpbHRlci1zdGVyZW8zZC1hYnItbXI6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZnJhbWVzOnYgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9YWJyOm1yCiAKIEZBVEVfU1RFUkVPM0QgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2QtYWJyLW1sCi1mYXRlLWZpbHRlci1zdGVyZW8zZC1hYnItbWw6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1hYnI6bWwKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLWFici1tbDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1hYnI6bWwKIAogRkFURV9TVEVSRU8zRCAgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hYmwKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWJsOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmcmFtZXMgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphYmwKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWJsOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YWJsCiAKIEZBVEVfU1RFUkVPM0QgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hYnIKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWJyOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmcmFtZXMgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphYnIKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWJyOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YWJyCiAKIEZBVEVfU1RFUkVPM0QgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hbAotZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hbDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZnJhbWVzIDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YWwKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWw6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZnJhbWVzOnYgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphbAogCiBGQVRFX1NURVJFTzNEICs9IGZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtc2JzcgotZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1zYnNyOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmcmFtZXMgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDpzYnNyCitmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLXNic3I6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZnJhbWVzOnYgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDpzYnNyCiAKIEZBVEVfU1RFUkVPM0QgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21jCi1mYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWM6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmFnbWMKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtYzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmFnbWMKIAogRkFURV9TVEVSRU8zRCArPSBmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWQKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtZDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZnJhbWVzIDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YWdtZAorZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21kOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YWdtZAogCiBGQVRFX1NURVJFTzNEICs9IGZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtZwotZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21nOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmcmFtZXMgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphZ21nCitmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWc6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZnJhbWVzOnYgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphZ21nCiAKIEZBVEVfU1RFUkVPM0QgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21oCi1mYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWg6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmFnbWgKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtaDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmFnbWgKIAogRkFURV9TVEVSRU8zRCArPSBmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFyYmcKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJiZzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZnJhbWVzIDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YXJiZworZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmJnOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YXJiZwogCiBGQVRFX1NURVJFTzNEICs9IGZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjYwotZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNjOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmcmFtZXMgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphcmNjCitmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2M6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZnJhbWVzOnYgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphcmNjCiAKIEZBVEVfU1RFUkVPM0QgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNkCi1mYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2Q6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmFyY2QKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjZDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmFyY2QKIAogRkFURV9TVEVSRU8zRCArPSBmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2cKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjZzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZnJhbWVzIDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YXJjZworZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNnOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YXJjZwogCiBGQVRFX1NURVJFTzNEICs9IGZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjaAotZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNoOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmcmFtZXMgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphcmNoCitmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2g6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZnJhbWVzOnYgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDphcmNoCiAKIEZBVEVfU1RFUkVPM0QgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmdnCi1mYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWFyZ2c6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmFyZ2cKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJnZzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmFyZ2cKIAogRkFURV9TVEVSRU8zRCArPSBmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWF5YmMKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliYzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZnJhbWVzIDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YXliYworZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJjOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YXliYwogCiBGQVRFX1NURVJFTzNEICs9IGZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliZAotZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJkOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLXZmcmFtZXMgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDpheWJkCitmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWF5YmQ6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtZnJhbWVzOnYgNSAtZmxhZ3MgK2JpdGV4YWN0IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtdmYgc3RlcmVvM2Q9c2JzbDpheWJkCiAKIEZBVEVfU1RFUkVPM0QgKz0gZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJnCi1mYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWF5Ymc6IENNRCA9IGZyYW1lY3JjIC1jOnYgcGdteXV2IC1pICQoU1JDKSAtdmZyYW1lcyA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmF5YmcKK2ZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliZzogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC1mcmFtZXM6diA1IC1mbGFncyArYml0ZXhhY3QgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC12ZiBzdGVyZW8zZD1zYnNsOmF5YmcKIAogRkFURV9TVEVSRU8zRCArPSBmYXRlLWZpbHRlci1zdGVyZW8zZC1zYnNsLWF5YmgKLWZhdGUtZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliaDogQ01EID0gZnJhbWVjcmMgLWM6diBwZ215dXYgLWkgJChTUkMpIC12ZnJhbWVzIDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YXliaAorZmF0ZS1maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJoOiBDTUQgPSBmcmFtZWNyYyAtYzp2IHBnbXl1diAtaSAkKFNSQykgLWZyYW1lczp2IDUgLWZsYWdzICtiaXRleGFjdCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmIHN0ZXJlbzNkPXNic2w6YXliaAogCiBmYXRlLWZpbHRlci1zdGVyZW8zZDogJChGQVRFX1NURVJFTzNEKQogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX1NURVJFTzNEX0ZJTFRFUikgKz0gJChGQVRFX1NURVJFTzNEKQpAQCAtNDk2LDcgKzYwOSw3IEBACiAKIAogdGVzdHMvcGl4Zm10cy5tYWs6IFRBRyA9IEdFTgotdGVzdHMvcGl4Zm10cy5tYWs6IGZmbXBlZyQoUFJPR1NTVUYpJChFWEVTVUYpCit0ZXN0cy9waXhmbXRzLm1hazogZmZtcGVnJChQUk9HU1NVRikkKEVYRVNVRikgfCB0ZXN0cwogCSQoTSlwcmludGYgIlBJWEZNVFMgPSAiID4gJEAKIAkkKFEpJChUQVJHRVRfRVhFQykgJChUQVJHRVRfUEFUSCkvJDwgLXBpeF9mbXRzIGxpc3QgMj4gL2Rldi9udWxsIHwgYXdrICdOUiA+IDggJiYgL15JTy8geyBwcmludGYgJCQyICIgIiB9JyA+PiAkQAogCSQoUSlwcmludGYgIlxuIiA+PiAkQApAQCAtNTY5LDE2ICs2ODIsMjUgQEAKIEZBVEVfRklMVEVSX1BJWEZNVFMtJChDT05GSUdfU1dBUFVWX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItcGl4Zm10cy1zd2FwdXYKIGZhdGUtZmlsdGVyLXBpeGZtdHMtc3dhcHV2OiBDTUQgPSBwaXhmbXRzCiAKK0ZBVEVfRklMVEVSX1BJWEZNVFMtJChDT05GSUdfVElOVEVSTEFDRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV9jdmxwZgorZmF0ZS1maWx0ZXItcGl4Zm10cy10aW50ZXJsYWNlX2N2bHBmOiBDTUQgPSBwaXhmbXRzICJpbnRlcmxlYXZlX3RvcDpjdmxwZiIKKwogRkFURV9GSUxURVJfUElYRk1UUy0kKENPTkZJR19USU5URVJMQUNFX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItcGl4Zm10cy10aW50ZXJsYWNlX21lcmdlCiBmYXRlLWZpbHRlci1waXhmbXRzLXRpbnRlcmxhY2VfbWVyZ2U6IENNRCA9IHBpeGZtdHMgIm1lcmdlIgogCiBGQVRFX0ZJTFRFUl9QSVhGTVRTLSQoQ09ORklHX1RJTlRFUkxBQ0VfRklMVEVSKSArPSBmYXRlLWZpbHRlci1waXhmbXRzLXRpbnRlcmxhY2VfcGFkCiBmYXRlLWZpbHRlci1waXhmbXRzLXRpbnRlcmxhY2VfcGFkOiBDTUQgPSBwaXhmbXRzICJwYWQiCiAKK0ZBVEVfRklMVEVSX1BJWEZNVFMtJChDT05GSUdfVElOVEVSTEFDRV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV92bHBmCitmYXRlLWZpbHRlci1waXhmbXRzLXRpbnRlcmxhY2VfdmxwZjogQ01EID0gcGl4Zm10cyAiaW50ZXJsZWF2ZV90b3A6dmxwZiIKKworRkFURV9GSUxURVJfUElYRk1UUy0kKENPTkZJR19UUkFOU1BPU0VfRklMVEVSKSArPSBmYXRlLWZpbHRlci1waXhmbXRzLXRyYW5zcG9zZQorZmF0ZS1maWx0ZXItcGl4Zm10cy10cmFuc3Bvc2U6IENNRCA9IHBpeGZtdHMgImRpcj1jY2xvY2tfZmxpcCIKKwogRkFURV9GSUxURVJfUElYRk1UUy0kKENPTkZJR19WRkxJUF9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXBpeGZtdHMtdmZsaXAKIGZhdGUtZmlsdGVyLXBpeGZtdHMtdmZsaXA6IENNRCA9IHBpeGZtdHMKIAotJChGQVRFX0ZJTFRFUl9QSVhGTVRTLXllcyk6IGxpYmF2ZmlsdGVyL2ZpbHRmbXRzLXRlc3QkKEVYRVNVRikKKyQoRkFURV9GSUxURVJfUElYRk1UUy15ZXMpOiBsaWJhdmZpbHRlci90ZXN0cy9maWx0Zm10cyQoRVhFU1VGKQogRkFURV9GSUxURVJfVlNZTlRILSQoQ09ORklHX0ZPUk1BVF9GSUxURVIpICs9ICQoRkFURV9GSUxURVJfUElYRk1UUy15ZXMpCiAKIGZhdGUtZmlsdGVyLXBpeGZtdHM6ICQoRkFURV9GSUxURVJfUElYRk1UUy15ZXMpCkBAIC01OTksMTggKzcyMSw2NyBAQAogZmF0ZS1maWx0ZXItbWV0YWRhdGEtc2NlbmVkZXRlY3Q6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL3N2cTMvVmVydGljYWw0MDBrYml0LnNvcmVuc29uMy5tb3YKIGZhdGUtZmlsdGVyLW1ldGFkYXRhLXNjZW5lZGV0ZWN0OiBDTUQgPSBydW4gJChGSUxURVJfTUVUQURBVEFfQ09NTUFORCkgInN3c19mbGFncz0rYWNjdXJhdGVfcm5kK2JpdGV4YWN0O21vdmllPSckKFNSQyknLHNlbGVjdD1ndChzY2VuZVwsLjQpIgogCi1TSUxFTkNFREVURUNUX0RFUFMgPSBGRlBST0JFIEFWREVWSUNFIExBVkZJX0lOREVWIEFNT1ZJRV9GSUxURVIgQU1SX0RFTVVYRVIgQU1SV0JfREVDT0RFUiBTSUxFTkNFREVURUNUX0ZJTFRFUgorQ1JPUERFVEVDVF9ERVBTID0gRkZQUk9CRSBMQVZGSV9JTkRFViBNT1ZJRV9GSUxURVIgQ1JPUERFVEVDVF9GSUxURVIgU0NBTEVfRklMVEVSIFwKKyAgICAgICAgICAgICAgICAgIEFWQ09ERUMgQVZERVZJQ0UgTU9WX0RFTVVYRVIgSDI2NF9ERUNPREVSCitGQVRFX01FVEFEQVRBX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCAkKENST1BERVRFQ1RfREVQUykpICs9IGZhdGUtZmlsdGVyLW1ldGFkYXRhLWNyb3BkZXRlY3QKK2ZhdGUtZmlsdGVyLW1ldGFkYXRhLWNyb3BkZXRlY3Q6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9jcm9wZGV0ZWN0Lm1wNAorZmF0ZS1maWx0ZXItbWV0YWRhdGEtY3JvcGRldGVjdDogQ01EID0gcnVuICQoRklMVEVSX01FVEFEQVRBX0NPTU1BTkQpICJzd3NfZmxhZ3M9K2FjY3VyYXRlX3JuZCtiaXRleGFjdDttb3ZpZT0nJChTUkMpJyxjcm9wZGV0ZWN0PW1heF9vdXRsaWVycz0zIgorCitTSUxFTkNFREVURUNUX0RFUFMgPSBGRlBST0JFIEFWREVWSUNFIExBVkZJX0lOREVWIEFNT1ZJRV9GSUxURVIgVFRBX0RFTVVYRVIgVFRBX0RFQ09ERVIgU0lMRU5DRURFVEVDVF9GSUxURVIKIEZBVEVfTUVUQURBVEFfRklMVEVSLSQoY2FsbCBBTExZRVMsICQoU0lMRU5DRURFVEVDVF9ERVBTKSkgKz0gZmF0ZS1maWx0ZXItbWV0YWRhdGEtc2lsZW5jZWRldGVjdAotZmF0ZS1maWx0ZXItbWV0YWRhdGEtc2lsZW5jZWRldGVjdDogU1JDID0gJChUQVJHRVRfU0FNUExFUykvYW1yd2Ivc2VlZC0xMms2NS5hd2IKLWZhdGUtZmlsdGVyLW1ldGFkYXRhLXNpbGVuY2VkZXRlY3Q6IENNRCA9IHJ1biAkKEZJTFRFUl9NRVRBREFUQV9DT01NQU5EKSAiYW1vdmllPSckKFNSQyknLHNpbGVuY2VkZXRlY3Q9ZD0tMjBkQiIKK2ZhdGUtZmlsdGVyLW1ldGFkYXRhLXNpbGVuY2VkZXRlY3Q6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2xvc3NsZXNzLWF1ZGlvL2luc2lkZS50dGEKK2ZhdGUtZmlsdGVyLW1ldGFkYXRhLXNpbGVuY2VkZXRlY3Q6IENNRCA9IHJ1biAkKEZJTFRFUl9NRVRBREFUQV9DT01NQU5EKSAiYW1vdmllPSckKFNSQyknLHNpbGVuY2VkZXRlY3Q9bj0tMzMuNWRCOmQ9LjIiCiAKIEVCVVIxMjhfTUVUQURBVEFfREVQUyA9IEZGUFJPQkUgQVZERVZJQ0UgTEFWRklfSU5ERVYgQU1PVklFX0ZJTFRFUiBGTEFDX0RFTVVYRVIgRkxBQ19ERUNPREVSIEVCVVIxMjhfRklMVEVSCiBGQVRFX01FVEFEQVRBX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCAkKEVCVVIxMjhfTUVUQURBVEFfREVQUykpICs9IGZhdGUtZmlsdGVyLW1ldGFkYXRhLWVidXIxMjgKIGZhdGUtZmlsdGVyLW1ldGFkYXRhLWVidXIxMjg6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9zZXEtMzM0MS03X3NlcS0zMzQyLTUtMjRiaXQuZmxhYwogZmF0ZS1maWx0ZXItbWV0YWRhdGEtZWJ1cjEyODogQ01EID0gcnVuICQoRklMVEVSX01FVEFEQVRBX0NPTU1BTkQpICJhbW92aWU9JyQoU1JDKScsZWJ1cjEyOD1tZXRhZGF0YT0xIgogCi1GQVRFX1NBTVBMRVNfRkZQUk9CRSArPSAkKEZBVEVfTUVUQURBVEFfRklMVEVSLXllcykKK1JFQURWSVRDX01FVEFEQVRBX0RFUFMgPSBGRlBST0JFIExBVkZJX0lOREVWIE1PVklFX0ZJTFRFUiBBVkNPREVDIEFWREVWSUNFIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBVklfREVNVVhFUiBGRlZIVUZGX0RFQ09ERVIgUkVBRFZJVENfRklMVEVSCitGQVRFX01FVEFEQVRBX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCAkKFJFQURWSVRDX01FVEFEQVRBX0RFUFMpKSArPSBmYXRlLWZpbHRlci1tZXRhZGF0YS1yZWFkdml0Yy1kZWYKK2ZhdGUtZmlsdGVyLW1ldGFkYXRhLXJlYWR2aXRjLWRlZjogU1JDID0gJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL3NhbXBsZS12aXRjLmF2aQorZmF0ZS1maWx0ZXItbWV0YWRhdGEtcmVhZHZpdGMtZGVmOiBDTUQgPSBydW4gJChGSUxURVJfTUVUQURBVEFfQ09NTUFORCkgIm1vdmllPSckKFNSQyknLHJlYWR2aXRjIgogCi1mYXRlLXZmaWx0ZXI6ICQoRkFURV9GSUxURVIteWVzKSAkKEZBVEVfRklMVEVSX1ZTWU5USC15ZXMpCitGQVRFX01FVEFEQVRBX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCAkKFJFQURWSVRDX01FVEFEQVRBX0RFUFMpKSArPSBmYXRlLWZpbHRlci1tZXRhZGF0YS1yZWFkdml0Yy10aHIKK2ZhdGUtZmlsdGVyLW1ldGFkYXRhLXJlYWR2aXRjLXRocjogU1JDID0gJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL3NhbXBsZS12aXRjLmF2aQorZmF0ZS1maWx0ZXItbWV0YWRhdGEtcmVhZHZpdGMtdGhyOiBDTUQgPSBydW4gJChGSUxURVJfTUVUQURBVEFfQ09NTUFORCkgIm1vdmllPSckKFNSQyknLHJlYWR2aXRjPXRocl9iPTAuMzp0aHJfdz0wLjUiCisKK0FWRl9QSEFTRV9NRVRFUl9ERVBTID0gRkZQUk9CRSBBVkRFVklDRSBMQVZGSV9JTkRFViBBTU9WSUVfRklMVEVSIEZMQUNfREVNVVhFUiBGTEFDX0RFQ09ERVIgU0lORV9GSUxURVIgQVBIQVNFTUVURVJfRklMVEVSCitGQVRFX01FVEFEQVRBX0ZJTFRFUi0kKGNhbGwgQUxMWUVTLCAkKEFWRl9QSEFTRV9NRVRFUl9ERVBTKSkgKz0gZmF0ZS1maWx0ZXItbWV0YWRhdGEtYXZmLWFwaGFzZS1tZXRlci1tb25vCitmYXRlLWZpbHRlci1tZXRhZGF0YS1hdmYtYXBoYXNlLW1ldGVyLW1vbm86IENNRCA9IHJ1biAkKEZJTFRFUl9NRVRBREFUQV9DT01NQU5EKSBzaW5lPSJmcmVxdWVuY3k9MTAwMDpzYW1wbGVfcmF0ZT00ODAwMDpkdXJhdGlvbj0xLGFwaGFzZW1ldGVyPXZpZGVvPTAiCisKK0ZBVEVfTUVUQURBVEFfRklMVEVSLSQoY2FsbCBBTExZRVMsICQoQVZGX1BIQVNFX01FVEVSX0RFUFMpKSArPSBmYXRlLWZpbHRlci1tZXRhZGF0YS1hdmYtYXBoYXNlLW1ldGVyLW91dC1vZi1waGFzZQorZmF0ZS1maWx0ZXItbWV0YWRhdGEtYXZmLWFwaGFzZS1tZXRlci1vdXQtb2YtcGhhc2U6IFNSQyA9ICQoVEFSR0VUX1NBTVBMRVMpL2ZpbHRlci9vdXQtb2YtcGhhc2UtMTAwMGh6LmZsYWMKK2ZhdGUtZmlsdGVyLW1ldGFkYXRhLWF2Zi1hcGhhc2UtbWV0ZXItb3V0LW9mLXBoYXNlOiBDTUQgPSBydW4gJChGSUxURVJfTUVUQURBVEFfQ09NTUFORCkgImFtb3ZpZT0nJChTUkMpJyxhcGhhc2VtZXRlcj12aWRlbz0wIgorCit0ZXN0cy9kYXRhL2ZpbGU0NTYwLW92ZXJyaWRlMnJvdGF0ZTAubW92OiBUQUcgPSBHRU4KK3Rlc3RzL2RhdGEvZmlsZTQ1NjAtb3ZlcnJpZGUycm90YXRlMC5tb3Y6IGZmbXBlZyQoUFJPR1NTVUYpJChFWEVTVUYpIHwgdGVzdHMvZGF0YQorCSQoTSkkKFRBUkdFVF9FWEVDKSAkKFRBUkdFVF9QQVRIKS8kPCBcCisJLWkgJChUQVJHRVRfU0FNUExFUykvZmlsdGVyL3NhbXBsZS1pbi1pc3N1ZS01MDUubW92IC1jIGNvcHkgLWZsYWdzICtiaXRleGFjdCAtbWV0YWRhdGE6czp2OjAgcm90YXRlPTAgJChUQVJHRVRfUEFUSCkvJEAgLXkgMj4vZGV2L251bGwKKworRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgQUxMWUVTLCBNT1ZfREVNVVhFUiBIMjY0X0RFQ09ERVIgQUFDX0ZJWEVEX0RFQ09ERVIgUENNX1MxNkxFX0VOQ09ERVIgTU9WX01VWEVSKSArPSBmYXRlLWZpbHRlci1tZXRhLTQ1NjAtcm90YXRlMAorZmF0ZS1maWx0ZXItbWV0YS00NTYwLXJvdGF0ZTA6IHRlc3RzL2RhdGEvZmlsZTQ1NjAtb3ZlcnJpZGUycm90YXRlMC5tb3YKK2ZhdGUtZmlsdGVyLW1ldGEtNDU2MC1yb3RhdGUwOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1jOmEgYWFjX2ZpeGVkIC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZmlsZTQ1NjAtb3ZlcnJpZGUycm90YXRlMC5tb3YKKworUkVGQ01QX0RFUFMgPSBGRk1QRUcgTEFWRklfSU5ERVYgVEVTVFNSQzJfRklMVEVSIEFWR0JMVVJfRklMVEVSIE1FVEFEQVRBX0ZJTFRFUgorCitGQVRFX0ZJTFRFUl9TQU1QTEVTLSQoY2FsbCBBTExZRVMsICQoUkVGQ01QX0RFUFMpIFBTTlJfRklMVEVSKSArPSBmYXRlLWZpbHRlci1yZWZjbXAtcHNuci1yZ2IKK2ZhdGUtZmlsdGVyLXJlZmNtcC1wc25yLXJnYjogQ01EID0gcmVmY21wX21ldGFkYXRhIHBzbnIgcmdiMjQgMC4wMDIKKworRkFURV9GSUxURVJfU0FNUExFUy0kKGNhbGwgQUxMWUVTLCAkKFJFRkNNUF9ERVBTKSBQU05SX0ZJTFRFUikgKz0gZmF0ZS1maWx0ZXItcmVmY21wLXBzbnIteXV2CitmYXRlLWZpbHRlci1yZWZjbXAtcHNuci15dXY6IENNRCA9IHJlZmNtcF9tZXRhZGF0YSBwc25yIHl1djQyMnAgMC4wMDE1CisKK0ZBVEVfRklMVEVSX1NBTVBMRVMtJChjYWxsIEFMTFlFUywgJChSRUZDTVBfREVQUykgU1NJTV9GSUxURVIpICs9IGZhdGUtZmlsdGVyLXJlZmNtcC1zc2ltLXJnYgorZmF0ZS1maWx0ZXItcmVmY21wLXNzaW0tcmdiOiBDTUQgPSByZWZjbXBfbWV0YWRhdGEgc3NpbSByZ2IyNCAwLjAxNQorCitGQVRFX0ZJTFRFUl9TQU1QTEVTLSQoY2FsbCBBTExZRVMsICQoUkVGQ01QX0RFUFMpIFNTSU1fRklMVEVSKSArPSBmYXRlLWZpbHRlci1yZWZjbXAtc3NpbS15dXYKK2ZhdGUtZmlsdGVyLXJlZmNtcC1zc2ltLXl1djogQ01EID0gcmVmY21wX21ldGFkYXRhIHNzaW0geXV2NDIycCAwLjAxNQorCitGQVRFX1NBTVBMRVNfRkZQUk9CRSArPSAkKEZBVEVfTUVUQURBVEFfRklMVEVSLXllcykKK0ZBVEVfU0FNUExFU19GRk1QRUcgKz0gJChGQVRFX0ZJTFRFUl9TQU1QTEVTLXllcykKK0ZBVEVfRkZNUEVHICs9ICQoRkFURV9GSUxURVIteWVzKQorCitmYXRlLXZmaWx0ZXI6ICQoRkFURV9GSUxURVIteWVzKSAkKEZBVEVfRklMVEVSX1NBTVBMRVMteWVzKSAkKEZBVEVfRklMVEVSX1ZTWU5USC15ZXMpCiAKIGZhdGUtZmlsdGVyOiBmYXRlLWFmaWx0ZXIgZmF0ZS12ZmlsdGVyICQoRkFURV9NRVRBREFUQV9GSUxURVIteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9maXRzLm1hayBiL3Rlc3RzL2ZhdGUvZml0cy5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEzNDk4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZhdGUvZml0cy5tYWsKQEAgLTAsMCArMSw1OSBAQAordGVzdHMvZGF0YS9maXRzLW11bHRpLmZpdHM6IFRBRyA9IEdFTgordGVzdHMvZGF0YS9maXRzLW11bHRpLmZpdHM6IGZmbXBlZyQoUFJPR1NTVUYpJChFWEVTVUYpIHwgdGVzdHMvZGF0YQorCSQoTSkkKFRBUkdFVF9FWEVDKSAkKFRBUkdFVF9QQVRIKS8kPCBcCisgICAgICAgIC1pICQoVEFSR0VUX1NBTVBMRVMpL2dpZi9tNG5iLmdpZiBcCisgICAgICAgIC15ICQoVEFSR0VUX1BBVEgpLyQoQCkgMj4vZGV2L251bGwKKworI21hcHBpbmcgb2YgZml0cyBmaWxlIGZvcm1hdHMgdG8gcG5nIGZpbGVuYW1lcworbWFwLnRlc3RzL2RhdGEvbGVuYS1ncmF5LmZpdHMgICAgOj0gZ3JheTgKK21hcC50ZXN0cy9kYXRhL2xlbmEtZ2JycC5maXRzICAgIDo9IHJnYjI0CittYXAudGVzdHMvZGF0YS9sZW5hLWdicnAxNi5maXRzICA6PSByZ2I0OAorbWFwLnRlc3RzL2RhdGEvbGVuYS1nYnJhcDE2bGUuZml0cyA6PSByZ2JhNjQKKwordGVzdHMvZGF0YS9sZW5hJS5maXRzOiBUQUcgPSBHRU4KK3Rlc3RzL2RhdGEvbGVuYSUuZml0czogTkFNRSA9ICQobWFwLiQoQCkpCit0ZXN0cy9kYXRhL2xlbmElLmZpdHM6IGZmbXBlZyQoUFJPR1NTVUYpJChFWEVTVUYpIHwgdGVzdHMvZGF0YQorCSQoTSkkKFRBUkdFVF9FWEVDKSAkKFRBUkdFVF9QQVRIKS8kPCBcCisgICAgICAgIC1pICQoVEFSR0VUX1NBTVBMRVMpL3BuZzEvbGVuYS0kKG1hcC4kKEApKS5wbmcgXAorICAgICAgICAteSAkKFRBUkdFVF9QQVRIKS8kKEApIDI+L2Rldi9udWxsCisKK0ZBVEVfRklUU19ERUMtJChjYWxsIERFTURFQywgRklUUywgRklUUykgKz0gZmF0ZS1maXRzZGVjLWV4dF9kYXRhX21pbl9tYXgKK2ZhdGUtZml0c2RlYy1leHRfZGF0YV9taW5fbWF4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9maXRzL3gwY2owMTBjdF9kMGguZml0IC1waXhfZm10IGdyYXkxNmxlCisKK0ZBVEVfRklUU19ERUMtJChjYWxsIERFTURFQywgRklUUywgRklUUykgKz0gZmF0ZS1maXRzZGVjLWJsYW5rX2JpdHBpeDMyCitmYXRlLWZpdHNkZWMtYmxhbmtfYml0cGl4MzI6IENNRCA9IGZyYW1lY3JjIC1ibGFua192YWx1ZSA2NTUzNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9maXRzL2ZpbGUwMDguZml0cyAtcGl4X2ZtdCBncmF5MTZsZQorCitGQVRFX0ZJVFNfREVDLSQoY2FsbCBERU1ERUMsIEZJVFMsIEZJVFMpICs9IGZhdGUtZml0c2RlYy1iaXRwaXgtMzIKK2ZhdGUtZml0c2RlYy1iaXRwaXgtMzI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZpdHMvdHN0MDAwNS5maXRzIC1waXhfZm10IGdyYXkxNmxlCisKK0ZBVEVfRklUU19ERUMtJChjYWxsIERFTURFQywgRklUUywgRklUUykgKz0gZmF0ZS1maXRzZGVjLWJpdHBpeC02NAorZmF0ZS1maXRzZGVjLWJpdHBpeC02NDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZml0cy90c3QwMDA2LmZpdHMgLXBpeF9mbXQgZ3JheTE2bGUKKworRkFURV9GSVRTX0RFQy0kKGNhbGwgQUxMWUVTLCBHSUZfREVNVVhFUiBGSVRTX0RFTVVYRVIgR0lGX0RFQ09ERVIgRklUU19ERUNPREVSIEZJVFNfRU5DT0RFUiBGSVRTX01VWEVSKSArPSBmYXRlLWZpdHNkZWMtbXVsdGkKK2ZhdGUtZml0c2RlYy1tdWx0aTogdGVzdHMvZGF0YS9maXRzLW11bHRpLmZpdHMKK2ZhdGUtZml0c2RlYy1tdWx0aTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9maXRzLW11bHRpLmZpdHMgLXBpeF9mbXQgZ2JyYXAKKworZmF0ZS1maXRzZGVjJTogUElYRk1UID0gJCh3b3JkIDMsICQoc3Vic3QgLSwgLCQoQCkpKQorZmF0ZS1maXRzZGVjJTogU1JDID0gJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9sZW5hLSQoUElYRk1UKS5maXRzCitmYXRlLWZpdHNkZWMlOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLXBpeF9mbXQgJChQSVhGTVQpCisKK0ZBVEVfRklUU19ERUNfUElYRk1UID0gZ3JheSBnYnJwIGdicnAxNiBnYnJhcDE2bGUKKyQoRkFURV9GSVRTX0RFQ19QSVhGTVQ6JT1mYXRlLWZpdHNkZWMtJSk6IGZhdGUtZml0c2RlYy0lOiB0ZXN0cy9kYXRhL2xlbmEtJS5maXRzCitGQVRFX0ZJVFNfREVDLSQoY2FsbCBBTExZRVMsIEZJVFNfREVNVVhFUiBJTUFHRTJfREVNVVhFUiBGSVRTX0RFQ09ERVIgUE5HX0RFQ09ERVIgRklUU19FTkNPREVSIEZJVFNfTVVYRVIpICs9ICQoRkFURV9GSVRTX0RFQ19QSVhGTVQ6JT1mYXRlLWZpdHNkZWMtJSkKKworRkFURV9GSVRTICs9ICQoRkFURV9GSVRTX0RFQy15ZXMpCitmYXRlLWZpdHNkZWM6ICQoRkFURV9GSVRTX0RFQy15ZXMpCisKK2ZhdGUtZml0c2VuYyU6IFBJWEZNVCA9ICQod29yZCAzLCAkKHN1YnN0IC0sICwkKEApKSkKK2ZhdGUtZml0c2VuYyU6IFNSQyA9ICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvZml0cy1tdWx0aS5maXRzCitmYXRlLWZpdHNlbmMlOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFNSQykgLWM6diBmaXRzIC1waXhfZm10ICQoUElYRk1UKQorCitGQVRFX0ZJVFNfRU5DX1BJWEZNVCA9IGdyYXkgZ3JheTE2YmUgZ2JycCBnYnJhcCBnYnJwMTZiZSBnYnJhcDE2YmUKKyQoRkFURV9GSVRTX0VOQ19QSVhGTVQ6JT1mYXRlLWZpdHNlbmMtJSk6IHRlc3RzL2RhdGEvZml0cy1tdWx0aS5maXRzCitGQVRFX0ZJVFNfRU5DLSQoY2FsbCBBTExZRVMsIEdJRl9ERU1VWEVSIEdJRl9ERUNPREVSIEZJVFNfRU5DT0RFUiBGSVRTX01VWEVSKSArPSAkKEZBVEVfRklUU19FTkNfUElYRk1UOiU9ZmF0ZS1maXRzZW5jLSUpCisKK0ZBVEVfRklUUyArPSAkKEZBVEVfRklUU19FTkMteWVzKQorZmF0ZS1maXRzZW5jOiAkKEZBVEVfRklUU19FTkMteWVzKQorCitGQVRFX1NBTVBMRVNfRkZNUEVHICs9ICQoRkFURV9GSVRTKQorZmF0ZS1maXRzOiAkKEZBVEVfRklUUykKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvZmx2ZW5jLm1hayBiL3Rlc3RzL2ZhdGUvZmx2ZW5jLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRlZWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9mbHZlbmMubWFrCkBAIC0wLDAgKzEsMTEgQEAKK3Rlc3RzL2RhdGEvYWRkX2tleWZyYW1lX2luZGV4LmZsdjogVEFHID0gR0VOCit0ZXN0cy9kYXRhL2FkZF9rZXlmcmFtZV9pbmRleC5mbHY6IGZmbXBlZyQoUFJPR1NTVUYpJChFWEVTVUYpIHwgdGVzdHMvZGF0YQorCSQoTSkkKFRBUkdFVF9FWEVDKSAkKFRBUkdFVF9QQVRIKS8kPCBcCisJCS1mIGxhdmZpIC1pICJzd3NfZmxhZ3M9K2FjY3VyYXRlX3JuZCtiaXRleGFjdDt0ZXN0c3JjPXI9NzpuPTI6ZD0yMCIgLXN3c19mbGFncyAnK2FjY3VyYXRlX3JuZCtiaXRleGFjdCcgLW1ldGFkYXRhICJlbmNvZGVyPUxhdmYiIC1waXhfZm10IHl1djQyMHAgLWM6diBmbHYxIC1nIDcgLWYgZmx2IC1mbGFncyArYml0ZXhhY3QgLWZmbGFncyArYml0ZXhhY3QgXAorCQktZmx2ZmxhZ3MgYWRkX2tleWZyYW1lX2luZGV4IC1pZGN0IHNpbXBsZSAtZGN0IGludCAteSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FkZF9rZXlmcmFtZV9pbmRleC5mbHYgMj4gL2Rldi9udWxsOworCitGQVRFX0FGSUxURVItJChjYWxsIEFMTFlFUywgRkxWX01VWEVSIEZMVl9ERU1VWEVSIEFWREVWSUNFIFRFU1RTUkNfRklMVEVSIExBVkZJX0lOREVWIEZMVl9FTkNPREVSKSArPSBmYXRlLWZsdi1hZGRfa2V5ZnJhbWVfaW5kZXgKK2ZhdGUtZmx2LWFkZF9rZXlmcmFtZV9pbmRleDogdGVzdHMvZGF0YS9hZGRfa2V5ZnJhbWVfaW5kZXguZmx2CitmYXRlLWZsdi1hZGRfa2V5ZnJhbWVfaW5kZXg6IENNRCA9IGZmbWV0YWRhdGEgLWZsYWdzICtiaXRleGFjdCAtaSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FkZF9rZXlmcmFtZV9pbmRleC5mbHYKKworCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2dhcGxlc3MubWFrIGIvdGVzdHMvZmF0ZS9nYXBsZXNzLm1hawppbmRleCAyZmIwMDVmLi45MWZkZGI0IDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL2dhcGxlc3MubWFrCisrKyBiL3Rlc3RzL2ZhdGUvZ2FwbGVzcy5tYWsKQEAgLTEsNyArMSwxMjUgQEAKIEZBVEVfR0FQTEVTUy0kKENPTkZJR19NUDNfREVNVVhFUikgKz0gZmF0ZS1nYXBsZXNzLW1wMwotZmF0ZS1nYXBsZXNzLW1wMzogQ01EID0gZ2FwbGVzcyAkKFRBUkdFVF9TQU1QTEVTKS9nYXBsZXNzL2dhcGxlc3MubXAzCitmYXRlLWdhcGxlc3MtbXAzOiBDTUQgPSBnYXBsZXNzICQoVEFSR0VUX1NBTVBMRVMpL2dhcGxlc3MvZ2FwbGVzcy5tcDMgIi1jOmEgbXAzIgorCitGQVRFX0dBUExFU1MtJChDT05GSUdfTVAzX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1zcXVhcmUtbXAzCitmYXRlLWF1ZGlvbWF0Y2gtc3F1YXJlLW1wMzogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC9zcXVhcmUzLm1wMyAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3NxdWFyZTMud2F2CisKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLXNxdWFyZS1hYWMKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWxjLWFkdHMgICAgZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWxjLW00YQorRkFURV9HQVBMRVNTLSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8tbGMtYWR0cyAgICBmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8tbGMtbTRhCitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtbW9uby1oZS1hZHRzICAgIGZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtbW9uby1oZS1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1tb25vLWhlLWFkdHMgICAgZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1tb25vLWhlLW00YQorRkFURV9HQVBMRVNTLSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1oZS1hZHRzICBmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1oZS1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8taGUtYWR0cyAgZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8taGUtbTRhCitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWhlMi1hZHRzIGZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWhlMi1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8taGUyLWFkdHMgZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8taGUyLW00YQorRkFURV9HQVBMRVNTLSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1sYy1hZHRzICBmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1sYy1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8tbGMtYWR0cyAgZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8tbGMtbTRhCisKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLWZhYWMtMTYwMDAtbW9uby1sYy1hZHRzICAgIGZhdGUtYXVkaW9tYXRjaC1mYWFjLTE2MDAwLW1vbm8tbGMtbTRhCitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1mYWFjLTQ0MTAwLW1vbm8tbGMtYWR0cyAgICBmYXRlLWF1ZGlvbWF0Y2gtZmFhYy00NDEwMC1tb25vLWxjLW00YQorRkFURV9HQVBMRVNTLSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWF1ZGlvbWF0Y2gtZmFhYy0xNjAwMC1zdGVyZW8tbGMtYWR0cyAgZmF0ZS1hdWRpb21hdGNoLWZhYWMtMTYwMDAtc3RlcmVvLWxjLW00YQorRkFURV9HQVBMRVNTLSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWF1ZGlvbWF0Y2gtZmFhYy00NDEwMC1zdGVyZW8tbGMtYWR0cyAgZmF0ZS1hdWRpb21hdGNoLWZhYWMtNDQxMDAtc3RlcmVvLWxjLW00YQorCitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1kb2xieS00NDEwMC1tb25vLWxjLW1wNAorRkFURV9HQVBMRVNTLSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWF1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtbW9uby1oZS1tcDQKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLXN0ZXJlby1oZS1tcDQKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLXN0ZXJlby1oZTItbXA0CitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1kb2xieS00NDEwMC1zdGVyZW8tbGMtbXA0CisKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLW5lcm8tMTYwMDAtbW9uby1sYy1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLW5lcm8tNDQxMDAtbW9uby1sYy1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLW5lcm8tMTYwMDAtbW9uby1oZS1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLW5lcm8tNDQxMDAtbW9uby1oZS1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLW5lcm8tMTYwMDAtc3RlcmVvLWhlLW00YQorRkFURV9HQVBMRVNTLSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWF1ZGlvbWF0Y2gtbmVyby00NDEwMC1zdGVyZW8taGUtbTRhCitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1oZTItbTRhCitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLXN0ZXJlby1oZTItbTRhCitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1sYy1tNGEKK0ZBVEVfR0FQTEVTUy0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1hdWRpb21hdGNoLW5lcm8tNDQxMDAtc3RlcmVvLWxjLW00YQorCitGQVRFX0dBUExFU1MtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtYXVkaW9tYXRjaC1xdWlja3RpbWU3LTQ0MTAwLXN0ZXJlby1sYy1tcDQgZmF0ZS1hdWRpb21hdGNoLXF1aWNrdGltZVgtNDQxMDAtc3RlcmVvLWxjLW00YQorCitmYXRlLWF1ZGlvbWF0Y2gtc3F1YXJlLWFhYzogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC9zcXVhcmUzLm00YSAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3NxdWFyZTMud2F2CisKK2ZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtbW9uby1sYy1hZHRzOiBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF8xNjAwMF9tb25vX2FhY19sYy5hZHRzICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX21vbm8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLW1vbm8tbGMtbTRhOiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19hZmNvbnZlcnRfMTYwMDBfbW9ub19hYWNfbGMubTRhICAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc18xNjAwMF9tb25vLndhdgorZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWhlLWFkdHM6IENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfYWZjb252ZXJ0XzE2MDAwX21vbm9fYWFjX2hlLmFkdHMgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfMTYwMDBfbW9uby53YXYgIi1hYyAxIC1hciAxNjAwMCIKK2ZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtbW9uby1oZS1tNGE6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF8xNjAwMF9tb25vX2FhY19oZS5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX21vbm8ud2F2ICItYWMgMSAtYXIgMTYwMDAiCitmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1sYy1hZHRzOiBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF8xNjAwMF9zdGVyZW9fYWFjX2xjLmFkdHMgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfMTYwMDBfc3RlcmVvLndhdgorZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1zdGVyZW8tbGMtbTRhOiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19hZmNvbnZlcnRfMTYwMDBfc3RlcmVvX2FhY19sYy5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWhlLWFkdHM6IENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfYWZjb252ZXJ0XzE2MDAwX3N0ZXJlb19hYWNfaGUuYWR0cyAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc18xNjAwMF9zdGVyZW8ud2F2ICItYXIgMTYwMDAiCitmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1oZS1tNGE6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF8xNjAwMF9zdGVyZW9fYWFjX2hlLm00YSAgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfMTYwMDBfc3RlcmVvLndhdiAiLWFyIDE2MDAwIgorZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1zdGVyZW8taGUyLWFkdHM6Q01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19hZmNvbnZlcnRfMTYwMDBfc3RlcmVvX2FhY19oZTIuYWR0cyAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX3N0ZXJlby53YXYgIi1hciAxNjAwMCIKK2ZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWhlMi1tNGE6IENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfYWZjb252ZXJ0XzE2MDAwX3N0ZXJlb19hYWNfaGUyLm00YSAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc18xNjAwMF9zdGVyZW8ud2F2ICItYXIgMTYwMDAiCitmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8tbGMtYWR0czogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19hZmNvbnZlcnRfNDQxMDBfbW9ub19hYWNfbGMuYWR0cyAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc180NDEwMF9tb25vLndhdgorZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1tb25vLWxjLW00YTogIENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfYWZjb252ZXJ0XzQ0MTAwX21vbm9fYWFjX2xjLm00YSAgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfNDQxMDBfbW9uby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtbW9uby1oZS1hZHRzOiBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF80NDEwMF9tb25vX2FhY19oZS5hZHRzICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX21vbm8ud2F2ICItYWMgMSIKK2ZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtbW9uby1oZS1tNGE6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF80NDEwMF9tb25vX2FhY19oZS5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX21vbm8ud2F2ICItYWMgMSIKK2ZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtc3RlcmVvLWxjLWFkdHM6IENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfYWZjb252ZXJ0XzQ0MTAwX3N0ZXJlb19hYWNfbGMuYWR0cyAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc180NDEwMF9zdGVyZW8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1sYy1tNGE6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF80NDEwMF9zdGVyZW9fYWFjX2xjLm00YSAgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfNDQxMDBfc3RlcmVvLndhdgorZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8taGUtYWR0czogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19hZmNvbnZlcnRfNDQxMDBfc3RlcmVvX2FhY19oZS5hZHRzICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtc3RlcmVvLWhlLW00YTogIENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfYWZjb252ZXJ0XzQ0MTAwX3N0ZXJlb19hYWNfaGUubTRhICAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc180NDEwMF9zdGVyZW8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1oZTItYWR0czpDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2FmY29udmVydF80NDEwMF9zdGVyZW9fYWFjX2hlMi5hZHRzICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfNDQxMDBfc3RlcmVvLndhdgorZmF0ZS1hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8taGUyLW00YTogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19hZmNvbnZlcnRfNDQxMDBfc3RlcmVvX2FhY19oZTIubTRhICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX3N0ZXJlby53YXYKKworZmF0ZS1hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLW1vbm8tbGMtbXA0OiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19kb2xieV80NDEwMF9tb25vX2FhY19sYy5tcDQgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX21vbm8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtbW9uby1oZS1tcDQ6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2RvbGJ5XzQ0MTAwX21vbm9fYWFjX2hlLm1wNCAgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfNDQxMDBfbW9uby53YXYgIi1hYyAxIgorZmF0ZS1hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLXN0ZXJlby1sYy1tcDQ6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX2RvbGJ5XzQ0MTAwX3N0ZXJlb19hYWNfbGMubXA0ICAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc180NDEwMF9zdGVyZW8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtc3RlcmVvLWhlLW1wNDogIENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfZG9sYnlfNDQxMDBfc3RlcmVvX2FhY19oZS5tcDQgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1kb2xieS00NDEwMC1zdGVyZW8taGUyLW1wNDogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19kb2xieV80NDEwMF9zdGVyZW9fYWFjX2hlMi5tcDQgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfNDQxMDBfc3RlcmVvLndhdgorCitmYXRlLWF1ZGlvbWF0Y2gtZmFhYy0xNjAwMC1tb25vLWxjLWFkdHM6IENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfZmFhY18xNjAwMF9tb25vX2FhY19sYy5hZHRzICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX21vbm8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZmFhYy0xNjAwMC1tb25vLWxjLW00YTogIENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfZmFhY18xNjAwMF9tb25vX2FhY19sYy5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX21vbm8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZmFhYy0xNjAwMC1zdGVyZW8tbGMtYWR0czogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19mYWFjXzE2MDAwX3N0ZXJlb19hYWNfbGMuYWR0cyAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc18xNjAwMF9zdGVyZW8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZmFhYy0xNjAwMC1zdGVyZW8tbGMtbTRhOiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19mYWFjXzE2MDAwX3N0ZXJlb19hYWNfbGMubTRhICAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc18xNjAwMF9zdGVyZW8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZmFhYy00NDEwMC1tb25vLWxjLWFkdHM6IENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfZmFhY180NDEwMF9tb25vX2FhY19sYy5hZHRzICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX21vbm8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZmFhYy00NDEwMC1tb25vLWxjLW00YTogIENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfZmFhY180NDEwMF9tb25vX2FhY19sYy5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX21vbm8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZmFhYy00NDEwMC1zdGVyZW8tbGMtYWR0czogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19mYWFjXzQ0MTAwX3N0ZXJlb19hYWNfbGMuYWR0cyAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc180NDEwMF9zdGVyZW8ud2F2CitmYXRlLWF1ZGlvbWF0Y2gtZmFhYy00NDEwMC1zdGVyZW8tbGMtbTRhOiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19mYWFjXzQ0MTAwX3N0ZXJlb19hYWNfbGMubTRhICAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc180NDEwMF9zdGVyZW8ud2F2CisKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTE2MDAwLW1vbm8tbGMtbTRhOiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19uZXJvXzE2MDAwX21vbm9fYWFjX2xjLm00YSAgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfMTYwMDBfbW9uby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTE2MDAwLW1vbm8taGUtbTRhOiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19uZXJvXzE2MDAwX21vbm9fYWFjX2hlLm00YSAgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfMTYwMDBfbW9uby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1sYy1tNGE6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX25lcm9fMTYwMDBfc3RlcmVvX2FhY19sYy5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1oZS1tNGE6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX25lcm9fMTYwMDBfc3RlcmVvX2FhY19oZS5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1oZTItbTRhOiBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX25lcm9fMTYwMDBfc3RlcmVvX2FhY19oZTIubTRhICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzE2MDAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLW1vbm8tbGMtbTRhOiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19uZXJvXzQ0MTAwX21vbm9fYWFjX2xjLm00YSAgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfNDQxMDBfbW9uby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLW1vbm8taGUtbTRhOiAgQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19uZXJvXzQ0MTAwX21vbm9fYWFjX2hlLm00YSAgICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfNDQxMDBfbW9uby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLXN0ZXJlby1sYy1tNGE6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX25lcm9fNDQxMDBfc3RlcmVvX2FhY19sYy5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLXN0ZXJlby1oZS1tNGE6ICBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX25lcm9fNDQxMDBfc3RlcmVvX2FhY19oZS5tNGEgICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLXN0ZXJlby1oZTItbTRhOiBDTUQgPSBhdWRpb19tYXRjaCAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzX25lcm9fNDQxMDBfc3RlcmVvX2FhY19oZTIubTRhICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX3N0ZXJlby53YXYKKworZmF0ZS1hdWRpb21hdGNoLXF1aWNrdGltZTctNDQxMDAtc3RlcmVvLWxjLW1wNDogQ01EID0gYXVkaW9fbWF0Y2ggJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc19xdWlja3RpbWU3XzQ0MTAwX3N0ZXJlb19hYWNfbGMubXA0ICAkKFRBUkdFVF9TQU1QTEVTKS9hdWRpb21hdGNoL3RvbmVzXzQ0MTAwX3N0ZXJlby53YXYKK2ZhdGUtYXVkaW9tYXRjaC1xdWlja3RpbWVYLTQ0MTAwLXN0ZXJlby1sYy1tNGE6IENNRCA9IGF1ZGlvX21hdGNoICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvbWF0Y2gvdG9uZXNfcXVpY2t0aW1lWF80NDEwMF9zdGVyZW9fYWFjX2xjLm00YSAgJChUQVJHRVRfU0FNUExFUykvYXVkaW9tYXRjaC90b25lc180NDEwMF9zdGVyZW8ud2F2CisKIAogRkFURV9HQVBMRVNTID0gJChGQVRFX0dBUExFU1MteWVzKQogCitGQVRFX0dBUExFU1NJTkZPX1BST0JFLSQoY2FsbCBERU1ERUMsIE1PViwgQUFDKSArPSBmYXRlLWdhcGxlc3NpbmZvLWl0dW5lczEKK2ZhdGUtZ2FwbGVzc2luZm8taXR1bmVzMTogZmZwcm9iZSQoUFJPR1NTVUYpJChFWEVTVUYpCitmYXRlLWdhcGxlc3NpbmZvLWl0dW5lczE6IENNRCA9IHByb2JlZ2FwbGVzc2luZm8gJChUQVJHRVRfU0FNUExFUykvY292ZXJfYXJ0L093bmVyLWlUdW5lc185LjAuMy4xNS5tNGEKKworRkFURV9HQVBMRVNTSU5GT19QUk9CRS0kKGNhbGwgREVNREVDLCBNT1YsIEFBQykgKz0gZmF0ZS1nYXBsZXNzaW5mby1pdHVuZXMyCitmYXRlLWdhcGxlc3NpbmZvLWl0dW5lczI6IGZmcHJvYmUkKFBST0dTU1VGKSQoRVhFU1VGKQorZmF0ZS1nYXBsZXNzaW5mby1pdHVuZXMyOiBDTUQgPSBwcm9iZWdhcGxlc3NpbmZvICQoVEFSR0VUX1NBTVBMRVMpL2dhcGxlc3MvMTAyNDAwc2FtcGxlc19xdC1sYy1hYWMubTRhCisKK0ZBVEVfR0FQTEVTU0VOQ19QUk9CRS0kKGNhbGwgRU5DREVDLCBBQUMsIE1PVikgKz0gZmF0ZS1nYXBsZXNzZW5jLWl0dW5lcy10by1pcG9kLWFhYworZmF0ZS1nYXBsZXNzZW5jLWl0dW5lcy10by1pcG9kLWFhYzogZmZwcm9iZSQoUFJPR1NTVUYpJChFWEVTVUYpCitmYXRlLWdhcGxlc3NlbmMtaXR1bmVzLXRvLWlwb2QtYWFjOiBDTUQgPSBnYXBsZXNzZW5jICQoVEFSR0VUX1NBTVBMRVMpL2dhcGxlc3MvMTAyNDAwc2FtcGxlc19xdC1sYy1hYWMubTRhIGlwb2QgYWFjCisKK0ZBVEVfR0FQTEVTU0VOQ19QUk9CRS0kKGNhbGwgRU5DREVDLCBBQUMsIE1PVikgKz0gZmF0ZS1nYXBsZXNzZW5jLXBjbS10by1tb3YtYWFjCitmYXRlLWdhcGxlc3NlbmMtcGNtLXRvLW1vdi1hYWM6ICQoQVJFRikKK2ZhdGUtZ2FwbGVzc2VuYy1wY20tdG8tbW92LWFhYzogZmZwcm9iZSQoUFJPR1NTVUYpJChFWEVTVUYpCitmYXRlLWdhcGxlc3NlbmMtcGNtLXRvLW1vdi1hYWM6IENNRCA9IGdhcGxlc3NlbmMgJChBUkVGKSBtb3YgYWFjCisKK0ZBVEVfR0FQTEVTU0lORk8tJChDT05GSUdfRkZQUk9CRSkgPSAkKEZBVEVfR0FQTEVTU0lORk9fUFJPQkUteWVzKQorRkFURV9HQVBMRVNTSU5GTyA9ICQoRkFURV9HQVBMRVNTSU5GTy15ZXMpCisKK0ZBVEVfR0FQTEVTU0VOQy0kKENPTkZJR19GRlBST0JFKSA9ICQoRkFURV9HQVBMRVNTRU5DX1BST0JFLXllcykKK0ZBVEVfR0FQTEVTU0VOQyA9ICQoRkFURV9HQVBMRVNTRU5DLXllcykKKwogRkFURV9TQU1QTEVTX0FWQ09OViArPSAkKEZBVEVfR0FQTEVTUykKLWZhdGUtZ2FwbGVzczogJChGQVRFX0dBUExFU1MpCitGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9HQVBMRVNTSU5GTykKK0ZBVEVfU0FNUExFU19BVkNPTlYgKz0gJChGQVRFX0dBUExFU1NFTkMpCisKK2ZhdGUtZ2FwbGVzczogJChGQVRFX0dBUExFU1MpICQoRkFURV9HQVBMRVNTSU5GTykgJChGQVRFX0dBUExFU1NFTkMpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2dpZi5tYWsgYi90ZXN0cy9mYXRlL2dpZi5tYWsKaW5kZXggM2RjNTBiMy4uOWJkOTYzMSAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9naWYubWFrCisrKyBiL3Rlc3RzL2ZhdGUvZ2lmLm1hawpAQCAtMTAsNiArMTAsOSBAQAogRkFURV9HSUYgKz0gZmF0ZS1naWYtZ3JheQogZmF0ZS1naWYtZ3JheTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZ2lmL05ld3RvbnNfY3JhZGxlX2FuaW1hdGlvbl9ib29rXzIuZ2lmIC1waXhfZm10IGJncmEKIAorRkFURV9HSUYgKz0gZmF0ZS1naWYtZGVhbAorZmF0ZS1naWYtZGVhbDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZ2lmL2RlYWwuZ2lmIC12c3luYyBjZnIgLXBpeF9mbXQgYmdyYQorCiBmYXRlLWdpZmVuYyU6IGZhdGUtZ2lmLWNvbG9yCiBmYXRlLWdpZmVuYyU6IFBJWEZNVCA9ICQod29yZCAzLCAkKHN1YnN0IC0sICwkKEApKSkKIGZhdGUtZ2lmZW5jJTogU1JDID0gJChUQVJHRVRfU0FNUExFUykvZ2lmL3RjMjE3LmdpZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9oMjY0Lm1hayBiL3Rlc3RzL2ZhdGUvaDI2NC5tYWsKaW5kZXggNDYxNzhjZC4uMTgzOWI5YiAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9oMjY0Lm1haworKysgYi90ZXN0cy9mYXRlL2gyNjQubWFrCkBAIC0xOTEsMzQgKzE5MSw2NiBAQAogRkFURV9IMjY0ICA6PSAkKEZBVEVfSDI2NDolPWZhdGUtaDI2NC1jb25mb3JtYW5jZS0lKSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAkKEZBVEVfSDI2NF9SRUlOSVRfVEVTVFM6JT1mYXRlLWgyNjQtcmVpbml0LSUpICAgICAgICAgICAgXAogICAgICAgICAgICAgICBmYXRlLWgyNjQtZXh0cmVtZS1wbGFuZS1wcmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBmYXRlLWgyNjQtaW50cmEtcmVmcmVzaC1yZWNvdmVyeSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICBmYXRlLWgyNjQtbG9zc2xlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBmYXRlLWgyNjQtMzM4NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBmYXRlLWgyNjQtbWlzc2luZy1mcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICBmYXRlLWgyNjQtcmVmLXBpYy1tb2Qtb3ZlcmZsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCiBGQVRFX0gyNjQtJChjYWxsIERFTURFQywgSDI2NCwgSDI2NCkgKz0gJChGQVRFX0gyNjQpCiBGQVRFX0gyNjQtJChjYWxsIERFTURFQywgIE1PViwgSDI2NCkgKz0gZmF0ZS1oMjY0LWNyb3AtdG8tY29udGFpbmVyCisKKyMgdGhpcyBzYW1wbGUgaGFzIHR3byBzdHNkIGVudHJpZXMgYW5kIG5lZWRzIHRvIHJlbG9hZCBleHRyYWRhdGEKK0ZBVEVfSDI2NC0kKGNhbGwgREVNREVDLCAgTU9WLCBIMjY0KSArPSBmYXRlLWgyNjQtZXh0cmFkYXRhLXJlbG9hZAorCiBGQVRFX0gyNjQtJChjYWxsIERFTURFQywgIE1PViwgSDI2NCkgKz0gZmF0ZS1oMjY0LWludGVybGFjZS1jcm9wCi1GQVRFX0gyNjQtJChjYWxsIEFMTFlFUywgTU9WX0RFTVVYRVIgSDI2NF9NUDRUT0FOTkVYQl9CU0YpICs9IGZhdGUtaDI2NC1ic2YtbXA0dG9hbm5leGIKKworIyB0aGlzIHNhbXBsZSBoYXMgaW52YWxpZCByZWZlcmVuY2UgbGlzdCBtb2RpZmljYXRpb24sIGJ1dCBkZWNvZGVzIGZpbmUKKyMgYnkgdXNpbmcgYSBwcmV2aW91cyByZWYgZnJhbWUgaW5zdGVhZCBvZiBhIG1pc3Npbmcgb25lCitGQVRFX0gyNjQtJChjYWxsIERFTURFQywgIE1PViwgSDI2NCkgKz0gZmF0ZS1oMjY0LWludmFsaWQtcmVmLW1vZAorCisjIHRoaXMgc2FtcGxlIGdpdmVzIGFuIGV4cGxpY2l0IHNpemUgZm9yIGEgc2luZ2xlIE5BTCB1bml0LCBidXQgY29udGFpbnMKKyMgc2V2ZXJhbCBOQUwgdW5pdHMKK0ZBVEVfSDI2NC0kKGNhbGwgREVNREVDLCAgTU9WLCBIMjY0KSArPSBmYXRlLWgyNjQtbWl4ZWQtbmFsLWNvZGluZworCisjIHRoaXMgc2FtcGxlIGhhcyBpbnZhbGlkIGV4dHJhZGF0YSB0aGF0IGlzIG5vdCBlc2NhcGVkCitGQVRFX0gyNjQtJChjYWxsIERFTURFQywgIE1PViwgSDI2NCkgKz0gZmF0ZS1oMjY0LXVuZXNjYXBlZC1leHRyYWRhdGEKKworIyB0aGlzIHNhbXBsZSBjb250YWlucyBmaWVsZC1jb2RlZCBmcmFtZXMsIHdpdGggYm90aCBmaWVsZHMgaW4gYSBzaW5nbGUgcGFja2V0CitGQVRFX0gyNjQtJChjYWxsIERFTURFQywgIE1PViwgSDI2NCkgKz0gZmF0ZS1oMjY0LXR3b2ZpZWxkcy1wYWNrZXQKKworRkFURV9IMjY0LSQoY2FsbCBBTExZRVMsIE1PVl9ERU1VWEVSIEgyNjRfTVA0VE9BTk5FWEJfQlNGIEgyNjRfTVVYRVIpICs9IGZhdGUtaDI2NC1ic2YtbXA0dG9hbm5leGIKIEZBVEVfSDI2NC0kKGNhbGwgREVNREVDLCBNQVRST1NLQSwgSDI2NCkgKz0gZmF0ZS1oMjY0LWRpcmVjdC1iZmYKK0ZBVEVfSDI2NC0kKGNhbGwgREVNREVDLCBGTFYsIEgyNjQpICs9IGZhdGUtaDI2NC1icm9rZW5zcHMtMjU4MAorRkFURV9IMjY0LSQoY2FsbCBERU1ERUMsIE1YRiwgSDI2NCkgKz0gZmF0ZS1oMjY0LXhhdmMtNDM4OQorRkFURV9IMjY0LSQoY2FsbCBERU1ERUMsIE1PViwgSDI2NCkgKz0gZmF0ZS1oMjY0LWF0dGFjaG1lbnQtNjMxCitGQVRFX0gyNjQtJChjYWxsIERFTURFQywgTVBFR1RTLCBIMjY0KSArPSBmYXRlLWgyNjQtc2tpcC1ub2tleSBmYXRlLWgyNjQtc2tpcC1ub2ludHJhCitGQVRFX0gyNjRfRkZQUk9CRS0kKGNhbGwgREVNREVDLCBNQVRST1NLQSwgSDI2NCkgKz0gZmF0ZS1oMjY0LWR0c181ZnJhbWVzCiAKIEZBVEVfU0FNUExFU19BVkNPTlYgKz0gJChGQVRFX0gyNjQteWVzKQotZmF0ZS1oMjY0OiAkKEZBVEVfSDI2NC15ZXMpCitGQVRFX1NBTVBMRVNfRkZQUk9CRSArPSAkKEZBVEVfSDI2NF9GRlBST0JFLXllcykKK2ZhdGUtaDI2NDogJChGQVRFX0gyNjQteWVzKSAkKEZBVEVfSDI2NF9GRlBST0JFLXllcykKIAogZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWF1ZF9td19lOiAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL0FVRF9NV19FLjI2NAotZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWJhMV9mdF9jOiAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL0JBMV9GVF9DLjI2NAotZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWJhMV9zb255X2Q6ICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL0JBMV9Tb255X0QuanN2Ci1mYXRlLWgyNjQtY29uZm9ybWFuY2UtYmEyX3NvbnlfZjogICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC12c3luYyBkcm9wIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQkEyX1NvbnlfRi5qc3YKLWZhdGUtaDI2NC1jb25mb3JtYW5jZS1iYTNfc3ZhX2M6ICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQTNfU1ZBX0MuMjY0Ci1mYXRlLWgyNjQtY29uZm9ybWFuY2UtYmFfbXdfZDogICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC12c3luYyBkcm9wIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQkFfTVdfRC4yNjQKLWZhdGUtaDI2NC1jb25mb3JtYW5jZS1iYW1xMV9qdmNfYzogICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQU1RMV9KVkNfQy4yNjQKLWZhdGUtaDI2NC1jb25mb3JtYW5jZS1iYW1xMl9qdmNfYzogICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQU1RMl9KVkNfQy4yNjQKLWZhdGUtaDI2NC1jb25mb3JtYW5jZS1iYW5tX213X2Q6ICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQU5NX01XX0QuMjY0Ci1mYXRlLWgyNjQtY29uZm9ybWFuY2UtYmFzcXAxX3NvbnlfYzogICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC12c3luYyBkcm9wIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQkFTUVAxX1NvbnlfQy5qc3YKLWZhdGUtaDI2NC1jb25mb3JtYW5jZS1jYWJhMV9zb255X2Q6ICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9DQUJBMV9Tb255X0QuanN2Ci1mYXRlLWgyNjQtY29uZm9ybWFuY2UtY2FiYTFfc3ZhX2I6ICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC12c3luYyBkcm9wIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQ0FCQTFfU1ZBX0IuMjY0Ci1mYXRlLWgyNjQtY29uZm9ybWFuY2UtY2FiYTJfc29ueV9lOiAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC12c3luYyBkcm9wIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQ0FCQTJfU29ueV9FLmpzdgotZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWNhYmEyX3N2YV9iOiAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL0NBQkEyX1NWQV9CLjI2NAotZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWNhYmEzX3NvbnlfYzogICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL0NBQkEzX1NvbnlfQy5qc3YKLWZhdGUtaDI2NC1jb25mb3JtYW5jZS1jYWJhM19zdmFfYjogICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9DQUJBM19TVkFfQi4yNjQKLWZhdGUtaDI2NC1jb25mb3JtYW5jZS1jYWJhM190b3NoaWJhX2U6ICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9DQUJBM19UT1NISUJBX0UuMjY0CisKKyNmb3JjZSBmcmFtZXJhdGUgc28gdGhhdCB0aGUgb3B0aW9uIGlzIHRlc3RlZCwgdGhlcmVzIG5vIG90aGVyIGNhc2UgdGhhdCB0ZXN0cyBpdCwgaXRzIG5vdCBuZWVkZWQgYXQgYWxsIG90aGVyd2lzZSBoZXJlCitmYXRlLWgyNjQtY29uZm9ybWFuY2UtYmExX2Z0X2M6ICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1mcmFtZXJhdGUgMTkgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQTFfRlRfQy4yNjQKKworZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWJhMV9zb255X2Q6ICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL0JBMV9Tb255X0QuanN2CitmYXRlLWgyNjQtY29uZm9ybWFuY2UtYmEyX3NvbnlfZjogICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQkEyX1NvbnlfRi5qc3YKK2ZhdGUtaDI2NC1jb25mb3JtYW5jZS1iYTNfc3ZhX2M6ICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQTNfU1ZBX0MuMjY0CitmYXRlLWgyNjQtY29uZm9ybWFuY2UtYmFfbXdfZDogICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQkFfTVdfRC4yNjQKK2ZhdGUtaDI2NC1jb25mb3JtYW5jZS1iYW1xMV9qdmNfYzogICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQU1RMV9KVkNfQy4yNjQKK2ZhdGUtaDI2NC1jb25mb3JtYW5jZS1iYW1xMl9qdmNfYzogICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQU1RMl9KVkNfQy4yNjQKK2ZhdGUtaDI2NC1jb25mb3JtYW5jZS1iYW5tX213X2Q6ICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9CQU5NX01XX0QuMjY0CitmYXRlLWgyNjQtY29uZm9ybWFuY2UtYmFzcXAxX3NvbnlfYzogICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQkFTUVAxX1NvbnlfQy5qc3YKK2ZhdGUtaDI2NC1jb25mb3JtYW5jZS1jYWJhMV9zb255X2Q6ICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9DQUJBMV9Tb255X0QuanN2CitmYXRlLWgyNjQtY29uZm9ybWFuY2UtY2FiYTFfc3ZhX2I6ICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQ0FCQTFfU1ZBX0IuMjY0CitmYXRlLWgyNjQtY29uZm9ybWFuY2UtY2FiYTJfc29ueV9lOiAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvQ0FCQTJfU29ueV9FLmpzdgorZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWNhYmEyX3N2YV9iOiAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL0NBQkEyX1NWQV9CLjI2NAorZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWNhYmEzX3NvbnlfYzogICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL0NBQkEzX1NvbnlfQy5qc3YKK2ZhdGUtaDI2NC1jb25mb3JtYW5jZS1jYWJhM19zdmFfYjogICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9DQUJBM19TVkFfQi4yNjQKK2ZhdGUtaDI2NC1jb25mb3JtYW5jZS1jYWJhM190b3NoaWJhX2U6ICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9DQUJBM19UT1NISUJBX0UuMjY0CiBmYXRlLWgyNjQtY29uZm9ybWFuY2UtY2FiYWNfbW90X2ZsZDBfZnVsbDogICAgICAgIENNRCA9IGZyYW1lY3JjIC12c3luYyBkcm9wIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvY2FtcF9tb3RfZmxkMF9mdWxsLjI2bAogZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLWNhYmFjX21vdF9mcm0wX2Z1bGw6ICAgICAgICBDTUQgPSBmcmFtZWNyYyAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL2NhbXBfbW90X2ZybTBfZnVsbC4yNmwKIGZhdGUtaDI2NC1jb25mb3JtYW5jZS1jYWJhY19tb3RfbWJhZmYwX2Z1bGw6ICAgICAgQ01EID0gZnJhbWVjcmMgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC1jb25mb3JtYW5jZS9jYW1wX21vdF9tYmFmZjBfZnVsbC4yNmwKQEAgLTM4NywxMSArNDE5LDI4IEBACiBmYXRlLWgyNjQtY29uZm9ybWFuY2Utc3ZhX25sMV9iOiAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC12c3luYyBkcm9wIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQtY29uZm9ybWFuY2UvU1ZBX05MMV9CLjI2NAogZmF0ZS1oMjY0LWNvbmZvcm1hbmNlLXN2YV9ubDJfZTogICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0LWNvbmZvcm1hbmNlL1NWQV9OTDJfRS4yNjQKIAotZmF0ZS1oMjY0LWJzZi1tcDR0b2FubmV4YjogICAgICAgICAgICAgICAgICAgICAgICBDTUQgPSBtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC9pbnRlcmxhY2VkX2Nyb3AubXA0IC12Y29kZWMgY29weSAtYnNmIGgyNjRfbXA0dG9hbm5leGIgLWYgaDI2NAorZmF0ZS1oMjY0LWJzZi1tcDR0b2FubmV4YjogICAgICAgICAgICAgICAgICAgICAgICBDTUQgPSBtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC9pbnRlcmxhY2VkX2Nyb3AubXA0IC1jOnYgY29weSAtZiBoMjY0CisKIGZhdGUtaDI2NC1jcm9wLXRvLWNvbnRhaW5lcjogICAgICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC9jcm9wLXRvLWNvbnRhaW5lci1kaW1zLWNhbm9uLm1vdgotZmF0ZS1oMjY0LWV4dHJlbWUtcGxhbmUtcHJlZDogICAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZW1kNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2V4dHJlbWUtcGxhbmUtcHJlZC5oMjY0Ci1mYXRlLWgyNjQtaW50ZXJsYWNlLWNyb3A6ICAgICAgICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvaW50ZXJsYWNlZF9jcm9wLm1wNCAtdmZyYW1lcyAzCi1mYXRlLWgyNjQtbG9zc2xlc3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvbG9zc2xlc3MuaDI2NAogZmF0ZS1oMjY0LWRpcmVjdC1iZmY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2RpcmVjdC1iZmYubWt2CitmYXRlLWgyNjQtZXh0cmFkYXRhLXJlbG9hZDogICAgICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvZXh0cmFkYXRhLXJlbG9hZC1tdWx0aS1zdHNkLm1vdgorZmF0ZS1oMjY0LWV4dHJlbWUtcGxhbmUtcHJlZDogICAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZW1kNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2V4dHJlbWUtcGxhbmUtcHJlZC5oMjY0CitmYXRlLWgyNjQtaW50ZXJsYWNlLWNyb3A6ICAgICAgICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvaW50ZXJsYWNlZF9jcm9wLm1wNCAtZnJhbWVzOnYgMworZmF0ZS1oMjY0LWJyb2tlbnNwcy0yNTgwOiAgICAgICAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2Jyb2tlbnNwcy5mbHYgLXZmIGZvcm1hdD15dXY0MjBwLHNjYWxlPXc9MTkyOmg9MTQ0IC1zd3NfZmxhZ3MgYml0ZXhhY3QrYmlsaW5lYXIKK2ZhdGUtaDI2NC14YXZjLTQzODk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC9Tb255WEFWQ19Mb25nR09QX2dyZWVuX3BpeGVsYXRpb25fZWFybHlfRnJhbWVzLk1YRiAtcGl4X2ZtdCB5dXY0MjJwMTBsZQorZmF0ZS1oMjY0LWF0dGFjaG1lbnQtNjMxOiAgICAgICAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2F0dGFjaG1lbnQ2MzEtc21hbGwubXA0IC1hbiAtbWF4X2Vycm9yX3JhdGUgMC45NgorZmF0ZS1oMjY0LXNraXAtbm9rZXk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtc2tpcF9mcmFtZSBub2tleSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2gyNjRfaW50cmFfZmlyc3Qtc21hbGwudHMKK2ZhdGUtaDI2NC1za2lwLW5vaW50cmE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLXNraXBfZnJhbWUgbm9pbnRyYSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2gyNjRfaW50cmFfZmlyc3Qtc21hbGwudHMKK2ZhdGUtaDI2NC1pbnRyYS1yZWZyZXNoLXJlY292ZXJ5OiAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC9pbnRyYV9yZWZyZXNoLmgyNjQgLWZyYW1lczp2IDEwCitmYXRlLWgyNjQtaW52YWxpZC1yZWYtbW9kOiAgICAgICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvaDI2NHJlZmZyYW1lcmVncmVzc2lvbi5tcDQgLWFuIC1mcmFtZXMgMTAgLXBpeF9mbXQgeXV2NDIwcDEwbGUKK2ZhdGUtaDI2NC1sb3NzbGVzczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC9sb3NzbGVzcy5oMjY0CitmYXRlLWgyNjQtbWl4ZWQtbmFsLWNvZGluZzogICAgICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvbWl4ZWQtbmFsLWNvZGluZy5tcDQKK2ZhdGUtaDI2NC1yZWYtcGljLW1vZC1vdmVyZmxvdzogICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC9yZWYtcGljLW1vZC1vdmVyZmxvdy5oMjY0CitmYXRlLWgyNjQtdHdvZmllbGRzLXBhY2tldDogICAgICAgICAgICAgICAgICAgICAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvdHdvZmllbGRzX3BhY2tldC5tcDQgLWFuIC1mcmFtZXMgMzAKK2ZhdGUtaDI2NC11bmVzY2FwZWQtZXh0cmFkYXRhOiAgICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC91bmVzY2FwZWRfZXh0cmFkYXRhLm1wNCAtYW4gLWZyYW1lcyAxMAorZmF0ZS1oMjY0LTMzODY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2JiYzIuc2FtcGxlLmgyNjQKK2ZhdGUtaDI2NC1taXNzaW5nLWZyYW1lOiAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC9ub25kZXRlcm1pbmlzdGljX2N1dC5oMjY0CiAKIGZhdGUtaDI2NC1yZWluaXQtJTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC8kKEA6ZmF0ZS1oMjY0LSU9JSkuaDI2NCAtdmYgZm9ybWF0PXl1djQ0NHAxMGxlLHNjYWxlPXc9MzUyOmg9Mjg4CisKK2ZhdGUtaDI2NC1kdHNfNWZyYW1lczogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01EID0gcHJvYmVmcmFtZXMgJChUQVJHRVRfU0FNUExFUykvaDI2NC9kdHNfNWZyYW1lcy5ta3YKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvaGFwLm1hayBiL3Rlc3RzL2ZhdGUvaGFwLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzVhNjAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9oYXAubWFrCkBAIC0wLDAgKzEsODkgQEAKK0ZBVEVfSEFQICs9IGZhdGUtaGFwMQorZmF0ZS1oYXAxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oYXAvaGFwMS5tb3YKKworRkFURV9IQVAgKz0gZmF0ZS1oYXA1CitmYXRlLWhhcDU6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2hhcC9oYXA1Lm1vdgorCitGQVRFX0hBUCArPSBmYXRlLWhhcHkKK2ZhdGUtaGFweTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL2hhcHkubW92CisKK0ZBVEVfSEFQICs9IGZhdGUtaGFwLWNodW5rCitmYXRlLWhhcC1jaHVuazogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL2hhcHktMTItY2h1bmtzLm1vdgorCitGQVRFX0hBUCArPSBmYXRlLWhhcHFhLW5vc25hcHB5LTEyN3g3MQorZmF0ZS1oYXBxYS1ub3NuYXBweS0xMjd4NzE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2hhcC9IQVBRQV9Ob1NuYXBweV8xMjd4MS5tb3YKKworRkFURV9IQVAgKz0gZmF0ZS1oYXBxYS1zbmFwcHkxLTEyN3g3MQorZmF0ZS1oYXBxYS1zbmFwcHkxLTEyN3g3MTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL0hBUFFBX1NuYXBweV8xY2h1bmtfMTI3eDEubW92CisKK0ZBVEVfSEFQICs9IGZhdGUtaGFwcWEtc25hcHB5MTYtMTI3eDcxCitmYXRlLWhhcHFhLXNuYXBweTE2LTEyN3g3MTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL0hBUFFBX1NuYXBweV8xNmNodW5rXzEyN3gxLm1vdgorCitGQVRFX0hBUCArPSBmYXRlLWhhcC1hbHBoYS1vbmx5LW5vc25hcHB5LTEyOHg3MgorZmF0ZS1oYXAtYWxwaGEtb25seS1ub3NuYXBweS0xMjh4NzI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2hhcC9IYXBBbHBoYU9ubHlfTm9TbmFwcHlfMTI4eDcyLm1vdiAtcGl4X2ZtdCBncmF5OAorCitGQVRFX0hBUCArPSBmYXRlLWhhcC1hbHBoYS1vbmx5LXNuYXBweS0xMjd4NzEKK2ZhdGUtaGFwLWFscGhhLW9ubHktc25hcHB5LTEyN3g3MTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL0hhcEFscGhhT25seV9zbmFwcHkxY2h1bmtfMTI3eDcxLm1vdiAtcGl4X2ZtdCBncmF5OAorCitGQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIE1PViwgSEFQKSArPSAkKEZBVEVfSEFQKQorZmF0ZS1oYXA6ICQoRkFURV9IQVApCisKKworI1Rlc3QgYnNmIGNvbnZlcnNpb24KK0ZBVEVfSEFQUUFfRVhUUkFDVF9CU0YgKz0gZmF0ZS1oYXBxYS1leHRyYWN0LXNuYXBweTEtdG8taGFwcQorZmF0ZS1oYXBxYS1leHRyYWN0LXNuYXBweTEtdG8taGFwcTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL0hBUFFBX1NuYXBweV8xY2h1bmtfMTI3eDEubW92IC1jOnYgY29weSAtYnNmOnYgaGFwcWFfZXh0cmFjdD10ZXh0dXJlPWNvbG9yIC10YWc6diBIYXBZIC1tZXRhZGF0YTpzOnY6MCBlbmNvZGVyPSJIQVBRIgorCitGQVRFX0hBUFFBX0VYVFJBQ1RfQlNGICs9IGZhdGUtaGFwcWEtZXh0cmFjdC1zbmFwcHkxNi10by1oYXBxCitmYXRlLWhhcHFhLWV4dHJhY3Qtc25hcHB5MTYtdG8taGFwcTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL0hBUFFBX1NuYXBweV8xNmNodW5rXzEyN3gxLm1vdiAtYzp2IGNvcHkgLWJzZjp2IGhhcHFhX2V4dHJhY3Q9dGV4dHVyZT1jb2xvciAtdGFnOnYgSGFwWSAtbWV0YWRhdGE6czp2OjAgZW5jb2Rlcj0iSEFQUSIKKworRkFURV9IQVBRQV9FWFRSQUNUX0JTRiArPSBmYXRlLWhhcHFhLWV4dHJhY3Qtc25hcHB5MS10by1oYXBhbHBoYW9ubHkKK2ZhdGUtaGFwcWEtZXh0cmFjdC1zbmFwcHkxLXRvLWhhcGFscGhhb25seTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL0hBUFFBX1NuYXBweV8xY2h1bmtfMTI3eDEubW92IC1jOnYgY29weSAtYnNmOnYgaGFwcWFfZXh0cmFjdD10ZXh0dXJlPWFscGhhIC10YWc6diBIYXBBIC1tZXRhZGF0YTpzOnY6MCBlbmNvZGVyPSJIQVBBbHBoYU9ubHkiCisKK0ZBVEVfSEFQUUFfRVhUUkFDVF9CU0YgKz0gZmF0ZS1oYXBxYS1leHRyYWN0LXNuYXBweTE2LXRvLWhhcGFscGhhb25seQorZmF0ZS1oYXBxYS1leHRyYWN0LXNuYXBweTE2LXRvLWhhcGFscGhhb25seTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL0hBUFFBX1NuYXBweV8xNmNodW5rXzEyN3gxLm1vdiAtYzp2IGNvcHkgLWJzZjp2IGhhcHFhX2V4dHJhY3Q9dGV4dHVyZT1hbHBoYSAtdGFnOnYgSGFwQSAtbWV0YWRhdGE6czp2OjAgZW5jb2Rlcj0iSEFQQWxwaGFPbmx5IgorCisKKyNUZXN0IGJzZiBjb252ZXJzaW9uIGFuZCBtb3YKK3Rlc3RzL2RhdGEvaGFwcV9ub3NuYXBweS5tb3Y6IFRBRyA9IEdFTgordGVzdHMvZGF0YS9oYXBxX25vc25hcHB5Lm1vdjogZmZtcGVnJChQUk9HU1NVRikkKEVYRVNVRikgfCB0ZXN0cy9kYXRhCisJJChNKSQoVEFSR0VUX0VYRUMpICQoVEFSR0VUX1BBVEgpLyQ8IFwKKwktaSAkKFRBUkdFVF9TQU1QTEVTKS9oYXAvSEFQUUFfTm9TbmFwcHlfMTI3eDEubW92IC1ub3N0ZGluIC1jOnYgY29weSAtYnNmOnYgaGFwcWFfZXh0cmFjdD10ZXh0dXJlPWNvbG9yIFwKKyAgICAgICAgLXRhZzp2IEhhcFkgLW1ldGFkYXRhOnM6djowIGVuY29kZXI9IkhBUFEiICQoVEFSR0VUX1BBVEgpLyRAIC15IDI+L2Rldi9udWxsCisKK3Rlc3RzL2RhdGEvaGFwYWxwaGFvbmx5X25vc25hcHB5Lm1vdjogVEFHID0gR0VOCit0ZXN0cy9kYXRhL2hhcGFscGhhb25seV9ub3NuYXBweS5tb3Y6IGZmbXBlZyQoUFJPR1NTVUYpJChFWEVTVUYpIHwgdGVzdHMvZGF0YQorCSQoTSkkKFRBUkdFVF9FWEVDKSAkKFRBUkdFVF9QQVRIKS8kPCBcCisJLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL0hBUFFBX05vU25hcHB5XzEyN3gxLm1vdiAtbm9zdGRpbiAtYzp2IGNvcHkgLWJzZjp2IGhhcHFhX2V4dHJhY3Q9dGV4dHVyZT1hbHBoYSBcCisgICAgICAgIC10YWc6diBIYXBBIC1tZXRhZGF0YTpzOnY6MCBlbmNvZGVyPSJIQVBBbHBoYSBPbmx5IiAkKFRBUkdFVF9QQVRIKS8kQCAteSAyPi9kZXYvbnVsbAorCisKK0ZBVEVfSEFQUUFfRVhUUkFDVF9CU0ZfRkZQUk9CRSArPSBmYXRlLWhhcHFhLWV4dHJhY3Qtbm9zbmFwcHktdG8taGFwcS1tb3YKK2ZhdGUtaGFwcWEtZXh0cmFjdC1ub3NuYXBweS10by1oYXBxLW1vdjogdGVzdHMvZGF0YS9oYXBxX25vc25hcHB5Lm1vdgorZmF0ZS1oYXBxYS1leHRyYWN0LW5vc25hcHB5LXRvLWhhcHEtbW92OiBDTUQgPSBydW4gZmZwcm9iZSQoUFJPR1NTVUYpJChFWEVTVUYpIC1zaG93X3BhY2tldHMgLXNob3dfZGF0YV9oYXNoIGFkbGVyMzIgLXNob3dfc3RyZWFtcyAtc2VsZWN0X3N0cmVhbXMgdiAtdiAwICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvaGFwcV9ub3NuYXBweS5tb3YKKworRkFURV9IQVBRQV9FWFRSQUNUX0JTRl9GRlBST0JFICs9IGZhdGUtaGFwcWEtZXh0cmFjdC1ub3NuYXBweS10by1oYXBhbHBoYW9ubHktbW92CitmYXRlLWhhcHFhLWV4dHJhY3Qtbm9zbmFwcHktdG8taGFwYWxwaGFvbmx5LW1vdjogdGVzdHMvZGF0YS9oYXBhbHBoYW9ubHlfbm9zbmFwcHkubW92CitmYXRlLWhhcHFhLWV4dHJhY3Qtbm9zbmFwcHktdG8taGFwYWxwaGFvbmx5LW1vdjogQ01EID0gcnVuIGZmcHJvYmUkKFBST0dTU1VGKSQoRVhFU1VGKSAtc2hvd19wYWNrZXRzIC1zaG93X2RhdGFfaGFzaCBhZGxlcjMyIC1zaG93X3N0cmVhbXMgLXNlbGVjdF9zdHJlYW1zIHYgLXYgMCAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2hhcGFscGhhb25seV9ub3NuYXBweS5tb3YKKworCitGQVRFX1NBTVBMRVNfRkZNUEVHLSQoY2FsbCBBTExZRVMsIE1PVl9ERU1VWEVSIEhBUFFBX0VYVFJBQ1RfQlNGIE1PVl9NVVhFUikgKz0gJChGQVRFX0hBUFFBX0VYVFJBQ1RfQlNGKQorRkFURV9TQU1QTEVTX0ZGUFJPQkUgKz0gJChGQVRFX0hBUFFBX0VYVFJBQ1RfQlNGX0ZGUFJPQkUpCisKK2ZhdGUtaGFwcWEtZXh0cmFjdC1ic2Y6ICQoRkFURV9IQVBRQV9FWFRSQUNUX0JTRikgJChGQVRFX0hBUFFBX0VYVFJBQ1RfQlNGX0ZGUFJPQkUpCisKKworZmF0ZS1oYXBlbmMlOiBDTUQgPSBmcmFtZW1kNSAtZiBpbWFnZTIgLWM6diBwZ215dXYgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvdnN5bnRoMS8lMDJkLnBnbSAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXZmcmFtZXMgNSAtYzp2IGhhcCAke09QVFN9CisKK0ZBVEVfSEFQRU5DICs9IGZhdGUtaGFwZW5jLWhhcC1ub25lCitmYXRlLWhhcGVuYy1oYXAtbm9uZTogT1BUUyA9IC1waXhfZm10IHJnYmEgLWZvcm1hdCBoYXAgLWNvbXByZXNzb3Igbm9uZQorCitGQVRFX0hBUEVOQyArPSBmYXRlLWhhcGVuYy1oYXBhLW5vbmUKK2ZhdGUtaGFwZW5jLWhhcGEtbm9uZTogT1BUUyA9IC1waXhfZm10IHJnYmEgLWZvcm1hdCBoYXBfYWxwaGEgLWNvbXByZXNzb3Igbm9uZQorCitGQVRFX0hBUEVOQyArPSBmYXRlLWhhcGVuYy1oYXBxLW5vbmUKK2ZhdGUtaGFwZW5jLWhhcHEtbm9uZTogT1BUUyA9IC1waXhfZm10IHJnYmEgLWZvcm1hdCBoYXBfcSAtY29tcHJlc3NvciBub25lCisKKyQoRkFURV9IQVBFTkMpOiAkKFZSRUYpCisKK0ZBVEVfQVZDT05WLSQoY2FsbCBFTkNNVVgsIEhBUCwgTU9WKSArPSAkKEZBVEVfSEFQRU5DKQorZmF0ZS1oYXBlbmM6ICQoRkFURV9IQVBFTkMpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2hldmMubWFrIGIvdGVzdHMvZmF0ZS9oZXZjLm1hawppbmRleCAwNTI2NmNkLi4xODQzNDllIDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL2hldmMubWFrCisrKyBiL3Rlc3RzL2ZhdGUvaGV2Yy5tYWsKQEAgLTE2OCw2ICsxNjgsNyBAQAogSEVWQ19TQU1QTEVTXzQ0NF8xMkJJVCA9ICAgICAgICBcCiAgICAgSVBDTV9CX1JFeHRfTkVDICAgICAgICAgICAgIFwKICAgICBQRVJTSVNUX1JQQVJBTV9BX1JFeHRfU29ueV8xXAorICAgIFBFUlNJU1RfUlBBUkFNX0FfUkV4dF9Tb255XzNcCiAgICAgU0FPX0FfUkV4dF9NZWRpYVRla18xICAgICAgIFwKIAogCkBAIC0xODcsMzIgKzE4OCwzMiBAQAogCiBkZWZpbmUgRkFURV9IRVZDX1RFU1QKIEZBVEVfSEVWQyArPSBmYXRlLWhldmMtY29uZm9ybWFuY2UtJCgxKQotZmF0ZS1oZXZjLWNvbmZvcm1hbmNlLSQoMSk6IENNRCA9IGZyYW1lY3JjIC1mbGFncyB1bmFsaWduZWQgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaGV2Yy1jb25mb3JtYW5jZS8kKDEpLmJpdAorZmF0ZS1oZXZjLWNvbmZvcm1hbmNlLSQoMSk6IENNRCA9IGZyYW1lY3JjIC1mbGFncyB1bmFsaWduZWQgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaGV2Yy1jb25mb3JtYW5jZS8kKDEpLmJpdCAtcGl4X2ZtdCB5dXY0MjBwCiBlbmRlZgogCiBkZWZpbmUgRkFURV9IRVZDX1RFU1RfMTBCSVQKIEZBVEVfSEVWQyArPSBmYXRlLWhldmMtY29uZm9ybWFuY2UtJCgxKQotZmF0ZS1oZXZjLWNvbmZvcm1hbmNlLSQoMSk6IENNRCA9IGZyYW1lY3JjIC1mbGFncyB1bmFsaWduZWQgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaGV2Yy1jb25mb3JtYW5jZS8kKDEpLmJpdCAtcGl4X2ZtdCB5dXY0MjBwMTBsZQorZmF0ZS1oZXZjLWNvbmZvcm1hbmNlLSQoMSk6IENNRCA9IGZyYW1lY3JjIC1mbGFncyB1bmFsaWduZWQgLWkgJChUQVJHRVRfU0FNUExFUykvaGV2Yy1jb25mb3JtYW5jZS8kKDEpLmJpdCAtcGl4X2ZtdCB5dXY0MjBwMTBsZQogZW5kZWYKIAogZGVmaW5lIEZBVEVfSEVWQ19URVNUXzQyMl8xMEJJVAogRkFURV9IRVZDICs9IGZhdGUtaGV2Yy1jb25mb3JtYW5jZS0kKDEpCi1mYXRlLWhldmMtY29uZm9ybWFuY2UtJCgxKTogQ01EID0gZnJhbWVjcmMgLWZsYWdzIHVuYWxpZ25lZCAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oZXZjLWNvbmZvcm1hbmNlLyQoMSkuYml0IC1waXhfZm10IHl1djQyMnAxMGxlCitmYXRlLWhldmMtY29uZm9ybWFuY2UtJCgxKTogQ01EID0gZnJhbWVjcmMgLWZsYWdzIHVuYWxpZ25lZCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oZXZjLWNvbmZvcm1hbmNlLyQoMSkuYml0IC1waXhfZm10IHl1djQyMnAxMGxlCiBlbmRlZgogCiBkZWZpbmUgRkFURV9IRVZDX1RFU1RfNDIyXzEwQklOCiBGQVRFX0hFVkMgKz0gZmF0ZS1oZXZjLWNvbmZvcm1hbmNlLSQoMSkKLWZhdGUtaGV2Yy1jb25mb3JtYW5jZS0kKDEpOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgdW5hbGlnbmVkIC12c3luYyBkcm9wIC1pICQoVEFSR0VUX1NBTVBMRVMpL2hldmMtY29uZm9ybWFuY2UvJCgxKS5iaW4gLXBpeF9mbXQgeXV2NDIycDEwbGUKK2ZhdGUtaGV2Yy1jb25mb3JtYW5jZS0kKDEpOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgdW5hbGlnbmVkIC1pICQoVEFSR0VUX1NBTVBMRVMpL2hldmMtY29uZm9ybWFuY2UvJCgxKS5iaW4gLXBpeF9mbXQgeXV2NDIycDEwbGUKIGVuZGVmCiAKIGRlZmluZSBGQVRFX0hFVkNfVEVTVF80NDRfOEJJVAogRkFURV9IRVZDICs9IGZhdGUtaGV2Yy1jb25mb3JtYW5jZS0kKDEpCi1mYXRlLWhldmMtY29uZm9ybWFuY2UtJCgxKTogQ01EID0gZnJhbWVjcmMgLWZsYWdzIHVuYWxpZ25lZCAtdnN5bmMgZHJvcCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oZXZjLWNvbmZvcm1hbmNlLyQoMSkuYml0CitmYXRlLWhldmMtY29uZm9ybWFuY2UtJCgxKTogQ01EID0gZnJhbWVjcmMgLWZsYWdzIHVuYWxpZ25lZCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oZXZjLWNvbmZvcm1hbmNlLyQoMSkuYml0IC1waXhfZm10IHl1djQ0NHAKIGVuZGVmCiAKIGRlZmluZSBGQVRFX0hFVkNfVEVTVF80NDRfMTJCSVQKIEZBVEVfSEVWQyArPSBmYXRlLWhldmMtY29uZm9ybWFuY2UtJCgxKQotZmF0ZS1oZXZjLWNvbmZvcm1hbmNlLSQoMSk6IENNRCA9IGZyYW1lY3JjIC1mbGFncyB1bmFsaWduZWQgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvaGV2Yy1jb25mb3JtYW5jZS8kKDEpLmJpdCAtcGl4X2ZtdCB5dXY0NDRwMTJsZQorZmF0ZS1oZXZjLWNvbmZvcm1hbmNlLSQoMSk6IENNRCA9IGZyYW1lY3JjIC1mbGFncyB1bmFsaWduZWQgLWkgJChUQVJHRVRfU0FNUExFUykvaGV2Yy1jb25mb3JtYW5jZS8kKDEpLmJpdCAtcGl4X2ZtdCB5dXY0NDRwMTJsZQogZW5kZWYKIAogJChmb3JlYWNoIE4sJChIRVZDX1NBTVBMRVMpLCQoZXZhbCAkKGNhbGwgRkFURV9IRVZDX1RFU1QsJChOKSkpKQpAQCAtMjI1LDggKzIyNiwzMSBAQAogZmF0ZS1oZXZjLXBhcmFtY2hhbmdlLXl1djQyMHAteXV2NDIwcDEwOiBDTUQgPSBmcmFtZWNyYyAtdnN5bmMgMCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oZXZjL3BhcmFtY2hhbmdlX3l1djQyMHBfeXV2NDIwcDEwLmhldmMgLXN3c19mbGFncyBhcmVhK2FjY3VyYXRlX3JuZCtiaXRleGFjdAogRkFURV9IRVZDICs9IGZhdGUtaGV2Yy1wYXJhbWNoYW5nZS15dXY0MjBwLXl1djQyMHAxMAogCitmYXRlLWhldmMtcGFpcmVkLWZpZWxkczogQ01EID0gcHJvYmVmcmFtZXMgLXNob3dfZW50cmllcyBmcmFtZT1pbnRlcmxhY2VkX2ZyYW1lLHRvcF9maWVsZF9maXJzdCAkKFRBUkdFVF9TQU1QTEVTKS9oZXZjL3BhaXJlZF9maWVsZHMuaGV2YworRkFURV9IRVZDX0ZGUFJPQkUtJChjYWxsIERFTURFQywgSEVWQywgSEVWQykgKz0gZmF0ZS1oZXZjLXBhaXJlZC1maWVsZHMKKwordGVzdHMvZGF0YS9oZXZjLW1wNC5tb3Y6IFRBRyA9IEdFTgordGVzdHMvZGF0YS9oZXZjLW1wNC5tb3Y6IGZmbXBlZyQoUFJPR1NTVUYpJChFWEVTVUYpIHwgdGVzdHMvZGF0YQorCSQoTSkkKFRBUkdFVF9FWEVDKSAkKFRBUkdFVF9QQVRIKS8kPCBcCisJLWkgJChUQVJHRVRfU0FNUExFUykvaGV2Yy1jb25mb3JtYW5jZS9XUFBfQV9lcmljc3Nvbl9NQUlOMTBfMi5iaXQgLWMgY29weSAtZmxhZ3MgK2JpdGV4YWN0ICQoVEFSR0VUX1BBVEgpLyRAIC15IDI+L2Rldi9udWxsCisKK0ZBVEVfSEVWQy0kKGNhbGwgQUxMWUVTLCBIRVZDX0RFTVVYRVIgTU9WX0RFTVVYRVIgSEVWQ19NUDRUT0FOTkVYQl9CU0YgTU9WX01VWEVSIEhFVkNfTVVYRVIpICs9IGZhdGUtaGV2Yy1ic2YtbXA0dG9hbm5leGIKK2ZhdGUtaGV2Yy1ic2YtbXA0dG9hbm5leGI6IHRlc3RzL2RhdGEvaGV2Yy1tcDQubW92CitmYXRlLWhldmMtYnNmLW1wNHRvYW5uZXhiOiBDTUQgPSBtZDUgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9oZXZjLW1wNC5tb3YgLWM6diBjb3B5IC1mZmxhZ3MgK2JpdGV4YWN0IC1mIGhldmMKK2ZhdGUtaGV2Yy1ic2YtbXA0dG9hbm5leGI6IENNUCA9IG9uZWxpbmUKK2ZhdGUtaGV2Yy1ic2YtbXA0dG9hbm5leGI6IFJFRiA9IDE4NzM2NjJhM2FmMTg0OGMzN2U0ZWIyNTcyMmM4ZGY5CisKK2ZhdGUtaGV2Yy1za2lwbG9vcGZpbHRlcjogQ01EID0gZnJhbWVtZDUgLXNraXBfbG9vcF9maWx0ZXIgbm9rZXkgLWkgJChUQVJHRVRfU0FNUExFUykvaGV2Yy1jb25mb3JtYW5jZS9TQU9fRF9TYW1zdW5nXzUuYml0IC1zd3NfZmxhZ3MgYml0ZXhhY3QKK0ZBVEVfSEVWQyArPSBmYXRlLWhldmMtc2tpcGxvb3BmaWx0ZXIKKwogRkFURV9IRVZDLSQoY2FsbCBERU1ERUMsIEhFVkMsIEhFVkMpICs9ICQoRkFURV9IRVZDKQogCi1GQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9IRVZDLXllcykKKyMgdGhpcyBzYW1wbGUgaGFzIHR3byBzdHNkIGVudHJpZXMgYW5kIG5lZWRzIHRvIHJlbG9hZCBleHRyYWRhdGEKK0ZBVEVfSEVWQy0kKGNhbGwgREVNREVDLCBNT1YsIEhFVkMpICs9IGZhdGUtaGV2Yy1leHRyYWRhdGEtcmVsb2FkCiAKLWZhdGUtaGV2YzogJChGQVRFX0hFVkMteWVzKQorZmF0ZS1oZXZjLWV4dHJhZGF0YS1yZWxvYWQ6IENNRCA9IGZyYW1lbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL2hldmMvZXh0cmFkYXRhLXJlbG9hZC1tdWx0aS1zdHNkLm1vdiAtc3dzX2ZsYWdzIGJpdGV4YWN0CisKK0ZBVEVfU0FNUExFU19BVkNPTlYgKz0gJChGQVRFX0hFVkMteWVzKQorRkFURV9TQU1QTEVTX0ZGUFJPQkUgKz0gJChGQVRFX0hFVkNfRkZQUk9CRS15ZXMpCisKK2ZhdGUtaGV2YzogJChGQVRFX0hFVkMteWVzKSAkKEZBVEVfSEVWQ19GRlBST0JFLXllcykKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvaWQzdjIubWFrIGIvdGVzdHMvZmF0ZS9pZDN2Mi5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczZjU5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZhdGUvaWQzdjIubWFrCkBAIC0wLDAgKzEsNSBAQAorRkFURV9TQU1QTEVTX0lEM1YyLSQoQ09ORklHX01QM19ERU1VWEVSKSArPSBmYXRlLWlkM3YyLXByaXYKK2ZhdGUtaWQzdjItcHJpdjogQ01EID0gcHJvYmV0YWdzICQoVEFSR0VUX1NBTVBMRVMpL2lkM3YyL2lkM3YyX3ByaXYubXAzCisKK0ZBVEVfU0FNUExFU19GRlBST0JFICs9ICQoRkFURV9TQU1QTEVTX0lEM1YyLXllcykKK2ZhdGUtaWQzdjI6ICQoRkFURV9TQU1QTEVTX0lEM1YyLXllcykKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvaW1hZ2UubWFrIGIvdGVzdHMvZmF0ZS9pbWFnZS5tYWsKaW5kZXggMjIyNGUzZS4uMTIxNDA1YSAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9pbWFnZS5tYWsKKysrIGIvdGVzdHMvZmF0ZS9pbWFnZS5tYWsKQEAgLTM3LDcgKzM3LDU0IEBACiAKIEREU19PUFRTX3BhbCAgICAgPSAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXBpeF9mbXQgcmdiYQogRERTX09QVFNfcGFsLWF0aSA9IC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtcGl4X2ZtdCByZ2JhCi1ERFNfRk1UID0gYXJnYiBhcmdiLWFleHAgZHgxMC1iYzEgZHgxMC1iYzFhIGR4MTAtYmMyIGR4MTAtYmMzIGR4MTAtYmM0IGR4MTAtYmM1IGR4dDEgZHh0MWEgZHh0MS1ub3JtYWxtYXAgZHh0MiBkeHQzIGR4dDQgZHh0NSBkeHQ1LWFleHAgZHh0NS1ub3JtYWxtYXAgZHh0NS1ub3JtYWxtYXAtYXRpIGR4dDUtcmJ4ZyBkeHQ1LXJneGIgZHh0NS1yeGJnIGR4dDUtcnhnYiBkeHQ1LXhnYnIgZHh0NS14Z3hyIGR4dDUteHJiZyBkeHQ1LXljb2NnIGR4dDUteWNvY2ctc2NhbGVkIHBhbCBwYWwtYXRpIHJnYjE2IHJnYjI0IHJnYmEgcmd0YzFzIHJndGMxdSByZ3RjMnMgcmd0YzJ1IHJndGMydS14eSB1eXZ5IHhiZ3IgeHJnYiB5IHlhIHljb2NnIHl1eXYKK0REU19GTVQgICAgICAgICAgPSBhbHBoYTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBhcmdiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBhcmdiLWFleHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeDEwLWJjMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeDEwLWJjMWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeDEwLWJjMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeDEwLWJjMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeDEwLWJjNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeDEwLWJjNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQxYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQxLW5vcm1hbG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LWFleHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LW5vcm1hbG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LW5vcm1hbG1hcC1hdGkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXJieGcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXJneGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXJ4YmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXJ4Z2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXhnYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXhneHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXhyYmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXljb2NnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBkeHQ1LXljb2NnLXNjYWxlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBtb25vYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBwYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBwYWwtYXRpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ2IxNTU1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ2IxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ2IyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ2I1NTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ2JhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ3RjMXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ3RjMXUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ3RjMnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ3RjMnUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICByZ3RjMnUteHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB1eXZ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB4YmdyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB4cmdiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB5YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB5Y29jZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB5dXl2CiAkKGZvcmVhY2ggRk1ULCQoRERTX0ZNVCksJChldmFsICQoY2FsbCBGQVRFX0lNR1NVSVRFX0REUywkKEZNVCkpKSkKIAogRkFURV9ERFMtJChjYWxsIERFTURFQywgSU1BR0UyLCBERFMpICs9ICQoRkFURV9ERFMpCkBAIC02NSwxMSArMTEyLDE5NiBAQAogRkFURV9FWFIgKz0gZmF0ZS1leHItc2xpY2UtcHhyMjQKIGZhdGUtZXhyLXNsaWNlLXB4cjI0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3NsaWNlX3B4cjI0LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCiAKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS1weHIyNC1mbG9hdC0xMng4CitmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtMTJ4ODogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9weHIyNF9mbG9hdF8xMng4LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYmEtbXVsdGlzY2FubGluZS1oYWxmLWI0NAorZmF0ZS1leHItcmdiYS1tdWx0aXNjYW5saW5lLWhhbGYtYjQ0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiYV9tdWx0aXNjYW5saW5lX2hhbGZfYjQ0LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtZmxvYXQtYjQ0CitmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtZmxvYXQtYjQ0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3NjYW5saW5lX2Zsb2F0X2I0NC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtaGFsZi1iNDQtMTJ4OAorZmF0ZS1leHItcmdiLXNjYW5saW5lLWhhbGYtYjQ0LTEyeDg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfaGFsZl9iNDRfMTJ4OC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtaGFsZi1iNDQtMTN4OQorZmF0ZS1leHItcmdiLXNjYW5saW5lLWhhbGYtYjQ0LTEzeDk6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfaGFsZl9iNDRfMTN4OS5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS1mbG9hdC1yYXctMTJ4OAorZmF0ZS1leHItcmdiLXRpbGUtZmxvYXQtcmF3LTEyeDg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JfdGlsZV9mbG9hdF9yYXdfMTJ4OC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS1mbG9hdC1yYXctMTUweDEzMAorZmF0ZS1leHItcmdiLXRpbGUtZmxvYXQtcmF3LTE1MHgxMzA6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JfdGlsZV9mbG9hdF9yYXdfMTUweDEzMC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS1oYWxmLXJhdy0xMng4CitmYXRlLWV4ci1yZ2ItdGlsZS1oYWxmLXJhdy0xMng4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3RpbGVfaGFsZl9yYXdfMTJ4OC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0LTEzeDktbDEKK2ZhdGUtZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDQtMTN4OS1sMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYmFfc2NhbmxpbmVfZmxvYXRfaGFsZl9iNDRfMTN4OS5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NC0xM3g5LWwyCitmYXRlLWV4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0LTEzeDktbDI6IENNRCA9IGZyYW1lY3JjIC1sYXllciAiVlJheVNhbXBsZXJJbmZvIiAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiYV9zY2FubGluZV9mbG9hdF9oYWxmX2I0NF8xM3g5LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0LTEyeDgtbDEKK2ZhdGUtZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDQtMTJ4OC1sMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYmFfc2NhbmxpbmVfZmxvYXRfaGFsZl9iNDRfMTJ4OC5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NC0xMng4LWwyCitmYXRlLWV4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0LTEyeDgtbDI6IENNRCA9IGZyYW1lY3JjIC1sYXllciAiVlJheVNhbXBsZXJJbmZvIiAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiYV9zY2FubGluZV9mbG9hdF9oYWxmX2I0NF8xMng4LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0YS0xMng4LWwxCitmYXRlLWV4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0YS0xMng4LWwxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiYV9zY2FubGluZV9mbG9hdF9oYWxmX2I0NGFfMTJ4OC5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NGEtMTJ4OC1sMgorZmF0ZS1leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NGEtMTJ4OC1sMjogQ01EID0gZnJhbWVjcmMgLWxheWVyICJWUmF5U2FtcGxlckluZm8iIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JhX3NjYW5saW5lX2Zsb2F0X2hhbGZfYjQ0YV8xMng4LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0YS0xM3g5LWwxCitmYXRlLWV4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0YS0xM3g5LWwxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiYV9zY2FubGluZV9mbG9hdF9oYWxmX2I0NGFfMTN4OS5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NGEtMTN4OS1sMgorZmF0ZS1leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NGEtMTN4OS1sMjogQ01EID0gZnJhbWVjcmMgLWxheWVyICJWUmF5U2FtcGxlckluZm8iIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JhX3NjYW5saW5lX2Zsb2F0X2hhbGZfYjQ0YV8xM3g5LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS1weHIyNC1mbG9hdC1oYWxmLWwxCitmYXRlLWV4ci1yZ2ItdGlsZS1weHIyNC1mbG9hdC1oYWxmLWwxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3RpbGVfcHhyMjRfZmxvYXRfaGFsZi5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS1weHIyNC1mbG9hdC1oYWxmLWwyCitmYXRlLWV4ci1yZ2ItdGlsZS1weHIyNC1mbG9hdC1oYWxmLWwyOiBDTUQgPSBmcmFtZWNyYyAtbGF5ZXIgIlZSYXlTYW1wbGVySW5mbyIgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl90aWxlX3B4cjI0X2Zsb2F0X2hhbGYuZXhyIC1waXhfZm10IHJnYmE2NGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi10aWxlLXB4cjI0LWhhbGYtZmxvYXQtbDEKK2ZhdGUtZXhyLXJnYi10aWxlLXB4cjI0LWhhbGYtZmxvYXQtbDE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JfdGlsZV9weHIyNF9oYWxmX2Zsb2F0LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi10aWxlLXB4cjI0LWhhbGYtZmxvYXQtbDIKK2ZhdGUtZXhyLXJnYi10aWxlLXB4cjI0LWhhbGYtZmxvYXQtbDI6IENNRCA9IGZyYW1lY3JjIC1sYXllciAiVlJheVNhbXBsZXJJbmZvIiAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3RpbGVfcHhyMjRfaGFsZl9mbG9hdC5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXRpbGUtaGFsZi1mbG9hdC1iNDQtMTJ4OC1sMQorZmF0ZS1leHItcmdiLXRpbGUtaGFsZi1mbG9hdC1iNDQtMTJ4OC1sMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl90aWxlX2hhbGZfZmxvYXRfYjQ0XzEyeDguZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXRpbGUtaGFsZi1mbG9hdC1iNDQtMTJ4OC1sMgorZmF0ZS1leHItcmdiLXRpbGUtaGFsZi1mbG9hdC1iNDQtMTJ4OC1sMjogQ01EID0gZnJhbWVjcmMgLWxheWVyICJWUmF5U2FtcGxlckluZm8iIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JfdGlsZV9oYWxmX2Zsb2F0X2I0NF8xMng4LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS16aXAtaGFsZi1mbG9hdC1sMQorZmF0ZS1leHItcmdiLXRpbGUtemlwLWhhbGYtZmxvYXQtbDE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JfdGlsZV96aXBfaGFsZl9mbG9hdC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS16aXAtaGFsZi1mbG9hdC1sMgorZmF0ZS1leHItcmdiLXRpbGUtemlwLWhhbGYtZmxvYXQtbDI6IENNRCA9IGZyYW1lY3JjIC1sYXllciAiVlJheVNhbXBsZXJJbmZvIiAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3RpbGVfemlwX2hhbGZfZmxvYXQuZXhyIC1waXhfZm10IHJnYmE2NGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi10aWxlLXppcDEtaGFsZi1mbG9hdC1sMQorZmF0ZS1leHItcmdiLXRpbGUtemlwMS1oYWxmLWZsb2F0LWwxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3RpbGVfemlwMV9oYWxmX2Zsb2F0LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi10aWxlLXppcDEtaGFsZi1mbG9hdC1sMgorZmF0ZS1leHItcmdiLXRpbGUtemlwMS1oYWxmLWZsb2F0LWwyOiBDTUQgPSBmcmFtZWNyYyAtbGF5ZXIgIlZSYXlTYW1wbGVySW5mbyIgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl90aWxlX3ppcDFfaGFsZl9mbG9hdC5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXRpbGUtcmxlLWhhbGYtZmxvYXQtbDEKK2ZhdGUtZXhyLXJnYi10aWxlLXJsZS1oYWxmLWZsb2F0LWwxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3RpbGVfcmxlX2hhbGZfZmxvYXQuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXRpbGUtcmxlLWhhbGYtZmxvYXQtbDIKK2ZhdGUtZXhyLXJnYi10aWxlLXJsZS1oYWxmLWZsb2F0LWwyOiBDTUQgPSBmcmFtZWNyYyAtbGF5ZXIgIlZSYXlTYW1wbGVySW5mbyIgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl90aWxlX3JsZV9oYWxmX2Zsb2F0LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS1yYXctaGFsZi1mbG9hdC1sMQorZmF0ZS1leHItcmdiLXRpbGUtcmF3LWhhbGYtZmxvYXQtbDE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JfdGlsZV9yYXdfaGFsZl9mbG9hdC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItdGlsZS1yYXctaGFsZi1mbG9hdC1sMgorZmF0ZS1leHItcmdiLXRpbGUtcmF3LWhhbGYtZmxvYXQtbDI6IENNRCA9IGZyYW1lY3JjIC1sYXllciAiVlJheVNhbXBsZXJJbmZvIiAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3RpbGVfcmF3X2hhbGZfZmxvYXQuZXhyIC1waXhfZm10IHJnYmE2NGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS1iNDQtaGFsZi1mbG9hdC0xMng4LWwxCitmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtYjQ0LWhhbGYtZmxvYXQtMTJ4OC1sMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9iNDRfaGFsZl9mbG9hdF8xMng4LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS1iNDQtaGFsZi1mbG9hdC0xMng4LWwyCitmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtYjQ0LWhhbGYtZmxvYXQtMTJ4OC1sMjogQ01EID0gZnJhbWVjcmMgLWxheWVyICJWUmF5U2FtcGxlckluZm8iIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfYjQ0X2hhbGZfZmxvYXRfMTJ4OC5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLXB4cjI0LWhhbGYtZmxvYXQtbDEKK2ZhdGUtZXhyLXJnYi1zY2FubGluZS1weHIyNC1oYWxmLWZsb2F0LWwxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3NjYW5saW5lX3B4cjI0X2hhbGZfZmxvYXQuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLXB4cjI0LWhhbGYtZmxvYXQtbDIKK2ZhdGUtZXhyLXJnYi1zY2FubGluZS1weHIyNC1oYWxmLWZsb2F0LWwyOiBDTUQgPSBmcmFtZWNyYyAtbGF5ZXIgIlZSYXlTYW1wbGVySW5mbyIgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9weHIyNF9oYWxmX2Zsb2F0LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtaGFsZi1sMQorZmF0ZS1leHItcmdiLXNjYW5saW5lLXB4cjI0LWZsb2F0LWhhbGYtbDE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfcHhyMjRfZmxvYXRfaGFsZi5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtaGFsZi1sMgorZmF0ZS1leHItcmdiLXNjYW5saW5lLXB4cjI0LWZsb2F0LWhhbGYtbDI6IENNRCA9IGZyYW1lY3JjIC1sYXllciAiVlJheVNhbXBsZXJJbmZvIiAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3NjYW5saW5lX3B4cjI0X2Zsb2F0X2hhbGYuZXhyIC1waXhfZm10IHJnYmE2NGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS1weHIyNC1oYWxmLXVpbnQzMi0xM3g5CitmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtaGFsZi11aW50MzItMTN4OTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9weHIyNF9oYWxmX3VpbnQzMl8xM3g5LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS16aXAtaGFsZi1mbG9hdC1sMQorZmF0ZS1leHItcmdiLXNjYW5saW5lLXppcC1oYWxmLWZsb2F0LWwxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3NjYW5saW5lX3ppcF9oYWxmX2Zsb2F0LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS16aXAtaGFsZi1mbG9hdC1sMgorZmF0ZS1leHItcmdiLXNjYW5saW5lLXppcC1oYWxmLWZsb2F0LWwyOiBDTUQgPSBmcmFtZWNyYyAtbGF5ZXIgIlZSYXlTYW1wbGVySW5mbyIgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV96aXBfaGFsZl9mbG9hdC5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMQorZmF0ZS1leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV96aXAxX2hhbGZfZmxvYXQuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMgorZmF0ZS1leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMjogQ01EID0gZnJhbWVjcmMgLWxheWVyICJWUmF5U2FtcGxlckluZm8iIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfemlwMV9oYWxmX2Zsb2F0LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtcmxlLWhhbGYtZmxvYXQtbDEKK2ZhdGUtZXhyLXJnYi1zY2FubGluZS1ybGUtaGFsZi1mbG9hdC1sMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9ybGVfaGFsZl9mbG9hdC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtcmxlLWhhbGYtZmxvYXQtbDIKK2ZhdGUtZXhyLXJnYi1zY2FubGluZS1ybGUtaGFsZi1mbG9hdC1sMjogQ01EID0gZnJhbWVjcmMgLWxheWVyICJWUmF5U2FtcGxlckluZm8iIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfcmxlX2hhbGZfZmxvYXQuZXhyIC1waXhfZm10IHJnYmE2NGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS1yYXctaGFsZi1mbG9hdC1sMQorZmF0ZS1leHItcmdiLXNjYW5saW5lLXJhdy1oYWxmLWZsb2F0LWwxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3NjYW5saW5lX3Jhd19oYWxmX2Zsb2F0LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS1yYXctaGFsZi1mbG9hdC1sMgorZmF0ZS1leHItcmdiLXNjYW5saW5lLXJhdy1oYWxmLWZsb2F0LWwyOiBDTUQgPSBmcmFtZWNyYyAtbGF5ZXIgIlZSYXlTYW1wbGVySW5mbyIgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9yYXdfaGFsZl9mbG9hdC5leHIgLXBpeF9mbXQgcmdiYTY0bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLWI0NC11aW50MzIKK2ZhdGUtZXhyLXJnYi1zY2FubGluZS1iNDQtdWludDMyOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3NjYW5saW5lX2I0NF91aW50MzIuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLXB4cjI0LXVpbnQzMgorZmF0ZS1leHItcmdiLXNjYW5saW5lLXB4cjI0LXVpbnQzMjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9weHIyNF91aW50MzIuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMS16ZXJvLW9mZnNldHMKK2ZhdGUtZXhyLXJnYi1zY2FubGluZS16aXAxLWhhbGYtZmxvYXQtbDEtemVyby1vZmZzZXRzOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9leHIvcmdiX3NjYW5saW5lX3ppcDFfaGFsZl9mbG9hdF96ZXJvX29mZnNldHMuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWJ3CitmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtaGFsZi1waXotYnc6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfaGFsZl9waXpfYncuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWNvbG9yCitmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtaGFsZi1waXotY29sb3I6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfaGFsZl9waXpfY29sb3IuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWR3LXQwMQorZmF0ZS1leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWR3LXQwMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9oYWxmX3Bpel9kd190MDEuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLWZsb2F0LXBpei00OHgzMgorZmF0ZS1leHItcmdiLXNjYW5saW5lLWZsb2F0LXBpei00OHgzMjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZXhyL3JnYl9zY2FubGluZV9mbG9hdF9waXpfNDh4MzIuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHItcmdiLXNjYW5saW5lLW5vbmUtbmVnYXRpdmUtcmVkCitmYXRlLWV4ci1yZ2Itc2NhbmxpbmUtbm9uZS1uZWdhdGl2ZS1yZWQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfbm9uZV9uZWdhdGl2ZV9yZWQuZXhyIC1waXhfZm10IHJnYjQ4bGUKKworCitGQVRFX0VYUiArPSBmYXRlLWV4ci1yZ2ItYjQ0YS1oYWxmLW5lZ2F0aXZlLTR4NAorZmF0ZS1leHItcmdiLWI0NGEtaGFsZi1uZWdhdGl2ZS00eDQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JfYjQ0YV9oYWxmX25lZ2F0aXZlXzR4NC5leHIgLXBpeF9mbXQgcmdiNDhsZQorCitGQVRFX0VYUiArPSBmYXRlLWV4ci15LXRpbGUtemlwLWhhbGYtMTJ4OAorZmF0ZS1leHIteS10aWxlLXppcC1oYWxmLTEyeDg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci95X3RpbGVfemlwX2hhbGZfMTJ4OC5leHIgLXBpeF9mbXQgZ3JheTE2bGUKKworRkFURV9FWFIgKz0gZmF0ZS1leHIteS1zY2FubGluZS16aXAtaGFsZi0xMng4CitmYXRlLWV4ci15LXNjYW5saW5lLXppcC1oYWxmLTEyeDg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci95X3NjYW5saW5lX3ppcF9oYWxmXzEyeDguZXhyIC1waXhfZm10IGdyYXkxNmxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYi1zY2FubGluZS1oYWxmLXBpei1kdy10MDgKK2ZhdGUtZXhyLXJnYi1zY2FubGluZS1oYWxmLXBpei1kdy10MDg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2Jfc2NhbmxpbmVfaGFsZl9waXpfZHdfdDA4LmV4ciAtcGl4X2ZtdCByZ2I0OGxlCisKK0ZBVEVfRVhSICs9IGZhdGUtZXhyLXJnYmEtemlwMTYtMTZ4MzItZmxhZzQKK2ZhdGUtZXhyLXJnYmEtemlwMTYtMTZ4MzItZmxhZzQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2V4ci9yZ2JhX3ppcDE2XzE2eDMyX2ZsYWc0LmV4ciAtcGl4X2ZtdCByZ2JhNjRsZQorCiBGQVRFX0VYUi0kKGNhbGwgREVNREVDLCBJTUFHRTIsIEVYUikgKz0gJChGQVRFX0VYUikKIAogRkFURV9JTUFHRSArPSAkKEZBVEVfRVhSLXllcykKIGZhdGUtZXhyOiAkKEZBVEVfRVhSLXllcykKIAorRkFURV9KUEcgKz0gZmF0ZS1qcGctMTJicHAKK2ZhdGUtanBnLTEyYnBwOiBDTUQgPSBmcmFtZWNyYyAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvanBnLzEyYnBwLmpwZyAtZiByYXd2aWRlbyAtcGl4X2ZtdCBncmF5MTZsZSAtdmYgc2V0c2FyPXNhcj1zYXIKKworRkFURV9KUEcgKz0gZmF0ZS1qcGctamZpZgorZmF0ZS1qcGctamZpZjogQ01EID0gZnJhbWVjcmMgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL2pwZy8yMDI0Mi5qcGcKKworRkFURV9KUEctJChjYWxsIERFTURFQywgSU1BR0UyLCBNSlBFRykgKz0gJChGQVRFX0pQRykKK0ZBVEVfSU1BR0UgKz0gJChGQVRFX0pQRy15ZXMpCitmYXRlLWpwZzogJChGQVRFX0pQRy15ZXMpCisKIEZBVEVfSU1BR0UtJChjYWxsIERFTURFQywgSU1BR0UyLCBRRFJBVykgKz0gZmF0ZS1waWN0CiBmYXRlLXBpY3Q6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3F1aWNrZHJhdy9UUlUyNTYuUENUIC1waXhfZm10IHJnYjI0CiAKQEAgLTg0LDkgKzMxNiwxMiBAQAogZmF0ZS1wbmctJCgxKTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcG5nMS9sZW5hLSQoMSkucG5nIC1zd3NfZmxhZ3MgK2FjY3VyYXRlX3JuZCtiaXRleGFjdCAtcGl4X2ZtdCByZ2IyNAogZW5kZWYKIAotUE5HX0NPTE9SU1BBQ0VTID0gZ3JheTggZ3JheTE2IHJnYjI0IHJnYjQ4IHJnYmEgeWE4IHlhMTYKK1BOR19DT0xPUlNQQUNFUyA9IGdyYXk4IGdyYXkxNiByZ2IyNCByZ2I0OCByZ2JhIHJnYmE2NCB5YTggeWExNgogJChmb3JlYWNoIENMU1AsJChQTkdfQ09MT1JTUEFDRVMpLCQoZXZhbCAkKGNhbGwgRkFURV9JTUdTVUlURV9QTkcsJChDTFNQKSkpKQogCitGQVRFX1BORyArPSBmYXRlLXBuZy1pbnQtcmdiMjQKK2ZhdGUtcG5nLWludC1yZ2IyNDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcG5nMS9sZW5hLWludF9yZ2IyNC5wbmcgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0IC1waXhfZm10IHJnYjI0CisKIEZBVEVfUE5HLSQoY2FsbCBERU1ERUMsIElNQUdFMiwgUE5HKSArPSAkKEZBVEVfUE5HKQogRkFURV9JTUFHRSArPSAkKEZBVEVfUE5HLXllcykKIGZhdGUtcG5nOiAkKEZBVEVfUE5HLXllcykKQEAgLTk0LDYgKzMyOSw0MCBAQAogRkFURV9JTUFHRS0kKGNhbGwgREVNREVDLCBJTUFHRTIsIFBUWCkgKz0gZmF0ZS1wdHgKIGZhdGUtcHR4OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9wdHgvXzExM2t3X3BpYy5wdHggLXBpeF9mbXQgcmdiMjQKIAorZGVmaW5lIEZBVEVfSU1HU1VJVEVfUFNECitGQVRFX1BTRCArPSBmYXRlLXBzZC0kKDEpCitmYXRlLXBzZC0kKDEpOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9wc2QvbGVuYS0kKDEpLnBzZCAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLXBpeF9mbXQgcmdiMjQKK2VuZGVmCisKK1BTRF9DT0xPUlNQQUNFUyA9IGdyYXk4IGdyYXkxNiByZ2IyNCByZ2I0OCByZ2JhIHJnYmE2NCB5YTggeWExNgorJChmb3JlYWNoIENMU1AsJChQU0RfQ09MT1JTUEFDRVMpLCQoZXZhbCAkKGNhbGwgRkFURV9JTUdTVUlURV9QU0QsJChDTFNQKSkpKQorCitGQVRFX1BTRCArPSBmYXRlLXBzZC1sZW5hLTEyN3gxMjctcmdiMjQKK2ZhdGUtcHNkLWxlbmEtMTI3eDEyNy1yZ2IyNDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcHNkL2xlbmEtMTI3eDEyN19yZ2IyNC5wc2QKKworRkFURV9QU0QgKz0gZmF0ZS1wc2QtbGVuYS1yZ2ItcmxlLTEyN3gxMjctMTZiCitmYXRlLXBzZC1sZW5hLXJnYi1ybGUtMTI3eDEyNy0xNmI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3BzZC9sZW5hLXJnYl9ybGVfMTI3eDEyN18xNmIucHNkCisKK0ZBVEVfUFNEICs9IGZhdGUtcHNkLWxlbmEtcmdiLXJsZS0xMjd4MTI3LThiCitmYXRlLXBzZC1sZW5hLXJnYi1ybGUtMTI3eDEyNy04YjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcHNkL2xlbmEtcmdiX3JsZV8xMjd4MTI3XzhiLnBzZAorCitGQVRFX1BTRCArPSBmYXRlLXBzZC1sZW5hLXJnYmEtcmxlLTEyOHgxMjgtOGIKK2ZhdGUtcHNkLWxlbmEtcmdiYS1ybGUtMTI4eDEyOC04YjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcHNkL2xlbmEtcmdiYV9ybGVfMTI4eDEyOF84Yi5wc2QKKworRkFURV9QU0QgKz0gZmF0ZS1wc2QtbGVuYS0yNTZjCitmYXRlLXBzZC1sZW5hLTI1NmM6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3BzZC9sZW5hLTI1NmMucHNkCisKK0ZBVEVfUFNEICs9IGZhdGUtcHNkLWxlbmEtYml0bWFwCitmYXRlLXBzZC1sZW5hLWJpdG1hcDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcHNkL2xlbmEtYml0bWFwLnBzZAorCitGQVRFX1BTRCArPSBmYXRlLXBzZC1kdW8tdG9uZS1jb2xvcgorZmF0ZS1wc2QtZHVvLXRvbmUtY29sb3I6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3BzZC9kdW90b25lLWNvbG9yLnBzZAorCitGQVRFX1BTRC0kKGNhbGwgREVNREVDLCBJTUFHRTIsIFBTRCkgKz0gJChGQVRFX1BTRCkKKworRkFURV9JTUFHRSArPSAkKEZBVEVfUFNELXllcykKK2ZhdGUtcHNkOiAkKEZBVEVfUFNELXllcykKKwogZGVmaW5lIEZBVEVfSU1HU1VJVEVfU0dJCiBGQVRFX1NHSSArPSBmYXRlLXNnaS0kKDEpIGZhdGUtc2dpLSQoMSktcmxlCiBmYXRlLXNnaS0kKDEpOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9zZ2kvbGliYXZfJCgxKS5zZ2kgLXN3c19mbGFncyArYWNjdXJhdGVfcm5kK2JpdGV4YWN0CkBAIC0xNzYsNiArNDQ1LDI4IEBACiBGQVRFX0lNQUdFICs9ICQoRkFURV9USUZGLXllcykKIGZhdGUtdGlmZjogJChGQVRFX1RJRkYteWVzKQogCitGQVRFX1dFQlAgKz0gZmF0ZS13ZWJwLXJnYi1sb3NzbGVzcworZmF0ZS13ZWJwLXJnYi1sb3NzbGVzczogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvd2VicC9yZ2JfbG9zc2xlc3Mud2VicAorCitGQVRFX1dFQlAgKz0gZmF0ZS13ZWJwLXJnYi1sZW5hLWxvc3NsZXNzCitmYXRlLXdlYnAtcmdiLWxlbmEtbG9zc2xlc3M6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3dlYnAvcmdiX2xlbmFfbG9zc2xlc3Mud2VicAorCitGQVRFX1dFQlAgKz0gZmF0ZS13ZWJwLXJnYi1sZW5hLWxvc3NsZXNzLXJnYjI0CitmYXRlLXdlYnAtcmdiLWxlbmEtbG9zc2xlc3MtcmdiMjQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3dlYnAvcmdiX2xlbmFfbG9zc2xlc3Mud2VicCAtcGl4X2ZtdCByZ2IyNAorCitGQVRFX1dFQlAgKz0gZmF0ZS13ZWJwLXJnYmEtbG9zc2xlc3MKK2ZhdGUtd2VicC1yZ2JhLWxvc3NsZXNzOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS93ZWJwL3JnYmFfbG9zc2xlc3Mud2VicAorCitGQVRFX1dFQlAgKz0gZmF0ZS13ZWJwLXJnYi1sb3NzeS1xODAKK2ZhdGUtd2VicC1yZ2ItbG9zc3ktcTgwOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS93ZWJwL3JnYl9xODAud2VicAorCitGQVRFX1dFQlAgKz0gZmF0ZS13ZWJwLXJnYmEtbG9zc3ktcTgwCitmYXRlLXdlYnAtcmdiYS1sb3NzeS1xODA6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3dlYnAvcmdiYV9xODAud2VicAorCitGQVRFX1dFQlAtJChjYWxsIERFTURFQywgSU1BR0UyLCBXRUJQKSArPSAkKEZBVEVfV0VCUCkKK0ZBVEVfSU1BR0UgKz0gJChGQVRFX1dFQlAteWVzKQorZmF0ZS13ZWJwOiAkKEZBVEVfV0VCUC15ZXMpCisKIEZBVEVfSU1BR0UtJChjYWxsIERFTURFQywgSU1BR0UyLCBYRkFDRSkgKz0gZmF0ZS14ZmFjZQogZmF0ZS14ZmFjZTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykveGZhY2UvbGVuYS54ZmFjZQogCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2luZGVvLm1hayBiL3Rlc3RzL2ZhdGUvaW5kZW8ubWFrCmluZGV4IGU3MjVhNmIuLmJiM2MxNTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvaW5kZW8ubWFrCisrKyBiL3Rlc3RzL2ZhdGUvaW5kZW8ubWFrCkBAIC0xLDEyICsxLDIxIEBACi1GQVRFX0lOREVPLSQoY2FsbCBERU1ERUMsIEFWSSwgSU5ERU8yKSArPSBmYXRlLWluZGVvMgotZmF0ZS1pbmRlbzI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3J0MjEvVlBBUjAwMjYuQVZJCitGQVRFX0lOREVPMiArPSBmYXRlLWluZGVvMi1kZWx0YQorZmF0ZS1pbmRlbzItZGVsdGE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3J0MjEvSVNLQVRFLkFWSSAtYW4KIAotRkFURV9JTkRFTy0kKGNhbGwgREVNREVDLCBNT1YsIElOREVPMykgKz0gZmF0ZS1pbmRlbzMKLWZhdGUtaW5kZW8zOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9pdjMyL2N1YmVzLm1vdgorRkFURV9JTkRFTzIgKz0gZmF0ZS1pbmRlbzItaW50cmEKK2ZhdGUtaW5kZW8yLWludHJhOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9ydDIxL1ZQQVIwMDI2LkFWSQogCi1GQVRFX0lOREVPLSQoY2FsbCBERU1ERUMsIEFWSSwgSU5ERU8zKSArPSBmYXRlLWluZGVvMy0yCitGQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIEFWSSwgSU5ERU8yKSArPSAkKEZBVEVfSU5ERU8yKQorZmF0ZS1pbmRlbzI6ICQoRkFURV9JTkRFTzIpCisKK0ZBVEVfSU5ERU8zLSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWluZGVvMy0xCitmYXRlLWluZGVvMy0xOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9pdjMyL2N1YmVzLm1vdgorCitGQVRFX0lOREVPMy0kKENPTkZJR19BVklfREVNVVhFUikgKz0gZmF0ZS1pbmRlbzMtMgogZmF0ZS1pbmRlbzMtMjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaXYzMi9PUEVOSU5HSC5hdmkKIAorRkFURV9TQU1QTEVTX0FWQ09OVi0kKENPTkZJR19JTkRFTzNfREVDT0RFUikgKz0gJChGQVRFX0lOREVPMy15ZXMpCitmYXRlLWluZGVvMzogJChGQVRFX0lOREVPMy15ZXMpCisKIEZBVEVfSU5ERU8tJChjYWxsIERFTURFQywgQVZJLCBJTkRFTzQpICs9IGZhdGUtaW5kZW80CiBmYXRlLWluZGVvNDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaXY0MS9pbmRlbzQxLXBhcnRpYWwuYXZpIC1hbgogCkBAIC0xNCw0ICsyMyw0IEBACiBmYXRlLWluZGVvNTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaXY1MC9FZHVjX01vdmllX0RlYWRseUZvcmNlLmF2aSAtYW4KIAogRkFURV9TQU1QTEVTX0FWQ09OViArPSAkKEZBVEVfSU5ERU8teWVzKQotZmF0ZS1pbmRlbzogJChGQVRFX0lOREVPLXllcykKK2ZhdGUtaW5kZW86ICQoRkFURV9JTkRFTzIpICQoRkFURV9JTkRFTzMteWVzKSAkKEZBVEVfSU5ERU8teWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9saWJhdmNvZGVjLm1hayBiL3Rlc3RzL2ZhdGUvbGliYXZjb2RlYy5tYWsKaW5kZXggMjJjMDgzOS4uZDNiMmRkOCAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9saWJhdmNvZGVjLm1haworKysgYi90ZXN0cy9mYXRlL2xpYmF2Y29kZWMubWFrCkBAIC0xLDQzICsxLDkxIEBACitGQVRFX0xJQkFWQ09ERUMteWVzICs9IGZhdGUtYXZwYWNrZXQKK2ZhdGUtYXZwYWNrZXQ6IGxpYmF2Y29kZWMvdGVzdHMvYXZwYWNrZXQkKEVYRVNVRikKK2ZhdGUtYXZwYWNrZXQ6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL2F2cGFja2V0CitmYXRlLWF2cGFja2V0OiBDTVAgPSBudWxsCisKIEZBVEVfTElCQVZDT0RFQy0kKENPTkZJR19DQUJBQykgKz0gZmF0ZS1jYWJhYwotZmF0ZS1jYWJhYzogbGliYXZjb2RlYy9jYWJhYy10ZXN0JChFWEVTVUYpCi1mYXRlLWNhYmFjOiBDTUQgPSBydW4gbGliYXZjb2RlYy9jYWJhYy10ZXN0Ci1mYXRlLWNhYmFjOiBSRUYgPSAvZGV2L251bGwKK2ZhdGUtY2FiYWM6IGxpYmF2Y29kZWMvdGVzdHMvY2FiYWMkKEVYRVNVRikKK2ZhdGUtY2FiYWM6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL2NhYmFjCitmYXRlLWNhYmFjOiBDTVAgPSBudWxsCisKK0ZBVEVfTElCQVZDT0RFQy15ZXMgKz0gZmF0ZS1jZWxwX21hdGgKK2ZhdGUtY2VscF9tYXRoOiBsaWJhdmNvZGVjL3Rlc3RzL2NlbHBfbWF0aCQoRVhFU1VGKQorZmF0ZS1jZWxwX21hdGg6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL2NlbHBfbWF0aAorZmF0ZS1jZWxwX21hdGg6IENNUCA9IG51bGwKKworRkFURV9MSUJBVkNPREVDLXllcyArPSBmYXRlLWNvZGVjX2Rlc2MKK2ZhdGUtY29kZWNfZGVzYzogbGliYXZjb2RlYy90ZXN0cy9jb2RlY19kZXNjJChFWEVTVUYpCitmYXRlLWNvZGVjX2Rlc2M6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL2NvZGVjX2Rlc2MKK2ZhdGUtY29kZWNfZGVzYzogQ01QID0gbnVsbAogCiBGQVRFX0xJQkFWQ09ERUMtJChDT05GSUdfR09MT01CKSArPSBmYXRlLWdvbG9tYgotZmF0ZS1nb2xvbWI6IGxpYmF2Y29kZWMvZ29sb21iLXRlc3QkKEVYRVNVRikKLWZhdGUtZ29sb21iOiBDTUQgPSBydW4gbGliYXZjb2RlYy9nb2xvbWItdGVzdAotZmF0ZS1nb2xvbWI6IFJFRiA9IC9kZXYvbnVsbAorZmF0ZS1nb2xvbWI6IGxpYmF2Y29kZWMvdGVzdHMvZ29sb21iJChFWEVTVUYpCitmYXRlLWdvbG9tYjogQ01EID0gcnVuIGxpYmF2Y29kZWMvdGVzdHMvZ29sb21iCitmYXRlLWdvbG9tYjogQ01QID0gbnVsbAogCi1GQVRFX0xJQkFWQ09ERUMtJChDT05GSUdfSURDVERTUCkgKz0gZmF0ZS1pZGN0OHg4Ci1mYXRlLWlkY3Q4eDg6IGxpYmF2Y29kZWMvZGN0LXRlc3QkKEVYRVNVRikKLWZhdGUtaWRjdDh4ODogQ01EID0gcnVuIGxpYmF2Y29kZWMvZGN0LXRlc3QgLWkKLWZhdGUtaWRjdDh4ODogQ01QID0gbnVsbAotZmF0ZS1pZGN0OHg4OiBSRUYgPSAvZGV2L251bGwKK0ZBVEVfTElCQVZDT0RFQy0kKENPTkZJR19JRENURFNQKSArPSBmYXRlLWlkY3Q4eDgtMCBmYXRlLWlkY3Q4eDgtMSBmYXRlLWlkY3Q4eDgtMiBmYXRlLWlkY3QyNDgKKworZmF0ZS1pZGN0OHg4LTA6IGxpYmF2Y29kZWMvdGVzdHMvZGN0JChFWEVTVUYpCitmYXRlLWlkY3Q4eDgtMDogQ01EID0gcnVuIGxpYmF2Y29kZWMvdGVzdHMvZGN0IC1pIDAKK2ZhdGUtaWRjdDh4OC0wOiBDTVAgPSBudWxsCisKK2ZhdGUtaWRjdDh4OC0xOiBsaWJhdmNvZGVjL3Rlc3RzL2RjdCQoRVhFU1VGKQorZmF0ZS1pZGN0OHg4LTE6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL2RjdCAtaSAxCitmYXRlLWlkY3Q4eDgtMTogQ01QID0gbnVsbAorCitmYXRlLWlkY3Q4eDgtMjogbGliYXZjb2RlYy90ZXN0cy9kY3QkKEVYRVNVRikKK2ZhdGUtaWRjdDh4OC0yOiBDTUQgPSBydW4gbGliYXZjb2RlYy90ZXN0cy9kY3QgLWkgMgorZmF0ZS1pZGN0OHg4LTI6IENNUCA9IG51bGwKKworZmF0ZS1pZGN0MjQ4OiBsaWJhdmNvZGVjL3Rlc3RzL2RjdCQoRVhFU1VGKQorZmF0ZS1pZGN0MjQ4OiBDTUQgPSBydW4gbGliYXZjb2RlYy90ZXN0cy9kY3QgLTQKK2ZhdGUtaWRjdDI0ODogQ01QID0gbnVsbAorCitGQVRFX0xJQkFWQ09ERUMtJChDT05GSUdfSURDVERTUCkgKz0gZmF0ZS1kY3Q4eDgKK2ZhdGUtZGN0OHg4OiBsaWJhdmNvZGVjL3Rlc3RzL2RjdCQoRVhFU1VGKQorZmF0ZS1kY3Q4eDg6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL2RjdAorZmF0ZS1kY3Q4eDg6IENNUCA9IG51bGwKIAogRkFURV9MSUJBVkNPREVDLSQoQ09ORklHX0lJUkZJTFRFUikgKz0gZmF0ZS1paXJmaWx0ZXIKLWZhdGUtaWlyZmlsdGVyOiBsaWJhdmNvZGVjL2lpcmZpbHRlci10ZXN0JChFWEVTVUYpCi1mYXRlLWlpcmZpbHRlcjogQ01EID0gcnVuIGxpYmF2Y29kZWMvaWlyZmlsdGVyLXRlc3QKK2ZhdGUtaWlyZmlsdGVyOiBsaWJhdmNvZGVjL3Rlc3RzL2lpcmZpbHRlciQoRVhFU1VGKQorZmF0ZS1paXJmaWx0ZXI6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL2lpcmZpbHRlcgorCitGQVRFX0xJQkFWQ09ERUMtJChDT05GSUdfTVBFR1ZJREVPKSArPSBmYXRlLW1wZWcxMmZyYW1lcmF0ZQorZmF0ZS1tcGVnMTJmcmFtZXJhdGU6IGxpYmF2Y29kZWMvdGVzdHMvbXBlZzEyZnJhbWVyYXRlJChFWEVTVUYpCitmYXRlLW1wZWcxMmZyYW1lcmF0ZTogQ01EID0gcnVuIGxpYmF2Y29kZWMvdGVzdHMvbXBlZzEyZnJhbWVyYXRlCitmYXRlLW1wZWcxMmZyYW1lcmF0ZTogUkVGID0gL2Rldi9udWxsCiAKIEZBVEVfTElCQVZDT0RFQy15ZXMgKz0gZmF0ZS1saWJhdmNvZGVjLW9wdGlvbnMKLWZhdGUtbGliYXZjb2RlYy1vcHRpb25zOiBsaWJhdmNvZGVjL29wdGlvbnMtdGVzdCQoRVhFU1VGKQotZmF0ZS1saWJhdmNvZGVjLW9wdGlvbnM6IENNRCA9IHJ1biBsaWJhdmNvZGVjL29wdGlvbnMtdGVzdAorZmF0ZS1saWJhdmNvZGVjLW9wdGlvbnM6IGxpYmF2Y29kZWMvdGVzdHMvb3B0aW9ucyQoRVhFU1VGKQorZmF0ZS1saWJhdmNvZGVjLW9wdGlvbnM6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL29wdGlvbnMKIAogRkFURV9MSUJBVkNPREVDLSQoQ09ORklHX1JBTkdFQ09ERVIpICs9IGZhdGUtcmFuZ2Vjb2RlcgotZmF0ZS1yYW5nZWNvZGVyOiBsaWJhdmNvZGVjL3JhbmdlY29kZXItdGVzdCQoRVhFU1VGKQotZmF0ZS1yYW5nZWNvZGVyOiBDTUQgPSBydW4gbGliYXZjb2RlYy9yYW5nZWNvZGVyLXRlc3QKK2ZhdGUtcmFuZ2Vjb2RlcjogbGliYXZjb2RlYy90ZXN0cy9yYW5nZWNvZGVyJChFWEVTVUYpCitmYXRlLXJhbmdlY29kZXI6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL3JhbmdlY29kZXIKIGZhdGUtcmFuZ2Vjb2RlcjogQ01QID0gbnVsbAotZmF0ZS1yYW5nZWNvZGVyOiBSRUYgPSAvZGV2L251bGwKIAogRkFURV9MSUJBVkNPREVDLXllcyArPSBmYXRlLW1hdGhvcHMKLWZhdGUtbWF0aG9wczogbGliYXZjb2RlYy9tYXRob3BzLXRlc3QkKEVYRVNVRikKLWZhdGUtbWF0aG9wczogQ01EID0gcnVuIGxpYmF2Y29kZWMvbWF0aG9wcy10ZXN0CitmYXRlLW1hdGhvcHM6IGxpYmF2Y29kZWMvdGVzdHMvbWF0aG9wcyQoRVhFU1VGKQorZmF0ZS1tYXRob3BzOiBDTUQgPSBydW4gbGliYXZjb2RlYy90ZXN0cy9tYXRob3BzCiBmYXRlLW1hdGhvcHM6IENNUCA9IG51bGwKLWZhdGUtbWF0aG9wczogUkVGID0gL2Rldi9udWxsCiAKIEZBVEVfTElCQVZDT0RFQy0kKENPTkZJR19KUEVHMjAwMF9FTkNPREVSKSArPSBmYXRlLWoyay1kd3QKLWZhdGUtajJrLWR3dDogbGliYXZjb2RlYy9qcGVnMjAwMGR3dC10ZXN0JChFWEVTVUYpCi1mYXRlLWoyay1kd3Q6IENNRCA9IHJ1biBsaWJhdmNvZGVjL2pwZWcyMDAwZHd0LXRlc3QKK2ZhdGUtajJrLWR3dDogbGliYXZjb2RlYy90ZXN0cy9qcGVnMjAwMGR3dCQoRVhFU1VGKQorZmF0ZS1qMmstZHd0OiBDTUQgPSBydW4gbGliYXZjb2RlYy90ZXN0cy9qcGVnMjAwMGR3dAogCitGQVRFX0xJQkFWQ09ERUMteWVzICs9IGZhdGUtbGliYXZjb2RlYy11dGlscworZmF0ZS1saWJhdmNvZGVjLXV0aWxzOiBsaWJhdmNvZGVjL3Rlc3RzL3V0aWxzJChFWEVTVUYpCitmYXRlLWxpYmF2Y29kZWMtdXRpbHM6IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL3V0aWxzCitmYXRlLWxpYmF2Y29kZWMtdXRpbHM6IENNUCA9IG51bGwKKworRkFURV9MSUJBVkNPREVDLXllcyArPSBmYXRlLWxpYmF2Y29kZWMtaHVmZm1hbgorZmF0ZS1saWJhdmNvZGVjLWh1ZmZtYW46IGxpYmF2Y29kZWMvdGVzdHMvbWpwZWdlbmNfaHVmZm1hbiQoRVhFU1VGKQorZmF0ZS1saWJhdmNvZGVjLWh1ZmZtYW46IENNRCA9IHJ1biBsaWJhdmNvZGVjL3Rlc3RzL21qcGVnZW5jX2h1ZmZtYW4KK2ZhdGUtbGliYXZjb2RlYy1odWZmbWFuOiBDTVAgPSBudWxsCisKK0ZBVEVfTElCQVZDT0RFQy15ZXMgKz0gZmF0ZS1saWJhdmNvZGVjLWh0bWxzdWJ0aXRsZXMKK2ZhdGUtbGliYXZjb2RlYy1odG1sc3VidGl0bGVzOiBsaWJhdmNvZGVjL3Rlc3RzL2h0bWxzdWJ0aXRsZXMkKEVYRVNVRikKK2ZhdGUtbGliYXZjb2RlYy1odG1sc3VidGl0bGVzOiBDTUQgPSBydW4gbGliYXZjb2RlYy90ZXN0cy9odG1sc3VidGl0bGVzCiAKIEZBVEUtJChDT05GSUdfQVZDT0RFQykgKz0gJChGQVRFX0xJQkFWQ09ERUMteWVzKQogZmF0ZS1saWJhdmNvZGVjOiAkKEZBVEVfTElCQVZDT0RFQy15ZXMpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2xpYmF2ZGV2aWNlLm1hayBiL3Rlc3RzL2ZhdGUvbGliYXZkZXZpY2UubWFrCmluZGV4IGNiNmFmNTEuLmU5ODMzMjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvbGliYXZkZXZpY2UubWFrCisrKyBiL3Rlc3RzL2ZhdGUvbGliYXZkZXZpY2UubWFrCkBAIC0xLDYgKzEsNiBAQAotRkFURV9MSUJBVkRFVklDRS15ZXMgKz0gZmF0ZS10aW1lZmlsdGVyCi1mYXRlLXRpbWVmaWx0ZXI6IGxpYmF2ZGV2aWNlL3RpbWVmaWx0ZXItdGVzdCQoRVhFU1VGKQotZmF0ZS10aW1lZmlsdGVyOiBDTUQgPSBydW4gbGliYXZkZXZpY2UvdGltZWZpbHRlci10ZXN0CitGQVRFX0xJQkFWREVWSUNFLSQoQ09ORklHX0pBQ0tfSU5ERVYpICs9IGZhdGUtdGltZWZpbHRlcgorZmF0ZS10aW1lZmlsdGVyOiBsaWJhdmRldmljZS90ZXN0cy90aW1lZmlsdGVyJChFWEVTVUYpCitmYXRlLXRpbWVmaWx0ZXI6IENNRCA9IHJ1biBsaWJhdmRldmljZS90ZXN0cy90aW1lZmlsdGVyCiAKIEZBVEUtJChDT05GSUdfQVZERVZJQ0UpICs9ICQoRkFURV9MSUJBVkRFVklDRS15ZXMpCiBmYXRlLWxpYmF2ZGV2aWNlOiAkKEZBVEVfTElCQVZERVZJQ0UteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9saWJhdmZvcm1hdC5tYWsgYi90ZXN0cy9mYXRlL2xpYmF2Zm9ybWF0Lm1hawppbmRleCAxZDZhYTg2Li5jZjFiYTE4IDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL2xpYmF2Zm9ybWF0Lm1haworKysgYi90ZXN0cy9mYXRlL2xpYmF2Zm9ybWF0Lm1hawpAQCAtMSwyNiArMSwyNyBAQAotRkFURV9MSUJBVkZPUk1BVC0kKEhBVkVfUFRIUkVBRFMpICs9IGZhdGUtYXN5bmMKLWZhdGUtYXN5bmM6IGxpYmF2Zm9ybWF0L2FzeW5jLXRlc3QkKEVYRVNVRikKLWZhdGUtYXN5bmM6IENNRCA9IHJ1biBsaWJhdmZvcm1hdC9hc3luYy10ZXN0CisjRkFURV9MSUJBVkZPUk1BVC0kKEhBVkVfUFRIUkVBRFMpICs9IGZhdGUtYXN5bmMKKyNmYXRlLWFzeW5jOiBsaWJhdmZvcm1hdC90ZXN0cy9hc3luYyQoRVhFU1VGKQorI2ZhdGUtYXN5bmM6IENNRCA9IHJ1biBsaWJhdmZvcm1hdC90ZXN0cy9hc3luYwogCiBGQVRFX0xJQkFWRk9STUFULSQoQ09ORklHX05FVFdPUkspICs9IGZhdGUtbm9wcm94eQotZmF0ZS1ub3Byb3h5OiBsaWJhdmZvcm1hdC9ub3Byb3h5LXRlc3QkKEVYRVNVRikKLWZhdGUtbm9wcm94eTogQ01EID0gcnVuIGxpYmF2Zm9ybWF0L25vcHJveHktdGVzdAorZmF0ZS1ub3Byb3h5OiBsaWJhdmZvcm1hdC90ZXN0cy9ub3Byb3h5JChFWEVTVUYpCitmYXRlLW5vcHJveHk6IENNRCA9IHJ1biBsaWJhdmZvcm1hdC90ZXN0cy9ub3Byb3h5CiAKIEZBVEVfTElCQVZGT1JNQVQtJChDT05GSUdfRkZSVE1QQ1JZUFRfUFJPVE9DT0wpICs9IGZhdGUtcnRtcGRoCi1mYXRlLXJ0bXBkaDogbGliYXZmb3JtYXQvcnRtcGRoLXRlc3QkKEVYRVNVRikKLWZhdGUtcnRtcGRoOiBDTUQgPSBydW4gbGliYXZmb3JtYXQvcnRtcGRoLXRlc3QKK2ZhdGUtcnRtcGRoOiBsaWJhdmZvcm1hdC90ZXN0cy9ydG1wZGgkKEVYRVNVRikKK2ZhdGUtcnRtcGRoOiBDTUQgPSBydW4gbGliYXZmb3JtYXQvdGVzdHMvcnRtcGRoCiAKLUZBVEVfTElCQVZGT1JNQVQteWVzICs9IGZhdGUtc3J0cAotZmF0ZS1zcnRwOiBsaWJhdmZvcm1hdC9zcnRwLXRlc3QkKEVYRVNVRikKLWZhdGUtc3J0cDogQ01EID0gcnVuIGxpYmF2Zm9ybWF0L3NydHAtdGVzdAorRkFURV9MSUJBVkZPUk1BVC0kKENPTkZJR19TUlRQKSArPSBmYXRlLXNydHAKK2ZhdGUtc3J0cDogbGliYXZmb3JtYXQvdGVzdHMvc3J0cCQoRVhFU1VGKQorZmF0ZS1zcnRwOiBDTUQgPSBydW4gbGliYXZmb3JtYXQvdGVzdHMvc3J0cAogCiBGQVRFX0xJQkFWRk9STUFULXllcyArPSBmYXRlLXVybAotZmF0ZS11cmw6IGxpYmF2Zm9ybWF0L3VybC10ZXN0JChFWEVTVUYpCi1mYXRlLXVybDogQ01EID0gcnVuIGxpYmF2Zm9ybWF0L3VybC10ZXN0CitmYXRlLXVybDogbGliYXZmb3JtYXQvdGVzdHMvdXJsJChFWEVTVUYpCitmYXRlLXVybDogQ01EID0gcnVuIGxpYmF2Zm9ybWF0L3Rlc3RzL3VybAogCiBGQVRFX0xJQkFWRk9STUFULSQoQ09ORklHX01PVl9NVVhFUikgKz0gZmF0ZS1tb3ZlbmMKLWZhdGUtbW92ZW5jOiBsaWJhdmZvcm1hdC9tb3ZlbmMtdGVzdCQoRVhFU1VGKQotZmF0ZS1tb3ZlbmM6IENNRCA9IHJ1biBsaWJhdmZvcm1hdC9tb3ZlbmMtdGVzdAorZmF0ZS1tb3ZlbmM6IGxpYmF2Zm9ybWF0L3Rlc3RzL21vdmVuYyQoRVhFU1VGKQorZmF0ZS1tb3ZlbmM6IENNRCA9IHJ1biBsaWJhdmZvcm1hdC90ZXN0cy9tb3ZlbmMKIAotRkFURS0kKENPTkZJR19BVkZPUk1BVCkgKz0gJChGQVRFX0xJQkFWRk9STUFULXllcykKK0ZBVEVfTElCQVZGT1JNQVQgKz0gJChGQVRFX0xJQkFWRk9STUFULXllcykKK0ZBVEUtJChDT05GSUdfQVZGT1JNQVQpICs9ICQoRkFURV9MSUJBVkZPUk1BVCkKIGZhdGUtbGliYXZmb3JtYXQ6ICQoRkFURV9MSUJBVkZPUk1BVCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvbGliYXZyZXNhbXBsZS5tYWsgYi90ZXN0cy9mYXRlL2xpYmF2cmVzYW1wbGUubWFrCmluZGV4IDY1YzA4OTguLmRhNWNiYjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvbGliYXZyZXNhbXBsZS5tYWsKKysrIGIvdGVzdHMvZmF0ZS9saWJhdnJlc2FtcGxlLm1hawpAQCAtMSw3ICsxLDcgQEAKLUNST1NTX1RFU1QgPSAkKGZvcmVhY2ggSSwkKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICQoZm9yZWFjaCBKLCQoMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgJChpZiAkKGZpbHRlci1vdXQgJChJKSwkKEopKSwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsICQoMiksJChJKSwkKEopLCQoMyksJCg0KSwkKDUpKSksICAgIFwKK0NST1NTX1RFU1QgPSAkKGZvcmVhY2ggSSwkKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgJChmb3JlYWNoIEosJCgxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICQoaWYgJChmaWx0ZXItb3V0ICQoSSksJChKKSksICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsICQoMiksJChJKSwkKEopLCQoMyksJCg0KSwkKDUpKSksIFwKICAgICAgICAgICAgICAgICAgICAgICkpKQogCiBNSVhfQ0hBTk5FTFMgPSAxIDIgMyA0IDUgNiA3IDgKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvbGliYXZ1dGlsLm1hayBiL3Rlc3RzL2ZhdGUvbGliYXZ1dGlsLm1hawppbmRleCAwMjJhZTZhLi45YjMyZDg4IDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL2xpYmF2dXRpbC5tYWsKKysrIGIvdGVzdHMvZmF0ZS9saWJhdnV0aWwubWFrCkBAIC0xLDEzMyArMSwxNjUgQEAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtYWRsZXIzMgotZmF0ZS1hZGxlcjMyOiBsaWJhdnV0aWwvYWRsZXIzMi10ZXN0JChFWEVTVUYpCi1mYXRlLWFkbGVyMzI6IENNRCA9IHJ1biBsaWJhdnV0aWwvYWRsZXIzMi10ZXN0Ci1mYXRlLWFkbGVyMzI6IFJFRiA9IC9kZXYvbnVsbAorZmF0ZS1hZGxlcjMyOiBsaWJhdnV0aWwvdGVzdHMvYWRsZXIzMiQoRVhFU1VGKQorZmF0ZS1hZGxlcjMyOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2FkbGVyMzIKK2ZhdGUtYWRsZXIzMjogQ01QID0gbnVsbAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLWFlcwotZmF0ZS1hZXM6IGxpYmF2dXRpbC9hZXMtdGVzdCQoRVhFU1VGKQotZmF0ZS1hZXM6IENNRCA9IHJ1biBsaWJhdnV0aWwvYWVzLXRlc3QKLWZhdGUtYWVzOiBSRUYgPSAvZGV2L251bGwKK2ZhdGUtYWVzOiBsaWJhdnV0aWwvdGVzdHMvYWVzJChFWEVTVUYpCitmYXRlLWFlczogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9hZXMKK2ZhdGUtYWVzOiBDTVAgPSBudWxsCisKK0ZBVEVfTElCQVZVVElMICs9IGZhdGUtYWVzX2N0cgorZmF0ZS1hZXNfY3RyOiBsaWJhdnV0aWwvdGVzdHMvYWVzX2N0ciQoRVhFU1VGKQorZmF0ZS1hZXNfY3RyOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2Flc19jdHIKK2ZhdGUtYWVzX2N0cjogQ01QID0gbnVsbAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLWNhbWVsbGlhCi1mYXRlLWNhbWVsbGlhOiBsaWJhdnV0aWwvY2FtZWxsaWEtdGVzdCQoRVhFU1VGKQotZmF0ZS1jYW1lbGxpYTogQ01EID0gcnVuIGxpYmF2dXRpbC9jYW1lbGxpYS10ZXN0Ci1mYXRlLWNhbWVsbGlhOiBSRUYgPSAvZGV2L251bGwKK2ZhdGUtY2FtZWxsaWE6IGxpYmF2dXRpbC90ZXN0cy9jYW1lbGxpYSQoRVhFU1VGKQorZmF0ZS1jYW1lbGxpYTogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9jYW1lbGxpYQorZmF0ZS1jYW1lbGxpYTogQ01QID0gbnVsbAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLWNhc3Q1Ci1mYXRlLWNhc3Q1OiBsaWJhdnV0aWwvY2FzdDUtdGVzdCQoRVhFU1VGKQotZmF0ZS1jYXN0NTogQ01EID0gcnVuIGxpYmF2dXRpbC9jYXN0NS10ZXN0Ci1mYXRlLWNhc3Q1OiBSRUYgPSAvZGV2L251bGwKK2ZhdGUtY2FzdDU6IGxpYmF2dXRpbC90ZXN0cy9jYXN0NSQoRVhFU1VGKQorZmF0ZS1jYXN0NTogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9jYXN0NQorZmF0ZS1jYXN0NTogQ01QID0gbnVsbAogCi1GQVRFX0xJQkFWVVRJTCArPSBmYXRlLWF0b21pYwotZmF0ZS1hdG9taWM6IGxpYmF2dXRpbC9hdG9taWMtdGVzdCQoRVhFU1VGKQotZmF0ZS1hdG9taWM6IENNRCA9IHJ1biBsaWJhdnV0aWwvYXRvbWljLXRlc3QKLWZhdGUtYXRvbWljOiBSRUYgPSAvZGV2L251bGwKK0ZBVEVfTElCQVZVVElMICs9IGZhdGUtYXVkaW9fZmlmbworZmF0ZS1hdWRpb19maWZvOiBsaWJhdnV0aWwvdGVzdHMvYXVkaW9fZmlmbyQoRVhFU1VGKQorZmF0ZS1hdWRpb19maWZvOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2F1ZGlvX2ZpZm8KIAogRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1hdnN0cmluZwotZmF0ZS1hdnN0cmluZzogbGliYXZ1dGlsL2F2c3RyaW5nLXRlc3QkKEVYRVNVRikKLWZhdGUtYXZzdHJpbmc6IENNRCA9IHJ1biBsaWJhdnV0aWwvYXZzdHJpbmctdGVzdAorZmF0ZS1hdnN0cmluZzogbGliYXZ1dGlsL3Rlc3RzL2F2c3RyaW5nJChFWEVTVUYpCitmYXRlLWF2c3RyaW5nOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2F2c3RyaW5nCiAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtYmFzZTY0Ci1mYXRlLWJhc2U2NDogbGliYXZ1dGlsL2Jhc2U2NC10ZXN0JChFWEVTVUYpCi1mYXRlLWJhc2U2NDogQ01EID0gcnVuIGxpYmF2dXRpbC9iYXNlNjQtdGVzdAorZmF0ZS1iYXNlNjQ6IGxpYmF2dXRpbC90ZXN0cy9iYXNlNjQkKEVYRVNVRikKK2ZhdGUtYmFzZTY0OiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2Jhc2U2NAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLWJsb3dmaXNoCi1mYXRlLWJsb3dmaXNoOiBsaWJhdnV0aWwvYmxvd2Zpc2gtdGVzdCQoRVhFU1VGKQotZmF0ZS1ibG93ZmlzaDogQ01EID0gcnVuIGxpYmF2dXRpbC9ibG93ZmlzaC10ZXN0CitmYXRlLWJsb3dmaXNoOiBsaWJhdnV0aWwvdGVzdHMvYmxvd2Zpc2gkKEVYRVNVRikKK2ZhdGUtYmxvd2Zpc2g6IENNRCA9IHJ1biBsaWJhdnV0aWwvdGVzdHMvYmxvd2Zpc2gKIAogRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1icHJpbnQKLWZhdGUtYnByaW50OiBsaWJhdnV0aWwvYnByaW50LXRlc3QkKEVYRVNVRikKLWZhdGUtYnByaW50OiBDTUQgPSBydW4gbGliYXZ1dGlsL2JwcmludC10ZXN0CitmYXRlLWJwcmludDogbGliYXZ1dGlsL3Rlc3RzL2JwcmludCQoRVhFU1VGKQorZmF0ZS1icHJpbnQ6IENNRCA9IHJ1biBsaWJhdnV0aWwvdGVzdHMvYnByaW50CiAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtY3B1Ci1mYXRlLWNwdTogbGliYXZ1dGlsL2NwdS10ZXN0JChFWEVTVUYpCi1mYXRlLWNwdTogQ01EID0gcnVuZWNobyBsaWJhdnV0aWwvY3B1LXRlc3QgJChDUFVGTEFHUzolPS1jJSkgJChUSFJFQURTOiU9LXQlKQotZmF0ZS1jcHU6IFJFRiA9IC9kZXYvbnVsbAorZmF0ZS1jcHU6IGxpYmF2dXRpbC90ZXN0cy9jcHUkKEVYRVNVRikKK2ZhdGUtY3B1OiBDTUQgPSBydW5lY2hvIGxpYmF2dXRpbC90ZXN0cy9jcHUgJChDUFVGTEFHUzolPS1jJSkgJChUSFJFQURTOiU9LXQlKQorZmF0ZS1jcHU6IENNUCA9IG51bGwKKworRkFURV9MSUJBVlVUSUwtJChIQVZFX1RIUkVBRFMpICs9IGZhdGUtY3B1X2luaXQKK2ZhdGUtY3B1X2luaXQ6IGxpYmF2dXRpbC90ZXN0cy9jcHVfaW5pdCQoRVhFU1VGKQorZmF0ZS1jcHVfaW5pdDogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9jcHVfaW5pdAorZmF0ZS1jcHVfaW5pdDogQ01QID0gbnVsbAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLWNyYwotZmF0ZS1jcmM6IGxpYmF2dXRpbC9jcmMtdGVzdCQoRVhFU1VGKQotZmF0ZS1jcmM6IENNRCA9IHJ1biBsaWJhdnV0aWwvY3JjLXRlc3QKK2ZhdGUtY3JjOiBsaWJhdnV0aWwvdGVzdHMvY3JjJChFWEVTVUYpCitmYXRlLWNyYzogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9jcmMKKworRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1jb2xvcl91dGlscworZmF0ZS1jb2xvcl91dGlsczogbGliYXZ1dGlsL3Rlc3RzL2NvbG9yX3V0aWxzJChFWEVTVUYpCitmYXRlLWNvbG9yX3V0aWxzOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2NvbG9yX3V0aWxzCiAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtZGVzCi1mYXRlLWRlczogbGliYXZ1dGlsL2Rlcy10ZXN0JChFWEVTVUYpCi1mYXRlLWRlczogQ01EID0gcnVuIGxpYmF2dXRpbC9kZXMtdGVzdAotZmF0ZS1kZXM6IFJFRiA9IC9kZXYvbnVsbAorZmF0ZS1kZXM6IGxpYmF2dXRpbC90ZXN0cy9kZXMkKEVYRVNVRikKK2ZhdGUtZGVzOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2RlcworZmF0ZS1kZXM6IENNUCA9IG51bGwKIAogRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1kaWN0Ci1mYXRlLWRpY3Q6IGxpYmF2dXRpbC9kaWN0LXRlc3QkKEVYRVNVRikKLWZhdGUtZGljdDogQ01EID0gcnVuIGxpYmF2dXRpbC9kaWN0LXRlc3QKK2ZhdGUtZGljdDogbGliYXZ1dGlsL3Rlc3RzL2RpY3QkKEVYRVNVRikKK2ZhdGUtZGljdDogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9kaWN0CiAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtZXZhbAotZmF0ZS1ldmFsOiBsaWJhdnV0aWwvZXZhbC10ZXN0JChFWEVTVUYpCi1mYXRlLWV2YWw6IENNRCA9IHJ1biBsaWJhdnV0aWwvZXZhbC10ZXN0CitmYXRlLWV2YWw6IGxpYmF2dXRpbC90ZXN0cy9ldmFsJChFWEVTVUYpCitmYXRlLWV2YWw6IENNRCA9IHJ1biBsaWJhdnV0aWwvdGVzdHMvZXZhbAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLWZpZm8KLWZhdGUtZmlmbzogbGliYXZ1dGlsL2ZpZm8tdGVzdCQoRVhFU1VGKQotZmF0ZS1maWZvOiBDTUQgPSBydW4gbGliYXZ1dGlsL2ZpZm8tdGVzdAorZmF0ZS1maWZvOiBsaWJhdnV0aWwvdGVzdHMvZmlmbyQoRVhFU1VGKQorZmF0ZS1maWZvOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2ZpZm8KIAotRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1mbG9hdC1kc3AKLWZhdGUtZmxvYXQtZHNwOiBsaWJhdnV0aWwvZmxvYXRfZHNwLXRlc3QkKEVYRVNVRikKLWZhdGUtZmxvYXQtZHNwOiBDTUQgPSBydW4gbGliYXZ1dGlsL2Zsb2F0X2RzcC10ZXN0ICQoQ1BVRkxBR1M6JT0tYyUpCi1mYXRlLWZsb2F0LWRzcDogQ01QID0gbnVsbAotZmF0ZS1mbG9hdC1kc3A6IFJFRiA9IC9kZXYvbnVsbAorRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1oYXNoCitmYXRlLWhhc2g6IGxpYmF2dXRpbC90ZXN0cy9oYXNoJChFWEVTVUYpCitmYXRlLWhhc2g6IENNRCA9IHJ1biBsaWJhdnV0aWwvdGVzdHMvaGFzaAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLWhtYWMKLWZhdGUtaG1hYzogbGliYXZ1dGlsL2htYWMtdGVzdCQoRVhFU1VGKQotZmF0ZS1obWFjOiBDTUQgPSBydW4gbGliYXZ1dGlsL2htYWMtdGVzdAorZmF0ZS1obWFjOiBsaWJhdnV0aWwvdGVzdHMvaG1hYyQoRVhFU1VGKQorZmF0ZS1obWFjOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2htYWMKKworRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1pbWd1dGlscworZmF0ZS1pbWd1dGlsczogbGliYXZ1dGlsL3Rlc3RzL2ltZ3V0aWxzJChFWEVTVUYpCitmYXRlLWltZ3V0aWxzOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2ltZ3V0aWxzCisKK0ZBVEVfTElCQVZVVElMICs9IGZhdGUtaW50ZWdlcgorZmF0ZS1pbnRlZ2VyOiBsaWJhdnV0aWwvdGVzdHMvaW50ZWdlciQoRVhFU1VGKQorZmF0ZS1pbnRlZ2VyOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2ludGVnZXIKK2ZhdGUtaW50ZWdlcjogQ01QID0gbnVsbAorCitGQVRFX0xJQkFWVVRJTCArPSBmYXRlLWxmZworZmF0ZS1sZmc6IGxpYmF2dXRpbC90ZXN0cy9sZmckKEVYRVNVRikKK2ZhdGUtbGZnOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2xmZwogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLW1kNQotZmF0ZS1tZDU6IGxpYmF2dXRpbC9tZDUtdGVzdCQoRVhFU1VGKQotZmF0ZS1tZDU6IENNRCA9IHJ1biBsaWJhdnV0aWwvbWQ1LXRlc3QKK2ZhdGUtbWQ1OiBsaWJhdnV0aWwvdGVzdHMvbWQ1JChFWEVTVUYpCitmYXRlLW1kNTogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9tZDUKIAogRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1tdXJtdXIzCi1mYXRlLW11cm11cjM6IGxpYmF2dXRpbC9tdXJtdXIzLXRlc3QkKEVYRVNVRikKLWZhdGUtbXVybXVyMzogQ01EID0gcnVuIGxpYmF2dXRpbC9tdXJtdXIzLXRlc3QKK2ZhdGUtbXVybXVyMzogbGliYXZ1dGlsL3Rlc3RzL211cm11cjMkKEVYRVNVRikKK2ZhdGUtbXVybXVyMzogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9tdXJtdXIzCiAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtcGFyc2V1dGlscwotZmF0ZS1wYXJzZXV0aWxzOiBsaWJhdnV0aWwvcGFyc2V1dGlscy10ZXN0JChFWEVTVUYpCi1mYXRlLXBhcnNldXRpbHM6IENNRCA9IHJ1biBsaWJhdnV0aWwvcGFyc2V1dGlscy10ZXN0CitmYXRlLXBhcnNldXRpbHM6IGxpYmF2dXRpbC90ZXN0cy9wYXJzZXV0aWxzJChFWEVTVUYpCitmYXRlLXBhcnNldXRpbHM6IENNRCA9IHJ1biBsaWJhdnV0aWwvdGVzdHMvcGFyc2V1dGlscwogCiBGQVRFX0xJQkFWVVRJTC0kKENPTkZJR19QSVhFTFVUSUxTKSArPSBmYXRlLXBpeGVsdXRpbHMKLWZhdGUtcGl4ZWx1dGlsczogbGliYXZ1dGlsL3BpeGVsdXRpbHMtdGVzdCQoRVhFU1VGKQotZmF0ZS1waXhlbHV0aWxzOiBDTUQgPSBydW4gbGliYXZ1dGlsL3BpeGVsdXRpbHMtdGVzdAorZmF0ZS1waXhlbHV0aWxzOiBsaWJhdnV0aWwvdGVzdHMvcGl4ZWx1dGlscyQoRVhFU1VGKQorZmF0ZS1waXhlbHV0aWxzOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL3BpeGVsdXRpbHMKKworRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1waXhmbXRfYmVzdAorZmF0ZS1waXhmbXRfYmVzdDogbGliYXZ1dGlsL3Rlc3RzL3BpeGZtdF9iZXN0JChFWEVTVUYpCitmYXRlLXBpeGZtdF9iZXN0OiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL3BpeGZtdF9iZXN0CisKK0ZBVEVfTElCQVZVVElMICs9IGZhdGUtZGlzcGxheQorZmF0ZS1kaXNwbGF5OiBsaWJhdnV0aWwvdGVzdHMvZGlzcGxheSQoRVhFU1VGKQorZmF0ZS1kaXNwbGF5OiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL2Rpc3BsYXkKIAogRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1yYW5kb21fc2VlZAotZmF0ZS1yYW5kb21fc2VlZDogbGliYXZ1dGlsL3JhbmRvbV9zZWVkLXRlc3QkKEVYRVNVRikKLWZhdGUtcmFuZG9tX3NlZWQ6IENNRCA9IHJ1biBsaWJhdnV0aWwvcmFuZG9tX3NlZWQtdGVzdAorZmF0ZS1yYW5kb21fc2VlZDogbGliYXZ1dGlsL3Rlc3RzL3JhbmRvbV9zZWVkJChFWEVTVUYpCitmYXRlLXJhbmRvbV9zZWVkOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL3JhbmRvbV9zZWVkCiAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtcmlwZW1kCi1mYXRlLXJpcGVtZDogbGliYXZ1dGlsL3JpcGVtZC10ZXN0JChFWEVTVUYpCi1mYXRlLXJpcGVtZDogQ01EID0gcnVuIGxpYmF2dXRpbC9yaXBlbWQtdGVzdAorZmF0ZS1yaXBlbWQ6IGxpYmF2dXRpbC90ZXN0cy9yaXBlbWQkKEVYRVNVRikKK2ZhdGUtcmlwZW1kOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL3JpcGVtZAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLXNoYQotZmF0ZS1zaGE6IGxpYmF2dXRpbC9zaGEtdGVzdCQoRVhFU1VGKQotZmF0ZS1zaGE6IENNRCA9IHJ1biBsaWJhdnV0aWwvc2hhLXRlc3QKK2ZhdGUtc2hhOiBsaWJhdnV0aWwvdGVzdHMvc2hhJChFWEVTVUYpCitmYXRlLXNoYTogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9zaGEKIAogRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS1zaGE1MTIKLWZhdGUtc2hhNTEyOiBsaWJhdnV0aWwvc2hhNTEyLXRlc3QkKEVYRVNVRikKLWZhdGUtc2hhNTEyOiBDTUQgPSBydW4gbGliYXZ1dGlsL3NoYTUxMi10ZXN0CitmYXRlLXNoYTUxMjogbGliYXZ1dGlsL3Rlc3RzL3NoYTUxMiQoRVhFU1VGKQorZmF0ZS1zaGE1MTI6IENNRCA9IHJ1biBsaWJhdnV0aWwvdGVzdHMvc2hhNTEyCiAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtdHJlZQotZmF0ZS10cmVlOiBsaWJhdnV0aWwvdHJlZS10ZXN0JChFWEVTVUYpCi1mYXRlLXRyZWU6IENNRCA9IHJ1biBsaWJhdnV0aWwvdHJlZS10ZXN0Ci1mYXRlLXRyZWU6IFJFRiA9IC9kZXYvbnVsbAorZmF0ZS10cmVlOiBsaWJhdnV0aWwvdGVzdHMvdHJlZSQoRVhFU1VGKQorZmF0ZS10cmVlOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL3RyZWUKK2ZhdGUtdHJlZTogQ01QID0gbnVsbAogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLXR3b2Zpc2gKLWZhdGUtdHdvZmlzaDogbGliYXZ1dGlsL3R3b2Zpc2gtdGVzdCQoRVhFU1VGKQotZmF0ZS10d29maXNoOiBDTUQgPSBydW4gbGliYXZ1dGlsL3R3b2Zpc2gtdGVzdAotZmF0ZS10d29maXNoOiBSRUYgPSAvZGV2L251bGwKK2ZhdGUtdHdvZmlzaDogbGliYXZ1dGlsL3Rlc3RzL3R3b2Zpc2gkKEVYRVNVRikKK2ZhdGUtdHdvZmlzaDogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy90d29maXNoCitmYXRlLXR3b2Zpc2g6IENNUCA9IG51bGwKIAogRkFURV9MSUJBVlVUSUwgKz0gZmF0ZS14dGVhCi1mYXRlLXh0ZWE6IGxpYmF2dXRpbC94dGVhLXRlc3QkKEVYRVNVRikKLWZhdGUteHRlYTogQ01EID0gcnVuIGxpYmF2dXRpbC94dGVhLXRlc3QKK2ZhdGUteHRlYTogbGliYXZ1dGlsL3Rlc3RzL3h0ZWEkKEVYRVNVRikKK2ZhdGUteHRlYTogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy94dGVhCiAKIEZBVEVfTElCQVZVVElMICs9IGZhdGUtdGVhCi1mYXRlLXRlYTogbGliYXZ1dGlsL3RlYS10ZXN0JChFWEVTVUYpCi1mYXRlLXRlYTogQ01EID0gcnVuIGxpYmF2dXRpbC90ZWEtdGVzdAorZmF0ZS10ZWE6IGxpYmF2dXRpbC90ZXN0cy90ZWEkKEVYRVNVRikKK2ZhdGUtdGVhOiBDTUQgPSBydW4gbGliYXZ1dGlsL3Rlc3RzL3RlYQogCiBGQVRFX0xJQkFWVVRJTCArPSBmYXRlLW9wdAotZmF0ZS1vcHQ6IGxpYmF2dXRpbC9vcHQtdGVzdCQoRVhFU1VGKQotZmF0ZS1vcHQ6IENNRCA9IHJ1biBsaWJhdnV0aWwvb3B0LXRlc3QKK2ZhdGUtb3B0OiBsaWJhdnV0aWwvdGVzdHMvb3B0JChFWEVTVUYpCitmYXRlLW9wdDogQ01EID0gcnVuIGxpYmF2dXRpbC90ZXN0cy9vcHQKIAogRkFURV9MSUJBVlVUSUwgKz0gJChGQVRFX0xJQkFWVVRJTC15ZXMpCiBGQVRFLSQoQ09ORklHX0FWVVRJTCkgKz0gJChGQVRFX0xJQkFWVVRJTCkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvbGlic3dyZXNhbXBsZS5tYWsgYi90ZXN0cy9mYXRlL2xpYnN3cmVzYW1wbGUubWFrCmluZGV4IDA2NGMwZjYuLmZlZDQ4MWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvbGlic3dyZXNhbXBsZS5tYWsKKysrIGIvdGVzdHMvZmF0ZS9saWJzd3Jlc2FtcGxlLm1hawpAQCAtMTEsMTAgKzExLDExIEBACiAKIFNBTVBMRVJBVEVTX05OID0gODAwMCA0NDEwMAogCisjbm90ZSB0aGF0IHRoZSBkZWZhdWx0IGlzIEFSRVNBTVBMRV9FWEFDVF9MSU4KIGRlZmluZSBBUkVTQU1QTEUKIEZBVEVfU1dSX1JFU0FNUExFICs9IGZhdGUtc3dyLXJlc2FtcGxlLSQoMyktJCgxKS0kKDIpCiBmYXRlLXN3ci1yZXNhbXBsZS0kKDMpLSQoMSktJCgyKTogdGVzdHMvZGF0YS9hc3ludGgtJCgxKS0xLndhdgotZmF0ZS1zd3ItcmVzYW1wbGUtJCgzKS0kKDEpLSQoMik6IENNRCA9IGZmbXBlZyAtaSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC0kKDEpLTEud2F2IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTEwMjQwLGFyZXNhbXBsZT0kKDIpOmludGVybmFsX3NhbXBsZV9mbXQ9JCgzKSxhZm9ybWF0PSQoMyksYXJlc2FtcGxlPSQoMSk6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpIC1mIHdhdiAtYWNvZGVjIHBjbV9zMTZsZSAtCitmYXRlLXN3ci1yZXNhbXBsZS0kKDMpLSQoMSktJCgyKTogQ01EID0gZmZtcGVnIC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYgLWFmIGF0cmltPWVuZF9zYW1wbGU9MTAyNDAsYXJlc2FtcGxlPSQoMik6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpOmV4YWN0X3JhdGlvbmFsPTA6bGluZWFyX2ludGVycD0wLGFmb3JtYXQ9JCgzKSxhcmVzYW1wbGU9JCgxKTppbnRlcm5hbF9zYW1wbGVfZm10PSQoMyk6ZXhhY3RfcmF0aW9uYWw9MDpsaW5lYXJfaW50ZXJwPTAgLWYgd2F2IC1jOmEgcGNtX3MxNmxlIC0KIAogZmF0ZS1zd3ItcmVzYW1wbGUtJCgzKS0kKDEpLSQoMik6IENNUCA9IHN0ZGRldgogZmF0ZS1zd3ItcmVzYW1wbGUtJCgzKS0kKDEpLSQoMik6IENNUF9VTklUID0gJCg1KQpAQCAtMjYsMTMgKzI3LDEzIEBACiAjeW91IGNhbiB1c2UgdGhpcyBpZiB5b3UgbmVlZCB0byB1cGRhdGUgaXQhCiAjbWFrZSAtayAgYG1ha2UgZmF0ZS1saXN0IHwgZ3JlcCBzd3JgIHwgZWdyZXAgJ1RFU1R8c3RkZGV2JyB8IHRyICdcbicgJ0AnIHwgc2VkICdzI1RFU1QgKlwoW15AXSpcKUBzdGRkZXY6ICpcKFswLTkuXSpcKVteYkBdKmJ5dGVzOiAqXChbMC05XSpcKSAqLyAqXChbMC05XSpcKUAjZmF0ZS1cMTogQ01QX1RBUkdFVCA9IFwyQGZhdGUtXDE6IFNJWkVfVE9MRVJBTkNFID0gXDMgLSBcNEBAI2cnIHwgdHIgJ0AnICdcbicKIAotZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM1Mi42OAorZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NwogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC0yNjI2LTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NQorZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NgogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC0yNjI2LTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC0yNjI2LTgwMDA6IENNUF9UQVJHRVQgPSAxMzUzLjA4CitmYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTI2MjYtODAwMDogQ01QX1RBUkdFVCA9IDEzNTIuNTYKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtMjYyNi04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODIKIAogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC0yNjI2LTk2MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NwpAQCAtNDEsMTkgKzQyLDE5IEBACiBmYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTQ0MTAwLTI2MjY6IENNUF9UQVJHRVQgPSAxODUuODIKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtNDQxMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ5MAogCi1mYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS43MAorZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC00NDEwMC00ODAwMDogQ01QX1RBUkdFVCA9IDkuNjkKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtNDQxMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKIAogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNzUuNDUKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtNDQxMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4NgogCi1mYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTQ0MTAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMTEuNDcKK2ZhdGUtc3dyLXJlc2FtcGxlLWRibHAtNDQxMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMS40NgogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC00NDEwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgogCiBmYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTQ4MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA0NTYuNTEKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtNDgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDUxMAogCi1mYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS4wMgorZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC00ODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDEuMDAKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKIAogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC00ODAwMC04MDAwOiBDTVBfVEFSR0VUID0gNjIuMzgKQEAgLTYyLDcgKzYzLDcgQEAKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtNDgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAwLjQ3CiBmYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTQ4MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLWRibHAtODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gMjUwNi4wMgorZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC04MDAwLTI2MjY6IENNUF9UQVJHRVQgPSAyNTAzLjMzCiBmYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDg2CiAKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDE1LjA5CkBAIC03NCwyNSArNzUsMjUgQEAKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDEzLjgxCiBmYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTgwMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4MAogCi1mYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTk2MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA2NzUuMDgKK2ZhdGUtc3dyLXJlc2FtcGxlLWRibHAtOTYwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDY3NS4wNwogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC05NjAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ3NAogCi1mYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTk2MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS40NQorZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC05NjAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDEuNDQKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtOTYwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLWRibHAtOTYwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxLjAwCitmYXRlLXN3ci1yZXNhbXBsZS1kYmxwLTk2MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMC45OQogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC05NjAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0ODAKIAogZmF0ZS1zd3ItcmVzYW1wbGUtZGJscC05NjAwMC04MDAwOiBDTVBfVEFSR0VUID0gNTguNTcKIGZhdGUtc3dyLXJlc2FtcGxlLWRibHAtOTYwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0OTYKIAotZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM1Mi42OAorZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NwogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC0yNjI2LTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NQorZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NgogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC0yNjI2LTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC0yNjI2LTgwMDA6IENNUF9UQVJHRVQgPSAxMzUzLjA4CitmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTI2MjYtODAwMDogQ01QX1RBUkdFVCA9IDEzNTIuNTYKIGZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtMjYyNi04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODIKIAogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC0yNjI2LTk2MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NwpAQCAtMTAxLDE5ICsxMDIsMTkgQEAKIGZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtNDQxMDAtMjYyNjogQ01QX1RBUkdFVCA9IDE4NS44MgogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC00NDEwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDkwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtNDQxMDAtNDgwMDA6IENNUF9UQVJHRVQgPSA5LjcwCitmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS42OQogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC00NDEwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgogCiBmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTQ0MTAwLTgwMDA6IENNUF9UQVJHRVQgPSA3NS40NQogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CiAKLWZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtNDQxMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMS40NworZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC00NDEwMC05NjAwMDogQ01QX1RBUkdFVCA9IDExLjQ2CiBmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTQ0MTAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDgyCiAKIGZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtNDgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDQ1Ni41MQogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC00ODAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNTEwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtNDgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxLjAyCitmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS4wMAogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC00ODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4MAogCiBmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA2Mi4zOApAQCAtMTIyLDcgKzEyMyw3IEBACiBmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTQ4MDAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMC40NwogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC00ODAwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4MAogCi1mYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDI1MDYuMDIKK2ZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gMjUwMy4zMwogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC04MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4NgogCiBmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxNS4wOQpAQCAtMTM0LDI4ICsxMzUsMjggQEAKIGZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDEzLjgxCiBmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTgwMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4MAogCi1mYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTk2MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA2NzUuMDgKK2ZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtOTYwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDY3NS4wNwogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC05NjAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ3NAogCi1mYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTk2MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS40NQorZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC05NjAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDEuNDQKIGZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtOTYwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtOTYwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxLjAwCitmYXRlLXN3ci1yZXNhbXBsZS1mbHRwLTk2MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMC45OQogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC05NjAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0ODAKIAogZmF0ZS1zd3ItcmVzYW1wbGUtZmx0cC05NjAwMC04MDAwOiBDTVBfVEFSR0VUID0gNTguNTcKIGZhdGUtc3dyLXJlc2FtcGxlLWZsdHAtOTYwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0OTYKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM5My4wMQorZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM5Mi45OAogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM5Mi45OQorZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM5My4wMQogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTgwMDA6IENNUF9UQVJHRVQgPSAxMzkzLjkwCitmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTI2MjYtODAwMDogQ01QX1RBUkdFVCA9IDEzOTMuMzYKIGZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtMjYyNi04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODIKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTk2MDAwOiBDTVBfVEFSR0VUID0gMTM5My4wOAorZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTk2MDAwOiBDTVBfVEFSR0VUID0gMTM5My4wNwogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC0yNjI2LTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC00NDEwMC0yNjI2OiBDTVBfVEFSR0VUID0gMTg1Ljg0CkBAIC0xNzMsMTkgKzE3NCwxOSBAQAogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC00ODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gNDU2LjU1CiBmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTQ4MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA1MTAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC00ODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDEuMjIKK2ZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtNDgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxLjIwCiBmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTQ4MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCiAKIGZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDYyLjQxCiBmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTQ4MDAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODQKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC00ODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDAuNTAKK2ZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtNDgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAwLjczCiBmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTQ4MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gMjUwNi4wMgorZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC04MDAwLTI2MjY6IENNUF9UQVJHRVQgPSAyNTAzLjMyCiBmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDg2CiAKLWZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDE1LjEyCitmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxNS4xMwogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC04MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKIAogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC04MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMTQuNjkKQEAgLTE5NCwzMSArMTk1LDMxIEBACiBmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMy44MwogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC04MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC05NjAwMC0yNjI2OiBDTVBfVEFSR0VUID0gNjc1LjE0CitmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTk2MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA2NzUuMTUKIGZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtOTYwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0NzQKIAogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC05NjAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDEuNjIKIGZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtOTYwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtOTYwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxLjAzCitmYXRlLXN3ci1yZXNhbXBsZS1zMTZwLTk2MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMS4xMgogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC05NjAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0ODAKIAogZmF0ZS1zd3ItcmVzYW1wbGUtczE2cC05NjAwMC04MDAwOiBDTVBfVEFSR0VUID0gNTguNjAKIGZhdGUtc3dyLXJlc2FtcGxlLXMxNnAtOTYwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0OTYKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM5My4wMQorZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM5Mi45OQogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM5Mi45OQorZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM5My4wMQogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTgwMDA6IENNUF9UQVJHRVQgPSAxMzkzLjg5CitmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTI2MjYtODAwMDogQ01QX1RBUkdFVCA9IDEzOTMuMzYKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtMjYyNi04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODIKIAogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTk2MDAwOiBDTVBfVEFSR0VUID0gMTM5My4wMAogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC0yNjI2LTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczMycC00NDEwMC0yNjI2OiBDTVBfVEFSR0VUID0gMTg1LjgyCitmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTQ0MTAwLTI2MjY6IENNUF9UQVJHRVQgPSAxODUuODEKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtNDQxMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ5MAogCiBmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS43MApAQCAtMjMwLDQ3ICsyMzEsNDcgQEAKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtNDQxMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMS40NwogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC00NDEwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgogCi1mYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTQ4MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA0NTYuNTEKK2ZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtNDgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDQ1Ni40OQogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC00ODAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNTEwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtNDgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxLjAyCitmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS4xMgogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC00ODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4MAogCi1mYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA2Mi4zOAorZmF0ZS1zd3ItcmVzYW1wbGUtczMycC00ODAwMC04MDAwOiBDTVBfVEFSR0VUID0gNjIuMzcKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtNDgwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4NAogCi1mYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTQ4MDAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMC40NworZmF0ZS1zd3ItcmVzYW1wbGUtczMycC00ODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDAuODUKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtNDgwMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczMycC04MDAwLTI2MjY6IENNUF9UQVJHRVQgPSAyNTA2LjAyCitmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDI1MDMuMzMKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtODAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODYKIAogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC04MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTUuMDkKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtODAwMC00ODAwMDogQ01QX1RBUkdFVCA9IDE0LjY5CitmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxNC42OAogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC04MDAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKIAogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC04MDAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMTMuODEKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtODAwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCiAKLWZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtOTYwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDY3NS4wOAorZmF0ZS1zd3ItcmVzYW1wbGUtczMycC05NjAwMC0yNjI2OiBDTVBfVEFSR0VUID0gNjc1LjA1CiBmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTk2MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDc0CiAKLWZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtOTYwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxLjQ1CitmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTk2MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS41NAogZmF0ZS1zd3ItcmVzYW1wbGUtczMycC05NjAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0ODAKIAotZmF0ZS1zd3ItcmVzYW1wbGUtczMycC05NjAwMC00ODAwMDogQ01QX1RBUkdFVCA9IDEuMDAKK2ZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtOTYwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxLjIxCiBmYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTk2MDAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ4MAogCi1mYXRlLXN3ci1yZXNhbXBsZS1zMzJwLTk2MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA1OC41NworZmF0ZS1zd3ItcmVzYW1wbGUtczMycC05NjAwMC04MDAwOiBDTVBfVEFSR0VUID0gNTguNTkKIGZhdGUtc3dyLXJlc2FtcGxlLXMzMnAtOTYwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0OTYKIAogCiBkZWZpbmUgQVJFU0FNUExFX0xJTgogRkFURV9TV1JfUkVTQU1QTEUgKz0gZmF0ZS1zd3ItcmVzYW1wbGVfbGluLSQoMyktJCgxKS0kKDIpCiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tJCgzKS0kKDEpLSQoMik6IHRlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYKLWZhdGUtc3dyLXJlc2FtcGxlX2xpbi0kKDMpLSQoMSktJCgyKTogQ01EID0gZmZtcGVnIC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYgLWFmIGF0cmltPWVuZF9zYW1wbGU9MTAyNDAsYXJlc2FtcGxlPSQoMik6bGluZWFyX2ludGVycD0xOmludGVybmFsX3NhbXBsZV9mbXQ9JCgzKSxhZm9ybWF0PSQoMyksYXJlc2FtcGxlPSQoMSk6bGluZWFyX2ludGVycD0xOmludGVybmFsX3NhbXBsZV9mbXQ9JCgzKSAtZiB3YXYgLWFjb2RlYyBwY21fczE2bGUgLQorZmF0ZS1zd3ItcmVzYW1wbGVfbGluLSQoMyktJCgxKS0kKDIpOiBDTUQgPSBmZm1wZWcgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtJCgxKS0xLndhdiAtYWYgYXRyaW09ZW5kX3NhbXBsZT0xMDI0MCxhcmVzYW1wbGU9JCgyKTpsaW5lYXJfaW50ZXJwPTE6ZXhhY3RfcmF0aW9uYWw9MDppbnRlcm5hbF9zYW1wbGVfZm10PSQoMyksYWZvcm1hdD0kKDMpLGFyZXNhbXBsZT0kKDEpOmxpbmVhcl9pbnRlcnA9MTpleGFjdF9yYXRpb25hbD0wOmludGVybmFsX3NhbXBsZV9mbXQ9JCgzKSAtZiB3YXYgLWM6YSBwY21fczE2bGUgLQogCiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tJCgzKS0kKDEpLSQoMik6IENNUCA9IHN0ZGRldgogZmF0ZS1zd3ItcmVzYW1wbGVfbGluLSQoMyktJCgxKS0kKDIpOiBDTVBfVU5JVCA9ICQoNSkKQEAgLTI5MCwxMCArMjkxLDEwIEBACiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tczE2cC00NDEwMC00ODAwMDogQ01QX1RBUkdFVCA9IDkuNjYKIGZhdGUtc3dyLXJlc2FtcGxlX2xpbi1zMTZwLTQ0MTAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDgyCiAKLWZhdGUtc3dyLXJlc2FtcGxlX2xpbi1zMTZwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA2Mi4zOQorZmF0ZS1zd3ItcmVzYW1wbGVfbGluLXMxNnAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDYyLjM4CiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tczE2cC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDg0CiAKLWZhdGUtc3dyLXJlc2FtcGxlX2xpbi1zMTZwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMC42OAorZmF0ZS1zd3ItcmVzYW1wbGVfbGluLXMxNnAtNDgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAwLjY1CiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tczE2cC00ODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4MAogCiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tZmx0cC04MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTQuNTkKQEAgLTMwNSwxMyArMzA2LDEzIEBACiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tZmx0cC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNzUuMzgKIGZhdGUtc3dyLXJlc2FtcGxlX2xpbi1mbHRwLTQ0MTAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODYKIAotZmF0ZS1zd3ItcmVzYW1wbGVfbGluLWZsdHAtNDQxMDAtNDgwMDA6IENNUF9UQVJHRVQgPSA5LjY1CitmYXRlLXN3ci1yZXNhbXBsZV9saW4tZmx0cC00NDEwMC00ODAwMDogQ01QX1RBUkdFVCA9IDkuNjQKIGZhdGUtc3dyLXJlc2FtcGxlX2xpbi1mbHRwLTQ0MTAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDgyCiAKIGZhdGUtc3dyLXJlc2FtcGxlX2xpbi1mbHRwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA2Mi4zNgogZmF0ZS1zd3ItcmVzYW1wbGVfbGluLWZsdHAtNDgwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4NAogCi1mYXRlLXN3ci1yZXNhbXBsZV9saW4tZmx0cC00ODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDAuMjYKK2ZhdGUtc3dyLXJlc2FtcGxlX2xpbi1mbHRwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMC4yMwogZmF0ZS1zd3ItcmVzYW1wbGVfbGluLWZsdHAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKIAogZmF0ZS1zd3ItcmVzYW1wbGVfbGluLWRibHAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDE0LjU5CkBAIC0zMjMsMTkgKzMyNCwxOSBAQAogZmF0ZS1zd3ItcmVzYW1wbGVfbGluLWRibHAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDc1LjM4CiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tZGJscC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CiAKLWZhdGUtc3dyLXJlc2FtcGxlX2xpbi1kYmxwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS42NQorZmF0ZS1zd3ItcmVzYW1wbGVfbGluLWRibHAtNDQxMDAtNDgwMDA6IENNUF9UQVJHRVQgPSA5LjY0CiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tZGJscC00NDEwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgogCiBmYXRlLXN3ci1yZXNhbXBsZV9saW4tZGJscC00ODAwMC04MDAwOiBDTVBfVEFSR0VUID0gNjIuMzYKIGZhdGUtc3dyLXJlc2FtcGxlX2xpbi1kYmxwLTQ4MDAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODQKIAotZmF0ZS1zd3ItcmVzYW1wbGVfbGluLWRibHAtNDgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAwLjI2CitmYXRlLXN3ci1yZXNhbXBsZV9saW4tZGJscC00ODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDAuMjMKIGZhdGUtc3dyLXJlc2FtcGxlX2xpbi1kYmxwLTQ4MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCiAKIGRlZmluZSBBUkVTQU1QTEVfTk4KIEZBVEVfU1dSX1JFU0FNUExFICs9IGZhdGUtc3dyLXJlc2FtcGxlX25uLSQoMyktJCgxKS0kKDIpCiBmYXRlLXN3ci1yZXNhbXBsZV9ubi0kKDMpLSQoMSktJCgyKTogdGVzdHMvZGF0YS9hc3ludGgtJCgxKS0xLndhdgotZmF0ZS1zd3ItcmVzYW1wbGVfbm4tJCgzKS0kKDEpLSQoMik6IENNRCA9IGZmbXBlZyAtaSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC0kKDEpLTEud2F2IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTEwMjQwLGFyZXNhbXBsZT0kKDIpOmZpbHRlcl9zaXplPTE6cGhhc2Vfc2hpZnQ9MDppbnRlcm5hbF9zYW1wbGVfZm10PSQoMyksYWZvcm1hdD0kKDMpLGFyZXNhbXBsZT0kKDEpOmludGVybmFsX3NhbXBsZV9mbXQ9JCgzKSAtZiB3YXYgLWFjb2RlYyBwY21fczE2bGUgLQorZmF0ZS1zd3ItcmVzYW1wbGVfbm4tJCgzKS0kKDEpLSQoMik6IENNRCA9IGZmbXBlZyAtaSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC0kKDEpLTEud2F2IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTEwMjQwLGFyZXNhbXBsZT0kKDIpOmZpbHRlcl9zaXplPTE6cGhhc2Vfc2hpZnQ9MDpsaW5lYXJfaW50ZXJwPTA6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpLGFmb3JtYXQ9JCgzKSxhcmVzYW1wbGU9JCgxKTpsaW5lYXJfaW50ZXJwPTA6ZXhhY3RfcmF0aW9uYWw9MDppbnRlcm5hbF9zYW1wbGVfZm10PSQoMykgLWYgd2F2IC1jOmEgcGNtX3MxNmxlIC0KIAogZmF0ZS1zd3ItcmVzYW1wbGVfbm4tJCgzKS0kKDEpLSQoMik6IENNUCA9IHN0ZGRldgogZmF0ZS1zd3ItcmVzYW1wbGVfbm4tJCgzKS0kKDEpLSQoMik6IENNUF9VTklUID0gJCg1KQpAQCAtMzQzLDEzICszNDQsMTMgQEAKIGZhdGUtc3dyLXJlc2FtcGxlX25uLSQoMyktJCgxKS0kKDIpOiBSRUYgPSB0ZXN0cy9kYXRhL2FzeW50aC0kKDEpLTEud2F2CiBlbmRlZgogCi1mYXRlLXN3ci1yZXNhbXBsZV9ubi1mbHRwLTQ0MTAwLTgwMDA6IENNUF9UQVJHRVQgPSA1OTAuOTgKK2ZhdGUtc3dyLXJlc2FtcGxlX25uLWZsdHAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDU5MS4wMwogZmF0ZS1zd3ItcmVzYW1wbGVfbm4tZmx0cC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CiAKIGZhdGUtc3dyLXJlc2FtcGxlX25uLWZsdHAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDMxNjMuMzIKIGZhdGUtc3dyLXJlc2FtcGxlX25uLWZsdHAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCiAKLWZhdGUtc3dyLXJlc2FtcGxlX25uLXMxNnAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDU5MC45NworZmF0ZS1zd3ItcmVzYW1wbGVfbm4tczE2cC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNTkwLjk4CiBmYXRlLXN3ci1yZXNhbXBsZV9ubi1zMTZwLTQ0MTAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODYKIAogZmF0ZS1zd3ItcmVzYW1wbGVfbm4tczE2cC04MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMzE2My4zOQpAQCAtMzU4LDcgKzM1OSw3IEBACiBkZWZpbmUgQVJFU0FNUExFX0FTWU5DCiBGQVRFX1NXUl9SRVNBTVBMRSArPSBmYXRlLXN3ci1yZXNhbXBsZV9hc3luYy0kKDMpLSQoMSktJCgyKQogZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtJCgzKS0kKDEpLSQoMik6IHRlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYKLWZhdGUtc3dyLXJlc2FtcGxlX2FzeW5jLSQoMyktJCgxKS0kKDIpOiBDTUQgPSBmZm1wZWcgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtJCgxKS0xLndhdiAtYWYgYXRyaW09ZW5kX3NhbXBsZT0xMDI0MCxhc2V0cHRzPVBUUytyYW5kb21cKDBcKSoyMDAtMTAwLGFyZXNhbXBsZT0kKDIpOmFzeW5jPTUwOm1pbl9oYXJkX2NvbXA9MC4xMDAwMDA6Zmlyc3RfcHRzPTA6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpLGFmb3JtYXQ9JCgzKSxhcmVzYW1wbGU9JCgxKTppbnRlcm5hbF9zYW1wbGVfZm10PSQoMykgLWYgd2F2IC1hY29kZWMgcGNtX3MxNmxlIC0KK2ZhdGUtc3dyLXJlc2FtcGxlX2FzeW5jLSQoMyktJCgxKS0kKDIpOiBDTUQgPSBmZm1wZWcgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtJCgxKS0xLndhdiAtYWYgYXRyaW09ZW5kX3NhbXBsZT0xMDI0MCxhc2V0cHRzPVBUUytyYW5kb21cKDBcKSoyMDAtMTAwLGFyZXNhbXBsZT0kKDIpOmFzeW5jPTUwOm1pbl9oYXJkX2NvbXA9MC4xMDAwMDA6Zmlyc3RfcHRzPTA6bGluZWFyX2ludGVycD0wOmV4YWN0X3JhdGlvbmFsPTA6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpLGFmb3JtYXQ9JCgzKSxhcmVzYW1wbGU9JCgxKTpsaW5lYXJfaW50ZXJwPTA6ZXhhY3RfcmF0aW9uYWw9MDppbnRlcm5hbF9zYW1wbGVfZm10PSQoMykgLWYgd2F2IC1jOmEgcGNtX3MxNmxlIC0KIAogZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtJCgzKS0kKDEpLSQoMik6IENNUCA9IHN0ZGRldgogZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtJCgzKS0kKDEpLSQoMik6IENNUF9VTklUID0gJCg1KQpAQCAtMzY2LDE4ICszNjcsNjg2IEBACiBmYXRlLXN3ci1yZXNhbXBsZV9hc3luYy0kKDMpLSQoMSktJCgyKTogUkVGID0gdGVzdHMvZGF0YS9hc3ludGgtJCgxKS0xLndhdgogZW5kZWYKIAotZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtZmx0cC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNDAyMC42MgorZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtZmx0cC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNDAyMC42MAogZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtZmx0cC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwMzEwCiAKLWZhdGUtc3dyLXJlc2FtcGxlX2FzeW5jLWZsdHAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDExMTg2LjY5CitmYXRlLXN3ci1yZXNhbXBsZV9hc3luYy1mbHRwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxMTE4Ni42NgogZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtZmx0cC04MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjAzNDQKIAotZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtczE2cC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNDAyMC43MworZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtczE2cC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNDAyMC43MQogZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtczE2cC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwMzEwCiAKLWZhdGUtc3dyLXJlc2FtcGxlX2FzeW5jLXMxNnAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDExMTg3LjAxCitmYXRlLXN3ci1yZXNhbXBsZV9hc3luYy1zMTZwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxMTE4Ni45NAogZmF0ZS1zd3ItcmVzYW1wbGVfYXN5bmMtczE2cC04MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjAzNDQKIAorZGVmaW5lIEFSRVNBTVBMRV9FWEFDVAorRkFURV9TV1JfUkVTQU1QTEUgKz0gZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtJCgzKS0kKDEpLSQoMikKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LSQoMyktJCgxKS0kKDIpOiB0ZXN0cy9kYXRhL2FzeW50aC0kKDEpLTEud2F2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC0kKDMpLSQoMSktJCgyKTogQ01EID0gZmZtcGVnIC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYgLWFmIGF0cmltPWVuZF9zYW1wbGU9MTAyNDAsYXJlc2FtcGxlPSQoMik6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpOmV4YWN0X3JhdGlvbmFsPW9uOmxpbmVhcl9pbnRlcnA9MCxhZm9ybWF0PSQoMyksYXJlc2FtcGxlPSQoMSk6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpOmV4YWN0X3JhdGlvbmFsPW9uOmxpbmVhcl9pbnRlcnA9MCAtZiB3YXYgLWM6YSBwY21fczE2bGUgLQorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC0kKDMpLSQoMSktJCgyKTogQ01QID0gc3RkZGV2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC0kKDMpLSQoMSktJCgyKTogQ01QX1VOSVQgPSAkKDUpCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC0kKDMpLSQoMSktJCgyKTogRlVaWiA9IDAuMQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtJCgzKS0kKDEpLSQoMik6IFJFRiA9IHRlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYKK2VuZGVmCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtMjYyNi00NDEwMDogQ01QX1RBUkdFVCA9IDEzNTIuNjcKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtMjYyNi00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtMjYyNi00ODAwMDogQ01QX1RBUkdFVCA9IDEzNTIuNjYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtMjYyNi00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtMjYyNi04MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi41NgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC0yNjI2LTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTI2MjYtOTYwMDA6IENNUF9UQVJHRVQgPSAxMzUyLjY3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTI2MjYtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTQ0MTAwLTI2MjY6IENNUF9UQVJHRVQgPSAxODUuODIKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtNDQxMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ5MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS42NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC00NDEwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTQ0MTAwLTgwMDA6IENNUF9UQVJHRVQgPSA3NS4zOAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtNDQxMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMS40NQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC00NDEwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTQ4MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA0NTYuNTEKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtNDgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDUxMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMC4yMworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC00ODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA2Mi4zNgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDg0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtNDgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAwLjQ3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTQ4MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gMjUwMy4zMworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC04MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4NgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxNC41OQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC04MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC04MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMTQuNTAKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDEzLjYyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTgwMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTk2MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA2NzUuMDcKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtOTYwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0NzQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC05NjAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDEuMjQKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtOTYwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWRibHAtOTYwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAwLjk5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTk2MDAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1kYmxwLTk2MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA1OC41MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZGJscC05NjAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ5NgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTI2MjYtNDQxMDA6IENNUF9UQVJHRVQgPSAxMzUyLjY3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTI2MjYtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTI2MjYtNDgwMDA6IENNUF9UQVJHRVQgPSAxMzUyLjY2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTI2MjYtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTI2MjYtODAwMDogQ01QX1RBUkdFVCA9IDEzNTIuNTYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtMjYyNi04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC0yNjI2LTk2MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42NworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC0yNjI2LTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC00NDEwMC0yNjI2OiBDTVBfVEFSR0VUID0gMTg1LjgyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTQ0MTAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0OTAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC00NDEwMC00ODAwMDogQ01QX1RBUkdFVCA9IDkuNjQKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtNDQxMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNzUuMzgKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtNDQxMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4NgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTQ0MTAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMTEuNDUKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtNDQxMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC00ODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gNDU2LjUxCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTQ4MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA1MTAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC00ODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDAuMjMKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC00ODAwMC04MDAwOiBDTVBfVEFSR0VUID0gNjIuMzYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtNDgwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4NAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTQ4MDAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMC40NworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC00ODAwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDI1MDMuMzMKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtODAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODYKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC04MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTQuNTkKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtODAwMC00ODAwMDogQ01QX1RBUkdFVCA9IDE0LjUwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTgwMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMy42MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC04MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC05NjAwMC0yNjI2OiBDTVBfVEFSR0VUID0gNjc1LjA3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTk2MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDc0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtOTYwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxLjIzCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTk2MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1mbHRwLTk2MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMC45OQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC05NjAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtZmx0cC05NjAwMC04MDAwOiBDTVBfVEFSR0VUID0gNTguNTIKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LWZsdHAtOTYwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0OTYKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM5Mi45OAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC0yNjI2LTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM5My4wMQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC0yNjI2LTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC0yNjI2LTgwMDA6IENNUF9UQVJHRVQgPSAxMzkzLjM2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTI2MjYtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgyCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtMjYyNi05NjAwMDogQ01QX1RBUkdFVCA9IDEzOTMuMDcKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtMjYyNi05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtNDQxMDAtMjYyNjogQ01QX1RBUkdFVCA9IDE4NS44NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC00NDEwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDkwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtNDQxMDAtNDgwMDA6IENNUF9UQVJHRVQgPSA5LjY2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTQ0MTAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDgyCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDc1LjQzCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTQ0MTAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODYKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC00NDEwMC05NjAwMDogQ01QX1RBUkdFVCA9IDExLjQ2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTQ0MTAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDgyCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtNDgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDQ1Ni41NQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC00ODAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNTEwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtNDgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAwLjY4CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTQ4MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDYyLjM5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTQ4MDAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC00ODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDAuNzMKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtNDgwMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC04MDAwLTI2MjY6IENNUF9UQVJHRVQgPSAyNTAzLjMyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDg2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDE0LjYzCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxNC41NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC04MDAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC04MDAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMTMuNjUKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtODAwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtOTYwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDY3NS4xNQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC05NjAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ3NAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTk2MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS40NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC05NjAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczE2cC05NjAwMC00ODAwMDogQ01QX1RBUkdFVCA9IDEuMTIKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtOTYwMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMxNnAtOTYwMDAtODAwMDogQ01QX1RBUkdFVCA9IDU4LjU2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMTZwLTk2MDAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDk2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtMjYyNi00NDEwMDogQ01QX1RBUkdFVCA9IDEzOTIuOTkKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtMjYyNi00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtMjYyNi00ODAwMDogQ01QX1RBUkdFVCA9IDEzOTMuMDEKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtMjYyNi00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtMjYyNi04MDAwOiBDTVBfVEFSR0VUID0gMTM5My4zNgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC0yNjI2LTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTI2MjYtOTYwMDA6IENNUF9UQVJHRVQgPSAxMzkzLjAwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTI2MjYtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTQ0MTAwLTI2MjY6IENNUF9UQVJHRVQgPSAxODUuODEKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtNDQxMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ5MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS42NgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC00NDEwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTQ0MTAwLTgwMDA6IENNUF9UQVJHRVQgPSA3NS4zNworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtNDQxMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMS40NgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC00NDEwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTQ4MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA0NTYuNDkKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtNDgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDUxMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMC43NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC00ODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA2Mi4zNQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDg0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtNDgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAwLjg1CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTQ4MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gMjUwMy4zMworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC04MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4NgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxNC42MQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC04MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC04MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMTQuNTIKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDEzLjYyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTgwMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTk2MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA2NzUuMDUKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtOTYwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0NzQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC05NjAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDEuNDEKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtOTYwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0LXMzMnAtOTYwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxLjIxCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTk2MDAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdC1zMzJwLTk2MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA1OC41NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3QtczMycC05NjAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ5NgorCitkZWZpbmUgQVJFU0FNUExFX0VYQUNUX0FTWU5DCitGQVRFX1NXUl9SRVNBTVBMRSArPSBmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy0kKDMpLSQoMSktJCgyKQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtJCgzKS0kKDEpLSQoMik6IHRlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLSQoMyktJCgxKS0kKDIpOiBDTUQgPSBmZm1wZWcgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtJCgxKS0xLndhdiAtYWYgYXRyaW09ZW5kX3NhbXBsZT0xMDI0MCxhc2V0cHRzPVBUUytyYW5kb21cKDBcKSoyMDAtMTAwLGFyZXNhbXBsZT0kKDIpOmFzeW5jPTUwOm1pbl9oYXJkX2NvbXA9MC4xMDAwMDA6Zmlyc3RfcHRzPTA6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpOmV4YWN0X3JhdGlvbmFsPW9uOmxpbmVhcl9pbnRlcnA9MCxhZm9ybWF0PSQoMyksYXJlc2FtcGxlPSQoMSk6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpOmV4YWN0X3JhdGlvbmFsPW9uOmxpbmVhcl9pbnRlcnA9MCAtZiB3YXYgLWM6YSBwY21fczE2bGUgLQorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy0kKDMpLSQoMSktJCgyKTogQ01QID0gc3RkZGV2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy0kKDMpLSQoMSktJCgyKTogQ01QX1VOSVQgPSAkKDUpCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy0kKDMpLSQoMSktJCgyKTogRlVaWiA9IDAuMQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtJCgzKS0kKDEpLSQoMik6IFJFRiA9IHRlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYKK2VuZGVmCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLWRibHAtNDQxMDAtNDgwMDA6IENNUF9UQVJHRVQgPSA3NzkxLjUwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1kYmxwLTQ0MTAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwMzAwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLWRibHAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDQwMjIuODcKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLWRibHAtNDQxMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDMxMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1kYmxwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTkyMy45NworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtZGJscC00ODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDI5OAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1kYmxwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSAyNTkyLjAwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1kYmxwLTQ4MDAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjAzMDQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtZGJscC04MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTExODcuMjQKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLWRibHAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwMzQ0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLWRibHAtODAwMC00ODAwMDogQ01QX1RBUkdFVCA9IDExMzI2LjgwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1kYmxwLTgwMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDM0NAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1mbHRwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gNzc5MS41MAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtZmx0cC00NDEwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDMwMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1mbHRwLTQ0MTAwLTgwMDA6IENNUF9UQVJHRVQgPSA0MDIyLjg3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1mbHRwLTQ0MTAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjAzMTAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtZmx0cC00ODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDE5MjMuOTcKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLWZsdHAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjAyOTgKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtZmx0cC00ODAwMC04MDAwOiBDTVBfVEFSR0VUID0gMjU5Mi4wMAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtZmx0cC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwMzA0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLWZsdHAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDExMTg3LjI0CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1mbHRwLTgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDM0NAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1mbHRwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxMTMyNi44MAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtZmx0cC04MDAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjAzNDQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtczE2cC00NDEwMC00ODAwMDogQ01QX1RBUkdFVCA9IDc3OTEuNTAKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMxNnAtNDQxMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjAzMDAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtczE2cC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNDAyMy4wNQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtczE2cC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwMzEwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMxNnAtNDgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxOTIzLjk2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1zMTZwLTQ4MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwMjk4CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMxNnAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDI1OTIuMTUKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMxNnAtNDgwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDMwNAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1zMTZwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxMTE4Ny41OAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtczE2cC04MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjAzNDQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtczE2cC04MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMTEzMjcuNDgKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMxNnAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwMzQ0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMzMnAtNDQxMDAtNDgwMDA6IENNUF9UQVJHRVQgPSA3NzkxLjUwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1zMzJwLTQ0MTAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwMzAwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMzMnAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDQwMjIuODcKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMzMnAtNDQxMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDMxMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1zMzJwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTkyMy45NgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtczMycC00ODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDI5OAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1zMzJwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSAyNTkyLjAwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1zMzJwLTQ4MDAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjAzMDQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfYXN5bmMtczMycC04MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTExODcuMjQKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMzMnAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwMzQ0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2FzeW5jLXMzMnAtODAwMC00ODAwMDogQ01QX1RBUkdFVCA9IDExMzI2Ljc5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9hc3luYy1zMzJwLTgwMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDM0NAorCitkZWZpbmUgQVJFU0FNUExFX0VYQUNUX0xJTgorRkFURV9TV1JfUkVTQU1QTEUgKz0gZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLSQoMyktJCgxKS0kKDIpCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tJCgzKS0kKDEpLSQoMik6IHRlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi0kKDMpLSQoMSktJCgyKTogQ01EID0gZmZtcGVnIC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYgLWFmIGF0cmltPWVuZF9zYW1wbGU9MTAyNDAsYXJlc2FtcGxlPSQoMik6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpOmV4YWN0X3JhdGlvbmFsPW9uOmxpbmVhcl9pbnRlcnA9b24sYWZvcm1hdD0kKDMpLGFyZXNhbXBsZT0kKDEpOmludGVybmFsX3NhbXBsZV9mbXQ9JCgzKTpleGFjdF9yYXRpb25hbD1vbjpsaW5lYXJfaW50ZXJwPW9uIC1mIHdhdiAtYzphIHBjbV9zMTZsZSAtCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi0kKDMpLSQoMSktJCgyKTogQ01QID0gc3RkZGV2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tJCgzKS0kKDEpLSQoMik6IENNUF9VTklUID0gJCg1KQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLSQoMyktJCgxKS0kKDIpOiBGVVpaID0gMC4xCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tJCgzKS0kKDEpLSQoMik6IFJFRiA9IHRlc3RzL2RhdGEvYXN5bnRoLSQoMSktMS53YXYKK2VuZGVmCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS42NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtNDQxMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDc1LjM4CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZGJscC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMC4yMworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDYyLjM2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZGJscC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDg0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxNC41OQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxNC41MAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS42NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtNDQxMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDc1LjM4CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMC4yMworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDYyLjM2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDg0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxNC41OQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxNC41MAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS42NgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtNDQxMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDc1LjQzCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMC42OAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDYyLjM5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDg0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxNC42MworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxNC41NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gOS42NgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtNDQxMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDc1LjM3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczMycC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDg2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMC43NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDYyLjM1CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczMycC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDg0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxNC42MQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxNC41MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTI2MjYtNDQxMDA6IENNUF9UQVJHRVQgPSAxMzUyLjYwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZGJscC0yNjI2LTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtMjYyNi00ODAwMDogQ01QX1RBUkdFVCA9IDEzNTIuNjIKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTI2MjYtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZGJscC0yNjI2LTgwMDA6IENNUF9UQVJHRVQgPSAxMzUyLjQ5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZGJscC0yNjI2LTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZGJscC0yNjI2LTk2MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtMjYyNi05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTQ0MTAwLTI2MjY6IENNUF9UQVJHRVQgPSAxODUuNDkKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTQ0MTAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0OTAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtNDQxMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMS40NQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtNDQxMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtNDgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDQ1Ni41MAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtNDgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDUxMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZGJscC00ODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDAuNDcKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTQ4MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDI1MDMuMjgKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMy42MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtODAwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTk2MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA2NzUuMDIKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTk2MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDc0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTk2MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS4yNAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtOTYwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTk2MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMC45OQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtOTYwMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1kYmxwLTk2MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA1OC41MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWRibHAtOTYwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0OTYKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtMjYyNi00NDEwMDogQ01QX1RBUkdFVCA9IDEzNTIuNjAKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTI2MjYtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC0yNjI2LTQ4MDAwOiBDTVBfVEFSR0VUID0gMTM1Mi42MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtMjYyNi00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTI2MjYtODAwMDogQ01QX1RBUkdFVCA9IDEzNTIuNDkKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTI2MjYtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTI2MjYtOTYwMDA6IENNUF9UQVJHRVQgPSAxMzUyLjYyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC0yNjI2LTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtNDQxMDAtMjYyNjogQ01QX1RBUkdFVCA9IDE4NS40OQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtNDQxMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ5MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC00NDEwMC05NjAwMDogQ01QX1RBUkdFVCA9IDExLjQ1CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC00NDEwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDQ4MgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC00ODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gNDU2LjUwCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC00ODAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNTEwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1mbHRwLTQ4MDAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMC40NworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtNDgwMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtODAwMC0yNjI2OiBDTVBfVEFSR0VUID0gMjUwMy4yOAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtODAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDEzLjYyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC04MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtOTYwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDY3NS4wMgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtOTYwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0NzQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtOTYwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxLjIzCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC05NjAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtOTYwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAwLjk5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC05NjAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLWZsdHAtOTYwMDAtODAwMDogQ01QX1RBUkdFVCA9IDU4LjUyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tZmx0cC05NjAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ5NgorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC0yNjI2LTQ0MTAwOiBDTVBfVEFSR0VUID0gMTM5Mi45MworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtMjYyNi00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTI2MjYtNDgwMDA6IENNUF9UQVJHRVQgPSAxMzkyLjk3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC0yNjI2LTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtMjYyNi04MDAwOiBDTVBfVEFSR0VUID0gMTM5My4yOAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtMjYyNi04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtMjYyNi05NjAwMDogQ01QX1RBUkdFVCA9IDEzOTMuMDQKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTI2MjYtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC00NDEwMC0yNjI2OiBDTVBfVEFSR0VUID0gMTg1LjUxCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC00NDEwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDkwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTQ0MTAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMTEuNDYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTQ0MTAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwNDgyCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTQ4MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA0NTYuNTYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTQ4MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjA1MTAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMxNnAtNDgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAwLjczCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC00ODAwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC04MDAwLTI2MjY6IENNUF9UQVJHRVQgPSAyNTAzLjI4CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC04MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC04MDAwLTk2MDAwOiBDTVBfVEFSR0VUID0gMTMuNjUKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTgwMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC05NjAwMC0yNjI2OiBDTVBfVEFSR0VUID0gNjc1LjA3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC05NjAwMC0yNjI2OiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ3NAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC05NjAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDEuNDQKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTk2MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC05NjAwMC00ODAwMDogQ01QX1RBUkdFVCA9IDEuMTIKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTk2MDAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDExNTIwMDAgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczE2cC05NjAwMC04MDAwOiBDTVBfVEFSR0VUID0gNTguNTYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMTZwLTk2MDAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDk2CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTI2MjYtNDQxMDA6IENNUF9UQVJHRVQgPSAxMzkyLjk1CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczMycC0yNjI2LTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDMxNTEyIC0gMjA0ODAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtMjYyNi00ODAwMDogQ01QX1RBUkdFVCA9IDEzOTIuOTgKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTI2MjYtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczMycC0yNjI2LTgwMDA6IENNUF9UQVJHRVQgPSAxMzkzLjI5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczMycC0yNjI2LTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMzE1MTIgLSAyMDQ4MAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczMycC0yNjI2LTk2MDAwOiBDTVBfVEFSR0VUID0gMTM5Mi45NgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtMjYyNi05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSAzMTUxMiAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTQ0MTAwLTI2MjY6IENNUF9UQVJHRVQgPSAxODUuNDgKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTQ0MTAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0OTAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtNDQxMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMS40NgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtNDQxMDAtOTYwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjA0ODIKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtNDgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDQ1Ni40OAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtNDgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDUxMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW4tczMycC00ODAwMC05NjAwMDogQ01QX1RBUkdFVCA9IDAuODUKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTQ4MDAwLTk2MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTgwMDAtMjYyNjogQ01QX1RBUkdFVCA9IDI1MDMuMjgKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTgwMDAtMjYyNjogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTgwMDAtOTYwMDA6IENNUF9UQVJHRVQgPSAxMy42MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtODAwMC05NjAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTk2MDAwLTI2MjY6IENNUF9UQVJHRVQgPSA2NzUuMDAKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTk2MDAwLTI2MjY6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDc0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTk2MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMS40MQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtOTYwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTk2MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMS4yMQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtOTYwMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gMTE1MjAwMCAtIDIwNDgwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbi1zMzJwLTk2MDAwLTgwMDA6IENNUF9UQVJHRVQgPSA1OC41NAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluLXMzMnAtOTYwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSAxMTUyMDAwIC0gMjA0OTYKKworZGVmaW5lIEFSRVNBTVBMRV9FWEFDVF9MSU5fQVNZTkMKK0ZBVEVfU1dSX1JFU0FNUExFICs9IGZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy0kKDMpLSQoMSktJCgyKQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLSQoMyktJCgxKS0kKDIpOiB0ZXN0cy9kYXRhL2FzeW50aC0kKDEpLTEud2F2CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtJCgzKS0kKDEpLSQoMik6IENNRCA9IGZmbXBlZyAtaSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhL2FzeW50aC0kKDEpLTEud2F2IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTEwMjQwLGFzZXRwdHM9UFRTK3JhbmRvbVwoMFwpKjIwMC0xMDAsYXJlc2FtcGxlPSQoMik6YXN5bmM9NTA6bWluX2hhcmRfY29tcD0wLjEwMDAwMDpmaXJzdF9wdHM9MDppbnRlcm5hbF9zYW1wbGVfZm10PSQoMyk6ZXhhY3RfcmF0aW9uYWw9b246bGluZWFyX2ludGVycD1vbixhZm9ybWF0PSQoMyksYXJlc2FtcGxlPSQoMSk6aW50ZXJuYWxfc2FtcGxlX2ZtdD0kKDMpOmV4YWN0X3JhdGlvbmFsPW9uOmxpbmVhcl9pbnRlcnA9b24gLWYgd2F2IC1jOmEgcGNtX3MxNmxlIC0KKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLSQoMyktJCgxKS0kKDIpOiBDTVAgPSBzdGRkZXYKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy0kKDMpLSQoMSktJCgyKTogQ01QX1VOSVQgPSAkKDUpCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtJCgzKS0kKDEpLSQoMik6IEZVWlogPSAwLjEKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy0kKDMpLSQoMSktJCgyKTogUkVGID0gdGVzdHMvZGF0YS9hc3ludGgtJCgxKS0xLndhdgorZW5kZWYKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLWRibHAtNDQxMDAtNDgwMDA6IENNUF9UQVJHRVQgPSA3NzkxLjcyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtZGJscC00NDEwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDMwMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtZGJscC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNDAyMy4wMQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLWRibHAtNDQxMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDMxMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtZGJscC00ODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDE5MjMuNzkKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1kYmxwLTQ4MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwMjk4CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1kYmxwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSAyNTkxLjcyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtZGJscC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwMzA0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1kYmxwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxMTE4Ny4yNAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLWRibHAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwMzQ0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1kYmxwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxMTMyNi44MAorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLWRibHAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwMzQ0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1mbHRwLTQ0MTAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gNzc5MS43MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLWZsdHAtNDQxMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjAzMDAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLWZsdHAtNDQxMDAtODAwMDogQ01QX1RBUkdFVCA9IDQwMjMuMDEKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1mbHRwLTQ0MTAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTI5MjAwIC0gMjAzMTAKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLWZsdHAtNDgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxOTIzLjc5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtZmx0cC00ODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDI5OAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtZmx0cC00ODAwMC04MDAwOiBDTVBfVEFSR0VUID0gMjU5MS43MgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLWZsdHAtNDgwMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1NzYwMDAgLSAyMDMwNAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtZmx0cC04MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTExODcuMjUKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1mbHRwLTgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDM0NAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtZmx0cC04MDAwLTQ4MDAwOiBDTVBfVEFSR0VUID0gMTEzMjYuODAKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1mbHRwLTgwMDAtNDgwMDA6IFNJWkVfVE9MRVJBTkNFID0gOTYwMDAgLSAyMDM0NAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtczE2cC00NDEwMC00ODAwMDogQ01QX1RBUkdFVCA9IDc3OTEuNzIKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1zMTZwLTQ0MTAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwMzAwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1zMTZwLTQ0MTAwLTgwMDA6IENNUF9UQVJHRVQgPSA0MDIzLjE5CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtczE2cC00NDEwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDUyOTIwMCAtIDIwMzEwCisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1zMTZwLTQ4MDAwLTQ0MTAwOiBDTVBfVEFSR0VUID0gMTkyMy43OQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLXMxNnAtNDgwMDAtNDQxMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjAyOTgKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLXMxNnAtNDgwMDAtODAwMDogQ01QX1RBUkdFVCA9IDI1OTEuODUKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1zMTZwLTQ4MDAwLTgwMDA6IFNJWkVfVE9MRVJBTkNFID0gNTc2MDAwIC0gMjAzMDQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLXMxNnAtODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDExMTg3LjU3CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtczE2cC04MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjAzNDQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLXMxNnAtODAwMC00ODAwMDogQ01QX1RBUkdFVCA9IDExMzI3LjQ4CitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtczE2cC04MDAwLTQ4MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDk2MDAwIC0gMjAzNDQKKworZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLXMzMnAtNDQxMDAtNDgwMDA6IENNUF9UQVJHRVQgPSA3NzkxLjcyCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtczMycC00NDEwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDMwMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtczMycC00NDEwMC04MDAwOiBDTVBfVEFSR0VUID0gNDAyMy4wMgorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLXMzMnAtNDQxMDAtODAwMDogU0laRV9UT0xFUkFOQ0UgPSA1MjkyMDAgLSAyMDMxMAorCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtczMycC00ODAwMC00NDEwMDogQ01QX1RBUkdFVCA9IDE5MjMuNzcKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1zMzJwLTQ4MDAwLTQ0MTAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwMjk4CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1zMzJwLTQ4MDAwLTgwMDA6IENNUF9UQVJHRVQgPSAyNTkxLjcxCitmYXRlLXN3ci1yZXNhbXBsZV9leGFjdF9saW5fYXN5bmMtczMycC00ODAwMC04MDAwOiBTSVpFX1RPTEVSQU5DRSA9IDU3NjAwMCAtIDIwMzA0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1zMzJwLTgwMDAtNDQxMDA6IENNUF9UQVJHRVQgPSAxMTE4Ny4yNQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLXMzMnAtODAwMC00NDEwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwMzQ0CisKK2ZhdGUtc3dyLXJlc2FtcGxlX2V4YWN0X2xpbl9hc3luYy1zMzJwLTgwMDAtNDgwMDA6IENNUF9UQVJHRVQgPSAxMTMyNi44MQorZmF0ZS1zd3ItcmVzYW1wbGVfZXhhY3RfbGluX2FzeW5jLXMzMnAtODAwMC00ODAwMDogU0laRV9UT0xFUkFOQ0UgPSA5NjAwMCAtIDIwMzQ0CisKICQoY2FsbCBDUk9TU19URVNULCQoU0FNUExFUkFURVMpLEFSRVNBTVBMRSxzMTZwLHMxNmxlLHMxNikKICQoY2FsbCBDUk9TU19URVNULCQoU0FNUExFUkFURVMpLEFSRVNBTVBMRSxzMzJwLHMzMmxlLHMxNikKICQoY2FsbCBDUk9TU19URVNULCQoU0FNUExFUkFURVMpLEFSRVNBTVBMRSxmbHRwLGYzMmxlLHMxNikKQEAgLTM5MywxMCArMTA2MiwzNyBAQAogJChjYWxsIENST1NTX1RFU1QsJChTQU1QTEVSQVRFU19OTiksQVJFU0FNUExFX0FTWU5DLHMxNnAsczE2bGUsczE2KQogJChjYWxsIENST1NTX1RFU1QsJChTQU1QTEVSQVRFU19OTiksQVJFU0FNUExFX0FTWU5DLGZsdHAsZjMybGUsczE2KQogCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTKSxBUkVTQU1QTEVfRVhBQ1QsczE2cCxzMTZsZSxzMTYpCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTKSxBUkVTQU1QTEVfRVhBQ1QsczMycCxzMzJsZSxzMTYpCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTKSxBUkVTQU1QTEVfRVhBQ1QsZmx0cCxmMzJsZSxzMTYpCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTKSxBUkVTQU1QTEVfRVhBQ1QsZGJscCxmNjRsZSxzMTYpCisKKyQoY2FsbCBDUk9TU19URVNULCQoU0FNUExFUkFURVNfTElURSksQVJFU0FNUExFX0VYQUNUX0FTWU5DLHMxNnAsczE2bGUsczE2KQorJChjYWxsIENST1NTX1RFU1QsJChTQU1QTEVSQVRFU19MSVRFKSxBUkVTQU1QTEVfRVhBQ1RfQVNZTkMsczMycCxzMzJsZSxzMTYpCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTX0xJVEUpLEFSRVNBTVBMRV9FWEFDVF9BU1lOQyxmbHRwLGYzMmxlLHMxNikKKyQoY2FsbCBDUk9TU19URVNULCQoU0FNUExFUkFURVNfTElURSksQVJFU0FNUExFX0VYQUNUX0FTWU5DLGRibHAsZjY0bGUsczE2KQorCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTKSxBUkVTQU1QTEVfRVhBQ1RfTElOLHMxNnAsczE2bGUsczE2KQorJChjYWxsIENST1NTX1RFU1QsJChTQU1QTEVSQVRFUyksQVJFU0FNUExFX0VYQUNUX0xJTixzMzJwLHMzMmxlLHMxNikKKyQoY2FsbCBDUk9TU19URVNULCQoU0FNUExFUkFURVMpLEFSRVNBTVBMRV9FWEFDVF9MSU4sZmx0cCxmMzJsZSxzMTYpCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTKSxBUkVTQU1QTEVfRVhBQ1RfTElOLGRibHAsZjY0bGUsczE2KQorCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTX0xJVEUpLEFSRVNBTVBMRV9FWEFDVF9MSU5fQVNZTkMsczE2cCxzMTZsZSxzMTYpCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTX0xJVEUpLEFSRVNBTVBMRV9FWEFDVF9MSU5fQVNZTkMsczMycCxzMzJsZSxzMTYpCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTX0xJVEUpLEFSRVNBTVBMRV9FWEFDVF9MSU5fQVNZTkMsZmx0cCxmMzJsZSxzMTYpCiskKGNhbGwgQ1JPU1NfVEVTVCwkKFNBTVBMRVJBVEVTX0xJVEUpLEFSRVNBTVBMRV9FWEFDVF9MSU5fQVNZTkMsZGJscCxmNjRsZSxzMTYpCiAKIEZBVEVfU1dSX1JFU0FNUExFLSQoY2FsbCBGSUxURVJERU1ERUNFTkNNVVgsIEFSRVNBTVBMRSwgV0FWLCBQQ01fUzE2TEUsIFBDTV9TMTZMRSwgV0FWKSArPSAkKEZBVEVfU1dSX1JFU0FNUExFKQogZmF0ZS1zd3ItcmVzYW1wbGU6ICQoRkFURV9TV1JfUkVTQU1QTEUteWVzKQogRkFURV9TV1IgKz0gJChGQVRFX1NXUl9SRVNBTVBMRS15ZXMpCiAKK0ZBVEVfU1dSX0FVRElPQ09OVkVSVC0kKGNhbGwgRklMVEVSREVNREVDRU5DTVVYLCBBRk9STUFUIEFFVkFMLCBXQVYsIFBDTV9TMTZMRSwgUENNX1MxNkxFLCBXQVYpICs9IGZhdGUtc3dyLWF1ZGlvY29udmVydAorZmF0ZS1zd3ItYXVkaW9jb252ZXJ0OiB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0xLndhdgorZmF0ZS1zd3ItYXVkaW9jb252ZXJ0OiBSRUYgPSB0ZXN0cy9kYXRhL2FzeW50aC00NDEwMC0xLndhdgorZmF0ZS1zd3ItYXVkaW9jb252ZXJ0OiBDTUQgPSBmZm1wZWcgLWkgJChUQVJHRVRfUEFUSCkvdGVzdHMvZGF0YS9hc3ludGgtNDQxMDAtMS53YXYgLWFmICJhZm9ybWF0PWZsdHAsYWV2YWw9dmFsKDApKyhyYW5kb20oMCktMC41KS8zMzAwMCxhZm9ybWF0PWZsdHAiIC1mIHdhdiAtYzphIHBjbV9zMTZsZSAtCitmYXRlLXN3ci1hdWRpb2NvbnZlcnQ6IENNUCA9IHN0ZGRldgorZmF0ZS1zd3ItYXVkaW9jb252ZXJ0OiBGVVpaID0gMAorCitGQVRFX1NXUiArPSAkKEZBVEVfU1dSX0FVRElPQ09OVkVSVC15ZXMpCiBGQVRFX0ZGTVBFRyArPSAkKEZBVEVfU1dSKQogZmF0ZS1zd3I6ICQoRkFURV9TV1IpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL2xpYnN3c2NhbGUubWFrIGIvdGVzdHMvZmF0ZS9saWJzd3NjYWxlLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzJmZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9saWJzd3NjYWxlLm1hawpAQCAtMCwwICsxLDcgQEAKK0ZBVEVfTElCU1dTQ0FMRSArPSBmYXRlLXN3cy1waXhkZXNjLXF1ZXJ5CitmYXRlLXN3cy1waXhkZXNjLXF1ZXJ5OiBsaWJzd3NjYWxlL3Rlc3RzL3BpeGRlc2NfcXVlcnkkKEVYRVNVRikKK2ZhdGUtc3dzLXBpeGRlc2MtcXVlcnk6IENNRCA9IHJ1biBsaWJzd3NjYWxlL3Rlc3RzL3BpeGRlc2NfcXVlcnkKKworRkFURV9MSUJTV1NDQUxFICs9ICQoRkFURV9MSUJTV1NDQUxFLXllcykKK0ZBVEUtJChDT05GSUdfU1dTQ0FMRSkgKz0gJChGQVRFX0xJQlNXU0NBTEUpCitmYXRlLWxpYnN3c2NhbGU6ICQoRkFURV9MSUJTV1NDQUxFKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9sb3NzbGVzcy1hdWRpby5tYWsgYi90ZXN0cy9mYXRlL2xvc3NsZXNzLWF1ZGlvLm1hawppbmRleCA1ODY0MWFiLi5kMjkyODUzIDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL2xvc3NsZXNzLWF1ZGlvLm1haworKysgYi90ZXN0cy9mYXRlL2xvc3NsZXNzLWF1ZGlvLm1hawpAQCAtMjUsOCArMjUsMTIgQEAKIEZBVEVfU0FNUExFU19MT1NTTEVTU19BVURJTy0kKGNhbGwgREVNREVDLCBUVEEsIFRUQSkgKz0gZmF0ZS1sb3NzbGVzcy10dGEtZW5jcnlwdGVkCiBmYXRlLWxvc3NsZXNzLXR0YS1lbmNyeXB0ZWQ6IENNRCA9IGNyYyAtcGFzc3dvcmQgZmZtcGVnIC1pICQoVEFSR0VUX1NBTVBMRVMpL2xvc3NsZXNzLWF1ZGlvL2VuY3J5cHRlZC50dGEKIAotRkFURV9TQU1QTEVTX0xPU1NMRVNTX0FVRElPLSQoY2FsbCBERU1ERUMsIEFTRiwgV01BTE9TU0xFU1MpICs9IGZhdGUtbG9zc2xlc3Mtd21hCitGQVRFX1NBTVBMRVNfTE9TU0xFU1NfQVVESU8tJChjYWxsIERFTURFQywgQVNGLCBXTUFMT1NTTEVTUykgKz0gZmF0ZS1sb3NzbGVzcy13bWEgZmF0ZS1sb3NzbGVzcy13bWEyNC0xIGZhdGUtbG9zc2xlc3Mtd21hMjQtMiBmYXRlLWxvc3NsZXNzLXdtYTI0LXJhd3RpbGUKIGZhdGUtbG9zc2xlc3Mtd21hOiBDTUQgPSBtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvbG9zc2xlc3MtYXVkaW8vbHVja3luaWdodC1wYXJ0aWFsLndtYSAtZiBzMTZsZSAtZnJhbWVzIDIwOQorZmF0ZS1sb3NzbGVzcy13bWEyNC0xOiBDTUQgPSBtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvbG9zc2xlc3MtYXVkaW8vbWFzdGVyX2F1ZGlvXzIuMF8yNGJpdC53bWEgLWYgczI0bGUKK2ZhdGUtbG9zc2xlc3Mtd21hMjQtMjogQ01EID0gbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL2xvc3NsZXNzLWF1ZGlvL01lZ2FfV2VpcmRfQXVkaW9fVGVzdF8yNGJpdC53bWEgLWYgczI0bGUKK2ZhdGUtbG9zc2xlc3Mtd21hMjQtcmF3dGlsZTogQ01EID0gbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL2xvc3NsZXNzLWF1ZGlvL2cyXzI0Yml0LndtYSAtZiBzMjRsZQorZmF0ZS1sb3NzbGVzcy13bWFsbDogZmF0ZS1sb3NzbGVzcy13bWEgZmF0ZS1sb3NzbGVzcy13bWEyNC0xIGZhdGUtbG9zc2xlc3Mtd21hMjQtMiBmYXRlLWxvc3NsZXNzLXdtYTI0LXJhd3RpbGUKIAogRkFURV9TQU1QTEVTX0xPU1NMRVNTX0FVRElPICs9ICQoRkFURV9TQU1QTEVTX0xPU1NMRVNTX0FVRElPLXllcykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9sb3NzbGVzcy12aWRlby5tYWsgYi90ZXN0cy9mYXRlL2xvc3NsZXNzLXZpZGVvLm1hawppbmRleCA1MTRkNmZkLi4xZTI3NjljIDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL2xvc3NsZXNzLXZpZGVvLm1haworKysgYi90ZXN0cy9mYXRlL2xvc3NsZXNzLXZpZGVvLm1hawpAQCAtMSwxNSArMSwzIEBACi1GQVRFX0NBTk9QVVNfQ0xMQyArPSBmYXRlLWNhbm9wdXMtY2xsYy1hcmdiCi1mYXRlLWNhbm9wdXMtY2xsYy1hcmdiOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jbGxjL3NhbXBsZS1jbGxjLWFyZ2IuYXZpCi0KLUZBVEVfQ0FOT1BVU19DTExDICs9IGZhdGUtY2Fub3B1cy1jbGxjLXJnYgotZmF0ZS1jYW5vcHVzLWNsbGMtcmdiOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jbGxjL3NhbXBsZS1jbGxjLXJnYi5hdmkKLQotRkFURV9DQU5PUFVTX0NMTEMgKz0gZmF0ZS1jYW5vcHVzLWNsbGMteXV5Mi1ub2Jsb2NrCi1mYXRlLWNhbm9wdXMtY2xsYy15dXkyLW5vYmxvY2s6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2NsbGMvc2FtcGxlLWNsbGMteXV5Mi1ub2Jsb2NrLmF2aQotCi1GQVRFX0xPU1NMRVNTX1ZJREVPLSQoY2FsbCBERU1ERUMsIEFWSSwgQ0xMQykgKz0gJChGQVRFX0NBTk9QVVNfQ0xMQykKLWZhdGUtY2Fub3B1cy1jbGxjOiAkKEZBVEVfQ0FOT1BVU19DTExDKQotCiBGQVRFX0xBR0FSSVRIICs9IGZhdGUtbGFnYXJpdGgtcmdiMjQKIGZhdGUtbGFnYXJpdGgtcmdiMjQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2xhZ2FyaXRoL2xhZy1yZ2IyNC5hdmkKIApAQCAtMjUsNiArMTMsMTMgQEAKIEZBVEVfTEFHQVJJVEggKz0gZmF0ZS1sYWdhcml0aC1yZWQKIGZhdGUtbGFnYXJpdGgtcmVkOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9sYWdhcml0aC9sYWdhcml0aC1yZWQuYXZpCiAKK0ZBVEVfTEFHQVJJVEggKz0gZmF0ZS1sYWdhcml0aC10aWNrZXQ0MTE5IGZhdGUtbGFnYXJpdGgtdGlja2V0NDExOS1jZnIgZmF0ZS1sYWdhcml0aC10aWNrZXQ0MTE5LXZmciBmYXRlLWxhZ2FyaXRoLXRpY2tldDQxMTktcGFzcyBmYXRlLWxhZ2FyaXRoLXRpY2tldDQxMTktZHJvcAorZmF0ZS1sYWdhcml0aC10aWNrZXQ0MTE5OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9sYWdhcml0aC9sYWdhcml0aC0xLjMuMjctYmxhY2stZnJhbWVzLWFuZC1vZmYtYnktb25lcy5hdmkKK2ZhdGUtbGFnYXJpdGgtdGlja2V0NDExOS1jZnIgOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9sYWdhcml0aC9sYWdhcml0aC0xLjMuMjctYmxhY2stZnJhbWVzLWFuZC1vZmYtYnktb25lcy5hdmkgLXZzeW5jIGNmcgorZmF0ZS1sYWdhcml0aC10aWNrZXQ0MTE5LXZmciA6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2xhZ2FyaXRoL2xhZ2FyaXRoLTEuMy4yNy1ibGFjay1mcmFtZXMtYW5kLW9mZi1ieS1vbmVzLmF2aSAtdnN5bmMgdmZyCitmYXRlLWxhZ2FyaXRoLXRpY2tldDQxMTktcGFzczogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbGFnYXJpdGgvbGFnYXJpdGgtMS4zLjI3LWJsYWNrLWZyYW1lcy1hbmQtb2ZmLWJ5LW9uZXMuYXZpIC12c3luYyBwYXNzdGhyb3VnaAorZmF0ZS1sYWdhcml0aC10aWNrZXQ0MTE5LWRyb3A6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2xhZ2FyaXRoL2xhZ2FyaXRoLTEuMy4yNy1ibGFjay1mcmFtZXMtYW5kLW9mZi1ieS1vbmVzLmF2aSAtdnN5bmMgZHJvcAorCiBGQVRFX0xPU1NMRVNTX1ZJREVPLSQoY2FsbCBERU1ERUMsIEFWSSwgTEFHQVJJVEgpICs9ICQoRkFURV9MQUdBUklUSCkKIGZhdGUtbGFnYXJpdGg6ICQoRkFURV9MQUdBUklUSCkKIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9tYXRyb3NrYS5tYWsgYi90ZXN0cy9mYXRlL21hdHJvc2thLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzQ3NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9tYXRyb3NrYS5tYWsKQEAgLTAsMCArMSwxMyBAQAorIyBUaGlzIHRlc3RzIHRoYXQgdGhlIG1hdHJvc2thIGRlbXV4ZXIgc3VwcG9ydHMgbW9kaWZ5aW5nIHRoZSBjb2xvcnNwYWNlCisjIHByb3BlcnRpZXMgaW4gcmVtdXhpbmcgKC1jOnYgY29weSkKKyMgSXQgYWxzbyB0ZXN0cyBhdXRvbWF0aWMgaW5zZXJ0aW9uIG9mIHRoZSB2cDlfc3VwZXJmcmFtZSBiaXRzdHJlYW0gZmlsdGVyCitGQVRFX01BVFJPU0tBLSQoY2FsbCBERU1NVVgsIE1BVFJPU0tBLCBNQVRST1NLQSkgKz0gZmF0ZS1tYXRyb3NrYS1yZW11eAorZmF0ZS1tYXRyb3NrYS1yZW11eDogQ01EID0gbWQ1cGlwZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDktdGVzdC12ZWN0b3JzL3ZwOTAtMi0ycGFzcy1ha2l5by53ZWJtIC1jb2xvcl90cmMgNCAtYzp2IGNvcHkgLWZmbGFncyArYml0ZXhhY3QgLXN0cmljdCAtMiAtZiBtYXRyb3NrYQorZmF0ZS1tYXRyb3NrYS1yZW11eDogQ01QID0gb25lbGluZQorZmF0ZS1tYXRyb3NrYS1yZW11eDogUkVGID0gMWVkNDlhNGYyYjY3OTAzNTdmYWMyNjg5MzgzNTczNTMKKworRkFURV9NQVRST1NLQV9GRlBST0JFLSQoY2FsbCBBTExZRVMsIE1BVFJPU0tBX0RFTVVYRVIpICs9IGZhdGUtbWF0cm9za2Etc3BoZXJpY2FsLW1vbm8KK2ZhdGUtbWF0cm9za2Etc3BoZXJpY2FsLW1vbm86IENNRCA9IHJ1biBmZnByb2JlJChQUk9HU1NVRikkKEVYRVNVRikgLXNob3dfZW50cmllcyBzdHJlYW1fc2lkZV9kYXRhX2xpc3QgLXNlbGVjdF9zdHJlYW1zIHYgLXYgMCAkKFRBUkdFVF9TQU1QTEVTKS9ta3Yvc3BoZXJpY2FsLm1rdgorCitGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9NQVRST1NLQS15ZXMpCitGQVRFX1NBTVBMRVNfRkZQUk9CRSArPSAkKEZBVEVfTUFUUk9TS0FfRkZQUk9CRS15ZXMpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL21pY3Jvc29mdC5tYWsgYi90ZXN0cy9mYXRlL21pY3Jvc29mdC5tYWsKaW5kZXggM2RhMjVhNy4uYzQ1MGMwZCAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9taWNyb3NvZnQubWFrCisrKyBiL3Rlc3RzL2ZhdGUvbWljcm9zb2Z0Lm1hawpAQCAtMSw2ICsxLDkgQEAKIEZBVEVfTUlDUk9TT0ZULSQoY2FsbCBERU1ERUMsIEFWSSwgTVNNUEVHNFYxKSArPSBmYXRlLW1zbXBlZzR2MQogZmF0ZS1tc21wZWc0djE6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21zbXBlZzR2MS9tcGc0LmF2aSAtYW4KIAorRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBBU0YsIE1TUzEpICs9IGZhdGUtbXNzMS1wYWwKK2ZhdGUtbXNzMS1wYWw6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL21zczEvc2NyZWVuX2NvZGVjLndtdiAtYW4KKwogRkFURV9NU1MyICs9IGZhdGUtbXNzMi1wYWwKIGZhdGUtbXNzMi1wYWw6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL21zczIvcmxlcGFsLndtdgogCkBAIC0xOSw2ICsyMiwxMiBAQAogRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBBU0YsIE1TUzIpICs9ICQoRkFURV9NU1MyKQogZmF0ZS1tc3MyOiAkKEZBVEVfTVNTMikKIAorRkFURV9NVFMyICs9IGZhdGUtbXRzMi14ZXNjCitmYXRlLW10czIteGVzYzogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbXRzMi9zYW1wbGUueGVzYyAtcGl4X2ZtdCB5dXY0NDRwCisKK0ZBVEVfU0FNUExFU19BVkNPTlYtJChjYWxsIERFTURFQywgQVNGLCBNVFMyKSArPSAkKEZBVEVfTVRTMikKK2ZhdGUtbXRzMjogJChGQVRFX01UUzIpCisKIEZBVEVfTVNWSURFTzEgKz0gZmF0ZS1tc3ZpZGVvMS04Yml0CiBmYXRlLW1zdmlkZW8xLThiaXQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2NyYW0vc2thdGluZy5hdmkgLXQgMSAtcGl4X2ZtdCByZ2IyNAogCkBAIC0yOCwxOSArMzcsMjEgQEAKIEZBVEVfTUlDUk9TT0ZULSQoY2FsbCBERU1ERUMsIEFWSSwgTVNWSURFTzEpICs9ICQoRkFURV9NU1ZJREVPMSkKIGZhdGUtbXN2aWRlbzE6ICQoRkFURV9NU1ZJREVPMSkKIAotRkFURV9XTVY4X0RSTSArPSBmYXRlLXdtdjgtZHJtCitGQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIEFTRiwgTVRTMikgKz0gZmF0ZS1tdHMyCitmYXRlLW10czI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL210czIvU2NyZWVuQ2FwdHVyZS54ZXNjCisKK0ZBVEVfV01WM19EUk0gKz0gZmF0ZS13bXYzLWRybS1kZWMKICMgZGlzY2FyZCBsYXN0IHBhY2tldCB0byBhdm9pZCBmYWlscyBkdWUgdG8gb3ZlcnJlYWQgb2YgVkMtMSBkZWNvZGVyCi1mYXRlLXdtdjgtZHJtOiBDTUQgPSBmcmFtZWNyYyAtY3J5cHRva2V5IDEzNzM4MTUzOGM4NGMwNjgxMTE5MDJhNTljNWNmNmMzNDAyNDdjMzkgLWkgJChUQVJHRVRfU0FNUExFUykvd212OC93bXZfZHJtLndtdiAtYW4gLWZyYW1lczp2IDEyOQorZmF0ZS13bXYzLWRybS1kZWM6IENNRCA9IGZyYW1lY3JjIC1jcnlwdG9rZXkgMTM3MzgxNTM4Yzg0YzA2ODExMTkwMmE1OWM1Y2Y2YzM0MDI0N2MzOSAtaSAkKFRBUkdFVF9TQU1QTEVTKS93bXY4L3dtdl9kcm0ud212IC1hbiAtZnJhbWVzOnYgMTI5CiAKLUZBVEVfV01WOF9EUk0gKz0gZmF0ZS13bXY4LWRybS1ub2RlYwotZmF0ZS13bXY4LWRybS1ub2RlYzogQ01EID0gZnJhbWVjcmMgLWNyeXB0b2tleSAxMzczODE1MzhjODRjMDY4MTExOTAyYTU5YzVjZjZjMzQwMjQ3YzM5IC1pICQoVEFSR0VUX1NBTVBMRVMpL3dtdjgvd212X2RybS53bXYgLWFjb2RlYyBjb3B5IC12Y29kZWMgY29weQorRkFURV9XTVYzX0RSTSArPSBmYXRlLXdtdjMtZHJtLW5vZGVjCitmYXRlLXdtdjMtZHJtLW5vZGVjOiBDTUQgPSBmcmFtZWNyYyAtY3J5cHRva2V5IDEzNzM4MTUzOGM4NGMwNjgxMTE5MDJhNTljNWNmNmMzNDAyNDdjMzkgLWkgJChUQVJHRVRfU0FNUExFUykvd212OC93bXZfZHJtLndtdiAtYzphIGNvcHkgLWM6diBjb3B5CiAKLSNGQVRFX01JQ1JPU09GVCArPSBmYXRlLXdtdjgteDhpbnRyYQotRkFURV9URVNUUy1ubyArPSBmYXRlLXdtdjgteDhpbnRyYQotZmF0ZS13bXY4LXg4aW50cmE6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3QgMTkgLWkgJChUQVJHRVRfU0FNUExFUykvd212OC93bXY4X3g4aW50cmEud212IC1hbgorRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBBU0YsIFdNVjMpICs9ICQoRkFURV9XTVYzX0RSTSkKK2ZhdGUtd212My1kcm06ICQoRkFURV9XTVYzX0RSTSkKIAotRkFURV9NSUNST1NPRlQtJChjYWxsIERFTURFQywgQVNGLCBXTVYzKSArPSAkKEZBVEVfV01WOF9EUk0pCi1mYXRlLXdtdjhfZHJtOiAkKEZBVEVfV01WOF9EUk0pCitGQVRFX01JQ1JPU09GVC0kKGNhbGwgREVNREVDLCBBU0YsIFdNVjIpICs9IGZhdGUtd212OC14OGludHJhCitmYXRlLXdtdjgteDhpbnRyYTogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS93bXY4L3dtdjhfeDhpbnRyYS53bXYgLWFuCiAKIEZBVEVfVkMxLSQoQ09ORklHX1ZDMV9ERU1VWEVSKSArPSBmYXRlLXZjMV9zYTAwMDQwCiBmYXRlLXZjMV9zYTAwMDQwOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS92YzEvU0EwMDA0MC52YzEKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvbW92Lm1hayBiL3Rlc3RzL2ZhdGUvbW92Lm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDdkNjJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9tb3YubWFrCkBAIC0wLDAgKzEsOTkgQEAKK0ZBVEVfTU9WID0gZmF0ZS1tb3YtM2VsaXN0IFwKKyAgICAgICAgICAgZmF0ZS1tb3YtM2VsaXN0LTFjdHRzIFwKKyAgICAgICAgICAgZmF0ZS1tb3YtMWVsaXN0LTFjdHRzIFwKKyAgICAgICAgICAgZmF0ZS1tb3YtMWVsaXN0LW5vY3R0cyBcCisgICAgICAgICAgIGZhdGUtbW92LWVsaXN0LXN0YXJ0cy1jdHRzLTJuZHNhbXBsZSBcCisgICAgICAgICAgIGZhdGUtbW92LTFlbGlzdC1lbmRzLWxhc3QtYmZyYW1lIFwKKyAgICAgICAgICAgZmF0ZS1tb3YtMmVsaXN0LWVsaXN0MS1lbmRzLWJmcmFtZSBcCisgICAgICAgICAgIGZhdGUtbW92LTNlbGlzdC1lbmNyeXB0ZWQgXAorICAgICAgICAgICBmYXRlLW1vdi1pbnZhbGlkLWVsc3QtZW50cnktY291bnQgXAorICAgICAgICAgICBmYXRlLW1vdi1ncG1mLXJlbXV4IFwKKyAgICAgICAgICAgZmF0ZS1tb3YtNDQwaHotMTBtcyBcCisgICAgICAgICAgIGZhdGUtbW92LWliaS1lbHN0LXN0YXJ0cy1iIFwKKyAgICAgICAgICAgZmF0ZS1tb3YtZWxzdC1lbmRzLWJldG4tYi1hbmQtaSBcCisgICAgICAgICAgIGZhdGUtbW92LWZyYWctb3ZlcmxhcCBcCisgICAgICAgICAgIGZhdGUtbW92LWJiaS1lbHN0LXN0YXJ0cy1iIFwKKyAgICAgICAgICAgZmF0ZS1tb3YtbmVnLWZpcnN0cHRzLWRpc2NhcmQtZnJhbWVzIFwKKworRkFURV9NT1ZfRkZQUk9CRSA9IGZhdGUtbW92LW5lZy1maXJzdHB0cy1kaXNjYXJkIFwKKyAgICAgICAgICAgICAgICAgICBmYXRlLW1vdi1hYWMtMjA0OC1wcmltaW5nIFwKKyAgICAgICAgICAgICAgICAgICBmYXRlLW1vdi16b21iaWUgXAorICAgICAgICAgICAgICAgICAgIGZhdGUtbW92LWluaXQtbm9ua2V5ZnJhbWUgXAorICAgICAgICAgICAgICAgICAgIGZhdGUtbW92LWRpc3BsYXltYXRyaXggXAorICAgICAgICAgICAgICAgICAgIGZhdGUtbW92LXNwaGVyaWNhbC1tb25vIFwKKyAgICAgICAgICAgICAgICAgICBmYXRlLW1vdi1ndWVzcy1kZWxheS0xIFwKKyAgICAgICAgICAgICAgICAgICBmYXRlLW1vdi1ndWVzcy1kZWxheS0yIFwKKyAgICAgICAgICAgICAgICAgICBmYXRlLW1vdi1ndWVzcy1kZWxheS0zIFwKKworRkFURV9TQU1QTEVTX0FWQ09OViArPSAkKEZBVEVfTU9WKQorRkFURV9TQU1QTEVTX0ZGUFJPQkUgKz0gJChGQVRFX01PVl9GRlBST0JFKQorCitmYXRlLW1vdjogJChGQVRFX01PVikgJChGQVRFX01PVl9GRlBST0JFKQorCisjIE1ha2Ugc3VyZSB3ZSBoYW5kbGUgZWRpdCBsaXN0cyBjb3JyZWN0bHkgaW4gbm9ybWFsIGNhc2VzLgorZmF0ZS1tb3YtMWVsaXN0LW5vY3R0czogQ01EID0gZnJhbWVtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvbW92L21vdi0xZWxpc3Qtbm9jdHRzLm1vdgorZmF0ZS1tb3YtMWVsaXN0LTFjdHRzOiBDTUQgPSBmcmFtZW1kNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tb3YvbW92LTFlbGlzdC0xY3R0cy5tb3YKK2ZhdGUtbW92LTNlbGlzdDogQ01EID0gZnJhbWVtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvbW92L21vdi0zZWxpc3QubW92CitmYXRlLW1vdi0zZWxpc3QtMWN0dHM6IENNRCA9IGZyYW1lbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL21vdi9tb3YtM2VsaXN0LTFjdHRzLm1vdgorCisjIEVkaXQgbGlzdCB3aXRoIGVuY3J5cHRpb24KK2ZhdGUtbW92LTNlbGlzdC1lbmNyeXB0ZWQ6IENNRCA9IGZyYW1lbWQ1IC1kZWNyeXB0aW9uX2tleSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMiAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tb3YvbW92LTNlbGlzdC1lbmNyeXB0ZWQubW92CisKKyMgTWFrZXMgc3VyZSB0aGF0IHRoZSBDVFRTIGlzIGFsc28gbW9kaWZpZWQgd2hlbiB3ZSBmaXggYXZpbmRleCBpbiBtb3YuYyB3aGlsZSBwYXJzaW5nIGVkaXQgbGlzdHMuCitmYXRlLW1vdi1lbGlzdC1zdGFydHMtY3R0cy0ybmRzYW1wbGU6IENNRCA9IGZyYW1lbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL21vdi9tb3YtZWxpc3Qtc3RhcnRzLWN0dHMtMm5kc2FtcGxlLm1vdgorCisjIE1ha2VzIHN1cmUgdGhhdCB3ZSBoYW5kbGUgZWRpdCBsaXN0cyBlbmRpbmcgb24gYSBCLWZyYW1lIGNvcnJlY3RseS4KKyMgVGhlIGxhc3QgZnJhbWUgaW4gZGVjb2Rpbmcgb3JkZXIgd2hpY2ggaXMgQi1mcmFtZSBzaG91bGQgYmUgb3V0cHV0LCBidXQgdGhlIGxhc3QgYnV0LW9uZSBQLWZyYW1lIHNob3VsZG4ndCBiZQorIyBvdXRwdXQuCitmYXRlLW1vdi0xZWxpc3QtZW5kcy1sYXN0LWJmcmFtZTogQ01EID0gZnJhbWVtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvbW92L21vdi0xZWxpc3QtZW5kcy1sYXN0LWJmcmFtZS5tb3YKKworIyBNYWtlcyBzdXJlIHRoYXQgd2UgaGFuZGxlIHRpbWVzdGFtcHMgb2YgcGFja2V0cyBpbiBjYXNlIG9mIG11bHRpcGxlIGVkaXQgbGlzdHMgd2l0aCBvbmUgb2YgdGhlbSBlbmRpbmcgb24gYSBCLWZyYW1lIGNvcnJlY3RseS4KK2ZhdGUtbW92LTJlbGlzdC1lbGlzdDEtZW5kcy1iZnJhbWU6IENNRCA9IGZyYW1lbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL21vdi9tb3YtMmVsaXN0LWVsaXN0MS1lbmRzLWJmcmFtZS5tb3YKKworIyBNYWtlcyBzdXJlIHRoYXQgaWYgZWRpdCBsaXN0IGVuZHMgb24gYSBCLWZyYW1lIGJ1dCBiZWZvcmUgdGhlIEktZnJhbWUsIHRoZW4gd2Ugb3V0cHV0IHRoZSBCLWZyYW1lIGJ1dCBkaXNjYXJkIHRoZSBJLWZyYW1lLgorZmF0ZS1tb3YtZWxzdC1lbmRzLWJldG4tYi1hbmQtaTogQ01EID0gZnJhbWVtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvbW92L2Vsc3RfZW5kc19iZXRuX2JfYW5kX2kubXA0CisKKyMgTWFrZXMgc3VyZSB0aGF0IHdlIGhhbmRsZSBlZGl0IGxpc3RzIGFuZCBzdGFydCBwYWRkaW5nIGNvcnJlY3RseS4KK2ZhdGUtbW92LTQ0MGh6LTEwbXM6IENNRCA9IGZyYW1lbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL21vdi80NDBoei0xMG1zLm00YQorCisjIE1ha2VzIHN1cmUgdGhhdCB3ZSBoYW5kbGUgaW52YWxpZCBlZGl0IGxpc3QgZW50cnkgY291bnQgY29ycmVjdGx5LgorZmF0ZS1tb3YtaW52YWxpZC1lbHN0LWVudHJ5LWNvdW50OiBDTUQgPSBmcmFtZW1kNSAtaWRjdCBzaW1wbGUgLWZsYWdzICtiaXRleGFjdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tb3YvaW52YWxpZF9lbHN0X2VudHJ5X2NvdW50Lm1vdgorCisjIE1ha2VzIHN1cmUgdGhhdCAxc3Qga2V5LWZyYW1lIGlzIHBpY2tlZCB3aGVuLAorIyAgICBpKSBPbmUgQi1mcmFtZSBiZXR3ZWVuIDIga2V5LWZyYW1lcworIyAgIGlpKSBFZGl0IGxpc3Qgc3RhcnRzIG9uIEItZnJhbWUuCisjICBpaWkpIEJvdGgga2V5LWZyYW1lcyBoYXZlIHRoZWlyIERUUyA8IGVkaXQgbGlzdCBzdGFydAorIyBpLmUuICBQdHMgT3JkZXI6IEktQi1JCitmYXRlLW1vdi1pYmktZWxzdC1zdGFydHMtYjogQ01EID0gZnJhbWVtZDUgLWZsYWdzICtiaXRleGFjdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tb3YvbW92X2liaV9lbHN0X3N0YXJ0c19iLm1vdgorCisjIE1ha2VzIHN1cmUgdGhhdCB3ZSBoYW5kbGUgb3ZlcmxhcHBpbmcgZnJhbWdtZW50cworZmF0ZS1tb3YtZnJhZy1vdmVybGFwOiBDTUQgPSBmcmFtZW1kNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tb3YvZnJhZ19vdmVybGFwLm1wNAorCisjIE1ha2VzIHN1cmUgdGhhdCB3ZSBwaWNrIHRoZSByaWdodCBmcmFtZXMgYWNjb3JkaW5nIHRvIGVkaXQgbGlzdCB3aGVuIHRoZXJlIGlzIG5vIGtleWZyYW1lIHdpdGggUFRTIDwgZWRpdCBsaXN0IHN0YXJ0LgorIyBGb3IgZXhhbXBsZSwgd2hlbiB2aWRlbyBzdGFydHMgb24gYSBCLWZyYW1lLCBhbmQgZWRpdCBsaXN0IHN0YXJ0cyBvbiB0aGF0IEItZnJhbWUgdG9vLgorIyBHT1Agc3RydWN0dXJlIDogQiBCIEkgaW4gcHJlc2VudGF0aW9uIG9yZGVyLgorZmF0ZS1tb3YtYmJpLWVsc3Qtc3RhcnRzLWI6IENNRCA9IGZyYW1lbWQ1IC1mbGFncyArYml0ZXhhY3QgLWFjb2RlYyBhYWNfZml4ZWQgLWkgJChUQVJHRVRfU0FNUExFUykvaDI2NC90d29maWVsZHNfcGFja2V0Lm1wNAorCisjIE1ha2VzIHN1cmUgdGhhdCB0aGUgc3RyZWFtIHN0YXJ0X3RpbWUgaXMgbm90IG5lZ2F0aXZlIHdoZW4gdGhlIGZpcnN0IHBhY2tldCBpcyBhIERJU0NBUkQgcGFja2V0IHdpdGggbmVnYXRpdmUgdGltZXN0YW1wLgorZmF0ZS1tb3YtbmVnLWZpcnN0cHRzLWRpc2NhcmQ6IENNRCA9IHJ1biBmZnByb2JlJChQUk9HU1NVRikkKEVYRVNVRikgLXNob3dfZW50cmllcyBzdHJlYW09c3RhcnRfdGltZSAtYml0ZXhhY3QgJChUQVJHRVRfU0FNUExFUykvbW92L21vdl9uZWdfZmlyc3RfcHRzX2Rpc2NhcmQubW92CisKKyMgTWFrZXMgc3VyZSB0aGF0IGV4cGVjdGVkIGZyYW1lcyBhcmUgZ2VuZXJhdGVkIGZvciBtb3ZfbmVnX2ZpcnN0X3B0c19kaXNjYXJkLm1vdiB3aXRoIC12c3luYyAxCitmYXRlLW1vdi1uZWctZmlyc3RwdHMtZGlzY2FyZC1mcmFtZXM6IENNRCA9IGZyYW1lbWQ1IC1mbGFncyArYml0ZXhhY3QgLWkgJChUQVJHRVRfU0FNUExFUykvbW92L21vdl9uZWdfZmlyc3RfcHRzX2Rpc2NhcmQubW92IC12c3luYyAxCisKK2ZhdGUtbW92LWFhYy0yMDQ4LXByaW1pbmc6IENNRCA9IHJ1biBmZnByb2JlJChQUk9HU1NVRikkKEVYRVNVRikgLXNob3dfcGFja2V0cyAtcHJpbnRfZm9ybWF0IGNvbXBhY3QgJChUQVJHRVRfU0FNUExFUykvbW92L2FhYy0yMDQ4LXByaW1pbmcubW92CisKK2ZhdGUtbW92LXpvbWJpZTogQ01EID0gcnVuIGZmcHJvYmUkKFBST0dTU1VGKSQoRVhFU1VGKSAtc2hvd19zdHJlYW1zIC1zaG93X3BhY2tldHMgLXNob3dfZnJhbWVzIC1iaXRleGFjdCAtcHJpbnRfZm9ybWF0IGNvbXBhY3QgJChUQVJHRVRfU0FNUExFUykvbW92L3doaXRlX3pvbWJpZV9zY3J1bmNoLXBhcnQubW92CisKK2ZhdGUtbW92LWluaXQtbm9ua2V5ZnJhbWU6IENNRCA9IHJ1biBmZnByb2JlJChQUk9HU1NVRikkKEVYRVNVRikgLXNob3dfcGFja2V0cyAtcHJpbnRfZm9ybWF0IGNvbXBhY3QgLXNlbGVjdF9zdHJlYW1zIHYgJChUQVJHRVRfU0FNUExFUykvbW92L21wNC1pbml0LW5vbmtleWZyYW1lLm1wNAorCitmYXRlLW1vdi1kaXNwbGF5bWF0cml4OiBDTUQgPSBydW4gZmZwcm9iZSQoUFJPR1NTVUYpJChFWEVTVUYpIC1zaG93X2VudHJpZXMgc3RyZWFtPWRpc3BsYXlfYXNwZWN0X3JhdGlvLHNhbXBsZV9hc3BlY3RfcmF0aW86c3RyZWFtX3NpZGVfZGF0YV9saXN0IC1zZWxlY3Rfc3RyZWFtcyB2IC12IDAgJChUQVJHRVRfU0FNUExFUykvbW92L2Rpc3BsYXltYXRyaXgubW92CisKK2ZhdGUtbW92LXNwaGVyaWNhbC1tb25vOiBDTUQgPSBydW4gZmZwcm9iZSQoUFJPR1NTVUYpJChFWEVTVUYpIC1zaG93X2VudHJpZXMgc3RyZWFtX3NpZGVfZGF0YV9saXN0IC1zZWxlY3Rfc3RyZWFtcyB2IC12IDAgJChUQVJHRVRfU0FNUExFUykvbW92L3NwaGVyaWNhbC5tb3YKKworZmF0ZS1tb3YtZ3BtZi1yZW11eDogQ01EID0gbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL21vdi9mYWtlLWdwLW1lZGlhLXdpdGgtcmVhbC1ncG1mLm1wNCAtbWFwIDAgLWMgY29weSAtZmZsYWdzICtiaXRleGFjdCAtZiBtcDQKK2ZhdGUtbW92LWdwbWYtcmVtdXg6IENNUCA9IG9uZWxpbmUKK2ZhdGUtbW92LWdwbWYtcmVtdXg6IFJFRiA9IDhmNDhlNDM1ZWUxZjZiN2UxNzNlYTc1NjE0MWVhYmYzCisKK2ZhdGUtbW92LWd1ZXNzLWRlbGF5LTE6IENNRCA9IHJ1biBmZnByb2JlJChQUk9HU1NVRikkKEVYRVNVRikgLXNob3dfZW50cmllcyBzdHJlYW09aGFzX2JfZnJhbWVzIC1zZWxlY3Rfc3RyZWFtcyB2ICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvaDI2NF8zYmZfbm9weXJhbWlkX25vYnNyZXN0cmljdGlvbi5tcDQKK2ZhdGUtbW92LWd1ZXNzLWRlbGF5LTI6IENNRCA9IHJ1biBmZnByb2JlJChQUk9HU1NVRikkKEVYRVNVRikgLXNob3dfZW50cmllcyBzdHJlYW09aGFzX2JfZnJhbWVzIC1zZWxlY3Rfc3RyZWFtcyB2ICQoVEFSR0VUX1NBTVBMRVMpL2gyNjQvaDI2NF8zYmZfcHlyYW1pZF9ub2JzcmVzdHJpY3Rpb24ubXA0CitmYXRlLW1vdi1ndWVzcy1kZWxheS0zOiBDTUQgPSBydW4gZmZwcm9iZSQoUFJPR1NTVUYpJChFWEVTVUYpIC1zaG93X2VudHJpZXMgc3RyZWFtPWhhc19iX2ZyYW1lcyAtc2VsZWN0X3N0cmVhbXMgdiAkKFRBUkdFVF9TQU1QTEVTKS9oMjY0L2gyNjRfNGJmX3B5cmFtaWRfbm9ic3Jlc3RyaWN0aW9uLm1wNApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9tcDMubWFrIGIvdGVzdHMvZmF0ZS9tcDMubWFrCmluZGV4IGE5MTY0ZjguLmI4ZmRlNTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvbXAzLm1haworKysgYi90ZXN0cy9mYXRlL21wMy5tYWsKQEAgLTEsMjkgKzEsMjkgQEAKIEZBVEVfTVAzICs9IGZhdGUtbXAzLWZsb2F0LWNvbmYtY29tcGwKLWZhdGUtbXAzLWZsb2F0LWNvbmYtY29tcGw6IENNRCA9IGZmbXBlZyAtYWNvZGVjIG1wM2Zsb2F0IC1pICQoVEFSR0VUX1NBTVBMRVMpL21wMy1jb25mb3JtYW5jZS9jb21wbC5iaXQgLWYgZjMybGUgLQorZmF0ZS1tcDMtZmxvYXQtY29uZi1jb21wbDogQ01EID0gZmZtcGVnIC1jOmEgbXAzZmxvYXQgLWkgJChUQVJHRVRfU0FNUExFUykvbXAzLWNvbmZvcm1hbmNlL2NvbXBsLmJpdCAtZiBmMzJsZSAtCiBmYXRlLW1wMy1mbG9hdC1jb25mLWNvbXBsOiBSRUYgPSAkKFNBTVBMRVMpL21wMy1jb25mb3JtYW5jZS9jb21wbC5mMzIKIAogRkFURV9NUDMgKz0gZmF0ZS1tcDMtZmxvYXQtY29uZi1oZV8zMmtoegotZmF0ZS1tcDMtZmxvYXQtY29uZi1oZV8zMmtoejogQ01EID0gZmZtcGVnIC1hY29kZWMgbXAzZmxvYXQgLWkgJChUQVJHRVRfU0FNUExFUykvbXAzLWNvbmZvcm1hbmNlL2hlXzMya2h6LmJpdCAtYWYgYXRyaW09ZW5kX3NhbXBsZT0xNzE2NDggLWYgZjMybGUgLQorZmF0ZS1tcDMtZmxvYXQtY29uZi1oZV8zMmtoejogQ01EID0gZmZtcGVnIC1jOmEgbXAzZmxvYXQgLWkgJChUQVJHRVRfU0FNUExFUykvbXAzLWNvbmZvcm1hbmNlL2hlXzMya2h6LmJpdCAtYWYgYXRyaW09ZW5kX3NhbXBsZT0xNzE2NDggLWYgZjMybGUgLQogZmF0ZS1tcDMtZmxvYXQtY29uZi1oZV8zMmtoejogUkVGID0gJChTQU1QTEVTKS9tcDMtY29uZm9ybWFuY2UvaGVfMzJraHouZjMyCiAKIEZBVEVfTVAzICs9IGZhdGUtbXAzLWZsb2F0LWNvbmYtaGVfNDRraHoKLWZhdGUtbXAzLWZsb2F0LWNvbmYtaGVfNDRraHo6IENNRCA9IGZmbXBlZyAtYWNvZGVjIG1wM2Zsb2F0IC1pICQoVEFSR0VUX1NBTVBMRVMpL21wMy1jb25mb3JtYW5jZS9oZV80NGtoei5iaXQgLWFmIGF0cmltPWVuZF9zYW1wbGU9NDcxMTY4IC1mIGYzMmxlIC0KK2ZhdGUtbXAzLWZsb2F0LWNvbmYtaGVfNDRraHo6IENNRCA9IGZmbXBlZyAtYzphIG1wM2Zsb2F0IC1pICQoVEFSR0VUX1NBTVBMRVMpL21wMy1jb25mb3JtYW5jZS9oZV80NGtoei5iaXQgLWFmIGF0cmltPWVuZF9zYW1wbGU9NDcxMTY4IC1mIGYzMmxlIC0KIGZhdGUtbXAzLWZsb2F0LWNvbmYtaGVfNDRraHo6IFJFRiA9ICQoU0FNUExFUykvbXAzLWNvbmZvcm1hbmNlL2hlXzQ0a2h6LmYzMgogCiBGQVRFX01QMyArPSBmYXRlLW1wMy1mbG9hdC1jb25mLWhlXzQ4a2h6Ci1mYXRlLW1wMy1mbG9hdC1jb25mLWhlXzQ4a2h6OiBDTUQgPSBmZm1wZWcgLWFjb2RlYyBtcDNmbG9hdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcDMtY29uZm9ybWFuY2UvaGVfNDhraHouYml0IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTE3MTY0OCAtZiBmMzJsZSAtCitmYXRlLW1wMy1mbG9hdC1jb25mLWhlXzQ4a2h6OiBDTUQgPSBmZm1wZWcgLWM6YSBtcDNmbG9hdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcDMtY29uZm9ybWFuY2UvaGVfNDhraHouYml0IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTE3MTY0OCAtZiBmMzJsZSAtCiBmYXRlLW1wMy1mbG9hdC1jb25mLWhlXzQ4a2h6OiBSRUYgPSAkKFNBTVBMRVMpL21wMy1jb25mb3JtYW5jZS9oZV80OGtoei5mMzIKIAogRkFURV9NUDMgKz0gZmF0ZS1tcDMtZmxvYXQtY29uZi1oZWNvbW1vbgotZmF0ZS1tcDMtZmxvYXQtY29uZi1oZWNvbW1vbjogQ01EID0gZmZtcGVnIC1hY29kZWMgbXAzZmxvYXQgLWkgJChUQVJHRVRfU0FNUExFUykvbXAzLWNvbmZvcm1hbmNlL2hlY29tbW9uLmJpdCAtYWYgYXRyaW09ZW5kX3NhbXBsZT0zMzQwOCAtZiBmMzJsZSAtCitmYXRlLW1wMy1mbG9hdC1jb25mLWhlY29tbW9uOiBDTUQgPSBmZm1wZWcgLWM6YSBtcDNmbG9hdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcDMtY29uZm9ybWFuY2UvaGVjb21tb24uYml0IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTMzNDA4IC1mIGYzMmxlIC0KIGZhdGUtbXAzLWZsb2F0LWNvbmYtaGVjb21tb246IFJFRiA9ICQoU0FNUExFUykvbXAzLWNvbmZvcm1hbmNlL2hlY29tbW9uLmYzMgogCiBGQVRFX01QMyArPSBmYXRlLW1wMy1mbG9hdC1jb25mLXNpCi1mYXRlLW1wMy1mbG9hdC1jb25mLXNpOiBDTUQgPSBmZm1wZWcgLWFjb2RlYyBtcDNmbG9hdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcDMtY29uZm9ybWFuY2Uvc2kuYml0IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTEzNDc4NCAtZiBmMzJsZSAtCitmYXRlLW1wMy1mbG9hdC1jb25mLXNpOiBDTUQgPSBmZm1wZWcgLWM6YSBtcDNmbG9hdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcDMtY29uZm9ybWFuY2Uvc2kuYml0IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTEzNDc4NCAtZiBmMzJsZSAtCiBmYXRlLW1wMy1mbG9hdC1jb25mLXNpOiBSRUYgPSAkKFNBTVBMRVMpL21wMy1jb25mb3JtYW5jZS9zaS5mMzIKIAogRkFURV9NUDMgKz0gZmF0ZS1tcDMtZmxvYXQtY29uZi1zaV9ibG9jawotZmF0ZS1tcDMtZmxvYXQtY29uZi1zaV9ibG9jazogQ01EID0gZmZtcGVnIC1hY29kZWMgbXAzZmxvYXQgLWkgJChUQVJHRVRfU0FNUExFUykvbXAzLWNvbmZvcm1hbmNlL3NpX2Jsb2NrLmJpdCAtYWYgYXRyaW09ZW5kX3NhbXBsZT03MjU3NiAtZiBmMzJsZSAtCitmYXRlLW1wMy1mbG9hdC1jb25mLXNpX2Jsb2NrOiBDTUQgPSBmZm1wZWcgLWM6YSBtcDNmbG9hdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tcDMtY29uZm9ybWFuY2Uvc2lfYmxvY2suYml0IC1hZiBhdHJpbT1lbmRfc2FtcGxlPTcyNTc2IC1mIGYzMmxlIC0KIGZhdGUtbXAzLWZsb2F0LWNvbmYtc2lfYmxvY2s6IFJFRiA9ICQoU0FNUExFUykvbXAzLWNvbmZvcm1hbmNlL3NpX2Jsb2NrLmYzMgogCiBGQVRFX01QMyArPSBmYXRlLW1wMy1mbG9hdC1leHRyYV9vdmVycmVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9tcGMubWFrIGIvdGVzdHMvZmF0ZS9tcGMubWFrCmluZGV4IDRhMDEyNzMuLjI5NGRmZmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvbXBjLm1haworKysgYi90ZXN0cy9mYXRlL21wYy5tYWsKQEAgLTEsOCArMSw4IEBACiBGQVRFX01QQy0kKENPTkZJR19NUENfREVNVVhFUikgKz0gZmF0ZS1tcGM3LWRlbXV4Ci1mYXRlLW1wYzctZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tdXNlcGFjay9pbnNpZGUtbXA3Lm1wYyAtYWNvZGVjIGNvcHkKK2ZhdGUtbXBjNy1kZW11eDogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL211c2VwYWNrL2luc2lkZS1tcDcubXBjIC1jOmEgY29weQogCiBGQVRFX01QQy0kKENPTkZJR19NUEM4X0RFTVVYRVIpICs9IGZhdGUtbXBjOC1kZW11eAotZmF0ZS1tcGM4LWRlbXV4OiBDTUQgPSBjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbXVzZXBhY2svaW5zaWRlLW1wOC5tcGMgLWFjb2RlYyBjb3B5CitmYXRlLW1wYzgtZGVtdXg6IENNRCA9IGNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tdXNlcGFjay9pbnNpZGUtbXA4Lm1wYyAtYzphIGNvcHkKIAogRkFURV9NUEMtJChjYWxsIERFTURFQywgTVBDLCBNUEM3KSArPSBmYXRlLW11c2VwYWNrNwogZmF0ZS1tdXNlcGFjazc6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tdXNlcGFjay9pbnNpZGUtbXA3Lm1wYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9tcGVnNC5tYWsgYi90ZXN0cy9mYXRlL21wZWc0Lm1hawppbmRleCA0N2RmYjdmLi5lZDZhMmZhIDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL21wZWc0Lm1haworKysgYi90ZXN0cy9mYXRlL21wZWc0Lm1hawpAQCAtOCw1ICs4LDEyIEBACiBmYXRlLW1wZWc0LWJzZi11bnBhY2stYmZyYW1lczogQ01EID0gbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWc0L3BhY2tlZF9iZnJhbWVzLmF2aSAtZmxhZ3MgK2JpdGV4YWN0IC1mZmxhZ3MgK2JpdGV4YWN0IC1jOnYgY29weSAtYnNmIG1wZWc0X3VucGFja19iZnJhbWVzIC1mIGF2aQogRkFURV9NUEVHNC0kKGNhbGwgQUxMWUVTLCBBVklfREVNVVhFUiBNUEVHNF9VTlBBQ0tfQkZSQU1FU19CU0YgQVZJX01VWEVSKSArPSBmYXRlLW1wZWc0LWJzZi11bnBhY2stYmZyYW1lcwogCitmYXRlLW1wZWc0LXBhY2tlZDogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzQvcGFja2VkX2JmcmFtZXMuYXZpIC1mbGFncyArYml0ZXhhY3QgLWZmbGFncyArYml0ZXhhY3QgLXZzeW5jIDEKK0ZBVEVfTVBFRzQtJChjYWxsIEFMTFlFUywgQVZJX0RFTVVYRVIgTVBFRzRfREVDT0RFUikgKz0gZmF0ZS1tcGVnNC1wYWNrZWQKKworRkFURV9NUEVHNC0kKGNhbGwgREVNREVDLCBNNFYsIE1QRUc0KSArPSBmYXRlLW00diAgZmF0ZS1tNHYtY2ZyCitmYXRlLW00djogICAgIENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWc0L2RlbW8ubTR2CitmYXRlLW00di1jZnI6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWc0L2RlbW8ubTR2IC12ZiBmcHM9NQorCiBGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9NUEVHNC15ZXMpCiBmYXRlLW1wZWc0OiAkKEZBVEVfTVBFRzQteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9tcGVncHMubWFrIGIvdGVzdHMvZmF0ZS9tcGVncHMubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzFlYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mYXRlL21wZWdwcy5tYWsKQEAgLTAsMCArMSw3IEBACisjIFRoaXMgdGVzdHMgdGhhdCBhIDE2LWJpdCBwY21fZHZkIHN0cmVhbSBpcyBjb3JyZWN0bHkgcmVtdXhlZCBpbiBtcGVncHMKK0ZBVEVfTVBFR1BTLSQoY2FsbCBERU1NVVgsIE1QRUdQUywgTVBFRzFTWVNURU0pICs9IGZhdGUtbXBlZ3BzLXJlbXV4ZWQtcGNtLWRlbXV4CitmYXRlLW1wZWdwcy1yZW11eGVkLXBjbS1kZW11eDogJChUQVJHRVRfU0FNUExFUykvbXBlZ3BzL3BjbV9hdWQubXBnCitmYXRlLW1wZWdwcy1yZW11eGVkLXBjbS1kZW11eDogQ01EID0gc3RyZWFtX3JlbXV4ICJtcGVnIiAiJChUQVJHRVRfU0FNUExFUykvbXBlZ3BzL3BjbV9hdWQubXBnIiAibXBlZyIgIi1tYXAgMDphOjAiICItY29kZWMgY29weSIKKworRkFURV9TQU1QTEVTX0ZGTVBFRyArPSAkKEZBVEVfTVBFR1BTLXllcykKK2ZhdGUtbXBlZ3BzOiAkKEZBVEVfTVBFR1BTLXllcykKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvbXBlZ3RzLm1hayBiL3Rlc3RzL2ZhdGUvbXBlZ3RzLm1hawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjEyODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmF0ZS9tcGVndHMubWFrCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgVGVzdCBwcm9iaW5nIE1QRUdUUyBmb3JtYXQgYW5kIGNvZGVjcworIworUFJPQkVfQ09ERUNfTkFNRV9DT01NQU5EID0gXAorICAgIGZmcHJvYmUkKFBST0dTU1VGKSQoRVhFU1VGKSAtc2hvd19lbnRyaWVzIHN0cmVhbT1jb2RlY19uYW1lIFwKKyAgICAtcHJpbnRfZm9ybWF0IGRlZmF1bHQgLWJpdGV4YWN0IC12IDAKKworRkFURV9NUEVHVFNfUFJPQkUtJChjYWxsIERFTURFQywgTVBFR1RTLCBIRVZDLCBBQUNfTEFUTSkgKz0gZmF0ZS1tcGVndHMtcHJvYmUtbGF0bQorZmF0ZS1tcGVndHMtcHJvYmUtbGF0bTogU1JDID0gJChUQVJHRVRfU0FNUExFUykvbXBlZ3RzL2xvZXdlLnRzCitmYXRlLW1wZWd0cy1wcm9iZS1sYXRtOiBDTUQgPSBydW4gJChQUk9CRV9DT0RFQ19OQU1FX0NPTU1BTkQpIC1pICIkKFNSQykiCisKKworRkFURV9NUEVHVFNfUFJPQkUtJChjYWxsIERFTURFQywgTVBFR1RTLCBIRVZDLCBBQUNfTEFUTSkgKz0gZmF0ZS1tcGVndHMtcHJvYmUtcHJvZ3JhbQorZmF0ZS1tcGVndHMtcHJvYmUtcHJvZ3JhbTogU1JDID0gJChUQVJHRVRfU0FNUExFUykvbXBlZ3RzL2xvZXdlLnRzCitmYXRlLW1wZWd0cy1wcm9iZS1wcm9ncmFtOiBDTUQgPSBydW4gJChQUk9CRV9DT0RFQ19OQU1FX0NPTU1BTkQpIC1zZWxlY3Rfc3RyZWFtcyBwOjc2OTp2OjAgLWkgIiQoU1JDKSIKKworCitGQVRFX1NBTVBMRVNfRkZQUk9CRSArPSAkKEZBVEVfTVBFR1RTX1BST0JFLXllcykKKworZmF0ZS1tcGVndHM6ICQoRkFURV9NUEVHVFNfUFJPQkUteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9teGYubWFrIGIvdGVzdHMvZmF0ZS9teGYubWFrCmluZGV4IDYwMzJjODUuLmRjZTIzZDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvbXhmLm1haworKysgYi90ZXN0cy9mYXRlL214Zi5tYWsKQEAgLTEsMTEgKzEsNDUgQEAKIAogRkFURV9NWEYgKz0gZmF0ZS1teGYtbWlzc2luZy1pbmRleC1kZW11eAotZmF0ZS1teGYtbWlzc2luZy1pbmRleC1kZW11eDogQ01EID0gY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL214Zi9vcGF0b21fbWlzc2luZ19pbmRleC5teGYgLWFjb2RlYyBjb3B5CitmYXRlLW14Zi1taXNzaW5nLWluZGV4LWRlbXV4OiBDTUQgPSBjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbXhmL29wYXRvbV9taXNzaW5nX2luZGV4Lm14ZiAtYzphIGNvcHkKIAogRkFURV9NWEYgKz0gZmF0ZS1teGYtZXNzZW5jZWdyb3VwLWRlbXV4Ci1mYXRlLW14Zi1lc3NlbmNlZ3JvdXAtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL214Zi9vcGF0b21fZXNzZW5jZWdyb3VwX2FscGhhX3Jhdy5teGYgLXZjb2RlYyBjb3B5CitmYXRlLW14Zi1lc3NlbmNlZ3JvdXAtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL214Zi9vcGF0b21fZXNzZW5jZWdyb3VwX2FscGhhX3Jhdy5teGYgLWM6diBjb3B5CisKK0ZBVEVfTVhGICs9IGZhdGUtbXhmLW11bHRpcGxlLWNvbXBvbmVudHMtZGVtdXgKK2ZhdGUtbXhmLW11bHRpcGxlLWNvbXBvbmVudHMtZGVtdXg6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL214Zi9tdWx0aXBsZV9jb21wb25lbnRzLm14ZiAtYzp2IGNvcHkKKworRkFURV9NWEYgKz0gZmF0ZS1teGYtbWV0YWRhdGEtc291cmNlLXJlZjEKK2ZhdGUtbXhmLW1ldGFkYXRhLXNvdXJjZS1yZWYxOiBDTUQgPSBmbXRzdGRvdXQgZmZtZXRhZGF0YSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9teGYvdHJhY2tfMDFfdjAyLm14ZiAtZmZsYWdzICtiaXRleGFjdCAtZmxhZ3MgK2JpdGV4YWN0IC1tYXAgMDowIC1tYXAgMDoyIC1tYXAgMDozICAtbWFwX21ldGFkYXRhOmcgLTEKKworRkFURV9NWEYgKz0gZmF0ZS1teGYtbWV0YWRhdGEtc291cmNlLXJlZjIKK2ZhdGUtbXhmLW1ldGFkYXRhLXNvdXJjZS1yZWYyOiBDTUQgPSBmbXRzdGRvdXQgZmZtZXRhZGF0YSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9teGYvdHJhY2tfMDJfYTAxLm14ZiAtZmZsYWdzICtiaXRleGFjdCAtZmxhZ3MgK2JpdGV4YWN0IC1tYXAgMDowIC1tYXAgMDoxIC1tYXAgMDozICAtbWFwX21ldGFkYXRhOmcgLTEKKworIworIyBUZXN0cyBwcm9iaW5nIE1YRiBmb3JtYXQgYW5kIHN0cmVhbSBwcm9wZXJ0aWVzCisjCitQUk9CRV9GT1JNQVRfU1RSRUFNU19DT01NQU5EID0gXAorICAgIGZmcHJvYmUkKFBST0dTU1VGKSQoRVhFU1VGKSAtc2hvd19lbnRyaWVzIGZvcm1hdD1mb3JtYXRfbmFtZSxkdXJhdGlvbixiaXRfcmF0ZTpmb3JtYXRfdGFnczpzdHJlYW1zOnN0cmVhbV90YWdzIFwKKyAgICAtcHJpbnRfZm9ybWF0IGRlZmF1bHQgLWJpdGV4YWN0IC12IDAKKworRkFURV9NWEZfUFJPQkUtJChjYWxsIEVOQ0RFQzIsIE1QRUcyVklERU8sIFBDTV9TMTZMRSwgTVhGKSArPSBmYXRlLW14Zi1wcm9iZS1kMTAKK2ZhdGUtbXhmLXByb2JlLWQxMDogU1JDID0gJChUQVJHRVRfU0FNUExFUykvbXhmL1NvbnktMDAwMDEubXhmCitmYXRlLW14Zi1wcm9iZS1kMTA6IENNRCA9IHJ1biAkKFBST0JFX0ZPUk1BVF9TVFJFQU1TX0NPTU1BTkQpIC1pICIkKFNSQykiCisKK0ZBVEVfTVhGX1BST0JFLSQoY2FsbCBFTkNERUMsIEROWEhELCBNWEYpICs9IGZhdGUtbXhmLXByb2JlLWRueGhkCitmYXRlLW14Zi1wcm9iZS1kbnhoZDogU1JDID0gJChUQVJHRVRfU0FNUExFUykvbXhmL211bHRpcGxlX2NvbXBvbmVudHMubXhmCitmYXRlLW14Zi1wcm9iZS1kbnhoZDogQ01EID0gcnVuICQoUFJPQkVfRk9STUFUX1NUUkVBTVNfQ09NTUFORCkgLWkgIiQoU1JDKSIKKworRkFURV9NWEZfUFJPQkUtJChjYWxsIEVOQ0RFQzIsIERWVklERU8sIFBDTV9TMTZMRSwgTVhGKSArPSBmYXRlLW14Zi1wcm9iZS1kdjI1CitmYXRlLW14Zi1wcm9iZS1kdjI1OiBTUkMgPSAkKFRBUkdFVF9TQU1QTEVTKS9teGYvQXZpZC0wMDAwNS5teGYKK2ZhdGUtbXhmLXByb2JlLWR2MjU6IENNRCA9IHJ1biAkKFBST0JFX0ZPUk1BVF9TVFJFQU1TX0NPTU1BTkQpIC1pICIkKFNSQykiCisKK0ZBVEVfTVhGX1JFRUxfTkFNRS0kKGNhbGwgRU5DREVDMiwgTVBFRzJWSURFTywgUENNX1MxNkxFLCBNWEYpICs9IGZhdGUtbXhmLXJlZWxfbmFtZQorZmF0ZS1teGYtcmVlbF9uYW1lOiAkKFRBUkdFVF9TQU1QTEVTKS9teGYvU29ueS0wMDAwMS5teGYKK2ZhdGUtbXhmLXJlZWxfbmFtZTogQ01EID0gbWQ1IC15IC1pICQoVEFSR0VUX1NBTVBMRVMpL214Zi9Tb255LTAwMDAxLm14ZiAgLWMgY29weSAtdGltZWNvZGUgMDA6MDA6MDA6MDAgLW1ldGFkYXRhICJyZWVsX25hbWU9dGVzdF9yZWVsIiAtZmZsYWdzICtiaXRleGFjdCAtZiBteGYKIAogRkFURV9NWEYtJChDT05GSUdfTVhGX0RFTVVYRVIpICs9ICQoRkFURV9NWEYpCiAKLUZBVEVfU0FNUExFU19BVkNPTlYgKz0gJChGQVRFX01YRi15ZXMpCi1mYXRlLW14ZjogJChGQVRFX01YRi15ZXMpCitGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9NWEYteWVzKSAkKEZBVEVfTVhGX1JFRUxfTkFNRS15ZXMpCitGQVRFX1NBTVBMRVNfRkZQUk9CRSArPSAkKEZBVEVfTVhGX1BST0JFLXllcykKKworZmF0ZS1teGY6ICQoRkFURV9NWEYteWVzKSAkKEZBVEVfTVhGX1BST0JFLXllcykgJChGQVRFX01YRl9SRUVMX05BTUUteWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9vcHVzLm1hayBiL3Rlc3RzL2ZhdGUvb3B1cy5tYWsKaW5kZXggYjEzZDg2Yy4uN2YyODk0NSAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9vcHVzLm1haworKysgYi90ZXN0cy9mYXRlL29wdXMubWFrCkBAIC0xLDI2ICsxLDIyIEBACiAjIFRoZSBzYW1wbGVzIHdlcmUgcHJvZHVjZWQgYnkgc2ltcGx5IHJld3JhcHBpbmcgdGhlIG9mZmljaWFsIHRlc3QgdmVjdG9ycyBmcm9tCi0jIHRoZWlyIGN1c3RvbSBmb3JtYXQgaW50byBNYXRyb3NrYS4KLSMgVGhlIHJlZmVyZW5jZSBmaWxlcyB3ZXJlIGNyZWF0ZWQgd2l0aCBvdXIgZGVjb2RlciBhbmQgdGVzdGVkIGFnYWluc3QgdGhlCi0jIGxpYm9wdXMgb3V0cHV0IHdpdGggdGhlIG9mZmljaWFsIG9wdXNfY29tcGFyZSB0b29sLiBXZSBjYW5ub3QgdXNlIGxpYm9wdXMKLSMgb3V0cHV0IGFzIHJlZmVyZW5jZSBkaXJlY3RseSwgYmVjYXVzZSB0aGUgdXNlIG9mIGRpZmZlcmVudCByZXNhbXBsZXJzIHdvdWxkCi0jIHJlcXVpcmUgdG9vIGhpZ2ggZnV6eiB2YWx1ZXMsIHdoaWNoIGNhbiBoaWRlIGJ1Z3MuCi0jIEJlZm9yZSBhZGRpbmcgbmV3IHRlc3RzIGhlcmUsIGFsd2F5cyBtYWtlIHN1cmUgdGhleSBwYXNzIG9wdXNfY29tcGFyZS4KKyMgdGhlaXIgY3VzdG9tIGZvcm1hdCBpbnRvIE1hdHJvc2thLiBUaGUgcmVmZXJlbmNlIGRlY29kZWQgb3V0cHV0cyBhcmUgZnJvbSB0aGUKKyMgbmV3ZXN0IHRlc3R2ZWN0b3JzIGZpbGUgZnJvbSBSRkM4MjUxCiAKLU9QVVNfQ0VMVF9TQU1QTEVTICAgPSAkKGFkZHByZWZpeCB0ZXN0dmVjdG9yLCAwMSAwNyAxMSkgdHJvbi42Y2gudGlueXBrdHMKK09QVVNfQ0VMVF9TQU1QTEVTICAgPSAkKGFkZHByZWZpeCB0ZXN0dmVjdG9yLCAwMSAxMSkgdHJvbi42Y2gudGlueXBrdHMKIE9QVVNfSFlCUklEX1NBTVBMRVMgPSAkKGFkZHByZWZpeCB0ZXN0dmVjdG9yLCAwNSAwNikKIE9QVVNfU0lMS19TQU1QTEVTICAgPSAkKGFkZHByZWZpeCB0ZXN0dmVjdG9yLCAwMiAwMyAwNCkKLU9QVVNfU0FNUExFUyAgICAgICAgPSAkKGFkZHByZWZpeCB0ZXN0dmVjdG9yLCAwOCAwOSAxMCAxMikKK09QVVNfU0FNUExFUyAgICAgICAgPSAkKGFkZHByZWZpeCB0ZXN0dmVjdG9yLCAwNyAwOCAwOSAxMCAxMikKIAogZGVmaW5lIEZBVEVfT1BVU19URVNUCiBGQVRFX09QVVMgICAgICs9IGZhdGUtb3B1cy0kKDEpCiBGQVRFX09QVVMkKDIpICs9IGZhdGUtb3B1cy0kKDEpCiBmYXRlLW9wdXMtJCgxKTogQ01EID0gZmZtcGVnIC1pICQoVEFSR0VUX1NBTVBMRVMpL29wdXMvJCgxKS5ta2EgLWYgczE2bGUgLQotZmF0ZS1vcHVzLSQoMSk6IFJFRiA9ICQoU0FNUExFUykvb3B1cy8kKDEpLmRlYworZmF0ZS1vcHVzLSQoMSk6IFJFRiA9ICQoU0FNUExFUykvb3B1cy8kKDEpJCgyKS5kZWMKIGVuZGVmCiAKLSQoZm9yZWFjaCBOLCQoT1BVU19DRUxUX1NBTVBMRVMpLCAgJChldmFsICQoY2FsbCBGQVRFX09QVVNfVEVTVCwkKE4pLF9DRUxUKSkpCi0kKGZvcmVhY2ggTiwkKE9QVVNfSFlCUklEX1NBTVBMRVMpLCQoZXZhbCAkKGNhbGwgRkFURV9PUFVTX1RFU1QsJChOKSxfSFlCUklEKSkpCi0kKGZvcmVhY2ggTiwkKE9QVVNfU0lMS19TQU1QTEVTKSwgICQoZXZhbCAkKGNhbGwgRkFURV9PUFVTX1RFU1QsJChOKSxfU0lMSykpKQorJChmb3JlYWNoIE4sJChPUFVTX0NFTFRfU0FNUExFUyksICAkKGV2YWwgJChjYWxsIEZBVEVfT1BVU19URVNULCQoTikpKSkKKyQoZm9yZWFjaCBOLCQoT1BVU19IWUJSSURfU0FNUExFUyksJChldmFsICQoY2FsbCBGQVRFX09QVVNfVEVTVCwkKE4pLF92MikpKQorJChmb3JlYWNoIE4sJChPUFVTX1NJTEtfU0FNUExFUyksICAkKGV2YWwgJChjYWxsIEZBVEVfT1BVU19URVNULCQoTikpKSkKICQoZm9yZWFjaCBOLCQoT1BVU19TQU1QTEVTKSwgICAgICAgJChldmFsICQoY2FsbCBGQVRFX09QVVNfVEVTVCwkKE4pLCkpKQogCiBGQVRFX09QVVMgOj0gJChzb3J0ICQoRkFURV9PUFVTKSkKQEAgLTI4LDE0ICsyNCwxOSBAQAogJChGQVRFX09QVVMpOiBDTVAgPSBzdGRkZXYKICQoRkFURV9PUFVTKTogQ01QX1VOSVQgPSBzMTYKICQoRkFURV9PUFVTKTogRlVaWiA9IDMKLWZhdGUtb3B1cy10ZXN0dmVjdG9yMDI6IENNUF9UQVJHRVQgPSAxOTEKLWZhdGUtb3B1cy10ZXN0dmVjdG9yMDM6IENNUF9UQVJHRVQgPSAxMzkKLWZhdGUtb3B1cy10ZXN0dmVjdG9yMDQ6IENNUF9UQVJHRVQgPSAxMTkKLWZhdGUtb3B1cy10ZXN0dmVjdG9yMDU6IENNUF9UQVJHRVQgPSAxMDgKLWZhdGUtb3B1cy10ZXN0dmVjdG9yMDY6IENNUF9UQVJHRVQgPSAxMDYKLWZhdGUtb3B1cy10ZXN0dmVjdG9yMDg6IENNUF9UQVJHRVQgPSA2Ci1mYXRlLW9wdXMtdGVzdHZlY3RvcjEwOiBDTVBfVEFSR0VUID0gMzgKLWZhdGUtb3B1cy10ZXN0dmVjdG9yMTI6IENNUF9UQVJHRVQgPSAxNjAKK2ZhdGUtb3B1cy10ZXN0dmVjdG9yMDE6ICAgICAgQ01QX1RBUkdFVCA9IDAKK2ZhdGUtb3B1cy10ZXN0dmVjdG9yMDI6ICAgICAgQ01QX1RBUkdFVCA9IDE5MQorZmF0ZS1vcHVzLXRlc3R2ZWN0b3IwMzogICAgICBDTVBfVEFSR0VUID0gMTM5CitmYXRlLW9wdXMtdGVzdHZlY3RvcjA0OiAgICAgIENNUF9UQVJHRVQgPSAxMTkKK2ZhdGUtb3B1cy10ZXN0dmVjdG9yMDU6ICAgICAgQ01QX1RBUkdFVCA9IDEwOAorZmF0ZS1vcHVzLXRlc3R2ZWN0b3IwNjogICAgICBDTVBfVEFSR0VUID0gMTA2CitmYXRlLW9wdXMtdGVzdHZlY3RvcjA3OiAgICAgIENNUF9UQVJHRVQgPSAwCitmYXRlLW9wdXMtdGVzdHZlY3RvcjA4OiAgICAgIENNUF9UQVJHRVQgPSA2CitmYXRlLW9wdXMtdGVzdHZlY3RvcjA5OiAgICAgIENNUF9UQVJHRVQgPSAwCitmYXRlLW9wdXMtdGVzdHZlY3RvcjEwOiAgICAgIENNUF9UQVJHRVQgPSAzOAorZmF0ZS1vcHVzLXRlc3R2ZWN0b3IxMTogICAgICBDTVBfVEFSR0VUID0gMAorZmF0ZS1vcHVzLXRlc3R2ZWN0b3IxMjogICAgICBDTVBfVEFSR0VUID0gMTYwCitmYXRlLW9wdXMtdHJvbi42Y2gudGlueXBrdHM6IENNUF9UQVJHRVQgPSAwCiAKICQoRkFURV9PUFVTX0NFTFQpOiBDTVAgPSBvbmVvZmYKICQoRkFURV9PUFVTX0NFTFQpOiBGVVpaID0gNgpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9wY20ubWFrIGIvdGVzdHMvZmF0ZS9wY20ubWFrCmluZGV4IGU2NTAyYWEuLjA1M2YzMTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvcGNtLm1haworKysgYi90ZXN0cy9mYXRlL3BjbS5tYWsKQEAgLTI1LDcgKzI1LDcgQEAKIEZBVEVfUENNLSQoY2FsbCBFTkNNVVgsIFBDTV9TMjREQVVELCBEQVVEKSArPSBmYXRlLWRjaW5lbWEtZW5jb2RlCiBmYXRlLWRjaW5lbWEtZW5jb2RlOiB0ZXN0cy9kYXRhL2FzeW50aC05NjAwMC02LndhdgogZmF0ZS1kY2luZW1hLWVuY29kZTogU1JDID0gdGVzdHMvZGF0YS9hc3ludGgtOTYwMDAtNi53YXYKLWZhdGUtZGNpbmVtYS1lbmNvZGU6IENNRCA9IGVuY19kZWNfcGNtIGRhdWQgZnJhbWVtZDUgczE2bGUgJChTUkMpIC1jOmEgcGNtX3MyNGRhdWQgLWFmcmFtZXMgMjAKK2ZhdGUtZGNpbmVtYS1lbmNvZGU6IENNRCA9IGVuY19kZWNfcGNtIGRhdWQgZnJhbWVtZDUgczE2bGUgJChTUkMpIC1jOmEgcGNtX3MyNGRhdWQgLWZyYW1lczphIDIwCiAKIEZBVEVfRkZNUEVHICs9ICQoRkFURV9QQ00teWVzKQogRkFURV9TQU1QTEVTX0FWQ09OViArPSAkKEZBVEVfU0FNUExFU19QQ00teWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9waXhsZXQubWFrIGIvdGVzdHMvZmF0ZS9waXhsZXQubWFrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjBmMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9mYXRlL3BpeGxldC5tYWsKQEAgLTAsMCArMSw1IEBACitGQVRFX1BJWExFVCArPSBmYXRlLXBpeGxldC1yZ2IKK2ZhdGUtcGl4bGV0LXJnYjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcGl4bGV0L3BpeGxldF9yZ2IubW92IC1hbiAtcGl4X2ZtdCB5dXY0MjBwMTZsZQorCitGQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIE1PViwgUElYTEVUKSArPSAkKEZBVEVfUElYTEVUKQorZmF0ZS1waXhsZXQ6ICQoRkFURV9QSVhMRVQpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL3Byb3Jlcy5tYWsgYi90ZXN0cy9mYXRlL3Byb3Jlcy5tYWsKaW5kZXggZTg4ZGY1Zi4uZjdmNTJjYSAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS9wcm9yZXMubWFrCisrKyBiL3Rlc3RzL2ZhdGUvcHJvcmVzLm1hawpAQCAtNiw2ICs2LDcgQEAKICAgICAgICAgICAgICAgZmF0ZS1wcm9yZXMtYWxwaGFfc2tpcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgZmF0ZS1wcm9yZXMtdHJhbnNwYXJlbmN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgZmF0ZS1wcm9yZXMtdHJhbnNwYXJlbmN5X3NraXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgZmF0ZS1wcm9yZXMtZ3JheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAogRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBNT1YsIFBST1JFUykgKz0gJChGQVRFX1BST1JFUykKIGZhdGUtcHJvcmVzOiAkKEZBVEVfUFJPUkVTKQpAQCAtMTgsMyArMTksNCBAQAogZmF0ZS1wcm9yZXMtYWxwaGFfc2tpcDogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtc2tpcF9hbHBoYSAxIC1pICQoVEFSR0VUX1NBTVBMRVMpL3Byb3Jlcy9TZXF1ZW5jZV8xLUFwcGxlX1Byb1Jlc193aXRoX0FscGhhLm1vdiAtcGl4X2ZtdCB5dXY0NDRwMTBsZQogZmF0ZS1wcm9yZXMtdHJhbnNwYXJlbmN5OiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3Byb3Jlcy9wcm9yZXM0NDQ0X3dpdGhfdHJhbnNwYXJlbmN5Lm1vdiAtcGl4X2ZtdCB5dXZhNDQ0cDEwbGUKIGZhdGUtcHJvcmVzLXRyYW5zcGFyZW5jeV9za2lwOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1za2lwX2FscGhhIDEgLWkgJChUQVJHRVRfU0FNUExFUykvcHJvcmVzL3Byb3JlczQ0NDRfd2l0aF90cmFuc3BhcmVuY3kubW92IC1waXhfZm10IHl1djQ0NHAxMGxlCitmYXRlLXByb3Jlcy1ncmF5OiAgICAgIENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWM6YSBhYWNfZml4ZWQgLWkgJChUQVJHRVRfU0FNUExFUykvcHJvcmVzL2dyYXkubW92IC1waXhfZm10IHl1djQyMnAxMGxlCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL3F0Lm1hayBiL3Rlc3RzL2ZhdGUvcXQubWFrCmluZGV4IDY3MDUyM2UuLmMwNTQxMjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvcXQubWFrCisrKyBiL3Rlc3RzL2ZhdGUvcXQubWFrCkBAIC00OSw4ICs0OSwxOCBAQAogRkFURV9RVC0kKGNhbGwgREVNREVDLCBNT1YsIFNWUTEpICs9IGZhdGUtc3ZxMS1oZWFkZXJzd2FwCiBmYXRlLXN2cTEtaGVhZGVyc3dhcDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvc3ZxMS9jdF9lbmRpbmdfY3V0Lm1vdiAtZnJhbWVzIDQKIAotRkFURV9RVC0kKGNhbGwgQUxMWUVTLCBNT1ZfREVNVVhFUiBTVlEzX0RFQ09ERVIgWkxJQikgKz0gZmF0ZS1zdnEzCi1mYXRlLXN2cTM6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3N2cTMvVmVydGljYWw0MDBrYml0LnNvcmVuc29uMy5tb3YgLXQgNiAtYW4KK0ZBVEVfU1ZRMyArPSBmYXRlLXN2cTMtMQorZmF0ZS1zdnEzLTE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3N2cTMvVmVydGljYWw0MDBrYml0LnNvcmVuc29uMy5tb3YgLXQgNiAtYW4KKworI0ZBVEVfU1ZRMyArPSBmYXRlLXN2cTMtMgorI0ZJWE1FOiBmaXJzdCBmcmFtZSBjaGFuZ2VzIGRlcGVuZGluZyBvbiAtLWVuYWJsZS1tZW1vcnktcG9pc29uaW5nIGJlaW5nIHVzZWQgdG8gY29uZmlndXJlIG9yIG5vdAorZmF0ZS1zdnEzLTI6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlnbm9yZV9lZGl0bGlzdCAxIC1pICQoVEFSR0VUX1NBTVBMRVMpL3N2cTMvc3ZxM19kZWNvZGluZ19yZWdyZXNzaW9uLm1vdiAtYW4KKworRkFURV9TVlEzICs9IGZhdGUtc3ZxMy13YXRlcm1hcmsKK2ZhdGUtc3ZxMy13YXRlcm1hcms6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWkgJChUQVJHRVRfU0FNUExFUykvc3ZxMy9zdnEzX3dhdGVybWFyay5tb3YKKworRkFURV9RVC0kKGNhbGwgQUxMWUVTLCBNT1ZfREVNVVhFUiBTVlEzX0RFQ09ERVIgWkxJQikgKz0gJChGQVRFX1NWUTMpCitmYXRlLXN2cTM6ICQoRkFURV9TVlEzKQogCiBGQVRFX1FUICs9ICQoRkFURV9RVC15ZXMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvcmVhbC5tYWsgYi90ZXN0cy9mYXRlL3JlYWwubWFrCmluZGV4IGMxMjNlNDQuLmRkNWY5YzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvcmVhbC5tYWsKKysrIGIvdGVzdHMvZmF0ZS9yZWFsLm1hawpAQCAtMjAsNiArMjAsOSBAQAogZmF0ZS1yYS1jb29rOiBDTVAgPSBvbmVvZmYKIGZhdGUtcmEtY29vazogUkVGID0gJChTQU1QTEVTKS9yZWFsL3JhX2Nvb2sucGNtCiAKK0ZBVEVfUkVBTE1FRElBX1ZJREVPLSQoY2FsbCBERU1ERUMsIFJNLCBSVjIwKSArPSBmYXRlLXJ2MjAtMTIzOQorZmF0ZS1ydjIwLTEyMzk6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1sb3dyZXMgMSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9yZWFsL0cyX3dpdGhfU1ZUXzMyMF8yNDAucm0KKwogRkFURV9SRUFMTUVESUFfVklERU8tJChjYWxsIERFTURFQywgUk0sIFJWMzApICs9IGZhdGUtcnYzMAogZmF0ZS1ydjMwOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9yZWFsL3J2MzAucm0gLWFuCiAKQEAgLTM5LDcgKzQyLDcgQEAKIGZhdGUtc2lwci04azU6IFJFRiA9ICQoU0FNUExFUykvc2lwci9zaXByXzhrNS5wY20KIAogRkFURV9TSVBSICs9IGZhdGUtc2lwci0xNmsKLWZhdGUtc2lwci0xNms6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9zaXByL3NpcHJfMTZrLnJtIC1hZnJhbWVzIDMyNTAKK2ZhdGUtc2lwci0xNms6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9zaXByL3NpcHJfMTZrLnJtIC1mcmFtZXM6YSAzMjUwCiBmYXRlLXNpcHItMTZrOiBSRUYgPSAkKFNBTVBMRVMpL3NpcHIvc2lwcl8xNmsucGNtCiBmYXRlLXNpcHItMTZrOiBTSVpFX1RPTEVSQU5DRSA9IDQwMDAwCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvc2NyZWVuLm1hayBiL3Rlc3RzL2ZhdGUvc2NyZWVuLm1hawppbmRleCA2MzVlNWM0Li42OGI0ZjZmIDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL3NjcmVlbi5tYWsKKysrIGIvdGVzdHMvZmF0ZS9zY3JlZW4ubWFrCkBAIC0zLDExICszLDIwIEBACiBmYXRlLWNzY2Q6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL0NTQ0Qvc2FtcGxlX3ZpZGVvLmF2aSAtYW4gLXBpeF9mbXQgcmdiMjQKIAogRkFURV9TQ1JFRU4tJChjYWxsIERFTURFQywgQVZJLCBEWFRPUlkpICs9IGZhdGUtZHh0b3J5Ci1mYXRlLWR4dG9yeTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZHh0b3J5L2R4dG9yeV9taWMuYXZpCitmYXRlLWR4dG9yeTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZHh0b3J5L2R4dG9yeV9taWMuYXZpIC1hbgogCiBGQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIEFWSSwgRklDKSArPSBmYXRlLWZpYy1hdmkKIGZhdGUtZmljLWF2aTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZmljL2ZpYy1wYXJ0aWFsLTJNQi5hdmkgLWFuCiAKK0ZBVEVfRk1WQyArPSBmYXRlLWZtdmMtdHlwZTEKK2ZhdGUtZm12Yy10eXBlMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZm12Yy82LW1ldGh5bC01LWhlcHRlbi0yLW9uZS1DQy1kYl9zbWFsbC5hdmkKKworRkFURV9GTVZDICs9IGZhdGUtZm12Yy10eXBlMgorZmF0ZS1mbXZjLXR5cGUyOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9mbXZjL2ZtdmNWaXJ0dWFsRHViX3NtYWxsLmF2aQorCitGQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIEFWSSwgRk1WQykgKz0gJChGQVRFX0ZNVkMpCitmYXRlLWZtdmM6ICQoRkFURV9GTVZDKQorCiBGQVRFX0ZSQVBTICs9IGZhdGUtZnJhcHMtdjAKIGZhdGUtZnJhcHMtdjA6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZyYXBzL0dyaWZmaW5fUmFnZG9sbDAxLXBhcnRpYWwuYXZpCiAKQEAgLTQxLDExICs1MCwzNSBAQAogRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBBU0YsIEcyTSkgKz0gJChGQVRFX0cyTSkKIGZhdGUtZzJtOiAkKEZBVEVfRzJNKQogCi1GQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIEFWSSwgUlNDQykgKz0gZmF0ZS1yc2NjCi1mYXRlLXJzY2M6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3JzY2MvcGlwLmF2aSAtYW4KK0ZBVEVfUlNDQyArPSBmYXRlLWlzY2MKK2ZhdGUtaXNjYzogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvcnNjYy9waXAuYXZpIC1hbgogCi1GQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIEFWSSwgU0NSRUVOUFJFU1NPKSArPSBmYXRlLXNjcmVlbnByZXNzbwotZmF0ZS1zY3JlZW5wcmVzc286IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3NwdjEvYnVubnkuYXZpCitGQVRFX1JTQ0MgKz0gZmF0ZS1yc2NjLThiaXQKK2ZhdGUtcnNjYy04Yml0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9yc2NjLzhicHAuYXZpIC1hbiAtcGl4X2ZtdCByZ2IyNAorCitGQVRFX1JTQ0MgKz0gZmF0ZS1yc2NjLTE2Yml0CitmYXRlLXJzY2MtMTZiaXQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3JzY2MvMTZicHBfNTU1LmF2aSAtYW4KKworRkFURV9SU0NDICs9IGZhdGUtcnNjYy0yNGJpdAorZmF0ZS1yc2NjLTI0Yml0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9yc2NjLzI0YnBwLmF2aSAtYW4KKworRkFURV9SU0NDICs9IGZhdGUtcnNjYy0zMmJpdAorZmF0ZS1yc2NjLTMyYml0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9yc2NjLzMyYnBwLmF2aSAtYW4KKworRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBBVkksIFJTQ0MpICs9ICQoRkFURV9SU0NDKQorZmF0ZS1yc2NjOiAkKEZBVEVfUlNDQykKKworRkFURV9TQ1JFRU5QUkVTU08gKz0gZmF0ZS1zY3JlZW5wcmVzc28tMTZiaXQKK2ZhdGUtc2NyZWVucHJlc3NvLTE2Yml0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9zcHYxLzE2YnBwXzU1NS5hdmkgLWFuCisKK0ZBVEVfU0NSRUVOUFJFU1NPICs9IGZhdGUtc2NyZWVucHJlc3NvLTI0Yml0CitmYXRlLXNjcmVlbnByZXNzby0yNGJpdDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvc3B2MS9idW5ueS5hdmkgLWFuCisKK0ZBVEVfU0NSRUVOUFJFU1NPICs9IGZhdGUtc2NyZWVucHJlc3NvLTMyYml0CitmYXRlLXNjcmVlbnByZXNzby0zMmJpdDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvc3B2MS8zMmJwcC5hdmkgLWFuCisKK0ZBVEVfU0FNUExFU19BVkNPTlYtJChjYWxsIERFTURFQywgQVZJLCBTQ1JFRU5QUkVTU08pICs9ICQoRkFURV9TQ1JFRU5QUkVTU08pCitmYXRlLXNjcmVlbnByZXNzbzogJChGQVRFX1NDUkVFTlBSRVNTTykKIAogRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBBU0YsIFREU0MpICs9IGZhdGUtdGRzYwogZmF0ZS10ZHNjOiBDTUQgPSBmcmFtZWNyYyAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvdGRzYy90ZHNjLmFzZiAtYW4gLXBpeF9mbXQgYmdyMjQKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvc2Vlay5tYWsgYi90ZXN0cy9mYXRlL3NlZWsubWFrCmluZGV4IGEyMjllNzIuLjZhOWY4NDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvc2Vlay5tYWsKKysrIGIvdGVzdHMvZmF0ZS9zZWVrLm1hawpAQCAtNjQsNiArNjQsNyBAQAogRkFURV9TRUVLX1ZTWU5USF9MRU5BLSQoY2FsbCBFTkNERUMsIEFTVjIsICAgICAgICAgIEFWSSkgICAgICs9IGFzdjIKIEZBVEVfU0VFS19WU1lOVEhfTEVOQS0kKGNhbGwgRU5DREVDLCBETlhIRCwgICAgICAgICBETlhIRCkgICArPSBkbnhoZC03MjBwCiBGQVRFX1NFRUtfVlNZTlRIX0xFTkEtJChjYWxsIEVOQ0RFQywgRE5YSEQsICAgICAgICAgRE5YSEQpICAgKz0gZG54aGQtNzIwcC1yZAorRkFURV9TRUVLX1ZTWU5USF9MRU5BLSQoY2FsbCBFTkNERUMsIEROWEhELCAgICAgICAgIEROWEhEKSAgICs9IGRueGhkLTRrLWhyLWxiCiBGQVRFX1NFRUtfVlNZTlRIX0xFTkEtJChjYWxsIEVOQ0RFQywgRE5YSEQsICAgICAgICAgTU9WKSAgICAgKz0gZG54aGQtMTA4MGkKIEZBVEVfU0VFS19WU1lOVEhfTEVOQS0kKGNhbGwgRU5DREVDLCBEVlZJREVPLCAgICAgICBEVikgICAgICArPSBkdgogRkFURV9TRUVLX1ZTWU5USF9MRU5BLSQoY2FsbCBFTkNERUMsIERWVklERU8sICAgICAgIERWKSAgICAgICs9IGR2LTQxMQpAQCAtNzksMTYgKzgwLDE2IEBACiBGQVRFX1NFRUtfVlNZTlRIX0xFTkEtJChjYWxsIEVOQ0RFQywgTEpQRUcgTUpQRUcsICAgQVZJKSAgICAgKz0gbGpwZWcKIEZBVEVfU0VFS19WU1lOVEhfTEVOQS0kKGNhbGwgRU5DREVDLCBNSlBFRywgICAgICAgICBBVkkpICAgICArPSBtanBlZwogCi1GQVRFX1NFRUtfVlNZTlRIX0xFTkEtJChjYWxsIEVOQ0RFQywgTVBFRzFWSURFTywgTVBFRzFWSURFTyBNUEVHVklERU8pICs9ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMSAgICAgICAgICAgICAgICAgICAgICBcCitGQVRFX1NFRUtfVlNZTlRIX0xFTkEtJChjYWxsIEVOQ0RFQywgTVBFRzFWSURFTywgTVBFRzFWSURFTyBNUEVHVklERU8pICs9ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMSAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWcxYgogCi1GQVRFX1NFRUtfVlNZTlRIX0xFTkEtJChjYWxsIEVOQ0RFQywgTVBFRzJWSURFTywgTVBFRzJWSURFTyBNUEVHVklERU8pICs9ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMi00MjIgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzItaWRjdC1pbnQgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWcyLWlsYWNlICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMi1pdmxjLXFwcmQgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzItdGhyZWFkICAgICAgICAgICAgICAgXAorRkFURV9TRUVLX1ZTWU5USF9MRU5BLSQoY2FsbCBFTkNERUMsIE1QRUcyVklERU8sIE1QRUcyVklERU8gTVBFR1ZJREVPKSArPSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzItNDIyICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMi1pZGN0LWludCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWcyLWlsYWNlICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlZzItaXZsYy1xcHJkICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGVnMi10aHJlYWQgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZWcyLXRocmVhZC1pdmxjCiAKIEZBVEVfU0VFS19WU1lOVEhfTEVOQS0kKGNhbGwgRU5DREVDLCBNUEVHNCwgICAgICAgICBNUDQgTU9WKSArPSBtcGVnNApAQCAtMTExLDYgKzExMiw3IEBACiBmYXRlLXNlZWstdnN5bnRoX2xlbmEtZG54aGQtMTA4MGk6ICAgICAgIFNSQyA9IGZhdGUvdnN5bnRoX2xlbmEtZG54aGQtMTA4MGkubW92CiBmYXRlLXNlZWstdnN5bnRoX2xlbmEtZG54aGQtNzIwcDogICAgICAgIFNSQyA9IGZhdGUvdnN5bnRoX2xlbmEtZG54aGQtNzIwcC5kbnhoZAogZmF0ZS1zZWVrLXZzeW50aF9sZW5hLWRueGhkLTcyMHAtcmQ6ICAgICBTUkMgPSBmYXRlL3ZzeW50aF9sZW5hLWRueGhkLTcyMHAuZG54aGQKK2ZhdGUtc2Vlay12c3ludGhfbGVuYS1kbnhoZC00ay1oci1sYjogICAgU1JDID0gZmF0ZS92c3ludGhfbGVuYS1kbnhoZC00ay1oci1sYi5kbnhoZAogZmF0ZS1zZWVrLXZzeW50aF9sZW5hLWR2OiAgICAgICAgICAgICAgICBTUkMgPSBmYXRlL3ZzeW50aF9sZW5hLWR2LmR2CiBmYXRlLXNlZWstdnN5bnRoX2xlbmEtZHYtNDExOiAgICAgICAgICAgIFNSQyA9IGZhdGUvdnN5bnRoX2xlbmEtZHYtNDExLmR2CiBmYXRlLXNlZWstdnN5bnRoX2xlbmEtZHYtNTA6ICAgICAgICAgICAgIFNSQyA9IGZhdGUvdnN5bnRoX2xlbmEtZHYtNTAuZHYKQEAgLTE2Niw3ICsxNjgsNiBAQAogRkFURV9TRUVLX0xBVkYtJChjYWxsIEVOQ0RFQzIsIE1QRUc0LCAgICAgIE1QMiwgICAgICAgQVZJKSAgICAgICAgICs9IGF2aQogRkFURV9TRUVLX0xBVkYtJChjYWxsIEVOQ0RFQywgIEJNUCwgICAgICAgICAgICAgICAgICAgSU1BR0UyKSAgICAgICs9IGJtcAogRkFURV9TRUVLX0xBVkYtJChjYWxsIEVOQ0RFQzIsIERWVklERU8sICAgIFBDTV9TMTZMRSwgQVZJKSAgICAgICAgICs9IGR2X2ZtdAotRkFURV9TRUVLX0xBVkYtJChjYWxsIEVOQ0RFQzIsIE1QRUcxVklERU8sIE1QMiwgICAgICAgRkZNKSAgICAgICAgICs9IGZmbQogRkFURV9TRUVLX0xBVkYtJChjYWxsIEVOQ0RFQywgIEZMViwgICAgICAgICAgICAgICAgICAgRkxWKSAgICAgICAgICs9IGZsdl9mbXQKIEZBVEVfU0VFS19MQVZGLSQoY2FsbCBFTkNERUMsICBHSUYsICAgICAgICAgICAgICAgICAgIElNQUdFMikgICAgICArPSBnaWYKIEZBVEVfU0VFS19MQVZGLSQoY2FsbCBFTkNERUMyLCBNUEVHMlZJREVPLCBQQ01fUzE2TEUsIEdYRikgICAgICAgICArPSBneGYKQEAgLTE3OCw2ICsxNzksOCBAQAogRkFURV9TRUVLX0xBVkYtJChjYWxsIEVOQ0RFQywgIFBDTV9NVUxBVywgICAgICAgICAgICAgUENNX01VTEFXKSAgICs9IG11bGF3CiBGQVRFX1NFRUtfTEFWRi0kKGNhbGwgRU5DREVDMiwgTVBFRzJWSURFTywgUENNX1MxNkxFLCBNWEYpICAgICAgICAgKz0gbXhmCiBGQVRFX1NFRUtfTEFWRi0kKGNhbGwgRU5DREVDMiwgTVBFRzJWSURFTywgUENNX1MxNkxFLCBNWEZfRDEwIE1YRikgKz0gbXhmX2QxMAorRkFURV9TRUVLX0xBVkYtJChjYWxsIEVOQ0RFQzIsIERWVklERU8sICAgIFBDTV9TMTZMRSwgTVhGKSAgICAgICAgICs9IG14Zl9kdjI1CitGQVRFX1NFRUtfTEFWRi0kKGNhbGwgRU5DREVDMiwgRFZWSURFTywgICAgUENNX1MxNkxFLCBNWEYpICAgICAgICAgKz0gbXhmX2R2Y3BybzUwCiBGQVRFX1NFRUtfTEFWRi0kKGNhbGwgRU5DREVDMiwgRE5YSEQsICAgICAgUENNX1MxNkxFLCBNWEZfT1BBVE9NIE1YRikgKz0gbXhmX29wYXRvbQogRkFURV9TRUVLX0xBVkYtJChjYWxsIEVOQ0RFQzIsIEROWEhELCAgICAgIFBDTV9TMTZMRSwgTVhGX09QQVRPTSBNWEYpICs9IG14Zl9vcGF0b21fYXVkaW8KIEZBVEVfU0VFS19MQVZGLSQoY2FsbCBFTkNERUMyLCBNUEVHNCwgICAgICBNUDIsICAgICAgIE5VVCkgICAgICAgICArPSBudXQKQEAgLTIwNiw3ICsyMDksNiBAQAogZmF0ZS1zZWVrLWxhdmYtYXZpOiAgICAgIFNSQyA9IGxhdmYvbGF2Zi5hdmkKIGZhdGUtc2Vlay1sYXZmLWJtcDogICAgICBTUkMgPSBpbWFnZXMvYm1wLyUwMmQuYm1wCiBmYXRlLXNlZWstbGF2Zi1kdl9mbXQ6ICAgU1JDID0gbGF2Zi9sYXZmLmR2Ci1mYXRlLXNlZWstbGF2Zi1mZm06ICAgICAgU1JDID0gbGF2Zi9sYXZmLmZmbQogZmF0ZS1zZWVrLWxhdmYtZmx2X2ZtdDogIFNSQyA9IGxhdmYvbGF2Zi5mbHYKIGZhdGUtc2Vlay1sYXZmLWdpZjogICAgICBTUkMgPSBsYXZmL2xhdmYuZ2lmCiBmYXRlLXNlZWstbGF2Zi1neGY6ICAgICAgU1JDID0gbGF2Zi9sYXZmLmd4ZgpAQCAtMjE4LDYgKzIyMCw4IEBACiBmYXRlLXNlZWstbGF2Zi1tdWxhdzogICAgU1JDID0gbGF2Zi9sYXZmLnVsCiBmYXRlLXNlZWstbGF2Zi1teGY6ICAgICAgU1JDID0gbGF2Zi9sYXZmLm14ZgogZmF0ZS1zZWVrLWxhdmYtbXhmX2QxMDogIFNSQyA9IGxhdmYvbGF2Zi5teGZfZDEwCitmYXRlLXNlZWstbGF2Zi1teGZfZHYyNTogU1JDID0gbGF2Zi9sYXZmLm14Zl9kdjI1CitmYXRlLXNlZWstbGF2Zi1teGZfZHZjcHJvNTA6IFNSQyA9IGxhdmYvbGF2Zi5teGZfZHZjcHJvNTAKIGZhdGUtc2Vlay1sYXZmLW14Zl9vcGF0b206IFNSQyA9IGxhdmYvbGF2Zi5teGZfb3BhdG9tCiBmYXRlLXNlZWstbGF2Zi1teGZfb3BhdG9tX2F1ZGlvOiBTUkMgPSBsYXZmL2xhdmYubXhmX29wYXRvbV9hdWRpbwogZmF0ZS1zZWVrLWxhdmYtbnV0OiAgICAgIFNSQyA9IGxhdmYvbGF2Zi5udXQKQEAgLTI0NCwxMiArMjQ4LDI2IEBACiAjIGV4dHJhIGZpbGVzCiAKIEZBVEVfU0VFS19FWFRSQS0kKENPTkZJR19NUDNfREVNVVhFUikgICArPSBmYXRlLXNlZWstZXh0cmEtbXAzCi1mYXRlLXNlZWstZXh0cmEtbXAzOiAgQ01EID0gcnVuIGxpYmF2Zm9ybWF0L3NlZWstdGVzdCQoRVhFU1VGKSAkKFRBUkdFVF9TQU1QTEVTKS9nYXBsZXNzL2dhcGxlc3MubXAzIC1mYXN0c2VlayAxCitGQVRFX1NFRUtfRVhUUkEtJChjYWxsIEFMTFlFUywgQ0FDSEVfUFJPVE9DT0wgUElQRV9QUk9UT0NPTCBNUDNfREVNVVhFUikgKz0gZmF0ZS1zZWVrLWNhY2hlLXBpcGUKK0ZBVEVfU0VFS19FWFRSQS0kKENPTkZJR19NQVRST1NLQV9ERU1VWEVSKSArPSBmYXRlLXNlZWstbWt2LWNvZGVjLWRlbGF5CitGQVRFX1NFRUtfRVhUUkEtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtc2Vlay1leHRyYS1tcDQKK0ZBVEVfU0VFS19FWFRSQS0kKENPTkZJR19NT1ZfREVNVVhFUikgKz0gZmF0ZS1zZWVrLWVtcHR5LWVkaXQtbXA0CitGQVRFX1NFRUtfRVhUUkEtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtc2Vlay10ZXN0LWlpYmJpYmItbXA0CitGQVRFX1NFRUtfRVhUUkEtJChDT05GSUdfTU9WX0RFTVVYRVIpICs9IGZhdGUtc2Vlay10ZXN0LWlpYmJpYmItbmVnLWN0dHMtbXA0CisKK2ZhdGUtc2Vlay1leHRyYS1tcDM6ICBDTUQgPSBydW4gbGliYXZmb3JtYXQvdGVzdHMvc2VlayQoRVhFU1VGKSAkKFRBUkdFVF9TQU1QTEVTKS9nYXBsZXNzL2dhcGxlc3MubXAzIC1mYXN0c2VlayAxCitmYXRlLXNlZWstZXh0cmEtbXA0OiAgQ01EID0gcnVuIGxpYmF2Zm9ybWF0L3Rlc3RzL3NlZWskKEVYRVNVRikgJChUQVJHRVRfU0FNUExFUykvbW92L2J1Y2s0ODBwMzBfbmEubXA0IC1kdXJhdGlvbiAxODAgLWZyYW1lcyA0CitmYXRlLXNlZWstZW1wdHktZWRpdC1tcDQ6ICBDTUQgPSBydW4gbGliYXZmb3JtYXQvdGVzdHMvc2VlayQoRVhFU1VGKSAkKFRBUkdFVF9TQU1QTEVTKS9tb3YvZW1wdHlfZWRpdF81cy5tcDQgLWR1cmF0aW9uIDE1IC1mcmFtZXMgNAorZmF0ZS1zZWVrLXRlc3QtaWliYmliYi1tcDQ6ICBDTUQgPSBydW4gbGliYXZmb3JtYXQvdGVzdHMvc2VlayQoRVhFU1VGKSAkKFRBUkdFVF9TQU1QTEVTKS9tb3YvdGVzdF9paWJiaWJiLm1wNCAtZHVyYXRpb24gMTMgLWZyYW1lcyA0CitmYXRlLXNlZWstdGVzdC1paWJiaWJiLW5lZy1jdHRzLW1wNDogIENNRCA9IHJ1biBsaWJhdmZvcm1hdC90ZXN0cy9zZWVrJChFWEVTVUYpICQoVEFSR0VUX1NBTVBMRVMpL21vdi90ZXN0X2lpYmJpYmJfbmVnX2N0dHMubXA0IC1kdXJhdGlvbiAxMyAtZnJhbWVzIDQKK2ZhdGUtc2Vlay1jYWNoZS1waXBlOiBDTUQgPSBjYXQgJChUQVJHRVRfU0FNUExFUykvZ2FwbGVzcy9nYXBsZXNzLm1wMyB8IHJ1biBsaWJhdmZvcm1hdC90ZXN0cy9zZWVrJChFWEVTVUYpIGNhY2hlOnBpcGU6MCAtcmVhZF9haGVhZF9saW1pdCAtMQorZmF0ZS1zZWVrLW1rdi1jb2RlYy1kZWxheTogICBDTUQgPSBydW4gbGliYXZmb3JtYXQvdGVzdHMvc2VlayQoRVhFU1VGKSAkKFRBUkdFVF9TQU1QTEVTKS9ta3YvY29kZWNfZGVsYXlfb3B1cy5ta3YKKwogRkFURV9TRUVLX0VYVFJBICs9ICQoRkFURV9TRUVLX0VYVFJBLXllcykKIAogCi0kKEZBVEVfU0VFSykgJChGQVRFX1NBTVBMRVNfU0VFSykgJChGQVRFX1NFRUtfRVhUUkEpOiBsaWJhdmZvcm1hdC9zZWVrLXRlc3QkKEVYRVNVRikKLSQoRkFURV9TRUVLKSAkKEZBVEVfU0FNUExFU19TRUVLKTogQ01EID0gcnVuIGxpYmF2Zm9ybWF0L3NlZWstdGVzdCQoRVhFU1VGKSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhLyQoU1JDKQorJChGQVRFX1NFRUspICQoRkFURV9TQU1QTEVTX1NFRUspICQoRkFURV9TRUVLX0VYVFJBKTogbGliYXZmb3JtYXQvdGVzdHMvc2VlayQoRVhFU1VGKQorJChGQVRFX1NFRUspICQoRkFURV9TQU1QTEVTX1NFRUspOiBDTUQgPSBydW4gbGliYXZmb3JtYXQvdGVzdHMvc2VlayQoRVhFU1VGKSAkKFRBUkdFVF9QQVRIKS90ZXN0cy9kYXRhLyQoU1JDKQogJChGQVRFX1NFRUspICQoRkFURV9TQU1QTEVTX1NFRUspOiBmYXRlLXNlZWstJTogZmF0ZS0lCiBmYXRlLXNlZWstJTogUkVGID0gJChTUkNfUEFUSCkvdGVzdHMvcmVmL3NlZWsvJChAOmZhdGUtc2Vlay0lPSUpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvc291cmNlLWNoZWNrLnNoIGIvdGVzdHMvZmF0ZS9zb3VyY2UtY2hlY2suc2gKaW5kZXggYWMyODc4ZC4uNWYzZmQ4OSAxMDA3NTUKLS0tIGEvdGVzdHMvZmF0ZS9zb3VyY2UtY2hlY2suc2gKKysrIGIvdGVzdHMvZmF0ZS9zb3VyY2UtY2hlY2suc2gKQEAgLTI3LDcgKzI3LDIxIEBACiAgICAgICAgIC1lICdzL192YWZfL18vJyBcCiAgICAgfCB0ciBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiBBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmAiCiAKLSAgICBncmVwIC1MICJeI2RlZmluZSAkbWFjcm8kIiAkZgorICAgIGdpdCBncmVwIC1MICJeI2RlZmluZSAkbWFjcm8kIiAkZgogZG9uZQogCitlY2hvICJVc2Ugb2YgYXZfY2xpcCgpIHdoZXJlIGF2X2NsaXBfdWludHAyKCkgY291bGQgYmUgdXNlZDoiCitnaXQgZ3JlcCAtRSAnYXZfY2xpcCAqXCguKiwgKjAgKiwgKigzfDd8MTV8MzF8NjN8MTI3fDI1NXw1MTF8MTAyM3wyMDQ3fDQwOTV8ODE5MXwnXAorJzE2MzgzfDMyNzY3fDY1NTM1fDEzMTA3MXwyNjIxNDN8NTI0Mjg3fDEwNDg1NzV8MjA5NzE1MXw0MTk0MzAzfDgzODg2MDd8MTY3NzcyMTV8J1wKKyczMzU1NDQzMXw2NzEwODg2M3wxMzQyMTc3Mjd8MjY4NDM1NDU1fDUzNjg3MDkxMXwxMDczNzQxODIzKSAqXCknIHwgZ3JlcCAtdiBmYXRlL3NvdXJjZQorCitlY2hvICJVc2Ugb2YgYXZfY2xpcCgpIHdoZXJlIGF2X2NsaXBfaW50cDIoKSBjb3VsZCBiZSB1c2VkOiIKK2dpdCBncmVwIC1FICdhdl9jbGlwICpcKC4qLCAqKC0yICosICoxfC00ICosICozfC04ICosICo3fC0xNiAqLCAqMTV8LTMyICosICozMXwtNjQnXAorJyAqLCAqNjN8LTEyOCAqLCAqMTI3fC0yNTYgKiwgKjI1NXwtNTEyICosICo1MTF8LTEwMjQgKiwgKjEwMjN8LTIwNDggKiwgKjIwNDd8LTQwOTYnXAorJyAqLCAqNDA5NXwtODE5MiAqLCAqODE5MXwtMTYzODQgKiwgKjE2MzgzfC0zMjc2OCAqLCAqMzI3Njd8LTY1NTM2ICosICo2NTUzNXwtMTMxMDcyJ1wKKycgKiwgKjEzMTA3MXwtMjYyMTQ0ICosICoyNjIxNDN8LTUyNDI4OCAqLCAqNTI0Mjg3fC0xMDQ4NTc2ICosICoxMDQ4NTc1fC0yMDk3MTUyICosJ1wKKycgKjIwOTcxNTF8LTQxOTQzMDQgKiwgKjQxOTQzMDN8LTgzODg2MDggKiwgKjgzODg2MDd8LTE2Nzc3MjE2ICosICoxNjc3NzIxNXwtMzM1NTQ0MzInXAorJyAqLCAqMzM1NTQ0MzF8LTY3MTA4ODY0ICosICo2NzEwODg2M3wtMTM0MjE3NzI4ICosICoxMzQyMTc3Mjd8LTI2ODQzNTQ1NiAqLCAqJ1wKKycyNjg0MzU0NTV8LTUzNjg3MDkxMiAqLCAqNTM2ODcwOTExfC0xMDczNzQxODI0ICosICoxMDczNzQxODIzKSAqXCknfCBncmVwIC12IGZhdGUvc291cmNlCisKIGV4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9zcGVlZGhxLm1hayBiL3Rlc3RzL2ZhdGUvc3BlZWRocS5tYWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0MDViNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZhdGUvc3BlZWRocS5tYWsKQEAgLTAsMCArMSw4IEBACitGQVRFX1NQRUVESFEgPSBmYXRlLXNwZWVkaHEtNDIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgIGZhdGUtc3BlZWRocS00MjItc2luZ2xlZmllbGQKKworZmF0ZS1zcGVlZGhxLTQyMjogICAgICAgICAgICAgQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtZiByYXd2aWRlbyAtYzp2IHNwZWVkaHEgLXRhZzp2IFNIUTIgLXZpZGVvX3NpemUgMTEyeDY0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3NwZWVkaHEvcHJvZ3Jlc3NpdmUuc2hxMiAtcGl4X2ZtdCB5dXY0MjJwCitmYXRlLXNwZWVkaHEtNDIyLXNpbmdsZWZpZWxkOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1mIHJhd3ZpZGVvIC1jOnYgc3BlZWRocSAtdGFnOnYgU0hRMiAtdmlkZW9fc2l6ZSAxMTJ4MzIgLWkgJChUQVJHRVRfU0FNUExFUykvc3BlZWRocS9zaW5nbGVmaWVsZC5zaHEyIC1waXhfZm10IHl1djQyMnAKKworRkFURV9TQU1QTEVTX0ZGTVBFRy0kKGNhbGwgREVNREVDLCBSQVdWSURFTywgU1BFRURIUSkgKz0gJChGQVRFX1NQRUVESFEpCitmYXRlLXNwZWVkaHE6ICQoRkFURV9TUEVFREhRKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS9zdWJ0aXRsZXMubWFrIGIvdGVzdHMvZmF0ZS9zdWJ0aXRsZXMubWFrCmluZGV4IDhhYTAyNzkuLjAwNDI5MDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvc3VidGl0bGVzLm1haworKysgYi90ZXN0cy9mYXRlL3N1YnRpdGxlcy5tYWsKQEAgLTcsNiArNyw5IEBACiBGQVRFX1NVQlRJVExFU19BU1MtJChjYWxsIEFMTFlFUywgQVZERVZJQ0UgTEFWRklfSU5ERVYgQ0NBUFRJT05fREVDT0RFUiBNT1ZJRV9GSUxURVIgTVBFR1RTX0RFTVVYRVIpICs9IGZhdGUtc3ViLWNjLXJlYWx0aW1lCiBmYXRlLXN1Yi1jYy1yZWFsdGltZTogQ01EID0gZm10c3Rkb3V0IGFzcyAtcmVhbF90aW1lIDEgLWYgbGF2ZmkgLWkgIm1vdmllPSQoVEFSR0VUX1NBTVBMRVMpL3N1Yi9DbG9zZWRjYXB0aW9uX3JvbGx1cC5tMnZbb3V0MCtzdWJjY10iCiAKK0ZBVEVfU1VCVElUTEVTX0FTUy0kKGNhbGwgQUxMWUVTLCBBVkRFVklDRSBMQVZGSV9JTkRFViBDQ0FQVElPTl9ERUNPREVSIE1PVklFX0ZJTFRFUiBNUEVHVFNfREVNVVhFUikgKz0gZmF0ZS1zdWItY2Mtc2N0ZTIwCitmYXRlLXN1Yi1jYy1zY3RlMjA6IENNRCA9IGZtdHN0ZG91dCBhc3MgLWYgbGF2ZmkgLWkgIm1vdmllPSQoVEFSR0VUX1NBTVBMRVMpL3N1Yi9zY3RlMjAudHNbb3V0MCtzdWJjY10iCisKIEZBVEVfU1VCVElUTEVTX0FTUy0kKGNhbGwgREVNREVDLCBBU1MsIEFTUykgKz0gZmF0ZS1zdWItYXNzLXRvLWFzcy10cmFuc2NvZGUKIGZhdGUtc3ViLWFzcy10by1hc3MtdHJhbnNjb2RlOiBDTUQgPSBmbXRzdGRvdXQgYXNzIC1pICQoVEFSR0VUX1NBTVBMRVMpL3N1Yi8xZWRlZGNiZDdiLmFzcwogCkBAIC0xNCw3ICsxNyw3IEBACiBmYXRlLXN1Yi1zc2EtdG8tYXNzLXJlbXV4OiBDTUQgPSBmbXRzdGRvdXQgYXNzIC1pICQoVEFSR0VUX1NBTVBMRVMpL3N1Yi9hOS1taXNjLnNzYSAtYyBjb3B5CiAKIEZBVEVfU1VCVElUTEVTLSQoY2FsbCBBTExZRVMsIEFTU19ERU1VWEVSLCBNQVRST1NLQV9NVVhFUikgKz0gZmF0ZS1iaW5zdWItbWtzZW5jCi1mYXRlLWJpbnN1Yi1ta3NlbmM6IENNRCA9IG1kNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9zdWIvMWVkZWRjYmQ3Yi5hc3MgLWMgY29weSAtZiBtYXRyb3NrYSAtZmxhZ3MgK2JpdGV4YWN0IC1mZmxhZ3MgK2JpdGV4YWN0CitmYXRlLWJpbnN1Yi1ta3NlbmM6IENNRCA9IG1kNXBpcGUgLWkgJChUQVJHRVRfU0FNUExFUykvc3ViLzFlZGVkY2JkN2IuYXNzIC1jIGNvcHkgLWYgbWF0cm9za2EgLWZsYWdzICtiaXRleGFjdCAtZmZsYWdzICtiaXRleGFjdAogCiBGQVRFX1NVQlRJVExFU19BU1MtJChjYWxsIERFTURFQywgSkFDT1NVQiwgSkFDT1NVQikgKz0gZmF0ZS1zdWItamFjb3N1YgogZmF0ZS1zdWItamFjb3N1YjogQ01EID0gZm10c3Rkb3V0IGFzcyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9zdWIvSkFDT3N1Yl9jYXBhYmlsaXR5X3Rlc3Rlci5qc3MKQEAgLTU1LDYgKzU4LDkgQEAKIEZBVEVfU1VCVElUTEVTX0FTUy0kKGNhbGwgREVNREVDLCBTUlQsIFNVQlJJUCkgKz0gZmF0ZS1zdWItc3J0CiBmYXRlLXN1Yi1zcnQ6IENNRCA9IGZtdHN0ZG91dCBhc3MgLWkgJChUQVJHRVRfU0FNUExFUykvc3ViL1N1YlJpcF9jYXBhYmlsaXR5X3Rlc3Rlci5zcnQKIAorRkFURV9TVUJUSVRMRVNfQVNTLSQoY2FsbCBERU1ERUMsIFNSVCwgU1VCUklQKSArPSBmYXRlLXN1Yi1zcnQtYmFkc3ludGF4CitmYXRlLXN1Yi1zcnQtYmFkc3ludGF4OiBDTUQgPSBmbXRzdGRvdXQgYXNzIC1pICQoVEFSR0VUX1NBTVBMRVMpL3N1Yi9iYWRzeW50YXguc3J0CisKIEZBVEVfU1VCVElUTEVTLSQoY2FsbCBBTExZRVMsIFNSVF9ERU1VWEVSIFNVQlJJUF9ERUNPREVSIFNSVF9NVVhFUikgKz0gZmF0ZS1zdWItc3J0LXJybi1yZW11eAogZmF0ZS1zdWItc3J0LXJybi1yZW11eDogQ01EID0gZm10c3Rkb3V0IHNydCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9zdWIvdGlja2V0NTAzMi1ycm4uc3J0IC1jOnMgY29weQogCkBAIC05NCw2ICsxMDAsOSBAQAogRkFURV9TVUJUSVRMRVNfQVNTLSQoY2FsbCBBTExZRVMsIE1JQ1JPRFZEX0RFTVVYRVIgTUlDUk9EVkRfREVDT0RFUiBJQ09OVikgKz0gZmF0ZS1zdWItY2hhcmVuYwogZmF0ZS1zdWItY2hhcmVuYzogQ01EID0gZm10c3Rkb3V0IGFzcyAtc3ViX2NoYXJlbmMgY3AxMjUxIC1pICQoVEFSR0VUX1NBTVBMRVMpL3N1Yi9jcDEyNTEtc3VidGl0bGVzLnN1YgogCitGQVRFX1NVQlRJVExFUy0kKGNhbGwgREVNREVDLCBTQ0MsIENDQVBUSU9OKSArPSBmYXRlLXN1Yi1zY2MKK2ZhdGUtc3ViLXNjYzogQ01EID0gZm10c3Rkb3V0IGFzcyAtc3MgNTcgLWkgJChUQVJHRVRfU0FNUExFUykvc3ViL3dpdGNoLnNjYworCiBGQVRFX1NVQlRJVExFUy0kKGNhbGwgRU5DTVVYLCBBU1MsIEFTUykgKz0gJChGQVRFX1NVQlRJVExFU19BU1MteWVzKQogRkFURV9TVUJUSVRMRVMgKz0gJChGQVRFX1NVQlRJVExFUy15ZXMpCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvdXR2aWRlby5tYWsgYi90ZXN0cy9mYXRlL3V0dmlkZW8ubWFrCmluZGV4IDFhY2VmOWEuLjIzMjI0NzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL2ZhdGUvdXR2aWRlby5tYWsKKysrIGIvdGVzdHMvZmF0ZS91dHZpZGVvLm1hawpAQCAtMTAsNiArMTAsMTUgQEAKIEZBVEVfVVRWSURFTyArPSBmYXRlLXV0dmlkZW9fcmdiYV9tZWRpYW4KIGZhdGUtdXR2aWRlb19yZ2JhX21lZGlhbjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvdXR2aWRlby91dHZpZGVvX3JnYmFfbWVkaWFuLmF2aQogCitGQVRFX1VUVklERU8gKz0gZmF0ZS11dHZpZGVvX3JnYl9pbnRfbWVkaWFuCitmYXRlLXV0dmlkZW9fcmdiX2ludF9tZWRpYW46IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb19yZ2JfNjR4NDhfaW50X21lZGlhbi5hdmkKKworRkFURV9VVFZJREVPICs9IGZhdGUtdXR2aWRlb19yZ2JhX2dyYWRpZW50CitmYXRlLXV0dmlkZW9fcmdiYV9ncmFkaWVudDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvdXR2aWRlby91dHZpZGVvX3JnYmFfZ3JhZGllbnQuYXZpCisKK0ZBVEVfVVRWSURFTyArPSBmYXRlLXV0dmlkZW9fcmdiX2ludF9ncmFkaWVudAorZmF0ZS11dHZpZGVvX3JnYl9pbnRfZ3JhZGllbnQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb19yZ2JfNjR4NDhfaW50X2dyYWRpZW50LmF2aQorCiBGQVRFX1VUVklERU8gKz0gZmF0ZS11dHZpZGVvX3JnYmFfc2luZ2xlX3N5bWJvbAogZmF0ZS11dHZpZGVvX3JnYmFfc2luZ2xlX3N5bWJvbDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvdXR2aWRlby91dHZpZGVvX3JnYmFfc2luZ2xlX3N5bWJvbC5hdmkKIApAQCAtMTksMzQgKzI4LDY0IEBACiBGQVRFX1VUVklERU8gKz0gZmF0ZS11dHZpZGVvX3l1djQyMF9tZWRpYW4KIGZhdGUtdXR2aWRlb195dXY0MjBfbWVkaWFuOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS91dHZpZGVvL3V0dmlkZW9feXV2NDIwX21lZGlhbi5hdmkKIAorRkFURV9VVFZJREVPICs9IGZhdGUtdXR2aWRlb195dXY0MjBfaW50X21lZGlhbgorZmF0ZS11dHZpZGVvX3l1djQyMF9pbnRfbWVkaWFuOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS91dHZpZGVvL3V0dmlkZW9feXV2NDIwXzcwOV82NHg0OF9pbnRfbWVkaWFuLmF2aQorCitGQVRFX1VUVklERU8gKz0gZmF0ZS11dHZpZGVvX3l1djQyMF9ncmFkaWVudAorZmF0ZS11dHZpZGVvX3l1djQyMF9ncmFkaWVudDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvdXR2aWRlby91dHZpZGVvX3l1djQyMF83MDlfNjR4NDhfZ3JhZGllbnQuYXZpCisKK0ZBVEVfVVRWSURFTyArPSBmYXRlLXV0dmlkZW9feXV2NDIwX2ludF9ncmFkaWVudAorZmF0ZS11dHZpZGVvX3l1djQyMF9pbnRfZ3JhZGllbnQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb195dXY0MjBfNzA5XzY0eDQ4X2ludF9ncmFkaWVudC5hdmkKKwogRkFURV9VVFZJREVPICs9IGZhdGUtdXR2aWRlb195dXY0MjJfbGVmdAogZmF0ZS11dHZpZGVvX3l1djQyMl9sZWZ0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS91dHZpZGVvL3V0dmlkZW9feXV2NDIyX2xlZnQuYXZpCiAKIEZBVEVfVVRWSURFTyArPSBmYXRlLXV0dmlkZW9feXV2NDIyX21lZGlhbgogZmF0ZS11dHZpZGVvX3l1djQyMl9tZWRpYW46IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb195dXY0MjJfbWVkaWFuLmF2aQogCitGQVRFX1VUVklERU8gKz0gZmF0ZS11dHZpZGVvX3l1djQyMl9pbnRfbWVkaWFuCitmYXRlLXV0dmlkZW9feXV2NDIyX2ludF9tZWRpYW46IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb195dXY0MjJfNzA5XzY0eDQ4X2ludF9tZWRpYW4uYXZpCisKK0ZBVEVfVVRWSURFTyArPSBmYXRlLXV0dmlkZW9feXV2NDIyX2dyYWRpZW50CitmYXRlLXV0dmlkZW9feXV2NDIyX2dyYWRpZW50OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS91dHZpZGVvL3V0dmlkZW9feXV2NDIyXzcwOV82NHg0OF9ncmFkaWVudC5hdmkKKworRkFURV9VVFZJREVPICs9IGZhdGUtdXR2aWRlb195dXY0MjJfaW50X2dyYWRpZW50CitmYXRlLXV0dmlkZW9feXV2NDIyX2ludF9ncmFkaWVudDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvdXR2aWRlby91dHZpZGVvX3l1djQyMl83MDlfNjR4NDhfaW50X2dyYWRpZW50LmF2aQorCitGQVRFX1VUVklERU8gKz0gZmF0ZS11dHZpZGVvX3l1djQ0NF83MDlfbWVkaWFuCitmYXRlLXV0dmlkZW9feXV2NDQ0XzcwOV9tZWRpYW46IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb195dXY0NDRfNzA5XzY0eDQ4X21lZGlhbi5hdmkKKworRkFURV9VVFZJREVPICs9IGZhdGUtdXR2aWRlb195dXY0NDRfNzA5X2ludF9tZWRpYW4KK2ZhdGUtdXR2aWRlb195dXY0NDRfNzA5X2ludF9tZWRpYW46IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb195dXY0NDRfNzA5XzY0eDQ4X2ludF9tZWRpYW4uYXZpCisKK0ZBVEVfVVRWSURFTyArPSBmYXRlLXV0dmlkZW9feXV2NDQ0XzcwOV9ncmFkaWVudAorZmF0ZS11dHZpZGVvX3l1djQ0NF83MDlfZ3JhZGllbnQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb195dXY0NDRfNzA5X2dyYWRpZW50LmF2aQorCitGQVRFX1VUVklERU8gKz0gZmF0ZS11dHZpZGVvX3l1djQ0NF83MDlfaW50X2dyYWRpZW50CitmYXRlLXV0dmlkZW9feXV2NDQ0XzcwOV9pbnRfZ3JhZGllbnQ6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3V0dmlkZW8vdXR2aWRlb195dXY0NDRfNzA5XzY0eDQ4X2ludF9ncmFkaWVudC5hdmkKKwogRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBBVkksIFVUVklERU8pICs9ICQoRkFURV9VVFZJREVPKQogZmF0ZS11dHZpZGVvOiAkKEZBVEVfVVRWSURFTykKIAotZmF0ZS11dHZpZGVvZW5jJTogQ01EID0gZnJhbWVtZDUgLWYgaW1hZ2UyIC12Y29kZWMgcGdteXV2IC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL3ZzeW50aDEvJTAyZC5wZ20gLXZjb2RlYyB1dHZpZGVvIC1zbGljZXMgMSAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgJHtPUFRTfQorZmF0ZS11dHZpZGVvZW5jJTogQ01EID0gZnJhbWVtZDUgLWYgaW1hZ2UyIC1jOnYgcGdteXV2IC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL3ZzeW50aDEvJTAyZC5wZ20gLWM6diB1dHZpZGVvIC1zbGljZXMgMSAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgJHtPUFRTfQogCiBGQVRFX1VUVklERU9FTkMgKz0gZmF0ZS11dHZpZGVvZW5jX3JnYmFfbGVmdAotZmF0ZS11dHZpZGVvZW5jX3JnYmFfbGVmdDogT1BUUyA9IC1waXhfZm10IHJnYmEgLXByZWQgbGVmdAorZmF0ZS11dHZpZGVvZW5jX3JnYmFfbGVmdDogT1BUUyA9IC1waXhfZm10IGdicmFwIC1wcmVkIGxlZnQKIAogRkFURV9VVFZJREVPRU5DICs9IGZhdGUtdXR2aWRlb2VuY19yZ2JhX21lZGlhbgotZmF0ZS11dHZpZGVvZW5jX3JnYmFfbWVkaWFuOiBPUFRTID0gLXBpeF9mbXQgcmdiYSAtcHJlZCBtZWRpYW4KK2ZhdGUtdXR2aWRlb2VuY19yZ2JhX21lZGlhbjogT1BUUyA9IC1waXhfZm10IGdicmFwIC1wcmVkIG1lZGlhbgogCiBGQVRFX1VUVklERU9FTkMgKz0gZmF0ZS11dHZpZGVvZW5jX3JnYmFfbm9uZQotZmF0ZS11dHZpZGVvZW5jX3JnYmFfbm9uZTogT1BUUyA9IC1waXhfZm10IHJnYmEgLXByZWQgbm9uZQorZmF0ZS11dHZpZGVvZW5jX3JnYmFfbm9uZTogT1BUUyA9IC1waXhfZm10IGdicmFwIC1wcmVkIG5vbmUKIAogRkFURV9VVFZJREVPRU5DICs9IGZhdGUtdXR2aWRlb2VuY19yZ2JfbGVmdAotZmF0ZS11dHZpZGVvZW5jX3JnYl9sZWZ0OiBPUFRTID0gLXBpeF9mbXQgcmdiMjQgLXByZWQgbGVmdAorZmF0ZS11dHZpZGVvZW5jX3JnYl9sZWZ0OiBPUFRTID0gLXBpeF9mbXQgZ2JycCAtcHJlZCBsZWZ0CiAKIEZBVEVfVVRWSURFT0VOQyArPSBmYXRlLXV0dmlkZW9lbmNfcmdiX21lZGlhbgotZmF0ZS11dHZpZGVvZW5jX3JnYl9tZWRpYW46IE9QVFMgPSAtcGl4X2ZtdCByZ2IyNCAtcHJlZCBtZWRpYW4KK2ZhdGUtdXR2aWRlb2VuY19yZ2JfbWVkaWFuOiBPUFRTID0gLXBpeF9mbXQgZ2JycCAtcHJlZCBtZWRpYW4KIAogRkFURV9VVFZJREVPRU5DICs9IGZhdGUtdXR2aWRlb2VuY19yZ2Jfbm9uZQotZmF0ZS11dHZpZGVvZW5jX3JnYl9ub25lOiBPUFRTID0gLXBpeF9mbXQgcmdiMjQgLXByZWQgbm9uZQorZmF0ZS11dHZpZGVvZW5jX3JnYl9ub25lOiBPUFRTID0gLXBpeF9mbXQgZ2JycCAtcHJlZCBub25lCiAKIEZBVEVfVVRWSURFT0VOQyArPSBmYXRlLXV0dmlkZW9lbmNfeXV2NDIwX2xlZnQKIGZhdGUtdXR2aWRlb2VuY195dXY0MjBfbGVmdDogT1BUUyA9IC1waXhfZm10IHl1djQyMHAgLXByZWQgbGVmdApAQCAtNjYsNiArMTA1LDE1IEBACiBGQVRFX1VUVklERU9FTkMgKz0gZmF0ZS11dHZpZGVvZW5jX3l1djQyMl9ub25lCiBmYXRlLXV0dmlkZW9lbmNfeXV2NDIyX25vbmU6IE9QVFMgPSAtcGl4X2ZtdCB5dXY0MjJwIC1wcmVkIG5vbmUKIAorRkFURV9VVFZJREVPRU5DICs9IGZhdGUtdXR2aWRlb2VuY195dXY0NDRfbGVmdAorZmF0ZS11dHZpZGVvZW5jX3l1djQ0NF9sZWZ0OiBPUFRTID0gLXBpeF9mbXQgeXV2NDQ0cCAtcHJlZCBsZWZ0CisKK0ZBVEVfVVRWSURFT0VOQyArPSBmYXRlLXV0dmlkZW9lbmNfeXV2NDQ0X21lZGlhbgorZmF0ZS11dHZpZGVvZW5jX3l1djQ0NF9tZWRpYW46IE9QVFMgPSAtcGl4X2ZtdCB5dXY0NDRwIC1wcmVkIG1lZGlhbgorCitGQVRFX1VUVklERU9FTkMgKz0gZmF0ZS11dHZpZGVvZW5jX3l1djQ0NF9ub25lCitmYXRlLXV0dmlkZW9lbmNfeXV2NDQ0X25vbmU6IE9QVFMgPSAtcGl4X2ZtdCB5dXY0NDRwIC1wcmVkIG5vbmUKKwogJChGQVRFX1VUVklERU9FTkMpOiAkKFZSRUYpCiAKIEZBVEVfQVZDT05WLSQoY2FsbCBFTkNNVVgsIFVUVklERU8sIEFWSSkgKz0gJChGQVRFX1VUVklERU9FTkMpCmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL3Zjb2RlYy5tYWsgYi90ZXN0cy9mYXRlL3Zjb2RlYy5tYWsKaW5kZXggY2NmODhjZS4uYmJjZjI1ZCAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS92Y29kZWMubWFrCisrKyBiL3Rlc3RzL2ZhdGUvdmNvZGVjLm1hawpAQCAtMTgsMTYgKzE4LDM2IEBACiBGQVRFX1ZDT0RFQy0kKGNhbGwgRU5DREVDLCBBU1YyLCBBVkkpICAgKz0gYXN2MgogZmF0ZS12c3ludGglLWFzdjI6ICAgICAgICAgICAgICAgRU5DT1BUUyA9IC1xc2NhbGUgMTAKIAotRkFURV9WQ09ERUMtJChjYWxsIEVOQ0RFQywgQ0lORVBBSywgTU9WKSArPSBjaW5lcGFrCi1mYXRlLXZzeW50aCUtY2luZXBhazogICAgICAgICAgICBFTkNPUFRTICA9IC12Y29kZWMgY2luZXBhayAtZnJhbWVzIDMKLWZhdGUtdnN5bnRoJS1jaW5lcGFrOiAgICAgICAgICAgIEZNVCAgICAgID0gbW92CitGQVRFX1ZDT0RFQy0kKGNhbGwgRU5DREVDLCBDSU5FUEFLLCBBVkkpICs9IGNpbmVwYWsKK2ZhdGUtdnN5bnRoJS1jaW5lcGFrOiAgICAgICAgICAgIEVOQ09QVFMgPSAtcyBzcWNpZiAtc3RyaXBfbnVtYmVyX2FkYXB0aXZpdHkgMQorZmF0ZS12c3ludGglLWNpbmVwYWs6ICAgICAgICAgICAgREVDT1BUUyA9IC1zIHNxY2lmCiAKIEZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIENMSlIsIEFWSSkgICArPSBjbGpyCiBmYXRlLXZzeW50aCUtY2xqcjogICAgICAgICAgICAgICBFTkNPUFRTID0gLXN0cmljdCAtMQogCiBGQVRFX1ZDT0RFQy0kKGNhbGwgRU5DREVDLCBETlhIRCwgRE5YSEQpICs9IGRueGhkLTcyMHAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRueGhkLTcyMHAtcmQgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRueGhkLTcyMHAtMTBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG54aGQtNzIwcC0xMGJpdCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG54aGQtNzIwcC1oci1sYiAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG54aGQtNGstaHItbGIgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG54aGQtdWhkLWhyLXNxICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG54aGQtMmstaHItaHEgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG54aGQtZWRnZTEtaHIgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG54aGQtZWRnZTItaHIgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG54aGQtZWRnZTMtaHIKKworRkFURV9WQ09ERUMtJChjYWxsIEVOQ0RFQywgVkMyIERJUkFDLCBNT1YpICs9IHZjMi00MjBwIHZjMi00MjBwMTAgdmMyLTQyMHAxMiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmMyLTQyMnAgdmMyLTQyMnAxMCB2YzItNDIycDEyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YzItNDQ0cCB2YzItNDQ0cDEwIHZjMi00NDRwMTIKK2ZhdGUtdnN5bnRoMS12YzItJTogICAgICAgICAgICAgIEZNVCAgICAgID0gbW92CitmYXRlLXZzeW50aDEtdmMyLSU6ICAgICAgICAgICAgICBFTkNPUFRTID0gLXBpeF9mbXQgeXV2JChAOmZhdGUtdnN5bnRoMS12YzItJT0lKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWM6diB2YzIgLWZyYW1lcyA1IC1zdHJpY3QgLTEKK2ZhdGUtdnN5bnRoMi12YzItJTogICAgICAgICAgICAgIEZNVCAgICAgID0gbW92CitmYXRlLXZzeW50aDItdmMyLSU6ICAgICAgICAgICAgICBFTkNPUFRTID0gLXBpeF9mbXQgeXV2JChAOmZhdGUtdnN5bnRoMi12YzItJT0lKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWM6diB2YzIgLWZyYW1lcyA1IC1zdHJpY3QgLTEKK2ZhdGUtdnN5bnRoX2xlbmEtdmMyLSU6ICAgICAgICAgIEZNVCAgICAgID0gbW92CitmYXRlLXZzeW50aF9sZW5hLXZjMi0lOiAgICAgICAgICBFTkNPUFRTID0gLXBpeF9mbXQgeXV2JChAOmZhdGUtdnN5bnRoX2xlbmEtdmMyLSU9JSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1jOnYgdmMyIC1mcmFtZXMgNSAtc3RyaWN0IC0xCiAKIGZhdGUtdnN5bnRoJS1kbnhoZC03MjBwOiAgICAgICAgIEVOQ09QVFMgPSAtcyBoZDcyMCAtYiA5ME0gICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcGl4X2ZtdCB5dXY0MjJwIC1mcmFtZXMgNSAtcW1heCA4CkBAIC00MSw3ICs2MSw0MyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1waXhfZm10IHl1djQyMnAxMCAtZnJhbWVzIDUgLXFtYXggOAogZmF0ZS12c3ludGglLWRueGhkLTcyMHAtMTBiaXQ6ICAgRk1UICAgICA9IGRueGhkCiAKLUZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIEROWEhELCBNT1YpICArPSBkbnhoZC0xMDgwaSBkbnhoZC0xMDgwaS0xMGJpdCBkbnhoZC0xMDgwaS1jb2xyCitmYXRlLXZzeW50aCUtZG54aGQtNzIwcC1oci1sYjogRU5DT1BUUyAgID0gLXMgaGQ3MjAgLXByb2ZpbGU6diBkbnhocl9sYiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXBpeF9mbXQgeXV2NDIycCAtZnJhbWVzIDUKK2ZhdGUtdnN5bnRoJS1kbnhoZC03MjBwLWhyLWxiOiBERUNPUFRTICAgID0gLXN3c19mbGFncyBhcmVhK2FjY3VyYXRlX3JuZCtiaXRleGFjdAorZmF0ZS12c3ludGglLWRueGhkLTcyMHAtaHItbGI6IEZNVCAgICAgICA9IGRueGhkCisKK2ZhdGUtdnN5bnRoJS1kbnhoZC00ay1oci1sYjogIEVOQ09QVFMgICAgPSAtcyA0ayAtcHJvZmlsZTp2IGRueGhyX2xiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcGl4X2ZtdCB5dXY0MjJwIC1mcmFtZXMgNQorZmF0ZS12c3ludGglLWRueGhkLTRrLWhyLWxiOiAgREVDT1BUUyAgICA9IC1zd3NfZmxhZ3MgYXJlYSthY2N1cmF0ZV9ybmQrYml0ZXhhY3QKK2ZhdGUtdnN5bnRoJS1kbnhoZC00ay1oci1sYjogIEZNVCAgICAgICAgPSBkbnhoZAorCitmYXRlLXZzeW50aCUtZG54aGQtdWhkLWhyLXNxOiBFTkNPUFRTICAgID0gLXMgdWhkMjE2MCAtcHJvZmlsZTp2IGRueGhyX3NxIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcGl4X2ZtdCB5dXY0MjJwIC1mcmFtZXMgNQorZmF0ZS12c3ludGglLWRueGhkLXVoZC1oci1zcTogREVDT1BUUyAgICA9IC1zd3NfZmxhZ3MgYXJlYSthY2N1cmF0ZV9ybmQrYml0ZXhhY3QKK2ZhdGUtdnN5bnRoJS1kbnhoZC11aGQtaHItc3E6IEZNVCAgICAgICAgPSBkbnhoZAorCitmYXRlLXZzeW50aCUtZG54aGQtMmstaHItaHE6ICBFTkNPUFRTICAgID0gLXMgMmsgLXByb2ZpbGU6diBkbnhocl9ocSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1waXhfZm10IHl1djQyMnAgLWZyYW1lcyA1CitmYXRlLXZzeW50aCUtZG54aGQtMmstaHItaHE6ICBERUNPUFRTICAgID0gLXN3c19mbGFncyBhcmVhK2FjY3VyYXRlX3JuZCtiaXRleGFjdAorZmF0ZS12c3ludGglLWRueGhkLTJrLWhyLWhxOiAgRk1UICAgICAgICA9IGRueGhkCisKK2ZhdGUtdnN5bnRoJS1kbnhoZC1lZGdlMS1ocjogIEVOQ09QVFMgICAgPSAtcyAyNjR4MTI4IC1wcm9maWxlOnYgZG54aHJfaHEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1waXhfZm10IHl1djQyMnAgLWZyYW1lcyA1CitmYXRlLXZzeW50aCUtZG54aGQtZWRnZTEtaHI6ICBERUNPUFRTICAgID0gLXN3c19mbGFncyBhcmVhK2FjY3VyYXRlX3JuZCtiaXRleGFjdAorZmF0ZS12c3ludGglLWRueGhkLWVkZ2UxLWhyOiAgRk1UICAgICAgICA9IGRueGhkCisKK2ZhdGUtdnN5bnRoJS1kbnhoZC1lZGdlMi1ocjogIEVOQ09QVFMgICAgPSAtcyAyNzF4MTM1IC1wcm9maWxlOnYgZG54aHJfaHEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1waXhfZm10IHl1djQyMnAgLWZyYW1lcyA1CitmYXRlLXZzeW50aCUtZG54aGQtZWRnZTItaHI6ICBERUNPUFRTICAgID0gLXN3c19mbGFncyBhcmVhK2FjY3VyYXRlX3JuZCtiaXRleGFjdAorZmF0ZS12c3ludGglLWRueGhkLWVkZ2UyLWhyOiAgRk1UICAgICAgICA9IGRueGhkCisKK2ZhdGUtdnN5bnRoJS1kbnhoZC1lZGdlMy1ocjogIEVOQ09QVFMgICAgPSAtcyAyNTd4MTIxIC1wcm9maWxlOnYgZG54aHJfaHEgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1waXhfZm10IHl1djQyMnAgLWZyYW1lcyA1CitmYXRlLXZzeW50aCUtZG54aGQtZWRnZTMtaHI6ICBERUNPUFRTICAgID0gLXN3c19mbGFncyBhcmVhK2FjY3VyYXRlX3JuZCtiaXRleGFjdAorZmF0ZS12c3ludGglLWRueGhkLWVkZ2UzLWhyOiAgRk1UICAgICAgICA9IGRueGhkCisKK0ZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIEROWEhELCBNT1YpICArPSBkbnhoZC0xMDgwaSBkbnhoZC0xMDgwaS0xMGJpdCBkbnhoZC0xMDgwaS1jb2xyIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbnhoZC1oci1sYi1tb3YgZG54aGQtaHItc3EtbW92IGRueGhkLWhyLWhxLW1vdgogZmF0ZS12c3ludGglLWRueGhkLTEwODBpOiAgICAgICAgRU5DT1BUUyA9IC1zIGhkMTA4MCAtYiAxMjBNIC1mbGFncyAraWxkY3QgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1waXhfZm10IHl1djQyMnAgLWZyYW1lcyA1IC1xbWF4IDgKIGZhdGUtdnN5bnRoJS1kbnhoZC0xMDgwaTogICAgICAgIEZNVCAgICAgPSBtb3YKQEAgLTU2LDYgKzExMiwyMSBAQAogZmF0ZS12c3ludGglLWRueGhkLTEwODBpLWNvbHI6ICAgREVDT1BUUyA9IC1zd3NfZmxhZ3MgYXJlYSthY2N1cmF0ZV9ybmQrYml0ZXhhY3QKIGZhdGUtdnN5bnRoJS1kbnhoZC0xMDgwaS1jb2xyOiAgIEZNVCAgICAgPSBtb3YKIAorZmF0ZS12c3ludGglLWRueGhkLWhyLWxiLW1vdjogICBFTkNPUFRTID0gLXMgdWhkMjE2MCAtcHJvZmlsZTp2IGRueGhyX2xiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcGl4X2ZtdCB5dXY0MjJwIC1mcmFtZXMgNQorZmF0ZS12c3ludGglLWRueGhkLWhyLWxiLW1vdjogICBERUNPUFRTID0gLXN3c19mbGFncyBhcmVhK2FjY3VyYXRlX3JuZCtiaXRleGFjdAorZmF0ZS12c3ludGglLWRueGhkLWhyLWxiLW1vdjogICBGTVQgICAgID0gbW92CisKK2ZhdGUtdnN5bnRoJS1kbnhoZC1oci1zcS1tb3Y6ICAgRU5DT1BUUyA9IC1zIDJrc2NvcGUgLXByb2ZpbGU6diBkbnhocl9zcSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXBpeF9mbXQgeXV2NDIycCAtZnJhbWVzIDUKK2ZhdGUtdnN5bnRoJS1kbnhoZC1oci1zcS1tb3Y6ICAgREVDT1BUUyA9IC1zd3NfZmxhZ3MgYXJlYSthY2N1cmF0ZV9ybmQrYml0ZXhhY3QKK2ZhdGUtdnN5bnRoJS1kbnhoZC1oci1zcS1tb3Y6ICAgRk1UICAgICA9IG1vdgorCitmYXRlLXZzeW50aCUtZG54aGQtaHItaHEtbW92OiAgIEVOQ09QVFMgPSAtcyAya2ZsYXQgLXByb2ZpbGU6diBkbnhocl9ocSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXBpeF9mbXQgeXV2NDIycCAtZnJhbWVzIDUKK2ZhdGUtdnN5bnRoJS1kbnhoZC1oci1ocS1tb3Y6ICAgREVDT1BUUyA9IC1zd3NfZmxhZ3MgYXJlYSthY2N1cmF0ZV9ybmQrYml0ZXhhY3QKK2ZhdGUtdnN5bnRoJS1kbnhoZC1oci1ocS1tb3Y6ICAgRk1UICAgICA9IG1vdgorCiBGQVRFX1ZDT0RFQy0kKGNhbGwgRU5DREVDLCBEVlZJREVPLCBEVikgKz0gZHYgZHYtNDExIGR2LTUwCiBmYXRlLXZzeW50aCUtZHY6ICAgICAgICAgICAgICAgICBDT0RFQyAgID0gZHZ2aWRlbwogZmF0ZS12c3ludGglLWR2OiAgICAgICAgICAgICAgICAgRU5DT1BUUyA9IC1kY3QgaW50IC1zIHBhbApAQCAtNzUsNyArMTQ2LDcgQEAKIAogRkFURV9WQ09ERUMtJChjYWxsIEVOQ0RFQywgRkZWMSwgQVZJKSAgICs9IGZmdjEgZmZ2MS12MCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZ2MS12My15dXY0MjBwIGZmdjEtdjMteXV2NDIycDEwIGZmdjEtdjMteXV2NDQ0cDE2IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZnYxLXYzLWJncjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZnYxLXYzLWJncjAgZmZ2MS12My1yZ2I0OAogZmF0ZS12c3ludGglLWZmdjE6ICAgICAgICAgICAgICAgRU5DT1BUUyA9IC1zbGljZXMgNAogZmF0ZS12c3ludGglLWZmdjEtdjA6ICAgICAgICAgICAgQ09ERUMgICA9IGZmdjEKIGZhdGUtdnN5bnRoJS1mZnYxLXYzLXl1djQyMHA6ICAgIEVOQ09QVFMgPSAtbGV2ZWwgMyAtcGl4X2ZtdCB5dXY0MjBwCkBAIC04OCwxMiArMTU5LDE1IEBACiBmYXRlLXZzeW50aCUtZmZ2MS12My1iZ3IwOiAgICAgICBFTkNPUFRTID0gLWxldmVsIDMgLXBpeF9mbXQgYmdyMCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXN3c19mbGFncyBuZWlnaGJvcitiaXRleGFjdAogZmF0ZS12c3ludGglLWZmdjEtdjMtYmdyMDogICAgICAgREVDT1BUUyA9IC1zd3NfZmxhZ3MgbmVpZ2hib3IrYml0ZXhhY3QKK2ZhdGUtdnN5bnRoJS1mZnYxLXYzLXJnYjQ4OiAgICAgIEVOQ09QVFMgPSAtbGV2ZWwgMyAtcGl4X2ZtdCByZ2I0OCAtc3RyaWN0IC0yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc3dzX2ZsYWdzIG5laWdoYm9yK2JpdGV4YWN0CitmYXRlLXZzeW50aCUtZmZ2MS12My1yZ2I0ODogICAgICBERUNPUFRTID0gLXN3c19mbGFncyBuZWlnaGJvcitiaXRleGFjdAogCiBGQVRFX1ZDT0RFQy0kKGNhbGwgRU5DREVDLCBGRlZIVUZGLCBBVkkpICs9IGZmdmh1ZmYgZmZ2aHVmZjQ0NCBmZnZodWZmNDIwcDEyIGZmdmh1ZmY0MjJwMTBsZWZ0IGZmdmh1ZmY0NDRwMTYKLWZhdGUtdnN5bnRoJS1mZnZodWZmNDQ0OiAgICAgICAgIEVOQ09QVFMgPSAtdmNvZGVjIGZmdmh1ZmYgLXBpeF9mbXQgeXV2NDQ0cAotZmF0ZS12c3ludGglLWZmdmh1ZmY0MjBwMTI6ICAgICAgRU5DT1BUUyA9IC12Y29kZWMgZmZ2aHVmZiAtcGl4X2ZtdCB5dXY0MjBwMTJsZQotZmF0ZS12c3ludGglLWZmdmh1ZmY0MjJwMTBsZWZ0OiAgRU5DT1BUUyA9IC12Y29kZWMgZmZ2aHVmZiAtcGl4X2ZtdCB5dXY0MjJwMTBsZSAtcHJlZCBsZWZ0Ci1mYXRlLXZzeW50aCUtZmZ2aHVmZjQ0NHAxNjogICAgICBFTkNPUFRTID0gLXZjb2RlYyBmZnZodWZmIC1waXhfZm10IHl1djQ0NHAxNmxlIC1wcmVkIHBsYW5lCitmYXRlLXZzeW50aCUtZmZ2aHVmZjQ0NDogICAgICAgICBFTkNPUFRTID0gLWM6diBmZnZodWZmIC1waXhfZm10IHl1djQ0NHAKK2ZhdGUtdnN5bnRoJS1mZnZodWZmNDIwcDEyOiAgICAgIEVOQ09QVFMgPSAtYzp2IGZmdmh1ZmYgLXBpeF9mbXQgeXV2NDIwcDEybGUKK2ZhdGUtdnN5bnRoJS1mZnZodWZmNDIycDEwbGVmdDogIEVOQ09QVFMgPSAtYzp2IGZmdmh1ZmYgLXBpeF9mbXQgeXV2NDIycDEwbGUgLXByZWQgbGVmdAorZmF0ZS12c3ludGglLWZmdmh1ZmY0NDRwMTY6ICAgICAgRU5DT1BUUyA9IC1jOnYgZmZ2aHVmZiAtcGl4X2ZtdCB5dXY0NDRwMTZsZSAtcHJlZCBwbGFuZQogCiBGQVRFX1ZDT0RFQy0kKGNhbGwgRU5DREVDLCBGTEFTSFNWLCBGTFYpICs9IGZsYXNoc3YKIGZhdGUtdnN5bnRoJS1mbGFzaHN2OiAgICAgICAgICAgIEVOQ09QVFMgPSAtc3dzX2ZsYWdzIG5laWdoYm9yK2Z1bGxfY2hyb21hX2ludApAQCAtMTE5LDExICsxOTMsMTEgQEAKIGZhdGUtdnN5bnRoJS1oMjYzcDogICAgICAgICAgICAgIEVOQ09QVFMgPSAtcXNjYWxlIDIgLWZsYWdzICthaWMgLXVtdiAxIC1haXYgMSAtcHMgMzAwCiAKIEZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIEhVRkZZVVYsIEFWSSkgKz0gaHVmZnl1diBodWZmeXV2YmdyMjQgaHVmZnl1dmJncmEKLWZhdGUtdnN5bnRoJS1odWZmeXV2OiAgICAgICAgICAgIEVOQ09QVFMgPSAtdmNvZGVjIGh1ZmZ5dXYgLXBpeF9mbXQgeXV2NDIycCAtc3dzX2ZsYWdzIG5laWdoYm9yCitmYXRlLXZzeW50aCUtaHVmZnl1djogICAgICAgICAgICBFTkNPUFRTID0gLWM6diBodWZmeXV2IC1waXhfZm10IHl1djQyMnAgLXN3c19mbGFncyBuZWlnaGJvcgogZmF0ZS12c3ludGglLWh1ZmZ5dXY6ICAgICAgICAgICAgREVDT1BUUyA9IC1zd3NfZmxhZ3MgbmVpZ2hib3IKLWZhdGUtdnN5bnRoJS1odWZmeXV2YmdyMjQ6ICAgICAgIEVOQ09QVFMgPSAtdmNvZGVjIGh1ZmZ5dXYgLXBpeF9mbXQgYmdyMjQgLXN3c19mbGFncyBuZWlnaGJvcgorZmF0ZS12c3ludGglLWh1ZmZ5dXZiZ3IyNDogICAgICAgRU5DT1BUUyA9IC1jOnYgaHVmZnl1diAtcGl4X2ZtdCBiZ3IyNCAtc3dzX2ZsYWdzIG5laWdoYm9yCiBmYXRlLXZzeW50aCUtaHVmZnl1dmJncjI0OiAgICAgICBERUNPUFRTID0gLXN3c19mbGFncyBuZWlnaGJvcgotZmF0ZS12c3ludGglLWh1ZmZ5dXZiZ3JhOiAgICAgICAgRU5DT1BUUyA9IC12Y29kZWMgaHVmZnl1diAtcGl4X2ZtdCBiZ3IzMiAtc3dzX2ZsYWdzIG5laWdoYm9yCitmYXRlLXZzeW50aCUtaHVmZnl1dmJncmE6ICAgICAgICBFTkNPUFRTID0gLWM6diBodWZmeXV2IC1waXhfZm10IGJncjMyIC1zd3NfZmxhZ3MgbmVpZ2hib3IKIGZhdGUtdnN5bnRoJS1odWZmeXV2YmdyYTogICAgICAgIERFQ09QVFMgPSAtc3dzX2ZsYWdzIG5laWdoYm9yCiAKIEZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIEpQRUdMUywgQVZJKSArPSBqcGVnbHMKQEAgLTEzMiwxOCArMjA2LDIwIEBACiAKIEZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIEpQRUcyMDAwLCBBVkkpICs9IGpwZWcyMDAwIGpwZWcyMDAwLTk3CiBmYXRlLXZzeW50aCUtanBlZzIwMDA6ICAgICAgICAgICAgICAgIEVOQ09QVFMgPSAtcXNjYWxlIDcgLXN0cmljdCBleHBlcmltZW50YWwgLXByZWQgMSAtcGl4X2ZtdCByZ2IyNAotZmF0ZS12c3ludGglLWpwZWcyMDAwOiAgICAgICAgICAgICAgICBERUNJTk9QVFMgPSAtdmNvZGVjIGpwZWcyMDAwCitmYXRlLXZzeW50aCUtanBlZzIwMDA6ICAgICAgICAgICAgICAgIERFQ0lOT1BUUyA9IC1jOnYganBlZzIwMDAKIGZhdGUtdnN5bnRoJS1qcGVnMjAwMC05NzogICAgICAgICAgICAgRU5DT1BUUyA9IC1xc2NhbGUgNyAtc3RyaWN0IGV4cGVyaW1lbnRhbCAtcGl4X2ZtdCByZ2IyNAotZmF0ZS12c3ludGglLWpwZWcyMDAwLTk3OiAgICAgICAgICAgICBERUNJTk9QVFMgPSAtdmNvZGVjIGpwZWcyMDAwCitmYXRlLXZzeW50aCUtanBlZzIwMDAtOTc6ICAgICAgICAgICAgIERFQ0lOT1BUUyA9IC1jOnYganBlZzIwMDAKIAogRkFURV9WQ09ERUMtJChjYWxsIEVOQ0RFQywgTEpQRUcgTUpQRUcsIEFWSSkgKz0gbGpwZWcKIGZhdGUtdnN5bnRoJS1sanBlZzogICAgICAgICAgICAgIEVOQ09QVFMgPSAtc3RyaWN0IC0xCiAKLUZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIE1KUEVHLCBBVkkpICArPSBtanBlZyBtanBlZy00MjIgbWpwZWctNDQ0IG1qcGVnLXRyZWxsCi1mYXRlLXZzeW50aCUtbWpwZWc6ICAgICAgICAgICAgICBFTkNPUFRTID0gLXFzY2FsZSA5IC1waXhfZm10IHl1dmo0MjBwCi1mYXRlLXZzeW50aCUtbWpwZWctNDIyOiAgICAgICAgICBFTkNPUFRTID0gLXFzY2FsZSA5IC1waXhfZm10IHl1dmo0MjJwCi1mYXRlLXZzeW50aCUtbWpwZWctNDQ0OiAgICAgICAgICBFTkNPUFRTID0gLXFzY2FsZSA5IC1waXhfZm10IHl1dmo0NDRwCi1mYXRlLXZzeW50aCUtbWpwZWctdHJlbGw6ICAgICAgICBFTkNPUFRTID0gLXFzY2FsZSA5IC1waXhfZm10IHl1dmo0MjBwIC10cmVsbGlzIDEKK0ZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIE1KUEVHLCBBVkkpICArPSBtanBlZyBtanBlZy00MjIgbWpwZWctNDQ0IG1qcGVnLXRyZWxsIG1qcGVnLWh1ZmZtYW4gbWpwZWctdHJlbGwtaHVmZm1hbgorZmF0ZS12c3ludGglLW1qcGVnOiAgICAgICAgICAgICAgICAgICBFTkNPUFRTID0gLXFzY2FsZSA5IC1waXhfZm10IHl1dmo0MjBwCitmYXRlLXZzeW50aCUtbWpwZWctNDIyOiAgICAgICAgICAgICAgIEVOQ09QVFMgPSAtcXNjYWxlIDkgLXBpeF9mbXQgeXV2ajQyMnAKK2ZhdGUtdnN5bnRoJS1tanBlZy00NDQ6ICAgICAgICAgICAgICAgRU5DT1BUUyA9IC1xc2NhbGUgOSAtcGl4X2ZtdCB5dXZqNDQ0cAorZmF0ZS12c3ludGglLW1qcGVnLXRyZWxsOiAgICAgICAgICAgICBFTkNPUFRTID0gLXFzY2FsZSA5IC1waXhfZm10IHl1dmo0MjBwIC10cmVsbGlzIDEKK2ZhdGUtdnN5bnRoJS1tanBlZy1odWZmbWFuOiAgICAgICAgICAgRU5DT1BUUyA9IC1xc2NhbGUgOSAtcGl4X2ZtdCB5dXZqNDIwcCAtaHVmZm1hbiBvcHRpbWFsCitmYXRlLXZzeW50aCUtbWpwZWctdHJlbGwtaHVmZm1hbjogICAgIEVOQ09QVFMgPSAtcXNjYWxlIDkgLXBpeF9mbXQgeXV2ajQyMHAgLXRyZWxsaXMgMSAtaHVmZm1hbiBvcHRpbWFsCiAKIEZBVEVfVkNPREVDLSQoY2FsbCBFTkNERUMsIE1QRUcxVklERU8sIE1QRUcxVklERU8gTVBFR1ZJREVPKSArPSBtcGVnMSBtcGVnMWIKIGZhdGUtdnN5bnRoJS1tcGVnMTogICAgICAgICAgICAgIEZNVCAgICAgPSBtcGVnMXZpZGVvCkBAIC0zMDAsMTEgKzM3NiwxMSBAQAogCiBGQVRFX1ZDT0RFQy0kKGNhbGwgRU5DREVDLCBTTk9XLCBBVkkpICAgKz0gc25vdyBzbm93LWhwZWwgc25vdy1sbAogZmF0ZS12c3ludGglLXNub3c6ICAgICAgICAgICAgICAgRU5DT1BUUyA9IC1xc2NhbGUgMiAtZmxhZ3MgK3FwZWwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tZV9tZXRob2QgaXRlciAtZGlhX3NpemUgMiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1vdGlvbl9lc3QgaXRlciAtZGlhX3NpemUgMiAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtY21wIDEyIC1zdWJjbXAgMTIgLXMgMTI4eDY0CiAKIGZhdGUtdnN5bnRoJS1zbm93LWhwZWw6ICAgICAgICAgIEVOQ09QVFMgPSAtcXNjYWxlIDIgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtbWVfbWV0aG9kIGl0ZXIgLWRpYV9zaXplIDIgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1tb3Rpb25fZXN0IGl0ZXIgLWRpYV9zaXplIDIgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWNtcCAxMiAtc3ViY21wIDEyIC1zIDEyOHg2NAogCiBmYXRlLXZzeW50aCUtc25vdy1sbDogICAgICAgICAgICBFTkNPUFRTID0gLXFzY2FsZSAuMDAxIC1wcmVkIDEgXApAQCAtMzU2LDcgKzQzMiw5IEBACiBGQVRFX1ZTWU5USF9MRU5BID0gJChGQVRFX1ZDT0RFQzolPWZhdGUtdnN5bnRoX2xlbmEtJSkKICMgUmVkdW5kYW50IHRlc3RzIGJlY2F1c2UgdGhleSBqdXN0IHJlc2l6ZSB0aGUgaW5wdXQKIFJFU0laRV9PRkYgICA9IGRueGhkLTcyMHAgZG54aGQtNzIwcC1yZCBkbnhoZC03MjBwLTEwYml0IGRueGhkLTEwODBpIFwKLSAgICAgICAgICAgICAgIGR2IGR2LTQxMSBkdi01MCBhdnVpIHNub3cgc25vdy1ocGVsIHNub3ctbGwKKyAgICAgICAgICAgICAgIGR2IGR2LTQxMSBkdi01MCBhdnVpIHNub3cgc25vdy1ocGVsIHNub3ctbGwgdmMyLTQyMHAgXAorICAgICAgICAgICAgICAgdmMyLTQyMHAxMCB2YzItNDIwcDEyIHZjMi00MjJwIHZjMi00MjJwMTAgdmMyLTQyMnAxMiBcCisgICAgICAgICAgICAgICB2YzItNDQ0cCB2YzItNDQ0cDEwIHZjMi00NDRwMTIKICMgSW5jb3JyZWN0IHBhcmFtZXRlcnMgLSB1c3VhbGx5IHNpemUgb3IgY29sb3IgZm9ybWF0IHJlc3RyaWN0aW9ucwogSU5DX1BBUl9PRkYgID0gY2luZXBhayBoMjYxIGgyNjEtdHJlbGxpcyBoMjYzIGgyNjNwIGgyNjMtb2JtYyBtc3ZpZGVvMSBcCiAgICAgICAgICAgICAgICByb3F2aWRlbyBydjEwIHJ2MjAgeTQxcCBxdHJsZWdyYXkKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvdmlkZW8ubWFrIGIvdGVzdHMvZmF0ZS92aWRlby5tYWsKaW5kZXggOGI3MGIwOC4uNDNjMzQzMiAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS92aWRlby5tYWsKKysrIGIvdGVzdHMvZmF0ZS92aWRlby5tYWsKQEAgLTcsMTEgKzcsMTQgQEAKIEZBVEVfVklERU8tJChjYWxsIERFTURFQywgRk9VUlhNLCBGT1VSWE0pICs9ICQoRkFURV80WE0pCiBmYXRlLTR4bTogJChGQVRFXzRYTSkKIAorRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBBVkksIFpFUk8xMlYpICs9IGZhdGUtMDEydgorZmF0ZS0wMTJ2OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS8wMTJ2L3NhbXBsZS5hdmkgLXBpeF9mbXQgeXV2NDIycDE2bGUKKwogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBBVkksIEFBU0MpICs9IGZhdGUtYWFzYwogZmF0ZS1hYXNjOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9hYXNjL0FBU0MtMS41TUIuQVZJIC1waXhfZm10IHJnYjI0CiAKIEZBVEVfVklERU8tJChjYWxsIERFTURFQywgTU9WLCBBSUMpICs9IGZhdGUtYWljCi1mYXRlLWFpYzogQ01EID0gZnJhbWVjcmMgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL2FpYy9zbWFsbF9hcHBsZV9pbnRlcm1lZGlhdGVfY29kZWMubW92IC1hbiAtdmZyYW1lcyAxNQorZmF0ZS1haWM6IENNRCA9IGZyYW1lY3JjIC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9haWMvc21hbGxfYXBwbGVfaW50ZXJtZWRpYXRlX2NvZGVjLm1vdiAtYW4gLWZyYW1lczp2IDE1CiAKIEZBVEVfVklERU8tJChjYWxsIERFTURFQywgTU9WLCBBSUMpICs9IGZhdGUtYWljLW9kZHNpemUKIGZhdGUtYWljLW9kZHNpemU6IENNRCA9IGZyYW1lY3JjIC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9haWMvYWljX29kZF9kaW1lbnNpb25zLm1vdgpAQCAtNjAsMzkgKzYzLDMzIEBACiBGQVRFX1ZJREVPLSQoY2FsbCBERU1ERUMsIEJNViwgQk1WX1ZJREVPKSArPSBmYXRlLWJtdi12aWRlbwogZmF0ZS1ibXYtdmlkZW86IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2Jtdi9TVVJGSU5HLXBhcnRpYWwuQk1WIC1waXhfZm10IHJnYjI0IC1hbgogCi1GQVRFX0NBTk9QVVNfSFFfSFFBICs9IGZhdGUtY2Fub3B1cy1ocV9ocWEtaHEKLWZhdGUtY2Fub3B1cy1ocV9ocWEtaHE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2Nhbm9wdXMvaHEuYXZpCi0KLUZBVEVfQ0FOT1BVU19IUV9IUUEgKz0gZmF0ZS1jYW5vcHVzLWhxX2hxYS1ocWEKLWZhdGUtY2Fub3B1cy1ocV9ocWEtaHFhOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jYW5vcHVzL2hxYS5hdmkKLQotRkFURV9DQU5PUFVTX0hRX0hRQSArPSBmYXRlLWNhbm9wdXMtaHFfaHFhLWludGVyCi1mYXRlLWNhbm9wdXMtaHFfaHFhLWludGVyOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jYW5vcHVzL2hxMjVpLmF2aQotCi1GQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIEFWSSwgSFFfSFFBKSArPSAkKEZBVEVfQ0FOT1BVU19IUV9IUUEpCi1mYXRlLWNhbm9wdXMtaHFfaHFhOiAkKEZBVEVfQ0FOT1BVU19IUV9IUUEpCi0KLUZBVEVfQ0FOT1BVU19IUVggKz0gZmF0ZS1jYW5vcHVzLWhxeDQyMgotZmF0ZS1jYW5vcHVzLWhxeDQyMjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvY2Fub3B1cy9ocXg0MjIuYXZpIC1waXhfZm10IHl1djQyMnAxNmJlIC1hbgotCi1GQVRFX0NBTk9QVVNfSFFYICs9IGZhdGUtY2Fub3B1cy1ocXg0MjJhCi1mYXRlLWNhbm9wdXMtaHF4NDIyYTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvY2Fub3B1cy9ocXg0MjJhLmF2aSAtcGl4X2ZtdCB5dXY0MjJwMTZiZSAtYW4KLQotRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBBVkksIEhRWCkgKz0gJChGQVRFX0NBTk9QVVNfSFFYKQotZmF0ZS1jYW5vcHVzLWhxeDogJChGQVRFX0NBTk9QVVNfSFFYKQotCiBGQVRFX1ZJREVPLSQoY2FsbCBERU1ERUMsIE1QRUdQUywgQ0FWUykgKz0gZmF0ZS1jYXZzCiBmYXRlLWNhdnM6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2NhdnMvY2F2cy5tcGcgLWFuCiAKIEZBVEVfVklERU8tJChjYWxsIERFTURFQywgQ0RHLCBDREdSQVBISUNTKSArPSBmYXRlLWNkZ3JhcGhpY3MKIGZhdGUtY2RncmFwaGljczogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvY2RncmFwaGljcy9Ccm90aGVySm9obi5jZGcgLXBpeF9mbXQgcmdiYSAtdCAxCiAKK0ZBVEVfQ0ZIRC0kKENPTkZJR19BVklfREVNVVhFUikgKz0gZmF0ZS1jZmhkLTEKK2ZhdGUtY2ZoZC0xOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jZmhkL2NmaGRfNDIyLmF2aSAtcGl4X2ZtdCB5dXY0MjJwMTBsZQorCitGQVRFX0NGSEQtJChDT05GSUdfQVZJX0RFTVVYRVIpICs9IGZhdGUtY2ZoZC0yCitmYXRlLWNmaGQtMjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvY2ZoZC9jZmhkXzQ0NC5hdmkgLXBpeF9mbXQgZ2JycDEybGUKKworRkFURV9DRkhELSQoQ09ORklHX01PVl9ERU1VWEVSKSArPSBmYXRlLWNmaGQtMworZmF0ZS1jZmhkLTM6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2NmaGQvY2ZoZF9vZGQubW92IC1waXhfZm10IHl1djQyMnAxMGxlCisKK0ZBVEVfVklERU8tJChDT05GSUdfQ0ZIRF9ERUNPREVSKSArPSAkKEZBVEVfQ0ZIRC15ZXMpCitmYXRlLWNmaGQ6ICQoRkFURV9DRkhELXllcykKKwogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBBVkksIENMSlIpICs9IGZhdGUtY2xqcgogZmF0ZS1jbGpyOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jbGpyL3Rlc3RjbGpyLXBhcnRpYWwuYXZpCiAKIEZBVEVfVklERU8tJChjYWxsIERFTURFQywgQVZJLCBQTkcpICs9IGZhdGUtY29yZXBuZwogZmF0ZS1jb3JlcG5nOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9wbmcxL2NvcmVwbmctcGFydGlhbC5hdmkKIAorRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBBVkksIFBORykgKz0gZmF0ZS1yZ2JhcG5nLTQ4MTYKK2ZhdGUtcmdiYXBuZy00ODE2OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9wbmcxLzU1Yzk5ZTc1MGE1ZmQ2XzUwMzE0MjI2LnBuZworCiBGQVRFX1ZJREVPLSQoY2FsbCBERU1ERUMsIEFWUywgQVZTKSArPSBmYXRlLWNyZWF0dXJlc2hvY2stYXZzCiBmYXRlLWNyZWF0dXJlc2hvY2stYXZzOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9jcmVhdHVyZXNob2NrLWF2cy9PVVRBVElNRS5BVlMgLXBpeF9mbXQgcmdiMjQKIApAQCAtMTIzLDE3ICsxMjAsOCBAQAogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBESVJBQywgRElSQUMpICs9IGZhdGUtZGlyYWMKIGZhdGUtZGlyYWM6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2RpcmFjL3Z0cy5wcm9maWxlLW1haW4uZHJjCiAKLUZBVEVfVFJVRU1PVElPTjEgKz0gZmF0ZS10cnVlbW90aW9uMS0xNQotZmF0ZS10cnVlbW90aW9uMS0xNTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZHVjay9waGFudDItOTQwLmR1ayAtcGl4X2ZtdCByZ2IyNCAtYW4KLQotRkFURV9UUlVFTU9USU9OMSArPSBmYXRlLXRydWVtb3Rpb24xLTI0Ci1mYXRlLXRydWVtb3Rpb24xLTI0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9kdWNrL3NvbmljM2RibGFzdF9pbnRyby1wYXJ0aWFsLmF2aSAtcGl4X2ZtdCByZ2IyNCAtYW4KLQotRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBBVkksIFRSVUVNT1RJT04xKSArPSAkKEZBVEVfVFJVRU1PVElPTjEpCi1mYXRlLXRydWVtb3Rpb24xOiAkKEZBVEVfVFJVRU1PVElPTjEpCi0KLUZBVEVfVklERU8tJChjYWxsIERFTURFQywgQVZJLCBUUlVFTU9USU9OMikgKz0gZmF0ZS10cnVlbW90aW9uMgotZmF0ZS10cnVlbW90aW9uMjogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZHVjay90bTIwLmF2aQorRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBESVJBQywgRElSQUMpICs9IGZhdGUtZGlyYWMtbG93LWRlbGF5CitmYXRlLWRpcmFjLWxvdy1kZWxheTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZGlyYWMvdnRzLnByb2ZpbGUtdmMyLWxvdy1kZWxheS5kcmMKIAogRkFURV9EWEEgKz0gZmF0ZS1keGEtZmVlYmxlCiBmYXRlLWR4YS1mZWVibGU6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2R4YS9tZWV0c3F1aWQuZHhhIC10IDIgLXBpeF9mbXQgcmdiMjQgLWFuCkBAIC0xODEsMjIgKzE2OSw3IEBACiBmYXRlLWlkLWNpbi12aWRlbzogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaWRjaW4vaWRsb2ctMk1CLmNpbiAtcGl4X2ZtdCByZ2IyNAogCiBGQVRFX1ZJREVPLSQoY2FsbCBFTkNERUMsIFJPUSBQR01ZVVYsIFJPUSBJTUFHRTIpICs9IGZhdGUtaWRyb3EtdmlkZW8tZW5jb2RlCi1mYXRlLWlkcm9xLXZpZGVvLWVuY29kZTogQ01EID0gbWQ1IC1mIGltYWdlMiAtdmNvZGVjIHBnbXl1diAtaSAkKFRBUkdFVF9TQU1QTEVTKS9mZm1wZWctc3ludGhldGljL3ZzeW50aDEvJTAyZC5wZ20gLXIgMzAgLXN3c19mbGFncyArYml0ZXhhY3QgLXZmIHBhZD01MTI6NTEyOjgwOjExMiAtZiByb3EgLXQgMC4yCi0KLUZBVEVfSEFQICs9IGZhdGUtaGFwMQotZmF0ZS1oYXAxOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9oYXAvaGFwMS5tb3YKLQotRkFURV9IQVAgKz0gZmF0ZS1oYXA1Ci1mYXRlLWhhcDU6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2hhcC9oYXA1Lm1vdgotCi1GQVRFX0hBUCArPSBmYXRlLWhhcHkKLWZhdGUtaGFweTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL2hhcHkubW92Ci0KLUZBVEVfSEFQICs9IGZhdGUtaGFwLWNodW5rCi1mYXRlLWhhcC1jaHVuazogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaGFwL2hhcHktMTItY2h1bmtzLm1vdgotCi1GQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIE1PViwgSEFQKSArPSAkKEZBVEVfSEFQKQotZmF0ZS1oYXA6ICQoRkFURV9IQVApCitmYXRlLWlkcm9xLXZpZGVvLWVuY29kZTogQ01EID0gbWQ1IC1mIGltYWdlMiAtYzp2IHBnbXl1diAtaSAkKFRBUkdFVF9TQU1QTEVTKS9mZm1wZWctc3ludGhldGljL3ZzeW50aDEvJTAyZC5wZ20gLXIgMzAgLXN3c19mbGFncyArYml0ZXhhY3QgLXZmIHBhZD01MTI6NTEyOjgwOjExMiAtZiByb3EgLXQgMC4yCiAKIEZBVEVfSUZGLSQoQ09ORklHX0lGRl9JTEJNX0RFQ09ERVIpICs9IGZhdGUtaWZmLWJ5dGVydW4xCiBmYXRlLWlmZi1ieXRlcnVuMTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvaWZmL0FTSC5MQk0gLXBpeF9mbXQgcmdiMjQKQEAgLTIxNyw3ICsxOTAsNyBAQAogZmF0ZS1pbnRlcnBsYXktbXZlLTE2Yml0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9pbnRlcnBsYXktbXZlL2Rlc2NlbnQzLWxldmVsNS0xNmJpdC1wYXJ0aWFsLm12ZSAtcGl4X2ZtdCByZ2IyNCAtYW4KIAogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBNWEYsIEpQRUcyMDAwKSArPSBmYXRlLWpwZWcyMDAwLWRjaW5lbWEKLWZhdGUtanBlZzIwMDAtZGNpbmVtYTogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtdmNvZGVjIGpwZWcyMDAwIC1pICQoVEFSR0VUX1NBTVBMRVMpL2pwZWcyMDAwL2NoaWVuc19kY2luZW1hMksubXhmIC1waXhfZm10IHh5ejEybGUKK2ZhdGUtanBlZzIwMDAtZGNpbmVtYTogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtYzp2IGpwZWcyMDAwIC1pICQoVEFSR0VUX1NBTVBMRVMpL2pwZWcyMDAwL2NoaWVuc19kY2luZW1hMksubXhmIC1waXhfZm10IHh5ejEybGUKIAogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBKViwgSlYpICs9IGZhdGUtanYKIGZhdGUtanY6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2p2L2ludHJvLmp2IC1hbiAtcGl4X2ZtdCByZ2IyNApAQCAtMjI4LDYgKzIwMSwyNSBAQAogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBBVkksIEtNVkMpICs9IGZhdGUta212YwogZmF0ZS1rbXZjOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9LTVZDL0xPR08xLkFWSSAtYW4gLXQgMyAtcGl4X2ZtdCByZ2IyNAogCitGQVRFX01BR0lDWVVWICs9IGZhdGUtbWFnaWN5dXYteTQ0NDRpIFwKKyAgICAgICAgICAgICAgICAgZmF0ZS1tYWdpY3l1di15NDAwaSAgXAorICAgICAgICAgICAgICAgICBmYXRlLW1hZ2ljeXV2LXk0MjAgICBcCisgICAgICAgICAgICAgICAgIGZhdGUtbWFnaWN5dXYteTQyMmkgIFwKKyAgICAgICAgICAgICAgICAgZmF0ZS1tYWdpY3l1di15NDQ0ICAgXAorICAgICAgICAgICAgICAgICBmYXRlLW1hZ2ljeXV2LXJnYmEgICBcCisgICAgICAgICAgICAgICAgIGZhdGUtbWFnaWN5dXYtcmdiCisKK0ZBVEVfVklERU8tJChjYWxsIERFTURFQywgQVZJLCBNQUdJQ1lVVikgKz0gJChGQVRFX01BR0lDWVVWKQorZmF0ZS1tYWdpY3l1djogJChGQVRFX01BR0lDWVVWKQorCitmYXRlLW1hZ2ljeXV2LXJnYjogICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbWFneS9tYWd5X3JnYl9tZWRpYW4uYXZpCitmYXRlLW1hZ2ljeXV2LXJnYmE6ICAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbWFneS9tYWd5X3JnYmFfZ3JhZGllbnQuYXZpCitmYXRlLW1hZ2ljeXV2LXk0MDBpOiAgQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbWFneS9tYWd5X3l1djQwMF9ncmFkaWVudF9pbnRlcmxhY2VkLmF2aQorZmF0ZS1tYWdpY3l1di15NDIwOiAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL21hZ3kvbWFneV95dXY0MjBfbWVkaWFuLmF2aQorZmF0ZS1tYWdpY3l1di15NDIyaTogIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL21hZ3kvbWFneV95dXY0MjJfbWVkaWFuX2ludGVybGFjZWQuYXZpCitmYXRlLW1hZ2ljeXV2LXk0NDQ0aTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvbWFneS9tYWd5X3l1djQ0NDRfbGVmdF9pbnRlcmxhY2VkLmF2aQorZmF0ZS1tYWdpY3l1di15NDQ0OiAgIENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL21hZ3kvbWFneV95dXY0NDRfbGVmdC5hdmkKKwogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBFQSwgTURFQykgKz0gZmF0ZS1tZGVjCiBmYXRlLW1kZWM6IENNRCA9IGZyYW1lY3JjIC1pZGN0IHNpbXBsZSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9lYS1kY3QvTkZTMkVzcHJpdC1wYXJ0aWFsLmRjdCAtYW4KIApAQCAtMjQxLDEwICsyMzMsMTcgQEAKIGZhdGUtbWpwZWdiOiBDTUQgPSBmcmFtZWNyYyAtaWRjdCBzaW1wbGUgLWZmbGFncyArYml0ZXhhY3QgLWkgJChUQVJHRVRfU0FNUExFUykvbWpwZWdiL21qcGVnYl9wYXJ0Lm1vdiAtYW4KIAogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBNVkksIE1PVElPTlBJWEVMUykgKz0gZmF0ZS1tb3Rpb25waXhlbHMKLWZhdGUtbW90aW9ucGl4ZWxzOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tb3Rpb24tcGl4ZWxzL0lOVFJPLXBhcnRpYWwuTVZJIC1hbiAtcGl4X2ZtdCByZ2IyNCAtdmZyYW1lcyAxMTEKK2ZhdGUtbW90aW9ucGl4ZWxzOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9tb3Rpb24tcGl4ZWxzL0lOVFJPLXBhcnRpYWwuTVZJIC1hbiAtcGl4X2ZtdCByZ2IyNCAtZnJhbWVzOnYgMTExCiAKLUZBVEVfVklERU8tJChjYWxsIERFTURFQywgTVBFR1RTLCBNUEVHMlZJREVPKSArPSBmYXRlLW1wZWcyLWZpZWxkLWVuYwotZmF0ZS1tcGVnMi1maWVsZC1lbmM6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL21wZWcyX2ZpZWxkX2VuY29kaW5nLnRzIC1hbiAtdmZyYW1lcyAzMAorRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBNUEVHVFMsIE1QRUcyVklERU8pICs9IGZhdGUtbXBlZzItZmllbGQtZW5jIGZhdGUtbXBlZzItdGlja2V0MTg2CitmYXRlLW1wZWcyLWZpZWxkLWVuYzogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvbXBlZzJfZmllbGRfZW5jb2RpbmcudHMgLWFuIC1mcmFtZXM6diAzMAorZmF0ZS1tcGVnMi10aWNrZXQxODY6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL3QubXBnIC1hbgorCitGQVRFX1ZJREVPLSQoY2FsbCBERU1ERUMsIE1QRUdQUywgTVBFRzJWSURFTykgKz0gZmF0ZS1tcGVnMi10aWNrZXQ2MDI0CitmYXRlLW1wZWcyLXRpY2tldDYwMjQ6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWlkY3Qgc2ltcGxlIC1mbGFncyArdHJ1bmNhdGVkIC1pICQoVEFSR0VUX1NBTVBMRVMpL21wZWcyL21hdHJpeGJlbmNoX21wZWcyLmxxMS5tcGcgLWFuCisKK0ZBVEVfVklERU8tJChjYWxsIERFTURFQywgTVBFR1ZJREVPLCBNUEVHMlZJREVPKSArPSBmYXRlLW1wZWcyLXRpY2tldDY2NzcKK2ZhdGUtbXBlZzItdGlja2V0NjY3NzogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaWRjdCBzaW1wbGUgLXZzeW5jIGRyb3AgLWkgJChUQVJHRVRfU0FNUExFUykvbXBlZzIvc29ueS1jdDMuYnMKIAogRkFURV9WSURFTy0kKGNhbGwgREVNREVDLCBNViwgTVZDMSkgKz0gZmF0ZS1tdi1tdmMxCiBmYXRlLW12LW12YzE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL212L3Bvc3R1cmUubXYgLWFuIC1mcmFtZXMgMjUgLXBpeF9mbXQgcmdiNTU1bGUKQEAgLTMzMCw3ICszMjksNyBAQAogCiBGQVRFX1ZJREVPLSQoY2FsbCBFTkNERUMsIFY0MTAgUEdNWVVWLCBBVkkgSU1BR0UyKSArPSBmYXRlLXY0MTBlbmMKIGZhdGUtdjQxMGVuYzogJChWUkVGKQotZmF0ZS12NDEwZW5jOiBDTUQgPSBtZDUgLWYgaW1hZ2UyIC12Y29kZWMgcGdteXV2IC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL3ZzeW50aDEvJTAyZC5wZ20gLWZmbGFncyArYml0ZXhhY3QgLXZjb2RlYyB2NDEwIC1mIGF2aQorZmF0ZS12NDEwZW5jOiBDTUQgPSBtZDUgLWYgaW1hZ2UyIC1jOnYgcGdteXV2IC1pICQoVEFSR0VUX1BBVEgpL3Rlc3RzL3ZzeW50aDEvJTAyZC5wZ20gLWZmbGFncyArYml0ZXhhY3QgLWM6diB2NDEwIC1mIGF2aQogCiBGQVRFX1ZJREVPLSQoY2FsbCBERU1ERUMsIFNJRkYsIFZCKSArPSBmYXRlLXZiCiBmYXRlLXZiOiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9TSUZGL0lOVFJPX0IuVkIgLXQgMyAtcGl4X2ZtdCByZ2IyNCAtYW4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvdm9pY2UubWFrIGIvdGVzdHMvZmF0ZS92b2ljZS5tYWsKaW5kZXggNzM4OWM0My4uZjNhMjg5MiAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS92b2ljZS5tYWsKKysrIGIvdGVzdHMvZmF0ZS92b2ljZS5tYWsKQEAgLTcsNyArNyw3IEBACiBmYXRlLWc3MjItZW5jb2RlOiBDTUQgPSBlbmNfZGVjX3BjbSB3YXYgZnJhbWVtZDUgczE2bGUgJChTUkMpIC1jOmEgZzcyMgogCiBGQVRFX1ZPSUNFLXllcyArPSAkKEZBVEVfRzcyMi15ZXMpCi1mYXRlLWc3MjI6ICQoRkFURV9HNzIyKQorZmF0ZS1nNzIyOiAkKEZBVEVfRzcyMi15ZXMpCiAKIEZBVEVfRzcyM18xICs9IGZhdGUtZzcyM18xLWRlYy0xCiBmYXRlLWc3MjNfMS1kZWMtMTogQ01EID0gZnJhbWVjcmMgLXBvc3RmaWx0ZXIgMCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9nNzIzXzEvaW5lcWQ1My50Y28KQEAgLTMzLDggKzMzLDcgQEAKIEZBVEVfRzcyM18xICs9IGZhdGUtZzcyM18xLWRlYy04CiBmYXRlLWc3MjNfMS1kZWMtODogQ01EID0gZnJhbWVjcmMgLXBvc3RmaWx0ZXIgMSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9nNzIzXzEvZHR4NjNlLnRjbwogCi1GQVRFX0c3MjNfMS0kKGNhbGwgREVNREVDLCBHNzIzXzEsIEc3MjNfMSkgKz0gJChGQVRFX0c3MjNfMSkKLUZBVEVfU0FNUExFU19BVkNPTlYgKz0gJChGQVRFX0c3MjNfMS15ZXMpCitGQVRFX1ZPSUNFLSQoY2FsbCBERU1ERUMsIEc3MjNfMSwgRzcyM18xKSArPSAkKEZBVEVfRzcyM18xKQogZmF0ZS1nNzIzXzE6ICQoRkFURV9HNzIzXzEpCiAKIEZBVEVfRzcyNiArPSBmYXRlLWc3MjYtZW5jb2RlLTJiaXQKQEAgLTYyLDcgKzYxLDcgQEAKIGZhdGUtZ3NtLXRvYXN0OiBDTUQgPSBmcmFtZWNyYyAtaSAkKFRBUkdFVF9TQU1QTEVTKS9nc20vc2FtcGxlLWdzbS04MDAwLm1vdiAtdCAxMAogCiBGQVRFX1ZPSUNFLXllcyArPSAkKEZBVEVfR1NNLXllcykKLWZhdGUtZ3NtOiAkKEZBVEVfR1NNKQorZmF0ZS1nc206ICQoRkFURV9HU00teWVzKQogCiBGQVRFX1ZPSUNFLSQoY2FsbCBERU1ERUMsIFFDUCwgUUNFTFApICs9IGZhdGUtcWNlbHAKIGZhdGUtcWNlbHA6IENNRCA9IHBjbSAtaSAkKFRBUkdFVF9TQU1QTEVTKS9xY3AvMDAzNjU4MDg0Ny5RQ1AKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvdm9yYmlzLm1hayBiL3Rlc3RzL2ZhdGUvdm9yYmlzLm1hawppbmRleCA0YjcyMzczLi4zNTRjYzU3IDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL3ZvcmJpcy5tYWsKKysrIGIvdGVzdHMvZmF0ZS92b3JiaXMubWFrCkBAIC0xLDMgKzEsMTEgQEAKK0ZBVEVfVk9SQklTICs9IGZhdGUtdm9yYmlzLWVuY29kZQorZmF0ZS12b3JiaXMtZW5jb2RlOiBDTUQgPSBlbmNfZGVjX3BjbSBvZ2cgd2F2IHMxNmxlICQoVEFSR0VUX1NBTVBMRVMpL2F1ZGlvLXJlZmVyZW5jZS9sdWNreW5pZ2h0XzJjaF80NGtIel9zMTYud2F2IC1jOmEgdm9yYmlzIC1zdHJpY3QgZXhwZXJpbWVudGFsCitmYXRlLXZvcmJpcy1lbmNvZGU6IFJFRiA9ICQoU0FNUExFUykvYXVkaW8tcmVmZXJlbmNlL2x1Y2t5bmlnaHRfMmNoXzQ0a0h6X3MxNi53YXYKK2ZhdGUtdm9yYmlzLWVuY29kZTogQ01QX1NISUZUID0gMAorZmF0ZS12b3JiaXMtZW5jb2RlOiBDTVBfVEFSR0VUID0gMjk2CitmYXRlLXZvcmJpcy1lbmNvZGU6IFNJWkVfVE9MRVJBTkNFID0gMzU2MAorZmF0ZS12b3JiaXMtZW5jb2RlOiBGVVpaID0gMzAKKwogRkFURV9WT1JCSVMgKz0gZmF0ZS12b3JiaXMtMQogZmF0ZS12b3JiaXMtMTogQ01EID0gcGNtIC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZvcmJpcy8xLjAuMS10ZXN0X3NtYWxsLm9nZwogZmF0ZS12b3JiaXMtMTogUkVGID0gJChTQU1QTEVTKS92b3JiaXMvMS4wLjEtdGVzdF9zbWFsbC5wY20KQEAgLTgwLDYgKzg4LDEyIEBACiBmYXRlLXZvcmJpcy0yMDogQ01EID0gcGNtIC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZvcmJpcy82Lm9nZwogZmF0ZS12b3JiaXMtMjA6IFJFRiA9ICQoU0FNUExFUykvdm9yYmlzLzYucGNtCiAKK0ZBVEVfVk9SQklTX0ZGUFJPQkUtJChDT05GSUdfT0dHX0RFTVVYRVIpICs9IGZhdGUtdm9yYmlzLTE4MzMtY2hhcHRlcnMKK2ZhdGUtdm9yYmlzLTE4MzMtY2hhcHRlcnM6IENNRCA9IHByb2JlY2hhcHRlcnMgJChUQVJHRVRfU0FNUExFUykvdm9yYmlzL3ZvcmJpc19jaGFwdGVyX2V4dGVuc2lvbl9kZW1vLm9nZworCitGQVRFX1NBTVBMRVNfRkZQUk9CRSArPSAkKEZBVEVfVk9SQklTX0ZGUFJPQkUteWVzKQorCiBGQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIE9HRywgVk9SQklTKSArPSAkKEZBVEVfVk9SQklTKQotZmF0ZS12b3JiaXM6ICQoRkFURV9WT1JCSVMpCitmYXRlLXZvcmJpczogJChGQVRFX1ZPUkJJUykgJChGQVRFX1ZPUkJJU19GRlBST0JFLXllcykKICQoRkFURV9WT1JCSVMpOiBDTVAgPSBvbmVvZmYKK2ZhdGUtdm9yYmlzLWVuY29kZTogQ01QID0gc3RkZGV2CmRpZmYgLS1naXQgYS90ZXN0cy9mYXRlL3ZweC5tYWsgYi90ZXN0cy9mYXRlL3ZweC5tYWsKaW5kZXggYTQwNjdkMy4uMGJlNWFhMiAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS92cHgubWFrCisrKyBiL3Rlc3RzL2ZhdGUvdnB4Lm1hawpAQCAtMSwzICsxLDI3IEBACitGQVRFX1RSVUVNT1RJT04xICs9IGZhdGUtdHJ1ZW1vdGlvbjEtMTUKK2ZhdGUtdHJ1ZW1vdGlvbjEtMTU6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2R1Y2svcGhhbnQyLTk0MC5kdWsgLXBpeF9mbXQgcmdiMjQgLWFuCisKK0ZBVEVfVFJVRU1PVElPTjEgKz0gZmF0ZS10cnVlbW90aW9uMS0yNAorZmF0ZS10cnVlbW90aW9uMS0yNDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZHVjay9zb25pYzNkYmxhc3RfaW50cm8tcGFydGlhbC5hdmkgLXBpeF9mbXQgcmdiMjQgLWFuCisKK0ZBVEVfU0FNUExFU19BVkNPTlYtJChjYWxsIERFTURFQywgQVZJLCBUUlVFTU9USU9OMSkgKz0gJChGQVRFX1RSVUVNT1RJT04xKQorZmF0ZS10cnVlbW90aW9uMTogJChGQVRFX1RSVUVNT1RJT04xKQorCitGQVRFX1NBTVBMRVNfQVZDT05WLSQoY2FsbCBERU1ERUMsIEFWSSwgVFJVRU1PVElPTjIpICs9IGZhdGUtdHJ1ZW1vdGlvbjIKK2ZhdGUtdHJ1ZW1vdGlvbjI6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2R1Y2svdG0yMC5hdmkKKworRkFURV9UUlVFTU9USU9OMlJUICs9IGZhdGUtdHJ1ZW1vdGlvbjJydC1sb3cKK2ZhdGUtdHJ1ZW1vdGlvbjJydC1sb3c6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2R1Y2svdHIyMF9sb3cuYXZpIC1hbgorCitGQVRFX1RSVUVNT1RJT04yUlQgKz0gZmF0ZS10cnVlbW90aW9uMnJ0LW1pZAorZmF0ZS10cnVlbW90aW9uMnJ0LW1pZDogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvZHVjay90cjIwX21pZC5hdmkgLWFuCisKK0ZBVEVfVFJVRU1PVElPTjJSVCArPSBmYXRlLXRydWVtb3Rpb24ycnQtaGlnaAorZmF0ZS10cnVlbW90aW9uMnJ0LWhpZ2g6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL2R1Y2svdHIyMF9oaWdoLmF2aSAtYW4KKworRkFURV9TQU1QTEVTX0FWQ09OVi0kKGNhbGwgREVNREVDLCBBVkksIFRSVUVNT1RJT04yUlQpICs9ICQoRkFURV9UUlVFTU9USU9OMlJUKQorZmF0ZS10cnVlbW90aW9uMnJ0OiAkKEZBVEVfVFJVRU1PVElPTjJSVCkKKwogRkFURV9WUDMtJChjYWxsIERFTURFQywgTUFUUk9TS0EsIFRIRU9SQSkgKz0gZmF0ZS10aGVvcmEtY29lZmYtbGV2ZWw2NAogZmF0ZS10aGVvcmEtY29lZmYtbGV2ZWw2NDogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDMvY29lZmZfbGV2ZWw2NC5ta3YKIApAQCAtMTksMzIgKzQzLDM4IEBACiBGQVRFX1ZQNi0kKGNhbGwgREVNREVDLCBFQSwgVlA2KSArPSBmYXRlLXZwNjEKIGZhdGUtdnA2MTogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS9lYS12cDYvTW92aWVTa2lybWlzaEdvbmRvci52cDYgLXQgNAogCi1GQVRFX1ZQNi0kKGNhbGwgREVNREVDLCBGTFYsIFZQNkEpICs9IGZhdGUtdnA2YQotZmF0ZS12cDZhOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZsYXNoLXZwNi8zMDB4MTgwLVNjci1mOC0wNTZhbHBoYS5mbHYKK0ZBVEVfVlA2LSQoY2FsbCBERU1ERUMsIE1PViwgVlA2QSkgKz0gZmF0ZS12cDZhCitmYXRlLXZwNmE6IENNRCA9IGZyYW1lY3JjIC1mbGFncyArYml0ZXhhY3QgLWkgJChUQVJHRVRfU0FNUExFUykvZmxhc2gtdnA2LzMwMHgxODAtU2NyLWY4LTA1NmFscGhhLm1vdgogCi1GQVRFX1ZQNi0kKGNhbGwgREVNREVDLCBGTFYsIFZQNkEpICs9IGZhdGUtdnA2YS1za2lwX2FscGhhCi1mYXRlLXZwNmEtc2tpcF9hbHBoYTogQ01EID0gZnJhbWVjcmMgLWZsYWdzICtiaXRleGFjdCAtc2tpcF9hbHBoYSAxIC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZsYXNoLXZwNi8zMDB4MTgwLVNjci1mOC0wNTZhbHBoYS5mbHYKK0ZBVEVfVlA2LSQoY2FsbCBERU1ERUMsIE1PViwgVlA2QSkgKz0gZmF0ZS12cDZhLXNraXBfYWxwaGEKK2ZhdGUtdnA2YS1za2lwX2FscGhhOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1za2lwX2FscGhhIDEgLWkgJChUQVJHRVRfU0FNUExFUykvZmxhc2gtdnA2LzMwMHgxODAtU2NyLWY4LTA1NmFscGhhLm1vdgogCiBGQVRFX1ZQNi0kKGNhbGwgREVNREVDLCBGTFYsIFZQNkYpICs9IGZhdGUtdnA2ZgogZmF0ZS12cDZmOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL2ZsYXNoLXZwNi9jbGlwMTAyNC5mbHYKIAotRkFURV9WUDgtJChjYWxsIERFTURFQywgRkxWLCBWUDgpICs9IGZhdGUtdnA4LWFscGhhCi1mYXRlLXZwOC1hbHBoYTogQ01EID0gZnJhbWVjcmMgLWkgJChUQVJHRVRfU0FNUExFUykvdnA4X2FscGhhL3ZwOF92aWRlb193aXRoX2FscGhhLndlYm0gLXZjb2RlYyBjb3B5CitGQVRFX1ZQOC0kKENPTkZJR19NQVRST1NLQV9ERU1VWEVSKSArPSBmYXRlLXZwOC1hbHBoYQorZmF0ZS12cDgtYWxwaGE6IENNRCA9IGZyYW1lY3JjIC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOF9hbHBoYS92cDhfdmlkZW9fd2l0aF9hbHBoYS53ZWJtIC1jOnYgY29weQogCi1GQVRFX1ZQOC0kKGNhbGwgREVNREVDLCBXRUJNX0RBU0hfTUFOSUZFU1QsIFZQOCkgKz0gZmF0ZS13ZWJtLWRhc2gtbWFuaWZlc3QKLWZhdGUtd2VibS1kYXNoLW1hbmlmZXN0OiBDTUQgPSBydW4gJChGRk1QRUcpIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF92aWRlbzEud2VibSAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWkgJChUQVJHRVRfU0FNUExFUykvdnA4L2Rhc2hfdmlkZW8yLndlYm0gLWYgd2VibV9kYXNoX21hbmlmZXN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX2F1ZGlvMS53ZWJtIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF9hdWRpbzIud2VibSAtYyBjb3B5IC1tYXAgMCAtbWFwIDEgLW1hcCAyIC1tYXAgMyAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWFkYXB0YXRpb25fc2V0cyAiaWQ9MCxzdHJlYW1zPTAsMSBpZD0xLHN0cmVhbXM9MiwzIiAtCitGQVRFX1ZQOC0kKENPTkZJR19XRUJNX0RBU0hfTUFOSUZFU1RfREVNVVhFUikgKz0gZmF0ZS13ZWJtLWRhc2gtbWFuaWZlc3QKK2ZhdGUtd2VibS1kYXNoLW1hbmlmZXN0OiBDTUQgPSBydW4gJChGRk1QRUcpIC1ub3N0ZGluIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF92aWRlbzEud2VibSAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWkgJChUQVJHRVRfU0FNUExFUykvdnA4L2Rhc2hfdmlkZW8yLndlYm0gLWYgd2VibV9kYXNoX21hbmlmZXN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX2F1ZGlvMS53ZWJtIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF9hdWRpbzIud2VibSAtYyBjb3B5IC1tYXAgMCAtbWFwIDEgLW1hcCAyIC1tYXAgMyAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWFkYXB0YXRpb25fc2V0cyAiaWQ9MCxzdHJlYW1zPTAsMSBpZD0xLHN0cmVhbXM9MiwzIiAtCiAKLUZBVEVfVlA4LSQoY2FsbCBERU1ERUMsIFdFQk1fREFTSF9NQU5JRkVTVCwgVlA4KSArPSBmYXRlLXdlYm0tZGFzaC1tYW5pZmVzdC11bmFsaWduZWQtdmlkZW8tc3RyZWFtcwotZmF0ZS13ZWJtLWRhc2gtbWFuaWZlc3QtdW5hbGlnbmVkLXZpZGVvLXN0cmVhbXM6IENNRCA9IHJ1biAkKEZGTVBFRykgLWYgd2VibV9kYXNoX21hbmlmZXN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX3ZpZGVvMS53ZWJtIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF92aWRlbzMud2VibSAtYyBjb3B5IC1tYXAgMCAtbWFwIDEgLWYgd2VibV9kYXNoX21hbmlmZXN0IC1hZGFwdGF0aW9uX3NldHMgImlkPTAsc3RyZWFtcz0wLDEiIC0KK0ZBVEVfVlA4LSQoQ09ORklHX1dFQk1fREFTSF9NQU5JRkVTVF9ERU1VWEVSKSArPSBmYXRlLXdlYm0tZGFzaC1tYW5pZmVzdC11bmFsaWduZWQtdmlkZW8tc3RyZWFtcworZmF0ZS13ZWJtLWRhc2gtbWFuaWZlc3QtdW5hbGlnbmVkLXZpZGVvLXN0cmVhbXM6IENNRCA9IHJ1biAkKEZGTVBFRykgLW5vc3RkaW4gLWYgd2VibV9kYXNoX21hbmlmZXN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX3ZpZGVvMS53ZWJtIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF92aWRlbzMud2VibSAtYyBjb3B5IC1tYXAgMCAtbWFwIDEgLWYgd2VibV9kYXNoX21hbmlmZXN0IC1hZGFwdGF0aW9uX3NldHMgImlkPTAsc3RyZWFtcz0wLDEiIC0KIAotRkFURV9WUDgtJChjYWxsIERFTURFQywgV0VCTV9EQVNIX01BTklGRVNULCBWUDgpICs9IGZhdGUtd2VibS1kYXNoLW1hbmlmZXN0LXVuYWxpZ25lZC1hdWRpby1zdHJlYW1zCi1mYXRlLXdlYm0tZGFzaC1tYW5pZmVzdC11bmFsaWduZWQtYXVkaW8tc3RyZWFtczogQ01EID0gcnVuICQoRkZNUEVHKSAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWkgJChUQVJHRVRfU0FNUExFUykvdnA4L2Rhc2hfYXVkaW8xLndlYm0gLWYgd2VibV9kYXNoX21hbmlmZXN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX2F1ZGlvMy53ZWJtIC1jIGNvcHkgLW1hcCAwIC1tYXAgMSAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWFkYXB0YXRpb25fc2V0cyAiaWQ9MCxzdHJlYW1zPTAsMSIgLQorRkFURV9WUDgtJChDT05GSUdfV0VCTV9EQVNIX01BTklGRVNUX0RFTVVYRVIpICs9IGZhdGUtd2VibS1kYXNoLW1hbmlmZXN0LXVuYWxpZ25lZC1hdWRpby1zdHJlYW1zCitmYXRlLXdlYm0tZGFzaC1tYW5pZmVzdC11bmFsaWduZWQtYXVkaW8tc3RyZWFtczogQ01EID0gcnVuICQoRkZNUEVHKSAtbm9zdGRpbiAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWkgJChUQVJHRVRfU0FNUExFUykvdnA4L2Rhc2hfYXVkaW8xLndlYm0gLWYgd2VibV9kYXNoX21hbmlmZXN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX2F1ZGlvMy53ZWJtIC1jIGNvcHkgLW1hcCAwIC1tYXAgMSAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWFkYXB0YXRpb25fc2V0cyAiaWQ9MCxzdHJlYW1zPTAsMSIgLQogCi1GQVRFX1ZQOC0kKGNhbGwgREVNREVDLCBXRUJNX0RBU0hfTUFOSUZFU1QsIFZQOCkgKz0gZmF0ZS13ZWJtLWRhc2gtbWFuaWZlc3QtcmVwcmVzZW50YXRpb25zCi1mYXRlLXdlYm0tZGFzaC1tYW5pZmVzdC1yZXByZXNlbnRhdGlvbnM6IENNRCA9IHJ1biAkKEZGTVBFRykgLWYgd2VibV9kYXNoX21hbmlmZXN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX3ZpZGVvMS53ZWJtIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF92aWRlbzQud2VibSAtYyBjb3B5IC1tYXAgMCAtbWFwIDEgLWYgd2VibV9kYXNoX21hbmlmZXN0IC1hZGFwdGF0aW9uX3NldHMgImlkPTAsc3RyZWFtcz0wLDEiIC0KK0ZBVEVfVlA4LSQoQ09ORklHX1dFQk1fREFTSF9NQU5JRkVTVF9ERU1VWEVSKSArPSBmYXRlLXdlYm0tZGFzaC1tYW5pZmVzdC1yZXByZXNlbnRhdGlvbnMKK2ZhdGUtd2VibS1kYXNoLW1hbmlmZXN0LXJlcHJlc2VudGF0aW9uczogQ01EID0gcnVuICQoRkZNUEVHKSAtbm9zdGRpbiAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWkgJChUQVJHRVRfU0FNUExFUykvdnA4L2Rhc2hfdmlkZW8xLndlYm0gLWYgd2VibV9kYXNoX21hbmlmZXN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX3ZpZGVvNC53ZWJtIC1jIGNvcHkgLW1hcCAwIC1tYXAgMSAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWFkYXB0YXRpb25fc2V0cyAiaWQ9MCxzdHJlYW1zPTAsMSIgLQogCi1GQVRFX1ZQOC0kKGNhbGwgREVNREVDLCBXRUJNX0RBU0hfTUFOSUZFU1QsIFZQOCkgKz0gZmF0ZS13ZWJtLWRhc2gtbWFuaWZlc3QtbGl2ZQotZmF0ZS13ZWJtLWRhc2gtbWFuaWZlc3QtbGl2ZTogQ01EID0gcnVuICQoRkZNUEVHKSAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWxpdmUgMSAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF9saXZlX3ZpZGVvXzM2MC5oZHIgLWYgd2VibV9kYXNoX21hbmlmZXN0IC1saXZlIDEgLWkgJChUQVJHRVRfU0FNUExFUykvdnA4L2Rhc2hfbGl2ZV9hdWRpb18xNzEuaGRyIC1jIGNvcHkgLW1hcCAwIC1tYXAgMSAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWxpdmUgMSAtYWRhcHRhdGlvbl9zZXRzICJpZD0wLHN0cmVhbXM9MCBpZD0xLHN0cmVhbXM9MSIgLWNodW5rX3N0YXJ0X2luZGV4IDEgLWNodW5rX2R1cmF0aW9uX21zIDUwMDAgLXRpbWVfc2hpZnRfYnVmZmVyX2RlcHRoIDcyMDAgLW1pbmltdW1fdXBkYXRlX3BlcmlvZCA2MCAtZGVidWdfbW9kZSAxIC0KK0ZBVEVfVlA4LSQoQ09ORklHX1dFQk1fREFTSF9NQU5JRkVTVF9ERU1VWEVSKSArPSBmYXRlLXdlYm0tZGFzaC1tYW5pZmVzdC1saXZlCitmYXRlLXdlYm0tZGFzaC1tYW5pZmVzdC1saXZlOiBDTUQgPSBydW4gJChGRk1QRUcpIC1ub3N0ZGluIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtbGl2ZSAxIC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX2xpdmVfdmlkZW9fMzYwLmhkciAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWxpdmUgMSAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF9saXZlX2F1ZGlvXzE3MS5oZHIgLWMgY29weSAtbWFwIDAgLW1hcCAxIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtbGl2ZSAxIC1hZGFwdGF0aW9uX3NldHMgImlkPTAsc3RyZWFtcz0wIGlkPTEsc3RyZWFtcz0xIiAtY2h1bmtfc3RhcnRfaW5kZXggMSAtY2h1bmtfZHVyYXRpb25fbXMgNTAwMCAtdGltZV9zaGlmdF9idWZmZXJfZGVwdGggNzIwMCAtbWluaW11bV91cGRhdGVfcGVyaW9kIDYwIC1kZWJ1Z19tb2RlIDEgLQorCitGQVRFX1ZQOC0kKENPTkZJR19XRUJNX0RBU0hfTUFOSUZFU1RfREVNVVhFUikgKz0gZmF0ZS13ZWJtLWRhc2gtbWFuaWZlc3QtbGl2ZS1iYW5kd2lkdGgKK2ZhdGUtd2VibS1kYXNoLW1hbmlmZXN0LWxpdmUtYmFuZHdpZHRoOiBDTUQgPSBydW4gJChGRk1QRUcpIC1ub3N0ZGluIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtbGl2ZSAxIC1iYW5kd2lkdGggMTAwIC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9kYXNoX2xpdmVfdmlkZW9fMzYwLmhkciAtZiB3ZWJtX2Rhc2hfbWFuaWZlc3QgLWxpdmUgMSAtYmFuZHdpZHRoIDIwMCAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgvZGFzaF9saXZlX2F1ZGlvXzE3MS5oZHIgLWMgY29weSAtbWFwIDAgLW1hcCAxIC1mIHdlYm1fZGFzaF9tYW5pZmVzdCAtbGl2ZSAxIC1hZGFwdGF0aW9uX3NldHMgImlkPTAsc3RyZWFtcz0wIGlkPTEsc3RyZWFtcz0xIiAtY2h1bmtfc3RhcnRfaW5kZXggMSAtY2h1bmtfZHVyYXRpb25fbXMgNTAwMCAtdGltZV9zaGlmdF9idWZmZXJfZGVwdGggNzIwMCAtbWluaW11bV91cGRhdGVfcGVyaW9kIDYwIC1kZWJ1Z19tb2RlIDEgLQorCitGQVRFX1ZQOC0kKGNhbGwgREVNREVDLCBNQVRST1NLQSwgVlA4KSArPSBmYXRlLXZwOC0yNDUxCitmYXRlLXZwOC0yNDUxOiBDTUQgPSBmcmFtZWNyYyAtZmxhZ3MgK2JpdGV4YWN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9SUlNGNDktc2hvcnQud2VibSAtdnN5bmMgY2ZyIC1hbgogCiBGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9WUDYteWVzKQogZmF0ZS12cDY6ICQoRkFURV9WUDYteWVzKQpAQCAtNTUsNyArODUsNyBAQAogVlA4X1NVSVRFID0gMDAxIDAwMiAwMDMgMDA0IDAwNSAwMDYgMDA3IDAwOCAwMDkgMDEwIDAxMSAwMTIgMDEzIDAxNCAwMTUgMDE2IDAxNwogCiBkZWZpbmUgRkFURV9WUDhfU1VJVEUKLUZBVEVfVlA4LSQoQ09ORklHX0lWRl9ERU1VWEVSKSArPSBmYXRlLXZwOC10ZXN0LXZlY3RvciQoMiktJCgxKQorRkFURV9WUDgtJChjYWxsIERFTURFQywgSVZGLCBWUDgpICs9IGZhdGUtdnA4LXRlc3QtdmVjdG9yJCgyKS0kKDEpCiBmYXRlLXZwOC10ZXN0LXZlY3RvciQoMiktJCgxKTogQ01EID0gZnJhbWVtZDUgJCgzKSAtaSAkKFRBUkdFVF9TQU1QTEVTKS92cDgtdGVzdC12ZWN0b3JzLXIxL3ZwODAtMDAtY29tcHJlaGVuc2l2ZS0kKDEpLml2ZgogZmF0ZS12cDgtdGVzdC12ZWN0b3IkKDIpLSQoMSk6IFJFRiA9ICQoU1JDX1BBVEgpL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0kKDEpCiBlbmRlZgpAQCAtNjUsMTggKzk1LDE4IEBACiAKICMgRklYTUUgdGhpcyBmaWxlIGNvbnRhaW5zIHR3byBmcmFtZXMgd2l0aCBpZGVudGljYWwgdGltZXN0YW1wcywKICMgc28gZmZtcGVnIGRyb3BzIG9uZSBvZiB0aGVtCi1GQVRFX1ZQOC0kKENPTkZJR19JVkZfREVNVVhFUikgKz0gZmF0ZS12cDgtc2lnbi1iaWFzJCgxKQorRkFURV9WUDgtJChjYWxsIERFTURFQywgSVZGLCBWUDgpICs9IGZhdGUtdnA4LXNpZ24tYmlhcyQoMSkKIGZhdGUtdnA4LXNpZ24tYmlhcyQoMSk6IENNRCA9IGZyYW1lbWQ1ICQoMikgLWkgJChUQVJHRVRfU0FNUExFUykvdnA4L3NpbnRlbC1zaWduYmlhcy5pdmYKIGZhdGUtdnA4LXNpZ24tYmlhcyQoMSk6IFJFRiA9ICQoU1JDX1BBVEgpL3Rlc3RzL3JlZi9mYXRlL3ZwOC1zaWduLWJpYXMKIAotRkFURV9WUDgtJChDT05GSUdfTUFUUk9TS0FfREVNVVhFUikgKz0gZmF0ZS12cDgtc2l6ZS1jaGFuZ2UkKDEpCitGQVRFX1ZQOC0kKGNhbGwgREVNREVDLCBNQVRST1NLQSwgVlA4KSArPSBmYXRlLXZwOC1zaXplLWNoYW5nZSQoMSkKIGZhdGUtdnA4LXNpemUtY2hhbmdlJCgxKTogQ01EID0gZnJhbWVtZDUgJCgyKSAtZmxhZ3MgK2JpdGV4YWN0IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZwOC9mcmFtZV9zaXplX2NoYW5nZS53ZWJtIC1mcmFtZXM6diAzMCAtc3dzX2ZsYWdzIGJpdGV4YWN0K2JpbGluZWFyCiBmYXRlLXZwOC1zaXplLWNoYW5nZSQoMSk6IFJFRiA9ICQoU1JDX1BBVEgpL3Rlc3RzL3JlZi9mYXRlL3ZwOC1zaXplLWNoYW5nZQogZW5kZWYKIAogJChldmFsICQoY2FsbCBGQVRFX1ZQOF9GVUxMKSkKIAotRkFURV9TQU1QTEVTX0FWQ09OVi0kKENPTkZJR19WUDhfREVDT0RFUikgKz0gJChGQVRFX1ZQOC15ZXMpCitGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9WUDgteWVzKQogZmF0ZS12cDg6ICQoRkFURV9WUDgteWVzKQogCiBkZWZpbmUgRkFURV9WUDlfU1VJVEUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZhdGUvdnFmLm1hayBiL3Rlc3RzL2ZhdGUvdnFmLm1hawppbmRleCA0MGU3MDIxLi5kZjVmZjQ0IDEwMDY0NAotLS0gYS90ZXN0cy9mYXRlL3ZxZi5tYWsKKysrIGIvdGVzdHMvZmF0ZS92cWYubWFrCkBAIC00LDcgKzQsNyBAQAogZmF0ZS10d2ludnE6IFJFRiA9ICQoU0FNUExFUykvdnFmL2FjaHRlcmJhLnBjbQogCiBGQVRFX1ZRRi0kKENPTkZJR19WUUZfREVNVVhFUikgKz0gZmF0ZS12cWYtZGVtdXgKLWZhdGUtdnFmLWRlbXV4OiBDTUQgPSBtZDUgLWkgJChUQVJHRVRfU0FNUExFUykvdnFmL2FjaHRlcmJhLnZxZiAtYWNvZGVjIGNvcHkgLWZsYWdzIGJpdGV4YWN0IC1mZmxhZ3MgK2JpdGV4YWN0IC1mIGZyYW1lY3JjCitmYXRlLXZxZi1kZW11eDogQ01EID0gbWQ1IC1pICQoVEFSR0VUX1NBTVBMRVMpL3ZxZi9hY2h0ZXJiYS52cWYgLWM6YSBjb3B5IC1mbGFncyBiaXRleGFjdCAtZmZsYWdzICtiaXRleGFjdCAtZiBmcmFtZWNyYwogCiBGQVRFX1ZRRiArPSAkKEZBVEVfVlFGLXllcykKIApkaWZmIC0tZ2l0IGEvdGVzdHMvZmF0ZS93YXZwYWNrLm1hayBiL3Rlc3RzL2ZhdGUvd2F2cGFjay5tYWsKaW5kZXggYTgyNWEwMi4uZTRlOGQ0NyAxMDA2NDQKLS0tIGEvdGVzdHMvZmF0ZS93YXZwYWNrLm1haworKysgYi90ZXN0cy9mYXRlL3dhdnBhY2subWFrCkBAIC04OSwxNCArODksMTQgQEAKIGZhdGUtd2F2cGFjay1tYXRyb3NrYW1vZGU6IENNRCA9IG1kNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS93YXZwYWNrL3NwZWNpYWwvbWF0cm9za2FfbW9kZS5ta2EgLWYgczE2bGUKIAogRkFURV9XQVZQQUNLLSQoY2FsbCBERU1NVVgsIFdWLCBNQVRST1NLQSkgKz0gZmF0ZS13YXZwYWNrLW1hdHJvc2thX211eC1tb25vCi1mYXRlLXdhdnBhY2stbWF0cm9za2FfbXV4LW1vbm86IENNRCA9IG1kNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS93YXZwYWNrL251bV9jaGFubmVscy9tb25vXzE2Yml0X2ludC53diAtYyBjb3B5IC1mZmxhZ3MgK2JpdGV4YWN0IC1mIG1hdHJvc2thCitmYXRlLXdhdnBhY2stbWF0cm9za2FfbXV4LW1vbm86IENNRCA9IG1kNXBpcGUgLWkgJChUQVJHRVRfU0FNUExFUykvd2F2cGFjay9udW1fY2hhbm5lbHMvbW9ub18xNmJpdF9pbnQud3YgLWMgY29weSAtZmZsYWdzICtiaXRleGFjdCAtZiBtYXRyb3NrYQogZmF0ZS13YXZwYWNrLW1hdHJvc2thX211eC1tb25vOiBDTVAgPSBvbmVsaW5lCi1mYXRlLXdhdnBhY2stbWF0cm9za2FfbXV4LW1vbm86IFJFRiA9IDRiZWZjYzQxZGFiNmM2OTBhMTVkMGMzOTZjMzI0NDY4CitmYXRlLXdhdnBhY2stbWF0cm9za2FfbXV4LW1vbm86IFJFRiA9IDExNzczZTJhNTE4ZWRjNzg4NDc1ZjM4ODBkODQ5MjMwCiAKIEZBVEVfV0FWUEFDSy0kKGNhbGwgREVNTVVYLCBXViwgTUFUUk9TS0EpICs9IGZhdGUtd2F2cGFjay1tYXRyb3NrYV9tdXgtNjEKLWZhdGUtd2F2cGFjay1tYXRyb3NrYV9tdXgtNjE6IENNRCA9IG1kNSAtaSAkKFRBUkdFVF9TQU1QTEVTKS93YXZwYWNrL251bV9jaGFubmVscy9ldmFfMi4yMl82LjFfMTZiaXQtcGFydGlhbC53diAtYyBjb3B5IC1mZmxhZ3MgK2JpdGV4YWN0IC1mIG1hdHJvc2thCitmYXRlLXdhdnBhY2stbWF0cm9za2FfbXV4LTYxOiBDTUQgPSBtZDVwaXBlIC1pICQoVEFSR0VUX1NBTVBMRVMpL3dhdnBhY2svbnVtX2NoYW5uZWxzL2V2YV8yLjIyXzYuMV8xNmJpdC1wYXJ0aWFsLnd2IC1jIGNvcHkgLWZmbGFncyArYml0ZXhhY3QgLWYgbWF0cm9za2EKIGZhdGUtd2F2cGFjay1tYXRyb3NrYV9tdXgtNjE6IENNUCA9IG9uZWxpbmUKLWZhdGUtd2F2cGFjay1tYXRyb3NrYV9tdXgtNjE6IFJFRiA9IDdmZWRiZmMzYjllYTczNDg3NjFkYjY2NDYyNmMyOWY0CitmYXRlLXdhdnBhY2stbWF0cm9za2FfbXV4LTYxOiBSRUYgPSA5NjQxYWJkZjU5NmMxMGMyZTIxYmQ5YjAyNmQ0YmFkZQogCiBGQVRFX1NBTVBMRVNfQVZDT05WICs9ICQoRkFURV9XQVZQQUNLLXllcykKIGZhdGUtd2F2cGFjazogJChGQVRFX1dBVlBBQ0steWVzKQpkaWZmIC0tZ2l0IGEvdGVzdHMvZmZzZXJ2ZXItcmVncmVzc2lvbi5zaCBiL3Rlc3RzL2Zmc2VydmVyLXJlZ3Jlc3Npb24uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE5MmQzNjIuLjAwMDAwMDAKLS0tIGEvdGVzdHMvZmZzZXJ2ZXItcmVncmVzc2lvbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jcGVybCAtZSAnY2hvbXAoJHdkID0gYHB3ZGApOyBwcmludCBtYXAgeyBzIXRlc3RzL2RhdGEvISE7ICI8U3RyZWFtICRfPlxuRmlsZSAkd2QvdGVzdHMvZGF0YS8kX1xuPC9TdHJlYW0+XG5cbiIgfSBAQVJHVicgdGVzdHMvZGF0YS9hKiA+PiB0ZXN0cy9kYXRhL2Zmc2VydmVyLmNvbmYKLSNwZXJsIC1lICdjaG9tcCgkd2QgPSBgcHdkYCk7IHByaW50IG1hcCB7IHMhdGVzdHMvZGF0YS8hITsgIjxTdHJlYW0gJF8uYXNmPlxuRmlsZSAkd2QvdGVzdHMvZGF0YS8kX1xuPC9TdHJlYW0+XG5cbiIgfSBAQVJHVicgdGVzdHMvZGF0YS9hKiA+PiB0ZXN0cy9kYXRhL2Zmc2VydmVyLmNvbmYKLQotLiAkKGRpcm5hbWUgJDApL21kNS5zaAotCi1GSUxFUz0kKHNlZCAtbiAncy9eW14jXSo8U3RyZWFtIFwoLipcKT4uKi9cMS9wJyAkMiB8IGdyZXAgLXYgaHRtbCkKLQotcm0gLWYgdGVzdHMvZmVlZDEuZmZtCi0uL2Zmc2VydmVyJHtQUk9HU1VGfSAtZCAtZiAiJDIiIDI+IC9kZXYvbnVsbCAmCi1GRlNFUlZFUl9QSUQ9JCEKLWVjaG8gIldhaXRpbmcgZm9yIGZlZWRzIHRvIHN0YXJ0dXAuLi4iCi1zbGVlcCAyCi0oCi0gICAgY2QgdGVzdHMvZGF0YSB8fCBleGl0ICQ/Ci0gICAgcm0gLWYgZmYtKiBmZnNlcnZlci5yZWdyZXNzaW9uCi0gICAgV0dFVF9PUFRJT05TPSItLXVzZXItYWdlbnQ9TlNQbGF5ZXIgLXEgLS1wcm94eT1vZmYgLWUgdmVyYm9zZT1vZmYgLWUgc2VydmVyX3Jlc3BvbnNlPW9mZiIKLSAgICBmb3IgZmlsZSBpbiAkRklMRVM7IGRvCi0gICAgICAgIGlmIFsgJChleHByICRmaWxlIDogImEtKiIpICE9IDAgXTsgdGhlbgotICAgICAgICAgICAgd2dldCAkV0dFVF9PUFRJT05TIC1PIC0gaHR0cDovL2xvY2FsaG9zdDo5OTk5LyRmaWxlID4gZmYtJGZpbGUKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgd2dldCAkV0dFVF9PUFRJT05TIC1PIC0gaHR0cDovL2xvY2FsaG9zdDo5OTk5LyRmaWxlP2RhdGU9MTk3MDAxMDFUMDAwMDAwWiB8IGRkIGJzPTEgY291bnQ9MjAwMDAgPiBmZi0kZmlsZSAyPi9kZXYvbnVsbAotICAgICAgICBmaQotICAgICAgICBkb19tZDVzdW0gZmYtJGZpbGUgPj5mZnNlcnZlci5yZWdyZXNzaW9uCi0gICAgZG9uZQotKQota2lsbCAkRkZTRVJWRVJfUElECi13YWl0ID4gL2Rldi9udWxsIDI+JjEKLXJtIC1mIHRlc3RzL2ZlZWQxLmZmbQotaWYgZGlmZiAtdSAiJDEiIHRlc3RzL2RhdGEvZmZzZXJ2ZXIucmVncmVzc2lvbjsgdGhlbgotICAgIGVjaG8KLSAgICBlY2hvIFNlcnZlciByZWdyZXNzaW9uIHRlc3Qgc3VjY2VlZGVkLgotICAgIGV4aXQgMAotZWxzZQotICAgIGVjaG8KLSAgICBlY2hvIFNlcnZlciByZWdyZXNzaW9uIHRlc3Q6IEVycm9yLgotICAgIGV4aXQgMQotZmkKZGlmZiAtLWdpdCBhL3Rlc3RzL2Zmc2VydmVyLmNvbmYgYi90ZXN0cy9mZnNlcnZlci5jb25mCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTM1ZDdmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL2Zmc2VydmVyLmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotIwotIyBUaGlzIGlzIGEgdGVzdCBjb25maWd1cmF0aW9uIGZpbGUuIFlvdSBjYW4gaW52b2tlIGl0IHdpdGgKLSMgLi4vZmZzZXJ2ZXIgLWYgZmZzZXJ2ZXIuY29uZgotIyB3aGVuIGluIHRoZSB0ZXN0cyBkaXJlY3RvcnkgYW5kIG9uY2UgdGhlIHZzeW50aDEgc3ViZGlyZWN0b3J5Ci0jIGhhcyBiZWVuIHBvcHVsYXRlZC4gVGhlbiBwb2ludCB5b3VyIGJyb3dzZXIgYXQgaHR0cDovL3doYXRldmVyOjk5OTkvdGVzdHN0YXQuaHRtbAotIyBhbmQgeW91IGNhbiBsb29rIGF0IHRoZSBzdHJlYW1zCi0jCi0KLSMKLSMgUG9ydCBvbiB3aGljaCB0aGUgc2VydmVyIGlzIGxpc3RlbmluZy4gWW91IG11c3Qgc2VsZWN0IGEgZGlmZmVyZW50Ci0jIHBvcnQgZnJvbSB5b3VyIHN0YW5kYXJkIGh0dHAgd2ViIHNlcnZlciBpZiBpdCBpcyBydW5uaW5nIG9uIHRoZSBzYW1lCi0jIGNvbXB1dGVyLgotCi1IVFRQUG9ydCA5OTk5Ci1SVFNQUG9ydCA5OTkwCi0KLSMgQWRkcmVzcyBvbiB3aGljaCB0aGUgc2VydmVyIGlzIGJvdW5kLiBPbmx5IHVzZWZ1bCBpZiB5b3UgaGF2ZQotIyBzZXZlcmFsIG5ldHdvcmsgaW50ZXJmYWNlcy4KLQotSFRUUEJpbmRBZGRyZXNzIDAuMC4wLjAKLQotIyBOdW1iZXIgb2Ygc2ltdWx0YW5lb3VzIHJlcXVlc3RzIHRoYXQgY2FuIGJlIGhhbmRsZWQuIFNpbmNlIEZGU2VydmVyCi0jIGlzIHZlcnkgZmFzdCwgdGhpcyBsaW1pdCBpcyBkZXRlcm1pbmVkIG1haW5seSBieSB5b3VyIEludGVybmV0Ci0jIGNvbm5lY3Rpb24gc3BlZWQuCi0KLU1heENsaWVudHMgMTAwMAotCi1NYXhCYW5kd2lkdGggMTAwMDAwCi0KLSMgQWNjZXNzIExvZyBmaWxlICh1c2VzIHN0YW5kYXJkIEFwYWNoZSBsb2cgZmlsZSBmb3JtYXQpCi0jICctJyBpcyB0aGUgc3RhbmRhcmQgb3V0cHV0Ci0KLUN1c3RvbUxvZyAtCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBEZWZpbml0aW9uIG9mIHRoZSBsaXZlIGZlZWRzLiBFYWNoIGxpdmUgZmVlZCBjb250YWlucyBvbmUgdmlkZW8KLSMgYW5kL29yIGF1ZGlvIHNlcXVlbmNlIGNvbWluZyBmcm9tIGFuIGZmbXBlZyBlbmNvZGVyIG9yIGFub3RoZXIKLSMgZmZzZXJ2ZXIuIFRoaXMgc2VxdWVuY2UgbWF5IGJlIGVuY29kZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCBzZXZlcmFsCi0jIGNvZGVjcyBhdCBzZXZlcmFsIHJlc29sdXRpb25zLgotCi08RmVlZCBmZWVkMS5mZm0+Ci0KLSMgWW91IG11c3QgdXNlICdmZm1wZWcnIHRvIHNlbmQgYSBsaXZlIGZlZWQgdG8gZmZzZXJ2ZXIuIEluIHRoaXMKLSMgZXhhbXBsZSwgeW91IGNhbiB0eXBlOgotIwotIyBmZm1wZWcgaHR0cDovL2xvY2FsaG9zdDo4MDkwL2ZlZWQxLmZmbQotCi0jIGZmc2VydmVyIGNhbiBhbHNvIGRvIHRpbWUgc2hpZnRpbmcuIEl0IG1lYW5zIHRoYXQgaXQgY2FuIHN0cmVhbSBhbnkKLSMgcHJldmlvdXNseSByZWNvcmRlZCBsaXZlIHN0cmVhbS4gVGhlIHJlcXVlc3Qgc2hvdWxkIGNvbnRhaW46Ci0jICJodHRwOi8veHh4eD9kYXRlPVtZWVlZLU1NLUREVF1bW0hIOl1NTTpdU1NbLm0uLi5dIi5Zb3UgbXVzdCBzcGVjaWZ5Ci0jIGEgcGF0aCB3aGVyZSB0aGUgZmVlZCBpcyBzdG9yZWQgb24gZGlzay4gWW91IGFsc28gc3BlY2lmeSB0aGUKLSMgbWF4aW11bSBzaXplIG9mIHRoZSBmZWVkICgxMDBNIGJ5dGVzIGhlcmUpLiBEZWZhdWx0OgotIyBGaWxlPS90bXAvZmVlZF9uYW1lLmZmbSBGaWxlTWF4U2l6ZT01TQotCi1GaWxlIHRlc3RzL2ZlZWQxLmZmbQotRmlsZU1heFNpemUgMTAwTQotCi0jIEZpcmUgdXAgZmZtcGVnIHBvaW50aW5nIGF0IHRoaXMgc3RyZWFtCi0KLUxhdW5jaCAuL2ZmbXBlZyAtdiAwIC15IC1mIGltYWdlMiAtaSB0ZXN0cy92c3ludGgxLyUwMmQucGdtCi0KLUFDTCBhbGxvdyBsb2NhbGhvc3QKLTwvRmVlZD4KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIE5vdyB5b3UgY2FuIGRlZmluZSBlYWNoIHN0cmVhbSB3aGljaCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZQotIyBvcmlnaW5hbCBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtLiBFYWNoIGZvcm1hdCBoYXMgYSBmaWxlbmFtZSAoaGVyZQotIyAndGVzdDEyOC5tcGcnKS4gRkZTZXJ2ZXIgd2lsbCBzZW5kIHRoaXMgc3RyZWFtIHdoZW4gYW5zd2VyaW5nIGEKLSMgcmVxdWVzdCBjb250YWluaW5nIHRoaXMgZmlsZW5hbWUuCi0KLTxTdHJlYW0gdGVzdF9oLmF2aT4KLUZlZWQgZmVlZDEuZmZtCi1Gb3JtYXQgYXZpCi0jCi1CaXRFeGFjdAotRGN0RmFzdGludAotSWRjdFNpbXBsZQotVmlkZW9GcmFtZVJhdGUgMTAKLVZpZGVvU2l6ZSAzNTJ4Mjg4Ci1WaWRlb0JpdFJhdGUgMTAwCi1WaWRlb0dvcFNpemUgMzAKLU5vQXVkaW8KLQotUHJlUm9sbCAxMAotU3RhcnRTZW5kT25LZXkKLU1heFRpbWUgMTAwCi0KLTwvU3RyZWFtPgotCi08U3RyZWFtIHRlc3RfbC5hdmk+Ci1GZWVkIGZlZWQxLmZmbQotRm9ybWF0IGF2aQotIwotQml0RXhhY3QKLURjdEZhc3RpbnQKLUlkY3RTaW1wbGUKLVZpZGVvRnJhbWVSYXRlIDIKLVZpZGVvU2l6ZSAzMjB4MjQwCi1WaWRlb0JpdFJhdGUgNDAKLVZpZGVvR29wU2l6ZSAyMAotTm9BdWRpbwotCi1QcmVSb2xsIDIwCi1TdGFydFNlbmRPbktleQotTWF4VGltZSAxMDAKLQotPC9TdHJlYW0+Ci0KLSM8U3RyZWFtIHRlc3RfaC5tcGc+Ci0jRmVlZCBmZWVkMS5mZm0KLSMKLSNWaWRlb0ZyYW1lUmF0ZSAxMAotI1ZpZGVvU2l6ZSAzNTJ4Mjg4Ci0jVmlkZW9CaXRSYXRlIDEwMAotI1ZpZGVvR29wU2l6ZSAzMAotI05vQXVkaW8KLQotI1ByZVJvbGwgMTAKLSNTdGFydFNlbmRPbktleQotI01heFRpbWUgMTAwCi0jCi0jPC9TdHJlYW0+Ci0jCi0jPFN0cmVhbSB0ZXN0X2wubXBnPgotI0ZlZWQgZmVlZDEuZmZtCi0jIwotI1ZpZGVvRnJhbWVSYXRlIDIKLSNWaWRlb1NpemUgMzIweDI0MAotI1ZpZGVvQml0UmF0ZSA0MAotI1ZpZGVvR29wU2l6ZSAyMAotI05vQXVkaW8KLSMKLSNQcmVSb2xsIDIwCi0jU3RhcnRTZW5kT25LZXkKLSNNYXhUaW1lIDEwMAotIwotIzwvU3RyZWFtPgotIwotPFN0cmVhbSB0ZXN0LnN3Zj4KLUZlZWQgZmVlZDEuZmZtCi0jCi1CaXRFeGFjdAotRGN0RmFzdGludAotSWRjdFNpbXBsZQotUXNjYWxlIDEwCi1WaWRlb0ZyYW1lUmF0ZSAxMAotVmlkZW9TaXplIDM1MngyODgKLVZpZGVvQml0UmF0ZSAxMDAKLVZpZGVvR29wU2l6ZSAzMAotTm9BdWRpbwotCi1QcmVSb2xsIDEwCi1TdGFydFNlbmRPbktleQotTWF4VGltZSAxMDAKLQotPC9TdHJlYW0+Ci0KLTxTdHJlYW0gdGVzdF9oLmFzZj4KLUZlZWQgZmVlZDEuZmZtCi1Gb3JtYXQgYXNmCi0jCi1CaXRFeGFjdAotRGN0RmFzdGludAotSWRjdFNpbXBsZQotUXNjYWxlIDEwCi1WaWRlb0ZyYW1lUmF0ZSAxMAotVmlkZW9TaXplIDMyMHgyNDAKLVZpZGVvQml0UmF0ZSAxMDAKLVZpZGVvR29wU2l6ZSAzMAotTm9BdWRpbwotCi1QcmVSb2xsIDEwCi1TdGFydFNlbmRPbktleQotTWF4VGltZSAxMDAKLQotQVZPcHRpb25WaWRlbyBmbGFncyArZ2xvYmFsX2hlYWRlcgotCi1NZXRhZGF0YSB0aXRsZSAiVGVzdCBkYXRhIHN0cmVhbSIKLQotPC9TdHJlYW0+Ci0KLTxTdHJlYW0gdGVzdF9sLmFzZj4KLUZlZWQgZmVlZDEuZmZtCi1Gb3JtYXQgYXNmCi0jCi1CaXRFeGFjdAotRGN0RmFzdGludAotSWRjdFNpbXBsZQotUXNjYWxlIDEwCi1WaWRlb0ZyYW1lUmF0ZSAyCi1WaWRlb1NpemUgMzIweDI0MAotVmlkZW9CaXRSYXRlIDQwCi1WaWRlb0dvcFNpemUgMjAKLU5vQXVkaW8KLQotUHJlUm9sbCAyMAotU3RhcnRTZW5kT25LZXkKLU1heFRpbWUgMTAwCi0KLUFWT3B0aW9uVmlkZW8gZmxhZ3MgK2dsb2JhbF9oZWFkZXIKLQotTWV0YWRhdGEgdGl0bGUgIlRlc3QgZGF0YSBzdHJlYW0iCi0KLTwvU3RyZWFtPgotCi08U3RyZWFtIHRlc3RfaC5ybT4KLQotRmVlZCBmZWVkMS5mZm0KLUZvcm1hdCBybQotCi1CaXRFeGFjdAotRGN0RmFzdGludAotSWRjdFNpbXBsZQotUXNjYWxlIDEwCi1WaWRlb0JpdFJhdGUgMTAwCi1WaWRlb0ZyYW1lUmF0ZSAxMAotVmlkZW9Hb3BTaXplIDMwCi1WaWRlb1NpemUgICAgMzIweDI0MAotTm9BdWRpbwotCi1QcmVSb2xsIDEwCi1TdGFydFNlbmRPbktleQotTWF4VGltZSAxMDAKLQotPC9TdHJlYW0+Ci0KLTxTdHJlYW0gdGVzdF9sLnJtPgotCi1GZWVkIGZlZWQxLmZmbQotRm9ybWF0IHJtCi0KLUJpdEV4YWN0Ci1EY3RGYXN0aW50Ci1JZGN0U2ltcGxlCi1Rc2NhbGUgMTAKLVZpZGVvQml0UmF0ZSA0MAotVmlkZW9GcmFtZVJhdGUgMgotVmlkZW9Hb3BTaXplIDIwCi1WaWRlb1NpemUgICAgMzIweDI0MAotTm9BdWRpbwotCi1QcmVSb2xsIDIwCi1TdGFydFNlbmRPbktleQotTWF4VGltZSAxMDAKLQotPC9TdHJlYW0+Ci0KLQotPFN0cmVhbSB0ZXN0LmpwZz4KLQotRmVlZCBmZWVkMS5mZm0KLUZvcm1hdCBqcGVnCi1TdHJpY3QgLTEKLQotQml0RXhhY3QKLURjdEZhc3RpbnQKLUlkY3RTaW1wbGUKLVZpZGVvRnJhbWVSYXRlIDEKLVZpZGVvU2l6ZSAzNTJ4Mjg4Ci1Ob0F1ZGlvCi0KLVByZVJvbGwgMgotCi08L1N0cmVhbT4KLQotPFN0cmVhbSB0ZXN0X3NtYWxsLmpwZz4KLQotRmVlZCBmZWVkMS5mZm0KLUZvcm1hdCBqcGVnCi1TdHJpY3QgLTEKLQotQml0RXhhY3QKLURjdEZhc3RpbnQKLUlkY3RTaW1wbGUKLVZpZGVvRnJhbWVSYXRlIDEKLVZpZGVvU2l6ZSAxNjB4MTI4Ci1Ob0F1ZGlvCi0KLVByZVJvbGwgMgotCi08L1N0cmVhbT4KLQotPFN0cmVhbSB0ZXN0Lm1qcGc+Ci0KLUZlZWQgZmVlZDEuZmZtCi1Gb3JtYXQgbXBqcGVnCi1TdHJpY3QgLTEKLQotQml0RXhhY3QKLURjdEZhc3RpbnQKLUlkY3RTaW1wbGUKLVZpZGVvRnJhbWVSYXRlIDEKLVZpZGVvU2l6ZSAgICAzMjB4MjQwCi1Ob0F1ZGlvCi1TdGFydFNlbmRPbktleQotCi1QcmVSb2xsIDEKLU1heFRpbWUgMTAwCi0KLTwvU3RyZWFtPgotCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBTcGVjaWFsIHN0cmVhbSA6IHNlcnZlciBzdGF0dXMKLQotPFN0cmVhbSB0ZXN0c3RhdC5odG1sPgotCi1Gb3JtYXQgc3RhdHVzCi0KLTwvU3RyZWFtPgotCmRpZmYgLS1naXQgYS90ZXN0cy9mZnNlcnZlci5yZWdyZXNzaW9uLnJlZiBiL3Rlc3RzL2Zmc2VydmVyLnJlZ3Jlc3Npb24ucmVmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmM3NDk3Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL2Zmc2VydmVyLnJlZ3Jlc3Npb24ucmVmCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotMThjNGJhMGU4ZTdhZGI3ODEyMTZlMzhkZTYxYzJlMzkgIGZmLXRlc3RfaC5hdmkKLWY4NDc2N2M3YWY2MWYzNjBmNGI0NDNjMmM3M2YzMjJmICBmZi10ZXN0X2wuYXZpCi1kOTc2ODQ4YTllNGQ1ZDhmYzI2NTllNDg0MWNkZWNlNSAgZmYtdGVzdC5zd2YKLTI4ZmQ4N2Q1MDc1YjliMDExYWFkNTcyOTJmMjcxYTA0ICBmZi10ZXN0X2guYXNmCi1hMzFjY2QzYWJhMjU1MWU2MGI5ZmIxYzE1NmZjYTJmOCAgZmYtdGVzdF9sLmFzZgotMzI3OWQzZWQwZWYyZDEzNDdiNWVkYTg0ZGIyY2YzZTYgIGZmLXRlc3RfaC5ybQotNDQwMjMxZmUzY2YwODQ5ODg3MzkwYjRkNjdkNjg5NGEgIGZmLXRlc3RfbC5ybQotZTBkYzkxNDMwNjYwYzYxOWU5N2I1YzgyZTBmMzk4ZmMgIGZmLXRlc3QuanBnCi0wZDZjOThmYzhhNGYwMDU2MGZlMzRlOTRlMjY4ODBhOSAgZmYtdGVzdF9zbWFsbC5qcGcKLWUyYTMxNWQ3YWMwNTc2Mjc5ZjhiNGQ5MTc5OTk2MTVhICBmZi10ZXN0Lm1qcGcKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbHRlcmdyYXBocy9hbmVxdWFsaXplciBiL3Rlc3RzL2ZpbHRlcmdyYXBocy9hbmVxdWFsaXplcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRhODZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsdGVyZ3JhcGhzL2FuZXF1YWxpemVyCkBAIC0wLDAgKzEgQEAKK2FuZXF1YWxpemVyPSdjMCBmPTIwMCB3PTIwMCBnPS04MCB0PTEnCmRpZmYgLS1naXQgYS90ZXN0cy9maWx0ZXJncmFwaHMvY29tcGFuZCBiL3Rlc3RzL2ZpbHRlcmdyYXBocy9jb21wYW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZmRkOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWx0ZXJncmFwaHMvY29tcGFuZApAQCAtMCwwICsxIEBACitjb21wYW5kPSdwb2ludHM9LTgwLy04MHwtOS8tOXwwLy01LjN8MjAvMi45JwpkaWZmIC0tZ2l0IGEvdGVzdHMvZmlsdGVyZ3JhcGhzL2ZpcmVxdWFsaXplciBiL3Rlc3RzL2ZpbHRlcmdyYXBocy9maXJlcXVhbGl6ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3ZGZkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbHRlcmdyYXBocy9maXJlcXVhbGl6ZXIKQEAgLTAsMCArMSwyOSBAQAorZmlyZXF1YWxpemVyICAgID0KKyAgICBmZnQyICAgICAgICA9IG9uOgorICAgIGdhaW4gICAgICAgID0gJ3NpbigwLjAwMSpmKSAtIDEnOgorICAgIGRlbGF5ICAgICAgID0gMC4wNSwKKworZmlyZXF1YWxpemVyICAgID0KKyAgICBnYWluICAgICAgICA9ICdpZiAoY2gsIC0wLjcgKiBzaW4oMC4wMDEqZiksIC0wLjIgKiBzaW4oMC4wMDEqZikpIC0gMSc6CisgICAgZGVsYXkgICAgICAgPSAwLjE6CisgICAgZml4ZWQgICAgICAgPSBvbjoKKyAgICBtdWx0aSAgICAgICA9IG9uOgorICAgIHplcm9fcGhhc2UgID0gb246CisgICAgd2Z1bmMgICAgICAgPSBudXR0YWxsLAorCitmaXJlcXVhbGl6ZXIgICAgPQorICAgIGZmdDIgICAgICAgID0gb246CisgICAgZ2Fpbl9lbnRyeSAgPSAnZW50cnkoMTAwMCwgMCk7IGVudHJ5KDUwMDAsIDAuMSk7IGVudHJ5KDEwMDAwLCAwLjIpJywKKworZmlyZXF1YWxpemVyICAgID0KKyAgICBnYWluICAgICAgICA9ICdpZiAoY2gsIC0wLjMgKiBzaW4oMC4wMDEqZiksIC0wLjggKiBzaW4oMC4wMDEqZikpIC0gMSc6CisgICAgZGVsYXkgICAgICAgPSAwLjA1OgorICAgIG11bHRpICAgICAgID0gb24sCisKK2ZpcmVxdWFsaXplciAgICA9CisgICAgZ2Fpbl9lbnRyeSAgPSAnZW50cnkoMTAwMCwgMC4yKTsgZW50cnkoNTAwMCwgMC4xKTsgZW50cnkoMTAwMDAsIDApJywKKwordm9sdW1lICAgICAgICAgID0gMi44ZEIsCisKK2F0cmltICAgICAgICAgICA9CisgICAgc3RhcnQgICAgICAgPSAwLjEyCmRpZmYgLS1naXQgYS90ZXN0cy9maWx0ZXJncmFwaHMvaHN0YWNrIGIvdGVzdHMvZmlsdGVyZ3JhcGhzL2hzdGFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmVlMWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsdGVyZ3JhcGhzL2hzdGFjawpAQCAtMCwwICsxIEBACitoc3RhY2sKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbHRlcmdyYXBocy9vdmVybGF5LWR2ZHN1Yi0yMzk3IGIvdGVzdHMvZmlsdGVyZ3JhcGhzL292ZXJsYXktZHZkc3ViLTIzOTcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxMzNmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ZpbHRlcmdyYXBocy9vdmVybGF5LWR2ZHN1Yi0yMzk3CkBAIC0wLDAgKzEsMiBAQAorc3dzX2ZsYWdzPSthY2N1cmF0ZV9ybmQrYml0ZXhhY3Q7CitbMDp2XVswOnM6MV1vdmVybGF5CmRpZmYgLS1naXQgYS90ZXN0cy9maWx0ZXJncmFwaHMvb3ZlcmxheV9udjEyIGIvdGVzdHMvZmlsdGVyZ3JhcGhzL292ZXJsYXlfbnYxMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzgyY2JlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsdGVyZ3JhcGhzL292ZXJsYXlfbnYxMgpAQCAtMCwwICsxLDUgQEAKK3N3c19mbGFncz0rYWNjdXJhdGVfcm5kK2JpdGV4YWN0Oworc3BsaXQgW21haW5dW292ZXJdOworW292ZXJdIHNjYWxlPTg4OjcyLCBwYWQ9OTY6ODA6NDo0IFtvdmVyZl07CitbbWFpbl0gZm9ybWF0PW52MTIgW21haW5mXTsKK1ttYWluZl1bb3ZlcmZdIG92ZXJsYXk9MjQwOjE2OmZvcm1hdD15dXY0MjAsIGZvcm1hdD15dXY0MjBwCmRpZmYgLS1naXQgYS90ZXN0cy9maWx0ZXJncmFwaHMvb3ZlcmxheV9udjIxIGIvdGVzdHMvZmlsdGVyZ3JhcGhzL292ZXJsYXlfbnYyMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzMwZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsdGVyZ3JhcGhzL292ZXJsYXlfbnYyMQpAQCAtMCwwICsxLDUgQEAKK3N3c19mbGFncz0rYWNjdXJhdGVfcm5kK2JpdGV4YWN0Oworc3BsaXQgW21haW5dW292ZXJdOworW292ZXJdIHNjYWxlPTg4OjcyLCBwYWQ9OTY6ODA6NDo0IFtvdmVyZl07CitbbWFpbl0gZm9ybWF0PW52MjEgW21haW5mXTsKK1ttYWluZl1bb3ZlcmZdIG92ZXJsYXk9MjQwOjE2OmZvcm1hdD15dXY0MjAsIGZvcm1hdD15dXY0MjBwCmRpZmYgLS1naXQgYS90ZXN0cy9maWx0ZXJncmFwaHMvc2NhbGUycmVmX2tlZXBfYXNwZWN0IGIvdGVzdHMvZmlsdGVyZ3JhcGhzL3NjYWxlMnJlZl9rZWVwX2FzcGVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDA3NDYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZmlsdGVyZ3JhcGhzL3NjYWxlMnJlZl9rZWVwX2FzcGVjdApAQCAtMCwwICsxLDUgQEAKK3N3c19mbGFncz0rYWNjdXJhdGVfcm5kK2JpdGV4YWN0OwordGVzdHNyYz1zaXplPTMyMHgyNDAgW21haW5dOwordGVzdHNyYz1zaXplPTY0MHgzNjAgW3JlZl07CitbbWFpbl1bcmVmXSBzY2FsZTJyZWY9aXcvNDpvdy9tZGFyIFttYWluXVtyZWZdOworW3JlZl0gbnVsbHNpbmsKZGlmZiAtLWdpdCBhL3Rlc3RzL2ZpbHRlcmdyYXBocy92c3RhY2sgYi90ZXN0cy9maWx0ZXJncmFwaHMvdnN0YWNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMGUxM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9maWx0ZXJncmFwaHMvdnN0YWNrCkBAIC0wLDAgKzEgQEAKK3ZzdGFjawpkaWZmIC0tZ2l0IGEvdGVzdHMvbGF2Zi1yZWdyZXNzaW9uLnNoIGIvdGVzdHMvbGF2Zi1yZWdyZXNzaW9uLnNoCmluZGV4IGEzN2Y3MTQuLjQ1Yzg3N2UgMTAwNzU1Ci0tLSBhL3Rlc3RzL2xhdmYtcmVncmVzc2lvbi5zaAorKysgYi90ZXN0cy9sYXZmLXJlZ3Jlc3Npb24uc2gKQEAgLTkwLDYgKzkwLDE0IEBACiBkb19sYXZmIG14Zl9kMTAgIi1hciA0ODAwMCAtYWMgMiIgIi1yIDI1IC12ZiBzY2FsZT03MjA6NTc2LHBhZD03MjA6NjA4OjA6MzIgLXZjb2RlYyBtcGVnMnZpZGVvIC1nIDAgLWZsYWdzICtpbGRjdCtsb3dfZGVsYXkgLWRjIDEwIC1ub25fbGluZWFyX3F1YW50IDEgLWludHJhX3ZsYyAxIC1xc2NhbGUgMSAtcHMgMSAtcW1pbiAxIC1yY19tYXhfdmJ2X3VzZSAxIC1yY19taW5fdmJ2X3VzZSAxIC1waXhfZm10IHl1djQyMnAgLW1pbnJhdGUgMzAwMDBrIC1tYXhyYXRlIDMwMDAwayAtYiAzMDAwMGsgLWJ1ZnNpemUgMTIwMDAwMCAtdG9wIDEgLXJjX2luaXRfb2NjdXBhbmN5IDEyMDAwMDAgLXFtYXggMTIgLWYgbXhmX2QxMCIKIGZpCiAKK2lmIFsgLW4gIiRkb19teGZfZHYyNSIgXTsgdGhlbgorZG9fbGF2ZiBteGZfZHYyNSAiLWFyIDQ4MDAwIC1hYyAyIiAiLXIgMjUgLXZmIHNjYWxlPTcyMDo1NzYsc2V0ZGFyPTQvMyAtdmNvZGVjIGR2dmlkZW8gLXBpeF9mbXQgeXV2NDIwcCAtYiAyNTAwMGsgLXRvcCAwIC1mIG14ZiIKK2ZpCisKK2lmIFsgLW4gIiRkb19teGZfZHZjcHJvNTAiIF07IHRoZW4KK2RvX2xhdmYgbXhmX2R2Y3BybzUwICItYXIgNDgwMDAgLWFjIDIiICItciAyNSAtdmYgc2NhbGU9NzIwOjU3NixzZXRkYXI9MTYvOSAtdmNvZGVjIGR2dmlkZW8gLXBpeF9mbXQgeXV2NDIycCAtYiA1MDAwMGsgLXRvcCAwIC1mIG14ZiIKK2ZpCisKIGlmIFsgLW4gIiRkb19teGZfb3BhdG9tIiBdOyB0aGVuCiBkb19sYXZmIG14Zl9vcGF0b20gIiIgIi1zIDE5MjB4MTA4MCAtdmNvZGVjIGRueGhkIC1waXhfZm10IHl1djQyMnAgLXZiIDM2TSAtZiBteGZfb3BhdG9tIC1tYXAgMCIKIGZpCkBAIC0xMjIsNiArMTMwLDcgQEAKIG1vdl9jb21tb25fb3B0PSItYWNvZGVjIHBjbV9hbGF3IC12Y29kZWMgbXBlZzQgLXRocmVhZHMgMSIKIGRvX2xhdmYgbW92ICIiICItbW92ZmxhZ3MgK3J0cGhpbnQgJG1vdl9jb21tb25fb3B0IgogZG9fbGF2Zl90aW1lY29kZSBtb3YgIi1tb3ZmbGFncyArZmFzdHN0YXJ0ICRtb3ZfY29tbW9uX29wdCIKK2RvX2xhdmZfdGltZWNvZGUgbXA0ICItdmNvZGVjIG1wZWc0IC1hbiAtdGhyZWFkcyAxIgogZmkKIAogaWYgWyAtbiAiJGRvX2lzbXYiIF0gOyB0aGVuCkBAIC0xNDQsNiArMTUzLDEwIEBACiBkb19sYXZmIG51dCAiIiAiLWFjb2RlYyBtcDIgLWFiIDY0ayAtYXIgNDQxMDAgLXRocmVhZHMgMSIKIGZpCiAKK2lmIFsgLW4gIiRkb19ta2EiIF0gOyB0aGVuCitkb19hdWRpb19vbmx5IG1rYSAiIiAiLWM6YSB0dGEiCitmaQorCiBpZiBbIC1uICIkZG9fbWt2IiBdIDsgdGhlbgogZG9fbGF2ZiBta3YgIiIgIi1hY29kZWMgbXAyIC1hYiA2NGsgLXZjb2RlYyBtcGVnNCBcCiAgLWF0dGFjaCAke3Jhd19zcmMlLyp9LzAwLnBnbSAtbWV0YWRhdGE6czp0IG1pbWV0eXBlPWltYWdlL3gtcG9ydGFibGUtZ3JleW1hcCAtdGhyZWFkcyAxIgpAQCAtMTY0LDYgKzE3NywyMCBAQAogZG9fbGF2Zl9mYXRlIG9nZyAidnAzL2NvZWZmX2xldmVsNjQubWt2IgogZmkKIAoraWYgWyAtbiAiJGRvX29nZ192cDgiIF0gOyB0aGVuCitkb19sYXZmX2ZhdGUgb2d2ICJ2cDgvUlJTRjQ5LXNob3J0LndlYm0iICItYWNvZGVjIGNvcHkiCitmaQorCitpZiBbIC1uICIkZG9fbW92X3F0cmxlX21hY2U2IiBdIDsgdGhlbgorREVDX09QVFM9IiRERUNfT1BUUyAtaWRjdCBhdXRvIgorZG9fbGF2Zl9mYXRlIG1vdiAicXRybGUvQW5pbWF0aW9uLTE2R3JleXMubW92IgorZmkKKworaWYgWyAtbiAiJGRvX2F2aV9jcmFtIiBdIDsgdGhlbgorREVDX09QVFM9IiRERUNfT1BUUyAtaWRjdCBhdXRvIgorZG9fbGF2Zl9mYXRlIGF2aSAiY3JhbS90b29uLmF2aSIKK2ZpCisKIGlmIFsgLW4gIiRkb193dHYiIF0gOyB0aGVuCiBkb19sYXZmIHd0diAiIiAiLWFjb2RlYyBtcDIgLXRocmVhZHMgMSIKIGZpCkBAIC0xOTMsMTIgKzIyMCwzMyBAQAogZG9fYXZjb252X2NyYyAkZmlsZSAkREVDX09QVFMgLWkgJHRhcmdldF9wYXRoLyRmaWxlIC1waXhfZm10IHJnYjI0CiBmaQogCitpZiBbIC1uICIkZG9fYXBuZyIgXSA7IHRoZW4KK2ZpbGU9JHtvdXRmaWxlfWxhdmYuYXBuZworZG9fYXZjb252ICRmaWxlICRERUNfT1BUUyAtZiBpbWFnZTIgLXZjb2RlYyBwZ215dXYgLWkgJHJhd19zcmMgJEVOQ19PUFRTIC10IDEgLXBpeF9mbXQgcmdiMjQKK2RvX2F2Y29udl9jcmMgJGZpbGUgJERFQ19PUFRTIC1pICR0YXJnZXRfcGF0aC8kZmlsZSAtcGl4X2ZtdCByZ2IyNAorZmlsZV9jb3B5PSR7b3V0ZmlsZX1sYXZmLmNvcHkuYXBuZworZG9fYXZjb252ICRmaWxlX2NvcHkgJERFQ19PUFRTIC1pICRmaWxlICRFTkNfT1BUUyAtYyBjb3B5Citkb19hdmNvbnZfY3JjICRmaWxlX2NvcHkgJERFQ19PUFRTIC1pICR0YXJnZXRfcGF0aC8kZmlsZV9jb3B5CitmaWxlPSR7b3V0ZmlsZX1sYXZmLnBuZworZG9fYXZjb252ICRmaWxlICRERUNfT1BUUyAtZiBpbWFnZTIgLXZjb2RlYyBwZ215dXYgLWkgJHJhd19zcmMgJEVOQ19PUFRTIC1waXhfZm10IHJnYjI0IC1mcmFtZXM6diAxIC1mIGFwbmcKK2RvX2F2Y29udl9jcmMgJGZpbGUgJERFQ19PUFRTIC1pICR0YXJnZXRfcGF0aC8kZmlsZSAtcGl4X2ZtdCByZ2IyNAorZmkKKwogaWYgWyAtbiAiJGRvX3l1djRtcGVnIiBdIDsgdGhlbgogZmlsZT0ke291dGZpbGV9bGF2Zi55NG0KIGRvX2F2Y29udiAkZmlsZSAkREVDX09QVFMgLWYgaW1hZ2UyIC12Y29kZWMgcGdteXV2IC1pICRyYXdfc3JjICRFTkNfT1BUUyAtdCAxIC1xc2NhbGUgMTAKICNkb19hdmNvbnZfY3JjICRmaWxlIC1pICR0YXJnZXRfcGF0aC8kZmlsZQogZmkKIAoraWYgWyAtbiAiJGRvX2ZpdHMiIF0gOyB0aGVuCitwaXhfZm10cz0iZ3JheSBncmF5MTZiZSBnYnJwIGdicmFwIGdicnAxNmJlIGdicmFwMTZiZSIKK2ZvciBwaXhfZm10IGluICRwaXhfZm10cyA7IGRvCisgICAgZmlsZT0ke291dGZpbGV9JHtwaXhfZm10fWxhdmYuZml0cworICAgIGRvX2F2Y29udiAkZmlsZSAkREVDX09QVFMgLWYgaW1hZ2UyIC12Y29kZWMgcGdteXV2IC1pICRyYXdfc3JjICRFTkNfT1BUUyAtcGl4X2ZtdCAkcGl4X2ZtdAorICAgIGRvX2F2Y29udl9jcmMgJGZpbGUgJERFQ19PUFRTIC1pICR0YXJnZXRfcGF0aC8kZmlsZSAtcGl4X2ZtdCAkcGl4X2ZtdAorZG9uZQorZmkKKwogIyBpbWFnZSBmb3JtYXRzCiAKIGlmIFsgLW4gIiRkb19wZ20iIF0gOyB0aGVuCkBAIC0zMzUsNiArMzgzLDEwIEBACiBkb19hdWRpb19vbmx5IHNveAogZmkKIAoraWYgWyAtbiAiJGRvX3R0YSIgXSA7IHRoZW4KK2RvX2F1ZGlvX29ubHkgdHRhCitmaQorCiBpZiBbIC1uICIkZG9fY2FmIiBdIDsgdGhlbgogZG9fYXVkaW9fb25seSBjYWYKIGZpCkBAIC0zNTEsNiArNDAzLDEwIEBACiBkb19hdWRpb19vbmx5IHc2NAogZmkKIAoraWYgWyAtbiAiJGRvX3d2IiBdIDsgdGhlbgorZG9fYXVkaW9fb25seSB3dgorZmkKKwogIyBwaXhfZm10IGNvbnZlcnNpb25zCiAKIGlmIFsgLW4gIiRkb19waXhmbXQiIF0gOyB0aGVuCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvYWNvZGVjL2FkcGNtLXlhbWFoYSBiL3Rlc3RzL3JlZi9hY29kZWMvYWRwY20teWFtYWhhCmluZGV4IDI3NDEwNTguLmYzZTZkYmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9hY29kZWMvYWRwY20teWFtYWhhCisrKyBiL3Rlc3RzL3JlZi9hY29kZWMvYWRwY20teWFtYWhhCkBAIC0xLDQgKzEsNCBAQAotZTljMTRmNzAxZDI1OTQ3MzE3ZGI5MzY3YjlkYzc3MmQgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtYWRwY20teWFtYWhhLndhdgorMjQ1YzE5NGU4NGQ0ODJhNzBjYTg5ZGU5YzBiYmQ1OTEgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtYWRwY20teWFtYWhhLndhdgogMjY1Mjc0IHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtYWRwY20teWFtYWhhLndhdgotOTNiOTVhNjYzZWM4Nzk5ZTBjNGRiMTg0NjdiMjEyMzQgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtYWRwY20teWFtYWhhLm91dC53YXYKLXN0ZGRldjogMTI0Ny42MCBQU05SOiAzNC40MSBNQVhESUZGOjM5ODk1IGJ5dGVzOiAgMTA1ODQwMC8gIDEwNjA4NjQKKzc1OGI0YWVlNjI5NjQ4MzFkMGEzMzVhZGE5NjcyMTA0ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLWFkcGNtLXlhbWFoYS5vdXQud2F2CitzdGRkZXY6IDEyNDIuNzEgUFNOUjogMzQuNDQgTUFYRElGRjozOTk2MCBieXRlczogIDEwNTg0MDAvICAxMDYwODY0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvYWNvZGVjL2FkcGNtLXlhbWFoYS10cmVsbGlzIGIvdGVzdHMvcmVmL2Fjb2RlYy9hZHBjbS15YW1haGEtdHJlbGxpcwppbmRleCBhMDk5ZWM1Li45MDlhOTUxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvYWNvZGVjL2FkcGNtLXlhbWFoYS10cmVsbGlzCisrKyBiL3Rlc3RzL3JlZi9hY29kZWMvYWRwY20teWFtYWhhLXRyZWxsaXMKQEAgLTEsNCArMSw0IEBACi0yNDdhMDZjM2YyNmM1N2FiZDJkYjFhNzkzMTc0Y2I2NiAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1hZHBjbS15YW1haGEtdHJlbGxpcy53YXYKK2M4MzA2YWRhOTNlZjUyYjFlODdiNjc1ODg1M2Y0OTM3ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLWFkcGNtLXlhbWFoYS10cmVsbGlzLndhdgogMjY1Mjc0IHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtYWRwY20teWFtYWhhLXRyZWxsaXMud2F2Ci1hNDJiNWZhNzRiMzlhMDc2OTFiMGRmODBjZTY3Zjc3ZSAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1hZHBjbS15YW1haGEtdHJlbGxpcy5vdXQud2F2Ci1zdGRkZXY6ICA5MjguMjkgUFNOUjogMzYuOTggTUFYRElGRjozMzU1NyBieXRlczogIDEwNTg0MDAvICAxMDYwODY0Cis4YWQyN2IwZWE3ZTEzZTcwZWQzMzRiNWVjMjZjNjJlZiAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1hZHBjbS15YW1haGEtdHJlbGxpcy5vdXQud2F2CitzdGRkZXY6ICA5MjYuNTYgUFNOUjogMzYuOTkgTUFYRElGRjozMzU3MCBieXRlczogIDEwNTg0MDAvICAxMDYwODY0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvYWNvZGVjL3BjbS1zMTZiZV9wbGFuYXIgYi90ZXN0cy9yZWYvYWNvZGVjL3BjbS1zMTZiZV9wbGFuYXIKaW5kZXggM2Q3ZDdiMS4uMTJlYmRlZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2Fjb2RlYy9wY20tczE2YmVfcGxhbmFyCisrKyBiL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXMxNmJlX3BsYW5hcgpAQCAtMSw0ICsxLDQgQEAKLWEyZDRkYTQ0OGE4M2RhYzdjYmUxMWVlYTk2ZTY3OWZiICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zMTZiZV9wbGFuYXIubnV0Ci0xMDYwNzIyIHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXMxNmJlX3BsYW5hci5udXQKK2IyYWNjMDMwOWJlNzZiNWY2MjAwYjUyNTI4MWE5MDM3ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zMTZiZV9wbGFuYXIubnV0CisxMDYwNzI3IHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXMxNmJlX3BsYW5hci5udXQKIDk1ZTU0YjI2MTUzMGExYmNmNmRlNmZlM2IyMWRjNWY2ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zMTZiZV9wbGFuYXIub3V0Lndhdgogc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICAxMDU4NDAwLyAgMTA1ODQwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2Fjb2RlYy9wY20tczE2bGVfcGxhbmFyIGIvdGVzdHMvcmVmL2Fjb2RlYy9wY20tczE2bGVfcGxhbmFyCmluZGV4IGM2MzVjNzIuLmNjNWMzYzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXMxNmxlX3BsYW5hcgorKysgYi90ZXN0cy9yZWYvYWNvZGVjL3BjbS1zMTZsZV9wbGFuYXIKQEAgLTEsNCArMSw0IEBACi03NjE0MDRjMTFjNWI0YjBhOGJiYTAwNjE3MDRmNzBhNCAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tczE2bGVfcGxhbmFyLm51dAotMTA2MDcyMiB0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zMTZsZV9wbGFuYXIubnV0CisxNWFhOGY5ZDhjYTMwYTE3Yzc4MjFhY2ZjZDlkODdmOSAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tczE2bGVfcGxhbmFyLm51dAorMTA2MDcyNyB0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zMTZsZV9wbGFuYXIubnV0CiA5NWU1NGIyNjE1MzBhMWJjZjZkZTZmZTNiMjFkYzVmNiAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tczE2bGVfcGxhbmFyLm91dC53YXYKIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgMTA1ODQwMC8gIDEwNTg0MDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXMyNGxlX3BsYW5hciBiL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXMyNGxlX3BsYW5hcgppbmRleCA2NzM5M2Q5Li41ZTgzYTE5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvYWNvZGVjL3BjbS1zMjRsZV9wbGFuYXIKKysrIGIvdGVzdHMvcmVmL2Fjb2RlYy9wY20tczI0bGVfcGxhbmFyCkBAIC0xLDQgKzEsNCBAQAotYWE5ZjhjYTk1ZGUyMGIyZTgzZjY2ZGNiYjE1Y2MzMDcgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXMyNGxlX3BsYW5hci5udXQKLTE1OTAyNTEgdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tczI0bGVfcGxhbmFyLm51dAorMWM3NDY4NjJjOWQ3OWM1N2UyNzUyNjZmNjM4MjJiMjkgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXMyNGxlX3BsYW5hci5udXQKKzE1OTAyNTYgdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tczI0bGVfcGxhbmFyLm51dAogOTVlNTRiMjYxNTMwYTFiY2Y2ZGU2ZmUzYjIxZGM1ZjYgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXMyNGxlX3BsYW5hci5vdXQud2F2CiBzdGRkZXY6ICAgIDAuMDAgUFNOUjo5OTkuOTkgTUFYRElGRjogICAgMCBieXRlczogIDEwNTg0MDAvICAxMDU4NDAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvYWNvZGVjL3BjbS1zMzJsZV9wbGFuYXIgYi90ZXN0cy9yZWYvYWNvZGVjL3BjbS1zMzJsZV9wbGFuYXIKaW5kZXggNjQzNjU5Zi4uZmYzMDUxYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2Fjb2RlYy9wY20tczMybGVfcGxhbmFyCisrKyBiL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXMzMmxlX3BsYW5hcgpAQCAtMSw0ICsxLDQgQEAKLWQyYTcxMmZlMDhiMTc5MmJjNjVmMjU1ZjU0YmI5ODBlICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zMzJsZV9wbGFuYXIubnV0Ci0yMTIwMTk3IHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXMzMmxlX3BsYW5hci5udXQKK2QxNDI5NzM3MzNmZjRkNjE2NDRiNzA0NDM4YTRiYTMyICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zMzJsZV9wbGFuYXIubnV0CisyMTIwMjAyIHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXMzMmxlX3BsYW5hci5udXQKIDk1ZTU0YjI2MTUzMGExYmNmNmRlNmZlM2IyMWRjNWY2ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zMzJsZV9wbGFuYXIub3V0Lndhdgogc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICAxMDU4NDAwLyAgMTA1ODQwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2Fjb2RlYy9wY20tczhfcGxhbmFyIGIvdGVzdHMvcmVmL2Fjb2RlYy9wY20tczhfcGxhbmFyCmluZGV4IDMwMWU3MTUuLjljZDc5NWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXM4X3BsYW5hcgorKysgYi90ZXN0cy9yZWYvYWNvZGVjL3BjbS1zOF9wbGFuYXIKQEAgLTEsNCArMSw0IEBACi1jMGUxMGU0YTUxMDYxMzcwODIxMzE4MDdiNjY3NGE3MSAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tczhfcGxhbmFyLm51dAotNTMxMTAwIHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXM4X3BsYW5hci5udXQKK2YwNGY3OWIyZTkwOTIxYTUxM2YyZDIyZmRhYjBkYzQ3ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS1zOF9wbGFuYXIubnV0Cis1MzExMDUgdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tczhfcGxhbmFyLm51dAogNjUyZWRmMzBmMzVhZDg5YmYyN2JjYzlkMmY5YzdiNTMgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXM4X3BsYW5hci5vdXQud2F2CiBzdGRkZXY6ICAxNDcuODkgUFNOUjogNTIuOTMgTUFYRElGRjogIDI1NSBieXRlczogIDEwNTg0MDAvICAxMDU4NDAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvYWNvZGVjL3BjbS11MTZiZSBiL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXUxNmJlCmluZGV4IDNmZDgzMWQuLjAxNTM0MGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXUxNmJlCisrKyBiL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXUxNmJlCkBAIC0xLDQgKzEsNCBAQAotNzUzZDViZmRjMzhkMzE0ZmEzYjFhMmViMzQ0NDlhZWEgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUxNmJlLm51dAotMTA2MDcxNSB0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MTZiZS5udXQKK2FiYzMxYzcyMmFlZTcyZjIxYjVmODU4NzMxYzI4ZmI5ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MTZiZS5udXQKKzEwNjA3MjAgdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTE2YmUubnV0CiA5NWU1NGIyNjE1MzBhMWJjZjZkZTZmZTNiMjFkYzVmNiAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTE2YmUub3V0Lndhdgogc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICAxMDU4NDAwLyAgMTA1ODQwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2Fjb2RlYy9wY20tdTE2bGUgYi90ZXN0cy9yZWYvYWNvZGVjL3BjbS11MTZsZQppbmRleCBlYTcyNGJiLi43ZWZiMDg2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvYWNvZGVjL3BjbS11MTZsZQorKysgYi90ZXN0cy9yZWYvYWNvZGVjL3BjbS11MTZsZQpAQCAtMSw0ICsxLDQgQEAKLWNlZTM4ZGM0NzFiNmI3MmQ5N2U0NGQxNjY3NTkxMzYyICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MTZsZS5udXQKLTEwNjA3MTUgdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTE2bGUubnV0Cis4MGNmODA1YTE2YTZiNGYwMmY0NmZmOTAwOGNhMTZmNyAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTE2bGUubnV0CisxMDYwNzIwIHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUxNmxlLm51dAogOTVlNTRiMjYxNTMwYTFiY2Y2ZGU2ZmUzYjIxZGM1ZjYgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUxNmxlLm91dC53YXYKIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgMTA1ODQwMC8gIDEwNTg0MDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXUyNGJlIGIvdGVzdHMvcmVmL2Fjb2RlYy9wY20tdTI0YmUKaW5kZXggM2MxOTYzNy4uZWY0MjNlYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2Fjb2RlYy9wY20tdTI0YmUKKysrIGIvdGVzdHMvcmVmL2Fjb2RlYy9wY20tdTI0YmUKQEAgLTEsNCArMSw0IEBACi04NGMyYjZmNzE5Nzg0MGU0MGM1ZjY0NmVmZDhhNDNhNCAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTI0YmUubnV0Ci0xNTkwMjQ0IHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUyNGJlLm51dAorYzViN2QxODk4ZDhmNWQ2Njc1YmE1NDNkMjgzMGJiYWYgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUyNGJlLm51dAorMTU5MDI0OSB0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MjRiZS5udXQKIDk1ZTU0YjI2MTUzMGExYmNmNmRlNmZlM2IyMWRjNWY2ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MjRiZS5vdXQud2F2CiBzdGRkZXY6ICAgIDAuMDAgUFNOUjo5OTkuOTkgTUFYRElGRjogICAgMCBieXRlczogIDEwNTg0MDAvICAxMDU4NDAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvYWNvZGVjL3BjbS11MjRsZSBiL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXUyNGxlCmluZGV4IGI4MmQ2YmMuLjQwMTBhMWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXUyNGxlCisrKyBiL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXUyNGxlCkBAIC0xLDQgKzEsNCBAQAotNWFmZWExZjFiMWQwNTkwZGJhZTJhYzJlMDA5MmY0MzQgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUyNGxlLm51dAotMTU5MDI0NCB0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MjRsZS5udXQKKzg4NGEzYTU2MmE4MDA1MDg0ZmRlMDg4ZmMzYTc0MjgzICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MjRsZS5udXQKKzE1OTAyNDkgdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTI0bGUubnV0CiA5NWU1NGIyNjE1MzBhMWJjZjZkZTZmZTNiMjFkYzVmNiAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTI0bGUub3V0Lndhdgogc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICAxMDU4NDAwLyAgMTA1ODQwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2Fjb2RlYy9wY20tdTMyYmUgYi90ZXN0cy9yZWYvYWNvZGVjL3BjbS11MzJiZQppbmRleCA5MDlhMTMwLi4zNThhMDFlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvYWNvZGVjL3BjbS11MzJiZQorKysgYi90ZXN0cy9yZWYvYWNvZGVjL3BjbS11MzJiZQpAQCAtMSw0ICsxLDQgQEAKLTUyOWY1MjNmY2QwNDAwMjc5MWZjZTljZWU3OTc3ODNiICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MzJiZS5udXQKLTIxMjAxOTAgdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTMyYmUubnV0Cis4OGQxZjBiOThlMjg3OGYwYTQ1YWJkZTdhZDczZTlmMSAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTMyYmUubnV0CisyMTIwMTk1IHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUzMmJlLm51dAogOTVlNTRiMjYxNTMwYTFiY2Y2ZGU2ZmUzYjIxZGM1ZjYgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUzMmJlLm91dC53YXYKIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgMTA1ODQwMC8gIDEwNTg0MDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9hY29kZWMvcGNtLXUzMmxlIGIvdGVzdHMvcmVmL2Fjb2RlYy9wY20tdTMybGUKaW5kZXggMTZhMTgzZi4uNjg1N2VjMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2Fjb2RlYy9wY20tdTMybGUKKysrIGIvdGVzdHMvcmVmL2Fjb2RlYy9wY20tdTMybGUKQEAgLTEsNCArMSw0IEBACi04N2Y3NWFiZDg2Zjg0NTcxYmFmYzY1NmUwNmI2MzAzOCAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1wY20tdTMybGUubnV0Ci0yMTIwMTkwIHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUzMmxlLm51dAorNzI1N2Q2MjUxNTI0NDc5YzU2M2M5ZjE3YTI2NDIyMjIgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcGNtLXUzMmxlLm51dAorMjEyMDE5NSB0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MzJsZS5udXQKIDk1ZTU0YjI2MTUzMGExYmNmNmRlNmZlM2IyMWRjNWY2ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXBjbS11MzJsZS5vdXQud2F2CiBzdGRkZXY6ICAgIDAuMDAgUFNOUjo5OTkuOTkgTUFYRElGRjogICAgMCBieXRlczogIDEwNTg0MDAvICAxMDU4NDAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvYWNvZGVjL3JvcWF1ZGlvIGIvdGVzdHMvcmVmL2Fjb2RlYy9yb3FhdWRpbwppbmRleCA2MWNiMjdhLi5mNTEzYTAzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvYWNvZGVjL3JvcWF1ZGlvCisrKyBiL3Rlc3RzL3JlZi9hY29kZWMvcm9xYXVkaW8KQEAgLTEsNCArMSw0IEBACiA3NTg1OTk3NmQ3MDk4NTg4YWVhZWJiYzU1NTE0ODRhOSAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1yb3FhdWRpby5yb3EKIDI2NTk5MiB0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXJvcWF1ZGlvLnJvcQotNzNkNWFhYWFiOTQ4OGU2M2YxY2Y2ZmMzMjRjN2E5YTIgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcm9xYXVkaW8ub3V0LndhdgorMjA1N2VkMjM1ZTlkNGU3MjdlMTNiZjU3ZjM4OTEwOTMgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtcm9xYXVkaW8ub3V0Lndhdgogc3RkZGV2OiA0NDgxLjcwIFBTTlI6IDIzLjMwIE1BWERJRkY6NDYyNTAgYnl0ZXM6ICAxMDU4NDAwLyAgMTA1ODQwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2Fjb2RlYy9zMzAybSBiL3Rlc3RzL3JlZi9hY29kZWMvczMwMm0KaW5kZXggZjE5ZWViZS4uNjNlMzllZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2Fjb2RlYy9zMzAybQorKysgYi90ZXN0cy9yZWYvYWNvZGVjL3MzMDJtCkBAIC0xLDQgKzEsNCBAQAotMmQxNDk0YWQ3ODI5MmRjYTU1NmZkMDc5ZWMyN2YyOGQgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtczMwMm0ubXBlZ3RzCisxNjVkMDIyYWI4NjMwNmQwNjk3OTdhY2ZmMGMxZTI5NSAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1zMzAybS5tcGVndHMKIDE1ODkxNjQgdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy1zMzAybS5tcGVndHMKLWY5YjY1MjhlZWUxYWVhMDQ2NDBlZTgzNDAwYzc4Njg5ICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXMzMDJtLm91dC53YXYKLXN0ZGRldjogIDk4Ni45NyBQU05SOiAzNi40NCBNQVhESUZGOjE4NjQyIGJ5dGVzOiAgMTA1ODQwMC8gIDEwNTY3MDgKKzMxZjI1YTAwMjBmZDkwMTdkZTljM2M2MDgzMTY4NTRiICp0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXMzMDJtLm91dC53YXYKK3N0ZGRldjogIDk4Ni45NCBQU05SOiAzNi40NCBNQVhESUZGOjE4NTcxIGJ5dGVzOiAgMTA1ODQwMC8gIDEwNTY3MDgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9hY29kZWMvdHRhIGIvdGVzdHMvcmVmL2Fjb2RlYy90dGEKaW5kZXggMGY2MDM0NS4uOGUxODNmOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2Fjb2RlYy90dGEKKysrIGIvdGVzdHMvcmVmL2Fjb2RlYy90dGEKQEAgLTEsNCArMSw0IEBACi02YzI2MDgzNmQ3YTMyZTRiZDcxNDQ1M2EzNTQ2YzBkNSAqdGVzdHMvZGF0YS9mYXRlL2Fjb2RlYy10dGEubWF0cm9za2EKLTMzMTE0OCB0ZXN0cy9kYXRhL2ZhdGUvYWNvZGVjLXR0YS5tYXRyb3NrYQorODQ3ZDA2NWYwODJhYzk0ODI1NzI4YjVmMWFmODUzZWIgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtdHRhLnR0YQorMzMwNTgzIHRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtdHRhLnR0YQogOTVlNTRiMjYxNTMwYTFiY2Y2ZGU2ZmUzYjIxZGM1ZjYgKnRlc3RzL2RhdGEvZmF0ZS9hY29kZWMtdHRhLm91dC53YXYKIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgMTA1ODQwMC8gIDEwNTg0MDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlLzAxMnYgYi90ZXN0cy9yZWYvZmF0ZS8wMTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OGJiYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS8wMTJ2CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMxNngyNDAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDMzNjAsIDB4YzU0Mzk1ODAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlLzR4bS0xIGIvdGVzdHMvcmVmL2ZhdGUvNHhtLTEKaW5kZXggMzczNzFhYS4uOTZmMzUzOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvNHhtLTEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvNHhtLTEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDkyMTYwMCwgMHhkODJlNGQ1NwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgOTIxNjAwLCAweDgzZjIzNDljCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA5MjE2MDAsIDB4NzBkODdkYjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlLzR4bS0yIGIvdGVzdHMvcmVmL2ZhdGUvNHhtLTIKaW5kZXggNjg5NWQxMi4uYzI4ZGMxNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvNHhtLTIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvNHhtLTIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogNC8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjQweDExMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA4MDY0MCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDgwNjQwLCAweDNhOTQyNjgwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgODA2NDAsIDB4M2E5NDI2ODAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlLzhicHMgYi90ZXN0cy9yZWYvZmF0ZS84YnBzCmluZGV4IDlkYjk0MzAuLmRhYjJiOTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlLzhicHMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvOGJwcwpAQCAtMSw1ICsxLDE0IEBACiAjdGIgMDogMi8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzYweDI0MAorI3NhciAwOiA5LzEwCiAjdGIgMTogMS8yMjA1MAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAxOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI1OTIwMCwgMHg3ZTkxZGYwNwogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDNkMDQyNDI2CiAxLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NWJjYWU0NTYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FhYy1hdXRvYnNmLWFkdHN0b2FzYyBiL3Rlc3RzL3JlZi9mYXRlL2FhYy1hdXRvYnNmLWFkdHN0b2FzYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2E4ZTdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYWFjLWF1dG9ic2YtYWR0c3RvYXNjCkBAIC0wLDAgKzEsNDMgQEAKK2IwMzc1YmEwMGJjYmQ1NTAyM2ExNzYyNTViOGQ0YmEyICp0ZXN0cy9kYXRhL2ZhdGUvYWFjLWF1dG9ic2YtYWR0c3RvYXNjLm1hdHJvc2thCis2NzI4IHRlc3RzL2RhdGEvZmF0ZS9hYWMtYXV0b2JzZi1hZHRzdG9hc2MubWF0cm9za2EKKyNleHRyYWRhdGEgMDogICAgICAgIDIsIDB4MDAzMDAwMWMKKyN0YiAwOiAxLzEwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogYWFjCisjc2FtcGxlX3JhdGUgMDogMTYwMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICA2NCwgICAgICAgIDQsIDB4MDJmNzAxMTcKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgIDY0LCAgICAgIDE2MywgMHhkNWY4NTAwNworMCwgICAgICAgIDEyOCwgICAgICAgIDEyOCwgICAgICAgNjQsICAgICAgMTI3LCAweDY2NDg0MDY1CiswLCAgICAgICAgMTkyLCAgICAgICAgMTkyLCAgICAgICA2NCwgICAgICAgOTQsIDB4NTUyMjJiZDYKKzAsICAgICAgICAyNTYsICAgICAgICAyNTYsICAgICAgIDY0LCAgICAgIDMxNCwgMHgzYzdlOTIzYQorMCwgICAgICAgIDMyMCwgICAgICAgIDMyMCwgICAgICAgNjQsICAgICAgMjA3LCAweDFlZmM1ZDFiCiswLCAgICAgICAgMzg0LCAgICAgICAgMzg0LCAgICAgICA2NCwgICAgICAxMTksIDB4YjJhMTM2MDEKKzAsICAgICAgICA0NDgsICAgICAgICA0NDgsICAgICAgIDY0LCAgICAgIDE4NCwgMHhjYWZjNjA5MQorMCwgICAgICAgIDUxMiwgICAgICAgIDUxMiwgICAgICAgNjQsICAgICAgMTMyLCAweGRkZDMzYzBiCiswLCAgICAgICAgNTc2LCAgICAgICAgNTc2LCAgICAgICA2NCwgICAgICAxNTIsIDB4ODM5MzUwMzEKKzAsICAgICAgICA2NDAsICAgICAgICA2NDAsICAgICAgIDY0LCAgICAgIDIyNywgMHgzMmE4NmJjNAorMCwgICAgICAgIDcwNCwgICAgICAgIDcwNCwgICAgICAgNjQsICAgICAgMTIyLCAweGQwNGUzNTcxCiswLCAgICAgICAgNzY4LCAgICAgICAgNzY4LCAgICAgICA2NCwgICAgICAxNjMsIDB4NTdkNDRkMTYKKzAsICAgICAgICA4MzIsICAgICAgICA4MzIsICAgICAgIDY0LCAgICAgIDE0NywgMHgyMjYwNDNkNworMCwgICAgICAgIDg5NiwgICAgICAgIDg5NiwgICAgICAgNjQsICAgICAgMTE5LCAweDhhZDkzMWVkCiswLCAgICAgICAgOTYwLCAgICAgICAgOTYwLCAgICAgICA2NCwgICAgICAxNTMsIDB4YmI2ZTQzMmYKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAgIDY0LCAgICAgIDE4NSwgMHhhMDFmNGZmMworMCwgICAgICAgMTA4OCwgICAgICAgMTA4OCwgICAgICAgNjQsICAgICAgMTI2LCAweDg1NTAzY2U2CiswLCAgICAgICAxMTUyLCAgICAgICAxMTUyLCAgICAgICA2NCwgICAgICAyNDYsIDB4NjUyYzdiNTkKKzAsICAgICAgIDEyMTYsICAgICAgIDEyMTYsICAgICAgIDY0LCAgICAgIDE2MiwgMHhjOWYwNGRhMAorMCwgICAgICAgMTI4MCwgICAgICAgMTI4MCwgICAgICAgNjQsICAgICAgMTM1LCAweDcxZmEzYmUwCiswLCAgICAgICAxMzQ0LCAgICAgICAxMzQ0LCAgICAgICA2NCwgICAgICAyNDYsIDB4N2E2Zjc3ODgKKzAsICAgICAgIDE0MDgsICAgICAgIDE0MDgsICAgICAgIDY0LCAgICAgIDI2MiwgMHhkMzA5Nzc4MQorMCwgICAgICAgMTQ3MiwgICAgICAgMTQ3MiwgICAgICAgNjQsICAgICAgIDYwLCAweDA5YTExOGY1CiswLCAgICAgICAxNTM2LCAgICAgICAxNTM2LCAgICAgICA2NCwgICAgICAyNTUsIDB4YmFiNTc5M2MKKzAsICAgICAgIDE2MDAsICAgICAgIDE2MDAsICAgICAgIDY0LCAgICAgIDE1MywgMHg2YjZhNDRmYgorMCwgICAgICAgMTY2NCwgICAgICAgMTY2NCwgICAgICAgNjQsICAgICAgMTYwLCAweDU1MGU0NTMwCiswLCAgICAgICAxNzI4LCAgICAgICAxNzI4LCAgICAgICA2NCwgICAgICAyMTUsIDB4N2ZlNjYxNDQKKzAsICAgICAgIDE3OTIsICAgICAgIDE3OTIsICAgICAgIDY0LCAgICAgIDE0NCwgMHhjZDcyM2Y3ZAorMCwgICAgICAgMTg1NiwgICAgICAgMTg1NiwgICAgICAgNjQsICAgICAgMTg3LCAweDJhMGI1YzFiCiswLCAgICAgICAxOTIwLCAgICAgICAxOTIwLCAgICAgICA2NCwgICAgICAxNzcsIDB4YjhjMzU1ZDUKKzAsICAgICAgIDE5ODQsICAgICAgIDE5ODQsICAgICAgIDY0LCAgICAgIDE1NiwgMHg4NjdkNGYzYQorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgICAgNjQsICAgICAgMjAxLCAweDYyNzQ1ZmY5CiswLCAgICAgICAyMTEyLCAgICAgICAyMTEyLCAgICAgICA2NCwgICAgICAxMzcsIDB4OTBjNjM5ZTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Fhc2MgYi90ZXN0cy9yZWYvZmF0ZS9hYXNjCmluZGV4IDgzZjgzYjkuLmY2OTM3NmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Fhc2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYWFzYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTc1Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTY4MDAwLCAweDAwMDAwMDAwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNjgwMDAsIDB4MDAwMDAwMDAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE2ODAwMCwgMHgwMDAwMDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tNHhtIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20tNHhtCmluZGV4IGViNWNmZTYuLmNmZGU0MTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLTR4bQorKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS00eG0KQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS8yMjA1MAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDE0NzIsICAgICA1ODg4LCAweDkwODZlMzEwCiAwLCAgICAgICAxNDc2LCAgICAgICAxNDc2LCAgICAgMTQ3MiwgICAgIDU4ODgsIDB4YWM4NDkxZjUKIDAsICAgICAgIDI5NTIsICAgICAgIDI5NTIsICAgICAxNDcyLCAgICAgNTg4OCwgMHhjOWEwOGI2YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tYWZjIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20tYWZjCmluZGV4IGQxYTFjMzYuLjZkOGU3MzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWFmYworKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1hZmMKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgMTc5MjAsICAgIDcxNjgwLCAweDUyMzczYmM5CiAwLCAgICAgIDE3OTIwLCAgICAgIDE3OTIwLCAgICAxNzkyMCwgICAgNzE2ODAsIDB4MWY4NTRiMjcKIDAsICAgICAgMzU4NDAsICAgICAgMzU4NDAsICAgIDE3OTIwLCAgICA3MTY4MCwgMHgzZDI2NWE2ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tZHRrIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20tZHRrCmluZGV4IDM2NDBlMWMuLmYzYWRlNmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWR0aworKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1kdGsKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS80ODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA4OTYsICAgICAzNTg0LCAweGRhZTc4OWQ1CiAwLCAgICAgICAgODk2LCAgICAgICAgODk2LCAgICAgIDg5NiwgICAgIDM1ODQsIDB4MTY4ZWQ5YjYKIDAsICAgICAgIDE3OTIsICAgICAgIDE3OTIsICAgICAgODk2LCAgICAgMzU4NCwgMHg4OTIwYzhkNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tZWEtMSBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWVhLTEKaW5kZXggZjVhMzNkZi4uNzZiZThlOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tZWEtMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1lYS0xCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjIwNTAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxNDg0LCAgICAgNTkzNiwgMHgwMDAwMDAwMAogMCwgICAgICAgMTQ4NCwgICAgICAgMTQ4NCwgICAgIDE0NTYsICAgICA1ODI0LCAweDAwMDAwMDAwCiAwLCAgICAgICAyOTQwLCAgICAgICAyOTQwLCAgICAgMTQ4NCwgICAgIDU5MzYsIDB4MDAwMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWVhLTIgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1lYS0yCmluZGV4IGY1OGQ5YTAuLjkxNDQwODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWVhLTIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20tZWEtMgpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzIyMDUwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTQ4NCwgICAgIDU5MzYsIDB4ZWEyNjFhMjkKIDAsICAgICAgIDE0ODQsICAgICAgIDE0ODQsICAgICAxNDU2LCAgICAgNTgyNCwgMHgyNTNkZjA2MQogMCwgICAgICAgMjk0MCwgICAgICAgMjk0MCwgICAgIDE0ODQsICAgICA1OTM2LCAweDYwM2E1YmQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1lYS1tYXhpcy14YSBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWVhLW1heGlzLXhhCmluZGV4IDVkNmI1YzAuLmM5MTlhNjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWVhLW1heGlzLXhhCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWVhLW1heGlzLXhhCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjIwNTAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgIDI4LCAgICAgIDExMiwgMHgyOTFkMWJlNAogMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgMjgsICAgICAgMTEyLCAweGYwOGQzM2NjCiAwLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAyOCwgICAgICAxMTIsIDB4NWIxNTIxZGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWVhLXIxIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20tZWEtcjEKaW5kZXggNzRkMTVjNi4uNGU1ZmI2NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tZWEtcjEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20tZWEtcjEKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS80ODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDE2MjQsICAgICA2NDk2LCAweDAwMDAwMDAwCiAwLCAgICAgICAxNjI0LCAgICAgICAxNjI0LCAgICAgMTU5NiwgICAgIDYzODQsIDB4MDAwMDAwMDAKIDAsICAgICAgIDMyMjAsICAgICAgIDMyMjAsICAgICAxNTk2LCAgICAgNjM4NCwgMHgwMDAwMDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20taW1hLWFtdiBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWltYS1hbXYKaW5kZXggNGJkMjJhZi4uZWIxNzRkZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20taW1hLWFtdgorKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1pbWEtYW12CkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjIwNTAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTM3OCwgICAgIDI3NTYsIDB4MGFmMzUwMzQKIDAsICAgICAgIDEzNzgsICAgICAgIDEzNzgsICAgICAxMzc4LCAgICAgMjc1NiwgMHg4NDYyNDQzZgogMCwgICAgICAgMjc1NiwgICAgICAgMjc1NiwgICAgIDEzNzgsICAgICAyNzU2LCAweDlmNDkzYmE2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1pbWEtZWEtZWFjcyBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWltYS1lYS1lYWNzCmluZGV4IDk4ODcyOTYuLmZjZmNiZWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWltYS1lYS1lYWNzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWltYS1lYS1lYWNzCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjIwNTAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxNDY4LCAgICAgNTg3MiwgMHgwMDAwMDAwMAogMCwgICAgICAgMTQ2OCwgICAgICAgMTQ2OCwgICAgIDE0NjgsICAgICA1ODcyLCAweDAwMDAwMDAwCiAwLCAgICAgICAyOTM2LCAgICAgICAyOTM2LCAgICAgMTQ2OCwgICAgIDU4NzIsIDB4MDAwMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWltYS1lYS1zZWFkIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20taW1hLWVhLXNlYWQKaW5kZXggMTdjMTA4Ny4uMmQ1MmVmZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20taW1hLWVhLXNlYWQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20taW1hLWVhLXNlYWQKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS8yMjA1MAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA3MzYsICAgICAyOTQ0LCAweDAwMDAwMDAwCiAwLCAgICAgICAgNzM2LCAgICAgICAgNzM2LCAgICAgMTQ3MiwgICAgIDU4ODgsIDB4NWFlM2MyYTQKIDAsICAgICAgIDIyMDgsICAgICAgIDIyMDgsICAgICAxNDcyLCAgICAgNTg4OCwgMHgxNThmYmNiNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20taW1hLXNtanBlZyBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWltYS1zbWpwZWcKaW5kZXggM2E3NDZiNi4uZDU2MDE0ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20taW1hLXNtanBlZworKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1pbWEtc21qcGVnCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjIwNTAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDUxMiwgICAgIDEwMjQsIDB4MDAwMDAwMDAKIDAsICAgICAgICA1MTIsICAgICAgICA1MTIsICAgICAgNTEyLCAgICAgMTAyNCwgMHgwMDAwMDAwMAogMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgICA1MTIsICAgICAxMDI0LCAweGVkMmQzZjZiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1pbWEtd3MgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1pbWEtd3MKaW5kZXggNjFlMGRlZi4uZDFlNmI2MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20taW1hLXdzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLWltYS13cwpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzIyMDUwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgMTEwMjQsICAgIDIyMDQ4LCAweDA2NjVkN2Y0CiAwLCAgICAgIDExMDI0LCAgICAgIDExMDI0LCAgICAgMTQ3MCwgICAgIDI5NDAsIDB4MGYzYzY0Y2IKIDAsICAgICAgMTI0OTQsICAgICAgMTI0OTQsICAgICAxNDcwLCAgICAgMjk0MCwgMHhjOTBiOWU3OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tbXMtbW9ubyBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLW1zLW1vbm8KaW5kZXggYzQ1NjcwOC4uZTNmMjE3ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tbXMtbW9ubworKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS1tcy1tb25vCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMTEwMjUKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMTEwMjUKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDUwMCwgICAgIDEwMDAsIDB4NjRjZDk0MDMKIDAsICAgICAgICA1MDAsICAgICAgICA1MDAsICAgICAgNTAwLCAgICAgMTAwMCwgMHhhNGVmOGE5ZAogMCwgICAgICAgMTAwMCwgICAgICAgMTAwMCwgICAgICA1MDAsICAgICAxMDAwLCAweDc1YzE5ODY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hZHBjbS10aHAgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS10aHAKaW5kZXggMDA2M2I2Yy4uNTkyYzY2MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20tdGhwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLXRocApAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzMyMDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDMyMDAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTA3OCwgICAgIDQzMTIsIDB4NDY5NzE0ZjYKIDAsICAgICAgIDEwNzgsICAgICAgIDEwNzgsICAgICAxMDY0LCAgICAgNDI1NiwgMHg2Y2EyOGYyNQogMCwgICAgICAgMjE0MiwgICAgICAgMjE0MiwgICAgIDEwNzgsICAgICA0MzEyLCAweGQ0NjZmODA2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hZHBjbS12aW1hIGIvdGVzdHMvcmVmL2ZhdGUvYWRwY20tdmltYQppbmRleCA2OTg0YzVkLi5iMjJmMTI4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9hZHBjbS12aW1hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FkcGNtLXZpbWEKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS8yMjA1MAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgNzM1MDAsICAgMjk0MDAwLCAweDM3ZDQzOWVlCiAwLCAgICAgIDczNTAwLCAgICAgIDczNTAwLCAgICAgMTQ3MCwgICAgIDU4ODAsIDB4ZTUyNGIxNzcKIDAsICAgICAgNzQ5NzAsICAgICAgNzQ5NzAsICAgICAxNDcwLCAgICAgNTg4MCwgMHg5ZTc4NGFmMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWRwY20teGEgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS14YQppbmRleCAwNGJlMmI5Li4xNWI2MmVjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9hZHBjbS14YQorKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHBjbS14YQpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzM3ODAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDM3ODAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMjAxNiwgICAgIDgwNjQsIDB4YTMwN2VkOGMKIDAsICAgICAgIDIwMTYsICAgICAgIDIwMTYsICAgICAyMDE2LCAgICAgODA2NCwgMHhkMjU1MTkyNwogMCwgICAgICAgNDAzMiwgICAgICAgNDAzMiwgICAgIDIwMTYsICAgICA4MDY0LCAweDMyNjRhNzk5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hZHRzLWlkM3YxLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvYWR0cy1pZDN2MS1kZW11eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2FhNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYWR0cy1pZDN2MS1kZW11eApAQCAtMCwwICsxLDExIEBACisjdGIgMDogMS8yODIyNDAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBhYWMKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICA2MDIxMTIsICAgICAgNDc0LCAweDRjOTBlN2M0CiswLCAgICAgNjAyMTEyLCAgICAgNjAyMTEyLCAgIDYwMjExMiwgICAgICA0NzEsIDB4YjhiNWU3NWQKKzAsICAgIDEyMDQyMjQsICAgIDEyMDQyMjQsICAgNjAyMTEyLCAgICAgIDUwMiwgMHhlOTQzZWZkMQorMCwgICAgMTgwNjMzNiwgICAgMTgwNjMzNiwgICA2MDIxMTIsICAgICAgNDk1LCAweDljM2NlYzc0CiswLCAgICAyNDA4NDQ4LCAgICAyNDA4NDQ4LCAgIDYwMjExMiwgICAgICA0OTMsIDB4MDNiMmZhNGIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FkdHMtaWQzdjItZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS9hZHRzLWlkM3YyLWRlbXV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMDBlM2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHRzLWlkM3YyLWRlbXV4CkBAIC0wLDAgKzEsMjQwIEBACisjdGIgMDogMS8yODIyNDAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBhYWMKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgICAgIDYwMjExMiwgICAgIDYwMjExMiwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgICAxMjA0MjI0LCAgICAxMjA0MjI0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgIDE4MDYzMzYsICAgIDE4MDYzMzYsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgICAgMjQwODQ0OCwgICAgMjQwODQ0OCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgICAzMDEwNTYwLCAgICAzMDEwNTYwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgIDM2MTI2NzIsICAgIDM2MTI2NzIsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMDQzNDU0MAorMCwgICAgNDIxNDc4NCwgICAgNDIxNDc4NCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ1MDUzY2MxCiswLCAgICA0ODE2ODk2LCAgICA0ODE2ODk2LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjMwNDNhYWYKKzAsICAgIDU0MTkwMDgsICAgIDU0MTkwMDgsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2OTNhM2E2NworMCwgICAgNjAyMTEyMCwgICAgNjAyMTEyMCwgICA2MDIxMTIsICAgICAgMTQ5LCAweDMxMzA0YTM0CiswLCAgICA2NjIzMjMyLCAgICA2NjIzMjMyLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjE2MDNhYWIKKzAsICAgIDcyMjUzNDQsICAgIDcyMjUzNDQsICAgNjAyMTEyLCAgICAgIDEzMiwgMHhlNDJkNDNiMworMCwgICAgNzgyNzQ1NiwgICAgNzgyNzQ1NiwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgICA4NDI5NTY4LCAgICA4NDI5NTY4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgIDkwMzE2ODAsICAgIDkwMzE2ODAsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICAgOTYzMzc5MiwgICAgOTYzMzc5MiwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDEwMjM1OTA0LCAgIDEwMjM1OTA0LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgMTA4MzgwMTYsICAgMTA4MzgwMTYsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICAxMTQ0MDEyOCwgICAxMTQ0MDEyOCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDEyMDQyMjQwLCAgIDEyMDQyMjQwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgMTI2NDQzNTIsICAgMTI2NDQzNTIsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICAxMzI0NjQ2NCwgICAxMzI0NjQ2NCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgIDEzODQ4NTc2LCAgIDEzODQ4NTc2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgMTQ0NTA2ODgsICAgMTQ0NTA2ODgsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICAxNTA1MjgwMCwgICAxNTA1MjgwMCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDE1NjU0OTEyLCAgIDE1NjU0OTEyLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgMTYyNTcwMjQsICAgMTYyNTcwMjQsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICAxNjg1OTEzNiwgICAxNjg1OTEzNiwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDE3NDYxMjQ4LCAgIDE3NDYxMjQ4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgMTgwNjMzNjAsICAgMTgwNjMzNjAsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICAxODY2NTQ3MiwgICAxODY2NTQ3MiwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgIDE5MjY3NTg0LCAgIDE5MjY3NTg0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgMTk4Njk2OTYsICAgMTk4Njk2OTYsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICAyMDQ3MTgwOCwgICAyMDQ3MTgwOCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDIxMDczOTIwLCAgIDIxMDczOTIwLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgMjE2NzYwMzIsICAgMjE2NzYwMzIsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICAyMjI3ODE0NCwgICAyMjI3ODE0NCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDIyODgwMjU2LCAgIDIyODgwMjU2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgMjM0ODIzNjgsICAgMjM0ODIzNjgsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICAyNDA4NDQ4MCwgICAyNDA4NDQ4MCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ4OGQzY2M5CiswLCAgIDI0Njg2NTkyLCAgIDI0Njg2NTkyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgMjUyODg3MDQsICAgMjUyODg3MDQsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICAyNTg5MDgxNiwgICAyNTg5MDgxNiwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDI2NDkyOTI4LCAgIDI2NDkyOTI4LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgMjcwOTUwNDAsICAgMjcwOTUwNDAsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICAyNzY5NzE1MiwgICAyNzY5NzE1MiwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDI4Mjk5MjY0LCAgIDI4Mjk5MjY0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgMjg5MDEzNzYsICAgMjg5MDEzNzYsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgICAyOTUwMzQ4OCwgICAyOTUwMzQ4OCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDMwMTA1NjAwLCAgIDMwMTA1NjAwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgMzA3MDc3MTIsICAgMzA3MDc3MTIsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgICAzMTMwOTgyNCwgICAzMTMwOTgyNCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDMxOTExOTM2LCAgIDMxOTExOTM2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgMzI1MTQwNDgsICAgMzI1MTQwNDgsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMDQzNDU0MAorMCwgICAzMzExNjE2MCwgICAzMzExNjE2MCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ1MDUzY2MxCiswLCAgIDMzNzE4MjcyLCAgIDMzNzE4MjcyLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjMwNDNhYWYKKzAsICAgMzQzMjAzODQsICAgMzQzMjAzODQsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2OTNhM2E2NworMCwgICAzNDkyMjQ5NiwgICAzNDkyMjQ5NiwgICA2MDIxMTIsICAgICAgMTQ5LCAweDMxMzA0YTM0CiswLCAgIDM1NTI0NjA4LCAgIDM1NTI0NjA4LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjE2MDNhYWIKKzAsICAgMzYxMjY3MjAsICAgMzYxMjY3MjAsICAgNjAyMTEyLCAgICAgIDEzMiwgMHhlNDJkNDNiMworMCwgICAzNjcyODgzMiwgICAzNjcyODgzMiwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDM3MzMwOTQ0LCAgIDM3MzMwOTQ0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgMzc5MzMwNTYsICAgMzc5MzMwNTYsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICAzODUzNTE2OCwgICAzODUzNTE2OCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDM5MTM3MjgwLCAgIDM5MTM3MjgwLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgMzk3MzkzOTIsICAgMzk3MzkzOTIsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA0MDM0MTUwNCwgICA0MDM0MTUwNCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDQwOTQzNjE2LCAgIDQwOTQzNjE2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgNDE1NDU3MjgsICAgNDE1NDU3MjgsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICA0MjE0Nzg0MCwgICA0MjE0Nzg0MCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgIDQyNzQ5OTUyLCAgIDQyNzQ5OTUyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgNDMzNTIwNjQsICAgNDMzNTIwNjQsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICA0Mzk1NDE3NiwgICA0Mzk1NDE3NiwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDQ0NTU2Mjg4LCAgIDQ0NTU2Mjg4LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgNDUxNTg0MDAsICAgNDUxNTg0MDAsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA0NTc2MDUxMiwgICA0NTc2MDUxMiwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDQ2MzYyNjI0LCAgIDQ2MzYyNjI0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgNDY5NjQ3MzYsICAgNDY5NjQ3MzYsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICA0NzU2Njg0OCwgICA0NzU2Njg0OCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgIDQ4MTY4OTYwLCAgIDQ4MTY4OTYwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgNDg3NzEwNzIsICAgNDg3NzEwNzIsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICA0OTM3MzE4NCwgICA0OTM3MzE4NCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDQ5OTc1Mjk2LCAgIDQ5OTc1Mjk2LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgNTA1Nzc0MDgsICAgNTA1Nzc0MDgsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA1MTE3OTUyMCwgICA1MTE3OTUyMCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDUxNzgxNjMyLCAgIDUxNzgxNjMyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgNTIzODM3NDQsICAgNTIzODM3NDQsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICA1Mjk4NTg1NiwgICA1Mjk4NTg1NiwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ4OGQzY2M5CiswLCAgIDUzNTg3OTY4LCAgIDUzNTg3OTY4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgNTQxOTAwODAsICAgNTQxOTAwODAsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICA1NDc5MjE5MiwgICA1NDc5MjE5MiwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDU1Mzk0MzA0LCAgIDU1Mzk0MzA0LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgNTU5OTY0MTYsICAgNTU5OTY0MTYsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA1NjU5ODUyOCwgICA1NjU5ODUyOCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDU3MjAwNjQwLCAgIDU3MjAwNjQwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgNTc4MDI3NTIsICAgNTc4MDI3NTIsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgICA1ODQwNDg2NCwgICA1ODQwNDg2NCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDU5MDA2OTc2LCAgIDU5MDA2OTc2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgNTk2MDkwODgsICAgNTk2MDkwODgsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgICA2MDIxMTIwMCwgICA2MDIxMTIwMCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDYwODEzMzEyLCAgIDYwODEzMzEyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgNjE0MTU0MjQsICAgNjE0MTU0MjQsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMDQzNDU0MAorMCwgICA2MjAxNzUzNiwgICA2MjAxNzUzNiwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ1MDUzY2MxCiswLCAgIDYyNjE5NjQ4LCAgIDYyNjE5NjQ4LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjMwNDNhYWYKKzAsICAgNjMyMjE3NjAsICAgNjMyMjE3NjAsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2OTNhM2E2NworMCwgICA2MzgyMzg3MiwgICA2MzgyMzg3MiwgICA2MDIxMTIsICAgICAgMTQ5LCAweDMxMzA0YTM0CiswLCAgIDY0NDI1OTg0LCAgIDY0NDI1OTg0LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjE2MDNhYWIKKzAsICAgNjUwMjgwOTYsICAgNjUwMjgwOTYsICAgNjAyMTEyLCAgICAgIDEzMiwgMHhlNDJkNDNiMworMCwgICA2NTYzMDIwOCwgICA2NTYzMDIwOCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDY2MjMyMzIwLCAgIDY2MjMyMzIwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgNjY4MzQ0MzIsICAgNjY4MzQ0MzIsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICA2NzQzNjU0NCwgICA2NzQzNjU0NCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDY4MDM4NjU2LCAgIDY4MDM4NjU2LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgNjg2NDA3NjgsICAgNjg2NDA3NjgsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA2OTI0Mjg4MCwgICA2OTI0Mjg4MCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDY5ODQ0OTkyLCAgIDY5ODQ0OTkyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgNzA0NDcxMDQsICAgNzA0NDcxMDQsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICA3MTA0OTIxNiwgICA3MTA0OTIxNiwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgIDcxNjUxMzI4LCAgIDcxNjUxMzI4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgNzIyNTM0NDAsICAgNzIyNTM0NDAsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICA3Mjg1NTU1MiwgICA3Mjg1NTU1MiwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDczNDU3NjY0LCAgIDczNDU3NjY0LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgNzQwNTk3NzYsICAgNzQwNTk3NzYsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA3NDY2MTg4OCwgICA3NDY2MTg4OCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDc1MjY0MDAwLCAgIDc1MjY0MDAwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgNzU4NjYxMTIsICAgNzU4NjYxMTIsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICA3NjQ2ODIyNCwgICA3NjQ2ODIyNCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgIDc3MDcwMzM2LCAgIDc3MDcwMzM2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgNzc2NzI0NDgsICAgNzc2NzI0NDgsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICA3ODI3NDU2MCwgICA3ODI3NDU2MCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDc4ODc2NjcyLCAgIDc4ODc2NjcyLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgNzk0Nzg3ODQsICAgNzk0Nzg3ODQsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA4MDA4MDg5NiwgICA4MDA4MDg5NiwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDgwNjgzMDA4LCAgIDgwNjgzMDA4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgODEyODUxMjAsICAgODEyODUxMjAsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICA4MTg4NzIzMiwgICA4MTg4NzIzMiwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ4OGQzY2M5CiswLCAgIDgyNDg5MzQ0LCAgIDgyNDg5MzQ0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgODMwOTE0NTYsICAgODMwOTE0NTYsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICA4MzY5MzU2OCwgICA4MzY5MzU2OCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDg0Mjk1NjgwLCAgIDg0Mjk1NjgwLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgODQ4OTc3OTIsICAgODQ4OTc3OTIsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA4NTQ5OTkwNCwgICA4NTQ5OTkwNCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDg2MTAyMDE2LCAgIDg2MTAyMDE2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgODY3MDQxMjgsICAgODY3MDQxMjgsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgICA4NzMwNjI0MCwgICA4NzMwNjI0MCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDg3OTA4MzUyLCAgIDg3OTA4MzUyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgODg1MTA0NjQsICAgODg1MTA0NjQsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgICA4OTExMjU3NiwgICA4OTExMjU3NiwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDg5NzE0Njg4LCAgIDg5NzE0Njg4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgOTAzMTY4MDAsICAgOTAzMTY4MDAsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMDQzNDU0MAorMCwgICA5MDkxODkxMiwgICA5MDkxODkxMiwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ1MDUzY2MxCiswLCAgIDkxNTIxMDI0LCAgIDkxNTIxMDI0LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjMwNDNhYWYKKzAsICAgOTIxMjMxMzYsICAgOTIxMjMxMzYsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2OTNhM2E2NworMCwgICA5MjcyNTI0OCwgICA5MjcyNTI0OCwgICA2MDIxMTIsICAgICAgMTQ5LCAweDMxMzA0YTM0CiswLCAgIDkzMzI3MzYwLCAgIDkzMzI3MzYwLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjE2MDNhYWIKKzAsICAgOTM5Mjk0NzIsICAgOTM5Mjk0NzIsICAgNjAyMTEyLCAgICAgIDEzMiwgMHhlNDJkNDNiMworMCwgICA5NDUzMTU4NCwgICA5NDUzMTU4NCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgIDk1MTMzNjk2LCAgIDk1MTMzNjk2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAgOTU3MzU4MDgsICAgOTU3MzU4MDgsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgICA5NjMzNzkyMCwgICA5NjMzNzkyMCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgIDk2OTQwMDMyLCAgIDk2OTQwMDMyLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAgOTc1NDIxNDQsICAgOTc1NDIxNDQsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgICA5ODE0NDI1NiwgICA5ODE0NDI1NiwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgIDk4NzQ2MzY4LCAgIDk4NzQ2MzY4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAgOTkzNDg0ODAsICAgOTkzNDg0ODAsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgICA5OTk1MDU5MiwgICA5OTk1MDU5MiwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgMTAwNTUyNzA0LCAgMTAwNTUyNzA0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAxMDExNTQ4MTYsICAxMDExNTQ4MTYsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgIDEwMTc1NjkyOCwgIDEwMTc1NjkyOCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgMTAyMzU5MDQwLCAgMTAyMzU5MDQwLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAxMDI5NjExNTIsICAxMDI5NjExNTIsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgIDEwMzU2MzI2NCwgIDEwMzU2MzI2NCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgMTA0MTY1Mzc2LCAgMTA0MTY1Mzc2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAxMDQ3Njc0ODgsICAxMDQ3Njc0ODgsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgIDEwNTM2OTYwMCwgIDEwNTM2OTYwMCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgMTA1OTcxNzEyLCAgMTA1OTcxNzEyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAxMDY1NzM4MjQsICAxMDY1NzM4MjQsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgIDEwNzE3NTkzNiwgIDEwNzE3NTkzNiwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgMTA3Nzc4MDQ4LCAgMTA3Nzc4MDQ4LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAxMDgzODAxNjAsICAxMDgzODAxNjAsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgIDEwODk4MjI3MiwgIDEwODk4MjI3MiwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgMTA5NTg0Mzg0LCAgMTA5NTg0Mzg0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAxMTAxODY0OTYsICAxMTAxODY0OTYsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgIDExMDc4ODYwOCwgIDExMDc4ODYwOCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ4OGQzY2M5CiswLCAgMTExMzkwNzIwLCAgMTExMzkwNzIwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAxMTE5OTI4MzIsICAxMTE5OTI4MzIsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgIDExMjU5NDk0NCwgIDExMjU5NDk0NCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgMTEzMTk3MDU2LCAgMTEzMTk3MDU2LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAxMTM3OTkxNjgsICAxMTM3OTkxNjgsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgIDExNDQwMTI4MCwgIDExNDQwMTI4MCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgMTE1MDAzMzkyLCAgMTE1MDAzMzkyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAxMTU2MDU1MDQsICAxMTU2MDU1MDQsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgIDExNjIwNzYxNiwgIDExNjIwNzYxNiwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgMTE2ODA5NzI4LCAgMTE2ODA5NzI4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAxMTc0MTE4NDAsICAxMTc0MTE4NDAsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2MzlhM2E1YgorMCwgIDExODAxMzk1MiwgIDExODAxMzk1MiwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgMTE4NjE2MDY0LCAgMTE4NjE2MDY0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAxMTkyMTgxNzYsICAxMTkyMTgxNzYsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMDQzNDU0MAorMCwgIDExOTgyMDI4OCwgIDExOTgyMDI4OCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ1MDUzY2MxCiswLCAgMTIwNDIyNDAwLCAgMTIwNDIyNDAwLCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjMwNDNhYWYKKzAsICAxMjEwMjQ1MTIsICAxMjEwMjQ1MTIsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2OTNhM2E2NworMCwgIDEyMTYyNjYyNCwgIDEyMTYyNjYyNCwgICA2MDIxMTIsICAgICAgMTQ5LCAweDMxMzA0YTM0CiswLCAgMTIyMjI4NzM2LCAgMTIyMjI4NzM2LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MjE2MDNhYWIKKzAsICAxMjI4MzA4NDgsICAxMjI4MzA4NDgsICAgNjAyMTEyLCAgICAgIDEzMiwgMHhlNDJkNDNiMworMCwgIDEyMzQzMjk2MCwgIDEyMzQzMjk2MCwgICA2MDIxMTIsICAgICAgMTM1LCAweDViMWYzY2VkCiswLCAgMTI0MDM1MDcyLCAgMTI0MDM1MDcyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAxMjQ2MzcxODQsICAxMjQ2MzcxODQsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgIDEyNTIzOTI5NiwgIDEyNTIzOTI5NiwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgMTI1ODQxNDA4LCAgMTI1ODQxNDA4LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAxMjY0NDM1MjAsICAxMjY0NDM1MjAsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgIDEyNzA0NTYzMiwgIDEyNzA0NTYzMiwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgMTI3NjQ3NzQ0LCAgMTI3NjQ3NzQ0LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAxMjgyNDk4NTYsICAxMjgyNDk4NTYsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgIDEyODg1MTk2OCwgIDEyODg1MTk2OCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgMTI5NDU0MDgwLCAgMTI5NDU0MDgwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAxMzAwNTYxOTIsICAxMzAwNTYxOTIsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgIDEzMDY1ODMwNCwgIDEzMDY1ODMwNCwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgMTMxMjYwNDE2LCAgMTMxMjYwNDE2LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAxMzE4NjI1MjgsICAxMzE4NjI1MjgsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgIDEzMjQ2NDY0MCwgIDEzMjQ2NDY0MCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgMTMzMDY2NzUyLCAgMTMzMDY2NzUyLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAxMzM2Njg4NjQsICAxMzM2Njg4NjQsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgIDEzNDI3MDk3NiwgIDEzNDI3MDk3NiwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ2YzkzY2M1CiswLCAgMTM0ODczMDg4LCAgMTM0ODczMDg4LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKKzAsICAxMzU0NzUyMDAsICAxMzU0NzUyMDAsICAgNjAyMTEyLCAgICAgIDE0NCwgMHhhMjZiNDU0NAorMCwgIDEzNjA3NzMxMiwgIDEzNjA3NzMxMiwgICA2MDIxMTIsICAgICAgMTI5LCAweGY3ZGUzYmM3CiswLCAgMTM2Njc5NDI0LCAgMTM2Njc5NDI0LCAgIDYwMjExMiwgICAgICAxMTEsIDB4MWZiYzNhYTcKKzAsICAxMzcyODE1MzYsICAxMzcyODE1MzYsICAgNjAyMTEyLCAgICAgIDEyNiwgMHg2NTdhM2E1ZgorMCwgIDEzNzg4MzY0OCwgIDEzNzg4MzY0OCwgICA2MDIxMTIsICAgICAgMTQwLCAweGRiNjU0MmVjCiswLCAgMTM4NDg1NzYwLCAgMTM4NDg1NzYwLCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmNiNzM4NjMKKzAsICAxMzkwODc4NzIsICAxMzkwODc4NzIsICAgNjAyMTEyLCAgICAgIDEzOCwgMHhhZDdlNDRiNgorMCwgIDEzOTY4OTk4NCwgIDEzOTY4OTk4NCwgICA2MDIxMTIsICAgICAgMTE5LCAweDQ4OGQzY2M5CiswLCAgMTQwMjkyMDk2LCAgMTQwMjkyMDk2LCAgIDYwMjExMiwgICAgICAxMjMsIDB4ZmU4YjM4NjcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FkdHMtaWQzdjItdHdvLXRhZ3MtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS9hZHRzLWlkM3YyLXR3by10YWdzLWRlbXV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZmZkMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hZHRzLWlkM3YyLXR3by10YWdzLWRlbXV4CkBAIC0wLDAgKzEsNDc1IEBACisjdGIgMDogMS8yODIyNDAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBhYWMKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAgIDYwMjExMiwgICAgIDYwMjExMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgICAxMjA0MjI0LCAgICAxMjA0MjI0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgIDE4MDYzMzYsICAgIDE4MDYzMzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAgMjQwODQ0OCwgICAgMjQwODQ0OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgICAzMDEwNTYwLCAgICAzMDEwNTYwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgIDM2MTI2NzIsICAgIDM2MTI2NzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAgNDIxNDc4NCwgICAgNDIxNDc4NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgICA0ODE2ODk2LCAgICA0ODE2ODk2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgIDU0MTkwMDgsICAgIDU0MTkwMDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAgNjAyMTEyMCwgICAgNjAyMTEyMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgICA2NjIzMjMyLCAgICA2NjIzMjMyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgIDcyMjUzNDQsICAgIDcyMjUzNDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAgNzgyNzQ1NiwgICAgNzgyNzQ1NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgICA4NDI5NTY4LCAgICA4NDI5NTY4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgIDkwMzE2ODAsICAgIDkwMzE2ODAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAgOTYzMzc5MiwgICAgOTYzMzc5MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDEwMjM1OTA0LCAgIDEwMjM1OTA0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMTA4MzgwMTYsICAgMTA4MzgwMTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAxMTQ0MDEyOCwgICAxMTQ0MDEyOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDEyMDQyMjQwLCAgIDEyMDQyMjQwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMTI2NDQzNTIsICAgMTI2NDQzNTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAxMzI0NjQ2NCwgICAxMzI0NjQ2NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDEzODQ4NTc2LCAgIDEzODQ4NTc2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMTQ0NTA2ODgsICAgMTQ0NTA2ODgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAxNTA1MjgwMCwgICAxNTA1MjgwMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDE1NjU0OTEyLCAgIDE1NjU0OTEyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMTYyNTcwMjQsICAgMTYyNTcwMjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAxNjg1OTEzNiwgICAxNjg1OTEzNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDE3NDYxMjQ4LCAgIDE3NDYxMjQ4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMTgwNjMzNjAsICAgMTgwNjMzNjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAxODY2NTQ3MiwgICAxODY2NTQ3MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDE5MjY3NTg0LCAgIDE5MjY3NTg0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMTk4Njk2OTYsICAgMTk4Njk2OTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAyMDQ3MTgwOCwgICAyMDQ3MTgwOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDIxMDczOTIwLCAgIDIxMDczOTIwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMjE2NzYwMzIsICAgMjE2NzYwMzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAyMjI3ODE0NCwgICAyMjI3ODE0NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDIyODgwMjU2LCAgIDIyODgwMjU2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMjM0ODIzNjgsICAgMjM0ODIzNjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAyNDA4NDQ4MCwgICAyNDA4NDQ4MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDI0Njg2NTkyLCAgIDI0Njg2NTkyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMjUyODg3MDQsICAgMjUyODg3MDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAyNTg5MDgxNiwgICAyNTg5MDgxNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDI2NDkyOTI4LCAgIDI2NDkyOTI4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMjcwOTUwNDAsICAgMjcwOTUwNDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAyNzY5NzE1MiwgICAyNzY5NzE1MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDI4Mjk5MjY0LCAgIDI4Mjk5MjY0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMjg5MDEzNzYsICAgMjg5MDEzNzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAyOTUwMzQ4OCwgICAyOTUwMzQ4OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDMwMTA1NjAwLCAgIDMwMTA1NjAwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMzA3MDc3MTIsICAgMzA3MDc3MTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAzMTMwOTgyNCwgICAzMTMwOTgyNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDMxOTExOTM2LCAgIDMxOTExOTM2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMzI1MTQwNDgsICAgMzI1MTQwNDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAzMzExNjE2MCwgICAzMzExNjE2MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDMzNzE4MjcyLCAgIDMzNzE4MjcyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMzQzMjAzODQsICAgMzQzMjAzODQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAzNDkyMjQ5NiwgICAzNDkyMjQ5NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDM1NTI0NjA4LCAgIDM1NTI0NjA4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMzYxMjY3MjAsICAgMzYxMjY3MjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAzNjcyODgzMiwgICAzNjcyODgzMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDM3MzMwOTQ0LCAgIDM3MzMwOTQ0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMzc5MzMwNTYsICAgMzc5MzMwNTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICAzODUzNTE2OCwgICAzODUzNTE2OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDM5MTM3MjgwLCAgIDM5MTM3MjgwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgMzk3MzkzOTIsICAgMzk3MzkzOTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA0MDM0MTUwNCwgICA0MDM0MTUwNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDQwOTQzNjE2LCAgIDQwOTQzNjE2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNDE1NDU3MjgsICAgNDE1NDU3MjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA0MjE0Nzg0MCwgICA0MjE0Nzg0MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDQyNzQ5OTUyLCAgIDQyNzQ5OTUyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNDMzNTIwNjQsICAgNDMzNTIwNjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA0Mzk1NDE3NiwgICA0Mzk1NDE3NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDQ0NTU2Mjg4LCAgIDQ0NTU2Mjg4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNDUxNTg0MDAsICAgNDUxNTg0MDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA0NTc2MDUxMiwgICA0NTc2MDUxMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDQ2MzYyNjI0LCAgIDQ2MzYyNjI0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNDY5NjQ3MzYsICAgNDY5NjQ3MzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA0NzU2Njg0OCwgICA0NzU2Njg0OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDQ4MTY4OTYwLCAgIDQ4MTY4OTYwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNDg3NzEwNzIsICAgNDg3NzEwNzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA0OTM3MzE4NCwgICA0OTM3MzE4NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDQ5OTc1Mjk2LCAgIDQ5OTc1Mjk2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNTA1Nzc0MDgsICAgNTA1Nzc0MDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA1MTE3OTUyMCwgICA1MTE3OTUyMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDUxNzgxNjMyLCAgIDUxNzgxNjMyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNTIzODM3NDQsICAgNTIzODM3NDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA1Mjk4NTg1NiwgICA1Mjk4NTg1NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDUzNTg3OTY4LCAgIDUzNTg3OTY4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNTQxOTAwODAsICAgNTQxOTAwODAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA1NDc5MjE5MiwgICA1NDc5MjE5MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDU1Mzk0MzA0LCAgIDU1Mzk0MzA0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNTU5OTY0MTYsICAgNTU5OTY0MTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA1NjU5ODUyOCwgICA1NjU5ODUyOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDU3MjAwNjQwLCAgIDU3MjAwNjQwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNTc4MDI3NTIsICAgNTc4MDI3NTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA1ODQwNDg2NCwgICA1ODQwNDg2NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDU5MDA2OTc2LCAgIDU5MDA2OTc2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNTk2MDkwODgsICAgNTk2MDkwODgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA2MDIxMTIwMCwgICA2MDIxMTIwMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDYwODEzMzEyLCAgIDYwODEzMzEyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNjE0MTU0MjQsICAgNjE0MTU0MjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA2MjAxNzUzNiwgICA2MjAxNzUzNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDYyNjE5NjQ4LCAgIDYyNjE5NjQ4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNjMyMjE3NjAsICAgNjMyMjE3NjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA2MzgyMzg3MiwgICA2MzgyMzg3MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDY0NDI1OTg0LCAgIDY0NDI1OTg0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNjUwMjgwOTYsICAgNjUwMjgwOTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA2NTYzMDIwOCwgICA2NTYzMDIwOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDY2MjMyMzIwLCAgIDY2MjMyMzIwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNjY4MzQ0MzIsICAgNjY4MzQ0MzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA2NzQzNjU0NCwgICA2NzQzNjU0NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDY4MDM4NjU2LCAgIDY4MDM4NjU2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNjg2NDA3NjgsICAgNjg2NDA3NjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA2OTI0Mjg4MCwgICA2OTI0Mjg4MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDY5ODQ0OTkyLCAgIDY5ODQ0OTkyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNzA0NDcxMDQsICAgNzA0NDcxMDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA3MTA0OTIxNiwgICA3MTA0OTIxNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDcxNjUxMzI4LCAgIDcxNjUxMzI4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNzIyNTM0NDAsICAgNzIyNTM0NDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA3Mjg1NTU1MiwgICA3Mjg1NTU1MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDczNDU3NjY0LCAgIDczNDU3NjY0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNzQwNTk3NzYsICAgNzQwNTk3NzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA3NDY2MTg4OCwgICA3NDY2MTg4OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDc1MjY0MDAwLCAgIDc1MjY0MDAwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNzU4NjYxMTIsICAgNzU4NjYxMTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA3NjQ2ODIyNCwgICA3NjQ2ODIyNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDc3MDcwMzM2LCAgIDc3MDcwMzM2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNzc2NzI0NDgsICAgNzc2NzI0NDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA3ODI3NDU2MCwgICA3ODI3NDU2MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDc4ODc2NjcyLCAgIDc4ODc2NjcyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgNzk0Nzg3ODQsICAgNzk0Nzg3ODQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA4MDA4MDg5NiwgICA4MDA4MDg5NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDgwNjgzMDA4LCAgIDgwNjgzMDA4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgODEyODUxMjAsICAgODEyODUxMjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA4MTg4NzIzMiwgICA4MTg4NzIzMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDgyNDg5MzQ0LCAgIDgyNDg5MzQ0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgODMwOTE0NTYsICAgODMwOTE0NTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA4MzY5MzU2OCwgICA4MzY5MzU2OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDg0Mjk1NjgwLCAgIDg0Mjk1NjgwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgODQ4OTc3OTIsICAgODQ4OTc3OTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA4NTQ5OTkwNCwgICA4NTQ5OTkwNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDg2MTAyMDE2LCAgIDg2MTAyMDE2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgODY3MDQxMjgsICAgODY3MDQxMjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA4NzMwNjI0MCwgICA4NzMwNjI0MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDg3OTA4MzUyLCAgIDg3OTA4MzUyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgODg1MTA0NjQsICAgODg1MTA0NjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA4OTExMjU3NiwgICA4OTExMjU3NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDg5NzE0Njg4LCAgIDg5NzE0Njg4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgOTAzMTY4MDAsICAgOTAzMTY4MDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA5MDkxODkxMiwgICA5MDkxODkxMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDkxNTIxMDI0LCAgIDkxNTIxMDI0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgOTIxMjMxMzYsICAgOTIxMjMxMzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA5MjcyNTI0OCwgICA5MjcyNTI0OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDkzMzI3MzYwLCAgIDkzMzI3MzYwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgOTM5Mjk0NzIsICAgOTM5Mjk0NzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA5NDUzMTU4NCwgICA5NDUzMTU4NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDk1MTMzNjk2LCAgIDk1MTMzNjk2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgOTU3MzU4MDgsICAgOTU3MzU4MDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA5NjMzNzkyMCwgICA5NjMzNzkyMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDk2OTQwMDMyLCAgIDk2OTQwMDMyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgOTc1NDIxNDQsICAgOTc1NDIxNDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA5ODE0NDI1NiwgICA5ODE0NDI1NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgIDk4NzQ2MzY4LCAgIDk4NzQ2MzY4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAgOTkzNDg0ODAsICAgOTkzNDg0ODAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgICA5OTk1MDU5MiwgICA5OTk1MDU5MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTAwNTUyNzA0LCAgMTAwNTUyNzA0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMDExNTQ4MTYsICAxMDExNTQ4MTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEwMTc1NjkyOCwgIDEwMTc1NjkyOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTAyMzU5MDQwLCAgMTAyMzU5MDQwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMDI5NjExNTIsICAxMDI5NjExNTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEwMzU2MzI2NCwgIDEwMzU2MzI2NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTA0MTY1Mzc2LCAgMTA0MTY1Mzc2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMDQ3Njc0ODgsICAxMDQ3Njc0ODgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEwNTM2OTYwMCwgIDEwNTM2OTYwMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTA1OTcxNzEyLCAgMTA1OTcxNzEyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMDY1NzM4MjQsICAxMDY1NzM4MjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEwNzE3NTkzNiwgIDEwNzE3NTkzNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTA3Nzc4MDQ4LCAgMTA3Nzc4MDQ4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMDgzODAxNjAsICAxMDgzODAxNjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEwODk4MjI3MiwgIDEwODk4MjI3MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTA5NTg0Mzg0LCAgMTA5NTg0Mzg0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMTAxODY0OTYsICAxMTAxODY0OTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDExMDc4ODYwOCwgIDExMDc4ODYwOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTExMzkwNzIwLCAgMTExMzkwNzIwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMTE5OTI4MzIsICAxMTE5OTI4MzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDExMjU5NDk0NCwgIDExMjU5NDk0NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTEzMTk3MDU2LCAgMTEzMTk3MDU2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMTM3OTkxNjgsICAxMTM3OTkxNjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDExNDQwMTI4MCwgIDExNDQwMTI4MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTE1MDAzMzkyLCAgMTE1MDAzMzkyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMTU2MDU1MDQsICAxMTU2MDU1MDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDExNjIwNzYxNiwgIDExNjIwNzYxNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTE2ODA5NzI4LCAgMTE2ODA5NzI4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMTc0MTE4NDAsICAxMTc0MTE4NDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDExODAxMzk1MiwgIDExODAxMzk1MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTE4NjE2MDY0LCAgMTE4NjE2MDY0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMTkyMTgxNzYsICAxMTkyMTgxNzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDExOTgyMDI4OCwgIDExOTgyMDI4OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTIwNDIyNDAwLCAgMTIwNDIyNDAwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMjEwMjQ1MTIsICAxMjEwMjQ1MTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEyMTYyNjYyNCwgIDEyMTYyNjYyNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTIyMjI4NzM2LCAgMTIyMjI4NzM2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMjI4MzA4NDgsICAxMjI4MzA4NDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEyMzQzMjk2MCwgIDEyMzQzMjk2MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTI0MDM1MDcyLCAgMTI0MDM1MDcyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMjQ2MzcxODQsICAxMjQ2MzcxODQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEyNTIzOTI5NiwgIDEyNTIzOTI5NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTI1ODQxNDA4LCAgMTI1ODQxNDA4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMjY0NDM1MjAsICAxMjY0NDM1MjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEyNzA0NTYzMiwgIDEyNzA0NTYzMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTI3NjQ3NzQ0LCAgMTI3NjQ3NzQ0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMjgyNDk4NTYsICAxMjgyNDk4NTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEyODg1MTk2OCwgIDEyODg1MTk2OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTI5NDU0MDgwLCAgMTI5NDU0MDgwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMzAwNTYxOTIsICAxMzAwNTYxOTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEzMDY1ODMwNCwgIDEzMDY1ODMwNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTMxMjYwNDE2LCAgMTMxMjYwNDE2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMzE4NjI1MjgsICAxMzE4NjI1MjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEzMjQ2NDY0MCwgIDEzMjQ2NDY0MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTMzMDY2NzUyLCAgMTMzMDY2NzUyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMzM2Njg4NjQsICAxMzM2Njg4NjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEzNDI3MDk3NiwgIDEzNDI3MDk3NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTM0ODczMDg4LCAgMTM0ODczMDg4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMzU0NzUyMDAsICAxMzU0NzUyMDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEzNjA3NzMxMiwgIDEzNjA3NzMxMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTM2Njc5NDI0LCAgMTM2Njc5NDI0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMzcyODE1MzYsICAxMzcyODE1MzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEzNzg4MzY0OCwgIDEzNzg4MzY0OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTM4NDg1NzYwLCAgMTM4NDg1NzYwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxMzkwODc4NzIsICAxMzkwODc4NzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDEzOTY4OTk4NCwgIDEzOTY4OTk4NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTQwMjkyMDk2LCAgMTQwMjkyMDk2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNDA4OTQyMDgsICAxNDA4OTQyMDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE0MTQ5NjMyMCwgIDE0MTQ5NjMyMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTQyMDk4NDMyLCAgMTQyMDk4NDMyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNDI3MDA1NDQsICAxNDI3MDA1NDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE0MzMwMjY1NiwgIDE0MzMwMjY1NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTQzOTA0NzY4LCAgMTQzOTA0NzY4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNDQ1MDY4ODAsICAxNDQ1MDY4ODAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE0NTEwODk5MiwgIDE0NTEwODk5MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTQ1NzExMTA0LCAgMTQ1NzExMTA0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNDYzMTMyMTYsICAxNDYzMTMyMTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE0NjkxNTMyOCwgIDE0NjkxNTMyOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTQ3NTE3NDQwLCAgMTQ3NTE3NDQwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNDgxMTk1NTIsICAxNDgxMTk1NTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE0ODcyMTY2NCwgIDE0ODcyMTY2NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTQ5MzIzNzc2LCAgMTQ5MzIzNzc2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNDk5MjU4ODgsICAxNDk5MjU4ODgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE1MDUyODAwMCwgIDE1MDUyODAwMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTUxMTMwMTEyLCAgMTUxMTMwMTEyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNTE3MzIyMjQsICAxNTE3MzIyMjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE1MjMzNDMzNiwgIDE1MjMzNDMzNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTUyOTM2NDQ4LCAgMTUyOTM2NDQ4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNTM1Mzg1NjAsICAxNTM1Mzg1NjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE1NDE0MDY3MiwgIDE1NDE0MDY3MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTU0NzQyNzg0LCAgMTU0NzQyNzg0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNTUzNDQ4OTYsICAxNTUzNDQ4OTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE1NTk0NzAwOCwgIDE1NTk0NzAwOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTU2NTQ5MTIwLCAgMTU2NTQ5MTIwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNTcxNTEyMzIsICAxNTcxNTEyMzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE1Nzc1MzM0NCwgIDE1Nzc1MzM0NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTU4MzU1NDU2LCAgMTU4MzU1NDU2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNTg5NTc1NjgsICAxNTg5NTc1NjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE1OTU1OTY4MCwgIDE1OTU1OTY4MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTYwMTYxNzkyLCAgMTYwMTYxNzkyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNjA3NjM5MDQsICAxNjA3NjM5MDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE2MTM2NjAxNiwgIDE2MTM2NjAxNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTYxOTY4MTI4LCAgMTYxOTY4MTI4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNjI1NzAyNDAsICAxNjI1NzAyNDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE2MzE3MjM1MiwgIDE2MzE3MjM1MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTYzNzc0NDY0LCAgMTYzNzc0NDY0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNjQzNzY1NzYsICAxNjQzNzY1NzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE2NDk3ODY4OCwgIDE2NDk3ODY4OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTY1NTgwODAwLCAgMTY1NTgwODAwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNjYxODI5MTIsICAxNjYxODI5MTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE2Njc4NTAyNCwgIDE2Njc4NTAyNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTY3Mzg3MTM2LCAgMTY3Mzg3MTM2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNjc5ODkyNDgsICAxNjc5ODkyNDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE2ODU5MTM2MCwgIDE2ODU5MTM2MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTY5MTkzNDcyLCAgMTY5MTkzNDcyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNjk3OTU1ODQsICAxNjk3OTU1ODQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE3MDM5NzY5NiwgIDE3MDM5NzY5NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTcwOTk5ODA4LCAgMTcwOTk5ODA4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNzE2MDE5MjAsICAxNzE2MDE5MjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE3MjIwNDAzMiwgIDE3MjIwNDAzMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTcyODA2MTQ0LCAgMTcyODA2MTQ0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNzM0MDgyNTYsICAxNzM0MDgyNTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE3NDAxMDM2OCwgIDE3NDAxMDM2OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTc0NjEyNDgwLCAgMTc0NjEyNDgwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNzUyMTQ1OTIsICAxNzUyMTQ1OTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE3NTgxNjcwNCwgIDE3NTgxNjcwNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTc2NDE4ODE2LCAgMTc2NDE4ODE2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNzcwMjA5MjgsICAxNzcwMjA5MjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE3NzYyMzA0MCwgIDE3NzYyMzA0MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTc4MjI1MTUyLCAgMTc4MjI1MTUyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxNzg4MjcyNjQsICAxNzg4MjcyNjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE3OTQyOTM3NiwgIDE3OTQyOTM3NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTgwMDMxNDg4LCAgMTgwMDMxNDg4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxODA2MzM2MDAsICAxODA2MzM2MDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE4MTIzNTcxMiwgIDE4MTIzNTcxMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTgxODM3ODI0LCAgMTgxODM3ODI0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxODI0Mzk5MzYsICAxODI0Mzk5MzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE4MzA0MjA0OCwgIDE4MzA0MjA0OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTgzNjQ0MTYwLCAgMTgzNjQ0MTYwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxODQyNDYyNzIsICAxODQyNDYyNzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE4NDg0ODM4NCwgIDE4NDg0ODM4NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTg1NDUwNDk2LCAgMTg1NDUwNDk2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxODYwNTI2MDgsICAxODYwNTI2MDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE4NjY1NDcyMCwgIDE4NjY1NDcyMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTg3MjU2ODMyLCAgMTg3MjU2ODMyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxODc4NTg5NDQsICAxODc4NTg5NDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE4ODQ2MTA1NiwgIDE4ODQ2MTA1NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTg5MDYzMTY4LCAgMTg5MDYzMTY4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxODk2NjUyODAsICAxODk2NjUyODAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE5MDI2NzM5MiwgIDE5MDI2NzM5MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTkwODY5NTA0LCAgMTkwODY5NTA0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxOTE0NzE2MTYsICAxOTE0NzE2MTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE5MjA3MzcyOCwgIDE5MjA3MzcyOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTkyNjc1ODQwLCAgMTkyNjc1ODQwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxOTMyNzc5NTIsICAxOTMyNzc5NTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE5Mzg4MDA2NCwgIDE5Mzg4MDA2NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTk0NDgyMTc2LCAgMTk0NDgyMTc2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxOTUwODQyODgsICAxOTUwODQyODgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE5NTY4NjQwMCwgIDE5NTY4NjQwMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTk2Mjg4NTEyLCAgMTk2Mjg4NTEyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxOTY4OTA2MjQsICAxOTY4OTA2MjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE5NzQ5MjczNiwgIDE5NzQ5MjczNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTk4MDk0ODQ4LCAgMTk4MDk0ODQ4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAxOTg2OTY5NjAsICAxOTg2OTY5NjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDE5OTI5OTA3MiwgIDE5OTI5OTA3MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMTk5OTAxMTg0LCAgMTk5OTAxMTg0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMDA1MDMyOTYsICAyMDA1MDMyOTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIwMTEwNTQwOCwgIDIwMTEwNTQwOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjAxNzA3NTIwLCAgMjAxNzA3NTIwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMDIzMDk2MzIsICAyMDIzMDk2MzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIwMjkxMTc0NCwgIDIwMjkxMTc0NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjAzNTEzODU2LCAgMjAzNTEzODU2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMDQxMTU5NjgsICAyMDQxMTU5NjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIwNDcxODA4MCwgIDIwNDcxODA4MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjA1MzIwMTkyLCAgMjA1MzIwMTkyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMDU5MjIzMDQsICAyMDU5MjIzMDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIwNjUyNDQxNiwgIDIwNjUyNDQxNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjA3MTI2NTI4LCAgMjA3MTI2NTI4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMDc3Mjg2NDAsICAyMDc3Mjg2NDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIwODMzMDc1MiwgIDIwODMzMDc1MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjA4OTMyODY0LCAgMjA4OTMyODY0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMDk1MzQ5NzYsICAyMDk1MzQ5NzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIxMDEzNzA4OCwgIDIxMDEzNzA4OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjEwNzM5MjAwLCAgMjEwNzM5MjAwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMTEzNDEzMTIsICAyMTEzNDEzMTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIxMTk0MzQyNCwgIDIxMTk0MzQyNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjEyNTQ1NTM2LCAgMjEyNTQ1NTM2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMTMxNDc2NDgsICAyMTMxNDc2NDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIxMzc0OTc2MCwgIDIxMzc0OTc2MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjE0MzUxODcyLCAgMjE0MzUxODcyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMTQ5NTM5ODQsICAyMTQ5NTM5ODQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIxNTU1NjA5NiwgIDIxNTU1NjA5NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjE2MTU4MjA4LCAgMjE2MTU4MjA4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMTY3NjAzMjAsICAyMTY3NjAzMjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIxNzM2MjQzMiwgIDIxNzM2MjQzMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjE3OTY0NTQ0LCAgMjE3OTY0NTQ0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMTg1NjY2NTYsICAyMTg1NjY2NTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIxOTE2ODc2OCwgIDIxOTE2ODc2OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjE5NzcwODgwLCAgMjE5NzcwODgwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMjAzNzI5OTIsICAyMjAzNzI5OTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIyMDk3NTEwNCwgIDIyMDk3NTEwNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjIxNTc3MjE2LCAgMjIxNTc3MjE2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMjIxNzkzMjgsICAyMjIxNzkzMjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIyMjc4MTQ0MCwgIDIyMjc4MTQ0MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjIzMzgzNTUyLCAgMjIzMzgzNTUyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMjM5ODU2NjQsICAyMjM5ODU2NjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIyNDU4Nzc3NiwgIDIyNDU4Nzc3NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjI1MTg5ODg4LCAgMjI1MTg5ODg4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMjU3OTIwMDAsICAyMjU3OTIwMDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIyNjM5NDExMiwgIDIyNjM5NDExMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjI2OTk2MjI0LCAgMjI2OTk2MjI0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMjc1OTgzMzYsICAyMjc1OTgzMzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIyODIwMDQ0OCwgIDIyODIwMDQ0OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjI4ODAyNTYwLCAgMjI4ODAyNTYwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMjk0MDQ2NzIsICAyMjk0MDQ2NzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIzMDAwNjc4NCwgIDIzMDAwNjc4NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjMwNjA4ODk2LCAgMjMwNjA4ODk2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMzEyMTEwMDgsICAyMzEyMTEwMDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIzMTgxMzEyMCwgIDIzMTgxMzEyMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjMyNDE1MjMyLCAgMjMyNDE1MjMyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMzMwMTczNDQsICAyMzMwMTczNDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIzMzYxOTQ1NiwgIDIzMzYxOTQ1NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjM0MjIxNTY4LCAgMjM0MjIxNTY4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMzQ4MjM2ODAsICAyMzQ4MjM2ODAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIzNTQyNTc5MiwgIDIzNTQyNTc5MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjM2MDI3OTA0LCAgMjM2MDI3OTA0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMzY2MzAwMTYsICAyMzY2MzAwMTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIzNzIzMjEyOCwgIDIzNzIzMjEyOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjM3ODM0MjQwLCAgMjM3ODM0MjQwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyMzg0MzYzNTIsICAyMzg0MzYzNTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDIzOTAzODQ2NCwgIDIzOTAzODQ2NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjM5NjQwNTc2LCAgMjM5NjQwNTc2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNDAyNDI2ODgsICAyNDAyNDI2ODgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI0MDg0NDgwMCwgIDI0MDg0NDgwMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjQxNDQ2OTEyLCAgMjQxNDQ2OTEyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNDIwNDkwMjQsICAyNDIwNDkwMjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI0MjY1MTEzNiwgIDI0MjY1MTEzNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjQzMjUzMjQ4LCAgMjQzMjUzMjQ4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNDM4NTUzNjAsICAyNDM4NTUzNjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI0NDQ1NzQ3MiwgIDI0NDQ1NzQ3MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjQ1MDU5NTg0LCAgMjQ1MDU5NTg0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNDU2NjE2OTYsICAyNDU2NjE2OTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI0NjI2MzgwOCwgIDI0NjI2MzgwOCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjQ2ODY1OTIwLCAgMjQ2ODY1OTIwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNDc0NjgwMzIsICAyNDc0NjgwMzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI0ODA3MDE0NCwgIDI0ODA3MDE0NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjQ4NjcyMjU2LCAgMjQ4NjcyMjU2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNDkyNzQzNjgsICAyNDkyNzQzNjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI0OTg3NjQ4MCwgIDI0OTg3NjQ4MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjUwNDc4NTkyLCAgMjUwNDc4NTkyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNTEwODA3MDQsICAyNTEwODA3MDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI1MTY4MjgxNiwgIDI1MTY4MjgxNiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjUyMjg0OTI4LCAgMjUyMjg0OTI4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNTI4ODcwNDAsICAyNTI4ODcwNDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI1MzQ4OTE1MiwgIDI1MzQ4OTE1MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjU0MDkxMjY0LCAgMjU0MDkxMjY0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNTQ2OTMzNzYsICAyNTQ2OTMzNzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI1NTI5NTQ4OCwgIDI1NTI5NTQ4OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjU1ODk3NjAwLCAgMjU1ODk3NjAwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNTY0OTk3MTIsICAyNTY0OTk3MTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI1NzEwMTgyNCwgIDI1NzEwMTgyNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjU3NzAzOTM2LCAgMjU3NzAzOTM2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNTgzMDYwNDgsICAyNTgzMDYwNDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI1ODkwODE2MCwgIDI1ODkwODE2MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjU5NTEwMjcyLCAgMjU5NTEwMjcyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNjAxMTIzODQsICAyNjAxMTIzODQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI2MDcxNDQ5NiwgIDI2MDcxNDQ5NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjYxMzE2NjA4LCAgMjYxMzE2NjA4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNjE5MTg3MjAsICAyNjE5MTg3MjAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI2MjUyMDgzMiwgIDI2MjUyMDgzMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjYzMTIyOTQ0LCAgMjYzMTIyOTQ0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNjM3MjUwNTYsICAyNjM3MjUwNTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI2NDMyNzE2OCwgIDI2NDMyNzE2OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjY0OTI5MjgwLCAgMjY0OTI5MjgwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNjU1MzEzOTIsICAyNjU1MzEzOTIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI2NjEzMzUwNCwgIDI2NjEzMzUwNCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjY2NzM1NjE2LCAgMjY2NzM1NjE2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNjczMzc3MjgsICAyNjczMzc3MjgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI2NzkzOTg0MCwgIDI2NzkzOTg0MCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjY4NTQxOTUyLCAgMjY4NTQxOTUyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNjkxNDQwNjQsICAyNjkxNDQwNjQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI2OTc0NjE3NiwgIDI2OTc0NjE3NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjcwMzQ4Mjg4LCAgMjcwMzQ4Mjg4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNzA5NTA0MDAsICAyNzA5NTA0MDAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI3MTU1MjUxMiwgIDI3MTU1MjUxMiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjcyMTU0NjI0LCAgMjcyMTU0NjI0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNzI3NTY3MzYsICAyNzI3NTY3MzYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI3MzM1ODg0OCwgIDI3MzM1ODg0OCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjczOTYwOTYwLCAgMjczOTYwOTYwLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNzQ1NjMwNzIsICAyNzQ1NjMwNzIsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI3NTE2NTE4NCwgIDI3NTE2NTE4NCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjc1NzY3Mjk2LCAgMjc1NzY3Mjk2LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNzYzNjk0MDgsICAyNzYzNjk0MDgsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI3Njk3MTUyMCwgIDI3Njk3MTUyMCwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjc3NTczNjMyLCAgMjc3NTczNjMyLCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNzgxNzU3NDQsICAyNzgxNzU3NDQsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI3ODc3Nzg1NiwgIDI3ODc3Nzg1NiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjc5Mzc5OTY4LCAgMjc5Mzc5OTY4LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyNzk5ODIwODAsICAyNzk5ODIwODAsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MworMCwgIDI4MDU4NDE5MiwgIDI4MDU4NDE5MiwgICA2MDIxMTIsICAgICAgMTI4LCAweDIzMjkxOTkzCiswLCAgMjgxMTg2MzA0LCAgMjgxMTg2MzA0LCAgIDYwMjExMiwgICAgICAxMjgsIDB4MjMyOTE5OTMKKzAsICAyODE3ODg0MTYsICAyODE3ODg0MTYsICAgNjAyMTEyLCAgICAgIDEyOCwgMHgyMzI5MTk5MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWR0c3RvYXNjX3RpY2tldDM3MTUgYi90ZXN0cy9yZWYvZmF0ZS9hZHRzdG9hc2NfdGlja2V0MzcxNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njc5NWEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYWR0c3RvYXNjX3RpY2tldDM3MTUKQEAgLTAsMCArMSw5NSBAQAorMDIyMWUwNDMzM2U2YWM0MzJmYTQyOTYwNTAyZjBkNWEgKnRlc3RzL2RhdGEvZmF0ZS9hZHRzdG9hc2NfdGlja2V0MzcxNS5tb3YKKzMzMzI0IHRlc3RzL2RhdGEvZmF0ZS9hZHRzdG9hc2NfdGlja2V0MzcxNS5tb3YKKyNleHRyYWRhdGEgMDogICAgICAgIDIsIDB4MDAzNDAwMjIKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IGFhYworI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgICAzNzEsIDB4MTRiMTFhNGYKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgIDQwMiwgMHgyZjAwYzQ4NworMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICAgNDAzLCAweDE5NTljMGQ0CiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgICAzOTYsIDB4OThhOWMxMzQKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAxMDI0LCAgICAgIDQwNSwgMHhmMGE1YzhjNworMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgIDEwMjQsICAgICAgNDMyLCAweGVmYWVkNjhmCiswLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgICAzNjksIDB4NDFlNGJjODEKKzAsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI0LCAgICAgIDM3MCwgMHgwMDUyYmE2NworMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgIDEwMjQsICAgICAgNDI2LCAweDliNjFkMzg5CiswLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgICAzNDYsIDB4ZjI0YWFjZjgKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAxMDI0LCAgICAgIDM2MSwgMHg4MTVhYTRiOQorMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgIDEwMjQsICAgICAgMzcwLCAweGFkMGRiMDEwCiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgICAzNzAsIDB4NmUyN2JkY2EKKzAsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAxMDI0LCAgICAgIDM1OCwgMHg5NzNjYWVkMgorMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgIDEwMjQsICAgICAgMzYyLCAweDhjNTdiMjVjCiswLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgICAzNTksIDB4OGM2YWIwNjMKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAxMDI0LCAgICAgIDM3MywgMHg3ODM4Yjc4ZgorMCwgICAgICAxNzQwOCwgICAgICAxNzQwOCwgICAgIDEwMjQsICAgICAgNDg5LCAweDhmYzJmN2YwCiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgICAzNDYsIDB4NGFjOGI2ZjgKKzAsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI0LCAgICAgIDM0MSwgMHhiNTM3YWJlZgorMCwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgIDEwMjQsICAgICAgMzUyLCAweGNjNDNiNzYxCiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTAyNCwgICAgICAzNTUsIDB4YjFiMmIyMzQKKzAsICAgICAgMjI1MjgsICAgICAgMjI1MjgsICAgICAxMDI0LCAgICAgIDM1NCwgMHhhODY1YTY4YworMCwgICAgICAyMzU1MiwgICAgICAyMzU1MiwgICAgIDEwMjQsICAgICAgMzcwLCAweGNhZDRhY2U1CiswLCAgICAgIDI0NTc2LCAgICAgIDI0NTc2LCAgICAgMTAyNCwgICAgICAzNjksIDB4NDkxMWFkZGMKKzAsICAgICAgMjU2MDAsICAgICAgMjU2MDAsICAgICAxMDI0LCAgICAgIDM2MywgMHg1YTE0YTgzNgorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgIDEwMjQsICAgICAgMzYxLCAweDZkMTBiNmJhCiswLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTAyNCwgICAgICAzNjUsIDB4ZmUxYmI1ZjMKKzAsICAgICAgMjg2NzIsICAgICAgMjg2NzIsICAgICAxMDI0LCAgICAgIDM2MiwgMHg2ZmM1YjI1MgorMCwgICAgICAyOTY5NiwgICAgICAyOTY5NiwgICAgIDEwMjQsICAgICAgMzY2LCAweGExMjJiNjU1CiswLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTAyNCwgICAgICAzNzEsIDB4ZDMzOGFlM2QKKzAsICAgICAgMzE3NDQsICAgICAgMzE3NDQsICAgICAxMDI0LCAgICAgIDM2MywgMHhkOTc3YWQ5NworMCwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgIDEwMjQsICAgICAgMzg0LCAweGU0NDNiY2M0CiswLCAgICAgIDMzNzkyLCAgICAgIDMzNzkyLCAgICAgMTAyNCwgICAgICAzNzQsIDB4MjgxYmI4Y2IKKzAsICAgICAgMzQ4MTYsICAgICAgMzQ4MTYsICAgICAxMDI0LCAgICAgIDM4NywgMHgyZDcwYmZlZgorMCwgICAgICAzNTg0MCwgICAgICAzNTg0MCwgICAgIDEwMjQsICAgICAgMzYzLCAweGE2ZTFiN2E2CiswLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgMTAyNCwgICAgICAzODcsIDB4YzVkNWM2MmIKKzAsICAgICAgMzc4ODgsICAgICAgMzc4ODgsICAgICAxMDI0LCAgICAgIDM3OCwgMHhkZjcxYzEyZgorMCwgICAgICAzODkxMiwgICAgICAzODkxMiwgICAgIDEwMjQsICAgICAgMzc3LCAweGJhOWZiZWFkCiswLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTAyNCwgICAgICAzNTksIDB4NDQ5NWJhYmYKKzAsICAgICAgNDA5NjAsICAgICAgNDA5NjAsICAgICAxMDI0LCAgICAgIDM3MywgMHg2ZmJlYjhhZAorMCwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgIDEwMjQsICAgICAgNDQ2LCAweDNmOThlMTlhCiswLCAgICAgIDQzMDA4LCAgICAgIDQzMDA4LCAgICAgMTAyNCwgICAgICAzNDgsIDB4N2FhOGIzZDAKKzAsICAgICAgNDQwMzIsICAgICAgNDQwMzIsICAgICAxMDI0LCAgICAgIDM1NSwgMHgzY2Y5YWJkZQorMCwgICAgICA0NTA1NiwgICAgICA0NTA1NiwgICAgIDEwMjQsICAgICAgMzYwLCAweDNiOTNhYTNkCiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTAyNCwgICAgICA0MTEsIDB4NDUzNGNkODYKKzAsICAgICAgNDcxMDQsICAgICAgNDcxMDQsICAgICAxMDI0LCAgICAgIDQwMiwgMHhmMjE1Y2M0NAorMCwgICAgICA0ODEyOCwgICAgICA0ODEyOCwgICAgIDEwMjQsICAgICAgNDgzLCAweGNmNDdmMzllCiswLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTAyNCwgICAgICAzNDMsIDB4Y2JkZWFmOTkKKzAsICAgICAgNTAxNzYsICAgICAgNTAxNzYsICAgICAxMDI0LCAgICAgIDM0MywgMHg4NDQ0YWEyYgorMCwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgIDEwMjQsICAgICAgMzQzLCAweDVhNDZhNTY5CiswLCAgICAgIDUyMjI0LCAgICAgIDUyMjI0LCAgICAgMTAyNCwgICAgICAzNDUsIDB4M2IwM2E5NTEKKzAsICAgICAgNTMyNDgsICAgICAgNTMyNDgsICAgICAxMDI0LCAgICAgIDM0NiwgMHhmZjQzYTY2NQorMCwgICAgICA1NDI3MiwgICAgICA1NDI3MiwgICAgIDEwMjQsICAgICAgMzU1LCAweGVkYjFhYzk5CiswLCAgICAgIDU1Mjk2LCAgICAgIDU1Mjk2LCAgICAgMTAyNCwgICAgICAzNjgsIDB4YjA5Y2I3MGYKKzAsICAgICAgNTYzMjAsICAgICAgNTYzMjAsICAgICAxMDI0LCAgICAgIDQzNywgMHhmZGQ1ZWE1ZQorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgIDEwMjQsICAgICAgMzM0LCAweDhjMzVhNGI5CiswLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTAyNCwgICAgICAzOTUsIDB4Yjc3N2M2MWIKKzAsICAgICAgNTkzOTIsICAgICAgNTkzOTIsICAgICAxMDI0LCAgICAgIDM3MiwgMHhhZmFjYjA4NAorMCwgICAgICA2MDQxNiwgICAgICA2MDQxNiwgICAgIDEwMjQsICAgICAgMzUwLCAweDFhYjBhOGM4CiswLCAgICAgIDYxNDQwLCAgICAgIDYxNDQwLCAgICAgMTAyNCwgICAgICAzNDIsIDB4YjZlMWE1NjkKKzAsICAgICAgNjI0NjQsICAgICAgNjI0NjQsICAgICAxMDI0LCAgICAgIDM1MSwgMHg1ODNiYTZmOAorMCwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgIDEwMjQsICAgICAgMzYwLCAweGM3MmJhOWE0CiswLCAgICAgIDY0NTEyLCAgICAgIDY0NTEyLCAgICAgMTAyNCwgICAgICAzNjAsIDB4YjMwYmFlNjYKKzAsICAgICAgNjU1MzYsICAgICAgNjU1MzYsICAgICAxMDI0LCAgICAgIDM4NSwgMHg0YzM4YmQ3NQorMCwgICAgICA2NjU2MCwgICAgICA2NjU2MCwgICAgIDEwMjQsICAgICAgNDcxLCAweGQ0N2RmMGQ1CiswLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgMTAyNCwgICAgICAzMzksIDB4OWJmMWE0NDUKKzAsICAgICAgNjg2MDgsICAgICAgNjg2MDgsICAgICAxMDI0LCAgICAgIDM1NCwgMHhmMzM2YjA1MQorMCwgICAgICA2OTYzMiwgICAgICA2OTYzMiwgICAgIDEwMjQsICAgICAgMzQ4LCAweDZkMDZhZjg0CiswLCAgICAgIDcwNjU2LCAgICAgIDcwNjU2LCAgICAgMTAyNCwgICAgICAzNTUsIDB4YTRlMWFjZjcKKzAsICAgICAgNzE2ODAsICAgICAgNzE2ODAsICAgICAxMDI0LCAgICAgIDM0OCwgMHhjZDBlYWM1NgorMCwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgIDEwMjQsICAgICAgMzk1LCAweGIyOThjMThiCiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTAyNCwgICAgICA0MjcsIDB4M2RjOWRjYzAKKzAsICAgICAgNzQ3NTIsICAgICAgNzQ3NTIsICAgICAxMDI0LCAgICAgIDM0NCwgMHgwMWM4YWU2OQorMCwgICAgICA3NTc3NiwgICAgICA3NTc3NiwgICAgIDEwMjQsICAgICAgMzU2LCAweGMzOGNhNmY4CiswLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgICAzNzIsIDB4ZDM1ZGI3OTMKKzAsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAxMDI0LCAgICAgIDM3MSwgMHhkNGNhYmIzNworMCwgICAgICA3ODg0OCwgICAgICA3ODg0OCwgICAgIDEwMjQsICAgICAgMzcxLCAweDY5YzNhYzQ0CiswLCAgICAgIDc5ODcyLCAgICAgIDc5ODcyLCAgICAgMTAyNCwgICAgICAzNjUsIDB4ZTljZmIxY2UKKzAsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAxMDI0LCAgICAgIDM2OSwgMHhiOTc3YmJjNgorMCwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgIDEwMjQsICAgICAgNDE2LCAweGEwNGZkODUxCiswLCAgICAgIDgyOTQ0LCAgICAgIDgyOTQ0LCAgICAgMTAyNCwgICAgICA0NjEsIDB4MGMzNmViN2IKKzAsICAgICAgODM5NjgsICAgICAgODM5NjgsICAgICAxMDI0LCAgICAgIDQ2NSwgMHhlYjNjZTBhZgorMCwgICAgICA4NDk5MiwgICAgICA4NDk5MiwgICAgIDEwMjQsICAgICAgMzI2LCAweDdiZTRhNjY3CiswLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgICAzMzksIDB4MmNmNGE3MWYKKzAsICAgICAgODcwNDAsICAgICAgODcwNDAsICAgICAxMDI4LCAgICAgIDI1OCwgMHhkNDAwN2FkNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWljIGIvdGVzdHMvcmVmL2ZhdGUvYWljCmluZGV4IDkwNjkyZjEuLjI0NGVhMjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FpYworKysgYi90ZXN0cy9yZWYvZmF0ZS9haWMKQEAgLTEsMTYgKzEsMjAgQEAKICN0YiAwOiAxMDAvMjk5NwotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAyMzMyODAwLCAweGQ5NDFiNDJmCi0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZDk0MWI0MmYKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMjMzMjgwMCwgMHhhZTBmNTk4MwotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAyMzMyODAwLCAweDUxY2ZjMTI3Ci0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4MjRkNDA0NDcKLTAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4NThhOWY1MQotMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAyMzMyODAwLCAweDUzM2I0OGU4Ci0wLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4MmZkNzMyNjcKLTAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgMjMzMjgwMCwgMHgxNTM1NjZjNwotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAyMzMyODAwLCAweGExYzQ5YzQ1Ci0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4Yjk2NmUyNWEKLTAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgMjMzMjgwMCwgMHhkMGNlNTk4NQotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAyMzMyODAwLCAweDAwMjlhNTJlCi0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODkzMTE2YzUKLTAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgMjMzMjgwMCwgMHgwNzNkMjQ5MQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTQ0MHgxMDgwCisjc2FyIDA6IDQvMworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAyMzMyODAwLCAweGMyMmI4NDg1CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YzIyYjg0ODUKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMjMzMjgwMCwgMHhlMGMyMWJkOAorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAyMzMyODAwLCAweDNlMWE4ZmEwCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YmNiM2YyMzUKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgMjMzMjgwMCwgMHgxYTdjYWJkNgorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAyMzMyODAwLCAweGMwMTM2YmE4CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4Mjk1ZTU5YTYKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgMjMzMjgwMCwgMHhmOWMwOTI4OAorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAyMzMyODAwLCAweDA1MThjYzhmCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4OWFkMzA2OGUKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgMjMzMjgwMCwgMHg1YThiN2FmMQorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAyMzMyODAwLCAweDdiMzVhOGZhCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YmU1ODAxZWIKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgMjMzMjgwMCwgMHgzMWNhMDE5ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWljLW9kZHNpemUgYi90ZXN0cy9yZWYvZmF0ZS9haWMtb2Rkc2l6ZQppbmRleCA5MTgzMDg5Li5iZTQzNDZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9haWMtb2Rkc2l6ZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9haWMtb2Rkc2l6ZQpAQCAtMSw1OCArMSw2MiBAQAogI3RiIDA6IDEwMDAvMTQ1ODcKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE3NDI0MywgMHhhNDA0OTFlMQotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTc0MjQzLCAweGExMmNiYjU2Ci0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNzQyNDMsIDB4YTEyY2JiNTYKLTAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDE3NDI0MywgMHhhMTJjYmI1NgotMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTc0MjQzLCAweGExMmNiYjU2Ci0wLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxNzQyNDMsIDB4YTEyY2JiNTYKLTAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDE3NDI0MywgMHhhMTJjYmI1NgotMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTc0MjQzLCAweGExMmNiYjU2Ci0wLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxNzQyNDMsIDB4YTEyY2JiNTYKLTAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDE3NDI0MywgMHg0ZTdiNzI5OQotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTc0MjQzLCAweDMxNTczYjk5Ci0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxNzQyNDMsIDB4MDEzMzk3YjYKLTAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDE3NDI0MywgMHhkZDk4OGFiOAotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMTc0MjQzLCAweGQ2ZDk2YjFlCi0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAxNzQyNDMsIDB4ZDZkOTZiMWUKLTAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDE3NDI0MywgMHhkNmQ5NmIxZQotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMTc0MjQzLCAweDExMTYyN2QzCi0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAxNzQyNDMsIDB4Mjg0ZDlhYjcKLTAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDE3NDI0MywgMHhhMzQ4YzQ5MgotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMTc0MjQzLCAweGEzNDhjNDkyCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAxNzQyNDMsIDB4YTM0OGM0OTIKLTAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDE3NDI0MywgMHhhMzQ4YzQ5MgotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMTc0MjQzLCAweDJkMjJjM2I4Ci0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAxNzQyNDMsIDB4MmQyMmMzYjgKLTAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDE3NDI0MywgMHgyZDIyYzNiOAotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMTc0MjQzLCAweDJkMjJjM2I4Ci0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAxNzQyNDMsIDB4YTZkN2M4OTAKLTAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDE3NDI0MywgMHg4MDY4YmZiYgotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMTc0MjQzLCAweDQyMGFlNjQ3Ci0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAxNzQyNDMsIDB4YzU0Njc3NTYKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDE3NDI0MywgMHgyMzhhMTNkZAotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMTc0MjQzLCAweDViYWI3NWRjCi0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAxNzQyNDMsIDB4MTRkN2Y2MWYKLTAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDE3NDI0MywgMHgyZTFkMzM0ZgotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMTc0MjQzLCAweGVhZGU3ZGMwCi0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAxNzQyNDMsIDB4ZWFkZTdkYzAKLTAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDE3NDI0MywgMHhlYWRlN2RjMAotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMTc0MjQzLCAweGVhZGU3ZGMwCi0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAxNzQyNDMsIDB4MDg4YzdlZjkKLTAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDE3NDI0MywgMHg3MGEzNTU0ZQotMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMTc0MjQzLCAweDA3NTNkMWQ0Ci0wLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAxNzQyNDMsIDB4ODI2NmJkNmQKLTAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDE3NDI0MywgMHg0Y2UzY2RhOQotMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMTc0MjQzLCAweDRjZTNjZGE5Ci0wLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAxNzQyNDMsIDB4NGNlM2NkYTkKLTAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDE3NDI0MywgMHg0Y2UzY2RhOQotMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMTc0MjQzLCAweGU1ZjdjZDk4Ci0wLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAxNzQyNDMsIDB4ZTVmN2NkOTgKLTAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDE3NDI0MywgMHhlNWY3Y2Q5OAotMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMTc0MjQzLCAweGU1ZjdjZDk4Ci0wLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAxNzQyNDMsIDB4NzhjNWNkYjcKLTAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgIDE3NDI0MywgMHg3OGM1Y2RiNwotMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgMTc0MjQzLCAweDc4YzVjZGI3Ci0wLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICAxNzQyNDMsIDB4Y2U3Y2NkOTIKLTAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgIDE3NDI0MywgMHhjZTdjY2Q5MgotMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgMTc0MjQzLCAweGNlN2NjZDkyCi0wLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAxNzQyNDMsIDB4Y2U3Y2NkOTIKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQ4MXgyNDEKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNzQyNDMsIDB4MTVhYjgzNWIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE3NDI0MywgMHgxMmQzYWNkMAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTc0MjQzLCAweDEyZDNhY2QwCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxNzQyNDMsIDB4MTJkM2FjZDAKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDE3NDI0MywgMHgxMmQzYWNkMAorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTc0MjQzLCAweDEyZDNhY2QwCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxNzQyNDMsIDB4MTJkM2FjZDAKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDE3NDI0MywgMHgxMmQzYWNkMAorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTc0MjQzLCAweDEyZDNhY2QwCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxNzQyNDMsIDB4YjIxNTYxYjQKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDE3NDI0MywgMHg0OTM0M2I1YgorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTc0MjQzLCAweDliZDY1ZjQ5CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxNzQyNDMsIDB4ZWQzYjk5NjAKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDE3NDI0MywgMHgxNGY3MDI5NAorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTc0MjQzLCAweDE0ZjcwMjk0CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxNzQyNDMsIDB4MTRmNzAyOTQKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDE3NDI0MywgMHg5MmFjMjMxNgorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTc0MjQzLCAweDEyNzI5YWMwCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxNzQyNDMsIDB4NmRiMGJmYmQKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDE3NDI0MywgMHg2ZGIwYmZiZAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTc0MjQzLCAweDZkYjBiZmJkCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxNzQyNDMsIDB4NmRiMGJmYmQKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDE3NDI0MywgMHhkNjZjYmVmNworMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTc0MjQzLCAweGQ2NmNiZWY3CiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxNzQyNDMsIDB4ZDY2Y2JlZjcKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDE3NDI0MywgMHhkNjZjYmVmNworMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTc0MjQzLCAweDMzMTRjM2QzCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxNzQyNDMsIDB4MzRlZmIzNTgKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDE3NDI0MywgMHg3MzA3ZDhjOAorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTc0MjQzLCAweDgwYjU3ZWExCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxNzQyNDMsIDB4YjBiNTFiZjkKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDE3NDI0MywgMHg2MGMwNzUxNgorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTc0MjQzLCAweGNjMzUwMzNmCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxNzQyNDMsIDB4MmJmMTJkYzQKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDE3NDI0MywgMHhmMzAyNWViNworMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTc0MjQzLCAweGYzMDI1ZWI3CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxNzQyNDMsIDB4ZjMwMjVlYjcKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDE3NDI0MywgMHhmMzAyNWViNworMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTc0MjQzLCAweDA2ZTc2MWIzCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxNzQyNDMsIDB4YTIxMTUyZmIKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDE3NDI0MywgMHhkNmRjYzU3NQorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTc0MjQzLCAweGQ2Y2ViODJhCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxNzQyNDMsIDB4MjBlZmMyMDYKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDE3NDI0MywgMHgyMGVmYzIwNgorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTc0MjQzLCAweDIwZWZjMjA2CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxNzQyNDMsIDB4MjBlZmMyMDYKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDE3NDI0MywgMHhiYTAzYzFmNQorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTc0MjQzLCAweGJhMDNjMWY1CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxNzQyNDMsIDB4YmEwM2MxZjUKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDE3NDI0MywgMHhiYTAzYzFmNQorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgMTc0MjQzLCAweDRjZDFjMjE0CiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAxNzQyNDMsIDB4NGNkMWMyMTQKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgIDE3NDI0MywgMHg0Y2QxYzIxNAorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgMTc0MjQzLCAweGEyODhjMWVmCiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAxNzQyNDMsIDB4YTI4OGMxZWYKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgIDE3NDI0MywgMHhhMjg4YzFlZgorMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgMTc0MjQzLCAweGEyODhjMWVmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hbGctbW0gYi90ZXN0cy9yZWYvZmF0ZS9hbGctbW0KaW5kZXggNWQ5N2RlOS4uNTc4ODAxMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYWxnLW1tCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FsZy1tbQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MTYwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTIyODgwLCAweDRlZDgxMjNmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMjI4ODAsIDB4YzRjMzUzMDQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDEyMjg4MCwgMHhiZDMwMTVmZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYWxpYXNwaXgtYmdyIGIvdGVzdHMvcmVmL2ZhdGUvYWxpYXNwaXgtYmdyCmluZGV4IDg2NzFkM2UuLmY1YzZiN2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FsaWFzcGl4LWJncgorKysgYi90ZXN0cy9yZWYvZmF0ZS9hbGlhc3BpeC1iZ3IKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAxeDc5Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ3NjM3LCAweGNiNzczNjhmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hbGlhc3BpeC1ncmF5IGIvdGVzdHMvcmVmL2ZhdGUvYWxpYXNwaXgtZ3JheQppbmRleCAwNDMzYTM2Li5hYTdiNDY0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9hbGlhc3BpeC1ncmF5CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FsaWFzcGl4LWdyYXkKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk5eDgxCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2MTE5LCAweDNkMDc4NWY1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hbXYgYi90ZXN0cy9yZWYvZmF0ZS9hbXYKaW5kZXggNDA3ZjA3Ny4uNGIyYzE2OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYW12CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FtdgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE2CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNjB4MTIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDI4ODAwLCAweDAyNjA1OGE5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMjg4MDAsIDB4NWRjNzI4ZGUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAyODgwMCwgMHg4M2UxOWEyYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYW5zaSBiL3Rlc3RzL3JlZi9mYXRlL2Fuc2kKaW5kZXggNzhlODUzZi4uNWNmNmZmOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYW5zaQorKysgYi90ZXN0cy9yZWYvZmF0ZS9hbnNpCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0MDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA3NjgwMDAsIDB4NzcyZGQzZDAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDc2ODAwMCwgMHhkN2RhYjFkMQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNzY4MDAwLCAweDBlNTZmMmQzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hbnNpMjU2IGIvdGVzdHMvcmVmL2ZhdGUvYW5zaTI1NgppbmRleCA5NGFjZDQ1Li5mNjhhMGQxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9hbnNpMjU2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Fuc2kyNTYKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDc2ODAwMCwgMHg0ZGZiYjZkMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNzY4MDAwLCAweDIyNjUyYTIyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA3NjgwMDAsIDB4NmM2MTNlOGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FwaS1tanBlZy1jb2RlYy1wYXJhbSBiL3Rlc3RzL3JlZi9mYXRlL2FwaS1tanBlZy1jb2RlYy1wYXJhbQppbmRleCA2ZjhkYTc0Li4yOTBmOTQxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9hcGktbWpwZWctY29kZWMtcGFyYW0KKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXBpLW1qcGVnLWNvZGVjLXBhcmFtCkBAIC0zLDcgKzMsNiBAQAogICAgIGFiPTAKICAgICBidD00MDAwMDAwCiAgICAgZmxhZ3M9MHgwMDAwMDAwMAotICAgIG1lX21ldGhvZD01CiAgICAgdGltZV9iYXNlPTAvMQogICAgIGc9MTIKICAgICBhcj0wCkBAIC0xOCw3ICsxNyw2IEBACiAgICAgcWRpZmY9MwogICAgIGJmPTAKICAgICBiX3FmYWN0b3I9MS4yNTAwMDAKLSAgICByY19zdHJhdGVneT0wCiAgICAgYl9zdHJhdGVneT0wCiAgICAgcHM9MAogICAgIG12X2JpdHM9MApAQCAtMzgsMTggKzM2LDEyIEBACiAgICAgaGFzX2JfZnJhbWVzPTAKICAgICBibG9ja19hbGlnbj0wCiAgICAgbXBlZ19xdWFudD0wCi0gICAgcXNxdWlzaD0wLjAwMDAwMAotICAgIHJjX3Ftb2RfYW1wPTAuMDAwMDAwCi0gICAgcmNfcW1vZF9mcmVxPTAKICAgICByY19vdmVycmlkZV9jb3VudD0wCi0gICAgcmNfZXE9CiAgICAgbWF4cmF0ZT0wCiAgICAgbWlucmF0ZT0wCiAgICAgYnVmc2l6ZT0wCi0gICAgcmNfYnVmX2FnZ3Jlc3Npdml0eT0xLjAwMDAwMAogICAgIGlfcWZhY3Rvcj0tMC44MDAwMDAKICAgICBpX3FvZmZzZXQ9MC4wMDAwMDAKLSAgICByY19pbml0X2NwbHg9MC4wMDAwMDAKICAgICBkY3Q9MAogICAgIGx1bWlfbWFzaz0wLjAwMDAwMAogICAgIHRjcGx4X21hc2s9MC4wMDAwMDAKQEAgLTYyLDggKzU0LDggQEAKICAgICBiaXRzX3Blcl9jb2RlZF9zYW1wbGU9MAogICAgIHByZWQ9MAogICAgIGFzcGVjdD0xODAvMTgwCisgICAgc2FyPTE4MC8xODAKICAgICBkZWJ1Zz0weDAwMDAwMDAwCi0gICAgdmlzbXY9MHgwMDAwMDAwMAogICAgIGNtcD0wCiAgICAgc3ViY21wPTAKICAgICBtYmNtcD0wCkBAIC03NCwzOSArNjYsMjggQEAKICAgICBwcmVjbXA9MAogICAgIHByZV9kaWFfc2l6ZT0wCiAgICAgc3VicT04Ci0gICAgZHRnX2FjdGl2ZV9mb3JtYXQ9MAogICAgIG1lX3JhbmdlPTAKLSAgICBpYmlhcz05OTk5OTkKLSAgICBwYmlhcz05OTk5OTkKICAgICBnbG9iYWxfcXVhbGl0eT0wCiAgICAgY29kZXI9MAogICAgIGNvbnRleHQ9MAogICAgIHNsaWNlX2ZsYWdzPTAKLSAgICB4dm1jX2FjY2VsZXJhdGlvbj0wCiAgICAgbWJkPTAKLSAgICBzdHJlYW1fY29kZWNfdGFnPTAKICAgICBzY190aHJlc2hvbGQ9MAotICAgIGxtaW49MAotICAgIGxtYXg9MAogICAgIG5yPTAKICAgICByY19pbml0X29jY3VwYW5jeT0wCiAgICAgZmxhZ3MyPTB4MDAwMDAwMDAKLSAgICBlcnJvcj0wCiAgICAgdGhyZWFkcz0xCi0gICAgbWVfdGhyZXNob2xkPTAKLSAgICBtYl90aHJlc2hvbGQ9MAogICAgIGRjPTAKICAgICBuc3Nldz04CiAgICAgc2tpcF90b3A9MAogICAgIHNraXBfYm90dG9tPTAKLSAgICBwcm9maWxlPS05OQorICAgIHByb2ZpbGU9MTkyCiAgICAgbGV2ZWw9LTk5CiAgICAgbG93cmVzPTAKICAgICBza2lwX3RocmVzaG9sZD0wCiAgICAgc2tpcF9mYWN0b3I9MAogICAgIHNraXBfZXhwPTAKICAgICBza2lwY21wPTEzCi0gICAgYm9yZGVyX21hc2s9MC4wMDAwMDAKICAgICBtYmxtaW49MjM2CiAgICAgbWJsbWF4PTM2NTgKICAgICBtZXBjPTI1NgpAQCAtMTE5LDcgKzEwMCw2IEBACiAgICAgcmVmcz0xCiAgICAgY2hyb21hb2Zmc2V0PTAKICAgICB0cmVsbGlzPTAKLSAgICBzY19mYWN0b3I9NgogICAgIG12MF90aHJlc2hvbGQ9MjU2CiAgICAgYl9zZW5zaXRpdml0eT00MAogICAgIGNvbXByZXNzaW9uX2xldmVsPS0xCkBAIC0xNDUsMjAgKzEyNSwyNCBAQAogICAgIHBrdF90aW1lYmFzZT0xLzI1CiAgICAgc3ViX2NoYXJlbmM9CiAgICAgc3ViX2NoYXJlbmNfbW9kZT0weDAwMDAwMDAwCisgICAgc3ViX3RleHRfZm9ybWF0PTEKICAgICByZWZjb3VudGVkX2ZyYW1lcz1mYWxzZQogICAgIHNpZGVfZGF0YV9vbmx5X3BhY2tldHM9dHJ1ZQorICAgIGFwcGx5X2Nyb3BwaW5nPXRydWUKICAgICBza2lwX2FscGhhPWZhbHNlCiAgICAgZmllbGRfb3JkZXI9MAogICAgIGR1bXBfc2VwYXJhdG9yPQogICAgIGNvZGVjX3doaXRlbGlzdD0KICAgICBwaXhlbF9mb3JtYXQ9eXV2ajQyMnAKICAgICB2aWRlb19zaXplPTQwMHgyMjUKKyAgICBtYXhfcGl4ZWxzPTIxNDc0ODM2NDcKKyAgICBod2FjY2VsX2ZsYWdzPTB4MDAwMDAwMDEKKyAgICBleHRyYV9od19mcmFtZXM9LTEKIHN0cmVhbT0wLCBkZWNvZGU9MQogICAgIGI9MAogICAgIGFiPTAKICAgICBidD00MDAwMDAwCiAgICAgZmxhZ3M9MHgwMDAwMDAwMAotICAgIG1lX21ldGhvZD01CiAgICAgdGltZV9iYXNlPTAvMQogICAgIGc9MTIKICAgICBhcj0wCkBAIC0xNzMsNyArMTU3LDYgQEAKICAgICBxZGlmZj0zCiAgICAgYmY9MAogICAgIGJfcWZhY3Rvcj0xLjI1MDAwMAotICAgIHJjX3N0cmF0ZWd5PTAKICAgICBiX3N0cmF0ZWd5PTAKICAgICBwcz0wCiAgICAgbXZfYml0cz0wCkBAIC0xOTMsMTggKzE3NiwxMiBAQAogICAgIGhhc19iX2ZyYW1lcz0wCiAgICAgYmxvY2tfYWxpZ249MAogICAgIG1wZWdfcXVhbnQ9MAotICAgIHFzcXVpc2g9MC4wMDAwMDAKLSAgICByY19xbW9kX2FtcD0wLjAwMDAwMAotICAgIHJjX3Ftb2RfZnJlcT0wCiAgICAgcmNfb3ZlcnJpZGVfY291bnQ9MAotICAgIHJjX2VxPQogICAgIG1heHJhdGU9MAogICAgIG1pbnJhdGU9MAogICAgIGJ1ZnNpemU9MAotICAgIHJjX2J1Zl9hZ2dyZXNzaXZpdHk9MS4wMDAwMDAKICAgICBpX3FmYWN0b3I9LTAuODAwMDAwCiAgICAgaV9xb2Zmc2V0PTAuMDAwMDAwCi0gICAgcmNfaW5pdF9jcGx4PTAuMDAwMDAwCiAgICAgZGN0PTAKICAgICBsdW1pX21hc2s9MC4wMDAwMDAKICAgICB0Y3BseF9tYXNrPTAuMDAwMDAwCkBAIC0yMTcsOCArMTk0LDggQEAKICAgICBiaXRzX3Blcl9jb2RlZF9zYW1wbGU9MAogICAgIHByZWQ9MAogICAgIGFzcGVjdD0xODAvMTgwCisgICAgc2FyPTE4MC8xODAKICAgICBkZWJ1Zz0weDAwMDAwMDAwCi0gICAgdmlzbXY9MHgwMDAwMDAwMAogICAgIGNtcD0wCiAgICAgc3ViY21wPTAKICAgICBtYmNtcD0wCkBAIC0yMjksMzkgKzIwNiwyOCBAQAogICAgIHByZWNtcD0wCiAgICAgcHJlX2RpYV9zaXplPTAKICAgICBzdWJxPTgKLSAgICBkdGdfYWN0aXZlX2Zvcm1hdD0wCiAgICAgbWVfcmFuZ2U9MAotICAgIGliaWFzPTk5OTk5OQotICAgIHBiaWFzPTk5OTk5OQogICAgIGdsb2JhbF9xdWFsaXR5PTAKICAgICBjb2Rlcj0wCiAgICAgY29udGV4dD0wCiAgICAgc2xpY2VfZmxhZ3M9MAotICAgIHh2bWNfYWNjZWxlcmF0aW9uPTAKICAgICBtYmQ9MAotICAgIHN0cmVhbV9jb2RlY190YWc9MAogICAgIHNjX3RocmVzaG9sZD0wCi0gICAgbG1pbj0wCi0gICAgbG1heD0wCiAgICAgbnI9MAogICAgIHJjX2luaXRfb2NjdXBhbmN5PTAKICAgICBmbGFnczI9MHgwMDAwMDAwMAotICAgIGVycm9yPTAKICAgICB0aHJlYWRzPTEKLSAgICBtZV90aHJlc2hvbGQ9MAotICAgIG1iX3RocmVzaG9sZD0wCiAgICAgZGM9MAogICAgIG5zc2V3PTgKICAgICBza2lwX3RvcD0wCiAgICAgc2tpcF9ib3R0b209MAotICAgIHByb2ZpbGU9LTk5CisgICAgcHJvZmlsZT0xOTIKICAgICBsZXZlbD0tOTkKICAgICBsb3dyZXM9MAogICAgIHNraXBfdGhyZXNob2xkPTAKICAgICBza2lwX2ZhY3Rvcj0wCiAgICAgc2tpcF9leHA9MAogICAgIHNraXBjbXA9MTMKLSAgICBib3JkZXJfbWFzaz0wLjAwMDAwMAogICAgIG1ibG1pbj0yMzYKICAgICBtYmxtYXg9MzY1OAogICAgIG1lcGM9MjU2CkBAIC0yNzQsNyArMjQwLDYgQEAKICAgICByZWZzPTEKICAgICBjaHJvbWFvZmZzZXQ9MAogICAgIHRyZWxsaXM9MAotICAgIHNjX2ZhY3Rvcj02CiAgICAgbXYwX3RocmVzaG9sZD0yNTYKICAgICBiX3NlbnNpdGl2aXR5PTQwCiAgICAgY29tcHJlc3Npb25fbGV2ZWw9LTEKQEAgLTMwMCwxMSArMjY1LDE2IEBACiAgICAgcGt0X3RpbWViYXNlPTEvMjUKICAgICBzdWJfY2hhcmVuYz0KICAgICBzdWJfY2hhcmVuY19tb2RlPTB4MDAwMDAwMDAKKyAgICBzdWJfdGV4dF9mb3JtYXQ9MQogICAgIHJlZmNvdW50ZWRfZnJhbWVzPWZhbHNlCiAgICAgc2lkZV9kYXRhX29ubHlfcGFja2V0cz10cnVlCisgICAgYXBwbHlfY3JvcHBpbmc9dHJ1ZQogICAgIHNraXBfYWxwaGE9ZmFsc2UKICAgICBmaWVsZF9vcmRlcj0wCiAgICAgZHVtcF9zZXBhcmF0b3I9CiAgICAgY29kZWNfd2hpdGVsaXN0PQogICAgIHBpeGVsX2Zvcm1hdD15dXZqNDIycAogICAgIHZpZGVvX3NpemU9NDAweDIyNQorICAgIG1heF9waXhlbHM9MjE0NzQ4MzY0NworICAgIGh3YWNjZWxfZmxhZ3M9MHgwMDAwMDAwMQorICAgIGV4dHJhX2h3X2ZyYW1lcz0tMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXBpLXBuZy1jb2RlYy1wYXJhbSBiL3Rlc3RzL3JlZi9mYXRlL2FwaS1wbmctY29kZWMtcGFyYW0KaW5kZXggMjI2Mzc3NC4uZjA0ZmZhNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYXBpLXBuZy1jb2RlYy1wYXJhbQorKysgYi90ZXN0cy9yZWYvZmF0ZS9hcGktcG5nLWNvZGVjLXBhcmFtCkBAIC0zLDcgKzMsNiBAQAogICAgIGFiPTAKICAgICBidD00MDAwMDAwCiAgICAgZmxhZ3M9MHgwMDAwMDAwMAotICAgIG1lX21ldGhvZD01CiAgICAgdGltZV9iYXNlPTAvMQogICAgIGc9MTIKICAgICBhcj0wCkBAIC0xOCw3ICsxNyw2IEBACiAgICAgcWRpZmY9MwogICAgIGJmPTAKICAgICBiX3FmYWN0b3I9MS4yNTAwMDAKLSAgICByY19zdHJhdGVneT0wCiAgICAgYl9zdHJhdGVneT0wCiAgICAgcHM9MAogICAgIG12X2JpdHM9MApAQCAtMzgsMTggKzM2LDEyIEBACiAgICAgaGFzX2JfZnJhbWVzPTAKICAgICBibG9ja19hbGlnbj0wCiAgICAgbXBlZ19xdWFudD0wCi0gICAgcXNxdWlzaD0wLjAwMDAwMAotICAgIHJjX3Ftb2RfYW1wPTAuMDAwMDAwCi0gICAgcmNfcW1vZF9mcmVxPTAKICAgICByY19vdmVycmlkZV9jb3VudD0wCi0gICAgcmNfZXE9CiAgICAgbWF4cmF0ZT0wCiAgICAgbWlucmF0ZT0wCiAgICAgYnVmc2l6ZT0wCi0gICAgcmNfYnVmX2FnZ3Jlc3Npdml0eT0xLjAwMDAwMAogICAgIGlfcWZhY3Rvcj0tMC44MDAwMDAKICAgICBpX3FvZmZzZXQ9MC4wMDAwMDAKLSAgICByY19pbml0X2NwbHg9MC4wMDAwMDAKICAgICBkY3Q9MAogICAgIGx1bWlfbWFzaz0wLjAwMDAwMAogICAgIHRjcGx4X21hc2s9MC4wMDAwMDAKQEAgLTYyLDggKzU0LDggQEAKICAgICBiaXRzX3Blcl9jb2RlZF9zYW1wbGU9MAogICAgIHByZWQ9MAogICAgIGFzcGVjdD0yODM1LzI4MzUKKyAgICBzYXI9MjgzNS8yODM1CiAgICAgZGVidWc9MHgwMDAwMDAwMAotICAgIHZpc212PTB4MDAwMDAwMDAKICAgICBjbXA9MAogICAgIHN1YmNtcD0wCiAgICAgbWJjbXA9MApAQCAtNzQsMjcgKzY2LDE3IEBACiAgICAgcHJlY21wPTAKICAgICBwcmVfZGlhX3NpemU9MAogICAgIHN1YnE9OAotICAgIGR0Z19hY3RpdmVfZm9ybWF0PTAKICAgICBtZV9yYW5nZT0wCi0gICAgaWJpYXM9OTk5OTk5Ci0gICAgcGJpYXM9OTk5OTk5CiAgICAgZ2xvYmFsX3F1YWxpdHk9MAogICAgIGNvZGVyPTAKICAgICBjb250ZXh0PTAKICAgICBzbGljZV9mbGFncz0wCi0gICAgeHZtY19hY2NlbGVyYXRpb249MAogICAgIG1iZD0wCi0gICAgc3RyZWFtX2NvZGVjX3RhZz0wCiAgICAgc2NfdGhyZXNob2xkPTAKLSAgICBsbWluPTAKLSAgICBsbWF4PTAKICAgICBucj0wCiAgICAgcmNfaW5pdF9vY2N1cGFuY3k9MAogICAgIGZsYWdzMj0weDAwMDAwMDAwCi0gICAgZXJyb3I9MAogICAgIHRocmVhZHM9MQotICAgIG1lX3RocmVzaG9sZD0wCi0gICAgbWJfdGhyZXNob2xkPTAKICAgICBkYz0wCiAgICAgbnNzZXc9OAogICAgIHNraXBfdG9wPTAKQEAgLTEwNiw3ICs4OCw2IEBACiAgICAgc2tpcF9mYWN0b3I9MAogICAgIHNraXBfZXhwPTAKICAgICBza2lwY21wPTEzCi0gICAgYm9yZGVyX21hc2s9MC4wMDAwMDAKICAgICBtYmxtaW49MjM2CiAgICAgbWJsbWF4PTM2NTgKICAgICBtZXBjPTI1NgpAQCAtMTE5LDcgKzEwMCw2IEBACiAgICAgcmVmcz0xCiAgICAgY2hyb21hb2Zmc2V0PTAKICAgICB0cmVsbGlzPTAKLSAgICBzY19mYWN0b3I9NgogICAgIG12MF90aHJlc2hvbGQ9MjU2CiAgICAgYl9zZW5zaXRpdml0eT00MAogICAgIGNvbXByZXNzaW9uX2xldmVsPS0xCkBAIC0xNDUsMjAgKzEyNSwyNCBAQAogICAgIHBrdF90aW1lYmFzZT0xLzI1CiAgICAgc3ViX2NoYXJlbmM9CiAgICAgc3ViX2NoYXJlbmNfbW9kZT0weDAwMDAwMDAwCisgICAgc3ViX3RleHRfZm9ybWF0PTEKICAgICByZWZjb3VudGVkX2ZyYW1lcz1mYWxzZQogICAgIHNpZGVfZGF0YV9vbmx5X3BhY2tldHM9dHJ1ZQorICAgIGFwcGx5X2Nyb3BwaW5nPXRydWUKICAgICBza2lwX2FscGhhPWZhbHNlCiAgICAgZmllbGRfb3JkZXI9MAogICAgIGR1bXBfc2VwYXJhdG9yPQogICAgIGNvZGVjX3doaXRlbGlzdD0KICAgICBwaXhlbF9mb3JtYXQ9cmdiYQogICAgIHZpZGVvX3NpemU9MTI4eDEyOAorICAgIG1heF9waXhlbHM9MjE0NzQ4MzY0NworICAgIGh3YWNjZWxfZmxhZ3M9MHgwMDAwMDAwMQorICAgIGV4dHJhX2h3X2ZyYW1lcz0tMQogc3RyZWFtPTAsIGRlY29kZT0xCiAgICAgYj0wCiAgICAgYWI9MAogICAgIGJ0PTQwMDAwMDAKICAgICBmbGFncz0weDAwMDAwMDAwCi0gICAgbWVfbWV0aG9kPTUKICAgICB0aW1lX2Jhc2U9MC8xCiAgICAgZz0xMgogICAgIGFyPTAKQEAgLTE3Myw3ICsxNTcsNiBAQAogICAgIHFkaWZmPTMKICAgICBiZj0wCiAgICAgYl9xZmFjdG9yPTEuMjUwMDAwCi0gICAgcmNfc3RyYXRlZ3k9MAogICAgIGJfc3RyYXRlZ3k9MAogICAgIHBzPTAKICAgICBtdl9iaXRzPTAKQEAgLTE5MywxOCArMTc2LDEyIEBACiAgICAgaGFzX2JfZnJhbWVzPTAKICAgICBibG9ja19hbGlnbj0wCiAgICAgbXBlZ19xdWFudD0wCi0gICAgcXNxdWlzaD0wLjAwMDAwMAotICAgIHJjX3Ftb2RfYW1wPTAuMDAwMDAwCi0gICAgcmNfcW1vZF9mcmVxPTAKICAgICByY19vdmVycmlkZV9jb3VudD0wCi0gICAgcmNfZXE9CiAgICAgbWF4cmF0ZT0wCiAgICAgbWlucmF0ZT0wCiAgICAgYnVmc2l6ZT0wCi0gICAgcmNfYnVmX2FnZ3Jlc3Npdml0eT0xLjAwMDAwMAogICAgIGlfcWZhY3Rvcj0tMC44MDAwMDAKICAgICBpX3FvZmZzZXQ9MC4wMDAwMDAKLSAgICByY19pbml0X2NwbHg9MC4wMDAwMDAKICAgICBkY3Q9MAogICAgIGx1bWlfbWFzaz0wLjAwMDAwMAogICAgIHRjcGx4X21hc2s9MC4wMDAwMDAKQEAgLTIxNyw4ICsxOTQsOCBAQAogICAgIGJpdHNfcGVyX2NvZGVkX3NhbXBsZT0wCiAgICAgcHJlZD0wCiAgICAgYXNwZWN0PTI4MzUvMjgzNQorICAgIHNhcj0yODM1LzI4MzUKICAgICBkZWJ1Zz0weDAwMDAwMDAwCi0gICAgdmlzbXY9MHgwMDAwMDAwMAogICAgIGNtcD0wCiAgICAgc3ViY21wPTAKICAgICBtYmNtcD0wCkBAIC0yMjksMjcgKzIwNiwxNyBAQAogICAgIHByZWNtcD0wCiAgICAgcHJlX2RpYV9zaXplPTAKICAgICBzdWJxPTgKLSAgICBkdGdfYWN0aXZlX2Zvcm1hdD0wCiAgICAgbWVfcmFuZ2U9MAotICAgIGliaWFzPTk5OTk5OQotICAgIHBiaWFzPTk5OTk5OQogICAgIGdsb2JhbF9xdWFsaXR5PTAKICAgICBjb2Rlcj0wCiAgICAgY29udGV4dD0wCiAgICAgc2xpY2VfZmxhZ3M9MAotICAgIHh2bWNfYWNjZWxlcmF0aW9uPTAKICAgICBtYmQ9MAotICAgIHN0cmVhbV9jb2RlY190YWc9MAogICAgIHNjX3RocmVzaG9sZD0wCi0gICAgbG1pbj0wCi0gICAgbG1heD0wCiAgICAgbnI9MAogICAgIHJjX2luaXRfb2NjdXBhbmN5PTAKICAgICBmbGFnczI9MHgwMDAwMDAwMAotICAgIGVycm9yPTAKICAgICB0aHJlYWRzPTEKLSAgICBtZV90aHJlc2hvbGQ9MAotICAgIG1iX3RocmVzaG9sZD0wCiAgICAgZGM9MAogICAgIG5zc2V3PTgKICAgICBza2lwX3RvcD0wCkBAIC0yNjEsNyArMjI4LDYgQEAKICAgICBza2lwX2ZhY3Rvcj0wCiAgICAgc2tpcF9leHA9MAogICAgIHNraXBjbXA9MTMKLSAgICBib3JkZXJfbWFzaz0wLjAwMDAwMAogICAgIG1ibG1pbj0yMzYKICAgICBtYmxtYXg9MzY1OAogICAgIG1lcGM9MjU2CkBAIC0yNzQsNyArMjQwLDYgQEAKICAgICByZWZzPTEKICAgICBjaHJvbWFvZmZzZXQ9MAogICAgIHRyZWxsaXM9MAotICAgIHNjX2ZhY3Rvcj02CiAgICAgbXYwX3RocmVzaG9sZD0yNTYKICAgICBiX3NlbnNpdGl2aXR5PTQwCiAgICAgY29tcHJlc3Npb25fbGV2ZWw9LTEKQEAgLTMwMCwxMSArMjY1LDE2IEBACiAgICAgcGt0X3RpbWViYXNlPTEvMjUKICAgICBzdWJfY2hhcmVuYz0KICAgICBzdWJfY2hhcmVuY19tb2RlPTB4MDAwMDAwMDAKKyAgICBzdWJfdGV4dF9mb3JtYXQ9MQogICAgIHJlZmNvdW50ZWRfZnJhbWVzPWZhbHNlCiAgICAgc2lkZV9kYXRhX29ubHlfcGFja2V0cz10cnVlCisgICAgYXBwbHlfY3JvcHBpbmc9dHJ1ZQogICAgIHNraXBfYWxwaGE9ZmFsc2UKICAgICBmaWVsZF9vcmRlcj0wCiAgICAgZHVtcF9zZXBhcmF0b3I9CiAgICAgY29kZWNfd2hpdGVsaXN0PQogICAgIHBpeGVsX2Zvcm1hdD1yZ2JhCiAgICAgdmlkZW9fc2l6ZT0xMjh4MTI4CisgICAgbWF4X3BpeGVscz0yMTQ3NDgzNjQ3CisgICAgaHdhY2NlbF9mbGFncz0weDAwMDAwMDAxCisgICAgZXh0cmFfaHdfZnJhbWVzPS0xCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hcG5nLWNsb2NrIGIvdGVzdHMvcmVmL2ZhdGUvYXBuZy1jbG9jawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ4MGZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXBuZy1jbG9jawpAQCAtMCwwICsxLDQ1IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTUweDE1MAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyMzUyNCwgMHhmMDljYWFhMQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDIzNTI0LCAweDFhMzI5ZjIxCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjM1MjQsIDB4OWIwY2EwMTcKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAyMzUyNCwgMHg3M2IwOWRlYgorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgIDIzNTI0LCAweDIzMDM5ZjQ5CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAgMjM1MjQsIDB4NTg4NjllN2IKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgICAyMzUyNCwgMHhjMjYzOTdkMgorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgIDIzNTI0LCAweGUwN2Y3ZDg3CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAgMjM1MjQsIDB4NjE5YTgyYmEKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgICAyMzUyNCwgMHg2OTZjOTc1NworMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgIDIzNTI0LCAweDczMDNhNGE2CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAgMjM1MjQsIDB4MWUxNDlhZWUKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgICAyMzUyNCwgMHg3OGRkOTdlMAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgIDIzNTI0LCAweGFkODA5MmQzCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAgMjM1MjQsIDB4MjdjMDkwYjQKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgICAyMzUyNCwgMHg5MDRjOTdiZQorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgIDIzNTI0LCAweDU0ZDI5YjllCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAgMjM1MjQsIDB4NTc2ODliZmEKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgICAyMzUyNCwgMHgyNzcyYTAwZQorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgIDIzNTI0LCAweDZhNzY5ZWY2CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAgMjM1MjQsIDB4OTRkOGFhZDUKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgICAyMzUyNCwgMHg1MmY3OWVjNAorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgIDIzNTI0LCAweDk5ZWU5ZmJjCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAgMjM1MjQsIDB4YmQ2YTllNGQKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgICAyMzUyNCwgMHhhZjRhYTFjZgorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgIDIzNTI0LCAweGRiOTI5Zjk4CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAgMjM1MjQsIDB4OWUxODlhNmYKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgICAyMzUyNCwgMHgzZmZiOTQxMAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgIDIzNTI0LCAweDZmYzk5MTdkCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAgMjM1MjQsIDB4ZTQzZTk0Y2EKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgICAyMzUyNCwgMHgwM2I2YTI0ZgorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgIDIzNTI0LCAweGM1NGY5OWIzCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAgMjM1MjQsIDB4NGI5YTk3NDgKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgICAyMzUyNCwgMHgyNWExOTAwMworMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgIDIzNTI0LCAweDJiOWQ3N2NjCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAgMjM1MjQsIDB4NGE1YTkyMTcKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgICAyMzUyNCwgMHgyNDFiOWE3YworMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgIDIzNTI0LCAweGM5ZDM5YjM4CiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAgMjM1MjQsIDB4Y2NhNjlmMzAKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgICAyMzUyNCwgMHhlNTBmOWVjOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXBuZy1vc2FtcGxlIGIvdGVzdHMvcmVmL2ZhdGUvYXBuZy1vc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmY2E1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hcG5nLW9zYW1wbGUKQEAgLTAsMCArMSwxMSBAQAorI3RiIDA6IDMvNTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDExNngxMzUKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNjI2NDAsIDB4MzFlYjU4MWQKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICA2MjY0MCwgMHgyOWUxMWI4MgorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgIDYyNjQwLCAweDIwN2VkNTg4CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAgNjI2NDAsIDB4Mzg0NWM5MDYKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgICA2MjY0MCwgMHg2Nzk3ZmU2OQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgIDYyNjQwLCAweDFmMDg2YTA5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hcm1vdmllLWVzY2FwZTEyNCBiL3Rlc3RzL3JlZi9mYXRlL2FybW92aWUtZXNjYXBlMTI0CmluZGV4IDgzNjE0YzIuLjM5OGZmNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2FybW92aWUtZXNjYXBlMTI0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2FybW92aWUtZXNjYXBlMTI0CkBAIC0xLDUgKzEsMTQgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogI3RiIDE6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogNDQxMDAKKyNjaGFubmVsX2xheW91dCAxOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIzMDQwMCwgMHhkMTMzZTE3NwogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgNDQxMDAsICAgMTc2NDAwLCAweGRkNjE1NzhjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4ZTM1MDFiYjIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FybW92aWUtZXNjYXBlMTMwIGIvdGVzdHMvcmVmL2ZhdGUvYXJtb3ZpZS1lc2NhcGUxMzAKaW5kZXggZWU0ZWMyNi4uNjkyNWE0OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYXJtb3ZpZS1lc2NhcGUxMzAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXJtb3ZpZS1lc2NhcGUxMzAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDE2MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA3NjgwMCwgMHg4NjA1MDJlZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDc2ODAwLCAweDA1NWRhNzU1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNzY4MDAsIDB4Njc5NjkyMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2FzZi1yZXBsZGF0YSBiL3Rlc3RzL3JlZi9mYXRlL2FzZi1yZXBsZGF0YQppbmRleCBmZjEyZmYwLi45NDc0NDU2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9hc2YtcmVwbGRhdGEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXNmLXJlcGxkYXRhCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBtc21wZWc0djMKKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMCwgICAgMjMzNzQsIDB4ODcyNWIzYjgKIDAsICAgICAgICAxMjIsICAgICAgICAxMjIsICAgICAgICAwLCAgICAxMzczMiwgMHgzYWM4NTMxYSwgRj0weDAKIDAsICAgICAgICAyNDUsICAgICAgICAyNDUsICAgICAgICAwLCAgICAgIDYxNSwgMHhkMzE2NDFiNCwgRj0weDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvX2ZpZm8gYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb19maWZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjUzOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb19maWZvCkBAIC0wLDAgKzEsMjI4IEBACisKK1RFU1Q6IDEKKword3JpdHRlbjogMTIKK3dyaXR0ZW46IDEyCityZW1haW5pbmcgc2FtcGxlcyBpbiBhdWRpb19maWZvOiAyNAorCityZWFkOiAxMgorMDAgMDEgMDIgMDMgMDQgMDUgMDYgMDcgMDggMDkgMGEgMGIKK3JlbWFpbmluZyBzYW1wbGVzIGluIGF1ZGlvX2ZpZm86IDEyCisKK3BlZWs6CiswMCAwMSAwMiAwMyAwNCAwNSAwNiAwNyAwOCAwOSAwYSAwYgorCitwZWVrX2F0OgorMDoKKzAwCisxOgorMDEKKzI6CiswMgorMzoKKzAzCis0OgorMDQKKzU6CiswNQorNjoKKzA2Cis3OgorMDcKKzg6CiswOAorOToKKzA5CisxMDoKKzBhCisxMToKKzBiCisKKworVEVTVDogMgorCit3cml0dGVuOiA2Cit3cml0dGVuOiA2CityZW1haW5pbmcgc2FtcGxlcyBpbiBhdWRpb19maWZvOiAxMgorCityZWFkOiA2CiswMCAwMSAwMiAwMyAwNCAwNQorMDYgMDcgMDggMDkgMGEgMGIKK3JlbWFpbmluZyBzYW1wbGVzIGluIGF1ZGlvX2ZpZm86IDYKKworcGVlazoKKzAwIDAxIDAyIDAzIDA0IDA1CiswNiAwNyAwOCAwOSAwYSAwYgorCitwZWVrX2F0OgorMDoKKzAwCiswNgorMToKKzAxCiswNworMjoKKzAyCiswOAorMzoKKzAzCiswOQorNDoKKzA0CiswYQorNToKKzA1CiswYgorCisKK1RFU1Q6IDMKKword3JpdHRlbjogMTIKK3dyaXR0ZW46IDEyCityZW1haW5pbmcgc2FtcGxlcyBpbiBhdWRpb19maWZvOiAyNAorCityZWFkOiAxMgorMDAwMCAwMDAxIDAwMDIgMDAwMyAwMDA0IDAwMDUgMDAwNiAwMDA3IDAwMDggMDAwOSAwMDBhIDAwMGIKK3JlbWFpbmluZyBzYW1wbGVzIGluIGF1ZGlvX2ZpZm86IDEyCisKK3BlZWs6CiswMDAwIDAwMDEgMDAwMiAwMDAzIDAwMDQgMDAwNSAwMDA2IDAwMDcgMDAwOCAwMDA5IDAwMGEgMDAwYgorCitwZWVrX2F0OgorMDoKKzAwMDAKKzE6CiswMDAxCisyOgorMDAwMgorMzoKKzAwMDMKKzQ6CiswMDA0Cis1OgorMDAwNQorNjoKKzAwMDYKKzc6CiswMDA3Cis4OgorMDAwOAorOToKKzAwMDkKKzEwOgorMDAwYQorMTE6CiswMDBiCisKKworVEVTVDogNAorCit3cml0dGVuOiA2Cit3cml0dGVuOiA2CityZW1haW5pbmcgc2FtcGxlcyBpbiBhdWRpb19maWZvOiAxMgorCityZWFkOiA2CiswMDAwIDAwMDEgMDAwMiAwMDAzIDAwMDQgMDAwNQorMDAwNiAwMDA3IDAwMDggMDAwOSAwMDBhIDAwMGIKK3JlbWFpbmluZyBzYW1wbGVzIGluIGF1ZGlvX2ZpZm86IDYKKworcGVlazoKKzAwMDAgMDAwMSAwMDAyIDAwMDMgMDAwNCAwMDA1CiswMDA2IDAwMDcgMDAwOCAwMDA5IDAwMGEgMDAwYgorCitwZWVrX2F0OgorMDoKKzAwMDAKKzAwMDYKKzE6CiswMDAxCiswMDA3CisyOgorMDAwMgorMDAwOAorMzoKKzAwMDMKKzAwMDkKKzQ6CiswMDA0CiswMDBhCis1OgorMDAwNQorMDAwYgorCisKK1RFU1Q6IDUKKword3JpdHRlbjogMTIKK3dyaXR0ZW46IDEyCityZW1haW5pbmcgc2FtcGxlcyBpbiBhdWRpb19maWZvOiAyNAorCityZWFkOiAxMgorMDAwMDAwMDAgM2Y4MDAwMDAgNDAwMDAwMDAgNDA0MDAwMDAgNDA4MDAwMDAgNDBhMDAwMDAgNDBjMDAwMDAgNDBlMDAwMDAgNDEwMDAwMDAgNDExMDAwMDAgNDEyMDAwMDAgNDEzMDAwMDAKK3JlbWFpbmluZyBzYW1wbGVzIGluIGF1ZGlvX2ZpZm86IDEyCisKK3BlZWs6CiswMDAwMDAwMCAzZjgwMDAwMCA0MDAwMDAwMCA0MDQwMDAwMCA0MDgwMDAwMCA0MGEwMDAwMCA0MGMwMDAwMCA0MGUwMDAwMCA0MTAwMDAwMCA0MTEwMDAwMCA0MTIwMDAwMCA0MTMwMDAwMAorCitwZWVrX2F0OgorMDoKKzAwMDAwMDAwCisxOgorM2Y4MDAwMDAKKzI6Cis0MDAwMDAwMAorMzoKKzQwNDAwMDAwCis0OgorNDA4MDAwMDAKKzU6Cis0MGEwMDAwMAorNjoKKzQwYzAwMDAwCis3OgorNDBlMDAwMDAKKzg6Cis0MTAwMDAwMAorOToKKzQxMTAwMDAwCisxMDoKKzQxMjAwMDAwCisxMToKKzQxMzAwMDAwCisKKworVEVTVDogNgorCit3cml0dGVuOiA2Cit3cml0dGVuOiA2CityZW1haW5pbmcgc2FtcGxlcyBpbiBhdWRpb19maWZvOiAxMgorCityZWFkOiA2CiswMDAwMDAwMCAzZjgwMDAwMCA0MDAwMDAwMCA0MDQwMDAwMCA0MDgwMDAwMCA0MGEwMDAwMAorNDBjMDAwMDAgNDBlMDAwMDAgNDEwMDAwMDAgNDExMDAwMDAgNDEyMDAwMDAgNDEzMDAwMDAKK3JlbWFpbmluZyBzYW1wbGVzIGluIGF1ZGlvX2ZpZm86IDYKKworcGVlazoKKzAwMDAwMDAwIDNmODAwMDAwIDQwMDAwMDAwIDQwNDAwMDAwIDQwODAwMDAwIDQwYTAwMDAwCis0MGMwMDAwMCA0MGUwMDAwMCA0MTAwMDAwMCA0MTEwMDAwMCA0MTIwMDAwMCA0MTMwMDAwMAorCitwZWVrX2F0OgorMDoKKzAwMDAwMDAwCis0MGMwMDAwMAorMToKKzNmODAwMDAwCis0MGUwMDAwMAorMjoKKzQwMDAwMDAwCis0MTAwMDAwMAorMzoKKzQwNDAwMDAwCis0MTEwMDAwMAorNDoKKzQwODAwMDAwCis0MTIwMDAwMAorNToKKzQwYTAwMDAwCis0MTMwMDAwMAorCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWhlLWFkdHMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWhlLWFkdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiZjhmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLW1vbm8taGUtYWR0cwpAQCAtMCwwICsxIEBACitwcmVzaWc6IDI1OTMgcG9zdHNpZzoyMjMgYzogMC45ODM1IGxlbmVycjoyODE2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWhlLW00YSBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLW1vbm8taGUtbTRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjhkZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWhlLW00YQpAQCAtMCwwICsxIEBACitwcmVzaWc6IDQ4MSBwb3N0c2lnOjIyMyBjOiAwLjk4MzUgbGVuZXJyOjcwNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtbW9uby1sYy1hZHRzIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtbW9uby1sYy1hZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNmVjZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWxjLWFkdHMKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAyMTEyIHBvc3RzaWc6NzA0IGM6IDAuOTg0MiBsZW5lcnI6MjgxNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtbW9uby1sYy1tNGEgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1tb25vLWxjLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWNkNTRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtbW9uby1sYy1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAwIHBvc3RzaWc6NzA0IGM6IDAuOTg0MiBsZW5lcnI6NzA0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1zdGVyZW8taGUtYWR0cyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1oZS1hZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMjk1OTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1zdGVyZW8taGUtYWR0cwpAQCAtMCwwICsxIEBACitwcmVzaWc6IDUxODYgcG9zdHNpZzo0NDYgYzogMC45ODk1IGxlbmVycjo1NjMyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1zdGVyZW8taGUtbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWhlLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmEwZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWhlLW00YQpAQCAtMCwwICsxIEBACitwcmVzaWc6IDk2MiBwb3N0c2lnOjQ0NiBjOiAwLjk4OTUgbGVuZXJyOjE0MDgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1oZTItYWR0cyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1oZTItYWR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmIyNjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWhlMi1hZHRzCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogNTE4NiBwb3N0c2lnOjQ0NiBjOiAwLjk4MzkgbGVuZXJyOjU2MzIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1oZTItbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWhlMi1tNGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmYzIxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1oZTItbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogOTYyIHBvc3RzaWc6NDQ2IGM6IDAuOTgzOSBsZW5lcnI6MTQwOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWxjLWFkdHMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1zdGVyZW8tbGMtYWR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjAwNDlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtMTYwMDAtc3RlcmVvLWxjLWFkdHMKQEAgLTAsMCArMSBAQAorcHJlc2lnOiA0MjI0IHBvc3RzaWc6MTQwOCBjOiAwLjk5ODUgbGVuZXJyOjU2MzIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTE2MDAwLXN0ZXJlby1sYy1tNGEgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1zdGVyZW8tbGMtbTRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NmNjYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC0xNjAwMC1zdGVyZW8tbGMtbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMCBwb3N0c2lnOjE0MDggYzogMC45OTg1IGxlbmVycjoxNDA4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1tb25vLWhlLWFkdHMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1tb25vLWhlLWFkdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMzOTQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8taGUtYWR0cwpAQCAtMCwwICsxIEBACitwcmVzaWc6IDUxODYgcG9zdHNpZzo4MjIgYzogMC45OTExIGxlbmVycjo2MDA4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1tb25vLWhlLW00YSBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8taGUtbTRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZDQ5MTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1tb25vLWhlLW00YQpAQCAtMCwwICsxIEBACitwcmVzaWc6IDk2MiBwb3N0c2lnOjgyMiBjOiAwLjk5MTEgbGVuZXJyOjE3ODQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8tbGMtYWR0cyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8tbGMtYWR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjNjYjFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtbW9uby1sYy1hZHRzCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMjExMiBwb3N0c2lnOjgyNCBjOiAwLjk5OTUgbGVuZXJyOjI5MzYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8tbGMtbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtbW9uby1sYy1tNGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiMmQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLW1vbm8tbGMtbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMCBwb3N0c2lnOjgyNCBjOiAwLjk5OTUgbGVuZXJyOjgyNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtc3RlcmVvLWhlLWFkdHMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8taGUtYWR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGZkODA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtc3RlcmVvLWhlLWFkdHMKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAxMDM3MiBwb3N0c2lnOjE2NDQgYzogMC45ODkwIGxlbmVycjoxMjAxNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtc3RlcmVvLWhlLW00YSBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1oZS1tNGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1NTQwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1oZS1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAxOTI0IHBvc3RzaWc6MTY0NCBjOiAwLjk4OTAgbGVuZXJyOjM1NjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1oZTItYWR0cyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1oZTItYWR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTcyZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtc3RlcmVvLWhlMi1hZHRzCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMTAzNzIgcG9zdHNpZzoxNjQ0IGM6IDAuOTkwOSBsZW5lcnI6MTIwMTYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1oZTItbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtc3RlcmVvLWhlMi1tNGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyMTRjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1oZTItbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMTkyNCBwb3N0c2lnOjE2NDQgYzogMC45OTA5IGxlbmVycjozNTY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8tbGMtYWR0cyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1sYy1hZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYTkwMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWFmY29udmVydC00NDEwMC1zdGVyZW8tbGMtYWR0cwpAQCAtMCwwICsxIEBACitwcmVzaWc6IDQyMjQgcG9zdHNpZzoxNjQ4IGM6IDEuMDAwNiBsZW5lcnI6NTg3MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1hZmNvbnZlcnQtNDQxMDAtc3RlcmVvLWxjLW00YSBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1sYy1tNGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFmMjNjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtYWZjb252ZXJ0LTQ0MTAwLXN0ZXJlby1sYy1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAwIHBvc3RzaWc6MTY0OCBjOiAxLjAwMDYgbGVuZXJyOjE2NDgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtbW9uby1oZS1tcDQgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLW1vbm8taGUtbXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OGMxOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLW1vbm8taGUtbXA0CkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogNTU2OSBwb3N0c2lnOi0xNjA5IGM6IDAuOTcwMiBsZW5lcnI6Mzk2MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1kb2xieS00NDEwMC1tb25vLWxjLW1wNCBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtbW9uby1sYy1tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjMDMwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtbW9uby1sYy1tcDQKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAyOTczIHBvc3RzaWc6LTM3IGM6IDAuOTk5OCBsZW5lcnI6MjkzNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1kb2xieS00NDEwMC1zdGVyZW8taGUtbXA0IGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1kb2xieS00NDEwMC1zdGVyZW8taGUtbXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZTg2YWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLXN0ZXJlby1oZS1tcDQKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAxMTE2MCBwb3N0c2lnOi0zMjQwIGM6IDAuOTcwMyBsZW5lcnI6NzkyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1kb2xieS00NDEwMC1zdGVyZW8taGUyLW1wNCBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtc3RlcmVvLWhlMi1tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlZGMyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtc3RlcmVvLWhlMi1tcDQKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAxNTg4NCBwb3N0c2lnOjIyOCBjOiAwLjgzOTAgbGVuZXJyOjE2MTEyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLXN0ZXJlby1sYy1tcDQgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWRvbGJ5LTQ0MTAwLXN0ZXJlby1sYy1tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiZTVjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZG9sYnktNDQxMDAtc3RlcmVvLWxjLW1wNApAQCAtMCwwICsxIEBACitwcmVzaWc6IDU3NjAgcG9zdHNpZzotMTkzNiBjOiAwLjk4MzcgbGVuZXJyOjM4MjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZmFhYy0xNjAwMC1tb25vLWxjLWFkdHMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtMTYwMDAtbW9uby1sYy1hZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtMTYwMDAtbW9uby1sYy1hZHRzCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMCBwb3N0c2lnOjc2OCBjOiAxLjAwMTEgbGVuZXJyOjc2OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1mYWFjLTE2MDAwLW1vbm8tbGMtbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1mYWFjLTE2MDAwLW1vbm8tbGMtbTRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjE1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtMTYwMDAtbW9uby1sYy1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAwIHBvc3RzaWc6NzY4IGM6IDEuMDAxMSBsZW5lcnI6NzY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtMTYwMDAtc3RlcmVvLWxjLWFkdHMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtMTYwMDAtc3RlcmVvLWxjLWFkdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmYTQ5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZmFhYy0xNjAwMC1zdGVyZW8tbGMtYWR0cwpAQCAtMCwwICsxIEBACitwcmVzaWc6IDAgcG9zdHNpZzoxNTM2IGM6IDEuMDAxMSBsZW5lcnI6MTUzNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1mYWFjLTE2MDAwLXN0ZXJlby1sYy1tNGEgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtMTYwMDAtc3RlcmVvLWxjLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZhNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1mYWFjLTE2MDAwLXN0ZXJlby1sYy1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAwIHBvc3RzaWc6MTUzNiBjOiAxLjAwMTEgbGVuZXJyOjE1MzYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZmFhYy00NDEwMC1tb25vLWxjLWFkdHMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtNDQxMDAtbW9uby1sYy1hZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZmFlYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtNDQxMDAtbW9uby1sYy1hZHRzCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMCBwb3N0c2lnOjg4OCBjOiAwLjk4ODIgbGVuZXJyOjg4OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1mYWFjLTQ0MTAwLW1vbm8tbGMtbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1mYWFjLTQ0MTAwLW1vbm8tbGMtbTRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZmFlYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtNDQxMDAtbW9uby1sYy1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAwIHBvc3RzaWc6ODg4IGM6IDAuOTg4MiBsZW5lcnI6ODg4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtNDQxMDAtc3RlcmVvLWxjLWFkdHMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtNDQxMDAtc3RlcmVvLWxjLWFkdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwYTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtZmFhYy00NDEwMC1zdGVyZW8tbGMtYWR0cwpAQCAtMCwwICsxIEBACitwcmVzaWc6IDAgcG9zdHNpZzoxNzc2IGM6IDAuOTg4MiBsZW5lcnI6MTc3NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1mYWFjLTQ0MTAwLXN0ZXJlby1sYy1tNGEgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLWZhYWMtNDQxMDAtc3RlcmVvLWxjLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBhNDhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1mYWFjLTQ0MTAwLXN0ZXJlby1sYy1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAwIHBvc3RzaWc6MTc3NiBjOiAwLjk4ODIgbGVuZXJyOjE3NzYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby0xNjAwMC1tb25vLWhlLW00YSBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby0xNjAwMC1tb25vLWhlLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU3NjRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTE2MDAwLW1vbm8taGUtbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogLTQgcG9zdHNpZzoxOTYgYzogMC45NzM2IGxlbmVycjoxOTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby0xNjAwMC1tb25vLWxjLW00YSBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby0xNjAwMC1tb25vLWxjLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDBjNDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTE2MDAwLW1vbm8tbGMtbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMCBwb3N0c2lnOjE5MiBjOiAwLjk5NjUgbGVuZXJyOjE5MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1oZS1tNGEgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLW5lcm8tMTYwMDAtc3RlcmVvLWhlLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGMzMWMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1oZS1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAtOCBwb3N0c2lnOjM5MiBjOiAwLjk3NzcgbGVuZXJyOjM4NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1oZTItbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1oZTItbTRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDU0OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLW5lcm8tMTYwMDAtc3RlcmVvLWhlMi1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAyIHBvc3RzaWc6MjU5MCBjOiAwLjk5MzQgbGVuZXJyOjI1OTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby0xNjAwMC1zdGVyZW8tbGMtbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTE2MDAwLXN0ZXJlby1sYy1tNGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2YzNjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby0xNjAwMC1zdGVyZW8tbGMtbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMCBwb3N0c2lnOjM4NCBjOiAwLjk5NjEgbGVuZXJyOjM4NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLW1vbm8taGUtbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLW1vbm8taGUtbTRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZGNkOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLW5lcm8tNDQxMDAtbW9uby1oZS1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAwIHBvc3RzaWc6MTMzNiBjOiAwLjk5NzMgbGVuZXJyOjEzMzYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby00NDEwMC1tb25vLWxjLW00YSBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby00NDEwMC1tb25vLWxjLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2IwNzRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLW1vbm8tbGMtbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMCBwb3N0c2lnOjMxMiBjOiAwLjk5ODYgbGVuZXJyOjMxMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLXN0ZXJlby1oZS1tNGEgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLW5lcm8tNDQxMDAtc3RlcmVvLWhlLW00YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE4N2MwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLXN0ZXJlby1oZS1tNGEKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAtMiBwb3N0c2lnOjI2NzQgYzogMC45OTg2IGxlbmVycjoyNjcyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLW5lcm8tNDQxMDAtc3RlcmVvLWhlMi1tNGEgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLW5lcm8tNDQxMDAtc3RlcmVvLWhlMi1tNGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhMmNkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby00NDEwMC1zdGVyZW8taGUyLW00YQpAQCAtMCwwICsxIEBACitwcmVzaWc6IDIgcG9zdHNpZzo3ODIgYzogMC45OTgwIGxlbmVycjo3ODQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby00NDEwMC1zdGVyZW8tbGMtbTRhIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1uZXJvLTQ0MTAwLXN0ZXJlby1sYy1tNGEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFiYzQxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtbmVyby00NDEwMC1zdGVyZW8tbGMtbTRhCkBAIC0wLDAgKzEgQEAKK3ByZXNpZzogMCBwb3N0c2lnOjYyNCBjOiAwLjk5NTQgbGVuZXJyOjYyNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1xdWlja3RpbWU3LTQ0MTAwLXN0ZXJlby1sYy1tcDQgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLXF1aWNrdGltZTctNDQxMDAtc3RlcmVvLWxjLW1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTFhNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1xdWlja3RpbWU3LTQ0MTAwLXN0ZXJlby1sYy1tcDQKQEAgLTAsMCArMSBAQAorcHJlc2lnOiA0MjIwIHBvc3RzaWc6LTI0NDQgYzogMC45NzY4IGxlbmVycjoxNzc2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLXF1aWNrdGltZVgtNDQxMDAtc3RlcmVvLWxjLW00YSBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtcXVpY2t0aW1lWC00NDEwMC1zdGVyZW8tbGMtbTRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZGFmMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLXF1aWNrdGltZVgtNDQxMDAtc3RlcmVvLWxjLW00YQpAQCAtMCwwICsxIEBACitwcmVzaWc6IDAgcG9zdHNpZzoxNjQ4IGM6IDAuOTk5NCBsZW5lcnI6MTY0OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1zcXVhcmUtYWFjIGIvdGVzdHMvcmVmL2ZhdGUvYXVkaW9tYXRjaC1zcXVhcmUtYWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNDgwZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLXNxdWFyZS1hYWMKQEAgLTAsMCArMSBAQAorcHJlc2lnOiAwIHBvc3RzaWc6ODkyIGM6IDAuOTk4MyBsZW5lcnI6ODkyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLXNxdWFyZS1tcDMgYi90ZXN0cy9yZWYvZmF0ZS9hdWRpb21hdGNoLXNxdWFyZS1tcDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlNTVjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2F1ZGlvbWF0Y2gtc3F1YXJlLW1wMwpAQCAtMCwwICsxIEBACitwcmVzaWc6IDAgcG9zdHNpZzowIGM6IDAuOTQ0NyBsZW5lcnI6MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYXVyYXZpc2lvbi12MSBiL3Rlc3RzL3JlZi9mYXRlL2F1cmF2aXNpb24tdjEKaW5kZXggNDU2ZjM5OS4uMjVhMTVjZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYXVyYXZpc2lvbi12MQorKysgYi90ZXN0cy9yZWYvZmF0ZS9hdXJhdmlzaW9uLXYxCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDMzMzM5LzUwMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDEyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyODgwMCwgMHg0YTRlZmJiYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDI4ODAwLCAweGM2YzdlMjZhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjg4MDAsIDB4NmNkNDA5MTMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F1cmF2aXNpb24tdjIgYi90ZXN0cy9yZWYvZmF0ZS9hdXJhdmlzaW9uLXYyCmluZGV4IGYxZThlM2EuLjQ5ODk0NGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2F1cmF2aXNpb24tdjIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXVyYXZpc2lvbi12MgpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAzMzMzMy8xMDAwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDJmMjQ3ZjY2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjQ5MjkyOWUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2F2aW8tZGlyZWN0IGIvdGVzdHMvcmVmL2ZhdGUvYXZpby1kaXJlY3QKaW5kZXggNTk5NjgzYS4uYzA2MjhlOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYXZpby1kaXJlY3QKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYXZpby1kaXJlY3QKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjg4eDE2OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0NTE1MiwgMHg4NDU4ZDRjYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ1MTUyLCAweGE2OTRkN2M3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDUxNTIsIDB4MmJkNGJmYzkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2JldGhzb2Z0LXZpZCBiL3Rlc3RzL3JlZi9mYXRlL2JldGhzb2Z0LXZpZAppbmRleCA5Zjk2ZGExLi4yNWE2MmFlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9iZXRoc29mdC12aWQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYmV0aHNvZnQtdmlkCkBAIC0xLDUgKzEsMTQgQEAKICN0YiAwOiAxLzE0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjAwCisjc2FyIDA6IDAvMQogI3RiIDE6IDEvMTExMTEKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogMTExMTEKKyNjaGFubmVsX2xheW91dCAxOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTIwMDAsIDB4MDAwMDAwMDAKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgNzQwLCAgICAgMTQ4MCwgMHgwMDAwMDAwMAogMSwgICAgICAgIDc0MCwgICAgICAgIDc0MCwgICAgICA3NDAsICAgICAxNDgwLCAweDIwYTkyYmQ0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9iZmkgYi90ZXN0cy9yZWYvZmF0ZS9iZmkKaW5kZXggMGQzZDhmMi4uMjc3YzkzNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYmZpCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JmaQpAQCAtMSw1ICsxLDE0IEBACiAjdGIgMDogMS85CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTQwCisjc2FyIDA6IDAvMQogI3RiIDE6IDEvMTEwMjUKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogMTEwMjUKKyNjaGFubmVsX2xheW91dCAxOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMzQ0MDAsIDB4YzIxOGIwMGMKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICA4ODg0LCAgICAxNzc2OCwgMHgwN2RmMTM1YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTM0NDAwLCAweDExNGRhZjdjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9iaW5rLXZpZGVvLWIgYi90ZXN0cy9yZWYvZmF0ZS9iaW5rLXZpZGVvLWIKaW5kZXggYzc3MmVkYS4uNjYzNDU3YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYmluay12aWRlby1iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JpbmstdmlkZW8tYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyMDB4MTE2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM0ODAwLCAweDRmZDBhOGU0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzQ4MDAsIDB4ZDM4MWE3YjcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzNDgwMCwgMHg2ODhjYTMxNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYmluay12aWRlby1mIGIvdGVzdHMvcmVmL2ZhdGUvYmluay12aWRlby1mCmluZGV4IDQwYmM1YTkuLjkxMmNlZWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2JpbmstdmlkZW8tZgorKysgYi90ZXN0cy9yZWYvZmF0ZS9iaW5rLXZpZGVvLWYKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgMHhiMDZmNzg0MQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDYwODAwLCAweDdlZDA2NDEyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NjA4MDAsIDB4ZTgyYjVjM2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2JpbmstdmlkZW8taSBiL3Rlc3RzL3JlZi9mYXRlL2JpbmstdmlkZW8taQppbmRleCAzMmM1ZTEwLi4wZDY3ZTk4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9iaW5rLXZpZGVvLWkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYmluay12aWRlby1pCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0NjA4MDAsIDB4YWVmMTMzZDkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQ2MDgwMCwgMHgyZGExMjQ4YgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDYwODAwLCAweDNkNzk0NWI0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9iaW5zdWItbWtzZW5jIGIvdGVzdHMvcmVmL2ZhdGUvYmluc3ViLW1rc2VuYwppbmRleCAxMjhjYTMxLi5mMjQ3ZDlkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9iaW5zdWItbWtzZW5jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JpbnN1Yi1ta3NlbmMKQEAgLTEgKzEgQEAKLTM3YTIxMmY4ZDU2YWQ3MWU3NDY2ZDUxMjlmODhlNzU2CitmODBmNDJlNjQ2ZmNlOTcyZTczYWE2ZDk5ZGNmYTQ3MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYmluc3ViLW1vdnRleHRlbmMgYi90ZXN0cy9yZWYvZmF0ZS9iaW5zdWItbW92dGV4dGVuYwppbmRleCA2ZWZlMmMwLi4yMmVlODVhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9iaW5zdWItbW92dGV4dGVuYworKysgYi90ZXN0cy9yZWYvZmF0ZS9iaW5zdWItbW92dGV4dGVuYwpAQCAtMSArMSBAQAotZWYyNjQwNjRjNTIyMzg5ZDBjZjI2N2M0ZDYyMzU1NjEKK2FmNmE4ZjM4ZDdjMTFkOWFmNzgyM2NjNDQ1NTRkMmFkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9ibXAtMTViaXQgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtMTViaXQKaW5kZXggYTBmM2JiZi4uMjliNjMzNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYm1wLTE1Yml0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JtcC0xNWJpdApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjd4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYyNTYsIDB4ZGJjZjg4MWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2JtcC0xNWJpdC1tYXNrIGIvdGVzdHMvcmVmL2ZhdGUvYm1wLTE1Yml0LW1hc2sKaW5kZXggYTBmM2JiZi4uMjliNjMzNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYm1wLTE1Yml0LW1hc2sKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYm1wLTE1Yml0LW1hc2sKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI3eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2MjU2LCAweGRiY2Y4ODFkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9ibXAtMTZiaXQtbWFzayBiL3Rlc3RzL3JlZi9mYXRlL2JtcC0xNmJpdC1tYXNrCmluZGV4IGFmYTVhYjQuLjg3NjBmZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2JtcC0xNmJpdC1tYXNrCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JtcC0xNmJpdC1tYXNrCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyN3g2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjI1NiwgMHg0NDY3NTk0OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYm1wLTFiaXQgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtMWJpdAppbmRleCAxYzgyNWIxLi5hNDAzMjhmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXAtMWJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtMWJpdApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjd4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjQzODQsIDB4NGM5NjgzMDEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2JtcC0yNGJpdCBiL3Rlc3RzL3JlZi9mYXRlL2JtcC0yNGJpdAppbmRleCA4ZjFhNjE1Li42Mzk0ZDJmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXAtMjRiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYm1wLTI0Yml0CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyN3g2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyNDM4NCwgMHgzMjVkZDhkOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYm1wLTMyYml0IGIvdGVzdHMvcmVmL2ZhdGUvYm1wLTMyYml0CmluZGV4IDhmMWE2MTUuLjYzOTRkMmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2JtcC0zMmJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtMzJiaXQKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI3eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDI0Mzg0LCAweDMyNWRkOGQ5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9ibXAtMzJiaXQtbWFzayBiL3Rlc3RzL3JlZi9mYXRlL2JtcC0zMmJpdC1tYXNrCmluZGV4IDhmMWE2MTUuLjYzOTRkMmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2JtcC0zMmJpdC1tYXNrCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JtcC0zMmJpdC1tYXNrCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyN3g2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyNDM4NCwgMHgzMjVkZDhkOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYm1wLTRiaXQgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtNGJpdAppbmRleCBjMGVlZGYxLi5iNDI2MmM5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXAtNGJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtNGJpdApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjd4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjQzODQsIDB4MzIyZDgxZjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2JtcC00Yml0LW9zMiBiL3Rlc3RzL3JlZi9mYXRlL2JtcC00Yml0LW9zMgppbmRleCA4YTVmNjU4Li45Y2Y5Y2YwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXAtNGJpdC1vczIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYm1wLTRiaXQtb3MyCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMwMHgyMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxOTgwMCwgMHg1NjNiNTk5YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYm1wLThiaXQgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtOGJpdAppbmRleCA4ODcxMTNjLi4zZWNlYTUzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXAtOGJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtOGJpdApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjd4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjQzODQsIDB4YTdhYTZiOWIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2JtcC04Yml0LW9zMiBiL3Rlc3RzL3JlZi9mYXRlL2JtcC04Yml0LW9zMgppbmRleCA4ODcxMTNjLi4zZWNlYTUzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXAtOGJpdC1vczIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYm1wLThiaXQtb3MyCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyN3g2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyNDM4NCwgMHhhN2FhNmI5YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYm1wLXJsZTQgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtcmxlNAppbmRleCBjMGVlZGYxLi5iNDI2MmM5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXAtcmxlNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9ibXAtcmxlNApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjd4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjQzODQsIDB4MzIyZDgxZjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2JtcC1ybGU4IGIvdGVzdHMvcmVmL2ZhdGUvYm1wLXJsZTgKaW5kZXggODg3MTEzYy4uM2VjZWE1MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYm1wLXJsZTgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYm1wLXJsZTgKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI3eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDI0Mzg0LCAweGE3YWE2YjliCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9ibXBwYXJzZXIgYi90ZXN0cy9yZWYvZmF0ZS9ibXBwYXJzZXIKaW5kZXggM2NkZDk4Ni4uOTM0MDc0MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYm1wcGFyc2VyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JtcHBhcnNlcgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MHgzMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMzYwMCwgMHhkM2E3YzU4MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAzNjAwLCAweDQ2MDJiYmY5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgIDM2MDAsIDB4M2E5NmI4ZjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Jtdi1hdWRpbyBiL3Rlc3RzL3JlZi9mYXRlL2Jtdi1hdWRpbwppbmRleCA3NDZiYjBjLi42ZTFhNGMyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXYtYXVkaW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvYm12LWF1ZGlvCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjIwNTAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxODU2LCAgICAgNzQyNCwgMHgxODU0MGIzNgogMCwgICAgICAgMTg1NiwgICAgICAgMTg1NiwgICAgIDE4MjQsICAgICA3Mjk2LCAweDVhY2QyNDg0CiAwLCAgICAgICAzNjgwLCAgICAgICAzNjgwLCAgICAgMTg1NiwgICAgIDc0MjQsIDB4YTFiYzVjNWEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Jtdi12aWRlbyBiL3Rlc3RzL3JlZi9mYXRlL2Jtdi12aWRlbwppbmRleCBmMTljZDQ1Li5kMzYwZDU4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ibXYtdmlkZW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvYm12LXZpZGVvCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTIKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0MjkKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA4MjM2ODAsIDB4ZGRiOGEzMDYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDgyMzY4MCwgMHhhOTUzNzVjOAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgODIzNjgwLCAweGE5NTM3NWM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9icmVuZGVycGl4LTI0IGIvdGVzdHMvcmVmL2ZhdGUvYnJlbmRlcnBpeC0yNAppbmRleCAzMmIyOWEwLi5iZTgxZmMyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9icmVuZGVycGl4LTI0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JyZW5kZXJwaXgtMjQKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzMjc2OCwgMHgxOGJjNmNhYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYnJlbmRlcnBpeC01NjUgYi90ZXN0cy9yZWYvZmF0ZS9icmVuZGVycGl4LTU2NQppbmRleCBjMjQzYTRjLi5iYzkyNzY2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9icmVuZGVycGl4LTU2NQorKysgYi90ZXN0cy9yZWYvZmF0ZS9icmVuZGVycGl4LTU2NQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDMyNzY4LCAweGZkODU1ZGRhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9icmVuZGVycGl4LWRlZnBhbCBiL3Rlc3RzL3JlZi9mYXRlL2JyZW5kZXJwaXgtZGVmcGFsCmluZGV4IDZjNTU3NDAuLmM1NjMyYWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2JyZW5kZXJwaXgtZGVmcGFsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2JyZW5kZXJwaXgtZGVmcGFsCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI1NngyNTYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTY2MDgsIDB4YWRhMTFkMTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2JyZW5kZXJwaXgtaW50cGFsIGIvdGVzdHMvcmVmL2ZhdGUvYnJlbmRlcnBpeC1pbnRwYWwKaW5kZXggNDczYjE1My4uNzg5Yzg3ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYnJlbmRlcnBpeC1pbnRwYWwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvYnJlbmRlcnBpeC1pbnRwYWwKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2eDI1NgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5NjYwOCwgMHg5NjYyZjkxNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvYnJlbmRlcnBpeC15NDAwYSBiL3Rlc3RzL3JlZi9mYXRlL2JyZW5kZXJwaXgteTQwMGEKaW5kZXggMDBlMTU0MC4uMWY3YzhkYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvYnJlbmRlcnBpeC15NDAwYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9icmVuZGVycGl4LXk0MDBhCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2eDk2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAzMDcyLCAweDQ4MjgwNDU2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWNsbGMtYXJnYiBiL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtY2xsYy1hcmdiCmluZGV4IDRhNWRjZTUuLmJhYjdlZDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtY2xsYy1hcmdiCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtY2xsYy1hcmdiCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMjQwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyODB4NzIwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzNjg2NDAwLCAweGIzN2E2ZTY5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDM2ODY0MDAsIDB4NjZhNDUwMzIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMzY4NjQwMCwgMHhkZjBjODYxZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1jbGxjLXJnYiBiL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtY2xsYy1yZ2IKaW5kZXggYjRjYTA1NS4uZTlmNTRkMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1jbGxjLXJnYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWNsbGMtcmdiCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA5MjE2MDAsIDB4ODJlNDRjYjkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDkyMTYwMCwgMHg2ZWNjOGE2YwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgOTIxNjAwLCAweDBkYzMxODM5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWNsbGMteXV5Mi1ub2Jsb2NrIGIvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1jbGxjLXl1eTItbm9ibG9jawppbmRleCA2YWQ1OWQ1Li42MjQyYTgyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWNsbGMteXV5Mi1ub2Jsb2NrCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtY2xsYy15dXkyLW5vYmxvY2sKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDYxNDQwMCwgMHgwODhjNTFkZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNjE0NDAwLCAweDkzZmZmNjYyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA2MTQ0MDAsIDB4OTBiYTZjMjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtaHFfaHFhLWhxIGIvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1ocV9ocWEtaHEKaW5kZXggY2EzNzZkYy4uNjU3ZTFlMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1ocV9ocWEtaHEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1ocV9ocWEtaHEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDU3NgorI3NhciAwOiA2NC80NQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgODI5NDQwLCAweDhiNmIyZjZkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA4Mjk0NDAsIDB4NzAzODJiZjAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDgyOTQ0MCwgMHhiZmRmMWY4ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1ocV9ocWEtaHFhIGIvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1ocV9ocWEtaHFhCmluZGV4IDA5OTY1MDAuLjFmZDViZjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtaHFfaHFhLWhxYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWhxX2hxYS1ocWEKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA2MjIwODAwLCAweDJiMmIxN2NjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWhxX2hxYS1pbnRlciBiL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtaHFfaHFhLWludGVyCmluZGV4IDI4ODBjOTUuLmU0YmJiNWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtaHFfaHFhLWludGVyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtaHFfaHFhLWludGVyCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgNDE0NzIwMCwgMHg0MThlY2ZlNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1ocXg0MjIgYi90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWhxeDQyMgppbmRleCAyZTFmZGYxLi41NTAxYWJkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWhxeDQyMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWhxeDQyMgpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NTc2Cisjc2FyIDA6IDY0LzQ1CiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDE2NTg4ODAsIDB4ODIzZmNiYWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtaHF4NDIyYSBiL3Rlc3RzL3JlZi9mYXRlL2Nhbm9wdXMtaHF4NDIyYQppbmRleCAwZmQyNTc3Li5lMjJhZjEyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jYW5vcHVzLWhxeDQyMmEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2Fub3B1cy1ocXg0MjJhCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgODI5NDQwMCwgMHg5YTIyYmViZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2F2cyBiL3Rlc3RzL3JlZi9mYXRlL2NhdnMKaW5kZXggODdjZjljYS4uZGRjYmUwNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY2F2cworKysgYi90ZXN0cy9yZWYvZmF0ZS9jYXZzCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2MjIwODAsIDB4MjI3NmJjNzgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkYTFmNjk4YQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNjIyMDgwLCAweGI5OTA3MDIzCkBAIC0xNjksNCArMTczLDMgQEAKIDAsICAgICAgICAxNjcsICAgICAgICAxNjcsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkY2I0Y2VlOAogMCwgICAgICAgIDE2OCwgICAgICAgIDE2OCwgICAgICAgIDEsICAgNjIyMDgwLCAweGI0MTE3MmU1CiAwLCAgICAgICAgMTY5LCAgICAgICAgMTY5LCAgICAgICAgMSwgICA2MjIwODAsIDB4NTZjNzI0NzgKLTAsICAgICAgICAxNzAsICAgICAgICAxNzAsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4NGZmM2FmOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtQVVEX01XX0UgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1BVURfTVdfRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjA0NzkyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtQVVEX01XX0UKQEAgLTAsMCArMSBAQAorOWI4ODg0NjY3ZWRhMGI5ODUzYmVjNjMxNDU4Njg2Y2UKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LUJBU1FQMV9Tb255X0MgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1CQVNRUDFfU29ueV9DCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTg1YzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1CQVNRUDFfU29ueV9DCkBAIC0wLDAgKzEgQEAKKzAwYzUyYWU2MGJmOWE0MWFlMTE0NWZiZjVmZWE5ODM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1DQUJBQ0kzX1NvbnlfQiBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LUNBQkFDSTNfU29ueV9CCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YWViNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1DQUJBQ0kzX1NvbnlfQgpAQCAtMCwwICsxIEBACisyZDk0YzgwYjg1OGFlYzg4MDUzMGJhZDQ3YWZlMzY2OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtQ1ZCUzNfU29ueV9DIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtQ1ZCUzNfU29ueV9DCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjVlMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1DVkJTM19Tb255X0MKQEAgLTAsMCArMSBAQAorNTlmZjFkZjliMjVlODAyNzdjYWQ0YWQ5OWU2MzRkZjYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LUNWRkMxX1NvbnlfQyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LUNWRkMxX1NvbnlfQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODAwNGNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtQ1ZGQzFfU29ueV9DCkBAIC0wLDAgKzEgQEAKKzY2OWY0ZjNkM2FlMzVmYTVhNmY1Yzk0ZTQ4Nzc2ZGNmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1DVk1BTkwxX1RPU0hJQkFfQiBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LUNWTUFOTDFfVE9TSElCQV9CCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWE0NTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1DVk1BTkwxX1RPU0hJQkFfQgpAQCAtMCwwICsxIEBACiswYzFkOTY5NGRmNzQ3Y2M0Njk3Y2FmODY2YmQzMDUxYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtQ1ZOTEZJMV9Tb255X0MgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1DVk5MRkkxX1NvbnlfQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWY1YWQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtQ1ZOTEZJMV9Tb255X0MKQEAgLTAsMCArMSBAQAorNzgxN2Q4OWJkNzQ5YmM2MTdhMjI1OTc4OTU4YTNhZjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LUNWU0UyX1NvbnlfQiBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LUNWU0UyX1NvbnlfQgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODQ1NzIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtQ1ZTRTJfU29ueV9CCkBAIC0wLDAgKzEgQEAKK2NhOGJkYmE0OTdiZDJmM2I5N2M1MGQ1OTY5MmViNTM3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1DVldQMV9UT1NISUJBX0UgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1DVldQMV9UT1NISUJBX0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiOWM0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LUNWV1AxX1RPU0hJQkFfRQpAQCAtMCwwICsxIEBACiswMTI5MDYxMTE2NWI4ZDhjY2JhODQ2OGYzZGFlNGM0ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtRk0xX0JUX0IgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1GTTFfQlRfQgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJkZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtRk0xX0JUX0IKQEAgLTAsMCArMSBAQAorZjdkNTQ3NGVjNTc2ZWVhM2Y3MGQ4M2EyNmE2NDFhNjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LU1SMV9CVF9BIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtTVIxX0JUX0EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzMjY1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LU1SMV9CVF9BCkBAIC0wLDAgKzEgQEAKKzY5OWQzN2U2Njc2NGRkYjNiNDI2NWMyOTljYTc3ZGNkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1TVkFfQmFzZV9CIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtU1ZBX0Jhc2VfQgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTkxYjgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtU1ZBX0Jhc2VfQgpAQCAtMCwwICsxIEBACis0NDNlNTVkZDVmNjNkY2NmOWE2MmFjYmI0ODQ1MWIwOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtU2hhcnBfTVBfUEFGRl8xcjIgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaDI2NC1TaGFycF9NUF9QQUZGXzFyMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzdkNjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtU2hhcnBfTVBfUEFGRl8xcjIKQEAgLTAsMCArMSBAQAorZmQwMTg0MGVkNmIwODZjMzExOGI3YzUzYzg2ZDAxZjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LXNwMV9idF9hIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWgyNjQtc3AxX2J0X2EKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4YzUzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oMjY0LXNwMV9idF9hCkBAIC0wLDAgKzEgQEAKKzg0MDVjNTU4M2QzMWQ3MDE1ZWQ0MDFiMzRiNGVjOTNjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1DQUlOSVRfRV9TSEFSUF8zIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtQ0FJTklUX0VfU0hBUlBfMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2FmODZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtQ0FJTklUX0VfU0hBUlBfMwpAQCAtMCwwICsxIEBACis0NGQxYzBiODA4MjhhZjc3OWQ5NDJjYzIwZGRlNGVhNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtQ0FJTklUX0hfU0hBUlBfMyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLUNBSU5JVF9IX1NIQVJQXzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxMjdkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLUNBSU5JVF9IX1NIQVJQXzMKQEAgLTAsMCArMSBAQAorYWU5MzExZGZjYWY2NWJiOGRlOWM0ZmNmMjNjZTA4NzEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLUNPTkZXSU5fQV9Tb255XzEgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1DT05GV0lOX0FfU29ueV8xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNDQ1MTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1DT05GV0lOX0FfU29ueV8xCkBAIC0wLDAgKzEgQEAKK2RjZTgxMDRiMmFkZGJkZDYwMWViMjgwYTg4ZTE4NTgzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1IUkRfQV9GdWppdHN1XzIgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1IUkRfQV9GdWppdHN1XzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljOTBhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLUhSRF9BX0Z1aml0c3VfMgpAQCAtMCwwICsxIEBACis3MTZhOTAwNTFmMDI4YzkwZGFlYjg2YjM4MjVhZjM2ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtTFRSUFNQU19BX1F1YWxjb21tXzEgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1MVFJQU1BTX0FfUXVhbGNvbW1fMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRmYTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtTFRSUFNQU19BX1F1YWxjb21tXzEKQEAgLTAsMCArMSBAQAorMTFiNTk5MjAyYTRkMjU2OTMxMjNiZWE4YmIwMDNlNTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLU5VVF9BX2VyaWNzc29uXzUgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1OVVRfQV9lcmljc3Nvbl81Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZTU4YWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1OVVRfQV9lcmljc3Nvbl81CkBAIC0wLDAgKzEgQEAKKzI1Y2Y5NGRmYTJlMDMzNGVlZWRiZmE5YThlZDFjNGIyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1QSUNTSVpFX0FfQm9zc2VuXzEgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1QSUNTSVpFX0FfQm9zc2VuXzEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxODAwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVBJQ1NJWkVfQV9Cb3NzZW5fMQpAQCAtMCwwICsxIEBACitlODdmYmQ5MGMyOTdkNDAxNzM4ZGI5MjhlM2UwNGRkNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtUElDU0laRV9CX0Jvc3Nlbl8xIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtUElDU0laRV9CX0Jvc3Nlbl8xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0OTVjZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1QSUNTSVpFX0JfQm9zc2VuXzEKQEAgLTAsMCArMSBAQAorNDk5M2Q0OWQ2ZjJmNTMyZGZjNjgzYTlkMjZjMWUzMTMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVJQTE1fQV9xdWFsY29tbV80IGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtUlBMTV9BX3F1YWxjb21tXzQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4ZDYxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVJQTE1fQV9xdWFsY29tbV80CkBAIC0wLDAgKzEgQEAKK2Y1ZDI2MzNlZWZjZDk1ZTE4OWZhZjQzMDJkMjcwNDU3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1SUFNfQV9kb2NvbW9fNCBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVJQU19BX2RvY29tb180Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmQxNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1SUFNfQV9kb2NvbW9fNApAQCAtMCwwICsxIEBACis5N2JkNGZlZmQ4Y2Q5NTU4NGY1ODYwMjdlMjQ0ZjI4MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtUlBTX0VfcXVhbGNvbW1fNSBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVJQU19FX3F1YWxjb21tXzUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZjdkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVJQU19FX3F1YWxjb21tXzUKQEAgLTAsMCArMSBAQAorYjI1MjhlZjY4MTcyOTE3NmNjYjM4YTc3YmU5M2EwZGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVNMSVNUX0FfU29ueV80IGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtU0xJU1RfQV9Tb255XzQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNiMmUzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVNMSVNUX0FfU29ueV80CkBAIC0wLDAgKzEgQEAKKzcyY2Y1M2JiYzk2N2M5Njc5ZTIxYTZkMzIwM2VkYjA3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1TTElTVF9EX1NvbnlfOSBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVNMSVNUX0RfU29ueV85Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZWE4NmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1TTElTVF9EX1NvbnlfOQpAQCAtMCwwICsxIEBACis1OWEyMmQ3MTVlMzA3NDg0OTJkYTVlMGI5ZDQyMTkwOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtU1RSVUNUX0FfU2Ftc3VuZ181IGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtU1RSVUNUX0FfU2Ftc3VuZ181Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNDUwOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1TVFJVQ1RfQV9TYW1zdW5nXzUKQEAgLTAsMCArMSBAQAorNjQ3ZWI4NTFiOTM1ZmQzYmM2YTk4Y2U1Y2U0NWRiYzcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVRJTEVTX0JfQ2lzY29fMSBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVRJTEVTX0JfQ2lzY29fMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzY3ZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtVElMRVNfQl9DaXNjb18xCkBAIC0wLDAgKzEgQEAKKzg1YTExNGRlZjE5Y2VmYmQwZmIwZGFmODM3MGQ3MTFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1XUFBfQV9lcmljc3Nvbl9NQUlOXzIgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1XUFBfQV9lcmljc3Nvbl9NQUlOXzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2OTI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVdQUF9BX2VyaWNzc29uX01BSU5fMgpAQCAtMCwwICsxIEBACitkZTdkNDQwYjU1NmVlYTgyNzk1M2U2ZDEyYWViNDAyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtV1BQX0ZfZXJpY3Nzb25fTUFJTl8yIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtV1BQX0ZfZXJpY3Nzb25fTUFJTl8yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YWVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1XUFBfRl9lcmljc3Nvbl9NQUlOXzIKQEAgLTAsMCArMSBAQAorZjE5NzEzNmYxZmIzMjQyYzM0MjJhNDg0NzBkZDdkMzUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVdQX0FfVG9zaGliYV8zIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLWhldmMtV1BfQV9Ub3NoaWJhXzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2OGM0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLVdQX0FfVG9zaGliYV8zCkBAIC0wLDAgKzEgQEAKKzE1ODMxMmExYTM1ZWY0YjIwY2I0YWVlZTQ4NTQ5YzAzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1pcGNtX0VfTkVDXzIgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtaGV2Yy1pcGNtX0VfTkVDXzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2OGI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1oZXZjLWlwY21fRV9ORUNfMgpAQCAtMCwwICsxIEBACisyZTFmOWM5NTM2NGNmYWMyYWE2ZTZlZTNhNTJjNDNjNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2JzLW1wZWcyLWhoaV9idXJzdF80MjJfc2hvcnQgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtbXBlZzItaGhpX2J1cnN0XzQyMl9zaG9ydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzE5ZmJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLW1wZWcyLWhoaV9idXJzdF80MjJfc2hvcnQKQEAgLTAsMCArMSBAQAorZTBjMmZkZDliYWViYTBjNWJhNTgzOWE4Y2Q3YTcyZDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Nicy1tcGVnMi1zb255LWN0MyBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1tcGVnMi1zb255LWN0MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI0YjEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2JzLW1wZWcyLXNvbnktY3QzCkBAIC0wLDAgKzEgQEAKK2IxZTE1YTA5Y2ZmZmJhZDgwMTgxMGFmMDkyODczNmFiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jYnMtbXBlZzItdGNlbGEtNiBiL3Rlc3RzL3JlZi9mYXRlL2Nicy1tcGVnMi10Y2VsYS02Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDM2OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jYnMtbXBlZzItdGNlbGEtNgpAQCAtMCwwICsxIEBACis3NzFiNjc1NmE2Mzc5M2UwNWI3NGU2NDU3OTQ5MDhhMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2RncmFwaGljcyBiL3Rlc3RzL3JlZi9mYXRlL2NkZ3JhcGhpY3MKaW5kZXggZWUwMmY1ZC4uZjA3OWJkNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY2RncmFwaGljcworKysgYi90ZXN0cy9yZWYvZmF0ZS9jZGdyYXBoaWNzCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMzAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMDB4MjE2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjU5MjAwLCAweDI5YWViMjdlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyNTkyMDAsIDB4MjlhZWIyN2UKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDI1OTIwMCwgMHg2Nzc5ZjU1ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2R4bC1iaXRsaW5lLWhhbTYgYi90ZXN0cy9yZWYvZmF0ZS9jZHhsLWJpdGxpbmUtaGFtNgppbmRleCA5YmE3NDA0Li4zN2MxNDU5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jZHhsLWJpdGxpbmUtaGFtNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9jZHhsLWJpdGxpbmUtaGFtNgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzUwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNjJ4MTMwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYzMTgwLCAweGNkYTgyYzE2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNjMxODAsIDB4YTYwOTdiZjkKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA2MzE4MCwgMHg0YzJmYjA5MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2R4bC1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL2NkeGwtZGVtdXgKaW5kZXggN2U0YzRjOC4uZjEzMzQ3NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY2R4bC1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jZHhsLWRlbXV4CkBAIC0xLDUgKzEsMTQgQEAKICN0YiAwOiAxLzExMDI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGNkeGwKKyNkaW1lbnNpb25zIDA6IDE3NngxMjgKKyNzYXIgMDogMC8xCiAjdGIgMTogMS8xMTAyNQorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczgKKyNzYW1wbGVfcmF0ZSAxOiAxMTAyNQorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxODg0LCAgICAyMjY4OCwgMHhjOTU0YTI0NAogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDE4ODQsICAgICAxODg0LCAweDA2OTI1ZTNlCiAwLCAgICAgICAxODg0LCAgICAgICAxODg0LCAgICAgMTg4NCwgICAgMjI2ODgsIDB4M2VlNGEzMDQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NkeGwtaGFtNiBiL3Rlc3RzL3JlZi9mYXRlL2NkeGwtaGFtNgppbmRleCA2NDI2ZDQ1Li4xNjAyYzhhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jZHhsLWhhbTYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2R4bC1oYW02CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDUyLzUyNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDEyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA1NzYwMCwgMHg4Nzg4N2E3YgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU3NjAwLCAweDEwYzMwMWQyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNTc2MDAsIDB4ZDFhNmY5MTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NkeGwtaGFtOCBiL3Rlc3RzL3JlZi9mYXRlL2NkeGwtaGFtOAppbmRleCAxZWViZWEzLi5hYjFmNzZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jZHhsLWhhbTgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2R4bC1oYW04CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEyLzI4MQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA2NzU4NCwgMHhjZTBjYWRlNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2R4bC1wYWw4IGIvdGVzdHMvcmVmL2ZhdGUvY2R4bC1wYWw4CmluZGV4IGIyZmIwNDUuLmEyNDJiMGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2NkeGwtcGFsOAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jZHhsLXBhbDgKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS81MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA2NzU4NCwgMHg1ZWFlNjI5YgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3NTg0LCAweDMyNTkxMjI3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNjc1ODQsIDB4NGU0NDI0YzcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NkeGwtcGFsOC1zbWFsbCBiL3Rlc3RzL3JlZi9mYXRlL2NkeGwtcGFsOC1zbWFsbAppbmRleCBmN2ExYTQ2Li4zMjZlZWY3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jZHhsLXBhbDgtc21hbGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2R4bC1wYWw4LXNtYWxsCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDM2OC8xMTAyNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDMwNzIwLCAweDBkNTUyY2ZkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzA3MjAsIDB4M2NmOTMyOTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzMDcyMCwgMHhlNDViMjg2OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2ZoZC0xIGIvdGVzdHMvcmVmL2ZhdGUvY2ZoZC0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyODBkNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jZmhkLTEKQEAgLTAsMCArMSwxNSBAQAorI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDEzODI0MDAsIDB4YTNlNDk4MTcKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMTM4MjQwMCwgMHg1NDRmZGZhYworMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAxMzgyNDAwLCAweDg0OTY0ZTExCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDEzODI0MDAsIDB4YzYwOGM4ZDEKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgMTM4MjQwMCwgMHhmMmYxNDA0ZgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAxMzgyNDAwLCAweDVhMzEwMGJhCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgIDEzODI0MDAsIDB4MzcyN2JhYTkKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgMTM4MjQwMCwgMHg4OTRmMDdkYgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAxMzgyNDAwLCAweDNlZjI3ZDQ2CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgIDEzODI0MDAsIDB4MWY5MDg4MGQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NmaGQtMiBiL3Rlc3RzL3JlZi9mYXRlL2NmaGQtMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RiNTRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY2ZoZC0yCkBAIC0wLDAgKzEsMTUgQEAKKyN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAyMDczNjAwLCAweDUzZmFiNDMzCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDIwNzM2MDAsIDB4MGQyYjNmNjQKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMjA3MzYwMCwgMHg4NTdkMWQ0OAorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAyMDczNjAwLCAweGUxYTdkZjMyCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDIwNzM2MDAsIDB4NjE1ODYxYzEKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgMjA3MzYwMCwgMHhmNmNkYjBhOQorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAyMDczNjAwLCAweDU1ZGQ5ZjE2CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDIwNzM2MDAsIDB4N2MxMjZhMzIKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgMjA3MzYwMCwgMHg1M2ZkZDRjNQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAyMDczNjAwLCAweDYwNjJhNGIzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jZmhkLTMgYi90ZXN0cy9yZWYvZmF0ZS9jZmhkLTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmZGM5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2NmaGQtMwpAQCAtMCwwICsxLDE1IEBACisjdGIgMDogMTAwMC8xNDU4NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDk2eDI0MQorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ3ODE0NCwgMHg0OGEwMWRiYgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDc4MTQ0LCAweDQ4YTAxZGJiCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NzgxNDQsIDB4NDhhMDFkYmIKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDQ3ODE0NCwgMHhiOTc4YTcyZgorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNDc4MTQ0LCAweDdiYmI0Njc5CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICA0NzgxNDQsIDB4YzNmZDNmNTkKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDQ3ODE0NCwgMHhmZDJhNDgxNgorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgNDc4MTQ0LCAweDIwN2Y2NWQzCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICA0NzgxNDQsIDB4MjA3ZjY1ZDMKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDQ3ODE0NCwgMHgyMDdmNjVkMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY2xqciBiL3Rlc3RzL3JlZi9mYXRlL2NsanIKaW5kZXggNTg0MjU0MS4uYWQ0Mzg4ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY2xqcgorKysgYi90ZXN0cy9yZWYvZmF0ZS9jbGpyCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDM1MjEvMTAwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNDB4MTgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY0ODAwLCAweDYzMTMyYTYwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNjQ4MDAsIDB4YjNjNzI5YTMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA2NDgwMCwgMHhhMjdiMWUwZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY29sb3JfdXRpbHMgYi90ZXN0cy9yZWYvZmF0ZS9jb2xvcl91dGlscwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGY4MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY29sb3JfdXRpbHMKQEAgLTAsMCArMSwzMDQgQEAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKC0wLjEwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKC0wLjAxODA1NCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKC0wLjAxMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKC0wLjAwNDQ5MCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKDAuMDAwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MSBjYWxsaW5nIGZ1bmMoMC4wMDMxNjIpIGV4cGVjdGVkPTAuMDE0MjMwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xIGNhbGxpbmcgZnVuYygwLjAwNTAwMCkgZXhwZWN0ZWQ9MC4wMjI1MDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKDAuMDA5MDAwKSBleHBlY3RlZD0wLjA0MDUwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MSBjYWxsaW5nIGZ1bmMoMC4wMTUwMDApIGV4cGVjdGVkPTAuMDY3NTAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xIGNhbGxpbmcgZnVuYygwLjEwMDAwMCkgZXhwZWN0ZWQ9MC4yOTA3NDgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKDEuMDAwMDAwKSBleHBlY3RlZD0xLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MSBjYWxsaW5nIGZ1bmMoNTIuMzcwMDAwKSBleHBlY3RlZD02LjQyNzUzMQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MSBjYWxsaW5nIGZ1bmMoMTI1LjA5ODc2NSkgZXhwZWN0ZWQ9OS41NTg1MTcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKDE5OTkuMTExMjMwKSBleHBlY3RlZD0zMy41MTI0OTAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKDY5NDUuNDQzMDAwKSBleHBlY3RlZD01OC43Njg3OTQKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEgY2FsbGluZyBmdW5jKDE1MTIzLjQ1NjcwMCkgZXhwZWN0ZWQ9ODMuNDUyOTE2CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xIGNhbGxpbmcgZnVuYygxOTg0NS44ODkyMzApIGV4cGVjdGVkPTk0LjMyMTI5NworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MSBjYWxsaW5nIGZ1bmMoOTg2NzguNDIzMTAwKSBleHBlY3RlZD0xOTQuMjE5NTY4CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xIGNhbGxpbmcgZnVuYyg5OTk5OS44OTk5OTgpIGV4cGVjdGVkPTE5NS4zODYzMDYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKC0wLjEwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKC0wLjAxODA1NCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKC0wLjAxMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKC0wLjAwNDQ5MCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKDAuMDAwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NCBjYWxsaW5nIGZ1bmMoMC4wMDMxNjIpIGV4cGVjdGVkPTAuMDczMDUzCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz00IGNhbGxpbmcgZnVuYygwLjAwNTAwMCkgZXhwZWN0ZWQ9MC4wODk5NjYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKDAuMDA5MDAwKSBleHBlY3RlZD0wLjExNzUyMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NCBjYWxsaW5nIGZ1bmMoMC4wMTUwMDApIGV4cGVjdGVkPTAuMTQ4MjM1CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz00IGNhbGxpbmcgZnVuYygwLjEwMDAwMCkgZXhwZWN0ZWQ9MC4zNTExMTkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKDEuMDAwMDAwKSBleHBlY3RlZD0xLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NCBjYWxsaW5nIGZ1bmMoNTIuMzcwMDAwKSBleHBlY3RlZD02LjA0NTA2OAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NCBjYWxsaW5nIGZ1bmMoMTI1LjA5ODc2NSkgZXhwZWN0ZWQ9OC45ODA0MjQKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKDE5OTkuMTExMjMwKSBleHBlY3RlZD0zMS42NTA0OTAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKDY5NDUuNDQzMDAwKSBleHBlY3RlZD01NS43NDc3MzgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTQgY2FsbGluZyBmdW5jKDE1MTIzLjQ1NjcwMCkgZXhwZWN0ZWQ9NzkuNDAzODIwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz00IGNhbGxpbmcgZnVuYygxOTg0NS44ODkyMzApIGV4cGVjdGVkPTg5Ljg0MzQ5MQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NCBjYWxsaW5nIGZ1bmMoOTg2NzguNDIzMTAwKSBleHBlY3RlZD0xODYuMjUyMDI0CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz00IGNhbGxpbmcgZnVuYyg5OTk5OS44OTk5OTgpIGV4cGVjdGVkPTE4Ny4zODE2NTcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKC0wLjEwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKC0wLjAxODA1NCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKC0wLjAxMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKC0wLjAwNDQ5MCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKDAuMDAwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NSBjYWxsaW5nIGZ1bmMoMC4wMDMxNjIpIGV4cGVjdGVkPTAuMTI3OTgwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz01IGNhbGxpbmcgZnVuYygwLjAwNTAwMCkgZXhwZWN0ZWQ9MC4xNTA3MzEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKDAuMDA5MDAwKSBleHBlY3RlZD0wLjE4NTk0MAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NSBjYWxsaW5nIGZ1bmMoMC4wMTUwMDApIGV4cGVjdGVkPTAuMjIzMTU0CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz01IGNhbGxpbmcgZnVuYygwLjEwMDAwMCkgZXhwZWN0ZWQ9MC40MzkzOTcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKDEuMDAwMDAwKSBleHBlY3RlZD0xLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NSBjYWxsaW5nIGZ1bmMoNTIuMzcwMDAwKSBleHBlY3RlZD00LjExMTEwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NSBjYWxsaW5nIGZ1bmMoMTI1LjA5ODc2NSkgZXhwZWN0ZWQ9NS42MTA3MjQKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKDE5OTkuMTExMjMwKSBleHBlY3RlZD0xNS4wOTYyOTQKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKDY5NDUuNDQzMDAwKSBleHBlY3RlZD0yMy41NTI0MjkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKDE1MTIzLjQ1NjcwMCkgZXhwZWN0ZWQ9MzEuMDk4MDA1CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz01IGNhbGxpbmcgZnVuYygxOTg0NS44ODkyMzApIGV4cGVjdGVkPTM0LjI2NzQ5NAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NSBjYWxsaW5nIGZ1bmMoOTg2NzguNDIzMTAwKSBleHBlY3RlZD02MC43NjQ2MjAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTUgY2FsbGluZyBmdW5jKDk5OTk5Ljg5OTk5OCkgZXhwZWN0ZWQ9NjEuMDU0MDAxCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygtMC4xMDAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygtMC4wMTgwNTQpIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygtMC4wMTAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygtMC4wMDQ0OTApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygwLjAwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTYgY2FsbGluZyBmdW5jKDAuMDAzMTYyKSBleHBlY3RlZD0wLjAxNDIzMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NiBjYWxsaW5nIGZ1bmMoMC4wMDUwMDApIGV4cGVjdGVkPTAuMDIyNTAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygwLjAwOTAwMCkgZXhwZWN0ZWQ9MC4wNDA1MDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTYgY2FsbGluZyBmdW5jKDAuMDE1MDAwKSBleHBlY3RlZD0wLjA2NzUwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NiBjYWxsaW5nIGZ1bmMoMC4xMDAwMDApIGV4cGVjdGVkPTAuMjkwNzQ4CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygxLjAwMDAwMCkgZXhwZWN0ZWQ9MS4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTYgY2FsbGluZyBmdW5jKDUyLjM3MDAwMCkgZXhwZWN0ZWQ9Ni40Mjc1MzEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTYgY2FsbGluZyBmdW5jKDEyNS4wOTg3NjUpIGV4cGVjdGVkPTkuNTU4NTE3CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygxOTk5LjExMTIzMCkgZXhwZWN0ZWQ9MzMuNTEyNDkwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYyg2OTQ1LjQ0MzAwMCkgZXhwZWN0ZWQ9NTguNzY4Nzk0CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz02IGNhbGxpbmcgZnVuYygxNTEyMy40NTY3MDApIGV4cGVjdGVkPTgzLjQ1MjkxNgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NiBjYWxsaW5nIGZ1bmMoMTk4NDUuODg5MjMwKSBleHBlY3RlZD05NC4zMjEyOTcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTYgY2FsbGluZyBmdW5jKDk4Njc4LjQyMzEwMCkgZXhwZWN0ZWQ9MTk0LjIxOTU2OAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NiBjYWxsaW5nIGZ1bmMoOTk5OTkuODk5OTk4KSBleHBlY3RlZD0xOTUuMzg2MzA2CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygtMC4xMDAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygtMC4wMTgwNTQpIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygtMC4wMTAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygtMC4wMDQ0OTApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygwLjAwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTcgY2FsbGluZyBmdW5jKDAuMDAzMTYyKSBleHBlY3RlZD0wLjAxMjY0OQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NyBjYWxsaW5nIGZ1bmMoMC4wMDUwMDApIGV4cGVjdGVkPTAuMDIwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygwLjAwOTAwMCkgZXhwZWN0ZWQ9MC4wMzYwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTcgY2FsbGluZyBmdW5jKDAuMDE1MDAwKSBleHBlY3RlZD0wLjA2MDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NyBjYWxsaW5nIGZ1bmMoMC4xMDAwMDApIGV4cGVjdGVkPTAuMjgyODc1CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygxLjAwMDAwMCkgZXhwZWN0ZWQ9MS4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTcgY2FsbGluZyBmdW5jKDUyLjM3MDAwMCkgZXhwZWN0ZWQ9Ni40ODc3ODEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTcgY2FsbGluZyBmdW5jKDEyNS4wOTg3NjUpIGV4cGVjdGVkPTkuNjUzNTI0CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygxOTk5LjExMTIzMCkgZXhwZWN0ZWQ9MzMuODczNDA4CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYyg2OTQ1LjQ0MzAwMCkgZXhwZWN0ZWQ9NTkuNDEwMDc5CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz03IGNhbGxpbmcgZnVuYygxNTEyMy40NTY3MDApIGV4cGVjdGVkPTg0LjM2ODIxNgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NyBjYWxsaW5nIGZ1bmMoMTk4NDUuODg5MjMwKSBleHBlY3RlZD05NS4zNTcyNDcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTcgY2FsbGluZyBmdW5jKDk4Njc4LjQyMzEwMCkgZXhwZWN0ZWQ9MTk2LjM2NDQ3NworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9NyBjYWxsaW5nIGZ1bmMoOTk5OTkuODk5OTk4KSBleHBlY3RlZD0xOTcuNTQ0MTY3CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz04IGNhbGxpbmcgZnVuYygtMC4xMDAwMDApIGV4cGVjdGVkPS0wLjEwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OCBjYWxsaW5nIGZ1bmMoLTAuMDE4MDU0KSBleHBlY3RlZD0tMC4wMTgwNTQKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTggY2FsbGluZyBmdW5jKC0wLjAxMDAwMCkgZXhwZWN0ZWQ9LTAuMDEwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz04IGNhbGxpbmcgZnVuYygtMC4wMDQ0OTApIGV4cGVjdGVkPS0wLjAwNDQ5MAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OCBjYWxsaW5nIGZ1bmMoMC4wMDAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz04IGNhbGxpbmcgZnVuYygwLjAwMzE2MikgZXhwZWN0ZWQ9MC4wMDMxNjIKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTggY2FsbGluZyBmdW5jKDAuMDA1MDAwKSBleHBlY3RlZD0wLjAwNTAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OCBjYWxsaW5nIGZ1bmMoMC4wMDkwMDApIGV4cGVjdGVkPTAuMDA5MDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz04IGNhbGxpbmcgZnVuYygwLjAxNTAwMCkgZXhwZWN0ZWQ9MC4wMTUwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTggY2FsbGluZyBmdW5jKDAuMTAwMDAwKSBleHBlY3RlZD0wLjEwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OCBjYWxsaW5nIGZ1bmMoMS4wMDAwMDApIGV4cGVjdGVkPTEuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz04IGNhbGxpbmcgZnVuYyg1Mi4zNzAwMDApIGV4cGVjdGVkPTUyLjM3MDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OCBjYWxsaW5nIGZ1bmMoMTI1LjA5ODc2NSkgZXhwZWN0ZWQ9MTI1LjA5ODc2NQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OCBjYWxsaW5nIGZ1bmMoMTk5OS4xMTEyMzApIGV4cGVjdGVkPTE5OTkuMTExMjMwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz04IGNhbGxpbmcgZnVuYyg2OTQ1LjQ0MzAwMCkgZXhwZWN0ZWQ9Njk0NS40NDMwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTggY2FsbGluZyBmdW5jKDE1MTIzLjQ1NjcwMCkgZXhwZWN0ZWQ9MTUxMjMuNDU2NzAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz04IGNhbGxpbmcgZnVuYygxOTg0NS44ODkyMzApIGV4cGVjdGVkPTE5ODQ1Ljg4OTIzMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OCBjYWxsaW5nIGZ1bmMoOTg2NzguNDIzMTAwKSBleHBlY3RlZD05ODY3OC40MjMxMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTggY2FsbGluZyBmdW5jKDk5OTk5Ljg5OTk5OCkgZXhwZWN0ZWQ9OTk5OTkuODk5OTk4CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz05IGNhbGxpbmcgZnVuYygtMC4xMDAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz05IGNhbGxpbmcgZnVuYygtMC4wMTgwNTQpIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz05IGNhbGxpbmcgZnVuYygtMC4wMTAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz05IGNhbGxpbmcgZnVuYygtMC4wMDQ0OTApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz05IGNhbGxpbmcgZnVuYygwLjAwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTkgY2FsbGluZyBmdW5jKDAuMDAzMTYyKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OSBjYWxsaW5nIGZ1bmMoMC4wMDUwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz05IGNhbGxpbmcgZnVuYygwLjAwOTAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTkgY2FsbGluZyBmdW5jKDAuMDE1MDAwKSBleHBlY3RlZD0wLjA4ODA0NgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OSBjYWxsaW5nIGZ1bmMoMC4xMDAwMDApIGV4cGVjdGVkPTAuNTAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz05IGNhbGxpbmcgZnVuYygxLjAwMDAwMCkgZXhwZWN0ZWQ9MS4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTkgY2FsbGluZyBmdW5jKDUyLjM3MDAwMCkgZXhwZWN0ZWQ9MS44NTk1NDEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTkgY2FsbGluZyBmdW5jKDEyNS4wOTg3NjUpIGV4cGVjdGVkPTIuMDQ4NjI3CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz05IGNhbGxpbmcgZnVuYygxOTk5LjExMTIzMCkgZXhwZWN0ZWQ9Mi42NTA0MTgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTkgY2FsbGluZyBmdW5jKDY5NDUuNDQzMDAwKSBleHBlY3RlZD0yLjkyMDg1MAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OSBjYWxsaW5nIGZ1bmMoMTUxMjMuNDU2NzAwKSBleHBlY3RlZD0zLjA4OTgyNgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OSBjYWxsaW5nIGZ1bmMoMTk4NDUuODg5MjMwKSBleHBlY3RlZD0zLjE0ODgzNQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OSBjYWxsaW5nIGZ1bmMoOTg2NzguNDIzMTAwKSBleHBlY3RlZD0zLjQ5NzExMQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9OSBjYWxsaW5nIGZ1bmMoOTk5OTkuODk5OTk4KSBleHBlY3RlZD0zLjUwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTAgY2FsbGluZyBmdW5jKC0wLjEwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygtMC4wMTgwNTQpIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMCBjYWxsaW5nIGZ1bmMoLTAuMDEwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTAgY2FsbGluZyBmdW5jKC0wLjAwNDQ5MCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygwLjAwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygwLjAwMzE2MikgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygwLjAwNTAwMCkgZXhwZWN0ZWQ9MC4wNzk1ODgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygwLjAwOTAwMCkgZXhwZWN0ZWQ9MC4xODE2OTcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygwLjAxNTAwMCkgZXhwZWN0ZWQ9MC4yNzA0MzcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygwLjEwMDAwMCkgZXhwZWN0ZWQ9MC42MDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygxLjAwMDAwMCkgZXhwZWN0ZWQ9MS4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYyg1Mi4zNzAwMDApIGV4cGVjdGVkPTEuNjg3NjMzCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMCBjYWxsaW5nIGZ1bmMoMTI1LjA5ODc2NSkgZXhwZWN0ZWQ9MS44Mzg5MDEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygxOTk5LjExMTIzMCkgZXhwZWN0ZWQ9Mi4zMjAzMzUKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYyg2OTQ1LjQ0MzAwMCkgZXhwZWN0ZWQ9Mi41MzY2ODAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYygxNTEyMy40NTY3MDApIGV4cGVjdGVkPTIuNjcxODYwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMCBjYWxsaW5nIGZ1bmMoMTk4NDUuODg5MjMwKSBleHBlY3RlZD0yLjcxOTA2OAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTAgY2FsbGluZyBmdW5jKDk4Njc4LjQyMzEwMCkgZXhwZWN0ZWQ9Mi45OTc2ODkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEwIGNhbGxpbmcgZnVuYyg5OTk5OS44OTk5OTgpIGV4cGVjdGVkPTMuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMSBjYWxsaW5nIGZ1bmMoLTAuMTAwMDAwKSBleHBlY3RlZD0tMC4yOTA3NDgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygtMC4wMTgwNTQpIGV4cGVjdGVkPS0wLjA4MTI0MworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTEgY2FsbGluZyBmdW5jKC0wLjAxMDAwMCkgZXhwZWN0ZWQ9LTAuMDQ1MDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMSBjYWxsaW5nIGZ1bmMoLTAuMDA0NDkwKSBleHBlY3RlZD0tMC4wMjAyMDUKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygwLjAwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygwLjAwMzE2MikgZXhwZWN0ZWQ9MC4wMTQyMzAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygwLjAwNTAwMCkgZXhwZWN0ZWQ9MC4wMjI1MDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygwLjAwOTAwMCkgZXhwZWN0ZWQ9MC4wNDA1MDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygwLjAxNTAwMCkgZXhwZWN0ZWQ9MC4wNjc1MDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygwLjEwMDAwMCkgZXhwZWN0ZWQ9MC4yOTA3NDgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygxLjAwMDAwMCkgZXhwZWN0ZWQ9MS4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYyg1Mi4zNzAwMDApIGV4cGVjdGVkPTYuNDI3NTMxCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMSBjYWxsaW5nIGZ1bmMoMTI1LjA5ODc2NSkgZXhwZWN0ZWQ9OS41NTg1MTcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYygxOTk5LjExMTIzMCkgZXhwZWN0ZWQ9MzMuNTEyNDkwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMSBjYWxsaW5nIGZ1bmMoNjk0NS40NDMwMDApIGV4cGVjdGVkPTU4Ljc2ODc5NAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTEgY2FsbGluZyBmdW5jKDE1MTIzLjQ1NjcwMCkgZXhwZWN0ZWQ9ODMuNDUyOTE2CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMSBjYWxsaW5nIGZ1bmMoMTk4NDUuODg5MjMwKSBleHBlY3RlZD05NC4zMjEyOTcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYyg5ODY3OC40MjMxMDApIGV4cGVjdGVkPTE5NC4yMTk1NjgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTExIGNhbGxpbmcgZnVuYyg5OTk5OS44OTk5OTgpIGV4cGVjdGVkPTE5NS4zODYzMDYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEyIGNhbGxpbmcgZnVuYygtMC4xMDAwMDApIGV4cGVjdGVkPS0wLjIwNjc4NworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKC0wLjAxODA1NCkgZXhwZWN0ZWQ9LTAuMTA5MDQ5CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMiBjYWxsaW5nIGZ1bmMoLTAuMDEwMDAwKSBleHBlY3RlZD0tMC4wODkzODcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEyIGNhbGxpbmcgZnVuYygtMC4wMDQ0OTApIGV4cGVjdGVkPS0wLjAyMDIwNQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDAuMDAwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDAuMDAzMTYyKSBleHBlY3RlZD0wLjAxNDIzMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDAuMDA1MDAwKSBleHBlY3RlZD0wLjAyMjUwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDAuMDA5MDAwKSBleHBlY3RlZD0wLjA0MDUwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDAuMDE1MDAwKSBleHBlY3RlZD0wLjA2NzUwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDAuMTAwMDAwKSBleHBlY3RlZD0wLjI5MDc0OAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDEuMDAwMDAwKSBleHBlY3RlZD0xLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDUyLjM3MDAwMCkgZXhwZWN0ZWQ9Ni40Mjc1MzEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEyIGNhbGxpbmcgZnVuYygxMjUuMDk4NzY1KSBleHBlY3RlZD05LjU1ODUxNworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDE5OTkuMTExMjMwKSBleHBlY3RlZD0zMy41MTI0OTAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEyIGNhbGxpbmcgZnVuYyg2OTQ1LjQ0MzAwMCkgZXhwZWN0ZWQ9NTguNzY4Nzk0CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMiBjYWxsaW5nIGZ1bmMoMTUxMjMuNDU2NzAwKSBleHBlY3RlZD04My40NTI5MTYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEyIGNhbGxpbmcgZnVuYygxOTg0NS44ODkyMzApIGV4cGVjdGVkPTk0LjMyMTI5NworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDk4Njc4LjQyMzEwMCkgZXhwZWN0ZWQ9MTk0LjIxOTU2OAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTIgY2FsbGluZyBmdW5jKDk5OTk5Ljg5OTk5OCkgZXhwZWN0ZWQ9MTk1LjM4NjMwNgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTMgY2FsbGluZyBmdW5jKC0wLjEwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygtMC4wMTgwNTQpIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMyBjYWxsaW5nIGZ1bmMoLTAuMDEwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTMgY2FsbGluZyBmdW5jKC0wLjAwNDQ5MCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygwLjAwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygwLjAwMzE2MikgZXhwZWN0ZWQ9MC4wNDA4NDkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygwLjAwNTAwMCkgZXhwZWN0ZWQ9MC4wNjEwMDkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygwLjAwOTAwMCkgZXhwZWN0ZWQ9MC4wOTMyMDIKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygwLjAxNTAwMCkgZXhwZWN0ZWQ9MC4xMjgzNTQKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygwLjEwMDAwMCkgZXhwZWN0ZWQ9MC4zNDkxOTAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygxLjAwMDAwMCkgZXhwZWN0ZWQ9MS4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYyg1Mi4zNzAwMDApIGV4cGVjdGVkPTUuNDM0NTUyCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMyBjYWxsaW5nIGZ1bmMoMTI1LjA5ODc2NSkgZXhwZWN0ZWQ9Ny44MzU1NjEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYygxOTk5LjExMTIzMCkgZXhwZWN0ZWQ9MjQuOTgzMDkwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMyBjYWxsaW5nIGZ1bmMoNjk0NS40NDMwMDApIGV4cGVjdGVkPTQyLjAxMzg2MworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTMgY2FsbGluZyBmdW5jKDE1MTIzLjQ1NjcwMCkgZXhwZWN0ZWQ9NTguMTI1MDAzCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xMyBjYWxsaW5nIGZ1bmMoMTk4NDUuODg5MjMwKSBleHBlY3RlZD02NS4xMDAxMTcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYyg5ODY3OC40MjMxMDApIGV4cGVjdGVkPTEyNy4wNTQ2MDcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTEzIGNhbGxpbmcgZnVuYyg5OTk5OS44OTk5OTgpIGV4cGVjdGVkPTEyNy43NjExMTUKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE0IGNhbGxpbmcgZnVuYygtMC4xMDAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoLTAuMDE4MDU0KSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTQgY2FsbGluZyBmdW5jKC0wLjAxMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE0IGNhbGxpbmcgZnVuYygtMC4wMDQ0OTApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoMC4wMDAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoMC4wMDMxNjIpIGV4cGVjdGVkPTAuMDE0MjMwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoMC4wMDUwMDApIGV4cGVjdGVkPTAuMDIyNTAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoMC4wMDkwMDApIGV4cGVjdGVkPTAuMDQwNTAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoMC4wMTUwMDApIGV4cGVjdGVkPTAuMDY3NTAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoMC4xMDAwMDApIGV4cGVjdGVkPTAuMjkwNzQ4CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoMS4wMDAwMDApIGV4cGVjdGVkPTEuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoNTIuMzcwMDAwKSBleHBlY3RlZD02LjQyNzUzMQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTQgY2FsbGluZyBmdW5jKDEyNS4wOTg3NjUpIGV4cGVjdGVkPTkuNTU4NTE3CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoMTk5OS4xMTEyMzApIGV4cGVjdGVkPTMzLjUxMjQ5MAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTQgY2FsbGluZyBmdW5jKDY5NDUuNDQzMDAwKSBleHBlY3RlZD01OC43Njg3OTQKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE0IGNhbGxpbmcgZnVuYygxNTEyMy40NTY3MDApIGV4cGVjdGVkPTgzLjQ1MjkxNgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTQgY2FsbGluZyBmdW5jKDE5ODQ1Ljg4OTIzMCkgZXhwZWN0ZWQ9OTQuMzIxMjk3CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoOTg2NzguNDIzMTAwKSBleHBlY3RlZD0xOTQuMjE5NTY4CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNCBjYWxsaW5nIGZ1bmMoOTk5OTkuODk5OTk4KSBleHBlY3RlZD0xOTUuMzg2MzA2CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNSBjYWxsaW5nIGZ1bmMoLTAuMTAwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKC0wLjAxODA1NCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE1IGNhbGxpbmcgZnVuYygtMC4wMTAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNSBjYWxsaW5nIGZ1bmMoLTAuMDA0NDkwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDAuMDAwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDAuMDAzMTYyKSBleHBlY3RlZD0wLjAxNDIzMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDAuMDA1MDAwKSBleHBlY3RlZD0wLjAyMjUwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDAuMDA5MDAwKSBleHBlY3RlZD0wLjA0MDUwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDAuMDE1MDAwKSBleHBlY3RlZD0wLjA2NzUwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDAuMTAwMDAwKSBleHBlY3RlZD0wLjI5MDc0OAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDEuMDAwMDAwKSBleHBlY3RlZD0xLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDUyLjM3MDAwMCkgZXhwZWN0ZWQ9Ni40Mjc1MzEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE1IGNhbGxpbmcgZnVuYygxMjUuMDk4NzY1KSBleHBlY3RlZD05LjU1ODUxNworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDE5OTkuMTExMjMwKSBleHBlY3RlZD0zMy41MTI0OTAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE1IGNhbGxpbmcgZnVuYyg2OTQ1LjQ0MzAwMCkgZXhwZWN0ZWQ9NTguNzY4Nzk0CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNSBjYWxsaW5nIGZ1bmMoMTUxMjMuNDU2NzAwKSBleHBlY3RlZD04My40NTI5MTYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE1IGNhbGxpbmcgZnVuYygxOTg0NS44ODkyMzApIGV4cGVjdGVkPTk0LjMyMTI5NworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDk4Njc4LjQyMzEwMCkgZXhwZWN0ZWQ9MTk0LjIxOTU2OAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTUgY2FsbGluZyBmdW5jKDk5OTk5Ljg5OTk5OCkgZXhwZWN0ZWQ9MTk1LjM4NjMwNgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTYgY2FsbGluZyBmdW5jKC0wLjEwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygtMC4wMTgwNTQpIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNiBjYWxsaW5nIGZ1bmMoLTAuMDEwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTYgY2FsbGluZyBmdW5jKC0wLjAwNDQ5MCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygwLjAwMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygwLjAwMzE2MikgZXhwZWN0ZWQ9MC4wMTE4MzkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygwLjAwNTAwMCkgZXhwZWN0ZWQ9MC4wMTUwNzYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygwLjAwOTAwMCkgZXhwZWN0ZWQ9MC4wMjAzNzkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygwLjAxNTAwMCkgZXhwZWN0ZWQ9MC4wMjYyNTUKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygwLjEwMDAwMCkgZXhwZWN0ZWQ9MC4wNjIzMzcKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygxLjAwMDAwMCkgZXhwZWN0ZWQ9MC4xNDk5NDYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYyg1Mi4zNzAwMDApIGV4cGVjdGVkPTAuNDQ0NjkzCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNiBjYWxsaW5nIGZ1bmMoMTI1LjA5ODc2NSkgZXhwZWN0ZWQ9MC41MzA3MTkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygxOTk5LjExMTIzMCkgZXhwZWN0ZWQ9MC44MjczNzYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYyg2OTQ1LjQ0MzAwMCkgZXhwZWN0ZWQ9MC45NjE1ODYKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYygxNTEyMy40NTY3MDApIGV4cGVjdGVkPTEuMDQyOTIxCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNiBjYWxsaW5nIGZ1bmMoMTk4NDUuODg5MjMwKSBleHBlY3RlZD0xLjA3MDY3NworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTYgY2FsbGluZyBmdW5jKDk4Njc4LjQyMzEwMCkgZXhwZWN0ZWQ9MS4yMjU5MDgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE2IGNhbGxpbmcgZnVuYyg5OTk5OS44OTk5OTgpIGV4cGVjdGVkPTEuMjI3MTI3CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNyBjYWxsaW5nIGZ1bmMoLTAuMTAwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKC0wLjAxODA1NCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE3IGNhbGxpbmcgZnVuYygtMC4wMTAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNyBjYWxsaW5nIGZ1bmMoLTAuMDA0NDkwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDAuMDAwMDAwKSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDAuMDAzMTYyKSBleHBlY3RlZD0wLjEwNTY1OQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDAuMDA1MDAwKSBleHBlY3RlZD0wLjEyNjAxOAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDAuMDA5MDAwKSBleHBlY3RlZD0wLjE1Nzk4NQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDAuMDE1MDAwKSBleHBlY3RlZD0wLjE5MjI4NAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDAuMTAwMDAwKSBleHBlY3RlZD0wLjM5ODg2OQorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDEuMDAwMDAwKSBleHBlY3RlZD0wLjk2NzA0MworQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDUyLjM3MDAwMCkgZXhwZWN0ZWQ9NC40MzIzMjEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE3IGNhbGxpbmcgZnVuYygxMjUuMDk4NzY1KSBleHBlY3RlZD02LjE5NTU3MgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDE5OTkuMTExMjMwKSBleHBlY3RlZD0xNy45ODg2MzkKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE3IGNhbGxpbmcgZnVuYyg2OTQ1LjQ0MzAwMCkgZXhwZWN0ZWQ9MjkuMDQxNzM0CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNyBjYWxsaW5nIGZ1bmMoMTUxMjMuNDU2NzAwKSBleHBlY3RlZD0zOS4xNzQ1MjUKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE3IGNhbGxpbmcgZnVuYygxOTg0NS44ODkyMzApIGV4cGVjdGVkPTQzLjQ5MDY0NgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTcgY2FsbGluZyBmdW5jKDk4Njc4LjQyMzEwMCkgZXhwZWN0ZWQ9ODAuNTkzNTU5CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xNyBjYWxsaW5nIGZ1bmMoOTk5OTkuODk5OTk4KSBleHBlY3RlZD04MS4wMDY5NzEKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE4IGNhbGxpbmcgZnVuYygtMC4xMDAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoLTAuMDE4MDU0KSBleHBlY3RlZD0wLjAwMDAwMAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTggY2FsbGluZyBmdW5jKC0wLjAxMDAwMCkgZXhwZWN0ZWQ9MC4wMDAwMDAKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE4IGNhbGxpbmcgZnVuYygtMC4wMDQ0OTApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMC4wMDAwMDApIGV4cGVjdGVkPTAuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMC4wMDMxNjIpIGV4cGVjdGVkPTAuMDk3NDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMC4wMDUwMDApIGV4cGVjdGVkPTAuMTIyNDc0CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMC4wMDkwMDApIGV4cGVjdGVkPTAuMTY0MzE3CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMC4wMTUwMDApIGV4cGVjdGVkPTAuMjEyMTMyCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMC4xMDAwMDApIGV4cGVjdGVkPTAuNTQ0MDg5CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMS4wMDAwMDApIGV4cGVjdGVkPTEuMDAwMDAwCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoNTIuMzcwMDAwKSBleHBlY3RlZD0xLjcxMjA5MgorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTggY2FsbGluZyBmdW5jKDEyNS4wOTg3NjUpIGV4cGVjdGVkPTEuODY3ODYyCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMTk5OS4xMTEyMzApIGV4cGVjdGVkPTIuMzYzNTAyCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoNjk0NS40NDMwMDApIGV4cGVjdGVkPTIuNTg2MjE5CitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoMTUxMjMuNDU2NzAwKSBleHBlY3RlZD0yLjcyNTM4MAorQVZDb2xvclRyYW5zZmVyQ2hhcmFjdGVyaXN0aWM9MTggY2FsbGluZyBmdW5jKDE5ODQ1Ljg4OTIzMCkgZXhwZWN0ZWQ9Mi43NzM5NzgKK0FWQ29sb3JUcmFuc2ZlckNoYXJhY3RlcmlzdGljPTE4IGNhbGxpbmcgZnVuYyg5ODY3OC40MjMxMDApIGV4cGVjdGVkPTMuMDYwODAzCitBVkNvbG9yVHJhbnNmZXJDaGFyYWN0ZXJpc3RpYz0xOCBjYWxsaW5nIGZ1bmMoOTk5OTkuODk5OTk4KSBleHBlY3RlZD0zLjA2MzE4MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY29uY2F0LWRlbXV4ZXItZXh0ZW5kZWQtbGF2Zi1teGYgYi90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1leHRlbmRlZC1sYXZmLW14ZgppbmRleCA0Y2FlYzVhLi5jNDdmMTRmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1leHRlbmRlZC1sYXZmLW14ZgorKysgYi90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1leHRlbmRlZC1sYXZmLW14ZgpAQCAtMSArMSBAQAotMzdiNGE4NGZjZTcxYjNmOGIxMjlmOGI4NjZjNWY1NWEgKnRlc3RzL2RhdGEvZmF0ZS9jb25jYXQtZGVtdXhlci1leHRlbmRlZC1sYXZmLW14Zi5mZnByb2JlCis3ZTUzZjRjNWNiMGM5YWZkYTI3NzFjOWYwYzY5N2Q5YyAqdGVzdHMvZGF0YS9mYXRlL2NvbmNhdC1kZW11eGVyLWV4dGVuZGVkLWxhdmYtbXhmLmZmcHJvYmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NvbmNhdC1kZW11eGVyLWV4dGVuZGVkLWxhdmYtbXhmX2QxMCBiL3Rlc3RzL3JlZi9mYXRlL2NvbmNhdC1kZW11eGVyLWV4dGVuZGVkLWxhdmYtbXhmX2QxMAppbmRleCAxOTY1MDUwLi43NWQzODZlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1leHRlbmRlZC1sYXZmLW14Zl9kMTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY29uY2F0LWRlbXV4ZXItZXh0ZW5kZWQtbGF2Zi1teGZfZDEwCkBAIC0xICsxIEBACi0yZjVlOTM1Zjg2MzA0Yzg0M2JlMTQ1NGIxMzU0YTRiNyAqdGVzdHMvZGF0YS9mYXRlL2NvbmNhdC1kZW11eGVyLWV4dGVuZGVkLWxhdmYtbXhmX2QxMC5mZnByb2JlCis0NDgxMGZjMmVlZWUwMDcyZDlkNzAxMWIwZDJhZmU1OSAqdGVzdHMvZGF0YS9mYXRlL2NvbmNhdC1kZW11eGVyLWV4dGVuZGVkLWxhdmYtbXhmX2QxMC5mZnByb2JlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1zaW1wbGUxLWxhdmYtbXhmIGIvdGVzdHMvcmVmL2ZhdGUvY29uY2F0LWRlbXV4ZXItc2ltcGxlMS1sYXZmLW14ZgppbmRleCBjMjhkYjI4Li4xMTc0YTFlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1zaW1wbGUxLWxhdmYtbXhmCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2NvbmNhdC1kZW11eGVyLXNpbXBsZTEtbGF2Zi1teGYKQEAgLTEsMTI0ICsxLDEyNCBAQAotdmlkZW98MHwwfDAuMDAwMDAwfC0xfC0wLjA0MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MjQ4MDF8NjE0NHxLCi1hdWRpb3wxfDB8MC4wMDAwMDB8MHwwLjAwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwzMTIzMnxLCi12aWRlb3wwfDN8MC4xMjAwMDB8MHwwLjAwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTY3NDN8MzU4NDB8XwotYXVkaW98MXwxOTIwfDAuMDQwMDAwfDE5MjB8MC4wNDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NTI3MzZ8SwotdmlkZW98MHwxfDAuMDQwMDAwfDF8MC4wNDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEzODEyfDU3MzQ0fF8KLWF1ZGlvfDF8Mzg0MHwwLjA4MDAwMHwzODQwfDAuMDgwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDcxNjgwfEsKLXZpZGVvfDB8MnwwLjA4MDAwMHwyfDAuMDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMzYwN3w3NjI4OHxfCi1hdWRpb3wxfDU3NjB8MC4xMjAwMDB8NTc2MHwwLjEyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHw5MDExMnxLCi12aWRlb3wwfDZ8MC4yNDAwMDB8M3wwLjEyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTYxNTh8OTQ3MjB8XwotYXVkaW98MXw3NjgwfDAuMTYwMDAwfDc2ODB8MC4xNjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MTExMTA0fEsKLXZpZGVvfDB8NHwwLjE2MDAwMHw0fDAuMTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMzk0M3wxMTU3MTJ8XwotYXVkaW98MXw5NjAwfDAuMjAwMDAwfDk2MDB8MC4yMDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MTMwMDQ4fEsKLXZpZGVvfDB8NXwwLjIwMDAwMHw1fDAuMjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMTIyM3wxMzQ2NTZ8XwotYXVkaW98MXwxMTUyMHwwLjI0MDAwMHwxMTUyMHwwLjI0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxNDU5MjB8SwotdmlkZW98MHw5fDAuMzYwMDAwfDZ8MC4yNDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDIwMjk4fDE1MDUyOHxfCi1hdWRpb3wxfDEzNDQwfDAuMjgwMDAwfDEzNDQwfDAuMjgwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDE3MTAwOHxLCi12aWRlb3wwfDd8MC4yODAwMDB8N3wwLjI4MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTMzNDF8MTc1NjE2fF8KLWF1ZGlvfDF8MTUzNjB8MC4zMjAwMDB8MTUzNjB8MC4zMjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MTg5NDQwfEsKLXZpZGVvfDB8OHwwLjMyMDAwMHw4fDAuMzIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMjM2MnwxOTQwNDh8XwotYXVkaW98MXwxNzI4MHwwLjM2MDAwMHwxNzI4MHwwLjM2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwyMDY4NDh8SwotdmlkZW98MHwxMnwwLjQ4MDAwMHw5fDAuMzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDc4NnwyMTE0NTZ8SwotYXVkaW98MXwxOTIwMHwwLjQwMDAwMHwxOTIwMHwwLjQwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwyMzY1NDR8SwotdmlkZW98MHwxMHwwLjQwMDAwMHwxMHwwLjQwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTMzNzd8MjQxMTUyfF8KLWF1ZGlvfDF8MjExMjB8MC40NDAwMDB8MjExMjB8MC40NDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MjU0OTc2fEsKLXZpZGVvfDB8MTF8MC40NDAwMDB8MTF8MC40NDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1NjI0fDI1OTU4NHxfCi1hdWRpb3wxfDIzMDQwfDAuNDgwMDAwfDIzMDQwfDAuNDgwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDI3NTQ1NnxLCi12aWRlb3wwfDE1fDAuNjAwMDAwfDEyfDAuNDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMjU5N3wyODAwNjR8XwotYXVkaW98MXwyNDk2MHwwLjUyMDAwMHwyNDk2MHwwLjUyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwzMDMxMDR8SwotdmlkZW98MHwxM3wwLjUyMDAwMHwxM3wwLjUyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMjh8MzA3NzEyfF8KLWF1ZGlvfDF8MjY4ODB8MC41NjAwMDB8MjY4ODB8MC41NjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzIzMDcyfEsKLXZpZGVvfDB8MTR8MC41NjAwMDB8MTR8MC41NjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE0MDE0fDMyNzY4MHxfCi1hdWRpb3wxfDI4ODAwfDAuNjAwMDAwfDI4ODAwfDAuNjAwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDM0MjAxNnxLCi12aWRlb3wwfDE4fDAuNzIwMDAwfDE1fDAuNjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMDczMXwzNDY2MjR8XwotYXVkaW98MXwzMDcyMHwwLjY0MDAwMHwzMDcyMHwwLjY0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwzNjc2MTZ8SwotdmlkZW98MHwxNnwwLjY0MDAwMHwxNnwwLjY0MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTE5NDZ8MzcyMjI0fF8KLWF1ZGlvfDF8MzI2NDB8MC42ODAwMDB8MzI2NDB8MC42ODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8Mzg0NTEyfEsKLXZpZGVvfDB8MTd8MC42ODAwMDB8MTd8MC42ODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE0NDY0fDM4OTEyMHxfCi1hdWRpb3wxfDM0NTYwfDAuNzIwMDAwfDM0NTYwfDAuNzIwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDQwMzk2OHxLCi12aWRlb3wwfDIxfDAuODQwMDAwfDE4fDAuNzIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNjE4OXw0MDg1NzZ8XwotYXVkaW98MXwzNjQ4MHwwLjc2MDAwMHwzNjQ4MHwwLjc2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHw0MjQ5NjB8SwotdmlkZW98MHwxOXwwLjc2MDAwMHwxOXwwLjc2MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTA1MjR8NDI5NTY4fF8KLWF1ZGlvfDF8Mzg0MDB8MC44MDAwMDB8Mzg0MDB8MC44MDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDQwMzIwfEsKLXZpZGVvfDB8MjB8MC44MDAwMDB8MjB8MC44MDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEwNTk5fDQ0NDkyOHxfCi1hdWRpb3wxfDQwMzIwfDAuODQwMDAwfDQwMzIwfDAuODQwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDQ1NTY4MHxLCi12aWRlb3wwfDI0fDAuOTYwMDAwfDIxfDAuODQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDcxMXw0NjAyODh8SwotYXVkaW98MXw0MjI0MHwwLjg4MDAwMHw0MjI0MHwwLjg4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHw0ODUzNzZ8SwotdmlkZW98MHwyMnwwLjg4MDAwMHwyMnwwLjg4MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTA4NDB8NDg5OTg0fF8KLWF1ZGlvfDF8NDQxNjB8MC45MjAwMDB8NDQxNjB8MC45MjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NTAxMjQ4fEsKLXZpZGVvfDB8MjN8MC45MjAwMDB8MjN8MC45MjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEzMzUwfDUwNTg1NnxfCi1hdWRpb3wxfDQ2MDgwfDAuOTYwMDAwfDQ2MDgwfDAuOTYwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDUxOTY4MHxLCi12aWRlb3wwfDE3fDAuNjgwMDAwfDE0fDAuNTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDc4NnwyMTE0NTZ8SwotYXVkaW98MXwyODgwMHwwLjYwMDAwMHwyODgwMHwwLjYwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwyMzY1NDR8SwotdmlkZW98MHwxNXwwLjYwMDAwMHwxNXwwLjYwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTMzNzd8MjQxMTUyfF8KLWF1ZGlvfDF8MzA3MjB8MC42NDAwMDB8MzA3MjB8MC42NDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MjU0OTc2fEsKLXZpZGVvfDB8MTZ8MC42NDAwMDB8MTZ8MC42NDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1NjI0fDI1OTU4NHxfCi1hdWRpb3wxfDMyNjQwfDAuNjgwMDAwfDMyNjQwfDAuNjgwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDI3NTQ1NnxLCi12aWRlb3wwfDIwfDAuODAwMDAwfDE3fDAuNjgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMjU5N3wyODAwNjR8XwotYXVkaW98MXwzNDU2MHwwLjcyMDAwMHwzNDU2MHwwLjcyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwzMDMxMDR8SwotdmlkZW98MHwxOHwwLjcyMDAwMHwxOHwwLjcyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMjh8MzA3NzEyfF8KLWF1ZGlvfDF8MzY0ODB8MC43NjAwMDB8MzY0ODB8MC43NjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzIzMDcyfEsKLXZpZGVvfDB8MTl8MC43NjAwMDB8MTl8MC43NjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE0MDE0fDMyNzY4MHxfCi1hdWRpb3wxfDM4NDAwfDAuODAwMDAwfDM4NDAwfDAuODAwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDM0MjAxNnxLCi12aWRlb3wwfDIzfDAuOTIwMDAwfDIwfDAuODAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMDczMXwzNDY2MjR8XwotYXVkaW98MXw0MDMyMHwwLjg0MDAwMHw0MDMyMHwwLjg0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwzNjc2MTZ8SwotdmlkZW98MHwyMXwwLjg0MDAwMHwyMXwwLjg0MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTE5NDZ8MzcyMjI0fF8KLWF1ZGlvfDF8NDIyNDB8MC44ODAwMDB8NDIyNDB8MC44ODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8Mzg0NTEyfEsKLXZpZGVvfDB8MjJ8MC44ODAwMDB8MjJ8MC44ODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE0NDY0fDM4OTEyMHxfCi1hdWRpb3wxfDQ0MTYwfDAuOTIwMDAwfDQ0MTYwfDAuOTIwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDQwMzk2OHxLCi12aWRlb3wwfDI2fDEuMDQwMDAwfDIzfDAuOTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNjE4OXw0MDg1NzZ8XwotYXVkaW98MXw0NjA4MHwwLjk2MDAwMHw0NjA4MHwwLjk2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHw0MjQ5NjB8SwotdmlkZW98MHwyNHwwLjk2MDAwMHwyNHwwLjk2MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTA1MjR8NDI5NTY4fF8KLWF1ZGlvfDF8NDgwMDB8MS4wMDAwMDB8NDgwMDB8MS4wMDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDQwMzIwfEsKLXZpZGVvfDB8MjV8MS4wMDAwMDB8MjV8MS4wMDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEwNTk5fDQ0NDkyOHxfCi1hdWRpb3wxfDQ5OTIwfDEuMDQwMDAwfDQ5OTIwfDEuMDQwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDQ1NTY4MHxLCi12aWRlb3wwfDI5fDEuMTYwMDAwfDI2fDEuMDQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDcxMXw0NjAyODh8SwotYXVkaW98MXw1MTg0MHwxLjA4MDAwMHw1MTg0MHwxLjA4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHw0ODUzNzZ8SwotdmlkZW98MHwyN3wxLjA4MDAwMHwyN3wxLjA4MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTA4NDB8NDg5OTg0fF8KLWF1ZGlvfDF8NTM3NjB8MS4xMjAwMDB8NTM3NjB8MS4xMjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NTAxMjQ4fEsKLXZpZGVvfDB8Mjh8MS4xMjAwMDB8Mjh8MS4xMjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEzMzUwfDUwNTg1NnxfCi1hdWRpb3wxfDU1NjgwfDEuMTYwMDAwfDU1NjgwfDEuMTYwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDUxOTY4MHxLCi12aWRlb3wwfDI1fDEuMDAwMDAwfDI0fDAuOTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDgwMXw2MTQ0fEt8MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci1hdWRpb3wxfDQ4MDAwfDEuMDAwMDAwfDQ4MDAwfDEuMDAwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDMxMjMyfEt8MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci12aWRlb3wwfDI4fDEuMTIwMDAwfDI1fDEuMDAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNjc0M3wzNTg0MHxffDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw0OTkyMHwxLjA0MDAwMHw0OTkyMHwxLjA0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHw1MjczNnxLfDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotdmlkZW98MHwyNnwxLjA0MDAwMHwyNnwxLjA0MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTM4MTJ8NTczNDR8X3wxCi1TdHJpbmdzIE1ldGFkYXRhfDgKLWF1ZGlvfDF8NTE4NDB8MS4wODAwMDB8NTE4NDB8MS4wODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NzE2ODB8S3wxCi1TdHJpbmdzIE1ldGFkYXRhfDgKLXZpZGVvfDB8Mjd8MS4wODAwMDB8Mjd8MS4wODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEzNjA3fDc2Mjg4fF98MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci1hdWRpb3wxfDUzNzYwfDEuMTIwMDAwfDUzNzYwfDEuMTIwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDkwMTEyfEt8MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci12aWRlb3wwfDMxfDEuMjQwMDAwfDI4fDEuMTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNjE1OHw5NDcyMHxffDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw1NTY4MHwxLjE2MDAwMHw1NTY4MHwxLjE2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxMTExMDR8S3wxCi1TdHJpbmdzIE1ldGFkYXRhfDgKLXZpZGVvfDB8Mjl8MS4xNjAwMDB8Mjl8MS4xNjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEzOTQzfDExNTcxMnxffDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw1NzYwMHwxLjIwMDAwMHw1NzYwMHwxLjIwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxMzAwNDh8S3wxCi1TdHJpbmdzIE1ldGFkYXRhfDgKLXZpZGVvfDB8MzB8MS4yMDAwMDB8MzB8MS4yMDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDExMjIzfDEzNDY1NnxffDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw1OTUyMHwxLjI0MDAwMHw1OTUyMHwxLjI0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxNDU5MjB8S3wxCi1TdHJpbmdzIE1ldGFkYXRhfDgKLXZpZGVvfDB8MzR8MS4zNjAwMDB8MzF8MS4yNDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDIwMjk4fDE1MDUyOHxffDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw2MTQ0MHwxLjI4MDAwMHw2MTQ0MHwxLjI4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxNzEwMDh8S3wxCi1TdHJpbmdzIE1ldGFkYXRhfDgKLXZpZGVvfDB8MzJ8MS4yODAwMDB8MzJ8MS4yODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEzMzQxfDE3NTYxNnxffDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw2MzM2MHwxLjMyMDAwMHw2MzM2MHwxLjMyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxODk0NDB8S3wxCi1TdHJpbmdzIE1ldGFkYXRhfDgKLXZpZGVvfDB8MzN8MS4zMjAwMDB8MzN8MS4zMjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEyMzYyfDE5NDA0OHxffDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw2NTI4MHwxLjM2MDAwMHw2NTI4MHwxLjM2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwyMDY4NDh8S3wxCi1TdHJpbmdzIE1ldGFkYXRhfDgKLXZpZGVvfDB8Mzd8MS40ODAwMDB8MzR8MS4zNjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDI0Nzg2fDIxMTQ1NnxLfDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotMHxtcGVnMnZpZGVvfDR8dmlkZW98MS81MHxbMF1bMF1bMF1bMF18MHgwMDAwfDM1MnwyODh8MHwwfDF8MToxfDExOjl8eXV2NDIwcHw4fHR2fHVua25vd258dW5rbm93bnx1bmtub3dufGxlZnR8MDA6MDA6MDA6MDB8MXxOL0F8MjUvMXwyNS8xfDEvMjV8Ti9BfE4vQXxOL0F8Ti9BfE4vQXwxMDQ4NTcyMDB8Ti9BfE4vQXxOL0F8NTF8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB4MDYwQTJCMzQwMTAxMDEwNTAxMDEwRDAwMTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQotMXxwY21fczE2bGV8dW5rbm93bnxhdWRpb3wxLzQ4MDAwfFswXVswXVswXVswXXwweDAwMDB8czE2fDQ4MDAwfDF8dW5rbm93bnwxNnxOL0F8MC8wfDAvMHwxLzQ4MDAwfDB8MC4wMDAwMDB8Ti9BfE4vQXw3NjgwMDB8Ti9BfE4vQXxOL0F8Ti9BfDUwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwweDA2MEEyQjM0MDEwMTAxMDUwMTAxMEQwMDEzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK3ZpZGVvfDB8MHwwLjAwMDAwMHwtMXwtMC4wNDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDI0ODAxfDYxNDR8S18KK2F1ZGlvfDF8MHwwLjAwMDAwMHwwfDAuMDAwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDMxMjMyfEtfCit2aWRlb3wwfDN8MC4xMjAwMDB8MHwwLjAwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTY3NDN8MzU4NDB8X18KK2F1ZGlvfDF8MTkyMHwwLjA0MDAwMHwxOTIwfDAuMDQwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDUyNzM2fEtfCit2aWRlb3wwfDF8MC4wNDAwMDB8MXwwLjA0MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTM4MTJ8NTczNDR8X18KK2F1ZGlvfDF8Mzg0MHwwLjA4MDAwMHwzODQwfDAuMDgwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDcxNjgwfEtfCit2aWRlb3wwfDJ8MC4wODAwMDB8MnwwLjA4MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTM2MDd8NzYyODh8X18KK2F1ZGlvfDF8NTc2MHwwLjEyMDAwMHw1NzYwfDAuMTIwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDkwMTEyfEtfCit2aWRlb3wwfDZ8MC4yNDAwMDB8M3wwLjEyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTYxNTh8OTQ3MjB8X18KK2F1ZGlvfDF8NzY4MHwwLjE2MDAwMHw3NjgwfDAuMTYwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDExMTEwNHxLXwordmlkZW98MHw0fDAuMTYwMDAwfDR8MC4xNjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEzOTQzfDExNTcxMnxfXworYXVkaW98MXw5NjAwfDAuMjAwMDAwfDk2MDB8MC4yMDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MTMwMDQ4fEtfCit2aWRlb3wwfDV8MC4yMDAwMDB8NXwwLjIwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTEyMjN8MTM0NjU2fF9fCithdWRpb3wxfDExNTIwfDAuMjQwMDAwfDExNTIwfDAuMjQwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDE0NTkyMHxLXwordmlkZW98MHw5fDAuMzYwMDAwfDZ8MC4yNDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDIwMjk4fDE1MDUyOHxfXworYXVkaW98MXwxMzQ0MHwwLjI4MDAwMHwxMzQ0MHwwLjI4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxNzEwMDh8S18KK3ZpZGVvfDB8N3wwLjI4MDAwMHw3fDAuMjgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMzM0MXwxNzU2MTZ8X18KK2F1ZGlvfDF8MTUzNjB8MC4zMjAwMDB8MTUzNjB8MC4zMjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MTg5NDQwfEtfCit2aWRlb3wwfDh8MC4zMjAwMDB8OHwwLjMyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTIzNjJ8MTk0MDQ4fF9fCithdWRpb3wxfDE3MjgwfDAuMzYwMDAwfDE3MjgwfDAuMzYwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDIwNjg0OHxLXwordmlkZW98MHwxMnwwLjQ4MDAwMHw5fDAuMzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDc4NnwyMTE0NTZ8S18KK2F1ZGlvfDF8MTkyMDB8MC40MDAwMDB8MTkyMDB8MC40MDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MjM2NTQ0fEtfCit2aWRlb3wwfDEwfDAuNDAwMDAwfDEwfDAuNDAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMzM3N3wyNDExNTJ8X18KK2F1ZGlvfDF8MjExMjB8MC40NDAwMDB8MjExMjB8MC40NDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MjU0OTc2fEtfCit2aWRlb3wwfDExfDAuNDQwMDAwfDExfDAuNDQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTYyNHwyNTk1ODR8X18KK2F1ZGlvfDF8MjMwNDB8MC40ODAwMDB8MjMwNDB8MC40ODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8Mjc1NDU2fEtfCit2aWRlb3wwfDE1fDAuNjAwMDAwfDEyfDAuNDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMjU5N3wyODAwNjR8X18KK2F1ZGlvfDF8MjQ5NjB8MC41MjAwMDB8MjQ5NjB8MC41MjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzAzMTA0fEtfCit2aWRlb3wwfDEzfDAuNTIwMDAwfDEzfDAuNTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAyOHwzMDc3MTJ8X18KK2F1ZGlvfDF8MjY4ODB8MC41NjAwMDB8MjY4ODB8MC41NjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzIzMDcyfEtfCit2aWRlb3wwfDE0fDAuNTYwMDAwfDE0fDAuNTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNDAxNHwzMjc2ODB8X18KK2F1ZGlvfDF8Mjg4MDB8MC42MDAwMDB8Mjg4MDB8MC42MDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzQyMDE2fEtfCit2aWRlb3wwfDE4fDAuNzIwMDAwfDE1fDAuNjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMDczMXwzNDY2MjR8X18KK2F1ZGlvfDF8MzA3MjB8MC42NDAwMDB8MzA3MjB8MC42NDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzY3NjE2fEtfCit2aWRlb3wwfDE2fDAuNjQwMDAwfDE2fDAuNjQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMTk0NnwzNzIyMjR8X18KK2F1ZGlvfDF8MzI2NDB8MC42ODAwMDB8MzI2NDB8MC42ODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8Mzg0NTEyfEtfCit2aWRlb3wwfDE3fDAuNjgwMDAwfDE3fDAuNjgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNDQ2NHwzODkxMjB8X18KK2F1ZGlvfDF8MzQ1NjB8MC43MjAwMDB8MzQ1NjB8MC43MjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDAzOTY4fEtfCit2aWRlb3wwfDIxfDAuODQwMDAwfDE4fDAuNzIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNjE4OXw0MDg1NzZ8X18KK2F1ZGlvfDF8MzY0ODB8MC43NjAwMDB8MzY0ODB8MC43NjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDI0OTYwfEtfCit2aWRlb3wwfDE5fDAuNzYwMDAwfDE5fDAuNzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMDUyNHw0Mjk1Njh8X18KK2F1ZGlvfDF8Mzg0MDB8MC44MDAwMDB8Mzg0MDB8MC44MDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDQwMzIwfEtfCit2aWRlb3wwfDIwfDAuODAwMDAwfDIwfDAuODAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMDU5OXw0NDQ5Mjh8X18KK2F1ZGlvfDF8NDAzMjB8MC44NDAwMDB8NDAzMjB8MC44NDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDU1NjgwfEtfCit2aWRlb3wwfDI0fDAuOTYwMDAwfDIxfDAuODQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDcxMXw0NjAyODh8S18KK2F1ZGlvfDF8NDIyNDB8MC44ODAwMDB8NDIyNDB8MC44ODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDg1Mzc2fEtfCit2aWRlb3wwfDIyfDAuODgwMDAwfDIyfDAuODgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMDg0MHw0ODk5ODR8X18KK2F1ZGlvfDF8NDQxNjB8MC45MjAwMDB8NDQxNjB8MC45MjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NTAxMjQ4fEtfCit2aWRlb3wwfDIzfDAuOTIwMDAwfDIzfDAuOTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMzM1MHw1MDU4NTZ8X18KK2F1ZGlvfDF8NDYwODB8MC45NjAwMDB8NDYwODB8MC45NjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NTE5NjgwfEtfCit2aWRlb3wwfDE3fDAuNjgwMDAwfDE0fDAuNTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDc4NnwyMTE0NTZ8S18KK2F1ZGlvfDF8Mjg4MDB8MC42MDAwMDB8Mjg4MDB8MC42MDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MjM2NTQ0fEtfCit2aWRlb3wwfDE1fDAuNjAwMDAwfDE1fDAuNjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMzM3N3wyNDExNTJ8X18KK2F1ZGlvfDF8MzA3MjB8MC42NDAwMDB8MzA3MjB8MC42NDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MjU0OTc2fEtfCit2aWRlb3wwfDE2fDAuNjQwMDAwfDE2fDAuNjQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTYyNHwyNTk1ODR8X18KK2F1ZGlvfDF8MzI2NDB8MC42ODAwMDB8MzI2NDB8MC42ODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8Mjc1NDU2fEtfCit2aWRlb3wwfDIwfDAuODAwMDAwfDE3fDAuNjgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMjU5N3wyODAwNjR8X18KK2F1ZGlvfDF8MzQ1NjB8MC43MjAwMDB8MzQ1NjB8MC43MjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzAzMTA0fEtfCit2aWRlb3wwfDE4fDAuNzIwMDAwfDE4fDAuNzIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAyOHwzMDc3MTJ8X18KK2F1ZGlvfDF8MzY0ODB8MC43NjAwMDB8MzY0ODB8MC43NjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzIzMDcyfEtfCit2aWRlb3wwfDE5fDAuNzYwMDAwfDE5fDAuNzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNDAxNHwzMjc2ODB8X18KK2F1ZGlvfDF8Mzg0MDB8MC44MDAwMDB8Mzg0MDB8MC44MDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzQyMDE2fEtfCit2aWRlb3wwfDIzfDAuOTIwMDAwfDIwfDAuODAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMDczMXwzNDY2MjR8X18KK2F1ZGlvfDF8NDAzMjB8MC44NDAwMDB8NDAzMjB8MC44NDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzY3NjE2fEtfCit2aWRlb3wwfDIxfDAuODQwMDAwfDIxfDAuODQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMTk0NnwzNzIyMjR8X18KK2F1ZGlvfDF8NDIyNDB8MC44ODAwMDB8NDIyNDB8MC44ODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8Mzg0NTEyfEtfCit2aWRlb3wwfDIyfDAuODgwMDAwfDIyfDAuODgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNDQ2NHwzODkxMjB8X18KK2F1ZGlvfDF8NDQxNjB8MC45MjAwMDB8NDQxNjB8MC45MjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDAzOTY4fEtfCit2aWRlb3wwfDI2fDEuMDQwMDAwfDIzfDAuOTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNjE4OXw0MDg1NzZ8X18KK2F1ZGlvfDF8NDYwODB8MC45NjAwMDB8NDYwODB8MC45NjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDI0OTYwfEtfCit2aWRlb3wwfDI0fDAuOTYwMDAwfDI0fDAuOTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMDUyNHw0Mjk1Njh8X18KK2F1ZGlvfDF8NDgwMDB8MS4wMDAwMDB8NDgwMDB8MS4wMDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDQwMzIwfEtfCit2aWRlb3wwfDI1fDEuMDAwMDAwfDI1fDEuMDAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMDU5OXw0NDQ5Mjh8X18KK2F1ZGlvfDF8NDk5MjB8MS4wNDAwMDB8NDk5MjB8MS4wNDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDU1NjgwfEtfCit2aWRlb3wwfDI5fDEuMTYwMDAwfDI2fDEuMDQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDcxMXw0NjAyODh8S18KK2F1ZGlvfDF8NTE4NDB8MS4wODAwMDB8NTE4NDB8MS4wODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NDg1Mzc2fEtfCit2aWRlb3wwfDI3fDEuMDgwMDAwfDI3fDEuMDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMDg0MHw0ODk5ODR8X18KK2F1ZGlvfDF8NTM3NjB8MS4xMjAwMDB8NTM3NjB8MS4xMjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NTAxMjQ4fEtfCit2aWRlb3wwfDI4fDEuMTIwMDAwfDI4fDEuMTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMzM1MHw1MDU4NTZ8X18KK2F1ZGlvfDF8NTU2ODB8MS4xNjAwMDB8NTU2ODB8MS4xNjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8NTE5NjgwfEtfCit2aWRlb3wwfDI1fDEuMDAwMDAwfDI0fDAuOTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDgwMXw2MTQ0fEtffDEKK1N0cmluZ3MgTWV0YWRhdGEKK2F1ZGlvfDF8NDgwMDB8MS4wMDAwMDB8NDgwMDB8MS4wMDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MzEyMzJ8S198MQorU3RyaW5ncyBNZXRhZGF0YQordmlkZW98MHwyOHwxLjEyMDAwMHwyNXwxLjAwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTY3NDN8MzU4NDB8X198MQorU3RyaW5ncyBNZXRhZGF0YQorYXVkaW98MXw0OTkyMHwxLjA0MDAwMHw0OTkyMHwxLjA0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHw1MjczNnxLX3wxCitTdHJpbmdzIE1ldGFkYXRhCit2aWRlb3wwfDI2fDEuMDQwMDAwfDI2fDEuMDQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxMzgxMnw1NzM0NHxfX3wxCitTdHJpbmdzIE1ldGFkYXRhCithdWRpb3wxfDUxODQwfDEuMDgwMDAwfDUxODQwfDEuMDgwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDcxNjgwfEtffDEKK1N0cmluZ3MgTWV0YWRhdGEKK3ZpZGVvfDB8Mjd8MS4wODAwMDB8Mjd8MS4wODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEzNjA3fDc2Mjg4fF9ffDEKK1N0cmluZ3MgTWV0YWRhdGEKK2F1ZGlvfDF8NTM3NjB8MS4xMjAwMDB8NTM3NjB8MS4xMjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8OTAxMTJ8S198MQorU3RyaW5ncyBNZXRhZGF0YQordmlkZW98MHwzMXwxLjI0MDAwMHwyOHwxLjEyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTYxNTh8OTQ3MjB8X198MQorU3RyaW5ncyBNZXRhZGF0YQorYXVkaW98MXw1NTY4MHwxLjE2MDAwMHw1NTY4MHwxLjE2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxMTExMDR8S198MQorU3RyaW5ncyBNZXRhZGF0YQordmlkZW98MHwyOXwxLjE2MDAwMHwyOXwxLjE2MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTM5NDN8MTE1NzEyfF9ffDEKK1N0cmluZ3MgTWV0YWRhdGEKK2F1ZGlvfDF8NTc2MDB8MS4yMDAwMDB8NTc2MDB8MS4yMDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MTMwMDQ4fEtffDEKK1N0cmluZ3MgTWV0YWRhdGEKK3ZpZGVvfDB8MzB8MS4yMDAwMDB8MzB8MS4yMDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDExMjIzfDEzNDY1NnxfX3wxCitTdHJpbmdzIE1ldGFkYXRhCithdWRpb3wxfDU5NTIwfDEuMjQwMDAwfDU5NTIwfDEuMjQwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDE0NTkyMHxLX3wxCitTdHJpbmdzIE1ldGFkYXRhCit2aWRlb3wwfDM0fDEuMzYwMDAwfDMxfDEuMjQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyMDI5OHwxNTA1Mjh8X198MQorU3RyaW5ncyBNZXRhZGF0YQorYXVkaW98MXw2MTQ0MHwxLjI4MDAwMHw2MTQ0MHwxLjI4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8Mzg0MHwxNzEwMDh8S198MQorU3RyaW5ncyBNZXRhZGF0YQordmlkZW98MHwzMnwxLjI4MDAwMHwzMnwxLjI4MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTMzNDF8MTc1NjE2fF9ffDEKK1N0cmluZ3MgTWV0YWRhdGEKK2F1ZGlvfDF8NjMzNjB8MS4zMjAwMDB8NjMzNjB8MS4zMjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDM4NDB8MTg5NDQwfEtffDEKK1N0cmluZ3MgTWV0YWRhdGEKK3ZpZGVvfDB8MzN8MS4zMjAwMDB8MzN8MS4zMjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDEyMzYyfDE5NDA0OHxfX3wxCitTdHJpbmdzIE1ldGFkYXRhCithdWRpb3wxfDY1MjgwfDEuMzYwMDAwfDY1MjgwfDEuMzYwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXwzODQwfDIwNjg0OHxLX3wxCitTdHJpbmdzIE1ldGFkYXRhCit2aWRlb3wwfDM3fDEuNDgwMDAwfDM0fDEuMzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwyNDc4NnwyMTE0NTZ8S198MQorU3RyaW5ncyBNZXRhZGF0YQorMHxtcGVnMnZpZGVvfDR8dmlkZW98MS8yNXxbMF1bMF1bMF1bMF18MHgwMDAwfDM1MnwyODh8MHwwfDF8MToxfDExOjl8eXV2NDIwcHw4fHR2fHVua25vd258dW5rbm93bnx1bmtub3dufGxlZnR8cHJvZ3Jlc3NpdmV8Ti9BfDF8Ti9BfDI1LzF8MjUvMXwxLzI1fE4vQXxOL0F8Ti9BfE4vQXxOL0F8Ti9BfE4vQXxOL0F8Ti9BfDUxfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB4MDYwQTJCMzQwMTAxMDEwNTAxMDEwRDAwMTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorMXxwY21fczE2bGV8dW5rbm93bnxhdWRpb3wxLzQ4MDAwfFswXVswXVswXVswXXwweDAwMDB8czE2fDQ4MDAwfDF8dW5rbm93bnwxNnxOL0F8MC8wfDAvMHwxLzQ4MDAwfDB8MC4wMDAwMDB8Ti9BfE4vQXw3NjgwMDB8Ti9BfE4vQXxOL0F8Ti9BfDUwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB4MDYwQTJCMzQwMTAxMDEwNTAxMDEwRDAwMTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY29uY2F0LWRlbXV4ZXItc2ltcGxlMS1sYXZmLW14Zl9kMTAgYi90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1zaW1wbGUxLWxhdmYtbXhmX2QxMAppbmRleCAzYjZlM2ZlLi5iZDBlNWUyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1zaW1wbGUxLWxhdmYtbXhmX2QxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1zaW1wbGUxLWxhdmYtbXhmX2QxMApAQCAtMSw4MiArMSw4MiBAQAotdmlkZW98MHwwfDAuMDAwMDAwfDB8MC4wMDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHw2MTQ0fEsKLWF1ZGlvfDF8MHwwLjAwMDAwMHwwfDAuMDAwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDE1NjY3MnxLCi12aWRlb3wwfDF8MC4wNDAwMDB8MXwwLjA0MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDIxOTEzNnxLCi1hdWRpb3wxfDE5MjB8MC4wNDAwMDB8MTkyMHwwLjA0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwzNjk2NjR8SwotdmlkZW98MHwyfDAuMDgwMDAwfDJ8MC4wODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHw0MzIxMjh8SwotYXVkaW98MXwzODQwfDAuMDgwMDAwfDM4NDB8MC4wODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8NTgyNjU2fEsKLXZpZGVvfDB8M3wwLjEyMDAwMHwzfDAuMTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NjQ1MTIwfEsKLWF1ZGlvfDF8NTc2MHwwLjEyMDAwMHw1NzYwfDAuMTIwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDc5NTY0OHxLCi12aWRlb3wwfDR8MC4xNjAwMDB8NHwwLjE2MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDg1ODExMnxLCi1hdWRpb3wxfDc2ODB8MC4xNjAwMDB8NzY4MHwwLjE2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxMDA4NjQwfEsKLXZpZGVvfDB8NXwwLjIwMDAwMHw1fDAuMjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTA3MTEwNHxLCi1hdWRpb3wxfDk2MDB8MC4yMDAwMDB8OTYwMHwwLjIwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxMjIxNjMyfEsKLXZpZGVvfDB8NnwwLjI0MDAwMHw2fDAuMjQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTI4NDA5NnxLCi1hdWRpb3wxfDExNTIwfDAuMjQwMDAwfDExNTIwfDAuMjQwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDE0MzQ2MjR8SwotdmlkZW98MHw3fDAuMjgwMDAwfDd8MC4yODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHwxNDk3MDg4fEsKLWF1ZGlvfDF8MTM0NDB8MC4yODAwMDB8MTM0NDB8MC4yODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8MTY0NzYxNnxLCi12aWRlb3wwfDh8MC4zMjAwMDB8OHwwLjMyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDE3MTAwODB8SwotYXVkaW98MXwxNTM2MHwwLjMyMDAwMHwxNTM2MHwwLjMyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxODYwNjA4fEsKLXZpZGVvfDB8OXwwLjM2MDAwMHw5fDAuMzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTkyMzA3MnxLCi1hdWRpb3wxfDE3MjgwfDAuMzYwMDAwfDE3MjgwfDAuMzYwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDIwNzM2MDB8SwotdmlkZW98MHwxMHwwLjQwMDAwMHwxMHwwLjQwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDIxMzYwNjR8SwotYXVkaW98MXwxOTIwMHwwLjQwMDAwMHwxOTIwMHwwLjQwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyMjg2NTkyfEsKLXZpZGVvfDB8MTF8MC40NDAwMDB8MTF8MC40NDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHwyMzQ5MDU2fEsKLWF1ZGlvfDF8MjExMjB8MC40NDAwMDB8MjExMjB8MC40NDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8MjQ5OTU4NHxLCi12aWRlb3wwfDEyfDAuNDgwMDAwfDEyfDAuNDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MjU2MjA0OHxLCi1hdWRpb3wxfDIzMDQwfDAuNDgwMDAwfDIzMDQwfDAuNDgwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDI3MTI1NzZ8SwotdmlkZW98MHwxM3wwLjUyMDAwMHwxM3wwLjUyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDI3NzUwNDB8SwotYXVkaW98MXwyNDk2MHwwLjUyMDAwMHwyNDk2MHwwLjUyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyOTI1NTY4fEsKLXZpZGVvfDB8MTR8MC41NjAwMDB8MTR8MC41NjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHwyOTg4MDMyfEsKLWF1ZGlvfDF8MjY4ODB8MC41NjAwMDB8MjY4ODB8MC41NjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8MzEzODU2MHxLCi12aWRlb3wwfDE1fDAuNjAwMDAwfDE1fDAuNjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MzIwMTAyNHxLCi1hdWRpb3wxfDI4ODAwfDAuNjAwMDAwfDI4ODAwfDAuNjAwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDMzNTE1NTJ8SwotdmlkZW98MHwxNnwwLjY0MDAwMHwxNnwwLjY0MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDM0MTQwMTZ8SwotYXVkaW98MXwzMDcyMHwwLjY0MDAwMHwzMDcyMHwwLjY0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwzNTY0NTQ0fEsKLXZpZGVvfDB8MTd8MC42ODAwMDB8MTd8MC42ODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHwzNjI3MDA4fEsKLWF1ZGlvfDF8MzI2NDB8MC42ODAwMDB8MzI2NDB8MC42ODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8Mzc3NzUzNnxLCi12aWRlb3wwfDE4fDAuNzIwMDAwfDE4fDAuNzIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8Mzg0MDAwMHxLCi1hdWRpb3wxfDM0NTYwfDAuNzIwMDAwfDM0NTYwfDAuNzIwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDM5OTA1Mjh8SwotdmlkZW98MHwxOXwwLjc2MDAwMHwxOXwwLjc2MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDQwNTI5OTJ8SwotYXVkaW98MXwzNjQ4MHwwLjc2MDAwMHwzNjQ4MHwwLjc2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0MjAzNTIwfEsKLXZpZGVvfDB8MjB8MC44MDAwMDB8MjB8MC44MDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHw0MjY1OTg0fEsKLWF1ZGlvfDF8Mzg0MDB8MC44MDAwMDB8Mzg0MDB8MC44MDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8NDQxNjUxMnxLCi12aWRlb3wwfDIxfDAuODQwMDAwfDIxfDAuODQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDQ3ODk3NnxLCi1hdWRpb3wxfDQwMzIwfDAuODQwMDAwfDQwMzIwfDAuODQwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDQ2Mjk1MDR8SwotdmlkZW98MHwyMnwwLjg4MDAwMHwyMnwwLjg4MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDQ2OTE5Njh8SwotYXVkaW98MXw0MjI0MHwwLjg4MDAwMHw0MjI0MHwwLjg4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0ODQyNDk2fEsKLXZpZGVvfDB8MjN8MC45MjAwMDB8MjN8MC45MjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHw0OTA0OTYwfEsKLWF1ZGlvfDF8NDQxNjB8MC45MjAwMDB8NDQxNjB8MC45MjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8NTA1NTQ4OHxLCi12aWRlb3wwfDI0fDAuOTYwMDAwfDI0fDAuOTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NTExNzk1MnxLCi1hdWRpb3wxfDQ2MDgwfDAuOTYwMDAwfDQ2MDgwfDAuOTYwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDUyNjg0ODB8SwotdmlkZW98MHwyNXwxLjAwMDAwMHwyNXwxLjAwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDQyNjU5ODR8SwotYXVkaW98MXw0ODAwMHwxLjAwMDAwMHw0ODAwMHwxLjAwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0NDE2NTEyfEsKLXZpZGVvfDB8MjZ8MS4wNDAwMDB8MjZ8MS4wNDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHw0NDc4OTc2fEsKLWF1ZGlvfDF8NDk5MjB8MS4wNDAwMDB8NDk5MjB8MS4wNDAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8NDYyOTUwNHxLCi12aWRlb3wwfDI3fDEuMDgwMDAwfDI3fDEuMDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDY5MTk2OHxLCi1hdWRpb3wxfDUxODQwfDEuMDgwMDAwfDUxODQwfDEuMDgwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDQ4NDI0OTZ8SwotdmlkZW98MHwyOHwxLjEyMDAwMHwyOHwxLjEyMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDQ5MDQ5NjB8SwotYXVkaW98MXw1Mzc2MHwxLjEyMDAwMHw1Mzc2MHwxLjEyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw1MDU1NDg4fEsKLXZpZGVvfDB8Mjl8MS4xNjAwMDB8Mjl8MS4xNjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHw1MTE3OTUyfEsKLWF1ZGlvfDF8NTU2ODB8MS4xNjAwMDB8NTU2ODB8MS4xNjAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8NTI2ODQ4MHxLCi12aWRlb3wwfDMwfDEuMjAwMDAwfDMwfDEuMjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTA3MTEwNHxLfDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw1NzYwMHwxLjIwMDAwMHw1NzYwMHwxLjIwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxMjIxNjMyfEt8MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci12aWRlb3wwfDMxfDEuMjQwMDAwfDMxfDEuMjQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTI4NDA5NnxLfDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw1OTUyMHwxLjI0MDAwMHw1OTUyMHwxLjI0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxNDM0NjI0fEt8MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci12aWRlb3wwfDMyfDEuMjgwMDAwfDMyfDEuMjgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTQ5NzA4OHxLfDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw2MTQ0MHwxLjI4MDAwMHw2MTQ0MHwxLjI4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxNjQ3NjE2fEt8MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci12aWRlb3wwfDMzfDEuMzIwMDAwfDMzfDEuMzIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTcxMDA4MHxLfDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw2MzM2MHwxLjMyMDAwMHw2MzM2MHwxLjMyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxODYwNjA4fEt8MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci12aWRlb3wwfDM0fDEuMzYwMDAwfDM0fDEuMzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTkyMzA3MnxLfDEKLVN0cmluZ3MgTWV0YWRhdGF8OAotYXVkaW98MXw2NTI4MHwxLjM2MDAwMHw2NTI4MHwxLjM2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyMDczNjAwfEt8MQotU3RyaW5ncyBNZXRhZGF0YXw4Ci0wfG1wZWcydmlkZW98MHx2aWRlb3wxLzUwfFswXVswXVswXVswXXwweDAwMDB8NzIwfDYwOHwwfDB8MHwxOjF8NDU6Mzh8eXV2NDIycHw1fHR2fHVua25vd258dW5rbm93bnx1bmtub3dufHRvcGxlZnR8MDA6MDA6MDA6MDB8MXxOL0F8MjUvMXwyNS8xfDEvMjV8MHwwLjAwMDAwMHxOL0F8Ti9BfDMwMDAwMDAwfDMwMDAwMDAwfE4vQXxOL0F8Ti9BfDM1fDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwweDA2MEEyQjM0MDEwMTAxMDUwMTAxMEQwMDEzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKLTF8cGNtX3MxNmxlfHVua25vd258YXVkaW98MS80ODAwMHxbMF1bMF1bMF1bMF18MHgwMDAwfHMxNnw0ODAwMHwyfHVua25vd258MTZ8Ti9BfDAvMHwwLzB8MS80ODAwMHwwfDAuMDAwMDAwfE4vQXxOL0F8MTUzNjAwMHxOL0F8Ti9BfE4vQXxOL0F8MzV8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB4MDYwQTJCMzQwMTAxMDEwNTAxMDEwRDAwMTMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQordmlkZW98MHwwfDAuMDAwMDAwfDB8MC4wMDAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHw2MTQ0fEtfCithdWRpb3wxfDB8MC4wMDAwMDB8MHwwLjAwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxNTY2NzJ8S18KK3ZpZGVvfDB8MXwwLjA0MDAwMHwxfDAuMDQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MjE5MTM2fEtfCithdWRpb3wxfDE5MjB8MC4wNDAwMDB8MTkyMHwwLjA0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwzNjk2NjR8S18KK3ZpZGVvfDB8MnwwLjA4MDAwMHwyfDAuMDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDMyMTI4fEtfCithdWRpb3wxfDM4NDB8MC4wODAwMDB8Mzg0MHwwLjA4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw1ODI2NTZ8S18KK3ZpZGVvfDB8M3wwLjEyMDAwMHwzfDAuMTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NjQ1MTIwfEtfCithdWRpb3wxfDU3NjB8MC4xMjAwMDB8NTc2MHwwLjEyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw3OTU2NDh8S18KK3ZpZGVvfDB8NHwwLjE2MDAwMHw0fDAuMTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8ODU4MTEyfEtfCithdWRpb3wxfDc2ODB8MC4xNjAwMDB8NzY4MHwwLjE2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxMDA4NjQwfEtfCit2aWRlb3wwfDV8MC4yMDAwMDB8NXwwLjIwMDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDEwNzExMDR8S18KK2F1ZGlvfDF8OTYwMHwwLjIwMDAwMHw5NjAwfDAuMjAwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDEyMjE2MzJ8S18KK3ZpZGVvfDB8NnwwLjI0MDAwMHw2fDAuMjQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTI4NDA5NnxLXworYXVkaW98MXwxMTUyMHwwLjI0MDAwMHwxMTUyMHwwLjI0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxNDM0NjI0fEtfCit2aWRlb3wwfDd8MC4yODAwMDB8N3wwLjI4MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDE0OTcwODh8S18KK2F1ZGlvfDF8MTM0NDB8MC4yODAwMDB8MTM0NDB8MC4yODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8MTY0NzYxNnxLXwordmlkZW98MHw4fDAuMzIwMDAwfDh8MC4zMjAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHwxNzEwMDgwfEtfCithdWRpb3wxfDE1MzYwfDAuMzIwMDAwfDE1MzYwfDAuMzIwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDE4NjA2MDh8S18KK3ZpZGVvfDB8OXwwLjM2MDAwMHw5fDAuMzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTkyMzA3MnxLXworYXVkaW98MXwxNzI4MHwwLjM2MDAwMHwxNzI4MHwwLjM2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyMDczNjAwfEtfCit2aWRlb3wwfDEwfDAuNDAwMDAwfDEwfDAuNDAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MjEzNjA2NHxLXworYXVkaW98MXwxOTIwMHwwLjQwMDAwMHwxOTIwMHwwLjQwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyMjg2NTkyfEtfCit2aWRlb3wwfDExfDAuNDQwMDAwfDExfDAuNDQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MjM0OTA1NnxLXworYXVkaW98MXwyMTEyMHwwLjQ0MDAwMHwyMTEyMHwwLjQ0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyNDk5NTg0fEtfCit2aWRlb3wwfDEyfDAuNDgwMDAwfDEyfDAuNDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MjU2MjA0OHxLXworYXVkaW98MXwyMzA0MHwwLjQ4MDAwMHwyMzA0MHwwLjQ4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyNzEyNTc2fEtfCit2aWRlb3wwfDEzfDAuNTIwMDAwfDEzfDAuNTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8Mjc3NTA0MHxLXworYXVkaW98MXwyNDk2MHwwLjUyMDAwMHwyNDk2MHwwLjUyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyOTI1NTY4fEtfCit2aWRlb3wwfDE0fDAuNTYwMDAwfDE0fDAuNTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8Mjk4ODAzMnxLXworYXVkaW98MXwyNjg4MHwwLjU2MDAwMHwyNjg4MHwwLjU2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwzMTM4NTYwfEtfCit2aWRlb3wwfDE1fDAuNjAwMDAwfDE1fDAuNjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MzIwMTAyNHxLXworYXVkaW98MXwyODgwMHwwLjYwMDAwMHwyODgwMHwwLjYwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwzMzUxNTUyfEtfCit2aWRlb3wwfDE2fDAuNjQwMDAwfDE2fDAuNjQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MzQxNDAxNnxLXworYXVkaW98MXwzMDcyMHwwLjY0MDAwMHwzMDcyMHwwLjY0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwzNTY0NTQ0fEtfCit2aWRlb3wwfDE3fDAuNjgwMDAwfDE3fDAuNjgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MzYyNzAwOHxLXworYXVkaW98MXwzMjY0MHwwLjY4MDAwMHwzMjY0MHwwLjY4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwzNzc3NTM2fEtfCit2aWRlb3wwfDE4fDAuNzIwMDAwfDE4fDAuNzIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8Mzg0MDAwMHxLXworYXVkaW98MXwzNDU2MHwwLjcyMDAwMHwzNDU2MHwwLjcyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwzOTkwNTI4fEtfCit2aWRlb3wwfDE5fDAuNzYwMDAwfDE5fDAuNzYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDA1Mjk5MnxLXworYXVkaW98MXwzNjQ4MHwwLjc2MDAwMHwzNjQ4MHwwLjc2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0MjAzNTIwfEtfCit2aWRlb3wwfDIwfDAuODAwMDAwfDIwfDAuODAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDI2NTk4NHxLXworYXVkaW98MXwzODQwMHwwLjgwMDAwMHwzODQwMHwwLjgwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0NDE2NTEyfEtfCit2aWRlb3wwfDIxfDAuODQwMDAwfDIxfDAuODQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDQ3ODk3NnxLXworYXVkaW98MXw0MDMyMHwwLjg0MDAwMHw0MDMyMHwwLjg0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0NjI5NTA0fEtfCit2aWRlb3wwfDIyfDAuODgwMDAwfDIyfDAuODgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDY5MTk2OHxLXworYXVkaW98MXw0MjI0MHwwLjg4MDAwMHw0MjI0MHwwLjg4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0ODQyNDk2fEtfCit2aWRlb3wwfDIzfDAuOTIwMDAwfDIzfDAuOTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDkwNDk2MHxLXworYXVkaW98MXw0NDE2MHwwLjkyMDAwMHw0NDE2MHwwLjkyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw1MDU1NDg4fEtfCit2aWRlb3wwfDI0fDAuOTYwMDAwfDI0fDAuOTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NTExNzk1MnxLXworYXVkaW98MXw0NjA4MHwwLjk2MDAwMHw0NjA4MHwwLjk2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw1MjY4NDgwfEtfCit2aWRlb3wwfDI1fDEuMDAwMDAwfDI1fDEuMDAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDI2NTk4NHxLXworYXVkaW98MXw0ODAwMHwxLjAwMDAwMHw0ODAwMHwxLjAwMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0NDE2NTEyfEtfCit2aWRlb3wwfDI2fDEuMDQwMDAwfDI2fDEuMDQwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDQ3ODk3NnxLXworYXVkaW98MXw0OTkyMHwxLjA0MDAwMHw0OTkyMHwxLjA0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0NjI5NTA0fEtfCit2aWRlb3wwfDI3fDEuMDgwMDAwfDI3fDEuMDgwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDY5MTk2OHxLXworYXVkaW98MXw1MTg0MHwxLjA4MDAwMHw1MTg0MHwxLjA4MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw0ODQyNDk2fEtfCit2aWRlb3wwfDI4fDEuMTIwMDAwfDI4fDEuMTIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NDkwNDk2MHxLXworYXVkaW98MXw1Mzc2MHwxLjEyMDAwMHw1Mzc2MHwxLjEyMDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw1MDU1NDg4fEtfCit2aWRlb3wwfDI5fDEuMTYwMDAwfDI5fDEuMTYwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8NTExNzk1MnxLXworYXVkaW98MXw1NTY4MHwxLjE2MDAwMHw1NTY4MHwxLjE2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHw1MjY4NDgwfEtfCit2aWRlb3wwfDMwfDEuMjAwMDAwfDMwfDEuMjAwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTA3MTEwNHxLX3wxCitTdHJpbmdzIE1ldGFkYXRhCithdWRpb3wxfDU3NjAwfDEuMjAwMDAwfDU3NjAwfDEuMjAwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDEyMjE2MzJ8S198MQorU3RyaW5ncyBNZXRhZGF0YQordmlkZW98MHwzMXwxLjI0MDAwMHwzMXwxLjI0MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDEyODQwOTZ8S198MQorU3RyaW5ncyBNZXRhZGF0YQorYXVkaW98MXw1OTUyMHwxLjI0MDAwMHw1OTUyMHwxLjI0MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwxNDM0NjI0fEtffDEKK1N0cmluZ3MgTWV0YWRhdGEKK3ZpZGVvfDB8MzJ8MS4yODAwMDB8MzJ8MS4yODAwMDB8MXwwLjA0MDAwMHxOL0F8Ti9BfDE1MDAwMHwxNDk3MDg4fEtffDEKK1N0cmluZ3MgTWV0YWRhdGEKK2F1ZGlvfDF8NjE0NDB8MS4yODAwMDB8NjE0NDB8MS4yODAwMDB8MTkyMHwwLjA0MDAwMHxOL0F8Ti9BfDc2ODB8MTY0NzYxNnxLX3wxCitTdHJpbmdzIE1ldGFkYXRhCit2aWRlb3wwfDMzfDEuMzIwMDAwfDMzfDEuMzIwMDAwfDF8MC4wNDAwMDB8Ti9BfE4vQXwxNTAwMDB8MTcxMDA4MHxLX3wxCitTdHJpbmdzIE1ldGFkYXRhCithdWRpb3wxfDYzMzYwfDEuMzIwMDAwfDYzMzYwfDEuMzIwMDAwfDE5MjB8MC4wNDAwMDB8Ti9BfE4vQXw3NjgwfDE4NjA2MDh8S198MQorU3RyaW5ncyBNZXRhZGF0YQordmlkZW98MHwzNHwxLjM2MDAwMHwzNHwxLjM2MDAwMHwxfDAuMDQwMDAwfE4vQXxOL0F8MTUwMDAwfDE5MjMwNzJ8S198MQorU3RyaW5ncyBNZXRhZGF0YQorYXVkaW98MXw2NTI4MHwxLjM2MDAwMHw2NTI4MHwxLjM2MDAwMHwxOTIwfDAuMDQwMDAwfE4vQXxOL0F8NzY4MHwyMDczNjAwfEtffDEKK1N0cmluZ3MgTWV0YWRhdGEKKzB8bXBlZzJ2aWRlb3wwfHZpZGVvfDEvMjV8WzBdWzBdWzBdWzBdfDB4MDAwMHw3MjB8NjA4fDB8MHwwfDE6MXw0NTozOHx5dXY0MjJwfDV8dHZ8dW5rbm93bnx1bmtub3dufHVua25vd258dG9wbGVmdHx0dHxOL0F8MXxOL0F8MjUvMXwyNS8xfDEvMjV8MHwwLjAwMDAwMHxOL0F8Ti9BfDMwMDAwMDAwfE4vQXxOL0F8Ti9BfE4vQXwzNXwwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwweDA2MEEyQjM0MDEwMTAxMDUwMTAxMEQwMDEzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKKzF8cGNtX3MxNmxlfHVua25vd258YXVkaW98MS80ODAwMHxbMF1bMF1bMF1bMF18MHgwMDAwfHMxNnw0ODAwMHwyfHVua25vd258MTZ8Ti9BfDAvMHwwLzB8MS80ODAwMHwwfDAuMDAwMDAwfE4vQXxOL0F8MTUzNjAwMHxOL0F8Ti9BfE4vQXxOL0F8MzV8MHwwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHgwNjBBMkIzNDAxMDEwMTA1MDEwMTBEMDAxMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1zaW1wbGUyLWxhdmYtdHMgYi90ZXN0cy9yZWYvZmF0ZS9jb25jYXQtZGVtdXhlci1zaW1wbGUyLWxhdmYtdHMKaW5kZXggZmIyNzEzYy4uZTVjZjE4YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY29uY2F0LWRlbXV4ZXItc2ltcGxlMi1sYXZmLXRzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2NvbmNhdC1kZW11eGVyLXNpbXBsZTItbGF2Zi10cwpAQCAtMSwxNTEgKzEsMjE1IEBACi12aWRlb3wxfDk4MnwwLjAxMDkxMXwtMjYxOHwtMC4wMjkwODl8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0ODAxfDU2NHxLCi12aWRlb3wxfDQ1ODJ8MC4wNTA5MTF8OTgyfDAuMDEwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxNjQyOXwyNzA3MnxfCi12aWRlb3wxfDgxODJ8MC4wOTA5MTF8NDU4MnwwLjA1MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTQ1MDh8NDQ5MzJ8XwotdmlkZW98MXwxMTc4MnwwLjEzMDkxMXw4MTgyfDAuMDkwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjYyMnw2MDUzNnxfCi12aWRlb3wxfDE1MzgyfDAuMTcwOTExfDExNzgyfDAuMTMwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzM5M3w3NDI2MHxfCi12aWRlb3wxfDE4OTgyfDAuMjEwOTExfDE1MzgyfDAuMTcwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzA5Mnw4ODkyNHxfCi12aWRlb3wxfDIyNTgyfDAuMjUwOTExfDE4OTgyfDAuMjEwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjc1NXwxMDI4MzZ8XwotdmlkZW98MXwyNjE4MnwwLjI5MDkxMXwyMjU4MnwwLjI1MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTIwMjN8MTE2NzQ4fF8KLWF1ZGlvfDB8MHwwLjAwMDAwMHwwfDAuMDAwMDAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDh8MTU5OTg4fEsKLWF1ZGlvfDB8MjM1MXwwLjAyNjEyMnwyMzUxfDAuMDI2MTIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8NDcwMnwwLjA1MjI0NHw0NzAyfDAuMDUyMjQ0fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8NzA1M3wwLjA3ODM2N3w3MDUzfDAuMDc4MzY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8OTQwNHwwLjEwNDQ4OXw5NDA0fDAuMTA0NDg5fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTE3NTV8MC4xMzA2MTF8MTE3NTV8MC4xMzA2MTF8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNDEwNnwwLjE1NjczM3wxNDEwNnwwLjE1NjczM3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDE2NDU3fDAuMTgyODU2fDE2NDU3fDAuMTgyODU2fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTg4MDh8MC4yMDg5Nzh8MTg4MDh8MC4yMDg5Nzh8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwyMTE1OXwwLjIzNTEwMHwyMTE1OXwwLjIzNTEwMHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDIzNTEwfDAuMjYxMjIyfDIzNTEwfDAuMjYxMjIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MjU4NjF8MC4yODczNDR8MjU4NjF8MC4yODczNDR8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwyODIxMnwwLjMxMzQ2N3wyODIxMnwwLjMxMzQ2N3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDMwNTYzfDAuMzM5NTg5fDMwNTYzfDAuMzM5NTg5fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLXZpZGVvfDF8Mjk3ODJ8MC4zMzA5MTF8MjYxODJ8MC4yOTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE0MDk4fDEzMDA5NnxfCi12aWRlb3wxfDMzMzgyfDAuMzcwOTExfDI5NzgyfDAuMzMwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzMyOXwxNDUzMjR8XwotdmlkZW98MXwzNjk4MnwwLjQxMDkxMXwzMzM4MnwwLjM3MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTIxMzV8MTYyOTk2fF8KLXZpZGVvfDF8NDA1ODJ8MC40NTA5MTF8MzY5ODJ8MC40MTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMjgyfDE3NjM0NHxfCi12aWRlb3wxfDQ0MTgyfDAuNDkwOTExfDQwNTgyfDAuNDUwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwyNDc4NnwxODk2OTJ8SwotdmlkZW98MXw0Nzc4MnwwLjUzMDkxMXw0NDE4MnwwLjQ5MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTc0NDB8MjE2Mzg4fF8KLXZpZGVvfDF8NTEzODJ8MC41NzA5MTF8NDc3ODJ8MC41MzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE1MDE5fDIzNTAwMHxfCi12aWRlb3wxfDU0OTgyfDAuNjEwOTExfDUxMzgyfDAuNTcwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzQ0OXwyNTEzNTZ8XwotdmlkZW98MXw1ODU4MnwwLjY1MDkxMXw1NDk4MnwwLjYxMDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTIzOTh8MjY2MDIwfF8KLXZpZGVvfDF8NjIxODJ8MC42OTA5MTF8NTg1ODJ8MC42NTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEzNDU1fDI3OTc0NHxfCi1hdWRpb3wwfDMyOTE1fDAuMzY1NzIyfDMyOTE1fDAuMzY1NzIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8MzIyNjA4fEsKLWF1ZGlvfDB8MzUyNjZ8MC4zOTE4NDR8MzUyNjZ8MC4zOTE4NDR8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwzNzYxN3wwLjQxNzk2N3wzNzYxN3wwLjQxNzk2N3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDM5OTY4fDAuNDQ0MDg5fDM5OTY4fDAuNDQ0MDg5fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8NDIzMTl8MC40NzAyMTF8NDIzMTl8MC40NzAyMTF8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHw0NDY3MHwwLjQ5NjMzM3w0NDY3MHwwLjQ5NjMzM3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDQ3MDIxfDAuNTIyNDU2fDQ3MDIxfDAuNTIyNDU2fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8NDkzNzJ8MC41NDg1Nzh8NDkzNzJ8MC41NDg1Nzh8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHw1MTcyM3wwLjU3NDcwMHw1MTcyM3wwLjU3NDcwMHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDU0MDc0fDAuNjAwODIyfDU0MDc0fDAuNjAwODIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8NTY0MjV8MC42MjY5NDR8NTY0MjV8MC42MjY5NDR8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHw1ODc3NnwwLjY1MzA2N3w1ODc3NnwwLjY1MzA2N3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDYxMTI3fDAuNjc5MTg5fDYxMTI3fDAuNjc5MTg5fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8NjM0Nzh8MC43MDUzMTF8NjM0Nzh8MC43MDUzMTF8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotdmlkZW98MXw2NTc4MnwwLjczMDkxMXw2MjE4MnwwLjY5MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTM4MzZ8Mjk0NDA4fF8KLXZpZGVvfDF8NjkzODJ8MC43NzA5MTF8NjU3ODJ8MC43MzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMTYzfDMwOTQ0OHxfCi12aWRlb3wxfDcyOTgyfDAuODEwOTExfDY5MzgyfDAuNzcwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjY5MnwzMjU5OTJ8XwotdmlkZW98MXw3NjU4MnwwLjg1MDkxMXw3Mjk4MnwwLjgxMDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTA4MjR8MzM5NTI4fF8KLXZpZGVvfDF8ODAxODJ8MC44OTA5MTF8NzY1ODJ8MC44NTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDExMjg2fDM1MTM3MnxfCi1hdWRpb3wwfDY1ODI5fDAuNzMxNDMzfDY1ODI5fDAuNzMxNDMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8NDA0NTc2fEsKLWF1ZGlvfDB8NjgxODB8MC43NTc1NTZ8NjgxODB8MC43NTc1NTZ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHw3MDUzMXwwLjc4MzY3OHw3MDUzMXwwLjc4MzY3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDcyODgyfDAuODA5ODAwfDcyODgyfDAuODA5ODAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8NzUyMzN8MC44MzU5MjJ8NzUyMzN8MC44MzU5MjJ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHw3NzU4NHwwLjg2MjA0NHw3NzU4NHwwLjg2MjA0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDc5OTM1fDAuODg4MTY3fDc5OTM1fDAuODg4MTY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8ODIyODZ8MC45MTQyODl8ODIyODZ8MC45MTQyODl8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHw4NDYzN3wwLjk0MDQxMXw4NDYzN3wwLjk0MDQxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDg2OTg4fDAuOTY2NTMzfDg2OTg4fDAuOTY2NTMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8ODkzMzl8MC45OTI2NTZ8ODkzMzl8MC45OTI2NTZ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotdmlkZW98MXw4Mzc4MnwwLjkzMDkxMXw4MDE4MnwwLjg5MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI2Nzh8MzYzNTkyfF8KLXZpZGVvfDF8ODczODJ8MC45NzA5MTF8ODM3ODJ8MC45MzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0NzExfDM3Nzg4MHxLCi12aWRlb3wxfDkxOTY0fDEuMDIxODIyfDg4MzY0fDAuOTgxODIyfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwyNDgwMXw1NjR8SwotdmlkZW98MXw5NTU2NHwxLjA2MTgyMnw5MTk2NHwxLjAyMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTY0Mjl8MjcwNzJ8XwotdmlkZW98MXw5OTE2NHwxLjEwMTgyMnw5NTU2NHwxLjA2MTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTQ1MDh8NDQ5MzJ8XwotdmlkZW98MXwxMDI3NjR8MS4xNDE4MjJ8OTkxNjR8MS4xMDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyNjIyfDYwNTM2fF8KLXZpZGVvfDF8MTA2MzY0fDEuMTgxODIyfDEwMjc2NHwxLjE0MTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTMzOTN8NzQyNjB8XwotdmlkZW98MXwxMDk5NjR8MS4yMjE4MjJ8MTA2MzY0fDEuMTgxODIyfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzA5Mnw4ODkyNHxfCi12aWRlb3wxfDExMzU2NHwxLjI2MTgyMnwxMDk5NjR8MS4yMjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyNzU1fDEwMjgzNnxfCi12aWRlb3wxfDExNzE2NHwxLjMwMTgyMnwxMTM1NjR8MS4yNjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMDIzfDExNjc0OHxfCi1hdWRpb3wwfDkwOTgyfDEuMDEwOTExfDkwOTgyfDEuMDEwOTExfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDh8MTU5OTg4fEsKLWF1ZGlvfDB8OTMzMzN8MS4wMzcwMzN8OTMzMzN8MS4wMzcwMzN8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHw5NTY4NHwxLjA2MzE1Nnw5NTY4NHwxLjA2MzE1NnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDk4MDM1fDEuMDg5Mjc4fDk4MDM1fDEuMDg5Mjc4fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTAwMzg2fDEuMTE1NDAwfDEwMDM4NnwxLjExNTQwMHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDEwMjczN3wxLjE0MTUyMnwxMDI3Mzd8MS4xNDE1MjJ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxMDUwODh8MS4xNjc2NDR8MTA1MDg4fDEuMTY3NjQ0fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTA3NDM5fDEuMTkzNzY3fDEwNzQzOXwxLjE5Mzc2N3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDEwOTc5MHwxLjIxOTg4OXwxMDk3OTB8MS4yMTk4ODl8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxMTIxNDF8MS4yNDYwMTF8MTEyMTQxfDEuMjQ2MDExfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTE0NDkyfDEuMjcyMTMzfDExNDQ5MnwxLjI3MjEzM3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDExNjg0M3wxLjI5ODI1NnwxMTY4NDN8MS4yOTgyNTZ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxMTkxOTR8MS4zMjQzNzh8MTE5MTk0fDEuMzI0Mzc4fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTIxNTQ1fDEuMzUwNTAwfDEyMTU0NXwxLjM1MDUwMHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi12aWRlb3wxfDEyMDc2NHwxLjM0MTgyMnwxMTcxNjR8MS4zMDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE0MDk4fDEzMDA5NnxfCi12aWRlb3wxfDEyNDM2NHwxLjM4MTgyMnwxMjA3NjR8MS4zNDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEzMzI5fDE0NTMyNHxfCi12aWRlb3wxfDEyNzk2NHwxLjQyMTgyMnwxMjQzNjR8MS4zODE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMTM1fDE2Mjk5NnxfCi12aWRlb3wxfDEzMTU2NHwxLjQ2MTgyMnwxMjc5NjR8MS40MjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMjgyfDE3NjM0NHxfCi12aWRlb3wxfDEzNTE2NHwxLjUwMTgyMnwxMzE1NjR8MS40NjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0Nzg2fDE4OTY5MnxLCi12aWRlb3wxfDEzODc2NHwxLjU0MTgyMnwxMzUxNjR8MS41MDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE3NDQwfDIxNjM4OHxfCi12aWRlb3wxfDE0MjM2NHwxLjU4MTgyMnwxMzg3NjR8MS41NDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE1MDE5fDIzNTAwMHxfCi12aWRlb3wxfDE0NTk2NHwxLjYyMTgyMnwxNDIzNjR8MS41ODE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEzNDQ5fDI1MTM1NnxfCi12aWRlb3wxfDE0OTU2NHwxLjY2MTgyMnwxNDU5NjR8MS42MjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMzk4fDI2NjAyMHxfCi12aWRlb3wxfDE1MzE2NHwxLjcwMTgyMnwxNDk1NjR8MS42NjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEzNDU1fDI3OTc0NHxfCi1hdWRpb3wwfDEyMzg5N3wxLjM3NjYzM3wxMjM4OTd8MS4zNzY2MzN8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXwzMjI2MDh8SwotYXVkaW98MHwxMjYyNDh8MS40MDI3NTZ8MTI2MjQ4fDEuNDAyNzU2fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTI4NTk5fDEuNDI4ODc4fDEyODU5OXwxLjQyODg3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDEzMDk1MHwxLjQ1NTAwMHwxMzA5NTB8MS40NTUwMDB8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxMzMzMDF8MS40ODExMjJ8MTMzMzAxfDEuNDgxMTIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTM1NjUyfDEuNTA3MjQ0fDEzNTY1MnwxLjUwNzI0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDEzODAwM3wxLjUzMzM2N3wxMzgwMDN8MS41MzMzNjd8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNDAzNTR8MS41NTk0ODl8MTQwMzU0fDEuNTU5NDg5fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTQyNzA1fDEuNTg1NjExfDE0MjcwNXwxLjU4NTYxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDE0NTA1NnwxLjYxMTczM3wxNDUwNTZ8MS42MTE3MzN8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNDc0MDd8MS42Mzc4NTZ8MTQ3NDA3fDEuNjM3ODU2fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTQ5NzU4fDEuNjYzOTc4fDE0OTc1OHwxLjY2Mzk3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDE1MjEwOXwxLjY5MDEwMHwxNTIxMDl8MS42OTAxMDB8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNTQ0NjB8MS43MTYyMjJ8MTU0NDYwfDEuNzE2MjIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLXZpZGVvfDF8MTU2NzY0fDEuNzQxODIyfDE1MzE2NHwxLjcwMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTM4MzZ8Mjk0NDA4fF8KLXZpZGVvfDF8MTYwMzY0fDEuNzgxODIyfDE1Njc2NHwxLjc0MTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTIxNjN8MzA5NDQ4fF8KLXZpZGVvfDF8MTYzOTY0fDEuODIxODIyfDE2MDM2NHwxLjc4MTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI2OTJ8MzI1OTkyfF8KLXZpZGVvfDF8MTY3NTY0fDEuODYxODIyfDE2Mzk2NHwxLjgyMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTA4MjR8MzM5NTI4fF8KLXZpZGVvfDF8MTcxMTY0fDEuOTAxODIyfDE2NzU2NHwxLjg2MTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTEyODZ8MzUxMzcyfF8KLWF1ZGlvfDB8MTU2ODExfDEuNzQyMzQ0fDE1NjgxMXwxLjc0MjM0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fDQwNDU3NnxLCi1hdWRpb3wwfDE1OTE2MnwxLjc2ODQ2N3wxNTkxNjJ8MS43Njg0Njd8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNjE1MTN8MS43OTQ1ODl8MTYxNTEzfDEuNzk0NTg5fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTYzODY0fDEuODIwNzExfDE2Mzg2NHwxLjgyMDcxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDE2NjIxNXwxLjg0NjgzM3wxNjYyMTV8MS44NDY4MzN8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNjg1NjZ8MS44NzI5NTZ8MTY4NTY2fDEuODcyOTU2fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTcwOTE3fDEuODk5MDc4fDE3MDkxN3wxLjg5OTA3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDE3MzI2OHwxLjkyNTIwMHwxNzMyNjh8MS45MjUyMDB8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNzU2MTl8MS45NTEzMjJ8MTc1NjE5fDEuOTUxMzIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTc3OTcwfDEuOTc3NDQ0fDE3Nzk3MHwxLjk3NzQ0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDE4MDMyMXwyLjAwMzU2N3wxODAzMjF8Mi4wMDM1Njd8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotdmlkZW98MXwxNzQ3NjR8MS45NDE4MjJ8MTcxMTY0fDEuOTAxODIyfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjY3OHwzNjM1OTJ8XwotdmlkZW98MXwxNzgzNjR8MS45ODE4MjJ8MTc0NzY0fDEuOTQxODIyfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwyNDcxMXwzNzc4ODB8SwotdmlkZW98MXwxMzk1ODJ8MS41NTA5MTF8MTM1OTgyfDEuNTEwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjY5MnwzMjU5OTJ8XwotdmlkZW98MXwxNDMxODJ8MS41OTA5MTF8MTM5NTgyfDEuNTUwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMDgyNHwzMzk1Mjh8XwotdmlkZW98MXwxNDY3ODJ8MS42MzA5MTF8MTQzMTgyfDEuNTkwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMTI4NnwzNTEzNzJ8XwotYXVkaW98MHwxMzI0Mjl8MS40NzE0MzN8MTMyNDI5fDEuNDcxNDMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8NDA0NTc2fEsKLWF1ZGlvfDB8MTM0NzgwfDEuNDk3NTU2fDEzNDc4MHwxLjQ5NzU1NnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDEzNzEzMXwxLjUyMzY3OHwxMzcxMzF8MS41MjM2Nzh8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxMzk0ODJ8MS41NDk4MDB8MTM5NDgyfDEuNTQ5ODAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTQxODMzfDEuNTc1OTIyfDE0MTgzM3wxLjU3NTkyMnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDE0NDE4NHwxLjYwMjA0NHwxNDQxODR8MS42MDIwNDR8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNDY1MzV8MS42MjgxNjd8MTQ2NTM1fDEuNjI4MTY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTQ4ODg2fDEuNjU0Mjg5fDE0ODg4NnwxLjY1NDI4OXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi1hdWRpb3wwfDE1MTIzN3wxLjY4MDQxMXwxNTEyMzd8MS42ODA0MTF8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8SwotYXVkaW98MHwxNTM1ODh8MS43MDY1MzN8MTUzNTg4fDEuNzA2NTMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEsKLWF1ZGlvfDB8MTU1OTM5fDEuNzMyNjU2fDE1NTkzOXwxLjczMjY1NnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLCi12aWRlb3wxfDE1MDM4MnwxLjY3MDkxMXwxNDY3ODJ8MS42MzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyNjc4fDM2MzU5MnxfCi12aWRlb3wxfDE1Mzk4MnwxLjcxMDkxMXwxNTAzODJ8MS42NzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0NzExfDM3Nzg4MHxLCi12aWRlb3wxfDE2MTE4MnwxLjc5MDkxMXwxNTc1ODJ8MS43NTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMTM1fDE2Mjk5NnxfCi12aWRlb3wxfDE2NDc4MnwxLjgzMDkxMXwxNjExODJ8MS43OTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMjgyfDE3NjM0NHxfCi12aWRlb3wxfDE2ODM4MnwxLjg3MDkxMXwxNjQ3ODJ8MS44MzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0Nzg2fDE4OTY5MnxLCi12aWRlb3wxfDE3MTk4MnwxLjkxMDkxMXwxNjgzODJ8MS44NzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE3NDQwfDIxNjM4OHxfCi12aWRlb3wxfDE3NTU4MnwxLjk1MDkxMXwxNzE5ODJ8MS45MTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE1MDE5fDIzNTAwMHxfCi0wfG1wMnx1bmtub3dufGF1ZGlvfDEvNDQxMDB8WzNdWzBdWzBdWzBdfDB4MDAwM3xzMTZwfDQ0MTAwfDF8bW9ub3wwfE4vQXwwLzB8MC8wfDEvOTAwMDB8MHwwLjAwMDAwMHxOL0F8Ti9BfDY0MDAwfE4vQXxOL0F8Ti9BfE4vQXw4OXwwfDB8MHwwfDB8MHwwfDB8MHwwfDAKLTF8bXBlZzJ2aWRlb3w0fHZpZGVvfDEvNTB8WzJdWzBdWzBdWzBdfDB4MDAwMnwzNTJ8Mjg4fDB8MHwxfDE6MXwxMTo5fHl1djQyMHB8OHx0dnx1bmtub3dufHVua25vd258dW5rbm93bnxsZWZ0fDAwOjAwOjAwOjAwfDF8Ti9BfDI1LzF8MjUvMXwxLzkwMDAwfE4vQXxOL0F8Ti9BfE4vQXxOL0F8MTA0ODU3MjAwfE4vQXxOL0F8Ti9BfDYwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MAordmlkZW98MXw5ODJ8MC4wMTA5MTF8LTI2MTh8LTAuMDI5MDg5fDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwyNDgwMXw1NjR8S19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8NDU4MnwwLjA1MDkxMXw5ODJ8MC4wMTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE2NDI5fDI3MDcyfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDgxODJ8MC4wOTA5MTF8NDU4MnwwLjA1MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTQ1MDh8NDQ5MzJ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTE3ODJ8MC4xMzA5MTF8ODE4MnwwLjA5MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI2MjJ8NjA1MzZ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTUzODJ8MC4xNzA5MTF8MTE3ODJ8MC4xMzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEzMzkzfDc0MjYwfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE4OTgyfDAuMjEwOTExfDE1MzgyfDAuMTcwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzA5Mnw4ODkyNHxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXwyMjU4MnwwLjI1MDkxMXwxODk4MnwwLjIxMDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI3NTV8MTAyODM2fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDI2MTgyfDAuMjkwOTExfDIyNTgyfDAuMjUwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjAyM3wxMTY3NDh8X19NUEVHVFMgU3RyZWFtIElECisKK2F1ZGlvfDB8MHwwLjAwMDAwMHwwfDAuMDAwMDAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDh8MTU5OTg4fEtfTVBFR1RTIFN0cmVhbSBJRAorCithdWRpb3wwfDIzNTF8MC4wMjYxMjJ8MjM1MXwwLjAyNjEyMnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw0NzAyfDAuMDUyMjQ0fDQ3MDJ8MC4wNTIyNDR8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8NzA1M3wwLjA3ODM2N3w3MDUzfDAuMDc4MzY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDk0MDR8MC4xMDQ0ODl8OTQwNHwwLjEwNDQ4OXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxMTc1NXwwLjEzMDYxMXwxMTc1NXwwLjEzMDYxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNDEwNnwwLjE1NjczM3wxNDEwNnwwLjE1NjczM3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNjQ1N3wwLjE4Mjg1NnwxNjQ1N3wwLjE4Mjg1NnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxODgwOHwwLjIwODk3OHwxODgwOHwwLjIwODk3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwyMTE1OXwwLjIzNTEwMHwyMTE1OXwwLjIzNTEwMHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwyMzUxMHwwLjI2MTIyMnwyMzUxMHwwLjI2MTIyMnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwyNTg2MXwwLjI4NzM0NHwyNTg2MXwwLjI4NzM0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwyODIxMnwwLjMxMzQ2N3wyODIxMnwwLjMxMzQ2N3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwzMDU2M3wwLjMzOTU4OXwzMDU2M3wwLjMzOTU4OXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXwordmlkZW98MXwyOTc4MnwwLjMzMDkxMXwyNjE4MnwwLjI5MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTQwOTh8MTMwMDk2fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDMzMzgyfDAuMzcwOTExfDI5NzgyfDAuMzMwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzMyOXwxNDUzMjR8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MzY5ODJ8MC40MTA5MTF8MzMzODJ8MC4zNzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMTM1fDE2Mjk5NnxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXw0MDU4MnwwLjQ1MDkxMXwzNjk4MnwwLjQxMDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTIyODJ8MTc2MzQ0fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDQ0MTgyfDAuNDkwOTExfDQwNTgyfDAuNDUwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwyNDc4NnwxODk2OTJ8S19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8NDc3ODJ8MC41MzA5MTF8NDQxODJ8MC40OTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE3NDQwfDIxNjM4OHxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXw1MTM4MnwwLjU3MDkxMXw0Nzc4MnwwLjUzMDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTUwMTl8MjM1MDAwfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDU0OTgyfDAuNjEwOTExfDUxMzgyfDAuNTcwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzQ0OXwyNTEzNTZ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8NTg1ODJ8MC42NTA5MTF8NTQ5ODJ8MC42MTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMzk4fDI2NjAyMHxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXw2MjE4MnwwLjY5MDkxMXw1ODU4MnwwLjY1MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTM0NTV8Mjc5NzQ0fF9fTVBFR1RTIFN0cmVhbSBJRAorCithdWRpb3wwfDMyOTE1fDAuMzY1NzIyfDMyOTE1fDAuMzY1NzIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8MzIyNjA4fEtfTVBFR1RTIFN0cmVhbSBJRAorCithdWRpb3wwfDM1MjY2fDAuMzkxODQ0fDM1MjY2fDAuMzkxODQ0fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDM3NjE3fDAuNDE3OTY3fDM3NjE3fDAuNDE3OTY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDM5OTY4fDAuNDQ0MDg5fDM5OTY4fDAuNDQ0MDg5fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDQyMzE5fDAuNDcwMjExfDQyMzE5fDAuNDcwMjExfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDQ0NjcwfDAuNDk2MzMzfDQ0NjcwfDAuNDk2MzMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDQ3MDIxfDAuNTIyNDU2fDQ3MDIxfDAuNTIyNDU2fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDQ5MzcyfDAuNTQ4NTc4fDQ5MzcyfDAuNTQ4NTc4fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDUxNzIzfDAuNTc0NzAwfDUxNzIzfDAuNTc0NzAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDU0MDc0fDAuNjAwODIyfDU0MDc0fDAuNjAwODIyfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDU2NDI1fDAuNjI2OTQ0fDU2NDI1fDAuNjI2OTQ0fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDU4Nzc2fDAuNjUzMDY3fDU4Nzc2fDAuNjUzMDY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDYxMTI3fDAuNjc5MTg5fDYxMTI3fDAuNjc5MTg5fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDYzNDc4fDAuNzA1MzExfDYzNDc4fDAuNzA1MzExfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCit2aWRlb3wxfDY1NzgyfDAuNzMwOTExfDYyMTgyfDAuNjkwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzgzNnwyOTQ0MDh8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8NjkzODJ8MC43NzA5MTF8NjU3ODJ8MC43MzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMTYzfDMwOTQ0OHxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXw3Mjk4MnwwLjgxMDkxMXw2OTM4MnwwLjc3MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI2OTJ8MzI1OTkyfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDc2NTgyfDAuODUwOTExfDcyOTgyfDAuODEwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMDgyNHwzMzk1Mjh8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8ODAxODJ8MC44OTA5MTF8NzY1ODJ8MC44NTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDExMjg2fDM1MTM3MnxfX01QRUdUUyBTdHJlYW0gSUQKKworYXVkaW98MHw2NTgyOXwwLjczMTQzM3w2NTgyOXwwLjczMTQzM3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fDQwNDU3NnxLX01QRUdUUyBTdHJlYW0gSUQKKworYXVkaW98MHw2ODE4MHwwLjc1NzU1Nnw2ODE4MHwwLjc1NzU1NnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw3MDUzMXwwLjc4MzY3OHw3MDUzMXwwLjc4MzY3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw3Mjg4MnwwLjgwOTgwMHw3Mjg4MnwwLjgwOTgwMHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw3NTIzM3wwLjgzNTkyMnw3NTIzM3wwLjgzNTkyMnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw3NzU4NHwwLjg2MjA0NHw3NzU4NHwwLjg2MjA0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw3OTkzNXwwLjg4ODE2N3w3OTkzNXwwLjg4ODE2N3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw4MjI4NnwwLjkxNDI4OXw4MjI4NnwwLjkxNDI4OXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw4NDYzN3wwLjk0MDQxMXw4NDYzN3wwLjk0MDQxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw4Njk4OHwwLjk2NjUzM3w4Njk4OHwwLjk2NjUzM3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw4OTMzOXwwLjk5MjY1Nnw4OTMzOXwwLjk5MjY1NnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXwordmlkZW98MXw4Mzc4MnwwLjkzMDkxMXw4MDE4MnwwLjg5MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI2Nzh8MzYzNTkyfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDg3MzgyfDAuOTcwOTExfDgzNzgyfDAuOTMwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwyNDcxMXwzNzc4ODB8S18KK3ZpZGVvfDF8OTE5NjR8MS4wMjE4MjJ8ODgzNjR8MC45ODE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0ODAxfDU2NHxLX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXw5NTU2NHwxLjA2MTgyMnw5MTk2NHwxLjAyMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTY0Mjl8MjcwNzJ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8OTkxNjR8MS4xMDE4MjJ8OTU1NjR8MS4wNjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE0NTA4fDQ0OTMyfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDEwMjc2NHwxLjE0MTgyMnw5OTE2NHwxLjEwMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI2MjJ8NjA1MzZ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTA2MzY0fDEuMTgxODIyfDEwMjc2NHwxLjE0MTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTMzOTN8NzQyNjB8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTA5OTY0fDEuMjIxODIyfDEwNjM2NHwxLjE4MTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTMwOTJ8ODg5MjR8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTEzNTY0fDEuMjYxODIyfDEwOTk2NHwxLjIyMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI3NTV8MTAyODM2fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDExNzE2NHwxLjMwMTgyMnwxMTM1NjR8MS4yNjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMDIzfDExNjc0OHxfX01QRUdUUyBTdHJlYW0gSUQKKworYXVkaW98MHw5MDk4MnwxLjAxMDkxMXw5MDk4MnwxLjAxMDkxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA4fDE1OTk4OHxLX01QRUdUUyBTdHJlYW0gSUQKKworYXVkaW98MHw5MzMzM3wxLjAzNzAzM3w5MzMzM3wxLjAzNzAzM3wyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw5NTY4NHwxLjA2MzE1Nnw5NTY4NHwxLjA2MzE1NnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHw5ODAzNXwxLjA4OTI3OHw5ODAzNXwxLjA4OTI3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxMDAzODZ8MS4xMTU0MDB8MTAwMzg2fDEuMTE1NDAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDEwMjczN3wxLjE0MTUyMnwxMDI3Mzd8MS4xNDE1MjJ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTA1MDg4fDEuMTY3NjQ0fDEwNTA4OHwxLjE2NzY0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxMDc0Mzl8MS4xOTM3Njd8MTA3NDM5fDEuMTkzNzY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDEwOTc5MHwxLjIxOTg4OXwxMDk3OTB8MS4yMTk4ODl8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTEyMTQxfDEuMjQ2MDExfDExMjE0MXwxLjI0NjAxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxMTQ0OTJ8MS4yNzIxMzN8MTE0NDkyfDEuMjcyMTMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDExNjg0M3wxLjI5ODI1NnwxMTY4NDN8MS4yOTgyNTZ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTE5MTk0fDEuMzI0Mzc4fDExOTE5NHwxLjMyNDM3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxMjE1NDV8MS4zNTA1MDB8MTIxNTQ1fDEuMzUwNTAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCit2aWRlb3wxfDEyMDc2NHwxLjM0MTgyMnwxMTcxNjR8MS4zMDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE0MDk4fDEzMDA5NnxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXwxMjQzNjR8MS4zODE4MjJ8MTIwNzY0fDEuMzQxODIyfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzMyOXwxNDUzMjR8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTI3OTY0fDEuNDIxODIyfDEyNDM2NHwxLjM4MTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTIxMzV8MTYyOTk2fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDEzMTU2NHwxLjQ2MTgyMnwxMjc5NjR8MS40MjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMjgyfDE3NjM0NHxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXwxMzUxNjR8MS41MDE4MjJ8MTMxNTY0fDEuNDYxODIyfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwyNDc4NnwxODk2OTJ8S19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTM4NzY0fDEuNTQxODIyfDEzNTE2NHwxLjUwMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTc0NDB8MjE2Mzg4fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE0MjM2NHwxLjU4MTgyMnwxMzg3NjR8MS41NDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDE1MDE5fDIzNTAwMHxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXwxNDU5NjR8MS42MjE4MjJ8MTQyMzY0fDEuNTgxODIyfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMzQ0OXwyNTEzNTZ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTQ5NTY0fDEuNjYxODIyfDE0NTk2NHwxLjYyMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTIzOTh8MjY2MDIwfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE1MzE2NHwxLjcwMTgyMnwxNDk1NjR8MS42NjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEzNDU1fDI3OTc0NHxfX01QRUdUUyBTdHJlYW0gSUQKKworYXVkaW98MHwxMjM4OTd8MS4zNzY2MzN8MTIzODk3fDEuMzc2NjMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8MzIyNjA4fEtfTVBFR1RTIFN0cmVhbSBJRAorCithdWRpb3wwfDEyNjI0OHwxLjQwMjc1NnwxMjYyNDh8MS40MDI3NTZ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTI4NTk5fDEuNDI4ODc4fDEyODU5OXwxLjQyODg3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxMzA5NTB8MS40NTUwMDB8MTMwOTUwfDEuNDU1MDAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDEzMzMwMXwxLjQ4MTEyMnwxMzMzMDF8MS40ODExMjJ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTM1NjUyfDEuNTA3MjQ0fDEzNTY1MnwxLjUwNzI0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxMzgwMDN8MS41MzMzNjd8MTM4MDAzfDEuNTMzMzY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE0MDM1NHwxLjU1OTQ4OXwxNDAzNTR8MS41NTk0ODl8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTQyNzA1fDEuNTg1NjExfDE0MjcwNXwxLjU4NTYxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNDUwNTZ8MS42MTE3MzN8MTQ1MDU2fDEuNjExNzMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE0NzQwN3wxLjYzNzg1NnwxNDc0MDd8MS42Mzc4NTZ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTQ5NzU4fDEuNjYzOTc4fDE0OTc1OHwxLjY2Mzk3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNTIxMDl8MS42OTAxMDB8MTUyMTA5fDEuNjkwMTAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE1NDQ2MHwxLjcxNjIyMnwxNTQ0NjB8MS43MTYyMjJ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK3ZpZGVvfDF8MTU2NzY0fDEuNzQxODIyfDE1MzE2NHwxLjcwMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTM4MzZ8Mjk0NDA4fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE2MDM2NHwxLjc4MTgyMnwxNTY3NjR8MS43NDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDEyMTYzfDMwOTQ0OHxfX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXwxNjM5NjR8MS44MjE4MjJ8MTYwMzY0fDEuNzgxODIyfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjY5MnwzMjU5OTJ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTY3NTY0fDEuODYxODIyfDE2Mzk2NHwxLjgyMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTA4MjR8MzM5NTI4fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE3MTE2NHwxLjkwMTgyMnwxNjc1NjR8MS44NjE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDExMjg2fDM1MTM3MnxfX01QRUdUUyBTdHJlYW0gSUQKKworYXVkaW98MHwxNTY4MTF8MS43NDIzNDR8MTU2ODExfDEuNzQyMzQ0fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8NDA0NTc2fEtfTVBFR1RTIFN0cmVhbSBJRAorCithdWRpb3wwfDE1OTE2MnwxLjc2ODQ2N3wxNTkxNjJ8MS43Njg0Njd8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTYxNTEzfDEuNzk0NTg5fDE2MTUxM3wxLjc5NDU4OXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNjM4NjR8MS44MjA3MTF8MTYzODY0fDEuODIwNzExfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE2NjIxNXwxLjg0NjgzM3wxNjYyMTV8MS44NDY4MzN8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTY4NTY2fDEuODcyOTU2fDE2ODU2NnwxLjg3Mjk1NnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNzA5MTd8MS44OTkwNzh8MTcwOTE3fDEuODk5MDc4fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE3MzI2OHwxLjkyNTIwMHwxNzMyNjh8MS45MjUyMDB8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTc1NjE5fDEuOTUxMzIyfDE3NTYxOXwxLjk1MTMyMnwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNzc5NzB8MS45Nzc0NDR8MTc3OTcwfDEuOTc3NDQ0fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE4MDMyMXwyLjAwMzU2N3wxODAzMjF8Mi4wMDM1Njd8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK3ZpZGVvfDF8MTc0NzY0fDEuOTQxODIyfDE3MTE2NHwxLjkwMTgyMnwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI2Nzh8MzYzNTkyfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE3ODM2NHwxLjk4MTgyMnwxNzQ3NjR8MS45NDE4MjJ8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0NzExfDM3Nzg4MHxLXwordmlkZW98MXwxMzk1ODJ8MS41NTA5MTF8MTM1OTgyfDEuNTEwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjY5MnwzMjU5OTJ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTQzMTgyfDEuNTkwOTExfDEzOTU4MnwxLjU1MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTA4MjR8MzM5NTI4fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE0Njc4MnwxLjYzMDkxMXwxNDMxODJ8MS41OTA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDExMjg2fDM1MTM3MnxfX01QRUdUUyBTdHJlYW0gSUQKKworYXVkaW98MHwxMzI0Mjl8MS40NzE0MzN8MTMyNDI5fDEuNDcxNDMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8NDA0NTc2fEtfTVBFR1RTIFN0cmVhbSBJRAorCithdWRpb3wwfDEzNDc4MHwxLjQ5NzU1NnwxMzQ3ODB8MS40OTc1NTZ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTM3MTMxfDEuNTIzNjc4fDEzNzEzMXwxLjUyMzY3OHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxMzk0ODJ8MS41NDk4MDB8MTM5NDgyfDEuNTQ5ODAwfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE0MTgzM3wxLjU3NTkyMnwxNDE4MzN8MS41NzU5MjJ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTQ0MTg0fDEuNjAyMDQ0fDE0NDE4NHwxLjYwMjA0NHwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNDY1MzV8MS42MjgxNjd8MTQ2NTM1fDEuNjI4MTY3fDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE0ODg4NnwxLjY1NDI4OXwxNDg4ODZ8MS42NTQyODl8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK2F1ZGlvfDB8MTUxMjM3fDEuNjgwNDExfDE1MTIzN3wxLjY4MDQxMXwyMzUxfDAuMDI2MTIyfE4vQXxOL0F8MjA5fE4vQXxLXworYXVkaW98MHwxNTM1ODh8MS43MDY1MzN8MTUzNTg4fDEuNzA2NTMzfDIzNTF8MC4wMjYxMjJ8Ti9BfE4vQXwyMDl8Ti9BfEtfCithdWRpb3wwfDE1NTkzOXwxLjczMjY1NnwxNTU5Mzl8MS43MzI2NTZ8MjM1MXwwLjAyNjEyMnxOL0F8Ti9BfDIwOXxOL0F8S18KK3ZpZGVvfDF8MTUwMzgyfDEuNjcwOTExfDE0Njc4MnwxLjYzMDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTI2Nzh8MzYzNTkyfF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE1Mzk4MnwxLjcxMDkxMXwxNTAzODJ8MS42NzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0NzExfDM3Nzg4MHxLXwordmlkZW98MXwxNjExODJ8MS43OTA5MTF8MTU3NTgyfDEuNzUwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxMjEzNXwxNjI5OTZ8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTY0NzgyfDEuODMwOTExfDE2MTE4MnwxLjc5MDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTIyODJ8MTc2MzQ0fF9fTVBFR1RTIFN0cmVhbSBJRAorCit2aWRlb3wxfDE2ODM4MnwxLjg3MDkxMXwxNjQ3ODJ8MS44MzA5MTF8MzYwMHwwLjA0MDAwMHxOL0F8Ti9BfDI0Nzg2fDE4OTY5MnxLX01QRUdUUyBTdHJlYW0gSUQKKwordmlkZW98MXwxNzE5ODJ8MS45MTA5MTF8MTY4MzgyfDEuODcwOTExfDM2MDB8MC4wNDAwMDB8Ti9BfE4vQXwxNzQ0MHwyMTYzODh8X19NUEVHVFMgU3RyZWFtIElECisKK3ZpZGVvfDF8MTc1NTgyfDEuOTUwOTExfDE3MTk4MnwxLjkxMDkxMXwzNjAwfDAuMDQwMDAwfE4vQXxOL0F8MTUwMTl8MjM1MDAwfF9fTVBFR1RTIFN0cmVhbSBJRAorCiswfG1wMnx1bmtub3dufGF1ZGlvfDEvNDQxMDB8WzNdWzBdWzBdWzBdfDB4MDAwM3xzMTZwfDQ0MTAwfDF8bW9ub3wwfE4vQXwwLzB8MC8wfDEvOTAwMDB8MHwwLjAwMDAwMHxOL0F8Ti9BfDY0MDAwfE4vQXxOL0F8Ti9BfE4vQXw4OXwwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MAorMXxtcGVnMnZpZGVvfDR8dmlkZW98MS8yNXxbMl1bMF1bMF1bMF18MHgwMDAyfDM1MnwyODh8MHwwfDF8MToxfDExOjl8eXV2NDIwcHw4fHR2fHVua25vd258dW5rbm93bnx1bmtub3dufGxlZnR8cHJvZ3Jlc3NpdmV8Ti9BfDF8Ti9BfDI1LzF8MjUvMXwxLzkwMDAwfE4vQXxOL0F8Ti9BfE4vQXxOL0F8Ti9BfE4vQXxOL0F8Ti9BfDYwfDB8MHwwfDB8MHwwfDB8MHwwfDB8MHwwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jb3B5LXBzcCBiL3Rlc3RzL3JlZi9mYXRlL2NvcHktcHNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWIxNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jb3B5LXBzcApAQCAtMCwwICsxLDI4OCBAQAorY2FkYTYxNDUzYTI0ODNlZjhiYTFmYjgyYzhiYmZmMjUgKnRlc3RzL2RhdGEvZmF0ZS9jb3B5LXBzcC5wc3AKKzIwNDE0MzMgdGVzdHMvZGF0YS9mYXRlL2NvcHktcHNwLnBzcAorI2V4dHJhZGF0YSAwOiAgICAgICA1MSwgMHhhZjZkMTAxMgorI2V4dHJhZGF0YSAxOiAgICAgICAgMiwgMHgwMGIyMDBhMQorI3RiIDA6IDEvOTAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogaDI2NAorI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMy80CisjdGIgMTogMS80ODAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBhYWMKKyNzYW1wbGVfcmF0ZSAxOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDMwMDMsICAgIDM3MDg0LCAweDAyMWEwZDNmCisxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgICAgMTAsIDB4MGUyNzAzOTgKKzEsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI1LCAgICAgICAxMCwgMHgwZjQ3MDNiOAorMCwgICAgICAgMzAwMywgICAgICAgMzAwMywgICAgIDMwMDMsICAgICA2OTI1LCAweDAxMWIzODIyLCBGPTB4MAorMSwgICAgICAgMjA0OSwgICAgICAgMjA0OSwgICAgIDEwMjMsICAgICAgMzM0LCAweDI2NzVhNTVmCisxLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgICAyMzAsIDB4YWUzZjcxNTkKKzAsICAgICAgIDYwMDYsICAgICAgIDYwMDYsICAgICAzMDAzLCAgICAgNzU1NSwgMHgxYmNhNzA1NSwgRj0weDAKKzEsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAxMDI1LCAgICAgIDI2MiwgMHg3NmU5ODY1NworMCwgICAgICAgOTAwOSwgICAgICAgOTAwOSwgICAgIDMwMDMsICAgICA4NzU3LCAweDNhMjBmMWQ5LCBGPTB4MAorMSwgICAgICAgNTEyMSwgICAgICAgNTEyMSwgICAgIDEwMjMsICAgICAgMjMzLCAweDI2MjU3N2ZkCisxLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgICAyMzMsIDB4NzVhYjczYzcKKzAsICAgICAgMTIwMTIsICAgICAgMTIwMTIsICAgICAzMDAzLCAgICAxMzAyNywgMHg0MGUzNjQ0YiwgRj0weDAKKzEsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI1LCAgICAgIDIzNiwgMHg3MDFlNzU3MQorMCwgICAgICAxNTAxNSwgICAgICAxNTAxNSwgICAgIDMwMDMsICAgIDEyOTg3LCAweDQxMTMzNDY1LCBGPTB4MAorMSwgICAgICAgODE5MywgICAgICAgODE5MywgICAgIDEwMjMsICAgICAgMjQ1LCAweDA5Y2Q3N2RkCisxLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgICAyMzEsIDB4YTljYjcwOTQKKzAsICAgICAgMTgwMTgsICAgICAgMTgwMTgsICAgICAzMDAzLCAgICAxMzk4NywgMHgzNjJkNjBjOCwgRj0weDAKKzEsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAxMDI1LCAgICAgIDI0NSwgMHhjOTlkN2EyMworMCwgICAgICAyMTAyMSwgICAgICAyMTAyMSwgICAgIDMwMDMsICAgIDEzOTYzLCAweDliMTEyNGFmLCBGPTB4MAorMSwgICAgICAxMTI2NSwgICAgICAxMTI2NSwgICAgIDEwMjMsICAgICAgMjQzLCAweGJlZWI3OTM1CisxLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgICAyMzgsIDB4ZTRiZDdjZjUKKzAsICAgICAgMjQwMjQsICAgICAgMjQwMjQsICAgICAzMDAzLCAgICAxNTM1MSwgMHhkMjFhYTdhZiwgRj0weDAKKzEsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAxMDI1LCAgICAgIDIzOCwgMHg3ZTliNzVkOAorMSwgICAgICAxNDMzNywgICAgICAxNDMzNywgICAgIDEwMjMsICAgICAgMjQ2LCAweDQ5MTQ3ZmQ4CiswLCAgICAgIDI3MDI3LCAgICAgIDI3MDI3LCAgICAgMzAwMywgICAgMjEwMjEsIDB4OWRmMDIwY2UsIEY9MHgwCisxLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgICAyNDYsIDB4NWEzMTc1ODQKKzAsICAgICAgMzAwMzAsICAgICAgMzAwMzAsICAgICAzMDAzLCAgICAxNDc5MSwgMHg4YmVlOGI3ZCwgRj0weDAKKzEsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAxMDI1LCAgICAgIDIzMSwgMHhmY2IwNzVlOQorMSwgICAgICAxNzQwOSwgICAgICAxNzQwOSwgICAgIDEwMjMsICAgICAgMjMyLCAweGYzMTM2YmVmCiswLCAgICAgIDMzMDMzLCAgICAgIDMzMDMzLCAgICAgMzAwMywgICAgMTE5MjIsIDB4MGIzNjJkM2QsIEY9MHgwCisxLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgICAyMzcsIDB4YWI4Mzc4OTIKKzAsICAgICAgMzYwMzYsICAgICAgMzYwMzYsICAgICAzMDAzLCAgICAxMTIzOSwgMHg3N2ZkZGJmMCwgRj0weDAKKzEsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI1LCAgICAgIDIzMiwgMHgzMTdjNzU2OAorMSwgICAgICAyMDQ4MSwgICAgICAyMDQ4MSwgICAgIDEwMjMsICAgICAgMjM0LCAweDkwNGE3OWJjCiswLCAgICAgIDM5MDM5LCAgICAgIDM5MDM5LCAgICAgMzAwMywgICAgMTc2MjEsIDB4Y2IwYTUyZmUsIEY9MHgwCisxLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTAyNCwgICAgICAyMzcsIDB4MjhlYzdhYzcKKzAsICAgICAgNDIwNDIsICAgICAgNDIwNDIsICAgICAzMDAzLCAgICAxMDY5NCwgMHhjNmI0ZDVmYSwgRj0weDAKKzEsICAgICAgMjI1MjgsICAgICAgMjI1MjgsICAgICAxMDI1LCAgICAgIDIzNCwgMHgxZmQyNzU1ZQorMSwgICAgICAyMzU1MywgICAgICAyMzU1MywgICAgIDEwMjMsICAgICAgMjI5LCAweGRjYWE3OGQwCiswLCAgICAgIDQ1MDQ1LCAgICAgIDQ1MDQ1LCAgICAgMzAwMywgICAgNDUyNDksIDB4NmY2NDIxZWUKKzEsICAgICAgMjQ1NzYsICAgICAgMjQ1NzYsICAgICAxMDI0LCAgICAgIDIzOCwgMHhmYWY2NzNiYworMSwgICAgICAyNTYwMCwgICAgICAyNTYwMCwgICAgIDEwMjUsICAgICAgMjM2LCAweDE2ODY3ZDI0CiswLCAgICAgIDQ4MDQ4LCAgICAgIDQ4MDQ4LCAgICAgMzAwMywgICAgMjA4NDIsIDB4NjUyMWMxNDcsIEY9MHgwCisxLCAgICAgIDI2NjI1LCAgICAgIDI2NjI1LCAgICAgMTAyMywgICAgICAyMzgsIDB4NmVlODdkZTcKKzAsICAgICAgNTEwNTEsICAgICAgNTEwNTEsICAgICAzMDAzLCAgICAyMTQyMywgMHg3YTAxYTA1MiwgRj0weDAKKzEsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAxMDI0LCAgICAgIDIzNCwgMHhmNGVlNmRmMworMSwgICAgICAyODY3MiwgICAgICAyODY3MiwgICAgIDEwMjUsICAgICAgMjM1LCAweGU3Yjg3NzdmCiswLCAgICAgIDU0MDU0LCAgICAgIDU0MDU0LCAgICAgMzAwMywgICAgMTU2NDgsIDB4NmRmZDJmMjksIEY9MHgwCisxLCAgICAgIDI5Njk3LCAgICAgIDI5Njk3LCAgICAgMTAyMywgICAgICAyMzYsIDB4OGMzNjcyODIKKzAsICAgICAgNTcwNTcsICAgICAgNTcwNTcsICAgICAzMDAzLCAgICAxMTk2MSwgMHg5NzE0MzlmNiwgRj0weDAKKzEsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAxMDI0LCAgICAgIDIzOSwgMHgzYmU4Nzc1NgorMSwgICAgICAzMTc0NCwgICAgICAzMTc0NCwgICAgIDEwMjUsICAgICAgMjQzLCAweDFiYmI3MjdiCiswLCAgICAgIDYwMDYwLCAgICAgIDYwMDYwLCAgICAgMzAwMywgICAgMTUzOTgsIDB4OTNlZGQ5OTksIEY9MHgwCisxLCAgICAgIDMyNzY5LCAgICAgIDMyNzY5LCAgICAgMTAyMywgICAgICAyNDIsIDB4YjFjNzc0NmYKKzAsICAgICAgNjMwNjMsICAgICAgNjMwNjMsICAgICAzMDAzLCAgICAxNDg0NCwgMHg4MzgxMTgzMSwgRj0weDAKKzEsICAgICAgMzM3OTIsICAgICAgMzM3OTIsICAgICAxMDI0LCAgICAgIDIzNywgMHhlMWM5N2FkZAorMSwgICAgICAzNDgxNiwgICAgICAzNDgxNiwgICAgIDEwMjUsICAgICAgMjM1LCAweGNlNzE2ZjlhCiswLCAgICAgIDY2MDY2LCAgICAgIDY2MDY2LCAgICAgMzAwMywgICAgMTQ1ODUsIDB4ZGQ4NTVjYjgsIEY9MHgwCisxLCAgICAgIDM1ODQxLCAgICAgIDM1ODQxLCAgICAgMTAyMywgICAgICAyMzcsIDB4MTU2OTc1NzYKKzAsICAgICAgNjkwNjksICAgICAgNjkwNjksICAgICAzMDAzLCAgICAxNzU3NiwgMHhiN2Y2MThiYywgRj0weDAKKzEsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxMDI0LCAgICAgIDIzNywgMHgxNzdjNzMwZgorMSwgICAgICAzNzg4OCwgICAgICAzNzg4OCwgICAgIDEwMjUsICAgICAgMjM2LCAweDI0N2I2Y2I1CiswLCAgICAgIDcyMDcyLCAgICAgIDcyMDcyLCAgICAgMzAwMywgICAgMTU2MjYsIDB4M2RjZDU5YTQsIEY9MHgwCisxLCAgICAgIDM4OTEzLCAgICAgIDM4OTEzLCAgICAgMTAyMywgICAgICAyNDEsIDB4MDRiNjczZDAKKzEsICAgICAgMzk5MzYsICAgICAgMzk5MzYsICAgICAxMDI0LCAgICAgIDIzNSwgMHg4ZjAzNzA5NworMCwgICAgICA3NTA3NSwgICAgICA3NTA3NSwgICAgIDMwMDMsICAgIDEzNjU4LCAweGRmY2NhZGRlLCBGPTB4MAorMSwgICAgICA0MDk2MCwgICAgICA0MDk2MCwgICAgIDEwMjUsICAgICAgMjQwLCAweDJmYzM3MDAwCiswLCAgICAgIDc4MDc4LCAgICAgIDc4MDc4LCAgICAgMzAwMywgICAgMTYyNzksIDB4MjgwZmIzNTMsIEY9MHgwCisxLCAgICAgIDQxOTg1LCAgICAgIDQxOTg1LCAgICAgMTAyMywgICAgICAyNDEsIDB4ZDY2NDdkZDQKKzEsICAgICAgNDMwMDgsICAgICAgNDMwMDgsICAgICAxMDI0LCAgICAgIDI1OCwgMHhmMGQ5ODEyZAorMCwgICAgICA4MTA4MSwgICAgICA4MTA4MSwgICAgIDMwMDMsICAgIDEzMTM1LCAweGEyMGFiZGYwLCBGPTB4MAorMSwgICAgICA0NDAzMiwgICAgICA0NDAzMiwgICAgIDEwMjUsICAgICAgMjM4LCAweDc5ZTc3NmU3CiswLCAgICAgIDg0MDg0LCAgICAgIDg0MDg0LCAgICAgMzAwMywgICAgMTYxODUsIDB4ODExNDhiZDMsIEY9MHgwCisxLCAgICAgIDQ1MDU3LCAgICAgIDQ1MDU3LCAgICAgMTAyMywgICAgICAyMzcsIDB4MTI4MzcyNzMKKzEsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxMDI0LCAgICAgIDIzNiwgMHhlNTM3NzlhNworMCwgICAgICA4NzA4NywgICAgICA4NzA4NywgICAgIDMwMDMsICAgIDE0OTY2LCAweGU4ZTZmNmYzLCBGPTB4MAorMSwgICAgICA0NzEwNCwgICAgICA0NzEwNCwgICAgIDEwMjUsICAgICAgMjM1LCAweGJlMmY2ZjBlCiswLCAgICAgIDkwMDkwLCAgICAgIDkwMDkwLCAgICAgMzAwMywgICAgNTQyNTQsIDB4MWE3YzI2MzUKKzEsICAgICAgNDgxMjksICAgICAgNDgxMjksICAgICAxMDIzLCAgICAgIDIzOCwgMHg2MTc1NzQ0OQorMSwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDEwMjQsICAgICAgMjM0LCAweDdlMDA2ZWMyCiswLCAgICAgIDkzMDkzLCAgICAgIDkzMDkzLCAgICAgMzAwMywgICAgMTE1MDUsIDB4YjQwZDU0YzcsIEY9MHgwCisxLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgMTAyNSwgICAgICAyMzUsIDB4YjBmNDY5MjcKKzEsICAgICAgNTEyMDEsICAgICAgNTEyMDEsICAgICAxMDIzLCAgICAgIDIzNywgMHg4ZGIyNzY3YQorMCwgICAgICA5NjA5NiwgICAgICA5NjA5NiwgICAgIDMwMDMsICAgIDEyMDcwLCAweDgwMjc1NmY4LCBGPTB4MAorMSwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDEwMjQsICAgICAgMjM2LCAweDg3MDg3NzVhCiswLCAgICAgIDk5MDk5LCAgICAgIDk5MDk5LCAgICAgMzAwMywgICAgMTI1MzcsIDB4MmI0MDM4ZGMsIEY9MHgwCisxLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNSwgICAgICAyMzgsIDB4ZTM0MzdhMWIKKzEsICAgICAgNTQyNzMsICAgICAgNTQyNzMsICAgICAxMDIzLCAgICAgIDIzMywgMHg2YTY2NzI1ZAorMCwgICAgIDEwMjEwMiwgICAgIDEwMjEwMiwgICAgIDMwMDMsICAgIDE2Mjg5LCAweGI1NDI4ODIxLCBGPTB4MAorMSwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDEwMjQsICAgICAgMjMxLCAweGIyNGY3MzQwCiswLCAgICAgMTA1MTA1LCAgICAgMTA1MTA1LCAgICAgMzAwMywgICAgMTc2NjIsIDB4NDQ1ODVhZWYsIEY9MHgwCisxLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgMTAyNSwgICAgICAyNDMsIDB4OGZiMTdhN2YKKzEsICAgICAgNTczNDUsICAgICAgNTczNDUsICAgICAxMDIzLCAgICAgIDI0MCwgMHg5NjFmN2Q4ZQorMCwgICAgIDEwODEwOCwgICAgIDEwODEwOCwgICAgIDMwMDMsICAgIDIxMzQxLCAweGJkNDg1NDkyLCBGPTB4MAorMSwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgIDEwMjQsICAgICAgMjQwLCAweDU3OTM3NDI1CiswLCAgICAgMTExMTExLCAgICAgMTExMTExLCAgICAgMzAwMywgICAgMTg1NTQsIDB4YWZiNjQ1OTEsIEY9MHgwCisxLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMTAyNSwgICAgICAyMzgsIDB4MDk5MDc2NjYKKzEsICAgICAgNjA0MTcsICAgICAgNjA0MTcsICAgICAxMDIzLCAgICAgIDIzOSwgMHgwYmRhODMwZgorMCwgICAgIDExNDExNCwgICAgIDExNDExNCwgICAgIDMwMDMsICAgIDE0MzU2LCAweGRlZTdkM2ViLCBGPTB4MAorMSwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDEwMjQsICAgICAgMjM3LCAweDU3YzA3YjMxCiswLCAgICAgMTE3MTE3LCAgICAgMTE3MTE3LCAgICAgMzAwMywgICAgMTUyMTAsIDB4MDUyOGJiMTQsIEY9MHgwCisxLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNSwgICAgICAyMzIsIDB4NmE0NjZmY2EKKzEsICAgICAgNjM0ODksICAgICAgNjM0ODksICAgICAxMDIzLCAgICAgIDIzMywgMHg4ZjRiNmJhYQorMCwgICAgIDEyMDEyMCwgICAgIDEyMDEyMCwgICAgIDMwMDMsICAgIDE4MDQ1LCAweGRhZGRmNGE1LCBGPTB4MAorMSwgICAgICA2NDUxMiwgICAgICA2NDUxMiwgICAgIDEwMjQsICAgICAgMjI3LCAweDFiNjk2YzljCisxLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMTAyNSwgICAgICAyMzYsIDB4ZTAxZDcyNjIKKzAsICAgICAxMjMxMjMsICAgICAxMjMxMjMsICAgICAzMDAzLCAgICAxNTkyMiwgMHhjMjliMjdkMCwgRj0weDAKKzEsICAgICAgNjY1NjEsICAgICAgNjY1NjEsICAgICAxMDIzLCAgICAgIDI0MCwgMHhjZDBlNzgyZQorMCwgICAgIDEyNjEyNiwgICAgIDEyNjEyNiwgICAgIDMwMDMsICAgIDEzMjU1LCAweGIwYjBlMDkzLCBGPTB4MAorMSwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgIDEwMjQsICAgICAgMjM2LCAweDA0MmU3Yjg4CisxLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgMTAyNSwgICAgICAyMzgsIDB4ZTJjNDc3NjgKKzAsICAgICAxMjkxMjksICAgICAxMjkxMjksICAgICAzMDAzLCAgICAxMzM2NSwgMHhhZDg2ZDZiZiwgRj0weDAKKzEsICAgICAgNjk2MzMsICAgICAgNjk2MzMsICAgICAxMDIzLCAgICAgIDIzNiwgMHgwZWQ0Nzc5NgorMCwgICAgIDEzMjEzMiwgICAgIDEzMjEzMiwgICAgIDMwMDMsICAgIDExNzU0LCAweDdkMDZlZGU4LCBGPTB4MAorMSwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDEwMjQsICAgICAgMjM5LCAweDczNzE3NTdlCisxLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNSwgICAgICAyMzQsIDB4MjA5Njc1MmUKKzAsICAgICAxMzUxMzUsICAgICAxMzUxMzUsICAgICAzMDAzLCAgICAyMzk1NSwgMHhkMjFjY2EzYgorMSwgICAgICA3MjcwNSwgICAgICA3MjcwNSwgICAgIDEwMjMsICAgICAgMjMzLCAweDU5ZTc3N2ZiCiswLCAgICAgMTM4MTM4LCAgICAgMTM4MTM4LCAgICAgMzAwMywgICAgMTYwNzAsIDB4NzRiMjE2OWQsIEY9MHgwCisxLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTAyNCwgICAgICAyMzksIDB4MWM2NDcwYmEKKzEsICAgICAgNzQ3NTIsICAgICAgNzQ3NTIsICAgICAxMDI1LCAgICAgIDIzNiwgMHhmZTgwNmRhMworMCwgICAgIDE0MTE0MSwgICAgIDE0MTE0MSwgICAgIDMwMDMsICAgIDE2NDQ2LCAweDM0OTUwNzZlLCBGPTB4MAorMSwgICAgICA3NTc3NywgICAgICA3NTc3NywgICAgIDEwMjMsICAgICAgMjQwLCAweDJhZDE3MThhCisxLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgICAyMzYsIDB4MDRiMDdlNTAKKzAsICAgICAxNDQxNDQsICAgICAxNDQxNDQsICAgICAzMDAzLCAgICAxNzQwMCwgMHgxY2MzZWZkZCwgRj0weDAKKzEsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAxMDI1LCAgICAgIDIzNiwgMHg3N2FkNmYwZQorMCwgICAgIDE0NzE0NywgICAgIDE0NzE0NywgICAgIDMwMDMsICAgIDIyMzAwLCAweDMyYTAzZmJhLCBGPTB4MAorMSwgICAgICA3ODg0OSwgICAgICA3ODg0OSwgICAgIDEwMjMsICAgICAgMjQxLCAweDk0OTI3NTM3CisxLCAgICAgIDc5ODcyLCAgICAgIDc5ODcyLCAgICAgMTAyNCwgICAgICAyMzUsIDB4NjI5YTZmYmQKKzAsICAgICAxNTAxNTAsICAgICAxNTAxNTAsICAgICAzMDAzLCAgICAyMjc4MywgMHhlZjIxMjUwNiwgRj0weDAKKzEsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAxMDI1LCAgICAgIDIzOSwgMHgwOWY2NzlhMgorMCwgICAgIDE1MzE1MywgICAgIDE1MzE1MywgICAgIDMwMDMsICAgIDIwNTk1LCAweGIyZjRiNTZkLCBGPTB4MAorMSwgICAgICA4MTkyMSwgICAgICA4MTkyMSwgICAgIDEwMjMsICAgICAgMjM3LCAweGEzNjQ3NGQ1CisxLCAgICAgIDgyOTQ0LCAgICAgIDgyOTQ0LCAgICAgMTAyNCwgICAgICAyMzUsIDB4ZDI2YTcwZTcKKzAsICAgICAxNTYxNTYsICAgICAxNTYxNTYsICAgICAzMDAzLCAgICAxOTk0MiwgMHgwYzRjZTBiOCwgRj0weDAKKzEsICAgICAgODM5NjgsICAgICAgODM5NjgsICAgICAxMDI1LCAgICAgIDIzOCwgMHhkOTVkNzFkOQorMCwgICAgIDE1OTE1OSwgICAgIDE1OTE1OSwgICAgIDMwMDMsICAgIDIzODM4LCAweGM1MGY5NDI2LCBGPTB4MAorMSwgICAgICA4NDk5MywgICAgICA4NDk5MywgICAgIDEwMjMsICAgICAgMjM3LCAweDExZWU3Zjg3CisxLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgICAyMzksIDB4NDAxMjc2NTIKKzAsICAgICAxNjIxNjIsICAgICAxNjIxNjIsICAgICAzMDAzLCAgICAxNzk3NCwgMHhhODc4ZDhkNiwgRj0weDAKKzEsICAgICAgODcwNDAsICAgICAgODcwNDAsICAgICAxMDI1LCAgICAgIDIzMywgMHg1ODc1NzQ1NgorMSwgICAgICA4ODA2NSwgICAgICA4ODA2NSwgICAgIDEwMjMsICAgICAgMjQyLCAweGZmNWY3NmY3CiswLCAgICAgMTY1MTY1LCAgICAgMTY1MTY1LCAgICAgMzAwMywgICAgMTY2NTAsIDB4MTIyYjMyYzQsIEY9MHgwCisxLCAgICAgIDg5MDg4LCAgICAgIDg5MDg4LCAgICAgMTAyNCwgICAgICAyMzgsIDB4MTVjMTczYzgKKzAsICAgICAxNjgxNjgsICAgICAxNjgxNjgsICAgICAzMDAzLCAgICAxNTMxMiwgMHgxMzNhYWU3OSwgRj0weDAKKzEsICAgICAgOTAxMTIsICAgICAgOTAxMTIsICAgICAxMDI1LCAgICAgIDIzOCwgMHgxNDBmNzliYQorMSwgICAgICA5MTEzNywgICAgICA5MTEzNywgICAgIDEwMjMsICAgICAgMjMzLCAweGRlOWI3NjljCiswLCAgICAgMTcxMTcxLCAgICAgMTcxMTcxLCAgICAgMzAwMywgICAgMTM3NTMsIDB4ZGI1OGIwODMsIEY9MHgwCisxLCAgICAgIDkyMTYwLCAgICAgIDkyMTYwLCAgICAgMTAyNCwgICAgICAyMzcsIDB4MGQ5OTc5YTAKKzAsICAgICAxNzQxNzQsICAgICAxNzQxNzQsICAgICAzMDAzLCAgICAxNTA5NywgMHg2M2ZmMzg0YiwgRj0weDAKKzEsICAgICAgOTMxODQsICAgICAgOTMxODQsICAgICAxMDI1LCAgICAgIDIzOCwgMHg4N2JmNzdhOQorMSwgICAgICA5NDIwOSwgICAgICA5NDIwOSwgICAgIDEwMjMsICAgICAgMjM5LCAweDFhMTk3ZTEyCiswLCAgICAgMTc3MTc3LCAgICAgMTc3MTc3LCAgICAgMzAwMywgICAgMTQ2NDEsIDB4YWZlMDhjYjYsIEY9MHgwCisxLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTAyNCwgICAgICAyMzksIDB4MjJlZjc5OTUKKzAsICAgICAxODAxODAsICAgICAxODAxODAsICAgICAzMDAzLCAgICAyOTA5MiwgMHgwYjQyYjNiMworMSwgICAgICA5NjI1NiwgICAgICA5NjI1NiwgICAgIDEwMjUsICAgICAgMjM0LCAweGQ0YTk3OTRjCisxLCAgICAgIDk3MjgxLCAgICAgIDk3MjgxLCAgICAgMTAyMywgICAgICAyMzQsIDB4NjEzNzdhZWEKKzAsICAgICAxODMxODMsICAgICAxODMxODMsICAgICAzMDAzLCAgICAxMDIzNywgMHg1MDViZTM2MCwgRj0weDAKKzEsICAgICAgOTgzMDQsICAgICAgOTgzMDQsICAgICAxMDI0LCAgICAgIDIzMCwgMHg2YzllNzI5NAorMCwgICAgIDE4NjE4NiwgICAgIDE4NjE4NiwgICAgIDMwMDMsICAgICA5Nzc0LCAweGJmMTRiYTJkLCBGPTB4MAorMSwgICAgICA5OTMyOCwgICAgICA5OTMyOCwgICAgIDEwMjUsICAgICAgMjM3LCAweDZjYWE3YjIzCisxLCAgICAgMTAwMzUzLCAgICAgMTAwMzUzLCAgICAgMTAyMywgICAgICAyMzcsIDB4NDIxOTZmZjgKKzAsICAgICAxODkxODksICAgICAxODkxODksICAgICAzMDAzLCAgICAxNDQ1OSwgMHg0ZGNiMGY1MiwgRj0weDAKKzEsICAgICAxMDEzNzYsICAgICAxMDEzNzYsICAgICAxMDI0LCAgICAgIDIzOCwgMHhiYjk2NzQzZAorMSwgICAgIDEwMjQwMCwgICAgIDEwMjQwMCwgICAgIDEwMjUsICAgICAgMjM2LCAweDRlNWY3YjUyCiswLCAgICAgMTkyMTkyLCAgICAgMTkyMTkyLCAgICAgMzAwMywgICAgMTQ0ODYsIDB4ZTExNTE4MTAsIEY9MHgwCisxLCAgICAgMTAzNDI1LCAgICAgMTAzNDI1LCAgICAgMTAyMywgICAgICAyMzgsIDB4MmQxODc4YWYKKzAsICAgICAxOTUxOTUsICAgICAxOTUxOTUsICAgICAzMDAzLCAgICAxMzQ0NCwgMHg5NTQ4NzE4MywgRj0weDAKKzEsICAgICAxMDQ0NDgsICAgICAxMDQ0NDgsICAgICAxMDI0LCAgICAgIDIzNywgMHg0MjA3N2NkNAorMSwgICAgIDEwNTQ3MiwgICAgIDEwNTQ3MiwgICAgIDEwMjUsICAgICAgMjM4LCAweDM0ZDQ3M2ZlCiswLCAgICAgMTk4MTk4LCAgICAgMTk4MTk4LCAgICAgMzAwMywgICAgMTM1NDgsIDB4OTgzNzZiZGEsIEY9MHgwCisxLCAgICAgMTA2NDk3LCAgICAgMTA2NDk3LCAgICAgMTAyMywgICAgICAyMzcsIDB4ZTNhNjc1ZmQKKzAsICAgICAyMDEyMDEsICAgICAyMDEyMDEsICAgICAzMDAzLCAgICAxNjAxNywgMHhlYWNiMzVlMSwgRj0weDAKKzEsICAgICAxMDc1MjAsICAgICAxMDc1MjAsICAgICAxMDI0LCAgICAgIDIzNywgMHhmMjNkN2U0ZQorMSwgICAgIDEwODU0NCwgICAgIDEwODU0NCwgICAgIDEwMjUsICAgICAgMjM3LCAweGFlYjQ3YjRhCiswLCAgICAgMjA0MjA0LCAgICAgMjA0MjA0LCAgICAgMzAwMywgICAgMTU3NzQsIDB4OTE3OGE0NDQsIEY9MHgwCisxLCAgICAgMTA5NTY5LCAgICAgMTA5NTY5LCAgICAgMTAyMywgICAgICAyMzMsIDB4ZDczYzdkMGIKKzAsICAgICAyMDcyMDcsICAgICAyMDcyMDcsICAgICAzMDAzLCAgICAxNDIxMywgMHhmYmFmYjA2ZSwgRj0weDAKKzEsICAgICAxMTA1OTIsICAgICAxMTA1OTIsICAgICAxMDI0LCAgICAgIDIzMSwgMHg4MmZiN2IzOQorMSwgICAgIDExMTYxNiwgICAgIDExMTYxNiwgICAgIDEwMjUsICAgICAgMjM3LCAweDg3N2Q3ODMwCiswLCAgICAgMjEwMjEwLCAgICAgMjEwMjEwLCAgICAgMzAwMywgICAgMTE0ODQsIDB4ZGNmYjRkM2UsIEY9MHgwCisxLCAgICAgMTEyNjQxLCAgICAgMTEyNjQxLCAgICAgMTAyMywgICAgICAyMzgsIDB4YTY2ODdmNzgKKzEsICAgICAxMTM2NjQsICAgICAxMTM2NjQsICAgICAxMDI0LCAgICAgIDIzNSwgMHg5ZDJiNzA0ZAorMCwgICAgIDIxMzIxMywgICAgIDIxMzIxMywgICAgIDMwMDMsICAgIDExMTM1LCAweDYzNTM5ODI1LCBGPTB4MAorMSwgICAgIDExNDY4OCwgICAgIDExNDY4OCwgICAgIDEwMjUsICAgICAgMjMwLCAweDBjNWE3MTBhCiswLCAgICAgMjE2MjE2LCAgICAgMjE2MjE2LCAgICAgMzAwMywgICAgMTQ4MDYsIDB4YTgzOGUyMDYsIEY9MHgwCisxLCAgICAgMTE1NzEzLCAgICAgMTE1NzEzLCAgICAgMTAyMywgICAgICAyMzcsIDB4NzI4YTcyODQKKzEsICAgICAxMTY3MzYsICAgICAxMTY3MzYsICAgICAxMDI0LCAgICAgIDIzNCwgMHg1MjRiNzc4OQorMCwgICAgIDIxOTIxOSwgICAgIDIxOTIxOSwgICAgIDMwMDMsICAgIDE3MzA4LCAweDVlN2JmZWYxLCBGPTB4MAorMSwgICAgIDExNzc2MCwgICAgIDExNzc2MCwgICAgIDEwMjUsICAgICAgMjM5LCAweDcwMDg3YzIxCiswLCAgICAgMjIyMjIyLCAgICAgMjIyMjIyLCAgICAgMzAwMywgICAgMTc2ODMsIDB4NTcwYTY0NzgsIEY9MHgwCisxLCAgICAgMTE4Nzg1LCAgICAgMTE4Nzg1LCAgICAgMTAyMywgICAgICAyMzYsIDB4MWRlOTdiMTEKKzEsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxMDI0LCAgICAgIDIzNCwgMHg4ZDNmNzk2NQorMCwgICAgIDIyNTIyNSwgICAgIDIyNTIyNSwgICAgIDMwMDMsICAgIDQ4NjMwLCAweDA2OWVjNDdmCisxLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMTAyNSwgICAgICAyNDIsIDB4ZTUzMzc5MTkKKzAsICAgICAyMjgyMjgsICAgICAyMjgyMjgsICAgICAzMDAzLCAgICAxMTg5OSwgMHgxNjI3MDE2NiwgRj0weDAKKzEsICAgICAxMjE4NTcsICAgICAxMjE4NTcsICAgICAxMDIzLCAgICAgIDI0OSwgMHhlZDEzNzNhNQorMSwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgIDEwMjQsICAgICAgMjM2LCAweGNhMjQ3NTQxCiswLCAgICAgMjMxMjMxLCAgICAgMjMxMjMxLCAgICAgMzAwMywgICAgMTY1MTksIDB4YjYyMGYwYWIsIEY9MHgwCisxLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNSwgICAgICAyMzYsIDB4Mjg5YTc3OTgKKzAsICAgICAyMzQyMzQsICAgICAyMzQyMzQsICAgICAzMDAzLCAgICAxMzA0OSwgMHgwNTFmNTJhYiwgRj0weDAKKzEsICAgICAxMjQ5MjksICAgICAxMjQ5MjksICAgICAxMDIzLCAgICAgIDI0MCwgMHhmMWZlNzlmYworMSwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgIDEwMjQsICAgICAgMjQ4LCAweGM1MzQ4NDc2CiswLCAgICAgMjM3MjM3LCAgICAgMjM3MjM3LCAgICAgMzAwMywgICAgMTYxNjAsIDB4YTIxMjk3YzksIEY9MHgwCisxLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMTAyNSwgICAgICAyMzUsIDB4NGY4OTcwNDYKKzEsICAgICAxMjgwMDEsICAgICAxMjgwMDEsICAgICAxMDIzLCAgICAgIDIzNSwgMHg3ZWZjN2FmMAorMCwgICAgIDI0MDI0MCwgICAgIDI0MDI0MCwgICAgIDMwMDMsICAgIDEyOTU1LCAweGJmOTJmN2IzLCBGPTB4MAorMSwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgIDEwMjQsICAgICAgMjM1LCAweDhkNjY3ODBiCiswLCAgICAgMjQzMjQzLCAgICAgMjQzMjQzLCAgICAgMzAwMywgICAgMTc4NzUsIDB4NjFiNWEzMzIsIEY9MHgwCisxLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgMTAyNSwgICAgICAyMzYsIDB4ODhjZDc2ODQKKzEsICAgICAxMzEwNzMsICAgICAxMzEwNzMsICAgICAxMDIzLCAgICAgIDIzNSwgMHhkZDYwNzA5YworMCwgICAgIDI0NjI0NiwgICAgIDI0NjI0NiwgICAgIDMwMDMsICAgIDEzMTk3LCAweGJhMGRhMDM5LCBGPTB4MAorMSwgICAgIDEzMjA5NiwgICAgIDEzMjA5NiwgICAgIDEwMjQsICAgICAgMjQwLCAweDE0MDU3OGVlCiswLCAgICAgMjQ5MjQ5LCAgICAgMjQ5MjQ5LCAgICAgMzAwMywgICAgMjU1NjQsIDB4MmFlZmMxZWEsIEY9MHgwCisxLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNSwgICAgICAyMzUsIDB4YzI0NTc5ZTAKKzEsICAgICAxMzQxNDUsICAgICAxMzQxNDUsICAgICAxMDIzLCAgICAgIDIzMywgMHhjZTFmNzMwMgorMCwgICAgIDI1MjI1MiwgICAgIDI1MjI1MiwgICAgIDMwMDMsICAgIDE0NzAwLCAweDA0NTJlYmRmLCBGPTB4MAorMSwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDEwMjQsICAgICAgMjMzLCAweDBhYWI3OTg2CiswLCAgICAgMjU1MjU1LCAgICAgMjU1MjU1LCAgICAgMzAwMywgICAgMTU0ODksIDB4NmIzYWQzNmYsIEY9MHgwCisxLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgMTAyNSwgICAgICAyMzcsIDB4YjBjMTcyZmUKKzEsICAgICAxMzcyMTcsICAgICAxMzcyMTcsICAgICAxMDIzLCAgICAgIDIzMiwgMHg5NTg0NzIxMgorMCwgICAgIDI1ODI1OCwgICAgIDI1ODI1OCwgICAgIDMwMDMsICAgIDE3MTAxLCAweDhiZTYzZTM3LCBGPTB4MAorMSwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDEwMjQsICAgICAgMjM0LCAweDc4MDk3NWJjCisxLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMTAyNSwgICAgICAyMzksIDB4ZjEyYTdkMzQKKzAsICAgICAyNjEyNjEsICAgICAyNjEyNjEsICAgICAzMDAzLCAgICAxMjIxMywgMHhjZWY3ODk4NSwgRj0weDAKKzEsICAgICAxNDAyODksICAgICAxNDAyODksICAgICAxMDIzLCAgICAgIDI0MCwgMHg3YTZkNzZlZQorMCwgICAgIDI2NDI2NCwgICAgIDI2NDI2NCwgICAgIDMwMDMsICAgIDE0NzE0LCAweDhiNWNjMDk3LCBGPTB4MAorMSwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgIDEwMjQsICAgICAgMjMzLCAweGVjODM3OTA1CisxLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNSwgICAgICAyMzcsIDB4YzhlZDZmMjQKKzAsICAgICAyNjcyNjcsICAgICAyNjcyNjcsICAgICAzMDAzLCAgICAxNDM5NSwgMHhiYTdmZTE5NSwgRj0weDAKKzEsICAgICAxNDMzNjEsICAgICAxNDMzNjEsICAgICAxMDIzLCAgICAgIDIzNywgMHhiZWI4N2NkMworMCwgICAgIDI3MDI3MCwgICAgIDI3MDI3MCwgICAgIDMwMDMsICAgIDM3MTk0LCAweDFjMzQxYTEyCisxLCAgICAgMTQ0Mzg0LCAgICAgMTQ0Mzg0LCAgICAgMTAyNCwgICAgICAyMzIsIDB4YzgwYTc0MWMKKzEsICAgICAxNDU0MDgsICAgICAxNDU0MDgsICAgICAxMDI1LCAgICAgIDIzNSwgMHg5NGYwN2IwMAorMCwgICAgIDI3MzI3MywgICAgIDI3MzI3MywgICAgIDMwMDMsICAgIDE0MDYxLCAweGE1YzE0ZjdmLCBGPTB4MAorMSwgICAgIDE0NjQzMywgICAgIDE0NjQzMywgICAgIDEwMjMsICAgICAgMjM4LCAweDI0Y2E3Y2I0CiswLCAgICAgMjc2Mjc2LCAgICAgMjc2Mjc2LCAgICAgMzAwMywgICAgMTk0NDMsIDB4YTdiYmRlZjQsIEY9MHgwCisxLCAgICAgMTQ3NDU2LCAgICAgMTQ3NDU2LCAgICAgMTAyNCwgICAgICAyMzYsIDB4NDMzODdkOTkKKzEsICAgICAxNDg0ODAsICAgICAxNDg0ODAsICAgICAxMDI1LCAgICAgIDIzNiwgMHg4NzY2NzcyZgorMCwgICAgIDI3OTI3OSwgICAgIDI3OTI3OSwgICAgIDMwMDMsICAgIDIxNzMzLCAweGRhZDQ0YzJiLCBGPTB4MAorMSwgICAgIDE0OTUwNSwgICAgIDE0OTUwNSwgICAgIDEwMjMsICAgICAgMjM1LCAweGM0ZDc3MzY5CisxLCAgICAgMTUwNTI4LCAgICAgMTUwNTI4LCAgICAgMTAyNCwgICAgICAyMzQsIDB4OGY4MTcyMzcKKzAsICAgICAyODIyODIsICAgICAyODIyODIsICAgICAzMDAzLCAgICAxNzk3MSwgMHg3ZGVjY2JlMSwgRj0weDAKKzEsICAgICAxNTE1NTIsICAgICAxNTE1NTIsICAgICAxMDI1LCAgICAgIDIzNCwgMHhjNTMzNzQ2NAorMCwgICAgIDI4NTI4NSwgICAgIDI4NTI4NSwgICAgIDMwMDMsICAgIDE0ODczLCAweDYxN2ZiM2YxLCBGPTB4MAorMSwgICAgIDE1MjU3NywgICAgIDE1MjU3NywgICAgIDEwMjMsICAgICAgMjM4LCAweDBmZGM3YjRmCisxLCAgICAgMTUzNjAwLCAgICAgMTUzNjAwLCAgICAgMTAyNCwgICAgICAyMzQsIDB4MGNhMDgwNzIKKzAsICAgICAyODgyODgsICAgICAyODgyODgsICAgICAzMDAzLCAgICAxNTYxMywgMHg4YTI5Mzk5OCwgRj0weDAKKzEsICAgICAxNTQ2MjQsICAgICAxNTQ2MjQsICAgICAxMDI1LCAgICAgIDIzNCwgMHhhMDhmNzdjYworMCwgICAgIDI5MTI5MSwgICAgIDI5MTI5MSwgICAgIDMwMDMsICAgIDEyNDg5LCAweGJmYmExMzEzLCBGPTB4MAorMSwgICAgIDE1NTY0OSwgICAgIDE1NTY0OSwgICAgIDEwMjMsICAgICAgMjMxLCAweGFiMjU3MDQyCiswLCAgICAgMjk0Mjk0LCAgICAgMjk0Mjk0LCAgICAgMzAwMywgICAgMTgyMzEsIDB4YWFhYTkxNTcsIEY9MHgwCiswLCAgICAgMjk3Mjk3LCAgICAgMjk3Mjk3LCAgICAgMzAwMywgICAgMTkyMDQsIDB4MThjNTRlYzEsIEY9MHgwCiswLCAgICAgMzAwMzAwLCAgICAgMzAwMzAwLCAgICAgMzAwMywgICAgMTkwNDcsIDB4NmNiM2U5MDAsIEY9MHgwCiswLCAgICAgMzAzMzAzLCAgICAgMzAzMzAzLCAgICAgMzAwMywgICAgMTU2NjcsIDB4NzRlMTMzZWEsIEY9MHgwCiswLCAgICAgMzA2MzA2LCAgICAgMzA2MzA2LCAgICAgMzAwMywgICAgMTY4ODMsIDB4MzlhY2JjZjcsIEY9MHgwCiswLCAgICAgMzA5MzA5LCAgICAgMzA5MzA5LCAgICAgMzAwMywgICAgMTQ2OTAsIDB4YTg3ODhmZTAsIEY9MHgwCiswLCAgICAgMzEyMzEyLCAgICAgMzEyMzEyLCAgICAgMzAwMywgICAgMTMxMzIsIDB4ZTg5NThiN2IsIEY9MHgwCiswLCAgICAgMzE1MzE1LCAgICAgMzE1MzE1LCAgICAgMzAwMywgICAgMjkzNDgsIDB4NTRiZmUzMDcKKzAsICAgICAzMTgzMTgsICAgICAzMTgzMTgsICAgICAzMDAzLCAgICAxMjU4MSwgMHgxOWU1NjEyMiwgRj0weDAKKzAsICAgICAzMjEzMjEsICAgICAzMjEzMjEsICAgICAzMDAzLCAgICAxMjYwNCwgMHhlYzBkOWQwNSwgRj0weDAKKzAsICAgICAzMjQzMjQsICAgICAzMjQzMjQsICAgICAzMDAzLCAgICAxNjEzOSwgMHgzYTZjNmY2OSwgRj0weDAKKzAsICAgICAzMjczMjcsICAgICAzMjczMjcsICAgICAzMDAzLCAgICAxNTYzNSwgMHgxZDI5NWM1ZSwgRj0weDAKKzAsICAgICAzMzAzMzAsICAgICAzMzAzMzAsICAgICAzMDAzLCAgICAxMzA5MiwgMHhkOTU4ODlhNSwgRj0weDAKKzAsICAgICAzMzMzMzMsICAgICAzMzMzMzMsICAgICAzMDAzLCAgICAxMDczMywgMHgyNGZiMTJmMSwgRj0weDAKKzAsICAgICAzMzYzMzYsICAgICAzMzYzMzYsICAgICAzMDAzLCAgICAxMDM1OCwgMHhkYmY5Mzc4NCwgRj0weDAKKzAsICAgICAzMzkzMzksICAgICAzMzkzMzksICAgICAzMDAzLCAgICAgOTUzOSwgMHg1Yzk5ODUzZSwgRj0weDAKKzAsICAgICAzNDIzNDIsICAgICAzNDIzNDIsICAgICAzMDAzLCAgICAxMjY0NiwgMHhmNzQ1YWUzNCwgRj0weDAKKzAsICAgICAzNDUzNDUsICAgICAzNDUzNDUsICAgICAzMDAzLCAgICAxMTIwMywgMHg0Mzg1ZTRjOSwgRj0weDAKKzAsICAgICAzNDgzNDgsICAgICAzNDgzNDgsICAgICAzMDAzLCAgICAxNTU3NywgMHg4NmIxNmQ0MiwgRj0weDAKKzAsICAgICAzNTEzNTEsICAgICAzNTEzNTEsICAgICAzMDAzLCAgICAxMjA3NywgMHhlMzFhYjliYiwgRj0weDAKKzAsICAgICAzNTQzNTQsICAgICAzNTQzNTQsICAgICAzMDAzLCAgICAxOTE3NywgMHg4ZTdiNmQ5YiwgRj0weDAKKzAsICAgICAzNTczNTcsICAgICAzNTczNTcsICAgICAzMDAzLCAgICAxMzg1MywgMHgyNzRiMzQzYSwgRj0weDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NvcHktdHJhYzIyMTEtYXZpIGIvdGVzdHMvcmVmL2ZhdGUvY29weS10cmFjMjIxMS1hdmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkODFlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2NvcHktdHJhYzIyMTEtYXZpCkBAIC0wLDAgKzEsNTQgQEAKKzA5MjA5NzhmM2Y4MTk2NDEzYzQzZjAwMzNiNTVhNWI2ICp0ZXN0cy9kYXRhL2ZhdGUvY29weS10cmFjMjIxMS1hdmkuYXZpCisxNzc3OTU2IHRlc3RzL2RhdGEvZmF0ZS9jb3B5LXRyYWMyMjExLWF2aS5hdmkKKyN0YiAwOiAxLzE0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNDQweDEwODAKKyNzYXIgMDogNC8zCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YTlkY2IyYWMKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgMjMzMjgwMCwgMHg5YjE3YWYyNworMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAyMzMyODAwLCAweDAyZGEzMTk2CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4OWM3OGVkNjIKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgMjMzMjgwMCwgMHhhNmU5MjZhMAorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAyMzMyODAwLCAweDMyNGU1MWQyCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZDgyODk2MjAKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgMjMzMjgwMCwgMHhmYzM2MTlmOQorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAyMzMyODAwLCAweDZiOGQyNTYwCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4NTcxNGRjYTAKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgMjMzMjgwMCwgMHgyNDZlMjg0MgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAyMzMyODAwLCAweDU5YmMwYjJlCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4MjRmZTVjZmEKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgMjMzMjgwMCwgMHhiOTYwN2MzZQorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAyMzMyODAwLCAweDY2MzY2OWM5CiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZDM3ZmQ2MmYKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgMjMzMjgwMCwgMHgyZDdkYjkwNAorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAyMzMyODAwLCAweDc5YTUzZWJhCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4M2IwYzdlMTkKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgMjMzMjgwMCwgMHhkMTJmNjRjNQorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAyMzMyODAwLCAweGFjZGI0MDdmCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODI5ZDdlNjEKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgMjMzMjgwMCwgMHg3OTMyYjgyZgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAyMzMyODAwLCAweDYxZjgxNjI3CiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YTFhMmUwMDAKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgMjMzMjgwMCwgMHg5M2FhZDVlOQorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAyMzMyODAwLCAweDk5OTNiNWI1CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4NmFjNDgyMzIKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgMjMzMjgwMCwgMHg1NzM4ZjljMAorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAyMzMyODAwLCAweDgyYTU5ZDAxCiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YzQ2NjQ4NjIKKzAsICAgICAgICAgNTMsICAgICAgICAgNTMsICAgICAgICAxLCAgMjMzMjgwMCwgMHhmMGU2MjIyZAorMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAyMzMyODAwLCAweGQyOWU3MTAwCiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZTA5M2VmODUKKzAsICAgICAgICAgNTksICAgICAgICAgNTksICAgICAgICAxLCAgMjMzMjgwMCwgMHgyOGM2OGE2NQorMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAyMzMyODAwLCAweDQ5YTZiMjFlCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZmIyOGEwOTcKKzAsICAgICAgICAgNjUsICAgICAgICAgNjUsICAgICAgICAxLCAgMjMzMjgwMCwgMHhhZGUxZTMzNgorMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAyMzMyODAwLCAweGU1MTE4NDEyCiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4NTg3NTAxNzYKKzAsICAgICAgICAgNzEsICAgICAgICAgNzEsICAgICAgICAxLCAgMjMzMjgwMCwgMHhhY2I5OTkzOQorMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAyMzMyODAwLCAweDgwYjk2OGQzCiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YTQ1ZjRlNmYKKzAsICAgICAgICAgNzcsICAgICAgICAgNzcsICAgICAgICAxLCAgMjMzMjgwMCwgMHhlMGZjYmFkZQorMCwgICAgICAgICA3OCwgICAgICAgICA3OCwgICAgICAgIDEsICAyMzMyODAwLCAweDE5NTY4ZjRkCiswLCAgICAgICAgIDc5LCAgICAgICAgIDc5LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4MzNjNTNmNTkKKzAsICAgICAgICAgODAsICAgICAgICAgODAsICAgICAgICAxLCAgMjMzMjgwMCwgMHhiZGJlOGZiZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY29weS10cmFjMjM2IGIvdGVzdHMvcmVmL2ZhdGUvY29weS10cmFjMjM2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MjQwY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jb3B5LXRyYWMyMzYKQEAgLTAsMCArMSwyNSBAQAorZDZlM2Q5N2I1MjJjZTg4MWVkMjljNWRhNzRjYzdlNjMgKnRlc3RzL2RhdGEvZmF0ZS9jb3B5LXRyYWMyMzYubW92Cis2MzA4MTAgdGVzdHMvZGF0YS9mYXRlL2NvcHktdHJhYzIzNi5tb3YKKyN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAxMC8xMQorI3RiIDE6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogNDgwMDAKKyNjaGFubmVsX2xheW91dCAxOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHg4MWFiMjE0MAorMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY3ZGM5OWEzCisxLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjExNWE2ODEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHg4MWFiMjE0MAorMSwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY0NTViNTk3CisxLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjdkYzk5YTMKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg4MWFiMjE0MAorMSwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGYxMTVhNjgxCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODFhYjIxNDAKKzEsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNDU1YjU5NworMSwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgICA3NTksICAgICAzMDM2LCAweGEyOTFhMzZkCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODFhYjIxNDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NvcHktdHJhYzMwNzQgYi90ZXN0cy9yZWYvZmF0ZS9jb3B5LXRyYWMzMDc0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTU2OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jb3B5LXRyYWMzMDc0CkBAIC0wLDAgKzEsNjU5IEBACiszOWFlZjFhZmZmNzYxZDY3M2ZkMWJlMDcxODI5NDFkMSAqdGVzdHMvZGF0YS9mYXRlL2NvcHktdHJhYzMwNzQubXA0CiszMzM5OTEgdGVzdHMvZGF0YS9mYXRlL2NvcHktdHJhYzMwNzQubXA0CisjdGIgMDogMS80ODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBlYWMzCisjc2FtcGxlX3JhdGUgMDogNDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyYmVhZjc5ZiwgUz0xLCAgICAgICAgNCwgMHgwMDAwMDAwMAorMCwgICAgICAgMTUzNiwgICAgICAgMTUzNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDI5ZGRmOWQ2CiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YmEwYWZhNzkKKzAsICAgICAgIDQ2MDgsICAgICAgIDQ2MDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlMDE5ZjM5NAorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweGY1MDFmNWFiCiswLCAgICAgICA3NjgwLCAgICAgICA3NjgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWVkM2YzNWMKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiMmE1ZjY3YgorMCwgICAgICAxMDc1MiwgICAgICAxMDc1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGRhYjNmMzI4CiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NDkwZGZhMmUKKzAsICAgICAgMTM4MjQsICAgICAgMTM4MjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyNmRmZmExZAorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGE4ZGFmNWNkCiswLCAgICAgIDE2ODk2LCAgICAgIDE2ODk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODIzYTAxZTEKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmMmZlZWU4OQorMCwgICAgICAxOTk2OCwgICAgICAxOTk2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDU4ZjVlYmUyCiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODYxOGY2NzkKKzAsICAgICAgMjMwNDAsICAgICAgMjMwNDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmYmUzZjBlOQorMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGFkYzNmNDc5CiswLCAgICAgIDI2MTEyLCAgICAgIDI2MTEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZTg1ZWY4NjEKKzAsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg3ODhjZjk4NQorMCwgICAgICAyOTE4NCwgICAgICAyOTE4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ0Y2YwMGMxCiswLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MzM5OGZiZjgKKzAsICAgICAgMzIyNTYsICAgICAgMzIyNTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmYmZhZmMzMgorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDY4ZmRmOWRiCiswLCAgICAgIDM1MzI4LCAgICAgIDM1MzI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4Yjg0OGY0ZmEKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyNDVhZjU1ZQorMCwgICAgICAzODQwMCwgICAgICAzODQwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDUwMjdmMjk1CiswLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4N2Q3NGY5ODgKKzAsICAgICAgNDE0NzIsICAgICAgNDE0NzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg3MTc5ZjkyZAorMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweGIyZWZmNzk3CiswLCAgICAgIDQ0NTQ0LCAgICAgIDQ0NTQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MTYyNWY1ZmEKKzAsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzNjgyZjhiNAorMCwgICAgICA0NzYxNiwgICAgICA0NzYxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweGM5ZTNmOWE2CiswLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWZkNTAyOTQKKzAsICAgICAgNTA2ODgsICAgICAgNTA2ODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhY2QwZjk2NworMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGZjZTFmNjE0CiswLCAgICAgIDUzNzYwLCAgICAgIDUzNzYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OGE5NmY1NTUKKzAsICAgICAgNTUyOTYsICAgICAgNTUyOTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlYjkzZThlYgorMCwgICAgICA1NjgzMiwgICAgICA1NjgzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDNkNjNmMDQ5CiswLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OTJmZmVmYTIKKzAsICAgICAgNTk5MDQsICAgICAgNTk5MDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2MzRjZWQ2NAorMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGYzNzJmMjU2CiswLCAgICAgIDYyOTc2LCAgICAgIDYyOTc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZWYyOGVjNDUKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwOTczZjY0NworMCwgICAgICA2NjA0OCwgICAgICA2NjA0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDExZTFmN2Q5CiswLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NjNjY2Y0ZjcKKzAsICAgICAgNjkxMjAsICAgICAgNjkxMjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhMGU0ZjNjOAorMCwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDBhYjNmMTFhCiswLCAgICAgIDcyMTkyLCAgICAgIDcyMTkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2JmOGY4YTIKKzAsICAgICAgNzM3MjgsICAgICAgNzM3MjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiMTAyZmY2ZgorMCwgICAgICA3NTI2NCwgICAgICA3NTI2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweGJmYTZmZjJmCiswLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4Yzg4MzAxYzQKKzAsICAgICAgNzgzMzYsICAgICAgNzgzMzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhYjA4ZjUyYQorMCwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDk0MDFmMTc3CiswLCAgICAgIDgxNDA4LCAgICAgIDgxNDA4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZDhmYWYxMmMKKzAsICAgICAgODI5NDQsICAgICAgODI5NDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg5ZjE5Zjc3MAorMCwgICAgICA4NDQ4MCwgICAgICA4NDQ4MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDI3ZWFmNjM3CiswLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZGFhNGYyNTYKKzAsICAgICAgODc1NTIsICAgICAgODc1NTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2MTcwZjZlZgorMCwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGVhZjhmZWU0CiswLCAgICAgIDkwNjI0LCAgICAgIDkwNjI0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZDQzOGY4ODEKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg5OTcwZjcwMQorMCwgICAgICA5MzY5NiwgICAgICA5MzY5NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDlkOWFmMjVjCiswLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YTllZTA0OWUKKzAsICAgICAgOTY3NjgsICAgICAgOTY3NjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlODdhZjRhNworMCwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDE1MzYsICAgICAgNTEyLCAweDU3NzZmNjhhCiswLCAgICAgIDk5ODQwLCAgICAgIDk5ODQwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2UzYWYyOTEKKzAsICAgICAxMDEzNzYsICAgICAxMDEzNzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0OTk0ZjFlOQorMCwgICAgIDEwMjkxMiwgICAgIDEwMjkxMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDk3ZDhmOGU0CiswLCAgICAgMTA0NDQ4LCAgICAgMTA0NDQ4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWIwM2YyYmIKKzAsICAgICAxMDU5ODQsICAgICAxMDU5ODQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhNjc0ZWRlNAorMCwgICAgIDEwNzUyMCwgICAgIDEwNzUyMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDk2MDdlZWRlCiswLCAgICAgMTA5MDU2LCAgICAgMTA5MDU2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZjIyNWVkNjQKKzAsICAgICAxMTA1OTIsICAgICAxMTA1OTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhNTlmZjFhZgorMCwgICAgIDExMjEyOCwgICAgIDExMjEyOCwgICAgIDE1MzYsICAgICAgNTEyLCAweGE3M2NmMDgyCiswLCAgICAgMTEzNjY0LCAgICAgMTEzNjY0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjUwNGY4NmYKKzAsICAgICAxMTUyMDAsICAgICAxMTUyMDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzZTdjZjg0OQorMCwgICAgIDExNjczNiwgICAgIDExNjczNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDI2MjVmMTUwCiswLCAgICAgMTE4MjcyLCAgICAgMTE4MjcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OGRjN2ZhNmMKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0MTE2ZjZmYgorMCwgICAgIDEyMTM0NCwgICAgIDEyMTM0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweGZiNDFmMDI1CiswLCAgICAgMTIyODgwLCAgICAgMTIyODgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZjJkZGYwNDcKKzAsICAgICAxMjQ0MTYsICAgICAxMjQ0MTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzZTNhZjQzZAorMCwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGJkMTIwMzFjCiswLCAgICAgMTI3NDg4LCAgICAgMTI3NDg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MTQ0YmZhODIKKzAsICAgICAxMjkwMjQsICAgICAxMjkwMjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0MjIxZjhiNAorMCwgICAgIDEzMDU2MCwgICAgIDEzMDU2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDk1ZTFmMzc1CiswLCAgICAgMTMyMDk2LCAgICAgMTMyMDk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MTVhMWU2MzgKKzAsICAgICAxMzM2MzIsICAgICAxMzM2MzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzOTQ1ZjQ2MQorMCwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGE5NWVmOTk2CiswLCAgICAgMTM2NzA0LCAgICAgMTM2NzA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODRjYWVlNGEKKzAsICAgICAxMzgyNDAsICAgICAxMzgyNDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwMzM5ZjEzYQorMCwgICAgIDEzOTc3NiwgICAgIDEzOTc3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDAxMGMwMWI1CiswLCAgICAgMTQxMzEyLCAgICAgMTQxMzEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjA0MmViNjMKKzAsICAgICAxNDI4NDgsICAgICAxNDI4NDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgxZDMwZjUwYgorMCwgICAgIDE0NDM4NCwgICAgIDE0NDM4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDhlZjFmNDExCiswLCAgICAgMTQ1OTIwLCAgICAgMTQ1OTIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWY2OGYxNjEKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjMmEwMDJlMgorMCwgICAgIDE0ODk5MiwgICAgIDE0ODk5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDg3YmVmM2EzCiswLCAgICAgMTUwNTI4LCAgICAgMTUwNTI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZWUyNGZjMzQKKzAsICAgICAxNTIwNjQsICAgICAxNTIwNjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwZGUyZjg2ZgorMCwgICAgIDE1MzYwMCwgICAgIDE1MzYwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweGRhNmVmNWM1CiswLCAgICAgMTU1MTM2LCAgICAgMTU1MTM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTM4ZWYxYjMKKzAsICAgICAxNTY2NzIsICAgICAxNTY2NzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwNTliZWZhYworMCwgICAgIDE1ODIwOCwgICAgIDE1ODIwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDBmZWRmYTg3CiswLCAgICAgMTU5NzQ0LCAgICAgMTU5NzQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OGYwNGYzOGMKKzAsICAgICAxNjEyODAsICAgICAxNjEyODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0MTk1ZjRmYQorMCwgICAgIDE2MjgxNiwgICAgIDE2MjgxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDM2ZTVmYThhCiswLCAgICAgMTY0MzUyLCAgICAgMTY0MzUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MjdjZGY3NGUKKzAsICAgICAxNjU4ODgsICAgICAxNjU4ODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwYTdkZWUzOQorMCwgICAgIDE2NzQyNCwgICAgIDE2NzQyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGIxNDNmOWZlCiswLCAgICAgMTY4OTYwLCAgICAgMTY4OTYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTdkZmY0ZWIKKzAsICAgICAxNzA0OTYsICAgICAxNzA0OTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiZjU2ZWU4MgorMCwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDg3NTJmNmE1CiswLCAgICAgMTczNTY4LCAgICAgMTczNTY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YTY0N2ZkNDIKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlOGY5ZWI1OQorMCwgICAgIDE3NjY0MCwgICAgIDE3NjY0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGJhMGFlYjQ5CiswLCAgICAgMTc4MTc2LCAgICAgMTc4MTc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YWE0MmY5ZjYKKzAsICAgICAxNzk3MTIsICAgICAxNzk3MTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjNjY0ZWQxMQorMCwgICAgIDE4MTI0OCwgICAgIDE4MTI0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGJjYWFmODU1CiswLCAgICAgMTgyNzg0LCAgICAgMTgyNzg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MjYzMWY5ZWQKKzAsICAgICAxODQzMjAsICAgICAxODQzMjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjNGY4ZjI1MQorMCwgICAgIDE4NTg1NiwgICAgIDE4NTg1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDFmYzJmMmFmCiswLCAgICAgMTg3MzkyLCAgICAgMTg3MzkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZGQyZmYzYzcKKzAsICAgICAxODg5MjgsICAgICAxODg5MjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiNzgzZjdmOQorMCwgICAgIDE5MDQ2NCwgICAgIDE5MDQ2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweGY2YWNmMWNiCiswLCAgICAgMTkyMDAwLCAgICAgMTkyMDAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWRiMmZiNTgKKzAsICAgICAxOTM1MzYsICAgICAxOTM1MzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyMjQxZTkzZAorMCwgICAgIDE5NTA3MiwgICAgIDE5NTA3MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDYxOWJmMWJmCiswLCAgICAgMTk2NjA4LCAgICAgMTk2NjA4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZTNkZGYwY2UKKzAsICAgICAxOTgxNDQsICAgICAxOTgxNDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkOTRhZjFiZQorMCwgICAgIDE5OTY4MCwgICAgIDE5OTY4MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGM4OTlmMmFiCiswLCAgICAgMjAxMjE2LCAgICAgMjAxMjE2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZDA0NGYxZjcKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjZTc1MDdhNworMCwgICAgIDIwNDI4OCwgICAgIDIwNDI4OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDI0MjFlOTViCiswLCAgICAgMjA1ODI0LCAgICAgMjA1ODI0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MmM1MmY0OGMKKzAsICAgICAyMDczNjAsICAgICAyMDczNjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkYTMxZmM0ZQorMCwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGI4ZGNmZGRhCiswLCAgICAgMjEwNDMyLCAgICAgMjEwNDMyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2NjNmYwNTUKKzAsICAgICAyMTE5NjgsICAgICAyMTE5NjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg4YzAxZjlkOQorMCwgICAgIDIxMzUwNCwgICAgIDIxMzUwNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGNmMzZlYzQwCiswLCAgICAgMjE1MDQwLCAgICAgMjE1MDQwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWJjYWZhNWMKKzAsICAgICAyMTY1NzYsICAgICAyMTY1NzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiNzU2ZjU2MAorMCwgICAgIDIxODExMiwgICAgIDIxODExMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDE4NDlmNzQ0CiswLCAgICAgMjE5NjQ4LCAgICAgMjE5NjQ4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OWQ5YmY1YWMKKzAsICAgICAyMjExODQsICAgICAyMjExODQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhZWEzZjg0NworMCwgICAgIDIyMjcyMCwgICAgIDIyMjcyMCwgICAgIDE1MzYsICAgICAgNTEyLCAweGZkODRmODE3CiswLCAgICAgMjI0MjU2LCAgICAgMjI0MjU2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWJhMGVkMjkKKzAsICAgICAyMjU3OTIsICAgICAyMjU3OTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkM2IzZjQwMAorMCwgICAgIDIyNzMyOCwgICAgIDIyNzMyOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDYxNTZmNmQ5CiswLCAgICAgMjI4ODY0LCAgICAgMjI4ODY0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZGJjOGY0YjkKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0YTQ4ZmJlMworMCwgICAgIDIzMTkzNiwgICAgIDIzMTkzNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDdjM2NmM2VkCiswLCAgICAgMjMzNDcyLCAgICAgMjMzNDcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MDc4ZWVmYTIKKzAsICAgICAyMzUwMDgsICAgICAyMzUwMDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2YjAyZWMzMAorMCwgICAgIDIzNjU0NCwgICAgIDIzNjU0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweGEwZGFmMjgzCiswLCAgICAgMjM4MDgwLCAgICAgMjM4MDgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NmMzM2Y3NDYKKzAsICAgICAyMzk2MTYsICAgICAyMzk2MTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzOGNmZjRjNAorMCwgICAgIDI0MTE1MiwgICAgIDI0MTE1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGU4NGNmM2ZlCiswLCAgICAgMjQyNjg4LCAgICAgMjQyNjg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWE0Y2ZkYTAKKzAsICAgICAyNDQyMjQsICAgICAyNDQyMjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1NTkwZjk4YgorMCwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGJmOTBmNTliCiswLCAgICAgMjQ3Mjk2LCAgICAgMjQ3Mjk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4M2YxNGY1M2MKKzAsICAgICAyNDg4MzIsICAgICAyNDg4MzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHgxMmMyZWYzMQorMCwgICAgIDI1MDM2OCwgICAgIDI1MDM2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGQ3NDNmMWIwCiswLCAgICAgMjUxOTA0LCAgICAgMjUxOTA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MGVlNGYwNGUKKzAsICAgICAyNTM0NDAsICAgICAyNTM0NDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwYzI2ZjgyMAorMCwgICAgIDI1NDk3NiwgICAgIDI1NDk3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDQwNDllYjk0CiswLCAgICAgMjU2NTEyLCAgICAgMjU2NTEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODlmNWY5YTIKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgxN2Q2ZjZiMAorMCwgICAgIDI1OTU4NCwgICAgIDI1OTU4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDRkMmJmNWFlCiswLCAgICAgMjYxMTIwLCAgICAgMjYxMTIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MmMyMGY4OTcKKzAsICAgICAyNjI2NTYsICAgICAyNjI2NTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlNTQ0ZjExZgorMCwgICAgIDI2NDE5MiwgICAgIDI2NDE5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGNhYThmNjVjCiswLCAgICAgMjY1NzI4LCAgICAgMjY1NzI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWZlNmY1NzkKKzAsICAgICAyNjcyNjQsICAgICAyNjcyNjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwZTg1ZjI3OAorMCwgICAgIDI2ODgwMCwgICAgIDI2ODgwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDhlZGRmMzhjCiswLCAgICAgMjcwMzM2LCAgICAgMjcwMzM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWVhMGYyODkKKzAsICAgICAyNzE4NzIsICAgICAyNzE4NzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkNzZiMDAzNAorMCwgICAgIDI3MzQwOCwgICAgIDI3MzQwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweGJlNDlmOWQxCiswLCAgICAgMjc0OTQ0LCAgICAgMjc0OTQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZGMzZGZkZWQKKzAsICAgICAyNzY0ODAsICAgICAyNzY0ODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg4MTQzZjE3OQorMCwgICAgIDI3ODAxNiwgICAgIDI3ODAxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDZhZjZmNjI0CiswLCAgICAgMjc5NTUyLCAgICAgMjc5NTUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NjM4Y2Y3YzkKKzAsICAgICAyODEwODgsICAgICAyODEwODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlMWU3ZjRmMQorMCwgICAgIDI4MjYyNCwgICAgIDI4MjYyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGNmYmRlZmQyCiswLCAgICAgMjg0MTYwLCAgICAgMjg0MTYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YWU0OWVjZmUKKzAsICAgICAyODU2OTYsICAgICAyODU2OTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkZmM4ZWQ1ZgorMCwgICAgIDI4NzIzMiwgICAgIDI4NzIzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweGVkZDlmMGIwCiswLCAgICAgMjg4NzY4LCAgICAgMjg4NzY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzE5MmY3N2IKKzAsICAgICAyOTAzMDQsICAgICAyOTAzMDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg4ODMzMDM1MAorMCwgICAgIDI5MTg0MCwgICAgIDI5MTg0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDU4OWNmZGNjCiswLCAgICAgMjkzMzc2LCAgICAgMjkzMzc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NzIyYWZhZTYKKzAsICAgICAyOTQ5MTIsICAgICAyOTQ5MTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1YWI5ZjNjZgorMCwgICAgIDI5NjQ0OCwgICAgIDI5NjQ0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDJkYzIwMTYxCiswLCAgICAgMjk3OTg0LCAgICAgMjk3OTg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTExN2Y0ZTcKKzAsICAgICAyOTk1MjAsICAgICAyOTk1MjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhYTAxMDA0OQorMCwgICAgIDMwMTA1NiwgICAgIDMwMTA1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGI1ZmNmNzNlCiswLCAgICAgMzAyNTkyLCAgICAgMzAyNTkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NjZhZmUzZWYKKzAsICAgICAzMDQxMjgsICAgICAzMDQxMjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzZDdiZjgxNQorMCwgICAgIDMwNTY2NCwgICAgIDMwNTY2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDY4OTVlYTdjCiswLCAgICAgMzA3MjAwLCAgICAgMzA3MjAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MjZiYmYxNGUKKzAsICAgICAzMDg3MzYsICAgICAzMDg3MzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1ODU2ZWQ1MAorMCwgICAgIDMxMDI3MiwgICAgIDMxMDI3MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDg2ZTRlYjZkCiswLCAgICAgMzExODA4LCAgICAgMzExODA4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZjY4ZGZiZjcKKzAsICAgICAzMTMzNDQsICAgICAzMTMzNDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyMDFmZjcwZAorMCwgICAgIDMxNDg4MCwgICAgIDMxNDg4MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGRkMTVlODdhCiswLCAgICAgMzE2NDE2LCAgICAgMzE2NDE2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTBlOGZhNDQKKzAsICAgICAzMTc5NTIsICAgICAzMTc5NTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHgxNDQyZjM5OAorMCwgICAgIDMxOTQ4OCwgICAgIDMxOTQ4OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGUyZTlmNDBiCiswLCAgICAgMzIxMDI0LCAgICAgMzIxMDI0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2JmZGYzNTQKKzAsICAgICAzMjI1NjAsICAgICAzMjI1NjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2MzExMDBmMworMCwgICAgIDMyNDA5NiwgICAgIDMyNDA5NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDNhYTZmOWVhCiswLCAgICAgMzI1NjMyLCAgICAgMzI1NjMyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjZjNWY1ZTYKKzAsICAgICAzMjcxNjgsICAgICAzMjcxNjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlOThkZjYyMworMCwgICAgIDMyODcwNCwgICAgIDMyODcwNCwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ0OWRmYjU5CiswLCAgICAgMzMwMjQwLCAgICAgMzMwMjQwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NGZhZWZiYjYKKzAsICAgICAzMzE3NzYsICAgICAzMzE3NzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjZWYxZWIzOAorMCwgICAgIDMzMzMxMiwgICAgIDMzMzMxMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDk0ZmNmY2Y1CiswLCAgICAgMzM0ODQ4LCAgICAgMzM0ODQ4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MmJjYWY5N2YKKzAsICAgICAzMzYzODQsICAgICAzMzYzODQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiYThhZjQ5YworMCwgICAgIDMzNzkyMCwgICAgIDMzNzkyMCwgICAgIDE1MzYsICAgICAgNTEyLCAweGFkNjRmYzM5CiswLCAgICAgMzM5NDU2LCAgICAgMzM5NDU2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjJhMmY5ZmUKKzAsICAgICAzNDA5OTIsICAgICAzNDA5OTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjOTYxMDVhMworMCwgICAgIDM0MjUyOCwgICAgIDM0MjUyOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDIwYzJmN2NhCiswLCAgICAgMzQ0MDY0LCAgICAgMzQ0MDY0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWNjZGZhNDYKKzAsICAgICAzNDU2MDAsICAgICAzNDU2MDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg5NWVlZjIxYworMCwgICAgIDM0NzEzNiwgICAgIDM0NzEzNiwgICAgIDE1MzYsICAgICAgNTEyLCAweGFmYTlmYWQxCiswLCAgICAgMzQ4NjcyLCAgICAgMzQ4NjcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MzEzNGY1Y2QKKzAsICAgICAzNTAyMDgsICAgICAzNTAyMDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiYjA4ZjcwMgorMCwgICAgIDM1MTc0NCwgICAgIDM1MTc0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDI4MjlmMWEwCiswLCAgICAgMzUzMjgwLCAgICAgMzUzMjgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWExNmZlODgKKzAsICAgICAzNTQ4MTYsICAgICAzNTQ4MTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2ZDg3ZjVjZAorMCwgICAgIDM1NjM1MiwgICAgIDM1NjM1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDgxNzBmODlhCiswLCAgICAgMzU3ODg4LCAgICAgMzU3ODg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4Yzk5ZGY2NTYKKzAsICAgICAzNTk0MjQsICAgICAzNTk0MjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyMDE1ZjJmMAorMCwgICAgIDM2MDk2MCwgICAgIDM2MDk2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDA5M2RmNjdkCiswLCAgICAgMzYyNDk2LCAgICAgMzYyNDk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YWEzNWVlMWEKKzAsICAgICAzNjQwMzIsICAgICAzNjQwMzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjNmNhZWU3ZQorMCwgICAgIDM2NTU2OCwgICAgIDM2NTU2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGM5N2JmNTM2CiswLCAgICAgMzY3MTA0LCAgICAgMzY3MTA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4N2EzN2Y3M2IKKzAsICAgICAzNjg2NDAsICAgICAzNjg2NDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhMmNkZWU0ZAorMCwgICAgIDM3MDE3NiwgICAgIDM3MDE3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGVmZDUwMTZjCiswLCAgICAgMzcxNzEyLCAgICAgMzcxNzEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTYyZWY2ZGEKKzAsICAgICAzNzMyNDgsICAgICAzNzMyNDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0MjAzZjFlZAorMCwgICAgIDM3NDc4NCwgICAgIDM3NDc4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDVlYzdmN2YwCiswLCAgICAgMzc2MzIwLCAgICAgMzc2MzIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MTU2ZmYwMjYKKzAsICAgICAzNzc4NTYsICAgICAzNzc4NTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjYmE4ZmMwYQorMCwgICAgIDM3OTM5MiwgICAgIDM3OTM5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDQyMGIwM2MzCiswLCAgICAgMzgwOTI4LCAgICAgMzgwOTI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MzdmMGYyYmUKKzAsICAgICAzODI0NjQsICAgICAzODI0NjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzNWQwZmMxNworMCwgICAgIDM4NDAwMCwgICAgIDM4NDAwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDFkMzBmNTM3CiswLCAgICAgMzg1NTM2LCAgICAgMzg1NTM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWE4NGU1MDYKKzAsICAgICAzODcwNzIsICAgICAzODcwNzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyZmQ4ZWJhNQorMCwgICAgIDM4ODYwOCwgICAgIDM4ODYwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDMyNzFmNjI0CiswLCAgICAgMzkwMTQ0LCAgICAgMzkwMTQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZGNjNGVhM2IKKzAsICAgICAzOTE2ODAsICAgICAzOTE2ODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwZDc2ZWUxMworMCwgICAgIDM5MzIxNiwgICAgIDM5MzIxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweGJhNDZmMmE1CiswLCAgICAgMzk0NzUyLCAgICAgMzk0NzUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjE1NDA0MjQKKzAsICAgICAzOTYyODgsICAgICAzOTYyODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwYzg4ZmFlNgorMCwgICAgIDM5NzgyNCwgICAgIDM5NzgyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGU4NzlmODliCiswLCAgICAgMzk5MzYwLCAgICAgMzk5MzYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YWU5NmY5MzQKKzAsICAgICA0MDA4OTYsICAgICA0MDA4OTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjMTc0MDVlYworMCwgICAgIDQwMjQzMiwgICAgIDQwMjQzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDk1YjhmNDg2CiswLCAgICAgNDAzOTY4LCAgICAgNDAzOTY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MDNiYmY1YTkKKzAsICAgICA0MDU1MDQsICAgICA0MDU1MDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2M2VhZjhkNgorMCwgICAgIDQwNzA0MCwgICAgIDQwNzA0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDdhNmJmYTk2CiswLCAgICAgNDA4NTc2LCAgICAgNDA4NTc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MmVhYmVlODAKKzAsICAgICA0MTAxMTIsICAgICA0MTAxMTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg4NjkzZjNjMQorMCwgICAgIDQxMTY0OCwgICAgIDQxMTY0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGM4YjZmNDJhCiswLCAgICAgNDEzMTg0LCAgICAgNDEzMTg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OWI1YmYzNDQKKzAsICAgICA0MTQ3MjAsICAgICA0MTQ3MjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkYTgxZjUxMworMCwgICAgIDQxNjI1NiwgICAgIDQxNjI1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ3ODlmYTRkCiswLCAgICAgNDE3NzkyLCAgICAgNDE3NzkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZTcwYWVkMzAKKzAsICAgICA0MTkzMjgsICAgICA0MTkzMjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwZTUxZjU3OQorMCwgICAgIDQyMDg2NCwgICAgIDQyMDg2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDE3MTUwM2M5CiswLCAgICAgNDIyNDAwLCAgICAgNDIyNDAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4Yzk2NWY5OGMKKzAsICAgICA0MjM5MzYsICAgICA0MjM5MzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg4MTZlZjYyNworMCwgICAgIDQyNTQ3MiwgICAgIDQyNTQ3MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ0MWNlYjZjCiswLCAgICAgNDI3MDA4LCAgICAgNDI3MDA4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZWRiY2YxZTUKKzAsICAgICA0Mjg1NDQsICAgICA0Mjg1NDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgxMTY4ZmVjNworMCwgICAgIDQzMDA4MCwgICAgIDQzMDA4MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ4OGFmYTFlCiswLCAgICAgNDMxNjE2LCAgICAgNDMxNjE2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NmQxZGVjMzkKKzAsICAgICA0MzMxNTIsICAgICA0MzMxNTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1NGM3ZjYxMQorMCwgICAgIDQzNDY4OCwgICAgIDQzNDY4OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDA4MDNlYWU2CiswLCAgICAgNDM2MjI0LCAgICAgNDM2MjI0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2Q4NWViNmQKKzAsICAgICA0Mzc3NjAsICAgICA0Mzc3NjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzZjkyMDAzNAorMCwgICAgIDQzOTI5NiwgICAgIDQzOTI5NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDRiNTVlYTQ3CiswLCAgICAgNDQwODMyLCAgICAgNDQwODMyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZGZkN2Y2ODEKKzAsICAgICA0NDIzNjgsICAgICA0NDIzNjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyMGNjZWY5NgorMCwgICAgIDQ0MzkwNCwgICAgIDQ0MzkwNCwgICAgIDE1MzYsICAgICAgNTEyLCAweDEyMmNmNjU2CiswLCAgICAgNDQ1NDQwLCAgICAgNDQ1NDQwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZTM4ZmVmMTkKKzAsICAgICA0NDY5NzYsICAgICA0NDY5NzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhMTFmZjU2NQorMCwgICAgIDQ0ODUxMiwgICAgIDQ0ODUxMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDkzMWNmODNlCiswLCAgICAgNDUwMDQ4LCAgICAgNDUwMDQ4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4Yjg1NDAxMGMKKzAsICAgICA0NTE1ODQsICAgICA0NTE1ODQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmNjA3ZjIzMworMCwgICAgIDQ1MzEyMCwgICAgIDQ1MzEyMCwgICAgIDE1MzYsICAgICAgNTEyLCAweGZkOWRlN2U5CiswLCAgICAgNDU0NjU2LCAgICAgNDU0NjU2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZTQwMWZhNTMKKzAsICAgICA0NTYxOTIsICAgICA0NTYxOTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHgxNWFlZjlmMgorMCwgICAgIDQ1NzcyOCwgICAgIDQ1NzcyOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDAwNzFmNTBlCiswLCAgICAgNDU5MjY0LCAgICAgNDU5MjY0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YTNjN2YwMjkKKzAsICAgICA0NjA4MDAsICAgICA0NjA4MDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg5YjczZWQ2NAorMCwgICAgIDQ2MjMzNiwgICAgIDQ2MjMzNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDAwODdmYmVhCiswLCAgICAgNDYzODcyLCAgICAgNDYzODcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OTg3MWVmZmIKKzAsICAgICA0NjU0MDgsICAgICA0NjU0MDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwZTM2ZWJlMworMCwgICAgIDQ2Njk0NCwgICAgIDQ2Njk0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDk4MmUwMTVlCiswLCAgICAgNDY4NDgwLCAgICAgNDY4NDgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2E2N2Y2NjcKKzAsICAgICA0NzAwMTYsICAgICA0NzAwMTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjNTA0ZmQ1MQorMCwgICAgIDQ3MTU1MiwgICAgIDQ3MTU1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGY1YzdmMTY3CiswLCAgICAgNDczMDg4LCAgICAgNDczMDg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NzVhYWVjZTgKKzAsICAgICA0NzQ2MjQsICAgICA0NzQ2MjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyODhlZmZjZgorMCwgICAgIDQ3NjE2MCwgICAgIDQ3NjE2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGI2NDBmMDU3CiswLCAgICAgNDc3Njk2LCAgICAgNDc3Njk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YmI3Y2Y0YTkKKzAsICAgICA0NzkyMzIsICAgICA0NzkyMzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjY2YyMDBkNgorMCwgICAgIDQ4MDc2OCwgICAgIDQ4MDc2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDFhMDBmMjI5CiswLCAgICAgNDgyMzA0LCAgICAgNDgyMzA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YTk1YmYxYmUKKzAsICAgICA0ODM4NDAsICAgICA0ODM4NDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzYzFhZjI4ZAorMCwgICAgIDQ4NTM3NiwgICAgIDQ4NTM3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDExZDFlZjU0CiswLCAgICAgNDg2OTEyLCAgICAgNDg2OTEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZjlhZTAyYWEKKzAsICAgICA0ODg0NDgsICAgICA0ODg0NDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0NDc2ZWU2OAorMCwgICAgIDQ4OTk4NCwgICAgIDQ4OTk4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDdmNDNlYjgwCiswLCAgICAgNDkxNTIwLCAgICAgNDkxNTIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MjQ1YWY5MDYKKzAsICAgICA0OTMwNTYsICAgICA0OTMwNTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiYjA2ZjBhOAorMCwgICAgIDQ5NDU5MiwgICAgIDQ5NDU5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGU1MWJmNDYxCiswLCAgICAgNDk2MTI4LCAgICAgNDk2MTI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZDc2N2Y3ZmQKKzAsICAgICA0OTc2NjQsICAgICA0OTc2NjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkNTE3ZjFjYQorMCwgICAgIDQ5OTIwMCwgICAgIDQ5OTIwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDMzMTFlYjQ1CiswLCAgICAgNTAwNzM2LCAgICAgNTAwNzM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZWUwZWY2MWUKKzAsICAgICA1MDIyNzIsICAgICA1MDIyNzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg5ZTdjZmU5YgorMCwgICAgIDUwMzgwOCwgICAgIDUwMzgwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDM1M2VmMDNhCiswLCAgICAgNTA1MzQ0LCAgICAgNTA1MzQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OTJmNmZjZmEKKzAsICAgICA1MDY4ODAsICAgICA1MDY4ODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlNDU4ZjNkMAorMCwgICAgIDUwODQxNiwgICAgIDUwODQxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweGViZjNmOGFmCiswLCAgICAgNTA5OTUyLCAgICAgNTA5OTUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzBmNmY5ODEKKzAsICAgICA1MTE0ODgsICAgICA1MTE0ODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzZTMxZmI2YworMCwgICAgIDUxMzAyNCwgICAgIDUxMzAyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGQ2NzkwMzFiCiswLCAgICAgNTE0NTYwLCAgICAgNTE0NTYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NjU3MWYzNjEKKzAsICAgICA1MTYwOTYsICAgICA1MTYwOTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmNDEwZjUwNworMCwgICAgIDUxNzYzMiwgICAgIDUxNzYzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDIyMTdmODE3CiswLCAgICAgNTE5MTY4LCAgICAgNTE5MTY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YWE1M2Y2ZWUKKzAsICAgICA1MjA3MDQsICAgICA1MjA3MDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhNTc0ZmExNAorMCwgICAgIDUyMjI0MCwgICAgIDUyMjI0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGNkN2ZmMDlkCiswLCAgICAgNTIzNzc2LCAgICAgNTIzNzc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YTY1MGY3ZDYKKzAsICAgICA1MjUzMTIsICAgICA1MjUzMTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2YjRmZjQ2NworMCwgICAgIDUyNjg0OCwgICAgIDUyNjg0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDkzNTVmM2NiCiswLCAgICAgNTI4Mzg0LCAgICAgNTI4Mzg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NzU0NmViOGIKKzAsICAgICA1Mjk5MjAsICAgICA1Mjk5MjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0YWM2ZjRjOAorMCwgICAgIDUzMTQ1NiwgICAgIDUzMTQ1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGNmNjlmNjJjCiswLCAgICAgNTMyOTkyLCAgICAgNTMyOTkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OTNhMGUzNWQKKzAsICAgICA1MzQ1MjgsICAgICA1MzQ1MjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2MGM1ZjBmNQorMCwgICAgIDUzNjA2NCwgICAgIDUzNjA2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDc1YTRmYjQyCiswLCAgICAgNTM3NjAwLCAgICAgNTM3NjAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MjYxNWZmMWYKKzAsICAgICA1MzkxMzYsICAgICA1MzkxMzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiOTVkZjlhMgorMCwgICAgIDU0MDY3MiwgICAgIDU0MDY3MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGI4YzVmYWZiCiswLCAgICAgNTQyMjA4LCAgICAgNTQyMjA4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MzQ2NWZkMmIKKzAsICAgICA1NDM3NDQsICAgICA1NDM3NDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhNzU4ZjQ4OQorMCwgICAgIDU0NTI4MCwgICAgIDU0NTI4MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGU0YmFmZDdmCiswLCAgICAgNTQ2ODE2LCAgICAgNTQ2ODE2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZmE0NWY2MDMKKzAsICAgICA1NDgzNTIsICAgICA1NDgzNTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg4NzViMDRmMQorMCwgICAgIDU0OTg4OCwgICAgIDU0OTg4OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDE3MWJmNjAyCiswLCAgICAgNTUxNDI0LCAgICAgNTUxNDI0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTU3Y2YyZmQKKzAsICAgICA1NTI5NjAsICAgICA1NTI5NjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzYTQzMDNjMAorMCwgICAgIDU1NDQ5NiwgICAgIDU1NDQ5NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGJkMGZlZWYzCiswLCAgICAgNTU2MDMyLCAgICAgNTU2MDMyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4M2NhM2VkN2YKKzAsICAgICA1NTc1NjgsICAgICA1NTc1NjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0YTRiZjBiMworMCwgICAgIDU1OTEwNCwgICAgIDU1OTEwNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGRlZjVmNGEzCiswLCAgICAgNTYwNjQwLCAgICAgNTYwNjQwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OTZhN2Y5MzkKKzAsICAgICA1NjIxNzYsICAgICA1NjIxNzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzZGM0ZjJmYgorMCwgICAgIDU2MzcxMiwgICAgIDU2MzcxMiwgICAgIDE1MzYsICAgICAgNTEyLCAweGEzMjNlYzgwCiswLCAgICAgNTY1MjQ4LCAgICAgNTY1MjQ4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OGI0OWVlYmYKKzAsICAgICA1NjY3ODQsICAgICA1NjY3ODQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiNGEzZjk4MworMCwgICAgIDU2ODMyMCwgICAgIDU2ODMyMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDVhNjFlY2Y1CiswLCAgICAgNTY5ODU2LCAgICAgNTY5ODU2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MTBiMGRiZGEKKzAsICAgICA1NzEzOTIsICAgICA1NzEzOTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0ODM2ZjQ3NAorMCwgICAgIDU3MjkyOCwgICAgIDU3MjkyOCwgICAgIDE1MzYsICAgICAgNTEyLCAweGU2ZjFlZTg3CiswLCAgICAgNTc0NDY0LCAgICAgNTc0NDY0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWUxYmY0NzQKKzAsICAgICA1NzYwMDAsICAgICA1NzYwMDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlMjViZjI2MworMCwgICAgIDU3NzUzNiwgICAgIDU3NzUzNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDI5YTlmMzQ4CiswLCAgICAgNTc5MDcyLCAgICAgNTc5MDcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OGNmNmY4NWQKKzAsICAgICA1ODA2MDgsICAgICA1ODA2MDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzNjkwZjQwYQorMCwgICAgIDU4MjE0NCwgICAgIDU4MjE0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDA3MmRmY2I1CiswLCAgICAgNTgzNjgwLCAgICAgNTgzNjgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OTYxMWY4YzcKKzAsICAgICA1ODUyMTYsICAgICA1ODUyMTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzZWU3ZjYyMgorMCwgICAgIDU4Njc1MiwgICAgIDU4Njc1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGRiMzdmNzg3CiswLCAgICAgNTg4Mjg4LCAgICAgNTg4Mjg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzA5YmYyZTMKKzAsICAgICA1ODk4MjQsICAgICA1ODk4MjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhZTM3ZjllYQorMCwgICAgIDU5MTM2MCwgICAgIDU5MTM2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDI3NjRmNmIwCiswLCAgICAgNTkyODk2LCAgICAgNTkyODk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODcxYmU0OTAKKzAsICAgICA1OTQ0MzIsICAgICA1OTQ0MzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyZTdjZWZjYQorMCwgICAgIDU5NTk2OCwgICAgIDU5NTk2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDAwMGRlY2U1CiswLCAgICAgNTk3NTA0LCAgICAgNTk3NTA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YmU5YmVhMTYKKzAsICAgICA1OTkwNDAsICAgICA1OTkwNDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyMDJjZjM3YworMCwgICAgIDYwMDU3NiwgICAgIDYwMDU3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGFlMDJmYTI5CiswLCAgICAgNjAyMTEyLCAgICAgNjAyMTEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWViNGVmYzkKKzAsICAgICA2MDM2NDgsICAgICA2MDM2NDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg3YTgyZmZjZQorMCwgICAgIDYwNTE4NCwgICAgIDYwNTE4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDRjMGZlZmIyCiswLCAgICAgNjA2NzIwLCAgICAgNjA2NzIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MGQ1NWZkNTIKKzAsICAgICA2MDgyNTYsICAgICA2MDgyNTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwMGM4ZjU2OAorMCwgICAgIDYwOTc5MiwgICAgIDYwOTc5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDlkOWVmMzA2CiswLCAgICAgNjExMzI4LCAgICAgNjExMzI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTNiYmY3OWMKKzAsICAgICA2MTI4NjQsICAgICA2MTI4NjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmMWZiZjNmNAorMCwgICAgIDYxNDQwMCwgICAgIDYxNDQwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDBhZTBlZDBiCiswLCAgICAgNjE1OTM2LCAgICAgNjE1OTM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MzM3NGZmYzEKKzAsICAgICA2MTc0NzIsICAgICA2MTc0NzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiYmExZjU0NgorMCwgICAgIDYxOTAwOCwgICAgIDYxOTAwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweGFmZmVlZTM1CiswLCAgICAgNjIwNTQ0LCAgICAgNjIwNTQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODFkZmYzOGQKKzAsICAgICA2MjIwODAsICAgICA2MjIwODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyOWVkZWFmYgorMCwgICAgIDYyMzYxNiwgICAgIDYyMzYxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDQwNmZlY2JlCiswLCAgICAgNjI1MTUyLCAgICAgNjI1MTUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZWUyOGY4ZGMKKzAsICAgICA2MjY2ODgsICAgICA2MjY2ODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0YjFhZjI4YQorMCwgICAgIDYyODIyNCwgICAgIDYyODIyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweDgzYWIwMDU4CiswLCAgICAgNjI5NzYwLCAgICAgNjI5NzYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MjVkMGY3MzUKKzAsICAgICA2MzEyOTYsICAgICA2MzEyOTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlYzVmZjMxOQorMCwgICAgIDYzMjgzMiwgICAgIDYzMjgzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDE3MjNmMTIxCiswLCAgICAgNjM0MzY4LCAgICAgNjM0MzY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MjY2Y2VkZDgKKzAsICAgICA2MzU5MDQsICAgICA2MzU5MDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgxNWIxMDMxYQorMCwgICAgIDYzNzQ0MCwgICAgIDYzNzQ0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDRhODNmNmI2CiswLCAgICAgNjM4OTc2LCAgICAgNjM4OTc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OGNkMWZiOWYKKzAsICAgICA2NDA1MTIsICAgICA2NDA1MTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg3NmY0ZjY5NgorMCwgICAgIDY0MjA0OCwgICAgIDY0MjA0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDljMDRmYTE2CiswLCAgICAgNjQzNTg0LCAgICAgNjQzNTg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWQxNjAwY2UKKzAsICAgICA2NDUxMjAsICAgICA2NDUxMjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0MGQ5ZjkwNQorMCwgICAgIDY0NjY1NiwgICAgIDY0NjY1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGI5ZWVmMjZjCiswLCAgICAgNjQ4MTkyLCAgICAgNjQ4MTkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTU1N2VkMDMKKzAsICAgICA2NDk3MjgsICAgICA2NDk3MjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhM2IwZjM0OAorMCwgICAgIDY1MTI2NCwgICAgIDY1MTI2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweGFjOWZmYTY1CiswLCAgICAgNjUyODAwLCAgICAgNjUyODAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YmI0OWZjZjEKKzAsICAgICA2NTQzMzYsICAgICA2NTQzMzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjMzI0ZjRkYQorMCwgICAgIDY1NTg3MiwgICAgIDY1NTg3MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGU5ZDJlODc1CiswLCAgICAgNjU3NDA4LCAgICAgNjU3NDA4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODIyY2VmMzAKKzAsICAgICA2NTg5NDQsICAgICA2NTg5NDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1NmY2ZjdhOAorMCwgICAgIDY2MDQ4MCwgICAgIDY2MDQ4MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGY4MmNmNzE4CiswLCAgICAgNjYyMDE2LCAgICAgNjYyMDE2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4Yjc1YmZhYTEKKzAsICAgICA2NjM1NTIsICAgICA2NjM1NTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkZDRkZmVkNgorMCwgICAgIDY2NTA4OCwgICAgIDY2NTA4OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDQzOTJmNTMxCiswLCAgICAgNjY2NjI0LCAgICAgNjY2NjI0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZjUwY2Y5ZmEKKzAsICAgICA2NjgxNjAsICAgICA2NjgxNjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgxMTgxZWFkOQorMCwgICAgIDY2OTY5NiwgICAgIDY2OTY5NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ5MjVmYjgzCiswLCAgICAgNjcxMjMyLCAgICAgNjcxMjMyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTNhN2ZhZjgKKzAsICAgICA2NzI3NjgsICAgICA2NzI3NjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwMDQyZjRmOQorMCwgICAgIDY3NDMwNCwgICAgIDY3NDMwNCwgICAgIDE1MzYsICAgICAgNTEyLCAweDBlZDhmYTJjCiswLCAgICAgNjc1ODQwLCAgICAgNjc1ODQwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OWExZWY4OTIKKzAsICAgICA2NzczNzYsICAgICA2NzczNzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0YjM1ZWUyNgorMCwgICAgIDY3ODkxMiwgICAgIDY3ODkxMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDY1OTZmYzA3CiswLCAgICAgNjgwNDQ4LCAgICAgNjgwNDQ4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZDNmY2Y5MDgKKzAsICAgICA2ODE5ODQsICAgICA2ODE5ODQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0ZjNjZTk5MQorMCwgICAgIDY4MzUyMCwgICAgIDY4MzUyMCwgICAgIDE1MzYsICAgICAgNTEyLCAweGQ4ZjdmYzJhCiswLCAgICAgNjg1MDU2LCAgICAgNjg1MDU2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4M2RkNGYyNmMKKzAsICAgICA2ODY1OTIsICAgICA2ODY1OTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0ZjQ5ZmM3NworMCwgICAgIDY4ODEyOCwgICAgIDY4ODEyOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDNlMDhlNTIxCiswLCAgICAgNjg5NjY0LCAgICAgNjg5NjY0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZDE4MGYzNDgKKzAsICAgICA2OTEyMDAsICAgICA2OTEyMDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlYmVhZjUyMAorMCwgICAgIDY5MjczNiwgICAgIDY5MjczNiwgICAgIDE1MzYsICAgICAgNTEyLCAweGVkMDZmNzYzCiswLCAgICAgNjk0MjcyLCAgICAgNjk0MjcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OTc2NmVmMDkKKzAsICAgICA2OTU4MDgsICAgICA2OTU4MDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjNGE2ZmMwMAorMCwgICAgIDY5NzM0NCwgICAgIDY5NzM0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDU1NDdmMGFlCiswLCAgICAgNjk4ODgwLCAgICAgNjk4ODgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MzAwY2YyMTMKKzAsICAgICA3MDA0MTYsICAgICA3MDA0MTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzNWJhMDY3OAorMCwgICAgIDcwMTk1MiwgICAgIDcwMTk1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGE4YmFmNDg1CiswLCAgICAgNzAzNDg4LCAgICAgNzAzNDg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzBjYmU4ZTgKKzAsICAgICA3MDUwMjQsICAgICA3MDUwMjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwODFhZWVkMQorMCwgICAgIDcwNjU2MCwgICAgIDcwNjU2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDIwMTdlYzMzCiswLCAgICAgNzA4MDk2LCAgICAgNzA4MDk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODczOWY5NTgKKzAsICAgICA3MDk2MzIsICAgICA3MDk2MzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiNzk3ZjUyZQorMCwgICAgIDcxMTE2OCwgICAgIDcxMTE2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDgxOGFmZGYyCiswLCAgICAgNzEyNzA0LCAgICAgNzEyNzA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YmJhYmYwZmUKKzAsICAgICA3MTQyNDAsICAgICA3MTQyNDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg4NDM2MDBkYgorMCwgICAgIDcxNTc3NiwgICAgIDcxNTc3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDYxMGIwMmM5CiswLCAgICAgNzE3MzEyLCAgICAgNzE3MzEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MGJmOGVkZmUKKzAsICAgICA3MTg4NDgsICAgICA3MTg4NDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg5MzEwZWRlYQorMCwgICAgIDcyMDM4NCwgICAgIDcyMDM4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDA4YzJmMzU1CiswLCAgICAgNzIxOTIwLCAgICAgNzIxOTIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWIyM2Y0NGMKKzAsICAgICA3MjM0NTYsICAgICA3MjM0NTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0YmU5ZjM4NAorMCwgICAgIDcyNDk5MiwgICAgIDcyNDk5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDVmYmVmMjFkCiswLCAgICAgNzI2NTI4LCAgICAgNzI2NTI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NzQxMmVmNWUKKzAsICAgICA3MjgwNjQsICAgICA3MjgwNjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg5YWU3ZjYwOAorMCwgICAgIDcyOTYwMCwgICAgIDcyOTYwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDBmNDFmMjcwCiswLCAgICAgNzMxMTM2LCAgICAgNzMxMTM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NDJjMWY5ODIKKzAsICAgICA3MzI2NzIsICAgICA3MzI2NzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0NTM4ZjA0YgorMCwgICAgIDczNDIwOCwgICAgIDczNDIwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDA5YmFmMmUxCiswLCAgICAgNzM1NzQ0LCAgICAgNzM1NzQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZWQ4ZmYzYmEKKzAsICAgICA3MzcyODAsICAgICA3MzcyODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiMTEwZjUxNgorMCwgICAgIDczODgxNiwgICAgIDczODgxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDM4MzdmMDZhCiswLCAgICAgNzQwMzUyLCAgICAgNzQwMzUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NTRhZWY0ODQKKzAsICAgICA3NDE4ODgsICAgICA3NDE4ODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiMDQ3ZjYxZAorMCwgICAgIDc0MzQyNCwgICAgIDc0MzQyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGRmZjRmYjk4CiswLCAgICAgNzQ0OTYwLCAgICAgNzQ0OTYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OWRhNjAwMDkKKzAsICAgICA3NDY0OTYsICAgICA3NDY0OTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg3YmI2ZjIzNgorMCwgICAgIDc0ODAzMiwgICAgIDc0ODAzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDlmOTZlYTBlCiswLCAgICAgNzQ5NTY4LCAgICAgNzQ5NTY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzVhZGYxOWEKKzAsICAgICA3NTExMDQsICAgICA3NTExMDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyZTljZjZmOAorMCwgICAgIDc1MjY0MCwgICAgIDc1MjY0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGFkYThmYWRjCiswLCAgICAgNzU0MTc2LCAgICAgNzU0MTc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MTAwYTA3ZmQKKzAsICAgICA3NTU3MTIsICAgICA3NTU3MTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhMjZhZjQzMworMCwgICAgIDc1NzI0OCwgICAgIDc1NzI0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGM4MmNmMTVlCiswLCAgICAgNzU4Nzg0LCAgICAgNzU4Nzg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4N2Y4OGYxMGQKKzAsICAgICA3NjAzMjAsICAgICA3NjAzMjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg3NzZkZjM3NworMCwgICAgIDc2MTg1NiwgICAgIDc2MTg1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDMwYjBmNjBkCiswLCAgICAgNzYzMzkyLCAgICAgNzYzMzkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2VjYmY5YTMKKzAsICAgICA3NjQ5MjgsICAgICA3NjQ5MjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmZmE4ZjVjMgorMCwgICAgIDc2NjQ2NCwgICAgIDc2NjQ2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDkwNTJlN2NiCiswLCAgICAgNzY4MDAwLCAgICAgNzY4MDAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MDA0OGYyY2MKKzAsICAgICA3Njk1MzYsICAgICA3Njk1MzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjOGZmZjkxMgorMCwgICAgIDc3MTA3MiwgICAgIDc3MTA3MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGYyMmRlYmI4CiswLCAgICAgNzcyNjA4LCAgICAgNzcyNjA4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4N2I0YmViODIKKzAsICAgICA3NzQxNDQsICAgICA3NzQxNDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0MjhmZjMzZQorMCwgICAgIDc3NTY4MCwgICAgIDc3NTY4MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGIzYzFmNDI2CiswLCAgICAgNzc3MjE2LCAgICAgNzc3MjE2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjA4YWY1NjEKKzAsICAgICA3Nzg3NTIsICAgICA3Nzg3NTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhZjYyZWU2OAorMCwgICAgIDc4MDI4OCwgICAgIDc4MDI4OCwgICAgIDE1MzYsICAgICAgNTEyLCAweGRiMjVmMjI2CiswLCAgICAgNzgxODI0LCAgICAgNzgxODI0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YTU3N2Y5ZDUKKzAsICAgICA3ODMzNjAsICAgICA3ODMzNjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkMjFhZjIwNQorMCwgICAgIDc4NDg5NiwgICAgIDc4NDg5NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDg3MzRmMDUyCiswLCAgICAgNzg2NDMyLCAgICAgNzg2NDMyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2IwYmYwMDkKKzAsICAgICA3ODc5NjgsICAgICA3ODc5NjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkZTBiZjhhNworMCwgICAgIDc4OTUwNCwgICAgIDc4OTUwNCwgICAgIDE1MzYsICAgICAgNTEyLCAweDlmYmVmZDBkCiswLCAgICAgNzkxMDQwLCAgICAgNzkxMDQwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzMyOWVlMjYKKzAsICAgICA3OTI1NzYsICAgICA3OTI1NzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmYzYwMDdhMAorMCwgICAgIDc5NDExMiwgICAgIDc5NDExMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDY3ODIwMDRiCiswLCAgICAgNzk1NjQ4LCAgICAgNzk1NjQ4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NGFkYmY0M2MKKzAsICAgICA3OTcxODQsICAgICA3OTcxODQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1Yjg1ZjE5OAorMCwgICAgIDc5ODcyMCwgICAgIDc5ODcyMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDE1NzZmYmZlCiswLCAgICAgODAwMjU2LCAgICAgODAwMjU2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NjJlYmYyMTcKKzAsICAgICA4MDE3OTIsICAgICA4MDE3OTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkOGE5ZjVmZQorMCwgICAgIDgwMzMyOCwgICAgIDgwMzMyOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDMyNzBmNTAwCiswLCAgICAgODA0ODY0LCAgICAgODA0ODY0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OTllOWVjYTIKKzAsICAgICA4MDY0MDAsICAgICA4MDY0MDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgwZDNjMDJjOQorMCwgICAgIDgwNzkzNiwgICAgIDgwNzkzNiwgICAgIDE1MzYsICAgICAgNTEyLCAweDg3NjlmNDg0CiswLCAgICAgODA5NDcyLCAgICAgODA5NDcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZDZjZWY5MmEKKzAsICAgICA4MTEwMDgsICAgICA4MTEwMDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg5MTUwZjRiNworMCwgICAgIDgxMjU0NCwgICAgIDgxMjU0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDc2MGQwMGNlCiswLCAgICAgODE0MDgwLCAgICAgODE0MDgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzU5NWYxN2QKKzAsICAgICA4MTU2MTYsICAgICA4MTU2MTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzNzIwZmQ1NQorMCwgICAgIDgxNzE1MiwgICAgIDgxNzE1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDI4ZTVmMDJiCiswLCAgICAgODE4Njg4LCAgICAgODE4Njg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OWU4N2Y3YmQKKzAsICAgICA4MjAyMjQsICAgICA4MjAyMjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0NTcxZmU5YQorMCwgICAgIDgyMTc2MCwgICAgIDgyMTc2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweGJmMDZmODNmCiswLCAgICAgODIzMjk2LCAgICAgODIzMjk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjZiZmY2N2UKKzAsICAgICA4MjQ4MzIsICAgICA4MjQ4MzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1ODJjZmExYgorMCwgICAgIDgyNjM2OCwgICAgIDgyNjM2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDkyNzdmNTNiCiswLCAgICAgODI3OTA0LCAgICAgODI3OTA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZDU0MWZhMGUKKzAsICAgICA4Mjk0NDAsICAgICA4Mjk0NDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiOWY3Zjc5MQorMCwgICAgIDgzMDk3NiwgICAgIDgzMDk3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweGI1Y2NmNmQzCiswLCAgICAgODMyNTEyLCAgICAgODMyNTEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjAzZWYyYTEKKzAsICAgICA4MzQwNDgsICAgICA4MzQwNDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2OTcwZmIxMQorMCwgICAgIDgzNTU4NCwgICAgIDgzNTU4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ3OGRmNmJkCiswLCAgICAgODM3MTIwLCAgICAgODM3MTIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4N2NlNGVmZjIKKzAsICAgICA4Mzg2NTYsICAgICA4Mzg2NTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1ZjhhZjhiYgorMCwgICAgIDg0MDE5MiwgICAgIDg0MDE5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGE5OTBmMTBjCiswLCAgICAgODQxNzI4LCAgICAgODQxNzI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MGI1ZTA2MDMKKzAsICAgICA4NDMyNjQsICAgICA4NDMyNjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1ZjVmZjY2NworMCwgICAgIDg0NDgwMCwgICAgIDg0NDgwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweGYzZjFmN2U1CiswLCAgICAgODQ2MzM2LCAgICAgODQ2MzM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YjdiMWY5MmMKKzAsICAgICA4NDc4NzIsICAgICA4NDc4NzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1YzVhZmMyZAorMCwgICAgIDg0OTQwOCwgICAgIDg0OTQwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweGMzODllY2M4CiswLCAgICAgODUwOTQ0LCAgICAgODUwOTQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODZlZGY0YTgKKzAsICAgICA4NTI0ODAsICAgICA4NTI0ODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzMWNmZWJhOAorMCwgICAgIDg1NDAxNiwgICAgIDg1NDAxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweGVhOWNmMzYwCiswLCAgICAgODU1NTUyLCAgICAgODU1NTUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YmMwNGYwMTYKKzAsICAgICA4NTcwODgsICAgICA4NTcwODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2NjE3ZWQ1NQorMCwgICAgIDg1ODYyNCwgICAgIDg1ODYyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGUyMGFmYWQyCiswLCAgICAgODYwMTYwLCAgICAgODYwMTYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NDcwNmY2MWEKKzAsICAgICA4NjE2OTYsICAgICA4NjE2OTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhNmE4ZmQ5MworMCwgICAgIDg2MzIzMiwgICAgIDg2MzIzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDk2NTVlN2FlCiswLCAgICAgODY0NzY4LCAgICAgODY0NzY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MGFjMmYzNTQKKzAsICAgICA4NjYzMDQsICAgICA4NjYzMDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2MmUyZjg5YQorMCwgICAgIDg2Nzg0MCwgICAgIDg2Nzg0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDM1YmFmMWNiCiswLCAgICAgODY5Mzc2LCAgICAgODY5Mzc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzAyZmY5MGUKKzAsICAgICA4NzA5MTIsICAgICA4NzA5MTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmM2Y4ZjI0YgorMCwgICAgIDg3MjQ0OCwgICAgIDg3MjQ0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDEwYjllYmQ2CiswLCAgICAgODczOTg0LCAgICAgODczOTg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MDQ4MjA4NGIKKzAsICAgICA4NzU1MjAsICAgICA4NzU1MjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjMTRjZWUyZQorMCwgICAgIDg3NzA1NiwgICAgIDg3NzA1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDIxZGRmNWVhCiswLCAgICAgODc4NTkyLCAgICAgODc4NTkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ODA5MGY1MWYKKzAsICAgICA4ODAxMjgsICAgICA4ODAxMjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2NDk2ZWQ2OAorMCwgICAgIDg4MTY2NCwgICAgIDg4MTY2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDRiYjNmYTY5CiswLCAgICAgODgzMjAwLCAgICAgODgzMjAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWUxOGU4ZDcKKzAsICAgICA4ODQ3MzYsICAgICA4ODQ3MzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHhiNzU4ZmE2MAorMCwgICAgIDg4NjI3MiwgICAgIDg4NjI3MiwgICAgIDE1MzYsICAgICAgNTEyLCAweGE1YzZmNjcxCiswLCAgICAgODg3ODA4LCAgICAgODg3ODA4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NmRiY2YxNWUKKzAsICAgICA4ODkzNDQsICAgICA4ODkzNDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1NmM0ZjIyNworMCwgICAgIDg5MDg4MCwgICAgIDg5MDg4MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDE3MjgwMTQ5CiswLCAgICAgODkyNDE2LCAgICAgODkyNDE2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4OGM1N2Y1ODQKKzAsICAgICA4OTM5NTIsICAgICA4OTM5NTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1MThlZjJiNAorMCwgICAgIDg5NTQ4OCwgICAgIDg5NTQ4OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDhhNjllYmU2CiswLCAgICAgODk3MDI0LCAgICAgODk3MDI0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4Zjk1NGU5N2MKKzAsICAgICA4OTg1NjAsICAgICA4OTg1NjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2MmUxZjhkYgorMCwgICAgIDkwMDA5NiwgICAgIDkwMDA5NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDYzN2FmOWZhCiswLCAgICAgOTAxNjMyLCAgICAgOTAxNjMyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZWNiY2Y4NDYKKzAsICAgICA5MDMxNjgsICAgICA5MDMxNjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyNDgxZWNhYworMCwgICAgIDkwNDcwNCwgICAgIDkwNDcwNCwgICAgIDE1MzYsICAgICAgNTEyLCAweDdkM2NmOTQwCiswLCAgICAgOTA2MjQwLCAgICAgOTA2MjQwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NDgyM2VmYzQKKzAsICAgICA5MDc3NzYsICAgICA5MDc3NzYsICAgICAxNTM2LCAgICAgIDUxMiwgMHgzMWQ1ZjFjYQorMCwgICAgIDkwOTMxMiwgICAgIDkwOTMxMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDMwMjRmNDBmCiswLCAgICAgOTEwODQ4LCAgICAgOTEwODQ4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZjE3MmY2NDQKKzAsICAgICA5MTIzODQsICAgICA5MTIzODQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyNTAyZjFiOQorMCwgICAgIDkxMzkyMCwgICAgIDkxMzkyMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDllZThmNTBiCiswLCAgICAgOTE1NDU2LCAgICAgOTE1NDU2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MDYwNWZjYzAKKzAsICAgICA5MTY5OTIsICAgICA5MTY5OTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmMjAyZjExZAorMCwgICAgIDkxODUyOCwgICAgIDkxODUyOCwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ0OWRmN2EyCiswLCAgICAgOTIwMDY0LCAgICAgOTIwMDY0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MTZlOGY0NjgKKzAsICAgICA5MjE2MDAsICAgICA5MjE2MDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjZWVhZmJhNQorMCwgICAgIDkyMzEzNiwgICAgIDkyMzEzNiwgICAgIDE1MzYsICAgICAgNTEyLCAweGM4NDEwMzQwCiswLCAgICAgOTI0NjcyLCAgICAgOTI0NjcyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YzBlNWZlNWEKKzAsICAgICA5MjYyMDgsICAgICA5MjYyMDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2MGNhZmViNworMCwgICAgIDkyNzc0NCwgICAgIDkyNzc0NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDgyNzdmYjZhCiswLCAgICAgOTI5MjgwLCAgICAgOTI5MjgwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4YTc3ZGZhYzkKKzAsICAgICA5MzA4MTYsICAgICA5MzA4MTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg3YjJiZjFkMQorMCwgICAgIDkzMjM1MiwgICAgIDkzMjM1MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDYzYWFmYWJkCiswLCAgICAgOTMzODg4LCAgICAgOTMzODg4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZjU2Y2Y1NzUKKzAsICAgICA5MzU0MjQsICAgICA5MzU0MjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHgyMDQ4Zjk2NgorMCwgICAgIDkzNjk2MCwgICAgIDkzNjk2MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDM5MmIwYzZhCiswLCAgICAgOTM4NDk2LCAgICAgOTM4NDk2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4N2Q4N2YyNDQKKzAsICAgICA5NDAwMzIsICAgICA5NDAwMzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlY2JjZmVkYworMCwgICAgIDk0MTU2OCwgICAgIDk0MTU2OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDQ3ODBmMmVmCiswLCAgICAgOTQzMTA0LCAgICAgOTQzMTA0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWEyOGY4ZmYKKzAsICAgICA5NDQ2NDAsICAgICA5NDQ2NDAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkYTUxZmNjNQorMCwgICAgIDk0NjE3NiwgICAgIDk0NjE3NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDcwMDlmN2ZmCiswLCAgICAgOTQ3NzEyLCAgICAgOTQ3NzEyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWU1YWY2YTIKKzAsICAgICA5NDkyNDgsICAgICA5NDkyNDgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhjYjgzZThjMworMCwgICAgIDk1MDc4NCwgICAgIDk1MDc4NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDJjYmJlOGFlCiswLCAgICAgOTUyMzIwLCAgICAgOTUyMzIwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWNjMGViYmQKKzAsICAgICA5NTM4NTYsICAgICA5NTM4NTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg1ZTEzZjMzYgorMCwgICAgIDk1NTM5MiwgICAgIDk1NTM5MiwgICAgIDE1MzYsICAgICAgNTEyLCAweDJlZjFlZjNkCiswLCAgICAgOTU2OTI4LCAgICAgOTU2OTI4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NGFhZWYwNWYKKzAsICAgICA5NTg0NjQsICAgICA5NTg0NjQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmNmFkZjMyMQorMCwgICAgIDk2MDAwMCwgICAgIDk2MDAwMCwgICAgIDE1MzYsICAgICAgNTEyLCAweDAwNDFlOTg1CiswLCAgICAgOTYxNTM2LCAgICAgOTYxNTM2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NDUzOWViODMKKzAsICAgICA5NjMwNzIsICAgICA5NjMwNzIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhNjQyZjE0NAorMCwgICAgIDk2NDYwOCwgICAgIDk2NDYwOCwgICAgIDE1MzYsICAgICAgNTEyLCAweGY1OGRmYjQ0CiswLCAgICAgOTY2MTQ0LCAgICAgOTY2MTQ0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4Y2RmMmYzYjIKKzAsICAgICA5Njc2ODAsICAgICA5Njc2ODAsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlYmQ5ZjFkNAorMCwgICAgIDk2OTIxNiwgICAgIDk2OTIxNiwgICAgIDE1MzYsICAgICAgNTEyLCAweGYzOWFmY2NhCiswLCAgICAgOTcwNzUyLCAgICAgOTcwNzUyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4NDM5MmZiOGUKKzAsICAgICA5NzIyODgsICAgICA5NzIyODgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhlMjNkZjhiYgorMCwgICAgIDk3MzgyNCwgICAgIDk3MzgyNCwgICAgIDE1MzYsICAgICAgNTEyLCAweGRlZGFmMjNhCiswLCAgICAgOTc1MzYwLCAgICAgOTc1MzYwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MWM0NmY3YmMKKzAsICAgICA5NzY4OTYsICAgICA5NzY4OTYsICAgICAxNTM2LCAgICAgIDUxMiwgMHg0N2UwZjg3MworMCwgICAgIDk3ODQzMiwgICAgIDk3ODQzMiwgICAgIDE1MzYsICAgICAgNTEyLCAweDVlNTVlYjQyCiswLCAgICAgOTc5OTY4LCAgICAgOTc5OTY4LCAgICAgMTUzNiwgICAgICA1MTIsIDB4NWYwOGY4YTAKKzAsICAgICA5ODE1MDQsICAgICA5ODE1MDQsICAgICAxNTM2LCAgICAgIDUxMiwgMHhmMzkxZjlmOAorMCwgICAgIDk4MzA0MCwgICAgIDk4MzA0MCwgICAgIDE1MzYsICAgICAgNTEyLCAweDNkNGFmY2QxCiswLCAgICAgOTg0NTc2LCAgICAgOTg0NTc2LCAgICAgMTUzNiwgICAgICA1MTIsIDB4MDdiOGYzZDQKKzAsICAgICA5ODYxMTIsICAgICA5ODYxMTIsICAgICAxNTM2LCAgICAgIDUxMiwgMHhhN2NkZmVhNAorMCwgICAgIDk4NzY0OCwgICAgIDk4NzY0OCwgICAgIDE1MzYsICAgICAgNTEyLCAweDQwNzJmZmRhCiswLCAgICAgOTg5MTg0LCAgICAgOTg5MTg0LCAgICAgMTUzNiwgICAgICA1MTIsIDB4ZTk2ZGY3M2YKKzAsICAgICA5OTA3MjAsICAgICA5OTA3MjAsICAgICAxNTM2LCAgICAgIDUxMiwgMHg2MTcwZjNhMworMCwgICAgIDk5MjI1NiwgICAgIDk5MjI1NiwgICAgIDE1MzYsICAgICAgNTEyLCAweDc0M2NmNTA5CiswLCAgICAgOTkzNzkyLCAgICAgOTkzNzkyLCAgICAgMTUzNiwgICAgICA1MTIsIDB4MzUyNWZlOGUKKzAsICAgICA5OTUzMjgsICAgICA5OTUzMjgsICAgICAxNTM2LCAgICAgIDUxMiwgMHhkMzQ1ZWQwMgorMCwgICAgIDk5Njg2NCwgICAgIDk5Njg2NCwgICAgIDE1MzYsICAgICAgNTEyLCAweDNjMTVmMzdmCiswLCAgICAgOTk4NDAwLCAgICAgOTk4NDAwLCAgICAgMTUzNiwgICAgICA1MTIsIDB4OWRmMWZhY2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NvcHktdHJhYzQ5MTQgYi90ZXN0cy9yZWYvZmF0ZS9jb3B5LXRyYWM0OTE0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjI4N2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jb3B5LXRyYWM0OTE0CkBAIC0wLDAgKzEsNDkgQEAKKzA1ZmRjNGE2ZTI4YWJiMmMyNmU5NjIyNDY4MmQyNjg0ICp0ZXN0cy9kYXRhL2ZhdGUvY29weS10cmFjNDkxNC5teGYKKzU2MDY5NyB0ZXN0cy9kYXRhL2ZhdGUvY29weS10cmFjNDkxNC5teGYKKyN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0ODB4MjcwCisjc2FyIDA6IDEvMQorI3RiIDE6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogNDgwMDAKKyNjaGFubmVsX2xheW91dCAxOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI1OTIwMCwgMHhmMzY5NTdkYQorMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDE2MDIsICAgICA2NDA4LCAweDFkZDdiMzdjCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyNTkyMDAsIDB4MjlhMWY1ODYKKzEsICAgICAgIDE2MDIsICAgICAgIDE2MDIsICAgICAxNjAxLCAgICAgNjQwNCwgMHhiNjg1NDg0NgorMSwgICAgICAgMzIwMywgICAgICAgMzIwMywgICAgIDE2MDIsICAgICA2NDA4LCAweDRkM2VhODVlCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyNTkyMDAsIDB4NTU3OGQ5YzMKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDI1OTIwMCwgMHg4MzkzOGI2MQorMSwgICAgICAgNDgwNSwgICAgICAgNDgwNSwgICAgIDE2MDEsICAgICA2NDA0LCAweDVlYjE1YTZkCisxLCAgICAgICA2NDA2LCAgICAgICA2NDA2LCAgICAgMTYwMiwgICAgIDY0MDgsIDB4MDU5ZDIxYTAKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDI1OTIwMCwgMHhhNmNlNzYxOAorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMjU5MjAwLCAweDQ4OTJhMGY1CisxLCAgICAgICA4MDA4LCAgICAgICA4MDA4LCAgICAgMTYwMiwgICAgIDY0MDgsIDB4ZDgzNTI1NzIKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDI1OTIwMCwgMHg5MjFjNjA1MQorMSwgICAgICAgOTYxMCwgICAgICAgOTYxMCwgICAgIDE2MDEsICAgICA2NDA0LCAweGY2OWJlODc1CisxLCAgICAgIDExMjExLCAgICAgIDExMjExLCAgICAgMTYwMiwgICAgIDY0MDgsIDB4NDFlNzU2MDEKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDI1OTIwMCwgMHg2MThjMDAyNgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMjU5MjAwLCAweGRiYzNjYTRkCisxLCAgICAgIDEyODEzLCAgICAgIDEyODEzLCAgICAgMTYwMSwgICAgIDY0MDQsIDB4NzVlMzE5NmQKKzEsICAgICAgMTQ0MTQsICAgICAgMTQ0MTQsICAgICAxNjAyLCAgICAgNjQwOCwgMHhiNDZiYWQyOQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMjU5MjAwLCAweGYwODhjNzMxCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAyNTkyMDAsIDB4Y2U3N2RkZWUKKzEsICAgICAgMTYwMTYsICAgICAgMTYwMTYsICAgICAxNjAyLCAgICAgNjQwOCwgMHg0MWU2Y2VhYworMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMjU5MjAwLCAweDc5ODU2NWViCisxLCAgICAgIDE3NjE4LCAgICAgIDE3NjE4LCAgICAgMTYwMSwgICAgIDY0MDQsIDB4MjI1ODczNGUKKzEsICAgICAgMTkyMTksICAgICAgMTkyMTksICAgICAxNjAyLCAgICAgNjQwOCwgMHhjNDZkOTEwMworMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMjU5MjAwLCAweDU3MTg1ZGM4CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAyNTkyMDAsIDB4NjA3YTkwODYKKzEsICAgICAgMjA4MjEsICAgICAgMjA4MjEsICAgICAxNjAxLCAgICAgNjQwNCwgMHhkN2MwNzg5MgorMSwgICAgICAyMjQyMiwgICAgICAyMjQyMiwgICAgIDE2MDIsICAgICA2NDA4LCAweDJhYWFkOTFkCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAyNTkyMDAsIDB4NTliZDVjMzQKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDI1OTIwMCwgMHhhZGIxZGE3NworMSwgICAgICAyNDAyNCwgICAgICAyNDAyNCwgICAgIDE2MDIsICAgICA2NDA4LCAweDY5YmZiNjQzCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAyNTkyMDAsIDB4MWY3ZDdiMTQKKzEsICAgICAgMjU2MjYsICAgICAgMjU2MjYsICAgICAxNjAxLCAgICAgNjQwNCwgMHgwZTY0NDkwNAorMSwgICAgICAyNzIyNywgICAgICAyNzIyNywgICAgIDE2MDIsICAgICA2NDA4LCAweDA2ZTkyZWEyCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAyNTkyMDAsIDB4Y2RkNDU0NjcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2NvcHktdHJhYzQ5MTQtYXZpIGIvdGVzdHMvcmVmL2ZhdGUvY29weS10cmFjNDkxNC1hdmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1OGVhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2NvcHktdHJhYzQ5MTQtYXZpCkBAIC0wLDAgKzEsNzMgQEAKKzI2ZTQyMDI2MzhiYzM4NGI4MmQyYjVlYjRkMzNhNWYwICp0ZXN0cy9kYXRhL2ZhdGUvY29weS10cmFjNDkxNC1hdmkuYXZpCis0Nzk0OTQgdGVzdHMvZGF0YS9mYXRlL2NvcHktdHJhYzQ5MTQtYXZpLmF2aQorI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQ4MHgyNzAKKyNzYXIgMDogMS8xCisjdGIgMTogMS80ODAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAxOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbworMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDExNTIsICAgICA0NjA4LCAweGIyNGY1YzlkCisxLCAgICAgICAxMTUyLCAgICAgICAxMTUyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4ZTJkYTVjMzIKKzEsICAgICAgIDIzMDQsICAgICAgIDIzMDQsICAgICAxMTUyLCAgICAgNDYwOCwgMHhkNzYwMjNkOQorMSwgICAgICAgMzQ1NiwgICAgICAgMzQ1NiwgICAgIDExNTIsICAgICA0NjA4LCAweGJlZmQ1MmYxCisxLCAgICAgICA0NjA4LCAgICAgICA0NjA4LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4NTBjZjBmMDAKKzEsICAgICAgIDU3NjAsICAgICAgIDU3NjAsICAgICAxMTUyLCAgICAgNDYwOCwgMHhmY2RhNGYwYworMSwgICAgICAgNjkxMiwgICAgICAgNjkxMiwgICAgIDExNTIsICAgICA0NjA4LCAweGJhMTMxNTQwCisxLCAgICAgICA4MDY0LCAgICAgICA4MDY0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4NGM3Yjk5YzAKKzEsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMTUyLCAgICAgNDYwOCwgMHhkMzc5ODY0NgorMSwgICAgICAxMDM2OCwgICAgICAxMDM2OCwgICAgIDExNTIsICAgICA0NjA4LCAweDNmNjUxMTdiCisxLCAgICAgIDExNTIwLCAgICAgIDExNTIwLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4NzM5MGRjMTcKKzEsICAgICAgMTI2NzIsICAgICAgMTI2NzIsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwYzNmN2I5ZgorMSwgICAgICAxMzgyNCwgICAgICAxMzgyNCwgICAgIDExNTIsICAgICA0NjA4LCAweDNiMTYyODljCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAyNTkyMDAsIDB4ZjM2OTU3ZGEKKzEsICAgICAgMTQ5NzYsICAgICAgMTQ5NzYsICAgICAxMTUyLCAgICAgNDYwOCwgMHhlMDllYjI1NgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMjU5MjAwLCAweDI5YTFmNTg2CisxLCAgICAgIDE2MTI4LCAgICAgIDE2MTI4LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MWFiNGU4ZmQKKzEsICAgICAgMTcyODAsICAgICAgMTcyODAsICAgICAxMTUyLCAgICAgNDYwOCwgMHgyMDA2NjBmOAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMjU5MjAwLCAweDU1NzhkOWMzCisxLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4ZDQ5MGQwZTQKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDI1OTIwMCwgMHg4MzkzOGI2MQorMSwgICAgICAxOTU4NCwgICAgICAxOTU4NCwgICAgIDExNTIsICAgICA0NjA4LCAweDlhNTI5YWFhCisxLCAgICAgIDIwNzM2LCAgICAgIDIwNzM2LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MGY1ZWJiNzYKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDI1OTIwMCwgMHhhNmNlNzYxOAorMSwgICAgICAyMTg4OCwgICAgICAyMTg4OCwgICAgIDExNTIsICAgICA0NjA4LCAweGYwYzlmMjU1CisxLCAgICAgIDIzMDQwLCAgICAgIDIzMDQwLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4ZjU5NjEyODgKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDI1OTIwMCwgMHg0ODkyYTBmNQorMSwgICAgICAyNDE5MiwgICAgICAyNDE5MiwgICAgIDExNTIsICAgICA0NjA4LCAweDJiNTg3ZGUyCisxLCAgICAgIDI1MzQ0LCAgICAgIDI1MzQ0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4YmJhNWNlY2UKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDI1OTIwMCwgMHg5MjFjNjA1MQorMSwgICAgICAyNjQ5NiwgICAgICAyNjQ5NiwgICAgIDExNTIsICAgICA0NjA4LCAweGQ0ZmFlYWQyCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAyNTkyMDAsIDB4NjE4YzAwMjYKKzEsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAxMTUyLCAgICAgNDYwOCwgMHg0NmQwYWM3YgorMSwgICAgICAyODgwMCwgICAgICAyODgwMCwgICAgIDExNTIsICAgICA0NjA4LCAweGEwMmQ1ODgxCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAyNTkyMDAsIDB4ZGJjM2NhNGQKKzEsICAgICAgMjk5NTIsICAgICAgMjk5NTIsICAgICAxMTUyLCAgICAgNDYwOCwgMHhjMzcwNTc3YQorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMjU5MjAwLCAweGYwODhjNzMxCisxLCAgICAgIDMxMTA0LCAgICAgIDMxMTA0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4YjEyYTM1MDgKKzEsICAgICAgMzIyNTYsICAgICAgMzIyNTYsICAgICAxMTUyLCAgICAgNDYwOCwgMHhjYzdmYWUyOAorMSwgICAgICAzMzQwOCwgICAgICAzMzQwOCwgICAgIDExNTIsICAgICA0NjA4LCAweDlhZTBiZDdkCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAyNTkyMDAsIDB4Y2U3N2RkZWUKKzEsICAgICAgMzQ1NjAsICAgICAgMzQ1NjAsICAgICAxMTUyLCAgICAgNDYwOCwgMHg0NmZlY2FkMgorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMjU5MjAwLCAweDc5ODU2NWViCisxLCAgICAgIDM1NzEyLCAgICAgIDM1NzEyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4M2VlNzA3ZTUKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDI1OTIwMCwgMHg1NzE4NWRjOAorMSwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDExNTIsICAgICA0NjA4LCAweGY2ZDcxODA4CisxLCAgICAgIDM4MDE2LCAgICAgIDM4MDE2LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4YTgzZTI0NDAKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDI1OTIwMCwgMHg2MDdhOTA4NgorMSwgICAgICAzOTE2OCwgICAgICAzOTE2OCwgICAgIDExNTIsICAgICA0NjA4LCAweDZkOTJlMmE4CiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAyNTkyMDAsIDB4NTliZDVjMzQKKzEsICAgICAgNDAzMjAsICAgICAgNDAzMjAsICAgICAxMTUyLCAgICAgNDYwOCwgMHg1OTUyNzJiMQorMSwgICAgICA0MTQ3MiwgICAgICA0MTQ3MiwgICAgIDExNTIsICAgICA0NjA4LCAweDM3ZmQyZTY0CisxLCAgICAgIDQyNjI0LCAgICAgIDQyNjI0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4NTY3M2FhMjIKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDI1OTIwMCwgMHhhZGIxZGE3NworMSwgICAgICA0Mzc3NiwgICAgICA0Mzc3NiwgICAgIDExNTIsICAgICA0NjA4LCAweGEyNzcxNTJjCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAyNTkyMDAsIDB4MWY3ZDdiMTQKKzEsICAgICAgNDQ5MjgsICAgICAgNDQ5MjgsICAgICAxMTUyLCAgICAgNDYwOCwgMHhhOTFiZjI2MQorMSwgICAgICA0NjA4MCwgICAgICA0NjA4MCwgICAgIDExNTIsICAgICA0NjA4LCAweDU4NzY5NDIwCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAyNTkyMDAsIDB4Y2RkNDU0NjcKKzEsICAgICAgNDcyMzIsICAgICAgNDcyMzIsICAgICAxMTUyLCAgICAgNDYwOCwgMHgxMTQ5ZTg5MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY29yZXBuZyBiL3Rlc3RzL3JlZi9mYXRlL2NvcmVwbmcKaW5kZXggZTIwMDcxNC4uNzRiYjkyMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY29yZXBuZworKysgYi90ZXN0cy9yZWYvZmF0ZS9jb3JlcG5nCkBAIC0xLDUgKzEsMTQgQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogI3RiIDE6IDEvMTEwMjUKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogMTEwMjUKKyNjaGFubmVsX2xheW91dCAxOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4MDNlMjVlYWQKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICA1NTEzLCAgICAxMTAyNiwgMHgyN2FkNjM3YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjMwNDAwLCAweDBhNTIwZmZkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9jcmMgYi90ZXN0cy9yZWYvZmF0ZS9jcmMKaW5kZXggOGFhMGRkMi4uN2I1OWEzYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY3JjCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2NyYwpAQCAtNCwzICs0LDQgQEAKIGNyYyAwMDAwQTAwMSA9IEJGRDgKIGNyYyAwMDAwODAwNSA9IEJCMUYKIGNyYyAwMDAwMDAwNyA9IEUzCitjcmMgMDAwMDAwMUQgPSBENgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY3JlYXR1cmVzaG9jay1hdnMgYi90ZXN0cy9yZWYvZmF0ZS9jcmVhdHVyZXNob2NrLWF2cwppbmRleCA0YzcyMWQ4Li5jOGUwOGM5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jcmVhdHVyZXNob2NrLWF2cworKysgYi90ZXN0cy9yZWYvZmF0ZS9jcmVhdHVyZXNob2NrLWF2cwpAQCAtMSw1ICsxLDE0IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzE4eDE5OAorI3NhciAwOiAwLzEKICN0YiAxOiAxLzIyMjIyCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDE6IDIyMjIyCisjY2hhbm5lbF9sYXlvdXQgMTogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTg4ODkyLCAweDlmNDdhNWVjCiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgODE4NiwgICAgMTYzNzIsIDB4ZmFhYWI1OWQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE4ODg5MiwgMHhkZWNlMDI2OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY3NjZCBiL3Rlc3RzL3JlZi9mYXRlL2NzY2QKaW5kZXggNzRmZTk0ZS4uOWFmN2IyZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY3NjZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jc2NkCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMDB4MzAwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjcwMDAwLCAweGY5MDAxNWQ4CiAwLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAyNzAwMDAsIDB4ZjkwMDE1ZDgKIDAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDI3MDAwMCwgMHhmOTAwMTVkOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY3ZpZC1ncmF5c2NhbGUgYi90ZXN0cy9yZWYvZmF0ZS9jdmlkLWdyYXlzY2FsZQppbmRleCAxYjU4NmIzLi5hNGY4ZGRlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jdmlkLWdyYXlzY2FsZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9jdmlkLWdyYXlzY2FsZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA5OTU2MS81MDAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEwMHg3NQorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyMjUwMCwgMHgwZjhlNTYyZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDIyNTAwLCAweDUwN2FlZjA2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjI1MDAsIDB4MDU5ZDYxMzcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2N2aWQtcGFsZXR0ZSBiL3Rlc3RzL3JlZi9mYXRlL2N2aWQtcGFsZXR0ZQppbmRleCA0OWRlMWMxLi5lYWU0MTYxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9jdmlkLXBhbGV0dGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY3ZpZC1wYWxldHRlCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDIwMC8yOTk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNjB4MTIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU3NjAwLCAweDFmNWM4OWI3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNTc2MDAsIDB4ZDIwNTVhYWYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA1NzYwMCwgMHgyMjMzNjA1MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvY3ZpZC1wYXJ0aWFsIGIvdGVzdHMvcmVmL2ZhdGUvY3ZpZC1wYXJ0aWFsCmluZGV4IGJiMzY4YTEuLjk5MDkzOWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2N2aWQtcGFydGlhbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9jdmlkLXBhcnRpYWwKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xMgorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDAweDE4NworI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIyNDQwMCwgMHhkOGYyZjMxMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjI0NDAwLCAweGUzODY3NmMyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMjQ0MDAsIDB4NzE2M2I2YWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2N5YmVyaWEtYzkzIGIvdGVzdHMvcmVmL2ZhdGUvY3liZXJpYS1jOTMKaW5kZXggZjAyNDM1Yy4uZTdhNWI1YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvY3liZXJpYS1jOTMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY3liZXJpYS1jOTMKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDIvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgxOTIKKyNzYXIgMDogNS82CiAjdGIgMTogMS8xNjEyOQorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAxOiAxNjEyOQorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE4NDMyMCwgMHg4NDMzZjBmOAogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgMTQxODQsICAgIDI4MzY4LCAweGFhY2M5NmE1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxODQzMjAsIDB4ZDBkNDgwZjcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2N5dXYgYi90ZXN0cy9yZWYvZmF0ZS9jeXV2CmluZGV4IDM3YmRkMmYuLjE4Y2FlYjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2N5dXYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvY3l1dgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAzMzMzMy8xMDAwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDUwMWU2YWJlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ODQ5NzZmMTMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHg4YzQ4N2FjYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZC1jaW5lbWEtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS9kLWNpbmVtYS1kZW11eAppbmRleCAyZjI4ZTQ2Li43NGQwMGY3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kLWNpbmVtYS1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kLWNpbmVtYS1kZW11eApAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzkwMDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMjRkYXVkCisjc2FtcGxlX3JhdGUgMDogOTYwMDAKKyNjaGFubmVsX2xheW91dCAwOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IDUuMShzaWRlKQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDE4NzUsICAgIDM2MDAwLCAweGQ1OTI3ODFkCiAwLCAgICAgICAxODc1LCAgICAgICAxODc1LCAgICAgMTg3NSwgICAgMzYwMDAsIDB4ZDU5Mjc4MWQKIDAsICAgICAgIDM3NTAsICAgICAgIDM3NTAsICAgICAxODc1LCAgICAzNjAwMCwgMHhkNTkyNzgxZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZC1lYXZwNi1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL2QtZWF2cDYtZGVtdXgKaW5kZXggMzU4N2EwOC4uN2NjMTNjZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZC1lYXZwNi1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kLWVhdnA2LWRlbXV4CkBAIC0xLDUgKzEsMTMgQEAKICN0YiAwOiAzMjc2Ny85ODIwMjcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdnA2CisjZGltZW5zaW9ucyAwOiA2NHg2NAorI3NhciAwOiAwLzEKICN0YiAxOiAzMjc2Ny85ODIwMjcKKyNtZWRpYV90eXBlIDE6IHZpZGVvCisjY29kZWNfaWQgMTogdnA2CisjZGltZW5zaW9ucyAxOiA2NHg2NAorI3NhciAxOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMTg2MCwgMHhiZDU0OGM0YwogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAxNzQ4LCAweDk2MDQ2Mjg0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDEwNDQsIDB4ODE0ZWZjODYsIEY9MHgwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzE2XzE5Ml83NjhfMCBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMTZfMTkyXzc2OF8wCmluZGV4IDBlMjJkNWQuLjZlNjJjNjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMTZfMTkyXzc2OF8wCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMTZfMTkyXzc2OF8wCkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8xOTIwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMTkyMDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNjBmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA1LjEoc2lkZSkKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDIwNDgsICAgIDI0NTc2LCA5MWZmMGRhYzVkZjg2ZTc5OGJmZWY1ZTU3MzUzNmIwOAogMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDIwNDgsICAgIDI0NTc2LCA5MWZmMGRhYzVkZjg2ZTc5OGJmZWY1ZTU3MzUzNmIwOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8xNl8xOTJfNzY4XzAtZG1peF8yIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8xNl8xOTJfNzY4XzAtZG1peF8yCmluZGV4IDBlMjJkNWQuLjZlNjJjNjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMTZfMTkyXzc2OF8wLWRtaXhfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzE2XzE5Ml83NjhfMC1kbWl4XzIKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzE5MjAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAxOTIwMDAKKyNjaGFubmVsX2xheW91dCAwOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IDUuMShzaWRlKQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMjA0OCwgICAgMjQ1NzYsIDkxZmYwZGFjNWRmODZlNzk4YmZlZjVlNTczNTM2YjA4CiAwLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMjA0OCwgICAgMjQ1NzYsIDkxZmYwZGFjNWRmODZlNzk4YmZlZjVlNTczNTM2YjA4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzE2XzE5Ml83NjhfMC1kbWl4XzYgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzE2XzE5Ml83NjhfMC1kbWl4XzYKaW5kZXggMGUyMmQ1ZC4uNmU2MmM2MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8xNl8xOTJfNzY4XzAtZG1peF82CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMTZfMTkyXzc2OF8wLWRtaXhfNgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMTkyMDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDE5MjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAyMDQ4LCAgICAyNDU3NiwgOTFmZjBkYWM1ZGY4NmU3OThiZmVmNWU1NzM1MzZiMDgKIDAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAyMDQ4LCAgICAyNDU3NiwgOTFmZjBkYWM1ZGY4NmU3OThiZmVmNWU1NzM1MzZiMDgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMTZfMTkyXzc2OF8xIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8xNl8xOTJfNzY4XzEKaW5kZXggMGUyMmQ1ZC4uNmU2MmM2MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8xNl8xOTJfNzY4XzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8xNl8xOTJfNzY4XzEKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzE5MjAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAxOTIwMDAKKyNjaGFubmVsX2xheW91dCAwOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IDUuMShzaWRlKQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMjA0OCwgICAgMjQ1NzYsIDkxZmYwZGFjNWRmODZlNzk4YmZlZjVlNTczNTM2YjA4CiAwLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMjA0OCwgICAgMjQ1NzYsIDkxZmYwZGFjNWRmODZlNzk4YmZlZjVlNTczNTM2YjA4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzE2XzE5Ml83NjhfMS1kbWl4XzIgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzE2XzE5Ml83NjhfMS1kbWl4XzIKaW5kZXggZDk3YWQyZi4uMTc4OTZhNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8xNl8xOTJfNzY4XzEtZG1peF8yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMTZfMTkyXzc2OF8xLWRtaXhfMgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMTkyMDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDE5MjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMjA0OCwgICAgIDgxOTIsIDA4MjlmNzE3NDBhYWIxYWI5OGIzM2VhZTIxZGVlMTIyCiAwLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMjA0OCwgICAgIDgxOTIsIGM4Y2ExY2ZmNDQ2NzQ4MDlkNDY0ZWMzOWNmMWJkMWU5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzE2XzE5Ml83NjhfMS1kbWl4XzYgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzE2XzE5Ml83NjhfMS1kbWl4XzYKaW5kZXggMGUyMmQ1ZC4uNmU2MmM2MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8xNl8xOTJfNzY4XzEtZG1peF82CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMTZfMTkyXzc2OF8xLWRtaXhfNgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMTkyMDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDE5MjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAyMDQ4LCAgICAyNDU3NiwgOTFmZjBkYWM1ZGY4NmU3OThiZmVmNWU1NzM1MzZiMDgKIDAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAyMDQ4LCAgICAyNDU3NiwgOTFmZjBkYWM1ZGY4NmU3OThiZmVmNWU1NzM1MzZiMDgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfNzY4IGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF83NjgKaW5kZXggNDdhNjJlYy4uMmQxMDU4MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF83NjgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF83NjgKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMjRsZQorI3NhbXBsZV9yYXRlIDA6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNjBmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA1LjEoc2lkZSkKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA1MTIsICAgICA5MjE2LCAxM2E5NTg5MGI1ZjA5NDdkNmYwNThjYTljMzBhM2UwMQogMCwgICAgICAgIDUxMiwgICAgICAgIDUxMiwgICAgICA1MTIsICAgICA5MjE2LCAxM2E5NTg5MGI1ZjA5NDdkNmYwNThjYTljMzBhM2UwMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF83NjgtZG1peF8yIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF83NjgtZG1peF8yCmluZGV4IDFhNzM2Y2YuLmJlMjJkN2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfNzY4LWRtaXhfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzI0XzQ4Xzc2OC1kbWl4XzIKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMjRsZQorI3NhbXBsZV9yYXRlIDA6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgNTEyLCAgICAgMzA3MiwgZDJhNzA1NTA0ODlkZTM1NmEyY2Q2YmZjNDA3MTEyMDQKIDAsICAgICAgICA1MTIsICAgICAgICA1MTIsICAgICAgNTEyLCAgICAgMzA3MiwgZDJhNzA1NTA0ODlkZTM1NmEyY2Q2YmZjNDA3MTEyMDQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfNzY4LWRtaXhfNiBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfNzY4LWRtaXhfNgppbmRleCA0N2E2MmVjLi4yZDEwNTgzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzI0XzQ4Xzc2OC1kbWl4XzYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF83NjgtZG1peF82CkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS80ODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczI0bGUKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgNTEyLCAgICAgOTIxNiwgMTNhOTU4OTBiNWYwOTQ3ZDZmMDU4Y2E5YzMwYTNlMDEKIDAsICAgICAgICA1MTIsICAgICAgICA1MTIsICAgICAgNTEyLCAgICAgOTIxNiwgMTNhOTU4OTBiNWYwOTQ3ZDZmMDU4Y2E5YzMwYTNlMDEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfbm9uZSBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfbm9uZQppbmRleCBkZmZjNTg3Li4xN2NmZDBlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzI0XzQ4X25vbmUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF9ub25lCkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS80ODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczI0bGUKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAxODQzMiwgZjlkZWJlM2YwN2JlNjg1MzNiZjAyOTVlM2QyYmE2OGEKIDAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAxODQzMiwgNjcwN2RhYTc3MjRmZGM1NTI4NjllNTIyYTc5MzZmMjYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfbm9uZS1kbWl4XzIgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzI0XzQ4X25vbmUtZG1peF8yCmluZGV4IGRmZmM1ODcuLjE3Y2ZkMGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfbm9uZS1kbWl4XzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF9ub25lLWRtaXhfMgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MyNGxlCisjc2FtcGxlX3JhdGUgMDogNDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IDUuMShzaWRlKQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgMTg0MzIsIGY5ZGViZTNmMDdiZTY4NTMzYmYwMjk1ZTNkMmJhNjhhCiAwLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgMTg0MzIsIDY3MDdkYWE3NzI0ZmRjNTUyODY5ZTUyMmE3OTM2ZjI2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzI0XzQ4X25vbmUtZG1peF82IGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF81MV8yNF80OF9ub25lLWRtaXhfNgppbmRleCBkZmZjNTg3Li4xN2NmZDBlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzUxXzI0XzQ4X25vbmUtZG1peF82CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNTFfMjRfNDhfbm9uZS1kbWl4XzYKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMjRsZQorI3NhbXBsZV9yYXRlIDA6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNjBmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA1LjEoc2lkZSkKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgIDE4NDMyLCBmOWRlYmUzZjA3YmU2ODUzM2JmMDI5NWUzZDJiYTY4YQogMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgIDE4NDMyLCA2NzA3ZGFhNzcyNGZkYzU1Mjg2OWU1MjJhNzkzNmYyNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMCBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfNDhfNzY4XzAKaW5kZXggYzEyMmM2YS4uYTI5NWQ0MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8wCkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS80ODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczI0bGUKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYzZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNy4xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgNTEyLCAgICAxMjI4OCwgY2E5ZjhjOGViMWI5YjMxMWNiNzk5OTlmYTM3NmM3ZjAKIDAsICAgICAgICA1MTIsICAgICAgICA1MTIsICAgICAgNTEyLCAgICAxMjI4OCwgNDA3Mjc4M2I4ZWZiOTlhOWU1ODE3MDY3ZDY4ZjYxYzYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfNDhfNzY4XzAtZG1peF8yIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMC1kbWl4XzIKaW5kZXggZDY1M2FmOC4uZjliN2I2NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMC1kbWl4XzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMC1kbWl4XzIKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMjRsZQorI3NhbXBsZV9yYXRlIDA6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNjBmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA1LjEoc2lkZSkKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA1MTIsICAgICA5MjE2LCBhMmI3MjRiMTQ2MDY5OTM4ZjBlMmNiODI0OTBkZWE1NAogMCwgICAgICAgIDUxMiwgICAgICAgIDUxMiwgICAgICA1MTIsICAgICA5MjE2LCAxM2E5NTg5MGI1ZjA5NDdkNmYwNThjYTljMzBhM2UwMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMC1kbWl4XzYgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8wLWRtaXhfNgppbmRleCBkNjUzYWY4Li5mOWI3YjY1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8wLWRtaXhfNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8wLWRtaXhfNgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MyNGxlCisjc2FtcGxlX3JhdGUgMDogNDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IDUuMShzaWRlKQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDUxMiwgICAgIDkyMTYsIGEyYjcyNGIxNDYwNjk5MzhmMGUyY2I4MjQ5MGRlYTU0CiAwLCAgICAgICAgNTEyLCAgICAgICAgNTEyLCAgICAgIDUxMiwgICAgIDkyMTYsIDEzYTk1ODkwYjVmMDk0N2Q2ZjA1OGNhOWMzMGEzZTAxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8xIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMQppbmRleCBjMTIyYzZhLi5hMjk1ZDQxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfNDhfNzY4XzEKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMjRsZQorI3NhbXBsZV9yYXRlIDA6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNjNmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA3LjEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA1MTIsICAgIDEyMjg4LCBjYTlmOGM4ZWIxYjliMzExY2I3OTk5OWZhMzc2YzdmMAogMCwgICAgICAgIDUxMiwgICAgICAgIDUxMiwgICAgICA1MTIsICAgIDEyMjg4LCA0MDcyNzgzYjhlZmI5OWE5ZTU4MTcwNjdkNjhmNjFjNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMS1kbWl4XzIgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8xLWRtaXhfMgppbmRleCA1OGMzODFjLi41YjAxNzQ2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8xLWRtaXhfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8xLWRtaXhfMgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MyNGxlCisjc2FtcGxlX3JhdGUgMDogNDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA1MTIsICAgICAzMDcyLCBkMmE3MDU1MDQ4OWRlMzU2YTJjZDZiZmM0MDcxMTIwNAogMCwgICAgICAgIDUxMiwgICAgICAgIDUxMiwgICAgICA1MTIsICAgICAzMDcyLCBkMmE3MDU1MDQ4OWRlMzU2YTJjZDZiZmM0MDcxMTIwNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF80OF83NjhfMS1kbWl4XzYgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8xLWRtaXhfNgppbmRleCBkNjEwNDhjLi4yNDZiNWUwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8xLWRtaXhfNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0XzQ4Xzc2OF8xLWRtaXhfNgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MyNGxlCisjc2FtcGxlX3JhdGUgMDogNDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IDUuMShzaWRlKQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDUxMiwgICAgIDkyMTYsIGEyYjcyNGIxNDYwNjk5MzhmMGUyY2I4MjQ5MGRlYTU0CiAwLCAgICAgICAgNTEyLCAgICAgICAgNTEyLCAgICAgIDUxMiwgICAgIDkyMTYsIDEzYTk1ODkwYjVmMDk0N2Q2ZjA1OGNhOWMzMGEzZTAxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0Xzk2Xzc2OCBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfOTZfNzY4CmluZGV4IDcyZGE1MjYuLjQxOGI0YjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfOTZfNzY4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfOTZfNzY4CkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS85NjAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczI0bGUKKyNzYW1wbGVfcmF0ZSAwOiA5NjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYzZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNy4xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAyNDU3NiwgMGIyNGE1MjdkNjZmMmIwY2FiOTdmMzdlNGNkNzk5ODcKIDAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAyNDU3NiwgOTFmZjBkYWM1ZGY4NmU3OThiZmVmNWU1NzM1MzZiMDgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfOTZfNzY4LWRtaXhfMiBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfOTZfNzY4LWRtaXhfMgppbmRleCBiMjRjNzE3Li45YmQwMjU2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0Xzk2Xzc2OC1kbWl4XzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF85Nl83NjgtZG1peF8yCkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS85NjAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczI0bGUKKyNzYW1wbGVfcmF0ZSAwOiA5NjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAxODQzMiwgMGE2NzVmMTcyYjBlMWExNzFjNDZkZmFhNGYxZDBmMDAKIDAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAxODQzMiwgZjlkZWJlM2YwN2JlNjg1MzNiZjAyOTVlM2QyYmE2OGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfOTZfNzY4LWRtaXhfNiBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfNzFfMjRfOTZfNzY4LWRtaXhfNgppbmRleCBiMjRjNzE3Li45YmQwMjU2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsXzcxXzI0Xzk2Xzc2OC1kbWl4XzYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF83MV8yNF85Nl83NjgtZG1peF82CkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS85NjAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczI0bGUKKyNzYW1wbGVfcmF0ZSAwOiA5NjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAxODQzMiwgMGE2NzVmMTcyYjBlMWExNzFjNDZkZmFhNGYxZDBmMDAKIDAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAxODQzMiwgZjlkZWJlM2YwN2JlNjg1MzNiZjAyOTVlM2QyYmE2OGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeDk2XzUxXzI0Xzk2XzE1MDkgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsX3g5Nl81MV8yNF85Nl8xNTA5CmluZGV4IDE1MGFiMjUuLmJjODNmNzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeDk2XzUxXzI0Xzk2XzE1MDkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94OTZfNTFfMjRfOTZfMTUwOQpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvOTYwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MyNGxlCisjc2FtcGxlX3JhdGUgMDogOTYwMDAKKyNjaGFubmVsX2xheW91dCAwOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IDUuMShzaWRlKQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgMTg0MzIsIGY5ZGViZTNmMDdiZTY4NTMzYmYwMjk1ZTNkMmJhNjhhCiAwLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgMTg0MzIsIGY5ZGViZTNmMDdiZTY4NTMzYmYwMjk1ZTNkMmJhNjhhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsX3g5Nl81MV8yNF85Nl8xNTA5LWRtaXhfMiBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeDk2XzUxXzI0Xzk2XzE1MDktZG1peF8yCmluZGV4IDE1MGFiMjUuLmJjODNmNzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeDk2XzUxXzI0Xzk2XzE1MDktZG1peF8yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeDk2XzUxXzI0Xzk2XzE1MDktZG1peF8yCkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS85NjAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczI0bGUKKyNzYW1wbGVfcmF0ZSAwOiA5NjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAxODQzMiwgZjlkZWJlM2YwN2JlNjg1MzNiZjAyOTVlM2QyYmE2OGEKIDAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAxODQzMiwgZjlkZWJlM2YwN2JlNjg1MzNiZjAyOTVlM2QyYmE2OGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeDk2XzUxXzI0Xzk2XzE1MDktZG1peF82IGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94OTZfNTFfMjRfOTZfMTUwOS1kbWl4XzYKaW5kZXggMTUwYWIyNS4uYmM4M2Y3OSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94OTZfNTFfMjRfOTZfMTUwOS1kbWl4XzYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94OTZfNTFfMjRfOTZfMTUwOS1kbWl4XzYKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzk2MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMjRsZQorI3NhbXBsZV9yYXRlIDA6IDk2MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNjBmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA1LjEoc2lkZSkKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgIDE4NDMyLCBmOWRlYmUzZjA3YmU2ODUzM2JmMDI5NWUzZDJiYTY4YQogMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgIDE4NDMyLCBmOWRlYmUzZjA3YmU2ODUzM2JmMDI5NWUzZDJiYTY4YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94Y2hfNjFfMjRfNDhfNzY4IGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94Y2hfNjFfMjRfNDhfNzY4CmluZGV4IDIxMWFlZTEuLjE5ODE2ZDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeGNoXzYxXzI0XzQ4Xzc2OAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsX3hjaF82MV8yNF80OF83NjgKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMjRsZQorI3NhbXBsZV9yYXRlIDA6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNzBmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA2LjEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA1MTIsICAgIDEwNzUyLCBjM2M1YjIzNmMyNjZhOTA5MDM3OGRlZjFhZDQ5N2EyMQogMCwgICAgICAgIDUxMiwgICAgICAgIDUxMiwgICAgICA1MTIsICAgIDEwNzUyLCAzNmViNjc0OWY4ZDljZTlmOTQ4NjBkY2M0NDcyNTNhYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94Y2hfNjFfMjRfNDhfNzY4LWRtaXhfMiBiL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeGNoXzYxXzI0XzQ4Xzc2OC1kbWl4XzIKaW5kZXggOTMwOWQ4ZC4uMWY2OTg5ZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94Y2hfNjFfMjRfNDhfNzY4LWRtaXhfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsX3hjaF82MV8yNF80OF83NjgtZG1peF8yCkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS80ODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczI0bGUKKyNzYW1wbGVfcmF0ZSAwOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgNTEyLCAgICAgOTIxNiwgNjUyYzRlNjFmOWFiZTlmYmE5ZGU3OTIyNDJlMmQzMWQKIDAsICAgICAgICA1MTIsICAgICAgICA1MTIsICAgICAgNTEyLCAgICAgOTIxNiwgMTNhOTU4OTBiNWYwOTQ3ZDZmMDU4Y2E5YzMwYTNlMDEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeGNoXzYxXzI0XzQ4Xzc2OC1kbWl4XzYgYi90ZXN0cy9yZWYvZmF0ZS9kY2EteGxsX3hjaF82MV8yNF80OF83NjgtZG1peF82CmluZGV4IDkzMDlkOGQuLjFmNjk4OWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjYS14bGxfeGNoXzYxXzI0XzQ4Xzc2OC1kbWl4XzYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGNhLXhsbF94Y2hfNjFfMjRfNDhfNzY4LWRtaXhfNgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MyNGxlCisjc2FtcGxlX3JhdGUgMDogNDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IDUuMShzaWRlKQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDUxMiwgICAgIDkyMTYsIDY1MmM0ZTYxZjlhYmU5ZmJhOWRlNzkyMjQyZTJkMzFkCiAwLCAgICAgICAgNTEyLCAgICAgICAgNTEyLCAgICAgIDUxMiwgICAgIDkyMTYsIDEzYTk1ODkwYjVmMDk0N2Q2ZjA1OGNhOWMzMGEzZTAxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kY2luZW1hLWVuY29kZSBiL3Rlc3RzL3JlZi9mYXRlL2RjaW5lbWEtZW5jb2RlCmluZGV4IDkzYWMxNzIuLjAzZTZlNmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RjaW5lbWEtZW5jb2RlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RjaW5lbWEtZW5jb2RlCkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS85NjAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA5NjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNS4xKHNpZGUpCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgMzQxLCAgICAgNDA5MiwgNjk3Y2RkZmNkMGUyMWYyNDc4MmFmMDcwNWI3MDQ4ZjMKIDAsICAgICAgICAzNDEsICAgICAgICAzNDEsICAgICAgMzQxLCAgICAgNDA5MiwgYTA1N2IxOGNkNDkzOTIzZmVkMzNjMTg1NzhmNjFlMGIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1hbHBoYTggYi90ZXN0cy9yZWYvZmF0ZS9kZHMtYWxwaGE4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTg2ODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtYWxwaGE4CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyMngxMjIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTQ4ODQsIDB4ZjgxYzQ3ZjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1hcmdiIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWFyZ2IKaW5kZXggZmJkZTQyNC4uZjIzMDEzMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWFyZ2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWFyZ2IKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjIweDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU2MzIwLCAweGZjYWE5MjBiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtYXJnYi1hZXhwIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWFyZ2ItYWV4cAppbmRleCBmNTI0MTBmLi4wZTJiOWFmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtYXJnYi1hZXhwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1hcmdiLWFleHAKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4ZmRkMzdjNDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjMSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjMQppbmRleCA4NGVmZDlmLi5lOTliZjAwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHgxMC1iYzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4MTAtYmMxCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweGVkMmY4NTBmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHgxMC1iYzFhIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4MTAtYmMxYQppbmRleCA4Y2I0NTg5Li41M2EyMjU2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHgxMC1iYzFhCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjMWEKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4NDczYjQ4NGIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjMiBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjMgppbmRleCBhMjUxODBkLi41YzMxYjM4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHgxMC1iYzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4MTAtYmMyCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDJiY2UzYmFhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHgxMC1iYzMgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHgxMC1iYzMKaW5kZXggMjk2Yzk0NS4uNGJjNGVmNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4MTAtYmMzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjMwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjM4NCwgMHhiOTFkM2M2MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4MTAtYmM0IGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4MTAtYmM0CmluZGV4IDQ1ODNkMjUuLjhkNTdjZmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHgxMC1iYzQKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4ZmRmZDE3NTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjNSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keDEwLWJjNQppbmRleCBiZjU5NWViLi5kOGU0NzM0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHgxMC1iYzUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4MTAtYmM1CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDc5YmQyMDdlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0MSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQxCmluZGV4IDI0Nzc0MDYuLmYxYzZjOWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQxCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHg2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzMjc2OCwgMHhmNTJhZGM4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDEtbm9ybWFsbWFwIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDEtbm9ybWFsbWFwCmluZGV4IDNmNzc1NDcuLjE1ZDYzYjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQxLW5vcm1hbG1hcAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0MS1ub3JtYWxtYXAKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4MmI0MTE4NTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQxYSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQxYQppbmRleCAwNWJlMzE0Li4xNzg2YjQ5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0MWEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDFhCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweGNhYmI1MGVhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0MiBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQyCmluZGV4IDQwYmNmNmUuLmI1YmRmYmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQyCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDExY2ViZWIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0MyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQzCmluZGV4IDQxNDAxZGEuLmQ5M2UzNWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQzCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDcyOWI3NGJhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NCBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ0CmluZGV4IGRjNWQ3M2YuLjEzNmRmZDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ0CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDMxYWFhY2Q2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1CmluZGV4IDM5OWQ2ZDkuLjY5NmUwMzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweGZkMzE2NmFhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1hZXhwIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUtYWV4cAppbmRleCBmZjkxYWZkLi4zMzRkY2MxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1hZXhwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LWFleHAKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4M2M5ODc5MTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LW5vcm1hbG1hcCBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LW5vcm1hbG1hcAppbmRleCA2ODBkMWI3Li5iNTYyYjE5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1ub3JtYWxtYXAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUtbm9ybWFsbWFwCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweGQyOWIxZWExCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1ub3JtYWxtYXAtYXRpIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUtbm9ybWFsbWFwLWF0aQppbmRleCA3ZjA4OGY3Li5iMWZiNTNkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1ub3JtYWxtYXAtYXRpCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LW5vcm1hbG1hcC1hdGkKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4NTRjYjIxMmYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXJieGcgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1yYnhnCmluZGV4IDdkYmVjZjQuLjAxNzc5NDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXJieGcKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUtcmJ4ZwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjM4NCwgMHgzNzU4OGQxMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUtcmd4YiBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXJneGIKaW5kZXggMTM3OTEzZC4uNTIyNjc5YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUtcmd4YgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1yZ3hiCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweGZiNmI5MWNmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1yeGJnIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUtcnhiZwppbmRleCBiNmUxMmQzLi5jYzZhMjM5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1yeGJnCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXJ4YmcKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4YzZjYjhjYmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXJ4Z2IgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS1yeGdiCmluZGV4IGE0MTkwZDUuLjlkNzBhZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXJ4Z2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUtcnhnYgpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjM4NCwgMHhiNjdkOTM2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUteGdiciBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXhnYnIKaW5kZXggOTU0MDRmMi4uMmY4MmNkYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUteGdicgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS14Z2JyCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweGIwZTY5MjkzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS14Z3hyIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUteGd4cgppbmRleCAzZWQ3M2MzLi4zNTU1NDQ5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS14Z3hyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXhneHIKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4YTkzZGUxYWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXhyYmcgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS14cmJnCmluZGV4IGY2NDc5NTUuLmU2MjI4ZjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXhyYmcKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUteHJiZwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjM4NCwgMHhmMjBkOGI2OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUteWNvY2cgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS15Y29jZwppbmRleCAxZGQ4YmVmLi43Zjk4NjUyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS15Y29jZworKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS15Y29jZwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjM4NCwgMHgwZDBjOGQyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUteWNvY2ctc2NhbGVkIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLWR4dDUteWNvY2ctc2NhbGVkCmluZGV4IDVhNzBiNDkuLjJlNzRhODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1keHQ1LXljb2NnLXNjYWxlZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtZHh0NS15Y29jZy1zY2FsZWQKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4NWEwODk5NzMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1tb25vYiBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1tb25vYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjliNDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLW1vbm9iCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyMngxMjIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDE5NTIsIDB4NzE2NDk4YTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1wYWwgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtcGFsCmluZGV4IDU3NWE0YmQuLjA4YzE0YTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1wYWwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXBhbApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY1NTM2LCAweDQyODdlNWNkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcGFsLWF0aSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1wYWwtYXRpCmluZGV4IDZkZThhZGIuLjMzMDNmNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1wYWwtYXRpCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1wYWwtYXRpCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDZhYzE4MDYwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcmdiMTU1NSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ2IxNTU1Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTcwMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtcmdiMTU1NQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjJ4MTIyCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDI5NzY4LCAweGJkYzA5OWRiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcmdiMTYgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtcmdiMTYKaW5kZXggNDBhOTkzOC4uNzg2NTA3MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXJnYjE2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ2IxNgpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4Yzg5MTAyNjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ2IyNCBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ2IyNAppbmRleCAzZWViMWViLi4yZDRlN2VkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcmdiMjQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXJnYjI0CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHg2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyNDU3NiwgMHhlZjBmOTY1MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXJnYjU1NSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ2I1NTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjMzIwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ2I1NTUKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTIyeDEyMgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyOTc2OCwgMHgyNzdkODYyOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXJnYmEgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtcmdiYQppbmRleCA4MDNiNDBhLi43YTE0NjczIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcmdiYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtcmdiYQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MHg4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyNTYwMCwgMHhhMmE0N2IyZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXJndGMxcyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ3RjMXMKaW5kZXggNTA4NTk2Mi4uZjBlMjcxYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXJndGMxcworKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtcmd0YzFzCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweGNkYTY1MmE0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcmd0YzF1IGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXJndGMxdQppbmRleCBiN2NmZjY2Li41ZWY1YzA1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcmd0YzF1CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ3RjMXUKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4NjI5YTFiNDQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ3RjMnMgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtcmd0YzJzCmluZGV4IDcyMjc2MDIuLjllODY1M2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ3RjMnMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXJndGMycwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg2NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjM4NCwgMHhhMDEzNWNhOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXJndGMydSBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ3RjMnUKaW5kZXggMGI2Njc4Yi4uOWQzNjgzZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXJndGMydQorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMtcmd0YzJ1CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDM4Y2IyMjFhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcmd0YzJ1LXh5IGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXJndGMydS14eQppbmRleCBiZjU5NWViLi5kOGU0NzM0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZHMtcmd0YzJ1LXh5CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy1yZ3RjMnUteHkKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4NzliZDIwN2UKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy11eXZ5IGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXV5dnkKaW5kZXggMmJjYmFhMC4uYjZmYTIyMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXV5dnkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXV5dnkKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDgxOTIsIDB4M2M2NTg3NTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy14YmdyIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXhiZ3IKaW5kZXggZWI3YTAyNC4uZDRmNGQ5OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXhiZ3IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXhiZ3IKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4NzAzMzZhMjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy14cmdiIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXhyZ2IKaW5kZXggNjNlNTIyNS4uMjNkNDY2NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXhyZ2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXhyZ2IKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4NzAyZjZhMjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy15IGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXkKaW5kZXggYWU2MjA5MS4uOWE4ZjAxZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXkKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA4MTkyLCAweDU2ZWNhOTBmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZHMteWEgYi90ZXN0cy9yZWYvZmF0ZS9kZHMteWEKaW5kZXggZDY1MjdjNi4uYTBmMTJiNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXlhCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rkcy15YQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1Ci0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjgxNjAsIDB4ZDM5ODFmY2IKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDIyMHg2NAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyODE2MCwgMHg1YWE0MWZjYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXljb2NnIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXljb2NnCmluZGV4IGYzZGQ3MjcuLjZkMjI4NDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy15Y29jZworKysgYi90ZXN0cy9yZWYvZmF0ZS9kZHMteWNvY2cKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4NGNiMDhkMGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rkcy15dXl2IGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXl1eXYKaW5kZXggZTY1Yzk1MC4uMDdlZmQ4NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGRzLXl1eXYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGRzLXl1eXYKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDgxOTIsIDB4YzExMDg3NTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RlbHBoaW5lLWNpbi1hdWRpbyBiL3Rlc3RzL3JlZi9mYXRlL2RlbHBoaW5lLWNpbi1hdWRpbwppbmRleCAxYTk0YTZiLi42ZmRjODA0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZWxwaGluZS1jaW4tYXVkaW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGVscGhpbmUtY2luLWF1ZGlvCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjIwNTAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICA4ODIyNCwgICAxNzY0NDgsIDB4NTQxZGRjNTUKIDAsICAgICAgODgyMjQsICAgICAgODgyMjQsICAgICAxODM4LCAgICAgMzY3NiwgMHhhZjQ1NTA4MQogMCwgICAgICA5MDA2MiwgICAgICA5MDA2MiwgICAgIDE4MzgsICAgICAzNjc2LCAweDI3ZWY0ZTkxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZWxwaGluZS1jaW4tdmlkZW8gYi90ZXN0cy9yZWYvZmF0ZS9kZWxwaGluZS1jaW4tdmlkZW8KaW5kZXggZmVhZWEyNi4uNmQyNTE2NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGVscGhpbmUtY2luLXZpZGVvCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RlbHBoaW5lLWNpbi12aWRlbwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEyCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTYwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUzNjAwLCAweDAwMDAwMDAwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTM2MDAsIDB4OWM3Nzg2MmMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MzYwMCwgMHhkNDg3YzMzYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGVsdXhlcGFpbnQtYW5tIGIvdGVzdHMvcmVmL2ZhdGUvZGVsdXhlcGFpbnQtYW5tCmluZGV4IGU2OWI5NWUuLmU0NjZmMjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RlbHV4ZXBhaW50LWFubQorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZWx1eGVwYWludC1hbm0KQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5MjAwMCwgMHg4MmE3OTY0MQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTkyMDAwLCAweDQzMDc5OTcxCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTIwMDAsIDB4NjMxMWYxZTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RmYTEgYi90ZXN0cy9yZWYvZmF0ZS9kZmExCmluZGV4IDdiYzViZjEuLjM3NjQzOTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RmYTEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGZhMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxNi8xMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA5MjE2MDAsIDB4YjY5ZmFhMzQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDkyMTYwMCwgMHgzODY4MDgyOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgOTIxNjAwLCAweGE3MjYzYzVhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZmExMCBiL3Rlc3RzL3JlZi9mYXRlL2RmYTEwCmluZGV4IGE3OTlmMDMuLjhlMGUzYzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RmYTEwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RmYTEwCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDcxLzEwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyMDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTIwMDAsIDB4NzM4NGY5YjIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5MjAwMCwgMHhkMWY2MWM3MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTkyMDAwLCAweDBjNjkzN2QxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZmExMSBiL3Rlc3RzL3JlZi9mYXRlL2RmYTExCmluZGV4IDMwYjRiNzEuLjIyNTcxYjUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RmYTExCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RmYTExCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDcxLzEwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyMDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTIwMDAsIDB4NDI2OWQ3MDMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5MjAwMCwgMHhkZjg2NjdlNwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTkyMDAwLCAweDQ1MDAyNmFkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZmEyIGIvdGVzdHMvcmVmL2ZhdGUvZGZhMgppbmRleCBjYzRiNDU0Li4wZmQ1NWI3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZmEyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RmYTIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogNzEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDkyMTYwMCwgMHg4YTVkMTVkZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgOTIxNjAwLCAweDkyYzAxMzYyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA5MjE2MDAsIDB4ZTFhMzE2NDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RmYTMgYi90ZXN0cy9yZWYvZmF0ZS9kZmEzCmluZGV4IDliMTcwZWMuLjQxNzI1MGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RmYTMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGZhMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjAwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTkyMDAwLCAweDIzNmExYjU0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTIwMDAsIDB4ZmI0MzhiNjgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE5MjAwMCwgMHhkZTUwNDU2MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGZhNCBiL3Rlc3RzL3JlZi9mYXRlL2RmYTQKaW5kZXggMGUwZGMwMi4uNzZhNGVkZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGZhNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZmE0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDcxLzUwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDkyMTYwMCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgOTIxNjAwLCAweGQ5ZTA2MGUzCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA5MjE2MDAsIDB4MTVlMjhkYzcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RmYTUgYi90ZXN0cy9yZWYvZmF0ZS9kZmE1CmluZGV4IDNiZTNjNTIuLmM4MzZiZjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RmYTUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGZhNQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjAwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTkyMDAwLCAweDk3NTQ4OTBmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTIwMDAsIDB4MDE2Njg5NjUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE5MjAwMCwgMHhiZDFiNWUxMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGZhNiBiL3Rlc3RzL3JlZi9mYXRlL2RmYTYKaW5kZXggNTM1Zjk4Yi4uODNiMTk5OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGZhNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kZmE2CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDcxLzEwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyMDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTIwMDAsIDB4YjcxOGRjNjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5MjAwMCwgMHgyZWZiN2I4OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTkyMDAwLCAweDcwODI3MDQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZmE3IGIvdGVzdHMvcmVmL2ZhdGUvZGZhNwppbmRleCAyODEyMmM1Li42YTYyZjcyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZmE3CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RmYTcKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogNzEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDZ4NTcKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDc4NjYsIDB4YWI3M2RhZTcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgNzg2NiwgMHgxMDBhZGVjOAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgICA3ODY2LCAweDFhMjBkZGZhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kZmE4IGIvdGVzdHMvcmVmL2ZhdGUvZGZhOAppbmRleCA4NjYyNjBhLi43YjgzZjNlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kZmE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RmYTgKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogNzEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjE4eDIwNgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEzNDcyNCwgMHg1Mzc4NGNhOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTM0NzI0LCAweDE0YzM0NWI3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMzQ3MjQsIDB4ZTBkMGRkNTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RmYTkgYi90ZXN0cy9yZWYvZmF0ZS9kZmE5CmluZGV4IDk5ZWIzZjYuLjc0YjU5NmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RmYTkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGZhOQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA3MS8xMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMzh4MjI1Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjI4MTUwLCAweGRlNjhkZjQ5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMjgxNTAsIDB4OGUxMmJjYWYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIyODE1MCwgMHg4NTFiMDRmNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGljdCBiL3Rlc3RzL3JlZi9mYXRlL2RpY3QKaW5kZXggODM3ZjdiMC4uNzIwNWU0YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZGljdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kaWN0CkBAIC0yLDI0ICsyLDMxIEBACiAKIGFhYSBhYWEgICBiLGIgYmJiICAgYz1jIGNjYyAgIGRkZCBkLGQgICBlZWUgZT1lICAgZixmIGY9ZiAgIGc9ZyBnLGcKIGFhYT1hYWEsYlwsYj1iYmIsY1w9Yz1jY2MsZGRkPWRcLGQsZWVlPWVcPWUsZlwsZj1mXD1mLGdcPWc9Z1wsZworcmV0IDAKIGFhYSBhYWEgICBiLGIgYmJiICAgYz1jIGNjYyAgIGRkZCBkLGQgICBlZWUgZT1lICAgZixmIGY9ZiAgIGc9ZyBnLGcKIGFhYSBhYWEgICBiYmIgYmJiICAgY2NjIGNjYyAgIFwsPSciIFwsPSciCiBhYWE9YWFhImJiYj1iYmIiY2NjPWNjYyJcXCxcPVwnXCI9XFwsXD1cJ1wiCityZXQgMAogYWFhIGFhYSAgIGJiYiBiYmIgICBjY2MgY2NjICAgXCw9JyIgXCw9JyIKIGFhYSBhYWEgICBiYmIgYmJiICAgY2NjIGNjYyAgIFwsPSciIFwsPSciCiBhYWE9YWFhJ2JiYj1iYmInY2NjPWNjYydcXCxcPVwnIj1cXCxcPVwnIgorcmV0IDAKIGFhYSBhYWEgICBiYmIgYmJiICAgY2NjIGNjYyAgIFwsPSciIFwsPSciCiBhYWEgYWFhICAgYmJiIGJiYiAgIGNjYyBjY2MgICBcLD0nIiBcLD0nIgogYWFhImFhYSxiYmIiYmJiLGNjYyJjY2MsXFxcLD1cJ1wiIlxcXCw9XCdcIgorcmV0IDAKIGFhYSBhYWEgICBiYmIgYmJiICAgY2NjIGNjYyAgIFwsPSciIFwsPSciCiBhYWEgYWFhICAgYmJiIGJiYiAgIGNjYyBjY2MgICBcLD0nIiBcLD0nIgogYWFhJ2FhYSxiYmInYmJiLGNjYydjY2MsXFxcLD1cJyInXFxcLD1cJyIKK3JldCAwCiBhYWEgYWFhICAgYmJiIGJiYiAgIGNjYyBjY2MgICBcLD0nIiBcLD0nIgogYWFhIGFhYSAgIGJiYiBiYmIgICBjY2MgY2NjICAgXCw9JyIgXCw9JyIKIGFhYSJhYWEnYmJiImJiYidjY2MiY2NjJ1xcLD1cJ1wiIlxcLD1cJ1wiCityZXQgMAogYWFhIGFhYSAgIGJiYiBiYmIgICBjY2MgY2NjICAgXCw9JyIgXCw9JyIKIGFhYSBhYWEgICBiYmIgYmJiICAgY2NjIGNjYyAgIFwsPSciIFwsPSciCiBhYWEnYWFhImJiYidiYmIiY2NjJ2NjYyJcXCw9XCdcIidcXCw9XCdcIgorcmV0IDAKIGFhYSBhYWEgICBiYmIgYmJiICAgY2NjIGNjYyAgIFwsPSciIFwsPSciCiAKIFRlc3RpbmcgYXZfZGljdF9zZXQoKQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGlyYWMgYi90ZXN0cy9yZWYvZmF0ZS9kaXJhYwppbmRleCA3NzgxYjRlLi5mM2YzZGFmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kaXJhYworKysgYi90ZXN0cy9yZWYvZmF0ZS9kaXJhYwpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGY3MzgxOWU4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDgyZTM3ODgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RpcmFjLWxvdy1kZWxheSBiL3Rlc3RzL3JlZi9mYXRlL2RpcmFjLWxvdy1kZWxheQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2JmOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZGlyYWMtbG93LWRlbGF5CkBAIC0wLDAgKzEsNyBAQAorI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MjU5OWExNzIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgwOGE4YzA4ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZGlzcGxheSBiL3Rlc3RzL3JlZi9mYXRlL2Rpc3BsYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxZTdlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Rpc3BsYXkKQEAgLTAsMCArMSwxNiBAQAorMCA2NTUzNiAwCistNjU1MzYgMCAwCiswIDAgMTA3Mzc0MTgyNAorZGVncmVlczogLTkwLjAwMDAwMAorNDYzNDAgLTQ2MzQwIDAKKzQ2MzQwIDQ2MzQwIDAKKzAgMCAxMDczNzQxODI0CitkZWdyZWVzOiA0NS4wMDAwMDAKKy00NjM0MCAtNDYzNDAgMAorLTQ2MzQwIDQ2MzQwIDAKKzAgMCAxMDczNzQxODI0CitkZWdyZWVzOiAxMzUuMDAwMDAwCistNDYzNDAgNDYzNDAgMAorLTQ2MzQwIC00NjM0MCAwCiswIDAgMTA3Mzc0MTgyNAorZGVncmVlczogLTEzNS4wMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RueGhkLW1iYWZmIGIvdGVzdHMvcmVmL2ZhdGUvZG54aGQtbWJhZmYKaW5kZXggMTcxYzI0NC4uOGU5NTIyNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZG54aGQtbWJhZmYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZG54aGQtbWJhZmYKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTQ0MHgxMDgwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA2MjIwODAwLCAweGU3ODE5OGMwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kbnhoci0xMmJpdCBiL3Rlc3RzL3JlZi9mYXRlL2RueGhyLTEyYml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTcxNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kbnhoci0xMmJpdApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4MzFiZmE4ZjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RueGhyLTQ0NCBiL3Rlc3RzL3JlZi9mYXRlL2RueGhyLTQ0NAppbmRleCBmOWU3M2MzLi4yNWY0MjE5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kbnhoci00NDQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZG54aHItNDQ0CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4ODM5Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA5NjY1MjgwLCAweDE5ZWY0MDU3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kbnhoci1wYXJzZSBiL3Rlc3RzL3JlZi9mYXRlL2RueGhyLXBhcnNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYzVhNDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kbnhoci1wYXJzZQpAQCAtMCwwICsxLDkgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzODQweDIxNjAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgMTY1ODg4MDAsIDB4NjdlYmZkYjEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAxNjU4ODgwMCwgMHg3ZmE2ODdlNgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsIDE2NTg4ODAwLCAweDRlMTNmNWViCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgMTY1ODg4MDAsIDB4MDU0YTY0MmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RueGhyLXByZWZpeDEgYi90ZXN0cy9yZWYvZmF0ZS9kbnhoci1wcmVmaXgxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYWQyNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kbnhoci1wcmVmaXgxCkBAIC0wLDAgKzEsMTAgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MTUzNgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDc4NjQzMiwgMHg1YTA3ZjFmZQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNzg2NDMyLCAweDViNWFjYWVkCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA3ODY0MzIsIDB4MWE5YWFjYjUKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDc4NjQzMiwgMHgxMmRkZjIyZAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNzg2NDMyLCAweGRlMjUxNWY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kbnhoci1wcmVmaXgyIGIvdGVzdHMvcmVmL2ZhdGUvZG54aHItcHJlZml4MgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjA2MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZG54aHItcHJlZml4MgpAQCAtMCwwICsxLDEwIEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2eDE3MTYKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA4Nzg1OTIsIDB4OWE5OWUxZGIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDg3ODU5MiwgMHg5MzE3YjYwOAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgODc4NTkyLCAweDJkNmM5YjJmCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA4Nzg1OTIsIDB4YTdmMGUzZmUKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDg3ODU5MiwgMHg5ODMzMDEyNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZG54aHItcHJlZml4MyBiL3Rlc3RzL3JlZi9mYXRlL2RueGhyLXByZWZpeDMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNzI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2RueGhyLXByZWZpeDMKQEAgLTAsMCArMSwxMCBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI1NngyMDQ4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMDQ4NTc2LCAweGEyZWIwYzIzCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDEwNDg1NzYsIDB4MjE0OWU0ZjkKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMTA0ODU3NiwgMHhiZGZhY2M5YgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAxMDQ4NTc2LCAweDY0MDQwYzUyCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDEwNDg1NzYsIDB4OWZlYzMxYjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RueGhyLXByZWZpeDQgYi90ZXN0cy9yZWYvZmF0ZS9kbnhoci1wcmVmaXg0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZWQ5YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kbnhoci1wcmVmaXg0CkBAIC0wLDAgKzEsMTAgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MjE2MAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTEwNTkyMCwgMHhjYzFjYzMyMgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxMTA1OTIwLCAweGQzMDM4YTFkCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDExMDU5MjAsIDB4YzA3MTdhNWEKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgMTEwNTkyMCwgMHhlZDZmYzMxZgorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAxMTA1OTIwLCAweGRjYjhkNmM0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9kbnhoci1wcmVmaXg1IGIvdGVzdHMvcmVmL2ZhdGUvZG54aHItcHJlZml4NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODhiZGQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZG54aHItcHJlZml4NQpAQCAtMCwwICsxLDEwIEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2eDMyMTIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDE2NDQ1NDQsIDB4Y2VhMmI3MmQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMTY0NDU0NCwgMHhjZDgwODE5ZAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAxNjQ0NTQ0LCAweDRhMjc3NDVlCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDE2NDQ1NDQsIDB4ZGY4MmI3MmMKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgMTY0NDU0NCwgMHhkZjg3Y2I2ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZHBjbS1pZHJvcSBiL3Rlc3RzL3JlZi9mYXRlL2RwY20taWRyb3EKaW5kZXggODVlOGVmYi4uZmI0NWFjZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZHBjbS1pZHJvcQorKysgYi90ZXN0cy9yZWYvZmF0ZS9kcGNtLWlkcm9xCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjIwNTAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICA3NDU2LCAgICAyOTgyNCwgMHg3N2UyNjViNwogMCwgICAgICAgNzQ1NiwgICAgICAgNzQ1NiwgICAgICA3MzYsICAgICAyOTQ0LCAweDhkY2RmNTBiCiAwLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgIDczNiwgICAgIDI5NDQsIDB4YjEzNWNkMmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2RwY20taW50ZXJwbGF5IGIvdGVzdHMvcmVmL2ZhdGUvZHBjbS1pbnRlcnBsYXkKaW5kZXggYmRhOGE4Zi4uNzIwYTk4ZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZHBjbS1pbnRlcnBsYXkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZHBjbS1pbnRlcnBsYXkKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS8yMjA1MAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDE0NjIsICAgICA1ODQ4LCAweGVhMDQyOTJiCiAwLCAgICAgICAxNDYyLCAgICAgICAxNDYyLCAgICAgMTQ3MiwgICAgIDU4ODgsIDB4MGU1OWU5NDIKIDAsICAgICAgIDI5MzQsICAgICAgIDI5MzQsICAgICAxNDcyLCAgICAgNTg4OCwgMHg1NmQ0ODBmNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZHB4IGIvdGVzdHMvcmVmL2ZhdGUvZHB4CmluZGV4IGZkYjg1Y2EuLmQ1ZjBlY2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RweAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kcHgKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzY4eDUxMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMjM1OTI5NiwgMHgzMGQ0ZDI0ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZHB4cGFyc2VyIGIvdGVzdHMvcmVmL2ZhdGUvZHB4cGFyc2VyCmluZGV4IDBlY2MzNmMuLmMyMWFkNzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2RweHBhcnNlcgorKysgYi90ZXN0cy9yZWYvZmF0ZS9kcHhwYXJzZXIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTMweDEzMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA1MDcwMCwgMHhlNzE1MzU0NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDUwNzAwLCAweDJiYzkyZWNlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNTA3MDAsIDB4ODNjNzMxYmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Rzcy1scCBiL3Rlc3RzL3JlZi9mYXRlL2Rzcy1scAppbmRleCBiNWJlZTE4Li5hYjFkNTM0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9kc3MtbHAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZHNzLWxwCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAyNDAsICAgICAgNDgwLCAweGYxMTA3NjU4CiAwLCAgICAgICAgMjQwLCAgICAgICAgMjQwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4NTBkZWUxNzkKIDAsICAgICAgICA0ODAsICAgICAgICA0ODAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHg0MDA5MDgwMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZHNzLXNwIGIvdGVzdHMvcmVmL2ZhdGUvZHNzLXNwCmluZGV4IDExMWM2MjEuLmY0MDdjZTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2Rzcy1zcAorKysgYi90ZXN0cy9yZWYvZmF0ZS9kc3Mtc3AKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS8xMTAyNQorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAxMTAyNQorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgMjY0LCAgICAgIDUyOCwgMHhhMjU3OWU5NgogMCwgICAgICAgIDI2NCwgICAgICAgIDI2NCwgICAgICAyNjQsICAgICAgNTI4LCAweGY5YjIzMTcyCiAwLCAgICAgICAgNTI4LCAgICAgICAgNTI4LCAgICAgIDI2NCwgICAgICA1MjgsIDB4NTU3MWEwZmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2R4YS1mZWVibGUgYi90ZXN0cy9yZWYvZmF0ZS9keGEtZmVlYmxlCmluZGV4IDc0YjQzZGMuLjVmYTQxNzUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2R4YS1mZWVibGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZHhhLWZlZWJsZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgOTIxNjAwLCAweDBkMDM4NDRmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA5MjE2MDAsIDB4MGQwMzg0NGYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDkyMTYwMCwgMHg2NDljZGNlYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZHhhLXNjdW1tdm0gYi90ZXN0cy9yZWYvZmF0ZS9keGEtc2N1bW12bQppbmRleCAzMDhhODk2Li5lODgxN2NiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9keGEtc2N1bW12bQorKysgYi90ZXN0cy9yZWYvZmF0ZS9keGEtc2N1bW12bQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA4MzMzLzEwMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDM4NDAwMCwgMHhlZjM3ZjM0YgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzg0MDAwLCAweGVmMzdmMzRiCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzODQwMDAsIDB4ZmNhM2NkOGIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2R4dG9yeSBiL3Rlc3RzL3JlZi9mYXRlL2R4dG9yeQppbmRleCA3ZDNlY2JkLi40ZWJjYWY2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9keHRvcnkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZHh0b3J5CkBAIC0xLDMgKzEsNiBAQAogI3RiIDA6IDEvMjUKLSN0YiAxOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjgweDcyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTM4MjQwMCwgMHg0NDM3MzY0NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZHh2LWR4dDEgYi90ZXN0cy9yZWYvZmF0ZS9keHYtZHh0MQppbmRleCAxMjhkYWJhLi5kOWY1ZWNlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9keHYtZHh0MQorKysgYi90ZXN0cy9yZWYvZmF0ZS9keHYtZHh0MQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4MDc5N2NkNTMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2R4di1keHQ1IGIvdGVzdHMvcmVmL2ZhdGUvZHh2LWR4dDUKaW5kZXggMTI4ZGFiYS4uZDlmNWVjZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZHh2LWR4dDUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZHh2LWR4dDUKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA4Mjk0NDAwLCAweDA3OTdjZDUzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9keHYzLWR4dDEgYi90ZXN0cy9yZWYvZmF0ZS9keHYzLWR4dDEKaW5kZXggZTBmMWY5NC4uOTZjZTY2OSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZHh2My1keHQxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2R4djMtZHh0MQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4OThiYmNjODUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2R4djMtZHh0NSBiL3Rlc3RzL3JlZi9mYXRlL2R4djMtZHh0NQppbmRleCAxMjhkYWJhLi5kOWY1ZWNlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9keHYzLWR4dDUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZHh2My1keHQ1CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgODI5NDQwMCwgMHgwNzk3Y2Q1MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZWEtY212IGIvdGVzdHMvcmVmL2ZhdGUvZWEtY212CmluZGV4IDhmOTA0OWUuLjc5M2NiODQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2VhLWNtdgorKysgYi90ZXN0cy9yZWYvZmF0ZS9lYS1jbXYKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEyMDAwMCwgMHgzNGFjOTFkMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTIwMDAwLCAweDE3MTUwNzI5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMjAwMDAsIDB4YzNmNTEwYmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2VhLW1hZCBiL3Rlc3RzL3JlZi9mYXRlL2VhLW1hZAppbmRleCAxZWE5MmZkLi5lYTkyZmUxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9lYS1tYWQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZWEtbWFkCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDMzLzEwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0OTYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MzU2ODAsIDB4ODg5YzMyY2YKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUzNTY4MCwgMHgwYjFlZjA0NAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTM1NjgwLCAweGE3ZDA4MThiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9lYS10Z3EgYi90ZXN0cy9yZWYvZmF0ZS9lYS10Z3EKaW5kZXggNWMwNjQ4ZC4uMmYzOGU3MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZWEtdGdxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2VhLXRncQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyMDh4MTEyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM0OTQ0LCAweGUzMzY3MWE0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzQ5NDQsIDB4ZTMzNjcxYTQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzNDk0NCwgMHhlMzM2NzFhNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZWEtdGd2LTEgYi90ZXN0cy9yZWYvZmF0ZS9lYS10Z3YtMQppbmRleCBmYzkyMTgxLi43NTMzYWYwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9lYS10Z3YtMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9lYS10Z3YtMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweGZiZjI1ODFlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4ZmJmMjU4MWUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIzMDQwMCwgMHhmYmYyNTgxZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZWEtdGd2LTIgYi90ZXN0cy9yZWYvZmF0ZS9lYS10Z3YtMgppbmRleCA1ZTlkZTAyLi5jZmExMDBmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9lYS10Z3YtMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9lYS10Z3YtMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjAwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTkyMDAwLCAweGRmYzJmMjI1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTIwMDAsIDB4MDU5YjU3YmQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE5MjAwMCwgMHg3NjZjYjA4NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZWEtdHFpIGIvdGVzdHMvcmVmL2ZhdGUvZWEtdHFpCmluZGV4IDcyYWZiODEuLjkyNmFiNmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2VhLXRxaQorKysgYi90ZXN0cy9yZWYvZmF0ZS9lYS10cWkKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDAweDE5MgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNzVlYzU3MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM3NWVjNTczCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc1ZWM1NzMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V2YWwgYi90ZXN0cy9yZWYvZmF0ZS9ldmFsCmluZGV4IDkxNGIxM2MuLjViNGQ5M2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2V2YWwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXZhbApAQCAtMSw2ICsxLDcgQEAKIEV2YWx1YXRpbmcgJycKICcnIC0+IG5hbgogCithdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZAogRXZhbHVhdGluZyAnMTsyJwogJzE7MicgLT4gMi4wMDAwMDAKIApAQCAtMjgsNDUgKzI5LDU4IEBACiBFdmFsdWF0aW5nICcxZ2knCiAnMWdpJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJzFHaUZvbycKICcxR2lGb28nIC0+IG5hbgogCithdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZAogRXZhbHVhdGluZyAnMWsrMWsnCiAnMWsrMWsnIC0+IDIwMDAuMDAwMDAwCiAKIEV2YWx1YXRpbmcgJzFHaSozZm9vJwogJzFHaSozZm9vJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJ2ZvbycKICdmb28nIC0+IG5hbgogCithdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZAogRXZhbHVhdGluZyAnZm9vKCcKICdmb28oJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJ2ZvbygpJwogJ2ZvbygpJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJ2ZvbyknCiAnZm9vKScgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICdzaW4nCiAnc2luJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJ3NpbignCiAnc2luKCcgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICdzaW4oKScKICdzaW4oKScgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICdzaW4pJwogJ3NpbiknIC0+IG5hbgogCithdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZAogRXZhbHVhdGluZyAnc2luIDEwJwogJ3NpbiAxMCcgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICdzaW4oMSwyLDMpJwogJ3NpbigxLDIsMyknIC0+IG5hbgogCithdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZAogRXZhbHVhdGluZyAnc2luKDEgKScKICdzaW4oMSApJyAtPiAwLjg0MTQ3MQogCkBAIC03NiwxNSArOTAsMTkgQEAKIEV2YWx1YXRpbmcgJzFmb28nCiAnMWZvbycgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICdiYXIgKyBQSSArIEUgKyAxMDBmKjIgKyBmb28nCiAnYmFyICsgUEkgKyBFICsgMTAwZioyICsgZm9vJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJzEzayArIDEyZiAtIGZvbygxLCAyKScKICcxM2sgKyAxMmYgLSBmb28oMSwgMiknIC0+IG5hbgogCithdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZAogRXZhbHVhdGluZyAnMWdpJwogJzFnaScgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICcxR2knCiAnMUdpJyAtPiAxMDczNzQxODI0LjAwMDAwMAogCkBAIC0xMjcsNiArMTQ1LDcgQEAKIEV2YWx1YXRpbmcgJ3doaWxlKDAsIDEwKScKICd3aGlsZSgwLCAxMCknIC0+IG5hbgogCithdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZAogRXZhbHVhdGluZyAnc3QoMCwgMSk7IHdoaWxlKGx0ZShsZCgwKSwxMDApLCBzdCgxLCBsZCgxKStsZCgwKSk7IHN0KDAsIGxkKDApKzEpKScKICdzdCgwLCAxKTsgd2hpbGUobHRlKGxkKDApLDEwMCksIHN0KDEsIGxkKDEpK2xkKDApKTsgc3QoMCwgbGQoMCkrMSkpJyAtPiAxMDEuMDAwMDAwCiAKQEAgLTE1MSw2ICsxNzAsNyBAQAogRXZhbHVhdGluZyAnZmxvb3IoTkFOKScKICdmbG9vcihOQU4pJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJ2Zsb29yKDEyMy4xMjMpJwogJ2Zsb29yKDEyMy4xMjMpJyAtPiAxMjMuMDAwMDAwCiAKQEAgLTIwMiw2ICsyMjIsNyBAQAogRXZhbHVhdGluZyAncG93KC0xLDEuMjMpJwogJ3BvdygtMSwxLjIzKScgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICdpZigxLCAyKScKICdpZigxLCAyKScgLT4gMi4wMDAwMDAKIApAQCAtMjU5LDYgKzI4MCw3IEBACiBFdmFsdWF0aW5nICdiaXRhbmQoTkFOLCAxKScKICdiaXRhbmQoTkFOLCAxKScgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICdiZXR3ZWVuKDEwLCAtMywgMTApJwogJ2JldHdlZW4oMTAsIC0zLCAxMCknIC0+IDEuMDAwMDAwCiAKQEAgLTI2OCwxNCArMjkwLDE4IEBACiBFdmFsdWF0aW5nICdiZXR3ZWVuKDEsMiknCiAnYmV0d2VlbigxLDIpJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJ2NsaXAoMCwgMiwgMSknCiAnY2xpcCgwLCAyLCAxKScgLT4gbmFuCiAKK2F2X2V4cHJfcGFyc2VfYW5kX2V2YWwgZmFpbGVkCiBFdmFsdWF0aW5nICdjbGlwKDAvMCwgMSwgMiknCiAnY2xpcCgwLzAsIDEsIDIpJyAtPiBuYW4KIAorYXZfZXhwcl9wYXJzZV9hbmRfZXZhbCBmYWlsZWQKIEV2YWx1YXRpbmcgJ2NsaXAoMCwgMC8wLCAxKScKICdjbGlwKDAsIDAvMCwgMSknIC0+IG5hbgogCithdl9leHByX3BhcnNlX2FuZF9ldmFsIGZhaWxlZAogMTIuNzAwMDAwID09IDEyLjcKIDAuOTMxMzIzID09IDAuOTMxMzIyNTc1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leGlmLWltYWdlLWVtYmVkZGVkIGIvdGVzdHMvcmVmL2ZhdGUvZXhpZi1pbWFnZS1lbWJlZGRlZAppbmRleCAyMmE3NGUxLi4zOTJjMTQ1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9leGlmLWltYWdlLWVtYmVkZGVkCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4aWYtaW1hZ2UtZW1iZWRkZWQKQEAgLTIyLDggKzIyLDE5IEBACiBpbnRlcmxhY2VkX2ZyYW1lPTAKIHRvcF9maWVsZF9maXJzdD0wCiByZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT1wYworY29sb3Jfc3BhY2U9YnQ0NzBiZworY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj1jZW50ZXIKIFRBRzpVc2VyQ29tbWVudD1BcHBsZU1hcmsKIAorW1NJREVfREFUQV0KK3NpZGVfZGF0YV90eXBlPVFQIHRhYmxlIGRhdGEKK1svU0lERV9EQVRBXQorW1NJREVfREFUQV0KK3NpZGVfZGF0YV90eXBlPVFQIHRhYmxlIHByb3BlcnRpZXMKK1svU0lERV9EQVRBXQogWy9GUkFNRV0KIFtGUkFNRV0KIG1lZGlhX3R5cGU9YXVkaW8KQEAgLTM5LDcgKzUwLDcgQEAKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDAxMDY2CiBwa3RfcG9zPTE2MjkyCiBwa3Rfc2l6ZT00MTcKLXNhbXBsZV9mbXQ9czE2cAorc2FtcGxlX2ZtdD1mbHRwCiBuYl9zYW1wbGVzPTQ3CiBjaGFubmVscz0yCiBjaGFubmVsX2xheW91dD1zdGVyZW8KQEAgLTU4LDcgKzY5LDcgQEAKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDI2MTIyCiBwa3RfcG9zPTE2NzA5CiBwa3Rfc2l6ZT00MTgKLXNhbXBsZV9mbXQ9czE2cAorc2FtcGxlX2ZtdD1mbHRwCiBuYl9zYW1wbGVzPTExNTIKIGNoYW5uZWxzPTIKIGNoYW5uZWxfbGF5b3V0PXN0ZXJlbwpAQCAtNzcsNyArODgsNyBAQAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wMjYxMjIKIHBrdF9wb3M9MTcxMjcKIHBrdF9zaXplPTQxOAotc2FtcGxlX2ZtdD1zMTZwCitzYW1wbGVfZm10PWZsdHAKIG5iX3NhbXBsZXM9MTE1MgogY2hhbm5lbHM9MgogY2hhbm5lbF9sYXlvdXQ9c3RlcmVvCkBAIC05Niw3ICsxMDcsNyBAQAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wMjYxMjIKIHBrdF9wb3M9MTc1NDUKIHBrdF9zaXplPTQxOAotc2FtcGxlX2ZtdD1zMTZwCitzYW1wbGVfZm10PWZsdHAKIG5iX3NhbXBsZXM9MTE1MgogY2hhbm5lbHM9MgogY2hhbm5lbF9sYXlvdXQ9c3RlcmVvCkBAIC0xMTUsNyArMTI2LDcgQEAKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDI2MTIyCiBwa3RfcG9zPTE3OTYzCiBwa3Rfc2l6ZT00MTgKLXNhbXBsZV9mbXQ9czE2cAorc2FtcGxlX2ZtdD1mbHRwCiBuYl9zYW1wbGVzPTExNTIKIGNoYW5uZWxzPTIKIGNoYW5uZWxfbGF5b3V0PXN0ZXJlbwpAQCAtMTM0LDcgKzE0NSw3IEBACiBwa3RfZHVyYXRpb25fdGltZT0wLjAyNjEyMgogcGt0X3Bvcz0xODM4MQogcGt0X3NpemU9NDE4Ci1zYW1wbGVfZm10PXMxNnAKK3NhbXBsZV9mbXQ9Zmx0cAogbmJfc2FtcGxlcz0xMTUyCiBjaGFubmVscz0yCiBjaGFubmVsX2xheW91dD1zdGVyZW8KQEAgLTE1Myw3ICsxNjQsNyBAQAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wMjYxMjIKIHBrdF9wb3M9MTg3OTkKIHBrdF9zaXplPTQxOAotc2FtcGxlX2ZtdD1zMTZwCitzYW1wbGVfZm10PWZsdHAKIG5iX3NhbXBsZXM9MTE1MgogY2hhbm5lbHM9MgogY2hhbm5lbF9sYXlvdXQ9c3RlcmVvCkBAIC0xNzIsNyArMTgzLDcgQEAKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDI2MTIyCiBwa3RfcG9zPTE5MjE3CiBwa3Rfc2l6ZT00MTgKLXNhbXBsZV9mbXQ9czE2cAorc2FtcGxlX2ZtdD1mbHRwCiBuYl9zYW1wbGVzPTExNTIKIGNoYW5uZWxzPTIKIGNoYW5uZWxfbGF5b3V0PXN0ZXJlbwpAQCAtMTkxLDcgKzIwMiw3IEBACiBwa3RfZHVyYXRpb25fdGltZT0wLjAyNjEyMgogcGt0X3Bvcz0xOTYzNQogcGt0X3NpemU9NDE4Ci1zYW1wbGVfZm10PXMxNnAKK3NhbXBsZV9mbXQ9Zmx0cAogbmJfc2FtcGxlcz0xMTUyCiBjaGFubmVscz0yCiBjaGFubmVsX2xheW91dD1zdGVyZW8KQEAgLTIxMCw3ICsyMjEsNyBAQAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wMjYxMjIKIHBrdF9wb3M9MjAwNTMKIHBrdF9zaXplPTQxOAotc2FtcGxlX2ZtdD1zMTZwCitzYW1wbGVfZm10PWZsdHAKIG5iX3NhbXBsZXM9MTE1MgogY2hhbm5lbHM9MgogY2hhbm5lbF9sYXlvdXQ9c3RlcmVvCkBAIC0yMjksNyArMjQwLDcgQEAKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDI2MTIyCiBwa3RfcG9zPTIwNDcxCiBwa3Rfc2l6ZT00MTgKLXNhbXBsZV9mbXQ9czE2cAorc2FtcGxlX2ZtdD1mbHRwCiBuYl9zYW1wbGVzPTExNTIKIGNoYW5uZWxzPTIKIGNoYW5uZWxfbGF5b3V0PXN0ZXJlbwpAQCAtMjQ4LDcgKzI1OSw3IEBACiBwa3RfZHVyYXRpb25fdGltZT0wLjAyNjEyMgogcGt0X3Bvcz0yMDg4OQogcGt0X3NpemU9NDE4Ci1zYW1wbGVfZm10PXMxNnAKK3NhbXBsZV9mbXQ9Zmx0cAogbmJfc2FtcGxlcz0xMTUyCiBjaGFubmVscz0yCiBjaGFubmVsX2xheW91dD1zdGVyZW8KQEAgLTI2Nyw3ICsyNzgsNyBAQAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wMjYxMjIKIHBrdF9wb3M9MjEzMDcKIHBrdF9zaXplPTQxOAotc2FtcGxlX2ZtdD1zMTZwCitzYW1wbGVfZm10PWZsdHAKIG5iX3NhbXBsZXM9MTE1MgogY2hhbm5lbHM9MgogY2hhbm5lbF9sYXlvdXQ9c3RlcmVvCkBAIC0yODYsNyArMjk3LDcgQEAKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDI2MTIyCiBwa3RfcG9zPTIxNzI1CiBwa3Rfc2l6ZT00MTgKLXNhbXBsZV9mbXQ9czE2cAorc2FtcGxlX2ZtdD1mbHRwCiBuYl9zYW1wbGVzPTExNTIKIGNoYW5uZWxzPTIKIGNoYW5uZWxfbGF5b3V0PXN0ZXJlbwpAQCAtMzA1LDcgKzMxNiw3IEBACiBwa3RfZHVyYXRpb25fdGltZT0wLjAyNjEyMgogcGt0X3Bvcz0yMjE0MwogcGt0X3NpemU9NDE4Ci1zYW1wbGVfZm10PXMxNnAKK3NhbXBsZV9mbXQ9Zmx0cAogbmJfc2FtcGxlcz0xMTUyCiBjaGFubmVscz0yCiBjaGFubmVsX2xheW91dD1zdGVyZW8KQEAgLTMyNCw3ICszMzUsNyBAQAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wMjYxMjIKIHBrdF9wb3M9MjI1NjEKIHBrdF9zaXplPTQxOAotc2FtcGxlX2ZtdD1zMTZwCitzYW1wbGVfZm10PWZsdHAKIG5iX3NhbXBsZXM9MTE1MgogY2hhbm5lbHM9MgogY2hhbm5lbF9sYXlvdXQ9c3RlcmVvCkBAIC0zNDMsNyArMzU0LDcgQEAKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDI2MTIyCiBwa3RfcG9zPTIyOTc5CiBwa3Rfc2l6ZT00MTgKLXNhbXBsZV9mbXQ9czE2cAorc2FtcGxlX2ZtdD1mbHRwCiBuYl9zYW1wbGVzPTExNTIKIGNoYW5uZWxzPTIKIGNoYW5uZWxfbGF5b3V0PXN0ZXJlbwpAQCAtMzYyLDcgKzM3Myw3IEBACiBwa3RfZHVyYXRpb25fdGltZT0wLjAyNjEyMgogcGt0X3Bvcz0yMzM5NwogcGt0X3NpemU9NDE4Ci1zYW1wbGVfZm10PXMxNnAKK3NhbXBsZV9mbXQ9Zmx0cAogbmJfc2FtcGxlcz0xMTUyCiBjaGFubmVscz0yCiBjaGFubmVsX2xheW91dD1zdGVyZW8KQEAgLTM4MSw3ICszOTIsNyBAQAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wMjYxMjIKIHBrdF9wb3M9MjM4MTUKIHBrdF9zaXplPTQxOAotc2FtcGxlX2ZtdD1zMTZwCitzYW1wbGVfZm10PWZsdHAKIG5iX3NhbXBsZXM9MTE1MgogY2hhbm5lbHM9MgogY2hhbm5lbF9sYXlvdXQ9c3RlcmVvCkBAIC00MDAsNyArNDExLDcgQEAKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDI2MTIyCiBwa3RfcG9zPTI0MjMzCiBwa3Rfc2l6ZT00MTgKLXNhbXBsZV9mbXQ9czE2cAorc2FtcGxlX2ZtdD1mbHRwCiBuYl9zYW1wbGVzPTExNTIKIGNoYW5uZWxzPTIKIGNoYW5uZWxfbGF5b3V0PXN0ZXJlbwpAQCAtNDE5LDcgKzQzMCw3IEBACiBwa3RfZHVyYXRpb25fdGltZT0wLjAyNjEyMgogcGt0X3Bvcz0yNDY1MQogcGt0X3NpemU9NDE4Ci1zYW1wbGVfZm10PXMxNnAKK3NhbXBsZV9mbXQ9Zmx0cAogbmJfc2FtcGxlcz0xMTUyCiBjaGFubmVscz0yCiBjaGFubmVsX2xheW91dD1zdGVyZW8KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4aWYtaW1hZ2UtanBnIGIvdGVzdHMvcmVmL2ZhdGUvZXhpZi1pbWFnZS1qcGcKaW5kZXggYWRiZDc1Mi4uZWIxOGRlZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZXhpZi1pbWFnZS1qcGcKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhpZi1pbWFnZS1qcGcKQEAgLTIyLDYgKzIyLDExIEBACiBpbnRlcmxhY2VkX2ZyYW1lPTAKIHRvcF9maWVsZF9maXJzdD0wCiByZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT1wYworY29sb3Jfc3BhY2U9YnQ0NzBiZworY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj1jZW50ZXIKIFRBRzpJbWFnZURlc2NyaXB0aW9uPQogVEFHOk1ha2U9Q2Fub24KIFRBRzpNb2RlbD1DYW5vbiBQb3dlclNob3QgU1gyMDAgSVMKQEAgLTIyNCw0ICsyMjksMTAgQEAKIFRBRzpXaGl0ZUJhbGFuY2U9ICAgIDAKIFRBRzpEaWdpdGFsWm9vbVJhdGlvPSAgIDQwMDA6NDAwMAogVEFHOlNjZW5lQ2FwdHVyZVR5cGU9ICAgIDAKK1tTSURFX0RBVEFdCitzaWRlX2RhdGFfdHlwZT1RUCB0YWJsZSBkYXRhCitbL1NJREVfREFUQV0KK1tTSURFX0RBVEFdCitzaWRlX2RhdGFfdHlwZT1RUCB0YWJsZSBwcm9wZXJ0aWVzCitbL1NJREVfREFUQV0KIFsvRlJBTUVdCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leGlmLWltYWdlLXRpZmYgYi90ZXN0cy9yZWYvZmF0ZS9leGlmLWltYWdlLXRpZmYKaW5kZXggODUwNjc5OC4uNTE1ODA2MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZXhpZi1pbWFnZS10aWZmCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4aWYtaW1hZ2UtdGlmZgpAQCAtMjIsNiArMjIsMTEgQEAKIGludGVybGFjZWRfZnJhbWU9MAogdG9wX2ZpZWxkX2ZpcnN0PTAKIHJlcGVhdF9waWN0PTAKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjb2xvcl90cmFuc2Zlcj11bmtub3duCitjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKIFRBRzpkb2N1bWVudF9uYW1lPWltYWdlX3NtYWxsLnRpZmYKIFRBRzpwYWdlX251bWJlcj0gICAgMCAvICAgICAxCiBUQUc6c29mdHdhcmU9SW1hZ2VNYWdpY2sgNi41LjgtMCAyMDEwLTAyLTA5IFExNiBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9yZwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhpZi1pbWFnZS13ZWJwIGIvdGVzdHMvcmVmL2ZhdGUvZXhpZi1pbWFnZS13ZWJwCmluZGV4IGI4ODkxY2QuLmQ1MjBlY2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2V4aWYtaW1hZ2Utd2VicAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leGlmLWltYWdlLXdlYnAKQEAgLTIyLDYgKzIyLDExIEBACiBpbnRlcmxhY2VkX2ZyYW1lPTAKIHRvcF9maWVsZF9maXJzdD0wCiByZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT10dgorY29sb3Jfc3BhY2U9YnQ0NzBiZworY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAogVEFHOkltYWdlRGVzY3JpcHRpb249CiBUQUc6TWFrZT1DYW5vbgogVEFHOk1vZGVsPUNhbm9uIFBvd2VyU2hvdCBTWDIwMCBJUwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1iNDRhLWhhbGYtbmVnYXRpdmUtNHg0IGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1iNDRhLWhhbGYtbmVnYXRpdmUtNHg0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZjRlOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLWI0NGEtaGFsZi1uZWdhdGl2ZS00eDQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNHg0Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgIDk2LCAweDcwNjAwMjYwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWI0NC1oYWxmLWZsb2F0LTEyeDgtbDEgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWI0NC1oYWxmLWZsb2F0LTEyeDgtbDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5YjUwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtYjQ0LWhhbGYtZmxvYXQtMTJ4OC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweGExYTcwZmFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWI0NC1oYWxmLWZsb2F0LTEyeDgtbDIgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWI0NC1oYWxmLWZsb2F0LTEyeDgtbDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0ZmI1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtYjQ0LWhhbGYtZmxvYXQtMTJ4OC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWI0NC11aW50MzIgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWI0NC11aW50MzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlNDFiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtYjQ0LXVpbnQzMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDZiOTUwY2UzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWZsb2F0LWI0NCBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtZmxvYXQtYjQ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYjBlMWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWZsb2F0LWI0NApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDM5YzhlMDNlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWZsb2F0LXBpei00OHgzMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtZmxvYXQtcGl6LTQ4eDMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTVkOTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWZsb2F0LXBpei00OHgzMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0OHgzMgorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgOTIxNiwgMHg1YjNmN2E4ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1oYWxmLWI0NC0xMng4IGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1oYWxmLWI0NC0xMng4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjQyMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWhhbGYtYjQ0LTEyeDgKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTJ4OAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDU3NiwgMHg1MDY0NjlmOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1oYWxmLWI0NC0xM3g5IGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1oYWxmLWI0NC0xM3g5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWQyZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWhhbGYtYjQ0LTEzeDkKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTN4OQorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDcwMiwgMHg2OTE0ODM4YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1oYWxmLXBpei1idyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtaGFsZi1waXotYncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwOGQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtaGFsZi1waXotYncKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzR4MjcKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDU1MDgsIDB4MzZkMTVlMmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtaGFsZi1waXotY29sb3IgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWNvbG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNTEwNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWNvbG9yCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM0eDQwCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA4MTYwLCAweDlkZDY3YjdkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWR3LXQwMSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtaGFsZi1waXotZHctdDAxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMzVhZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWR3LXQwMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MDB4MzAwCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNzIwMDAwLCAweGU1MGZjOWY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWR3LXQwOCBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtaGFsZi1waXotZHctdDA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NDNjOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLWhhbGYtcGl6LWR3LXQwOApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MDF4NDAxCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMjA1NDA2LCAweGM0NWNjOWY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLW5vbmUtbmVnYXRpdmUtcmVkIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1ub25lLW5lZ2F0aXZlLXJlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzM5OWIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1ub25lLW5lZ2F0aXZlLXJlZApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0eDQKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICAgOTYsIDB4MjdiYzEzMWIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtMTJ4OCBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtMTJ4OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk0NmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1weHIyNC1mbG9hdC0xMng4CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyeDgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA1NzYsIDB4NzEyMGUwNzIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtaGFsZi1sMSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtaGFsZi1sMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjk3YTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1weHIyNC1mbG9hdC1oYWxmLWwxCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyeDgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA1NzYsIDB4YmQzNTBhZjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtaGFsZi1sMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtZmxvYXQtaGFsZi1sMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTdmMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1weHIyNC1mbG9hdC1oYWxmLWwyCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyeDgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA3NjgsIDB4YWRiMjcwNDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtaGFsZi1mbG9hdC1sMSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtaGFsZi1mbG9hdC1sMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1weHIyNC1oYWxmLWZsb2F0LWwxCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyeDgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA1NzYsIDB4NWVkZTAwNGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtaGFsZi1mbG9hdC1sMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtaGFsZi1mbG9hdC1sMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDhlMzBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1weHIyNC1oYWxmLWZsb2F0LWwyCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyeDgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA3NjgsIDB4NzgzMTdiNTYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtaGFsZi11aW50MzItMTN4OSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtaGFsZi11aW50MzItMTN4OQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGI4NWM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1weHIyNC1oYWxmLXVpbnQzMi0xM3g5CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEzeDkKKyNzYXIgMDogOS8xMAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzAyLCAweGYwMjEyZjFkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXB4cjI0LXVpbnQzMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtcHhyMjQtdWludDMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTQxYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXB4cjI0LXVpbnQzMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDZiOTUwY2UzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXJhdy1oYWxmLWZsb2F0LWwxIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1yYXctaGFsZi1mbG9hdC1sMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1yYXctaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXJhdy1oYWxmLWZsb2F0LWwyIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1yYXctaGFsZi1mbG9hdC1sMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRmYjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1yYXctaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXJsZS1oYWxmLWZsb2F0LWwxIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1ybGUtaGFsZi1mbG9hdC1sMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1ybGUtaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXJsZS1oYWxmLWZsb2F0LWwyIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1ybGUtaGFsZi1mbG9hdC1sMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRmYjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS1ybGUtaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXppcC1oYWxmLWZsb2F0LWwxIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS16aXAtaGFsZi1mbG9hdC1sMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS16aXAtaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXppcC1oYWxmLWZsb2F0LWwyIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS16aXAtaGFsZi1mbG9hdC1sMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRmYjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi1zY2FubGluZS16aXAtaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtemlwMS1oYWxmLWZsb2F0LWwxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDQyMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMS16ZXJvLW9mZnNldHMgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMS16ZXJvLW9mZnNldHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwNDIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtemlwMS1oYWxmLWZsb2F0LWwxLXplcm8tb2Zmc2V0cwpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2Itc2NhbmxpbmUtemlwMS1oYWxmLWZsb2F0LWwyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGZiNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXNjYW5saW5lLXppcDEtaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtZmxvYXQtcmF3LTEyeDggYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtZmxvYXQtcmF3LTEyeDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlNDFiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1mbG9hdC1yYXctMTJ4OApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDZiOTUwY2UzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtZmxvYXQtcmF3LTE1MHgxMzAgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtZmxvYXQtcmF3LTE1MHgxMzAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNWMyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1mbG9hdC1yYXctMTUweDEzMApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNTB4MTMwCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE3MDAwLCAweGFiYzVlYWIyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtaGFsZi1mbG9hdC1iNDQtMTJ4OC1sMSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1oYWxmLWZsb2F0LWI0NC0xMng4LWwxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOWI1MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtaGFsZi1mbG9hdC1iNDQtMTJ4OC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweGExYTcwZmFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtaGFsZi1mbG9hdC1iNDQtMTJ4OC1sMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1oYWxmLWZsb2F0LWI0NC0xMng4LWwyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NGZiNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtaGFsZi1mbG9hdC1iNDQtMTJ4OC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtaGFsZi1yYXctMTJ4OCBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1oYWxmLXJhdy0xMng4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OWUyNDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtaGFsZi1yYXctMTJ4OApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDY2NzkwM2Y1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcHhyMjQtZmxvYXQtaGFsZi1sMSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1weHIyNC1mbG9hdC1oYWxmLWwxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTdhMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcHhyMjQtZmxvYXQtaGFsZi1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweGJkMzUwYWY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcHhyMjQtZmxvYXQtaGFsZi1sMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1weHIyNC1mbG9hdC1oYWxmLWwyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1N2YwMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcHhyMjQtZmxvYXQtaGFsZi1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweGFkYjI3MDQzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcHhyMjQtaGFsZi1mbG9hdC1sMSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1weHIyNC1oYWxmLWZsb2F0LWwxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMDQyMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcHhyMjQtaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcHhyMjQtaGFsZi1mbG9hdC1sMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1weHIyNC1oYWxmLWZsb2F0LWwyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OGUzMGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcHhyMjQtaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDc4MzE3YjU2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcmF3LWhhbGYtZmxvYXQtbDEgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcmF3LWhhbGYtZmxvYXQtbDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwNDIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1yYXctaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcmF3LWhhbGYtZmxvYXQtbDIgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcmF3LWhhbGYtZmxvYXQtbDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0ZmI1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1yYXctaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcmxlLWhhbGYtZmxvYXQtbDEgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcmxlLWhhbGYtZmxvYXQtbDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwNDIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1ybGUtaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcmxlLWhhbGYtZmxvYXQtbDIgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtcmxlLWhhbGYtZmxvYXQtbDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0ZmI1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS1ybGUtaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtemlwLWhhbGYtZmxvYXQtbDEgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtemlwLWhhbGYtZmxvYXQtbDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwNDIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS16aXAtaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtemlwLWhhbGYtZmxvYXQtbDIgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtemlwLWhhbGYtZmxvYXQtbDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0ZmI1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2ItdGlsZS16aXAtaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtemlwMS1oYWxmLWZsb2F0LWwxIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi10aWxlLXppcDEtaGFsZi1mbG9hdC1sMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi10aWxlLXppcDEtaGFsZi1mbG9hdC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc2LCAweDVlZGUwMDRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiLXRpbGUtemlwMS1oYWxmLWZsb2F0LWwyIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi10aWxlLXppcDEtaGFsZi1mbG9hdC1sMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDRmYjU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYi10aWxlLXppcDEtaGFsZi1mbG9hdC1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweDIyZjc3YjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1tdWx0aXNjYW5saW5lLWhhbGYtYjQ0IGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtbXVsdGlzY2FubGluZS1oYWxmLWI0NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjlhODhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtbXVsdGlzY2FubGluZS1oYWxmLWI0NApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA5MzV4MjUxCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxODc3NDgwLCAweDZmMjhiODYwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NC0xMng4LWwxIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDQtMTJ4OC1sMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDI1ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDQtMTJ4OC1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDkvMTAKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDc2OCwgMHgxZGU1YzdmMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDQtMTJ4OC1sMiBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0LTEyeDgtbDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmYmE4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0LTEyeDgtbDIKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTJ4OAorI3NhciAwOiA5LzEwCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA3NjgsIDB4ZTA4Y2E2ZDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0LTEzeDktbDEgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NC0xM3g5LWwxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODJlMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NC0xM3g5LWwxCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEzeDkKKyNzYXIgMDogOS8xMAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgOTM2LCAweGRjYjQyMTg2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NC0xM3g5LWwyIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDQtMTN4OS1sMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM3ZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDQtMTN4OS1sMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxM3g5Cisjc2FyIDA6IDkvMTAKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDkzNiwgMHg3ZjcxMGJmNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDRhLTEyeDgtbDEgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NGEtMTJ4OC1sMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzMxM2UzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDRhLTEyeDgtbDEKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTJ4OAorI3NhciAwOiA5LzEwCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA3NjgsIDB4ZTIwMGMxNjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0YS0xMng4LWwyIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDRhLTEyeDgtbDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmYmE4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0YS0xMng4LWwyCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyeDgKKyNzYXIgMDogOS8xMAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCAweGUwOGNhNmQzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NGEtMTN4OS1sMSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2JhLXNjYW5saW5lLWZsb2F0LWhhbGYtYjQ0YS0xM3g5LWwxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2MzMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NGEtMTN4OS1sMQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxM3g5Cisjc2FyIDA6IDkvMTAKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDkzNiwgMHg5MTE3MThhYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDRhLTEzeDktbDIgYi90ZXN0cy9yZWYvZmF0ZS9leHItcmdiYS1zY2FubGluZS1mbG9hdC1oYWxmLWI0NGEtMTN4OS1sMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjM3ZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtc2NhbmxpbmUtZmxvYXQtaGFsZi1iNDRhLTEzeDktbDIKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTN4OQorI3NhciAwOiA5LzEwCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA5MzYsIDB4N2Y3MTBiZjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2JhLXppcDE2LTE2eDMyLWZsYWc0IGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXJnYmEtemlwMTYtMTZ4MzItZmxhZzQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0YWE3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1yZ2JhLXppcDE2LTE2eDMyLWZsYWc0CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2eDMyCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA0MDk2LCAweGY5MGFiMWU5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItc2xpY2UtcHhyMjQgYi90ZXN0cy9yZWYvZmF0ZS9leHItc2xpY2UtcHhyMjQKaW5kZXggYzQ2ZTg5Ny4uOTlmYmMwNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXB4cjI0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1zbGljZS1weHIyNApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MDB4ODAwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzODQwMDAwLCAweGRjZmIzNDFkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9leHItc2xpY2UtcmF3IGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXJhdwppbmRleCBhOGI0YjI3Li5jYmUxMjRiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9leHItc2xpY2UtcmF3CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1zbGljZS1yYXcKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTg3eDY3NQorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzE2OTgwMCwgMHg2YTM1NmQwZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXJsZSBiL3Rlc3RzL3JlZi9mYXRlL2V4ci1zbGljZS1ybGUKaW5kZXggYThiNGIyNy4uY2JlMTI0YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXJsZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItc2xpY2UtcmxlCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDU4N3g2NzUKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMxNjk4MDAsIDB4NmEzNTZkMGQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1zbGljZS16aXAxIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXppcDEKaW5kZXggYThiNGIyNy4uY2JlMTI0YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXppcDEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXppcDEKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTg3eDY3NQorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzE2OTgwMCwgMHg2YTM1NmQwZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXppcDE2IGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXNsaWNlLXppcDE2CmluZGV4IGE4YjRiMjcuLmNiZTEyNGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2V4ci1zbGljZS16aXAxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHItc2xpY2UtemlwMTYKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTg3eDY3NQorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzE2OTgwMCwgMHg2YTM1NmQwZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXktc2NhbmxpbmUtemlwLWhhbGYtMTJ4OCBiL3Rlc3RzL3JlZi9mYXRlL2V4ci15LXNjYW5saW5lLXppcC1oYWxmLTEyeDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2MjE2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2V4ci15LXNjYW5saW5lLXppcC1oYWxmLTEyeDgKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTJ4OAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDE5MiwgMHhkZDU3NTliNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZXhyLXktdGlsZS16aXAtaGFsZi0xMng4IGIvdGVzdHMvcmVmL2ZhdGUvZXhyLXktdGlsZS16aXAtaGFsZi0xMng4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNjIxNjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9leHIteS10aWxlLXppcC1oYWxmLTEyeDgKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTJ4OAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDE5MiwgMHhkZDU3NTliNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmZtcGVnLWF0dGFjaGVkX3BpY3MgYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctYXR0YWNoZWRfcGljcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTJmMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmZtcGVnLWF0dGFjaGVkX3BpY3MKQEAgLTAsMCArMSwxNDAgQEAKKyN0YiAwOiAxLzkwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyMDB4MjAwCisjc2FyIDA6IDI4MzQvMjgzNAorI3RiIDE6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogNDQxMDAKKyNjaGFubmVsX2xheW91dCAxOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAwLCAgIDEyMDAwMCwgMHg3NDhjYzc3MQorMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDAwMDAwMDAwCisxLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4MjljZDYzOWQKKzEsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICA0MDk2LCAgICAxNjM4NCwgMHhkNTIwNjZlNQorMSwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDBjOTMzNDA4CisxLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4YjNiOTc2NzUKKzEsICAgICAgMjA0ODAsICAgICAgMjA0ODAsICAgICA0MDk2LCAgICAxNjM4NCwgMHgxY2I0YTI2YgorMSwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDZiZjY5M2I5CisxLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgNDA5NiwgICAgMTYzODQsIDB4MTI4OTZjOTUKKzEsICAgICAgMzI3NjgsICAgICAgMzI3NjgsICAgICA0MDk2LCAgICAxNjM4NCwgMHg0OGI3MTY3YQorMSwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDVhOWMwNmFkCisxLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgNDA5NiwgICAgMTYzODQsIDB4NDJmYThlNjUKKzEsICAgICAgNDUwNTYsICAgICAgNDUwNTYsICAgICA0MDk2LCAgICAxNjM4NCwgMHgxNzVlNmE2MQorMSwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDNjZDBlNjA2CisxLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NWNlZmY2N2QKKzEsICAgICAgNTczNDQsICAgICAgNTczNDQsICAgICA0MDk2LCAgICAxNjM4NCwgMHhhMjRiYTczMworMSwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGFmZTYxYTJkCisxLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4ZWY4MzU1ZjEKKzEsICAgICAgNjk2MzIsICAgICAgNjk2MzIsICAgICA0MDk2LCAgICAxNjM4NCwgMHg4ZTUzY2I3YworMSwgICAgICA3MzcyOCwgICAgICA3MzcyOCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDQ2MWJiOTQwCisxLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4OTZiYjZlYmQKKzEsICAgICAgODE5MjAsICAgICAgODE5MjAsICAgICA0MDk2LCAgICAxNjM4NCwgMHhiOTk5NzdkYworMSwgICAgICA4NjAxNiwgICAgICA4NjAxNiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGE2YjZhMTc4CisxLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgNDA5NiwgICAgMTYzODQsIDB4N2JkYzNlNTAKKzEsICAgICAgOTQyMDgsICAgICAgOTQyMDgsICAgICA0MDk2LCAgICAxNjM4NCwgMHg0NGNkYTUxOQorMSwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGJkZmQyZTcyCisxLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgNDA5NiwgICAgMTYzODQsIDB4NWMwOWRjM2MKKzEsICAgICAxMDY0OTYsICAgICAxMDY0OTYsICAgICA0MDk2LCAgICAxNjM4NCwgMHhlNWFhYmI3NQorMSwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDVkYjgzZmIyCisxLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NjlhNmUzYzAKKzEsICAgICAxMTg3ODQsICAgICAxMTg3ODQsICAgICA0MDk2LCAgICAxNjM4NCwgMHgwYzA5YTkwZAorMSwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDk3OGQyYjUwCisxLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4OTcwN2ZiYWEKKzEsICAgICAxMzEwNzIsICAgICAxMzEwNzIsICAgICA0MDk2LCAgICAxNjM4NCwgMHg4MDAzZjkzYgorMSwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGFhMTJhYjBjCisxLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NDk5ODA1MDEKKzEsICAgICAxNDMzNjAsICAgICAxNDMzNjAsICAgICA0MDk2LCAgICAxNjM4NCwgMHhkY2I4OTFkYgorMSwgICAgIDE0NzQ1NiwgICAgIDE0NzQ1NiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDUyYjc2OTM4CisxLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgNDA5NiwgICAgMTYzODQsIDB4N2NiNTU0NTcKKzEsICAgICAxNTU2NDgsICAgICAxNTU2NDgsICAgICA0MDk2LCAgICAxNjM4NCwgMHg2YjA4YjdkMgorMSwgICAgIDE1OTc0NCwgICAgIDE1OTc0NCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGI1NmJiMzEyCisxLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgNDA5NiwgICAgMTYzODQsIDB4Y2JmOWQzZTAKKzEsICAgICAxNjc5MzYsICAgICAxNjc5MzYsICAgICA0MDk2LCAgICAxNjM4NCwgMHhlODk1OGMwNworMSwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDA1NGFjMDIxCisxLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgNDA5NiwgICAgMTYzODQsIDB4MzY4MTE2MDMKKzEsICAgICAxODAyMjQsICAgICAxODAyMjQsICAgICA0MDk2LCAgICAxNjM4NCwgMHgzMzU0ZjZlMQorMSwgICAgIDE4NDMyMCwgICAgIDE4NDMyMCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGE2YzExNjg2CisxLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4ZWQzNTM4NzcKKzEsICAgICAxOTI1MTIsICAgICAxOTI1MTIsICAgICA0MDk2LCAgICAxNjM4NCwgMHhlZjIxMzczZQorMSwgICAgIDE5NjYwOCwgICAgIDE5NjYwOCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDMxYzgwNmQ5CisxLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4M2MxYzc5ZDQKKzEsICAgICAyMDQ4MDAsICAgICAyMDQ4MDAsICAgICA0MDk2LCAgICAxNjM4NCwgMHgxYjdiM2Q5YQorMSwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDA4OTc3MjM5CisxLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgNDA5NiwgICAgMTYzODQsIDB4MDdmOWQxNjkKKzEsICAgICAyMTcwODgsICAgICAyMTcwODgsICAgICA0MDk2LCAgICAxNjM4NCwgMHhhNjZhZTE5YQorMSwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDQyZjUxMTY5CisxLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgNDA5NiwgICAgMTYzODQsIDB4OThmZjU5YjYKKzEsICAgICAyMjkzNzYsICAgICAyMjkzNzYsICAgICA0MDk2LCAgICAxNjM4NCwgMHg4NTUyMTZiOQorMSwgICAgIDIzMzQ3MiwgICAgIDIzMzQ3MiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDA5ODY1NzNkCisxLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgNDA5NiwgICAgMTYzODQsIDB4MDYwYWVmZmUKKzEsICAgICAyNDE2NjQsICAgICAyNDE2NjQsICAgICA0MDk2LCAgICAxNjM4NCwgMHgzOTFjMTliYworMSwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDk5MzljNDcyCisxLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NGUwZDMxYzUKKzEsICAgICAyNTM5NTIsICAgICAyNTM5NTIsICAgICA0MDk2LCAgICAxNjM4NCwgMHhlZDI2NzhhNgorMSwgICAgIDI1ODA0OCwgICAgIDI1ODA0OCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGZkODk5ZmMzCisxLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4MzVjZjUyNjMKKzEsICAgICAyNjYyNDAsICAgICAyNjYyNDAsICAgICA0MDk2LCAgICAxNjM4NCwgMHhhMmUzNWRhZAorMSwgICAgIDI3MDMzNiwgICAgIDI3MDMzNiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGY5ZWQwOGEwCisxLCAgICAgMjc0NDMyLCAgICAgMjc0NDMyLCAgICAgNDA5NiwgICAgMTYzODQsIDB4MDIyZDkzNTYKKzEsICAgICAyNzg1MjgsICAgICAyNzg1MjgsICAgICA0MDk2LCAgICAxNjM4NCwgMHg1MDgwNDJmNworMSwgICAgIDI4MjYyNCwgICAgIDI4MjYyNCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGUyZTdlNzBiCisxLCAgICAgMjg2NzIwLCAgICAgMjg2NzIwLCAgICAgNDA5NiwgICAgMTYzODQsIDB4MzA4MTJiZmQKKzEsICAgICAyOTA4MTYsICAgICAyOTA4MTYsICAgICA0MDk2LCAgICAxNjM4NCwgMHg1NTkwZWE3ZAorMSwgICAgIDI5NDkxMiwgICAgIDI5NDkxMiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGViYWE0ZmM0CisxLCAgICAgMjk5MDA4LCAgICAgMjk5MDA4LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NzMxY2VlNTMKKzEsICAgICAzMDMxMDQsICAgICAzMDMxMDQsICAgICA0MDk2LCAgICAxNjM4NCwgMHgxMTI3YjQ4MAorMSwgICAgIDMwNzIwMCwgICAgIDMwNzIwMCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDA4MDlmN2M4CisxLCAgICAgMzExMjk2LCAgICAgMzExMjk2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4YzBkNDI1NmYKKzEsICAgICAzMTUzOTIsICAgICAzMTUzOTIsICAgICA0MDk2LCAgICAxNjM4NCwgMHhlODY4Nzk1YworMSwgICAgIDMxOTQ4OCwgICAgIDMxOTQ4OCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDgwMWE3N2QxCisxLCAgICAgMzIzNTg0LCAgICAgMzIzNTg0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4MWQ0NGJlZDUKKzEsICAgICAzMjc2ODAsICAgICAzMjc2ODAsICAgICA0MDk2LCAgICAxNjM4NCwgMHg3NjE5ZjE2YgorMSwgICAgIDMzMTc3NiwgICAgIDMzMTc3NiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDMwMTA2NGI2CisxLCAgICAgMzM1ODcyLCAgICAgMzM1ODcyLCAgICAgNDA5NiwgICAgMTYzODQsIDB4NDJmM2UwZmIKKzEsICAgICAzMzk5NjgsICAgICAzMzk5NjgsICAgICA0MDk2LCAgICAxNjM4NCwgMHhmZTE4NmRjNgorMSwgICAgIDM0NDA2NCwgICAgIDM0NDA2NCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDFhOWJiYmFiCisxLCAgICAgMzQ4MTYwLCAgICAgMzQ4MTYwLCAgICAgNDA5NiwgICAgMTYzODQsIDB4M2M0ZTAwYTgKKzEsICAgICAzNTIyNTYsICAgICAzNTIyNTYsICAgICA0MDk2LCAgICAxNjM4NCwgMHgzMTAxYzg0ZQorMSwgICAgIDM1NjM1MiwgICAgIDM1NjM1MiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDExYTZjNzY0CisxLCAgICAgMzYwNDQ4LCAgICAgMzYwNDQ4LCAgICAgNDA5NiwgICAgMTYzODQsIDB4Yjc1ZTgyYTEKKzEsICAgICAzNjQ1NDQsICAgICAzNjQ1NDQsICAgICA0MDk2LCAgICAxNjM4NCwgMHg4MWUzYjNkZAorMSwgICAgIDM2ODY0MCwgICAgIDM2ODY0MCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDI2NTZmYzhlCisxLCAgICAgMzcyNzM2LCAgICAgMzcyNzM2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NmM2NTVmNDAKKzEsICAgICAzNzY4MzIsICAgICAzNzY4MzIsICAgICA0MDk2LCAgICAxNjM4NCwgMHhiYTA0MzJmOQorMSwgICAgIDM4MDkyOCwgICAgIDM4MDkyOCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDcwMjhlZTU3CisxLCAgICAgMzg1MDI0LCAgICAgMzg1MDI0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4MTZiYWY2ZWQKKzEsICAgICAzODkxMjAsICAgICAzODkxMjAsICAgICA0MDk2LCAgICAxNjM4NCwgMHg4NjNiY2ZmNQorMSwgICAgIDM5MzIxNiwgICAgIDM5MzIxNiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDRkYmNlODdlCisxLCAgICAgMzk3MzEyLCAgICAgMzk3MzEyLCAgICAgNDA5NiwgICAgMTYzODQsIDB4ODI1ZTI2OGMKKzEsICAgICA0MDE0MDgsICAgICA0MDE0MDgsICAgICA0MDk2LCAgICAxNjM4NCwgMHhmZTI2OWYwYQorMSwgICAgIDQwNTUwNCwgICAgIDQwNTUwNCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDQ3YjljMGVmCisxLCAgICAgNDA5NjAwLCAgICAgNDA5NjAwLCAgICAgNDA5NiwgICAgMTYzODQsIDB4YmJlNTVhYWMKKzEsICAgICA0MTM2OTYsICAgICA0MTM2OTYsICAgICA0MDk2LCAgICAxNjM4NCwgMHhlYjA2NzRhNworMSwgICAgIDQxNzc5MiwgICAgIDQxNzc5MiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDAxYWZiYTFiCisxLCAgICAgNDIxODg4LCAgICAgNDIxODg4LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NWVjMTgzMDYKKzEsICAgICA0MjU5ODQsICAgICA0MjU5ODQsICAgICA0MDk2LCAgICAxNjM4NCwgMHg2ZDBiODQ0ZgorMSwgICAgIDQzMDA4MCwgICAgIDQzMDA4MCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDZjZDFiZWEyCisxLCAgICAgNDM0MTc2LCAgICAgNDM0MTc2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4OTdlNDdjYmIKKzEsICAgICA0MzgyNzIsICAgICA0MzgyNzIsICAgICA0MDk2LCAgICAxNjM4NCwgMHhiYjZiZjU1NAorMSwgICAgIDQ0MjM2OCwgICAgIDQ0MjM2OCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDMzZWE3OTYxCisxLCAgICAgNDQ2NDY0LCAgICAgNDQ2NDY0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4ODNjZTJmMmEKKzEsICAgICA0NTA1NjAsICAgICA0NTA1NjAsICAgICA0MDk2LCAgICAxNjM4NCwgMHgzYmVkOWUwZAorMSwgICAgIDQ1NDY1NiwgICAgIDQ1NDY1NiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGQzYTk1NzBhCisxLCAgICAgNDU4NzUyLCAgICAgNDU4NzUyLCAgICAgNDA5NiwgICAgMTYzODQsIDB4NGQ1ZTFhY2EKKzEsICAgICA0NjI4NDgsICAgICA0NjI4NDgsICAgICA0MDk2LCAgICAxNjM4NCwgMHg4NzRhOWIxMQorMSwgICAgIDQ2Njk0NCwgICAgIDQ2Njk0NCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGU1MTA2MWQ4CisxLCAgICAgNDcxMDQwLCAgICAgNDcxMDQwLCAgICAgNDA5NiwgICAgMTYzODQsIDB4MzU4MmZhYzQKKzEsICAgICA0NzUxMzYsICAgICA0NzUxMzYsICAgICA0MDk2LCAgICAxNjM4NCwgMHgzNWRmNTU4ZQorMSwgICAgIDQ3OTIzMiwgICAgIDQ3OTIzMiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGUyNDg1ZmVkCisxLCAgICAgNDgzMzI4LCAgICAgNDgzMzI4LCAgICAgNDA5NiwgICAgMTYzODQsIDB4MzFmOWM2YTcKKzEsICAgICA0ODc0MjQsICAgICA0ODc0MjQsICAgICA0MDk2LCAgICAxNjM4NCwgMHgwYTgyYjI0NAorMSwgICAgIDQ5MTUyMCwgICAgIDQ5MTUyMCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGZiYjQyOGY0CisxLCAgICAgNDk1NjE2LCAgICAgNDk1NjE2LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NTdiOTBiYjYKKzEsICAgICA0OTk3MTIsICAgICA0OTk3MTIsICAgICA0MDk2LCAgICAxNjM4NCwgMHg1YzZkYWExYQorMSwgICAgIDUwMzgwOCwgICAgIDUwMzgwOCwgICAgIDQwOTYsICAgIDE2Mzg0LCAweGUwMmFjMTEzCisxLCAgICAgNTA3OTA0LCAgICAgNTA3OTA0LCAgICAgNDA5NiwgICAgMTYzODQsIDB4NDdlZDU5YjYKKzEsICAgICA1MTIwMDAsICAgICA1MTIwMDAsICAgICA0MDk2LCAgICAxNjM4NCwgMHgyMjBlNGJkMworMSwgICAgIDUxNjA5NiwgICAgIDUxNjA5NiwgICAgIDQwOTYsICAgIDE2Mzg0LCAweDY1ZGU0OGIxCisxLCAgICAgNTIwMTkyLCAgICAgNTIwMTkyLCAgICAgNDA4NSwgICAgMTYzNDAsIDB4MzI2ZmE3NTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZmbXBlZy1ic2YtcmVtb3ZlLWUgYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctYnNmLXJlbW92ZS1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZjA0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctYnNmLXJlbW92ZS1lCkBAIC0wLDAgKzEsMzIgQEAKK2Q2YzY4ODQzMmI4OGNhNjJlYThhYmI4ODUyNzJhZjUyICp0ZXN0cy9kYXRhL2ZhdGUvZmZtcGVnLWJzZi1yZW1vdmUtZS5hdmkKKzEyOTk4MiB0ZXN0cy9kYXRhL2ZhdGUvZmZtcGVnLWJzZi1yZW1vdmUtZS5hdmkKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IG1wZWc0CisjZGltZW5zaW9ucyAwOiA3MTZ4MjM2Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAyMDE2NCwgMHg2NmJmNWU1MgorMCwgICAgICAgICAgMSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxNzg3OCwgMHhjMDgxYTQwNSwgRj0weDAKKzAsICAgICAgICAgIDIsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMjI3MjMsIDB4NjA5MzVkMjgsIEY9MHgwCiswLCAgICAgICAgICAzLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDE4NjU1LCAweGU1YzMzYWRhLCBGPTB4MAorMCwgICAgICAgICAgNCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMjkyOCwgMHg4NGQ2YTlkNywgRj0weDAKKzAsICAgICAgICAgIDUsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDQ3ODgsIDB4YmY5ZTE5MzksIEY9MHgwCiswLCAgICAgICAgICA2LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAzMTYwLCAweDg2NzQyM2M3LCBGPTB4MAorMCwgICAgICAgICAgNywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMjA0OSwgMHg1MjNmZmQ4NSwgRj0weDAKKzAsICAgICAgICAgIDgsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDE0NDAsIDB4MzYzZmY3MjUsIEY9MHgwCiswLCAgICAgICAgICA5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAxMzAwLCAweDBkM2M5Yzc0LCBGPTB4MAorMCwgICAgICAgICAxMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMTA4MSwgMHhiZmIwMzY1YywgRj0weDAKKzAsICAgICAgICAgMTEsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDEwMTEsIDB4OWQzMTBmOTAsIEY9MHgwCiswLCAgICAgICAgIDEyLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAyNTEzLCAweGJjZDgwM2I1CiswLCAgICAgICAgIDEzLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAgODgxLCAweDc0OTJkMjYyLCBGPTB4MAorMCwgICAgICAgICAxNCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgIDg5NiwgMHgxZmYxZDMzNSwgRj0weDAKKzAsICAgICAgICAgMTUsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgICA5NzMsIDB4NzJjMWZjMDQsIEY9MHgwCiswLCAgICAgICAgIDE2LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAxMDc1LCAweGE1ODgxZDczLCBGPTB4MAorMCwgICAgICAgICAxNywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgIDkzMywgMHhmMGFhZTk3NCwgRj0weDAKKzAsICAgICAgICAgMTgsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDEwNzksIDB4YmRjZTFiNDAsIEY9MHgwCiswLCAgICAgICAgIDE5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAgOTY0LCAweDMyM2ZlNGFiLCBGPTB4MAorMCwgICAgICAgICAyMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMTAxNSwgMHg3OGE0ZmU5NiwgRj0weDAKKzAsICAgICAgICAgMjEsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgICA5OTAsIDB4OWNkNGZmMjUsIEY9MHgwCiswLCAgICAgICAgIDIyLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAxMDkzLCAweDk4NzEyZTJlLCBGPTB4MAorMCwgICAgICAgICAyMywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMTIwMCwgMHgzNzk1NzE1NiwgRj0weDAKKzAsICAgICAgICAgMjQsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDI4NTEsIDB4YjA1YmU4YTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZmbXBlZy1ic2YtcmVtb3ZlLWsgYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctYnNmLXJlbW92ZS1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMWY1NGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctYnNmLXJlbW92ZS1rCkBAIC0wLDAgKzEsMzMgQEAKKzYxOTZmMWQ2YjU5ZDE2YzA0NWRlNjI3MjIxZDg2ODVmICp0ZXN0cy9kYXRhL2ZhdGUvZmZtcGVnLWJzZi1yZW1vdmUtay5hdmkKKzEzMDA3MiB0ZXN0cy9kYXRhL2ZhdGUvZmZtcGVnLWJzZi1yZW1vdmUtay5hdmkKKyNleHRyYWRhdGEgMDogICAgICAgMzAsIDB4NGE0ZDA2NWEKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IG1wZWc0CisjZGltZW5zaW9ucyAwOiA3MTZ4MjM2Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDIwMTk0LCAweDE3NGY2NGFjCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMTc4NzgsIDB4YzA4MWE0MDUsIEY9MHgwCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjI3MjMsIDB4NjA5MzVkMjgsIEY9MHgwCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAgMTg2NTUsIDB4ZTVjMzNhZGEsIEY9MHgwCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgMTI5MjgsIDB4ODRkNmE5ZDcsIEY9MHgwCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAgIDQ3ODgsIDB4YmY5ZTE5MzksIEY9MHgwCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAgIDMxNjAsIDB4ODY3NDIzYzcsIEY9MHgwCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAgIDIwNDksIDB4NTIzZmZkODUsIEY9MHgwCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAgIDE0NDAsIDB4MzYzZmY3MjUsIEY9MHgwCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAgIDEzMDAsIDB4MGQzYzljNzQsIEY9MHgwCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAgIDEwODEsIDB4YmZiMDM2NWMsIEY9MHgwCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAgIDEwMTEsIDB4OWQzMTBmOTAsIEY9MHgwCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAgIDI1NDMsIDB4NjQ1MDBhMGYKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgICAgIDg4MSwgMHg3NDkyZDI2MiwgRj0weDAKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgICAgIDg5NiwgMHgxZmYxZDMzNSwgRj0weDAKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgICAgIDk3MywgMHg3MmMxZmMwNCwgRj0weDAKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgICAgMTA3NSwgMHhhNTg4MWQ3MywgRj0weDAKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgICAgIDkzMywgMHhmMGFhZTk3NCwgRj0weDAKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgICAgMTA3OSwgMHhiZGNlMWI0MCwgRj0weDAKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgICAgIDk2NCwgMHgzMjNmZTRhYiwgRj0weDAKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgICAgMTAxNSwgMHg3OGE0ZmU5NiwgRj0weDAKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgICAgIDk5MCwgMHg5Y2Q0ZmYyNSwgRj0weDAKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgICAgMTA5MywgMHg5ODcxMmUyZSwgRj0weDAKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgICAgMTIwMCwgMHgzNzk1NzE1NiwgRj0weDAKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgICAgMjg4MSwgMHhiYjFmZWVmYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmZtcGVnLWJzZi1yZW1vdmUtciBiL3Rlc3RzL3JlZi9mYXRlL2ZmbXBlZy1ic2YtcmVtb3ZlLXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUzM2FhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZmbXBlZy1ic2YtcmVtb3ZlLXIKQEAgLTAsMCArMSwzMiBAQAorZDZjNjg4NDMyYjg4Y2E2MmVhOGFiYjg4NTI3MmFmNTIgKnRlc3RzL2RhdGEvZmF0ZS9mZm1wZWctYnNmLXJlbW92ZS1yLmF2aQorMTI5OTgyIHRlc3RzL2RhdGEvZmF0ZS9mZm1wZWctYnNmLXJlbW92ZS1yLmF2aQorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogbXBlZzQKKyNkaW1lbnNpb25zIDA6IDcxNngyMzYKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDIwMTY0LCAweDY2YmY1ZTUyCiswLCAgICAgICAgICAxLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDE3ODc4LCAweGMwODFhNDA1LCBGPTB4MAorMCwgICAgICAgICAgMiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAyMjcyMywgMHg2MDkzNWQyOCwgRj0weDAKKzAsICAgICAgICAgIDMsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTg2NTUsIDB4ZTVjMzNhZGEsIEY9MHgwCiswLCAgICAgICAgICA0LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEyOTI4LCAweDg0ZDZhOWQ3LCBGPTB4MAorMCwgICAgICAgICAgNSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgNDc4OCwgMHhiZjllMTkzOSwgRj0weDAKKzAsICAgICAgICAgIDYsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDMxNjAsIDB4ODY3NDIzYzcsIEY9MHgwCiswLCAgICAgICAgICA3LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAyMDQ5LCAweDUyM2ZmZDg1LCBGPTB4MAorMCwgICAgICAgICAgOCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMTQ0MCwgMHgzNjNmZjcyNSwgRj0weDAKKzAsICAgICAgICAgIDksIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDEzMDAsIDB4MGQzYzljNzQsIEY9MHgwCiswLCAgICAgICAgIDEwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAxMDgxLCAweGJmYjAzNjVjLCBGPTB4MAorMCwgICAgICAgICAxMSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMTAxMSwgMHg5ZDMxMGY5MCwgRj0weDAKKzAsICAgICAgICAgMTIsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDI1MTMsIDB4YmNkODAzYjUKKzAsICAgICAgICAgMTMsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgICA4ODEsIDB4NzQ5MmQyNjIsIEY9MHgwCiswLCAgICAgICAgIDE0LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAgODk2LCAweDFmZjFkMzM1LCBGPTB4MAorMCwgICAgICAgICAxNSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgIDk3MywgMHg3MmMxZmMwNCwgRj0weDAKKzAsICAgICAgICAgMTYsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDEwNzUsIDB4YTU4ODFkNzMsIEY9MHgwCiswLCAgICAgICAgIDE3LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAgOTMzLCAweGYwYWFlOTc0LCBGPTB4MAorMCwgICAgICAgICAxOCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMTA3OSwgMHhiZGNlMWI0MCwgRj0weDAKKzAsICAgICAgICAgMTksIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgICA5NjQsIDB4MzIzZmU0YWIsIEY9MHgwCiswLCAgICAgICAgIDIwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAxMDE1LCAweDc4YTRmZTk2LCBGPTB4MAorMCwgICAgICAgICAyMSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgIDk5MCwgMHg5Y2Q0ZmYyNSwgRj0weDAKKzAsICAgICAgICAgMjIsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDEwOTMsIDB4OTg3MTJlMmUsIEY9MHgwCiswLCAgICAgICAgIDIzLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAxMjAwLCAweDM3OTU3MTU2LCBGPTB4MAorMCwgICAgICAgICAyNCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMjg1MSwgMHhiMDViZThhMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmZtcGVnLWZpbHRlcl9jb2xvcmtleSBiL3Rlc3RzL3JlZi9mYXRlL2ZmbXBlZy1maWx0ZXJfY29sb3JrZXkKaW5kZXggMGU0NzgwYi4uZWZmYzEzYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmZtcGVnLWZpbHRlcl9jb2xvcmtleQorKysgYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctZmlsdGVyX2NvbG9ya2V5CkBAIC0xLDExICsxLDEwIEBACiAjdGIgMDogMS8yNQotI3RiIDE6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2MjIwODAsIDB4NGUzMGFjY2IKLTEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAotMSwgICAgICAgMTE1MiwgICAgICAgMTE1MiwgICAgIDExNTIsICAgICA0NjA4LCAweGJjYTI5MDYzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2MjIwODAsIDB4N2Q5NDFjMTQKLTEsICAgICAgIDIzMDQsICAgICAgIDIzMDQsICAgICAxMTUyLCAgICAgNDYwOCwgMHg2ZTcwZGYxMAotMSwgICAgICAgMzQ1NiwgICAgICAgMzQ1NiwgICAgIDExNTIsICAgICA0NjA4LCAweDk1ZTZhNTM1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA2MjIwODAsIDB4Zjc0NTFjNWIKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhiMmM3NDMxOQogMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNjIyMDgwLCAweGM5YjgwYjc5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctZmlsdGVyX2NvbXBsZXggYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctZmlsdGVyX2NvbXBsZXgKaW5kZXggNTRkMzE4ZC4uZDg1YTRhYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmZtcGVnLWZpbHRlcl9jb21wbGV4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZmbXBlZy1maWx0ZXJfY29tcGxleApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc1ZWM1NzMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNzVlYzU3MwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDM3NWVjNTczCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctZmlsdGVyX2NvbXBsZXhfYXVkaW8gYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctZmlsdGVyX2NvbXBsZXhfYXVkaW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQyNDY3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZmbXBlZy1maWx0ZXJfY29tcGxleF9hdWRpbwpAQCAtMCwwICsxLDEwIEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBhYzMKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KKzAsICAgICAgIC0yNTYsICAgICAgIC0yNTYsICAgICAxNTM2LCAgICAgIDQxNiwgMHgzMDAxZmIyZAorMCwgICAgICAgMTI4MCwgICAgICAgMTI4MCwgICAgIDE1MzYsICAgICAgNDE4LCAweGJhNzJmYzE2CiswLCAgICAgICAyODE2LCAgICAgICAyODE2LCAgICAgMTUzNiwgICAgICA0MTgsIDB4YmE3MmZjMTYKKzAsICAgICAgIDQzNTIsICAgICAgIDQzNTIsICAgICAxNTM2LCAgICAgIDQxOCwgMHhiYTcyZmMxNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmZtcGVnLWxhdmZpIGIvdGVzdHMvcmVmL2ZhdGUvZmZtcGVnLWxhdmZpCmluZGV4IDU0ZDMxOGQuLmQ4NWE0YWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZmbXBlZy1sYXZmaQorKysgYi90ZXN0cy9yZWYvZmF0ZS9mZm1wZWctbGF2ZmkKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS81CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDM3NWVjNTczCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc1ZWM1NzMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNzVlYzU3MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9jb21wYWN0IGIvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9jb21wYWN0CmluZGV4IDBkOWVmMzAuLjRhMGY0ZWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZmcHJvYmVfY29tcGFjdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2NvbXBhY3QKQEAgLTEsMzIgKzEsMzIgQEAKLXBhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0wfHB0c190aW1lPTAuMDAwMDAwfGR0cz0wfGR0c190aW1lPTAuMDAwMDAwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDQ4fHBvcz02NDJ8ZmxhZ3M9SwotZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTB8cGt0X3B0c190aW1lPTAuMDAwMDAwfHBrdF9kdHM9MHxwa3RfZHRzX3RpbWU9MC4wMDAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTB8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wMDAwMDB8cGt0X2R1cmF0aW9uPTEwMjR8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMjMyMjB8cGt0X3Bvcz02NDJ8cGt0X3NpemU9MjA0OHxzYW1wbGVfZm10PXMxNnxuYl9zYW1wbGVzPTEwMjR8Y2hhbm5lbHM9MXxjaGFubmVsX2xheW91dD11bmtub3duCi1wYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MXxwdHM9MHxwdHNfdGltZT0wLjAwMDAwMHxkdHM9MHxkdHNfdGltZT0wLjAwMDAwMHxkdXJhdGlvbj0yMDQ4fGR1cmF0aW9uX3RpbWU9MC4wNDAwMDB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjMwNDAwfHBvcz0yNzE3fGZsYWdzPUsKLWZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTF8a2V5X2ZyYW1lPTF8cGt0X3B0cz0wfHBrdF9wdHNfdGltZT0wLjAwMDAwMHxwa3RfZHRzPTB8cGt0X2R0c190aW1lPTAuMDAwMDAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0wfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDAwMDAwfHBrdF9kdXJhdGlvbj0yMDQ4fHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwfHBrdF9wb3M9MjcxN3xwa3Rfc2l6ZT0yMzA0MDB8d2lkdGg9MzIwfGhlaWdodD0yNDB8cGl4X2ZtdD1yZ2IyNHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MAotcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTJ8cHRzPTB8cHRzX3RpbWU9MC4wMDAwMDB8ZHRzPTB8ZHRzX3RpbWU9MC4wMDAwMDB8ZHVyYXRpb249MjA0OHxkdXJhdGlvbl90aW1lPTAuMDQwMDAwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTMwMDAwfHBvcz0yMzMxMzh8ZmxhZ3M9SwotZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxrZXlfZnJhbWU9MXxwa3RfcHRzPTB8cGt0X3B0c190aW1lPTAuMDAwMDAwfHBrdF9kdHM9MHxwa3RfZHRzX3RpbWU9MC4wMDAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTB8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wMDAwMDB8cGt0X2R1cmF0aW9uPTIwNDh8cGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDB8cGt0X3Bvcz0yMzMxMzh8cGt0X3NpemU9MzAwMDB8d2lkdGg9MTAwfGhlaWdodD0xMDB8cGl4X2ZtdD1yZ2IyNHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MAotcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEwMjR8cHRzX3RpbWU9MC4wMjMyMjB8ZHRzPTEwMjR8ZHRzX3RpbWU9MC4wMjMyMjB8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNDh8cG9zPTI2MzE0M3xmbGFncz1LCi1mcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9MTAyNHxwa3RfcHRzX3RpbWU9MC4wMjMyMjB8cGt0X2R0cz0xMDI0fHBrdF9kdHNfdGltZT0wLjAyMzIyMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTAyNHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjAyMzIyMHxwa3RfZHVyYXRpb249MTAyNHxwa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMHxwa3RfcG9zPTI2MzE0M3xwa3Rfc2l6ZT0yMDQ4fHNhbXBsZV9mbXQ9czE2fG5iX3NhbXBsZXM9MTAyNHxjaGFubmVscz0xfGNoYW5uZWxfbGF5b3V0PXVua25vd24KLXBhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0xfHB0cz0yMDQ4fHB0c190aW1lPTAuMDQwMDAwfGR0cz0yMDQ4fGR0c190aW1lPTAuMDQwMDAwfGR1cmF0aW9uPTIwNDh8ZHVyYXRpb25fdGltZT0wLjA0MDAwMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzA0MDB8cG9zPTI2NTIyMXxmbGFncz1LCi1mcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0xfGtleV9mcmFtZT0xfHBrdF9wdHM9MjA0OHxwa3RfcHRzX3RpbWU9MC4wNDAwMDB8cGt0X2R0cz0yMDQ4fHBrdF9kdHNfdGltZT0wLjA0MDAwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjA0OHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA0MDAwMHxwa3RfZHVyYXRpb249MjA0OHxwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMHxwa3RfcG9zPTI2NTIyMXxwa3Rfc2l6ZT0yMzA0MDB8d2lkdGg9MzIwfGhlaWdodD0yNDB8cGl4X2ZtdD1yZ2IyNHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MAotcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTJ8cHRzPTIwNDh8cHRzX3RpbWU9MC4wNDAwMDB8ZHRzPTIwNDh8ZHRzX3RpbWU9MC4wNDAwMDB8ZHVyYXRpb249MjA0OHxkdXJhdGlvbl90aW1lPTAuMDQwMDAwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTMwMDAwfHBvcz00OTU2NDV8ZmxhZ3M9SwotZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxrZXlfZnJhbWU9MXxwa3RfcHRzPTIwNDh8cGt0X3B0c190aW1lPTAuMDQwMDAwfHBrdF9kdHM9MjA0OHxwa3RfZHRzX3RpbWU9MC4wNDAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTIwNDh8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wNDAwMDB8cGt0X2R1cmF0aW9uPTIwNDh8cGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDB8cGt0X3Bvcz00OTU2NDV8cGt0X3NpemU9MzAwMDB8d2lkdGg9MTAwfGhlaWdodD0xMDB8cGl4X2ZtdD1yZ2IyNHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MAotcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIwNDh8cHRzX3RpbWU9MC4wNDY0NDB8ZHRzPTIwNDh8ZHRzX3RpbWU9MC4wNDY0NDB8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNDh8cG9zPTUyNTY1MHxmbGFncz1LCi1mcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9MjA0OHxwa3RfcHRzX3RpbWU9MC4wNDY0NDB8cGt0X2R0cz0yMDQ4fHBrdF9kdHNfdGltZT0wLjA0NjQ0MHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjA0OHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA0NjQ0MHxwa3RfZHVyYXRpb249MTAyNHxwa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMHxwa3RfcG9zPTUyNTY1MHxwa3Rfc2l6ZT0yMDQ4fHNhbXBsZV9mbXQ9czE2fG5iX3NhbXBsZXM9MTAyNHxjaGFubmVscz0xfGNoYW5uZWxfbGF5b3V0PXVua25vd24KLXBhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0zMDcyfHB0c190aW1lPTAuMDY5NjYwfGR0cz0zMDcyfGR0c190aW1lPTAuMDY5NjYwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDQ4fHBvcz01Mjc3MjF8ZmxhZ3M9SwotZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTMwNzJ8cGt0X3B0c190aW1lPTAuMDY5NjYwfHBrdF9kdHM9MzA3Mnxwa3RfZHRzX3RpbWU9MC4wNjk2NjB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTMwNzJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wNjk2NjB8cGt0X2R1cmF0aW9uPTEwMjR8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMjMyMjB8cGt0X3Bvcz01Mjc3MjF8cGt0X3NpemU9MjA0OHxzYW1wbGVfZm10PXMxNnxuYl9zYW1wbGVzPTEwMjR8Y2hhbm5lbHM9MXxjaGFubmVsX2xheW91dD11bmtub3duCi1wYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MXxwdHM9NDA5NnxwdHNfdGltZT0wLjA4MDAwMHxkdHM9NDA5NnxkdHNfdGltZT0wLjA4MDAwMHxkdXJhdGlvbj0yMDQ4fGR1cmF0aW9uX3RpbWU9MC4wNDAwMDB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjMwNDAwfHBvcz01Mjk3OTl8ZmxhZ3M9SwotZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MXxrZXlfZnJhbWU9MXxwa3RfcHRzPTQwOTZ8cGt0X3B0c190aW1lPTAuMDgwMDAwfHBrdF9kdHM9NDA5Nnxwa3RfZHRzX3RpbWU9MC4wODAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTQwOTZ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wODAwMDB8cGt0X2R1cmF0aW9uPTIwNDh8cGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDB8cGt0X3Bvcz01Mjk3OTl8cGt0X3NpemU9MjMwNDAwfHdpZHRoPTMyMHxoZWlnaHQ9MjQwfHBpeF9mbXQ9cmdiMjR8c2FtcGxlX2FzcGVjdF9yYXRpbz0xOjF8cGljdF90eXBlPUl8Y29kZWRfcGljdHVyZV9udW1iZXI9MHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTAKLXBhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0yfHB0cz00MDk2fHB0c190aW1lPTAuMDgwMDAwfGR0cz00MDk2fGR0c190aW1lPTAuMDgwMDAwfGR1cmF0aW9uPTIwNDh8ZHVyYXRpb25fdGltZT0wLjA0MDAwMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zMDAwMHxwb3M9NzYwMjIzfGZsYWdzPUsKLWZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTJ8a2V5X2ZyYW1lPTF8cGt0X3B0cz00MDk2fHBrdF9wdHNfdGltZT0wLjA4MDAwMHxwa3RfZHRzPTQwOTZ8cGt0X2R0c190aW1lPTAuMDgwMDAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD00MDk2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDgwMDAwfHBrdF9kdXJhdGlvbj0yMDQ4fHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwfHBrdF9wb3M9NzYwMjIzfHBrdF9zaXplPTMwMDAwfHdpZHRoPTEwMHxoZWlnaHQ9MTAwfHBpeF9mbXQ9cmdiMjR8c2FtcGxlX2FzcGVjdF9yYXRpbz0xOjF8cGljdF90eXBlPUl8Y29kZWRfcGljdHVyZV9udW1iZXI9MHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTAKLXBhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz00MDk2fHB0c190aW1lPTAuMDkyODgwfGR0cz00MDk2fGR0c190aW1lPTAuMDkyODgwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDQ4fHBvcz03OTAyMjh8ZmxhZ3M9SwotZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTQwOTZ8cGt0X3B0c190aW1lPTAuMDkyODgwfHBrdF9kdHM9NDA5Nnxwa3RfZHRzX3RpbWU9MC4wOTI4ODB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTQwOTZ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wOTI4ODB8cGt0X2R1cmF0aW9uPTEwMjR8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMjMyMjB8cGt0X3Bvcz03OTAyMjh8cGt0X3NpemU9MjA0OHxzYW1wbGVfZm10PXMxNnxuYl9zYW1wbGVzPTEwMjR8Y2hhbm5lbHM9MXxjaGFubmVsX2xheW91dD11bmtub3duCi1wYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTEyMHxwdHNfdGltZT0wLjExNjEwMHxkdHM9NTEyMHxkdHNfdGltZT0wLjExNjEwMHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjA0OHxwb3M9NzkyMjk5fGZsYWdzPUsKLWZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz01MTIwfHBrdF9wdHNfdGltZT0wLjExNjEwMHxwa3RfZHRzPTUxMjB8cGt0X2R0c190aW1lPTAuMTE2MTAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD01MTIwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMTE2MTAwfHBrdF9kdXJhdGlvbj0xMDI0fHBrdF9kdXJhdGlvbl90aW1lPTAuMDIzMjIwfHBrdF9wb3M9NzkyMjk5fHBrdF9zaXplPTIwNDh8c2FtcGxlX2ZtdD1zMTZ8bmJfc2FtcGxlcz0xMDI0fGNoYW5uZWxzPTF8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgotcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTF8cHRzPTYxNDR8cHRzX3RpbWU9MC4xMjAwMDB8ZHRzPTYxNDR8ZHRzX3RpbWU9MC4xMjAwMDB8ZHVyYXRpb249MjA0OHxkdXJhdGlvbl90aW1lPTAuMDQwMDAwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIzMDQwMHxwb3M9Nzk0Mzc3fGZsYWdzPUsKLWZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTF8a2V5X2ZyYW1lPTF8cGt0X3B0cz02MTQ0fHBrdF9wdHNfdGltZT0wLjEyMDAwMHxwa3RfZHRzPTYxNDR8cGt0X2R0c190aW1lPTAuMTIwMDAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD02MTQ0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMTIwMDAwfHBrdF9kdXJhdGlvbj0yMDQ4fHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwfHBrdF9wb3M9Nzk0Mzc3fHBrdF9zaXplPTIzMDQwMHx3aWR0aD0zMjB8aGVpZ2h0PTI0MHxwaXhfZm10PXJnYjI0fHNhbXBsZV9hc3BlY3RfcmF0aW89MToxfHBpY3RfdHlwZT1JfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTB8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wCi1wYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxwdHM9NjE0NHxwdHNfdGltZT0wLjEyMDAwMHxkdHM9NjE0NHxkdHNfdGltZT0wLjEyMDAwMHxkdXJhdGlvbj0yMDQ4fGR1cmF0aW9uX3RpbWU9MC4wNDAwMDB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzAwMDB8cG9zPTEwMjQ4MDF8ZmxhZ3M9SwotZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxrZXlfZnJhbWU9MXxwa3RfcHRzPTYxNDR8cGt0X3B0c190aW1lPTAuMTIwMDAwfHBrdF9kdHM9NjE0NHxwa3RfZHRzX3RpbWU9MC4xMjAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTYxNDR8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4xMjAwMDB8cGt0X2R1cmF0aW9uPTIwNDh8cGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDB8cGt0X3Bvcz0xMDI0ODAxfHBrdF9zaXplPTMwMDAwfHdpZHRoPTEwMHxoZWlnaHQ9MTAwfHBpeF9mbXQ9cmdiMjR8c2FtcGxlX2FzcGVjdF9yYXRpbz0xOjF8cGljdF90eXBlPUl8Y29kZWRfcGljdHVyZV9udW1iZXI9MHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTAKLXN0cmVhbXxpbmRleD0wfGNvZGVjX25hbWU9cGNtX3MxNmxlfHByb2ZpbGU9dW5rbm93bnxjb2RlY190eXBlPWF1ZGlvfGNvZGVjX3RpbWVfYmFzZT0xLzQ0MTAwfGNvZGVjX3RhZ19zdHJpbmc9UFNEWzE2XXxjb2RlY190YWc9MHgxMDQ0NTM1MHxzYW1wbGVfZm10PXMxNnxzYW1wbGVfcmF0ZT00NDEwMHxjaGFubmVscz0xfGNoYW5uZWxfbGF5b3V0PXVua25vd258Yml0c19wZXJfc2FtcGxlPTE2fGlkPU4vQXxyX2ZyYW1lX3JhdGU9MC8wfGF2Z19mcmFtZV9yYXRlPTAvMHx0aW1lX2Jhc2U9MS80NDEwMHxzdGFydF9wdHM9MHxzdGFydF90aW1lPTAuMDAwMDAwfGR1cmF0aW9uX3RzPU4vQXxkdXJhdGlvbj1OL0F8Yml0X3JhdGU9NzA1NjAwfG1heF9iaXRfcmF0ZT1OL0F8Yml0c19wZXJfcmF3X3NhbXBsZT1OL0F8bmJfZnJhbWVzPU4vQXxuYl9yZWFkX2ZyYW1lcz02fG5iX3JlYWRfcGFja2V0cz02fGRpc3Bvc2l0aW9uOmRlZmF1bHQ9MHxkaXNwb3NpdGlvbjpkdWI9MHxkaXNwb3NpdGlvbjpvcmlnaW5hbD0wfGRpc3Bvc2l0aW9uOmNvbW1lbnQ9MHxkaXNwb3NpdGlvbjpseXJpY3M9MHxkaXNwb3NpdGlvbjprYXJhb2tlPTB8ZGlzcG9zaXRpb246Zm9yY2VkPTB8ZGlzcG9zaXRpb246aGVhcmluZ19pbXBhaXJlZD0wfGRpc3Bvc2l0aW9uOnZpc3VhbF9pbXBhaXJlZD0wfGRpc3Bvc2l0aW9uOmNsZWFuX2VmZmVjdHM9MHxkaXNwb3NpdGlvbjphdHRhY2hlZF9waWM9MHx0YWc6RT1tY8KyfHRhZzplbmNvZGVyPUxhdmMgcGNtX3MxNmxlCi1zdHJlYW18aW5kZXg9MXxjb2RlY19uYW1lPXJhd3ZpZGVvfHByb2ZpbGU9dW5rbm93bnxjb2RlY190eXBlPXZpZGVvfGNvZGVjX3RpbWVfYmFzZT0xLzUxMjAwfGNvZGVjX3RhZ19zdHJpbmc9UkdCWzI0XXxjb2RlY190YWc9MHgxODQyNDc1Mnx3aWR0aD0zMjB8aGVpZ2h0PTI0MHxjb2RlZF93aWR0aD0zMjB8Y29kZWRfaGVpZ2h0PTI0MHxoYXNfYl9mcmFtZXM9MHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxkaXNwbGF5X2FzcGVjdF9yYXRpbz00OjN8cGl4X2ZtdD1yZ2IyNHxsZXZlbD0tOTl8Y29sb3JfcmFuZ2U9Ti9BfGNvbG9yX3NwYWNlPXVua25vd258Y29sb3JfdHJhbnNmZXI9dW5rbm93bnxjb2xvcl9wcmltYXJpZXM9dW5rbm93bnxjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWR8dGltZWNvZGU9Ti9BfHJlZnM9MXxpZD1OL0F8cl9mcmFtZV9yYXRlPTI1LzF8YXZnX2ZyYW1lX3JhdGU9MjUvMXx0aW1lX2Jhc2U9MS81MTIwMHxzdGFydF9wdHM9MHxzdGFydF90aW1lPTAuMDAwMDAwfGR1cmF0aW9uX3RzPU4vQXxkdXJhdGlvbj1OL0F8Yml0X3JhdGU9Ti9BfG1heF9iaXRfcmF0ZT1OL0F8Yml0c19wZXJfcmF3X3NhbXBsZT1OL0F8bmJfZnJhbWVzPU4vQXxuYl9yZWFkX2ZyYW1lcz00fG5iX3JlYWRfcGFja2V0cz00fGRpc3Bvc2l0aW9uOmRlZmF1bHQ9MHxkaXNwb3NpdGlvbjpkdWI9MHxkaXNwb3NpdGlvbjpvcmlnaW5hbD0wfGRpc3Bvc2l0aW9uOmNvbW1lbnQ9MHxkaXNwb3NpdGlvbjpseXJpY3M9MHxkaXNwb3NpdGlvbjprYXJhb2tlPTB8ZGlzcG9zaXRpb246Zm9yY2VkPTB8ZGlzcG9zaXRpb246aGVhcmluZ19pbXBhaXJlZD0wfGRpc3Bvc2l0aW9uOnZpc3VhbF9pbXBhaXJlZD0wfGRpc3Bvc2l0aW9uOmNsZWFuX2VmZmVjdHM9MHxkaXNwb3NpdGlvbjphdHRhY2hlZF9waWM9MHx0YWc6dGl0bGU9Zm9vYmFyfHRhZzpkdXJhdGlvbl90cz1maWVsZC1hbmQtdGFncy1jb25mbGljdC1hdHRlbXB0fHRhZzplbmNvZGVyPUxhdmMgcmF3dmlkZW8KLXN0cmVhbXxpbmRleD0yfGNvZGVjX25hbWU9cmF3dmlkZW98cHJvZmlsZT11bmtub3dufGNvZGVjX3R5cGU9dmlkZW98Y29kZWNfdGltZV9iYXNlPTEvNTEyMDB8Y29kZWNfdGFnX3N0cmluZz1SR0JbMjRdfGNvZGVjX3RhZz0weDE4NDI0NzUyfHdpZHRoPTEwMHxoZWlnaHQ9MTAwfGNvZGVkX3dpZHRoPTEwMHxjb2RlZF9oZWlnaHQ9MTAwfGhhc19iX2ZyYW1lcz0wfHNhbXBsZV9hc3BlY3RfcmF0aW89MToxfGRpc3BsYXlfYXNwZWN0X3JhdGlvPTE6MXxwaXhfZm10PXJnYjI0fGxldmVsPS05OXxjb2xvcl9yYW5nZT1OL0F8Y29sb3Jfc3BhY2U9dW5rbm93bnxjb2xvcl90cmFuc2Zlcj11bmtub3dufGNvbG9yX3ByaW1hcmllcz11bmtub3dufGNocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZHx0aW1lY29kZT1OL0F8cmVmcz0xfGlkPU4vQXxyX2ZyYW1lX3JhdGU9MjUvMXxhdmdfZnJhbWVfcmF0ZT0yNS8xfHRpbWVfYmFzZT0xLzUxMjAwfHN0YXJ0X3B0cz0wfHN0YXJ0X3RpbWU9MC4wMDAwMDB8ZHVyYXRpb25fdHM9Ti9BfGR1cmF0aW9uPU4vQXxiaXRfcmF0ZT1OL0F8bWF4X2JpdF9yYXRlPU4vQXxiaXRzX3Blcl9yYXdfc2FtcGxlPU4vQXxuYl9mcmFtZXM9Ti9BfG5iX3JlYWRfZnJhbWVzPTR8bmJfcmVhZF9wYWNrZXRzPTR8ZGlzcG9zaXRpb246ZGVmYXVsdD0wfGRpc3Bvc2l0aW9uOmR1Yj0wfGRpc3Bvc2l0aW9uOm9yaWdpbmFsPTB8ZGlzcG9zaXRpb246Y29tbWVudD0wfGRpc3Bvc2l0aW9uOmx5cmljcz0wfGRpc3Bvc2l0aW9uOmthcmFva2U9MHxkaXNwb3NpdGlvbjpmb3JjZWQ9MHxkaXNwb3NpdGlvbjpoZWFyaW5nX2ltcGFpcmVkPTB8ZGlzcG9zaXRpb246dmlzdWFsX2ltcGFpcmVkPTB8ZGlzcG9zaXRpb246Y2xlYW5fZWZmZWN0cz0wfGRpc3Bvc2l0aW9uOmF0dGFjaGVkX3BpYz0wfHRhZzplbmNvZGVyPUxhdmMgcmF3dmlkZW8KLWZvcm1hdHxmaWxlbmFtZT10ZXN0cy9kYXRhL2ZmcHJvYmUtdGVzdC5udXR8bmJfc3RyZWFtcz0zfG5iX3Byb2dyYW1zPTB8Zm9ybWF0X25hbWU9bnV0fHN0YXJ0X3RpbWU9MC4wMDAwMDB8ZHVyYXRpb249MC4xMjAwMDB8c2l6ZT0xMDU0ODgyfGJpdF9yYXRlPTcwMzI1NDY2fHByb2JlX3Njb3JlPTEwMHx0YWc6dGl0bGU9ZmZwcm9iZSB0ZXN0IGZpbGV8dGFnOmNvbW1lbnQ9J0EgY29tbWVudCB3aXRoIENTViwgWE1MICYgSlNPTiBzcGVjaWFsIGNoYXJzJzogPHRhZyB2YWx1ZT0ieCI+fHRhZzpjb21tZW50Mj1JIOKZpSDDnMOxw67Dp8O4ZOKCrAorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTB8cHRzX3RpbWU9MC4wMDAwMDB8ZHRzPTB8ZHRzX3RpbWU9MC4wMDAwMDB8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNDh8cG9zPTY0N3xmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTB8cGt0X3B0c190aW1lPTAuMDAwMDAwfHBrdF9kdHM9MHxwa3RfZHRzX3RpbWU9MC4wMDAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTB8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wMDAwMDB8cGt0X2R1cmF0aW9uPTEwMjR8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMjMyMjB8cGt0X3Bvcz02NDd8cGt0X3NpemU9MjA0OHxzYW1wbGVfZm10PXMxNnxuYl9zYW1wbGVzPTEwMjR8Y2hhbm5lbHM9MXxjaGFubmVsX2xheW91dD11bmtub3duCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MXxwdHM9MHxwdHNfdGltZT0wLjAwMDAwMHxkdHM9MHxkdHNfdGltZT0wLjAwMDAwMHxkdXJhdGlvbj0yMDQ4fGR1cmF0aW9uX3RpbWU9MC4wNDAwMDB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjMwNDAwfHBvcz0yNzIyfGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0xfGtleV9mcmFtZT0xfHBrdF9wdHM9MHxwa3RfcHRzX3RpbWU9MC4wMDAwMDB8cGt0X2R0cz0wfHBrdF9kdHNfdGltZT0wLjAwMDAwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjAwMDAwMHxwa3RfZHVyYXRpb249MjA0OHxwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMHxwa3RfcG9zPTI3MjJ8cGt0X3NpemU9MjMwNDAwfHdpZHRoPTMyMHxoZWlnaHQ9MjQwfHBpeF9mbXQ9cmdiMjR8c2FtcGxlX2FzcGVjdF9yYXRpbz0xOjF8cGljdF90eXBlPUl8Y29kZWRfcGljdHVyZV9udW1iZXI9MHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dW5rbm93bnxjb2xvcl9zcGFjZT11bmtub3dufGNvbG9yX3ByaW1hcmllcz11bmtub3dufGNvbG9yX3RyYW5zZmVyPXVua25vd258Y2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxwdHM9MHxwdHNfdGltZT0wLjAwMDAwMHxkdHM9MHxkdHNfdGltZT0wLjAwMDAwMHxkdXJhdGlvbj0yMDQ4fGR1cmF0aW9uX3RpbWU9MC4wNDAwMDB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzAwMDB8cG9zPTIzMzE0M3xmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxrZXlfZnJhbWU9MXxwa3RfcHRzPTB8cGt0X3B0c190aW1lPTAuMDAwMDAwfHBrdF9kdHM9MHxwa3RfZHRzX3RpbWU9MC4wMDAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTB8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wMDAwMDB8cGt0X2R1cmF0aW9uPTIwNDh8cGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDB8cGt0X3Bvcz0yMzMxNDN8cGt0X3NpemU9MzAwMDB8d2lkdGg9MTAwfGhlaWdodD0xMDB8cGl4X2ZtdD1yZ2IyNHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT11bmtub3dufGNvbG9yX3NwYWNlPXVua25vd258Y29sb3JfcHJpbWFyaWVzPXVua25vd258Y29sb3JfdHJhbnNmZXI9dW5rbm93bnxjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDI0fHB0c190aW1lPTAuMDIzMjIwfGR0cz0xMDI0fGR0c190aW1lPTAuMDIzMjIwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDQ4fHBvcz0yNjMxNDh8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz0xMDI0fHBrdF9wdHNfdGltZT0wLjAyMzIyMHxwa3RfZHRzPTEwMjR8cGt0X2R0c190aW1lPTAuMDIzMjIwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMDI0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDIzMjIwfHBrdF9kdXJhdGlvbj0xMDI0fHBrdF9kdXJhdGlvbl90aW1lPTAuMDIzMjIwfHBrdF9wb3M9MjYzMTQ4fHBrdF9zaXplPTIwNDh8c2FtcGxlX2ZtdD1zMTZ8bmJfc2FtcGxlcz0xMDI0fGNoYW5uZWxzPTF8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTF8cHRzPTIwNDh8cHRzX3RpbWU9MC4wNDAwMDB8ZHRzPTIwNDh8ZHRzX3RpbWU9MC4wNDAwMDB8ZHVyYXRpb249MjA0OHxkdXJhdGlvbl90aW1lPTAuMDQwMDAwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIzMDQwMHxwb3M9MjY1MjI2fGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0xfGtleV9mcmFtZT0xfHBrdF9wdHM9MjA0OHxwa3RfcHRzX3RpbWU9MC4wNDAwMDB8cGt0X2R0cz0yMDQ4fHBrdF9kdHNfdGltZT0wLjA0MDAwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjA0OHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA0MDAwMHxwa3RfZHVyYXRpb249MjA0OHxwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMHxwa3RfcG9zPTI2NTIyNnxwa3Rfc2l6ZT0yMzA0MDB8d2lkdGg9MzIwfGhlaWdodD0yNDB8cGl4X2ZtdD1yZ2IyNHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT11bmtub3dufGNvbG9yX3NwYWNlPXVua25vd258Y29sb3JfcHJpbWFyaWVzPXVua25vd258Y29sb3JfdHJhbnNmZXI9dW5rbm93bnxjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0yfHB0cz0yMDQ4fHB0c190aW1lPTAuMDQwMDAwfGR0cz0yMDQ4fGR0c190aW1lPTAuMDQwMDAwfGR1cmF0aW9uPTIwNDh8ZHVyYXRpb25fdGltZT0wLjA0MDAwMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zMDAwMHxwb3M9NDk1NjUwfGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0yfGtleV9mcmFtZT0xfHBrdF9wdHM9MjA0OHxwa3RfcHRzX3RpbWU9MC4wNDAwMDB8cGt0X2R0cz0yMDQ4fHBrdF9kdHNfdGltZT0wLjA0MDAwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjA0OHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA0MDAwMHxwa3RfZHVyYXRpb249MjA0OHxwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMHxwa3RfcG9zPTQ5NTY1MHxwa3Rfc2l6ZT0zMDAwMHx3aWR0aD0xMDB8aGVpZ2h0PTEwMHxwaXhfZm10PXJnYjI0fHNhbXBsZV9hc3BlY3RfcmF0aW89MToxfHBpY3RfdHlwZT1JfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTB8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXVua25vd258Y29sb3Jfc3BhY2U9dW5rbm93bnxjb2xvcl9wcmltYXJpZXM9dW5rbm93bnxjb2xvcl90cmFuc2Zlcj11bmtub3dufGNocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIwNDh8cHRzX3RpbWU9MC4wNDY0NDB8ZHRzPTIwNDh8ZHRzX3RpbWU9MC4wNDY0NDB8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNDh8cG9zPTUyNTY1NXxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTIwNDh8cGt0X3B0c190aW1lPTAuMDQ2NDQwfHBrdF9kdHM9MjA0OHxwa3RfZHRzX3RpbWU9MC4wNDY0NDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTIwNDh8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wNDY0NDB8cGt0X2R1cmF0aW9uPTEwMjR8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMjMyMjB8cGt0X3Bvcz01MjU2NTV8cGt0X3NpemU9MjA0OHxzYW1wbGVfZm10PXMxNnxuYl9zYW1wbGVzPTEwMjR8Y2hhbm5lbHM9MXxjaGFubmVsX2xheW91dD11bmtub3duCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MzA3MnxwdHNfdGltZT0wLjA2OTY2MHxkdHM9MzA3MnxkdHNfdGltZT0wLjA2OTY2MHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjA0OHxwb3M9NTI3NzI2fGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9MzA3Mnxwa3RfcHRzX3RpbWU9MC4wNjk2NjB8cGt0X2R0cz0zMDcyfHBrdF9kdHNfdGltZT0wLjA2OTY2MHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MzA3MnxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA2OTY2MHxwa3RfZHVyYXRpb249MTAyNHxwa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMHxwa3RfcG9zPTUyNzcyNnxwa3Rfc2l6ZT0yMDQ4fHNhbXBsZV9mbXQ9czE2fG5iX3NhbXBsZXM9MTAyNHxjaGFubmVscz0xfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0xfHB0cz00MDk2fHB0c190aW1lPTAuMDgwMDAwfGR0cz00MDk2fGR0c190aW1lPTAuMDgwMDAwfGR1cmF0aW9uPTIwNDh8ZHVyYXRpb25fdGltZT0wLjA0MDAwMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzA0MDB8cG9zPTUyOTgwNHxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MXxrZXlfZnJhbWU9MXxwa3RfcHRzPTQwOTZ8cGt0X3B0c190aW1lPTAuMDgwMDAwfHBrdF9kdHM9NDA5Nnxwa3RfZHRzX3RpbWU9MC4wODAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTQwOTZ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wODAwMDB8cGt0X2R1cmF0aW9uPTIwNDh8cGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDB8cGt0X3Bvcz01Mjk4MDR8cGt0X3NpemU9MjMwNDAwfHdpZHRoPTMyMHxoZWlnaHQ9MjQwfHBpeF9mbXQ9cmdiMjR8c2FtcGxlX2FzcGVjdF9yYXRpbz0xOjF8cGljdF90eXBlPUl8Y29kZWRfcGljdHVyZV9udW1iZXI9MHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dW5rbm93bnxjb2xvcl9zcGFjZT11bmtub3dufGNvbG9yX3ByaW1hcmllcz11bmtub3dufGNvbG9yX3RyYW5zZmVyPXVua25vd258Y2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxwdHM9NDA5NnxwdHNfdGltZT0wLjA4MDAwMHxkdHM9NDA5NnxkdHNfdGltZT0wLjA4MDAwMHxkdXJhdGlvbj0yMDQ4fGR1cmF0aW9uX3RpbWU9MC4wNDAwMDB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzAwMDB8cG9zPTc2MDIyOHxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxrZXlfZnJhbWU9MXxwa3RfcHRzPTQwOTZ8cGt0X3B0c190aW1lPTAuMDgwMDAwfHBrdF9kdHM9NDA5Nnxwa3RfZHRzX3RpbWU9MC4wODAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTQwOTZ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wODAwMDB8cGt0X2R1cmF0aW9uPTIwNDh8cGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDB8cGt0X3Bvcz03NjAyMjh8cGt0X3NpemU9MzAwMDB8d2lkdGg9MTAwfGhlaWdodD0xMDB8cGl4X2ZtdD1yZ2IyNHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT11bmtub3dufGNvbG9yX3NwYWNlPXVua25vd258Y29sb3JfcHJpbWFyaWVzPXVua25vd258Y29sb3JfdHJhbnNmZXI9dW5rbm93bnxjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz00MDk2fHB0c190aW1lPTAuMDkyODgwfGR0cz00MDk2fGR0c190aW1lPTAuMDkyODgwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDQ4fHBvcz03OTAyMzN8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz00MDk2fHBrdF9wdHNfdGltZT0wLjA5Mjg4MHxwa3RfZHRzPTQwOTZ8cGt0X2R0c190aW1lPTAuMDkyODgwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD00MDk2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDkyODgwfHBrdF9kdXJhdGlvbj0xMDI0fHBrdF9kdXJhdGlvbl90aW1lPTAuMDIzMjIwfHBrdF9wb3M9NzkwMjMzfHBrdF9zaXplPTIwNDh8c2FtcGxlX2ZtdD1zMTZ8bmJfc2FtcGxlcz0xMDI0fGNoYW5uZWxzPTF8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTUxMjB8cHRzX3RpbWU9MC4xMTYxMDB8ZHRzPTUxMjB8ZHRzX3RpbWU9MC4xMTYxMDB8ZHVyYXRpb249MzkzfGR1cmF0aW9uX3RpbWU9MC4wMDg5MTJ8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9Nzg2fHBvcz03OTIzMDR8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz01MTIwfHBrdF9wdHNfdGltZT0wLjExNjEwMHxwa3RfZHRzPTUxMjB8cGt0X2R0c190aW1lPTAuMTE2MTAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD01MTIwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMTE2MTAwfHBrdF9kdXJhdGlvbj0zOTN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMDg5MTJ8cGt0X3Bvcz03OTIzMDR8cGt0X3NpemU9Nzg2fHNhbXBsZV9mbXQ9czE2fG5iX3NhbXBsZXM9MzkzfGNoYW5uZWxzPTF8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTF8cHRzPTYxNDR8cHRzX3RpbWU9MC4xMjAwMDB8ZHRzPTYxNDR8ZHRzX3RpbWU9MC4xMjAwMDB8ZHVyYXRpb249MjA0OHxkdXJhdGlvbl90aW1lPTAuMDQwMDAwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIzMDQwMHxwb3M9NzkzMTIwfGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0xfGtleV9mcmFtZT0xfHBrdF9wdHM9NjE0NHxwa3RfcHRzX3RpbWU9MC4xMjAwMDB8cGt0X2R0cz02MTQ0fHBrdF9kdHNfdGltZT0wLjEyMDAwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9NjE0NHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjEyMDAwMHxwa3RfZHVyYXRpb249MjA0OHxwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMHxwa3RfcG9zPTc5MzEyMHxwa3Rfc2l6ZT0yMzA0MDB8d2lkdGg9MzIwfGhlaWdodD0yNDB8cGl4X2ZtdD1yZ2IyNHxzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT11bmtub3dufGNvbG9yX3NwYWNlPXVua25vd258Y29sb3JfcHJpbWFyaWVzPXVua25vd258Y29sb3JfdHJhbnNmZXI9dW5rbm93bnxjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0yfHB0cz02MTQ0fHB0c190aW1lPTAuMTIwMDAwfGR0cz02MTQ0fGR0c190aW1lPTAuMTIwMDAwfGR1cmF0aW9uPTIwNDh8ZHVyYXRpb25fdGltZT0wLjA0MDAwMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zMDAwMHxwb3M9MTAyMzU0NHxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MnxrZXlfZnJhbWU9MXxwa3RfcHRzPTYxNDR8cGt0X3B0c190aW1lPTAuMTIwMDAwfHBrdF9kdHM9NjE0NHxwa3RfZHRzX3RpbWU9MC4xMjAwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTYxNDR8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4xMjAwMDB8cGt0X2R1cmF0aW9uPTIwNDh8cGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDB8cGt0X3Bvcz0xMDIzNTQ0fHBrdF9zaXplPTMwMDAwfHdpZHRoPTEwMHxoZWlnaHQ9MTAwfHBpeF9mbXQ9cmdiMjR8c2FtcGxlX2FzcGVjdF9yYXRpbz0xOjF8cGljdF90eXBlPUl8Y29kZWRfcGljdHVyZV9udW1iZXI9MHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dW5rbm93bnxjb2xvcl9zcGFjZT11bmtub3dufGNvbG9yX3ByaW1hcmllcz11bmtub3dufGNvbG9yX3RyYW5zZmVyPXVua25vd258Y2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCitzdHJlYW18aW5kZXg9MHxjb2RlY19uYW1lPXBjbV9zMTZsZXxwcm9maWxlPXVua25vd258Y29kZWNfdHlwZT1hdWRpb3xjb2RlY190aW1lX2Jhc2U9MS80NDEwMHxjb2RlY190YWdfc3RyaW5nPVBTRFsxNl18Y29kZWNfdGFnPTB4MTA0NDUzNTB8c2FtcGxlX2ZtdD1zMTZ8c2FtcGxlX3JhdGU9NDQxMDB8Y2hhbm5lbHM9MXxjaGFubmVsX2xheW91dD11bmtub3dufGJpdHNfcGVyX3NhbXBsZT0xNnxpZD1OL0F8cl9mcmFtZV9yYXRlPTAvMHxhdmdfZnJhbWVfcmF0ZT0wLzB8dGltZV9iYXNlPTEvNDQxMDB8c3RhcnRfcHRzPTB8c3RhcnRfdGltZT0wLjAwMDAwMHxkdXJhdGlvbl90cz1OL0F8ZHVyYXRpb249Ti9BfGJpdF9yYXRlPTcwNTYwMHxtYXhfYml0X3JhdGU9Ti9BfGJpdHNfcGVyX3Jhd19zYW1wbGU9Ti9BfG5iX2ZyYW1lcz1OL0F8bmJfcmVhZF9mcmFtZXM9NnxuYl9yZWFkX3BhY2tldHM9NnxkaXNwb3NpdGlvbjpkZWZhdWx0PTB8ZGlzcG9zaXRpb246ZHViPTB8ZGlzcG9zaXRpb246b3JpZ2luYWw9MHxkaXNwb3NpdGlvbjpjb21tZW50PTB8ZGlzcG9zaXRpb246bHlyaWNzPTB8ZGlzcG9zaXRpb246a2FyYW9rZT0wfGRpc3Bvc2l0aW9uOmZvcmNlZD0wfGRpc3Bvc2l0aW9uOmhlYXJpbmdfaW1wYWlyZWQ9MHxkaXNwb3NpdGlvbjp2aXN1YWxfaW1wYWlyZWQ9MHxkaXNwb3NpdGlvbjpjbGVhbl9lZmZlY3RzPTB8ZGlzcG9zaXRpb246YXR0YWNoZWRfcGljPTB8ZGlzcG9zaXRpb246dGltZWRfdGh1bWJuYWlscz0wfHRhZzpFPW1jwrJ8dGFnOmVuY29kZXI9TGF2YyBwY21fczE2bGUKK3N0cmVhbXxpbmRleD0xfGNvZGVjX25hbWU9cmF3dmlkZW98cHJvZmlsZT11bmtub3dufGNvZGVjX3R5cGU9dmlkZW98Y29kZWNfdGltZV9iYXNlPTEvMjV8Y29kZWNfdGFnX3N0cmluZz1SR0JbMjRdfGNvZGVjX3RhZz0weDE4NDI0NzUyfHdpZHRoPTMyMHxoZWlnaHQ9MjQwfGNvZGVkX3dpZHRoPTMyMHxjb2RlZF9oZWlnaHQ9MjQwfGhhc19iX2ZyYW1lcz0wfHNhbXBsZV9hc3BlY3RfcmF0aW89MToxfGRpc3BsYXlfYXNwZWN0X3JhdGlvPTQ6M3xwaXhfZm10PXJnYjI0fGxldmVsPS05OXxjb2xvcl9yYW5nZT11bmtub3dufGNvbG9yX3NwYWNlPXVua25vd258Y29sb3JfdHJhbnNmZXI9dW5rbm93bnxjb2xvcl9wcmltYXJpZXM9dW5rbm93bnxjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWR8ZmllbGRfb3JkZXI9dW5rbm93bnx0aW1lY29kZT1OL0F8cmVmcz0xfGlkPU4vQXxyX2ZyYW1lX3JhdGU9MjUvMXxhdmdfZnJhbWVfcmF0ZT0yNS8xfHRpbWVfYmFzZT0xLzUxMjAwfHN0YXJ0X3B0cz0wfHN0YXJ0X3RpbWU9MC4wMDAwMDB8ZHVyYXRpb25fdHM9Ti9BfGR1cmF0aW9uPU4vQXxiaXRfcmF0ZT1OL0F8bWF4X2JpdF9yYXRlPU4vQXxiaXRzX3Blcl9yYXdfc2FtcGxlPU4vQXxuYl9mcmFtZXM9Ti9BfG5iX3JlYWRfZnJhbWVzPTR8bmJfcmVhZF9wYWNrZXRzPTR8ZGlzcG9zaXRpb246ZGVmYXVsdD0wfGRpc3Bvc2l0aW9uOmR1Yj0wfGRpc3Bvc2l0aW9uOm9yaWdpbmFsPTB8ZGlzcG9zaXRpb246Y29tbWVudD0wfGRpc3Bvc2l0aW9uOmx5cmljcz0wfGRpc3Bvc2l0aW9uOmthcmFva2U9MHxkaXNwb3NpdGlvbjpmb3JjZWQ9MHxkaXNwb3NpdGlvbjpoZWFyaW5nX2ltcGFpcmVkPTB8ZGlzcG9zaXRpb246dmlzdWFsX2ltcGFpcmVkPTB8ZGlzcG9zaXRpb246Y2xlYW5fZWZmZWN0cz0wfGRpc3Bvc2l0aW9uOmF0dGFjaGVkX3BpYz0wfGRpc3Bvc2l0aW9uOnRpbWVkX3RodW1ibmFpbHM9MHx0YWc6dGl0bGU9Zm9vYmFyfHRhZzpkdXJhdGlvbl90cz1maWVsZC1hbmQtdGFncy1jb25mbGljdC1hdHRlbXB0fHRhZzplbmNvZGVyPUxhdmMgcmF3dmlkZW8KK3N0cmVhbXxpbmRleD0yfGNvZGVjX25hbWU9cmF3dmlkZW98cHJvZmlsZT11bmtub3dufGNvZGVjX3R5cGU9dmlkZW98Y29kZWNfdGltZV9iYXNlPTEvMjV8Y29kZWNfdGFnX3N0cmluZz1SR0JbMjRdfGNvZGVjX3RhZz0weDE4NDI0NzUyfHdpZHRoPTEwMHxoZWlnaHQ9MTAwfGNvZGVkX3dpZHRoPTEwMHxjb2RlZF9oZWlnaHQ9MTAwfGhhc19iX2ZyYW1lcz0wfHNhbXBsZV9hc3BlY3RfcmF0aW89MToxfGRpc3BsYXlfYXNwZWN0X3JhdGlvPTE6MXxwaXhfZm10PXJnYjI0fGxldmVsPS05OXxjb2xvcl9yYW5nZT11bmtub3dufGNvbG9yX3NwYWNlPXVua25vd258Y29sb3JfdHJhbnNmZXI9dW5rbm93bnxjb2xvcl9wcmltYXJpZXM9dW5rbm93bnxjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWR8ZmllbGRfb3JkZXI9dW5rbm93bnx0aW1lY29kZT1OL0F8cmVmcz0xfGlkPU4vQXxyX2ZyYW1lX3JhdGU9MjUvMXxhdmdfZnJhbWVfcmF0ZT0yNS8xfHRpbWVfYmFzZT0xLzUxMjAwfHN0YXJ0X3B0cz0wfHN0YXJ0X3RpbWU9MC4wMDAwMDB8ZHVyYXRpb25fdHM9Ti9BfGR1cmF0aW9uPU4vQXxiaXRfcmF0ZT1OL0F8bWF4X2JpdF9yYXRlPU4vQXxiaXRzX3Blcl9yYXdfc2FtcGxlPU4vQXxuYl9mcmFtZXM9Ti9BfG5iX3JlYWRfZnJhbWVzPTR8bmJfcmVhZF9wYWNrZXRzPTR8ZGlzcG9zaXRpb246ZGVmYXVsdD0wfGRpc3Bvc2l0aW9uOmR1Yj0wfGRpc3Bvc2l0aW9uOm9yaWdpbmFsPTB8ZGlzcG9zaXRpb246Y29tbWVudD0wfGRpc3Bvc2l0aW9uOmx5cmljcz0wfGRpc3Bvc2l0aW9uOmthcmFva2U9MHxkaXNwb3NpdGlvbjpmb3JjZWQ9MHxkaXNwb3NpdGlvbjpoZWFyaW5nX2ltcGFpcmVkPTB8ZGlzcG9zaXRpb246dmlzdWFsX2ltcGFpcmVkPTB8ZGlzcG9zaXRpb246Y2xlYW5fZWZmZWN0cz0wfGRpc3Bvc2l0aW9uOmF0dGFjaGVkX3BpYz0wfGRpc3Bvc2l0aW9uOnRpbWVkX3RodW1ibmFpbHM9MHx0YWc6ZW5jb2Rlcj1MYXZjIHJhd3ZpZGVvCitmb3JtYXR8ZmlsZW5hbWU9dGVzdHMvZGF0YS9mZnByb2JlLXRlc3QubnV0fG5iX3N0cmVhbXM9M3xuYl9wcm9ncmFtcz0wfGZvcm1hdF9uYW1lPW51dHxzdGFydF90aW1lPTAuMDAwMDAwfGR1cmF0aW9uPTAuMTIwMDAwfHNpemU9MTA1MzYyNHxiaXRfcmF0ZT03MDI0MTYwMHxwcm9iZV9zY29yZT0xMDB8dGFnOnRpdGxlPWZmcHJvYmUgdGVzdCBmaWxlfHRhZzpjb21tZW50PSdBIGNvbW1lbnQgd2l0aCBDU1YsIFhNTCAmIEpTT04gc3BlY2lhbCBjaGFycyc6IDx0YWcgdmFsdWU9IngiPnx0YWc6Y29tbWVudDI9SSDimaUgw5zDscOuw6fDuGTigqwKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZmcHJvYmVfY3N2IGIvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9jc3YKaW5kZXggOTE4NmViYS4uZGZiZWI0MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9jc3YKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9jc3YKQEAgLTEsMzIgKzEsMzIgQEAKLXBhY2tldCxhdWRpbywwLDAsMC4wMDAwMDAsMCwwLjAwMDAwMCwxMDI0LDAuMDIzMjIwLE4vQSxOL0EsMjA0OCw2NDIsSwotZnJhbWUsYXVkaW8sMCwxLDAsMC4wMDAwMDAsMCwwLjAwMDAwMCwwLDAuMDAwMDAwLDEwMjQsMC4wMjMyMjAsNjQyLDIwNDgsczE2LDEwMjQsMSx1bmtub3duCi1wYWNrZXQsdmlkZW8sMSwwLDAuMDAwMDAwLDAsMC4wMDAwMDAsMjA0OCwwLjA0MDAwMCxOL0EsTi9BLDIzMDQwMCwyNzE3LEsKLWZyYW1lLHZpZGVvLDEsMSwwLDAuMDAwMDAwLDAsMC4wMDAwMDAsMCwwLjAwMDAwMCwyMDQ4LDAuMDQwMDAwLDI3MTcsMjMwNDAwLDMyMCwyNDAscmdiMjQsMToxLEksMCwwLDAsMCwwCi1wYWNrZXQsdmlkZW8sMiwwLDAuMDAwMDAwLDAsMC4wMDAwMDAsMjA0OCwwLjA0MDAwMCxOL0EsTi9BLDMwMDAwLDIzMzEzOCxLCi1mcmFtZSx2aWRlbywyLDEsMCwwLjAwMDAwMCwwLDAuMDAwMDAwLDAsMC4wMDAwMDAsMjA0OCwwLjA0MDAwMCwyMzMxMzgsMzAwMDAsMTAwLDEwMCxyZ2IyNCwxOjEsSSwwLDAsMCwwLDAKLXBhY2tldCxhdWRpbywwLDEwMjQsMC4wMjMyMjAsMTAyNCwwLjAyMzIyMCwxMDI0LDAuMDIzMjIwLE4vQSxOL0EsMjA0OCwyNjMxNDMsSwotZnJhbWUsYXVkaW8sMCwxLDEwMjQsMC4wMjMyMjAsMTAyNCwwLjAyMzIyMCwxMDI0LDAuMDIzMjIwLDEwMjQsMC4wMjMyMjAsMjYzMTQzLDIwNDgsczE2LDEwMjQsMSx1bmtub3duCi1wYWNrZXQsdmlkZW8sMSwyMDQ4LDAuMDQwMDAwLDIwNDgsMC4wNDAwMDAsMjA0OCwwLjA0MDAwMCxOL0EsTi9BLDIzMDQwMCwyNjUyMjEsSwotZnJhbWUsdmlkZW8sMSwxLDIwNDgsMC4wNDAwMDAsMjA0OCwwLjA0MDAwMCwyMDQ4LDAuMDQwMDAwLDIwNDgsMC4wNDAwMDAsMjY1MjIxLDIzMDQwMCwzMjAsMjQwLHJnYjI0LDE6MSxJLDAsMCwwLDAsMAotcGFja2V0LHZpZGVvLDIsMjA0OCwwLjA0MDAwMCwyMDQ4LDAuMDQwMDAwLDIwNDgsMC4wNDAwMDAsTi9BLE4vQSwzMDAwMCw0OTU2NDUsSwotZnJhbWUsdmlkZW8sMiwxLDIwNDgsMC4wNDAwMDAsMjA0OCwwLjA0MDAwMCwyMDQ4LDAuMDQwMDAwLDIwNDgsMC4wNDAwMDAsNDk1NjQ1LDMwMDAwLDEwMCwxMDAscmdiMjQsMToxLEksMCwwLDAsMCwwCi1wYWNrZXQsYXVkaW8sMCwyMDQ4LDAuMDQ2NDQwLDIwNDgsMC4wNDY0NDAsMTAyNCwwLjAyMzIyMCxOL0EsTi9BLDIwNDgsNTI1NjUwLEsKLWZyYW1lLGF1ZGlvLDAsMSwyMDQ4LDAuMDQ2NDQwLDIwNDgsMC4wNDY0NDAsMjA0OCwwLjA0NjQ0MCwxMDI0LDAuMDIzMjIwLDUyNTY1MCwyMDQ4LHMxNiwxMDI0LDEsdW5rbm93bgotcGFja2V0LGF1ZGlvLDAsMzA3MiwwLjA2OTY2MCwzMDcyLDAuMDY5NjYwLDEwMjQsMC4wMjMyMjAsTi9BLE4vQSwyMDQ4LDUyNzcyMSxLCi1mcmFtZSxhdWRpbywwLDEsMzA3MiwwLjA2OTY2MCwzMDcyLDAuMDY5NjYwLDMwNzIsMC4wNjk2NjAsMTAyNCwwLjAyMzIyMCw1Mjc3MjEsMjA0OCxzMTYsMTAyNCwxLHVua25vd24KLXBhY2tldCx2aWRlbywxLDQwOTYsMC4wODAwMDAsNDA5NiwwLjA4MDAwMCwyMDQ4LDAuMDQwMDAwLE4vQSxOL0EsMjMwNDAwLDUyOTc5OSxLCi1mcmFtZSx2aWRlbywxLDEsNDA5NiwwLjA4MDAwMCw0MDk2LDAuMDgwMDAwLDQwOTYsMC4wODAwMDAsMjA0OCwwLjA0MDAwMCw1Mjk3OTksMjMwNDAwLDMyMCwyNDAscmdiMjQsMToxLEksMCwwLDAsMCwwCi1wYWNrZXQsdmlkZW8sMiw0MDk2LDAuMDgwMDAwLDQwOTYsMC4wODAwMDAsMjA0OCwwLjA0MDAwMCxOL0EsTi9BLDMwMDAwLDc2MDIyMyxLCi1mcmFtZSx2aWRlbywyLDEsNDA5NiwwLjA4MDAwMCw0MDk2LDAuMDgwMDAwLDQwOTYsMC4wODAwMDAsMjA0OCwwLjA0MDAwMCw3NjAyMjMsMzAwMDAsMTAwLDEwMCxyZ2IyNCwxOjEsSSwwLDAsMCwwLDAKLXBhY2tldCxhdWRpbywwLDQwOTYsMC4wOTI4ODAsNDA5NiwwLjA5Mjg4MCwxMDI0LDAuMDIzMjIwLE4vQSxOL0EsMjA0OCw3OTAyMjgsSwotZnJhbWUsYXVkaW8sMCwxLDQwOTYsMC4wOTI4ODAsNDA5NiwwLjA5Mjg4MCw0MDk2LDAuMDkyODgwLDEwMjQsMC4wMjMyMjAsNzkwMjI4LDIwNDgsczE2LDEwMjQsMSx1bmtub3duCi1wYWNrZXQsYXVkaW8sMCw1MTIwLDAuMTE2MTAwLDUxMjAsMC4xMTYxMDAsMTAyNCwwLjAyMzIyMCxOL0EsTi9BLDIwNDgsNzkyMjk5LEsKLWZyYW1lLGF1ZGlvLDAsMSw1MTIwLDAuMTE2MTAwLDUxMjAsMC4xMTYxMDAsNTEyMCwwLjExNjEwMCwxMDI0LDAuMDIzMjIwLDc5MjI5OSwyMDQ4LHMxNiwxMDI0LDEsdW5rbm93bgotcGFja2V0LHZpZGVvLDEsNjE0NCwwLjEyMDAwMCw2MTQ0LDAuMTIwMDAwLDIwNDgsMC4wNDAwMDAsTi9BLE4vQSwyMzA0MDAsNzk0Mzc3LEsKLWZyYW1lLHZpZGVvLDEsMSw2MTQ0LDAuMTIwMDAwLDYxNDQsMC4xMjAwMDAsNjE0NCwwLjEyMDAwMCwyMDQ4LDAuMDQwMDAwLDc5NDM3NywyMzA0MDAsMzIwLDI0MCxyZ2IyNCwxOjEsSSwwLDAsMCwwLDAKLXBhY2tldCx2aWRlbywyLDYxNDQsMC4xMjAwMDAsNjE0NCwwLjEyMDAwMCwyMDQ4LDAuMDQwMDAwLE4vQSxOL0EsMzAwMDAsMTAyNDgwMSxLCi1mcmFtZSx2aWRlbywyLDEsNjE0NCwwLjEyMDAwMCw2MTQ0LDAuMTIwMDAwLDYxNDQsMC4xMjAwMDAsMjA0OCwwLjA0MDAwMCwxMDI0ODAxLDMwMDAwLDEwMCwxMDAscmdiMjQsMToxLEksMCwwLDAsMCwwCi1zdHJlYW0sMCxwY21fczE2bGUsdW5rbm93bixhdWRpbywxLzQ0MTAwLFBTRFsxNl0sMHgxMDQ0NTM1MCxzMTYsNDQxMDAsMSx1bmtub3duLDE2LE4vQSwwLzAsMC8wLDEvNDQxMDAsMCwwLjAwMDAwMCxOL0EsTi9BLDcwNTYwMCxOL0EsTi9BLE4vQSw2LDYsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLG1jwrIsTGF2YyBwY21fczE2bGUKLXN0cmVhbSwxLHJhd3ZpZGVvLHVua25vd24sdmlkZW8sMS81MTIwMCxSR0JbMjRdLDB4MTg0MjQ3NTIsMzIwLDI0MCwzMjAsMjQwLDAsMToxLDQ6MyxyZ2IyNCwtOTksTi9BLHVua25vd24sdW5rbm93bix1bmtub3duLHVuc3BlY2lmaWVkLE4vQSwxLE4vQSwyNS8xLDI1LzEsMS81MTIwMCwwLDAuMDAwMDAwLE4vQSxOL0EsTi9BLE4vQSxOL0EsTi9BLDQsNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsZm9vYmFyLGZpZWxkLWFuZC10YWdzLWNvbmZsaWN0LWF0dGVtcHQsTGF2YyByYXd2aWRlbwotc3RyZWFtLDIscmF3dmlkZW8sdW5rbm93bix2aWRlbywxLzUxMjAwLFJHQlsyNF0sMHgxODQyNDc1MiwxMDAsMTAwLDEwMCwxMDAsMCwxOjEsMToxLHJnYjI0LC05OSxOL0EsdW5rbm93bix1bmtub3duLHVua25vd24sdW5zcGVjaWZpZWQsTi9BLDEsTi9BLDI1LzEsMjUvMSwxLzUxMjAwLDAsMC4wMDAwMDAsTi9BLE4vQSxOL0EsTi9BLE4vQSxOL0EsNCw0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCxMYXZjIHJhd3ZpZGVvCi1mb3JtYXQsdGVzdHMvZGF0YS9mZnByb2JlLXRlc3QubnV0LDMsMCxudXQsMC4wMDAwMDAsMC4xMjAwMDAsMTA1NDg4Miw3MDMyNTQ2NiwxMDAsZmZwcm9iZSB0ZXN0IGZpbGUsIidBIGNvbW1lbnQgd2l0aCBDU1YsIFhNTCAmIEpTT04gc3BlY2lhbCBjaGFycyc6IDx0YWcgdmFsdWU9IiJ4IiI+IixJIOKZpSDDnMOxw67Dp8O4ZOKCrAorcGFja2V0LGF1ZGlvLDAsMCwwLjAwMDAwMCwwLDAuMDAwMDAwLDEwMjQsMC4wMjMyMjAsTi9BLE4vQSwyMDQ4LDY0NyxLXworZnJhbWUsYXVkaW8sMCwxLDAsMC4wMDAwMDAsMCwwLjAwMDAwMCwwLDAuMDAwMDAwLDEwMjQsMC4wMjMyMjAsNjQ3LDIwNDgsczE2LDEwMjQsMSx1bmtub3duCitwYWNrZXQsdmlkZW8sMSwwLDAuMDAwMDAwLDAsMC4wMDAwMDAsMjA0OCwwLjA0MDAwMCxOL0EsTi9BLDIzMDQwMCwyNzIyLEtfCitmcmFtZSx2aWRlbywxLDEsMCwwLjAwMDAwMCwwLDAuMDAwMDAwLDAsMC4wMDAwMDAsMjA0OCwwLjA0MDAwMCwyNzIyLDIzMDQwMCwzMjAsMjQwLHJnYjI0LDE6MSxJLDAsMCwwLDAsMCx1bmtub3duLHVua25vd24sdW5rbm93bix1bmtub3duLHVuc3BlY2lmaWVkCitwYWNrZXQsdmlkZW8sMiwwLDAuMDAwMDAwLDAsMC4wMDAwMDAsMjA0OCwwLjA0MDAwMCxOL0EsTi9BLDMwMDAwLDIzMzE0MyxLXworZnJhbWUsdmlkZW8sMiwxLDAsMC4wMDAwMDAsMCwwLjAwMDAwMCwwLDAuMDAwMDAwLDIwNDgsMC4wNDAwMDAsMjMzMTQzLDMwMDAwLDEwMCwxMDAscmdiMjQsMToxLEksMCwwLDAsMCwwLHVua25vd24sdW5rbm93bix1bmtub3duLHVua25vd24sdW5zcGVjaWZpZWQKK3BhY2tldCxhdWRpbywwLDEwMjQsMC4wMjMyMjAsMTAyNCwwLjAyMzIyMCwxMDI0LDAuMDIzMjIwLE4vQSxOL0EsMjA0OCwyNjMxNDgsS18KK2ZyYW1lLGF1ZGlvLDAsMSwxMDI0LDAuMDIzMjIwLDEwMjQsMC4wMjMyMjAsMTAyNCwwLjAyMzIyMCwxMDI0LDAuMDIzMjIwLDI2MzE0OCwyMDQ4LHMxNiwxMDI0LDEsdW5rbm93bgorcGFja2V0LHZpZGVvLDEsMjA0OCwwLjA0MDAwMCwyMDQ4LDAuMDQwMDAwLDIwNDgsMC4wNDAwMDAsTi9BLE4vQSwyMzA0MDAsMjY1MjI2LEtfCitmcmFtZSx2aWRlbywxLDEsMjA0OCwwLjA0MDAwMCwyMDQ4LDAuMDQwMDAwLDIwNDgsMC4wNDAwMDAsMjA0OCwwLjA0MDAwMCwyNjUyMjYsMjMwNDAwLDMyMCwyNDAscmdiMjQsMToxLEksMCwwLDAsMCwwLHVua25vd24sdW5rbm93bix1bmtub3duLHVua25vd24sdW5zcGVjaWZpZWQKK3BhY2tldCx2aWRlbywyLDIwNDgsMC4wNDAwMDAsMjA0OCwwLjA0MDAwMCwyMDQ4LDAuMDQwMDAwLE4vQSxOL0EsMzAwMDAsNDk1NjUwLEtfCitmcmFtZSx2aWRlbywyLDEsMjA0OCwwLjA0MDAwMCwyMDQ4LDAuMDQwMDAwLDIwNDgsMC4wNDAwMDAsMjA0OCwwLjA0MDAwMCw0OTU2NTAsMzAwMDAsMTAwLDEwMCxyZ2IyNCwxOjEsSSwwLDAsMCwwLDAsdW5rbm93bix1bmtub3duLHVua25vd24sdW5rbm93bix1bnNwZWNpZmllZAorcGFja2V0LGF1ZGlvLDAsMjA0OCwwLjA0NjQ0MCwyMDQ4LDAuMDQ2NDQwLDEwMjQsMC4wMjMyMjAsTi9BLE4vQSwyMDQ4LDUyNTY1NSxLXworZnJhbWUsYXVkaW8sMCwxLDIwNDgsMC4wNDY0NDAsMjA0OCwwLjA0NjQ0MCwyMDQ4LDAuMDQ2NDQwLDEwMjQsMC4wMjMyMjAsNTI1NjU1LDIwNDgsczE2LDEwMjQsMSx1bmtub3duCitwYWNrZXQsYXVkaW8sMCwzMDcyLDAuMDY5NjYwLDMwNzIsMC4wNjk2NjAsMTAyNCwwLjAyMzIyMCxOL0EsTi9BLDIwNDgsNTI3NzI2LEtfCitmcmFtZSxhdWRpbywwLDEsMzA3MiwwLjA2OTY2MCwzMDcyLDAuMDY5NjYwLDMwNzIsMC4wNjk2NjAsMTAyNCwwLjAyMzIyMCw1Mjc3MjYsMjA0OCxzMTYsMTAyNCwxLHVua25vd24KK3BhY2tldCx2aWRlbywxLDQwOTYsMC4wODAwMDAsNDA5NiwwLjA4MDAwMCwyMDQ4LDAuMDQwMDAwLE4vQSxOL0EsMjMwNDAwLDUyOTgwNCxLXworZnJhbWUsdmlkZW8sMSwxLDQwOTYsMC4wODAwMDAsNDA5NiwwLjA4MDAwMCw0MDk2LDAuMDgwMDAwLDIwNDgsMC4wNDAwMDAsNTI5ODA0LDIzMDQwMCwzMjAsMjQwLHJnYjI0LDE6MSxJLDAsMCwwLDAsMCx1bmtub3duLHVua25vd24sdW5rbm93bix1bmtub3duLHVuc3BlY2lmaWVkCitwYWNrZXQsdmlkZW8sMiw0MDk2LDAuMDgwMDAwLDQwOTYsMC4wODAwMDAsMjA0OCwwLjA0MDAwMCxOL0EsTi9BLDMwMDAwLDc2MDIyOCxLXworZnJhbWUsdmlkZW8sMiwxLDQwOTYsMC4wODAwMDAsNDA5NiwwLjA4MDAwMCw0MDk2LDAuMDgwMDAwLDIwNDgsMC4wNDAwMDAsNzYwMjI4LDMwMDAwLDEwMCwxMDAscmdiMjQsMToxLEksMCwwLDAsMCwwLHVua25vd24sdW5rbm93bix1bmtub3duLHVua25vd24sdW5zcGVjaWZpZWQKK3BhY2tldCxhdWRpbywwLDQwOTYsMC4wOTI4ODAsNDA5NiwwLjA5Mjg4MCwxMDI0LDAuMDIzMjIwLE4vQSxOL0EsMjA0OCw3OTAyMzMsS18KK2ZyYW1lLGF1ZGlvLDAsMSw0MDk2LDAuMDkyODgwLDQwOTYsMC4wOTI4ODAsNDA5NiwwLjA5Mjg4MCwxMDI0LDAuMDIzMjIwLDc5MDIzMywyMDQ4LHMxNiwxMDI0LDEsdW5rbm93bgorcGFja2V0LGF1ZGlvLDAsNTEyMCwwLjExNjEwMCw1MTIwLDAuMTE2MTAwLDM5MywwLjAwODkxMixOL0EsTi9BLDc4Niw3OTIzMDQsS18KK2ZyYW1lLGF1ZGlvLDAsMSw1MTIwLDAuMTE2MTAwLDUxMjAsMC4xMTYxMDAsNTEyMCwwLjExNjEwMCwzOTMsMC4wMDg5MTIsNzkyMzA0LDc4NixzMTYsMzkzLDEsdW5rbm93bgorcGFja2V0LHZpZGVvLDEsNjE0NCwwLjEyMDAwMCw2MTQ0LDAuMTIwMDAwLDIwNDgsMC4wNDAwMDAsTi9BLE4vQSwyMzA0MDAsNzkzMTIwLEtfCitmcmFtZSx2aWRlbywxLDEsNjE0NCwwLjEyMDAwMCw2MTQ0LDAuMTIwMDAwLDYxNDQsMC4xMjAwMDAsMjA0OCwwLjA0MDAwMCw3OTMxMjAsMjMwNDAwLDMyMCwyNDAscmdiMjQsMToxLEksMCwwLDAsMCwwLHVua25vd24sdW5rbm93bix1bmtub3duLHVua25vd24sdW5zcGVjaWZpZWQKK3BhY2tldCx2aWRlbywyLDYxNDQsMC4xMjAwMDAsNjE0NCwwLjEyMDAwMCwyMDQ4LDAuMDQwMDAwLE4vQSxOL0EsMzAwMDAsMTAyMzU0NCxLXworZnJhbWUsdmlkZW8sMiwxLDYxNDQsMC4xMjAwMDAsNjE0NCwwLjEyMDAwMCw2MTQ0LDAuMTIwMDAwLDIwNDgsMC4wNDAwMDAsMTAyMzU0NCwzMDAwMCwxMDAsMTAwLHJnYjI0LDE6MSxJLDAsMCwwLDAsMCx1bmtub3duLHVua25vd24sdW5rbm93bix1bmtub3duLHVuc3BlY2lmaWVkCitzdHJlYW0sMCxwY21fczE2bGUsdW5rbm93bixhdWRpbywxLzQ0MTAwLFBTRFsxNl0sMHgxMDQ0NTM1MCxzMTYsNDQxMDAsMSx1bmtub3duLDE2LE4vQSwwLzAsMC8wLDEvNDQxMDAsMCwwLjAwMDAwMCxOL0EsTi9BLDcwNTYwMCxOL0EsTi9BLE4vQSw2LDYsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsbWPCsixMYXZjIHBjbV9zMTZsZQorc3RyZWFtLDEscmF3dmlkZW8sdW5rbm93bix2aWRlbywxLzI1LFJHQlsyNF0sMHgxODQyNDc1MiwzMjAsMjQwLDMyMCwyNDAsMCwxOjEsNDozLHJnYjI0LC05OSx1bmtub3duLHVua25vd24sdW5rbm93bix1bmtub3duLHVuc3BlY2lmaWVkLHVua25vd24sTi9BLDEsTi9BLDI1LzEsMjUvMSwxLzUxMjAwLDAsMC4wMDAwMDAsTi9BLE4vQSxOL0EsTi9BLE4vQSxOL0EsNCw0LDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLGZvb2JhcixmaWVsZC1hbmQtdGFncy1jb25mbGljdC1hdHRlbXB0LExhdmMgcmF3dmlkZW8KK3N0cmVhbSwyLHJhd3ZpZGVvLHVua25vd24sdmlkZW8sMS8yNSxSR0JbMjRdLDB4MTg0MjQ3NTIsMTAwLDEwMCwxMDAsMTAwLDAsMToxLDE6MSxyZ2IyNCwtOTksdW5rbm93bix1bmtub3duLHVua25vd24sdW5rbm93bix1bnNwZWNpZmllZCx1bmtub3duLE4vQSwxLE4vQSwyNS8xLDI1LzEsMS81MTIwMCwwLDAuMDAwMDAwLE4vQSxOL0EsTi9BLE4vQSxOL0EsTi9BLDQsNCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCxMYXZjIHJhd3ZpZGVvCitmb3JtYXQsdGVzdHMvZGF0YS9mZnByb2JlLXRlc3QubnV0LDMsMCxudXQsMC4wMDAwMDAsMC4xMjAwMDAsMTA1MzYyNCw3MDI0MTYwMCwxMDAsZmZwcm9iZSB0ZXN0IGZpbGUsIidBIGNvbW1lbnQgd2l0aCBDU1YsIFhNTCAmIEpTT04gc3BlY2lhbCBjaGFycyc6IDx0YWcgdmFsdWU9IiJ4IiI+IixJIOKZpSDDnMOxw67Dp8O4ZOKCrApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9kZWZhdWx0IGIvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9kZWZhdWx0CmluZGV4IGRmOTc3OTYuLjc1NjI4NjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZmcHJvYmVfZGVmYXVsdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2RlZmF1bHQKQEAgLTEwLDggKzEwLDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MjA0OAotcG9zPTY0MgotZmxhZ3M9SworcG9zPTY0NworZmxhZ3M9S18KIFsvUEFDS0VUXQogW0ZSQU1FXQogbWVkaWFfdHlwZT1hdWRpbwpAQCAtMjUsNyArMjUsNyBAQAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wMDAwMDAKIHBrdF9kdXJhdGlvbj0xMDI0CiBwa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMAotcGt0X3Bvcz02NDIKK3BrdF9wb3M9NjQ3CiBwa3Rfc2l6ZT0yMDQ4CiBzYW1wbGVfZm10PXMxNgogbmJfc2FtcGxlcz0xMDI0CkBAIC00NCw4ICs0NCw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTIzMDQwMAotcG9zPTI3MTcKLWZsYWdzPUsKK3Bvcz0yNzIyCitmbGFncz1LXwogWy9QQUNLRVRdCiBbRlJBTUVdCiBtZWRpYV90eXBlPXZpZGVvCkBAIC01OSw3ICs1OSw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjAwMDAwMAogcGt0X2R1cmF0aW9uPTIwNDgKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwCi1wa3RfcG9zPTI3MTcKK3BrdF9wb3M9MjcyMgogcGt0X3NpemU9MjMwNDAwCiB3aWR0aD0zMjAKIGhlaWdodD0yNDAKQEAgLTcxLDYgKzcxLDExIEBACiBpbnRlcmxhY2VkX2ZyYW1lPTAKIHRvcF9maWVsZF9maXJzdD0wCiByZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT11bmtub3duCitjb2xvcl9zcGFjZT11bmtub3duCitjb2xvcl9wcmltYXJpZXM9dW5rbm93bgorY29sb3JfdHJhbnNmZXI9dW5rbm93bgorY2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCiBbL0ZSQU1FXQogW1BBQ0tFVF0KIGNvZGVjX3R5cGU9dmlkZW8KQEAgLTg0LDggKzg5LDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MzAwMDAKLXBvcz0yMzMxMzgKLWZsYWdzPUsKK3Bvcz0yMzMxNDMKK2ZsYWdzPUtfCiBbL1BBQ0tFVF0KIFtGUkFNRV0KIG1lZGlhX3R5cGU9dmlkZW8KQEAgLTk5LDcgKzEwNCw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjAwMDAwMAogcGt0X2R1cmF0aW9uPTIwNDgKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwCi1wa3RfcG9zPTIzMzEzOAorcGt0X3Bvcz0yMzMxNDMKIHBrdF9zaXplPTMwMDAwCiB3aWR0aD0xMDAKIGhlaWdodD0xMDAKQEAgLTExMSw2ICsxMTYsMTEgQEAKIGludGVybGFjZWRfZnJhbWU9MAogdG9wX2ZpZWxkX2ZpcnN0PTAKIHJlcGVhdF9waWN0PTAKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjb2xvcl90cmFuc2Zlcj11bmtub3duCitjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKIFsvRlJBTUVdCiBbUEFDS0VUXQogY29kZWNfdHlwZT1hdWRpbwpAQCAtMTI0LDggKzEzNCw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTIwNDgKLXBvcz0yNjMxNDMKLWZsYWdzPUsKK3Bvcz0yNjMxNDgKK2ZsYWdzPUtfCiBbL1BBQ0tFVF0KIFtGUkFNRV0KIG1lZGlhX3R5cGU9YXVkaW8KQEAgLTEzOSw3ICsxNDksNyBAQAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wMjMyMjAKIHBrdF9kdXJhdGlvbj0xMDI0CiBwa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMAotcGt0X3Bvcz0yNjMxNDMKK3BrdF9wb3M9MjYzMTQ4CiBwa3Rfc2l6ZT0yMDQ4CiBzYW1wbGVfZm10PXMxNgogbmJfc2FtcGxlcz0xMDI0CkBAIC0xNTgsOCArMTY4LDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MjMwNDAwCi1wb3M9MjY1MjIxCi1mbGFncz1LCitwb3M9MjY1MjI2CitmbGFncz1LXwogWy9QQUNLRVRdCiBbRlJBTUVdCiBtZWRpYV90eXBlPXZpZGVvCkBAIC0xNzMsNyArMTgzLDcgQEAKIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDQwMDAwCiBwa3RfZHVyYXRpb249MjA0OAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDAKLXBrdF9wb3M9MjY1MjIxCitwa3RfcG9zPTI2NTIyNgogcGt0X3NpemU9MjMwNDAwCiB3aWR0aD0zMjAKIGhlaWdodD0yNDAKQEAgLTE4NSw2ICsxOTUsMTEgQEAKIGludGVybGFjZWRfZnJhbWU9MAogdG9wX2ZpZWxkX2ZpcnN0PTAKIHJlcGVhdF9waWN0PTAKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjb2xvcl90cmFuc2Zlcj11bmtub3duCitjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKIFsvRlJBTUVdCiBbUEFDS0VUXQogY29kZWNfdHlwZT12aWRlbwpAQCAtMTk4LDggKzIxMyw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTMwMDAwCi1wb3M9NDk1NjQ1Ci1mbGFncz1LCitwb3M9NDk1NjUwCitmbGFncz1LXwogWy9QQUNLRVRdCiBbRlJBTUVdCiBtZWRpYV90eXBlPXZpZGVvCkBAIC0yMTMsNyArMjI4LDcgQEAKIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDQwMDAwCiBwa3RfZHVyYXRpb249MjA0OAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDAKLXBrdF9wb3M9NDk1NjQ1Citwa3RfcG9zPTQ5NTY1MAogcGt0X3NpemU9MzAwMDAKIHdpZHRoPTEwMAogaGVpZ2h0PTEwMApAQCAtMjI1LDYgKzI0MCwxMSBAQAogaW50ZXJsYWNlZF9mcmFtZT0wCiB0b3BfZmllbGRfZmlyc3Q9MAogcmVwZWF0X3BpY3Q9MAorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAogWy9GUkFNRV0KIFtQQUNLRVRdCiBjb2RlY190eXBlPWF1ZGlvCkBAIC0yMzgsOCArMjU4LDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MjA0OAotcG9zPTUyNTY1MAotZmxhZ3M9SworcG9zPTUyNTY1NQorZmxhZ3M9S18KIFsvUEFDS0VUXQogW0ZSQU1FXQogbWVkaWFfdHlwZT1hdWRpbwpAQCAtMjUzLDcgKzI3Myw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA0NjQ0MAogcGt0X2R1cmF0aW9uPTEwMjQKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDIzMjIwCi1wa3RfcG9zPTUyNTY1MAorcGt0X3Bvcz01MjU2NTUKIHBrdF9zaXplPTIwNDgKIHNhbXBsZV9mbXQ9czE2CiBuYl9zYW1wbGVzPTEwMjQKQEAgLTI3Miw4ICsyOTIsOCBAQAogY29udmVyZ2VuY2VfZHVyYXRpb249Ti9BCiBjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQQogc2l6ZT0yMDQ4Ci1wb3M9NTI3NzIxCi1mbGFncz1LCitwb3M9NTI3NzI2CitmbGFncz1LXwogWy9QQUNLRVRdCiBbRlJBTUVdCiBtZWRpYV90eXBlPWF1ZGlvCkBAIC0yODcsNyArMzA3LDcgQEAKIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDY5NjYwCiBwa3RfZHVyYXRpb249MTAyNAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wMjMyMjAKLXBrdF9wb3M9NTI3NzIxCitwa3RfcG9zPTUyNzcyNgogcGt0X3NpemU9MjA0OAogc2FtcGxlX2ZtdD1zMTYKIG5iX3NhbXBsZXM9MTAyNApAQCAtMzA2LDggKzMyNiw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTIzMDQwMAotcG9zPTUyOTc5OQotZmxhZ3M9SworcG9zPTUyOTgwNAorZmxhZ3M9S18KIFsvUEFDS0VUXQogW0ZSQU1FXQogbWVkaWFfdHlwZT12aWRlbwpAQCAtMzIxLDcgKzM0MSw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA4MDAwMAogcGt0X2R1cmF0aW9uPTIwNDgKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwCi1wa3RfcG9zPTUyOTc5OQorcGt0X3Bvcz01Mjk4MDQKIHBrdF9zaXplPTIzMDQwMAogd2lkdGg9MzIwCiBoZWlnaHQ9MjQwCkBAIC0zMzMsNiArMzUzLDExIEBACiBpbnRlcmxhY2VkX2ZyYW1lPTAKIHRvcF9maWVsZF9maXJzdD0wCiByZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT11bmtub3duCitjb2xvcl9zcGFjZT11bmtub3duCitjb2xvcl9wcmltYXJpZXM9dW5rbm93bgorY29sb3JfdHJhbnNmZXI9dW5rbm93bgorY2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCiBbL0ZSQU1FXQogW1BBQ0tFVF0KIGNvZGVjX3R5cGU9dmlkZW8KQEAgLTM0Niw4ICszNzEsOCBAQAogY29udmVyZ2VuY2VfZHVyYXRpb249Ti9BCiBjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQQogc2l6ZT0zMDAwMAotcG9zPTc2MDIyMwotZmxhZ3M9SworcG9zPTc2MDIyOAorZmxhZ3M9S18KIFsvUEFDS0VUXQogW0ZSQU1FXQogbWVkaWFfdHlwZT12aWRlbwpAQCAtMzYxLDcgKzM4Niw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA4MDAwMAogcGt0X2R1cmF0aW9uPTIwNDgKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwCi1wa3RfcG9zPTc2MDIyMworcGt0X3Bvcz03NjAyMjgKIHBrdF9zaXplPTMwMDAwCiB3aWR0aD0xMDAKIGhlaWdodD0xMDAKQEAgLTM3Myw2ICszOTgsMTEgQEAKIGludGVybGFjZWRfZnJhbWU9MAogdG9wX2ZpZWxkX2ZpcnN0PTAKIHJlcGVhdF9waWN0PTAKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjb2xvcl90cmFuc2Zlcj11bmtub3duCitjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKIFsvRlJBTUVdCiBbUEFDS0VUXQogY29kZWNfdHlwZT1hdWRpbwpAQCAtMzg2LDggKzQxNiw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTIwNDgKLXBvcz03OTAyMjgKLWZsYWdzPUsKK3Bvcz03OTAyMzMKK2ZsYWdzPUtfCiBbL1BBQ0tFVF0KIFtGUkFNRV0KIG1lZGlhX3R5cGU9YXVkaW8KQEAgLTQwMSw3ICs0MzEsNyBAQAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wOTI4ODAKIHBrdF9kdXJhdGlvbj0xMDI0CiBwa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMAotcGt0X3Bvcz03OTAyMjgKK3BrdF9wb3M9NzkwMjMzCiBwa3Rfc2l6ZT0yMDQ4CiBzYW1wbGVfZm10PXMxNgogbmJfc2FtcGxlcz0xMDI0CkBAIC00MTUsMTMgKzQ0NSwxMyBAQAogcHRzX3RpbWU9MC4xMTYxMDAKIGR0cz01MTIwCiBkdHNfdGltZT0wLjExNjEwMAotZHVyYXRpb249MTAyNAotZHVyYXRpb25fdGltZT0wLjAyMzIyMAorZHVyYXRpb249MzkzCitkdXJhdGlvbl90aW1lPTAuMDA4OTEyCiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCi1zaXplPTIwNDgKLXBvcz03OTIyOTkKLWZsYWdzPUsKK3NpemU9Nzg2Citwb3M9NzkyMzA0CitmbGFncz1LXwogWy9QQUNLRVRdCiBbRlJBTUVdCiBtZWRpYV90eXBlPWF1ZGlvCkBAIC00MzMsMTIgKzQ2MywxMiBAQAogcGt0X2R0c190aW1lPTAuMTE2MTAwCiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9NTEyMAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4xMTYxMDAKLXBrdF9kdXJhdGlvbj0xMDI0Ci1wa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMAotcGt0X3Bvcz03OTIyOTkKLXBrdF9zaXplPTIwNDgKK3BrdF9kdXJhdGlvbj0zOTMKK3BrdF9kdXJhdGlvbl90aW1lPTAuMDA4OTEyCitwa3RfcG9zPTc5MjMwNAorcGt0X3NpemU9Nzg2CiBzYW1wbGVfZm10PXMxNgotbmJfc2FtcGxlcz0xMDI0CituYl9zYW1wbGVzPTM5MwogY2hhbm5lbHM9MQogY2hhbm5lbF9sYXlvdXQ9dW5rbm93bgogWy9GUkFNRV0KQEAgLTQ1NCw4ICs0ODQsOCBAQAogY29udmVyZ2VuY2VfZHVyYXRpb249Ti9BCiBjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQQogc2l6ZT0yMzA0MDAKLXBvcz03OTQzNzcKLWZsYWdzPUsKK3Bvcz03OTMxMjAKK2ZsYWdzPUtfCiBbL1BBQ0tFVF0KIFtGUkFNRV0KIG1lZGlhX3R5cGU9dmlkZW8KQEAgLTQ2OSw3ICs0OTksNyBAQAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4xMjAwMDAKIHBrdF9kdXJhdGlvbj0yMDQ4CiBwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMAotcGt0X3Bvcz03OTQzNzcKK3BrdF9wb3M9NzkzMTIwCiBwa3Rfc2l6ZT0yMzA0MDAKIHdpZHRoPTMyMAogaGVpZ2h0PTI0MApAQCAtNDgxLDYgKzUxMSwxMSBAQAogaW50ZXJsYWNlZF9mcmFtZT0wCiB0b3BfZmllbGRfZmlyc3Q9MAogcmVwZWF0X3BpY3Q9MAorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAogWy9GUkFNRV0KIFtQQUNLRVRdCiBjb2RlY190eXBlPXZpZGVvCkBAIC00OTQsOCArNTI5LDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MzAwMDAKLXBvcz0xMDI0ODAxCi1mbGFncz1LCitwb3M9MTAyMzU0NAorZmxhZ3M9S18KIFsvUEFDS0VUXQogW0ZSQU1FXQogbWVkaWFfdHlwZT12aWRlbwpAQCAtNTA5LDcgKzU0NCw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjEyMDAwMAogcGt0X2R1cmF0aW9uPTIwNDgKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwCi1wa3RfcG9zPTEwMjQ4MDEKK3BrdF9wb3M9MTAyMzU0NAogcGt0X3NpemU9MzAwMDAKIHdpZHRoPTEwMAogaGVpZ2h0PTEwMApAQCAtNTIxLDYgKzU1NiwxMSBAQAogaW50ZXJsYWNlZF9mcmFtZT0wCiB0b3BfZmllbGRfZmlyc3Q9MAogcmVwZWF0X3BpY3Q9MAorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAogWy9GUkFNRV0KIFtTVFJFQU1dCiBpbmRleD0wCkBAIC01NjAsNiArNjAwLDcgQEAKIERJU1BPU0lUSU9OOnZpc3VhbF9pbXBhaXJlZD0wCiBESVNQT1NJVElPTjpjbGVhbl9lZmZlY3RzPTAKIERJU1BPU0lUSU9OOmF0dGFjaGVkX3BpYz0wCitESVNQT1NJVElPTjp0aW1lZF90aHVtYm5haWxzPTAKIFRBRzpFPW1jwrIKIFRBRzplbmNvZGVyPUxhdmMgcGNtX3MxNmxlCiBbL1NUUkVBTV0KQEAgLTU2OCw3ICs2MDksNyBAQAogY29kZWNfbmFtZT1yYXd2aWRlbwogcHJvZmlsZT11bmtub3duCiBjb2RlY190eXBlPXZpZGVvCi1jb2RlY190aW1lX2Jhc2U9MS81MTIwMAorY29kZWNfdGltZV9iYXNlPTEvMjUKIGNvZGVjX3RhZ19zdHJpbmc9UkdCWzI0XQogY29kZWNfdGFnPTB4MTg0MjQ3NTIKIHdpZHRoPTMyMApAQCAtNTgwLDExICs2MjEsMTIgQEAKIGRpc3BsYXlfYXNwZWN0X3JhdGlvPTQ6MwogcGl4X2ZtdD1yZ2IyNAogbGV2ZWw9LTk5Ci1jb2xvcl9yYW5nZT1OL0EKK2NvbG9yX3JhbmdlPXVua25vd24KIGNvbG9yX3NwYWNlPXVua25vd24KIGNvbG9yX3RyYW5zZmVyPXVua25vd24KIGNvbG9yX3ByaW1hcmllcz11bmtub3duCiBjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK2ZpZWxkX29yZGVyPXVua25vd24KIHRpbWVjb2RlPU4vQQogcmVmcz0xCiBpZD1OL0EKQEAgLTYxMiw2ICs2NTQsNyBAQAogRElTUE9TSVRJT046dmlzdWFsX2ltcGFpcmVkPTAKIERJU1BPU0lUSU9OOmNsZWFuX2VmZmVjdHM9MAogRElTUE9TSVRJT046YXR0YWNoZWRfcGljPTAKK0RJU1BPU0lUSU9OOnRpbWVkX3RodW1ibmFpbHM9MAogVEFHOnRpdGxlPWZvb2JhcgogVEFHOmR1cmF0aW9uX3RzPWZpZWxkLWFuZC10YWdzLWNvbmZsaWN0LWF0dGVtcHQKIFRBRzplbmNvZGVyPUxhdmMgcmF3dmlkZW8KQEAgLTYyMSw3ICs2NjQsNyBAQAogY29kZWNfbmFtZT1yYXd2aWRlbwogcHJvZmlsZT11bmtub3duCiBjb2RlY190eXBlPXZpZGVvCi1jb2RlY190aW1lX2Jhc2U9MS81MTIwMAorY29kZWNfdGltZV9iYXNlPTEvMjUKIGNvZGVjX3RhZ19zdHJpbmc9UkdCWzI0XQogY29kZWNfdGFnPTB4MTg0MjQ3NTIKIHdpZHRoPTEwMApAQCAtNjMzLDExICs2NzYsMTIgQEAKIGRpc3BsYXlfYXNwZWN0X3JhdGlvPTE6MQogcGl4X2ZtdD1yZ2IyNAogbGV2ZWw9LTk5Ci1jb2xvcl9yYW5nZT1OL0EKK2NvbG9yX3JhbmdlPXVua25vd24KIGNvbG9yX3NwYWNlPXVua25vd24KIGNvbG9yX3RyYW5zZmVyPXVua25vd24KIGNvbG9yX3ByaW1hcmllcz11bmtub3duCiBjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK2ZpZWxkX29yZGVyPXVua25vd24KIHRpbWVjb2RlPU4vQQogcmVmcz0xCiBpZD1OL0EKQEAgLTY2NSw2ICs3MDksNyBAQAogRElTUE9TSVRJT046dmlzdWFsX2ltcGFpcmVkPTAKIERJU1BPU0lUSU9OOmNsZWFuX2VmZmVjdHM9MAogRElTUE9TSVRJT046YXR0YWNoZWRfcGljPTAKK0RJU1BPU0lUSU9OOnRpbWVkX3RodW1ibmFpbHM9MAogVEFHOmVuY29kZXI9TGF2YyByYXd2aWRlbwogWy9TVFJFQU1dCiBbRk9STUFUXQpAQCAtNjc0LDggKzcxOSw4IEBACiBmb3JtYXRfbmFtZT1udXQKIHN0YXJ0X3RpbWU9MC4wMDAwMDAKIGR1cmF0aW9uPTAuMTIwMDAwCi1zaXplPTEwNTQ4ODIKLWJpdF9yYXRlPTcwMzI1NDY2CitzaXplPTEwNTM2MjQKK2JpdF9yYXRlPTcwMjQxNjAwCiBwcm9iZV9zY29yZT0xMDAKIFRBRzp0aXRsZT1mZnByb2JlIHRlc3QgZmlsZQogVEFHOmNvbW1lbnQ9J0EgY29tbWVudCB3aXRoIENTViwgWE1MICYgSlNPTiBzcGVjaWFsIGNoYXJzJzogPHRhZyB2YWx1ZT0ieCI+CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2ZsYXQgYi90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2ZsYXQKaW5kZXggNWE4Y2I3Ny4uZmM4MmVlOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9mbGF0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZmcHJvYmVfZmxhdApAQCAtOSw4ICs5LDggQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMC5jb252ZXJnZW5jZV9kdXJhdGlvbj0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4wLmNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMC5zaXplPSIyMDQ4IgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4wLnBvcz0iNjQyIgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4wLmZsYWdzPSJLIgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4wLnBvcz0iNjQ3IgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4wLmZsYWdzPSJLXyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4wLm1lZGlhX3R5cGU9ImF1ZGlvIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjAuc3RyZWFtX2luZGV4PTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4wLmtleV9mcmFtZT0xCkBAIC0yMiw3ICsyMiw3IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMC5iZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wMDAwMDAiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMC5wa3RfZHVyYXRpb249MTAyNAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjAucGt0X2R1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIgotcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjAucGt0X3Bvcz0iNjQyIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjAucGt0X3Bvcz0iNjQ3IgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjAucGt0X3NpemU9IjIwNDgiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMC5zYW1wbGVfZm10PSJzMTYiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMC5uYl9zYW1wbGVzPTEwMjQKQEAgLTM5LDggKzM5LDggQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMS5jb252ZXJnZW5jZV9kdXJhdGlvbj0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xLmNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMS5zaXplPSIyMzA0MDAiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEucG9zPSIyNzE3IgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xLmZsYWdzPSJLIgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xLnBvcz0iMjcyMiIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMS5mbGFncz0iS18iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMS5tZWRpYV90eXBlPSJ2aWRlbyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xLnN0cmVhbV9pbmRleD0xCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMS5rZXlfZnJhbWU9MQpAQCAtNTIsNyArNTIsNyBAQAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEuYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDAwMDAwIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEucGt0X2R1cmF0aW9uPTIwNDgKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xLnBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xLnBrdF9wb3M9IjI3MTciCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMS5wa3RfcG9zPSIyNzIyIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEucGt0X3NpemU9IjIzMDQwMCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xLndpZHRoPTMyMAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEuaGVpZ2h0PTI0MApAQCAtNjQsNiArNjQsMTEgQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xLmludGVybGFjZWRfZnJhbWU9MAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEudG9wX2ZpZWxkX2ZpcnN0PTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xLnJlcGVhdF9waWN0PTAKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xLmNvbG9yX3JhbmdlPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEuY29sb3Jfc3BhY2U9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMS5jb2xvcl9wcmltYXJpZXM9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMS5jb2xvcl90cmFuc2Zlcj0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xLmNocm9tYV9sb2NhdGlvbj0idW5zcGVjaWZpZWQiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjIuY29kZWNfdHlwZT0idmlkZW8iCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjIuc3RyZWFtX2luZGV4PTIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMi5wdHM9MApAQCAtNzUsOCArODAsOCBAQAogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4yLmNvbnZlcmdlbmNlX2R1cmF0aW9uPSJOL0EiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjIuY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4yLnNpemU9IjMwMDAwIgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4yLnBvcz0iMjMzMTM4IgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4yLmZsYWdzPSJLIgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4yLnBvcz0iMjMzMTQzIgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4yLmZsYWdzPSJLXyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4yLm1lZGlhX3R5cGU9InZpZGVvIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjIuc3RyZWFtX2luZGV4PTIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4yLmtleV9mcmFtZT0xCkBAIC04OCw3ICs5Myw3IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMi5iZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wMDAwMDAiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMi5wa3RfZHVyYXRpb249MjA0OAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjIucGt0X2R1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIgotcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjIucGt0X3Bvcz0iMjMzMTM4IgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjIucGt0X3Bvcz0iMjMzMTQzIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjIucGt0X3NpemU9IjMwMDAwIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjIud2lkdGg9MTAwCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMi5oZWlnaHQ9MTAwCkBAIC0xMDAsNiArMTA1LDExIEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMi5pbnRlcmxhY2VkX2ZyYW1lPTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4yLnRvcF9maWVsZF9maXJzdD0wCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMi5yZXBlYXRfcGljdD0wCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMi5jb2xvcl9yYW5nZT0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4yLmNvbG9yX3NwYWNlPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjIuY29sb3JfcHJpbWFyaWVzPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjIuY29sb3JfdHJhbnNmZXI9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMi5jaHJvbWFfbG9jYXRpb249InVuc3BlY2lmaWVkIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4zLmNvZGVjX3R5cGU9ImF1ZGlvIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4zLnN0cmVhbV9pbmRleD0wCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjMucHRzPTEwMjQKQEAgLTExMSw4ICsxMjEsOCBAQAogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4zLmNvbnZlcmdlbmNlX2R1cmF0aW9uPSJOL0EiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjMuY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4zLnNpemU9IjIwNDgiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjMucG9zPSIyNjMxNDMiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjMuZmxhZ3M9IksiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjMucG9zPSIyNjMxNDgiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjMuZmxhZ3M9IktfIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjMubWVkaWFfdHlwZT0iYXVkaW8iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMy5zdHJlYW1faW5kZXg9MAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjMua2V5X2ZyYW1lPTEKQEAgLTEyNCw3ICsxMzQsNyBAQAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjMuYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDIzMjIwIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjMucGt0X2R1cmF0aW9uPTEwMjQKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4zLnBrdF9kdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4zLnBrdF9wb3M9IjI2MzE0MyIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4zLnBrdF9wb3M9IjI2MzE0OCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4zLnBrdF9zaXplPSIyMDQ4IgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjMuc2FtcGxlX2ZtdD0iczE2IgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjMubmJfc2FtcGxlcz0xMDI0CkBAIC0xNDEsOCArMTUxLDggQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNC5jb252ZXJnZW5jZV9kdXJhdGlvbj0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC40LmNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNC5zaXplPSIyMzA0MDAiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjQucG9zPSIyNjUyMjEiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjQuZmxhZ3M9IksiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjQucG9zPSIyNjUyMjYiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjQuZmxhZ3M9IktfIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjQubWVkaWFfdHlwZT0idmlkZW8iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNC5zdHJlYW1faW5kZXg9MQogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjQua2V5X2ZyYW1lPTEKQEAgLTE1NCw3ICsxNjQsNyBAQAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjQuYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDQwMDAwIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjQucGt0X2R1cmF0aW9uPTIwNDgKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LnBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LnBrdF9wb3M9IjI2NTIyMSIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LnBrdF9wb3M9IjI2NTIyNiIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LnBrdF9zaXplPSIyMzA0MDAiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNC53aWR0aD0zMjAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LmhlaWdodD0yNDAKQEAgLTE2Niw2ICsxNzYsMTEgQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LmludGVybGFjZWRfZnJhbWU9MAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjQudG9wX2ZpZWxkX2ZpcnN0PTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LnJlcGVhdF9waWN0PTAKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LmNvbG9yX3JhbmdlPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjQuY29sb3Jfc3BhY2U9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNC5jb2xvcl9wcmltYXJpZXM9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNC5jb2xvcl90cmFuc2Zlcj0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS40LmNocm9tYV9sb2NhdGlvbj0idW5zcGVjaWZpZWQiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjUuY29kZWNfdHlwZT0idmlkZW8iCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjUuc3RyZWFtX2luZGV4PTIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNS5wdHM9MjA0OApAQCAtMTc3LDggKzE5Miw4IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjUuY29udmVyZ2VuY2VfZHVyYXRpb249Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNS5jb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPSJOL0EiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjUuc2l6ZT0iMzAwMDAiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjUucG9zPSI0OTU2NDUiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjUuZmxhZ3M9IksiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjUucG9zPSI0OTU2NTAiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjUuZmxhZ3M9IktfIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUubWVkaWFfdHlwZT0idmlkZW8iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNS5zdHJlYW1faW5kZXg9MgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUua2V5X2ZyYW1lPTEKQEAgLTE5MCw3ICsyMDUsNyBAQAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUuYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDQwMDAwIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUucGt0X2R1cmF0aW9uPTIwNDgKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS41LnBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS41LnBrdF9wb3M9IjQ5NTY0NSIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS41LnBrdF9wb3M9IjQ5NTY1MCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS41LnBrdF9zaXplPSIzMDAwMCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS41LndpZHRoPTEwMAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUuaGVpZ2h0PTEwMApAQCAtMjAyLDYgKzIxNywxMSBAQAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUuaW50ZXJsYWNlZF9mcmFtZT0wCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNS50b3BfZmllbGRfZmlyc3Q9MAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUucmVwZWF0X3BpY3Q9MAorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUuY29sb3JfcmFuZ2U9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNS5jb2xvcl9zcGFjZT0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS41LmNvbG9yX3ByaW1hcmllcz0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS41LmNvbG9yX3RyYW5zZmVyPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjUuY2hyb21hX2xvY2F0aW9uPSJ1bnNwZWNpZmllZCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNi5jb2RlY190eXBlPSJhdWRpbyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNi5zdHJlYW1faW5kZXg9MAogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC42LnB0cz0yMDQ4CkBAIC0yMTMsOCArMjMzLDggQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNi5jb252ZXJnZW5jZV9kdXJhdGlvbj0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC42LmNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNi5zaXplPSIyMDQ4IgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC42LnBvcz0iNTI1NjUwIgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC42LmZsYWdzPSJLIgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC42LnBvcz0iNTI1NjU1IgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC42LmZsYWdzPSJLXyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS42Lm1lZGlhX3R5cGU9ImF1ZGlvIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjYuc3RyZWFtX2luZGV4PTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS42LmtleV9mcmFtZT0xCkBAIC0yMjYsNyArMjQ2LDcgQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS42LmJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjA0NjQ0MCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS42LnBrdF9kdXJhdGlvbj0xMDI0CiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNi5wa3RfZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiCi1wYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNi5wa3RfcG9zPSI1MjU2NTAiCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNi5wa3RfcG9zPSI1MjU2NTUiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNi5wa3Rfc2l6ZT0iMjA0OCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS42LnNhbXBsZV9mbXQ9InMxNiIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS42Lm5iX3NhbXBsZXM9MTAyNApAQCAtMjQzLDggKzI2Myw4IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjcuY29udmVyZ2VuY2VfZHVyYXRpb249Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNy5jb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPSJOL0EiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0Ljcuc2l6ZT0iMjA0OCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNy5wb3M9IjUyNzcyMSIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNy5mbGFncz0iSyIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNy5wb3M9IjUyNzcyNiIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuNy5mbGFncz0iS18iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNy5tZWRpYV90eXBlPSJhdWRpbyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS43LnN0cmVhbV9pbmRleD0wCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNy5rZXlfZnJhbWU9MQpAQCAtMjU2LDcgKzI3Niw3IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNy5iZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wNjk2NjAiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNy5wa3RfZHVyYXRpb249MTAyNAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjcucGt0X2R1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIgotcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjcucGt0X3Bvcz0iNTI3NzIxIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjcucGt0X3Bvcz0iNTI3NzI2IgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjcucGt0X3NpemU9IjIwNDgiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNy5zYW1wbGVfZm10PSJzMTYiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNy5uYl9zYW1wbGVzPTEwMjQKQEAgLTI3Myw4ICsyOTMsOCBAQAogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC44LmNvbnZlcmdlbmNlX2R1cmF0aW9uPSJOL0EiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjguY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC44LnNpemU9IjIzMDQwMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOC5wb3M9IjUyOTc5OSIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOC5mbGFncz0iSyIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOC5wb3M9IjUyOTgwNCIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOC5mbGFncz0iS18iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOC5tZWRpYV90eXBlPSJ2aWRlbyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS44LnN0cmVhbV9pbmRleD0xCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOC5rZXlfZnJhbWU9MQpAQCAtMjg2LDcgKzMwNiw3IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOC5iZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wODAwMDAiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOC5wa3RfZHVyYXRpb249MjA0OAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjgucGt0X2R1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIgotcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjgucGt0X3Bvcz0iNTI5Nzk5IgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjgucGt0X3Bvcz0iNTI5ODA0IgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjgucGt0X3NpemU9IjIzMDQwMCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS44LndpZHRoPTMyMAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjguaGVpZ2h0PTI0MApAQCAtMjk4LDYgKzMxOCwxMSBAQAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjguaW50ZXJsYWNlZF9mcmFtZT0wCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOC50b3BfZmllbGRfZmlyc3Q9MAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjgucmVwZWF0X3BpY3Q9MAorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjguY29sb3JfcmFuZ2U9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOC5jb2xvcl9zcGFjZT0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS44LmNvbG9yX3ByaW1hcmllcz0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS44LmNvbG9yX3RyYW5zZmVyPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjguY2hyb21hX2xvY2F0aW9uPSJ1bnNwZWNpZmllZCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOS5jb2RlY190eXBlPSJ2aWRlbyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOS5zdHJlYW1faW5kZXg9MgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC45LnB0cz00MDk2CkBAIC0zMDksOCArMzM0LDggQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOS5jb252ZXJnZW5jZV9kdXJhdGlvbj0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC45LmNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOS5zaXplPSIzMDAwMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOS5wb3M9Ijc2MDIyMyIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOS5mbGFncz0iSyIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOS5wb3M9Ijc2MDIyOCIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuOS5mbGFncz0iS18iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5tZWRpYV90eXBlPSJ2aWRlbyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS45LnN0cmVhbV9pbmRleD0yCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5rZXlfZnJhbWU9MQpAQCAtMzIyLDcgKzM0Nyw3IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5iZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wODAwMDAiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5wa3RfZHVyYXRpb249MjA0OAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjkucGt0X2R1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIgotcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjkucGt0X3Bvcz0iNzYwMjIzIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjkucGt0X3Bvcz0iNzYwMjI4IgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjkucGt0X3NpemU9IjMwMDAwIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjkud2lkdGg9MTAwCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5oZWlnaHQ9MTAwCkBAIC0zMzQsNiArMzU5LDExIEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5pbnRlcmxhY2VkX2ZyYW1lPTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS45LnRvcF9maWVsZF9maXJzdD0wCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5yZXBlYXRfcGljdD0wCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5jb2xvcl9yYW5nZT0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS45LmNvbG9yX3NwYWNlPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjkuY29sb3JfcHJpbWFyaWVzPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjkuY29sb3JfdHJhbnNmZXI9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOS5jaHJvbWFfbG9jYXRpb249InVuc3BlY2lmaWVkIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMC5jb2RlY190eXBlPSJhdWRpbyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTAuc3RyZWFtX2luZGV4PTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTAucHRzPTQwOTYKQEAgLTM0NSw4ICszNzUsOCBAQAogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMC5jb252ZXJnZW5jZV9kdXJhdGlvbj0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMC5jb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPSJOL0EiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEwLnNpemU9IjIwNDgiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEwLnBvcz0iNzkwMjI4IgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMC5mbGFncz0iSyIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTAucG9zPSI3OTAyMzMiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEwLmZsYWdzPSJLXyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMC5tZWRpYV90eXBlPSJhdWRpbyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMC5zdHJlYW1faW5kZXg9MAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEwLmtleV9mcmFtZT0xCkBAIC0zNTgsNyArMzg4LDcgQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMC5iZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wOTI4ODAiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTAucGt0X2R1cmF0aW9uPTEwMjQKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMC5wa3RfZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiCi1wYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTAucGt0X3Bvcz0iNzkwMjI4IgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEwLnBrdF9wb3M9Ijc5MDIzMyIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMC5wa3Rfc2l6ZT0iMjA0OCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMC5zYW1wbGVfZm10PSJzMTYiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTAubmJfc2FtcGxlcz0xMDI0CkBAIC0zNzAsMTMgKzQwMCwxMyBAQAogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMS5wdHNfdGltZT0iMC4xMTYxMDAiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjExLmR0cz01MTIwCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjExLmR0c190aW1lPSIwLjExNjEwMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTEuZHVyYXRpb249MTAyNAotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMS5kdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTEuZHVyYXRpb249MzkzCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjExLmR1cmF0aW9uX3RpbWU9IjAuMDA4OTEyIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMS5jb252ZXJnZW5jZV9kdXJhdGlvbj0iTi9BIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMS5jb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPSJOL0EiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjExLnNpemU9IjIwNDgiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjExLnBvcz0iNzkyMjk5IgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMS5mbGFncz0iSyIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTEuc2l6ZT0iNzg2IgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMS5wb3M9Ijc5MjMwNCIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTEuZmxhZ3M9IktfIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjExLm1lZGlhX3R5cGU9ImF1ZGlvIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjExLnN0cmVhbV9pbmRleD0wCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTEua2V5X2ZyYW1lPTEKQEAgLTM4NiwxMiArNDE2LDEyIEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTEucGt0X2R0c190aW1lPSIwLjExNjEwMCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMS5iZXN0X2VmZm9ydF90aW1lc3RhbXA9NTEyMAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjExLmJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjExNjEwMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMS5wa3RfZHVyYXRpb249MTAyNAotcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjExLnBrdF9kdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMS5wa3RfcG9zPSI3OTIyOTkiCi1wYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTEucGt0X3NpemU9IjIwNDgiCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTEucGt0X2R1cmF0aW9uPTM5MworcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjExLnBrdF9kdXJhdGlvbl90aW1lPSIwLjAwODkxMiIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMS5wa3RfcG9zPSI3OTIzMDQiCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTEucGt0X3NpemU9Ijc4NiIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMS5zYW1wbGVfZm10PSJzMTYiCi1wYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTEubmJfc2FtcGxlcz0xMDI0CitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTEubmJfc2FtcGxlcz0zOTMKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMS5jaGFubmVscz0xCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTEuY2hhbm5lbF9sYXlvdXQ9InVua25vd24iCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEyLmNvZGVjX3R5cGU9InZpZGVvIgpAQCAtNDA1LDggKzQzNSw4IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEyLmNvbnZlcmdlbmNlX2R1cmF0aW9uPSJOL0EiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEyLmNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTIuc2l6ZT0iMjMwNDAwIgotcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMi5wb3M9Ijc5NDM3NyIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTIuZmxhZ3M9IksiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEyLnBvcz0iNzkzMTIwIgorcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMi5mbGFncz0iS18iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIubWVkaWFfdHlwZT0idmlkZW8iCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIuc3RyZWFtX2luZGV4PTEKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMi5rZXlfZnJhbWU9MQpAQCAtNDE4LDcgKzQ0OCw3IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIuYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMTIwMDAwIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEyLnBrdF9kdXJhdGlvbj0yMDQ4CiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIucGt0X2R1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIgotcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEyLnBrdF9wb3M9Ijc5NDM3NyIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMi5wa3RfcG9zPSI3OTMxMjAiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIucGt0X3NpemU9IjIzMDQwMCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMi53aWR0aD0zMjAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMi5oZWlnaHQ9MjQwCkBAIC00MzAsNiArNDYwLDExIEBACiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIuaW50ZXJsYWNlZF9mcmFtZT0wCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIudG9wX2ZpZWxkX2ZpcnN0PTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMi5yZXBlYXRfcGljdD0wCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIuY29sb3JfcmFuZ2U9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIuY29sb3Jfc3BhY2U9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTIuY29sb3JfcHJpbWFyaWVzPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEyLmNvbG9yX3RyYW5zZmVyPSJ1bmtub3duIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEyLmNocm9tYV9sb2NhdGlvbj0idW5zcGVjaWZpZWQiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEzLmNvZGVjX3R5cGU9InZpZGVvIgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMy5zdHJlYW1faW5kZXg9MgogcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMy5wdHM9NjE0NApAQCAtNDQxLDggKzQ3Niw4IEBACiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEzLmNvbnZlcmdlbmNlX2R1cmF0aW9uPSJOL0EiCiBwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEzLmNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ik4vQSIKIHBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTMuc2l6ZT0iMzAwMDAiCi1wYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEzLnBvcz0iMTAyNDgwMSIKLXBhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTMuZmxhZ3M9IksiCitwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEzLnBvcz0iMTAyMzU0NCIKK3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMTMuZmxhZ3M9IktfIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEzLm1lZGlhX3R5cGU9InZpZGVvIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEzLnN0cmVhbV9pbmRleD0yCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTMua2V5X2ZyYW1lPTEKQEAgLTQ1NCw3ICs0ODksNyBAQAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEzLmJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjEyMDAwMCIKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMy5wa3RfZHVyYXRpb249MjA0OAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEzLnBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIKLXBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMy5wa3RfcG9zPSIxMDI0ODAxIgorcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEzLnBrdF9wb3M9IjEwMjM1NDQiCiBwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTMucGt0X3NpemU9IjMwMDAwIgogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEzLndpZHRoPTEwMAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEzLmhlaWdodD0xMDAKQEAgLTQ2Niw2ICs1MDEsMTEgQEAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMy5pbnRlcmxhY2VkX2ZyYW1lPTAKIHBhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMy50b3BfZmllbGRfZmlyc3Q9MAogcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEzLnJlcGVhdF9waWN0PTAKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMy5jb2xvcl9yYW5nZT0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMy5jb2xvcl9zcGFjZT0idW5rbm93biIKK3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4xMy5jb2xvcl9wcmltYXJpZXM9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTMuY29sb3JfdHJhbnNmZXI9InVua25vd24iCitwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTMuY2hyb21hX2xvY2F0aW9uPSJ1bnNwZWNpZmllZCIKIHN0cmVhbXMuc3RyZWFtLjAuaW5kZXg9MAogc3RyZWFtcy5zdHJlYW0uMC5jb2RlY19uYW1lPSJwY21fczE2bGUiCiBzdHJlYW1zLnN0cmVhbS4wLnByb2ZpbGU9InVua25vd24iCkBAIC01MDMsMTMgKzU0MywxNCBAQAogc3RyZWFtcy5zdHJlYW0uMC5kaXNwb3NpdGlvbi52aXN1YWxfaW1wYWlyZWQ9MAogc3RyZWFtcy5zdHJlYW0uMC5kaXNwb3NpdGlvbi5jbGVhbl9lZmZlY3RzPTAKIHN0cmVhbXMuc3RyZWFtLjAuZGlzcG9zaXRpb24uYXR0YWNoZWRfcGljPTAKK3N0cmVhbXMuc3RyZWFtLjAuZGlzcG9zaXRpb24udGltZWRfdGh1bWJuYWlscz0wCiBzdHJlYW1zLnN0cmVhbS4wLnRhZ3MuRT0ibWPCsiIKIHN0cmVhbXMuc3RyZWFtLjAudGFncy5lbmNvZGVyPSJMYXZjIHBjbV9zMTZsZSIKIHN0cmVhbXMuc3RyZWFtLjEuaW5kZXg9MQogc3RyZWFtcy5zdHJlYW0uMS5jb2RlY19uYW1lPSJyYXd2aWRlbyIKIHN0cmVhbXMuc3RyZWFtLjEucHJvZmlsZT0idW5rbm93biIKIHN0cmVhbXMuc3RyZWFtLjEuY29kZWNfdHlwZT0idmlkZW8iCi1zdHJlYW1zLnN0cmVhbS4xLmNvZGVjX3RpbWVfYmFzZT0iMS81MTIwMCIKK3N0cmVhbXMuc3RyZWFtLjEuY29kZWNfdGltZV9iYXNlPSIxLzI1Igogc3RyZWFtcy5zdHJlYW0uMS5jb2RlY190YWdfc3RyaW5nPSJSR0JbMjRdIgogc3RyZWFtcy5zdHJlYW0uMS5jb2RlY190YWc9IjB4MTg0MjQ3NTIiCiBzdHJlYW1zLnN0cmVhbS4xLndpZHRoPTMyMApAQCAtNTIxLDExICs1NjIsMTIgQEAKIHN0cmVhbXMuc3RyZWFtLjEuZGlzcGxheV9hc3BlY3RfcmF0aW89IjQ6MyIKIHN0cmVhbXMuc3RyZWFtLjEucGl4X2ZtdD0icmdiMjQiCiBzdHJlYW1zLnN0cmVhbS4xLmxldmVsPS05OQotc3RyZWFtcy5zdHJlYW0uMS5jb2xvcl9yYW5nZT0iTi9BIgorc3RyZWFtcy5zdHJlYW0uMS5jb2xvcl9yYW5nZT0idW5rbm93biIKIHN0cmVhbXMuc3RyZWFtLjEuY29sb3Jfc3BhY2U9InVua25vd24iCiBzdHJlYW1zLnN0cmVhbS4xLmNvbG9yX3RyYW5zZmVyPSJ1bmtub3duIgogc3RyZWFtcy5zdHJlYW0uMS5jb2xvcl9wcmltYXJpZXM9InVua25vd24iCiBzdHJlYW1zLnN0cmVhbS4xLmNocm9tYV9sb2NhdGlvbj0idW5zcGVjaWZpZWQiCitzdHJlYW1zLnN0cmVhbS4xLmZpZWxkX29yZGVyPSJ1bmtub3duIgogc3RyZWFtcy5zdHJlYW0uMS50aW1lY29kZT0iTi9BIgogc3RyZWFtcy5zdHJlYW0uMS5yZWZzPTEKIHN0cmVhbXMuc3RyZWFtLjEuaWQ9Ik4vQSIKQEAgLTU1Myw2ICs1OTUsNyBAQAogc3RyZWFtcy5zdHJlYW0uMS5kaXNwb3NpdGlvbi52aXN1YWxfaW1wYWlyZWQ9MAogc3RyZWFtcy5zdHJlYW0uMS5kaXNwb3NpdGlvbi5jbGVhbl9lZmZlY3RzPTAKIHN0cmVhbXMuc3RyZWFtLjEuZGlzcG9zaXRpb24uYXR0YWNoZWRfcGljPTAKK3N0cmVhbXMuc3RyZWFtLjEuZGlzcG9zaXRpb24udGltZWRfdGh1bWJuYWlscz0wCiBzdHJlYW1zLnN0cmVhbS4xLnRhZ3MudGl0bGU9ImZvb2JhciIKIHN0cmVhbXMuc3RyZWFtLjEudGFncy5kdXJhdGlvbl90cz0iZmllbGQtYW5kLXRhZ3MtY29uZmxpY3QtYXR0ZW1wdCIKIHN0cmVhbXMuc3RyZWFtLjEudGFncy5lbmNvZGVyPSJMYXZjIHJhd3ZpZGVvIgpAQCAtNTYwLDcgKzYwMyw3IEBACiBzdHJlYW1zLnN0cmVhbS4yLmNvZGVjX25hbWU9InJhd3ZpZGVvIgogc3RyZWFtcy5zdHJlYW0uMi5wcm9maWxlPSJ1bmtub3duIgogc3RyZWFtcy5zdHJlYW0uMi5jb2RlY190eXBlPSJ2aWRlbyIKLXN0cmVhbXMuc3RyZWFtLjIuY29kZWNfdGltZV9iYXNlPSIxLzUxMjAwIgorc3RyZWFtcy5zdHJlYW0uMi5jb2RlY190aW1lX2Jhc2U9IjEvMjUiCiBzdHJlYW1zLnN0cmVhbS4yLmNvZGVjX3RhZ19zdHJpbmc9IlJHQlsyNF0iCiBzdHJlYW1zLnN0cmVhbS4yLmNvZGVjX3RhZz0iMHgxODQyNDc1MiIKIHN0cmVhbXMuc3RyZWFtLjIud2lkdGg9MTAwCkBAIC01NzIsMTEgKzYxNSwxMiBAQAogc3RyZWFtcy5zdHJlYW0uMi5kaXNwbGF5X2FzcGVjdF9yYXRpbz0iMToxIgogc3RyZWFtcy5zdHJlYW0uMi5waXhfZm10PSJyZ2IyNCIKIHN0cmVhbXMuc3RyZWFtLjIubGV2ZWw9LTk5Ci1zdHJlYW1zLnN0cmVhbS4yLmNvbG9yX3JhbmdlPSJOL0EiCitzdHJlYW1zLnN0cmVhbS4yLmNvbG9yX3JhbmdlPSJ1bmtub3duIgogc3RyZWFtcy5zdHJlYW0uMi5jb2xvcl9zcGFjZT0idW5rbm93biIKIHN0cmVhbXMuc3RyZWFtLjIuY29sb3JfdHJhbnNmZXI9InVua25vd24iCiBzdHJlYW1zLnN0cmVhbS4yLmNvbG9yX3ByaW1hcmllcz0idW5rbm93biIKIHN0cmVhbXMuc3RyZWFtLjIuY2hyb21hX2xvY2F0aW9uPSJ1bnNwZWNpZmllZCIKK3N0cmVhbXMuc3RyZWFtLjIuZmllbGRfb3JkZXI9InVua25vd24iCiBzdHJlYW1zLnN0cmVhbS4yLnRpbWVjb2RlPSJOL0EiCiBzdHJlYW1zLnN0cmVhbS4yLnJlZnM9MQogc3RyZWFtcy5zdHJlYW0uMi5pZD0iTi9BIgpAQCAtNjA0LDYgKzY0OCw3IEBACiBzdHJlYW1zLnN0cmVhbS4yLmRpc3Bvc2l0aW9uLnZpc3VhbF9pbXBhaXJlZD0wCiBzdHJlYW1zLnN0cmVhbS4yLmRpc3Bvc2l0aW9uLmNsZWFuX2VmZmVjdHM9MAogc3RyZWFtcy5zdHJlYW0uMi5kaXNwb3NpdGlvbi5hdHRhY2hlZF9waWM9MAorc3RyZWFtcy5zdHJlYW0uMi5kaXNwb3NpdGlvbi50aW1lZF90aHVtYm5haWxzPTAKIHN0cmVhbXMuc3RyZWFtLjIudGFncy5lbmNvZGVyPSJMYXZjIHJhd3ZpZGVvIgogZm9ybWF0LmZpbGVuYW1lPSJ0ZXN0cy9kYXRhL2ZmcHJvYmUtdGVzdC5udXQiCiBmb3JtYXQubmJfc3RyZWFtcz0zCkBAIC02MTEsOCArNjU2LDggQEAKIGZvcm1hdC5mb3JtYXRfbmFtZT0ibnV0IgogZm9ybWF0LnN0YXJ0X3RpbWU9IjAuMDAwMDAwIgogZm9ybWF0LmR1cmF0aW9uPSIwLjEyMDAwMCIKLWZvcm1hdC5zaXplPSIxMDU0ODgyIgotZm9ybWF0LmJpdF9yYXRlPSI3MDMyNTQ2NiIKK2Zvcm1hdC5zaXplPSIxMDUzNjI0IgorZm9ybWF0LmJpdF9yYXRlPSI3MDI0MTYwMCIKIGZvcm1hdC5wcm9iZV9zY29yZT0xMDAKIGZvcm1hdC50YWdzLnRpdGxlPSJmZnByb2JlIHRlc3QgZmlsZSIKIGZvcm1hdC50YWdzLmNvbW1lbnQ9IidBIGNvbW1lbnQgd2l0aCBDU1YsIFhNTCAmIEpTT04gc3BlY2lhbCBjaGFycyc6IDx0YWcgdmFsdWU9XCJ4XCI+IgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9pbmkgYi90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2luaQppbmRleCBkYjVlYThiLi5hNzg2OTBjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2luaQorKysgYi90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2luaQpAQCAtMTIsOCArMTIsOCBAQAogY29udmVyZ2VuY2VfZHVyYXRpb249Ti9BCiBjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQQogc2l6ZT0yMDQ4Ci1wb3M9NjQyCi1mbGFncz1LCitwb3M9NjQ3CitmbGFncz1LXwogCiBbcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjBdCiBtZWRpYV90eXBlPWF1ZGlvCkBAIC0yNyw3ICsyNyw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjAwMDAwMAogcGt0X2R1cmF0aW9uPTEwMjQKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDIzMjIwCi1wa3RfcG9zPTY0MgorcGt0X3Bvcz02NDcKIHBrdF9zaXplPTIwNDgKIHNhbXBsZV9mbXQ9czE2CiBuYl9zYW1wbGVzPTEwMjQKQEAgLTQ2LDggKzQ2LDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MjMwNDAwCi1wb3M9MjcxNwotZmxhZ3M9SworcG9zPTI3MjIKK2ZsYWdzPUtfCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMV0KIG1lZGlhX3R5cGU9dmlkZW8KQEAgLTYxLDcgKzYxLDcgQEAKIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDAwMDAwCiBwa3RfZHVyYXRpb249MjA0OAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDAKLXBrdF9wb3M9MjcxNworcGt0X3Bvcz0yNzIyCiBwa3Rfc2l6ZT0yMzA0MDAKIHdpZHRoPTMyMAogaGVpZ2h0PTI0MApAQCAtNzMsNiArNzMsMTEgQEAKIGludGVybGFjZWRfZnJhbWU9MAogdG9wX2ZpZWxkX2ZpcnN0PTAKIHJlcGVhdF9waWN0PTAKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjb2xvcl90cmFuc2Zlcj11bmtub3duCitjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKIAogW3BhY2tldHNfYW5kX2ZyYW1lcy5wYWNrZXQuMl0KIGNvZGVjX3R5cGU9dmlkZW8KQEAgLTg2LDggKzkxLDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MzAwMDAKLXBvcz0yMzMxMzgKLWZsYWdzPUsKK3Bvcz0yMzMxNDMKK2ZsYWdzPUtfCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMl0KIG1lZGlhX3R5cGU9dmlkZW8KQEAgLTEwMSw3ICsxMDYsNyBAQAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wMDAwMDAKIHBrdF9kdXJhdGlvbj0yMDQ4CiBwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMAotcGt0X3Bvcz0yMzMxMzgKK3BrdF9wb3M9MjMzMTQzCiBwa3Rfc2l6ZT0zMDAwMAogd2lkdGg9MTAwCiBoZWlnaHQ9MTAwCkBAIC0xMTMsNiArMTE4LDExIEBACiBpbnRlcmxhY2VkX2ZyYW1lPTAKIHRvcF9maWVsZF9maXJzdD0wCiByZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT11bmtub3duCitjb2xvcl9zcGFjZT11bmtub3duCitjb2xvcl9wcmltYXJpZXM9dW5rbm93bgorY29sb3JfdHJhbnNmZXI9dW5rbm93bgorY2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjNdCiBjb2RlY190eXBlPWF1ZGlvCkBAIC0xMjYsOCArMTM2LDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MjA0OAotcG9zPTI2MzE0MwotZmxhZ3M9SworcG9zPTI2MzE0OAorZmxhZ3M9S18KIAogW3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS4zXQogbWVkaWFfdHlwZT1hdWRpbwpAQCAtMTQxLDcgKzE1MSw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjAyMzIyMAogcGt0X2R1cmF0aW9uPTEwMjQKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDIzMjIwCi1wa3RfcG9zPTI2MzE0MworcGt0X3Bvcz0yNjMxNDgKIHBrdF9zaXplPTIwNDgKIHNhbXBsZV9mbXQ9czE2CiBuYl9zYW1wbGVzPTEwMjQKQEAgLTE2MCw4ICsxNzAsOCBAQAogY29udmVyZ2VuY2VfZHVyYXRpb249Ti9BCiBjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQQogc2l6ZT0yMzA0MDAKLXBvcz0yNjUyMjEKLWZsYWdzPUsKK3Bvcz0yNjUyMjYKK2ZsYWdzPUtfCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNF0KIG1lZGlhX3R5cGU9dmlkZW8KQEAgLTE3NSw3ICsxODUsNyBAQAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wNDAwMDAKIHBrdF9kdXJhdGlvbj0yMDQ4CiBwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMAotcGt0X3Bvcz0yNjUyMjEKK3BrdF9wb3M9MjY1MjI2CiBwa3Rfc2l6ZT0yMzA0MDAKIHdpZHRoPTMyMAogaGVpZ2h0PTI0MApAQCAtMTg3LDYgKzE5NywxMSBAQAogaW50ZXJsYWNlZF9mcmFtZT0wCiB0b3BfZmllbGRfZmlyc3Q9MAogcmVwZWF0X3BpY3Q9MAorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAogCiBbcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC41XQogY29kZWNfdHlwZT12aWRlbwpAQCAtMjAwLDggKzIxNSw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTMwMDAwCi1wb3M9NDk1NjQ1Ci1mbGFncz1LCitwb3M9NDk1NjUwCitmbGFncz1LXwogCiBbcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjVdCiBtZWRpYV90eXBlPXZpZGVvCkBAIC0yMTUsNyArMjMwLDcgQEAKIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDQwMDAwCiBwa3RfZHVyYXRpb249MjA0OAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDAKLXBrdF9wb3M9NDk1NjQ1Citwa3RfcG9zPTQ5NTY1MAogcGt0X3NpemU9MzAwMDAKIHdpZHRoPTEwMAogaGVpZ2h0PTEwMApAQCAtMjI3LDYgKzI0MiwxMSBAQAogaW50ZXJsYWNlZF9mcmFtZT0wCiB0b3BfZmllbGRfZmlyc3Q9MAogcmVwZWF0X3BpY3Q9MAorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAogCiBbcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC42XQogY29kZWNfdHlwZT1hdWRpbwpAQCAtMjQwLDggKzI2MCw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTIwNDgKLXBvcz01MjU2NTAKLWZsYWdzPUsKK3Bvcz01MjU2NTUKK2ZsYWdzPUtfCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuNl0KIG1lZGlhX3R5cGU9YXVkaW8KQEAgLTI1NSw3ICsyNzUsNyBAQAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wNDY0NDAKIHBrdF9kdXJhdGlvbj0xMDI0CiBwa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMAotcGt0X3Bvcz01MjU2NTAKK3BrdF9wb3M9NTI1NjU1CiBwa3Rfc2l6ZT0yMDQ4CiBzYW1wbGVfZm10PXMxNgogbmJfc2FtcGxlcz0xMDI0CkBAIC0yNzQsOCArMjk0LDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MjA0OAotcG9zPTUyNzcyMQotZmxhZ3M9SworcG9zPTUyNzcyNgorZmxhZ3M9S18KIAogW3BhY2tldHNfYW5kX2ZyYW1lcy5mcmFtZS43XQogbWVkaWFfdHlwZT1hdWRpbwpAQCAtMjg5LDcgKzMwOSw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA2OTY2MAogcGt0X2R1cmF0aW9uPTEwMjQKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDIzMjIwCi1wa3RfcG9zPTUyNzcyMQorcGt0X3Bvcz01Mjc3MjYKIHBrdF9zaXplPTIwNDgKIHNhbXBsZV9mbXQ9czE2CiBuYl9zYW1wbGVzPTEwMjQKQEAgLTMwOCw4ICszMjgsOCBAQAogY29udmVyZ2VuY2VfZHVyYXRpb249Ti9BCiBjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQQogc2l6ZT0yMzA0MDAKLXBvcz01Mjk3OTkKLWZsYWdzPUsKK3Bvcz01Mjk4MDQKK2ZsYWdzPUtfCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuOF0KIG1lZGlhX3R5cGU9dmlkZW8KQEAgLTMyMyw3ICszNDMsNyBAQAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wODAwMDAKIHBrdF9kdXJhdGlvbj0yMDQ4CiBwa3RfZHVyYXRpb25fdGltZT0wLjA0MDAwMAotcGt0X3Bvcz01Mjk3OTkKK3BrdF9wb3M9NTI5ODA0CiBwa3Rfc2l6ZT0yMzA0MDAKIHdpZHRoPTMyMAogaGVpZ2h0PTI0MApAQCAtMzM1LDYgKzM1NSwxMSBAQAogaW50ZXJsYWNlZF9mcmFtZT0wCiB0b3BfZmllbGRfZmlyc3Q9MAogcmVwZWF0X3BpY3Q9MAorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAogCiBbcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC45XQogY29kZWNfdHlwZT12aWRlbwpAQCAtMzQ4LDggKzM3Myw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTMwMDAwCi1wb3M9NzYwMjIzCi1mbGFncz1LCitwb3M9NzYwMjI4CitmbGFncz1LXwogCiBbcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjldCiBtZWRpYV90eXBlPXZpZGVvCkBAIC0zNjMsNyArMzg4LDcgQEAKIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDgwMDAwCiBwa3RfZHVyYXRpb249MjA0OAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDAKLXBrdF9wb3M9NzYwMjIzCitwa3RfcG9zPTc2MDIyOAogcGt0X3NpemU9MzAwMDAKIHdpZHRoPTEwMAogaGVpZ2h0PTEwMApAQCAtMzc1LDYgKzQwMCwxMSBAQAogaW50ZXJsYWNlZF9mcmFtZT0wCiB0b3BfZmllbGRfZmlyc3Q9MAogcmVwZWF0X3BpY3Q9MAorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAogCiBbcGFja2V0c19hbmRfZnJhbWVzLnBhY2tldC4xMF0KIGNvZGVjX3R5cGU9YXVkaW8KQEAgLTM4OCw4ICs0MTgsOCBAQAogY29udmVyZ2VuY2VfZHVyYXRpb249Ti9BCiBjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQQogc2l6ZT0yMDQ4Ci1wb3M9NzkwMjI4Ci1mbGFncz1LCitwb3M9NzkwMjMzCitmbGFncz1LXwogCiBbcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEwXQogbWVkaWFfdHlwZT1hdWRpbwpAQCAtNDAzLDcgKzQzMyw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjA5Mjg4MAogcGt0X2R1cmF0aW9uPTEwMjQKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDIzMjIwCi1wa3RfcG9zPTc5MDIyOAorcGt0X3Bvcz03OTAyMzMKIHBrdF9zaXplPTIwNDgKIHNhbXBsZV9mbXQ9czE2CiBuYl9zYW1wbGVzPTEwMjQKQEAgLTQxNywxMyArNDQ3LDEzIEBACiBwdHNfdGltZT0wLjExNjEwMAogZHRzPTUxMjAKIGR0c190aW1lPTAuMTE2MTAwCi1kdXJhdGlvbj0xMDI0Ci1kdXJhdGlvbl90aW1lPTAuMDIzMjIwCitkdXJhdGlvbj0zOTMKK2R1cmF0aW9uX3RpbWU9MC4wMDg5MTIKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKLXNpemU9MjA0OAotcG9zPTc5MjI5OQotZmxhZ3M9Sworc2l6ZT03ODYKK3Bvcz03OTIzMDQKK2ZsYWdzPUtfCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTFdCiBtZWRpYV90eXBlPWF1ZGlvCkBAIC00MzUsMTIgKzQ2NSwxMiBAQAogcGt0X2R0c190aW1lPTAuMTE2MTAwCiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9NTEyMAogYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4xMTYxMDAKLXBrdF9kdXJhdGlvbj0xMDI0Ci1wa3RfZHVyYXRpb25fdGltZT0wLjAyMzIyMAotcGt0X3Bvcz03OTIyOTkKLXBrdF9zaXplPTIwNDgKK3BrdF9kdXJhdGlvbj0zOTMKK3BrdF9kdXJhdGlvbl90aW1lPTAuMDA4OTEyCitwa3RfcG9zPTc5MjMwNAorcGt0X3NpemU9Nzg2CiBzYW1wbGVfZm10PXMxNgotbmJfc2FtcGxlcz0xMDI0CituYl9zYW1wbGVzPTM5MwogY2hhbm5lbHM9MQogY2hhbm5lbF9sYXlvdXQ9dW5rbm93bgogCkBAIC00NTYsOCArNDg2LDggQEAKIGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQogY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKIHNpemU9MjMwNDAwCi1wb3M9Nzk0Mzc3Ci1mbGFncz1LCitwb3M9NzkzMTIwCitmbGFncz1LXwogCiBbcGFja2V0c19hbmRfZnJhbWVzLmZyYW1lLjEyXQogbWVkaWFfdHlwZT12aWRlbwpAQCAtNDcxLDcgKzUwMSw3IEBACiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjEyMDAwMAogcGt0X2R1cmF0aW9uPTIwNDgKIHBrdF9kdXJhdGlvbl90aW1lPTAuMDQwMDAwCi1wa3RfcG9zPTc5NDM3NworcGt0X3Bvcz03OTMxMjAKIHBrdF9zaXplPTIzMDQwMAogd2lkdGg9MzIwCiBoZWlnaHQ9MjQwCkBAIC00ODMsNiArNTEzLDExIEBACiBpbnRlcmxhY2VkX2ZyYW1lPTAKIHRvcF9maWVsZF9maXJzdD0wCiByZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT11bmtub3duCitjb2xvcl9zcGFjZT11bmtub3duCitjb2xvcl9wcmltYXJpZXM9dW5rbm93bgorY29sb3JfdHJhbnNmZXI9dW5rbm93bgorY2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMucGFja2V0LjEzXQogY29kZWNfdHlwZT12aWRlbwpAQCAtNDk2LDggKzUzMSw4IEBACiBjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0EKIGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BCiBzaXplPTMwMDAwCi1wb3M9MTAyNDgwMQotZmxhZ3M9SworcG9zPTEwMjM1NDQKK2ZsYWdzPUtfCiAKIFtwYWNrZXRzX2FuZF9mcmFtZXMuZnJhbWUuMTNdCiBtZWRpYV90eXBlPXZpZGVvCkBAIC01MTEsNyArNTQ2LDcgQEAKIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMTIwMDAwCiBwa3RfZHVyYXRpb249MjA0OAogcGt0X2R1cmF0aW9uX3RpbWU9MC4wNDAwMDAKLXBrdF9wb3M9MTAyNDgwMQorcGt0X3Bvcz0xMDIzNTQ0CiBwa3Rfc2l6ZT0zMDAwMAogd2lkdGg9MTAwCiBoZWlnaHQ9MTAwCkBAIC01MjMsNiArNTU4LDExIEBACiBpbnRlcmxhY2VkX2ZyYW1lPTAKIHRvcF9maWVsZF9maXJzdD0wCiByZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT11bmtub3duCitjb2xvcl9zcGFjZT11bmtub3duCitjb2xvcl9wcmltYXJpZXM9dW5rbm93bgorY29sb3JfdHJhbnNmZXI9dW5rbm93bgorY2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCiAKIFtzdHJlYW1zLnN0cmVhbS4wXQogaW5kZXg9MApAQCAtNTY0LDYgKzYwNCw3IEBACiB2aXN1YWxfaW1wYWlyZWQ9MAogY2xlYW5fZWZmZWN0cz0wCiBhdHRhY2hlZF9waWM9MAordGltZWRfdGh1bWJuYWlscz0wCiAKIFtzdHJlYW1zLnN0cmVhbS4wLnRhZ3NdCiBFPW1jwrIKQEAgLTU3NCw3ICs2MTUsNyBAQAogY29kZWNfbmFtZT1yYXd2aWRlbwogcHJvZmlsZT11bmtub3duCiBjb2RlY190eXBlPXZpZGVvCi1jb2RlY190aW1lX2Jhc2U9MS81MTIwMAorY29kZWNfdGltZV9iYXNlPTEvMjUKIGNvZGVjX3RhZ19zdHJpbmc9UkdCWzI0XQogY29kZWNfdGFnPTB4MTg0MjQ3NTIKIHdpZHRoPTMyMApAQCAtNTg2LDExICs2MjcsMTIgQEAKIGRpc3BsYXlfYXNwZWN0X3JhdGlvPTRcOjMKIHBpeF9mbXQ9cmdiMjQKIGxldmVsPS05OQotY29sb3JfcmFuZ2U9Ti9BCitjb2xvcl9yYW5nZT11bmtub3duCiBjb2xvcl9zcGFjZT11bmtub3duCiBjb2xvcl90cmFuc2Zlcj11bmtub3duCiBjb2xvcl9wcmltYXJpZXM9dW5rbm93bgogY2hyb21hX2xvY2F0aW9uPXVuc3BlY2lmaWVkCitmaWVsZF9vcmRlcj11bmtub3duCiB0aW1lY29kZT1OL0EKIHJlZnM9MQogaWQ9Ti9BCkBAIC02MjAsNiArNjYyLDcgQEAKIHZpc3VhbF9pbXBhaXJlZD0wCiBjbGVhbl9lZmZlY3RzPTAKIGF0dGFjaGVkX3BpYz0wCit0aW1lZF90aHVtYm5haWxzPTAKIAogW3N0cmVhbXMuc3RyZWFtLjEudGFnc10KIHRpdGxlPWZvb2JhcgpAQCAtNjMxLDcgKzY3NCw3IEBACiBjb2RlY19uYW1lPXJhd3ZpZGVvCiBwcm9maWxlPXVua25vd24KIGNvZGVjX3R5cGU9dmlkZW8KLWNvZGVjX3RpbWVfYmFzZT0xLzUxMjAwCitjb2RlY190aW1lX2Jhc2U9MS8yNQogY29kZWNfdGFnX3N0cmluZz1SR0JbMjRdCiBjb2RlY190YWc9MHgxODQyNDc1Mgogd2lkdGg9MTAwCkBAIC02NDMsMTEgKzY4NiwxMiBAQAogZGlzcGxheV9hc3BlY3RfcmF0aW89MVw6MQogcGl4X2ZtdD1yZ2IyNAogbGV2ZWw9LTk5Ci1jb2xvcl9yYW5nZT1OL0EKK2NvbG9yX3JhbmdlPXVua25vd24KIGNvbG9yX3NwYWNlPXVua25vd24KIGNvbG9yX3RyYW5zZmVyPXVua25vd24KIGNvbG9yX3ByaW1hcmllcz11bmtub3duCiBjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK2ZpZWxkX29yZGVyPXVua25vd24KIHRpbWVjb2RlPU4vQQogcmVmcz0xCiBpZD1OL0EKQEAgLTY3Nyw2ICs3MjEsNyBAQAogdmlzdWFsX2ltcGFpcmVkPTAKIGNsZWFuX2VmZmVjdHM9MAogYXR0YWNoZWRfcGljPTAKK3RpbWVkX3RodW1ibmFpbHM9MAogCiBbc3RyZWFtcy5zdHJlYW0uMi50YWdzXQogZW5jb2Rlcj1MYXZjIHJhd3ZpZGVvCkBAIC02ODgsOCArNzMzLDggQEAKIGZvcm1hdF9uYW1lPW51dAogc3RhcnRfdGltZT0wLjAwMDAwMAogZHVyYXRpb249MC4xMjAwMDAKLXNpemU9MTA1NDg4MgotYml0X3JhdGU9NzAzMjU0NjYKK3NpemU9MTA1MzYyNAorYml0X3JhdGU9NzAyNDE2MDAKIHByb2JlX3Njb3JlPTEwMAogCiBbZm9ybWF0LnRhZ3NdCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2pzb24gYi90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX2pzb24KaW5kZXggNjQxMDhjZS4uNGJiOTNkMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV9qc29uCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZmcHJvYmVfanNvbgpAQCAtMTEsOCArMTEsOCBAQAogICAgICAgICAgICAgImR1cmF0aW9uIjogMTAyNCwKICAgICAgICAgICAgICJkdXJhdGlvbl90aW1lIjogIjAuMDIzMjIwIiwKICAgICAgICAgICAgICJzaXplIjogIjIwNDgiLAotICAgICAgICAgICAgInBvcyI6ICI2NDIiLAotICAgICAgICAgICAgImZsYWdzIjogIksiCisgICAgICAgICAgICAicG9zIjogIjY0NyIsCisgICAgICAgICAgICAiZmxhZ3MiOiAiS18iCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJ0eXBlIjogImZyYW1lIiwKQEAgLTI3LDcgKzI3LDcgQEAKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSI6ICIwLjAwMDAwMCIsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMTAyNCwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb25fdGltZSI6ICIwLjAyMzIyMCIsCi0gICAgICAgICAgICAicGt0X3BvcyI6ICI2NDIiLAorICAgICAgICAgICAgInBrdF9wb3MiOiAiNjQ3IiwKICAgICAgICAgICAgICJwa3Rfc2l6ZSI6ICIyMDQ4IiwKICAgICAgICAgICAgICJzYW1wbGVfZm10IjogInMxNiIsCiAgICAgICAgICAgICAibmJfc2FtcGxlcyI6IDEwMjQsCkBAIC00NCw4ICs0NCw4IEBACiAgICAgICAgICAgICAiZHVyYXRpb24iOiAyMDQ4LAogICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wNDAwMDAiLAogICAgICAgICAgICAgInNpemUiOiAiMjMwNDAwIiwKLSAgICAgICAgICAgICJwb3MiOiAiMjcxNyIsCi0gICAgICAgICAgICAiZmxhZ3MiOiAiSyIKKyAgICAgICAgICAgICJwb3MiOiAiMjcyMiIsCisgICAgICAgICAgICAiZmxhZ3MiOiAiS18iCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJ0eXBlIjogImZyYW1lIiwKQEAgLTYwLDcgKzYwLDcgQEAKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSI6ICIwLjAwMDAwMCIsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb25fdGltZSI6ICIwLjA0MDAwMCIsCi0gICAgICAgICAgICAicGt0X3BvcyI6ICIyNzE3IiwKKyAgICAgICAgICAgICJwa3RfcG9zIjogIjI3MjIiLAogICAgICAgICAgICAgInBrdF9zaXplIjogIjIzMDQwMCIsCiAgICAgICAgICAgICAid2lkdGgiOiAzMjAsCiAgICAgICAgICAgICAiaGVpZ2h0IjogMjQwLApAQCAtODQsOCArODQsOCBAQAogICAgICAgICAgICAgImR1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJkdXJhdGlvbl90aW1lIjogIjAuMDQwMDAwIiwKICAgICAgICAgICAgICJzaXplIjogIjMwMDAwIiwKLSAgICAgICAgICAgICJwb3MiOiAiMjMzMTM4IiwKLSAgICAgICAgICAgICJmbGFncyI6ICJLIgorICAgICAgICAgICAgInBvcyI6ICIyMzMxNDMiLAorICAgICAgICAgICAgImZsYWdzIjogIktfIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAidHlwZSI6ICJmcmFtZSIsCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSI6ICIwLjAwMDAwMCIsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb25fdGltZSI6ICIwLjA0MDAwMCIsCi0gICAgICAgICAgICAicGt0X3BvcyI6ICIyMzMxMzgiLAorICAgICAgICAgICAgInBrdF9wb3MiOiAiMjMzMTQzIiwKICAgICAgICAgICAgICJwa3Rfc2l6ZSI6ICIzMDAwMCIsCiAgICAgICAgICAgICAid2lkdGgiOiAxMDAsCiAgICAgICAgICAgICAiaGVpZ2h0IjogMTAwLApAQCAtMTI0LDggKzEyNCw4IEBACiAgICAgICAgICAgICAiZHVyYXRpb24iOiAxMDI0LAogICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAogICAgICAgICAgICAgInNpemUiOiAiMjA0OCIsCi0gICAgICAgICAgICAicG9zIjogIjI2MzE0MyIsCi0gICAgICAgICAgICAiZmxhZ3MiOiAiSyIKKyAgICAgICAgICAgICJwb3MiOiAiMjYzMTQ4IiwKKyAgICAgICAgICAgICJmbGFncyI6ICJLXyIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgInR5cGUiOiAiZnJhbWUiLApAQCAtMTQwLDcgKzE0MCw3IEBACiAgICAgICAgICAgICAiYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWUiOiAiMC4wMjMyMjAiLAogICAgICAgICAgICAgInBrdF9kdXJhdGlvbiI6IDEwMjQsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAotICAgICAgICAgICAgInBrdF9wb3MiOiAiMjYzMTQzIiwKKyAgICAgICAgICAgICJwa3RfcG9zIjogIjI2MzE0OCIsCiAgICAgICAgICAgICAicGt0X3NpemUiOiAiMjA0OCIsCiAgICAgICAgICAgICAic2FtcGxlX2ZtdCI6ICJzMTYiLAogICAgICAgICAgICAgIm5iX3NhbXBsZXMiOiAxMDI0LApAQCAtMTU3LDggKzE1Nyw4IEBACiAgICAgICAgICAgICAiZHVyYXRpb24iOiAyMDQ4LAogICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wNDAwMDAiLAogICAgICAgICAgICAgInNpemUiOiAiMjMwNDAwIiwKLSAgICAgICAgICAgICJwb3MiOiAiMjY1MjIxIiwKLSAgICAgICAgICAgICJmbGFncyI6ICJLIgorICAgICAgICAgICAgInBvcyI6ICIyNjUyMjYiLAorICAgICAgICAgICAgImZsYWdzIjogIktfIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAidHlwZSI6ICJmcmFtZSIsCkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSI6ICIwLjA0MDAwMCIsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb25fdGltZSI6ICIwLjA0MDAwMCIsCi0gICAgICAgICAgICAicGt0X3BvcyI6ICIyNjUyMjEiLAorICAgICAgICAgICAgInBrdF9wb3MiOiAiMjY1MjI2IiwKICAgICAgICAgICAgICJwa3Rfc2l6ZSI6ICIyMzA0MDAiLAogICAgICAgICAgICAgIndpZHRoIjogMzIwLAogICAgICAgICAgICAgImhlaWdodCI6IDI0MCwKQEAgLTE5Nyw4ICsxOTcsOCBAQAogICAgICAgICAgICAgImR1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJkdXJhdGlvbl90aW1lIjogIjAuMDQwMDAwIiwKICAgICAgICAgICAgICJzaXplIjogIjMwMDAwIiwKLSAgICAgICAgICAgICJwb3MiOiAiNDk1NjQ1IiwKLSAgICAgICAgICAgICJmbGFncyI6ICJLIgorICAgICAgICAgICAgInBvcyI6ICI0OTU2NTAiLAorICAgICAgICAgICAgImZsYWdzIjogIktfIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAidHlwZSI6ICJmcmFtZSIsCkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSI6ICIwLjA0MDAwMCIsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb25fdGltZSI6ICIwLjA0MDAwMCIsCi0gICAgICAgICAgICAicGt0X3BvcyI6ICI0OTU2NDUiLAorICAgICAgICAgICAgInBrdF9wb3MiOiAiNDk1NjUwIiwKICAgICAgICAgICAgICJwa3Rfc2l6ZSI6ICIzMDAwMCIsCiAgICAgICAgICAgICAid2lkdGgiOiAxMDAsCiAgICAgICAgICAgICAiaGVpZ2h0IjogMTAwLApAQCAtMjM3LDggKzIzNyw4IEBACiAgICAgICAgICAgICAiZHVyYXRpb24iOiAxMDI0LAogICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAogICAgICAgICAgICAgInNpemUiOiAiMjA0OCIsCi0gICAgICAgICAgICAicG9zIjogIjUyNTY1MCIsCi0gICAgICAgICAgICAiZmxhZ3MiOiAiSyIKKyAgICAgICAgICAgICJwb3MiOiAiNTI1NjU1IiwKKyAgICAgICAgICAgICJmbGFncyI6ICJLXyIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgInR5cGUiOiAiZnJhbWUiLApAQCAtMjUzLDcgKzI1Myw3IEBACiAgICAgICAgICAgICAiYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWUiOiAiMC4wNDY0NDAiLAogICAgICAgICAgICAgInBrdF9kdXJhdGlvbiI6IDEwMjQsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAotICAgICAgICAgICAgInBrdF9wb3MiOiAiNTI1NjUwIiwKKyAgICAgICAgICAgICJwa3RfcG9zIjogIjUyNTY1NSIsCiAgICAgICAgICAgICAicGt0X3NpemUiOiAiMjA0OCIsCiAgICAgICAgICAgICAic2FtcGxlX2ZtdCI6ICJzMTYiLAogICAgICAgICAgICAgIm5iX3NhbXBsZXMiOiAxMDI0LApAQCAtMjcwLDggKzI3MCw4IEBACiAgICAgICAgICAgICAiZHVyYXRpb24iOiAxMDI0LAogICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAogICAgICAgICAgICAgInNpemUiOiAiMjA0OCIsCi0gICAgICAgICAgICAicG9zIjogIjUyNzcyMSIsCi0gICAgICAgICAgICAiZmxhZ3MiOiAiSyIKKyAgICAgICAgICAgICJwb3MiOiAiNTI3NzI2IiwKKyAgICAgICAgICAgICJmbGFncyI6ICJLXyIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgInR5cGUiOiAiZnJhbWUiLApAQCAtMjg2LDcgKzI4Niw3IEBACiAgICAgICAgICAgICAiYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWUiOiAiMC4wNjk2NjAiLAogICAgICAgICAgICAgInBrdF9kdXJhdGlvbiI6IDEwMjQsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAotICAgICAgICAgICAgInBrdF9wb3MiOiAiNTI3NzIxIiwKKyAgICAgICAgICAgICJwa3RfcG9zIjogIjUyNzcyNiIsCiAgICAgICAgICAgICAicGt0X3NpemUiOiAiMjA0OCIsCiAgICAgICAgICAgICAic2FtcGxlX2ZtdCI6ICJzMTYiLAogICAgICAgICAgICAgIm5iX3NhbXBsZXMiOiAxMDI0LApAQCAtMzAzLDggKzMwMyw4IEBACiAgICAgICAgICAgICAiZHVyYXRpb24iOiAyMDQ4LAogICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wNDAwMDAiLAogICAgICAgICAgICAgInNpemUiOiAiMjMwNDAwIiwKLSAgICAgICAgICAgICJwb3MiOiAiNTI5Nzk5IiwKLSAgICAgICAgICAgICJmbGFncyI6ICJLIgorICAgICAgICAgICAgInBvcyI6ICI1Mjk4MDQiLAorICAgICAgICAgICAgImZsYWdzIjogIktfIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAidHlwZSI6ICJmcmFtZSIsCkBAIC0zMTksNyArMzE5LDcgQEAKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSI6ICIwLjA4MDAwMCIsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb25fdGltZSI6ICIwLjA0MDAwMCIsCi0gICAgICAgICAgICAicGt0X3BvcyI6ICI1Mjk3OTkiLAorICAgICAgICAgICAgInBrdF9wb3MiOiAiNTI5ODA0IiwKICAgICAgICAgICAgICJwa3Rfc2l6ZSI6ICIyMzA0MDAiLAogICAgICAgICAgICAgIndpZHRoIjogMzIwLAogICAgICAgICAgICAgImhlaWdodCI6IDI0MCwKQEAgLTM0Myw4ICszNDMsOCBAQAogICAgICAgICAgICAgImR1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJkdXJhdGlvbl90aW1lIjogIjAuMDQwMDAwIiwKICAgICAgICAgICAgICJzaXplIjogIjMwMDAwIiwKLSAgICAgICAgICAgICJwb3MiOiAiNzYwMjIzIiwKLSAgICAgICAgICAgICJmbGFncyI6ICJLIgorICAgICAgICAgICAgInBvcyI6ICI3NjAyMjgiLAorICAgICAgICAgICAgImZsYWdzIjogIktfIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAidHlwZSI6ICJmcmFtZSIsCkBAIC0zNTksNyArMzU5LDcgQEAKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSI6ICIwLjA4MDAwMCIsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb25fdGltZSI6ICIwLjA0MDAwMCIsCi0gICAgICAgICAgICAicGt0X3BvcyI6ICI3NjAyMjMiLAorICAgICAgICAgICAgInBrdF9wb3MiOiAiNzYwMjI4IiwKICAgICAgICAgICAgICJwa3Rfc2l6ZSI6ICIzMDAwMCIsCiAgICAgICAgICAgICAid2lkdGgiOiAxMDAsCiAgICAgICAgICAgICAiaGVpZ2h0IjogMTAwLApAQCAtMzgzLDggKzM4Myw4IEBACiAgICAgICAgICAgICAiZHVyYXRpb24iOiAxMDI0LAogICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAogICAgICAgICAgICAgInNpemUiOiAiMjA0OCIsCi0gICAgICAgICAgICAicG9zIjogIjc5MDIyOCIsCi0gICAgICAgICAgICAiZmxhZ3MiOiAiSyIKKyAgICAgICAgICAgICJwb3MiOiAiNzkwMjMzIiwKKyAgICAgICAgICAgICJmbGFncyI6ICJLXyIKICAgICAgICAgfSwKICAgICAgICAgewogICAgICAgICAgICAgInR5cGUiOiAiZnJhbWUiLApAQCAtMzk5LDcgKzM5OSw3IEBACiAgICAgICAgICAgICAiYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWUiOiAiMC4wOTI4ODAiLAogICAgICAgICAgICAgInBrdF9kdXJhdGlvbiI6IDEwMjQsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAotICAgICAgICAgICAgInBrdF9wb3MiOiAiNzkwMjI4IiwKKyAgICAgICAgICAgICJwa3RfcG9zIjogIjc5MDIzMyIsCiAgICAgICAgICAgICAicGt0X3NpemUiOiAiMjA0OCIsCiAgICAgICAgICAgICAic2FtcGxlX2ZtdCI6ICJzMTYiLAogICAgICAgICAgICAgIm5iX3NhbXBsZXMiOiAxMDI0LApAQCAtNDEzLDExICs0MTMsMTEgQEAKICAgICAgICAgICAgICJwdHNfdGltZSI6ICIwLjExNjEwMCIsCiAgICAgICAgICAgICAiZHRzIjogNTEyMCwKICAgICAgICAgICAgICJkdHNfdGltZSI6ICIwLjExNjEwMCIsCi0gICAgICAgICAgICAiZHVyYXRpb24iOiAxMDI0LAotICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wMjMyMjAiLAotICAgICAgICAgICAgInNpemUiOiAiMjA0OCIsCi0gICAgICAgICAgICAicG9zIjogIjc5MjI5OSIsCi0gICAgICAgICAgICAiZmxhZ3MiOiAiSyIKKyAgICAgICAgICAgICJkdXJhdGlvbiI6IDM5MywKKyAgICAgICAgICAgICJkdXJhdGlvbl90aW1lIjogIjAuMDA4OTEyIiwKKyAgICAgICAgICAgICJzaXplIjogIjc4NiIsCisgICAgICAgICAgICAicG9zIjogIjc5MjMwNCIsCisgICAgICAgICAgICAiZmxhZ3MiOiAiS18iCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJ0eXBlIjogImZyYW1lIiwKQEAgLTQzMCwxMiArNDMwLDEyIEBACiAgICAgICAgICAgICAicGt0X2R0c190aW1lIjogIjAuMTE2MTAwIiwKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXAiOiA1MTIwLAogICAgICAgICAgICAgImJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lIjogIjAuMTE2MTAwIiwKLSAgICAgICAgICAgICJwa3RfZHVyYXRpb24iOiAxMDI0LAotICAgICAgICAgICAgInBrdF9kdXJhdGlvbl90aW1lIjogIjAuMDIzMjIwIiwKLSAgICAgICAgICAgICJwa3RfcG9zIjogIjc5MjI5OSIsCi0gICAgICAgICAgICAicGt0X3NpemUiOiAiMjA0OCIsCisgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMzkzLAorICAgICAgICAgICAgInBrdF9kdXJhdGlvbl90aW1lIjogIjAuMDA4OTEyIiwKKyAgICAgICAgICAgICJwa3RfcG9zIjogIjc5MjMwNCIsCisgICAgICAgICAgICAicGt0X3NpemUiOiAiNzg2IiwKICAgICAgICAgICAgICJzYW1wbGVfZm10IjogInMxNiIsCi0gICAgICAgICAgICAibmJfc2FtcGxlcyI6IDEwMjQsCisgICAgICAgICAgICAibmJfc2FtcGxlcyI6IDM5MywKICAgICAgICAgICAgICJjaGFubmVscyI6IDEKICAgICAgICAgfSwKICAgICAgICAgewpAQCAtNDQ5LDggKzQ0OSw4IEBACiAgICAgICAgICAgICAiZHVyYXRpb24iOiAyMDQ4LAogICAgICAgICAgICAgImR1cmF0aW9uX3RpbWUiOiAiMC4wNDAwMDAiLAogICAgICAgICAgICAgInNpemUiOiAiMjMwNDAwIiwKLSAgICAgICAgICAgICJwb3MiOiAiNzk0Mzc3IiwKLSAgICAgICAgICAgICJmbGFncyI6ICJLIgorICAgICAgICAgICAgInBvcyI6ICI3OTMxMjAiLAorICAgICAgICAgICAgImZsYWdzIjogIktfIgogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgICAidHlwZSI6ICJmcmFtZSIsCkBAIC00NjUsNyArNDY1LDcgQEAKICAgICAgICAgICAgICJiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZSI6ICIwLjEyMDAwMCIsCiAgICAgICAgICAgICAicGt0X2R1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb25fdGltZSI6ICIwLjA0MDAwMCIsCi0gICAgICAgICAgICAicGt0X3BvcyI6ICI3OTQzNzciLAorICAgICAgICAgICAgInBrdF9wb3MiOiAiNzkzMTIwIiwKICAgICAgICAgICAgICJwa3Rfc2l6ZSI6ICIyMzA0MDAiLAogICAgICAgICAgICAgIndpZHRoIjogMzIwLAogICAgICAgICAgICAgImhlaWdodCI6IDI0MCwKQEAgLTQ4OSw4ICs0ODksOCBAQAogICAgICAgICAgICAgImR1cmF0aW9uIjogMjA0OCwKICAgICAgICAgICAgICJkdXJhdGlvbl90aW1lIjogIjAuMDQwMDAwIiwKICAgICAgICAgICAgICJzaXplIjogIjMwMDAwIiwKLSAgICAgICAgICAgICJwb3MiOiAiMTAyNDgwMSIsCi0gICAgICAgICAgICAiZmxhZ3MiOiAiSyIKKyAgICAgICAgICAgICJwb3MiOiAiMTAyMzU0NCIsCisgICAgICAgICAgICAiZmxhZ3MiOiAiS18iCiAgICAgICAgIH0sCiAgICAgICAgIHsKICAgICAgICAgICAgICJ0eXBlIjogImZyYW1lIiwKQEAgLTUwNSw3ICs1MDUsNyBAQAogICAgICAgICAgICAgImJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lIjogIjAuMTIwMDAwIiwKICAgICAgICAgICAgICJwa3RfZHVyYXRpb24iOiAyMDQ4LAogICAgICAgICAgICAgInBrdF9kdXJhdGlvbl90aW1lIjogIjAuMDQwMDAwIiwKLSAgICAgICAgICAgICJwa3RfcG9zIjogIjEwMjQ4MDEiLAorICAgICAgICAgICAgInBrdF9wb3MiOiAiMTAyMzU0NCIsCiAgICAgICAgICAgICAicGt0X3NpemUiOiAiMzAwMDAiLAogICAgICAgICAgICAgIndpZHRoIjogMTAwLAogICAgICAgICAgICAgImhlaWdodCI6IDEwMCwKQEAgLTU1MCw3ICs1NTAsOCBAQAogICAgICAgICAgICAgICAgICJoZWFyaW5nX2ltcGFpcmVkIjogMCwKICAgICAgICAgICAgICAgICAidmlzdWFsX2ltcGFpcmVkIjogMCwKICAgICAgICAgICAgICAgICAiY2xlYW5fZWZmZWN0cyI6IDAsCi0gICAgICAgICAgICAgICAgImF0dGFjaGVkX3BpYyI6IDAKKyAgICAgICAgICAgICAgICAiYXR0YWNoZWRfcGljIjogMCwKKyAgICAgICAgICAgICAgICAidGltZWRfdGh1bWJuYWlscyI6IDAKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAidGFncyI6IHsKICAgICAgICAgICAgICAgICAiRSI6ICJtY8KyIiwKQEAgLTU2MSw3ICs1NjIsNyBAQAogICAgICAgICAgICAgImluZGV4IjogMSwKICAgICAgICAgICAgICJjb2RlY19uYW1lIjogInJhd3ZpZGVvIiwKICAgICAgICAgICAgICJjb2RlY190eXBlIjogInZpZGVvIiwKLSAgICAgICAgICAgICJjb2RlY190aW1lX2Jhc2UiOiAiMS81MTIwMCIsCisgICAgICAgICAgICAiY29kZWNfdGltZV9iYXNlIjogIjEvMjUiLAogICAgICAgICAgICAgImNvZGVjX3RhZ19zdHJpbmciOiAiUkdCWzI0XSIsCiAgICAgICAgICAgICAiY29kZWNfdGFnIjogIjB4MTg0MjQ3NTIiLAogICAgICAgICAgICAgIndpZHRoIjogMzIwLApAQCAtNTkyLDcgKzU5Myw4IEBACiAgICAgICAgICAgICAgICAgImhlYXJpbmdfaW1wYWlyZWQiOiAwLAogICAgICAgICAgICAgICAgICJ2aXN1YWxfaW1wYWlyZWQiOiAwLAogICAgICAgICAgICAgICAgICJjbGVhbl9lZmZlY3RzIjogMCwKLSAgICAgICAgICAgICAgICAiYXR0YWNoZWRfcGljIjogMAorICAgICAgICAgICAgICAgICJhdHRhY2hlZF9waWMiOiAwLAorICAgICAgICAgICAgICAgICJ0aW1lZF90aHVtYm5haWxzIjogMAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgICJ0YWdzIjogewogICAgICAgICAgICAgICAgICJ0aXRsZSI6ICJmb29iYXIiLApAQCAtNjA0LDcgKzYwNiw3IEBACiAgICAgICAgICAgICAiaW5kZXgiOiAyLAogICAgICAgICAgICAgImNvZGVjX25hbWUiOiAicmF3dmlkZW8iLAogICAgICAgICAgICAgImNvZGVjX3R5cGUiOiAidmlkZW8iLAotICAgICAgICAgICAgImNvZGVjX3RpbWVfYmFzZSI6ICIxLzUxMjAwIiwKKyAgICAgICAgICAgICJjb2RlY190aW1lX2Jhc2UiOiAiMS8yNSIsCiAgICAgICAgICAgICAiY29kZWNfdGFnX3N0cmluZyI6ICJSR0JbMjRdIiwKICAgICAgICAgICAgICJjb2RlY190YWciOiAiMHgxODQyNDc1MiIsCiAgICAgICAgICAgICAid2lkdGgiOiAxMDAsCkBAIC02MzUsNyArNjM3LDggQEAKICAgICAgICAgICAgICAgICAiaGVhcmluZ19pbXBhaXJlZCI6IDAsCiAgICAgICAgICAgICAgICAgInZpc3VhbF9pbXBhaXJlZCI6IDAsCiAgICAgICAgICAgICAgICAgImNsZWFuX2VmZmVjdHMiOiAwLAotICAgICAgICAgICAgICAgICJhdHRhY2hlZF9waWMiOiAwCisgICAgICAgICAgICAgICAgImF0dGFjaGVkX3BpYyI6IDAsCisgICAgICAgICAgICAgICAgInRpbWVkX3RodW1ibmFpbHMiOiAwCiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgInRhZ3MiOiB7CiAgICAgICAgICAgICAgICAgImVuY29kZXIiOiAiTGF2YyByYXd2aWRlbyIKQEAgLTY0OSw4ICs2NTIsOCBAQAogICAgICAgICAiZm9ybWF0X25hbWUiOiAibnV0IiwKICAgICAgICAgInN0YXJ0X3RpbWUiOiAiMC4wMDAwMDAiLAogICAgICAgICAiZHVyYXRpb24iOiAiMC4xMjAwMDAiLAotICAgICAgICAic2l6ZSI6ICIxMDU0ODgyIiwKLSAgICAgICAgImJpdF9yYXRlIjogIjcwMzI1NDY2IiwKKyAgICAgICAgInNpemUiOiAiMTA1MzYyNCIsCisgICAgICAgICJiaXRfcmF0ZSI6ICI3MDI0MTYwMCIsCiAgICAgICAgICJwcm9iZV9zY29yZSI6IDEwMCwKICAgICAgICAgInRhZ3MiOiB7CiAgICAgICAgICAgICAidGl0bGUiOiAiZmZwcm9iZSB0ZXN0IGZpbGUiLApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmZwcm9iZV94bWwgYi90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX3htbAppbmRleCAyZmRkODFiLi5kMmM1ZWNkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX3htbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9mZnByb2JlX3htbApAQCAtMSw1NSArMSw1NSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KIDxmZnByb2JlPgogICAgIDxwYWNrZXRzX2FuZF9mcmFtZXM+Ci0gICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIgcHRzPSIwIiBwdHNfdGltZT0iMC4wMDAwMDAiIGR0cz0iMCIgZHRzX3RpbWU9IjAuMDAwMDAwIiBkdXJhdGlvbj0iMTAyNCIgZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiIHNpemU9IjIwNDgiIHBvcz0iNjQyIiBmbGFncz0iSyIvPgotICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSIwIiBwa3RfcHRzX3RpbWU9IjAuMDAwMDAwIiBwa3RfZHRzPSIwIiBwa3RfZHRzX3RpbWU9IjAuMDAwMDAwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjAwMDAwMCIgcGt0X2R1cmF0aW9uPSIxMDI0IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiIHBrdF9wb3M9IjY0MiIgcGt0X3NpemU9IjIwNDgiIHNhbXBsZV9mbXQ9InMxNiIgbmJfc2FtcGxlcz0iMTAyNCIgY2hhbm5lbHM9IjEiLz4KLSAgICAgICAgPHBhY2tldCBjb2RlY190eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIxIiBwdHM9IjAiIHB0c190aW1lPSIwLjAwMDAwMCIgZHRzPSIwIiBkdHNfdGltZT0iMC4wMDAwMDAiIGR1cmF0aW9uPSIyMDQ4IiBkdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgc2l6ZT0iMjMwNDAwIiBwb3M9IjI3MTciIGZsYWdzPSJLIi8+Ci0gICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIxIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjAiIHBrdF9wdHNfdGltZT0iMC4wMDAwMDAiIHBrdF9kdHM9IjAiIHBrdF9kdHNfdGltZT0iMC4wMDAwMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDAwMDAwIiBwa3RfZHVyYXRpb249IjIwNDgiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgcGt0X3Bvcz0iMjcxNyIgcGt0X3NpemU9IjIzMDQwMCIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiIHBpeF9mbXQ9InJnYjI0IiBzYW1wbGVfYXNwZWN0X3JhdGlvPSIxOjEiIHBpY3RfdHlwZT0iSSIgY29kZWRfcGljdHVyZV9udW1iZXI9IjAiIGRpc3BsYXlfcGljdHVyZV9udW1iZXI9IjAiIGludGVybGFjZWRfZnJhbWU9IjAiIHRvcF9maWVsZF9maXJzdD0iMCIgcmVwZWF0X3BpY3Q9IjAiLz4KLSAgICAgICAgPHBhY2tldCBjb2RlY190eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIyIiBwdHM9IjAiIHB0c190aW1lPSIwLjAwMDAwMCIgZHRzPSIwIiBkdHNfdGltZT0iMC4wMDAwMDAiIGR1cmF0aW9uPSIyMDQ4IiBkdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgc2l6ZT0iMzAwMDAiIHBvcz0iMjMzMTM4IiBmbGFncz0iSyIvPgotICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMiIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSIwIiBwa3RfcHRzX3RpbWU9IjAuMDAwMDAwIiBwa3RfZHRzPSIwIiBwa3RfZHRzX3RpbWU9IjAuMDAwMDAwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjAwMDAwMCIgcGt0X2R1cmF0aW9uPSIyMDQ4IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHBrdF9wb3M9IjIzMzEzOCIgcGt0X3NpemU9IjMwMDAwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgcGl4X2ZtdD0icmdiMjQiIHNhbXBsZV9hc3BlY3RfcmF0aW89IjE6MSIgcGljdF90eXBlPSJJIiBjb2RlZF9waWN0dXJlX251bWJlcj0iMCIgZGlzcGxheV9waWN0dXJlX251bWJlcj0iMCIgaW50ZXJsYWNlZF9mcmFtZT0iMCIgdG9wX2ZpZWxkX2ZpcnN0PSIwIiByZXBlYXRfcGljdD0iMCIvPgotICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9ImF1ZGlvIiBzdHJlYW1faW5kZXg9IjAiIHB0cz0iMTAyNCIgcHRzX3RpbWU9IjAuMDIzMjIwIiBkdHM9IjEwMjQiIGR0c190aW1lPSIwLjAyMzIyMCIgZHVyYXRpb249IjEwMjQiIGR1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIiBzaXplPSIyMDQ4IiBwb3M9IjI2MzE0MyIgZmxhZ3M9IksiLz4KLSAgICAgICAgPGZyYW1lIG1lZGlhX3R5cGU9ImF1ZGlvIiBzdHJlYW1faW5kZXg9IjAiIGtleV9mcmFtZT0iMSIgcGt0X3B0cz0iMTAyNCIgcGt0X3B0c190aW1lPSIwLjAyMzIyMCIgcGt0X2R0cz0iMTAyNCIgcGt0X2R0c190aW1lPSIwLjAyMzIyMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wPSIxMDI0IiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wMjMyMjAiIHBrdF9kdXJhdGlvbj0iMTAyNCIgcGt0X2R1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIiBwa3RfcG9zPSIyNjMxNDMiIHBrdF9zaXplPSIyMDQ4IiBzYW1wbGVfZm10PSJzMTYiIG5iX3NhbXBsZXM9IjEwMjQiIGNoYW5uZWxzPSIxIi8+Ci0gICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMSIgcHRzPSIyMDQ4IiBwdHNfdGltZT0iMC4wNDAwMDAiIGR0cz0iMjA0OCIgZHRzX3RpbWU9IjAuMDQwMDAwIiBkdXJhdGlvbj0iMjA0OCIgZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHNpemU9IjIzMDQwMCIgcG9zPSIyNjUyMjEiIGZsYWdzPSJLIi8+Ci0gICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIxIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjIwNDgiIHBrdF9wdHNfdGltZT0iMC4wNDAwMDAiIHBrdF9kdHM9IjIwNDgiIHBrdF9kdHNfdGltZT0iMC4wNDAwMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMjA0OCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDQwMDAwIiBwa3RfZHVyYXRpb249IjIwNDgiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgcGt0X3Bvcz0iMjY1MjIxIiBwa3Rfc2l6ZT0iMjMwNDAwIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI0MCIgcGl4X2ZtdD0icmdiMjQiIHNhbXBsZV9hc3BlY3RfcmF0aW89IjE6MSIgcGljdF90eXBlPSJJIiBjb2RlZF9waWN0dXJlX251bWJlcj0iMCIgZGlzcGxheV9waWN0dXJlX251bWJlcj0iMCIgaW50ZXJsYWNlZF9mcmFtZT0iMCIgdG9wX2ZpZWxkX2ZpcnN0PSIwIiByZXBlYXRfcGljdD0iMCIvPgotICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjIiIHB0cz0iMjA0OCIgcHRzX3RpbWU9IjAuMDQwMDAwIiBkdHM9IjIwNDgiIGR0c190aW1lPSIwLjA0MDAwMCIgZHVyYXRpb249IjIwNDgiIGR1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBzaXplPSIzMDAwMCIgcG9zPSI0OTU2NDUiIGZsYWdzPSJLIi8+Ci0gICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIyIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjIwNDgiIHBrdF9wdHNfdGltZT0iMC4wNDAwMDAiIHBrdF9kdHM9IjIwNDgiIHBrdF9kdHNfdGltZT0iMC4wNDAwMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMjA0OCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDQwMDAwIiBwa3RfZHVyYXRpb249IjIwNDgiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgcGt0X3Bvcz0iNDk1NjQ1IiBwa3Rfc2l6ZT0iMzAwMDAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBwaXhfZm10PSJyZ2IyNCIgc2FtcGxlX2FzcGVjdF9yYXRpbz0iMToxIiBwaWN0X3R5cGU9IkkiIGNvZGVkX3BpY3R1cmVfbnVtYmVyPSIwIiBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPSIwIiBpbnRlcmxhY2VkX2ZyYW1lPSIwIiB0b3BfZmllbGRfZmlyc3Q9IjAiIHJlcGVhdF9waWN0PSIwIi8+Ci0gICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIgcHRzPSIyMDQ4IiBwdHNfdGltZT0iMC4wNDY0NDAiIGR0cz0iMjA0OCIgZHRzX3RpbWU9IjAuMDQ2NDQwIiBkdXJhdGlvbj0iMTAyNCIgZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiIHNpemU9IjIwNDgiIHBvcz0iNTI1NjUwIiBmbGFncz0iSyIvPgotICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSIyMDQ4IiBwa3RfcHRzX3RpbWU9IjAuMDQ2NDQwIiBwa3RfZHRzPSIyMDQ4IiBwa3RfZHRzX3RpbWU9IjAuMDQ2NDQwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjIwNDgiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjA0NjQ0MCIgcGt0X2R1cmF0aW9uPSIxMDI0IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiIHBrdF9wb3M9IjUyNTY1MCIgcGt0X3NpemU9IjIwNDgiIHNhbXBsZV9mbXQ9InMxNiIgbmJfc2FtcGxlcz0iMTAyNCIgY2hhbm5lbHM9IjEiLz4KLSAgICAgICAgPHBhY2tldCBjb2RlY190eXBlPSJhdWRpbyIgc3RyZWFtX2luZGV4PSIwIiBwdHM9IjMwNzIiIHB0c190aW1lPSIwLjA2OTY2MCIgZHRzPSIzMDcyIiBkdHNfdGltZT0iMC4wNjk2NjAiIGR1cmF0aW9uPSIxMDI0IiBkdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIgc2l6ZT0iMjA0OCIgcG9zPSI1Mjc3MjEiIGZsYWdzPSJLIi8+Ci0gICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJhdWRpbyIgc3RyZWFtX2luZGV4PSIwIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjMwNzIiIHBrdF9wdHNfdGltZT0iMC4wNjk2NjAiIHBrdF9kdHM9IjMwNzIiIHBrdF9kdHNfdGltZT0iMC4wNjk2NjAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMzA3MiIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDY5NjYwIiBwa3RfZHVyYXRpb249IjEwMjQiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIgcGt0X3Bvcz0iNTI3NzIxIiBwa3Rfc2l6ZT0iMjA0OCIgc2FtcGxlX2ZtdD0iczE2IiBuYl9zYW1wbGVzPSIxMDI0IiBjaGFubmVscz0iMSIvPgotICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjEiIHB0cz0iNDA5NiIgcHRzX3RpbWU9IjAuMDgwMDAwIiBkdHM9IjQwOTYiIGR0c190aW1lPSIwLjA4MDAwMCIgZHVyYXRpb249IjIwNDgiIGR1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBzaXplPSIyMzA0MDAiIHBvcz0iNTI5Nzk5IiBmbGFncz0iSyIvPgotICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMSIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSI0MDk2IiBwa3RfcHRzX3RpbWU9IjAuMDgwMDAwIiBwa3RfZHRzPSI0MDk2IiBwa3RfZHRzX3RpbWU9IjAuMDgwMDAwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjQwOTYiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjA4MDAwMCIgcGt0X2R1cmF0aW9uPSIyMDQ4IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHBrdF9wb3M9IjUyOTc5OSIgcGt0X3NpemU9IjIzMDQwMCIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiIHBpeF9mbXQ9InJnYjI0IiBzYW1wbGVfYXNwZWN0X3JhdGlvPSIxOjEiIHBpY3RfdHlwZT0iSSIgY29kZWRfcGljdHVyZV9udW1iZXI9IjAiIGRpc3BsYXlfcGljdHVyZV9udW1iZXI9IjAiIGludGVybGFjZWRfZnJhbWU9IjAiIHRvcF9maWVsZF9maXJzdD0iMCIgcmVwZWF0X3BpY3Q9IjAiLz4KLSAgICAgICAgPHBhY2tldCBjb2RlY190eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIyIiBwdHM9IjQwOTYiIHB0c190aW1lPSIwLjA4MDAwMCIgZHRzPSI0MDk2IiBkdHNfdGltZT0iMC4wODAwMDAiIGR1cmF0aW9uPSIyMDQ4IiBkdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgc2l6ZT0iMzAwMDAiIHBvcz0iNzYwMjIzIiBmbGFncz0iSyIvPgotICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMiIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSI0MDk2IiBwa3RfcHRzX3RpbWU9IjAuMDgwMDAwIiBwa3RfZHRzPSI0MDk2IiBwa3RfZHRzX3RpbWU9IjAuMDgwMDAwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjQwOTYiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjA4MDAwMCIgcGt0X2R1cmF0aW9uPSIyMDQ4IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHBrdF9wb3M9Ijc2MDIyMyIgcGt0X3NpemU9IjMwMDAwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgcGl4X2ZtdD0icmdiMjQiIHNhbXBsZV9hc3BlY3RfcmF0aW89IjE6MSIgcGljdF90eXBlPSJJIiBjb2RlZF9waWN0dXJlX251bWJlcj0iMCIgZGlzcGxheV9waWN0dXJlX251bWJlcj0iMCIgaW50ZXJsYWNlZF9mcmFtZT0iMCIgdG9wX2ZpZWxkX2ZpcnN0PSIwIiByZXBlYXRfcGljdD0iMCIvPgotICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9ImF1ZGlvIiBzdHJlYW1faW5kZXg9IjAiIHB0cz0iNDA5NiIgcHRzX3RpbWU9IjAuMDkyODgwIiBkdHM9IjQwOTYiIGR0c190aW1lPSIwLjA5Mjg4MCIgZHVyYXRpb249IjEwMjQiIGR1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIiBzaXplPSIyMDQ4IiBwb3M9Ijc5MDIyOCIgZmxhZ3M9IksiLz4KLSAgICAgICAgPGZyYW1lIG1lZGlhX3R5cGU9ImF1ZGlvIiBzdHJlYW1faW5kZXg9IjAiIGtleV9mcmFtZT0iMSIgcGt0X3B0cz0iNDA5NiIgcGt0X3B0c190aW1lPSIwLjA5Mjg4MCIgcGt0X2R0cz0iNDA5NiIgcGt0X2R0c190aW1lPSIwLjA5Mjg4MCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wPSI0MDk2IiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wOTI4ODAiIHBrdF9kdXJhdGlvbj0iMTAyNCIgcGt0X2R1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIiBwa3RfcG9zPSI3OTAyMjgiIHBrdF9zaXplPSIyMDQ4IiBzYW1wbGVfZm10PSJzMTYiIG5iX3NhbXBsZXM9IjEwMjQiIGNoYW5uZWxzPSIxIi8+Ci0gICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIgcHRzPSI1MTIwIiBwdHNfdGltZT0iMC4xMTYxMDAiIGR0cz0iNTEyMCIgZHRzX3RpbWU9IjAuMTE2MTAwIiBkdXJhdGlvbj0iMTAyNCIgZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiIHNpemU9IjIwNDgiIHBvcz0iNzkyMjk5IiBmbGFncz0iSyIvPgotICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSI1MTIwIiBwa3RfcHRzX3RpbWU9IjAuMTE2MTAwIiBwa3RfZHRzPSI1MTIwIiBwa3RfZHRzX3RpbWU9IjAuMTE2MTAwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjUxMjAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjExNjEwMCIgcGt0X2R1cmF0aW9uPSIxMDI0IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiIHBrdF9wb3M9Ijc5MjI5OSIgcGt0X3NpemU9IjIwNDgiIHNhbXBsZV9mbXQ9InMxNiIgbmJfc2FtcGxlcz0iMTAyNCIgY2hhbm5lbHM9IjEiLz4KLSAgICAgICAgPHBhY2tldCBjb2RlY190eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIxIiBwdHM9IjYxNDQiIHB0c190aW1lPSIwLjEyMDAwMCIgZHRzPSI2MTQ0IiBkdHNfdGltZT0iMC4xMjAwMDAiIGR1cmF0aW9uPSIyMDQ4IiBkdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgc2l6ZT0iMjMwNDAwIiBwb3M9Ijc5NDM3NyIgZmxhZ3M9IksiLz4KLSAgICAgICAgPGZyYW1lIG1lZGlhX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjEiIGtleV9mcmFtZT0iMSIgcGt0X3B0cz0iNjE0NCIgcGt0X3B0c190aW1lPSIwLjEyMDAwMCIgcGt0X2R0cz0iNjE0NCIgcGt0X2R0c190aW1lPSIwLjEyMDAwMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wPSI2MTQ0IiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4xMjAwMDAiIHBrdF9kdXJhdGlvbj0iMjA0OCIgcGt0X2R1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBwa3RfcG9zPSI3OTQzNzciIHBrdF9zaXplPSIyMzA0MDAiIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBwaXhfZm10PSJyZ2IyNCIgc2FtcGxlX2FzcGVjdF9yYXRpbz0iMToxIiBwaWN0X3R5cGU9IkkiIGNvZGVkX3BpY3R1cmVfbnVtYmVyPSIwIiBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPSIwIiBpbnRlcmxhY2VkX2ZyYW1lPSIwIiB0b3BfZmllbGRfZmlyc3Q9IjAiIHJlcGVhdF9waWN0PSIwIi8+Ci0gICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMiIgcHRzPSI2MTQ0IiBwdHNfdGltZT0iMC4xMjAwMDAiIGR0cz0iNjE0NCIgZHRzX3RpbWU9IjAuMTIwMDAwIiBkdXJhdGlvbj0iMjA0OCIgZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHNpemU9IjMwMDAwIiBwb3M9IjEwMjQ4MDEiIGZsYWdzPSJLIi8+Ci0gICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIyIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjYxNDQiIHBrdF9wdHNfdGltZT0iMC4xMjAwMDAiIHBrdF9kdHM9IjYxNDQiIHBrdF9kdHNfdGltZT0iMC4xMjAwMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iNjE0NCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMTIwMDAwIiBwa3RfZHVyYXRpb249IjIwNDgiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgcGt0X3Bvcz0iMTAyNDgwMSIgcGt0X3NpemU9IjMwMDAwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgcGl4X2ZtdD0icmdiMjQiIHNhbXBsZV9hc3BlY3RfcmF0aW89IjE6MSIgcGljdF90eXBlPSJJIiBjb2RlZF9waWN0dXJlX251bWJlcj0iMCIgZGlzcGxheV9waWN0dXJlX251bWJlcj0iMCIgaW50ZXJsYWNlZF9mcmFtZT0iMCIgdG9wX2ZpZWxkX2ZpcnN0PSIwIiByZXBlYXRfcGljdD0iMCIvPgorICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9ImF1ZGlvIiBzdHJlYW1faW5kZXg9IjAiIHB0cz0iMCIgcHRzX3RpbWU9IjAuMDAwMDAwIiBkdHM9IjAiIGR0c190aW1lPSIwLjAwMDAwMCIgZHVyYXRpb249IjEwMjQiIGR1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIiBzaXplPSIyMDQ4IiBwb3M9IjY0NyIgZmxhZ3M9IktfIi8+CisgICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJhdWRpbyIgc3RyZWFtX2luZGV4PSIwIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjAiIHBrdF9wdHNfdGltZT0iMC4wMDAwMDAiIHBrdF9kdHM9IjAiIHBrdF9kdHNfdGltZT0iMC4wMDAwMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDAwMDAwIiBwa3RfZHVyYXRpb249IjEwMjQiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIgcGt0X3Bvcz0iNjQ3IiBwa3Rfc2l6ZT0iMjA0OCIgc2FtcGxlX2ZtdD0iczE2IiBuYl9zYW1wbGVzPSIxMDI0IiBjaGFubmVscz0iMSIvPgorICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjEiIHB0cz0iMCIgcHRzX3RpbWU9IjAuMDAwMDAwIiBkdHM9IjAiIGR0c190aW1lPSIwLjAwMDAwMCIgZHVyYXRpb249IjIwNDgiIGR1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBzaXplPSIyMzA0MDAiIHBvcz0iMjcyMiIgZmxhZ3M9IktfIi8+CisgICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIxIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjAiIHBrdF9wdHNfdGltZT0iMC4wMDAwMDAiIHBrdF9kdHM9IjAiIHBrdF9kdHNfdGltZT0iMC4wMDAwMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDAwMDAwIiBwa3RfZHVyYXRpb249IjIwNDgiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgcGt0X3Bvcz0iMjcyMiIgcGt0X3NpemU9IjIzMDQwMCIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiIHBpeF9mbXQ9InJnYjI0IiBzYW1wbGVfYXNwZWN0X3JhdGlvPSIxOjEiIHBpY3RfdHlwZT0iSSIgY29kZWRfcGljdHVyZV9udW1iZXI9IjAiIGRpc3BsYXlfcGljdHVyZV9udW1iZXI9IjAiIGludGVybGFjZWRfZnJhbWU9IjAiIHRvcF9maWVsZF9maXJzdD0iMCIgcmVwZWF0X3BpY3Q9IjAiLz4KKyAgICAgICAgPHBhY2tldCBjb2RlY190eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIyIiBwdHM9IjAiIHB0c190aW1lPSIwLjAwMDAwMCIgZHRzPSIwIiBkdHNfdGltZT0iMC4wMDAwMDAiIGR1cmF0aW9uPSIyMDQ4IiBkdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgc2l6ZT0iMzAwMDAiIHBvcz0iMjMzMTQzIiBmbGFncz0iS18iLz4KKyAgICAgICAgPGZyYW1lIG1lZGlhX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjIiIGtleV9mcmFtZT0iMSIgcGt0X3B0cz0iMCIgcGt0X3B0c190aW1lPSIwLjAwMDAwMCIgcGt0X2R0cz0iMCIgcGt0X2R0c190aW1lPSIwLjAwMDAwMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wPSIwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wMDAwMDAiIHBrdF9kdXJhdGlvbj0iMjA0OCIgcGt0X2R1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBwa3RfcG9zPSIyMzMxNDMiIHBrdF9zaXplPSIzMDAwMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIHBpeF9mbXQ9InJnYjI0IiBzYW1wbGVfYXNwZWN0X3JhdGlvPSIxOjEiIHBpY3RfdHlwZT0iSSIgY29kZWRfcGljdHVyZV9udW1iZXI9IjAiIGRpc3BsYXlfcGljdHVyZV9udW1iZXI9IjAiIGludGVybGFjZWRfZnJhbWU9IjAiIHRvcF9maWVsZF9maXJzdD0iMCIgcmVwZWF0X3BpY3Q9IjAiLz4KKyAgICAgICAgPHBhY2tldCBjb2RlY190eXBlPSJhdWRpbyIgc3RyZWFtX2luZGV4PSIwIiBwdHM9IjEwMjQiIHB0c190aW1lPSIwLjAyMzIyMCIgZHRzPSIxMDI0IiBkdHNfdGltZT0iMC4wMjMyMjAiIGR1cmF0aW9uPSIxMDI0IiBkdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIgc2l6ZT0iMjA0OCIgcG9zPSIyNjMxNDgiIGZsYWdzPSJLXyIvPgorICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSIxMDI0IiBwa3RfcHRzX3RpbWU9IjAuMDIzMjIwIiBwa3RfZHRzPSIxMDI0IiBwa3RfZHRzX3RpbWU9IjAuMDIzMjIwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjEwMjQiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjAyMzIyMCIgcGt0X2R1cmF0aW9uPSIxMDI0IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiIHBrdF9wb3M9IjI2MzE0OCIgcGt0X3NpemU9IjIwNDgiIHNhbXBsZV9mbXQ9InMxNiIgbmJfc2FtcGxlcz0iMTAyNCIgY2hhbm5lbHM9IjEiLz4KKyAgICAgICAgPHBhY2tldCBjb2RlY190eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIxIiBwdHM9IjIwNDgiIHB0c190aW1lPSIwLjA0MDAwMCIgZHRzPSIyMDQ4IiBkdHNfdGltZT0iMC4wNDAwMDAiIGR1cmF0aW9uPSIyMDQ4IiBkdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgc2l6ZT0iMjMwNDAwIiBwb3M9IjI2NTIyNiIgZmxhZ3M9IktfIi8+CisgICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIxIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjIwNDgiIHBrdF9wdHNfdGltZT0iMC4wNDAwMDAiIHBrdF9kdHM9IjIwNDgiIHBrdF9kdHNfdGltZT0iMC4wNDAwMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMjA0OCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDQwMDAwIiBwa3RfZHVyYXRpb249IjIwNDgiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgcGt0X3Bvcz0iMjY1MjI2IiBwa3Rfc2l6ZT0iMjMwNDAwIiB3aWR0aD0iMzIwIiBoZWlnaHQ9IjI0MCIgcGl4X2ZtdD0icmdiMjQiIHNhbXBsZV9hc3BlY3RfcmF0aW89IjE6MSIgcGljdF90eXBlPSJJIiBjb2RlZF9waWN0dXJlX251bWJlcj0iMCIgZGlzcGxheV9waWN0dXJlX251bWJlcj0iMCIgaW50ZXJsYWNlZF9mcmFtZT0iMCIgdG9wX2ZpZWxkX2ZpcnN0PSIwIiByZXBlYXRfcGljdD0iMCIvPgorICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjIiIHB0cz0iMjA0OCIgcHRzX3RpbWU9IjAuMDQwMDAwIiBkdHM9IjIwNDgiIGR0c190aW1lPSIwLjA0MDAwMCIgZHVyYXRpb249IjIwNDgiIGR1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBzaXplPSIzMDAwMCIgcG9zPSI0OTU2NTAiIGZsYWdzPSJLXyIvPgorICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMiIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSIyMDQ4IiBwa3RfcHRzX3RpbWU9IjAuMDQwMDAwIiBwa3RfZHRzPSIyMDQ4IiBwa3RfZHRzX3RpbWU9IjAuMDQwMDAwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjIwNDgiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjA0MDAwMCIgcGt0X2R1cmF0aW9uPSIyMDQ4IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHBrdF9wb3M9IjQ5NTY1MCIgcGt0X3NpemU9IjMwMDAwIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgcGl4X2ZtdD0icmdiMjQiIHNhbXBsZV9hc3BlY3RfcmF0aW89IjE6MSIgcGljdF90eXBlPSJJIiBjb2RlZF9waWN0dXJlX251bWJlcj0iMCIgZGlzcGxheV9waWN0dXJlX251bWJlcj0iMCIgaW50ZXJsYWNlZF9mcmFtZT0iMCIgdG9wX2ZpZWxkX2ZpcnN0PSIwIiByZXBlYXRfcGljdD0iMCIvPgorICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9ImF1ZGlvIiBzdHJlYW1faW5kZXg9IjAiIHB0cz0iMjA0OCIgcHRzX3RpbWU9IjAuMDQ2NDQwIiBkdHM9IjIwNDgiIGR0c190aW1lPSIwLjA0NjQ0MCIgZHVyYXRpb249IjEwMjQiIGR1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIiBzaXplPSIyMDQ4IiBwb3M9IjUyNTY1NSIgZmxhZ3M9IktfIi8+CisgICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJhdWRpbyIgc3RyZWFtX2luZGV4PSIwIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjIwNDgiIHBrdF9wdHNfdGltZT0iMC4wNDY0NDAiIHBrdF9kdHM9IjIwNDgiIHBrdF9kdHNfdGltZT0iMC4wNDY0NDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMjA0OCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDQ2NDQwIiBwa3RfZHVyYXRpb249IjEwMjQiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIgcGt0X3Bvcz0iNTI1NjU1IiBwa3Rfc2l6ZT0iMjA0OCIgc2FtcGxlX2ZtdD0iczE2IiBuYl9zYW1wbGVzPSIxMDI0IiBjaGFubmVscz0iMSIvPgorICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9ImF1ZGlvIiBzdHJlYW1faW5kZXg9IjAiIHB0cz0iMzA3MiIgcHRzX3RpbWU9IjAuMDY5NjYwIiBkdHM9IjMwNzIiIGR0c190aW1lPSIwLjA2OTY2MCIgZHVyYXRpb249IjEwMjQiIGR1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIiBzaXplPSIyMDQ4IiBwb3M9IjUyNzcyNiIgZmxhZ3M9IktfIi8+CisgICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJhdWRpbyIgc3RyZWFtX2luZGV4PSIwIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjMwNzIiIHBrdF9wdHNfdGltZT0iMC4wNjk2NjAiIHBrdF9kdHM9IjMwNzIiIHBrdF9kdHNfdGltZT0iMC4wNjk2NjAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iMzA3MiIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDY5NjYwIiBwa3RfZHVyYXRpb249IjEwMjQiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjAyMzIyMCIgcGt0X3Bvcz0iNTI3NzI2IiBwa3Rfc2l6ZT0iMjA0OCIgc2FtcGxlX2ZtdD0iczE2IiBuYl9zYW1wbGVzPSIxMDI0IiBjaGFubmVscz0iMSIvPgorICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjEiIHB0cz0iNDA5NiIgcHRzX3RpbWU9IjAuMDgwMDAwIiBkdHM9IjQwOTYiIGR0c190aW1lPSIwLjA4MDAwMCIgZHVyYXRpb249IjIwNDgiIGR1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBzaXplPSIyMzA0MDAiIHBvcz0iNTI5ODA0IiBmbGFncz0iS18iLz4KKyAgICAgICAgPGZyYW1lIG1lZGlhX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjEiIGtleV9mcmFtZT0iMSIgcGt0X3B0cz0iNDA5NiIgcGt0X3B0c190aW1lPSIwLjA4MDAwMCIgcGt0X2R0cz0iNDA5NiIgcGt0X2R0c190aW1lPSIwLjA4MDAwMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wPSI0MDk2IiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wODAwMDAiIHBrdF9kdXJhdGlvbj0iMjA0OCIgcGt0X2R1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBwa3RfcG9zPSI1Mjk4MDQiIHBrdF9zaXplPSIyMzA0MDAiIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBwaXhfZm10PSJyZ2IyNCIgc2FtcGxlX2FzcGVjdF9yYXRpbz0iMToxIiBwaWN0X3R5cGU9IkkiIGNvZGVkX3BpY3R1cmVfbnVtYmVyPSIwIiBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPSIwIiBpbnRlcmxhY2VkX2ZyYW1lPSIwIiB0b3BfZmllbGRfZmlyc3Q9IjAiIHJlcGVhdF9waWN0PSIwIi8+CisgICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMiIgcHRzPSI0MDk2IiBwdHNfdGltZT0iMC4wODAwMDAiIGR0cz0iNDA5NiIgZHRzX3RpbWU9IjAuMDgwMDAwIiBkdXJhdGlvbj0iMjA0OCIgZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHNpemU9IjMwMDAwIiBwb3M9Ijc2MDIyOCIgZmxhZ3M9IktfIi8+CisgICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJ2aWRlbyIgc3RyZWFtX2luZGV4PSIyIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjQwOTYiIHBrdF9wdHNfdGltZT0iMC4wODAwMDAiIHBrdF9kdHM9IjQwOTYiIHBrdF9kdHNfdGltZT0iMC4wODAwMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iNDA5NiIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMDgwMDAwIiBwa3RfZHVyYXRpb249IjIwNDgiIHBrdF9kdXJhdGlvbl90aW1lPSIwLjA0MDAwMCIgcGt0X3Bvcz0iNzYwMjI4IiBwa3Rfc2l6ZT0iMzAwMDAiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBwaXhfZm10PSJyZ2IyNCIgc2FtcGxlX2FzcGVjdF9yYXRpbz0iMToxIiBwaWN0X3R5cGU9IkkiIGNvZGVkX3BpY3R1cmVfbnVtYmVyPSIwIiBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPSIwIiBpbnRlcmxhY2VkX2ZyYW1lPSIwIiB0b3BfZmllbGRfZmlyc3Q9IjAiIHJlcGVhdF9waWN0PSIwIi8+CisgICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIgcHRzPSI0MDk2IiBwdHNfdGltZT0iMC4wOTI4ODAiIGR0cz0iNDA5NiIgZHRzX3RpbWU9IjAuMDkyODgwIiBkdXJhdGlvbj0iMTAyNCIgZHVyYXRpb25fdGltZT0iMC4wMjMyMjAiIHNpemU9IjIwNDgiIHBvcz0iNzkwMjMzIiBmbGFncz0iS18iLz4KKyAgICAgICAgPGZyYW1lIG1lZGlhX3R5cGU9ImF1ZGlvIiBzdHJlYW1faW5kZXg9IjAiIGtleV9mcmFtZT0iMSIgcGt0X3B0cz0iNDA5NiIgcGt0X3B0c190aW1lPSIwLjA5Mjg4MCIgcGt0X2R0cz0iNDA5NiIgcGt0X2R0c190aW1lPSIwLjA5Mjg4MCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wPSI0MDk2IiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4wOTI4ODAiIHBrdF9kdXJhdGlvbj0iMTAyNCIgcGt0X2R1cmF0aW9uX3RpbWU9IjAuMDIzMjIwIiBwa3RfcG9zPSI3OTAyMzMiIHBrdF9zaXplPSIyMDQ4IiBzYW1wbGVfZm10PSJzMTYiIG5iX3NhbXBsZXM9IjEwMjQiIGNoYW5uZWxzPSIxIi8+CisgICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0iYXVkaW8iIHN0cmVhbV9pbmRleD0iMCIgcHRzPSI1MTIwIiBwdHNfdGltZT0iMC4xMTYxMDAiIGR0cz0iNTEyMCIgZHRzX3RpbWU9IjAuMTE2MTAwIiBkdXJhdGlvbj0iMzkzIiBkdXJhdGlvbl90aW1lPSIwLjAwODkxMiIgc2l6ZT0iNzg2IiBwb3M9Ijc5MjMwNCIgZmxhZ3M9IktfIi8+CisgICAgICAgIDxmcmFtZSBtZWRpYV90eXBlPSJhdWRpbyIgc3RyZWFtX2luZGV4PSIwIiBrZXlfZnJhbWU9IjEiIHBrdF9wdHM9IjUxMjAiIHBrdF9wdHNfdGltZT0iMC4xMTYxMDAiIHBrdF9kdHM9IjUxMjAiIHBrdF9kdHNfdGltZT0iMC4xMTYxMDAiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0iNTEyMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9IjAuMTE2MTAwIiBwa3RfZHVyYXRpb249IjM5MyIgcGt0X2R1cmF0aW9uX3RpbWU9IjAuMDA4OTEyIiBwa3RfcG9zPSI3OTIzMDQiIHBrdF9zaXplPSI3ODYiIHNhbXBsZV9mbXQ9InMxNiIgbmJfc2FtcGxlcz0iMzkzIiBjaGFubmVscz0iMSIvPgorICAgICAgICA8cGFja2V0IGNvZGVjX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjEiIHB0cz0iNjE0NCIgcHRzX3RpbWU9IjAuMTIwMDAwIiBkdHM9IjYxNDQiIGR0c190aW1lPSIwLjEyMDAwMCIgZHVyYXRpb249IjIwNDgiIGR1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBzaXplPSIyMzA0MDAiIHBvcz0iNzkzMTIwIiBmbGFncz0iS18iLz4KKyAgICAgICAgPGZyYW1lIG1lZGlhX3R5cGU9InZpZGVvIiBzdHJlYW1faW5kZXg9IjEiIGtleV9mcmFtZT0iMSIgcGt0X3B0cz0iNjE0NCIgcGt0X3B0c190aW1lPSIwLjEyMDAwMCIgcGt0X2R0cz0iNjE0NCIgcGt0X2R0c190aW1lPSIwLjEyMDAwMCIgYmVzdF9lZmZvcnRfdGltZXN0YW1wPSI2MTQ0IiBiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0iMC4xMjAwMDAiIHBrdF9kdXJhdGlvbj0iMjA0OCIgcGt0X2R1cmF0aW9uX3RpbWU9IjAuMDQwMDAwIiBwa3RfcG9zPSI3OTMxMjAiIHBrdF9zaXplPSIyMzA0MDAiIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBwaXhfZm10PSJyZ2IyNCIgc2FtcGxlX2FzcGVjdF9yYXRpbz0iMToxIiBwaWN0X3R5cGU9IkkiIGNvZGVkX3BpY3R1cmVfbnVtYmVyPSIwIiBkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPSIwIiBpbnRlcmxhY2VkX2ZyYW1lPSIwIiB0b3BfZmllbGRfZmlyc3Q9IjAiIHJlcGVhdF9waWN0PSIwIi8+CisgICAgICAgIDxwYWNrZXQgY29kZWNfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMiIgcHRzPSI2MTQ0IiBwdHNfdGltZT0iMC4xMjAwMDAiIGR0cz0iNjE0NCIgZHRzX3RpbWU9IjAuMTIwMDAwIiBkdXJhdGlvbj0iMjA0OCIgZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHNpemU9IjMwMDAwIiBwb3M9IjEwMjM1NDQiIGZsYWdzPSJLXyIvPgorICAgICAgICA8ZnJhbWUgbWVkaWFfdHlwZT0idmlkZW8iIHN0cmVhbV9pbmRleD0iMiIga2V5X2ZyYW1lPSIxIiBwa3RfcHRzPSI2MTQ0IiBwa3RfcHRzX3RpbWU9IjAuMTIwMDAwIiBwa3RfZHRzPSI2MTQ0IiBwa3RfZHRzX3RpbWU9IjAuMTIwMDAwIiBiZXN0X2VmZm9ydF90aW1lc3RhbXA9IjYxNDQiIGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPSIwLjEyMDAwMCIgcGt0X2R1cmF0aW9uPSIyMDQ4IiBwa3RfZHVyYXRpb25fdGltZT0iMC4wNDAwMDAiIHBrdF9wb3M9IjEwMjM1NDQiIHBrdF9zaXplPSIzMDAwMCIgd2lkdGg9IjEwMCIgaGVpZ2h0PSIxMDAiIHBpeF9mbXQ9InJnYjI0IiBzYW1wbGVfYXNwZWN0X3JhdGlvPSIxOjEiIHBpY3RfdHlwZT0iSSIgY29kZWRfcGljdHVyZV9udW1iZXI9IjAiIGRpc3BsYXlfcGljdHVyZV9udW1iZXI9IjAiIGludGVybGFjZWRfZnJhbWU9IjAiIHRvcF9maWVsZF9maXJzdD0iMCIgcmVwZWF0X3BpY3Q9IjAiLz4KICAgICA8L3BhY2tldHNfYW5kX2ZyYW1lcz4KIAogICAgIDxzdHJlYW1zPgogICAgICAgICA8c3RyZWFtIGluZGV4PSIwIiBjb2RlY19uYW1lPSJwY21fczE2bGUiIGNvZGVjX3R5cGU9ImF1ZGlvIiBjb2RlY190aW1lX2Jhc2U9IjEvNDQxMDAiIGNvZGVjX3RhZ19zdHJpbmc9IlBTRFsxNl0iIGNvZGVjX3RhZz0iMHgxMDQ0NTM1MCIgc2FtcGxlX2ZtdD0iczE2IiBzYW1wbGVfcmF0ZT0iNDQxMDAiIGNoYW5uZWxzPSIxIiBiaXRzX3Blcl9zYW1wbGU9IjE2IiByX2ZyYW1lX3JhdGU9IjAvMCIgYXZnX2ZyYW1lX3JhdGU9IjAvMCIgdGltZV9iYXNlPSIxLzQ0MTAwIiBzdGFydF9wdHM9IjAiIHN0YXJ0X3RpbWU9IjAuMDAwMDAwIiBiaXRfcmF0ZT0iNzA1NjAwIiBuYl9yZWFkX2ZyYW1lcz0iNiIgbmJfcmVhZF9wYWNrZXRzPSI2Ij4KLSAgICAgICAgICAgIDxkaXNwb3NpdGlvbiBkZWZhdWx0PSIwIiBkdWI9IjAiIG9yaWdpbmFsPSIwIiBjb21tZW50PSIwIiBseXJpY3M9IjAiIGthcmFva2U9IjAiIGZvcmNlZD0iMCIgaGVhcmluZ19pbXBhaXJlZD0iMCIgdmlzdWFsX2ltcGFpcmVkPSIwIiBjbGVhbl9lZmZlY3RzPSIwIiBhdHRhY2hlZF9waWM9IjAiLz4KKyAgICAgICAgICAgIDxkaXNwb3NpdGlvbiBkZWZhdWx0PSIwIiBkdWI9IjAiIG9yaWdpbmFsPSIwIiBjb21tZW50PSIwIiBseXJpY3M9IjAiIGthcmFva2U9IjAiIGZvcmNlZD0iMCIgaGVhcmluZ19pbXBhaXJlZD0iMCIgdmlzdWFsX2ltcGFpcmVkPSIwIiBjbGVhbl9lZmZlY3RzPSIwIiBhdHRhY2hlZF9waWM9IjAiIHRpbWVkX3RodW1ibmFpbHM9IjAiLz4KICAgICAgICAgICAgIDx0YWcga2V5PSJFIiB2YWx1ZT0ibWPCsiIvPgogICAgICAgICAgICAgPHRhZyBrZXk9ImVuY29kZXIiIHZhbHVlPSJMYXZjIHBjbV9zMTZsZSIvPgogICAgICAgICA8L3N0cmVhbT4KLSAgICAgICAgPHN0cmVhbSBpbmRleD0iMSIgY29kZWNfbmFtZT0icmF3dmlkZW8iIGNvZGVjX3R5cGU9InZpZGVvIiBjb2RlY190aW1lX2Jhc2U9IjEvNTEyMDAiIGNvZGVjX3RhZ19zdHJpbmc9IlJHQlsyNF0iIGNvZGVjX3RhZz0iMHgxODQyNDc1MiIgd2lkdGg9IjMyMCIgaGVpZ2h0PSIyNDAiIGNvZGVkX3dpZHRoPSIzMjAiIGNvZGVkX2hlaWdodD0iMjQwIiBoYXNfYl9mcmFtZXM9IjAiIHNhbXBsZV9hc3BlY3RfcmF0aW89IjE6MSIgZGlzcGxheV9hc3BlY3RfcmF0aW89IjQ6MyIgcGl4X2ZtdD0icmdiMjQiIGxldmVsPSItOTkiIHJlZnM9IjEiIHJfZnJhbWVfcmF0ZT0iMjUvMSIgYXZnX2ZyYW1lX3JhdGU9IjI1LzEiIHRpbWVfYmFzZT0iMS81MTIwMCIgc3RhcnRfcHRzPSIwIiBzdGFydF90aW1lPSIwLjAwMDAwMCIgbmJfcmVhZF9mcmFtZXM9IjQiIG5iX3JlYWRfcGFja2V0cz0iNCI+Ci0gICAgICAgICAgICA8ZGlzcG9zaXRpb24gZGVmYXVsdD0iMCIgZHViPSIwIiBvcmlnaW5hbD0iMCIgY29tbWVudD0iMCIgbHlyaWNzPSIwIiBrYXJhb2tlPSIwIiBmb3JjZWQ9IjAiIGhlYXJpbmdfaW1wYWlyZWQ9IjAiIHZpc3VhbF9pbXBhaXJlZD0iMCIgY2xlYW5fZWZmZWN0cz0iMCIgYXR0YWNoZWRfcGljPSIwIi8+CisgICAgICAgIDxzdHJlYW0gaW5kZXg9IjEiIGNvZGVjX25hbWU9InJhd3ZpZGVvIiBjb2RlY190eXBlPSJ2aWRlbyIgY29kZWNfdGltZV9iYXNlPSIxLzI1IiBjb2RlY190YWdfc3RyaW5nPSJSR0JbMjRdIiBjb2RlY190YWc9IjB4MTg0MjQ3NTIiIHdpZHRoPSIzMjAiIGhlaWdodD0iMjQwIiBjb2RlZF93aWR0aD0iMzIwIiBjb2RlZF9oZWlnaHQ9IjI0MCIgaGFzX2JfZnJhbWVzPSIwIiBzYW1wbGVfYXNwZWN0X3JhdGlvPSIxOjEiIGRpc3BsYXlfYXNwZWN0X3JhdGlvPSI0OjMiIHBpeF9mbXQ9InJnYjI0IiBsZXZlbD0iLTk5IiByZWZzPSIxIiByX2ZyYW1lX3JhdGU9IjI1LzEiIGF2Z19mcmFtZV9yYXRlPSIyNS8xIiB0aW1lX2Jhc2U9IjEvNTEyMDAiIHN0YXJ0X3B0cz0iMCIgc3RhcnRfdGltZT0iMC4wMDAwMDAiIG5iX3JlYWRfZnJhbWVzPSI0IiBuYl9yZWFkX3BhY2tldHM9IjQiPgorICAgICAgICAgICAgPGRpc3Bvc2l0aW9uIGRlZmF1bHQ9IjAiIGR1Yj0iMCIgb3JpZ2luYWw9IjAiIGNvbW1lbnQ9IjAiIGx5cmljcz0iMCIga2FyYW9rZT0iMCIgZm9yY2VkPSIwIiBoZWFyaW5nX2ltcGFpcmVkPSIwIiB2aXN1YWxfaW1wYWlyZWQ9IjAiIGNsZWFuX2VmZmVjdHM9IjAiIGF0dGFjaGVkX3BpYz0iMCIgdGltZWRfdGh1bWJuYWlscz0iMCIvPgogICAgICAgICAgICAgPHRhZyBrZXk9InRpdGxlIiB2YWx1ZT0iZm9vYmFyIi8+CiAgICAgICAgICAgICA8dGFnIGtleT0iZHVyYXRpb25fdHMiIHZhbHVlPSJmaWVsZC1hbmQtdGFncy1jb25mbGljdC1hdHRlbXB0Ii8+CiAgICAgICAgICAgICA8dGFnIGtleT0iZW5jb2RlciIgdmFsdWU9IkxhdmMgcmF3dmlkZW8iLz4KICAgICAgICAgPC9zdHJlYW0+Ci0gICAgICAgIDxzdHJlYW0gaW5kZXg9IjIiIGNvZGVjX25hbWU9InJhd3ZpZGVvIiBjb2RlY190eXBlPSJ2aWRlbyIgY29kZWNfdGltZV9iYXNlPSIxLzUxMjAwIiBjb2RlY190YWdfc3RyaW5nPSJSR0JbMjRdIiBjb2RlY190YWc9IjB4MTg0MjQ3NTIiIHdpZHRoPSIxMDAiIGhlaWdodD0iMTAwIiBjb2RlZF93aWR0aD0iMTAwIiBjb2RlZF9oZWlnaHQ9IjEwMCIgaGFzX2JfZnJhbWVzPSIwIiBzYW1wbGVfYXNwZWN0X3JhdGlvPSIxOjEiIGRpc3BsYXlfYXNwZWN0X3JhdGlvPSIxOjEiIHBpeF9mbXQ9InJnYjI0IiBsZXZlbD0iLTk5IiByZWZzPSIxIiByX2ZyYW1lX3JhdGU9IjI1LzEiIGF2Z19mcmFtZV9yYXRlPSIyNS8xIiB0aW1lX2Jhc2U9IjEvNTEyMDAiIHN0YXJ0X3B0cz0iMCIgc3RhcnRfdGltZT0iMC4wMDAwMDAiIG5iX3JlYWRfZnJhbWVzPSI0IiBuYl9yZWFkX3BhY2tldHM9IjQiPgotICAgICAgICAgICAgPGRpc3Bvc2l0aW9uIGRlZmF1bHQ9IjAiIGR1Yj0iMCIgb3JpZ2luYWw9IjAiIGNvbW1lbnQ9IjAiIGx5cmljcz0iMCIga2FyYW9rZT0iMCIgZm9yY2VkPSIwIiBoZWFyaW5nX2ltcGFpcmVkPSIwIiB2aXN1YWxfaW1wYWlyZWQ9IjAiIGNsZWFuX2VmZmVjdHM9IjAiIGF0dGFjaGVkX3BpYz0iMCIvPgorICAgICAgICA8c3RyZWFtIGluZGV4PSIyIiBjb2RlY19uYW1lPSJyYXd2aWRlbyIgY29kZWNfdHlwZT0idmlkZW8iIGNvZGVjX3RpbWVfYmFzZT0iMS8yNSIgY29kZWNfdGFnX3N0cmluZz0iUkdCWzI0XSIgY29kZWNfdGFnPSIweDE4NDI0NzUyIiB3aWR0aD0iMTAwIiBoZWlnaHQ9IjEwMCIgY29kZWRfd2lkdGg9IjEwMCIgY29kZWRfaGVpZ2h0PSIxMDAiIGhhc19iX2ZyYW1lcz0iMCIgc2FtcGxlX2FzcGVjdF9yYXRpbz0iMToxIiBkaXNwbGF5X2FzcGVjdF9yYXRpbz0iMToxIiBwaXhfZm10PSJyZ2IyNCIgbGV2ZWw9Ii05OSIgcmVmcz0iMSIgcl9mcmFtZV9yYXRlPSIyNS8xIiBhdmdfZnJhbWVfcmF0ZT0iMjUvMSIgdGltZV9iYXNlPSIxLzUxMjAwIiBzdGFydF9wdHM9IjAiIHN0YXJ0X3RpbWU9IjAuMDAwMDAwIiBuYl9yZWFkX2ZyYW1lcz0iNCIgbmJfcmVhZF9wYWNrZXRzPSI0Ij4KKyAgICAgICAgICAgIDxkaXNwb3NpdGlvbiBkZWZhdWx0PSIwIiBkdWI9IjAiIG9yaWdpbmFsPSIwIiBjb21tZW50PSIwIiBseXJpY3M9IjAiIGthcmFva2U9IjAiIGZvcmNlZD0iMCIgaGVhcmluZ19pbXBhaXJlZD0iMCIgdmlzdWFsX2ltcGFpcmVkPSIwIiBjbGVhbl9lZmZlY3RzPSIwIiBhdHRhY2hlZF9waWM9IjAiIHRpbWVkX3RodW1ibmFpbHM9IjAiLz4KICAgICAgICAgICAgIDx0YWcga2V5PSJlbmNvZGVyIiB2YWx1ZT0iTGF2YyByYXd2aWRlbyIvPgogICAgICAgICA8L3N0cmVhbT4KICAgICA8L3N0cmVhbXM+CiAKLSAgICA8Zm9ybWF0IGZpbGVuYW1lPSJ0ZXN0cy9kYXRhL2ZmcHJvYmUtdGVzdC5udXQiIG5iX3N0cmVhbXM9IjMiIG5iX3Byb2dyYW1zPSIwIiBmb3JtYXRfbmFtZT0ibnV0IiBzdGFydF90aW1lPSIwLjAwMDAwMCIgZHVyYXRpb249IjAuMTIwMDAwIiBzaXplPSIxMDU0ODgyIiBiaXRfcmF0ZT0iNzAzMjU0NjYiIHByb2JlX3Njb3JlPSIxMDAiPgorICAgIDxmb3JtYXQgZmlsZW5hbWU9InRlc3RzL2RhdGEvZmZwcm9iZS10ZXN0Lm51dCIgbmJfc3RyZWFtcz0iMyIgbmJfcHJvZ3JhbXM9IjAiIGZvcm1hdF9uYW1lPSJudXQiIHN0YXJ0X3RpbWU9IjAuMDAwMDAwIiBkdXJhdGlvbj0iMC4xMjAwMDAiIHNpemU9IjEwNTM2MjQiIGJpdF9yYXRlPSI3MDI0MTYwMCIgcHJvYmVfc2NvcmU9IjEwMCI+CiAgICAgICAgIDx0YWcga2V5PSJ0aXRsZSIgdmFsdWU9ImZmcHJvYmUgdGVzdCBmaWxlIi8+CiAgICAgICAgIDx0YWcga2V5PSJjb21tZW50IiB2YWx1ZT0iJmFwb3M7QSBjb21tZW50IHdpdGggQ1NWLCBYTUwgJmFtcDsgSlNPTiBzcGVjaWFsIGNoYXJzJmFwb3M7OiAmbHQ7dGFnIHZhbHVlPSZxdW90O3gmcXVvdDsmZ3Q7Ii8+CiAgICAgICAgIDx0YWcga2V5PSJjb21tZW50MiIgdmFsdWU9Ikkg4pmlIMOcw7HDrsOnw7hk4oKsIi8+CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWMtYXZpIGIvdGVzdHMvcmVmL2ZhdGUvZmljLWF2aQppbmRleCBjYzRlYTVkLi5kZjU1Nzg5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWMtYXZpCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpYy1hdmkKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS82MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTM2MHg3NjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDE1NjY3MjAsIDB4N2RhZTMyZTAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMTU2NjcyMCwgMHg3ZGFlMzJlMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAxNTY2NzIwLCAweDZkMWE5ZGM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWZvIGIvdGVzdHMvcmVmL2ZhdGUvZmlmbwppbmRleCAxNjJkNzU0Li4yYjE4ZWQ1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWZvCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpZm8KQEAgLTM4LDYgKzM4LDIwIEBACiAxMTogMTEKIDEyOiAxMgogCiswOiAwCisxOiAxCisyOiAyCiszOiAzCis0OiA0Cis1OiA1Cis2OiA2Cis3OiA3Cis4OiA4Cis5OiA5CisxMDogMTAKKzExOiAxMQorMTI6IDEyCisKIDAgMSAyIDMgNCA1IDYgNyA4IDkgMTAgMTEgMTIKIDA6IDAKIDE6IDEKQEAgLTUyLDMgKzY2LDMyIEBACiAxMDogMTAKIDExOiAxMQogMTI6IDEyCisKKzA6IDAKKzE6IDEKKzI6IDIKKzM6IDMKKzQ6IDQKKzU6IDUKKzY6IDYKKzc6IDcKKzg6IDgKKzk6IDkKKzEwOiAxMAorMTE6IDExCisxMjogMTIKKzEzOiAxMworMTQ6IDE0CisxNTogMTUKKzE2OiAxNgorMTc6IDE3CisxODogMTgKKzE5OiAxOQorMjA6IDIwCisyMTogMjEKKzIyOiAyMgorMjM6IDIzCisyNDogMjQKKzI1OiAyNQorMjY6IDI2CisyNzogMjcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpZm8tbXV4ZXItdHN0IGIvdGVzdHMvcmVmL2ZhdGUvZmlmby1tdXhlci10c3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTExMzllZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpZm8tbXV4ZXItdHN0CkBAIC0wLDAgKzEsMTAgQEAKK2ZsdXNoIGNvdW50OiAxCitwdHMgc2VlbiBucjogMTUKK3B0cyBzZWVuOiAwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0Citub25mYWlsIHRlc3Q6IG9rCityZWNvdmVyeSB0ZXN0OiBvaworZmx1c2ggY291bnQ6IDEKK3B0cyBzZWVuIG5yOiAxNQorcHRzIHNlZW46IDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQKK292ZXJmbG93IHdpdGhvdXQgcGFja2V0IGRyb3BwaW5nOiBvaworb3ZlcmZsb3cgd2l0aCBwYWNrZXQgZHJvcHBpbmc6IG9rCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWxtLWN2aWQgYi90ZXN0cy9yZWYvZmF0ZS9maWxtLWN2aWQKaW5kZXggM2NhN2I1OS4uMjQ1NDBiZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsbS1jdmlkCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbG0tY3ZpZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjI0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjE1MDQwLCAweDA2N2M1MzYyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMTUwNDAsIDB4ZDllYWNiOTgKIDAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDIxNTA0MCwgMHgzYzhhNGNiZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLTJ4YnIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItMnhicgppbmRleCA5MWUxZDRjLi4xMTE0YzMxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItMnhicgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItMnhicgpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzODJ4NTc0Cisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgODc3MDcyLCAweDUxNDJjNmNkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA4NzcwNzIsIDB4YTAxYTNmNDcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci0zeGJyIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLTN4YnIKaW5kZXggMDEzZjZhMy4uMGVkMDAyOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLTN4YnIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLTN4YnIKQEAgLTEsMyArMSw3IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTczeDg2MQorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTk3MzQxMiwgMHhkNGNmMjU3YgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxOTczNDEyLCAweDYzZmNkNjE0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItNHhiciBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci00eGJyCmluZGV4IDkyYjcwZDkuLmE2NTY3MzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci00eGJyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci00eGJyCkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDc2NHgxMTQ4Cisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzNTA4Mjg4LCAweGM3YjFkMTcwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDM1MDgyODgsIDB4M2ZkMGMzZmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hY3Jvc3NmYWRlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFjcm9zc2ZhZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ1MjRjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hY3Jvc3NmYWRlCkBAIC0wLDAgKzEsNTA0IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA4ODgsICAgICAzNTUyLCAweDU5MmNlNmNjCiswLCAgICAgICAgODg4LCAgICAgICAgODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjBmNmY2YTkKKzAsICAgICAgIDE5MTIsICAgICAgIDE5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZjg0MDEyMgorMCwgICAgICAgMjkzNiwgICAgICAgMjkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE5MDVmOWQxCiswLCAgICAgICAzOTYwLCAgICAgICAzOTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTU0N2ViMWIKKzAsICAgICAgIDQ5ODQsICAgICAgIDQ5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYjU0MDY3ZQorMCwgICAgICAgNjAwOCwgICAgICAgNjAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA2YzZmNWVmCiswLCAgICAgICA3MDMyLCAgICAgICA3MDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzVjMWY1YmIKKzAsICAgICAgIDgwNTYsICAgICAgIDgwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YTg5ZmQzMQorMCwgICAgICAgOTA4MCwgICAgICAgOTA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI5ZDNmZmExCiswLCAgICAgIDEwMTA0LCAgICAgIDEwMTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDI2MmUyZmYKKzAsICAgICAgMTExMjgsICAgICAgMTExMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YWZmZmU5ZAorMCwgICAgICAxMjE1MiwgICAgICAxMjE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRjMWQwMjc0CiswLCAgICAgIDEzMTc2LCAgICAgIDEzMTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWQ5N2Y5NmYKKzAsICAgICAgMTQyMDAsICAgICAgMTQyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMjZlZTFjYgorMCwgICAgICAxNTIyNCwgICAgICAxNTIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJlOTBmYjNkCiswLCAgICAgIDE2MjQ4LCAgICAgIDE2MjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjFkMzAyNjgKKzAsICAgICAgMTcyNzIsICAgICAgMTcyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OTdmZmEyZAorMCwgICAgICAxODI5NiwgICAgICAxODI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU1MzFlZmMzCiswLCAgICAgIDE5MzIwLCAgICAgIDE5MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Zjg1N2Y3MDcKKzAsICAgICAgMjAzNDQsICAgICAgMjAzNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2M2IwMDVjOAorMCwgICAgICAyMTM2OCwgICAgICAyMTM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVjODJlYTY3CiswLCAgICAgIDIyMzkyLCAgICAgIDIyMzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWY2ZGZhZTkKKzAsICAgICAgMjM0MTYsICAgICAgMjM0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZWJiZmIxZAorMCwgICAgICAyNDQ0MCwgICAgICAyNDQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0NTRlZmFiCiswLCAgICAgIDI1NDY0LCAgICAgIDI1NDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDA5M2YxMzUKKzAsICAgICAgMjY0ODgsICAgICAgMjY0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MjUzMGRlNgorMCwgICAgICAyNzUxMiwgICAgICAyNzUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzZjZmMjM5CiswLCAgICAgIDI4NTM2LCAgICAgIDI4NTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjE3OWVlNzEKKzAsICAgICAgMjk1NjAsICAgICAgMjk1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYTNmZjc2NworMCwgICAgICAzMDU4NCwgICAgICAzMDU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY0MGUwZjFjCiswLCAgICAgIDMxNjA4LCAgICAgIDMxNjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzk2MGY1OTcKKzAsICAgICAgMzI2MzIsICAgICAgMzI2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YzFiZWU3ZAorMCwgICAgICAzMzY1NiwgICAgICAzMzY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwZjZmNmE5CiswLCAgICAgIDM0NjgwLCAgICAgIDM0NjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2Y4NDAxMjIKKzAsICAgICAgMzU3MDQsICAgICAgMzU3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhOTA1ZjlkMQorMCwgICAgICAzNjcyOCwgICAgICAzNjcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE1NDdlYjFiCiswLCAgICAgIDM3NzUyLCAgICAgIDM3NzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWI1NDA2N2UKKzAsICAgICAgMzg3NzYsICAgICAgMzg3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNmM2ZjVlZgorMCwgICAgICAzOTgwMCwgICAgICAzOTgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM1YzFmNWJiCiswLCAgICAgIDQwODI0LCAgICAgIDQwODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmE4OWZkMzEKKzAsICAgICAgNDE4NDgsICAgICAgNDE4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiOWQzZmZhMQorMCwgICAgICA0Mjg3MiwgICAgICA0Mjg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQyNjJlMmZmCiswLCAgICAgIDQzODk2LCAgICAgIDQzODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzhiMGU3ZmIKKzAsICAgICAgNDQ5MjAsICAgICAgNDQ5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0OThjZjM3YgorMCwgICAgICA0NTk0NCwgICAgICA0NTk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRlZGZkZjJiCiswLCAgICAgIDQ2OTY4LCAgICAgIDQ2OTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMwZWZhNTUKKzAsICAgICAgNDc5OTIsICAgICAgNDc5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNDg3MDQ0ZQorMCwgICAgICA0OTAxNiwgICAgICA0OTAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBkZmZmMzczCiswLCAgICAgIDUwMDQwLCAgICAgIDUwMDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjkyMmY5ZTEKKzAsICAgICAgNTEwNjQsICAgICAgNTEwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNTc3Zjg1NworMCwgICAgICA1MjA4OCwgICAgICA1MjA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMzYjVlZTIxCiswLCAgICAgIDUzMTEyLCAgICAgIDUzMTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2U1ZmY3MjUKKzAsICAgICAgNTQxMzYsICAgICAgNTQxMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MDlmMDYzMAorMCwgICAgICA1NTE2MCwgICAgICA1NTE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwODdmMzNmCiswLCAgICAgIDU2MTg0LCAgICAgIDU2MTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODE2MmVmYzEKKzAsICAgICAgNTcyMDgsICAgICAgNTcyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2Yzk1M2MzNgorMCwgICAgICA1ODIzMiwgICAgICA1ODIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQxM2QwZDIyCiswLCAgICAgIDU5MjU2LCAgICAgIDU5MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWVkOTBhNmMKKzAsICAgICAgNjAyODAsICAgICAgNjAyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNWM2ZjUzMworMCwgICAgICA2MTMwNCwgICAgICA2MTMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3YTFlYjVmCiswLCAgICAgIDYyMzI4LCAgICAgIDYyMzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWE4M2U4MTUKKzAsICAgICAgNjMzNTIsICAgICAgNjMzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMzcwMDU2ZQorMCwgICAgICA2NDM3NiwgICAgICA2NDM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVhM2VlODZiCiswLCAgICAgIDY1NDAwLCAgICAgIDY1NDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzA1YmUyYzUKKzAsICAgICAgNjY0MjQsICAgICAgNjY0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YjQxMDAxYQorMCwgICAgICA2NzQ0OCwgICAgICA2NzQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhhYTFmZDM3CiswLCAgICAgIDY4NDcyLCAgICAgIDY4NDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTQwZGYzZDkKKzAsICAgICAgNjk0OTYsICAgICAgNjk0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZDhmMDIwNgorMCwgICAgICA3MDUyMCwgICAgICA3MDUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmZDlkZWEzCiswLCAgICAgIDcxNTQ0LCAgICAgIDcxNTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWU4MzA5YTAKKzAsICAgICAgNzI1NjgsICAgICAgNzI1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMTg4ZmU4ZAorMCwgICAgICA3MzU5MiwgICAgICA3MzU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ5OGZmYjI3CiswLCAgICAgIDc0NjE2LCAgICAgIDc0NjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjRmYzAwOWEKKzAsICAgICAgNzU2NDAsICAgICAgNzU2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOTZkZjQyYgorMCwgICAgICA3NjY2NCwgICAgICA3NjY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ4NjMyOTdhCiswLCAgICAgIDc3Njg4LCAgICAgIDc3Njg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmFhYzA1YzIKKzAsICAgICAgNzg3MTIsICAgICAgNzg3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNDdlMDk5NgorMCwgICAgICA3OTczNiwgICAgICA3OTczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFmYTRlODBiCiswLCAgICAgIDgwNzYwLCAgICAgIDgwNzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDI0MGYzMjUKKzAsICAgICAgODE3ODQsICAgICAgODE3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzFkMDk2MgorMCwgICAgICA4MjgwOCwgICAgICA4MjgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDViZmE1MGUyCiswLCAgICAgIDgzODMyLCAgICAgIDgzODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjY2YmVjZjkKKzAsICAgICAgODQ4NTYsICAgICAgODQ4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NjA2MDU5MAorMCwgICAgICA4NTg4MCwgICAgICA4NTg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1MDYwMjA0CiswLCAgICAgIDg2OTA0LCAgICAgIDg2OTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDVjZjBjMTYKKzAsICAgICAgODc5MjgsICAgICAgODc5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzQ4ZTE4ZAorMCwgICAgICA4ODk1MiwgICAgICA4ODk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZjODhkNDdiCiswLCAgICAgIDg5OTc2LCAgICAgIDg5OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDQ0NWIyYjkKKzAsICAgICAgOTEwMDAsICAgICAgOTEwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDgzYmQ5NworMCwgICAgICA5MjAyNCwgICAgICA5MjAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzZmE5NzIxCiswLCAgICAgIDkzMDQ4LCAgICAgIDkzMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjUyMTlkYmQKKzAsICAgICAgOTQwNzIsICAgICAgOTQwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzU5YmMzZgorMCwgICAgICA5NTA5NiwgICAgICA5NTA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ5MjViMzhkCiswLCAgICAgIDk2MTIwLCAgICAgIDk2MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YThhN2M3ZTcKKzAsICAgICAgOTcxNDQsICAgICAgOTcxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZGJiZmUxOQorMCwgICAgICA5ODE2OCwgICAgICA5ODE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiMjE4MmE5CiswLCAgICAgIDk5MTkyLCAgICAgIDk5MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzYwMWI0MTcKKzAsICAgICAxMDAyMTYsICAgICAxMDAyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZWRhZWQ4OQorMCwgICAgIDEwMTI0MCwgICAgIDEwMTI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZmYWNkOGRiCiswLCAgICAgMTAyMjY0LCAgICAgMTAyMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2RmOWQ1OGQKKzAsICAgICAxMDMyODgsICAgICAxMDMyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5Y2VjYWU1MQorMCwgICAgIDEwNDMxMiwgICAgIDEwNDMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxNjNjYzNmCiswLCAgICAgMTA1MzM2LCAgICAgMTA1MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2QyNWI3OTkKKzAsICAgICAxMDYzNjAsICAgICAxMDYzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4MTUxOTJmYgorMCwgICAgIDEwNzM4NCwgICAgIDEwNzM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFlYjFhZDk5CiswLCAgICAgMTA4NDA4LCAgICAgMTA4NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWYwNWVkMmIKKzAsICAgICAxMDk0MzIsICAgICAxMDk0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmM2JhY2Q5OQorMCwgICAgIDExMDQ1NiwgICAgIDExMDQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU2ZTRmMjhiCiswLCAgICAgMTExNDgwLCAgICAgMTExNDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTczM2U4MWQKKzAsICAgICAxMTI1MDQsICAgICAxMTI1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZTU0MTk1ZQorMCwgICAgIDExMzUyOCwgICAgIDExMzUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlNjFmYTlmCiswLCAgICAgMTE0NTUyLCAgICAgMTE0NTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQyNWVkOTUKKzAsICAgICAxMTU1NzYsICAgICAxMTU1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYmE0ZWQ0ZAorMCwgICAgIDExNjYwMCwgICAgIDExNjYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDEwMjdmYzMzCiswLCAgICAgMTE3NjI0LCAgICAgMTE3NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTYyMmM3ZTUKKzAsICAgICAxMTg2NDgsICAgICAxMTg2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNDcxZmYwNQorMCwgICAgIDExOTY3MiwgICAgIDExOTY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY5YTQwZTEwCiswLCAgICAgMTIwNjk2LCAgICAgMTIwNjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjJlNDEzYmEKKzAsICAgICAxMjE3MjAsICAgICAxMjE3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3OGZhZmVhOQorMCwgICAgIDEyMjc0NCwgICAgIDEyMjc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMwZjFmNjFkCiswLCAgICAgMTIzNzY4LCAgICAgMTIzNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWUyNGY1NjEKKzAsICAgICAxMjQ3OTIsICAgICAxMjQ3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYjE5Y2ViNQorMCwgICAgIDEyNTgxNiwgICAgIDEyNTgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjMTZjM2RkCiswLCAgICAgMTI2ODQwLCAgICAgMTI2ODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTEzYWZkMWIKKzAsICAgICAxMjc4NjQsICAgICAxMjc4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiM2EwZjQ2ZAorMCwgICAgIDEyODg4OCwgICAgIDEyODg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxZjRmNTg1CiswLCAgICAgMTI5OTEyLCAgICAgMTI5OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTFjZDI4ZTIKKzAsICAgICAxMzA5MzYsICAgICAxMzA5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNGMxMDQ3ZQorMCwgICAgIDEzMTk2MCwgICAgIDEzMTk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjMDRmMzYwCiswLCAgICAgMTMyOTg0LCAgICAgMTMyOTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTdiZmU4NzYKKzAsICAgICAxMzQwMDgsICAgICAxMzQwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZDdmZWE0MAorMCwgICAgIDEzNTAzMiwgICAgIDEzNTAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhkMjNmMmRhCiswLCAgICAgMTM2MDU2LCAgICAgMTM2MDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmMxNDAzOTUKKzAsICAgICAxMzcwODAsICAgICAxMzcwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4OTFmMDAwOAorMCwgICAgIDEzODEwNCwgICAgIDEzODEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4ZDAxODhhCiswLCAgICAgMTM5MTI4LCAgICAgMTM5MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmYwZGY2M2UKKzAsICAgICAxNDAxNTIsICAgICAxNDAxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzUxZThmMAorMCwgICAgIDE0MTE3NiwgICAgIDE0MTE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxYmVlZTQ4CiswLCAgICAgMTQyMjAwLCAgICAgMTQyMjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjdhZGZjN2MKKzAsICAgICAxNDMyMjQsICAgICAxNDMyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzE0ZDYzMgorMCwgICAgIDE0NDI0OCwgICAgIDE0NDI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYzOWFmZjExCiswLCAgICAgMTQ1MjcyLCAgICAgMTQ1MjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDFmYjBkNjEKKzAsICAgICAxNDYyOTYsICAgICAxNDYyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNTFiMDA4MworMCwgICAgIDE0NzMyMCwgICAgIDE0NzMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk4MjJmNTMwCiswLCAgICAgMTQ4MzQ0LCAgICAgMTQ4MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmRjOGRmMzEKKzAsICAgICAxNDkzNjgsICAgICAxNDkzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZjJlMDE4NAorMCwgICAgIDE1MDM5MiwgICAgIDE1MDM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhOWFmZGI5CiswLCAgICAgMTUxNDE2LCAgICAgMTUxNDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmY4NTAwMWEKKzAsICAgICAxNTI0NDAsICAgICAxNTI0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYTZjZjA1MworMCwgICAgIDE1MzQ2NCwgICAgIDE1MzQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAzMGExMzFkCiswLCAgICAgMTU0NDg4LCAgICAgMTU0NDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmMwNTAwMjUKKzAsICAgICAxNTU1MTIsICAgICAxNTU1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMWE5ZDY1NAorMCwgICAgIDE1NjUzNiwgICAgIDE1NjUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE5OWZmNGZlCiswLCAgICAgMTU3NTYwLCAgICAgMTU3NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTg0YmVlODAKKzAsICAgICAxNTg1ODQsICAgICAxNTg1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYTk2ZTk0NgorMCwgICAgIDE1OTYwOCwgICAgIDE1OTYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMwMjZlMjg0CiswLCAgICAgMTYwNjMyLCAgICAgMTYwNjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTQwMDE4NWQKKzAsICAgICAxNjE2NTYsICAgICAxNjE2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOWEyZjg4NworMCwgICAgIDE2MjY4MCwgICAgIDE2MjY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFhOGJmZGZlCiswLCAgICAgMTYzNzA0LCAgICAgMTYzNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDlhOWU3ZGYKKzAsICAgICAxNjQ3MjgsICAgICAxNjQ3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNTllMDcxNworMCwgICAgIDE2NTc1MiwgICAgIDE2NTc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDlhM2VmZjZiCiswLCAgICAgMTY2Nzc2LCAgICAgMTY2Nzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWE1ZWYzNjQKKzAsICAgICAxNjc4MDAsICAgICAxNjc4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMmMyMGIzMgorMCwgICAgIDE2ODgyNCwgICAgIDE2ODgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY3ZjBmNTViCiswLCAgICAgMTY5ODQ4LCAgICAgMTY5ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTAwMmVmZjUKKzAsICAgICAxNzA4NzIsICAgICAxNzA4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZmEwZWE3MQorMCwgICAgIDE3MTg5NiwgICAgIDE3MTg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjNjFlOGVhCiswLCAgICAgMTcyOTIwLCAgICAgMTcyOTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDY4ZmU0YmYKKzAsICAgICAxNzM5NDQsICAgICAxNzM5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYWEwMDY0OAorMCwgICAgIDE3NDk2OCwgICAgIDE3NDk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc0ZmZlZWFlCiswLCAgICAgMTc1OTkyLCAgICAgMTc1OTkyLCAgICAgIDQwOCwgICAgIDE2MzIsIDB4MjgzNTNkYWUKKzAsICAgICAxNzY0MDAsICAgICAxNzY0MDAsICAgIDg4MjAwLCAgIDM1MjgwMCwgMHg0ZmI0OTJhZgorMCwgICAgIDI2NDYwMCwgICAgIDI2NDYwMCwgICAgICA4ODgsICAgICAzNTUyLCAweGE1YTQxYjA3CiswLCAgICAgMjY1NDg4LCAgICAgMjY1NDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzFjNjFmNTMKKzAsICAgICAyNjY1MTIsICAgICAyNjY1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNWI2ZDU5NQorMCwgICAgIDI2NzUzNiwgICAgIDI2NzUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM0NDgxMTE4CiswLCAgICAgMjY4NTYwLCAgICAgMjY4NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWRjMGI1OGQKKzAsICAgICAyNjk1ODQsICAgICAyNjk1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YTUzYTdmMQorMCwgICAgIDI3MDYwOCwgICAgIDI3MDYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMzOGU5YmVjCiswLCAgICAgMjcxNjMyLCAgICAgMjcxNjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzk0NDMyODIKKzAsICAgICAyNzI2NTYsICAgICAyNzI2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4MDE4ZDI5MAorMCwgICAgIDI3MzY4MCwgICAgIDI3MzY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYzMmQ5YTcwCiswLCAgICAgMjc0NzA0LCAgICAgMjc0NzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzYzYWU3NmEKKzAsICAgICAyNzU3MjgsICAgICAyNzU3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDVkMTIyMgorMCwgICAgIDI3Njc1MiwgICAgIDI3Njc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgyMjZjNWRlCiswLCAgICAgMjc3Nzc2LCAgICAgMjc3Nzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjJmYjFmMjcKKzAsICAgICAyNzg4MDAsICAgICAyNzg4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZmIwYmEzNAorMCwgICAgIDI3OTgyNCwgICAgIDI3OTgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYxNzhlMzI1CiswLCAgICAgMjgwODQ4LCAgICAgMjgwODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWMyYjJkYjQKKzAsICAgICAyODE4NzIsICAgICAyODE4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMzM2ZDYzYworMCwgICAgIDI4Mjg5NiwgICAgIDI4Mjg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA2ODhlZjE2CiswLCAgICAgMjgzOTIwLCAgICAgMjgzOTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDgzM2Y5M2YKKzAsICAgICAyODQ5NDQsICAgICAyODQ5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYjdmYWQ2OQorMCwgICAgIDI4NTk2OCwgICAgIDI4NTk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjM2MwOWZiCiswLCAgICAgMjg2OTkyLCAgICAgMjg2OTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDFjOWU0ZWQKKzAsICAgICAyODgwMTYsICAgICAyODgwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNjcwYTY2YworMCwgICAgIDI4OTA0MCwgICAgIDI4OTA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg2YTBhZjI2CiswLCAgICAgMjkwMDY0LCAgICAgMjkwMDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTVhZmVjMWYKKzAsICAgICAyOTEwODgsICAgICAyOTEwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNmQ1MWMxMworMCwgICAgIDI5MjExMiwgICAgIDI5MjExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU0YTE1NjQyCiswLCAgICAgMjkzMTM2LCAgICAgMjkzMTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGUzZWRlYWYKKzAsICAgICAyOTQxNjAsICAgICAyOTQxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2M2Q3NGEyZAorMCwgICAgIDI5NTE4NCwgICAgIDI5NTE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJhNjBmOWVlCiswLCAgICAgMjk2MjA4LCAgICAgMjk2MjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTU2MmZkMGIKKzAsICAgICAyOTcyMzIsICAgICAyOTcyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMzgyOTA3YworMCwgICAgIDI5ODI1NiwgICAgIDI5ODI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDMyYWFmYTk5CiswLCAgICAgMjk5MjgwLCAgICAgMjk5MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjFkYTM2NDAKKzAsICAgICAzMDAzMDQsICAgICAzMDAzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZGE4ZDUxYQorMCwgICAgIDMwMTMyOCwgICAgIDMwMTMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNhZmUyN2JjCiswLCAgICAgMzAyMzUyLCAgICAgMzAyMzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDVkMzBkMGYKKzAsICAgICAzMDMzNzYsICAgICAzMDMzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NjIxNDg2OAorMCwgICAgIDMwNDQwMCwgICAgIDMwNDQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyODM1MDdmCiswLCAgICAgMzA1NDI0LCAgICAgMzA1NDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2ZiNTNmZTcKKzAsICAgICAzMDY0NDgsICAgICAzMDY0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDkwN2VhOAorMCwgICAgIDMwNzQ3MiwgICAgIDMwNzQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE3YzM4OWRlCiswLCAgICAgMzA4NDk2LCAgICAgMzA4NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTI4YmExZjIKKzAsICAgICAzMDk1MjAsICAgICAzMDk1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5OTMyYWZhYworMCwgICAgIDMxMDU0NCwgICAgIDMxMDU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgyZjFlMGMyCiswLCAgICAgMzExNTY4LCAgICAgMzExNTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM4MGJiNWYKKzAsICAgICAzMTI1OTIsICAgICAzMTI1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YjczYzI0ZgorMCwgICAgIDMxMzYxNiwgICAgIDMxMzYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIyYjNhZTg2CiswLCAgICAgMzE0NjQwLCAgICAgMzE0NjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWVhN2I2ZWMKKzAsICAgICAzMTU2NjQsICAgICAzMTU2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzU4MTNhMgorMCwgICAgIDMxNjY4OCwgICAgIDMxNjY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwNThmY2VlCiswLCAgICAgMzE3NzEyLCAgICAgMzE3NzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzA3MTdkNTgKKzAsICAgICAzMTg3MzYsICAgICAzMTg3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjODkxYzNkZgorMCwgICAgIDMxOTc2MCwgICAgIDMxOTc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU0ZTNhYzg1CiswLCAgICAgMzIwNzg0LCAgICAgMzIwNzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2JkZDQwYzYKKzAsICAgICAzMjE4MDgsICAgICAzMjE4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNTdlMTE2YworMCwgICAgIDMyMjgzMiwgICAgIDMyMjgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ5NGM3MmFiCiswLCAgICAgMzIzODU2LCAgICAgMzIzODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2I2NjFjMTMKKzAsICAgICAzMjQ4ODAsICAgICAzMjQ4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNTU4MTFmOQorMCwgICAgIDMyNTkwNCwgICAgIDMyNTkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmZjIyYzMwCiswLCAgICAgMzI2OTI4LCAgICAgMzI2OTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTMzMmU2MDUKKzAsICAgICAzMjc5NTIsICAgICAzMjc5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MGJiNjI5OQorMCwgICAgIDMyODk3NiwgICAgIDMyODk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGViZGQ0NTAwCiswLCAgICAgMzMwMDAwLCAgICAgMzMwMDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2Q5NDA0MTMKKzAsICAgICAzMzEwMjQsICAgICAzMzEwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNDQ1ZjYwZgorMCwgICAgIDMzMjA0OCwgICAgIDMzMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYxM2UwMTZjCiswLCAgICAgMzMzMDcyLCAgICAgMzMzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDU2NWRlMWMKKzAsICAgICAzMzQwOTYsICAgICAzMzQwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYTc3MTM5OQorMCwgICAgIDMzNTEyMCwgICAgIDMzNTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDczMGI3YzFlCiswLCAgICAgMzM2MTQ0LCAgICAgMzM2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzJmMDAzYTMKKzAsICAgICAzMzcxNjgsICAgICAzMzcxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MTg2ZmY4ZQorMCwgICAgIDMzODE5MiwgICAgIDMzODE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDczNTZiOThjCiswLCAgICAgMzM5MjE2LCAgICAgMzM5MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmMwMmFmNTEKKzAsICAgICAzNDAyNDAsICAgICAzNDAyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYzkyMmY3MgorMCwgICAgIDM0MTI2NCwgICAgIDM0MTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUzZDEwNjBlCiswLCAgICAgMzQyMjg4LCAgICAgMzQyMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTU5ODYxMWIKKzAsICAgICAzNDMzMTIsICAgICAzNDMzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkN2FjOTNkZgorMCwgICAgIDM0NDMzNiwgICAgIDM0NDMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU5Yjc3MjQ3CiswLCAgICAgMzQ1MzYwLCAgICAgMzQ1MzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjA2NDE4YzkKKzAsICAgICAzNDYzODQsICAgICAzNDYzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMzYwYzkwNgorMCwgICAgIDM0NzQwOCwgICAgIDM0NzQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdiOTJjMmMwCiswLCAgICAgMzQ4NDMyLCAgICAgMzQ4NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDIxZGNiMDYKKzAsICAgICAzNDk0NTYsICAgICAzNDk0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjOWI5YTNlZQorMCwgICAgIDM1MDQ4MCwgICAgIDM1MDQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE2ZTAxNTM0CiswLCAgICAgMzUxNTA0LCAgICAgMzUxNTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjBkNzRjODAKKzAsICAgICAzNTI1MjgsICAgICAzNTI1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2M2YxYThjNAorMCwgICAgIDM1MzU1MiwgICAgIDM1MzU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU0NWEwMGRmCiswLCAgICAgMzU0NTc2LCAgICAgMzU0NTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDc1MDMyZmMKKzAsICAgICAzNTU2MDAsICAgICAzNTU2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NTM0NTljZgorMCwgICAgIDM1NjYyNCwgICAgIDM1NjYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFiMzNhMWJjCiswLCAgICAgMzU3NjQ4LCAgICAgMzU3NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjI0ZDlmYTUKKzAsICAgICAzNTg2NzIsICAgICAzNTg2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OWVmMDFjMgorMCwgICAgIDM1OTY5NiwgICAgIDM1OTY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDJhYmFlOTFiCiswLCAgICAgMzYwNzIwLCAgICAgMzYwNzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Njc3NjE5YzgKKzAsICAgICAzNjE3NDQsICAgICAzNjE3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYzQ3ZjY3MgorMCwgICAgIDM2Mjc2OCwgICAgIDM2Mjc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNjYTc1MjgzCiswLCAgICAgMzYzNzkyLCAgICAgMzYzNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGVkZWM0NzQKKzAsICAgICAzNjQ4MTYsICAgICAzNjQ4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMjNkMTk3NworMCwgICAgIDM2NTg0MCwgICAgIDM2NTg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcwZDgyMDBlCiswLCAgICAgMzY2ODY0LCAgICAgMzY2ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjBmYzY5MmQKKzAsICAgICAzNjc4ODgsICAgICAzNjc4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZDdlOTQ1MQorMCwgICAgIDM2ODkxMiwgICAgIDM2ODkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU2MTEwZWQ2CiswLCAgICAgMzY5OTM2LCAgICAgMzY5OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODMwOGQzODIKKzAsICAgICAzNzA5NjAsICAgICAzNzA5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMTJlODQ1NQorMCwgICAgIDM3MTk4NCwgICAgIDM3MTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJhYjcwZmMzCiswLCAgICAgMzczMDA4LCAgICAgMzczMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mzk3NGM3OTQKKzAsICAgICAzNzQwMzIsICAgICAzNzQwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MjI2ODg2NworMCwgICAgIDM3NTA1NiwgICAgIDM3NTA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA3YmM1ZGI2CiswLCAgICAgMzc2MDgwLCAgICAgMzc2MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2E2OWE2MGMKKzAsICAgICAzNzcxMDQsICAgICAzNzcxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTNiOGRhMgorMCwgICAgIDM3ODEyOCwgICAgIDM3ODEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM5ZGRiY2I1CiswLCAgICAgMzc5MTUyLCAgICAgMzc5MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmIxMDc4NTEKKzAsICAgICAzODAxNzYsICAgICAzODAxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTczNWJlNgorMCwgICAgIDM4MTIwMCwgICAgIDM4MTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiZWNjYTYwCiswLCAgICAgMzgyMjI0LCAgICAgMzgyMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTM4MzIxN2IKKzAsICAgICAzODMyNDgsICAgICAzODMyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYTkzZmIyNQorMCwgICAgIDM4NDI3MiwgICAgIDM4NDI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1N2UwNzZkCiswLCAgICAgMzg1Mjk2LCAgICAgMzg1Mjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjMwNjIxOWIKKzAsICAgICAzODYzMjAsICAgICAzODYzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZDFmMjM4YgorMCwgICAgIDM4NzM0NCwgICAgIDM4NzM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRiZGFlYjEzCiswLCAgICAgMzg4MzY4LCAgICAgMzg4MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmUxMmU1ODcKKzAsICAgICAzODkzOTIsICAgICAzODkzOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNDI4ZmM5OQorMCwgICAgIDM5MDQxNiwgICAgIDM5MDQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1MTMxZmFjCiswLCAgICAgMzkxNDQwLCAgICAgMzkxNDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWFkZGQ0M2EKKzAsICAgICAzOTI0NjQsICAgICAzOTI0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwODJkMWIxZgorMCwgICAgIDM5MzQ4OCwgICAgIDM5MzQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVjOGQ2MDY3CiswLCAgICAgMzk0NTEyLCAgICAgMzk0NTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Njk4ODBhNGEKKzAsICAgICAzOTU1MzYsICAgICAzOTU1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ODg5Mjc4NQorMCwgICAgIDM5NjU2MCwgICAgIDM5NjU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkwZDQ4ZmU1CiswLCAgICAgMzk3NTg0LCAgICAgMzk3NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjJjNzdkZTAKKzAsICAgICAzOTg2MDgsICAgICAzOTg2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZjg4M2YxZQorMCwgICAgIDM5OTYzMiwgICAgIDM5OTYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzNjZlZWQzCiswLCAgICAgNDAwNjU2LCAgICAgNDAwNjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTlhNjFhNGIKKzAsICAgICA0MDE2ODAsICAgICA0MDE2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NDk2ZmY2OAorMCwgICAgIDQwMjcwNCwgICAgIDQwMjcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzZDRhZTIzCiswLCAgICAgNDAzNzI4LCAgICAgNDAzNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmNiYmRkMzkKKzAsICAgICA0MDQ3NTIsICAgICA0MDQ3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZTg0OTFkMgorMCwgICAgIDQwNTc3NiwgICAgIDQwNTc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE2NmJkYWE3CiswLCAgICAgNDA2ODAwLCAgICAgNDA2ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTkzNmU0ZGUKKzAsICAgICA0MDc4MjQsICAgICA0MDc4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZGEwZjc0YworMCwgICAgIDQwODg0OCwgICAgIDQwODg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4NGMxODE2CiswLCAgICAgNDA5ODcyLCAgICAgNDA5ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWFlMmZiMTAKKzAsICAgICA0MTA4OTYsICAgICA0MTA4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZjRmMDlmOQorMCwgICAgIDQxMTkyMCwgICAgIDQxMTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdkNzE0NmIyCiswLCAgICAgNDEyOTQ0LCAgICAgNDEyOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzU0M2Y5MGMKKzAsICAgICA0MTM5NjgsICAgICA0MTM5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZjM1MGRlYQorMCwgICAgIDQxNDk5MiwgICAgIDQxNDk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg5YTc2MWY4CiswLCAgICAgNDE2MDE2LCAgICAgNDE2MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2VkNjkxMjUKKzAsICAgICA0MTcwNDAsICAgICA0MTcwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NWRkYmQ3YgorMCwgICAgIDQxODA2NCwgICAgIDQxODA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1OWZmNmJhCiswLCAgICAgNDE5MDg4LCAgICAgNDE5MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmU4ZTM1ZDgKKzAsICAgICA0MjAxMTIsICAgICA0MjAxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YzNhY2IyNworMCwgICAgIDQyMTEzNiwgICAgIDQyMTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiZGVmY2M0CiswLCAgICAgNDIyMTYwLCAgICAgNDIyMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDk3OTZiODkKKzAsICAgICA0MjMxODQsICAgICA0MjMxODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwOWVmMThlNQorMCwgICAgIDQyNDIwOCwgICAgIDQyNDIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzNGVlYzA1CiswLCAgICAgNDI1MjMyLCAgICAgNDI1MjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTlhNGU1ZmUKKzAsICAgICA0MjYyNTYsICAgICA0MjYyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3Y2Y2OGY1MAorMCwgICAgIDQyNzI4MCwgICAgIDQyNzI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU2MzVhMTY5CiswLCAgICAgNDI4MzA0LCAgICAgNDI4MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWM4YmEyZWUKKzAsICAgICA0MjkzMjgsICAgICA0MjkzMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMWJkYTIyYgorMCwgICAgIDQzMDM1MiwgICAgIDQzMDM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzMzczMmQ5CiswLCAgICAgNDMxMzc2LCAgICAgNDMxMzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjA0MWUzYmYKKzAsICAgICA0MzI0MDAsICAgICA0MzI0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NjYxZDhlNAorMCwgICAgIDQzMzQyNCwgICAgIDQzMzQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg3NDRlNTZmCiswLCAgICAgNDM0NDQ4LCAgICAgNDM0NDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGQ5MDIyMmMKKzAsICAgICA0MzU0NzIsICAgICA0MzU0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzQ5YjZlZQorMCwgICAgIDQzNjQ5NiwgICAgIDQzNjQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM1MDFlNjExCiswLCAgICAgNDM3NTIwLCAgICAgNDM3NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTRiYzlkYWUKKzAsICAgICA0Mzg1NDQsICAgICA0Mzg1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZWJkODkwMQorMCwgICAgIDQzOTU2OCwgICAgIDQzOTU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0OGY1NWFiCiswLCAgICAgNDQwNTkyLCAgICAgNDQwNTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjFmMDk3OWIKKzAsICAgICA0NDE2MTYsICAgICA0NDE2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNTMyYTJkMgorMCwgICAgIDQ0MjY0MCwgICAgIDQ0MjY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDEwMDBlN2EyCiswLCAgICAgNDQzNjY0LCAgICAgNDQzNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxZDliMDgKKzAsICAgICA0NDQ2ODgsICAgICA0NDQ2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMTE5YmNmOAorMCwgICAgIDQ0NTcxMiwgICAgIDQ0NTcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAzZjJlYjgzCiswLCAgICAgNDQ2NzM2LCAgICAgNDQ2NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWJhOWYzYjQKKzAsICAgICA0NDc3NjAsICAgICA0NDc3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YTZmZmM4ZQorMCwgICAgIDQ0ODc4NCwgICAgIDQ0ODc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUyZjU0YmMyCiswLCAgICAgNDQ5ODA4LCAgICAgNDQ5ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDE3ZWM3ZDYKKzAsICAgICA0NTA4MzIsICAgICA0NTA4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOGIwMWZiYQorMCwgICAgIDQ1MTg1NiwgICAgIDQ1MTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVkNWFmMTNlCiswLCAgICAgNDUyODgwLCAgICAgNDUyODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTA0YTI5MTkKKzAsICAgICA0NTM5MDQsICAgICA0NTM5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNjhjMDBiMgorMCwgICAgIDQ1NDkyOCwgICAgIDQ1NDkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzYTE3YTcwCiswLCAgICAgNDU1OTUyLCAgICAgNDU1OTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWRlMDdmN2YKKzAsICAgICA0NTY5NzYsICAgICA0NTY5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyZWY5MTQ2MworMCwgICAgIDQ1ODAwMCwgICAgIDQ1ODAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDllYWVlMjllCiswLCAgICAgNDU5MDI0LCAgICAgNDU5MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZlMzAxMGIKKzAsICAgICA0NjAwNDgsICAgICA0NjAwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYjA4MjhiNAorMCwgICAgIDQ2MTA3MiwgICAgIDQ2MTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiYThjZWU5CiswLCAgICAgNDYyMDk2LCAgICAgNDYyMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGI4YmZlMWYKKzAsICAgICA0NjMxMjAsICAgICA0NjMxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjOWRhNWVlNAorMCwgICAgIDQ2NDE0NCwgICAgIDQ2NDE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk1MWY3MGYzCiswLCAgICAgNDY1MTY4LCAgICAgNDY1MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmEzNGU1YTUKKzAsICAgICA0NjYxOTIsICAgICA0NjYxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzM3MTZhMQorMCwgICAgIDQ2NzIxNiwgICAgIDQ2NzIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM5YjI0ZWZiCiswLCAgICAgNDY4MjQwLCAgICAgNDY4MjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTRhNGIwMzkKKzAsICAgICA0NjkyNjQsICAgICA0NjkyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3OTA2ZjJlNgorMCwgICAgIDQ3MDI4OCwgICAgIDQ3MDI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQwYzhjNzI2CiswLCAgICAgNDcxMzEyLCAgICAgNDcxMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjU1NGNjNDYKKzAsICAgICA0NzIzMzYsICAgICA0NzIzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNWI1ZDkxOQorMCwgICAgIDQ3MzM2MCwgICAgIDQ3MzM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ0MzdkNGIwCiswLCAgICAgNDc0Mzg0LCAgICAgNDc0Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTI5MWYzOGYKKzAsICAgICA0NzU0MDgsICAgICA0NzU0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZjgxYWQwYgorMCwgICAgIDQ3NjQzMiwgICAgIDQ3NjQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRmYjJjM2UwCiswLCAgICAgNDc3NDU2LCAgICAgNDc3NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTJiZTQwNzIKKzAsICAgICA0Nzg0ODAsICAgICA0Nzg0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNjc0MTI2ZgorMCwgICAgIDQ3OTUwNCwgICAgIDQ3OTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNhYjdlODZjCiswLCAgICAgNDgwNTI4LCAgICAgNDgwNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzM2ZTg3YWUKKzAsICAgICA0ODE1NTIsICAgICA0ODE1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTA1MGQ4ZAorMCwgICAgIDQ4MjU3NiwgICAgIDQ4MjU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU5MmE1OWRmCiswLCAgICAgNDgzNjAwLCAgICAgNDgzNjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWQ4Y2IzYmYKKzAsICAgICA0ODQ2MjQsICAgICA0ODQ2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNTUyMGQxNAorMCwgICAgIDQ4NTY0OCwgICAgIDQ4NTY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzN2Q0ZTg4CiswLCAgICAgNDg2NjcyLCAgICAgNDg2NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzY3YTQ0MjIKKzAsICAgICA0ODc2OTYsICAgICA0ODc2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZjdmOTEyZAorMCwgICAgIDQ4ODcyMCwgICAgIDQ4ODcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY3NDI5NDk1CiswLCAgICAgNDg5NzQ0LCAgICAgNDg5NzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDdmZmIyNTIKKzAsICAgICA0OTA3NjgsICAgICA0OTA3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MTdhZGUxOAorMCwgICAgIDQ5MTc5MiwgICAgIDQ5MTc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUyN2EzMWQ3CiswLCAgICAgNDkyODE2LCAgICAgNDkyODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGJjMGE1NjAKKzAsICAgICA0OTM4NDAsICAgICA0OTM4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMjkwNDhkYQorMCwgICAgIDQ5NDg2NCwgICAgIDQ5NDg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg1ZGY2YzU1CiswLCAgICAgNDk1ODg4LCAgICAgNDk1ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzY4OTgzYTIKKzAsICAgICA0OTY5MTIsICAgICA0OTY5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NTFhMTQwYgorMCwgICAgIDQ5NzkzNiwgICAgIDQ5NzkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxNTYwYjliCiswLCAgICAgNDk4OTYwLCAgICAgNDk4OTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjI3MzAyYzMKKzAsICAgICA0OTk5ODQsICAgICA0OTk5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MGFkNTM2MAorMCwgICAgIDUwMTAwOCwgICAgIDUwMTAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFjY2JmMjQwCiswLCAgICAgNTAyMDMyLCAgICAgNTAyMDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODViMmE5MjgKKzAsICAgICA1MDMwNTYsICAgICA1MDMwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkM2Y4ZDBiOAorMCwgICAgIDUwNDA4MCwgICAgIDUwNDA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU3ODMzMTk2CiswLCAgICAgNTA1MTA0LCAgICAgNTA1MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDZhYzExODQKKzAsICAgICA1MDYxMjgsICAgICA1MDYxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNzQ2NjU0NQorMCwgICAgIDUwNzE1MiwgICAgIDUwNzE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDExMTE5ZmI5CiswLCAgICAgNTA4MTc2LCAgICAgNTA4MTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmIzODNiNjAKKzAsICAgICA1MDkyMDAsICAgICA1MDkyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNGY3OGYzMAorMCwgICAgIDUxMDIyNCwgICAgIDUxMDIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRhNGMzYWNhCiswLCAgICAgNTExMjQ4LCAgICAgNTExMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGQyNGJmNmUKKzAsICAgICA1MTIyNzIsICAgICA1MTIyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNjVkMGEwNgorMCwgICAgIDUxMzI5NiwgICAgIDUxMzI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQyZTU0MDdiCiswLCAgICAgNTE0MzIwLCAgICAgNTE0MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGU1ZDNkZWYKKzAsICAgICA1MTUzNDQsICAgICA1MTUzNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNjdjOTg5NgorMCwgICAgIDUxNjM2OCwgICAgIDUxNjM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUyNzQ1NWEwCiswLCAgICAgNTE3MzkyLCAgICAgNTE3MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjMzMWNiOGMKKzAsICAgICA1MTg0MTYsICAgICA1MTg0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Y2Y3ZmE2OQorMCwgICAgIDUxOTQ0MCwgICAgIDUxOTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxM2YwOGY3CiswLCAgICAgNTIwNDY0LCAgICAgNTIwNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTMwOGU1NTIKKzAsICAgICA1MjE0ODgsICAgICA1MjE0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMTRjZjliZAorMCwgICAgIDUyMjUxMiwgICAgIDUyMjUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY0MDhkMzU2CiswLCAgICAgNTIzNTM2LCAgICAgNTIzNTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTRhZGRhMmUKKzAsICAgICA1MjQ1NjAsICAgICA1MjQ1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MmNhOTkyYworMCwgICAgIDUyNTU4NCwgICAgIDUyNTU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkY2I3MDQ4CiswLCAgICAgNTI2NjA4LCAgICAgNTI2NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmFmZDNhYzMKKzAsICAgICA1Mjc2MzIsICAgICA1Mjc2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MDE4YWVjMworMCwgICAgIDUyODY1NiwgICAgIDUyODY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdlMGEwZTIzCiswLCAgICAgNTI5NjgwLCAgICAgNTI5NjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjU4OTkyZGIKKzAsICAgICA1MzA3MDQsICAgICA1MzA3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMzliMzMwMQorMCwgICAgIDUzMTcyOCwgICAgIDUzMTcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJjOWE4NWJiCiswLCAgICAgNTMyNzUyLCAgICAgNTMyNzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGFhZTFkNjgKKzAsICAgICA1MzM3NzYsICAgICA1MzM3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNmY4YjQyMworMCwgICAgIDUzNDgwMCwgICAgIDUzNDgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ0YzEwZmVjCiswLCAgICAgNTM1ODI0LCAgICAgNTM1ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzBiNWU3MTUKKzAsICAgICA1MzY4NDgsICAgICA1MzY4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMDlmZjdlYworMCwgICAgIDUzNzg3MiwgICAgIDUzNzg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUzZDQyNDM2CiswLCAgICAgNTM4ODk2LCAgICAgNTM4ODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQ2MzBhMGEKKzAsICAgICA1Mzk5MjAsICAgICA1Mzk5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MWExZjkxYworMCwgICAgIDU0MDk0NCwgICAgIDU0MDk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY1MzMxYjcwCiswLCAgICAgNTQxOTY4LCAgICAgNTQxOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGNkMzM1MTgKKzAsICAgICA1NDI5OTIsICAgICA1NDI5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNjdkZTQxMAorMCwgICAgIDU0NDAxNiwgICAgIDU0NDAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhkNGE0NjE4CiswLCAgICAgNTQ1MDQwLCAgICAgNTQ1MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzYzMmQ5OTMKKzAsICAgICA1NDYwNjQsICAgICA1NDYwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MjU5YjE5MworMCwgICAgIDU0NzA4OCwgICAgIDU0NzA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJkYjdiY2JmCiswLCAgICAgNTQ4MTEyLCAgICAgNTQ4MTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODYyNWFmOWIKKzAsICAgICA1NDkxMzYsICAgICA1NDkxMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZDNlN2IwNworMCwgICAgIDU1MDE2MCwgICAgIDU1MDE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc2ZDZjZjUyCiswLCAgICAgNTUxMTg0LCAgICAgNTUxMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTRmMDdlYjgKKzAsICAgICA1NTIyMDgsICAgICA1NTIyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5M2NiNjVhMQorMCwgICAgIDU1MzIzMiwgICAgIDU1MzIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmOWIzZGY3CiswLCAgICAgNTU0MjU2LCAgICAgNTU0MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWZhOGUwNWUKKzAsICAgICA1NTUyODAsICAgICA1NTUyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYWViZjBhYgorMCwgICAgIDU1NjMwNCwgICAgIDU1NjMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzMTdlZDY5CiswLCAgICAgNTU3MzI4LCAgICAgNTU3MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjZmZDFhMzIKKzAsICAgICA1NTgzNTIsICAgICA1NTgzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NjA4YTYxNAorMCwgICAgIDU1OTM3NiwgICAgIDU1OTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGExYzY2MWM2CiswLCAgICAgNTYwNDAwLCAgICAgNTYwNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWEyMWQ4OWUKKzAsICAgICA1NjE0MjQsICAgICA1NjE0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYTg4MjBjMAorMCwgICAgIDU2MjQ0OCwgICAgIDU2MjQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1YzRhOTc5CiswLCAgICAgNTYzNDcyLCAgICAgNTYzNDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmMxYWU3MzAKKzAsICAgICA1NjQ0OTYsICAgICA1NjQ0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNjgxZjZjYgorMCwgICAgIDU2NTUyMCwgICAgIDU2NTUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRmODQ5N2NhCiswLCAgICAgNTY2NTQ0LCAgICAgNTY2NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzFhMDMzZDYKKzAsICAgICA1Njc1NjgsICAgICA1Njc1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZGE1ZjgwNQorMCwgICAgIDU2ODU5MiwgICAgIDU2ODU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1ZWU0NzAzCiswLCAgICAgNTY5NjE2LCAgICAgNTY5NjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzIyNTIxZmYKKzAsICAgICA1NzA2NDAsICAgICA1NzA2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMjZjNTAzZgorMCwgICAgIDU3MTY2NCwgICAgIDU3MTY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlmNjI3MTVlCiswLCAgICAgNTcyNjg4LCAgICAgNTcyNjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzJmZjlkMDcKKzAsICAgICA1NzM3MTIsICAgICA1NzM3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMzM2NDZhYQorMCwgICAgIDU3NDczNiwgICAgIDU3NDczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDljNTkwZTkwCiswLCAgICAgNTc1NzYwLCAgICAgNTc1NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWVkMTE5ZTEKKzAsICAgICA1NzY3ODQsICAgICA1NzY3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZTJhOGQzOAorMCwgICAgIDU3NzgwOCwgICAgIDU3NzgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRhZDlmY2E3CiswLCAgICAgNTc4ODMyLCAgICAgNTc4ODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTFmNWU2NWQKKzAsICAgICA1Nzk4NTYsICAgICA1Nzk4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MTkxMGUwMQorMCwgICAgIDU4MDg4MCwgICAgIDU4MDg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0ZDEwZDRmCiswLCAgICAgNTgxOTA0LCAgICAgNTgxOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODkyYTU4NzUKKzAsICAgICA1ODI5MjgsICAgICA1ODI5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NGM4MjhlNQorMCwgICAgIDU4Mzk1MiwgICAgIDU4Mzk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZkYjBkYTQ2CiswLCAgICAgNTg0OTc2LCAgICAgNTg0OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWMxMGRjM2YKKzAsICAgICA1ODYwMDAsICAgICA1ODYwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NmMwMmNlNgorMCwgICAgIDU4NzAyNCwgICAgIDU4NzAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiZWM1ZWQyCiswLCAgICAgNTg4MDQ4LCAgICAgNTg4MDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDBmMjYzZjAKKzAsICAgICA1ODkwNzIsICAgICA1ODkwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NzUwMTM3ZAorMCwgICAgIDU5MDA5NiwgICAgIDU5MDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA0NGRjMTliCiswLCAgICAgNTkxMTIwLCAgICAgNTkxMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NThhOGRkYTQKKzAsICAgICA1OTIxNDQsICAgICA1OTIxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMDJlYzI4NQorMCwgICAgIDU5MzE2OCwgICAgIDU5MzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcyMmEyZjJhCiswLCAgICAgNTk0MTkyLCAgICAgNTk0MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2E1ZTRkNDIKKzAsICAgICA1OTUyMTYsICAgICA1OTUyMTYsICAgICAgMTM0LCAgICAgIDUzNiwgMHg0NWZkM2QzZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFkZWxheSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZGVsYXkKaW5kZXggYWMxYzU4NC4uZTNmZjc2MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFkZWxheQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWRlbGF5CkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZDdiZjc2MAogMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmNDJjNDZiCiAwLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjIxNGZkMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZWNobyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZWNobwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzg4YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFlY2hvCkBAIC0wLDAgKzEsMjY2IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMwMTllZGQ1CiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmRmMmZlMmYKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZTM3ZmYzNworMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU5MzNmNmE1CiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDVhY2YxZjMKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4MmE2ZjkwMworMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE3OTJmOTIzCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDE1MDA1MDQKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMzA2ZWZjMworMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNhYmNlY2FmCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTA1OWY4NjEKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMTcyZmY2MQorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg1N2RmYzFiCiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTg5OWVkMzUKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YWU5ZjcwOQorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ1NjIwMDM2CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzViYTA5NDAKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYzNhZjJmZgorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVlZGRmMWIxCiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWVjOGY4NGQKKzAsICAgICAgMjA0ODAsICAgICAgMjA0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YTRmMDBlZQorMCwgICAgICAyMTUwNCwgICAgICAyMTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjZDNmYmU3CiswLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmNlMGYxOTkKKzAsICAgICAgMjM1NTIsICAgICAgMjM1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MDg2ZTliYgorMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBkNmVmYjBiCiswLCAgICAgIDI1NjAwLCAgICAgIDI1NjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWRlZTAyMGMKKzAsICAgICAgMjY2MjQsICAgICAgMjY2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NmFmZjQ1MworMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxZTlmMTc3CiswLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTNiOGY4OTMKKzAsICAgICAgMjk2OTYsICAgICAgMjk2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZjNhMDFjOAorMCwgICAgICAzMDcyMCwgICAgICAzMDcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE0OThmYTI1CiswLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGNkM2YyOTMKKzAsICAgICAgMzI3NjgsICAgICAgMzI3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZGUyZWI4ZgorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBhMGQwMWRjCiswLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGUzN2ZmMzcKKzAsICAgICAgMzU4NDAsICAgICAgMzU4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlOTMzZjZhNQorMCwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ1YWNmMWYzCiswLCAgICAgIDM3ODg4LCAgICAgIDM3ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODJhNmY5MDMKKzAsICAgICAgMzg5MTIsICAgICAgMzg5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzkyZjkyMworMCwgICAgICAzOTkzNiwgICAgICAzOTkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAxNTAwNTA0CiswLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTMwNmVmYzMKKzAsICAgICAgNDE5ODQsICAgICAgNDE5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYWJjZWNhZgorMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwNTlmODYxCiswLCAgICAgIDQ0MDMyLCAgICAgIDQ0MDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTEyOGQxODcKKzAsICAgICAgNDUwNTYsICAgICAgNDUwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MTQ3MWM3NgorMCwgICAgICA0NjA4MCwgICAgICA0NjA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0MDU3ZDRmCiswLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTVmZWQ4N2YKKzAsICAgICAgNDgxMjgsICAgICAgNDgxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YjBkMDU5YQorMCwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZiYTRjMWFkCiswLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGM4M2Y0ODkKKzAsICAgICAgNTEyMDAsICAgICAgNTEyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYmViZTQ3MworMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg2ZWZkNDY3CiswLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTkxOWYyZjEKKzAsICAgICAgNTQyNzIsICAgICAgNTQyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NDViMTJkOAorMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNhODZmZjQ5CiswLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjkxNGZkZjMKKzAsICAgICAgNTczNDQsICAgICAgNTczNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmOTQ5ZjI0ZgorMCwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY0MzZmNzkxCiswLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjkzZWViYWYKKzAsICAgICAgNjA0MTYsICAgICAgNjA0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMDc0MGJmMAorMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA4NjkwNDc4CiswLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjNhOGUyNTkKKzAsICAgICAgNjM0ODgsICAgICAgNjM0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYTJkMDE1MgorMCwgICAgICA2NDUxMiwgICAgICA2NDUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJlNjUxMTdlCiswLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzg3MTBjNTgKKzAsICAgICAgNjY1NjAsICAgICAgNjY1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNWRiMWQ2MAorMCwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY5NjAwMTZlCiswLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGRiMGYzNjcKKzAsICAgICAgNjk2MzIsICAgICAgNjk2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MTU0ZTU5MQorMCwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhjOTUxNjJjCiswLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjUwMmZmYTkKKzAsICAgICAgNzI3MDQsICAgICAgNzI3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNjZhMDc5MgorMCwgICAgICA3MzcyOCwgICAgICA3MzcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY4MzdlN2ZkCiswLCAgICAgIDc0NzUyLCAgICAgIDc0NzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTYxM2UzMTcKKzAsICAgICAgNzU3NzYsICAgICAgNzU3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMDg3ZWExZgorMCwgICAgICA3NjgwMCwgICAgICA3NjgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyNWFlNzBmCiswLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDliN2ZiYmIKKzAsICAgICAgNzg4NDgsICAgICAgNzg4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMmY4MDBlMAorMCwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRmYjAxMzRjCiswLCAgICAgIDgwODk2LCAgICAgIDgwODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjkwZWQzYWIKKzAsICAgICAgODE5MjAsICAgICAgODE5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YzEzZmQ1MworMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmMjZkOTViCiswLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDVlNzA3ZmMKKzAsICAgICAgODQ5OTIsICAgICAgODQ5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNTc2ZmUyMworMCwgICAgICA4NjAxNiwgICAgICA4NjAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE2ODQwNWY0CiswLCAgICAgIDg3MDQwLCAgICAgIDg3MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGE3OGRiOTcKKzAsICAgICAgODgwNjQsICAgICAgODgwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZDg3ZjcxMworMCwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMwNzUwNDA4CiswLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAxMWU3YjUKKzAsICAgICAgOTExMzYsICAgICAgOTExMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOTA5MGFmNAorMCwgICAgICA5MjE2MCwgICAgICA5MjE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMxMjJmMWE3CiswLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2RjNGIxMTMKKzAsICAgICAgOTQyMDgsICAgICAgOTQyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyM2M0ZWM3YgorMCwgICAgICA5NTIzMiwgICAgICA5NTIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDMzNDAxNTlhCiswLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjA2Y2RhOTEKKzAsICAgICAgOTcyODAsICAgICAgOTcyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMTc0NDVlYworMCwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQyMjJkM2ExCiswLCAgICAgIDk5MzI4LCAgICAgIDk5MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDg1NWU2MWQKKzAsICAgICAxMDAzNTIsICAgICAxMDAzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NDRlZWJjNQorMCwgICAgIDEwMTM3NiwgICAgIDEwMTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFkMzYwN2MwCiswLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQ5YjFhY2EKKzAsICAgICAxMDM0MjQsICAgICAxMDM0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YzZhMGExYQorMCwgICAgIDEwNDQ0OCwgICAgIDEwNDQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA0ZDJiM2U5CiswLCAgICAgMTA1NDcyLCAgICAgMTA1NDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjE1ZDAyMTYKKzAsICAgICAxMDY0OTYsICAgICAxMDY0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDE1ZjcwOQorMCwgICAgIDEwNzUyMCwgICAgIDEwNzUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3YTcxNzhlCiswLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmFhNWU2NjUKKzAsICAgICAxMDk1NjgsICAgICAxMDk1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYTlmMWEwOAorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVhYTZlMTAzCiswLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGFlMTAwZDYKKzAsICAgICAxMTI2NDAsICAgICAxMTI2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NTg1MjUxYworMCwgICAgIDExMzY2NCwgICAgIDExMzY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVlYjIyODlhCiswLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGQwYzBjZmMKKzAsICAgICAxMTU3MTIsICAgICAxMTU3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZTVjZDU4ZgorMCwgICAgIDExNjczNiwgICAgIDExNjczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNhM2ZjOWM3CiswLCAgICAgMTE3NzYwLCAgICAgMTE3NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGRhM2ViZTcKKzAsICAgICAxMTg3ODQsICAgICAxMTg3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwODRkY2I0MQorMCwgICAgIDExOTgwOCwgICAgIDExOTgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBhZGMyYTljCiswLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjRiMGZhMGYKKzAsICAgICAxMjE4NTYsICAgICAxMjE4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMjVmZmFkZAorMCwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQwYjBhNDg3CiswLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzJlZGYwZjMKKzAsICAgICAxMjQ5MjgsICAgICAxMjQ5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDc4ZDU5NQorMCwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRhYzliYjI5CiswLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGE1MGFkNzcKKzAsICAgICAxMjgwMDAsICAgICAxMjgwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNmJiZWJjNworMCwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkMzNjYTI5CiswLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODYzYjliYTcKKzAsICAgICAxMzEwNzIsICAgICAxMzEwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MWNiZjE3ZgorMCwgICAgIDEzMjA5NiwgICAgIDEzMjA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUxOWRmNTY3CiswLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTliNTAzNTkKKzAsICAgICAxMzQxNDQsICAgICAxMzQxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NjQwZjBmYworMCwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU0N2RmMmI4CiswLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWU2YWYyYTgKKzAsICAgICAxMzcyMTYsICAgICAxMzcyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzcwZjllZQorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBkNjkxYTdmCiswLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGIyY2YzMGQKKzAsICAgICAxNDAyODgsICAgICAxNDAyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ODY4ZWZjZQorMCwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY2MDJlYjg4CiswLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWZiYmVmZDQKKzAsICAgICAxNDMzNjAsICAgICAxNDMzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZjgxZTQzNQorMCwgICAgIDE0NDM4NCwgICAgIDE0NDM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA2YjRlNjM3CiswLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzQxODAzZmIKKzAsICAgICAxNDY0MzIsICAgICAxNDY0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMmE3ZGZmOQorMCwgICAgIDE0NzQ1NiwgICAgIDE0NzQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJkMmZmZTBiCiswLCAgICAgMTQ4NDgwLCAgICAgMTQ4NDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWQxOWY5ZWIKKzAsICAgICAxNDk1MDQsICAgICAxNDk1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhM2M0ZjRhNAorMCwgICAgIDE1MDUyOCwgICAgIDE1MDUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZhYzIwNzk2CiswLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzE1Y2Y4MWUKKzAsICAgICAxNTI1NzYsICAgICAxNTI1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZjBkZjc2ZQorMCwgICAgIDE1MzYwMCwgICAgIDE1MzYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZmOTJlNGNhCiswLCAgICAgMTU0NjI0LCAgICAgMTU0NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWQzMjA3OWMKKzAsICAgICAxNTU2NDgsICAgICAxNTU2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDAzZTZlNworMCwgICAgIDE1NjY3MiwgICAgIDE1NjY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZmMDFmOTIzCiswLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWU0ZDE3MTMKKzAsICAgICAxNTg3MjAsICAgICAxNTg3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZGI5ZTNmNAorMCwgICAgIDE1OTc0NCwgICAgIDE1OTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVlZjlmMjBhCiswLCAgICAgMTYwNzY4LCAgICAgMTYwNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTMyOWQ5MDAKKzAsICAgICAxNjE3OTIsICAgICAxNjE3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmOWQwMDAzYgorMCwgICAgIDE2MjgxNiwgICAgIDE2MjgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDllNDJmNjJjCiswLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzFmMmVlNjQKKzAsICAgICAxNjQ4NjQsICAgICAxNjQ4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZDM0MGJiNgorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ3Y2JmMDA0CiswLCAgICAgMTY2OTEyLCAgICAgMTY2OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjYyMTA1YzkKKzAsICAgICAxNjc5MzYsICAgICAxNjc5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmM2QzMGRjNworMCwgICAgIDE2ODk2MCwgICAgIDE2ODk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA5YWRmMjkxCiswLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjJiMjA3ZTMKKzAsICAgICAxNzEwMDgsICAgICAxNzEwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1OGRmMDYzOQorMCwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM3M2FkOWNkCiswLCAgICAgMTczMDU2LCAgICAgMTczMDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjBiMmZjOGIKKzAsICAgICAxNzQwODAsICAgICAxNzQwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzJhZjZiOAorMCwgICAgIDE3NTEwNCwgICAgIDE3NTEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNlZTFmNTQ0CiswLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTg4ZGRlZDQKKzAsICAgICAxNzcxNTIsICAgICAxNzcxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNjA2ZTRkNAorMCwgICAgIDE3ODE3NiwgICAgIDE3ODE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyMjAwMDZkCiswLCAgICAgMTc5MjAwLCAgICAgMTc5MjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGU4NzA1OTIKKzAsICAgICAxODAyMjQsICAgICAxODAyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNWE2ZWFhZgorMCwgICAgIDE4MTI0OCwgICAgIDE4MTI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU0ZWFmMjY2CiswLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGI1NWYyMjUKKzAsICAgICAxODMyOTYsICAgICAxODMyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MDU1MDgyOAorMCwgICAgIDE4NDMyMCwgICAgIDE4NDMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNmODBmYWJkCiswLCAgICAgMTg1MzQ0LCAgICAgMTg1MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTljOGViOGQKKzAsICAgICAxODYzNjgsICAgICAxODYzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMjVmZTY2MworMCwgICAgIDE4NzM5MiwgICAgIDE4NzM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQxNzIwYWRiCiswLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWZkMWZjOTYKKzAsICAgICAxODk0NDAsICAgICAxODk0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDdjZjllYworMCwgICAgIDE5MDQ2NCwgICAgIDE5MDQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVhYjNlZmUwCiswLCAgICAgMTkxNDg4LCAgICAgMTkxNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2I3NWVlNGMKKzAsICAgICAxOTI1MTIsICAgICAxOTI1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkODY2ZjZjMQorMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwYzRmOTExCiswLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzI2OGU3OTAKKzAsICAgICAxOTU1ODQsICAgICAxOTU1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MjU4ZWU0YQorMCwgICAgIDE5NjYwOCwgICAgIDE5NjYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg4MGIwMDNhCiswLCAgICAgMTk3NjMyLCAgICAgMTk3NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTE3YmZkNzEKKzAsICAgICAxOTg2NTYsICAgICAxOTg2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYjc5MDBjNworMCwgICAgIDE5OTY4MCwgICAgIDE5OTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNmM2ZlOGI1CiswLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWRlMmYwMTAKKzAsICAgICAyMDE3MjgsICAgICAyMDE3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNmI0ZmY0YQorMCwgICAgIDIwMjc1MiwgICAgIDIwMjc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM3NDIwYzcyCiswLCAgICAgMjAzNzc2LCAgICAgMjAzNzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDU2MGU4MjEKKzAsICAgICAyMDQ4MDAsICAgICAyMDQ4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNjc2ZjAzNworMCwgICAgIDIwNTgyNCwgICAgIDIwNTgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxNDFmM2UxCiswLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGFmMTAyMTAKKzAsICAgICAyMDc4NzIsICAgICAyMDc4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMGM1ZmI5OQorMCwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM5Y2RmNTAxCiswLCAgICAgMjA5OTIwLCAgICAgMjA5OTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGUzN2Y2OWQKKzAsICAgICAyMTA5NDQsICAgICAyMTA5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MjIwMDA2ZAorMCwgICAgIDIxMTk2OCwgICAgIDIxMTk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRlODcwNTkyCiswLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjVhNmVhYWYKKzAsICAgICAyMTQwMTYsICAgICAyMTQwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNGVhZjI2NgorMCwgICAgIDIxNTA0MCwgICAgIDIxNTA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRiNTVmMjI1CiswLCAgICAgMjE2MDY0LCAgICAgMjE2MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDA1NTA4MjgKKzAsICAgICAyMTcwODgsICAgICAyMTcwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZjgwZmFiZAorMCwgICAgIDIxODExMiwgICAgIDIxODExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU5YzhlYjhkCiswLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDI1ZmU2NjMKKzAsICAgICAyMjAxNjAsICAgICAyMjAxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MTcyMGFkYgorMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmZDFmYzk2CiswLCAgICAgMjIyMjA4LCAgICAgMjIyMjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDA3Y2Y5ZWMKKzAsICAgICAyMjMyMzIsICAgICAyMjMyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYWIzZWZlMAorMCwgICAgIDIyNDI1NiwgICAgIDIyNDI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNiNzVlZTRjCiswLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDg2NmY2YzEKKzAsICAgICAyMjYzMDQsICAgICAyMjYzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMGM0ZjkxMQorMCwgICAgIDIyNzMyOCwgICAgIDIyNzMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcyNjhlNzkwCiswLCAgICAgMjI4MzUyLCAgICAgMjI4MzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjI1OGVlNGEKKzAsICAgICAyMjkzNzYsICAgICAyMjkzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ODBiMDAzYQorMCwgICAgIDIzMDQwMCwgICAgIDIzMDQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDExN2JmZDcxCiswLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWI3OTAwYzcKKzAsICAgICAyMzI0NDgsICAgICAyMzI0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZjNmZThiNQorMCwgICAgIDIzMzQ3MiwgICAgIDIzMzQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkZTJmMDEwCiswLCAgICAgMjM0NDk2LCAgICAgMjM0NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTZiNGZmNGEKKzAsICAgICAyMzU1MjAsICAgICAyMzU1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNzQyMGM3MgorMCwgICAgIDIzNjU0NCwgICAgIDIzNjU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1NjBlODIxCiswLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDY3NmYwMzcKKzAsICAgICAyMzg1OTIsICAgICAyMzg1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMTQxZjNlMQorMCwgICAgIDIzOTYxNiwgICAgIDIzOTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhhZjEwMjEwCiswLCAgICAgMjQwNjQwLCAgICAgMjQwNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzBjNWZiOTkKKzAsICAgICAyNDE2NjQsICAgICAyNDE2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzOWNkZjUwMQorMCwgICAgIDI0MjY4OCwgICAgIDI0MjY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhlMzdmNjlkCiswLCAgICAgMjQzNzEyLCAgICAgMjQzNzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjIyMDAwNmQKKzAsICAgICAyNDQ3MzYsICAgICAyNDQ3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZTg3MDU5MgorMCwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1YTZlYWFmCiswLCAgICAgMjQ2Nzg0LCAgICAgMjQ2Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTRlYWYyNjYKKzAsICAgICAyNDc4MDgsICAgICAyNDc4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYjU1ZjIyNQorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQwNTUwODI4CiswLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2Y4MGZhYmQKKzAsICAgICAyNTA4ODAsICAgICAyNTA4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlOWM4ZWI4ZAorMCwgICAgIDI1MTkwNCwgICAgIDI1MTkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQyNWZlNjYzCiswLCAgICAgMjUyOTI4LCAgICAgMjUyOTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDE3MjBhZGIKKzAsICAgICAyNTM5NTIsICAgICAyNTM5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZmQxZmM5NgorMCwgICAgIDI1NDk3NiwgICAgIDI1NDk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwN2NmOWVjCiswLCAgICAgMjU2MDAwLCAgICAgMjU2MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWFiM2VmZTAKKzAsICAgICAyNTcwMjQsICAgICAyNTcwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYjc1ZWU0YworMCwgICAgIDI1ODA0OCwgICAgIDI1ODA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ4NjZmNmMxCiswLCAgICAgMjU5MDcyLCAgICAgMjU5MDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTBjNGY5MTEKKzAsICAgICAyNjAwOTYsICAgICAyNjAwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MjY4ZTc5MAorMCwgICAgIDI2MTEyMCwgICAgIDI2MTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyNThlZTRhCiswLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODgwYjAwM2EKKzAsICAgICAyNjMxNjgsICAgICAyNjMxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMTdiZmQ3MQorMCwgICAgIDI2NDE5MiwgICAgIDI2NDE5MiwgICAgICA0MDgsICAgICAxNjMyLCAweDQ5NWQzNjBhCiswLCAgICAgMjY0NjAwLCAgICAgMjY0NjAwLCAgICAgMTQxMSwgICAgIDU2NDQsIDB4MzQ5MjAxNzMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZW1waGFzaXMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWVtcGhhc2lzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDllNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWVtcGhhc2lzCkBAIC0wLDAgKzEsNTI4IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiOWM1ZmVmZAorMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIyYWUwYTkwCiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTdlNmU5ZjMKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ODM3ZjI2ZgorMCwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxNTAwMzc2CiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjQ2NTAzNzgKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMjYxZjViMQorMCwgICAgICAgNzE2OCwgICAgICAgNzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMwMzhmM2ZkCiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGUxOTA4YzYKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZDZiZmQzMworMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcwMzZmMjNmCiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWY3M2U5YTEKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYmE3MDQwNAorMCwgICAgICAxMzMxMiwgICAgICAxMzMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzNGJmMjQ5CiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGM4OGZjMmIKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NWViZjljZgorMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxNmRmMGJkCiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTYzNWVhYzUKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNDFkMDU5ZQorMCwgICAgICAxOTQ1NiwgICAgICAxOTQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE5MDVmNGQzCiswLCAgICAgIDIwNDgwLCAgICAgIDIwNDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjczNmYxZmIKKzAsICAgICAgMjE1MDQsICAgICAgMjE1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTg5ZjAwNworMCwgICAgICAyMjUyOCwgICAgICAyMjUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgxZDFmZGFiCiswLCAgICAgIDIzNTUyLCAgICAgIDIzNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjE1NmY5N2QKKzAsICAgICAgMjQ1NzYsICAgICAgMjQ1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOTcxZWM4OQorMCwgICAgICAyNTYwMCwgICAgICAyNTYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRjYTFlYzRmCiswLCAgICAgIDI2NjI0LCAgICAgIDI2NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTE2ZmZjZjUKKzAsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMzkxZmRjOQorMCwgICAgICAyODY3MiwgICAgICAyODY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg1ZTBlZjQ1CiswLCAgICAgIDI5Njk2LCAgICAgIDI5Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODFkMzAxMmMKKzAsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MDNlZjExYgorMCwgICAgICAzMTc0NCwgICAgICAzMTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNjYTZmMTZkCiswLCAgICAgIDMyNzY4LCAgICAgIDMyNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Njc3NWZlYjEKKzAsICAgICAgMzM3OTIsICAgICAgMzM3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMmFlMGE5MAorMCwgICAgICAzNDgxNiwgICAgICAzNDgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk3ZTZlOWYzCiswLCAgICAgIDM1ODQwLCAgICAgIDM1ODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTgzN2YyNmYKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MTUwMDM3NgorMCwgICAgICAzNzg4OCwgICAgICAzNzg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0NjUwMzc4CiswLCAgICAgIDM4OTEyLCAgICAgIDM4OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDI2MWY1YjEKKzAsICAgICAgMzk5MzYsICAgICAgMzk5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMDM4ZjNmZAorMCwgICAgICA0MDk2MCwgICAgICA0MDk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhlMTkwOGM2CiswLCAgICAgIDQxOTg0LCAgICAgIDQxOTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQ2YmZkMzMKKzAsICAgICAgNDMwMDgsICAgICAgNDMwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MDM2ZjIzZgorMCwgICAgICA0NDAzMiwgICAgICA0NDAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFiYjhmYmRiCiswLCAgICAgIDQ1MDU2LCAgICAgIDQ1MDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODk4MGYwM2YKKzAsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNWEwZjRlZAorMCwgICAgICA0NzEwNCwgICAgICA0NzEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA0YWMwMzE0CiswLCAgICAgIDQ4MTI4LCAgICAgIDQ4MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmRkMGRjYTcKKzAsICAgICAgNDkxNTIsICAgICAgNDkxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3OTliZjFmZAorMCwgICAgICA1MDE3NiwgICAgICA1MDE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJhYTlmZGZkCiswLCAgICAgIDUxMjAwLCAgICAgIDUxMjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWI3Y2Y1NzEKKzAsICAgICAgNTIyMjQsICAgICAgNTIyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMzNiMGU1YQorMCwgICAgICA1MzI0OCwgICAgICA1MzI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgwMTdmMTE3CiswLCAgICAgIDU0MjcyLCAgICAgIDU0MjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWZjY2YzNWIKKzAsICAgICAgNTUyOTYsICAgICAgNTUyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZDY5ZjljYgorMCwgICAgICA1NjMyMCwgICAgICA1NjMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRkMDlmOTA1CiswLCAgICAgIDU3MzQ0LCAgICAgIDU3MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmE1M2YxODUKKzAsICAgICAgNTgzNjgsICAgICAgNTgzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNWI5MDdlNAorMCwgICAgICA1OTM5MiwgICAgICA1OTM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY2MzlmZWRiCiswLCAgICAgIDYwNDE2LCAgICAgIDYwNDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWU1OGY3NzEKKzAsICAgICAgNjE0NDAsICAgICAgNjE0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMTNkMThkNAorMCwgICAgICA2MjQ2NCwgICAgICA2MjQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3OTMwODQyCiswLCAgICAgIDYzNDg4LCAgICAgIDYzNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWI0NzAyZDQKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZDc1ZGQyNworMCwgICAgICA2NTUzNiwgICAgICA2NTUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDlhMWNlYjdiCiswLCAgICAgIDY2NTYwLCAgICAgIDY2NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWFkODA5YWMKKzAsICAgICAgNjc1ODQsICAgICAgNjc1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZGFmMWI1YQorMCwgICAgICA2ODYwOCwgICAgICA2ODYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE5MGEwMGE2CiswLCAgICAgIDY5NjMyLCAgICAgIDY5NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjM5ZjBkMGEKKzAsICAgICAgNzA2NTYsICAgICAgNzA2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYWY2MDk1MAorMCwgICAgICA3MTY4MCwgICAgICA3MTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU3ZDNlYjUzCiswLCAgICAgIDcyNzA0LCAgICAgIDcyNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGE3N2Y3ZmYKKzAsICAgICAgNzM3MjgsICAgICAgNzM3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMmJmZTNiOQorMCwgICAgICA3NDc1MiwgICAgICA3NDc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0YzVlMjg3CiswLCAgICAgIDc1Nzc2LCAgICAgIDc1Nzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5NDA0ODAKKzAsICAgICAgNzY4MDAsICAgICAgNzY4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2M2E5MTM0ZQorMCwgICAgICA3NzgyNCwgICAgICA3NzgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIyMTVlZTRkCiswLCAgICAgIDc4ODQ4LCAgICAgIDc4ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODc3N2Y3NDMKKzAsICAgICAgNzk4NzIsICAgICAgNzk4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MzNlMDVhYworMCwgICAgICA4MDg5NiwgICAgICA4MDg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiMWVlNjg1CiswLCAgICAgIDgxOTIwLCAgICAgIDgxOTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTdkMzAyMzgKKzAsICAgICAgODI5NDQsICAgICAgODI5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYjI0MTE4MAorMCwgICAgICA4Mzk2OCwgICAgICA4Mzk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDczM2FlYTI1CiswLCAgICAgIDg0OTkyLCAgICAgIDg0OTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTY3N2VhNTcKKzAsICAgICAgODYwMTYsICAgICAgODYwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZjVmZDZkNworMCwgICAgICA4NzA0MCwgICAgICA4NzA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM2NTIwYmNhCiswLCAgICAgIDg4MDY0LCAgICAgIDg4MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWU4NjBhMDYKKzAsICAgICAgODkwODgsICAgICAgODkwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMzA1NDI4YworMCwgICAgICA5MDExMiwgICAgICA5MDExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxYTgwMDhjCiswLCAgICAgIDkxMTM2LCAgICAgIDkxMTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDgxZmYxNWYKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwY2NhZDJlNworMCwgICAgICA5MzE4NCwgICAgICA5MzE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM2MTNiZjI5CiswLCAgICAgIDk0MjA4LCAgICAgIDk0MjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQxMWVmNzMKKzAsICAgICAgOTUyMzIsICAgICAgOTUyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MWY3ZTAxYgorMCwgICAgICA5NjI1NiwgICAgICA5NjI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzZDFlZTViCiswLCAgICAgIDk3MjgwLCAgICAgIDk3MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmM5NzIxZTIKKzAsICAgICAgOTgzMDQsICAgICAgOTgzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZDQ5Yzk0YgorMCwgICAgICA5OTMyOCwgICAgICA5OTMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGExMDJkOTYzCiswLCAgICAgMTAwMzUyLCAgICAgMTAwMzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWZkOGZlOTUKKzAsICAgICAxMDEzNzYsICAgICAxMDEzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOGM3MzhlMAorMCwgICAgIDEwMjQwMCwgICAgIDEwMjQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE5ODgyNjg2CiswLCAgICAgMTAzNDI0LCAgICAgMTAzNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmEzMGM0YjEKKzAsICAgICAxMDQ0NDgsICAgICAxMDQ0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NmVjZGIzMQorMCwgICAgIDEwNTQ3MiwgICAgIDEwNTQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU0MGNjZmY5CiswLCAgICAgMTA2NDk2LCAgICAgMTA2NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjM2NWNmNWYKKzAsICAgICAxMDc1MjAsICAgICAxMDc1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYWI1MWRjYworMCwgICAgIDEwODU0NCwgICAgIDEwODU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI2NmZkNTUzCiswLCAgICAgMTA5NTY4LCAgICAgMTA5NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGFjNDJmNTgKKzAsICAgICAxMTA1OTIsICAgICAxMTA1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYWIyMzYyOAorMCwgICAgIDExMTYxNiwgICAgIDExMTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk0YzlhOGJmCiswLCAgICAgMTEyNjQwLCAgICAgMTEyNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2JhNWZmNDEKKzAsICAgICAxMTM2NjQsICAgICAxMTM2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNmJmZDVkYgorMCwgICAgIDExNDY4OCwgICAgIDExNDY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiOWVmOThmCiswLCAgICAgMTE1NzEyLCAgICAgMTE1NzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTU2MjFhMDIKKzAsICAgICAxMTY3MzYsICAgICAxMTY3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZWRkMjhlYworMCwgICAgIDExNzc2MCwgICAgIDExNzc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRkZjVlMDQ1CiswLCAgICAgMTE4Nzg0LCAgICAgMTE4Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDlmMGUwYTkKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMThmMGNhMAorMCwgICAgIDEyMDgzMiwgICAgIDEyMDgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEwZmEwMGM2CiswLCAgICAgMTIxODU2LCAgICAgMTIxODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWU0MDZlNmMKKzAsICAgICAxMjI4ODAsICAgICAxMjI4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTNmMjNiYworMCwgICAgIDEyMzkwNCwgICAgIDEyMzkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNiZjQwOWQwCiswLCAgICAgMTI0OTI4LCAgICAgMTI0OTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDk5YjNhYzgKKzAsICAgICAxMjU5NTIsICAgICAxMjU5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyZWY5Mzk4MAorMCwgICAgIDEyNjk3NiwgICAgIDEyNjk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzMDkyYmZhCiswLCAgICAgMTI4MDAwLCAgICAgMTI4MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDgzODA5M2EKKzAsICAgICAxMjkwMjQsICAgICAxMjkwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMWJmZjIwOQorMCwgICAgIDEzMDA0OCwgICAgIDEzMDA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRlZjA0ZjEyCiswLCAgICAgMTMxMDcyLCAgICAgMTMxMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTMwZGQ3ODcKKzAsICAgICAxMzIwOTYsICAgICAxMzIwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjODYyMTAzMAorMCwgICAgIDEzMzEyMCwgICAgIDEzMzEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFiMmJmODY3CiswLCAgICAgMTM0MTQ0LCAgICAgMTM0MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDEyMjAzNDEKKzAsICAgICAxMzUxNjgsICAgICAxMzUxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YzhkZmRiMQorMCwgICAgIDEzNjE5MiwgICAgIDEzNjE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU4MWRmODEzCiswLCAgICAgMTM3MjE2LCAgICAgMTM3MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjgyMGZlOGQKKzAsICAgICAxMzgyNDAsICAgICAxMzgyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZjlkZmU0OQorMCwgICAgIDEzOTI2NCwgICAgIDEzOTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJmODRmMTQ0CiswLCAgICAgMTQwMjg4LCAgICAgMTQwMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWI5ZGVlYzgKKzAsICAgICAxNDEzMTIsICAgICAxNDEzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZDdiZjViOQorMCwgICAgIDE0MjMzNiwgICAgIDE0MjMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJlY2ZmNWVhCiswLCAgICAgMTQzMzYwLCAgICAgMTQzMzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mjg3MmU1YzAKKzAsICAgICAxNDQzODQsICAgICAxNDQzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZTJmZjcxMworMCwgICAgIDE0NTQwOCwgICAgIDE0NTQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBiMmRmNzU3CiswLCAgICAgMTQ2NDMyLCAgICAgMTQ2NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTAzMGZhMGEKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNWI1ZjNkYQorMCwgICAgIDE0ODQ4MCwgICAgIDE0ODQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNlNGNmOWE2CiswLCAgICAgMTQ5NTA0LCAgICAgMTQ5NTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWVhY2Y2MWYKKzAsICAgICAxNTA1MjgsICAgICAxNTA1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYmZmZjU0OQorMCwgICAgIDE1MTU1MiwgICAgIDE1MTU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlZWFlNjBhCiswLCAgICAgMTUyNTc2LCAgICAgMTUyNTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg4ZWYyNTgKKzAsICAgICAxNTM2MDAsICAgICAxNTM2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNTQ2ZjMwZAorMCwgICAgIDE1NDYyNCwgICAgIDE1NDYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBhODRlNmY4CiswLCAgICAgMTU1NjQ4LCAgICAgMTU1NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTdiMGVlMjcKKzAsICAgICAxNTY2NzIsICAgICAxNTY2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNGQwZjZlZQorMCwgICAgIDE1NzY5NiwgICAgIDE1NzY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA5ZmEwNDJhCiswLCAgICAgMTU4NzIwLCAgICAgMTU4NzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWEzY2Y0MTgKKzAsICAgICAxNTk3NDQsICAgICAxNTk3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4OWQ4MDE3ZgorMCwgICAgIDE2MDc2OCwgICAgIDE2MDc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY0ZWIwMzIwCiswLCAgICAgMTYxNzkyLCAgICAgMTYxNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTQwZGYyNzkKKzAsICAgICAxNjI4MTYsICAgICAxNjI4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZGM0ZmQyNQorMCwgICAgIDE2Mzg0MCwgICAgIDE2Mzg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2NmFmOTdjCiswLCAgICAgMTY0ODY0LCAgICAgMTY0ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzMwNmY0ZTIKKzAsICAgICAxNjU4ODgsICAgICAxNjU4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NzgyZWRhNAorMCwgICAgIDE2NjkxMiwgICAgIDE2NjkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM2MzVmYWQ4CiswLCAgICAgMTY3OTM2LCAgICAgMTY3OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzM0NGVhYmUKKzAsICAgICAxNjg5NjAsICAgICAxNjg5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MTQzZmRhMAorMCwgICAgIDE2OTk4NCwgICAgIDE2OTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMzZTdlYjdmCiswLCAgICAgMTcxMDA4LCAgICAgMTcxMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGNhMGU5NDcKKzAsICAgICAxNzIwMzIsICAgICAxNzIwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YjFiZjgwZAorMCwgICAgIDE3MzA1NiwgICAgIDE3MzA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJiMTVlYWI3CiswLCAgICAgMTc0MDgwLCAgICAgMTc0MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDgwMGY3Y2IKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkM2Q0ZTk2MAorMCwgICAgIDE3NjEyOCwgICAgIDE3NjEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJmYzMwZjJmCiswLCAgICAgMTc3MTUyLCAgICAgMTc3MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjQxMGYwOTIKKzAsICAgICAxNzgxNzYsICAgICAxNzgxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzUwZmRkZgorMCwgICAgIDE3OTIwMCwgICAgIDE3OTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3N2EwN2M2CiswLCAgICAgMTgwMjI0LCAgICAgMTgwMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWQ0OGVkNTkKKzAsICAgICAxODEyNDgsICAgICAxODEyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNmFlMDJhOAorMCwgICAgIDE4MjI3MiwgICAgIDE4MjI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwNmJlNDMzCiswLCAgICAgMTgzMjk2LCAgICAgMTgzMjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjQ2NWZjNTQKKzAsICAgICAxODQzMjAsICAgICAxODQzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NDVkYWNiOQorMCwgICAgIDE4NTM0NCwgICAgIDE4NTM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM3ODNlNzY1CiswLCAgICAgMTg2MzY4LCAgICAgMTg2MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDc5ZmViNDgKKzAsICAgICAxODczOTIsICAgICAxODczOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNGYyMDUwZgorMCwgICAgIDE4ODQxNiwgICAgIDE4ODQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkZjFmNDQxCiswLCAgICAgMTg5NDQwLCAgICAgMTg5NDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg2NGYyMjUKKzAsICAgICAxOTA0NjQsICAgICAxOTA0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYmFjZjA4NAorMCwgICAgIDE5MTQ4OCwgICAgIDE5MTQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFhMTRmMDgyCiswLCAgICAgMTkyNTEyLCAgICAgMTkyNTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmFjMTBmOGIKKzAsICAgICAxOTM1MzYsICAgICAxOTM1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNDUyMDIxMAorMCwgICAgIDE5NDU2MCwgICAgIDE5NDU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZlZTRmOGMzCiswLCAgICAgMTk1NTg0LCAgICAgMTk1NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWRmNWU0YzIKKzAsICAgICAxOTY2MDgsICAgICAxOTY2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YmYyMDU4NAorMCwgICAgIDE5NzYzMiwgICAgIDE5NzYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU0MWRlYmY1CiswLCAgICAgMTk4NjU2LCAgICAgMTk4NjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWEzNTA3OTYKKzAsICAgICAxOTk2ODAsICAgICAxOTk2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMzg4ZmE4MworMCwgICAgIDIwMDcwNCwgICAgIDIwMDcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk4MzliMGMyCiswLCAgICAgMjAxNzI4LCAgICAgMjAxNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmM5YWZmZjAKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MzEwMGE3YworMCwgICAgIDIwMzc3NiwgICAgIDIwMzc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1NmRmMDcwCiswLCAgICAgMjA0ODAwLCAgICAgMjA0ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzFkOGVmYTcKKzAsICAgICAyMDU4MjQsICAgICAyMDU4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZTgwMDQxMgorMCwgICAgIDIwNjg0OCwgICAgIDIwNjg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdiZjdmODQwCiswLCAgICAgMjA3ODcyLCAgICAgMjA3ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTQ4MDA0NGQKKzAsICAgICAyMDg4OTYsICAgICAyMDg4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MDIwMTIxNworMCwgICAgIDIwOTkyMCwgICAgIDIwOTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0MTBmMDkyCiswLCAgICAgMjEwOTQ0LCAgICAgMjEwOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDM1MGZkZGYKKzAsICAgICAyMTE5NjgsICAgICAyMTE5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NzdhMDdjNgorMCwgICAgIDIxMjk5MiwgICAgIDIxMjk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkNDhlZDU5CiswLCAgICAgMjE0MDE2LCAgICAgMjE0MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDZhZTAyYTgKKzAsICAgICAyMTUwNDAsICAgICAyMTUwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMDZiZTQzMworMCwgICAgIDIxNjA2NCwgICAgIDIxNjA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY0NjVmYzU0CiswLCAgICAgMjE3MDg4LCAgICAgMjE3MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzQ1ZGFjYjkKKzAsICAgICAyMTgxMTIsICAgICAyMTgxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNzgzZTc2NQorMCwgICAgIDIxOTEzNiwgICAgIDIxOTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3OWZlYjQ4CiswLCAgICAgMjIwMTYwLCAgICAgMjIwMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzRmMjA1MGYKKzAsICAgICAyMjExODQsICAgICAyMjExODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZGYxZjQ0MQorMCwgICAgIDIyMjIwOCwgICAgIDIyMjIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NjRmMjI1CiswLCAgICAgMjIzMjMyLCAgICAgMjIzMjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWJhY2YwODQKKzAsICAgICAyMjQyNTYsICAgICAyMjQyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTE0ZjA4MgorMCwgICAgIDIyNTI4MCwgICAgIDIyNTI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJhYzEwZjhiCiswLCAgICAgMjI2MzA0LCAgICAgMjI2MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTQ1MjAyMTAKKzAsICAgICAyMjczMjgsICAgICAyMjczMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZWU0ZjhjMworMCwgICAgIDIyODM1MiwgICAgIDIyODM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFkZjVlNGMyCiswLCAgICAgMjI5Mzc2LCAgICAgMjI5Mzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2JmMjA1ODQKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NDFkZWJmNQorMCwgICAgIDIzMTQyNCwgICAgIDIzMTQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlhMzUwNzk2CiswLCAgICAgMjMyNDQ4LCAgICAgMjMyNDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTM4OGZhODMKKzAsICAgICAyMzM0NzIsICAgICAyMzM0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ODM5YjBjMgorMCwgICAgIDIzNDQ5NiwgICAgIDIzNDQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZjOWFmZmYwCiswLCAgICAgMjM1NTIwLCAgICAgMjM1NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzMxMDBhN2MKKzAsICAgICAyMzY1NDQsICAgICAyMzY1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNTZkZjA3MAorMCwgICAgIDIzNzU2OCwgICAgIDIzNzU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxZDhlZmE3CiswLCAgICAgMjM4NTkyLCAgICAgMjM4NTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGU4MDA0MTIKKzAsICAgICAyMzk2MTYsICAgICAyMzk2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YmY3Zjg0MAorMCwgICAgIDI0MDY0MCwgICAgIDI0MDY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE0ODAwNDRkCiswLCAgICAgMjQxNjY0LCAgICAgMjQxNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjAyMDEyMTcKKzAsICAgICAyNDI2ODgsICAgICAyNDI2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNDEwZjA5MgorMCwgICAgIDI0MzcxMiwgICAgIDI0MzcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzNTBmZGRmCiswLCAgICAgMjQ0NzM2LCAgICAgMjQ0NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDc3YTA3YzYKKzAsICAgICAyNDU3NjAsICAgICAyNDU3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZDQ4ZWQ1OQorMCwgICAgIDI0Njc4NCwgICAgIDI0Njc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ2YWUwMmE4CiswLCAgICAgMjQ3ODA4LCAgICAgMjQ3ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjA2YmU0MzMKKzAsICAgICAyNDg4MzIsICAgICAyNDg4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNDY1ZmM1NAorMCwgICAgIDI0OTg1NiwgICAgIDI0OTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc0NWRhY2I5CiswLCAgICAgMjUwODgwLCAgICAgMjUwODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mzc4M2U3NjUKKzAsICAgICAyNTE5MDQsICAgICAyNTE5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NzlmZWI0OAorMCwgICAgIDI1MjkyOCwgICAgIDI1MjkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM0ZjIwNTBmCiswLCAgICAgMjUzOTUyLCAgICAgMjUzOTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWRmMWY0NDEKKzAsICAgICAyNTQ5NzYsICAgICAyNTQ5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODY0ZjIyNQorMCwgICAgIDI1NjAwMCwgICAgIDI1NjAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGViYWNmMDg0CiswLCAgICAgMjU3MDI0LCAgICAgMjU3MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWExNGYwODIKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYWMxMGY4YgorMCwgICAgIDI1OTA3MiwgICAgIDI1OTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE0NTIwMjEwCiswLCAgICAgMjYwMDk2LCAgICAgMjYwMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmVlNGY4YzMKKzAsICAgICAyNjExMjAsICAgICAyNjExMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZGY1ZTRjMgorMCwgICAgIDI2MjE0NCwgICAgIDI2MjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdiZjIwNTg0CiswLCAgICAgMjYzMTY4LCAgICAgMjYzMTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQxZGViZjUKKzAsICAgICAyNjQxOTIsICAgICAyNjQxOTIsICAgICAgNDA4LCAgICAgMTYzMiwgMHhhZGQwMmQzOQorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmQ1MTBjOGUKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwOWRjZjg5NQorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ4Y2JlMjlmCiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWZjZmZiNTEKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMzg0MGViZQorMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZjZjBmNjBmCiswLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2Q4MmY0YWQKKzAsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzk2MDM0NAorMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRlY2JmNmY5CiswLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzgzZDAwMGUKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYTQ2MDdmZQorMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFiYzdmOGFkCiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGEyMmYwN2QKKzAsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiY2ViZmM2YgorMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3MDIwYTIwCiswLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmEyOGY5NGIKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MjZlZTNiNQorMCwgICAgICAxNzQwOCwgICAgICAxNzQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE2MWNmOTg1CiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDBlOTA5Y2UKKzAsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYmY4ZjJlZgorMCwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMyMmZlOTgzCiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWFkMmZlM2YKKzAsICAgICAgMjI1MjgsICAgICAgMjI1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYjUxZmI5OQorMCwgICAgICAyMzU1MiwgICAgICAyMzU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0MzBlMTE3CiswLCAgICAgIDI0NTc2LCAgICAgIDI0NTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2Q3MmY3NGYKKzAsICAgICAgMjU2MDAsICAgICAgMjU2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMmIxZjI2OQorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA0NjllMDM1CiswLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDE2NGY1YmYKKzAsICAgICAgMjg2NzIsICAgICAgMjg2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNmY4MDNhYQorMCwgICAgICAyOTY5NiwgICAgICAyOTY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM1NjlmM2U5CiswLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODY2MmVjNDUKKzAsICAgICAgMzE3NDQsICAgICAgMzE3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MmZkZmViNworMCwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkxNWYxMmNlCiswLCAgICAgIDMzNzkyLCAgICAgIDMzNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDlkY2Y4OTUKKzAsICAgICAgMzQ4MTYsICAgICAgMzQ4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOGNiZTI5ZgorMCwgICAgICAzNTg0MCwgICAgICAzNTg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVmY2ZmYjUxCiswLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTM4NDBlYmUKKzAsICAgICAgMzc4ODgsICAgICAgMzc4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmY2YwZjYwZgorMCwgICAgICAzODkxMiwgICAgICAzODkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNkODJmNGFkCiswLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTc5NjAzNDQKKzAsICAgICAgNDA5NjAsICAgICAgNDA5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZWNiZjZmOQorMCwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4M2QwMDBlCiswLCAgICAgIDQzMDA4LCAgICAgIDQzMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWE0NjA3ZmUKKzAsICAgICAgNDQwMzIsICAgICAgNDQwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZTg0MGI4YQorMCwgICAgICA0NTA1NiwgICAgICA0NTA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ1ZDMwZTgwCiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzMxYmVmNGYKKzAsICAgICAgNDcxMDQsICAgICAgNDcxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YjEzMDJlNAorMCwgICAgICA0ODEyOCwgICAgICA0ODEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBiMjExNDRlCiswLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yjg3M2U3YjEKKzAsICAgICAgNTAxNzYsICAgICAgNTAxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MTRlMDdlZQorMCwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdlOWRmYzM3CiswLCAgICAgIDUyMjI0LCAgICAgIDUyMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODI1NWY5YjcKKzAsICAgICAgNTMyNDgsICAgICAgNTMyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5OGE3ZWJlYgorMCwgICAgICA1NDI3MiwgICAgICA1NDI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY0MzhlZWIxCiswLCAgICAgIDU1Mjk2LCAgICAgIDU1Mjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzFmNDA1NDIKKzAsICAgICAgNTYzMjAsICAgICAgNTYzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZmI3ZWIzNQorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU5MjIwNTgyCiswLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjFhODBlM2EKKzAsICAgICAgNTkzOTIsICAgICAgNTkzOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlOGZmMGYxNAorMCwgICAgICA2MDQxNiwgICAgICA2MDQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ4OTgwYWMyCiswLCAgICAgIDYxNDQwLCAgICAgIDYxNDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OThkOWZmZGQKKzAsICAgICAgNjI0NjQsICAgICAgNjI0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZGI4ZjJmNQorMCwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg5MmYwNmZhCiswLCAgICAgIDY0NTEyLCAgICAgIDY0NTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YThkZWZiY2IKKzAsICAgICAgNjU1MzYsICAgICAgNjU1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMzlkMGYzOAorMCwgICAgICA2NjU2MCwgICAgICA2NjU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU5YmVmMDliCiswLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTkzMGZkNjcKKzAsICAgICAgNjg2MDgsICAgICAgNjg2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3OGNjMWU0MgorMCwgICAgICA2OTYzMiwgICAgICA2OTYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhMmVlZWViCiswLCAgICAgIDcwNjU2LCAgICAgIDcwNjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGY2NjBjNmEKKzAsICAgICAgNzE2ODAsICAgICAgNzE2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMGZmMDI0MAorMCwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQyMWRkNGE1CiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2FiZGQwYTMKKzAsICAgICAgNzQ3NTIsICAgICAgNzQ3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzJlMjU3OAorMCwgICAgICA3NTc3NiwgICAgICA3NTc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI0YjVlMjZkCiswLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWYzZTEzNmMKKzAsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMWNjZjFkZAorMCwgICAgICA3ODg0OCwgICAgICA3ODg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQwOGVmOWY5CiswLCAgICAgIDc5ODcyLCAgICAgIDc5ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzZjNDE1ZjgKKzAsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMjY5ZjYzZgorMCwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU2NWYwN2ZlCiswLCAgICAgIDgyOTQ0LCAgICAgIDgyOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzk4MzFjY2MKKzAsICAgICAgODM5NjgsICAgICAgODM5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OTA3ZjcyYgorMCwgICAgICA4NDk5MiwgICAgICA4NDk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDljZmFlODYxCiswLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmVkN2ZiYmYKKzAsICAgICAgODcwNDAsICAgICAgODcwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYjE3MThmMAorMCwgICAgICA4ODA2NCwgICAgICA4ODA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwNjZmZTQxCiswLCAgICAgIDg5MDg4LCAgICAgIDg5MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjRmZWU4ODcKKzAsICAgICAgOTAxMTIsICAgICAgOTAxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMDIyMGJhYQorMCwgICAgICA5MTEzNiwgICAgICA5MTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDMyYWJjYzRiCiswLCAgICAgIDkyMTYwLCAgICAgIDkyMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTZkYmM2NzcKKzAsICAgICAgOTMxODQsICAgICAgOTMxODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYjcyZGQyMworMCwgICAgICA5NDIwOCwgICAgICA5NDIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJhZTBlYWVmCiswLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzIxOGZjMjUKKzAsICAgICAgOTYyNTYsICAgICAgOTYyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZWQ4ZjJhNworMCwgICAgICA5NzI4MCwgICAgICA5NzI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRkZjAyYzUwCiswLCAgICAgIDk4MzA0LCAgICAgIDk4MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTBlM2E1MWQKKzAsICAgICAgOTkzMjgsICAgICAgOTkzMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZjUyZGM5NQorMCwgICAgIDEwMDM1MiwgICAgIDEwMDM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYwYTEwMWE4CiswLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDFjMjAzODYKKzAsICAgICAxMDI0MDAsICAgICAxMDI0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDE3ZTg5MworMCwgICAgIDEwMzQyNCwgICAgIDEwMzQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhMzlmOTA3CiswLCAgICAgMTA0NDQ4LCAgICAgMTA0NDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmYwNWU1MDUKKzAsICAgICAxMDU0NzIsICAgICAxMDU0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzk3ZDIzNworMCwgICAgIDEwNjQ5NiwgICAgIDEwNjQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwNmJjMjgxCiswLCAgICAgMTA3NTIwLCAgICAgMTA3NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjQ5ZjA0MDIKKzAsICAgICAxMDg1NDQsICAgICAxMDg1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YmZkYjNhMworMCwgICAgIDEwOTU2OCwgICAgIDEwOTU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYwMTMwMmFlCiswLCAgICAgMTEwNTkyLCAgICAgMTEwNTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmRhZDEzYWMKKzAsICAgICAxMTE2MTYsICAgICAxMTE2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlOTVlZDBhMworMCwgICAgIDExMjY0MCwgICAgIDExMjY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhkZjJkZmUzCiswLCAgICAgMTEzNjY0LCAgICAgMTEzNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDE4M2U1MmYKKzAsICAgICAxMTQ2ODgsICAgICAxMTQ2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyM2YxZWNhZAorMCwgICAgIDExNTcxMiwgICAgIDExNTcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0MGMyMGUwCiswLCAgICAgMTE2NzM2LCAgICAgMTE2NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTFiZjJkMmMKKzAsICAgICAxMTc3NjAsICAgICAxMTc3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NWY4ZjJjYgorMCwgICAgIDExODc4NCwgICAgIDExODc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc5NjFlMDA3CiswLCAgICAgMTE5ODA4LCAgICAgMTE5ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjNhOTIwN2EKKzAsICAgICAxMjA4MzIsICAgICAxMjA4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MzgzZTU4MworMCwgICAgIDEyMTg1NiwgICAgIDEyMTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzZTM2ZTZhCiswLCAgICAgMTIyODgwLCAgICAgMTIyODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDI4MDNmMjIKKzAsICAgICAxMjM5MDQsICAgICAxMjM5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMWE3MDI1MgorMCwgICAgIDEyNDkyOCwgICAgIDEyNDkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRjZmUyMGY2CiswLCAgICAgMTI1OTUyLCAgICAgMTI1OTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmU2NjMwN2UKKzAsICAgICAxMjY5NzYsICAgICAxMjY5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4N2M5MjI5YworMCwgICAgIDEyODAwMCwgICAgIDEyODAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhlY2RmZGRiCiswLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2U0MWU0YjcKKzAsICAgICAxMzAwNDgsICAgICAxMzAwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NjhkNDZmYworMCwgICAgIDEzMTA3MiwgICAgIDEzMTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNjOTdiNDAzCiswLCAgICAgMTMyMDk2LCAgICAgMTMyMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTA0MTA1YzIKKzAsICAgICAxMzMxMjAsICAgICAxMzMxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlOGQ2ZjUzMQorMCwgICAgIDEzNDE0NCwgICAgIDEzNDE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlhNDEwMDc5CiswLCAgICAgMTM1MTY4LCAgICAgMTM1MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTI2MzE1MTEKKzAsICAgICAxMzYxOTIsICAgICAxMzYxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MzBmZjI3YworMCwgICAgIDEzNzIxNiwgICAgIDEzNzIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQxZjBmM2FiCiswLCAgICAgMTM4MjQwLCAgICAgMTM4MjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Njk4NWY1NjcKKzAsICAgICAxMzkyNjQsICAgICAxMzkyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZmM4MDA3NAorMCwgICAgIDE0MDI4OCwgICAgIDE0MDI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM2YzIxZGVmCiswLCAgICAgMTQxMzEyLCAgICAgMTQxMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjVkZGY4NTIKKzAsICAgICAxNDIzMzYsICAgICAxNDIzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNjFhZjQ2NAorMCwgICAgIDE0MzM2MCwgICAgIDE0MzM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjYWJmYmQxCiswLCAgICAgMTQ0Mzg0LCAgICAgMTQ0Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDY2ZTA2MmMKKzAsICAgICAxNDU0MDgsICAgICAxNDU0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYzY4ZWUwOAorMCwgICAgIDE0NjQzMiwgICAgIDE0NjQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVhZDRmNjFhCiswLCAgICAgMTQ3NDU2LCAgICAgMTQ3NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjNmZWVmMTQKKzAsICAgICAxNDg0ODAsICAgICAxNDg0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZjAzZTEyOAorMCwgICAgIDE0OTUwNCwgICAgIDE0OTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjNTRmZDA4CiswLCAgICAgMTUwNTI4LCAgICAgMTUwNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWFlNmY0Y2YKKzAsICAgICAxNTE1NTIsICAgICAxNTE1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNGJhZTdkNQorMCwgICAgIDE1MjU3NiwgICAgIDE1MjU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVlZmMxMjkzCiswLCAgICAgMTUzNjAwLCAgICAgMTUzNjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGMyYmZkNTAKKzAsICAgICAxNTQ2MjQsICAgICAxNTQ2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzJlZjZmNQorMCwgICAgIDE1NTY0OCwgICAgIDE1NTY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQwZjBlNGE2CiswLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGViNGZlNzgKKzAsICAgICAxNTc2OTYsICAgICAxNTc2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNmVlZWY5MAorMCwgICAgIDE1ODcyMCwgICAgIDE1ODcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFkNjcwMWI2CiswLCAgICAgMTU5NzQ0LCAgICAgMTU5NzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTg2NWY1MjEKKzAsICAgICAxNjA3NjgsICAgICAxNjA3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkN2MzMDFhMAorMCwgICAgIDE2MTc5MiwgICAgIDE2MTc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNlODJmMDVkCiswLCAgICAgMTYyODE2LCAgICAgMTYyODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDlkMWZlMTIKKzAsICAgICAxNjM4NDAsICAgICAxNjM4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YjNlZWFiNQorMCwgICAgIDE2NDg2NCwgICAgIDE2NDg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE4ZjhlNjlkCiswLCAgICAgMTY1ODg4LCAgICAgMTY1ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2IxZWZlOTQKKzAsICAgICAxNjY5MTIsICAgICAxNjY5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNjVkZmFlNgorMCwgICAgIDE2NzkzNiwgICAgIDE2NzkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY5MGZmYTMxCiswLCAgICAgMTY4OTYwLCAgICAgMTY4OTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjJlODA1ZmUKKzAsICAgICAxNjk5ODQsICAgICAxNjk5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMjBjZmE4ZQorMCwgICAgIDE3MTAwOCwgICAgIDE3MTAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFjYmRmODIwCiswLCAgICAgMTcyMDMyLCAgICAgMTcyMDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzllOGU3MjkKKzAsICAgICAxNzMwNTYsICAgICAxNzMwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYThiZjZhYworMCwgICAgIDE3NDA4MCwgICAgIDE3NDA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUyOTRmOGE2CiswLCAgICAgMTc1MTA0LCAgICAgMTc1MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTQ4MDA1NzIKKzAsICAgICAxNzYxMjgsICAgICAxNzYxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YTBlMWIzMgorMCwgICAgIDE3NzE1MiwgICAgIDE3NzE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwYmNmMzZjCiswLCAgICAgMTc4MTc2LCAgICAgMTc4MTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjNhNGVlYzIKKzAsICAgICAxNzkyMDAsICAgICAxNzkyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMzdhMDNiZAorMCwgICAgIDE4MDIyNCwgICAgIDE4MDIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI4NzcwYmYxCiswLCAgICAgMTgxMjQ4LCAgICAgMTgxMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2M2NmY5MGEKKzAsICAgICAxODIyNzIsICAgICAxODIyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NmJlMDRkNAorMCwgICAgIDE4MzI5NiwgICAgIDE4MzI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgwYTQwNDYxCiswLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTRhMmI5NWQKKzAsICAgICAxODUzNDQsICAgICAxODUzNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTM3ZWRmMAorMCwgICAgIDE4NjM2OCwgICAgIDE4NjM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMzZThlNzRmCiswLCAgICAgMTg3MzkyLCAgICAgMTg3MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDJhNDAwMjEKKzAsICAgICAxODg0MTYsICAgICAxODg0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzY2ZjE4YQorMCwgICAgIDE4OTQ0MCwgICAgIDE4OTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFkM2EwYjhhCiswLCAgICAgMTkwNDY0LCAgICAgMTkwNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWM0MGY0MTYKKzAsICAgICAxOTE0ODgsICAgICAxOTE0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjOTBiZjE2YworMCwgICAgIDE5MjUxMiwgICAgIDE5MjUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ2OTMxZjg2CiswLCAgICAgMTkzNTM2LCAgICAgMTkzNTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjkxNzAyNjUKKzAsICAgICAxOTQ1NjAsICAgICAxOTQ1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDI0ZjhkYworMCwgICAgIDE5NTU4NCwgICAgIDE5NTU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMxY2RmMTQzCiswLCAgICAgMTk2NjA4LCAgICAgMTk2NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWZlMWU1ZTAKKzAsICAgICAxOTc2MzIsICAgICAxOTc2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZjFlZjNhZgorMCwgICAgIDE5ODY1NiwgICAgIDE5ODY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNjODZlZTE1CiswLCAgICAgMTk5NjgwLCAgICAgMTk5NjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjE1MWVjZjIKKzAsICAgICAyMDA3MDQsICAgICAyMDA3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4MWZiYjM1NAorMCwgICAgIDIwMTcyOCwgICAgIDIwMTcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg4YzkwM2U4CiswLCAgICAgMjAyNzUyLCAgICAgMjAyNzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWY0ODA2MDgKKzAsICAgICAyMDM3NzYsICAgICAyMDM3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNWY0ZjNjZgorMCwgICAgIDIwNDgwMCwgICAgIDIwNDgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIxZWQwZDNkCiswLCAgICAgMjA1ODI0LCAgICAgMjA1ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTA3NGVjZmUKKzAsICAgICAyMDY4NDgsICAgICAyMDY4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMzgxMDBjOAorMCwgICAgIDIwNzg3MiwgICAgIDIwNzg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0MzAwMGQ4CiswLCAgICAgMjA4ODk2LCAgICAgMjA4ODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTllNjFiM2IKKzAsICAgICAyMDk5MjAsICAgICAyMDk5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMGJjZjM2YworMCwgICAgIDIxMDk0NCwgICAgIDIxMDk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzYTRlZWMyCiswLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTM3YTAzYmQKKzAsICAgICAyMTI5OTIsICAgICAyMTI5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiODc3MGJmMQorMCwgICAgIDIxNDAxNiwgICAgIDIxNDAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjNjZmOTBhCiswLCAgICAgMjE1MDQwLCAgICAgMjE1MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjZiZTA0ZDQKKzAsICAgICAyMTYwNjQsICAgICAyMTYwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4MGE0MDQ2MQorMCwgICAgIDIxNzA4OCwgICAgIDIxNzA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU0YTJiOTVkCiswLCAgICAgMjE4MTEyLCAgICAgMjE4MTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjUzN2VkZjAKKzAsICAgICAyMTkxMzYsICAgICAyMTkxMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjM2U4ZTc0ZgorMCwgICAgIDIyMDE2MCwgICAgIDIyMDE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQyYTQwMDIxCiswLCAgICAgMjIxMTg0LCAgICAgMjIxMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjM2NmYxOGEKKzAsICAgICAyMjIyMDgsICAgICAyMjIyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZDNhMGI4YQorMCwgICAgIDIyMzIzMiwgICAgIDIyMzIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFjNDBmNDE2CiswLCAgICAgMjI0MjU2LCAgICAgMjI0MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzkwYmYxNmMKKzAsICAgICAyMjUyODAsICAgICAyMjUyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNjkzMWY4NgorMCwgICAgIDIyNjMwNCwgICAgIDIyNjMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY5MTcwMjY1CiswLCAgICAgMjI3MzI4LCAgICAgMjI3MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAyNGY4ZGMKKzAsICAgICAyMjgzNTIsICAgICAyMjgzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMWNkZjE0MworMCwgICAgIDIyOTM3NiwgICAgIDIyOTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFmZTFlNWUwCiswLCAgICAgMjMwNDAwLCAgICAgMjMwNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGYxZWYzYWYKKzAsICAgICAyMzE0MjQsICAgICAyMzE0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYzg2ZWUxNQorMCwgICAgIDIzMjQ0OCwgICAgIDIzMjQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYxNTFlY2YyCiswLCAgICAgMjMzNDcyLCAgICAgMjMzNDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODFmYmIzNTQKKzAsICAgICAyMzQ0OTYsICAgICAyMzQ0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4OGM5MDNlOAorMCwgICAgIDIzNTUyMCwgICAgIDIzNTUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFmNDgwNjA4CiswLCAgICAgMjM2NTQ0LCAgICAgMjM2NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTVmNGYzY2YKKzAsICAgICAyMzc1NjgsICAgICAyMzc1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMWVkMGQzZAorMCwgICAgIDIzODU5MiwgICAgIDIzODU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEwNzRlY2ZlCiswLCAgICAgMjM5NjE2LCAgICAgMjM5NjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzM4MTAwYzgKKzAsICAgICAyNDA2NDAsICAgICAyNDA2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNDMwMDBkOAorMCwgICAgIDI0MTY2NCwgICAgIDI0MTY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU5ZTYxYjNiCiswLCAgICAgMjQyNjg4LCAgICAgMjQyNjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDBiY2YzNmMKKzAsICAgICAyNDM3MTIsICAgICAyNDM3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiM2E0ZWVjMgorMCwgICAgIDI0NDczNiwgICAgIDI0NDczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDEzN2EwM2JkCiswLCAgICAgMjQ1NzYwLCAgICAgMjQ1NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yjg3NzBiZjEKKzAsICAgICAyNDY3ODQsICAgICAyNDY3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYzY2ZjkwYQorMCwgICAgIDI0NzgwOCwgICAgIDI0NzgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY2YmUwNGQ0CiswLCAgICAgMjQ4ODMyLCAgICAgMjQ4ODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODBhNDA0NjEKKzAsICAgICAyNDk4NTYsICAgICAyNDk4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNGEyYjk1ZAorMCwgICAgIDI1MDg4MCwgICAgIDI1MDg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1MzdlZGYwCiswLCAgICAgMjUxOTA0LCAgICAgMjUxOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzNlOGU3NGYKKzAsICAgICAyNTI5MjgsICAgICAyNTI5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMmE0MDAyMQorMCwgICAgIDI1Mzk1MiwgICAgIDI1Mzk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzNjZmMThhCiswLCAgICAgMjU0OTc2LCAgICAgMjU0OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQzYTBiOGEKKzAsICAgICAyNTYwMDAsICAgICAyNTYwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYzQwZjQxNgorMCwgICAgIDI1NzAyNCwgICAgIDI1NzAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM5MGJmMTZjCiswLCAgICAgMjU4MDQ4LCAgICAgMjU4MDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDY5MzFmODYKKzAsICAgICAyNTkwNzIsICAgICAyNTkwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmOTE3MDI2NQorMCwgICAgIDI2MDA5NiwgICAgIDI2MDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMjRmOGRjCiswLCAgICAgMjYxMTIwLCAgICAgMjYxMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzFjZGYxNDMKKzAsICAgICAyNjIxNDQsICAgICAyNjIxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZmUxZTVlMAorMCwgICAgIDI2MzE2OCwgICAgIDI2MzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBmMWVmM2FmCiswLCAgICAgMjY0MTkyLCAgICAgMjY0MTkyLCAgICAgIDQwOCwgICAgIDE2MzIsIDB4NzA2ODJlZWEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZW1waGFzaXMtNTBmbSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZW1waGFzaXMtNTBmbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDljZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFlbXBoYXNpcy01MGZtCkBAIC0wLDAgKzEsMjY1IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI5YzVmZWZkCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjJhZTBhOTAKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5N2U2ZTlmMworMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU4MzdmMjZmCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzE1MDAzNzYKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNDY1MDM3OAorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQyNjFmNWIxCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzAzOGYzZmQKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZTE5MDhjNgorMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFkNmJmZDMzCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzAzNmYyM2YKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZjczZTlhMQorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBiYTcwNDA0CiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDM0YmYyNDkKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYzg4ZmMyYgorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU1ZWJmOWNmCiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzE2ZGYwYmQKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNjM1ZWFjNQorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0MWQwNTllCiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTkwNWY0ZDMKKzAsICAgICAgMjA0ODAsICAgICAgMjA0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNzM2ZjFmYgorMCwgICAgICAyMTUwNCwgICAgICAyMTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhODlmMDA3CiswLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODFkMWZkYWIKKzAsICAgICAgMjM1NTIsICAgICAgMjM1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MTU2Zjk3ZAorMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE5NzFlYzg5CiswLCAgICAgIDI1NjAwLCAgICAgIDI1NjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGNhMWVjNGYKKzAsICAgICAgMjY2MjQsICAgICAgMjY2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMTZmZmNmNQorMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMzOTFmZGM5CiswLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODVlMGVmNDUKKzAsICAgICAgMjk2OTYsICAgICAgMjk2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4MWQzMDEyYworMCwgICAgICAzMDcyMCwgICAgICAzMDcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQwM2VmMTFiCiswLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2NhNmYxNmQKKzAsICAgICAgMzI3NjgsICAgICAgMzI3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2Nzc1ZmViMQorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIyYWUwYTkwCiswLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTdlNmU5ZjMKKzAsICAgICAgMzU4NDAsICAgICAgMzU4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ODM3ZjI2ZgorMCwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxNTAwMzc2CiswLCAgICAgIDM3ODg4LCAgICAgIDM3ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjQ2NTAzNzgKKzAsICAgICAgMzg5MTIsICAgICAgMzg5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMjYxZjViMQorMCwgICAgICAzOTkzNiwgICAgICAzOTkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDMwMzhmM2ZkCiswLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGUxOTA4YzYKKzAsICAgICAgNDE5ODQsICAgICAgNDE5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZDZiZmQzMworMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcwMzZmMjNmCiswLCAgICAgIDQ0MDMyLCAgICAgIDQ0MDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWJiOGZiZGIKKzAsICAgICAgNDUwNTYsICAgICAgNDUwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4OTgwZjAzZgorMCwgICAgICA0NjA4MCwgICAgICA0NjA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM1YTBmNGVkCiswLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDRhYzAzMTQKKzAsICAgICAgNDgxMjgsICAgICAgNDgxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZGQwZGNhNworMCwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc5OWJmMWZkCiswLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmFhOWZkZmQKKzAsICAgICAgNTEyMDAsICAgICAgNTEyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjdjZjU3MQorMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUzM2IwZTVhCiswLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODAxN2YxMTcKKzAsICAgICAgNTQyNzIsICAgICAgNTQyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZmNjZjM1YgorMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJkNjlmOWNiCiswLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGQwOWY5MDUKKzAsICAgICAgNTczNDQsICAgICAgNTczNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYTUzZjE4NQorMCwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM1YjkwN2U0CiswLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjYzOWZlZGIKKzAsICAgICAgNjA0MTYsICAgICAgNjA0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZTU4Zjc3MQorMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIxM2QxOGQ0CiswLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzc5MzA4NDIKKzAsICAgICAgNjM0ODgsICAgICAgNjM0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYjQ3MDJkNAorMCwgICAgICA2NDUxMiwgICAgICA2NDUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFkNzVkZDI3CiswLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWExY2ViN2IKKzAsICAgICAgNjY1NjAsICAgICAgNjY1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYWQ4MDlhYworMCwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJkYWYxYjVhCiswLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTkwYTAwYTYKKzAsICAgICAgNjk2MzIsICAgICAgNjk2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzlmMGQwYQorMCwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJhZjYwOTUwCiswLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTdkM2ViNTMKKzAsICAgICAgNzI3MDQsICAgICAgNzI3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YTc3ZjdmZgorMCwgICAgICA3MzcyOCwgICAgICA3MzcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQyYmZlM2I5CiswLCAgICAgIDc0NzUyLCAgICAgIDc0NzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDRjNWUyODcKKzAsICAgICAgNzU3NzYsICAgICAgNzU3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Yjk0MDQ4MAorMCwgICAgICA3NjgwMCwgICAgICA3NjgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYzYTkxMzRlCiswLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjIxNWVlNGQKKzAsICAgICAgNzg4NDgsICAgICAgNzg4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Nzc3Zjc0MworMCwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYzM2UwNWFjCiswLCAgICAgIDgwODk2LCAgICAgIDgwODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2IxZWU2ODUKKzAsICAgICAgODE5MjAsICAgICAgODE5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1N2QzMDIzOAorMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZiMjQxMTgwCiswLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzMzYWVhMjUKKzAsICAgICAgODQ5OTIsICAgICAgODQ5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNjc3ZWE1NworMCwgICAgICA4NjAxNiwgICAgICA4NjAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmNWZkNmQ3CiswLCAgICAgIDg3MDQwLCAgICAgIDg3MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzY1MjBiY2EKKzAsICAgICAgODgwNjQsICAgICAgODgwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZTg2MGEwNgorMCwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMzMDU0MjhjCiswLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTFhODAwOGMKKzAsICAgICAgOTExMzYsICAgICAgOTExMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkODFmZjE1ZgorMCwgICAgICA5MjE2MCwgICAgICA5MjE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjY2FkMmU3CiswLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzYxM2JmMjkKKzAsICAgICAgOTQyMDgsICAgICAgOTQyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NDExZWY3MworMCwgICAgICA5NTIzMiwgICAgICA5NTIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUxZjdlMDFiCiswLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjNkMWVlNWIKKzAsICAgICAgOTcyODAsICAgICAgOTcyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYzk3MjFlMgorMCwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBkNDljOTRiCiswLCAgICAgIDk5MzI4LCAgICAgIDk5MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTEwMmQ5NjMKKzAsICAgICAxMDAzNTIsICAgICAxMDAzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZmQ4ZmU5NQorMCwgICAgIDEwMTM3NiwgICAgIDEwMTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ4YzczOGUwCiswLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTk4ODI2ODYKKzAsICAgICAxMDM0MjQsICAgICAxMDM0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYTMwYzRiMQorMCwgICAgIDEwNDQ0OCwgICAgIDEwNDQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc2ZWNkYjMxCiswLCAgICAgMTA1NDcyLCAgICAgMTA1NDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQwY2NmZjkKKzAsICAgICAxMDY0OTYsICAgICAxMDY0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzY1Y2Y1ZgorMCwgICAgIDEwNzUyMCwgICAgIDEwNzUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNhYjUxZGNjCiswLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjY2ZmQ1NTMKKzAsICAgICAxMDk1NjgsICAgICAxMDk1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYWM0MmY1OAorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNhYjIzNjI4CiswLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTRjOWE4YmYKKzAsICAgICAxMTI2NDAsICAgICAxMTI2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YmE1ZmY0MQorMCwgICAgIDExMzY2NCwgICAgIDExMzY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM2YmZkNWRiCiswLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmI5ZWY5OGYKKzAsICAgICAxMTU3MTIsICAgICAxMTU3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNTYyMWEwMgorMCwgICAgIDExNjczNiwgICAgIDExNjczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVlZGQyOGVjCiswLCAgICAgMTE3NzYwLCAgICAgMTE3NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGRmNWUwNDUKKzAsICAgICAxMTg3ODQsICAgICAxMTg3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0OWYwZTBhOQorMCwgICAgIDExOTgwOCwgICAgIDExOTgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQxOGYwY2EwCiswLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTBmYTAwYzYKKzAsICAgICAxMjE4NTYsICAgICAxMjE4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZTQwNmU2YworMCwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhM2YyM2JjCiswLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2JmNDA5ZDAKKzAsICAgICAxMjQ5MjgsICAgICAxMjQ5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0OTliM2FjOAorMCwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDJlZjkzOTgwCiswLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODMwOTJiZmEKKzAsICAgICAxMjgwMDAsICAgICAxMjgwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ODM4MDkzYQorMCwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQxYmZmMjA5CiswLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGVmMDRmMTIKKzAsICAgICAxMzEwNzIsICAgICAxMzEwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMzBkZDc4NworMCwgICAgIDEzMjA5NiwgICAgIDEzMjA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM4NjIxMDMwCiswLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWIyYmY4NjcKKzAsICAgICAxMzQxNDQsICAgICAxMzQxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMTIyMDM0MQorMCwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdjOGRmZGIxCiswLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTgxZGY4MTMKKzAsICAgICAxMzcyMTYsICAgICAxMzcyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmODIwZmU4ZAorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFmOWRmZTQ5CiswLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmY4NGYxNDQKKzAsICAgICAxNDAyODgsICAgICAxNDAyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYjlkZWVjOAorMCwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdkN2JmNWI5CiswLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmVjZmY1ZWEKKzAsICAgICAxNDMzNjAsICAgICAxNDMzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyODcyZTVjMAorMCwgICAgIDE0NDM4NCwgICAgIDE0NDM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZlMmZmNzEzCiswLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGIyZGY3NTcKKzAsICAgICAxNDY0MzIsICAgICAxNDY0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDMwZmEwYQorMCwgICAgIDE0NzQ1NiwgICAgIDE0NzQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1YjVmM2RhCiswLCAgICAgMTQ4NDgwLCAgICAgMTQ4NDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2U0Y2Y5YTYKKzAsICAgICAxNDk1MDQsICAgICAxNDk1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZWFjZjYxZgorMCwgICAgIDE1MDUyOCwgICAgIDE1MDUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiZmZmNTQ5CiswLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGVlYWU2MGEKKzAsICAgICAxNTI1NzYsICAgICAxNTI1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODhlZjI1OAorMCwgICAgIDE1MzYwMCwgICAgIDE1MzYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1NDZmMzBkCiswLCAgICAgMTU0NjI0LCAgICAgMTU0NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGE4NGU2ZjgKKzAsICAgICAxNTU2NDgsICAgICAxNTU2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlN2IwZWUyNworMCwgICAgIDE1NjY3MiwgICAgIDE1NjY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA0ZDBmNmVlCiswLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDlmYTA0MmEKKzAsICAgICAxNTg3MjAsICAgICAxNTg3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YTNjZjQxOAorMCwgICAgIDE1OTc0NCwgICAgIDE1OTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg5ZDgwMTdmCiswLCAgICAgMTYwNzY4LCAgICAgMTYwNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjRlYjAzMjAKKzAsICAgICAxNjE3OTIsICAgICAxNjE3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNDBkZjI3OQorMCwgICAgIDE2MjgxNiwgICAgIDE2MjgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRkYzRmZDI1CiswLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDY2YWY5N2MKKzAsICAgICAxNjQ4NjQsICAgICAxNjQ4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MzA2ZjRlMgorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk3ODJlZGE0CiswLCAgICAgMTY2OTEyLCAgICAgMTY2OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzYzNWZhZDgKKzAsICAgICAxNjc5MzYsICAgICAxNjc5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMzQ0ZWFiZQorMCwgICAgIDE2ODk2MCwgICAgIDE2ODk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkxNDNmZGEwCiswLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzNlN2ViN2YKKzAsICAgICAxNzEwMDgsICAgICAxNzEwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0Y2EwZTk0NworMCwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDViMWJmODBkCiswLCAgICAgMTczMDU2LCAgICAgMTczMDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmIxNWVhYjcKKzAsICAgICAxNzQwODAsICAgICAxNzQwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkODAwZjdjYgorMCwgICAgIDE3NTEwNCwgICAgIDE3NTEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzZDRlOTYwCiswLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmZjMzBmMmYKKzAsICAgICAxNzcxNTIsICAgICAxNzcxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNDEwZjA5MgorMCwgICAgIDE3ODE3NiwgICAgIDE3ODE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzNTBmZGRmCiswLCAgICAgMTc5MjAwLCAgICAgMTc5MjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDc3YTA3YzYKKzAsICAgICAxODAyMjQsICAgICAxODAyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZDQ4ZWQ1OQorMCwgICAgIDE4MTI0OCwgICAgIDE4MTI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ2YWUwMmE4CiswLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjA2YmU0MzMKKzAsICAgICAxODMyOTYsICAgICAxODMyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNDY1ZmM1NAorMCwgICAgIDE4NDMyMCwgICAgIDE4NDMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc0NWRhY2I5CiswLCAgICAgMTg1MzQ0LCAgICAgMTg1MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mzc4M2U3NjUKKzAsICAgICAxODYzNjgsICAgICAxODYzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NzlmZWI0OAorMCwgICAgIDE4NzM5MiwgICAgIDE4NzM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM0ZjIwNTBmCiswLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWRmMWY0NDEKKzAsICAgICAxODk0NDAsICAgICAxODk0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODY0ZjIyNQorMCwgICAgIDE5MDQ2NCwgICAgIDE5MDQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGViYWNmMDg0CiswLCAgICAgMTkxNDg4LCAgICAgMTkxNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWExNGYwODIKKzAsICAgICAxOTI1MTIsICAgICAxOTI1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYWMxMGY4YgorMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE0NTIwMjEwCiswLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmVlNGY4YzMKKzAsICAgICAxOTU1ODQsICAgICAxOTU1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZGY1ZTRjMgorMCwgICAgIDE5NjYwOCwgICAgIDE5NjYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdiZjIwNTg0CiswLCAgICAgMTk3NjMyLCAgICAgMTk3NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQxZGViZjUKKzAsICAgICAxOTg2NTYsICAgICAxOTg2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YTM1MDc5NgorMCwgICAgIDE5OTY4MCwgICAgIDE5OTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDEzODhmYTgzCiswLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTgzOWIwYzIKKzAsICAgICAyMDE3MjgsICAgICAyMDE3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYzlhZmZmMAorMCwgICAgIDIwMjc1MiwgICAgIDIwMjc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDczMTAwYTdjCiswLCAgICAgMjAzNzc2LCAgICAgMjAzNzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjU2ZGYwNzAKKzAsICAgICAyMDQ4MDAsICAgICAyMDQ4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MWQ4ZWZhNworMCwgICAgIDIwNTgyNCwgICAgIDIwNTgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRlODAwNDEyCiswLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2JmN2Y4NDAKKzAsICAgICAyMDc4NzIsICAgICAyMDc4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNDgwMDQ0ZAorMCwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYwMjAxMjE3CiswLCAgICAgMjA5OTIwLCAgICAgMjA5OTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjQxMGYwOTIKKzAsICAgICAyMTA5NDQsICAgICAyMTA5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzUwZmRkZgorMCwgICAgIDIxMTk2OCwgICAgIDIxMTk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3N2EwN2M2CiswLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWQ0OGVkNTkKKzAsICAgICAyMTQwMTYsICAgICAyMTQwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNmFlMDJhOAorMCwgICAgIDIxNTA0MCwgICAgIDIxNTA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwNmJlNDMzCiswLCAgICAgMjE2MDY0LCAgICAgMjE2MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjQ2NWZjNTQKKzAsICAgICAyMTcwODgsICAgICAyMTcwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NDVkYWNiOQorMCwgICAgIDIxODExMiwgICAgIDIxODExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM3ODNlNzY1CiswLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDc5ZmViNDgKKzAsICAgICAyMjAxNjAsICAgICAyMjAxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNGYyMDUwZgorMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkZjFmNDQxCiswLCAgICAgMjIyMjA4LCAgICAgMjIyMjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg2NGYyMjUKKzAsICAgICAyMjMyMzIsICAgICAyMjMyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYmFjZjA4NAorMCwgICAgIDIyNDI1NiwgICAgIDIyNDI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFhMTRmMDgyCiswLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmFjMTBmOGIKKzAsICAgICAyMjYzMDQsICAgICAyMjYzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNDUyMDIxMAorMCwgICAgIDIyNzMyOCwgICAgIDIyNzMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZlZTRmOGMzCiswLCAgICAgMjI4MzUyLCAgICAgMjI4MzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWRmNWU0YzIKKzAsICAgICAyMjkzNzYsICAgICAyMjkzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YmYyMDU4NAorMCwgICAgIDIzMDQwMCwgICAgIDIzMDQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU0MWRlYmY1CiswLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWEzNTA3OTYKKzAsICAgICAyMzI0NDgsICAgICAyMzI0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMzg4ZmE4MworMCwgICAgIDIzMzQ3MiwgICAgIDIzMzQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk4MzliMGMyCiswLCAgICAgMjM0NDk2LCAgICAgMjM0NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmM5YWZmZjAKKzAsICAgICAyMzU1MjAsICAgICAyMzU1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MzEwMGE3YworMCwgICAgIDIzNjU0NCwgICAgIDIzNjU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1NmRmMDcwCiswLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzFkOGVmYTcKKzAsICAgICAyMzg1OTIsICAgICAyMzg1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZTgwMDQxMgorMCwgICAgIDIzOTYxNiwgICAgIDIzOTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdiZjdmODQwCiswLCAgICAgMjQwNjQwLCAgICAgMjQwNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTQ4MDA0NGQKKzAsICAgICAyNDE2NjQsICAgICAyNDE2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MDIwMTIxNworMCwgICAgIDI0MjY4OCwgICAgIDI0MjY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0MTBmMDkyCiswLCAgICAgMjQzNzEyLCAgICAgMjQzNzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDM1MGZkZGYKKzAsICAgICAyNDQ3MzYsICAgICAyNDQ3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NzdhMDdjNgorMCwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkNDhlZDU5CiswLCAgICAgMjQ2Nzg0LCAgICAgMjQ2Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDZhZTAyYTgKKzAsICAgICAyNDc4MDgsICAgICAyNDc4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMDZiZTQzMworMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY0NjVmYzU0CiswLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzQ1ZGFjYjkKKzAsICAgICAyNTA4ODAsICAgICAyNTA4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNzgzZTc2NQorMCwgICAgIDI1MTkwNCwgICAgIDI1MTkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3OWZlYjQ4CiswLCAgICAgMjUyOTI4LCAgICAgMjUyOTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzRmMjA1MGYKKzAsICAgICAyNTM5NTIsICAgICAyNTM5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZGYxZjQ0MQorMCwgICAgIDI1NDk3NiwgICAgIDI1NDk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NjRmMjI1CiswLCAgICAgMjU2MDAwLCAgICAgMjU2MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWJhY2YwODQKKzAsICAgICAyNTcwMjQsICAgICAyNTcwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTE0ZjA4MgorMCwgICAgIDI1ODA0OCwgICAgIDI1ODA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJhYzEwZjhiCiswLCAgICAgMjU5MDcyLCAgICAgMjU5MDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTQ1MjAyMTAKKzAsICAgICAyNjAwOTYsICAgICAyNjAwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZWU0ZjhjMworMCwgICAgIDI2MTEyMCwgICAgIDI2MTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFkZjVlNGMyCiswLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2JmMjA1ODQKKzAsICAgICAyNjMxNjgsICAgICAyNjMxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NDFkZWJmNQorMCwgICAgIDI2NDE5MiwgICAgIDI2NDE5MiwgICAgICA0MDgsICAgICAxNjMyLCAweGFkZDAyZDM5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWVtcGhhc2lzLTc1a2YgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWVtcGhhc2lzLTc1a2YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTcwNWU5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZW1waGFzaXMtNzVrZgpAQCAtMCwwICsxLDI2NSBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YjIxMDFlYworMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjMTZmYzkzCiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjJiZGVlNWQKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMjk5ZWU0MQorMCwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRkMmVmZTk1CiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTkzODA2MjgKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDg0ZjFmMworMCwgICAgICAgNzE2OCwgICAgICAgNzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU5OGJlZWIzCiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjFmZWZiMjUKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNTNhZmVmYgorMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI5OTNmZDJiCiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTA1YWVhZTEKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZTFmZjQ5NworMCwgICAgICAxMzMxMiwgICAgICAxMzMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmNWEwODZjCiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWQ1ODAzMDAKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiY2FmZjA1ZAorMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZkOGRlZjkxCiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWNmZGZhN2IKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNjdkZmYxMQorMCwgICAgICAxOTQ1NiwgICAgICAxOTQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAxYjJmZjBmCiswLCAgICAgIDIwNDgwLCAgICAgIDIwNDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzEzOGVjOWQKKzAsICAgICAgMjE1MDQsICAgICAgMjE1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDllZjc2MQorMCwgICAgICAyMjUyOCwgICAgICAyMjUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyZjNmOTdiCiswLCAgICAgIDIzNTUyLCAgICAgIDIzNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmVlOGZlN2QKKzAsICAgICAgMjQ1NzYsICAgICAgMjQ1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOTBlZjQzNworMCwgICAgICAyNTYwMCwgICAgICAyNTYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM3ZGFlZTcxCiswLCAgICAgIDI2NjI0LCAgICAgIDI2NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjNlOWY1ZTEKKzAsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NDMwMDhkMAorMCwgICAgICAyODY3MiwgICAgICAyODY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE0MjdmYzU5CiswLCAgICAgIDI5Njk2LCAgICAgIDI5Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjE5NmVkMjUKKzAsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMWVkZWFiOQorMCwgICAgICAzMTc0NCwgICAgICAzMTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFmOWEwMjgwCiswLCAgICAgIDMyNzY4LCAgICAgIDMyNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODZjZjAwMjYKKzAsICAgICAgMzM3OTIsICAgICAgMzM3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzE2ZmM5MworMCwgICAgICAzNDgxNiwgICAgICAzNDgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyYmRlZTVkCiswLCAgICAgIDM1ODQwLCAgICAgIDM1ODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDI5OWVlNDEKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZDJlZmU5NQorMCwgICAgICAzNzg4OCwgICAgICAzNzg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU5MzgwNjI4CiswLCAgICAgIDM4OTEyLCAgICAgIDM4OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWQ4NGYxZjMKKzAsICAgICAgMzk5MzYsICAgICAgMzk5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1OThiZWViMworMCwgICAgICA0MDk2MCwgICAgICA0MDk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxZmVmYjI1CiswLCAgICAgIDQxOTg0LCAgICAgIDQxOTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDUzYWZlZmIKKzAsICAgICAgNDMwMDgsICAgICAgNDMwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiOTkzZmQyYgorMCwgICAgICA0NDAzMiwgICAgICA0NDAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVjY2MwOGM2CiswLCAgICAgIDQ1MDU2LCAgICAgIDQ1MDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2ViNWYxYWYKKzAsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZWU5ZTI3OQorMCwgICAgICA0NzEwNCwgICAgICA0NzEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRiMmEwMmNjCiswLCAgICAgIDQ4MTI4LCAgICAgIDQ4MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGMyMmZmMTkKKzAsICAgICAgNDkxNTIsICAgICAgNDkxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NTdjZjRlOQorMCwgICAgICA1MDE3NiwgICAgICA1MDE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmZTIwNDJjCiswLCAgICAgIDUxMjAwLCAgICAgIDUxMjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDc5M2ViMGIKKzAsICAgICAgNTIyMjQsICAgICAgNTIyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YmJhMDU4ZQorMCwgICAgICA1MzI0OCwgICAgICA1MzI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMzMzZmODA3CiswLCAgICAgIDU0MjcyLCAgICAgIDU0MjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODZjZWY4MjMKKzAsICAgICAgNTUyOTYsICAgICAgNTUyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwN2NiZWZiMQorMCwgICAgICA1NjMyMCwgICAgICA1NjMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAxYzNmYWIxCiswLCAgICAgIDU3MzQ0LCAgICAgIDU3MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjlhNjA1MzQKKzAsICAgICAgNTgzNjgsICAgICAgNTgzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmOGNmMGU4MgorMCwgICAgICA1OTM5MiwgICAgICA1OTM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjYWVmMzc5CiswLCAgICAgIDYwNDE2LCAgICAgIDYwNDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTJhOWRiYmQKKzAsICAgICAgNjE0NDAsICAgICAgNjE0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMzFjMDlhNgorMCwgICAgICA2MjQ2NCwgICAgICA2MjQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1MjRmMzdkCiswLCAgICAgIDYzNDg4LCAgICAgIDYzNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTIxMDE2MDIKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZDAwZDk3YgorMCwgICAgICA2NTUzNiwgICAgICA2NTUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwNThmNjA5CiswLCAgICAgIDY2NTYwLCAgICAgIDY2NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzBkMjA2MzQKKzAsICAgICAgNjc1ODQsICAgICAgNjc1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMGRkZjA1NQorMCwgICAgICA2ODYwOCwgICAgICA2ODYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUyM2UxOTQ2CiswLCAgICAgIDY5NjMyLCAgICAgIDY5NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmMxYWY5N2YKKzAsICAgICAgNzA2NTYsICAgICAgNzA2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3N2Y2ZjJhOQorMCwgICAgICA3MTY4MCwgICAgICA3MTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJiNjdmZjAzCiswLCAgICAgIDcyNzA0LCAgICAgIDcyNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2UyNmYxNGIKKzAsICAgICAgNzM3MjgsICAgICAgNzM3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNDM5ZTQyNQorMCwgICAgICA3NDc1MiwgICAgICA3NDc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwOGVmOWQxCiswLCAgICAgIDc1Nzc2LCAgICAgIDc1Nzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWM5ZmVkZTUKKzAsICAgICAgNzY4MDAsICAgICAgNzY4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNjM3ZjNlNworMCwgICAgICA3NzgyNCwgICAgICA3NzgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmNzMwN2IwCiswLCAgICAgIDc4ODQ4LCAgICAgIDc4ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2U0MWY1YjMKKzAsICAgICAgNzk4NzIsICAgICAgNzk4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNmI4ZjYxOQorMCwgICAgICA4MDg5NiwgICAgICA4MDg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU4MzcwOTdlCiswLCAgICAgIDgxOTIwLCAgICAgIDgxOTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzZhZmZjMjMKKzAsICAgICAgODI5NDQsICAgICAgODI5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MzBlMDcwYworMCwgICAgICA4Mzk2OCwgICAgICA4Mzk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU3MGZmY2Q1CiswLCAgICAgIDg0OTkyLCAgICAgIDg0OTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzFlZGU3ODEKKzAsICAgICAgODYwMTYsICAgICAgODYwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MDNhZmRhNQorMCwgICAgICA4NzA0MCwgICAgICA4NzA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxMzkwZjRjCiswLCAgICAgIDg4MDY0LCAgICAgIDg4MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mzk2MWYyOTMKKzAsICAgICAgODkwODgsICAgICAgODkwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMjg4YjJiOQorMCwgICAgICA5MDExMiwgICAgICA5MDExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmNGMyOTQ2CiswLCAgICAgIDkxMTM2LCAgICAgIDkxMTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzFkZWVhNzkKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYjM3NjI1ZQorMCwgICAgICA5MzE4NCwgICAgICA5MzE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ4NGRmMjViCiswLCAgICAgIDk0MjA4LCAgICAgIDk0MjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmRlMWZjOWYKKzAsICAgICAgOTUyMzIsICAgICAgOTUyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTQ5ZGUwZgorMCwgICAgICA5NjI1NiwgICAgICA5NjI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFiMTFlYjEzCiswLCAgICAgIDk3MjgwLCAgICAgIDk3MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGFlODgzNDMKKzAsICAgICAgOTgzMDQsICAgICAgOTgzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOTljMzYxYQorMCwgICAgICA5OTMyOCwgICAgICA5OTMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE0YjdkNWNkCiswLCAgICAgMTAwMzUyLCAgICAgMTAwMzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDBhMzE4ZmMKKzAsICAgICAxMDEzNzYsICAgICAxMDEzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZmIxZDhjNworMCwgICAgIDEwMjQwMCwgICAgIDEwMjQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZlNTdjODJkCiswLCAgICAgMTAzNDI0LCAgICAgMTAzNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjlhNjA1ZmMKKzAsICAgICAxMDQ0NDgsICAgICAxMDQ0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOWM5MTJmMgorMCwgICAgIDEwNTQ3MiwgICAgIDEwNTQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk4ODZkYTAxCiswLCAgICAgMTA2NDk2LCAgICAgMTA2NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDM5OGY1N2YKKzAsICAgICAxMDc1MjAsICAgICAxMDc1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZDE5MDFjOAorMCwgICAgIDEwODU0NCwgICAgIDEwODU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE0MzllZjI3CiswLCAgICAgMTA5NTY4LCAgICAgMTA5NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjFhMGNhNTEKKzAsICAgICAxMTA1OTIsICAgICAxMTA1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYTYwNWIxNAorMCwgICAgIDExMTYxNiwgICAgIDExMTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGYwMTRhODM3CiswLCAgICAgMTEyNjQwLCAgICAgMTEyNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzYzZTNiOTAKKzAsICAgICAxMTM2NjQsICAgICAxMTM2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNGExMGNhNAorMCwgICAgIDExNDY4OCwgICAgIDExNDY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDViNTYyMTQ2CiswLCAgICAgMTE1NzEyLCAgICAgMTE1NzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjEyOTEzMjQKKzAsICAgICAxMTY3MzYsICAgICAxMTY3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNDc5N2NiZQorMCwgICAgIDExNzc2MCwgICAgIDExNzc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUyNjgxM2I0CiswLCAgICAgMTE4Nzg0LCAgICAgMTE4Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjM0YmM4ODcKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NTIzZTZjMworMCwgICAgIDEyMDgzMiwgICAgIDEyMDgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEyNDRkYTBkCiswLCAgICAgMTIxODU2LCAgICAgMTIxODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWM1YmE5NTYKKzAsICAgICAxMjI4ODAsICAgICAxMjI4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMzFiNTdhNgorMCwgICAgIDEyMzkwNCwgICAgIDEyMzkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY1MjYyZDg0CiswLCAgICAgMTI0OTI4LCAgICAgMTI0OTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTBjMzdmMzQKKzAsICAgICAxMjU5NTIsICAgICAxMjU5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4MTI4NjQzMgorMCwgICAgIDEyNjk3NiwgICAgIDEyNjk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRkMjM0MGEyCiswLCAgICAgMTI4MDAwLCAgICAgMTI4MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzdiZTA2MGEKKzAsICAgICAxMjkwMjQsICAgICAxMjkwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYWQ2MGUzMAorMCwgICAgIDEzMDA0OCwgICAgIDEzMDA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM3NmMzOGY2CiswLCAgICAgMTMxMDcyLCAgICAgMTMxMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTQ0ZmU3N2QKKzAsICAgICAxMzIwOTYsICAgICAxMzIwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlN2E0ZjgwNgorMCwgICAgIDEzMzEyMCwgICAgIDEzMzEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM2NTJmYzRjCiswLCAgICAgMTM0MTQ0LCAgICAgMTM0MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjhlOGZiYjYKKzAsICAgICAxMzUxNjgsICAgICAxMzUxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NTQ4MDI3OQorMCwgICAgIDEzNjE5MiwgICAgIDEzNjE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA5NWIwMDM2CiswLCAgICAgMTM3MjE2LCAgICAgMTM3MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTM5N2ZjNDAKKzAsICAgICAxMzgyNDAsICAgICAxMzgyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiODM2Zjc5YgorMCwgICAgIDEzOTI2NCwgICAgIDEzOTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM3MGVmNjRmCiswLCAgICAgMTQwMjg4LCAgICAgMTQwMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDZhZWZhZTkKKzAsICAgICAxNDEzMTIsICAgICAxNDEzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZTA4ZjgwYQorMCwgICAgIDE0MjMzNiwgICAgIDE0MjMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDViNDFmZjFjCiswLCAgICAgMTQzMzYwLCAgICAgMTQzMzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWI4NmZhZWUKKzAsICAgICAxNDQzODQsICAgICAxNDQzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYTBmZjBiNQorMCwgICAgIDE0NTQwOCwgICAgIDE0NTQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYxNTdmYTNmCiswLCAgICAgMTQ2NDMyLCAgICAgMTQ2NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjBhOWY5MDYKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZWNkZmMyNgorMCwgICAgIDE0ODQ4MCwgICAgIDE0ODQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAxNDZmMTEyCiswLCAgICAgMTQ5NTA0LCAgICAgMTQ5NTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzE2M2ZlODcKKzAsICAgICAxNTA1MjgsICAgICAxNTA1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyZTc4ZjVjNAorMCwgICAgIDE1MTU1MiwgICAgIDE1MTU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNlOWJlZDdkCiswLCAgICAgMTUyNTc2LCAgICAgMTUyNTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yjc3NjAwOWMKKzAsICAgICAxNTM2MDAsICAgICAxNTM2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYTFlZmFiYQorMCwgICAgIDE1NDYyNCwgICAgIDE1NDYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ1ZjJlYTU3CiswLCAgICAgMTU1NjQ4LCAgICAgMTU1NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQ1NmY1M2YKKzAsICAgICAxNTY2NzIsICAgICAxNTY2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZTNiZjJiOQorMCwgICAgIDE1NzY5NiwgICAgIDE1NzY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA5NTJmZDRiCiswLCAgICAgMTU4NzIwLCAgICAgMTU4NzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjhlNmYxMGMKKzAsICAgICAxNTk3NDQsICAgICAxNTk3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMDdmZjc5YworMCwgICAgIDE2MDc2OCwgICAgIDE2MDc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU1YmFmYmZkCiswLCAgICAgMTYxNzkyLCAgICAgMTYxNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWI4MWVkODMKKzAsICAgICAxNjI4MTYsICAgICAxNjI4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YTYxMDA2NgorMCwgICAgIDE2Mzg0MCwgICAgIDE2Mzg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBhYzkwMTYwCiswLCAgICAgMTY0ODY0LCAgICAgMTY0ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTc0NWY5M2YKKzAsICAgICAxNjU4ODgsICAgICAxNjU4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5Y2YyZjI4NAorMCwgICAgIDE2NjkxMiwgICAgIDE2NjkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzNTBlZjBiCiswLCAgICAgMTY3OTM2LCAgICAgMTY3OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2Y0N2YyMTcKKzAsICAgICAxNjg5NjAsICAgICAxNjg5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMTc4ZmJhZQorMCwgICAgIDE2OTk4NCwgICAgIDE2OTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY3NGEwNTZhCiswLCAgICAgMTcxMDA4LCAgICAgMTcxMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzM0NWVkZTUKKzAsICAgICAxNzIwMzIsICAgICAxNzIwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNjcyZjJiZQorMCwgICAgIDE3MzA1NiwgICAgIDE3MzA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ1YmNmOTE3CiswLCAgICAgMTc0MDgwLCAgICAgMTc0MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODEyNmY2OTkKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMGQzZWJmZAorMCwgICAgIDE3NjEyOCwgICAgIDE3NjEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU3N2YxZDc1CiswLCAgICAgMTc3MTUyLCAgICAgMTc3MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjA0N2ZmZTQKKzAsICAgICAxNzgxNzYsICAgICAxNzgxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlODlkZjdjOQorMCwgICAgIDE3OTIwMCwgICAgIDE3OTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJlYTNmNjIxCiswLCAgICAgMTgwMjI0LCAgICAgMTgwMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGE0ZjA1ZWYKKzAsICAgICAxODEyNDgsICAgICAxODEyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDdjMDdiYQorMCwgICAgIDE4MjI3MiwgICAgIDE4MjI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2MWJlNjQ0CiswLCAgICAgMTgzMjk2LCAgICAgMTgzMjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2U0N2Y0MzQKKzAsICAgICAxODQzMjAsICAgICAxODQzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzBiYWNlZQorMCwgICAgIDE4NTM0NCwgICAgIDE4NTM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFjODVmNzFkCiswLCAgICAgMTg2MzY4LCAgICAgMTg2MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzlhMGYxY2QKKzAsICAgICAxODczOTIsICAgICAxODczOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOTM5ZWRkZQorMCwgICAgIDE4ODQxNiwgICAgIDE4ODQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE4ZTBlMDg2CiswLCAgICAgMTg5NDQwLCAgICAgMTg5NDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzBiNmZmMDAKKzAsICAgICAxOTA0NjQsICAgICAxOTA0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZDg0MDA1ZQorMCwgICAgIDE5MTQ4OCwgICAgIDE5MTQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk3ZDEwM2JmCiswLCAgICAgMTkyNTEyLCAgICAgMTkyNTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTAyNDFmZmMKKzAsICAgICAxOTM1MzYsICAgICAxOTM1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MWE0ZjM1YQorMCwgICAgIDE5NDU2MCwgICAgIDE5NDU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYxYWJmMGIwCiswLCAgICAgMTk1NTg0LCAgICAgMTk1NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTVkMTAxMTEKKzAsICAgICAxOTY2MDgsICAgICAxOTY2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZTcxZjVjZQorMCwgICAgIDE5NzYzMiwgICAgIDE5NzYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3OTZmOWZhCiswLCAgICAgMTk4NjU2LCAgICAgMTk4NjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTYxYmY4OTMKKzAsICAgICAxOTk2ODAsICAgICAxOTk2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MGRkZmI3OAorMCwgICAgIDIwMDcwNCwgICAgIDIwMDcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU0ZjRjMmI2CiswLCAgICAgMjAxNzI4LCAgICAgMjAxNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQ1MmYzNTYKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NGUyZmQxNAorMCwgICAgIDIwMzc3NiwgICAgIDIwMzc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQwNGIwMGE1CiswLCAgICAgMjA0ODAwLCAgICAgMjA0ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDFjYTBmN2MKKzAsICAgICAyMDU4MjQsICAgICAyMDU4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNjg1ZWYyMQorMCwgICAgIDIwNjg0OCwgICAgIDIwNjg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwZWZmYTRmCiswLCAgICAgMjA3ODcyLCAgICAgMjA3ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjVhOWU4MmYKKzAsICAgICAyMDg4OTYsICAgICAyMDg4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNzM0MzcwNAorMCwgICAgIDIwOTkyMCwgICAgIDIwOTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYwNDdmZmU0CiswLCAgICAgMjEwOTQ0LCAgICAgMjEwOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTg5ZGY3YzkKKzAsICAgICAyMTE5NjgsICAgICAyMTE5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyZWEzZjYyMQorMCwgICAgIDIxMjk5MiwgICAgIDIxMjk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRhNGYwNWVmCiswLCAgICAgMjE0MDE2LCAgICAgMjE0MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWQ3YzA3YmEKKzAsICAgICAyMTUwNDAsICAgICAyMTUwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjFiZTY0NAorMCwgICAgIDIxNjA2NCwgICAgIDIxNjA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNlNDdmNDM0CiswLCAgICAgMjE3MDg4LCAgICAgMjE3MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjMwYmFjZWUKKzAsICAgICAyMTgxMTIsICAgICAyMTgxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYzg1ZjcxZAorMCwgICAgIDIxOTEzNiwgICAgIDIxOTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM5YTBmMWNkCiswLCAgICAgMjIwMTYwLCAgICAgMjIwMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDkzOWVkZGUKKzAsICAgICAyMjExODQsICAgICAyMjExODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhOGUwZTA4NgorMCwgICAgIDIyMjIwOCwgICAgIDIyMjIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMwYjZmZjAwCiswLCAgICAgMjIzMjMyLCAgICAgMjIzMjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGQ4NDAwNWUKKzAsICAgICAyMjQyNTYsICAgICAyMjQyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5N2QxMDNiZgorMCwgICAgIDIyNTI4MCwgICAgIDIyNTI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEwMjQxZmZjCiswLCAgICAgMjI2MzA0LCAgICAgMjI2MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTFhNGYzNWEKKzAsICAgICAyMjczMjgsICAgICAyMjczMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MWFiZjBiMAorMCwgICAgIDIyODM1MiwgICAgIDIyODM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE1ZDEwMTExCiswLCAgICAgMjI5Mzc2LCAgICAgMjI5Mzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGU3MWY1Y2UKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0Nzk2ZjlmYQorMCwgICAgIDIzMTQyNCwgICAgIDIzMTQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU2MWJmODkzCiswLCAgICAgMjMyNDQ4LCAgICAgMjMyNDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzBkZGZiNzgKKzAsICAgICAyMzM0NzIsICAgICAyMzM0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNGY0YzJiNgorMCwgICAgIDIzNDQ5NiwgICAgIDIzNDQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU0NTJmMzU2CiswLCAgICAgMjM1NTIwLCAgICAgMjM1NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODRlMmZkMTQKKzAsICAgICAyMzY1NDQsICAgICAyMzY1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMDRiMDBhNQorMCwgICAgIDIzNzU2OCwgICAgIDIzNzU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAxY2EwZjdjCiswLCAgICAgMjM4NTkyLCAgICAgMjM4NTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTY4NWVmMjEKKzAsICAgICAyMzk2MTYsICAgICAyMzk2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MGVmZmE0ZgorMCwgICAgIDI0MDY0MCwgICAgIDI0MDY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1YTllODJmCiswLCAgICAgMjQxNjY0LCAgICAgMjQxNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTczNDM3MDQKKzAsICAgICAyNDI2ODgsICAgICAyNDI2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MDQ3ZmZlNAorMCwgICAgIDI0MzcxMiwgICAgIDI0MzcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU4OWRmN2M5CiswLCAgICAgMjQ0NzM2LCAgICAgMjQ0NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmVhM2Y2MjEKKzAsICAgICAyNDU3NjAsICAgICAyNDU3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYTRmMDVlZgorMCwgICAgIDI0Njc4NCwgICAgIDI0Njc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVkN2MwN2JhCiswLCAgICAgMjQ3ODA4LCAgICAgMjQ3ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxYmU2NDQKKzAsICAgICAyNDg4MzIsICAgICAyNDg4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZTQ3ZjQzNAorMCwgICAgIDI0OTg1NiwgICAgIDI0OTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzMGJhY2VlCiswLCAgICAgMjUwODgwLCAgICAgMjUwODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWM4NWY3MWQKKzAsICAgICAyNTE5MDQsICAgICAyNTE5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjOWEwZjFjZAorMCwgICAgIDI1MjkyOCwgICAgIDI1MjkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ5MzllZGRlCiswLCAgICAgMjUzOTUyLCAgICAgMjUzOTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YThlMGUwODYKKzAsICAgICAyNTQ5NzYsICAgICAyNTQ5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMGI2ZmYwMAorMCwgICAgIDI1NjAwMCwgICAgIDI1NjAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRkODQwMDVlCiswLCAgICAgMjU3MDI0LCAgICAgMjU3MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTdkMTAzYmYKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMDI0MWZmYworMCwgICAgIDI1OTA3MiwgICAgIDI1OTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkxYTRmMzVhCiswLCAgICAgMjYwMDk2LCAgICAgMjYwMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjFhYmYwYjAKKzAsICAgICAyNjExMjAsICAgICAyNjExMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNWQxMDExMQorMCwgICAgIDI2MjE0NCwgICAgIDI2MjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBlNzFmNWNlCiswLCAgICAgMjYzMTY4LCAgICAgMjYzMTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDc5NmY5ZmEKKzAsICAgICAyNjQxOTIsICAgICAyNjQxOTIsICAgICAgNDA4LCAgICAgMTYzMiwgMHgzMTg0MmVlYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFmYWRlLWVzaW4gYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtZXNpbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWI5MTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFmYWRlLWVzaW4KQEAgLTAsMCArMSwyNjUgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDZlMGQ2OGEKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzI1ZDkxNQorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMwYTVmMWYxCiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDdkYmY1NGQKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5Zjc2ZTg2OQorMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZiY2FlYjUxCiswLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTE2MzA5YTYKKzAsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyODkwZmU2NworMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFjZWZlZTZiCiswLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGFkN2VhMjcKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZGY3Zjg5NQorMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE5YzBmYTE5CiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWNiNGZkYzUKKzAsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZmMyZjFlZgorMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI0YjhmMDczCiswLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmZmNmZhODUKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZmNmZmQwMworMCwgICAgICAxNzQwOCwgICAgICAxNzQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU1NzZlNDc3CiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTBmNmY1NGYKKzAsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMjI1ZjVmNworMCwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU2ZDlmZTU3CiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGJjNjBmNzgKKzAsICAgICAgMjI1MjgsICAgICAgMjI1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjOTA3ZWViMQorMCwgICAgICAyMzU1MiwgICAgICAyMzU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ2OTFmMDcxCiswLCAgICAgIDI0NTc2LCAgICAgIDI0NTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTM5NDAyZWUKKzAsICAgICAgMjU2MDAsICAgICAgMjU2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOTI3MGNjNAorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1YzVlZDliCiswLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGRiY2U3ZWIKKzAsICAgICAgMjg2NzIsICAgICAgMjg2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMzVmZmYwZgorMCwgICAgICAyOTY5NiwgICAgICAyOTY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUxNGEwODAyCiswLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGRlMDA0M2UKKzAsICAgICAgMzE3NDQsICAgICAgMzE3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNTc2ZTFhYgorMCwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNmMzBlZTJmCiswLCAgICAgIDMzNzkyLCAgICAgIDMzNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWU0OWY4NmQKKzAsICAgICAgMzQ4MTYsICAgICAgMzQ4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MmEyMDJhYworMCwgICAgICAzNTg0MCwgICAgICAzNTg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc2MmFmMjQ5CiswLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yjk2NmViYTUKKzAsICAgICAgMzc4ODgsICAgICAgMzc4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZWZlZWM3OQorMCwgICAgICAzODkxMiwgICAgICAzODkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyYjAwNjg4CiswLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjA2ZWZlOTEKKzAsICAgICAgNDA5NjAsICAgICAgNDA5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyZjY5ZWY3MworMCwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM3NWNmMDQzCiswLCAgICAgIDQzMDA4LCAgICAgIDQzMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDk2YWZmZDMKKzAsICAgICAgNDQwMzIsICAgICAgNDQwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNzZlZjExZgorMCwgICAgICA0NTA1NiwgICAgICA0NTA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDJlMzIwMWEwCiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjUzZjFiYTQKKzAsICAgICAgNDcxMDQsICAgICAgNDcxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YjEzZTAxOQorMCwgICAgICA0ODEyOCwgICAgICA0ODEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIyNjQwMzM4CiswLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjUwMmYyMmQKKzAsICAgICAgNTAxNzYsICAgICAgNTAxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1M2RmZDYxZgorMCwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwNDRmMWYxCiswLCAgICAgIDUyMjI0LCAgICAgIDUyMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTRjY2YyYzcKKzAsICAgICAgNTMyNDgsICAgICAgNTMyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZGRlZTM5OQorMCwgICAgICA1NDI3MiwgICAgICA1NDI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGYzMDVlYzU5CiswLCAgICAgIDU1Mjk2LCAgICAgIDU1Mjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDlhY2ZjNmYKKzAsICAgICAgNTYzMjAsICAgICAgNTYzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjODU1ZDc3ZAorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFjYTFmYWY1CiswLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWJkNDEwMzgKKzAsICAgICAgNTkzOTIsICAgICAgNTkzOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YjgzZjZiNworMCwgICAgICA2MDQxNiwgICAgICA2MDQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU5YjJmZjRiCiswLCAgICAgIDYxNDQwLCAgICAgIDYxNDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDdhZmUyNmIKKzAsICAgICAgNjI0NjQsICAgICAgNjI0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MjgyMDU3YQorMCwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJlYTJlYmQxCiswLCAgICAgIDY0NTEyLCAgICAgIDY0NTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDM0ZWY0MTMKKzAsICAgICAgNjU1MzYsICAgICAgNjU1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Y2Q3MGUyOAorMCwgICAgICA2NjU2MCwgICAgICA2NjU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNlZjkxZDk2CiswLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDlhYmZhNzUKKzAsICAgICAgNjg2MDgsICAgICAgNjg2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NzkzZjBjNworMCwgICAgICA2OTYzMiwgICAgICA2OTYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDczNGIwOTBjCiswLCAgICAgIDcwNjU2LCAgICAgIDcwNjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGNmMGY5ODEKKzAsICAgICAgNzE2ODAsICAgICAgNzE2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNWFmMTMwMgorMCwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkODBmNjc3CiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzRlMTA2MjgKKzAsICAgICAgNzQ3NTIsICAgICAgNzQ3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYThlZjZhOQorMCwgICAgICA3NTc3NiwgICAgICA3NTc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY4YzFmNzJmCiswLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2Y5YjAyOGEKKzAsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4MGM3ZjNjYgorMCwgICAgICA3ODg0OCwgICAgICA3ODg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk3ZTJlNmU1CiswLCAgICAgIDc5ODcyLCAgICAgIDc5ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTMwMWRjODEKKzAsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYThhZWFlZAorMCwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZkNzUxZTcwCiswLCAgICAgIDgyOTQ0LCAgICAgIDgyOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTc2NDNkYzAKKzAsICAgICAgODM5NjgsICAgICAgODM5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMDhmMDc4OAorMCwgICAgICA4NDk5MiwgICAgICA4NDk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRmMTEwNWNjCiswLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjI1ODA2YzYKKzAsICAgICAgODcwNDAsICAgICAgODcwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNjZkMjgyYQorMCwgICAgICA4ODA2NCwgICAgICA4ODA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ1N2RkZjBkCiswLCAgICAgIDg5MDg4LCAgICAgIDg5MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTY4ZGRhOGYKKzAsICAgICAgOTAxMTIsICAgICAgOTAxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNDU3YjUwNQorMCwgICAgICA5MTEzNiwgICAgICA5MTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRhMjVhNDA5CiswLCAgICAgIDkyMTYwLCAgICAgIDkyMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWI1ZDlkM2IKKzAsICAgICAgOTMxODQsICAgICAgOTMxODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNjFlYjEzZAorMCwgICAgICA5NDIwOCwgICAgICA5NDIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFjOTNiNjZmCiswLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzdhZWIzM2YKKzAsICAgICAgOTYyNTYsICAgICAgOTYyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MmNjY2ZiNQorMCwgICAgICA5NzI4MCwgICAgICA5NzI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlNGNmNDg3CiswLCAgICAgIDk4MzA0LCAgICAgIDk4MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTljMDdmMzUKKzAsICAgICAgOTkzMjgsICAgICAgOTkzMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2M2VjZDM0ZgorMCwgICAgIDEwMDM1MiwgICAgIDEwMDM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDEyMmFlYzUzCiswLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjU4MWMwYWQKKzAsICAgICAxMDI0MDAsICAgICAxMDI0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NDBlZGIxNQorMCwgICAgIDEwMzQyNCwgICAgIDEwMzQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVkNjZjNjZmCiswLCAgICAgMTA0NDQ4LCAgICAgMTA0NDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDY5ZTlkMzUKKzAsICAgICAxMDU0NzIsICAgICAxMDU0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzlmZDBlOQorMCwgICAgIDEwNjQ5NiwgICAgIDEwNjQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcyNDY4NjY3CiswLCAgICAgMTA3NTIwLCAgICAgMTA3NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmU2ZGQwMmIKKzAsICAgICAxMDg1NDQsICAgICAxMDg1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5M2VkY2UzMworMCwgICAgIDEwOTU2OCwgICAgIDEwOTU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNkZmJkNTE5CiswLCAgICAgMTEwNTkyLCAgICAgMTEwNTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODQ2M2YyYmIKKzAsICAgICAxMTE2MTYsICAgICAxMTE2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1Y2E2Zjg2OQorMCwgICAgIDExMjY0MCwgICAgIDExMjY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA5OWEwMzk4CiswLCAgICAgMTEzNjY0LCAgICAgMTEzNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTdmYTEwZjAKKzAsICAgICAxMTQ2ODgsICAgICAxMTQ2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOGNhZGRkMworMCwgICAgIDExNTcxMiwgICAgIDExNTcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ4NTJlZjhiCiswLCAgICAgMTE2NzM2LCAgICAgMTE2NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDI1MGVlN2IKKzAsICAgICAxMTc3NjAsICAgICAxMTc3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NTgzZGEyMQorMCwgICAgIDExODc4NCwgICAgIDExODc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDczNjVmYjMzCiswLCAgICAgMTE5ODA4LCAgICAgMTE5ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjhjODIwNjYKKzAsICAgICAxMjA4MzIsICAgICAxMjA4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NDY1MGJlNAorMCwgICAgIDEyMTg1NiwgICAgIDEyMTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGViMjFmOGViCiswLCAgICAgMTIyODgwLCAgICAgMTIyODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2Q4OGY0NTUKKzAsICAgICAxMjM5MDQsICAgICAxMjM5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NmE5ZWZhZgorMCwgICAgIDEyNDkyOCwgICAgIDEyNDkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU1MDBjNmVkCiswLCAgICAgMTI1OTUyLCAgICAgMTI1OTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGVlMGM2MmQKKzAsICAgICAxMjY5NzYsICAgICAxMjY5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNGQzMDc2MgorMCwgICAgIDEyODAwMCwgICAgIDEyODAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhjMGRlYzlmCiswLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzkwMDExZDgKKzAsICAgICAxMzAwNDgsICAgICAxMzAwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzZhMTEzNgorMCwgICAgIDEzMTA3MiwgICAgIDEzMTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdkZGRmZWE3CiswLCAgICAgMTMyMDk2LCAgICAgMTMyMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZhM2VkNDkKKzAsICAgICAxMzMxMjAsICAgICAxMzMxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMTI5ZjU0ZQorMCwgICAgIDEzNDE0NCwgICAgIDEzNDE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlhODZmMDc3CiswLCAgICAgMTM1MTY4LCAgICAgMTM1MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzllZWYyMDkKKzAsICAgICAxMzYxOTIsICAgICAxMzYxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MmQ0MDI5YgorMCwgICAgIDEzNzIxNiwgICAgIDEzNzIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhlYzIwNTkwCiswLCAgICAgMTM4MjQwLCAgICAgMTM4MjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDQ4ZjE4ZWQKKzAsICAgICAxMzkyNjQsICAgICAxMzkyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkODA3ZWFkYworMCwgICAgIDE0MDI4OCwgICAgIDE0MDI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFlMmJlYTA5CiswLCAgICAgMTQxMzEyLCAgICAgMTQxMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTM3YWYxMmUKKzAsICAgICAxNDIzMzYsICAgICAxNDIzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZWRiZjMwMworMCwgICAgIDE0MzM2MCwgICAgIDE0MzM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRjNzVkZjg4CiswLCAgICAgMTQ0Mzg0LCAgICAgMTQ0Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg0NWZmZDYKKzAsICAgICAxNDU0MDgsICAgICAxNDU0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMGU4MTUwYworMCwgICAgIDE0NjQzMiwgICAgIDE0NjQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVlYTdlZWVmCiswLCAgICAgMTQ3NDU2LCAgICAgMTQ3NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGM3ZWZhMjEKKzAsICAgICAxNDg0ODAsICAgICAxNDg0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Yjk3ZTMwZQorMCwgICAgIDE0OTUwNCwgICAgIDE0OTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU1MDQwMjI4CiswLCAgICAgMTUwNTI4LCAgICAgMTUwNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjI4M2Y3OGMKKzAsICAgICAxNTE1NTIsICAgICAxNTE1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNzEwMDE0MAorMCwgICAgIDE1MjU3NiwgICAgIDE1MjU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDllYTZmOWIyCiswLCAgICAgMTUzNjAwLCAgICAgMTUzNjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWYwZTE1NjMKKzAsICAgICAxNTQ2MjQsICAgICAxNTQ2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MTBiZjE4ZQorMCwgICAgIDE1NTY0OCwgICAgIDE1NTY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmNGZlNDI1CiswLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTA3YWYzYzAKKzAsICAgICAxNTc2OTYsICAgICAxNTc2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZjE0ZGRjNgorMCwgICAgIDE1ODcyMCwgICAgIDE1ODcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NzFlZDY5CiswLCAgICAgMTU5NzQ0LCAgICAgMTU5NzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzM0OWVmOWYKKzAsICAgICAxNjA3NjgsICAgICAxNjA3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZTJjMTgzNAorMCwgICAgIDE2MTc5MiwgICAgIDE2MTc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzODNmZTA0CiswLCAgICAgMTYyODE2LCAgICAgMTYyODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjYyNmY0MTUKKzAsICAgICAxNjM4NDAsICAgICAxNjM4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyODNiZTM3OQorMCwgICAgIDE2NDg2NCwgICAgIDE2NDg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3NmMwY2ViCiswLCAgICAgMTY1ODg4LCAgICAgMTY1ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTBiODA0MGYKKzAsICAgICAxNjY5MTIsICAgICAxNjY5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTM1ZWI2ZAorMCwgICAgIDE2NzkzNiwgICAgIDE2NzkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGViMTgwYmI1CiswLCAgICAgMTY4OTYwLCAgICAgMTY4OTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmM1Y2YwNTkKKzAsICAgICAxNjk5ODQsICAgICAxNjk5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODYyZjFhYworMCwgICAgIDE3MTAwOCwgICAgIDE3MTAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDljYzJlYTJiCiswLCAgICAgMTcyMDMyLCAgICAgMTcyMDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmI5YWU3NTQKKzAsICAgICAxNzMwNTYsICAgICAxNzMwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MTZkZWJiNQorMCwgICAgIDE3NDA4MCwgICAgIDE3NDA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZmM2FmZjJhCiswLCAgICAgMTc1MTA0LCAgICAgMTc1MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU1ZGZhNWMKKzAsICAgICAxNzYxMjgsICAgICAxNzYxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYjgzMDYwNQorMCwgICAgIDE3NzE1MiwgICAgIDE3NzE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMzBkYzllCiswLCAgICAgMTc4MTc2LCAgICAgMTc4MTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAxN2ZkNTQKKzAsICAgICAxNzkyMDAsICAgICAxNzkyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzdkZmEyZQorMCwgICAgIDE4MDIyNCwgICAgIDE4MDIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4ODdlNTk5CiswLCAgICAgMTgxMjQ4LCAgICAgMTgxMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjczMGU3MmYKKzAsICAgICAxODIyNzIsICAgICAxODIyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YmIzZmFlNAorMCwgICAgIDE4MzI5NiwgICAgIDE4MzI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjMDhmYzM2CiswLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFmZDllYzIKKzAsICAgICAxODUzNDQsICAgICAxODUzNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMWQzZTgzZAorMCwgICAgIDE4NjM2OCwgICAgIDE4NjM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmOTYwMTNjCiswLCAgICAgMTg3MzkyLCAgICAgMTg3MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2EwYWZlMzEKKzAsICAgICAxODg0MTYsICAgICAxODg0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMzdkMTcwMQorMCwgICAgIDE4OTQ0MCwgICAgIDE4OTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2MTVlYmMyCiswLCAgICAgMTkwNDY0LCAgICAgMTkwNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjE3MDA1YzEKKzAsICAgICAxOTE0ODgsICAgICAxOTE0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzU1Zjc4OQorMCwgICAgIDE5MjUxMiwgICAgIDE5MjUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzZTZkYjY1CiswLCAgICAgMTkzNTM2LCAgICAgMTkzNTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJhYjE0NDcKKzAsICAgICAxOTQ1NjAsICAgICAxOTQ1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZGJkZjM4MworMCwgICAgIDE5NTU4NCwgICAgIDE5NTU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzMTZmNmE5CiswLCAgICAgMTk2NjA4LCAgICAgMTk2NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE2YTBiNGMKKzAsICAgICAxOTc2MzIsICAgICAxOTc2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmQ4MDliNworMCwgICAgIDE5ODY1NiwgICAgIDE5ODY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFkMmNmNWYxCiswLCAgICAgMTk5NjgwLCAgICAgMTk5NjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDM2NmY0YTEKKzAsICAgICAyMDA3MDQsICAgICAyMDA3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YTJmODZlMAorMCwgICAgIDIwMTcyOCwgICAgIDIwMTcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY1MWYwOGE5CiswLCAgICAgMjAyNzUyLCAgICAgMjAyNzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDVlZGVmYTgKKzAsICAgICAyMDM3NzYsICAgICAyMDM3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTVkZjJhNgorMCwgICAgIDIwNDgwMCwgICAgIDIwNDgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU4ODFkOWU0CiswLCAgICAgMjA1ODI0LCAgICAgMjA1ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTAzODA1MjMKKzAsICAgICAyMDY4NDgsICAgICAyMDY4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YjkzZWIyNgorMCwgICAgIDIwNzg3MiwgICAgIDIwNzg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1OWNmOTRjCiswLCAgICAgMjA4ODk2LCAgICAgMjA4ODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODQ3NGY1OTEKKzAsICAgICAyMDk5MjAsICAgICAyMDk5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDMwZGM5ZQorMCwgICAgIDIxMDk0NCwgICAgIDIxMDk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMTdmZDU0CiswLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM3ZGZhMmUKKzAsICAgICAyMTI5OTIsICAgICAyMTI5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODg3ZTU5OQorMCwgICAgIDIxNDAxNiwgICAgIDIxNDAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3MzBlNzJmCiswLCAgICAgMjE1MDQwLCAgICAgMjE1MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmJiM2ZhZTQKKzAsICAgICAyMTYwNjQsICAgICAyMTYwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYzA4ZmMzNgorMCwgICAgIDIxNzA4OCwgICAgIDIxNzA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhZmQ5ZWMyCiswLCAgICAgMjE4MTEyLCAgICAgMjE4MTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTFkM2U4M2QKKzAsICAgICAyMTkxMzYsICAgICAyMTkxMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3Zjk2MDEzYworMCwgICAgIDIyMDE2MCwgICAgIDIyMDE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhMGFmZTMxCiswLCAgICAgMjIxMTg0LCAgICAgMjIxMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTM3ZDE3MDEKKzAsICAgICAyMjIyMDgsICAgICAyMjIyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjE1ZWJjMgorMCwgICAgIDIyMzIzMiwgICAgIDIyMzIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxNzAwNWMxCiswLCAgICAgMjI0MjU2LCAgICAgMjI0MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTc1NWY3ODkKKzAsICAgICAyMjUyODAsICAgICAyMjUyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4M2U2ZGI2NQorMCwgICAgIDIyNjMwNCwgICAgIDIyNjMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyYWIxNDQ3CiswLCAgICAgMjI3MzI4LCAgICAgMjI3MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWRiZGYzODMKKzAsICAgICAyMjgzNTIsICAgICAyMjgzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzE2ZjZhOQorMCwgICAgIDIyOTM3NiwgICAgIDIyOTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhNmEwYjRjCiswLCAgICAgMjMwNDAwLCAgICAgMjMwNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZkODA5YjcKKzAsICAgICAyMzE0MjQsICAgICAyMzE0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZDJjZjVmMQorMCwgICAgIDIzMjQ0OCwgICAgIDIzMjQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzNjZmNGExCiswLCAgICAgMjMzNDcyLCAgICAgMjMzNDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmEyZjg2ZTAKKzAsICAgICAyMzQ0OTYsICAgICAyMzQ0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNTFmMDhhOQorMCwgICAgIDIzNTUyMCwgICAgIDIzNTUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1ZWRlZmE4CiswLCAgICAgMjM2NTQ0LCAgICAgMjM2NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjU1ZGYyYTYKKzAsICAgICAyMzc1NjgsICAgICAyMzc1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlODgxZDllNAorMCwgICAgIDIzODU5MiwgICAgIDIzODU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwMzgwNTIzCiswLCAgICAgMjM5NjE2LCAgICAgMjM5NjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5M2ViMjYKKzAsICAgICAyNDA2NDAsICAgICAyNDA2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTljZjk0YworMCwgICAgIDI0MTY2NCwgICAgIDI0MTY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg0NzRmNTkxCiswLCAgICAgMjQyNjg4LCAgICAgMjQyNjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAzMGRjOWUKKzAsICAgICAyNDM3MTIsICAgICAyNDM3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDE3ZmQ1NAorMCwgICAgIDI0NDczNiwgICAgIDI0NDczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjN2RmYTJlCiswLCAgICAgMjQ1NzYwLCAgICAgMjQ1NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzg4N2U1OTkKKzAsICAgICAyNDY3ODQsICAgICAyNDY3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzMwZTcyZgorMCwgICAgIDI0NzgwOCwgICAgIDI0NzgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiYjNmYWU0CiswLCAgICAgMjQ4ODMyLCAgICAgMjQ4ODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2MwOGZjMzYKKzAsICAgICAyNDk4NTYsICAgICAyNDk4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWZkOWVjMgorMCwgICAgIDI1MDg4MCwgICAgIDI1MDg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGExZDNlODNkCiswLCAgICAgMjUxOTA0LCAgICAgMjUxOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2Y5NjAxM2MKKzAsICAgICAyNTI5MjgsICAgICAyNTI5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YTBhZmUzMQorMCwgICAgIDI1Mzk1MiwgICAgIDI1Mzk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzN2QxNzAxCiswLCAgICAgMjU0OTc2LCAgICAgMjU0OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxNWViYzIKKzAsICAgICAyNTYwMDAsICAgICAyNTYwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTcwMDVjMQorMCwgICAgIDI1NzAyNCwgICAgIDI1NzAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE3NTVmNzg5CiswLCAgICAgMjU4MDQ4LCAgICAgMjU4MDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODNlNmRiNjUKKzAsICAgICAyNTkwNzIsICAgICAyNTkwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MmFiMTQ0NworMCwgICAgIDI2MDA5NiwgICAgIDI2MDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkYmRmMzgzCiswLCAgICAgMjYxMTIwLCAgICAgMjYxMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMxNmY2YTkKKzAsICAgICAyNjIxNDQsICAgICAyNjIxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTZhMGI0YworMCwgICAgIDI2MzE2OCwgICAgIDI2MzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmZDgwOWI3CiswLCAgICAgMjY0MTkyLCAgICAgMjY0MTkyLCAgICAgIDQwOCwgICAgIDE2MzIsIDB4ZjQxMjMxM2UKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZmFkZS1leHAgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtZXhwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzUxOWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtZXhwCkBAIC0wLDAgKzEsMjY1IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMDAwMDAwCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAwMDAwMDAKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDAwMDAwMAorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMDAwMDAwCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAwMDAwMDAKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDAwMDAwMAorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMDAwMDAwCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAwMDAwMDAKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDAwMDAwMAorMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMDAwMDAwCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAwMDAwMDAKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDAwMDAwMAorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMDAwMDAwCiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAwMDAwMDAKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDAwMDAwMAorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMDAwMDAwCiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAwMDAwMDAKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYzYwMzc2ZAorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZiZThkNmMwCiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2I5OGJhNGYKKzAsICAgICAgMjA0ODAsICAgICAgMjA0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMjdiODFlOAorMCwgICAgICAyMTUwNCwgICAgICAyMTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVlYWRmNWI4CiswLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWY4MjRkYjcKKzAsICAgICAgMjM1NTIsICAgICAgMjM1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0OGY2YTU4ZgorMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZjNWMwZDQyCiswLCAgICAgIDI1NjAwLCAgICAgIDI1NjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjJlMTVkMDAKKzAsICAgICAgMjY2MjQsICAgICAgMjY2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NGFjNzUyNAorMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI3MjY5OTRjCiswLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU1YmQ0ZmEKKzAsICAgICAgMjk2OTYsICAgICAgMjk2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YWNiMTQ5MworMCwgICAgICAzMDcyMCwgICAgICAzMDcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM0MTcyYzkxCiswLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2Q2OTI5MWQKKzAsICAgICAgMzI3NjgsICAgICAgMzI3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkM2Q2NDEzMQorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzNjU2YzdmCiswLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzYzYzkzZjMKKzAsICAgICAgMzU4NDAsICAgICAgMzU4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5OTRjODRhNQorMCwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjOWY4ZDc1CiswLCAgICAgIDM3ODg4LCAgICAgIDM3ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmUyNTlkMDMKKzAsICAgICAgMzg5MTIsICAgICAgMzg5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYmRmY2I5YgorMCwgICAgICAzOTkzNiwgICAgICAzOTkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMWRjYjc5CiswLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDg1N2IxNWYKKzAsICAgICAgNDE5ODQsICAgICAgNDE5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNGQ5YmUyNQorMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxOTljYzI1CiswLCAgICAgIDQ0MDMyLCAgICAgIDQ0MDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDY4ZWM2MjUKKzAsICAgICAgNDUwNTYsICAgICAgNDUwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNjU5ZTE0MQorMCwgICAgICA0NjA4MCwgICAgICA0NjA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGViYWFmMzNiCiswLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzE0MmMyMWQKKzAsICAgICAgNDgxMjgsICAgICAgNDgxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODU5ZWM3NworMCwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI5NDRlYzY3CiswLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWIzOWU4ODcKKzAsICAgICAgNTEyMDAsICAgICAgNTEyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMWM0ZTg0ZAorMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ4MDNmZDc3CiswLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWU5YWUzMmIKKzAsICAgICAgNTQyNzIsICAgICAgNTQyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMWIzZTg3ZgorMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4NzIwMWVjCiswLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmE3OWU3MGQKKzAsICAgICAgNTczNDQsICAgICAgNTczNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODY3ZmM5YgorMCwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE1ZWMxMTZjCiswLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTk0OGY1ZDcKKzAsICAgICAgNjA0MTYsICAgICAgNjA0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkY2JiZjZhMworMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxZmNkZWViCiswLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTdiNmY0YTEKKzAsICAgICAgNjM0ODgsICAgICAgNjM0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZjZlMDI5NAorMCwgICAgICA2NDUxMiwgICAgICA2NDUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNjOGNlMDZiCiswLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDkwMTE0MGEKKzAsICAgICAgNjY1NjAsICAgICAgNjY1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MTYyZTlhNworMCwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIyZWZlNzhmCiswLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzI5YWZjZDcKKzAsICAgICAgNjk2MzIsICAgICAgNjk2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NDc5MDhjYQorMCwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjZDlmMWRiCiswLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTEzYTNhNGEKKzAsICAgICAgNzI3MDQsICAgICAgNzI3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4OWJlZGQyNQorMCwgICAgICA3MzcyOCwgICAgICA3MzcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiYWFjMTg3CiswLCAgICAgIDc0NzUyLCAgICAgIDc0NzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDU2OWQ0NjEKKzAsICAgICAgNzU3NzYsICAgICAgNzU3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZDliMWM0MgorMCwgICAgICA3NjgwMCwgICAgICA3NjgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZiZjBlNjc5CiswLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWVjZTBmNjIKKzAsICAgICAgNzg4NDgsICAgICAgNzg4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjcyZjA3MQorMCwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFkNWJkZjZkCiswLCAgICAgIDgwODk2LCAgICAgIDgwODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTZhZjA1NTQKKzAsICAgICAgODE5MjAsICAgICAgODE5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMDkwMjk2MAorMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA3N2NmZGYzCiswLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTQ4YjA1OWEKKzAsICAgICAgODQ5OTIsICAgICAgODQ5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZTdkZjNkYgorMCwgICAgICA4NjAxNiwgICAgICA4NjAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1NTBlODk5CiswLCAgICAgIDg3MDQwLCAgICAgIDg3MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTYzZmY1YTkKKzAsICAgICAgODgwNjQsICAgICAgODgwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YzE1YmZhNworMCwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU2OGRkYThmCiswLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTQ1N2I1MDUKKzAsICAgICAgOTExMzYsICAgICAgOTExMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYTI1YTQwOQorMCwgICAgICA5MjE2MCwgICAgICA5MjE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDViNWQ5ZDNiCiswLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTYxZWIxM2QKKzAsICAgICAgOTQyMDgsICAgICAgOTQyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYzkzYjY2ZgorMCwgICAgICA5NTIzMiwgICAgICA5NTIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3YWViMzNmCiswLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTJjY2NmYjUKKzAsICAgICAgOTcyODAsICAgICAgOTcyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZTRjZjQ4NworMCwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE5YzA3ZjM1CiswLCAgICAgIDk5MzI4LCAgICAgIDk5MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjNlY2QzNGYKKzAsICAgICAxMDAzNTIsICAgICAxMDAzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMjJhZWM1MworMCwgICAgIDEwMTM3NiwgICAgIDEwMTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY1ODFjMGFkCiswLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjQwZWRiMTUKKzAsICAgICAxMDM0MjQsICAgICAxMDM0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDY2YzY2ZgorMCwgICAgIDEwNDQ0OCwgICAgIDEwNDQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA2OWU5ZDM1CiswLCAgICAgMTA1NDcyLCAgICAgMTA1NDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM5ZmQwZTkKKzAsICAgICAxMDY0OTYsICAgICAxMDY0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MjQ2ODY2NworMCwgICAgIDEwNzUyMCwgICAgIDEwNzUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZlNmRkMDJiCiswLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTNlZGNlMzMKKzAsICAgICAxMDk1NjgsICAgICAxMDk1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZGZiZDUxOQorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg0NjNmMmJiCiswLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWNhNmY4NjkKKzAsICAgICAxMTI2NDAsICAgICAxMTI2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwOTlhMDM5OAorMCwgICAgIDExMzY2NCwgICAgIDExMzY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE3ZmExMGYwCiswLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjhjYWRkZDMKKzAsICAgICAxMTU3MTIsICAgICAxMTU3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ODUyZWY4YgorMCwgICAgIDExNjczNiwgICAgIDExNjczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAyNTBlZTdiCiswLCAgICAgMTE3NzYwLCAgICAgMTE3NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTU4M2RhMjEKKzAsICAgICAxMTg3ODQsICAgICAxMTg3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MzY1ZmIzMworMCwgICAgIDExOTgwOCwgICAgIDExOTgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4YzgyMDY2CiswLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTQ2NTBiZTQKKzAsICAgICAxMjE4NTYsICAgICAxMjE4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjIxZjhlYgorMCwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNkODhmNDU1CiswLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjZhOWVmYWYKKzAsICAgICAxMjQ5MjgsICAgICAxMjQ5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NTAwYzZlZAorMCwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBlZTBjNjJkCiswLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzRkMzA3NjIKKzAsICAgICAxMjgwMDAsICAgICAxMjgwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YzBkZWM5ZgorMCwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc5MDAxMWQ4CiswLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yjc2YTExMzYKKzAsICAgICAxMzEwNzIsICAgICAxMzEwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZGRkZmVhNworMCwgICAgIDEzMjA5NiwgICAgIDEzMjA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmYTNlZDQ5CiswLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzEyOWY1NGUKKzAsICAgICAxMzQxNDQsICAgICAxMzQxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YTg2ZjA3NworMCwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM5ZWVmMjA5CiswLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzJkNDAyOWIKKzAsICAgICAxMzcyMTYsICAgICAxMzcyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZWMyMDU5MAorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0OGYxOGVkCiswLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDgwN2VhZGMKKzAsICAgICAxNDAyODgsICAgICAxNDAyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZTJiZWEwOQorMCwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkzN2FmMTJlCiswLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGVkYmYzMDMKKzAsICAgICAxNDMzNjAsICAgICAxNDMzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYzc1ZGY4OAorMCwgICAgIDE0NDM4NCwgICAgIDE0NDM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NDVmZmQ2CiswLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjBlODE1MGMKKzAsICAgICAxNDY0MzIsICAgICAxNDY0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZWE3ZWVlZgorMCwgICAgIDE0NzQ1NiwgICAgIDE0NzQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRjN2VmYTIxCiswLCAgICAgMTQ4NDgwLCAgICAgMTQ4NDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5N2UzMGUKKzAsICAgICAxNDk1MDQsICAgICAxNDk1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNTA0MDIyOAorMCwgICAgIDE1MDUyOCwgICAgIDE1MDUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyODNmNzhjCiswLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTcxMDAxNDAKKzAsICAgICAxNTI1NzYsICAgICAxNTI1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZWE2ZjliMgorMCwgICAgIDE1MzYwMCwgICAgIDE1MzYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmMGUxNTYzCiswLCAgICAgMTU0NjI0LCAgICAgMTU0NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTEwYmYxOGUKKzAsICAgICAxNTU2NDgsICAgICAxNTU2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZjRmZTQyNQorMCwgICAgIDE1NjY3MiwgICAgIDE1NjY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwN2FmM2MwCiswLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmYxNGRkYzYKKzAsICAgICAxNTg3MjAsICAgICAxNTg3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODcxZWQ2OQorMCwgICAgIDE1OTc0NCwgICAgIDE1OTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMzNDllZjlmCiswLCAgICAgMTYwNzY4LCAgICAgMTYwNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGUyYzE4MzQKKzAsICAgICAxNjE3OTIsICAgICAxNjE3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzgzZmUwNAorMCwgICAgIDE2MjgxNiwgICAgIDE2MjgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY2MjZmNDE1CiswLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjgzYmUzNzkKKzAsICAgICAxNjQ4NjQsICAgICAxNjQ4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNzZjMGNlYgorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEwYjgwNDBmCiswLCAgICAgMTY2OTEyLCAgICAgMTY2OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjUzNWViNmQKKzAsICAgICAxNjc5MzYsICAgICAxNjc5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjE4MGJiNQorMCwgICAgIDE2ODk2MCwgICAgIDE2ODk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJjNWNmMDU5CiswLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg2MmYxYWMKKzAsICAgICAxNzEwMDgsICAgICAxNzEwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5Y2MyZWEyYgorMCwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJiOWFlNzU0CiswLCAgICAgMTczMDU2LCAgICAgMTczMDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzE2ZGViYjUKKzAsICAgICAxNzQwODAsICAgICAxNzQwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZjNhZmYyYQorMCwgICAgIDE3NTEwNCwgICAgIDE3NTEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1NWRmYTVjCiswLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2I4MzA2MDUKKzAsICAgICAxNzcxNTIsICAgICAxNzcxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDMwZGM5ZQorMCwgICAgIDE3ODE3NiwgICAgIDE3ODE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMTdmZDU0CiswLCAgICAgMTc5MjAwLCAgICAgMTc5MjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM3ZGZhMmUKKzAsICAgICAxODAyMjQsICAgICAxODAyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODg3ZTU5OQorMCwgICAgIDE4MTI0OCwgICAgIDE4MTI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3MzBlNzJmCiswLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmJiM2ZhZTQKKzAsICAgICAxODMyOTYsICAgICAxODMyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYzA4ZmMzNgorMCwgICAgIDE4NDMyMCwgICAgIDE4NDMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhZmQ5ZWMyCiswLCAgICAgMTg1MzQ0LCAgICAgMTg1MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTFkM2U4M2QKKzAsICAgICAxODYzNjgsICAgICAxODYzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3Zjk2MDEzYworMCwgICAgIDE4NzM5MiwgICAgIDE4NzM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhMGFmZTMxCiswLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTM3ZDE3MDEKKzAsICAgICAxODk0NDAsICAgICAxODk0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjE1ZWJjMgorMCwgICAgIDE5MDQ2NCwgICAgIDE5MDQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxNzAwNWMxCiswLCAgICAgMTkxNDg4LCAgICAgMTkxNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTc1NWY3ODkKKzAsICAgICAxOTI1MTIsICAgICAxOTI1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4M2U2ZGI2NQorMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyYWIxNDQ3CiswLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWRiZGYzODMKKzAsICAgICAxOTU1ODQsICAgICAxOTU1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzE2ZjZhOQorMCwgICAgIDE5NjYwOCwgICAgIDE5NjYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhNmEwYjRjCiswLCAgICAgMTk3NjMyLCAgICAgMTk3NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZkODA5YjcKKzAsICAgICAxOTg2NTYsICAgICAxOTg2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZDJjZjVmMQorMCwgICAgIDE5OTY4MCwgICAgIDE5OTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzNjZmNGExCiswLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmEyZjg2ZTAKKzAsICAgICAyMDE3MjgsICAgICAyMDE3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNTFmMDhhOQorMCwgICAgIDIwMjc1MiwgICAgIDIwMjc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1ZWRlZmE4CiswLCAgICAgMjAzNzc2LCAgICAgMjAzNzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjU1ZGYyYTYKKzAsICAgICAyMDQ4MDAsICAgICAyMDQ4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlODgxZDllNAorMCwgICAgIDIwNTgyNCwgICAgIDIwNTgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwMzgwNTIzCiswLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5M2ViMjYKKzAsICAgICAyMDc4NzIsICAgICAyMDc4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTljZjk0YworMCwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg0NzRmNTkxCiswLCAgICAgMjA5OTIwLCAgICAgMjA5OTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAzMGRjOWUKKzAsICAgICAyMTA5NDQsICAgICAyMTA5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDE3ZmQ1NAorMCwgICAgIDIxMTk2OCwgICAgIDIxMTk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjN2RmYTJlCiswLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzg4N2U1OTkKKzAsICAgICAyMTQwMTYsICAgICAyMTQwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzMwZTcyZgorMCwgICAgIDIxNTA0MCwgICAgIDIxNTA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiYjNmYWU0CiswLCAgICAgMjE2MDY0LCAgICAgMjE2MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2MwOGZjMzYKKzAsICAgICAyMTcwODgsICAgICAyMTcwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWZkOWVjMgorMCwgICAgIDIxODExMiwgICAgIDIxODExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGExZDNlODNkCiswLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2Y5NjAxM2MKKzAsICAgICAyMjAxNjAsICAgICAyMjAxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YTBhZmUzMQorMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzN2QxNzAxCiswLCAgICAgMjIyMjA4LCAgICAgMjIyMjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxNWViYzIKKzAsICAgICAyMjMyMzIsICAgICAyMjMyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTcwMDVjMQorMCwgICAgIDIyNDI1NiwgICAgIDIyNDI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE3NTVmNzg5CiswLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODNlNmRiNjUKKzAsICAgICAyMjYzMDQsICAgICAyMjYzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MmFiMTQ0NworMCwgICAgIDIyNzMyOCwgICAgIDIyNzMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkYmRmMzgzCiswLCAgICAgMjI4MzUyLCAgICAgMjI4MzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMxNmY2YTkKKzAsICAgICAyMjkzNzYsICAgICAyMjkzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTZhMGI0YworMCwgICAgIDIzMDQwMCwgICAgIDIzMDQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmZDgwOWI3CiswLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQyY2Y1ZjEKKzAsICAgICAyMzI0NDgsICAgICAyMzI0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMzY2ZjRhMQorMCwgICAgIDIzMzQ3MiwgICAgIDIzMzQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhMmY4NmUwCiswLCAgICAgMjM0NDk2LCAgICAgMjM0NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjUxZjA4YTkKKzAsICAgICAyMzU1MjAsICAgICAyMzU1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNWVkZWZhOAorMCwgICAgIDIzNjU0NCwgICAgIDIzNjU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1NWRmMmE2CiswLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTg4MWQ5ZTQKKzAsICAgICAyMzg1OTIsICAgICAyMzg1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDM4MDUyMworMCwgICAgIDIzOTYxNiwgICAgIDIzOTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiOTNlYjI2CiswLCAgICAgMjQwNjQwLCAgICAgMjQwNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU5Y2Y5NGMKKzAsICAgICAyNDE2NjQsICAgICAyNDE2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NDc0ZjU5MQorMCwgICAgIDI0MjY4OCwgICAgIDI0MjY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMzBkYzllCiswLCAgICAgMjQzNzEyLCAgICAgMjQzNzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAxN2ZkNTQKKzAsICAgICAyNDQ3MzYsICAgICAyNDQ3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzdkZmEyZQorMCwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4ODdlNTk5CiswLCAgICAgMjQ2Nzg0LCAgICAgMjQ2Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjczMGU3MmYKKzAsICAgICAyNDc4MDgsICAgICAyNDc4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YmIzZmFlNAorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjMDhmYzM2CiswLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFmZDllYzIKKzAsICAgICAyNTA4ODAsICAgICAyNTA4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMWQzZTgzZAorMCwgICAgIDI1MTkwNCwgICAgIDI1MTkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmOTYwMTNjCiswLCAgICAgMjUyOTI4LCAgICAgMjUyOTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2EwYWZlMzEKKzAsICAgICAyNTM5NTIsICAgICAyNTM5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMzdkMTcwMQorMCwgICAgIDI1NDk3NiwgICAgIDI1NDk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2MTVlYmMyCiswLCAgICAgMjU2MDAwLCAgICAgMjU2MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjE3MDA1YzEKKzAsICAgICAyNTcwMjQsICAgICAyNTcwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzU1Zjc4OQorMCwgICAgIDI1ODA0OCwgICAgIDI1ODA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzZTZkYjY1CiswLCAgICAgMjU5MDcyLCAgICAgMjU5MDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJhYjE0NDcKKzAsICAgICAyNjAwOTYsICAgICAyNjAwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZGJkZjM4MworMCwgICAgIDI2MTEyMCwgICAgIDI2MTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzMTZmNmE5CiswLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE2YTBiNGMKKzAsICAgICAyNjMxNjgsICAgICAyNjMxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmQ4MDliNworMCwgICAgIDI2NDE5MiwgICAgIDI2NDE5MiwgICAgICA0MDgsICAgICAxNjMyLCAweGY0MTIzMTNlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtaHNpbiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZmFkZS1oc2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNmEwZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtaHNpbgpAQCAtMCwwICsxLDI2NSBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMDQyMjMyZQorMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJjMDczY2Y3CiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJmZWNhZTUKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZDY4ZGY4MQorMCwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ3ZTBkY2RkCiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmIxMmU4NDkKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYWE4ZmQyNQorMCwgICAgICAgNzE2OCwgICAgICAgNzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4YjEwMWQ2CiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDQxOGU4MTcKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NWQ2ZTQ0ZAorMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM1NzVmNzgxCiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGYwYmZkY2QKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNTE3ZmFlZAorMCwgICAgICAxMzMxMiwgICAgICAxMzMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM2OWRlOWI1CiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjI0NWY0ZDkKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmOTc5ZmQ4YgorMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFmY2JmYjhkCiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWU2YmY5ZTMKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYmYxZWRmYgorMCwgICAgICAxOTQ1NiwgICAgICAxOTQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI2YjdmYWExCiswLCAgICAgIDIwNDgwLCAgICAgIDIwNDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTU5YmYyZGIKKzAsICAgICAgMjE1MDQsICAgICAgMjE1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNDg4ZmU0NQorMCwgICAgICAyMjUyOCwgICAgICAyMjUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg5MjhlOGZkCiswLCAgICAgIDIzNTUyLCAgICAgIDIzNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmM4MmY2Y2QKKzAsICAgICAgMjQ1NzYsICAgICAgMjQ1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlOGI2ZWQ0YgorMCwgICAgICAyNTYwMCwgICAgICAyNTYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDczMzQwYWJhCiswLCAgICAgIDI2NjI0LCAgICAgIDI2NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjkzNGVjYmYKKzAsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNTgxZjEyNQorMCwgICAgICAyODY3MiwgICAgICAyODY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlMmNmMTEzCiswLCAgICAgIDI5Njk2LCAgICAgIDI5Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzE2YjAwNjIKKzAsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZGU1MTNhYQorMCwgICAgICAzMTc0NCwgICAgICAzMTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhMTdlYTMzCiswLCAgICAgIDMyNzY4LCAgICAgIDMyNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmMyOGYxMjcKKzAsICAgICAgMzM3OTIsICAgICAgMzM3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZDgxZjgxYgorMCwgICAgICAzNDgxNiwgICAgICAzNDgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYzZjJmZDQ3CiswLCAgICAgIDM1ODQwLCAgICAgIDM1ODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWFiMmVlNjMKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMzEwZjI2NQorMCwgICAgICAzNzg4OCwgICAgICAzNzg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRiMmVlZDk1CiswLCAgICAgIDM4OTEyLCAgICAgIDM4OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2NmM2ZhMTMKKzAsICAgICAgMzk5MzYsICAgICAgMzk5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MzIxMDdkYQorMCwgICAgICA0MDk2MCwgICAgICA0MDk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzMDMwOTY0CiswLCAgICAgIDQxOTg0LCAgICAgIDQxOTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDAwMWVjOTEKKzAsICAgICAgNDMwMDgsICAgICAgNDMwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhY2Q4ZWUyMworMCwgICAgICA0NDAzMiwgICAgICA0NDAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ5YWRmNWIzCiswLCAgICAgIDQ1MDU2LCAgICAgIDQ1MDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGE3YTBiNTQKKzAsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZTRlMjg0YworMCwgICAgICA0NzEwNCwgICAgICA0NzEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkN2RmYzFiCiswLCAgICAgIDQ4MTI4LCAgICAgIDQ4MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2ZiYWZjM2QKKzAsICAgICAgNDkxNTIsICAgICAgNDkxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODQ2MTkwZQorMCwgICAgICA1MDE3NiwgICAgICA1MDE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgxYzcwNmU4CiswLCAgICAgIDUxMjAwLCAgICAgIDUxMjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDQ0OWVkZWYKKzAsICAgICAgNTIyMjQsICAgICAgNTIyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNGM5MDQ0YworMCwgICAgICA1MzI0OCwgICAgICA1MzI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDExYmNmNTE3CiswLCAgICAgIDU0MjcyLCAgICAgIDU0MjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzY5M2ZjMjMKKzAsICAgICAgNTUyOTYsICAgICAgNTUyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYWEzZWM1OQorMCwgICAgICA1NjMyMCwgICAgICA1NjMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFiYmJmZmQxCiswLCAgICAgIDU3MzQ0LCAgICAgIDU3MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzUwZTBiNjYKKzAsICAgICAgNTgzNjgsICAgICAgNTgzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZjc5ZmU0OQorMCwgICAgICA1OTM5MiwgICAgICA1OTM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDljMmUyNDE0CiswLCAgICAgIDYwNDE2LCAgICAgIDYwNDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjVhOGUzYjEKKzAsICAgICAgNjE0NDAsICAgICAgNjE0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MTcxZWFiZAorMCwgICAgICA2MjQ2NCwgICAgICA2MjQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU1ZGZkMGI5CiswLCAgICAgIDYzNDg4LCAgICAgIDYzNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODhkNmU3NTEKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYWNlZWViYgorMCwgICAgICA2NTUzNiwgICAgICA2NTUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZkZGRlOTM5CiswLCAgICAgIDY2NTYwLCAgICAgIDY2NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjM1ZDE0ZDYKKzAsICAgICAgNjc1ODQsICAgICAgNjc1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMjE2ZjExMQorMCwgICAgICA2ODYwOCwgICAgICA2ODYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc2ZDFmNzUxCiswLCAgICAgIDY5NjMyLCAgICAgIDY5NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmNmYmUzM2QKKzAsICAgICAgNzA2NTYsICAgICAgNzA2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTViZjgzZAorMCwgICAgICA3MTY4MCwgICAgICA3MTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM2ZGMyODQ2CiswLCAgICAgIDcyNzA0LCAgICAgIDcyNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGY4MTFjZjYKKzAsICAgICAgNzM3MjgsICAgICAgNzM3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OTliZjg3MQorMCwgICAgICA3NDc1MiwgICAgICA3NDc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA2NmJlMjZmCiswLCAgICAgIDc1Nzc2LCAgICAgIDc1Nzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmFkZmYzNjkKKzAsICAgICAgNzY4MDAsICAgICAgNzY4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNTgxZmY2MQorMCwgICAgICA3NzgyNCwgICAgICA3NzgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUzZmMwNWZhCiswLCAgICAgIDc4ODQ4LCAgICAgIDc4ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjMzM2ZjYWYKKzAsICAgICAgNzk4NzIsICAgICAgNzk4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzBkMmEyNAorMCwgICAgICA4MDg5NiwgICAgICA4MDg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA5NTVlZjIxCiswLCAgICAgIDgxOTIwLCAgICAgIDgxOTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTc5OGZiYzkKKzAsICAgICAgODI5NDQsICAgICAgODI5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1Y2RmMTM4YworMCwgICAgICA4Mzk2OCwgICAgICA4Mzk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNmZmVlMzdkCiswLCAgICAgIDg0OTkyLCAgICAgIDg0OTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGJjZmY1MTcKKzAsICAgICAgODYwMTYsICAgICAgODYwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YjdmMDcyMgorMCwgICAgICA4NzA0MCwgICAgICA4NzA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI2ZmExOTgyCiswLCAgICAgIDg4MDY0LCAgICAgIDg4MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWIxYWM4YjcKKzAsICAgICAgODkwODgsICAgICAgODkwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNjhkZGE4ZgorMCwgICAgICA5MDExMiwgICAgICA5MDExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU0NTdiNTA1CiswLCAgICAgIDkxMTM2LCAgICAgIDkxMTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGEyNWE0MDkKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YjVkOWQzYgorMCwgICAgICA5MzE4NCwgICAgICA5MzE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE2MWViMTNkCiswLCAgICAgIDk0MjA4LCAgICAgIDk0MjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWM5M2I2NmYKKzAsICAgICAgOTUyMzIsICAgICAgOTUyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjN2FlYjMzZgorMCwgICAgICA5NjI1NiwgICAgICA5NjI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUyY2NjZmI1CiswLCAgICAgIDk3MjgwLCAgICAgIDk3MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGU0Y2Y0ODcKKzAsICAgICAgOTgzMDQsICAgICAgOTgzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOWMwN2YzNQorMCwgICAgICA5OTMyOCwgICAgICA5OTMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYzZWNkMzRmCiswLCAgICAgMTAwMzUyLCAgICAgMTAwMzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTIyYWVjNTMKKzAsICAgICAxMDEzNzYsICAgICAxMDEzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NTgxYzBhZAorMCwgICAgIDEwMjQwMCwgICAgIDEwMjQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY0MGVkYjE1CiswLCAgICAgMTAzNDI0LCAgICAgMTAzNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWQ2NmM2NmYKKzAsICAgICAxMDQ0NDgsICAgICAxMDQ0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNjllOWQzNQorMCwgICAgIDEwNTQ3MiwgICAgIDEwNTQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjOWZkMGU5CiswLCAgICAgMTA2NDk2LCAgICAgMTA2NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzI0Njg2NjcKKzAsICAgICAxMDc1MjAsICAgICAxMDc1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZTZkZDAyYgorMCwgICAgIDEwODU0NCwgICAgIDEwODU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkzZWRjZTMzCiswLCAgICAgMTA5NTY4LCAgICAgMTA5NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2RmYmQ1MTkKKzAsICAgICAxMTA1OTIsICAgICAxMTA1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NDYzZjJiYgorMCwgICAgIDExMTYxNiwgICAgIDExMTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjYTZmODY5CiswLCAgICAgMTEyNjQwLCAgICAgMTEyNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDk5YTAzOTgKKzAsICAgICAxMTM2NjQsICAgICAxMTM2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhN2ZhMTBmMAorMCwgICAgIDExNDY4OCwgICAgIDExNDY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4Y2FkZGQzCiswLCAgICAgMTE1NzEyLCAgICAgMTE1NzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDg1MmVmOGIKKzAsICAgICAxMTY3MzYsICAgICAxMTY3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMjUwZWU3YgorMCwgICAgIDExNzc2MCwgICAgIDExNzc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk1ODNkYTIxCiswLCAgICAgMTE4Nzg0LCAgICAgMTE4Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzM2NWZiMzMKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOGM4MjA2NgorMCwgICAgIDEyMDgzMiwgICAgIDEyMDgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk0NjUwYmU0CiswLCAgICAgMTIxODU2LCAgICAgMTIxODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWIyMWY4ZWIKKzAsICAgICAxMjI4ODAsICAgICAxMjI4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDg4ZjQ1NQorMCwgICAgIDEyMzkwNCwgICAgIDEyMzkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY2YTllZmFmCiswLCAgICAgMTI0OTI4LCAgICAgMTI0OTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTUwMGM2ZWQKKzAsICAgICAxMjU5NTIsICAgICAxMjU5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZWUwYzYyZAorMCwgICAgIDEyNjk3NiwgICAgIDEyNjk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM0ZDMwNzYyCiswLCAgICAgMTI4MDAwLCAgICAgMTI4MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGMwZGVjOWYKKzAsICAgICAxMjkwMjQsICAgICAxMjkwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3OTAwMTFkOAorMCwgICAgIDEzMDA0OCwgICAgIDEzMDA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3NmExMTM2CiswLCAgICAgMTMxMDcyLCAgICAgMTMxMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2RkZGZlYTcKKzAsICAgICAxMzIwOTYsICAgICAxMzIwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmEzZWQ0OQorMCwgICAgIDEzMzEyMCwgICAgIDEzMzEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxMjlmNTRlCiswLCAgICAgMTM0MTQ0LCAgICAgMTM0MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWE4NmYwNzcKKzAsICAgICAxMzUxNjgsICAgICAxMzUxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjOWVlZjIwOQorMCwgICAgIDEzNjE5MiwgICAgIDEzNjE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcyZDQwMjliCiswLCAgICAgMTM3MjE2LCAgICAgMTM3MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGVjMjA1OTAKKzAsICAgICAxMzgyNDAsICAgICAxMzgyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNDhmMThlZAorMCwgICAgIDEzOTI2NCwgICAgIDEzOTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ4MDdlYWRjCiswLCAgICAgMTQwMjg4LCAgICAgMTQwMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWUyYmVhMDkKKzAsICAgICAxNDEzMTIsICAgICAxNDEzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MzdhZjEyZQorMCwgICAgIDE0MjMzNiwgICAgIDE0MjMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRlZGJmMzAzCiswLCAgICAgMTQzMzYwLCAgICAgMTQzMzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGM3NWRmODgKKzAsICAgICAxNDQzODQsICAgICAxNDQzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODQ1ZmZkNgorMCwgICAgIDE0NTQwOCwgICAgIDE0NTQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwZTgxNTBjCiswLCAgICAgMTQ2NDMyLCAgICAgMTQ2NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWVhN2VlZWYKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YzdlZmEyMQorMCwgICAgIDE0ODQ4MCwgICAgIDE0ODQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiOTdlMzBlCiswLCAgICAgMTQ5NTA0LCAgICAgMTQ5NTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTUwNDAyMjgKKzAsICAgICAxNTA1MjgsICAgICAxNTA1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MjgzZjc4YworMCwgICAgIDE1MTU1MiwgICAgIDE1MTU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU3MTAwMTQwCiswLCAgICAgMTUyNTc2LCAgICAgMTUyNTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWVhNmY5YjIKKzAsICAgICAxNTM2MDAsICAgICAxNTM2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZjBlMTU2MworMCwgICAgIDE1NDYyNCwgICAgIDE1NDYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUxMGJmMThlCiswLCAgICAgMTU1NjQ4LCAgICAgMTU1NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWY0ZmU0MjUKKzAsICAgICAxNTY2NzIsICAgICAxNTY2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDdhZjNjMAorMCwgICAgIDE1NzY5NiwgICAgIDE1NzY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmMTRkZGM2CiswLCAgICAgMTU4NzIwLCAgICAgMTU4NzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg3MWVkNjkKKzAsICAgICAxNTk3NDQsICAgICAxNTk3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMzQ5ZWY5ZgorMCwgICAgIDE2MDc2OCwgICAgIDE2MDc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlMmMxODM0CiswLCAgICAgMTYxNzkyLCAgICAgMTYxNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjM4M2ZlMDQKKzAsICAgICAxNjI4MTYsICAgICAxNjI4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NjI2ZjQxNQorMCwgICAgIDE2Mzg0MCwgICAgIDE2Mzg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4M2JlMzc5CiswLCAgICAgMTY0ODY0LCAgICAgMTY0ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzc2YzBjZWIKKzAsICAgICAxNjU4ODgsICAgICAxNjU4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMGI4MDQwZgorMCwgICAgIDE2NjkxMiwgICAgIDE2NjkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1MzVlYjZkCiswLCAgICAgMTY3OTM2LCAgICAgMTY3OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWIxODBiYjUKKzAsICAgICAxNjg5NjAsICAgICAxNjg5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYzVjZjA1OQorMCwgICAgIDE2OTk4NCwgICAgIDE2OTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NjJmMWFjCiswLCAgICAgMTcxMDA4LCAgICAgMTcxMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWNjMmVhMmIKKzAsICAgICAxNzIwMzIsICAgICAxNzIwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYjlhZTc1NAorMCwgICAgIDE3MzA1NiwgICAgIDE3MzA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxNmRlYmI1CiswLCAgICAgMTc0MDgwLCAgICAgMTc0MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmYzYWZmMmEKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTVkZmE1YworMCwgICAgIDE3NjEyOCwgICAgIDE3NjEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiODMwNjA1CiswLCAgICAgMTc3MTUyLCAgICAgMTc3MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAzMGRjOWUKKzAsICAgICAxNzgxNzYsICAgICAxNzgxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDE3ZmQ1NAorMCwgICAgIDE3OTIwMCwgICAgIDE3OTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjN2RmYTJlCiswLCAgICAgMTgwMjI0LCAgICAgMTgwMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzg4N2U1OTkKKzAsICAgICAxODEyNDgsICAgICAxODEyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzMwZTcyZgorMCwgICAgIDE4MjI3MiwgICAgIDE4MjI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiYjNmYWU0CiswLCAgICAgMTgzMjk2LCAgICAgMTgzMjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2MwOGZjMzYKKzAsICAgICAxODQzMjAsICAgICAxODQzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWZkOWVjMgorMCwgICAgIDE4NTM0NCwgICAgIDE4NTM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGExZDNlODNkCiswLCAgICAgMTg2MzY4LCAgICAgMTg2MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2Y5NjAxM2MKKzAsICAgICAxODczOTIsICAgICAxODczOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YTBhZmUzMQorMCwgICAgIDE4ODQxNiwgICAgIDE4ODQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzN2QxNzAxCiswLCAgICAgMTg5NDQwLCAgICAgMTg5NDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxNWViYzIKKzAsICAgICAxOTA0NjQsICAgICAxOTA0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTcwMDVjMQorMCwgICAgIDE5MTQ4OCwgICAgIDE5MTQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE3NTVmNzg5CiswLCAgICAgMTkyNTEyLCAgICAgMTkyNTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODNlNmRiNjUKKzAsICAgICAxOTM1MzYsICAgICAxOTM1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MmFiMTQ0NworMCwgICAgIDE5NDU2MCwgICAgIDE5NDU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkYmRmMzgzCiswLCAgICAgMTk1NTg0LCAgICAgMTk1NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMxNmY2YTkKKzAsICAgICAxOTY2MDgsICAgICAxOTY2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTZhMGI0YworMCwgICAgIDE5NzYzMiwgICAgIDE5NzYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmZDgwOWI3CiswLCAgICAgMTk4NjU2LCAgICAgMTk4NjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQyY2Y1ZjEKKzAsICAgICAxOTk2ODAsICAgICAxOTk2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMzY2ZjRhMQorMCwgICAgIDIwMDcwNCwgICAgIDIwMDcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhMmY4NmUwCiswLCAgICAgMjAxNzI4LCAgICAgMjAxNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjUxZjA4YTkKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNWVkZWZhOAorMCwgICAgIDIwMzc3NiwgICAgIDIwMzc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1NWRmMmE2CiswLCAgICAgMjA0ODAwLCAgICAgMjA0ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTg4MWQ5ZTQKKzAsICAgICAyMDU4MjQsICAgICAyMDU4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDM4MDUyMworMCwgICAgIDIwNjg0OCwgICAgIDIwNjg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiOTNlYjI2CiswLCAgICAgMjA3ODcyLCAgICAgMjA3ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU5Y2Y5NGMKKzAsICAgICAyMDg4OTYsICAgICAyMDg4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NDc0ZjU5MQorMCwgICAgIDIwOTkyMCwgICAgIDIwOTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMzBkYzllCiswLCAgICAgMjEwOTQ0LCAgICAgMjEwOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAxN2ZkNTQKKzAsICAgICAyMTE5NjgsICAgICAyMTE5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzdkZmEyZQorMCwgICAgIDIxMjk5MiwgICAgIDIxMjk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4ODdlNTk5CiswLCAgICAgMjE0MDE2LCAgICAgMjE0MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjczMGU3MmYKKzAsICAgICAyMTUwNDAsICAgICAyMTUwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YmIzZmFlNAorMCwgICAgIDIxNjA2NCwgICAgIDIxNjA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjMDhmYzM2CiswLCAgICAgMjE3MDg4LCAgICAgMjE3MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFmZDllYzIKKzAsICAgICAyMTgxMTIsICAgICAyMTgxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMWQzZTgzZAorMCwgICAgIDIxOTEzNiwgICAgIDIxOTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmOTYwMTNjCiswLCAgICAgMjIwMTYwLCAgICAgMjIwMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2EwYWZlMzEKKzAsICAgICAyMjExODQsICAgICAyMjExODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMzdkMTcwMQorMCwgICAgIDIyMjIwOCwgICAgIDIyMjIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2MTVlYmMyCiswLCAgICAgMjIzMjMyLCAgICAgMjIzMjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjE3MDA1YzEKKzAsICAgICAyMjQyNTYsICAgICAyMjQyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzU1Zjc4OQorMCwgICAgIDIyNTI4MCwgICAgIDIyNTI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzZTZkYjY1CiswLCAgICAgMjI2MzA0LCAgICAgMjI2MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJhYjE0NDcKKzAsICAgICAyMjczMjgsICAgICAyMjczMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZGJkZjM4MworMCwgICAgIDIyODM1MiwgICAgIDIyODM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzMTZmNmE5CiswLCAgICAgMjI5Mzc2LCAgICAgMjI5Mzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE2YTBiNGMKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmQ4MDliNworMCwgICAgIDIzMTQyNCwgICAgIDIzMTQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFkMmNmNWYxCiswLCAgICAgMjMyNDQ4LCAgICAgMjMyNDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDM2NmY0YTEKKzAsICAgICAyMzM0NzIsICAgICAyMzM0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YTJmODZlMAorMCwgICAgIDIzNDQ5NiwgICAgIDIzNDQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY1MWYwOGE5CiswLCAgICAgMjM1NTIwLCAgICAgMjM1NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDVlZGVmYTgKKzAsICAgICAyMzY1NDQsICAgICAyMzY1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTVkZjJhNgorMCwgICAgIDIzNzU2OCwgICAgIDIzNzU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU4ODFkOWU0CiswLCAgICAgMjM4NTkyLCAgICAgMjM4NTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTAzODA1MjMKKzAsICAgICAyMzk2MTYsICAgICAyMzk2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YjkzZWIyNgorMCwgICAgIDI0MDY0MCwgICAgIDI0MDY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1OWNmOTRjCiswLCAgICAgMjQxNjY0LCAgICAgMjQxNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODQ3NGY1OTEKKzAsICAgICAyNDI2ODgsICAgICAyNDI2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDMwZGM5ZQorMCwgICAgIDI0MzcxMiwgICAgIDI0MzcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMTdmZDU0CiswLCAgICAgMjQ0NzM2LCAgICAgMjQ0NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM3ZGZhMmUKKzAsICAgICAyNDU3NjAsICAgICAyNDU3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODg3ZTU5OQorMCwgICAgIDI0Njc4NCwgICAgIDI0Njc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3MzBlNzJmCiswLCAgICAgMjQ3ODA4LCAgICAgMjQ3ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmJiM2ZhZTQKKzAsICAgICAyNDg4MzIsICAgICAyNDg4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYzA4ZmMzNgorMCwgICAgIDI0OTg1NiwgICAgIDI0OTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhZmQ5ZWMyCiswLCAgICAgMjUwODgwLCAgICAgMjUwODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTFkM2U4M2QKKzAsICAgICAyNTE5MDQsICAgICAyNTE5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3Zjk2MDEzYworMCwgICAgIDI1MjkyOCwgICAgIDI1MjkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhMGFmZTMxCiswLCAgICAgMjUzOTUyLCAgICAgMjUzOTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTM3ZDE3MDEKKzAsICAgICAyNTQ5NzYsICAgICAyNTQ5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjE1ZWJjMgorMCwgICAgIDI1NjAwMCwgICAgIDI1NjAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxNzAwNWMxCiswLCAgICAgMjU3MDI0LCAgICAgMjU3MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTc1NWY3ODkKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4M2U2ZGI2NQorMCwgICAgIDI1OTA3MiwgICAgIDI1OTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyYWIxNDQ3CiswLCAgICAgMjYwMDk2LCAgICAgMjYwMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWRiZGYzODMKKzAsICAgICAyNjExMjAsICAgICAyNjExMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzE2ZjZhOQorMCwgICAgIDI2MjE0NCwgICAgIDI2MjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhNmEwYjRjCiswLCAgICAgMjYzMTY4LCAgICAgMjYzMTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZkODA5YjcKKzAsICAgICAyNjQxOTIsICAgICAyNjQxOTIsICAgICAgNDA4LCAgICAgMTYzMiwgMHhmNDEyMzEzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFmYWRlLWlxc2luIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFmYWRlLWlxc2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjJiYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtaXFzaW4KQEAgLTAsMCArMSwyNjUgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjIwZTkwOGQKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZDY1MDAyZQorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgwNzJmYjI1CiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTgyZWZiYjUKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMGFjZWFhZAorMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA3MDJmMTRkCiswLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGUwMTA1ODgKKzAsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NWQwZmYzZAorMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZjZDNlY2ViCiswLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDA0NmVlMjcKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ODExZmQxZgorMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI0ODYwMjZlCiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWYxNWZhMDUKKzAsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNDgxZjI1NQorMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3M2RmMGNmCiswLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjViM2ZmZTUKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NmMxMDY0MgorMCwgICAgICAxNzQwOCwgICAgICAxNzQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY2NDdmMDFmCiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODY4MmY2NmYKKzAsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyZmUxZjg3ZAorMCwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMzZGRmYWRiCiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGUxY2ZlYWYKKzAsICAgICAgMjI1MjgsICAgICAgMjI1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Zjg3ZWI3OQorMCwgICAgICAyMzU1MiwgICAgICAyMzU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc5ZGRmMmI3CiswLCAgICAgIDI0NTc2LCAgICAgIDI0NTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzRiNmVlNWQKKzAsICAgICAgMjU2MDAsICAgICAgMjU2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNDI0MGMyYQorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdlNzVlMTUzCiswLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTQ2ZmVlNGYKKzAsICAgICAgMjg2NzIsICAgICAgMjg2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YmRkZWMxZAorMCwgICAgICAyOTY5NiwgICAgICAyOTY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIxNTkwYjcwCiswLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjZmYjAwZmEKKzAsICAgICAgMzE3NDQsICAgICAgMzE3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMTlkZWExNworMCwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzMWVmZGI3CiswLCAgICAgIDMzNzkyLCAgICAgIDMzNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWVmNGY0MWQKKzAsICAgICAgMzQ4MTYsICAgICAgMzQ4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZmE2MDNlYQorMCwgICAgICAzNTg0MCwgICAgICAzNTg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmYTZmOTE1CiswLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2VkMWY4OWYKKzAsICAgICAgMzc4ODgsICAgICAgMzc4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YWM2ZTg0NQorMCwgICAgICAzODkxMiwgICAgICAzODkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRhOWYxMDhjCiswLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTg4NTA2ZmEKKzAsICAgICAgNDA5NjAsICAgICAgNDA5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkY2JlZTgxZAorMCwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI0NDFlY2U3CiswLCAgICAgIDQzMDA4LCAgICAgIDQzMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzc4NGZiYmQKKzAsICAgICAgNDQwMzIsICAgICAgNDQwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYzgzZmJmMworMCwgICAgICA0NTA1NiwgICAgICA0NTA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxODcwNGNhCiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGQ3ZDIwMjYKKzAsICAgICAgNDcxMDQsICAgICAgNDcxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZDFmZWRlYgorMCwgICAgICA0ODEyOCwgICAgICA0ODEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZmYjhmMzAxCiswLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGM4ZGQ1MzcKKzAsICAgICAgNTAxNzYsICAgICAgNTAxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTljZjc1NQorMCwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE1YWVlNzUzCiswLCAgICAgIDUyMjI0LCAgICAgIDUyMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTcxZTE5YzQKKzAsICAgICAgNTMyNDgsICAgICAgNTMyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZTZjZDcyNQorMCwgICAgICA1NDI3MiwgICAgICA1NDI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAyZWJmZGU3CiswLCAgICAgIDU1Mjk2LCAgICAgIDU1Mjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTU2NWYzNTMKKzAsICAgICAgNTYzMjAsICAgICAgNTYzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNGJhZGY0NQorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhkOWFmMjE1CiswLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmIyMDA0NWUKKzAsICAgICAgNTkzOTIsICAgICAgNTkzOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMWFkZmY5YgorMCwgICAgICA2MDQxNiwgICAgICA2MDQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ2ODZlNmQzCiswLCAgICAgIDYxNDQwLCAgICAgIDYxNDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTI1YmY5NzUKKzAsICAgICAgNjI0NjQsICAgICAgNjI0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNTRjMGFkNgorMCwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0OGVlYTU1CiswLCAgICAgIDY0NTEyLCAgICAgIDY0NTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTRkNWZiZWIKKzAsICAgICAgNjU1MzYsICAgICAgNjU1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNjlkZmU3YgorMCwgICAgICA2NjU2MCwgICAgICA2NjU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVlZWJmOTIxCiswLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzJhNWRlM2YKKzAsICAgICAgNjg2MDgsICAgICAgNjg2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhN2I5ZGI4NQorMCwgICAgICA2OTYzMiwgICAgICA2OTYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE1MmVlNGI3CiswLCAgICAgIDcwNjU2LCAgICAgIDcwNjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFjMTEwNGEKKzAsICAgICAgNzE2ODAsICAgICAgNzE2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZWQzMzRiNgorMCwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk0ZDMwZjA2CiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDcyMWU3NTUKKzAsICAgICAgNzQ3NTIsICAgICAgNzQ3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NTAzMDQzYworMCwgICAgICA3NTc3NiwgICAgICA3NTc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkMTFlN2I5CiswLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjRmODA3ZDAKKzAsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZjJiZjU3OQorMCwgICAgICA3ODg0OCwgICAgICA3ODg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlmYWNmNmIxCiswLCAgICAgIDc5ODcyLCAgICAgIDc5ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjQ0MjA2YTIKKzAsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZDRmZjc3OQorMCwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM0MjAxMGMwCiswLCAgICAgIDgyOTQ0LCAgICAgIDgyOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTkzYTFjNDYKKzAsICAgICAgODM5NjgsICAgICAgODM5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4OGY1MjYzZQorMCwgICAgICA4NDk5MiwgICAgICA4NDk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY3YjRmYTI1CiswLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTI3NmU5YjUKKzAsICAgICAgODcwNDAsICAgICAgODcwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NWQ3MGYwYworMCwgICAgICA4ODA2NCwgICAgICA4ODA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4MWJjOGFmCiswLCAgICAgIDg5MDg4LCAgICAgIDg5MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTY4ZGRhOGYKKzAsICAgICAgOTAxMTIsICAgICAgOTAxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNDU3YjUwNQorMCwgICAgICA5MTEzNiwgICAgICA5MTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRhMjVhNDA5CiswLCAgICAgIDkyMTYwLCAgICAgIDkyMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWI1ZDlkM2IKKzAsICAgICAgOTMxODQsICAgICAgOTMxODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNjFlYjEzZAorMCwgICAgICA5NDIwOCwgICAgICA5NDIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFjOTNiNjZmCiswLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzdhZWIzM2YKKzAsICAgICAgOTYyNTYsICAgICAgOTYyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MmNjY2ZiNQorMCwgICAgICA5NzI4MCwgICAgICA5NzI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlNGNmNDg3CiswLCAgICAgIDk4MzA0LCAgICAgIDk4MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTljMDdmMzUKKzAsICAgICAgOTkzMjgsICAgICAgOTkzMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2M2VjZDM0ZgorMCwgICAgIDEwMDM1MiwgICAgIDEwMDM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDEyMmFlYzUzCiswLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjU4MWMwYWQKKzAsICAgICAxMDI0MDAsICAgICAxMDI0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NDBlZGIxNQorMCwgICAgIDEwMzQyNCwgICAgIDEwMzQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVkNjZjNjZmCiswLCAgICAgMTA0NDQ4LCAgICAgMTA0NDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDY5ZTlkMzUKKzAsICAgICAxMDU0NzIsICAgICAxMDU0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzlmZDBlOQorMCwgICAgIDEwNjQ5NiwgICAgIDEwNjQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcyNDY4NjY3CiswLCAgICAgMTA3NTIwLCAgICAgMTA3NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmU2ZGQwMmIKKzAsICAgICAxMDg1NDQsICAgICAxMDg1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5M2VkY2UzMworMCwgICAgIDEwOTU2OCwgICAgIDEwOTU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNkZmJkNTE5CiswLCAgICAgMTEwNTkyLCAgICAgMTEwNTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODQ2M2YyYmIKKzAsICAgICAxMTE2MTYsICAgICAxMTE2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1Y2E2Zjg2OQorMCwgICAgIDExMjY0MCwgICAgIDExMjY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA5OWEwMzk4CiswLCAgICAgMTEzNjY0LCAgICAgMTEzNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTdmYTEwZjAKKzAsICAgICAxMTQ2ODgsICAgICAxMTQ2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOGNhZGRkMworMCwgICAgIDExNTcxMiwgICAgIDExNTcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ4NTJlZjhiCiswLCAgICAgMTE2NzM2LCAgICAgMTE2NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDI1MGVlN2IKKzAsICAgICAxMTc3NjAsICAgICAxMTc3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NTgzZGEyMQorMCwgICAgIDExODc4NCwgICAgIDExODc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDczNjVmYjMzCiswLCAgICAgMTE5ODA4LCAgICAgMTE5ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjhjODIwNjYKKzAsICAgICAxMjA4MzIsICAgICAxMjA4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NDY1MGJlNAorMCwgICAgIDEyMTg1NiwgICAgIDEyMTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGViMjFmOGViCiswLCAgICAgMTIyODgwLCAgICAgMTIyODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2Q4OGY0NTUKKzAsICAgICAxMjM5MDQsICAgICAxMjM5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NmE5ZWZhZgorMCwgICAgIDEyNDkyOCwgICAgIDEyNDkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU1MDBjNmVkCiswLCAgICAgMTI1OTUyLCAgICAgMTI1OTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGVlMGM2MmQKKzAsICAgICAxMjY5NzYsICAgICAxMjY5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNGQzMDc2MgorMCwgICAgIDEyODAwMCwgICAgIDEyODAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhjMGRlYzlmCiswLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzkwMDExZDgKKzAsICAgICAxMzAwNDgsICAgICAxMzAwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzZhMTEzNgorMCwgICAgIDEzMTA3MiwgICAgIDEzMTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdkZGRmZWE3CiswLCAgICAgMTMyMDk2LCAgICAgMTMyMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZhM2VkNDkKKzAsICAgICAxMzMxMjAsICAgICAxMzMxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMTI5ZjU0ZQorMCwgICAgIDEzNDE0NCwgICAgIDEzNDE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlhODZmMDc3CiswLCAgICAgMTM1MTY4LCAgICAgMTM1MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzllZWYyMDkKKzAsICAgICAxMzYxOTIsICAgICAxMzYxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MmQ0MDI5YgorMCwgICAgIDEzNzIxNiwgICAgIDEzNzIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhlYzIwNTkwCiswLCAgICAgMTM4MjQwLCAgICAgMTM4MjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDQ4ZjE4ZWQKKzAsICAgICAxMzkyNjQsICAgICAxMzkyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkODA3ZWFkYworMCwgICAgIDE0MDI4OCwgICAgIDE0MDI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFlMmJlYTA5CiswLCAgICAgMTQxMzEyLCAgICAgMTQxMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTM3YWYxMmUKKzAsICAgICAxNDIzMzYsICAgICAxNDIzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZWRiZjMwMworMCwgICAgIDE0MzM2MCwgICAgIDE0MzM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRjNzVkZjg4CiswLCAgICAgMTQ0Mzg0LCAgICAgMTQ0Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg0NWZmZDYKKzAsICAgICAxNDU0MDgsICAgICAxNDU0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMGU4MTUwYworMCwgICAgIDE0NjQzMiwgICAgIDE0NjQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVlYTdlZWVmCiswLCAgICAgMTQ3NDU2LCAgICAgMTQ3NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGM3ZWZhMjEKKzAsICAgICAxNDg0ODAsICAgICAxNDg0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Yjk3ZTMwZQorMCwgICAgIDE0OTUwNCwgICAgIDE0OTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU1MDQwMjI4CiswLCAgICAgMTUwNTI4LCAgICAgMTUwNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjI4M2Y3OGMKKzAsICAgICAxNTE1NTIsICAgICAxNTE1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNzEwMDE0MAorMCwgICAgIDE1MjU3NiwgICAgIDE1MjU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDllYTZmOWIyCiswLCAgICAgMTUzNjAwLCAgICAgMTUzNjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWYwZTE1NjMKKzAsICAgICAxNTQ2MjQsICAgICAxNTQ2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MTBiZjE4ZQorMCwgICAgIDE1NTY0OCwgICAgIDE1NTY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmNGZlNDI1CiswLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTA3YWYzYzAKKzAsICAgICAxNTc2OTYsICAgICAxNTc2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZjE0ZGRjNgorMCwgICAgIDE1ODcyMCwgICAgIDE1ODcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NzFlZDY5CiswLCAgICAgMTU5NzQ0LCAgICAgMTU5NzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzM0OWVmOWYKKzAsICAgICAxNjA3NjgsICAgICAxNjA3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZTJjMTgzNAorMCwgICAgIDE2MTc5MiwgICAgIDE2MTc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzODNmZTA0CiswLCAgICAgMTYyODE2LCAgICAgMTYyODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjYyNmY0MTUKKzAsICAgICAxNjM4NDAsICAgICAxNjM4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyODNiZTM3OQorMCwgICAgIDE2NDg2NCwgICAgIDE2NDg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3NmMwY2ViCiswLCAgICAgMTY1ODg4LCAgICAgMTY1ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTBiODA0MGYKKzAsICAgICAxNjY5MTIsICAgICAxNjY5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTM1ZWI2ZAorMCwgICAgIDE2NzkzNiwgICAgIDE2NzkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGViMTgwYmI1CiswLCAgICAgMTY4OTYwLCAgICAgMTY4OTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmM1Y2YwNTkKKzAsICAgICAxNjk5ODQsICAgICAxNjk5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODYyZjFhYworMCwgICAgIDE3MTAwOCwgICAgIDE3MTAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDljYzJlYTJiCiswLCAgICAgMTcyMDMyLCAgICAgMTcyMDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmI5YWU3NTQKKzAsICAgICAxNzMwNTYsICAgICAxNzMwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MTZkZWJiNQorMCwgICAgIDE3NDA4MCwgICAgIDE3NDA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZmM2FmZjJhCiswLCAgICAgMTc1MTA0LCAgICAgMTc1MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU1ZGZhNWMKKzAsICAgICAxNzYxMjgsICAgICAxNzYxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYjgzMDYwNQorMCwgICAgIDE3NzE1MiwgICAgIDE3NzE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMzBkYzllCiswLCAgICAgMTc4MTc2LCAgICAgMTc4MTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAxN2ZkNTQKKzAsICAgICAxNzkyMDAsICAgICAxNzkyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzdkZmEyZQorMCwgICAgIDE4MDIyNCwgICAgIDE4MDIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4ODdlNTk5CiswLCAgICAgMTgxMjQ4LCAgICAgMTgxMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjczMGU3MmYKKzAsICAgICAxODIyNzIsICAgICAxODIyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YmIzZmFlNAorMCwgICAgIDE4MzI5NiwgICAgIDE4MzI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjMDhmYzM2CiswLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFmZDllYzIKKzAsICAgICAxODUzNDQsICAgICAxODUzNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMWQzZTgzZAorMCwgICAgIDE4NjM2OCwgICAgIDE4NjM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmOTYwMTNjCiswLCAgICAgMTg3MzkyLCAgICAgMTg3MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2EwYWZlMzEKKzAsICAgICAxODg0MTYsICAgICAxODg0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMzdkMTcwMQorMCwgICAgIDE4OTQ0MCwgICAgIDE4OTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2MTVlYmMyCiswLCAgICAgMTkwNDY0LCAgICAgMTkwNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjE3MDA1YzEKKzAsICAgICAxOTE0ODgsICAgICAxOTE0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzU1Zjc4OQorMCwgICAgIDE5MjUxMiwgICAgIDE5MjUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzZTZkYjY1CiswLCAgICAgMTkzNTM2LCAgICAgMTkzNTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJhYjE0NDcKKzAsICAgICAxOTQ1NjAsICAgICAxOTQ1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZGJkZjM4MworMCwgICAgIDE5NTU4NCwgICAgIDE5NTU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzMTZmNmE5CiswLCAgICAgMTk2NjA4LCAgICAgMTk2NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE2YTBiNGMKKzAsICAgICAxOTc2MzIsICAgICAxOTc2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmQ4MDliNworMCwgICAgIDE5ODY1NiwgICAgIDE5ODY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFkMmNmNWYxCiswLCAgICAgMTk5NjgwLCAgICAgMTk5NjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDM2NmY0YTEKKzAsICAgICAyMDA3MDQsICAgICAyMDA3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YTJmODZlMAorMCwgICAgIDIwMTcyOCwgICAgIDIwMTcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY1MWYwOGE5CiswLCAgICAgMjAyNzUyLCAgICAgMjAyNzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDVlZGVmYTgKKzAsICAgICAyMDM3NzYsICAgICAyMDM3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTVkZjJhNgorMCwgICAgIDIwNDgwMCwgICAgIDIwNDgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU4ODFkOWU0CiswLCAgICAgMjA1ODI0LCAgICAgMjA1ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTAzODA1MjMKKzAsICAgICAyMDY4NDgsICAgICAyMDY4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YjkzZWIyNgorMCwgICAgIDIwNzg3MiwgICAgIDIwNzg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1OWNmOTRjCiswLCAgICAgMjA4ODk2LCAgICAgMjA4ODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODQ3NGY1OTEKKzAsICAgICAyMDk5MjAsICAgICAyMDk5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDMwZGM5ZQorMCwgICAgIDIxMDk0NCwgICAgIDIxMDk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMTdmZDU0CiswLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM3ZGZhMmUKKzAsICAgICAyMTI5OTIsICAgICAyMTI5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODg3ZTU5OQorMCwgICAgIDIxNDAxNiwgICAgIDIxNDAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3MzBlNzJmCiswLCAgICAgMjE1MDQwLCAgICAgMjE1MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmJiM2ZhZTQKKzAsICAgICAyMTYwNjQsICAgICAyMTYwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYzA4ZmMzNgorMCwgICAgIDIxNzA4OCwgICAgIDIxNzA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhZmQ5ZWMyCiswLCAgICAgMjE4MTEyLCAgICAgMjE4MTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTFkM2U4M2QKKzAsICAgICAyMTkxMzYsICAgICAyMTkxMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3Zjk2MDEzYworMCwgICAgIDIyMDE2MCwgICAgIDIyMDE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhMGFmZTMxCiswLCAgICAgMjIxMTg0LCAgICAgMjIxMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTM3ZDE3MDEKKzAsICAgICAyMjIyMDgsICAgICAyMjIyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjE1ZWJjMgorMCwgICAgIDIyMzIzMiwgICAgIDIyMzIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxNzAwNWMxCiswLCAgICAgMjI0MjU2LCAgICAgMjI0MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTc1NWY3ODkKKzAsICAgICAyMjUyODAsICAgICAyMjUyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4M2U2ZGI2NQorMCwgICAgIDIyNjMwNCwgICAgIDIyNjMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyYWIxNDQ3CiswLCAgICAgMjI3MzI4LCAgICAgMjI3MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWRiZGYzODMKKzAsICAgICAyMjgzNTIsICAgICAyMjgzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzE2ZjZhOQorMCwgICAgIDIyOTM3NiwgICAgIDIyOTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhNmEwYjRjCiswLCAgICAgMjMwNDAwLCAgICAgMjMwNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZkODA5YjcKKzAsICAgICAyMzE0MjQsICAgICAyMzE0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZDJjZjVmMQorMCwgICAgIDIzMjQ0OCwgICAgIDIzMjQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzNjZmNGExCiswLCAgICAgMjMzNDcyLCAgICAgMjMzNDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmEyZjg2ZTAKKzAsICAgICAyMzQ0OTYsICAgICAyMzQ0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNTFmMDhhOQorMCwgICAgIDIzNTUyMCwgICAgIDIzNTUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1ZWRlZmE4CiswLCAgICAgMjM2NTQ0LCAgICAgMjM2NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjU1ZGYyYTYKKzAsICAgICAyMzc1NjgsICAgICAyMzc1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlODgxZDllNAorMCwgICAgIDIzODU5MiwgICAgIDIzODU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwMzgwNTIzCiswLCAgICAgMjM5NjE2LCAgICAgMjM5NjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5M2ViMjYKKzAsICAgICAyNDA2NDAsICAgICAyNDA2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTljZjk0YworMCwgICAgIDI0MTY2NCwgICAgIDI0MTY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg0NzRmNTkxCiswLCAgICAgMjQyNjg4LCAgICAgMjQyNjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAzMGRjOWUKKzAsICAgICAyNDM3MTIsICAgICAyNDM3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDE3ZmQ1NAorMCwgICAgIDI0NDczNiwgICAgIDI0NDczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjN2RmYTJlCiswLCAgICAgMjQ1NzYwLCAgICAgMjQ1NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzg4N2U1OTkKKzAsICAgICAyNDY3ODQsICAgICAyNDY3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzMwZTcyZgorMCwgICAgIDI0NzgwOCwgICAgIDI0NzgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiYjNmYWU0CiswLCAgICAgMjQ4ODMyLCAgICAgMjQ4ODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2MwOGZjMzYKKzAsICAgICAyNDk4NTYsICAgICAyNDk4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWZkOWVjMgorMCwgICAgIDI1MDg4MCwgICAgIDI1MDg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGExZDNlODNkCiswLCAgICAgMjUxOTA0LCAgICAgMjUxOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2Y5NjAxM2MKKzAsICAgICAyNTI5MjgsICAgICAyNTI5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YTBhZmUzMQorMCwgICAgIDI1Mzk1MiwgICAgIDI1Mzk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzN2QxNzAxCiswLCAgICAgMjU0OTc2LCAgICAgMjU0OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxNWViYzIKKzAsICAgICAyNTYwMDAsICAgICAyNTYwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTcwMDVjMQorMCwgICAgIDI1NzAyNCwgICAgIDI1NzAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE3NTVmNzg5CiswLCAgICAgMjU4MDQ4LCAgICAgMjU4MDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODNlNmRiNjUKKzAsICAgICAyNTkwNzIsICAgICAyNTkwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MmFiMTQ0NworMCwgICAgIDI2MDA5NiwgICAgIDI2MDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkYmRmMzgzCiswLCAgICAgMjYxMTIwLCAgICAgMjYxMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMxNmY2YTkKKzAsICAgICAyNjIxNDQsICAgICAyNjIxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTZhMGI0YworMCwgICAgIDI2MzE2OCwgICAgIDI2MzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmZDgwOWI3CiswLCAgICAgMjY0MTkyLCAgICAgMjY0MTkyLCAgICAgIDQwOCwgICAgIDE2MzIsIDB4ZjQxMjMxM2UKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZmFkZS1sb2cgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWMwYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtbG9nCkBAIC0wLDAgKzEsMjY1IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYwMWFkYmQzCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmJlMTBmOGUKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZjA0ZmNjZgorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcwZTVmYzM5CiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTNhMmVjZGYKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNjgwZTMxMQorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3M2VmOTZkCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2RiY2ZlNWYKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZGJkMDI5YworMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRmOGZlYThmCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTQ1ODAxNTQKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NzFkMTAxMgorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY2Y2VmZTU3CiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmE1NTAxNTYKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYTVjMDZjYQorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEyODBmZDA5CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDZiMzBlNjgKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkM2YxZjkyZAorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY3NWRlNTE5CiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDExY2YwZTUKKzAsICAgICAgMjA0ODAsICAgICAgMjA0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZWI4MDU2NgorMCwgICAgICAyMTUwNCwgICAgICAyMTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE1N2MwNjRjCiswLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjQ3NmY3MmYKKzAsICAgICAgMjM1NTIsICAgICAgMjM1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZTFiZWY1MworMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkxMWZmODQzCiswLCAgICAgIDI1NjAwLCAgICAgIDI1NjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGUzNzEzYzQKKzAsICAgICAgMjY2MjQsICAgICAgMjY2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNDM0ZmI3MQorMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzYzFlYWVkCiswLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODgwNGU4N2QKKzAsICAgICAgMjk2OTYsICAgICAgMjk2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMWZhMDNlMgorMCwgICAgICAzMDcyMCwgICAgICAzMDcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkNTZmYzIxCiswLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjNkNmYyZmIKKzAsICAgICAgMzI3NjgsICAgICAgMzI3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMWRkZmE2ZAorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk5ODMwOWVlCiswLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2ViYzA2MzIKKzAsICAgICAgMzU4NDAsICAgICAgMzU4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ODYwZTUwMworMCwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzZTkxMGQ4CiswLCAgICAgIDM3ODg4LCAgICAgIDM3ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjQ0OWNhZWQKKzAsICAgICAgMzg5MTIsICAgICAgMzg5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZmFmMGU5YQorMCwgICAgICAzOTkzNiwgICAgICAzOTkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxOGZkYjU5CiswLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWEwYjA1N2UKKzAsICAgICAgNDE5ODQsICAgICAgNDE5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYjE4Y2FlMQorMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZmMGExMzM4CiswLCAgICAgIDQ0MDMyLCAgICAgIDQ0MDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTlhZjAzYjIKKzAsICAgICAgNDUwNTYsICAgICAgNDUwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMjA0ZjUzMworMCwgICAgICA0NjA4MCwgICAgICA0NjA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFlNWIwZWQyCiswLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmViZmMyNTMKKzAsICAgICAgNDgxMjgsICAgICAgNDgxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNjhiZDhkOQorMCwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjNzgwMjRhCiswLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWEzNmYzNDMKKzAsICAgICAgNTEyMDAsICAgICAgNTEyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODk5Y2MxOQorMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiMjdkZWE5CiswLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWVkN2NiYmYKKzAsICAgICAgNTQyNzIsICAgICAgNTQyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYzhlMTVjNAorMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI4NjQwMDRjCiswLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzI3ZWZmYmYKKzAsICAgICAgNTczNDQsICAgICAgNTczNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzNlMjA1NgorMCwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3MDQwODZhCiswLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGVmZGZmMDkKKzAsICAgICAgNjA0MTYsICAgICAgNjA0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5Nzk0MDZlMAorMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDExMTVlOTNkCiswLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2Q2MmYwOTcKKzAsICAgICAgNjM0ODgsICAgICAgNjM0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNmY4ZTA1MQorMCwgICAgICA2NDUxMiwgICAgICA2NDUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDMwZDQwNDY0CiswLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWMyZjE3MjYKKzAsICAgICAgNjY1NjAsICAgICAgNjY1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYWMzY2RkNQorMCwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyYzIwYjEyCiswLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWUxMGNkNmYKKzAsICAgICAgNjk2MzIsICAgICAgNjk2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YzhmZDZmYgorMCwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZiZmZlYjcxCiswLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWQ2NDFiMjgKKzAsICAgICAgNzI3MDQsICAgICAgNzI3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNWVlZjkyNQorMCwgICAgICA3MzcyOCwgICAgICA3MzcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwOThkODVkCiswLCAgICAgIDc0NzUyLCAgICAgIDc0NzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGQwM2YyMmIKKzAsICAgICAgNzU3NzYsICAgICAgNzU3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMGQ3ZjVlZAorMCwgICAgICA3NjgwMCwgICAgICA3NjgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI4MDkxN2NlCiswLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzI1NWZiODkKKzAsICAgICAgNzg4NDgsICAgICAgNzg4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZWY5MDYzYworMCwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcyODZmMTUxCiswLCAgICAgIDgwODk2LCAgICAgIDgwODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjRjOGVlNzEKKzAsICAgICAgODE5MjAsICAgICAgODE5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZjVmMTY5YQorMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIyZmExYjVjCiswLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGRmYWY4OTUKKzAsICAgICAgODQ5OTIsICAgICAgODQ5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZTE3MGU5NAorMCwgICAgICA4NjAxNiwgICAgICA4NjAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI3ZDIxOTYwCiswLCAgICAgIDg3MDQwLCAgICAgIDg3MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGVkZDA5YzYKKzAsICAgICAgODgwNjQsICAgICAgODgwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YzJmMDA3NAorMCwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFhOWRmYTRiCiswLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDU0M2RiMDkKKzAsICAgICAgOTExMzYsICAgICAgOTExMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNWMwYzdhOQorMCwgICAgICA5MjE2MCwgICAgICA5MjE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjZjVhYzhmCiswLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTMxZmRmMWIKKzAsICAgICAgOTQyMDgsICAgICAgOTQyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjNmZjdlYgorMCwgICAgICA5NTIzMiwgICAgICA5NTIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY2ZDUwOTU4CiswLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGQzYmZlYTUKKzAsICAgICAgOTcyODAsICAgICAgOTcyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YWQwMmViYQorMCwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMwYzNkZTk3CiswLCAgICAgIDk5MzI4LCAgICAgIDk5MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzc4YjFiMDIKKzAsICAgICAxMDAzNTIsICAgICAxMDAzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMTcwMTRlOAorMCwgICAgIDEwMTM3NiwgICAgIDEwMTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDJjOTBmZjU5CiswLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODhmNzFlYjIKKzAsICAgICAxMDM0MjQsICAgICAxMDM0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZWQ4MDZlMAorMCwgICAgIDEwNDQ0OCwgICAgIDEwNDQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3OGRmOTFiCiswLCAgICAgMTA1NDcyLCAgICAgMTA1NDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzI3OGYxOGIKKzAsICAgICAxMDY0OTYsICAgICAxMDY0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNDU3Y2I3ZgorMCwgICAgIDEwNzUyMCwgICAgIDEwNzUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg3YTYwODFhCiswLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWYxNTA3NWMKKzAsICAgICAxMDk1NjgsICAgICAxMDk1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZjRmMDc2ZQorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg0NjNmMmJiCiswLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWNhNmY4NjkKKzAsICAgICAxMTI2NDAsICAgICAxMTI2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwOTlhMDM5OAorMCwgICAgIDExMzY2NCwgICAgIDExMzY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE3ZmExMGYwCiswLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjhjYWRkZDMKKzAsICAgICAxMTU3MTIsICAgICAxMTU3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ODUyZWY4YgorMCwgICAgIDExNjczNiwgICAgIDExNjczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAyNTBlZTdiCiswLCAgICAgMTE3NzYwLCAgICAgMTE3NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTU4M2RhMjEKKzAsICAgICAxMTg3ODQsICAgICAxMTg3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MzY1ZmIzMworMCwgICAgIDExOTgwOCwgICAgIDExOTgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4YzgyMDY2CiswLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTQ2NTBiZTQKKzAsICAgICAxMjE4NTYsICAgICAxMjE4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjIxZjhlYgorMCwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNkODhmNDU1CiswLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjZhOWVmYWYKKzAsICAgICAxMjQ5MjgsICAgICAxMjQ5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NTAwYzZlZAorMCwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBlZTBjNjJkCiswLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzRkMzA3NjIKKzAsICAgICAxMjgwMDAsICAgICAxMjgwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YzBkZWM5ZgorMCwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc5MDAxMWQ4CiswLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yjc2YTExMzYKKzAsICAgICAxMzEwNzIsICAgICAxMzEwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZGRkZmVhNworMCwgICAgIDEzMjA5NiwgICAgIDEzMjA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmYTNlZDQ5CiswLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzEyOWY1NGUKKzAsICAgICAxMzQxNDQsICAgICAxMzQxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YTg2ZjA3NworMCwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM5ZWVmMjA5CiswLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzJkNDAyOWIKKzAsICAgICAxMzcyMTYsICAgICAxMzcyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZWMyMDU5MAorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0OGYxOGVkCiswLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDgwN2VhZGMKKzAsICAgICAxNDAyODgsICAgICAxNDAyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZTJiZWEwOQorMCwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkzN2FmMTJlCiswLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGVkYmYzMDMKKzAsICAgICAxNDMzNjAsICAgICAxNDMzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYzc1ZGY4OAorMCwgICAgIDE0NDM4NCwgICAgIDE0NDM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NDVmZmQ2CiswLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjBlODE1MGMKKzAsICAgICAxNDY0MzIsICAgICAxNDY0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZWE3ZWVlZgorMCwgICAgIDE0NzQ1NiwgICAgIDE0NzQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRjN2VmYTIxCiswLCAgICAgMTQ4NDgwLCAgICAgMTQ4NDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5N2UzMGUKKzAsICAgICAxNDk1MDQsICAgICAxNDk1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNTA0MDIyOAorMCwgICAgIDE1MDUyOCwgICAgIDE1MDUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyODNmNzhjCiswLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTcxMDAxNDAKKzAsICAgICAxNTI1NzYsICAgICAxNTI1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZWE2ZjliMgorMCwgICAgIDE1MzYwMCwgICAgIDE1MzYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmMGUxNTYzCiswLCAgICAgMTU0NjI0LCAgICAgMTU0NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTEwYmYxOGUKKzAsICAgICAxNTU2NDgsICAgICAxNTU2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZjRmZTQyNQorMCwgICAgIDE1NjY3MiwgICAgIDE1NjY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwN2FmM2MwCiswLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmYxNGRkYzYKKzAsICAgICAxNTg3MjAsICAgICAxNTg3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODcxZWQ2OQorMCwgICAgIDE1OTc0NCwgICAgIDE1OTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMzNDllZjlmCiswLCAgICAgMTYwNzY4LCAgICAgMTYwNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGUyYzE4MzQKKzAsICAgICAxNjE3OTIsICAgICAxNjE3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzgzZmUwNAorMCwgICAgIDE2MjgxNiwgICAgIDE2MjgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY2MjZmNDE1CiswLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjgzYmUzNzkKKzAsICAgICAxNjQ4NjQsICAgICAxNjQ4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNzZjMGNlYgorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEwYjgwNDBmCiswLCAgICAgMTY2OTEyLCAgICAgMTY2OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjUzNWViNmQKKzAsICAgICAxNjc5MzYsICAgICAxNjc5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjE4MGJiNQorMCwgICAgIDE2ODk2MCwgICAgIDE2ODk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJjNWNmMDU5CiswLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg2MmYxYWMKKzAsICAgICAxNzEwMDgsICAgICAxNzEwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5Y2MyZWEyYgorMCwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJiOWFlNzU0CiswLCAgICAgMTczMDU2LCAgICAgMTczMDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzE2ZGViYjUKKzAsICAgICAxNzQwODAsICAgICAxNzQwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZjNhZmYyYQorMCwgICAgIDE3NTEwNCwgICAgIDE3NTEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1NWRmYTVjCiswLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2I4MzA2MDUKKzAsICAgICAxNzcxNTIsICAgICAxNzcxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDMwZGM5ZQorMCwgICAgIDE3ODE3NiwgICAgIDE3ODE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMTdmZDU0CiswLCAgICAgMTc5MjAwLCAgICAgMTc5MjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM3ZGZhMmUKKzAsICAgICAxODAyMjQsICAgICAxODAyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODg3ZTU5OQorMCwgICAgIDE4MTI0OCwgICAgIDE4MTI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3MzBlNzJmCiswLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmJiM2ZhZTQKKzAsICAgICAxODMyOTYsICAgICAxODMyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYzA4ZmMzNgorMCwgICAgIDE4NDMyMCwgICAgIDE4NDMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhZmQ5ZWMyCiswLCAgICAgMTg1MzQ0LCAgICAgMTg1MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTFkM2U4M2QKKzAsICAgICAxODYzNjgsICAgICAxODYzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3Zjk2MDEzYworMCwgICAgIDE4NzM5MiwgICAgIDE4NzM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhMGFmZTMxCiswLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTM3ZDE3MDEKKzAsICAgICAxODk0NDAsICAgICAxODk0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjE1ZWJjMgorMCwgICAgIDE5MDQ2NCwgICAgIDE5MDQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxNzAwNWMxCiswLCAgICAgMTkxNDg4LCAgICAgMTkxNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTc1NWY3ODkKKzAsICAgICAxOTI1MTIsICAgICAxOTI1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4M2U2ZGI2NQorMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyYWIxNDQ3CiswLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWRiZGYzODMKKzAsICAgICAxOTU1ODQsICAgICAxOTU1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzE2ZjZhOQorMCwgICAgIDE5NjYwOCwgICAgIDE5NjYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhNmEwYjRjCiswLCAgICAgMTk3NjMyLCAgICAgMTk3NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZkODA5YjcKKzAsICAgICAxOTg2NTYsICAgICAxOTg2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZDJjZjVmMQorMCwgICAgIDE5OTY4MCwgICAgIDE5OTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzNjZmNGExCiswLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmEyZjg2ZTAKKzAsICAgICAyMDE3MjgsICAgICAyMDE3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNTFmMDhhOQorMCwgICAgIDIwMjc1MiwgICAgIDIwMjc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1ZWRlZmE4CiswLCAgICAgMjAzNzc2LCAgICAgMjAzNzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjU1ZGYyYTYKKzAsICAgICAyMDQ4MDAsICAgICAyMDQ4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlODgxZDllNAorMCwgICAgIDIwNTgyNCwgICAgIDIwNTgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwMzgwNTIzCiswLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5M2ViMjYKKzAsICAgICAyMDc4NzIsICAgICAyMDc4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTljZjk0YworMCwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg0NzRmNTkxCiswLCAgICAgMjA5OTIwLCAgICAgMjA5OTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAzMGRjOWUKKzAsICAgICAyMTA5NDQsICAgICAyMTA5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDE3ZmQ1NAorMCwgICAgIDIxMTk2OCwgICAgIDIxMTk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjN2RmYTJlCiswLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzg4N2U1OTkKKzAsICAgICAyMTQwMTYsICAgICAyMTQwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzMwZTcyZgorMCwgICAgIDIxNTA0MCwgICAgIDIxNTA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiYjNmYWU0CiswLCAgICAgMjE2MDY0LCAgICAgMjE2MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2MwOGZjMzYKKzAsICAgICAyMTcwODgsICAgICAyMTcwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWZkOWVjMgorMCwgICAgIDIxODExMiwgICAgIDIxODExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGExZDNlODNkCiswLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2Y5NjAxM2MKKzAsICAgICAyMjAxNjAsICAgICAyMjAxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YTBhZmUzMQorMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzN2QxNzAxCiswLCAgICAgMjIyMjA4LCAgICAgMjIyMjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxNWViYzIKKzAsICAgICAyMjMyMzIsICAgICAyMjMyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTcwMDVjMQorMCwgICAgIDIyNDI1NiwgICAgIDIyNDI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE3NTVmNzg5CiswLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODNlNmRiNjUKKzAsICAgICAyMjYzMDQsICAgICAyMjYzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MmFiMTQ0NworMCwgICAgIDIyNzMyOCwgICAgIDIyNzMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkYmRmMzgzCiswLCAgICAgMjI4MzUyLCAgICAgMjI4MzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMxNmY2YTkKKzAsICAgICAyMjkzNzYsICAgICAyMjkzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTZhMGI0YworMCwgICAgIDIzMDQwMCwgICAgIDIzMDQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmZDgwOWI3CiswLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQyY2Y1ZjEKKzAsICAgICAyMzI0NDgsICAgICAyMzI0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMzY2ZjRhMQorMCwgICAgIDIzMzQ3MiwgICAgIDIzMzQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhMmY4NmUwCiswLCAgICAgMjM0NDk2LCAgICAgMjM0NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjUxZjA4YTkKKzAsICAgICAyMzU1MjAsICAgICAyMzU1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNWVkZWZhOAorMCwgICAgIDIzNjU0NCwgICAgIDIzNjU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1NWRmMmE2CiswLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTg4MWQ5ZTQKKzAsICAgICAyMzg1OTIsICAgICAyMzg1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDM4MDUyMworMCwgICAgIDIzOTYxNiwgICAgIDIzOTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiOTNlYjI2CiswLCAgICAgMjQwNjQwLCAgICAgMjQwNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU5Y2Y5NGMKKzAsICAgICAyNDE2NjQsICAgICAyNDE2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NDc0ZjU5MQorMCwgICAgIDI0MjY4OCwgICAgIDI0MjY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMzBkYzllCiswLCAgICAgMjQzNzEyLCAgICAgMjQzNzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAxN2ZkNTQKKzAsICAgICAyNDQ3MzYsICAgICAyNDQ3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzdkZmEyZQorMCwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4ODdlNTk5CiswLCAgICAgMjQ2Nzg0LCAgICAgMjQ2Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjczMGU3MmYKKzAsICAgICAyNDc4MDgsICAgICAyNDc4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YmIzZmFlNAorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjMDhmYzM2CiswLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFmZDllYzIKKzAsICAgICAyNTA4ODAsICAgICAyNTA4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMWQzZTgzZAorMCwgICAgIDI1MTkwNCwgICAgIDI1MTkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmOTYwMTNjCiswLCAgICAgMjUyOTI4LCAgICAgMjUyOTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2EwYWZlMzEKKzAsICAgICAyNTM5NTIsICAgICAyNTM5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMzdkMTcwMQorMCwgICAgIDI1NDk3NiwgICAgIDI1NDk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2MTVlYmMyCiswLCAgICAgMjU2MDAwLCAgICAgMjU2MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjE3MDA1YzEKKzAsICAgICAyNTcwMjQsICAgICAyNTcwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzU1Zjc4OQorMCwgICAgIDI1ODA0OCwgICAgIDI1ODA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzZTZkYjY1CiswLCAgICAgMjU5MDcyLCAgICAgMjU5MDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJhYjE0NDcKKzAsICAgICAyNjAwOTYsICAgICAyNjAwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZGJkZjM4MworMCwgICAgIDI2MTEyMCwgICAgIDI2MTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzMTZmNmE5CiswLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE2YTBiNGMKKzAsICAgICAyNjMxNjgsICAgICAyNjMxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmQ4MDliNworMCwgICAgIDI2NDE5MiwgICAgIDI2NDE5MiwgICAgICA0MDgsICAgICAxNjMyLCAweGY0MTIzMTNlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtcXNpbiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hZmFkZS1xc2luCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNmZiYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWZhZGUtcXNpbgpAQCAtMCwwICsxLDI2NSBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOTc3Y2UwZgorMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkzMzNmNWIxCiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjFhMzA3OTQKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZmIxZjdhZgorMCwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDljMGJlNzNmCiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTc3YWYyMzEKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MGFlMDYwMAorMCwgICAgICAgNzE2OCwgICAgICAgNzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdlY2ZmOGQxCiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTFhMWVjMGYKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNmYyZTRlYgorMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg3NWQwMWJjCiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTZhNWVkZWYKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYWRlZmY4MQorMCwgICAgICAxMzMxMiwgICAgICAxMzMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxOThlZmU3CiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjY2NmY4ZTMKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYzE3MDJlNAorMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNlMzJmYTFmCiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzZlZmY1YzcKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYTc1ZWMzOQorMCwgICAgICAxOTQ1NiwgICAgICAxOTQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNhZWVmOTg3CiswLCAgICAgIDIwNDgwLCAgICAgIDIwNDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzExZjAwOTAKKzAsICAgICAgMjE1MDQsICAgICAgMjE1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNDAwMDJhZQorMCwgICAgICAyMjUyOCwgICAgICAyMjUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM5MGVmMTAxCiswLCAgICAgIDIzNTUyLCAgICAgIDIzNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTU5OWZmNmIKKzAsICAgICAgMjQ1NzYsICAgICAgMjQ1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDU0ZWRlZgorMCwgICAgICAyNTYwMCwgICAgICAyNTYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjOTkxMTc4CiswLCAgICAgIDI2NjI0LCAgICAgIDI2NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2U2OWYzZGIKKzAsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYzcyZjg3MQorMCwgICAgICAyODY3MiwgICAgICAyODY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1MWFmMzg1CiswLCAgICAgIDI5Njk2LCAgICAgIDI5Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzhjYjAwMzgKKzAsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMzc2MGExMAorMCwgICAgICAzMTc0NCwgICAgICAzMTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc3YmFlZjUxCiswLCAgICAgIDMyNzY4LCAgICAgIDMyNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGY5Y2VjODUKKzAsICAgICAgMzM3OTIsICAgICAgMzM3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNzhmZjhhMworMCwgICAgICAzNDgxNiwgICAgICAzNDgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhNTUwZjdjCiswLCAgICAgIDM1ODQwLCAgICAgIDM1ODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTIyZWVmNjEKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NzM4ZTg3OQorMCwgICAgICAzNzg4OCwgICAgICAzNzg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhY2NmNTRmCiswLCAgICAgIDM4OTEyLCAgICAgIDM4OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWNlZWYyZDMKKzAsICAgICAgMzk5MzYsICAgICAgMzk5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhY2QzZTg4NQorMCwgICAgICA0MDk2MCwgICAgICA0MDk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkMThlNTAzCiswLCAgICAgIDQxOTg0LCAgICAgIDQxOTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTVjNWY4NWQKKzAsICAgICAgNDMwMDgsICAgICAgNDMwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0Zjc1MDQ5ZQorMCwgICAgICA0NDAzMiwgICAgICA0NDAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwMTdlMDIxCiswLCAgICAgIDQ1MDU2LCAgICAgIDQ1MDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTUyZTA1ODAKKzAsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMDE2MTNiYQorMCwgICAgICA0NzEwNCwgICAgICA0NzEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDEzMWVlYmVmCiswLCAgICAgIDQ4MTI4LCAgICAgIDQ4MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTdmM2UxZWYKKzAsICAgICAgNDkxNTIsICAgICAgNDkxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNmQwZWQwYgorMCwgICAgICA1MDE3NiwgICAgICA1MDE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUyNGIwMzAwCiswLCAgICAgIDUxMjAwLCAgICAgIDUxMjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGQzOWMwMTEKKzAsICAgICAgNTIyMjQsICAgICAgNTIyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkN2ZmMTEyNgorMCwgICAgICA1MzI0OCwgICAgICA1MzI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYwMTllZDIxCiswLCAgICAgIDU0MjcyLCAgICAgIDU0MjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzcxZjFhODQKKzAsICAgICAgNTUyOTYsICAgICAgNTUyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTVlZjU5NQorMCwgICAgICA1NjMyMCwgICAgICA1NjMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDljNTNlYjZiCiswLCAgICAgIDU3MzQ0LCAgICAgIDU3MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGE5NWYyZTUKKzAsICAgICAgNTgzNjgsICAgICAgNTgzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YzYzMTI5NgorMCwgICAgICA1OTM5MiwgICAgICA1OTM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI2YTBmYmViCiswLCAgICAgIDYwNDE2LCAgICAgIDYwNDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzRiYmY4MzUKKzAsICAgICAgNjE0NDAsICAgICAgNjE0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTM2ZjM3ZgorMCwgICAgICA2MjQ2NCwgICAgICA2MjQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFlYWMwMmEwCiswLCAgICAgIDYzNDg4LCAgICAgIDYzNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmM1Y2Q3YzUKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNDI3ZWE4NQorMCwgICAgICA2NTUzNiwgICAgICA2NTUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwNzAwM2E2CiswLCAgICAgIDY2NTYwLCAgICAgIDY2NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzM5ZWY4YzcKKzAsICAgICAgNjc1ODQsICAgICAgNjc1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ODM5ZjJhOQorMCwgICAgICA2ODYwOCwgICAgICA2ODYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3NjMwMzMwCiswLCAgICAgIDY5NjMyLCAgICAgIDY5NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDI1NzBiNGUKKzAsICAgICAgNzA2NTYsICAgICAgNzA2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMmE1ZTM4MQorMCwgICAgICA3MTY4MCwgICAgICA3MTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJlOTQxMTA0CiswLCAgICAgIDcyNzA0LCAgICAgIDcyNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWZlZWYwZWIKKzAsICAgICAgNzM3MjgsICAgICAgNzM3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NTEzZWFkNQorMCwgICAgICA3NDc1MiwgICAgICA3NDc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA0NWFlYjY5CiswLCAgICAgIDc1Nzc2LCAgICAgIDc1Nzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWQ2ZjEwNDIKKzAsICAgICAgNzY4MDAsICAgICAgNzY4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNzk2MDRhMgorMCwgICAgICA3NzgyNCwgICAgICA3NzgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzN2RlZGIzCiswLCAgICAgIDc4ODQ4LCAgICAgIDc4ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjY2YmZhOTUKKzAsICAgICAgNzk4NzIsICAgICAgNzk4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1M2IxMDMwOAorMCwgICAgICA4MDg5NiwgICAgICA4MDg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFlMDlmYmI3CiswLCAgICAgIDgxOTIwLCAgICAgIDgxOTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmE4NTJiODAKKzAsICAgICAgODI5NDQsICAgICAgODI5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NmZlMmJiMgorMCwgICAgICA4Mzk2OCwgICAgICA4Mzk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJkNWZmZjQ5CiswLCAgICAgIDg0OTkyLCAgICAgIDg0OTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDBkYzAxMzYKKzAsICAgICAgODYwMTYsICAgICAgODYwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ODNlMDUyMgorMCwgICAgICA4NzA0MCwgICAgICA4NzA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1NmUxNTk2CiswLCAgICAgIDg4MDY0LCAgICAgIDg4MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWIxYWM4YjcKKzAsICAgICAgODkwODgsICAgICAgODkwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNjhkZGE4ZgorMCwgICAgICA5MDExMiwgICAgICA5MDExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU0NTdiNTA1CiswLCAgICAgIDkxMTM2LCAgICAgIDkxMTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGEyNWE0MDkKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YjVkOWQzYgorMCwgICAgICA5MzE4NCwgICAgICA5MzE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE2MWViMTNkCiswLCAgICAgIDk0MjA4LCAgICAgIDk0MjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWM5M2I2NmYKKzAsICAgICAgOTUyMzIsICAgICAgOTUyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjN2FlYjMzZgorMCwgICAgICA5NjI1NiwgICAgICA5NjI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUyY2NjZmI1CiswLCAgICAgIDk3MjgwLCAgICAgIDk3MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGU0Y2Y0ODcKKzAsICAgICAgOTgzMDQsICAgICAgOTgzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOWMwN2YzNQorMCwgICAgICA5OTMyOCwgICAgICA5OTMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYzZWNkMzRmCiswLCAgICAgMTAwMzUyLCAgICAgMTAwMzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTIyYWVjNTMKKzAsICAgICAxMDEzNzYsICAgICAxMDEzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NTgxYzBhZAorMCwgICAgIDEwMjQwMCwgICAgIDEwMjQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY0MGVkYjE1CiswLCAgICAgMTAzNDI0LCAgICAgMTAzNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWQ2NmM2NmYKKzAsICAgICAxMDQ0NDgsICAgICAxMDQ0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNjllOWQzNQorMCwgICAgIDEwNTQ3MiwgICAgIDEwNTQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjOWZkMGU5CiswLCAgICAgMTA2NDk2LCAgICAgMTA2NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzI0Njg2NjcKKzAsICAgICAxMDc1MjAsICAgICAxMDc1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZTZkZDAyYgorMCwgICAgIDEwODU0NCwgICAgIDEwODU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkzZWRjZTMzCiswLCAgICAgMTA5NTY4LCAgICAgMTA5NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2RmYmQ1MTkKKzAsICAgICAxMTA1OTIsICAgICAxMTA1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NDYzZjJiYgorMCwgICAgIDExMTYxNiwgICAgIDExMTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjYTZmODY5CiswLCAgICAgMTEyNjQwLCAgICAgMTEyNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDk5YTAzOTgKKzAsICAgICAxMTM2NjQsICAgICAxMTM2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhN2ZhMTBmMAorMCwgICAgIDExNDY4OCwgICAgIDExNDY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4Y2FkZGQzCiswLCAgICAgMTE1NzEyLCAgICAgMTE1NzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDg1MmVmOGIKKzAsICAgICAxMTY3MzYsICAgICAxMTY3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMjUwZWU3YgorMCwgICAgIDExNzc2MCwgICAgIDExNzc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk1ODNkYTIxCiswLCAgICAgMTE4Nzg0LCAgICAgMTE4Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzM2NWZiMzMKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOGM4MjA2NgorMCwgICAgIDEyMDgzMiwgICAgIDEyMDgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk0NjUwYmU0CiswLCAgICAgMTIxODU2LCAgICAgMTIxODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWIyMWY4ZWIKKzAsICAgICAxMjI4ODAsICAgICAxMjI4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDg4ZjQ1NQorMCwgICAgIDEyMzkwNCwgICAgIDEyMzkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY2YTllZmFmCiswLCAgICAgMTI0OTI4LCAgICAgMTI0OTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTUwMGM2ZWQKKzAsICAgICAxMjU5NTIsICAgICAxMjU5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZWUwYzYyZAorMCwgICAgIDEyNjk3NiwgICAgIDEyNjk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDM0ZDMwNzYyCiswLCAgICAgMTI4MDAwLCAgICAgMTI4MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGMwZGVjOWYKKzAsICAgICAxMjkwMjQsICAgICAxMjkwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3OTAwMTFkOAorMCwgICAgIDEzMDA0OCwgICAgIDEzMDA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3NmExMTM2CiswLCAgICAgMTMxMDcyLCAgICAgMTMxMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2RkZGZlYTcKKzAsICAgICAxMzIwOTYsICAgICAxMzIwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmEzZWQ0OQorMCwgICAgIDEzMzEyMCwgICAgIDEzMzEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxMjlmNTRlCiswLCAgICAgMTM0MTQ0LCAgICAgMTM0MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWE4NmYwNzcKKzAsICAgICAxMzUxNjgsICAgICAxMzUxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjOWVlZjIwOQorMCwgICAgIDEzNjE5MiwgICAgIDEzNjE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcyZDQwMjliCiswLCAgICAgMTM3MjE2LCAgICAgMTM3MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGVjMjA1OTAKKzAsICAgICAxMzgyNDAsICAgICAxMzgyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNDhmMThlZAorMCwgICAgIDEzOTI2NCwgICAgIDEzOTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ4MDdlYWRjCiswLCAgICAgMTQwMjg4LCAgICAgMTQwMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWUyYmVhMDkKKzAsICAgICAxNDEzMTIsICAgICAxNDEzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MzdhZjEyZQorMCwgICAgIDE0MjMzNiwgICAgIDE0MjMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRlZGJmMzAzCiswLCAgICAgMTQzMzYwLCAgICAgMTQzMzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGM3NWRmODgKKzAsICAgICAxNDQzODQsICAgICAxNDQzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODQ1ZmZkNgorMCwgICAgIDE0NTQwOCwgICAgIDE0NTQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwZTgxNTBjCiswLCAgICAgMTQ2NDMyLCAgICAgMTQ2NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWVhN2VlZWYKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YzdlZmEyMQorMCwgICAgIDE0ODQ4MCwgICAgIDE0ODQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiOTdlMzBlCiswLCAgICAgMTQ5NTA0LCAgICAgMTQ5NTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTUwNDAyMjgKKzAsICAgICAxNTA1MjgsICAgICAxNTA1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MjgzZjc4YworMCwgICAgIDE1MTU1MiwgICAgIDE1MTU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU3MTAwMTQwCiswLCAgICAgMTUyNTc2LCAgICAgMTUyNTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWVhNmY5YjIKKzAsICAgICAxNTM2MDAsICAgICAxNTM2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZjBlMTU2MworMCwgICAgIDE1NDYyNCwgICAgIDE1NDYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUxMGJmMThlCiswLCAgICAgMTU1NjQ4LCAgICAgMTU1NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWY0ZmU0MjUKKzAsICAgICAxNTY2NzIsICAgICAxNTY2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDdhZjNjMAorMCwgICAgIDE1NzY5NiwgICAgIDE1NzY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmMTRkZGM2CiswLCAgICAgMTU4NzIwLCAgICAgMTU4NzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg3MWVkNjkKKzAsICAgICAxNTk3NDQsICAgICAxNTk3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMzQ5ZWY5ZgorMCwgICAgIDE2MDc2OCwgICAgIDE2MDc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlMmMxODM0CiswLCAgICAgMTYxNzkyLCAgICAgMTYxNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjM4M2ZlMDQKKzAsICAgICAxNjI4MTYsICAgICAxNjI4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NjI2ZjQxNQorMCwgICAgIDE2Mzg0MCwgICAgIDE2Mzg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4M2JlMzc5CiswLCAgICAgMTY0ODY0LCAgICAgMTY0ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzc2YzBjZWIKKzAsICAgICAxNjU4ODgsICAgICAxNjU4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMGI4MDQwZgorMCwgICAgIDE2NjkxMiwgICAgIDE2NjkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1MzVlYjZkCiswLCAgICAgMTY3OTM2LCAgICAgMTY3OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWIxODBiYjUKKzAsICAgICAxNjg5NjAsICAgICAxNjg5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYzVjZjA1OQorMCwgICAgIDE2OTk4NCwgICAgIDE2OTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NjJmMWFjCiswLCAgICAgMTcxMDA4LCAgICAgMTcxMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWNjMmVhMmIKKzAsICAgICAxNzIwMzIsICAgICAxNzIwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYjlhZTc1NAorMCwgICAgIDE3MzA1NiwgICAgIDE3MzA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxNmRlYmI1CiswLCAgICAgMTc0MDgwLCAgICAgMTc0MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmYzYWZmMmEKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTVkZmE1YworMCwgICAgIDE3NjEyOCwgICAgIDE3NjEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiODMwNjA1CiswLCAgICAgMTc3MTUyLCAgICAgMTc3MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAzMGRjOWUKKzAsICAgICAxNzgxNzYsICAgICAxNzgxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDE3ZmQ1NAorMCwgICAgIDE3OTIwMCwgICAgIDE3OTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjN2RmYTJlCiswLCAgICAgMTgwMjI0LCAgICAgMTgwMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzg4N2U1OTkKKzAsICAgICAxODEyNDgsICAgICAxODEyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzMwZTcyZgorMCwgICAgIDE4MjI3MiwgICAgIDE4MjI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiYjNmYWU0CiswLCAgICAgMTgzMjk2LCAgICAgMTgzMjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2MwOGZjMzYKKzAsICAgICAxODQzMjAsICAgICAxODQzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWZkOWVjMgorMCwgICAgIDE4NTM0NCwgICAgIDE4NTM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGExZDNlODNkCiswLCAgICAgMTg2MzY4LCAgICAgMTg2MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2Y5NjAxM2MKKzAsICAgICAxODczOTIsICAgICAxODczOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YTBhZmUzMQorMCwgICAgIDE4ODQxNiwgICAgIDE4ODQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzN2QxNzAxCiswLCAgICAgMTg5NDQwLCAgICAgMTg5NDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxNWViYzIKKzAsICAgICAxOTA0NjQsICAgICAxOTA0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTcwMDVjMQorMCwgICAgIDE5MTQ4OCwgICAgIDE5MTQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE3NTVmNzg5CiswLCAgICAgMTkyNTEyLCAgICAgMTkyNTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODNlNmRiNjUKKzAsICAgICAxOTM1MzYsICAgICAxOTM1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MmFiMTQ0NworMCwgICAgIDE5NDU2MCwgICAgIDE5NDU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkYmRmMzgzCiswLCAgICAgMTk1NTg0LCAgICAgMTk1NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMxNmY2YTkKKzAsICAgICAxOTY2MDgsICAgICAxOTY2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTZhMGI0YworMCwgICAgIDE5NzYzMiwgICAgIDE5NzYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmZDgwOWI3CiswLCAgICAgMTk4NjU2LCAgICAgMTk4NjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQyY2Y1ZjEKKzAsICAgICAxOTk2ODAsICAgICAxOTk2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMzY2ZjRhMQorMCwgICAgIDIwMDcwNCwgICAgIDIwMDcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhMmY4NmUwCiswLCAgICAgMjAxNzI4LCAgICAgMjAxNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjUxZjA4YTkKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNWVkZWZhOAorMCwgICAgIDIwMzc3NiwgICAgIDIwMzc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1NWRmMmE2CiswLCAgICAgMjA0ODAwLCAgICAgMjA0ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTg4MWQ5ZTQKKzAsICAgICAyMDU4MjQsICAgICAyMDU4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDM4MDUyMworMCwgICAgIDIwNjg0OCwgICAgIDIwNjg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiOTNlYjI2CiswLCAgICAgMjA3ODcyLCAgICAgMjA3ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU5Y2Y5NGMKKzAsICAgICAyMDg4OTYsICAgICAyMDg4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NDc0ZjU5MQorMCwgICAgIDIwOTkyMCwgICAgIDIwOTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMzBkYzllCiswLCAgICAgMjEwOTQ0LCAgICAgMjEwOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAxN2ZkNTQKKzAsICAgICAyMTE5NjgsICAgICAyMTE5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzdkZmEyZQorMCwgICAgIDIxMjk5MiwgICAgIDIxMjk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4ODdlNTk5CiswLCAgICAgMjE0MDE2LCAgICAgMjE0MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjczMGU3MmYKKzAsICAgICAyMTUwNDAsICAgICAyMTUwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YmIzZmFlNAorMCwgICAgIDIxNjA2NCwgICAgIDIxNjA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjMDhmYzM2CiswLCAgICAgMjE3MDg4LCAgICAgMjE3MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFmZDllYzIKKzAsICAgICAyMTgxMTIsICAgICAyMTgxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMWQzZTgzZAorMCwgICAgIDIxOTEzNiwgICAgIDIxOTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmOTYwMTNjCiswLCAgICAgMjIwMTYwLCAgICAgMjIwMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2EwYWZlMzEKKzAsICAgICAyMjExODQsICAgICAyMjExODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMzdkMTcwMQorMCwgICAgIDIyMjIwOCwgICAgIDIyMjIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2MTVlYmMyCiswLCAgICAgMjIzMjMyLCAgICAgMjIzMjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjE3MDA1YzEKKzAsICAgICAyMjQyNTYsICAgICAyMjQyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzU1Zjc4OQorMCwgICAgIDIyNTI4MCwgICAgIDIyNTI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzZTZkYjY1CiswLCAgICAgMjI2MzA0LCAgICAgMjI2MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJhYjE0NDcKKzAsICAgICAyMjczMjgsICAgICAyMjczMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZGJkZjM4MworMCwgICAgIDIyODM1MiwgICAgIDIyODM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzMTZmNmE5CiswLCAgICAgMjI5Mzc2LCAgICAgMjI5Mzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE2YTBiNGMKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmQ4MDliNworMCwgICAgIDIzMTQyNCwgICAgIDIzMTQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFkMmNmNWYxCiswLCAgICAgMjMyNDQ4LCAgICAgMjMyNDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDM2NmY0YTEKKzAsICAgICAyMzM0NzIsICAgICAyMzM0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YTJmODZlMAorMCwgICAgIDIzNDQ5NiwgICAgIDIzNDQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY1MWYwOGE5CiswLCAgICAgMjM1NTIwLCAgICAgMjM1NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDVlZGVmYTgKKzAsICAgICAyMzY1NDQsICAgICAyMzY1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTVkZjJhNgorMCwgICAgIDIzNzU2OCwgICAgIDIzNzU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU4ODFkOWU0CiswLCAgICAgMjM4NTkyLCAgICAgMjM4NTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTAzODA1MjMKKzAsICAgICAyMzk2MTYsICAgICAyMzk2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YjkzZWIyNgorMCwgICAgIDI0MDY0MCwgICAgIDI0MDY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1OWNmOTRjCiswLCAgICAgMjQxNjY0LCAgICAgMjQxNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODQ3NGY1OTEKKzAsICAgICAyNDI2ODgsICAgICAyNDI2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDMwZGM5ZQorMCwgICAgIDI0MzcxMiwgICAgIDI0MzcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMTdmZDU0CiswLCAgICAgMjQ0NzM2LCAgICAgMjQ0NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM3ZGZhMmUKKzAsICAgICAyNDU3NjAsICAgICAyNDU3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODg3ZTU5OQorMCwgICAgIDI0Njc4NCwgICAgIDI0Njc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3MzBlNzJmCiswLCAgICAgMjQ3ODA4LCAgICAgMjQ3ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmJiM2ZhZTQKKzAsICAgICAyNDg4MzIsICAgICAyNDg4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYzA4ZmMzNgorMCwgICAgIDI0OTg1NiwgICAgIDI0OTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhZmQ5ZWMyCiswLCAgICAgMjUwODgwLCAgICAgMjUwODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTFkM2U4M2QKKzAsICAgICAyNTE5MDQsICAgICAyNTE5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3Zjk2MDEzYworMCwgICAgIDI1MjkyOCwgICAgIDI1MjkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhMGFmZTMxCiswLCAgICAgMjUzOTUyLCAgICAgMjUzOTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTM3ZDE3MDEKKzAsICAgICAyNTQ5NzYsICAgICAyNTQ5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjE1ZWJjMgorMCwgICAgIDI1NjAwMCwgICAgIDI1NjAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxNzAwNWMxCiswLCAgICAgMjU3MDI0LCAgICAgMjU3MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTc1NWY3ODkKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4M2U2ZGI2NQorMCwgICAgIDI1OTA3MiwgICAgIDI1OTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyYWIxNDQ3CiswLCAgICAgMjYwMDk2LCAgICAgMjYwMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWRiZGYzODMKKzAsICAgICAyNjExMjAsICAgICAyNjExMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzE2ZjZhOQorMCwgICAgIDI2MjE0NCwgICAgIDI2MjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhNmEwYjRjCiswLCAgICAgMjYzMTY4LCAgICAgMjYzMTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZkODA5YjcKKzAsICAgICAyNjQxOTIsICAgICAyNjQxOTIsICAgICAgNDA4LCAgICAgMTYzMiwgMHhmNDEyMzEzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFnYXRlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFnYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZTczMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWdhdGUKQEAgLTAsMCArMSwyNjUgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWFmMjAwOTAKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYjA1ZWYyZAorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU3NGJmMTFkCiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzc0YWY1ZDMKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YjUxZmYzMworMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY2MTBmOWJmCiswLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2MyMGVmNzkKKzAsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MjdiZWY1OQorMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg3NzNmYTk5CiswLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmYxZGZlODkKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjJkZjRkZAorMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDExNzBmMTY5CiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2I5Y2Y2MzMKKzAsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZThjMDFkYQorMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkzYzIwMmQwCiswLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDg4MmVjNmQKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwM2ZiZWM2ZAorMCwgICAgICAxNzQwOCwgICAgICAxNzQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDczZjQwMGQ0CiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWE4YzAxZGEKKzAsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyM2NiZjgyZgorMCwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg1Y2RmMTY5CiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGUyN2YyZTEKKzAsICAgICAgMjI1MjgsICAgICAgMjI1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MWJmZmU4OQorMCwgICAgICAyMzU1MiwgICAgICAyMzU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGMzMWFmZDk1CiswLCAgICAgIDI0NTc2LCAgICAgIDI0NTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWMyM2VlNTkKKzAsICAgICAgMjU2MDAsICAgICAgMjU2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1OGQwZWY3OQorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZjY2ZmN2MzCiswLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzA4NGZmMzMKKzAsICAgICAgMjg2NzIsICAgICAgMjg2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZjFiZjdjZgorMCwgICAgICAyOTY5NiwgICAgICAyOTY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgwMzdmMTFkCiswLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDEwNmVkMzEKKzAsICAgICAgMzE3NDQsICAgICAgMzE3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZjgyMDA5MAorMCwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhZjIwMDkwCiswLCAgICAgIDMzNzkyLCAgICAgIDMzNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGIwNWVmMmQKKzAsICAgICAgMzQ4MTYsICAgICAgMzQ4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NzRiZjExZAorMCwgICAgICAzNTg0MCwgICAgICAzNTg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc3NGFmNWQzCiswLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2I1MWZmMzMKKzAsICAgICAgMzc4ODgsICAgICAgMzc4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNjEwZjliZgorMCwgICAgICAzODkxMiwgICAgICAzODkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNjMjBlZjc5CiswLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDI3YmVmNTkKKzAsICAgICAgNDA5NjAsICAgICAgNDA5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NzczZmE5OQorMCwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmMWRmZTg5CiswLCAgICAgIDQzMDA4LCAgICAgIDQzMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYyZGY0ZGQKKzAsICAgICAgNDQwMzIsICAgICAgNDQwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MTY1MDQ3MgorMCwgICAgICA0NTA1NiwgICAgICA0NTA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDEwODFmMTMzCiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWRhM2U1OGIKKzAsICAgICAgNDcxMDQsICAgICAgNDcxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTI2MTRhYworMCwgICAgICA0ODEyOCwgICAgICA0ODEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBmMjMwMzRjCiswLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzY4ZmU4YTEKKzAsICAgICAgNTAxNzYsICAgICAgNTAxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMGY5MDc5ZQorMCwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg1NDNlZDkzCiswLCAgICAgIDUyMjI0LCAgICAgIDUyMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWY5NmZlOWQKKzAsICAgICAgNTMyNDgsICAgICAgNTMyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NGYzZmFjZgorMCwgICAgICA1NDI3MiwgICAgICA1NDI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGMwZGVmZTRkCiswLCAgICAgIDU1Mjk2LCAgICAgIDU1Mjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGUyMmY1ZmYKKzAsICAgICAgNTYzMjAsICAgICAgNTYzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNjA0ZWQ3ZAorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI2NDAwMTI0CiswLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWRhZGY1MTkKKzAsICAgICAgNTkzOTIsICAgICAgNTkzOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTIwZmI4NQorMCwgICAgICA2MDQxNiwgICAgICA2MDQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFmZmJmNGE5CiswLCAgICAgIDYxNDQwLCAgICAgIDYxNDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzgwZTA1Y2MKKzAsICAgICAgNjI0NjQsICAgICAgNjI0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNjZhZjZjZgorMCwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRmNjRmMzU1CiswLCAgICAgIDY0NTEyLCAgICAgIDY0NTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2FhMGU4OWYKKzAsICAgICAgNjU1MzYsICAgICAgNjU1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZjE2MDUyNAorMCwgICAgICA2NjU2MCwgICAgICA2NjU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiYmEwMjkyCiswLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTI0M2VkNGQKKzAsICAgICAgNjg2MDgsICAgICAgNjg2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMDRmZmNiMQorMCwgICAgICA2OTYzMiwgICAgICA2OTYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZiMWJmYzliCiswLCAgICAgIDcwNjU2LCAgICAgIDcwNjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDI1OWU5ZDMKKzAsICAgICAgNzE2ODAsICAgICAgNzE2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MGZlZTc0OQorMCwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg2MjZlZmY5CiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjlhNGZlNDEKKzAsICAgICAgNzQ3NTIsICAgICAgNzQ3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZGFjZjJiYgorMCwgICAgICA3NTc3NiwgICAgICA3NTc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg3NWIwMDQ2CiswLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDA5YjAwNjgKKzAsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MGY4ZWVlMQorMCwgICAgICA3ODg0OCwgICAgICA3ODg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE3M2VmNTAzCiswLCAgICAgIDc5ODcyLCAgICAgIDc5ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWFjOGY3ZTUKKzAsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMjI5ZjMxYgorMCwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdlYjBlZGM5CiswLCAgICAgIDgyOTQ0LCAgICAgIDgyOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODhlMGVkZGQKKzAsICAgICAgODM5NjgsICAgICAgODM5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3OTgyZmUzZgorMCwgICAgICA4NDk5MiwgICAgICA4NDk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkxY2FmNjY1CiswLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmZkMWYzZDcKKzAsICAgICAgODcwNDAsICAgICAgODcwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YjNkZTQ2NQorMCwgICAgICA4ODA2NCwgICAgICA4ODA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzZjVlOTlkCiswLCAgICAgIDg5MDg4LCAgICAgIDg5MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWIwMGI0ZGYKKzAsICAgICAgOTAxMTIsICAgICAgOTAxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMGE1ZTkyZgorMCwgICAgICA5MTEzNiwgICAgICA5MTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFlZDJlZjU5CiswLCAgICAgIDkyMTYwLCAgICAgIDkyMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODA1OTE1ODYKKzAsICAgICAgOTMxODQsICAgICAgOTMxODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMmQ0ZjBlZgorMCwgICAgICA5NDIwOCwgICAgICA5NDIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiYTRmMGY5CiswLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGQzYmM2MzEKKzAsICAgICAgOTYyNTYsICAgICAgOTYyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZGVkZTdjNQorMCwgICAgICA5NzI4MCwgICAgICA5NzI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhNDU5NDYzCiswLCAgICAgIDk4MzA0LCAgICAgIDk4MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWNhODE4YjgKKzAsICAgICAgOTkzMjgsICAgICAgOTkzMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYzkxYzZjOQorMCwgICAgIDEwMDM1MiwgICAgIDEwMDM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyNDFlNjliCiswLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTIyMGQ5YTcKKzAsICAgICAxMDI0MDAsICAgICAxMDI0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZjRiY2JkNQorMCwgICAgIDEwMzQyNCwgICAgIDEwMzQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJjMWFkOTBiCiswLCAgICAgMTA0NDQ4LCAgICAgMTA0NDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mzk3NGZlYjMKKzAsICAgICAxMDU0NzIsICAgICAxMDU0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZDFhZTJlMQorMCwgICAgIDEwNjQ5NiwgICAgIDEwNjQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE2MDlmOTU1CiswLCAgICAgMTA3NTIwLCAgICAgMTA3NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzVmY2RkMTkKKzAsICAgICAxMDg1NDQsICAgICAxMDg1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMjMzZDhjNQorMCwgICAgIDEwOTU2OCwgICAgIDEwOTU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQxZDdkNjFkCiswLCAgICAgMTEwNTkyLCAgICAgMTEwNTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTI1MjJmNTgKKzAsICAgICAxMTE2MTYsICAgICAxMTE2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNmQ4Y2Q2MworMCwgICAgIDExMjY0MCwgICAgIDExMjY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM5OTRlODQ3CiswLCAgICAgMTEzNjY0LCAgICAgMTEzNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmZkOGVhMDcKKzAsICAgICAxMTQ2ODgsICAgICAxMTQ2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ODI3MjNiZQorMCwgICAgIDExNTcxMiwgICAgIDExNTcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ0ZDQwZmY2CiswLCAgICAgMTE2NzM2LCAgICAgMTE2NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OThkMjIwNTAKKzAsICAgICAxMTc3NjAsICAgICAxMTc3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyY2M4MDYzYworMCwgICAgIDExODc4NCwgICAgIDExODc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY2NDVlZDhkCiswLCAgICAgMTE5ODA4LCAgICAgMTE5ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2I0OWRiZTEKKzAsICAgICAxMjA4MzIsICAgICAxMjA4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZWZiZjM2OQorMCwgICAgIDEyMTg1NiwgICAgIDEyMTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc5NzMzM2FjCiswLCAgICAgMTIyODgwLCAgICAgMTIyODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTU3MTMwZmEKKzAsICAgICAxMjM5MDQsICAgICAxMjM5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzUzMDU5NAorMCwgICAgIDEyNDkyOCwgICAgIDEyNDkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2NzgzYjZjCiswLCAgICAgMTI1OTUyLCAgICAgMTI1OTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWZhYzQzNmUKKzAsICAgICAxMjY5NzYsICAgICAxMjY5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYTllMWM3NgorMCwgICAgIDEyODAwMCwgICAgIDEyODAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE1MjIwMmFjCiswLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTVjZGYzNjkKKzAsICAgICAxMzAwNDgsICAgICAxMzAwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZmUyZmVlYgorMCwgICAgIDEzMTA3MiwgICAgIDEzMTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGVlMjRlYzdmCiswLCAgICAgMTMyMDk2LCAgICAgMTMyMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmYzM2ZkNWQKKzAsICAgICAxMzMxMjAsICAgICAxMzMxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZjUyZmQ1MQorMCwgICAgIDEzNDE0NCwgICAgIDEzNDE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIyOTJlOGU2CiswLCAgICAgMTM1MTY4LCAgICAgMTM1MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmMxM2Y3YmIKKzAsICAgICAxMzYxOTIsICAgICAxMzYxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMjcxZjcwOAorMCwgICAgIDEzNzIxNiwgICAgIDEzNzIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDlmMWZmNmVjCiswLCAgICAgMTM4MjQwLCAgICAgMTM4MjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGY4OGY1OTkKKzAsICAgICAxMzkyNjQsICAgICAxMzkyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NjE0ZjZhZQorMCwgICAgIDE0MDI4OCwgICAgIDE0MDI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdjZjlmM2M0CiswLCAgICAgMTQxMzEyLCAgICAgMTQxMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2RjMWY1ODgKKzAsICAgICAxNDIzMzYsICAgICAxNDIzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNGExZmZhOQorMCwgICAgIDE0MzM2MCwgICAgIDE0MzM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNiMTVmNWQ0CiswLCAgICAgMTQ0Mzg0LCAgICAgMTQ0Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmZkMGY1OGYKKzAsICAgICAxNDU0MDgsICAgICAxNDU0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwOGVmZjk0OAorMCwgICAgIDE0NjQzMiwgICAgIDE0NjQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxZjlmMzlmCiswLCAgICAgMTQ3NDU2LCAgICAgMTQ3NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzBmNWY0ZWQKKzAsICAgICAxNDg0ODAsICAgICAxNDg0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzY2NhZjQyNAorMCwgICAgIDE0OTUwNCwgICAgIDE0OTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxNzBmMjE1CiswLCAgICAgMTUwNTI4LCAgICAgMTUwNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGVjZmViMzgKKzAsICAgICAxNTE1NTIsICAgICAxNTE1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiN2E2ZjBlNQorMCwgICAgIDE1MjU3NiwgICAgIDE1MjU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE0ZWNmNDJkCiswLCAgICAgMTUzNjAwLCAgICAgMTUzNjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2FmOGVlZmMKKzAsICAgICAxNTQ2MjQsICAgICAxNTQ2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYzU3ZmE4YgorMCwgICAgIDE1NTY0OCwgICAgIDE1NTY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIwNmJmNjAyCiswLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTVhN2Y0NWQKKzAsICAgICAxNTc2OTYsICAgICAxNTc2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMjNkZWE2ZQorMCwgICAgIDE1ODcyMCwgICAgIDE1ODcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiNmFmODFjCiswLCAgICAgMTU5NzQ0LCAgICAgMTU5NzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWU3M2Y2YzcKKzAsICAgICAxNjA3NjgsICAgICAxNjA3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOWM4ZjI5MworMCwgICAgIDE2MTc5MiwgICAgIDE2MTc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1MmVmOGFhCiswLCAgICAgMTYyODE2LCAgICAgMTYyODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmFjNmY4MTIKKzAsICAgICAxNjM4NDAsICAgICAxNjM4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZjlkZmIwMAorMCwgICAgIDE2NDg2NCwgICAgIDE2NDg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzMDVmNWIyCiswLCAgICAgMTY1ODg4LCAgICAgMTY1ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTJmM2ZlYTQKKzAsICAgICAxNjY5MTIsICAgICAxNjY5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzc3ZjBlNgorMCwgICAgIDE2NzkzNiwgICAgIDE2NzkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAzNDRmMGE5CiswLCAgICAgMTY4OTYwLCAgICAgMTY4OTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mzg5YWZhZjQKKzAsICAgICAxNjk5ODQsICAgICAxNjk5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZjYzZmEwZAorMCwgICAgIDE3MTAwOCwgICAgIDE3MTAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNlODhmNWFlCiswLCAgICAgMTcyMDMyLCAgICAgMTcyMDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2U1NWY4NTIKKzAsICAgICAxNzMwNTYsICAgICAxNzMwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWYwZjU1NQorMCwgICAgIDE3NDA4MCwgICAgIDE3NDA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU3NTNmYTVhCiswLCAgICAgMTc1MTA0LCAgICAgMTc1MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDQzY2U4OWIKKzAsICAgICAxNzYxMjgsICAgICAxNzYxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDY4ZGU4YworMCwgICAgIDE3NzE1MiwgICAgIDE3NzE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUyMDlmNTFmCiswLCAgICAgMTc4MTc2LCAgICAgMTc4MTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTdlOGViM2EKKzAsICAgICAxNzkyMDAsICAgICAxNzkyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOTdmZTk3OAorMCwgICAgIDE4MDIyNCwgICAgIDE4MDIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhjYWRmZjM3CiswLCAgICAgMTgxMjQ4LCAgICAgMTgxMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGRkNDAyOTAKKzAsICAgICAxODIyNzIsICAgICAxODIyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzY5ZWI3NAorMCwgICAgIDE4MzI5NiwgICAgIDE4MzI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwZThlOWVlCiswLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWU3MjdjMjIKKzAsICAgICAxODUzNDQsICAgICAxODUzNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZThiZTdlZAorMCwgICAgIDE4NjM2OCwgICAgIDE4NjM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI2ZjBmMzdhCiswLCAgICAgMTg3MzkyLCAgICAgMTg3MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGE5YWYyYTIKKzAsICAgICAxODg0MTYsICAgICAxODg0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OTE3ZjM5NQorMCwgICAgIDE4OTQ0MCwgICAgIDE4OTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY0OWRmNWI0CiswLCAgICAgMTkwNDY0LCAgICAgMTkwNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWJiN2ZjOWEKKzAsICAgICAxOTE0ODgsICAgICAxOTE0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYTNlZWYwOQorMCwgICAgIDE5MjUxMiwgICAgIDE5MjUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjZjliYTVlCiswLCAgICAgMTkzNTM2LCAgICAgMTkzNTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGY4M2ViMmQKKzAsICAgICAxOTQ1NjAsICAgICAxOTQ1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDg2ZjYyYworMCwgICAgIDE5NTU4NCwgICAgIDE5NTU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFmNmQwNWI2CiswLCAgICAgMTk2NjA4LCAgICAgMTk2NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTg4ZmYyZWQKKzAsICAgICAxOTc2MzIsICAgICAxOTc2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMDY2ZWIxMAorMCwgICAgIDE5ODY1NiwgICAgIDE5ODY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYwOGJlOTllCiswLCAgICAgMTk5NjgwLCAgICAgMTk5NjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmE5N2U5OTQKKzAsICAgICAyMDA3MDQsICAgICAyMDA3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlOTJhOGI3NgorMCwgICAgIDIwMTcyOCwgICAgIDIwMTcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxMmVlMGUyCiswLCAgICAgMjAyNzUyLCAgICAgMjAyNzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzIwMmVmN2QKKzAsICAgICAyMDM3NzYsICAgICAyMDM3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDhhZmViYgorMCwgICAgIDIwNDgwMCwgICAgIDIwNDgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBmYzJmY2JmCiswLCAgICAgMjA1ODI0LCAgICAgMjA1ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmQ0ZGYxYmIKKzAsICAgICAyMDY4NDgsICAgICAyMDY4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MjgyZWUxZgorMCwgICAgIDIwNzg3MiwgICAgIDIwNzg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFhNGVlMzU5CiswLCAgICAgMjA4ODk2LCAgICAgMjA4ODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTBjMGRlYjEKKzAsICAgICAyMDk5MjAsICAgICAyMDk5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MjA5ZjUxZgorMCwgICAgIDIxMDk0NCwgICAgIDIxMDk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk3ZThlYjNhCiswLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDk3ZmU5NzgKKzAsICAgICAyMTI5OTIsICAgICAyMTI5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Y2FkZmYzNworMCwgICAgIDIxNDAxNiwgICAgIDIxNDAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhkZDQwMjkwCiswLCAgICAgMjE1MDQwLCAgICAgMjE1MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjM2OWViNzQKKzAsICAgICAyMTYwNjQsICAgICAyMTYwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MGU4ZTllZQorMCwgICAgIDIxNzA4OCwgICAgIDIxNzA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFlNzI3YzIyCiswLCAgICAgMjE4MTEyLCAgICAgMjE4MTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmU4YmU3ZWQKKzAsICAgICAyMTkxMzYsICAgICAyMTkxMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNmYwZjM3YQorMCwgICAgIDIyMDE2MCwgICAgIDIyMDE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhhOWFmMmEyCiswLCAgICAgMjIxMTg0LCAgICAgMjIxMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjkxN2YzOTUKKzAsICAgICAyMjIyMDgsICAgICAyMjIyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NDlkZjViNAorMCwgICAgIDIyMzIzMiwgICAgIDIyMzIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGViYjdmYzlhCiswLCAgICAgMjI0MjU2LCAgICAgMjI0MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmEzZWVmMDkKKzAsICAgICAyMjUyODAsICAgICAyMjUyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwY2Y5YmE1ZQorMCwgICAgIDIyNjMwNCwgICAgIDIyNjMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBmODNlYjJkCiswLCAgICAgMjI3MzI4LCAgICAgMjI3MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2Q4NmY2MmMKKzAsICAgICAyMjgzNTIsICAgICAyMjgzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZjZkMDViNgorMCwgICAgIDIyOTM3NiwgICAgIDIyOTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk4OGZmMmVkCiswLCAgICAgMjMwNDAwLCAgICAgMjMwNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTA2NmViMTAKKzAsICAgICAyMzE0MjQsICAgICAyMzE0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MDhiZTk5ZQorMCwgICAgIDIzMjQ0OCwgICAgIDIzMjQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJhOTdlOTk0CiswLCAgICAgMjMzNDcyLCAgICAgMjMzNDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTkyYThiNzYKKzAsICAgICAyMzQ0OTYsICAgICAyMzQ0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMTJlZTBlMgorMCwgICAgIDIzNTUyMCwgICAgIDIzNTUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMyMDJlZjdkCiswLCAgICAgMjM2NTQ0LCAgICAgMjM2NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2Q4YWZlYmIKKzAsICAgICAyMzc1NjgsICAgICAyMzc1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZmMyZmNiZgorMCwgICAgIDIzODU5MiwgICAgIDIzODU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDJkNGRmMWJiCiswLCAgICAgMjM5NjE2LCAgICAgMjM5NjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzI4MmVlMWYKKzAsICAgICAyNDA2NDAsICAgICAyNDA2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTRlZTM1OQorMCwgICAgIDI0MTY2NCwgICAgIDI0MTY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDEwYzBkZWIxCiswLCAgICAgMjQyNjg4LCAgICAgMjQyNjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTIwOWY1MWYKKzAsICAgICAyNDM3MTIsICAgICAyNDM3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5N2U4ZWIzYQorMCwgICAgIDI0NDczNiwgICAgIDI0NDczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ5N2ZlOTc4CiswLCAgICAgMjQ1NzYwLCAgICAgMjQ1NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGNhZGZmMzcKKzAsICAgICAyNDY3ODQsICAgICAyNDY3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZGQ0MDI5MAorMCwgICAgIDI0NzgwOCwgICAgIDI0NzgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzNjllYjc0CiswLCAgICAgMjQ4ODMyLCAgICAgMjQ4ODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTBlOGU5ZWUKKzAsICAgICAyNDk4NTYsICAgICAyNDk4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZTcyN2MyMgorMCwgICAgIDI1MDg4MCwgICAgIDI1MDg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJlOGJlN2VkCiswLCAgICAgMjUxOTA0LCAgICAgMjUxOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjZmMGYzN2EKKzAsICAgICAyNTI5MjgsICAgICAyNTI5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YTlhZjJhMgorMCwgICAgIDI1Mzk1MiwgICAgIDI1Mzk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY5MTdmMzk1CiswLCAgICAgMjU0OTc2LCAgICAgMjU0OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjQ5ZGY1YjQKKzAsICAgICAyNTYwMDAsICAgICAyNTYwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYmI3ZmM5YQorMCwgICAgIDI1NzAyNCwgICAgIDI1NzAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJhM2VlZjA5CiswLCAgICAgMjU4MDQ4LCAgICAgMjU4MDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGNmOWJhNWUKKzAsICAgICAyNTkwNzIsICAgICAyNTkwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZjgzZWIyZAorMCwgICAgIDI2MDA5NiwgICAgIDI2MDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNkODZmNjJjCiswLCAgICAgMjYxMTIwLCAgICAgMjYxMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWY2ZDA1YjYKKzAsICAgICAyNjIxNDQsICAgICAyNjIxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ODhmZjJlZAorMCwgICAgIDI2MzE2OCwgICAgIDI2MzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwNjZlYjEwCiswLCAgICAgMjY0MTkyLCAgICAgMjY0MTkyLCAgICAgIDQwOCwgICAgIDE2MzIsIDB4ZTAwYzI2YmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hbGltaXRlciBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hbGltaXRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY5NzY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFsaW1pdGVyCkBAIC0wLDAgKzEsMjY1IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0MTk0YWY0CiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Njg2YWY0YWIKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlODBjZWU2MQorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE2ODZmYmFkCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTkxZTA2MmMKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTEzZWRiMQorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFiMjFmOGVmCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWEzMGU3NTcKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWZkZjY5ZgorMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc2NWUwNWVjCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjQ4NGY1NTEKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MWI5ZTlmNworMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE3MzVmZWIzCiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjQ3MjAzYWEKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNmI1ZmJmNQorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJjNjZmMTRmCiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjAwM2ZmNWIKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMTYwZjE3ZAorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDMwODAwMWE0CiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWRmOWY0MjkKKzAsICAgICAgMjA0ODAsICAgICAgMjA0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZTZlZWMwZgorMCwgICAgICAyMTUwNCwgICAgICAyMTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNhMzMwMWYyCiswLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWViMWY5NjEKKzAsICAgICAgMjM1NTIsICAgICAgMjM1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMGE1MGM4YworMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA3MWVlOTZiCiswLCAgICAgIDI1NjAwLCAgICAgIDI1NjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2E0NmYwNWIKKzAsICAgICAgMjY2MjQsICAgICAgMjY2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyY2IyZjQ3NQorMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDViZGEwYTUyCiswLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzNjMGY3MjcKKzAsICAgICAgMjk2OTYsICAgICAgMjk2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1M2NmZWU1OQorMCwgICAgICAzMDcyMCwgICAgICAzMDcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE1ODhmMjIxCiswLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTVkNDAwZDYKKzAsICAgICAgMzI3NjgsICAgICAgMzI3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDc4MDA5YQorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY4NmFmNGFiCiswLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTgwY2VlNjEKKzAsICAgICAgMzU4NDAsICAgICAgMzU4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNjg2ZmJhZAorMCwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE5MWUwNjJjCiswLCAgICAgIDM3ODg4LCAgICAgIDM3ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWExM2VkYjEKKzAsICAgICAgMzg5MTIsICAgICAgMzg5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYjIxZjhlZgorMCwgICAgICAzOTkzNiwgICAgICAzOTkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFhMzBlNzU3CiswLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFmZGY2OWYKKzAsICAgICAgNDE5ODQsICAgICAgNDE5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NjVlMDVlYworMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY0ODRmNTUxCiswLCAgICAgIDQ0MDMyLCAgICAgIDQ0MDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU1ZTA2MDAKKzAsICAgICAgNDUwNTYsICAgICAgNDUwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDU2ZWNiOQorMCwgICAgICA0NjA4MCwgICAgICA0NjA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRjYjYwOWE4CiswLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzg3YmY0YTEKKzAsICAgICAgNDgxMjgsICAgICAgNDgxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlY2RmZWY5NQorMCwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkwNWZmMTNmCiswLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGU2OWVlYjMKKzAsICAgICAgNTEyMDAsICAgICAgNTEyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNmUxMDgyYworMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYwNmMwYTIyCiswLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWY5NGYzNTEKKzAsICAgICAgNTQyNzIsICAgICAgNTQyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYzQ3ZjYzZgorMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDllMTRlYmY5CiswLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzgwNGZiY2IKKzAsICAgICAgNTczNDQsICAgICAgNTczNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjN2M2ZmZiNworMCwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE1NDdmNjhkCiswLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGM4N2ZlZDcKKzAsICAgICAgNjA0MTYsICAgICAgNjA0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4OGI1ZmVmMQorMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMyNWFmMDBkCiswLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDgyNmVkZDkKKzAsICAgICAgNjM0ODgsICAgICAgNjM0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZmJlMTEzOAorMCwgICAgICA2NDUxMiwgICAgICA2NDUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmODVkYTdiCiswLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Zjk4N2Y5YjMKKzAsICAgICAgNjY1NjAsICAgICAgNjY1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZGY1ZTEyZgorMCwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1OWNmOGVmCiswLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTE5MWViNGYKKzAsICAgICAgNjk2MzIsICAgICAgNjk2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZTViZjFmZAorMCwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc2NzVlMmNiCiswLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzk2YTJmOTAKKzAsICAgICAgNzI3MDQsICAgICAgNzI3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTUyZTdhNQorMCwgICAgICA3MzcyOCwgICAgICA3MzcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJiNTZmZDgxCiswLCAgICAgIDc0NzUyLCAgICAgIDc0NzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmY3YzAyZWUKKzAsICAgICAgNzU3NzYsICAgICAgNzU3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZTRjZWJiMQorMCwgICAgICA3NjgwMCwgICAgICA3NjgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU1YjdmZGY3CiswLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDI3MWVjZTcKKzAsICAgICAgNzg4NDgsICAgICAgNzg4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NmUwZjY5ZgorMCwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZlNWVlZjMzCiswLCAgICAgIDgwODk2LCAgICAgIDgwODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzhiNzBiNmUKKzAsICAgICAgODE5MjAsICAgICAgODE5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MWYyZjA3NQorMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYxZGM0N2RjCiswLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjRiNDA2ZDIKKzAsICAgICAgODQ5OTIsICAgICAgODQ5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMzM4MDZmZQorMCwgICAgICA4NjAxNiwgICAgICA4NjAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDViNWVmMDg3CiswLCAgICAgIDg3MDQwLCAgICAgIDg3MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2ZhMjA3ZGEKKzAsICAgICAgODgwNjQsICAgICAgODgwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NzE5ZjIwMQorMCwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY0MWZlYWFkCiswLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTA1NDAyZWMKKzAsICAgICAgOTExMzYsICAgICAgOTExMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNTI5ZTExZgorMCwgICAgICA5MjE2MCwgICAgICA5MjE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY1YTQxODM4CiswLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjUxZWZiNmYKKzAsICAgICAgOTQyMDgsICAgICAgOTQyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNTFiMTM5MAorMCwgICAgICA5NTIzMiwgICAgICA5NTIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ1ZWEwNWE4CiswLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTY1YmUxNDEKKzAsICAgICAgOTcyODAsICAgICAgOTcyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNDUyZDNkZAorMCwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiZGZmODIxCiswLCAgICAgIDk5MzI4LCAgICAgIDk5MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzRkYTAwZTYKKzAsICAgICAxMDAzNTIsICAgICAxMDAzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NDc0ZmExOQorMCwgICAgIDEwMTM3NiwgICAgIDEwMTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDExZGRlZGVmCiswLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjAyN2Q3MmIKKzAsICAgICAxMDM0MjQsICAgICAxMDM0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTBhMWNlNgorMCwgICAgIDEwNDQ0OCwgICAgIDEwNDQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcxNjgxNDVlCiswLCAgICAgMTA1NDcyLCAgICAgMTA1NDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTRhNzEwYTQKKzAsICAgICAxMDY0OTYsICAgICAxMDY0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZjU1ZWNmMQorMCwgICAgIDEwNzUyMCwgICAgIDEwNzUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxMmRlNmQ3CiswLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGZmN2RiMTUKKzAsICAgICAxMDk1NjgsICAgICAxMDk1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNjZkMGNjNgorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwNGFmYTRmCiswLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjZhYmJlZTcKKzAsICAgICAxMTI2NDAsICAgICAxMTI2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZTk5MTBkYworMCwgICAgIDExMzY2NCwgICAgIDExMzY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk2YzMwNDdlCiswLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWRjMWU4ZTEKKzAsICAgICAxMTU3MTIsICAgICAxMTU3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YjJjMTA5MgorMCwgICAgIDExNjczNiwgICAgIDExNjczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU5MmQyMTJjCiswLCAgICAgMTE3NzYwLCAgICAgMTE3NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWMzYmRhMTUKKzAsICAgICAxMTg3ODQsICAgICAxMTg3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0M2M4ZTkwZgorMCwgICAgIDExOTgwOCwgICAgIDExOTgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiZmEwNzRlCiswLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTJkN2Q0NDMKKzAsICAgICAxMjE4NTYsICAgICAxMjE4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNGIwMjg0NAorMCwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlmNWQyYTkyCiswLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzE5YmY2OWQKKzAsICAgICAxMjQ5MjgsICAgICAxMjQ5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0N2I4ZmU3NQorMCwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDMzNzMzNGIwCiswLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTZlZDE0ZjAKKzAsICAgICAxMjgwMDAsICAgICAxMjgwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YWYwZjY3YgorMCwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmNTQxYTYwCiswLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Njg0ZjBjMDYKKzAsICAgICAxMzEwNzIsICAgICAxMzEwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlM2QwMDE1ZQorMCwgICAgIDEzMjA5NiwgICAgIDEzMjA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY2NDhkNzNjCiswLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDA0MWYzZWUKKzAsICAgICAxMzQxNDQsICAgICAxMzQxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNDIxMDI1ZgorMCwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlYjVmYzk3CiswLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTEwZjAyZmUKKzAsICAgICAxMzcyMTYsICAgICAxMzcyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NWU5ZTk1ZQorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIxZDBmZTEwCiswLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGE2NmY1ZjgKKzAsICAgICAxNDAyODgsICAgICAxNDAyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzODI2ZWFhOAorMCwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGE3Y2MwMTc2CiswLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzFlOGZlNWEKKzAsICAgICAxNDMzNjAsICAgICAxNDMzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMTQ5ZmNmYQorMCwgICAgIDE0NDM4NCwgICAgIDE0NDM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJkMzZmZDhlCiswLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWMxYWZjYzYKKzAsICAgICAxNDY0MzIsICAgICAxNDY0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYTgwZWM1ZQorMCwgICAgIDE0NzQ1NiwgICAgIDE0NzQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhkYTFmMGFjCiswLCAgICAgMTQ4NDgwLCAgICAgMTQ4NDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjNjM2U2MWMKKzAsICAgICAxNDk1MDQsICAgICAxNDk1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODhjZjA5YgorMCwgICAgIDE1MDUyOCwgICAgIDE1MDUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdlZWJlYTg1CiswLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2VmNmY3MTgKKzAsICAgICAxNTI1NzYsICAgICAxNTI1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDlmZWNmYgorMCwgICAgIDE1MzYwMCwgICAgIDE1MzYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhYTdmNjI0CiswLCAgICAgMTU0NjI0LCAgICAgMTU0NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2FiNWYxZTMKKzAsICAgICAxNTU2NDgsICAgICAxNTU2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNmU5Zjc5NQorMCwgICAgIDE1NjY3MiwgICAgIDE1NjY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk1MmNmNTRkCiswLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTRhNGVkM2IKKzAsICAgICAxNTg3MjAsICAgICAxNTg3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZTI0Zjk5MgorMCwgICAgIDE1OTc0NCwgICAgIDE1OTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFiNmJmYTA5CiswLCAgICAgMTYwNzY4LCAgICAgMTYwNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTAyMTAyMGIKKzAsICAgICAxNjE3OTIsICAgICAxNjE3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYTA2MDBmNQorMCwgICAgIDE2MjgxNiwgICAgIDE2MjgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFkZjdlYzkyCiswLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWRkNWY2M2YKKzAsICAgICAxNjQ4NjQsICAgICAxNjQ4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMDFiZmY4OQorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1ZGJmMWU3CiswLCAgICAgMTY2OTEyLCAgICAgMTY2OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDRmMDAwMzgKKzAsICAgICAxNjc5MzYsICAgICAxNjc5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZGM1Zjg4NgorMCwgICAgIDE2ODk2MCwgICAgIDE2ODk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGViODhlNzI5CiswLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmU1Y2Y1M2UKKzAsICAgICAxNzEwMDgsICAgICAxNzEwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNjkyZjdhMAorMCwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU5ODRmMjRiCiswLCAgICAgMTczMDU2LCAgICAgMTczMDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE0ZWY3MzIKKzAsICAgICAxNzQwODAsICAgICAxNzQwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYjYwMDEwYgorMCwgICAgIDE3NTEwNCwgICAgIDE3NTEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZkZDBlYWYyCiswLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzEzZGU4NTEKKzAsICAgICAxNzcxNTIsICAgICAxNzcxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzllZjA0MworMCwgICAgIDE3ODE3NiwgICAgIDE3ODE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzNjZmZTQzCiswLCAgICAgMTc5MjAwLCAgICAgMTc5MjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmZkNmYzYjkKKzAsICAgICAxODAyMjQsICAgICAxODAyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzRiZjY3YgorMCwgICAgIDE4MTI0OCwgICAgIDE4MTI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwZGVmN2MxCiswLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTZkMGY0NjYKKzAsICAgICAxODMyOTYsICAgICAxODMyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMWExZjFjMgorMCwgICAgIDE4NDMyMCwgICAgIDE4NDMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDMyZjg5MjNjCiswLCAgICAgMTg1MzQ0LCAgICAgMTg1MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTM3MDAxZDIKKzAsICAgICAxODYzNjgsICAgICAxODYzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiODgxZjZjZAorMCwgICAgIDE4NzM5MiwgICAgIDE4NzM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY0NGUwMzRhCiswLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjQzZmVjZjcKKzAsICAgICAxODk0NDAsICAgICAxODk0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNjJjZWQ1MAorMCwgICAgIDE5MDQ2NCwgICAgIDE5MDQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIyMWRmZDBkCiswLCAgICAgMTkxNDg4LCAgICAgMTkxNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODU0MDAxNDcKKzAsICAgICAxOTI1MTIsICAgICAxOTI1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YmY4ZDA1NAorMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA4MzcwMTcwCiswLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWM2MmVmZmEKKzAsICAgICAxOTU1ODQsICAgICAxOTU1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNThjZjY3YworMCwgICAgIDE5NjYwOCwgICAgIDE5NjYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY1OTdmOWExCiswLCAgICAgMTk3NjMyLCAgICAgMTk3NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjNmY2YwYjAKKzAsICAgICAxOTg2NTYsICAgICAxOTg2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Y2M4ZmQzMgorMCwgICAgIDE5OTY4MCwgICAgIDE5OTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY4YzIwNzJjCiswLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGM3ZTkzYTUKKzAsICAgICAyMDE3MjgsICAgICAyMDE3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxY2MzZjYxMgorMCwgICAgIDIwMjc1MiwgICAgIDIwMjc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzYWRmOGVlCiswLCAgICAgMjAzNzc2LCAgICAgMjAzNzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjgwZTAxOTUKKzAsICAgICAyMDQ4MDAsICAgICAyMDQ4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZDM0ZmQyZQorMCwgICAgIDIwNTgyNCwgICAgIDIwNTgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ0Y2RmYjM0CiswLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTkzZGY3OTAKKzAsICAgICAyMDc4NzIsICAgICAyMDc4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzM3ZWY2NAorMCwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwNzRlZTM4CiswLCAgICAgMjA5OTIwLCAgICAgMjA5OTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjM5ZWYwNDMKKzAsICAgICAyMTA5NDQsICAgICAyMTA5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzY2ZmU0MworMCwgICAgIDIxMTk2OCwgICAgIDIxMTk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmZDZmM2I5CiswLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjM0YmY2N2IKKzAsICAgICAyMTQwMTYsICAgICAyMTQwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMGRlZjdjMQorMCwgICAgIDIxNTA0MCwgICAgIDIxNTA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE2ZDBmNDY2CiswLCAgICAgMjE2MDY0LCAgICAgMjE2MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDFhMWYxYzIKKzAsICAgICAyMTcwODgsICAgICAyMTcwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMmY4OTIzYworMCwgICAgIDIxODExMiwgICAgIDIxODExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDEzNzAwMWQyCiswLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yjg4MWY2Y2QKKzAsICAgICAyMjAxNjAsICAgICAyMjAxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNDRlMDM0YQorMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0M2ZlY2Y3CiswLCAgICAgMjIyMjA4LCAgICAgMjIyMjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTYyY2VkNTAKKzAsICAgICAyMjMyMzIsICAgICAyMjMyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMjFkZmQwZAorMCwgICAgIDIyNDI1NiwgICAgIDIyNDI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg1NDAwMTQ3CiswLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGJmOGQwNTQKKzAsICAgICAyMjYzMDQsICAgICAyMjYzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwODM3MDE3MAorMCwgICAgIDIyNzMyOCwgICAgIDIyNzMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVjNjJlZmZhCiswLCAgICAgMjI4MzUyLCAgICAgMjI4MzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDU4Y2Y2N2MKKzAsICAgICAyMjkzNzYsICAgICAyMjkzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNTk3ZjlhMQorMCwgICAgIDIzMDQwMCwgICAgIDIzMDQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYzZmNmMGIwCiswLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGNjOGZkMzIKKzAsICAgICAyMzI0NDgsICAgICAyMzI0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmOGMyMDcyYworMCwgICAgIDIzMzQ3MiwgICAgIDIzMzQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjN2U5M2E1CiswLCAgICAgMjM0NDk2LCAgICAgMjM0NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWNjM2Y2MTIKKzAsICAgICAyMzU1MjAsICAgICAyMzU1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4M2FkZjhlZQorMCwgICAgIDIzNjU0NCwgICAgIDIzNjU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY4MGUwMTk1CiswLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWQzNGZkMmUKKzAsICAgICAyMzg1OTIsICAgICAyMzg1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NGNkZmIzNAorMCwgICAgIDIzOTYxNiwgICAgIDIzOTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE5M2RmNzkwCiswLCAgICAgMjQwNjQwLCAgICAgMjQwNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjMzN2VmNjQKKzAsICAgICAyNDE2NjQsICAgICAyNDE2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDc0ZWUzOAorMCwgICAgIDI0MjY4OCwgICAgIDI0MjY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzOWVmMDQzCiswLCAgICAgMjQzNzEyLCAgICAgMjQzNzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjM2NmZlNDMKKzAsICAgICAyNDQ3MzYsICAgICAyNDQ3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZmQ2ZjNiOQorMCwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzNGJmNjdiCiswLCAgICAgMjQ2Nzg0LCAgICAgMjQ2Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDBkZWY3YzEKKzAsICAgICAyNDc4MDgsICAgICAyNDc4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNmQwZjQ2NgorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQxYTFmMWMyCiswLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzJmODkyM2MKKzAsICAgICAyNTA4ODAsICAgICAyNTA4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMzcwMDFkMgorMCwgICAgIDI1MTkwNCwgICAgIDI1MTkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI4ODFmNmNkCiswLCAgICAgMjUyOTI4LCAgICAgMjUyOTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjQ0ZTAzNGEKKzAsICAgICAyNTM5NTIsICAgICAyNTM5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNDNmZWNmNworMCwgICAgIDI1NDk3NiwgICAgIDI1NDk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU2MmNlZDUwCiswLCAgICAgMjU2MDAwLCAgICAgMjU2MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjIxZGZkMGQKKzAsICAgICAyNTcwMjQsICAgICAyNTcwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NTQwMDE0NworMCwgICAgIDI1ODA0OCwgICAgIDI1ODA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiZjhkMDU0CiswLCAgICAgMjU5MDcyLCAgICAgMjU5MDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDgzNzAxNzAKKzAsICAgICAyNjAwOTYsICAgICAyNjAwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYzYyZWZmYQorMCwgICAgIDI2MTEyMCwgICAgIDI2MTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ1OGNmNjdjCiswLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjU5N2Y5YTEKKzAsICAgICAyNjMxNjgsICAgICAyNjMxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2M2ZjZjBiMAorMCwgICAgIDI2NDE5MiwgICAgIDI2NDE5MiwgICAgICA0MDgsICAgICAxNjMyLCAweGVkZmEzMTRhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWxscmdiIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFsbHJnYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRlZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFsbHJnYgpAQCAtMCwwICsxLDEwIEBACisjdGIgMDogMS81CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MDk2eDQwOTYKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgNTAzMzE2NDgsIDB4OWNjMjZhY2EKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCA1MDMzMTY0OCwgMHg5Y2MyNmFjYQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsIDUwMzMxNjQ4LCAweDljYzI2YWNhCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgNTAzMzE2NDgsIDB4OWNjMjZhY2EKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCA1MDMzMTY0OCwgMHg5Y2MyNmFjYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFsbHl1diBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hbGx5dXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc3OTkyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hbGx5dXYKQEAgLTAsMCArMSwxMCBAQAorI3RiIDA6IDEvNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDA5Nng0MDk2Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsIDUwMzMxNjQ4LCAweDcwYjE2YWNhCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgNTAzMzE2NDgsIDB4NzBiMTZhY2EKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCA1MDMzMTY0OCwgMHg3MGIxNmFjYQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsIDUwMzMxNjQ4LCAweDcwYjE2YWNhCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgNTAzMzE2NDgsIDB4NzBiMTZhY2EKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hbHBoYWV4dHJhY3RfYWxwaGFtZXJnZV9yZ2IgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWxwaGFleHRyYWN0X2FscGhhbWVyZ2VfcmdiCmluZGV4IDFiMWE0OGQuLmVhYzk5NzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hbHBoYWV4dHJhY3RfYWxwaGFtZXJnZV9yZ2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFscGhhZXh0cmFjdF9hbHBoYW1lcmdlX3JnYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNDA1NTA0LCAweDZkNTY2NmM4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA0MDU1MDQsIDB4NDgxM2JhMTcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDQwNTUwNCwgMHgyMzg4MGVlMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFscGhhZXh0cmFjdF9hbHBoYW1lcmdlX3l1diBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hbHBoYWV4dHJhY3RfYWxwaGFtZXJnZV95dXYKaW5kZXggMzdjMzQ4Ni4uMmNhZTM1NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFscGhhZXh0cmFjdF9hbHBoYW1lcmdlX3l1dgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYWxwaGFleHRyYWN0X2FscGhhbWVyZ2VfeXV2CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyNTM0NDAsIDB4MWFkYTdhYzQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDI1MzQ0MCwgMHg3MTFjMTU5OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjUzNDQwLCAweDUzMzAxN2VhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYW1lcmdlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFtZXJnZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U1ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFtZXJnZQpAQCAtMCwwICsxLDEzNiBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAyMDQ4LCAgICAgODE5MiwgMHgxMjBlZmE2NQorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDIwNDgsICAgICA4MTkyLCAweDdiM2NlYmY3CiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4MGZiOGVlMDEKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAyMDQ4LCAgICAgODE5MiwgMHg0N2E5ZjI3MQorMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgIDIwNDgsICAgICA4MTkyLCAweDQ3YThlZDViCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZGFiNmYzM2YKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAyMDQ4LCAgICAgODE5MiwgMHhkYTRkZjdlYgorMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgIDIwNDgsICAgICA4MTkyLCAweGM4M2NlNDQ5CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4NDk1NGU3NjUKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAyMDQ4LCAgICAgODE5MiwgMHgwMjE0ZjVkNQorMCwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgIDIwNDgsICAgICA4MTkyLCAweDIzMDJmM2M5CiswLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4MmI1N2VmNWIKKzAsICAgICAgMjQ1NzYsICAgICAgMjQ1NzYsICAgICAyMDQ4LCAgICAgODE5MiwgMHhhZDIyZjA3NQorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgIDIwNDgsICAgICA4MTkyLCAweDliZDVlZThiCiswLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4OTFhNGU5ZTEKKzAsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAyMDQ4LCAgICAgODE5MiwgMHg4NWE5ZmQ3ZgorMCwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgIDIwNDgsICAgICA4MTkyLCAweDEyMGVmYTY1CiswLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4N2IzY2ViZjcKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAyMDQ4LCAgICAgODE5MiwgMHgwZmI4ZWUwMQorMCwgICAgICAzODkxMiwgICAgICAzODkxMiwgICAgIDIwNDgsICAgICA4MTkyLCAweDQ3YTlmMjcxCiswLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4NDdhOGVkNWIKKzAsICAgICAgNDMwMDgsICAgICAgNDMwMDgsICAgICAyMDQ4LCAgICAgODE5MiwgMHg3NmY3YzY0ZgorMCwgICAgICA0NTA1NiwgICAgICA0NTA1NiwgICAgIDIwNDgsICAgICA4MTkyLCAweGFkZTBmNmY1CiswLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4Y2MxY2UxMzEKKzAsICAgICAgNDkxNTIsICAgICAgNDkxNTIsICAgICAyMDQ4LCAgICAgODE5MiwgMHgxMWFhZjg4YgorMCwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgIDIwNDgsICAgICA4MTkyLCAweGNkNTBlNDA5CiswLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4N2Y3MmVlNjMKKzAsICAgICAgNTUyOTYsICAgICAgNTUyOTYsICAgICAyMDQ4LCAgICAgODE5MiwgMHhmN2I0ZmY1ZAorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgIDIwNDgsICAgICA4MTkyLCAweGQ4YmM0MTkyCiswLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4YzhmYjA0MTgKKzAsICAgICAgNjE0NDAsICAgICAgNjE0NDAsICAgICAyMDQ4LCAgICAgODE5MiwgMHgwODU5Y2FjOQorMCwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgIDIwNDgsICAgICA4MTkyLCAweDc1MjlmMjc5CiswLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4MGVlMGRmN2IKKzAsICAgICAgNjc1ODQsICAgICAgNjc1ODQsICAgICAyMDQ4LCAgICAgODE5MiwgMHgwN2VkZWY2ZAorMCwgICAgICA2OTYzMiwgICAgICA2OTYzMiwgICAgIDIwNDgsICAgICA4MTkyLCAweDdkMDJlYTQ1CiswLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4NzcwMTA0YTgKKzAsICAgICAgNzM3MjgsICAgICAgNzM3MjgsICAgICAyMDQ4LCAgICAgODE5MiwgMHg3MTI0ZjU1MworMCwgICAgICA3NTc3NiwgICAgICA3NTc3NiwgICAgIDIwNDgsICAgICA4MTkyLCAweDZkZjYyNjlhCiswLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4NDIxODAwMmMKKzAsICAgICAgNzk4NzIsICAgICAgNzk4NzIsICAgICAyMDQ4LCAgICAgODE5MiwgMHgyNzRmZTAzZAorMCwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgIDIwNDgsICAgICA4MTkyLCAweGQwMGY1YWFlCiswLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4OTA3ZGZlNTEKKzAsICAgICAgODYwMTYsICAgICAgODYwMTYsICAgICAyMDQ4LCAgICAgODE5MiwgMHhjMmMxMGVkMgorMCwgICAgICA4ODA2NCwgICAgICA4ODA2NCwgICAgIDIwNDgsICAgICA4MTkyLCAweDI5M2FhMzU1CiswLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4Yjg0YTU5MWQKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAyMDQ4LCAgICAgODE5MiwgMHg0NGY2NGU4NworMCwgICAgICA5NDIwOCwgICAgICA5NDIwOCwgICAgIDIwNDgsICAgICA4MTkyLCAweDBmNjg2OWJkCiswLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4YjNkY2M0NGIKKzAsICAgICAgOTgzMDQsICAgICAgOTgzMDQsICAgICAyMDQ4LCAgICAgODE5MiwgMHg0NGY4NTI5MworMCwgICAgIDEwMDM1MiwgICAgIDEwMDM1MiwgICAgIDIwNDgsICAgICA4MTkyLCAweDg1NDVhZDBmCiswLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZGVlMmExOTMKKzAsICAgICAxMDQ0NDgsICAgICAxMDQ0NDgsICAgICAyMDQ4LCAgICAgODE5MiwgMHg0NmE5NmUyZAorMCwgICAgIDEwNjQ5NiwgICAgIDEwNjQ5NiwgICAgIDIwNDgsICAgICA4MTkyLCAweGNlYmM1NmExCiswLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4NTM1M2EzNWIKKzAsICAgICAxMTA1OTIsICAgICAxMTA1OTIsICAgICAyMDQ4LCAgICAgODE5MiwgMHg3NGFjZWIzMworMCwgICAgIDExMjY0MCwgICAgIDExMjY0MCwgICAgIDIwNDgsICAgICA4MTkyLCAweDM0ZmExNDg4CiswLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4NzExZWNkNmQKKzAsICAgICAxMTY3MzYsICAgICAxMTY3MzYsICAgICAyMDQ4LCAgICAgODE5MiwgMHgyNzdhYzhhYgorMCwgICAgIDExODc4NCwgICAgIDExODc4NCwgICAgIDIwNDgsICAgICA4MTkyLCAweGI3YjkxYmE4CiswLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4Y2FiNzA0ZGUKKzAsICAgICAxMjI4ODAsICAgICAxMjI4ODAsICAgICAyMDQ4LCAgICAgODE5MiwgMHg2OTVhZTQxMworMCwgICAgIDEyNDkyOCwgICAgIDEyNDkyOCwgICAgIDIwNDgsICAgICA4MTkyLCAweGVlNjE4ZDI5CiswLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZTdjYWY0MDEKKzAsICAgICAxMjkwMjQsICAgICAxMjkwMjQsICAgICAyMDQ4LCAgICAgODE5MiwgMHhjMTJjMjMwZQorMCwgICAgIDEzMTA3MiwgICAgIDEzMTA3MiwgICAgIDIwNDgsICAgICA4MTkyLCAweDkxMjRlYzcxCiswLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZDJiYWQyZjcKKzAsICAgICAxMzUxNjgsICAgICAxMzUxNjgsICAgICAyMDQ4LCAgICAgODE5MiwgMHgyZmM2ZGEzMworMCwgICAgIDEzNzIxNiwgICAgIDEzNzIxNiwgICAgIDIwNDgsICAgICA4MTkyLCAweDY2ZDkyYzI4CiswLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4MzM3M2RkZmQKKzAsICAgICAxNDEzMTIsICAgICAxNDEzMTIsICAgICAyMDQ4LCAgICAgODE5MiwgMHg0MTlhZTMyNQorMCwgICAgIDE0MzM2MCwgICAgIDE0MzM2MCwgICAgIDIwNDgsICAgICA4MTkyLCAweDZiNWFkMjMzCiswLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4YjYyZjExYTAKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAyMDQ4LCAgICAgODE5MiwgMHg3MDg0YzVlZgorMCwgICAgIDE0OTUwNCwgICAgIDE0OTUwNCwgICAgIDIwNDgsICAgICA4MTkyLCAweDQyYzhmOGJkCiswLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZDBlMmQ1YTMKKzAsICAgICAxNTM2MDAsICAgICAxNTM2MDAsICAgICAyMDQ4LCAgICAgODE5MiwgMHhjZjhmMDgyNgorMCwgICAgIDE1NTY0OCwgICAgIDE1NTY0OCwgICAgIDIwNDgsICAgICA4MTkyLCAweDE2NGNjOTYzCiswLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4YjE0ZGI0OWYKKzAsICAgICAxNTk3NDQsICAgICAxNTk3NDQsICAgICAyMDQ4LCAgICAgODE5MiwgMHgwZmU1MGRmNAorMCwgICAgIDE2MTc5MiwgICAgIDE2MTc5MiwgICAgIDIwNDgsICAgICA4MTkyLCAweDc2NjkyMDdhCiswLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4MmExNmYyM2IKKzAsICAgICAxNjU4ODgsICAgICAxNjU4ODgsICAgICAyMDQ4LCAgICAgODE5MiwgMHhjNjI5ZjY4NQorMCwgICAgIDE2NzkzNiwgICAgIDE2NzkzNiwgICAgIDIwNDgsICAgICA4MTkyLCAweDc5ZWUwMjk4CiswLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZjliZGYxNzkKKzAsICAgICAxNzIwMzIsICAgICAxNzIwMzIsICAgICAyMDQ4LCAgICAgODE5MiwgMHg1MjIwZDA0NworMCwgICAgIDE3NDA4MCwgICAgIDE3NDA4MCwgICAgIDIwNDgsICAgICA4MTkyLCAweDkxNWFlOGI3CiswLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4OGMyNmUzYWYKKzAsICAgICAxNzgxNzYsICAgICAxNzgxNzYsICAgICAyMDQ4LCAgICAgODE5MiwgMHg3MmU1YzY2MQorMCwgICAgIDE4MDIyNCwgICAgIDE4MDIyNCwgICAgIDIwNDgsICAgICA4MTkyLCAweGZjYTJkNzk1CiswLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4NjM2N2Y1YTkKKzAsICAgICAxODQzMjAsICAgICAxODQzMjAsICAgICAyMDQ4LCAgICAgODE5MiwgMHgzMmY4ZDBkMQorMCwgICAgIDE4NjM2OCwgICAgIDE4NjM2OCwgICAgIDIwNDgsICAgICA4MTkyLCAweDdhMDhjM2M3CiswLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZTJmMGZiNTUKKzAsICAgICAxOTA0NjQsICAgICAxOTA0NjQsICAgICAyMDQ4LCAgICAgODE5MiwgMHgzZmQ3MDZlOAorMCwgICAgIDE5MjUxMiwgICAgIDE5MjUxMiwgICAgIDIwNDgsICAgICA4MTkyLCAweGY1ODQ1Nzg2CiswLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4MmE4ZmRjYmQKKzAsICAgICAxOTY2MDgsICAgICAxOTY2MDgsICAgICAyMDQ4LCAgICAgODE5MiwgMHhhNzFmMDNmYworMCwgICAgIDE5ODY1NiwgICAgIDE5ODY1NiwgICAgIDIwNDgsICAgICA4MTkyLCAweGMxMjEwZGNlCiswLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4MGNkMjE4MDAKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAyMDQ4LCAgICAgODE5MiwgMHgyZThjZmI0NworMCwgICAgIDIwNDgwMCwgICAgIDIwNDgwMCwgICAgIDIwNDgsICAgICA4MTkyLCAweDJhYjgxNmVjCiswLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4YzJiNDAyNTYKKzAsICAgICAyMDg4OTYsICAgICAyMDg4OTYsICAgICAyMDQ4LCAgICAgODE5MiwgMHhmNzJkMDAxOAorMCwgICAgIDIxMDk0NCwgICAgIDIxMDk0NCwgICAgIDIwNDgsICAgICA4MTkyLCAweGM3ZTAxYjc2CiswLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4YmNmNTBhNDgKKzAsICAgICAyMTUwNDAsICAgICAyMTUwNDAsICAgICAyMDQ4LCAgICAgODE5MiwgMHgxMTAxZWMyMworMCwgICAgIDIxNzA4OCwgICAgIDIxNzA4OCwgICAgIDIwNDgsICAgICA4MTkyLCAweDA2NmExMTA4CiswLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZGE4MzFlMTIKKzAsICAgICAyMjExODQsICAgICAyMjExODQsICAgICAyMDQ4LCAgICAgODE5MiwgMHg5MmY5ZTY3NworMCwgICAgIDIyMzIzMiwgICAgIDIyMzIzMiwgICAgIDIwNDgsICAgICA4MTkyLCAweDM0MzlkYWYzCiswLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ZjgxMjY5NGEKKzAsICAgICAyMjczMjgsICAgICAyMjczMjgsICAgICAyMDQ4LCAgICAgODE5MiwgMHgzNzUxMDUxZQorMCwgICAgIDIyOTM3NiwgICAgIDIyOTM3NiwgICAgIDIwNDgsICAgICA4MTkyLCAweDlmNGNkZGRkCiswLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4YWU0YWQ0MGIKKzAsICAgICAyMzM0NzIsICAgICAyMzM0NzIsICAgICAyMDQ4LCAgICAgODE5MiwgMHg1NjllYzlkYgorMCwgICAgIDIzNTUyMCwgICAgIDIzNTUyMCwgICAgIDIwNDgsICAgICA4MTkyLCAweDIwNTZlNjgzCiswLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4ODRkOGNhZWYKKzAsICAgICAyMzk2MTYsICAgICAyMzk2MTYsICAgICAyMDQ4LCAgICAgODE5MiwgMHg5ZWVmZGY4MworMCwgICAgIDI0MTY2NCwgICAgIDI0MTY2NCwgICAgIDIwNDgsICAgICA4MTkyLCAweDRmZWVlMWMxCiswLCAgICAgMjQzNzEyLCAgICAgMjQzNzEyLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4NzJlNWM2NjEKKzAsICAgICAyNDU3NjAsICAgICAyNDU3NjAsICAgICAyMDQ4LCAgICAgODE5MiwgMHhmY2EyZDc5NQorMCwgICAgIDI0NzgwOCwgICAgIDI0NzgwOCwgICAgIDIwNDgsICAgICA4MTkyLCAweDYzNjdmNWE5CiswLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4MzJmOGQwZDEKKzAsICAgICAyNTE5MDQsICAgICAyNTE5MDQsICAgICAyMDQ4LCAgICAgODE5MiwgMHg3YTA4YzNjNworMCwgICAgIDI1Mzk1MiwgICAgIDI1Mzk1MiwgICAgIDIwNDgsICAgICA4MTkyLCAweGUyZjBmYjU1CiswLCAgICAgMjU2MDAwLCAgICAgMjU2MDAwLCAgICAgMjA0OCwgICAgIDgxOTIsIDB4M2ZkNzA2ZTgKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAyMDQ4LCAgICAgODE5MiwgMHhmNTg0NTc4NgorMCwgICAgIDI2MDA5NiwgICAgIDI2MDA5NiwgICAgIDIwNDgsICAgICA4MTkyLCAweDJhOGZkY2JkCiswLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgMjA0OCwgICAgIDgxOTIsIDB4YTcxZjAzZmMKKzAsICAgICAyNjQxOTIsICAgICAyNjQxOTIsICAgICAgNDA4LCAgICAgMTYzMiwgMHg1M2M0NDU4OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFuZXF1YWxpemVyIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFuZXF1YWxpemVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWQ4MzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYW5lcXVhbGl6ZXIKQEAgLTAsMCArMSwyNjUgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGUxYmY4ZTAKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMzE1ZjU2NAorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNkMGVmYTk4CiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWMxYmY2YjIKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNWI0ZmYwMgorMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI5YjFmNGI2CiswLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODZlOWY0MTEKKzAsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNmFhZmJkMworMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1ZDJmNjNmCiswLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQ5NWZkMTYKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZmIwZjAwOQorMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhNjMwMWM2CiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mjk5Y2ZiZDgKKzAsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYTdmZmU4YworMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNlYWNlNTA5CiswLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDA4NGZlZWMKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOTU2ZjYxMworMCwgICAgICAxNzQwOCwgICAgICAxNzQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY2MWRmYThjCiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmViY2Y1M2UKKzAsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NjAxZjlmMgorMCwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhNGJmMmQ5CiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjkxN2ZjMWQKKzAsICAgICAgMjI1MjgsICAgICAgMjI1MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NWNmZmJjYQorMCwgICAgICAyMzU1MiwgICAgICAyMzU1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgwZDlmNTA5CiswLCAgICAgIDI0NTc2LCAgICAgIDI0NTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTRhY2Y4OTgKKzAsICAgICAgMjU2MDAsICAgICAgMjU2MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NjE0ZjNjMAorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmMzcwMGRjCiswLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMwOGVmMjEKKzAsICAgICAgMjg2NzIsICAgICAgMjg2NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NzBkZjRmZQorMCwgICAgICAyOTY5NiwgICAgICAyOTY5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDk4ZDBmMjRmCiswLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWQzNjBiZTAKKzAsICAgICAgMzE3NDQsICAgICAgMzE3NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiZTEwZjFlYgorMCwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI1ZDBmYWMwCiswLCAgICAgIDMzNzkyLCAgICAgIDMzNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTRjMWY2NDkKKzAsICAgICAgMzQ4MTYsICAgICAgMzQ4MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzNjE3ZmI5YgorMCwgICAgICAzNTg0MCwgICAgICAzNTg0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NDBmNmU2CiswLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGNlOGZkZmEKKzAsICAgICAgMzc4ODgsICAgICAgMzc4ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkN2MxZjRiOAorMCwgICAgICAzODkxMiwgICAgICAzODkxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg2ZTlmNDExCiswLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzZhYWZiZDMKKzAsICAgICAgNDA5NjAsICAgICAgNDA5NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNWQyZjYzZgorMCwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFkOTVmZDE2CiswLCAgICAgIDQzMDA4LCAgICAgIDQzMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGZiMGYwMDkKKzAsICAgICAgNDQwMzIsICAgICAgNDQwMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNmRlNzQzZQorMCwgICAgICA0NTA1NiwgICAgICA0NTA1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU4NzhmNmUzCiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDBjM2ZkZjkKKzAsICAgICAgNDcxMDQsICAgICAgNDcxMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxOWRlZjc0NAorMCwgICAgICA0ODEyOCwgICAgICA0ODEyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDllM2QwMDE2CiswLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmQzYmZhZWUKKzAsICAgICAgNTAxNzYsICAgICAgNTAxNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYWU4MDBjOAorMCwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ2NTMwMDA3CiswLCAgICAgIDUyMjI0LCAgICAgIDUyMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2VjNmZhOTYKKzAsICAgICAgNTMyNDgsICAgICAgNTMyNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZjNkZjRjNAorMCwgICAgICA1NDI3MiwgICAgICA1NDI3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg1ODRmNTc0CiswLCAgICAgIDU1Mjk2LCAgICAgIDU1Mjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWEyMzExZTgKKzAsICAgICAgNTYzMjAsICAgICAgNTYzMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYzA0ZWQzOQorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRlZmMxZGNmCiswLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjYxMjAyOTcKKzAsICAgICAgNTkzOTIsICAgICAgNTkzOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMmRiMDYwMAorMCwgICAgICA2MDQxNiwgICAgICA2MDQxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU5MGNmYjM2CiswLCAgICAgIDYxNDQwLCAgICAgIDYxNDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDNkMmU3MzIKKzAsICAgICAgNjI0NjQsICAgICAgNjI0NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMGIxZWVjYgorMCwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg5ZTZmMGY4CiswLCAgICAgIDY0NTEyLCAgICAgIDY0NTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTZjM2ZkZTYKKzAsICAgICAgNjU1MzYsICAgICAgNjU1MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDNlZjMyMAorMCwgICAgICA2NjU2MCwgICAgICA2NjU2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4MGJlYmExCiswLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGE2ZWY2NDEKKzAsICAgICAgNjg2MDgsICAgICAgNjg2MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MTZkZjJkMgorMCwgICAgICA2OTYzMiwgICAgICA2OTYzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwMmJmNzQyCiswLCAgICAgIDcwNjU2LCAgICAgIDcwNjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjM2ZjA2NzYKKzAsICAgICAgNzE2ODAsICAgICAgNzE2ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTFmZWY4MQorMCwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzMGQwM2MyCiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzhjN2VjN2UKKzAsICAgICAgNzQ3NTIsICAgICAgNzQ3NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1N2FhZjA4ZQorMCwgICAgICA3NTc3NiwgICAgICA3NTc3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGYzNWMwMzRlCiswLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTUyMTIwZTEKKzAsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZDBmZmU3YworMCwgICAgICA3ODg0OCwgICAgICA3ODg0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc2YTQwMjY0CiswLCAgICAgIDc5ODcyLCAgICAgIDc5ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2RhYWU3M2MKKzAsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMmJmZWJiOAorMCwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJmYWQwYWVmCiswLCAgICAgIDgyOTQ0LCAgICAgIDgyOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWYzZDFlMzUKKzAsICAgICAgODM5NjgsICAgICAgODM5NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNTc3ZjcwYgorMCwgICAgICA4NDk5MiwgICAgICA4NDk5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDczMzBmZjQ0CiswLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmMxMGY3OTQKKzAsICAgICAgODcwNDAsICAgICAgODcwNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmODgzZmY1MworMCwgICAgICA4ODA2NCwgICAgICA4ODA2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRkOTFmNjY0CiswLCAgICAgIDg5MDg4LCAgICAgIDg5MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2JiY2Y5NGEKKzAsICAgICAgOTAxMTIsICAgICAgOTAxMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MjQzZGE1YQorMCwgICAgICA5MTEzNiwgICAgICA5MTEzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM5ZjJiNTEwCiswLCAgICAgIDkyMTYwLCAgICAgIDkyMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDQ1ZGFlZTkKKzAsICAgICAgOTMxODQsICAgICAgOTMxODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMDQwY2JlNworMCwgICAgICA5NDIwOCwgICAgICA5NDIwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3NTVkYjYxCiswLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MmEyYmRiMzkKKzAsICAgICAgOTYyNTYsICAgICAgOTYyNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMTgwZmFmNworMCwgICAgICA5NzI4MCwgICAgICA5NzI4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwNWJmM2IzCiswLCAgICAgIDk4MzA0LCAgICAgIDk4MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWU4NGM2YTEKKzAsICAgICAgOTkzMjgsICAgICAgOTkzMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDVlYzcxYgorMCwgICAgIDEwMDM1MiwgICAgIDEwMDM1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGY3ODhlODU2CiswLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODg0ZmU2YjQKKzAsICAgICAxMDI0MDAsICAgICAxMDI0MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNDc0ZWYyZgorMCwgICAgIDEwMzQyNCwgICAgIDEwMzQyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhlYTJlM2UzCiswLCAgICAgMTA0NDQ4LCAgICAgMTA0NDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzJlMmJhMDMKKzAsICAgICAxMDU0NzIsICAgICAxMDU0NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZTYyZTJiZQorMCwgICAgIDEwNjQ5NiwgICAgIDEwNjQ5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ5YzFhMzg3CiswLCAgICAgMTA3NTIwLCAgICAgMTA3NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjkyM2U5YzgKKzAsICAgICAxMDg1NDQsICAgICAxMDg1NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMGUyZWY3MworMCwgICAgIDEwOTU2OCwgICAgIDEwOTU2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRjNjZmMDM3CiswLCAgICAgMTEwNTkyLCAgICAgMTEwNTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGM1ZGRiNjUKKzAsICAgICAxMTE2MTYsICAgICAxMTE2MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZGM1ZTZkYworMCwgICAgIDExMjY0MCwgICAgIDExMjY0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDJjMmFmYTQ4CiswLCAgICAgMTEzNjY0LCAgICAgMTEzNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmUxY2VmYWIKKzAsICAgICAxMTQ2ODgsICAgICAxMTQ2ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNzYxZDliMQorMCwgICAgIDExNTcxMiwgICAgIDExNTcxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFjMWFmNTE5CiswLCAgICAgMTE2NzM2LCAgICAgMTE2NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQzZTA0NTUKKzAsICAgICAxMTc3NjAsICAgICAxMTc3NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYThiZGFlYworMCwgICAgIDExODc4NCwgICAgIDExODc4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFjODkwZGQ3CiswLCAgICAgMTE5ODA4LCAgICAgMTE5ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDAxMDIzZWMKKzAsICAgICAxMjA4MzIsICAgICAxMjA4MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNjA4ZmEwNworMCwgICAgIDEyMTg1NiwgICAgIDEyMTg1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEwMWJkY2ViCiswLCAgICAgMTIyODgwLCAgICAgMTIyODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWI2ZTA0MjgKKzAsICAgICAxMjM5MDQsICAgICAxMjM5MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OTliZmZjOQorMCwgICAgIDEyNDkyOCwgICAgIDEyNDkyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDcyMDBkNmVhCiswLCAgICAgMTI1OTUyLCAgICAgMTI1OTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjBlY2U5MzMKKzAsICAgICAxMjY5NzYsICAgICAxMjY5NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZDEzMDVhZAorMCwgICAgIDEyODAwMCwgICAgIDEyODAwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY5MzJlMjM0CiswLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yzg4ZGZjNTMKKzAsICAgICAxMzAwNDgsICAgICAxMzAwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlY2FhZmQzMgorMCwgICAgIDEzMTA3MiwgICAgIDEzMTA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2ODNlZWM0CiswLCAgICAgMTMyMDk2LCAgICAgMTMyMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDFhNDA4NzcKKzAsICAgICAxMzMxMjAsICAgICAxMzMxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OGFmZmRiOQorMCwgICAgIDEzNDE0NCwgICAgIDEzNDE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNkNTAwNDlhCiswLCAgICAgMTM1MTY4LCAgICAgMTM1MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjhjM2U2NGEKKzAsICAgICAxMzYxOTIsICAgICAxMzYxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNzdlZmY4MworMCwgICAgIDEzNzIxNiwgICAgIDEzNzIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDc3OGVmMWQ3CiswLCAgICAgMTM4MjQwLCAgICAgMTM4MjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODYzMjAxNmMKKzAsICAgICAxMzkyNjQsICAgICAxMzkyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMTNmZjc0ZAorMCwgICAgIDE0MDI4OCwgICAgIDE0MDI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDhhNDEwMTQ0CiswLCAgICAgMTQxMzEyLCAgICAgMTQxMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjFmODAzMmMKKzAsICAgICAxNDIzMzYsICAgICAxNDIzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZWE5ZjMwNQorMCwgICAgIDE0MzM2MCwgICAgIDE0MzM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA4YmVlZDUyCiswLCAgICAgMTQ0Mzg0LCAgICAgMTQ0Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTYyZTA1OTkKKzAsICAgICAxNDU0MDgsICAgICAxNDU0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYmMxZjljYgorMCwgICAgIDE0NjQzMiwgICAgIDE0NjQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBhM2NmMzdjCiswLCAgICAgMTQ3NDU2LCAgICAgMTQ3NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWQ4NGVhZWMKKzAsICAgICAxNDg0ODAsICAgICAxNDg0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZWNhZmI4MgorMCwgICAgIDE0OTUwNCwgICAgIDE0OTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDM4OThmOWY5CiswLCAgICAgMTUwNTI4LCAgICAgMTUwNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmU5NWY2MjYKKzAsICAgICAxNTE1NTIsICAgICAxNTE1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyYmQwMTI5MAorMCwgICAgIDE1MjU3NiwgICAgIDE1MjU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzY2NmOWNjCiswLCAgICAgMTUzNjAwLCAgICAgMTUzNjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQ2NTEwYTcKKzAsICAgICAxNTQ2MjQsICAgICAxNTQ2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzU4ZjVlYworMCwgICAgIDE1NTY0OCwgICAgIDE1NTY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUxNjNmMmY3CiswLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjA4Y2Y2MjUKKzAsICAgICAxNTc2OTYsICAgICAxNTc2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwZTdlZTUyOQorMCwgICAgIDE1ODcyMCwgICAgIDE1ODcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgyZmVmNzcyCiswLCAgICAgMTU5NzQ0LCAgICAgMTU5NzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmNhZGZkMWEKKzAsICAgICAxNjA3NjgsICAgICAxNjA3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiODQ5MTRlMQorMCwgICAgIDE2MTc5MiwgICAgIDE2MTc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGFlOWRlNzhlCiswLCAgICAgMTYyODE2LCAgICAgMTYyODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTdhZmRkNGQKKzAsICAgICAxNjM4NDAsICAgICAxNjM4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZjQxZTFhYworMCwgICAgIDE2NDg2NCwgICAgIDE2NDg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA3YjIwMTllCiswLCAgICAgMTY1ODg4LCAgICAgMTY1ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJhOWY5MjMKKzAsICAgICAxNjY5MTIsICAgICAxNjY5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMjg0ZjEwYgorMCwgICAgIDE2NzkzNiwgICAgIDE2NzkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhM2ZmYTQwCiswLCAgICAgMTY4OTYwLCAgICAgMTY4OTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWVlN2U4YmQKKzAsICAgICAxNjk5ODQsICAgICAxNjk5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNDA5ZTJmMworMCwgICAgIDE3MTAwOCwgICAgIDE3MTAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI2ZjNmNWZmCiswLCAgICAgMTcyMDMyLCAgICAgMTcyMDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE4OWVjYTUKKzAsICAgICAxNzMwNTYsICAgICAxNzMwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YTQ5ZjI5MworMCwgICAgIDE3NDA4MCwgICAgIDE3NDA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDlkNDUwNmY3CiswLCAgICAgMTc1MTA0LCAgICAgMTc1MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGNhMmYwNzUKKzAsICAgICAxNzYxMjgsICAgICAxNzYxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YmViMDYzZgorMCwgICAgIDE3NzE1MiwgICAgIDE3NzE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGUyYjFlOGEwCiswLCAgICAgMTc4MTc2LCAgICAgMTc4MTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2M3N2ZiZDAKKzAsICAgICAxNzkyMDAsICAgICAxNzkyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YzkzZjk1NgorMCwgICAgIDE4MDIyNCwgICAgIDE4MDIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRiMjhmYjY5CiswLCAgICAgMTgxMjQ4LCAgICAgMTgxMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTQ5YWZjMzkKKzAsICAgICAxODIyNzIsICAgICAxODIyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2MGU5MDRiNQorMCwgICAgIDE4MzI5NiwgICAgIDE4MzI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJiNjdlYmJjCiswLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzFlNGNhMmIKKzAsICAgICAxODUzNDQsICAgICAxODUzNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkY2I4ZTU1MAorMCwgICAgIDE4NjM2OCwgICAgIDE4NjM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU3MGJmZTVkCiswLCAgICAgMTg3MzkyLCAgICAgMTg3MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWRhM2Y0ZDQKKzAsICAgICAxODg0MTYsICAgICAxODg0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZTlmMDRmNgorMCwgICAgIDE4OTQ0MCwgICAgIDE4OTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY5NjBmM2NkCiswLCAgICAgMTkwNDY0LCAgICAgMTkwNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTZiN2ZjNDIKKzAsICAgICAxOTE0ODgsICAgICAxOTE0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiOGI5ZjFlMgorMCwgICAgIDE5MjUxMiwgICAgIDE5MjUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUyMGRkODE0CiswLCAgICAgMTkzNTM2LCAgICAgMTkzNTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDBmMzAyMTIKKzAsICAgICAxOTQ1NjAsICAgICAxOTQ1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Mjk4ZjYxMAorMCwgICAgIDE5NTU4NCwgICAgIDE5NTU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYwZDlmNDdmCiswLCAgICAgMTk2NjA4LCAgICAgMTk2NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTA2M2Y0YzQKKzAsICAgICAxOTc2MzIsICAgICAxOTc2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OTEwZjRiZgorMCwgICAgIDE5ODY1NiwgICAgIDE5ODY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhjMjdlYzI0CiswLCAgICAgMTk5NjgwLCAgICAgMTk5NjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjgwMzA1MmEKKzAsICAgICAyMDA3MDQsICAgICAyMDA3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlMzFiMTUwNworMCwgICAgIDIwMTcyOCwgICAgIDIwMTcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjYTMwYmJmCiswLCAgICAgMjAyNzUyLCAgICAgMjAyNzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjY1OWYyNzIKKzAsICAgICAyMDM3NzYsICAgICAyMDM3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NGMwZmMwNQorMCwgICAgIDIwNDgwMCwgICAgIDIwNDgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc0MjdlYmVjCiswLCAgICAgMjA1ODI0LCAgICAgMjA1ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjY1MmZkMGMKKzAsICAgICAyMDY4NDgsICAgICAyMDY4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhNmM5ZjQ5NAorMCwgICAgIDIwNzg3MiwgICAgIDIwNzg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0MjlmZWYzCiswLCAgICAgMjA4ODk2LCAgICAgMjA4ODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmJkNWY4ZTMKKzAsICAgICAyMDk5MjAsICAgICAyMDk5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4Yjc0ZWVkNAorMCwgICAgIDIxMDk0NCwgICAgIDIxMDk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYyMWNmYWMxCiswLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDU1ZWZjNWYKKzAsICAgICAyMTI5OTIsICAgICAyMTI5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzMzRlZmMwZgorMCwgICAgIDIxNDAxNiwgICAgIDIxNDAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI5ZTdmYzE2CiswLCAgICAgMjE1MDQwLCAgICAgMjE1MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjBmOTA0YzAKKzAsICAgICAyMTYwNjQsICAgICAyMTYwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhZWMzZWJiYgorMCwgICAgIDIxNzA4OCwgICAgIDIxNzA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMxZTRjYTJiCiswLCAgICAgMjE4MTEyLCAgICAgMjE4MTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGNiOGU1NTAKKzAsICAgICAyMTkxMzYsICAgICAyMTkxMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNzBiZmU1ZAorMCwgICAgIDIyMDE2MCwgICAgIDIyMDE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVkYTNmNGQ0CiswLCAgICAgMjIxMTg0LCAgICAgMjIxMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmU5ZjA0ZjYKKzAsICAgICAyMjIyMDgsICAgICAyMjIyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmOTYwZjNjZAorMCwgICAgIDIyMzIzMiwgICAgIDIyMzIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU2YjdmYzQyCiswLCAgICAgMjI0MjU2LCAgICAgMjI0MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjhiOWYxZTIKKzAsICAgICAyMjUyODAsICAgICAyMjUyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MjBkZDgxNAorMCwgICAgIDIyNjMwNCwgICAgIDIyNjMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwZjMwMjEyCiswLCAgICAgMjI3MzI4LCAgICAgMjI3MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODI5OGY2MTAKKzAsICAgICAyMjgzNTIsICAgICAyMjgzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMGQ5ZjQ3ZgorMCwgICAgIDIyOTM3NiwgICAgIDIyOTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwNjNmNGM0CiswLCAgICAgMjMwNDAwLCAgICAgMjMwNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjkxMGY0YmYKKzAsICAgICAyMzE0MjQsICAgICAyMzE0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YzI3ZWMyNAorMCwgICAgIDIzMjQ0OCwgICAgIDIzMjQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY4MDMwNTJhCiswLCAgICAgMjMzNDcyLCAgICAgMjMzNDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTMxYjE1MDcKKzAsICAgICAyMzQ0OTYsICAgICAyMzQ0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwY2EzMGJiZgorMCwgICAgIDIzNTUyMCwgICAgIDIzNTUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI2NTlmMjcyCiswLCAgICAgMjM2NTQ0LCAgICAgMjM2NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTRjMGZjMDUKKzAsICAgICAyMzc1NjgsICAgICAyMzc1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NDI3ZWJlYworMCwgICAgIDIzODU5MiwgICAgIDIzODU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI2NTJmZDBjCiswLCAgICAgMjM5NjE2LCAgICAgMjM5NjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTZjOWY0OTQKKzAsICAgICAyNDA2NDAsICAgICAyNDA2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNDI5ZmVmMworMCwgICAgIDI0MTY2NCwgICAgIDI0MTY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJiZDVmOGUzCiswLCAgICAgMjQyNjg4LCAgICAgMjQyNjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI3NGVlZDQKKzAsICAgICAyNDM3MTIsICAgICAyNDM3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMjFjZmFjMQorMCwgICAgIDI0NDczNiwgICAgIDI0NDczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1NWVmYzVmCiswLCAgICAgMjQ1NzYwLCAgICAgMjQ1NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzM0ZWZjMGYKKzAsICAgICAyNDY3ODQsICAgICAyNDY3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOWU3ZmMxNgorMCwgICAgIDI0NzgwOCwgICAgIDI0NzgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGYwZjkwNGMwCiswLCAgICAgMjQ4ODMyLCAgICAgMjQ4ODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWVjM2ViYmIKKzAsICAgICAyNDk4NTYsICAgICAyNDk4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMWU0Y2EyYgorMCwgICAgIDI1MDg4MCwgICAgIDI1MDg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRjYjhlNTUwCiswLCAgICAgMjUxOTA0LCAgICAgMjUxOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTcwYmZlNWQKKzAsICAgICAyNTI5MjgsICAgICAyNTI5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZGEzZjRkNAorMCwgICAgIDI1Mzk1MiwgICAgIDI1Mzk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGZlOWYwNGY2CiswLCAgICAgMjU0OTc2LCAgICAgMjU0OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Zjk2MGYzY2QKKzAsICAgICAyNTYwMDAsICAgICAyNTYwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNmI3ZmM0MgorMCwgICAgIDI1NzAyNCwgICAgIDI1NzAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI4YjlmMWUyCiswLCAgICAgMjU4MDQ4LCAgICAgMjU4MDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTIwZGQ4MTQKKzAsICAgICAyNTkwNzIsICAgICAyNTkwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMGYzMDIxMgorMCwgICAgIDI2MDA5NiwgICAgIDI2MDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDgyOThmNjEwCiswLCAgICAgMjYxMTIwLCAgICAgMjYxMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjBkOWY0N2YKKzAsICAgICAyNjIxNDQsICAgICAyNjIxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDYzZjRjNAorMCwgICAgIDI2MzE2OCwgICAgIDI2MzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY5MTBmNGJmCiswLCAgICAgMjY0MTkyLCAgICAgMjY0MTkyLCAgICAgIDQwOCwgICAgIDE2MzIsIDB4ZTZkMDMyYzgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hcGFkIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFwYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJmNjYyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hcGFkCkBAIC0wLDAgKzEsMjY2IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI5ZTNlZWNmCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTgzOTBiOTYKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNDc3ZmE5OQorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDNiYzBmMTRmCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjM3OWVkOTEKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZDZhMDA3MAorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBiMDFmNGNmCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjcxNmZkOTMKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODQwZjI1YgorMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDljMWZmYWYxCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2JlZGVmYWYKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZTA1MDM5MAorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGIzMGUwMDkwCiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjZiOGY3NWIKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNzA2ZTMxMQorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDBjNDgwMTM4CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmM5YTAyMTYKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YWJjZTU0ZgorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRhNDVmNjNmCiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTBkNWZmODcKKzAsICAgICAgMjA0ODAsICAgICAgMjA0ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1OWJlMDM1MgorMCwgICAgICAyMTUwNCwgICAgICAyMTUwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE2MWFmMDc3CiswLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODRjNGZjMDcKKzAsICAgICAgMjM1NTIsICAgICAgMjM1NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YTM1ZjM0NQorMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJiNjVmYTgxCiswLCAgICAgIDI1NjAwLCAgICAgIDI1NjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjZjN2Y1ZTUKKzAsICAgICAgMjY2MjQsICAgICAgMjY2MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMzI3MDEzOAorMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ3ODJlZDUzCiswLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTMwOGYwNTUKKzAsICAgICAgMjk2OTYsICAgICAgMjk2OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZDMzZjk3ZAorMCwgICAgICAzMDcyMCwgICAgICAzMDcyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI4YjAwZGQ0CiswLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2ZmN2VmYWIKKzAsICAgICAgMzI3NjgsICAgICAgMzI3NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOWUzZWVjZgorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4MzkwYjk2CiswLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzQ3N2ZhOTkKKzAsICAgICAgMzU4NDAsICAgICAgMzU4NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYmMwZjE0ZgorMCwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzNzllZDkxCiswLCAgICAgIDM3ODg4LCAgICAgIDM3ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmQ2YTAwNzAKKzAsICAgICAgMzg5MTIsICAgICAgMzg5MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYjAxZjRjZgorMCwgICAgICAzOTkzNiwgICAgICAzOTkzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY3MTZmZDkzCiswLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg0MGYyNWIKKzAsICAgICAgNDE5ODQsICAgICAgNDE5ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YzFmZmFmMQorMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNiZWRlZmFmCiswLCAgICAgIDQ0MDMyLCAgICAgIDQ0MDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGEzN2Q2OTEKKzAsICAgICAgNDUwNTYsICAgICAgNDUwNTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MTkzZWNiZgorMCwgICAgICA0NjA4MCwgICAgICA0NjA4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZlNGEwYTM2CiswLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjFjZmU3MGQKKzAsICAgICAgNDgxMjgsICAgICAgNDgxMjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjMTlmZmExNQorMCwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdiMzJmYjNkCiswLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGFjZWZkM2YKKzAsICAgICAgNTEyMDAsICAgICAgNTEyMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzOTY0ZjY0ZAorMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRjZjJlZGFkCiswLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTM2N2Y2OWIKKzAsICAgICAgNTQyNzIsICAgICAgNTQyNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkNGM2ZjdiOQorMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDllMDQxMTg2CiswLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTkzOWVkZDcKKzAsICAgICAgNTczNDQsICAgICAgNTczNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhOTMyMzM2YQorMCwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmNTEwZTI4CiswLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGI4NTAxYzgKKzAsICAgICAgNjA0MTYsICAgICAgNjA0MTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYmMzMDI1MAorMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVlN2ZkODU1CiswLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGVmMWYyNjUKKzAsICAgICAgNjM0ODgsICAgICAgNjM0ODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5Zjc2MDFjMgorMCwgICAgICA2NDUxMiwgICAgICA2NDUxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGI0MDBmMGI3CiswLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGM5MWUxMGIKKzAsICAgICAgNjY1NjAsICAgICAgNjY1NjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzZjQxZmU2MQorMCwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc0ZmZmOWI5CiswLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MThiYmY1YTUKKzAsICAgICAgNjk2MzIsICAgICAgNjk2MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MWE3MDE4MAorMCwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI5ZjNlOGM1CiswLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTYyZWZkYjkKKzAsICAgICAgNzI3MDQsICAgICAgNzI3MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMmUwMDZlMAorMCwgICAgICA3MzcyOCwgICAgICA3MzcyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGExYmZmNTQxCiswLCAgICAgIDc0NzUyLCAgICAgIDc0NzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDk1YjAwMTIKKzAsICAgICAgNzU3NzYsICAgICAgNzU3NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOTNlMDkxMgorMCwgICAgICA3NjgwMCwgICAgICA3NjgwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZjMmExZDg4CiswLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjRkOGZiOGIKKzAsICAgICAgNzg4NDgsICAgICAgNzg4NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMTRiMDQ5MgorMCwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDFjN2JlN2I3CiswLCAgICAgIDgwODk2LCAgICAgIDgwODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzE4MWY4NzcKKzAsICAgICAgODE5MjAsICAgICAgODE5MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiYTEzMmQxNAorMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFiYWUyZDlhCiswLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjA3ZmZmMTUKKzAsICAgICAgODQ5OTIsICAgICAgODQ5OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMGMxZmYyZAorMCwgICAgICA4NjAxNiwgICAgICA4NjAxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE5ZjdmZDFmCiswLCAgICAgIDg3MDQwLCAgICAgIDg3MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2I2ZDExYTQKKzAsICAgICAgODgwNjQsICAgICAgODgwNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNjZhYzhiNworMCwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU2OGRkYThmCiswLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTQ1N2I1MDUKKzAsICAgICAgOTExMzYsICAgICAgOTExMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYTI1YTQwOQorMCwgICAgICA5MjE2MCwgICAgICA5MjE2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDViNWQ5ZDNiCiswLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTYxZWIxM2QKKzAsICAgICAgOTQyMDgsICAgICAgOTQyMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhYzkzYjY2ZgorMCwgICAgICA5NTIzMiwgICAgICA5NTIzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3YWViMzNmCiswLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTJjY2NmYjUKKzAsICAgICAgOTcyODAsICAgICAgOTcyODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ZTRjZjQ4NworMCwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE5YzA3ZjM1CiswLCAgICAgIDk5MzI4LCAgICAgIDk5MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjNlY2QzNGYKKzAsICAgICAxMDAzNTIsICAgICAxMDAzNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxMjJhZWM1MworMCwgICAgIDEwMTM3NiwgICAgIDEwMTM3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY1ODFjMGFkCiswLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjQwZWRiMTUKKzAsICAgICAxMDM0MjQsICAgICAxMDM0MjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDY2YzY2ZgorMCwgICAgIDEwNDQ0OCwgICAgIDEwNDQ0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDA2OWU5ZDM1CiswLCAgICAgMTA1NDcyLCAgICAgMTA1NDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM5ZmQwZTkKKzAsICAgICAxMDY0OTYsICAgICAxMDY0OTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MjQ2ODY2NworMCwgICAgIDEwNzUyMCwgICAgIDEwNzUyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZlNmRkMDJiCiswLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTNlZGNlMzMKKzAsICAgICAxMDk1NjgsICAgICAxMDk1NjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjZGZiZDUxOQorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg0NjNmMmJiCiswLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWNhNmY4NjkKKzAsICAgICAxMTI2NDAsICAgICAxMTI2NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwOTlhMDM5OAorMCwgICAgIDExMzY2NCwgICAgIDExMzY2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGE3ZmExMGYwCiswLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjhjYWRkZDMKKzAsICAgICAxMTU3MTIsICAgICAxMTU3MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0ODUyZWY4YgorMCwgICAgIDExNjczNiwgICAgIDExNjczNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDAyNTBlZTdiCiswLCAgICAgMTE3NzYwLCAgICAgMTE3NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTU4M2RhMjEKKzAsICAgICAxMTg3ODQsICAgICAxMTg3ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MzY1ZmIzMworMCwgICAgIDExOTgwOCwgICAgIDExOTgwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI4YzgyMDY2CiswLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTQ2NTBiZTQKKzAsICAgICAxMjE4NTYsICAgICAxMjE4NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjIxZjhlYgorMCwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNkODhmNDU1CiswLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjZhOWVmYWYKKzAsICAgICAxMjQ5MjgsICAgICAxMjQ5MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1NTAwYzZlZAorMCwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBlZTBjNjJkCiswLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzRkMzA3NjIKKzAsICAgICAxMjgwMDAsICAgICAxMjgwMDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YzBkZWM5ZgorMCwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc5MDAxMWQ4CiswLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Yjc2YTExMzYKKzAsICAgICAxMzEwNzIsICAgICAxMzEwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ZGRkZmVhNworMCwgICAgIDEzMjA5NiwgICAgIDEzMjA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmYTNlZDQ5CiswLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzEyOWY1NGUKKzAsICAgICAxMzQxNDQsICAgICAxMzQxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YTg2ZjA3NworMCwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM5ZWVmMjA5CiswLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzJkNDAyOWIKKzAsICAgICAxMzcyMTYsICAgICAxMzcyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4ZWMyMDU5MAorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ0OGYxOGVkCiswLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDgwN2VhZGMKKzAsICAgICAxNDAyODgsICAgICAxNDAyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZTJiZWEwOQorMCwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkzN2FmMTJlCiswLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGVkYmYzMDMKKzAsICAgICAxNDMzNjAsICAgICAxNDMzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYzc1ZGY4OAorMCwgICAgIDE0NDM4NCwgICAgIDE0NDM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NDVmZmQ2CiswLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjBlODE1MGMKKzAsICAgICAxNDY0MzIsICAgICAxNDY0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZWE3ZWVlZgorMCwgICAgIDE0NzQ1NiwgICAgIDE0NzQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRjN2VmYTIxCiswLCAgICAgMTQ4NDgwLCAgICAgMTQ4NDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5N2UzMGUKKzAsICAgICAxNDk1MDQsICAgICAxNDk1MDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNTA0MDIyOAorMCwgICAgIDE1MDUyOCwgICAgIDE1MDUyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDYyODNmNzhjCiswLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTcxMDAxNDAKKzAsICAgICAxNTI1NzYsICAgICAxNTI1NzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5ZWE2ZjliMgorMCwgICAgIDE1MzYwMCwgICAgIDE1MzYwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVmMGUxNTYzCiswLCAgICAgMTU0NjI0LCAgICAgMTU0NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTEwYmYxOGUKKzAsICAgICAxNTU2NDgsICAgICAxNTU2NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZjRmZTQyNQorMCwgICAgIDE1NjY3MiwgICAgIDE1NjY3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwN2FmM2MwCiswLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmYxNGRkYzYKKzAsICAgICAxNTg3MjAsICAgICAxNTg3MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODcxZWQ2OQorMCwgICAgIDE1OTc0NCwgICAgIDE1OTc0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGMzNDllZjlmCiswLCAgICAgMTYwNzY4LCAgICAgMTYwNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NGUyYzE4MzQKKzAsICAgICAxNjE3OTIsICAgICAxNjE3OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzgzZmUwNAorMCwgICAgIDE2MjgxNiwgICAgIDE2MjgxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY2MjZmNDE1CiswLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjgzYmUzNzkKKzAsICAgICAxNjQ4NjQsICAgICAxNjQ4NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNzZjMGNlYgorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEwYjgwNDBmCiswLCAgICAgMTY2OTEyLCAgICAgMTY2OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjUzNWViNmQKKzAsICAgICAxNjc5MzYsICAgICAxNjc5MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlYjE4MGJiNQorMCwgICAgIDE2ODk2MCwgICAgIDE2ODk2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJjNWNmMDU5CiswLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg2MmYxYWMKKzAsICAgICAxNzEwMDgsICAgICAxNzEwMDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5Y2MyZWEyYgorMCwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJiOWFlNzU0CiswLCAgICAgMTczMDU2LCAgICAgMTczMDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzE2ZGViYjUKKzAsICAgICAxNzQwODAsICAgICAxNzQwODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZjNhZmYyYQorMCwgICAgIDE3NTEwNCwgICAgIDE3NTEwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc1NWRmYTVjCiswLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2I4MzA2MDUKKzAsICAgICAxNzcxNTIsICAgICAxNzcxNTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMDMwZGM5ZQorMCwgICAgIDE3ODE3NiwgICAgIDE3ODE3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIwMTdmZDU0CiswLCAgICAgMTc5MjAwLCAgICAgMTc5MjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWM3ZGZhMmUKKzAsICAgICAxODAyMjQsICAgICAxODAyMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3ODg3ZTU5OQorMCwgICAgIDE4MTI0OCwgICAgIDE4MTI0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI3MzBlNzJmCiswLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmJiM2ZhZTQKKzAsICAgICAxODMyOTYsICAgICAxODMyOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYzA4ZmMzNgorMCwgICAgIDE4NDMyMCwgICAgIDE4NDMyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVhZmQ5ZWMyCiswLCAgICAgMTg1MzQ0LCAgICAgMTg1MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTFkM2U4M2QKKzAsICAgICAxODYzNjgsICAgICAxODYzNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3Zjk2MDEzYworMCwgICAgIDE4NzM5MiwgICAgIDE4NzM5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhMGFmZTMxCiswLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTM3ZDE3MDEKKzAsICAgICAxODk0NDAsICAgICAxODk0NDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NjE1ZWJjMgorMCwgICAgIDE5MDQ2NCwgICAgIDE5MDQ2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDIxNzAwNWMxCiswLCAgICAgMTkxNDg4LCAgICAgMTkxNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTc1NWY3ODkKKzAsICAgICAxOTI1MTIsICAgICAxOTI1MTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4M2U2ZGI2NQorMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDkyYWIxNDQ3CiswLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWRiZGYzODMKKzAsICAgICAxOTU1ODQsICAgICAxOTU1ODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzE2ZjZhOQorMCwgICAgIDE5NjYwOCwgICAgIDE5NjYwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFhNmEwYjRjCiswLCAgICAgMTk3NjMyLCAgICAgMTk3NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGZkODA5YjcKKzAsICAgICAxOTg2NTYsICAgICAxOTg2NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxZDJjZjVmMQorMCwgICAgIDE5OTY4MCwgICAgIDE5OTY4MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGQzNjZmNGExCiswLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmEyZjg2ZTAKKzAsICAgICAyMDE3MjgsICAgICAyMDE3MjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmNTFmMDhhOQorMCwgICAgIDIwMjc1MiwgICAgIDIwMjc1MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA1ZWRlZmE4CiswLCAgICAgMjAzNzc2LCAgICAgMjAzNzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjU1ZGYyYTYKKzAsICAgICAyMDQ4MDAsICAgICAyMDQ4MDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlODgxZDllNAorMCwgICAgIDIwNTgyNCwgICAgIDIwNTgyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwMzgwNTIzCiswLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGI5M2ViMjYKKzAsICAgICAyMDc4NzIsICAgICAyMDc4NzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NTljZjk0YworMCwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDg0NzRmNTkxCiswLCAgICAgMjA5OTIwLCAgICAgMjA5OTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAzMGRjOWUKKzAsICAgICAyMTA5NDQsICAgICAyMTA5NDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMDE3ZmQ1NAorMCwgICAgIDIxMTk2OCwgICAgIDIxMTk2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDVjN2RmYTJlCiswLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Nzg4N2U1OTkKKzAsICAgICAyMTQwMTYsICAgICAyMTQwMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiNzMwZTcyZgorMCwgICAgIDIxNTA0MCwgICAgIDIxNTA0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZiYjNmYWU0CiswLCAgICAgMjE2MDY0LCAgICAgMjE2MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2MwOGZjMzYKKzAsICAgICAyMTcwODgsICAgICAyMTcwODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YWZkOWVjMgorMCwgICAgIDIxODExMiwgICAgIDIxODExMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGExZDNlODNkCiswLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2Y5NjAxM2MKKzAsICAgICAyMjAxNjAsICAgICAyMjAxNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YTBhZmUzMQorMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzN2QxNzAxCiswLCAgICAgMjIyMjA4LCAgICAgMjIyMjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDYxNWViYzIKKzAsICAgICAyMjMyMzIsICAgICAyMjMyMzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMTcwMDVjMQorMCwgICAgIDIyNDI1NiwgICAgIDIyNDI1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE3NTVmNzg5CiswLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODNlNmRiNjUKKzAsICAgICAyMjYzMDQsICAgICAyMjYzMDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5MmFiMTQ0NworMCwgICAgIDIyNzMyOCwgICAgIDIyNzMyOCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVkYmRmMzgzCiswLCAgICAgMjI4MzUyLCAgICAgMjI4MzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDMxNmY2YTkKKzAsICAgICAyMjkzNzYsICAgICAyMjkzNzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxYTZhMGI0YworMCwgICAgIDIzMDQwMCwgICAgIDIzMDQwMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGRmZDgwOWI3CiswLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWQyY2Y1ZjEKKzAsICAgICAyMzI0NDgsICAgICAyMzI0NDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkMzY2ZjRhMQorMCwgICAgIDIzMzQ3MiwgICAgIDIzMzQ3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDZhMmY4NmUwCiswLCAgICAgMjM0NDk2LCAgICAgMjM0NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjUxZjA4YTkKKzAsICAgICAyMzU1MjAsICAgICAyMzU1MjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNWVkZWZhOAorMCwgICAgIDIzNjU0NCwgICAgIDIzNjU0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1NWRmMmE2CiswLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZTg4MWQ5ZTQKKzAsICAgICAyMzg1OTIsICAgICAyMzg1OTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MDM4MDUyMworMCwgICAgIDIzOTYxNiwgICAgIDIzOTYxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDhiOTNlYjI2CiswLCAgICAgMjQwNjQwLCAgICAgMjQwNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzU5Y2Y5NGMKKzAsICAgICAyNDE2NjQsICAgICAyNDE2NjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NDc0ZjU5MQorMCwgICAgIDI0MjY4OCwgICAgIDI0MjY4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMzBkYzllCiswLCAgICAgMjQzNzEyLCAgICAgMjQzNzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjAxN2ZkNTQKKzAsICAgICAyNDQ3MzYsICAgICAyNDQ3MzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1YzdkZmEyZQorMCwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDc4ODdlNTk5CiswLCAgICAgMjQ2Nzg0LCAgICAgMjQ2Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjczMGU3MmYKKzAsICAgICAyNDc4MDgsICAgICAyNDc4MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YmIzZmFlNAorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGNjMDhmYzM2CiswLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NWFmZDllYzIKKzAsICAgICAyNTA4ODAsICAgICAyNTA4ODAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMWQzZTgzZAorMCwgICAgIDI1MTkwNCwgICAgIDI1MTkwNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdmOTYwMTNjCiswLCAgICAgMjUyOTI4LCAgICAgMjUyOTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2EwYWZlMzEKKzAsICAgICAyNTM5NTIsICAgICAyNTM5NTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhhMzdkMTcwMQorMCwgICAgIDI1NDk3NiwgICAgIDI1NDk3NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ2MTVlYmMyCiswLCAgICAgMjU2MDAwLCAgICAgMjU2MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjE3MDA1YzEKKzAsICAgICAyNTcwMjQsICAgICAyNTcwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxNzU1Zjc4OQorMCwgICAgIDI1ODA0OCwgICAgIDI1ODA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDgzZTZkYjY1CiswLCAgICAgMjU5MDcyLCAgICAgMjU5MDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTJhYjE0NDcKKzAsICAgICAyNjAwOTYsICAgICAyNjAwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZGJkZjM4MworMCwgICAgIDI2MTEyMCwgICAgIDI2MTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDQzMTZmNmE5CiswLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MWE2YTBiNGMKKzAsICAgICAyNjMxNjgsICAgICAyNjMxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkZmQ4MDliNworMCwgICAgIDI2NDE5MiwgICAgIDI2NDE5MiwgICAgICA0MDgsICAgICAxNjMyLCAweGY0MTIzMTNlCiswLCAgICAgMjY0NjAwLCAgICAgMjY0NjAwLCAgICAgICAxMCwgICAgICAgNDAsIDB4MDAwMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hc2V0bnNhbXBsZXMtbm9wYWQgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXNldG5zYW1wbGVzLW5vcGFkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxY2MwMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXNldG5zYW1wbGVzLW5vcGFkCkBAIC0wLDAgKzEsNTIzIEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQyZGJmNzAxCiswLCAgICAgICAgNTEyLCAgICAgICAgNTEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZGIyMmY3YmYKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4MmExMDNiZQorMCwgICAgICAgMTUzNiwgICAgICAgMTUzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGEzYzcwN2Q4CiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGFhYWZiOGYKKzAsICAgICAgIDI1NjAsICAgICAgIDI1NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0YmRhZmVmYgorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDc1YTNlODMzCiswLCAgICAgICAzNTg0LCAgICAgICAzNTg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzEzMDA5MWMKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5OWQ4ZjM2ZAorMCwgICAgICAgNDYwOCwgICAgICAgNDYwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGFmNmVmYTE1CiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmY1ZjA1MDYKKzAsICAgICAgIDU2MzIsICAgICAgIDU2MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjYmE0ZmI1YgorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDcyOTMwOWM2CiswLCAgICAgICA2NjU2LCAgICAgICA2NjU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjNjZGViMDkKKzAsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzODZjZmNjYgorMCwgICAgICAgNzY4MCwgICAgICAgNzY4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDYwMjEwMGM4CiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzU3M2Y1NjUKKzAsICAgICAgIDg3MDQsICAgICAgIDg3MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0N2I5ZmNlNworMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGQxZTkwYjdhCiswLCAgICAgICA5NzI4LCAgICAgICA5NzI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjRjM2VmNzcKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1OWViZmUzZgorMCwgICAgICAxMDc1MiwgICAgICAxMDc1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDAyZDRmMTYxCiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YmJmNWZmMDUKKzAsICAgICAgMTE3NzYsICAgICAgMTE3NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlMjZhMDQ3YworMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDU0NTJmMDJiCiswLCAgICAgIDEyODAwLCAgICAgIDEyODAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTYxZTEwNTYKKzAsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5MTkyZjgwMworMCwgICAgICAxMzgyNCwgICAgICAxMzgyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDA4ZDdmZjQ5CiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4N2M2NGVlMDMKKzAsICAgICAgMTQ4NDgsICAgICAgMTQ4NDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkMzAzZjRmZgorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGRhNTkwMmJlCiswLCAgICAgIDE1ODcyLCAgICAgIDE1ODcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDA5NmZlNmIKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxNzhlMDE2YQorMCwgICAgICAxNjg5NiwgICAgICAxNjg5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDA0NjcwMGFjCiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NWYyMGY0YWQKKzAsICAgICAgMTc5MjAsICAgICAgMTc5MjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0MGUyZjA5MworMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDVjMzdmY2NkCiswLCAgICAgIDE4OTQ0LCAgICAgIDE4OTQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OWY4NWY5NjMKKzAsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2OTQ2MTAzOAorMCwgICAgICAxOTk2OCwgICAgICAxOTk2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDFmZjFlZjRmCiswLCAgICAgIDIwNDgwLCAgICAgIDIwNDgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDA5MzA0ZmMKKzAsICAgICAgMjA5OTIsICAgICAgMjA5OTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzNmQzZmU0NworMCwgICAgICAyMTUwNCwgICAgICAyMTUwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweGVhMDFmMzY3CiswLCAgICAgIDIyMDE2LCAgICAgIDIyMDE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTFmNWZkMDEKKzAsICAgICAgMjI1MjgsICAgICAgMjI1MjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2ZGVlZWVhNQorMCwgICAgICAyMzA0MCwgICAgICAyMzA0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDdlZWMwZDYyCiswLCAgICAgIDIzNTUyLCAgICAgIDIzNTUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjQ3YmZiOTMKKzAsICAgICAgMjQwNjQsICAgICAgMjQwNjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4N2I4ZjdhMworMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGNiYTBmZWZiCiswLCAgICAgIDI1MDg4LCAgICAgIDI1MDg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YTAyZWZiNzcKKzAsICAgICAgMjU2MDAsICAgICAgMjU2MDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxMDMwZWNmMQorMCwgICAgICAyNjExMiwgICAgICAyNjExMiwgICAgICA1MTIsICAgICAyMDQ4LCAweGVmN2YwOGY0CiswLCAgICAgIDI2NjI0LCAgICAgIDI2NjI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGQ0ZWZhMWQKKzAsICAgICAgMjcxMzYsICAgICAgMjcxMzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlODhiMDcwYworMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDIyOWNmOTU3CiswLCAgICAgIDI4MTYwLCAgICAgIDI4MTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjdmMmYzZWQKKzAsICAgICAgMjg2NzIsICAgICAgMjg2NzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4ZjVmMDg0MAorMCwgICAgICAyOTE4NCwgICAgICAyOTE4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDRmY2JlODE1CiswLCAgICAgIDI5Njk2LCAgICAgIDI5Njk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTdkZDAwNmEKKzAsICAgICAgMzAyMDgsICAgICAgMzAyMDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkNTFhZjkxMworMCwgICAgICAzMDcyMCwgICAgICAzMDcyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDYzYzUwYTY4CiswLCAgICAgIDMxMjMyLCAgICAgIDMxMjMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTAwZTAzNmMKKzAsICAgICAgMzE3NDQsICAgICAgMzE3NDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwYWYwZjVhZAorMCwgICAgICAzMjI1NiwgICAgICAzMjI1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDk5ZDVmOWVmCiswLCAgICAgIDMyNzY4LCAgICAgIDMyNzY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDJkYmY3MDEKKzAsICAgICAgMzMyODAsICAgICAgMzMyODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkYjIyZjdiZgorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDgyYTEwM2JlCiswLCAgICAgIDM0MzA0LCAgICAgIDM0MzA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YTNjNzA3ZDgKKzAsICAgICAgMzQ4MTYsICAgICAgMzQ4MTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4YWFhZmI4ZgorMCwgICAgICAzNTMyOCwgICAgICAzNTMyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDRiZGFmZWZiCiswLCAgICAgIDM1ODQwLCAgICAgIDM1ODQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzVhM2U4MzMKKzAsICAgICAgMzYzNTIsICAgICAgMzYzNTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjMTMwMDkxYworMCwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDk5ZDhmMzZkCiswLCAgICAgIDM3Mzc2LCAgICAgIDM3Mzc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YWY2ZWZhMTUKKzAsICAgICAgMzc4ODgsICAgICAgMzc4ODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmZjVmMDUwNgorMCwgICAgICAzODQwMCwgICAgICAzODQwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGNiYTRmYjViCiswLCAgICAgIDM4OTEyLCAgICAgIDM4OTEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzI5MzA5YzYKKzAsICAgICAgMzk0MjQsICAgICAgMzk0MjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2M2NkZWIwOQorMCwgICAgICAzOTkzNiwgICAgICAzOTkzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDM4NmNmY2NiCiswLCAgICAgIDQwNDQ4LCAgICAgIDQwNDQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjAyMTAwYzgKKzAsICAgICAgNDA5NjAsICAgICAgNDA5NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzNTczZjU2NQorMCwgICAgICA0MTQ3MiwgICAgICA0MTQ3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ3YjlmY2U3CiswLCAgICAgIDQxOTg0LCAgICAgIDQxOTg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDFlOTBiN2EKKzAsICAgICAgNDI0OTYsICAgICAgNDI0OTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNGMzZWY3NworMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDU5ZWJmZTNmCiswLCAgICAgIDQzNTIwLCAgICAgIDQzNTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MDJkNGYxNjEKKzAsICAgICAgNDQwMzIsICAgICAgNDQwMzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyYzA5Zjk0MworMCwgICAgICA0NDU0NCwgICAgICA0NDU0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDIxNThkZDNmCiswLCAgICAgIDQ1MDU2LCAgICAgIDQ1MDU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OWMxNTBjZjQKKzAsICAgICAgNDU1NjgsICAgICAgNDU1NjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyZjY2ZGZjYgorMCwgICAgICA0NjA4MCwgICAgICA0NjA4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQ2MmMwNWM0CiswLCAgICAgIDQ2NTkyLCAgICAgIDQ2NTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzU1ZDA0NzIKKzAsICAgICAgNDcxMDQsICAgICAgNDcxMDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0YWVjZTI2MQorMCwgICAgICA0NzYxNiwgICAgICA0NzYxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGE0YjcwNGFjCiswLCAgICAgIDQ4MTI4LCAgICAgIDQ4MTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTg0MTAwMjAKKzAsICAgICAgNDg2NDAsICAgICAgNDg2NDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhOTRmZjlmNQorMCwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGRkZjcwNWJhCiswLCAgICAgIDQ5NjY0LCAgICAgIDQ5NjY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Y2E3YWY1ODMKKzAsICAgICAgNTAxNzYsICAgICAgNTAxNzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNTdhZjAyOQorMCwgICAgICA1MDY4OCwgICAgICA1MDY4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDJjYjYwZDE2CiswLCAgICAgIDUxMjAwLCAgICAgIDUxMjAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTdmMmY5MGIKKzAsICAgICAgNTE3MTIsICAgICAgNTE3MTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkNDljZmQzMworMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDRmNTZmMWRkCiswLCAgICAgIDUyNzM2LCAgICAgIDUyNzM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzQzYmZiYzEKKzAsICAgICAgNTMyNDgsICAgICAgNTMyNDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyMDU4ZmQ2YgorMCwgICAgICA1Mzc2MCwgICAgICA1Mzc2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDI0M2JmOTIxCiswLCAgICAgIDU0MjcyLCAgICAgIDU0MjcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjU4YjEyNzIKKzAsICAgICAgNTQ3ODQsICAgICAgNTQ3ODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkNjhmZTU0NworMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGFiNjMwNjhjCiswLCAgICAgIDU1ODA4LCAgICAgIDU1ODA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGY4NjBhZmEKKzAsICAgICAgNTYzMjAsICAgICAgNTYzMjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyOTBkZTc5NworMCwgICAgICA1NjgzMiwgICAgICA1NjgzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDliOTkwNjQwCiswLCAgICAgIDU3MzQ0LCAgICAgIDU3MzQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODU5OTIwYmMKKzAsICAgICAgNTc4NTYsICAgICAgNTc4NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzNDNmMTJhZQorMCwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGRkZjMxOGU0CiswLCAgICAgIDU4ODgwLCAgICAgIDU4ODgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTVhNmY1MzUKKzAsICAgICAgNTkzOTIsICAgICAgNTkzOTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0OGNlMDhmNgorMCwgICAgICA1OTkwNCwgICAgICA1OTkwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDRlN2ZmOGMzCiswLCAgICAgIDYwNDE2LCAgICAgIDYwNDE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZGU4ODAzYzAKKzAsICAgICAgNjA5MjgsICAgICAgNjA5MjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxYjc5ZmU4MQorMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDg1M2JlNzJmCiswLCAgICAgIDYxOTUyLCAgICAgIDYxOTUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjRjZmYxMTcKKzAsICAgICAgNjI0NjQsICAgICAgNjI0NjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiNjFkZjQ1ZgorMCwgICAgICA2Mjk3NiwgICAgICA2Mjk3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDZlMzhmZGY3CiswLCAgICAgIDYzNDg4LCAgICAgIDYzNDg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDFjNjA0MmMKKzAsICAgICAgNjQwMDAsICAgICAgNjQwMDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmYmIyZmQ4NworMCwgICAgICA2NDUxMiwgICAgICA2NDUxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDZkYTRlYjY5CiswLCAgICAgIDY1MDI0LCAgICAgIDY1MDI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGZmODA1NGUKKzAsICAgICAgNjU1MzYsICAgICAgNjU1MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4YzQ0ZWY4MQorMCwgICAgICA2NjA0OCwgICAgICA2NjA0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ3ZmFmMTdiCiswLCAgICAgIDY2NTYwLCAgICAgIDY2NTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MGJkNTAxMmEKKzAsICAgICAgNjcwNzIsICAgICAgNjcwNzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlMmQ2ZmQzNworMCwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDEyOGZmZWRkCiswLCAgICAgIDY4MDk2LCAgICAgIDY4MDk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MDJmN2ZhY2QKKzAsICAgICAgNjg2MDgsICAgICAgNjg2MDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzZjQzZjc3ZAorMCwgICAgICA2OTEyMCwgICAgICA2OTEyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDdkNjVmZTE5CiswLCAgICAgIDY5NjMyLCAgICAgIDY5NjMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjZjNzA1YmEKKzAsICAgICAgNzAxNDQsICAgICAgNzAxNDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxODJlZmJiNworMCwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGY3MThlNDgxCiswLCAgICAgIDcxMTY4LCAgICAgIDcxMTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YmZhMTA0NDQKKzAsICAgICAgNzE2ODAsICAgICAgNzE2ODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjM2FhMDM2MAorMCwgICAgICA3MjE5MiwgICAgICA3MjE5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDkwZTBmYTU5CiswLCAgICAgIDcyNzA0LCAgICAgIDcyNzA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTAzNzA2YzIKKzAsICAgICAgNzMyMTYsICAgICAgNzMyMTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmZjcwMDAxZQorMCwgICAgICA3MzcyOCwgICAgICA3MzcyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDkyNDBlZjc5CiswLCAgICAgIDc0MjQwLCAgICAgIDc0MjQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDcyYzA1YzgKKzAsICAgICAgNzQ3NTIsICAgICAgNzQ3NTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5NjU1ZjVmNQorMCwgICAgICA3NTI2NCwgICAgICA3NTI2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDI3YjYwYTBlCiswLCAgICAgIDc1Nzc2LCAgICAgIDc1Nzc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTkxN2Y4ODUKKzAsICAgICAgNzYyODgsICAgICAgNzYyODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlMzljMTA3ZQorMCwgICAgICA3NjgwMCwgICAgICA3NjgwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDJhNDgxMmMwCiswLCAgICAgIDc3MzEyLCAgICAgIDc3MzEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzkxODBhYzgKKzAsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4YjllZmU1NworMCwgICAgICA3ODMzNiwgICAgICA3ODMzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGY5ZWVmZDI1CiswLCAgICAgIDc4ODQ4LCAgICAgIDc4ODQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDM2NjBjYWUKKzAsICAgICAgNzkzNjAsICAgICAgNzkzNjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhN2ViZjdkNQorMCwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDRiYWFmNTlmCiswLCAgICAgIDgwMzg0LCAgICAgIDgwMzg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjU5ZmYyMDkKKzAsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxY2Y4MGUwZQorMCwgICAgICA4MTQwOCwgICAgICA4MTQwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDJkZjllYTY5CiswLCAgICAgIDgxOTIwLCAgICAgIDgxOTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmY4ZmZhMmQKKzAsICAgICAgODI0MzIsICAgICAgODI0MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkZDI3MzJkOAorMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGNkNmUzMWVjCiswLCAgICAgIDgzNDU2LCAgICAgIDgzNDU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjZkMGZiOWYKKzAsICAgICAgODM5NjgsICAgICAgODM5NjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiYzExZjIyOQorMCwgICAgICA4NDQ4MCwgICAgICA4NDQ4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDNhZTAwY2VjCiswLCAgICAgIDg0OTkyLCAgICAgIDg0OTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjAzMmZiMTkKKzAsICAgICAgODU1MDQsICAgICAgODU1MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiMmM5MDQxNAorMCwgICAgICA4NjAxNiwgICAgICA4NjAxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGI3YTFlZWFmCiswLCAgICAgIDg2NTI4LCAgICAgIDg2NTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4N2E1ZDBlNzAKKzAsICAgICAgODcwNDAsICAgICAgODcwNDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxNmYxMTUxNgorMCwgICAgICA4NzU1MiwgICAgICA4NzU1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGZhOTVmYzdmCiswLCAgICAgIDg4MDY0LCAgICAgIDg4MDY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGZlNzA1YTYKKzAsICAgICAgODg1NzYsICAgICAgODg1NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5M2QxYzMxMQorMCwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDgyMzBmNGYxCiswLCAgICAgIDg5NjAwLCAgICAgIDg5NjAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Njk4NWU1OGYKKzAsICAgICAgOTAxMTIsICAgICAgOTAxMTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjNGQ4ZjA3ZgorMCwgICAgICA5MDYyNCwgICAgICA5MDYyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI2YjRjNDc3CiswLCAgICAgIDkxMTM2LCAgICAgIDkxMTM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yzk1YmNlOGIKKzAsICAgICAgOTE2NDgsICAgICAgOTE2NDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1N2VmZDU2ZgorMCwgICAgICA5MjE2MCwgICAgICA5MjE2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQ0NTNjMjk1CiswLCAgICAgIDkyNjcyLCAgICAgIDkyNjcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODNjMGRhOTcKKzAsICAgICAgOTMxODQsICAgICAgOTMxODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNmJmZTMwNworMCwgICAgICA5MzY5NiwgICAgICA5MzY5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDBjZThjZTI3CiswLCAgICAgIDk0MjA4LCAgICAgIDk0MjA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzkyNWU1M2YKKzAsICAgICAgOTQ3MjAsICAgICAgOTQ3MjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3ZmU5ZDEyMQorMCwgICAgICA5NTIzMiwgICAgICA5NTIzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDAwZDNkY2Y5CiswLCAgICAgIDk1NzQ0LCAgICAgIDk1NzQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTc0M2Q2MzcKKzAsICAgICAgOTYyNTYsICAgICAgOTYyNTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1MTYzZjM3ZgorMCwgICAgICA5Njc2OCwgICAgICA5Njc2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDk3MzZkYzI3CiswLCAgICAgIDk3MjgwLCAgICAgIDk3MjgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjBiMWU4NWIKKzAsICAgICAgOTc3OTIsICAgICAgOTc3OTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1ODlmMGMyYworMCwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweGIzYjdhYWI5CiswLCAgICAgIDk4ODE2LCAgICAgIDk4ODE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGRmMGQ0NmQKKzAsICAgICAgOTkzMjgsICAgICAgOTkzMjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiOTE3ZDRkYgorMCwgICAgICA5OTg0MCwgICAgICA5OTg0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDZlZmRmZTY1CiswLCAgICAgMTAwMzUyLCAgICAgMTAwMzUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDI2YmQ4NWQKKzAsICAgICAxMDA4NjQsICAgICAxMDA4NjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4MjQzMTNmNgorMCwgICAgIDEwMTM3NiwgICAgIDEwMTM3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGU3NTVjZjQ3CiswLCAgICAgMTAxODg4LCAgICAgMTAxODg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTRlOGYxNTcKKzAsICAgICAxMDI0MDAsICAgICAxMDI0MDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwNWE4ZDFjYgorMCwgICAgIDEwMjkxMiwgICAgIDEwMjkxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweGE0MDUwOTRhCiswLCAgICAgMTAzNDI0LCAgICAgMTAzNDI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTA2MGU0MGQKKzAsICAgICAxMDM5MzYsICAgICAxMDM5MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzYTE3ZTI1MworMCwgICAgIDEwNDQ0OCwgICAgIDEwNDQ0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI4Y2RkODBmCiswLCAgICAgMTA0OTYwLCAgICAgMTA0OTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzA3M2M1MTcKKzAsICAgICAxMDU0NzIsICAgICAxMDU0NzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2MzRiMDBjNAorMCwgICAgIDEwNTk4NCwgICAgIDEwNTk4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQ4ZWJkMDI1CiswLCAgICAgMTA2NDk2LCAgICAgMTA2NDk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4M2E2NWNmZjcKKzAsICAgICAxMDcwMDgsICAgICAxMDcwMDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZTYxYjY2MQorMCwgICAgIDEwNzUyMCwgICAgIDEwNzUyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDNhMWRjYWU5CiswLCAgICAgMTA4MDMyLCAgICAgMTA4MDMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGQyODA1NDIKKzAsICAgICAxMDg1NDQsICAgICAxMDg1NDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlOTE4ZjQ5OQorMCwgICAgIDEwOTA1NiwgICAgIDEwOTA1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDcwMWJkOThiCiswLCAgICAgMTA5NTY4LCAgICAgMTA5NTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDJhOGU3MmYKKzAsICAgICAxMTAwODAsICAgICAxMTAwODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxNmVkZWRkYgorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGZlYjFmZGJiCiswLCAgICAgMTExMTA0LCAgICAgMTExMTA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzZiMWY0ZjEKKzAsICAgICAxMTE2MTYsICAgICAxMTE2MTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1YmM1ZjI3YgorMCwgICAgIDExMjEyOCwgICAgIDExMjEyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI3MjYwNWVlCiswLCAgICAgMTEyNjQwLCAgICAgMTEyNjQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzE4ZDExMmUKKzAsICAgICAxMTMxNTIsICAgICAxMTMxNTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZmY3ZjI1YgorMCwgICAgIDExMzY2NCwgICAgIDExMzY2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDFkZDExNWNjCiswLCAgICAgMTE0MTc2LCAgICAgMTE0MTc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWZmN2ZiMTUKKzAsICAgICAxMTQ2ODgsICAgICAxMTQ2ODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlYjYxZjI0MQorMCwgICAgIDExNTIwMCwgICAgIDExNTIwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGMzYmRlYjgzCiswLCAgICAgMTE1NzEyLCAgICAgMTE1NzEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZWE4MDAxMWEKKzAsICAgICAxMTYyMjQsICAgICAxMTYyMjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4ZDNjZWU3MQorMCwgICAgIDExNjczNiwgICAgIDExNjczNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDhjZmJmNTg5CiswLCAgICAgMTE3MjQ4LCAgICAgMTE3MjQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YmEyM2Y4ZTMKKzAsICAgICAxMTc3NjAsICAgICAxMTc3NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4N2ExZTg2ZAorMCwgICAgIDExODI3MiwgICAgIDExODI3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDM4ZTZmMWE1CiswLCAgICAgMTE4Nzg0LCAgICAgMTE4Nzg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTA1YTEyZmUKKzAsICAgICAxMTkyOTYsICAgICAxMTkyOTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5YTE0ZTgzNQorMCwgICAgIDExOTgwOCwgICAgIDExOTgwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDExYTExNzgwCiswLCAgICAgMTIwMzIwLCAgICAgMTIwMzIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MGMyMzA4ZTYKKzAsICAgICAxMjA4MzIsICAgICAxMjA4MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjOGFkZmE0YgorMCwgICAgIDEyMTM0NCwgICAgIDEyMTM0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGZlNGMxMThhCiswLCAgICAgMTIxODU2LCAgICAgMTIxODU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YTYyNDBhYzAKKzAsICAgICAxMjIzNjgsICAgICAxMjIzNjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzZmYzZWUyYgorMCwgICAgIDEyMjg4MCwgICAgIDEyMjg4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGM2YWFmNzY5CiswLCAgICAgMTIzMzkyLCAgICAgMTIzMzkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGFkYWZjZGQKKzAsICAgICAxMjM5MDQsICAgICAxMjM5MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhYmQ2ZTg0NQorMCwgICAgIDEyNDQxNiwgICAgIDEyNDQxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDI1ZTYwNzZhCiswLCAgICAgMTI0OTI4LCAgICAgMTI0OTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjZlNmQ0YjkKKzAsICAgICAxMjU0NDAsICAgICAxMjU0NDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MjUxZjIyNQorMCwgICAgIDEyNTk1MiwgICAgIDEyNTk1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGMzYjVmNzUxCiswLCAgICAgMTI2NDY0LCAgICAgMTI2NDY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGYyN2NlY2QKKzAsICAgICAxMjY5NzYsICAgICAxMjY5NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyMzdjMDIwYworMCwgICAgIDEyNzQ4OCwgICAgIDEyNzQ4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGIwNTgwNTU2CiswLCAgICAgMTI4MDAwLCAgICAgMTI4MDAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzE3MDA4YTQKKzAsICAgICAxMjg1MTIsICAgICAxMjg1MTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNjgzZTNmYgorMCwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDFkZGVmZDMzCiswLCAgICAgMTI5NTM2LCAgICAgMTI5NTM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGM2YzE0OTYKKzAsICAgICAxMzAwNDgsICAgICAxMzAwNDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2N2Y5MDdmZQorMCwgICAgIDEzMDU2MCwgICAgIDEzMDU2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDViYjEwOTM4CiswLCAgICAgMTMxMDcyLCAgICAgMTMxMDcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjRhMjBlYWMKKzAsICAgICAxMzE1ODQsICAgICAxMzE1ODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmMjUxZWZmYgorMCwgICAgIDEzMjA5NiwgICAgIDEzMjA5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGFmZDdlYjA0CiswLCAgICAgMTMyNjA4LCAgICAgMTMyNjA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YTE5NTAyNDUKKzAsICAgICAxMzMxMjAsICAgICAxMzMxMjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4Y2RlZmIwZAorMCwgICAgIDEzMzYzMiwgICAgIDEzMzYzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDU2OTRmYTMyCiswLCAgICAgMTM0MTQ0LCAgICAgMTM0MTQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MDk0MmVlYjYKKzAsICAgICAxMzQ2NTYsICAgICAxMzQ2NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MTVhMDFjMQorMCwgICAgIDEzNTE2OCwgICAgIDEzNTE2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ1MzFmNjNlCiswLCAgICAgMTM1NjgwLCAgICAgMTM1NjgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjE0ZmZiYmMKKzAsICAgICAxMzYxOTIsICAgICAxMzYxOTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwZjUwZmUyMQorMCwgICAgIDEzNjcwNCwgICAgIDEzNjcwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweGU0NTYwNDZiCiswLCAgICAgMTM3MjE2LCAgICAgMTM3MjE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDZlYWZmNGQKKzAsICAgICAxMzc3MjgsICAgICAxMzc3MjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkODE0MDYzNAorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDYwOGUwYmZmCiswLCAgICAgMTM4NzUyLCAgICAgMTM4NzUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzY2MTBjZWUKKzAsICAgICAxMzkyNjQsICAgICAxMzkyNjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2YjQ4ZjBmZgorMCwgICAgIDEzOTc3NiwgICAgIDEzOTc3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDAzYzdmOWNlCiswLCAgICAgMTQwMjg4LCAgICAgMTQwMjg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjcxOGZhZDEKKzAsICAgICAxNDA4MDAsICAgICAxNDA4MDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyOTZiZWYyOQorMCwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDIzMTFmMmJmCiswLCAgICAgMTQxODI0LCAgICAgMTQxODI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MDY5ZmZlNjAKKzAsICAgICAxNDIzMzYsICAgICAxNDIzMzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2MTI2MDU1ZAorMCwgICAgIDE0Mjg0OCwgICAgIDE0Mjg0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDkzMzBlZGE2CiswLCAgICAgMTQzMzYwLCAgICAgMTQzMzYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZGZiZWVkYzEKKzAsICAgICAxNDM4NzIsICAgICAxNDM4NzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4NTM2ZjFiOAorMCwgICAgIDE0NDM4NCwgICAgIDE0NDM4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGZlMzBmZDcyCiswLCAgICAgMTQ0ODk2LCAgICAgMTQ0ODk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTMzMjAyNjQKKzAsICAgICAxNDU0MDgsICAgICAxNDU0MDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4M2FkMDlkYgorMCwgICAgIDE0NTkyMCwgICAgIDE0NTkyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGMwOGIwYjMxCiswLCAgICAgMTQ2NDMyLCAgICAgMTQ2NDMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZGE4YWZlYTAKKzAsICAgICAxNDY5NDQsICAgICAxNDY5NDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwY2IzZjA0MAorMCwgICAgIDE0NzQ1NiwgICAgIDE0NzQ1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDgwYzBmYzE3CiswLCAgICAgMTQ3OTY4LCAgICAgMTQ3OTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OWQ4MGZkZmIKKzAsICAgICAxNDg0ODAsICAgICAxNDg0ODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5ZjFhZjFmZAorMCwgICAgIDE0ODk5MiwgICAgIDE0ODk5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDkyZmVmMTAyCiswLCAgICAgMTQ5NTA0LCAgICAgMTQ5NTA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NWI2MmY3YmUKKzAsICAgICAxNTAwMTYsICAgICAxNTAwMTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyNTgwMGE1YgorMCwgICAgIDE1MDUyOCwgICAgIDE1MDUyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGM2NjBmYmEzCiswLCAgICAgMTUxMDQwLCAgICAgMTUxMDQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MGUyMWZiZGEKKzAsICAgICAxNTE1NTIsICAgICAxNTE1NTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyZTdmMDI3ZAorMCwgICAgIDE1MjA2NCwgICAgIDE1MjA2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGNmNjVmZWI0CiswLCAgICAgMTUyNTc2LCAgICAgMTUyNTc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGUwZmZhNmQKKzAsICAgICAxNTMwODgsICAgICAxNTMwODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MzJiZmYzNgorMCwgICAgIDE1MzYwMCwgICAgIDE1MzYwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDNkZjIwZTdlCiswLCAgICAgMTU0MTEyLCAgICAgMTU0MTEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmE1MDA2ZTUKKzAsICAgICAxNTQ2MjQsICAgICAxNTQ2MjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmZDNiZmEyYQorMCwgICAgIDE1NTEzNiwgICAgIDE1NTEzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDhlNzNmNzU1CiswLCAgICAgMTU1NjQ4LCAgICAgMTU1NjQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmY5M2VjZTEKKzAsICAgICAxNTYxNjAsICAgICAxNTYxNjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3OGE0ZjczNQorMCwgICAgIDE1NjY3MiwgICAgIDE1NjY3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDNhN2NmYzFjCiswLCAgICAgMTU3MTg0LCAgICAgMTU3MTg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YmZjMGY3OTUKKzAsICAgICAxNTc2OTYsICAgICAxNTc2OTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3YThjZmVkMgorMCwgICAgIDE1ODIwOCwgICAgIDE1ODIwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDNkMGZkZWU1CiswLCAgICAgMTU4NzIwLCAgICAgMTU4NzIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTAyYWZjNzgKKzAsICAgICAxNTkyMzIsICAgICAxNTkyMzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1MWRjZjBlMgorMCwgICAgIDE1OTc0NCwgICAgIDE1OTc0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDFmNTlmYzAwCiswLCAgICAgMTYwMjU2LCAgICAgMTYwMjU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmRkMGYzOTAKKzAsICAgICAxNjA3NjgsICAgICAxNjA3NjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyZmYzMGY3YworMCwgICAgIDE2MTI4MCwgICAgIDE2MTI4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDM2ZjUwOGI4CiswLCAgICAgMTYxNzkyLCAgICAgMTYxNzkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTFlOGVmMmQKKzAsICAgICAxNjIzMDQsICAgICAxNjIzMDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmOTY2MGVkNworMCwgICAgIDE2MjgxNiwgICAgIDE2MjgxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDUwZjNmZDRkCiswLCAgICAgMTYzMzI4LCAgICAgMTYzMzI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzY2ZWY2YjkKKzAsICAgICAxNjM4NDAsICAgICAxNjM4NDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmMDIzZjE3YQorMCwgICAgIDE2NDM1MiwgICAgIDE2NDM1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGY2YzZmMWYwCiswLCAgICAgMTY0ODY0LCAgICAgMTY0ODY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmQxZGZlYmYKKzAsICAgICAxNjUzNzYsICAgICAxNjUzNzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlYWQ2MGUxZAorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGJlNTIwMWE2CiswLCAgICAgMTY2NDAwLCAgICAgMTY2NDAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjE5NDAyNjkKKzAsICAgICAxNjY5MTIsICAgICAxNjY5MTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiNmNkZjM1MAorMCwgICAgIDE2NzQyNCwgICAgIDE2NzQyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDdjNDRmODBlCiswLCAgICAgMTY3OTM2LCAgICAgMTY3OTM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWZmZjAzZWYKKzAsICAgICAxNjg0NDgsICAgICAxNjg0NDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1MTQ4MDdjNgorMCwgICAgIDE2ODk2MCwgICAgIDE2ODk2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGUwNGVlZGU3CiswLCAgICAgMTY5NDcyLCAgICAgMTY5NDcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzQ3ZTAyNzIKKzAsICAgICAxNjk5ODQsICAgICAxNjk5ODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4YzAwZmI5NgorMCwgICAgIDE3MDQ5NiwgICAgIDE3MDQ5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDY2NjBmNjA3CiswLCAgICAgMTcxMDA4LCAgICAgMTcxMDA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTlhNzAxN2QKKzAsICAgICAxNzE1MjAsICAgICAxNzE1MjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjYTU4ZThhZQorMCwgICAgIDE3MjAzMiwgICAgIDE3MjAzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDc5NWFmOTJhCiswLCAgICAgMTcyNTQ0LCAgICAgMTcyNTQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4N2Q2YWVlMWIKKzAsICAgICAxNzMwNTYsICAgICAxNzMwNTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0YWI5ZjU4ZgorMCwgICAgIDE3MzU2OCwgICAgIDE3MzU2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDNiOTFmNjE3CiswLCAgICAgMTc0MDgwLCAgICAgMTc0MDgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MDllMWY3ZDcKKzAsICAgICAxNzQ1OTIsICAgICAxNzQ1OTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjOTI4MDc1MworMCwgICAgIDE3NTEwNCwgICAgIDE3NTEwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDg2MjBmNjYyCiswLCAgICAgMTc1NjE2LCAgICAgMTc1NjE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmJiMTAzZmEKKzAsICAgICAxNzYxMjgsICAgICAxNzYxMjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjZmVlMDM3MQorMCwgICAgIDE3NjY0MCwgICAgIDE3NjY0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGUxZTIwMjk0CiswLCAgICAgMTc3MTUyLCAgICAgMTc3MTUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZGI5OGZlYTQKKzAsICAgICAxNzc2NjQsICAgICAxNzc2NjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4ZDFmZGRlYgorMCwgICAgIDE3ODE3NiwgICAgIDE3ODE3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDRlNzUwMWJmCiswLCAgICAgMTc4Njg4LCAgICAgMTc4Njg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjhkMGZiOTUKKzAsICAgICAxNzkyMDAsICAgICAxNzkyMDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNjg1MDAxZQorMCwgICAgIDE3OTcxMiwgICAgIDE3OTcxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDc1ZGFmYTEwCiswLCAgICAgMTgwMjI0LCAgICAgMTgwMjI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTM0ZmU3NzIKKzAsICAgICAxODA3MzYsICAgICAxODA3MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyOGI0ZmUxOAorMCwgICAgIDE4MTI0OCwgICAgIDE4MTI0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDJiYTAwNjc4CiswLCAgICAgMTgxNzYwLCAgICAgMTgxNzYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yzg4NGUwYjcKKzAsICAgICAxODIyNzIsICAgICAxODIyNzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2YWU0MDc4NworMCwgICAgIDE4Mjc4NCwgICAgIDE4Mjc4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGM1M2NmMzVkCiswLCAgICAgMTgzMjk2LCAgICAgMTgzMjk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzM4ZDA2YjQKKzAsICAgICAxODM4MDgsICAgICAxODM4MDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiNTUxZjU4MgorMCwgICAgIDE4NDMyMCwgICAgIDE4NDMyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDhhNWE4NzY0CiswLCAgICAgMTg0ODMyLCAgICAgMTg0ODMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzExZjE3NWUKKzAsICAgICAxODUzNDQsICAgICAxODUzNDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlNWUxZWQ0MworMCwgICAgIDE4NTg1NiwgICAgIDE4NTg1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDM0YWRmYWViCiswLCAgICAgMTg2MzY4LCAgICAgMTg2MzY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzlmYjAxNDIKKzAsICAgICAxODY4ODAsICAgICAxODY4ODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNGY2ZmZlYgorMCwgICAgIDE4NzM5MiwgICAgIDE4NzM5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGQzNTQwYTZiCiswLCAgICAgMTg3OTA0LCAgICAgMTg3OTA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDljYWYzYzYKKzAsICAgICAxODg0MTYsICAgICAxODg0MTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjMWRiMDViNworMCwgICAgIDE4ODkyOCwgICAgIDE4ODkyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDI2ZjAxMTRhCiswLCAgICAgMTg5NDQwLCAgICAgMTg5NDQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTc2ZWVhZDkKKzAsICAgICAxODk5NTIsICAgICAxODk5NTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiODdmMDBlOQorMCwgICAgIDE5MDQ2NCwgICAgIDE5MDQ2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ3MGQwMzBmCiswLCAgICAgMTkwOTc2LCAgICAgMTkwOTc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjBlYzAyYjIKKzAsICAgICAxOTE0ODgsICAgICAxOTE0ODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiODRhMGI0NAorMCwgICAgIDE5MjAwMCwgICAgIDE5MjAwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDM5YjZlYzQ1CiswLCAgICAgMTkyNTEyLCAgICAgMTkyNTEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWUwN2U1ODAKKzAsICAgICAxOTMwMjQsICAgICAxOTMwMjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmYTNjZjVkNgorMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDA4MDFmOWI4CiswLCAgICAgMTk0MDQ4LCAgICAgMTk0MDQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTU5ODFhODAKKzAsICAgICAxOTQ1NjAsICAgICAxOTQ1NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5NTEwZjZhZAorMCwgICAgIDE5NTA3MiwgICAgIDE5NTA3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDdkMDNmY2M3CiswLCAgICAgMTk1NTg0LCAgICAgMTk1NTg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjE3YmY4NGUKKzAsICAgICAxOTYwOTYsICAgICAxOTYwOTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2ZDFmZmU0YworMCwgICAgIDE5NjYwOCwgICAgIDE5NjYwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDkxZTIxMGY5CiswLCAgICAgMTk3MTIwLCAgICAgMTk3MTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yjg4MWZhNDQKKzAsICAgICAxOTc2MzIsICAgICAxOTc2MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiN2NkZjFmMworMCwgICAgIDE5ODE0NCwgICAgIDE5ODE0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDFlOWIxN2I1CiswLCAgICAgMTk4NjU2LCAgICAgMTk4NjU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzRkZmYwZTMKKzAsICAgICAxOTkxNjgsICAgICAxOTkxNjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZjU1MDUwZQorMCwgICAgIDE5OTY4MCwgICAgIDE5OTY4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDc0OThmMWI4CiswLCAgICAgMjAwMTkyLCAgICAgMjAwMTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmQ3YzAyZTkKKzAsICAgICAyMDA3MDQsICAgICAyMDA3MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4Yzg0YTVjNAorMCwgICAgIDIwMTIxNiwgICAgIDIwMTIxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDZmZWFlMTBkCiswLCAgICAgMjAxNzI4LCAgICAgMjAxNzI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmRhOTBiMjgKKzAsICAgICAyMDIyNDAsICAgICAyMDIyNDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiMjMwZmQ3MgorMCwgICAgIDIwMjc1MiwgICAgIDIwMjc1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDYyOThmNzI4CiswLCAgICAgMjAzMjY0LCAgICAgMjAzMjY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZWY2MGY4NzEKKzAsICAgICAyMDM3NzYsICAgICAyMDM3NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxNGU3ZWUwMQorMCwgICAgIDIwNDI4OCwgICAgIDIwNDI4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDk4ZDcwNGE1CiswLCAgICAgMjA0ODAwLCAgICAgMjA0ODAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWNjYWYyYjQKKzAsICAgICAyMDUzMTIsICAgICAyMDUzMTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiOWVkZTcyMQorMCwgICAgIDIwNTgyNCwgICAgIDIwNTgyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDhjNTcwZDkyCiswLCAgICAgMjA2MzM2LCAgICAgMjA2MzM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmQ3ZWY3ODIKKzAsICAgICAyMDY4NDgsICAgICAyMDY4NDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhODRjZjU1ZQorMCwgICAgIDIwNzM2MCwgICAgIDIwNzM2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDgwMzNmNWI5CiswLCAgICAgMjA3ODcyLCAgICAgMjA3ODcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjdmM2VkMjcKKzAsICAgICAyMDgzODQsICAgICAyMDgzODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhNjczMGMyNQorMCwgICAgIDIwODg5NiwgICAgIDIwODg5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ4OWJmMmZkCiswLCAgICAgMjA5NDA4LCAgICAgMjA5NDA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTFlMjAyOTQKKzAsICAgICAyMDk5MjAsICAgICAyMDk5MjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkYjk4ZmVhNAorMCwgICAgIDIxMDQzMiwgICAgIDIxMDQzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDhkMWZkZGViCiswLCAgICAgMjEwOTQ0LCAgICAgMjEwOTQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGU3NTAxYmYKKzAsICAgICAyMTE0NTYsICAgICAyMTE0NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2OGQwZmI5NQorMCwgICAgIDIxMTk2OCwgICAgIDIxMTk2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGY2ODUwMDFlCiswLCAgICAgMjEyNDgwLCAgICAgMjEyNDgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzVkYWZhMTAKKzAsICAgICAyMTI5OTIsICAgICAyMTI5OTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1MzRmZTc3MgorMCwgICAgIDIxMzUwNCwgICAgIDIxMzUwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDI4YjRmZTE4CiswLCAgICAgMjE0MDE2LCAgICAgMjE0MDE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmJhMDA2NzgKKzAsICAgICAyMTQ1MjgsICAgICAyMTQ1MjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjODg0ZTBiNworMCwgICAgIDIxNTA0MCwgICAgIDIxNTA0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDZhZTQwNzg3CiswLCAgICAgMjE1NTUyLCAgICAgMjE1NTUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzUzY2YzNWQKKzAsICAgICAyMTYwNjQsICAgICAyMTYwNjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MzhkMDZiNAorMCwgICAgIDIxNjU3NiwgICAgIDIxNjU3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGI1NTFmNTgyCiswLCAgICAgMjE3MDg4LCAgICAgMjE3MDg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGE1YTg3NjQKKzAsICAgICAyMTc2MDAsICAgICAyMTc2MDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MTFmMTc1ZQorMCwgICAgIDIxODExMiwgICAgIDIxODExMiwgICAgICA1MTIsICAgICAyMDQ4LCAweGU1ZTFlZDQzCiswLCAgICAgMjE4NjI0LCAgICAgMjE4NjI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzRhZGZhZWIKKzAsICAgICAyMTkxMzYsICAgICAyMTkxMzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3OWZiMDE0MgorMCwgICAgIDIxOTY0OCwgICAgIDIxOTY0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGY0ZjZmZmViCiswLCAgICAgMjIwMTYwLCAgICAgMjIwMTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDM1NDBhNmIKKzAsICAgICAyMjA2NzIsICAgICAyMjA2NzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0OWNhZjNjNgorMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGMxZGIwNWI3CiswLCAgICAgMjIxNjk2LCAgICAgMjIxNjk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjZmMDExNGEKKzAsICAgICAyMjIyMDgsICAgICAyMjIyMDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1NzZlZWFkOQorMCwgICAgIDIyMjcyMCwgICAgIDIyMjcyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI4N2YwMGU5CiswLCAgICAgMjIzMjMyLCAgICAgMjIzMjMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDcwZDAzMGYKKzAsICAgICAyMjM3NDQsICAgICAyMjM3NDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2MGVjMDJiMgorMCwgICAgIDIyNDI1NiwgICAgIDIyNDI1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGI4NGEwYjQ0CiswLCAgICAgMjI0NzY4LCAgICAgMjI0NzY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzliNmVjNDUKKzAsICAgICAyMjUyODAsICAgICAyMjUyODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZTA3ZTU4MAorMCwgICAgIDIyNTc5MiwgICAgIDIyNTc5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGZhM2NmNWQ2CiswLCAgICAgMjI2MzA0LCAgICAgMjI2MzA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MDgwMWY5YjgKKzAsICAgICAyMjY4MTYsICAgICAyMjY4MTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1NTk4MWE4MAorMCwgICAgIDIyNzMyOCwgICAgIDIyNzMyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDk1MTBmNmFkCiswLCAgICAgMjI3ODQwLCAgICAgMjI3ODQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4N2QwM2ZjYzcKKzAsICAgICAyMjgzNTIsICAgICAyMjgzNTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmMTdiZjg0ZQorMCwgICAgIDIyODg2NCwgICAgIDIyODg2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDZkMWZmZTRjCiswLCAgICAgMjI5Mzc2LCAgICAgMjI5Mzc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTFlMjEwZjkKKzAsICAgICAyMjk4ODgsICAgICAyMjk4ODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiODgxZmE0NAorMCwgICAgIDIzMDQwMCwgICAgIDIzMDQwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI3Y2RmMWYzCiswLCAgICAgMjMwOTEyLCAgICAgMjMwOTEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWU5YjE3YjUKKzAsICAgICAyMzE0MjQsICAgICAyMzE0MjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3NGRmZjBlMworMCwgICAgIDIzMTkzNiwgICAgIDIzMTkzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDFmNTUwNTBlCiswLCAgICAgMjMyNDQ4LCAgICAgMjMyNDQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzQ5OGYxYjgKKzAsICAgICAyMzI5NjAsICAgICAyMzI5NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyZDdjMDJlOQorMCwgICAgIDIzMzQ3MiwgICAgIDIzMzQ3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDhjODRhNWM0CiswLCAgICAgMjMzOTg0LCAgICAgMjMzOTg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmZlYWUxMGQKKzAsICAgICAyMzQ0OTYsICAgICAyMzQ0OTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmZGE5MGIyOAorMCwgICAgIDIzNTAwOCwgICAgIDIzNTAwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGIyMzBmZDcyCiswLCAgICAgMjM1NTIwLCAgICAgMjM1NTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjI5OGY3MjgKKzAsICAgICAyMzYwMzIsICAgICAyMzYwMzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlZjYwZjg3MQorMCwgICAgIDIzNjU0NCwgICAgIDIzNjU0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDE0ZTdlZTAxCiswLCAgICAgMjM3MDU2LCAgICAgMjM3MDU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OThkNzA0YTUKKzAsICAgICAyMzc1NjgsICAgICAyMzc1NjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxY2NhZjJiNAorMCwgICAgIDIzODA4MCwgICAgIDIzODA4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI5ZWRlNzIxCiswLCAgICAgMjM4NTkyLCAgICAgMjM4NTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGM1NzBkOTIKKzAsICAgICAyMzkxMDQsICAgICAyMzkxMDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyZDdlZjc4MgorMCwgICAgIDIzOTYxNiwgICAgIDIzOTYxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGE4NGNmNTVlCiswLCAgICAgMjQwMTI4LCAgICAgMjQwMTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODAzM2Y1YjkKKzAsICAgICAyNDA2NDAsICAgICAyNDA2NDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyN2YzZWQyNworMCwgICAgIDI0MTE1MiwgICAgIDI0MTE1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGE2NzMwYzI1CiswLCAgICAgMjQxNjY0LCAgICAgMjQxNjY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDg5YmYyZmQKKzAsICAgICAyNDIxNzYsICAgICAyNDIxNzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlMWUyMDI5NAorMCwgICAgIDI0MjY4OCwgICAgIDI0MjY4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGRiOThmZWE0CiswLCAgICAgMjQzMjAwLCAgICAgMjQzMjAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGQxZmRkZWIKKzAsICAgICAyNDM3MTIsICAgICAyNDM3MTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0ZTc1MDFiZgorMCwgICAgIDI0NDIyNCwgICAgIDI0NDIyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDY4ZDBmYjk1CiswLCAgICAgMjQ0NzM2LCAgICAgMjQ0NzM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjY4NTAwMWUKKzAsICAgICAyNDUyNDgsICAgICAyNDUyNDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3NWRhZmExMAorMCwgICAgIDI0NTc2MCwgICAgIDI0NTc2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDUzNGZlNzcyCiswLCAgICAgMjQ2MjcyLCAgICAgMjQ2MjcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjhiNGZlMTgKKzAsICAgICAyNDY3ODQsICAgICAyNDY3ODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyYmEwMDY3OAorMCwgICAgIDI0NzI5NiwgICAgIDI0NzI5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGM4ODRlMGI3CiswLCAgICAgMjQ3ODA4LCAgICAgMjQ3ODA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmFlNDA3ODcKKzAsICAgICAyNDgzMjAsICAgICAyNDgzMjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjNTNjZjM1ZAorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDczOGQwNmI0CiswLCAgICAgMjQ5MzQ0LCAgICAgMjQ5MzQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjU1MWY1ODIKKzAsICAgICAyNDk4NTYsICAgICAyNDk4NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4YTVhODc2NAorMCwgICAgIDI1MDM2OCwgICAgIDI1MDM2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDcxMWYxNzVlCiswLCAgICAgMjUwODgwLCAgICAgMjUwODgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTVlMWVkNDMKKzAsICAgICAyNTEzOTIsICAgICAyNTEzOTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzNGFkZmFlYgorMCwgICAgIDI1MTkwNCwgICAgIDI1MTkwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDc5ZmIwMTQyCiswLCAgICAgMjUyNDE2LCAgICAgMjUyNDE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjRmNmZmZWIKKzAsICAgICAyNTI5MjgsICAgICAyNTI5MjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkMzU0MGE2YgorMCwgICAgIDI1MzQ0MCwgICAgIDI1MzQ0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ5Y2FmM2M2CiswLCAgICAgMjUzOTUyLCAgICAgMjUzOTUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzFkYjA1YjcKKzAsICAgICAyNTQ0NjQsICAgICAyNTQ0NjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyNmYwMTE0YQorMCwgICAgIDI1NDk3NiwgICAgIDI1NDk3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDU3NmVlYWQ5CiswLCAgICAgMjU1NDg4LCAgICAgMjU1NDg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yjg3ZjAwZTkKKzAsICAgICAyNTYwMDAsICAgICAyNTYwMDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0NzBkMDMwZgorMCwgICAgIDI1NjUxMiwgICAgIDI1NjUxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDYwZWMwMmIyCiswLCAgICAgMjU3MDI0LCAgICAgMjU3MDI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yjg0YTBiNDQKKzAsICAgICAyNTc1MzYsICAgICAyNTc1MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzOWI2ZWM0NQorMCwgICAgIDI1ODA0OCwgICAgIDI1ODA0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDFlMDdlNTgwCiswLCAgICAgMjU4NTYwLCAgICAgMjU4NTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmEzY2Y1ZDYKKzAsICAgICAyNTkwNzIsICAgICAyNTkwNzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwODAxZjliOAorMCwgICAgIDI1OTU4NCwgICAgIDI1OTU4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDU1OTgxYTgwCiswLCAgICAgMjYwMDk2LCAgICAgMjYwMDk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTUxMGY2YWQKKzAsICAgICAyNjA2MDgsICAgICAyNjA2MDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3ZDAzZmNjNworMCwgICAgIDI2MTEyMCwgICAgIDI2MTEyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGYxN2JmODRlCiswLCAgICAgMjYxNjMyLCAgICAgMjYxNjMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmQxZmZlNGMKKzAsICAgICAyNjIxNDQsICAgICAyNjIxNDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5MWUyMTBmOQorMCwgICAgIDI2MjY1NiwgICAgIDI2MjY1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGI4ODFmYTQ0CiswLCAgICAgMjYzMTY4LCAgICAgMjYzMTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjdjZGYxZjMKKzAsICAgICAyNjM2ODAsICAgICAyNjM2ODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZTliMTdiNQorMCwgICAgIDI2NDE5MiwgICAgIDI2NDE5MiwgICAgICA0MDgsICAgICAxNjMyLCAweGY0MTIzMTNlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXNldG5zYW1wbGVzLXBhZCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hc2V0bnNhbXBsZXMtcGFkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzY2YxMWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXNldG5zYW1wbGVzLXBhZApAQCAtMCwwICsxLDUyMyBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkMmRiZjcwMQorMCwgICAgICAgIDUxMiwgICAgICAgIDUxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweGRiMjJmN2JmCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODJhMTAzYmUKKzAsICAgICAgIDE1MzYsICAgICAgIDE1MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhM2M3MDdkOAorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDhhYWFmYjhmCiswLCAgICAgICAyNTYwLCAgICAgICAyNTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGJkYWZlZmIKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3NWEzZTgzMworMCwgICAgICAgMzU4NCwgICAgICAgMzU4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGMxMzAwOTFjCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTlkOGYzNmQKKzAsICAgICAgIDQ2MDgsICAgICAgIDQ2MDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhZjZlZmExNQorMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGZmNWYwNTA2CiswLCAgICAgICA1NjMyLCAgICAgICA1NjMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Y2JhNGZiNWIKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MjkzMDljNgorMCwgICAgICAgNjY1NiwgICAgICAgNjY1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDYzY2RlYjA5CiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Mzg2Y2ZjY2IKKzAsICAgICAgIDc2ODAsICAgICAgIDc2ODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2MDIxMDBjOAorMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDM1NzNmNTY1CiswLCAgICAgICA4NzA0LCAgICAgICA4NzA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDdiOWZjZTcKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkMWU5MGI3YQorMCwgICAgICAgOTcyOCwgICAgICAgOTcyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGY0YzNlZjc3CiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTllYmZlM2YKKzAsICAgICAgMTA3NTIsICAgICAgMTA3NTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwMmQ0ZjE2MQorMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGJiZjVmZjA1CiswLCAgICAgIDExNzc2LCAgICAgIDExNzc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTI2YTA0N2MKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1NDUyZjAyYgorMCwgICAgICAxMjgwMCwgICAgICAxMjgwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDk2MWUxMDU2CiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTE5MmY4MDMKKzAsICAgICAgMTM4MjQsICAgICAgMTM4MjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwOGQ3ZmY0OQorMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDdjNjRlZTAzCiswLCAgICAgIDE0ODQ4LCAgICAgIDE0ODQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDMwM2Y0ZmYKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkYTU5MDJiZQorMCwgICAgICAxNTg3MiwgICAgICAxNTg3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDQwOTZmZTZiCiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTc4ZTAxNmEKKzAsICAgICAgMTY4OTYsICAgICAgMTY4OTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwNDY3MDBhYworMCwgICAgICAxNzQwOCwgICAgICAxNzQwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDVmMjBmNGFkCiswLCAgICAgIDE3OTIwLCAgICAgIDE3OTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDBlMmYwOTMKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1YzM3ZmNjZAorMCwgICAgICAxODk0NCwgICAgICAxODk0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDlmODVmOTYzCiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Njk0NjEwMzgKKzAsICAgICAgMTk5NjgsICAgICAgMTk5NjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZmYxZWY0ZgorMCwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDQwOTMwNGZjCiswLCAgICAgIDIwOTkyLCAgICAgIDIwOTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzZkM2ZlNDcKKzAsICAgICAgMjE1MDQsICAgICAgMjE1MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlYTAxZjM2NworMCwgICAgICAyMjAxNiwgICAgICAyMjAxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDExZjVmZDAxCiswLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmRlZWVlYTUKKzAsICAgICAgMjMwNDAsICAgICAgMjMwNDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3ZWVjMGQ2MgorMCwgICAgICAyMzU1MiwgICAgICAyMzU1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGI0N2JmYjkzCiswLCAgICAgIDI0MDY0LCAgICAgIDI0MDY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODdiOGY3YTMKKzAsICAgICAgMjQ1NzYsICAgICAgMjQ1NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjYmEwZmVmYgorMCwgICAgICAyNTA4OCwgICAgICAyNTA4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGEwMmVmYjc3CiswLCAgICAgIDI1NjAwLCAgICAgIDI1NjAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTAzMGVjZjEKKzAsICAgICAgMjYxMTIsICAgICAgMjYxMTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlZjdmMDhmNAorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDhkNGVmYTFkCiswLCAgICAgIDI3MTM2LCAgICAgIDI3MTM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTg4YjA3MGMKKzAsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyMjljZjk1NworMCwgICAgICAyODE2MCwgICAgICAyODE2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGY3ZjJmM2VkCiswLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGY1ZjA4NDAKKzAsICAgICAgMjkxODQsICAgICAgMjkxODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0ZmNiZTgxNQorMCwgICAgICAyOTY5NiwgICAgICAyOTY5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDU3ZGQwMDZhCiswLCAgICAgIDMwMjA4LCAgICAgIDMwMjA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDUxYWY5MTMKKzAsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2M2M1MGE2OAorMCwgICAgICAzMTIzMiwgICAgICAzMTIzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDEwMGUwMzZjCiswLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MGFmMGY1YWQKKzAsICAgICAgMzIyNTYsICAgICAgMzIyNTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5OWQ1ZjllZgorMCwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQyZGJmNzAxCiswLCAgICAgIDMzMjgwLCAgICAgIDMzMjgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZGIyMmY3YmYKKzAsICAgICAgMzM3OTIsICAgICAgMzM3OTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4MmExMDNiZQorMCwgICAgICAzNDMwNCwgICAgICAzNDMwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweGEzYzcwN2Q4CiswLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGFhYWZiOGYKKzAsICAgICAgMzUzMjgsICAgICAgMzUzMjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0YmRhZmVmYgorMCwgICAgICAzNTg0MCwgICAgICAzNTg0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDc1YTNlODMzCiswLCAgICAgIDM2MzUyLCAgICAgIDM2MzUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzEzMDA5MWMKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5OWQ4ZjM2ZAorMCwgICAgICAzNzM3NiwgICAgICAzNzM3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGFmNmVmYTE1CiswLCAgICAgIDM3ODg4LCAgICAgIDM3ODg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmY1ZjA1MDYKKzAsICAgICAgMzg0MDAsICAgICAgMzg0MDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjYmE0ZmI1YgorMCwgICAgICAzODkxMiwgICAgICAzODkxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDcyOTMwOWM2CiswLCAgICAgIDM5NDI0LCAgICAgIDM5NDI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjNjZGViMDkKKzAsICAgICAgMzk5MzYsICAgICAgMzk5MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzODZjZmNjYgorMCwgICAgICA0MDQ0OCwgICAgICA0MDQ0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDYwMjEwMGM4CiswLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzU3M2Y1NjUKKzAsICAgICAgNDE0NzIsICAgICAgNDE0NzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0N2I5ZmNlNworMCwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQxZTkwYjdhCiswLCAgICAgIDQyNDk2LCAgICAgIDQyNDk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjRjM2VmNzcKKzAsICAgICAgNDMwMDgsICAgICAgNDMwMDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1OWViZmUzZgorMCwgICAgICA0MzUyMCwgICAgICA0MzUyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDAyZDRmMTYxCiswLCAgICAgIDQ0MDMyLCAgICAgIDQ0MDMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmMwOWY5NDMKKzAsICAgICAgNDQ1NDQsICAgICAgNDQ1NDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyMTU4ZGQzZgorMCwgICAgICA0NTA1NiwgICAgICA0NTA1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDljMTUwY2Y0CiswLCAgICAgIDQ1NTY4LCAgICAgIDQ1NTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmY2NmRmY2IKKzAsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkNjJjMDVjNAorMCwgICAgICA0NjU5MiwgICAgICA0NjU5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDc1NWQwNDcyCiswLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGFlY2UyNjEKKzAsICAgICAgNDc2MTYsICAgICAgNDc2MTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhNGI3MDRhYworMCwgICAgICA0ODEyOCwgICAgICA0ODEyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDE4NDEwMDIwCiswLCAgICAgIDQ4NjQwLCAgICAgIDQ4NjQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YTk0ZmY5ZjUKKzAsICAgICAgNDkxNTIsICAgICAgNDkxNTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkZGY3MDViYQorMCwgICAgICA0OTY2NCwgICAgICA0OTY2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGNhN2FmNTgzCiswLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjU3YWYwMjkKKzAsICAgICAgNTA2ODgsICAgICAgNTA2ODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyY2I2MGQxNgorMCwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDk3ZjJmOTBiCiswLCAgICAgIDUxNzEyLCAgICAgIDUxNzEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDQ5Y2ZkMzMKKzAsICAgICAgNTIyMjQsICAgICAgNTIyMjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0ZjU2ZjFkZAorMCwgICAgICA1MjczNiwgICAgICA1MjczNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDM0M2JmYmMxCiswLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjA1OGZkNmIKKzAsICAgICAgNTM3NjAsICAgICAgNTM3NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyNDNiZjkyMQorMCwgICAgICA1NDI3MiwgICAgICA1NDI3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDY1OGIxMjcyCiswLCAgICAgIDU0Nzg0LCAgICAgIDU0Nzg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDY4ZmU1NDcKKzAsICAgICAgNTUyOTYsICAgICAgNTUyOTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhYjYzMDY4YworMCwgICAgICA1NTgwOCwgICAgICA1NTgwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDhmODYwYWZhCiswLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjkwZGU3OTcKKzAsICAgICAgNTY4MzIsICAgICAgNTY4MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5Yjk5MDY0MAorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDg1OTkyMGJjCiswLCAgICAgIDU3ODU2LCAgICAgIDU3ODU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzQzZjEyYWUKKzAsICAgICAgNTgzNjgsICAgICAgNTgzNjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkZGYzMThlNAorMCwgICAgICA1ODg4MCwgICAgICA1ODg4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDU1YTZmNTM1CiswLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDhjZTA4ZjYKKzAsICAgICAgNTk5MDQsICAgICAgNTk5MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0ZTdmZjhjMworMCwgICAgICA2MDQxNiwgICAgICA2MDQxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGRlODgwM2MwCiswLCAgICAgIDYwOTI4LCAgICAgIDYwOTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWI3OWZlODEKKzAsICAgICAgNjE0NDAsICAgICAgNjE0NDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4NTNiZTcyZgorMCwgICAgICA2MTk1MiwgICAgICA2MTk1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGY0Y2ZmMTE3CiswLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjYxZGY0NWYKKzAsICAgICAgNjI5NzYsICAgICAgNjI5NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2ZTM4ZmRmNworMCwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDQxYzYwNDJjCiswLCAgICAgIDY0MDAwLCAgICAgIDY0MDAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmJiMmZkODcKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2ZGE0ZWI2OQorMCwgICAgICA2NTAyNCwgICAgICA2NTAyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDhmZjgwNTRlCiswLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGM0NGVmODEKKzAsICAgICAgNjYwNDgsICAgICAgNjYwNDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0N2ZhZjE3YgorMCwgICAgICA2NjU2MCwgICAgICA2NjU2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDBiZDUwMTJhCiswLCAgICAgIDY3MDcyLCAgICAgIDY3MDcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTJkNmZkMzcKKzAsICAgICAgNjc1ODQsICAgICAgNjc1ODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxMjhmZmVkZAorMCwgICAgICA2ODA5NiwgICAgICA2ODA5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDAyZjdmYWNkCiswLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4M2Y0M2Y3N2QKKzAsICAgICAgNjkxMjAsICAgICAgNjkxMjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3ZDY1ZmUxOQorMCwgICAgICA2OTYzMiwgICAgICA2OTYzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDY2YzcwNWJhCiswLCAgICAgIDcwMTQ0LCAgICAgIDcwMTQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTgyZWZiYjcKKzAsICAgICAgNzA2NTYsICAgICAgNzA2NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNzE4ZTQ4MQorMCwgICAgICA3MTE2OCwgICAgICA3MTE2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGJmYTEwNDQ0CiswLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzNhYTAzNjAKKzAsICAgICAgNzIxOTIsICAgICAgNzIxOTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5MGUwZmE1OQorMCwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDkwMzcwNmMyCiswLCAgICAgIDczMjE2LCAgICAgIDczMjE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmY3MDAwMWUKKzAsICAgICAgNzM3MjgsICAgICAgNzM3MjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5MjQwZWY3OQorMCwgICAgICA3NDI0MCwgICAgICA3NDI0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQ3MmMwNWM4CiswLCAgICAgIDc0NzUyLCAgICAgIDc0NzUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTY1NWY1ZjUKKzAsICAgICAgNzUyNjQsICAgICAgNzUyNjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyN2I2MGEwZQorMCwgICAgICA3NTc3NiwgICAgICA3NTc3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDU5MTdmODg1CiswLCAgICAgIDc2Mjg4LCAgICAgIDc2Mjg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTM5YzEwN2UKKzAsICAgICAgNzY4MDAsICAgICAgNzY4MDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyYTQ4MTJjMAorMCwgICAgICA3NzMxMiwgICAgICA3NzMxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDM5MTgwYWM4CiswLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGI5ZWZlNTcKKzAsICAgICAgNzgzMzYsICAgICAgNzgzMzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmOWVlZmQyNQorMCwgICAgICA3ODg0OCwgICAgICA3ODg0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQzNjYwY2FlCiswLCAgICAgIDc5MzYwLCAgICAgIDc5MzYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YTdlYmY3ZDUKKzAsICAgICAgNzk4NzIsICAgICAgNzk4NzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0YmFhZjU5ZgorMCwgICAgICA4MDM4NCwgICAgICA4MDM4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDY1OWZmMjA5CiswLCAgICAgIDgwODk2LCAgICAgIDgwODk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWNmODBlMGUKKzAsICAgICAgODE0MDgsICAgICAgODE0MDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyZGY5ZWE2OQorMCwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGZmOGZmYTJkCiswLCAgICAgIDgyNDMyLCAgICAgIDgyNDMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZGQyNzMyZDgKKzAsICAgICAgODI5NDQsICAgICAgODI5NDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjZDZlMzFlYworMCwgICAgICA4MzQ1NiwgICAgICA4MzQ1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDY2ZDBmYjlmCiswLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YmMxMWYyMjkKKzAsICAgICAgODQ0ODAsICAgICAgODQ0ODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzYWUwMGNlYworMCwgICAgICA4NDk5MiwgICAgICA4NDk5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGIwMzJmYjE5CiswLCAgICAgIDg1NTA0LCAgICAgIDg1NTA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjJjOTA0MTQKKzAsICAgICAgODYwMTYsICAgICAgODYwMTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiN2ExZWVhZgorMCwgICAgICA4NjUyOCwgICAgICA4NjUyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDdhNWQwZTcwCiswLCAgICAgIDg3MDQwLCAgICAgIDg3MDQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTZmMTE1MTYKKzAsICAgICAgODc1NTIsICAgICAgODc1NTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmYTk1ZmM3ZgorMCwgICAgICA4ODA2NCwgICAgICA4ODA2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDRmZTcwNWE2CiswLCAgICAgIDg4NTc2LCAgICAgIDg4NTc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTNkMWMzMTEKKzAsICAgICAgODkwODgsICAgICAgODkwODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4MjMwZjRmMQorMCwgICAgICA4OTYwMCwgICAgICA4OTYwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDY5ODVlNThmCiswLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzRkOGYwN2YKKzAsICAgICAgOTA2MjQsICAgICAgOTA2MjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiNmI0YzQ3NworMCwgICAgICA5MTEzNiwgICAgICA5MTEzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGM5NWJjZThiCiswLCAgICAgIDkxNjQ4LCAgICAgIDkxNjQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTdlZmQ1NmYKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkNDUzYzI5NQorMCwgICAgICA5MjY3MiwgICAgICA5MjY3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDgzYzBkYTk3CiswLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjZiZmUzMDcKKzAsICAgICAgOTM2OTYsICAgICAgOTM2OTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwY2U4Y2UyNworMCwgICAgICA5NDIwOCwgICAgICA5NDIwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGM5MjVlNTNmCiswLCAgICAgIDk0NzIwLCAgICAgIDk0NzIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4N2ZlOWQxMjEKKzAsICAgICAgOTUyMzIsICAgICAgOTUyMzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwMGQzZGNmOQorMCwgICAgICA5NTc0NCwgICAgICA5NTc0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDk3NDNkNjM3CiswLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTE2M2YzN2YKKzAsICAgICAgOTY3NjgsICAgICAgOTY3NjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5NzM2ZGMyNworMCwgICAgICA5NzI4MCwgICAgICA5NzI4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGIwYjFlODViCiswLCAgICAgIDk3NzkyLCAgICAgIDk3NzkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTg5ZjBjMmMKKzAsICAgICAgOTgzMDQsICAgICAgOTgzMDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiM2I3YWFiOQorMCwgICAgICA5ODgxNiwgICAgICA5ODgxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDRkZjBkNDZkCiswLCAgICAgIDk5MzI4LCAgICAgIDk5MzI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjkxN2Q0ZGIKKzAsICAgICAgOTk4NDAsICAgICAgOTk4NDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2ZWZkZmU2NQorMCwgICAgIDEwMDM1MiwgICAgIDEwMDM1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDQyNmJkODVkCiswLCAgICAgMTAwODY0LCAgICAgMTAwODY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODI0MzEzZjYKKzAsICAgICAxMDEzNzYsICAgICAxMDEzNzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlNzU1Y2Y0NworMCwgICAgIDEwMTg4OCwgICAgIDEwMTg4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGU0ZThmMTU3CiswLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MDVhOGQxY2IKKzAsICAgICAxMDI5MTIsICAgICAxMDI5MTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhNDA1MDk0YQorMCwgICAgIDEwMzQyNCwgICAgIDEwMzQyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDUwNjBlNDBkCiswLCAgICAgMTAzOTM2LCAgICAgMTAzOTM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4M2ExN2UyNTMKKzAsICAgICAxMDQ0NDgsICAgICAxMDQ0NDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiOGNkZDgwZgorMCwgICAgIDEwNDk2MCwgICAgIDEwNDk2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDcwNzNjNTE3CiswLCAgICAgMTA1NDcyLCAgICAgMTA1NDcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjM0YjAwYzQKKzAsICAgICAxMDU5ODQsICAgICAxMDU5ODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkOGViZDAyNQorMCwgICAgIDEwNjQ5NiwgICAgIDEwNjQ5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDNhNjVjZmY3CiswLCAgICAgMTA3MDA4LCAgICAgMTA3MDA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWU2MWI2NjEKKzAsICAgICAxMDc1MjAsICAgICAxMDc1MjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzYTFkY2FlOQorMCwgICAgIDEwODAzMiwgICAgIDEwODAzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDhkMjgwNTQyCiswLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTkxOGY0OTkKKzAsICAgICAxMDkwNTYsICAgICAxMDkwNTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MDFiZDk4YgorMCwgICAgIDEwOTU2OCwgICAgIDEwOTU2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQyYThlNzJmCiswLCAgICAgMTEwMDgwLCAgICAgMTEwMDgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTZlZGVkZGIKKzAsICAgICAxMTA1OTIsICAgICAxMTA1OTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmZWIxZmRiYgorMCwgICAgIDExMTEwNCwgICAgIDExMTEwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDM2YjFmNGYxCiswLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NWJjNWYyN2IKKzAsICAgICAxMTIxMjgsICAgICAxMTIxMjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiNzI2MDVlZQorMCwgICAgIDExMjY0MCwgICAgIDExMjY0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDcxOGQxMTJlCiswLCAgICAgMTEzMTUyLCAgICAgMTEzMTUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWZmN2YyNWIKKzAsICAgICAxMTM2NjQsICAgICAxMTM2NjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZGQxMTVjYworMCwgICAgIDExNDE3NiwgICAgIDExNDE3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDFmZjdmYjE1CiswLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZWI2MWYyNDEKKzAsICAgICAxMTUyMDAsICAgICAxMTUyMDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjM2JkZWI4MworMCwgICAgIDExNTcxMiwgICAgIDExNTcxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweGVhODAwMTFhCiswLCAgICAgMTE2MjI0LCAgICAgMTE2MjI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGQzY2VlNzEKKzAsICAgICAxMTY3MzYsICAgICAxMTY3MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4Y2ZiZjU4OQorMCwgICAgIDExNzI0OCwgICAgIDExNzI0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGJhMjNmOGUzCiswLCAgICAgMTE3NzYwLCAgICAgMTE3NzYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODdhMWU4NmQKKzAsICAgICAxMTgyNzIsICAgICAxMTgyNzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzOGU2ZjFhNQorMCwgICAgIDExODc4NCwgICAgIDExODc4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGUwNWExMmZlCiswLCAgICAgMTE5Mjk2LCAgICAgMTE5Mjk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OWExNGU4MzUKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxMWExMTc4MAorMCwgICAgIDEyMDMyMCwgICAgIDEyMDMyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDBjMjMwOGU2CiswLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzhhZGZhNGIKKzAsICAgICAxMjEzNDQsICAgICAxMjEzNDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmZTRjMTE4YQorMCwgICAgIDEyMTg1NiwgICAgIDEyMTg1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweGE2MjQwYWMwCiswLCAgICAgMTIyMzY4LCAgICAgMTIyMzY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4M2ZmM2VlMmIKKzAsICAgICAxMjI4ODAsICAgICAxMjI4ODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjNmFhZjc2OQorMCwgICAgIDEyMzM5MiwgICAgIDEyMzM5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDRhZGFmY2RkCiswLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YWJkNmU4NDUKKzAsICAgICAxMjQ0MTYsICAgICAxMjQ0MTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyNWU2MDc2YQorMCwgICAgIDEyNDkyOCwgICAgIDEyNDkyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI2ZTZkNGI5CiswLCAgICAgMTI1NDQwLCAgICAgMTI1NDQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzI1MWYyMjUKKzAsICAgICAxMjU5NTIsICAgICAxMjU5NTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjM2I1Zjc1MQorMCwgICAgIDEyNjQ2NCwgICAgIDEyNjQ2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDRmMjdjZWNkCiswLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjM3YzAyMGMKKzAsICAgICAxMjc0ODgsICAgICAxMjc0ODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiMDU4MDU1NgorMCwgICAgIDEyODAwMCwgICAgIDEyODAwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDcxNzAwOGE0CiswLCAgICAgMTI4NTEyLCAgICAgMTI4NTEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjY4M2UzZmIKKzAsICAgICAxMjkwMjQsICAgICAxMjkwMjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZGRlZmQzMworMCwgICAgIDEyOTUzNiwgICAgIDEyOTUzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDRjNmMxNDk2CiswLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjdmOTA3ZmUKKzAsICAgICAxMzA1NjAsICAgICAxMzA1NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1YmIxMDkzOAorMCwgICAgIDEzMTA3MiwgICAgIDEzMTA3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDI0YTIwZWFjCiswLCAgICAgMTMxNTg0LCAgICAgMTMxNTg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjI1MWVmZmIKKzAsICAgICAxMzIwOTYsICAgICAxMzIwOTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhZmQ3ZWIwNAorMCwgICAgIDEzMjYwOCwgICAgIDEzMjYwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGExOTUwMjQ1CiswLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGNkZWZiMGQKKzAsICAgICAxMzM2MzIsICAgICAxMzM2MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1Njk0ZmEzMgorMCwgICAgIDEzNDE0NCwgICAgIDEzNDE0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDA5NDJlZWI2CiswLCAgICAgMTM0NjU2LCAgICAgMTM0NjU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzE1YTAxYzEKKzAsICAgICAxMzUxNjgsICAgICAxMzUxNjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0NTMxZjYzZQorMCwgICAgIDEzNTY4MCwgICAgIDEzNTY4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDIxNGZmYmJjCiswLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MGY1MGZlMjEKKzAsICAgICAxMzY3MDQsICAgICAxMzY3MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlNDU2MDQ2YgorMCwgICAgIDEzNzIxNiwgICAgIDEzNzIxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGQ2ZWFmZjRkCiswLCAgICAgMTM3NzI4LCAgICAgMTM3NzI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDgxNDA2MzQKKzAsICAgICAxMzgyNDAsICAgICAxMzgyNDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2MDhlMGJmZgorMCwgICAgIDEzODc1MiwgICAgIDEzODc1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDc2NjEwY2VlCiswLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmI0OGYwZmYKKzAsICAgICAxMzk3NzYsICAgICAxMzk3NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwM2M3ZjljZQorMCwgICAgIDE0MDI4OCwgICAgIDE0MDI4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGY3MThmYWQxCiswLCAgICAgMTQwODAwLCAgICAgMTQwODAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Mjk2YmVmMjkKKzAsICAgICAxNDEzMTIsICAgICAxNDEzMTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyMzExZjJiZgorMCwgICAgIDE0MTgyNCwgICAgIDE0MTgyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDA2OWZmZTYwCiswLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjEyNjA1NWQKKzAsICAgICAxNDI4NDgsICAgICAxNDI4NDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5MzMwZWRhNgorMCwgICAgIDE0MzM2MCwgICAgIDE0MzM2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGRmYmVlZGMxCiswLCAgICAgMTQzODcyLCAgICAgMTQzODcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODUzNmYxYjgKKzAsICAgICAxNDQzODQsICAgICAxNDQzODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmZTMwZmQ3MgorMCwgICAgIDE0NDg5NiwgICAgIDE0NDg5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDEzMzIwMjY0CiswLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ODNhZDA5ZGIKKzAsICAgICAxNDU5MjAsICAgICAxNDU5MjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjMDhiMGIzMQorMCwgICAgIDE0NjQzMiwgICAgIDE0NjQzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweGRhOGFmZWEwCiswLCAgICAgMTQ2OTQ0LCAgICAgMTQ2OTQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MGNiM2YwNDAKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4MGMwZmMxNworMCwgICAgIDE0Nzk2OCwgICAgIDE0Nzk2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDlkODBmZGZiCiswLCAgICAgMTQ4NDgwLCAgICAgMTQ4NDgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OWYxYWYxZmQKKzAsICAgICAxNDg5OTIsICAgICAxNDg5OTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5MmZlZjEwMgorMCwgICAgIDE0OTUwNCwgICAgIDE0OTUwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDViNjJmN2JlCiswLCAgICAgMTUwMDE2LCAgICAgMTUwMDE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjU4MDBhNWIKKzAsICAgICAxNTA1MjgsICAgICAxNTA1MjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjNjYwZmJhMworMCwgICAgIDE1MTA0MCwgICAgIDE1MTA0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDBlMjFmYmRhCiswLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmU3ZjAyN2QKKzAsICAgICAxNTIwNjQsICAgICAxNTIwNjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjZjY1ZmViNAorMCwgICAgIDE1MjU3NiwgICAgIDE1MjU3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDRlMGZmYTZkCiswLCAgICAgMTUzMDg4LCAgICAgMTUzMDg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzMyYmZmMzYKKzAsICAgICAxNTM2MDAsICAgICAxNTM2MDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzZGYyMGU3ZQorMCwgICAgIDE1NDExMiwgICAgIDE1NDExMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDJhNTAwNmU1CiswLCAgICAgMTU0NjI0LCAgICAgMTU0NjI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmQzYmZhMmEKKzAsICAgICAxNTUxMzYsICAgICAxNTUxMzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4ZTczZjc1NQorMCwgICAgIDE1NTY0OCwgICAgIDE1NTY0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDZmOTNlY2UxCiswLCAgICAgMTU2MTYwLCAgICAgMTU2MTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzhhNGY3MzUKKzAsICAgICAxNTY2NzIsICAgICAxNTY2NzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzYTdjZmMxYworMCwgICAgIDE1NzE4NCwgICAgIDE1NzE4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGJmYzBmNzk1CiswLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4N2E4Y2ZlZDIKKzAsICAgICAxNTgyMDgsICAgICAxNTgyMDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzZDBmZGVlNQorMCwgICAgIDE1ODcyMCwgICAgIDE1ODcyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDkwMmFmYzc4CiswLCAgICAgMTU5MjMyLCAgICAgMTU5MjMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTFkY2YwZTIKKzAsICAgICAxNTk3NDQsICAgICAxNTk3NDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZjU5ZmMwMAorMCwgICAgIDE2MDI1NiwgICAgIDE2MDI1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDJkZDBmMzkwCiswLCAgICAgMTYwNzY4LCAgICAgMTYwNzY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmZmMzBmN2MKKzAsICAgICAxNjEyODAsICAgICAxNjEyODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzNmY1MDhiOAorMCwgICAgIDE2MTc5MiwgICAgIDE2MTc5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDUxZThlZjJkCiswLCAgICAgMTYyMzA0LCAgICAgMTYyMzA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Zjk2NjBlZDcKKzAsICAgICAxNjI4MTYsICAgICAxNjI4MTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1MGYzZmQ0ZAorMCwgICAgIDE2MzMyOCwgICAgIDE2MzMyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDM2NmVmNmI5CiswLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjAyM2YxN2EKKzAsICAgICAxNjQzNTIsICAgICAxNjQzNTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNmM2ZjFmMAorMCwgICAgIDE2NDg2NCwgICAgIDE2NDg2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDZkMWRmZWJmCiswLCAgICAgMTY1Mzc2LCAgICAgMTY1Mzc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZWFkNjBlMWQKKzAsICAgICAxNjU4ODgsICAgICAxNjU4ODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiZTUyMDFhNgorMCwgICAgIDE2NjQwMCwgICAgIDE2NjQwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGIxOTQwMjY5CiswLCAgICAgMTY2OTEyLCAgICAgMTY2OTEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjZjZGYzNTAKKzAsICAgICAxNjc0MjQsICAgICAxNjc0MjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3YzQ0ZjgwZQorMCwgICAgIDE2NzkzNiwgICAgIDE2NzkzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDFmZmYwM2VmCiswLCAgICAgMTY4NDQ4LCAgICAgMTY4NDQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTE0ODA3YzYKKzAsICAgICAxNjg5NjAsICAgICAxNjg5NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlMDRlZWRlNworMCwgICAgIDE2OTQ3MiwgICAgIDE2OTQ3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDM0N2UwMjcyCiswLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGMwMGZiOTYKKzAsICAgICAxNzA0OTYsICAgICAxNzA0OTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2NjYwZjYwNworMCwgICAgIDE3MTAwOCwgICAgIDE3MTAwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGU5YTcwMTdkCiswLCAgICAgMTcxNTIwLCAgICAgMTcxNTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Y2E1OGU4YWUKKzAsICAgICAxNzIwMzIsICAgICAxNzIwMzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3OTVhZjkyYQorMCwgICAgIDE3MjU0NCwgICAgIDE3MjU0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDdkNmFlZTFiCiswLCAgICAgMTczMDU2LCAgICAgMTczMDU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGFiOWY1OGYKKzAsICAgICAxNzM1NjgsICAgICAxNzM1NjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzYjkxZjYxNworMCwgICAgIDE3NDA4MCwgICAgIDE3NDA4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDA5ZTFmN2Q3CiswLCAgICAgMTc0NTkyLCAgICAgMTc0NTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzkyODA3NTMKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4NjIwZjY2MgorMCwgICAgIDE3NTYxNiwgICAgIDE3NTYxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDZiYjEwM2ZhCiswLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Y2ZlZTAzNzEKKzAsICAgICAxNzY2NDAsICAgICAxNzY2NDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlMWUyMDI5NAorMCwgICAgIDE3NzE1MiwgICAgIDE3NzE1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGRiOThmZWE0CiswLCAgICAgMTc3NjY0LCAgICAgMTc3NjY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGQxZmRkZWIKKzAsICAgICAxNzgxNzYsICAgICAxNzgxNzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0ZTc1MDFiZgorMCwgICAgIDE3ODY4OCwgICAgIDE3ODY4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDY4ZDBmYjk1CiswLCAgICAgMTc5MjAwLCAgICAgMTc5MjAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjY4NTAwMWUKKzAsICAgICAxNzk3MTIsICAgICAxNzk3MTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3NWRhZmExMAorMCwgICAgIDE4MDIyNCwgICAgIDE4MDIyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDUzNGZlNzcyCiswLCAgICAgMTgwNzM2LCAgICAgMTgwNzM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjhiNGZlMTgKKzAsICAgICAxODEyNDgsICAgICAxODEyNDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyYmEwMDY3OAorMCwgICAgIDE4MTc2MCwgICAgIDE4MTc2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGM4ODRlMGI3CiswLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmFlNDA3ODcKKzAsICAgICAxODI3ODQsICAgICAxODI3ODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjNTNjZjM1ZAorMCwgICAgIDE4MzI5NiwgICAgIDE4MzI5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDczOGQwNmI0CiswLCAgICAgMTgzODA4LCAgICAgMTgzODA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjU1MWY1ODIKKzAsICAgICAxODQzMjAsICAgICAxODQzMjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4YTVhODc2NAorMCwgICAgIDE4NDgzMiwgICAgIDE4NDgzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDcxMWYxNzVlCiswLCAgICAgMTg1MzQ0LCAgICAgMTg1MzQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTVlMWVkNDMKKzAsICAgICAxODU4NTYsICAgICAxODU4NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzNGFkZmFlYgorMCwgICAgIDE4NjM2OCwgICAgIDE4NjM2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDc5ZmIwMTQyCiswLCAgICAgMTg2ODgwLCAgICAgMTg2ODgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjRmNmZmZWIKKzAsICAgICAxODczOTIsICAgICAxODczOTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkMzU0MGE2YgorMCwgICAgIDE4NzkwNCwgICAgIDE4NzkwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ5Y2FmM2M2CiswLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzFkYjA1YjcKKzAsICAgICAxODg5MjgsICAgICAxODg5MjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyNmYwMTE0YQorMCwgICAgIDE4OTQ0MCwgICAgIDE4OTQ0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDU3NmVlYWQ5CiswLCAgICAgMTg5OTUyLCAgICAgMTg5OTUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yjg3ZjAwZTkKKzAsICAgICAxOTA0NjQsICAgICAxOTA0NjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0NzBkMDMwZgorMCwgICAgIDE5MDk3NiwgICAgIDE5MDk3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDYwZWMwMmIyCiswLCAgICAgMTkxNDg4LCAgICAgMTkxNDg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yjg0YTBiNDQKKzAsICAgICAxOTIwMDAsICAgICAxOTIwMDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHgzOWI2ZWM0NQorMCwgICAgIDE5MjUxMiwgICAgIDE5MjUxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDFlMDdlNTgwCiswLCAgICAgMTkzMDI0LCAgICAgMTkzMDI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmEzY2Y1ZDYKKzAsICAgICAxOTM1MzYsICAgICAxOTM1MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgwODAxZjliOAorMCwgICAgIDE5NDA0OCwgICAgIDE5NDA0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDU1OTgxYTgwCiswLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTUxMGY2YWQKKzAsICAgICAxOTUwNzIsICAgICAxOTUwNzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3ZDAzZmNjNworMCwgICAgIDE5NTU4NCwgICAgIDE5NTU4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGYxN2JmODRlCiswLCAgICAgMTk2MDk2LCAgICAgMTk2MDk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NmQxZmZlNGMKKzAsICAgICAxOTY2MDgsICAgICAxOTY2MDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5MWUyMTBmOQorMCwgICAgIDE5NzEyMCwgICAgIDE5NzEyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI4ODFmYTQ0CiswLCAgICAgMTk3NjMyLCAgICAgMTk3NjMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjdjZGYxZjMKKzAsICAgICAxOTgxNDQsICAgICAxOTgxNDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZTliMTdiNQorMCwgICAgIDE5ODY1NiwgICAgIDE5ODY1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDc0ZGZmMGUzCiswLCAgICAgMTk5MTY4LCAgICAgMTk5MTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWY1NTA1MGUKKzAsICAgICAxOTk2ODAsICAgICAxOTk2ODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3NDk4ZjFiOAorMCwgICAgIDIwMDE5MiwgICAgIDIwMDE5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDJkN2MwMmU5CiswLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGM4NGE1YzQKKzAsICAgICAyMDEyMTYsICAgICAyMDEyMTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2ZmVhZTEwZAorMCwgICAgIDIwMTcyOCwgICAgIDIwMTcyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGZkYTkwYjI4CiswLCAgICAgMjAyMjQwLCAgICAgMjAyMjQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjIzMGZkNzIKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2Mjk4ZjcyOAorMCwgICAgIDIwMzI2NCwgICAgIDIwMzI2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGVmNjBmODcxCiswLCAgICAgMjAzNzc2LCAgICAgMjAzNzc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MTRlN2VlMDEKKzAsICAgICAyMDQyODgsICAgICAyMDQyODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5OGQ3MDRhNQorMCwgICAgIDIwNDgwMCwgICAgIDIwNDgwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDFjY2FmMmI0CiswLCAgICAgMjA1MzEyLCAgICAgMjA1MzEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YjllZGU3MjEKKzAsICAgICAyMDU4MjQsICAgICAyMDU4MjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4YzU3MGQ5MgorMCwgICAgIDIwNjMzNiwgICAgIDIwNjMzNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDJkN2VmNzgyCiswLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YTg0Y2Y1NWUKKzAsICAgICAyMDczNjAsICAgICAyMDczNjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4MDMzZjViOQorMCwgICAgIDIwNzg3MiwgICAgIDIwNzg3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDI3ZjNlZDI3CiswLCAgICAgMjA4Mzg0LCAgICAgMjA4Mzg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YTY3MzBjMjUKKzAsICAgICAyMDg4OTYsICAgICAyMDg4OTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0ODliZjJmZAorMCwgICAgIDIwOTQwOCwgICAgIDIwOTQwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweGUxZTIwMjk0CiswLCAgICAgMjA5OTIwLCAgICAgMjA5OTIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZGI5OGZlYTQKKzAsICAgICAyMTA0MzIsICAgICAyMTA0MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4ZDFmZGRlYgorMCwgICAgIDIxMDk0NCwgICAgIDIxMDk0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDRlNzUwMWJmCiswLCAgICAgMjExNDU2LCAgICAgMjExNDU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjhkMGZiOTUKKzAsICAgICAyMTE5NjgsICAgICAyMTE5NjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNjg1MDAxZQorMCwgICAgIDIxMjQ4MCwgICAgIDIxMjQ4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDc1ZGFmYTEwCiswLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTM0ZmU3NzIKKzAsICAgICAyMTM1MDQsICAgICAyMTM1MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgyOGI0ZmUxOAorMCwgICAgIDIxNDAxNiwgICAgIDIxNDAxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweDJiYTAwNjc4CiswLCAgICAgMjE0NTI4LCAgICAgMjE0NTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yzg4NGUwYjcKKzAsICAgICAyMTUwNDAsICAgICAyMTUwNDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2YWU0MDc4NworMCwgICAgIDIxNTU1MiwgICAgIDIxNTU1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGM1M2NmMzVkCiswLCAgICAgMjE2MDY0LCAgICAgMjE2MDY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzM4ZDA2YjQKKzAsICAgICAyMTY1NzYsICAgICAyMTY1NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiNTUxZjU4MgorMCwgICAgIDIxNzA4OCwgICAgIDIxNzA4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDhhNWE4NzY0CiswLCAgICAgMjE3NjAwLCAgICAgMjE3NjAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzExZjE3NWUKKzAsICAgICAyMTgxMTIsICAgICAyMTgxMTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhlNWUxZWQ0MworMCwgICAgIDIxODYyNCwgICAgIDIxODYyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDM0YWRmYWViCiswLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzlmYjAxNDIKKzAsICAgICAyMTk2NDgsICAgICAyMTk2NDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmNGY2ZmZlYgorMCwgICAgIDIyMDE2MCwgICAgIDIyMDE2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGQzNTQwYTZiCiswLCAgICAgMjIwNjcyLCAgICAgMjIwNjcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDljYWYzYzYKKzAsICAgICAyMjExODQsICAgICAyMjExODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjMWRiMDViNworMCwgICAgIDIyMTY5NiwgICAgIDIyMTY5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDI2ZjAxMTRhCiswLCAgICAgMjIyMjA4LCAgICAgMjIyMjA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTc2ZWVhZDkKKzAsICAgICAyMjI3MjAsICAgICAyMjI3MjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiODdmMDBlOQorMCwgICAgIDIyMzIzMiwgICAgIDIyMzIzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ3MGQwMzBmCiswLCAgICAgMjIzNzQ0LCAgICAgMjIzNzQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NjBlYzAyYjIKKzAsICAgICAyMjQyNTYsICAgICAyMjQyNTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiODRhMGI0NAorMCwgICAgIDIyNDc2OCwgICAgIDIyNDc2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDM5YjZlYzQ1CiswLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWUwN2U1ODAKKzAsICAgICAyMjU3OTIsICAgICAyMjU3OTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmYTNjZjVkNgorMCwgICAgIDIyNjMwNCwgICAgIDIyNjMwNCwgICAgICA1MTIsICAgICAyMDQ4LCAweDA4MDFmOWI4CiswLCAgICAgMjI2ODE2LCAgICAgMjI2ODE2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NTU5ODFhODAKKzAsICAgICAyMjczMjgsICAgICAyMjczMjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg5NTEwZjZhZAorMCwgICAgIDIyNzg0MCwgICAgIDIyNzg0MCwgICAgICA1MTIsICAgICAyMDQ4LCAweDdkMDNmY2M3CiswLCAgICAgMjI4MzUyLCAgICAgMjI4MzUyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZjE3YmY4NGUKKzAsICAgICAyMjg4NjQsICAgICAyMjg4NjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2ZDFmZmU0YworMCwgICAgIDIyOTM3NiwgICAgIDIyOTM3NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDkxZTIxMGY5CiswLCAgICAgMjI5ODg4LCAgICAgMjI5ODg4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4Yjg4MWZhNDQKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiN2NkZjFmMworMCwgICAgIDIzMDkxMiwgICAgIDIzMDkxMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDFlOWIxN2I1CiswLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzRkZmYwZTMKKzAsICAgICAyMzE5MzYsICAgICAyMzE5MzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZjU1MDUwZQorMCwgICAgIDIzMjQ0OCwgICAgIDIzMjQ0OCwgICAgICA1MTIsICAgICAyMDQ4LCAweDc0OThmMWI4CiswLCAgICAgMjMyOTYwLCAgICAgMjMyOTYwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmQ3YzAyZTkKKzAsICAgICAyMzM0NzIsICAgICAyMzM0NzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg4Yzg0YTVjNAorMCwgICAgIDIzMzk4NCwgICAgIDIzMzk4NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDZmZWFlMTBkCiswLCAgICAgMjM0NDk2LCAgICAgMjM0NDk2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZmRhOTBiMjgKKzAsICAgICAyMzUwMDgsICAgICAyMzUwMDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiMjMwZmQ3MgorMCwgICAgIDIzNTUyMCwgICAgIDIzNTUyMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDYyOThmNzI4CiswLCAgICAgMjM2MDMyLCAgICAgMjM2MDMyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZWY2MGY4NzEKKzAsICAgICAyMzY1NDQsICAgICAyMzY1NDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxNGU3ZWUwMQorMCwgICAgIDIzNzA1NiwgICAgIDIzNzA1NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDk4ZDcwNGE1CiswLCAgICAgMjM3NTY4LCAgICAgMjM3NTY4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWNjYWYyYjQKKzAsICAgICAyMzgwODAsICAgICAyMzgwODAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiOWVkZTcyMQorMCwgICAgIDIzODU5MiwgICAgIDIzODU5MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDhjNTcwZDkyCiswLCAgICAgMjM5MTA0LCAgICAgMjM5MTA0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmQ3ZWY3ODIKKzAsICAgICAyMzk2MTYsICAgICAyMzk2MTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhODRjZjU1ZQorMCwgICAgIDI0MDEyOCwgICAgIDI0MDEyOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDgwMzNmNWI5CiswLCAgICAgMjQwNjQwLCAgICAgMjQwNjQwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjdmM2VkMjcKKzAsICAgICAyNDExNTIsICAgICAyNDExNTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhhNjczMGMyNQorMCwgICAgIDI0MTY2NCwgICAgIDI0MTY2NCwgICAgICA1MTIsICAgICAyMDQ4LCAweDQ4OWJmMmZkCiswLCAgICAgMjQyMTc2LCAgICAgMjQyMTc2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZTFlMjAyOTQKKzAsICAgICAyNDI2ODgsICAgICAyNDI2ODgsICAgICAgNTEyLCAgICAgMjA0OCwgMHhkYjk4ZmVhNAorMCwgICAgIDI0MzIwMCwgICAgIDI0MzIwMCwgICAgICA1MTIsICAgICAyMDQ4LCAweDhkMWZkZGViCiswLCAgICAgMjQzNzEyLCAgICAgMjQzNzEyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NGU3NTAxYmYKKzAsICAgICAyNDQyMjQsICAgICAyNDQyMjQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2OGQwZmI5NQorMCwgICAgIDI0NDczNiwgICAgIDI0NDczNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGY2ODUwMDFlCiswLCAgICAgMjQ1MjQ4LCAgICAgMjQ1MjQ4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NzVkYWZhMTAKKzAsICAgICAyNDU3NjAsICAgICAyNDU3NjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1MzRmZTc3MgorMCwgICAgIDI0NjI3MiwgICAgIDI0NjI3MiwgICAgICA1MTIsICAgICAyMDQ4LCAweDI4YjRmZTE4CiswLCAgICAgMjQ2Nzg0LCAgICAgMjQ2Nzg0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MmJhMDA2NzgKKzAsICAgICAyNDcyOTYsICAgICAyNDcyOTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhjODg0ZTBiNworMCwgICAgIDI0NzgwOCwgICAgIDI0NzgwOCwgICAgICA1MTIsICAgICAyMDQ4LCAweDZhZTQwNzg3CiswLCAgICAgMjQ4MzIwLCAgICAgMjQ4MzIwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4YzUzY2YzNWQKKzAsICAgICAyNDg4MzIsICAgICAyNDg4MzIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MzhkMDZiNAorMCwgICAgIDI0OTM0NCwgICAgIDI0OTM0NCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI1NTFmNTgyCiswLCAgICAgMjQ5ODU2LCAgICAgMjQ5ODU2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OGE1YTg3NjQKKzAsICAgICAyNTAzNjgsICAgICAyNTAzNjgsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3MTFmMTc1ZQorMCwgICAgIDI1MDg4MCwgICAgIDI1MDg4MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGU1ZTFlZDQzCiswLCAgICAgMjUxMzkyLCAgICAgMjUxMzkyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzRhZGZhZWIKKzAsICAgICAyNTE5MDQsICAgICAyNTE5MDQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg3OWZiMDE0MgorMCwgICAgIDI1MjQxNiwgICAgIDI1MjQxNiwgICAgICA1MTIsICAgICAyMDQ4LCAweGY0ZjZmZmViCiswLCAgICAgMjUyOTI4LCAgICAgMjUyOTI4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4ZDM1NDBhNmIKKzAsICAgICAyNTM0NDAsICAgICAyNTM0NDAsICAgICAgNTEyLCAgICAgMjA0OCwgMHg0OWNhZjNjNgorMCwgICAgIDI1Mzk1MiwgICAgIDI1Mzk1MiwgICAgICA1MTIsICAgICAyMDQ4LCAweGMxZGIwNWI3CiswLCAgICAgMjU0NDY0LCAgICAgMjU0NDY0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MjZmMDExNGEKKzAsICAgICAyNTQ5NzYsICAgICAyNTQ5NzYsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1NzZlZWFkOQorMCwgICAgIDI1NTQ4OCwgICAgIDI1NTQ4OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI4N2YwMGU5CiswLCAgICAgMjU2MDAwLCAgICAgMjU2MDAwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4NDcwZDAzMGYKKzAsICAgICAyNTY1MTIsICAgICAyNTY1MTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHg2MGVjMDJiMgorMCwgICAgIDI1NzAyNCwgICAgIDI1NzAyNCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI4NGEwYjQ0CiswLCAgICAgMjU3NTM2LCAgICAgMjU3NTM2LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MzliNmVjNDUKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAgNTEyLCAgICAgMjA0OCwgMHgxZTA3ZTU4MAorMCwgICAgIDI1ODU2MCwgICAgIDI1ODU2MCwgICAgICA1MTIsICAgICAyMDQ4LCAweGZhM2NmNWQ2CiswLCAgICAgMjU5MDcyLCAgICAgMjU5MDcyLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MDgwMWY5YjgKKzAsICAgICAyNTk1ODQsICAgICAyNTk1ODQsICAgICAgNTEyLCAgICAgMjA0OCwgMHg1NTk4MWE4MAorMCwgICAgIDI2MDA5NiwgICAgIDI2MDA5NiwgICAgICA1MTIsICAgICAyMDQ4LCAweDk1MTBmNmFkCiswLCAgICAgMjYwNjA4LCAgICAgMjYwNjA4LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4N2QwM2ZjYzcKKzAsICAgICAyNjExMjAsICAgICAyNjExMjAsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmMTdiZjg0ZQorMCwgICAgIDI2MTYzMiwgICAgIDI2MTYzMiwgICAgICA1MTIsICAgICAyMDQ4LCAweDZkMWZmZTRjCiswLCAgICAgMjYyMTQ0LCAgICAgMjYyMTQ0LCAgICAgIDUxMiwgICAgIDIwNDgsIDB4OTFlMjEwZjkKKzAsICAgICAyNjI2NTYsICAgICAyNjI2NTYsICAgICAgNTEyLCAgICAgMjA0OCwgMHhiODgxZmE0NAorMCwgICAgIDI2MzE2OCwgICAgIDI2MzE2OCwgICAgICA1MTIsICAgICAyMDQ4LCAweGI3Y2RmMWYzCiswLCAgICAgMjYzNjgwLCAgICAgMjYzNjgwLCAgICAgIDUxMiwgICAgIDIwNDgsIDB4MWU5YjE3YjUKKzAsICAgICAyNjQxOTIsICAgICAyNjQxOTIsICAgICAgNTEyLCAgICAgMjA0OCwgMHhmZDgyMzEzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFzZXRyYXRlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWFzZXRyYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZmE5NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXNldHJhdGUKQEAgLTAsMCArMSwyNiBAQAorI3RiIDA6IDEvMjAwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogMjAwMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOWUzZWVjZgorMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4MzkwYjk2CiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzQ3N2ZhOTkKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgzYmMwZjE0ZgorMCwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDIzNzllZDkxCiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmQ2YTAwNzAKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYjAxZjRjZgorMCwgICAgICAgNzE2OCwgICAgICAgNzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY3MTZmZDkzCiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTg0MGYyNWIKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5YzFmZmFmMQorMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGNiZWRlZmFmCiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2UwNTAzOTAKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhiMzBlMDA5MAorMCwgICAgICAxMzMxMiwgICAgICAxMzMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDI2YjhmNzViCiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDcwNmUzMTEKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwYzQ4MDEzOAorMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDZjOWEwMjE2CiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4N2FiY2U1NGYKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkYTQ1ZjYzZgorMCwgICAgICAxOTQ1NiwgICAgICAxOTQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDUwZDVmZjg3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXRyaW0tZHVyYXRpb24gYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXRyaW0tZHVyYXRpb24KaW5kZXggYTUxZGZmNy4uZmFmZGExNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWF0cmltLWR1cmF0aW9uCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hdHJpbS1kdXJhdGlvbgpAQCAtMSwyICsxLDcgQEAKICN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiAwLCAgICAgICA0NDEwLCAgICAgICA0NDEwLCAgICAgIDQ0MSwgICAgIDE3NjQsIDB4NjFlMzc0ZjcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hdHJpbS1taXhlZCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hdHJpbS1taXhlZAppbmRleCBhZTMyODFhLi40Y2QxZDgwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXRyaW0tbWl4ZWQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWF0cmltLW1peGVkCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgIDEwMjUsICAgICAgIDEwMjUsICAgICAxMDIzLCAgICAgNDA5MiwgMHg3ODU2MGE0YwogMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM0NzdmYTk5CiAwLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2JjMGYxNGYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hdHJpbS1zYW1wbGVzIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWF0cmltLXNhbXBsZXMKaW5kZXggMzQ2MTY2Ni4uMmQ4YzlhNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWF0cmltLXNhbXBsZXMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWF0cmltLXNhbXBsZXMKQEAgLTEsMiArMSw3IEBACiAjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgNTQsICAgICAgMjE2LCAweDZiMzc2YzZjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItYXRyaW0tdGltZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hdHJpbS10aW1lCmluZGV4IGEzNjgyMTAuLmEwYzYyNmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hdHJpbS10aW1lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1hdHJpbS10aW1lCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgIDQ0MTAsICAgICAgIDQ0MTAsICAgICAgNzEwLCAgICAgMjg0MCwgMHg2NTg5ODJhMwogMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZkNmEwMDcwCiAwLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGIwMWY0Y2YKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ib3hibHVyIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWJveGJsdXIKaW5kZXggYWNiMmJlYi4uZDMzMmYzYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWJveGJsdXIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWJveGJsdXIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxMTM0ODlmOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDY1MGE2NGNhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MjllY2Y2YjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jaG9ydXMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY2hvcnVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMWU2MGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY2hvcnVzCkBAIC0wLDAgKzEsMTYgQEAKKyN0YiAwOiAxLzIyMDUwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDIwNDgsICAgICA0MDk2LCAweDFmYzZmMWYxCiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMjA0OCwgICAgIDQwOTYsIDB4ZTVmN2Y0NDIKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAyMDQ4LCAgICAgNDA5NiwgMHg0ZjE0ZWNiOQorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDIwNDgsICAgICA0MDk2LCAweGQ0MzFlZWVlCiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMjA0OCwgICAgIDQwOTYsIDB4NGMzOGVhZDYKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAyMDQ4LCAgICAgNDA5NiwgMHg3ODZjZjA3MQorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDIwNDgsICAgICA0MDk2LCAweGUyOTFmMjAwCiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMjA0OCwgICAgIDQwOTYsIDB4NDdkMmYxZGQKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAyMDQ4LCAgICAgNDA5NiwgMHhkNmExZjAyOAorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDIwNDgsICAgICA0MDk2LCAweDJiZjRlYzc5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY29kZWN2aWV3LW12cyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb2RlY3ZpZXctbXZzCmluZGV4IDEzMjg2ZjAuLjRlMWU1M2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb2RlY3ZpZXctbXZzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb2RlY3ZpZXctbXZzCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDMyNzY4Lzc4NTY0NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTc2eDMyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI3NjQ4MCwgMHg1ZjdhMGQ0ZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjc2NDgwLCAweDVmN2EwZDRmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyNzY0ODAsIDB4NWY3YTBkNGYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb2xvcmNoYW5uZWxtaXhlciBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb2xvcmNoYW5uZWxtaXhlcgppbmRleCA0ZTllOWQzLi45M2Y5YTM5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY29sb3JjaGFubmVsbWl4ZXIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWNvbG9yY2hhbm5lbG1peGVyCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4NDI5MDBjMTMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNDEyOCwgMHhmYjA0MzliYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA0MTI4LCAweDk2N2I5ZjBkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY29sb3JtYXRyaXgxIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWNvbG9ybWF0cml4MQppbmRleCAwZjAwOGUwLi4yZjI1ZjZjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY29sb3JtYXRyaXgxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb2xvcm1hdHJpeDEKQEAgLTEgKzEgQEAKLWNvbG9ybWF0cml4MSAgICAgICAgMGEwNjQwYjJkNGNjZDRlNzkzZjQ5MTlkODJhODk1MjMKK2NvbG9ybWF0cml4MSAgICAgICAgMTU5M2UyNGE3MWRiNDJkMDc3ODFiOTI2NjVjZjk5YTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb2xvcm1hdHJpeDIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY29sb3JtYXRyaXgyCmluZGV4IDdmMzIzMmUuLmI1N2I1OTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb2xvcm1hdHJpeDIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWNvbG9ybWF0cml4MgpAQCAtMSArMSBAQAotY29sb3JtYXRyaXgyICAgICAgICA1ZWIxNzY3MWMwMzQ5NmFlNDM3MjNlNDk4MzJhYjE3YQorY29sb3JtYXRyaXgyICAgICAgICBjYWZiYTI5NGRlYmI4OWY1OTE0M2I1MTlmM2NkMTY3MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWNvbXBhbmQgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY29tcGFuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzkwOTVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWNvbXBhbmQKQEAgLTAsMCArMSwyNiBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmYzEwZTYxYgorMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg4MDFlZjEzCiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YmE1NWZjMTcKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MGYyMDNhMAorMCwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDlmMmZmNTkzCiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTJmMGZiNzcKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0MzU1MDJlYworMCwgICAgICAgNzE2OCwgICAgICAgNzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFhY2ZlNGJiCiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzgwMTBmNDQKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4YTc5ZTM1MQorMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNkNjZlYzkxCiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDMwMzFiN2UKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhkOWMzMTBlYworMCwgICAgICAxMzMxMiwgICAgICAxMzMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDA3NmFmMjhiCiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjgwZmRmZTMKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZjBmZTY4ZAorMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY3OWVmYjRkCiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Zjg0ZmU2ZTMKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwMWViZjE3NQorMCwgICAgICAxOTQ1NiwgICAgICAxOTQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGU3Y2RlYTFiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY29uY2F0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWNvbmNhdAppbmRleCA3M2U0MTg1Li4wMjI2OTdlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY29uY2F0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jb25jYXQKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDEvNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKICN0YiAxOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDE6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMTogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweDg4YzRkMTlhCiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YjNmMTAxOTIKIDEsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgMjA0OCwgMHhiMzQwZmU0ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWN1cnZlcyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1jdXJ2ZXMKaW5kZXggYTk2ZjBlZS4uNDAxYmQyZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWN1cnZlcworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItY3VydmVzCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA5MjE2MDAsIDB4Y2Y0MjY3ODAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDkyMTYwMCwgMHg3NjQyODkyZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgOTIxNjAwLCAweDEzYzFhYjdlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZGNzaGlmdCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1kY3NoaWZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZDNkZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZGNzaGlmdApAQCAtMCwwICsxLDI2IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk2ODY4ODQyCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZWZmOTg3MDAKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZWEyOGUxZQorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDY3Yjk4MmJlCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZDA4YTgzMDIKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZGY4OTFkYworMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGJlYzQ3ODRhCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDRjYTkxMGEKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlNGFmODdkMAorMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM3ZjE4YzY2CiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NjQ0ODczMmEKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5OGI4OTcwNgorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGY0Nzg4N2Y0CiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Mzg3MjkwZDIKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjNTcxNmU4NAorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk0ZGU4YWE4CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2E2MThkODgKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmZWI1NmVjMgorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDU1ZmU4ZmI2CiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGZmNzg4ZmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1kZWxvZ28gYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZGVsb2dvCmluZGV4IGJmMmI3NTEuLjBlNTlmODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1kZWxvZ28KKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWRlbG9nbwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAzMjc2OC85ODIwNTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMjY3MjAsIDB4Y2VmYWVjNDcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDEyNjcyMCwgMHhhNDE2ZWNlNQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTI2NzIwLCAweGE0MTZlY2U1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZHJhd2JveCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1kcmF3Ym94CmluZGV4IGM2M2QyZmMuLjhmZmQzODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1kcmF3Ym94CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1kcmF3Ym94CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OWFkYTliZTkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiMGVjN2Q1OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDkzODgxNmI4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZWFyd2F4IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWVhcndheApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTVmNTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWVhcndheApAQCAtMCwwICsxLDI2IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDkwMGFmNzUxCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YWQ1NzAwNjUKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5M2Q1ZjQ5NAorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDJjNjVlZjdkCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGM4YWY2ZDIKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YWUwMDI0OQorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFhYjVmZGQwCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDM3M2VmMzkKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNzU2ZWI0MworMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweDQ5NGQwNmUwCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDM5M2ZmYWUKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2OTcyZjk3ZQorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGI4MzRlYTA1CiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MzliOGY4NzEKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmMDMyZmNjZAorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVmY2QwNzA5CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDU5MGViYzAKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyZTc1ZjI2NAorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJlYTFmZDAzCiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWJiZTA0MzQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1leHRyYXN0ZXJlbyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1leHRyYXN0ZXJlbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzljMTY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWV4dHJhc3RlcmVvCkBAIC0wLDAgKzEsMjYgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MjllM2VlY2YKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgxODM5MGI5NgorMCwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGM0NzdmYTk5CiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4M2JjMGYxNGYKKzAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyMzc5ZWQ5MQorMCwgICAgICAgNTEyMCwgICAgICAgNTEyMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGZkNmEwMDcwCiswLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGIwMWY0Y2YKKzAsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2NzE2ZmQ5MworMCwgICAgICAgODE5MiwgICAgICAgODE5MiwgICAgIDEwMjQsICAgICA0MDk2LCAweDE4NDBmMjViCiswLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OWMxZmZhZjEKKzAsICAgICAgMTAyNDAsICAgICAgMTAyNDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHhjYmVkZWZhZgorMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDNlMDUwMzkwCiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YjMwZTAwOTAKKzAsICAgICAgMTMzMTIsICAgICAgMTMzMTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyNmI4Zjc1YgorMCwgICAgICAxNDMzNiwgICAgICAxNDMzNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGQ3MDZlMzExCiswLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MGM0ODAxMzgKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2YzlhMDIxNgorMCwgICAgICAxNzQwOCwgICAgICAxNzQwOCwgICAgIDEwMjQsICAgICA0MDk2LCAweDdhYmNlNTRmCiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGE0NWY2M2YKKzAsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1MGQ1ZmY4NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZhZGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZmFkZQppbmRleCA5ZDY5MWNlLi4yYmE3NjcxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZmFkZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZmFkZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGI0ZTZjNzM1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjRlNmM3MzUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiNGU2YzczNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZpZWxkb3JkZXIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZmllbGRvcmRlcgppbmRleCA2YmI2NDdhLi45YTczZTZlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZmllbGRvcmRlcgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZmllbGRvcmRlcgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAyLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjAyNzUyLCAweDc4OTQyNGI2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMDI3NTIsIDB4N2ExZjQ3YTkKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIwMjc1MiwgMHhhNTVhOWFiYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZvcm1hdHMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZm9ybWF0cwppbmRleCA0YzMwM2Q4Li4xN2ZmNWIyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZm9ybWF0cworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZm9ybWF0cwpAQCAtNzUsOCArNzUsMTEgQEAKIDAgPSBmZl9wYXJzZV9jaGFubmVsX2xheW91dCgwMDAwMDAwMDAwMDAwMDA0LCAgMSwgMWMpOwogMCA9IGZmX3BhcnNlX2NoYW5uZWxfbGF5b3V0KDAwMDAwMDAwMDAwMDAwMDMsICAyLCAyYyk7CiAtMSA9IGZmX3BhcnNlX2NoYW5uZWxfbGF5b3V0KEZGRkZGRkZGRkZGRkZGRkYsIC0xLCAtMWMpOwotMCA9IGZmX3BhcnNlX2NoYW5uZWxfbGF5b3V0KDAwMDAwMDAwMDAwMDAwMDAsIDYwLCA2MGMpOworLTEgPSBmZl9wYXJzZV9jaGFubmVsX2xheW91dChGRkZGRkZGRkZGRkZGRkZGLCAtMSwgNjBjKTsKIC0xID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoRkZGRkZGRkZGRkZGRkZGRiwgLTEsIDY1Yyk7CiswID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoMDAwMDAwMDAwMDAwMDAwMCwgIDIsIDJDKTsKKzAgPSBmZl9wYXJzZV9jaGFubmVsX2xheW91dCgwMDAwMDAwMDAwMDAwMDAwLCA2MCwgNjBDKTsKKy0xID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoRkZGRkZGRkZGRkZGRkZGRiwgLTEsIDY1Qyk7CiAwID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoMDAwMDAwMDAwMDAwMDAzRiwgIDYsIDUuMSk7CiAwID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoMDAwMDAwMDAwMDAwMDAwMywgIDIsIHN0ZXJlbyk7CiAwID0gZmZfcGFyc2VfY2hhbm5lbF9sYXlvdXQoMDAwMDAwMDAwMDAwMDAwMSwgIDEsIDErMSsxKzEpOwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyZmIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMKQEAgLTAsMCArMSw5MyBAQAorI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDExMngxODIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4Y2RjMjliM2QKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzMDU3NiwgMHhjZGMyOWIzZAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDMwNTc2LCAweGNkYzI5YjNkCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAgMzA1NzYsIDB4Y2RjMjliM2QKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgICAzMDU3NiwgMHhjZGMyOWIzZAorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgIDMwNTc2LCAweGNkYzI5YjNkCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4NWM4MzY1NmMKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgICAzMDU3NiwgMHg1YzgzNjU2YworMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgIDMwNTc2LCAweDVjODM2NTZjCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAgMzA1NzYsIDB4NWM4MzY1NmMKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgICAzMDU3NiwgMHg1YzgzNjU2YworMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgIDMwNTc2LCAweDVjODM2NTZjCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4NWM4MzY1NmMKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNjEsICAgICAgICAgNjEsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNjcsICAgICAgICAgNjcsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNzMsICAgICAgICAgNzMsICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgIDMwNTc2LCAweGEyZmNkMDZmCiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgICAgMzA1NzYsIDB4YTJmY2QwNmYKKzAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgIDMwNTc2LCAweGEyZmNkMDZmCiswLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgICAgMzA1NzYsIDB4YTJmY2QwNmYKKzAsICAgICAgICAgNzksICAgICAgICAgNzksICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA4MCwgICAgICAgICA4MCwgICAgICAgIDEsICAgIDMwNTc2LCAweGEyZmNkMDZmCiswLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgICAgMzA1NzYsIDB4ZDQxNTBhYWQKKzAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgICAzMDU3NiwgMHhkNDE1MGFhZAorMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgIDMwNTc2LCAweGQ0MTUwYWFkCiswLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4ZDQxNTBhYWQKKzAsICAgICAgICAgODUsICAgICAgICAgODUsICAgICAgICAxLCAgICAzMDU3NiwgMHhkNDE1MGFhZAorMCwgICAgICAgICA4NiwgICAgICAgICA4NiwgICAgICAgIDEsICAgIDMwNTc2LCAweGQ0MTUwYWFkCiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAgMzA1NzYsIDB4ZDQxNTBhYWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtY2ZyIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy1jZnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyZmIwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtY2ZyCkBAIC0wLDAgKzEsOTMgQEAKKyN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMTJ4MTgyCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDMwNTc2LCAweGNkYzI5YjNkCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzA1NzYsIDB4Y2RjMjliM2QKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzMDU3NiwgMHhjZGMyOWIzZAorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgIDMwNTc2LCAweGNkYzI5YjNkCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4Y2RjMjliM2QKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgICAzMDU3NiwgMHhjZGMyOWIzZAorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgIDMwNTc2LCAweDVjODM2NTZjCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAgMzA1NzYsIDB4NWM4MzY1NmMKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgICAzMDU3NiwgMHg1YzgzNjU2YworMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgIDMwNTc2LCAweDVjODM2NTZjCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4NWM4MzY1NmMKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgICAzMDU3NiwgMHg1YzgzNjU2YworMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgIDMwNTc2LCAweDVjODM2NTZjCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTAsICAgICAgICAgNTAsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1MSwgICAgICAgICA1MSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDUyLCAgICAgICAgIDUyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTMsICAgICAgICAgNTMsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1NCwgICAgICAgICA1NCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDU1LCAgICAgICAgIDU1LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTYsICAgICAgICAgNTYsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1NywgICAgICAgICA1NywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDU4LCAgICAgICAgIDU4LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTksICAgICAgICAgNTksICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2MCwgICAgICAgICA2MCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDYxLCAgICAgICAgIDYxLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNjIsICAgICAgICAgNjIsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2MywgICAgICAgICA2MywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDY0LCAgICAgICAgIDY0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNjUsICAgICAgICAgNjUsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2NiwgICAgICAgICA2NiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDY3LCAgICAgICAgIDY3LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNjgsICAgICAgICAgNjgsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2OSwgICAgICAgICA2OSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDcwLCAgICAgICAgIDcwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNzEsICAgICAgICAgNzEsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA3MiwgICAgICAgICA3MiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDczLCAgICAgICAgIDczLCAgICAgICAgMSwgICAgMzA1NzYsIDB4YTJmY2QwNmYKKzAsICAgICAgICAgNzQsICAgICAgICAgNzQsICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA3NSwgICAgICAgICA3NSwgICAgICAgIDEsICAgIDMwNTc2LCAweGEyZmNkMDZmCiswLCAgICAgICAgIDc2LCAgICAgICAgIDc2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4YTJmY2QwNmYKKzAsICAgICAgICAgNzcsICAgICAgICAgNzcsICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA3OCwgICAgICAgICA3OCwgICAgICAgIDEsICAgIDMwNTc2LCAweGEyZmNkMDZmCiswLCAgICAgICAgIDc5LCAgICAgICAgIDc5LCAgICAgICAgMSwgICAgMzA1NzYsIDB4YTJmY2QwNmYKKzAsICAgICAgICAgODAsICAgICAgICAgODAsICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA4MSwgICAgICAgICA4MSwgICAgICAgIDEsICAgIDMwNTc2LCAweGQ0MTUwYWFkCiswLCAgICAgICAgIDgyLCAgICAgICAgIDgyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4ZDQxNTBhYWQKKzAsICAgICAgICAgODMsICAgICAgICAgODMsICAgICAgICAxLCAgICAzMDU3NiwgMHhkNDE1MGFhZAorMCwgICAgICAgICA4NCwgICAgICAgICA4NCwgICAgICAgIDEsICAgIDMwNTc2LCAweGQ0MTUwYWFkCiswLCAgICAgICAgIDg1LCAgICAgICAgIDg1LCAgICAgICAgMSwgICAgMzA1NzYsIDB4ZDQxNTBhYWQKKzAsICAgICAgICAgODYsICAgICAgICAgODYsICAgICAgICAxLCAgICAzMDU3NiwgMHhkNDE1MGFhZAorMCwgICAgICAgICA4NywgICAgICAgICA4NywgICAgICAgIDEsICAgIDMwNTc2LCAweGQ0MTUwYWFkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnBzLWRvd24gYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnBzLWRvd24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4YjM2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtZG93bgpAQCAtMCwwICsxLDE1IEBACisjdGIgMDogMS8zCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDBjMTA2MmQ2CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mjc4ZDg4N2UKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgMHg3NWUxYTE3YgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTE1MjAwLCAweDY4NmI3N2U3CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWZjMmQ2OTMKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDExNTIwMCwgMHgyZDBiYTVhNAorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDQwNDI2Zjk5CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzcwNWNjZDkKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDExNTIwMCwgMHg1NjM1ZGFhNQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDcxNjFlZjhmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnBzLWRvd24tZW9mLXBhc3MgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnBzLWRvd24tZW9mLXBhc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2NzI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtZG93bi1lb2YtcGFzcwpAQCAtMCwwICsxLDE2IEBACisjdGIgMDogMS8zCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDBjMTA2MmQ2CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mjc4ZDg4N2UKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgMHg3NWUxYTE3YgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTE1MjAwLCAweDY4NmI3N2U3CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWZjMmQ2OTMKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDExNTIwMCwgMHgyZDBiYTVhNAorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDQwNDI2Zjk5CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzcwNWNjZDkKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDExNTIwMCwgMHg1NjM1ZGFhNQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDcxNjFlZjhmCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2NmMDJmZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtZG93bi1yb3VuZC1kb3duIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy1kb3duLXJvdW5kLWRvd24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0MDUzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtZG93bi1yb3VuZC1kb3duCkBAIC0wLDAgKzEsMTUgQEAKKyN0YiAwOiAxLzMKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MjAxYjlkYjEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgzMDliOWMwNgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTE1MjAwLCAweGExNGU5YWNhCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDJiNmFiMjEKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgMHgyOTZkZDRhNQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDU5ZTg1ZjgzCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjA0MGJmMzUKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNzZkY2Q5ZAorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDNhZjVkMzA2CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzhjZTdmYjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtZG93bi1yb3VuZC11cCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtZG93bi1yb3VuZC11cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2NmMDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy1kb3duLXJvdW5kLXVwCkBAIC0wLDAgKzEsMTYgQEAKKyN0YiAwOiAxLzMKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc0NGIzZWQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgyMDFiOWRiMQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDMwOWI5YzA2CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjczODU3ZTIKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgMHgwMmI2YWIyMQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDI5NmRkNGE1CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Yzk1YTY3NWUKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgMHhmMDQwYmYzNQorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGE3NmRjZDlkCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGNhZjcxNzIKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgMHhjOGNlN2ZiMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy1yIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy1yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYmM3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnBzLXIKQEAgLTAsMCArMSw3OCBAQAorI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDExMngxODIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4Y2RjMjliM2QKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzMDU3NiwgMHhjZGMyOWIzZAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDMwNTc2LCAweGNkYzI5YjNkCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4Y2RjMjliM2QKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgICAzMDU3NiwgMHhjZGMyOWIzZAorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgIDMwNTc2LCAweDVjODM2NTZjCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAgMzA1NzYsIDB4NWM4MzY1NmMKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgICAzMDU3NiwgMHg1YzgzNjU2YworMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgIDMwNTc2LCAweDVjODM2NTZjCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAgMzA1NzYsIDB4NWM4MzY1NmMKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgICAzMDU3NiwgMHg1YzgzNjU2YworMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDU4LCAgICAgICAgIDU4LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNTksICAgICAgICAgNTksICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2MCwgICAgICAgICA2MCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDYxLCAgICAgICAgIDYxLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNjIsICAgICAgICAgNjIsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgICAzMDU3NiwgMHgyNmI2N2Y4MworMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgIDMwNTc2LCAweDI2YjY3ZjgzCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAgMzA1NzYsIDB4MjZiNjdmODMKKzAsICAgICAgICAgNzMsICAgICAgICAgNzMsICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgIDMwNTc2LCAweGEyZmNkMDZmCiswLCAgICAgICAgIDc2LCAgICAgICAgIDc2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4YTJmY2QwNmYKKzAsICAgICAgICAgNzcsICAgICAgICAgNzcsICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA3OCwgICAgICAgICA3OCwgICAgICAgIDEsICAgIDMwNTc2LCAweGEyZmNkMDZmCiswLCAgICAgICAgIDc5LCAgICAgICAgIDc5LCAgICAgICAgMSwgICAgMzA1NzYsIDB4YTJmY2QwNmYKKzAsICAgICAgICAgODAsICAgICAgICAgODAsICAgICAgICAxLCAgICAzMDU3NiwgMHhhMmZjZDA2ZgorMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgIDMwNTc2LCAweGQ0MTUwYWFkCiswLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAgMzA1NzYsIDB4ZDQxNTBhYWQKKzAsICAgICAgICAgODQsICAgICAgICAgODQsICAgICAgICAxLCAgICAzMDU3NiwgMHhkNDE1MGFhZAorMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgIDMwNTc2LCAweGQ0MTUwYWFkCiswLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAgMzA1NzYsIDB4ZDQxNTBhYWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtc3RhcnQtZHJvcCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtc3RhcnQtZHJvcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmExYzQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy1zdGFydC1kcm9wCkBAIC0wLDAgKzEsMTEgQEAKKyN0YiAwOiAxLzMKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmQwYmE1YTQKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDExNTIwMCwgMHhjOTVhNjc1ZQorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTE1MjAwLCAweGYwNDBiZjM1CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTYzNWRhYTUKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDExNTIwMCwgMHgwY2FmNzE3MgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGM4Y2U3ZmIxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnBzLXN0YXJ0LWZpbGwgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnBzLXN0YXJ0LWZpbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVlZmI0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtc3RhcnQtZmlsbApAQCAtMCwwICsxLDExIEBACisjdGIgMDogMS8zCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM3NDRiM2VkCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc0NGIzZWQKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgMHgyMDFiOWRiMQorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDc1ZTFhMTdiCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjczODU3ZTIKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgMHgwMmI2YWIyMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy11cCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtdXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhODQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtdXAKQEAgLTAsMCArMSwxNyBAQAorI3RiIDA6IDEvNworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNzQ0YjNlZAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM3NDRiM2VkCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjBhNThmMzUKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MGE1OGYzNQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDYwYTU4ZjM1CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDlmZmE0ZTEKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDExNTIwMCwgMHgwOWZmYTRlMQorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTE1MjAwLCAweDMzZjE1OTE4CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzNmMTU5MTgKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDExNTIwMCwgMHhiMGRmYWNmOAorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGIwZGZhY2Y4CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjBkZmFjZjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtdXAtcm91bmQtZG93biBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtdXAtcm91bmQtZG93bgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWVjYjEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy11cC1yb3VuZC1kb3duCkBAIC0wLDAgKzEsMTYgQEAKKyN0YiAwOiAxLzcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc0NGIzZWQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNzQ0YjNlZAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDYwYTU4ZjM1CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjBhNThmMzUKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgMHgwOWZmYTRlMQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDA5ZmZhNGUxCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDlmZmE0ZTEKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgMHgzM2YxNTkxOAorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDMzZjE1OTE4CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjBkZmFjZjgKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgMHhiMGRmYWNmOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZwcy11cC1yb3VuZC11cCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtdXAtcm91bmQtdXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5ZGJmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcHMtdXAtcm91bmQtdXAKQEAgLTAsMCArMSwxNyBAQAorI3RiIDA6IDEvNworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNzQ0YjNlZAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM3NDRiM2VkCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc0NGIzZWQKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MGE1OGYzNQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDYwYTU4ZjM1CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDlmZmE0ZTEKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDExNTIwMCwgMHgwOWZmYTRlMQorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTE1MjAwLCAweDMzZjE1OTE4CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzNmMTU5MTgKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDExNTIwMCwgMHgzM2YxNTkxOAorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGIwZGZhY2Y4CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjBkZmFjZjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXBhY2stY29sdW1ucyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXBhY2stY29sdW1ucwppbmRleCBmMzg3NjMyLi5hYzY4OGM5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLWNvbHVtbnMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZyYW1lcGFjay1jb2x1bW5zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcwNHgyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4OGNkZTEzZWQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNDEyOCwgMHhjOTdmY2FhMgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA0MTI4LCAweDgxMzllY2EzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLWZyYW1lc2VxIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZyYW1lcGFjay1mcmFtZXNlcQppbmRleCA4M2MwOGEwLi43MTc0ZmU0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLWZyYW1lc2VxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXBhY2stZnJhbWVzZXEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS81MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwNWI3ODllZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDA1Yjc4OWVmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGJiNDY1NTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXBhY2stbGluZXMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLWxpbmVzCmluZGV4IGQ3MTQ0NjIuLmQ4Y2MyODkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXBhY2stbGluZXMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZyYW1lcGFjay1saW5lcwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4NTc2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzA0MTI4LCAweDkwMWExM2VkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzMDQxMjgsIDB4NzkzY2NhYTIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDMwNDEyOCwgMHg5ZWFmZWNhMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZyYW1lcGFjay1zYnMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLXNicwppbmRleCBkNzE0NDYyLi5kNGI0N2YwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLXNicworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLXNicwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MDR4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzA0MTI4LCAweDkwMWExM2VkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzMDQxMjgsIDB4NzkzY2NhYTIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDMwNDEyOCwgMHg5ZWFmZWNhMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZyYW1lcGFjay10YWIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLXRhYgppbmRleCAwMzQ2ZjA2Li41MDBjZmI3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLXRhYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVwYWNrLXRhYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4NTc2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzA0MTI4LCAweDBiNmIxM2VkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzMDQxMjgsIDB4NDA2YmNhYTIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDMwNDEyOCwgMHhiMGRlZWNhMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZyYW1lcmF0ZS0xMmJpdC1kb3duIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZyYW1lcmF0ZS0xMmJpdC1kb3duCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTNjMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVyYXRlLTEyYml0LWRvd24KQEAgLTAsMCArMSw1NSBAQAorI3RiIDA6IDEvNTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YjQ5Y2YwMTYKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNzIwMCwgMHhiY2NmNjk2ZAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA3MjAwLCAweDcwOWM4ZGQxCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAzMDcyMDAsIDB4Yjk0OGQ5MDcKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDMwNzIwMCwgMHg4NTBmODQ5YQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMzA3MjAwLCAweGFmNzFlN2ZjCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MGExYmE0ODYKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDMwNzIwMCwgMHgwNjAxZjYyYQorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMzA3MjAwLCAweDJjNmQzYTU5CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAzMDcyMDAsIDB4ZWQwMzU5N2IKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDMwNzIwMCwgMHg5Zjg0ZGY1ZAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMzA3MjAwLCAweDlmYmU4Yzg0CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAzMDcyMDAsIDB4OGY3YmMzOTQKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDMwNzIwMCwgMHg1MTEzYzc4NworMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMzA3MjAwLCAweDQxZTgwMDJmCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAzMDcyMDAsIDB4YWIyMTYyZmMKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDMwNzIwMCwgMHhiZjhmODQ3YworMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMzA3MjAwLCAweDgzMmQ5ZWY3CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAzMDcyMDAsIDB4ZDJmNWUwNDMKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDMwNzIwMCwgMHhjZWVhZGRiOAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMzA3MjAwLCAweGYyYjEyZmU1CiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAzMDcyMDAsIDB4ZjM0NzdlMTEKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDMwNzIwMCwgMHhkZjM4Nzc3MworMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMzA3MjAwLCAweDI3M2JlN2UyCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NjhjZDAzNjAKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDMwNzIwMCwgMHg0NjkzYWIwMworMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMzA3MjAwLCAweGUyYmFlZjczCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MGM5ZmE2MGEKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDMwNzIwMCwgMHg2ZTRkZGJjNQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMzA3MjAwLCAweGQxYjIzNTNjCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAzMDcyMDAsIDB4OGE1MTI2NjgKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDMwNzIwMCwgMHg3MjI0YjQzOQorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMzA3MjAwLCAweDdhOTI0M2UyCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAzMDcyMDAsIDB4OWE3ZTQ1NTMKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDMwNzIwMCwgMHg0ZDc5NTYyNgorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMzA3MjAwLCAweDRlMjRkNjU5CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAzMDcyMDAsIDB4YTIzMGI1NGIKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDMwNzIwMCwgMHgxNDU5OGVhNQorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMzA3MjAwLCAweDIxNjE5Y2YzCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NTIyMGExNjcKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDMwNzIwMCwgMHhiNjUwNWZmMAorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMzA3MjAwLCAweDBhNDgyYTNkCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAzMDcyMDAsIDB4NmJkY2U0MGMKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDMwNzIwMCwgMHgzYzYwNzRmMworMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMzA3MjAwLCAweDM2OWM3MWM4CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NGZkYTI2MzQKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDMwNzIwMCwgMHg0ZGYyZDYxOQorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMzA3MjAwLCAweDIxMjA1YWFiCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAzMDcyMDAsIDB4ZTAwZjQ4YzIKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDMwNzIwMCwgMHhlM2IxMTc5OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWZyYW1lcmF0ZS0xMmJpdC11cCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXJhdGUtMTJiaXQtdXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViZjliZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXJhdGUtMTJiaXQtdXAKQEAgLTAsMCArMSw2NSBAQAorI3RiIDA6IDEvNjAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YjQ5Y2YwMTYKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNzIwMCwgMHg5NWQxOTFiMgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA3MjAwLCAweDIwZTUxNzNiCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAzMDcyMDAsIDB4NTM3OGIxM2MKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDMwNzIwMCwgMHgzZTMwNDU0MworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMzA3MjAwLCAweDJmMTMxY2RiCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAzMDcyMDAsIDB4ODNkYmUzMjEKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDMwNzIwMCwgMHhiODFmYzY4MgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMzA3MjAwLCAweGIzMmE4NjQ0CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAzMDcyMDAsIDB4YzVjOGIwZjgKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDMwNzIwMCwgMHgyNzk0NWQwYQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMzA3MjAwLCAweDQ0NGM3NjQwCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAzMDcyMDAsIDB4Y2JhNGM2YmIKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDMwNzIwMCwgMHhmOTIzYzdhMworMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMzA3MjAwLCAweDg4MTQ5NzU3CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NGJkZmQzY2EKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDMwNzIwMCwgMHgxYzI3OTY5NQorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMzA3MjAwLCAweDYzNGNjODA5CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAzMDcyMDAsIDB4ZGE4YzZjNDEKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDMwNzIwMCwgMHgyMTM2Yzk4NgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMzA3MjAwLCAweDQ1NzU3NmE4CiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAzMDcyMDAsIDB4ZTIzMzdjNTcKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDMwNzIwMCwgMHg4ZWQ1MTdjOQorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMzA3MjAwLCAweDRmZDM1Zjk5CiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NDIzN2U4OTIKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDMwNzIwMCwgMHgxMzgzYTlkOAorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMzA3MjAwLCAweGM3MTk1NzM1CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MGUwNTgxNjUKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDMwNzIwMCwgMHgwYjgxZjM0NQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMzA3MjAwLCAweDJkZGYyZjBhCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAzMDcyMDAsIDB4MGI1OGJjZjcKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDMwNzIwMCwgMHgxYjY4NGExZAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMzA3MjAwLCAweDFlNDRmMWNmCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAzMDcyMDAsIDB4M2VkNmI1ZDgKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDMwNzIwMCwgMHgwMDg4MWE0MAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMzA3MjAwLCAweDJjM2QxNDA2CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAzMDcyMDAsIDB4YmQ2NzI0OGEKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDMwNzIwMCwgMHg0NjI2MTkxMworMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMzA3MjAwLCAweGU1YjJiYmFhCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MGU0NDU1Y2QKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDMwNzIwMCwgMHhiNDk0MzIxMgorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMzA3MjAwLCAweGY5NmI2ODA4CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAzMDcyMDAsIDB4NThhZGFkM2YKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDMwNzIwMCwgMHg5Nzg0MTNmMAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMzA3MjAwLCAweDAwMzczMjBhCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAzMDcyMDAsIDB4YWFjOGUxY2EKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDMwNzIwMCwgMHhjMzU3ODQwNworMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMzA3MjAwLCAweGZjMjljNjc1CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MjJlZDViNWEKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDMwNzIwMCwgMHg2ZDU4ZTIxZQorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgMzA3MjAwLCAweGJmNjJiNGMzCiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YmQ1ZWRiMmQKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgIDMwNzIwMCwgMHg1NTUyODQzMgorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgMzA3MjAwLCAweGEzZjFlNTE0CiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAzMDcyMDAsIDB4YmEwNzNlNmYKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgIDMwNzIwMCwgMHgyOWI4ZGYwMAorMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgMzA3MjAwLCAweDE1MTc1MTJiCiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NGU3NDBiNDIKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgIDMwNzIwMCwgMHhiZDZiNzA1MworMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgMzA3MjAwLCAweGU3M2YyOWVmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVyYXRlLWRvd24gYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVyYXRlLWRvd24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhYjdhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXJhdGUtZG93bgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc0NGIzZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1mcmFtZXJhdGUtdXAgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVyYXRlLXVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNzZiZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZnJhbWVyYXRlLXVwCkBAIC0wLDAgKzEsMTUgQEAKKyN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDM3NDRiM2VkCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWMxZmRmYTAKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgMHhhMTdmMGQ3NAorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTE1MjAwLCAweGQ3MjUzMmE5CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDMyZTYwZjgKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ZTMxOGJhMAorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDc2MDE4MjkyCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODllMjc1OTkKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ODUzNmVhYworMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTE1MjAwLCAweGMzYWM2MmE4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZ3JhZGZ1biBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ncmFkZnVuCmluZGV4IDc5NGZhZTkuLmNhZGI5Y2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ncmFkZnVuCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ncmFkZnVuCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWViZjg5OGYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyMTdiNjU2MAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDAyNjlmNjJkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZ3JhZGZ1bi1zYW1wbGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItZ3JhZGZ1bi1zYW1wbGUKaW5kZXggNTk1ZjgyYS4uZTZlMmRjOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWdyYWRmdW4tc2FtcGxlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ncmFkZnVuLXNhbXBsZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc2ODAwLCAweGVhNjJhYjY1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNzY4MDAsIDB4YmMwZDhiNTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA3NjgwMCwgMHg2ODI5NjdkMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhpc3RvZ3JhbS1sZXZlbHMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaGlzdG9ncmFtLWxldmVscwppbmRleCBiZDI2OGNhLi42OTdkN2QxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaGlzdG9ncmFtLWxldmVscworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaGlzdG9ncmFtLWxldmVscwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4NjM2Cisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNDg4NDQ4LCAweGMyN2E2Y2FjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA0ODg0NDgsIDB4ZjAwYTE1MmUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDQ4ODQ0OCwgMHgwNjBiOGM3MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhscyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1obHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWUzYzdiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1obHMKQEAgLTAsMCArMSw3NzIgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDExNTIsICAgICAyMzA0LCAweDkwN2NiN2ZhCiswLCAgICAgICAxMTUyLCAgICAgICAxMTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjhkYzc1MjUKKzAsICAgICAgIDIzMDQsICAgICAgIDIzMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZTdkNjkwNQorMCwgICAgICAgMzQ1NiwgICAgICAgMzQ1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGVmNDc4NzdiCiswLCAgICAgICA0NjA4LCAgICAgICA0NjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmU5MTZiN2UKKzAsICAgICAgIDU3NjAsICAgICAgIDU3NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlM2QwOGNkZQorMCwgICAgICAgNjkxMiwgICAgICAgNjkxMiwgICAgIDExNTIsICAgICAyMzA0LCAweGZmN2Y4NmNmCiswLCAgICAgICA4MDY0LCAgICAgICA4MDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODQzZTZmOTUKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MTU3N2MyNgorMCwgICAgICAxMDM2OCwgICAgICAxMDM2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDA0YTA4NWQ1CiswLCAgICAgIDExNTIwLCAgICAgIDExNTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWM1YTc2ZjUKKzAsICAgICAgMTI2NzIsICAgICAgMTI2NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZWU3ODYyMworMCwgICAgICAxMzgyNCwgICAgICAxMzgyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDhlYzg2MWRjCiswLCAgICAgIDE0OTc2LCAgICAgIDE0OTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGNhMTc5ZDgKKzAsICAgICAgMTYxMjgsICAgICAgMTYxMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNmRhNzUwZgorMCwgICAgICAxNzI4MCwgICAgICAxNzI4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGY2YmY3OWI1CiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTdiODhhNDMKKzAsICAgICAgMTk1ODQsICAgICAgMTk1ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMTNjN2I5YworMCwgICAgICAyMDczNiwgICAgICAyMDczNiwgICAgIDExNTIsICAgICAyMzA0LCAweGRmYmE4M2FmCiswLCAgICAgIDIxODg4LCAgICAgIDIxODg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Yzk0NjdkNGIKKzAsICAgICAgMjMwNDAsICAgICAgMjMwNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiYmI1OGUyYgorMCwgICAgICAyNDE5MiwgICAgICAyNDE5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDNhMTA3OGVhCiswLCAgICAgIDI1MzQ0LCAgICAgIDI1MzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTk1ODdhNWMKKzAsICAgICAgMjY0OTYsICAgICAgMjY0OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZjVhODAzOQorMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDlkNWY3ODJmCiswLCAgICAgIDI4ODAwLCAgICAgIDI4ODAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWE1NDgyOTEKKzAsICAgICAgMjk5NTIsICAgICAgMjk5NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNzUxNzcwMQorMCwgICAgICAzMTEwNCwgICAgICAzMTEwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDc4MTI3ZDZlCiswLCAgICAgIDMyMjU2LCAgICAgIDMyMjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjJlMjc4OGEKKzAsICAgICAgMzM0MDgsICAgICAgMzM0MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOTM5N2FkOQorMCwgICAgICAzNDU2MCwgICAgICAzNDU2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ1ZGE4MmQ2CiswLCAgICAgIDM1NzEyLCAgICAgIDM1NzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGVkNjZlNTEKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NjA3NzVjZAorMCwgICAgICAzODAxNiwgICAgICAzODAxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDgwMmM3NjdhCiswLCAgICAgIDM5MTY4LCAgICAgIDM5MTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2MwNTU4NDAKKzAsICAgICAgNDAzMjAsICAgICAgNDAzMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MDFiN2VhZgorMCwgICAgICA0MTQ3MiwgICAgICA0MTQ3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDgyOTA3NDlmCiswLCAgICAgIDQyNjI0LCAgICAgIDQyNjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmM3YjdkMzAKKzAsICAgICAgNDM3NzYsICAgICAgNDM3NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNGYxNzc0MworMCwgICAgICA0NDkyOCwgICAgICA0NDkyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDBlNzQ3ZDZlCiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmU3Nzc1YTAKKzAsICAgICAgNDcyMzIsICAgICAgNDcyMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZjc5NzY3MworMCwgICAgICA0ODM4NCwgICAgICA0ODM4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDI5Y2I3ODAwCiswLCAgICAgIDQ5NTM2LCAgICAgIDQ5NTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmM5NDc4OTAKKzAsICAgICAgNTA2ODgsICAgICAgNTA2ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2Mjc1N2ZjNgorMCwgICAgICA1MTg0MCwgICAgICA1MTg0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDA5ODg3NmQwCiswLCAgICAgIDUyOTkyLCAgICAgIDUyOTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTk1NjdlZTIKKzAsICAgICAgNTQxNDQsICAgICAgNTQxNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlM2JiOTE3MworMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGNjMmQ2ZGVlCiswLCAgICAgIDU2NDQ4LCAgICAgIDU2NDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTk0NTkxYWIKKzAsICAgICAgNTc2MDAsICAgICAgNTc2MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1Yzc1ODhkZQorMCwgICAgICA1ODc1MiwgICAgICA1ODc1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGZkODM2NDNjCiswLCAgICAgIDU5OTA0LCAgICAgIDU5OTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTI4MTc3ZjEKKzAsICAgICAgNjEwNTYsICAgICAgNjEwNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NWQwODQ3NAorMCwgICAgICA2MjIwOCwgICAgICA2MjIwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDczOGQ3NjViCiswLCAgICAgIDYzMzYwLCAgICAgIDYzMzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGQzZDgxMGUKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZjRmOTBkMworMCwgICAgICA2NTY2NCwgICAgICA2NTY2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDYxZTI4ZDQzCiswLCAgICAgIDY2ODE2LCAgICAgIDY2ODE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWExMTc5NmIKKzAsICAgICAgNjc5NjgsICAgICAgNjc5NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NmM5N2RjZAorMCwgICAgICA2OTEyMCwgICAgICA2OTEyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGE4ZmU4NjIxCiswLCAgICAgIDcwMjcyLCAgICAgIDcwMjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDk5YjdkMzgKKzAsICAgICAgNzE0MjQsICAgICAgNzE0MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmY2IwNzhhOQorMCwgICAgICA3MjU3NiwgICAgICA3MjU3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDQwZDc4NjUxCiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTRhZjcyMzQKKzAsICAgICAgNzQ4ODAsICAgICAgNzQ4ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2ODMxODcwYQorMCwgICAgICA3NjAzMiwgICAgICA3NjAzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDAzMGU3YjlkCiswLCAgICAgIDc3MTg0LCAgICAgIDc3MTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDQ1YTc1YjYKKzAsICAgICAgNzgzMzYsICAgICAgNzgzMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOTg1NzM4OQorMCwgICAgICA3OTQ4OCwgICAgICA3OTQ4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDBkMDE4ODY2CiswLCAgICAgIDgwNjQwLCAgICAgIDgwNjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmFmZTgxMGEKKzAsICAgICAgODE3OTIsICAgICAgODE3OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYmNmN2M0MworMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDEzNzM3YzEyCiswLCAgICAgIDg0MDk2LCAgICAgIDg0MDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzE2YzdiYmEKKzAsICAgICAgODUyNDgsICAgICAgODUyNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiODAxODIzYgorMCwgICAgICA4NjQwMCwgICAgICA4NjQwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDBmZDU3M2VlCiswLCAgICAgIDg3NTUyLCAgICAgIDg3NTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTFhYjg3OWMKKzAsICAgICAgODg3MDQsICAgICAgODg3MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0OWU2NzY0ZgorMCwgICAgICA4OTg1NiwgICAgICA4OTg1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ1ZjI2ZGRjCiswLCAgICAgIDkxMDA4LCAgICAgIDkxMDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDc2Nzc1ZmYKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmYmI4NmZjZQorMCwgICAgICA5MzMxMiwgICAgICA5MzMxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDIwYzU2ODU4CiswLCAgICAgIDk0NDY0LCAgICAgIDk0NDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDQzZTY4OTEKKzAsICAgICAgOTU2MTYsICAgICAgOTU2MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1OTY0ODcyOQorMCwgICAgICA5Njc2OCwgICAgICA5Njc2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ0OTA3YTYzCiswLCAgICAgIDk3OTIwLCAgICAgIDk3OTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDAyMDhhNGMKKzAsICAgICAgOTkwNzIsICAgICAgOTkwNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZTk2ODM4MworMCwgICAgIDEwMDIyNCwgICAgIDEwMDIyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDNjZmM3Y2QxCiswLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjI4YTdiZjUKKzAsICAgICAxMDI1MjgsICAgICAxMDI1MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5Y2ZlOGE0ZgorMCwgICAgIDEwMzY4MCwgICAgIDEwMzY4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGRmNmY3YzZkCiswLCAgICAgMTA0ODMyLCAgICAgMTA0ODMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmNmNjg4MmEKKzAsICAgICAxMDU5ODQsICAgICAxMDU5ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOTk3NzNhMworMCwgICAgIDEwNzEzNiwgICAgIDEwNzEzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDRhMWM3NjQ5CiswLCAgICAgMTA4Mjg4LCAgICAgMTA4Mjg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzFlYTcxY2IKKzAsICAgICAxMDk0NDAsICAgICAxMDk0NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZDEyN2VkOQorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDViMTU2OTU0CiswLCAgICAgMTExNzQ0LCAgICAgMTExNzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGQ2Mzg1MzIKKzAsICAgICAxMTI4OTYsICAgICAxMTI4OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMWEyNzFmMgorMCwgICAgIDExNDA0OCwgICAgIDExNDA0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDc3OTE4NGQ3CiswLCAgICAgMTE1MjAwLCAgICAgMTE1MjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDlhODhhYTgKKzAsICAgICAxMTYzNTIsICAgICAxMTYzNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMTFiN2M5MAorMCwgICAgIDExNzUwNCwgICAgIDExNzUwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGJmNDg4Mjc0CiswLCAgICAgMTE4NjU2LCAgICAgMTE4NjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDAyZjc5YTgKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZWQ5N2UyZgorMCwgICAgIDEyMDk2MCwgICAgIDEyMDk2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDc4NDU4NzhmCiswLCAgICAgMTIyMTEyLCAgICAgMTIyMTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDZkNzc3ZGMKKzAsICAgICAxMjMyNjQsICAgICAxMjMyNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZDAxNzllMworMCwgICAgIDEyNDQxNiwgICAgIDEyNDQxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDM4OTE3ZjlmCiswLCAgICAgMTI1NTY4LCAgICAgMTI1NTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDQ5ODc2ZTcKKzAsICAgICAxMjY3MjAsICAgICAxMjY3MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMDFhODc2OQorMCwgICAgIDEyNzg3MiwgICAgIDEyNzg3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDA2YzE4MjZiCiswLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDFiNjgwNDcKKzAsICAgICAxMzAxNzYsICAgICAxMzAxNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYjk3ODJjNgorMCwgICAgIDEzMTMyOCwgICAgIDEzMTMyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDdjZDk3MTljCiswLCAgICAgMTMyNDgwLCAgICAgMTMyNDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2E0YTc2N2MKKzAsICAgICAxMzM2MzIsICAgICAxMzM2MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3Zjg4N2U4MQorMCwgICAgIDEzNDc4NCwgICAgIDEzNDc4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGY3NWQ3MTRiCiswLCAgICAgMTM1OTM2LCAgICAgMTM1OTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzNiNTdlOWYKKzAsICAgICAxMzcwODgsICAgICAxMzcwODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNzMyNzQ5ZQorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDM4NmY3ZTFhCiswLCAgICAgMTM5MzkyLCAgICAgMTM5MzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmI5Yzc2N2QKKzAsICAgICAxNDA1NDQsICAgICAxNDA1NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MDFjODNlNQorMCwgICAgIDE0MTY5NiwgICAgIDE0MTY5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGI5MjU3MWUxCiswLCAgICAgMTQyODQ4LCAgICAgMTQyODQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODMzYTg0YmMKKzAsICAgICAxNDQwMDAsICAgICAxNDQwMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxYjY5ODRlMAorMCwgICAgIDE0NTE1MiwgICAgIDE0NTE1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDFiMjQ3NGJhCiswLCAgICAgMTQ2MzA0LCAgICAgMTQ2MzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzIyNzc1YTYKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZThmNzk3MgorMCwgICAgIDE0ODYwOCwgICAgIDE0ODYwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDE3YTI4YTY1CiswLCAgICAgMTQ5NzYwLCAgICAgMTQ5NzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWI2MTc4YTQKKzAsICAgICAxNTA5MTIsICAgICAxNTA5MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ZDcwNzg3MworMCwgICAgIDE1MjA2NCwgICAgIDE1MjA2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDY4ZTI2NDVhCiswLCAgICAgMTUzMjE2LCAgICAgMTUzMjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWUzNzdkMjgKKzAsICAgICAxNTQzNjgsICAgICAxNTQzNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NGIzODRiZQorMCwgICAgIDE1NTUyMCwgICAgIDE1NTUyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDA2MTc4MDhjCiswLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmMyYjhhNmMKKzAsICAgICAxNTc4MjQsICAgICAxNTc4MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3Y2VkNzE4MAorMCwgICAgIDE1ODk3NiwgICAgIDE1ODk3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGYyMjE4MGFiCiswLCAgICAgMTYwMTI4LCAgICAgMTYwMTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjEzNjgyYzkKKzAsICAgICAxNjEyODAsICAgICAxNjEyODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ZWZmODdmZAorMCwgICAgIDE2MjQzMiwgICAgIDE2MjQzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDVhMGI1Y2VjCiswLCAgICAgMTYzNTg0LCAgICAgMTYzNTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTdjMTg5MDYKKzAsICAgICAxNjQ3MzYsICAgICAxNjQ3MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNTVhNmExNgorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGYyNjA4MzcxCiswLCAgICAgMTY3MDQwLCAgICAgMTY3MDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzZkZjc1NzYKKzAsICAgICAxNjgxOTIsICAgICAxNjgxOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYjEwNmZiNAorMCwgICAgIDE2OTM0NCwgICAgIDE2OTM0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDdlNGY4NWQwCiswLCAgICAgMTcwNDk2LCAgICAgMTcwNDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTNlZTc4YWIKKzAsICAgICAxNzE2NDgsICAgICAxNzE2NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMzZiN2RjNworMCwgICAgIDE3MjgwMCwgICAgIDE3MjgwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGFkYWI3YzVjCiswLCAgICAgMTczOTUyLCAgICAgMTczOTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzA3ODZmMjYKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZDVkNzE3ZQorMCwgICAgIDE3NjI1NiwgICAgIDE3NjI1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGMxYTk2ZjlhCiswLCAgICAgMTc3NDA4LCAgICAgMTc3NDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWQ3Nzc4ODcKKzAsICAgICAxNzg1NjAsICAgICAxNzg1NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ODI3N2MxNgorMCwgICAgIDE3OTcxMiwgICAgIDE3OTcxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDg2ODg4MmM1CiswLCAgICAgMTgwODY0LCAgICAgMTgwODY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzQ4MDkyYjkKKzAsICAgICAxODIwMTYsICAgICAxODIwMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMzAwNjlkYQorMCwgICAgIDE4MzE2OCwgICAgIDE4MzE2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDE0MTQ3YWQ2CiswLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzkwMDcxNzIKKzAsICAgICAxODU0NzIsICAgICAxODU0NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NWQ2N2JjYworMCwgICAgIDE4NjYyNCwgICAgIDE4NjYyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDIyNDE4YmFiCiswLCAgICAgMTg3Nzc2LCAgICAgMTg3Nzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTUzYzhiNzEKKzAsICAgICAxODg5MjgsICAgICAxODg5MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YTFhOTA1MworMCwgICAgIDE5MDA4MCwgICAgIDE5MDA4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDljZDE3OWFmCiswLCAgICAgMTkxMjMyLCAgICAgMTkxMjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmIzYzdkNzIKKzAsICAgICAxOTIzODQsICAgICAxOTIzODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0NzdhODY3NworMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDExNTIsICAgICAyMzA0LCAweGUzMzM3ODM0CiswLCAgICAgMTk0Njg4LCAgICAgMTk0Njg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWNiNTZkNzcKKzAsICAgICAxOTU4NDAsICAgICAxOTU4NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlODlkNmRhYworMCwgICAgIDE5Njk5MiwgICAgIDE5Njk5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ0Njg4MjdlCiswLCAgICAgMTk4MTQ0LCAgICAgMTk4MTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWJjNDZiODcKKzAsICAgICAxOTkyOTYsICAgICAxOTkyOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ZmJiNzhkMgorMCwgICAgIDIwMDQ0OCwgICAgIDIwMDQ0OCwgICAgIDExNTIsICAgICAyMzA0LCAweGExYjQ4M2Q2CiswLCAgICAgMjAxNjAwLCAgICAgMjAxNjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmZlYzdjYWIKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkODZkNmY2YworMCwgICAgIDIwMzkwNCwgICAgIDIwMzkwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDhjMmM3ZDUxCiswLCAgICAgMjA1MDU2LCAgICAgMjA1MDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTgzNzdjZDcKKzAsICAgICAyMDYyMDgsICAgICAyMDYyMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNTcwNzFiNAorMCwgICAgIDIwNzM2MCwgICAgIDIwNzM2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGMzNWM3MWZkCiswLCAgICAgMjA4NTEyLCAgICAgMjA4NTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Nzg5MDc5ZTkKKzAsICAgICAyMDk2NjQsICAgICAyMDk2NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MTNiNzEwZQorMCwgICAgIDIxMDgxNiwgICAgIDIxMDgxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDgyNjc4MzMyCiswLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTE1NzZlNzUKKzAsICAgICAyMTMxMjAsICAgICAyMTMxMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3YzBiN2FkNgorMCwgICAgIDIxNDI3MiwgICAgIDIxNDI3MiwgICAgIDExNTIsICAgICAyMzA0LCAweGM2YjY3ODZkCiswLCAgICAgMjE1NDI0LCAgICAgMjE1NDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzM2ZjdiODkKKzAsICAgICAyMTY1NzYsICAgICAyMTY1NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZGVkNzJmMQorMCwgICAgIDIxNzcyOCwgICAgIDIxNzcyOCwgICAgIDExNTIsICAgICAyMzA0LCAweGNiODc3YTNjCiswLCAgICAgMjE4ODgwLCAgICAgMjE4ODgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2M0OTdkNDAKKzAsICAgICAyMjAwMzIsICAgICAyMjAwMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhZWZjNzk4YworMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDRjY2U3NDhjCiswLCAgICAgMjIyMzM2LCAgICAgMjIyMzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWExODdmYmUKKzAsICAgICAyMjM0ODgsICAgICAyMjM0ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxYWE3N2RiOQorMCwgICAgIDIyNDY0MCwgICAgIDIyNDY0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDllMDA3NGI4CiswLCAgICAgMjI1NzkyLCAgICAgMjI1NzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzRlZTgyMmIKKzAsICAgICAyMjY5NDQsICAgICAyMjY5NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NzVjNmZmNgorMCwgICAgIDIyODA5NiwgICAgIDIyODA5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGUxODQ3YmI0CiswLCAgICAgMjI5MjQ4LCAgICAgMjI5MjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTA4Mjg3NzcKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmNDAyNzIwNQorMCwgICAgIDIzMTU1MiwgICAgIDIzMTU1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDUzNWU3YTIwCiswLCAgICAgMjMyNzA0LCAgICAgMjMyNzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWJkODg0MDQKKzAsICAgICAyMzM4NTYsICAgICAyMzM4NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMjk0NzhiMQorMCwgICAgIDIzNTAwOCwgICAgIDIzNTAwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDliN2M3ZDg4CiswLCAgICAgMjM2MTYwLCAgICAgMjM2MTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWViMDczMzUKKzAsICAgICAyMzczMTIsICAgICAyMzczMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiZWYwNmUwOAorMCwgICAgIDIzODQ2NCwgICAgIDIzODQ2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDc5NWY3YjhjCiswLCAgICAgMjM5NjE2LCAgICAgMjM5NjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDM1YTY3NGQKKzAsICAgICAyNDA3NjgsICAgICAyNDA3NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkOGVlN2EwOQorMCwgICAgIDI0MTkyMCwgICAgIDI0MTkyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDkwNTk4MTJlCiswLCAgICAgMjQzMDcyLCAgICAgMjQzMDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzQ4MTc0NGEKKzAsICAgICAyNDQyMjQsICAgICAyNDQyMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZmYyNzQ3NQorMCwgICAgIDI0NTM3NiwgICAgIDI0NTM3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGIxNzc4M2FiCiswLCAgICAgMjQ2NTI4LCAgICAgMjQ2NTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDJlOTcwNmIKKzAsICAgICAyNDc2ODAsICAgICAyNDc2ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ZjBkODZiNAorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDI5NjM5NTVmCiswLCAgICAgMjQ5OTg0LCAgICAgMjQ5OTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDU5YTY5NTcKKzAsICAgICAyNTExMzYsICAgICAyNTExMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NTk0ODIwNgorMCwgICAgIDI1MjI4OCwgICAgIDI1MjI4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDE4NWU4NDAwCiswLCAgICAgMjUzNDQwLCAgICAgMjUzNDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTk4ZTcwZGYKKzAsICAgICAyNTQ1OTIsICAgICAyNTQ1OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OTA1N2IyNworMCwgICAgIDI1NTc0NCwgICAgIDI1NTc0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ5ZTI2ZjIxCiswLCAgICAgMjU2ODk2LCAgICAgMjU2ODk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjA4NjdkYTUKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ODU5ODBmZgorMCwgICAgIDI1OTIwMCwgICAgIDI1OTIwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGY0Yjc3NGJlCiswLCAgICAgMjYwMzUyLCAgICAgMjYwMzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjM4OTdlOGMKKzAsICAgICAyNjE1MDQsICAgICAyNjE1MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyNDhiODlhZgorMCwgICAgIDI2MjY1NiwgICAgIDI2MjY1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGQzNjI3YzRhCiswLCAgICAgMjYzODA4LCAgICAgMjYzODA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWE0ZDkzNDkKKzAsICAgICAyNjQ5NjAsICAgICAyNjQ5NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMmNlN2M0YworMCwgICAgIDI2NjExMiwgICAgIDI2NjExMiwgICAgIDExNTIsICAgICAyMzA0LCAweDMyMWY2YzBiCiswLCAgICAgMjY3MjY0LCAgICAgMjY3MjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTFhYzc0ZTAKKzAsICAgICAyNjg0MTYsICAgICAyNjg0MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZWZhOTFiYQorMCwgICAgIDI2OTU2OCwgICAgIDI2OTU2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDhiNGI3ODRjCiswLCAgICAgMjcwNzIwLCAgICAgMjcwNzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTllNDg3OWUKKzAsICAgICAyNzE4NzIsICAgICAyNzE4NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZGMyODA4MQorMCwgICAgIDI3MzAyNCwgICAgIDI3MzAyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ0YjQ3N2IwCiswLCAgICAgMjc0MTc2LCAgICAgMjc0MTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjdiNjcwODQKKzAsICAgICAyNzUzMjgsICAgICAyNzUzMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YjE5OGMxNworMCwgICAgIDI3NjQ4MCwgICAgIDI3NjQ4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDljOTQ3MTk0CiswLCAgICAgMjc3NjMyLCAgICAgMjc3NjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmVhYTdmMTUKKzAsICAgICAyNzg3ODQsICAgICAyNzg3ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMTlmN2MxZAorMCwgICAgIDI3OTkzNiwgICAgIDI3OTkzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDE1N2I3ZjQzCiswLCAgICAgMjgxMDg4LCAgICAgMjgxMDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2QyZTdhY2MKKzAsICAgICAyODIyNDAsICAgICAyODIyNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NzU5NzI0NworMCwgICAgIDI4MzM5MiwgICAgIDI4MzM5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDdiYTA2YWNiCiswLCAgICAgMjg0NTQ0LCAgICAgMjg0NTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjMzYzc5OTUKKzAsICAgICAyODU2OTYsICAgICAyODU2OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOGUyODU4NworMCwgICAgIDI4Njg0OCwgICAgIDI4Njg0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDkyYmU4NGI1CiswLCAgICAgMjg4MDAwLCAgICAgMjg4MDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmI4NTdkNDMKKzAsICAgICAyODkxNTIsICAgICAyODkxNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNjhlN2M3NAorMCwgICAgIDI5MDMwNCwgICAgIDI5MDMwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGFjNTQ2NWQ5CiswLCAgICAgMjkxNDU2LCAgICAgMjkxNDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MThmNTg4MzEKKzAsICAgICAyOTI2MDgsICAgICAyOTI2MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOWI0ODE5NgorMCwgICAgIDI5Mzc2MCwgICAgIDI5Mzc2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDIwMjk3NjUzCiswLCAgICAgMjk0OTEyLCAgICAgMjk0OTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTMzOTdhODIKKzAsICAgICAyOTYwNjQsICAgICAyOTYwNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NWVhN2RlYgorMCwgICAgIDI5NzIxNiwgICAgIDI5NzIxNiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ3MzE2ZTIwCiswLCAgICAgMjk4MzY4LCAgICAgMjk4MzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTQxMDdmMmIKKzAsICAgICAyOTk1MjAsICAgICAyOTk1MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYzNiN2RjNgorMCwgICAgIDMwMDY3MiwgICAgIDMwMDY3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDJkMzc4M2FhCiswLCAgICAgMzAxODI0LCAgICAgMzAxODI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDdlNDczNDAKKzAsICAgICAzMDI5NzYsICAgICAzMDI5NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiYzExNzg5MworMCwgICAgIDMwNDEyOCwgICAgIDMwNDEyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDhiZDk3ODUxCiswLCAgICAgMzA1MjgwLCAgICAgMzA1MjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzI3Mzc2YTkKKzAsICAgICAzMDY0MzIsICAgICAzMDY0MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMGQ4OGM4MworMCwgICAgIDMwNzU4NCwgICAgIDMwNzU4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDE5YzI3MDRjCiswLCAgICAgMzA4NzM2LCAgICAgMzA4NzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDkzYjdiNmUKKzAsICAgICAzMDk4ODgsICAgICAzMDk4ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMjFhNzM0OQorMCwgICAgIDMxMTA0MCwgICAgIDMxMTA0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGE0ZmQ4MmNkCiswLCAgICAgMzEyMTkyLCAgICAgMzEyMTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzYyZTZiYzkKKzAsICAgICAzMTMzNDQsICAgICAzMTMzNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyNzAwNzVkNAorMCwgICAgIDMxNDQ5NiwgICAgIDMxNDQ5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGE1ZjI3YjkwCiswLCAgICAgMzE1NjQ4LCAgICAgMzE1NjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjcyZTdlZGMKKzAsICAgICAzMTY4MDAsICAgICAzMTY4MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MjE3ODQ4NgorMCwgICAgIDMxNzk1MiwgICAgIDMxNzk1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDVmNzk3OGU4CiswLCAgICAgMzE5MTA0LCAgICAgMzE5MTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWQ3YzY3MDMKKzAsICAgICAzMjAyNTYsICAgICAzMjAyNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYzQ0ODNkNQorMCwgICAgIDMyMTQwOCwgICAgIDMyMTQwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDMxYmQ5NTFkCiswLCAgICAgMzIyNTYwLCAgICAgMzIyNTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTk0ODdhZjAKKzAsICAgICAzMjM3MTIsICAgICAzMjM3MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYmQyN2VlNworMCwgICAgIDMyNDg2NCwgICAgIDMyNDg2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGMzZTA3YWM0CiswLCAgICAgMzI2MDE2LCAgICAgMzI2MDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OThhMTZiYTcKKzAsICAgICAzMjcxNjgsICAgICAzMjcxNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkN2E1NzQ3YgorMCwgICAgIDMyODMyMCwgICAgIDMyODMyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDk2ZmI4MTFjCiswLCAgICAgMzI5NDcyLCAgICAgMzI5NDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2NlZTgxMDkKKzAsICAgICAzMzA2MjQsICAgICAzMzA2MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1MmIxOGJhMgorMCwgICAgIDMzMTc3NiwgICAgIDMzMTc3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDMzYmU4ODYxCiswLCAgICAgMzMyOTI4LCAgICAgMzMyOTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjQxMjgyYTAKKzAsICAgICAzMzQwODAsICAgICAzMzQwODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNDI2ODk5MworMCwgICAgIDMzNTIzMiwgICAgIDMzNTIzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDUyMTI2YTFjCiswLCAgICAgMzM2Mzg0LCAgICAgMzM2Mzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDUwYjZmN2EKKzAsICAgICAzMzc1MzYsICAgICAzMzc1MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2N2EyNmZjMworMCwgICAgIDMzODY4OCwgICAgIDMzODY4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDk2NmM3Y2YyCiswLCAgICAgMzM5ODQwLCAgICAgMzM5ODQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjIwOTc3NTAKKzAsICAgICAzNDA5OTIsICAgICAzNDA5OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmYmIwNzk2YworMCwgICAgIDM0MjE0NCwgICAgIDM0MjE0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGJkNTA4OTY0CiswLCAgICAgMzQzMjk2LCAgICAgMzQzMjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzI0NDc4ZDgKKzAsICAgICAzNDQ0NDgsICAgICAzNDQ0NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzOTEzNzY5ZAorMCwgICAgIDM0NTYwMCwgICAgIDM0NTYwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDhhYWI4NzJmCiswLCAgICAgMzQ2NzUyLCAgICAgMzQ2NzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2NiNDgyMmYKKzAsICAgICAzNDc5MDQsICAgICAzNDc5MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYTMxODE0NAorMCwgICAgIDM0OTA1NiwgICAgIDM0OTA1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGFmMGY4NmQyCiswLCAgICAgMzUwMjA4LCAgICAgMzUwMjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjRmMjc1OTgKKzAsICAgICAzNTEzNjAsICAgICAzNTEzNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNzZmNmQ0MAorMCwgICAgIDM1MjUxMiwgICAgIDM1MjUxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDA4NTA3MWE3CiswLCAgICAgMzUzNjY0LCAgICAgMzUzNjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWQxMTcwNGMKKzAsICAgICAzNTQ4MTYsICAgICAzNTQ4MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMTUxN2NiZAorMCwgICAgIDM1NTk2OCwgICAgIDM1NTk2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGNkY2E4ZDMyCiswLCAgICAgMzU3MTIwLCAgICAgMzU3MTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzFjMTg0MzMKKzAsICAgICAzNTgyNzIsICAgICAzNTgyNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMzlkN2Q4MQorMCwgICAgIDM1OTQyNCwgICAgIDM1OTQyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDdhMGQ3YTQzCiswLCAgICAgMzYwNTc2LCAgICAgMzYwNTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDA3Yzg4ODQKKzAsICAgICAzNjE3MjgsICAgICAzNjE3MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MDMyODJkMAorMCwgICAgIDM2Mjg4MCwgICAgIDM2Mjg4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGUzNzM3MjE0CiswLCAgICAgMzY0MDMyLCAgICAgMzY0MDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWY5MDZmNDcKKzAsICAgICAzNjUxODQsICAgICAzNjUxODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NGY1N2IzYgorMCwgICAgIDM2NjMzNiwgICAgIDM2NjMzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDI5YmU3NzkxCiswLCAgICAgMzY3NDg4LCAgICAgMzY3NDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTNjNjYzZDUKKzAsICAgICAzNjg2NDAsICAgICAzNjg2NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNzI1ODIzOAorMCwgICAgIDM2OTc5MiwgICAgIDM2OTc5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDM3MTk4MjBkCiswLCAgICAgMzcwOTQ0LCAgICAgMzcwOTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmUwNDgxNGYKKzAsICAgICAzNzIwOTYsICAgICAzNzIwOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NTZjODE1ZQorMCwgICAgIDM3MzI0OCwgICAgIDM3MzI0OCwgICAgIDExNTIsICAgICAyMzA0LCAweGIyNDQ3ZTEwCiswLCAgICAgMzc0NDAwLCAgICAgMzc0NDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2MxNjg2N2MKKzAsICAgICAzNzU1NTIsICAgICAzNzU1NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2YTdiNzhlZAorMCwgICAgIDM3NjcwNCwgICAgIDM3NjcwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDVkMzA3YjgxCiswLCAgICAgMzc3ODU2LCAgICAgMzc3ODU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWFiNjgwZDMKKzAsICAgICAzNzkwMDgsICAgICAzNzkwMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNWQzN2EyMworMCwgICAgIDM4MDE2MCwgICAgIDM4MDE2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDdmN2Q2Zjc2CiswLCAgICAgMzgxMzEyLCAgICAgMzgxMzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzE3YTgyOTYKKzAsICAgICAzODI0NjQsICAgICAzODI0NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4YTk4N2IzZAorMCwgICAgIDM4MzYxNiwgICAgIDM4MzYxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDRmMzE3YTI3CiswLCAgICAgMzg0NzY4LCAgICAgMzg0NzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmM2NTg1MmYKKzAsICAgICAzODU5MjAsICAgICAzODU5MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MDUyNzcxOQorMCwgICAgIDM4NzA3MiwgICAgIDM4NzA3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDg0OTg4ZTEzCiswLCAgICAgMzg4MjI0LCAgICAgMzg4MjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzE4YjZkZGMKKzAsICAgICAzODkzNzYsICAgICAzODkzNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NGNmNzkzOQorMCwgICAgIDM5MDUyOCwgICAgIDM5MDUyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDZmMjI4MTlkCiswLCAgICAgMzkxNjgwLCAgICAgMzkxNjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTdkZDgwYTkKKzAsICAgICAzOTI4MzIsICAgICAzOTI4MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxYzc5NjhmYQorMCwgICAgIDM5Mzk4NCwgICAgIDM5Mzk4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ5OTM3YmFlCiswLCAgICAgMzk1MTM2LCAgICAgMzk1MTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjcxMzdjZjkKKzAsICAgICAzOTYyODgsICAgICAzOTYyODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYWRiODRiNQorMCwgICAgIDM5NzQ0MCwgICAgIDM5NzQ0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDlhMjM5MGFjCiswLCAgICAgMzk4NTkyLCAgICAgMzk4NTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGI2YTczZjYKKzAsICAgICAzOTk3NDQsICAgICAzOTk3NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OWUwNzUwNworMCwgICAgIDQwMDg5NiwgICAgIDQwMDg5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGJjODQ3OGIyCiswLCAgICAgNDAyMDQ4LCAgICAgNDAyMDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzJjZjg2MzgKKzAsICAgICA0MDMyMDAsICAgICA0MDMyMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYjhkNzU1YQorMCwgICAgIDQwNDM1MiwgICAgIDQwNDM1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDUyZTA1YmQyCiswLCAgICAgNDA1NTA0LCAgICAgNDA1NTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmFlZDhjNDkKKzAsICAgICA0MDY2NTYsICAgICA0MDY2NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ODdhODk2ZQorMCwgICAgIDQwNzgwOCwgICAgIDQwNzgwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDZkZDg3ZGVlCiswLCAgICAgNDA4OTYwLCAgICAgNDA4OTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDI4NTgzMzgKKzAsICAgICA0MTAxMTIsICAgICA0MTAxMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkOTBmNzg0MgorMCwgICAgIDQxMTI2NCwgICAgIDQxMTI2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ2ZmI2ZDRhCiswLCAgICAgNDEyNDE2LCAgICAgNDEyNDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODU0OThhZWEKKzAsICAgICA0MTM1NjgsICAgICA0MTM1NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxODU5Nzc5MAorMCwgICAgIDQxNDcyMCwgICAgIDQxNDcyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDNjZDc4ZmVhCiswLCAgICAgNDE1ODcyLCAgICAgNDE1ODcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTQzNzdmYmMKKzAsICAgICA0MTcwMjQsICAgICA0MTcwMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmOWRiNzNmNQorMCwgICAgIDQxODE3NiwgICAgIDQxODE3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDE0ZmI2ZmNhCiswLCAgICAgNDE5MzI4LCAgICAgNDE5MzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTlkMTdkNjkKKzAsICAgICA0MjA0ODAsICAgICA0MjA0ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZWI1NzI4NgorMCwgICAgIDQyMTYzMiwgICAgIDQyMTYzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGE1ZDM3ZTE3CiswLCAgICAgNDIyNzg0LCAgICAgNDIyNzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2Y2ODgyZmIKKzAsICAgICA0MjM5MzYsICAgICA0MjM5MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMTc1ODA2NgorMCwgICAgIDQyNTA4OCwgICAgIDQyNTA4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDZiNGQ4MTc1CiswLCAgICAgNDI2MjQwLCAgICAgNDI2MjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmEzZDdmOGUKKzAsICAgICA0MjczOTIsICAgICA0MjczOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjMDY2NzQzYgorMCwgICAgIDQyODU0NCwgICAgIDQyODU0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGNhYjg4MTQ2CiswLCAgICAgNDI5Njk2LCAgICAgNDI5Njk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmI0YzZlMTMKKzAsICAgICA0MzA4NDgsICAgICA0MzA4NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMGIzNmI2ZgorMCwgICAgIDQzMjAwMCwgICAgIDQzMjAwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDY2NGE4OGQzCiswLCAgICAgNDMzMTUyLCAgICAgNDMzMTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MThhNjZmNzYKKzAsICAgICA0MzQzMDQsICAgICA0MzQzMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZjgyOGE4YgorMCwgICAgIDQzNTQ1NiwgICAgIDQzNTQ1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDljYzc3MjhlCiswLCAgICAgNDM2NjA4LCAgICAgNDM2NjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmUzNTc5MzYKKzAsICAgICA0Mzc3NjAsICAgICA0Mzc3NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOTg3OGY4ZAorMCwgICAgIDQzODkxMiwgICAgIDQzODkxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDIyN2I3YzcxCiswLCAgICAgNDQwMDY0LCAgICAgNDQwMDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjdjODc5ZWMKKzAsICAgICA0NDEyMTYsICAgICA0NDEyMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYmNhN2I1MAorMCwgICAgIDQ0MjM2OCwgICAgIDQ0MjM2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGU0Mzk4MzA0CiswLCAgICAgNDQzNTIwLCAgICAgNDQzNTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjVkYTc1YzcKKzAsICAgICA0NDQ2NzIsICAgICA0NDQ2NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ZjkwNzBhMworMCwgICAgIDQ0NTgyNCwgICAgIDQ0NTgyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDc4OTA3NmY2CiswLCAgICAgNDQ2OTc2LCAgICAgNDQ2OTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzYyOTc3Y2MKKzAsICAgICA0NDgxMjgsICAgICA0NDgxMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZDBhODkyOAorMCwgICAgIDQ0OTI4MCwgICAgIDQ0OTI4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDFiYjc2N2VjCiswLCAgICAgNDUwNDMyLCAgICAgNDUwNDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmU3MjdmYTUKKzAsICAgICA0NTE1ODQsICAgICA0NTE1ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyN2YzODM0NworMCwgICAgIDQ1MjczNiwgICAgIDQ1MjczNiwgICAgIDExNTIsICAgICAyMzA0LCAweDBhM2M4NzgzCiswLCAgICAgNDUzODg4LCAgICAgNDUzODg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODI0OTYzOWMKKzAsICAgICA0NTUwNDAsICAgICA0NTUwNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzYjA3NmY2OQorMCwgICAgIDQ1NjE5MiwgICAgIDQ1NjE5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ5NTk3ZWUzCiswLCAgICAgNDU3MzQ0LCAgICAgNDU3MzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDI2ZTdmYWQKKzAsICAgICA0NTg0OTYsICAgICA0NTg0OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiZDdhNmRlNAorMCwgICAgIDQ1OTY0OCwgICAgIDQ1OTY0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDdkNzE4YTRkCiswLCAgICAgNDYwODAwLCAgICAgNDYwODAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWY1ZTgzYjQKKzAsICAgICA0NjE5NTIsICAgICA0NjE5NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1OTdkNzc1NQorMCwgICAgIDQ2MzEwNCwgICAgIDQ2MzEwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDNmYjA4MGJkCiswLCAgICAgNDY0MjU2LCAgICAgNDY0MjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGNiZDdiMTYKKzAsICAgICA0NjU0MDgsICAgICA0NjU0MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YzQ4ODY1ZgorMCwgICAgIDQ2NjU2MCwgICAgIDQ2NjU2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGNkYTM3YWU4CiswLCAgICAgNDY3NzEyLCAgICAgNDY3NzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDgxMDc5NmQKKzAsICAgICA0Njg4NjQsICAgICA0Njg4NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzNDMxN2ZkMAorMCwgICAgIDQ3MDAxNiwgICAgIDQ3MDAxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDVjMGU3NDU2CiswLCAgICAgNDcxMTY4LCAgICAgNDcxMTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDRkNzgwNDAKKzAsICAgICA0NzIzMjAsICAgICA0NzIzMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ODU4Nzg4MgorMCwgICAgIDQ3MzQ3MiwgICAgIDQ3MzQ3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDc3Njg3ZDVlCiswLCAgICAgNDc0NjI0LCAgICAgNDc0NjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTE2ZDY4YmIKKzAsICAgICA0NzU3NzYsICAgICA0NzU3NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZTViNmY2MAorMCwgICAgIDQ3NjkyOCwgICAgIDQ3NjkyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDY0ZWE3ODNjCiswLCAgICAgNDc4MDgwLCAgICAgNDc4MDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjM1NDdmN2QKKzAsICAgICA0NzkyMzIsICAgICA0NzkyMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyZWVlNzg5MgorMCwgICAgIDQ4MDM4NCwgICAgIDQ4MDM4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGZiODM3Y2JhCiswLCAgICAgNDgxNTM2LCAgICAgNDgxNTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODY1MTgyMDkKKzAsICAgICA0ODI2ODgsICAgICA0ODI2ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NzJmN2JiYQorMCwgICAgIDQ4Mzg0MCwgICAgIDQ4Mzg0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDZhYjU4M2ZiCiswLCAgICAgNDg0OTkyLCAgICAgNDg0OTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzEyOTc0MjgKKzAsICAgICA0ODYxNDQsICAgICA0ODYxNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNjRlNzcxNworMCwgICAgIDQ4NzI5NiwgICAgIDQ4NzI5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGI3NTQ5NzZkCiswLCAgICAgNDg4NDQ4LCAgICAgNDg4NDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Yjk5ZDgxYjIKKzAsICAgICA0ODk2MDAsICAgICA0ODk2MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3OTA0NmZkNgorMCwgICAgIDQ5MDc1MiwgICAgIDQ5MDc1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDlhM2Y4NDI2CiswLCAgICAgNDkxOTA0LCAgICAgNDkxOTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODk2MzcxZjUKKzAsICAgICA0OTMwNTYsICAgICA0OTMwNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2M2QxNzk5ZgorMCwgICAgIDQ5NDIwOCwgICAgIDQ5NDIwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ4NDI4NDRlCiswLCAgICAgNDk1MzYwLCAgICAgNDk1MzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODUwZTgzNzIKKzAsICAgICA0OTY1MTIsICAgICA0OTY1MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NWQwNzAyMgorMCwgICAgIDQ5NzY2NCwgICAgIDQ5NzY2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDllNjY4M2QxCiswLCAgICAgNDk4ODE2LCAgICAgNDk4ODE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzAxYjg5ODEKKzAsICAgICA0OTk5NjgsICAgICA0OTk5NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxZjFlOThjNQorMCwgICAgIDUwMTEyMCwgICAgIDUwMTEyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGM4Nzk3YjAzCiswLCAgICAgNTAyMjcyLCAgICAgNTAyMjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjlkMTg5ZjUKKzAsICAgICA1MDM0MjQsICAgICA1MDM0MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZTBkODhiZQorMCwgICAgIDUwNDU3NiwgICAgIDUwNDU3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDZjMWQ3ODQzCiswLCAgICAgNTA1NzI4LCAgICAgNTA1NzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDEzYjhhMzgKKzAsICAgICA1MDY4ODAsICAgICA1MDY4ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YjhmNzczYworMCwgICAgIDUwODAzMiwgICAgIDUwODAzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDlhY2Q3MzA5CiswLCAgICAgNTA5MTg0LCAgICAgNTA5MTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWU3ZDdkMTUKKzAsICAgICA1MTAzMzYsICAgICA1MTAzMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMDlkNzY0MAorMCwgICAgIDUxMTQ4OCwgICAgIDUxMTQ4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGFlYmI3MThmCiswLCAgICAgNTEyNjQwLCAgICAgNTEyNjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGM4NTcwZjQKKzAsICAgICA1MTM3OTIsICAgICA1MTM3OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzYzkzODYyYworMCwgICAgIDUxNDk0NCwgICAgIDUxNDk0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGNlZTQ2Njk2CiswLCAgICAgNTE2MDk2LCAgICAgNTE2MDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDFiYTdlMjAKKzAsICAgICA1MTcyNDgsICAgICA1MTcyNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ZmNiN2EwOQorMCwgICAgIDUxODQwMCwgICAgIDUxODQwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGRkZjE4YzE0CiswLCAgICAgNTE5NTUyLCAgICAgNTE5NTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDJlOTdlZWIKKzAsICAgICA1MjA3MDQsICAgICA1MjA3MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1MTRkODcxOQorMCwgICAgIDUyMTg1NiwgICAgIDUyMTg1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGU4OTI3OWM5CiswLCAgICAgNTIzMDA4LCAgICAgNTIzMDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODA2ZDZhOTUKKzAsICAgICA1MjQxNjAsICAgICA1MjQxNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiYzdhOGE2MAorMCwgICAgIDUyNTMxMiwgICAgIDUyNTMxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDMwMmY4ZmE4CiswLCAgICAgNTI2NDY0LCAgICAgNTI2NDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjEzNjc4NGMKKzAsICAgICA1Mjc2MTYsICAgICA1Mjc2MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YjBmNmFhYgorMCwgICAgIDUyODc2OCwgICAgIDUyODc2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ4ZTI3NTgyCiswLCAgICAgNTI5OTIwLCAgICAgNTI5OTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGFhZjc4YjEKKzAsICAgICA1MzEwNzIsICAgICA1MzEwNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NTk2N2Y1ZgorMCwgICAgIDUzMjIyNCwgICAgIDUzMjIyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDZmOTE3YWE0CiswLCAgICAgNTMzMzc2LCAgICAgNTMzMzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2Y2MDc0NDQKKzAsICAgICA1MzQ1MjgsICAgICA1MzQ1MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmZDMxNmYyYworMCwgICAgIDUzNTY4MCwgICAgIDUzNTY4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDc3NmU4M2M3CiswLCAgICAgNTM2ODMyLCAgICAgNTM2ODMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjljMTdlMTYKKzAsICAgICA1Mzc5ODQsICAgICA1Mzc5ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZjI4N2RlOAorMCwgICAgIDUzOTEzNiwgICAgIDUzOTEzNiwgICAgIDExNTIsICAgICAyMzA0LCAweGYzM2Q5NmEzCiswLCAgICAgNTQwMjg4LCAgICAgNTQwMjg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWQyMTZlNWIKKzAsICAgICA1NDE0NDAsICAgICA1NDE0NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YTMyODM0MgorMCwgICAgIDU0MjU5MiwgICAgIDU0MjU5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGNmM2Y4MDc5CiswLCAgICAgNTQzNzQ0LCAgICAgNTQzNzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjQ2Zjc3YjAKKzAsICAgICA1NDQ4OTYsICAgICA1NDQ4OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMTk5NzEzZAorMCwgICAgIDU0NjA0OCwgICAgIDU0NjA0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDVlNjY3YTBkCiswLCAgICAgNTQ3MjAwLCAgICAgNTQ3MjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTMwNDdhZTMKKzAsICAgICA1NDgzNTIsICAgICA1NDgzNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ZWRmODU5NAorMCwgICAgIDU0OTUwNCwgICAgIDU0OTUwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGQxNjM4MmQ1CiswLCAgICAgNTUwNjU2LCAgICAgNTUwNjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmU4MzgzMjgKKzAsICAgICA1NTE4MDgsICAgICA1NTE4MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMWY2OTdjMQorMCwgICAgIDU1Mjk2MCwgICAgIDU1Mjk2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGVmY2M3NDljCiswLCAgICAgNTU0MTEyLCAgICAgNTU0MTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWY5NDgzOWUKKzAsICAgICA1NTUyNjQsICAgICA1NTUyNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MjllN2M1YgorMCwgICAgIDU1NjQxNiwgICAgIDU1NjQxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDliNTk3MTFjCiswLCAgICAgNTU3NTY4LCAgICAgNTU3NTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGFjMjczMjMKKzAsICAgICA1NTg3MjAsICAgICA1NTg3MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhNDg1NmQyYgorMCwgICAgIDU1OTg3MiwgICAgIDU1OTg3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDA3YTM3NDk4CiswLCAgICAgNTYxMDI0LCAgICAgNTYxMDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTFjZTc1MTIKKzAsICAgICA1NjIxNzYsICAgICA1NjIxNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNWUxODJjMworMCwgICAgIDU2MzMyOCwgICAgIDU2MzMyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDBmYTQ2YjhjCiswLCAgICAgNTY0NDgwLCAgICAgNTY0NDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmRmMDdiZmQKKzAsICAgICA1NjU2MzIsICAgICA1NjU2MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMDIzOGIyYQorMCwgICAgIDU2Njc4NCwgICAgIDU2Njc4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGFiNTM3MjY3CiswLCAgICAgNTY3OTM2LCAgICAgNTY3OTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDQ2Yjc1ZjMKKzAsICAgICA1NjkwODgsICAgICA1NjkwODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYzczNzk0YgorMCwgICAgIDU3MDI0MCwgICAgIDU3MDI0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDY4MDU4MGMxCiswLCAgICAgNTcxMzkyLCAgICAgNTcxMzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWFjZThmNmMKKzAsICAgICA1NzI1NDQsICAgICA1NzI1NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOWQ1ODNhYworMCwgICAgIDU3MzY5NiwgICAgIDU3MzY5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDRiNmI4MTA1CiswLCAgICAgNTc0ODQ4LCAgICAgNTc0ODQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzkyYTc4YjIKKzAsICAgICA1NzYwMDAsICAgICA1NzYwMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMzkxNmRhZAorMCwgICAgIDU3NzE1MiwgICAgIDU3NzE1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDU2OWM3YTc1CiswLCAgICAgNTc4MzA0LCAgICAgNTc4MzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjVhYzgxNGIKKzAsICAgICA1Nzk0NTYsICAgICA1Nzk0NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOGQ3N2U5OAorMCwgICAgIDU4MDYwOCwgICAgIDU4MDYwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDAwNzA3NGNlCiswLCAgICAgNTgxNzYwLCAgICAgNTgxNzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGZlMzgzNzMKKzAsICAgICA1ODI5MTIsICAgICA1ODI5MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YTk2NzkyMAorMCwgICAgIDU4NDA2NCwgICAgIDU4NDA2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDIyMTY3NTAxCiswLCAgICAgNTg1MjE2LCAgICAgNTg1MjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjA4MjhjYWIKKzAsICAgICA1ODYzNjgsICAgICA1ODYzNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhZWVjNzFiNworMCwgICAgIDU4NzUyMCwgICAgIDU4NzUyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGM0N2I2MmZmCiswLCAgICAgNTg4NjcyLCAgICAgNTg4NjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWI2ODg0NzgKKzAsICAgICA1ODk4MjQsICAgICA1ODk4MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMzVlN2JkMgorMCwgICAgIDU5MDk3NiwgICAgIDU5MDk3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDljZmY3NjNlCiswLCAgICAgNTkyMTI4LCAgICAgNTkyMTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTk1NjhkYzgKKzAsICAgICA1OTMyODAsICAgICA1OTMyODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1MWEyNzhhYworMCwgICAgIDU5NDQzMiwgICAgIDU5NDQzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGMwOGE2ZTY4CiswLCAgICAgNTk1NTg0LCAgICAgNTk1NTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDMwNjdlZjQKKzAsICAgICA1OTY3MzYsICAgICA1OTY3MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NDc2N2M0OQorMCwgICAgIDU5Nzg4OCwgICAgIDU5Nzg4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGY4ZmY4Mzg2CiswLCAgICAgNTk5MDQwLCAgICAgNTk5MDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWYyNjdmNjMKKzAsICAgICA2MDAxOTIsICAgICA2MDAxOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMjUzN2NkOQorMCwgICAgIDYwMTM0NCwgICAgIDYwMTM0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDc3YTU3NjgwCiswLCAgICAgNjAyNDk2LCAgICAgNjAyNDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzI1Yzc0YWQKKzAsICAgICA2MDM2NDgsICAgICA2MDM2NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkN2ZlODdjNAorMCwgICAgIDYwNDgwMCwgICAgIDYwNDgwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDJlNzU2MzEwCiswLCAgICAgNjA1OTUyLCAgICAgNjA1OTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmE4MTc5NmIKKzAsICAgICA2MDcxMDQsICAgICA2MDcxMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyZjA1N2RhZgorMCwgICAgIDYwODI1NiwgICAgIDYwODI1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGNkOWY3YzlkCiswLCAgICAgNjA5NDA4LCAgICAgNjA5NDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzkxNTYwYTAKKzAsICAgICA2MTA1NjAsICAgICA2MTA1NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NjJhOTFlYgorMCwgICAgIDYxMTcxMiwgICAgIDYxMTcxMiwgICAgIDExNTIsICAgICAyMzA0LCAweGEwZmY3NDE2CiswLCAgICAgNjEyODY0LCAgICAgNjEyODY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2I1YzdkZmYKKzAsICAgICA2MTQwMTYsICAgICA2MTQwMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMzUyNzA0MQorMCwgICAgIDYxNTE2OCwgICAgIDYxNTE2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGM4OWQ3N2MyCiswLCAgICAgNjE2MzIwLCAgICAgNjE2MzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTFjZTdjY2YKKzAsICAgICA2MTc0NzIsICAgICA2MTc0NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMzQxN2M0YworMCwgICAgIDYxODYyNCwgICAgIDYxODYyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDNmMWE3MTY2CiswLCAgICAgNjE5Nzc2LCAgICAgNjE5Nzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2RjYzdlMjMKKzAsICAgICA2MjA5MjgsICAgICA2MjA5MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZTcyN2U5NworMCwgICAgIDYyMjA4MCwgICAgIDYyMjA4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDUzNDI3ZmYxCiswLCAgICAgNjIzMjMyLCAgICAgNjIzMjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTczZjZjYTkKKzAsICAgICA2MjQzODQsICAgICA2MjQzODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NjI4ODdlYworMCwgICAgIDYyNTUzNiwgICAgIDYyNTUzNiwgICAgIDExNTIsICAgICAyMzA0LCAweGNiZWM2N2Y0CiswLCAgICAgNjI2Njg4LCAgICAgNjI2Njg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2EyYzk0M2QKKzAsICAgICA2Mjc4NDAsICAgICA2Mjc4NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4Yjg3NzU3MAorMCwgICAgIDYyODk5MiwgICAgIDYyODk5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGNmMzM3MzIzCiswLCAgICAgNjMwMTQ0LCAgICAgNjMwMTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGM4NjgyYTQKKzAsICAgICA2MzEyOTYsICAgICA2MzEyOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NGMzNzUzYworMCwgICAgIDYzMjQ0OCwgICAgIDYzMjQ0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDg2ODk4ZDc5CiswLCAgICAgNjMzNjAwLCAgICAgNjMzNjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGY2NjczMTIKKzAsICAgICA2MzQ3NTIsICAgICA2MzQ3NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNjJmOGJhOAorMCwgICAgIDYzNTkwNCwgICAgIDYzNTkwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGEyYzM2ZjA4CiswLCAgICAgNjM3MDU2LCAgICAgNjM3MDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWJjYTczNTgKKzAsICAgICA2MzgyMDgsICAgICA2MzgyMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NjQ4ODA0ZAorMCwgICAgIDYzOTM2MCwgICAgIDYzOTM2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGVmYWM4N2M4CiswLCAgICAgNjQwNTEyLCAgICAgNjQwNTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjZiZjdkY2YKKzAsICAgICA2NDE2NjQsICAgICA2NDE2NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2MmFkNzNiYworMCwgICAgIDY0MjgxNiwgICAgIDY0MjgxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDcyZmU2MzBjCiswLCAgICAgNjQzOTY4LCAgICAgNjQzOTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWViZTg3ZGEKKzAsICAgICA2NDUxMjAsICAgICA2NDUxMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMWM4NzBjZgorMCwgICAgIDY0NjI3MiwgICAgIDY0NjI3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDE4ZmI3YzI3CiswLCAgICAgNjQ3NDI0LCAgICAgNjQ3NDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzkwNDcxNDUKKzAsICAgICA2NDg1NzYsICAgICA2NDg1NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkY2YwNzAzMgorMCwgICAgIDY0OTcyOCwgICAgIDY0OTcyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDYxMDI3YzUwCiswLCAgICAgNjUwODgwLCAgICAgNjUwODgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmUyZTg5ZGUKKzAsICAgICA2NTIwMzIsICAgICA2NTIwMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNTBjNmQxZAorMCwgICAgIDY1MzE4NCwgICAgIDY1MzE4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGVlZDU4N2VlCiswLCAgICAgNjU0MzM2LCAgICAgNjU0MzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTM4MjY5YzcKKzAsICAgICA2NTU0ODgsICAgICA2NTU0ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZjY2ODA2ZQorMCwgICAgIDY1NjY0MCwgICAgIDY1NjY0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDJkM2I3YzFiCiswLCAgICAgNjU3NzkyLCAgICAgNjU3NzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTQxMjdkNDgKKzAsICAgICA2NTg5NDQsICAgICA2NTg5NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ODBiODMyNQorMCwgICAgIDY2MDA5NiwgICAgIDY2MDA5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGMxNTI3MjIxCiswLCAgICAgNjYxMjQ4LCAgICAgNjYxMjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTRjMTc2OWEKKzAsICAgICA2NjI0MDAsICAgICA2NjI0MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZmIzNzI3MQorMCwgICAgIDY2MzU1MiwgICAgIDY2MzU1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDk0NmQ3YTk2CiswLCAgICAgNjY0NzA0LCAgICAgNjY0NzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGZjMThlNTAKKzAsICAgICA2NjU4NTYsICAgICA2NjU4NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMGM0ODM5MworMCwgICAgIDY2NzAwOCwgICAgIDY2NzAwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDU4NTU2YjEwCiswLCAgICAgNjY4MTYwLCAgICAgNjY4MTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTk3Yjc5OTMKKzAsICAgICA2NjkzMTIsICAgICA2NjkzMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YTc4Nzk5MgorMCwgICAgIDY3MDQ2NCwgICAgIDY3MDQ2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDExNDA2YzIwCiswLCAgICAgNjcxNjE2LCAgICAgNjcxNjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDRhNDg3NGEKKzAsICAgICA2NzI3NjgsICAgICA2NzI3NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMzA3NzE2NAorMCwgICAgIDY3MzkyMCwgICAgIDY3MzkyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDA4YWM4MGUzCiswLCAgICAgNjc1MDcyLCAgICAgNjc1MDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjY4MzcwZDAKKzAsICAgICA2NzYyMjQsICAgICA2NzYyMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxZDEzNzc3OAorMCwgICAgIDY3NzM3NiwgICAgIDY3NzM3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGZhMTQ4ZTk3CiswLCAgICAgNjc4NTI4LCAgICAgNjc4NTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWM1MDcxN2MKKzAsICAgICA2Nzk2ODAsICAgICA2Nzk2ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjYmY0NmI3NQorMCwgICAgIDY4MDgzMiwgICAgIDY4MDgzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ0MTY4MDM4CiswLCAgICAgNjgxOTg0LCAgICAgNjgxOTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGQ5NTc3ZjAKKzAsICAgICA2ODMxMzYsICAgICA2ODMxMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNzA3NzY4NQorMCwgICAgIDY4NDI4OCwgICAgIDY4NDI4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDM0ZDI1ZTkxCiswLCAgICAgNjg1NDQwLCAgICAgNjg1NDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTY1MzdlNmQKKzAsICAgICA2ODY1OTIsICAgICA2ODY1OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiMTJlNzk0MAorMCwgICAgIDY4Nzc0NCwgICAgIDY4Nzc0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDg2MWQ2NGMwCiswLCAgICAgNjg4ODk2LCAgICAgNjg4ODk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTJiYzY0ZWQKKzAsICAgICA2OTAwNDgsICAgICA2OTAwNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYzVmODI2MQorMCwgICAgIDY5MTIwMCwgICAgIDY5MTIwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDU0MDU4NGZmCiswLCAgICAgNjkyMzUyLCAgICAgNjkyMzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTgzMjhiMDkKKzAsICAgICA2OTM1MDQsICAgICA2OTM1MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxZTc3NzA3OQorMCwgICAgIDY5NDY1NiwgICAgIDY5NDY1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDQ1MzQ4M2I0CiswLCAgICAgNjk1ODA4LCAgICAgNjk1ODA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWNhYjdhMWUKKzAsICAgICA2OTY5NjAsICAgICA2OTY5NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjYjM3ODU2ZAorMCwgICAgIDY5ODExMiwgICAgIDY5ODExMiwgICAgIDExNTIsICAgICAyMzA0LCAweDVhNDg4M2VkCiswLCAgICAgNjk5MjY0LCAgICAgNjk5MjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDFmMjdjYmYKKzAsICAgICA3MDA0MTYsICAgICA3MDA0MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZDM3N2E0ZAorMCwgICAgIDcwMTU2OCwgICAgIDcwMTU2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDI2NGU3NmRmCiswLCAgICAgNzAyNzIwLCAgICAgNzAyNzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmE2ODc3MWUKKzAsICAgICA3MDM4NzIsICAgICA3MDM4NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjYjMxN2EzMQorMCwgICAgIDcwNTAyNCwgICAgIDcwNTAyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGZjNWQ3YTI3CiswLCAgICAgNzA2MTc2LCAgICAgNzA2MTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmUwNjdkOTYKKzAsICAgICA3MDczMjgsICAgICA3MDczMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYzUzODU2MAorMCwgICAgIDcwODQ4MCwgICAgIDcwODQ4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGZiYWQ3MTdhCiswLCAgICAgNzA5NjMyLCAgICAgNzA5NjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjlmYzc2MDgKKzAsICAgICA3MTA3ODQsICAgICA3MTA3ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiMTgxN2M4ZgorMCwgICAgIDcxMTkzNiwgICAgIDcxMTkzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDU3YzM3ZjgyCiswLCAgICAgNzEzMDg4LCAgICAgNzEzMDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGNhYzgzNTYKKzAsICAgICA3MTQyNDAsICAgICA3MTQyNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NzEwODE4NgorMCwgICAgIDcxNTM5MiwgICAgIDcxNTM5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDA5NWQ4MWJiCiswLCAgICAgNzE2NTQ0LCAgICAgNzE2NTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDc1ZjZiMmIKKzAsICAgICA3MTc2OTYsICAgICA3MTc2OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZjdjOGNjNQorMCwgICAgIDcxODg0OCwgICAgIDcxODg0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDk3OWM3N2JlCiswLCAgICAgNzIwMDAwLCAgICAgNzIwMDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTZhNzg0NGIKKzAsICAgICA3MjExNTIsICAgICA3MjExNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ZWU0NmIyMQorMCwgICAgIDcyMjMwNCwgICAgIDcyMjMwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDA1YjY3MjIwCiswLCAgICAgNzIzNDU2LCAgICAgNzIzNDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjU3ODcyNTIKKzAsICAgICA3MjQ2MDgsICAgICA3MjQ2MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4YWQyNzhhZAorMCwgICAgIDcyNTc2MCwgICAgIDcyNTc2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDY3YmQ3MjJlCiswLCAgICAgNzI2OTEyLCAgICAgNzI2OTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjA0Zjc3YmUKKzAsICAgICA3MjgwNjQsICAgICA3MjgwNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MmQyN2FlMgorMCwgICAgIDcyOTIxNiwgICAgIDcyOTIxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDIzZmE4MmU0CiswLCAgICAgNzMwMzY4LCAgICAgNzMwMzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTljZjgxNTkKKzAsICAgICA3MzE1MjAsICAgICA3MzE1MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxM2YwODc0OQorMCwgICAgIDczMjY3MiwgICAgIDczMjY3MiwgICAgIDExNTIsICAgICAyMzA0LCAweGY4NGY3MWI1CiswLCAgICAgNzMzODI0LCAgICAgNzMzODI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWNiNzc3YzgKKzAsICAgICA3MzQ5NzYsICAgICA3MzQ5NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMTIzNjcyMgorMCwgICAgIDczNjEyOCwgICAgIDczNjEyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDEwMTk3Y2FjCiswLCAgICAgNzM3MjgwLCAgICAgNzM3MjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmQ0MTdlNjUKKzAsICAgICA3Mzg0MzIsICAgICA3Mzg0MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YTFjN2QwNQorMCwgICAgIDczOTU4NCwgICAgIDczOTU4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDRjM2E4NWRlCiswLCAgICAgNzQwNzM2LCAgICAgNzQwNzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDM4MTZlYjcKKzAsICAgICA3NDE4ODgsICAgICA3NDE4ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MDE4NmU2YworMCwgICAgIDc0MzA0MCwgICAgIDc0MzA0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDVjMDk3OTI4CiswLCAgICAgNzQ0MTkyLCAgICAgNzQ0MTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTRhYTgyM2QKKzAsICAgICA3NDUzNDQsICAgICA3NDUzNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMWMyN2YwNAorMCwgICAgIDc0NjQ5NiwgICAgIDc0NjQ5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDZkZGI3NGE5CiswLCAgICAgNzQ3NjQ4LCAgICAgNzQ3NjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWVhNjc5MDEKKzAsICAgICA3NDg4MDAsICAgICA3NDg4MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNzEwNzQyZAorMCwgICAgIDc0OTk1MiwgICAgIDc0OTk1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGY4YzI3YWRkCiswLCAgICAgNzUxMTA0LCAgICAgNzUxMTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjE3MTcwMTEKKzAsICAgICA3NTIyNTYsICAgICA3NTIyNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNTkwNzJkMAorMCwgICAgIDc1MzQwOCwgICAgIDc1MzQwOCwgICAgIDExNTIsICAgICAyMzA0LCAweGM4ZGM4NGE3CiswLCAgICAgNzU0NTYwLCAgICAgNzU0NTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzMxMTY3MzcKKzAsICAgICA3NTU3MTIsICAgICA3NTU3MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NjIxNmJkZAorMCwgICAgIDc1Njg2NCwgICAgIDc1Njg2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGEyZjg3ODY2CiswLCAgICAgNzU4MDE2LCAgICAgNzU4MDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWQ3Nzc3MWUKKzAsICAgICA3NTkxNjgsICAgICA3NTkxNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ZDhjNzdmZAorMCwgICAgIDc2MDMyMCwgICAgIDc2MDMyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDIzY2M4OWNiCiswLCAgICAgNzYxNDcyLCAgICAgNzYxNDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzM0ZTc0MDcKKzAsICAgICA3NjI2MjQsICAgICA3NjI2MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMWM5NzZmZgorMCwgICAgIDc2Mzc3NiwgICAgIDc2Mzc3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDNhM2I3YjE1CiswLCAgICAgNzY0OTI4LCAgICAgNzY0OTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmE0MjdkZTkKKzAsICAgICA3NjYwODAsICAgICA3NjYwODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiZWFhN2M5MQorMCwgICAgIDc2NzIzMiwgICAgIDc2NzIzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ2OTg4YjMxCiswLCAgICAgNzY4Mzg0LCAgICAgNzY4Mzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGRiNDdmODAKKzAsICAgICA3Njk1MzYsICAgICA3Njk1MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYTY4N2Q5ZQorMCwgICAgIDc3MDY4OCwgICAgIDc3MDY4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDFhNjI4MWNlCiswLCAgICAgNzcxODQwLCAgICAgNzcxODQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTE5NTgwMDMKKzAsICAgICA3NzI5OTIsICAgICA3NzI5OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNGFlN2M1ZQorMCwgICAgIDc3NDE0NCwgICAgIDc3NDE0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDI4ODI3YzhhCiswLCAgICAgNzc1Mjk2LCAgICAgNzc1Mjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWZiODhiMjUKKzAsICAgICA3NzY0NDgsICAgICA3NzY0NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ODhkNzFlOAorMCwgICAgIDc3NzYwMCwgICAgIDc3NzYwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDY4MjI3YzM0CiswLCAgICAgNzc4NzUyLCAgICAgNzc4NzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWU0ZDczZTgKKzAsICAgICA3Nzk5MDQsICAgICA3Nzk5MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OTI4N2M2ZAorMCwgICAgIDc4MTA1NiwgICAgIDc4MTA1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGJiMDQ5MjZhCiswLCAgICAgNzgyMjA4LCAgICAgNzgyMjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODk0NTZjZWMKKzAsICAgICA3ODMzNjAsICAgICA3ODMzNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhYmUxODk5MgorMCwgICAgIDc4NDUxMiwgICAgIDc4NDUxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDUwY2M3ZjZjCiswLCAgICAgNzg1NjY0LCAgICAgNzg1NjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmQ3MjcwYmUKKzAsICAgICA3ODY4MTYsICAgICA3ODY4MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NjRjNmZlZgorMCwgICAgIDc4Nzk2OCwgICAgIDc4Nzk2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDdmNzk4MmYzCiswLCAgICAgNzg5MTIwLCAgICAgNzg5MTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmNhMTcwZTkKKzAsICAgICA3OTAyNzIsICAgICA3OTAyNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzNjQzN2Q1YgorMCwgICAgIDc5MTQyNCwgICAgIDc5MTQyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGZkMjM4MGU4CiswLCAgICAgNzkyNTc2LCAgICAgNzkyNTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmUzYzZlOWYKKzAsICAgICA3OTM3MjgsICAgICA3OTM3MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjODQyN2YzZgorMCwgICAgIDc5NDg4MCwgICAgIDc5NDg4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDk2MmE3OWFkCiswLCAgICAgNzk2MDMyLCAgICAgNzk2MDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Yzk1OTdjOGIKKzAsICAgICA3OTcxODQsICAgICA3OTcxODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4OTk1ODBiYgorMCwgICAgIDc5ODMzNiwgICAgIDc5ODMzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDJkMTc5ZGZmCiswLCAgICAgNzk5NDg4LCAgICAgNzk5NDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGFjMTcwN2MKKzAsICAgICA4MDA2NDAsICAgICA4MDA2NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMmVhN2U5NQorMCwgICAgIDgwMTc5MiwgICAgIDgwMTc5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDI2NWU5YTJkCiswLCAgICAgODAyOTQ0LCAgICAgODAyOTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWM2NDg0ZDAKKzAsICAgICA4MDQwOTYsICAgICA4MDQwOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzOWFlNjg4NAorMCwgICAgIDgwNTI0OCwgICAgIDgwNTI0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDgyZWQ3YmM1CiswLCAgICAgODA2NDAwLCAgICAgODA2NDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTU2YjdiM2MKKzAsICAgICA4MDc1NTIsICAgICA4MDc1NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiN2Y3NzhkZAorMCwgICAgIDgwODcwNCwgICAgIDgwODcwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDc0NDQ3ZDU1CiswLCAgICAgODA5ODU2LCAgICAgODA5ODU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGM2Njg2MWUKKzAsICAgICA4MTEwMDgsICAgICA4MTEwMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNWJhNzkzMgorMCwgICAgIDgxMjE2MCwgICAgIDgxMjE2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGIxOTE3MGZjCiswLCAgICAgODEzMzEyLCAgICAgODEzMzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTlkMzc1NTEKKzAsICAgICA4MTQ0NjQsICAgICA4MTQ0NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYzUyOTE0MgorMCwgICAgIDgxNTYxNiwgICAgIDgxNTYxNiwgICAgIDExNTIsICAgICAyMzA0LCAweGYyNjM3ZTc3CiswLCAgICAgODE2NzY4LCAgICAgODE2NzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDA2NTk0NGIKKzAsICAgICA4MTc5MjAsICAgICA4MTc5MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMjg3ODEyMworMCwgICAgIDgxOTA3MiwgICAgIDgxOTA3MiwgICAgIDExNTIsICAgICAyMzA0LCAweGMyMWE4YmY3CiswLCAgICAgODIwMjI0LCAgICAgODIwMjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmUzNTgyZGMKKzAsICAgICA4MjEzNzYsICAgICA4MjEzNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNDJmNzk4NworMCwgICAgIDgyMjUyOCwgICAgIDgyMjUyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDY5Yjg4MjM2CiswLCAgICAgODIzNjgwLCAgICAgODIzNjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2M5ODhmOTAKKzAsICAgICA4MjQ4MzIsICAgICA4MjQ4MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyY2Q2NmRlZAorMCwgICAgIDgyNTk4NCwgICAgIDgyNTk4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDNlNjU4MjhiCiswLCAgICAgODI3MTM2LCAgICAgODI3MTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2U5ODcxYzkKKzAsICAgICA4MjgyODgsICAgICA4MjgyODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMWYyODA2YgorMCwgICAgIDgyOTQ0MCwgICAgIDgyOTQ0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGY1MDg3YzdiCiswLCAgICAgODMwNTkyLCAgICAgODMwNTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjJiOTgwOTcKKzAsICAgICA4MzE3NDQsICAgICA4MzE3NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYzQ1N2M0MworMCwgICAgIDgzMjg5NiwgICAgIDgzMjg5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDg3YWY4N2E2CiswLCAgICAgODM0MDQ4LCAgICAgODM0MDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTdjYzc1N2QKKzAsICAgICA4MzUyMDAsICAgICA4MzUyMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOGNhNzZiZAorMCwgICAgIDgzNjM1MiwgICAgIDgzNjM1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDE0YWU3Y2JkCiswLCAgICAgODM3NTA0LCAgICAgODM3NTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWY3OTcwOWEKKzAsICAgICA4Mzg2NTYsICAgICA4Mzg2NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNzk0ODIwNworMCwgICAgIDgzOTgwOCwgICAgIDgzOTgwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDE2ZWU3MjI4CiswLCAgICAgODQwOTYwLCAgICAgODQwOTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzZjYzgyZDcKKzAsICAgICA4NDIxMTIsICAgICA4NDIxMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZjMyN2E4ZQorMCwgICAgIDg0MzI2NCwgICAgIDg0MzI2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDE0ZWU3NzU2CiswLCAgICAgODQ0NDE2LCAgICAgODQ0NDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTU5OTZkMmYKKzAsICAgICA4NDU1NjgsICAgICA4NDU1NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YzcwN2Q1YworMCwgICAgIDg0NjcyMCwgICAgIDg0NjcyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDI2OGM2ZmVlCiswLCAgICAgODQ3ODcyLCAgICAgODQ3ODcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmQ4MzhjNzYKKzAsICAgICA4NDkwMjQsICAgICA4NDkwMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhZmExN2U2NAorMCwgICAgIDg1MDE3NiwgICAgIDg1MDE3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGI2NTQ2ZTY2CiswLCAgICAgODUxMzI4LCAgICAgODUxMzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTQ1ZDhiOWYKKzAsICAgICA4NTI0ODAsICAgICA4NTI0ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YmZiNzQ0NgorMCwgICAgIDg1MzYzMiwgICAgIDg1MzYzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGFlNjA4NmY5CiswLCAgICAgODU0Nzg0LCAgICAgODU0Nzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTAxMzgwY2QKKzAsICAgICA4NTU5MzYsICAgICA4NTU5MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNmYwODI4ZgorMCwgICAgIDg1NzA4OCwgICAgIDg1NzA4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDBhZTA3MTc2CiswLCAgICAgODU4MjQwLCAgICAgODU4MjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjZmMDc1MjIKKzAsICAgICA4NTkzOTIsICAgICA4NTkzOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0NDAxODEwNgorMCwgICAgIDg2MDU0NCwgICAgIDg2MDU0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDhjZDI4M2RhCiswLCAgICAgODYxNjk2LCAgICAgODYxNjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTQyNTdmNDUKKzAsICAgICA4NjI4NDgsICAgICA4NjI4NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNDk3OTUzNworMCwgICAgIDg2NDAwMCwgICAgIDg2NDAwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDhiNWY3OTdjCiswLCAgICAgODY1MTUyLCAgICAgODY1MTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTJkNjc0OTMKKzAsICAgICA4NjYzMDQsICAgICA4NjYzMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjODg4NmEyNQorMCwgICAgIDg2NzQ1NiwgICAgIDg2NzQ1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDYxNGI4MDNhCiswLCAgICAgODY4NjA4LCAgICAgODY4NjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzU2NjdkMzUKKzAsICAgICA4Njk3NjAsICAgICA4Njk3NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNDJjN2IwMAorMCwgICAgIDg3MDkxMiwgICAgIDg3MDkxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDM3Nzg3OTI3CiswLCAgICAgODcyMDY0LCAgICAgODcyMDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODVkYjg0MDkKKzAsICAgICA4NzMyMTYsICAgICA4NzMyMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MjNiODIyYworMCwgICAgIDg3NDM2OCwgICAgIDg3NDM2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGExNjU4NDc5CiswLCAgICAgODc1NTIwLCAgICAgODc1NTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGJlNThmZjcKKzAsICAgICA4NzY2NzIsICAgICA4NzY2NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MjUxNzVlMgorMCwgICAgIDg3NzgyNCwgICAgIDg3NzgyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGIyYWU3NzQxCiswLCAgICAgODc4OTc2LCAgICAgODc4OTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGRlMTY5ZTQKKzAsICAgICA4ODAxMjgsICAgICA4ODAxMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzY2IxODUzMAorMCwgICAgIDg4MTI4MCwgICAgIDg4MTI4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDVhMGM1ZTdiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaGxzLWFwcGVuZCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1obHMtYXBwZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjVjODIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaGxzLWFwcGVuZApAQCAtMCwwICsxLDE1MzggQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDExNTIsICAgICAyMzA0LCAweDkwN2NiN2ZhCiswLCAgICAgICAxMTUyLCAgICAgICAxMTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjhkYzc1MjUKKzAsICAgICAgIDIzMDQsICAgICAgIDIzMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZTdkNjkwNQorMCwgICAgICAgMzQ1NiwgICAgICAgMzQ1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGVmNDc4NzdiCiswLCAgICAgICA0NjA4LCAgICAgICA0NjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmU5MTZiN2UKKzAsICAgICAgIDU3NjAsICAgICAgIDU3NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlM2QwOGNkZQorMCwgICAgICAgNjkxMiwgICAgICAgNjkxMiwgICAgIDExNTIsICAgICAyMzA0LCAweGZmN2Y4NmNmCiswLCAgICAgICA4MDY0LCAgICAgICA4MDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODQzZTZmOTUKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MTU3N2MyNgorMCwgICAgICAxMDM2OCwgICAgICAxMDM2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDA0YTA4NWQ1CiswLCAgICAgIDExNTIwLCAgICAgIDExNTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWM1YTc2ZjUKKzAsICAgICAgMTI2NzIsICAgICAgMTI2NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZWU3ODYyMworMCwgICAgICAxMzgyNCwgICAgICAxMzgyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDhlYzg2MWRjCiswLCAgICAgIDE0OTc2LCAgICAgIDE0OTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGNhMTc5ZDgKKzAsICAgICAgMTYxMjgsICAgICAgMTYxMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNmRhNzUwZgorMCwgICAgICAxNzI4MCwgICAgICAxNzI4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGY2YmY3OWI1CiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTdiODhhNDMKKzAsICAgICAgMTk1ODQsICAgICAgMTk1ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMTNjN2I5YworMCwgICAgICAyMDczNiwgICAgICAyMDczNiwgICAgIDExNTIsICAgICAyMzA0LCAweGRmYmE4M2FmCiswLCAgICAgIDIxODg4LCAgICAgIDIxODg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Yzk0NjdkNGIKKzAsICAgICAgMjMwNDAsICAgICAgMjMwNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiYmI1OGUyYgorMCwgICAgICAyNDE5MiwgICAgICAyNDE5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDNhMTA3OGVhCiswLCAgICAgIDI1MzQ0LCAgICAgIDI1MzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTk1ODdhNWMKKzAsICAgICAgMjY0OTYsICAgICAgMjY0OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZjVhODAzOQorMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDlkNWY3ODJmCiswLCAgICAgIDI4ODAwLCAgICAgIDI4ODAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWE1NDgyOTEKKzAsICAgICAgMjk5NTIsICAgICAgMjk5NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNzUxNzcwMQorMCwgICAgICAzMTEwNCwgICAgICAzMTEwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDc4MTI3ZDZlCiswLCAgICAgIDMyMjU2LCAgICAgIDMyMjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjJlMjc4OGEKKzAsICAgICAgMzM0MDgsICAgICAgMzM0MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOTM5N2FkOQorMCwgICAgICAzNDU2MCwgICAgICAzNDU2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ1ZGE4MmQ2CiswLCAgICAgIDM1NzEyLCAgICAgIDM1NzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGVkNjZlNTEKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NjA3NzVjZAorMCwgICAgICAzODAxNiwgICAgICAzODAxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDgwMmM3NjdhCiswLCAgICAgIDM5MTY4LCAgICAgIDM5MTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2MwNTU4NDAKKzAsICAgICAgNDAzMjAsICAgICAgNDAzMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MDFiN2VhZgorMCwgICAgICA0MTQ3MiwgICAgICA0MTQ3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDgyOTA3NDlmCiswLCAgICAgIDQyNjI0LCAgICAgIDQyNjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmM3YjdkMzAKKzAsICAgICAgNDM3NzYsICAgICAgNDM3NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNGYxNzc0MworMCwgICAgICA0NDkyOCwgICAgICA0NDkyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDBlNzQ3ZDZlCiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmU3Nzc1YTAKKzAsICAgICAgNDcyMzIsICAgICAgNDcyMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZjc5NzY3MworMCwgICAgICA0ODM4NCwgICAgICA0ODM4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDI5Y2I3ODAwCiswLCAgICAgIDQ5NTM2LCAgICAgIDQ5NTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmM5NDc4OTAKKzAsICAgICAgNTA2ODgsICAgICAgNTA2ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2Mjc1N2ZjNgorMCwgICAgICA1MTg0MCwgICAgICA1MTg0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDA5ODg3NmQwCiswLCAgICAgIDUyOTkyLCAgICAgIDUyOTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTk1NjdlZTIKKzAsICAgICAgNTQxNDQsICAgICAgNTQxNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlM2JiOTE3MworMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGNjMmQ2ZGVlCiswLCAgICAgIDU2NDQ4LCAgICAgIDU2NDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTk0NTkxYWIKKzAsICAgICAgNTc2MDAsICAgICAgNTc2MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1Yzc1ODhkZQorMCwgICAgICA1ODc1MiwgICAgICA1ODc1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGZkODM2NDNjCiswLCAgICAgIDU5OTA0LCAgICAgIDU5OTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTI4MTc3ZjEKKzAsICAgICAgNjEwNTYsICAgICAgNjEwNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NWQwODQ3NAorMCwgICAgICA2MjIwOCwgICAgICA2MjIwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDczOGQ3NjViCiswLCAgICAgIDYzMzYwLCAgICAgIDYzMzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGQzZDgxMGUKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZjRmOTBkMworMCwgICAgICA2NTY2NCwgICAgICA2NTY2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDYxZTI4ZDQzCiswLCAgICAgIDY2ODE2LCAgICAgIDY2ODE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWExMTc5NmIKKzAsICAgICAgNjc5NjgsICAgICAgNjc5NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NmM5N2RjZAorMCwgICAgICA2OTEyMCwgICAgICA2OTEyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGE4ZmU4NjIxCiswLCAgICAgIDcwMjcyLCAgICAgIDcwMjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDk5YjdkMzgKKzAsICAgICAgNzE0MjQsICAgICAgNzE0MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmY2IwNzhhOQorMCwgICAgICA3MjU3NiwgICAgICA3MjU3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDQwZDc4NjUxCiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTRhZjcyMzQKKzAsICAgICAgNzQ4ODAsICAgICAgNzQ4ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2ODMxODcwYQorMCwgICAgICA3NjAzMiwgICAgICA3NjAzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDAzMGU3YjlkCiswLCAgICAgIDc3MTg0LCAgICAgIDc3MTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDQ1YTc1YjYKKzAsICAgICAgNzgzMzYsICAgICAgNzgzMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOTg1NzM4OQorMCwgICAgICA3OTQ4OCwgICAgICA3OTQ4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDBkMDE4ODY2CiswLCAgICAgIDgwNjQwLCAgICAgIDgwNjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmFmZTgxMGEKKzAsICAgICAgODE3OTIsICAgICAgODE3OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYmNmN2M0MworMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDEzNzM3YzEyCiswLCAgICAgIDg0MDk2LCAgICAgIDg0MDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzE2YzdiYmEKKzAsICAgICAgODUyNDgsICAgICAgODUyNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiODAxODIzYgorMCwgICAgICA4NjQwMCwgICAgICA4NjQwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDBmZDU3M2VlCiswLCAgICAgIDg3NTUyLCAgICAgIDg3NTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTFhYjg3OWMKKzAsICAgICAgODg3MDQsICAgICAgODg3MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0OWU2NzY0ZgorMCwgICAgICA4OTg1NiwgICAgICA4OTg1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ1ZjI2ZGRjCiswLCAgICAgIDkxMDA4LCAgICAgIDkxMDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDc2Nzc1ZmYKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmYmI4NmZjZQorMCwgICAgICA5MzMxMiwgICAgICA5MzMxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDIwYzU2ODU4CiswLCAgICAgIDk0NDY0LCAgICAgIDk0NDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDQzZTY4OTEKKzAsICAgICAgOTU2MTYsICAgICAgOTU2MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1OTY0ODcyOQorMCwgICAgICA5Njc2OCwgICAgICA5Njc2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ0OTA3YTYzCiswLCAgICAgIDk3OTIwLCAgICAgIDk3OTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDAyMDhhNGMKKzAsICAgICAgOTkwNzIsICAgICAgOTkwNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZTk2ODM4MworMCwgICAgIDEwMDIyNCwgICAgIDEwMDIyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDNjZmM3Y2QxCiswLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjI4YTdiZjUKKzAsICAgICAxMDI1MjgsICAgICAxMDI1MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5Y2ZlOGE0ZgorMCwgICAgIDEwMzY4MCwgICAgIDEwMzY4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGRmNmY3YzZkCiswLCAgICAgMTA0ODMyLCAgICAgMTA0ODMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmNmNjg4MmEKKzAsICAgICAxMDU5ODQsICAgICAxMDU5ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOTk3NzNhMworMCwgICAgIDEwNzEzNiwgICAgIDEwNzEzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDRhMWM3NjQ5CiswLCAgICAgMTA4Mjg4LCAgICAgMTA4Mjg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzFlYTcxY2IKKzAsICAgICAxMDk0NDAsICAgICAxMDk0NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZDEyN2VkOQorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDViMTU2OTU0CiswLCAgICAgMTExNzQ0LCAgICAgMTExNzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGQ2Mzg1MzIKKzAsICAgICAxMTI4OTYsICAgICAxMTI4OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMWEyNzFmMgorMCwgICAgIDExNDA0OCwgICAgIDExNDA0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDc3OTE4NGQ3CiswLCAgICAgMTE1MjAwLCAgICAgMTE1MjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDlhODhhYTgKKzAsICAgICAxMTYzNTIsICAgICAxMTYzNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMTFiN2M5MAorMCwgICAgIDExNzUwNCwgICAgIDExNzUwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGJmNDg4Mjc0CiswLCAgICAgMTE4NjU2LCAgICAgMTE4NjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDAyZjc5YTgKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZWQ5N2UyZgorMCwgICAgIDEyMDk2MCwgICAgIDEyMDk2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDc4NDU4NzhmCiswLCAgICAgMTIyMTEyLCAgICAgMTIyMTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDZkNzc3ZGMKKzAsICAgICAxMjMyNjQsICAgICAxMjMyNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZDAxNzllMworMCwgICAgIDEyNDQxNiwgICAgIDEyNDQxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDM4OTE3ZjlmCiswLCAgICAgMTI1NTY4LCAgICAgMTI1NTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDQ5ODc2ZTcKKzAsICAgICAxMjY3MjAsICAgICAxMjY3MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMDFhODc2OQorMCwgICAgIDEyNzg3MiwgICAgIDEyNzg3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDA2YzE4MjZiCiswLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDFiNjgwNDcKKzAsICAgICAxMzAxNzYsICAgICAxMzAxNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYjk3ODJjNgorMCwgICAgIDEzMTMyOCwgICAgIDEzMTMyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDdjZDk3MTljCiswLCAgICAgMTMyNDgwLCAgICAgMTMyNDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2E0YTc2N2MKKzAsICAgICAxMzM2MzIsICAgICAxMzM2MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3Zjg4N2U4MQorMCwgICAgIDEzNDc4NCwgICAgIDEzNDc4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGY3NWQ3MTRiCiswLCAgICAgMTM1OTM2LCAgICAgMTM1OTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzNiNTdlOWYKKzAsICAgICAxMzcwODgsICAgICAxMzcwODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNzMyNzQ5ZQorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDM4NmY3ZTFhCiswLCAgICAgMTM5MzkyLCAgICAgMTM5MzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmI5Yzc2N2QKKzAsICAgICAxNDA1NDQsICAgICAxNDA1NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MDFjODNlNQorMCwgICAgIDE0MTY5NiwgICAgIDE0MTY5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGI5MjU3MWUxCiswLCAgICAgMTQyODQ4LCAgICAgMTQyODQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODMzYTg0YmMKKzAsICAgICAxNDQwMDAsICAgICAxNDQwMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxYjY5ODRlMAorMCwgICAgIDE0NTE1MiwgICAgIDE0NTE1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDFiMjQ3NGJhCiswLCAgICAgMTQ2MzA0LCAgICAgMTQ2MzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzIyNzc1YTYKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZThmNzk3MgorMCwgICAgIDE0ODYwOCwgICAgIDE0ODYwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDE3YTI4YTY1CiswLCAgICAgMTQ5NzYwLCAgICAgMTQ5NzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWI2MTc4YTQKKzAsICAgICAxNTA5MTIsICAgICAxNTA5MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ZDcwNzg3MworMCwgICAgIDE1MjA2NCwgICAgIDE1MjA2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDY4ZTI2NDVhCiswLCAgICAgMTUzMjE2LCAgICAgMTUzMjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWUzNzdkMjgKKzAsICAgICAxNTQzNjgsICAgICAxNTQzNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NGIzODRiZQorMCwgICAgIDE1NTUyMCwgICAgIDE1NTUyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDA2MTc4MDhjCiswLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmMyYjhhNmMKKzAsICAgICAxNTc4MjQsICAgICAxNTc4MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3Y2VkNzE4MAorMCwgICAgIDE1ODk3NiwgICAgIDE1ODk3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGYyMjE4MGFiCiswLCAgICAgMTYwMTI4LCAgICAgMTYwMTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjEzNjgyYzkKKzAsICAgICAxNjEyODAsICAgICAxNjEyODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ZWZmODdmZAorMCwgICAgIDE2MjQzMiwgICAgIDE2MjQzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDVhMGI1Y2VjCiswLCAgICAgMTYzNTg0LCAgICAgMTYzNTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTdjMTg5MDYKKzAsICAgICAxNjQ3MzYsICAgICAxNjQ3MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNTVhNmExNgorMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGYyNjA4MzcxCiswLCAgICAgMTY3MDQwLCAgICAgMTY3MDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzZkZjc1NzYKKzAsICAgICAxNjgxOTIsICAgICAxNjgxOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYjEwNmZiNAorMCwgICAgIDE2OTM0NCwgICAgIDE2OTM0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDdlNGY4NWQwCiswLCAgICAgMTcwNDk2LCAgICAgMTcwNDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTNlZTc4YWIKKzAsICAgICAxNzE2NDgsICAgICAxNzE2NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMzZiN2RjNworMCwgICAgIDE3MjgwMCwgICAgIDE3MjgwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGFkYWI3YzVjCiswLCAgICAgMTczOTUyLCAgICAgMTczOTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzA3ODZmMjYKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZDVkNzE3ZQorMCwgICAgIDE3NjI1NiwgICAgIDE3NjI1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGMxYTk2ZjlhCiswLCAgICAgMTc3NDA4LCAgICAgMTc3NDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWQ3Nzc4ODcKKzAsICAgICAxNzg1NjAsICAgICAxNzg1NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ODI3N2MxNgorMCwgICAgIDE3OTcxMiwgICAgIDE3OTcxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDg2ODg4MmM1CiswLCAgICAgMTgwODY0LCAgICAgMTgwODY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzQ4MDkyYjkKKzAsICAgICAxODIwMTYsICAgICAxODIwMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMzAwNjlkYQorMCwgICAgIDE4MzE2OCwgICAgIDE4MzE2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDE0MTQ3YWQ2CiswLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzkwMDcxNzIKKzAsICAgICAxODU0NzIsICAgICAxODU0NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NWQ2N2JjYworMCwgICAgIDE4NjYyNCwgICAgIDE4NjYyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDIyNDE4YmFiCiswLCAgICAgMTg3Nzc2LCAgICAgMTg3Nzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTUzYzhiNzEKKzAsICAgICAxODg5MjgsICAgICAxODg5MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YTFhOTA1MworMCwgICAgIDE5MDA4MCwgICAgIDE5MDA4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDljZDE3OWFmCiswLCAgICAgMTkxMjMyLCAgICAgMTkxMjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmIzYzdkNzIKKzAsICAgICAxOTIzODQsICAgICAxOTIzODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0NzdhODY3NworMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDExNTIsICAgICAyMzA0LCAweGUzMzM3ODM0CiswLCAgICAgMTk0Njg4LCAgICAgMTk0Njg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWNiNTZkNzcKKzAsICAgICAxOTU4NDAsICAgICAxOTU4NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlODlkNmRhYworMCwgICAgIDE5Njk5MiwgICAgIDE5Njk5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ0Njg4MjdlCiswLCAgICAgMTk4MTQ0LCAgICAgMTk4MTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWJjNDZiODcKKzAsICAgICAxOTkyOTYsICAgICAxOTkyOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ZmJiNzhkMgorMCwgICAgIDIwMDQ0OCwgICAgIDIwMDQ0OCwgICAgIDExNTIsICAgICAyMzA0LCAweGExYjQ4M2Q2CiswLCAgICAgMjAxNjAwLCAgICAgMjAxNjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmZlYzdjYWIKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkODZkNmY2YworMCwgICAgIDIwMzkwNCwgICAgIDIwMzkwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDhjMmM3ZDUxCiswLCAgICAgMjA1MDU2LCAgICAgMjA1MDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTgzNzdjZDcKKzAsICAgICAyMDYyMDgsICAgICAyMDYyMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNTcwNzFiNAorMCwgICAgIDIwNzM2MCwgICAgIDIwNzM2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGMzNWM3MWZkCiswLCAgICAgMjA4NTEyLCAgICAgMjA4NTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Nzg5MDc5ZTkKKzAsICAgICAyMDk2NjQsICAgICAyMDk2NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MTNiNzEwZQorMCwgICAgIDIxMDgxNiwgICAgIDIxMDgxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDgyNjc4MzMyCiswLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTE1NzZlNzUKKzAsICAgICAyMTMxMjAsICAgICAyMTMxMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3YzBiN2FkNgorMCwgICAgIDIxNDI3MiwgICAgIDIxNDI3MiwgICAgIDExNTIsICAgICAyMzA0LCAweGM2YjY3ODZkCiswLCAgICAgMjE1NDI0LCAgICAgMjE1NDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzM2ZjdiODkKKzAsICAgICAyMTY1NzYsICAgICAyMTY1NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZGVkNzJmMQorMCwgICAgIDIxNzcyOCwgICAgIDIxNzcyOCwgICAgIDExNTIsICAgICAyMzA0LCAweGNiODc3YTNjCiswLCAgICAgMjE4ODgwLCAgICAgMjE4ODgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2M0OTdkNDAKKzAsICAgICAyMjAwMzIsICAgICAyMjAwMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhZWZjNzk4YworMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDRjY2U3NDhjCiswLCAgICAgMjIyMzM2LCAgICAgMjIyMzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWExODdmYmUKKzAsICAgICAyMjM0ODgsICAgICAyMjM0ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxYWE3N2RiOQorMCwgICAgIDIyNDY0MCwgICAgIDIyNDY0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDllMDA3NGI4CiswLCAgICAgMjI1NzkyLCAgICAgMjI1NzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzRlZTgyMmIKKzAsICAgICAyMjY5NDQsICAgICAyMjY5NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NzVjNmZmNgorMCwgICAgIDIyODA5NiwgICAgIDIyODA5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGUxODQ3YmI0CiswLCAgICAgMjI5MjQ4LCAgICAgMjI5MjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTA4Mjg3NzcKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmNDAyNzIwNQorMCwgICAgIDIzMTU1MiwgICAgIDIzMTU1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDUzNWU3YTIwCiswLCAgICAgMjMyNzA0LCAgICAgMjMyNzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWJkODg0MDQKKzAsICAgICAyMzM4NTYsICAgICAyMzM4NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMjk0NzhiMQorMCwgICAgIDIzNTAwOCwgICAgIDIzNTAwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDliN2M3ZDg4CiswLCAgICAgMjM2MTYwLCAgICAgMjM2MTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWViMDczMzUKKzAsICAgICAyMzczMTIsICAgICAyMzczMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiZWYwNmUwOAorMCwgICAgIDIzODQ2NCwgICAgIDIzODQ2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDc5NWY3YjhjCiswLCAgICAgMjM5NjE2LCAgICAgMjM5NjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDM1YTY3NGQKKzAsICAgICAyNDA3NjgsICAgICAyNDA3NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkOGVlN2EwOQorMCwgICAgIDI0MTkyMCwgICAgIDI0MTkyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDkwNTk4MTJlCiswLCAgICAgMjQzMDcyLCAgICAgMjQzMDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzQ4MTc0NGEKKzAsICAgICAyNDQyMjQsICAgICAyNDQyMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZmYyNzQ3NQorMCwgICAgIDI0NTM3NiwgICAgIDI0NTM3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGIxNzc4M2FiCiswLCAgICAgMjQ2NTI4LCAgICAgMjQ2NTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDJlOTcwNmIKKzAsICAgICAyNDc2ODAsICAgICAyNDc2ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ZjBkODZiNAorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDI5NjM5NTVmCiswLCAgICAgMjQ5OTg0LCAgICAgMjQ5OTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDU5YTY5NTcKKzAsICAgICAyNTExMzYsICAgICAyNTExMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NTk0ODIwNgorMCwgICAgIDI1MjI4OCwgICAgIDI1MjI4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDE4NWU4NDAwCiswLCAgICAgMjUzNDQwLCAgICAgMjUzNDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTk4ZTcwZGYKKzAsICAgICAyNTQ1OTIsICAgICAyNTQ1OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OTA1N2IyNworMCwgICAgIDI1NTc0NCwgICAgIDI1NTc0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ5ZTI2ZjIxCiswLCAgICAgMjU2ODk2LCAgICAgMjU2ODk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjA4NjdkYTUKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ODU5ODBmZgorMCwgICAgIDI1OTIwMCwgICAgIDI1OTIwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGY0Yjc3NGJlCiswLCAgICAgMjYwMzUyLCAgICAgMjYwMzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjM4OTdlOGMKKzAsICAgICAyNjE1MDQsICAgICAyNjE1MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyNDhiODlhZgorMCwgICAgIDI2MjY1NiwgICAgIDI2MjY1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGQzNjI3YzRhCiswLCAgICAgMjYzODA4LCAgICAgMjYzODA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWE0ZDkzNDkKKzAsICAgICAyNjQ5NjAsICAgICAyNjQ5NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMmNlN2M0YworMCwgICAgIDI2NjExMiwgICAgIDI2NjExMiwgICAgIDExNTIsICAgICAyMzA0LCAweDMyMWY2YzBiCiswLCAgICAgMjY3MjY0LCAgICAgMjY3MjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTFhYzc0ZTAKKzAsICAgICAyNjg0MTYsICAgICAyNjg0MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZWZhOTFiYQorMCwgICAgIDI2OTU2OCwgICAgIDI2OTU2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDhiNGI3ODRjCiswLCAgICAgMjcwNzIwLCAgICAgMjcwNzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTllNDg3OWUKKzAsICAgICAyNzE4NzIsICAgICAyNzE4NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZGMyODA4MQorMCwgICAgIDI3MzAyNCwgICAgIDI3MzAyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ0YjQ3N2IwCiswLCAgICAgMjc0MTc2LCAgICAgMjc0MTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjdiNjcwODQKKzAsICAgICAyNzUzMjgsICAgICAyNzUzMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YjE5OGMxNworMCwgICAgIDI3NjQ4MCwgICAgIDI3NjQ4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDljOTQ3MTk0CiswLCAgICAgMjc3NjMyLCAgICAgMjc3NjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmVhYTdmMTUKKzAsICAgICAyNzg3ODQsICAgICAyNzg3ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMTlmN2MxZAorMCwgICAgIDI3OTkzNiwgICAgIDI3OTkzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDE1N2I3ZjQzCiswLCAgICAgMjgxMDg4LCAgICAgMjgxMDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2QyZTdhY2MKKzAsICAgICAyODIyNDAsICAgICAyODIyNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NzU5NzI0NworMCwgICAgIDI4MzM5MiwgICAgIDI4MzM5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDdiYTA2YWNiCiswLCAgICAgMjg0NTQ0LCAgICAgMjg0NTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjMzYzc5OTUKKzAsICAgICAyODU2OTYsICAgICAyODU2OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOGUyODU4NworMCwgICAgIDI4Njg0OCwgICAgIDI4Njg0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDkyYmU4NGI1CiswLCAgICAgMjg4MDAwLCAgICAgMjg4MDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmI4NTdkNDMKKzAsICAgICAyODkxNTIsICAgICAyODkxNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNjhlN2M3NAorMCwgICAgIDI5MDMwNCwgICAgIDI5MDMwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGFjNTQ2NWQ5CiswLCAgICAgMjkxNDU2LCAgICAgMjkxNDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MThmNTg4MzEKKzAsICAgICAyOTI2MDgsICAgICAyOTI2MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOWI0ODE5NgorMCwgICAgIDI5Mzc2MCwgICAgIDI5Mzc2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDIwMjk3NjUzCiswLCAgICAgMjk0OTEyLCAgICAgMjk0OTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTMzOTdhODIKKzAsICAgICAyOTYwNjQsICAgICAyOTYwNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NWVhN2RlYgorMCwgICAgIDI5NzIxNiwgICAgIDI5NzIxNiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ3MzE2ZTIwCiswLCAgICAgMjk4MzY4LCAgICAgMjk4MzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTQxMDdmMmIKKzAsICAgICAyOTk1MjAsICAgICAyOTk1MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYzNiN2RjNgorMCwgICAgIDMwMDY3MiwgICAgIDMwMDY3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDJkMzc4M2FhCiswLCAgICAgMzAxODI0LCAgICAgMzAxODI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDdlNDczNDAKKzAsICAgICAzMDI5NzYsICAgICAzMDI5NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiYzExNzg5MworMCwgICAgIDMwNDEyOCwgICAgIDMwNDEyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDhiZDk3ODUxCiswLCAgICAgMzA1MjgwLCAgICAgMzA1MjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzI3Mzc2YTkKKzAsICAgICAzMDY0MzIsICAgICAzMDY0MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMGQ4OGM4MworMCwgICAgIDMwNzU4NCwgICAgIDMwNzU4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDE5YzI3MDRjCiswLCAgICAgMzA4NzM2LCAgICAgMzA4NzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDkzYjdiNmUKKzAsICAgICAzMDk4ODgsICAgICAzMDk4ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMjFhNzM0OQorMCwgICAgIDMxMTA0MCwgICAgIDMxMTA0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGE0ZmQ4MmNkCiswLCAgICAgMzEyMTkyLCAgICAgMzEyMTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzYyZTZiYzkKKzAsICAgICAzMTMzNDQsICAgICAzMTMzNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyNzAwNzVkNAorMCwgICAgIDMxNDQ5NiwgICAgIDMxNDQ5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGE1ZjI3YjkwCiswLCAgICAgMzE1NjQ4LCAgICAgMzE1NjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjcyZTdlZGMKKzAsICAgICAzMTY4MDAsICAgICAzMTY4MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MjE3ODQ4NgorMCwgICAgIDMxNzk1MiwgICAgIDMxNzk1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDVmNzk3OGU4CiswLCAgICAgMzE5MTA0LCAgICAgMzE5MTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWQ3YzY3MDMKKzAsICAgICAzMjAyNTYsICAgICAzMjAyNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYzQ0ODNkNQorMCwgICAgIDMyMTQwOCwgICAgIDMyMTQwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDMxYmQ5NTFkCiswLCAgICAgMzIyNTYwLCAgICAgMzIyNTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTk0ODdhZjAKKzAsICAgICAzMjM3MTIsICAgICAzMjM3MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYmQyN2VlNworMCwgICAgIDMyNDg2NCwgICAgIDMyNDg2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGMzZTA3YWM0CiswLCAgICAgMzI2MDE2LCAgICAgMzI2MDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OThhMTZiYTcKKzAsICAgICAzMjcxNjgsICAgICAzMjcxNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkN2E1NzQ3YgorMCwgICAgIDMyODMyMCwgICAgIDMyODMyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDk2ZmI4MTFjCiswLCAgICAgMzI5NDcyLCAgICAgMzI5NDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2NlZTgxMDkKKzAsICAgICAzMzA2MjQsICAgICAzMzA2MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1MmIxOGJhMgorMCwgICAgIDMzMTc3NiwgICAgIDMzMTc3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDMzYmU4ODYxCiswLCAgICAgMzMyOTI4LCAgICAgMzMyOTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjQxMjgyYTAKKzAsICAgICAzMzQwODAsICAgICAzMzQwODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNDI2ODk5MworMCwgICAgIDMzNTIzMiwgICAgIDMzNTIzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDUyMTI2YTFjCiswLCAgICAgMzM2Mzg0LCAgICAgMzM2Mzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDUwYjZmN2EKKzAsICAgICAzMzc1MzYsICAgICAzMzc1MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2N2EyNmZjMworMCwgICAgIDMzODY4OCwgICAgIDMzODY4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDk2NmM3Y2YyCiswLCAgICAgMzM5ODQwLCAgICAgMzM5ODQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjIwOTc3NTAKKzAsICAgICAzNDA5OTIsICAgICAzNDA5OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmYmIwNzk2YworMCwgICAgIDM0MjE0NCwgICAgIDM0MjE0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGJkNTA4OTY0CiswLCAgICAgMzQzMjk2LCAgICAgMzQzMjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzI0NDc4ZDgKKzAsICAgICAzNDQ0NDgsICAgICAzNDQ0NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzOTEzNzY5ZAorMCwgICAgIDM0NTYwMCwgICAgIDM0NTYwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDhhYWI4NzJmCiswLCAgICAgMzQ2NzUyLCAgICAgMzQ2NzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2NiNDgyMmYKKzAsICAgICAzNDc5MDQsICAgICAzNDc5MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYTMxODE0NAorMCwgICAgIDM0OTA1NiwgICAgIDM0OTA1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGFmMGY4NmQyCiswLCAgICAgMzUwMjA4LCAgICAgMzUwMjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjRmMjc1OTgKKzAsICAgICAzNTEzNjAsICAgICAzNTEzNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNzZmNmQ0MAorMCwgICAgIDM1MjUxMiwgICAgIDM1MjUxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDA4NTA3MWE3CiswLCAgICAgMzUzNjY0LCAgICAgMzUzNjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWQxMTcwNGMKKzAsICAgICAzNTQ4MTYsICAgICAzNTQ4MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMTUxN2NiZAorMCwgICAgIDM1NTk2OCwgICAgIDM1NTk2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGNkY2E4ZDMyCiswLCAgICAgMzU3MTIwLCAgICAgMzU3MTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzFjMTg0MzMKKzAsICAgICAzNTgyNzIsICAgICAzNTgyNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMzlkN2Q4MQorMCwgICAgIDM1OTQyNCwgICAgIDM1OTQyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDdhMGQ3YTQzCiswLCAgICAgMzYwNTc2LCAgICAgMzYwNTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDA3Yzg4ODQKKzAsICAgICAzNjE3MjgsICAgICAzNjE3MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MDMyODJkMAorMCwgICAgIDM2Mjg4MCwgICAgIDM2Mjg4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGUzNzM3MjE0CiswLCAgICAgMzY0MDMyLCAgICAgMzY0MDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWY5MDZmNDcKKzAsICAgICAzNjUxODQsICAgICAzNjUxODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NGY1N2IzYgorMCwgICAgIDM2NjMzNiwgICAgIDM2NjMzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDI5YmU3NzkxCiswLCAgICAgMzY3NDg4LCAgICAgMzY3NDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTNjNjYzZDUKKzAsICAgICAzNjg2NDAsICAgICAzNjg2NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNzI1ODIzOAorMCwgICAgIDM2OTc5MiwgICAgIDM2OTc5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDM3MTk4MjBkCiswLCAgICAgMzcwOTQ0LCAgICAgMzcwOTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmUwNDgxNGYKKzAsICAgICAzNzIwOTYsICAgICAzNzIwOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NTZjODE1ZQorMCwgICAgIDM3MzI0OCwgICAgIDM3MzI0OCwgICAgIDExNTIsICAgICAyMzA0LCAweGIyNDQ3ZTEwCiswLCAgICAgMzc0NDAwLCAgICAgMzc0NDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2MxNjg2N2MKKzAsICAgICAzNzU1NTIsICAgICAzNzU1NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2YTdiNzhlZAorMCwgICAgIDM3NjcwNCwgICAgIDM3NjcwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDVkMzA3YjgxCiswLCAgICAgMzc3ODU2LCAgICAgMzc3ODU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWFiNjgwZDMKKzAsICAgICAzNzkwMDgsICAgICAzNzkwMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNWQzN2EyMworMCwgICAgIDM4MDE2MCwgICAgIDM4MDE2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDdmN2Q2Zjc2CiswLCAgICAgMzgxMzEyLCAgICAgMzgxMzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzE3YTgyOTYKKzAsICAgICAzODI0NjQsICAgICAzODI0NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4YTk4N2IzZAorMCwgICAgIDM4MzYxNiwgICAgIDM4MzYxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDRmMzE3YTI3CiswLCAgICAgMzg0NzY4LCAgICAgMzg0NzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmM2NTg1MmYKKzAsICAgICAzODU5MjAsICAgICAzODU5MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MDUyNzcxOQorMCwgICAgIDM4NzA3MiwgICAgIDM4NzA3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDg0OTg4ZTEzCiswLCAgICAgMzg4MjI0LCAgICAgMzg4MjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzE4YjZkZGMKKzAsICAgICAzODkzNzYsICAgICAzODkzNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NGNmNzkzOQorMCwgICAgIDM5MDUyOCwgICAgIDM5MDUyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDZmMjI4MTlkCiswLCAgICAgMzkxNjgwLCAgICAgMzkxNjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTdkZDgwYTkKKzAsICAgICAzOTI4MzIsICAgICAzOTI4MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxYzc5NjhmYQorMCwgICAgIDM5Mzk4NCwgICAgIDM5Mzk4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ5OTM3YmFlCiswLCAgICAgMzk1MTM2LCAgICAgMzk1MTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjcxMzdjZjkKKzAsICAgICAzOTYyODgsICAgICAzOTYyODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYWRiODRiNQorMCwgICAgIDM5NzQ0MCwgICAgIDM5NzQ0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDlhMjM5MGFjCiswLCAgICAgMzk4NTkyLCAgICAgMzk4NTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGI2YTczZjYKKzAsICAgICAzOTk3NDQsICAgICAzOTk3NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OWUwNzUwNworMCwgICAgIDQwMDg5NiwgICAgIDQwMDg5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGJjODQ3OGIyCiswLCAgICAgNDAyMDQ4LCAgICAgNDAyMDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzJjZjg2MzgKKzAsICAgICA0MDMyMDAsICAgICA0MDMyMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYjhkNzU1YQorMCwgICAgIDQwNDM1MiwgICAgIDQwNDM1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDUyZTA1YmQyCiswLCAgICAgNDA1NTA0LCAgICAgNDA1NTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmFlZDhjNDkKKzAsICAgICA0MDY2NTYsICAgICA0MDY2NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ODdhODk2ZQorMCwgICAgIDQwNzgwOCwgICAgIDQwNzgwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDZkZDg3ZGVlCiswLCAgICAgNDA4OTYwLCAgICAgNDA4OTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDI4NTgzMzgKKzAsICAgICA0MTAxMTIsICAgICA0MTAxMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkOTBmNzg0MgorMCwgICAgIDQxMTI2NCwgICAgIDQxMTI2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ2ZmI2ZDRhCiswLCAgICAgNDEyNDE2LCAgICAgNDEyNDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODU0OThhZWEKKzAsICAgICA0MTM1NjgsICAgICA0MTM1NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxODU5Nzc5MAorMCwgICAgIDQxNDcyMCwgICAgIDQxNDcyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDNjZDc4ZmVhCiswLCAgICAgNDE1ODcyLCAgICAgNDE1ODcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTQzNzdmYmMKKzAsICAgICA0MTcwMjQsICAgICA0MTcwMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmOWRiNzNmNQorMCwgICAgIDQxODE3NiwgICAgIDQxODE3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDE0ZmI2ZmNhCiswLCAgICAgNDE5MzI4LCAgICAgNDE5MzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTlkMTdkNjkKKzAsICAgICA0MjA0ODAsICAgICA0MjA0ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZWI1NzI4NgorMCwgICAgIDQyMTYzMiwgICAgIDQyMTYzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGE1ZDM3ZTE3CiswLCAgICAgNDIyNzg0LCAgICAgNDIyNzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2Y2ODgyZmIKKzAsICAgICA0MjM5MzYsICAgICA0MjM5MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMTc1ODA2NgorMCwgICAgIDQyNTA4OCwgICAgIDQyNTA4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDZiNGQ4MTc1CiswLCAgICAgNDI2MjQwLCAgICAgNDI2MjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmEzZDdmOGUKKzAsICAgICA0MjczOTIsICAgICA0MjczOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjMDY2NzQzYgorMCwgICAgIDQyODU0NCwgICAgIDQyODU0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGNhYjg4MTQ2CiswLCAgICAgNDI5Njk2LCAgICAgNDI5Njk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmI0YzZlMTMKKzAsICAgICA0MzA4NDgsICAgICA0MzA4NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMGIzNmI2ZgorMCwgICAgIDQzMjAwMCwgICAgIDQzMjAwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDY2NGE4OGQzCiswLCAgICAgNDMzMTUyLCAgICAgNDMzMTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MThhNjZmNzYKKzAsICAgICA0MzQzMDQsICAgICA0MzQzMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZjgyOGE4YgorMCwgICAgIDQzNTQ1NiwgICAgIDQzNTQ1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDljYzc3MjhlCiswLCAgICAgNDM2NjA4LCAgICAgNDM2NjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmUzNTc5MzYKKzAsICAgICA0Mzc3NjAsICAgICA0Mzc3NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOTg3OGY4ZAorMCwgICAgIDQzODkxMiwgICAgIDQzODkxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDIyN2I3YzcxCiswLCAgICAgNDQwMDY0LCAgICAgNDQwMDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjdjODc5ZWMKKzAsICAgICA0NDEyMTYsICAgICA0NDEyMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYmNhN2I1MAorMCwgICAgIDQ0MjM2OCwgICAgIDQ0MjM2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGU0Mzk4MzA0CiswLCAgICAgNDQzNTIwLCAgICAgNDQzNTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjVkYTc1YzcKKzAsICAgICA0NDQ2NzIsICAgICA0NDQ2NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ZjkwNzBhMworMCwgICAgIDQ0NTgyNCwgICAgIDQ0NTgyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDc4OTA3NmY2CiswLCAgICAgNDQ2OTc2LCAgICAgNDQ2OTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzYyOTc3Y2MKKzAsICAgICA0NDgxMjgsICAgICA0NDgxMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZDBhODkyOAorMCwgICAgIDQ0OTI4MCwgICAgIDQ0OTI4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDFiYjc2N2VjCiswLCAgICAgNDUwNDMyLCAgICAgNDUwNDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmU3MjdmYTUKKzAsICAgICA0NTE1ODQsICAgICA0NTE1ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyN2YzODM0NworMCwgICAgIDQ1MjczNiwgICAgIDQ1MjczNiwgICAgIDExNTIsICAgICAyMzA0LCAweDBhM2M4NzgzCiswLCAgICAgNDUzODg4LCAgICAgNDUzODg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODI0OTYzOWMKKzAsICAgICA0NTUwNDAsICAgICA0NTUwNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzYjA3NmY2OQorMCwgICAgIDQ1NjE5MiwgICAgIDQ1NjE5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ5NTk3ZWUzCiswLCAgICAgNDU3MzQ0LCAgICAgNDU3MzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDI2ZTdmYWQKKzAsICAgICA0NTg0OTYsICAgICA0NTg0OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiZDdhNmRlNAorMCwgICAgIDQ1OTY0OCwgICAgIDQ1OTY0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDdkNzE4YTRkCiswLCAgICAgNDYwODAwLCAgICAgNDYwODAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWY1ZTgzYjQKKzAsICAgICA0NjE5NTIsICAgICA0NjE5NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1OTdkNzc1NQorMCwgICAgIDQ2MzEwNCwgICAgIDQ2MzEwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDNmYjA4MGJkCiswLCAgICAgNDY0MjU2LCAgICAgNDY0MjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGNiZDdiMTYKKzAsICAgICA0NjU0MDgsICAgICA0NjU0MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YzQ4ODY1ZgorMCwgICAgIDQ2NjU2MCwgICAgIDQ2NjU2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGNkYTM3YWU4CiswLCAgICAgNDY3NzEyLCAgICAgNDY3NzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDgxMDc5NmQKKzAsICAgICA0Njg4NjQsICAgICA0Njg4NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzNDMxN2ZkMAorMCwgICAgIDQ3MDAxNiwgICAgIDQ3MDAxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDVjMGU3NDU2CiswLCAgICAgNDcxMTY4LCAgICAgNDcxMTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDRkNzgwNDAKKzAsICAgICA0NzIzMjAsICAgICA0NzIzMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ODU4Nzg4MgorMCwgICAgIDQ3MzQ3MiwgICAgIDQ3MzQ3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDc3Njg3ZDVlCiswLCAgICAgNDc0NjI0LCAgICAgNDc0NjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTE2ZDY4YmIKKzAsICAgICA0NzU3NzYsICAgICA0NzU3NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZTViNmY2MAorMCwgICAgIDQ3NjkyOCwgICAgIDQ3NjkyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDY0ZWE3ODNjCiswLCAgICAgNDc4MDgwLCAgICAgNDc4MDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjM1NDdmN2QKKzAsICAgICA0NzkyMzIsICAgICA0NzkyMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyZWVlNzg5MgorMCwgICAgIDQ4MDM4NCwgICAgIDQ4MDM4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGZiODM3Y2JhCiswLCAgICAgNDgxNTM2LCAgICAgNDgxNTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODY1MTgyMDkKKzAsICAgICA0ODI2ODgsICAgICA0ODI2ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NzJmN2JiYQorMCwgICAgIDQ4Mzg0MCwgICAgIDQ4Mzg0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDZhYjU4M2ZiCiswLCAgICAgNDg0OTkyLCAgICAgNDg0OTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzEyOTc0MjgKKzAsICAgICA0ODYxNDQsICAgICA0ODYxNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNjRlNzcxNworMCwgICAgIDQ4NzI5NiwgICAgIDQ4NzI5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGI3NTQ5NzZkCiswLCAgICAgNDg4NDQ4LCAgICAgNDg4NDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Yjk5ZDgxYjIKKzAsICAgICA0ODk2MDAsICAgICA0ODk2MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3OTA0NmZkNgorMCwgICAgIDQ5MDc1MiwgICAgIDQ5MDc1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDlhM2Y4NDI2CiswLCAgICAgNDkxOTA0LCAgICAgNDkxOTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODk2MzcxZjUKKzAsICAgICA0OTMwNTYsICAgICA0OTMwNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2M2QxNzk5ZgorMCwgICAgIDQ5NDIwOCwgICAgIDQ5NDIwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ4NDI4NDRlCiswLCAgICAgNDk1MzYwLCAgICAgNDk1MzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODUwZTgzNzIKKzAsICAgICA0OTY1MTIsICAgICA0OTY1MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NWQwNzAyMgorMCwgICAgIDQ5NzY2NCwgICAgIDQ5NzY2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDllNjY4M2QxCiswLCAgICAgNDk4ODE2LCAgICAgNDk4ODE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzAxYjg5ODEKKzAsICAgICA0OTk5NjgsICAgICA0OTk5NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxZjFlOThjNQorMCwgICAgIDUwMTEyMCwgICAgIDUwMTEyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGM4Nzk3YjAzCiswLCAgICAgNTAyMjcyLCAgICAgNTAyMjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjlkMTg5ZjUKKzAsICAgICA1MDM0MjQsICAgICA1MDM0MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZTBkODhiZQorMCwgICAgIDUwNDU3NiwgICAgIDUwNDU3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDZjMWQ3ODQzCiswLCAgICAgNTA1NzI4LCAgICAgNTA1NzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDEzYjhhMzgKKzAsICAgICA1MDY4ODAsICAgICA1MDY4ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YjhmNzczYworMCwgICAgIDUwODAzMiwgICAgIDUwODAzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDlhY2Q3MzA5CiswLCAgICAgNTA5MTg0LCAgICAgNTA5MTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWU3ZDdkMTUKKzAsICAgICA1MTAzMzYsICAgICA1MTAzMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMDlkNzY0MAorMCwgICAgIDUxMTQ4OCwgICAgIDUxMTQ4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGFlYmI3MThmCiswLCAgICAgNTEyNjQwLCAgICAgNTEyNjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGM4NTcwZjQKKzAsICAgICA1MTM3OTIsICAgICA1MTM3OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzYzkzODYyYworMCwgICAgIDUxNDk0NCwgICAgIDUxNDk0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGNlZTQ2Njk2CiswLCAgICAgNTE2MDk2LCAgICAgNTE2MDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDFiYTdlMjAKKzAsICAgICA1MTcyNDgsICAgICA1MTcyNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ZmNiN2EwOQorMCwgICAgIDUxODQwMCwgICAgIDUxODQwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGRkZjE4YzE0CiswLCAgICAgNTE5NTUyLCAgICAgNTE5NTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDJlOTdlZWIKKzAsICAgICA1MjA3MDQsICAgICA1MjA3MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1MTRkODcxOQorMCwgICAgIDUyMTg1NiwgICAgIDUyMTg1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGU4OTI3OWM5CiswLCAgICAgNTIzMDA4LCAgICAgNTIzMDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODA2ZDZhOTUKKzAsICAgICA1MjQxNjAsICAgICA1MjQxNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiYzdhOGE2MAorMCwgICAgIDUyNTMxMiwgICAgIDUyNTMxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDMwMmY4ZmE4CiswLCAgICAgNTI2NDY0LCAgICAgNTI2NDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjEzNjc4NGMKKzAsICAgICA1Mjc2MTYsICAgICA1Mjc2MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YjBmNmFhYgorMCwgICAgIDUyODc2OCwgICAgIDUyODc2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ4ZTI3NTgyCiswLCAgICAgNTI5OTIwLCAgICAgNTI5OTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGFhZjc4YjEKKzAsICAgICA1MzEwNzIsICAgICA1MzEwNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NTk2N2Y1ZgorMCwgICAgIDUzMjIyNCwgICAgIDUzMjIyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDZmOTE3YWE0CiswLCAgICAgNTMzMzc2LCAgICAgNTMzMzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2Y2MDc0NDQKKzAsICAgICA1MzQ1MjgsICAgICA1MzQ1MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmZDMxNmYyYworMCwgICAgIDUzNTY4MCwgICAgIDUzNTY4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDc3NmU4M2M3CiswLCAgICAgNTM2ODMyLCAgICAgNTM2ODMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjljMTdlMTYKKzAsICAgICA1Mzc5ODQsICAgICA1Mzc5ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZjI4N2RlOAorMCwgICAgIDUzOTEzNiwgICAgIDUzOTEzNiwgICAgIDExNTIsICAgICAyMzA0LCAweGYzM2Q5NmEzCiswLCAgICAgNTQwMjg4LCAgICAgNTQwMjg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWQyMTZlNWIKKzAsICAgICA1NDE0NDAsICAgICA1NDE0NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YTMyODM0MgorMCwgICAgIDU0MjU5MiwgICAgIDU0MjU5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGNmM2Y4MDc5CiswLCAgICAgNTQzNzQ0LCAgICAgNTQzNzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjQ2Zjc3YjAKKzAsICAgICA1NDQ4OTYsICAgICA1NDQ4OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMTk5NzEzZAorMCwgICAgIDU0NjA0OCwgICAgIDU0NjA0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDVlNjY3YTBkCiswLCAgICAgNTQ3MjAwLCAgICAgNTQ3MjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTMwNDdhZTMKKzAsICAgICA1NDgzNTIsICAgICA1NDgzNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ZWRmODU5NAorMCwgICAgIDU0OTUwNCwgICAgIDU0OTUwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGQxNjM4MmQ1CiswLCAgICAgNTUwNjU2LCAgICAgNTUwNjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmU4MzgzMjgKKzAsICAgICA1NTE4MDgsICAgICA1NTE4MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMWY2OTdjMQorMCwgICAgIDU1Mjk2MCwgICAgIDU1Mjk2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGVmY2M3NDljCiswLCAgICAgNTU0MTEyLCAgICAgNTU0MTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWY5NDgzOWUKKzAsICAgICA1NTUyNjQsICAgICA1NTUyNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MjllN2M1YgorMCwgICAgIDU1NjQxNiwgICAgIDU1NjQxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDliNTk3MTFjCiswLCAgICAgNTU3NTY4LCAgICAgNTU3NTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGFjMjczMjMKKzAsICAgICA1NTg3MjAsICAgICA1NTg3MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhNDg1NmQyYgorMCwgICAgIDU1OTg3MiwgICAgIDU1OTg3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDA3YTM3NDk4CiswLCAgICAgNTYxMDI0LCAgICAgNTYxMDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTFjZTc1MTIKKzAsICAgICA1NjIxNzYsICAgICA1NjIxNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNWUxODJjMworMCwgICAgIDU2MzMyOCwgICAgIDU2MzMyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDBmYTQ2YjhjCiswLCAgICAgNTY0NDgwLCAgICAgNTY0NDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmRmMDdiZmQKKzAsICAgICA1NjU2MzIsICAgICA1NjU2MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMDIzOGIyYQorMCwgICAgIDU2Njc4NCwgICAgIDU2Njc4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGFiNTM3MjY3CiswLCAgICAgNTY3OTM2LCAgICAgNTY3OTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDQ2Yjc1ZjMKKzAsICAgICA1NjkwODgsICAgICA1NjkwODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYzczNzk0YgorMCwgICAgIDU3MDI0MCwgICAgIDU3MDI0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDY4MDU4MGMxCiswLCAgICAgNTcxMzkyLCAgICAgNTcxMzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWFjZThmNmMKKzAsICAgICA1NzI1NDQsICAgICA1NzI1NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOWQ1ODNhYworMCwgICAgIDU3MzY5NiwgICAgIDU3MzY5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDRiNmI4MTA1CiswLCAgICAgNTc0ODQ4LCAgICAgNTc0ODQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzkyYTc4YjIKKzAsICAgICA1NzYwMDAsICAgICA1NzYwMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMzkxNmRhZAorMCwgICAgIDU3NzE1MiwgICAgIDU3NzE1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDU2OWM3YTc1CiswLCAgICAgNTc4MzA0LCAgICAgNTc4MzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjVhYzgxNGIKKzAsICAgICA1Nzk0NTYsICAgICA1Nzk0NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOGQ3N2U5OAorMCwgICAgIDU4MDYwOCwgICAgIDU4MDYwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDAwNzA3NGNlCiswLCAgICAgNTgxNzYwLCAgICAgNTgxNzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGZlMzgzNzMKKzAsICAgICA1ODI5MTIsICAgICA1ODI5MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YTk2NzkyMAorMCwgICAgIDU4NDA2NCwgICAgIDU4NDA2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDIyMTY3NTAxCiswLCAgICAgNTg1MjE2LCAgICAgNTg1MjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjA4MjhjYWIKKzAsICAgICA1ODYzNjgsICAgICA1ODYzNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhZWVjNzFiNworMCwgICAgIDU4NzUyMCwgICAgIDU4NzUyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGM0N2I2MmZmCiswLCAgICAgNTg4NjcyLCAgICAgNTg4NjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWI2ODg0NzgKKzAsICAgICA1ODk4MjQsICAgICA1ODk4MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMzVlN2JkMgorMCwgICAgIDU5MDk3NiwgICAgIDU5MDk3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDljZmY3NjNlCiswLCAgICAgNTkyMTI4LCAgICAgNTkyMTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTk1NjhkYzgKKzAsICAgICA1OTMyODAsICAgICA1OTMyODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1MWEyNzhhYworMCwgICAgIDU5NDQzMiwgICAgIDU5NDQzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGMwOGE2ZTY4CiswLCAgICAgNTk1NTg0LCAgICAgNTk1NTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDMwNjdlZjQKKzAsICAgICA1OTY3MzYsICAgICA1OTY3MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NDc2N2M0OQorMCwgICAgIDU5Nzg4OCwgICAgIDU5Nzg4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGY4ZmY4Mzg2CiswLCAgICAgNTk5MDQwLCAgICAgNTk5MDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWYyNjdmNjMKKzAsICAgICA2MDAxOTIsICAgICA2MDAxOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMjUzN2NkOQorMCwgICAgIDYwMTM0NCwgICAgIDYwMTM0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDc3YTU3NjgwCiswLCAgICAgNjAyNDk2LCAgICAgNjAyNDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzI1Yzc0YWQKKzAsICAgICA2MDM2NDgsICAgICA2MDM2NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkN2ZlODdjNAorMCwgICAgIDYwNDgwMCwgICAgIDYwNDgwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDJlNzU2MzEwCiswLCAgICAgNjA1OTUyLCAgICAgNjA1OTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmE4MTc5NmIKKzAsICAgICA2MDcxMDQsICAgICA2MDcxMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyZjA1N2RhZgorMCwgICAgIDYwODI1NiwgICAgIDYwODI1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGNkOWY3YzlkCiswLCAgICAgNjA5NDA4LCAgICAgNjA5NDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzkxNTYwYTAKKzAsICAgICA2MTA1NjAsICAgICA2MTA1NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NjJhOTFlYgorMCwgICAgIDYxMTcxMiwgICAgIDYxMTcxMiwgICAgIDExNTIsICAgICAyMzA0LCAweGEwZmY3NDE2CiswLCAgICAgNjEyODY0LCAgICAgNjEyODY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2I1YzdkZmYKKzAsICAgICA2MTQwMTYsICAgICA2MTQwMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMzUyNzA0MQorMCwgICAgIDYxNTE2OCwgICAgIDYxNTE2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGM4OWQ3N2MyCiswLCAgICAgNjE2MzIwLCAgICAgNjE2MzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTFjZTdjY2YKKzAsICAgICA2MTc0NzIsICAgICA2MTc0NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMzQxN2M0YworMCwgICAgIDYxODYyNCwgICAgIDYxODYyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDNmMWE3MTY2CiswLCAgICAgNjE5Nzc2LCAgICAgNjE5Nzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2RjYzdlMjMKKzAsICAgICA2MjA5MjgsICAgICA2MjA5MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZTcyN2U5NworMCwgICAgIDYyMjA4MCwgICAgIDYyMjA4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDUzNDI3ZmYxCiswLCAgICAgNjIzMjMyLCAgICAgNjIzMjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTczZjZjYTkKKzAsICAgICA2MjQzODQsICAgICA2MjQzODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NjI4ODdlYworMCwgICAgIDYyNTUzNiwgICAgIDYyNTUzNiwgICAgIDExNTIsICAgICAyMzA0LCAweGNiZWM2N2Y0CiswLCAgICAgNjI2Njg4LCAgICAgNjI2Njg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2EyYzk0M2QKKzAsICAgICA2Mjc4NDAsICAgICA2Mjc4NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4Yjg3NzU3MAorMCwgICAgIDYyODk5MiwgICAgIDYyODk5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGNmMzM3MzIzCiswLCAgICAgNjMwMTQ0LCAgICAgNjMwMTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGM4NjgyYTQKKzAsICAgICA2MzEyOTYsICAgICA2MzEyOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NGMzNzUzYworMCwgICAgIDYzMjQ0OCwgICAgIDYzMjQ0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDg2ODk4ZDc5CiswLCAgICAgNjMzNjAwLCAgICAgNjMzNjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGY2NjczMTIKKzAsICAgICA2MzQ3NTIsICAgICA2MzQ3NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNjJmOGJhOAorMCwgICAgIDYzNTkwNCwgICAgIDYzNTkwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGEyYzM2ZjA4CiswLCAgICAgNjM3MDU2LCAgICAgNjM3MDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWJjYTczNTgKKzAsICAgICA2MzgyMDgsICAgICA2MzgyMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NjQ4ODA0ZAorMCwgICAgIDYzOTM2MCwgICAgIDYzOTM2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGVmYWM4N2M4CiswLCAgICAgNjQwNTEyLCAgICAgNjQwNTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjZiZjdkY2YKKzAsICAgICA2NDE2NjQsICAgICA2NDE2NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2MmFkNzNiYworMCwgICAgIDY0MjgxNiwgICAgIDY0MjgxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDcyZmU2MzBjCiswLCAgICAgNjQzOTY4LCAgICAgNjQzOTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWViZTg3ZGEKKzAsICAgICA2NDUxMjAsICAgICA2NDUxMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMWM4NzBjZgorMCwgICAgIDY0NjI3MiwgICAgIDY0NjI3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDE4ZmI3YzI3CiswLCAgICAgNjQ3NDI0LCAgICAgNjQ3NDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzkwNDcxNDUKKzAsICAgICA2NDg1NzYsICAgICA2NDg1NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkY2YwNzAzMgorMCwgICAgIDY0OTcyOCwgICAgIDY0OTcyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDYxMDI3YzUwCiswLCAgICAgNjUwODgwLCAgICAgNjUwODgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmUyZTg5ZGUKKzAsICAgICA2NTIwMzIsICAgICA2NTIwMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNTBjNmQxZAorMCwgICAgIDY1MzE4NCwgICAgIDY1MzE4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGVlZDU4N2VlCiswLCAgICAgNjU0MzM2LCAgICAgNjU0MzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTM4MjY5YzcKKzAsICAgICA2NTU0ODgsICAgICA2NTU0ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZjY2ODA2ZQorMCwgICAgIDY1NjY0MCwgICAgIDY1NjY0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDJkM2I3YzFiCiswLCAgICAgNjU3NzkyLCAgICAgNjU3NzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTQxMjdkNDgKKzAsICAgICA2NTg5NDQsICAgICA2NTg5NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ODBiODMyNQorMCwgICAgIDY2MDA5NiwgICAgIDY2MDA5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGMxNTI3MjIxCiswLCAgICAgNjYxMjQ4LCAgICAgNjYxMjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTRjMTc2OWEKKzAsICAgICA2NjI0MDAsICAgICA2NjI0MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZmIzNzI3MQorMCwgICAgIDY2MzU1MiwgICAgIDY2MzU1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDk0NmQ3YTk2CiswLCAgICAgNjY0NzA0LCAgICAgNjY0NzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGZjMThlNTAKKzAsICAgICA2NjU4NTYsICAgICA2NjU4NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMGM0ODM5MworMCwgICAgIDY2NzAwOCwgICAgIDY2NzAwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDU4NTU2YjEwCiswLCAgICAgNjY4MTYwLCAgICAgNjY4MTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTk3Yjc5OTMKKzAsICAgICA2NjkzMTIsICAgICA2NjkzMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YTc4Nzk5MgorMCwgICAgIDY3MDQ2NCwgICAgIDY3MDQ2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDExNDA2YzIwCiswLCAgICAgNjcxNjE2LCAgICAgNjcxNjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDRhNDg3NGEKKzAsICAgICA2NzI3NjgsICAgICA2NzI3NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMzA3NzE2NAorMCwgICAgIDY3MzkyMCwgICAgIDY3MzkyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDA4YWM4MGUzCiswLCAgICAgNjc1MDcyLCAgICAgNjc1MDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjY4MzcwZDAKKzAsICAgICA2NzYyMjQsICAgICA2NzYyMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxZDEzNzc3OAorMCwgICAgIDY3NzM3NiwgICAgIDY3NzM3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGZhMTQ4ZTk3CiswLCAgICAgNjc4NTI4LCAgICAgNjc4NTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWM1MDcxN2MKKzAsICAgICA2Nzk2ODAsICAgICA2Nzk2ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjYmY0NmI3NQorMCwgICAgIDY4MDgzMiwgICAgIDY4MDgzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ0MTY4MDM4CiswLCAgICAgNjgxOTg0LCAgICAgNjgxOTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGQ5NTc3ZjAKKzAsICAgICA2ODMxMzYsICAgICA2ODMxMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNzA3NzY4NQorMCwgICAgIDY4NDI4OCwgICAgIDY4NDI4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDM0ZDI1ZTkxCiswLCAgICAgNjg1NDQwLCAgICAgNjg1NDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTY1MzdlNmQKKzAsICAgICA2ODY1OTIsICAgICA2ODY1OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiMTJlNzk0MAorMCwgICAgIDY4Nzc0NCwgICAgIDY4Nzc0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDg2MWQ2NGMwCiswLCAgICAgNjg4ODk2LCAgICAgNjg4ODk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTJiYzY0ZWQKKzAsICAgICA2OTAwNDgsICAgICA2OTAwNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYzVmODI2MQorMCwgICAgIDY5MTIwMCwgICAgIDY5MTIwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDU0MDU4NGZmCiswLCAgICAgNjkyMzUyLCAgICAgNjkyMzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTgzMjhiMDkKKzAsICAgICA2OTM1MDQsICAgICA2OTM1MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxZTc3NzA3OQorMCwgICAgIDY5NDY1NiwgICAgIDY5NDY1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDQ1MzQ4M2I0CiswLCAgICAgNjk1ODA4LCAgICAgNjk1ODA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWNhYjdhMWUKKzAsICAgICA2OTY5NjAsICAgICA2OTY5NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjYjM3ODU2ZAorMCwgICAgIDY5ODExMiwgICAgIDY5ODExMiwgICAgIDExNTIsICAgICAyMzA0LCAweDVhNDg4M2VkCiswLCAgICAgNjk5MjY0LCAgICAgNjk5MjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDFmMjdjYmYKKzAsICAgICA3MDA0MTYsICAgICA3MDA0MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZDM3N2E0ZAorMCwgICAgIDcwMTU2OCwgICAgIDcwMTU2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDI2NGU3NmRmCiswLCAgICAgNzAyNzIwLCAgICAgNzAyNzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmE2ODc3MWUKKzAsICAgICA3MDM4NzIsICAgICA3MDM4NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjYjMxN2EzMQorMCwgICAgIDcwNTAyNCwgICAgIDcwNTAyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGZjNWQ3YTI3CiswLCAgICAgNzA2MTc2LCAgICAgNzA2MTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmUwNjdkOTYKKzAsICAgICA3MDczMjgsICAgICA3MDczMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYzUzODU2MAorMCwgICAgIDcwODQ4MCwgICAgIDcwODQ4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGZiYWQ3MTdhCiswLCAgICAgNzA5NjMyLCAgICAgNzA5NjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjlmYzc2MDgKKzAsICAgICA3MTA3ODQsICAgICA3MTA3ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiMTgxN2M4ZgorMCwgICAgIDcxMTkzNiwgICAgIDcxMTkzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDU3YzM3ZjgyCiswLCAgICAgNzEzMDg4LCAgICAgNzEzMDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGNhYzgzNTYKKzAsICAgICA3MTQyNDAsICAgICA3MTQyNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NzEwODE4NgorMCwgICAgIDcxNTM5MiwgICAgIDcxNTM5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDA5NWQ4MWJiCiswLCAgICAgNzE2NTQ0LCAgICAgNzE2NTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDc1ZjZiMmIKKzAsICAgICA3MTc2OTYsICAgICA3MTc2OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZjdjOGNjNQorMCwgICAgIDcxODg0OCwgICAgIDcxODg0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDk3OWM3N2JlCiswLCAgICAgNzIwMDAwLCAgICAgNzIwMDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTZhNzg0NGIKKzAsICAgICA3MjExNTIsICAgICA3MjExNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ZWU0NmIyMQorMCwgICAgIDcyMjMwNCwgICAgIDcyMjMwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDA1YjY3MjIwCiswLCAgICAgNzIzNDU2LCAgICAgNzIzNDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjU3ODcyNTIKKzAsICAgICA3MjQ2MDgsICAgICA3MjQ2MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4YWQyNzhhZAorMCwgICAgIDcyNTc2MCwgICAgIDcyNTc2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDY3YmQ3MjJlCiswLCAgICAgNzI2OTEyLCAgICAgNzI2OTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjA0Zjc3YmUKKzAsICAgICA3MjgwNjQsICAgICA3MjgwNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MmQyN2FlMgorMCwgICAgIDcyOTIxNiwgICAgIDcyOTIxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDIzZmE4MmU0CiswLCAgICAgNzMwMzY4LCAgICAgNzMwMzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTljZjgxNTkKKzAsICAgICA3MzE1MjAsICAgICA3MzE1MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxM2YwODc0OQorMCwgICAgIDczMjY3MiwgICAgIDczMjY3MiwgICAgIDExNTIsICAgICAyMzA0LCAweGY4NGY3MWI1CiswLCAgICAgNzMzODI0LCAgICAgNzMzODI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWNiNzc3YzgKKzAsICAgICA3MzQ5NzYsICAgICA3MzQ5NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMTIzNjcyMgorMCwgICAgIDczNjEyOCwgICAgIDczNjEyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDEwMTk3Y2FjCiswLCAgICAgNzM3MjgwLCAgICAgNzM3MjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmQ0MTdlNjUKKzAsICAgICA3Mzg0MzIsICAgICA3Mzg0MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YTFjN2QwNQorMCwgICAgIDczOTU4NCwgICAgIDczOTU4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDRjM2E4NWRlCiswLCAgICAgNzQwNzM2LCAgICAgNzQwNzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDM4MTZlYjcKKzAsICAgICA3NDE4ODgsICAgICA3NDE4ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MDE4NmU2YworMCwgICAgIDc0MzA0MCwgICAgIDc0MzA0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDVjMDk3OTI4CiswLCAgICAgNzQ0MTkyLCAgICAgNzQ0MTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTRhYTgyM2QKKzAsICAgICA3NDUzNDQsICAgICA3NDUzNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMWMyN2YwNAorMCwgICAgIDc0NjQ5NiwgICAgIDc0NjQ5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDZkZGI3NGE5CiswLCAgICAgNzQ3NjQ4LCAgICAgNzQ3NjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWVhNjc5MDEKKzAsICAgICA3NDg4MDAsICAgICA3NDg4MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNzEwNzQyZAorMCwgICAgIDc0OTk1MiwgICAgIDc0OTk1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGY4YzI3YWRkCiswLCAgICAgNzUxMTA0LCAgICAgNzUxMTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjE3MTcwMTEKKzAsICAgICA3NTIyNTYsICAgICA3NTIyNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNTkwNzJkMAorMCwgICAgIDc1MzQwOCwgICAgIDc1MzQwOCwgICAgIDExNTIsICAgICAyMzA0LCAweGM4ZGM4NGE3CiswLCAgICAgNzU0NTYwLCAgICAgNzU0NTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzMxMTY3MzcKKzAsICAgICA3NTU3MTIsICAgICA3NTU3MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NjIxNmJkZAorMCwgICAgIDc1Njg2NCwgICAgIDc1Njg2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGEyZjg3ODY2CiswLCAgICAgNzU4MDE2LCAgICAgNzU4MDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWQ3Nzc3MWUKKzAsICAgICA3NTkxNjgsICAgICA3NTkxNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ZDhjNzdmZAorMCwgICAgIDc2MDMyMCwgICAgIDc2MDMyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDIzY2M4OWNiCiswLCAgICAgNzYxNDcyLCAgICAgNzYxNDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzM0ZTc0MDcKKzAsICAgICA3NjI2MjQsICAgICA3NjI2MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMWM5NzZmZgorMCwgICAgIDc2Mzc3NiwgICAgIDc2Mzc3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDNhM2I3YjE1CiswLCAgICAgNzY0OTI4LCAgICAgNzY0OTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmE0MjdkZTkKKzAsICAgICA3NjYwODAsICAgICA3NjYwODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiZWFhN2M5MQorMCwgICAgIDc2NzIzMiwgICAgIDc2NzIzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ2OTg4YjMxCiswLCAgICAgNzY4Mzg0LCAgICAgNzY4Mzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGRiNDdmODAKKzAsICAgICA3Njk1MzYsICAgICA3Njk1MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYTY4N2Q5ZQorMCwgICAgIDc3MDY4OCwgICAgIDc3MDY4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDFhNjI4MWNlCiswLCAgICAgNzcxODQwLCAgICAgNzcxODQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTE5NTgwMDMKKzAsICAgICA3NzI5OTIsICAgICA3NzI5OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNGFlN2M1ZQorMCwgICAgIDc3NDE0NCwgICAgIDc3NDE0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDI4ODI3YzhhCiswLCAgICAgNzc1Mjk2LCAgICAgNzc1Mjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWZiODhiMjUKKzAsICAgICA3NzY0NDgsICAgICA3NzY0NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ODhkNzFlOAorMCwgICAgIDc3NzYwMCwgICAgIDc3NzYwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDY4MjI3YzM0CiswLCAgICAgNzc4NzUyLCAgICAgNzc4NzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWU0ZDczZTgKKzAsICAgICA3Nzk5MDQsICAgICA3Nzk5MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OTI4N2M2ZAorMCwgICAgIDc4MTA1NiwgICAgIDc4MTA1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGJiMDQ5MjZhCiswLCAgICAgNzgyMjA4LCAgICAgNzgyMjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODk0NTZjZWMKKzAsICAgICA3ODMzNjAsICAgICA3ODMzNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhYmUxODk5MgorMCwgICAgIDc4NDUxMiwgICAgIDc4NDUxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDUwY2M3ZjZjCiswLCAgICAgNzg1NjY0LCAgICAgNzg1NjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmQ3MjcwYmUKKzAsICAgICA3ODY4MTYsICAgICA3ODY4MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NjRjNmZlZgorMCwgICAgIDc4Nzk2OCwgICAgIDc4Nzk2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDdmNzk4MmYzCiswLCAgICAgNzg5MTIwLCAgICAgNzg5MTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmNhMTcwZTkKKzAsICAgICA3OTAyNzIsICAgICA3OTAyNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzNjQzN2Q1YgorMCwgICAgIDc5MTQyNCwgICAgIDc5MTQyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGZkMjM4MGU4CiswLCAgICAgNzkyNTc2LCAgICAgNzkyNTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmUzYzZlOWYKKzAsICAgICA3OTM3MjgsICAgICA3OTM3MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjODQyN2YzZgorMCwgICAgIDc5NDg4MCwgICAgIDc5NDg4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDk2MmE3OWFkCiswLCAgICAgNzk2MDMyLCAgICAgNzk2MDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Yzk1OTdjOGIKKzAsICAgICA3OTcxODQsICAgICA3OTcxODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4OTk1ODBiYgorMCwgICAgIDc5ODMzNiwgICAgIDc5ODMzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDJkMTc5ZGZmCiswLCAgICAgNzk5NDg4LCAgICAgNzk5NDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGFjMTcwN2MKKzAsICAgICA4MDA2NDAsICAgICA4MDA2NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMmVhN2U5NQorMCwgICAgIDgwMTc5MiwgICAgIDgwMTc5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDI2NWU5YTJkCiswLCAgICAgODAyOTQ0LCAgICAgODAyOTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWM2NDg0ZDAKKzAsICAgICA4MDQwOTYsICAgICA4MDQwOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzOWFlNjg4NAorMCwgICAgIDgwNTI0OCwgICAgIDgwNTI0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDgyZWQ3YmM1CiswLCAgICAgODA2NDAwLCAgICAgODA2NDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTU2YjdiM2MKKzAsICAgICA4MDc1NTIsICAgICA4MDc1NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiN2Y3NzhkZAorMCwgICAgIDgwODcwNCwgICAgIDgwODcwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDc0NDQ3ZDU1CiswLCAgICAgODA5ODU2LCAgICAgODA5ODU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGM2Njg2MWUKKzAsICAgICA4MTEwMDgsICAgICA4MTEwMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNWJhNzkzMgorMCwgICAgIDgxMjE2MCwgICAgIDgxMjE2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGIxOTE3MGZjCiswLCAgICAgODEzMzEyLCAgICAgODEzMzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTlkMzc1NTEKKzAsICAgICA4MTQ0NjQsICAgICA4MTQ0NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYzUyOTE0MgorMCwgICAgIDgxNTYxNiwgICAgIDgxNTYxNiwgICAgIDExNTIsICAgICAyMzA0LCAweGYyNjM3ZTc3CiswLCAgICAgODE2NzY4LCAgICAgODE2NzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDA2NTk0NGIKKzAsICAgICA4MTc5MjAsICAgICA4MTc5MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMjg3ODEyMworMCwgICAgIDgxOTA3MiwgICAgIDgxOTA3MiwgICAgIDExNTIsICAgICAyMzA0LCAweGMyMWE4YmY3CiswLCAgICAgODIwMjI0LCAgICAgODIwMjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmUzNTgyZGMKKzAsICAgICA4MjEzNzYsICAgICA4MjEzNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNDJmNzk4NworMCwgICAgIDgyMjUyOCwgICAgIDgyMjUyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDY5Yjg4MjM2CiswLCAgICAgODIzNjgwLCAgICAgODIzNjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2M5ODhmOTAKKzAsICAgICA4MjQ4MzIsICAgICA4MjQ4MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyY2Q2NmRlZAorMCwgICAgIDgyNTk4NCwgICAgIDgyNTk4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDNlNjU4MjhiCiswLCAgICAgODI3MTM2LCAgICAgODI3MTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2U5ODcxYzkKKzAsICAgICA4MjgyODgsICAgICA4MjgyODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMWYyODA2YgorMCwgICAgIDgyOTQ0MCwgICAgIDgyOTQ0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGY1MDg3YzdiCiswLCAgICAgODMwNTkyLCAgICAgODMwNTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjJiOTgwOTcKKzAsICAgICA4MzE3NDQsICAgICA4MzE3NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYzQ1N2M0MworMCwgICAgIDgzMjg5NiwgICAgIDgzMjg5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDg3YWY4N2E2CiswLCAgICAgODM0MDQ4LCAgICAgODM0MDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTdjYzc1N2QKKzAsICAgICA4MzUyMDAsICAgICA4MzUyMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOGNhNzZiZAorMCwgICAgIDgzNjM1MiwgICAgIDgzNjM1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDE0YWU3Y2JkCiswLCAgICAgODM3NTA0LCAgICAgODM3NTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWY3OTcwOWEKKzAsICAgICA4Mzg2NTYsICAgICA4Mzg2NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNzk0ODIwNworMCwgICAgIDgzOTgwOCwgICAgIDgzOTgwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDE2ZWU3MjI4CiswLCAgICAgODQwOTYwLCAgICAgODQwOTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzZjYzgyZDcKKzAsICAgICA4NDIxMTIsICAgICA4NDIxMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZjMyN2E4ZQorMCwgICAgIDg0MzI2NCwgICAgIDg0MzI2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDE0ZWU3NzU2CiswLCAgICAgODQ0NDE2LCAgICAgODQ0NDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTU5OTZkMmYKKzAsICAgICA4NDU1NjgsICAgICA4NDU1NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YzcwN2Q1YworMCwgICAgIDg0NjcyMCwgICAgIDg0NjcyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDI2OGM2ZmVlCiswLCAgICAgODQ3ODcyLCAgICAgODQ3ODcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmQ4MzhjNzYKKzAsICAgICA4NDkwMjQsICAgICA4NDkwMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhZmExN2U2NAorMCwgICAgIDg1MDE3NiwgICAgIDg1MDE3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGI2NTQ2ZTY2CiswLCAgICAgODUxMzI4LCAgICAgODUxMzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTQ1ZDhiOWYKKzAsICAgICA4NTI0ODAsICAgICA4NTI0ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YmZiNzQ0NgorMCwgICAgIDg1MzYzMiwgICAgIDg1MzYzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGFlNjA4NmY5CiswLCAgICAgODU0Nzg0LCAgICAgODU0Nzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTAxMzgwY2QKKzAsICAgICA4NTU5MzYsICAgICA4NTU5MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNmYwODI4ZgorMCwgICAgIDg1NzA4OCwgICAgIDg1NzA4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDBhZTA3MTc2CiswLCAgICAgODU4MjQwLCAgICAgODU4MjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjZmMDc1MjIKKzAsICAgICA4NTkzOTIsICAgICA4NTkzOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0NDAxODEwNgorMCwgICAgIDg2MDU0NCwgICAgIDg2MDU0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDhjZDI4M2RhCiswLCAgICAgODYxNjk2LCAgICAgODYxNjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTQyNTdmNDUKKzAsICAgICA4NjI4NDgsICAgICA4NjI4NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNDk3OTUzNworMCwgICAgIDg2NDAwMCwgICAgIDg2NDAwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDhiNWY3OTdjCiswLCAgICAgODY1MTUyLCAgICAgODY1MTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTJkNjc0OTMKKzAsICAgICA4NjYzMDQsICAgICA4NjYzMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjODg4NmEyNQorMCwgICAgIDg2NzQ1NiwgICAgIDg2NzQ1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDYxNGI4MDNhCiswLCAgICAgODY4NjA4LCAgICAgODY4NjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzU2NjdkMzUKKzAsICAgICA4Njk3NjAsICAgICA4Njk3NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNDJjN2IwMAorMCwgICAgIDg3MDkxMiwgICAgIDg3MDkxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDM3Nzg3OTI3CiswLCAgICAgODcyMDY0LCAgICAgODcyMDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODVkYjg0MDkKKzAsICAgICA4NzMyMTYsICAgICA4NzMyMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MjNiODIyYworMCwgICAgIDg3NDM2OCwgICAgIDg3NDM2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGExNjU4NDc5CiswLCAgICAgODc1NTIwLCAgICAgODc1NTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGJlNThmZjcKKzAsICAgICA4NzY2NzIsICAgICA4NzY2NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MjUxNzVlMgorMCwgICAgIDg3NzgyNCwgICAgIDg3NzgyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGIyYWU3NzQxCiswLCAgICAgODc4OTc2LCAgICAgODc4OTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGRlMTY5ZTQKKzAsICAgICA4ODAxMjgsICAgICA4ODAxMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzY2IxODUzMAorMCwgICAgIDg4MTI4MCwgICAgIDg4MTI4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDVhMGM1ZTdiCiswLCAgICAgODgyNDMyLCAgICAgODgyNDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGUxZjY4YjYKKzAsICAgICA4ODM1ODQsICAgICA4ODM1ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YTBjNzUyNQorMCwgICAgIDg4NDczNiwgICAgIDg4NDczNiwgICAgIDExNTIsICAgICAyMzA0LCAweDg2YWU2YTA0CiswLCAgICAgODg1ODg4LCAgICAgODg1ODg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjUwODg3N2MKKzAsICAgICA4ODcwNDAsICAgICA4ODcwNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOTc0NmQ3YworMCwgICAgIDg4ODE5MiwgICAgIDg4ODE5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDI0MDc4ZWRiCiswLCAgICAgODg5MzQ0LCAgICAgODg5MzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGY5Nzg0ZDIKKzAsICAgICA4OTA0OTYsICAgICA4OTA0OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyNDE4NmU5NQorMCwgICAgIDg5MTY0OCwgICAgIDg5MTY0OCwgICAgIDExNTIsICAgICAyMzA0LCAweGQxOTI3YjI4CiswLCAgICAgODkyODAwLCAgICAgODkyODAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Yzc3MjgzZDUKKzAsICAgICA4OTM5NTIsICAgICA4OTM5NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjMGFkNzNmOAorMCwgICAgIDg5NTEwNCwgICAgIDg5NTEwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDBkZTc4NTI0CiswLCAgICAgODk2MjU2LCAgICAgODk2MjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGIwMDYxZGMKKzAsICAgICA4OTc0MDgsICAgICA4OTc0MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzN2M3N2FkNgorMCwgICAgIDg5ODU2MCwgICAgIDg5ODU2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDVlYWU3NDEwCiswLCAgICAgODk5NzEyLCAgICAgODk5NzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzJkOTdhYjUKKzAsICAgICA5MDA4NjQsICAgICA5MDA4NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxYWZkODc0NQorMCwgICAgIDkwMjAxNiwgICAgIDkwMjAxNiwgICAgIDExNTIsICAgICAyMzA0LCAweGUzMGI3YzliCiswLCAgICAgOTAzMTY4LCAgICAgOTAzMTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTg2NDgwYjMKKzAsICAgICA5MDQzMjAsICAgICA5MDQzMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiOWM3N2E0ZQorMCwgICAgIDkwNTQ3MiwgICAgIDkwNTQ3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDY0NTA4ZjJhCiswLCAgICAgOTA2NjI0LCAgICAgOTA2NjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODM5YTc0ZWQKKzAsICAgICA5MDc3NzYsICAgICA5MDc3NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMjE0N2E1ZAorMCwgICAgIDkwODkyOCwgICAgIDkwODkyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDMzYjA3ZDNiCiswLCAgICAgOTEwMDgwLCAgICAgOTEwMDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjVlNjc3MzEKKzAsICAgICA5MTEyMzIsICAgICA5MTEyMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZDFjODE5MQorMCwgICAgIDkxMjM4NCwgICAgIDkxMjM4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGFkYTE3NzAxCiswLCAgICAgOTEzNTM2LCAgICAgOTEzNTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDlkNDdmNmMKKzAsICAgICA5MTQ2ODgsICAgICA5MTQ2ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ZGY5Nzk4OQorMCwgICAgIDkxNTg0MCwgICAgIDkxNTg0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDBkYjE3YWQ5CiswLCAgICAgOTE2OTkyLCAgICAgOTE2OTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGQzMjgxZDcKKzAsICAgICA5MTgxNDQsICAgICA5MTgxNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyNTAzNzA0ZgorMCwgICAgIDkxOTI5NiwgICAgIDkxOTI5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGRmN2M3M2QwCiswLCAgICAgOTIwNDQ4LCAgICAgOTIwNDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTNkZDczN2MKKzAsICAgICA5MjE2MDAsICAgICA5MjE2MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0OGVkNTc0MAorMCwgICAgIDkyMjc1MiwgICAgIDkyMjc1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDZkNDc3ZWFmCiswLCAgICAgOTIzOTA0LCAgICAgOTIzOTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTcyMzczYTEKKzAsICAgICA5MjUwNTYsICAgICA5MjUwNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ZDNlN2UyZQorMCwgICAgIDkyNjIwOCwgICAgIDkyNjIwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDBkMTY3NzQzCiswLCAgICAgOTI3MzYwLCAgICAgOTI3MzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzJkOTdmNmMKKzAsICAgICA5Mjg1MTIsICAgICA5Mjg1MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNjYxNzVhMAorMCwgICAgIDkyOTY2NCwgICAgIDkyOTY2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGQwMTI3NDc1CiswLCAgICAgOTMwODE2LCAgICAgOTMwODE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGJmNTc4MDEKKzAsICAgICA5MzE5NjgsICAgICA5MzE5NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1MmI0N2E4ZQorMCwgICAgIDkzMzEyMCwgICAgIDkzMzEyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGM5NmI4MGM1CiswLCAgICAgOTM0MjcyLCAgICAgOTM0MjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDcwYzc2Y2YKKzAsICAgICA5MzU0MjQsICAgICA5MzU0MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYWEwN2VlMgorMCwgICAgIDkzNjU3NiwgICAgIDkzNjU3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDA0MDU5MDc0CiswLCAgICAgOTM3NzI4LCAgICAgOTM3NzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjI4ZjZkZWYKKzAsICAgICA5Mzg4ODAsICAgICA5Mzg4ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5Mjc4OTNhOAorMCwgICAgIDk0MDAzMiwgICAgIDk0MDAzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDU4MWE4N2RmCiswLCAgICAgOTQxMTg0LCAgICAgOTQxMTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGQzZjY1M2MKKzAsICAgICA5NDIzMzYsICAgICA5NDIzMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjMGU3NzVmMworMCwgICAgIDk0MzQ4OCwgICAgIDk0MzQ4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDQxZDk4NDczCiswLCAgICAgOTQ0NjQwLCAgICAgOTQ0NjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjhmYjc3NWEKKzAsICAgICA5NDU3OTIsICAgICA5NDU3OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MWUwODEwZQorMCwgICAgIDk0Njk0NCwgICAgIDk0Njk0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGYzNTc5MGQzCiswLCAgICAgOTQ4MDk2LCAgICAgOTQ4MDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzE0NjhjNDUKKzAsICAgICA5NDkyNDgsICAgICA5NDkyNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OTQ5Nzk2YQorMCwgICAgIDk1MDQwMCwgICAgIDk1MDQwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGEwYmI3ZGNkCiswLCAgICAgOTUxNTUyLCAgICAgOTUxNTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTBhZjg0MjQKKzAsICAgICA5NTI3MDQsICAgICA5NTI3MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0NDliN2QzNworMCwgICAgIDk1Mzg1NiwgICAgIDk1Mzg1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGNmMjc3OWE4CiswLCAgICAgOTU1MDA4LCAgICAgOTU1MDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDY5ZDg5NGUKKzAsICAgICA5NTYxNjAsICAgICA5NTYxNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MWJkNzMzNAorMCwgICAgIDk1NzMxMiwgICAgIDk1NzMxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDBkZmQ4YzA1CiswLCAgICAgOTU4NDY0LCAgICAgOTU4NDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmNlMjdiOWQKKzAsICAgICA5NTk2MTYsICAgICA5NTk2MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MjI4NzViNQorMCwgICAgIDk2MDc2OCwgICAgIDk2MDc2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ1Mjk3Mzg5CiswLCAgICAgOTYxOTIwLCAgICAgOTYxOTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDllZDg2NjgKKzAsICAgICA5NjMwNzIsICAgICA5NjMwNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYTlhODEwYgorMCwgICAgIDk2NDIyNCwgICAgIDk2NDIyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDVhM2Y3YjQzCiswLCAgICAgOTY1Mzc2LCAgICAgOTY1Mzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzIwODdjMTIKKzAsICAgICA5NjY1MjgsICAgICA5NjY1MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3NTljN2JiYQorMCwgICAgIDk2NzY4MCwgICAgIDk2NzY4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDViMjY4MjNiCiswLCAgICAgOTY4ODMyLCAgICAgOTY4ODMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWViODcyZWYKKzAsICAgICA5Njk5ODQsICAgICA5Njk5ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2ZWIwODY5ZAorMCwgICAgIDk3MTEzNiwgICAgIDk3MTEzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDRiM2U3NjRmCiswLCAgICAgOTcyMjg4LCAgICAgOTcyMjg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzBhNjZmZGIKKzAsICAgICA5NzM0NDAsICAgICA5NzM0NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NTgzNzRmZgorMCwgICAgIDk3NDU5MiwgICAgIDk3NDU5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDQxMWI3MWNjCiswLCAgICAgOTc1NzQ0LCAgICAgOTc1NzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODAxMzY3NTkKKzAsICAgICA5NzY4OTYsICAgICA5NzY4OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNWVkNjc5MworMCwgICAgIDk3ODA0OCwgICAgIDk3ODA0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ4ZjE4ODI3CiswLCAgICAgOTc5MjAwLCAgICAgOTc5MjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjQwZDc4NjYKKzAsICAgICA5ODAzNTIsICAgICA5ODAzNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjYWQxOGM0YQorMCwgICAgIDk4MTUwNCwgICAgIDk4MTUwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDlhZDY4NTgyCiswLCAgICAgOTgyNjU2LCAgICAgOTgyNjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2FkMTdmY2UKKzAsICAgICA5ODM4MDgsICAgICA5ODM4MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MjRiN2FmNgorMCwgICAgIDk4NDk2MCwgICAgIDk4NDk2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGNjOWQ4OTRmCiswLCAgICAgOTg2MTEyLCAgICAgOTg2MTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDYxNjdhNzAKKzAsICAgICA5ODcyNjQsICAgICA5ODcyNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyNDc5ODcyYQorMCwgICAgIDk4ODQxNiwgICAgIDk4ODQxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDU4Y2I3MmE1CiswLCAgICAgOTg5NTY4LCAgICAgOTg5NTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDE5NTc3NDcKKzAsICAgICA5OTA3MjAsICAgICA5OTA3MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2ZGYxNzJjYgorMCwgICAgIDk5MTg3MiwgICAgIDk5MTg3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDllYmQ3ZWQ5CiswLCAgICAgOTkzMDI0LCAgICAgOTkzMDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODk0MzZhNTMKKzAsICAgICA5OTQxNzYsICAgICA5OTQxNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjY2U3ODQzMworMCwgICAgIDk5NTMyOCwgICAgIDk5NTMyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDFiN2E3MGYyCiswLCAgICAgOTk2NDgwLCAgICAgOTk2NDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTMwNTg0ZDcKKzAsICAgICA5OTc2MzIsICAgICA5OTc2MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYTE1OGFhOQorMCwgICAgIDk5ODc4NCwgICAgIDk5ODc4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGU4NWU3YjkwCiswLCAgICAgOTk5OTM2LCAgICAgOTk5OTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YThhYzgxNzYKKzAsICAgIDEwMDEwODgsICAgIDEwMDEwODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNDM1NzhhOQorMCwgICAgMTAwMjI0MCwgICAgMTAwMjI0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDllY2M3YzMwCiswLCAgICAxMDAzMzkyLCAgICAxMDAzMzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWNiZDg1OTEKKzAsICAgIDEwMDQ1NDQsICAgIDEwMDQ1NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NDkxN2JkOQorMCwgICAgMTAwNTY5NiwgICAgMTAwNTY5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGVhODQ3N2U0CiswLCAgICAxMDA2ODQ4LCAgICAxMDA2ODQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjUwYzdlYTEKKzAsICAgIDEwMDgwMDAsICAgIDEwMDgwMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjODVlNzZlNworMCwgICAgMTAwOTE1MiwgICAgMTAwOTE1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGE1MTQ4NzY4CiswLCAgICAxMDEwMzA0LCAgICAxMDEwMzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmJkNTg0NmEKKzAsICAgIDEwMTE0NTYsICAgIDEwMTE0NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxY2Q4ODY0MQorMCwgICAgMTAxMjYwOCwgICAgMTAxMjYwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDA0Yjg4M2M1CiswLCAgICAxMDEzNzYwLCAgICAxMDEzNzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWJmMTcxOWIKKzAsICAgIDEwMTQ5MTIsICAgIDEwMTQ5MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYWJlNzc3YworMCwgICAgMTAxNjA2NCwgICAgMTAxNjA2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGM3NGE3ZjdmCiswLCAgICAxMDE3MjE2LCAgICAxMDE3MjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDM2YTcyNGIKKzAsICAgIDEwMTgzNjgsICAgIDEwMTgzNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YWU2N2U5ZQorMCwgICAgMTAxOTUyMCwgICAgMTAxOTUyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGZiNjE3M2EwCiswLCAgICAxMDIwNjcyLCAgICAxMDIwNjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzFkNzdlMTkKKzAsICAgIDEwMjE4MjQsICAgIDEwMjE4MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2MTUzNzY3ZAorMCwgICAgMTAyMjk3NiwgICAgMTAyMjk3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGU0MGQ4NGU0CiswLCAgICAxMDI0MTI4LCAgICAxMDI0MTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzhlZjcxZTIKKzAsICAgIDEwMjUyODAsICAgIDEwMjUyODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZWNhODFiZQorMCwgICAgMTAyNjQzMiwgICAgMTAyNjQzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDc1ZGE4NWRmCiswLCAgICAxMDI3NTg0LCAgICAxMDI3NTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmM4ZTcxYmQKKzAsICAgIDEwMjg3MzYsICAgIDEwMjg3MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2Zjg1NzZhNAorMCwgICAgMTAyOTg4OCwgICAgMTAyOTg4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGU2NjM3YjcxCiswLCAgICAxMDMxMDQwLCAgICAxMDMxMDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGRmZTg4NjYKKzAsICAgIDEwMzIxOTIsICAgIDEwMzIxOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMDg1NzhhNQorMCwgICAgMTAzMzM0NCwgICAgMTAzMzM0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDcyYWY3ODczCiswLCAgICAxMDM0NDk2LCAgICAxMDM0NDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjU1MDYxNWMKKzAsICAgIDEwMzU2NDgsICAgIDEwMzU2NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ZWY4N2QyOAorMCwgICAgMTAzNjgwMCwgICAgMTAzNjgwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGUzMGQ4M2JmCiswLCAgICAxMDM3OTUyLCAgICAxMDM3OTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjAzMDgxOGMKKzAsICAgIDEwMzkxMDQsICAgIDEwMzkxMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxZTIzODk2YworMCwgICAgMTA0MDI1NiwgICAgMTA0MDI1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGY0Yzg3MTgwCiswLCAgICAxMDQxNDA4LCAgICAxMDQxNDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTM0MTgxYWEKKzAsICAgIDEwNDI1NjAsICAgIDEwNDI1NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NjA2ODFjYgorMCwgICAgMTA0MzcxMiwgICAgMTA0MzcxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDdlYmI4N2ZjCiswLCAgICAxMDQ0ODY0LCAgICAxMDQ0ODY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTgzMDVlZWIKKzAsICAgIDEwNDYwMTYsICAgIDEwNDYwMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYTg5ODkwNgorMCwgICAgMTA0NzE2OCwgICAgMTA0NzE2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDM0MmI2YzEzCiswLCAgICAxMDQ4MzIwLCAgICAxMDQ4MzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2ZkMTgzNzIKKzAsICAgIDEwNDk0NzIsICAgIDEwNDk0NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NjVjNzM3NworMCwgICAgMTA1MDYyNCwgICAgMTA1MDYyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGI1M2I3MGIzCiswLCAgICAxMDUxNzc2LCAgICAxMDUxNzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDU0ODg0ZDEKKzAsICAgIDEwNTI5MjgsICAgIDEwNTI5MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NDZkNzdhYworMCwgICAgMTA1NDA4MCwgICAgMTA1NDA4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ3YTc3ZGM3CiswLCAgICAxMDU1MjMyLCAgICAxMDU1MjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGIwZTdjNWMKKzAsICAgIDEwNTYzODQsICAgIDEwNTYzODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzNDZkNzAyNgorMCwgICAgMTA1NzUzNiwgICAgMTA1NzUzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDNmMzQ2ZTgxCiswLCAgICAxMDU4Njg4LCAgICAxMDU4Njg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2YxNjcwOTgKKzAsICAgIDEwNTk4NDAsICAgIDEwNTk4NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxYzg1Nzk4NworMCwgICAgMTA2MDk5MiwgICAgMTA2MDk5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGY5MzE3YzE2CiswLCAgICAxMDYyMTQ0LCAgICAxMDYyMTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjVlYTgyYzQKKzAsICAgIDEwNjMyOTYsICAgIDEwNjMyOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYjBmOTBiYgorMCwgICAgMTA2NDQ0OCwgICAgMTA2NDQ0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDk5OTY2OGRiCiswLCAgICAxMDY1NjAwLCAgICAxMDY1NjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWEwNjc2ZGEKKzAsICAgIDEwNjY3NTIsICAgIDEwNjY3NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5N2E4NzE3MgorMCwgICAgMTA2NzkwNCwgICAgMTA2NzkwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDMyM2Q3YWNlCiswLCAgICAxMDY5MDU2LCAgICAxMDY5MDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWI1MzhiYWEKKzAsICAgIDEwNzAyMDgsICAgIDEwNzAyMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYjIwOGI3MgorMCwgICAgMTA3MTM2MCwgICAgMTA3MTM2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDM2YzY5MTUyCiswLCAgICAxMDcyNTEyLCAgICAxMDcyNTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTcwYzdiYWMKKzAsICAgIDEwNzM2NjQsICAgIDEwNzM2NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkNzI4N2M3MgorMCwgICAgMTA3NDgxNiwgICAgMTA3NDgxNiwgICAgIDExNTIsICAgICAyMzA0LCAweGM0ZDc4Nzc2CiswLCAgICAxMDc1OTY4LCAgICAxMDc1OTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGNiYjc3MzUKKzAsICAgIDEwNzcxMjAsICAgIDEwNzcxMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwODA2NmQ3OAorMCwgICAgMTA3ODI3MiwgICAgMTA3ODI3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDVjYjk2YmFkCiswLCAgICAxMDc5NDI0LCAgICAxMDc5NDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzBkNTgxODAKKzAsICAgIDEwODA1NzYsICAgIDEwODA1NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzYWM5NmI4NworMCwgICAgMTA4MTcyOCwgICAgMTA4MTcyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDFmYzg3OGQyCiswLCAgICAxMDgyODgwLCAgICAxMDgyODgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmM3Yzg1ZDQKKzAsICAgIDEwODQwMzIsICAgIDEwODQwMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2YzMwN2NhYQorMCwgICAgMTA4NTE4NCwgICAgMTA4NTE4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDY0N2I2ZDZlCiswLCAgICAxMDg2MzM2LCAgICAxMDg2MzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmJlZjdlNTEKKzAsICAgIDEwODc0ODgsICAgIDEwODc0ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyNzg2N2JkNworMCwgICAgMTA4ODY0MCwgICAgMTA4ODY0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGEyYjg3NWIxCiswLCAgICAxMDg5NzkyLCAgICAxMDg5NzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzdkZDczZmIKKzAsICAgIDEwOTA5NDQsICAgIDEwOTA5NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MTdlNzllOQorMCwgICAgMTA5MjA5NiwgICAgMTA5MjA5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGZlY2I3MTBkCiswLCAgICAxMDkzMjQ4LCAgICAxMDkzMjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTUzMDgzMzMKKzAsICAgIDEwOTQ0MDAsICAgIDEwOTQ0MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5MmZlNmI3NworMCwgICAgMTA5NTU1MiwgICAgMTA5NTU1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDdkYjE3YWQ2CiswLCAgICAxMDk2NzA0LCAgICAxMDk2NzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTI0ODc4NmQKKzAsICAgIDEwOTc4NTYsICAgIDEwOTc4NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMzY0N2E4YQorMCwgICAgMTA5OTAwOCwgICAgMTA5OTAwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDdiMjE3M2YwCiswLCAgICAxMTAwMTYwLCAgICAxMTAwMTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmQxZjdhM2MKKzAsICAgIDExMDEzMTIsICAgIDExMDEzMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOWU1N2YzZQorMCwgICAgMTEwMjQ2NCwgICAgMTEwMjQ2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDEzZDc3OThkCiswLCAgICAxMTAzNjE2LCAgICAxMTAzNjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2Q0ZDc1OGEKKzAsICAgIDExMDQ3NjgsICAgIDExMDQ3NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZjFhODBiZQorMCwgICAgMTEwNTkyMCwgICAgMTEwNTkyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGI5MWI3Y2I5CiswLCAgICAxMTA3MDcyLCAgICAxMTA3MDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTAyZTczYmEKKzAsICAgIDExMDgyMjQsICAgIDExMDgyMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4ZGNlODQyOAorMCwgICAgMTEwOTM3NiwgICAgMTEwOTM3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGRmOTA3MGY2CiswLCAgICAxMTEwNTI4LCAgICAxMTEwNTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjdkNzdiYjQKKzAsICAgIDExMTE2ODAsICAgIDExMTE2ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyZjhhODU3OQorMCwgICAgMTExMjgzMiwgICAgMTExMjgzMiwgICAgIDExNTIsICAgICAyMzA0LCAweGQxZTI3MjA0CiswLCAgICAxMTEzOTg0LCAgICAxMTEzOTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NGYwODc5MjAKKzAsICAgIDExMTUxMzYsICAgIDExMTUxMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OWY1ODMwNgorMCwgICAgMTExNjI4OCwgICAgMTExNjI4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGZjNzM3OGIwCiswLCAgICAxMTE3NDQwLCAgICAxMTE3NDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGIxNjdkODkKKzAsICAgIDExMTg1OTIsICAgIDExMTg1OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYzg2NzIzNQorMCwgICAgMTExOTc0NCwgICAgMTExOTc0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGMzMTI2ZTA5CiswLCAgICAxMTIwODk2LCAgICAxMTIwODk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2QwOTdkODkKKzAsICAgIDExMjIwNDgsICAgIDExMjIwNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3M2RjNjY0ZQorMCwgICAgMTEyMzIwMCwgICAgMTEyMzIwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGRjMjQ3YTBhCiswLCAgICAxMTI0MzUyLCAgICAxMTI0MzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWE4ZDdmMmYKKzAsICAgIDExMjU1MDQsICAgIDExMjU1MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YTFkNzQ0YgorMCwgICAgMTEyNjY1NiwgICAgMTEyNjY1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ5ZTg3NDc1CiswLCAgICAxMTI3ODA4LCAgICAxMTI3ODA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjZmMTgyYWIKKzAsICAgIDExMjg5NjAsICAgIDExMjg5NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0OTM3NzA2YgorMCwgICAgMTEzMDExMiwgICAgMTEzMDExMiwgICAgIDExNTIsICAgICAyMzA0LCAweDgzNzE4OWIxCiswLCAgICAxMTMxMjY0LCAgICAxMTMxMjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDU2NTk3NWQKKzAsICAgIDExMzI0MTYsICAgIDExMzI0MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNjE1NmE1NgorMCwgICAgMTEzMzU2OCwgICAgMTEzMzU2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGNkOWM4MTA3CiswLCAgICAxMTM0NzIwLCAgICAxMTM0NzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWY4Njg0MDAKKzAsICAgIDExMzU4NzIsICAgIDExMzU4NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZGRiNzFlMAorMCwgICAgMTEzNzAyNCwgICAgMTEzNzAyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDVmYTI3ODJhCiswLCAgICAxMTM4MTc2LCAgICAxMTM4MTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWIwNzZlMjIKKzAsICAgIDExMzkzMjgsICAgIDExMzkzMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5MDAyN2JhNworMCwgICAgMTE0MDQ4MCwgICAgMTE0MDQ4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDQwYTQ4MWZkCiswLCAgICAxMTQxNjMyLCAgICAxMTQxNjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjQwODczYmYKKzAsICAgIDExNDI3ODQsICAgIDExNDI3ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOGNkN2Q4ZQorMCwgICAgMTE0MzkzNiwgICAgMTE0MzkzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDVkNDI4N2IwCiswLCAgICAxMTQ1MDg4LCAgICAxMTQ1MDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Zjk1NjdjNGIKKzAsICAgIDExNDYyNDAsICAgIDExNDYyNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2N2RkOTI0YQorMCwgICAgMTE0NzM5MiwgICAgMTE0NzM5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDMzZDM3YjRjCiswLCAgICAxMTQ4NTQ0LCAgICAxMTQ4NTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzczMTZkMGIKKzAsICAgIDExNDk2OTYsICAgIDExNDk2OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0M2E4NzdkYworMCwgICAgMTE1MDg0OCwgICAgMTE1MDg0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ0ZmM5MGJjCiswLCAgICAxMTUyMDAwLCAgICAxMTUyMDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTBmNTc3NGMKKzAsICAgIDExNTMxNTIsICAgIDExNTMxNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMDZlODVhMAorMCwgICAgMTE1NDMwNCwgICAgMTE1NDMwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGI3OGI3ZjgzCiswLCAgICAxMTU1NDU2LCAgICAxMTU1NDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2MzYTc3YWYKKzAsICAgIDExNTY2MDgsICAgIDExNTY2MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3YTVmNzI4MgorMCwgICAgMTE1Nzc2MCwgICAgMTE1Nzc2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDE2NGQ4OTFhCiswLCAgICAxMTU4OTEyLCAgICAxMTU4OTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTMwYTcxOTQKKzAsICAgIDExNjAwNjQsICAgIDExNjAwNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiMjYyODAxMworMCwgICAgMTE2MTIxNiwgICAgMTE2MTIxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDNhZGY3ZTFjCiswLCAgICAxMTYyMzY4LCAgICAxMTYyMzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDg2MjdjNDUKKzAsICAgIDExNjM1MjAsICAgIDExNjM1MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMzM2N2NjYQorMCwgICAgMTE2NDY3MiwgICAgMTE2NDY3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDljZjc3MjQ4CiswLCAgICAxMTY1ODI0LCAgICAxMTY1ODI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzVhODZhY2IKKzAsICAgIDExNjY5NzYsICAgIDExNjY5NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3NTQ4NzY5OAorMCwgICAgMTE2ODEyOCwgICAgMTE2ODEyOCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ2NWI4Mzg5CiswLCAgICAxMTY5MjgwLCAgICAxMTY5MjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjcxZDg0YjUKKzAsICAgIDExNzA0MzIsICAgIDExNzA0MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkY2E4N2U0MgorMCwgICAgMTE3MTU4NCwgICAgMTE3MTU4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ0ZGQ3ZDcyCiswLCAgICAxMTcyNzM2LCAgICAxMTcyNzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjI5NDY1ZGEKKzAsICAgIDExNzM4ODgsICAgIDExNzM4ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4OGVkODkzMAorMCwgICAgMTE3NTA0MCwgICAgMTE3NTA0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGFiZGQ4MDk2CiswLCAgICAxMTc2MTkyLCAgICAxMTc2MTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTVmNTc2NTMKKzAsICAgIDExNzczNDQsICAgIDExNzczNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3Yzc3Nzk4NAorMCwgICAgMTE3ODQ5NiwgICAgMTE3ODQ5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDYzMWQ3ZGViCiswLCAgICAxMTc5NjQ4LCAgICAxMTc5NjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzBkMzZlMWYKKzAsICAgIDExODA4MDAsICAgIDExODA4MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MTJjODAyYgorMCwgICAgMTE4MTk1MiwgICAgMTE4MTk1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGFjYzI4MWMxCiswLCAgICAxMTgzMTA0LCAgICAxMTgzMTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTY5ZDg2YTgKKzAsICAgIDExODQyNTYsICAgIDExODQyNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YzY5NzQzZgorMCwgICAgMTE4NTQwOCwgICAgMTE4NTQwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDI5NjM3Nzk0CiswLCAgICAxMTg2NTYwLCAgICAxMTg2NTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGQxYjdhNGYKKzAsICAgIDExODc3MTIsICAgIDExODc3MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmYzY5NzhhNgorMCwgICAgMTE4ODg2NCwgICAgMTE4ODg2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDliMTc4OTg3CiswLCAgICAxMTkwMDE2LCAgICAxMTkwMDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTQzNjcxNGEKKzAsICAgIDExOTExNjgsICAgIDExOTExNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ODNhN2I2ZQorMCwgICAgMTE5MjMyMCwgICAgMTE5MjMyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDZmZjE2ZjRlCiswLCAgICAxMTkzNDcyLCAgICAxMTkzNDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWZkNTgyY2MKKzAsICAgIDExOTQ2MjQsICAgIDExOTQ2MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmZjBkNmJjOQorMCwgICAgMTE5NTc3NiwgICAgMTE5NTc3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDZmNDk3NWQ1CiswLCAgICAxMTk2OTI4LCAgICAxMTk2OTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTRhNzdhOTAKKzAsICAgIDExOTgwODAsICAgIDExOTgwODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3NjRmODBkYgorMCwgICAgMTE5OTIzMiwgICAgMTE5OTIzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDY4ZTg4NzgyCiswLCAgICAxMjAwMzg0LCAgICAxMjAwMzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTFhMzc4ZTgKKzAsICAgIDEyMDE1MzYsICAgIDEyMDE1MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOWYyNjkwMworMCwgICAgMTIwMjY4OCwgICAgMTIwMjY4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGMzYjY4NGQ0CiswLCAgICAxMjAzODQwLCAgICAxMjAzODQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2Q5NTkyMWYKKzAsICAgIDEyMDQ5OTIsICAgIDEyMDQ5OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NzZhN2RlZAorMCwgICAgMTIwNjE0NCwgICAgMTIwNjE0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDBmYmU3ZWU4CiswLCAgICAxMjA3Mjk2LCAgICAxMjA3Mjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2QwZjc4YzUKKzAsICAgIDEyMDg0NDgsICAgIDEyMDg0NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZTkwNmJhOAorMCwgICAgMTIwOTYwMCwgICAgMTIwOTYwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGQyODE3NDdiCiswLCAgICAxMjEwNzUyLCAgICAxMjEwNzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWMzODgxMWIKKzAsICAgIDEyMTE5MDQsICAgIDEyMTE5MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MTcwODEwYQorMCwgICAgMTIxMzA1NiwgICAgMTIxMzA1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDRkODU4YmEyCiswLCAgICAxMjE0MjA4LCAgICAxMjE0MjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGM3OTg2NjIKKzAsICAgIDEyMTUzNjAsICAgIDEyMTUzNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyM2E4ODc5YgorMCwgICAgMTIxNjUxMiwgICAgMTIxNjUxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDlkMGM4ODk0CiswLCAgICAxMjE3NjY0LCAgICAxMjE3NjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjA3YzY4MWYKKzAsICAgIDEyMTg4MTYsICAgIDEyMTg4MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwM2FiNmY3YQorMCwgICAgMTIxOTk2OCwgICAgMTIxOTk2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDg4YzE3MGMyCiswLCAgICAxMjIxMTIwLCAgICAxMjIxMTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWI5NzdiZjMKKzAsICAgIDEyMjIyNzIsICAgIDEyMjIyNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzM2I2Nzc0ZgorMCwgICAgMTIyMzQyNCwgICAgMTIyMzQyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDUzNGM3NzZlCiswLCAgICAxMjI0NTc2LCAgICAxMjI0NTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzNjNDgyNmEKKzAsICAgIDEyMjU3MjgsICAgIDEyMjU3MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYjk4NzhkOAorMCwgICAgMTIyNjg4MCwgICAgMTIyNjg4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGVmZmQ3ODliCiswLCAgICAxMjI4MDMyLCAgICAxMjI4MDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmNjOTg2MmYKKzAsICAgIDEyMjkxODQsICAgIDEyMjkxODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YmYxODEzMQorMCwgICAgMTIzMDMzNiwgICAgMTIzMDMzNiwgICAgIDExNTIsICAgICAyMzA0LCAweGZhMDc4MTQ0CiswLCAgICAxMjMxNDg4LCAgICAxMjMxNDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTIyODg1ZDIKKzAsICAgIDEyMzI2NDAsICAgIDEyMzI2NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOWFkNzc5NgorMCwgICAgMTIzMzc5MiwgICAgMTIzMzc5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDYyNzY2ZjNmCiswLCAgICAxMjM0OTQ0LCAgICAxMjM0OTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzJhODczYTUKKzAsICAgIDEyMzYwOTYsICAgIDEyMzYwOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NTE3NmU0ZAorMCwgICAgMTIzNzI0OCwgICAgMTIzNzI0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDc1NDQ3Y2JkCiswLCAgICAxMjM4NDAwLCAgICAxMjM4NDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODM1MjhlMzIKKzAsICAgIDEyMzk1NTIsICAgIDEyMzk1NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwYzc1ODUzMQorMCwgICAgMTI0MDcwNCwgICAgMTI0MDcwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDRhNWM3YTg0CiswLCAgICAxMjQxODU2LCAgICAxMjQxODU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDU5Mzc2NDgKKzAsICAgIDEyNDMwMDgsICAgIDEyNDMwMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZjVjODk4MworMCwgICAgMTI0NDE2MCwgICAgMTI0NDE2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDI0YjI4MWQwCiswLCAgICAxMjQ1MzEyLCAgICAxMjQ1MzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzBhZjcwMTcKKzAsICAgIDEyNDY0NjQsICAgIDEyNDY0NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMWNjNzE0NQorMCwgICAgMTI0NzYxNiwgICAgMTI0NzYxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDdkZGI3YTNiCiswLCAgICAxMjQ4NzY4LCAgICAxMjQ4NzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDJlNTc2OTIKKzAsICAgIDEyNDk5MjAsICAgIDEyNDk5MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3YWJjNjFkNgorMCwgICAgMTI1MTA3MiwgICAgMTI1MTA3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDQ0YTY4MzM4CiswLCAgICAxMjUyMjI0LCAgICAxMjUyMjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWNhZDgxMGUKKzAsICAgIDEyNTMzNzYsICAgIDEyNTMzNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiZjNhN2Y1MQorMCwgICAgMTI1NDUyOCwgICAgMTI1NDUyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDUyYWM4MTVlCiswLCAgICAxMjU1NjgwLCAgICAxMjU1NjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGYzMjdlMTAKKzAsICAgIDEyNTY4MzIsICAgIDEyNTY4MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3OTdjODY3YgorMCwgICAgMTI1Nzk4NCwgICAgMTI1Nzk4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDY4NWI3OWVjCiswLCAgICAxMjU5MTM2LCAgICAxMjU5MTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjAyNjdiODIKKzAsICAgIDEyNjAyODgsICAgIDEyNjAyODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNzBlN2ZkNAorMCwgICAgMTI2MTQ0MCwgICAgMTI2MTQ0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGFmMTk3YTIyCiswLCAgICAxMjYyNTkyLCAgICAxMjYyNTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjVlNTcwNzUKKzAsICAgIDEyNjM3NDQsICAgIDEyNjM3NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhODZmODE5NworMCwgICAgMTI2NDg5NiwgICAgMTI2NDg5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDkyMmM3YjNkCiswLCAgICAxMjY2MDQ4LCAgICAxMjY2MDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGUzYjc5MjkKKzAsICAgIDEyNjcyMDAsICAgIDEyNjcyMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MTZmODYyZAorMCwgICAgMTI2ODM1MiwgICAgMTI2ODM1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGMwOWM3NjFhCiswLCAgICAxMjY5NTA0LCAgICAxMjY5NTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjFjZDkwMTAKKzAsICAgIDEyNzA2NTYsICAgIDEyNzA2NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZjVjNzJkOAorMCwgICAgMTI3MTgwOCwgICAgMTI3MTgwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDBlNjA3YTM4CiswLCAgICAxMjcyOTYwLCAgICAxMjcyOTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmNiMDgxOWMKKzAsICAgIDEyNzQxMTIsICAgIDEyNzQxMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ZTI4ODBhYQorMCwgICAgMTI3NTI2NCwgICAgMTI3NTI2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGI0NmY2OWY5CiswLCAgICAxMjc2NDE2LCAgICAxMjc2NDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmM4MDdlYWIKKzAsICAgIDEyNzc1NjgsICAgIDEyNzc1NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5MTIzN2NmOQorMCwgICAgMTI3ODcyMCwgICAgMTI3ODcyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGI2YmY4MmI2CiswLCAgICAxMjc5ODcyLCAgICAxMjc5ODcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmNkNThkYWYKKzAsICAgIDEyODEwMjQsICAgIDEyODEwMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1M2IxNzZmNAorMCwgICAgMTI4MjE3NiwgICAgMTI4MjE3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGM3OWQ3NTA3CiswLCAgICAxMjgzMzI4LCAgICAxMjgzMzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODEwNjc3YjIKKzAsICAgIDEyODQ0ODAsICAgIDEyODQ0ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMzE0ODczNworMCwgICAgMTI4NTYzMiwgICAgMTI4NTYzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDJlYjU3NTVhCiswLCAgICAxMjg2Nzg0LCAgICAxMjg2Nzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWJlYzVjZDIKKzAsICAgIDEyODc5MzYsICAgIDEyODc5MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NmM2OGQ0NworMCwgICAgMTI4OTA4OCwgICAgMTI4OTA4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDU1ZDE4NzcwCiswLCAgICAxMjkwMjQwLCAgICAxMjkwMjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTM5OTdkZWYKKzAsICAgIDEyOTEzOTIsICAgIDEyOTEzOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyM2NkODQzNworMCwgICAgMTI5MjU0NCwgICAgMTI5MjU0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDVjZDA3OTQyCiswLCAgICAxMjkzNjk2LCAgICAxMjkzNjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDNhYjZiNGMKKzAsICAgIDEyOTQ4NDgsICAgIDEyOTQ4NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNTU3ODhlYworMCwgICAgMTI5NjAwMCwgICAgMTI5NjAwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDZiNjk3ODhlCiswLCAgICAxMjk3MTUyLCAgICAxMjk3MTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2FjYjhmZWEKKzAsICAgIDEyOTgzMDQsICAgIDEyOTgzMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MzQwN2ViZAorMCwgICAgMTI5OTQ1NiwgICAgMTI5OTQ1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDk5ODI3NWYzCiswLCAgICAxMzAwNjA4LCAgICAxMzAwNjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGNhNzZkY2MKKzAsICAgIDEzMDE3NjAsICAgIDEzMDE3NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMWZmN2M2YQorMCwgICAgMTMwMjkxMiwgICAgMTMwMjkxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDRhNTk3NjgzCiswLCAgICAxMzA0MDY0LCAgICAxMzA0MDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzhlNTdmMTYKKzAsICAgIDEzMDUyMTYsICAgIDEzMDUyMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzNzZkODJmYgorMCwgICAgMTMwNjM2OCwgICAgMTMwNjM2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ4OWI4MTY0CiswLCAgICAxMzA3NTIwLCAgICAxMzA3NTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWNlMjdmNzcKKzAsICAgIDEzMDg2NzIsICAgIDEzMDg2NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0YzE5N2U4ZgorMCwgICAgMTMwOTgyNCwgICAgMTMwOTgyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDZlYjA3NzM5CiswLCAgICAxMzEwOTc2LCAgICAxMzEwOTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWY2MjgxNDUKKzAsICAgIDEzMTIxMjgsICAgIDEzMTIxMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NDlkNmYxMgorMCwgICAgMTMxMzI4MCwgICAgMTMxMzI4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGJlNTY2YjcwCiswLCAgICAxMzE0NDMyLCAgICAxMzE0NDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmJkZTg3ZDMKKzAsICAgIDEzMTU1ODQsICAgIDEzMTU1ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZmZkNzE3NQorMCwgICAgMTMxNjczNiwgICAgMTMxNjczNiwgICAgIDExNTIsICAgICAyMzA0LCAweDQ3ZDI4YThiCiswLCAgICAxMzE3ODg4LCAgICAxMzE3ODg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmY2YzcxOGUKKzAsICAgIDEzMTkwNDAsICAgIDEzMTkwNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NjVlNzkzNworMCwgICAgMTMyMDE5MiwgICAgMTMyMDE5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDczNTM4ZThkCiswLCAgICAxMzIxMzQ0LCAgICAxMzIxMzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTYxNjdkNzEKKzAsICAgIDEzMjI0OTYsICAgIDEzMjI0OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZDAyNzhlZAorMCwgICAgMTMyMzY0OCwgICAgMTMyMzY0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDliYWY3YTUxCiswLCAgICAxMzI0ODAwLCAgICAxMzI0ODAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGMwNTgxMDUKKzAsICAgIDEzMjU5NTIsICAgIDEzMjU5NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYjk1NzNjYQorMCwgICAgMTMyNzEwNCwgICAgMTMyNzEwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDRhMjI3MWExCiswLCAgICAxMzI4MjU2LCAgICAxMzI4MjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2Q1Mjc2ZjYKKzAsICAgIDEzMjk0MDgsICAgIDEzMjk0MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0M2MwNzZjZAorMCwgICAgMTMzMDU2MCwgICAgMTMzMDU2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDRmZWM4OTI5CiswLCAgICAxMzMxNzEyLCAgICAxMzMxNzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWE3MTY3ZWMKKzAsICAgIDEzMzI4NjQsICAgIDEzMzI4NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzOWZmN2VhNQorMCwgICAgMTMzNDAxNiwgICAgMTMzNDAxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDJkZDU4MzQ4CiswLCAgICAxMzM1MTY4LCAgICAxMzM1MTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDNmYzg3ODIKKzAsICAgIDEzMzYzMjAsICAgIDEzMzYzMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NWE0NjQ5YworMCwgICAgMTMzNzQ3MiwgICAgMTMzNzQ3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDcxNDA3MDY3CiswLCAgICAxMzM4NjI0LCAgICAxMzM4NjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2I2NjdjZTYKKzAsICAgIDEzMzk3NzYsICAgIDEzMzk3NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiMTJlODFhYQorMCwgICAgMTM0MDkyOCwgICAgMTM0MDkyOCwgICAgIDExNTIsICAgICAyMzA0LCAweGMxNjQ2ZWUzCiswLCAgICAxMzQyMDgwLCAgICAxMzQyMDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmI1NTg4NGYKKzAsICAgIDEzNDMyMzIsICAgIDEzNDMyMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOTIzODJiNQorMCwgICAgMTM0NDM4NCwgICAgMTM0NDM4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDE4Zjk3ODU0CiswLCAgICAxMzQ1NTM2LCAgICAxMzQ1NTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDdhNDgwYmUKKzAsICAgIDEzNDY2ODgsICAgIDEzNDY2ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMDg1N2IxNgorMCwgICAgMTM0Nzg0MCwgICAgMTM0Nzg0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGUzMzY4NDYyCiswLCAgICAxMzQ4OTkyLCAgICAxMzQ4OTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2VkMTdhZTgKKzAsICAgIDEzNTAxNDQsICAgIDEzNTAxNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MDIwNzk2ZAorMCwgICAgMTM1MTI5NiwgICAgMTM1MTI5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDI2Nzk3ZmQwCiswLCAgICAxMzUyNDQ4LCAgICAxMzUyNDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGUwODc1NTQKKzAsICAgIDEzNTM2MDAsICAgIDEzNTM2MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmODg2ODA0MAorMCwgICAgMTM1NDc1MiwgICAgMTM1NDc1MiwgICAgIDExNTIsICAgICAyMzA0LCAweDNmMGE3Nzg0CiswLCAgICAxMzU1OTA0LCAgICAxMzU1OTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmU1MTdkNWUKKzAsICAgIDEzNTcwNTYsICAgIDEzNTcwNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZDBiNjZiYworMCwgICAgMTM1ODIwOCwgICAgMTM1ODIwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDc5Yjk2ZDYzCiswLCAgICAxMzU5MzYwLCAgICAxMzU5MzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWFiNDc5M2EKKzAsICAgIDEzNjA1MTIsICAgIDEzNjA1MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMmRiN2Y3ZAorMCwgICAgMTM2MTY2NCwgICAgMTM2MTY2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDkxMDE3OTkyCiswLCAgICAxMzYyODE2LCAgICAxMzYyODE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Zjg4ZjdjYjkKKzAsICAgIDEzNjM5NjgsICAgIDEzNjM5NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwY2M5ODMwOQorMCwgICAgMTM2NTEyMCwgICAgMTM2NTEyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDM4Yjc3Y2I4CiswLCAgICAxMzY2MjcyLCAgICAxMzY2MjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGNiMTg1ZjkKKzAsICAgIDEzNjc0MjQsICAgIDEzNjc0MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjNGEyNzgyNAorMCwgICAgMTM2ODU3NiwgICAgMTM2ODU3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDFjZTk3NjE4CiswLCAgICAxMzY5NzI4LCAgICAxMzY5NzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTQyMzk3NmUKKzAsICAgIDEzNzA4ODAsICAgIDEzNzA4ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYmI3ODFiMgorMCwgICAgMTM3MjAzMiwgICAgMTM3MjAzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDE1NmQ3MWQzCiswLCAgICAxMzczMTg0LCAgICAxMzczMTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2UyMjg2MjUKKzAsICAgIDEzNzQzMzYsICAgIDEzNzQzMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMTgwNzJmMworMCwgICAgMTM3NTQ4OCwgICAgMTM3NTQ4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ2NGI3N2ExCiswLCAgICAxMzc2NjQwLCAgICAxMzc2NjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDIwNDg1NGQKKzAsICAgIDEzNzc3OTIsICAgIDEzNzc3OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0OThjODM3MworMCwgICAgMTM3ODk0NCwgICAgMTM3ODk0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGZlMWE2ZTIzCiswLCAgICAxMzgwMDk2LCAgICAxMzgwMDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzA1Mjg0ZDAKKzAsICAgIDEzODEyNDgsICAgIDEzODEyNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5MTg0ODk4MAorMCwgICAgMTM4MjQwMCwgICAgMTM4MjQwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDI1OTA5OGM1CiswLCAgICAxMzgzNTUyLCAgICAxMzgzNTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTJiMDdjMDIKKzAsICAgIDEzODQ3MDQsICAgIDEzODQ3MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMTcyODlmNgorMCwgICAgMTM4NTg1NiwgICAgMTM4NTg1NiwgICAgIDExNTIsICAgICAyMzA0LCAweGI4NzY4N2JmCiswLCAgICAxMzg3MDA4LCAgICAxMzg3MDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzJkZTc4NDMKKzAsICAgIDEzODgxNjAsICAgIDEzODgxNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZGFmODkzOQorMCwgICAgMTM4OTMxMiwgICAgMTM4OTMxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDBkZmI3NjNjCiswLCAgICAxMzkwNDY0LCAgICAxMzkwNDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzMwMTc0MDgKKzAsICAgIDEzOTE2MTYsICAgIDEzOTE2MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3M2YyN2YxNAorMCwgICAgMTM5Mjc2OCwgICAgMTM5Mjc2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDFjNTE3NTQxCiswLCAgICAxMzkzOTIwLCAgICAxMzkzOTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjM5MDc0OGIKKzAsICAgIDEzOTUwNzIsICAgIDEzOTUwNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNmFjNzFmMworMCwgICAgMTM5NjIyNCwgICAgMTM5NjIyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDYyNzc4NjJkCiswLCAgICAxMzk3Mzc2LCAgICAxMzk3Mzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTIzZDY3OTQKKzAsICAgIDEzOTg1MjgsICAgIDEzOTg1MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMjBhN2YyMAorMCwgICAgMTM5OTY4MCwgICAgMTM5OTY4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDEyZjA3YTA5CiswLCAgICAxNDAwODMyLCAgICAxNDAwODMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Zjk1NjhiMTQKKzAsICAgIDE0MDE5ODQsICAgIDE0MDE5ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZDc4N2ZlYQorMCwgICAgMTQwMzEzNiwgICAgMTQwMzEzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDU3YzU4NjFhCiswLCAgICAxNDA0Mjg4LCAgICAxNDA0Mjg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODI2YjdjYzcKKzAsICAgIDE0MDU0NDAsICAgIDE0MDU0NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3ZDA1NmE5NAorMCwgICAgMTQwNjU5MiwgICAgMTQwNjU5MiwgICAgIDExNTIsICAgICAyMzA0LCAweGJmM2U4YTYwCiswLCAgICAxNDA3NzQ0LCAgICAxNDA3NzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWU1MThjYWIKKzAsICAgIDE0MDg4OTYsICAgIDE0MDg4OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2NGU3Nzk0YgorMCwgICAgMTQxMDA0OCwgICAgMTQxMDA0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDljOTU2OWFjCiswLCAgICAxNDExMjAwLCAgICAxNDExMjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGUxNjc1ODIKKzAsICAgIDE0MTIzNTIsICAgIDE0MTIzNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZDhmNzhiMQorMCwgICAgMTQxMzUwNCwgICAgMTQxMzUwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGVjNTc3ZTYwCiswLCAgICAxNDE0NjU2LCAgICAxNDE0NjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDY4NzdhYTQKKzAsICAgIDE0MTU4MDgsICAgIDE0MTU4MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNTE1Nzc0MgorMCwgICAgMTQxNjk2MCwgICAgMTQxNjk2MCwgICAgIDExNTIsICAgICAyMzA0LCAweGY5YmU2ZjJiCiswLCAgICAxNDE4MTEyLCAgICAxNDE4MTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Zjk1Nzg0YzcKKzAsICAgIDE0MTkyNjQsICAgIDE0MTkyNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YWVjN2UxNQorMCwgICAgMTQyMDQxNiwgICAgMTQyMDQxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDY2NmU3Y2U5CiswLCAgICAxNDIxNTY4LCAgICAxNDIxNTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTc2MzkzYTcKKzAsICAgIDE0MjI3MjAsICAgIDE0MjI3MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMWJiNmQ1YworMCwgICAgMTQyMzg3MiwgICAgMTQyMzg3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDQ4ZDg4MTQ0CiswLCAgICAxNDI1MDI0LCAgICAxNDI1MDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTdkZjgxNzcKKzAsICAgIDE0MjYxNzYsICAgIDE0MjYxNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5MDY0NzZiMQorMCwgICAgMTQyNzMyOCwgICAgMTQyNzMyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDlmNDY3MjNkCiswLCAgICAxNDI4NDgwLCAgICAxNDI4NDgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTZkMzdhMGMKKzAsICAgIDE0Mjk2MzIsICAgIDE0Mjk2MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3M2U1N2JlMgorMCwgICAgMTQzMDc4NCwgICAgMTQzMDc4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDY2NmU4NTk0CiswLCAgICAxNDMxOTM2LCAgICAxNDMxOTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDRiNDgxZDcKKzAsICAgIDE0MzMwODgsICAgIDE0MzMwODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmY2VkODQyNworMCwgICAgMTQzNDI0MCwgICAgMTQzNDI0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDc0Mzk5OWJkCiswLCAgICAxNDM1MzkyLCAgICAxNDM1MzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzFkZDc1OWIKKzAsICAgIDE0MzY1NDQsICAgIDE0MzY1NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NGEyODQ5ZQorMCwgICAgMTQzNzY5NiwgICAgMTQzNzY5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDA3Mzc3ZjU4CiswLCAgICAxNDM4ODQ4LCAgICAxNDM4ODQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmQ4ZjcyMWEKKzAsICAgIDE0NDAwMDAsICAgIDE0NDAwMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0ZDkxNzQyMgorMCwgICAgMTQ0MTE1MiwgICAgMTQ0MTE1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGFhYTQ2ZTJiCiswLCAgICAxNDQyMzA0LCAgICAxNDQyMzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDllNTc1OTcKKzAsICAgIDE0NDM0NTYsICAgIDE0NDM0NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOTMzNzUxMQorMCwgICAgMTQ0NDYwOCwgICAgMTQ0NDYwOCwgICAgIDExNTIsICAgICAyMzA0LCAweGRmZWU4NGMyCiswLCAgICAxNDQ1NzYwLCAgICAxNDQ1NzYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTcyNjZiOGMKKzAsICAgIDE0NDY5MTIsICAgIDE0NDY5MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YmYyN2NmYworMCwgICAgMTQ0ODA2NCwgICAgMTQ0ODA2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGRjNGI4YjI5CiswLCAgICAxNDQ5MjE2LCAgICAxNDQ5MjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjQ5ZTc0NjYKKzAsICAgIDE0NTAzNjgsICAgIDE0NTAzNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmMWQ5NzVmMworMCwgICAgMTQ1MTUyMCwgICAgMTQ1MTUyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGM4NjM3NzRkCiswLCAgICAxNDUyNjcyLCAgICAxNDUyNjcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWZhYjgwYzAKKzAsICAgIDE0NTM4MjQsICAgIDE0NTM4MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxOTU0OGQ2ZgorMCwgICAgMTQ1NDk3NiwgICAgMTQ1NDk3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDE2NTk4M2FjCiswLCAgICAxNDU2MTI4LCAgICAxNDU2MTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmQ2NTgyMDMKKzAsICAgIDE0NTcyODAsICAgIDE0NTcyODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MTc2NzhiMgorMCwgICAgMTQ1ODQzMiwgICAgMTQ1ODQzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDFlZDI2ZGFlCiswLCAgICAxNDU5NTg0LCAgICAxNDU5NTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWNlZjc5NzUKKzAsICAgIDE0NjA3MzYsICAgIDE0NjA3MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZDJiODA0YworMCwgICAgMTQ2MTg4OCwgICAgMTQ2MTg4OCwgICAgIDExNTIsICAgICAyMzA0LCAweGY0NTk3Zjk3CiswLCAgICAxNDYzMDQwLCAgICAxNDYzMDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTA0Yjc1Y2QKKzAsICAgIDE0NjQxOTIsICAgIDE0NjQxOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2YjUwODM3NAorMCwgICAgMTQ2NTM0NCwgICAgMTQ2NTM0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGI2YjQ3OTFmCiswLCAgICAxNDY2NDk2LCAgICAxNDY2NDk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2U2ZDc1MDEKKzAsICAgIDE0Njc2NDgsICAgIDE0Njc2NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5OWVjOGJhYworMCwgICAgMTQ2ODgwMCwgICAgMTQ2ODgwMCwgICAgIDExNTIsICAgICAyMzA0LCAweDY1ZDc3MmI3CiswLCAgICAxNDY5OTUyLCAgICAxNDY5OTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmMyNzYyZmYKKzAsICAgIDE0NzExMDQsICAgIDE0NzExMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmOGE0ODM3OAorMCwgICAgMTQ3MjI1NiwgICAgMTQ3MjI1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDE4MDU3YWQ0CiswLCAgICAxNDczNDA4LCAgICAxNDczNDA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODlhZjc1M2YKKzAsICAgIDE0NzQ1NjAsICAgIDE0NzQ1NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NWE0OGZjNQorMCwgICAgMTQ3NTcxMiwgICAgMTQ3NTcxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDhiNzU3NmFmCiswLCAgICAxNDc2ODY0LCAgICAxNDc2ODY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2RjYjZlNjcKKzAsICAgIDE0NzgwMTYsICAgIDE0NzgwMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlMDJhN2ZmMworMCwgICAgMTQ3OTE2OCwgICAgMTQ3OTE2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDRmMGE3ZDQ4CiswLCAgICAxNDgwMzIwLCAgICAxNDgwMzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OWJhYjgyODcKKzAsICAgIDE0ODE0NzIsICAgIDE0ODE0NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjMWZhODA2MworMCwgICAgMTQ4MjYyNCwgICAgMTQ4MjYyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDQxMGU3ZGQ3CiswLCAgICAxNDgzNzc2LCAgICAxNDgzNzc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDRkZTc3N2YKKzAsICAgIDE0ODQ5MjgsICAgIDE0ODQ5MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MDM2NzVhYworMCwgICAgMTQ4NjA4MCwgICAgMTQ4NjA4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDRkNzY4N2M1CiswLCAgICAxNDg3MjMyLCAgICAxNDg3MjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTBjNjY1MGQKKzAsICAgIDE0ODgzODQsICAgIDE0ODgzODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkN2U2N2I2OQorMCwgICAgMTQ4OTUzNiwgICAgMTQ4OTUzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDQyYjk3ZmFlCiswLCAgICAxNDkwNjg4LCAgICAxNDkwNjg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YThiNTdhOWYKKzAsICAgIDE0OTE4NDAsICAgIDE0OTE4NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjMjQ5NjBhMAorMCwgICAgMTQ5Mjk5MiwgICAgMTQ5Mjk5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDE2MTk4ZmVjCiswLCAgICAxNDk0MTQ0LCAgICAxNDk0MTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjkyOTc0MTYKKzAsICAgIDE0OTUyOTYsICAgIDE0OTUyOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMjliN2QwMAorMCwgICAgMTQ5NjQ0OCwgICAgMTQ5NjQ0OCwgICAgIDExNTIsICAgICAyMzA0LCAweGE5Njc3MTQxCiswLCAgICAxNDk3NjAwLCAgICAxNDk3NjAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODZhNzc5YmYKKzAsICAgIDE0OTg3NTIsICAgIDE0OTg3NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMzg1N2RjZQorMCwgICAgMTQ5OTkwNCwgICAgMTQ5OTkwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGVlNmQ3YzRkCiswLCAgICAxNTAxMDU2LCAgICAxNTAxMDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTcxMjcxNjYKKzAsICAgIDE1MDIyMDgsICAgIDE1MDIyMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2ZTQwN2MyNQorMCwgICAgMTUwMzM2MCwgICAgMTUwMzM2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDgyYTA3YzlhCiswLCAgICAxNTA0NTEyLCAgICAxNTA0NTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjYyMzgxZWYKKzAsICAgIDE1MDU2NjQsICAgIDE1MDU2NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYWI4NmNhOAorMCwgICAgMTUwNjgxNiwgICAgMTUwNjgxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDk3Y2E4N2VkCiswLCAgICAxNTA3OTY4LCAgICAxNTA3OTY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NmI0ODY4ZjIKKzAsICAgIDE1MDkxMjAsICAgIDE1MDkxMjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYjJhOTUzYworMCwgICAgMTUxMDI3MiwgICAgMTUxMDI3MiwgICAgIDExNTIsICAgICAyMzA0LCAweDA2MWU3NzcwCiswLCAgICAxNTExNDI0LCAgICAxNTExNDI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWUwNjcyMjQKKzAsICAgIDE1MTI1NzYsICAgIDE1MTI1NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4OGEyODJhMworMCwgICAgMTUxMzcyOCwgICAgMTUxMzcyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDRlMTQ3NDNlCiswLCAgICAxNTE0ODgwLCAgICAxNTE0ODgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2RiZDhiN2IKKzAsICAgIDE1MTYwMzIsICAgIDE1MTYwMzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjYWU1NzMxMgorMCwgICAgMTUxNzE4NCwgICAgMTUxNzE4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGY5MDM4Y2E3CiswLCAgICAxNTE4MzM2LCAgICAxNTE4MzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDNlYzZmMDcKKzAsICAgIDE1MTk0ODgsICAgIDE1MTk0ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4YzI5NzM1OQorMCwgICAgMTUyMDY0MCwgICAgMTUyMDY0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDhhZjE4MDRjCiswLCAgICAxNTIxNzkyLCAgICAxNTIxNzkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjMwMDg3YzgKKzAsICAgIDE1MjI5NDQsICAgIDE1MjI5NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyMTEyN2NkMQorMCwgICAgMTUyNDA5NiwgICAgMTUyNDA5NiwgICAgIDExNTIsICAgICAyMzA0LCAweGM2Njc3MmJkCiswLCAgICAxNTI1MjQ4LCAgICAxNTI1MjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDVlNjYzMGIKKzAsICAgIDE1MjY0MDAsICAgIDE1MjY0MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMjA2ODhkOQorMCwgICAgMTUyNzU1MiwgICAgMTUyNzU1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGVlMzg3M2NkCiswLCAgICAxNTI4NzA0LCAgICAxNTI4NzA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjI2Mzc4MmIKKzAsICAgIDE1Mjk4NTYsICAgIDE1Mjk4NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmODg3NzE0NAorMCwgICAgMTUzMTAwOCwgICAgMTUzMTAwOCwgICAgIDExNTIsICAgICAyMzA0LCAweGNlMWU2ZjMzCiswLCAgICAxNTMyMTYwLCAgICAxNTMyMTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjA0NTdlNGYKKzAsICAgIDE1MzMzMTIsICAgIDE1MzMzMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkZTkzODdkZgorMCwgICAgMTUzNDQ2NCwgICAgMTUzNDQ2NCwgICAgIDExNTIsICAgICAyMzA0LCAweDVkZjg2ZDFkCiswLCAgICAxNTM1NjE2LCAgICAxNTM1NjE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTQ5MDg3ZWYKKzAsICAgIDE1MzY3NjgsICAgIDE1MzY3NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYmQyNjljNgorMCwgICAgMTUzNzkyMCwgICAgMTUzNzkyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ1MzA4MDZlCiswLCAgICAxNTM5MDcyLCAgICAxNTM5MDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODAwMjdiMWQKKzAsICAgIDE1NDAyMjQsICAgIDE1NDAyMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjY2I0N2M0OAorMCwgICAgMTU0MTM3NiwgICAgMTU0MTM3NiwgICAgIDExNTIsICAgICAyMzA0LCAweDRmMmY4MzI2CiswLCAgICAxNTQyNTI4LCAgICAxNTQyNTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZmUwNDZmMjMKKzAsICAgIDE1NDM2ODAsICAgIDE1NDM2ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1OTM5NzU5YgorMCwgICAgMTU0NDgzMiwgICAgMTU0NDgzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDgzMTQ3MDczCiswLCAgICAxNTQ1OTg0LCAgICAxNTQ1OTg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzllNzdiOTUKKzAsICAgIDE1NDcxMzYsICAgIDE1NDcxMzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MDJkOGU1MQorMCwgICAgMTU0ODI4OCwgICAgMTU0ODI4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDVmNWY4NDkyCiswLCAgICAxNTQ5NDQwLCAgICAxNTQ5NDQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTAxMTZkMGUKKzAsICAgIDE1NTA1OTIsICAgIDE1NTA1OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiODU4Nzg5NAorMCwgICAgMTU1MTc0NCwgICAgMTU1MTc0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDJiMzU3ODkyCiswLCAgICAxNTUyODk2LCAgICAxNTUyODk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTYwZTZjMjAKKzAsICAgIDE1NTQwNDgsICAgIDE1NTQwNDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNTM0ODc0YgorMCwgICAgMTU1NTIwMCwgICAgMTU1NTIwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGRlNjg3MDY0CiswLCAgICAxNTU2MzUyLCAgICAxNTU2MzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTFlZjdmZTQKKzAsICAgIDE1NTc1MDQsICAgIDE1NTc1MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwNzc0NzNjZQorMCwgICAgMTU1ODY1NiwgICAgMTU1ODY1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDFiZTc3Nzc3CiswLCAgICAxNTU5ODA4LCAgICAxNTU5ODA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YWFkYTkwOTYKKzAsICAgIDE1NjA5NjAsICAgIDE1NjA5NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlYWM5NmY3ZQorMCwgICAgMTU2MjExMiwgICAgMTU2MjExMiwgICAgIDExNTIsICAgICAyMzA0LCAweGU5Y2E2ZTcyCiswLCAgICAxNTYzMjY0LCAgICAxNTYzMjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDA4NjgwMzgKKzAsICAgIDE1NjQ0MTYsICAgIDE1NjQ0MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2ODkxNzZmMQorMCwgICAgMTU2NTU2OCwgICAgMTU2NTU2OCwgICAgIDExNTIsICAgICAyMzA0LCAweGRmZGI3Njg0CiswLCAgICAxNTY2NzIwLCAgICAxNTY2NzIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODNjNTVkOTIKKzAsICAgIDE1Njc4NzIsICAgIDE1Njc4NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3NzU4N2I3MAorMCwgICAgMTU2OTAyNCwgICAgMTU2OTAyNCwgICAgIDExNTIsICAgICAyMzA0LCAweDYwOTM3OTQxCiswLCAgICAxNTcwMTc2LCAgICAxNTcwMTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjAwMjY3YmQKKzAsICAgIDE1NzEzMjgsICAgIDE1NzEzMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkMGExNjZlYgorMCwgICAgMTU3MjQ4MCwgICAgMTU3MjQ4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDg4NzE4MTYyCiswLCAgICAxNTczNjMyLCAgICAxNTczNjMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjllMDg0ZmYKKzAsICAgIDE1NzQ3ODQsICAgIDE1NzQ3ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyZGRjOGMwOAorMCwgICAgMTU3NTkzNiwgICAgMTU3NTkzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDg0M2E3MTc4CiswLCAgICAxNTc3MDg4LCAgICAxNTc3MDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWQ5Nzg0YjQKKzAsICAgIDE1NzgyNDAsICAgIDE1NzgyNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5OGFhN2IxZAorMCwgICAgMTU3OTM5MiwgICAgMTU3OTM5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDU4M2U4NDZlCiswLCAgICAxNTgwNTQ0LCAgICAxNTgwNTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTZkMjg0ZWMKKzAsICAgIDE1ODE2OTYsICAgIDE1ODE2OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMDE0N2NiZgorMCwgICAgMTU4Mjg0OCwgICAgMTU4Mjg0OCwgICAgIDExNTIsICAgICAyMzA0LCAweGIzYmY3YjRiCiswLCAgICAxNTg0MDAwLCAgICAxNTg0MDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2Y4Yjc4ZGQKKzAsICAgIDE1ODUxNTIsICAgIDE1ODUxNTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkM2ZiNzYxZgorMCwgICAgMTU4NjMwNCwgICAgMTU4NjMwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDc4MTQ3YzJmCiswLCAgICAxNTg3NDU2LCAgICAxNTg3NDU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NWU3NDdiMjYKKzAsICAgIDE1ODg2MDgsICAgIDE1ODg2MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwZDhlN2Q5NgorMCwgICAgMTU4OTc2MCwgICAgMTU4OTc2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDczNzI4MzYyCiswLCAgICAxNTkwOTEyLCAgICAxNTkwOTEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2M1NDcwN2IKKzAsICAgIDE1OTIwNjQsICAgIDE1OTIwNjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiODljNzgwNgorMCwgICAgMTU5MzIxNiwgICAgMTU5MzIxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDVmMGY3YTkxCiswLCAgICAxNTk0MzY4LCAgICAxNTk0MzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzUyMTdlODQKKzAsICAgIDE1OTU1MjAsICAgIDE1OTU1MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiMzc5ODU1MworMCwgICAgMTU5NjY3MiwgICAgMTU5NjY3MiwgICAgIDExNTIsICAgICAyMzA0LCAweGQ4Mzc3ZThhCiswLCAgICAxNTk3ODI0LCAgICAxNTk3ODI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MzM5MTgxYmEKKzAsICAgIDE1OTg5NzYsICAgIDE1OTg5NzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiZTE5NmIyYworMCwgICAgMTYwMDEyOCwgICAgMTYwMDEyOCwgICAgIDExNTIsICAgICAyMzA0LCAweGRjNzA4Y2M0CiswLCAgICAxNjAxMjgwLCAgICAxNjAxMjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjQ5Yzc0YzEKKzAsICAgIDE2MDI0MzIsICAgIDE2MDI0MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhYzEyODY0OQorMCwgICAgMTYwMzU4NCwgICAgMTYwMzU4NCwgICAgIDExNTIsICAgICAyMzA0LCAweGNkMjY2YTIyCiswLCAgICAxNjA0NzM2LCAgICAxNjA0NzM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGZkZTcwMjMKKzAsICAgIDE2MDU4ODgsICAgIDE2MDU4ODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmOTJkNzQ1MAorMCwgICAgMTYwNzA0MCwgICAgMTYwNzA0MCwgICAgIDExNTIsICAgICAyMzA0LCAweDljZTM3OWFjCiswLCAgICAxNjA4MTkyLCAgICAxNjA4MTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWU1ZTcxMmUKKzAsICAgIDE2MDkzNDQsICAgIDE2MDkzNDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhMTI2NzZjMAorMCwgICAgMTYxMDQ5NiwgICAgMTYxMDQ5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDRjZWU3YmUxCiswLCAgICAxNjExNjQ4LCAgICAxNjExNjQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTBjODgxZTUKKzAsICAgIDE2MTI4MDAsICAgIDE2MTI4MDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhNmE3ODE1OAorMCwgICAgMTYxMzk1MiwgICAgMTYxMzk1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGQyNDg4NjRhCiswLCAgICAxNjE1MTA0LCAgICAxNjE1MTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2E4OTcyYjQKKzAsICAgIDE2MTYyNTYsICAgIDE2MTYyNTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YzhhNzVjYgorMCwgICAgMTYxNzQwOCwgICAgMTYxNzQwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDA3NjA2NzIyCiswLCAgICAxNjE4NTYwLCAgICAxNjE4NTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmY0OTdhYWUKKzAsICAgIDE2MTk3MTIsICAgIDE2MTk3MTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmZmFiN2Q2NgorMCwgICAgMTYyMDg2NCwgICAgMTYyMDg2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGVmZGM3ZDA1CiswLCAgICAxNjIyMDE2LCAgICAxNjIyMDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDJkNjg2ZGQKKzAsICAgIDE2MjMxNjgsICAgIDE2MjMxNjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4NTJlNmViNgorMCwgICAgMTYyNDMyMCwgICAgMTYyNDMyMCwgICAgIDExNTIsICAgICAyMzA0LCAweDM0NDU3MDZiCiswLCAgICAxNjI1NDcyLCAgICAxNjI1NDcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDQ2Nzc4MjgKKzAsICAgIDE2MjY2MjQsICAgIDE2MjY2MjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1ZDVjODMzYworMCwgICAgMTYyNzc3NiwgICAgMTYyNzc3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGY0Mjc3ZTA2CiswLCAgICAxNjI4OTI4LCAgICAxNjI4OTI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2VjZTcyYWIKKzAsICAgIDE2MzAwODAsICAgIDE2MzAwODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxMDgzN2FmZgorMCwgICAgMTYzMTIzMiwgICAgMTYzMTIzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDAyNjU3NjJiCiswLCAgICAxNjMyMzg0LCAgICAxNjMyMzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MGZjOTc5ZGUKKzAsICAgIDE2MzM1MzYsICAgIDE2MzM1MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlZWNmNzAxMAorMCwgICAgMTYzNDY4OCwgICAgMTYzNDY4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDMxMzk3NWNkCiswLCAgICAxNjM1ODQwLCAgICAxNjM1ODQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Y2NjZTg0YTcKKzAsICAgIDE2MzY5OTIsICAgIDE2MzY5OTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MjNlNjkzNQorMCwgICAgMTYzODE0NCwgICAgMTYzODE0NCwgICAgIDExNTIsICAgICAyMzA0LCAweGEwNjA2YWRlCiswLCAgICAxNjM5Mjk2LCAgICAxNjM5Mjk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmMyZDc4NjYKKzAsICAgIDE2NDA0NDgsICAgIDE2NDA0NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzYTVhNzgxZQorMCwgICAgMTY0MTYwMCwgICAgMTY0MTYwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGRhZjY3N2ZkCiswLCAgICAxNjQyNzUyLCAgICAxNjQyNzUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NzlkODhhY2EKKzAsICAgIDE2NDM5MDQsICAgIDE2NDM5MDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzZGIyNzMwOAorMCwgICAgMTY0NTA1NiwgICAgMTY0NTA1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDYyNzE3NWZmCiswLCAgICAxNjQ2MjA4LCAgICAxNjQ2MjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDA2OTdiMTYKKzAsICAgIDE2NDczNjAsICAgIDE2NDczNjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg0MGU0N2VlNworMCwgICAgMTY0ODUxMiwgICAgMTY0ODUxMiwgICAgIDExNTIsICAgICAyMzA0LCAweDZhNmE3ZDkxCiswLCAgICAxNjQ5NjY0LCAgICAxNjQ5NjY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGQzZThhMzIKKzAsICAgIDE2NTA4MTYsICAgIDE2NTA4MTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1NzZhODE3ZQorMCwgICAgMTY1MTk2OCwgICAgMTY1MTk2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDg2Mjg3ZjliCiswLCAgICAxNjUzMTIwLCAgICAxNjUzMTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NDNlMDgxY2UKKzAsICAgIDE2NTQyNzIsICAgIDE2NTQyNzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNDRiODAwMworMCwgICAgMTY1NTQyNCwgICAgMTY1NTQyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGZiMjM3ZjViCiswLCAgICAxNjU2NTc2LCAgICAxNjU2NTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Mjg5NjdjOGEKKzAsICAgIDE2NTc3MjgsICAgIDE2NTc3MjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5NzQ3ODgyOQorMCwgICAgMTY1ODg4MCwgICAgMTY1ODg4MCwgICAgIDExNTIsICAgICAyMzA0LCAweDYxNTU3MGU4CiswLCAgICAxNjYwMDMyLCAgICAxNjYwMDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YTUyYzdkMzQKKzAsICAgIDE2NjExODQsICAgIDE2NjExODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNTU0NzNlOAorMCwgICAgMTY2MjMzNiwgICAgMTY2MjMzNiwgICAgIDExNTIsICAgICAyMzA0LCAweDA4YTA3ZDZjCiswLCAgICAxNjYzNDg4LCAgICAxNjYzNDg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MmVlZDkxNmEKKzAsICAgIDE2NjQ2NDAsICAgIDE2NjQ2NDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4Y2UzNmNlYworMCwgICAgMTY2NTc5MiwgICAgMTY2NTc5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDc3NWU4OTkyCiswLCAgICAxNjY2OTQ0LCAgICAxNjY2OTQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTlhZDgxNmIKKzAsICAgIDE2NjgwOTYsICAgIDE2NjgwOTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2OTdhNzBiZQorMCwgICAgMTY2OTI0OCwgICAgMTY2OTI0OCwgICAgIDExNTIsICAgICAyMzA0LCAweDM4YzQ2Y2YyCiswLCAgICAxNjcwNDAwLCAgICAxNjcwNDAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjlkNjgxZjQKKzAsICAgIDE2NzE1NTIsICAgIDE2NzE1NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhNzMzNmZlYQorMCwgICAgMTY3MjcwNCwgICAgMTY3MjcwNCwgICAgIDExNTIsICAgICAyMzA0LCAweGQyYTk3ZTU5CiswLCAgICAxNjczODU2LCAgICAxNjczODU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MDJiODgwZTkKKzAsICAgIDE2NzUwMDgsICAgIDE2NzUwMDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyYTQ4NmU5ZQorMCwgICAgMTY3NjE2MCwgICAgMTY3NjE2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDVmMTk3YzQzCiswLCAgICAxNjc3MzEyLCAgICAxNjc3MzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjY2Njc5YWQKKzAsICAgIDE2Nzg0NjQsICAgIDE2Nzg0NjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3Y2ZkN2M4YQorMCwgICAgMTY3OTYxNiwgICAgMTY3OTYxNiwgICAgIDExNTIsICAgICAyMzA0LCAweDQzYjY4MWJiCiswLCAgICAxNjgwNzY4LCAgICAxNjgwNzY4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjMzMDljZmYKKzAsICAgIDE2ODE5MjAsICAgIDE2ODE5MjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4MGYzNmY3ZAorMCwgICAgMTY4MzA3MiwgICAgMTY4MzA3MiwgICAgIDExNTIsICAgICAyMzA0LCAweGNlYWQ3Yjk4CiswLCAgICAxNjg0MjI0LCAgICAxNjg0MjI0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ODQ3NTk5MmYKKzAsICAgIDE2ODUzNzYsICAgIDE2ODUzNzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3NDY3ODJkMgorMCwgICAgMTY4NjUyOCwgICAgMTY4NjUyOCwgICAgIDExNTIsICAgICAyMzA0LCAweDJiNDg2OTgyCiswLCAgICAxNjg3NjgwLCAgICAxNjg3NjgwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzgwYzdmYzIKKzAsICAgIDE2ODg4MzIsICAgIDE2ODg4MzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgxNDhjN2MzYgorMCwgICAgMTY4OTk4NCwgICAgMTY4OTk4NCwgICAgIDExNTIsICAgICAyMzA0LCAweDQ5YzQ3N2RmCiswLCAgICAxNjkxMTM2LCAgICAxNjkxMTM2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MWJmOTdjNTYKKzAsICAgIDE2OTIyODgsICAgIDE2OTIyODgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4OWEzODIyMQorMCwgICAgMTY5MzQ0MCwgICAgMTY5MzQ0MCwgICAgIDExNTIsICAgICAyMzA0LCAweGNiNzU3YTMxCiswLCAgICAxNjk0NTkyLCAgICAxNjk0NTkyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZDNiYjcyZmEKKzAsICAgIDE2OTU3NDQsICAgIDE2OTU3NDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhlNTcyNzY1MAorMCwgICAgMTY5Njg5NiwgICAgMTY5Njg5NiwgICAgIDExNTIsICAgICAyMzA0LCAweDVkNGU5MjQyCiswLCAgICAxNjk4MDQ4LCAgICAxNjk4MDQ4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjkyMDdmNzUKKzAsICAgIDE2OTkyMDAsICAgIDE2OTkyMDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg1YjFkOTU0YQorMCwgICAgMTcwMDM1MiwgICAgMTcwMDM1MiwgICAgIDExNTIsICAgICAyMzA0LCAweGEyODg4MjIzCiswLCAgICAxNzAxNTA0LCAgICAxNzAxNTA0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZTMxZDhhZjcKKzAsICAgIDE3MDI2NTYsICAgIDE3MDI2NTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgyOWVlODJkZAorMCwgICAgMTcwMzgwOCwgICAgMTcwMzgwOCwgICAgIDExNTIsICAgICAyMzA0LCAweDRiMWQ3ODg3CiswLCAgICAxNzA0OTYwLCAgICAxNzA0OTYwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YzAzMDgyMzYKKzAsICAgIDE3MDYxMTIsICAgIDE3MDYxMTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhZWQ2OGU5MgorMCwgICAgMTcwNzI2NCwgICAgMTcwNzI2NCwgICAgIDExNTIsICAgICAyMzA0LCAweGJjMTE3MWU5CiswLCAgICAxNzA4NDE2LCAgICAxNzA4NDE2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4Mzc5ZjgyOGIKKzAsICAgIDE3MDk1NjgsICAgIDE3MDk1NjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4M2RlNzJjOAorMCwgICAgMTcxMDcyMCwgICAgMTcxMDcyMCwgICAgIDExNTIsICAgICAyMzA0LCAweGIxMWE4MDZhCiswLCAgICAxNzExODcyLCAgICAxNzExODcyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4N2FjMTdlN2EKKzAsICAgIDE3MTMwMjQsICAgIDE3MTMwMjQsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwMzFiN2Q5YQorMCwgICAgMTcxNDE3NiwgICAgMTcxNDE3NiwgICAgIDExNTIsICAgICAyMzA0LCAweGViYzk3YzQzCiswLCAgICAxNzE1MzI4LCAgICAxNzE1MzI4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTE0ZTg2YTcKKzAsICAgIDE3MTY0ODAsICAgIDE3MTY0ODAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg4OGUyNzQ3ZQorMCwgICAgMTcxNzYzMiwgICAgMTcxNzYzMiwgICAgIDExNTIsICAgICAyMzA0LCAweDE1MzA3NmJjCiswLCAgICAxNzE4Nzg0LCAgICAxNzE4Nzg0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZGFjYzdlYmIKKzAsICAgIDE3MTk5MzYsICAgIDE3MTk5MzYsICAgICAxMTUyLCAgICAgMjMwNCwgMHgwOTA1NzA5YQorMCwgICAgMTcyMTA4OCwgICAgMTcyMTA4OCwgICAgIDExNTIsICAgICAyMzA0LCAweDEzMzU4MTA5CiswLCAgICAxNzIyMjQwLCAgICAxNzIyMjQwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MTgyMjcyMjgKKzAsICAgIDE3MjMzOTIsICAgIDE3MjMzOTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHgzMTgwODJkNworMCwgICAgMTcyNDU0NCwgICAgMTcyNDU0NCwgICAgIDExNTIsICAgICAyMzA0LCAweDhhZWM3YThlCiswLCAgICAxNzI1Njk2LCAgICAxNzI1Njk2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OGM5Yzc3NTUKKzAsICAgIDE3MjY4NDgsICAgIDE3MjY4NDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhkYmE0NmUyZgorMCwgICAgMTcyODAwMCwgICAgMTcyODAwMCwgICAgIDExNTIsICAgICAyMzA0LCAweGQ0N2Q3ZjVhCiswLCAgICAxNzI5MTUyLCAgICAxNzI5MTUyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZWIxMzcwZWMKKzAsICAgIDE3MzAzMDQsICAgIDE3MzAzMDQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhmNmQ2OGU3NAorMCwgICAgMTczMTQ1NiwgICAgMTczMTQ1NiwgICAgIDExNTIsICAgICAyMzA0LCAweDNkNWE3YzY2CiswLCAgICAxNzMyNjA4LCAgICAxNzMyNjA4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjY0YjZkNjgKKzAsICAgIDE3MzM3NjAsICAgIDE3MzM3NjAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3Y2RlOGI5ZgorMCwgICAgMTczNDkxMiwgICAgMTczNDkxMiwgICAgIDExNTIsICAgICAyMzA0LCAweGJhNDY3MzQ3CiswLCAgICAxNzM2MDY0LCAgICAxNzM2MDY0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4OTIxOTg3ZjcKKzAsICAgIDE3MzcyMTYsICAgIDE3MzcyMTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5YzZjN2ZjZQorMCwgICAgMTczODM2OCwgICAgMTczODM2OCwgICAgIDExNTIsICAgICAyMzA0LCAweDAyY2I4MjhmCiswLCAgICAxNzM5NTIwLCAgICAxNzM5NTIwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4M2I0MjcwNzcKKzAsICAgIDE3NDA2NzIsICAgIDE3NDA2NzIsICAgICAxMTUyLCAgICAgMjMwNCwgMHg2ZjljNzUyMworMCwgICAgMTc0MTgyNCwgICAgMTc0MTgyNCwgICAgIDExNTIsICAgICAyMzA0LCAweGVmNjg4MjA0CiswLCAgICAxNzQyOTc2LCAgICAxNzQyOTc2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4MjYzNzgyZGMKKzAsICAgIDE3NDQxMjgsICAgIDE3NDQxMjgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNmNhN2U0NgorMCwgICAgMTc0NTI4MCwgICAgMTc0NTI4MCwgICAgIDExNTIsICAgICAyMzA0LCAweGIwOTI5NjM2CiswLCAgICAxNzQ2NDMyLCAgICAxNzQ2NDMyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NjBhOTdiN2EKKzAsICAgIDE3NDc1ODQsICAgIDE3NDc1ODQsICAgICAxMTUyLCAgICAgMjMwNCwgMHhjZjAzNzY5MAorMCwgICAgMTc0ODczNiwgICAgMTc0ODczNiwgICAgIDExNTIsICAgICAyMzA0LCAweGM5MDQ2YTI1CiswLCAgICAxNzQ5ODg4LCAgICAxNzQ5ODg4LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YmYyNDdmM2MKKzAsICAgIDE3NTEwNDAsICAgIDE3NTEwNDAsICAgICAxMTUyLCAgICAgMjMwNCwgMHg3MWU3N2QzNAorMCwgICAgMTc1MjE5MiwgICAgMTc1MjE5MiwgICAgIDExNTIsICAgICAyMzA0LCAweDk2Y2U3YTAxCiswLCAgICAxNzUzMzQ0LCAgICAxNzUzMzQ0LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4ZjliMDdhMjcKKzAsICAgIDE3NTQ0OTYsICAgIDE3NTQ0OTYsICAgICAxMTUyLCAgICAgMjMwNCwgMHg5ODRiODMwYgorMCwgICAgMTc1NTY0OCwgICAgMTc1NTY0OCwgICAgIDExNTIsICAgICAyMzA0LCAweGZmMTE4MjJiCiswLCAgICAxNzU2ODAwLCAgICAxNzU2ODAwLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjBhMTg1NzgKKzAsICAgIDE3NTc5NTIsICAgIDE3NTc5NTIsICAgICAxMTUyLCAgICAgMjMwNCwgMHhhOWQ5OGVmOAorMCwgICAgMTc1OTEwNCwgICAgMTc1OTEwNCwgICAgIDExNTIsICAgICAyMzA0LCAweDRmOTA3NmUxCiswLCAgICAxNzYwMjU2LCAgICAxNzYwMjU2LCAgICAgMTE1MiwgICAgIDIzMDQsIDB4YjYzYzc3NDIKKzAsICAgIDE3NjE0MDgsICAgIDE3NjE0MDgsICAgICAxMTUyLCAgICAgMjMwNCwgMHhiNGMwNmFlMgorMCwgICAgMTc2MjU2MCwgICAgMTc2MjU2MCwgICAgIDExNTIsICAgICAyMzA0LCAweDQxNzM4NTMxCiswLCAgICAxNzYzNzEyLCAgICAxNzYzNzEyLCAgICAgMTE1MiwgICAgIDIzMDQsIDB4NTUxMjVlN2IKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ocTJ4IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhxMngKaW5kZXggZGNmMmEyOS4uMmMxZDhiNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhxMngKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhxMngKQEAgLTEsMyArMSw3IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzgyeDU3NAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDg3NzA3MiwgMHg5MzY5MzM5ZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgODc3MDcyLCAweDMyZDExOWExCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaHEzeCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ocTN4CmluZGV4IDgyMTUzODguLmE3ZGI5OWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ocTN4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ocTN4CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDU3M3g4NjEKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDE5NzM0MTIsIDB4YWZjMjI3ZmEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMTk3MzQxMiwgMHg5M2FlYmYxOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhxNHggYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaHE0eAppbmRleCBjMWQ2ZmQ4Li42NzAyZmU0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaHE0eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaHE0eApAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3NjR4MTE0OAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzUwODI4OCwgMHgwMzRlZjc1ZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzNTA4Mjg4LCAweDczOGU5YmJiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaHFkbjNkIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhxZG4zZAppbmRleCA2ZjEyMWMzLi5kNjQ5NjI5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaHFkbjNkCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ocWRuM2QKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwYzA5ODgzYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGZjMjc0OGEwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4Yjc0NmVlYTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1ocWRuM2Qtc2FtcGxlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhxZG4zZC1zYW1wbGUKaW5kZXggOTc3MThmOS4uMjRkMjVhNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhxZG4zZC1zYW1wbGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhxZG4zZC1zYW1wbGUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS85CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDJjODEwNDY1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTU3YzA1NjMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgMHg3ODZjNmQ1YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWhzdGFjayBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1oc3RhY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5YWZlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1oc3RhY2sKQEAgLTAsMCArMSw1NSBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcwNHgyODgKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4OTAxYTEzZWQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNDEyOCwgMHg3OTNjY2FhMgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA0MTI4LCAweDllYWZlY2EzCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAzMDQxMjgsIDB4MThmMDAxNmYKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDMwNDEyOCwgMHhjOTBmNmNiMworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMzA0MTI4LCAweDgyZDc1MWRiCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAzMDQxMjgsIDB4N2NkMmY4NDYKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDMwNDEyOCwgMHhiMzgwMTc2NworMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMzA0MTI4LCAweDMzNzIwMDViCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAzMDQxMjgsIDB4ODIyYTcyMmEKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDMwNDEyOCwgMHgwNTkwOGVjMAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMzA0MTI4LCAweGFiYmJmOWI5CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAzMDQxMjgsIDB4MWIzNDVhZDEKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDMwNDEyOCwgMHg2Y2NkNDQ1NQorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMzA0MTI4LCAweGFkNTQxYmM5CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MTYyMzFlMGEKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDMwNDEyOCwgMHhiMmIyOWMzMAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMzA0MTI4LCAweDVjNmQ3MTkwCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAzMDQxMjgsIDB4NzMzY2Q1OTgKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDMwNDEyOCwgMHg2MDVmYjgwZAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMzA0MTI4LCAweDlmMjFlYWVmCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAzMDQxMjgsIDB4YjZmMTQ4MjQKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDMwNDEyOCwgMHg3ODkzM2FiMgorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMzA0MTI4LCAweDNmZDJkMWRlCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAzMDQxMjgsIDB4NjJjMWYzYmIKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDMwNDEyOCwgMHgyZDA2MzI3YgorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMzA0MTI4LCAweGRiZDIyZDc5CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAzMDQxMjgsIDB4OWRjOWIxMWQKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDMwNDEyOCwgMHgwNTkxNDhiOQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMzA0MTI4LCAweDA0YTFjYTFjCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4YmEzOWQ1OTQKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDMwNDEyOCwgMHhjMzhlOGE0YgorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMzA0MTI4LCAweDJlYTdmOTI5CiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZmQ5NmY0NjAKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDMwNDEyOCwgMHg5NTJiODZmMAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMzA0MTI4LCAweDZiZDgyYTA1CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAzMDQxMjgsIDB4NDBiOTZmNTYKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDMwNDEyOCwgMHg4NjcwMDNmMAorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMzA0MTI4LCAweGU2ZmViMjk4CiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZWM0MDlkYmEKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDMwNDEyOCwgMHg5ODE2YjI0YQorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMzA0MTI4LCAweGUyZmMzYzFmCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAzMDQxMjgsIDB4NjcyMjdmNjEKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDMwNDEyOCwgMHgxNmUxNDFkOAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMzA0MTI4LCAweGVkNTQwOGUyCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAzMDQxMjgsIDB4OGExNGZjZTYKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDMwNDEyOCwgMHhlY2JkYTdmZQorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMzA0MTI4LCAweGZhMGM4YjkzCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAzMDQxMjgsIDB4NDdmZTY5MTUKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDMwNDEyOCwgMHg5NTcwYjFlMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWlkZXQgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaWRldAppbmRleCA2MjgzMDM5Li5hMGY1NzlkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaWRldAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaWRldApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4NDMyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDZlNGY4OWVmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4N2Y1ZjY1NTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjNTY2ZjY0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWludGVybGFjZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1pbnRlcmxhY2UKaW5kZXggNDY1OTk0Mi4uMjQ0MjNjYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWludGVybGFjZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaW50ZXJsYWNlCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDIvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjA3N2RiMzgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzZDRmMWIxNQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ0NzU5NGY2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaW50ZXJsYWNlLWNvbXBsZXggYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItaW50ZXJsYWNlLWNvbXBsZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkYjQ2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1pbnRlcmxhY2UtY29tcGxleApAQCAtMCwwICsxLDMwIEBACisjdGIgMDogMi8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3NzhhYjBjMQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGRjMzBmN2MzCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4Y2I2Mzc0NjcKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjYmY3NzhjZQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTUyMDY0LCAweDU3M2Q5ZjZkCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDc5NGRmMmMKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzZTg4NTQ0OAorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTUyMDY0LCAweGNjZWMxNzk0CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmYzMmY1MWEKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDE1MjA2NCwgMHgwNjU3ZjVhYworMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGZhODJkNjAwCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTVmZjdmMzIKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxY2FjMDM0MgorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMTUyMDY0LCAweDZhZmI3YzQ5CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmM0N2Q1NTQKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlMGZiZDEzMgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMTUyMDY0LCAweDRmODkxZThkCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ODg1NTQwNDUKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwYzhlNjE5MgorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMTUyMDY0LCAweGY3M2M5MWMzCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NDlhYzMyOGQKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmMThlYmQ4MgorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDMzNTk3NjBkCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NWM4NTYwMWEKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyOGMxNjU3YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWxhdmQtbGlmZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1sYXZkLWxpZmUKaW5kZXggNTY1Zjg4YS4uNDg1NDZhYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWxhdmQtbGlmZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbGF2ZC1saWZlCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDB4NDAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDQ4MDAsIDB4ZjJhMTViMTUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgNDgwMCwgMHg3OGMyOWRjZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgICA0ODAwLCAweDI4NTA5ZDZlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbGF2ZC1zY2FsZW5vcm0gYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbGF2ZC1zY2FsZW5vcm0KaW5kZXggYzk0NmI1Yy4uN2I5YTYwYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWxhdmQtc2NhbGVub3JtCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1sYXZkLXNjYWxlbm9ybQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHg5NgorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxODQzMiwgMHhhYzQ4NGRiNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDE4NDMyLCAweDk0NzM0ZGI2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMTg0MzIsIDB4M2ZhYzRkYjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1sYXZkLXRlc3RzcmMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbGF2ZC10ZXN0c3JjCmluZGV4IDBlYTVhNDkuLmE0MjFjYzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1sYXZkLXRlc3RzcmMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLWxhdmQtdGVzdHNyYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4ODhjNGQxOWEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMDQwMCwgMHhjYzkzMGEyZQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMwNDAwLCAweDhlMWIwZTIzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWNkZWludC1mYXN0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1jZGVpbnQtZmFzdAppbmRleCAwMDBkNDNiLi5lNGMyZjhhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWNkZWludC1mYXN0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tY2RlaW50LWZhc3QKQEAgLTEsMzEgKzEsMzUgQEAKICN0YiAwOiAxLzI1Ci0wLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICA2MjIwODAsIDB4YjNiNjZjNWMKLTAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDYyMjA4MCwgMHhjNjU2OGJkNwotMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgNjIyMDgwLCAweGE1YjU0M2MzCi0wLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICA2MjIwODAsIDB4NDA5NWFjNTEKLTAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhjY2Q4YzFkOQotMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgNjIyMDgwLCAweDg0YTg4ZjIyCi0wLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICA2MjIwODAsIDB4NzI3M2MyNmIKLTAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhYzE4OGM0MQotMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgNjIyMDgwLCAweGYzMmY2ZmI0Ci0wLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZDY5NmNjY2UKLTAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDYyMjA4MCwgMHg5Nzc4YTQxOAotMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgNjIyMDgwLCAweGYyYjViZTJlCi0wLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICA2MjIwODAsIDB4NjUzZWUxMmEKLTAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDYyMjA4MCwgMHhlN2ZjZTE4OAotMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgNjIyMDgwLCAweDZlOWYxZGViCi0wLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICA2MjIwODAsIDB4MzMwOTBhYWMKLTAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4NDBhNTdmMQotMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgNjIyMDgwLCAweDYzNWU0MzBhCi0wLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICA2MjIwODAsIDB4NTJmOTg4MDkKLTAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDYyMjA4MCwgMHhjNTY3YjZhNQotMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgNjIyMDgwLCAweDQxMzRmNTgzCi0wLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZDAyYTczYmMKLTAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3NjMwODVkNgotMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgNjIyMDgwLCAweDc3ZmRjN2E2Ci0wLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICA2MjIwODAsIDB4NzdmNzFiOWYKLTAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3MWM5MTI0NAotMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgNjIyMDgwLCAweGM3Yjg2ZGE1Ci0wLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICA2MjIwODAsIDB4MWVkZjg4OTAKLTAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDYyMjA4MCwgMHgwM2M4MmJlYwotMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDE0OGI2YTA0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NTc2Cisjc2FyIDA6IDE2LzE1CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZmY0OTZiZjUKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1MTNjOGJkOQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgNjIyMDgwLCAweDRlNDc0MzY4CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICA2MjIwODAsIDB4MTI0OGFiZTkKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhNzA1YzE1OAorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgNjIyMDgwLCAweGY5MDQ4ZTk1CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICA2MjIwODAsIDB4NzhiNWMxYTIKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgwZWZhOGJlOAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgNjIyMDgwLCAweGQzMzk2ZWFjCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICA2MjIwODAsIDB4NTg3MGNiZGQKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDYyMjA4MCwgMHgwODZmYTMxMQorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDdjZTliY2VkCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZTdlMGUwZTEKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1YWYzZTE0YgorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgNjIyMDgwLCAweGJmMjIxZDk2CiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICA2MjIwODAsIDB4NDNkOTBhNjIKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyNjdhNTdiNgorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgNjIyMDgwLCAweDg4ZDk0MmViCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICA2MjIwODAsIDB4MzRmZjg3YmYKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhODQ5YjVlYworMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgNjIyMDgwLCAweDgzMDJmNTFmCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICA2MjIwODAsIDB4YWM5ZTczMTUKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDYyMjA4MCwgMHgzOGIyODRmYworMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgNjIyMDgwLCAweDFmZjBjNmM0CiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICA2MjIwODAsIDB4NTBiZjFiYTUKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDYyMjA4MCwgMHhlOWJkMTI0MAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDIyMTE2ZGEzCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICA2MjIwODAsIDB4NmYzZTg4N2EKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0NmI4MmJjNQorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgNjIyMDgwLCAweGVhYWY2OWVlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWNkZWludC1tZWRpdW0gYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWNkZWludC1tZWRpdW0KaW5kZXggY2ZkNTA0Zi4uMWIwMjYxOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1jZGVpbnQtbWVkaXVtCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tY2RlaW50LW1lZGl1bQpAQCAtMSwzMSArMSwzNSBAQAogI3RiIDA6IDEvMjUKLTAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDYyMjA4MCwgMHhiM2I2NmM1YwotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDI2YTI5MTUyCi0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA2MjIwODAsIDB4Nzg3YWRkZGMKLTAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDYyMjA4MCwgMHhjYzUyZGYwOAotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgNjIyMDgwLCAweDUzZGFkMTI2Ci0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZTE0NDg2NTIKLTAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDYyMjA4MCwgMHgxNTlmZDM1MwotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgNjIyMDgwLCAweGNiZTg5M2EwCi0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICA2MjIwODAsIDB4NDNhNjdjNmIKLTAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDYyMjA4MCwgMHhlZjMwY2FmOQotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNjIyMDgwLCAweGE5Y2VhNjJiCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA2MjIwODAsIDB4NGM0Y2FkYTEKLTAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4ZTkxZjZkZQotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNjIyMDgwLCAweGIwM2VmMDQ0Ci0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA2MjIwODAsIDB4NmI1NDI2MmIKLTAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDYyMjA4MCwgMHg5MTFlMGNlYQotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDgzMjA2MzJjCi0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA2MjIwODAsIDB4MmJkZTQyYjIKLTAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDYyMjA4MCwgMHhlOWQ5ODhjMwotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNjIyMDgwLCAweGE5ZjBiMWRiCi0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA2MjIwODAsIDB4YjViY2YxODYKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0NjljNjcxNwotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNjIyMDgwLCAweDJjYTg4M2U2Ci0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA2MjIwODAsIDB4NGY1ZmJhNzIKLTAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhMmU0MjNjYQotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNjIyMDgwLCAweGMxZmIwYWFmCi0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA2MjIwODAsIDB4OTZhODc5YjgKLTAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyMTJlOTJlNgotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNjIyMDgwLCAweDlmMjYzNzhhCi0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZGVhZjc3YWIKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMTYvMTUKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDYyMjA4MCwgMHhmZjQ5NmJmNQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgNjIyMDgwLCAweGMwZTQ5MTJjCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA2MjIwODAsIDB4YThhZWRkN2UKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyMDU0ZGViOQorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgNjIyMDgwLCAweDEwMDVkMGNhCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICA2MjIwODAsIDB4NjBmMDg1ZGMKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0ZGEwZDI2MQorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgNjIyMDgwLCAweDk2OGU5NDBlCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICA2MjIwODAsIDB4ODY2ODdiMDQKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkNjNiYzkzZAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNjIyMDgwLCAweDdhYjBhNmU2CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA2MjIwODAsIDB4ODgzZGFiODUKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg5ZjZlZjZiNQorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNjIyMDgwLCAweGNlY2NlZTI1CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA2MjIwODAsIDB4MmFhODIzYTUKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDYyMjA4MCwgMHhiMjBkMGY0OAorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDU3MTU2MGI5CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA2MjIwODAsIDB4YzA5MDQ3NjQKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkYjViODljMworMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDcwN2FhZGM1CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA2MjIwODAsIDB4NjM4M2VmMWIKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmOWU1NjA0MAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNjIyMDgwLCAweDg2Y2U3ZmYwCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA2MjIwODAsIDB4MGM3NmJkODQKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkNzE5Mjc4MQorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNjIyMDgwLCAweDgzYjcwY2RjCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA2MjIwODAsIDB4YWFlODc0NTMKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmYWZhOTJlMgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNjIyMDgwLCAweDI4MzIzMzU0CiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA2MjIwODAsIDB4MzRkNDc0ODQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXJnZXBsYW5lcyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXJnZXBsYW5lcwppbmRleCA4NDFkMTRmLi5lMTM2NzAzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWVyZ2VwbGFuZXMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1lcmdlcGxhbmVzCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4OTA2NjAyNzIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNDEyOCwgMHg2YjA5YzhhNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA0MTI4LCAweDM0Mzg1OGYzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YS00NTYwLXJvdGF0ZTAgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YS00NTYwLXJvdGF0ZTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc1NTJmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXRhLTQ1NjAtcm90YXRlMApAQCAtMCwwICsxLDI2OCBAQAorI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQ4MHgyNzIKKyNzYXIgMDogMC8xCisjdGIgMTogMS80NDEwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAxOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5NTg0MCwgMHgwNjAyMzUxZAorMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDAwMDAwMDAwCisxLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZTZiMDBmZmMKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5NTg0MCwgMHhjYWQ1NTYyNQorMSwgICAgICAgMjA0OCwgICAgICAgMjA0OCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDkyNzUwNjhhCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTU4NDAsIDB4MWE0N2E1Y2EKKzEsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjZDM1YTdjZQorMSwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDNmODQ2YTFlCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxOTU4NDAsIDB4NWNkMDJkN2MKKzEsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgMjA0OCwgMHg2MGZmNWZkMQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTk1ODQwLCAweDA3ZDA4ZjE2CisxLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OWU5ZDk2ZWUKKzEsICAgICAgIDcxNjgsICAgICAgIDcxNjgsICAgICAxMDI0LCAgICAgMjA0OCwgMHhiMjYyMmMyOQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTk1ODQwLCAweGU4YWJmNmRkCisxLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZGVkZGNkNmEKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDE5NTg0MCwgMHgwOTZhNWM1OAorMSwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICAyMDQ4LCAweGM4Nzk4YjIzCisxLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZWExZGFjNDkKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDE5NTg0MCwgMHg0ZTFhMTdiZAorMSwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDZiNTA4MTNlCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxOTU4NDAsIDB4OTYzNDljMjAKKzEsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgMjA0OCwgMHg4OTY5ODM0NworMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTk1ODQwLCAweDZiYjE2OTA3CisxLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YWE2MDhhNDcKKzEsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgMjA0OCwgMHgxNjliOGNmNworMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTk1ODQwLCAweDdlNDRlNGRkCisxLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MmYxMjc0NTUKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDE5NTg0MCwgMHg0YzNjMGNmMQorMSwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDI2OWM3NTgzCisxLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OTE3ZjcyNzkKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDE5NTg0MCwgMHg0ZjJlM2YyZAorMSwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDI3MDU1ZmZiCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAxOTU4NDAsIDB4Y2JhNTM5Y2QKKzEsICAgICAgMTk0NTYsICAgICAgMTk0NTYsICAgICAxMDI0LCAgICAgMjA0OCwgMHg3ZWNhNDllNAorMSwgICAgICAyMDQ4MCwgICAgICAyMDQ4MCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGFkMDY3MTg0CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAxOTU4NDAsIDB4ZjI4MTFjOWIKKzEsICAgICAgMjE1MDQsICAgICAgMjE1MDQsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjYTQwNjQ1NAorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMTk1ODQwLCAweDgzNTdlYWIyCisxLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NjlkNDhhNTUKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDE5NTg0MCwgMHhkYmE5YzQzOAorMSwgICAgICAyMzU1MiwgICAgICAyMzU1MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDBhODM2YzE0CisxLCAgICAgIDI0NTc2LCAgICAgIDI0NTc2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YTllOTY3ZjkKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDE5NTg0MCwgMHg1OGJjYjU5NAorMSwgICAgICAyNTYwMCwgICAgICAyNTYwMCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGQ3ZjczZjM1CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxOTU4NDAsIDB4M2VkYzVhMWMKKzEsICAgICAgMjY2MjQsICAgICAgMjY2MjQsICAgICAxMDI0LCAgICAgMjA0OCwgMHg3MGVkODM2NAorMSwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDkxM2Y5YjczCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAxOTU4NDAsIDB4OTRlNGMxODYKKzEsICAgICAgMjg2NzIsICAgICAgMjg2NzIsICAgICAxMDI0LCAgICAgMjA0OCwgMHg3ZGIwODNlYgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTk1ODQwLCAweGZmYWQ1ZjU5CisxLCAgICAgIDI5Njk2LCAgICAgIDI5Njk2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OTUxYjk3YTkKKzEsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAxMDI0LCAgICAgMjA0OCwgMHgwNzJlYTc4ZQorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMTk1ODQwLCAweDg0ZDFiMTE0CisxLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OWIxMjdiYTUKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDE5NTg0MCwgMHgzNThjMWQwYQorMSwgICAgICAzMjc2OCwgICAgICAzMjc2OCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDA1MWM5MGMwCisxLCAgICAgIDMzNzkyLCAgICAgIDMzNzkyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MjMyZDkzYjUKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDE5NTg0MCwgMHgzZWQxZmZjOAorMSwgICAgICAzNDgxNiwgICAgICAzNDgxNiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDc2Yjg5NDc3CiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxOTU4NDAsIDB4ZjA0OGY0N2MKKzEsICAgICAgMzU4NDAsICAgICAgMzU4NDAsICAgICAxMDI0LCAgICAgMjA0OCwgMHg1MGIyNTY4ZAorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMTk1ODQwLCAweDNjMmEzZGU2CisxLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OTc5NDdlNWUKKzEsICAgICAgMzc4ODgsICAgICAgMzc4ODgsICAgICAxMDI0LCAgICAgMjA0OCwgMHgyMTU2OTgxOQorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTk1ODQwLCAweDdjYTIwOGIxCisxLCAgICAgIDM4OTEyLCAgICAgIDM4OTEyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YzQzNThkZTQKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDE5NTg0MCwgMHgxMDVjZjlmYworMSwgICAgICAzOTkzNiwgICAgICAzOTkzNiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDY5OTY0OTc3CisxLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZWY4MTg5MmUKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDE5NTg0MCwgMHg5ZmU1MGMyOQorMSwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDZmNzA4NGU3CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAxOTU4NDAsIDB4YjQ1OTcyMGYKKzEsICAgICAgNDMwMDgsICAgICAgNDMwMDgsICAgICAxMDI0LCAgICAgMjA0OCwgMHg3YmUwODBmNworMSwgICAgICA0NDAzMiwgICAgICA0NDAzMiwgICAgIDEwMjQsICAgICAyMDQ4LCAweGFkYjE4OTM5CiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxOTU4NDAsIDB4NmVkYTE3YjAKKzEsICAgICAgNDUwNTYsICAgICAgNDUwNTYsICAgICAxMDI0LCAgICAgMjA0OCwgMHg2Y2Q5NTA2ZAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMTk1ODQwLCAweDA5ODg3MWIwCisxLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YmE4OGFiOGIKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDE5NTg0MCwgMHhjNjY0Y2M3OQorMSwgICAgICA0NzEwNCwgICAgICA0NzEwNCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGUwYmQ3MjZiCisxLCAgICAgIDQ4MTI4LCAgICAgIDQ4MTI4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MTU2MDRhNjUKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDE5NTg0MCwgMHg4ZDAyNzA4ZAorMSwgICAgICA0OTE1MiwgICAgICA0OTE1MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDJhODlmODViCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAxOTU4NDAsIDB4ZTkwYTg3MDUKKzEsICAgICAgNTAxNzYsICAgICAgNTAxNzYsICAgICAxMDI0LCAgICAgMjA0OCwgMHhkNzE4NTdkZAorMSwgICAgICA1MTIwMCwgICAgICA1MTIwMCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDkzZDk4YWVlCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAxOTU4NDAsIDB4NTVmNmM1YjYKKzEsICAgICAgNTIyMjQsICAgICAgNTIyMjQsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjYzUzN2MwOAorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMTk1ODQwLCAweGU0YWQxNDVkCisxLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZTBlYTdjMjEKKzEsICAgICAgNTQyNzIsICAgICAgNTQyNzIsICAgICAxMDI0LCAgICAgMjA0OCwgMHg4ODNiYTM4MAorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMTk1ODQwLCAweDllNzY2ZDUwCisxLCAgICAgIDU1Mjk2LCAgICAgIDU1Mjk2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YWFmNjVjYTcKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDE5NTg0MCwgMHhjMmVhYzI4OQorMSwgICAgICA1NjMyMCwgICAgICA1NjMyMCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGUwMWU5OGNhCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxOTU4NDAsIDB4MGJhZjU4NzEKKzEsICAgICAgNTczNDQsICAgICAgNTczNDQsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjYTg1YTU1MQorMSwgICAgICA1ODM2OCwgICAgICA1ODM2OCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDZmZWE3ZjgyCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAxOTU4NDAsIDB4MTVmODVmMzgKKzEsICAgICAgNTkzOTIsICAgICAgNTkzOTIsICAgICAxMDI0LCAgICAgMjA0OCwgMHg5ZmQ1OTg0MworMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTk1ODQwLCAweDc3YjAzMDcyCisxLCAgICAgIDYwNDE2LCAgICAgIDYwNDE2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZDc0MTlkMzUKKzEsICAgICAgNjE0NDAsICAgICAgNjE0NDAsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjMjg1YmMwZQorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMTk1ODQwLCAweDBhYmI3YWJmCisxLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NTE4MDQxOWMKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDE5NTg0MCwgMHgwNTA3NjcyNAorMSwgICAgICA2MzQ4OCwgICAgICA2MzQ4OCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGFjOWZkOTFiCisxLCAgICAgIDY0NTEyLCAgICAgIDY0NTEyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NmRlNjg5YjMKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDE5NTg0MCwgMHgyZThjNjE2MworMSwgICAgICA2NTUzNiwgICAgICA2NTUzNiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDY1NWJiNDE1CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxOTU4NDAsIDB4NGYzNTBjZGUKKzEsICAgICAgNjY1NjAsICAgICAgNjY1NjAsICAgICAxMDI0LCAgICAgMjA0OCwgMHhlNTlkNzQwNAorMSwgICAgICA2NzU4NCwgICAgICA2NzU4NCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGFhOTM1NmI5CiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAxOTU4NDAsIDB4ZWZjNmJkYTEKKzEsICAgICAgNjg2MDgsICAgICAgNjg2MDgsICAgICAxMDI0LCAgICAgMjA0OCwgMHhlMTkzNTQ5ZAorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTk1ODQwLCAweGUyY2RlZTY4CisxLCAgICAgIDY5NjMyLCAgICAgIDY5NjMyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZDA1Yzk3MzYKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDE5NTg0MCwgMHhjYzYyNDAxZQorMSwgICAgICA3MDY1NiwgICAgICA3MDY1NiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDA4NmY2ODI5CisxLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4Nzk2MjRmOTMKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDE5NTg0MCwgMHg0ZWQ3NmUxYgorMSwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGY3MGEyZjIxCiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAxOTU4NDAsIDB4ZjRmODU5OWEKKzEsICAgICAgNzM3MjgsICAgICAgNzM3MjgsICAgICAxMDI0LCAgICAgMjA0OCwgMHhkMzJjNjQzYworMSwgICAgICA3NDc1MiwgICAgICA3NDc1MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweGQ2ZjA3MDM1CiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAxOTU4NDAsIDB4YjA1ZWRmOTYKKzEsICAgICAgNzU3NzYsICAgICAgNzU3NzYsICAgICAxMDI0LCAgICAgMjA0OCwgMHgxMzdjNmNhMAorMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgMTk1ODQwLCAweGZiMWExZTE1CisxLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OTE2MjQyZGUKKzEsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAxMDI0LCAgICAgMjA0OCwgMHgwZDkxMDM2NworMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgMTk1ODQwLCAweDk3MGViYjU4CisxLCAgICAgIDc4ODQ4LCAgICAgIDc4ODQ4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NDYwYjhmMWUKKzAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgIDE5NTg0MCwgMHhmNDA0Njk1NworMSwgICAgICA3OTg3MiwgICAgICA3OTg3MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDYxNmE2MTAyCiswLCAgICAgICAgIDU1LCAgICAgICAgIDU1LCAgICAgICAgMSwgICAxOTU4NDAsIDB4ZDVlY2EzMzkKKzEsICAgICAgODA4OTYsICAgICAgODA4OTYsICAgICAxMDI0LCAgICAgMjA0OCwgMHhmYzUwN2UxZAorMSwgICAgICA4MTkyMCwgICAgICA4MTkyMCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDM0YWNjYzk0CiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAxOTU4NDAsIDB4NTJkM2NiMjQKKzEsICAgICAgODI5NDQsICAgICAgODI5NDQsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjZjY3OWYxYQorMCwgICAgICAgICA1NywgICAgICAgICA1NywgICAgICAgIDEsICAgMTk1ODQwLCAweDI1OWNhYzQ3CisxLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NzJjNDVkOGEKKzEsICAgICAgODQ5OTIsICAgICAgODQ5OTIsICAgICAxMDI0LCAgICAgMjA0OCwgMHhmZDIxMjY0YQorMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgMTk1ODQwLCAweDkxOTBhOTViCisxLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MDI4OTVjMzEKKzAsICAgICAgICAgNTksICAgICAgICAgNTksICAgICAgICAxLCAgIDE5NTg0MCwgMHg1YmFjY2ZiNQorMSwgICAgICA4NzA0MCwgICAgICA4NzA0MCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGRjMDQxZTljCisxLCAgICAgIDg4MDY0LCAgICAgIDg4MDY0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MjY2NDA3YTUKKzAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgIDE5NTg0MCwgMHg4MGQxOWEwOQorMSwgICAgICA4OTA4OCwgICAgICA4OTA4OCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDhmMTExYzQ5CiswLCAgICAgICAgIDYxLCAgICAgICAgIDYxLCAgICAgICAgMSwgICAxOTU4NDAsIDB4NWFkNDRjZTMKKzEsICAgICAgOTAxMTIsICAgICAgOTAxMTIsICAgICAxMDI0LCAgICAgMjA0OCwgMHhlYWQwMzFkZAorMSwgICAgICA5MTEzNiwgICAgICA5MTEzNiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDIzODMyNWQ0CiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAxOTU4NDAsIDB4N2IxYWQxMmIKKzEsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxMDI0LCAgICAgMjA0OCwgMHgyNDE3MTkxMworMCwgICAgICAgICA2MywgICAgICAgICA2MywgICAgICAgIDEsICAgMTk1ODQwLCAweDU3ZTFhNWU1CisxLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YmNkYTQxYzUKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgIDE5NTg0MCwgMHg3MGNiNmQzOAorMSwgICAgICA5NDIwOCwgICAgICA5NDIwOCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDEyNGY1ZWVkCisxLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NGNhZGMwODgKKzAsICAgICAgICAgNjUsICAgICAgICAgNjUsICAgICAgICAxLCAgIDE5NTg0MCwgMHgzOWRhYzM1YQorMSwgICAgICA5NjI1NiwgICAgICA5NjI1NiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDA2MmNkOTVhCiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAxOTU4NDAsIDB4NGY5ZmNjY2EKKzEsICAgICAgOTcyODAsICAgICAgOTcyODAsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjMjZhODg4ZAorMSwgICAgICA5ODMwNCwgICAgICA5ODMwNCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDg2NGYxYTY4CiswLCAgICAgICAgIDY3LCAgICAgICAgIDY3LCAgICAgICAgMSwgICAxOTU4NDAsIDB4YWRjYjU1ODUKKzEsICAgICAgOTkzMjgsICAgICAgOTkzMjgsICAgICAxMDI0LCAgICAgMjA0OCwgMHg0YmIxZWNmNAorMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgMTk1ODQwLCAweGU1OTZjMWI0CisxLCAgICAgMTAwMzUyLCAgICAgMTAwMzUyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YjRkZGMwYTcKKzEsICAgICAxMDEzNzYsICAgICAxMDEzNzYsICAgICAxMDI0LCAgICAgMjA0OCwgMHg2NjViYWRiMworMCwgICAgICAgICA2OSwgICAgICAgICA2OSwgICAgICAgIDEsICAgMTk1ODQwLCAweDY0YTA1MzM5CisxLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NzBiZWFhNjgKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgIDE5NTg0MCwgMHhhZWZhMDk5MAorMSwgICAgIDEwMzQyNCwgICAgIDEwMzQyNCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDhhYzdjN2RlCiswLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICAxOTU4NDAsIDB4OWMwYjVjM2QKKzEsICAgICAxMDQ0NDgsICAgICAxMDQ0NDgsICAgICAxMDI0LCAgICAgMjA0OCwgMHgxNThjYWQ4ZQorMSwgICAgIDEwNTQ3MiwgICAgIDEwNTQ3MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDBhYjhmYWYyCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAxOTU4NDAsIDB4YmFlOGJkNmIKKzEsICAgICAxMDY0OTYsICAgICAxMDY0OTYsICAgICAxMDI0LCAgICAgMjA0OCwgMHg5OTRlNzlmMQorMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgMTk1ODQwLCAweGIyYWM3ODU3CisxLCAgICAgMTA3NTIwLCAgICAgMTA3NTIwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YzcyNzEwNGUKKzEsICAgICAxMDg1NDQsICAgICAxMDg1NDQsICAgICAxMDI0LCAgICAgMjA0OCwgMHgxZTFmNzIwYQorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgMTk1ODQwLCAweGNmMjg2NWUzCisxLCAgICAgMTA5NTY4LCAgICAgMTA5NTY4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NzIzMmJlZGUKKzAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgIDE5NTg0MCwgMHg0ZTg1ODlhZgorMSwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDAxNWZkNjk3CisxLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NGIzM2ViYzkKKzAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgIDE5NTg0MCwgMHgzMWMyMTkzOAorMSwgICAgIDExMjY0MCwgICAgIDExMjY0MCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDhlNjE5NDhhCiswLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICAxOTU4NDAsIDB4ZTYxNjNjNTAKKzEsICAgICAxMTM2NjQsICAgICAxMTM2NjQsICAgICAxMDI0LCAgICAgMjA0OCwgMHg4M2ZhYjZhYworMCwgICAgICAgICA3OCwgICAgICAgICA3OCwgICAgICAgIDEsICAgMTk1ODQwLCAweDg4OGVmNzRmCisxLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OGQ1NWQ2ODMKKzEsICAgICAxMTU3MTIsICAgICAxMTU3MTIsICAgICAxMDI0LCAgICAgMjA0OCwgMHg0ZTkxYTJjNworMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgMTk1ODQwLCAweDAwZDgyMmY3CisxLCAgICAgMTE2NzM2LCAgICAgMTE2NzM2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OGM3OWM2OTIKKzAsICAgICAgICAgODAsICAgICAgICAgODAsICAgICAgICAxLCAgIDE5NTg0MCwgMHhjYmU3N2QyYgorMSwgICAgIDExNzc2MCwgICAgIDExNzc2MCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGU3NDRkMTAyCisxLCAgICAgMTE4Nzg0LCAgICAgMTE4Nzg0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MmJmNGU2YjEKKzAsICAgICAgICAgODEsICAgICAgICAgODEsICAgICAgICAxLCAgIDE5NTg0MCwgMHg5ZjJmZjZlNQorMSwgICAgIDExOTgwOCwgICAgIDExOTgwOCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGQ2ZmQ5YjkxCiswLCAgICAgICAgIDgyLCAgICAgICAgIDgyLCAgICAgICAgMSwgICAxOTU4NDAsIDB4MDhmNjVmNWYKKzEsICAgICAxMjA4MzIsICAgICAxMjA4MzIsICAgICAxMDI0LCAgICAgMjA0OCwgMHhlZGNkOGU4YQorMSwgICAgIDEyMTg1NiwgICAgIDEyMTg1NiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDY3YjQyMmJkCiswLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAxOTU4NDAsIDB4ZDM5NTA0NjkKKzEsICAgICAxMjI4ODAsICAgICAxMjI4ODAsICAgICAxMDI0LCAgICAgMjA0OCwgMHhhMDMyOTYwNgorMCwgICAgICAgICA4NCwgICAgICAgICA4NCwgICAgICAgIDEsICAgMTk1ODQwLCAweGI4ZTAxNGI4CisxLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YWU0N2MwMTUKKzEsICAgICAxMjQ5MjgsICAgICAxMjQ5MjgsICAgICAxMDI0LCAgICAgMjA0OCwgMHhhZWMxZGZiMgorMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgMTk1ODQwLCAweGE0Mzk5NzQyCisxLCAgICAgMTI1OTUyLCAgICAgMTI1OTUyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NzE5ZTliYWMKKzAsICAgICAgICAgODYsICAgICAgICAgODYsICAgICAgICAxLCAgIDE5NTg0MCwgMHg4NGI1YThlYworMSwgICAgIDEyNjk3NiwgICAgIDEyNjk3NiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDVkOTlhMTZjCiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAxOTU4NDAsIDB4MWJmYWEwMjcKKzEsICAgICAxMjgwMDAsICAgICAxMjgwMDAsICAgICAxMDI0LCAgICAgMjA0OCwgMHg4N2FhY2QwOQorMSwgICAgIDEyOTAyNCwgICAgIDEyOTAyNCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDE0NzNiZTA4CiswLCAgICAgICAgIDg4LCAgICAgICAgIDg4LCAgICAgICAgMSwgICAxOTU4NDAsIDB4N2JkYmIxNzIKKzEsICAgICAxMzAwNDgsICAgICAxMzAwNDgsICAgICAxMDI0LCAgICAgMjA0OCwgMHhkZWUzZDk3NQorMCwgICAgICAgICA4OSwgICAgICAgICA4OSwgICAgICAgIDEsICAgMTk1ODQwLCAweDAwZjJiM2Y3CisxLCAgICAgMTMxMDcyLCAgICAgMTMxMDcyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MDE4MGIwNTAKKzEsICAgICAxMzIwOTYsICAgICAxMzIwOTYsICAgICAxMDI0LCAgICAgMjA0OCwgMHhiMDM1ZDkxNQorMCwgICAgICAgICA5MCwgICAgICAgICA5MCwgICAgICAgIDEsICAgMTk1ODQwLCAweDg2NTAzYmM3CisxLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MWI3N2EzZmQKKzAsICAgICAgICAgOTEsICAgICAgICAgOTEsICAgICAgICAxLCAgIDE5NTg0MCwgMHhjNGFiMzU4ZQorMSwgICAgIDEzNDE0NCwgICAgIDEzNDE0NCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGYyMzNiN2JjCisxLCAgICAgMTM1MTY4LCAgICAgMTM1MTY4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZjFmYWQxNzMKKzAsICAgICAgICAgOTIsICAgICAgICAgOTIsICAgICAgICAxLCAgIDE5NTg0MCwgMHgxYjMzMGJhMAorMSwgICAgIDEzNjE5MiwgICAgIDEzNjE5MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDhiNmFjNWI5CiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICAxOTU4NDAsIDB4Y2NjOTgyMmYKKzEsICAgICAxMzcyMTYsICAgICAxMzcyMTYsICAgICAxMDI0LCAgICAgMjA0OCwgMHgxMjI4YzAzZgorMCwgICAgICAgICA5NCwgICAgICAgICA5NCwgICAgICAgIDEsICAgMTk1ODQwLCAweGZmZTM0ODZkCisxLCAgICAgMTM4MjQwLCAgICAgMTM4MjQwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YmU5OWNjNjEKKzEsICAgICAxMzkyNjQsICAgICAxMzkyNjQsICAgICAxMDI0LCAgICAgMjA0OCwgMHg4NDg2YmFkNworMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgMTk1ODQwLCAweDMwZGMwZWZlCisxLCAgICAgMTQwMjg4LCAgICAgMTQwMjg4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NDIzY2E2NDQKKzAsICAgICAgICAgOTYsICAgICAgICAgOTYsICAgICAgICAxLCAgIDE5NTg0MCwgMHg2YmZhZTcxZQorMSwgICAgIDE0MTMxMiwgICAgIDE0MTMxMiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDMzYWZiNWEzCisxLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OTBjMzNmNDkKKzAsICAgICAgICAgOTcsICAgICAgICAgOTcsICAgICAgICAxLCAgIDE5NTg0MCwgMHgwZmEwMTdiOAorMSwgICAgIDE0MzM2MCwgICAgIDE0MzM2MCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDBlNTlmOWQ3CiswLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgICAxOTU4NDAsIDB4MWQwYzk4MTAKKzEsICAgICAxNDQzODQsICAgICAxNDQzODQsICAgICAxMDI0LCAgICAgMjA0OCwgMHg0ZjUxM2QzZAorMSwgICAgIDE0NTQwOCwgICAgIDE0NTQwOCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGUyZjE0MDZiCiswLCAgICAgICAgIDk5LCAgICAgICAgIDk5LCAgICAgICAgMSwgICAxOTU4NDAsIDB4Nzc1Nzc4ZjAKKzEsICAgICAxNDY0MzIsICAgICAxNDY0MzIsICAgICAxMDI0LCAgICAgMjA0OCwgMHhlNTVkMmE5OQorMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDEsICAgMTk1ODQwLCAweGRjYjBlZGU1CisxLCAgICAgMTQ3NDU2LCAgICAgMTQ3NDU2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YjBlMjM2YzIKKzAsICAgICAgICAxMDEsICAgICAgICAxMDEsICAgICAgICAxLCAgIDE5NTg0MCwgMHg2NzYyNDI3MAorMSwgICAgIDE0ODQ4MCwgICAgIDE0ODQ4MCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGRjODBjOGZiCisxLCAgICAgMTQ5NTA0LCAgICAgMTQ5NTA0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4OTdjMzA3NzgKKzAsICAgICAgICAxMDIsICAgICAgICAxMDIsICAgICAgICAxLCAgIDE5NTg0MCwgMHhjZTg2ZjZhMworMSwgICAgIDE1MDUyOCwgICAgIDE1MDUyOCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDZlNDAzMTEzCiswLCAgICAgICAgMTAzLCAgICAgICAgMTAzLCAgICAgICAgMSwgICAxOTU4NDAsIDB4YTRiM2UwMzIKKzEsICAgICAxNTE1NTIsICAgICAxNTE1NTIsICAgICAxMDI0LCAgICAgMjA0OCwgMHg0Mjk2MDVhMQorMSwgICAgIDE1MjU3NiwgICAgIDE1MjU3NiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDI1ZDYxYjc1CiswLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgICAxOTU4NDAsIDB4NDY4NTFiODcKKzEsICAgICAxNTM2MDAsICAgICAxNTM2MDAsICAgICAxMDI0LCAgICAgMjA0OCwgMHhhMzJjZjQyZAorMCwgICAgICAgIDEwNSwgICAgICAgIDEwNSwgICAgICAgIDEsICAgMTk1ODQwLCAweDAyZDk3ZGM0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YWRhdGEtYXZmLWFwaGFzZS1tZXRlci1tb25vIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1ldGFkYXRhLWF2Zi1hcGhhc2UtbWV0ZXItbW9ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTUzNzU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1ldGFkYXRhLWF2Zi1hcGhhc2UtbWV0ZXItbW9ubwpAQCAtMCwwICsxLDQ3IEBACitwa3RfcHRzPTB8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTEwMjR8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTIwNDh8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTMwNzJ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTQwOTZ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTUxMjB8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTYxNDR8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTcxNjh8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTgxOTJ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTkyMTZ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTEwMjQwfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0xMTI2NHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9MTIyODh8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTEzMzEyfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0xNDMzNnx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9MTUzNjB8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTE2Mzg0fHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0xNzQwOHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9MTg0MzJ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTE5NDU2fHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0yMDQ4MHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9MjE1MDR8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTIyNTI4fHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0yMzU1Mnx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9MjQ1NzZ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTI1NjAwfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0yNjYyNHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9Mjc2NDh8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTI4NjcyfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0yOTY5Nnx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9MzA3MjB8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTMxNzQ0fHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0zMjc2OHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9MzM3OTJ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTM0ODE2fHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0zNTg0MHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9MzY4NjR8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTM3ODg4fHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz0zODkxMnx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9Mzk5MzZ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTQwOTYwfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz00MTk4NHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9NDMwMDh8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTQ0MDMyfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMAorcGt0X3B0cz00NTA1Nnx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9MS4wMDAwMDAKK3BrdF9wdHM9NDYwODB8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPTEuMDAwMDAwCitwa3RfcHRzPTQ3MTA0fHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0xLjAwMDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1ldGFkYXRhLWF2Zi1hcGhhc2UtbWV0ZXItb3V0LW9mLXBoYXNlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1ldGFkYXRhLWF2Zi1hcGhhc2UtbWV0ZXItb3V0LW9mLXBoYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMDBlOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YWRhdGEtYXZmLWFwaGFzZS1tZXRlci1vdXQtb2YtcGhhc2UKQEAgLTAsMCArMSwxMSBAQAorcGt0X3B0cz0wfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0tMS4wMDAwMDAKK3BrdF9wdHM9NDYwOHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9LTEuMDAwMDAwCitwa3RfcHRzPTkyMTZ8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPS0xLjAwMDAwMAorcGt0X3B0cz0xMzgyNHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9LTEuMDAwMDAwCitwa3RfcHRzPTE4NDMyfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0tMS4wMDAwMDAKK3BrdF9wdHM9MjMwNDB8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPS0xLjAwMDAwMAorcGt0X3B0cz0yNzY0OHx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9LTEuMDAwMDAwCitwa3RfcHRzPTMyMjU2fHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0tMS4wMDAwMDAKK3BrdF9wdHM9MzY4NjR8dGFnOmxhdmZpLmFwaGFzZW1ldGVyLnBoYXNlPS0xLjAwMDAwMAorcGt0X3B0cz00MTQ3Mnx0YWc6bGF2ZmkuYXBoYXNlbWV0ZXIucGhhc2U9LTEuMDAwMDAwCitwa3RfcHRzPTQ2MDgwfHRhZzpsYXZmaS5hcGhhc2VtZXRlci5waGFzZT0tMS4wMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXRhZGF0YS1jcm9wZGV0ZWN0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1ldGFkYXRhLWNyb3BkZXRlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5ZjlmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXRhZGF0YS1jcm9wZGV0ZWN0CkBAIC0wLDAgKzEsMzIgQEAKK3BrdF9wdHM9MAorcGt0X3B0cz00MDAKK3BrdF9wdHM9ODAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0xMjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0xNjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0yMDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0yNDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0yODAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0zMjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0zNjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz00MDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz00NDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz00ODAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz01MjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz01NjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz02MDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz02NDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz02ODAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz03MjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz03NjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz04MDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz04NDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz04ODAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz05MjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz05NjAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0xMDAwMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC54MT0wfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngyPTcxOXx0YWc6bGF2ZmkuY3JvcGRldGVjdC55MT02MXx0YWc6bGF2ZmkuY3JvcGRldGVjdC55Mj00MjR8dGFnOmxhdmZpLmNyb3BkZXRlY3Qudz03MjB8dGFnOmxhdmZpLmNyb3BkZXRlY3QuaD0zNTJ8dGFnOmxhdmZpLmNyb3BkZXRlY3QueD0wfHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lnk9NjgKK3BrdF9wdHM9MTA0MDB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDE9MHx0YWc6bGF2ZmkuY3JvcGRldGVjdC54Mj03MTl8dGFnOmxhdmZpLmNyb3BkZXRlY3QueTE9NjF8dGFnOmxhdmZpLmNyb3BkZXRlY3QueTI9NDI0fHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lnc9NzIwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lmg9MzUyfHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lng9MHx0YWc6bGF2ZmkuY3JvcGRldGVjdC55PTY4Citwa3RfcHRzPTEwODAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0xMTIwMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC54MT0wfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngyPTcxOXx0YWc6bGF2ZmkuY3JvcGRldGVjdC55MT02MXx0YWc6bGF2ZmkuY3JvcGRldGVjdC55Mj00MjR8dGFnOmxhdmZpLmNyb3BkZXRlY3Qudz03MjB8dGFnOmxhdmZpLmNyb3BkZXRlY3QuaD0zNTJ8dGFnOmxhdmZpLmNyb3BkZXRlY3QueD0wfHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lnk9NjgKK3BrdF9wdHM9MTE2MDB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDE9MHx0YWc6bGF2ZmkuY3JvcGRldGVjdC54Mj03MTl8dGFnOmxhdmZpLmNyb3BkZXRlY3QueTE9NjF8dGFnOmxhdmZpLmNyb3BkZXRlY3QueTI9NDI0fHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lnc9NzIwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lmg9MzUyfHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lng9MHx0YWc6bGF2ZmkuY3JvcGRldGVjdC55PTY4Citwa3RfcHRzPTEyMDAwfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngxPTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueDI9NzE5fHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkxPTYxfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LnkyPTQyNHx0YWc6bGF2ZmkuY3JvcGRldGVjdC53PTcyMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC5oPTM1Mnx0YWc6bGF2ZmkuY3JvcGRldGVjdC54PTB8dGFnOmxhdmZpLmNyb3BkZXRlY3QueT02OAorcGt0X3B0cz0xMjQwMHx0YWc6bGF2ZmkuY3JvcGRldGVjdC54MT0wfHRhZzpsYXZmaS5jcm9wZGV0ZWN0LngyPTcxOXx0YWc6bGF2ZmkuY3JvcGRldGVjdC55MT02MXx0YWc6bGF2ZmkuY3JvcGRldGVjdC55Mj00MjR8dGFnOmxhdmZpLmNyb3BkZXRlY3Qudz03MjB8dGFnOmxhdmZpLmNyb3BkZXRlY3QuaD0zNTJ8dGFnOmxhdmZpLmNyb3BkZXRlY3QueD0wfHRhZzpsYXZmaS5jcm9wZGV0ZWN0Lnk9NjgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXRhZGF0YS1yZWFkdml0Yy1kZWYgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YWRhdGEtcmVhZHZpdGMtZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNjUwZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YWRhdGEtcmVhZHZpdGMtZGVmCkBAIC0wLDAgKzEsNSBAQAorcGt0X3B0cz0wfHRhZzpsYXZmaS5yZWFkdml0Yy5mb3VuZD0wCitwa3RfcHRzPTF8dGFnOmxhdmZpLnJlYWR2aXRjLmZvdW5kPTF8dGFnOmxhdmZpLnJlYWR2aXRjLnRjX3N0cj0wNTowMTowMjoyMQorcGt0X3B0cz0yfHRhZzpsYXZmaS5yZWFkdml0Yy5mb3VuZD0xfHRhZzpsYXZmaS5yZWFkdml0Yy50Y19zdHI9MDU6MDE6MDI6MjIKK3BrdF9wdHM9M3x0YWc6bGF2ZmkucmVhZHZpdGMuZm91bmQ9MXx0YWc6bGF2ZmkucmVhZHZpdGMudGNfc3RyPTA1OjAxOjAyOjIzCitwa3RfcHRzPTR8dGFnOmxhdmZpLnJlYWR2aXRjLmZvdW5kPTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXRhZGF0YS1yZWFkdml0Yy10aHIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YWRhdGEtcmVhZHZpdGMtdGhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODY2NjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YWRhdGEtcmVhZHZpdGMtdGhyCkBAIC0wLDAgKzEsNSBAQAorcGt0X3B0cz0wfHRhZzpsYXZmaS5yZWFkdml0Yy5mb3VuZD0xfHRhZzpsYXZmaS5yZWFkdml0Yy50Y19zdHI9MDU6MDE6MDI6MjAKK3BrdF9wdHM9MXx0YWc6bGF2ZmkucmVhZHZpdGMuZm91bmQ9MXx0YWc6bGF2ZmkucmVhZHZpdGMudGNfc3RyPTA1OjAxOjAyOjIxCitwa3RfcHRzPTJ8dGFnOmxhdmZpLnJlYWR2aXRjLmZvdW5kPTF8dGFnOmxhdmZpLnJlYWR2aXRjLnRjX3N0cj0wNTowMTowMjoyMgorcGt0X3B0cz0zfHRhZzpsYXZmaS5yZWFkdml0Yy5mb3VuZD0xfHRhZzpsYXZmaS5yZWFkdml0Yy50Y19zdHI9MDU6MDE6MDI6MjMKK3BrdF9wdHM9NHx0YWc6bGF2ZmkucmVhZHZpdGMuZm91bmQ9MXx0YWc6bGF2ZmkucmVhZHZpdGMudGNfc3RyPTA1OjAxOjAyOjI0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbWV0YWRhdGEtc2lsZW5jZWRldGVjdCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXRhZGF0YS1zaWxlbmNlZGV0ZWN0CmluZGV4IDQxNjEyODcuLjE2YTlkMDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXRhZGF0YS1zaWxlbmNlZGV0ZWN0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1tZXRhZGF0YS1zaWxlbmNlZGV0ZWN0CkBAIC0xLDUxMiArMSwxMiBAQAotcGt0X3B0cz0wCi1wa3RfcHRzPTMyMAotcGt0X3B0cz02NDAKLXBrdF9wdHM9OTYwCi1wa3RfcHRzPTEyODAKLXBrdF9wdHM9MTYwMAotcGt0X3B0cz0xOTIwfHRhZzpsYXZmaS5zaWxlbmNlX3N0YXJ0PTAuMDIKLXBrdF9wdHM9MjI0MAotcGt0X3B0cz0yNTYwfHRhZzpsYXZmaS5zaWxlbmNlX2VuZD0wLjE2fHRhZzpsYXZmaS5zaWxlbmNlX2R1cmF0aW9uPTAuMTQKLXBrdF9wdHM9Mjg4MAotcGt0X3B0cz0zMjAwCi1wa3RfcHRzPTM1MjAKLXBrdF9wdHM9Mzg0MAotcGt0X3B0cz00MTYwCi1wa3RfcHRzPTQ0ODAKLXBrdF9wdHM9NDgwMAotcGt0X3B0cz01MTIwCi1wa3RfcHRzPTU0NDAKLXBrdF9wdHM9NTc2MHx0YWc6bGF2Zmkuc2lsZW5jZV9zdGFydD0wLjI2fHRhZzpsYXZmaS5zaWxlbmNlX2VuZD0wLjM2fHRhZzpsYXZmaS5zaWxlbmNlX2R1cmF0aW9uPTAuMQotcGt0X3B0cz02MDgwCi1wa3RfcHRzPTY0MDAKLXBrdF9wdHM9NjcyMAotcGt0X3B0cz03MDQwCi1wa3RfcHRzPTczNjAKLXBrdF9wdHM9NzY4MAotcGt0X3B0cz04MDAwCi1wa3RfcHRzPTgzMjAKLXBrdF9wdHM9ODY0MAotcGt0X3B0cz04OTYwCi1wa3RfcHRzPTkyODAKLXBrdF9wdHM9OTYwMAotcGt0X3B0cz05OTIwCi1wa3RfcHRzPTEwMjQwCi1wa3RfcHRzPTEwNTYwCi1wa3RfcHRzPTEwODgwCi1wa3RfcHRzPTExMjAwCi1wa3RfcHRzPTExNTIwCi1wa3RfcHRzPTExODQwCi1wa3RfcHRzPTEyMTYwCi1wa3RfcHRzPTEyNDgwCi1wa3RfcHRzPTEyODAwCi1wa3RfcHRzPTEzMTIwCi1wa3RfcHRzPTEzNDQwCi1wa3RfcHRzPTEzNzYwCi1wa3RfcHRzPTE0MDgwCi1wa3RfcHRzPTE0NDAwCi1wa3RfcHRzPTE0NzIwCi1wa3RfcHRzPTE1MDQwCi1wa3RfcHRzPTE1MzYwCi1wa3RfcHRzPTE1NjgwCi1wa3RfcHRzPTE2MDAwCi1wa3RfcHRzPTE2MzIwCi1wa3RfcHRzPTE2NjQwCi1wa3RfcHRzPTE2OTYwCi1wa3RfcHRzPTE3MjgwCi1wa3RfcHRzPTE3NjAwCi1wa3RfcHRzPTE3OTIwCi1wa3RfcHRzPTE4MjQwCi1wa3RfcHRzPTE4NTYwCi1wa3RfcHRzPTE4ODgwCi1wa3RfcHRzPTE5MjAwCi1wa3RfcHRzPTE5NTIwCi1wa3RfcHRzPTE5ODQwCi1wa3RfcHRzPTIwMTYwCi1wa3RfcHRzPTIwNDgwCi1wa3RfcHRzPTIwODAwCi1wa3RfcHRzPTIxMTIwCi1wa3RfcHRzPTIxNDQwCi1wa3RfcHRzPTIxNzYwCi1wa3RfcHRzPTIyMDgwfHRhZzpsYXZmaS5zaWxlbmNlX3N0YXJ0PTEuMjgKLXBrdF9wdHM9MjI0MDAKLXBrdF9wdHM9MjI3MjAKLXBrdF9wdHM9MjMwNDAKLXBrdF9wdHM9MjMzNjAKLXBrdF9wdHM9MjM2ODAKLXBrdF9wdHM9MjQwMDAKLXBrdF9wdHM9MjQzMjAKLXBrdF9wdHM9MjQ2NDAKLXBrdF9wdHM9MjQ5NjAKLXBrdF9wdHM9MjUyODAKLXBrdF9wdHM9MjU2MDAKLXBrdF9wdHM9MjU5MjAKLXBrdF9wdHM9MjYyNDAKLXBrdF9wdHM9MjY1NjAKLXBrdF9wdHM9MjY4ODAKLXBrdF9wdHM9MjcyMDAKLXBrdF9wdHM9Mjc1MjAKLXBrdF9wdHM9Mjc4NDAKLXBrdF9wdHM9MjgxNjAKLXBrdF9wdHM9Mjg0ODAKLXBrdF9wdHM9Mjg4MDAKLXBrdF9wdHM9MjkxMjAKLXBrdF9wdHM9Mjk0NDAKLXBrdF9wdHM9Mjk3NjAKLXBrdF9wdHM9MzAwODAKLXBrdF9wdHM9MzA0MDAKLXBrdF9wdHM9MzA3MjAKLXBrdF9wdHM9MzEwNDAKLXBrdF9wdHM9MzEzNjAKLXBrdF9wdHM9MzE2ODB8dGFnOmxhdmZpLnNpbGVuY2VfZW5kPTEuOTh8dGFnOmxhdmZpLnNpbGVuY2VfZHVyYXRpb249MC43Ci1wa3RfcHRzPTMyMDAwCi1wa3RfcHRzPTMyMzIwCi1wa3RfcHRzPTMyNjQwCi1wa3RfcHRzPTMyOTYwCi1wa3RfcHRzPTMzMjgwCi1wa3RfcHRzPTMzNjAwCi1wa3RfcHRzPTMzOTIwCi1wa3RfcHRzPTM0MjQwCi1wa3RfcHRzPTM0NTYwCi1wa3RfcHRzPTM0ODgwCi1wa3RfcHRzPTM1MjAwCi1wa3RfcHRzPTM1NTIwCi1wa3RfcHRzPTM1ODQwCi1wa3RfcHRzPTM2MTYwCi1wa3RfcHRzPTM2NDgwCi1wa3RfcHRzPTM2ODAwCi1wa3RfcHRzPTM3MTIwCi1wa3RfcHRzPTM3NDQwCi1wa3RfcHRzPTM3NzYwCi1wa3RfcHRzPTM4MDgwCi1wa3RfcHRzPTM4NDAwCi1wa3RfcHRzPTM4NzIwCi1wa3RfcHRzPTM5MDQwCi1wa3RfcHRzPTM5MzYwCi1wa3RfcHRzPTM5NjgwCi1wa3RfcHRzPTQwMDAwCi1wa3RfcHRzPTQwMzIwCi1wa3RfcHRzPTQwNjQwCi1wa3RfcHRzPTQwOTYwCi1wa3RfcHRzPTQxMjgwCi1wa3RfcHRzPTQxNjAwCi1wa3RfcHRzPTQxOTIwCi1wa3RfcHRzPTQyMjQwCi1wa3RfcHRzPTQyNTYwCi1wa3RfcHRzPTQyODgwCi1wa3RfcHRzPTQzMjAwCi1wa3RfcHRzPTQzNTIwCi1wa3RfcHRzPTQzODQwCi1wa3RfcHRzPTQ0MTYwCi1wa3RfcHRzPTQ0NDgwCi1wa3RfcHRzPTQ0ODAwCi1wa3RfcHRzPTQ1MTIwCi1wa3RfcHRzPTQ1NDQwCi1wa3RfcHRzPTQ1NzYwCi1wa3RfcHRzPTQ2MDgwCi1wa3RfcHRzPTQ2NDAwCi1wa3RfcHRzPTQ2NzIwCi1wa3RfcHRzPTQ3MDQwCi1wa3RfcHRzPTQ3MzYwCi1wa3RfcHRzPTQ3NjgwCi1wa3RfcHRzPTQ4MDAwCi1wa3RfcHRzPTQ4MzIwCi1wa3RfcHRzPTQ4NjQwCi1wa3RfcHRzPTQ4OTYwCi1wa3RfcHRzPTQ5MjgwCi1wa3RfcHRzPTQ5NjAwCi1wa3RfcHRzPTQ5OTIwCi1wa3RfcHRzPTUwMjQwCi1wa3RfcHRzPTUwNTYwCi1wa3RfcHRzPTUwODgwCi1wa3RfcHRzPTUxMjAwCi1wa3RfcHRzPTUxNTIwCi1wa3RfcHRzPTUxODQwCi1wa3RfcHRzPTUyMTYwCi1wa3RfcHRzPTUyNDgwCi1wa3RfcHRzPTUyODAwfHRhZzpsYXZmaS5zaWxlbmNlX3N0YXJ0PTMuMgotcGt0X3B0cz01MzEyMAotcGt0X3B0cz01MzQ0MAotcGt0X3B0cz01Mzc2MAotcGt0X3B0cz01NDA4MAotcGt0X3B0cz01NDQwMAotcGt0X3B0cz01NDcyMAotcGt0X3B0cz01NTA0MAotcGt0X3B0cz01NTM2MAotcGt0X3B0cz01NTY4MAotcGt0X3B0cz01NjAwMAotcGt0X3B0cz01NjMyMAotcGt0X3B0cz01NjY0MAotcGt0X3B0cz01Njk2MAotcGt0X3B0cz01NzI4MAotcGt0X3B0cz01NzYwMAotcGt0X3B0cz01NzkyMAotcGt0X3B0cz01ODI0MAotcGt0X3B0cz01ODU2MAotcGt0X3B0cz01ODg4MAotcGt0X3B0cz01OTIwMAotcGt0X3B0cz01OTUyMAotcGt0X3B0cz01OTg0MAotcGt0X3B0cz02MDE2MAotcGt0X3B0cz02MDQ4MAotcGt0X3B0cz02MDgwMAotcGt0X3B0cz02MTEyMAotcGt0X3B0cz02MTQ0MAotcGt0X3B0cz02MTc2MAotcGt0X3B0cz02MjA4MAotcGt0X3B0cz02MjQwMHx0YWc6bGF2Zmkuc2lsZW5jZV9lbmQ9My45fHRhZzpsYXZmaS5zaWxlbmNlX2R1cmF0aW9uPTAuNwotcGt0X3B0cz02MjcyMAotcGt0X3B0cz02MzA0MAotcGt0X3B0cz02MzM2MAotcGt0X3B0cz02MzY4MAotcGt0X3B0cz02NDAwMAotcGt0X3B0cz02NDMyMAotcGt0X3B0cz02NDY0MAotcGt0X3B0cz02NDk2MAotcGt0X3B0cz02NTI4MAotcGt0X3B0cz02NTYwMAotcGt0X3B0cz02NTkyMAotcGt0X3B0cz02NjI0MAotcGt0X3B0cz02NjU2MAotcGt0X3B0cz02Njg4MAotcGt0X3B0cz02NzIwMAotcGt0X3B0cz02NzUyMAotcGt0X3B0cz02Nzg0MAotcGt0X3B0cz02ODE2MAotcGt0X3B0cz02ODQ4MAotcGt0X3B0cz02ODgwMAotcGt0X3B0cz02OTEyMAotcGt0X3B0cz02OTQ0MAotcGt0X3B0cz02OTc2MAotcGt0X3B0cz03MDA4MAotcGt0X3B0cz03MDQwMAotcGt0X3B0cz03MDcyMAotcGt0X3B0cz03MTA0MAotcGt0X3B0cz03MTM2MAotcGt0X3B0cz03MTY4MAotcGt0X3B0cz03MjAwMAotcGt0X3B0cz03MjMyMAotcGt0X3B0cz03MjY0MAotcGt0X3B0cz03Mjk2MAotcGt0X3B0cz03MzI4MAotcGt0X3B0cz03MzYwMAotcGt0X3B0cz03MzkyMAotcGt0X3B0cz03NDI0MAotcGt0X3B0cz03NDU2MAotcGt0X3B0cz03NDg4MAotcGt0X3B0cz03NTIwMAotcGt0X3B0cz03NTUyMAotcGt0X3B0cz03NTg0MAotcGt0X3B0cz03NjE2MAotcGt0X3B0cz03NjQ4MAotcGt0X3B0cz03NjgwMAotcGt0X3B0cz03NzEyMAotcGt0X3B0cz03NzQ0MAotcGt0X3B0cz03Nzc2MAotcGt0X3B0cz03ODA4MAotcGt0X3B0cz03ODQwMAotcGt0X3B0cz03ODcyMAotcGt0X3B0cz03OTA0MAotcGt0X3B0cz03OTM2MAotcGt0X3B0cz03OTY4MAotcGt0X3B0cz04MDAwMHx0YWc6bGF2Zmkuc2lsZW5jZV9zdGFydD00LjkKLXBrdF9wdHM9ODAzMjAKLXBrdF9wdHM9ODA2NDAKLXBrdF9wdHM9ODA5NjAKLXBrdF9wdHM9ODEyODAKLXBrdF9wdHM9ODE2MDAKLXBrdF9wdHM9ODE5MjAKLXBrdF9wdHM9ODIyNDAKLXBrdF9wdHM9ODI1NjAKLXBrdF9wdHM9ODI4ODAKLXBrdF9wdHM9ODMyMDAKLXBrdF9wdHM9ODM1MjAKLXBrdF9wdHM9ODM4NDAKLXBrdF9wdHM9ODQxNjAKLXBrdF9wdHM9ODQ0ODAKLXBrdF9wdHM9ODQ4MDAKLXBrdF9wdHM9ODUxMjAKLXBrdF9wdHM9ODU0NDAKLXBrdF9wdHM9ODU3NjAKLXBrdF9wdHM9ODYwODAKLXBrdF9wdHM9ODY0MDAKLXBrdF9wdHM9ODY3MjAKLXBrdF9wdHM9ODcwNDB8dGFnOmxhdmZpLnNpbGVuY2VfZW5kPTUuNDR8dGFnOmxhdmZpLnNpbGVuY2VfZHVyYXRpb249MC41NAotcGt0X3B0cz04NzM2MAotcGt0X3B0cz04NzY4MAotcGt0X3B0cz04ODAwMAotcGt0X3B0cz04ODMyMAotcGt0X3B0cz04ODY0MAotcGt0X3B0cz04ODk2MAotcGt0X3B0cz04OTI4MAotcGt0X3B0cz04OTYwMAotcGt0X3B0cz04OTkyMAotcGt0X3B0cz05MDI0MAotcGt0X3B0cz05MDU2MAotcGt0X3B0cz05MDg4MAotcGt0X3B0cz05MTIwMAotcGt0X3B0cz05MTUyMAotcGt0X3B0cz05MTg0MAorcGt0X3B0cz0wfHRhZzpsYXZmaS5zaWxlbmNlX2R1cmF0aW9uPTAuNTIzMTA3fHRhZzpsYXZmaS5zaWxlbmNlX2VuZD0wLjY5MDAyM3x0YWc6bGF2Zmkuc2lsZW5jZV9zdGFydD0wLjczNjQxNworcGt0X3B0cz00NjA4MHx0YWc6bGF2Zmkuc2lsZW5jZV9zdGFydD0xLjI3NjI2fHRhZzpsYXZmaS5zaWxlbmNlX2VuZD0xLjgwNzUxfHRhZzpsYXZmaS5zaWxlbmNlX2R1cmF0aW9uPTAuNTMxMjQ3CiBwa3RfcHRzPTkyMTYwCi1wa3RfcHRzPTkyNDgwCi1wa3RfcHRzPTkyODAwCi1wa3RfcHRzPTkzMTIwCi1wa3RfcHRzPTkzNDQwCi1wa3RfcHRzPTkzNzYwCi1wa3RfcHRzPTk0MDgwCi1wa3RfcHRzPTk0NDAwCi1wa3RfcHRzPTk0NzIwCi1wa3RfcHRzPTk1MDQwCi1wa3RfcHRzPTk1MzYwCi1wa3RfcHRzPTk1NjgwCi1wa3RfcHRzPTk2MDAwCi1wa3RfcHRzPTk2MzIwCi1wa3RfcHRzPTk2NjQwCi1wa3RfcHRzPTk2OTYwCi1wa3RfcHRzPTk3MjgwCi1wa3RfcHRzPTk3NjAwCi1wa3RfcHRzPTk3OTIwCi1wa3RfcHRzPTk4MjQwCi1wa3RfcHRzPTk4NTYwCi1wa3RfcHRzPTk4ODgwCi1wa3RfcHRzPTk5MjAwCi1wa3RfcHRzPTk5NTIwCi1wa3RfcHRzPTk5ODQwCi1wa3RfcHRzPTEwMDE2MAotcGt0X3B0cz0xMDA0ODAKLXBrdF9wdHM9MTAwODAwCi1wa3RfcHRzPTEwMTEyMAotcGt0X3B0cz0xMDE0NDAKLXBrdF9wdHM9MTAxNzYwCi1wa3RfcHRzPTEwMjA4MAotcGt0X3B0cz0xMDI0MDAKLXBrdF9wdHM9MTAyNzIwCi1wa3RfcHRzPTEwMzA0MAotcGt0X3B0cz0xMDMzNjAKLXBrdF9wdHM9MTAzNjgwCi1wa3RfcHRzPTEwNDAwMAotcGt0X3B0cz0xMDQzMjAKLXBrdF9wdHM9MTA0NjQwfHRhZzpsYXZmaS5zaWxlbmNlX3N0YXJ0PTYuNDQKLXBrdF9wdHM9MTA0OTYwCi1wa3RfcHRzPTEwNTI4MAotcGt0X3B0cz0xMDU2MDAKLXBrdF9wdHM9MTA1OTIwCi1wa3RfcHRzPTEwNjI0MAotcGt0X3B0cz0xMDY1NjAKLXBrdF9wdHM9MTA2ODgwCi1wa3RfcHRzPTEwNzIwMAotcGt0X3B0cz0xMDc1MjAKLXBrdF9wdHM9MTA3ODQwCi1wa3RfcHRzPTEwODE2MAotcGt0X3B0cz0xMDg0ODAKLXBrdF9wdHM9MTA4ODAwCi1wa3RfcHRzPTEwOTEyMAotcGt0X3B0cz0xMDk0NDAKLXBrdF9wdHM9MTA5NzYwCi1wa3RfcHRzPTExMDA4MAotcGt0X3B0cz0xMTA0MDAKLXBrdF9wdHM9MTEwNzIwCi1wa3RfcHRzPTExMTA0MAotcGt0X3B0cz0xMTEzNjAKLXBrdF9wdHM9MTExNjgwCi1wa3RfcHRzPTExMjAwMAotcGt0X3B0cz0xMTIzMjAKLXBrdF9wdHM9MTEyNjQwCi1wa3RfcHRzPTExMjk2MAotcGt0X3B0cz0xMTMyODAKLXBrdF9wdHM9MTEzNjAwCi1wa3RfcHRzPTExMzkyMAotcGt0X3B0cz0xMTQyNDAKLXBrdF9wdHM9MTE0NTYwCi1wa3RfcHRzPTExNDg4MAotcGt0X3B0cz0xMTUyMDAKLXBrdF9wdHM9MTE1NTIwCi1wa3RfcHRzPTExNTg0MAotcGt0X3B0cz0xMTYxNjB8dGFnOmxhdmZpLnNpbGVuY2VfZW5kPTcuMjZ8dGFnOmxhdmZpLnNpbGVuY2VfZHVyYXRpb249MC44MgotcGt0X3B0cz0xMTY0ODAKLXBrdF9wdHM9MTE2ODAwCi1wa3RfcHRzPTExNzEyMAotcGt0X3B0cz0xMTc0NDAKLXBrdF9wdHM9MTE3NzYwCi1wa3RfcHRzPTExODA4MAotcGt0X3B0cz0xMTg0MDAKLXBrdF9wdHM9MTE4NzIwCi1wa3RfcHRzPTExOTA0MAotcGt0X3B0cz0xMTkzNjAKLXBrdF9wdHM9MTE5NjgwCi1wa3RfcHRzPTEyMDAwMAotcGt0X3B0cz0xMjAzMjAKLXBrdF9wdHM9MTIwNjQwCi1wa3RfcHRzPTEyMDk2MAotcGt0X3B0cz0xMjEyODAKLXBrdF9wdHM9MTIxNjAwCi1wa3RfcHRzPTEyMTkyMAotcGt0X3B0cz0xMjIyNDAKLXBrdF9wdHM9MTIyNTYwCi1wa3RfcHRzPTEyMjg4MAotcGt0X3B0cz0xMjMyMDAKLXBrdF9wdHM9MTIzNTIwCi1wa3RfcHRzPTEyMzg0MAotcGt0X3B0cz0xMjQxNjAKLXBrdF9wdHM9MTI0NDgwCi1wa3RfcHRzPTEyNDgwMAotcGt0X3B0cz0xMjUxMjAKLXBrdF9wdHM9MTI1NDQwCi1wa3RfcHRzPTEyNTc2MAotcGt0X3B0cz0xMjYwODAKLXBrdF9wdHM9MTI2NDAwCi1wa3RfcHRzPTEyNjcyMAotcGt0X3B0cz0xMjcwNDAKLXBrdF9wdHM9MTI3MzYwCi1wa3RfcHRzPTEyNzY4MAotcGt0X3B0cz0xMjgwMDAKLXBrdF9wdHM9MTI4MzIwCi1wa3RfcHRzPTEyODY0MAotcGt0X3B0cz0xMjg5NjAKLXBrdF9wdHM9MTI5MjgwCi1wa3RfcHRzPTEyOTYwMAotcGt0X3B0cz0xMjk5MjAKLXBrdF9wdHM9MTMwMjQwCi1wa3RfcHRzPTEzMDU2MAotcGt0X3B0cz0xMzA4ODAKLXBrdF9wdHM9MTMxMjAwCi1wa3RfcHRzPTEzMTUyMAotcGt0X3B0cz0xMzE4NDAKLXBrdF9wdHM9MTMyMTYwCi1wa3RfcHRzPTEzMjQ4MAotcGt0X3B0cz0xMzI4MDAKLXBrdF9wdHM9MTMzMTIwCi1wa3RfcHRzPTEzMzQ0MAotcGt0X3B0cz0xMzM3NjAKLXBrdF9wdHM9MTM0MDgwCi1wa3RfcHRzPTEzNDQwMAotcGt0X3B0cz0xMzQ3MjAKLXBrdF9wdHM9MTM1MDQwCi1wa3RfcHRzPTEzNTM2MAotcGt0X3B0cz0xMzU2ODAKLXBrdF9wdHM9MTM2MDAwCi1wa3RfcHRzPTEzNjMyMAotcGt0X3B0cz0xMzY2NDAKLXBrdF9wdHM9MTM2OTYwCi1wa3RfcHRzPTEzNzI4MAotcGt0X3B0cz0xMzc2MDB8dGFnOmxhdmZpLnNpbGVuY2Vfc3RhcnQ9OC41Ci1wa3RfcHRzPTEzNzkyMAogcGt0X3B0cz0xMzgyNDAKLXBrdF9wdHM9MTM4NTYwCi1wa3RfcHRzPTEzODg4MHx0YWc6bGF2Zmkuc2lsZW5jZV9lbmQ9OC42OHx0YWc6bGF2Zmkuc2lsZW5jZV9kdXJhdGlvbj0wLjE4Ci1wa3RfcHRzPTEzOTIwMAotcGt0X3B0cz0xMzk1MjAKLXBrdF9wdHM9MTM5ODQwCi1wa3RfcHRzPTE0MDE2MAotcGt0X3B0cz0xNDA0ODB8dGFnOmxhdmZpLnNpbGVuY2Vfc3RhcnQ9OC42OAotcGt0X3B0cz0xNDA4MDAKLXBrdF9wdHM9MTQxMTIwCi1wa3RfcHRzPTE0MTQ0MAotcGt0X3B0cz0xNDE3NjAKLXBrdF9wdHM9MTQyMDgwCi1wa3RfcHRzPTE0MjQwMAotcGt0X3B0cz0xNDI3MjAKLXBrdF9wdHM9MTQzMDQwCi1wa3RfcHRzPTE0MzM2MAotcGt0X3B0cz0xNDM2ODB8dGFnOmxhdmZpLnNpbGVuY2VfZW5kPTguOTh8dGFnOmxhdmZpLnNpbGVuY2VfZHVyYXRpb249MC4zCi1wa3RfcHRzPTE0NDAwMAotcGt0X3B0cz0xNDQzMjAKLXBrdF9wdHM9MTQ0NjQwCi1wa3RfcHRzPTE0NDk2MAotcGt0X3B0cz0xNDUyODAKLXBrdF9wdHM9MTQ1NjAwCi1wa3RfcHRzPTE0NTkyMAotcGt0X3B0cz0xNDYyNDAKLXBrdF9wdHM9MTQ2NTYwCi1wa3RfcHRzPTE0Njg4MAotcGt0X3B0cz0xNDcyMDAKLXBrdF9wdHM9MTQ3NTIwCi1wa3RfcHRzPTE0Nzg0MAotcGt0X3B0cz0xNDgxNjAKLXBrdF9wdHM9MTQ4NDgwCi1wa3RfcHRzPTE0ODgwMAotcGt0X3B0cz0xNDkxMjAKLXBrdF9wdHM9MTQ5NDQwCi1wa3RfcHRzPTE0OTc2MAotcGt0X3B0cz0xNTAwODAKLXBrdF9wdHM9MTUwNDAwCi1wa3RfcHRzPTE1MDcyMAotcGt0X3B0cz0xNTEwNDAKLXBrdF9wdHM9MTUxMzYwCi1wa3RfcHRzPTE1MTY4MAotcGt0X3B0cz0xNTIwMDAKLXBrdF9wdHM9MTUyMzIwCi1wa3RfcHRzPTE1MjY0MAotcGt0X3B0cz0xNTI5NjAKLXBrdF9wdHM9MTUzMjgwCi1wa3RfcHRzPTE1MzYwMAotcGt0X3B0cz0xNTM5MjAKLXBrdF9wdHM9MTU0MjQwCi1wa3RfcHRzPTE1NDU2MAotcGt0X3B0cz0xNTQ4ODAKLXBrdF9wdHM9MTU1MjAwCi1wa3RfcHRzPTE1NTUyMAotcGt0X3B0cz0xNTU4NDAKLXBrdF9wdHM9MTU2MTYwCi1wa3RfcHRzPTE1NjQ4MAotcGt0X3B0cz0xNTY4MDAKLXBrdF9wdHM9MTU3MTIwCi1wa3RfcHRzPTE1NzQ0MAotcGt0X3B0cz0xNTc3NjAKLXBrdF9wdHM9MTU4MDgwCi1wa3RfcHRzPTE1ODQwMAotcGt0X3B0cz0xNTg3MjAKLXBrdF9wdHM9MTU5MDQwCi1wa3RfcHRzPTE1OTM2MAotcGt0X3B0cz0xNTk2ODAKLXBrdF9wdHM9MTYwMDAwCi1wa3RfcHRzPTE2MDMyMAotcGt0X3B0cz0xNjA2NDAKLXBrdF9wdHM9MTYwOTYwCi1wa3RfcHRzPTE2MTI4MAotcGt0X3B0cz0xNjE2MDB8dGFnOmxhdmZpLnNpbGVuY2Vfc3RhcnQ9MTAKLXBrdF9wdHM9MTYxOTIwCi1wa3RfcHRzPTE2MjI0MAotcGt0X3B0cz0xNjI1NjAKLXBrdF9wdHM9MTYyODgwCi1wa3RfcHRzPTE2MzIwMAotcGt0X3B0cz0xNjM1MjAKK3BrdF9wdHM9MTg0MzIwCitwa3RfcHRzPTIzMDQwMAorcGt0X3B0cz0yNzY0ODAKK3BrdF9wdHM9MzIyNTYwCitwa3RfcHRzPTM2ODY0MAorcGt0X3B0cz00MTQ3MjAKK3BrdF9wdHM9NDYwODAwCitwa3RfcHRzPTUwNjg4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW1wZGVjaW1hdGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbXBkZWNpbWF0ZQppbmRleCAxZTk2NTJlLi45YzFkYzM2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbXBkZWNpbWF0ZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbXBkZWNpbWF0ZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzMKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc0NGIzZWQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ZTMxOGJhMAogMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTE1MjAwLCAweDQ4ZDY1ODc2CkBAIC0xOCw0ICsyMiwzIEBACiAwLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDU2ZDQwY2EKIDAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNDM3NDczNwogMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMTE1MjAwLCAweDNlYWEzYWU4Ci0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzU1MWU5ZWUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1uZWdhdGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItbmVnYXRlCmluZGV4IDFkMmVhNzMuLjg4ZDA0NzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1uZWdhdGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW5lZ2F0ZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGVmMjBlMWVjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ODk5NjA2ZWMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhZWExNzVkMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXkgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheQppbmRleCBmMGYwM2Q2Li5iY2JkZTU0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDJiMWE3YTkyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmYyODY4NWEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlYWM5Zjk5YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXktZHZkc3ViLTIzOTcgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheS1kdmRzdWItMjM5NwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODZhMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXktZHZkc3ViLTIzOTcKQEAgLTAsMCArMSw4NTcgQEAKKyN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAxLzEKKyN0YiAxOiAxLzEwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogZHRzCisjc2FtcGxlX3JhdGUgMTogNDgwMDAKKyNjaGFubmVsX2xheW91dCAxOiA2MGYKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IDUuMShzaWRlKQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDZiMDVkNDhhCisxLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NjhlN2IwM2EKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHgyYzIyMTljZAorMSwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgMTAsICAgICAyMDEzLCAweDBiMWQ4OGQzCisxLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NjVmZWJjOTQKKzEsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgIDEwLCAgICAgMjAxMywgMHgxYmI0YjQ0NQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGE3MTYzOGMzCisxLCAgICAgICAgIDY3LCAgICAgICAgIDY3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ODg4MTlhNzIKKzEsICAgICAgICAgNzcsICAgICAgICAgNzcsICAgICAgIDEwLCAgICAgMjAxMywgMHgzNWI4OTU3NAorMSwgICAgICAgICA4NywgICAgICAgICA4NywgICAgICAgMTAsICAgICAyMDEzLCAweDFmMDhjN2UzCisxLCAgICAgICAgIDk3LCAgICAgICAgIDk3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGFmYzk0OGYKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDUxODQwMCwgMHg1NGJkYTQ2MworMSwgICAgICAgIDExMiwgICAgICAgIDExMiwgICAgICAgMTAsICAgICAyMDEzLCAweDFkMTRhNjkzCisxLCAgICAgICAgMTIyLCAgICAgICAgMTIyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NTNhY2I1NTQKKzEsICAgICAgICAxMzIsICAgICAgICAxMzIsICAgICAgIDEwLCAgICAgMjAxMywgMHg3MWQwYTA3NQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNTE4NDAwLCAweGQxZTAwNTc0CisxLCAgICAgICAgMTQyLCAgICAgICAgMTQyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZGNjOGE4OGEKKzEsICAgICAgICAxNTIsICAgICAgICAxNTIsICAgICAgIDEwLCAgICAgMjAxMywgMHhkMWI2YThhMgorMSwgICAgICAgIDE2MiwgICAgICAgIDE2MiwgICAgICAgMTAsICAgICAyMDEzLCAweDQ2YmJhMjQzCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NTNiMDdmMmQKKzEsICAgICAgICAxNzIsICAgICAgICAxNzIsICAgICAgIDEwLCAgICAgMjAxMywgMHhkY2JlOTkzMworMSwgICAgICAgIDE4MiwgICAgICAgIDE4MiwgICAgICAgMTAsICAgICAyMDEzLCAweGRlZjVhYjUyCisxLCAgICAgICAgMTk4LCAgICAgICAgMTk4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZDE2ZTgyNDUKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDUxODQwMCwgMHg0ZDE5YzgwYgorMSwgICAgICAgIDIwOCwgICAgICAgIDIwOCwgICAgICAgMTAsICAgICAyMDEzLCAweDU1NjdhY2Q3CisxLCAgICAgICAgMjE4LCAgICAgICAgMjE4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZmIxMjk5MTkKKzEsICAgICAgICAyMjgsICAgICAgICAyMjgsICAgICAgIDEwLCAgICAgMjAxMywgMHgyNmY4YjEwMQorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgNTE4NDAwLCAweGQzNDg2NmEyCisxLCAgICAgICAgMjM4LCAgICAgICAgMjM4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YTkwM2FmZjIKKzEsICAgICAgICAyNDgsICAgICAgICAyNDgsICAgICAgIDEwLCAgICAgMjAxMywgMHgwNTZiYTQ0NQorMSwgICAgICAgIDI1OCwgICAgICAgIDI1OCwgICAgICAgMTAsICAgICAyMDEzLCAweGQzMGFiMjE0CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MDMyMWMzZGIKKzEsICAgICAgICAyNjgsICAgICAgICAyNjgsICAgICAgIDEwLCAgICAgMjAxMywgMHgzNTQwOWVmMAorMSwgICAgICAgIDI4MywgICAgICAgIDI4MywgICAgICAgMTAsICAgICAyMDEzLCAweGEwMWI5OWE4CisxLCAgICAgICAgMjkzLCAgICAgICAgMjkzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4Nzc2ZGExMjIKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDUxODQwMCwgMHgzZjQ2MGE3OQorMSwgICAgICAgIDMwMywgICAgICAgIDMwMywgICAgICAgMTAsICAgICAyMDEzLCAweDQxMWVhODU1CisxLCAgICAgICAgMzEzLCAgICAgICAgMzEzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGYxOTlkZjQKKzEsICAgICAgICAzMjMsICAgICAgICAzMjMsICAgICAgIDEwLCAgICAgMjAxMywgMHhiMDU5OGU5MworMSwgICAgICAgIDMzMywgICAgICAgIDMzMywgICAgICAgMTAsICAgICAyMDEzLCAweGM2M2E5MDVhCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NzEyMDI0ODIKKzEsICAgICAgICAzNDMsICAgICAgICAzNDMsICAgICAgIDEwLCAgICAgMjAxMywgMHgzZmJhYmQyNAorMSwgICAgICAgIDM1MywgICAgICAgIDM1MywgICAgICAgMTAsICAgICAyMDEzLCAweGZkNTViYTVjCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MmY3ZGYzNmUKKzEsICAgICAgICAzNjgsICAgICAgICAzNjgsICAgICAgIDEwLCAgICAgMjAxMywgMHhmMjYwYjA0ZQorMSwgICAgICAgIDM3OCwgICAgICAgIDM3OCwgICAgICAgMTAsICAgICAyMDEzLCAweGExZjZhMWNmCisxLCAgICAgICAgMzg4LCAgICAgICAgMzg4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzU1OWE1MjkKKzEsICAgICAgICAzOTgsICAgICAgICAzOTgsICAgICAgIDEwLCAgICAgMjAxMywgMHg5NTZlOTVlZAorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGFmOTg4OGM0CisxLCAgICAgICAgNDA4LCAgICAgICAgNDA4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjlkM2EyZjgKKzEsICAgICAgICA0MTgsICAgICAgICA0MTgsICAgICAgIDEwLCAgICAgMjAxMywgMHgzZWRhODExMworMSwgICAgICAgIDQyOCwgICAgICAgIDQyOCwgICAgICAgMTAsICAgICAyMDEzLCAweDM2N2ZhMzY3CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MjA1NWE2NTcKKzEsICAgICAgICA0MzgsICAgICAgICA0MzgsICAgICAgIDEwLCAgICAgMjAxMywgMHhjMmZlOTY4NQorMSwgICAgICAgIDQ1NCwgICAgICAgIDQ1NCwgICAgICAgMTAsICAgICAyMDEzLCAweGY3YWVhZDM4CisxLCAgICAgICAgNDY0LCAgICAgICAgNDY0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDlhZGE1ODcKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDUxODQwMCwgMHgyMmNjZGE0YworMSwgICAgICAgIDQ3NCwgICAgICAgIDQ3NCwgICAgICAgMTAsICAgICAyMDEzLCAweDhjMGNhMjI1CisxLCAgICAgICAgNDg0LCAgICAgICAgNDg0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MjllZTkxMjIKKzEsICAgICAgICA0OTQsICAgICAgICA0OTQsICAgICAgIDEwLCAgICAgMjAxMywgMHg2Y2UxOTc2YQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgNTE4NDAwLCAweGQ2YWRiOWE3CisxLCAgICAgICAgNTA0LCAgICAgICAgNTA0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NmEwYjlkNWIKKzEsICAgICAgICA1MTQsICAgICAgICA1MTQsICAgICAgIDEwLCAgICAgMjAxMywgMHgxMzM3YTMzYgorMSwgICAgICAgIDUyNCwgICAgICAgIDUyNCwgICAgICAgMTAsICAgICAyMDEzLCAweGFhMTJhM2IwCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NmE3ZGQ3OTEKKzEsICAgICAgICA1MzksICAgICAgICA1MzksICAgICAgIDEwLCAgICAgMjAxMywgMHhhZjU5YWFmNAorMSwgICAgICAgIDU0OSwgICAgICAgIDU0OSwgICAgICAgMTAsICAgICAyMDEzLCAweDRmZmFiMmM1CisxLCAgICAgICAgNTU5LCAgICAgICAgNTU5LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NTYyNDk5NDQKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDUxODQwMCwgMHg1YzMzMTljNworMSwgICAgICAgIDU2OSwgICAgICAgIDU2OSwgICAgICAgMTAsICAgICAyMDEzLCAweDk1ZjZhZDA3CisxLCAgICAgICAgNTc5LCAgICAgICAgNTc5LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjhlNmE2MTAKKzEsICAgICAgICA1ODksICAgICAgICA1ODksICAgICAgIDEwLCAgICAgMjAxMywgMHhhZWUyOTQ4YgorMSwgICAgICAgIDU5OSwgICAgICAgIDU5OSwgICAgICAgMTAsICAgICAyMDEzLCAweGM2ODZhZGFjCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZTliNWE0N2QKKzEsICAgICAgICA2MDksICAgICAgICA2MDksICAgICAgIDEwLCAgICAgMjAxMywgMHg2YmNkYjA3MworMSwgICAgICAgIDYyNCwgICAgICAgIDYyNCwgICAgICAgMTAsICAgICAyMDEzLCAweDI2ZDQ5NmIyCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZjBiZDY1NTYKKzEsICAgICAgICA2MzQsICAgICAgICA2MzQsICAgICAgIDEwLCAgICAgMjAxMywgMHhhYTQxOWIwOQorMSwgICAgICAgIDY0NCwgICAgICAgIDY0NCwgICAgICAgMTAsICAgICAyMDEzLCAweGVlNmJhOTc0CisxLCAgICAgICAgNjU0LCAgICAgICAgNjU0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NjkwODkzYjgKKzEsICAgICAgICA2NjQsICAgICAgICA2NjQsICAgICAgIDEwLCAgICAgMjAxMywgMHhhYTdlYjZjNQorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDZiMTZlMzFiCisxLCAgICAgICAgNjc0LCAgICAgICAgNjc0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NzNlMDk0YzMKKzEsICAgICAgICA2ODQsICAgICAgICA2ODQsICAgICAgIDEwLCAgICAgMjAxMywgMHhhMjk3YTUzOQorMSwgICAgICAgIDY5NCwgICAgICAgIDY5NCwgICAgICAgMTAsICAgICAyMDEzLCAweDE1ZTdhMzA0CiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODU5YjM4MzIKKzEsICAgICAgICA3MTAsICAgICAgICA3MTAsICAgICAgIDEwLCAgICAgMjAxMywgMHhjOGRmYWExMQorMSwgICAgICAgIDcyMCwgICAgICAgIDcyMCwgICAgICAgMTAsICAgICAyMDEzLCAweGMyYjU5MzliCisxLCAgICAgICAgNzMwLCAgICAgICAgNzMwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZWNhYWFiOTIKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDUxODQwMCwgMHgzNmI0MjZiOAorMSwgICAgICAgIDc0MCwgICAgICAgIDc0MCwgICAgICAgMTAsICAgICAyMDEzLCAweGM1MjJhYjcwCisxLCAgICAgICAgNzUwLCAgICAgICAgNzUwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MTY2ODk4NWMKKzEsICAgICAgICA3NjAsICAgICAgICA3NjAsICAgICAgIDEwLCAgICAgMjAxMywgMHg1OWE1OTZmNworMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgNTE4NDAwLCAweDYwZjNlMDZhCisxLCAgICAgICAgNzcwLCAgICAgICAgNzcwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MTJkOGEzYzQKKzEsICAgICAgICA3ODAsICAgICAgICA3ODAsICAgICAgIDEwLCAgICAgMjAxMywgMHg3MWYxYjAyZgorMSwgICAgICAgIDc5NSwgICAgICAgIDc5NSwgICAgICAgMTAsICAgICAyMDEzLCAweDcxMzhjNzU3CiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZTU2YTY1YTMKKzEsICAgICAgICA4MDUsICAgICAgICA4MDUsICAgICAgIDEwLCAgICAgMjAxMywgMHgxOTlkOTYzMQorMSwgICAgICAgIDgxNSwgICAgICAgIDgxNSwgICAgICAgMTAsICAgICAyMDEzLCAweDg5NTVhZTkwCisxLCAgICAgICAgODI1LCAgICAgICAgODI1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YmRmMGE5N2QKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDUxODQwMCwgMHg1NjQxZTU0OQorMSwgICAgICAgIDgzNSwgICAgICAgIDgzNSwgICAgICAgMTAsICAgICAyMDEzLCAweDQ3ZmFhMWU3CisxLCAgICAgICAgODQ1LCAgICAgICAgODQ1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDFiYmI2MzgKKzEsICAgICAgICA4NTUsICAgICAgICA4NTUsICAgICAgIDEwLCAgICAgMjAxMywgMHg0ZTRkYTE5OQorMSwgICAgICAgIDg2NSwgICAgICAgIDg2NSwgICAgICAgMTAsICAgICAyMDEzLCAweDNiYTdhYmY0CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4N2I1MWEwNmIKKzEsICAgICAgICA4ODAsICAgICAgICA4ODAsICAgICAgIDEwLCAgICAgMjAxMywgMHhhM2ZkYTUwOAorMSwgICAgICAgIDg5MCwgICAgICAgIDg5MCwgICAgICAgMTAsICAgICAyMDEzLCAweDgxYzBhZDFkCisxLCAgICAgICAgOTAwLCAgICAgICAgOTAwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4OTNiZWFmM2IKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDUxODQwMCwgMHhjNmY1M2Y0NgorMSwgICAgICAgIDkxMCwgICAgICAgIDkxMCwgICAgICAgMTAsICAgICAyMDEzLCAweGUzMGVhYzU5CisxLCAgICAgICAgOTIwLCAgICAgICAgOTIwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4Nzk3ZWFhNzgKKzEsICAgICAgICA5MzAsICAgICAgICA5MzAsICAgICAgIDEwLCAgICAgMjAxMywgMHhjYTRlOGYxZQorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNTE4NDAwLCAweDJlMTJlNmM0CisxLCAgICAgICAgOTQwLCAgICAgICAgOTQwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzlmYTk0NWQKKzEsICAgICAgICA5NTAsICAgICAgICA5NTAsICAgICAgIDEwLCAgICAgMjAxMywgMHhmZjMxYjVkNgorMSwgICAgICAgIDk2NiwgICAgICAgIDk2NiwgICAgICAgMTAsICAgICAyMDEzLCAweDNiN2U5ZWZhCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZWJjOTcyNDYKKzEsICAgICAgICA5NzYsICAgICAgICA5NzYsICAgICAgIDEwLCAgICAgMjAxMywgMHhjM2U2YjdiNQorMSwgICAgICAgIDk4NiwgICAgICAgIDk4NiwgICAgICAgMTAsICAgICAyMDEzLCAweDM3YzdjM2Y5CisxLCAgICAgICAgOTk2LCAgICAgICAgOTk2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Mjk2NmM4YjgKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDUxODQwMCwgMHg4MTRjYThmYQorMSwgICAgICAgMTAwNiwgICAgICAgMTAwNiwgICAgICAgMTAsICAgICAyMDEzLCAweGMxYjc5Y2NkCisxLCAgICAgICAxMDE2LCAgICAgICAxMDE2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ODBhZmFkMTkKKzEsICAgICAgIDEwMjYsICAgICAgIDEwMjYsICAgICAgIDEwLCAgICAgMjAxMywgMHhiMmYyYWRjNAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNTE4NDAwLCAweGM4NzVmMWY4CisxLCAgICAgICAxMDM2LCAgICAgICAxMDM2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZmVkMjkyMTYKKzEsICAgICAgIDEwNTEsICAgICAgIDEwNTEsICAgICAgIDEwLCAgICAgMjAxMywgMHg0N2ViYjM4MgorMSwgICAgICAgMTA2MSwgICAgICAgMTA2MSwgICAgICAgMTAsICAgICAyMDEzLCAweDVmODliYjgzCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MTEyOTVlM2IKKzEsICAgICAgIDEwNzEsICAgICAgIDEwNzEsICAgICAgIDEwLCAgICAgMjAxMywgMHgwZTA3YWI1ZAorMSwgICAgICAgMTA4MSwgICAgICAgMTA4MSwgICAgICAgMTAsICAgICAyMDEzLCAweDZmMDBhZjM4CisxLCAgICAgICAxMDkxLCAgICAgICAxMDkxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTdmY2FkZmIKKzEsICAgICAgIDExMDEsICAgICAgIDExMDEsICAgICAgIDEwLCAgICAgMjAxMywgMHgzNGMwYTY0OAorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNTE4NDAwLCAweDU4OTVmMmY0CisxLCAgICAgICAxMTExLCAgICAgICAxMTExLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MjRjODhmZTIKKzEsICAgICAgIDExMjEsICAgICAgIDExMjEsICAgICAgIDEwLCAgICAgMjAxMywgMHhlNTdlOWQxZgorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNTE4NDAwLCAweDJiZGJiODU4CisxLCAgICAgICAxMTM2LCAgICAgICAxMTM2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZGEwM2EzZDgKKzEsICAgICAgIDExNDYsICAgICAgIDExNDYsICAgICAgIDEwLCAgICAgMjAxMywgMHg1NjU1YjMwOAorMSwgICAgICAgMTE1NiwgICAgICAgMTE1NiwgICAgICAgMTAsICAgICAyMDEzLCAweDEzYTdjMDFkCisxLCAgICAgICAxMTY2LCAgICAgICAxMTY2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NTY1NTk2ODIKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDUxODQwMCwgMHg1ZjI5NmFiZQorMSwgICAgICAgMTE3NiwgICAgICAgMTE3NiwgICAgICAgMTAsICAgICAyMDEzLCAweDI2ZDhjY2E2CisxLCAgICAgICAxMTg2LCAgICAgICAxMTg2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGFjNzllZDUKKzEsICAgICAgIDExOTYsICAgICAgIDExOTYsICAgICAgIDEwLCAgICAgMjAxMywgMHgzNTNmYWRjZgorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNTE4NDAwLCAweDBiMDBlMWYyCisxLCAgICAgICAxMjA2LCAgICAgICAxMjA2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YzVkOWE5NmUKKzEsICAgICAgIDEyMjIsICAgICAgIDEyMjIsICAgICAgIDEwLCAgICAgMjAxMywgMHhmNTFiYTI3OAorMSwgICAgICAgMTIzMiwgICAgICAgMTIzMiwgICAgICAgMTAsICAgICAyMDEzLCAweDdiZjBiNzllCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NjRhZmQzZmMKKzEsICAgICAgIDEyNDIsICAgICAgIDEyNDIsICAgICAgIDEwLCAgICAgMjAxMywgMHhiYmM1OGRmNworMSwgICAgICAgMTI1MiwgICAgICAgMTI1MiwgICAgICAgMTAsICAgICAyMDEzLCAweGExNzM5Y2M4CisxLCAgICAgICAxMjYyLCAgICAgICAxMjYyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzRkZWFlYzYKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDUxODQwMCwgMHhjMWFlMWQ4NQorMSwgICAgICAgMTI3MiwgICAgICAgMTI3MiwgICAgICAgMTAsICAgICAyMDEzLCAweDc1MGJhMjBiCisxLCAgICAgICAxMjgyLCAgICAgICAxMjgyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YWFjY2FjZmEKKzEsICAgICAgIDEyOTIsICAgICAgIDEyOTIsICAgICAgIDEwLCAgICAgMjAxMywgMHgwMmNjOWI3MgorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgNTE4NDAwLCAweDUxODlmNWU2CisxLCAgICAgICAxMzA3LCAgICAgICAxMzA3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YzFjNmFhN2UKKzEsICAgICAgIDEzMTcsICAgICAgIDEzMTcsICAgICAgIDEwLCAgICAgMjAxMywgMHhkNjA5YWIyNgorMSwgICAgICAgMTMyNywgICAgICAgMTMyNywgICAgICAgMTAsICAgICAyMDEzLCAweGM4ODBhMTM1CiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NjFjN2RjMzYKKzEsICAgICAgIDEzMzcsICAgICAgIDEzMzcsICAgICAgIDEwLCAgICAgMjAxMywgMHhkZGM0YmM2OQorMSwgICAgICAgMTM0NywgICAgICAgMTM0NywgICAgICAgMTAsICAgICAyMDEzLCAweDkzNGNhZjY1CisxLCAgICAgICAxMzU3LCAgICAgICAxMzU3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YWZhNmFmNGEKKzEsICAgICAgIDEzNjcsICAgICAgIDEzNjcsICAgICAgIDEwLCAgICAgMjAxMywgMHg4ODZlYWIyYgorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgNTE4NDAwLCAweGMwZTYxN2M4CisxLCAgICAgICAxMzc3LCAgICAgICAxMzc3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Nzg4MGE1YWMKKzEsICAgICAgIDEzOTIsICAgICAgIDEzOTIsICAgICAgIDEwLCAgICAgMjAxMywgMHg1NWNmOWE3MgorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgNTE4NDAwLCAweGNjNzhiZmJmCisxLCAgICAgICAxNDAyLCAgICAgICAxNDAyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZmYxOTlhNDEKKzEsICAgICAgIDE0MTIsICAgICAgIDE0MTIsICAgICAgIDEwLCAgICAgMjAxMywgMHhkYmM3YTAyOQorMSwgICAgICAgMTQyMiwgICAgICAgMTQyMiwgICAgICAgMTAsICAgICAyMDEzLCAweDEwMTI5NDBhCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4OGE5YjkyNGYKKzEsICAgICAgIDE0MzUsICAgICAgIDE0MzUsICAgICAgIDEwLCAgICAgMjAxMywgMHgwNTk4Yjg0ZgorMSwgICAgICAgMTQ0NSwgICAgICAgMTQ0NSwgICAgICAgMTAsICAgICAyMDEzLCAweDJkZWE5Mjk2CisxLCAgICAgICAxNDU1LCAgICAgICAxNDU1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDQzNTgwYzMKKzEsICAgICAgIDE0NjUsICAgICAgIDE0NjUsICAgICAgIDEwLCAgICAgMjAxMywgMHg4ZDMxOWYxMAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgNTE4NDAwLCAweGIyMWRiMzhhCisxLCAgICAgICAxNDc1LCAgICAgICAxNDc1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YWNmNGFjZmUKKzEsICAgICAgIDE0ODUsICAgICAgIDE0ODUsICAgICAgIDEwLCAgICAgMjAxMywgMHg4MmIwYWM3YgorMSwgICAgICAgMTQ5NSwgICAgICAgMTQ5NSwgICAgICAgMTAsICAgICAyMDEzLCAweDlhN2NiNzFjCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZDVhYjVmMjcKKzEsICAgICAgIDE1MDUsICAgICAgIDE1MDUsICAgICAgIDEwLCAgICAgMjAxMywgMHhiZTdjOWJjNAorMSwgICAgICAgMTUyMCwgICAgICAgMTUyMCwgICAgICAgMTAsICAgICAyMDEzLCAweDkzY2JhMWZkCisxLCAgICAgICAxNTMwLCAgICAgICAxNTMwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4N2ZiN2IxMWYKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDUxODQwMCwgMHhjMWI3YjA2MAorMSwgICAgICAgMTU0MCwgICAgICAgMTU0MCwgICAgICAgMTAsICAgICAyMDEzLCAweGQ5ZGVhNDZiCisxLCAgICAgICAxNTUwLCAgICAgICAxNTUwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZmUxMWE1YjIKKzEsICAgICAgIDE1NjAsICAgICAgIDE1NjAsICAgICAgIDEwLCAgICAgMjAxMywgMHgwMjQzYTkzNworMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgNTE4NDAwLCAweDRjZDQ3N2U4CisxLCAgICAgICAxNTcwLCAgICAgICAxNTcwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MWVhYmE5ODEKKzEsICAgICAgIDE1ODAsICAgICAgIDE1ODAsICAgICAgIDEwLCAgICAgMjAxMywgMHgwODhmOTYyNgorMSwgICAgICAgMTU5MCwgICAgICAgMTU5MCwgICAgICAgMTAsICAgICAyMDEzLCAweDRmMWFhNTlhCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODRmYjQ4YjMKKzEsICAgICAgIDE2MDYsICAgICAgIDE2MDYsICAgICAgIDEwLCAgICAgMjAxMywgMHgwMzUyYjE0ZAorMSwgICAgICAgMTYxNiwgICAgICAgMTYxNiwgICAgICAgMTAsICAgICAyMDEzLCAweDAzY2M5YmY5CisxLCAgICAgICAxNjI2LCAgICAgICAxNjI2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YTk5NDkwNjAKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDUxODQwMCwgMHg2ZDJmZGQzNworMSwgICAgICAgMTYzNiwgICAgICAgMTYzNiwgICAgICAgMTAsICAgICAyMDEzLCAweDA3YTg5NTA5CisxLCAgICAgICAxNjQ2LCAgICAgICAxNjQ2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MWU1ODhlOGEKKzEsICAgICAgIDE2NTYsICAgICAgIDE2NTYsICAgICAgIDEwLCAgICAgMjAxMywgMHg3ODQ1YjdjMQorMSwgICAgICAgMTY2NiwgICAgICAgMTY2NiwgICAgICAgMTAsICAgICAyMDEzLCAweDY3NmZhM2M3CiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4Zjc1NGVkZDgKKzEsICAgICAgIDE2NzYsICAgICAgIDE2NzYsICAgICAgIDEwLCAgICAgMjAxMywgMHhlNWJmYWU1NQorMSwgICAgICAgMTY5MSwgICAgICAgMTY5MSwgICAgICAgMTAsICAgICAyMDEzLCAweGIxYmM5MjQ5CisxLCAgICAgICAxNzAxLCAgICAgICAxNzAxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZWNkN2FiZmIKKzAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgIDUxODQwMCwgMHg1MjBjYmRjZAorMSwgICAgICAgMTcxMSwgICAgICAgMTcxMSwgICAgICAgMTAsICAgICAyMDEzLCAweDAzODlhNmQ1CisxLCAgICAgICAxNzIxLCAgICAgICAxNzIxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZjliNjlkYTEKKzEsICAgICAgIDE3MzEsICAgICAgIDE3MzEsICAgICAgIDEwLCAgICAgMjAxMywgMHgyYmJhYWZjNAorMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgNTE4NDAwLCAweDU0YTUzYzU5CisxLCAgICAgICAxNzQxLCAgICAgICAxNzQxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDU3MzhlYjIKKzEsICAgICAgIDE3NTEsICAgICAgIDE3NTEsICAgICAgIDEwLCAgICAgMjAxMywgMHhmMjhlYTliNgorMSwgICAgICAgMTc2MSwgICAgICAgMTc2MSwgICAgICAgMTAsICAgICAyMDEzLCAweDBkNmRhYjdhCiswLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmI5ZDNjOTMKKzEsICAgICAgIDE3NzYsICAgICAgIDE3NzYsICAgICAgIDEwLCAgICAgMjAxMywgMHg2YzA0YjU4NgorMSwgICAgICAgMTc4NiwgICAgICAgMTc4NiwgICAgICAgMTAsICAgICAyMDEzLCAweDc0ZTRiNTBjCisxLCAgICAgICAxNzk2LCAgICAgICAxNzk2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4N2NkNmFkOWIKKzAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYjg0ZTU4MworMSwgICAgICAgMTgwNiwgICAgICAgMTgwNiwgICAgICAgMTAsICAgICAyMDEzLCAweDcwYzc5ZDgzCisxLCAgICAgICAxODE2LCAgICAgICAxODE2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NzQxZWFiM2MKKzEsICAgICAgIDE4MjYsICAgICAgIDE4MjYsICAgICAgIDEwLCAgICAgMjAxMywgMHhiOTcyYThjZgorMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgNTE4NDAwLCAweGYwM2I5ZjRmCisxLCAgICAgICAxODM2LCAgICAgICAxODM2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDE0M2E3MzQKKzEsICAgICAgIDE4NDYsICAgICAgIDE4NDYsICAgICAgIDEwLCAgICAgMjAxMywgMHhhOThjYjQ1NAorMSwgICAgICAgMTg2MiwgICAgICAgMTg2MiwgICAgICAgMTAsICAgICAyMDEzLCAweDUxZTg5MDczCiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4OGI4ODYzNWQKKzEsICAgICAgIDE4NzIsICAgICAgIDE4NzIsICAgICAgIDEwLCAgICAgMjAxMywgMHgxOTJjYjQxOAorMSwgICAgICAgMTg4MiwgICAgICAgMTg4MiwgICAgICAgMTAsICAgICAyMDEzLCAweDZjNTVhYTI5CisxLCAgICAgICAxODkyLCAgICAgICAxODkyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4Zjg2ZmFkNzAKKzAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgIDUxODQwMCwgMHg5NzVmYjU4ZAorMSwgICAgICAgMTkwMiwgICAgICAgMTkwMiwgICAgICAgMTAsICAgICAyMDEzLCAweDA2ZWNhNjJkCisxLCAgICAgICAxOTEyLCAgICAgICAxOTEyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTRmMmExZDIKKzEsICAgICAgIDE5MjIsICAgICAgIDE5MjIsICAgICAgIDEwLCAgICAgMjAxMywgMHhlNTQyYWZiNgorMSwgICAgICAgMTkzMiwgICAgICAgMTkzMiwgICAgICAgMTAsICAgICAyMDEzLCAweDc3ZjFiMGMzCiswLCAgICAgICAgIDU4LCAgICAgICAgIDU4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4OWQ2M2MxMDEKKzEsICAgICAgIDE5NDcsICAgICAgIDE5NDcsICAgICAgIDEwLCAgICAgMjAxMywgMHgyN2NlOWNkMQorMSwgICAgICAgMTk1NywgICAgICAgMTk1NywgICAgICAgMTAsICAgICAyMDEzLCAweDZjOGQ4ZjAyCisxLCAgICAgICAxOTY3LCAgICAgICAxOTY3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzJhZmEzODMKKzAsICAgICAgICAgNTksICAgICAgICAgNTksICAgICAgICAxLCAgIDUxODQwMCwgMHg2ZTczOTE1MworMSwgICAgICAgMTk3NywgICAgICAgMTk3NywgICAgICAgMTAsICAgICAyMDEzLCAweGI5MGM4OGE3CisxLCAgICAgICAxOTg3LCAgICAgICAxOTg3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MTBiNDk0ZWQKKzEsICAgICAgIDE5OTcsICAgICAgIDE5OTcsICAgICAgIDEwLCAgICAgMjAxMywgMHgwY2Y4YTU5NQorMCwgICAgICAgICA2MCwgICAgICAgICA2MCwgICAgICAgIDEsICAgNTE4NDAwLCAweGFmNmE1ZmFjCisxLCAgICAgICAyMDA3LCAgICAgICAyMDA3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDlmODg4NjMKKzEsICAgICAgIDIwMTcsICAgICAgIDIwMTcsICAgICAgIDEwLCAgICAgMjAxMywgMHg2N2Y1YTg3ZQorMSwgICAgICAgMjAzMiwgICAgICAgMjAzMiwgICAgICAgMTAsICAgICAyMDEzLCAweGM2Mzg5MmI4CiswLCAgICAgICAgIDYxLCAgICAgICAgIDYxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4Yzg3ZWZlOWMKKzEsICAgICAgIDIwNDIsICAgICAgIDIwNDIsICAgICAgIDEwLCAgICAgMjAxMywgMHg2ZGU5OTM1YworMSwgICAgICAgMjA1MiwgICAgICAgMjA1MiwgICAgICAgMTAsICAgICAyMDEzLCAweGFkZmNiNDczCisxLCAgICAgICAyMDYyLCAgICAgICAyMDYyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4N2JhOWFiZTcKKzAsICAgICAgICAgNjIsICAgICAgICAgNjIsICAgICAgICAxLCAgIDUxODQwMCwgMHhkZjQ3OTY5ZgorMSwgICAgICAgMjA3MiwgICAgICAgMjA3MiwgICAgICAgMTAsICAgICAyMDEzLCAweDZiNzliNmM4CisxLCAgICAgICAyMDgyLCAgICAgICAyMDgyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YWU0NmI2NzAKKzEsICAgICAgIDIwOTIsICAgICAgIDIwOTIsICAgICAgIDEwLCAgICAgMjAxMywgMHhhM2ZiOTk2MQorMSwgICAgICAgMjEwMiwgICAgICAgMjEwMiwgICAgICAgMTAsICAgICAyMDEzLCAweDM0MTNhNGNiCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZmE1ZDJhYjAKKzEsICAgICAgIDIxMTgsICAgICAgIDIxMTgsICAgICAgIDEwLCAgICAgMjAxMywgMHgyYzE2YjQ4ZQorMSwgICAgICAgMjEyOCwgICAgICAgMjEyOCwgICAgICAgMTAsICAgICAyMDEzLCAweGQyNTU5ZmQ1CiswLCAgICAgICAgIDY0LCAgICAgICAgIDY0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NzQyOGE0NmEKKzEsICAgICAgIDIxMzgsICAgICAgIDIxMzgsICAgICAgIDEwLCAgICAgMjAxMywgMHhhZmRlYjY4ZAorMSwgICAgICAgMjE0OCwgICAgICAgMjE0OCwgICAgICAgMTAsICAgICAyMDEzLCAweDUyZjc5Yzk3CisxLCAgICAgICAyMTU4LCAgICAgICAyMTU4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NmYyMDkxZTEKKzEsICAgICAgIDIxNjgsICAgICAgIDIxNjgsICAgICAgIDEwLCAgICAgMjAxMywgMHgwM2ZjYTFmZAorMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgNTE4NDAwLCAweDNjNmM5M2Q5CisxLCAgICAgICAyMTc4LCAgICAgICAyMTc4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NjJkOThhOGIKKzEsICAgICAgIDIxODgsICAgICAgIDIxODgsICAgICAgIDEwLCAgICAgMjAxMywgMHg3MjdjOTg0NQorMCwgICAgICAgICA2NiwgICAgICAgICA2NiwgICAgICAgIDEsICAgNTE4NDAwLCAweDlhMmZkZTVkCisxLCAgICAgICAyMjAzLCAgICAgICAyMjAzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ODEwM2FlMTUKKzEsICAgICAgIDIyMTMsICAgICAgIDIyMTMsICAgICAgIDEwLCAgICAgMjAxMywgMHg3YmNhYTRmYworMSwgICAgICAgMjIyMywgICAgICAgMjIyMywgICAgICAgMTAsICAgICAyMDEzLCAweDJkODA5YTQzCisxLCAgICAgICAyMjMzLCAgICAgICAyMjMzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YWEyMGFiOWQKKzAsICAgICAgICAgNjcsICAgICAgICAgNjcsICAgICAgICAxLCAgIDUxODQwMCwgMHgzODU4ZmQ2NworMSwgICAgICAgMjI0MywgICAgICAgMjI0MywgICAgICAgMTAsICAgICAyMDEzLCAweDQwYzBiOGYxCisxLCAgICAgICAyMjUzLCAgICAgICAyMjUzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDEyYzlhN2UKKzEsICAgICAgIDIyNjMsICAgICAgIDIyNjMsICAgICAgIDEwLCAgICAgMjAxMywgMHhjNzE1OTk0MworMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgNTE4NDAwLCAweDdkNjVmYzU4CisxLCAgICAgICAyMjczLCAgICAgICAyMjczLCAgICAgICAxMCwgICAgIDIwMTMsIDB4M2M4M2EzYzEKKzEsICAgICAgIDIyODgsICAgICAgIDIyODgsICAgICAgIDEwLCAgICAgMjAxMywgMHhmMWIwYjdiNQorMSwgICAgICAgMjI5OCwgICAgICAgMjI5OCwgICAgICAgMTAsICAgICAyMDEzLCAweGY3YjhhOTI4CiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZGNiZDRiNTMKKzEsICAgICAgIDIzMDgsICAgICAgIDIzMDgsICAgICAgIDEwLCAgICAgMjAxMywgMHhiM2VjOWY4YworMSwgICAgICAgMjMxOCwgICAgICAgMjMxOCwgICAgICAgMTAsICAgICAyMDEzLCAweDA4OGRiM2I0CisxLCAgICAgICAyMzI4LCAgICAgICAyMzI4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZDNiN2IwMWQKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgIDUxODQwMCwgMHgwM2Y3MzNkMgorMSwgICAgICAgMjMzOCwgICAgICAgMjMzOCwgICAgICAgMTAsICAgICAyMDEzLCAweDI2ZTljNzQ3CisxLCAgICAgICAyMzQ4LCAgICAgICAyMzQ4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjM0OTc4ZTIKKzEsICAgICAgIDIzNTgsICAgICAgIDIzNTgsICAgICAgIDEwLCAgICAgMjAxMywgMHg5MWRiYjEwYworMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgNTE4NDAwLCAweDU4ZDkxN2IwCisxLCAgICAgICAyMzc0LCAgICAgICAyMzc0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZDlkM2EyZjEKKzEsICAgICAgIDIzODQsICAgICAgIDIzODQsICAgICAgIDEwLCAgICAgMjAxMywgMHgzOWY1YjE1MQorMSwgICAgICAgMjM5NCwgICAgICAgMjM5NCwgICAgICAgMTAsICAgICAyMDEzLCAweDI5ZmI5MWUwCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MTg5ODM3MWYKKzEsICAgICAgIDI0MDQsICAgICAgIDI0MDQsICAgICAgIDEwLCAgICAgMjAxMywgMHg5M2Q0YjU1MAorMSwgICAgICAgMjQxNCwgICAgICAgMjQxNCwgICAgICAgMTAsICAgICAyMDEzLCAweDI5MGZhMTYyCisxLCAgICAgICAyNDI0LCAgICAgICAyNDI0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWUxNjlmMGIKKzEsICAgICAgIDI0MzQsICAgICAgIDI0MzQsICAgICAgIDEwLCAgICAgMjAxMywgMHgyZjUzYWNmZgorMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgNTE4NDAwLCAweDJmNWI1NDE4CisxLCAgICAgICAyNDQ0LCAgICAgICAyNDQ0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDE3M2FiMWQKKzEsICAgICAgIDI0NTksICAgICAgIDI0NTksICAgICAgIDEwLCAgICAgMjAxMywgMHgzZjM3YThmOAorMSwgICAgICAgMjQ2OSwgICAgICAgMjQ2OSwgICAgICAgMTAsICAgICAyMDEzLCAweGU2MWJhYTUwCiswLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YTcxZjVhMjkKKzEsICAgICAgIDI0NzksICAgICAgIDI0NzksICAgICAgIDEwLCAgICAgMjAxMywgMHgyNWJlOWJiNworMSwgICAgICAgMjQ4OSwgICAgICAgMjQ4OSwgICAgICAgMTAsICAgICAyMDEzLCAweDczMTA5ZGNjCisxLCAgICAgICAyNDk5LCAgICAgICAyNDk5LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MmQ4OWIxMTYKKzAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgIDUxODQwMCwgMHhhZDc4NDI2YgorMSwgICAgICAgMjUwOSwgICAgICAgMjUwOSwgICAgICAgMTAsICAgICAyMDEzLCAweDBhZTVhZGJlCisxLCAgICAgICAyNTE5LCAgICAgICAyNTE5LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NjRhNzk4YWUKKzEsICAgICAgIDI1MjksICAgICAgIDI1MjksICAgICAgIDEwLCAgICAgMjAxMywgMHg1ODNmYWMwYworMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgNTE4NDAwLCAweDBjOTE1NWUzCisxLCAgICAgICAyNTQ0LCAgICAgICAyNTQ0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTc1MmI3YmUKKzEsICAgICAgIDI1NTQsICAgICAgIDI1NTQsICAgICAgIDEwLCAgICAgMjAxMywgMHhiM2ZiOWQ1ZAorMSwgICAgICAgMjU2NCwgICAgICAgMjU2NCwgICAgICAgMTAsICAgICAyMDEzLCAweGFlYjBiZjkzCiswLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NGZhYzQ4MTcKKzEsICAgICAgIDI1NzQsICAgICAgIDI1NzQsICAgICAgIDEwLCAgICAgMjAxMywgMHhhYjYxYzE3ZAorMSwgICAgICAgMjU4NCwgICAgICAgMjU4NCwgICAgICAgMTAsICAgICAyMDEzLCAweDkyZDJhZGQwCisxLCAgICAgICAyNTk0LCAgICAgICAyNTk0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjM0Yjk2ZWMKKzAsICAgICAgICAgNzgsICAgICAgICAgNzgsICAgICAgICAxLCAgIDUxODQwMCwgMHhjYWNiOTYzZQorMSwgICAgICAgMjYwNCwgICAgICAgMjYwNCwgICAgICAgMTAsICAgICAyMDEzLCAweDljYjE5ZDM1CisxLCAgICAgICAyNjE0LCAgICAgICAyNjE0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjdiM2I5NjEKKzEsICAgICAgIDI2MzAsICAgICAgIDI2MzAsICAgICAgIDEwLCAgICAgMjAxMywgMHgyYTUyYTIwYgorMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgNTE4NDAwLCAweDNhNjE4M2NjCisxLCAgICAgICAyNjQwLCAgICAgICAyNjQwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDU5ZWFmMDYKKzEsICAgICAgIDI2NTAsICAgICAgIDI2NTAsICAgICAgIDEwLCAgICAgMjAxMywgMHgwZDQ5YWM4YQorMSwgICAgICAgMjY2MCwgICAgICAgMjY2MCwgICAgICAgMTAsICAgICAyMDEzLCAweDA5NWI5N2NmCiswLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NjVkNDdlOTAKKzEsICAgICAgIDI2NzAsICAgICAgIDI2NzAsICAgICAgIDEwLCAgICAgMjAxMywgMHgwM2UyOGQ5NAorMSwgICAgICAgMjY4MCwgICAgICAgMjY4MCwgICAgICAgMTAsICAgICAyMDEzLCAweDUwZDc5ZjQ4CisxLCAgICAgICAyNjkwLCAgICAgICAyNjkwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NzFjOWE0NTkKKzEsICAgICAgIDI3MDAsICAgICAgIDI3MDAsICAgICAgIDEwLCAgICAgMjAxMywgMHg4Y2Q2YWZmYworMCwgICAgICAgICA4MSwgICAgICAgICA4MSwgICAgICAgIDEsICAgNTE4NDAwLCAweGY5YjdlNTE3CisxLCAgICAgICAyNzE1LCAgICAgICAyNzE1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ODlmYmE5YzkKKzEsICAgICAgIDI3MjUsICAgICAgIDI3MjUsICAgICAgIDEwLCAgICAgMjAxMywgMHg3NGExYjgwMAorMSwgICAgICAgMjczNSwgICAgICAgMjczNSwgICAgICAgMTAsICAgICAyMDEzLCAweDY3NWRjODRkCiswLCAgICAgICAgIDgyLCAgICAgICAgIDgyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4OGFhYzJlNjYKKzEsICAgICAgIDI3NDUsICAgICAgIDI3NDUsICAgICAgIDEwLCAgICAgMjAxMywgMHgyNWZlOGYwYworMSwgICAgICAgMjc1NSwgICAgICAgMjc1NSwgICAgICAgMTAsICAgICAyMDEzLCAweGYzOGRhMjZiCisxLCAgICAgICAyNzY1LCAgICAgICAyNzY1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MWQwNGE1MDAKKzAsICAgICAgICAgODMsICAgICAgICAgODMsICAgICAgICAxLCAgIDUxODQwMCwgMHg1NTU0NTZlNAorMSwgICAgICAgMjc3NSwgICAgICAgMjc3NSwgICAgICAgMTAsICAgICAyMDEzLCAweGYwMWNiMjI3CisxLCAgICAgICAyNzg1LCAgICAgICAyNzg1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTM3ZTkwMjgKKzEsICAgICAgIDI4MDAsICAgICAgIDI4MDAsICAgICAgIDEwLCAgICAgMjAxMywgMHhmNmI1YWE3YworMCwgICAgICAgICA4NCwgICAgICAgICA4NCwgICAgICAgIDEsICAgNTE4NDAwLCAweDczYmM2MTk0CisxLCAgICAgICAyODEwLCAgICAgICAyODEwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZWEyMzkxYjAKKzEsICAgICAgIDI4MjAsICAgICAgIDI4MjAsICAgICAgIDEwLCAgICAgMjAxMywgMHhiMjM0YWJjZAorMSwgICAgICAgMjgzMCwgICAgICAgMjgzMCwgICAgICAgMTAsICAgICAyMDEzLCAweDU4NDBhNTBmCiswLCAgICAgICAgIDg1LCAgICAgICAgIDg1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MTQ3YjY3OGEKKzEsICAgICAgIDI4NDAsICAgICAgIDI4NDAsICAgICAgIDEwLCAgICAgMjAxMywgMHg0ODJjYWQ3YgorMSwgICAgICAgMjg1MCwgICAgICAgMjg1MCwgICAgICAgMTAsICAgICAyMDEzLCAweGQwODVhNjI5CisxLCAgICAgICAyODYwLCAgICAgICAyODYwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MWFkZjhlYTgKKzAsICAgICAgICAgODYsICAgICAgICAgODYsICAgICAgICAxLCAgIDUxODQwMCwgMHg2NzIwOTYyMgorMSwgICAgICAgMjg3MCwgICAgICAgMjg3MCwgICAgICAgMTAsICAgICAyMDEzLCAweGJjM2FiYTMxCisxLCAgICAgICAyODg2LCAgICAgICAyODg2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWU3ZWE4NTcKKzEsICAgICAgIDI4OTYsICAgICAgIDI4OTYsICAgICAgIDEwLCAgICAgMjAxMywgMHg3ZTY2OTY3MQorMCwgICAgICAgICA4NywgICAgICAgICA4NywgICAgICAgIDEsICAgNTE4NDAwLCAweGRiZjA0MzhiCisxLCAgICAgICAyOTA2LCAgICAgICAyOTA2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTJkMzk2NzAKKzEsICAgICAgIDI5MTYsICAgICAgIDI5MTYsICAgICAgIDEwLCAgICAgMjAxMywgMHhlODI5YjRhOAorMSwgICAgICAgMjkyNiwgICAgICAgMjkyNiwgICAgICAgMTAsICAgICAyMDEzLCAweDViNzNhMzYzCisxLCAgICAgICAyOTM2LCAgICAgICAyOTM2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YzFmZmE4MjQKKzAsICAgICAgICAgODgsICAgICAgICAgODgsICAgICAgICAxLCAgIDUxODQwMCwgMHhlNzEyYjc2NAorMSwgICAgICAgMjk0NiwgICAgICAgMjk0NiwgICAgICAgMTAsICAgICAyMDEzLCAweDkxOWJhOTFhCisxLCAgICAgICAyOTU2LCAgICAgICAyOTU2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YTE3OTliZTcKKzAsICAgICAgICAgODksICAgICAgICAgODksICAgICAgICAxLCAgIDUxODQwMCwgMHhmMzk2ZGU4OAorMSwgICAgICAgMjk3MSwgICAgICAgMjk3MSwgICAgICAgMTAsICAgICAyMDEzLCAweDliOGU5MmMxCisxLCAgICAgICAyOTgxLCAgICAgICAyOTgxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWRkZWI1NTQKKzEsICAgICAgIDI5OTEsICAgICAgIDI5OTEsICAgICAgIDEwLCAgICAgMjAxMywgMHhmNmI5OWQwYgorMSwgICAgICAgMzAwMSwgICAgICAgMzAwMSwgICAgICAgMTAsICAgICAyMDEzLCAweDY5ODdjNGE0CiswLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NWJiNGE4MWQKKzEsICAgICAgIDMwMTEsICAgICAgIDMwMTEsICAgICAgIDEwLCAgICAgMjAxMywgMHhmM2JlOWY3MgorMSwgICAgICAgMzAyMSwgICAgICAgMzAyMSwgICAgICAgMTAsICAgICAyMDEzLCAweGFlNTFhMmVmCisxLCAgICAgICAzMDMxLCAgICAgICAzMDMxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWMyM2FhYWMKKzAsICAgICAgICAgOTEsICAgICAgICAgOTEsICAgICAgICAxLCAgIDUxODQwMCwgMHg3MzFhOThjOAorMSwgICAgICAgMzA0MSwgICAgICAgMzA0MSwgICAgICAgMTAsICAgICAyMDEzLCAweGU3YTlhOTk0CisxLCAgICAgICAzMDU2LCAgICAgICAzMDU2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZGQxMGE5OTcKKzEsICAgICAgIDMwNjYsICAgICAgIDMwNjYsICAgICAgIDEwLCAgICAgMjAxMywgMHg3NmUwYTc0OQorMCwgICAgICAgICA5MiwgICAgICAgICA5MiwgICAgICAgIDEsICAgNTE4NDAwLCAweGIwZjYxNjA4CisxLCAgICAgICAzMDc2LCAgICAgICAzMDc2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ODk5ZWE2ZmIKKzEsICAgICAgIDMwODYsICAgICAgIDMwODYsICAgICAgIDEwLCAgICAgMjAxMywgMHhjODQ0OTAyOQorMSwgICAgICAgMzA5NiwgICAgICAgMzA5NiwgICAgICAgMTAsICAgICAyMDEzLCAweDZhMzRiNDY5CiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODY4NDVkMTEKKzEsICAgICAgIDMxMDYsICAgICAgIDMxMDYsICAgICAgIDEwLCAgICAgMjAxMywgMHhmNmYxYjE3MgorMSwgICAgICAgMzExNiwgICAgICAgMzExNiwgICAgICAgMTAsICAgICAyMDEzLCAweDc5MDc5NmY4CisxLCAgICAgICAzMTI2LCAgICAgICAzMTI2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MTkwYTg3NGEKKzAsICAgICAgICAgOTQsICAgICAgICAgOTQsICAgICAgICAxLCAgIDUxODQwMCwgMHgyNTExMzUwYQorMSwgICAgICAgMzE0MiwgICAgICAgMzE0MiwgICAgICAgMTAsICAgICAyMDEzLCAweDk5YTRhNWUzCisxLCAgICAgICAzMTUyLCAgICAgICAzMTUyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4OWI2MTljMzMKKzEsICAgICAgIDMxNjIsICAgICAgIDMxNjIsICAgICAgIDEwLCAgICAgMjAxMywgMHgyNDYyYTFjMAorMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgNTE4NDAwLCAweGQwOGYyMGQxCisxLCAgICAgICAzMTcyLCAgICAgICAzMTcyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZDQ0NmI3ODEKKzEsICAgICAgIDMxODIsICAgICAgIDMxODIsICAgICAgIDEwLCAgICAgMjAxMywgMHhkNDIxYWVjMAorMSwgICAgICAgMzE5MiwgICAgICAgMzE5MiwgICAgICAgMTAsICAgICAyMDEzLCAweDZhOWQ5MTY0CisxLCAgICAgICAzMjAyLCAgICAgICAzMjAyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDJjYmFmN2YKKzAsICAgICAgICAgOTYsICAgICAgICAgOTYsICAgICAgICAxLCAgIDUxODQwMCwgMHgwNjE5YzA2NworMSwgICAgICAgMzIxMiwgICAgICAgMzIxMiwgICAgICAgMTAsICAgICAyMDEzLCAweDVhYjFhMDk4CisxLCAgICAgICAzMjI3LCAgICAgICAzMjI3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTI4MGFjZTEKKzAsICAgICAgICAgOTcsICAgICAgICAgOTcsICAgICAgICAxLCAgIDUxODQwMCwgMHg5ZjU0YTg0YQorMSwgICAgICAgMzIzNywgICAgICAgMzIzNywgICAgICAgMTAsICAgICAyMDEzLCAweDMyZDBhZWNmCisxLCAgICAgICAzMjQ3LCAgICAgICAzMjQ3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjgwNWE3NTgKKzEsICAgICAgIDMyNTcsICAgICAgIDMyNTcsICAgICAgIDEwLCAgICAgMjAxMywgMHg2MThhYjYyOQorMSwgICAgICAgMzI2NywgICAgICAgMzI2NywgICAgICAgMTAsICAgICAyMDEzLCAweGU0YzI5ZTBkCiswLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MDA0ODZkY2YKKzEsICAgICAgIDMyNzcsICAgICAgIDMyNzcsICAgICAgIDEwLCAgICAgMjAxMywgMHg5MTE5YTNiYQorMSwgICAgICAgMzI4NywgICAgICAgMzI4NywgICAgICAgMTAsICAgICAyMDEzLCAweDFmNWVhM2QwCisxLCAgICAgICAzMjk3LCAgICAgICAzMjk3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4OTAzZTk5YzIKKzAsICAgICAgICAgOTksICAgICAgICAgOTksICAgICAgICAxLCAgIDUxODQwMCwgMHg2ODgxMDc4YworMSwgICAgICAgMzMxMiwgICAgICAgMzMxMiwgICAgICAgMTAsICAgICAyMDEzLCAweDEyNmI5ZTY0CisxLCAgICAgICAzMzIyLCAgICAgICAzMzIyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZDIwN2FhOTEKKzEsICAgICAgIDMzMzIsICAgICAgIDMzMzIsICAgICAgIDEwLCAgICAgMjAxMywgMHg3YTIyOWZhZAorMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDQ4NzNmN2MyCisxLCAgICAgICAzMzQyLCAgICAgICAzMzQyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NzY1MWFlZGEKKzEsICAgICAgIDMzNTIsICAgICAgIDMzNTIsICAgICAgIDEwLCAgICAgMjAxMywgMHhiNzRjN2YwYworMSwgICAgICAgMzM2MiwgICAgICAgMzM2MiwgICAgICAgMTAsICAgICAyMDEzLCAweGFmOWZiYjg5CiswLCAgICAgICAgMTAxLCAgICAgICAgMTAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NjNhYjUzYzgKKzEsICAgICAgIDMzNzIsICAgICAgIDMzNzIsICAgICAgIDEwLCAgICAgMjAxMywgMHhmMGY1YTYyZgorMSwgICAgICAgMzM4MiwgICAgICAgMzM4MiwgICAgICAgMTAsICAgICAyMDEzLCAweGEyMDA5MTMzCisxLCAgICAgICAzMzk4LCAgICAgICAzMzk4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjZkOWE1NTYKKzAsICAgICAgICAxMDIsICAgICAgICAxMDIsICAgICAgICAxLCAgIDUxODQwMCwgMHhjNzY4ZGIxYQorMSwgICAgICAgMzQwOCwgICAgICAgMzQwOCwgICAgICAgMTAsICAgICAyMDEzLCAweDBmOTVhMjg2CisxLCAgICAgICAzNDE4LCAgICAgICAzNDE4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NGZiZTg5NzUKKzEsICAgICAgIDM0MjgsICAgICAgIDM0MjgsICAgICAgIDEwLCAgICAgMjAxMywgMHgxOGYxOWM1NAorMCwgICAgICAgIDEwMywgICAgICAgIDEwMywgICAgICAgIDEsICAgNTE4NDAwLCAweDVhNGViOWMwCisxLCAgICAgICAzNDQwLCAgICAgICAzNDQwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4OTU3NjliZTYKKzEsICAgICAgIDM0NTAsICAgICAgIDM0NTAsICAgICAgIDEwLCAgICAgMjAxMywgMHg3MzliYTcyMgorMSwgICAgICAgMzQ2MCwgICAgICAgMzQ2MCwgICAgICAgMTAsICAgICAyMDEzLCAweGM3ZGRhNjg3CisxLCAgICAgICAzNDcwLCAgICAgICAzNDcwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTMyMmEzYTQKKzAsICAgICAgICAxMDQsICAgICAgICAxMDQsICAgICAgICAxLCAgIDUxODQwMCwgMHgwNjE2ZmRkZAorMSwgICAgICAgMzQ4MCwgICAgICAgMzQ4MCwgICAgICAgMTAsICAgICAyMDEzLCAweDRjZTdiYTljCisxLCAgICAgICAzNDkwLCAgICAgICAzNDkwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzM3NDhjMjAKKzEsICAgICAgIDM1MDAsICAgICAgIDM1MDAsICAgICAgIDEwLCAgICAgMjAxMywgMHhkZDk4YjY1ZAorMCwgICAgICAgIDEwNSwgICAgICAgIDEwNSwgICAgICAgIDEsICAgNTE4NDAwLCAweGZkZjE3NmQ2CisxLCAgICAgICAzNTEwLCAgICAgICAzNTEwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZDAyZTljZDYKKzEsICAgICAgIDM1MjYsICAgICAgIDM1MjYsICAgICAgIDEwLCAgICAgMjAxMywgMHg4MWRiYjNjNworMSwgICAgICAgMzUzNiwgICAgICAgMzUzNiwgICAgICAgMTAsICAgICAyMDEzLCAweDNhZmJhMWUwCiswLCAgICAgICAgMTA2LCAgICAgICAgMTA2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4Njc0OTk4YTIKKzEsICAgICAgIDM1NDYsICAgICAgIDM1NDYsICAgICAgIDEwLCAgICAgMjAxMywgMHg3MzU5OTRmZgorMSwgICAgICAgMzU1NiwgICAgICAgMzU1NiwgICAgICAgMTAsICAgICAyMDEzLCAweGY1NGNiZGEyCisxLCAgICAgICAzNTY2LCAgICAgICAzNTY2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4M2M1M2FkNWIKKzAsICAgICAgICAxMDcsICAgICAgICAxMDcsICAgICAgICAxLCAgIDUxODQwMCwgMHhjMjQwMTkzNworMSwgICAgICAgMzU3NiwgICAgICAgMzU3NiwgICAgICAgMTAsICAgICAyMDEzLCAweDNhMjU5NWE4CisxLCAgICAgICAzNTg2LCAgICAgICAzNTg2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjdiMzlmMzQKKzEsICAgICAgIDM1OTYsICAgICAgIDM1OTYsICAgICAgIDEwLCAgICAgMjAxMywgMHgyNjlmYTk0OQorMCwgICAgICAgIDEwOCwgICAgICAgIDEwOCwgICAgICAgIDEsICAgNTE4NDAwLCAweGJmYTMyMGY2CisxLCAgICAgICAzNjExLCAgICAgICAzNjExLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzUxOWFiMGIKKzEsICAgICAgIDM2MjEsICAgICAgIDM2MjEsICAgICAgIDEwLCAgICAgMjAxMywgMHhiOWYyYTdjMQorMSwgICAgICAgMzYzMSwgICAgICAgMzYzMSwgICAgICAgMTAsICAgICAyMDEzLCAweGZmNDc4NDRjCiswLCAgICAgICAgMTA5LCAgICAgICAgMTA5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NGI0ZmE3NTkKKzEsICAgICAgIDM2NDEsICAgICAgIDM2NDEsICAgICAgIDEwLCAgICAgMjAxMywgMHg4MzVlYTFlZgorMSwgICAgICAgMzY1MSwgICAgICAgMzY1MSwgICAgICAgMTAsICAgICAyMDEzLCAweGY0OTFiYzRlCisxLCAgICAgICAzNjYxLCAgICAgICAzNjYxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4OTBiYzg4ZjAKKzAsICAgICAgICAxMTAsICAgICAgICAxMTAsICAgICAgICAxLCAgIDUxODQwMCwgMHgwZDNmMzBmYQorMSwgICAgICAgMzY3MSwgICAgICAgMzY3MSwgICAgICAgMTAsICAgICAyMDEzLCAweDY3MThhYzQ4CisxLCAgICAgICAzNjgxLCAgICAgICAzNjgxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZmE4NWJkYjYKKzEsICAgICAgIDM2OTYsICAgICAgIDM2OTYsICAgICAgIDEwLCAgICAgMjAxMywgMHg2NDVjYjY3NworMCwgICAgICAgIDExMSwgICAgICAgIDExMSwgICAgICAgIDEsICAgNTE4NDAwLCAweDhlOGI5MjAyCisxLCAgICAgICAzNzA2LCAgICAgICAzNzA2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NmM0N2M2MzAKKzEsICAgICAgIDM3MTYsICAgICAgIDM3MTYsICAgICAgIDEwLCAgICAgMjAxMywgMHgxMGFhODgxMworMSwgICAgICAgMzcyNiwgICAgICAgMzcyNiwgICAgICAgMTAsICAgICAyMDEzLCAweGZjYjBhZmIzCisxLCAgICAgICAzNzM2LCAgICAgICAzNzM2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWY0OTliZTgKKzAsICAgICAgICAxMTIsICAgICAgICAxMTIsICAgICAgICAxLCAgIDUxODQwMCwgMHhmNGI2OTNjNgorMSwgICAgICAgMzc0NiwgICAgICAgMzc0NiwgICAgICAgMTAsICAgICAyMDEzLCAweGQxYjVhMTI4CisxLCAgICAgICAzNzU2LCAgICAgICAzNzU2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzAzY2MxMDIKKzEsICAgICAgIDM3NjYsICAgICAgIDM3NjYsICAgICAgIDEwLCAgICAgMjAxMywgMHhiNmNhOTNkZgorMCwgICAgICAgIDExMywgICAgICAgIDExMywgICAgICAgIDEsICAgNTE4NDAwLCAweGNlM2RjMjc1CisxLCAgICAgICAzNzgyLCAgICAgICAzNzgyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGRiN2E0NzUKKzEsICAgICAgIDM3OTIsICAgICAgIDM3OTIsICAgICAgIDEwLCAgICAgMjAxMywgMHhmM2Y0OWVkNworMSwgICAgICAgMzgwMiwgICAgICAgMzgwMiwgICAgICAgMTAsICAgICAyMDEzLCAweGY0OTVhODE5CiswLCAgICAgICAgMTE0LCAgICAgICAgMTE0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZWZiYjc0OTYKKzEsICAgICAgIDM4MTIsICAgICAgIDM4MTIsICAgICAgIDEwLCAgICAgMjAxMywgMHgyYjY3YTk5ZAorMSwgICAgICAgMzgyMiwgICAgICAgMzgyMiwgICAgICAgMTAsICAgICAyMDEzLCAweGU0ZWZiMTlhCisxLCAgICAgICAzODMyLCAgICAgICAzODMyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjBlODk3Y2EKKzAsICAgICAgICAxMTUsICAgICAgICAxMTUsICAgICAgICAxLCAgIDUxODQwMCwgMHg2ODQyYjE0ZQorMSwgICAgICAgMzg0MiwgICAgICAgMzg0MiwgICAgICAgMTAsICAgICAyMDEzLCAweDMzOGViZTI4CisxLCAgICAgICAzODUyLCAgICAgICAzODUyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDU4M2FkM2YKKzEsICAgICAgIDM4NjcsICAgICAgIDM4NjcsICAgICAgIDEwLCAgICAgMjAxMywgMHg3YWUxYTA4ZAorMCwgICAgICAgIDExNiwgICAgICAgIDExNiwgICAgICAgIDEsICAgNTE4NDAwLCAweDdhM2ZkNjVjCisxLCAgICAgICAzODc3LCAgICAgICAzODc3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4OTVhMzlmOWMKKzEsICAgICAgIDM4ODcsICAgICAgIDM4ODcsICAgICAgIDEwLCAgICAgMjAxMywgMHg0ZjdlYTEyMworMSwgICAgICAgMzg5NywgICAgICAgMzg5NywgICAgICAgMTAsICAgICAyMDEzLCAweDllZmI5YmExCiswLCAgICAgICAgMTE3LCAgICAgICAgMTE3LCAgICAgICAgMSwgICA1MTg0MDAsIDB4OTQ5ZTFlOGIKKzEsICAgICAgIDM5MDcsICAgICAgIDM5MDcsICAgICAgIDEwLCAgICAgMjAxMywgMHhmMzk1YjJjZAorMSwgICAgICAgMzkxNywgICAgICAgMzkxNywgICAgICAgMTAsICAgICAyMDEzLCAweDI2MWE4ODFlCisxLCAgICAgICAzOTI3LCAgICAgICAzOTI3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4N2YyZDlmNzIKKzEsICAgICAgIDM5MzcsICAgICAgIDM5MzcsICAgICAgIDEwLCAgICAgMjAxMywgMHgwMTA1YjM4ZAorMCwgICAgICAgIDExOCwgICAgICAgIDExOCwgICAgICAgIDEsICAgNTE4NDAwLCAweGZjNmMwOWFhCisxLCAgICAgICAzOTUyLCAgICAgICAzOTUyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGU1ZGI2N2UKKzEsICAgICAgIDM5NjIsICAgICAgIDM5NjIsICAgICAgIDEwLCAgICAgMjAxMywgMHhmYzliYWY5NworMCwgICAgICAgIDExOSwgICAgICAgIDExOSwgICAgICAgIDEsICAgNTE4NDAwLCAweDU2MWMyZmY1CisxLCAgICAgICAzOTcyLCAgICAgICAzOTcyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4OGUwMmExYjEKKzEsICAgICAgIDM5ODIsICAgICAgIDM5ODIsICAgICAgIDEwLCAgICAgMjAxMywgMHg2ZWVjYWFjOAorMSwgICAgICAgMzk5MiwgICAgICAgMzk5MiwgICAgICAgMTAsICAgICAyMDEzLCAweGY1NTU4ZjBjCisxLCAgICAgICA0MDAyLCAgICAgICA0MDAyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NTEyYmE5OWIKKzAsICAgICAgICAxMjAsICAgICAgICAxMjAsICAgICAgICAxLCAgIDUxODQwMCwgMHhmZDYyZTZiZAorMSwgICAgICAgNDAxMiwgICAgICAgNDAxMiwgICAgICAgMTAsICAgICAyMDEzLCAweDkzMmI5OTMyCisxLCAgICAgICA0MDIyLCAgICAgICA0MDIyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YzAxZWE5ODcKKzAsICAgICAgICAxMjEsICAgICAgICAxMjEsICAgICAgICAxLCAgIDUxODQwMCwgMHgwNDI3YTA3MAorMSwgICAgICAgNDAzOCwgICAgICAgNDAzOCwgICAgICAgMTAsICAgICAyMDEzLCAweDEwODc5Y2Y3CisxLCAgICAgICA0MDQ4LCAgICAgICA0MDQ4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4OTA2NzkzMzgKKzEsICAgICAgIDQwNTgsICAgICAgIDQwNTgsICAgICAgIDEwLCAgICAgMjAxMywgMHgwNzdkOGE5ZQorMSwgICAgICAgNDA2OCwgICAgICAgNDA2OCwgICAgICAgMTAsICAgICAyMDEzLCAweDk2OWZhNTdjCiswLCAgICAgICAgMTIyLCAgICAgICAgMTIyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MGJmNDhmZmYKKzEsICAgICAgIDQwNzgsICAgICAgIDQwNzgsICAgICAgIDEwLCAgICAgMjAxMywgMHhlMDQ5YWIwNworMSwgICAgICAgNDA4OCwgICAgICAgNDA4OCwgICAgICAgMTAsICAgICAyMDEzLCAweGY1MzViM2IzCisxLCAgICAgICA0MDk4LCAgICAgICA0MDk4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZmU3NmJkMzcKKzAsICAgICAgICAxMjMsICAgICAgICAxMjMsICAgICAgICAxLCAgIDUxODQwMCwgMHgzNTRkNDcwMAorMSwgICAgICAgNDEwOCwgICAgICAgNDEwOCwgICAgICAgMTAsICAgICAyMDEzLCAweGRlNzlhZDhjCisxLCAgICAgICA0MTIzLCAgICAgICA0MTIzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTg5YjljNDcKKzEsICAgICAgIDQxMzMsICAgICAgIDQxMzMsICAgICAgIDEwLCAgICAgMjAxMywgMHhjNTcwYjBmMAorMCwgICAgICAgIDEyNCwgICAgICAgIDEyNCwgICAgICAgIDEsICAgNTE4NDAwLCAweDYwODFjODBjCisxLCAgICAgICA0MTQzLCAgICAgICA0MTQzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZWU3MDljZDkKKzEsICAgICAgIDQxNTMsICAgICAgIDQxNTMsICAgICAgIDEwLCAgICAgMjAxMywgMHhjZmU1YWZhYgorMSwgICAgICAgNDE2MywgICAgICAgNDE2MywgICAgICAgMTAsICAgICAyMDEzLCAweDk4ZmY4Y2U0CiswLCAgICAgICAgMTI1LCAgICAgICAgMTI1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4OWM2YzUxYzYKKzEsICAgICAgIDQxNzMsICAgICAgIDQxNzMsICAgICAgIDEwLCAgICAgMjAxMywgMHg5ZDE5YjQ0YworMSwgICAgICAgNDE4MywgICAgICAgNDE4MywgICAgICAgMTAsICAgICAyMDEzLCAweDQzNDk5MTdhCisxLCAgICAgICA0MTkzLCAgICAgICA0MTkzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YmY1NGE1OWEKKzAsICAgICAgICAxMjYsICAgICAgICAxMjYsICAgICAgICAxLCAgIDUxODQwMCwgMHhhYWNkMzRkNworMSwgICAgICAgNDIwOCwgICAgICAgNDIwOCwgICAgICAgMTAsICAgICAyMDEzLCAweGM0YTM5OWUwCisxLCAgICAgICA0MjE4LCAgICAgICA0MjE4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MWJmNThmZjAKKzEsICAgICAgIDQyMjgsICAgICAgIDQyMjgsICAgICAgIDEwLCAgICAgMjAxMywgMHgzNTE4YWM1NgorMCwgICAgICAgIDEyNywgICAgICAgIDEyNywgICAgICAgIDEsICAgNTE4NDAwLCAweDU2NmJjZThlCisxLCAgICAgICA0MjM4LCAgICAgICA0MjM4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Y2QzOGMxZGUKKzEsICAgICAgIDQyNDgsICAgICAgIDQyNDgsICAgICAgIDEwLCAgICAgMjAxMywgMHhiZTdkOWM0ZAorMSwgICAgICAgNDI1OCwgICAgICAgNDI1OCwgICAgICAgMTAsICAgICAyMDEzLCAweGUxMTNhMzA2CisxLCAgICAgICA0MjY4LCAgICAgICA0MjY4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDgzMTk3ZWEKKzAsICAgICAgICAxMjgsICAgICAgICAxMjgsICAgICAgICAxLCAgIDUxODQwMCwgMHhiMTRmNjhiMworMSwgICAgICAgNDI3OCwgICAgICAgNDI3OCwgICAgICAgMTAsICAgICAyMDEzLCAweDE5MjliMWViCisxLCAgICAgICA0Mjk0LCAgICAgICA0Mjk0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWQ2ZWE1YWYKKzEsICAgICAgIDQzMDQsICAgICAgIDQzMDQsICAgICAgIDEwLCAgICAgMjAxMywgMHgwNTUxOWQ1MworMCwgICAgICAgIDEyOSwgICAgICAgIDEyOSwgICAgICAgIDEsICAgNTE4NDAwLCAweDAwNTQ1YjI5CisxLCAgICAgICA0MzE0LCAgICAgICA0MzE0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NTc3M2IzODAKKzEsICAgICAgIDQzMjQsICAgICAgIDQzMjQsICAgICAgIDEwLCAgICAgMjAxMywgMHhhYTcwYThmNQorMSwgICAgICAgNDMzNCwgICAgICAgNDMzNCwgICAgICAgMTAsICAgICAyMDEzLCAweDk5MGRiMGVjCiswLCAgICAgICAgMTMwLCAgICAgICAgMTMwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4OTg0YmVkZTUKKzEsICAgICAgIDQzNDQsICAgICAgIDQzNDQsICAgICAgIDEwLCAgICAgMjAxMywgMHg5MWQzYTYyMworMSwgICAgICAgNDM1NCwgICAgICAgNDM1NCwgICAgICAgMTAsICAgICAyMDEzLCAweGM5MWY5ODI0CisxLCAgICAgICA0MzY0LCAgICAgICA0MzY0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MWQwNThhYmYKKzAsICAgICAgICAxMzEsICAgICAgICAxMzEsICAgICAgICAxLCAgIDUxODQwMCwgMHg2YjkzMTljNgorMSwgICAgICAgNDM3OSwgICAgICAgNDM3OSwgICAgICAgMTAsICAgICAyMDEzLCAweDhkZTFiOGQ1CisxLCAgICAgICA0Mzg5LCAgICAgICA0Mzg5LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Nzg3MmIwNmIKKzEsICAgICAgIDQzOTksICAgICAgIDQzOTksICAgICAgIDEwLCAgICAgMjAxMywgMHhhMDg0YzIwMworMCwgICAgICAgIDEzMiwgICAgICAgIDEzMiwgICAgICAgIDEsICAgNTE4NDAwLCAweDE1ODJhZThjCisxLCAgICAgICA0NDA5LCAgICAgICA0NDA5LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZmY5MGFlOGQKKzEsICAgICAgIDQ0MTksICAgICAgIDQ0MTksICAgICAgIDEwLCAgICAgMjAxMywgMHg2MWRlYWQ4ZQorMSwgICAgICAgNDQyOSwgICAgICAgNDQyOSwgICAgICAgMTAsICAgICAyMDEzLCAweGVlNzZiMjg0CiswLCAgICAgICAgMTMzLCAgICAgICAgMTMzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZWNlMzM5YjYKKzEsICAgICAgIDQ0MzksICAgICAgIDQ0MzksICAgICAgIDEwLCAgICAgMjAxMywgMHhlODg4YWY3ZgorMSwgICAgICAgNDQ0OSwgICAgICAgNDQ0OSwgICAgICAgMTAsICAgICAyMDEzLCAweDVkNTdiMTE1CisxLCAgICAgICA0NDY0LCAgICAgICA0NDY0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Y2RiZmIxZDAKKzAsICAgICAgICAxMzQsICAgICAgICAxMzQsICAgICAgICAxLCAgIDUxODQwMCwgMHg3NDk0NmI4YgorMSwgICAgICAgNDQ3NCwgICAgICAgNDQ3NCwgICAgICAgMTAsICAgICAyMDEzLCAweDJlMjhhOTUyCisxLCAgICAgICA0NDg0LCAgICAgICA0NDg0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDc5NWE5OTQKKzEsICAgICAgIDQ0OTQsICAgICAgIDQ0OTQsICAgICAgIDEwLCAgICAgMjAxMywgMHg3ZTdlYTMwNAorMSwgICAgICAgNDUwNCwgICAgICAgNDUwNCwgICAgICAgMTAsICAgICAyMDEzLCAweDk1MDJjMWUxCiswLCAgICAgICAgMTM1LCAgICAgICAgMTM1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NWRmZmMwZDYKKzEsICAgICAgIDQ1MTQsICAgICAgIDQ1MTQsICAgICAgIDEwLCAgICAgMjAxMywgMHhmN2M3OGFiMgorMSwgICAgICAgNDUyNCwgICAgICAgNDUyNCwgICAgICAgMTAsICAgICAyMDEzLCAweDI0MDQ5ODE2CisxLCAgICAgICA0NTM0LCAgICAgICA0NTM0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NTIwODlkY2YKKzAsICAgICAgICAxMzYsICAgICAgICAxMzYsICAgICAgICAxLCAgIDUxODQwMCwgMHgzZjg1YzA1MworMSwgICAgICAgNDU1MCwgICAgICAgNDU1MCwgICAgICAgMTAsICAgICAyMDEzLCAweDIxNTBhMGIxCisxLCAgICAgICA0NTYwLCAgICAgICA0NTYwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4M2MyZTliOTMKKzEsICAgICAgIDQ1NzAsICAgICAgIDQ1NzAsICAgICAgIDEwLCAgICAgMjAxMywgMHg0OTFmOTMyYgorMCwgICAgICAgIDEzNywgICAgICAgIDEzNywgICAgICAgIDEsICAgNTE4NDAwLCAweDcxMjQxMjVkCisxLCAgICAgICA0NTgwLCAgICAgICA0NTgwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzEzNTljZjgKKzEsICAgICAgIDQ1OTAsICAgICAgIDQ1OTAsICAgICAgIDEwLCAgICAgMjAxMywgMHgxYjAwYWMzZgorMSwgICAgICAgNDYwMCwgICAgICAgNDYwMCwgICAgICAgMTAsICAgICAyMDEzLCAweDhkN2FiM2NiCiswLCAgICAgICAgMTM4LCAgICAgICAgMTM4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NDZiNzM2ZDUKKzEsICAgICAgIDQ2MTAsICAgICAgIDQ2MTAsICAgICAgIDEwLCAgICAgMjAxMywgMHhiMmMyYTRkZQorMSwgICAgICAgNDYyMCwgICAgICAgNDYyMCwgICAgICAgMTAsICAgICAyMDEzLCAweDgwYTRhYmYyCisxLCAgICAgICA0NjM1LCAgICAgICA0NjM1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDcwMWE0ZWUKKzAsICAgICAgICAxMzksICAgICAgICAxMzksICAgICAgICAxLCAgIDUxODQwMCwgMHg3YmNhYzEyMworMSwgICAgICAgNDY0NSwgICAgICAgNDY0NSwgICAgICAgMTAsICAgICAyMDEzLCAweGRjMWJhNWJjCisxLCAgICAgICA0NjU1LCAgICAgICA0NjU1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NjA4M2E4YTQKKzEsICAgICAgIDQ2NjUsICAgICAgIDQ2NjUsICAgICAgIDEwLCAgICAgMjAxMywgMHg2MjI2YWQ0NQorMCwgICAgICAgIDE0MCwgICAgICAgIDE0MCwgICAgICAgIDEsICAgNTE4NDAwLCAweDc5ODk5MzgyCisxLCAgICAgICA0Njc1LCAgICAgICA0Njc1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MjczMmEyMDUKKzEsICAgICAgIDQ2ODUsICAgICAgIDQ2ODUsICAgICAgIDEwLCAgICAgMjAxMywgMHgwZjYyYTBkMworMSwgICAgICAgNDY5NSwgICAgICAgNDY5NSwgICAgICAgMTAsICAgICAyMDEzLCAweGMxNzk5MjQ5CiswLCAgICAgICAgMTQxLCAgICAgICAgMTQxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NGE1NmFjZWYKKzEsICAgICAgIDQ3MDUsICAgICAgIDQ3MDUsICAgICAgIDEwLCAgICAgMjAxMywgMHhiY2NmYTljOAorMSwgICAgICAgNDcyMCwgICAgICAgNDcyMCwgICAgICAgMTAsICAgICAyMDEzLCAweGRlZDA5NmU3CisxLCAgICAgICA0NzMwLCAgICAgICA0NzMwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4N2YwZGFmNDMKKzAsICAgICAgICAxNDIsICAgICAgICAxNDIsICAgICAgICAxLCAgIDUxODQwMCwgMHhiMGE5ODNlNQorMSwgICAgICAgNDc0MCwgICAgICAgNDc0MCwgICAgICAgMTAsICAgICAyMDEzLCAweGM0N2VhNjgyCisxLCAgICAgICA0NzUwLCAgICAgICA0NzUwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWE3MmIwN2EKKzEsICAgICAgIDQ3NjAsICAgICAgIDQ3NjAsICAgICAgIDEwLCAgICAgMjAxMywgMHgzODZmYWE4YworMSwgICAgICAgNDc3MCwgICAgICAgNDc3MCwgICAgICAgMTAsICAgICAyMDEzLCAweGY5OTE5YTkxCiswLCAgICAgICAgMTQzLCAgICAgICAgMTQzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YjQ5MjU1Y2MKKzEsICAgICAgIDQ3ODAsICAgICAgIDQ3ODAsICAgICAgIDEwLCAgICAgMjAxMywgMHg0OTA4ODk3ZQorMSwgICAgICAgNDc5MCwgICAgICAgNDc5MCwgICAgICAgMTAsICAgICAyMDEzLCAweDQ4ODJiNTk0CiswLCAgICAgICAgMTQ0LCAgICAgICAgMTQ0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NDg4MDg2NjMKKzEsICAgICAgIDQ4MDYsICAgICAgIDQ4MDYsICAgICAgIDEwLCAgICAgMjAxMywgMHgxMTNlOThkMQorMSwgICAgICAgNDgxNiwgICAgICAgNDgxNiwgICAgICAgMTAsICAgICAyMDEzLCAweDUwOThiMzBkCisxLCAgICAgICA0ODI2LCAgICAgICA0ODI2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGVmN2I4NTcKKzEsICAgICAgIDQ4MzYsICAgICAgIDQ4MzYsICAgICAgIDEwLCAgICAgMjAxMywgMHgyMTZlYTE3NgorMCwgICAgICAgIDE0NSwgICAgICAgIDE0NSwgICAgICAgIDEsICAgNTE4NDAwLCAweGY1YmU4MjhjCisxLCAgICAgICA0ODQ2LCAgICAgICA0ODQ2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZjkwNjk0NGEKKzEsICAgICAgIDQ4NTYsICAgICAgIDQ4NTYsICAgICAgIDEwLCAgICAgMjAxMywgMHhlZTliOTJmYgorMSwgICAgICAgNDg2NiwgICAgICAgNDg2NiwgICAgICAgMTAsICAgICAyMDEzLCAweGQ2MDI5MjA5CiswLCAgICAgICAgMTQ2LCAgICAgICAgMTQ2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YjY2ODhlYTMKKzEsICAgICAgIDQ4NzYsICAgICAgIDQ4NzYsICAgICAgIDEwLCAgICAgMjAxMywgMHgyMjU2YTEyZQorMSwgICAgICAgNDg5MSwgICAgICAgNDg5MSwgICAgICAgMTAsICAgICAyMDEzLCAweDg5ZGU4ZTRhCisxLCAgICAgICA0OTAxLCAgICAgICA0OTAxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGJmMGE1ODQKKzAsICAgICAgICAxNDcsICAgICAgICAxNDcsICAgICAgICAxLCAgIDUxODQwMCwgMHg5ZWIyYmZkMQorMSwgICAgICAgNDkxMSwgICAgICAgNDkxMSwgICAgICAgMTAsICAgICAyMDEzLCAweDZhNWViZDU4CisxLCAgICAgICA0OTIxLCAgICAgICA0OTIxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4M2VkZDlhYTQKKzEsICAgICAgIDQ5MzEsICAgICAgIDQ5MzEsICAgICAgIDEwLCAgICAgMjAxMywgMHhiZDY2YWMyNgorMCwgICAgICAgIDE0OCwgICAgICAgIDE0OCwgICAgICAgIDEsICAgNTE4NDAwLCAweGFiM2JkZmI1CisxLCAgICAgICA0OTQxLCAgICAgICA0OTQxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzEzODk2ZWEKKzEsICAgICAgIDQ5NTEsICAgICAgIDQ5NTEsICAgICAgIDEwLCAgICAgMjAxMywgMHg2YjgzYTZhMAorMSwgICAgICAgNDk2MSwgICAgICAgNDk2MSwgICAgICAgMTAsICAgICAyMDEzLCAweDlhYWZiMTA5CiswLCAgICAgICAgMTQ5LCAgICAgICAgMTQ5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZTY1ZjFkODEKKzEsICAgICAgIDQ5NzYsICAgICAgIDQ5NzYsICAgICAgIDEwLCAgICAgMjAxMywgMHg1MTkyYTg1YQorMSwgICAgICAgNDk4NiwgICAgICAgNDk4NiwgICAgICAgMTAsICAgICAyMDEzLCAweDFmOTE5Zjc5CisxLCAgICAgICA0OTk2LCAgICAgICA0OTk2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YzA3OTljNDAKKzAsICAgICAgICAxNTAsICAgICAgICAxNTAsICAgICAgICAxLCAgIDUxODQwMCwgMHg2MWNhOGQxMworMSwgICAgICAgNTAwNiwgICAgICAgNTAwNiwgICAgICAgMTAsICAgICAyMDEzLCAweDI5ODhiY2Q4CisxLCAgICAgICA1MDE2LCAgICAgICA1MDE2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MTQ4MjkxM2EKKzEsICAgICAgIDUwMjYsICAgICAgIDUwMjYsICAgICAgIDEwLCAgICAgMjAxMywgMHg3NGRhOWE5NAorMSwgICAgICAgNTAzNiwgICAgICAgNTAzNiwgICAgICAgMTAsICAgICAyMDEzLCAweDc2M2ViNzA5CiswLCAgICAgICAgMTUxLCAgICAgICAgMTUxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmRkMGQ4MmYKKzEsICAgICAgIDUwNDYsICAgICAgIDUwNDYsICAgICAgIDEwLCAgICAgMjAxMywgMHgxMjg1YjQwNQorMSwgICAgICAgNTA2MiwgICAgICAgNTA2MiwgICAgICAgMTAsICAgICAyMDEzLCAweGI2YWI5ZGZjCiswLCAgICAgICAgMTUyLCAgICAgICAgMTUyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YWIxYWNhYWQKKzEsICAgICAgIDUwNzIsICAgICAgIDUwNzIsICAgICAgIDEwLCAgICAgMjAxMywgMHhlNGM4YmYxOQorMSwgICAgICAgNTA4MiwgICAgICAgNTA4MiwgICAgICAgMTAsICAgICAyMDEzLCAweGFiYmJhZGU4CisxLCAgICAgICA1MDkyLCAgICAgICA1MDkyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZjhiNjlkODkKKzEsICAgICAgIDUxMDIsICAgICAgIDUxMDIsICAgICAgIDEwLCAgICAgMjAxMywgMHhjZTA0YTg2NgorMCwgICAgICAgIDE1MywgICAgICAgIDE1MywgICAgICAgIDEsICAgNTE4NDAwLCAweDE4ODlmMzFjCisxLCAgICAgICA1MTEyLCAgICAgICA1MTEyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDc1MjhhYmYKKzEsICAgICAgIDUxMjIsICAgICAgIDUxMjIsICAgICAgIDEwLCAgICAgMjAxMywgMHg3NGZiOThiZgorMSwgICAgICAgNTEzMiwgICAgICAgNTEzMiwgICAgICAgMTAsICAgICAyMDEzLCAweDU3OWZiMWM5CiswLCAgICAgICAgMTU0LCAgICAgICAgMTU0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MDI0ODRjY2UKKzEsICAgICAgIDUxNDcsICAgICAgIDUxNDcsICAgICAgIDEwLCAgICAgMjAxMywgMHg3ZGRlYTJlZAorMSwgICAgICAgNTE1NywgICAgICAgNTE1NywgICAgICAgMTAsICAgICAyMDEzLCAweDI5NmNhYTJjCisxLCAgICAgICA1MTY3LCAgICAgICA1MTY3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzQ2ZDljNGYKKzAsICAgICAgICAxNTUsICAgICAgICAxNTUsICAgICAgICAxLCAgIDUxODQwMCwgMHg1OTk5ODE2NQorMSwgICAgICAgNTE3NywgICAgICAgNTE3NywgICAgICAgMTAsICAgICAyMDEzLCAweDNlMWZiYTE1CisxLCAgICAgICA1MTg3LCAgICAgICA1MTg3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDhhMjkwOGYKKzEsICAgICAgIDUxOTcsICAgICAgIDUxOTcsICAgICAgIDEwLCAgICAgMjAxMywgMHhjMTkzOGQwOQorMCwgICAgICAgIDE1NiwgICAgICAgIDE1NiwgICAgICAgIDEsICAgNTE4NDAwLCAweDBmM2RkNjcxCisxLCAgICAgICA1MjA3LCAgICAgICA1MjA3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGU5NmEwNjAKKzEsICAgICAgIDUyMTcsICAgICAgIDUyMTcsICAgICAgIDEwLCAgICAgMjAxMywgMHg3YjZhOWUwNgorMSwgICAgICAgNTIzMiwgICAgICAgNTIzMiwgICAgICAgMTAsICAgICAyMDEzLCAweDViNzc5ZDI4CiswLCAgICAgICAgMTU3LCAgICAgICAgMTU3LCAgICAgICAgMSwgICA1MTg0MDAsIDB4Mzc4YmVlNjMKKzEsICAgICAgIDUyNDIsICAgICAgIDUyNDIsICAgICAgIDEwLCAgICAgMjAxMywgMHhmNjAwYWNhMQorMSwgICAgICAgNTI1MiwgICAgICAgNTI1MiwgICAgICAgMTAsICAgICAyMDEzLCAweDNhNmM5ZTY4CisxLCAgICAgICA1MjYyLCAgICAgICA1MjYyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGM4ZGMxYjAKKzAsICAgICAgICAxNTgsICAgICAgICAxNTgsICAgICAgICAxLCAgIDUxODQwMCwgMHgwZDhlMTdkMgorMSwgICAgICAgNTI3MiwgICAgICAgNTI3MiwgICAgICAgMTAsICAgICAyMDEzLCAweDI2YmViMjQ1CisxLCAgICAgICA1MjgyLCAgICAgICA1MjgyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MmJjMDk1NTcKKzEsICAgICAgIDUyOTIsICAgICAgIDUyOTIsICAgICAgIDEwLCAgICAgMjAxMywgMHgyN2ZjODg0NQorMSwgICAgICAgNTMwMiwgICAgICAgNTMwMiwgICAgICAgMTAsICAgICAyMDEzLCAweDEwMjVhYTQ3CiswLCAgICAgICAgMTU5LCAgICAgICAgMTU5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NjFmMTEzYmYKKzEsICAgICAgIDUzMTgsICAgICAgIDUzMTgsICAgICAgIDEwLCAgICAgMjAxMywgMHhjMmU2OWJhYQorMSwgICAgICAgNTMyOCwgICAgICAgNTMyOCwgICAgICAgMTAsICAgICAyMDEzLCAweGRiMjQ5YjkyCisxLCAgICAgICA1MzM4LCAgICAgICA1MzM4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NmNjZGEyOWUKKzAsICAgICAgICAxNjAsICAgICAgICAxNjAsICAgICAgICAxLCAgIDUxODQwMCwgMHg0NGVjMjExYQorMSwgICAgICAgNTM0OCwgICAgICAgNTM0OCwgICAgICAgMTAsICAgICAyMDEzLCAweGVhZjZhMWNmCisxLCAgICAgICA1MzU4LCAgICAgICA1MzU4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NTA5YmEzOTcKKzEsICAgICAgIDUzNjgsICAgICAgIDUzNjgsICAgICAgIDEwLCAgICAgMjAxMywgMHhmYWY4YTJkZgorMCwgICAgICAgIDE2MSwgICAgICAgIDE2MSwgICAgICAgIDEsICAgNTE4NDAwLCAweGNiMDM2MzA2CisxLCAgICAgICA1Mzc4LCAgICAgICA1Mzc4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDEzODhmMjgKKzEsICAgICAgIDUzODgsICAgICAgIDUzODgsICAgICAgIDEwLCAgICAgMjAxMywgMHhmZTVlYWIzOQorMSwgICAgICAgNTQwMywgICAgICAgNTQwMywgICAgICAgMTAsICAgICAyMDEzLCAweGQ1ZmZhMDY2CiswLCAgICAgICAgMTYyLCAgICAgICAgMTYyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4N2YxZGVjN2QKKzEsICAgICAgIDU0MTMsICAgICAgIDU0MTMsICAgICAgIDEwLCAgICAgMjAxMywgMHg2ODEzYTMwYQorMSwgICAgICAgNTQyMywgICAgICAgNTQyMywgICAgICAgMTAsICAgICAyMDEzLCAweDliZTg5NzE4CisxLCAgICAgICA1NDMzLCAgICAgICA1NDMzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YWVjM2EyN2IKKzAsICAgICAgICAxNjMsICAgICAgICAxNjMsICAgICAgICAxLCAgIDUxODQwMCwgMHg4YjhjNjY0MAorMSwgICAgICAgNTQ0NiwgICAgICAgNTQ0NiwgICAgICAgMTAsICAgICAyMDEzLCAweDU3OWE5ODNlCisxLCAgICAgICA1NDU2LCAgICAgICA1NDU2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4OThjZWEyMWYKKzEsICAgICAgIDU0NjYsICAgICAgIDU0NjYsICAgICAgIDEwLCAgICAgMjAxMywgMHhjYTc3YTU4YQorMCwgICAgICAgIDE2NCwgICAgICAgIDE2NCwgICAgICAgIDEsICAgNTE4NDAwLCAweGVhMDQ3MzdjCisxLCAgICAgICA1NDc2LCAgICAgICA1NDc2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Y2JjM2IxZWUKKzEsICAgICAgIDU0ODYsICAgICAgIDU0ODYsICAgICAgIDEwLCAgICAgMjAxMywgMHhmM2JiOGYwNworMSwgICAgICAgNTQ5NiwgICAgICAgNTQ5NiwgICAgICAgMTAsICAgICAyMDEzLCAweDZhZWViZDkyCiswLCAgICAgICAgMTY1LCAgICAgICAgMTY1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZTc3OWZlMGMKKzEsICAgICAgIDU1MDYsICAgICAgIDU1MDYsICAgICAgIDEwLCAgICAgMjAxMywgMHhlOTU1YTQ0OQorMSwgICAgICAgNTUxNiwgICAgICAgNTUxNiwgICAgICAgMTAsICAgICAyMDEzLCAweDk0MzZhYTViCisxLCAgICAgICA1NTMxLCAgICAgICA1NTMxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NGYwYThmOWYKKzAsICAgICAgICAxNjYsICAgICAgICAxNjYsICAgICAgICAxLCAgIDUxODQwMCwgMHhjZDc4YmYxMworMSwgICAgICAgNTU0MSwgICAgICAgNTU0MSwgICAgICAgMTAsICAgICAyMDEzLCAweDM1NTFiMjJkCisxLCAgICAgICA1NTUxLCAgICAgICA1NTUxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDk1OWEzZDQKKzEsICAgICAgIDU1NjEsICAgICAgIDU1NjEsICAgICAgIDEwLCAgICAgMjAxMywgMHgyZWQ1YTExYgorMSwgICAgICAgNTU3MSwgICAgICAgNTU3MSwgICAgICAgMTAsICAgICAyMDEzLCAweDhmNTJhNWMzCiswLCAgICAgICAgMTY3LCAgICAgICAgMTY3LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NDViMGMwNDgKKzEsICAgICAgIDU1ODEsICAgICAgIDU1ODEsICAgICAgIDEwLCAgICAgMjAxMywgMHg2NTUyOTc4ZAorMSwgICAgICAgNTU5MSwgICAgICAgNTU5MSwgICAgICAgMTAsICAgICAyMDEzLCAweDdkY2NhMGMxCisxLCAgICAgICA1NjAxLCAgICAgICA1NjAxLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YmNkNGEzYzkKKzAsICAgICAgICAxNjgsICAgICAgICAxNjgsICAgICAgICAxLCAgIDUxODQwMCwgMHg5NzgzZGNkOAorMSwgICAgICAgNTYxNiwgICAgICAgNTYxNiwgICAgICAgMTAsICAgICAyMDEzLCAweGZlNDFhOGQ4CisxLCAgICAgICA1NjI2LCAgICAgICA1NjI2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Yzg1YWFlMTQKKzEsICAgICAgIDU2MzYsICAgICAgIDU2MzYsICAgICAgIDEwLCAgICAgMjAxMywgMHgxMTg1YjM0NgorMCwgICAgICAgIDE2OSwgICAgICAgIDE2OSwgICAgICAgIDEsICAgNTE4NDAwLCAweGJjZDE1MTRjCisxLCAgICAgICA1NjQ2LCAgICAgICA1NjQ2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Zjc0MjlhMGQKKzEsICAgICAgIDU2NTYsICAgICAgIDU2NTYsICAgICAgIDEwLCAgICAgMjAxMywgMHg0OGMyYTE2MAorMSwgICAgICAgNTY2NiwgICAgICAgNTY2NiwgICAgICAgMTAsICAgICAyMDEzLCAweDlkODVhODVkCiswLCAgICAgICAgMTcwLCAgICAgICAgMTcwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZjIyOTU3NWYKKzEsICAgICAgIDU2NzYsICAgICAgIDU2NzYsICAgICAgIDEwLCAgICAgMjAxMywgMHhiYmU4OWZlOQorMSwgICAgICAgNTY4NiwgICAgICAgNTY4NiwgICAgICAgMTAsICAgICAyMDEzLCAweGVhNDI5ZmUyCisxLCAgICAgICA1NzAyLCAgICAgICA1NzAyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MjIxY2ExZDQKKzAsICAgICAgICAxNzEsICAgICAgICAxNzEsICAgICAgICAxLCAgIDUxODQwMCwgMHg1NzZlMzY1ZQorMSwgICAgICAgNTcxMiwgICAgICAgNTcxMiwgICAgICAgMTAsICAgICAyMDEzLCAweDM5NGI5MjViCisxLCAgICAgICA1NzIyLCAgICAgICA1NzIyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NTU2ZGMyNmYKKzEsICAgICAgIDU3MzIsICAgICAgIDU3MzIsICAgICAgIDEwLCAgICAgMjAxMywgMHhjZTIxYTVlMQorMCwgICAgICAgIDE3MiwgICAgICAgIDE3MiwgICAgICAgIDEsICAgNTE4NDAwLCAweGEyZDJkODdiCisxLCAgICAgICA1NzQyLCAgICAgICA1NzQyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YmM4N2MwYTgKKzEsICAgICAgIDU3NTIsICAgICAgIDU3NTIsICAgICAgIDEwLCAgICAgMjAxMywgMHhiYWM0YWMwNworMSwgICAgICAgNTc2MiwgICAgICAgNTc2MiwgICAgICAgMTAsICAgICAyMDEzLCAweGRlZWZhNGFhCisxLCAgICAgICA1NzcyLCAgICAgICA1NzcyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MWYxNWIzNjIKKzAsICAgICAgICAxNzMsICAgICAgICAxNzMsICAgICAgICAxLCAgIDUxODQwMCwgMHgzODA0ZDc0YQorMSwgICAgICAgNTc4NywgICAgICAgNTc4NywgICAgICAgMTAsICAgICAyMDEzLCAweDY0MDZiN2IyCisxLCAgICAgICA1Nzk3LCAgICAgICA1Nzk3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ODAzMGEwM2QKKzAsICAgICAgICAxNzQsICAgICAgICAxNzQsICAgICAgICAxLCAgIDUxODQwMCwgMHhmMDVkZTM3MgorMSwgICAgICAgNTgwNywgICAgICAgNTgwNywgICAgICAgMTAsICAgICAyMDEzLCAweDAzNzNhNWIxCisxLCAgICAgICA1ODE3LCAgICAgICA1ODE3LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MzRlZjkzZGEKKzEsICAgICAgIDU4MjcsICAgICAgIDU4MjcsICAgICAgIDEwLCAgICAgMjAxMywgMHg5NGMxOThmZQorMSwgICAgICAgNTgzNywgICAgICAgNTgzNywgICAgICAgMTAsICAgICAyMDEzLCAweGZlZmNhYmFkCiswLCAgICAgICAgMTc1LCAgICAgICAgMTc1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MjEwMzViNGYKKzEsICAgICAgIDU4NDcsICAgICAgIDU4NDcsICAgICAgIDEwLCAgICAgMjAxMywgMHg4NzU1YjNlYworMSwgICAgICAgNTg1NywgICAgICAgNTg1NywgICAgICAgMTAsICAgICAyMDEzLCAweGU0MzZhNmZkCisxLCAgICAgICA1ODcyLCAgICAgICA1ODcyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4OWNmNWExMWUKKzAsICAgICAgICAxNzYsICAgICAgICAxNzYsICAgICAgICAxLCAgIDUxODQwMCwgMHg2ZTk3ZDU4MworMSwgICAgICAgNTg4MiwgICAgICAgNTg4MiwgICAgICAgMTAsICAgICAyMDEzLCAweDAzYjhhOThjCisxLCAgICAgICA1ODkyLCAgICAgICA1ODkyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NjIxNmExMzgKKzEsICAgICAgIDU5MDIsICAgICAgIDU5MDIsICAgICAgIDEwLCAgICAgMjAxMywgMHhkODdiOWYxMgorMCwgICAgICAgIDE3NywgICAgICAgIDE3NywgICAgICAgIDEsICAgNTE4NDAwLCAweDE5Nzg3OWE5CisxLCAgICAgICA1OTEyLCAgICAgICA1OTEyLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NGNlOTk2NTMKKzEsICAgICAgIDU5MjIsICAgICAgIDU5MjIsICAgICAgIDEwLCAgICAgMjAxMywgMHg2YzJlYTllMgorMSwgICAgICAgNTkzMiwgICAgICAgNTkzMiwgICAgICAgMTAsICAgICAyMDEzLCAweDkxOGNhZTRjCiswLCAgICAgICAgMTc4LCAgICAgICAgMTc4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4Nzg3NzgwZWUKKzEsICAgICAgIDU5NDIsICAgICAgIDU5NDIsICAgICAgIDEwLCAgICAgMjAxMywgMHhkMTlmYTVmMgorMSwgICAgICAgNTk1OCwgICAgICAgNTk1OCwgICAgICAgMTAsICAgICAyMDEzLCAweDBiZGRhN2M2CisxLCAgICAgICA1OTY4LCAgICAgICA1OTY4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MGY5YWIwY2EKKzAsICAgICAgICAxNzksICAgICAgICAxNzksICAgICAgICAxLCAgIDUxODQwMCwgMHgxM2ZjYzc0ZAorMSwgICAgICAgNTk3OCwgICAgICAgNTk3OCwgICAgICAgMTAsICAgICAyMDEzLCAweDQxMGE5MmIxCisxLCAgICAgICA1OTg4LCAgICAgICA1OTg4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4Y2ZiZTlkMWMKKzEsICAgICAgIDU5OTgsICAgICAgIDU5OTgsICAgICAgIDEwLCAgICAgMjAxMywgMHg1OWVkOWQxNQorMCwgICAgICAgIDE4MCwgICAgICAgIDE4MCwgICAgICAgIDEsICAgNTE4NDAwLCAweDliZDFjNWRhCisxLCAgICAgICA2MDA4LCAgICAgICA2MDA4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NGUxMjllMjcKKzEsICAgICAgIDYwMTgsICAgICAgIDYwMTgsICAgICAgIDEwLCAgICAgMjAxMywgMHg3YmI5YWMwYQorMSwgICAgICAgNjAyOCwgICAgICAgNjAyOCwgICAgICAgMTAsICAgICAyMDEzLCAweDgyNmNhODJiCiswLCAgICAgICAgMTgxLCAgICAgICAgMTgxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4OGUyMWU0YmEKKzEsICAgICAgIDYwNDMsICAgICAgIDYwNDMsICAgICAgIDEwLCAgICAgMjAxMywgMHg5YWQ1YTc0YgorMSwgICAgICAgNjA1MywgICAgICAgNjA1MywgICAgICAgMTAsICAgICAyMDEzLCAweDZjNWY5NjlhCisxLCAgICAgICA2MDYzLCAgICAgICA2MDYzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ODQ3OWEwZTUKKzAsICAgICAgICAxODIsICAgICAgICAxODIsICAgICAgICAxLCAgIDUxODQwMCwgMHg1ZmU1OTk5NgorMSwgICAgICAgNjA3MywgICAgICAgNjA3MywgICAgICAgMTAsICAgICAyMDEzLCAweDE2NTI5OGVmCisxLCAgICAgICA2MDgzLCAgICAgICA2MDgzLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZGNhZGI0YTEKKzEsICAgICAgIDYwOTMsICAgICAgIDYwOTMsICAgICAgIDEwLCAgICAgMjAxMywgMHhhOTBlOTg3YworMSwgICAgICAgNjEwMywgICAgICAgNjEwMywgICAgICAgMTAsICAgICAyMDEzLCAweDFhYzViNTEwCiswLCAgICAgICAgMTgzLCAgICAgICAgMTgzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MzA4YWY0MzIKKzEsICAgICAgIDYxMTMsICAgICAgIDYxMTMsICAgICAgIDEwLCAgICAgMjAxMywgMHg2NjcyOGQ4NQorMSwgICAgICAgNjEyOCwgICAgICAgNjEyOCwgICAgICAgMTAsICAgICAyMDEzLCAweGU0ODU5ZmM1CisxLCAgICAgICA2MTM4LCAgICAgICA2MTM4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4OTkwMTc4NmUKKzAsICAgICAgICAxODQsICAgICAgICAxODQsICAgICAgICAxLCAgIDUxODQwMCwgMHhjMDVhOWViMQorMSwgICAgICAgNjE0OCwgICAgICAgNjE0OCwgICAgICAgMTAsICAgICAyMDEzLCAweDZhZWJiNDA2CisxLCAgICAgICA2MTU4LCAgICAgICA2MTU4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4N2QxM2EyY2MKKzEsICAgICAgIDYxNjgsICAgICAgIDYxNjgsICAgICAgIDEwLCAgICAgMjAxMywgMHg5OWI3YThjYworMCwgICAgICAgIDE4NSwgICAgICAgIDE4NSwgICAgICAgIDEsICAgNTE4NDAwLCAweGI5YTAyZTUxCisxLCAgICAgICA2MTc4LCAgICAgICA2MTc4LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ODBiOGE2MjQKKzEsICAgICAgIDYxODgsICAgICAgIDYxODgsICAgICAgIDEwLCAgICAgMjAxMywgMHhiYjZhYTI3MQorMSwgICAgICAgNjE5OCwgICAgICAgNjE5OCwgICAgICAgMTAsICAgICAyMDEzLCAweDE3YWY5ZTRhCiswLCAgICAgICAgMTg2LCAgICAgICAgMTg2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmQ5NTQzYWEKKzEsICAgICAgIDYyMTQsICAgICAgIDYyMTQsICAgICAgIDEwLCAgICAgMjAxMywgMHhmYWYwYThmMQorMSwgICAgICAgNjIyNCwgICAgICAgNjIyNCwgICAgICAgMTAsICAgICAyMDEzLCAweGQ2ODQ5YjkzCisxLCAgICAgICA2MjM0LCAgICAgICA2MjM0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZTk4Mjk2NjkKKzAsICAgICAgICAxODcsICAgICAgICAxODcsICAgICAgICAxLCAgIDUxODQwMCwgMHgwYTBjYjc5NQorMSwgICAgICAgNjI0NCwgICAgICAgNjI0NCwgICAgICAgMTAsICAgICAyMDEzLCAweDdlYzk4OTQ0CisxLCAgICAgICA2MjU0LCAgICAgICA2MjU0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4MmIyMDk5YTQKKzEsICAgICAgIDYyNjQsICAgICAgIDYyNjQsICAgICAgIDEwLCAgICAgMjAxMywgMHgxMDMzYTgyZgorMCwgICAgICAgIDE4OCwgICAgICAgIDE4OCwgICAgICAgIDEsICAgNTE4NDAwLCAweGU0YmI4YTBjCisxLCAgICAgICA2Mjc0LCAgICAgICA2Mjc0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWVjODg5OTAKKzEsICAgICAgIDYyODQsICAgICAgIDYyODQsICAgICAgIDEwLCAgICAgMjAxMywgMHhkMmExOWIzZAorMSwgICAgICAgNjI5OSwgICAgICAgNjI5OSwgICAgICAgMTAsICAgICAyMDEzLCAweGEzNzdiMjY4CiswLCAgICAgICAgMTg5LCAgICAgICAgMTg5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MjI2ZmQxMWUKKzEsICAgICAgIDYzMDksICAgICAgIDYzMDksICAgICAgIDEwLCAgICAgMjAxMywgMHhmYTg1OTkwMQorMSwgICAgICAgNjMxOSwgICAgICAgNjMxOSwgICAgICAgMTAsICAgICAyMDEzLCAweDE3MTM5NTVhCisxLCAgICAgICA2MzI5LCAgICAgICA2MzI5LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NzBhYWIwZGEKKzEsICAgICAgIDYzMzksICAgICAgIDYzMzksICAgICAgIDEwLCAgICAgMjAxMywgMHhjZGFlYTQyMgorMCwgICAgICAgIDE5MCwgICAgICAgIDE5MCwgICAgICAgIDEsICAgNTE4NDAwLCAweDc2ZTE2MDRkCisxLCAgICAgICA2MzQ5LCAgICAgICA2MzQ5LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NjVjM2JmODAKKzEsICAgICAgIDYzNTksICAgICAgIDYzNTksICAgICAgIDEwLCAgICAgMjAxMywgMHgxZDc1YTU1ZgorMSwgICAgICAgNjM2OSwgICAgICAgNjM2OSwgICAgICAgMTAsICAgICAyMDEzLCAweGE1YmVhNGRlCiswLCAgICAgICAgMTkxLCAgICAgICAgMTkxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4Y2EwNjExN2MKKzEsICAgICAgIDYzODQsICAgICAgIDYzODQsICAgICAgIDEwLCAgICAgMjAxMywgMHgxODRkYjcxYworMSwgICAgICAgNjM5NCwgICAgICAgNjM5NCwgICAgICAgMTAsICAgICAyMDEzLCAweDk5ODU4ZWM4CisxLCAgICAgICA2NDA0LCAgICAgICA2NDA0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4YjhmMmFlZTUKKzAsICAgICAgICAxOTIsICAgICAgICAxOTIsICAgICAgICAxLCAgIDUxODQwMCwgMHhlY2ExNDk1MgorMSwgICAgICAgNjQxNCwgICAgICAgNjQxNCwgICAgICAgMTAsICAgICAyMDEzLCAweDQ0MzViMmVmCisxLCAgICAgICA2NDI0LCAgICAgICA2NDI0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4OGFjZmE2YzcKKzEsICAgICAgIDY0MzQsICAgICAgIDY0MzQsICAgICAgIDEwLCAgICAgMjAxMywgMHg0MmI0YzAxZgorMCwgICAgICAgIDE5MywgICAgICAgIDE5MywgICAgICAgIDEsICAgNTE4NDAwLCAweDMxMDZkYmVlCisxLCAgICAgICA2NDQ0LCAgICAgICA2NDQ0LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NmUzMDhjMTMKKzEsICAgICAgIDY0NTQsICAgICAgIDY0NTQsICAgICAgIDEwLCAgICAgMjAxMywgMHg4MjI3YTBmNgorMSwgICAgICAgNjQ3MCwgICAgICAgNjQ3MCwgICAgICAgMTAsICAgICAyMDEzLCAweDZmMTJhN2EyCiswLCAgICAgICAgMTk0LCAgICAgICAgMTk0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4NTdmYTYzOTIKKzEsICAgICAgIDY0ODAsICAgICAgIDY0ODAsICAgICAgIDEwLCAgICAgMjAxMywgMHg3ODUzOTJiZQorMSwgICAgICAgNjQ5MCwgICAgICAgNjQ5MCwgICAgICAgMTAsICAgICAyMDEzLCAweDgxODQ5YzJiCisxLCAgICAgICA2NTAwLCAgICAgICA2NTAwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWNmMmFmNjUKKzAsICAgICAgICAxOTUsICAgICAgICAxOTUsICAgICAgICAxLCAgIDUxODQwMCwgMHg0NzY1MWFjOAorMSwgICAgICAgNjUxMCwgICAgICAgNjUxMCwgICAgICAgMTAsICAgICAyMDEzLCAweDBjNmNhNmI0CisxLCAgICAgICA2NTIwLCAgICAgICA2NTIwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDEyZmFiOWYKKzEsICAgICAgIDY1MzAsICAgICAgIDY1MzAsICAgICAgIDEwLCAgICAgMjAxMywgMHgwOGU3OTJiNAorMCwgICAgICAgIDE5NiwgICAgICAgIDE5NiwgICAgICAgIDEsICAgNTE4NDAwLCAweDNjMWJhNmE1CisxLCAgICAgICA2NTQwLCAgICAgICA2NTQwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4NDA3YWFjZTMKKzEsICAgICAgIDY1NTUsICAgICAgIDY1NTUsICAgICAgIDEwLCAgICAgMjAxMywgMHhkMjZiYWMxNgorMSwgICAgICAgNjU2NSwgICAgICAgNjU2NSwgICAgICAgMTAsICAgICAyMDEzLCAweGFjOGJiMjk1CiswLCAgICAgICAgMTk3LCAgICAgICAgMTk3LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmMzZWMwNWIKKzEsICAgICAgIDY1NzUsICAgICAgIDY1NzUsICAgICAgIDEwLCAgICAgMjAxMywgMHhkZGQxOTQ5YworMSwgICAgICAgNjU4NSwgICAgICAgNjU4NSwgICAgICAgMTAsICAgICAyMDEzLCAweDZiMjZiODY4CisxLCAgICAgICA2NTk1LCAgICAgICA2NTk1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4NWVhYmE1ODcKKzEsICAgICAgIDY2MDUsICAgICAgIDY2MDUsICAgICAgIDEwLCAgICAgMjAxMywgMHhlZjA3OTNiOQorMCwgICAgICAgIDE5OCwgICAgICAgIDE5OCwgICAgICAgIDEsICAgNTE4NDAwLCAweGQ2YWU1OWRhCisxLCAgICAgICA2NjE1LCAgICAgICA2NjE1LCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZGVmMTliZDYKKzEsICAgICAgIDY2MjUsICAgICAgIDY2MjUsICAgICAgIDEwLCAgICAgMjAxMywgMHhjYTk4YTYzNQorMCwgICAgICAgIDE5OSwgICAgICAgIDE5OSwgICAgICAgIDEsICAgNTE4NDAwLCAweGM2MmYwZTYzCisxLCAgICAgICA2NjQwLCAgICAgICA2NjQwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDYyNjlhNWEKKzEsICAgICAgIDY2NTAsICAgICAgIDY2NTAsICAgICAgIDEwLCAgICAgMjAxMywgMHgzMmNiOTk1MgorMSwgICAgICAgNjY2MCwgICAgICAgNjY2MCwgICAgICAgMTAsICAgICAyMDEzLCAweGYwMWZhOTVhCisxLCAgICAgICA2NjcwLCAgICAgICA2NjcwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4ZWZhYjllNTUKKzAsICAgICAgICAyMDAsICAgICAgICAyMDAsICAgICAgICAxLCAgIDUxODQwMCwgMHhhZTk2Y2MwMgorMSwgICAgICAgNjY4MCwgICAgICAgNjY4MCwgICAgICAgMTAsICAgICAyMDEzLCAweDU1YTNiNjNhCisxLCAgICAgICA2NjkwLCAgICAgICA2NjkwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4Y2QzNmE1NTMKKzEsICAgICAgIDY3MDAsICAgICAgIDY3MDAsICAgICAgIDEwLCAgICAgMjAxMywgMHgyZWMxOTg3NworMCwgICAgICAgIDIwMSwgICAgICAgIDIwMSwgICAgICAgIDEsICAgNTE4NDAwLCAweDJhYTA5MTdiCisxLCAgICAgICA2NzEwLCAgICAgICA2NzEwLCAgICAgICAxMCwgICAgIDIwMTMsIDB4YzE4YjkyNGMKKzEsICAgICAgIDY3MjYsICAgICAgIDY3MjYsICAgICAgIDEwLCAgICAgMjAxMywgMHhmMTMyYjA0YworMSwgICAgICAgNjczNiwgICAgICAgNjczNiwgICAgICAgMTAsICAgICAyMDEzLCAweDc5NzVhNDRkCiswLCAgICAgICAgMjAyLCAgICAgICAgMjAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZjBkMTNiNDgKKzEsICAgICAgIDY3NDYsICAgICAgIDY3NDYsICAgICAgIDEwLCAgICAgMjAxMywgMHgyYWFmOTRjYgorMSwgICAgICAgNjc1NiwgICAgICAgNjc1NiwgICAgICAgMTAsICAgICAyMDEzLCAweDU4Y2ZhNjBmCisxLCAgICAgICA2NzY2LCAgICAgICA2NzY2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4OTc1N2E2NTgKKzAsICAgICAgICAyMDMsICAgICAgICAyMDMsICAgICAgICAxLCAgIDUxODQwMCwgMHgwNjdmNTZmOAorMSwgICAgICAgNjc3NiwgICAgICAgNjc3NiwgICAgICAgMTAsICAgICAyMDEzLCAweDY3ZWJjMGQ1CisxLCAgICAgICA2Nzg2LCAgICAgICA2Nzg2LCAgICAgICAxMCwgICAgIDIwMTMsIDB4M2M1MGE3MGUKKzEsICAgICAgIDY3OTYsICAgICAgIDY3OTYsICAgICAgIDEwLCAgICAgMjAxMywgMHg5YzU3OTljNgorMCwgICAgICAgIDIwNCwgICAgICAgIDIwNCwgICAgICAgIDEsICAgNTE4NDAwLCAweDEwMjYwMjVjCisxLCAgICAgICA2ODExLCAgICAgICA2ODExLCAgICAgICAxMCwgICAgIDIwMTMsIDB4MDE4ZDg1YjIKKzEsICAgICAgIDY4MjEsICAgICAgIDY4MjEsICAgICAgIDEwLCAgICAgMjAxMywgMHg1MzY3YTk1NgorMCwgICAgICAgIDIwNSwgICAgICAgIDIwNSwgICAgICAgIDEsICAgNTE4NDAwLCAweDExZWU3ZjdmCiswLCAgICAgICAgMjA4LCAgICAgICAgMjA4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MzBhNmIzOTgKKzAsICAgICAgICAyNDAsICAgICAgICAyNDAsICAgICAgICAxLCAgIDUxODQwMCwgMHg5ZDJlMzk3NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfZ2JyYXBfZ2JyYXAgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV9nYnJhcF9nYnJhcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWUxNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfZ2JyYXBfZ2JyYXAKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA2NTUzNiwgMHhiYWM5OTk0NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfZ2JycF9nYnJhcCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X2dicnBfZ2JyYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0YzlkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X2dicnBfZ2JyYXAKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhhOTA1ZDU4NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfcmdiIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfcmdiCmluZGV4IGNiOTRhYTUuLjg5YTAxNzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3JnYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV9yZ2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDMwNDEyOCwgMHgwMjdlMzRjNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzA0MTI4LCAweGM0MzZiM2QyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzMDQxMjgsIDB4ODZiNzdmNTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3JnYl9yZ2JhIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfcmdiX3JnYmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkYzY5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3JnYl9yZ2JhCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDkxNTIsIDB4YjBlM2Q1ODYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3JnYmFfcmdiYSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3JnYmFfcmdiYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWM4NWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfcmdiYV9yZ2JhCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNjU1MzYsIDB4MzM1NDk5NDYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1djQyMCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1djQyMAppbmRleCBhMWY2Nzg3Li43Y2QwNzA4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV95dXY0MjAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2NDIwCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmJkNzJhMjcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwNmQxMGExNAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDYyOWU5YTcxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV95dXY0MjBfeXV2YTQyMCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1djQyMF95dXZhNDIwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGM4MmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV95dXY0MjBfeXV2YTQyMApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDI0NTc2LCAweDE1MDVmMDAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV95dXY0MjIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV95dXY0MjIKaW5kZXggOTgyMzg2Yi4uOTljZThjNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2NDIyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1djQyMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzA0MTI4LCAweDliOWUwOWIyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzMDQxMjgsIDB4MzNhZGRiNDgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDMwNDEyOCwgMHhkNWI5NzNlOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2NDIyX3l1dmE0MjIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV95dXY0MjJfeXV2YTQyMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDIxZTFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2NDIyX3l1dmE0MjIKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzMjc2OCwgMHgyZDg4YjExNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2NDQ0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2NDQ0CmluZGV4IDBiMmQ5ZjcuLjNiNmU1M2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1djQ0NAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItb3ZlcmxheV95dXY0NDQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQwNTUwNCwgMHhhYTgyYWRkMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDA1NTA0LCAweDBlOWQ2NWQwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0MDU1MDQsIDB4ZDg0NzBkODIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1djQ0NF95dXZhNDQ0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2NDQ0X3l1dmE0NDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFlNWRiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1djQ0NF95dXZhNDQ0CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDkxNTIsIDB4OTJkYTNiNjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1dmE0MjBfeXV2YTQyMCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1dmE0MjBfeXV2YTQyMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTdjYzVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2YTQyMF95dXZhNDIwCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDA5NjAsIDB4MGExYWIzYzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1dmE0MjJfeXV2YTQyMiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1dmE0MjJfeXV2YTQyMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGQyZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2YTQyMl95dXZhNDIyCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDkxNTIsIDB4MzY5OTc0ZDQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1dmE0NDRfeXV2YTQ0NCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1vdmVybGF5X3l1dmE0NDRfeXV2YTQ0NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmQ5YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLW92ZXJsYXlfeXV2YTQ0NF95dXZhNDQ0CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNjU1MzYsIDB4YTI3OWZmMTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRlZ2VuLTEgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFsZXR0ZWdlbi0xCmluZGV4IDk4YjcxNTkuLmJlYmZkMjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRlZ2VuLTEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBhbGV0dGVnZW4tMQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxMDAxLzI0MDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNngxNgorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMTAyNCwgMHgzMzk1ZWY1YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBhbGV0dGVnZW4tMiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRlZ2VuLTIKaW5kZXggMmY1OGI2NC4uYWEwN2I2YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBhbGV0dGVnZW4tMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFsZXR0ZWdlbi0yCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEwMDEvMjQwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2eDE2Cisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAxMDI0LCAweDkwNmZmNWFhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFsZXR0ZXVzZS1iYXllciBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRldXNlLWJheWVyCmluZGV4IDRiNDQ5MzkuLjVjYTAxMTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRldXNlLWJheWVyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRldXNlLWJheWVyCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMjQwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgxODAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4N2IyNTlkMDgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMDQwMCwgMHhmMDQwOTVlMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMwNDAwLCAweDg0ZDQ5Y2Q1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFsZXR0ZXVzZS1ub2RpdGhlciBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRldXNlLW5vZGl0aGVyCmluZGV4IDgxNzFmZmEuLmEyZTYxYzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRldXNlLW5vZGl0aGVyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRldXNlLW5vZGl0aGVyCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMjQwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgxODAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4NjkwNTYwY2IKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMDQwMCwgMHgxOTdhNWE1NAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMwNDAwLCAweDY2NTk2MWRiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFsZXR0ZXVzZS1zaWVycmEyXzRhIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBhbGV0dGV1c2Utc2llcnJhMl80YQppbmRleCA5NWQ3NjM2Li5kMjU3ODIwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFsZXR0ZXVzZS1zaWVycmEyXzRhCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYWxldHRldXNlLXNpZXJyYTJfNGEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTAwMS8yNDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDE4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIzMDQwMCwgMHhhNGY4NTc1OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjMwNDAwLCAweGJlODM1MDVjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMzA0MDAsIDB4MGEwOTU4NGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYW4tbW9ubzEgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFuLW1vbm8xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZDdjMjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFuLW1vbm8xCkBAIC0wLDAgKzEsMjYgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDc1MGYwYTY2CiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MTU1Y2YwNjMKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgMjA0OCwgMHgxZTQzZmMzMgorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDI4MmZmYzI4CiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NmQ3YmYwMDAKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjMGIyZjQxMQorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGQ3MTFmYjAzCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MzE2NDE4OWMKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgMjA0OCwgMHg4YzY5ZTgyNworMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDU2MmQwNTE4CiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MzgwYWVlMjcKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgMjA0OCwgMHg5OTBhMDNlNAorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDY4ZDdlZjYwCiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZDEzZmVmOWUKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgMjA0OCwgMHgwMDkzMDZlNAorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDUxODUwMzkwCiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4Y2QzY2VlYWUKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgMjA0OCwgMHgxODlmZjI3NworMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDRiOThmNjhjCiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MzRlYWY1NDQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYW4tbW9ubzIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFuLW1vbm8yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NjdjYTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFuLW1vbm8yCkBAIC0wLDAgKzEsMjYgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogMSBjaGFubmVscworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDYxMzBmYjgwCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZDVlZjA5MzAKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgMjA0OCwgMHg0MGJjZTNmNgorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDcyZTVkMTkzCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YjAwNTA3M2YKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgMjA0OCwgMHhhMzIzZmRiZQorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGU1Y2JmZTFlCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4NGI0MmZlNzkKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgMjA0OCwgMHgzODRlZWRlYQorMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICAyMDQ4LCAweGU1Y2RmODI1CiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YzI5NzBlYzAKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgMjA0OCwgMHhhODVmZTVlMAorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICAyMDQ4LCAweGZkNTFmMmRlCiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDIwNDgsIDB4YTFhYWZlMzAKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgMjA0OCwgMHg4NzcwZmVhMgorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDY3YzUwZDc2CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4Nzc3MmZiYzgKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgMjA0OCwgMHhjNDhlZmY1NAorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICAyMDQ4LCAweDJlMTRmMzU5CiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4MmRmNzBhNjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYW4tc3RlcmVvMSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYW4tc3RlcmVvMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTI1ZDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBhbi1zdGVyZW8xCkBAIC0wLDAgKzEsMjYgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDY4MiwgICAgIDI3MjgsIDB4YWYzNjU0NTgKKzAsICAgICAgICA2ODIsICAgICAgICA2ODIsICAgICAgNjgyLCAgICAgMjcyOCwgMHhjZDY4NDg5OAorMCwgICAgICAgMTM2NCwgICAgICAgMTM2NCwgICAgICA2ODIsICAgICAyNzI4LCAweDVkNTE0YWU1CiswLCAgICAgICAyMDQ2LCAgICAgICAyMDQ2LCAgICAgIDY4MiwgICAgIDI3MjgsIDB4NDhjYjQ2MDUKKzAsICAgICAgIDI3MjgsICAgICAgIDI3MjgsICAgICAgNjgyLCAgICAgMjcyOCwgMHg3NmFjNDNlZQorMCwgICAgICAgMzQxMCwgICAgICAgMzQxMCwgICAgICA2ODIsICAgICAyNzI4LCAweDA4ODM1NWZhCiswLCAgICAgICA0MDkyLCAgICAgICA0MDkyLCAgICAgIDY4MiwgICAgIDI3MjgsIDB4ZjY2ZjRlZmEKKzAsICAgICAgIDQ3NzQsICAgICAgIDQ3NzQsICAgICAgNjgyLCAgICAgMjcyOCwgMHg3ZWZjM2IxYQorMCwgICAgICAgNTQ1NiwgICAgICAgNTQ1NiwgICAgICA2ODIsICAgICAyNzI4LCAweDFjMTc0NWYzCiswLCAgICAgICA2MTM4LCAgICAgICA2MTM4LCAgICAgIDY4MiwgICAgIDI3MjgsIDB4ODI0ZDUwZmUKKzAsICAgICAgIDY4MjAsICAgICAgIDY4MjAsICAgICAgNjgyLCAgICAgMjcyOCwgMHhiMjZjNWI5NAorMCwgICAgICAgNzUwMiwgICAgICAgNzUwMiwgICAgICA2ODIsICAgICAyNzI4LCAweDAyZDU2MzZkCiswLCAgICAgICA4MTg0LCAgICAgICA4MTg0LCAgICAgIDY4MiwgICAgIDI3MjgsIDB4NjVlNjQ3ZGUKKzAsICAgICAgIDg4NjYsICAgICAgIDg4NjYsICAgICAgNjgyLCAgICAgMjcyOCwgMHg5MzM3NDgxMgorMCwgICAgICAgOTU0OCwgICAgICAgOTU0OCwgICAgICA2ODIsICAgICAyNzI4LCAweGEwZDU1MTUzCiswLCAgICAgIDEwMjMwLCAgICAgIDEwMjMwLCAgICAgIDY4MiwgICAgIDI3MjgsIDB4NTZjZjM5MmMKKzAsICAgICAgMTA5MTIsICAgICAgMTA5MTIsICAgICAgNjgyLCAgICAgMjcyOCwgMHg1NTQwNTFjMworMCwgICAgICAxMTU5NCwgICAgICAxMTU5NCwgICAgICA2ODIsICAgICAyNzI4LCAweGJjMzY1NWNlCiswLCAgICAgIDEyMjc2LCAgICAgIDEyMjc2LCAgICAgIDY4MiwgICAgIDI3MjgsIDB4YjQzMjUyOWYKKzAsICAgICAgMTI5NTgsICAgICAgMTI5NTgsICAgICAgNjgyLCAgICAgMjcyOCwgMHg2NGRmNTJhNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBhbi1zdGVyZW8yIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBhbi1zdGVyZW8yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTY3OTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFuLXN0ZXJlbzIKQEAgLTAsMCArMSwyNiBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgNjgyLCAgICAgMjcyOCwgMHgzNWMxNWU4MQorMCwgICAgICAgIDY4MiwgICAgICAgIDY4MiwgICAgICA2ODIsICAgICAyNzI4LCAweDc3MGYyZTJkCiswLCAgICAgICAxMzY0LCAgICAgICAxMzY0LCAgICAgIDY4MiwgICAgIDI3MjgsIDB4NmY4ZDZkOWYKKzAsICAgICAgIDIwNDYsICAgICAgIDIwNDYsICAgICAgNjgyLCAgICAgMjcyOCwgMHg1YjllNDZmMworMCwgICAgICAgMjcyOCwgICAgICAgMjcyOCwgICAgICA2ODIsICAgICAyNzI4LCAweGRhN2U1ZmRjCiswLCAgICAgICAzNDEwLCAgICAgICAzNDEwLCAgICAgIDY4MiwgICAgIDI3MjgsIDB4NTVlNDQ2ZjgKKzAsICAgICAgIDQwOTIsICAgICAgIDQwOTIsICAgICAgNjgyLCAgICAgMjcyOCwgMHg0ZmNmNGY4ZQorMCwgICAgICAgNDc3NCwgICAgICAgNDc3NCwgICAgICA2ODIsICAgICAyNzI4LCAweDg2ZTc1N2IyCiswLCAgICAgICA1NDU2LCAgICAgICA1NDU2LCAgICAgIDY4MiwgICAgIDI3MjgsIDB4OGQ0MjU2ZTkKKzAsICAgICAgIDYxMzgsICAgICAgIDYxMzgsICAgICAgNjgyLCAgICAgMjcyOCwgMHhhMjhkNGU1OAorMCwgICAgICAgNjgyMCwgICAgICAgNjgyMCwgICAgICA2ODIsICAgICAyNzI4LCAweGFjYWE1NzM4CiswLCAgICAgICA3NTAyLCAgICAgICA3NTAyLCAgICAgIDY4MiwgICAgIDI3MjgsIDB4ZDFmZTU4MGYKKzAsICAgICAgIDgxODQsICAgICAgIDgxODQsICAgICAgNjgyLCAgICAgMjcyOCwgMHgwOWEwNWMwYQorMCwgICAgICAgODg2NiwgICAgICAgODg2NiwgICAgICA2ODIsICAgICAyNzI4LCAweGNhZjI1NTVkCiswLCAgICAgICA5NTQ4LCAgICAgICA5NTQ4LCAgICAgIDY4MiwgICAgIDI3MjgsIDB4Y2VlMTU5ZmMKKzAsICAgICAgMTAyMzAsICAgICAgMTAyMzAsICAgICAgNjgyLCAgICAgMjcyOCwgMHhhYTM0NDRhNQorMCwgICAgICAxMDkxMiwgICAgICAxMDkxMiwgICAgICA2ODIsICAgICAyNzI4LCAweDIzYjc2NTEyCiswLCAgICAgIDExNTk0LCAgICAgIDExNTk0LCAgICAgIDY4MiwgICAgIDI3MjgsIDB4ZWYyMjQzZGQKKzAsICAgICAgMTIyNzYsICAgICAgMTIyNzYsICAgICAgNjgyLCAgICAgMjcyOCwgMHgzNjQ4NjExOAorMCwgICAgICAxMjk1OCwgICAgICAxMjk1OCwgICAgICA2ODIsICAgICAyNzI4LCAweGZkNTk2MjZjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFuLXN0ZXJlbzMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGFuLXN0ZXJlbzMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmZTExYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYW4tc3RlcmVvMwpAQCAtMCwwICsxLDI2IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweGEwZDFmYmIzCiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NTk4YTA1NmMKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3NDFkZWQyOAorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA0MDk2LCAweGM2NTFiMGVjCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTA4MjA1N2MKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MGY3ZjAwZAorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA0MDk2LCAweGFlZDdmYzUzCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NDI1MGZhYWUKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgNDA5NiwgMHhmN2ZjZjYxYQorMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIxMzUwNTYyCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTZhZGVhMGIKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MDZmZDgzNAorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDU0MzFkZDI0CiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZmFlZGZiNzMKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZTNkMDdlMgorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDI1NjFlZWI4CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OGY3NmZjMDUKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZjA1ZjBhMQorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDRlOTJmMTlhCiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODFiNmUwYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYW4tc3RlcmVvNCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wYW4tc3RlcmVvNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2M3MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBhbi1zdGVyZW80CkBAIC0wLDAgKzEsMjYgQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogMAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogNCBjaGFubmVscworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA4MTkyLCAweGRhYWRmYzQ0CiswLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDgxOTIsIDB4ZTZkOWVjMzcKKzAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgODE5MiwgMHg1ZWRmZWE2NAorMCwgICAgICAgMzA3MiwgICAgICAgMzA3MiwgICAgIDEwMjQsICAgICA4MTkyLCAweDdmN2JlMzhjCiswLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDgxOTIsIDB4M2Y2MGY1YzkKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAxMDI0LCAgICAgODE5MiwgMHhjZWU0ZmUwNgorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDEwMjQsICAgICA4MTkyLCAweGRiOThmYTNlCiswLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDgxOTIsIDB4NGNiMzA2ODcKKzAsICAgICAgIDgxOTIsICAgICAgIDgxOTIsICAgICAxMDI0LCAgICAgODE5MiwgMHgwMGY2ZWNhYgorMCwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDEwMjQsICAgICA4MTkyLCAweGE3YjBlMGRiCiswLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDgxOTIsIDB4YzJkY2Y4OWMKKzAsICAgICAgMTEyNjQsICAgICAgMTEyNjQsICAgICAxMDI0LCAgICAgODE5MiwgMHgzMGQ2ZjJmZQorMCwgICAgICAxMjI4OCwgICAgICAxMjI4OCwgICAgIDEwMjQsICAgICA4MTkyLCAweGY4M2FlMTgyCiswLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDgxOTIsIDB4ZWVjZDA1ZDEKKzAsICAgICAgMTQzMzYsICAgICAgMTQzMzYsICAgICAxMDI0LCAgICAgODE5MiwgMHhmZDNiMDU1OQorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDEwMjQsICAgICA4MTkyLCAweGNkNjllM2U2CiswLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDgxOTIsIDB4ZGY4MGZjMjkKKzAsICAgICAgMTc0MDgsICAgICAgMTc0MDgsICAgICAxMDI0LCAgICAgODE5MiwgMHg3ZThiZjUyYgorMCwgICAgICAxODQzMiwgICAgICAxODQzMiwgICAgIDEwMjQsICAgICA4MTkyLCAweGVlMDdlNWY3CiswLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDgxOTIsIDB4Yzg3NGYyOTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waGFzZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waGFzZQppbmRleCBlMGVjOGQ2Li5iMGY4YTI1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGhhc2UKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBoYXNlCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDViNzg5ZWYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0YmI0NjU1MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDlkZGRmNjRhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwCmluZGV4IDZiZTQ0MmIuLmM4ZjUzNTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwCkBAIC0xICsxIEBACi1waXhkZXNjLWdicmFwICAgICAgIGEyYjlkNjI2MWFkMjRkNzVkMTkyY2JiM2FmMjc3MDIyCitwaXhkZXNjLWdicmFwICAgICAgIDYyYzRkMTg3YTI2OWY5ZjZmYzg3YmI4N2U5MDRlYTcxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDEwYmUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDEwYmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkYWY2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwMTBiZQpAQCAtMCwwICsxIEBACitwaXhkZXNjLWdicmFwMTBiZSAgIDk1NDg3NTM2Y2RjNzNlMTBlMDZkNzM5ZTAzNDI3MzkwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDEwbGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDEwbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzZWQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwMTBsZQpAQCAtMCwwICsxIEBACitwaXhkZXNjLWdicmFwMTBsZSAgIGJmMmNlOWExYjNjZmQ1NjY2N2MxOWIzMGExYTUxMTgxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDEyYmUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDEyYmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3YzEzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwMTJiZQpAQCAtMCwwICsxIEBACitwaXhkZXNjLWdicmFwMTJiZSAgIDQxOWVjYTcxMzBmMjJiNjJmZDUwY2FiMzQ3YTU2NDU5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDEybGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDEybGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljNTkwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwMTJsZQpAQCAtMCwwICsxIEBACitwaXhkZXNjLWdicmFwMTJsZSAgIDAxZmZmMTQxOWE3Njc0OWUyMTQwNTY2MThhNDNmOGIxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDE2YmUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDE2YmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxYzQwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwMTZiZQpAQCAtMCwwICsxIEBACitwaXhkZXNjLWdicmFwMTZiZSAgIDc4NzRlN2ZkMzU0MTllZjIxMmE0NTBlYTYzN2ZmYjI0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDE2bGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJhcDE2bGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlZjI5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicmFwMTZsZQpAQCAtMCwwICsxIEBACitwaXhkZXNjLWdicmFwMTZsZSAgIGE4M2M3ZDBiYmJmYjFjMWE4MjA4Zjc1NjgwMzU4Mzg3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTBiZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMGJlCmluZGV4IDk0MDBkNmYuLjdiY2NhMmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMGJlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMGJlCkBAIC0xICsxIEBACi1waXhkZXNjLWdicnAxMGJlICAgIGM0ZWUzMTQwZTQyYTI2NDU2ODgzNGMyOWYyYzc4MDI3CitwaXhkZXNjLWdicnAxMGJlICAgIGMyYmE5NjBjZjE3NzIwOGRlOTlkNGNmOGQ2MzQwMmIxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTBsZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMGxlCmluZGV4IDU4NTFhNDcuLjU2NDg4NmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMGxlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMGxlCkBAIC0xICsxIEBACi1waXhkZXNjLWdicnAxMGxlICAgIDlhMGNiOWQxMDVkODBlNjA1OGVmYmIxMTI3ODIwMzI5CitwaXhkZXNjLWdicnAxMGxlICAgIDg3MGRlNTY0NGY2ZWI3YmZiZjE4M2JkODlmNDUxMzBhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTJiZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMmJlCmluZGV4IGM1Y2M5NDIuLjY0YWVkMmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMmJlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMmJlCkBAIC0xICsxIEBACi1waXhkZXNjLWdicnAxMmJlICAgIGU2Y2UyMDk2OGQ2M2VjZTcyNDc2ZDAzOGJiOTlmYjFkCitwaXhkZXNjLWdicnAxMmJlICAgIGQ0NjRjOWY4MjFiMzdjNjg4YjhhOTE5NmJkNjgyOTM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTJsZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMmxlCmluZGV4IDM1NDY3MzAuLjFiYzZlZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMmxlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxMmxlCkBAIC0xICsxIEBACi1waXhkZXNjLWdicnAxMmxlICAgIGRmOTM2ZWZkNzBmYjU3NTFlNzJiZDhjMGE3MGE1MTNmCitwaXhkZXNjLWdicnAxMmxlICAgIDAzOTllMWE5NDA4NzBkZDNlM2ZkN2M0YmU3ZjllNjgxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTRiZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxNGJlCmluZGV4IGUwMjAxMjkuLmYxZmYwM2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxNGJlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxNGJlCkBAIC0xICsxIEBACi1waXhkZXNjLWdicnAxNGJlICAgIGIyYmExNTJmY2NhMmY1YmVlZjdjOTcyOTQ4Mzk1YTM0CitwaXhkZXNjLWdicnAxNGJlICAgIGY0MzBiNWIyZjhmZGY3NzhhNzA4YTMzMmUwZWYwZWJmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTRsZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxNGxlCmluZGV4IDJmNjEzMTAuLmNjYTIxMTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxNGxlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxNGxlCkBAIC0xICsxIEBACi1waXhkZXNjLWdicnAxNGxlICAgIDY2YTBiNDUzMDEyOWNhNjkzYWVkNTA5OWZiMmI5M2Y2CitwaXhkZXNjLWdicnAxNGxlICAgIDBjYTkzZjVlNWRkNGI3NTQ4MWE3N2YwYTYzYzYwMGQxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTZiZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxNmJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTk4MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTZiZQpAQCAtMCwwICsxIEBACitwaXhkZXNjLWdicnAxNmJlICAgIGRhY2NkZDBhN2Q0MWQ1NjZhYjQwYzRkMDBlNTUyY2JlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTZsZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnAxNmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmMwYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwMTZsZQpAQCAtMCwwICsxIEBACitwaXhkZXNjLWdicnAxNmxlICAgIDA0ZjQwYWQxYTI3OTYzYmUzMTI1NjI0NDQ2ZWQxOTVlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwOWJlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ2JycDliZQppbmRleCAxOWIwYWQ2Li42YjUzNWI4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwOWJlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnA5YmUKQEAgLTEgKzEgQEAKLXBpeGRlc2MtZ2JycDliZSAgICAgZTNjNTIzNWUwNWZkOGNkNmVkM2U0OGE0ZDk1ZTU4ZTAKK3BpeGRlc2MtZ2JycDliZSAgICAgNzhkMjg5ZTBiZDhjYThjY2EwNjc0NTk3YjZkMGZlMmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnA5bGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1nYnJwOWxlCmluZGV4IGYwYzJmMmUuLjY0M2RhNDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdicnA5bGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ2JycDlsZQpAQCAtMSArMSBAQAotcGl4ZGVzYy1nYnJwOWxlICAgICA4YmE5NmQzZmU2ZTE5MGY1MzY2MGMyMjU2MjNlNjUzYworcGl4ZGVzYy1nYnJwOWxlICAgICBhMjMzZTUyOWEyNTRkYTM2ZGMxZjUzOWRhNmEzZTliYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTEwYmUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1ncmF5MTBiZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWY4MDMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTEwYmUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1ncmF5MTBiZSAgICA5ODdiZWUwMzU1MDU0ZmNmYzkxNWUxZTQxYWFkNTIzYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTEwbGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1ncmF5MTBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTg2YjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTEwbGUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1ncmF5MTBsZSAgICA2NzRiZWQyYWE4Njg2Yjc4ZGQ1ZmE0YjE1YzE1YzY1NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTEyYmUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1ncmF5MTJiZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzg4ZjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTEyYmUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1ncmF5MTJiZSAgICAyOWFlZWNjMTE2YzRiM2UwYzUxMDk4MTBmYmQ5Y2ExNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTEybGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1ncmF5MTJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGU5MDBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTEybGUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1ncmF5MTJsZSAgICAwMzA4ODJkNWI0YTUwMjIxMDY0NGYyZDUyMGY3YjkyYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTliZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdyYXk5YmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5MmUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdyYXk5YmUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1ncmF5OWJlICAgICAxOWFlZjczNjY1NzYwN2ZkYzYxOTFmNTMzODg2MDU4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtZ3JheTlsZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdyYXk5bGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2NWZiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhkZXNjLWdyYXk5bGUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1ncmF5OWxlICAgICBmMmEyOGJiNzE5NjZmNWQ2ZTQ0ZWVkZWY2N2UwMTE4YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtcDAxMGJlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtcDAxMGJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOWRkMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1wMDEwYmUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1wMDEwYmUgICAgICA3ODRhNDliZjU1NDg2MWRhOWQwODA5YTYxNWJjZjgxMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtcDAxMGxlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtcDAxMGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDA2MDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1wMDEwbGUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1wMDEwbGUgICAgICA3YjRhNTAzOTk3ZWI0ZTE0Y2JhODBlZTUyZGI4NWUzOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtcDAxNmJlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtcDAxNmJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTM0MDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1wMDE2YmUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1wMDE2YmUgICAgICA3ODRhNDliZjU1NDg2MWRhOWQwODA5YTYxNWJjZjgxMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtcDAxNmxlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGRlc2MtcDAxNmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MjNhMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4ZGVzYy1wMDE2bGUKQEAgLTAsMCArMSBAQAorcGl4ZGVzYy1wMDE2bGUgICAgICBlZDA0ODk3ZGUwYTY3ODhiYjM0NThlNzM2NWYxMGQzNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtY29weSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWNvcHkKaW5kZXggNWY0YjE2Mi4uYzQ1Y2U5MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtY29weQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1jb3B5CkBAIC0xOCwyMyArMTgsNDEgQEAKIGJncmEgICAgICAgICAgICAgICAgMzkzNGZiODFhNjAyZGZhN2QyOTQyMGIxYTY2ZjBmZDgKIGJncmE2NGJlICAgICAgICAgICAgYzhkMzIxN2JmNThkMzRmMDgwYWM4OGMwYjAwMTJjNzcKIGJncmE2NGxlICAgICAgICAgICAgYjcxZDc1YTkyOGFhYzE0Y2I3Njg0MDNlNmY2YTk5MTAKLWdicmFwICAgICAgICAgICAgICAgYWUwOWMzZTlkY2JlMGQxZWYyMWIyMzQyYmUzNjkyMTAKK2dicmFwICAgICAgICAgICAgICAgOThkMzA5ODc0MDdjNTFlNTYyMDkyMWUxMWQ0MGE0ZmYKK2dicmFwMTBiZSAgICAgICAgICAgZWRjZmZiMTg1ZTQ0YjZkYWU1YzJlYWQ1NTA1YjcxMjUKK2dicmFwMTBsZSAgICAgICAgICAgMmE3MzkyZTE0YjIxYjFmOTQ1NzUyNmEwNzEyMzZhNmQKK2dicmFwMTJiZSAgICAgICAgICAgMGM0YzFmOGFmMzYxNTcxMjY1Y2EyNTlkNWY3MGYwMjYKK2dicmFwMTJsZSAgICAgICAgICAgNWYxZDhjNjYzZDRjMjg4NjNlNjg3MTkyNDMzYjM0YTQKK2dicmFwMTZiZSAgICAgICAgICAgZTRlZGNhNDM2MWQ2NDM3OTQwMzRlNWFhOWVmMjkwYjEKK2dicmFwMTZsZSAgICAgICAgICAgOWE5NWIzODlkMmJmNTU2MTc5ZThmNGIyN2ZiNTUwYWIKIGdicnAgICAgICAgICAgICAgICAgNWZiYzMxOWUzMDExMGQxOWQ1MzlmNWIyNzRlZGRiNmQKLWdicnAxMGJlICAgICAgICAgICAgZTcxZTBkYzljNTQ0MTkyOTdlOTdhODk1YmY1N2FiMWMKLWdicnAxMGxlICAgICAgICAgICAgMTFmYjY5NzE5N2U3OWQyN2VlYmE0MDkzYTIwN2UwMTUKLWdicnAxMmJlICAgICAgICAgICAgMmE2MTFiZmYzYjhmNjNlMWQ5OWQwYjBmNTA4MmVhZWQKLWdicnAxMmxlICAgICAgICAgICAgYmQ0NTI5Y2E5YmQ2ODBkMjNhMTZlYzY1ZmRmYjMxM2IKLWdicnAxNGJlICAgICAgICAgICAgYjhjY2M3NzZkZDFlNTdjMzkzODZkM2NiNWJkYmU4OTkKLWdicnAxNGxlICAgICAgICAgICAgNzQ0MzFkZDAwZGRmMTBkOTRkMWRiMTQ5NmQxMGU0MmYKLWdicnA5YmUgICAgICAgICAgICAgNmQ0NWI2MWM0OGI0MGM4M2I0M2NmMmQ0ZWNmNGRjMzIKLWdicnA5bGUgICAgICAgICAgICAgYmM4MGRhNDM5NjM4YzU5ZjFkODIyMDM3ZjUyNzM5YWYKK2dicnAxMGJlICAgICAgICAgICAgNzAzYTE3NTkxYTJhNWMyMzY2NzVjNTEwMWMzNDliY2MKK2dicnAxMGxlICAgICAgICAgICAgZWUwMTQxNTNmNTVjMDExOTE4ZGY1YjIzOTQ4MTU3ODAKK2dicnAxMmJlICAgICAgICAgICAgNTI3ZDMzN2ViNTgxM2ViYmE3Y2Y5NjllZTY2MGQ0MjMKK2dicnAxMmxlICAgICAgICAgICAgZmQxOTI5MjBiMTcxYTBjZjg4ZDYxZTgzMTBlOTVkODEKK2dicnAxNGJlICAgICAgICAgICAgNDZkNTAyZGI2ZGM1ZWI3ZTlkYTNjNjAwMTZiMmRmOTEKK2dicnAxNGxlICAgICAgICAgICAgMTYwN2Y1YzhmMTMzNjBiNTNiODE4NmY1MjM5OTZiMWIKK2dicnAxNmJlICAgICAgICAgICAgN2I2NzY0YTUwNGM4NTNiMDlmNWM3ZDBiMjIyM2M1YTQKK2dicnAxNmxlICAgICAgICAgICAgZmI5MzIzYTViZDA2MDI4MmJlYzdiZmQ3ZDM4ZGMyMzAKK2dicnA5YmUgICAgICAgICAgICAgYTRkYzZmNmY5YmIwNTFkZTJkYzM0OGI1OTJhZDQyODIKK2dicnA5bGUgICAgICAgICAgICAgNjk5ZGEzYTNiMzI0ZjNmZDAwMWE1NmFlZTk2ODMzODQKIGdyYXkgICAgICAgICAgICAgICAgMTg4NTkwYjEyMzFhZmQyMzFlYTkxMDgxNWFlZjJiMjUKK2dyYXkxMGJlICAgICAgICAgICAgZDQ4NjU1OGVjZDJlMjdhZmMxNzkzMGJlODYxZjBlNGMKK2dyYXkxMGxlICAgICAgICAgICAgOTE3ZDY4NzEwM2IyYWRjY2E3MTMyYmZjMDcwY2E1NGEKK2dyYXkxMmJlICAgICAgICAgICAgOTY4NTYxNDQ1MGYxMjgyYmU0MzNkMmIwNzIzNGNhMWYKK2dyYXkxMmxlICAgICAgICAgICAgMjcwMGJkN2ZiM2ZlYTU2ZTU0ZWIwM2UzMWQ2ZDRlNTcKIGdyYXkxNmJlICAgICAgICAgICAgMDhkOTk3YTNmYWEyNWEzZGI5ZDZiZTI3MmQyODJlZWYKIGdyYXkxNmxlICAgICAgICAgICAgZGY2NWViODA0MzYwNzk1ZTNlMzhhMjcwMWZhOTY0MWEKK2dyYXk5YmUgICAgICAgICAgICAgNjM4MmExNDU5NGE4YjY4ZjBlYzdkZTI1NTMxZjkzMzQKK2dyYXk5bGUgICAgICAgICAgICAgNGViMWRkYTU4NzA2NDM2ZTNiNjlhZWYyOWIwMDg5ZGIKIG1vbm9iICAgICAgICAgICAgICAgOGIwNGY4NTlmZWU2YTBiZTg1NmJlMTg0YWNkN2EwYjUKIG1vbm93ICAgICAgICAgICAgICAgNTRkMTZkMmMwMWFiZmQ3MmVjZGI1ZTUxZTI4MzkzN2MKIG52MTIgICAgICAgICAgICAgICAgOGUyNGZlYjJjNTQ0ZGMyNmEyMDA0N2E3MWU0YzI3YWEKIG52MjEgICAgICAgICAgICAgICAgMzM1ZDg1YzlhZjYxMTBmMjZhZTllMTg3YTgyZWQyY2YKK3AwMTBiZSAgICAgICAgICAgICAgN2Y5ODQyZDYwMTUwMjYxMzZiYWQ2MGQwM2MwMzVjYzMKK3AwMTBsZSAgICAgICAgICAgICAgYzQ1MzQyMWI5ZjcyNmJkYWYyYmFjZjU5YTQ5MmM0M2IKK3AwMTZiZSAgICAgICAgICAgICAgN2Y5ODQyZDYwMTUwMjYxMzZiYWQ2MGQwM2MwMzVjYzMKK3AwMTZsZSAgICAgICAgICAgICAgYzQ1MzQyMWI5ZjcyNmJkYWYyYmFjZjU5YTQ5MmM0M2IKIHBhbDggICAgICAgICAgICAgICAgZmY1OTI5ZjViNDIwNzU3OTNiMmMzNGNiNDQxYmVkZTUKIHJnYjAgICAgICAgICAgICAgICAgMGRlNzFlNWExZjk3ZjgxZmI1MTM5N2EwNDM1YmZhNzIKIHJnYjI0ICAgICAgICAgICAgICAgZjQ0MzgwNTdkMDQ2ZTZkOThhZGU0ZTQ1Mjk0YjIxYmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWNyb3AgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1jcm9wCmluZGV4IDBiNTQ2NDEuLmM1YmI4YTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWNyb3AKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtY3JvcApAQCAtMTgsMjEgKzE4LDM5IEBACiBiZ3JhICAgICAgICAgICAgICAgIGU2NmE1ZjY4YmE0NjNjYmM4OWZjZTIzYTYxYmI1MjAzCiBiZ3JhNjRiZSAgICAgICAgICAgIDFhZDhkZDAyNzE0Y2FmZWM3OTNmYjg5NTc3ZGRkZTQ3CiBiZ3JhNjRsZSAgICAgICAgICAgIGRkMjllYzlhYmE0M2FhM2U4ZjlmNWI5YTkzY2E4ODMxCi1nYnJhcCAgICAgICAgICAgICAgIGRhNmJlMTc2MTQ5ZWZkZmVjYjJhNjkwYmM2NGE2NDRlCitnYnJhcCAgICAgICAgICAgICAgIDE4OGNkNDY3ZmU3YWU3ZDg1YWU5Y2E4YmRmYTA3NzM5CitnYnJhcDEwYmUgICAgICAgICAgIDE4ODBjNDg1NmQ5Y2M2NDkyYjhiODU5ZjI3MTFhYWYxCitnYnJhcDEwbGUgICAgICAgICAgIGMyYjZlMzVmOGI3Y2EzNjNhN2VjMDIxY2NkZjMxZDFmCitnYnJhcDEyYmUgICAgICAgICAgIGM5NzY5ZDE4NzMzY2RjMjY2NGQ4YjlhZjA5YTAzZjZkCitnYnJhcDEybGUgICAgICAgICAgIDNmODA0NTNjMWFjNmM1ZDFiMmZlYmYzZWYxNDFiNDc2CitnYnJhcDE2YmUgICAgICAgICAgIDIxYzk4ZDBkN2U3ZGUyYTkzZjlmMDk1ZTViYjVjMjI3CitnYnJhcDE2bGUgICAgICAgICAgIGVhOWE5Njg3MGMxYjc0MmRkOWYwNjVjNWRiNTY4MTg0CiBnYnJwICAgICAgICAgICAgICAgIGVjNjcxZjU3M2MyMTA1MDcyYWI2OGExOTMzYzU4ZmVlCi1nYnJwMTBiZSAgICAgICAgICAgIDJhMGY3ZTgyMTZkZjE5YTgzNWYwODZmNWU1NTJkYmM4Ci1nYnJwMTBsZSAgICAgICAgICAgIGExNWU0MzU5YjU4YzVkMGZlZjMwMWVlM2MyYzNiODVjCi1nYnJwMTJiZSAgICAgICAgICAgIDUyMGRkYWZhYmQ5ZGJiMzQyNjJmMjIzYzBjZWE5ZDk2Ci1nYnJwMTJsZSAgICAgICAgICAgIDI5NWY2ZDViZjM1YTk0MWU0ZGI4M2MwMTc0NGEzYzE5Ci1nYnJwMTRiZSAgICAgICAgICAgIGRiNzNkMmJlYWRkODM3MzU1YzRjZjA4YzMzYTYzMWU0Ci1nYnJwMTRsZSAgICAgICAgICAgIDc2ZDRlM2MwZDJjYWQ1YzZjZWNhYzdmYmM3NjY0NWE3Ci1nYnJwOWJlICAgICAgICAgICAgIGI5Yzk4MzdiOTJmYThkYzdlMzJkZmY5ODZkYTg3Y2RiCi1nYnJwOWxlICAgICAgICAgICAgIDA0ZThlOGEyODYzMzA3ZDI0ZGU3ODQ2NmVjZjUzNmNiCitnYnJwMTBiZSAgICAgICAgICAgIDZmMDEzMGE0MWYwMWU1ODU5M2QzODQwNDQ2ZGQ5NGI3CitnYnJwMTBsZSAgICAgICAgICAgIDljMTUyYjdkZmI3YWQ3YmM0Nzc1MThkOTczMTZkMDRmCitnYnJwMTJiZSAgICAgICAgICAgIDU2MTUxNjIwMmE2ZTM3ZGQxOTU0M2Y5YmIzYWYzMzlmCitnYnJwMTJsZSAgICAgICAgICAgIDNlN2Y4N2Q4MzQ3NDg4NDRhYjMyNmUyMmViMmI3NDg3CitnYnJwMTRiZSAgICAgICAgICAgIDA1NzIzMmJjYTk4YzQ3MmEwMDNjYzQ2YjNmZDkzOWU0CitnYnJwMTRsZSAgICAgICAgICAgIGQ0NzY0ZGJhM2MzZWZkMTI2M2MyYzhlMGY1YWM5ZjZhCitnYnJwMTZiZSAgICAgICAgICAgIDU5ZTRjMjdlZTMzNTIwZTIzZGJjZWFmYmVjMjdhYTliCitnYnJwMTZsZSAgICAgICAgICAgIDA3NjhhMjQ2Mjc4MzgyOWY2M2VkMGJmZDUzZDAxMjIyCitnYnJwOWJlICAgICAgICAgICAgIDRhZjQzOTk5ZTVlOTc0Mjk5MmI2NTUwZWE1YWQ5YjIzCitnYnJwOWxlICAgICAgICAgICAgIGI0Y2JmYTc4Nzg3MDZhMTQyOTVmMDkyMTJlNDFmN2ZlCiBncmF5ICAgICAgICAgICAgICAgIDBkNzBiNTRiNGI4ODhlYzRkYmQ4OTcxMzYyMGFjMWVlCitncmF5MTBiZSAgICAgICAgICAgIDE4ZWQ3NmNhYjE0NWFiOTA1OGNjMzUzZmNlYzZkM2M0CitncmF5MTBsZSAgICAgICAgICAgIGZkODNmNzQ4OTg4MDE2MDc4M2RkYjEyNTYxNWI0NjM4CitncmF5MTJiZSAgICAgICAgICAgIDQ3MjcwMGMyNmNjNDliOGQ1Zjc0YWYxNDFmNmEwZDM4CitncmF5MTJsZSAgICAgICAgICAgIDRmNjUzN2ZlMWYzMmIzOTYzMzUwZjhjNDM1MDA5NDMzCiBncmF5MTZiZSAgICAgICAgICAgIDM4ZjU5OWRhOTkwMjI0ZGU4NmUzZGM3YTU0MzEyMWE5CiBncmF5MTZsZSAgICAgICAgICAgIDlmZjdjODY2YmQ5OGRlZjRlNmM5MTU0MmMxYzQ1ZjgwCitncmF5OWJlICAgICAgICAgICAgIDhmZmNiMThkNjk5NDgwZjU1NDE0YmZjMjFhYjMzMzIxCitncmF5OWxlICAgICAgICAgICAgIDRkMTkzMmQ0OTY4YTI0ODU4NGY1ZTM5YzI1ZjFkZDQzCiBudjEyICAgICAgICAgICAgICAgIDkyY2RhNDI3Zjc5NDM3NDczMWVjMDMyMWVlMDBjYWFjCiBudjIxICAgICAgICAgICAgICAgIDFiY2ZjMTk3ZjRmYjk1ZGU4NWJhNTgxODJkOGQyZjY5CitwMDEwYmUgICAgICAgICAgICAgIDhiMmRlMmViNmIwOTliYmYzNTViZmM1NWEwNjk0ZGRjCitwMDEwbGUgICAgICAgICAgICAgIDM3M2I1MGM3NjZkZmQwYThlNzljOWE3MzI0NmQ4MDNhCitwMDE2YmUgICAgICAgICAgICAgIDhiMmRlMmViNmIwOTliYmYzNTViZmM1NWEwNjk0ZGRjCitwMDE2bGUgICAgICAgICAgICAgIDM3M2I1MGM3NjZkZmQwYThlNzljOWE3MzI0NmQ4MDNhCiBwYWw4ICAgICAgICAgICAgICAgIDFmMmNkYzhlNzE4Zjk1Yzg3NWRiYzEwMzRhNjg4YmZiCiByZ2IwICAgICAgICAgICAgICAgIDczNjY0NmI3MGRkOWEwYmUyMmI4ZGE4MDQxZTM1MDM1CiByZ2IyNCAgICAgICAgICAgICAgIGM1ZmJiZjgxNmJiMjAwMGY0ZDI5MTRlMzM1Njk4ZWY1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1maWVsZCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWZpZWxkCmluZGV4IDllMDRkYjQuLmRmNDNjZTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWZpZWxkCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWZpZWxkCkBAIC0xOCwyMyArMTgsNDEgQEAKIGJncmEgICAgICAgICAgICAgICAgNjZkNmUwODQ2OTkwZmZmMGYwOWEwN2M0M2MzYWRkNzEKIGJncmE2NGJlICAgICAgICAgICAgZWMwYmRlZjg2NjNkYzlkNzM4MThhNDg0MTljYjQ3NjQKIGJncmE2NGxlICAgICAgICAgICAgOWUyZGVmNTQxZTUxYmM2ZTc3ZmJmZmJmZjdmYTE0NmEKLWdicmFwICAgICAgICAgICAgICAgNWJiZWQyYzVjODcyNzQ4YjM4ZGIwNzhkYmQ3NTM1ZmEKK2dicmFwICAgICAgICAgICAgICAgMDhhMjhiNzlkYmQxOTI0NmQxYTk0ZTM0NjZhZjM2MjQKK2dicmFwMTBiZSAgICAgICAgICAgMjlkNDZjYmYwMjFiMjMzZjVmMTg4NmU1ZDVmZTIxYjQKK2dicmFwMTBsZSAgICAgICAgICAgNDAxN2M1ZDhjMTI0NDM4ZWI5YWVmYTEwN2RiNThkM2IKK2dicmFwMTJiZSAgICAgICAgICAgZTdmNDcxMTMyNjI4YjFjMDM0MTk5Y2MxMDliODRiYzIKK2dicmFwMTJsZSAgICAgICAgICAgODg2MjA3ZTVhYTM3OWEwMzEyNDg1Yjk0ZTVmZDVlZGQKK2dicmFwMTZiZSAgICAgICAgICAgZWFhMDE1OGYyN2ViYzQwY2RlOWUzZDZlZWYxZTJiYTEKK2dicmFwMTZsZSAgICAgICAgICAgNmNmNjg5OTJkNGZjYWMyYWEwMjVkMTAxNGI2NjlkMjQKIGdicnAgICAgICAgICAgICAgICAgODM4MDI1YTMwNjJmN2YzMWU5OTE5NmNlNjY5NjFhZDcKLWdicnAxMGJlICAgICAgICAgICAgNzNjYjEzMTFkOTBkZGE4M2E0ZGI2MTdhNDcwMDA3NWUKLWdicnAxMGxlICAgICAgICAgICAgZmNmMGIxYzZlMDQ1MTE2NTE3ZTI2YmM2ZWRmYTk0MTgKLWdicnAxMmJlICAgICAgICAgICAgNmNhY2JhNDJiMjZhMjBlNTIzMDAzNjY2YmI5YmYzMWMKLWdicnAxMmxlICAgICAgICAgICAgOTJiYzk1YjAzNGNhZDA2MTQyMGFmNTY5NjJjOTQ3ZDIKLWdicnAxNGJlICAgICAgICAgICAgNmY3NmJjMzU0ZjQ1NzhjOTA2MTNjOGNkNzFjZWExNGUKLWdicnAxNGxlICAgICAgICAgICAgYzcyNzljYWU4YTNmMWJiNGYzZTk5MzUzMzkzNDNhY2EKLWdicnA5YmUgICAgICAgICAgICAgOGM3MTE0MGZjODM2NjVkYjdmN2Q3ZmJkZDljNTUyZjEKLWdicnA5bGUgICAgICAgICAgICAgMTY1NGM3OWUzOGRjNzhmZGYxMDYyMzllZDJhN2JkNGYKK2dicnAxMGJlICAgICAgICAgICAgZjYzYzI1NTVlYTE5ZmM3OGIwMGZkNWIzZTJiNDhlOGMKK2dicnAxMGxlICAgICAgICAgICAgYmU2NGMzNzRhYjMxODIzNWQ5MTIzNzJlOTlhMDUxNmEKK2dicnAxMmJlICAgICAgICAgICAgZWYxNjRhMWMwNjJkYzM1NzJjNjFiOWVmMTA4OTdjYTEKK2dicnAxMmxlICAgICAgICAgICAgMDUyN2ZkYjZmNzViMWNiMGQzODA4MDllYjdhNzU4OWEKK2dicnAxNGJlICAgICAgICAgICAgNmFmZjNhZDM4OGUyZWQ5N2Q1OWI3MWE3NTAyOTc0NmQKK2dicnAxNGxlICAgICAgICAgICAgZWQ5Y2NiYzdhNGYzZTI2OWEyZWMzN2QyMTAzNTlmZDgKK2dicnAxNmJlICAgICAgICAgICAgMDIwZWZmMTYyNjQxNWVhNzI2YzU1YjIzMTYyY2U1OWEKK2dicnAxNmxlICAgICAgICAgICAgMGFiNzdiNDk4ZDRhMzk5MDU1MTViNmUxZjAzMjllZDIKK2dicnA5YmUgICAgICAgICAgICAgMTcwZGEzYTg2NDRjYmVhNjFjM2NhZWFkYzQ1MzU0YzUKK2dicnA5bGUgICAgICAgICAgICAgZGE1ZDgwZTZmMTJjYWJhYTcwODFiYjg1ZDNiN2ZkMzAKIGdyYXkgICAgICAgICAgICAgICAgNTdmZDhlNmUwMGY2YmU4NzUyNzI2MDA1OTc0Y2NlMWIKK2dyYXkxMGJlICAgICAgICAgICAgNDM3NzEzZjNkMDgxMjM4Y2RkYjczOGUxMDZlNWEyN2QKK2dyYXkxMGxlICAgICAgICAgICAgYzc0OWI4MDA0OWIxNTJmNGJhM2U2NmE3MmMwYzVhY2MKK2dyYXkxMmJlICAgICAgICAgICAgZDM0YzUwODEwYjM3ZTZmOTdkZmZkZjZhOGFiOTU4ZGUKK2dyYXkxMmxlICAgICAgICAgICAgY2Y3MWI4ZmVlNDdjZTc4MjFmM2FlOWY5YjYyYWUzOWEKIGdyYXkxNmJlICAgICAgICAgICAgZTE3MDBlMDU2ZGU5OTE3NzQ0YTdmZjRhYjJjYTYzZmQKIGdyYXkxNmxlICAgICAgICAgICAgMzM4ZGU3YWM1ZjdkMzZkNWFkNWFjMmM4ZDViYmVhNjgKK2dyYXk5YmUgICAgICAgICAgICAgMjVlNTA5NDBmYTMwMGE4ZjA5ZWRmYjZlYmE0ZmQyNTAKK2dyYXk5bGUgICAgICAgICAgICAgMTE0NmNmYzFiOTJiZmQwN2VkMjM4ZTY1ZmZjZDEzNGYKIG1vbm9iICAgICAgICAgICAgICAgMjEyOWNjNzJhNDg0ZDdlMTBhNDRkZTkxMTdhYTlmODAKIG1vbm93ICAgICAgICAgICAgICAgMDNkNzgzNjExZDI2NWNhZTc4MjkzZjg4ZWExMjZlYTEKIG52MTIgICAgICAgICAgICAgICAgMTZmN2E0NjcwOGVmMjVlYmQwYjcyZTQ3OTIwY2MxMWUKIG52MjEgICAgICAgICAgICAgICAgNzI5NDU3NDAzN2NjN2Y5MzczZWY1Njk1ZDhlYmU4MDkKK3AwMTBiZSAgICAgICAgICAgICAgYTAzMTFhMDliYmE3MzgzNTUzMjY3ZDJiM2I5YzA3NWUKK3AwMTBsZSAgICAgICAgICAgICAgZWUwOWExOGFlZmEzZWJlOTc3MTViM2E3MzEyY2I4ZmYKK3AwMTZiZSAgICAgICAgICAgICAgYTAzMTFhMDliYmE3MzgzNTUzMjY3ZDJiM2I5YzA3NWUKK3AwMTZsZSAgICAgICAgICAgICAgZWUwOWExOGFlZmEzZWJlOTc3MTViM2E3MzEyY2I4ZmYKIHBhbDggICAgICAgICAgICAgICAgMDY1OGMxOGRjZDhkMDUyZDU5ZGZiZTIzZjViMzY4ZDkKIHJnYjAgICAgICAgICAgICAgICAgY2EzZmE2ZTg2NWI5MWIzNTExYzdmMmJmNjI4MzAwNTkKIHJnYjI0ICAgICAgICAgICAgICAgMjVhYjI3MWUyNmE1Nzg1YmUxNjk1NzhkOTlkYTVkZDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWZpZWxkbWF0Y2ggYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1maWVsZG1hdGNoCmluZGV4IDQ0NjIyZDAuLjk5OTQ2YzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWZpZWxkbWF0Y2gKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtZmllbGRtYXRjaApAQCAtMSw1ICsxLDUgQEAKIHl1djQxMHAgICAgICAgICAgICAgYTZjOWI0MDY1ZTgyNTNkODEyMDc3MmY2OWJlMGJmMDQKIHl1djQxMXAgICAgICAgICAgICAgYjkxM2U2MzRhZDM3Y2UwNDYyNDAyNTJiZWQ4NjgxZmIKLXl1djQyMHAgICAgICAgICAgICAgZDQ0OGQ5NTMyNmVhZGVlYjEyZWEwY2MzNDgwNjc5NTgKK3l1djQyMHAgICAgICAgICAgICAgYTkyODY1NjAxNDFlYjE0NTk1ZTQyN2RiZTU4MjliMDAKIHl1djQyMnAgICAgICAgICAgICAgMTFhZDIyY2UwMGM1ZThhMzBkMDQ3MmYyOWZiMTU0MzQKIHl1djQ0NHAgICAgICAgICAgICAgOTM1MGEzZjIzY2Q3ZDk1ZWM0NDFhNDlmNjNmNTU5NTMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWZpZWxkb3JkZXIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1maWVsZG9yZGVyCmluZGV4IDFlODEwODEuLjg0YTllMDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWZpZWxkb3JkZXIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtZmllbGRvcmRlcgpAQCAtMTgsMTkgKzE4LDMzIEBACiBiZ3JhICAgICAgICAgICAgICAgIDU5NjdiNTU5MjU3ZGJiNjc4NGY5M2I5ZDJiZWY0ZWRkCiBiZ3JhNjRiZSAgICAgICAgICAgIDY0YTRlYzE1YmMzNWVkZTIwMThmNjUwYjUwYzI0MjliCiBiZ3JhNjRsZSAgICAgICAgICAgIDUwMjkxOTJkMGYzMjM4M2M5ZjI1ZjhlN2RhN2NiNWEwCi1nYnJhcCAgICAgICAgICAgICAgIDgwOTZjOGVlOWFkZTk4MTAxMzQ4YzEwZWIyMjUwNGNiCitnYnJhcCAgICAgICAgICAgICAgIDAwYWZiNjVkNDRiZWE5OWMzMWIzMThmZGJlYjNiZTEwCitnYnJhcDEwYmUgICAgICAgICAgIDhiMjcyNTRhNjljZDBlMjVmYTU1MjYyYTc0M2Y5NWU2CitnYnJhcDEwbGUgICAgICAgICAgIDUyMjc4MDIxNzE4ZWMzNzA5MDNkY2NjOTIzZGM4YmY2CitnYnJhcDEyYmUgICAgICAgICAgIDMwMmIzNTNkZmY2OTZlYzlmZDBkODVhMGNjMTQ4MDJiCitnYnJhcDEybGUgICAgICAgICAgIGFlMmQ2ZGIyYzljODI1ZjA2ZDkyMzg5ZGUyMTI2M2QyCitnYnJhcDE2YmUgICAgICAgICAgIDUyYzEwZDgwNDZkMTIzZGZjNGE0NzgyNzY5MDY0NjdjCitnYnJhcDE2bGUgICAgICAgICAgIDIzMTc3MzdiOGY1MTQwYWRkMjdkMTIxZGU4ZjViYTk1CiBnYnJwICAgICAgICAgICAgICAgIDUwNmRlYTJmZTQ5MmU5ODVhMzk2ZDFiMTFjY2Q4ZGIzCi1nYnJwMTBiZSAgICAgICAgICAgIGQ1YzNiNDJlMzljM2Y2MmQ5MTdjZjJlNGU5ZTA3M2Q5Ci1nYnJwMTBsZSAgICAgICAgICAgIGZhMjg1MDJiYTY4YzU1YzU1YjZiYjZmNzMyZTgxM2Y2Ci1nYnJwMTJiZSAgICAgICAgICAgIDM2MTQwYWExZWQ2NzVjMTQ4ZjY0ZDI1OWY5MTRhMmEzCi1nYnJwMTJsZSAgICAgICAgICAgIDMwZjA5OTYxMDMyNjJlYThhZGIwNjI5YTA3MDUxZGY1Ci1nYnJwMTRiZSAgICAgICAgICAgIGEwYjIyZjA2ODU3ZWI1Mzc5OTZmNWIwZDc1NTU3YzUzCi1nYnJwMTRsZSAgICAgICAgICAgIGUzMTdjZTA3YTYwNTY0M2M0OTRmMzViNmU3MjI5ZWEzCi1nYnJwOWJlICAgICAgICAgICAgIDdiNGQ1ZTc2MGI3MjgxN2Y0YzNkNzE0MWI0MDliMGM0Ci1nYnJwOWxlICAgICAgICAgICAgIDlhNDUyM2VhYjg2YTRlMGM4OTdkOWEwN2FlOTAzNmI3CitnYnJwMTBiZSAgICAgICAgICAgIDU1YmJmZTJkNDcyNzgwZGNiYWRmMzAyNzc3OGNhYTBlCitnYnJwMTBsZSAgICAgICAgICAgIDEzYTM5MDc3YWIxYjJjM2I0OWFmZDNlMjUwYjg0YTc3CitnYnJwMTJiZSAgICAgICAgICAgIGYxYjU5MzM0YzY4N2EzOWJhMDc2ZmU0N2U2ZWU5NTE1CitnYnJwMTJsZSAgICAgICAgICAgIGU2NGFiNGQyOTBlYjEwNDc2ZGIxNjUwNTQ3MjAxNzNmCitnYnJwMTRiZSAgICAgICAgICAgIGIzODA2YWRlNTI3ZWY3NDUyYzI5MTA2MDU0OTQ2Y2QxCitnYnJwMTRsZSAgICAgICAgICAgIGIwMWIxYTA1ZDhkZTM2ZjUxYTEzM2QyNTEwMmZlMWYzCitnYnJwMTZiZSAgICAgICAgICAgIGY4MmU0YmRhNDY4Mjc1ZjUxYmVjZjcwZjM4ODBiZTUyCitnYnJwMTZsZSAgICAgICAgICAgIGM3ODEzYTkwNWY5NGFhYmIyYmNhZGU3OWM5YjdlMzllCitnYnJwOWJlICAgICAgICAgICAgIGI4ZDI5NGQ0YmM4MWNlZWYxZmI1MjllOTE3YzAyZTQ4CitnYnJwOWxlICAgICAgICAgICAgIDBkNDJjYzllMjIyZDgwNmMzMzE3Mjc4MWI0NWNiM2UzCiBncmF5ICAgICAgICAgICAgICAgIGQ5NmUwZjFjNzNkM2YwYjk1MDZkNjkxYjVjZDM2YzczCitncmF5MTBiZSAgICAgICAgICAgIGMyNmM3M2RlOTZiNjMwZjEyMDdmZjU4OWI2NTUzZWJkCitncmF5MTBsZSAgICAgICAgICAgIDE2ZTRkYjFkNjExZWMzZmE1YzlmZDhmYmRiZjFmZmNjCitncmF5MTJiZSAgICAgICAgICAgIDFjMzI4NWMxNTBlMWRkZGNmMGZiZWU0MDVjZmIwNjhlCitncmF5MTJsZSAgICAgICAgICAgIGE1N2I2MTk5ZjU2OTBhZGQwYWMwMTUwZmE5NWM0OTg4CiBncmF5MTZiZSAgICAgICAgICAgIDI5M2EzNjU0OGNlMTY1NDM0OTQ3OTBmOGY3Zjc2YTA1CiBncmF5MTZsZSAgICAgICAgICAgIDg0ZjgzZjVmY2JiNWQ0NThlZmI4Mzk1YTUwYTM3OTdlCitncmF5OWJlICAgICAgICAgICAgIGVjODc3ZjViY2YwZWEyNzVhNmYzNmMxMmNjOWFkZjExCitncmF5OWxlICAgICAgICAgICAgIGZiYTk0NGZkZTc5MjNkNTA4OWY0ZjUyZDEyOTg4YjllCiByZ2IwICAgICAgICAgICAgICAgIDJlM2Q4YzkxYzdhODNkNDUxNTkzZGZkMDY2MDdmZjM5CiByZ2IyNCAgICAgICAgICAgICAgIGI4MjU3N2Y4MjE1ZDNkYzI2ODFiZTYwZjFkYTI0N2FmCiByZ2I0NDRiZSAgICAgICAgICAgIDFjM2FmYzNhMGM1M2M1MTEzOWM3NjUwNGY1OWJiMWY0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1oZmxpcCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWhmbGlwCmluZGV4IDk4YzE2NWIuLmE5ODMxNGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWhmbGlwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWhmbGlwCkBAIC0xOCwyMSArMTgsMzkgQEAKIGJncmEgICAgICAgICAgICAgICAgMjc1ZjA1YTM4MmJjYmM5YmM3N2MwNmI3OWUxZDhhNzEKIGJncmE2NGJlICAgICAgICAgICAgMWNhYmVhZmU5YzIxYTRmN2NjZDk3NjIyMGYyMmVlNWEKIGJncmE2NGxlICAgICAgICAgICAgMWIxNWMwMWM5NGNmOWFmODkyNzNkYTFkMWY5OTRjZmYKLWdicmFwICAgICAgICAgICAgICAgMjhlOGQ1NDVhOGYzMmEzMzBjOTM2OGM5MjdkOTdiNjYKK2dicmFwICAgICAgICAgICAgICAgYmY2YTJiMmYyMDZmYmJiMzMyYTcxOGZiNTcwZDdjYjcKK2dicmFwMTBiZSAgICAgICAgICAgZjE4OGRjMjM3NTY0NjljYmRkMTcyZmU5N2FkNTgxMjEKK2dicmFwMTBsZSAgICAgICAgICAgMjYyZjA1MDE2MzNlYTQ2NzAwMjBmYWU4YWM2ODM1ZTIKK2dicmFwMTJiZSAgICAgICAgICAgZmZlOWFhNGNiY2M0MmY3MTc1N2VmZTE4ODI2NzY0YWMKK2dicmFwMTJsZSAgICAgICAgICAgODhhODVjMWIzYzVlMTllMjk5ZmRkMjA5YjczYWMxYmEKK2dicmFwMTZiZSAgICAgICAgICAgMzExN2U4NGIyNTg0MzNhN2VmYjkyODhiYmI4ODE1ZDQKK2dicmFwMTZsZSAgICAgICAgICAgM2FkMDhjZjhiNDlkOGViMzFhMWIzNTZlYzRiN2I4OGIKIGdicnAgICAgICAgICAgICAgICAgMGVjZmVjYTE3MWJhM2ExYTJmZjRlOTJmNTcyYjcxY2YKLWdicnAxMGJlICAgICAgICAgICAgNTU4NjM2Y2VmNmFiYjEyNzQ4YWJjMDFlYjk3NmFlNTMKLWdicnAxMGxlICAgICAgICAgICAgZDFmN2NkNTZlNjc1ZjQxMDNjODMyNWYzMjhlOGYwNzYKLWdicnAxMmJlICAgICAgICAgICAgY2JlZTA2ODI1MGE1MTBlYWM0OTIwMTliMzc4OTIyM2QKLWdicnAxMmxlICAgICAgICAgICAgZDhlMTlhOTA0NmY0YmVmZDk1NjdlY2I2ZmU0NGYxYzQKLWdicnAxNGJlICAgICAgICAgICAgMDY0NmRkYTM5N2UwZmZhYTU1YjJmOTkzZGIyNDExNTMKLWdicnAxNGxlICAgICAgICAgICAgNWM2NmYxZTYyMmZlY2YzNWNjNjRiOGQ5OTU2ZDJhMGYKLWdicnA5YmUgICAgICAgICAgICAgY2E0Y2E2Mzg4MjA3YzY5YzQ5NDk3MGZhYzJjYWNmN2MKLWdicnA5bGUgICAgICAgICAgICAgYzI0MTEwYWZhNDFiMThiZWI1MmEwNzkxMGUyZDU3NmYKK2dicnAxMGJlICAgICAgICAgICAgNzc0Mzk4YzJmODE3NTdhNTM2YzA5NGYxNmNmYzU0MWEKK2dicnAxMGxlICAgICAgICAgICAgZTlhNjQzNGQ2OTFiZTU0MWY3ODlmODUwOTYzZGExODEKK2dicnAxMmJlICAgICAgICAgICAgMTNkODE5ZDg2OWY4ZTg0YWFkY2E1N2UyMTg4MzAzMGUKK2dicnAxMmxlICAgICAgICAgICAgMjIwNDYzMzk0NDJjMTU1ZmJiOWIwMmNlZmY1ZTFjMTUKK2dicnAxNGJlICAgICAgICAgICAgN2UxZDJmOWQ5YmI3Y2M5MGQ4ODU0MGYzNjk5OGFjZDYKK2dicnAxNGxlICAgICAgICAgICAgOTFiYjYzNmY0ZTFmNWQ1MDMxMmIxMzZjMTg1NTQyZTkKK2dicnAxNmJlICAgICAgICAgICAgNDZjZjk0NzM2NDZhNGI5ZGJjYjA1NjYxYWRlNjU4ZWMKK2dicnAxNmxlICAgICAgICAgICAgNmNlNjA5M2IyNGQwOWMwZWRjZDU1YjJkNmZlYzg5YTAKK2dicnA5YmUgICAgICAgICAgICAgMTc0ZGUwMzdjMmE5ZjJiNmZiNGQ5NDQ0YWUwZmY4MmYKK2dicnA5bGUgICAgICAgICAgICAgYmE3YzI2MzFmYjI5NjdhYTkwOWM2NjUwOWJkMjQzZmUKIGdyYXkgICAgICAgICAgICAgICAgOGJkNGVjZTFkYmY4OWIyMGVlNzg1ZTA1MTUzNTZlMDcKK2dyYXkxMGJlICAgICAgICAgICAgMTYwZGQwM2UzMGQzMzM3OWRlOTJjNzBlZTUyYzAxZmQKK2dyYXkxMGxlICAgICAgICAgICAgNmJhYWMxZGE2YmUzNzg5NDA5YjY3Y2Q1MDZhZmU3ZGEKK2dyYXkxMmJlICAgICAgICAgICAgZGU3YjVlZjRiNTEzZTdlODI3MGM2MTcyNDlkMWNiZGYKK2dyYXkxMmxlICAgICAgICAgICAgZThkMDczOWZmNjE2NDliZDgyNzIyYjMxMzRjYmU3NzYKIGdyYXkxNmJlICAgICAgICAgICAgY2Y3Mjk0ZDlhYTIzZTFiODM4NjkyZWMwMWFkZTU4N2IKIGdyYXkxNmxlICAgICAgICAgICAgZDkxY2U0MWUzMDQ0MTliY2YzMmFjNzkyZjAxYmQ2NGYKK2dyYXk5YmUgICAgICAgICAgICAgYWM4ZDI2MDY2OTQ3OWFlNzIwYTViNmQ0ZDg2MzllMzQKK2dyYXk5bGUgICAgICAgICAgICAgNDI0ZmM1ODE5NDdiYzhjMzU3YzllYzVlM2MxYzA0ZDEKIG52MTIgICAgICAgICAgICAgICAgODAxZTU4ZjFiZTVmZDBiNWJjNGJmMDA3YzYwNGIwYjQKIG52MjEgICAgICAgICAgICAgICAgOWYxMGRmZmY4OTYzZGMzMjdkMzM5NWFmMjFmMDU1NGYKK3AwMTBiZSAgICAgICAgICAgICAgNzQ0YjEzZTQ0ZDM5ZTFmZjc1ODg5ODNmYTAzZTAxMDEKK3AwMTBsZSAgICAgICAgICAgICAgYTUwYjE2MDM0NmFiOTRmNTVhNDI1MDY1YjU3MDA2ZjAKK3AwMTZiZSAgICAgICAgICAgICAgNzQ0YjEzZTQ0ZDM5ZTFmZjc1ODg5ODNmYTAzZTAxMDEKK3AwMTZsZSAgICAgICAgICAgICAgYTUwYjE2MDM0NmFiOTRmNTVhNDI1MDY1YjU3MDA2ZjAKIHBhbDggICAgICAgICAgICAgICAgNWI3Yzc3ZDk5ODE3YjRmNTIzMzk3NDJhNDdkZTc3OTcKIHJnYjAgICAgICAgICAgICAgICAgMDA5MjQ1MmYzN2Q3M2RhMjAxOTMyNjVhY2UwYjdkNTcKIHJnYjI0ICAgICAgICAgICAgICAgMjE1NzExMDRlNjA5MWE2ODlmZWFiYjc4NjdlNTEzZGQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWlsIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtaWwKaW5kZXggYTlhM2M3Yi4uM2VkNmM0NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtaWwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtaWwKQEAgLTE4LDIzICsxOCw0MSBAQAogYmdyYSAgICAgICAgICAgICAgICBlNmFlMDhmMDZmMTU3Mjk3Mjk2YjMxOWEyNDlkZGRmNQogYmdyYTY0YmUgICAgICAgICAgICBkZTdjMDM2ZjIwZmM1NGQ4OTY5MDIzOWNjNjIzOTY3OAogYmdyYTY0bGUgICAgICAgICAgICBkMWFhOTc1ZmEwM2NlMjI2MDA4Mzk2YjMwYTY1MzQyMAotZ2JyYXAgICAgICAgICAgICAgICAyMzQ1ZDRkYmQxMzBkN2M2ZDFjZWRhZDU5NTQ1NDNiYgorZ2JyYXAgICAgICAgICAgICAgICA1NzVmZjFmZTVkNzU4NWVkODJkYTFkYjM1ZjEwNmU0YworZ2JyYXAxMGJlICAgICAgICAgICBiYWZhNTdhMmU0MzMxZDhhMzlmNmYwMDg3Yzg1ZDRiMQorZ2JyYXAxMGxlICAgICAgICAgICA1NTNhMWY0MzlkODE4NGRjNDAwNDMyZDNmNzg2ZmJjZQorZ2JyYXAxMmJlICAgICAgICAgICA0ODYwOWQ2YjYxZmY2MzEzOTM5ZmEyZDljM2ViYjZkOQorZ2JyYXAxMmxlICAgICAgICAgICBlM2I1MzQyYzhlNDc4MjBmMmRlN2UyZGQ2MTg3MjMxMgorZ2JyYXAxNmJlICAgICAgICAgICA2OTZjODRjOGIwMDljNzMyMGNhZDdmMzg0N2JiMzVkYQorZ2JyYXAxNmxlICAgICAgICAgICA5YmFjYjgxZmJiZTljZGZkMDRkNzFlYjU1YTk3MTlkMgogZ2JycCAgICAgICAgICAgICAgICBkYzA2ZWRiNjJlNzAwMjRhMjE2YzhlMzAzYjc5YjMyOAotZ2JycDEwYmUgICAgICAgICAgICBkMGQ1MmEyYTg3ZDU0NWE1ZGRjN2RhNmI5NWU4NjJkNwotZ2JycDEwbGUgICAgICAgICAgICA2NDcxY2RiOTVjMDNiMTRlYmNiODZkODA3ZmE4MDM1ZgotZ2JycDEyYmUgICAgICAgICAgICBiOTU1Y2E2MjU2OTAxYjE2NDBmZWZjN2MwZjFjNDg5ZQotZ2JycDEybGUgICAgICAgICAgICAyZGQ0NjkzOWI3ZTI0NDBmZWFjMmMzNzNhYTQ4Mzk1ZQotZ2JycDE0YmUgICAgICAgICAgICA5MzE0MGJmNjQwNGIyYjM2NDdmYmQ1NjUxOGFjZTIxMgotZ2JycDE0bGUgICAgICAgICAgICAyMTY0MDA5ZjdmNjQ2YjAzOWVhYTQ4OGFkZTc5ZGI0ZgotZ2JycDliZSAgICAgICAgICAgICBlODljMDY3NGM5MmYxMDM1MTdkNDNkMmEwMjY5OGI0NQotZ2JycDlsZSAgICAgICAgICAgICA3ZTc5YjRiYmI1ODkwOTVjOTI1ZDY1Y2I3YzAzN2Q0NAorZ2JycDEwYmUgICAgICAgICAgICAzMjFlN2YwNjFkOGI5YjU4MDEyMjFiNmNmM2M5OTY2NgorZ2JycDEwbGUgICAgICAgICAgICA3OTllZDNhZmNhMDEwNzY0MzlhMGI2Nzg1YjNkYzRiYgorZ2JycDEyYmUgICAgICAgICAgICA3Y2ExNzlhZDhmN2IwMThkZTQ4YTQ4YmRiMDc3Njk2NQorZ2JycDEybGUgICAgICAgICAgICBjNjk4NDM2NTFlN2U2MGU4NWM1ZThhMmZlNGVjYjI5MAorZ2JycDE0YmUgICAgICAgICAgICA1ZGM1ZTgxMzFjMjUxMjUzNDc3NThlMDNkMTViNjllNgorZ2JycDE0bGUgICAgICAgICAgICBiZjNkNWRlYzliNThjZWNkNGNhMWM1ZDNhNGQ1N2MzMQorZ2JycDE2YmUgICAgICAgICAgICBjOGM5NTAyNzcwM2M2ODBlZDhmOGY5MWM3MjVkYjQwYQorZ2JycDE2bGUgICAgICAgICAgICBjOTVjOWQ3YzJiMTk4MjZiNzNmZjE4MTFkOWZlNmJkYgorZ2JycDliZSAgICAgICAgICAgICBmMDI5ZDg3ZmE2NDJmNDI2MTE2MDQ3MWFkMjdmZDUzZgorZ2JycDlsZSAgICAgICAgICAgICBiMzEwZDNjZjM3ZjdiNDFkNzA2MTU1OTkzZjhmMDU4NAogZ3JheSAgICAgICAgICAgICAgICA1MmFlMTg2NDgxNjFhYzQzMTQ0ZjVjOWNkMjEyNzc4NgorZ3JheTEwYmUgICAgICAgICAgICA4NDAwZGVjMGVlZmIxNzI4NDliNzg1ZDM1ZmM1NTY3NAorZ3JheTEwbGUgICAgICAgICAgICBiN2Q2ZTQ5ZThkMTI5MWYyYjBhNTdkNTVlOTQ3OGVmMQorZ3JheTEyYmUgICAgICAgICAgICBjNjJiYzNkZWY1ZWEyMTdkZmI2ODQzMzkwNWNiOWQ2NAorZ3JheTEybGUgICAgICAgICAgICA1YmQwZmVmODM2OTI4ZTFlMTlhMzE1NzgyYThjMTMwMgogZ3JheTE2YmUgICAgICAgICAgICA5MmMzYjA5ZjM3MWI2MTBjYzFiNmE5Nzc2MDM0ZjRkMAogZ3JheTE2bGUgICAgICAgICAgICAxZGIyNzhkMjNhNTU0ZTAxOTEwY2VkYWNjNmMwMjUyMQorZ3JheTliZSAgICAgICAgICAgICBlZDdkYjViYjJkZGMwOWJjMjYwNjhjOGI4NThkYjIwNAorZ3JheTlsZSAgICAgICAgICAgICAyZWM5MTg4ZjBkY2ZlZmVmNzZhMDlmMzcxZDdiZWI4ZQogbW9ub2IgICAgICAgICAgICAgICBmYWJhNzVkZjI4MDMzYmE3Y2UzZDgyZmYyYTk5ZWU2OAogbW9ub3cgICAgICAgICAgICAgICA2ZTljZmI4ZDNhMzQ0YzVmMGMzZTFkNWUxMjk3ZTU4MAogbnYxMiAgICAgICAgICAgICAgICAzYzNiYTliMWI0YzRkZmZmMDljMjZmNzFiNTFkZDE0NgogbnYyMSAgICAgICAgICAgICAgICBhYjU4NmQ4NzgxMjQ2YjVhMzJkODc2MGE2MWRiOTc5NworcDAxMGJlICAgICAgICAgICAgICAzZGY1MTI4NmVmNjZiNTNlM2UyODNkYmJhYjU4MjI2MworcDAxMGxlICAgICAgICAgICAgICBlYWRjZDgyNDFlOTdlMzViMmI0N2Q1ZWIyZWFlYTZjZAorcDAxNmJlICAgICAgICAgICAgICAzZGY1MTI4NmVmNjZiNTNlM2UyODNkYmJhYjU4MjI2MworcDAxNmxlICAgICAgICAgICAgICBlYWRjZDgyNDFlOTdlMzViMmI0N2Q1ZWIyZWFlYTZjZAogcmdiMCAgICAgICAgICAgICAgICBjZmFmNjg2NzFlNDMyNDgyNjdkOGNkNTBjYWU4YzEzZgogcmdiMjQgICAgICAgICAgICAgICA4ODg5NGY2MDhjZjMzYmEzMTBmMjE5OTY3NDhkNzdhNwogcmdiNDQ0YmUgICAgICAgICAgICA5OWQzNmQ4MTQ5ODhmYjM4OGFhY2RlZjU3NWRhY2ZjZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtbHV0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtbHV0CmluZGV4IDQ3ZTc5ZDEuLjZjZjc5OGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLWx1dAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1sdXQKQEAgLTIsMzkgKzIsNTQgQEAKIGFyZ2IgICAgICAgICAgICAgICAgNGY1NzViZTNjZDAyNzk5Mzg5ZjU4MWRmOTljNGRlMzgKIGJncjI0ICAgICAgICAgICAgICAgZmE0M2UzYjJhYmZkZThkOWU2MGUxNTdhOWFjYzU1M2QKIGJncmEgICAgICAgICAgICAgICAgNGUyZTY4OTg5N2VlN2E4ZTQyYjE2MjM0NTk3YmFiMzUKK2dicmFwICAgICAgICAgICAgICAgMGQxZWIyYzM5ZTI5MWM1M2M1NzMwMmNkYzY1M2MyZmMKK2dicmFwMTBsZSAgICAgICAgICAgZmVkNThhZjZkNTU3YTcwNjlhNGEzOWU2ZDhmNWY0ZTAKK2dicmFwMTJsZSAgICAgICAgICAgNDNmZWMyMzFiZDFkM2RkOTU3Y2RkODQ3OGNhYjkyNTkKK2dicmFwMTZsZSAgICAgICAgICAgMjJjYTM2NDQ2NThhZTMwNjU0MTExNmMzMWUxMzUwNzQKK2dicnAgICAgICAgICAgICAgICAgZTU3MmQ1MzE4M2YzZjJlZDM5NTFhYTk5NDBkNDQwYTEKK2dicnAxMGxlICAgICAgICAgICAgYThmZDFlYmJjMzZhNDc3ZTJiMTM0MjQxZmVkOTE2ODcKK2dicnAxMmxlICAgICAgICAgICAgYzVhNGI4OTU3MWY3MDk1ZWI3MzdhZDlmZDZiMWVlMDgKK2dicnAxNGxlICAgICAgICAgICAgYmRmZGZkNmYzNmM2MDQ5N2QxY2RhZTc5MWYzY2MxMTcKK2dicnAxNmxlICAgICAgICAgICAgZGYwOTVlZjNhMjA5OTU5MzVjZmNhZjE0NGFmYzY4YjYKK2dicnA5bGUgICAgICAgICAgICAgYThjNGUyOWY0Y2I2MjdkYjgxYmEwNTNlMDg1M2U3MDIKK2dyYXkgICAgICAgICAgICAgICAgMjBiMTRiNWUyNmNkMTEzMDBlZDEyNDllMDQwODIxNzAKK2dyYXkxMGxlICAgICAgICAgICAgOGY0MTQwYjU1ZTg0N2NjNDIzMDAyYjg5NjY2ZGI1ZWEKK2dyYXkxMmxlICAgICAgICAgICAgZWE4OWMwMmY2YjNhZjQ5ZGRhZjEzMzY0ZWQzM2Q4NmQKK2dyYXkxNmxlICAgICAgICAgICAgYWExMDU5OTkyNGZiMjQ0MGZhMTJiNzZlOTBmNTdkY2IKK2dyYXk5bGUgICAgICAgICAgICAgN2Q5Y2M5YWQ2MTE4Njc0YzU0N2E1NDI4MWQxMGNmMDUKIHJnYjI0ICAgICAgICAgICAgICAgYTM1NjE3MTIwNzcyM2E1ODBlN2QyNzcwNzgwNzIwMDUKIHJnYjQ4bGUgICAgICAgICAgICAgNWM3ZGQ4NTc1ODM2ZDE4YzkxZTA5ZjE5MTVjZjlhYTkKIHJnYmEgICAgICAgICAgICAgICAgN2JjODU0YzI2OThiNzhhZjNlOTE1OWExOWMyZDlkMjEKIHJnYmE2NGxlICAgICAgICAgICAgM2EwODdlY2FiNTgzZDE5MzAyMjA1OTI3MzFmMjgyYjQKLXl1djQxMHAgICAgICAgICAgICAgNTFiMzlhMGUzM2YxMDhlNjUyNDU3YTI2NjY3MzE5ZWEKLXl1djQxMXAgICAgICAgICAgICAgOTIwNGM1YWY5MmFlZjQ5MjJhMDVmNThjMWY2YzA5NWUKLXl1djQyMHAgICAgICAgICAgICAgN2M0M2JiMGNhZThkZWU2MzMzNzVjODkyOTU1OTg1MDgKLXl1djQyMHAxMGxlICAgICAgICAgMTM1MjcxMmRkMzFjY2U3OGJkNTQ0MTI5NDAwNGNmODUKLXl1djQyMHAxMmxlICAgICAgICAgYzY2ZjgyZGE5ZmRhNDU4YmEzYWJkYTA1N2M1OGU1OTEKLXl1djQyMHAxNGxlICAgICAgICAgZTQ1Y2I1ZTJhNzViZjYxNDNkYTBiNTUwMDQ3NjdmNzgKLXl1djQyMHAxNmxlICAgICAgICAgZWZmNTQ3ODJjNTE3NzBlZGZkNmI4NGM5NThhYzcxMjAKLXl1djQyMHA5bGUgICAgICAgICAgNGE2Nzc2YjMzNzlmMTJhZDQ1Y2FlZTgwNzJhMTM2OTUKLXl1djQyMnAgICAgICAgICAgICAgNjdkZjM1ZGEwYzM1ZTU0ODgyNDkyYjIzNjU0MzgyNTQKLXl1djQyMnAxMGxlICAgICAgICAgMDE1ODM3MWE4MDAyOTQwMTVkZWY3ZjBlZjY2Yzc4ZWEKLXl1djQyMnAxMmxlICAgICAgICAgYmM0OWQzODYzZmZiODk2NThhMTdiZjhjNGZlNzczYjAKLXl1djQyMnAxNGxlICAgICAgICAgYjU1Y2I3OTFkMjg2YjBiMzM5MWZlNzQ4MTc4NWU1YjMKLXl1djQyMnAxNmxlICAgICAgICAgZmMzYjJiYTg4OWZmYWYxNjMzMDAwZmM3NzQzMDdjMzMKLXl1djQyMnA5bGUgICAgICAgICAgNmUyYTQyYWUzNmVkNWU4YjUxMTI5ODc2Mzk3MjhhZjUKLXl1djQ0MHAgICAgICAgICAgICAgNWU0MWFkY2ZjMjdiZTQzNjlhZmQyMTdiNjFiMmZmZTMKLXl1djQ0MHAxMGxlICAgICAgICAgOGI0OTcxNGJiYTI2OGZiNGE3OWI1YTg0MjIzYWQxN2EKLXl1djQ0MHAxMmxlICAgICAgICAgMTVhYjRmNDUzMjM4YmQ5YzEzYjE4YWY4MWUyMmYwNjAKLXl1djQ0NHAgICAgICAgICAgICAgYTJiNTg1OTBhZWY4OGRiMmMxZjE0YTFhM2EzYjAzNTkKLXl1djQ0NHAxMGxlICAgICAgICAgYzA3NmMyMGZjODA4Zjk1YjM0YWRiODhhY2E0NDJmNDgKLXl1djQ0NHAxMmxlICAgICAgICAgYWY4ZDRkZDg4MTY5ZDVjZmZjMmYzZmNlNjMzM2E5NGMKLXl1djQ0NHAxNGxlICAgICAgICAgOTMzNjcxMzNlMjVkMDg4ZDQ1MzUxOTllZDFmMWVkNTgKLXl1djQ0NHAxNmxlICAgICAgICAgODAwOTQwZmVlYzE0MzY1Y2NkOWI0ODYzZTM4ZjY5OTEKLXl1djQ0NHA5bGUgICAgICAgICAgYzEyMDA0NDM1MDg1MmM0Y2QxNmEzMDJkZDFjZWRhNzkKLXl1dmE0MjBwICAgICAgICAgICAgNTE4YTM4MGJmMWFmNjBlZjJlY2Y0NzU0ZWVjMDg4ZTkKLXl1dmE0MjBwMTZsZSAgICAgICAgNzJhZDRmYTUzNWIwMDdkMTIyNjY2Y2UxMDNlZjljOGIKLXl1dmE0MjJwICAgICAgICAgICAgNzExMGFjMmUzNzM3N2IwNWI2ZmM1YWQ5NjdkZmFiYjUKLXl1dmE0MjJwMTZsZSAgICAgICAgZTI4NjcyMTA2NjBhZGE1Nzg0YTYwYjQzMzlhYzUyYzAKLXl1dmE0NDRwICAgICAgICAgICAgNjQyZjM5NThmMTQxZGVjZTllOTk0MDc5NDVlMmVmNDMKLXl1dmE0NDRwMTZsZSAgICAgICAgYWIwNGJhOGFjYmUzODA4NWIwZGY2NTBkODIwNjVlYjAKK3l1djQxMHAgICAgICAgICAgICAgMTBjZjVkYmJjY2I4NThhOWFiNTFlMGI4YmYyNzhmNmQKK3l1djQxMXAgICAgICAgICAgICAgM2YwYmZhNTQzYmE1MTNjNmI2ZDdmZmY3ODVmYmUxNTAKK3l1djQyMHAgICAgICAgICAgICAgYWQ5OTIwNGFjZTY2OWEzODNmOGFlMDNhMWVhNWI5OGYKK3l1djQyMHAxMGxlICAgICAgICAgZjFlNmNjNGMyYTVlOTY2NWRlZGQ3YWMwZjJhNGQ1NTEKK3l1djQyMHAxMmxlICAgICAgICAgZDlkZmU4NzE0ODNiNmEyNjUxMmQ0MjdjYjA0OGZmNjUKK3l1djQyMHAxNGxlICAgICAgICAgY2Q4YmI0ODAzZjhlOTljNmNkMzExNDliZjg0OGMzMGMKK3l1djQyMHAxNmxlICAgICAgICAgNGJiMTM4MjBjZjJkZTliNDBjYTQ3YWRlYjdmZWEzNTYKK3l1djQyMHA5bGUgICAgICAgICAgZjEyYzk4YjU5OWU2NjdmYzQ1MTI2ZDZkZWE3ZjBmZDkKK3l1djQyMnAgICAgICAgICAgICAgYzU3ZTMwNGJiM2Y0YTFkMzBiZjRjZWQ1ZTgyOWNkYzYKK3l1djQyMnAxMGxlICAgICAgICAgOWQ5NWIwM2Y3NWFlNTc3ODgwNDI3OWYzYzMxMzU4MzcKK3l1djQyMnAxMmxlICAgICAgICAgMDhlNzNlMjMzNzkzNzQwYWQ2OGE5MzliOTg4NmRkMzIKK3l1djQyMnAxNGxlICAgICAgICAgYmVhNmI1NGVjM2UzM2VhZGZiZDMxN2ExNzViOTYyODgKK3l1djQyMnAxNmxlICAgICAgICAgNTQzOGU1NzM4YWIzZTFlNWY3ZmNlNWZhYWFjMDM2YzQKK3l1djQyMnA5bGUgICAgICAgICAgMjIyYTY5OWI2OWJhOGQ1MTE1MThhNjFkNzdhMTBjMjUKK3l1djQ0MHAgICAgICAgICAgICAgZjgxMDVmZjk0MzNlY2RlZGYyNjQ1ZjMzNzBhNTc1ZDgKK3l1djQ0MHAxMGxlICAgICAgICAgNmUxMDRhYzZjMzNiMDAxODViYjZkOTViMzcxZTEzNTQKK3l1djQ0MHAxMmxlICAgICAgICAgNjM2ODM0ZWZjYmE4MzhkNzQzMzdiMmViYjlkYmZmYjMKK3l1djQ0NHAgICAgICAgICAgICAgY2E2NjJlN2JkN2EyODgwNTY1MGYyNWIxNTM3ZDUwYTIKK3l1djQ0NHAxMGxlICAgICAgICAgYzMwMWViMjc2M2UwZjc0ZmRlOTQzODgwNDZjNDM3ZmEKK3l1djQ0NHAxMmxlICAgICAgICAgOTQ4MmIxM2RlNGE5ZmJjZTE3NmU4MzQ0YzkzMzIxMzkKK3l1djQ0NHAxNGxlICAgICAgICAgZmI1NThjOTdlNTllODg0ZmU1YmE0MDdkZjE1OGViZDUKK3l1djQ0NHAxNmxlICAgICAgICAgYmU5YjNjZTU0MTY4MTU5YjEzMjc0NmY3YWM5MDg4ZmUKK3l1djQ0NHA5bGUgICAgICAgICAgZmE0YjliZDZiOGNhYzk2ZTEwMzIyZTYxM2M4ZTcxNDkKK3l1dmE0MjBwICAgICAgICAgICAgNzI4NGNiZjllYWNmMWNhNWNlOWUyZWZlYmNhZGY5OTkKK3l1dmE0MjBwMTZsZSAgICAgICAgYjM3ZDM0MjEyYzJhNzllOTFiNjc1YmM4N2RhYzZjYzYKK3l1dmE0MjJwICAgICAgICAgICAgNTkzOGE3Yzc1ODhmZWJiMDY5YmQwY2Q0YzQ0NzMwNWUKK3l1dmE0MjJwMTZsZSAgICAgICAgYzVjY2ZkYzFhMGRjNmNiMTMwYzA3ZWE2MWRmNmY3MjcKK3l1dmE0NDRwICAgICAgICAgICAgZmJjYmRjMzUyMWQxN2M3MDJlZTUyMWIwODkzMDk4ZTQKK3l1dmE0NDRwMTZsZSAgICAgICAgYjcxNDJkMjhkNGQwNjlkN2ViMDE5ZGNhZjhiMzIzYjEKIHl1dmo0MjBwICAgICAgICAgICAgNjViYzg4ODg3YzdmMDZhNjIyMTE1NWNhN2Y5Y2ZjYTQKIHl1dmo0MjJwICAgICAgICAgICAgZmY1YmFmZmVmYzhmZmU0NTQ3NjUzMDkyZmQ3ZGEyMDAKIHl1dmo0NDBwICAgICAgICAgICAgZWYzZjI3MjcwZTYwYWMwNjU4MmUzYWM3YzJmM2U2ZmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLW51bGwgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1udWxsCmluZGV4IDVmNGIxNjIuLmM0NWNlOTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLW51bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtbnVsbApAQCAtMTgsMjMgKzE4LDQxIEBACiBiZ3JhICAgICAgICAgICAgICAgIDM5MzRmYjgxYTYwMmRmYTdkMjk0MjBiMWE2NmYwZmQ4CiBiZ3JhNjRiZSAgICAgICAgICAgIGM4ZDMyMTdiZjU4ZDM0ZjA4MGFjODhjMGIwMDEyYzc3CiBiZ3JhNjRsZSAgICAgICAgICAgIGI3MWQ3NWE5MjhhYWMxNGNiNzY4NDAzZTZmNmE5OTEwCi1nYnJhcCAgICAgICAgICAgICAgIGFlMDljM2U5ZGNiZTBkMWVmMjFiMjM0MmJlMzY5MjEwCitnYnJhcCAgICAgICAgICAgICAgIDk4ZDMwOTg3NDA3YzUxZTU2MjA5MjFlMTFkNDBhNGZmCitnYnJhcDEwYmUgICAgICAgICAgIGVkY2ZmYjE4NWU0NGI2ZGFlNWMyZWFkNTUwNWI3MTI1CitnYnJhcDEwbGUgICAgICAgICAgIDJhNzM5MmUxNGIyMWIxZjk0NTc1MjZhMDcxMjM2YTZkCitnYnJhcDEyYmUgICAgICAgICAgIDBjNGMxZjhhZjM2MTU3MTI2NWNhMjU5ZDVmNzBmMDI2CitnYnJhcDEybGUgICAgICAgICAgIDVmMWQ4YzY2M2Q0YzI4ODYzZTY4NzE5MjQzM2IzNGE0CitnYnJhcDE2YmUgICAgICAgICAgIGU0ZWRjYTQzNjFkNjQzNzk0MDM0ZTVhYTllZjI5MGIxCitnYnJhcDE2bGUgICAgICAgICAgIDlhOTViMzg5ZDJiZjU1NjE3OWU4ZjRiMjdmYjU1MGFiCiBnYnJwICAgICAgICAgICAgICAgIDVmYmMzMTllMzAxMTBkMTlkNTM5ZjViMjc0ZWRkYjZkCi1nYnJwMTBiZSAgICAgICAgICAgIGU3MWUwZGM5YzU0NDE5Mjk3ZTk3YTg5NWJmNTdhYjFjCi1nYnJwMTBsZSAgICAgICAgICAgIDExZmI2OTcxOTdlNzlkMjdlZWJhNDA5M2EyMDdlMDE1Ci1nYnJwMTJiZSAgICAgICAgICAgIDJhNjExYmZmM2I4ZjYzZTFkOTlkMGIwZjUwODJlYWVkCi1nYnJwMTJsZSAgICAgICAgICAgIGJkNDUyOWNhOWJkNjgwZDIzYTE2ZWM2NWZkZmIzMTNiCi1nYnJwMTRiZSAgICAgICAgICAgIGI4Y2NjNzc2ZGQxZTU3YzM5Mzg2ZDNjYjViZGJlODk5Ci1nYnJwMTRsZSAgICAgICAgICAgIDc0NDMxZGQwMGRkZjEwZDk0ZDFkYjE0OTZkMTBlNDJmCi1nYnJwOWJlICAgICAgICAgICAgIDZkNDViNjFjNDhiNDBjODNiNDNjZjJkNGVjZjRkYzMyCi1nYnJwOWxlICAgICAgICAgICAgIGJjODBkYTQzOTYzOGM1OWYxZDgyMjAzN2Y1MjczOWFmCitnYnJwMTBiZSAgICAgICAgICAgIDcwM2ExNzU5MWEyYTVjMjM2Njc1YzUxMDFjMzQ5YmNjCitnYnJwMTBsZSAgICAgICAgICAgIGVlMDE0MTUzZjU1YzAxMTkxOGRmNWIyMzk0ODE1NzgwCitnYnJwMTJiZSAgICAgICAgICAgIDUyN2QzMzdlYjU4MTNlYmJhN2NmOTY5ZWU2NjBkNDIzCitnYnJwMTJsZSAgICAgICAgICAgIGZkMTkyOTIwYjE3MWEwY2Y4OGQ2MWU4MzEwZTk1ZDgxCitnYnJwMTRiZSAgICAgICAgICAgIDQ2ZDUwMmRiNmRjNWViN2U5ZGEzYzYwMDE2YjJkZjkxCitnYnJwMTRsZSAgICAgICAgICAgIDE2MDdmNWM4ZjEzMzYwYjUzYjgxODZmNTIzOTk2YjFiCitnYnJwMTZiZSAgICAgICAgICAgIDdiNjc2NGE1MDRjODUzYjA5ZjVjN2QwYjIyMjNjNWE0CitnYnJwMTZsZSAgICAgICAgICAgIGZiOTMyM2E1YmQwNjAyODJiZWM3YmZkN2QzOGRjMjMwCitnYnJwOWJlICAgICAgICAgICAgIGE0ZGM2ZjZmOWJiMDUxZGUyZGMzNDhiNTkyYWQ0MjgyCitnYnJwOWxlICAgICAgICAgICAgIDY5OWRhM2EzYjMyNGYzZmQwMDFhNTZhZWU5NjgzMzg0CiBncmF5ICAgICAgICAgICAgICAgIDE4ODU5MGIxMjMxYWZkMjMxZWE5MTA4MTVhZWYyYjI1CitncmF5MTBiZSAgICAgICAgICAgIGQ0ODY1NThlY2QyZTI3YWZjMTc5MzBiZTg2MWYwZTRjCitncmF5MTBsZSAgICAgICAgICAgIDkxN2Q2ODcxMDNiMmFkY2NhNzEzMmJmYzA3MGNhNTRhCitncmF5MTJiZSAgICAgICAgICAgIDk2ODU2MTQ0NTBmMTI4MmJlNDMzZDJiMDcyMzRjYTFmCitncmF5MTJsZSAgICAgICAgICAgIDI3MDBiZDdmYjNmZWE1NmU1NGViMDNlMzFkNmQ0ZTU3CiBncmF5MTZiZSAgICAgICAgICAgIDA4ZDk5N2EzZmFhMjVhM2RiOWQ2YmUyNzJkMjgyZWVmCiBncmF5MTZsZSAgICAgICAgICAgIGRmNjVlYjgwNDM2MDc5NWUzZTM4YTI3MDFmYTk2NDFhCitncmF5OWJlICAgICAgICAgICAgIDYzODJhMTQ1OTRhOGI2OGYwZWM3ZGUyNTUzMWY5MzM0CitncmF5OWxlICAgICAgICAgICAgIDRlYjFkZGE1ODcwNjQzNmUzYjY5YWVmMjliMDA4OWRiCiBtb25vYiAgICAgICAgICAgICAgIDhiMDRmODU5ZmVlNmEwYmU4NTZiZTE4NGFjZDdhMGI1CiBtb25vdyAgICAgICAgICAgICAgIDU0ZDE2ZDJjMDFhYmZkNzJlY2RiNWU1MWUyODM5MzdjCiBudjEyICAgICAgICAgICAgICAgIDhlMjRmZWIyYzU0NGRjMjZhMjAwNDdhNzFlNGMyN2FhCiBudjIxICAgICAgICAgICAgICAgIDMzNWQ4NWM5YWY2MTEwZjI2YWU5ZTE4N2E4MmVkMmNmCitwMDEwYmUgICAgICAgICAgICAgIDdmOTg0MmQ2MDE1MDI2MTM2YmFkNjBkMDNjMDM1Y2MzCitwMDEwbGUgICAgICAgICAgICAgIGM0NTM0MjFiOWY3MjZiZGFmMmJhY2Y1OWE0OTJjNDNiCitwMDE2YmUgICAgICAgICAgICAgIDdmOTg0MmQ2MDE1MDI2MTM2YmFkNjBkMDNjMDM1Y2MzCitwMDE2bGUgICAgICAgICAgICAgIGM0NTM0MjFiOWY3MjZiZGFmMmJhY2Y1OWE0OTJjNDNiCiBwYWw4ICAgICAgICAgICAgICAgIGZmNTkyOWY1YjQyMDc1NzkzYjJjMzRjYjQ0MWJlZGU1CiByZ2IwICAgICAgICAgICAgICAgIDBkZTcxZTVhMWY5N2Y4MWZiNTEzOTdhMDQzNWJmYTcyCiByZ2IyNCAgICAgICAgICAgICAgIGY0NDM4MDU3ZDA0NmU2ZDk4YWRlNGU0NTI5NGIyMWJlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1wYWQgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1wYWQKaW5kZXggOWU0NzRiOS4uZTc3NzIxMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtcGFkCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXBhZApAQCAtNSwyMiArNSw2MyBAQAogYmdyMCAgICAgICAgICAgICAgICAzMjIwN2EyZGUxYjJhYzc5MzdlOTQwYTg0NTliOTdjMAogYmdyMjQgICAgICAgICAgICAgICBmOGI2NWFkODQ1OTA1YzdkMGM5M2NhMjhkZmJiODI2ZgogYmdyYSAgICAgICAgICAgICAgICA5MjlhYWMxNWU4NDgwMzhlMzY3YzI1MDAzNzU3NWY5ZgotZ2JyYXAgICAgICAgICAgICAgICA2NzEyOTg0YjRhMDY4ZmZhNTM0ZjBjYjM1YjJhZGM2ZgorZ2JyYXAgICAgICAgICAgICAgICA1ZjE2Y2NjYWI1YTE3Y2I3NjZjODgyZTg2NTk5NTE2NworZ2JyYXAxMGxlICAgICAgICAgICBhNjc3MzIyMTAwNDA5ZjliMWQyMjEzNmIxNGJmYjUzNAorZ2JyYXAxMmxlICAgICAgICAgICBlMGU0M2Y4MzhjZmJlOTgwODYwNDJiYTU0YjVmNzBiZQorZ2JyYXAxNmxlICAgICAgICAgICAwZjQ0MTRkYjY3Yjg0YTcyMDEwNmQ3YTNiMjQzNTc2NgogZ2JycCAgICAgICAgICAgICAgICAzYzk0ZDM5MjU2ZGIyNDA5MDE1ZGY5MTNmZDMzMGE5MAorZ2JycDEwbGUgICAgICAgICAgICA1YjM1NjczN2NkOGEzOTZmMzliYmRhZGI3Y2IzNWUwNgorZ2JycDEybGUgICAgICAgICAgICA5MWZkYWQwZDFlZGY3YmZhMjgwNWUyMDQxZThkYTNjZAorZ2JycDE0bGUgICAgICAgICAgICBkZWIyYzNhZjZiNDhmYWE1MmY2YTFmNjU5MGEwY2RmNworZ2JycDE2bGUgICAgICAgICAgICBhNjE1NmQxYTM3ZTA1ZWU2MjFiMmEzNDNmYjE1OGJkNgorZ2JycDlsZSAgICAgICAgICAgICA5ZTgyN2Y0MzhlMDgxZDMzNGE2Y2FlN2UyODI2OThiMAogZ3JheSAgICAgICAgICAgICAgICBkZGM2NjNhMDQ5MWRmMzk1OWQ5YzU3OTVkY2VhYTcyZQorZ3JheTEwbGUgICAgICAgICAgICBlNjU1OWMxYzhjMDVjZTg5ZjQ0YjQ2NTU3M2RiNDRlNworZ3JheTEybGUgICAgICAgICAgICAxZTZjNjc1NzY1OGM3YWU4YTFmODMwNDMyYzViNzcyMgorZ3JheTE2bGUgICAgICAgICAgICA0NjhiZGE2MTU1YmRjN2E3YTIwYzM0ZDZlNTk5ZmQxNgorZ3JheTlsZSAgICAgICAgICAgICBmOGYzZGZlMzFjYTVmY2JhODI4Mjg1YmNlZWZkYWI5YQorbnYxMiAgICAgICAgICAgICAgICAzODE1NzQ5NzljYjA0YmUxMGM5MTY4NTQwMzEwYWZhZAorbnYyMSAgICAgICAgICAgICAgICAwZmRlYjJjZGQ1NmNmNWE3MTQ3ZGMyNzM0NTZmYTIxNwogcmdiMCAgICAgICAgICAgICAgICA3OGQ1MDBjODM2MWFiNjQyM2E0ODI2YTAwMjY4YzkwOAogcmdiMjQgICAgICAgICAgICAgICAxN2Y5ZTJlMGM2MDkwMDlhY2FmMjE3NWM0MmQ0YTJhNQogcmdiYSAgICAgICAgICAgICAgICBiMTU3YzkwMTkxNDYzZDM0ZmIzY2U3N2IzNmM5NjM4NgoreHl6MTJsZSAgICAgICAgICAgICA4NWFiZjgwYjc3YTkyMzZhNzZiYTBiMDBmY2JkZWEyZAogeWE4ICAgICAgICAgICAgICAgICA1ZmMwZjQ3MTIwN2RkZjdhYTAxYjA3MDI3ZDU2YjY3MgogeXV2NDEwcCAgICAgICAgICAgICBjYjg3MWRjYzFlODRhN2VmMWQyMWY5MjM3Yjg4Y2Y2ZQogeXV2NDExcCAgICAgICAgICAgICBhZWMyYzE3NDBkZTlhNjJkYjBkNDFmNGRkYTkxMjFiMAogeXV2NDIwcCAgICAgICAgICAgICA0Mzk4ZTQwOGZjMzU0MzZjZTRiMjA0Njg5NDZmNThiNgoreXV2NDIwcDEwbGUgICAgICAgICA3NDUxOGE3ZDY4NDU3YzU0ZGEzMzAwZTgwYzY4M2U5YworeXV2NDIwcDEybGUgICAgICAgICAzMjA4NmM2NGM4MTQzMTVhYTkyNTM1ODA3MDhhMTkyZQoreXV2NDIwcDE0bGUgICAgICAgICAyNjVlOWZlZmI4YjkyZjNjYWU2NzhlYjNjZjRlMDBiNAoreXV2NDIwcDE2bGUgICAgICAgICAxY2E4OWU0NzE2NGQ1ZjI0ODFlMzlkNGFjNmVhYjJlZAoreXV2NDIwcDlsZSAgICAgICAgICA1OWYwMjA5MDg0ZDFkMWRkMjg2MWUwNThkMWRmNjNmNAogeXV2NDIycCAgICAgICAgICAgICBlNDNkNjg1NjhkOWY3ODI5MDhiYTU2YmYxZTA5ZDVkNQoreXV2NDIycDEwbGUgICAgICAgICAxODY2N2NmN2Y4N2Q4ZmZlMWM0Y2MzZGIyMTAwYzU1OQoreXV2NDIycDEybGUgICAgICAgICA3MWUzMjIyMGZhMWJiZGNhYzk1ZmI1N2JhMGRiZDRmMAoreXV2NDIycDE0bGUgICAgICAgICBhMDA2NGJlNGQyOTA3OWE4MTFlNWEzMTUzNDFkYTA5YQoreXV2NDIycDE2bGUgICAgICAgICA4MzYwNTdlOTk5OWM3NjM2OTdjNjZjMjE4Njk0OTJiOAoreXV2NDIycDlsZSAgICAgICAgICAzMjEzYmVkNzk3ZTdiNGNlZmE0ZjE3NGRjMzNiZjI0NgogeXV2NDQwcCAgICAgICAgICAgICBhN2UzNGRlNzRjOTZiMDIyNGZlMTM4MWVjMWRiMmJhNworeXV2NDQwcDEwbGUgICAgICAgICBmOTFhNDgxZTI3YmU3ZWE0YTM4YTg3OGU1ZTQzMzBhMworeXV2NDQwcDEybGUgICAgICAgICAwZTk5NTNhMDlhYzA5ZmU1ZjE1MjNiMzUwY2Y3Y2I3MgogeXV2NDQ0cCAgICAgICAgICAgICA2YmZkODkyODZkYzM2ZjI3ODliNzdkNzQ3ZWQ4ZmEyMgoreXV2NDQ0cDEwbGUgICAgICAgICBiMTBhZmI1ZmRhOTcwZGJjZThhYWM1YWFiOTgxYThjYgoreXV2NDQ0cDEybGUgICAgICAgICA4ZjFiNGIwZjkxZDMwOWZkYWFlYzhhMWJhNmM3MTA3ZgoreXV2NDQ0cDE0bGUgICAgICAgICAyYTg3YTg0ZmEwMTIzN2RlOWMwOGRkN2U5ZmZiZjc4ZAoreXV2NDQ0cDE2bGUgICAgICAgICAyODUwODg2N2ZlNzQ3MGMzNTM5ZjhhODRlOGZiODI3MQoreXV2NDQ0cDlsZSAgICAgICAgICA5OWQzOWVmODk3YzYwMzdkNmM3YWE2ZTdhMDM5OGY4NAogeXV2YTQyMHAgICAgICAgICAgICA4NDJjMjcxNjllY2RjZjZkZTc5ZjJiNzg3MzY3YjUxYworeXV2YTQyMHAxMGxlICAgICAgICAzMzZmY2I0MmM1YjY2NWMyMDI4NjYxZTczMzI1YjM1OQoreXV2YTQyMHAxNmxlICAgICAgICBmZjQ1ZGU3OTBlN2JkZDNjMjVkOGFhZDUxMjg5YWJhOQoreXV2YTQyMHA5bGUgICAgICAgICA4ZWYxZjNiM2UwMWI1Y2UyMjJlNGNhZWVjM2RlYzM5NgogeXV2YTQyMnAgICAgICAgICAgICA5MWRjZWNjNGJmZGZmMWYwZGI5ZWY4YjliNWI5YWMyYQoreXV2YTQyMnAxMGxlICAgICAgICAxYmEyOTJjNzRjODY0NmZkMDc3YTYxMTYxNDJiMWJjOAoreXV2YTQyMnAxNmxlICAgICAgICAzODMyMjY1NTBmZTljOTNkNmU4YmYwZDQ1ZDE0MjNkMQoreXV2YTQyMnA5bGUgICAgICAgICAwZmI3Njc4OGM5MDVjNmQ0NDgxNDNhYTNjNWVhZTExNgogeXV2YTQ0NHAgICAgICAgICAgICBmYjYwOTQxYTU3NTk2YjI3NzQxN2EzYzdjMDBhYTE5NAoreXV2YTQ0NHAxMGxlICAgICAgICAyNTFlYTRlYWQ4MzAwZDc1MmViMzU1YTA4Y2JiMDM1MgoreXV2YTQ0NHAxNmxlICAgICAgICA1YjY1Mjg3ZTE4NjJkMmQ5ZjFhZDJjZmRjZGU5NDY2MQoreXV2YTQ0NHA5bGUgICAgICAgICBlNjk0NmMxMGI5NGMyNzFlN2VhMjRiM2JjZmYzMTRlMQogeXV2ajQxMXAgICAgICAgICAgICBjYTk2N2U2ODc1OWE0OTU2NzI5ZGQzNjZhZGM3ZTdmYQogeXV2ajQyMHAgICAgICAgICAgICBjMDA2MTFjZDVmMTU1ODA0N2Q1NzlkOGE3ZDMwZTM4MQogeXV2ajQyMnAgICAgICAgICAgICBiM2FjZGYwNzE0N2E3NTk4ODM2MDY1ODM2YWQ4NDIwYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtcm90YXRlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtcm90YXRlCmluZGV4IGU3YmJiNTUuLmU0ZWQ4MWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXJvdGF0ZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1yb3RhdGUKQEAgLTUsNyArNSw3IEBACiBiZ3IwICAgICAgICAgICAgICAgIDZmY2Q2N2M4ZTZjZWM3MjNkYWIyMWM3MGNmNTNkYzE2CiBiZ3IyNCAgICAgICAgICAgICAgIDRjZmYzODE0ODE5ZjAyZWNmNTgyNGVkZmQ3NjhkMmIxCiBiZ3JhICAgICAgICAgICAgICAgIDM5MzRmYjgxYTYwMmRmYTdkMjk0MjBiMWE2NmYwZmQ4Ci1nYnJhcCAgICAgICAgICAgICAgIGFlMDljM2U5ZGNiZTBkMWVmMjFiMjM0MmJlMzY5MjEwCitnYnJhcCAgICAgICAgICAgICAgIDk4ZDMwOTg3NDA3YzUxZTU2MjA5MjFlMTFkNDBhNGZmCiBnYnJwICAgICAgICAgICAgICAgIDVmYmMzMTllMzAxMTBkMTlkNTM5ZjViMjc0ZWRkYjZkCiBncmF5ICAgICAgICAgICAgICAgIDE4ODU5MGIxMjMxYWZkMjMxZWE5MTA4MTVhZWYyYjI1CiByZ2IwICAgICAgICAgICAgICAgIDBkZTcxZTVhMWY5N2Y4MWZiNTEzOTdhMDQzNWJmYTcyCkBAIC0xMyw4ICsxMywyMiBAQAogcmdiYSAgICAgICAgICAgICAgICBiNmUxYjQ0MWMzNjVlMDNiNWZmZGY5YjdiNjhkOWEwYwogeXV2NDEwcCAgICAgICAgICAgICA1ZDRkOTkyYTc3Mjg0MzFhYTRlMDcwMGY4N2ZiN2ZkOAogeXV2NDIwcCAgICAgICAgICAgICBhMDE0YzdlYjdhODM4NWQxZGQwOTJiN2E1ODNmMWJmZgoreXV2NDIwcDEwbGUgICAgICAgICAxNWM4MzI5NGVmNTYwZDU3ZjI1ZDE2YWU2ZTBmYzcwYworeXV2NDIwcDEybGUgICAgICAgICBjMTlhNDc3YTA3ZmNmODhlMzdhYjM3YjQxNmQwNjRjMAoreXV2NDIwcDE2bGUgICAgICAgICBkYWU4ZGE5ZWRkNDI1NTA1MWUzZTU0NmFlN2VkOWJkMworeXV2NDIwcDlsZSAgICAgICAgICA4M2E2ZDMyYzkxYzE1YTNiYzMzNGJiOWFiZjkyMDY1NAogeXV2NDQ0cCAgICAgICAgICAgICA4ZjkwZmIzYTc1Nzg3OGM1NDVhOGJmZTVkMTlhOWJhYgoreXV2NDQ0cDEwbGUgICAgICAgICA2ZDczNmZhNDY0ZmYyZGUyYjA3ZTBhNTZhZjg0NDRiNworeXV2NDQ0cDEybGUgICAgICAgICAwOGE4MWIyZWE5YzdjOGI0NDdlNDBlZjhmNGE0NmE0YQoreXV2NDQ0cDE2bGUgICAgICAgICA3ODFjMjIzMTdjMDJiM2RkNDIyNTcwOTAwMGJkYjg0NworeXV2NDQ0cDlsZSAgICAgICAgICBjYWVmOTQ3YjhhZmY1YjUyMjg1Mzg1YzZhZTliMjQzOQogeXV2YTQyMHAgICAgICAgICAgICBiMjI3NjcyZTU2MjE1ZTE4NGU3MDJjMDJhNzcxZDdmMworeXV2YTQyMHAxMGxlICAgICAgICAwMWU5NGVlNjA1NzE0Mzk2ZTY5YjAxM2MxMWRkYTM0OAoreXV2YTQyMHAxNmxlICAgICAgICBiMTkzMGFiMjhmZmUwMzFjNzhjYTI4ZDM0MDYzMTFjOAoreXV2YTQyMHA5bGUgICAgICAgICAwZTljOTgwM2FhYWRkYzlmMzhlNDE5ZGU1ODc3OTNjMgogeXV2YTQ0NHAgICAgICAgICAgICA0NTlmYWQ1YWJmZDE2ZGI5YmI2YTUyNzYxZGM3NGNjMQoreXV2YTQ0NHAxMGxlICAgICAgICA5MmY4MjBkMzQ4MWI3ZWJjYjQ4Yjk4YTczZTdiNGM5MAoreXV2YTQ0NHAxNmxlICAgICAgICAyZWQ1NmVhNTBmYWZkYTRkMjI2YzliMTMzNzU1ZGFkOAoreXV2YTQ0NHA5bGUgICAgICAgICA0ZWViNTk4OGRmMDc0MGZlYTcyMGRhMWUzMWJiYjgyOQogeXV2ajQyMHAgICAgICAgICAgICA4ZjNkOGYxYjQ1NzdkMTEwODJkNWFiOGE5MDFlMDQ4ZAogeXV2ajQ0NHAgICAgICAgICAgICBiMTYxZTZkNWE5NDFlMmE0YmI3YmM1NmVmOGFmNjIzZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtc2NhbGUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1zY2FsZQppbmRleCAyNDFlODM5Li4xNjExYzYwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1zY2FsZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy1zY2FsZQpAQCAtMTgsMjMgKzE4LDQxIEBACiBiZ3JhICAgICAgICAgICAgICAgIGQ4MzE2MjcyYmMzYTM2MGVmOWRmZjNlY2M4NDUyMGEzCiBiZ3JhNjRiZSAgICAgICAgICAgIDRlNmExYjlmOWMxOGI4ODFjMjdkNzY2MTFkNDVmNzM3CiBiZ3JhNjRsZSAgICAgICAgICAgIGVmZWVlMGFiY2M2NThlYmNmZjA0OWQ1ZTc0ZDc0OTQzCi1nYnJhcCAgICAgICAgICAgICAgIGU5N2VhNGExMDQ0NjdjNDgyMTczYjdlYWE1N2MxNGUzCitnYnJhcCAgICAgICAgICAgICAgIDRhMTAwZjc1MGFjODQ2YjM0YmZlZWYwZDY4OTNjM2RlCitnYnJhcDEwYmUgICAgICAgICAgIDZkODlhYmI5MjQ4MDA2YzNlOTAxNzU0NWU5NDc0NjU0CitnYnJhcDEwbGUgICAgICAgICAgIGNmOTc0ZTIzZjQ4NWExMDc0MGY1ZGU3NGE1YzhjM2RmCitnYnJhcDEyYmUgICAgICAgICAgIDFkOWI1Nzc2NmJhOWMyMTkyNDAzZjQzOTY3Y2I5YWYwCitnYnJhcDEybGUgICAgICAgICAgIGJiMWJhMWMxNTc3MTdkYjNkZDYxMmE3NmQzOGEwMThlCitnYnJhcDE2YmUgICAgICAgICAgIGM3MmI5MzVhNmU1N2E4ZTFjMzdiZmYwOGMyZGI1NWIxCitnYnJhcDE2bGUgICAgICAgICAgIDEzZWIwZTYyYjFhYzljMWM4NmM4MTUyMWVhZWZhYjVmCiBnYnJwICAgICAgICAgICAgICAgIGRjMzM4N2Y5MjVmOTcyYzYxYWFlN2ViMjNjZGMxOWYwCi1nYnJwMTBiZSAgICAgICAgICAgIDNhNmQ1OTE5MmI2YmI4OWFiNDIyNTJiMmI0ODE4NTE5Ci1nYnJwMTBsZSAgICAgICAgICAgIGNjMmQ2MGQzODFiMjVmZTI4MTM1NDA0MDlmMmQwYWYzCi1nYnJwMTJiZSAgICAgICAgICAgIGVhMWRhOWIzYzQ4YmFlYmNjNjUxMDg0YjA4ODQ0ODJjCi1nYnJwMTJsZSAgICAgICAgICAgIGUwMmE0MzZkYzQ0ODc5M2ZjOGM2NGM5NDEyNzI2Mjc0Ci1nYnJwMTRiZSAgICAgICAgICAgIGEwNjUyOTdhYjRlZjJmMmYwYzUwM2Y4ZjJhZTQzYmQxCi1nYnJwMTRsZSAgICAgICAgICAgIDdiMDdiZWFmNTRlMmZlYWM3NzRkM2M5MDVjYmJmMTVlCi1nYnJwOWJlICAgICAgICAgICAgIGI3YmM2NTI1MTg0NTczNTY0NDRhODQwZWY2ZDJiYzU2Ci1nYnJwOWxlICAgICAgICAgICAgIDBlZDcwOWY3ODI4ZjBiZTVmODI4NTk2ZjA3MjBhODJiCitnYnJwMTBiZSAgICAgICAgICAgIDAyNzdkNGMzYTg0OThkNzVlMjc4M2ZiODEzNzllNDgxCitnYnJwMTBsZSAgICAgICAgICAgIGYzZDcwZjhhYjg0NWMzYzliOGY3NDUyZTRhNmUyODVhCitnYnJwMTJiZSAgICAgICAgICAgIGZiZDRlMTQ5YzQ1MmMzNTFjNmQxYzExZDZiNmUxNzZhCitnYnJwMTJsZSAgICAgICAgICAgIGM1MWQ1MWMzYjc1M2Q3MzVlYjIyOTgzMzk3MjYyYzg4CitnYnJwMTRiZSAgICAgICAgICAgIGNkMjA4MDg1OTJlNjJjYzQzOTc4NmMxOGExNGIzZTcwCitnYnJwMTRsZSAgICAgICAgICAgIDQ1NmY3ZDFmZjU5OTBhYTYzNzkxMzdkODRkZDYzODYyCitnYnJwMTZiZSAgICAgICAgICAgIDVmYzgyNmNmYWJlYmZjMTQ0MmNiNzkzYzRiNjMwM2UyCitnYnJwMTZsZSAgICAgICAgICAgIDFiM2UwYjYzZDQ3YTNlMWI2YjIwOTMxMzE2ODgzYmYyCitnYnJwOWJlICAgICAgICAgICAgIGQ5Yzg4OTY4MDAxZTE0NTJmZjMxZmJjOGQxNmIxOGEwCitnYnJwOWxlICAgICAgICAgICAgIDJjY2ZlZDA4MTZiZjZiZDRiYjNhNWI3NTkxZDk2MDNhCiBncmF5ICAgICAgICAgICAgICAgIDIyMTIwMWNjN2NmYzQ5NjRlYWNkOGIzZTQyNmZkMjc2CitncmF5MTBiZSAgICAgICAgICAgIDk0NTI3NTZkMGIzN2Y0ZjVjN2NhZTc2MzVlMjJkNzQ3CitncmF5MTBsZSAgICAgICAgICAgIDM3ZmQyZTFlYzZiNjY0MTAyMTJkMzlhMzQyZTg2NGRmCitncmF5MTJiZSAgICAgICAgICAgIDk1MGRlNWQxYjZiOTQzYTI2YzUxZjZhMTU3ZTE5YTE0CitncmF5MTJsZSAgICAgICAgICAgIDljM2IxNTRhOGJiMGE3M2EzYjQ2NTg5MmRiYzIzYjM2CiBncmF5MTZiZSAgICAgICAgICAgIDMyODkxY2IwOTI4YjExMTlkOGQ0M2E2ZTFiZWYwZTJiCiBncmF5MTZsZSAgICAgICAgICAgIGY5NmNmYjU2NTJiMDkwZGFkNTI2MTU5MzBmMGNlNjVmCitncmF5OWJlICAgICAgICAgICAgIDc3OWRlYzBjNmMyZGYwMDgxMjhiOTE2MjJhMjBkYWY4CitncmF5OWxlICAgICAgICAgICAgIGZhODdhOTZjYTI3NWY4MjI2MDM1ODYzNWY4MzhiNTE0CiBtb25vYiAgICAgICAgICAgICAgIGYwMWNiMGI2MjMzNTczODc4Mjc5MDJkOWQwOTYzNDM1CiBtb25vdyAgICAgICAgICAgICAgIDM1YzY4Yjg2YzIyNmQ2OTkwYjJkY2I1NzNhMDVmZjZiCiBudjEyICAgICAgICAgICAgICAgIGIxMThkMjRhMzY1M2ZlNjZlNWQ5ZTA3OTAzM2FlZjc5CiBudjIxICAgICAgICAgICAgICAgIGM3NGJiMWMxMGRiYmRlZThhMWY2ODJiMTk0NDg2YzRkCitwMDEwYmUgICAgICAgICAgICAgIDFkNjcyNmQ5NGJmMTM4NTk5NmE5YTk4NDBkZDBlODc4CitwMDEwbGUgICAgICAgICAgICAgIDRiMzE2ZjJiOWUxODk3MjI5OWJlYjczNTExMjc4ZmE4CitwMDE2YmUgICAgICAgICAgICAgIDMxZTIwNDAxOGNiYjUzZjg5ODhjNGUxMTc0ZWE4Y2U5CitwMDE2bGUgICAgICAgICAgICAgIGQ1YWZlNTU3ZjQ5MmEwOTMxN2U1MjVkN2NiNzgyZjViCiBwYWw4ICAgICAgICAgICAgICAgIDI5ZTEwODkyMDA5YjJjZmU0MzE4MTVlYzMwNTJlZDNiCiByZ2IwICAgICAgICAgICAgICAgIGZiZDI3ZTk4MTU0ZWZiNzUzNTgyNmFmZWQ0MWU5YmIwCiByZ2IyNCAgICAgICAgICAgICAgIGUwMjJlNzQxNDUxZTgxZjJlY2NlMWM3MjQwYjkzZTg3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy10aW50ZXJsYWNlX2N2bHBmIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV9jdmxwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTcwM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV9jdmxwZgpAQCAtMCwwICsxLDI1IEBACitncmF5ICAgICAgICAgICAgICAgIDk4NDlkNzE1MTlhZTljNTg0YWU4YWJmYThhZGIyZjhlCit5dXY0MTBwICAgICAgICAgICAgIDQ0ZWU0Yjc0Yjk1YzgyZDZmNzlkZGY1M2I1ZTNhYTlkCit5dXY0MTFwICAgICAgICAgICAgIDVmYTlkMWZiYTdhZGZkNmY3ZmEwNDQ2NDMzMmI2MzFhCit5dXY0MjBwICAgICAgICAgICAgIGVlOTU5MWVhM2FiMDZjNzNiZTkwMmM0Yjg4NjhjNjllCit5dXY0MjBwMTBsZSAgICAgICAgIDE5YjJkY2Y1ZTgyNzI1YjJjOWUzNjZkNWQzYTRiNjdiCit5dXY0MjBwMTJsZSAgICAgICAgIGU1Yjc2ZWI1OGNhYjJkZmE0MjczOGY2NjVkOGI4MDU5Cit5dXY0MjJwICAgICAgICAgICAgIGIxYmU3YjU1NTY3YmRlODZkNjU1YWRmODBmYWMxMjU3Cit5dXY0MjJwMTBsZSAgICAgICAgIDY2Zjc0MzNjNzQyM2Q2Mjg5ZWUyMGMxOWM0ZThkZDkwCit5dXY0MjJwMTJsZSAgICAgICAgIGI0YTRiNWVkODEzNDFiMzZmNjg1YjE0YjJiYjhhNzk4Cit5dXY0NDBwICAgICAgICAgICAgIGRkZjZlZTY5N2Y0ZmY0ZjkwZDUwMWU2ODY5MzkyMzA5Cit5dXY0NDBwMTBsZSAgICAgICAgIDdlNDRhOTJkOWU0N2UxNWYwNzI4YjEyNTcyNWNjZDQxCit5dXY0NDBwMTJsZSAgICAgICAgIGMyY2FjODI2NjFlMTBiZTQ5MTdiZDlkYWNiNDE5ZmNlCit5dXY0NDRwICAgICAgICAgICAgIDdjYjVkMGMwOTk3YzhjMjU0NWExNmJmYzRjYjlmZDZkCit5dXY0NDRwMTBsZSAgICAgICAgIDA4ZmIxM2M2OWI0MDIyOTAxNGE2Y2NmMGJkZDU0OThmCit5dXY0NDRwMTJsZSAgICAgICAgIDc5NmM1NTU5YjlmNDI2NDcwZWIyOTk3YzIxYmU1ZDE0Cit5dXZhNDIwcCAgICAgICAgICAgIGVlMDc2MWUyZjc2ZWM0NDFjNTQ1ZmVlZGU3NzEwM2U0Cit5dXZhNDIwcDEwbGUgICAgICAgIDRiYjZiM2ExY2JmMmZkMWZlNWFlZmNjMTFjZTgwMjlmCit5dXZhNDIycCAgICAgICAgICAgIGE4ZGEyODA2ZTIxYTg4NDQ5MDc5ZmFhN2Y0MzAzZmZhCit5dXZhNDIycDEwbGUgICAgICAgIGQyOTY1YjViNWE0M2E3MTY1YmFkYWZmMDcxOGExN2Q4Cit5dXZhNDQ0cCAgICAgICAgICAgIGEzZjU3NzM0ZDZmNzJiZGYzN2Y4ZjYxMmVhN2NjZTYzCit5dXZhNDQ0cDEwbGUgICAgICAgIGUwMjA1MTI5MDFmZDlhYzcwODg4OThhNGUzYThjN2MxCit5dXZqNDIwcCAgICAgICAgICAgIDlmMzU4ZTMxMWI2OTRiY2QwMWUxYTA3ZDExMjBhZGU1Cit5dXZqNDIycCAgICAgICAgICAgIDlhNzYyOGE5ZjE2MzBkMzVjNzE3Njk1MWRkYzFiMmY2Cit5dXZqNDQwcCAgICAgICAgICAgIDExMmZlMzUyOTJjNjg3NzQ2ZWMwYzYyMmE0MmM2MTFiCit5dXZqNDQ0cCAgICAgICAgICAgIGY4OTQ0MzhmNDA5NTAyMjliYWEwMjU0NWRhYTg4MTJhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy10aW50ZXJsYWNlX21lcmdlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV9tZXJnZQppbmRleCBlNWQzYmYwLi5mYTYxNTFjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy10aW50ZXJsYWNlX21lcmdlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXRpbnRlcmxhY2VfbWVyZ2UKQEAgLTIsMTIgKzIsMjMgQEAKIHl1djQxMHAgICAgICAgICAgICAgZDQ1MDZlNDllZWI2NGM3Y2U3MTRjMDc1OTdlN2RkNjkKIHl1djQxMXAgICAgICAgICAgICAgMmU4YmIzODVjYjRhNTNhMGYzNzcxODE1MDIwZjcyMTMKIHl1djQyMHAgICAgICAgICAgICAgYzk2N2QzZDVmMzIwMGQxYjI0MTdiMGYyMzU2ZjEyZmMKK3l1djQyMHAxMGxlICAgICAgICAgNDA0ZDkwZWNhOWI5M2Y3YzA5NDliZTIzMTg3ODA0YzcKK3l1djQyMHAxMmxlICAgICAgICAgZWIyZWY4MWI4MmYxMzQyNjE4ZTRjOWZlOGUwODY1OTIKIHl1djQyMnAgICAgICAgICAgICAgZmViYWE4NGVhMmUzMjQ2YWY3NDJhN2VkMzdjMDMwZjYKK3l1djQyMnAxMGxlICAgICAgICAgMGRjNWYzODMzYzBmMTFhMGZjZDA0MjJkNzY1MDhjMTAKK3l1djQyMnAxMmxlICAgICAgICAgMTkwZWI3ZTc2YWY1ZmM0ODE1ODhkZWQ0NzI5MDFiNTgKIHl1djQ0MHAgICAgICAgICAgICAgMTNhOTM0YjQyZGY2NWYxMWUxNTMzMTRlYmI0ZjMxMWUKK3l1djQ0MHAxMGxlICAgICAgICAgN2ZhYmVhNTFkNmU1MmI3MThlZjNhYjkxOWIyNGY4ZDIKK3l1djQ0MHAxMmxlICAgICAgICAgYzdiMTM4Mzc0YTE4ZjI1OGJkZDFhMmQyMWI0NDIxYjAKIHl1djQ0NHAgICAgICAgICAgICAgNDVkNDQ2NmY1Njg5OTQyYTRlZmZiMGZkMjNlNDQ5NDkKK3l1djQ0NHAxMGxlICAgICAgICAgZmRlOTU2MjdiYTBlNjZiZTdlYzg2MzM4NmIzZTVjYTYKK3l1djQ0NHAxMmxlICAgICAgICAgYzFlMTVjOTM0Y2UzYmM1NjJhODY5ZGQ3OGM3NWRiMTcKIHl1dmE0MjBwICAgICAgICAgICAgZGMxMTczYTA3YzNmOTkzYjI3N2VhMGM5NGQ1MTNlMWYKK3l1dmE0MjBwMTBsZSAgICAgICAgZDg1OTcyNzYyNDM3MTA1YTkzMjc1OWM0YmI5NzU5YzkKIHl1dmE0MjJwICAgICAgICAgICAgY2EyMDBiZTgwZTViZmRiMTU5ZTFhZWE1NzEyOWVkM2EKK3l1dmE0MjJwMTBsZSAgICAgICAgMDZkNGY3OWVlMmRkZjMxZDlmZTE1YWY4Y2E1NzNmNDYKIHl1dmE0NDRwICAgICAgICAgICAgOWYzOWMzNWQ2ODk5ZGNiOGI5YTliMDdjMzM5Y2EzNjUKK3l1dmE0NDRwMTBsZSAgICAgICAgYjBjNTRmYzNlZmFkNzNmMjUyZDg2MTI3NDA3YWExZmQKIHl1dmo0MjBwICAgICAgICAgICAgODQ0MzU5MjkzYmI2ZmY4MTU0OWYzZmMwMDkwY2M1ODcKIHl1dmo0MjJwICAgICAgICAgICAgNTI2YWYwNDlkNDM5NzQ4MjJiYWE3YjQ4YWExZTEwOTgKIHl1dmo0NDBwICAgICAgICAgICAgYWY5Mjg1MTk0ZGE4ZWZiYzQwZDkzYmY4MTA5ZjlkYzUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXRpbnRlcmxhY2VfcGFkIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV9wYWQKaW5kZXggZGNmMjE2OC4uOGY2YjFjNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV9wYWQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV9wYWQKQEAgLTIsMTIgKzIsMjMgQEAKIHl1djQxMHAgICAgICAgICAgICAgMzViYzExZDBkMzJlZmM5ZTlhOTY5YmU3ZDcyMGY0ZTYKIHl1djQxMXAgICAgICAgICAgICAgMTdlZjNjZDIyYTc0ZjczNjhiNWUwMmY2ODc3OWYyOTQKIHl1djQyMHAgICAgICAgICAgICAgOTNkNWI2YTRjNDRkNjdlNGQ0NDQ3ZThkZDBiZjNkMzMKK3l1djQyMHAxMGxlICAgICAgICAgMTRlNzU0YzZlOWQ0MWNiMDQ4Y2UzYzkzNTEyZDdkMzUKK3l1djQyMHAxMmxlICAgICAgICAgY2U1NGEyZTM4ZDEyMWE3NTc1ZGZmMzA1NDJmYWNhYWQKIHl1djQyMnAgICAgICAgICAgICAgM2VlNDBiMGI2NTMzYjkxODM3NjRiODVjODUzZWMzZjkKK3l1djQyMnAxMGxlICAgICAgICAgZDRiNjFhODRiOTNlNzRiMDdiNzAyMGNlZWQ0MGUzOWUKK3l1djQyMnAxMmxlICAgICAgICAgOGZkOTBiZTEyYTk3MzA3NjQ1ZWNmY2QwOWQ1NzY2NDMKIHl1djQ0MHAgICAgICAgICAgICAgMWQzYzEyNThhNTFkMDllNzc4Y2Q4MzY4YjFhNDEyNmYKK3l1djQ0MHAxMGxlICAgICAgICAgMjlkMTE2Y2I1NTBhMDU5MjBlNTYxOWFiNTgyODRkMzAKK3l1djQ0MHAxMmxlICAgICAgICAgZDc1MThmOTQxYTNiMmMxMzdmOTQ0YWZlOWRhODE2YTEKIHl1djQ0NHAgICAgICAgICAgICAgMTA5MzU2OGFkOGY0NzllYzIwZTczOGQwMThkZDNmOGYKK3l1djQ0NHAxMGxlICAgICAgICAgYzY1MjMzZTFkOGIwMWYzMzY5YzIwNzM4ZjczODY4MDEKK3l1djQ0NHAxMmxlICAgICAgICAgNzBkYzUxYTg1N2JmYjIxNWIzYTgxZmNlYjExNGI3NGMKIHl1dmE0MjBwICAgICAgICAgICAgNDU4OGFlZjIwYzAwMTBlNTE0NTUwYzkzOTEyMTk3MjQKK3l1dmE0MjBwMTBsZSAgICAgICAgMzE4MWU4NGZkN2FhZWQ2MDZiYjg2ZWVjZDJlMTNmMjAKIHl1dmE0MjJwICAgICAgICAgICAgMzQyNmVkMWFjOTQyOTIwMmQ4YzI5ZmE2MmEwNGQ0YzMKK3l1dmE0MjJwMTBsZSAgICAgICAgYzAwYWNkN2M0MzdkNDE3NTVkZmYwOWM1Y2EzNjQyY2YKIHl1dmE0NDRwICAgICAgICAgICAgMWI5ZmM3OTFjN2Q3NzRiNGJhOGM5ZGM4MzZmNzhjZjUKK3l1dmE0NDRwMTBsZSAgICAgICAgNjE2YjQyYTIzMmM4M2I4ZjllNWM1MTY4ZWM0YjVkYTUKIHl1dmo0MjBwICAgICAgICAgICAgOWE4NzJlMGMxYjNjMGI2ZmU4NTY0MTU2OTZiNzU4YmQKIHl1dmo0MjJwICAgICAgICAgICAgZGEzYzllZjI1NTI4YTJlZTk2NzQ2Y2U0NGU2OTY5ZjMKIHl1dmo0NDBwICAgICAgICAgICAgYTlhNTQ5NWM2YjBlMmJmNmU1NjE5OThlYTFjMzU2YTcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXRpbnRlcmxhY2VfdmxwZiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXRpbnRlcmxhY2VfdmxwZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTVmODBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtdGludGVybGFjZV92bHBmCkBAIC0wLDAgKzEsMjUgQEAKK2dyYXkgICAgICAgICAgICAgICAgYjc5NzkxNDQ5OTQ3YzI1Y2Q1YjM2ZDlkM2I5ZDE4MzEKK3l1djQxMHAgICAgICAgICAgICAgNWJjMDNmNGNmNmI0NDFiNDIxZjBmZGFlZWZmMWU5ZWQKK3l1djQxMXAgICAgICAgICAgICAgMTkwNDZkZjE4NzZjNDZlZDFlZjA0NTg2ODAyNzBiZDMKK3l1djQyMHAgICAgICAgICAgICAgNjljNzQzYjg0OTk2YmU5NDMwYjA1MWE1NWNmYmNiMjkKK3l1djQyMHAxMGxlICAgICAgICAgODU5NDhhZDYwOWFiZGVkNmI1MDg4MmQ0NTlmNWEyZjgKK3l1djQyMHAxMmxlICAgICAgICAgN2NlYmU0NWY1MWJkYWRjNzY2ZjY2YzY4ZGI4ZDM0N2QKK3l1djQyMnAgICAgICAgICAgICAgZDcxMGNjZDE5NDFmNmYzODljOTdhMDliYzk3N2U3MDkKK3l1djQyMnAxMGxlICAgICAgICAgYzU0ODczZjc3ZGFjMWQ3MTBmYjJhYTFiMGNlMjY2OWMKK3l1djQyMnAxMmxlICAgICAgICAgOTRhNTI3YmI3ODdiOWQxMjFmZmJiY2IzYTZjNTQ1ZDgKK3l1djQ0MHAgICAgICAgICAgICAgMWE0ODJhMjNmZTVhOWI3ZDAyMzg4YzI5OWZkMGE0MjMKK3l1djQ0MHAxMGxlICAgICAgICAgNTA2ZWZhMjg3ZWNjZTljOTUxZGEyMDM5ZmExZGUyYWUKK3l1djQ0MHAxMmxlICAgICAgICAgNjMxYmNmMTkwZjQwOWNjYmM1YzI3YjlmMGY2YmE1ZTIKK3l1djQ0NHAgICAgICAgICAgICAgYzk2OGE5MmY0YjdhYjY3MDZlZTliNDI1ZWI1MzQ1YjUKK3l1djQ0NHAxMGxlICAgICAgICAgMGFmNDM3ZTYzNWQ0OWZlY2NmN2RmYWUyMDFlNmRmYzUKK3l1djQ0NHAxMmxlICAgICAgICAgMmU5ZTlmN2NhYWUxZmFlM2IwMjY4MTAyNDZmYzZhYzEKK3l1dmE0MjBwICAgICAgICAgICAgM2Y4OWExNjZmMzA5YzBjZGE4YjkxYTllOGEwY2U5MzcKK3l1dmE0MjBwMTBsZSAgICAgICAgNzlkZTFjYzU0OWMwM2Q0ODkzY2Y2ZjFhY2E4NmUwNTcKK3l1dmE0MjJwICAgICAgICAgICAgZWY4ZmRiZTkxMGQ2OGU4OGU5ODIyN2IwZTk5ZmI1YTYKK3l1dmE0MjJwMTBsZSAgICAgICAgMjU3YTRhZWM0MWY5YjU0MTIxNzkyNzJkOGE3ZmI2ZjcKK3l1dmE0NDRwICAgICAgICAgICAgMzY2MmVhZGQ1ZjYxYTZlZGJjOWQ3MTVlYTg1OTE0MTUKK3l1dmE0NDRwMTBsZSAgICAgICAgMDkwNWNmNWI3ZjQyYzExYmUzZjA0ODZhNjY1MzNjNzEKK3l1dmo0MjBwICAgICAgICAgICAgMTRjNDM5MGIzMTljNWQ2NzkxODQ1MDMzMDkwNjBhYzMKK3l1dmo0MjJwICAgICAgICAgICAgYmJlMDBhMjY1MjY5MzFiNzJhMDI0ZmViZTFjZDZiOTAKK3l1dmo0NDBwICAgICAgICAgICAgZjY1NGNmMjhiNzg3OWM2YTZjOTUwYzNjYjk2MTI1ODAKK3l1dmo0NDRwICAgICAgICAgICAgYzE2MmE0ZmU3YTY2NWY0YWJmMjU3NDQzNzAzZjBkNzIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXRyYW5zcG9zZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXRyYW5zcG9zZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTA2OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBpeGZtdHMtdHJhbnNwb3NlCkBAIC0wLDAgKzEsMTEwIEBACiswYmdyICAgICAgICAgICAgICAgIDY5MjljMWUzMDhkMmY0Zjk0MWQwMDI2MjcwNDdkMjYyCiswcmdiICAgICAgICAgICAgICAgIGNmMWJlZGQwNzg0YTNlZmQzYWIwMGM0ZTQ0MDA1YzM3CithYmdyICAgICAgICAgICAgICAgIDZkNmY4OTZmODUzYTZjNmY5M2VlNzBkYmE5YWYzZDE3CithcmdiICAgICAgICAgICAgICAgIDg3YmJkMjNkZWJiOTRkNDg2YWMzYTZiNmMwYjAwNWY5CitheXV2NjRsZSAgICAgICAgICAgIGU0YzA3ZTBkNWIzMzNiM2JjOWViNGYzY2U2YWYzYTJjCitiZ3IwICAgICAgICAgICAgICAgIGRmM2E2ZWVkZDQ5MzljZTA5YTM1N2I2NTVhYzI5NjJhCitiZ3IyNCAgICAgICAgICAgICAgIGY5YTA4MTM1ZTVkNThjMGIyYTU1MDljMzY5YTg4NDE0CitiZ3I0NDRiZSAgICAgICAgICAgIGRkOWU5OTBhMzI3NjQ5ZWMwYjJiODFhOGVlNGQ4ZjQ5CitiZ3I0NDRsZSAgICAgICAgICAgIGJlZTFkOWZhZTg3MzNkMGMwNjY5YmNhMmFjNGRmYWY2CitiZ3I0OGJlICAgICAgICAgICAgIDM5ZjQ4ZjYzNTNkZmM3NzJhZjM2Y2JiNDFlNjEyNmE0CitiZ3I0OGxlICAgICAgICAgICAgIDlhNjFkOTUzMWIxZjZkZTQ0YjI3ZjZiYjliNGRmYzc5CitiZ3I0X2J5dGUgICAgICAgICAgIGRkZmY5ZGE0NjFhZmNlOTBlMzEyMmE0MWQ3OWIyODdkCitiZ3I1NTViZSAgICAgICAgICAgIDI0ZTVjNjUwMmE2ZDkyN2Y4YmE4OGYzMzIwZWJmNjE5CitiZ3I1NTVsZSAgICAgICAgICAgIDUyMDFkMDk4OTc5ZWE4NmE2NmQ4ZGYxZWY0MWM3OWFkCitiZ3I1NjViZSAgICAgICAgICAgIDU5YWZlMTdiNDU1ZTkyMWRhZjQyOGJhMDVhNDBiYWI5CitiZ3I1NjVsZSAgICAgICAgICAgIGIyNzA5NzkwNjg0YWJiZDIxMzM5MDZiNjM3ZjJiNGI4CitiZ3I4ICAgICAgICAgICAgICAgIGI2ZWUxNWY3MDk4OWQyZjUyZjE4NGUzMmIzYWYyYzE4CitiZ3JhICAgICAgICAgICAgICAgIGYyZmU2MWUwODQ0NjkwMGFkMjA5ZjJjNTg2OTk3ZTE1CitiZ3JhNjRiZSAgICAgICAgICAgIDhkMDE5OTRjOGMzMmU2MjhmY2Y5NzQ5ODUxZjFmZmU4CitiZ3JhNjRsZSAgICAgICAgICAgIGZhYWVmNmQyODBmOTJlN2U4YWJkZDlmYTRhNjFmN2I1CitnYnJhcCAgICAgICAgICAgICAgIDA4OTliM2FmNTBkMzVhNjNiZmVjYjQxOWE1YjI5OTY4CitnYnJhcDEwYmUgICAgICAgICAgIDNlM2JlMmQ4ZjlhYTVmNDQ5YTFkZjQwNGUyN2QwMDU0CitnYnJhcDEwbGUgICAgICAgICAgIGRiNGU0ODYxMDEwY2JiZjcyNjQ5MmZhZDI4MmQ1ODEzCitnYnJhcDEyYmUgICAgICAgICAgIDE1MThjOWE1NjVkMWJhMWE0NWRkMzY5YWNjMWFhNzVlCitnYnJhcDEybGUgICAgICAgICAgIDcxNGZlMzE4YWY4MWE0NmY4MzY1NWM2ZTdlMTMzNTFlCitnYnJhcDE2YmUgICAgICAgICAgIDM5ZDQ4ODUyOGFhY2ZmNDY2YWFjNzUzOWM5Yjk0OGE4CitnYnJhcDE2bGUgICAgICAgICAgIDU0MjZhYzk0NTcyODk5MjdiZmUyZWMwMzAzOGE4NzgwCitnYnJwICAgICAgICAgICAgICAgIDdiNGI2YTJmMWNkYzUxNDU1YjI1NTE1YzNlY2VhOTQ0CitnYnJwMTBiZSAgICAgICAgICAgIGQ3NDAxNzI1Njk5YjJkZGY5NTRjYWExNmEwODc4YTFlCitnYnJwMTBsZSAgICAgICAgICAgIDYwMzY3MTE5NjllYWUxOTc5YmU2MzU4ZjY4OGJkOWM4CitnYnJwMTJiZSAgICAgICAgICAgIGVjN2Q2ZTY5ZmM1Nzk2MTliNTNkNTdhNzZjMjA0ODBkCitnYnJwMTJsZSAgICAgICAgICAgIGJmNzQ3ODE4NTI3NDQ4NmMzZjdkZDRkYjFkYThmN2QwCitnYnJwMTRiZSAgICAgICAgICAgIDliNjZmMjJlNDMxNWFhYTg3OGE0MzBhZTNmNDRhYjU3CitnYnJwMTRsZSAgICAgICAgICAgIDE2ZjMwMzQ5YjQyZGNhMDA3YjM3Yjg1MjJkMzAxOGRmCitnYnJwMTZiZSAgICAgICAgICAgIDBkMDAzYjg4ZDRmNDQ2YWU5YmExMmNhYjFjYmIzNTlhCitnYnJwMTZsZSAgICAgICAgICAgIGExYzA5MDM4ZmE0NjM2Yzk4NDNhYjhkZDJiNzYwMWVhCitnYnJwOWJlICAgICAgICAgICAgIGRmMzgxYjRiMjdiZTI1ZDE3MmZhNTU2NDM0NDc4ODA3CitnYnJwOWxlICAgICAgICAgICAgIGE1MzAxZTk3OGY2OGIyOWJmYzYxM2IyNDYyZWM0ODg4CitncmF5ICAgICAgICAgICAgICAgIGM1ZjhiYzY2MzZmZDE1ZGJjNTdkZWI0YmJhMWU3Mzc5CitncmF5MTBiZSAgICAgICAgICAgIDQ4YjQyMWRhNzljMTk1ZmQ5MWRmZmI4ZmNhNzlhOGEyCitncmF5MTBsZSAgICAgICAgICAgIDc3NzRlMzI5NjkxNmI4OTZhZmE0NmY2MjYzMzRhMjgwCitncmF5MTJiZSAgICAgICAgICAgIDg5ZjFjNGI3ODIxYjc3MWY2ZDk2N2Y5ZGI4NzFmOGVmCitncmF5MTJsZSAgICAgICAgICAgIDQzZDM5MmMzZGNiZDc5YjQ3Y2NlMzFmMjAwNmM1MDUwCitncmF5MTZiZSAgICAgICAgICAgIDRhZWYzMDcwMjFhOTFiMWRlNjdmMWQ0MzgxYTM5MTMyCitncmF5MTZsZSAgICAgICAgICAgIDc2ZjJhZmUxNTZlZGNhN2FlMDVjZmE0ZTU4NjcxMjZlCitncmF5OWJlICAgICAgICAgICAgIDJjNDI1ZmE1MzJjOTQwZDIyNjgyMmRhOGIzNTkyMzEwCitncmF5OWxlICAgICAgICAgICAgIGJjYzU3NTk0MjkxMGIzYzcyZWFhNzJlODc5NGYzYWNkCitudjEyICAgICAgICAgICAgICAgIDE5NjVlMzgyNjE0NDY4Njc0OGYyZjZiNTE2ZmNhNWJhCitudjIxICAgICAgICAgICAgICAgIDI5MmFkYWY1MjcxYzVjODUxNmI3MTY0MDQ1OGMwMWY0CitwMDEwYmUgICAgICAgICAgICAgIGFkMGRlMmNjOWJmZjgxNjg4YjE4MmE4NzBmY2Y3MDAwCitwMDEwbGUgICAgICAgICAgICAgIGU3ZmY1MTQzNTk1MDIxMjQ2NzMzY2U2YmQwYTc2OWU4CitwMDE2YmUgICAgICAgICAgICAgIGFkMGRlMmNjOWJmZjgxNjg4YjE4MmE4NzBmY2Y3MDAwCitwMDE2bGUgICAgICAgICAgICAgIGU3ZmY1MTQzNTk1MDIxMjQ2NzMzY2U2YmQwYTc2OWU4CityZ2IwICAgICAgICAgICAgICAgIDMxZWE1ZGE3ZmU3NzljNmVhMGEzM2YxZDI4YWFkOTE4CityZ2IyNCAgICAgICAgICAgICAgIDQ3NjU0Y2FiYWFhZDc5MTcwYjkwYWZkNWEwMjE2MWRkCityZ2I0NDRiZSAgICAgICAgICAgIDNjYWMxZjBjNDNhNzRkMmE5NWViMDJlMTg3MDcwODQ1CityZ2I0NDRsZSAgICAgICAgICAgIDQ2ZDYwMjQ2OGJkOWU1YTQzMDYyMmUzZDRiN2M4ZjQwCityZ2I0OGJlICAgICAgICAgICAgIDQwMDkzMjQxOWJiYjc4MDYxNDI1NDI1M2VmNTU5MWMzCityZ2I0OGxlICAgICAgICAgICAgIDZhOTljNDBmMjE2MjljYjA2NTVlODc3MmQ3MTkwMzc0CityZ2I0X2J5dGUgICAgICAgICAgIGQzOTkwZGExOTYyNjYzMDVhM2YyZTViMWQ3MjQwMWE1CityZ2I1NTViZSAgICAgICAgICAgIDc5ZTQ1MDNmZjBkNWNmNTJkM2E3OTAxMzk3NDk5YTI4CityZ2I1NTVsZSAgICAgICAgICAgIGM2NWYyNTk0YzBiMzEwN2EzMjJmN2FlYjgxYWE4YTE2CityZ2I1NjViZSAgICAgICAgICAgIDBjNzQ2YjUwNjNkMDJkNmNiOThlOWU5YTU5YWQzYjk5CityZ2I1NjVsZSAgICAgICAgICAgIDYzYjAyZGIxMWMzZDIwYmU1NGQyMThjN2M0NGY4ZGRiCityZ2I4ICAgICAgICAgICAgICAgIGM5MGZlYjMwYzNjOTM5MWVmNWY0NzAyMDlkN2I3YTE1CityZ2JhICAgICAgICAgICAgICAgIDRkNzZhOTU0MjE0Mzc1MmE0YWMzMGY4MmY4OGY2OGYxCityZ2JhNjRiZSAgICAgICAgICAgIGE2MDA0MTIxN2Y0YzBjZDc5NmQxOWQzOTQwYTEyYTQxCityZ2JhNjRsZSAgICAgICAgICAgIGFkNDcxOTc3NzQ4NTg4NThhZTdiMGMxNzdkZmZhNDU5Cit4eXoxMmJlICAgICAgICAgICAgIDY4ZTVjYmE2NDBmNmU0ZWY3MmRmZjk1MGU4OGI1MzQyCit4eXoxMmxlICAgICAgICAgICAgIDhiNmI2YTZkYjRkNzU2MWU4MGRiODhjY2FlY2NlN2E5Cit5YTggICAgICAgICAgICAgICAgIGQ0YjdhNjJmODA2ODFmYTQ0Yzk3N2ZmM2E2NGY0Y2U0Cit5dXY0MTBwICAgICAgICAgICAgIDRjMDE0MzQyOWVkZDMwYWEwMTQ5MzQ0N2M5MDEzMmVhCit5dXY0MjBwICAgICAgICAgICAgIDJmYTViMjIwMWM3NTAzNDIwNmNjMjBlMmM2MTM0YWVkCit5dXY0MjBwMTBiZSAgICAgICAgIDA5MzE2NjBmOTMwZDliZThhZWE5ZDBjNzZiNDA2MDU1Cit5dXY0MjBwMTBsZSAgICAgICAgIDljZTEyYjE2OGM0OWRiODcxODM2Yzk3OWI1MjZjMWYxCit5dXY0MjBwMTJiZSAgICAgICAgIDczZDZiZTQyMzBiNmY0ZTRlMjY5OTc3YWZhYjU2MzIzCit5dXY0MjBwMTJsZSAgICAgICAgIDY5Mzg4MTVjOGFjZDY5MDEzODUwNmNiYjVmMDA1ZmI4Cit5dXY0MjBwMTRiZSAgICAgICAgIGJmNzZhODA1YjljMmY5ODA4YzczNDkyZDNiOGRhMjY4Cit5dXY0MjBwMTRsZSAgICAgICAgIDVkZjQ3NDgzYjg5ZmZlNmVmNGJiZjE0MDU4ZDdkM2IzCit5dXY0MjBwMTZiZSAgICAgICAgIDNhNjQxMzI2ODE2NTZiZTZkYjYzNWY0ZTZhMjgyZGM5Cit5dXY0MjBwMTZsZSAgICAgICAgIGM3N2E4MWU0N2QxNjkwYTMzODY5M2VjNmYzMjNlZjFlCit5dXY0MjBwOWJlICAgICAgICAgIDIzMDdjYjdmMzI0ZGYyOTljNDgyOWIxMWNiMGU2YmM3Cit5dXY0MjBwOWxlICAgICAgICAgIGM3MzVjM2M4NDI0YzcwZDgyMmFiNGExZmUxZjUwNGUyCit5dXY0NDRwICAgICAgICAgICAgIGViNzU1OTc3Y2E0NjRiYWFjNWYwMzc3MTg1ODA4MGFlCit5dXY0NDRwMTBiZSAgICAgICAgIDg2NmI1OWEyM2RmZjNkYzFjYjZiZjdiZDdkYTI2ZGE0Cit5dXY0NDRwMTBsZSAgICAgICAgIDQxN2Q2MmYxNWFiZjQ3NzdjNGVjNWUwZDAwNzk2YTllCit5dXY0NDRwMTJiZSAgICAgICAgIGMxZGExMTBmMGVlODk4ZmJjZDRiNDVhZmI1YWVkNThiCit5dXY0NDRwMTJsZSAgICAgICAgIGRjMThiZGRkN2I2YmI5ZmRiMmUwYzdlNzQ3NjM3NWZhCit5dXY0NDRwMTRiZSAgICAgICAgIDJmMTgxZmEzNDAzZTc5MTFiMjMzZDNkOTc2YWJlYTczCit5dXY0NDRwMTRsZSAgICAgICAgIGFjNzE4MzQzODc4Nzg2YTI1YjlhNTA5MjRmOWFhYmNhCit5dXY0NDRwMTZiZSAgICAgICAgIDEyODIxNGVmZWY2ZmZmZTMyOTNkYjUxM2FlNzAwZDRhCit5dXY0NDRwMTZsZSAgICAgICAgIGE4YjY2MTMwOTRiOGQyYjI3NWUyZTRiYzQ1MTJjOWU0Cit5dXY0NDRwOWJlICAgICAgICAgIGVhZTUyOWRkMWNkYjdmNTEyYWUyNjc0MzM0YzFlZjA4Cit5dXY0NDRwOWxlICAgICAgICAgIDA2ZmZjYWNkZDAzZjY0NTc2MTRjMzUyYTRjY2I3NjQyCit5dXZhNDIwcCAgICAgICAgICAgIDA1OGQwMGQ5NTY0YmU4MjdlNWRiNmNlMmI4YjJkYmI1Cit5dXZhNDIwcDEwYmUgICAgICAgIDMzMzIwOWQxMTkxNjE2MWE2NWM2NDUzZDJiZjQzNWMyCit5dXZhNDIwcDEwbGUgICAgICAgIDRiN2VhNWI1OWE3MTJmMWY1OWNkMzk0YjNiNDBmZjY5Cit5dXZhNDIwcDE2YmUgICAgICAgIDU5ODRjN2Y0ZDE0ZTRjZjBlNTExY2IwYWE2YzUzMDg5Cit5dXZhNDIwcDE2bGUgICAgICAgIDM0ZTI5ZmM0YTIyYTBhYjFlYTAxNjQxZDBkZjJhYzg2Cit5dXZhNDIwcDliZSAgICAgICAgIDQ1ZWE4MDg4OTU3NWIzMWNjY2M4M2E0ZDE2NTU1NDk3Cit5dXZhNDIwcDlsZSAgICAgICAgIDZlNWNiM2U3NjFhOWM0NWUyNjM3MDMwN2M0OWY4ODMxCit5dXZhNDQ0cCAgICAgICAgICAgIDRmOWU2NDlmYmMyYzBjOTExNzhkMTU3NmU0NjJiYjMxCit5dXZhNDQ0cDEwYmUgICAgICAgIDk0NTBmYmFjMzBiNWY5ZGE3NDE0Yzg5NTY5NTU5MWE5Cit5dXZhNDQ0cDEwbGUgICAgICAgIDg0YTkzNjM3YmYyYzdlNDk4MzgwYmVmZjliMWZjNTAzCit5dXZhNDQ0cDE2YmUgICAgICAgIDlmZDJmMDBlYTliZWY4ZTQ4ODIyOGJjMGI0N2IyOGNiCit5dXZhNDQ0cDE2bGUgICAgICAgIGFlOWZkOGQxYmFlYTBmODYyNmI5NjM4MTZkNjY3ZDJkCit5dXZhNDQ0cDliZSAgICAgICAgIDRjZTExYWU1Nzc4MGY3NGM3OGNkZDVjMDZiZTRiZGVkCit5dXZhNDQ0cDlsZSAgICAgICAgIDFiOWNjODVmZDZhYjBjN2UyNDA5MTVhOTllOThkMWMxCit5dXZqNDIwcCAgICAgICAgICAgIDk2MDNiOGRkNjRkYWVjNDFmMDUxNDE5Nzk4OWMyYjE5Cit5dXZqNDQ0cCAgICAgICAgICAgIDY2ZWM5YjMyMTlkZjllYjJjMTMxNWQyOTM2MDJhYjQyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcGl4Zm10cy12ZmxpcCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXZmbGlwCmluZGV4IGM3Y2MwYzcuLmQ0OWU1MDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXZmbGlwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1waXhmbXRzLXZmbGlwCkBAIC0xOCwyMyArMTgsNDEgQEAKIGJncmEgICAgICAgICAgICAgICAgMGFmNjNjYzJmZmQ2MWFmMjUyZGY5M2NjNzY3ZGUzNTgKIGJncmE2NGJlICAgICAgICAgICAgMzFhZjMzODMzZjZkOGYyZTRhNjI2ODMyODg3NzBhYTQKIGJncmE2NGxlICAgICAgICAgICAgNDVmZWI5Mzg2MzA1NTI4MjQ0N2QxZmY4OWM1MTU4YmYKLWdicmFwICAgICAgICAgICAgICAgZjI2OTQ0Yzc1Yjg4N2U5OWJiZjkxODNhNTljYWE2YWEKK2dicmFwICAgICAgICAgICAgICAgNDIxYzU2YTI1Zjg4ZDU4YjkzNjFmNWM3YmIzNjhlMjEKK2dicmFwMTBiZSAgICAgICAgICAgZTgxMzRiNzJhY2MwOTBiMDkzYjRkOWI0ZDQ3MDNjN2UKK2dicmFwMTBsZSAgICAgICAgICAgNDNiZGU3YmQ2YTY3NmM2YWMzM2RiY2M0YzcyNzYyZjMKK2dicmFwMTJiZSAgICAgICAgICAgMTZhM2QxMDViYTg1MmE5ZmEyM2VhNTIzMmRiNTFiNDgKK2dicmFwMTJsZSAgICAgICAgICAgNmVmOGEzYWM0MTI5ZWMyM2MzNGFlYzE0YWM0MWYyNDkKK2dicmFwMTZiZSAgICAgICAgICAgNzBiMDIwYjZiOWUxODk2YjcyZjg5MGRlMzU3MGZmZGEKK2dicmFwMTZsZSAgICAgICAgICAgZTBjZjM0MWNkYmFmMWY1YzQwMDE2ZjE4MWJjOWQ3ZDQKIGdicnAgICAgICAgICAgICAgICAgNDEzYjBmNmVhNTE1ODhkNGJlNWYwYzc2ZDQzZDg3OTYKLWdicnAxMGJlICAgICAgICAgICAgYzViM2RjMzA2MDBhZGFkNjZjOGNiNGVkYzNjZmNkMWQKLWdicnAxMGxlICAgICAgICAgICAgNTAyNjQyNGQ0YjM1MmQyNjdiNzRjY2IyNDE5ZmRlN2YKLWdicnAxMmJlICAgICAgICAgICAgNmM0NmU1ZDA3MmI5YzYxNTE1ZGQ3Y2FhZDYwYTEyN2UKLWdicnAxMmxlICAgICAgICAgICAgNTczYjI2ZTM4NWUxZWUwZmZiYzc0ODY4MzAxMzE0ZDYKLWdicnAxNGJlICAgICAgICAgICAgNTIyZmM0MWIzOTg3MTVlMDhhODk1YmMzYzNmNTU3NDIKLWdicnAxNGxlICAgICAgICAgICAgMzI1NjE1MTBlYjNkOWMzNTFiMThiMzViNjQ0YjczMWQKLWdicnA5YmUgICAgICAgICAgICAgNmFjN2M3OWE0YzA4OWI5MzkxMmJjZjBhYmI0ZDQxOGQKLWdicnA5bGUgICAgICAgICAgICAgY2ZmMjk2MzQ2ZDkzZTQzMGNiYzBhY2ZiYzkxNDgyYWIKK2dicnAxMGJlICAgICAgICAgICAgZDAyYmQ1MGRiODMyMTM2Njc4MDhmNWJhY2VmZTY2N2MKK2dicnAxMGxlICAgICAgICAgICAgMmQ0YTVlYmM3NzNmZmMzZDg1N2E2ZWYyNGFmYmUxMGUKK2dicnAxMmJlICAgICAgICAgICAgYTY2OGI3ZGJhNjg4MTc3MzY1MDEzODZmZmU5ZjNhZGMKK2dicnAxMmxlICAgICAgICAgICAgMjk5Njk1MDE2YzIyYTQ5NDdkOTRiMTZmMDk3NTUzNmIKK2dicnAxNGJlICAgICAgICAgICAgZWVlYmFjZmIxOWM5NzBkZDc2YWQwNDRlZjg1ZThmZTUKK2dicnAxNGxlICAgICAgICAgICAgNmU5M2I4NzA0N2U0MzM5OTUxMTFlYjUzOTc3NTFjM2YKK2dicnAxNmJlICAgICAgICAgICAgM2ZlZjg3ZmU2N2JmMWZkMGUyZjUwNTZkYzBkYjJlZjQKK2dicnAxNmxlICAgICAgICAgICAgZjNiMmI3NmZlNzA3Zjc3ZWIxMzc2NjQwNzU5ZjUxNjgKK2dicnA5YmUgICAgICAgICAgICAgOTljNjk0ZGQ0N2QxMmFlNDhmYzhmNDdhMGM0MTAzMzMKK2dicnA5bGUgICAgICAgICAgICAgMjZlMTAzYTRhYjk5ZmIzZjU4NjY3ZGY0OTA5OTdhMzYKIGdyYXkgICAgICAgICAgICAgICAgNDE4MTE0MjJkNTgxOWVkNjkzODkzNTcyOTQzODRjMTAKK2dyYXkxMGJlICAgICAgICAgICAgNTI3MTBiM2FiM2NjZjYxMDFkMjgxMDlmNThjZDQ4YzQKK2dyYXkxMGxlICAgICAgICAgICAgOWM0MzJhMTYzZjBjZmU5ZWUyYTRiNzJhZThhN2MzMDcKK2dyYXkxMmJlICAgICAgICAgICAgNzQyM2NlOGE3N2ZiYzQwYzVkNDc3NmViMjhmZWM2MGEKK2dyYXkxMmxlICAgICAgICAgICAgODA4MTU4NjMzNTU5ZDdkZWViYzdkYWMyZDc5ZTg4ZjgKIGdyYXkxNmJlICAgICAgICAgICAgMjlmMjRiYTdjYjBmYzRmZDJhZTc4OTYzZDAwOGY2ZTYKIGdyYXkxNmxlICAgICAgICAgICAgYTM3ZTljNGVhNzZlOGVlZGRjMmFmOGY2MDBiYTJjMTAKK2dyYXk5YmUgICAgICAgICAgICAgZGRhMTFkNGZmZDYyYjQxNDAxMmZmYzQ2NjdmYjQ5NzEKK2dyYXk5bGUgICAgICAgICAgICAgMTU5YmY2NDgyZDIxN2IyYjgyNzZlYjIyMTZjZDdhMDkKIG1vbm9iICAgICAgICAgICAgICAgNzgxMGM0ODU3ODIyY2NmYzg0NGQ3OGY1ZTgwMzI2OWEKIG1vbm93ICAgICAgICAgICAgICAgOTBhOTQ3YmZjZDVmMjI2MWU4M2I1NzdmNDhlYzU3YjEKIG52MTIgICAgICAgICAgICAgICAgMjYxZWJlNTg1YWUyYWE0ZTcwZDM5YTEwYzE2NzkyOTQKIG52MjEgICAgICAgICAgICAgICAgMjkwOWZlYWNkMjdiZWJiMDgwYzhlMGZhNDE3OTUyNjkKK3AwMTBiZSAgICAgICAgICAgICAgMDZlOTM1NGI2ZTBlMzhiYTQxNzM2MzUyY2VkYzBiZDUKK3AwMTBsZSAgICAgICAgICAgICAgZmQxOGQzMjJiZmZiZjU4MTY5MDJjMTMxMDI4NzJlMjIKK3AwMTZiZSAgICAgICAgICAgICAgMDZlOTM1NGI2ZTBlMzhiYTQxNzM2MzUyY2VkYzBiZDUKK3AwMTZsZSAgICAgICAgICAgICAgZmQxOGQzMjJiZmZiZjU4MTY5MDJjMTMxMDI4NzJlMjIKIHBhbDggICAgICAgICAgICAgICAgNDUwYjAxNTVkMGYyZDU2MjhiZjk1YTQ0MmRiNWY4MTcKIHJnYjAgICAgICAgICAgICAgICAgNTZhN2VhNjk1NDFiY2QyN2JlZjZhNTYxNTc4NDcyMmIKIHJnYjI0ICAgICAgICAgICAgICAgMTk1ZTZkYWUxYzNhNDg4YjlkM2NlYjc1NjBkMjVkODUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wcCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1wcAppbmRleCBjMTMxMWJlLi41YzBlMjk5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcHAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXBwCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MGFmOGE4NzMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhZWI5OTg5NwogMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTUyMDY0LCAweDhmMzcxMmM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVmY21wLXBzbnItcmdiIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlZmNtcC1wc25yLXJnYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDZkYjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlZmNtcC1wc25yLXJnYgpAQCAtMCwwICsxLDQ1IEBACitmcmFtZTowICAgIHB0czowICAgICAgIHB0c190aW1lOjAKK2xhdmZpLnBzbnIubXNlLnI9MTM4MS44MAorbGF2ZmkucHNuci5wc25yLnI9MTYuNzMKK2xhdmZpLnBzbnIubXNlLmc9ODk2LjAwCitsYXZmaS5wc25yLnBzbnIuZz0xOC42MQorbGF2ZmkucHNuci5tc2UuYj0yNzcuMzgKK2xhdmZpLnBzbnIucHNuci5iPTIzLjcwCitsYXZmaS5wc25yLm1zZV9hdmc9ODUxLjczCitsYXZmaS5wc25yLnBzbnJfYXZnPTE4LjgzCitmcmFtZToxICAgIHB0czoxICAgICAgIHB0c190aW1lOjEKK2xhdmZpLnBzbnIubXNlLnI9MTM4MC4zNworbGF2ZmkucHNuci5wc25yLnI9MTYuNzMKK2xhdmZpLnBzbnIubXNlLmc9OTc1LjkxCitsYXZmaS5wc25yLnBzbnIuZz0xOC4yNAorbGF2ZmkucHNuci5tc2UuYj00MzUuNzIKK2xhdmZpLnBzbnIucHNuci5iPTIxLjc0CitsYXZmaS5wc25yLm1zZV9hdmc9OTMwLjY3CitsYXZmaS5wc25yLnBzbnJfYXZnPTE4LjQ0CitmcmFtZToyICAgIHB0czoyICAgICAgIHB0c190aW1lOjIKK2xhdmZpLnBzbnIubXNlLnI9MTQwMy4yMAorbGF2ZmkucHNuci5wc25yLnI9MTYuNjYKK2xhdmZpLnBzbnIubXNlLmc9OTU0LjA1CitsYXZmaS5wc25yLnBzbnIuZz0xOC4zNAorbGF2ZmkucHNuci5tc2UuYj00OTQuMjIKK2xhdmZpLnBzbnIucHNuci5iPTIxLjE5CitsYXZmaS5wc25yLm1zZV9hdmc9OTUwLjQ5CitsYXZmaS5wc25yLnBzbnJfYXZnPTE4LjM1CitmcmFtZTozICAgIHB0czozICAgICAgIHB0c190aW1lOjMKK2xhdmZpLnBzbnIubXNlLnI9MTQ1Mi44MAorbGF2ZmkucHNuci5wc25yLnI9MTYuNTEKK2xhdmZpLnBzbnIubXNlLmc9MTAwMS4wMgorbGF2ZmkucHNuci5wc25yLmc9MTguMTMKK2xhdmZpLnBzbnIubXNlLmI9NTU3LjM5CitsYXZmaS5wc25yLnBzbnIuYj0yMC42NworbGF2ZmkucHNuci5tc2VfYXZnPTEwMDMuNzQKK2xhdmZpLnBzbnIucHNucl9hdmc9MTguMTEKK2ZyYW1lOjQgICAgcHRzOjQgICAgICAgcHRzX3RpbWU6NAorbGF2ZmkucHNuci5tc2Uucj0xNDAxLjI1CitsYXZmaS5wc25yLnBzbnIucj0xNi42NworbGF2ZmkucHNuci5tc2UuZz0xMDA5LjgwCitsYXZmaS5wc25yLnBzbnIuZz0xOC4wOQorbGF2ZmkucHNuci5tc2UuYj02MDIuNDIKK2xhdmZpLnBzbnIucHNuci5iPTIwLjMzCitsYXZmaS5wc25yLm1zZV9hdmc9MTAwNC40OQorbGF2ZmkucHNuci5wc25yX2F2Zz0xOC4xMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlZmNtcC1wc25yLXl1diBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZWZjbXAtcHNuci15dXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2MzRlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZWZjbXAtcHNuci15dXYKQEAgLTAsMCArMSw0NSBAQAorZnJhbWU6MCAgICBwdHM6MCAgICAgICBwdHNfdGltZTowCitsYXZmaS5wc25yLm1zZS55PTIyMi4wNgorbGF2ZmkucHNuci5wc25yLnk9MjQuNjcKK2xhdmZpLnBzbnIubXNlLnU9MzM5LjM4CitsYXZmaS5wc25yLnBzbnIudT0yMi44MgorbGF2ZmkucHNuci5tc2Uudj03MDUuNDEKK2xhdmZpLnBzbnIucHNuci52PTE5LjY1CitsYXZmaS5wc25yLm1zZV9hdmc9MzcyLjIzCitsYXZmaS5wc25yLnBzbnJfYXZnPTIyLjQyCitmcmFtZToxICAgIHB0czoxICAgICAgIHB0c190aW1lOjEKK2xhdmZpLnBzbnIubXNlLnk9MjM2Ljc0CitsYXZmaS5wc25yLnBzbnIueT0yNC4zOQorbGF2ZmkucHNuci5tc2UudT00MTYuMTcKK2xhdmZpLnBzbnIucHNuci51PTIxLjk0CitsYXZmaS5wc25yLm1zZS52PTcwNC45OAorbGF2ZmkucHNuci5wc25yLnY9MTkuNjUKK2xhdmZpLnBzbnIubXNlX2F2Zz0zOTguNjYKK2xhdmZpLnBzbnIucHNucl9hdmc9MjIuMTIKK2ZyYW1lOjIgICAgcHRzOjIgICAgICAgcHRzX3RpbWU6MgorbGF2ZmkucHNuci5tc2UueT0yMzQuNzkKK2xhdmZpLnBzbnIucHNuci55PTI0LjQyCitsYXZmaS5wc25yLm1zZS51PTQzNS43MgorbGF2ZmkucHNuci5wc25yLnU9MjEuNzQKK2xhdmZpLnBzbnIubXNlLnY9Njk5LjYwCitsYXZmaS5wc25yLnBzbnIudj0xOS42OAorbGF2ZmkucHNuci5tc2VfYXZnPTQwMS4yMworbGF2ZmkucHNuci5wc25yX2F2Zz0yMi4xMAorZnJhbWU6MyAgICBwdHM6MyAgICAgICBwdHNfdGltZTozCitsYXZmaS5wc25yLm1zZS55PTI1MC44OAorbGF2ZmkucHNuci5wc25yLnk9MjQuMTQKK2xhdmZpLnBzbnIubXNlLnU9NDc5LjczCitsYXZmaS5wc25yLnBzbnIudT0yMS4zMgorbGF2ZmkucHNuci5tc2Uudj03MDcuNTUKK2xhdmZpLnBzbnIucHNuci52PTE5LjYzCitsYXZmaS5wc25yLm1zZV9hdmc9NDIyLjI2CitsYXZmaS5wc25yLnBzbnJfYXZnPTIxLjg4CitmcmFtZTo0ICAgIHB0czo0ICAgICAgIHB0c190aW1lOjQKK2xhdmZpLnBzbnIubXNlLnk9MjQxLjA1CitsYXZmaS5wc25yLnBzbnIueT0yNC4zMQorbGF2ZmkucHNuci5tc2UudT01MDUuMDQKK2xhdmZpLnBzbnIucHNuci51PTIxLjEwCitsYXZmaS5wc25yLm1zZS52PTcxNi4wMAorbGF2ZmkucHNuci5wc25yLnY9MTkuNTgKK2xhdmZpLnBzbnIubXNlX2F2Zz00MjUuNzkKK2xhdmZpLnBzbnIucHNucl9hdmc9MjEuODQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZWZjbXAtc3NpbS1yZ2IgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVmY21wLXNzaW0tcmdiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjNjNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVmY21wLXNzaW0tcmdiCkBAIC0wLDAgKzEsMzAgQEAKK2ZyYW1lOjAgICAgcHRzOjAgICAgICAgcHRzX3RpbWU6MAorbGF2Zmkuc3NpbS5SPTAuNzIKK2xhdmZpLnNzaW0uRz0wLjc2CitsYXZmaS5zc2ltLkI9MC44OQorbGF2Zmkuc3NpbS5BbGw9MC43OQorbGF2Zmkuc3NpbS5kQj02Ljc0CitmcmFtZToxICAgIHB0czoxICAgICAgIHB0c190aW1lOjEKK2xhdmZpLnNzaW0uUj0wLjcwCitsYXZmaS5zc2ltLkc9MC43NAorbGF2Zmkuc3NpbS5CPTAuODUKK2xhdmZpLnNzaW0uQWxsPTAuNzcKK2xhdmZpLnNzaW0uZEI9Ni4zMQorZnJhbWU6MiAgICBwdHM6MiAgICAgICBwdHNfdGltZToyCitsYXZmaS5zc2ltLlI9MC43MQorbGF2Zmkuc3NpbS5HPTAuNzUKK2xhdmZpLnNzaW0uQj0wLjg0CitsYXZmaS5zc2ltLkFsbD0wLjc2CitsYXZmaS5zc2ltLmRCPTYuMjkKK2ZyYW1lOjMgICAgcHRzOjMgICAgICAgcHRzX3RpbWU6MworbGF2Zmkuc3NpbS5SPTAuNzAKK2xhdmZpLnNzaW0uRz0wLjczCitsYXZmaS5zc2ltLkI9MC44MworbGF2Zmkuc3NpbS5BbGw9MC43NgorbGF2Zmkuc3NpbS5kQj02LjExCitmcmFtZTo0ICAgIHB0czo0ICAgICAgIHB0c190aW1lOjQKK2xhdmZpLnNzaW0uUj0wLjcxCitsYXZmaS5zc2ltLkc9MC43NAorbGF2Zmkuc3NpbS5CPTAuODAKK2xhdmZpLnNzaW0uQWxsPTAuNzUKK2xhdmZpLnNzaW0uZEI9Ni4wNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlZmNtcC1zc2ltLXl1diBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZWZjbXAtc3NpbS15dXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4ZmZiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZWZjbXAtc3NpbS15dXYKQEAgLTAsMCArMSwzMCBAQAorZnJhbWU6MCAgICBwdHM6MCAgICAgICBwdHNfdGltZTowCitsYXZmaS5zc2ltLlk9MC44MAorbGF2Zmkuc3NpbS5VPTAuNzYKK2xhdmZpLnNzaW0uVj0wLjY5CitsYXZmaS5zc2ltLkFsbD0wLjc2CitsYXZmaS5zc2ltLmRCPTYuMjUKK2ZyYW1lOjEgICAgcHRzOjEgICAgICAgcHRzX3RpbWU6MQorbGF2Zmkuc3NpbS5ZPTAuODAKK2xhdmZpLnNzaW0uVT0wLjczCitsYXZmaS5zc2ltLlY9MC42OAorbGF2Zmkuc3NpbS5BbGw9MC43NQorbGF2Zmkuc3NpbS5kQj02LjA4CitmcmFtZToyICAgIHB0czoyICAgICAgIHB0c190aW1lOjIKK2xhdmZpLnNzaW0uWT0wLjgwCitsYXZmaS5zc2ltLlU9MC43MworbGF2Zmkuc3NpbS5WPTAuNjgKK2xhdmZpLnNzaW0uQWxsPTAuNzUKK2xhdmZpLnNzaW0uZEI9Ni4xMAorZnJhbWU6MyAgICBwdHM6MyAgICAgICBwdHNfdGltZTozCitsYXZmaS5zc2ltLlk9MC43OQorbGF2Zmkuc3NpbS5VPTAuNzIKK2xhdmZpLnNzaW0uVj0wLjY4CitsYXZmaS5zc2ltLkFsbD0wLjc1CitsYXZmaS5zc2ltLmRCPTUuOTQKK2ZyYW1lOjQgICAgcHRzOjQgICAgICAgcHRzX3RpbWU6NAorbGF2Zmkuc3NpbS5ZPTAuODAKK2xhdmZpLnNzaW0uVT0wLjcyCitsYXZmaS5zc2ltLlY9MC42OAorbGF2Zmkuc3NpbS5BbGw9MC43NQorbGF2Zmkuc3NpbS5kQj01Ljk3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTAwCmluZGV4IDExNWJjNDUuLmIzOGQzZjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTAwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTAwCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDViNzg5ZWYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTAxIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDEKaW5kZXggMGU3NDkyNy4uODEwOGFiNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDEKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0ZjIzNGU2NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMgppbmRleCBiZTdhNDE5Li41ZTEyZmRmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMgpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGMyZGQwNTM1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wMyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTAzCmluZGV4IDdmOThiZWMuLjYxYjY0ZjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTAzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTAzCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDlkYmMzOGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTA0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDQKaW5kZXggNTEwMzcxZC4uZDAyOTg5NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDQKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzMmM2YTY2ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wNQppbmRleCAxMWRkYzg5Li44ZmM1ZTI1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wNQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wNQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGMzYzY0ZWM2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wNiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTA2CmluZGV4IDhkM2QzMTguLmMwMDBmMDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTA2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTA2CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzhlODQwNjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTA3IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDcKaW5kZXggOWNlNzIxNy4uYzFhOTgzNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDcKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDcKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmYmRlZWM5NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMDggYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wOAppbmRleCAzYTA1ZDEwLi5mMzgyYzExIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wOAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wOApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDhmN2M4NWEyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0wOSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTA5CmluZGV4IDQ3ODdjMjIuLjNiYjYzZmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTA5CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTA5CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTYwOWE2NTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTEwIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTAKaW5kZXggN2Y3Njg1NC4uY2Y3MjYzOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTAKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0YWRiNDVkNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTEgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xMQppbmRleCBmMmMzYmUwLi5hYTg3OTNkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xMQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGQwZDg5MWZmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xMiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTEyCmluZGV4IGYyYzNiZTAuLmFhODc5M2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTEyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTEyCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDBkODkxZmYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTEzIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTMKaW5kZXggYjQ4MTkyOC4uYjcwYjlhMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTMKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwOWQ0ZGE4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTQgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNAppbmRleCA3MzU1YTYxLi4yMjExMzcyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDE0NWYzNGM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTE1CmluZGV4IDRjMTEwODguLmZhOWI5NGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTE1CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTE1CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTFlZWE5YjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTE2IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTYKaW5kZXggOWIxYWIyMy4uOWQ4MWUxNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTYKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4YmM4MDBlZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTcgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNwppbmRleCAyOWIzODNlLi40ZjRiNzU4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xNwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDcxOTViOWE3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0xOCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTE4CmluZGV4IDg0YWExZWMuLmE0NDIyYTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTE4CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjQ3YTA4MWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTE5IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTkKaW5kZXggODY4ODdhNi4uOWZmMzYxMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMTkKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5NDhkYzY1ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjAgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMAppbmRleCBkZWY4NmZlLi40NDljZWQ4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDY0YTM4OGVhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTIxCmluZGV4IDgzMmMxYjEuLjQ3M2I0ZmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTIxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTIxCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjdhZTE3ZjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTIyIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjIKaW5kZXggZjY4OWUzZi4uODE4NTc1MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjIKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlNTczNjY5OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJlbW92ZWdyYWluLW1vZGUtMjMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMwppbmRleCBiMGE1ODhiLi4xZTgxMDlkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yMwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDhkMTVhNDcyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItcmVtb3ZlZ3JhaW4tbW9kZS0yNCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTI0CmluZGV4IDI4NmNlMjIuLmIyNDYzMTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTI0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZW1vdmVncmFpbi1tb2RlLTI0CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NzdmNmQ0MzkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZ2J0ZXN0c3JjIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXJnYnRlc3RzcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4ZDM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1yZ2J0ZXN0c3JjCkBAIC0wLDAgKzEsMTAgQEAKKyN0YiAwOiAxLzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4OGMwMDE4YmIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMDQwMCwgMHg4YzAwMThiYgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMwNDAwLCAweDhjMDAxOGJiCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAyMzA0MDAsIDB4OGMwMDE4YmIKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDIzMDQwMCwgMHg4YzAwMThiYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNjYWxlMnJlZl9rZWVwX2FzcGVjdCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zY2FsZTJyZWZfa2VlcF9hc3BlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkMGRiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zY2FsZTJyZWZfa2VlcF9hc3BlY3QKQEAgLTAsMCArMSwxNCBAQAorI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCisjdmVyc2lvbjogMgorI2hhc2g6IE1ENQorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2MHgxMjAKKyNzYXIgMDogMS8xCisjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA1NzYwMCwgOWExOWMyM2RjM2E1NTc3ODY4NDBkMDA5ODYwNmQ1ZjEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA1NzYwMCwgZTZmYmRhYmFmMWJiMGQyOGFmYzY0OGVkNGQyN2U5ZjAKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA1NzYwMCwgNTI5MjRlZDBhNzUxMjE0YzUwZmIyZTdhNjI2YzhjYzUKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICA1NzYwMCwgNjdkNWZkNmVlNzE3OTNmMWNmODc5NGQxYzI3YWZkY2UKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgICA1NzYwMCwgODVmNzc3NWY3YjAxYWZkMzY5ZmM4OTE5ZGM3NTlkMzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zY2FsZWNocm9tYSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zY2FsZWNocm9tYQppbmRleCA5MzBmZmVmLi44NDI3NjljIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2NhbGVjaHJvbWEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNjYWxlY2hyb21hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZGNhYjc4M2EKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3OWM3ZjFmNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDNiODEwYWZiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2VsZWN0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNlbGVjdAppbmRleCA3YzMwMjkyLi5lMDU4NGU5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2VsZWN0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zZWxlY3QKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDQzMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3ZjVmNjU1MQogMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTUyMDY0LCAweDI4N2RhOGU2CiAwLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTkwMjhiYWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zZWxlY3QtYWx0ZXJuYXRlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNlbGVjdC1hbHRlcm5hdGUKaW5kZXggMDc3NjY5NC4uMDQ0MTg5ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNlbGVjdC1hbHRlcm5hdGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNlbGVjdC1hbHRlcm5hdGUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwNWI3ODllZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDlkZGRmNjRhCiAwLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGRlM2I2NTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zZXBhcmF0ZWZpZWxkcyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zZXBhcmF0ZWZpZWxkcwppbmRleCA0NmNiNDcwLi5mYjc1N2NjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2VwYXJhdGVmaWVsZHMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNlcGFyYXRlZmllbGRzCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvNTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNzYwMzIsIDB4OTkyNzZhYjkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA3NjAzMiwgMHgwYjA3MWYzNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDc2MDMyLCAweDhiMDNiMGU4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2V0cHRzIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNldHB0cwppbmRleCA1YjFkNzM0Li5lZmRjZjZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2V0cHRzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zZXRwdHMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwNWI3ODllZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDRiYjQ2NTUxCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OWRkZGY2NGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zaG93cGFsZXR0ZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zaG93cGFsZXR0ZQppbmRleCAxYTEzYzIzLi5jNWU2OTlhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2hvd3BhbGV0dGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNob3dwYWxldHRlCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQ4eDQ4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA5MjE2LCAweGM3MmUwMzRlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDkyMTYsIDB4YzcyZTAzNGUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAgOTIxNiwgMHhjNzJlMDM0ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNodWZmbGVmcmFtZXMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2h1ZmZsZWZyYW1lcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGQ5ODU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNodWZmbGVmcmFtZXMKQEAgLTAsMCArMSw1MyBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OWRkZGY2NGEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0YmI0NjU1MQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDA1Yjc4OWVmCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZWRiNWE4ZTYKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0ZGUzYjY1MgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTUyMDY0LCAweDJhODM4MGIwCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MWYxYjgwMjYKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1YWI1OGJhYworMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTUyMDY0LCAweGUyMGY3YzIzCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzBmNWZjZDUKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwMjM0NDc2MAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDkxMzczOTE1CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTJhNDhkZGQKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyNGVjYTIyMworMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTUyMDY0LCAweGM3MTFhZDYxCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjE1ZDM4YzgKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4ZTM2NGUxOAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTUyMDY0LCAweGE5MWMwZjA1CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmM3YmY1NzAKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDE1MjA2NCwgMHhmMzRkZGJmZgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGYyNWY2YWNjCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MmYyNzY4ZWYKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0NDVkMWQ1OQorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTUyMDY0LCAweDlkYzcyNDEyCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NDNkNzk2YjUKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5NTU3OTkzNgorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTUyMDY0LCAweGNlMDlmOWQ2CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmRjMzY1MGUKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3NmQyYTQ1NQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTUyMDY0LCAweGQ3ODBkODg3CiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDc2NmZjOGQKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlMjk1YzUxZQorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDBmOWQ2YWNhCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmE4ZDk0ZmIKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3ZmVhNDM3OAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTUyMDY0LCAweGUyMmY3YTMwCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MGIwNzU5NGMKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhNTBkMDFmOAorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTUyMDY0LCAweDRjOTczN2FiCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDRlNDllMDgKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkMjczNTkyNQorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTUyMDY0LCAweDg4NzM0ZWRkCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmQ1MDA0NzEKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1NzVjMjBlYworMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTUyMDY0LCAweDIwY2ViZmE5CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmU4OGM1YzIKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwOWVmNTNmZgorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTUyMDY0LCAweDYxYjQ3ZTczCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2h1ZmZsZXBsYW5lcy1kdXAtbHVtYSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zaHVmZmxlcGxhbmVzLWR1cC1sdW1hCmluZGV4IDUyMDQxZmEuLmRhMTExYzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zaHVmZmxlcGxhbmVzLWR1cC1sdW1hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zaHVmZmxlcGxhbmVzLWR1cC1sdW1hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0MDU1MDQsIDB4NzY2MjU4OTMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQwNTUwNCwgMHgzNDhmMGI5NwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDA1NTA0LCAweDNkZTAyMTQ5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2h1ZmZsZXBsYW5lcy1zd2FwdXYgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2h1ZmZsZXBsYW5lcy1zd2FwdXYKaW5kZXggOTVkYTE0OS4uOWZmMTc1YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNodWZmbGVwbGFuZXMtc3dhcHV2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zaHVmZmxlcGxhbmVzLXN3YXB1dgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDY4YjE4OWVmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NWNjNjY1NTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4OGYwZjY0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNpbGVuY2VyZW1vdmUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc2lsZW5jZXJlbW92ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTY0N2M2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNpbGVuY2VyZW1vdmUKQEAgLTAsMCArMSwzNiBAQAorI3RiIDA6IDEvMTkyMDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDE5MjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgICA0LCAweDAwMjAwMDA4CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICAgIDQsIDB4MDAxODAwMDYKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAgICAgNCwgMHgwMDFjMDAwNworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgICAgICA0LCAweDAzMjUwMjA4CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgICAgIDQsIDB4MDMyOTAyMDgKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgICAgICAgNCwgMHgwMzIzMDIwNworMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgICAgICA0LCAweDAzMWYwMjA2CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAgICAgIDQsIDB4MDMyNTAyMDgKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgICAgICAgNCwgMHgwMDIyMDAwOQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgICAgICA0LCAweDAwMjAwMDA5CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAgICAgIDQsIDB4MDMyNTAyMDgKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgICAgICAgNCwgMHgwMzM1MDIwYworMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgICAgICA0LCAweDAzNGIwMjExCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAgICAgIDQsIDB4MDM0YjAyMGYKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgICAgICAgNCwgMHgwMzQzMDIwZQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgICAgICA0LCAweDAwNDQwMDExCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAgICAgIDQsIDB4MDA0MDAwMTEKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgICAgICAgNCwgMHgwMDNhMDAwZgorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgICAgICA0LCAweDAzMzkwMjBkCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAgICAgIDQsIDB4MDAzYTAwMGYKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgICAgICAgNCwgMHgwMDM0MDAwZAorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgICAgICA0LCAweDAwMzQwMDBkCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAgICAgIDQsIDB4MDAzNjAwMGUKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgICAgICAgNCwgMHgwMzI5MDIwOAorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgICAgICA0LCAweDAzMjMwMjA0CiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAgICAgIDQsIDB4MDMxNzAyMDEKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgICAgICAgNCwgMHgwMzA3MDFmZAorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgICAgICA0LCAweDAyZmQwMWZjCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAgICAgIDQsIDB4MDAwNjAwMDIKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgICAgICAgNCwgMHgwMDBjMDAwNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXNtcHRlYmFycyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zbXB0ZWJhcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI0MmFlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zbXB0ZWJhcnMKQEAgLTAsMCArMSwxMCBAQAorI3RiIDA6IDEvNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgMHg4N2Q5MWRjNQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDg3ZDkxZGM1CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODdkOTFkYzUKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDExNTIwMCwgMHg4N2Q5MWRjNQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDg3ZDkxZGM1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc21wdGVoZGJhcnMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc21wdGVoZGJhcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ExMDVmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zbXB0ZWhkYmFycwpAQCAtMCwwICsxLDEwIEBACisjdGIgMDogMS81CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweDg1ZjQwNzA2CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4ODVmNDA3MDYKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIzMDQwMCwgMHg4NWY0MDcwNgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMjMwNDAwLCAweDg1ZjQwNzA2CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAyMzA0MDAsIDB4ODVmNDA3MDYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1hYnItbWwgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2QtYWJyLW1sCmluZGV4IGQwNTk3YTcuLjA3YzRjYjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1hYnItbWwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLWFici1tbApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc2MDMyLCAweGFkNGM4YTIyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNzYwMzIsIDB4MGRmZGM2YWQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA3NjAzMiwgMHg2MzQxZGE4MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLWFici1tciBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1hYnItbXIKaW5kZXggNDRhODA5MS4uNGU5ZWRlYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLWFici1tcgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2QtYWJyLW1yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNzYwMzIsIDB4NWQwZWZmYmUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA3NjAzMiwgMHg1YmI0OWU5NQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDc2MDMyLCAweGI2MzAxYmM3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2QtYWwtc2JzbCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1hbC1zYnNsCmluZGV4IGIxOWNiYjguLjZmNDI4MjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1hbC1zYnNsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1hbC1zYnNsCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDIvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcwNHgyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4YjljMGVmNDAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNDEyOCwgMHhmYTBiNzcwOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA0MTI4LCAweDE0MjU1ZjQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2QtYXItYWJsIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLWFyLWFibAppbmRleCAwMzU4MTk5Li42YjVhOTcxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2QtYXItYWJsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1hci1hYmwKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMi8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDU3NgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDMwNDEyOCwgMHg3YmFiZWY0MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzA0MTI4LCAweDI4N2Q3NzA5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzMDQxMjgsIDB4Mzg1ZjVmNDcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFibCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFibAppbmRleCAyNzNlNTIwLi5mMGVkZjM0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hYmwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWJsCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3Nng1NzYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MmY5Mzg5ZWYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxNmM2NjU1MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGQ3NzlmNjRhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hYnIgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hYnIKaW5kZXggYzgyN2UzYy4uMjc1NmQzOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWJyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFicgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4NTc2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGQxZjQ4OWVmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTRmZTY1NTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkMGQ5ZjY0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtYyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWMKaW5kZXggM2E1MTViOC4uZDg2YTIyNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtYworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YTk1MGQwZDkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2YTY5MzNjMwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDY2YTFkYTNhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21kIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtZAppbmRleCA3ZDE4OGQ0Li5hYjkxNWQ2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21kCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5NjJkMTM3MQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGU3ZGIxZDUxCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4M2JiMGM0MDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWcgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21nCmluZGV4IDNjYWU2ZjMuLjRhZDg1YjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWcKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtZwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ1YTZjOWE4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTdiYTY1ZmMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4OGFiOGZjYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtaCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFnbWgKaW5kZXggZTY4NTNhNi4uYjUwZjVhZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYWdtaAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hZ21oCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTY0NjQwNTcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1OGM0ZTI4MAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGFmNzZmZDI0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hbCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFsCmluZGV4IDVjOGE0MjkuLjFmOWFhYTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFsCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvNTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNzYwMzIsIDB4M2ZmMDY1MTUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA3NjAzMiwgMHgwMGQ4MjRkYQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDc2MDMyLCAweDY0YTMzYzY0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmJnIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJiZwppbmRleCAxZTg3MjcxLi5iNWU0OTk2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmJnCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFyYmcKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0ZDgzZWEzMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGE0YTNiZTViCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MjEwMzI5ODkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2MgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNjCmluZGV4IDU2ZjE3ZmQuLmJjZWNkODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDI3NjBiMTRhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4Y2Y5NGJhYWYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5YjVlMGUwYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjZCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2QKaW5kZXggZmQ5ODA2Yi4uYjVmMTFlMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNkCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YTAyNjE1NzAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2Nzg0MDNjOAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDEwODdlN2I2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNnIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjZwppbmRleCA2OGYzZjU0Li5mNWM1ODQ1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNnCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2cKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3MGY1YzlhOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDU2ZjE2NWZjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTU5ZjhmY2MKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2ggYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmNoCmluZGV4IDljMmZjZDEuLmQ2NzY3ZGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFyY2gKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJjaApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDgxYWI4ZGFkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ODIwZmQ5OGEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxY2NjNzEyYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJnZyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWFyZ2cKaW5kZXggOTFmYjA2NC4uODJmYTI3NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXJnZworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1hcmdnCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MmNmYmVhMzAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0YzQ0YmU1YgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDg3NDYyOTg5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJjIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliYwppbmRleCA3MmJkMTVjLi4xYzI0MjYyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJjCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWF5YmMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhZThjOTg1ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ4OWUxNTM1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDFhODNiMmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWF5YmQgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJkCmluZGV4IGQ5NjM0ODAuLjBhYTRlOGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWF5YmQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDdkYzk4NDY4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjcyZGI2YzkKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxNjMwZjUzZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliZyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWF5YmcKaW5kZXggNTNmN2Y3Mi4uZWJkOGJhMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliZworKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJnCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MWE1N2M5YTgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3ODkyNjVmYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDJiYjc4ZmNjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJoIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtYXliaAppbmRleCBjNmZkZDE0Li4xYjllZGViIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1heWJoCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLWF5YmgKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmM2VlMTgyZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDhiMWMyNWYxCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTc4ZGUyYWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLXNic3IgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvM2Qtc2JzbC1zYnNyCmluZGV4IGI0MTdhZTQuLjlhNWRhOTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zdGVyZW8zZC1zYnNsLXNic3IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlbzNkLXNic2wtc2JzcgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGJlMmY4OWVmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGM4MDY1NTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4MTY1ZjY0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlb3Rvb2xzIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXN0ZXJlb3Rvb2xzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYWNhZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3RlcmVvdG9vbHMKQEAgLTAsMCArMSwyNiBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0OGI2ZDI0MQorMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGUwYzRjYTlhCiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmRkOGUyNmMKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHgwNDdjY2UxYworMCwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDBiN2JjOGU0CiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZjBjOWQwMzcKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg2ZjIzYzgzZAorMCwgICAgICAgNzE2OCwgICAgICAgNzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweGU2ZDhjMDk5CiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2NhM2NiMjUKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHhlZmNlZDI1YgorMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDg2MTRjZGNiCiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDZkMWViM2YKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YWZiY2ZmZAorMCwgICAgICAxMzMxMiwgICAgICAxMzMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweDYzNzFkY2Q4CiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ZGQ4ZjkwZDkKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0NDhjMDhmNAorMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDRkOWIyZDI2CiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NzM1YTA1ZGEKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NjUxYmY0MAorMCwgICAgICAxOTQ1NiwgICAgICAxOTQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGJmOThjNGU3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3dhcHJlY3QgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItc3dhcHJlY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJkNjg2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci1zd2FwcmVjdApAQCAtMCwwICsxLDU1IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0YWFmODllZgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDFjNGU2NTUxCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MThiM2Y2NGEKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkZDc2ODBiMAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTUyMDY0LCAweDk4MzViNjUyCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDU2ZGE4ZTYKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzZDk0N2MyMworMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTUyMDY0LCAweGUyZTk4YmFjCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjdhYjgwMjYKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDE1MjA2NCwgMHgxZGNjMzkxNQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGY1NGQ0NzYwCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTM3ZGZjZDUKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjMThhYWQ2MQorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMTUyMDY0LCAweDg2MTJhMjIzCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDFmYzhkZGQKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4ODAzMGYwNQorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMTUyMDY0LCAweGQxN2Y0ZTE4CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NzVkODM4YzgKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxNDBlNmFjYworMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMTUyMDY0LCAweGFmODlkYmZmCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YzJiMWY1NzAKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4NGRjMjQxMgorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDg0OTUxZDU5CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZWI1YzY4ZWYKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1ZjRjZjlkNgorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMTUyMDY0LCAweGI0Njg5OTM2CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4OWM3MDk2YjUKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1MTQyZDg4NworMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMTUyMDY0LCAweGE0YjVhNDU1CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YzEwMDY1MGUKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4NmQ4NmFjYQorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGYxY2RjNTFlCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzRmOGZjOGQKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3ZWZmN2EzMAorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMTUyMDY0LCAweDEzYjQ0Mzc4CiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjQ2MTk0ZmIKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxMTE0MzdhYgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMTUyMDY0LCAweDQ0OGQwMWY4CiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTVlMTU5NGMKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDE1MjA2NCwgMHhkMTQ2NGVkZAorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMTUyMDY0LCAweGQ2MTY1OTI1CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTExZTllMDgKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2YzkxYmZhOQorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMTUyMDY0LCAweDhmZDIyMGVjCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmU0ODA0NzEKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkNzY4N2U3MworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMTUyMDY0LCAweDk3OWI1M2ZmCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZWI5OGM1YzIKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjMDRjYjQ4MworMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMTUyMDY0LCAweDM3MDlkOGVhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGJsZW5kIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRibGVuZAppbmRleCAzZmY2ODlhLi44MGZlYTg0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGJsZW5kCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10YmxlbmQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4ZTUwZTVlNQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDcxODdhOTVlCiAwLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YmQ3Mzg2M2UKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10ZWxlY2luZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10ZWxlY2luZQppbmRleCBiOGExM2E5Li42ZDM1NDVlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGVsZWNpbmUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRlbGVjaW5lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDQvMTI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDA1Yjc4OWVmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGJiNDY1NTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0MDY5MmM4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRlc3RzcmMyLXJnYjI0IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRlc3RzcmMyLXJnYjI0CmluZGV4IDJmZGZhMDAuLjIwN2RkZmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10ZXN0c3JjMi1yZ2IyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGVzdHNyYzItcmdiMjQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS83CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweDFjMDEyMzEyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4ZjdjZjRlODEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIzMDQwMCwgMHgyOWE0NWUxYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRlc3RzcmMyLXJnYmEgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGVzdHNyYzItcmdiYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVjZmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRlc3RzcmMyLXJnYmEKQEAgLTAsMCArMSw3NSBAQAorI3RiIDA6IDEvNworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDMwNzIwMCwgMHhhMmU2MDg5NworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzA3MjAwLCAweDY3ZjAzNDA2CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzMDcyMDAsIDB4NjgzODQzYTEKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDMwNzIwMCwgMHgyODVhNjgyYworMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMzA3MjAwLCAweDc0NDRhNzFlCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAzMDcyMDAsIDB4ZGU5ZTQwZDcKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDMwNzIwMCwgMHhjOGJiZDEzZAorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMzA3MjAwLCAweDZmMTc5NTU1CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAzMDcyMDAsIDB4Mjc0MjU0YzkKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDMwNzIwMCwgMHhiM2VlNTBkYgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMzA3MjAwLCAweDBlYmU0MGQ4CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YTgyMTY5MzAKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDMwNzIwMCwgMHg0Njc3NzhlMgorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMzA3MjAwLCAweGU2YjAyZTc0CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MThhNWE5MjMKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDMwNzIwMCwgMHgzZmYyMDg2YgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMzA3MjAwLCAweDcxZWJlNDY0CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NjcxY2Y2MDQKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDMwNzIwMCwgMHhlNTVkZmVlNworMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMzA3MjAwLCAweGM5YzQ5N2VhCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YjI2M2I3NjgKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDMwNzIwMCwgMHhkMjRlZTVhOAorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMzA3MjAwLCAweDliNzdhMmI3CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAzMDcyMDAsIDB4NzI5YzFiMDgKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDMwNzIwMCwgMHg3MjU1NzRkYgorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMzA3MjAwLCAweDQxM2NmNjYwCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAzMDcyMDAsIDB4ZThkYjg2YjAKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDMwNzIwMCwgMHhmNTM4YTM3OAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMzA3MjAwLCAweDg5NjM4NTM0CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MDg1ODYxOGIKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDMwNzIwMCwgMHg4YjVmOTYxYworMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMzA3MjAwLCAweGRkYmI1ZTQ4CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAzMDcyMDAsIDB4OTM1MmE2MTAKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDMwNzIwMCwgMHhjZjQ2NjYzNQorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMzA3MjAwLCAweGFmNjkwOTljCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MTg4MTExMTAKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDMwNzIwMCwgMHg3YjdkY2JkMQorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMzA3MjAwLCAweDI3ZTJmNTIzCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NTYzZGViZTEKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDMwNzIwMCwgMHg0OGM3MTc4NAorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMzA3MjAwLCAweDRiNjQ3NmI0CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YTdhMjFiMTMKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDMwNzIwMCwgMHhkMTRkODZjMAorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMzA3MjAwLCAweDEyYjFjYWVmCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAzMDcyMDAsIDB4YWU1OGFkN2UKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDMwNzIwMCwgMHg5MDhiYmI2NgorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMzA3MjAwLCAweGM2ZDRmNzdlCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAzMDcyMDAsIDB4MDhhOTBjZGYKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDMwNzIwMCwgMHg2YzM0NGQyMgorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMzA3MjAwLCAweGIzNTFhMzg4CiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAzMDcyMDAsIDB4ODIwOWJiZmYKKzAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgIDMwNzIwMCwgMHhmYTFlMzRlMAorMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgMzA3MjAwLCAweDc2ZGQ0YzQ4CiswLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YjAxYWIzMGYKKzAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgIDMwNzIwMCwgMHgyZTJlYzdjNQorMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgMzA3MjAwLCAweDYzODJmOTI5CiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAzMDcyMDAsIDB4YTVjZmNlMTQKKzAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgIDMwNzIwMCwgMHhkOTMzOTU0NgorMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgMzA3MjAwLCAweGY1YjlhODE1CiswLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICAzMDcyMDAsIDB4OTliYmM2MDIKKzAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgIDMwNzIwMCwgMHg2NDIyNDJlNgorMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgMzA3MjAwLCAweDk2MjZhZDA0CiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YmEyNzYwMzYKKzAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgIDMwNzIwMCwgMHgwNGJiMmUxOAorMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgMzA3MjAwLCAweDU3YmYwY2M2CiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAzMDcyMDAsIDB4Y2U0YzBmMDUKKzAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgIDMwNzIwMCwgMHg5ZmE3MTYzNAorMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgMzA3MjAwLCAweGIwNTI1YjdmCiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAzMDcyMDAsIDB4NWE2Yzc1MjMKKzAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgIDMwNzIwMCwgMHgxZGZjMTFmYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRlc3RzcmMyLXl1djQyMHAgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGVzdHNyYzIteXV2NDIwcAppbmRleCA4MDRlNWZhLi5hYWY5M2JhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGVzdHNyYzIteXV2NDIwcAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGVzdHNyYzIteXV2NDIwcApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mzc0NGIzZWQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgwYzEwNjJkNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDIwMWI5ZGIxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdGVzdHNyYzIteXV2NDQ0cCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10ZXN0c3JjMi15dXY0NDRwCmluZGV4IGM4Y2M3YzEuLjRiNjBlNmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10ZXN0c3JjMi15dXY0NDRwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10ZXN0c3JjMi15dXY0NDRwCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvNworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIzMDQwMCwgMHhiZmI5NjM2NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjMwNDAwLCAweGU2M2NhNmU5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMzA0MDAsIDB4YzZhY2NjYzgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmFuc3Bvc2UgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdHJhbnNwb3NlCmluZGV4IDBmMjM0MjMuLjJhNTE1MWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmFuc3Bvc2UKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyYW5zcG9zZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyODh4MzUyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGFiNTg4OWVmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ODk4YjY1NTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyMzFiZjY0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyZW1vbG8gYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdHJlbW9sbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmNmZjUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyZW1vbG8KQEAgLTAsMCArMSwyNiBAQAorI3RiIDA6IDEvNDQxMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg1ZDNiZTkwNworMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICA0MDk2LCAweGVhMTUxZmJlCiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTViYzE5ZjQKKzAsICAgICAgIDMwNzIsICAgICAgIDMwNzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg4NzA2ZWM2ZAorMCwgICAgICAgNDA5NiwgICAgICAgNDA5NiwgICAgIDEwMjQsICAgICA0MDk2LCAweDMzNGZmMjc1CiswLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4Y2QwZmY3YWQKKzAsICAgICAgIDYxNDQsICAgICAgIDYxNDQsICAgICAxMDI0LCAgICAgNDA5NiwgMHgyOWExZTljOQorMCwgICAgICAgNzE2OCwgICAgICAgNzE2OCwgICAgIDEwMjQsICAgICA0MDk2LCAweDFkNDFlNzdmCiswLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4OTllN2ZlMDcKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMDI0LCAgICAgNDA5NiwgMHg0YmJmMDljZQorMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgIDEwMjQsICAgICA0MDk2LCAweDk0NjAwMjM2CiswLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YzhhZjBjOWUKKzAsICAgICAgMTIyODgsICAgICAgMTIyODgsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3MGVlZjg4ZgorMCwgICAgICAxMzMxMiwgICAgICAxMzMxMiwgICAgIDEwMjQsICAgICA0MDk2LCAweGIyMjJlYzQ3CiswLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MTA3MWVlMjcKKzAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAxMDI0LCAgICAgNDA5NiwgMHg3YzM5MGJkMgorMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgIDEwMjQsICAgICA0MDk2LCAweDY4YmRmNjU1CiswLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4ODEwY2ZhY2IKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NjM5ZTQxZgorMCwgICAgICAxOTQ1NiwgICAgICAxOTQ1NiwgICAgIDEwMjQsICAgICA0MDk2LCAweGEzMGJlNzBmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdHJpbS1kdXJhdGlvbiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmltLWR1cmF0aW9uCmluZGV4IGRiNzRhZGQuLjliYTg2ZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmltLWR1cmF0aW9uCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmltLWR1cmF0aW9uCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1Mng0MzIKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjQ1YzQ3NjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmltLWZyYW1lIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyaW0tZnJhbWUKaW5kZXggMTc0OWFmZC4uNWRiZjZiNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyaW0tZnJhbWUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyaW0tZnJhbWUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDQzMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjZWIwODBiMAogMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ3M2RiNjUyCiAwLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4Mjg3ZGE4ZTYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmltLW1peGVkIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyaW0tbWl4ZWQKaW5kZXggNWUwMDNmNi4uNmIxYTk4YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyaW0tbWl4ZWQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyaW0tbWl4ZWQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDQzMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3ZjVmNjU1MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGM1NjZmNjRhCiAwLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4Y2ViMDgwYjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmltLXRpbWUgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdHJpbS10aW1lCmluZGV4IDJmODYwMjUuLmNlOWZhYzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci10cmltLXRpbWUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXRyaW0tdGltZQpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4NDMyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDZlNGY4OWVmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4N2Y1ZjY1NTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci11bnNoYXJwIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXVuc2hhcnAKaW5kZXggNjEzMTYzYi4uYzEyODI0MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXVuc2hhcnAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXVuc2hhcnAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1ODEwMDczNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDI5NjdlNDNkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmYwYzc4NmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9jb2xvciBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9jb2xvcgppbmRleCAzZDE4NGY2Li41Nzg3NWFiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdmVjdG9yc2NvcGVfY29sb3IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5NjYwOCwgMHgxODkwYWEzMAotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTk2NjA4LCAweGE0OTBhY2Y5Ci0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTY2MDgsIDB4NDA0YTc3NWQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI1NngyNTYKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTY2MDgsIDB4ZjZlM2FhMzAKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5NjYwOCwgMHg1NTg0YWNmOQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTk2NjA4LCAweGE4NjI3NzVkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdmVjdG9yc2NvcGVfY29sb3IyIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yMgppbmRleCBiZTY5NDQzLi4zYjJhZDkwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdmVjdG9yc2NvcGVfY29sb3IyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9jb2xvcjIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTk2NjA4LCAweDliZmNmYWU1Ci0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTY2MDgsIDB4MWFjNmZjYmYKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE5NjYwOCwgMHgzMWNiMTA4OAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2eDI1NgorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5NjYwOCwgMHg1ZTYyZmFlNQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTk2NjA4LCAweDRjMjdmY2JmCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTY2MDgsIDB4Yjc1MzEwODgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9jb2xvcjMgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdmVjdG9yc2NvcGVfY29sb3IzCmluZGV4IGYyOTdlZmQuLjRiYWVjY2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9jb2xvcjMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1Ci0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTY2MDgsIDB4NmU2OTg3NzAKLTAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5NjYwOCwgMHgzNzRkNzRhNwotMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTk2NjA4LCAweDNkODE3MTQzCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MjU2Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTk2NjA4LCAweDgzZGY4NzcwCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTY2MDgsIDB4YTZhNjc0YTcKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE5NjYwOCwgMHgxMTc1NzE0MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yNCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9jb2xvcjQKaW5kZXggNWVkZTQxZi4uMjFkNjc2MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXZlY3RvcnNjb3BlX2NvbG9yNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdmVjdG9yc2NvcGVfY29sb3I0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5NjYwOCwgMHg0ZDJlNTNjNAotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTk2NjA4LCAweDc5NWUxZGNjCi0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTY2MDgsIDB4ZTQyNjg4MDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI1NngyNTYKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTY2MDgsIDB4MzI2OTUzYzQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5NjYwOCwgMHg4NzBlMWRjYworMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTk2NjA4LCAweDg3Y2I4ODAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdmVjdG9yc2NvcGVfZ3JheSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9ncmF5CmluZGV4IGVkNDFjYzAuLmE4MWZiZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9ncmF5CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV9ncmF5CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5NjYwOCwgMHg4ZTQxNzFlMgotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTk2NjA4LCAweGYzZDM3MWUyCi0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTY2MDgsIDB4YjljYjcxZTIKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI1NngyNTYKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTY2MDgsIDB4NzliYTcxZTIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5NjYwOCwgMHg5MDkyNzFlMgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTk2NjA4LCAweDE0Mzk3MWUyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdmVjdG9yc2NvcGVfeHkgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdmVjdG9yc2NvcGVfeHkKaW5kZXggNmE0YjhmOC4uODNiNzE5NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXZlY3RvcnNjb3BlX3h5CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12ZWN0b3JzY29wZV94eQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1Ci0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTY2MDgsIDB4YTA5MzlhZjEKLTAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5NjYwOCwgMHg0MzY5OWFmMQotMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTk2NjA4LCAweDY5YTE5YWYxCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MjU2Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTk2NjA4LCAweGEyODk5YWYxCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTY2MDgsIDB4MjY0MDlhZjEKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE5NjYwOCwgMHhmNTIwOWFmMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXZzdGFjayBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12c3RhY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM5NjllNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci12c3RhY2sKQEAgLTAsMCArMSw1NSBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1Mng1NzYKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4MGI2YjEzZWQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNDEyOCwgMHg0MDZiY2FhMgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA0MTI4LCAweGIwZGVlY2EzCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAzMDQxMjgsIDB4NTc4MTAxNmYKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDMwNDEyOCwgMHhmZjZjNmNiMworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMzA0MTI4LCAweDE5NzE1MWRiCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAzMDQxMjgsIDB4Y2ExY2Y4NDYKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDMwNDEyOCwgMHgzOTZlMTc2NworMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMzA0MTI4LCAweDAyMTUwMDViCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZDlhZTcyMmEKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDMwNDEyOCwgMHhkMGY5OGVjMAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMzA0MTI4LCAweDFkMGVmOWI5CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZWYwMDVhZDEKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDMwNDEyOCwgMHgwMDU2NDQ1NQorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMzA0MTI4LCAweGUzZWIxYmM5CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZDk3MzFlMGEKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDMwNDEyOCwgMHhlYmYzOWMzMAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMzA0MTI4LCAweGFkYTE3MTkwCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MTdhZGQ1OTgKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDMwNDEyOCwgMHhjZGViYjgwZAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMzA0MTI4LCAweGIwZDVlYWVmCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZDBlZDQ4MjQKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDMwNDEyOCwgMHg3MzVjM2FiMgorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMzA0MTI4LCAweDQ2MmVkMWRlCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MjgyNWYzYmIKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDMwNDEyOCwgMHg4ZjU1MzI3YgorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMzA0MTI4LCAweDIxNmUyZDc5CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MmNkNGIxMWQKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDMwNDEyOCwgMHg5ZjIyNDhiOQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMzA0MTI4LCAweDczNTNjYTFjCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4NWU4OWQ1OTQKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDMwNDEyOCwgMHg4MTM2OGE0YgorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMzA0MTI4LCAweDFjNzZmOTI5CiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAzMDQxMjgsIDB4N2RkMmY0NjAKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDMwNDEyOCwgMHg4NWU0ODZmMAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMzA0MTI4LCAweDk1YWMyYTA1CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MGRhYTZmNTYKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDMwNDEyOCwgMHg2OThlMDNmMAorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMzA0MTI4LCAweDJjNjBiMjk4CiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAzMDQxMjgsIDB4NzRkNTlkYmEKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDMwNDEyOCwgMHhmMjhiYjI0YQorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMzA0MTI4LCAweDAxYmEzYzFmCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAzMDQxMjgsIDB4NjU2ZDdmNjEKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDMwNDEyOCwgMHg1MTYzNDFkOAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMzA0MTI4LCAweGEwNjAwOGUyCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MDY4NGZjZTYKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDMwNDEyOCwgMHg1ZTk5YTdmZQorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMzA0MTI4LCAweGU0MWQ4YjkzCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MGNlZTY5MTUKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDMwNDEyOCwgMHg4OWNkYjFlMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXczZmRpZi1jb21wbGV4IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXczZmRpZi1jb21wbGV4CmluZGV4IDMyZWFkYzkuLmNiZDhmMDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13M2ZkaWYtY29tcGxleAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdzNmZGlmLWNvbXBsZXgKQEAgLTEsMzEgKzEsMzUgQEAKICN0YiAwOiAxLzUwCi0wLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICA2MjIwODAsIDB4MjFkMjE0ODUKLTAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDYyMjA4MCwgMHg2MDBhNTQ2OAotMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDk1MjZmN2I4Ci0wLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICA2MjIwODAsIDB4OGIzZTY2MWYKLTAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmZjVjYjVhOQotMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgNjIyMDgwLCAweDdlNWU3MzBjCi0wLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICA2MjIwODAsIDB4ODUyMTlhYzYKLTAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyZjM0NjVhMAotMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgNjIyMDgwLCAweGRkYmY0ZGEwCi0wLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICA2MjIwODAsIDB4YzExNWQ0ZWUKLTAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3YThhOGQ3MgotMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgNjIyMDgwLCAweGJhZmNkOTczCi0wLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZDJjMTU2MDMKLTAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkNzIxNzg1NQotMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgNjIyMDgwLCAweDlhNTg0ZWNhCi0wLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICA2MjIwODAsIDB4OWYzZTFjNDAKLTAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDYyMjA4MCwgMHg2ZDAxZWZiNwotMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDllY2ZjY2UwCi0wLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICA2MjIwODAsIDB4YjM1NWZkN2UKLTAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDYyMjA4MCwgMHhjNzc4NDAyMQotMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDEzZmU0MTg3Ci0wLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZmEwM2I2MTMKLTAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyYzljY2ZjZAotMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgNjIyMDgwLCAweGNhZTZlNmM2Ci0wLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICA2MjIwODAsIDB4MTc3OTY4ZjkKLTAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmNzA4ZGUzNgotMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgNjIyMDgwLCAweDQ0OTE4NzBhCi0wLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICA2MjIwODAsIDB4Mzc3MDlmOTgKLTAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyM2U4ZDIyZgotMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgNjIyMDgwLCAweDI1Y2JhODc2CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NTc2Cisjc2FyIDA6IDE2LzE1CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZTFiMjE0NjIKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDYyMjA4MCwgMHgxMzYyNTM4ZAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDBmNTVmNzliCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZmRiMjY1ZjYKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyZjhlYjUzNAorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgNjIyMDgwLCAweDBkZTQ3MmIxCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICA2MjIwODAsIDB4M2U2OTlhNzgKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDYyMjA4MCwgMHg2NjM5NjUyNAorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgNjIyMDgwLCAweDE3MjQ0ZDQwCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICA2MjIwODAsIDB4MDRhNWQ1NTQKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDYyMjA4MCwgMHgwZTI3OGNkOQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgNjIyMDgwLCAweDdiNTNkOGRlCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZTUxYTU1OGUKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkNTgxNzdlNAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgNjIyMDgwLCAweDI3MGI0ZTFmCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICA2MjIwODAsIDB4M2ZiZjFiZGYKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDYyMjA4MCwgMHhiZmViZWU5ZAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDJjNmZjY2NmCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICA2MjIwODAsIDB4NGE1N2ZjYzIKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDYyMjA4MCwgMHgzM2I1M2Y1ZAorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDkzYmE0MDVkCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZjRkYmI1NGIKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmMjA1Y2U2OAorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgNjIyMDgwLCAweDM4M2ZlNWJjCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICA2MjIwODAsIDB4NGRkMDY5MDUKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhjOTI1ZGU1NworMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgNjIyMDgwLCAweDdjODc4NmU4CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICA2MjIwODAsIDB4NTUwYjlmNjAKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0MTYyZDFlOQorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgNjIyMDgwLCAweGY2MDlhODQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItdzNmZGlmLXNpbXBsZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13M2ZkaWYtc2ltcGxlCmluZGV4IDEzN2Q5ODkuLjA5YzBkN2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13M2ZkaWYtc2ltcGxlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13M2ZkaWYtc2ltcGxlCkBAIC0xLDMxICsxLDM1IEBACiAjdGIgMDogMS81MAotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNjIyMDgwLCAweGM3Mzc3NGY1Ci0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA2MjIwODAsIDB4NGVhM2E0MDAKLTAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDYyMjA4MCwgMHg5NTE1M2NkYQotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNjIyMDgwLCAweGVjMzliZjBiCi0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA2MjIwODAsIDB4OTRiNmY4MzYKLTAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhjMTQ1YzNlZQotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNjIyMDgwLCAweDRkNGNkZWUyCi0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA2MjIwODAsIDB4MTkzZWJjN2MKLTAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDYyMjA4MCwgMHhiZDcyOGZkOAotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNjIyMDgwLCAweGYwZjMyNTJmCi0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA2MjIwODAsIDB4YzAxMmQyMGEKLTAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDYyMjA4MCwgMHg3YjU4MzFiMgotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDQ2NGU5NjIyCi0wLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA2MjIwODAsIDB4NDZlM2M2YzAKLTAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhNmVjOTA4YgotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNjIyMDgwLCAweDZhMjU3NTk1Ci0wLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA2MjIwODAsIDB4YTY1NTJlY2MKLTAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkZWNkMWE5MQotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNjIyMDgwLCAweGZhYTUzZTcxCi0wLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA2MjIwODAsIDB4Yzk0YTk3MDcKLTAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDYyMjA4MCwgMHhiNTcyN2ZkNAotMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgNjIyMDgwLCAweDE0M2MwMThjCi0wLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICA2MjIwODAsIDB4OTJkMTEwYzkKLTAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0Zjc2MmZjMAotMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgNjIyMDgwLCAweDNkZDJhN2QyCi0wLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICA2MjIwODAsIDB4YTVkMDJkYzAKLTAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyMjIzY2UzZAotMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgNjIyMDgwLCAweGU0YTVmYzM2Ci0wLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICA2MjIwODAsIDB4ODM4NDE1OWUKLTAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDYyMjA4MCwgMHg5OTVlZmE1NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDU3NgorI3NhciAwOiAxNi8xNQorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDMzODg3NGU4CiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA2MjIwODAsIDB4MWE5ZGEzMmIKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyZWNjM2NkOQorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNjIyMDgwLCAweDA0NDFiZWVjCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA2MjIwODAsIDB4NGRlM2Y3YmEKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1OWE0YzM4OAorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNjIyMDgwLCAweDgzM2FkZTkyCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA2MjIwODAsIDB4NGM3OWJiZjMKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDYyMjA4MCwgMHhlMTk5OGY3NworMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNjIyMDgwLCAweGQwMGUyNTg2CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZTcxNmQxODUKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDYyMjA4MCwgMHgyNDc2MzEzNgorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNjIyMDgwLCAweGFlYWE5NWEyCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA2MjIwODAsIDB4OTJlZWM2NWEKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3Y2RlOTAwMAorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNjIyMDgwLCAweDk4ZTI3NTJjCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA2MjIwODAsIDB4NWZmZTJkYjYKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDYyMjA4MCwgMHgxZTkxMWE2NQorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNjIyMDgwLCAweDMwMmQzZGMyCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA2MjIwODAsIDB4YzEzOTk2NDcKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDYyMjA4MCwgMHhjNDQ3N2ViZgorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgNjIyMDgwLCAweDUwZTkwMGNhCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICA2MjIwODAsIDB4ODY3ZTBmN2EKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhMjQxMmViZQorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgNjIyMDgwLCAweGM3YTVhN2U2CiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICA2MjIwODAsIDB4YWE1ZDJkZTcKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDYyMjA4MCwgMHg5YmYwY2UzMQorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgNjIyMDgwLCAweGZiODhmYmY5CiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZTYzMjE1NzIKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1NTQxZmEzNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXdhdmVmb3JtX2NvbHVtbiBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13YXZlZm9ybV9jb2x1bW4KaW5kZXggMDIyMmYzMy4uZjM1ZmIyNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXdhdmVmb3JtX2NvbHVtbgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItd2F2ZWZvcm1fY29sdW1uCkBAIC0xLDUxICsxLDU1IEBACiAjdGIgMDogMS8yNQotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTM1MTY4LCAweGVmNjhjZGZhCi0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMzUxNjgsIDB4M2RiMGNkZmEKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDEzNTE2OCwgMHhkNWU2Y2RmYQotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTM1MTY4LCAweDdmNzFjZGZhCi0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxMzUxNjgsIDB4OWRmN2NkZmEKLTAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDEzNTE2OCwgMHhmZjQ4Y2RmYQotMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTM1MTY4LCAweGI0NmFjZGZhCi0wLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxMzUxNjgsIDB4NDg1YWNkZmEKLTAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDEzNTE2OCwgMHg4YmUyY2RmYQotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTM1MTY4LCAweDg2ZGJjZGZhCi0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAxMzUxNjgsIDB4ZGVjYWNkZmEKLTAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDEzNTE2OCwgMHgyOWEzY2RmYQotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMTM1MTY4LCAweDA0YzVjZGZhCi0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAxMzUxNjgsIDB4NWYyY2NkZmEKLTAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDEzNTE2OCwgMHg5NjgwY2RmYQotMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMTM1MTY4LCAweGUzOTdjZGZhCi0wLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAxMzUxNjgsIDB4YTQwZWNkZmEKLTAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDEzNTE2OCwgMHg1ZjM1Y2RmYQotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMTM1MTY4LCAweDMyZmJjZGZhCi0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAxMzUxNjgsIDB4OTgzZGNkZmEKLTAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDEzNTE2OCwgMHhiNjdkY2RmYQotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMTM1MTY4LCAweDVkNDFjZGZhCi0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAxMzUxNjgsIDB4MzVjZWNkZmEKLTAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDEzNTE2OCwgMHhlZTE3Y2RmYQotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMTM1MTY4LCAweDY1OTljZGZhCi0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAxMzUxNjgsIDB4OTE4YmNkZmEKLTAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDEzNTE2OCwgMHhiZDMwY2RmYQotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMTM1MTY4LCAweGMyYTZjZGZhCi0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAxMzUxNjgsIDB4Njg4ZmNkZmEKLTAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDEzNTE2OCwgMHhiMTFiY2RmYQotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgMTM1MTY4LCAweDgzMTZjZGZhCi0wLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAxMzUxNjgsIDB4ODA3M2NkZmEKLTAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDEzNTE2OCwgMHgzYmMxY2RmYQotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgMTM1MTY4LCAweGI1ODFjZGZhCi0wLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAxMzUxNjgsIDB4ZGY5MGNkZmEKLTAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDEzNTE2OCwgMHg2Mjk3Y2RmYQotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMTM1MTY4LCAweGU4ZThjZGZhCi0wLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAxMzUxNjgsIDB4YTIzOGNkZmEKLTAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDEzNTE2OCwgMHhkYzY4Y2RmYQotMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgMTM1MTY4LCAweDc1NDVjZGZhCi0wLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAxMzUxNjgsIDB4YTI5ZGNkZmEKLTAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDEzNTE2OCwgMHg4NzRiY2RmYQotMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMTM1MTY4LCAweDdkZmFjZGZhCi0wLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAxMzUxNjgsIDB4N2ZkZmNkZmEKLTAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDEzNTE2OCwgMHhlYmI0Y2RmYQotMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgMTM1MTY4LCAweDcyOTVjZGZhCi0wLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAxMzUxNjgsIDB4NTRlZWNkZmEKLTAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDEzNTE2OCwgMHgxOGM0Y2RmYQotMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgMTM1MTY4LCAweGFhOGZjZGZhCi0wLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAxMzUxNjgsIDB4OTllZGNkZmEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyNTYKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyNzAzMzYsIDB4M2FmM2NkNTQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDI3MDMzNiwgMHg4OTJjY2Q1NAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjcwMzM2LCAweDIxNzFjZDU0CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAyNzAzMzYsIDB4Y2FlZGNkNTQKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDI3MDMzNiwgMHhlOTczY2Q1NAorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMjcwMzM2LCAweDRhZDNjZDU0CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ZmZlNmNkNTQKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDI3MDMzNiwgMHg5M2Q2Y2Q1NAorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMjcwMzM2LCAweGQ3NWVjZDU0CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ZDI1N2NkNTQKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDI3MDMzNiwgMHgyYTU1Y2Q1NAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMjcwMzM2LCAweDc1MWZjZDU0CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAyNzAzMzYsIDB4NTA0MWNkNTQKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDI3MDMzNiwgMHhhYWE4Y2Q1NAorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMjcwMzM2LCAweGUxZmNjZDU0CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAyNzAzMzYsIDB4MmYyMmNkNTQKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDI3MDMzNiwgMHhlZjhhY2Q1NAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMjcwMzM2LCAweGFhYjFjZDU0CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAyNzAzMzYsIDB4N2U3N2NkNTQKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDI3MDMzNiwgMHhlM2I5Y2Q1NAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMjcwMzM2LCAweDAyMDhjZDU0CiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAyNzAzMzYsIDB4YThiZGNkNTQKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDI3MDMzNiwgMHg4MTRhY2Q1NAorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMjcwMzM2LCAweDM5YTJjZDU0CiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAyNzAzMzYsIDB4YjExNWNkNTQKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDI3MDMzNiwgMHhkZDA3Y2Q1NAorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMjcwMzM2LCAweDA4YmJjZDU0CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAyNzAzMzYsIDB4MGUzMWNkNTQKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDI3MDMzNiwgMHhiNDBiY2Q1NAorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMjcwMzM2LCAweGZjOTdjZDU0CiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAyNzAzMzYsIDB4Y2U5MmNkNTQKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDI3MDMzNiwgMHhjYmVmY2Q1NAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMjcwMzM2LCAweDg3M2RjZDU0CiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAyNzAzMzYsIDB4MDEwY2NkNTQKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDI3MDMzNiwgMHgyYjFiY2Q1NAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMjcwMzM2LCAweGFlMTNjZDU0CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAyNzAzMzYsIDB4MzQ3M2NkNTQKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDI3MDMzNiwgMHhlZGI0Y2Q1NAorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMjcwMzM2LCAweDI3ZjNjZDU0CiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAyNzAzMzYsIDB4YzBjMWNkNTQKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDI3MDMzNiwgMHhlZTE5Y2Q1NAorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMjcwMzM2LCAweGQyYzdjZDU0CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAyNzAzMzYsIDB4Yzk3NmNkNTQKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDI3MDMzNiwgMHhjYjViY2Q1NAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMjcwMzM2LCAweDM3M2ZjZDU0CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAyNzAzMzYsIDB4YmUxMWNkNTQKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDI3MDMzNiwgMHhhMDZhY2Q1NAorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMjcwMzM2LCAweDY0NDBjZDU0CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ZjYwYmNkNTQKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDI3MDMzNiwgMHhlNTY5Y2Q1NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXdhdmVmb3JtX2VudmVsb3BlIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXdhdmVmb3JtX2VudmVsb3BlCmluZGV4IGEwZDFmMzAuLjEzMTMwYzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13YXZlZm9ybV9lbnZlbG9wZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItd2F2ZWZvcm1fZW52ZWxvcGUKQEAgLTEsNTEgKzEsNTUgQEAKICN0YiAwOiAxLzI1Ci0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMzUxNjgsIDB4NjA3NDZkMGQKLTAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDEzNTE2OCwgMHgzYTE5Nzg4ZAotMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTM1MTY4LCAweDE4ZTBkMjQ3Ci0wLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMzUxNjgsIDB4OGI0YzE3N2YKLTAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDEzNTE2OCwgMHhjNGIzNGQyNgotMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTM1MTY4LCAweGJhMzY0NTU2Ci0wLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMzUxNjgsIDB4ZmNhYjczMTkKLTAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDEzNTE2OCwgMHgzNjNkNzdjZQotMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTM1MTY4LCAweDA0MzY3YjA3Ci0wLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMzUxNjgsIDB4NmU1YjU1YTAKLTAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDEzNTE2OCwgMHgzMzkxODQyMQotMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTM1MTY4LCAweDA1YmE3ZmYzCi0wLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxMzUxNjgsIDB4Y2FlMDlkNjIKLTAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDEzNTE2OCwgMHhjYTc4YzVjYgotMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTM1MTY4LCAweDE1NDJkYjUxCi0wLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxMzUxNjgsIDB4ZTAxM2YzMDcKLTAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDEzNTE2OCwgMHgwNjQwMDhkZAotMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTM1MTY4LCAweGViNzAxMGQ1Ci0wLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxMzUxNjgsIDB4MGNkMzEzZTEKLTAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDEzNTE2OCwgMHhhZjFiMTM1ZgotMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTM1MTY4LCAweDFiM2MwMmMwCi0wLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxMzUxNjgsIDB4NTA5NDA2NTgKLTAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDEzNTE2OCwgMHg4M2EyMDQ2ZQotMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTM1MTY4LCAweDFlZGYwYTU0Ci0wLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxMzUxNjgsIDB4MzcxNDEyMDYKLTAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDEzNTE2OCwgMHg3ODMyMTYzZQotMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTM1MTY4LCAweGQ0YmExM2RjCi0wLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxMzUxNjgsIDB4OWJhNzEwYTMKLTAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDEzNTE2OCwgMHg0MzRhMTA4ZgotMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTM1MTY4LCAweDg2YjAxMDcxCi0wLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxMzUxNjgsIDB4N2JkOTFjOGQKLTAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDEzNTE2OCwgMHg3YTRjMTc5YwotMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTM1MTY4LCAweDAyM2YxNWIyCi0wLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxMzUxNjgsIDB4ZTg5MDFiMjAKLTAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDEzNTE2OCwgMHg0OWQzMTU3YgotMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTM1MTY4LCAweGRjOTkwYWY5Ci0wLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxMzUxNjgsIDB4MWZmNzA3YTIKLTAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDEzNTE2OCwgMHhlNjYxMDAyMgotMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTM1MTY4LCAweDZmYzNmMTY4Ci0wLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxMzUxNjgsIDB4NzE5ODA5ZmYKLTAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDEzNTE2OCwgMHhkMWQ5MTQ0ZgotMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTM1MTY4LCAweDJmODAxNzk3Ci0wLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxMzUxNjgsIDB4MTExYzFlYWUKLTAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDEzNTE2OCwgMHgyM2MxMWM0YwotMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTM1MTY4LCAweDA3MzUxZDIzCi0wLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxMzUxNjgsIDB4MDRmMTE3M2QKLTAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDEzNTE2OCwgMHhiMmI3MWMxMAotMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTM1MTY4LCAweDU4YzAxYTUzCi0wLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxMzUxNjgsIDB4YWRkMTFiN2EKLTAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDEzNTE2OCwgMHg5MjQxMjNjMgorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI1NgorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI3MDMzNiwgMHgyNGE0NmM2NworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjcwMzM2LCAweDYyMjA3N2U3CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyNzAzMzYsIDB4Yjk2ZGQxYTEKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDI3MDMzNiwgMHgxODBiMTZkOQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMjcwMzM2LCAweDNkYjM0YzgwCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAyNzAzMzYsIDB4NDE3NDQ0YjAKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDI3MDMzNiwgMHgzYzAxNzI3MworMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMjcwMzM2LCAweDU3MmU3NzI4CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAyNzAzMzYsIDB4MThlMTdhNjEKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDI3MDMzNiwgMHg4ZDlmNTRmYQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMjcwMzM2LCAweDAxZTU4MzdiCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAyNzAzMzYsIDB4NzJhZTdmNGQKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDI3MDMzNiwgMHhiNmFiOWNiYworMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMjcwMzM2LCAweDI4YzVjNTI1CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAyNzAzMzYsIDB4NmQ4OWRhYWIKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDI3MDMzNiwgMHg3NjFmZjI2MQorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMjcwMzM2LCAweGFlMjAwODM3CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAyNzAzMzYsIDB4MDlmZTEwMmYKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDI3MDMzNiwgMHg0OTk5MTMzYgorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMjcwMzM2LCAweGJjMmQxMmI5CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAyNzAzMzYsIDB4MzVmODAyMWEKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDI3MDMzNiwgMHg1YTg2MDViMgorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMjcwMzM2LCAweGIyNTcwM2M4CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAyNzAzMzYsIDB4NjQxOTA5YWUKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDI3MDMzNiwgMHg4YTZlMTE2MAorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMjcwMzM2LCAweGNlMTgxNTk4CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAyNzAzMzYsIDB4YzBlYTEzMzYKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDI3MDMzNiwgMHg5NDFkMGZmZAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMjcwMzM2LCAweGY5NGEwZmU5CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAyNzAzMzYsIDB4NTkxZDBmY2IKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDI3MDMzNiwgMHg4NGZiMWJlNworMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMjcwMzM2LCAweGRhODAxNmY2CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAyNzAzMzYsIDB4ODczNjE1MGMKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDI3MDMzNiwgMHhmNTkzMWE3YQorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMjcwMzM2LCAweDU4MmIxNGQ1CiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ODVjZTBhNTMKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDI3MDMzNiwgMHhmMWMxMDZmYworMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMjcwMzM2LCAweGQwMjNmZjZkCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ZTM5OGYwYzIKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDI3MDMzNiwgMHg1YzkxMDk1OQorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMjcwMzM2LCAweGZiZWMxM2E5CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAyNzAzMzYsIDB4M2YxZTE2ZjEKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDI3MDMzNiwgMHg2YzFhMWUwOAorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMjcwMzM2LCAweDE1MDkxYmE2CiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ODI3MjFjN2QKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDI3MDMzNiwgMHg2OWE5MTY5NworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMjcwMzM2LCAweGRjYmIxYjZhCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAyNzAzMzYsIDB4N2NmYTE5YWQKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDI3MDMzNiwgMHg2NWJhMWFkNAorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMjcwMzM2LCAweGNhNjUyMzFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItd2F2ZWZvcm1fcm93IGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXdhdmVmb3JtX3JvdwppbmRleCA4YmM3ZjM2Li5iNDM2YmU1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItd2F2ZWZvcm1fcm93CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13YXZlZm9ybV9yb3cKQEAgLTEsNTEgKzEsNTUgQEAKICN0YiAwOiAxLzI1Ci0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTA1OTIsIDB4YTZkZWVkMGEKLTAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExMDU5MiwgMHhlNjU5ZWQwYQotMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTEwNTkyLCAweDFjYTVlZDBhCi0wLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMTA1OTIsIDB4YzJlOGVkMGEKLTAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExMDU5MiwgMHg3OGQ0ZWQwYQotMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTEwNTkyLCAweGJlMmVlZDBhCi0wLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMTA1OTIsIDB4NDgyZGVkMGEKLTAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExMDU5MiwgMHg5OTRlZWQwYQotMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTEwNTkyLCAweDkzYWVlZDBhCi0wLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMTA1OTIsIDB4YmJhOGVkMGEKLTAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExMDU5MiwgMHhlYjJiZWQwYQotMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTEwNTkyLCAweGU0MWNlZDBhCi0wLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxMTA1OTIsIDB4YjQwNGVkMGEKLTAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDExMDU5MiwgMHhiYWQxZWQwYQotMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTEwNTkyLCAweDk1MmFlZDBhCi0wLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxMTA1OTIsIDB4YmVkNGVkMGEKLTAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDExMDU5MiwgMHg1YzdkZWQwYQotMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTEwNTkyLCAweGJmZThlZDBhCi0wLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxMTA1OTIsIDB4YmI2YmVkMGEKLTAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDExMDU5MiwgMHg3NDczZWQwYQotMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTEwNTkyLCAweDc0ODllZDBhCi0wLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxMTA1OTIsIDB4ODhhNGVkMGEKLTAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDExMDU5MiwgMHhmZjBjZWQwYQotMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTEwNTkyLCAweDA0YjhlZDBhCi0wLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxMTA1OTIsIDB4ZWI4ZGVkMGEKLTAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDExMDU5MiwgMHhjNzUyZWQwYQotMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTEwNTkyLCAweDViMWJlZDBhCi0wLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxMTA1OTIsIDB4MWM5N2VkMGEKLTAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDExMDU5MiwgMHgwYTI4ZWQwYQotMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTEwNTkyLCAweDMwMmNlZDBhCi0wLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxMTA1OTIsIDB4MjgwYmVkMGEKLTAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDExMDU5MiwgMHhhYTMwZWQwYQotMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTEwNTkyLCAweGNlNTllZDBhCi0wLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxMTA1OTIsIDB4ZTVmNmVkMGEKLTAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDExMDU5MiwgMHg1YjM0ZWQwYQotMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTEwNTkyLCAweDFiOTdlZDBhCi0wLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxMTA1OTIsIDB4MzI4M2VkMGEKLTAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDExMDU5MiwgMHhlMGQxZWQwYQotMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTEwNTkyLCAweDAzZjFlZDBhCi0wLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxMTA1OTIsIDB4NTc0NGVkMGEKLTAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDExMDU5MiwgMHg4YmJmZWQwYQotMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTEwNTkyLCAweGRlOGZlZDBhCi0wLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxMTA1OTIsIDB4OTk3NWVkMGEKLTAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDExMDU5MiwgMHg3MmVkZWQwYQotMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTEwNTkyLCAweGUzZWZlZDBhCi0wLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxMTA1OTIsIDB4ZWU3ZmVkMGEKLTAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDExMDU5MiwgMHg0NGZmZWQwYQotMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTEwNTkyLCAweDkxZTZlZDBhCi0wLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxMTA1OTIsIDB4MGE1OGVkMGEKLTAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDExMDU5MiwgMHg2OGQyZWQwYQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2eDI4OAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIyMTE4NCwgMHgyYTExNDlhMworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjIxMTg0LCAweDY5OGM0OWEzCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMjExODQsIDB4OWZjOTQ5YTMKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDIyMTE4NCwgMHg0NjFiNDlhMworMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMjIxMTg0LCAweGZiZjg0OWEzCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAyMjExODQsIDB4NDE2MTQ5YTMKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDIyMTE4NCwgMHhjYjUxNDlhMworMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMjIxMTg0LCAweDFjODE0OWEzCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAyMjExODQsIDB4MTZlMTQ5YTMKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDIyMTE4NCwgMHgzZWRiNDlhMworMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMjIxMTg0LCAweDZlNWU0OWEzCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAyMjExODQsIDB4Njc0ZjQ5YTMKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDIyMTE4NCwgMHgzNzM3NDlhMworMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMjIxMTg0LCAweDNlMDQ0OWEzCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAyMjExODQsIDB4MTg1ZDQ5YTMKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDIyMTE4NCwgMHg0MjA3NDlhMworMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMjIxMTg0LCAweGRmYTE0OWEzCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAyMjExODQsIDB4NDMxYjQ5YTMKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDIyMTE4NCwgMHgzZTllNDlhMworMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMjIxMTg0LCAweGY3OTc0OWEzCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAyMjExODQsIDB4ZjdhZDQ5YTMKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDIyMTE4NCwgMHgwYmQ3NDlhMworMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMjIxMTg0LCAweDgyM2Y0OWEzCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAyMjExODQsIDB4ODdkYzQ5YTMKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDIyMTE4NCwgMHg2ZWMwNDlhMworMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMjIxMTg0LCAweDRhODU0OWEzCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAyMjExODQsIDB4ZGUzZjQ5YTMKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDIyMTE4NCwgMHg5ZmJiNDlhMworMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMjIxMTg0LCAweDhkNGM0OWEzCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAyMjExODQsIDB4YjM1MDQ5YTMKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDIyMTE4NCwgMHhhYjJmNDlhMworMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMjIxMTg0LCAweDJkNjM0OWEzCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAyMjExODQsIDB4NTE4YzQ5YTMKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDIyMTE4NCwgMHg2OTI5NDlhMworMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMjIxMTg0LCAweGRlNTg0OWEzCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAyMjExODQsIDB4OWViYjQ5YTMKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDIyMTE4NCwgMHhiNWE3NDlhMworMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMjIxMTg0LCAweDY0MDQ0OWEzCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAyMjExODQsIDB4ODcxNTQ5YTMKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDIyMTE4NCwgMHhkYTY4NDlhMworMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMjIxMTg0LCAweDBlZjI0OWEzCiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAyMjExODQsIDB4NjFjMjQ5YTMKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDIyMTE4NCwgMHgxY2E4NDlhMworMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMjIxMTg0LCAweGY2MTE0OWEzCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAyMjExODQsIDB4NjcyMjQ5YTMKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDIyMTE4NCwgMHg3MWIyNDlhMworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMjIxMTg0LCAweGM4MjM0OWEzCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAyMjExODQsIDB4MTUxOTQ5YTMKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDIyMTE4NCwgMHg4ZDdjNDlhMworMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMjIxMTg0LCAweGViZjY0OWEzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItd2F2ZWZvcm1fdXYgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXItd2F2ZWZvcm1fdXYKaW5kZXggOGMzZmM3MC4uOGNiM2JjOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXdhdmVmb3JtX3V2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13YXZlZm9ybV91dgpAQCAtMSw1MSArMSw1NSBAQAogI3RiIDA6IDEvMjUKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI3MDMzNiwgMHg3YmUwNjVhOAotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjcwMzM2LCAweGE0ZTU2NjIyCi0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyNzAzMzYsIDB4YWU0YTY2MmEKLTAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDI3MDMzNiwgMHgzNjdlNjY3OAotMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMjcwMzM2LCAweDk3MGY2NjdjCi0wLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ZGY3NTY1ZjYKLTAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDI3MDMzNiwgMHhjNGEzNjY1MgotMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMjcwMzM2LCAweDJmNDI2NjMwCi0wLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAyNzAzMzYsIDB4YzA5NTY2MmMKLTAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDI3MDMzNiwgMHg3NWZhNjYyNgotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMjcwMzM2LCAweDk1NjE2NTkyCi0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAyNzAzMzYsIDB4Nzg5MTY2MDgKLTAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDI3MDMzNiwgMHgxMThjNjViYwotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMjcwMzM2LCAweDc1NDQ2NjA0Ci0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ZTVmYjY2MTIKLTAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDI3MDMzNiwgMHgzYjhmNjYxOAotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMjcwMzM2LCAweGRlZWU2NjQ2Ci0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAyNzAzMzYsIDB4ZWRlNDY2MDYKLTAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDI3MDMzNiwgMHg2NDMzNjYwNgotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMjcwMzM2LCAweGZjNTA2NjNhCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAyNzAzMzYsIDB4ZTVmYzY2MGEKLTAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDI3MDMzNiwgMHg2ZWNiNjYxMgotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMjcwMzM2LCAweDA2YTQ2NjJhCi0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAyNzAzMzYsIDB4YzdiNjY2NTYKLTAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDI3MDMzNiwgMHgwMzNlNjYzNgotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMjcwMzM2LCAweGMxNGY2NjUwCi0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAyNzAzMzYsIDB4NzQ2MjY2MmMKLTAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDI3MDMzNiwgMHhmOGNiNjVlNAotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMjcwMzM2LCAweDYzNTE2NjVlCi0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAyNzAzMzYsIDB4NDRlNjY2NmUKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDI3MDMzNiwgMHgxZDVmNjYwZQotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMjcwMzM2LCAweGMyNDg2NjJlCi0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAyNzAzMzYsIDB4MzYyNTY2NDIKLTAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDI3MDMzNiwgMHhlNDQyNjU5OAotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMjcwMzM2LCAweGRlODE2NjVhCi0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAyNzAzMzYsIDB4YWVhYjY2MjIKLTAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDI3MDMzNiwgMHgxMzRlNjY2OAotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMjcwMzM2LCAweDZjNmU2NjVlCi0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAyNzAzMzYsIDB4NTAwYjY2NzAKLTAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDI3MDMzNiwgMHgyYzRjNjY0OAotMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMjcwMzM2LCAweGU0YWU2NjRjCi0wLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAyNzAzMzYsIDB4OWI3ZTY2NGMKLTAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDI3MDMzNiwgMHhmZWZiNjU3MAotMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMjcwMzM2LCAweDA0ZTk2NjAwCi0wLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAyNzAzMzYsIDB4Y2JiYTY2NzAKLTAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDI3MDMzNiwgMHg5Zjk2NjZhNgotMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMjcwMzM2LCAweDg1Yjc2NjQyCi0wLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAyNzAzMzYsIDB4MWEwZTY2N2MKLTAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDI3MDMzNiwgMHg5MmM5NjYyYQotMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMjcwMzM2LCAweDllZDc2NjgyCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4NTEyCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTQwNjcyLCAweDhhMjUyMWQ2CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1NDA2NzIsIDB4YjlhMzIxZDYKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU0MDY3MiwgMHgzMjU0MjFkNgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgNTQwNjcyLCAweGFmZWUyMWQyCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICA1NDA2NzIsIDB4MTcyMTIxZDYKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDU0MDY3MiwgMHgyNGQxMjFkNgorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgNTQwNjcyLCAweDdmZWMyMWQ2CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICA1NDA2NzIsIDB4YThhMDIxZDYKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDU0MDY3MiwgMHgyOWZkMjFkNgorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgNTQwNjcyLCAweDZkZmUyMWQ2CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICA1NDA2NzIsIDB4ZTM5ODIxZDYKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDU0MDY3MiwgMHg4M2Y1MjFkNgorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgNTQwNjcyLCAweDU3YWEyMWQ2CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICA1NDA2NzIsIDB4NjdiMjIxZDYKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDU0MDY3MiwgMHg1MzU4MjFkNgorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgNTQwNjcyLCAweGI4YWMyMWQ2CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICA1NDA2NzIsIDB4MjdmNjIxZDYKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDU0MDY3MiwgMHg3NzUyMjFkNgorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNTQwNjcyLCAweDhlNjYyMWQ2CiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA1NDA2NzIsIDB4NzRjOTIxZDYKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDU0MDY3MiwgMHgwNGNkMjFkNgorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNTQwNjcyLCAweGNjZDQyMWQ2CiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA1NDA2NzIsIDB4MzE3MjIxZDYKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDU0MDY3MiwgMHhkNzkzMjFkNgorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNTQwNjcyLCAweGEyYWMyMWQ2CiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA1NDA2NzIsIDB4N2YwYTIxZDYKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDU0MDY3MiwgMHg0ODM1MjFkNgorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNTQwNjcyLCAweGI2NTcyMWQ2CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA1NDA2NzIsIDB4Yjc3MDIxZDYKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDU0MDY3MiwgMHg5ZmQ1MjFkNgorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNTQwNjcyLCAweGI3MjEyMWQ2CiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA1NDA2NzIsIDB4NTQwMjIxZDYKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDU0MDY3MiwgMHhhMzQxMjFkNgorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNTQwNjcyLCAweGUwMTQyMWQ2CiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA1NDA2NzIsIDB4NmZjNzIxZDYKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDU0MDY3MiwgMHg3ZmE2MjFkNgorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNTQwNjcyLCAweGM0OGMyMWQ2CiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA1NDA2NzIsIDB4NDBmMDIxZDYKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDU0MDY3MiwgMHhkZjNmMjFkNgorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgNTQwNjcyLCAweGIwNDMyMWQ2CiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICA1NDA2NzIsIDB4MjIyODIxZDYKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDU0MDY3MiwgMHgyYTU1MjFkNgorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgNTQwNjcyLCAweDZhNDYyMWJlCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICA1NDA2NzIsIDB4ZWQ3ZjIxZDYKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDU0MDY3MiwgMHhiMTY1MjFkNgorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgNTQwNjcyLCAweDlmNTYyMWQ2CiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICA1NDA2NzIsIDB4MjA0MzIxZDYKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDU0MDY3MiwgMHhjMjZlMjFkNgorMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgNTQwNjcyLCAweDNlODMyMWQ2CiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICA1NDA2NzIsIDB4YWFlZTIxZDYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13ZWF2ZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci13ZWF2ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjhmYzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXdlYXZlCkBAIC0wLDAgKzEsMzAgQEAKKyN0YiAwOiAyLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4NTc2Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzA0MTI4LCAweDRmOTZlZjQwCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzMDQxMjgsIDB4YmQ4NTc3MDkKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDMwNDEyOCwgMHgzN2QwNWY0NworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMzA0MTI4LCAweDg2NzgwN2RlCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MTgzOGI5M2IKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDMwNDEyOCwgMHg5N2ZhNDQ0NAorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMzA0MTI4LCAweDU1ODU0ZjkzCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZTZkMzljZTIKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDMwNDEyOCwgMHg1MWVjODZlMAorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMzA0MTI4LCAweGNiNTM0NmRhCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAzMDQxMjgsIDB4YzVkZTE5OTEKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDMwNDEyOCwgMHg3MTE2ODY0OAorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMzA0MTI4LCAweDUwMGE5MzFiCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZWIzZTZmNGIKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDMwNDEyOCwgMHhmODYwMDk3MgorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMzA0MTI4LCAweDJkOGQyZmY3CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAzMDQxMjgsIDB4MTM2Njc2Y2MKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDMwNDEyOCwgMHhkNzNjZDg3MworMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMzA0MTI4LCAweGQxOTMzOWEzCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAzMDQxMjgsIDB4NjNlOGE4MjkKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDMwNDEyOCwgMHg0NWU2ZjcyZAorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMzA0MTI4LCAweDBhZTZlMDk1CiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAzMDQxMjgsIDB4ZDg5ZDgyZTQKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDMwNDEyOCwgMHg5YzA4MTlkMAorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMzA0MTI4LCAweDY1YTQ4ZDdjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteWFkaWYtbW9kZTAgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteWFkaWYtbW9kZTAKaW5kZXggNGQ0Mjg5MC4uYmU4MDdmOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXlhZGlmLW1vZGUwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci15YWRpZi1tb2RlMApAQCAtMSwzMSArMSwzNSBAQAogI3RiIDA6IDEvMjUKLTAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDYyMjA4MCwgMHg2MzMxY2FlZQotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgNjIyMDgwLCAweGE0NTllNjkwCi0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA2MjIwODAsIDB4NjQyOWM2NDgKLTAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhNDk4OTFjYQotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgNjIyMDgwLCAweDJhODg3NDA0Ci0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZThkNDk3MDUKLTAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDYyMjA4MCwgMHgxYjYyNzgzNQotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgNjIyMDgwLCAweDY4Njg1OGZkCi0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICA2MjIwODAsIDB4MjY3NTE3NGYKLTAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3ODQ3MGU3ZgotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNjIyMDgwLCAweGZmYjM2NmVjCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZDU3NWRhNzIKLTAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1ZmIyOTdmNwotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNjIyMDgwLCAweGJhYzc3Y2EwCi0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA2MjIwODAsIDB4MzI3NmVkNzIKLTAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyNjQwOTJiMgotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDIwYmExMDk0Ci0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA2MjIwODAsIDB4NzZjYzMxMzkKLTAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0NjlhNDkwMgotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDBlZDdiOGY1Ci0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZGM1MWFlYWMKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDYyMjA4MCwgMHhlZTA2YWEzNgotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNjIyMDgwLCAweDczNzI0MDVmCi0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA2MjIwODAsIDB4OWUwZWU3NzYKLTAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDYyMjA4MCwgMHgzOWU2ZDhjOQotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNjIyMDgwLCAweDUxZDlhYzlhCi0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA2MjIwODAsIDB4MmI2MzQ0MWQKLTAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1OGFmYmQ1ZQotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNjIyMDgwLCAweGI5NzJmNzE2Ci0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA2MjIwODAsIDB4NmE2ZGYxMjkKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMTYvMTUKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDYyMjA4MCwgMHg3N2MwY2E5MgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgNjIyMDgwLCAweGJlN2ZlNjQ2CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA2MjIwODAsIDB4NDM4NGM1ZGEKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyOTZiOTE2OAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgNjIyMDgwLCAweDk2ZDU3MzhlCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICA2MjIwODAsIDB4NzY5Yjk2ODEKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0NjFkNzc4ZAorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgNjIyMDgwLCAweGI4OGM1ODRiCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICA2MjIwODAsIDB4N2Q3YjE2MzUKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0OWM2MGRjMAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNjIyMDgwLCAweDQ5ODc2NWE0CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA2MjIwODAsIDB4MGNhZWQ4ZjkKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0MWQ4OTdkMworMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNjIyMDgwLCAweDdhZWI3YzkzCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA2MjIwODAsIDB4YThiY2VkNDAKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDYyMjA4MCwgMHgxMWRlOTI4YworMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDY0NzQxMDc1CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA2MjIwODAsIDB4MTYwZjMxMGUKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3MDJkNDg5YworMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNjIyMDgwLCAweGFmMmZiOGFhCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA2MjIwODAsIDB4NTc1YmFlMGYKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmZDY4YTk5MAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNjIyMDgwLCAweDhiNTEzZjY2CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA2MjIwODAsIDB4MGU2YWU2YzMKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDYyMjA4MCwgMHgzZDEyZDhhYgorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNjIyMDgwLCAweDQ1ZDBhYzgwCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA2MjIwODAsIDB4YjE4ZDQ0MjEKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyZTgxYmQzMgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNjIyMDgwLCAweDg1MmNmNmNmCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA2MjIwODAsIDB4YjA1NWYwZTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci15YWRpZi1tb2RlMSBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci15YWRpZi1tb2RlMQppbmRleCAwOGNkNTE4Li41Mzc0MWIwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteWFkaWYtbW9kZTEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXlhZGlmLW1vZGUxCkBAIC0xLDYwICsxLDY0IEBACiAjdGIgMDogMS81MAotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDYzMzFjYWVlCi0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA2MjIwODAsIDB4NjI1ZGE4ODMKLTAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhNDU5ZTY5MAotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNjIyMDgwLCAweGNlNWQ4OTFlCi0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA2MjIwODAsIDB4NjQyOWM2NDgKLTAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDYyMjA4MCwgMHg2MDhjYzBiYQotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNjIyMDgwLCAweGE0OTg5MWNhCi0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA2MjIwODAsIDB4OTcyMTk4N2YKLTAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyYTg4NzQwNAotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNjIyMDgwLCAweDYwZDcxZDQ3Ci0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZThkNDk3MDUKLTAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDYyMjA4MCwgMHg4MjFlMTNjYgotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDFiNjI3ODM1Ci0wLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA2MjIwODAsIDB4MTgwNmM1ZjQKLTAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDYyMjA4MCwgMHg2ODY4NThmZAotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNjIyMDgwLCAweGFiODY1NzczCi0wLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA2MjIwODAsIDB4MjY3NTE3NGYKLTAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0M2E2MWExNAotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNjIyMDgwLCAweDc4NDcwZTdmCi0wLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZWI4NzdiYzYKLTAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmZmIzNjZlYwotMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgNjIyMDgwLCAweGRhMDkwNmU3Ci0wLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZDU3NWRhNzIKLTAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyM2FlMjVhNAotMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgNjIyMDgwLCAweDVmYjI5N2Y3Ci0wLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICA2MjIwODAsIDB4OTliMzI5NzgKLTAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDYyMjA4MCwgMHhiYWM3N2NhMAotMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgNjIyMDgwLCAweGMxY2RjYmY5Ci0wLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICA2MjIwODAsIDB4MzI3NmVkNzIKLTAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0MDYxZjVhYgotMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgNjIyMDgwLCAweDI2NDA5MmIyCi0wLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICA2MjIwODAsIDB4YTRlMjAzOWUKLTAsICAgICAgICAgNTAsICAgICAgICAgNTAsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyMGJhMTA5NAotMCwgICAgICAgICA1MSwgICAgICAgICA1MSwgICAgICAgIDEsICAgNjIyMDgwLCAweDk4NGU5MDZlCi0wLCAgICAgICAgIDUyLCAgICAgICAgIDUyLCAgICAgICAgMSwgICA2MjIwODAsIDB4NzZjYzMxMzkKLTAsICAgICAgICAgNTMsICAgICAgICAgNTMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmNzBlMmNmNgotMCwgICAgICAgICA1NCwgICAgICAgICA1NCwgICAgICAgIDEsICAgNjIyMDgwLCAweDQ2OWE0OTAyCi0wLCAgICAgICAgIDU1LCAgICAgICAgIDU1LCAgICAgICAgMSwgICA2MjIwODAsIDB4MjM1MzEyZTYKLTAsICAgICAgICAgNTYsICAgICAgICAgNTYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgwZWQ3YjhmNQotMCwgICAgICAgICA1NywgICAgICAgICA1NywgICAgICAgIDEsICAgNjIyMDgwLCAweGQwMjY5Y2MzCi0wLCAgICAgICAgIDU4LCAgICAgICAgIDU4LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZGM1MWFlYWMKLTAsICAgICAgICAgNTksICAgICAgICAgNTksICAgICAgICAxLCAgIDYyMjA4MCwgMHgxYWE1Zjc2ZQotMCwgICAgICAgICA2MCwgICAgICAgICA2MCwgICAgICAgIDEsICAgNjIyMDgwLCAweGVlMDZhYTM2Ci0wLCAgICAgICAgIDYxLCAgICAgICAgIDYxLCAgICAgICAgMSwgICA2MjIwODAsIDB4YTcxMDMyMzAKLTAsICAgICAgICAgNjIsICAgICAgICAgNjIsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3MzcyNDA1ZgotMCwgICAgICAgICA2MywgICAgICAgICA2MywgICAgICAgIDEsICAgNjIyMDgwLCAweDhkN2E0NGI1Ci0wLCAgICAgICAgIDY0LCAgICAgICAgIDY0LCAgICAgICAgMSwgICA2MjIwODAsIDB4OWUwZWU3NzYKLTAsICAgICAgICAgNjUsICAgICAgICAgNjUsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkNDFlODU2MAotMCwgICAgICAgICA2NiwgICAgICAgICA2NiwgICAgICAgIDEsICAgNjIyMDgwLCAweDM5ZTZkOGM5Ci0wLCAgICAgICAgIDY3LCAgICAgICAgIDY3LCAgICAgICAgMSwgICA2MjIwODAsIDB4N2EyM2Q3MGMKLTAsICAgICAgICAgNjgsICAgICAgICAgNjgsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1MWQ5YWM5YQotMCwgICAgICAgICA2OSwgICAgICAgICA2OSwgICAgICAgIDEsICAgNjIyMDgwLCAweDhlYWNmN2YyCi0wLCAgICAgICAgIDcwLCAgICAgICAgIDcwLCAgICAgICAgMSwgICA2MjIwODAsIDB4MmI2MzQ0MWQKLTAsICAgICAgICAgNzEsICAgICAgICAgNzEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg5ZjcxYjc0MgotMCwgICAgICAgICA3MiwgICAgICAgICA3MiwgICAgICAgIDEsICAgNjIyMDgwLCAweDU4YWZiZDVlCi0wLCAgICAgICAgIDczLCAgICAgICAgIDczLCAgICAgICAgMSwgICA2MjIwODAsIDB4NGQ2NDUyOTIKLTAsICAgICAgICAgNzQsICAgICAgICAgNzQsICAgICAgICAxLCAgIDYyMjA4MCwgMHhiOTcyZjcxNgotMCwgICAgICAgICA3NSwgICAgICAgICA3NSwgICAgICAgIDEsICAgNjIyMDgwLCAweGJiNWQwMWEyCi0wLCAgICAgICAgIDc2LCAgICAgICAgIDc2LCAgICAgICAgMSwgICA2MjIwODAsIDB4NmE2ZGYxMjkKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMTYvMTUKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3N2MwY2E5MgorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNjIyMDgwLCAweDA2ZDNhODIyCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA2MjIwODAsIDB4YmU3ZmU2NDYKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1NDJlODkxYQorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNjIyMDgwLCAweDQzODRjNWRhCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZGRkNGMwNTYKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyOTZiOTE2OAorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNjIyMDgwLCAweGY4ZTA5ODEyCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA2MjIwODAsIDB4OTZkNTczOGUKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhYzM0MWQ5YgorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDc2OWI5NjgxCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA2MjIwODAsIDB4YjVkYTEzNTQKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0NjFkNzc4ZAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNjIyMDgwLCAweGQ5ZGNjNWE4CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA2MjIwODAsIDB4Yjg4YzU4NGIKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1ODFiNTcyNworMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNjIyMDgwLCAweDdkN2IxNjM1CiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZmMxYjFhMTIKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0OWM2MGRjMAorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNjIyMDgwLCAweDFkNTM3YjIyCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA2MjIwODAsIDB4NDk4NzY1YTQKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDYyMjA4MCwgMHhkZDJlMDYzYQorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgNjIyMDgwLCAweDBjYWVkOGY5CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZmI0YTI0YWEKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDYyMjA4MCwgMHg0MWQ4OTdkMworMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgNjIyMDgwLCAweGRkM2YyOWFlCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICA2MjIwODAsIDB4N2FlYjdjOTMKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyNDEwY2JlMgorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgNjIyMDgwLCAweGE4YmNlZDQwCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICA2MjIwODAsIDB4NTUzNGY1Y2EKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDYyMjA4MCwgMHgxMWRlOTI4YworMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgNjIyMDgwLCAweDgyMTgwMzIyCiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICA2MjIwODAsIDB4NjQ3NDEwNzUKKzAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1ZTA0OGZjOAorMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgNjIyMDgwLCAweDE2MGYzMTBlCiswLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICA2MjIwODAsIDB4NGY2ZDJjZTcKKzAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3MDJkNDg5YworMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgNjIyMDgwLCAweGE0YjQxMzE1CiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICA2MjIwODAsIDB4YWYyZmI4YWEKKzAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgIDYyMjA4MCwgMHg1ZWMwOWMyNQorMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgNjIyMDgwLCAweDU3NWJhZTBmCiswLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICA2MjIwODAsIDB4OTRlY2Y3NzUKKzAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgIDYyMjA4MCwgMHhmZDY4YTk5MAorMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgNjIyMDgwLCAweDE1YTczMTVjCiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICA2MjIwODAsIDB4OGI1MTNmNjYKKzAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhlYmE5NDQwYQorMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgNjIyMDgwLCAweDBlNmFlNmMzCiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICA2MjIwODAsIDB4NzUxNDg0YTYKKzAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgzZDEyZDhhYgorMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgNjIyMDgwLCAweGRmZjNkNjgxCiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICA2MjIwODAsIDB4NDVkMGFjODAKKzAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgIDYyMjA4MCwgMHhiZTJkZjdmNworMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgNjIyMDgwLCAweGIxOGQ0NDIxCiswLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICA2MjIwODAsIDB4YTQ5Y2I2ZGUKKzAsICAgICAgICAgNzIsICAgICAgICAgNzIsICAgICAgICAxLCAgIDYyMjA4MCwgMHgyZTgxYmQzMgorMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgNjIyMDgwLCAweGE0N2E1MjcyCiswLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICA2MjIwODAsIDB4ODUyY2Y2Y2YKKzAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4OTJhMDE0ZQorMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgNjIyMDgwLCAweGIwNTVmMGU1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteWFkaWYxMCBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci15YWRpZjEwCmluZGV4IGFhMjdiZmMuLjI4ZTc5OWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci15YWRpZjEwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci15YWRpZjEwCkBAIC0xLDMxICsxLDM1IEBACiAjdGIgMDogMS8yNQotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAxMjQ0MTYwLCAweDViNDllMGMwCi0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NzZiYTZiYWIKLTAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgMTI0NDE2MCwgMHgwMjk4Y2I4ZAotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAxMjQ0MTYwLCAweDljODE3NTlhCi0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4YTIzOWQxYWUKLTAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgMTI0NDE2MCwgMHgzZTk1YWRhOQotMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAxMjQ0MTYwLCAweDhiODdlOGY4Ci0wLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NjRmODk2NTMKLTAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgMTI0NDE2MCwgMHg1OGU1ZDEyZQotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAxMjQ0MTYwLCAweDM4YjQwMDNhCi0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4YzAwNWMyOWMKLTAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgMTI0NDE2MCwgMHgxMGMwYzYwZAotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAxMjQ0MTYwLCAweDFiNTUwOTk4Ci0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4N2FhY2Y2YWIKLTAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgMTI0NDE2MCwgMHhlYjIwNWQ5OAotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAxMjQ0MTYwLCAweDZhZDIxMzRjCi0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4OGFlYTRlNTYKLTAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgMTI0NDE2MCwgMHgwZDkxMGE2YgotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAxMjQ0MTYwLCAweDc0OWFlMzA3Ci0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4OGZmN2FmM2MKLTAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgMTI0NDE2MCwgMHg5YmE1MWI5MQotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAxMjQ0MTYwLCAweGFkNDc2NTE0Ci0wLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4Njc0NDgxZDYKLTAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgMTI0NDE2MCwgMHgwOTM3ZTY3NwotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAxMjQ0MTYwLCAweDZjMmM1M2VlCi0wLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NTI0YTE2NGUKLTAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgMTI0NDE2MCwgMHg3N2E0MDVhYgotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAxMjQ0MTYwLCAweGFhNmI0N2M0Ci0wLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MGI1YWI1NTYKLTAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgMTI0NDE2MCwgMHhiZTFlZGFiOQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDU3NgorI3NhciAwOiAxNi8xNQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAxMjQ0MTYwLCAweGUwYzIyMzFiCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4ZGM3Y2FhNDMKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgMTI0NDE2MCwgMHg1MmM0ZGZiZgorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAxMjQ0MTYwLCAweDdjNTc3ZjA3CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NWI2YWQ3Y2UKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgMTI0NDE2MCwgMHg2ZjE1Y2U3NgorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAxMjQ0MTYwLCAweGYxMjAwMzRhCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4OWM2NWJhNjQKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgMTI0NDE2MCwgMHg4ODNiMjM3ZQorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAxMjQ0MTYwLCAweGI4MjkyZTBkCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4YmMzOTI3MjEKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgMTI0NDE2MCwgMHg3Y2Q4MmVjOQorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAxMjQ0MTYwLCAweDE2NzMyNWViCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NDliYWZhNzMKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgMTI0NDE2MCwgMHhlMWZmNmRiZgorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAxMjQ0MTYwLCAweDg1ZjcxMGI2CiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4ZDFmZDRjZGIKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgMTI0NDE2MCwgMHhhZmVlMDNjNQorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAxMjQ0MTYwLCAweDU2NmJlMDcwCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4YjZhYmJkMDEKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgMTI0NDE2MCwgMHhhOThmMzhmZAorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAxMjQ0MTYwLCAweDAwZjQ3MzZiCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NmIwZjlkZDIKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgMTI0NDE2MCwgMHgxNTgxMGI5MgorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAxMjQ0MTYwLCAweDBiNTE2NDY1CiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4OTI3ZDE1ZTYKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgMTI0NDE2MCwgMHhkMTAyZjJiZgorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAxMjQ0MTYwLCAweGRkOGIzYjIwCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MjI5YWM1MjkKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgMTI0NDE2MCwgMHhmODQ0ZTBhMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXlhZGlmMTYgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteWFkaWYxNgppbmRleCA2NTQyN2EyLi4wYzg1NmFiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteWFkaWYxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteWFkaWYxNgpAQCAtMSwzMSArMSwzNSBAQAogI3RiIDA6IDEvMjUKLTAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgMTI0NDE2MCwgMHhmYjY1Y2FlZQotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAxMjQ0MTYwLCAweDYyMjJlNjkwCi0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MDIwYWM2NDgKLTAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgMTI0NDE2MCwgMHhiNzY2OTFjYQotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAxMjQ0MTYwLCAweGUwZmQ3NDA0Ci0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4M2FiMjk3MDUKLTAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgMTI0NDE2MCwgMHhiZTgwNzgzNQotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAxMjQ0MTYwLCAweDc3ZDM1OGZkCi0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MzU5YjE3NGYKLTAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgMTI0NDE2MCwgMHhlMjBmMGU3ZgotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAxMjQ0MTYwLCAweDk4ODk2NmVjCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4ZDA3OGRhNzIKLTAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgMTI0NDE2MCwgMHgyNzZkOTdmNwotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAxMjQ0MTYwLCAweGY4ZWU3Y2EwCi0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4Nzc2YmVkNzIKLTAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgMTI0NDE2MCwgMHhiOWJmOTJiMgotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAxMjQ0MTYwLCAweDMwZTAxMDk0Ci0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4YmM1ZjMxMzkKLTAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgMTI0NDE2MCwgMHg0NDMyNDkwMgotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAxMjQ0MTYwLCAweDY0YWFiOGY1Ci0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MGEwNWFlYWMKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgMTI0NDE2MCwgMHgzMWU1YWEzNgotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAxMjQ0MTYwLCAweGE2ODU0MDVmCi0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NTRhNmU3NzYKLTAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgMTI0NDE2MCwgMHg5YWY0ZDhjOQotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAxMjQ0MTYwLCAweGY3MDlhYzlhCi0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MTJhOTQ0MWQKLTAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgMTI0NDE2MCwgMHhmM2YxYmQ1ZQotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAxMjQ0MTYwLCAweDdiY2VmNzE2Ci0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4ZTNhMmYxMjkKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMTYvMTUKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgMTI0NDE2MCwgMHgyNGVlY2E5MgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAxMjQ0MTYwLCAweDk2YjhlNjQ2CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4YzExZmM1ZGEKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgMTI0NDE2MCwgMHhjMTVmOTE2OAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAxMjQ0MTYwLCAweGJhMWM3MzhlCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NTZiNTk2ODEKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgMTI0NDE2MCwgMHgxNGFkNzc4ZAorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAxMjQ0MTYwLCAweDE4ZGM1ODRiCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4ZTRjMTE2MzUKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgMTI0NDE2MCwgMHg4NWNjMGRjMAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAxMjQ0MTYwLCAweDJkNmE2NWE0CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NDA1NGQ4ZjkKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgMTI0NDE2MCwgMHhlYmNlOTdkMworMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAxMjQ0MTYwLCAweDc5NDM3YzkzCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NjQzOGVkNDAKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgMTI0NDE2MCwgMHg5MTIxOTI4YworMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAxMjQ0MTYwLCAweGI4NzMxMDc1CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4ZmIwMTMxMGUKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgMTI0NDE2MCwgMHg5N2JlNDg5YworMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAxMjQ0MTYwLCAweGE1YjRiOGFhCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MDBhN2FlMGYKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgMTI0NDE2MCwgMHg1MTRmYTk5MAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAxMjQ0MTYwLCAweGQ3M2MzZjY2CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MzYwMmU2YzMKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgMTI0NDE2MCwgMHhhMTZhZDhhYgorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAxMjQ0MTYwLCAweGRmMTFhYzgwCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4MWYwODQ0MjEKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgMTI0NDE2MCwgMHg5ZmMxYmQzMgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAxMjQ0MTYwLCAweDEzODlmNmNmCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgIDEyNDQxNjAsIDB4NmZjNWYwZTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpbHRlci15dXZ0ZXN0c3JjLXl1djQ0NHAgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteXV2dGVzdHNyYy15dXY0NDRwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZmNmMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteXV2dGVzdHNyYy15dXY0NDRwCkBAIC0wLDAgKzEsMTAgQEAKKyN0YiAwOiAxLzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4MGUxZTJhNGYKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMDQwMCwgMHgwZTFlMmE0ZgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMwNDAwLCAweDBlMWUyYTRmCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAyMzA0MDAsIDB4MGUxZTJhNGYKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDIzMDQwMCwgMHgwZTFlMmE0ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXl1dnRlc3RzcmMteXV2NDQ0cDEyIGIvdGVzdHMvcmVmL2ZhdGUvZmlsdGVyLXl1dnRlc3RzcmMteXV2NDQ0cDEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYmFjNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maWx0ZXIteXV2dGVzdHNyYy15dXY0NDRwMTIKQEAgLTAsMCArMSwxMCBAQAorI3RiIDA6IDEvNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgMHgzZWM0OWJlNworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDYwODAwLCAweDNlYzQ5YmU3CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NjA4MDAsIDB4M2VjNDliZTcKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDQ2MDgwMCwgMHgzZWM0OWJlNworMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNDYwODAwLCAweDNlYzQ5YmU3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maXRzLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvZml0cy1kZW11eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTYwNWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZml0cy1kZW11eApAQCAtMCwwICsxLDEwIEBACisjdGIgMDogMS8xCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGZpdHMKKyNkaW1lbnNpb25zIDA6IDcyeDM2Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE0MzIwLCAweDBlY2Y3MmUwCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMTQzMjAsIDB4ZDk0YWY2ZWIKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAxNDMyMCwgMHgxNWMyMTg5MgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgIDE0MzIwLCAweGIxOGFkYzAxCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgMTQzMjAsIDB4YzJiZTcwNmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpdHNkZWMtYml0cGl4LTMyIGIvdGVzdHMvcmVmL2ZhdGUvZml0c2RlYy1iaXRwaXgtMzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjZTM2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpdHNkZWMtYml0cGl4LTMyCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTAyeDEwOQorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyMjIzNiwgMHgzNDQ5MDkwMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZml0c2RlYy1iaXRwaXgtNjQgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWJpdHBpeC02NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmViZGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZml0c2RlYy1iaXRwaXgtNjQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8xCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3N3gxNzMKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjY2NDIsIDB4MGFkMmE0NmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpdHNkZWMtYmxhbmtfYml0cGl4MzIgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWJsYW5rX2JpdHBpeDMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGZkNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWJsYW5rX2JpdHBpeDMyCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2eDI1NgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEzMTA3MiwgMHg3ZmIyMjQyNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZml0c2RlYy1leHRfZGF0YV9taW5fbWF4IGIvdGVzdHMvcmVmL2ZhdGUvZml0c2RlYy1leHRfZGF0YV9taW5fbWF4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDlhNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWV4dF9kYXRhX21pbl9tYXgKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8xCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MTJ4NTEyCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTI0Mjg4LCAweGMzMjdlZDIzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWdicmFwMTZsZSBiL3Rlc3RzL3JlZi9mYXRlL2ZpdHNkZWMtZ2JyYXAxNmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YWJiNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWdicmFwMTZsZQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMzEwNzIsIDB4NDg3ODk0YjIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpdHNkZWMtZ2JycCBiL3Rlc3RzL3JlZi9mYXRlL2ZpdHNkZWMtZ2JycApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzY3YjY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZml0c2RlYy1nYnJwCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHg1NjVjM2RlZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZml0c2RlYy1nYnJwMTYgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWdicnAxNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjM2OGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZml0c2RlYy1nYnJwMTYKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8xCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDk4MzA0LCAweDFiOTE3YmRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWdyYXkgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLWdyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI1YjMxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpdHNkZWMtZ3JheQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4ZDc4OGEyZDIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpdHNkZWMtbXVsdGkgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLW11bHRpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNGYwYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZGVjLW11bHRpCkBAIC0wLDAgKzEsMTAgQEAKKyN0YiAwOiAxLzEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyeDM2Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDEwMzY4LCAweGI0NDkwY2M4CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMTAzNjgsIDB4MzcxOThlNGYKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAxMDM2OCwgMHgxZTg5YWZlNworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgIDEwMzY4LCAweDgwMTI3MzY1CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgMTAzNjgsIDB4ZmQyZDA3ZDEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpdHNlbmMtZ2JyYXAgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdicmFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMzJmYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdicmFwCkBAIC0wLDAgKzEsMTAgQEAKKyN0YiAwOiAxLzEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogZml0cworI2RpbWVuc2lvbnMgMDogNzJ4MzYKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTE1MjAsIDB4ZWIwYTBjYzgKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAxMTUyMCwgMHg5ZDdkOGU0ZgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDExNTIwLCAweGQ5ZTZhZmU3CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAgMTE1MjAsIDB4NzViZDczNjUKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgICAxMTUyMCwgMHg4NmYxMDdkMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZml0c2VuYy1nYnJhcDE2YmUgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdicmFwMTZiZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjc0ZjRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZml0c2VuYy1nYnJhcDE2YmUKQEAgLTAsMCArMSwxMCBAQAorI3RiIDA6IDEvMQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBmaXRzCisjZGltZW5zaW9ucyAwOiA3MngzNgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyMzA0MCwgMHhmYTRmZjRmMAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDIzMDQwLCAweGY1NzEwMmQ0CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjMwNDAsIDB4NThlMDI5NGQKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAyMzA0MCwgMHg4MDk3NTAyYQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgIDIzMDQwLCAweDY1ZmQ3YjU0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdicnAgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdicnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEwMWEwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZpdHNlbmMtZ2JycApAQCAtMCwwICsxLDEwIEBACisjdGIgMDogMS8xCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGZpdHMKKyNkaW1lbnNpb25zIDA6IDcyeDM2Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA4NjQwLCAweGY2YjlmNjQzCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDg2NDAsIDB4MjUwZDc3ZDkKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAgODY0MCwgMHg2NTI1OTVlNQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgICA4NjQwLCAweDRiOGU1OTYzCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgIDg2NDAsIDB4ZDhkNjExYWIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZpdHNlbmMtZ2JycDE2YmUgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdicnAxNmJlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjA0M2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdicnAxNmJlCkBAIC0wLDAgKzEsMTAgQEAKKyN0YiAwOiAxLzEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogZml0cworI2RpbWVuc2lvbnMgMDogNzJ4MzYKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTcyODAsIDB4NmI4N2VlYzUKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAxNzI4MCwgMHgxYmYwZmM5YQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDE3MjgwLCAweGFmMDcxYjFlCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAgMTcyODAsIDB4ZmJlOTQxZmIKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgICAxNzI4MCwgMHhiYmMyNmQwMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZml0c2VuYy1ncmF5IGIvdGVzdHMvcmVmL2ZhdGUvZml0c2VuYy1ncmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWI3NmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdyYXkKQEAgLTAsMCArMSwxMCBAQAorI3RiIDA6IDEvMQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBmaXRzCisjZGltZW5zaW9ucyAwOiA3MngzNgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMjg4MCwgMHhkMmQ4Mzc1MgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAyODgwLCAweDc3MjQ2ZTc5CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgIDI4ODAsIDB4ZGY0ODBjMWYKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAgMjg4MCwgMHg1NTkyNDdhOQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgICAyODgwLCAweGMzZGYyY2M0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9maXRzZW5jLWdyYXkxNmJlIGIvdGVzdHMvcmVmL2ZhdGUvZml0c2VuYy1ncmF5MTZiZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRlMGVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZml0c2VuYy1ncmF5MTZiZQpAQCAtMCwwICsxLDEwIEBACisjdGIgMDogMS8xCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGZpdHMKKyNkaW1lbnNpb25zIDA6IDcyeDM2Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA1NzYwLCAweDMxN2JhMTgwCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDU3NjAsIDB4NDM5YzllNDAKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAgNTc2MCwgMHg2MTM2ZmY4ZgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgICA1NzYwLCAweDJjMzMxMzI0CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgIDU3NjAsIDB4MmYwODE2YzEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZsY2wxOTA1IGIvdGVzdHMvcmVmL2ZhdGUvZmxjbDE5MDUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0MjkyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZsY2wxOTA1CkBAIC0wLDAgKzEsMTkzIEBACitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MHxwdHNfdGltZT0wLjAwMDAwMHxkdHM9MHxkdHNfdGltZT0wLjAwMDAwMHxkdXJhdGlvbj0yMjUyOHxkdXJhdGlvbl90aW1lPTAuNTEwODM5fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQwOTJ8cG9zPTU2fGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9MHxwa3RfcHRzX3RpbWU9MC4wMDAwMDB8cGt0X2R0cz0wfHBrdF9kdHNfdGltZT0wLjAwMDAwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjAwMDAwMHxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT00MDkyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT0zNzIwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT0zMzQ4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT0yOTc2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT0yNjA0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT0yMjMyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT0xODYwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT0xNDg4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT0xMTE2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01Nnxwa3Rfc2l6ZT03NDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU2fHBrdF9zaXplPTM3MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIyNTI4fHB0c190aW1lPTAuNTEwODM5fGR0cz0yMjUyOHxkdHNfdGltZT0wLjUxMDgzOXxkdXJhdGlvbj0yMjUyOHxkdXJhdGlvbl90aW1lPTAuNTEwODM5fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQwOTJ8cG9zPTQxNDh8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz0yMjUyOHxwa3RfcHRzX3RpbWU9MC41MTA4Mzl8cGt0X2R0cz0yMjUyOHxwa3RfZHRzX3RpbWU9MC41MTA4Mzl8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTIyNTI4fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuNTEwODM5fHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQxNDh8cGt0X3NpemU9NDA5MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDE0OHxwa3Rfc2l6ZT0zNzIwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MTQ4fHBrdF9zaXplPTMzNDh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQxNDh8cGt0X3NpemU9Mjk3NnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDE0OHxwa3Rfc2l6ZT0yNjA0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MTQ4fHBrdF9zaXplPTIyMzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQxNDh8cGt0X3NpemU9MTg2MHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDE0OHxwa3Rfc2l6ZT0xNDg4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MTQ4fHBrdF9zaXplPTExMTZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQxNDh8cGt0X3NpemU9NzQ0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MTQ4fHBrdF9zaXplPTM3MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTQ1MDU2fHB0c190aW1lPTEuMDIxNjc4fGR0cz00NTA1NnxkdHNfdGltZT0xLjAyMTY3OHxkdXJhdGlvbj0yMjUyOHxkdXJhdGlvbl90aW1lPTAuNTEwODM5fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQwOTJ8cG9zPTgyNDB8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz00NTA1Nnxwa3RfcHRzX3RpbWU9MS4wMjE2Nzh8cGt0X2R0cz00NTA1Nnxwa3RfZHRzX3RpbWU9MS4wMjE2Nzh8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTQ1MDU2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTEuMDIxNjc4fHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTgyNDB8cGt0X3NpemU9NDA5MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9ODI0MHxwa3Rfc2l6ZT0zNzIwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz04MjQwfHBrdF9zaXplPTMzNDh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTgyNDB8cGt0X3NpemU9Mjk3NnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9ODI0MHxwa3Rfc2l6ZT0yNjA0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz04MjQwfHBrdF9zaXplPTIyMzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTgyNDB8cGt0X3NpemU9MTg2MHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9ODI0MHxwa3Rfc2l6ZT0xNDg4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz04MjQwfHBrdF9zaXplPTExMTZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTgyNDB8cGt0X3NpemU9NzQ0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz04MjQwfHBrdF9zaXplPTM3MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTY3NTg0fHB0c190aW1lPTEuNTMyNTE3fGR0cz02NzU4NHxkdHNfdGltZT0xLjUzMjUxN3xkdXJhdGlvbj0yMjUyOHxkdXJhdGlvbl90aW1lPTAuNTEwODM5fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQwOTJ8cG9zPTEyMzMyfGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Njc1ODR8cGt0X3B0c190aW1lPTEuNTMyNTE3fHBrdF9kdHM9Njc1ODR8cGt0X2R0c190aW1lPTEuNTMyNTE3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD02NzU4NHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjUzMjUxN3xwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT00MDkyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT0zNzIwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT0zMzQ4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT0yOTc2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT0yNjA0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT0yMjMyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT0xODYwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT0xNDg4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT0xMTE2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xMjMzMnxwa3Rfc2l6ZT03NDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTEyMzMyfHBrdF9zaXplPTM3MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTkwMTEyfHB0c190aW1lPTIuMDQzMzU2fGR0cz05MDExMnxkdHNfdGltZT0yLjA0MzM1NnxkdXJhdGlvbj0yMjUyOHxkdXJhdGlvbl90aW1lPTAuNTEwODM5fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQwOTJ8cG9zPTE2NDI0fGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9OTAxMTJ8cGt0X3B0c190aW1lPTIuMDQzMzU2fHBrdF9kdHM9OTAxMTJ8cGt0X2R0c190aW1lPTIuMDQzMzU2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD05MDExMnxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0yLjA0MzM1Nnxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT00MDkyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT0zNzIwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT0zMzQ4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT0yOTc2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT0yNjA0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT0yMjMyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT0xODYwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT0xNDg4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT0xMTE2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0xNjQyNHxwa3Rfc2l6ZT03NDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTE2NDI0fHBrdF9zaXplPTM3MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTExMjY0MHxwdHNfdGltZT0yLjU1NDE5NXxkdHM9MTEyNjQwfGR0c190aW1lPTIuNTU0MTk1fGR1cmF0aW9uPTIyNTI4fGR1cmF0aW9uX3RpbWU9MC41MTA4Mzl8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NDA5Mnxwb3M9MjA1MTZ8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz0xMTI2NDB8cGt0X3B0c190aW1lPTIuNTU0MTk1fHBrdF9kdHM9MTEyNjQwfHBrdF9kdHNfdGltZT0yLjU1NDE5NXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTEyNjQwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTIuNTU0MTk1fHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTQwOTJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTM3MjB8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTMzNDh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTI5NzZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTI2MDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTIyMzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTE4NjB8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTE0ODh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTExMTZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTIwNTE2fHBrdF9zaXplPTc0NHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjA1MTZ8cGt0X3NpemU9MzcyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTM1MTY4fHB0c190aW1lPTMuMDY1MDM0fGR0cz0xMzUxNjh8ZHRzX3RpbWU9My4wNjUwMzR8ZHVyYXRpb249MjI1Mjh8ZHVyYXRpb25fdGltZT0wLjUxMDgzOXxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MDkyfHBvcz0yNDYwOHxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTEzNTE2OHxwa3RfcHRzX3RpbWU9My4wNjUwMzR8cGt0X2R0cz0xMzUxNjh8cGt0X2R0c190aW1lPTMuMDY1MDM0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMzUxNjh8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9My4wNjUwMzR8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9NDA5MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9MzcyMHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9MzM0OHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9Mjk3NnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9MjYwNHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9MjIzMnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9MTg2MHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9MTQ4OHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9MTExNnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MjQ2MDh8cGt0X3NpemU9NzQ0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yNDYwOHxwa3Rfc2l6ZT0zNzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNTc2OTZ8cHRzX3RpbWU9My41NzU4NzN8ZHRzPTE1NzY5NnxkdHNfdGltZT0zLjU3NTg3M3xkdXJhdGlvbj0yMjUyOHxkdXJhdGlvbl90aW1lPTAuNTEwODM5fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQwOTJ8cG9zPTI4NzAwfGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9MTU3Njk2fHBrdF9wdHNfdGltZT0zLjU3NTg3M3xwa3RfZHRzPTE1NzY5Nnxwa3RfZHRzX3RpbWU9My41NzU4NzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTE1NzY5NnxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0zLjU3NTg3M3xwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT00MDkyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT0zNzIwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT0zMzQ4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT0yOTc2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT0yNjA0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT0yMjMyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT0xODYwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT0xNDg4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT0xMTE2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0yODcwMHxwa3Rfc2l6ZT03NDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTI4NzAwfHBrdF9zaXplPTM3MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE4MDIyNHxwdHNfdGltZT00LjA4NjcxMnxkdHM9MTgwMjI0fGR0c190aW1lPTQuMDg2NzEyfGR1cmF0aW9uPTIyNTI4fGR1cmF0aW9uX3RpbWU9MC41MTA4Mzl8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NDA5Mnxwb3M9MzI3OTJ8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz0xODAyMjR8cGt0X3B0c190aW1lPTQuMDg2NzEyfHBrdF9kdHM9MTgwMjI0fHBrdF9kdHNfdGltZT00LjA4NjcxMnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTgwMjI0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTQuMDg2NzEyfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTQwOTJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTM3MjB8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTMzNDh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTI5NzZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTI2MDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTIyMzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTE4NjB8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTE0ODh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTExMTZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTMyNzkyfHBrdF9zaXplPTc0NHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzI3OTJ8cGt0X3NpemU9MzcyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjAyNzUyfHB0c190aW1lPTQuNTk3NTUxfGR0cz0yMDI3NTJ8ZHRzX3RpbWU9NC41OTc1NTF8ZHVyYXRpb249MjI1Mjh8ZHVyYXRpb25fdGltZT0wLjUxMDgzOXxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MDkyfHBvcz0zNjg4NHxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTIwMjc1Mnxwa3RfcHRzX3RpbWU9NC41OTc1NTF8cGt0X2R0cz0yMDI3NTJ8cGt0X2R0c190aW1lPTQuNTk3NTUxfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0yMDI3NTJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9NC41OTc1NTF8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9NDA5MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9MzcyMHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9MzM0OHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9Mjk3NnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9MjYwNHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9MjIzMnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9MTg2MHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9MTQ4OHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9MTExNnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9MzY4ODR8cGt0X3NpemU9NzQ0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz0zNjg4NHxwa3Rfc2l6ZT0zNzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yMjUyODB8cHRzX3RpbWU9NS4xMDgzOTB8ZHRzPTIyNTI4MHxkdHNfdGltZT01LjEwODM5MHxkdXJhdGlvbj0yMjUyOHxkdXJhdGlvbl90aW1lPTAuNTEwODM5fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQwOTJ8cG9zPTQwOTc2fGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9MjI1MjgwfHBrdF9wdHNfdGltZT01LjEwODM5MHxwa3RfZHRzPTIyNTI4MHxwa3RfZHRzX3RpbWU9NS4xMDgzOTB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTIyNTI4MHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT01LjEwODM5MHxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT00MDkyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT0zNzIwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT0zMzQ4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT0yOTc2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT0yNjA0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT0yMjMyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT0xODYwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT0xNDg4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT0xMTE2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00MDk3Nnxwa3Rfc2l6ZT03NDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQwOTc2fHBrdF9zaXplPTM3MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTI0NzgwOHxwdHNfdGltZT01LjYxOTIyOXxkdHM9MjQ3ODA4fGR0c190aW1lPTUuNjE5MjI5fGR1cmF0aW9uPTIyNTI4fGR1cmF0aW9uX3RpbWU9MC41MTA4Mzl8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NDA5Mnxwb3M9NDUwNjh8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz0yNDc4MDh8cGt0X3B0c190aW1lPTUuNjE5MjI5fHBrdF9kdHM9MjQ3ODA4fHBrdF9kdHNfdGltZT01LjYxOTIyOXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjQ3ODA4fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTUuNjE5MjI5fHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTQwOTJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTM3MjB8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTMzNDh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTI5NzZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTI2MDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTIyMzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTE4NjB8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTE0ODh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTExMTZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTQ1MDY4fHBrdF9zaXplPTc0NHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDUwNjh8cGt0X3NpemU9MzcyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjcwMzM2fHB0c190aW1lPTYuMTMwMDY4fGR0cz0yNzAzMzZ8ZHRzX3RpbWU9Ni4xMzAwNjh8ZHVyYXRpb249MjI1Mjh8ZHVyYXRpb25fdGltZT0wLjUxMDgzOXxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MDkyfHBvcz00OTE2MHxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTI3MDMzNnxwa3RfcHRzX3RpbWU9Ni4xMzAwNjh8cGt0X2R0cz0yNzAzMzZ8cGt0X2R0c190aW1lPTYuMTMwMDY4fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0yNzAzMzZ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ni4xMzAwNjh8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9NDA5MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9MzcyMHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9MzM0OHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9Mjk3NnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9MjYwNHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9MjIzMnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9MTg2MHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9MTQ4OHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9MTExNnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NDkxNjB8cGt0X3NpemU9NzQ0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz00OTE2MHxwa3Rfc2l6ZT0zNzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yOTI4NjR8cHRzX3RpbWU9Ni42NDA5MDd8ZHRzPTI5Mjg2NHxkdHNfdGltZT02LjY0MDkwN3xkdXJhdGlvbj0yMjUyOHxkdXJhdGlvbl90aW1lPTAuNTEwODM5fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQwOTJ8cG9zPTUzMjUyfGZsYWdzPUtfCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9MjkyODY0fHBrdF9wdHNfdGltZT02LjY0MDkwN3xwa3RfZHRzPTI5Mjg2NHxwa3RfZHRzX3RpbWU9Ni42NDA5MDd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTI5Mjg2NHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT02LjY0MDkwN3xwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT00MDkyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT0zNzIwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT0zMzQ4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT0yOTc2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT0yNjA0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT0yMjMyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT0xODYwfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT0xNDg4fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT0xMTE2fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz01MzI1Mnxwa3Rfc2l6ZT03NDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTUzMjUyfHBrdF9zaXplPTM3MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTMxNTM5MnxwdHNfdGltZT03LjE1MTc0NnxkdHM9MzE1MzkyfGR0c190aW1lPTcuMTUxNzQ2fGR1cmF0aW9uPTIyNTI4fGR1cmF0aW9uX3RpbWU9MC41MTA4Mzl8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NDA5Mnxwb3M9NTczNDR8ZmxhZ3M9S18KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz0zMTUzOTJ8cGt0X3B0c190aW1lPTcuMTUxNzQ2fHBrdF9kdHM9MzE1MzkyfHBrdF9kdHNfdGltZT03LjE1MTc0NnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MzE1MzkyfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTcuMTUxNzQ2fHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTQwOTJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTM3MjB8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTMzNDh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTI5NzZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTI2MDR8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTIyMzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTE4NjB8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTE0ODh8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTExMTZ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK2ZyYW1lfG1lZGlhX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz1OL0F8cGt0X3B0c190aW1lPU4vQXxwa3RfZHRzPU4vQXxwa3RfZHRzX3RpbWU9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ti9BfHBrdF9kdXJhdGlvbj0yMjUyOHxwa3RfZHVyYXRpb25fdGltZT0wLjUxMDgzOXxwa3RfcG9zPTU3MzQ0fHBrdF9zaXplPTc0NHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NTczNDR8cGt0X3NpemU9MzcyfHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MzM3OTIwfHB0c190aW1lPTcuNjYyNTg1fGR0cz0zMzc5MjB8ZHRzX3RpbWU9Ny42NjI1ODV8ZHVyYXRpb249MjI1Mjh8ZHVyYXRpb25fdGltZT0wLjUxMDgzOXxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MDkyfHBvcz02MTQzNnxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPTMzNzkyMHxwa3RfcHRzX3RpbWU9Ny42NjI1ODV8cGt0X2R0cz0zMzc5MjB8cGt0X2R0c190aW1lPTcuNjYyNTg1fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0zMzc5MjB8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Ny42NjI1ODV8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9NDA5MnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9MzcyMHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9MzM0OHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9Mjk3NnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9MjYwNHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9MjIzMnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9MTg2MHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9MTQ4OHxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9MTExNnxzYW1wbGVfZm10PWZsdHB8bmJfc2FtcGxlcz0yMDQ4fGNoYW5uZWxzPTJ8Y2hhbm5lbF9sYXlvdXQ9dW5rbm93bgorZnJhbWV8bWVkaWFfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MXxwa3RfcHRzPU4vQXxwa3RfcHRzX3RpbWU9Ti9BfHBrdF9kdHM9Ti9BfHBrdF9kdHNfdGltZT1OL0F8YmVzdF9lZmZvcnRfdGltZXN0YW1wPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT1OL0F8cGt0X2R1cmF0aW9uPTIyNTI4fHBrdF9kdXJhdGlvbl90aW1lPTAuNTEwODM5fHBrdF9wb3M9NjE0MzZ8cGt0X3NpemU9NzQ0fHNhbXBsZV9mbXQ9Zmx0cHxuYl9zYW1wbGVzPTIwNDh8Y2hhbm5lbHM9MnxjaGFubmVsX2xheW91dD11bmtub3duCitmcmFtZXxtZWRpYV90eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9Ti9BfHBrdF9wdHNfdGltZT1OL0F8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9Ti9BfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPU4vQXxwa3RfZHVyYXRpb249MjI1Mjh8cGt0X2R1cmF0aW9uX3RpbWU9MC41MTA4Mzl8cGt0X3Bvcz02MTQzNnxwa3Rfc2l6ZT0zNzJ8c2FtcGxlX2ZtdD1mbHRwfG5iX3NhbXBsZXM9MjA0OHxjaGFubmVscz0yfGNoYW5uZWxfbGF5b3V0PXVua25vd24KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0zNjA0NDh8cHRzX3RpbWU9OC4xNzM0MjR8ZHRzPTM2MDQ0OHxkdHNfdGltZT04LjE3MzQyNHxkdXJhdGlvbj00NHxkdXJhdGlvbl90aW1lPTAuMDAwOTk4fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTh8cG9zPTY1NTI4fGZsYWdzPUtfCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mbGljLWFmMTEtcGFsZXR0ZS1jaGFuZ2UgYi90ZXN0cy9yZWYvZmF0ZS9mbGljLWFmMTEtcGFsZXR0ZS1jaGFuZ2UKaW5kZXggY2Q3MDJiNi4uYWNmMDAwNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZmxpYy1hZjExLXBhbGV0dGUtY2hhbmdlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZsaWMtYWYxMS1wYWxldHRlLWNoYW5nZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzM1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjAwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTkyMDAwLCAweDUwOGZmOGFjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTIwMDAsIDB4ZWYwZDQyNzQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE5MjAwMCwgMHgwZDUwZTBkZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZmxpYy1hZjEyIGIvdGVzdHMvcmVmL2ZhdGUvZmxpYy1hZjEyCmluZGV4IDIyN2YyNmEuLjQ2ODMzNDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZsaWMtYWYxMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9mbGljLWFmMTIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogOS8xMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA5MjE2MDAsIDB4NTBhODczOTYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDkyMTYwMCwgMHhhNmU2NWQ5ZQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgOTIxNjAwLCAweDA1OTU2ZjYyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mbGljLW1hZ2ljY2FycGV0IGIvdGVzdHMvcmVmL2ZhdGUvZmxpYy1tYWdpY2NhcnBldAppbmRleCAyM2E5MzQyLi5iOGQzZmMyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9mbGljLW1hZ2ljY2FycGV0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZsaWMtbWFnaWNjYXJwZXQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5MjAwMCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTkyMDAwLCAweDAzNTY3ZWViCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTIwMDAsIDB4ZTczZGIxMmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Zsdi1hZGRfa2V5ZnJhbWVfaW5kZXggYi90ZXN0cy9yZWYvZmF0ZS9mbHYtYWRkX2tleWZyYW1lX2luZGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNGRhNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9mbHYtYWRkX2tleWZyYW1lX2luZGV4CkBAIC0wLDAgKzEsMTIgQEAKKztGRk1FVEFEQVRBMQoraGFzVmlkZW89dHJ1ZQoraGFzS2V5ZnJhbWVzPXRydWUKK2hhc0F1ZGlvPWZhbHNlCitoYXNNZXRhZGF0YT10cnVlCitjYW5TZWVrVG9FbmQ9dHJ1ZQorZGF0YXNpemU9NjI5Nzc2Cit2aWRlb3NpemU9NjI5MzgxCithdWRpb3NpemU9MAorbGFzdHRpbWVzdGFtcD0yMAorbGFzdGtleWZyYW1ldGltZXN0YW1wPTE5CitsYXN0a2V5ZnJhbWVsb2NhdGlvbj01OTc5NjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2Zsdi1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL2Zsdi1kZW11eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc5MTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZmx2LWRlbXV4CkBAIC0wLDAgKzEsNjE2IEBACisjZXh0cmFkYXRhIDA6ICAgICAgIDM5LCAweGY4YWEwZDQ0CisjZXh0cmFkYXRhIDE6ICAgICAgICAyLCAweDAwYjYwMGEzCisjdGIgMDogMS8xMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGgyNjQKKyNkaW1lbnNpb25zIDA6IDQyNngyNDAKKyNzYXIgMDogMS8xCisjdGIgMTogMS8xMDAwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IGFhYworI3NhbXBsZV9yYXRlIDE6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMTogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogc3RlcmVvCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAzMywgICAgICAxMzUsIDB4NzhiMzMwNzgsIFM9MSwgICAgICAgMzksIDB4ZjhhYTBkNDQKKzEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgIDQ2LCAgICAgICAgOSwgMHgwN2JjMDFiOCwgUz0xLCAgICAgICAgMiwgMHgwMGI2MDBhMworMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgMzMsICAgICAgIDkyLCAweDBkODkxZGQwLCBGPTB4MAorMSwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgNDYsICAgICAgICA5LCAweDA3YmMwMWI4CiswLCAgICAgICAgIDY3LCAgICAgICAgIDY3LCAgICAgICAzMywgICAgICAgMTQsIDB4MGYwZjAzMTAsIEY9MHgwCisxLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICA0NiwgICAgICAgIDksIDB4MDhiYzAxZDgKKzAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgIDMzLCAgICAgICAxNCwgMHgwZjQ2MDMxNywgRj0weDAKKzAsICAgICAgICAxMzMsICAgICAgICAxMzMsICAgICAgIDMzLCAgICAgIDExNywgMHhiMGRiMzNiNywgRj0weDAKKzEsICAgICAgICAxMzksICAgICAgICAxMzksICAgICAgIDQ2LCAgICAgICA4OSwgMHg2ZDU1MmFjMQorMCwgICAgICAgIDE2NywgICAgICAgIDE2NywgICAgICAgMzMsICAgICAgIDE0LCAweDBlYjIwMmVlLCBGPTB4MAorMSwgICAgICAgIDE4NiwgICAgICAgIDE4NiwgICAgICAgNDYsICAgICAgMTU1LCAweDFhNWE1MDM3CiswLCAgICAgICAgMjAwLCAgICAgICAgMjAwLCAgICAgICAzMywgICAgICAgMTQsIDB4MGVlYTAyZjYsIEY9MHgwCisxLCAgICAgICAgMjMyLCAgICAgICAgMjMyLCAgICAgICA0NiwgICAgICAyODEsIDB4YjQwMDgyZjkKKzAsICAgICAgICAyMzQsICAgICAgICAyMzQsICAgICAgIDMzLCAgICAgIDExNywgMHhmMzY3MzQ1MywgRj0weDAKKzAsICAgICAgICAyNjcsICAgICAgICAyNjcsICAgICAgIDMzLCAgICAgICAxNCwgMHgwZjc5MDMwOSwgRj0weDAKKzEsICAgICAgICAyNzksICAgICAgICAyNzksICAgICAgIDQ2LCAgICAgIDU0OCwgMHg5YjAzMWU4NgorMCwgICAgICAgIDMwMCwgICAgICAgIDMwMCwgICAgICAgMzMsICAgICAgIDE0LCAweDBmYjEwMzExLCBGPTB4MAorMSwgICAgICAgIDMyNSwgICAgICAgIDMyNSwgICAgICAgNDYsICAgICAgNDcyLCAweGVlM2RlZjYzCiswLCAgICAgICAgMzM0LCAgICAgICAgMzM0LCAgICAgICAzMywgICAgICAxMTcsIDB4ZmY3MzM0NmYsIEY9MHgwCiswLCAgICAgICAgMzY3LCAgICAgICAgMzY3LCAgICAgICAzMywgICAgICAgMTQsIDB4MTA0MTAzMjUsIEY9MHgwCisxLCAgICAgICAgMzcyLCAgICAgICAgMzcyLCAgICAgICA0NiwgICAgICA0ODksIDB4ZmE0NWY0NjMKKzAsICAgICAgICA0MDAsICAgICAgICA0MDAsICAgICAgIDMzLCAgICAgICAxNCwgMHgxMDc5MDMyZCwgRj0weDAKKzEsICAgICAgICA0MTgsICAgICAgICA0MTgsICAgICAgIDQ2LCAgICAgIDM1NywgMHg3YjAxYWU3ZAorMCwgICAgICAgIDQzNCwgICAgICAgIDQzNCwgICAgICAgMzMsICAgICAgMjA3LCAweDE5NzU1Y2ExLCBGPTB4MAorMSwgICAgICAgIDQ2NCwgICAgICAgIDQ2NCwgICAgICAgNDYsICAgICAgMjYyLCAweDE5ZGI4Mzk5CiswLCAgICAgICAgNDY3LCAgICAgICAgNDY3LCAgICAgICAzMywgICAgICAgMTQsIDB4MTEwYTAzNDIsIEY9MHgwCiswLCAgICAgICAgNTAxLCAgICAgICAgNTAxLCAgICAgICAzMywgICAgICAgMTQsIDB4MTE0MjAzNGEsIEY9MHgwCisxLCAgICAgICAgNTExLCAgICAgICAgNTExLCAgICAgICA0NiwgICAgICAyOTQsIDB4MDQ3ODk3ZTAKKzAsICAgICAgICA1MzQsICAgICAgICA1MzQsICAgICAgIDMzLCAgICAgIDE3OSwgMHhlZGQ0NWE0MCwgRj0weDAKKzEsICAgICAgICA1NTcsICAgICAgICA1NTcsICAgICAgIDQ2LCAgICAgIDIwNCwgMHg3MTk5NjFkMAorMCwgICAgICAgIDU2NywgICAgICAgIDU2NywgICAgICAgMzMsICAgICAgIDE0LCAweDExZDEwMzVkLCBGPTB4MAorMCwgICAgICAgIDYwMSwgICAgICAgIDYwMSwgICAgICAgMzMsICAgICAgIDE0LCAweDEyMGEwMzY2LCBGPTB4MAorMSwgICAgICAgIDYwNCwgICAgICAgIDYwNCwgICAgICAgNDYsICAgICAgMjc1LCAweGNhNzU4NTkwCiswLCAgICAgICAgNjM0LCAgICAgICAgNjM0LCAgICAgICAzMywgICAgICAgMzIsIDB4Y2VlOTBlOGIsIEY9MHgwCisxLCAgICAgICAgNjUwLCAgICAgICAgNjUwLCAgICAgICA0NiwgICAgICAzMDksIDB4MmU3OTk4NTAKKzAsICAgICAgICA2NjcsICAgICAgICA2NjcsICAgICAgIDMzLCAgICAgICAzMCwgMHhjMmQyMGVlYiwgRj0weDAKKzEsICAgICAgICA2OTcsICAgICAgICA2OTcsICAgICAgIDQ2LCAgICAgIDI4MCwgMHhkYzJiODA2NAorMCwgICAgICAgIDcwMSwgICAgICAgIDcwMSwgICAgICAgMzMsICAgICAgIDE2LCAweDIzMTUwNTA0LCBGPTB4MAorMCwgICAgICAgIDczNCwgICAgICAgIDczNCwgICAgICAgMzMsICAgICAgIDMzLCAweGNjY2YwZDJkLCBGPTB4MAorMSwgICAgICAgIDc0MywgICAgICAgIDc0MywgICAgICAgNDYsICAgICAgMTA2LCAweGQ0Y2YzMGRmCiswLCAgICAgICAgNzY3LCAgICAgICAgNzY3LCAgICAgICAzMywgICAgICAgMTYsIDB4MjM4NTA1MGMsIEY9MHgwCisxLCAgICAgICAgNzg5LCAgICAgICAgNzg5LCAgICAgICA0NiwgICAgICAxMzMsIDB4Y2Q5NjQxNjUKKzAsICAgICAgICA4MDEsICAgICAgICA4MDEsICAgICAgIDMzLCAgICAgICAxNiwgMHgyM2Y1MDUxOCwgRj0weDAKKzAsICAgICAgICA4MzQsICAgICAgICA4MzQsICAgICAgIDMzLCAgICAgICAyMiwgMHg0ZmY1MDg2YSwgRj0weDAKKzEsICAgICAgICA4MzYsICAgICAgICA4MzYsICAgICAgIDQ2LCAgICAgIDM4MCwgMHg0YzZiYmMyNworMCwgICAgICAgIDg2OCwgICAgICAgIDg2OCwgICAgICAgMzMsICAgICAgIDE0LCAweDE0YWEwM2MyLCBGPTB4MAorMSwgICAgICAgIDg4MiwgICAgICAgIDg4MiwgICAgICAgNDYsICAgICAgMzc4LCAweDJiNThiMmQ2CiswLCAgICAgICAgOTAxLCAgICAgICAgOTAxLCAgICAgICAzMywgICAgICAgMTQsIDB4MTRlMTAzYzksIEY9MHgwCisxLCAgICAgICAgOTI5LCAgICAgICAgOTI5LCAgICAgICA0NiwgICAgICAxMDgsIDB4MTk5ODM5MmUKKzAsICAgICAgICA5MzQsICAgICAgICA5MzQsICAgICAgIDMzLCAgICAgICA1NSwgMHhiNmVmMWI4NSwgRj0weDAKKzAsICAgICAgICA5NjgsICAgICAgICA5NjgsICAgICAgIDMzLCAgICAgICAxNCwgMHgxNTNhMDNkYSwgRj0weDAKKzEsICAgICAgICA5NzUsICAgICAgICA5NzUsICAgICAgIDQ2LCAgICAgIDI3OSwgMHg2N2E0ODhjYgorMCwgICAgICAgMTAwMSwgICAgICAgMTAwMSwgICAgICAgMzMsICAgICAgIDE0LCAweDE0YmQwMzVmLCBGPTB4MAorMSwgICAgICAgMTAyMiwgICAgICAgMTAyMiwgICAgICAgNDYsICAgICAgMTM0LCAweDIyOGM0MTkzCiswLCAgICAgICAxMDM0LCAgICAgICAxMDM0LCAgICAgICAzMywgICAgICAgNTgsIDB4ZTI5MTFhZTIsIEY9MHgwCiswLCAgICAgICAxMDY4LCAgICAgICAxMDY4LCAgICAgICAzMywgICAgICAgMzksIDB4MWNmZjExMjksIEY9MHgwCisxLCAgICAgICAxMDY4LCAgICAgICAxMDY4LCAgICAgICA0NiwgICAgICAxNjIsIDB4NjdlYTQ5YzcKKzAsICAgICAgIDExMDEsICAgICAgIDExMDEsICAgICAgIDMzLCAgICAgICA0OCwgMHhhYTExMTM4YSwgRj0weDAKKzEsICAgICAgIDExMTUsICAgICAgIDExMTUsICAgICAgIDQ2LCAgICAgICA0NiwgMHg0MGY5MTczNworMCwgICAgICAgMTEzNCwgICAgICAgMTEzNCwgICAgICAgMzMsICAgICAgMzE5LCAweDdiZTdhMGQ4LCBGPTB4MAorMSwgICAgICAgMTE2MSwgICAgICAgMTE2MSwgICAgICAgNDYsICAgICAgMTUwLCAweDZiZTE0M2ZjCiswLCAgICAgICAxMTY4LCAgICAgICAxMTY4LCAgICAgICAzMywgICAgICAyMDQsIDB4MjNmNTY1NjIsIEY9MHgwCiswLCAgICAgICAxMjAxLCAgICAgICAxMjAxLCAgICAgICAzMywgICAgICAyNDAsIDB4ZDNkMzcyZTIsIEY9MHgwCisxLCAgICAgICAxMjA3LCAgICAgICAxMjA3LCAgICAgICA0NiwgICAgICA0MjcsIDB4YzA3OGQ3MTYKKzAsICAgICAgIDEyMzUsICAgICAgIDEyMzUsICAgICAgIDMzLCAgICAgIDMwNSwgMHgzNDE5OTY1NSwgRj0weDAKKzEsICAgICAgIDEyNTQsICAgICAgIDEyNTQsICAgICAgIDQ2LCAgICAgIDYxNiwgMHg1ZjAxM2RiMAorMCwgICAgICAgMTI2OCwgICAgICAgMTI2OCwgICAgICAgMzMsICAgICAgMjE3LCAweDMxNDE2NzYwLCBGPTB4MAorMSwgICAgICAgMTMwMCwgICAgICAgMTMwMCwgICAgICAgNDYsICAgICAgNzM2LCAweDE2OTc4YTVmCiswLCAgICAgICAxMzAxLCAgICAgICAxMzAxLCAgICAgICAzMywgICAgICAyMzYsIDB4MTUwMzc5ZmQsIEY9MHgwCiswLCAgICAgICAxMzM1LCAgICAgICAxMzM1LCAgICAgICAzMywgICAgICAyMjIsIDB4ZjcxNDcyYjYsIEY9MHgwCisxLCAgICAgICAxMzQ3LCAgICAgICAxMzQ3LCAgICAgICA0NiwgICAgICA3MDgsIDB4MGQ5ZjZlMTYKKzAsICAgICAgIDEzNjgsICAgICAgIDEzNjgsICAgICAgIDMzLCAgICAgMTI5NSwgMHgyYzc4ODYwYgorMSwgICAgICAgMTM5MywgICAgICAgMTM5MywgICAgICAgNDYsICAgICAgNzE3LCAweGEyNzM3YzAwCiswLCAgICAgICAxNDAxLCAgICAgICAxNDAxLCAgICAgICAzMywgICAgICA2NTMsIDB4OWFhZjNlZWIsIEY9MHgwCiswLCAgICAgICAxNDM1LCAgICAgICAxNDM1LCAgICAgICAzMywgICAgICAzMzUsIDB4NWMyNGE3ZjIsIEY9MHgwCisxLCAgICAgICAxNDQwLCAgICAgICAxNDQwLCAgICAgICA0NiwgICAgICA3MzAsIDB4MGZjMDdiNGYKKzAsICAgICAgIDE0NjgsICAgICAgIDE0NjgsICAgICAgIDMzLCAgICAgIDc2NSwgMHhhN2VlN2Q4NiwgRj0weDAKKzEsICAgICAgIDE0ODYsICAgICAgIDE0ODYsICAgICAgIDQ2LCAgICAgIDc1NiwgMHhlYjJkOTg3YgorMCwgICAgICAgMTUwMiwgICAgICAgMTUwMiwgICAgICAgMzMsICAgICAgMjEzLCAweDY3YzY2OTZlLCBGPTB4MAorMSwgICAgICAgMTUzMywgICAgICAgMTUzMywgICAgICAgNDYsICAgICAgNjY0LCAweDFjNjg0ZDlmCiswLCAgICAgICAxNTM1LCAgICAgICAxNTM1LCAgICAgICAzMywgICAgICA0NjQsIDB4NzA0M2VjMmMsIEY9MHgwCiswLCAgICAgICAxNTY4LCAgICAgICAxNTY4LCAgICAgICAzMywgICAgICA1NjEsIDB4MDA4MDEwNWMsIEY9MHgwCisxLCAgICAgICAxNTc5LCAgICAgICAxNTc5LCAgICAgICA0NiwgICAgICA3NTEsIDB4YzE4NzgyNzQKKzAsICAgICAgIDE2MDIsICAgICAgIDE2MDIsICAgICAgIDMzLCAgICAgIDg3NiwgMHgxNGUzYjMwOSwgRj0weDAKKzEsICAgICAgIDE2MjUsICAgICAgIDE2MjUsICAgICAgIDQ2LCAgICAgIDc4MCwgMHg3MmRlOTFmOAorMCwgICAgICAgMTYzNSwgICAgICAgMTYzNSwgICAgICAgMzMsICAgICAgNDczLCAweDNhZjZlNzFhLCBGPTB4MAorMCwgICAgICAgMTY2OCwgICAgICAgMTY2OCwgICAgICAgMzMsICAgICAgMjcyLCAweDJmNTc3ZWI3LCBGPTB4MAorMSwgICAgICAgMTY3MiwgICAgICAgMTY3MiwgICAgICAgNDYsICAgICAgNDA0LCAweDdjYWRiZWMzCiswLCAgICAgICAxNzAyLCAgICAgICAxNzAyLCAgICAgICAzMywgICAgICAyODEsIDB4YTg5ODg1MzksIEY9MHgwCisxLCAgICAgICAxNzE4LCAgICAgICAxNzE4LCAgICAgICA0NiwgICAgICAzMjYsIDB4MTVhZmExNzgKKzAsICAgICAgIDE3MzUsICAgICAgIDE3MzUsICAgICAgIDMzLCAgICAgIDMxNSwgMHhhM2VkOTk0NSwgRj0weDAKKzEsICAgICAgIDE3NjUsICAgICAgIDE3NjUsICAgICAgIDQ2LCAgICAgICA3NywgMHgzYzcwMjFmYgorMCwgICAgICAgMTc2OCwgICAgICAgMTc2OCwgICAgICAgMzMsICAgICAgNjUzLCAweDE0M2Q0OWEwLCBGPTB4MAorMCwgICAgICAgMTgwMiwgICAgICAgMTgwMiwgICAgICAgMzMsICAgICAgMjI4LCAweDgxMDM2ZDBjLCBGPTB4MAorMSwgICAgICAgMTgxMSwgICAgICAgMTgxMSwgICAgICAgNDYsICAgICAgMTMyLCAweGMxMDk0MDkxCiswLCAgICAgICAxODM1LCAgICAgICAxODM1LCAgICAgICAzMywgICAgICAyNjUsIDB4NWMyNDgxYWYsIEY9MHgwCisxLCAgICAgICAxODU4LCAgICAgICAxODU4LCAgICAgICA0NiwgICAgICAyNjYsIDB4MTY4NDg3NjQKKzAsICAgICAgIDE4NjksICAgICAgIDE4NjksICAgICAgIDMzLCAgICAgIDM2MiwgMHhlNmE0YjE1ZiwgRj0weDAKKzAsICAgICAgIDE5MDIsICAgICAgIDE5MDIsICAgICAgIDMzLCAgICAgIDM2MiwgMHg3ZTc1YWY4OSwgRj0weDAKKzEsICAgICAgIDE5MDQsICAgICAgIDE5MDQsICAgICAgIDQ2LCAgICAgIDI5NywgMHg0YWIxOWY4MgorMCwgICAgICAgMTkzNSwgICAgICAgMTkzNSwgICAgICAgMzMsICAgICAgMjk3LCAweGUwN2U4YmQ5LCBGPTB4MAorMSwgICAgICAgMTk1MCwgICAgICAgMTk1MCwgICAgICAgNDYsICAgICAgICA5LCAweDEzYzUwM2RmCiswLCAgICAgICAxOTY5LCAgICAgICAxOTY5LCAgICAgICAzMywgICAgICAzOTUsIDB4YTdmOGJhMmUsIEY9MHgwCisxLCAgICAgICAxOTk3LCAgICAgICAxOTk3LCAgICAgICA0NiwgICAgICAgIDksIDB4MGFiYzAyMTgKKzAsICAgICAgIDIwMDIsICAgICAgIDIwMDIsICAgICAgIDMzLCAgICAgIDE0OSwgMHhiYzExNDI4NywgRj0weDAKKzAsICAgICAgIDIwMzUsICAgICAgIDIwMzUsICAgICAgIDMzLCAgICAgIDE0MSwgMHg2NDQzNDJjMSwgRj0weDAKKzEsICAgICAgIDIwNDMsICAgICAgIDIwNDMsICAgICAgIDQ2LCAgICAgICAgOSwgMHgwN2JjMDFiOAorMCwgICAgICAgMjA2OSwgICAgICAgMjA2OSwgICAgICAgMzMsICAgICAgMzE3LCAweDU5YmI5YmJiLCBGPTB4MAorMSwgICAgICAgMjA5MCwgICAgICAgMjA5MCwgICAgICAgNDYsICAgICAgICA5LCAweDA3YmMwMWI4CiswLCAgICAgICAyMTAyLCAgICAgICAyMTAyLCAgICAgICAzMywgICAgICAxNzAsIDB4OTc0NjRiZmYsIEY9MHgwCiswLCAgICAgICAyMTM1LCAgICAgICAyMTM1LCAgICAgICAzMywgICAgICA0NDMsIDB4NGZmMWU1MTcsIEY9MHgwCisxLCAgICAgICAyMTM2LCAgICAgICAyMTM2LCAgICAgICA0NiwgICAgICAgIDksIDB4MDdiYzAxYjgKKzAsICAgICAgIDIxNjksICAgICAgIDIxNjksICAgICAgIDMzLCAgICAgIDIyNCwgMHhjNjRlNmExYiwgRj0weDAKKzEsICAgICAgIDIxODMsICAgICAgIDIxODMsICAgICAgIDQ2LCAgICAgICAgOSwgMHgwN2JjMDFiOAorMCwgICAgICAgMjIwMiwgICAgICAgMjIwMiwgICAgICAgMzMsICAgICAgNDcyLCAweGFkZDllOGFmLCBGPTB4MAorMSwgICAgICAgMjIyOSwgICAgICAgMjIyOSwgICAgICAgNDYsICAgICAgICA5LCAweDA3YmMwMWI4CiswLCAgICAgICAyMjM2LCAgICAgICAyMjM2LCAgICAgICAzMywgICAgICAxODgsIDB4YWM2YTU3MGYsIEY9MHgwCiswLCAgICAgICAyMjY5LCAgICAgICAyMjY5LCAgICAgICAzMywgICAgICAzMDIsIDB4YWZmNDk4NDcsIEY9MHgwCisxLCAgICAgICAyMjc2LCAgICAgICAyMjc2LCAgICAgICA0NiwgICAgICAgIDksIDB4MDdiYzAxYjgKKzAsICAgICAgIDIzMDIsICAgICAgIDIzMDIsICAgICAgIDMzLCAgICAgIDEyNSwgMHgwMWJmM2MwYywgRj0weDAKKzEsICAgICAgIDIzMjIsICAgICAgIDIzMjIsICAgICAgIDQ2LCAgICAgICAgOSwgMHgwN2JjMDFiOAorMCwgICAgICAgMjMzNiwgICAgICAgMjMzNiwgICAgICAgMzMsICAgICAgODEwLCAweDVjMDQ4YjlhLCBGPTB4MAorMSwgICAgICAgMjM2OCwgICAgICAgMjM2OCwgICAgICAgNDYsICAgICAgMzA0LCAweDVjN2E5OTQ1CiswLCAgICAgICAyMzY5LCAgICAgICAyMzY5LCAgICAgICAzMywgICAgICAxNTgsIDB4NTNkNDUwZjUsIEY9MHgwCiswLCAgICAgICAyNDAyLCAgICAgICAyNDAyLCAgICAgICAzMywgICAgICA1NjEsIDB4NjVhNzIzM2EsIEY9MHgwCisxLCAgICAgICAyNDE1LCAgICAgICAyNDE1LCAgICAgICA0NiwgICAgICA2ODMsIDB4ZmYxZjUwYzMKKzAsICAgICAgIDI0MzYsICAgICAgIDI0MzYsICAgICAgIDMzLCAgICAgIDM4MywgMHhjZWQ4YjI3ZiwgRj0weDAKKzEsICAgICAgIDI0NjEsICAgICAgIDI0NjEsICAgICAgIDQ2LCAgICAgIDY4MSwgMHhhOWQ0NjJlNQorMCwgICAgICAgMjQ2OSwgICAgICAgMjQ2OSwgICAgICAgMzMsICAgICAgMjE4LCAweDEwYzg2ODE5LCBGPTB4MAorMCwgICAgICAgMjUwMywgICAgICAgMjUwMywgICAgICAgMzMsICAgICAgMjcwLCAweDgxYTg4NmZiLCBGPTB4MAorMSwgICAgICAgMjUwOCwgICAgICAgMjUwOCwgICAgICAgNDYsICAgICAgNjYzLCAweGVkZTY1YTQ2CiswLCAgICAgICAyNTM2LCAgICAgICAyNTM2LCAgICAgICAzMywgICAgICAxODIsIDB4ZmE3YjVjYmEsIEY9MHgwCisxLCAgICAgICAyNTU0LCAgICAgICAyNTU0LCAgICAgICA0NiwgICAgICA2NzEsIDB4N2MzODU5ZWQKKzAsICAgICAgIDI1NjksICAgICAgIDI1NjksICAgICAgIDMzLCAgICAgMTA2MywgMHgzNDk4ZmQwMworMSwgICAgICAgMjYwMSwgICAgICAgMjYwMSwgICAgICAgNDYsICAgICAgNjgyLCAweGRjZTI2M2YyCiswLCAgICAgICAyNjAzLCAgICAgICAyNjAzLCAgICAgICAzMywgICAgIDM2ODcsIDB4N2IwMjJkOTEsIEY9MHgwCiswLCAgICAgICAyNjM2LCAgICAgICAyNjM2LCAgICAgICAzMywgICAgICAyODAsIDB4NGRlNjkxNTQsIEY9MHgwCisxLCAgICAgICAyNjQ3LCAgICAgICAyNjQ3LCAgICAgICA0NiwgICAgICA2OTgsIDB4NzgwNzY5MDMKKzAsICAgICAgIDI2NjksICAgICAgIDI2NjksICAgICAgIDMzLCAgICAgIDQ3NSwgMHg0MjZjZGVhYSwgRj0weDAKKzEsICAgICAgIDI2OTQsICAgICAgIDI2OTQsICAgICAgIDQ2LCAgICAgIDY5NywgMHhmYWM5NjEyYQorMCwgICAgICAgMjcwMywgICAgICAgMjcwMywgICAgICAgMzMsICAgICAgNDg4LCAweDAzZGNmMzdlLCBGPTB4MAorMCwgICAgICAgMjczNiwgICAgICAgMjczNiwgICAgICAgMzMsICAgICAgNTMyLCAweGIyYzcwYzdiLCBGPTB4MAorMSwgICAgICAgMjc0MCwgICAgICAgMjc0MCwgICAgICAgNDYsICAgICAgNjc0LCAweDNkZTE1ZTVhCiswLCAgICAgICAyNzY5LCAgICAgICAyNzY5LCAgICAgICAzMywgICAgICA1OTAsIDB4Njc0ZDIyODMsIEY9MHgwCisxLCAgICAgICAyNzg2LCAgICAgICAyNzg2LCAgICAgICA0NiwgICAgICA2NTEsIDB4YTRjNzU2MDYKKzAsICAgICAgIDI4MDMsICAgICAgIDI4MDMsICAgICAgIDMzLCAgICAgIDY4MywgMHgzOGM1NDMzNCwgRj0weDAKKzEsICAgICAgIDI4MzMsICAgICAgIDI4MzMsICAgICAgIDQ2LCAgICAgIDY3MiwgMHhjOGMzNGU1NAorMCwgICAgICAgMjgzNiwgICAgICAgMjgzNiwgICAgICAgMzMsICAgICAgODM2LCAweGFiYjQ5YWIyLCBGPTB4MAorMCwgICAgICAgMjg3MCwgICAgICAgMjg3MCwgICAgICAgMzMsICAgICAgNjc2LCAweDAzMTI0ZmM5LCBGPTB4MAorMSwgICAgICAgMjg3OSwgICAgICAgMjg3OSwgICAgICAgNDYsICAgICAgNjY1LCAweDkyOGY1ODk3CiswLCAgICAgICAyOTAzLCAgICAgICAyOTAzLCAgICAgICAzMywgICAgICA3MzEsIDB4OThhYTVjYTQsIEY9MHgwCisxLCAgICAgICAyOTI2LCAgICAgICAyOTI2LCAgICAgICA0NiwgICAgICA3MzQsIDB4ZjBlOTYyNmYKKzAsICAgICAgIDI5MzYsICAgICAgIDI5MzYsICAgICAgIDMzLCAgICAgIDgzOSwgMHhkNGE2OWIzMiwgRj0weDAKKzAsICAgICAgIDI5NzAsICAgICAgIDI5NzAsICAgICAgIDMzLCAgICAgIDc4NywgMHg4Njg2N2M0ZiwgRj0weDAKKzEsICAgICAgIDI5NzIsICAgICAgIDI5NzIsICAgICAgIDQ2LCAgICAgIDczMiwgMHg2NTYxNzA5ZAorMCwgICAgICAgMzAwMywgICAgICAgMzAwMywgICAgICAgMzMsICAgICAxMDM5LCAweDA3MWIwZmE4LCBGPTB4MAorMSwgICAgICAgMzAxOSwgICAgICAgMzAxOSwgICAgICAgNDYsICAgICAgNzQyLCAweDcwMGQ3ZDg2CiswLCAgICAgICAzMDM2LCAgICAgICAzMDM2LCAgICAgICAzMywgICAgICA4NTEsIDB4NjAwZmFmYWIsIEY9MHgwCisxLCAgICAgICAzMDY1LCAgICAgICAzMDY1LCAgICAgICA0NiwgICAgICA3NDgsIDB4ZmQwMjZhZDEKKzAsICAgICAgIDMwNzAsICAgICAgIDMwNzAsICAgICAgIDMzLCAgICAgIDkyOCwgMHg4ZWE5Y2I3NCwgRj0weDAKKzAsICAgICAgIDMxMDMsICAgICAgIDMxMDMsICAgICAgIDMzLCAgICAgIDg0MCwgMHg4YjQxYTE3MCwgRj0weDAKKzEsICAgICAgIDMxMTEsICAgICAgIDMxMTEsICAgICAgIDQ2LCAgICAgIDY3MSwgMHhiZmE3NTYwNgorMCwgICAgICAgMzEzNiwgICAgICAgMzEzNiwgICAgICAgMzMsICAgICAgODg5LCAweDJkZDhhZTg5LCBGPTB4MAorMSwgICAgICAgMzE1OCwgICAgICAgMzE1OCwgICAgICAgNDYsICAgICAgNjQ1LCAweDJiNGM1MGJkCiswLCAgICAgICAzMTcwLCAgICAgICAzMTcwLCAgICAgICAzMywgICAgICA3ODksIDB4MjdhZjg3Y2IsIEY9MHgwCiswLCAgICAgICAzMjAzLCAgICAgICAzMjAzLCAgICAgICAzMywgICAgIDEwMzcsIDB4NmU3MTA2M2MsIEY9MHgwCisxLCAgICAgICAzMjA0LCAgICAgICAzMjA0LCAgICAgICA0NiwgICAgICA3MjQsIDB4YWFhNzdjMTgKKzAsICAgICAgIDMyMzcsICAgICAgIDMyMzcsICAgICAgIDMzLCAgICAgMTIwMSwgMHhiZmJjNTQ1NSwgRj0weDAKKzEsICAgICAgIDMyNTEsICAgICAgIDMyNTEsICAgICAgIDQ2LCAgICAgIDc1NywgMHhjZTYzODE1MworMCwgICAgICAgMzI3MCwgICAgICAgMzI3MCwgICAgICAgMzMsICAgICAgOTM0LCAweDdiZThkODg0LCBGPTB4MAorMSwgICAgICAgMzI5NywgICAgICAgMzI5NywgICAgICAgNDYsICAgICAgNzEwLCAweDQyN2I2Y2Y5CiswLCAgICAgICAzMzAzLCAgICAgICAzMzAzLCAgICAgICAzMywgICAgIDEwMjgsIDB4ZmE5YWY1ZDAsIEY9MHgwCiswLCAgICAgICAzMzM3LCAgICAgICAzMzM3LCAgICAgICAzMywgICAgIDEwMDcsIDB4YjQwYjAwMTMsIEY9MHgwCisxLCAgICAgICAzMzQ0LCAgICAgICAzMzQ0LCAgICAgICA0NiwgICAgICA3MDUsIDB4ZGI5ZDVlNmIKKzAsICAgICAgIDMzNzAsICAgICAgIDMzNzAsICAgICAgIDMzLCAgICAgIDk0NCwgMHhkYmExZDUzNCwgRj0weDAKKzEsICAgICAgIDMzOTAsICAgICAgIDMzOTAsICAgICAgIDQ2LCAgICAgIDY5MywgMHg4NGI1NjJiYworMCwgICAgICAgMzQwMywgICAgICAgMzQwMywgICAgICAgMzMsICAgICAxMTIxLCAweDE4ZjYxZjVhLCBGPTB4MAorMCwgICAgICAgMzQzNywgICAgICAgMzQzNywgICAgICAgMzMsICAgICAxMzIxLCAweDI4Y2I5YWE4LCBGPTB4MAorMSwgICAgICAgMzQzNywgICAgICAgMzQzNywgICAgICAgNDYsICAgICAgNjgzLCAweDBiYTg1NzgxCiswLCAgICAgICAzNDcwLCAgICAgICAzNDcwLCAgICAgICAzMywgICAgIDEyMjksIDB4MmQ2ZjYyZWYsIEY9MHgwCisxLCAgICAgICAzNDgzLCAgICAgICAzNDgzLCAgICAgICA0NiwgICAgICA2NjgsIDB4OTY0NTRiMzUKKzAsICAgICAgIDM1MDQsICAgICAgIDM1MDQsICAgICAgIDMzLCAgICAgMTE2NiwgMHhjM2IxNDFiOSwgRj0weDAKKzEsICAgICAgIDM1MjksICAgICAgIDM1MjksICAgICAgIDQ2LCAgICAgIDYyNCwgMHg4OTY3MmQyMgorMCwgICAgICAgMzUzNywgICAgICAgMzUzNywgICAgICAgMzMsICAgICAxMDU1LCAweGM1M2UwZTQ4LCBGPTB4MAorMCwgICAgICAgMzU3MCwgICAgICAgMzU3MCwgICAgICAgMzMsICAgICAgOTQ3LCAweDRmYWVjZmE2LCBGPTB4MAorMSwgICAgICAgMzU3NiwgICAgICAgMzU3NiwgICAgICAgNDYsICAgICAgNTcwLCAweGUxZGExZmMyCiswLCAgICAgICAzNjA0LCAgICAgICAzNjA0LCAgICAgICAzMywgICAgIDExMTcsIDB4YjhmYTMxZDksIEY9MHgwCisxLCAgICAgICAzNjIyLCAgICAgICAzNjIyLCAgICAgICA0NiwgICAgICA1NzksIDB4ZDA5MTIzOWMKKzAsICAgICAgIDM2MzcsICAgICAgIDM2MzcsICAgICAgIDMzLCAgICAgMTM5NywgMHhiMjI4YmUxYSwgRj0weDAKKzEsICAgICAgIDM2NjksICAgICAgIDM2NjksICAgICAgIDQ2LCAgICAgIDU1OCwgMHhkYjk1MWFlNQorMCwgICAgICAgMzY3MCwgICAgICAgMzY3MCwgICAgICAgMzMsICAgICAxMDk3LCAweDk1NTIyN2VhLCBGPTB4MAorMCwgICAgICAgMzcwNCwgICAgICAgMzcwNCwgICAgICAgMzMsICAgICAxMjA3LCAweDViYTg1MGMwLCBGPTB4MAorMSwgICAgICAgMzcxNSwgICAgICAgMzcxNSwgICAgICAgNDYsICAgICAgNTEwLCAweDMzZDUwNjlhCiswLCAgICAgICAzNzM3LCAgICAgICAzNzM3LCAgICAgICAzMywgICAgIDExMDksIDB4NTc3ZDJmY2QsIEY9MHgwCisxLCAgICAgICAzNzYyLCAgICAgICAzNzYyLCAgICAgICA0NiwgICAgICA1MTgsIDB4MjFlNGZjOTYKKzAsICAgICAgIDM3NzAsICAgICAgIDM3NzAsICAgICAgIDMzLCAgICAgIDk5NCwgMHhmM2RhZjI5OSwgRj0weDAKKzAsICAgICAgIDM4MDQsICAgICAgIDM4MDQsICAgICAgIDMzLCAgICAgMTE0NCwgMHgzZDU3NGI3OCwgRj0weDAKKzEsICAgICAgIDM4MDgsICAgICAgIDM4MDgsICAgICAgIDQ2LCAgICAgIDQ4MSwgMHg3ZDdkZWRhMAorMCwgICAgICAgMzgzNywgICAgICAgMzgzNywgICAgICAgMzMsICAgICAxNDA5LCAweGYxNDhjNGJiLCBGPTB4MAorMSwgICAgICAgMzg1NSwgICAgICAgMzg1NSwgICAgICAgNDYsICAgICAgNDQzLCAweGM5YmJlMDQyCiswLCAgICAgICAzODcxLCAgICAgICAzODcxLCAgICAgICAzMywgICAgIDEyMDUsIDB4YWFkYTRmMDYsIEY9MHgwCisxLCAgICAgICAzOTAxLCAgICAgICAzOTAxLCAgICAgICA0NiwgICAgICA0MTMsIDB4YjQyOGNhOGEKKzAsICAgICAgIDM5MDQsICAgICAgIDM5MDQsICAgICAgIDMzLCAgICAgMTE1OSwgMHgzYmY4MzAxMCwgRj0weDAKKzAsICAgICAgIDM5MzcsICAgICAgIDM5MzcsICAgICAgIDMzLCAgICAgMTIwNywgMHgyYTY0NTdjMSwgRj0weDAKKzEsICAgICAgIDM5NDcsICAgICAgIDM5NDcsICAgICAgIDQ2LCAgICAgIDM5OCwgMHg3MzY5YzQwMgorMCwgICAgICAgMzk3MSwgICAgICAgMzk3MSwgICAgICAgMzMsICAgICAxMDg0LCAweDc3MjcxZTFkLCBGPTB4MAorMSwgICAgICAgMzk5NCwgICAgICAgMzk5NCwgICAgICAgNDYsICAgICAgMzc3LCAweDhlMWRiOWE5CiswLCAgICAgICA0MDA0LCAgICAgICA0MDA0LCAgICAgICAzMywgICAgIDE1MzksIDB4YjFhOWZhZGUsIEY9MHgwCiswLCAgICAgICA0MDM3LCAgICAgICA0MDM3LCAgICAgICAzMywgICAgIDE0MDksIDB4ZGNmN2I5N2QsIEY9MHgwCisxLCAgICAgICA0MDQwLCAgICAgICA0MDQwLCAgICAgICA0NiwgICAgICAzNjQsIDB4YTM5OWE5YzIKKzAsICAgICAgIDQwNzEsICAgICAgIDQwNzEsICAgICAgIDMzLCAgICAgMTI3NSwgMHg5OTNiN2VmOSwgRj0weDAKKzEsICAgICAgIDQwODcsICAgICAgIDQwODcsICAgICAgIDQ2LCAgICAgIDM3NCwgMHg4YTMwYWQ4NAorMCwgICAgICAgNDEwNCwgICAgICAgNDEwNCwgICAgICAgMzMsICAgICAxMzE3LCAweGYyZjI5NzU0LCBGPTB4MAorMSwgICAgICAgNDEzMywgICAgICAgNDEzMywgICAgICAgNDYsICAgICAgMzU1LCAweDdhZDZhYWExCiswLCAgICAgICA0MTM3LCAgICAgICA0MTM3LCAgICAgICAzMywgICAgIDExNDYsIDB4YWU2MzMyMzgsIEY9MHgwCiswLCAgICAgICA0MTcxLCAgICAgICA0MTcxLCAgICAgICAzMywgICAgIDExNjYsIDB4ODliZTMxM2QsIEY9MHgwCisxLCAgICAgICA0MTgwLCAgICAgICA0MTgwLCAgICAgICA0NiwgICAgICAzNDEsIDB4M2U1NDlhN2IKKzAsICAgICAgIDQyMDQsICAgICAgIDQyMDQsICAgICAgIDMzLCAgICAgMTI3MiwgMHg3NWUwNzY3NCwgRj0weDAKKzEsICAgICAgIDQyMjYsICAgICAgIDQyMjYsICAgICAgIDQ2LCAgICAgIDM2NCwgMHhiMTM0YTA1NgorMCwgICAgICAgNDIzOCwgICAgICAgNDIzOCwgICAgICAgMzMsICAgICAxNTUwLCAweDY2MzAwMzlkLCBGPTB4MAorMCwgICAgICAgNDI3MSwgICAgICAgNDI3MSwgICAgICAgMzMsICAgICAxMzUzLCAweDUxZjZhZDE2LCBGPTB4MAorMSwgICAgICAgNDI3MiwgICAgICAgNDI3MiwgICAgICAgNDYsICAgICAgMzUwLCAweDFmNmE5ZWUyCiswLCAgICAgICA0MzA0LCAgICAgICA0MzA0LCAgICAgICAzMywgICAgIDEyNTEsIDB4MDUwNDY4MjgsIEY9MHgwCisxLCAgICAgICA0MzE5LCAgICAgICA0MzE5LCAgICAgICA0NiwgICAgICAzNTYsIDB4MmFhNWFkMmMKKzAsICAgICAgIDQzMzgsICAgICAgIDQzMzgsICAgICAgIDMzLCAgICAgMTMzOSwgMHg0NGU3OGE1NywgRj0weDAKKzEsICAgICAgIDQzNjUsICAgICAgIDQzNjUsICAgICAgIDQ2LCAgICAgIDM2NSwgMHgyNmU3YTVlYgorMCwgICAgICAgNDM3MSwgICAgICAgNDM3MSwgICAgICAgMzMsICAgICAxMjE2LCAweDJmYjU1MDY3LCBGPTB4MAorMCwgICAgICAgNDQwNCwgICAgICAgNDQwNCwgICAgICAgMzMsICAgICAxMjIyLCAweGQwNTE3NDNjLCBGPTB4MAorMSwgICAgICAgNDQxMiwgICAgICAgNDQxMiwgICAgICAgNDYsICAgICAgMzUyLCAweDg5ZmZhNTY0CiswLCAgICAgICA0NDM4LCAgICAgICA0NDM4LCAgICAgICAzMywgICAgIDE2NjUsIDB4NWE2YTQxZGQsIEY9MHgwCisxLCAgICAgICA0NDU4LCAgICAgICA0NDU4LCAgICAgICA0NiwgICAgICAzNzQsIDB4ODMzM2I1MDIKKzAsICAgICAgIDQ0NzEsICAgICAgIDQ0NzEsICAgICAgIDMzLCAgICAgMTM3MiwgMHgzYWJjYTRmMSwgRj0weDAKKzAsICAgICAgIDQ1MDUsICAgICAgIDQ1MDUsICAgICAgIDMzLCAgICAgMTYxMSwgMHg5OWFkMTFmZSwgRj0weDAKKzEsICAgICAgIDQ1MDUsICAgICAgIDQ1MDUsICAgICAgIDQ2LCAgICAgIDM3NSwgMHgyMmU0Yjk1YQorMCwgICAgICAgNDUzOCwgICAgICAgNDUzOCwgICAgICAgMzMsICAgICA3MDEwLCAweDdhNjk5ZDAyCisxLCAgICAgICA0NTUxLCAgICAgICA0NTUxLCAgICAgICA0NiwgICAgICAzNzUsIDB4ZmI5NWFkY2UKKzAsICAgICAgIDQ1NzEsICAgICAgIDQ1NzEsICAgICAgIDMzLCAgICAgIDU0OSwgMHgwYWU1MTAyZSwgRj0weDAKKzEsICAgICAgIDQ1OTgsICAgICAgIDQ1OTgsICAgICAgIDQ2LCAgICAgIDM3NiwgMHhhOTEwYjAyYQorMCwgICAgICAgNDYwNSwgICAgICAgNDYwNSwgICAgICAgMzMsICAgICAxMDIxLCAweGU1M2FlYTY3LCBGPTB4MAorMCwgICAgICAgNDYzOCwgICAgICAgNDYzOCwgICAgICAgMzMsICAgICAxMjgxLCAweDUzODA4YWQ1LCBGPTB4MAorMSwgICAgICAgNDY0NCwgICAgICAgNDY0NCwgICAgICAgNDYsICAgICAgMzcyLCAweDVkODRhMmU2CiswLCAgICAgICA0NjcxLCAgICAgICA0NjcxLCAgICAgICAzMywgICAgIDEyNjcsIDB4MmEzYzZhNmQsIEY9MHgwCisxLCAgICAgICA0NjkwLCAgICAgICA0NjkwLCAgICAgICA0NiwgICAgICAzNzEsIDB4Njg0OWE3YjEKKzAsICAgICAgIDQ3MDUsICAgICAgIDQ3MDUsICAgICAgIDMzLCAgICAgMTE0MCwgMHhlMmE0MzZhZCwgRj0weDAKKzEsICAgICAgIDQ3MzcsICAgICAgIDQ3MzcsICAgICAgIDQ2LCAgICAgIDM2NSwgMHhiMGVhYTg3NgorMCwgICAgICAgNDczOCwgICAgICAgNDczOCwgICAgICAgMzMsICAgICAxMjg5LCAweGExMjI3NTM4LCBGPTB4MAorMCwgICAgICAgNDc3MSwgICAgICAgNDc3MSwgICAgICAgMzMsICAgICAxMTI3LCAweGUyYWQyZGU5LCBGPTB4MAorMSwgICAgICAgNDc4MywgICAgICAgNDc4MywgICAgICAgNDYsICAgICAgMzg1LCAweGJlYTNiYTI5CiswLCAgICAgICA0ODA1LCAgICAgICA0ODA1LCAgICAgICAzMywgICAgIDExOTYsIDB4YTE2ZjQ0NWUsIEY9MHgwCisxLCAgICAgICA0ODMwLCAgICAgICA0ODMwLCAgICAgICA0NiwgICAgICAzNjIsIDB4ZDIwZGEzMzkKKzAsICAgICAgIDQ4MzgsICAgICAgIDQ4MzgsICAgICAgIDMzLCAgICAgMTUyMCwgMHg0YTcyZjEzNiwgRj0weDAKKzAsICAgICAgIDQ4NzIsICAgICAgIDQ4NzIsICAgICAgIDMzLCAgICAgMTM3MCwgMHhkZDZlOWJkYSwgRj0weDAKKzEsICAgICAgIDQ4NzYsICAgICAgIDQ4NzYsICAgICAgIDQ2LCAgICAgIDM3MCwgMHhmNzc0YjM5YgorMCwgICAgICAgNDkwNSwgICAgICAgNDkwNSwgICAgICAgMzMsICAgICAxMjMyLCAweDkyOGY2NjQwLCBGPTB4MAorMSwgICAgICAgNDkyMywgICAgICAgNDkyMywgICAgICAgNDYsICAgICAgMzY5LCAweDczODFhY2EzCiswLCAgICAgICA0OTM4LCAgICAgICA0OTM4LCAgICAgICAzMywgICAgIDExNTksIDB4OWRlNDNlOTAsIEY9MHgwCisxLCAgICAgICA0OTY5LCAgICAgICA0OTY5LCAgICAgICA0NiwgICAgICAzNDEsIDB4YmZkNWFjNGMKKzAsICAgICAgIDQ5NzIsICAgICAgIDQ5NzIsICAgICAgIDMzLCAgICAgMTE4MywgMHhjMzYyNTFkOSwgRj0weDAKKzAsICAgICAgIDUwMDUsICAgICAgIDUwMDUsICAgICAgIDMzLCAgICAgMTQ2OSwgMHhiMmIxZjE0NywgRj0weDAKKzEsICAgICAgIDUwMTYsICAgICAgIDUwMTYsICAgICAgIDQ2LCAgICAgIDM1MSwgMHhkMDQ0YTgxMAorMCwgICAgICAgNTAzOCwgICAgICAgNTAzOCwgICAgICAgMzMsICAgICAxNDY4LCAweGI5ODVkZDE4LCBGPTB4MAorMSwgICAgICAgNTA2MiwgICAgICAgNTA2MiwgICAgICAgNDYsICAgICAgMzY1LCAweGRjODBhZjkxCiswLCAgICAgICA1MDcyLCAgICAgICA1MDcyLCAgICAgICAzMywgICAgIDEzNTUsIDB4ZjU4Yzk0MTMsIEY9MHgwCiswLCAgICAgICA1MTA1LCAgICAgICA1MTA1LCAgICAgICAzMywgICAgIDEzMDMsIDB4MTQxNTdkMzIsIEY9MHgwCisxLCAgICAgICA1MTA4LCAgICAgICA1MTA4LCAgICAgICA0NiwgICAgICAzNTgsIDB4ZDZjOGIwYjAKKzAsICAgICAgIDUxMzgsICAgICAgIDUxMzgsICAgICAgIDMzLCAgICAgMTMxNiwgMHgzZmM4OTUzMiwgRj0weDAKKzEsICAgICAgIDUxNTUsICAgICAgIDUxNTUsICAgICAgIDQ2LCAgICAgIDM3MywgMHhhZmExYWQ3ZQorMCwgICAgICAgNTE3MiwgICAgICAgNTE3MiwgICAgICAgMzMsICAgICAxMTk2LCAweDg2OWE1MjlkLCBGPTB4MAorMSwgICAgICAgNTIwMSwgICAgICAgNTIwMSwgICAgICAgNDYsICAgICAgMzY3LCAweDczNjFhZDA3CiswLCAgICAgICA1MjA1LCAgICAgICA1MjA1LCAgICAgICAzMywgICAgIDEyODMsIDB4ZDc3MTc4NDEsIEY9MHgwCiswLCAgICAgICA1MjM5LCAgICAgICA1MjM5LCAgICAgICAzMywgICAgIDE0ODksIDB4MTNhYmVkNGEsIEY9MHgwCisxLCAgICAgICA1MjQ4LCAgICAgICA1MjQ4LCAgICAgICA0NiwgICAgICAzNjQsIDB4MjEwM2FjNTgKKzAsICAgICAgIDUyNzIsICAgICAgIDUyNzIsICAgICAgIDMzLCAgICAgMTUwNywgMHhkYmFlZTUxYSwgRj0weDAKKzEsICAgICAgIDUyOTQsICAgICAgIDUyOTQsICAgICAgIDQ2LCAgICAgIDM0NiwgMHgwMWQ1OWRiZQorMCwgICAgICAgNTMwNSwgICAgICAgNTMwNSwgICAgICAgMzMsICAgICAxMjM3LCAweDgxYjg2NjlmLCBGPTB4MAorMCwgICAgICAgNTMzOSwgICAgICAgNTMzOSwgICAgICAgMzMsICAgICAxMjE3LCAweDNmM2Y2NjYxLCBGPTB4MAorMSwgICAgICAgNTM0MSwgICAgICAgNTM0MSwgICAgICAgNDYsICAgICAgMzYyLCAweGUxMWZhZDdmCiswLCAgICAgICA1MzcyLCAgICAgICA1MzcyLCAgICAgICAzMywgICAgIDEyMjQsIDB4ZTBlODY1M2MsIEY9MHgwCisxLCAgICAgICA1Mzg3LCAgICAgICA1Mzg3LCAgICAgICA0NiwgICAgICAzNjAsIDB4NjNiNWE3YTUKKzAsICAgICAgIDU0MDUsICAgICAgIDU0MDUsICAgICAgIDMzLCAgICAgMTU1NCwgMHg4OGJmMWNiYywgRj0weDAKKzEsICAgICAgIDU0MzMsICAgICAgIDU0MzMsICAgICAgIDQ2LCAgICAgIDM1NiwgMHhjZTQ5YWNjZQorMCwgICAgICAgNTQzOSwgICAgICAgNTQzOSwgICAgICAgMzMsICAgICAxNDY1LCAweGY0MmRkZDc1LCBGPTB4MAorMCwgICAgICAgNTQ3MiwgICAgICAgNTQ3MiwgICAgICAgMzMsICAgICAxODYyLCAweDQyM2M5MzBlLCBGPTB4MAorMSwgICAgICAgNTQ4MCwgICAgICAgNTQ4MCwgICAgICAgNDYsICAgICAgMzY0LCAweDVlMWVhZWJiCiswLCAgICAgICA1NTA2LCAgICAgICA1NTA2LCAgICAgICAzMywgICAgIDE2MDQsIDB4YjRlMjJiNWQsIEY9MHgwCisxLCAgICAgICA1NTI2LCAgICAgICA1NTI2LCAgICAgICA0NiwgICAgICAzNjUsIDB4M2Y5MmFhZDQKKzAsICAgICAgIDU1MzksICAgICAgIDU1MzksICAgICAgIDMzLCAgICAgMTU0MSwgMHgxZTUyZGQ3YiwgRj0weDAKKzAsICAgICAgIDU1NzIsICAgICAgIDU1NzIsICAgICAgIDMzLCAgICAgMTUzNCwgMHg5NmFkZjhiYiwgRj0weDAKKzEsICAgICAgIDU1NzMsICAgICAgIDU1NzMsICAgICAgIDQ2LCAgICAgIDM1NywgMHg4NDkyYWJkYQorMCwgICAgICAgNTYwNiwgICAgICAgNTYwNiwgICAgICAgMzMsICAgICAxMzM2LCAweDBhYWE5MWRkLCBGPTB4MAorMSwgICAgICAgNTYxOSwgICAgICAgNTYxOSwgICAgICAgNDYsICAgICAgMzY3LCAweDU1MjRhYWZiCiswLCAgICAgICA1NjM5LCAgICAgICA1NjM5LCAgICAgICAzMywgICAgIDE3NjEsIDB4ZGU0YjZiMzEsIEY9MHgwCisxLCAgICAgICA1NjY2LCAgICAgICA1NjY2LCAgICAgICA0NiwgICAgICAzNjEsIDB4ZmNjNGIwMTMKKzAsICAgICAgIDU2NzIsICAgICAgIDU2NzIsICAgICAgIDMzLCAgICAgMTcyMiwgMHhhMjlhNWFhZiwgRj0weDAKKzAsICAgICAgIDU3MDYsICAgICAgIDU3MDYsICAgICAgIDMzLCAgICAgMTQ0MiwgMHhlYTBjZTBhNSwgRj0weDAKKzEsICAgICAgIDU3MTIsICAgICAgIDU3MTIsICAgICAgIDQ2LCAgICAgIDM2NywgMHgwN2Q3YTQ2OQorMCwgICAgICAgNTczOSwgICAgICAgNTczOSwgICAgICAgMzMsICAgICAxMzEzLCAweDI4Zjg4OWUxLCBGPTB4MAorMSwgICAgICAgNTc1OSwgICAgICAgNTc1OSwgICAgICAgNDYsICAgICAgMzc1LCAweGQ3ZDFiMmNjCiswLCAgICAgICA1NzcyLCAgICAgICA1NzcyLCAgICAgICAzMywgICAgIDE0MzYsIDB4NTQ2NGQzMmIsIEY9MHgwCisxLCAgICAgICA1ODA1LCAgICAgICA1ODA1LCAgICAgICA0NiwgICAgICAzNTcsIDB4M2UwNWE2N2IKKzAsICAgICAgIDU4MDYsICAgICAgIDU4MDYsICAgICAgIDMzLCAgICAgMTY4OSwgMHg4MTJkNGQzMywgRj0weDAKKzAsICAgICAgIDU4MzksICAgICAgIDU4MzksICAgICAgIDMzLCAgICAgMTQ3MiwgMHg2M2Y4Y2VlNiwgRj0weDAKKzEsICAgICAgIDU4NTEsICAgICAgIDU4NTEsICAgICAgIDQ2LCAgICAgIDM3OSwgMHg5NjhiYWQ5ZAorMCwgICAgICAgNTg3MywgICAgICAgNTg3MywgICAgICAgMzMsICAgICAxNzMwLCAweGFlMTM3MDRjLCBGPTB4MAorMSwgICAgICAgNTg5OCwgICAgICAgNTg5OCwgICAgICAgNDYsICAgICAgMzYxLCAweGE0MGFhYzI2CiswLCAgICAgICA1OTA2LCAgICAgICA1OTA2LCAgICAgICAzMywgICAgIDE1NTUsIDB4ZmU3MDExYmUsIEY9MHgwCiswLCAgICAgICA1OTM5LCAgICAgICA1OTM5LCAgICAgICAzMywgICAgIDE0ODYsIDB4NmRjY2Q2MGIsIEY9MHgwCisxLCAgICAgICA1OTQ0LCAgICAgICA1OTQ0LCAgICAgICA0NiwgICAgICAzNTAsIDB4NDI2MWEyYTcKKzAsICAgICAgIDU5NzMsICAgICAgIDU5NzMsICAgICAgIDMzLCAgICAgMTMxMSwgMHg0YTY0ODIyYiwgRj0weDAKKzEsICAgICAgIDU5OTEsICAgICAgIDU5OTEsICAgICAgIDQ2LCAgICAgIDMzOSwgMHgwMzBkYTE1ZgorMCwgICAgICAgNjAwNiwgICAgICAgNjAwNiwgICAgICAgMzMsICAgICAxNzAwLCAweDQyNTgzZGVmLCBGPTB4MAorMSwgICAgICAgNjAzNywgICAgICAgNjAzNywgICAgICAgNDYsICAgICAgMzM2LCAweDJiYjY5OWRiCiswLCAgICAgICA2MDM5LCAgICAgICA2MDM5LCAgICAgICAzMywgICAgIDE2NDcsIDB4OTdhNTNlN2QsIEY9MHgwCiswLCAgICAgICA2MDczLCAgICAgICA2MDczLCAgICAgICAzMywgICAgIDE2NjMsIDB4NzIzNjM4NTIsIEY9MHgwCisxLCAgICAgICA2MDg0LCAgICAgICA2MDg0LCAgICAgICA0NiwgICAgICAzMzEsIDB4YzNiMTllZGMKKzAsICAgICAgIDYxMDYsICAgICAgIDYxMDYsICAgICAgIDMzLCAgICAgMTUxMiwgMHhkYTExZTgwYSwgRj0weDAKKzEsICAgICAgIDYxMzAsICAgICAgIDYxMzAsICAgICAgIDQ2LCAgICAgIDMzNSwgMHhkYTZlOTg5MQorMCwgICAgICAgNjEzOSwgICAgICAgNjEzOSwgICAgICAgMzMsICAgICAxMzcwLCAweDI2MThhOTI3LCBGPTB4MAorMCwgICAgICAgNjE3MywgICAgICAgNjE3MywgICAgICAgMzMsICAgICAxNDQwLCAweGFkZDdiYWYwLCBGPTB4MAorMSwgICAgICAgNjE3NywgICAgICAgNjE3NywgICAgICAgNDYsICAgICAgMzIzLCAweGRjZDk5NDNmCiswLCAgICAgICA2MjA2LCAgICAgICA2MjA2LCAgICAgICAzMywgICAgIDE1NzQsIDB4YTJlMzA1ZTgsIEY9MHgwCisxLCAgICAgICA2MjIzLCAgICAgICA2MjIzLCAgICAgICA0NiwgICAgICAzMzMsIDB4MzRmNjk2MzAKKzAsICAgICAgIDYyNDAsICAgICAgIDYyNDAsICAgICAgIDMzLCAgICAgMTMyOCwgMHg1M2JhYTAzNSwgRj0weDAKKzEsICAgICAgIDYyNjksICAgICAgIDYyNjksICAgICAgIDQ2LCAgICAgIDMzNSwgMHgyZWQ3OWRhYgorMCwgICAgICAgNjI3MywgICAgICAgNjI3MywgICAgICAgMzMsICAgICAxODAyLCAweGM5MTc4MmFhLCBGPTB4MAorMCwgICAgICAgNjMwNiwgICAgICAgNjMwNiwgICAgICAgMzMsICAgICAxNjE5LCAweDQ0M2MzYWU2LCBGPTB4MAorMSwgICAgICAgNjMxNiwgICAgICAgNjMxNiwgICAgICAgNDYsICAgICAgMzM0LCAweDJiMGU5NzA0CiswLCAgICAgICA2MzQwLCAgICAgICA2MzQwLCAgICAgICAzMywgICAgIDE0NzEsIDB4ZTNhOGRlZmMsIEY9MHgwCisxLCAgICAgICA2MzYyLCAgICAgICA2MzYyLCAgICAgICA0NiwgICAgICAzNDIsIDB4ZjQ3ZjljOTcKKzAsICAgICAgIDYzNzMsICAgICAgIDYzNzMsICAgICAgIDMzLCAgICAgMTIyNiwgMHhmZDJmNWIzYiwgRj0weDAKKzAsICAgICAgIDY0MDYsICAgICAgIDY0MDYsICAgICAgIDMzLCAgICAgMTQ4NSwgMHhlZDhiZTAxMSwgRj0weDAKKzEsICAgICAgIDY0MDksICAgICAgIDY0MDksICAgICAgIDQ2LCAgICAgIDM1OCwgMHhkNmE2YWFkOQorMCwgICAgICAgNjQ0MCwgICAgICAgNjQ0MCwgICAgICAgMzMsICAgICAxNzg2LCAweGY5ODU3MmVlLCBGPTB4MAorMSwgICAgICAgNjQ1NSwgICAgICAgNjQ1NSwgICAgICAgNDYsICAgICAgMzYwLCAweGJmNWVhNDYwCiswLCAgICAgICA2NDczLCAgICAgICA2NDczLCAgICAgICAzMywgICAgIDEzNDUsIDB4YzdkMzlhNmEsIEY9MHgwCisxLCAgICAgICA2NTAyLCAgICAgICA2NTAyLCAgICAgICA0NiwgICAgICAzNTcsIDB4ZTViYmE3NWMKKzAsICAgICAgIDY1MDcsICAgICAgIDY1MDcsICAgICAgIDMzLCAgICAgODI3NSwgMHg3YTcxMTVmNworMCwgICAgICAgNjU0MCwgICAgICAgNjU0MCwgICAgICAgMzMsICAgICAgNjk4LCAweDQ1OTU1ZGUwLCBGPTB4MAorMSwgICAgICAgNjU0OCwgICAgICAgNjU0OCwgICAgICAgNDYsICAgICAgMzM2LCAweDlkYTg5YmFmCiswLCAgICAgICA2NTczLCAgICAgICA2NTczLCAgICAgICAzMywgICAgIDEyOTgsIDB4MzgyYThlMzksIEY9MHgwCisxLCAgICAgICA2NTk0LCAgICAgICA2NTk0LCAgICAgICA0NiwgICAgICAzNDMsIDB4MGY3NDllZDMKKzAsICAgICAgIDY2MDcsICAgICAgIDY2MDcsICAgICAgIDMzLCAgICAgMTQ1NCwgMHhiNmU0YzhjMSwgRj0weDAKKzAsICAgICAgIDY2NDAsICAgICAgIDY2NDAsICAgICAgIDMzLCAgICAgMTM1MiwgMHgzOTczOGM1NSwgRj0weDAKKzEsICAgICAgIDY2NDEsICAgICAgIDY2NDEsICAgICAgIDQ2LCAgICAgIDMyNCwgMHg2Mzk4OTM3NgorMCwgICAgICAgNjY3MywgICAgICAgNjY3MywgICAgICAgMzMsICAgICAxNjA5LCAweGFmNjAxY2I3LCBGPTB4MAorMSwgICAgICAgNjY4NywgICAgICAgNjY4NywgICAgICAgNDYsICAgICAgMzIyLCAweDVjNDI5NTE0CiswLCAgICAgICA2NzA3LCAgICAgICA2NzA3LCAgICAgICAzMywgICAgIDE0NzYsIDB4YzAyMGRlMGMsIEY9MHgwCisxLCAgICAgICA2NzM0LCAgICAgICA2NzM0LCAgICAgICA0NiwgICAgICAzMjgsIDB4YWQ2NjkwMzkKKzAsICAgICAgIDY3NDAsICAgICAgIDY3NDAsICAgICAgIDMzLCAgICAgMTM5MSwgMHhkNDViYWYwYywgRj0weDAKKzAsICAgICAgIDY3NzMsICAgICAgIDY3NzMsICAgICAgIDMzLCAgICAgMTIwMywgMHgyMjg1NWVkMCwgRj0weDAKKzEsICAgICAgIDY3ODAsICAgICAgIDY3ODAsICAgICAgIDQ2LCAgICAgIDMzMiwgMHgyMWZiOTc4NworMCwgICAgICAgNjgwNywgICAgICAgNjgwNywgICAgICAgMzMsICAgICAxNDg5LCAweDFjZTRlM2Q2LCBGPTB4MAorMSwgICAgICAgNjgyNywgICAgICAgNjgyNywgICAgICAgNDYsICAgICAgMzQzLCAweDY2M2M5ZDdhCiswLCAgICAgICA2ODQwLCAgICAgICA2ODQwLCAgICAgICAzMywgICAgIDE2NTUsIDB4MGY1YzMwZjEsIEY9MHgwCisxLCAgICAgICA2ODczLCAgICAgICA2ODczLCAgICAgICA0NiwgICAgICAzNDMsIDB4ZWE4NmE5MDIKKzAsICAgICAgIDY4NzQsICAgICAgIDY4NzQsICAgICAgIDMzLCAgICAgMTM2MywgMHg5N2I3YWQ4ZSwgRj0weDAKKzAsICAgICAgIDY5MDcsICAgICAgIDY5MDcsICAgICAgIDMzLCAgICAgMTQ5MiwgMHgxNzdlZWQ1ZCwgRj0weDAKKzEsICAgICAgIDY5MjAsICAgICAgIDY5MjAsICAgICAgIDQ2LCAgICAgIDMyNywgMHhjMzY1OTQ4NgorMCwgICAgICAgNjk0MCwgICAgICAgNjk0MCwgICAgICAgMzMsICAgICAxMzk3LCAweGZmNTdiZjRiLCBGPTB4MAorMSwgICAgICAgNjk2NiwgICAgICAgNjk2NiwgICAgICAgNDYsICAgICAgMzI2LCAweDMyNDVhMDg4CiswLCAgICAgICA2OTc0LCAgICAgICA2OTc0LCAgICAgICAzMywgICAgIDEyNTEsIDB4MWJjZDcyMjEsIEY9MHgwCiswLCAgICAgICA3MDA3LCAgICAgICA3MDA3LCAgICAgICAzMywgICAgIDE1ODYsIDB4ZThkMTAyYWMsIEY9MHgwCisxLCAgICAgICA3MDEyLCAgICAgICA3MDEyLCAgICAgICA0NiwgICAgICAzMjQsIDB4M2Y5YThmMWQKKzAsICAgICAgIDcwNDAsICAgICAgIDcwNDAsICAgICAgIDMzLCAgICAgMTMzMywgMHgyYmYwYTFkYSwgRj0weDAKKzEsICAgICAgIDcwNTksICAgICAgIDcwNTksICAgICAgIDQ2LCAgICAgIDMxMiwgMHhiYzk2OTI4NgorMCwgICAgICAgNzA3NCwgICAgICAgNzA3NCwgICAgICAgMzMsICAgICAyNzIzLCAweDU3NmYzYWNlLCBGPTB4MAorMSwgICAgICAgNzEwNSwgICAgICAgNzEwNSwgICAgICAgNDYsICAgICAgMzA4LCAweGJjMGE4Yzk2CiswLCAgICAgICA3MTA3LCAgICAgICA3MTA3LCAgICAgICAzMywgICAgICA2MzIsIDB4ZTkyNTNlZmQsIEY9MHgwCiswLCAgICAgICA3MTQwLCAgICAgICA3MTQwLCAgICAgICAzMywgICAgICA0NDQsIDB4NzAxZWQ5MjQsIEY9MHgwCisxLCAgICAgICA3MTUyLCAgICAgICA3MTUyLCAgICAgICA0NiwgICAgICAzMDgsIDB4ZmRhMzgzNDUKKzAsICAgICAgIDcxNzQsICAgICAgIDcxNzQsICAgICAgIDMzLCAgICAgMTAxMywgMHhkMjdmMDEyMywgRj0weDAKKzEsICAgICAgIDcxOTgsICAgICAgIDcxOTgsICAgICAgIDQ2LCAgICAgIDMxOCwgMHg0Njk4OTNhZAorMCwgICAgICAgNzIwNywgICAgICAgNzIwNywgICAgICAgMzMsICAgICAxMzU3LCAweDQ2OTc5MjA1LCBGPTB4MAorMCwgICAgICAgNzI0MSwgICAgICAgNzI0MSwgICAgICAgMzMsICAgICAxNTg2LCAweDNlOTgyNGY4LCBGPTB4MAorMSwgICAgICAgNzI0NSwgICAgICAgNzI0NSwgICAgICAgNDYsICAgICAgMzMxLCAweDJkNjI5ZWUyCiswLCAgICAgICA3Mjc0LCAgICAgICA3Mjc0LCAgICAgICAzMywgICAgIDI1MTQsIDB4NDMyOWViM2QsIEY9MHgwCisxLCAgICAgICA3MjkxLCAgICAgICA3MjkxLCAgICAgICA0NiwgICAgICAzMjksIDB4NjM2MTk0OGUKKzAsICAgICAgIDczMDcsICAgICAgIDczMDcsICAgICAgIDMzLCAgICAgIDQ1MCwgMHhhNzEwZTNkMywgRj0weDAKKzEsICAgICAgIDczMzgsICAgICAgIDczMzgsICAgICAgIDQ2LCAgICAgIDMzMywgMHg2ZTE2OWEyMQorMCwgICAgICAgNzM0MSwgICAgICAgNzM0MSwgICAgICAgMzMsICAgICAgNDIzLCAweGIyMzljNmNmLCBGPTB4MAorMCwgICAgICAgNzM3NCwgICAgICAgNzM3NCwgICAgICAgMzMsICAgICAxMTYxLCAweDJlODEzMjQ0LCBGPTB4MAorMSwgICAgICAgNzM4NCwgICAgICAgNzM4NCwgICAgICAgNDYsICAgICAgMzE0LCAweDM3ZTc4NjE1CiswLCAgICAgICA3NDA3LCAgICAgICA3NDA3LCAgICAgICAzMywgICAgIDEzNjYsIDB4Yzg1ZWFiNzQsIEY9MHgwCisxLCAgICAgICA3NDMwLCAgICAgICA3NDMwLCAgICAgICA0NiwgICAgICAzMDQsIDB4NTgwZDkyMzYKKzAsICAgICAgIDc0NDEsICAgICAgIDc0NDEsICAgICAgIDMzLCAgICAgMTMyNSwgMHg1MzkzOGE5NSwgRj0weDAKKzAsICAgICAgIDc0NzQsICAgICAgIDc0NzQsICAgICAgIDMzLCAgICAgMjY4NywgMHg0MDM4MzU0NywgRj0weDAKKzEsICAgICAgIDc0NzcsICAgICAgIDc0NzcsICAgICAgIDQ2LCAgICAgIDI5OSwgMHgzZTQxODk5YQorMCwgICAgICAgNzUwOCwgICAgICAgNzUwOCwgICAgICAgMzMsICAgICAgNjc4LCAweDBjNTY1NzVkLCBGPTB4MAorMSwgICAgICAgNzUyMywgICAgICAgNzUyMywgICAgICAgNDYsICAgICAgMzExLCAweGY2MmY4ODFiCiswLCAgICAgICA3NTQxLCAgICAgICA3NTQxLCAgICAgICAzMywgICAgICA0OTEsIDB4ZGFmZWYwNWUsIEY9MHgwCisxLCAgICAgICA3NTcwLCAgICAgICA3NTcwLCAgICAgICA0NiwgICAgICAzMjMsIDB4NjhhMDkzNTMKKzAsICAgICAgIDc1NzQsICAgICAgIDc1NzQsICAgICAgIDMzLCAgICAgMTA1NiwgMHgzZTU2MTZmYywgRj0weDAKKzAsICAgICAgIDc2MDgsICAgICAgIDc2MDgsICAgICAgIDMzLCAgICAgMTU0OSwgMHg1ZGNiMDRjNywgRj0weDAKKzEsICAgICAgIDc2MTYsICAgICAgIDc2MTYsICAgICAgIDQ2LCAgICAgIDMxNywgMHhmOWY4OGRlOAorMCwgICAgICAgNzY0MSwgICAgICAgNzY0MSwgICAgICAgMzMsICAgICAyNTAyLCAweDFjMjFkZDZiLCBGPTB4MAorMSwgICAgICAgNzY2MywgICAgICAgNzY2MywgICAgICAgNDYsICAgICAgMzIyLCAweDIwNGE5NzBmCiswLCAgICAgICA3Njc0LCAgICAgICA3Njc0LCAgICAgICAzMywgICAgICA1MzksIDB4ZWYxZDBlOGQsIEY9MHgwCiswLCAgICAgICA3NzA4LCAgICAgICA3NzA4LCAgICAgICAzMywgICAgICA1OTQsIDB4MTVmMzI0ZDYsIEY9MHgwCisxLCAgICAgICA3NzA5LCAgICAgICA3NzA5LCAgICAgICA0NiwgICAgICAzMjksIDB4MWM0YzllZTgKKzAsICAgICAgIDc3NDEsICAgICAgIDc3NDEsICAgICAgIDMzLCAgICAgMTI1NCwgMHhlNDkwNzhjYiwgRj0weDAKKzEsICAgICAgIDc3NTUsICAgICAgIDc3NTUsICAgICAgIDQ2LCAgICAgIDM0MiwgMHhjODI1YWEzNQorMCwgICAgICAgNzc3NCwgICAgICAgNzc3NCwgICAgICAgMzMsICAgICAxMzQxLCAweGZiNzg5Mzg2LCBGPTB4MAorMSwgICAgICAgNzgwMiwgICAgICAgNzgwMiwgICAgICAgNDYsICAgICAgMzMxLCAweDZkMWM5YzMzCiswLCAgICAgICA3ODA4LCAgICAgICA3ODA4LCAgICAgICAzMywgICAgIDEzNTgsIDB4NWE3MTk0YWQsIEY9MHgwCiswLCAgICAgICA3ODQxLCAgICAgICA3ODQxLCAgICAgICAzMywgICAgIDIzMzYsIDB4NTM4ZjhhMTYsIEY9MHgwCisxLCAgICAgICA3ODQ4LCAgICAgICA3ODQ4LCAgICAgICA0NiwgICAgICAzNDMsIDB4NTc3Y2E1MDQKKzAsICAgICAgIDc4NzUsICAgICAgIDc4NzUsICAgICAgIDMzLCAgICAgIDMzOSwgMHg5OTM1YTVmOSwgRj0weDAKKzEsICAgICAgIDc4OTUsICAgICAgIDc4OTUsICAgICAgIDQ2LCAgICAgIDMyNywgMHhhZmI3OWJmZQorMCwgICAgICAgNzkwOCwgICAgICAgNzkwOCwgICAgICAgMzMsICAgICAyMTU5LCAweDIwNjU0ZGJjLCBGPTB4MAorMCwgICAgICAgNzk0MSwgICAgICAgNzk0MSwgICAgICAgMzMsICAgICAgMzkwLCAweGU2YzhiZDkwLCBGPTB4MAorMSwgICAgICAgNzk0MSwgICAgICAgNzk0MSwgICAgICAgNDYsICAgICAgMzE3LCAweDc3M2U4Nzc4CiswLCAgICAgICA3OTc1LCAgICAgICA3OTc1LCAgICAgICAzMywgICAgICA0NzksIDB4ZWZiYWYwMjAsIEY9MHgwCisxLCAgICAgICA3OTg4LCAgICAgICA3OTg4LCAgICAgICA0NiwgICAgICAzMTMsIDB4MzU3ZDkzYWQKKzAsICAgICAgIDgwMDgsICAgICAgIDgwMDgsICAgICAgIDMzLCAgICAgMjE1NywgMHg1Y2M1Mzk4YiwgRj0weDAKKzEsICAgICAgIDgwMzQsICAgICAgIDgwMzQsICAgICAgIDQ2LCAgICAgIDMxMiwgMHhhYTk3ODk0NQorMCwgICAgICAgODA0MSwgICAgICAgODA0MSwgICAgICAgMzMsICAgICAgNDI5LCAweDVkYmVjYjUyLCBGPTB4MAorMCwgICAgICAgODA3NSwgICAgICAgODA3NSwgICAgICAgMzMsICAgICAxOTUzLCAweGRiNTVkNDI5LCBGPTB4MAorMSwgICAgICAgODA4MSwgICAgICAgODA4MSwgICAgICAgNDYsICAgICAgMzE4LCAweDdhMGQ4YzE5CiswLCAgICAgICA4MTA4LCAgICAgICA4MTA4LCAgICAgICAzMywgICAgICAzNzksIDB4MWQ2MmJhNGUsIEY9MHgwCisxLCAgICAgICA4MTI3LCAgICAgICA4MTI3LCAgICAgICA0NiwgICAgICAzMjUsIDB4NTc3YTk4NjgKKzAsICAgICAgIDgxNDEsICAgICAgIDgxNDEsICAgICAgIDMzLCAgICAgMTgxNywgMHg0NGZhODk5NiwgRj0weDAKKzEsICAgICAgIDgxNzMsICAgICAgIDgxNzMsICAgICAgIDQ2LCAgICAgIDMxNywgMHg4ZWY5OTRhNworMCwgICAgICAgODE3NSwgICAgICAgODE3NSwgICAgICAgMzMsICAgICAgMzcyLCAweDAyM2RiODBlLCBGPTB4MAorMCwgICAgICAgODIwOCwgICAgICAgODIwOCwgICAgICAgMzMsICAgICAxNjY0LCAweGQyZDE0YjNmLCBGPTB4MAorMSwgICAgICAgODIyMCwgICAgICAgODIyMCwgICAgICAgNDYsICAgICAgMzA4LCAweDBmYmQ4ZTkxCiswLCAgICAgICA4MjQyLCAgICAgICA4MjQyLCAgICAgICAzMywgICAgICAzNDAsIDB4YzUzN2FhNDIsIEY9MHgwCisxLCAgICAgICA4MjY2LCAgICAgICA4MjY2LCAgICAgICA0NiwgICAgICAzMDksIDB4MzFjMjhmMWQKKzAsICAgICAgIDgyNzUsICAgICAgIDgyNzUsICAgICAgIDMzLCAgICAgMTk1NSwgMHg3NmY4Y2RiMywgRj0weDAKKzAsICAgICAgIDgzMDgsICAgICAgIDgzMDgsICAgICAgIDMzLCAgICAgIDQ4NSwgMHg1YjA1ZjFkNiwgRj0weDAKKzEsICAgICAgIDgzMTMsICAgICAgIDgzMTMsICAgICAgIDQ2LCAgICAgIDMxNSwgMHhjMjdmOGNiYgorMCwgICAgICAgODM0MiwgICAgICAgODM0MiwgICAgICAgMzMsICAgICAxNzA1LCAweDE4Mzg1YTU5LCBGPTB4MAorMSwgICAgICAgODM1OSwgICAgICAgODM1OSwgICAgICAgNDYsICAgICAgMzQwLCAweDIxYjNhMzNmCiswLCAgICAgICA4Mzc1LCAgICAgICA4Mzc1LCAgICAgICAzMywgICAgICA0MTEsIDB4NzBkN2NhZTUsIEY9MHgwCisxLCAgICAgICA4NDA2LCAgICAgICA4NDA2LCAgICAgICA0NiwgICAgICAzMjYsIDB4YzRmZDkwZjMKKzAsICAgICAgIDg0MDgsICAgICAgIDg0MDgsICAgICAgIDMzLCAgICAgMTgxOCwgMHg5ZDYzODFlYiwgRj0weDAKKzAsICAgICAgIDg0NDIsICAgICAgIDg0NDIsICAgICAgIDMzLCAgICAgIDMwNCwgMHg3ODI1OTIxZiwgRj0weDAKKzEsICAgICAgIDg0NTIsICAgICAgIDg0NTIsICAgICAgIDQ2LCAgICAgIDMzMywgMHhlODc0OTYxYworMCwgICAgICAgODQ3NSwgICAgICAgODQ3NSwgICAgICAgMzMsICAgICA2MzAyLCAweDAxNmM2NmVmCisxLCAgICAgICA4NDk5LCAgICAgICA4NDk5LCAgICAgICA0NiwgICAgICAzNDAsIDB4MzQyYzljZTgKKzAsICAgICAgIDg1MDksICAgICAgIDg1MDksICAgICAgIDMzLCAgICAgMTQ5OCwgMHg0MmI0ZWY5MSwgRj0weDAKKzAsICAgICAgIDg1NDIsICAgICAgIDg1NDIsICAgICAgIDMzLCAgICAgIDQzNCwgMHhhMjg1ZGI0NiwgRj0weDAKKzEsICAgICAgIDg1NDUsICAgICAgIDg1NDUsICAgICAgIDQ2LCAgICAgIDMzOCwgMHgyMDRiOWMxZAorMCwgICAgICAgODU3NSwgICAgICAgODU3NSwgICAgICAgMzMsICAgICAxNjQzLCAweGUwZDMyMmIxLCBGPTB4MAorMSwgICAgICAgODU5MSwgICAgICAgODU5MSwgICAgICAgNDYsICAgICAgMzU3LCAweGE0YjA5ZmFiCiswLCAgICAgICA4NjA5LCAgICAgICA4NjA5LCAgICAgICAzMywgICAgICAyMTMsIDB4ZmMxYjY0YjQsIEY9MHgwCisxLCAgICAgICA4NjM4LCAgICAgICA4NjM4LCAgICAgICA0NiwgICAgICAzNDAsIDB4N2JmYTlmN2QKKzAsICAgICAgIDg2NDIsICAgICAgIDg2NDIsICAgICAgIDMzLCAgICAgMTgyMCwgMHg2MTI1NzdhNSwgRj0weDAKKzAsICAgICAgIDg2NzUsICAgICAgIDg2NzUsICAgICAgIDMzLCAgICAgIDI2NCwgMHgxYjNiN2Q2MywgRj0weDAKKzEsICAgICAgIDg2ODQsICAgICAgIDg2ODQsICAgICAgIDQ2LCAgICAgIDMzNSwgMHg5NjVlOWNhMAorMCwgICAgICAgODcwOSwgICAgICAgODcwOSwgICAgICAgMzMsICAgICAxNDYxLCAweDYzOTJkMWQwLCBGPTB4MAorMSwgICAgICAgODczMSwgICAgICAgODczMSwgICAgICAgNDYsICAgICAgMzIyLCAweDI3ODc5MWI3CiswLCAgICAgICA4NzQyLCAgICAgICA4NzQyLCAgICAgICAzMywgICAgICAyMzksIDB4MzQyMDZlODEsIEY9MHgwCiswLCAgICAgICA4Nzc1LCAgICAgICA4Nzc1LCAgICAgICAzMywgICAgIDE1ODEsIDB4YTUzNzE0Y2EsIEY9MHgwCisxLCAgICAgICA4Nzc3LCAgICAgICA4Nzc3LCAgICAgICA0NiwgICAgICAzMTgsIDB4YWM5NjkxMGMKKzAsICAgICAgIDg4MDksICAgICAgIDg4MDksICAgICAgIDMzLCAgICAgIDIxMiwgMHgzNTZlNjUwMiwgRj0weDAKKzEsICAgICAgIDg4MjQsICAgICAgIDg4MjQsICAgICAgIDQ2LCAgICAgIDMyNiwgMHhkYjI4OTdjNgorMCwgICAgICAgODg0MiwgICAgICAgODg0MiwgICAgICAgMzMsICAgICAxMzUxLCAweDQyZjViYjk2LCBGPTB4MAorMSwgICAgICAgODg3MCwgICAgICAgODg3MCwgICAgICAgNDYsICAgICAgMzQxLCAweDZlMDBhN2JhCiswLCAgICAgICA4ODc2LCAgICAgICA4ODc2LCAgICAgICAzMywgICAgICA0NDgsIDB4ODJhZmQ4ODcsIEY9MHgwCiswLCAgICAgICA4OTA5LCAgICAgICA4OTA5LCAgICAgICAzMywgICAgIDE0MDMsIDB4NDYxY2MwZmEsIEY9MHgwCisxLCAgICAgICA4OTE2LCAgICAgICA4OTE2LCAgICAgICA0NiwgICAgICAzMTksIDB4ZmU4ZDhmMTEKKzAsICAgICAgIDg5NDIsICAgICAgIDg5NDIsICAgICAgIDMzLCAgICAgIDQ5MSwgMHhjYzM2ZjBhYywgRj0weDAKKzEsICAgICAgIDg5NjMsICAgICAgIDg5NjMsICAgICAgIDQ2LCAgICAgIDMwMywgMHhhODFjODQxOAorMCwgICAgICAgODk3NiwgICAgICAgODk3NiwgICAgICAgMzMsICAgICAxNjA2LCAweGU2NTcyMzgxLCBGPTB4MAorMCwgICAgICAgOTAwOSwgICAgICAgOTAwOSwgICAgICAgMzMsICAgICAgMzA0LCAweDE3ZDQ5ZTdiLCBGPTB4MAorMSwgICAgICAgOTAwOSwgICAgICAgOTAwOSwgICAgICAgNDYsICAgICAgMjkxLCAweDkzMWE4OGE4CiswLCAgICAgICA5MDQyLCAgICAgICA5MDQyLCAgICAgICAzMywgICAgIDE1MzcsIDB4MjUwNjAyN2MsIEY9MHgwCisxLCAgICAgICA5MDU2LCAgICAgICA5MDU2LCAgICAgICA0NiwgICAgICAzMDcsIDB4ZDA2YzhkZTkKKzAsICAgICAgIDkwNzYsICAgICAgIDkwNzYsICAgICAgIDMzLCAgICAgIDM0MiwgMHgyN2MxYTdkNywgRj0weDAKKzEsICAgICAgIDkxMDIsICAgICAgIDkxMDIsICAgICAgIDQ2LCAgICAgIDMzNSwgMHhjNDQ0OWU5NAorMCwgICAgICAgOTEwOSwgICAgICAgOTEwOSwgICAgICAgMzMsICAgICAxNDA1LCAweDJmYmJjYjg5LCBGPTB4MAorMCwgICAgICAgOTE0MiwgICAgICAgOTE0MiwgICAgICAgMzMsICAgICAgMzUxLCAweDU1MjliMDQ3LCBGPTB4MAorMSwgICAgICAgOTE0OSwgICAgICAgOTE0OSwgICAgICAgNDYsICAgICAgMzQ4LCAweGIzNDdhMDAwCiswLCAgICAgICA5MTc2LCAgICAgICA5MTc2LCAgICAgICAzMywgICAgIDE0NTEsIDB4OTQ1NWQ5NmIsIEY9MHgwCisxLCAgICAgICA5MTk1LCAgICAgICA5MTk1LCAgICAgICA0NiwgICAgICAzNDYsIDB4YjM2ZWE1YTIKKzAsICAgICAgIDkyMDksICAgICAgIDkyMDksICAgICAgIDMzLCAgICAgIDQ5MCwgMHhkYTAwZjFhYiwgRj0weDAKKzEsICAgICAgIDkyNDIsICAgICAgIDkyNDIsICAgICAgIDQ2LCAgICAgIDMzMywgMHhmZWM2OWU1NgorMCwgICAgICAgOTI0MywgICAgICAgOTI0MywgICAgICAgMzMsICAgICAxNTI0LCAweDc3NTJlZGZmLCBGPTB4MAorMCwgICAgICAgOTI3NiwgICAgICAgOTI3NiwgICAgICAgMzMsICAgICAgNTU2LCAweGVhNGYwZTI0LCBGPTB4MAorMSwgICAgICAgOTI4OCwgICAgICAgOTI4OCwgICAgICAgNDYsICAgICAgMzM4LCAweDI0YTY5NGMwCiswLCAgICAgICA5MzA5LCAgICAgICA5MzA5LCAgICAgICAzMywgICAgIDE0MTQsIDB4NzgwZWNiMjYsIEY9MHgwCisxLCAgICAgICA5MzM0LCAgICAgICA5MzM0LCAgICAgICA0NiwgICAgICAzMjgsIDB4YmYwNDk4ZWEKKzAsICAgICAgIDkzNDMsICAgICAgIDkzNDMsICAgICAgIDMzLCAgICAgIDgwOCwgMHhlNjBiODVkNCwgRj0weDAKKzAsICAgICAgIDkzNzYsICAgICAgIDkzNzYsICAgICAgIDMzLCAgICAgIDg3MSwgMHhjNDlhYjAxYSwgRj0weDAKKzEsICAgICAgIDkzODEsICAgICAgIDkzODEsICAgICAgIDQ2LCAgICAgIDMzNCwgMHg3MjViOTdkYQorMCwgICAgICAgOTQwOSwgICAgICAgOTQwOSwgICAgICAgMzMsICAgICAgNTYyLCAweDViZjExNTM3LCBGPTB4MAorMSwgICAgICAgOTQyNywgICAgICAgOTQyNywgICAgICAgNDYsICAgICAgMzY0LCAweDQ0MDg5ZjUwCiswLCAgICAgICA5NDQzLCAgICAgICA5NDQzLCAgICAgICAzMywgICAgICA3MTEsIDB4NDFkYjVhOWEsIEY9MHgwCisxLCAgICAgICA5NDc0LCAgICAgICA5NDc0LCAgICAgICA0NiwgICAgICAzNTAsIDB4ZWRlYjllMWQKKzAsICAgICAgIDk0NzYsICAgICAgIDk0NzYsICAgICAgIDMzLCAgICAgMTIwOSwgMHg5NzdjNGUzMSwgRj0weDAKKzAsICAgICAgIDk1MTAsICAgICAgIDk1MTAsICAgICAgIDMzLCAgICAgIDQ4MywgMHhkODgzZTY4OSwgRj0weDAKKzEsICAgICAgIDk1MjAsICAgICAgIDk1MjAsICAgICAgIDQ2LCAgICAgIDM0OCwgMHg1ZGQzOWM0YQorMCwgICAgICAgOTU0MywgICAgICAgOTU0MywgICAgICAgMzMsICAgICAgNDIyLCAweGY3ZTNkMzY2LCBGPTB4MAorMSwgICAgICAgOTU2NywgICAgICAgOTU2NywgICAgICAgNDYsICAgICAgMzU0LCAweDIwMmQ5ZWZmCiswLCAgICAgICA5NTc2LCAgICAgICA5NTc2LCAgICAgICAzMywgICAgICA1MzMsIDB4N2RhNzA1NTUsIEY9MHgwCiswLCAgICAgICA5NjEwLCAgICAgICA5NjEwLCAgICAgICAzMywgICAgICA0OTAsIDB4YjIwOWUyNjEsIEY9MHgwCisxLCAgICAgICA5NjEzLCAgICAgICA5NjEzLCAgICAgICA0NiwgICAgICAzNTgsIDB4ZGQzZWE5OTgKKzAsICAgICAgIDk2NDMsICAgICAgIDk2NDMsICAgICAgIDMzLCAgICAgIDk3MiwgMHgwY2YyZTRiMCwgRj0weDAKKzEsICAgICAgIDk2NjAsICAgICAgIDk2NjAsICAgICAgIDQ2LCAgICAgIDM2MSwgMHhhN2I2YTRjNgorMCwgICAgICAgOTY3NiwgICAgICAgOTY3NiwgICAgICAgMzMsICAgICAgMzcwLCAweDc1YmZhZmQ1LCBGPTB4MAorMSwgICAgICAgOTcwNiwgICAgICAgOTcwNiwgICAgICAgNDYsICAgICAgMzU0LCAweGEyMGFhMDU5CiswLCAgICAgICA5NzEwLCAgICAgICA5NzEwLCAgICAgICAzMywgICAgICAzNDgsIDB4ZjA5NGE0OGEsIEY9MHgwCiswLCAgICAgICA5NzQzLCAgICAgICA5NzQzLCAgICAgICAzMywgICAgICA0NDksIDB4YTA4ZGUyOWUsIEY9MHgwCisxLCAgICAgICA5NzUyLCAgICAgICA5NzUyLCAgICAgICA0NiwgICAgICAzNjksIDB4ODFjOWFmNzQKKzAsICAgICAgIDk3NzYsICAgICAgIDk3NzYsICAgICAgIDMzLCAgICAgIDQ0NywgMHg5MzkyZDdiZiwgRj0weDAKKzEsICAgICAgIDk3OTksICAgICAgIDk3OTksICAgICAgIDQ2LCAgICAgIDM1OSwgMHhiYmQ0YjA2ZQorMCwgICAgICAgOTgxMCwgICAgICAgOTgxMCwgICAgICAgMzMsICAgICAgNDE0LCAweGNjNjJjOTdlLCBGPTB4MAorMCwgICAgICAgOTg0MywgICAgICAgOTg0MywgICAgICAgMzMsICAgICAgNDY3LCAweDM3YTVlOWUwLCBGPTB4MAorMSwgICAgICAgOTg0NSwgICAgICAgOTg0NSwgICAgICAgNDYsICAgICAgMzQ4LCAweDFmMmJhMGJiCiswLCAgICAgICA5ODc3LCAgICAgICA5ODc3LCAgICAgICAzMywgICAgICA4OTAsIDB4MTA3ZmIxYTMsIEY9MHgwCisxLCAgICAgICA5ODkyLCAgICAgICA5ODkyLCAgICAgICA0NiwgICAgICAzNDYsIDB4MGFkNWEwOGMKKzAsICAgICAgIDk5MTAsICAgICAgIDk5MTAsICAgICAgIDMzLCAgICAgIDM4NywgMHg4NzZlYzBhYiwgRj0weDAKKzEsICAgICAgIDk5MzgsICAgICAgIDk5MzgsICAgICAgIDQ2LCAgICAgIDM1MCwgMHg5ODAyYTgzMAorMCwgICAgICAgOTk0MywgICAgICAgOTk0MywgICAgICAgMzMsICAgICAgMzUxLCAweDJlZDdhMzU1LCBGPTB4MAorMCwgICAgICAgOTk3NywgICAgICAgOTk3NywgICAgICAgMzMsICAgICAgNzIwLCAweDE1M2Q2OTE2LCBGPTB4MAorMSwgICAgICAgOTk4NSwgICAgICAgOTk4NSwgICAgICAgNDYsICAgICAgMzU5LCAweGNlNTVhOTQyCiswLCAgICAgIDEwMDEwLCAgICAgIDEwMDEwLCAgICAgICAzMywgICAgICA4NTUsIDB4YzJmNGE1MWUsIEY9MHgwCisxLCAgICAgIDEwMDMxLCAgICAgIDEwMDMxLCAgICAgICA0NiwgICAgICAzNTUsIDB4YTMxY2EwMTQKKzAsICAgICAgMTAwNDMsICAgICAgMTAwNDMsICAgICAgIDMzLCAgICAgIDc0MiwgMHhjMTNiNjg2OCwgRj0weDAKKzAsICAgICAgMTAwNzcsICAgICAgMTAwNzcsICAgICAgIDMzLCAgICAgIDgzNSwgMHg1YzgwYTFmZCwgRj0weDAKKzEsICAgICAgMTAwNzcsICAgICAgMTAwNzcsICAgICAgIDQ2LCAgICAgIDMyMCwgMHhiNzFiOGY2YQorMCwgICAgICAxMDExMCwgICAgICAxMDExMCwgICAgICAgMzMsICAgICAxNjEwLCAweGJhNjEyZGFiLCBGPTB4MAorMSwgICAgICAxMDEyNCwgICAgICAxMDEyNCwgICAgICAgNDYsICAgICAgMzQ4LCAweDIyMWI5ZTZkCiswLCAgICAgIDEwMTQzLCAgICAgIDEwMTQzLCAgICAgICAzMywgICAgICA2MzcsIDB4YzI1YTM3MjUsIEY9MHgwCisxLCAgICAgIDEwMTcwLCAgICAgIDEwMTcwLCAgICAgICA0NiwgICAgICAzNzAsIDB4ZTk4OWE0ZWQKKzAsICAgICAgMTAxNzcsICAgICAgMTAxNzcsICAgICAgIDMzLCAgICAgIDYxNCwgMHhiNzkyMmFhMiwgRj0weDAKKzAsICAgICAgMTAyMTAsICAgICAgMTAyMTAsICAgICAgIDMzLCAgICAgMTE0MywgMHg1NzZhM2NhYywgRj0weDAKKzEsICAgICAgMTAyMTcsICAgICAgMTAyMTcsICAgICAgIDQ2LCAgICAgIDM1MywgMHgzZTExYTQ0YgorMCwgICAgICAxMDI0NCwgICAgICAxMDI0NCwgICAgICAgMzMsICAgICAxMjYyLCAweGE3ZjQ3NWZiLCBGPTB4MAorMSwgICAgICAxMDI2MywgICAgICAxMDI2MywgICAgICAgNDYsICAgICAgMzY3LCAweDk2NDRhYmQ0CiswLCAgICAgIDEwMjc3LCAgICAgIDEwMjc3LCAgICAgICAzMywgICAgIDE2MTgsIDB4MzY0NDNkZGQsIEY9MHgwCiswLCAgICAgIDEwMzEwLCAgICAgIDEwMzEwLCAgICAgICAzMywgICAgIDIzNDUsIDB4MjVhZDcxZGMsIEY9MHgwCisxLCAgICAgIDEwMzEwLCAgICAgIDEwMzEwLCAgICAgICA0NiwgICAgICAzNTAsIDB4YTA4OGE4MzYKKzAsICAgICAgMTAzNDQsICAgICAgMTAzNDQsICAgICAgIDMzLCAgICAgMTAyOSwgMHg1OTczMDNkNywgRj0weDAKKzEsICAgICAgMTAzNTYsICAgICAgMTAzNTYsICAgICAgIDQ2LCAgICAgIDM1MywgMHg3ZDlmYTdkMAorMCwgICAgICAxMDM3NywgICAgICAxMDM3NywgICAgICAgMzMsICAgICAgOTMyLCAweDA2NGJjY2E3LCBGPTB4MAorMSwgICAgICAxMDQwMywgICAgICAxMDQwMywgICAgICAgNDYsICAgICAgMzM2LCAweDM5NzM5OGEyCiswLCAgICAgIDEwNDEwLCAgICAgIDEwNDEwLCAgICAgICAzMywgICAgIDE2ODgsIDB4NWVkMjU3YzEsIEY9MHgwCiswLCAgICAgIDEwNDQ0LCAgICAgIDEwNDQ0LCAgICAgICAzMywgICAgIDQxNTksIDB4ODk3YzMzNzAKKzEsICAgICAgMTA0NDksICAgICAgMTA0NDksICAgICAgIDQ2LCAgICAgIDMzNCwgMHhhMzIxYTAzOAorMCwgICAgICAxMDQ3NywgICAgICAxMDQ3NywgICAgICAgMzMsICAgICAyMDM5LCAweDkzMGNmYjEyLCBGPTB4MAorMSwgICAgICAxMDQ5NSwgICAgICAxMDQ5NSwgICAgICAgNDYsICAgICAgMzU4LCAweDYxZTJhMmM1CiswLCAgICAgIDEwNTExLCAgICAgIDEwNTExLCAgICAgICAzMywgICAgICA2MTQsIDB4MWVkYzI1MGIsIEY9MHgwCisxLCAgICAgIDEwNTQyLCAgICAgIDEwNTQyLCAgICAgICA0NiwgICAgICAzNDQsIDB4YTcxODlkZDAKKzAsICAgICAgMTA1NDQsICAgICAgMTA1NDQsICAgICAgIDMzLCAgICAgMTc0OSwgMHg3OTY1NWI2MywgRj0weDAKKzAsICAgICAgMTA1NzcsICAgICAgMTA1NzcsICAgICAgIDMzLCAgICAgMjYwOSwgMHg4MzRmMTEwYSwgRj0weDAKKzEsICAgICAgMTA1ODgsICAgICAgMTA1ODgsICAgICAgIDQ2LCAgICAgIDM0NCwgMHg4NTczOWE4ZgorMCwgICAgICAxMDYxMSwgICAgICAxMDYxMSwgICAgICAgMzMsICAgICAgNjg5LCAweDQ3Yzg1YTQwLCBGPTB4MAorMSwgICAgICAxMDYzNSwgICAgICAxMDYzNSwgICAgICAgNDYsICAgICAgMzU2LCAweDU0YjRhNjNiCiswLCAgICAgIDEwNjQ0LCAgICAgIDEwNjQ0LCAgICAgICAzMywgICAgIDIyNTksIDB4ZmJlZjZiNjUsIEY9MHgwCiswLCAgICAgIDEwNjc3LCAgICAgIDEwNjc3LCAgICAgICAzMywgICAgIDI0OTQsIDB4M2Y1ZmM4ZDAsIEY9MHgwCisxLCAgICAgIDEwNjgxLCAgICAgIDEwNjgxLCAgICAgICA0NiwgICAgICAzNTQsIDB4MTUyOGFhNWMKKzAsICAgICAgMTA3MTEsICAgICAgMTA3MTEsICAgICAgIDMzLCAgICAgMjQ1NywgMHhjNDI3YzE3ZSwgRj0weDAKKzEsICAgICAgMTA3MjgsICAgICAgMTA3MjgsICAgICAgIDQ2LCAgICAgIDMzMCwgMHhlNDRmOTU5YgorMCwgICAgICAxMDc0NCwgICAgICAxMDc0NCwgICAgICAgMzMsICAgICAyNDc2LCAweDhiYmJkMDY0LCBGPTB4MAorMSwgICAgICAxMDc3NCwgICAgICAxMDc3NCwgICAgICAgNDYsICAgICAgMzI4LCAweDBiNzA5NjhjCiswLCAgICAgIDEwNzc3LCAgICAgIDEwNzc3LCAgICAgICAzMywgICAgIDI1NjAsIDB4MGIwNGY3ZDcsIEY9MHgwCiswLCAgICAgIDEwODExLCAgICAgIDEwODExLCAgICAgICAzMywgICAgIDI2NzksIDB4MDJkNzQwMDIsIEY9MHgwCisxLCAgICAgIDEwODIwLCAgICAgIDEwODIwLCAgICAgICA0NiwgICAgICAzNTEsIDB4Y2VmMjlmZTcKKzAsICAgICAgMTA4NDQsICAgICAgMTA4NDQsICAgICAgIDMzLCAgICAgMjc5NSwgMHg2YTE2NjA5MCwgRj0weDAKKzEsICAgICAgMTA4NjcsICAgICAgMTA4NjcsICAgICAgIDQ2LCAgICAgIDM2NCwgMHhlNTQyYWVkOQorMCwgICAgICAxMDg3OCwgICAgICAxMDg3OCwgICAgICAgMzMsICAgICAyOTI3LCAweGZkYjg5OWRlLCBGPTB4MAorMCwgICAgICAxMDkxMSwgICAgICAxMDkxMSwgICAgICAgMzMsICAgICAyNDM3LCAweDVhYzliYTliLCBGPTB4MAorMSwgICAgICAxMDkxMywgICAgICAxMDkxMywgICAgICAgNDYsICAgICAgMzY1LCAweDM2OTdhOTY3CiswLCAgICAgIDEwOTQ0LCAgICAgIDEwOTQ0LCAgICAgICAzMywgICAgIDI2NjMsIDB4YTQ0MTJmMmUsIEY9MHgwCisxLCAgICAgIDEwOTYwLCAgICAgIDEwOTYwLCAgICAgICA0NiwgICAgICAzNDEsIDB4ZTFhNTlmNWMKKzAsICAgICAgMTA5NzgsICAgICAgMTA5NzgsICAgICAgIDMzLCAgICAgMjY4OCwgMHg0OGRiNDI1ZiwgRj0weDAKKzEsICAgICAgMTEwMDYsICAgICAgMTEwMDYsICAgICAgIDQ2LCAgICAgIDMzMCwgMHg5NmZiOGRhMQorMCwgICAgICAxMTAxMSwgICAgICAxMTAxMSwgICAgICAgMzMsICAgICAyNzI3LCAweDEyZGI0NzI5LCBGPTB4MAorMCwgICAgICAxMTA0NCwgICAgICAxMTA0NCwgICAgICAgMzMsICAgICAyNzQ3LCAweGMzOTQ1MzI0LCBGPTB4MAorMSwgICAgICAxMTA1MywgICAgICAxMTA1MywgICAgICAgNDYsICAgICAgMzU4LCAweDg5ZWNhMDFlCiswLCAgICAgIDExMDc4LCAgICAgIDExMDc4LCAgICAgICAzMywgICAgIDM2MDIsIDB4MzJiZDBjMDUsIEY9MHgwCisxLCAgICAgIDExMDk5LCAgICAgIDExMDk5LCAgICAgICA0NiwgICAgICAzNjcsIDB4NzdmMmIzZDMKKzAsICAgICAgMTExMTEsICAgICAgMTExMTEsICAgICAgIDMzLCAgICAgMTMzNCwgMHgxY2RmYTE1OSwgRj0weDAKKzAsICAgICAgMTExNDQsICAgICAgMTExNDQsICAgICAgIDMzLCAgICAgMjU2MiwgMHg0OTg1ZTQzZiwgRj0weDAKKzEsICAgICAgMTExNDYsICAgICAgMTExNDYsICAgICAgIDQ2LCAgICAgIDM1MywgMHg3MzQ5OWYwMQorMCwgICAgICAxMTE3OCwgICAgICAxMTE3OCwgICAgICAgMzMsICAgICAyOTE3LCAweDdiOTk5ZmMyLCBGPTB4MAorMSwgICAgICAxMTE5MiwgICAgICAxMTE5MiwgICAgICAgNDYsICAgICAgMzM2LCAweGI4YjlhMmEwCiswLCAgICAgIDExMjExLCAgICAgIDExMjExLCAgICAgICAzMywgICAgIDI3ODgsIDB4OTRhNzVhOTcsIEY9MHgwCisxLCAgICAgIDExMjM4LCAgICAgIDExMjM4LCAgICAgICA0NiwgICAgICAzMjksIDB4YjgwYThlM2YKKzAsICAgICAgMTEyNDUsICAgICAgMTEyNDUsICAgICAgIDMzLCAgICAgMjg3NiwgMHg0ZGEzYTFlMiwgRj0weDAKKzAsICAgICAgMTEyNzgsICAgICAgMTEyNzgsICAgICAgIDMzLCAgICAgMjc4MiwgMHgwMDE4NzM5YywgRj0weDAKKzEsICAgICAgMTEyODUsICAgICAgMTEyODUsICAgICAgIDQ2LCAgICAgIDMyMywgMHgzNjkyOWMzYgorMCwgICAgICAxMTMxMSwgICAgICAxMTMxMSwgICAgICAgMzMsICAgICAyMzkzLCAweGQ1ZDZiNjZkLCBGPTB4MAorMSwgICAgICAxMTMzMSwgICAgICAxMTMzMSwgICAgICAgNDYsICAgICAgMzI4LCAweGMyMmI5NjA0CiswLCAgICAgIDExMzQ1LCAgICAgIDExMzQ1LCAgICAgICAzMywgICAgIDI3NzMsIDB4OTY5NDUyZTMsIEY9MHgwCiswLCAgICAgIDExMzc4LCAgICAgIDExMzc4LCAgICAgICAzMywgICAgIDI5NzIsIDB4Y2Y5M2QyY2EsIEY9MHgwCisxLCAgICAgIDExMzc4LCAgICAgIDExMzc4LCAgICAgICA0NiwgICAgICAzNDUsIDB4NzZlZGE5YzcKKzAsICAgICAgMTE0MTEsICAgICAgMTE0MTEsICAgICAgIDMzLCAgICAgMzQ4MCwgMHg3MDAwZDY1OSwgRj0weDAKKzEsICAgICAgMTE0MjQsICAgICAgMTE0MjQsICAgICAgIDQ2LCAgICAgIDM0NSwgMHhkMzRkYTZiYgorMCwgICAgICAxMTQ0NSwgICAgICAxMTQ0NSwgICAgICAgMzMsICAgICAxMDc4LCAweGQ4OWIxYjg4LCBGPTB4MAorMSwgICAgICAxMTQ3MSwgICAgICAxMTQ3MSwgICAgICAgNDYsICAgICAgMzQ5LCAweGE3YTFhMWE5CiswLCAgICAgIDExNDc4LCAgICAgIDExNDc4LCAgICAgICAzMywgICAgIDMzODUsIDB4YjU3Njk1ZTMsIEY9MHgwCiswLCAgICAgIDExNTEyLCAgICAgIDExNTEyLCAgICAgICAzMywgICAgIDE0MDgsIDB4ZTE1NWI1ZjMsIEY9MHgwCisxLCAgICAgIDExNTE3LCAgICAgIDExNTE3LCAgICAgICA0NiwgICAgICAzNDAsIDB4NWFlNTk0MmYKKzAsICAgICAgMTE1NDUsICAgICAgMTE1NDUsICAgICAgIDMzLCAgICAgMjU0MywgMHg3N2Q1ZWVlNSwgRj0weDAKKzEsICAgICAgMTE1NjQsICAgICAgMTE1NjQsICAgICAgIDQ2LCAgICAgIDM1MiwgMHhmMTA1YTI2YQorMCwgICAgICAxMTU3OCwgICAgICAxMTU3OCwgICAgICAgMzMsICAgICAzNjA5LCAweDNhMDJmODJkLCBGPTB4MAorMSwgICAgICAxMTYxMCwgICAgICAxMTYxMCwgICAgICAgNDYsICAgICAgMzQ1LCAweGY2YTI5ZGRhCiswLCAgICAgIDExNjEyLCAgICAgIDExNjEyLCAgICAgICAzMywgICAgIDEwNzgsIDB4NTAxZDFjNzIsIEY9MHgwCiswLCAgICAgIDExNjQ1LCAgICAgIDExNjQ1LCAgICAgICAzMywgICAgIDI2MDAsIDB4ZGYzNzBkMjQsIEY9MHgwCisxLCAgICAgIDExNjU2LCAgICAgIDExNjU2LCAgICAgICA0NiwgICAgICAzNDYsIDB4ODg5OWExODgKKzAsICAgICAgMTE2NzgsICAgICAgMTE2NzgsICAgICAgIDMzLCAgICAgMTE5MCwgMHhkYzFlNGM5OSwgRj0weDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZtdmMtdHlwZTEgYi90ZXN0cy9yZWYvZmF0ZS9mbXZjLXR5cGUxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OWRlMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9mbXZjLXR5cGUxCkBAIC0wLDAgKzEsMTEgQEAKKyN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NjR4MzgyCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNzYwOTQ0LCAweDJmZWIxNDUzCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA3NjA5NDQsIDB4OTY3N2ViZjgKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDc2MDk0NCwgMHg4M2QyZWQ0OQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgNzYwOTQ0LCAweDlhYjZjNjNkCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICA3NjA5NDQsIDB4MTgyMDE4OWMKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDc2MDk0NCwgMHg0Yjk0ZjUyMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZm12Yy10eXBlMiBiL3Rlc3RzL3JlZi9mYXRlL2ZtdmMtdHlwZTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjNjMwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZtdmMtdHlwZTIKQEAgLTAsMCArMSwzMyBAQAorI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDc2OHg1NzYKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDEzMjcxMDQsIDB4YTczYzIzMmQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMTMyNzEwNCwgMHhhNzNjMjMyZAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAxMzI3MTA0LCAweGE3M2MyMzJkCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDEzMjcxMDQsIDB4ZjE0ZTA1YmUKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgMTMyNzEwNCwgMHhkOGMwMzcyNgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAxMzI3MTA0LCAweDE2ZTg0NDdhCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgIDEzMjcxMDQsIDB4OGRmZDk0ZDIKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgMTMyNzEwNCwgMHgzNTUwODMzYgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAxMzI3MTA0LCAweDc0YmQyOTU5CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgIDEzMjcxMDQsIDB4YzJiNDUwNWMKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgMTMyNzEwNCwgMHg3YzY5OTljZAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAxMzI3MTA0LCAweGI2NTYyNzExCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgIDEzMjcxMDQsIDB4NTA5OTM1NjUKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgMTMyNzEwNCwgMHg1Nzk1NDlkMgorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAxMzI3MTA0LCAweGIxNzE3MGY2CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgIDEzMjcxMDQsIDB4YzdkODc3MDgKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgMTMyNzEwNCwgMHhkYjM4NzlkYQorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAxMzI3MTA0LCAweGRiMzg3OWRhCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgIDEzMjcxMDQsIDB4ZGIzODc5ZGEKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgMTMyNzEwNCwgMHg2ZjFjNWMwMQorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAxMzI3MTA0LCAweGQ5ZDE1YzAxCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgIDEzMjcxMDQsIDB4ODI2ZjBiYWIKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgMTMyNzEwNCwgMHhmMjViMDQxZAorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAxMzI3MTA0LCAweGM4NWEwNDFkCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgIDEzMjcxMDQsIDB4Yzg1YTA0MWQKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgMTMyNzEwNCwgMHhjODVhMDQxZAorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAxMzI3MTA0LCAweGM4NWEwNDFkCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgIDEzMjcxMDQsIDB4YzU0Y2M2YWUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZvcmNlX2tleV9mcmFtZXMgYi90ZXN0cy9yZWYvZmF0ZS9mb3JjZV9rZXlfZnJhbWVzCmluZGV4IDBhNDEzNzguLjI2ZGUwOTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZvcmNlX2tleV9mcmFtZXMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZm9yY2Vfa2V5X2ZyYW1lcwpAQCAtMSw0ICsxLDQgQEAKIDA3NTY3Yjk1MjhiOGRlNTIzZmFhZjQ5ZTRlMWUwZmM2ICp0ZXN0cy9kYXRhL2ZhdGUvZm9yY2Vfa2V5X2ZyYW1lcy5hdmkKIDExMzMxMiB0ZXN0cy9kYXRhL2ZhdGUvZm9yY2Vfa2V5X2ZyYW1lcy5hdmkKLThmNjhhZDJlNjAyZWNkODdhM2UwYzA5N2JhOTlkNzczICp0ZXN0cy9kYXRhL2ZhdGUvZm9yY2Vfa2V5X2ZyYW1lcy5vdXQuZnJhbWVjcmMKLXN0ZGRldjozNDM2My4wMSBQU05SOiAgNS42MSBNQVhESUZGOjU2MzA1IGJ5dGVzOiAgNzYwMzIwMC8gICAgICAxODYKK2IyZTkyYjk3YmFjMDI0MzI0MjI4MWQ3MTEwOGZmZGJkICp0ZXN0cy9kYXRhL2ZhdGUvZm9yY2Vfa2V5X2ZyYW1lcy5vdXQuZnJhbWVjcmMKK3N0ZGRldjozNDYxMi44MyBQU05SOiAgNS41NCBNQVhESUZGOjYxNDA4IGJ5dGVzOiAgNzYwMzIwMC8gICAgICAyNjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXYwIGIvdGVzdHMvcmVmL2ZhdGUvZnJhcHMtdjAKaW5kZXggM2NiYTgzMS4uOTdhZGExMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZnJhcHMtdjAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZnJhcHMtdjAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzEyeDIxNgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEwMTA4OCwgMHg3YmY0NDhmOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTAxMDg4LCAweDFiYTc0OWVjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMDEwODgsIDB4OTRlYjRkYzQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXYxIGIvdGVzdHMvcmVmL2ZhdGUvZnJhcHMtdjEKaW5kZXggMjljN2UzNy4uMzZmYjdkOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZnJhcHMtdjEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZnJhcHMtdjEKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIzMDQwMCwgMHgyM2MyOWQxNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZnJhcHMtdjIgYi90ZXN0cy9yZWYvZmF0ZS9mcmFwcy12MgppbmRleCAwNmUwMDI0Li4zZDg1MzMzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9mcmFwcy12MgorKysgYi90ZXN0cy9yZWYvZmF0ZS9mcmFwcy12MgpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMDI0eDc2OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTE3OTY0OCwgMHg5OWY4MDQzNgogMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAxMTc5NjQ4LCAweGU4YWU3YTMwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mcmFwcy12MyBiL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXYzCmluZGV4IDEzOWVlN2UuLjkzMjg2ZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXYzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXYzCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMngzODQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1ODk4MjQsIDB4MGIxODFiYmYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU4OTgyNCwgMHhjZDc0MGY3OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTg5ODI0LCAweDE2ZjhmOTBlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mcmFwcy12NCBiL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXY0CmluZGV4IDAwNzkxNmQuLmM5N2YyOWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXY0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg1MTIKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0OTE1MjAsIDB4NjhmZjEyYzAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQ5MTUyMCwgMHgyMmQzNmYwZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDkxNTIwLCAweGNlNmY4NzdkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mcmFwcy12NSBiL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXY1CmluZGV4IDU5OTY4M2EuLmMwNjI4ZTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXY1CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ZyYXBzLXY1CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI4OHgxNjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDUxNTIsIDB4ODQ1OGQ0Y2IKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0NTE1MiwgMHhhNjk0ZDdjNwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ1MTUyLCAweDJiZDRiZmM5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9mcnd1IGIvdGVzdHMvcmVmL2ZhdGUvZnJ3dQppbmRleCAzMmVhYTZmLi45MThlZjZjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9mcnd1CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2Zyd3UKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MzYwMCwgMHgwNTA0MjJjMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUzNjAwLCAweDBjZjM1MzU5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTM2MDAsIDB4MmFlOTVkYjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2cybTIgYi90ZXN0cy9yZWYvZmF0ZS9nMm0yCmluZGV4IDcxMGRiZDEuLjQyYjdiNmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2cybTIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZzJtMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEwMjR4NzY4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDAsICAyMzU5Mjk2LCAweGI0NDM0ZTRmCiAwLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMCwgIDIzNTkyOTYsIDB4NTljYjUwMjcKIDAsICAgICAgICAgNzgsICAgICAgICAgNzgsICAgICAgICAwLCAgMjM1OTI5NiwgMHhlOWJjNTc4ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZzJtMyBiL3Rlc3RzL3JlZi9mYXRlL2cybTMKaW5kZXggZThmZTY5Mi4uYjY2NWQ1NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZzJtMworKysgYi90ZXN0cy9yZWYvZmF0ZS9nMm0zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMjQwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyODB4OTk2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzODI0NjQwLCAweDlhMjUzZDI5CiAwLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgIDM4MjQ2NDAsIDB4Y2IyMzJiMDYKIDAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgMzgyNDY0MCwgMHhiMDNjMjg4YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZzJtNCBiL3Rlc3RzL3JlZi9mYXRlL2cybTQKaW5kZXggYzlhNmUxMi4uZDVlY2FlYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZzJtNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9nMm00CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyODB4MTAyNAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzkzMjE2MCwgMHgxMDkxNDhlZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzOTMyMTYwLCAweGE4N2I3YmZmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDM5MzIxNjAsIDB4MDBlMTRkMTYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2c3MjItZW5jb2RlIGIvdGVzdHMvcmVmL2ZhdGUvZzcyMi1lbmNvZGUKaW5kZXggM2Y2YjNjZi4uZDg0ZDYyNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZzcyMi1lbmNvZGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZzcyMi1lbmNvZGUKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzE2MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDE2MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgODE5MiwgICAgMTYzODQsIDFkZDljMjg1ZWI2MDgwMzhmMzI1N2QxYThlMDJlYjc1CiAwLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgODE5MiwgICAgMTYzODQsIGY3NDU5MzM0Y2JlNzBjMDZiYzA4OTdlZGZlNjRlODQwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9nNzIyZGVjLTEgYi90ZXN0cy9yZWYvZmF0ZS9nNzIyZGVjLTEKaW5kZXggZTk0YzNlNi4uYTk3ZmM4MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZzcyMmRlYy0xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2c3MjJkZWMtMQpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzE2MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDE2MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDIwNDgsICAgICA0MDk2LCAweDRmOTIyOGIzCiAwLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMjA0OCwgICAgIDQwOTYsIDB4ZmFiNTgxNTcKIDAsICAgICAgIDQwOTYsICAgICAgIDQwOTYsICAgICAyMDQ4LCAgICAgNDA5NiwgMHgwYjY0MWM3OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy0xIGIvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy0xCmluZGV4IGEzYTdmNjcuLmY3ZGFhZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTEKQEAgLTEsMyArMSw4IEBACiAjdGIgMDogMS84MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4N2Y2ZjM5NzAKIDAsICAgICAgICAyNDAsICAgICAgICAyNDAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHgxMTA1YTBkMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy0yIGIvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy0yCmluZGV4IGU3ZmM5YjIuLmE0MDNlNTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTIKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS84MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4NWQ5ZDkwOTEKIDAsICAgICAgICAyNDAsICAgICAgICAyNDAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHg0MjUwOTViNwogMCwgICAgICAgIDQ4MCwgICAgICAgIDQ4MCwgICAgICAyNDAsICAgICAgNDgwLCAweGU3YjZhMWE3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTMgYi90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTMKaW5kZXggZDFhMjk0Ni4uZTNkMzk3OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy0zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtMwpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHhjZTkwODg2OQogMCwgICAgICAgIDI0MCwgICAgICAgIDI0MCwgICAgICAyNDAsICAgICAgNDgwLCAweGZhNjM1ODhlCiAwLCAgICAgICAgNDgwLCAgICAgICAgNDgwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4MTFjZTg1MGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtNCBiL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtNAppbmRleCA3OTI4OTlkLi4zMDliM2FmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy00CkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAyNDAsICAgICAgNDgwLCAweGE2OTdiMzE0CiAwLCAgICAgICAgMjQwLCAgICAgICAgMjQwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4NDNjNWRjNWEKIDAsICAgICAgICA0ODAsICAgICAgICA0ODAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHhkMjQzODE0NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy01IGIvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy01CmluZGV4IGJkYzI5ODIuLjllMzdjODYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtNQorKysgYi90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTUKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS84MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4NGRjZTk3NzMKIDAsICAgICAgICAyNDAsICAgICAgICAyNDAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHhlNjM2N2FiOAogMCwgICAgICAgIDQ4MCwgICAgICAgIDQ4MCwgICAgICAyNDAsICAgICAgNDgwLCAweGYzNmE1ODlkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTYgYi90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTYKaW5kZXggZWIwZTRmYS4uYTUxZThkZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy02CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtNgpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHg0ZmExYWVkOQogMCwgICAgICAgIDI0MCwgICAgICAgIDI0MCwgICAgICAyNDAsICAgICAgNDgwLCAweDZkN2VmMzkxCiAwLCAgICAgICAgNDgwLCAgICAgICAgNDgwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4YWVjYWYyYzEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtNyBiL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtNwppbmRleCBjYzMwMTg3Li5kYjBjZWI4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTcKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy03CkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAyNDAsICAgICAgNDgwLCAweDM1ZTRhMWZkCiAwLCAgICAgICAgMjQwLCAgICAgICAgMjQwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4MmY3YmRkNjAKIDAsICAgICAgICA0ODAsICAgICAgICA0ODAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHgwNDA3ZTQ5OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy04IGIvdGVzdHMvcmVmL2ZhdGUvZzcyM18xLWRlYy04CmluZGV4IGZjNGQ5ZjMuLjc0MGVkMmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2c3MjNfMS1kZWMtOAorKysgYi90ZXN0cy9yZWYvZmF0ZS9nNzIzXzEtZGVjLTgKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS84MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDI0MCwgICAgICA0ODAsIDB4MTc5MzBlMGYKIDAsICAgICAgICAyNDAsICAgICAgICAyNDAsICAgICAgMjQwLCAgICAgIDQ4MCwgMHg3YzdmNDI0NwogMCwgICAgICAgIDQ4MCwgICAgICAgIDQ4MCwgICAgICAyNDAsICAgICAgNDgwLCAweGJmMzQ4OWU1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9nNzI2LWVuY29kZS0yYml0IGIvdGVzdHMvcmVmL2ZhdGUvZzcyNi1lbmNvZGUtMmJpdAppbmRleCAyZTYxMzEwLi40YTgzYzk1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9nNzI2LWVuY29kZS0yYml0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2c3MjYtZW5jb2RlLTJiaXQKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgMTYzODQsICAgIDMyNzY4LCBiMjhiMTE2ZDIzMTUzMjNhZWJhNmI2NmI1OGI3ZjRlZAogMCwgICAgICAxNjM4NCwgICAgICAxNjM4NCwgICAgMTYzODQsICAgIDMyNzY4LCBlOWNmYmViZTk5NDkwYmQ0OTg3MzQxZWU3NDgyOTFjNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZzcyNi1lbmNvZGUtM2JpdCBiL3Rlc3RzL3JlZi9mYXRlL2c3MjYtZW5jb2RlLTNiaXQKaW5kZXggY2U0M2QzMi4uYzU1MWFlNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZzcyNi1lbmNvZGUtM2JpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9nNzI2LWVuY29kZS0zYml0CkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS84MDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgIDEwOTIwLCAgICAyMTg0MCwgNTE3ZGQ2ZDFjZTU2NmI5OTgyNTFmMGQyMTVmYTY5YzAKIDAsICAgICAgMTA5MjAsICAgICAgMTA5MjAsICAgIDEwOTIwLCAgICAyMTg0MCwgYjAyNjhlMmJjYzY3YWNiNTI0NzUzNzkwMTIzYzY1ZmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2c3MjYtZW5jb2RlLTRiaXQgYi90ZXN0cy9yZWYvZmF0ZS9nNzI2LWVuY29kZS00Yml0CmluZGV4IDFjY2MxODAuLmVhMjc3ZTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2c3MjYtZW5jb2RlLTRiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZzcyNi1lbmNvZGUtNGJpdApAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgODE5MiwgICAgMTYzODQsIGEwY2YzYTA5NTNhZGNlMWExMDMyYTRmZDJkYTAwYTUyCiAwLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgODE5MiwgICAgMTYzODQsIGM3NTBjMWI3NmEyMDM1NTZkZDYwZDczZDI2MTUyOWU5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9nNzI2LWVuY29kZS01Yml0IGIvdGVzdHMvcmVmL2ZhdGUvZzcyNi1lbmNvZGUtNWJpdAppbmRleCAyMTljNzNkLi4zMGM0NTZlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9nNzI2LWVuY29kZS01Yml0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2c3MjYtZW5jb2RlLTViaXQKQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDY1NTIsICAgIDEzMTA0LCA2ZmUzZjc1ZGYxMjYyYzVmOTU2ODg3ZGU5YzMyZGY0MAogMCwgICAgICAgNjU1MiwgICAgICAgNjU1MiwgICAgIDY1NTIsICAgIDEzMTA0LCBmOTU1NTE4ZGU2ZjYxZjk0MjUzMjgwZDExZDY0ZDY4YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZ2FwbGVzcy1tcDMgYi90ZXN0cy9yZWYvZmF0ZS9nYXBsZXNzLW1wMwppbmRleCAyY2U0YjhjLi5hYjRmMWEwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9nYXBsZXNzLW1wMworKysgYi90ZXN0cy9yZWYvZmF0ZS9nYXBsZXNzLW1wMwpAQCAtMSw1ICsxLDUgQEAKLWQ1Yzg4Y2YzODQxNjMyOWEwNTJhOWIwY2IxNDBmYjRjICp0ZXN0cy9kYXRhL2ZhdGUvZ2FwbGVzcy1tcDMub3V0LTEKKzQ0YjQyY2MzYTg5OGI0NTUwN2Q4NTZkMDgxM2Y0ZjI2ICp0ZXN0cy9kYXRhL2ZhdGUvZ2FwbGVzcy1tcDMub3V0LTEKIGM5NmMzYWU3YmQzMzAwZmQyZjRkZWJhYzIyMmRlNWI3Ci0zMzg2YmMyMDA5YjMxYjdlZjM5MjQ3OTE4Y2JiMDJhNSAqdGVzdHMvZGF0YS9mYXRlL2dhcGxlc3MtbXAzLm91dC0yCitlYzg3NjQzNGVkNjVlMzM4ZTA3MjM0ZTU0ZDEzNmNhZiAqdGVzdHMvZGF0YS9mYXRlL2dhcGxlc3MtbXAzLm91dC0yCiBjOTZjM2FlN2JkMzMwMGZkMmY0ZGViYWMyMjJkZTViNwotM2NlMzVlYzJhOWE1OWI3NDU5ZWNkNmM5OGQ4ZmExMjMgKnRlc3RzL2RhdGEvZmF0ZS9nYXBsZXNzLW1wMy5vdXQtMworODA2ZmQ4MGViYTg4N2I0NmExZWJhMWVlZmY2M2RmMjggKnRlc3RzL2RhdGEvZmF0ZS9nYXBsZXNzLW1wMy5vdXQtMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZ2FwbGVzc2VuYy1pdHVuZXMtdG8taXBvZC1hYWMgYi90ZXN0cy9yZWYvZmF0ZS9nYXBsZXNzZW5jLWl0dW5lcy10by1pcG9kLWFhYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmNiZjIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZ2FwbGVzc2VuYy1pdHVuZXMtdG8taXBvZC1hYWMKQEAgLTAsMCArMSw0MyBAQAorW1NUUkVBTV0KK2luZGV4PTAKK3N0YXJ0X3B0cz0wCitkdXJhdGlvbl90cz0xMDMzMjYKK1svU1RSRUFNXQorW0ZPUk1BVF0KK3N0YXJ0X3RpbWU9MC4wMDAwMDAKK2R1cmF0aW9uPTIuMzY3MDAwCitbL0ZPUk1BVF0KK3BhY2tldHxwdHM9LTEwMjR8ZHRzPS0xMDI0fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S0RzaWRlX2RhdGF8CisKK3BhY2tldHxwdHM9MHxkdHM9MHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTEwMjR8ZHRzPTEwMjR8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0yMDQ4fGR0cz0yMDQ4fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MzA3MnxkdHM9MzA3MnxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTQwOTZ8ZHRzPTQwOTZ8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz01MTIwfGR0cz01MTIwfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9OTUyMzJ8ZHRzPTk1MjMyfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9OTYyNTZ8ZHRzPTk2MjU2fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9OTcyODB8ZHRzPTk3MjgwfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9OTgzMDR8ZHRzPTk4MzA0fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9OTkzMjh8ZHRzPTk5MzI4fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MTAwMzUyfGR0cz0xMDAzNTJ8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0xMDEzNzZ8ZHRzPTEwMTM3NnxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTEwMjQwMHxkdHM9MTAyNDAwfGR1cmF0aW9uPTkyNnxmbGFncz1LXworc3RyZWFtfG5iX3JlYWRfcGFja2V0cz0xMDIKK2ZyYW1lfHBrdF9wdHM9MHxwa3RfZHRzPTB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTB8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTEwMjR8cGt0X2R0cz0xMDI0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMDI0fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz0yMDQ4fHBrdF9kdHM9MjA0OHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjA0OHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9MzA3Mnxwa3RfZHRzPTMwNzJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTMwNzJ8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTQwOTZ8cGt0X2R0cz00MDk2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD00MDk2fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz01MTIwfHBrdF9kdHM9NTEyMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9NTEyMHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9NjE0NHxwa3RfZHRzPTYxNDR8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTYxNDR8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTcxNjh8cGt0X2R0cz03MTY4fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD03MTY4fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz05NTIzMnxwa3RfZHRzPTk1MjMyfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD05NTIzMnxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9OTYyNTZ8cGt0X2R0cz05NjI1NnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9OTYyNTZ8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTk3MjgwfHBrdF9kdHM9OTcyODB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTk3MjgwfHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz05ODMwNHxwa3RfZHRzPTk4MzA0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD05ODMwNHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9OTkzMjh8cGt0X2R0cz05OTMyOHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9OTkzMjh8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTEwMDM1Mnxwa3RfZHRzPTEwMDM1MnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTAwMzUyfHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz0xMDEzNzZ8cGt0X2R0cz0xMDEzNzZ8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEwMTM3Nnxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9MTAyNDAwfHBrdF9kdHM9MTAyNDAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMDI0MDB8cGt0X2R1cmF0aW9uPTkyNnxuYl9zYW1wbGVzPTEwMjQKK3N0cmVhbXxuYl9yZWFkX2ZyYW1lcz0xMDEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2dhcGxlc3NlbmMtcGNtLXRvLW1vdi1hYWMgYi90ZXN0cy9yZWYvZmF0ZS9nYXBsZXNzZW5jLXBjbS10by1tb3YtYWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTc5NTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9nYXBsZXNzZW5jLXBjbS10by1tb3YtYWFjCkBAIC0wLDAgKzEsNDMgQEAKK1tTVFJFQU1dCitpbmRleD0wCitzdGFydF9wdHM9MAorZHVyYXRpb25fdHM9NTI5MjAwCitbL1NUUkVBTV0KK1tGT1JNQVRdCitzdGFydF90aW1lPTAuMDAwMDAwCitkdXJhdGlvbj0xMi4wMjQwMDAKK1svRk9STUFUXQorcGFja2V0fHB0cz0tMTAyNHxkdHM9LTEwMjR8ZHVyYXRpb249MTAyNHxmbGFncz1LRHNpZGVfZGF0YXwKKworcGFja2V0fHB0cz0wfGR0cz0wfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MTAyNHxkdHM9MTAyNHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTIwNDh8ZHRzPTIwNDh8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0zMDcyfGR0cz0zMDcyfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9NDA5NnxkdHM9NDA5NnxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTUxMjB8ZHRzPTUxMjB8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz01MjEyMTZ8ZHRzPTUyMTIxNnxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTUyMjI0MHxkdHM9NTIyMjQwfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9NTIzMjY0fGR0cz01MjMyNjR8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz01MjQyODh8ZHRzPTUyNDI4OHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTUyNTMxMnxkdHM9NTI1MzEyfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9NTI2MzM2fGR0cz01MjYzMzZ8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz01MjczNjB8ZHRzPTUyNzM2MHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTUyODM4NHxkdHM9NTI4Mzg0fGR1cmF0aW9uPTgxNnxmbGFncz1LXworc3RyZWFtfG5iX3JlYWRfcGFja2V0cz01MTgKK2ZyYW1lfHBrdF9wdHM9MHxwa3RfZHRzPTB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTB8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTEwMjR8cGt0X2R0cz0xMDI0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMDI0fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz0yMDQ4fHBrdF9kdHM9MjA0OHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjA0OHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9MzA3Mnxwa3RfZHRzPTMwNzJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTMwNzJ8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTQwOTZ8cGt0X2R0cz00MDk2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD00MDk2fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz01MTIwfHBrdF9kdHM9NTEyMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9NTEyMHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9NjE0NHxwa3RfZHRzPTYxNDR8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTYxNDR8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTcxNjh8cGt0X2R0cz03MTY4fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD03MTY4fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz01MjEyMTZ8cGt0X2R0cz01MjEyMTZ8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTUyMTIxNnxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9NTIyMjQwfHBrdF9kdHM9NTIyMjQwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD01MjIyNDB8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTUyMzI2NHxwa3RfZHRzPTUyMzI2NHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9NTIzMjY0fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz01MjQyODh8cGt0X2R0cz01MjQyODh8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTUyNDI4OHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9NTI1MzEyfHBrdF9kdHM9NTI1MzEyfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD01MjUzMTJ8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTUyNjMzNnxwa3RfZHRzPTUyNjMzNnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9NTI2MzM2fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz01MjczNjB8cGt0X2R0cz01MjczNjB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTUyNzM2MHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9NTI4Mzg0fHBrdF9kdHM9NTI4Mzg0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD01MjgzODR8cGt0X2R1cmF0aW9uPTgxNnxuYl9zYW1wbGVzPTEwMjQKK3N0cmVhbXxuYl9yZWFkX2ZyYW1lcz01MTcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2dhcGxlc3NpbmZvLWl0dW5lczEgYi90ZXN0cy9yZWYvZmF0ZS9nYXBsZXNzaW5mby1pdHVuZXMxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNWMwOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9nYXBsZXNzaW5mby1pdHVuZXMxCkBAIC0wLDAgKzEsNDMgQEAKK1tTVFJFQU1dCitpbmRleD0wCitzdGFydF9wdHM9MjExMgorZHVyYXRpb25fdHM9MTI5NDMzNgorWy9TVFJFQU1dCitbRk9STUFUXQorc3RhcnRfdGltZT0wLjA0Nzg4OQorZHVyYXRpb249MjkuMzUwMDIzCitbL0ZPUk1BVF0KK3BhY2tldHxwdHM9MHxkdHM9MHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfc2lkZV9kYXRhfAorCitwYWNrZXR8cHRzPTEwMjR8ZHRzPTEwMjR8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0yMDQ4fGR0cz0yMDQ4fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MzA3MnxkdHM9MzA3MnxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTQwOTZ8ZHRzPTQwOTZ8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz01MTIwfGR0cz01MTIwfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9NjE0NHxkdHM9NjE0NHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTEyODYxNDR8ZHRzPTEyODYxNDR8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0xMjg3MTY4fGR0cz0xMjg3MTY4fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MTI4ODE5MnxkdHM9MTI4ODE5MnxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTEyODkyMTZ8ZHRzPTEyODkyMTZ8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0xMjkwMjQwfGR0cz0xMjkwMjQwfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MTI5MTI2NHxkdHM9MTI5MTI2NHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTEyOTIyODh8ZHRzPTEyOTIyODh8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0xMjkzMzEyfGR0cz0xMjkzMzEyfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3N0cmVhbXxuYl9yZWFkX3BhY2tldHM9MTI2NAorZnJhbWV8cGt0X3B0cz0yMTEyfHBrdF9kdHM9MjExMnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjA0OHxwa3RfZHVyYXRpb249OTYwfG5iX3NhbXBsZXM9OTYwCitmcmFtZXxwa3RfcHRzPTMwNzJ8cGt0X2R0cz0zMDcyfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0zMDcyfHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz00MDk2fHBrdF9kdHM9NDA5NnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9NDA5Nnxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9NTEyMHxwa3RfZHRzPTUxMjB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTUxMjB8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTYxNDR8cGt0X2R0cz02MTQ0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD02MTQ0fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz03MTY4fHBrdF9kdHM9NzE2OHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9NzE2OHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9ODE5Mnxwa3RfZHRzPTgxOTJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTgxOTJ8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTkyMTZ8cGt0X2R0cz05MjE2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD05MjE2fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz0xMjg2MTQ0fHBrdF9kdHM9MTI4NjE0NHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTI4NjE0NHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9MTI4NzE2OHxwa3RfZHRzPTEyODcxNjh8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEyODcxNjh8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTEyODgxOTJ8cGt0X2R0cz0xMjg4MTkyfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMjg4MTkyfHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz0xMjg5MjE2fHBrdF9kdHM9MTI4OTIxNnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTI4OTIxNnxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9MTI5MDI0MHxwa3RfZHRzPTEyOTAyNDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEyOTAyNDB8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTEyOTEyNjR8cGt0X2R0cz0xMjkxMjY0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMjkxMjY0fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz0xMjkyMjg4fHBrdF9kdHM9MTI5MjI4OHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTI5MjI4OHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9MTI5MzMxMnxwa3RfZHRzPTEyOTMzMTJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEyOTMzMTJ8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitzdHJlYW18bmJfcmVhZF9mcmFtZXM9MTI2MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZ2FwbGVzc2luZm8taXR1bmVzMiBiL3Rlc3RzL3JlZi9mYXRlL2dhcGxlc3NpbmZvLWl0dW5lczIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwM2JhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2dhcGxlc3NpbmZvLWl0dW5lczIKQEAgLTAsMCArMSw0MyBAQAorW1NUUkVBTV0KK2luZGV4PTAKK3N0YXJ0X3B0cz0yMTEyCitkdXJhdGlvbl90cz0xMDU0NzIKK1svU1RSRUFNXQorW0ZPUk1BVF0KK3N0YXJ0X3RpbWU9MC4wNDc4OTEKK2R1cmF0aW9uPTIuMzkxNjU1CitbL0ZPUk1BVF0KK3BhY2tldHxwdHM9MHxkdHM9MHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfc2lkZV9kYXRhfAorCitwYWNrZXR8cHRzPTEwMjR8ZHRzPTEwMjR8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0yMDQ4fGR0cz0yMDQ4fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MzA3MnxkdHM9MzA3MnxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTQwOTZ8ZHRzPTQwOTZ8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz01MTIwfGR0cz01MTIwfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9NjE0NHxkdHM9NjE0NHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTk3MjgwfGR0cz05NzI4MHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTk4MzA0fGR0cz05ODMwNHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTk5MzI4fGR0cz05OTMyOHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTEwMDM1MnxkdHM9MTAwMzUyfGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MTAxMzc2fGR0cz0xMDEzNzZ8ZHVyYXRpb249MTAyNHxmbGFncz1LXworcGFja2V0fHB0cz0xMDI0MDB8ZHRzPTEwMjQwMHxkdXJhdGlvbj0xMDI0fGZsYWdzPUtfCitwYWNrZXR8cHRzPTEwMzQyNHxkdHM9MTAzNDI0fGR1cmF0aW9uPTEwMjR8ZmxhZ3M9S18KK3BhY2tldHxwdHM9MTA0NDQ4fGR0cz0xMDQ0NDh8ZHVyYXRpb249MTAyNHxmbGFncz1LXworc3RyZWFtfG5iX3JlYWRfcGFja2V0cz0xMDMKK2ZyYW1lfHBrdF9wdHM9MjExMnxwa3RfZHRzPTIxMTJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTIwNDh8cGt0X2R1cmF0aW9uPTk2MHxuYl9zYW1wbGVzPTk2MAorZnJhbWV8cGt0X3B0cz0zMDcyfHBrdF9kdHM9MzA3MnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MzA3Mnxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9NDA5Nnxwa3RfZHRzPTQwOTZ8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTQwOTZ8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTUxMjB8cGt0X2R0cz01MTIwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD01MTIwfHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz02MTQ0fHBrdF9kdHM9NjE0NHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9NjE0NHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9NzE2OHxwa3RfZHRzPTcxNjh8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTcxNjh8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTgxOTJ8cGt0X2R0cz04MTkyfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD04MTkyfHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz05MjE2fHBrdF9kdHM9OTIxNnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9OTIxNnxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9OTcyODB8cGt0X2R0cz05NzI4MHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9OTcyODB8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTk4MzA0fHBrdF9kdHM9OTgzMDR8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTk4MzA0fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz05OTMyOHxwa3RfZHRzPTk5MzI4fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD05OTMyOHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9MTAwMzUyfHBrdF9kdHM9MTAwMzUyfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMDAzNTJ8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTEwMTM3Nnxwa3RfZHRzPTEwMTM3NnxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTAxMzc2fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorZnJhbWV8cGt0X3B0cz0xMDI0MDB8cGt0X2R0cz0xMDI0MDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEwMjQwMHxwa3RfZHVyYXRpb249MTAyNHxuYl9zYW1wbGVzPTEwMjQKK2ZyYW1lfHBrdF9wdHM9MTAzNDI0fHBrdF9kdHM9MTAzNDI0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xMDM0MjR8cGt0X2R1cmF0aW9uPTEwMjR8bmJfc2FtcGxlcz0xMDI0CitmcmFtZXxwa3RfcHRzPTEwNDQ0OHxwa3RfZHRzPTEwNDQ0OHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTA0NDQ4fHBrdF9kdXJhdGlvbj0xMDI0fG5iX3NhbXBsZXM9MTAyNAorc3RyZWFtfG5iX3JlYWRfZnJhbWVzPTEwMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZ2lmLWNvbG9yIGIvdGVzdHMvcmVmL2ZhdGUvZ2lmLWNvbG9yCmluZGV4IDU1NTkxODYuLmM4OGEwNWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2dpZi1jb2xvcgorKysgYi90ZXN0cy9yZWYvZmF0ZS9naWYtY29sb3IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjE3eDIxNworI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE4ODM1NiwgMHhmMDk0NDA2NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTg4MzU2LCAweDE0NmVkNGM0CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxODgzNTYsIDB4OTY4NjZhNmYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2dpZi1kZWFsIGIvdGVzdHMvcmVmL2ZhdGUvZ2lmLWRlYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZiNzcyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2dpZi1kZWFsCkBAIC0wLDAgKzEsMzEgQEAKKyN0YiAwOiAxMi8xMDkKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQzMHgxODEKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMTEzMjAsIDB4NzE5MDUzOTYKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMxMTMyMCwgMHhlZDQ2YjAxZQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzExMzIwLCAweGNiYjU2YWE4CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAzMTEzMjAsIDB4YWZhYWI1OTkKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDMxMTMyMCwgMHg0MzEzM2FiZgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMzExMzIwLCAweGQ5Njc3ZDEzCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAzMTEzMjAsIDB4NzhhYmVhMjgKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDMxMTMyMCwgMHhjYjZjYTAxMQorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMzExMzIwLCAweDhmZDQwNjcwCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAzMTEzMjAsIDB4OGZkNDA2NzAKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDMxMTMyMCwgMHg4ZmQ0MDY3MAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMzExMzIwLCAweDhmZDQwNjcwCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAzMTEzMjAsIDB4OGZkNDA2NzAKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDMxMTMyMCwgMHg4ZmQ0MDY3MAorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMzExMzIwLCAweDhmZDQwNjcwCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAzMTEzMjAsIDB4OGZkNDA2NzAKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDMxMTMyMCwgMHg4ZmQ0MDY3MAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMzExMzIwLCAweDhmZDQwNjcwCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAzMTEzMjAsIDB4OGZkNDA2NzAKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDMxMTMyMCwgMHg4ZmQ0MDY3MAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMzExMzIwLCAweDhmZDQwNjcwCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAzMTEzMjAsIDB4OGZkNDA2NzAKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDMxMTMyMCwgMHg4ZmQ0MDY3MAorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMzExMzIwLCAweDhmZDQwNjcwCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAzMTEzMjAsIDB4OGZkNDA2NzAKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDMxMTMyMCwgMHg4ZmQ0MDY3MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZ2lmLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvZ2lmLWRlbXV4CmluZGV4IDU0N2I5Y2UuLjNkNDY0NDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2dpZi1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9naWYtZGVtdXgKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogZ2lmCisjZGltZW5zaW9ucyAwOiA0ODB4MzYwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDUsICAgIDc0Njk5LCAweGVmN2U5MWM4CiAwLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMiwgICAgMTAwNzksIDB4Mjg5MmQ5ZTIsIEY9MHgwCiAwLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMiwgICAgMTIzNjksIDB4ZDdkNzMyODYsIEY9MHgwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9naWYtZGlzcG9zYWwtYmFja2dyb3VuZCBiL3Rlc3RzL3JlZi9mYXRlL2dpZi1kaXNwb3NhbC1iYWNrZ3JvdW5kCmluZGV4IDgzODc0NWIuLmNkMGQ4MjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2dpZi1kaXNwb3NhbC1iYWNrZ3JvdW5kCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2dpZi1kaXNwb3NhbC1iYWNrZ3JvdW5kCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMgorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzJ4MzYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTAzNjgsIDB4OGIyMDBjYzgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAxMDM2OCwgMHg0ZTIwOGU0ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDEwMzY4LCAweDA0NGRiYThiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9naWYtZGlzcG9zYWwtcmVzdG9yZSBiL3Rlc3RzL3JlZi9mYXRlL2dpZi1kaXNwb3NhbC1yZXN0b3JlCmluZGV4IDBmZjE3MTUuLmIxMjgyZjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2dpZi1kaXNwb3NhbC1yZXN0b3JlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2dpZi1kaXNwb3NhbC1yZXN0b3JlCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDY4eDYwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTEyMzIwLCAweGI4YWZlNDI5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMTIzMjAsIDB4YWU1ODhhNGIKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDExMjMyMCwgMHhjY2RkMjdiNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZ2lmLWdyYXkgYi90ZXN0cy9yZWYvZmF0ZS9naWYtZ3JheQppbmRleCA1YTEzM2JkLi4xODcwNWQwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9naWYtZ3JheQorKysgYi90ZXN0cy9yZWYvZmF0ZS9naWYtZ3JheQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDgweDM2MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDY5MTIwMCwgMHhlZjZjMGYzZAogMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgNjkxMjAwLCAweGMxOGIzMmRlCiAwLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICA2OTEyMDAsIDB4MjM5NWEzZDcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1iZ3I0X2J5dGUgYi90ZXN0cy9yZWYvZmF0ZS9naWZlbmMtYmdyNF9ieXRlCmluZGV4IGMwZDM5YmQuLjM0OTVhOGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1iZ3I0X2J5dGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLWJncjRfYnl0ZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGdpZgorI2RpbWVuc2lvbnMgMDogMjE3eDIxNworI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDUwOCwgMHhhMWI4MGZjMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgMjEzLCAweDRmNTU0YmQ3LCBTPTEsICAgICAxMDI0LCAweGI2MzI3YzgxCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgICAxMzEsIDB4MjgzYjI5ODgsIFM9MSwgICAgIDEwMjQsIDB4YWUzYTdjODEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1iZ3I4IGIvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLWJncjgKaW5kZXggZjNiNzc3Mi4uMGE0ZTVkNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLWJncjgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLWJncjgKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBnaWYKKyNkaW1lbnNpb25zIDA6IDIxN3gyMTcKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA1NTIsIDB4MjcxYTJkZDMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDI5NywgMHg5MDE2OGE5NSwgUz0xLCAgICAgMTAyNCwgMHhmMzUxNzk5ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgICAgNDM4LCAweDkxZWZjZTFiLCBTPTEsICAgICAxMDI0LCAweGYzNTE3OTlmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9naWZlbmMtZ3JheSBiL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1ncmF5CmluZGV4IGMxMWUxMzIuLjgxY2RkMTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1ncmF5CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1ncmF5CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogZ2lmCisjZGltZW5zaW9ucyAwOiAyMTd4MjE3Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTc5LCAweDBkMGUzYWI4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICAxNTAsIDB4MTc4YjNhOGMsIFM9MSwgICAgIDEwMjQsIDB4YzJmNjdjOWYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAgIDE1NSwgMHg5NDE3NDNmNSwgUz0xLCAgICAgMTAyNCwgMHhjMmY2N2M5ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLXBhbDggYi90ZXN0cy9yZWYvZmF0ZS9naWZlbmMtcGFsOAppbmRleCBhODRlZmEwLi5hNmQ1NzQxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9naWZlbmMtcGFsOAorKysgYi90ZXN0cy9yZWYvZmF0ZS9naWZlbmMtcGFsOApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGdpZgorI2RpbWVuc2lvbnMgMDogMjE3eDIxNworI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDU1MiwgMHgyNzFhMmRkMywgUz0xLCAgICAgMTAyNCwgMHhlYzkwN2E5ZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgMjk3LCAweDkwMTY4YTk1LCBTPTEsICAgICAxMDI0LCAweGYzNTE3OTlmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgICA0MzgsIDB4OTFlZmNlMWIsIFM9MSwgICAgIDEwMjQsIDB4ZjM1MTc5OWYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1yZ2I0X2J5dGUgYi90ZXN0cy9yZWYvZmF0ZS9naWZlbmMtcmdiNF9ieXRlCmluZGV4IDliMDAxMDMuLjA2N2FjY2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1yZ2I0X2J5dGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLXJnYjRfYnl0ZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGdpZgorI2RpbWVuc2lvbnMgMDogMjE3eDIxNworI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDUwOCwgMHhmMDRhMTEzYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgMjEzLCAweDIzYzI0ZDNkLCBTPTEsICAgICAxMDI0LCAweGY3NzAwNDI3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgICAxMzEsIDB4NTZkMjJhMzksIFM9MSwgICAgIDEwMjQsIDB4MDM3MzA0MjcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2dpZmVuYy1yZ2I4IGIvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLXJnYjgKaW5kZXggZDFhOTkwZC4uNDkwZTRkMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLXJnYjgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZ2lmZW5jLXJnYjgKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBnaWYKKyNkaW1lbnNpb25zIDA6IDIxN3gyMTcKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA1NTIsIDB4NDc2MDJjNmMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDI5NywgMHg0OWRkODg0NywgUz0xLCAgICAgMTAyNCwgMHhjZmM4Nzk5ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgICAgNDM4LCAweDQ3NzZkMzUyLCBTPTEsICAgICAxMDI0LCAweGNmYzg3OTlmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9nc20tbXMgYi90ZXN0cy9yZWYvZmF0ZS9nc20tbXMKaW5kZXggNmQxNWNiOC4uMGFjZjlmNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvZ3NtLW1zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2dzbS1tcwpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgMzIwLCAgICAgIDY0MCwgMHhmNzljNTllZQogMCwgICAgICAgIDMyMCwgICAgICAgIDMyMCwgICAgICAzMjAsICAgICAgNjQwLCAweDZlNjI0OGJlCiAwLCAgICAgICAgNjQwLCAgICAgICAgNjQwLCAgICAgIDMyMCwgICAgICA2NDAsIDB4MmE1YjNhZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2dzbS10b2FzdCBiL3Rlc3RzL3JlZi9mYXRlL2dzbS10b2FzdAppbmRleCA3MjFlNGU0Li5kZjVlODI0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9nc20tdG9hc3QKKysrIGIvdGVzdHMvcmVmL2ZhdGUvZ3NtLXRvYXN0CkBAIC0xLDUwMSArMSw1MDcgQEAKICN0YiAwOiAxLzgwMDAKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0YzMyYWIwNgotMCwgICAgICAgIDE2MCwgICAgICAgIDE2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDIwNTJhNGU3Ci0wLCAgICAgICAgMzIwLCAgICAgICAgMzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTlhZWFmY2EKLTAsICAgICAgICA0ODAsICAgICAgICA0ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkZTgzYjQ1MAotMCwgICAgICAgIDY0MCwgICAgICAgIDY0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDA2YTZhODBlCi0wLCAgICAgICAgODAwLCAgICAgICAgODAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjZhZWIxZTIKLTAsICAgICAgICA5NjAsICAgICAgICA5NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyNjIzYjQwYwotMCwgICAgICAgMTEyMCwgICAgICAgMTEyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDhlYzY5ZjI1Ci0wLCAgICAgICAxMjgwLCAgICAgICAxMjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGRhYWFjODgKLTAsICAgICAgIDE0NDAsICAgICAgIDE0NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5ZTYwYjcxMwotMCwgICAgICAgMTYwMCwgICAgICAgMTYwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGI3MzhhYjMwCi0wLCAgICAgICAxNzYwLCAgICAgICAxNzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGI0YmJiOTIKLTAsICAgICAgIDE5MjAsICAgICAgIDE5MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMzcwYWU4YgotMCwgICAgICAgMjA4MCwgICAgICAgMjA4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGI2MTFhM2ZiCi0wLCAgICAgICAyMjQwLCAgICAgICAyMjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDdlZThlM2IKLTAsICAgICAgIDI0MDAsICAgICAgIDI0MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkYjFlYzYyOAotMCwgICAgICAgMjU2MCwgICAgICAgMjU2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGQ1ZjFiZGEyCi0wLCAgICAgICAyNzIwLCAgICAgICAyNzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2FiYjlhOWMKLTAsICAgICAgIDI4ODAsICAgICAgIDI4ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxNmM4YWQ2MQotMCwgICAgICAgMzA0MCwgICAgICAgMzA0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGY3NmZjMjVlCi0wLCAgICAgICAzMjAwLCAgICAgICAzMjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzExOGExMGQKLTAsICAgICAgIDMzNjAsICAgICAgIDMzNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyOWY5YTBkYgotMCwgICAgICAgMzUyMCwgICAgICAgMzUyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDQxZjJhNGVmCi0wLCAgICAgICAzNjgwLCAgICAgICAzNjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzZkZmIyMzEKLTAsICAgICAgIDM4NDAsICAgICAgIDM4NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjNTM5OWVkYQotMCwgICAgICAgNDAwMCwgICAgICAgNDAwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDE3ZDRiOWUwCi0wLCAgICAgICA0MTYwLCAgICAgICA0MTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MmI1Nzk3YWMKLTAsICAgICAgIDQzMjAsICAgICAgIDQzMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMTI4YzVlNwotMCwgICAgICAgNDQ4MCwgICAgICAgNDQ4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGY0ZjM4MDM3Ci0wLCAgICAgICA0NjQwLCAgICAgICA0NjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzdkNmI1ZjIKLTAsICAgICAgIDQ4MDAsICAgICAgIDQ4MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkOTRhOTNlMAotMCwgICAgICAgNDk2MCwgICAgICAgNDk2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDk2OGRhYWUzCi0wLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGE1YmEwZWMKLTAsICAgICAgIDUyODAsICAgICAgIDUyODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzMTZkYTFlYwotMCwgICAgICAgNTQ0MCwgICAgICAgNTQ0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDNhMzViMmQyCi0wLCAgICAgICA1NjAwLCAgICAgICA1NjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2EwYjk4OGYKLTAsICAgICAgIDU3NjAsICAgICAgIDU3NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxMjk1YjBiMQotMCwgICAgICAgNTkyMCwgICAgICAgNTkyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGUxMjFhZTcyCi0wLCAgICAgICA2MDgwLCAgICAgICA2MDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2RhN2FkNDMKLTAsICAgICAgIDYyNDAsICAgICAgIDYyNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5NmE0OWNmZQotMCwgICAgICAgNjQwMCwgICAgICAgNjQwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDcwYzJiMWRlCi0wLCAgICAgICA2NTYwLCAgICAgICA2NTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjY4ZDg4YzAKLTAsICAgICAgIDY3MjAsICAgICAgIDY3MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1NDYwYjVhOAotMCwgICAgICAgNjg4MCwgICAgICAgNjg4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDZhYzc4ZWFiCi0wLCAgICAgICA3MDQwLCAgICAgICA3MDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MGQ4ZGFiODcKLTAsICAgICAgIDcyMDAsICAgICAgIDcyMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlMmJlOTRhZgotMCwgICAgICAgNzM2MCwgICAgICAgNzM2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDM0ODdhY2RjCi0wLCAgICAgICA3NTIwLCAgICAgICA3NTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTA0ODk1NWEKLTAsICAgICAgIDc2ODAsICAgICAgIDc2ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyZWY0YWUwZAotMCwgICAgICAgNzg0MCwgICAgICAgNzg0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGM3NjViNzczCi0wLCAgICAgICA4MDAwLCAgICAgICA4MDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YWQ5NmE0ODYKLTAsICAgICAgIDgxNjAsICAgICAgIDgxNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiOWZkYmYxZgotMCwgICAgICAgODMyMCwgICAgICAgODMyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGYyNmM5ZWNmCi0wLCAgICAgICA4NDgwLCAgICAgICA4NDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmNhZGI1MzUKLTAsICAgICAgIDg2NDAsICAgICAgIDg2NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhOGM4OTdiYwotMCwgICAgICAgODgwMCwgICAgICAgODgwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGFhNThiNTIwCi0wLCAgICAgICA4OTYwLCAgICAgICA4OTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2I0OGE3MTYKLTAsICAgICAgIDkxMjAsICAgICAgIDkxMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0ZDVkYTU2NAotMCwgICAgICAgOTI4MCwgICAgICAgOTI4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDk4MDlhZTI4Ci0wLCAgICAgICA5NDQwLCAgICAgICA5NDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NWJhZWIxZTQKLTAsICAgICAgIDk2MDAsICAgICAgIDk2MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2YTcxOWI2MwotMCwgICAgICAgOTc2MCwgICAgICAgOTc2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGMyN2Q5MmYwCi0wLCAgICAgICA5OTIwLCAgICAgICA5OTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MGU5YjlmZTkKLTAsICAgICAgMTAwODAsICAgICAgMTAwODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiZjlkOWJmNwotMCwgICAgICAxMDI0MCwgICAgICAxMDI0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGYzNWFhNjRkCi0wLCAgICAgIDEwNDAwLCAgICAgIDEwNDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjY0NDljZTgKLTAsICAgICAgMTA1NjAsICAgICAgMTA1NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1OGY0YTk5NwotMCwgICAgICAxMDcyMCwgICAgICAxMDcyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDE1NWRhMjg5Ci0wLCAgICAgIDEwODgwLCAgICAgIDEwODgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjNiMTlhNWMKLTAsICAgICAgMTEwNDAsICAgICAgMTEwNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlMDFhYWQzOAotMCwgICAgICAxMTIwMCwgICAgICAxMTIwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDRlMGY5YzQzCi0wLCAgICAgIDExMzYwLCAgICAgIDExMzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTQ0N2EyODQKLTAsICAgICAgMTE1MjAsICAgICAgMTE1MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkYjM2YTQzMwotMCwgICAgICAxMTY4MCwgICAgICAxMTY4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDc5OWE5YjJjCi0wLCAgICAgIDExODQwLCAgICAgIDExODQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTUyNmExNjIKLTAsICAgICAgMTIwMDAsICAgICAgMTIwMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwYTRlYTE0MAotMCwgICAgICAxMjE2MCwgICAgICAxMjE2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGIwOGY5ZWQ3Ci0wLCAgICAgIDEyMzIwLCAgICAgIDEyMzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjIxYmFiNzYKLTAsICAgICAgMTI0ODAsICAgICAgMTI0ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0YmVmYWNmMAotMCwgICAgICAxMjY0MCwgICAgICAxMjY0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGFjNDg5NTA5Ci0wLCAgICAgIDEyODAwLCAgICAgIDEyODAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTdhMWE1YjQKLTAsICAgICAgMTI5NjAsICAgICAgMTI5NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4MWU4YWI5NwotMCwgICAgICAxMzEyMCwgICAgICAxMzEyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGM2YWRhNGQ2Ci0wLCAgICAgIDEzMjgwLCAgICAgIDEzMjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTI0ODk5NzUKLTAsICAgICAgMTM0NDAsICAgICAgMTM0NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxZGE1OWJhOQotMCwgICAgICAxMzYwMCwgICAgICAxMzYwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGYyMjVhYzYyCi0wLCAgICAgIDEzNzYwLCAgICAgIDEzNzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGM4ZTllYWIKLTAsICAgICAgMTM5MjAsICAgICAgMTM5MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxMDU5OWRlYwotMCwgICAgICAxNDA4MCwgICAgICAxNDA4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDA2YzM5ZmE1Ci0wLCAgICAgIDE0MjQwLCAgICAgIDE0MjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjBlZmEzYzQKLTAsICAgICAgMTQ0MDAsICAgICAgMTQ0MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3MmNhYWRhYgotMCwgICAgICAxNDU2MCwgICAgICAxNDU2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGU0NjE5ZmYwCi0wLCAgICAgIDE0NzIwLCAgICAgIDE0NzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDliY2EwMTcKLTAsICAgICAgMTQ4ODAsICAgICAgMTQ4ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0MTNmOWZiZQotMCwgICAgICAxNTA0MCwgICAgICAxNTA0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDZlYWVkMGVlCi0wLCAgICAgIDE1MjAwLCAgICAgIDE1MjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjdlNGIxZWIKLTAsICAgICAgMTUzNjAsICAgICAgMTUzNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4YzQyYTMwZgotMCwgICAgICAxNTUyMCwgICAgICAxNTUyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDBhZmFhMGY0Ci0wLCAgICAgIDE1NjgwLCAgICAgIDE1NjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MGY3NGI3NmIKLTAsICAgICAgMTU4NDAsICAgICAgMTU4NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhOWEyYjlkNQotMCwgICAgICAxNjAwMCwgICAgICAxNjAwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGRlMmE4NzEyCi0wLCAgICAgIDE2MTYwLCAgICAgIDE2MTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2ZjOGIzYTIKLTAsICAgICAgMTYzMjAsICAgICAgMTYzMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3NjhjYWRjZQotMCwgICAgICAxNjQ4MCwgICAgICAxNjQ4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDNhOGE5N2YxCi0wLCAgICAgIDE2NjQwLCAgICAgIDE2NjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTAyZmE1OWIKLTAsICAgICAgMTY4MDAsICAgICAgMTY4MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0YzNlOWIwZgotMCwgICAgICAxNjk2MCwgICAgICAxNjk2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDFjZDJiMTExCi0wLCAgICAgIDE3MTIwLCAgICAgIDE3MTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTg0NWE1YTMKLTAsICAgICAgMTcyODAsICAgICAgMTcyODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhNmI4Yjk4MgotMCwgICAgICAxNzQ0MCwgICAgICAxNzQ0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDRkNWNhYWI5Ci0wLCAgICAgIDE3NjAwLCAgICAgIDE3NjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Nzk5M2I2MDQKLTAsICAgICAgMTc3NjAsICAgICAgMTc3NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4ZDE5YjM3YgotMCwgICAgICAxNzkyMCwgICAgICAxNzkyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGJlNDhhZGI2Ci0wLCAgICAgIDE4MDgwLCAgICAgIDE4MDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2Q2OGFiOGUKLTAsICAgICAgMTgyNDAsICAgICAgMTgyNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiZmZmYjBlMgotMCwgICAgICAxODQwMCwgICAgICAxODQwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDkwYjViN2UzCi0wLCAgICAgIDE4NTYwLCAgICAgIDE4NTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OWZhMWIwMTYKLTAsICAgICAgMTg3MjAsICAgICAgMTg3MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3MGFiYWZjOQotMCwgICAgICAxODg4MCwgICAgICAxODg4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDgyY2ZhZDljCi0wLCAgICAgIDE5MDQwLCAgICAgIDE5MDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDVmNmFhMmMKLTAsICAgICAgMTkyMDAsICAgICAgMTkyMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1MTFjYmI1YgotMCwgICAgICAxOTM2MCwgICAgICAxOTM2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGQyN2NhYWE2Ci0wLCAgICAgIDE5NTIwLCAgICAgIDE5NTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzgxY2E0ODEKLTAsICAgICAgMTk2ODAsICAgICAgMTk2ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxMmU5YWQxYQotMCwgICAgICAxOTg0MCwgICAgICAxOTg0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGU0NmI5ODlkCi0wLCAgICAgIDIwMDAwLCAgICAgIDIwMDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzZkYmIwYTcKLTAsICAgICAgMjAxNjAsICAgICAgMjAxNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxMGViYTQ4NgotMCwgICAgICAyMDMyMCwgICAgICAyMDMyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDIyNjlhN2M4Ci0wLCAgICAgIDIwNDgwLCAgICAgIDIwNDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDg0YTljN2UKLTAsICAgICAgMjA2NDAsICAgICAgMjA2NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4NGVkYTg5MQotMCwgICAgICAyMDgwMCwgICAgICAyMDgwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDJlZjlhNjM5Ci0wLCAgICAgIDIwOTYwLCAgICAgIDIwOTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGJiMmEwZGQKLTAsICAgICAgMjExMjAsICAgICAgMjExMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0N2U1YTE2OQotMCwgICAgICAyMTI4MCwgICAgICAyMTI4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDk4ZmFhZTQyCi0wLCAgICAgIDIxNDQwLCAgICAgIDIxNDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODFkMmFiYTQKLTAsICAgICAgMjE2MDAsICAgICAgMjE2MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1YWY4YmIzMwotMCwgICAgICAyMTc2MCwgICAgICAyMTc2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDMzMWU4ZDlmCi0wLCAgICAgIDIxOTIwLCAgICAgIDIxOTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDliMGMwOWEKLTAsICAgICAgMjIwODAsICAgICAgMjIwODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiYWY5YmZjZgotMCwgICAgICAyMjI0MCwgICAgICAyMjI0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDU0ZTg5YWI1Ci0wLCAgICAgIDIyNDAwLCAgICAgIDIyNDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MWQ2MmMxZDIKLTAsICAgICAgMjI1NjAsICAgICAgMjI1NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlYWQ2YjQzNgotMCwgICAgICAyMjcyMCwgICAgICAyMjcyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDQ2NWY5OGJjCi0wLCAgICAgIDIyODgwLCAgICAgIDIyODgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTcwN2EzNDYKLTAsICAgICAgMjMwNDAsICAgICAgMjMwNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmNjZjYjFjMgotMCwgICAgICAyMzIwMCwgICAgICAyMzIwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGNmYzg5YWU2Ci0wLCAgICAgIDIzMzYwLCAgICAgIDIzMzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MGIxMGI3OTYKLTAsICAgICAgMjM1MjAsICAgICAgMjM1MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiMjljYWYyYwotMCwgICAgICAyMzY4MCwgICAgICAyMzY4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDAyODRhOWQxCi0wLCAgICAgIDIzODQwLCAgICAgIDIzODQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Yjk2NmI1ZmMKLTAsICAgICAgMjQwMDAsICAgICAgMjQwMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyZGVmYTYzMAotMCwgICAgICAyNDE2MCwgICAgICAyNDE2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGNkY2Q4ZWYzCi0wLCAgICAgIDI0MzIwLCAgICAgIDI0MzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTgxYmJhMmIKLTAsICAgICAgMjQ0ODAsICAgICAgMjQ0ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2YmMwYWViMQotMCwgICAgICAyNDY0MCwgICAgICAyNDY0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDM4ZDhhYzgyCi0wLCAgICAgIDI0ODAwLCAgICAgIDI0ODAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWI2NmE4NjUKLTAsICAgICAgMjQ5NjAsICAgICAgMjQ5NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0ZmZmOWNkOQotMCwgICAgICAyNTEyMCwgICAgICAyNTEyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDY4MTlhMTliCi0wLCAgICAgIDI1MjgwLCAgICAgIDI1MjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZmQ3YzkzY2UKLTAsICAgICAgMjU0NDAsICAgICAgMjU0NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhNzQxOWY2MwotMCwgICAgICAyNTYwMCwgICAgICAyNTYwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDU3MmNhYWNiCi0wLCAgICAgIDI1NzYwLCAgICAgIDI1NzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTE4ZmIxZGUKLTAsICAgICAgMjU5MjAsICAgICAgMjU5MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMDg4YTY3NQotMCwgICAgICAyNjA4MCwgICAgICAyNjA4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDE5MjI5Y2Y3Ci0wLCAgICAgIDI2MjQwLCAgICAgIDI2MjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODI3ZWE4MTIKLTAsICAgICAgMjY0MDAsICAgICAgMjY0MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2YzI1OGVmNwotMCwgICAgICAyNjU2MCwgICAgICAyNjU2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDZhODliOGZlCi0wLCAgICAgIDI2NzIwLCAgICAgIDI2NzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTY2YzljZTAKLTAsICAgICAgMjY4ODAsICAgICAgMjY4ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2OGIzOWRiNwotMCwgICAgICAyNzA0MCwgICAgICAyNzA0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDNkNWFhOGVjCi0wLCAgICAgIDI3MjAwLCAgICAgIDI3MjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjVlMDlmZjMKLTAsICAgICAgMjczNjAsICAgICAgMjczNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3NTlhYTRjZQotMCwgICAgICAyNzUyMCwgICAgICAyNzUyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGU1YWFiMGVhCi0wLCAgICAgIDI3NjgwLCAgICAgIDI3NjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjAzNTllOWEKLTAsICAgICAgMjc4NDAsICAgICAgMjc4NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1MTE5OWZmZgotMCwgICAgICAyODAwMCwgICAgICAyODAwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGIwNGFhMjM2Ci0wLCAgICAgIDI4MTYwLCAgICAgIDI4MTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTA5ZGEwZTMKLTAsICAgICAgMjgzMjAsICAgICAgMjgzMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxNDRmOThhOQotMCwgICAgICAyODQ4MCwgICAgICAyODQ4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDBiNGU5ZjhkCi0wLCAgICAgIDI4NjQwLCAgICAgIDI4NjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmI2OWEwOTAKLTAsICAgICAgMjg4MDAsICAgICAgMjg4MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlYzZlOWI1YgotMCwgICAgICAyODk2MCwgICAgICAyODk2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDRmODZhNDc3Ci0wLCAgICAgIDI5MTIwLCAgICAgIDI5MTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGExNzlkMDQKLTAsICAgICAgMjkyODAsICAgICAgMjkyODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5NjgyYTM3NQotMCwgICAgICAyOTQ0MCwgICAgICAyOTQ0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDNjNmJhNTVlCi0wLCAgICAgIDI5NjAwLCAgICAgIDI5NjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTBjMGFiNTAKLTAsICAgICAgMjk3NjAsICAgICAgMjk3NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlNThlYTkwNwotMCwgICAgICAyOTkyMCwgICAgICAyOTkyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGM1ZWFhMDIxCi0wLCAgICAgIDMwMDgwLCAgICAgIDMwMDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Mzg4NTlmMDEKLTAsICAgICAgMzAyNDAsICAgICAgMzAyNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3M2Y4YTU0MAotMCwgICAgICAzMDQwMCwgICAgICAzMDQwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDM5NWRhMjM0Ci0wLCAgICAgIDMwNTYwLCAgICAgIDMwNTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2Y1MGIxNDQKLTAsICAgICAgMzA3MjAsICAgICAgMzA3MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0NTU2OGNlYgotMCwgICAgICAzMDg4MCwgICAgICAzMDg4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGQwNTA4ZGVjCi0wLCAgICAgIDMxMDQwLCAgICAgIDMxMDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjBhYmE3ZTQKLTAsICAgICAgMzEyMDAsICAgICAgMzEyMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0YjI0YjE1ZgotMCwgICAgICAzMTM2MCwgICAgICAzMTM2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGJmYzlhZmQ2Ci0wLCAgICAgIDMxNTIwLCAgICAgIDMxNTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjBmMmFkNDkKLTAsICAgICAgMzE2ODAsICAgICAgMzE2ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlZWEwYTQyNgotMCwgICAgICAzMTg0MCwgICAgICAzMTg0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGZmMDdhN2M5Ci0wLCAgICAgIDMyMDAwLCAgICAgIDMyMDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2UxZmM3ODgKLTAsICAgICAgMzIxNjAsICAgICAgMzIxNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjMDc0YWU5YgotMCwgICAgICAzMjMyMCwgICAgICAzMjMyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDUxNjQ5Njk2Ci0wLCAgICAgIDMyNDgwLCAgICAgIDMyNDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjQzOTk3NDQKLTAsICAgICAgMzI2NDAsICAgICAgMzI2NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmYjBlYjkyMAotMCwgICAgICAzMjgwMCwgICAgICAzMjgwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDNiZjhhZjVjCi0wLCAgICAgIDMyOTYwLCAgICAgIDMyOTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWFiNjllZTAKLTAsICAgICAgMzMxMjAsICAgICAgMzMxMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxODI2OTZiYgotMCwgICAgICAzMzI4MCwgICAgICAzMzI4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDM2ZTZhZjcyCi0wLCAgICAgIDMzNDQwLCAgICAgIDMzNDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDhjYzllY2MKLTAsICAgICAgMzM2MDAsICAgICAgMzM2MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmYjNjYTdiOAotMCwgICAgICAzMzc2MCwgICAgICAzMzc2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGUwMWFhNGI0Ci0wLCAgICAgIDMzOTIwLCAgICAgIDMzOTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NWM2ZGFjOGMKLTAsICAgICAgMzQwODAsICAgICAgMzQwODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwNzJmYmQ5MwotMCwgICAgICAzNDI0MCwgICAgICAzNDI0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGM4ODk5Y2NjCi0wLCAgICAgIDM0NDAwLCAgICAgIDM0NDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGNjOTkwYWMKLTAsICAgICAgMzQ1NjAsICAgICAgMzQ1NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyOGUwYTlkMAotMCwgICAgICAzNDcyMCwgICAgICAzNDcyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDBjZGJhYTExCi0wLCAgICAgIDM0ODgwLCAgICAgIDM0ODgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGY0Y2EwOTMKLTAsICAgICAgMzUwNDAsICAgICAgMzUwNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3ZWU3OWVhOQotMCwgICAgICAzNTIwMCwgICAgICAzNTIwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGE3NjJiNjk1Ci0wLCAgICAgIDM1MzYwLCAgICAgIDM1MzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OWFmMGI1ZGEKLTAsICAgICAgMzU1MjAsICAgICAgMzU1MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxZjJjYjBlNwotMCwgICAgICAzNTY4MCwgICAgICAzNTY4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDYwMjliOGJiCi0wLCAgICAgIDM1ODQwLCAgICAgIDM1ODQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjJmN2FjZWMKLTAsICAgICAgMzYwMDAsICAgICAgMzYwMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiM2U1YjViZQotMCwgICAgICAzNjE2MCwgICAgICAzNjE2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDI2NmJhOGE2Ci0wLCAgICAgIDM2MzIwLCAgICAgIDM2MzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGZmNTkyOTYKLTAsICAgICAgMzY0ODAsICAgICAgMzY0ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxMWQxYjlhYwotMCwgICAgICAzNjY0MCwgICAgICAzNjY0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDc0OTE5N2Y3Ci0wLCAgICAgIDM2ODAwLCAgICAgIDM2ODAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODE5MmI1MTcKLTAsICAgICAgMzY5NjAsICAgICAgMzY5NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkZTEyOWRiZQotMCwgICAgICAzNzEyMCwgICAgICAzNzEyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDg1ZTRhMDk2Ci0wLCAgICAgIDM3MjgwLCAgICAgIDM3MjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGViZjkxODIKLTAsICAgICAgMzc0NDAsICAgICAgMzc0NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3YTRiYTBiZgotMCwgICAgICAzNzYwMCwgICAgICAzNzYwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDU1ZmU5ZmNkCi0wLCAgICAgIDM3NzYwLCAgICAgIDM3NzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDI0MmFkZWMKLTAsICAgICAgMzc5MjAsICAgICAgMzc5MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlYWY1YjE1OQotMCwgICAgICAzODA4MCwgICAgICAzODA4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGZjYjFhNTcxCi0wLCAgICAgIDM4MjQwLCAgICAgIDM4MjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjJmYWJkYTAKLTAsICAgICAgMzg0MDAsICAgICAgMzg0MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0NWE5YWJjYwotMCwgICAgICAzODU2MCwgICAgICAzODU2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDA3YWY5NzRiCi0wLCAgICAgIDM4NzIwLCAgICAgIDM4NzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzJhMGI0ZmQKLTAsICAgICAgMzg4ODAsICAgICAgMzg4ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjMzBhYmNjZAotMCwgICAgICAzOTA0MCwgICAgICAzOTA0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGQzM2NhNjFjCi0wLCAgICAgIDM5MjAwLCAgICAgIDM5MjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4M2MzM2QxMWEKLTAsICAgICAgMzkzNjAsICAgICAgMzkzNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5YzJjYTBhYwotMCwgICAgICAzOTUyMCwgICAgICAzOTUyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGE1ZDY5Nzc3Ci0wLCAgICAgIDM5NjgwLCAgICAgIDM5NjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjdkMmM2YjgKLTAsICAgICAgMzk4NDAsICAgICAgMzk4NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzNGJiYWFiOQotMCwgICAgICA0MDAwMCwgICAgICA0MDAwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDNlN2JhY2NiCi0wLCAgICAgIDQwMTYwLCAgICAgIDQwMTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTJjNmI3ZTYKLTAsICAgICAgNDAzMjAsICAgICAgNDAzMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjODEwYTE4YQotMCwgICAgICA0MDQ4MCwgICAgICA0MDQ4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDA2YTA5ZjU2Ci0wLCAgICAgIDQwNjQwLCAgICAgIDQwNjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODgwNGE1MDQKLTAsICAgICAgNDA4MDAsICAgICAgNDA4MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3ODNiYTdkNQotMCwgICAgICA0MDk2MCwgICAgICA0MDk2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDI0ZGNhZGE2Ci0wLCAgICAgIDQxMTIwLCAgICAgIDQxMTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGFmNzk2YmUKLTAsICAgICAgNDEyODAsICAgICAgNDEyODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxNDU0YjE5YwotMCwgICAgICA0MTQ0MCwgICAgICA0MTQ0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDBhZDBhNTZlCi0wLCAgICAgIDQxNjAwLCAgICAgIDQxNjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODk0NGE0NGUKLTAsICAgICAgNDE3NjAsICAgICAgNDE3NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzMTA2OWViZAotMCwgICAgICA0MTkyMCwgICAgICA0MTkyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDE5Y2I5ODEyCi0wLCAgICAgIDQyMDgwLCAgICAgIDQyMDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YWM3NWFiZTIKLTAsICAgICAgNDIyNDAsICAgICAgNDIyNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMTYyYTIwMAotMCwgICAgICA0MjQwMCwgICAgICA0MjQwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGEyZDdhNGIyCi0wLCAgICAgIDQyNTYwLCAgICAgIDQyNTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDc4Y2E2MTEKLTAsICAgICAgNDI3MjAsICAgICAgNDI3MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwZWMzOWI0MAotMCwgICAgICA0Mjg4MCwgICAgICA0Mjg4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGU4Zjc5NGIyCi0wLCAgICAgIDQzMDQwLCAgICAgIDQzMDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzJjZmIyNTgKLTAsICAgICAgNDMyMDAsICAgICAgNDMyMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlNDc1OTA2MQotMCwgICAgICA0MzM2MCwgICAgICA0MzM2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGIxYjZhZWE0Ci0wLCAgICAgIDQzNTIwLCAgICAgIDQzNTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OWJmYjk2ZGYKLTAsICAgICAgNDM2ODAsICAgICAgNDM2ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjYzYxYjVkMwotMCwgICAgICA0Mzg0MCwgICAgICA0Mzg0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGQxNGU4ZGY5Ci0wLCAgICAgIDQ0MDAwLCAgICAgIDQ0MDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDlkNWJiZjUKLTAsICAgICAgNDQxNjAsICAgICAgNDQxNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0ZDlmYTliMAotMCwgICAgICA0NDMyMCwgICAgICA0NDMyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGY2MDZhYmZjCi0wLCAgICAgIDQ0NDgwLCAgICAgIDQ0NDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzIwYmFhMTkKLTAsICAgICAgNDQ2NDAsICAgICAgNDQ2NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3ZjdjYWM0OQotMCwgICAgICA0NDgwMCwgICAgICA0NDgwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGNlYWI5YjU0Ci0wLCAgICAgIDQ0OTYwLCAgICAgIDQ0OTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjQ1ZmE3MGEKLTAsICAgICAgNDUxMjAsICAgICAgNDUxMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhMDgxYTQwZgotMCwgICAgICA0NTI4MCwgICAgICA0NTI4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDIxZDc4ZjhjCi0wLCAgICAgIDQ1NDQwLCAgICAgIDQ1NDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWRmM2FiYzYKLTAsICAgICAgNDU2MDAsICAgICAgNDU2MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxNzY3OTYzNwotMCwgICAgICA0NTc2MCwgICAgICA0NTc2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDFjYjFhZTA0Ci0wLCAgICAgIDQ1OTIwLCAgICAgIDQ1OTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTdjZDlmNjIKLTAsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmNGJjYTNhYgotMCwgICAgICA0NjI0MCwgICAgICA0NjI0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGIzYmQ5MTUyCi0wLCAgICAgIDQ2NDAwLCAgICAgIDQ2NDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGUxZTk4MjUKLTAsICAgICAgNDY1NjAsICAgICAgNDY1NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMzdlOWE1NgotMCwgICAgICA0NjcyMCwgICAgICA0NjcyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGQ3NTg5ZmNjCi0wLCAgICAgIDQ2ODgwLCAgICAgIDQ2ODgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NWY5NDllOTAKLTAsICAgICAgNDcwNDAsICAgICAgNDcwNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlMTMzYTQ5NQotMCwgICAgICA0NzIwMCwgICAgICA0NzIwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDdjYjdhNTJjCi0wLCAgICAgIDQ3MzYwLCAgICAgIDQ3MzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjhiMjlkOTUKLTAsICAgICAgNDc1MjAsICAgICAgNDc1MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMWJjYTQ3MgotMCwgICAgICA0NzY4MCwgICAgICA0NzY4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGJjYzY5ODk1Ci0wLCAgICAgIDQ3ODQwLCAgICAgIDQ3ODQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YWJmZmEwZWUKLTAsICAgICAgNDgwMDAsICAgICAgNDgwMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlNjYyOWVjYQotMCwgICAgICA0ODE2MCwgICAgICA0ODE2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDU3MmRhN2NkCi0wLCAgICAgIDQ4MzIwLCAgICAgIDQ4MzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzAxNzk3MmQKLTAsICAgICAgNDg0ODAsICAgICAgNDg0ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhYzRlOWM3OAotMCwgICAgICA0ODY0MCwgICAgICA0ODY0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDExMmY5YzQ1Ci0wLCAgICAgIDQ4ODAwLCAgICAgIDQ4ODAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDVlOWE2NGQKLTAsICAgICAgNDg5NjAsICAgICAgNDg5NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4ZjczOTRkNAotMCwgICAgICA0OTEyMCwgICAgICA0OTEyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGJhZWVhMDdlCi0wLCAgICAgIDQ5MjgwLCAgICAgIDQ5MjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDc1N2MwMGUKLTAsICAgICAgNDk0NDAsICAgICAgNDk0NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4YWEwOTc4MwotMCwgICAgICA0OTYwMCwgICAgICA0OTYwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDMxZDRhZTdhCi0wLCAgICAgIDQ5NzYwLCAgICAgIDQ5NzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjIxNDkzZTgKLTAsICAgICAgNDk5MjAsICAgICAgNDk5MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5MmY0YTNhNwotMCwgICAgICA1MDA4MCwgICAgICA1MDA4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGJkNWJhZmQ5Ci0wLCAgICAgIDUwMjQwLCAgICAgIDUwMjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTg5NWI3NjAKLTAsICAgICAgNTA0MDAsICAgICAgNTA0MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3YTRlYWNkZAotMCwgICAgICA1MDU2MCwgICAgICA1MDU2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGM5ZjdhMWMzCi0wLCAgICAgIDUwNzIwLCAgICAgIDUwNzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDc1MGJlMDYKLTAsICAgICAgNTA4ODAsICAgICAgNTA4ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2NDFkOWE2ZgotMCwgICAgICA1MTA0MCwgICAgICA1MTA0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDcwZDZiNmZmCi0wLCAgICAgIDUxMjAwLCAgICAgIDUxMjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MWZkM2E1NDYKLTAsICAgICAgNTEzNjAsICAgICAgNTEzNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3MmNmYWFiZQotMCwgICAgICA1MTUyMCwgICAgICA1MTUyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDJlNjFiNmNlCi0wLCAgICAgIDUxNjgwLCAgICAgIDUxNjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDgxM2EwOTEKLTAsICAgICAgNTE4NDAsICAgICAgNTE4NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiZmU3YmMwZgotMCwgICAgICA1MjAwMCwgICAgICA1MjAwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDhjNzU5YzFmCi0wLCAgICAgIDUyMTYwLCAgICAgIDUyMTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjRjMWM5NTIKLTAsICAgICAgNTIzMjAsICAgICAgNTIzMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMGZkYWE3OQotMCwgICAgICA1MjQ4MCwgICAgICA1MjQ4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDJmZmRhMjUyCi0wLCAgICAgIDUyNjQwLCAgICAgIDUyNjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODQxYWE1MjMKLTAsICAgICAgNTI4MDAsICAgICAgNTI4MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4YzA3OWU1ZQotMCwgICAgICA1Mjk2MCwgICAgICA1Mjk2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDk2ZTlhODNmCi0wLCAgICAgIDUzMTIwLCAgICAgIDUzMTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTkyNmE2MzkKLTAsICAgICAgNTMyODAsICAgICAgNTMyODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMmUxYTA3YgotMCwgICAgICA1MzQ0MCwgICAgICA1MzQ0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDI5NzJhOTk5Ci0wLCAgICAgIDUzNjAwLCAgICAgIDUzNjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzBjODljNjIKLTAsICAgICAgNTM3NjAsICAgICAgNTM3NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4M2Y1YTI2MwotMCwgICAgICA1MzkyMCwgICAgICA1MzkyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGEzOTA5NjY3Ci0wLCAgICAgIDU0MDgwLCAgICAgIDU0MDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDUzMDlmZDQKLTAsICAgICAgNTQyNDAsICAgICAgNTQyNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzMTU0YTU3MQotMCwgICAgICA1NDQwMCwgICAgICA1NDQwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDUxMDM5YTVlCi0wLCAgICAgIDU0NTYwLCAgICAgIDU0NTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjE2N2EzNDQKLTAsICAgICAgNTQ3MjAsICAgICAgNTQ3MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4ZTcwOWQ3ZAotMCwgICAgICA1NDg4MCwgICAgICA1NDg4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDkzNmZhMGZkCi0wLCAgICAgIDU1MDQwLCAgICAgIDU1MDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDI0YjllM2MKLTAsICAgICAgNTUyMDAsICAgICAgNTUyMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyZWExYWE3NQotMCwgICAgICA1NTM2MCwgICAgICA1NTM2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDMzZjBhMmJiCi0wLCAgICAgIDU1NTIwLCAgICAgIDU1NTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmYwNzlkMmQKLTAsICAgICAgNTU2ODAsICAgICAgNTU2ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4NDdiYTJjOAotMCwgICAgICA1NTg0MCwgICAgICA1NTg0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDM3ZTFhNzY3Ci0wLCAgICAgIDU2MDAwLCAgICAgIDU2MDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjYwN2FjYmIKLTAsICAgICAgNTYxNjAsICAgICAgNTYxNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxMjg4YWM2ZAotMCwgICAgICA1NjMyMCwgICAgICA1NjMyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGY2MGU5OGIzCi0wLCAgICAgIDU2NDgwLCAgICAgIDU2NDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzZiNWFiZGQKLTAsICAgICAgNTY2NDAsICAgICAgNTY2NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3ZmVhYTcxMAotMCwgICAgICA1NjgwMCwgICAgICA1NjgwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDc3MzI5ZmNkCi0wLCAgICAgIDU2OTYwLCAgICAgIDU2OTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTFhNmE3MTUKLTAsICAgICAgNTcxMjAsICAgICAgNTcxMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkMGU5OWYyNAotMCwgICAgICA1NzI4MCwgICAgICA1NzI4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDA3MDg5ZjYxCi0wLCAgICAgIDU3NDQwLCAgICAgIDU3NDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MmJiZGE5MDAKLTAsICAgICAgNTc2MDAsICAgICAgNTc2MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhZDNkYTBkNQotMCwgICAgICA1Nzc2MCwgICAgICA1Nzc2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDk5N2JhNmQyCi0wLCAgICAgIDU3OTIwLCAgICAgIDU3OTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjE1YjlkY2IKLTAsICAgICAgNTgwODAsICAgICAgNTgwODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxN2NlYTgyZgotMCwgICAgICA1ODI0MCwgICAgICA1ODI0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGFiNTFhNzNlCi0wLCAgICAgIDU4NDAwLCAgICAgIDU4NDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzdhMWFiZDYKLTAsICAgICAgNTg1NjAsICAgICAgNTg1NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwYmRkYWNhZAotMCwgICAgICA1ODcyMCwgICAgICA1ODcyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDQzYjNiZGM0Ci0wLCAgICAgIDU4ODgwLCAgICAgIDU4ODgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWZlMGE5YmEKLTAsICAgICAgNTkwNDAsICAgICAgNTkwNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4ZWI0YmMyZgotMCwgICAgICA1OTIwMCwgICAgICA1OTIwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDM5Y2RjMTkwCi0wLCAgICAgIDU5MzYwLCAgICAgIDU5MzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MWVmM2JhZmYKLTAsICAgICAgNTk1MjAsICAgICAgNTk1MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxYTZhYjdlMgotMCwgICAgICA1OTY4MCwgICAgICA1OTY4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDQ0NGNjYzY5Ci0wLCAgICAgIDU5ODQwLCAgICAgIDU5ODQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDVlYmI1OTgKLTAsICAgICAgNjAwMDAsICAgICAgNjAwMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0YWM1YjBhZAotMCwgICAgICA2MDE2MCwgICAgICA2MDE2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDBlZTViYTUyCi0wLCAgICAgIDYwMzIwLCAgICAgIDYwMzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTAxZDlmYTAKLTAsICAgICAgNjA0ODAsICAgICAgNjA0ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyMDM4YTlmNAotMCwgICAgICA2MDY0MCwgICAgICA2MDY0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGE2MWNiOGIzCi0wLCAgICAgIDYwODAwLCAgICAgIDYwODAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGQwMDk3NzcKLTAsICAgICAgNjA5NjAsICAgICAgNjA5NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyYTJkYjg2ZAotMCwgICAgICA2MTEyMCwgICAgICA2MTEyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGU5YmFiM2JjCi0wLCAgICAgIDYxMjgwLCAgICAgIDYxMjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjdmOGEwNTYKLTAsICAgICAgNjE0NDAsICAgICAgNjE0NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1MTRjYWYxNAotMCwgICAgICA2MTYwMCwgICAgICA2MTYwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGEyMjBiMTQ5Ci0wLCAgICAgIDYxNzYwLCAgICAgIDYxNzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmY3ZWExODMKLTAsICAgICAgNjE5MjAsICAgICAgNjE5MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxZDhkYzVjNgotMCwgICAgICA2MjA4MCwgICAgICA2MjA4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDkxODJhOGVhCi0wLCAgICAgIDYyMjQwLCAgICAgIDYyMjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzFlYmEwMjYKLTAsICAgICAgNjI0MDAsICAgICAgNjI0MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjZmJjYzNkZgotMCwgICAgICA2MjU2MCwgICAgICA2MjU2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDNkOGNiN2FlCi0wLCAgICAgIDYyNzIwLCAgICAgIDYyNzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmUzOWFlYzAKLTAsICAgICAgNjI4ODAsICAgICAgNjI4ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkMjM2YmY3MQotMCwgICAgICA2MzA0MCwgICAgICA2MzA0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDkzNzdiMGIyCi0wLCAgICAgIDYzMjAwLCAgICAgIDYzMjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjVlNmIyZGYKLTAsICAgICAgNjMzNjAsICAgICAgNjMzNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhM2I5YmJjZQotMCwgICAgICA2MzUyMCwgICAgICA2MzUyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGE3YmRhMjUxCi0wLCAgICAgIDYzNjgwLCAgICAgIDYzNjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmY5YWIxNjIKLTAsICAgICAgNjM4NDAsICAgICAgNjM4NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2OTI4YjljYgotMCwgICAgICA2NDAwMCwgICAgICA2NDAwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGY1Y2NhMjA5Ci0wLCAgICAgIDY0MTYwLCAgICAgIDY0MTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZmRmNGFmYWQKLTAsICAgICAgNjQzMjAsICAgICAgNjQzMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlN2U3YzIxNgotMCwgICAgICA2NDQ4MCwgICAgICA2NDQ4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDBjNTc5N2M2Ci0wLCAgICAgIDY0NjQwLCAgICAgIDY0NjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjZjMWE5Y2EKLTAsICAgICAgNjQ4MDAsICAgICAgNjQ4MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2YjVjYTQ4ZAotMCwgICAgICA2NDk2MCwgICAgICA2NDk2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGVjMDQ5NjhhCi0wLCAgICAgIDY1MTIwLCAgICAgIDY1MTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YWFhZGE2OTEKLTAsICAgICAgNjUyODAsICAgICAgNjUyODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3N2MzYTYyNAotMCwgICAgICA2NTQ0MCwgICAgICA2NTQ0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGFlZDlhNWQ1Ci0wLCAgICAgIDY1NjAwLCAgICAgIDY1NjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzYwZmFjNDEKLTAsICAgICAgNjU3NjAsICAgICAgNjU3NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhMDVlYTcyNwotMCwgICAgICA2NTkyMCwgICAgICA2NTkyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDlmN2I5ZjgzCi0wLCAgICAgIDY2MDgwLCAgICAgIDY2MDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDc0YmM0YzIKLTAsICAgICAgNjYyNDAsICAgICAgNjYyNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiNjA3OGQzYgotMCwgICAgICA2NjQwMCwgICAgICA2NjQwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDhlMTVhOGY5Ci0wLCAgICAgIDY2NTYwLCAgICAgIDY2NTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2RjN2Q0YTgKLTAsICAgICAgNjY3MjAsICAgICAgNjY3MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1NWNlYWI2YgotMCwgICAgICA2Njg4MCwgICAgICA2Njg4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDk4MmNjOTRmCi0wLCAgICAgIDY3MDQwLCAgICAgIDY3MDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjE1Mzk0OGYKLTAsICAgICAgNjcyMDAsICAgICAgNjcyMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1MzM4YzYyMQotMCwgICAgICA2NzM2MCwgICAgICA2NzM2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDJlMmRiNmU4Ci0wLCAgICAgIDY3NTIwLCAgICAgIDY3NTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjhlM2E5YzMKLTAsICAgICAgNjc2ODAsICAgICAgNjc2ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3NGQ3YjQzNQotMCwgICAgICA2Nzg0MCwgICAgICA2Nzg0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGNmMTdhMTBjCi0wLCAgICAgIDY4MDAwLCAgICAgIDY4MDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjFmOWFjOGMKLTAsICAgICAgNjgxNjAsICAgICAgNjgxNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzNWUwYjQ4MAotMCwgICAgICA2ODMyMCwgICAgICA2ODMyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDVlNjBiM2E0Ci0wLCAgICAgIDY4NDgwLCAgICAgIDY4NDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjA1NzliMjYKLTAsICAgICAgNjg2NDAsICAgICAgNjg2NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzZTI3Yjg5YgotMCwgICAgICA2ODgwMCwgICAgICA2ODgwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDAyZTRhZjk0Ci0wLCAgICAgIDY4OTYwLCAgICAgIDY4OTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NmQ2ODk3ZjEKLTAsICAgICAgNjkxMjAsICAgICAgNjkxMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxNTgyYjI2NwotMCwgICAgICA2OTI4MCwgICAgICA2OTI4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDMzYmE5ZWIzCi0wLCAgICAgIDY5NDQwLCAgICAgIDY5NDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjZhY2FkN2QKLTAsICAgICAgNjk2MDAsICAgICAgNjk2MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxOTY5YTZjMgotMCwgICAgICA2OTc2MCwgICAgICA2OTc2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDM2M2ZhMzUwCi0wLCAgICAgIDY5OTIwLCAgICAgIDY5OTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YWU1MGJmNjUKLTAsICAgICAgNzAwODAsICAgICAgNzAwODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwODc3YTUwZgotMCwgICAgICA3MDI0MCwgICAgICA3MDI0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDY2ZTJhNDJmCi0wLCAgICAgIDcwNDAwLCAgICAgIDcwNDAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MGIwYWJjYjMKLTAsICAgICAgNzA1NjAsICAgICAgNzA1NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyM2E5YWZhYQotMCwgICAgICA3MDcyMCwgICAgICA3MDcyMCwgICAgICAxNjAsICAgICAgMzIwLCAweGMzNzI5YjQwCi0wLCAgICAgIDcwODgwLCAgICAgIDcwODgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGQzZmM3ZTIKLTAsICAgICAgNzEwNDAsICAgICAgNzEwNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3ZTA0OTRhZgotMCwgICAgICA3MTIwMCwgICAgICA3MTIwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGNiZDA5NmZiCi0wLCAgICAgIDcxMzYwLCAgICAgIDcxMzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NWQ3MWIzMDMKLTAsICAgICAgNzE1MjAsICAgICAgNzE1MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlZWRjYTA0YQotMCwgICAgICA3MTY4MCwgICAgICA3MTY4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDI4MzZhNDdkCi0wLCAgICAgIDcxODQwLCAgICAgIDcxODQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzIzN2MyYTAKLTAsICAgICAgNzIwMDAsICAgICAgNzIwMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3YzAwOWJjMAotMCwgICAgICA3MjE2MCwgICAgICA3MjE2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGM5ZGNiMzY2Ci0wLCAgICAgIDcyMzIwLCAgICAgIDcyMzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDk5M2FhYzgKLTAsICAgICAgNzI0ODAsICAgICAgNzI0ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwNWVjOTk1NAotMCwgICAgICA3MjY0MCwgICAgICA3MjY0MCwgICAgICAxNjAsICAgICAgMzIwLCAweGE5NTViZDVjCi0wLCAgICAgIDcyODAwLCAgICAgIDcyODAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTAxOGFlYTMKLTAsICAgICAgNzI5NjAsICAgICAgNzI5NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3ODBjY2E1MgotMCwgICAgICA3MzEyMCwgICAgICA3MzEyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDliOGY5NWY2Ci0wLCAgICAgIDczMjgwLCAgICAgIDczMjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2Q3YmIxNzgKLTAsICAgICAgNzM0NDAsICAgICAgNzM0NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmZWM2YjQ0MwotMCwgICAgICA3MzYwMCwgICAgICA3MzYwMCwgICAgICAxNjAsICAgICAgMzIwLCAweGUyMTRhYmI2Ci0wLCAgICAgIDczNzYwLCAgICAgIDczNzYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGNiZWJiMzgKLTAsICAgICAgNzM5MjAsICAgICAgNzM5MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlNjgzYTMwZAotMCwgICAgICA3NDA4MCwgICAgICA3NDA4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGU0Y2RiMTk3Ci0wLCAgICAgIDc0MjQwLCAgICAgIDc0MjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTQyNmM0MzIKLTAsICAgICAgNzQ0MDAsICAgICAgNzQ0MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3NjFiYTZjYwotMCwgICAgICA3NDU2MCwgICAgICA3NDU2MCwgICAgICAxNjAsICAgICAgMzIwLCAweGNjOWFhNmFhCi0wLCAgICAgIDc0NzIwLCAgICAgIDc0NzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzQyYmQwM2QKLTAsICAgICAgNzQ4ODAsICAgICAgNzQ4ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2MWQ5YTUxMQotMCwgICAgICA3NTA0MCwgICAgICA3NTA0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDMwMjFhNGRkCi0wLCAgICAgIDc1MjAwLCAgICAgIDc1MjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Njk3MGJiYzAKLTAsICAgICAgNzUzNjAsICAgICAgNzUzNjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3NmY1YTAzNwotMCwgICAgICA3NTUyMCwgICAgICA3NTUyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDc1OGQ5MWYyCi0wLCAgICAgIDc1NjgwLCAgICAgIDc1NjgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTg1NGEyZjEKLTAsICAgICAgNzU4NDAsICAgICAgNzU4NDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmOTk0YTZmOAotMCwgICAgICA3NjAwMCwgICAgICA3NjAwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDMxZWJhZjQwCi0wLCAgICAgIDc2MTYwLCAgICAgIDc2MTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjQ2OTk5NzAKLTAsICAgICAgNzYzMjAsICAgICAgNzYzMjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzN2RkYTUzZQotMCwgICAgICA3NjQ4MCwgICAgICA3NjQ4MCwgICAgICAxNjAsICAgICAgMzIwLCAweGE4NTdhNzUyCi0wLCAgICAgIDc2NjQwLCAgICAgIDc2NjQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzQ4M2FkMWQKLTAsICAgICAgNzY4MDAsICAgICAgNzY4MDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1OTY2YWRkOQotMCwgICAgICA3Njk2MCwgICAgICA3Njk2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDRkYmFiODljCi0wLCAgICAgIDc3MTIwLCAgICAgIDc3MTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MmYwYmIwZTYKLTAsICAgICAgNzcyODAsICAgICAgNzcyODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5MTNhYWE4OAotMCwgICAgICA3NzQ0MCwgICAgICA3NzQ0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDI0NWRjMWMzCi0wLCAgICAgIDc3NjAwLCAgICAgIDc3NjAwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjA4NWM1YWQKLTAsICAgICAgNzc3NjAsICAgICAgNzc3NjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5Y2YxYjBmYQotMCwgICAgICA3NzkyMCwgICAgICA3NzkyMCwgICAgICAxNjAsICAgICAgMzIwLCAweDY4ODdiNTQzCi0wLCAgICAgIDc4MDgwLCAgICAgIDc4MDgwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2FkNjlmZWIKLTAsICAgICAgNzgyNDAsICAgICAgNzgyNDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjMTJhOGRkYgotMCwgICAgICA3ODQwMCwgICAgICA3ODQwMCwgICAgICAxNjAsICAgICAgMzIwLCAweDAxZDFiYzVhCi0wLCAgICAgIDc4NTYwLCAgICAgIDc4NTYwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzAxOGI3ZTgKLTAsICAgICAgNzg3MjAsICAgICAgNzg3MjAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2NDMxYjBlZgotMCwgICAgICA3ODg4MCwgICAgICA3ODg4MCwgICAgICAxNjAsICAgICAgMzIwLCAweDNhNTM5OThlCi0wLCAgICAgIDc5MDQwLCAgICAgIDc5MDQwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4MWM4MGE2YzYKLTAsICAgICAgNzkyMDAsICAgICAgNzkyMDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2NjM5YWRjNQotMCwgICAgICA3OTM2MCwgICAgICA3OTM2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDkyNDg5ZjlhCi0wLCAgICAgIDc5NTIwLCAgICAgIDc5NTIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGNhZmFkMDAKLTAsICAgICAgNzk2ODAsICAgICAgNzk2ODAsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjYTAzOTJlMQotMCwgICAgICA3OTg0MCwgICAgICA3OTg0MCwgICAgICAxNjAsICAgICAgMzIwLCAweDMwYTlhZTg4CisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICA2NCwgICAgICAxMjgsIDB4M2VmMzNmNmYKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyMDUyYTRlNworMCwgICAgICAgIDIyNCwgICAgICAgIDIyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGU5YWVhZmNhCiswLCAgICAgICAgMzg0LCAgICAgICAgMzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGU4M2I0NTAKKzAsICAgICAgICA1NDQsICAgICAgICA1NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwNmE2YTgwZQorMCwgICAgICAgIDcwNCwgICAgICAgIDcwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGY2YWViMWUyCiswLCAgICAgICAgODY0LCAgICAgICAgODY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjYyM2I0MGMKKzAsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4ZWM2OWYyNQorMCwgICAgICAgMTE4NCwgICAgICAgMTE4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGRkYWFhYzg4CiswLCAgICAgICAxMzQ0LCAgICAgICAxMzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OWU2MGI3MTMKKzAsICAgICAgIDE1MDQsICAgICAgIDE1MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiNzM4YWIzMAorMCwgICAgICAgMTY2NCwgICAgICAgMTY2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGRiNGJiYjkyCiswLCAgICAgICAxODI0LCAgICAgICAxODI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDM3MGFlOGIKKzAsICAgICAgIDE5ODQsICAgICAgIDE5ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiNjExYTNmYgorMCwgICAgICAgMjE0NCwgICAgICAgMjE0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDA3ZWU4ZTNiCiswLCAgICAgICAyMzA0LCAgICAgICAyMzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGIxZWM2MjgKKzAsICAgICAgIDI0NjQsICAgICAgIDI0NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkNWYxYmRhMgorMCwgICAgICAgMjYyNCwgICAgICAgMjYyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGNhYmI5YTljCiswLCAgICAgICAyNzg0LCAgICAgICAyNzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTZjOGFkNjEKKzAsICAgICAgIDI5NDQsICAgICAgIDI5NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmNzZmYzI1ZQorMCwgICAgICAgMzEwNCwgICAgICAgMzEwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDcxMThhMTBkCiswLCAgICAgICAzMjY0LCAgICAgICAzMjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjlmOWEwZGIKKzAsICAgICAgIDM0MjQsICAgICAgIDM0MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0MWYyYTRlZgorMCwgICAgICAgMzU4NCwgICAgICAgMzU4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDM2ZGZiMjMxCiswLCAgICAgICAzNzQ0LCAgICAgICAzNzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzUzOTllZGEKKzAsICAgICAgIDM5MDQsICAgICAgIDM5MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxN2Q0YjllMAorMCwgICAgICAgNDA2NCwgICAgICAgNDA2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDJiNTc5N2FjCiswLCAgICAgICA0MjI0LCAgICAgICA0MjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDEyOGM1ZTcKKzAsICAgICAgIDQzODQsICAgICAgIDQzODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmNGYzODAzNworMCwgICAgICAgNDU0NCwgICAgICAgNDU0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDc3ZDZiNWYyCiswLCAgICAgICA0NzA0LCAgICAgICA0NzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDk0YTkzZTAKKzAsICAgICAgIDQ4NjQsICAgICAgIDQ4NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5NjhkYWFlMworMCwgICAgICAgNTAyNCwgICAgICAgNTAyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGRhNWJhMGVjCiswLCAgICAgICA1MTg0LCAgICAgICA1MTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzE2ZGExZWMKKzAsICAgICAgIDUzNDQsICAgICAgIDUzNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzYTM1YjJkMgorMCwgICAgICAgNTUwNCwgICAgICAgNTUwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGNhMGI5ODhmCiswLCAgICAgICA1NjY0LCAgICAgICA1NjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTI5NWIwYjEKKzAsICAgICAgIDU4MjQsICAgICAgIDU4MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlMTIxYWU3MgorMCwgICAgICAgNTk4NCwgICAgICAgNTk4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDdkYTdhZDQzCiswLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTZhNDljZmUKKzAsICAgICAgIDYzMDQsICAgICAgIDYzMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3MGMyYjFkZQorMCwgICAgICAgNjQ2NCwgICAgICAgNjQ2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDY2OGQ4OGMwCiswLCAgICAgICA2NjI0LCAgICAgICA2NjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTQ2MGI1YTgKKzAsICAgICAgIDY3ODQsICAgICAgIDY3ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2YWM3OGVhYgorMCwgICAgICAgNjk0NCwgICAgICAgNjk0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDBkOGRhYjg3CiswLCAgICAgICA3MTA0LCAgICAgICA3MTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTJiZTk0YWYKKzAsICAgICAgIDcyNjQsICAgICAgIDcyNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzNDg3YWNkYworMCwgICAgICAgNzQyNCwgICAgICAgNzQyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDUwNDg5NTVhCiswLCAgICAgICA3NTg0LCAgICAgICA3NTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MmVmNGFlMGQKKzAsICAgICAgIDc3NDQsICAgICAgIDc3NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjNzY1Yjc3MworMCwgICAgICAgNzkwNCwgICAgICAgNzkwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGFkOTZhNDg2CiswLCAgICAgICA4MDY0LCAgICAgICA4MDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjlmZGJmMWYKKzAsICAgICAgIDgyMjQsICAgICAgIDgyMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmMjZjOWVjZgorMCwgICAgICAgODM4NCwgICAgICAgODM4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGJjYWRiNTM1CiswLCAgICAgICA4NTQ0LCAgICAgICA4NTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YThjODk3YmMKKzAsICAgICAgIDg3MDQsICAgICAgIDg3MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhYTU4YjUyMAorMCwgICAgICAgODg2NCwgICAgICAgODg2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGNiNDhhNzE2CiswLCAgICAgICA5MDI0LCAgICAgICA5MDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGQ1ZGE1NjQKKzAsICAgICAgIDkxODQsICAgICAgIDkxODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5ODA5YWUyOAorMCwgICAgICAgOTM0NCwgICAgICAgOTM0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDViYWViMWU0CiswLCAgICAgICA5NTA0LCAgICAgICA5NTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NmE3MTliNjMKKzAsICAgICAgIDk2NjQsICAgICAgIDk2NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjMjdkOTJmMAorMCwgICAgICAgOTgyNCwgICAgICAgOTgyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDBlOWI5ZmU5CiswLCAgICAgICA5OTg0LCAgICAgICA5OTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmY5ZDliZjcKKzAsICAgICAgMTAxNDQsICAgICAgMTAxNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmMzVhYTY0ZAorMCwgICAgICAxMDMwNCwgICAgICAxMDMwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDI2NDQ5Y2U4CiswLCAgICAgIDEwNDY0LCAgICAgIDEwNDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NThmNGE5OTcKKzAsICAgICAgMTA2MjQsICAgICAgMTA2MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxNTVkYTI4OQorMCwgICAgICAxMDc4NCwgICAgICAxMDc4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDYzYjE5YTVjCiswLCAgICAgIDEwOTQ0LCAgICAgIDEwOTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTAxYWFkMzgKKzAsICAgICAgMTExMDQsICAgICAgMTExMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0ZTBmOWM0MworMCwgICAgICAxMTI2NCwgICAgICAxMTI2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDk0NDdhMjg0CiswLCAgICAgIDExNDI0LCAgICAgIDExNDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGIzNmE0MzMKKzAsICAgICAgMTE1ODQsICAgICAgMTE1ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3OTlhOWIyYworMCwgICAgICAxMTc0NCwgICAgICAxMTc0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDE1MjZhMTYyCiswLCAgICAgIDExOTA0LCAgICAgIDExOTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MGE0ZWExNDAKKzAsICAgICAgMTIwNjQsICAgICAgMTIwNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiMDhmOWVkNworMCwgICAgICAxMjIyNCwgICAgICAxMjIyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDIyMWJhYjc2CiswLCAgICAgIDEyMzg0LCAgICAgIDEyMzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGJlZmFjZjAKKzAsICAgICAgMTI1NDQsICAgICAgMTI1NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhYzQ4OTUwOQorMCwgICAgICAxMjcwNCwgICAgICAxMjcwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDU3YTFhNWI0CiswLCAgICAgIDEyODY0LCAgICAgIDEyODY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODFlOGFiOTcKKzAsICAgICAgMTMwMjQsICAgICAgMTMwMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjNmFkYTRkNgorMCwgICAgICAxMzE4NCwgICAgICAxMzE4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDEyNDg5OTc1CiswLCAgICAgIDEzMzQ0LCAgICAgIDEzMzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MWRhNTliYTkKKzAsICAgICAgMTM1MDQsICAgICAgMTM1MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmMjI1YWM2MgorMCwgICAgICAxMzY2NCwgICAgICAxMzY2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDhjOGU5ZWFiCiswLCAgICAgIDEzODI0LCAgICAgIDEzODI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTA1OTlkZWMKKzAsICAgICAgMTM5ODQsICAgICAgMTM5ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwNmMzOWZhNQorMCwgICAgICAxNDE0NCwgICAgICAxNDE0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGIwZWZhM2M0CiswLCAgICAgIDE0MzA0LCAgICAgIDE0MzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzJjYWFkYWIKKzAsICAgICAgMTQ0NjQsICAgICAgMTQ0NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlNDYxOWZmMAorMCwgICAgICAxNDYyNCwgICAgICAxNDYyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDQ5YmNhMDE3CiswLCAgICAgIDE0Nzg0LCAgICAgIDE0Nzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDEzZjlmYmUKKzAsICAgICAgMTQ5NDQsICAgICAgMTQ5NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2ZWFlZDBlZQorMCwgICAgICAxNTEwNCwgICAgICAxNTEwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDI3ZTRiMWViCiswLCAgICAgIDE1MjY0LCAgICAgIDE1MjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGM0MmEzMGYKKzAsICAgICAgMTU0MjQsICAgICAgMTU0MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwYWZhYTBmNAorMCwgICAgICAxNTU4NCwgICAgICAxNTU4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDBmNzRiNzZiCiswLCAgICAgIDE1NzQ0LCAgICAgIDE1NzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTlhMmI5ZDUKKzAsICAgICAgMTU5MDQsICAgICAgMTU5MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkZTJhODcxMgorMCwgICAgICAxNjA2NCwgICAgICAxNjA2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGNmYzhiM2EyCiswLCAgICAgIDE2MjI0LCAgICAgIDE2MjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzY4Y2FkY2UKKzAsICAgICAgMTYzODQsICAgICAgMTYzODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzYThhOTdmMQorMCwgICAgICAxNjU0NCwgICAgICAxNjU0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDUwMmZhNTliCiswLCAgICAgIDE2NzA0LCAgICAgIDE2NzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGMzZTliMGYKKzAsICAgICAgMTY4NjQsICAgICAgMTY4NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxY2QyYjExMQorMCwgICAgICAxNzAyNCwgICAgICAxNzAyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGE4NDVhNWEzCiswLCAgICAgIDE3MTg0LCAgICAgIDE3MTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTZiOGI5ODIKKzAsICAgICAgMTczNDQsICAgICAgMTczNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0ZDVjYWFiOQorMCwgICAgICAxNzUwNCwgICAgICAxNzUwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDc5OTNiNjA0CiswLCAgICAgIDE3NjY0LCAgICAgIDE3NjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGQxOWIzN2IKKzAsICAgICAgMTc4MjQsICAgICAgMTc4MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiZTQ4YWRiNgorMCwgICAgICAxNzk4NCwgICAgICAxNzk4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDdkNjhhYjhlCiswLCAgICAgIDE4MTQ0LCAgICAgIDE4MTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmZmZmIwZTIKKzAsICAgICAgMTgzMDQsICAgICAgMTgzMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5MGI1YjdlMworMCwgICAgICAxODQ2NCwgICAgICAxODQ2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDlmYTFiMDE2CiswLCAgICAgIDE4NjI0LCAgICAgIDE4NjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzBhYmFmYzkKKzAsICAgICAgMTg3ODQsICAgICAgMTg3ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4MmNmYWQ5YworMCwgICAgICAxODk0NCwgICAgICAxODk0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDA1ZjZhYTJjCiswLCAgICAgIDE5MTA0LCAgICAgIDE5MTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTExY2JiNWIKKzAsICAgICAgMTkyNjQsICAgICAgMTkyNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkMjdjYWFhNgorMCwgICAgICAxOTQyNCwgICAgICAxOTQyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDc4MWNhNDgxCiswLCAgICAgIDE5NTg0LCAgICAgIDE5NTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTJlOWFkMWEKKzAsICAgICAgMTk3NDQsICAgICAgMTk3NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlNDZiOTg5ZAorMCwgICAgICAxOTkwNCwgICAgICAxOTkwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDc2ZGJiMGE3CiswLCAgICAgIDIwMDY0LCAgICAgIDIwMDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTBlYmE0ODYKKzAsICAgICAgMjAyMjQsICAgICAgMjAyMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyMjY5YTdjOAorMCwgICAgICAyMDM4NCwgICAgICAyMDM4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDA4NGE5YzdlCiswLCAgICAgIDIwNTQ0LCAgICAgIDIwNTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODRlZGE4OTEKKzAsICAgICAgMjA3MDQsICAgICAgMjA3MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyZWY5YTYzOQorMCwgICAgICAyMDg2NCwgICAgICAyMDg2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDhiYjJhMGRkCiswLCAgICAgIDIxMDI0LCAgICAgIDIxMDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDdlNWExNjkKKzAsICAgICAgMjExODQsICAgICAgMjExODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5OGZhYWU0MgorMCwgICAgICAyMTM0NCwgICAgICAyMTM0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDgxZDJhYmE0CiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NWFmOGJiMzMKKzAsICAgICAgMjE2NjQsICAgICAgMjE2NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzMzFlOGQ5ZgorMCwgICAgICAyMTgyNCwgICAgICAyMTgyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGQ5YjBjMDlhCiswLCAgICAgIDIxOTg0LCAgICAgIDIxOTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmFmOWJmY2YKKzAsICAgICAgMjIxNDQsICAgICAgMjIxNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1NGU4OWFiNQorMCwgICAgICAyMjMwNCwgICAgICAyMjMwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDFkNjJjMWQyCiswLCAgICAgIDIyNDY0LCAgICAgIDIyNDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWFkNmI0MzYKKzAsICAgICAgMjI2MjQsICAgICAgMjI2MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0NjVmOThiYworMCwgICAgICAyMjc4NCwgICAgICAyMjc4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGU3MDdhMzQ2CiswLCAgICAgIDIyOTQ0LCAgICAgIDIyOTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjY2Y2IxYzIKKzAsICAgICAgMjMxMDQsICAgICAgMjMxMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjZmM4OWFlNgorMCwgICAgICAyMzI2NCwgICAgICAyMzI2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDBiMTBiNzk2CiswLCAgICAgIDIzNDI0LCAgICAgIDIzNDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjI5Y2FmMmMKKzAsICAgICAgMjM1ODQsICAgICAgMjM1ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMjg0YTlkMQorMCwgICAgICAyMzc0NCwgICAgICAyMzc0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGI5NjZiNWZjCiswLCAgICAgIDIzOTA0LCAgICAgIDIzOTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MmRlZmE2MzAKKzAsICAgICAgMjQwNjQsICAgICAgMjQwNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjZGNkOGVmMworMCwgICAgICAyNDIyNCwgICAgICAyNDIyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGE4MWJiYTJiCiswLCAgICAgIDI0Mzg0LCAgICAgIDI0Mzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NmJjMGFlYjEKKzAsICAgICAgMjQ1NDQsICAgICAgMjQ1NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzOGQ4YWM4MgorMCwgICAgICAyNDcwNCwgICAgICAyNDcwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGViNjZhODY1CiswLCAgICAgIDI0ODY0LCAgICAgIDI0ODY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGZmZjljZDkKKzAsICAgICAgMjUwMjQsICAgICAgMjUwMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2ODE5YTE5YgorMCwgICAgICAyNTE4NCwgICAgICAyNTE4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGZkN2M5M2NlCiswLCAgICAgIDI1MzQ0LCAgICAgIDI1MzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTc0MTlmNjMKKzAsICAgICAgMjU1MDQsICAgICAgMjU1MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1NzJjYWFjYgorMCwgICAgICAyNTY2NCwgICAgICAyNTY2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDkxOGZiMWRlCiswLCAgICAgIDI1ODI0LCAgICAgIDI1ODI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDA4OGE2NzUKKzAsICAgICAgMjU5ODQsICAgICAgMjU5ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxOTIyOWNmNworMCwgICAgICAyNjE0NCwgICAgICAyNjE0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDgyN2VhODEyCiswLCAgICAgIDI2MzA0LCAgICAgIDI2MzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NmMyNThlZjcKKzAsICAgICAgMjY0NjQsICAgICAgMjY0NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2YTg5YjhmZQorMCwgICAgICAyNjYyNCwgICAgICAyNjYyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDE2NmM5Y2UwCiswLCAgICAgIDI2Nzg0LCAgICAgIDI2Nzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjhiMzlkYjcKKzAsICAgICAgMjY5NDQsICAgICAgMjY5NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzZDVhYThlYworMCwgICAgICAyNzEwNCwgICAgICAyNzEwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDI1ZTA5ZmYzCiswLCAgICAgIDI3MjY0LCAgICAgIDI3MjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzU5YWE0Y2UKKzAsICAgICAgMjc0MjQsICAgICAgMjc0MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlNWFhYjBlYQorMCwgICAgICAyNzU4NCwgICAgICAyNzU4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGYwMzU5ZTlhCiswLCAgICAgIDI3NzQ0LCAgICAgIDI3NzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTExOTlmZmYKKzAsICAgICAgMjc5MDQsICAgICAgMjc5MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiMDRhYTIzNgorMCwgICAgICAyODA2NCwgICAgICAyODA2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGUwOWRhMGUzCiswLCAgICAgIDI4MjI0LCAgICAgIDI4MjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTQ0Zjk4YTkKKzAsICAgICAgMjgzODQsICAgICAgMjgzODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwYjRlOWY4ZAorMCwgICAgICAyODU0NCwgICAgICAyODU0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGJiNjlhMDkwCiswLCAgICAgIDI4NzA0LCAgICAgIDI4NzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWM2ZTliNWIKKzAsICAgICAgMjg4NjQsICAgICAgMjg4NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0Zjg2YTQ3NworMCwgICAgICAyOTAyNCwgICAgICAyOTAyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDRhMTc5ZDA0CiswLCAgICAgIDI5MTg0LCAgICAgIDI5MTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTY4MmEzNzUKKzAsICAgICAgMjkzNDQsICAgICAgMjkzNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzYzZiYTU1ZQorMCwgICAgICAyOTUwNCwgICAgICAyOTUwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDUwYzBhYjUwCiswLCAgICAgIDI5NjY0LCAgICAgIDI5NjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTU4ZWE5MDcKKzAsICAgICAgMjk4MjQsICAgICAgMjk4MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjNWVhYTAyMQorMCwgICAgICAyOTk4NCwgICAgICAyOTk4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDM4ODU5ZjAxCiswLCAgICAgIDMwMTQ0LCAgICAgIDMwMTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzNmOGE1NDAKKzAsICAgICAgMzAzMDQsICAgICAgMzAzMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzOTVkYTIzNAorMCwgICAgICAzMDQ2NCwgICAgICAzMDQ2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDdmNTBiMTQ0CiswLCAgICAgIDMwNjI0LCAgICAgIDMwNjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDU1NjhjZWIKKzAsICAgICAgMzA3ODQsICAgICAgMzA3ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkMDUwOGRlYworMCwgICAgICAzMDk0NCwgICAgICAzMDk0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDYwYWJhN2U0CiswLCAgICAgIDMxMTA0LCAgICAgIDMxMTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGIyNGIxNWYKKzAsICAgICAgMzEyNjQsICAgICAgMzEyNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiZmM5YWZkNgorMCwgICAgICAzMTQyNCwgICAgICAzMTQyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGYwZjJhZDQ5CiswLCAgICAgIDMxNTg0LCAgICAgIDMxNTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWVhMGE0MjYKKzAsICAgICAgMzE3NDQsICAgICAgMzE3NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmZjA3YTdjOQorMCwgICAgICAzMTkwNCwgICAgICAzMTkwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGNlMWZjNzg4CiswLCAgICAgIDMyMDY0LCAgICAgIDMyMDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzA3NGFlOWIKKzAsICAgICAgMzIyMjQsICAgICAgMzIyMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1MTY0OTY5NgorMCwgICAgICAzMjM4NCwgICAgICAzMjM4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDI0Mzk5NzQ0CiswLCAgICAgIDMyNTQ0LCAgICAgIDMyNTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZmIwZWI5MjAKKzAsICAgICAgMzI3MDQsICAgICAgMzI3MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzYmY4YWY1YworMCwgICAgICAzMjg2NCwgICAgICAzMjg2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGVhYjY5ZWUwCiswLCAgICAgIDMzMDI0LCAgICAgIDMzMDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTgyNjk2YmIKKzAsICAgICAgMzMxODQsICAgICAgMzMxODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzNmU2YWY3MgorMCwgICAgICAzMzM0NCwgICAgICAzMzM0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDQ4Y2M5ZWNjCiswLCAgICAgIDMzNTA0LCAgICAgIDMzNTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZmIzY2E3YjgKKzAsICAgICAgMzM2NjQsICAgICAgMzM2NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlMDFhYTRiNAorMCwgICAgICAzMzgyNCwgICAgICAzMzgyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDVjNmRhYzhjCiswLCAgICAgIDMzOTg0LCAgICAgIDMzOTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDcyZmJkOTMKKzAsICAgICAgMzQxNDQsICAgICAgMzQxNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjODg5OWNjYworMCwgICAgICAzNDMwNCwgICAgICAzNDMwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGRjYzk5MGFjCiswLCAgICAgIDM0NDY0LCAgICAgIDM0NDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjhlMGE5ZDAKKzAsICAgICAgMzQ2MjQsICAgICAgMzQ2MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwY2RiYWExMQorMCwgICAgICAzNDc4NCwgICAgICAzNDc4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDhmNGNhMDkzCiswLCAgICAgIDM0OTQ0LCAgICAgIDM0OTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2VlNzllYTkKKzAsICAgICAgMzUxMDQsICAgICAgMzUxMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhNzYyYjY5NQorMCwgICAgICAzNTI2NCwgICAgICAzNTI2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDlhZjBiNWRhCiswLCAgICAgIDM1NDI0LCAgICAgIDM1NDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MWYyY2IwZTcKKzAsICAgICAgMzU1ODQsICAgICAgMzU1ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2MDI5YjhiYgorMCwgICAgICAzNTc0NCwgICAgICAzNTc0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGYyZjdhY2VjCiswLCAgICAgIDM1OTA0LCAgICAgIDM1OTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjNlNWI1YmUKKzAsICAgICAgMzYwNjQsICAgICAgMzYwNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyNjZiYThhNgorMCwgICAgICAzNjIyNCwgICAgICAzNjIyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDRmZjU5Mjk2CiswLCAgICAgIDM2Mzg0LCAgICAgIDM2Mzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTFkMWI5YWMKKzAsICAgICAgMzY1NDQsICAgICAgMzY1NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3NDkxOTdmNworMCwgICAgICAzNjcwNCwgICAgICAzNjcwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDgxOTJiNTE3CiswLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZGUxMjlkYmUKKzAsICAgICAgMzcwMjQsICAgICAgMzcwMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4NWU0YTA5NgorMCwgICAgICAzNzE4NCwgICAgICAzNzE4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGRlYmY5MTgyCiswLCAgICAgIDM3MzQ0LCAgICAgIDM3MzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2E0YmEwYmYKKzAsICAgICAgMzc1MDQsICAgICAgMzc1MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1NWZlOWZjZAorMCwgICAgICAzNzY2NCwgICAgICAzNzY2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGQyNDJhZGVjCiswLCAgICAgIDM3ODI0LCAgICAgIDM3ODI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWFmNWIxNTkKKzAsICAgICAgMzc5ODQsICAgICAgMzc5ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmY2IxYTU3MQorMCwgICAgICAzODE0NCwgICAgICAzODE0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDYyZmFiZGEwCiswLCAgICAgIDM4MzA0LCAgICAgIDM4MzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NDVhOWFiY2MKKzAsICAgICAgMzg0NjQsICAgICAgMzg0NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwN2FmOTc0YgorMCwgICAgICAzODYyNCwgICAgICAzODYyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGMyYTBiNGZkCiswLCAgICAgIDM4Nzg0LCAgICAgIDM4Nzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzMwYWJjY2QKKzAsICAgICAgMzg5NDQsICAgICAgMzg5NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkMzNjYTYxYworMCwgICAgICAzOTEwNCwgICAgICAzOTEwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDNjMzNkMTFhCiswLCAgICAgIDM5MjY0LCAgICAgIDM5MjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OWMyY2EwYWMKKzAsICAgICAgMzk0MjQsICAgICAgMzk0MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhNWQ2OTc3NworMCwgICAgICAzOTU4NCwgICAgICAzOTU4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGI3ZDJjNmI4CiswLCAgICAgIDM5NzQ0LCAgICAgIDM5NzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzRiYmFhYjkKKzAsICAgICAgMzk5MDQsICAgICAgMzk5MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzZTdiYWNjYgorMCwgICAgICA0MDA2NCwgICAgICA0MDA2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDkyYzZiN2U2CiswLCAgICAgIDQwMjI0LCAgICAgIDQwMjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzgxMGExOGEKKzAsICAgICAgNDAzODQsICAgICAgNDAzODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwNmEwOWY1NgorMCwgICAgICA0MDU0NCwgICAgICA0MDU0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDg4MDRhNTA0CiswLCAgICAgIDQwNzA0LCAgICAgIDQwNzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzgzYmE3ZDUKKzAsICAgICAgNDA4NjQsICAgICAgNDA4NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyNGRjYWRhNgorMCwgICAgICA0MTAyNCwgICAgICA0MTAyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDRhZjc5NmJlCiswLCAgICAgIDQxMTg0LCAgICAgIDQxMTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTQ1NGIxOWMKKzAsICAgICAgNDEzNDQsICAgICAgNDEzNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwYWQwYTU2ZQorMCwgICAgICA0MTUwNCwgICAgICA0MTUwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDg5NDRhNDRlCiswLCAgICAgIDQxNjY0LCAgICAgIDQxNjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzEwNjllYmQKKzAsICAgICAgNDE4MjQsICAgICAgNDE4MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxOWNiOTgxMgorMCwgICAgICA0MTk4NCwgICAgICA0MTk4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGFjNzVhYmUyCiswLCAgICAgIDQyMTQ0LCAgICAgIDQyMTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDE2MmEyMDAKKzAsICAgICAgNDIzMDQsICAgICAgNDIzMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhMmQ3YTRiMgorMCwgICAgICA0MjQ2NCwgICAgICA0MjQ2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDA3OGNhNjExCiswLCAgICAgIDQyNjI0LCAgICAgIDQyNjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MGVjMzliNDAKKzAsICAgICAgNDI3ODQsICAgICAgNDI3ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlOGY3OTRiMgorMCwgICAgICA0Mjk0NCwgICAgICA0Mjk0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGMyY2ZiMjU4CiswLCAgICAgIDQzMTA0LCAgICAgIDQzMTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTQ3NTkwNjEKKzAsICAgICAgNDMyNjQsICAgICAgNDMyNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiMWI2YWVhNAorMCwgICAgICA0MzQyNCwgICAgICA0MzQyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDliZmI5NmRmCiswLCAgICAgIDQzNTg0LCAgICAgIDQzNTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2M2MWI1ZDMKKzAsICAgICAgNDM3NDQsICAgICAgNDM3NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkMTRlOGRmOQorMCwgICAgICA0MzkwNCwgICAgICA0MzkwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGQ5ZDViYmY1CiswLCAgICAgIDQ0MDY0LCAgICAgIDQ0MDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGQ5ZmE5YjAKKzAsICAgICAgNDQyMjQsICAgICAgNDQyMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmNjA2YWJmYworMCwgICAgICA0NDM4NCwgICAgICA0NDM4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDcyMGJhYTE5CiswLCAgICAgIDQ0NTQ0LCAgICAgIDQ0NTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2Y3Y2FjNDkKKzAsICAgICAgNDQ3MDQsICAgICAgNDQ3MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjZWFiOWI1NAorMCwgICAgICA0NDg2NCwgICAgICA0NDg2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDY0NWZhNzBhCiswLCAgICAgIDQ1MDI0LCAgICAgIDQ1MDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTA4MWE0MGYKKzAsICAgICAgNDUxODQsICAgICAgNDUxODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyMWQ3OGY4YworMCwgICAgICA0NTM0NCwgICAgICA0NTM0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGVkZjNhYmM2CiswLCAgICAgIDQ1NTA0LCAgICAgIDQ1NTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTc2Nzk2MzcKKzAsICAgICAgNDU2NjQsICAgICAgNDU2NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxY2IxYWUwNAorMCwgICAgICA0NTgyNCwgICAgICA0NTgyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDE3Y2Q5ZjYyCiswLCAgICAgIDQ1OTg0LCAgICAgIDQ1OTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZjRiY2EzYWIKKzAsICAgICAgNDYxNDQsICAgICAgNDYxNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiM2JkOTE1MgorMCwgICAgICA0NjMwNCwgICAgICA0NjMwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDRlMWU5ODI1CiswLCAgICAgIDQ2NDY0LCAgICAgIDQ2NDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDM3ZTlhNTYKKzAsICAgICAgNDY2MjQsICAgICAgNDY2MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhkNzU4OWZjYworMCwgICAgICA0Njc4NCwgICAgICA0Njc4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDVmOTQ5ZTkwCiswLCAgICAgIDQ2OTQ0LCAgICAgIDQ2OTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTEzM2E0OTUKKzAsICAgICAgNDcxMDQsICAgICAgNDcxMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3Y2I3YTUyYworMCwgICAgICA0NzI2NCwgICAgICA0NzI2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGI4YjI5ZDk1CiswLCAgICAgIDQ3NDI0LCAgICAgIDQ3NDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDFiY2E0NzIKKzAsICAgICAgNDc1ODQsICAgICAgNDc1ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiY2M2OTg5NQorMCwgICAgICA0Nzc0NCwgICAgICA0Nzc0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGFiZmZhMGVlCiswLCAgICAgIDQ3OTA0LCAgICAgIDQ3OTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTY2MjllY2EKKzAsICAgICAgNDgwNjQsICAgICAgNDgwNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1NzJkYTdjZAorMCwgICAgICA0ODIyNCwgICAgICA0ODIyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDMwMTc5NzJkCiswLCAgICAgIDQ4Mzg0LCAgICAgIDQ4Mzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YWM0ZTljNzgKKzAsICAgICAgNDg1NDQsICAgICAgNDg1NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgxMTJmOWM0NQorMCwgICAgICA0ODcwNCwgICAgICA0ODcwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDA1ZTlhNjRkCiswLCAgICAgIDQ4ODY0LCAgICAgIDQ4ODY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGY3Mzk0ZDQKKzAsICAgICAgNDkwMjQsICAgICAgNDkwMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiYWVlYTA3ZQorMCwgICAgICA0OTE4NCwgICAgICA0OTE4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGQ3NTdjMDBlCiswLCAgICAgIDQ5MzQ0LCAgICAgIDQ5MzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGFhMDk3ODMKKzAsICAgICAgNDk1MDQsICAgICAgNDk1MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzMWQ0YWU3YQorMCwgICAgICA0OTY2NCwgICAgICA0OTY2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDIyMTQ5M2U4CiswLCAgICAgIDQ5ODI0LCAgICAgIDQ5ODI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTJmNGEzYTcKKzAsICAgICAgNDk5ODQsICAgICAgNDk5ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhiZDViYWZkOQorMCwgICAgICA1MDE0NCwgICAgICA1MDE0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDE4OTViNzYwCiswLCAgICAgIDUwMzA0LCAgICAgIDUwMzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2E0ZWFjZGQKKzAsICAgICAgNTA0NjQsICAgICAgNTA0NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjOWY3YTFjMworMCwgICAgICA1MDYyNCwgICAgICA1MDYyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGQ3NTBiZTA2CiswLCAgICAgIDUwNzg0LCAgICAgIDUwNzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjQxZDlhNmYKKzAsICAgICAgNTA5NDQsICAgICAgNTA5NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3MGQ2YjZmZgorMCwgICAgICA1MTEwNCwgICAgICA1MTEwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDFmZDNhNTQ2CiswLCAgICAgIDUxMjY0LCAgICAgIDUxMjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzJjZmFhYmUKKzAsICAgICAgNTE0MjQsICAgICAgNTE0MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyZTYxYjZjZQorMCwgICAgICA1MTU4NCwgICAgICA1MTU4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDQ4MTNhMDkxCiswLCAgICAgIDUxNzQ0LCAgICAgIDUxNzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmZlN2JjMGYKKzAsICAgICAgNTE5MDQsICAgICAgNTE5MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4Yzc1OWMxZgorMCwgICAgICA1MjA2NCwgICAgICA1MjA2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGY0YzFjOTUyCiswLCAgICAgIDUyMjI0LCAgICAgIDUyMjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDBmZGFhNzkKKzAsICAgICAgNTIzODQsICAgICAgNTIzODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyZmZkYTI1MgorMCwgICAgICA1MjU0NCwgICAgICA1MjU0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDg0MWFhNTIzCiswLCAgICAgIDUyNzA0LCAgICAgIDUyNzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGMwNzllNWUKKzAsICAgICAgNTI4NjQsICAgICAgNTI4NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5NmU5YTgzZgorMCwgICAgICA1MzAyNCwgICAgICA1MzAyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDU5MjZhNjM5CiswLCAgICAgIDUzMTg0LCAgICAgIDUzMTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDJlMWEwN2IKKzAsICAgICAgNTMzNDQsICAgICAgNTMzNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyOTcyYTk5OQorMCwgICAgICA1MzUwNCwgICAgICA1MzUwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDMwYzg5YzYyCiswLCAgICAgIDUzNjY0LCAgICAgIDUzNjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODNmNWEyNjMKKzAsICAgICAgNTM4MjQsICAgICAgNTM4MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhMzkwOTY2NworMCwgICAgICA1Mzk4NCwgICAgICA1Mzk4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGQ1MzA5ZmQ0CiswLCAgICAgIDU0MTQ0LCAgICAgIDU0MTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzE1NGE1NzEKKzAsICAgICAgNTQzMDQsICAgICAgNTQzMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1MTAzOWE1ZQorMCwgICAgICA1NDQ2NCwgICAgICA1NDQ2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGYxNjdhMzQ0CiswLCAgICAgIDU0NjI0LCAgICAgIDU0NjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGU3MDlkN2QKKzAsICAgICAgNTQ3ODQsICAgICAgNTQ3ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5MzZmYTBmZAorMCwgICAgICA1NDk0NCwgICAgICA1NDk0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDAyNGI5ZTNjCiswLCAgICAgIDU1MTA0LCAgICAgIDU1MTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MmVhMWFhNzUKKzAsICAgICAgNTUyNjQsICAgICAgNTUyNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzM2YwYTJiYgorMCwgICAgICA1NTQyNCwgICAgICA1NTQyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGJmMDc5ZDJkCiswLCAgICAgIDU1NTg0LCAgICAgIDU1NTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ODQ3YmEyYzgKKzAsICAgICAgNTU3NDQsICAgICAgNTU3NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzN2UxYTc2NworMCwgICAgICA1NTkwNCwgICAgICA1NTkwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGI2MDdhY2JiCiswLCAgICAgIDU2MDY0LCAgICAgIDU2MDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTI4OGFjNmQKKzAsICAgICAgNTYyMjQsICAgICAgNTYyMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmNjBlOThiMworMCwgICAgICA1NjM4NCwgICAgICA1NjM4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGM2YjVhYmRkCiswLCAgICAgIDU2NTQ0LCAgICAgIDU2NTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2ZlYWE3MTAKKzAsICAgICAgNTY3MDQsICAgICAgNTY3MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3NzMyOWZjZAorMCwgICAgICA1Njg2NCwgICAgICA1Njg2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDkxYTZhNzE1CiswLCAgICAgIDU3MDI0LCAgICAgIDU3MDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDBlOTlmMjQKKzAsICAgICAgNTcxODQsICAgICAgNTcxODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwNzA4OWY2MQorMCwgICAgICA1NzM0NCwgICAgICA1NzM0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDJiYmRhOTAwCiswLCAgICAgIDU3NTA0LCAgICAgIDU3NTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YWQzZGEwZDUKKzAsICAgICAgNTc2NjQsICAgICAgNTc2NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5OTdiYTZkMgorMCwgICAgICA1NzgyNCwgICAgICA1NzgyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGIxNWI5ZGNiCiswLCAgICAgIDU3OTg0LCAgICAgIDU3OTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTdjZWE4MmYKKzAsICAgICAgNTgxNDQsICAgICAgNTgxNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhYjUxYTczZQorMCwgICAgICA1ODMwNCwgICAgICA1ODMwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDc3YTFhYmQ2CiswLCAgICAgIDU4NDY0LCAgICAgIDU4NDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MGJkZGFjYWQKKzAsICAgICAgNTg2MjQsICAgICAgNTg2MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0M2IzYmRjNAorMCwgICAgICA1ODc4NCwgICAgICA1ODc4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGVmZTBhOWJhCiswLCAgICAgIDU4OTQ0LCAgICAgIDU4OTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OGViNGJjMmYKKzAsICAgICAgNTkxMDQsICAgICAgNTkxMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzOWNkYzE5MAorMCwgICAgICA1OTI2NCwgICAgICA1OTI2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDFlZjNiYWZmCiswLCAgICAgIDU5NDI0LCAgICAgIDU5NDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MWE2YWI3ZTIKKzAsICAgICAgNTk1ODQsICAgICAgNTk1ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0NDRjY2M2OQorMCwgICAgICA1OTc0NCwgICAgICA1OTc0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDA1ZWJiNTk4CiswLCAgICAgIDU5OTA0LCAgICAgIDU5OTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NGFjNWIwYWQKKzAsICAgICAgNjAwNjQsICAgICAgNjAwNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwZWU1YmE1MgorMCwgICAgICA2MDIyNCwgICAgICA2MDIyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDUwMWQ5ZmEwCiswLCAgICAgIDYwMzg0LCAgICAgIDYwMzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjAzOGE5ZjQKKzAsICAgICAgNjA1NDQsICAgICAgNjA1NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhNjFjYjhiMworMCwgICAgICA2MDcwNCwgICAgICA2MDcwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGRkMDA5Nzc3CiswLCAgICAgIDYwODY0LCAgICAgIDYwODY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MmEyZGI4NmQKKzAsICAgICAgNjEwMjQsICAgICAgNjEwMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlOWJhYjNiYworMCwgICAgICA2MTE4NCwgICAgICA2MTE4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGY3ZjhhMDU2CiswLCAgICAgIDYxMzQ0LCAgICAgIDYxMzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTE0Y2FmMTQKKzAsICAgICAgNjE1MDQsICAgICAgNjE1MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhMjIwYjE0OQorMCwgICAgICA2MTY2NCwgICAgICA2MTY2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGJmN2VhMTgzCiswLCAgICAgIDYxODI0LCAgICAgIDYxODI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MWQ4ZGM1YzYKKzAsICAgICAgNjE5ODQsICAgICAgNjE5ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5MTgyYThlYQorMCwgICAgICA2MjE0NCwgICAgICA2MjE0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDMxZWJhMDI2CiswLCAgICAgIDYyMzA0LCAgICAgIDYyMzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2ZiY2MzZGYKKzAsICAgICAgNjI0NjQsICAgICAgNjI0NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzZDhjYjdhZQorMCwgICAgICA2MjYyNCwgICAgICA2MjYyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGJlMzlhZWMwCiswLCAgICAgIDYyNzg0LCAgICAgIDYyNzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZDIzNmJmNzEKKzAsICAgICAgNjI5NDQsICAgICAgNjI5NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5Mzc3YjBiMgorMCwgICAgICA2MzEwNCwgICAgICA2MzEwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGI1ZTZiMmRmCiswLCAgICAgIDYzMjY0LCAgICAgIDYzMjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTNiOWJiY2UKKzAsICAgICAgNjM0MjQsICAgICAgNjM0MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhN2JkYTI1MQorMCwgICAgICA2MzU4NCwgICAgICA2MzU4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGJmOWFiMTYyCiswLCAgICAgIDYzNzQ0LCAgICAgIDYzNzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjkyOGI5Y2IKKzAsICAgICAgNjM5MDQsICAgICAgNjM5MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhmNWNjYTIwOQorMCwgICAgICA2NDA2NCwgICAgICA2NDA2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGZkZjRhZmFkCiswLCAgICAgIDY0MjI0LCAgICAgIDY0MjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTdlN2MyMTYKKzAsICAgICAgNjQzODQsICAgICAgNjQzODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwYzU3OTdjNgorMCwgICAgICA2NDU0NCwgICAgICA2NDU0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDY2YzFhOWNhCiswLCAgICAgIDY0NzA0LCAgICAgIDY0NzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NmI1Y2E0OGQKKzAsICAgICAgNjQ4NjQsICAgICAgNjQ4NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlYzA0OTY4YQorMCwgICAgICA2NTAyNCwgICAgICA2NTAyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGFhYWRhNjkxCiswLCAgICAgIDY1MTg0LCAgICAgIDY1MTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzdjM2E2MjQKKzAsICAgICAgNjUzNDQsICAgICAgNjUzNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhZWQ5YTVkNQorMCwgICAgICA2NTUwNCwgICAgICA2NTUwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDM2MGZhYzQxCiswLCAgICAgIDY1NjY0LCAgICAgIDY1NjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YTA1ZWE3MjcKKzAsICAgICAgNjU4MjQsICAgICAgNjU4MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5ZjdiOWY4MworMCwgICAgICA2NTk4NCwgICAgICA2NTk4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDQ3NGJjNGMyCiswLCAgICAgIDY2MTQ0LCAgICAgIDY2MTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YjYwNzhkM2IKKzAsICAgICAgNjYzMDQsICAgICAgNjYzMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg4ZTE1YThmOQorMCwgICAgICA2NjQ2NCwgICAgICA2NjQ2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDdkYzdkNGE4CiswLCAgICAgIDY2NjI0LCAgICAgIDY2NjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTVjZWFiNmIKKzAsICAgICAgNjY3ODQsICAgICAgNjY3ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5ODJjYzk0ZgorMCwgICAgICA2Njk0NCwgICAgICA2Njk0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDYxNTM5NDhmCiswLCAgICAgIDY3MTA0LCAgICAgIDY3MTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTMzOGM2MjEKKzAsICAgICAgNjcyNjQsICAgICAgNjcyNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyZTJkYjZlOAorMCwgICAgICA2NzQyNCwgICAgICA2NzQyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDI4ZTNhOWMzCiswLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzRkN2I0MzUKKzAsICAgICAgNjc3NDQsICAgICAgNjc3NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjZjE3YTEwYworMCwgICAgICA2NzkwNCwgICAgICA2NzkwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGYxZjlhYzhjCiswLCAgICAgIDY4MDY0LCAgICAgIDY4MDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzVlMGI0ODAKKzAsICAgICAgNjgyMjQsICAgICAgNjgyMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg1ZTYwYjNhNAorMCwgICAgICA2ODM4NCwgICAgICA2ODM4NCwgICAgICAxNjAsICAgICAgMzIwLCAweDIwNTc5YjI2CiswLCAgICAgIDY4NTQ0LCAgICAgIDY4NTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4M2UyN2I4OWIKKzAsICAgICAgNjg3MDQsICAgICAgNjg3MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMmU0YWY5NAorMCwgICAgICA2ODg2NCwgICAgICA2ODg2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDZkNjg5N2YxCiswLCAgICAgIDY5MDI0LCAgICAgIDY5MDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTU4MmIyNjcKKzAsICAgICAgNjkxODQsICAgICAgNjkxODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzM2JhOWViMworMCwgICAgICA2OTM0NCwgICAgICA2OTM0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGI2YWNhZDdkCiswLCAgICAgIDY5NTA0LCAgICAgIDY5NTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MTk2OWE2YzIKKzAsICAgICAgNjk2NjQsICAgICAgNjk2NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzNjNmYTM1MAorMCwgICAgICA2OTgyNCwgICAgICA2OTgyNCwgICAgICAxNjAsICAgICAgMzIwLCAweGFlNTBiZjY1CiswLCAgICAgIDY5OTg0LCAgICAgIDY5OTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDg3N2E1MGYKKzAsICAgICAgNzAxNDQsICAgICAgNzAxNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2NmUyYTQyZgorMCwgICAgICA3MDMwNCwgICAgICA3MDMwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDBiMGFiY2IzCiswLCAgICAgIDcwNDY0LCAgICAgIDcwNDY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MjNhOWFmYWEKKzAsICAgICAgNzA2MjQsICAgICAgNzA2MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjMzcyOWI0MAorMCwgICAgICA3MDc4NCwgICAgICA3MDc4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGRkM2ZjN2UyCiswLCAgICAgIDcwOTQ0LCAgICAgIDcwOTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2UwNDk0YWYKKzAsICAgICAgNzExMDQsICAgICAgNzExMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjYmQwOTZmYgorMCwgICAgICA3MTI2NCwgICAgICA3MTI2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDVkNzFiMzAzCiswLCAgICAgIDcxNDI0LCAgICAgIDcxNDI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZWVkY2EwNGEKKzAsICAgICAgNzE1ODQsICAgICAgNzE1ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyODM2YTQ3ZAorMCwgICAgICA3MTc0NCwgICAgICA3MTc0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDcyMzdjMmEwCiswLCAgICAgIDcxOTA0LCAgICAgIDcxOTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4N2MwMDliYzAKKzAsICAgICAgNzIwNjQsICAgICAgNzIwNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjOWRjYjM2NgorMCwgICAgICA3MjIyNCwgICAgICA3MjIyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDQ5OTNhYWM4CiswLCAgICAgIDcyMzg0LCAgICAgIDcyMzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MDVlYzk5NTQKKzAsICAgICAgNzI1NDQsICAgICAgNzI1NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhOTU1YmQ1YworMCwgICAgICA3MjcwNCwgICAgICA3MjcwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDkwMThhZWEzCiswLCAgICAgIDcyODY0LCAgICAgIDcyODY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzgwY2NhNTIKKzAsICAgICAgNzMwMjQsICAgICAgNzMwMjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5YjhmOTVmNgorMCwgICAgICA3MzE4NCwgICAgICA3MzE4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGNkN2JiMTc4CiswLCAgICAgIDczMzQ0LCAgICAgIDczMzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZmVjNmI0NDMKKzAsICAgICAgNzM1MDQsICAgICAgNzM1MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlMjE0YWJiNgorMCwgICAgICA3MzY2NCwgICAgICA3MzY2NCwgICAgICAxNjAsICAgICAgMzIwLCAweGRjYmViYjM4CiswLCAgICAgIDczODI0LCAgICAgIDczODI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4ZTY4M2EzMGQKKzAsICAgICAgNzM5ODQsICAgICAgNzM5ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhlNGNkYjE5NworMCwgICAgICA3NDE0NCwgICAgICA3NDE0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGE0MjZjNDMyCiswLCAgICAgIDc0MzA0LCAgICAgIDc0MzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzYxYmE2Y2MKKzAsICAgICAgNzQ0NjQsICAgICAgNzQ0NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhjYzlhYTZhYQorMCwgICAgICA3NDYyNCwgICAgICA3NDYyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDc0MmJkMDNkCiswLCAgICAgIDc0Nzg0LCAgICAgIDc0Nzg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjFkOWE1MTEKKzAsICAgICAgNzQ5NDQsICAgICAgNzQ5NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzMDIxYTRkZAorMCwgICAgICA3NTEwNCwgICAgICA3NTEwNCwgICAgICAxNjAsICAgICAgMzIwLCAweDY5NzBiYmMwCiswLCAgICAgIDc1MjY0LCAgICAgIDc1MjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NzZmNWEwMzcKKzAsICAgICAgNzU0MjQsICAgICAgNzU0MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg3NThkOTFmMgorMCwgICAgICA3NTU4NCwgICAgICA3NTU4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGU4NTRhMmYxCiswLCAgICAgIDc1NzQ0LCAgICAgIDc1NzQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4Zjk5NGE2ZjgKKzAsICAgICAgNzU5MDQsICAgICAgNzU5MDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzMWViYWY0MAorMCwgICAgICA3NjA2NCwgICAgICA3NjA2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDI0Njk5OTcwCiswLCAgICAgIDc2MjI0LCAgICAgIDc2MjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4MzdkZGE1M2UKKzAsICAgICAgNzYzODQsICAgICAgNzYzODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHhhODU3YTc1MgorMCwgICAgICA3NjU0NCwgICAgICA3NjU0NCwgICAgICAxNjAsICAgICAgMzIwLCAweGM0ODNhZDFkCiswLCAgICAgIDc2NzA0LCAgICAgIDc2NzA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NTk2NmFkZDkKKzAsICAgICAgNzY4NjQsICAgICAgNzY4NjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg0ZGJhYjg5YworMCwgICAgICA3NzAyNCwgICAgICA3NzAyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDJmMGJiMGU2CiswLCAgICAgIDc3MTg0LCAgICAgIDc3MTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OTEzYWFhODgKKzAsICAgICAgNzczNDQsICAgICAgNzczNDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgyNDVkYzFjMworMCwgICAgICA3NzUwNCwgICAgICA3NzUwNCwgICAgICAxNjAsICAgICAgMzIwLCAweGIwODVjNWFkCiswLCAgICAgIDc3NjY0LCAgICAgIDc3NjY0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4OWNmMWIwZmEKKzAsICAgICAgNzc4MjQsICAgICAgNzc4MjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg2ODg3YjU0MworMCwgICAgICA3Nzk4NCwgICAgICA3Nzk4NCwgICAgICAxNjAsICAgICAgMzIwLCAweGNhZDY5ZmViCiswLCAgICAgIDc4MTQ0LCAgICAgIDc4MTQ0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4YzEyYThkZGIKKzAsICAgICAgNzgzMDQsICAgICAgNzgzMDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMWQxYmM1YQorMCwgICAgICA3ODQ2NCwgICAgICA3ODQ2NCwgICAgICAxNjAsICAgICAgMzIwLCAweDMwMThiN2U4CiswLCAgICAgIDc4NjI0LCAgICAgIDc4NjI0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjQzMWIwZWYKKzAsICAgICAgNzg3ODQsICAgICAgNzg3ODQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzYTUzOTk4ZQorMCwgICAgICA3ODk0NCwgICAgICA3ODk0NCwgICAgICAxNjAsICAgICAgMzIwLCAweDFjODBhNmM2CiswLCAgICAgIDc5MTA0LCAgICAgIDc5MTA0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4NjYzOWFkYzUKKzAsICAgICAgNzkyNjQsICAgICAgNzkyNjQsICAgICAgMTYwLCAgICAgIDMyMCwgMHg5MjQ4OWY5YQorMCwgICAgICA3OTQyNCwgICAgICA3OTQyNCwgICAgICAxNjAsICAgICAgMzIwLCAweDhjYWZhZDAwCiswLCAgICAgIDc5NTg0LCAgICAgIDc5NTg0LCAgICAgIDE2MCwgICAgICAzMjAsIDB4Y2EwMzkyZTEKKzAsICAgICAgNzk3NDQsICAgICAgNzk3NDQsICAgICAgMTYwLCAgICAgIDMyMCwgMHgzMGE5YWU4OAorMCwgICAgICA3OTkwNCwgICAgICA3OTkwNCwgICAgICAgOTYsICAgICAgMTkyLCAweDY4Yjc2YTc1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LTMzODYgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LTMzODYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxNTgxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtMzM4NgpAQCAtMCwwICsxLDUyIEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTQ0MHgxMDgwCisjc2FyIDA6IDQvMworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAyMzMyODAwLCAweGE5ZGNiMmFjCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4OWIxN2FmMjcKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgMjMzMjgwMCwgMHgwMmRhMzE5NgorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAyMzMyODAwLCAweDljNzhlZDYyCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YTZlOTI2YTAKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgMjMzMjgwMCwgMHgzMjRlNTFkMgorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAyMzMyODAwLCAweGQ4Mjg5NjIwCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZmMzNjE5ZjkKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgMjMzMjgwMCwgMHg2YjhkMjU2MAorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAyMzMyODAwLCAweDU3MTRkY2EwCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4MjQ2ZTI4NDIKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgMjMzMjgwMCwgMHg1OWJjMGIyZQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAyMzMyODAwLCAweDI0ZmU1Y2ZhCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4Yjk2MDdjM2UKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgMjMzMjgwMCwgMHg2NjM2NjljOQorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAyMzMyODAwLCAweGQzN2ZkNjJmCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4MmQ3ZGI5MDQKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgMjMzMjgwMCwgMHg3OWE1M2ViYQorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAyMzMyODAwLCAweDNiMGM3ZTE5CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZDEyZjY0YzUKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgMjMzMjgwMCwgMHhhY2RiNDA3ZgorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAyMzMyODAwLCAweDgyOWQ3ZTYxCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4NzkzMmI4MmYKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgMjMzMjgwMCwgMHg2MWY4MTYyNworMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAyMzMyODAwLCAweGExYTJlMDAwCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4OTNhYWQ1ZTkKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgMjMzMjgwMCwgMHg5OTkzYjViNQorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAyMzMyODAwLCAweDZhYzQ4MjMyCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4NTczOGY5YzAKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4MmE1OWQwMQorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAyMzMyODAwLCAweGM0NjY0ODYyCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZjBlNjIyMmQKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgMjMzMjgwMCwgMHhkMjllNzEwMAorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAyMzMyODAwLCAweGUwOTNlZjg1CiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4MjhjNjhhNjUKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgMjMzMjgwMCwgMHg0OWE2YjIxZQorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAyMzMyODAwLCAweGZiMjhhMDk3CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YWRlMWUzMzYKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgMjMzMjgwMCwgMHhlNTExODQxMgorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAyMzMyODAwLCAweDU4NzUwMTc2CiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YWNiOTk5MzkKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4MGI5NjhkMworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAyMzMyODAwLCAweGE0NWY0ZTZmCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZTBmY2JhZGUKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgMjMzMjgwMCwgMHgxOTU2OGY0ZAorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAyMzMyODAwLCAweDMzYzUzZjU5CiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4YmRiZThmYmYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtYXR0YWNobWVudC02MzEgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWF0dGFjaG1lbnQtNjMxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYjVlYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWF0dGFjaG1lbnQtNjMxCkBAIC0wLDAgKzEsMjAgQEAKKyN0YiAwOiAxLzYwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDgvOQorMCwgICAgICAgIDU5OCwgICAgICAgIDU5OCwgICAgICAgIDEsICAgNTE4NDAwLCAweGMzYzBmMWNmCiswLCAgICAgICAgNjAzLCAgICAgICAgNjAzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MjFhNWRmODAKKzAsICAgICAgICA2MDcsICAgICAgICA2MDcsICAgICAgICAxLCAgIDUxODQwMCwgMHg1YjhlMTE1YgorMCwgICAgICAgIDYxMSwgICAgICAgIDYxMSwgICAgICAgIDEsICAgNTE4NDAwLCAweDdjZTA5MzMxCiswLCAgICAgICAgNjE1LCAgICAgICAgNjE1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MzBmZjFmMWYKKzAsICAgICAgICA2MTksICAgICAgICA2MTksICAgICAgICAxLCAgIDUxODQwMCwgMHg2NGYwOTFlZAorMCwgICAgICAgIDYyMywgICAgICAgIDYyMywgICAgICAgIDEsICAgNTE4NDAwLCAweGIzYzExN2EyCiswLCAgICAgICAgNjI3LCAgICAgICAgNjI3LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MGZiZTE0NmQKKzAsICAgICAgICA2MzEsICAgICAgICA2MzEsICAgICAgICAxLCAgIDUxODQwMCwgMHg3NTIwOTI5MworMCwgICAgICAgIDYzNSwgICAgICAgIDYzNSwgICAgICAgIDEsICAgNTE4NDAwLCAweGEzMDMwMjA4CiswLCAgICAgICAgNjM5LCAgICAgICAgNjM5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4OGNlYTY5NDEKKzAsICAgICAgICA2NDMsICAgICAgICA2NDMsICAgICAgICAxLCAgIDUxODQwMCwgMHhmNDFkMWRiZAorMCwgICAgICAgIDY0NywgICAgICAgIDY0NywgICAgICAgIDEsICAgNTE4NDAwLCAweGNjOWZlOTVlCiswLCAgICAgICAgNjUxLCAgICAgICAgNjUxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YTJhNjBkYmMKKzAsICAgICAgICA2NTUsICAgICAgICA2NTUsICAgICAgICAxLCAgIDUxODQwMCwgMHgzZjVlZWNkYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1icm9rZW5zcHMtMjU4MCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtYnJva2Vuc3BzLTI1ODAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJkYjFkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtYnJva2Vuc3BzLTI1ODAKQEAgLTAsMCArMSw4NCBAQAorI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MngxNDQKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDE0NzIsIDB4ODljNjM3MjAKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA0MTQ3MiwgMHg0NjA1YWNhOAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgIDQxNDcyLCAweGMxYzZmZGY3CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAgNDE0NzIsIDB4MDlmN2Y0YzkKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgICA0MTQ3MiwgMHg4MjNhYmRjYgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgIDQxNDcyLCAweGMzMzhiNWUzCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAgNDE0NzIsIDB4Yjk2MTU5OWIKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgICA0MTQ3MiwgMHg4NzFiNTllYQorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgIDQxNDcyLCAweDk0OWEyOTQ4CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAgNDE0NzIsIDB4MzI1NjE0MjQKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgICA0MTQ3MiwgMHg1NDkyMGFlYworMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgIDQxNDcyLCAweDE0ZDZlYzlkCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAgNDE0NzIsIDB4MmEzMGU0YmEKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgICA0MTQ3MiwgMHg4Nzc0ZGU4YgorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgIDQxNDcyLCAweGYzM2NkMjNmCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAgNDE0NzIsIDB4NDEwNTlmYzkKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgICA0MTQ3MiwgMHg2NWEzYTNiOQorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgIDQxNDcyLCAweGJmMjhhNmJjCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAgNDE0NzIsIDB4YzY5YmFiOTkKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgICA0MTQ3MiwgMHhjNWY0YWUzZgorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgIDQxNDcyLCAweDRjOThiMjhlCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAgNDE0NzIsIDB4ODFkOGFmYTUKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgICA0MTQ3MiwgMHg1MjkzYjczYworMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgIDQxNDcyLCAweDViYTJiYjI4CiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAgNDE0NzIsIDB4N2ZjZmMxNmQKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgICA0MTQ3MiwgMHg4NmE0YmQ5MworMCwgICAgICAgICA1NCwgICAgICAgICA1NCwgICAgICAgIDEsICAgIDQxNDcyLCAweDczMzdiZDlmCiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAgNDE0NzIsIDB4NmY4NGJmYTAKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgICA0MTQ3MiwgMHg0ODY4YzFmZQorMCwgICAgICAgICA2MCwgICAgICAgICA2MCwgICAgICAgIDEsICAgIDQxNDcyLCAweDM4ZDhhZGE4CiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAgNDE0NzIsIDB4NGJiOTg4YWEKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgICA0MTQ3MiwgMHgzM2E2N2RjNQorMCwgICAgICAgICA2NiwgICAgICAgICA2NiwgICAgICAgIDEsICAgIDQxNDcyLCAweGFmMTg3YmU5CiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAgNDE0NzIsIDB4ZjdkMjdjYTgKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgICA0MTQ3MiwgMHhmOTgwN2ZiMworMCwgICAgICAgICA3MiwgICAgICAgICA3MiwgICAgICAgIDEsICAgIDQxNDcyLCAweDE0NDQ3ZWUzCiswLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICAgNDE0NzIsIDB4ZjY2Mjg1ZTkKKzAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgICA0MTQ3MiwgMHgxMGIzOGZhNQorMCwgICAgICAgICA3OCwgICAgICAgICA3OCwgICAgICAgIDEsICAgIDQxNDcyLCAweDMzNWQ5MTZkCiswLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAgNDE0NzIsIDB4ZTgyZTkzYmUKKzAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgICA0MTQ3MiwgMHgyYjMzOTNkNQorMCwgICAgICAgICA4NCwgICAgICAgICA4NCwgICAgICAgIDEsICAgIDQxNDcyLCAweDk1MjM5NzcwCiswLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAgNDE0NzIsIDB4ZTM5ODk2NzYKKzAsICAgICAgICAgODgsICAgICAgICAgODgsICAgICAgICAxLCAgICA0MTQ3MiwgMHg2MjczOThmZAorMCwgICAgICAgICA5MCwgICAgICAgICA5MCwgICAgICAgIDEsICAgIDQxNDcyLCAweGQyNjM5YzMzCiswLCAgICAgICAgIDkyLCAgICAgICAgIDkyLCAgICAgICAgMSwgICAgNDE0NzIsIDB4MzYxZmE4NjEKKzAsICAgICAgICAgOTQsICAgICAgICAgOTQsICAgICAgICAxLCAgICA0MTQ3MiwgMHgwYmY2YTkzOAorMCwgICAgICAgICA5NiwgICAgICAgICA5NiwgICAgICAgIDEsICAgIDQxNDcyLCAweGYyY2FhYjgxCiswLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgICAgNDE0NzIsIDB4YWUyYWFiMWIKKzAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAxLCAgICA0MTQ3MiwgMHgxYzU0YTcwNQorMCwgICAgICAgIDEwMiwgICAgICAgIDEwMiwgICAgICAgIDEsICAgIDQxNDcyLCAweGU2ODFhOTVmCiswLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgICAgNDE0NzIsIDB4NGVlN2FiYzYKKzAsICAgICAgICAxMjUsICAgICAgICAxMjUsICAgICAgICAxLCAgICA0MTQ3MiwgMHg2OGE0NWEwNAorMCwgICAgICAgIDEzMSwgICAgICAgIDEzMSwgICAgICAgIDEsICAgIDQxNDcyLCAweGY0MWE0MDcxCiswLCAgICAgICAgMTMzLCAgICAgICAgMTMzLCAgICAgICAgMSwgICAgNDE0NzIsIDB4YTI2OWFkYWIKKzAsICAgICAgICAxMzUsICAgICAgICAxMzUsICAgICAgICAxLCAgICA0MTQ3MiwgMHhhYTFlYjIzZAorMCwgICAgICAgIDEzNywgICAgICAgIDEzNywgICAgICAgIDEsICAgIDQxNDcyLCAweGFlNjA1YmZmCiswLCAgICAgICAgMTM5LCAgICAgICAgMTM5LCAgICAgICAgMSwgICAgNDE0NzIsIDB4YWJjNzViZWIKKzAsICAgICAgICAxNDEsICAgICAgICAxNDEsICAgICAgICAxLCAgICA0MTQ3MiwgMHgzZjk4OGMwOAorMCwgICAgICAgIDE0MywgICAgICAgIDE0MywgICAgICAgIDEsICAgIDQxNDcyLCAweGMyOTY4ZWY3CiswLCAgICAgICAgMTQ1LCAgICAgICAgMTQ1LCAgICAgICAgMSwgICAgNDE0NzIsIDB4OTBkNzVjYTkKKzAsICAgICAgICAxNDcsICAgICAgICAxNDcsICAgICAgICAxLCAgICA0MTQ3MiwgMHg1NzA5NjEzNAorMCwgICAgICAgIDE0OSwgICAgICAgIDE0OSwgICAgICAgIDEsICAgIDQxNDcyLCAweDMyMzk4ZjU4CiswLCAgICAgICAgMTUxLCAgICAgICAgMTUxLCAgICAgICAgMSwgICAgNDE0NzIsIDB4ZGUwYzhiNGMKKzAsICAgICAgICAxNTMsICAgICAgICAxNTMsICAgICAgICAxLCAgICA0MTQ3MiwgMHg3YzQ4OTc5NworMCwgICAgICAgIDE1NSwgICAgICAgIDE1NSwgICAgICAgIDEsICAgIDQxNDcyLCAweGFhNGU5ZjEyCiswLCAgICAgICAgMTU3LCAgICAgICAgMTU3LCAgICAgICAgMSwgICAgNDE0NzIsIDB4OWMyOWEwMzIKKzAsICAgICAgICAxNTksICAgICAgICAxNTksICAgICAgICAxLCAgICA0MTQ3MiwgMHg3NTE1NGU5NworMCwgICAgICAgIDE2MSwgICAgICAgIDE2MSwgICAgICAgIDEsICAgIDQxNDcyLCAweDA5MGJhNDAzCiswLCAgICAgICAgMTYzLCAgICAgICAgMTYzLCAgICAgICAgMSwgICAgNDE0NzIsIDB4ZWZiZmE4YmQKKzAsICAgICAgICAxNjUsICAgICAgICAxNjUsICAgICAgICAxLCAgICA0MTQ3MiwgMHg3Y2UwMjg5YQorMCwgICAgICAgIDE2NywgICAgICAgIDE2NywgICAgICAgIDEsICAgIDQxNDcyLCAweDQ4Y2MzMThiCiswLCAgICAgICAgMTY5LCAgICAgICAgMTY5LCAgICAgICAgMSwgICAgNDE0NzIsIDB4YWY2ZmFlODcKKzAsICAgICAgICAxNzEsICAgICAgICAxNzEsICAgICAgICAxLCAgICA0MTQ3MiwgMHhmN2JhYjM2YgorMCwgICAgICAgIDE3MywgICAgICAgIDE3MywgICAgICAgIDEsICAgIDQxNDcyLCAweDRhNWIzOGNkCiswLCAgICAgICAgMTc1LCAgICAgICAgMTc1LCAgICAgICAgMSwgICAgNDE0NzIsIDB4NzNkZTNjODEKKzAsICAgICAgICAxNzcsICAgICAgICAxNzcsICAgICAgICAxLCAgICA0MTQ3MiwgMHg0NmUyYWJhMAorMCwgICAgICAgIDE3OSwgICAgICAgIDE3OSwgICAgICAgIDEsICAgIDQxNDcyLCAweGU3NWViNTAwCiswLCAgICAgICAgMTgxLCAgICAgICAgMTgxLCAgICAgICAgMSwgICAgNDE0NzIsIDB4ZmFmNDBkNTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtYnNmLW1wNHRvYW5uZXhiIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1ic2YtbXA0dG9hbm5leGIKaW5kZXggMjA0OWYzOS4uN2NkMDg2YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1ic2YtbXA0dG9hbm5leGIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1ic2YtbXA0dG9hbm5leGIKQEAgLTEgKzEgQEAKLTVmMDRjMjdjYzZlZTg2MjVmZTI0MDVmYjBmN2RhOWEzCitmMzQwZTdjYTlhNDZkNDM3YWY0ZTk2ZjZjOGRlMjIxYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1hdWRfbXdfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYXVkX213X2UKaW5kZXggODNjNmZhZS4uODkwYzdmZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1hdWRfbXdfZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWF1ZF9td19lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YTZkNjNiMmUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHgyOGJhZTEwMQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweDEzOWY5YjI5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhMV9mdF9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYTFfZnRfYwppbmRleCA5ZjZiYzIzLi4wYjhmNjZlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhMV9mdF9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmExX2Z0X2MKQEAgLTEsNCArMSw4IEBACi0jdGIgMDogMS8yNQorI3RiIDA6IDEvMTkKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YTZmOWIyYTgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5MzZhOGVkNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGE5ZjQ3NjUyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhMV9zb255X2QgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhMV9zb255X2QKaW5kZXggYjAxNDVjZC4uYzY0NDYyZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYTFfc29ueV9kCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmExX3NvbnlfZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweGIzODgzNDc4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4OTllMWZlNjAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHg2NWVhY2UyNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYTJfc29ueV9mIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYTJfc29ueV9mCmluZGV4IDEzYTY0NjIuLjg2YjJkZjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmEyX3NvbnlfZgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhMl9zb255X2YKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhiMzg4MzQ3OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDQ3YjkwZDRiCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4M2U5OWRmY2YKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmEzX3N2YV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYTNfc3ZhX2MKaW5kZXggY2I3NzVkYi4uNTJkNmJiMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYTNfc3ZhX2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYTNfc3ZhX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhiZjVmMWRmNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDhkZTYxZjM5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YWVlYzBhMTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmFfbXdfZCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmFfbXdfZAppbmRleCAxOGE2NzE3Li5lMjM3YjU4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhX213X2QKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYV9td19kCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4M2FlODM4ZWUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHg5ZWQ3ZTE0MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweDM5MzA5N2Y5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhbXExX2p2Y19jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYW1xMV9qdmNfYwppbmRleCA0YTMwNjZjLi5hNjJlZjA4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhbXExX2p2Y19jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmFtcTFfanZjX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHg2OTUxMjEzZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDgyZGRmMzlkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4M2Y4MWM2YjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmFtcTJfanZjX2MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhbXEyX2p2Y19jCmluZGV4IDMzMDhmNzcuLmVmNmQ3YmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmFtcTJfanZjX2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYW1xMl9qdmNfYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDY5NTEyMTNmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZDFiYmY4MzAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHg3OWRjYzhjYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYW5tX213X2QgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhbm1fbXdfZAppbmRleCA2MTA4Y2EzLi4wMGIyN2JiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhbm1fbXdfZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhbm1fbXdfZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDNhZTgzOGVlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4OWVkN2UxNDEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHhhZjlkOTc1MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYXNxcDFfc29ueV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1iYXNxcDFfc29ueV9jCmluZGV4IGE1MDM4ZTQuLjI0MDc0MzEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtYmFzcXAxX3NvbnlfYworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWJhc3FwMV9zb255X2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhlMmQ3MzIzMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweGRhNGRmYzhlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4NzMzNGNiOTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTFfc29ueV9kIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhMV9zb255X2QKaW5kZXggMzU3OTgyMC4uZGNkNTk3NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhMV9zb255X2QKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhMV9zb255X2QKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhiMzg4MzQ3OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDk5ZTFmZTYwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4NjVlYWNlMjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTFfc3ZhX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmExX3N2YV9iCmluZGV4IDhiMjU1YmMuLjE5ZGFmNDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTFfc3ZhX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhMV9zdmFfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweGVlODMxZmU0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MTA5OGZmMjMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHg4ZmMzZTA3OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhMl9zb255X2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmEyX3NvbnlfZQppbmRleCBjMzAwODNjLi5hY2ZjODQyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmEyX3NvbnlfZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmEyX3NvbnlfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweGIzODgzNDc4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MjNhMzBlNDcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHhhMGI3ZGYwZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhMl9zdmFfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTJfc3ZhX2IKaW5kZXggY2E4OTIyNi4uOGM3N2FkZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhMl9zdmFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmEyX3N2YV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZWU4MzFmZTQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHhkOTEzMGUxOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweDhhZDcwY2FlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmEzX3NvbnlfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTNfc29ueV9jCmluZGV4IGM3YWVlMzcuLjRlMzU5MzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTNfc29ueV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTNfc29ueV9jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YjM4ODM0NzgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHhiNjI2MWNkZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweDQyZWNlZGU5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmEzX3N2YV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhM19zdmFfYgppbmRleCA3YmRiM2Y4Li5jZmEzYzE2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmEzX3N2YV9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTNfc3ZhX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHgwZTA5MTE3NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweGU4ZjgxNTA2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZjcwNmY1Y2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYTNfdG9zaGliYV9lIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhM190b3NoaWJhX2UKaW5kZXggYjMxZWZlMS4uN2M2YzRjMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhM190b3NoaWJhX2UKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhM190b3NoaWJhX2UKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHg3MjcyM2NlNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDM0NzIxOWQ3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ODEzZmYxODIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYWNfbW90X2ZsZDBfZnVsbCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYWNfbW90X2ZsZDBfZnVsbAppbmRleCBiMTMxY2RhLi44Nzc4ZmVmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFjX21vdF9mbGQwX2Z1bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhY19tb3RfZmxkMF9mdWxsCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmYxNjhmNGUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHhlZGE1ZTU0ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGVmNDk2ZDQzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFjX21vdF9mcm0wX2Z1bGwgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFjX21vdF9mcm0wX2Z1bGwKaW5kZXggNTg5NDllMi4uMzc3NGNmZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhY19tb3RfZnJtMF9mdWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYWNfbW90X2ZybTBfZnVsbApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDQwYzdlMmQ5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YjE2NzAxYTUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHgxMmMyZjViMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhY19tb3RfbWJhZmYwX2Z1bGwgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFjX21vdF9tYmFmZjBfZnVsbAppbmRleCAxZTkzMTNlLi4xMjA4NzFmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFjX21vdF9tYmFmZjBfZnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFjX21vdF9tYmFmZjBfZnVsbApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDgzMzZiN2RiCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4OTgxOGMzMDkKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg1NDE3YjZmOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhY19tb3RfcGljYWZmMF9mdWxsIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhY19tb3RfcGljYWZmMF9mdWxsCmluZGV4IDQ4NDAyNWUuLjU2NTFlNGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYWNfbW90X3BpY2FmZjBfZnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFjX21vdF9waWNhZmYwX2Z1bGwKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHhkOGI1OGEyMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTE4NDAwLCAweGU1M2I0YWJhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NmNiY2E0N2EKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYWNpM19zb255X2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFjaTNfc29ueV9iCmluZGV4IDlkYzQ4ODQuLmJjZmNlMDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYWNpM19zb255X2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhY2kzX3NvbnlfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDcwNWYyZjQxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YTc2ZDE3NjYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHhmMzY3ZTZmNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhc3QzX3NvbnlfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYXN0M19zb255X2UKaW5kZXggMDA1MTllZi4uMzhkYTQ2NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhc3QzX3NvbnlfZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFzdDNfc29ueV9lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTZlYmIzYTIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1MTg0ZDkxMgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGZhMGM5YWJlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFzdGJyM19zb255X2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYmFzdGJyM19zb255X2IKaW5kZXggNzY1ZjUzZi4uMGEzNTI1MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJhc3RicjNfc29ueV9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FiYXN0YnIzX3NvbnlfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDk2ZWJiM2EyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTE4NGQ5MTIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiN2I1YmE2OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJyZWYzX3NhbmRfZCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FicmVmM19zYW5kX2QKaW5kZXggOWU1NTVmNi4uZDVjZDQ0NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWJyZWYzX3NhbmRfZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhYnJlZjNfc2FuZF9kCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MjA2MWJiZDAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0MWFkYjc1MAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDZlODg5ZTkwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhY3FwM19zb255X2QgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhY3FwM19zb255X2QKaW5kZXggYzM2ODUyOS4uNzg4YTBhNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWNxcDNfc29ueV9kCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FjcXAzX3NvbnlfZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDI5NWEzNzVjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZDBkYTFmMzcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgwZTVlZDUxNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWZpMV9zdmFfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FmaTFfc3ZhX2MKaW5kZXggMTgwYWRmMS4uMTFkOTU4ZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYWZpMV9zdmFfYworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhZmkxX3N2YV9jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NDdiZDczZmEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHhmZTNlYTdjYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweDliYzU0OWFlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWExX3NvbnlfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTFfc29ueV9jCmluZGV4IDY2ODUyMTYuLjlhMjllMzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTFfc29ueV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTFfc29ueV9jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NzU3MDE1MTEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHhhN2VlYWExNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGUwZjMyZTM1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWExX3Rvc2hpYmFfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTFfdG9zaGliYV9iCmluZGV4IGFiMmRhNGEuLjZlODU0ZjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTFfdG9zaGliYV9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTFfdG9zaGliYV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OWE5Y2UzNjYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmNDYzOTgyOAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDYyNTAyNGEzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWExX3Z0Y19jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hMV92dGNfYwppbmRleCBlZWI2NmIwLi5iYjg2MzA0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWExX3Z0Y19jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTFfdnRjX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHg0MWMyY2UxNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTE4NDAwLCAweDM5ZjIxN2RhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NWExMDhkYjkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTJfdnRjX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWEyX3Z0Y19iCmluZGV4IDBkZmU2YTkuLmM1YzU4YTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTJfdnRjX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hMl92dGNfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NTc2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDAwNGJiOTNmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZTcwZTE5M2MKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDYyMjA4MCwgMHhkMzk0Y2YxNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hM19zYW5kX2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWEzX3NhbmRfZQppbmRleCBmODliYzQwLi5lMWU5Nzg0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWEzX3NhbmRfZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWEzX3NhbmRfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGY3NzJmMTUyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4N2M1MDE3NzIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5OGVkMGEwNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hM192dGNfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYTNfdnRjX2IKaW5kZXggNDY4MjFjMS4uMjg4ZGRkMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hM192dGNfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWEzX3Z0Y19iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZjNmMGJmODYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg2YWFmM2Q0MgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNjIyMDgwLCAweGU1M2JjZDVkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWFjaTNfc29ueV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hY2kzX3NvbnlfYwppbmRleCA1ODk2NDYwLi45ZDc1ZDAwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWFjaTNfc29ueV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYWNpM19zb255X2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyeDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzNjg2NCwgMHg5YjVkY2YyOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM2ODY0LCAweGIxM2Q0ZmVlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzY4NjQsIDB4MTFjNTEyYWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYW5sMV90b3NoaWJhX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWFubDFfdG9zaGliYV9iCmluZGV4IDJjM2M1NTcuLmE2MmY5MTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYW5sMV90b3NoaWJhX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hbmwxX3Rvc2hpYmFfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGIxZWRkODQyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTUxZjhmNDUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiNDkzMWNiMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hbmwyX3Rvc2hpYmFfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYW5sMl90b3NoaWJhX2IKaW5kZXggMDY2YzU3Zi4uNmEyZjMyMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hbmwyX3Rvc2hpYmFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWFubDJfdG9zaGliYV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjFlZGQ4NDIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1NTFmOGY0NQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGI0OTMxY2IyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWFubDNfc2FuZF9lIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hbmwzX3NhbmRfZQppbmRleCBhNzYxNzBjLi45MDFlNGQwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWFubDNfc2FuZF9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYW5sM19zYW5kX2UKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2YzFmZjZhNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDE3ZjFmZjNhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjdkZGNkYTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYXNsM19zb255X2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbWFzbDNfc29ueV9iCmluZGV4IDBjYjQxZTEuLjViYjM4YWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FtYXNsM19zb255X2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1hc2wzX3NvbnlfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTJ4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM2ODY0LCAweGZlMmFkODQ5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzY4NjQsIDB4Mzc5NTRiYTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzNjg2NCwgMHhhZjBlMDg3NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1wX21vdF9tYmFmZl9sMzAgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbXBfbW90X21iYWZmX2wzMAppbmRleCBjNGYyNzgyLi5hYjAyYzJiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbXBfbW90X21iYWZmX2wzMAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbXBfbW90X21iYWZmX2wzMApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDY3MjI3OWRmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YjI0OGE3NjIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg0Mzk5ZGU4OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW1wX21vdF9tYmFmZl9sMzEgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbXBfbW90X21iYWZmX2wzMQppbmRleCAxYmVlMDM3Li5kYzgyMjUwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbXBfbW90X21iYWZmX2wzMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbXBfbW90X21iYWZmX2wzMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDA3NzYzN2JmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmQwOTZkNTUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg1OGI1ODgyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sMV9zb255X2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwxX3NvbnlfZQppbmRleCBkOTBlOTU3Li44NDljY2VmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwxX3NvbnlfZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwxX3NvbnlfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweGM4MDUzNTFkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MzgwOWZlYzMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHhmNjk4Y2UzYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sMV9zdmFfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDFfc3ZhX2IKaW5kZXggMDQzNmY0My4uNDJlZDhkNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sMV9zdmFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwxX3N2YV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MGJkMjI0MjQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHg0ZWI2MDFmMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweGUxNmRlNDU5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwxX3Rvc2hpYmFfZyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDFfdG9zaGliYV9nCmluZGV4IGNlZDRjOTIuLjczZTZiN2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDFfdG9zaGliYV9nCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDFfdG9zaGliYV9nCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4NTg4OTIxNDkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHhkYTJkZWQ3NAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweDI2NjFjZGIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwyX3NvbnlfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDJfc29ueV9lCmluZGV4IDlhM2I0OGYuLjU2N2UzNWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDJfc29ueV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDJfc29ueV9lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YzgwNTM1MWQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHgzMDE3MTA3ZQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweGUxNzJlMmQyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwyX3N2YV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sMl9zdmFfYgppbmRleCAwNDM2ZjQzLi40MmVkOGQ3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwyX3N2YV9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDJfc3ZhX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHgwYmQyMjQyNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDRlYjYwMWYwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZTE2ZGU0NTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDNfc29ueV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sM19zb255X2MKaW5kZXggMmU3MjZjZi4uODBkODAyOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sM19zb255X2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sM19zb255X2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhjODA1MzUxZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweGEwYjQxZmVmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4OTY1Y2YwNzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDNfc3ZhX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmwzX3N2YV9iCmluZGV4IGRkNTZhNDMuLjc3NTU1MGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDNfc3ZhX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sM19zdmFfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDBiZDIyNDI0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YzQ1ZDE5NDcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHg5ZDNkMTIxOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sNF9zdmFfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubDRfc3ZhX2IKaW5kZXggYTlhMmRkMy4uOTk0NWIwYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sNF9zdmFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmw0X3N2YV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4NWQ5NTE0ZTMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHhmNWU4MTU1YwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweGMwYTVmODhiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmxtYTJfc29ueV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sbWEyX3NvbnlfYwppbmRleCBiNmE3NTlhLi5iYTNlNmJkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmxtYTJfc29ueV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubG1hMl9zb255X2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHhmYmNhMDBjNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTE4NDAwLCAweDgyYjgwYWRmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODdlY2RmNGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubG1hM19zb255X2MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhbmxtYTNfc29ueV9jCmluZGV4IDg3Y2U3ODYuLjU3ZGRhNTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FubG1hM19zb255X2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYW5sbWEzX3NvbnlfYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweGZiY2EwMGM2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODJiODBhZGYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg0ODc0YzI0YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXBhMV90b3NoaWJhX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGExX3Rvc2hpYmFfYgppbmRleCBhMDMzNmY4Li5jODhkYzU0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGExX3Rvc2hpYmFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGExX3Rvc2hpYmFfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDQwNDBkMmZjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MGQ4Zjk4OTcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjMjMzMjFjZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXBhbWEzX3NhbmRfZiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FwYW1hM19zYW5kX2YKaW5kZXggYjYyMWI4MS4uYjg0N2I5YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXBhbWEzX3NhbmRfZgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGFtYTNfc2FuZF9mCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4Zjc3MmYxNTIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjNDE2ZDMwMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGMyMjc1Yzk0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGNtMV9zYW5kX2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGNtMV9zYW5kX2UKaW5kZXggMzkyZThiNC4uMjk4N2M3NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXBjbTFfc2FuZF9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2FwY20xX3NhbmRfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDk5ODliNTg4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4N2NiZjg1ZDQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3MjYxNWNmMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXBjbW5sMV9zYW5kX2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGNtbmwxX3NhbmRfZQppbmRleCBiYWVlMGFlLi5kNzM4MTU4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGNtbmwxX3NhbmRfZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcGNtbmwxX3NhbmRfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGY5NzNiMzg0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ODQ0MTg1MzIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2MzE2NWJjMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXBtM19zb255X2QgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcG0zX3NvbnlfZAppbmRleCBhYjJiMjgwLi43MmYxZTM1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcG0zX3NvbnlfZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcG0zX3NvbnlfZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweGEzYjcyZDJmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4NzdkOTE4YWUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgxODFhZDY4NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXFwMV9zb255X2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcXAxX3NvbnlfYgppbmRleCBiZWNhMWM1Li44NzRkNmViIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcXAxX3NvbnlfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhcXAxX3NvbnlfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDI1ZjkyYjBlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MmVjYmU3NTIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgzNDMyZTc0NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXZsY19tb3RfZmxkMF9mdWxsX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhdmxjX21vdF9mbGQwX2Z1bGxfYgppbmRleCBmODBjM2JlLi4wZWU5YTM5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhdmxjX21vdF9mbGQwX2Z1bGxfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhdmxjX21vdF9mbGQwX2Z1bGxfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDk5ZDBkZjM2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YTg2MDFjMWEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg0YTE3ZDIzNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXZsY19tb3RfZnJtMF9mdWxsX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhdmxjX21vdF9mcm0wX2Z1bGxfYgppbmRleCBlZGVlNGJmLi42MTFmZmNkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhdmxjX21vdF9mcm0wX2Z1bGxfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhdmxjX21vdF9mcm0wX2Z1bGxfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDIxYmFlZGJmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NjAwMzI3M2MKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg5MzVkNDVkNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXZsY19tb3RfbWJhZmYwX2Z1bGxfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F2bGNfbW90X21iYWZmMF9mdWxsX2IKaW5kZXggN2QzYWUzZS4uNTkxNWY5OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jYXZsY19tb3RfbWJhZmYwX2Z1bGxfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhdmxjX21vdF9tYmFmZjBfZnVsbF9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NGNlY2M4MjEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHhlZTQ5ZWE4MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweDc4YjBkNjVmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhdmxjX21vdF9waWNhZmYwX2Z1bGxfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F2bGNfbW90X3BpY2FmZjBfZnVsbF9iCmluZGV4IGVkNWUwMmUuLmMwZjZhNWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F2bGNfbW90X3BpY2FmZjBfZnVsbF9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F2bGNfbW90X3BpY2FmZjBfZnVsbF9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZjZiODNhMGUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHhjNWU4YjhlZQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGIzYmM2ZTQzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhd3AxX3Rvc2hpYmFfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F3cDFfdG9zaGliYV9lCmluZGV4IGU1YTY5NDQuLjExMWIyMjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F3cDFfdG9zaGliYV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F3cDFfdG9zaGliYV9lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWJmOWFlMDUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyMDQxOGIxNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGMyNjc2MGFlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNhd3A1X3Rvc2hpYmFfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F3cDVfdG9zaGliYV9lCmluZGV4IDViNDhmOGYuLjJiMDU1YzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F3cDVfdG9zaGliYV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2F3cDVfdG9zaGliYV9lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWJmOWFlMDUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyMDQxOGIxNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDIwZjcyNzc1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNpMV9mdF9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jaTFfZnRfYgppbmRleCAwOGU0MGY0Li42NTBkNWI1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNpMV9mdF9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2kxX2Z0X2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiMjkxYTY3OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDkxM2M1YTVkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTU1OGEzNzIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2lfbXdfZCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY2lfbXdfZAppbmRleCA3YjVhN2RjLi4yNzVhZmZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWNpX213X2QKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jaV9td19kCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4M2FlODM4ZWUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHg4NTIzZTEzNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweGNmZmM5OWRkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2YnMzX3NvbnlfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZiczNfc29ueV9jCmluZGV4IGFkNzQ4NWEuLjdjM2VjMjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZiczNfc29ueV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZiczNfc29ueV9jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YjM4ODM0NzgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHhkZGYwMWQ5ZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweGIxNzdlY2UyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2Y2FubG1hMl9zb255X2MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2Y2FubG1hMl9zb255X2MKaW5kZXggYjZhNzU5YS4uYmEzZTZiZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdmNhbmxtYTJfc29ueV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZjYW5sbWEyX3NvbnlfYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweGZiY2EwMGM2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODJiODBhZGYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg4N2VjZGY0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdmZjMV9zb255X2MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmMxX3NvbnlfYwppbmRleCAxYWJlNjdmLi41NDE0MzJkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmMxX3NvbnlfYworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmMxX3NvbnlfYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMDB4MTY4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc1NjAwLCAweDZmNmE4YzQ4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNzU2MDAsIDB4NGI3YWM1NTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA3NTYwMCwgMHg5MDdmZWRhMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdmZpMV9zb255X2QgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmkxX3NvbnlfZAppbmRleCAxOTVjN2Q2Li5iZjk5OGJjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmkxX3NvbnlfZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmkxX3NvbnlfZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweGQ5NDQ0ZDcxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NWQ4OTI4Y2QKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHhlYTViYzA4YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdmZpMV9zdmFfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZmaTFfc3ZhX2MKaW5kZXggYzE5YmMwZC4uNTU2Mjg4NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdmZpMV9zdmFfYworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmkxX3N2YV9jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4OGYwMjIyNjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHgwMjY5MjY1NAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweDU1ZWZmNTc5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmkyX3NvbnlfaCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZmaTJfc29ueV9oCmluZGV4IDA5MTRlMjIuLmRlYjliMzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZmaTJfc29ueV9oCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZmaTJfc29ueV9oCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZDk0NDRkNzEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHg0OTFmYWY3NQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGY4YjRkMTVjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmkyX3N2YV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdmZpMl9zdmFfYwppbmRleCA3YzMxNjJhLi5lMmEwYjZkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2ZmkyX3N2YV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZmaTJfc3ZhX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHg0MDczY2MwYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTE4NDAwLCAweDVmNTk5YTQ4CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YzZmZTU1NWEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtYTFfc29ueV9kIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hMV9zb255X2QKaW5kZXggNjY4NTIxNi4uOWEyOWUzMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hMV9zb255X2QKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hMV9zb255X2QKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHg3NTcwMTUxMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTE4NDAwLCAweGE3ZWVhYTE2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZTBmMzJlMzUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtYTFfdG9zaGliYV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hMV90b3NoaWJhX2IKaW5kZXggYWIyZGE0YS4uNmU4NTRmMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hMV90b3NoaWJhX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hMV90b3NoaWJhX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5YTljZTM2NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGY0NjM5ODI4CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjI1MDI0YTMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtYW5sMV90b3NoaWJhX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bWFubDFfdG9zaGliYV9iCmluZGV4IDJjM2M1NTcuLmE2MmY5MTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtYW5sMV90b3NoaWJhX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hbmwxX3Rvc2hpYmFfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGIxZWRkODQyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTUxZjhmNDUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiNDkzMWNiMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hbmwyX3Rvc2hpYmFfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtYW5sMl90b3NoaWJhX2IKaW5kZXggMDY2YzU3Zi4uNmEyZjMyMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hbmwyX3Rvc2hpYmFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bWFubDJfdG9zaGliYV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjFlZGQ4NDIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1NTFmOGY0NQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGI0OTMxY2IyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bWFwYXFwM19zb255X2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bWFwYXFwM19zb255X2UKaW5kZXggMDk0ZmM5OC4uOGNjODFlNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hcGFxcDNfc29ueV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtYXBhcXAzX3NvbnlfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDgwZGZmZGEyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4OTQ1MDE4M2IKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHg4NWQ0MjlhNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hcXAyX3NvbnlfZyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtYXFwMl9zb255X2cKaW5kZXggODg2ZWE0Yy4uYTdmM2UyOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hcXAyX3NvbnlfZworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bWFxcDJfc29ueV9nCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MngxMjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzY4NjQsIDB4ZGVlM2Q0ZTMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzNjg2NCwgMHhhYTFhNjdjYQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM2ODY0LCAweGUwMGUwZGVjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bWFxcDNfc29ueV9kIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1hcXAzX3NvbnlfZAppbmRleCA3YzNkOTZkLi4wNzM0MjJjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bWFxcDNfc29ueV9kCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtYXFwM19zb255X2QKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyeDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzNjg2NCwgMHhkZWUzZDRlMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM2ODY0LCAweGFiZWM4ZDQ0CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzY4NjQsIDB4OTVkMDI5ZmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtcF9tb3RfZmxkX2wzMF9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1wX21vdF9mbGRfbDMwX2IKaW5kZXggNTdmYTJmNy4uOTRkNGRmZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1wX21vdF9mbGRfbDMwX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1wX21vdF9mbGRfbDMwX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHhlOWM3NjQzZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhNzQ1NmVjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZGViOTY3NDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZtcF9tb3RfZnJtX2wzMV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1wX21vdF9mcm1fbDMxX2IKaW5kZXggYmM3ZTgxZS4uZmM2YjFiNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1wX21vdF9mcm1fbDMxX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm1wX21vdF9mcm1fbDMxX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHg3YjI0NzVlMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTE4NDAwLCAweGRhNzg2YTg3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YjFkZDgxMDgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZubGZpMV9zb255X2MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bmxmaTFfc29ueV9jCmluZGV4IGFhM2MyMjAuLjAyYTZiNTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZubGZpMV9zb255X2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm5sZmkxX3NvbnlfYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweDBmYmI0ZTcxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NGI4MTY3MzQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHgwYzM1MGYxOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm5sZmkyX3NvbnlfaCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZubGZpMl9zb255X2gKaW5kZXggZmUyZTRkMS4uYzcxMjhiYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdm5sZmkyX3NvbnlfaAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2bmxmaTJfc29ueV9oCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MGZiYjRlNzEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHhjNDZiZWMwNAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGM1MGZmYzFkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2cGExX3Rvc2hpYmFfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZwYTFfdG9zaGliYV9iCmluZGV4IGZkMDkxMWIuLjZiZjllZTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZwYTFfdG9zaGliYV9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZwYTFfdG9zaGliYV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTI4Y2Q3N2EKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1NjViOWZjMQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGJlMzIyNjc5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2cGNtbmwxX3N2YV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdnBjbW5sMV9zdmFfYwppbmRleCA5NWM5OTAzLi41MjhkMmE1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2cGNtbmwxX3N2YV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZwY21ubDFfc3ZhX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxOWI4NDA3ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGFiOGJlZGU2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjU5YWNkMDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZwY21ubDJfc3ZhX2MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2cGNtbmwyX3N2YV9jCmluZGV4IDRmOTJlYWIuLjAzMDNiYzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3ZwY21ubDJfc3ZhX2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1jdnBjbW5sMl9zdmFfYwpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjgweDcyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTM4MjQwMCwgMHhjY2JlNmJmOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxMzgyNDAwLCAweDQ5YzBjZmQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2d3AxX3Rvc2hpYmFfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDFfdG9zaGliYV9lCmluZGV4IGIxODRjODQuLmU3ZTZlYzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDFfdG9zaGliYV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDFfdG9zaGliYV9lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWJmOWFlMDUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyMDQxOGIxNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGU5NDE1NzJmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2d3AyX3Rvc2hpYmFfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDJfdG9zaGliYV9lCmluZGV4IDYyN2Y0YjguLmNkOTNmYmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDJfdG9zaGliYV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDJfdG9zaGliYV9lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjUwM2ZiNzkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlYWE0YmE1ZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDUwODY1YTMzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2d3AzX3Rvc2hpYmFfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDNfdG9zaGliYV9lCmluZGV4IGNhM2I3YjguLjI4NTg5MmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDNfdG9zaGliYV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDNfdG9zaGliYV9lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4M2IzZmZkMzEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxNGUwYjg5OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDUwODY1YTMzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWN2d3A1X3Rvc2hpYmFfZSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDVfdG9zaGliYV9lCmluZGV4IDViNDhmOGYuLjJiMDU1YzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDVfdG9zaGliYV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtY3Z3cDVfdG9zaGliYV9lCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWJmOWFlMDUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyMDQxOGIxNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDIwZjcyNzc1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZpMV9zb255X2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZpMV9zb255X2UKaW5kZXggNmI1ZTBkYi4uYzQ4MzA2NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1maTFfc29ueV9lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZmkxX3NvbnlfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTJ4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM2ODY0LCAweDNkNTRkM2UzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzY4NjQsIDB4YTk1NzNlZjAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzNjg2NCwgMHgwZWE1ZjI2MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1hbHBoYWNvbmZvcm1hbmNlZyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYWxwaGFjb25mb3JtYW5jZWcKaW5kZXggZGVlMWM0Mi4uMWU4OTRjZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1hbHBoYWNvbmZvcm1hbmNlZworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWFscGhhY29uZm9ybWFuY2VnCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDk2MHg1NDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA3ODMzNjAsIDB4YmM0NThhOWEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDc4MzM2MCwgMHhjMmI0YTc2NQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNzgzMzYwLCAweDQwYThjYTg3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJjcm1fZnJlaDEwIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1iY3JtX2ZyZWgxMAppbmRleCAyNzJhNGFhLi43NTkyZjZjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJjcm1fZnJlaDEwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYmNybV9mcmVoMTAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiZGMyYjg4MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDRlYmY5M2ZlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTMwZDY4NzEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoMTEgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJyY21fZnJlaDExCmluZGV4IDMxODNjNGQuLjViYjlhYTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoMTEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1icmNtX2ZyZWgxMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDk3NDRhYzU5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4M2ViYTg4YmYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkNDEwNWM1YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1icmNtX2ZyZWgzIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1icmNtX2ZyZWgzCmluZGV4IDlhNDAxNDguLjkzMjM1NGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJyY21fZnJlaDMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5ZjljYWYzYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDRlOGU5ZGM0CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4N2VhYjYyYmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoNCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoNAppbmRleCBhZDNhM2VjLi45ODk4ZGVmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJyY21fZnJlaDQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1icmNtX2ZyZWg0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTc0NGFjNTkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlMWM2OWQ5NwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDlhZTg1ZjkzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJyY21fZnJlaDUgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJyY21fZnJlaDUKaW5kZXggOTA1N2M4Mi4uMTBmZjhkMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1icmNtX2ZyZWg1CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoNQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGQ4MTZhZTlhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTcwZTljMzMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiZGQxNDYzNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1icmNtX2ZyZWg4IGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1icmNtX2ZyZWg4CmluZGV4IDRjYzdmMGUuLjU1MmQ1ZTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoOAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJyY21fZnJlaDgKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkY2M0YWM3NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGZkZTY4NzFhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZThhMzUxYjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoOSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtYnJjbV9mcmVoOQppbmRleCA0NGQ1ZDFhLi43NzczNzEwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWJyY21fZnJlaDkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1icmNtX2ZyZWg5CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OWY5Y2FmM2MKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2OGYyODViMQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDI4YmQ0OTg3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZWgxMl9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmVoMTJfYgppbmRleCA5NDU1Y2MyLi5lMzI4MzlmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZWgxMl9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJlaDEyX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5ZjljYWYzYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDBmZjY4OGE2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MjQ3ZDQyMTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJlaDFfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJlaDFfYgppbmRleCBjNWMwYjI1Li44YmY0YjU4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZWgxX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmVoMV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NDJhM2Q5Y2UKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhOTVjYzJlZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGM0OGY4ZmRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZWgyX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZWgyX2IKaW5kZXggZmYxMjAyNS4uOWJhMTI4ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmVoMl9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJlaDJfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDE2NjhiNDFhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTUzY2E3ZmIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzZTM4YmM2ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmVoNiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJlaDYKaW5kZXggYzc2OTAzOC4uNTdhYzI2MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmVoNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZWg2CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4M2IyMWQ2Y2QKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjMzIwODhjNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDY1YTY0Y2VlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZWg3X2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZWg3X2IKaW5kZXggNTE5YzM0Ni4uYjA3OGNmMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmVoN19iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJlaDdfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDg5ZjJlOGQ1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzViOTkzOTcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2ZWY0Njc0NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmV4dDAxX2p2Y19kIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmV4dDAxX2p2Y19kCmluZGV4IGI4MjE1MWUuLmFjOTkyYTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQwMV9qdmNfZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZXh0MDFfanZjX2QKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzMWJjOTM1ZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDUwMWVhOTJhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OGIyZjZlYWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQwMl9qdmNfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQwMl9qdmNfYwppbmRleCBiODIxNTFlLi5hYzk5MmE4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZXh0MDJfanZjX2MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1mcmV4dDAyX2p2Y19jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzFiYzkzNWUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1MDFlYTkyYQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDhiMmY2ZWFkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZXh0MV9wYW5hc29uaWNfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQxX3BhbmFzb25pY19jCmluZGV4IDgxNzQ4ZjcuLjdmMzk5MmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQxX3BhbmFzb25pY19jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQxX3BhbmFzb25pY19jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjljMzA1MTgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1MDlkZDE4ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDdmNWM4ZjA3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZXh0Ml9wYW5hc29uaWNfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQyX3BhbmFzb25pY19iCmluZGV4IDdjNTNiNWMuLjc2ZTRkMjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQyX3BhbmFzb25pY19iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQyX3BhbmFzb25pY19iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDE0N2EyYTkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlMjM2NTM1MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGI1ZjlkYWVlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZXh0M19wYW5hc29uaWNfZCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQzX3BhbmFzb25pY19kCmluZGV4IDcxYjc0M2UuLjgwZWUxOWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQzX3BhbmFzb25pY19kCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQzX3BhbmFzb25pY19kCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZGQzNDYyOTIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiMDdlNmVmZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDgxYjRkNTQwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZXh0NF9wYW5hc29uaWNfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQ0X3BhbmFzb25pY19hCmluZGV4IGMwODg2ZTQuLjU2NDAyMjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQ0X3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHQ0X3BhbmFzb25pY19hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDYwNGQ0NDAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwOGVmMjYyYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDk5MmZjYThlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWZyZXh0X21tY280X3NvbnlfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHRfbW1jbzRfc29ueV9iCmluZGV4IGE5NjRhMzguLmRjNzgzNzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHRfbW1jbzRfc29ueV9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtZnJleHRfbW1jbzRfc29ueV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MjQ4NDY2NTQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkMzM5NDViZQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDk2MWNiYmZiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhjYWZmMV9oaGlfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZmYxX2hoaV9iCmluZGV4IGViNDFkNDYuLjY3YmFkYjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZmYxX2hoaV9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZmYxX2hoaV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjA1NWE5YmQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5ZTFlYWRiNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ4ZjExN2QyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhjYWZyMV9oaGlfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIxX2hoaV9jCmluZGV4IDI4NWYwNTcuLjcwMzU5ODMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIxX2hoaV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIxX2hoaV9jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDQ4Yzg3YjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiN2E2N2Y4ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDNjM2YzYzExCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhjYWZyMl9oaGlfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIyX2hoaV9hCmluZGV4IDcxNDk4NTAuLjRiYzk1ZDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIyX2hoaV9hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIyX2hoaV9hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDU0NDhmMGUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5M2QwMjJiYQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDFlYWVkNzZlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhjYWZyM19oaGlfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIzX2hoaV9hCmluZGV4IDJlYzlkY2UuLjRmYzJkOTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIzX2hoaV9hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnIzX2hoaV9hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDU0NDhmMGUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2NjVlMzNiNQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDY2NDhlOTlkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhjYWZyNF9oaGlfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnI0X2hoaV9hCmluZGV4IDAwYWY4ZmYuLjA4MTQ2NTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnI0X2hoaV9hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhZnI0X2hoaV9hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YzdkODgzMmQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4ZDlmZmM1OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGFmM2VhMGQxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhjYW1mZjFfaGhpX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhjYW1mZjFfaGhpX2IKaW5kZXggZGY4NTIxMi4uYTU2ZDdlMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1oY2FtZmYxX2hoaV9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGNhbWZmMV9oaGlfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDE4ZjQ5NGVjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NzUxNWU2ZDcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhYThlZTY2NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1oaTQyMmZyMTBfc29ueV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1oaTQyMmZyMTBfc29ueV9iCmluZGV4IDI0NGU1NDYuLjE1ZGZjNGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjEwX3NvbnlfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhpNDIyZnIxMF9zb255X2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIwMjc1MiwgMHhmZmExYzUwMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjAyNzUyLCAweDUxNzUyZjNjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMDI3NTIsIDB4ZTY4Mzk5MWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjEzX3NvbnlfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjEzX3NvbnlfYgppbmRleCAwMTZhYmJjLi44NzU4YmY1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhpNDIyZnIxM19zb255X2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1oaTQyMmZyMTNfc29ueV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0MDU1MDQsIDB4ZTBmNDBlNzEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQwNTUwNCwgMHg5YmRiNTkwMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDA1NTA0LCAweDUyNzAwM2NhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhpNDIyZnIxX3NvbnlfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjFfc29ueV9hCmluZGV4IDkzYTNhYTQuLjdkYjg2NzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjFfc29ueV9hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjFfc29ueV9hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMDI3NTIsIDB4ZDVhMWU0OWYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIwMjc1MiwgMHgwODM1MmQ2MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjAyNzUyLCAweDQzZjc4ZjQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhpNDIyZnI2X3NvbnlfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjZfc29ueV9hCmluZGV4IDQxNDFlZWUuLjZkMjZlZTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjZfc29ueV9hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaGk0MjJmcjZfc29ueV9hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0MDU1MDQsIDB4MDQ5YWI1OGUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQwNTUwNCwgMHg0ZjYyMjZjYgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDA1NTA0LCAweGFhNWZjYjQ0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FfYnJjbV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhX2JyY21fYwppbmRleCBkNjA4ZDg5Li4yZDBjZDVmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FfYnJjbV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYV9icmNtX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5OTViYjRiZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGFkMjg3MzU3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzhmYTQ2NjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYWRxX2JyY21fYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYWRxX2JyY21fYgppbmRleCA0OTI0OWIzLi4wZDU3OTRhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FkcV9icmNtX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhZHFfYnJjbV9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjNjNjhkZWEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmNTJkNDgzZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDYxMmYxNzkyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FmbF9iY3JtX2MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FmbF9iY3JtX2MKaW5kZXggZGJmZWM0My4uMGZlYmVkNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhZmxfYmNybV9jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYWZsX2Jjcm1fYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDUwMmVjMDc3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ODQ4MDcyNDMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkNzQ3NGE2ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhZmxubF9iY3JtX2MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FmbG5sX2Jjcm1fYwppbmRleCA2NWEzNjZlLi45OTU4ZjE2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FmbG5sX2Jjcm1fYworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FmbG5sX2Jjcm1fYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDNlMzljMDhiCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWJjNjc5OTAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxOTYxNGU3NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhbHFfYnJjbV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhbHFfYnJjbV9iCmluZGV4IDQ5MjQ5YjMuLjBkNTc5NGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYWxxX2JyY21fYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FscV9icmNtX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmM2M2OGRlYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGY1MmQ0ODNmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjEyZjE3OTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYW1hcGFscV9iY3JtX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FtYXBhbHFfYmNybV9iCmluZGV4IGE4MWU5MWYuLjFiMDNlODggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYW1hcGFscV9iY3JtX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhbWFwYWxxX2Jjcm1fYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGY4MjQ4Y2ViCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjYyMDRjODEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyMmZiMTczNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhbW9scV9icmNtX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2Ftb2xxX2JyY21fYgppbmRleCAwMGYwNGZkLi4zM2UwNjg4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2Ftb2xxX2JyY21fYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2Ftb2xxX2JyY21fYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGFjODNmNTRmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGQ2NzNiNDMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5MDUwNzMxZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhbmxfYnJjbV9jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhbmxfYnJjbV9jCmluZGV4IDIzYWQyNjcuLmYzZWRiYTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYW5sX2JyY21fYworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY2FubF9icmNtX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyNzQ0YWZhMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDE3MjQ2NTgzCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTAxODM2ZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjYXEybHFfYnJjbV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhcTJscV9icmNtX2IKaW5kZXggNDYwZjg2Yy4uYjA0MTJkYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhcTJscV9icmNtX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGNhcTJscV9icmNtX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3MTJhMmFkMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDgzNDIwYzlkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjNkNzdmNDYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjdl9icmNtX2EgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY3ZfYnJjbV9hCmluZGV4IGQ2MDhkODkuLjJkMGNkNWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjdl9icmNtX2EKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2X2JyY21fYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDk5NWJiNGJkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWQyODczNTcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzOGZhNDY2MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2ZmxfYmNybV9hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2ZmxfYmNybV9hCmluZGV4IGRiZmVjNDMuLjBmZWJlZDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjdmZsX2Jjcm1fYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY3ZmbF9iY3JtX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1MDJlYzA3NwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDg0ODA3MjQzCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDc0NzRhNmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjdmZsbmxfYmNybV9hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2ZmxubF9iY3JtX2EKaW5kZXggNjVhMzY2ZS4uOTk1OGYxNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2ZmxubF9iY3JtX2EKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2ZmxubF9iY3JtX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzZTM5YzA4YgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGFiYzY3OTkwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTk2MTRlNzQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjdm1vbHFfYnJjbV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2bW9scV9icmNtX2IKaW5kZXggNDE3OWFjZS4uZjcyMjM4OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2bW9scV9icmNtX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2bW9scV9icmNtX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhMThjZmI5NwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDUwOWI1NGQyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MWJhMGZiOGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjdm5sX2JyY21fYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtaHBjdm5sX2JyY21fYQppbmRleCAyM2FkMjY3Li5mM2VkYmExIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LWhwY3ZubF9icmNtX2EKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1ocGN2bmxfYnJjbV9hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4Mjc0NGFmYTEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxNzI0NjU4MwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDUwMTgzNmVkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTFfcGFuYXNvbmljX2EgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTFfcGFuYXNvbmljX2EKaW5kZXggOTFlMzQzNi4uY2NkOTMyOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGgxMGkxX3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoMTBpMV9wYW5hc29uaWNfYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjgweDcyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMjc2NDgwMCwgMHhjYzRkZjA3ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAyNzY0ODAwLCAweDg1ZjllNmQ0CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDI3NjQ4MDAsIDB4MjNmZmU5MGQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoMTBpMl9wYW5hc29uaWNfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoMTBpMl9wYW5hc29uaWNfYQppbmRleCAxZDZkNGI1Li44MzVjNDk1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTJfcGFuYXNvbmljX2EKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGgxMGkyX3BhbmFzb25pY19hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyODB4NzIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAyNzY0ODAwLCAweDRmNzEwMTMyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDI3NjQ4MDAsIDB4NTdlNWI3MTMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMjc2NDgwMCwgMHhjY2EwMTQ3NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGgxMGkzX3BhbmFzb25pY19hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGgxMGkzX3BhbmFzb25pY19hCmluZGV4IGEwOWUzOTcuLmY0NmRmYWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoMTBpM19wYW5hc29uaWNfYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTNfcGFuYXNvbmljX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDI3NjQ4MDAsIDB4ZGE2OWY2OWUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMjc2NDgwMCwgMHgyOWVkODMyZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAyNzY0ODAwLCAweGIzMjQ0Y2M0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTRfcGFuYXNvbmljX2EgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTRfcGFuYXNvbmljX2EKaW5kZXggYWRlYzY2NC4uYzdkZmE4ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGgxMGk0X3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoMTBpNF9wYW5hc29uaWNfYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDYyMjA4MDAsIDB4Y2EyYTJhNWUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgNjIyMDgwMCwgMHg4MDA5YTY1ZQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA2MjIwODAwLCAweDYzZTcyYjNiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTVfcGFuYXNvbmljX2EgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTVfcGFuYXNvbmljX2EKaW5kZXggYTQ3NTE5Ny4uNTJiM2QyNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGgxMGk1X3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoMTBpNV9wYW5hc29uaWNfYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDYyMjA4MDAsIDB4MWRmNThjZTkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgNjIyMDgwMCwgMHg4ZjI4NTljZQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA2MjIwODAwLCAweDIyOWNjN2ZmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTZfcGFuYXNvbmljX2EgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTZfcGFuYXNvbmljX2EKaW5kZXggMjVkMGVlYy4uZDFlYWY2NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGgxMGk2X3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoMTBpNl9wYW5hc29uaWNfYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDYyMjA4MDAsIDB4NDA4ZGFmNzAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgNjIyMDgwMCwgMHg1OWIyNTRhMwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA2MjIwODAwLCAweDRjZjQyNzljCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTdfcGFuYXNvbmljX2EgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDEwaTdfcGFuYXNvbmljX2EKaW5kZXggMTA5MGI0OS4uN2Q1NTcxOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGgxMGk3X3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoMTBpN19wYW5hc29uaWNfYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDYyMjA4MDAsIDB4ZjgxODczZmUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgNjIyMDgwMCwgMHg3Yjk2ZmJkYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA2MjIwODAwLCAweDc1ZGJhZmM0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmkxX3BhbmFzb25pY19hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGg0MjJpMV9wYW5hc29uaWNfYQppbmRleCAwOTU3NjU0Li4zMTYzMDg5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmkxX3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoNDIyaTFfcGFuYXNvbmljX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDM2ODY0MDAsIDB4MWY5YjViZWUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMzY4NjQwMCwgMHg2NTdjMzYwOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAzNjg2NDAwLCAweDc1NzUzOTM0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmkyX3BhbmFzb25pY19hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGg0MjJpMl9wYW5hc29uaWNfYQppbmRleCA3OWU2OWViLi5mYWE3NWNhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmkyX3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoNDIyaTJfcGFuYXNvbmljX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDM2ODY0MDAsIDB4OGIzZmYzNjAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMzY4NjQwMCwgMHg0MjJkZWFkMQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAzNjg2NDAwLCAweGJkZDBlNDMxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmkzX3BhbmFzb25pY19hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGg0MjJpM19wYW5hc29uaWNfYQppbmRleCBmYzRjYzUwLi5hOWJlZmJkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmkzX3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoNDIyaTNfcGFuYXNvbmljX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDM2ODY0MDAsIDB4OTdjMzZhZTMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMzY4NjQwMCwgMHg2YTBhYTYyOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAzNjg2NDAwLCAweGM2NThkNzIyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmk0X3BhbmFzb25pY19hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGg0MjJpNF9wYW5hc29uaWNfYQppbmRleCAwYWFlOWZlLi42Mjg5Y2FhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmk0X3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoNDIyaTRfcGFuYXNvbmljX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA4Mjk0NDAwLCAweGY1MDk5MmYzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4ZDM0Y2RmOTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgODI5NDQwMCwgMHg3NmJjZWQwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGg0MjJpNV9wYW5hc29uaWNfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoNDIyaTVfcGFuYXNvbmljX2EKaW5kZXggYzc0NDgzYy4uYjE4NzUzMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGg0MjJpNV9wYW5hc29uaWNfYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmk1X3BhbmFzb25pY19hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgODI5NDQwMCwgMHg5NmQwNTFhMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICA4Mjk0NDAwLCAweGYzYzI5NzRlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4YjE4ZjNlZDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoNDIyaTZfcGFuYXNvbmljX2EgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmk2X3BhbmFzb25pY19hCmluZGV4IDI2ZDQxZDQuLjgxN2JjOWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoNDIyaTZfcGFuYXNvbmljX2EKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGg0MjJpNl9wYW5hc29uaWNfYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4MWIyZjEwNzkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgODI5NDQwMCwgMHg2NjQ2ZjkxYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA4Mjk0NDAwLCAweDE3ZGM5ZjUxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmk3X3BhbmFzb25pY19hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1mcmV4dC1wcGg0MjJpN19wYW5hc29uaWNfYQppbmRleCAzZjliZmVkLi4zMjE5ZGEwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWZyZXh0LXBwaDQyMmk3X3BhbmFzb25pY19hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtZnJleHQtcHBoNDIyaTdfcGFuYXNvbmljX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA4Mjk0NDAwLCAweGFhMzdjZWVhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4YTc1NDZkNWMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgODI5NDQwMCwgMHhmMmFiYWFjZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1oY2JwMl9oaGlfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtaGNicDJfaGhpX2EKaW5kZXggOTc3MTA3ZS4uMzZkMzljOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1oY2JwMl9oaGlfYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWhjYnAyX2hoaV9hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjlkZWI5NWEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkY2U5YzU0MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGM0NWE4YTc3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWhjbXAxX2hoaV9hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1oY21wMV9oaGlfYQppbmRleCBiZTYxOWRhLi41NzhmOThkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWhjbXAxX2hoaV9hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtaGNtcDFfaGhpX2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkYTI0NGYzZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDM1YTFjYjAyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YTcyOWQ5Y2EKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbHNfc3ZhX2QgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLWxzX3N2YV9kCmluZGV4IDlkMWQyMTkuLmQzODI2YWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbHNfc3ZhX2QKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1sc19zdmFfZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDg1ZDIwZmM2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YzA0MzJjMjEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgxNDUwMTY4ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1taWRyX213X2QgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1pZHJfbXdfZAppbmRleCA1MWI3YzBlLi4zYWZhNjVmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1pZHJfbXdfZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1pZHJfbXdfZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDNhZTgzOGVlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4OWVkN2UxNDEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgzOTMwOTdmOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcHNfbXdfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXBzX213X2EKaW5kZXggOTU5YTBhZS4uYWUzOGNmYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcHNfbXdfYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1wc19td19hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MDYxNTBlODgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHgzMmQ5MDEwMwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweDViNWYyZmFlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yMV9idF9hIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjFfYnRfYQppbmRleCAxMWViNTkwLi4yNzNlZTA4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yMV9idF9hCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXIxX2J0X2EKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhjNjY1ODcxOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDhhN2M3NDIzCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4OTdlOTliNjYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXIxX213X2EgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yMV9td19hCmluZGV4IGRhNzYzMWQuLjdiMTU0YmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXIxX213X2EKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjFfbXdfYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweGM4OTgxNzgwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZjA4OWQ4ODAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHg1ZWVlMDczMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjJfbXdfYSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXIyX213X2EKaW5kZXggZmQ0YjVkOS4uODMzY2VhOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjJfbXdfYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yMl9td19hCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MDYxNTBlODgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHgzMmQ5MDEwMwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweGIzMmQzMzhmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yMl90YW5kYmVyZ19lIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjJfdGFuZGJlcmdfZQppbmRleCA4ZmJhYzlmLi5jMGUxZDgzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yMl90YW5kYmVyZ19lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXIyX3RhbmRiZXJnX2UKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhiOTZmMWZlYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweGNhNDYxYWJkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4NTc4YTBjODcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXIzX3RhbmRiZXJnX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yM190YW5kYmVyZ19iCmluZGV4IGVlODAxNGUuLmIwOTQ4NDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXIzX3RhbmRiZXJnX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjNfdGFuZGJlcmdfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweGI5NmYxZmViCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4Y2E0NjFhYmQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHg1NzhhMGM4NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjRfdGFuZGJlcmdfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXI0X3RhbmRiZXJnX2MKaW5kZXggMGQ1ZjY0Ni4uODdiY2FhNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjRfdGFuZGJlcmdfYworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yNF90YW5kYmVyZ19jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4Yjk2ZjFmZWIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHgwZmYxMTFmMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweGJhYzcwMjcxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yNV90YW5kYmVyZ19jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjVfdGFuZGJlcmdfYwppbmRleCAwZDVmNjQ2Li44N2JjYWE0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yNV90YW5kYmVyZ19jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXI1X3RhbmRiZXJnX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhiOTZmMWZlYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDBmZjExMWYwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YmFjNzAyNzEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXI2X2J0X2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yNl9idF9iCmluZGV4IDNiMDI1MDYuLjM0YWE4YmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXI2X2J0X2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjZfYnRfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTJ4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM2ODY0LCAweDk1NDQ2NGJlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzY4NjQsIDB4YWNlMWQ5MGIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzNjg2NCwgMHg4ZjE0OWYwMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjdfYnRfYiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXI3X2J0X2IKaW5kZXggMjViNzA1NC4uNTUxNzY3YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjdfYnRfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yN19idF9iCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MngxMjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzY4NjQsIDB4NTc5ZTYyNzQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzNjg2NCwgMHg4NjUwYzYxYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM2ODY0LCAweGJjMzU5NjQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yOF9idF9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjhfYnRfYgppbmRleCAyMjBhY2YxLi43OTgxYzQyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yOF9idF9iCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXI4X2J0X2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyeDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzNjg2NCwgMHgzNmRmNjhmNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM2ODY0LCAweDUyZDRjNmQ5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzY4NjQsIDB4YWQxNmIwYmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXI5X2J0X2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW1yOV9idF9iCmluZGV4IDM3NDQ4MDIuLmJiZDkwZTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXI5X2J0X2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tcjlfYnRfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTJ4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM2ODY0LCAweGI0YzU2NDJlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzY4NjQsIDB4OTI5ZmQwNWYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzNjg2NCwgMHg0NDdjOWI2OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tdjFfYnJjbV9kIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1tdjFfYnJjbV9kCmluZGV4IDQ3NTE3ZWUuLmEzYWIyN2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbXYxX2JyY21fZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW12MV9icmNtX2QKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHgyMzBkN2FhNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTE4NDAwLCAweDlmYzk3NmUwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NTEwNTJkYjkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbmwxX3NvbnlfZCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbmwxX3NvbnlfZAppbmRleCA5OGE1NjczLi5kNmUwZGY5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sMV9zb255X2QKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1ubDFfc29ueV9kCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YzgwNTM1MWQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHgzODA5ZmVjMwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweGY2OThjZTNjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sMl9zb255X2ggYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sMl9zb255X2gKaW5kZXggNzNlYjg1OC4uMWU3YmZiMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1ubDJfc29ueV9oCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbmwyX3NvbnlfaApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweGM4MDUzNTFkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MzIwNTEwYTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgzZWY2ZTRjNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1ubDNfc3ZhX2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sM19zdmFfZQppbmRleCBhNGQ2ZGI2Li5hMDllMDgzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sM19zdmFfZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sM19zdmFfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDJmYWQxNWUyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4N2UzOTE1NjYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHg5NTQwMDFkNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1ubG1xMV9qdmNfYyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbmxtcTFfanZjX2MKaW5kZXggMzAzMDEyNS4uZGJjZGNkZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1ubG1xMV9qdmNfYworKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sbXExX2p2Y19jCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZGUxYTIxOTQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHgyOTU3ZjNlNQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweDlkZjRjNmNmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sbXEyX2p2Y19jIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1ubG1xMl9qdmNfYwppbmRleCA1MjU4ZWIyLi44ZGM2Mjg1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5sbXEyX2p2Y19jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbmxtcTJfanZjX2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhkZTFhMjE5NAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDhiNmNmODQyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4NmRjN2M4OGIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbnJmX213X2UgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLW5yZl9td19lCmluZGV4IGVlNWY3MTkuLmI2OGE2YTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2UtbnJmX213X2UKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1ucmZfbXdfZQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDNhZTgzOGVlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4OWVkN2UxNDEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgzNTRlODNlZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zaGFycF9tcF9maWVsZF8xX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzFfYgppbmRleCA4NTEyMTAyLi5jZGFiY2NlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzFfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweGM5M2M3YzQ3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YTNmMmU1MDIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHhiOTg5MjBhNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zaGFycF9tcF9maWVsZF8yX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzJfYgppbmRleCA1ODA4MTQxLi4wNTc0ZjhmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzJfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzJfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweGM5M2M3YzQ3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZjBjNGI0NGEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHgzZjVkYzkxYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zaGFycF9tcF9maWVsZF8zX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzNfYgppbmRleCBhNTcyMDMwLi42YTkyMjQ1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzNfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX2ZpZWxkXzNfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweGM5M2M3YzQ3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NzExMmFjMjUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHgyOGJjMjhkMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zaGFycF9tcF9wYWZmXzFyMiBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2Utc2hhcnBfbXBfcGFmZl8xcjIKaW5kZXggZDFhMzQ3Zi4uOGE3YWEyNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zaGFycF9tcF9wYWZmXzFyMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX3BhZmZfMXIyCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YzkzYzdjNDcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHhmYjQ1MmE5YwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweDJmN2EzNWJkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX3BhZmZfMnIgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNoYXJwX21wX3BhZmZfMnIKaW5kZXggZjJiZjA2Zi4uZGVkOTFhOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zaGFycF9tcF9wYWZmXzJyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2Utc2hhcnBfbXBfcGFmZl8ycgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTE4NDAwLCAweGM5M2M3YzQ3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZmI0NTJhOWMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDUxODQwMCwgMHgyZjdhMzViZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zbDFfc3ZhX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNsMV9zdmFfYgppbmRleCBhMmYxNmI0Li41NzJkNWEwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNsMV9zdmFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXNsMV9zdmFfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDY2NmMxMTBjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4Yzg3NDIxZjYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgxYjc0MDMzZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfYmExX2IgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXN2YV9iYTFfYgppbmRleCBjYzU1YWM5Li42YjM4MzQ4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXN2YV9iYTFfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXN2YV9iYTFfYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDM1OTMxNmExCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZDVmYWZhNTQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHhlYTk5ZTliZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfYmEyX2QgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXN2YV9iYTJfZAppbmRleCBiOTQwODZmLi43YzVlYzk4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXN2YV9iYTJfZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXN2YV9iYTJfZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCAweDM1OTMxNmExCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZDdiYjEyODUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODAxNiwgMHgzYzM2MDU5ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfYmFzZV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfYmFzZV9iCmluZGV4IDMwNjYzZmYuLjNlZDUxZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2Utc3ZhX2Jhc2VfYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNvbmZvcm1hbmNlLXN2YV9iYXNlX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHgxYzEzMTMwMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweGJiY2EwYzRmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ODFmNWZkN2IKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2Utc3ZhX2NsMV9lIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfY2wxX2UKaW5kZXggMjdjYmE2ZC4uMmYzMjExNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfY2wxX2UKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfY2wxX2UKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHg2ODExMTYxZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDI0M2EwZDRlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4MGJjNzAwZGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2Utc3ZhX2ZtMV9lIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfZm0xX2UKaW5kZXggMGU1ZjNlMC4uNTJlZDQ5YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfZm0xX2UKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfZm0xX2UKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHgxYzEzMTMwMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDg5ZGQwYzE1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YWY3NzAwYmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2Utc3ZhX25sMV9iIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfbmwxX2IKaW5kZXggZjIwMzNkOC4uYzU5YWEyYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfbmwxX2IKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfbmwxX2IKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhiOWFjMTliZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDM4OThmYzM1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4ZjZmNGVkMTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY29uZm9ybWFuY2Utc3ZhX25sMl9lIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfbmwyX2UKaW5kZXggMTc3MGVmZi4uNWY4MDA2YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfbmwyX2UKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jb25mb3JtYW5jZS1zdmFfbmwyX2UKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhiOWFjMTliZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweDUzYzkxNTY2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YjViZDA4OWYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY3JvcC10by1jb250YWluZXIgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWNyb3AtdG8tY29udGFpbmVyCmluZGV4IDQ5MzJiZGQuLjg1NWM5M2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtY3JvcC10by1jb250YWluZXIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1jcm9wLXRvLWNvbnRhaW5lcgpAQCAtMSw2ICsxLDEwIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTEwNDAwLCA0M2EzMTJlMWVlYmM3ZGNhMWJkMjM0NTYzMDJhNDRlMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1kaXJlY3QtYmZmIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1kaXJlY3QtYmZmCmluZGV4IDRkMjMzYjUuLjgwMjczM2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtZGlyZWN0LWJmZgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWRpcmVjdC1iZmYKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4NAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUyMjcyMCwgMHgxY2NhZDUwMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTIyNzIwLCAweGQyNjZkNmU4CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1MjI3MjAsIDB4NTM1NDczYjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtZHRzXzVmcmFtZXMgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWR0c181ZnJhbWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNDliOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWR0c181ZnJhbWVzCkBAIC0wLDAgKzEsMTUwIEBACitbRlJBTUVdCittZWRpYV90eXBlPXZpZGVvCitzdHJlYW1faW5kZXg9MAora2V5X2ZyYW1lPTEKK3BrdF9wdHM9MAorcGt0X3B0c190aW1lPTAuMDAwMDAwCitwa3RfZHRzPTAKK3BrdF9kdHNfdGltZT0wLjAwMDAwMAorYmVzdF9lZmZvcnRfdGltZXN0YW1wPTAKK2Jlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDAwMDAwCitwa3RfZHVyYXRpb249MTY2Citwa3RfZHVyYXRpb25fdGltZT0wLjE2NjAwMAorcGt0X3Bvcz02NTEKK3BrdF9zaXplPTE0NDI4Cit3aWR0aD01MTIKK2hlaWdodD0yNTYKK3BpeF9mbXQ9eXV2NDIwcAorc2FtcGxlX2FzcGVjdF9yYXRpbz0xOjEKK3BpY3RfdHlwZT1JCitjb2RlZF9waWN0dXJlX251bWJlcj0wCitkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTAKK2ludGVybGFjZWRfZnJhbWU9MAordG9wX2ZpZWxkX2ZpcnN0PTAKK3JlcGVhdF9waWN0PTAKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjb2xvcl90cmFuc2Zlcj11bmtub3duCitjaHJvbWFfbG9jYXRpb249bGVmdAorWy9GUkFNRV0KK1tGUkFNRV0KK21lZGlhX3R5cGU9dmlkZW8KK3N0cmVhbV9pbmRleD0wCitrZXlfZnJhbWU9MAorcGt0X3B0cz0xNjcKK3BrdF9wdHNfdGltZT0wLjE2NzAwMAorcGt0X2R0cz0xNjcKK3BrdF9kdHNfdGltZT0wLjE2NzAwMAorYmVzdF9lZmZvcnRfdGltZXN0YW1wPTE2NworYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4xNjcwMDAKK3BrdF9kdXJhdGlvbj0xNjYKK3BrdF9kdXJhdGlvbl90aW1lPTAuMTY2MDAwCitwa3RfcG9zPTE1MDg1Citwa3Rfc2l6ZT0xMQord2lkdGg9NTEyCitoZWlnaHQ9MjU2CitwaXhfZm10PXl1djQyMHAKK3NhbXBsZV9hc3BlY3RfcmF0aW89MToxCitwaWN0X3R5cGU9UAorY29kZWRfcGljdHVyZV9udW1iZXI9MQorZGlzcGxheV9waWN0dXJlX251bWJlcj0wCitpbnRlcmxhY2VkX2ZyYW1lPTAKK3RvcF9maWVsZF9maXJzdD0wCityZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT11bmtub3duCitjb2xvcl9zcGFjZT11bmtub3duCitjb2xvcl9wcmltYXJpZXM9dW5rbm93bgorY29sb3JfdHJhbnNmZXI9dW5rbm93bgorY2hyb21hX2xvY2F0aW9uPWxlZnQKK1svRlJBTUVdCitbRlJBTUVdCittZWRpYV90eXBlPXZpZGVvCitzdHJlYW1faW5kZXg9MAora2V5X2ZyYW1lPTAKK3BrdF9wdHM9MzMzCitwa3RfcHRzX3RpbWU9MC4zMzMwMDAKK3BrdF9kdHM9MzMzCitwa3RfZHRzX3RpbWU9MC4zMzMwMDAKK2Jlc3RfZWZmb3J0X3RpbWVzdGFtcD0zMzMKK2Jlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMzMzMDAwCitwa3RfZHVyYXRpb249MTY2Citwa3RfZHVyYXRpb25fdGltZT0wLjE2NjAwMAorcGt0X3Bvcz0xNTEwMgorcGt0X3NpemU9MTEKK3dpZHRoPTUxMgoraGVpZ2h0PTI1NgorcGl4X2ZtdD15dXY0MjBwCitzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MQorcGljdF90eXBlPVAKK2NvZGVkX3BpY3R1cmVfbnVtYmVyPTIKK2Rpc3BsYXlfcGljdHVyZV9udW1iZXI9MAoraW50ZXJsYWNlZF9mcmFtZT0wCit0b3BfZmllbGRfZmlyc3Q9MAorcmVwZWF0X3BpY3Q9MAorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj1sZWZ0CitbL0ZSQU1FXQorW0ZSQU1FXQorbWVkaWFfdHlwZT12aWRlbworc3RyZWFtX2luZGV4PTAKK2tleV9mcmFtZT0wCitwa3RfcHRzPTUwMAorcGt0X3B0c190aW1lPTAuNTAwMDAwCitwa3RfZHRzPTUwMAorcGt0X2R0c190aW1lPTAuNTAwMDAwCitiZXN0X2VmZm9ydF90aW1lc3RhbXA9NTAwCitiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjUwMDAwMAorcGt0X2R1cmF0aW9uPTE2NgorcGt0X2R1cmF0aW9uX3RpbWU9MC4xNjYwMDAKK3BrdF9wb3M9MTUxMTkKK3BrdF9zaXplPTExCit3aWR0aD01MTIKK2hlaWdodD0yNTYKK3BpeF9mbXQ9eXV2NDIwcAorc2FtcGxlX2FzcGVjdF9yYXRpbz0xOjEKK3BpY3RfdHlwZT1QCitjb2RlZF9waWN0dXJlX251bWJlcj0zCitkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTAKK2ludGVybGFjZWRfZnJhbWU9MAordG9wX2ZpZWxkX2ZpcnN0PTAKK3JlcGVhdF9waWN0PTAKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjb2xvcl90cmFuc2Zlcj11bmtub3duCitjaHJvbWFfbG9jYXRpb249bGVmdAorWy9GUkFNRV0KK1tGUkFNRV0KK21lZGlhX3R5cGU9dmlkZW8KK3N0cmVhbV9pbmRleD0wCitrZXlfZnJhbWU9MAorcGt0X3B0cz02NjcKK3BrdF9wdHNfdGltZT0wLjY2NzAwMAorcGt0X2R0cz02NjcKK3BrdF9kdHNfdGltZT0wLjY2NzAwMAorYmVzdF9lZmZvcnRfdGltZXN0YW1wPTY2NworYmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC42NjcwMDAKK3BrdF9kdXJhdGlvbj0xNjYKK3BrdF9kdXJhdGlvbl90aW1lPTAuMTY2MDAwCitwa3RfcG9zPTE1MTM2Citwa3Rfc2l6ZT0xMQord2lkdGg9NTEyCitoZWlnaHQ9MjU2CitwaXhfZm10PXl1djQyMHAKK3NhbXBsZV9hc3BlY3RfcmF0aW89MToxCitwaWN0X3R5cGU9UAorY29kZWRfcGljdHVyZV9udW1iZXI9NAorZGlzcGxheV9waWN0dXJlX251bWJlcj0wCitpbnRlcmxhY2VkX2ZyYW1lPTAKK3RvcF9maWVsZF9maXJzdD0wCityZXBlYXRfcGljdD0wCitjb2xvcl9yYW5nZT11bmtub3duCitjb2xvcl9zcGFjZT11bmtub3duCitjb2xvcl9wcmltYXJpZXM9dW5rbm93bgorY29sb3JfdHJhbnNmZXI9dW5rbm93bgorY2hyb21hX2xvY2F0aW9uPWxlZnQKK1svRlJBTUVdCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWV4dHJhZGF0YS1yZWxvYWQgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWV4dHJhZGF0YS1yZWxvYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwZjgwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtZXh0cmFkYXRhLXJlbG9hZApAQCAtMCwwICsxLDEzIEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2eDEyOAorI3NhciAwOiAxLzEKKyNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ5MTUyLCBhZTA5Yzg4ZTg3ZTNlYTBhYThhZDI2N2VlOTEyMjJlNQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDQ5MTUyLCA3Y2NkODMyMWE2ZTIzYWUxZjgyYmQzMjNjODM3NjUyNAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDQ5MTUyLCA4ZWQ5M2FiNTg1ZmY5ODQ4ODAxY2MyOGI3NWI1ZTEyZAorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgIDQ5MTUyLCAwMDQ5OTEzODcwZGRiNjJmZmM1MzUyODIwMTg3NjZmNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1leHRyZW1lLXBsYW5lLXByZWQgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWV4dHJlbWUtcGxhbmUtcHJlZAppbmRleCA5NmMyYmY0Li4yOTQwZWMwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LWV4dHJlbWUtcGxhbmUtcHJlZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWV4dHJlbWUtcGxhbmUtcHJlZApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMWU4NTdkMmRmZWVhNzUyOTdlMDkwZmZlOWUzN2EyNDkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMjlkODMzNmI0ZTliNzcyOTgwMjUwNzRkYmFkNjQxZDEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtaW50ZXJsYWNlLWNyb3AgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWludGVybGFjZS1jcm9wCmluZGV4IDgxYjk3OWMuLjhkYzczMDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtaW50ZXJsYWNlLWNyb3AKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1pbnRlcmxhY2UtY3JvcApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4MzYwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzQ1NjAwLCAweGE5Y2I3ZTVhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzNDU2MDAsIDB4NzNlNDc1NTUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDM0NTYwMCwgMHg4N2FhYzU5MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1pbnRyYS1yZWZyZXNoLXJlY292ZXJ5IGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1pbnRyYS1yZWZyZXNoLXJlY292ZXJ5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWZlN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWludHJhLXJlZnJlc2gtcmVjb3ZlcnkKQEAgLTAsMCArMSwxNSBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGExN2Q1MGIKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgIDExNTIwMCwgMHgxMjgzZDA1YgorMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDI3NDdjNjUwCiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmEyM2M5MzMKKzAsICAgICAgICAgNjEsICAgICAgICAgNjEsICAgICAgICAxLCAgIDExNTIwMCwgMHg4YTk2YzU0YgorMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDc0OGFjNmQzCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzE5Y2E0OTEKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZDI1OWQ0ZAorMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGUzNTk5YWE4CiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NmZkNGFmZmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtaW52YWxpZC1yZWYtbW9kIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1pbnZhbGlkLXJlZi1tb2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwY2IxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtaW52YWxpZC1yZWYtbW9kCkBAIC0wLDAgKzEsMTUgQEAKKyN0YiAwOiAxMDAxLzI0MDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDYyMjA4MDAsIDB4ODlkYWExNWUKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgNjIyMDgwMCwgMHhjZjUyZTI1NAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA2MjIwODAwLCAweDkxMTMyYzEzCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDYyMjA4MDAsIDB4MzdiOGJlOTEKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgNjIyMDgwMCwgMHgyYjA5YmFmYQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICA2MjIwODAwLCAweDA2ZDc5ZDhkCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgIDYyMjA4MDAsIDB4OGU3OTNjMWQKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgNjIyMDgwMCwgMHhlYTBmZDg4NQorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICA2MjIwODAwLCAweDc3ODZhMmFkCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgIDYyMjA4MDAsIDB4ZWQ0ZjlkZDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtbG9zc2xlc3MgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LWxvc3NsZXNzCmluZGV4IDQ0Y2IxM2IuLjljODZkYjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtbG9zc2xlc3MKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1sb3NzbGVzcwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA4MzMzMy81MDAwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNDYwODAwLCAweDc3MzFkZDJmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NjA4MDAsIDB4OTQ0YjhjNjQKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDQ2MDgwMCwgMHhiZTgzMzA0MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1taXNzaW5nLWZyYW1lIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1taXNzaW5nLWZyYW1lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDIyOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LW1pc3NpbmctZnJhbWUKQEAgLTAsMCArMSwzNSBAQAorI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE0NDB4MTA4MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMjMzMjgwMCwgMHgwMDlkYWNiOAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAyMzMyODAwLCAweGIxZTUwNzY0CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ZTI5NDgxZTAKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgMjMzMjgwMCwgMHgwYjFiNGRlNAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAyMzMyODAwLCAweDcyNmE2NDRjCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4N2EwOWM0YTUKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgMjMzMjgwMCwgMHgyZTkwNTllYQorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAyMzMyODAwLCAweDUyMDcxZmRjCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4NGZhMDA0MTcKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgMjMzMjgwMCwgMHg2MDM3ZmI0ZAorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAyMzMyODAwLCAweDg4N2ZmYWUyCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODg3ZmZhZTIKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4ODdmZmFlMgorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAyMzMyODAwLCAweDg4N2ZmYWUyCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODg3ZmZhZTIKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4ODdmZmFlMgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAyMzMyODAwLCAweDg4N2ZmYWUyCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODg3ZmZhZTIKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4ODdmZmFlMgorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAyMzMyODAwLCAweDg4N2ZmYWUyCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODg3ZmZhZTIKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4ODdmZmFlMgorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAyMzMyODAwLCAweDg4N2ZmYWUyCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODg3ZmZhZTIKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4ODdmZmFlMgorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAyMzMyODAwLCAweDg4N2ZmYWUyCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODg3ZmZhZTIKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgMjMzMjgwMCwgMHg4ODdmZmFlMgorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAyMzMyODAwLCAweDg4N2ZmYWUyCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgIDIzMzI4MDAsIDB4ODI0YmI5MWIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtbWl4ZWQtbmFsLWNvZGluZyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtbWl4ZWQtbmFsLWNvZGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI2YjRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1taXhlZC1uYWwtY29kaW5nCkBAIC0wLDAgKzEsMTAgQEAKKyN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDQwLzMzCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4OGY4ODJlNGQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHhjNTY5NDE0NAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGNmMGU5ZTNhCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ZjYyMGU0NTkKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDUxODQwMCwgMHg0NTY2NDUzZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1yZWYtcGljLW1vZC1vdmVyZmxvdyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtcmVmLXBpYy1tb2Qtb3ZlcmZsb3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzODZjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtcmVmLXBpYy1tb2Qtb3ZlcmZsb3cKQEAgLTAsMCArMSwyNSBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHg1Y2QwYmVlOQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzMTEwNDAwLCAweDE5ZDAxNTVjCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4MzUxOWJlNGIKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgMzExMDQwMCwgMHg4N2RjNjcwOAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAzMTEwNDAwLCAweGVmM2MxMDU2CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NTA2NGFhZDIKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgMzExMDQwMCwgMHhiZmIzNTA1NworMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAzMTEwNDAwLCAweDYwODllYjk1CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4ODVkZThkZWEKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgMzExMDQwMCwgMHgyMTZiMWU1YQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAzMTEwNDAwLCAweGJhNzNiZGM0CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NTM2ZTQzN2EKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgMzExMDQwMCwgMHg0YmUwY2RiZAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAzMTEwNDAwLCAweDczMTY0NjJkCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4ODBlYjg2MjIKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgMzExMDQwMCwgMHhhNjEyYTcwYgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAzMTEwNDAwLCAweDlmZjY1MzQ1CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NTcwMDNkZmEKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgMzExMDQwMCwgMHhmMjllMDM2ZQorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAzMTEwNDAwLCAweDcwMjg1MzYzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1sYXJnZV80MjBfOC10by1zbWFsbF80MjBfOCBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtcmVpbml0LWxhcmdlXzQyMF84LXRvLXNtYWxsXzQyMF84CmluZGV4IDg1MTg4NTUuLjJjMjgzODYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtcmVpbml0LWxhcmdlXzQyMF84LXRvLXNtYWxsXzQyMF84CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtcmVpbml0LWxhcmdlXzQyMF84LXRvLXNtYWxsXzQyMF84CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2MDgyNTYsIDB4NjU1NzRjNDMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDYwODI1NiwgMHg1ZTVhMWFhNAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNjA4MjU2LCAweGE5YTVjYmM1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1zbWFsbF80MjBfOC10by1sYXJnZV80NDRfMTAgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1zbWFsbF80MjBfOC10by1sYXJnZV80NDRfMTAKaW5kZXggN2U3NjMxYS4uZTcyN2QwNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1yZWluaXQtc21hbGxfNDIwXzgtdG8tbGFyZ2VfNDQ0XzEwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtcmVpbml0LXNtYWxsXzQyMF84LXRvLWxhcmdlXzQ0NF8xMApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNjA4MjU2LCAweDI3YTA2OWEzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2MDgyNTYsIDB4MjJhNWZmOTYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDYwODI1NiwgMHgyOWFkNzUzZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1yZWluaXQtc21hbGxfNDIwXzktdG8tc21hbGxfNDIwXzggYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1zbWFsbF80MjBfOS10by1zbWFsbF80MjBfOAppbmRleCA2NjJkYjI5Li45YjNkMTE0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1zbWFsbF80MjBfOS10by1zbWFsbF80MjBfOAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1zbWFsbF80MjBfOS10by1zbWFsbF80MjBfOApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNjA4MjU2LCAweGVlMDYzNzdmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2MDgyNTYsIDB4OWMyMmM1ZWUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDYwODI1NiwgMHgzMjJhYmVlMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1yZWluaXQtc21hbGxfNDIyXzktdG8tc21hbGxfNDIwXzkgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1zbWFsbF80MjJfOS10by1zbWFsbF80MjBfOQppbmRleCBiNWE5NTA1Li4xNTExNWI2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1zbWFsbF80MjJfOS10by1zbWFsbF80MjBfOQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXJlaW5pdC1zbWFsbF80MjJfOS10by1zbWFsbF80MjBfOQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNjA4MjU2LCAweDNhZWYzMWYzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2MDgyNTYsIDB4MDVhZmU0ZTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDYwODI1NiwgMHg5ZDdkYzliMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1za2lwLW5vaW50cmEgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXNraXAtbm9pbnRyYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjU5OTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1za2lwLW5vaW50cmEKQEAgLTAsMCArMSw1NSBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKKyN0YiAxOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDE6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMTogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogc3RlcmVvCisxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgIDExNTIsICAgICAgIDExNTIsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAgMjMwNCwgICAgICAgMjMwNCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgICAzNDU2LCAgICAgICAzNDU2LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgIDQ2MDgsICAgICAgIDQ2MDgsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAgNTc2MCwgICAgICAgNTc2MCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgICA2OTEyLCAgICAgICA2OTEyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgIDgwNjQsICAgICAgIDgwNjQsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDEwMzY4LCAgICAgIDEwMzY4LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMTE1MjAsICAgICAgMTE1MjAsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAxMjY3MiwgICAgICAxMjY3MiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDEzODI0LCAgICAgIDEzODI0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMTQ5NzYsICAgICAgMTQ5NzYsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAxNjEyOCwgICAgICAxNjEyOCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDE3MjgwLCAgICAgIDE3MjgwLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAxOTU4NCwgICAgICAxOTU4NCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDIwNzM2LCAgICAgIDIwNzM2LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMjE4ODgsICAgICAgMjE4ODgsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAyMzA0MCwgICAgICAyMzA0MCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDI0MTkyLCAgICAgIDI0MTkyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMjUzNDQsICAgICAgMjUzNDQsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAyNjQ5NiwgICAgICAyNjQ5NiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMjg4MDAsICAgICAgMjg4MDAsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAyOTk1MiwgICAgICAyOTk1MiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDMxMTA0LCAgICAgIDMxMTA0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMzIyNTYsICAgICAgMzIyNTYsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAzMzQwOCwgICAgICAzMzQwOCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDM0NTYwLCAgICAgIDM0NTYwLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMzU3MTIsICAgICAgMzU3MTIsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDM4MDE2LCAgICAgIDM4MDE2LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMzkxNjgsICAgICAgMzkxNjgsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICA0MDMyMCwgICAgICA0MDMyMCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDQxNDcyLCAgICAgIDQxNDcyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgNDI2MjQsICAgICAgNDI2MjQsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICA0Mzc3NiwgICAgICA0Mzc3NiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDQ0OTI4LCAgICAgIDQ0OTI4LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICA0NzIzMiwgICAgICA0NzIzMiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDQ4Mzg0LCAgICAgIDQ4Mzg0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4OWVjYThiN2MKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgMzExMDQwMCwgMHhhNDI2ZjE1ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC1za2lwLW5va2V5IGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC1za2lwLW5va2V5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNTk5MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXNraXAtbm9rZXkKQEAgLTAsMCArMSw1NSBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKKyN0YiAxOiAxLzQ4MDAwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDE6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMTogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogc3RlcmVvCisxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgIDExNTIsICAgICAgIDExNTIsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAgMjMwNCwgICAgICAgMjMwNCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgICAzNDU2LCAgICAgICAzNDU2LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgIDQ2MDgsICAgICAgIDQ2MDgsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAgNTc2MCwgICAgICAgNTc2MCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgICA2OTEyLCAgICAgICA2OTEyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgIDgwNjQsICAgICAgIDgwNjQsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAgOTIxNiwgICAgICAgOTIxNiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDEwMzY4LCAgICAgIDEwMzY4LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMTE1MjAsICAgICAgMTE1MjAsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAxMjY3MiwgICAgICAxMjY3MiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDEzODI0LCAgICAgIDEzODI0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMTQ5NzYsICAgICAgMTQ5NzYsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAxNjEyOCwgICAgICAxNjEyOCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDE3MjgwLCAgICAgIDE3MjgwLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAxOTU4NCwgICAgICAxOTU4NCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDIwNzM2LCAgICAgIDIwNzM2LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMjE4ODgsICAgICAgMjE4ODgsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAyMzA0MCwgICAgICAyMzA0MCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDI0MTkyLCAgICAgIDI0MTkyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMjUzNDQsICAgICAgMjUzNDQsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAyNjQ5NiwgICAgICAyNjQ5NiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMjg4MDAsICAgICAgMjg4MDAsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAyOTk1MiwgICAgICAyOTk1MiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDMxMTA0LCAgICAgIDMxMTA0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMzIyNTYsICAgICAgMzIyNTYsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAzMzQwOCwgICAgICAzMzQwOCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDM0NTYwLCAgICAgIDM0NTYwLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMzU3MTIsICAgICAgMzU3MTIsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICAzNjg2NCwgICAgICAzNjg2NCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDM4MDE2LCAgICAgIDM4MDE2LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgMzkxNjgsICAgICAgMzkxNjgsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICA0MDMyMCwgICAgICA0MDMyMCwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDQxNDcyLCAgICAgIDQxNDcyLCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgNDI2MjQsICAgICAgNDI2MjQsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICA0Mzc3NiwgICAgICA0Mzc3NiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDQ0OTI4LCAgICAgIDQ0OTI4LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4MDAwMDAwMDAKKzEsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxMTUyLCAgICAgNDYwOCwgMHgwMDAwMDAwMAorMSwgICAgICA0NzIzMiwgICAgICA0NzIzMiwgICAgIDExNTIsICAgICA0NjA4LCAweDAwMDAwMDAwCisxLCAgICAgIDQ4Mzg0LCAgICAgIDQ4Mzg0LCAgICAgMTE1MiwgICAgIDQ2MDgsIDB4OWVjYThiN2MKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgMzExMDQwMCwgMHhhNDI2ZjE1ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NC10d29maWVsZHMtcGFja2V0IGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC10d29maWVsZHMtcGFja2V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTI0OTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXR3b2ZpZWxkcy1wYWNrZXQKQEAgLTAsMCArMSwzNSBAQAorI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHg0OGUzOWFjZAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzMTEwNDAwLCAweDQwZDY1ZjY5CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4ZGNiYzUwYmYKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgMzExMDQwMCwgMHg3M2EyMjc2YQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAzMTEwNDAwLCAweDg0YTJiM2M2CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4N2NmM2I1NzAKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgMzExMDQwMCwgMHhhMmQxZTAzYQorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAzMTEwNDAwLCAweDAzMjIwZmIxCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4ODljZDUyNmEKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgMzExMDQwMCwgMHhiYjRiNzUzMQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAzMTEwNDAwLCAweDBhNjlmMDUzCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4MDE4Nzk5NGIKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgMzExMDQwMCwgMHgyNmVkNDlmYQorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAzMTEwNDAwLCAweGJlODk2NmQ0CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4MjQ4ZDIwM2MKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgMzExMDQwMCwgMHgzMTM5Yzc1NAorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAzMTEwNDAwLCAweGYyMjM4MGM0CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4M2UwMGRjYzEKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgMzExMDQwMCwgMHg4Y2JlMjQ4MworMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAzMTEwNDAwLCAweDY5NTFjZDYzCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4MzZhY2E0YzUKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgMzExMDQwMCwgMHg0ZDRmNmZiZQorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAzMTEwNDAwLCAweDk5NzI0N2FhCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4MGZkNDBlMDYKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgMzExMDQwMCwgMHhhMTBkMmQ2NworMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAzMTEwNDAwLCAweDg3YzQ4MWRhCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4ZTNkY2EzY2QKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgMzExMDQwMCwgMHg1Zjc3YjA3OAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAzMTEwNDAwLCAweGYxZGRkMDk4CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgIDMxMTA0MDAsIDB4ZWRjZDE3NTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjQtdW5lc2NhcGVkLWV4dHJhZGF0YSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQtdW5lc2NhcGVkLWV4dHJhZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ0YmMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NC11bmVzY2FwZWQtZXh0cmFkYXRhCkBAIC0wLDAgKzEsMTUgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTc2Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDg0NDgwLCAweDA2OTllYjM4CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4Y2U5MDJjMzIKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiNmQxMjVmNworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgIDg0NDgwLCAweDI1NTVlOTNiCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWVhNWMwOGMKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgICA4NDQ4MCwgMHg4NDhlYjNkYQorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgIDg0NDgwLCAweDZjZmFiZTkwCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZWQxNmNjNWUKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgICA4NDQ4MCwgMHhkYThkZjhmOAorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgIDg0NDgwLCAweDgzZmEwNTRiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0LXhhdmMtNDM4OSBiL3Rlc3RzL3JlZi9mYXRlL2gyNjQteGF2Yy00Mzg5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzZiYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0LXhhdmMtNDM4OQpAQCAtMCwwICsxLDIzIEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDEvMQorI3RiIDE6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogNDgwMDAKKyNjaGFubmVsX2xheW91dCAxOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBtb25vCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4OWEwMmVjZjIKKzEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxOTIwLCAgICAgMzg0MCwgMHgzODA3NGFjOAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICA4Mjk0NDAwLCAweDYyNmY4NzBhCisxLCAgICAgICAxOTIwLCAgICAgICAxOTIwLCAgICAgMTkyMCwgICAgIDM4NDAsIDB4ZDE1NDgyOWMKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgODI5NDQwMCwgMHgyZDYwNTU3YworMSwgICAgICAgMzg0MCwgICAgICAgMzg0MCwgICAgIDE5MjAsICAgICAzODQwLCAweDUyNTE1NDIxCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4OWM1ODI5NTYKKzEsICAgICAgIDU3NjAsICAgICAgIDU3NjAsICAgICAxOTIwLCAgICAgMzg0MCwgMHhkYjg4NjlkOAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICA4Mjk0NDAwLCAweDFjMDcxZjlhCisxLCAgICAgICA3NjgwLCAgICAgICA3NjgwLCAgICAgMTkyMCwgICAgIDM4NDAsIDB4NWIyZjc3NTgKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgODI5NDQwMCwgMHg3MjdmMzNjYworMSwgICAgICAgOTYwMCwgICAgICAgOTYwMCwgICAgIDE5MjAsICAgICAzODQwLCAweGQwOTk5NzZhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oMjY0X21wNHRvYW5uZXhiX3RpY2tldDI5OTEgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0X21wNHRvYW5uZXhiX3RpY2tldDI5OTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0NWVmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjRfbXA0dG9hbm5leGJfdGlja2V0Mjk5MQpAQCAtMCwwICsxLDEyNyBAQAorZGJhNjcyYzE1NGI0MTQxNGNmMjZhYWU5NjdjMjdlZWYgKnRlc3RzL2RhdGEvZmF0ZS9oMjY0X21wNHRvYW5uZXhiX3RpY2tldDI5OTEuaDI2NAorMTk4NTgyMyB0ZXN0cy9kYXRhL2ZhdGUvaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQyOTkxLmgyNjQKKyNleHRyYWRhdGEgMDogICAgICAgNDgsIDB4NDdhZTBkNTUKKyN0YiAwOiAxLzEyMDAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogaDI2NAorI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMy80CiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICA0ODAwMCwgICAgMzcxMjcsIDB4YzEyNTE4NGMKKzAsICAgICAgNDgwMDAsICAgICAgNDgwMDAsICAgIDQwMDQwLCAgICAgNjkyMCwgMHg4NTEyMzYxYSwgRj0weDAKKzAsICAgICAgODgwNDAsICAgICAgODgwNDAsICAgIDQwMDQwLCAgICAgNzU1MCwgMHgxYmM1NmVkNCwgRj0weDAKKzAsICAgICAxMjgwODEsICAgICAxMjgwODEsICAgIDQwMDQwLCAgICAgODc1MiwgMHhiOGM2ZjBhMSwgRj0weDAKKzAsICAgICAxNjgxMjEsICAgICAxNjgxMjEsICAgIDQwMDQwLCAgICAxMzAyMiwgMHhlMzZiNjI1NSwgRj0weDAKKzAsICAgICAyMDgxNjIsICAgICAyMDgxNjIsICAgIDQwMDQwLCAgICAxMjk4MiwgMHg3Yzk5MzI5NywgRj0weDAKKzAsICAgICAyNDgyMDIsICAgICAyNDgyMDIsICAgIDQwMDQwLCAgICAxMzk4MiwgMHgyNGZlNWUwZiwgRj0weDAKKzAsICAgICAyODgyNDIsICAgICAyODgyNDIsICAgIDQwMDQwLCAgICAxMzk1OCwgMHg5YTIyMjMwZCwgRj0weDAKKzAsICAgICAzMjgyODMsICAgICAzMjgyODMsICAgIDQwMDQwLCAgICAxNTM0NiwgMHhmMGYxYTU5YywgRj0weDAKKzAsICAgICAzNjgzMjMsICAgICAzNjgzMjMsICAgIDQwMDQwLCAgICAyMTAxNiwgMHg4ZDA2MWU3ZiwgRj0weDAKKzAsICAgICA0MDgzNjQsICAgICA0MDgzNjQsICAgIDQwMDQwLCAgICAxNDc4NiwgMHg3YjFlODg5ZCwgRj0weDAKKzAsICAgICA0NDg0MDQsICAgICA0NDg0MDQsICAgIDQwMDQwLCAgICAxMTkxNywgMHhmNzc0MmE5ZCwgRj0weDAKKzAsICAgICA0ODg0NDQsICAgICA0ODg0NDQsICAgIDQwMDQwLCAgICAxMTIzNCwgMHg4M2NiZDlmZCwgRj0weDAKKzAsICAgICA1Mjg0ODUsICAgICA1Mjg0ODUsICAgIDQwMDQwLCAgICAxNzYxNiwgMHhmZGY5NTEwNCwgRj0weDAKKzAsICAgICA1Njg1MjUsICAgICA1Njg1MjUsICAgIDQwMDQwLCAgICAxMDY4OSwgMHg5NjMzZDMyYiwgRj0weDAKKzAsICAgICA2MDg1NjYsICAgICA2MDg1NjYsICAgIDQwMDQwLCAgICA0NTI5MiwgMHg2NmRkMmNmNgorMCwgICAgIDY0ODYwNiwgICAgIDY0ODYwNiwgICAgNDAwNDAsICAgIDIwODM3LCAweDA1MWFiZmFiLCBGPTB4MAorMCwgICAgIDY4ODY0NiwgICAgIDY4ODY0NiwgICAgNDAwNDAsICAgIDIxNDE4LCAweGUyYTU5ZDcwLCBGPTB4MAorMCwgICAgIDcyODY4NywgICAgIDcyODY4NywgICAgNDAwNDAsICAgIDE1NjQzLCAweDE1Y2YyY2VjLCBGPTB4MAorMCwgICAgIDc2ODcyNywgICAgIDc2ODcyNywgICAgNDAwNDAsICAgIDExOTU2LCAweDVhZWYzODJlLCBGPTB4MAorMCwgICAgIDgwODc2OCwgICAgIDgwODc2OCwgICAgNDAwNDAsICAgIDE1MzkzLCAweDk1MWRkNzU3LCBGPTB4MAorMCwgICAgIDg0ODgwOCwgICAgIDg0ODgwOCwgICAgNDAwNDAsICAgIDE0ODM5LCAweDJkMzMxNTFjLCBGPTB4MAorMCwgICAgIDg4ODg0OCwgICAgIDg4ODg0OCwgICAgNDAwNDAsICAgIDE0NTgwLCAweDJhODk1YWE2LCBGPTB4MAorMCwgICAgIDkyODg4OSwgICAgIDkyODg4OSwgICAgNDAwNDAsICAgIDE3NTcxLCAweGIzYTExNWYwLCBGPTB4MAorMCwgICAgIDk2ODkyOSwgICAgIDk2ODkyOSwgICAgNDAwNDAsICAgIDE1NjIxLCAweDJjYzY1NzdkLCBGPTB4MAorMCwgICAgMTAwODk3MCwgICAgMTAwODk3MCwgICAgNDAwNDAsICAgIDEzNjUzLCAweGI2YTNhYzZlLCBGPTB4MAorMCwgICAgMTA0OTAxMCwgICAgMTA0OTAxMCwgICAgNDAwNDAsICAgIDE2Mjc0LCAweGU4YjliMDlkLCBGPTB4MAorMCwgICAgMTA4OTA1MCwgICAgMTA4OTA1MCwgICAgNDAwNDAsICAgIDEzMTMwLCAweGNiYjZiYjhlLCBGPTB4MAorMCwgICAgMTEyOTA5MSwgICAgMTEyOTA5MSwgICAgNDAwNDAsICAgIDE2MTgwLCAweDVkMTg4YTdhLCBGPTB4MAorMCwgICAgMTE2OTEzMSwgICAgMTE2OTEzMSwgICAgNDAwNDAsICAgIDE0OTYxLCAweDlmZjJmNDYzLCBGPTB4MAorMCwgICAgMTIwOTE3MiwgICAgMTIwOTE3MiwgICAgNDAwNDAsICAgIDU0Mjk3LCAweGY5OGQzMGVkCiswLCAgICAxMjQ5MjEyLCAgICAxMjQ5MjEyLCAgICA0MDA0MCwgICAgMTE1MDAsIDB4OGM0ODUyYzksIEY9MHgwCiswLCAgICAxMjg5MjUyLCAgICAxMjg5MjUyLCAgICA0MDA0MCwgICAgMTIwNjUsIDB4ZmI3OTU0YzMsIEY9MHgwCiswLCAgICAxMzI5MjkzLCAgICAxMzI5MjkzLCAgICA0MDA0MCwgICAgMTI1MzIsIDB4ZjBhOTM1ZDMsIEY9MHgwCiswLCAgICAxMzY5MzMzLCAgICAxMzY5MzMzLCAgICA0MDA0MCwgICAgMTYyODQsIDB4YzVjMTg1NjEsIEY9MHgwCiswLCAgICAxNDA5Mzc0LCAgICAxNDA5Mzc0LCAgICA0MDA0MCwgICAgMTc2NTcsIDB4MDhjZTU4Y2MsIEY9MHgwCiswLCAgICAxNDQ5NDE0LCAgICAxNDQ5NDE0LCAgICA0MDA0MCwgICAgMjEzMzYsIDB4ZDA5NjUyMDIsIEY9MHgwCiswLCAgICAxNDg5NDU0LCAgICAxNDg5NDU0LCAgICA0MDA0MCwgICAgMTg1NDksIDB4OWU5YTQyZWYsIEY9MHgwCiswLCAgICAxNTI5NDk1LCAgICAxNTI5NDk1LCAgICA0MDA0MCwgICAgMTQzNTEsIDB4YTg2NGQyYmUsIEY9MHgwCiswLCAgICAxNTY5NTM1LCAgICAxNTY5NTM1LCAgICA0MDA0MCwgICAgMTUyMDUsIDB4NWJkN2I5OGUsIEY9MHgwCiswLCAgICAxNjA5NTc2LCAgICAxNjA5NTc2LCAgICA0MDA0MCwgICAgMTgwNDAsIDB4Mjg3YWYzMDEsIEY9MHgwCiswLCAgICAxNjQ5NjE2LCAgICAxNjQ5NjE2LCAgICA0MDA0MCwgICAgMTU5MTcsIDB4MmRiNTI1ODAsIEY9MHgwCiswLCAgICAxNjg5NjU2LCAgICAxNjg5NjU2LCAgICA0MDA0MCwgICAgMTMyNTAsIDB4ZmVkMGRlYjgsIEY9MHgwCiswLCAgICAxNzI5Njk3LCAgICAxNzI5Njk3LCAgICA0MDA0MCwgICAgMTMzNjAsIDB4YmY5MmQ0NzYsIEY9MHgwCiswLCAgICAxNzY5NzM3LCAgICAxNzY5NzM3LCAgICA0MDA0MCwgICAgMTE3NDksIDB4MzA0MWVhZjEsIEY9MHgwCiswLCAgICAxODA5Nzc4LCAgICAxODA5Nzc4LCAgICA0MDA0MCwgICAgMjM5OTgsIDB4ZWU4N2Q1YzQKKzAsICAgIDE4NDk4MTgsICAgIDE4NDk4MTgsICAgIDQwMDQwLCAgICAxNjA2NSwgMHhlOGY3MTViNywgRj0weDAKKzAsICAgIDE4ODk4NTgsICAgIDE4ODk4NTgsICAgIDQwMDQwLCAgICAxNjQ0MSwgMHgwYTRlMDYwZiwgRj0weDAKKzAsICAgIDE5Mjk4OTksICAgIDE5Mjk4OTksICAgIDQwMDQwLCAgICAxNzM5NSwgMHhhOGVkZWNjMiwgRj0weDAKKzAsICAgIDE5Njk5MzksICAgIDE5Njk5MzksICAgIDQwMDQwLCAgICAyMjI5NSwgMHhkNTE3M2M2OCwgRj0weDAKKzAsICAgIDIwMDk5ODAsICAgIDIwMDk5ODAsICAgIDQwMDQwLCAgICAyMjc3OCwgMHhmNWU1MjJjZSwgRj0weDAKKzAsICAgIDIwNTAwMjAsICAgIDIwNTAwMjAsICAgIDQwMDQwLCAgICAyMDU5MCwgMHgyZmQ2YjJjYSwgRj0weDAKKzAsICAgIDIwOTAwNjAsICAgIDIwOTAwNjAsICAgIDQwMDQwLCAgICAxOTkzNywgMHhlMTA5ZGRhNSwgRj0weDAKKzAsICAgIDIxMzAxMDEsICAgIDIxMzAxMDEsICAgIDQwMDQwLCAgICAyMzgzMywgMHhkMTI2OTFjYiwgRj0weDAKKzAsICAgIDIxNzAxNDEsICAgIDIxNzAxNDEsICAgIDQwMDQwLCAgICAxNzk2OSwgMHg5YmFhZDY3YSwgRj0weDAKKzAsICAgIDIyMTAxODIsICAgIDIyMTAxODIsICAgIDQwMDQwLCAgICAxNjY0NSwgMHg1M2ZiMzA5OSwgRj0weDAKKzAsICAgIDIyNTAyMjIsICAgIDIyNTAyMjIsICAgIDQwMDQwLCAgICAxNTMwNywgMHhiYzViYWM4ZCwgRj0weDAKKzAsICAgIDIyOTAyNjIsICAgIDIyOTAyNjIsICAgIDQwMDQwLCAgICAxMzc0OCwgMHhlZDI2YWViNCwgRj0weDAKKzAsICAgIDIzMzAzMDMsICAgIDIzMzAzMDMsICAgIDQwMDQwLCAgICAxNTA5MiwgMHgzYzk4MzUzOCwgRj0weDAKKzAsICAgIDIzNzAzNDMsICAgIDIzNzAzNDMsICAgIDQwMDQwLCAgICAxNDYzNiwgMHg5YjI3OGE2YywgRj0weDAKKzAsICAgIDI0MTAzODQsICAgIDI0MTAzODQsICAgIDQwMDQwLCAgICAyOTEzNSwgMHgwYTM0YmUxOAorMCwgICAgMjQ1MDQyNCwgICAgMjQ1MDQyNCwgICAgNDAwNDAsICAgIDEwMjMyLCAweDU0MDhlMTViLCBGPTB4MAorMCwgICAgMjQ5MDQ2NCwgICAgMjQ5MDQ2NCwgICAgNDAwNDAsICAgICA5NzY5LCAweGM5M2NiN2Y5LCBGPTB4MAorMCwgICAgMjUzMDUwNSwgICAgMjUzMDUwNSwgICAgNDAwNDAsICAgIDE0NDU0LCAweDQ1MjMwZGJlLCBGPTB4MAorMCwgICAgMjU3MDU0NSwgICAgMjU3MDU0NSwgICAgNDAwNDAsICAgIDE0NDgxLCAweDRlMTExNTYyLCBGPTB4MAorMCwgICAgMjYxMDU4NiwgICAgMjYxMDU4NiwgICAgNDAwNDAsICAgIDEzNDM5LCAweDBlMDk2ZWViLCBGPTB4MAorMCwgICAgMjY1MDYyNiwgICAgMjY1MDYyNiwgICAgNDAwNDAsICAgIDEzNTQzLCAweGMyNDU2OWQ5LCBGPTB4MAorMCwgICAgMjY5MDY2NiwgICAgMjY5MDY2NiwgICAgNDAwNDAsICAgIDE2MDEyLCAweDgxNTQzMzMyLCBGPTB4MAorMCwgICAgMjczMDcwNywgICAgMjczMDcwNywgICAgNDAwNDAsICAgIDE1NzY5LCAweDJkZGZhMTg5LCBGPTB4MAorMCwgICAgMjc3MDc0NywgICAgMjc3MDc0NywgICAgNDAwNDAsICAgIDE0MjA4LCAweDEzNzlhZGQyLCBGPTB4MAorMCwgICAgMjgxMDc4OCwgICAgMjgxMDc4OCwgICAgNDAwNDAsICAgIDExNDc5LCAweGRmYzE0YjU1LCBGPTB4MAorMCwgICAgMjg1MDgyOCwgICAgMjg1MDgyOCwgICAgNDAwNDAsICAgIDExMTMwLCAweDBhYjU5NTliLCBGPTB4MAorMCwgICAgMjg5MDg2OCwgICAgMjg5MDg2OCwgICAgNDAwNDAsICAgIDE0ODAxLCAweDQwYmFlMDE2LCBGPTB4MAorMCwgICAgMjkzMDkwOSwgICAgMjkzMDkwOSwgICAgNDAwNDAsICAgIDE3MzAzLCAweDljZTFmZDMxLCBGPTB4MAorMCwgICAgMjk3MDk0OSwgICAgMjk3MDk0OSwgICAgNDAwNDAsICAgIDE3Njc4LCAweDliZDY2MTQxLCBGPTB4MAorMCwgICAgMzAxMDk5MCwgICAgMzAxMDk5MCwgICAgNDAwNDAsICAgIDQ4NjczLCAweDQ0YjZjZTQ2CiswLCAgICAzMDUxMDMwLCAgICAzMDUxMDMwLCAgICA0MDA0MCwgICAgMTE4OTQsIDB4MTJlMWZlY2UsIEY9MHgwCiswLCAgICAzMDkxMDcwLCAgICAzMDkxMDcwLCAgICA0MDA0MCwgICAgMTY1MTQsIDB4YzU3YWVkMDUsIEY9MHgwCiswLCAgICAzMTMxMTExLCAgICAzMTMxMTExLCAgICA0MDA0MCwgICAgMTMwNDQsIDB4NjE5MTRmYTAsIEY9MHgwCiswLCAgICAzMTcxMTUxLCAgICAzMTcxMTUxLCAgICA0MDA0MCwgICAgMTYxNTUsIDB4YjQ2Yzk1OGEsIEY9MHgwCiswLCAgICAzMjExMTkyLCAgICAzMjExMTkyLCAgICA0MDA0MCwgICAgMTI5NTAsIDB4YTY3NmY2MDUsIEY9MHgwCiswLCAgICAzMjUxMjMyLCAgICAzMjUxMjMyLCAgICA0MDA0MCwgICAgMTc4NzAsIDB4N2E1YWEwM2EsIEY9MHgwCiswLCAgICAzMjkxMjcyLCAgICAzMjkxMjcyLCAgICA0MDA0MCwgICAgMTMxOTIsIDB4M2M5ZTlkOTksIEY9MHgwCiswLCAgICAzMzMxMzEzLCAgICAzMzMxMzEzLCAgICA0MDA0MCwgICAgMjU1NTksIDB4OTNlMGJlY2IsIEY9MHgwCiswLCAgICAzMzcxMzUzLCAgICAzMzcxMzUzLCAgICA0MDA0MCwgICAgMTQ2OTUsIDB4MTlhY2U5NWEsIEY9MHgwCiswLCAgICAzNDExMzk0LCAgICAzNDExMzk0LCAgICA0MDA0MCwgICAgMTU0ODQsIDB4NmUzYmQwZDIsIEY9MHgwCiswLCAgICAzNDUxNDM0LCAgICAzNDUxNDM0LCAgICA0MDA0MCwgICAgMTcwOTYsIDB4MmZkOTNiNDgsIEY9MHgwCiswLCAgICAzNDkxNDc0LCAgICAzNDkxNDc0LCAgICA0MDA0MCwgICAgMTIyMDgsIDB4ODFhNTg3YzAsIEY9MHgwCiswLCAgICAzNTMxNTE1LCAgICAzNTMxNTE1LCAgICA0MDA0MCwgICAgMTQ3MDksIDB4NWRmZmJlMDQsIEY9MHgwCiswLCAgICAzNTcxNTU1LCAgICAzNTcxNTU1LCAgICA0MDA0MCwgICAgMTQzOTAsIDB4YmZkMWUwNDEsIEY9MHgwCiswLCAgICAzNjExNTk2LCAgICAzNjExNTk2LCAgICA0MDA0MCwgICAgMzcyMzcsIDB4ZmE5YTI0YjEKKzAsICAgIDM2NTE2MzYsICAgIDM2NTE2MzYsICAgIDQwMDQwLCAgICAxNDA1NiwgMHgyNDcxNGM3YywgRj0weDAKKzAsICAgIDM2OTE2NzYsICAgIDM2OTE2NzYsICAgIDQwMDQwLCAgICAxOTQzOCwgMHgwYzUwZGNkNSwgRj0weDAKKzAsICAgIDM3MzE3MTcsICAgIDM3MzE3MTcsICAgIDQwMDQwLCAgICAyMTcyOCwgMHg3ZWVhNGExMSwgRj0weDAKKzAsICAgIDM3NzE3NTcsICAgIDM3NzE3NTcsICAgIDQwMDQwLCAgICAxNzk2NiwgMHhhYzdhYzk4OCwgRj0weDAKKzAsICAgIDM4MTE3OTgsICAgIDM4MTE3OTgsICAgIDQwMDQwLCAgICAxNDg2OCwgMHgwZWVjYjFiZSwgRj0weDAKKzAsICAgIDM4NTE4MzgsICAgIDM4NTE4MzgsICAgIDQwMDQwLCAgICAxNTYwOCwgMHgxNDQ5Mzc3ZSwgRj0weDAKKzAsICAgIDM4OTE4NzgsICAgIDM4OTE4NzgsICAgIDQwMDQwLCAgICAxMjQ4NCwgMHhjOTg4MTEzOSwgRj0weDAKKzAsICAgIDM5MzE5MTksICAgIDM5MzE5MTksICAgIDQwMDQwLCAgICAxODIyNiwgMHhkY2RhOGRmYSwgRj0weDAKKzAsICAgIDM5NzE5NTksICAgIDM5NzE5NTksICAgIDQwMDQwLCAgICAxOTE5OSwgMHhlN2VhNGM5MiwgRj0weDAKKzAsICAgIDQwMTIwMDAsICAgIDQwMTIwMDAsICAgIDQwMDQwLCAgICAxOTA0MiwgMHhhNWFkZTY2ZiwgRj0weDAKKzAsICAgIDQwNTIwNDAsICAgIDQwNTIwNDAsICAgIDQwMDQwLCAgICAxNTY2MiwgMHgxOWFjMzE5YSwgRj0weDAKKzAsICAgIDQwOTIwODAsICAgIDQwOTIwODAsICAgIDQwMDQwLCAgICAxNjg3OCwgMHg5OGVmYmFlMiwgRj0weDAKKzAsICAgIDQxMzIxMjEsICAgIDQxMzIxMjEsICAgIDQwMDQwLCAgICAxNDY4NSwgMHgxYmY3OGQ2NSwgRj0weDAKKzAsICAgIDQxNzIxNjEsICAgIDQxNzIxNjEsICAgIDQwMDQwLCAgICAxMzEyNywgMHgwYjkxODgxZCwgRj0weDAKKzAsICAgIDQyMTIyMDIsICAgIDQyMTIyMDIsICAgIDQwMDQwLCAgICAyOTM5MSwgMHgwOTU1ZWQ2YgorMCwgICAgNDI1MjI0MiwgICAgNDI1MjI0MiwgICAgNDAwNDAsICAgIDEyNTc2LCAweGU5ODQ1ZGVkLCBGPTB4MAorMCwgICAgNDI5MjI4MiwgICAgNDI5MjI4MiwgICAgNDAwNDAsICAgIDEyNTk5LCAweDk2YTc5YWI4LCBGPTB4MAorMCwgICAgNDMzMjMyMywgICAgNDMzMjMyMywgICAgNDAwNDAsICAgIDE2MTM0LCAweGI0YzM2ZDNmLCBGPTB4MAorMCwgICAgNDM3MjM2MywgICAgNDM3MjM2MywgICAgNDAwNDAsICAgIDE1NjMwLCAweDMzZjY1YTJlLCBGPTB4MAorMCwgICAgNDQxMjQwNCwgICAgNDQxMjQwNCwgICAgNDAwNDAsICAgIDEzMDg3LCAweGI0YjM4ODZkLCBGPTB4MAorMCwgICAgNDQ1MjQ0NCwgICAgNDQ1MjQ0NCwgICAgNDAwNDAsICAgIDEwNzI4LCAweGJmZmQxMGZhLCBGPTB4MAorMCwgICAgNDQ5MjQ4NCwgICAgNDQ5MjQ4NCwgICAgNDAwNDAsICAgIDEwMzUzLCAweGNjZmUzNTA2LCBGPTB4MAorMCwgICAgNDUzMjUyNSwgICAgNDUzMjUyNSwgICAgNDAwNDAsICAgICA5NTM0LCAweGQ0MjA4M2Y1LCBGPTB4MAorMCwgICAgNDU3MjU2NSwgICAgNDU3MjU2NSwgICAgNDAwNDAsICAgIDEyNjQxLCAweDkzZThhYmJkLCBGPTB4MAorMCwgICAgNDYxMjYwNiwgICAgNDYxMjYwNiwgICAgNDAwNDAsICAgIDExMTk4LCAweDZhOWRlMWZiLCBGPTB4MAorMCwgICAgNDY1MjY0NiwgICAgNDY1MjY0NiwgICAgNDAwNDAsICAgIDE1NTcyLCAweGQ2Y2I2YzRiLCBGPTB4MAorMCwgICAgNDY5MjY4NiwgICAgNDY5MjY4NiwgICAgNDAwNDAsICAgIDEyMDcyLCAweDg5MjhiNzdmLCBGPTB4MAorMCwgICAgNDczMjcyNywgICAgNDczMjcyNywgICAgNDAwNDAsICAgIDE5MTcyLCAweDU0OWI2Yjg3LCBGPTB4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQ1OTI3IGIvdGVzdHMvcmVmL2ZhdGUvaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQ1OTI3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmVhMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oMjY0X21wNHRvYW5uZXhiX3RpY2tldDU5MjcKQEAgLTAsMCArMSwyMSBAQAorNTYyNDg3YmZlYTYzNWNkYWRiYzIzZDM5MDMyMmI1ODkgKnRlc3RzL2RhdGEvZmF0ZS9oMjY0X21wNHRvYW5uZXhiX3RpY2tldDU5MjcuaDI2NAorNTk1NTg1IHRlc3RzL2RhdGEvZmF0ZS9oMjY0X21wNHRvYW5uZXhiX3RpY2tldDU5MjcuaDI2NAorI2V4dHJhZGF0YSAwOiAgICAgICAzNCwgMHg4ZGY2MDhmOAorI3RiIDA6IDEvMTIwMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBoMjY0CisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiswLCAgICAgLTQ4MDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgMjQ3OTk0LCAweDJlMWUyMWVhCiswLCAgICAgICAgICAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgIDQzMzU0LCAweGEwNWRjYTZmLCBGPTB4MAorMCwgICAgICA0ODAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgIDQ4MDAwLCAgICAxMTQyMywgMHg1ZTgwODZkZCwgRj0weDAKKzAsICAgICAgOTYwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAgNTA3OTgsIDB4MTQ1ZmJlNGYsIEY9MHgwCiswLCAgICAgMTQ0MDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgIDEyNTY3LCAweDFlM2Q1MzA0LCBGPTB4MAorMCwgICAgIDE5MjAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgIDQ4MDAwLCAgICA1MjQ0NCwgMHgxYTZjMWE2NCwgRj0weDAKKzAsICAgICAyNDAwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAgMTI1NzUsIDB4MmZmZjQ4NGIsIEY9MHgwCiswLCAgICAgMjg4MDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgIDU0MDI1LCAweGIzYmYwY2U2LCBGPTB4MAorMCwgICAgIDMzNjAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgIDQ4MDAwLCAgICAxMzUzOSwgMHhmZGIxNmM1NywgRj0weDAKKzAsICAgICAzODQwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAgNTQ0ODMsIDB4ZWZlYWQ5OWYsIEY9MHgwCiswLCAgICAgNDMyMDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgIDEzNzA1LCAweDIzY2QyN2U4LCBGPTB4MAorMCwgICAgIDQ4MDAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgIDQ4MDAwLCAgICAyMjMwOCwgMHg0MDkzYjVhZiwgRj0weDAKKzAsICAgICA1MjgwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAgIDYzNzAsIDB4OTZjMTJhYTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2gyNjRfbXA0dG9hbm5leGJfdGlja2V0NTkyN18yIGIvdGVzdHMvcmVmL2ZhdGUvaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQ1OTI3XzIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0MzJiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2gyNjRfbXA0dG9hbm5leGJfdGlja2V0NTkyN18yCkBAIC0wLDAgKzEsMjEgQEAKKzU2MjQ4N2JmZWE2MzVjZGFkYmMyM2QzOTAzMjJiNTg5ICp0ZXN0cy9kYXRhL2ZhdGUvaDI2NF9tcDR0b2FubmV4Yl90aWNrZXQ1OTI3XzIuaDI2NAorNTk1NTg1IHRlc3RzL2RhdGEvZmF0ZS9oMjY0X21wNHRvYW5uZXhiX3RpY2tldDU5MjdfMi5oMjY0CisjZXh0cmFkYXRhIDA6ICAgICAgIDM0LCAweDhkZjYwOGY4CisjdGIgMDogMS8xMjAwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGgyNjQKKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKKzAsICAgICAtNDgwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAyNDc5OTQsIDB4MmUxZTIxZWEKKzAsICAgICAgICAgIDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAgNDMzNTQsIDB4YTA1ZGNhNmYsIEY9MHgwCiswLCAgICAgIDQ4MDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgIDExNDIzLCAweDVlODA4NmRkLCBGPTB4MAorMCwgICAgICA5NjAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgIDQ4MDAwLCAgICA1MDc5OCwgMHgxNDVmYmU0ZiwgRj0weDAKKzAsICAgICAxNDQwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAgMTI1NjcsIDB4MWUzZDUzMDQsIEY9MHgwCiswLCAgICAgMTkyMDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgIDUyNDQ0LCAweDFhNmMxYTY0LCBGPTB4MAorMCwgICAgIDI0MDAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgIDQ4MDAwLCAgICAxMjU3NSwgMHgyZmZmNDg0YiwgRj0weDAKKzAsICAgICAyODgwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAgNTQwMjUsIDB4YjNiZjBjZTYsIEY9MHgwCiswLCAgICAgMzM2MDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgIDEzNTM5LCAweGZkYjE2YzU3LCBGPTB4MAorMCwgICAgIDM4NDAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgIDQ4MDAwLCAgICA1NDQ4MywgMHhlZmVhZDk5ZiwgRj0weDAKKzAsICAgICA0MzIwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICA0ODAwMCwgICAgMTM3MDUsIDB4MjNjZDI3ZTgsIEY9MHgwCiswLCAgICAgNDgwMDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgNDgwMDAsICAgIDIyMzA4LCAweDQwOTNiNWFmLCBGPTB4MAorMCwgICAgIDUyODAwMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgIDQ4MDAwLCAgICAgNjM3MCwgMHg5NmMxMmFhMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGFwLWFscGhhLW9ubHktbm9zbmFwcHktMTI4eDcyIGIvdGVzdHMvcmVmL2ZhdGUvaGFwLWFscGhhLW9ubHktbm9zbmFwcHktMTI4eDcyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjFiNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oYXAtYWxwaGEtb25seS1ub3NuYXBweS0xMjh4NzIKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDcyCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA5MjE2LCAweDU5NjcwMzZmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oYXAtYWxwaGEtb25seS1zbmFwcHktMTI3eDcxIGIvdGVzdHMvcmVmL2ZhdGUvaGFwLWFscGhhLW9ubHktc25hcHB5LTEyN3g3MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTU5MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwLWFscGhhLW9ubHktc25hcHB5LTEyN3g3MQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjd4NzEKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDkwMTcsIDB4YzM5MGMzOGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcC1jaHVuayBiL3Rlc3RzL3JlZi9mYXRlL2hhcC1jaHVuawppbmRleCAxZTdiOTc2Li44ZGQ1MDM5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oYXAtY2h1bmsKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwLWNodW5rCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDA5NmQ0MDllCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oYXAxIGIvdGVzdHMvcmVmL2ZhdGUvaGFwMQppbmRleCBkM2JkZWFlLi5mY2RmOTg1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oYXAxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hhcDEKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogNjIvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTIyODgwMCwgMHgwZmE5NDZiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGFwNSBiL3Rlc3RzL3JlZi9mYXRlL2hhcDUKaW5kZXggNDU4OTgxZS4uZjQ2ZmU3OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGFwNQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oYXA1CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDEyMjg4MDAsIDB4YjcxZWNmOTMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcGVuYy1oYXAtbm9uZSBiL3Rlc3RzL3JlZi9mYXRlL2hhcGVuYy1oYXAtbm9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM4YjJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwZW5jLWhhcC1ub25lCkBAIC0wLDAgKzEsMTQgQEAKKyNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcworI3ZlcnNpb246IDIKKyNoYXNoOiBNRDUKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGhhcAorI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKKyNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDUwNjk2LCA3ZmQ1YmMwOGY3Yjk2MzI2OTUzYmE2OTI2Y2IwNjEwOQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDUwNjk2LCAyNGQxNzJmMmVhMDM5OTRhZGQyNTk2YTQ4MTUxZmNhOAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDUwNjk2LCBlNWYyYmFjMDJhZDg1MGViNzY5MDA3Njk0YTJmN2FjYworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgIDUwNjk2LCAyNjA0MmZiY2UzODY4YWQwMTJiMGI0NTU3ZmQ5NWQ4YQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgIDUwNjk2LCA4MDkwMmRkNDdkMTIxMWYxY2QzODg2NTJkNWUwYTc5NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGFwZW5jLWhhcGEtbm9uZSBiL3Rlc3RzL3JlZi9mYXRlL2hhcGVuYy1oYXBhLW5vbmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhODBhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hhcGVuYy1oYXBhLW5vbmUKQEAgLTAsMCArMSwxNCBAQAorI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCisjdmVyc2lvbjogMgorI2hhc2g6IE1ENQorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogaGFwCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQorI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMDEzODQsIDdiZDFlNjAzYTU0ZmI0NjgyNDJjOWUwMGIwYTkwMzU5CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMDEzODQsIDA5YmYwZTQ4ZGI5YmY0NjVmM2Q4OWExOTJkZGZkYTJkCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMDEzODQsIDQ5OTNhOTZlZDVmNWQyYmMwZjBmZjIwODA2MjJlZWQyCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMDEzODQsIDVjZGJkMGY3NjNiYTQwMzY2ODE2NTg4MTYwZWM3M2MyCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxMDEzODQsIDkyMDJmZTgzNThlZmRlMmM5MmM3NTIxMGVkOTNjMTE4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oYXBlbmMtaGFwcS1ub25lIGIvdGVzdHMvcmVmL2ZhdGUvaGFwZW5jLWhhcHEtbm9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTQ2N2I2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwZW5jLWhhcHEtbm9uZQpAQCAtMCwwICsxLDE0IEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBoYXAKKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCisjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEwMTM4NCwgY2I2ZWY3ODdhZTdhZGZmOTY1YmE0OTA0YTU3YzIxODgKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDEwMTM4NCwgN2NkNTA2NzZjMjU2MzU0YzA2ZjcyOGEyNjU1NTZlZmQKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDEwMTM4NCwgNDU0YjE0Zjc3NzBhMWY1NzgzMGE2NzhlYTZlMjRiODYKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDEwMTM4NCwgNmU2YzA4OGVkMDY4ZDA1ODcwOTc2ZmU3OGE3NWJiMzAKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDEwMTM4NCwgYmE3OWJkOGU3ZmM1ZDg5MTliMTc0ZjBjOGVhODI3NTMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtbm9zbmFwcHktdG8taGFwYWxwaGFvbmx5LW1vdiBiL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtbm9zbmFwcHktdG8taGFwYWxwaGFvbmx5LW1vdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWVjZGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtZXh0cmFjdC1ub3NuYXBweS10by1oYXBhbHBoYW9ubHktbW92CkBAIC0wLDAgKzEsNzMgQEAKK1tQQUNLRVRdCitjb2RlY190eXBlPXZpZGVvCitzdHJlYW1faW5kZXg9MAorcHRzPTAKK3B0c190aW1lPTAuMDAwMDAwCitkdHM9MAorZHRzX3RpbWU9MC4wMDAwMDAKK2R1cmF0aW9uPTUxMgorZHVyYXRpb25fdGltZT0wLjA0MDAwMAorY29udmVyZ2VuY2VfZHVyYXRpb249Ti9BCitjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQQorc2l6ZT00NjEyCitwb3M9MzYKK2ZsYWdzPUtfCitkYXRhX2hhc2g9YWRsZXIzMjplZDgzYzE2NgorWy9QQUNLRVRdCitbU1RSRUFNXQoraW5kZXg9MAorY29kZWNfbmFtZT1oYXAKK2NvZGVjX2xvbmdfbmFtZT1WaWR2b3ggSGFwCitwcm9maWxlPXVua25vd24KK2NvZGVjX3R5cGU9dmlkZW8KK2NvZGVjX3RpbWVfYmFzZT0xLzI1Citjb2RlY190YWdfc3RyaW5nPUhhcEEKK2NvZGVjX3RhZz0weDQxNzA2MTQ4Cit3aWR0aD0xMjcKK2hlaWdodD03MQorY29kZWRfd2lkdGg9MTI4Citjb2RlZF9oZWlnaHQ9NzIKK2hhc19iX2ZyYW1lcz0wCitzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MQorZGlzcGxheV9hc3BlY3RfcmF0aW89MTI3OjcxCitwaXhfZm10PWdyYXkKK2xldmVsPS05OQorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9dW5rbm93bgorY29sb3JfdHJhbnNmZXI9dW5rbm93bgorY29sb3JfcHJpbWFyaWVzPXVua25vd24KK2Nocm9tYV9sb2NhdGlvbj11bnNwZWNpZmllZAorZmllbGRfb3JkZXI9dW5rbm93bgordGltZWNvZGU9Ti9BCityZWZzPTEKK2lkPU4vQQorcl9mcmFtZV9yYXRlPTI1LzEKK2F2Z19mcmFtZV9yYXRlPTI1LzEKK3RpbWVfYmFzZT0xLzEyODAwCitzdGFydF9wdHM9MAorc3RhcnRfdGltZT0wLjAwMDAwMAorZHVyYXRpb25fdHM9NTEyCitkdXJhdGlvbj0wLjA0MDAwMAorYml0X3JhdGU9OTIyNDAwCittYXhfYml0X3JhdGU9Ti9BCitiaXRzX3Blcl9yYXdfc2FtcGxlPU4vQQorbmJfZnJhbWVzPTEKK25iX3JlYWRfZnJhbWVzPU4vQQorbmJfcmVhZF9wYWNrZXRzPTEKK2V4dHJhZGF0YV9oYXNoPWFkbGVyMzI6MDAwMDAwMDEKK0RJU1BPU0lUSU9OOmRlZmF1bHQ9MQorRElTUE9TSVRJT046ZHViPTAKK0RJU1BPU0lUSU9OOm9yaWdpbmFsPTAKK0RJU1BPU0lUSU9OOmNvbW1lbnQ9MAorRElTUE9TSVRJT046bHlyaWNzPTAKK0RJU1BPU0lUSU9OOmthcmFva2U9MAorRElTUE9TSVRJT046Zm9yY2VkPTAKK0RJU1BPU0lUSU9OOmhlYXJpbmdfaW1wYWlyZWQ9MAorRElTUE9TSVRJT046dmlzdWFsX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOmNsZWFuX2VmZmVjdHM9MAorRElTUE9TSVRJT046YXR0YWNoZWRfcGljPTAKK0RJU1BPU0lUSU9OOnRpbWVkX3RodW1ibmFpbHM9MAorVEFHOmxhbmd1YWdlPWVuZworVEFHOmhhbmRsZXJfbmFtZT1EYXRhSGFuZGxlcgorVEFHOmVuY29kZXI9SEFQQWxwaGEgT25seQorWy9TVFJFQU1dCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oYXBxYS1leHRyYWN0LW5vc25hcHB5LXRvLWhhcHEtbW92IGIvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtZXh0cmFjdC1ub3NuYXBweS10by1oYXBxLW1vdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2EwYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtZXh0cmFjdC1ub3NuYXBweS10by1oYXBxLW1vdgpAQCAtMCwwICsxLDczIEBACitbUEFDS0VUXQorY29kZWNfdHlwZT12aWRlbworc3RyZWFtX2luZGV4PTAKK3B0cz0wCitwdHNfdGltZT0wLjAwMDAwMAorZHRzPTAKK2R0c190aW1lPTAuMDAwMDAwCitkdXJhdGlvbj01MTIKK2R1cmF0aW9uX3RpbWU9MC4wNDAwMDAKK2NvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQQorY29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0EKK3NpemU9OTIyMAorcG9zPTM2CitmbGFncz1LXworZGF0YV9oYXNoPWFkbGVyMzI6YjNjY2MxNDcKK1svUEFDS0VUXQorW1NUUkVBTV0KK2luZGV4PTAKK2NvZGVjX25hbWU9aGFwCitjb2RlY19sb25nX25hbWU9Vmlkdm94IEhhcAorcHJvZmlsZT11bmtub3duCitjb2RlY190eXBlPXZpZGVvCitjb2RlY190aW1lX2Jhc2U9MS8yNQorY29kZWNfdGFnX3N0cmluZz1IYXBZCitjb2RlY190YWc9MHg1OTcwNjE0OAord2lkdGg9MTI3CitoZWlnaHQ9NzEKK2NvZGVkX3dpZHRoPTEyOAorY29kZWRfaGVpZ2h0PTcyCitoYXNfYl9mcmFtZXM9MAorc2FtcGxlX2FzcGVjdF9yYXRpbz0xOjEKK2Rpc3BsYXlfYXNwZWN0X3JhdGlvPTEyNzo3MQorcGl4X2ZtdD1yZ2IwCitsZXZlbD0tOTkKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK2ZpZWxkX29yZGVyPXVua25vd24KK3RpbWVjb2RlPU4vQQorcmVmcz0xCitpZD1OL0EKK3JfZnJhbWVfcmF0ZT0yNS8xCithdmdfZnJhbWVfcmF0ZT0yNS8xCit0aW1lX2Jhc2U9MS8xMjgwMAorc3RhcnRfcHRzPTAKK3N0YXJ0X3RpbWU9MC4wMDAwMDAKK2R1cmF0aW9uX3RzPTUxMgorZHVyYXRpb249MC4wNDAwMDAKK2JpdF9yYXRlPTE4NDQwMDAKK21heF9iaXRfcmF0ZT1OL0EKK2JpdHNfcGVyX3Jhd19zYW1wbGU9Ti9BCituYl9mcmFtZXM9MQorbmJfcmVhZF9mcmFtZXM9Ti9BCituYl9yZWFkX3BhY2tldHM9MQorZXh0cmFkYXRhX2hhc2g9YWRsZXIzMjowMDAwMDAwMQorRElTUE9TSVRJT046ZGVmYXVsdD0xCitESVNQT1NJVElPTjpkdWI9MAorRElTUE9TSVRJT046b3JpZ2luYWw9MAorRElTUE9TSVRJT046Y29tbWVudD0wCitESVNQT1NJVElPTjpseXJpY3M9MAorRElTUE9TSVRJT046a2FyYW9rZT0wCitESVNQT1NJVElPTjpmb3JjZWQ9MAorRElTUE9TSVRJT046aGVhcmluZ19pbXBhaXJlZD0wCitESVNQT1NJVElPTjp2aXN1YWxfaW1wYWlyZWQ9MAorRElTUE9TSVRJT046Y2xlYW5fZWZmZWN0cz0wCitESVNQT1NJVElPTjphdHRhY2hlZF9waWM9MAorRElTUE9TSVRJT046dGltZWRfdGh1bWJuYWlscz0wCitUQUc6bGFuZ3VhZ2U9ZW5nCitUQUc6aGFuZGxlcl9uYW1lPURhdGFIYW5kbGVyCitUQUc6ZW5jb2Rlcj1IQVBRCitbL1NUUkVBTV0KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtc25hcHB5MS10by1oYXBhbHBoYW9ubHkgYi90ZXN0cy9yZWYvZmF0ZS9oYXBxYS1leHRyYWN0LXNuYXBweTEtdG8taGFwYWxwaGFvbmx5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYjEyM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oYXBxYS1leHRyYWN0LXNuYXBweTEtdG8taGFwYWxwaGFvbmx5CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogaGFwCisjZGltZW5zaW9ucyAwOiAxMjd4NzEKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDMwNDQsIDB4Y2FmNmRkZDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtc25hcHB5MS10by1oYXBxIGIvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtZXh0cmFjdC1zbmFwcHkxLXRvLWhhcHEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1OGIxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtc25hcHB5MS10by1oYXBxCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogaGFwCisjZGltZW5zaW9ucyAwOiAxMjd4NzEKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDgyMTcsIDB4MDQyNzFmMGYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtc25hcHB5MTYtdG8taGFwYWxwaGFvbmx5IGIvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtZXh0cmFjdC1zbmFwcHkxNi10by1oYXBhbHBoYW9ubHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJkOTIwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtc25hcHB5MTYtdG8taGFwYWxwaGFvbmx5CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogaGFwCisjZGltZW5zaW9ucyAwOiAxMjd4NzEKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDM1MTMsIDB4NjljNzAxNGYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtc25hcHB5MTYtdG8taGFwcSBiL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLWV4dHJhY3Qtc25hcHB5MTYtdG8taGFwcQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM0ZDUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtZXh0cmFjdC1zbmFwcHkxNi10by1oYXBxCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogaGFwCisjZGltZW5zaW9ucyAwOiAxMjd4NzEKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDg3MjYsIDB4Zjg4OTY5MWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLW5vc25hcHB5LTEyN3g3MSBiL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLW5vc25hcHB5LTEyN3g3MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA2OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtbm9zbmFwcHktMTI3eDcxCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyN3g3MQorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzNjA2OCwgMHgxNmMwYTAxMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtc25hcHB5MS0xMjd4NzEgYi90ZXN0cy9yZWYvZmF0ZS9oYXBxYS1zbmFwcHkxLTEyN3g3MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA2OWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFwcWEtc25hcHB5MS0xMjd4NzEKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI3eDcxCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM2MDY4LCAweDE2YzBhMDExCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oYXBxYS1zbmFwcHkxNi0xMjd4NzEgYi90ZXN0cy9yZWYvZmF0ZS9oYXBxYS1zbmFwcHkxNi0xMjd4NzEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwNjliNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hhcHFhLXNuYXBweTE2LTEyN3g3MQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjd4NzEKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzYwNjgsIDB4MTZjMGEwMTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hhcHkgYi90ZXN0cy9yZWYvZmF0ZS9oYXB5CmluZGV4IGU3ZDc2MDguLjYxZmViMmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hhcHkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFweQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiA2Mi8yOTk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMjI4ODAwLCAweDU5OTM1MjJkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oYXNoIGIvdGVzdHMvcmVmL2ZhdGUvaGFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTVhNTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGFzaApAQCAtMCwwICsxLDQ1IEBACitNRDUgaGV4OiAzYjVkM2M3ZDIwN2UzN2RjZWVlZGQzMDFlMzVlMmU1OAorTUQ1IGJpbjogMHgzYiAweDVkIDB4M2MgMHg3ZCAweDIwIDB4N2UgMHgzNyAweGRjIDB4ZWUgMHhlZCAweGQzIDB4MSAweGUzIDB4NWUgMHgyZSAweDU4CitNRDUgYjY0OiBPMTA4ZlNCK045enU3ZE1CNDE0dVdBPT0KK211cm11cjMgaGV4OiA2ZTQ4NDY5NWUxZDdiNGUzN2Q4Mzg3OTFjYzI2MzM5NQorbXVybXVyMyBiaW46IDB4NmUgMHg0OCAweDQ2IDB4OTUgMHhlMSAweGQ3IDB4YjQgMHhlMyAweDdkIDB4ODMgMHg4NyAweDkxIDB4Y2MgMHgyNiAweDMzIDB4OTUKK211cm11cjMgYjY0OiBia2hHbGVIWHRPTjlnNGVSekNZemxRPT0KK1JJUEVNRDEyOCBoZXg6IDA4MmJmYTliODI5ZWYzYTllMjIwZGNjNTRlNGM2MzgzCitSSVBFTUQxMjggYmluOiAweDggMHgyYiAweGZhIDB4OWIgMHg4MiAweDllIDB4ZjMgMHhhOSAweGUyIDB4MjAgMHhkYyAweGM1IDB4NGUgMHg0YyAweDYzIDB4ODMKK1JJUEVNRDEyOCBiNjQ6IENDdjZtNEtlODZuaUlOekZUa3hqZ3c9PQorUklQRU1EMTYwIGhleDogOWI4Y2NjMmYzNzRhZTMxM2E5MTQ3NjNjYzljZGZiNDdiZmUxYzIyOQorUklQRU1EMTYwIGJpbjogMHg5YiAweDhjIDB4Y2MgMHgyZiAweDM3IDB4NGEgMHhlMyAweDEzIDB4YTkgMHgxNCAweDc2IDB4M2MgMHhjOSAweGNkIDB4ZmIgMHg0NyAweGJmIDB4ZTEgMHhjMiAweDI5CitSSVBFTUQxNjAgYjY0OiBtNHpNTHpkSzR4T3BGSFk4eWMzN1I3L2h3aWs9CitSSVBFTUQyNTYgaGV4OiAyNmJhNjkzNzU5Nzg3ZjI3NWY0N2RkNWFiMTZlNzhjMmZjZDc2M2IwMDRmZDA1ZmM1NTRlMzU0MjIzZDZlYWI1CitSSVBFTUQyNTYgYmluOiAweDI2IDB4YmEgMHg2OSAweDM3IDB4NTkgMHg3OCAweDdmIDB4MjcgMHg1ZiAweDQ3IDB4ZGQgMHg1YSAweGIxIDB4NmUgMHg3OCAweGMyIDB4ZmMgMHhkNyAweDYzIDB4YjAgMHg0IDB4ZmQgMHg1IDB4ZmMgMHg1NSAweDRlIDB4MzUgMHg0MiAweDIzIDB4ZDYgMHhlYSAweGI1CitSSVBFTUQyNTYgYjY0OiBKcnBwTjFsNGZ5ZGZSOTFhc1c1NHd2elhZN0FFL1FYOFZVNDFRaVBXNnJVPQorUklQRU1EMzIwIGhleDogNDA5YTMxMTFmZmQzZDRjODA1OGZmNWMyMzE0MDFjMWQ0NzIxMGE1ZDIyZTZjOTBiZjk1ZDQ1YzFjOTVjNTI4NDYzYzY5Y2U0YmZmM2I4ODQKK1JJUEVNRDMyMCBiaW46IDB4NDAgMHg5YSAweDMxIDB4MTEgMHhmZiAweGQzIDB4ZDQgMHhjOCAweDUgMHg4ZiAweGY1IDB4YzIgMHgzMSAweDQwIDB4MWMgMHgxZCAweDQ3IDB4MjEgMHhhIDB4NWQgMHgyMiAweGU2IDB4YzkgMHhiIDB4ZjkgMHg1ZCAweDQ1IDB4YzEgMHhjOSAweDVjIDB4NTIgMHg4NCAweDYzIDB4YzYgMHg5YyAweGU0IDB4YmYgMHhmMyAweGI4IDB4ODQKK1JJUEVNRDMyMCBiNjQ6IFFKb3hFZi9UMU1nRmovWENNVUFjSFVjaENsMGk1c2tMK1YxRndjbGNVb1JqeHB6a3YvTzRoQT09CitTSEExNjAgaGV4OiBjOGQ3ZDBlZjBlZWRmYTgyZDJlYTFhYTU5Mjg0NWI5YTZkNGIwMmI3CitTSEExNjAgYmluOiAweGM4IDB4ZDcgMHhkMCAweGVmIDB4ZSAweGVkIDB4ZmEgMHg4MiAweGQyIDB4ZWEgMHgxYSAweGE1IDB4OTIgMHg4NCAweDViIDB4OWEgMHg2ZCAweDRiIDB4MiAweGI3CitTSEExNjAgYjY0OiB5TmZRN3c3dCtvTFM2aHFsa29SYm1tMUxBcmM9CitTSEEyMjQgaGV4OiA3NTBkODFhMzljMThkM2NlMjdmZjNlNWVjZTMwYjAwODhmMTJkOGZkMDQ1MGZlNDM1MzI2Mjk0YgorU0hBMjI0IGJpbjogMHg3NSAweGQgMHg4MSAweGEzIDB4OWMgMHgxOCAweGQzIDB4Y2UgMHgyNyAweGZmIDB4M2UgMHg1ZSAweGNlIDB4MzAgMHhiMCAweDggMHg4ZiAweDEyIDB4ZDggMHhmZCAweDQgMHg1MCAweGZlIDB4NDMgMHg1MyAweDI2IDB4MjkgMHg0YgorU0hBMjI0IGI2NDogZFEyQm81d1kwODRuL3o1ZXpqQ3dDSThTMlAwRVVQNURVeVlwU3c9PQorU0hBMjU2IGhleDogZjVhNWZkNDJkMTZhMjAzMDI3OThlZjZlZDMwOTk3OWI0MzAwM2QyMzIwZDlmMGU4ZWE5ODMxYTkyNzU5ZmI0YgorU0hBMjU2IGJpbjogMHhmNSAweGE1IDB4ZmQgMHg0MiAweGQxIDB4NmEgMHgyMCAweDMwIDB4MjcgMHg5OCAweGVmIDB4NmUgMHhkMyAweDkgMHg5NyAweDliIDB4NDMgMCAweDNkIDB4MjMgMHgyMCAweGQ5IDB4ZjAgMHhlOCAweGVhIDB4OTggMHgzMSAweGE5IDB4MjcgMHg1OSAweGZiIDB4NGIKK1NIQTI1NiBiNjQ6IDlhWDlRdEZxSURBbm1POXUwd21YbTBNQVBTTWcyZkRvNnBneHFTZForMHM9CitTSEE1MTIvMjI0IGhleDogMTMxOWQ5YjMyMjQ1MjA2OGU2ZjQzYzBlZDNkYTExNWZiZWNjYzE2OTcxMWRiYmFlZTI4NDZmOTAKK1NIQTUxMi8yMjQgYmluOiAweDEzIDB4MTkgMHhkOSAweGIzIDB4MjIgMHg0NSAweDIwIDB4NjggMHhlNiAweGY0IDB4M2MgMHhlIDB4ZDMgMHhkYSAweDExIDB4NWYgMHhiZSAweGNjIDB4YzEgMHg2OSAweDcxIDB4MWQgMHhiYiAweGFlIDB4ZTIgMHg4NCAweDZmIDB4OTAKK1NIQTUxMi8yMjQgYjY0OiBFeG5ac3lKRklHam05RHdPMDlvUlg3N013V2x4SGJ1dTRvUnZrQT09CitTSEE1MTIvMjU2IGhleDogOGFlZWNmYTBiOWYyYWM3ODE4ODYzYjEzNjIyNDFlNGYzMmQwNmIxMDBhZTlkMWMwZmJjYzRlZDYxYjkxYjE3YQorU0hBNTEyLzI1NiBiaW46IDB4OGEgMHhlZSAweGNmIDB4YTAgMHhiOSAweGYyIDB4YWMgMHg3OCAweDE4IDB4ODYgMHgzYiAweDEzIDB4NjIgMHgyNCAweDFlIDB4NGYgMHgzMiAweGQwIDB4NmIgMHgxMCAweGEgMHhlOSAweGQxIDB4YzAgMHhmYiAweGNjIDB4NGUgMHhkNiAweDFiIDB4OTEgMHhiMSAweDdhCitTSEE1MTIvMjU2IGI2NDogaXU3UG9MbnlySGdZaGpzVFlpUWVUekxRYXhBSzZkSEErOHhPMWh1UnNYbz0KK1NIQTM4NCBoZXg6IGM1MTZhYThkM2I0NTdjNjM2YzY4MjY5MzcwOTljMGQyM2ExM2YyYzM3MDFhMzg4YjNjOGZlNGJjMjA3MzI4MWIwYzQ0NjI2MTAzNjk4ODRjNGFiYWJhOGU5N2I2ZGViZQorU0hBMzg0IGJpbjogMHhjNSAweDE2IDB4YWEgMHg4ZCAweDNiIDB4NDUgMHg3YyAweDYzIDB4NmMgMHg2OCAweDI2IDB4OTMgMHg3MCAweDk5IDB4YzAgMHhkMiAweDNhIDB4MTMgMHhmMiAweGMzIDB4NzAgMHgxYSAweDM4IDB4OGIgMHgzYyAweDhmIDB4ZTQgMHhiYyAweDIwIDB4NzMgMHgyOCAweDFiIDB4YyAweDQ0IDB4NjIgMHg2MSAweDMgMHg2OSAweDg4IDB4NGMgMHg0YSAweGJhIDB4YmEgMHg4ZSAweDk3IDB4YjYgMHhkZSAweGJlCitTSEEzODQgYjY0OiB4UmFxalR0RmZHTnNhQ2FUY0puQTBqb1Q4c053R2ppTFBJL2t2Q0J6S0JzTVJHSmhBMm1JVEVxNnVvNlh0dDYrCitTSEE1MTIgaGV4OiA3YmU5ZmRhNDhmNDE3OWU2MTFjNjk4YTczY2ZmMDlmYWY3Mjg2OTQzMWVmZWU2ZWFhZDE0ZGUwY2I0NGJiZjY2NTAzZjc1MmI3YThlYjE3MDgzMzU1ZjNjZTZlYjdkMjgwNmYyMzZiMjVhZjk2YTI0ZTIyYjg4NzQwNWMyMDA4MQorU0hBNTEyIGJpbjogMHg3YiAweGU5IDB4ZmQgMHhhNCAweDhmIDB4NDEgMHg3OSAweGU2IDB4MTEgMHhjNiAweDk4IDB4YTcgMHgzYyAweGZmIDB4OSAweGZhIDB4ZjcgMHgyOCAweDY5IDB4NDMgMHgxZSAweGZlIDB4ZTYgMHhlYSAweGFkIDB4MTQgMHhkZSAweGMgMHhiNCAweDRiIDB4YmYgMHg2NiAweDUwIDB4M2YgMHg3NSAweDJiIDB4N2EgMHg4ZSAweGIxIDB4NzAgMHg4MyAweDM1IDB4NWYgMHgzYyAweGU2IDB4ZWIgMHg3ZCAweDI4IDB4NiAweGYyIDB4MzYgMHhiMiAweDVhIDB4ZjkgMHg2YSAweDI0IDB4ZTIgMHgyYiAweDg4IDB4NzQgMHg1IDB4YzIgMCAweDgxCitTSEE1MTIgYjY0OiBlK245cEk5QmVlWVJ4cGluUFA4Sit2Y29hVU1lL3VicXJSVGVETFJMdjJaUVAzVXJlbzZ4Y0lNMVh6em02MzBvQnZJMnNscjVhaVRpSzRoMEJjSUFnUT09CitDUkMzMiBoZXg6IDc1OGQ2MzM2CitDUkMzMiBiaW46IDB4NzUgMHg4ZCAweDYzIDB4MzYKK0NSQzMyIGI2NDogZFkxak5nPT0KK2FkbGVyMzIgaGV4OiAwMDQwMDAwMQorYWRsZXIzMiBiaW46IDAgMHg0MCAwIDB4MQorYWRsZXIzMiBiNjQ6IEFFQUFBUT09CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFESlVTVF9JUFJFRF9BTkdMRV9BX1JFeHRfTWl0c3ViaXNoaV8xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BREpVU1RfSVBSRURfQU5HTEVfQV9SRXh0X01pdHN1YmlzaGlfMQppbmRleCBmNzM1NjlmLi45NTNmY2Y4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFESlVTVF9JUFJFRF9BTkdMRV9BX1JFeHRfTWl0c3ViaXNoaV8xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQURKVVNUX0lQUkVEX0FOR0xFX0FfUkV4dF9NaXRzdWJpc2hpXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA4Mjk0NDAwLCAweGEwNjFjNzhjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4NjAyNTBjNzYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgODI5NDQwMCwgMHg0OGUzZmJkYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfQV9TYW1zdW5nXzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9BX1NhbXN1bmdfNAppbmRleCA4NDQ4N2E1Li5lNTkzOGUyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9BX1NhbXN1bmdfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9BX1NhbXN1bmdfNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTYweDE2MDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDYxNDQwMDAsIDB4ZjdkYTlhMDAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgNjE0NDAwMCwgMHhmNWNmYzc2ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA2MTQ0MDAwLCAweDIwNjYzZTgyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9BX1NhbXN1bmdfNiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0FfU2Ftc3VuZ182CmluZGV4IDc2OTMwNTAuLmM1ZjU5YmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0FfU2Ftc3VuZ182CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0FfU2Ftc3VuZ182CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI1NjB4MTYwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgNjE0NDAwMCwgMHg2ZjlkZDM4MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICA2MTQ0MDAwLCAweDNhZDc2NWY4CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDYxNDQwMDAsIDB4ZTMwMTI5MmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0JfU2Ftc3VuZ180IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfQl9TYW1zdW5nXzQKaW5kZXggMDM0ZjdiOC4uMTBkYjZjMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfQl9TYW1zdW5nXzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfQl9TYW1zdW5nXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2MHgxNjAwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA2MTQ0MDAwLCAweGNkMzJlZjMzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDYxNDQwMDAsIDB4NThjZTY4MWQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgNjE0NDAwMCwgMHg3N2E3MzJiNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfQl9TYW1zdW5nXzYgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9CX1NhbXN1bmdfNgppbmRleCBmZDk5YzgyLi41MThkOTM3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9CX1NhbXN1bmdfNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9CX1NhbXN1bmdfNgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTYweDE2MDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDYxNDQwMDAsIDB4NDIxN2U0MGUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgNjE0NDAwMCwgMHhhZmEzYTY3NgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA2MTQ0MDAwLCAweGI4Mjg1NTIyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9EX0hpc2lsaWNvbiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0RfSGlzaWxpY29uCmluZGV4IDZlMTdiODMuLjhkNGUwNzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0RfSGlzaWxpY29uCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0RfSGlzaWxpY29uCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHgxNTU5YzI5MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzMTEwNDAwLCAweGQwODAyNzA2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4YjQ4Y2YyMjkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0VfSGlzaWxpY29uIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfRV9IaXNpbGljb24KaW5kZXggYzFiN2YyZS4uMDc1ZDAyNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfRV9IaXNpbGljb24KKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfRV9IaXNpbGljb24KQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTEwNDAwLCAweGY5MzQyMTg4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NDY2MzhkYzQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMzExMDQwMCwgMHg5NmRhNDM2ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfRl9IaXNpbGljb25fMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1QX0ZfSGlzaWxpY29uXzMKaW5kZXggNzFjZTljNy4uNGE4ODQ5ZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVBfRl9IaXNpbGljb25fMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNUF9GX0hpc2lsaWNvbl8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHhhNWQyYjhiMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzMTEwNDAwLCAweDEzMDM1Y2ZhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4OTZiMTZmODYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1WUF9BX01US180IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVZQX0FfTVRLXzQKaW5kZXggNTkxMTVmYi4uZjQ0YzE3NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVZQX0FfTVRLXzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVZQX0FfTVRLXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ODYxOWY4MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDU1MGJkYWYwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4Yjc2OWZhNGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1WUF9CX01US180IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVZQX0JfTVRLXzQKaW5kZXggMWY5OThjNC4uM2ZkMjFlMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVZQX0JfTVRLXzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVZQX0JfTVRLXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHhjZmZmYTAxMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDUxNjYxNDZhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YzNjYzMxOGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1WUF9DX1NhbXN1bmdfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1WUF9DX1NhbXN1bmdfNAppbmRleCAxNmQzNDQ2Li42NDliZTQ2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNVlBfQ19TYW1zdW5nXzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVZQX0NfU2Ftc3VuZ180CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4ODA4NzY2MmEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHg1Mjc4ZDhkYgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweDczYzc0MDkwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNVlBfQ19TYW1zdW5nXzYgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUFNVlBfQ19TYW1zdW5nXzYKaW5kZXggNWVkNzFlMi4uMzZkNTU3NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1BTVZQX0NfU2Ftc3VuZ182CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQU1WUF9DX1NhbXN1bmdfNgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweGQ3MGY1MmI0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4YWYzZDEzMTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU5OTA0MCwgMHhjMWIwNWVlZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1CVU1QSU5HX0FfZXJpY3Nzb25fMSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQlVNUElOR19BX2VyaWNzc29uXzEKaW5kZXggMjYzODcyOS4uZmU4OTAwNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1CVU1QSU5HX0FfZXJpY3Nzb25fMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUJVTVBJTkdfQV9lcmljc3Nvbl8xCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4OGNlNzIwMGIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg3MzYxMDY2OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweGMwMTYyMGY0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9BX1NIQVJQXzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9BX1NIQVJQXzQKaW5kZXggNTNiNjIxYi4uMmFkOThhZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfQV9TSEFSUF80CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0FfU0hBUlBfNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweDAwMWYwYzQ4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4ODMxMjBkODcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU5OTA0MCwgMHgxMGMyNjdhYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfQl9TSEFSUF80IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfQl9TSEFSUF80CmluZGV4IDlhZWIzYjEuLjJhYzk3ODIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0JfU0hBUlBfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9CX1NIQVJQXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHgwMDFmMGM0OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweGY4MTYwZDgyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NWYyMDYwZTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0NfU0hBUlBfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0NfU0hBUlBfMwppbmRleCBjODkxYzQ0Li4xMWM5OGNiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9DX1NIQVJQXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfQ19TSEFSUF8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MmI1OGRlZTIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHgyYjU4ZGVlMgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweGNkOTI5NWY0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9EX1NIQVJQXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9EX1NIQVJQXzMKaW5kZXggMDI5NGE3ZS4uYWQzMDNmYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfRF9TSEFSUF8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0RfU0hBUlBfMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweDJiNThkZWUyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MmI1OGRlZTIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU5OTA0MCwgMHhiMDU1YjYzOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfRV9TSEFSUF8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfRV9TSEFSUF8zCmluZGV4IDQzMDQyNmIuLjZkZmQyMjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0VfU0hBUlBfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9FX1NIQVJQXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHgxY2YyMWQ3OQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDFjZjIxZDc5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4YjU0ZWU5ZTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0ZfU0hBUlBfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0ZfU0hBUlBfMwppbmRleCBhZWJhNTNiLi5jYmU0OThiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9GX1NIQVJQXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfRl9TSEFSUF8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MWNmMjFkNzkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHgxY2YyMWQ3OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweGMxODJlYWE4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9HX1NIQVJQXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9HX1NIQVJQXzMKaW5kZXggZTA1MDFiZS4uZTdjYzRiYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfR19TSEFSUF8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0dfU0hBUlBfMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweGQ5YjczY2JlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4ZDliNzNjYmUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU5OTA0MCwgMHhlNGU1ZGQ3YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfSF9TSEFSUF8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DQUlOSVRfSF9TSEFSUF8zCmluZGV4IDAxYWIyNTguLmFhZGMyNGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0FJTklUX0hfU0hBUlBfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNBSU5JVF9IX1NIQVJQXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHhkOWI3M2NiZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweGQ5YjczY2JlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4OTNhM2ZhYmYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0lQX0FfUGFuYXNvbmljXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNJUF9BX1BhbmFzb25pY18zCmluZGV4IGFmYTQ4NTQuLjNhZGVmMmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0lQX0FfUGFuYXNvbmljXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DSVBfQV9QYW5hc29uaWNfMwpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDZlMWYxNmQwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NWJlNWJkZTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0lQX0NfUGFuYXNvbmljXzIgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNJUF9DX1BhbmFzb25pY18yCmluZGV4IDMzNDZlMjAuLjhlNmM2ODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ0lQX0NfUGFuYXNvbmljXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DSVBfQ19QYW5hc29uaWNfMgpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweGNkMTAxOWIyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZWIzOWVmZWIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ09ORldJTl9BX1NvbnlfMSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtQ09ORldJTl9BX1NvbnlfMQppbmRleCAzY2Q3YTI2Li4xZDRhZjNkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUNPTkZXSU5fQV9Tb255XzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1DT05GV0lOX0FfU29ueV8xCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxMngyMzYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDU4NDgsIDB4YWQ0ZjA3ZDAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0NTg0OCwgMHg1ODI1MTIwYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ1ODQ4LCAweDNlZWIwZGEyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfQV9NQUlOMTBfVklYU18zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0FfTUFJTjEwX1ZJWFNfMwppbmRleCA1MGJlNGYxLi5mMzNiMTYyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfQV9NQUlOMTBfVklYU18zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19BX01BSU4xMF9WSVhTXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA3NjAzMiwgMHg0MzEzOTM1YgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDc2MDMyLCAweDRjODA3MWI1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNzYwMzIsIDB4NWU2MjdlZGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19BX1NPTllfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19BX1NPTllfMwppbmRleCA1ODljYmYzLi40NTcxMTE5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfQV9TT05ZXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0FfU09OWV8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MTU0ZTZkZDkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHhjY2UyNTY5MwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweDNkZDg0ZTg4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfQl9TT05ZXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfQl9TT05ZXzMKaW5kZXggMDc3YjM4ZS4uZWViYjVhMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0JfU09OWV8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19CX1NPTllfMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweGRhMGNiNWQ0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MzUyYmMzOTcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU5OTA0MCwgMHg3MmJjMjhmZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0NfU09OWV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0NfU09OWV8zCmluZGV4IDgyMzk4OGQuLmM0NTJjMTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19DX1NPTllfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfQ19TT05ZXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHg1NzM2OWJmNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDMxOWFhYjljCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4YmMxYjc2OTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19EX1ZJWFNfMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19EX1ZJWFNfMgppbmRleCAyYmRjNTQ4Li40YTE1Yjk1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfRF9WSVhTXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0RfVklYU18yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyODB4NzIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMzgyNDAwLCAweDZlZjVjNzZlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDEzODI0MDAsIDB4MWUxOTI2YjEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMTM4MjQwMCwgMHg2OTg4ODc4NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0VfVklYU18yIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0VfVklYU18yCmluZGV4IDRjOGIwN2QuLjhiZGU3YTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19FX1ZJWFNfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfRV9WSVhTXzIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDEzODI0MDAsIDB4ZWNmZGY2MDYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMTM4MjQwMCwgMHgwYjAzODJlMQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAxMzgyNDAwLCAweGJlZjNhZmQ2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfRl9WSVhTXzIgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfRl9WSVhTXzIKaW5kZXggM2ZmNjJlNS4uODc5NGRiYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0ZfVklYU18yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19GX1ZJWFNfMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjgweDcyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTM4MjQwMCwgMHhlYTI3ZjdiZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxMzgyNDAwLCAweDQyM2U1NTViCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDEzODI0MDAsIDB4ODc4OThhZTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19HX1ZJWFNfMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREJMS19HX1ZJWFNfMgppbmRleCA0YzhiMDdkLi44YmRlN2E3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURCTEtfR19WSVhTXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EQkxLX0dfVklYU18yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyODB4NzIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMzgyNDAwLCAweGVjZmRmNjA2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDEzODI0MDAsIDB4MGIwMzgyZTEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMTM4MjQwMCwgMHhiZWYzYWZkNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1ERUxUQVFQX0FfQlJDTV80IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1ERUxUQVFQX0FfQlJDTV80CmluZGV4IGQyYWIwZjUuLjJhYmQ1OGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREVMVEFRUF9BX0JSQ01fNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURFTFRBUVBfQV9CUkNNXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDg4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTMzNDQwLCAweGZiZDEwMzMxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMzM0NDAsIDB4Nzc2NGFkNzAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMzEzMzQ0MCwgMHhhZWFmNDRjMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1ERUxUQVFQX0JfU09OWV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1ERUxUQVFQX0JfU09OWV8zCmluZGV4IDNiYTNiYjUuLmI4OGM5ZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREVMVEFRUF9CX1NPTllfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURFTFRBUVBfQl9TT05ZXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHg3ZWE5NTk3YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDNlNzM2NWU0CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NGE5MTQ5YzkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREVMVEFRUF9DX1NPTllfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtREVMVEFRUF9DX1NPTllfMwppbmRleCBkNjE2YmFjLi41NmQ0ZjA1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURFTFRBUVBfQ19TT05ZXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1ERUxUQVFQX0NfU09OWV8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4Y2IyOTY5YzUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHhkOTgyNWQxZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweDVmZjQyNDVhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURTTElDRV9BX0hISV81IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EU0xJQ0VfQV9ISElfNQppbmRleCA2Y2QxMTNiLi45OTlhNzZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURTTElDRV9BX0hISV81CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRFNMSUNFX0FfSEhJXzUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTEwNDAwLCAweGRjMThjZDEyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NDJmNzAyMGQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMzExMDQwMCwgMHg2YWM0NDIxYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EU0xJQ0VfQl9ISElfNSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRFNMSUNFX0JfSEhJXzUKaW5kZXggNzYyNmQ3Ni4uODRhMGM3OSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EU0xJQ0VfQl9ISElfNQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURTTElDRV9CX0hISV81CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHg5Njk5NWM1NwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzMTEwNDAwLCAweDI5MjRhMTBmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4ODkyZTE0NmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRFNMSUNFX0NfSEhJXzUgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLURTTElDRV9DX0hISV81CmluZGV4IGM0Mjc1Y2IuLjRiMGQxMDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRFNMSUNFX0NfSEhJXzUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1EU0xJQ0VfQ19ISElfNQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NjJhMmNlYWIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMzExMDQwMCwgMHg1ZTRkNmFkYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAzMTEwNDAwLCAweDRhZDA5NTVkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUVOVFBfQV9RdWFsY29tbV8xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1FTlRQX0FfUXVhbGNvbW1fMQppbmRleCA0NDU0YmZhLi4yNjg0OGM1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUVOVFBfQV9RdWFsY29tbV8xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRU5UUF9BX1F1YWxjb21tXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTEwNDAwLCAweDI2NjYzZTUwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NjRhZTM2YzEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMzExMDQwMCwgMHg1YzcyYWMwYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1FTlRQX0JfUXVhbGNvbW1fMSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRU5UUF9CX1F1YWxjb21tXzEKaW5kZXggNTQ3YjU5MC4uNzBmMGE2ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1FTlRQX0JfUXVhbGNvbW1fMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUVOVFBfQl9RdWFsY29tbV8xCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHg3ZDAxNDY5MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzMTEwNDAwLCAweGUwMmNkMTczCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4MmY5Nzk0YzUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRU5UUF9DX1F1YWxjb21tXzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUVOVFBfQ19RdWFsY29tbV8xCmluZGV4IDJjMjFmMzUuLmZkMmM0N2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRU5UUF9DX1F1YWxjb21tXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1FTlRQX0NfUXVhbGNvbW1fMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NGVhM2ZhNTcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMzExMDQwMCwgMHhiZTMzNzI0ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAzMTEwNDAwLCAweDkwMTE3NTVlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUVYVF9BX2VyaWNzc29uXzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUVYVF9BX2VyaWNzc29uXzQKaW5kZXggYmY0NjE2YS4uNGUxODZkNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1FWFRfQV9lcmljc3Nvbl80CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtRVhUX0FfZXJpY3Nzb25fNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDhjZTcyMDBiCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4Zjk3NDEyZjYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHgwZWExMzJjNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1GSUxMRVJfQV9Tb255XzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUZJTExFUl9BX1NvbnlfMQppbmRleCA4MDliNGNkLi4wOGMzMzc1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUZJTExFUl9BX1NvbnlfMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUZJTExFUl9BX1NvbnlfMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDgzMjYxZTQxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YThjMDJlOGUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHhiODlkMWZhMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1IUkRfQV9GdWppdHN1XzIgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUhSRF9BX0Z1aml0c3VfMgppbmRleCBkODg3ZGYyLi44MWYyNWE1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUhSRF9BX0Z1aml0c3VfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUhSRF9BX0Z1aml0c3VfMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzUwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDQ5YmNhYzU5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MzBmZmFkY2QKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4NWNjYzE0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1IUkRfQV9GdWppdHN1XzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUhSRF9BX0Z1aml0c3VfMwppbmRleCA3NDQ2YWU4Li41MzQ4NzRiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUhSRF9BX0Z1aml0c3VfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUhSRF9BX0Z1aml0c3VfMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzUwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweGEzMjlhZmFhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YjMyNmM0MDUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg3ODM0YjkzNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1JTklUUVBfQV9Tb255XzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlOSVRRUF9BX1NvbnlfMQppbmRleCBlOTllMzg5Li44Y2M2NTJmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlOSVRRUF9BX1NvbnlfMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlOSVRRUF9BX1NvbnlfMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDU5ODkxZTRlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NmMxNTJkZTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg2ZjJjMGYzNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1JTklUUVBfQl9Tb255XzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlOSVRRUF9CX1NvbnlfMQppbmRleCBlMDBjMjlmLi5jYTk4MjQ1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlOSVRRUF9CX1NvbnlfMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlOSVRRUF9CX1NvbnlfMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjk5NTIwLCAweDU1MTQ5NThhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyOTk1MjAsIDB4MDY3MjVlZGUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDI5OTUyMCwgMHhhNzFkMTQ5MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1JUENNX0FfUkV4dF9ORUMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlQQ01fQV9SRXh0X05FQwppbmRleCBkMDVkZTc0Li5hMGVkNTMwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlQQ01fQV9SRXh0X05FQworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlQQ01fQV9SRXh0X05FQwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzk5MzYwLCAweGJhYzI5YTUxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlQQ01fQl9SRXh0X05FQyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBDTV9CX1JFeHRfTkVDCmluZGV4IGEwMWMzYjUuLjk0YzEyNDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBDTV9CX1JFeHRfTkVDCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBDTV9CX1JFeHRfTkVDCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MWY4MDg0MDYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBSRURfQV9kb2NvbW9fMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBSRURfQV9kb2NvbW9fMgppbmRleCAzMzg3OGZkLi5hNjY2NTI0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlQUkVEX0FfZG9jb21vXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1JUFJFRF9BX2RvY29tb18yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4YWM2NThkMTAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHhlM2Y2NTM4OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweGZiZDY0NGIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlQUkVEX0JfTm9raWFfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBSRURfQl9Ob2tpYV8zCmluZGV4IDRkZTdjM2MuLmYzZThkNmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBSRURfQl9Ob2tpYV8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBSRURfQl9Ob2tpYV8zCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHgxMWVmNWRkZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1JUFJFRF9DX01pdHN1YmlzaGlfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtSVBSRURfQ19NaXRzdWJpc2hpXzMKaW5kZXggNzJhMTJlOC4uOTQyNmE3MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1JUFJFRF9DX01pdHN1YmlzaGlfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUlQUkVEX0NfTWl0c3ViaXNoaV8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NmI2MTM3MWQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHhkMzhhMmU1MAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweGU4ZWIzNGJkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUxTX0FfT3JhbmdlXzIgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUxTX0FfT3JhbmdlXzIKaW5kZXggNGRkNGFkNC4uZjQ5YWUwMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1MU19BX09yYW5nZV8yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTFNfQV9PcmFuZ2VfMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDk0YTUxNzAxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NjdjNzE4ODUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHgyMThmMTc1MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1MU19CX09SQU5HRV80IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1MU19CX09SQU5HRV80CmluZGV4IDM0ZGMzNzkuLmU4ZDgxNWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTFNfQl9PUkFOR0VfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUxTX0JfT1JBTkdFXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHgyNTI2Nzc2MQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDRiNGI2ODQ2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NzhlMjUxZTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTFRSUFNQU19BX1F1YWxjb21tXzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLUxUUlBTUFNfQV9RdWFsY29tbV8xCmluZGV4IGRkZjI1YzkuLjM0NzlkNjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTFRSUFNQU19BX1F1YWxjb21tXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1MVFJQU1BTX0FfUXVhbGNvbW1fMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweGNmZmZhMDEzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4OGFlODA2NTQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHhhNzk5MTViOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NQVhCSU5TX0FfVElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUFYQklOU19BX1RJXzQKaW5kZXggOTExMGNmNi4uNDMzZTIxNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NQVhCSU5TX0FfVElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1BWEJJTlNfQV9USV80CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4OWNhZDkwZjkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg3ZGVlYWIxYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NQVhCSU5TX0JfVElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUFYQklOU19CX1RJXzQKaW5kZXggNWNhZDk2MS4uYzE4YzEzYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NQVhCSU5TX0JfVElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1BWEJJTlNfQl9USV80CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MjExZTg0ODcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHhhNTNiMTNkOAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweGI2M2NjMTAzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1BWEJJTlNfQ19USV80IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NQVhCSU5TX0NfVElfNAppbmRleCAyZWIzODQzLi5kYjBlM2Y3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1BWEJJTlNfQ19USV80CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUFYQklOU19DX1RJXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHhhOGQ3YWRmYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDc2ZDFkZGZlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NTY1OTljYWUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUVSR0VfQV9USV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9BX1RJXzMKaW5kZXggMGFiNmFjYy4uNDQ3ZmI2YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9BX1RJXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9BX1RJXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZWRiMjdkNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDE2ZWIyNWE4CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4Y2ZmZjI5YzgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUVSR0VfQl9USV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9CX1RJXzMKaW5kZXggMmY5Mzk1Zi4uZGNhYjg5ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9CX1RJXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9CX1RJXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZWRiMjdkNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweGI1OTMyNTA1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YTViMjBlNjYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUVSR0VfQ19USV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9DX1RJXzMKaW5kZXggYmNjNWExYS4uNzAzNDgwYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9DX1RJXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9DX1RJXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZWRiMjdkNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDg4Y2IxMjE2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NmQxMDI0ZGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUVSR0VfRF9USV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9EX1RJXzMKaW5kZXggN2I0ZGYyNi4uYzc0MDk0YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9EX1RJXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9EX1RJXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZWRiMjdkNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDMyMjAxODNjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NDNhMjFhY2MKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUVSR0VfRV9USV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9FX1RJXzMKaW5kZXggODQ5MTE3Mi4uYjMwMGY4NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9FX1RJXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9FX1RJXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZWRiMjdkNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDE4NzQxOWI1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NjExMDA5ODAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUVSR0VfRl9NVEtfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUVSR0VfRl9NVEtfNAppbmRleCAzNGEwOTc5Li4wMDViYTU5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1FUkdFX0ZfTVRLXzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9GX01US180CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4Y2ZmZmEwMTMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHhlYzgwMGU3MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDlmYjAxNGM3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1FUkdFX0dfSEhJXzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1FUkdFX0dfSEhJXzQKaW5kZXggMmU4ODM1MC4uNmY2NmU0YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NRVJHRV9HX0hISV80CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTUVSR0VfR19ISElfNApAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweDY1NDMzY2ZlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4OTMwOWUyYzUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTVZDTElQX0FfcXVhbGNvbW1fMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTVZDTElQX0FfcXVhbGNvbW1fMwppbmRleCA2NzU2MjIxLi5mMWNmN2UzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1WQ0xJUF9BX3F1YWxjb21tXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NVkNMSVBfQV9xdWFsY29tbV8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YTViMTE3MjAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg0MmU1MmM2ZQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDI3YjE1YTMwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1WREwxWkVST19BX2RvY29tb18zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NVkRMMVpFUk9fQV9kb2NvbW9fMwppbmRleCAyMDE5ZGIyLi43ODljZDdjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1WREwxWkVST19BX2RvY29tb18zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTVZETDFaRVJPX0FfZG9jb21vXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHg5YjI3ZGM3ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDc5NmNkZDI2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4ZDNjOWRjYTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTVZFREdFX0FfcXVhbGNvbW1fMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTVZFREdFX0FfcXVhbGNvbW1fMwppbmRleCAwZGIwNmM1Li40YzY3NmVhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1WRURHRV9BX3F1YWxjb21tXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NVkVER0VfQV9xdWFsY29tbV8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MWQ2ODIxM2EKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg5Y2M4MWQzMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweGEzY2Y2NDM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1haW5fNDIyXzEwX0FfUkV4dF9Tb255XzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1haW5fNDIyXzEwX0FfUkV4dF9Tb255XzEKaW5kZXggNmM0MzY5My4uNDNjZmI2MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NYWluXzQyMl8xMF9BX1JFeHRfU29ueV8xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTWFpbl80MjJfMTBfQV9SRXh0X1NvbnlfMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4YTE4OWMzNDEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgODI5NDQwMCwgMHhlZmUwN2YzZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICA4Mjk0NDAwLCAweGYxMWNkNDFmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1haW5fNDIyXzEwX0JfUkV4dF9Tb255XzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU1haW5fNDIyXzEwX0JfUkV4dF9Tb255XzEKaW5kZXggMjI2N2EwOS4uZGQ5NWI1MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1NYWluXzQyMl8xMF9CX1JFeHRfU29ueV8xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTWFpbl80MjJfMTBfQl9SRXh0X1NvbnlfMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTYweDE2MDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgMTYzODQwMDAsIDB4YmYzMDA4MjkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAxNjM4NDAwMCwgMHg3YmVlYWI2MQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsIDE2Mzg0MDAwLCAweDVlNTVjZDEzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU5VVF9BX2VyaWNzc29uXzUgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU5VVF9BX2VyaWNzc29uXzUKaW5kZXggZmU2NTg4MC4uN2FjMjIzZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1OVVRfQV9lcmljc3Nvbl81CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTlVUX0FfZXJpY3Nzb25fNQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDhjZTcyMDBiCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NzM2MTA2NjkKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg0Mjk0MjA0NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1Ob091dFByaW9yX0FfUXVhbGNvbW1fMSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTm9PdXRQcmlvcl9BX1F1YWxjb21tXzEKaW5kZXggNDhjYTVhZC4uNWRlOWRhOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1Ob091dFByaW9yX0FfUXVhbGNvbW1fMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU5vT3V0UHJpb3JfQV9RdWFsY29tbV8xCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4OTFkNDUyZDUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHgxYjQ4MjUwOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweGJjNTE0MjVjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU5vT3V0UHJpb3JfQl9RdWFsY29tbV8xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1Ob091dFByaW9yX0JfUXVhbGNvbW1fMQppbmRleCA4NzJjNWMyLi5mMTA3ZTkzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU5vT3V0UHJpb3JfQl9RdWFsY29tbV8xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtTm9PdXRQcmlvcl9CX1F1YWxjb21tXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHg5MWQ0NTJkNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDFiNDgyNTA5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4YmM1MTQyNWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtT1BGTEFHX0FfUXVhbGNvbW1fMSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtT1BGTEFHX0FfUXVhbGNvbW1fMQppbmRleCA3NDg0OWViLi5lZDJlOWVjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU9QRkxBR19BX1F1YWxjb21tXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1PUEZMQUdfQV9RdWFsY29tbV8xCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4Y2ZmZmEwMTMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4YWU4MDY1NAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweGE3OTkxNWI4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU9QRkxBR19CX1F1YWxjb21tXzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU9QRkxBR19CX1F1YWxjb21tXzEKaW5kZXggNTVlNGJlMC4uY2M0YTIyZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1PUEZMQUdfQl9RdWFsY29tbV8xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtT1BGTEFHX0JfUXVhbGNvbW1fMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweDQyNDY3MDJhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MjVlMDI3NDcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU5OTA0MCwgMHgwODk0YjlkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1PUEZMQUdfQ19RdWFsY29tbV8xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1PUEZMQUdfQ19RdWFsY29tbV8xCmluZGV4IGU0NTAwNWYuLjIzM2IwNDIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtT1BGTEFHX0NfUXVhbGNvbW1fMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLU9QRkxBR19DX1F1YWxjb21tXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHg5MWQ0NTJkNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDFiNDgyNTA5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4YmM1MTQyNWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUEVSU0lTVF9SUEFSQU1fQV9SRXh0X1NvbnlfMSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUEVSU0lTVF9SUEFSQU1fQV9SRXh0X1NvbnlfMQppbmRleCA0ZTQ5Y2FhLi41NGY0ZGI4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBFUlNJU1RfUlBBUkFNX0FfUkV4dF9Tb255XzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QRVJTSVNUX1JQQVJBTV9BX1JFeHRfU29ueV8xCkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQwMHgzODQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA5MjE2MDAsIDB4NzAyZjBkNjcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDkyMTYwMCwgMHg5OTgyMmI1MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QRVJTSVNUX1JQQVJBTV9BX1JFeHRfU29ueV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QRVJTSVNUX1JQQVJBTV9BX1JFeHRfU29ueV8zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZjRkYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBFUlNJU1RfUlBBUkFNX0FfUkV4dF9Tb255XzMKQEAgLTAsMCArMSw3IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDAweDM4NAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDkyMTYwMCwgMHg3MDJmMGQ2NworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgOTIxNjAwLCAweDk5ODIyYjUyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBJQ1NJWkVfQV9Cb3NzZW5fMSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUElDU0laRV9BX0Jvc3Nlbl8xCmluZGV4IDRjMDljYTUuLjViYjNmNTMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUElDU0laRV9BX0Jvc3Nlbl8xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUElDU0laRV9BX0Jvc3Nlbl8xCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEwNTZ4ODQ0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAxMzM2ODk2MCwgMHg4MzBiM2ExZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsIDEzMzY4OTYwLCAweDEyMGNhMDA5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgMTMzNjg5NjAsIDB4Yzk0ZTBkODYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUElDU0laRV9CX0Jvc3Nlbl8xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QSUNTSVpFX0JfQm9zc2VuXzEKaW5kZXggYTNhYjdjOC4uYzFjNjE3MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QSUNTSVpFX0JfQm9zc2VuXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QSUNTSVpFX0JfQm9zc2VuXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODQ0MHgxMDU2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsIDEzMzY4OTYwLCAweGUxZTMyYzNkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgMTMzNjg5NjAsIDB4NzVhNTAzZDMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAxMzM2ODk2MCwgMHg3MWYzM2EwYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QSUNTSVpFX0NfQm9zc2VuXzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBJQ1NJWkVfQ19Cb3NzZW5fMQppbmRleCAxMDUyMGQxLi5mM2UyZTAyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBJQ1NJWkVfQ19Cb3NzZW5fMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBJQ1NJWkVfQ19Cb3NzZW5fMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1Mjh4NDIxNgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzMzOTA3MiwgMHgyOGJlMjM4ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzMzM5MDcyLCAweDQzYjYyYWFlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMzMzkwNzIsIDB4MzYyNTlkYTYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUElDU0laRV9EX0Jvc3Nlbl8xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QSUNTSVpFX0RfQm9zc2VuXzEKaW5kZXggNmYxYzRmYi4uYTczYTk2OSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QSUNTSVpFX0RfQm9zc2VuXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QSUNTSVpFX0RfQm9zc2VuXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDIxNng1MjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMzMzkwNzIsIDB4Y2IxNmY1M2UKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMzMzOTA3MiwgMHg2ZjFkYThlYwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAzMzM5MDcyLCAweDk3OGRhZTk4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBNRVJHRV9BX1RJXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBNRVJHRV9BX1RJXzMKaW5kZXggODQ5MTE3Mi4uYjMwMGY4NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QTUVSR0VfQV9USV8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUE1FUkdFX0FfVElfMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDhlZGIyN2Q3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MTg3NDE5YjUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg2MTEwMDk4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QTUVSR0VfQl9USV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QTUVSR0VfQl9USV8zCmluZGV4IDFmMTVhMDIuLjA0NmM5MGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUE1FUkdFX0JfVElfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBNRVJHRV9CX1RJXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZWRiMjdkNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweGNlYmYxYjc2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MzM5MzBmYjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUE1FUkdFX0NfVElfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUE1FUkdFX0NfVElfMwppbmRleCBiZjQ3NGNjLi4xMjY5ZTUzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBNRVJHRV9DX1RJXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QTUVSR0VfQ19USV8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4OGVkYjI3ZDcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHgyYzI3MWE5YgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDUzZTQxOWYzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBNRVJHRV9EX1RJXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBNRVJHRV9EX1RJXzMKaW5kZXggMmFmMGUxZi4uNDc0NjI2YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QTUVSR0VfRF9USV8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUE1FUkdFX0RfVElfMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDhlZGIyN2Q3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZjExYTMyY2UKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHgwODAyMjM3YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QTUVSR0VfRV9USV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QTUVSR0VfRV9USV8zCmluZGV4IGRmOTcyMzcuLmU4NTk2OTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUE1FUkdFX0VfVElfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBNRVJHRV9FX1RJXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZWRiMjdkNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweGVhN2IzMGJmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MjczZDA5MmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUE9DX0FfQm9zc2VuXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBPQ19BX0Jvc3Nlbl8zCmluZGV4IDg4NWQwZTQuLjk0MGVlZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUE9DX0FfQm9zc2VuXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QT0NfQV9Cb3NzZW5fMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweGRhMTdhY2Q0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MTY5MWI0N2YKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHhlZWJlYWMwYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QUFNfQV9xdWFsY29tbV83IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QUFNfQV9xdWFsY29tbV83CmluZGV4IGVmNTdmNzQuLmRlNjgzMTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUFBTX0FfcXVhbGNvbW1fNworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVBQU19BX3F1YWxjb21tXzcKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHg4NzE1OTMyOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDgyNTY3MmZmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MmY0MjI0ZmYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUFNfQV9WSURZT18zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QU19BX1ZJRFlPXzMKaW5kZXggOGY3ZTVlNi4uNTliODJiNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QU19BX1ZJRFlPXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QU19BX1ZJRFlPXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ODYxOWY4MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDU1MGJkYWYwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NDEyMWY3YTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUFNfQl9WSURZT18zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QU19CX1ZJRFlPXzMKaW5kZXggOGY3ZTVlNi4uNTliODJiNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QU19CX1ZJRFlPXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1QU19CX1ZJRFlPXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ODYxOWY4MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDU1MGJkYWYwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NDEyMWY3YTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUU1BVFJJWF9BX1JFeHRfU29ueV8xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1RTUFUUklYX0FfUkV4dF9Tb255XzEKaW5kZXggNjNiYWE5NS4uOThkMGJiMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1RTUFUUklYX0FfUkV4dF9Tb255XzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1RTUFUUklYX0FfUkV4dF9Tb255XzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDI3NjQ4MDAsIDB4ZGU0NDIzNjEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMjc2NDgwMCwgMHg4ZDQ4MmZkZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAyNzY0ODAwLCAweDliNDMxZTM3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJBUF9BX2RvY29tb180IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SQVBfQV9kb2NvbW9fNAppbmRleCAyNjhmNGNkLi41MWVhMDhiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJBUF9BX2RvY29tb180CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUkFQX0FfZG9jb21vXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHgxYWU1ZjEzZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDBhNmFkMGUzCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MjQxNWFmMDUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUkFQX0JfQm9zc2VuXzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJBUF9CX0Jvc3Nlbl8xCmluZGV4IDU2ZjViNDQuLjUzZTczM2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUkFQX0JfQm9zc2VuXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SQVBfQl9Cb3NzZW5fMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweGI5ODlhZTdhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NDc2NWNhZWQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHhkOTA4YzE0OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUExNX0FfcXVhbGNvbW1fNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBMTV9BX3F1YWxjb21tXzQKaW5kZXggMzcyZDEyMC4uN2NiMmJkZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUExNX0FfcXVhbGNvbW1fNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQTE1fQV9xdWFsY29tbV80CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZGI1ZTNiNTYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHhkNTMyMDk3MAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDkzODdlZDE4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQTE1fQl9xdWFsY29tbV80IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUExNX0JfcXVhbGNvbW1fNAppbmRleCBhMzRkY2MwLi41NTE1YzY3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQTE1fQl9xdWFsY29tbV80CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBMTV9CX3F1YWxjb21tXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4MmZmMGNjYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweGNkMDViYTE3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MzNhNWI5MjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0FfZG9jb21vXzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQU19BX2RvY29tb180CmluZGV4IGUyOWE3NGIuLjVlYzE0NzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0FfZG9jb21vXzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUFNfQV9kb2NvbW9fNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDhlZGIyN2Q3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MGJkZjEzZjgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg0NWU3MDJjNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUFNfQl9xdWFsY29tbV81IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUFNfQl9xdWFsY29tbV81CmluZGV4IDNiMjRlNzUuLjljOWQ4OTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0JfcXVhbGNvbW1fNQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQU19CX3F1YWxjb21tXzUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHhkYjVlM2I1NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweGUzMjhlNjc3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4OGYxOGY0YzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0NfZXJpY3Nzb25fNSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0NfZXJpY3Nzb25fNQppbmRleCBlOTdlN2VhLi44NDBkODE2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQU19DX2VyaWNzc29uXzUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUFNfQ19lcmljc3Nvbl81CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4OGNlNzIwMGIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4NTM0MGNkYQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDE2ZmQxZjkxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQU19EX2VyaWNzc29uXzYgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQU19EX2VyaWNzc29uXzYKaW5kZXggMjg1MTcwNC4uOWMwZmM2YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUFNfRF9lcmljc3Nvbl82CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0RfZXJpY3Nzb25fNgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDhjZTcyMDBiCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NzM2MTA2NjkKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHhjMDE2MjBmNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUFNfRV9xdWFsY29tbV81IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUFNfRV9xdWFsY29tbV81CmluZGV4IDgyYzI1ZTEuLjUxYzYzMDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0VfcXVhbGNvbW1fNQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQU19FX3F1YWxjb21tXzUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZWRiMjdkNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweGQ2MmEzMWJjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZWM4MjJmODQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0ZfZG9jb21vXzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJQU19GX2RvY29tb18xCmluZGV4IDA2YWU5YzEuLjAyNzBlOWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlBTX0ZfZG9jb21vXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUFNfRl9kb2NvbW9fMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDhlZGIyN2Q3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MGJkZjEzZjgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg0NWU3MDJjNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfQV9ISElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlFUX0FfSEhJXzQKaW5kZXggNWYyYjlkYS4uYzVhMTA2ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfQV9ISElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJRVF9BX0hISV80CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NWMwZjU0MjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHgzZDIzYmU1OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfQl9ISElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlFUX0JfSEhJXzQKaW5kZXggZGNmMjY5MS4uZjRmMGMyNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfQl9ISElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJRVF9CX0hISV80CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4Njk4NTQ5NTQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHg2OTVlYmM4NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfQ19ISElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlFUX0NfSEhJXzQKaW5kZXggMmU4ODM1MC4uNmY2NmU0YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfQ19ISElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJRVF9DX0hISV80CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NjU0MzNjZmUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHg5MzA5ZTJjNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfRF9ISElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlFUX0RfSEhJXzQKaW5kZXggN2Y3Mzg5Ni4uMDE2ZDllYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfRF9ISElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJRVF9EX0hISV80CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4ODhkNzQxYmYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHhiYmQ5YWIyMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfRV9ISElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlFUX0VfSEhJXzQKaW5kZXggZjA2MjMxOC4uMGNiMzc2NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfRV9ISElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJRVF9FX0hISV80CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4Y2UyZTUxMWQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHhlNTUxOTJkMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfRl9ISElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlFUX0ZfSEhJXzQKaW5kZXggMjZiZjVhYy4uZjY5MDRjNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfRl9ISElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJRVF9GX0hISV80CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NjU0MzNjZmUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHg2Zjk5Y2M1ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfR19ISElfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtUlFUX0dfSEhJXzQKaW5kZXggZDM2ZWEwMS4uZWQ2N2Y0MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1SUVRfR19ISElfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVJRVF9HX0hISV80CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NWMwZjU0MjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHhlODA1YjE4MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQV9NZWRpYVRla180IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQV9NZWRpYVRla180CmluZGV4IDAxMjI2ZDkuLmQ5MDY2ZmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0FfTWVkaWFUZWtfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19BX01lZGlhVGVrXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHgzMDQxOThjMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweGU3NjVlMzBkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MDEzMGEwNTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0FfUkV4dF9NZWRpYVRla18xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQV9SRXh0X01lZGlhVGVrXzEKaW5kZXggYjZlZDIxMS4uMjQ3MzZhOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQV9SRXh0X01lZGlhVGVrXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQV9SRXh0X01lZGlhVGVrXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2MHgxNjAwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsIDI0NTc2MDAwLCAweDViMDFjZWVkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgMjQ1NzYwMDAsIDB4MDQzZmE3OTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAyNDU3NjAwMCwgMHg5ZWM2MjcyMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQl9NZWRpYVRla181IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQl9NZWRpYVRla181CmluZGV4IDlkYTAyNjguLjFlNTkzYjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0JfTWVkaWFUZWtfNQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19CX01lZGlhVGVrXzUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHhlNTZmNmE1YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDMxZWMxYmI5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4ZjNjZTAzMTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0NfU2Ftc3VuZ180IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQ19TYW1zdW5nXzQKaW5kZXggZjg3OTIxZC4uZmE0Y2RmYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQ19TYW1zdW5nXzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQ19TYW1zdW5nXzQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHhmOTIzYTFhMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDYxNGQ4NTFhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YzM5NzZjZTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0NfU2Ftc3VuZ181IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQ19TYW1zdW5nXzUKaW5kZXggNGNiMWY3OC4uMjM0NGRjZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQ19TYW1zdW5nXzUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fQ19TYW1zdW5nXzUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTEwNDAwLCAweDZmZTY1MDhmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4YTU2YTM0MDMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMzExMDQwMCwgMHg0NWRiMDk3MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fRF9TYW1zdW5nXzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19EX1NhbXN1bmdfNAppbmRleCBjZTFjZWZlLi5kZjNlNDE3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19EX1NhbXN1bmdfNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19EX1NhbXN1bmdfNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDBkMmVkYmJjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NDgzMGFmOTUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHgzOWU4ZDNiYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fRF9TYW1zdW5nXzUgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19EX1NhbXN1bmdfNQppbmRleCBhMTg4NGRkLi4xYTUxY2YzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19EX1NhbXN1bmdfNQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19EX1NhbXN1bmdfNQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4Y2ZiMmYyNTEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMzExMDQwMCwgMHhjMjYyMTkzNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAzMTEwNDAwLCAweDVjYjQyNzg4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19FX0Nhbm9uXzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19FX0Nhbm9uXzQKaW5kZXggOTJhYTdmNC4uNzA1MWI0MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fRV9DYW5vbl80CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0VfQ2Fub25fNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDE2MTNiMjc3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZjkyZDU1NDMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHhmMTE5YmE4ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fRl9DYW5vbl8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fRl9DYW5vbl8zCmluZGV4IGNmMjQwNTUuLjYxM2U3MGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0ZfQ2Fub25fMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19GX0Nhbm9uXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg5MmI1MTA3YQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDk3ZWIzMWVmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZWI3NDNlMzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0dfQ2Fub25fMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0FPX0dfQ2Fub25fMwppbmRleCA1Y2U2NzcyLi44ZjNmOWFjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNBT19HX0Nhbm9uXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TQU9fR19DYW5vbl8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YzRmMjM5ZTAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHhmNTdhMmU0NAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweGJmMWU5OTk1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNESF9BX09yYW5nZV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TREhfQV9PcmFuZ2VfMwppbmRleCBjYWY5MGVlLi5mM2VmMTkyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNESF9BX09yYW5nZV8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0RIX0FfT3JhbmdlXzMKQEAgLTEsMyArMSw3IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTEwNDAwLCAweDAxMTdhYTVkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4YTczN2JjNTYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xJQ0VTX0FfUm92aV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTElDRVNfQV9Sb3ZpXzMKaW5kZXggZjg4NGY3Zi4uYzQ1ZGZkNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTElDRVNfQV9Sb3ZpXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTElDRVNfQV9Sb3ZpXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgMHg3ZjA2Y2IwMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDYwODAwLCAweDFhZDQ4M2FhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NjA4MDAsIDB4MWJiYmM5OTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xJU1RfQV9Tb255XzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNMSVNUX0FfU29ueV80CmluZGV4IGViYjY1YzMuLjllNjhkMGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xJU1RfQV9Tb255XzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTElTVF9BX1NvbnlfNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweGJkMGViNDNlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NGMzYTk4YjUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU5OTA0MCwgMHgxMDU0MTBkYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTElTVF9CX1NvbnlfOCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xJU1RfQl9Tb255XzgKaW5kZXggZmMzOTAzOS4uMDE2NGIzMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTElTVF9CX1NvbnlfOAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNMSVNUX0JfU29ueV84CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4YmQwZWI0M2UKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHgzZWE2OTZjNAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweDg2NmJlZmZjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNMSVNUX0NfU29ueV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTElTVF9DX1NvbnlfMwppbmRleCA0ODJlNTZmLi5iNDBmYTQxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNMSVNUX0NfU29ueV8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xJU1RfQ19Tb255XzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODMyeDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDU5OTA0MCwgMHhjM2U5ODY1OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNTk5MDQwLCAweDYyMWZhMGI3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NTNiMmU2MzcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xJU1RfRF9Tb255XzkgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNMSVNUX0RfU29ueV85CmluZGV4IDM4NGY4MWYuLmQyNmI3NWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xJU1RfRF9Tb255XzkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTElTVF9EX1NvbnlfOQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MzJ4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNTk5MDQwLCAweGYzMDM4NTE1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA1OTkwNDAsIDB4YjFiYzkzODYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDU5OTA0MCwgMHhhMDY5ZTg2ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTFBQTFBfQV9WSURZT18xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTFBQTFBfQV9WSURZT18xCmluZGV4IGJiYjNjZmUuLjZjZDk2NDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xQUExQX0FfVklEWU9fMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNMUFBMUF9BX1ZJRFlPXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ODYxOWY4MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDU1MGJkYWYwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4OTk0NDBhMTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xQUExQX0FfVklEWU9fMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU0xQUExQX0FfVklEWU9fMgppbmRleCBiYmIzY2ZlLi42Y2Q5NjQzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNMUFBMUF9BX1ZJRFlPXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1TTFBQTFBfQV9WSURZT18yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ODg2MTlmODAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg1NTBiZGFmMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDk5NDQwYTE0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNUUlVDVF9BX1NhbXN1bmdfNSBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0FfU2Ftc3VuZ181CmluZGV4IGRhNWNmYTEuLjA5MTZhOWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0FfU2Ftc3VuZ181CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0FfU2Ftc3VuZ181CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NDc5ZmE3Y2EKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg3NjFmYjNhMwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweGEwZjRjZDk3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNUUlVDVF9CX1NhbXN1bmdfNCBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0JfU2Ftc3VuZ180CmluZGV4IGMwMzExMWMuLmI5NWMxNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0JfU2Ftc3VuZ180CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0JfU2Ftc3VuZ180CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4NGI0ODlhNjAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHg4MDM2OWM5YQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweDMzMTg5YjFhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVNUUlVDVF9CX1NhbXN1bmdfNiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0JfU2Ftc3VuZ182CmluZGV4IDgxMWM3OTAuLjYxMjdmNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0JfU2Ftc3VuZ182CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtU1RSVUNUX0JfU2Ftc3VuZ182CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgzMng0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1OTkwNDAsIDB4MTBlNmQ4ODIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDU5OTA0MCwgMHgxMGU2ZDg4MgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTk5MDQwLCAweDEwZTZkODgyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVRJTEVTX0FfQ2lzY29fMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVElMRVNfQV9DaXNjb18yCmluZGV4IDYzYzk3MjIuLjhkMGI1MjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVElMRVNfQV9DaXNjb18yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVElMRVNfQV9DaXNjb18yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHhmYzA1MmU4NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAzMTEwNDAwLCAweGZiNDliZjIwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NTQ5ZWVmMmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVElMRVNfQl9DaXNjb18xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1USUxFU19CX0Npc2NvXzEKaW5kZXggOWMzNzEyMS4uYjAzYTljMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1USUxFU19CX0Npc2NvXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1USUxFU19CX0Npc2NvXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTEwNDAwLCAweDM0NzFmNDczCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4YjM3MWEzZTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMzExMDQwMCwgMHg2ZDgzYzYyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1UTVZQX0FfTVNfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVE1WUF9BX01TXzMKaW5kZXggNTMxMzcwZC4uZDAzN2QzOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1UTVZQX0FfTVNfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVRNVlBfQV9NU18zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZGI1ZTNiNTYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHg2ZDQ0MThlYgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDA0NzNlMzY2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVRTQ0xfQV9WSURZT181IGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1UU0NMX0FfVklEWU9fNQppbmRleCA4NGQ0MjE5Li43Zjg3NTg0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVRTQ0xfQV9WSURZT181CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVFNDTF9BX1ZJRFlPXzUKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHhjZmZmYTAxMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDUxNjYxNDZhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YzNjYzMxOGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVFNDTF9CX1ZJRFlPXzQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVRTQ0xfQl9WSURZT180CmluZGV4IDZlZTI0YWMuLmM4YjE5MjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVFNDTF9CX1ZJRFlPXzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1UU0NMX0JfVklEWU9fNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDg4NjE5ZjgwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NTUwYmRhZjAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg5OTQ0MGExNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1UU0tJUF9BX01TXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVRTS0lQX0FfTVNfMwppbmRleCBiNWVjYTNjLi4yZjdlZTU3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVRTS0lQX0FfTVNfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVRTS0lQX0FfTVNfMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjgweDcyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTM4MjQwMCwgMHhhZWEzNzkzNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxMzgyNDAwLCAweGVhNWM3YjVkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDEzODI0MDAsIDB4NGU0MWU0MjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtVFVTSVpFX0FfU2Ftc3VuZ18xIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1UVVNJWkVfQV9TYW1zdW5nXzEKaW5kZXggNDg4NmE0MC4uZjA0OThlMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1UVVNJWkVfQV9TYW1zdW5nXzEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1UVVNJWkVfQV9TYW1zdW5nXzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2MHgxNjAwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA2MTQ0MDAwLCAweDM2ODE0MjFkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDYxNDQwMDAsIDB4ZWNmM2YzNDMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgNjE0NDAwMCwgMHg1Mzc0MmRiMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1WUFNJRF9BX1ZJRFlPXzEgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVZQU0lEX0FfVklEWU9fMQppbmRleCBiYmIzY2ZlLi42Y2Q5NjQzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVZQU0lEX0FfVklEWU9fMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVZQU0lEX0FfVklEWU9fMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDg4NjE5ZjgwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NTUwYmRhZjAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg5OTQ0MGExNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1WUFNJRF9BX1ZJRFlPXzIgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVZQU0lEX0FfVklEWU9fMgppbmRleCBiYmIzY2ZlLi42Y2Q5NjQzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVZQU0lEX0FfVklEWU9fMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVZQU0lEX0FfVklEWU9fMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDg4NjE5ZjgwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NTUwYmRhZjAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg5OTQ0MGExNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfQV9lcmljc3Nvbl9NQUlOMTBfMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0FfZXJpY3Nzb25fTUFJTjEwXzIKaW5kZXggZmU0NmM5OS4uOGJlZDY1NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfQV9lcmljc3Nvbl9NQUlOMTBfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9BX2VyaWNzc29uX01BSU4xMF8yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyOTk1MjAsIDB4YTNmOTZkNjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDI5OTUyMCwgMHg1Zjc4OGYzZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjk5NTIwLCAweDQxYzdkMGFlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9BX2VyaWNzc29uX01BSU5fMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0FfZXJpY3Nzb25fTUFJTl8yCmluZGV4IDQ5N2M4MDIuLjFiZTgzM2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0FfZXJpY3Nzb25fTUFJTl8yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0FfZXJpY3Nzb25fTUFJTl8yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZmJiM2Q5MTQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHhkY2NkNzA3YgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDMyMDA4OTYzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9CX2VyaWNzc29uX01BSU4xMF8yIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfQl9lcmljc3Nvbl9NQUlOMTBfMgppbmRleCBkMTk5ZDM4Li5iMTQ2NjY4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9CX2VyaWNzc29uX01BSU4xMF8yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0JfZXJpY3Nzb25fTUFJTjEwXzIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI5OTUyMCwgMHg2NmIzY2VmMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjk5NTIwLCAweDk5ZGY4ODBmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyOTk1MjAsIDB4YjRhMDM4MDEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0JfZXJpY3Nzb25fTUFJTl8yIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfQl9lcmljc3Nvbl9NQUlOXzIKaW5kZXggYmI2MWIxMC4uOWFjNjNjMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfQl9lcmljc3Nvbl9NQUlOXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfQl9lcmljc3Nvbl9NQUlOXzIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHgzNzcyZGU1NAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweDU3MWQ4ODVlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NzE1NzZmMDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0NfZXJpY3Nzb25fTUFJTjEwXzIgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9DX2VyaWNzc29uX01BSU4xMF8yCmluZGV4IGIxZTYzMTIuLmVlOTUxYmIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0NfZXJpY3Nzb25fTUFJTjEwXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfQ19lcmljc3Nvbl9NQUlOMTBfMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjk5NTIwLCAweGJjNzFkNjk5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyOTk1MjAsIDB4MzIwN2UxZjkKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDI5OTUyMCwgMHhkZDIwODdiNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfQ19lcmljc3Nvbl9NQUlOXzIgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9DX2VyaWNzc29uX01BSU5fMgppbmRleCA0OWM0ZjIxLi4xMmZiYmY2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9DX2VyaWNzc29uX01BSU5fMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9DX2VyaWNzc29uX01BSU5fMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweDA5NDhlNTIxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4MzdhZmIzODQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHhlMTg2NGM0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRF9lcmljc3Nvbl9NQUlOMTBfMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0RfZXJpY3Nzb25fTUFJTjEwXzIKaW5kZXggODNjZjEwYy4uNmZjOWEwNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRF9lcmljc3Nvbl9NQUlOMTBfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9EX2VyaWNzc29uX01BSU4xMF8yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0NjA4MCwgMHhjNTBlZDZiNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDQ2MDgwLCAweDJhZWFjNTJkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNDYwODAsIDB4ZTNlMzZjZDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0RfZXJpY3Nzb25fTUFJTl8yIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRF9lcmljc3Nvbl9NQUlOXzIKaW5kZXggNmU2ZmMzMi4uZGM0NjlmNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRF9lcmljc3Nvbl9NQUlOXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRF9lcmljc3Nvbl9NQUlOXzIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDIzMDQwLCAweDY5NzdkYmNhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMjMwNDAsIDB4ZDliZmNiNWMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAyMzA0MCwgMHhiZGQ1YTM0NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRV9lcmljc3Nvbl9NQUlOMTBfMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0VfZXJpY3Nzb25fTUFJTjEwXzIKaW5kZXggZGJmNmY3OC4uMGRkMDk2YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRV9lcmljc3Nvbl9NQUlOMTBfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9FX2VyaWNzc29uX01BSU4xMF8yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgOTIxNjAsIDB4NTkxYzk5MmUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA5MjE2MCwgMHhlN2E4Y2Q4YgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDkyMTYwLCAweDJlNzUyOGJiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9FX2VyaWNzc29uX01BSU5fMiBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0VfZXJpY3Nzb25fTUFJTl8yCmluZGV4IGFjNDc4YzYuLmUyODRjMTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0VfZXJpY3Nzb25fTUFJTl8yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0VfZXJpY3Nzb25fTUFJTl8yCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDYwODAsIDB4Y2QyMzQ3MjQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA0NjA4MCwgMHg2NjY0OTU3OQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDQ2MDgwLCAweDQzMTdkMzhkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9GX2VyaWNzc29uX01BSU4xMF8yIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRl9lcmljc3Nvbl9NQUlOMTBfMgppbmRleCAyZjEwM2I3Li5hYTg0NTJkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQUF9GX2VyaWNzc29uX01BSU4xMF8yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0ZfZXJpY3Nzb25fTUFJTjEwXzIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyeDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEzODI0MCwgMHg5OWYxOTZhZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTM4MjQwLCAweDQ1ZjQwN2RlCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMzgyNDAsIDB4ZGFlZjgxNWIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BQX0ZfZXJpY3Nzb25fTUFJTl8yIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRl9lcmljc3Nvbl9NQUlOXzIKaW5kZXggNjI1NmQ5Ni4uMTY1NGVjMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRl9lcmljc3Nvbl9NQUlOXzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUFBfRl9lcmljc3Nvbl9NQUlOXzIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyeDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA2OTEyMCwgMHgyODMyNmExMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY5MTIwLCAweDFmNDFhNGE3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNjkxMjAsIDB4ODAzY2VlYjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BfQV9NQUlOMTBfVG9zaGliYV8zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUF9BX01BSU4xMF9Ub3NoaWJhXzMKaW5kZXggYjJkYWRiYS4uNGNhN2ViMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUF9BX01BSU4xMF9Ub3NoaWJhXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUF9BX01BSU4xMF9Ub3NoaWJhXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI5OTUyMCwgMHg3NzUwZWRjNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjk5NTIwLCAweDk3ZmIzNTliCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyOTk1MjAsIDB4ODlhYzIyYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BfQV9Ub3NoaWJhXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQX0FfVG9zaGliYV8zCmluZGV4IGE4YzVkZjMuLjg4ZjMxOWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BfQV9Ub3NoaWJhXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUF9BX1Rvc2hpYmFfMwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweGY0YmFmYzgzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDk3NjAsIDB4NjExY2E0OTIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0OTc2MCwgMHg4ZmE5YmJiMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUF9CX1Rvc2hpYmFfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BfQl9Ub3NoaWJhXzMKaW5kZXggN2RiYzcyYi4uZWQ2OTg4MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1XUF9CX1Rvc2hpYmFfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQX0JfVG9zaGliYV8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4ZDhiZjBjMzkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE0OTc2MCwgMHhhZDM5MGEyOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTQ5NzYwLCAweDBkMzEwOTA2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLVdQX01BSU4xMF9CX1Rvc2hpYmFfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BfTUFJTjEwX0JfVG9zaGliYV8zCmluZGV4IDMzMmM3ZGYuLjAyNzc3NjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BfTUFJTjEwX0JfVG9zaGliYV8zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtV1BfTUFJTjEwX0JfVG9zaGliYV8zCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyOTk1MjAsIDB4NmVjYmE0NmIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDI5OTUyMCwgMHg1NGU2ZWYwYQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjk5NTIwLCAweDdhNGQ0NmM1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWNpcF9CX05FQ18zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1jaXBfQl9ORUNfMwppbmRleCAwMTZmMGYxLi5jOGRmZWRmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWNpcF9CX05FQ18zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtY2lwX0JfTkVDXzMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHhjYmRhMjYwZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ5NzYwLCAweGJkOGQzMmE5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDk3NjAsIDB4Mzk1NjIwMDYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtaXBjbV9BX05FQ18zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1pcGNtX0FfTkVDXzMKaW5kZXggMTQ1ZjU5MC4uNGQzNGQzMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1pcGNtX0FfTkVDXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1pcGNtX0FfTkVDXzMKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHgyMzU2NDc0YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1pcGNtX0JfTkVDXzMgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWlwY21fQl9ORUNfMwppbmRleCBkOTE3Y2JjLi4wZGQxMzc5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWlwY21fQl9ORUNfMworKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWlwY21fQl9ORUNfMwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweGM4MGQ0M2Y4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWlwY21fQ19ORUNfMyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtaXBjbV9DX05FQ18zCmluZGV4IDZjODljZWEuLjRiYzNmYzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtaXBjbV9DX05FQ18zCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtaXBjbV9DX05FQ18zCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQxNngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDk3NjAsIDB4YjkyZDM4ZWUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtY29uZm9ybWFuY2UtaXBjbV9EX05FQ18zIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1pcGNtX0RfTkVDXzMKaW5kZXggMmNjZmYwNS4uMjNkN2FhYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1pcGNtX0RfTkVDXzMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1pcGNtX0RfTkVDXzMKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDE2eDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0OTc2MCwgMHhhMjRkMTdmOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1jb25mb3JtYW5jZS1pcGNtX0VfTkVDXzIgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWlwY21fRV9ORUNfMgppbmRleCA3OTRjNGFjLi4zZjdkNzgwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWlwY21fRV9ORUNfMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWNvbmZvcm1hbmNlLWlwY21fRV9ORUNfMgpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ5NzYwLCAweGY0NTgyNTE0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLWV4dHJhZGF0YS1yZWxvYWQgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLWV4dHJhZGF0YS1yZWxvYWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4NzU0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2hldmMtZXh0cmFkYXRhLXJlbG9hZApAQCAtMCwwICsxLDEzIEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAxLzEKKyNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDI0NTc2LCAwZDAxMjE3YzVkMWVjNjc5OTY0M2ZjN2Q3NWJhMjMzNworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDI0NTc2LCBmNzNkOWNjYTliNGMxNzY1ZDBlYWQyNDJjM2YwYzMzOQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDI0NTc2LCAzOWE4NzE0ZDc2M2M2MjNhZTdmNmZhYWUzNGUxMDdkMQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgIDI0NTc2LCA1ZGIyNjAwYWEyNjhiNGZkMjhiNjRhYjI4YTA5NmYzMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1wYWlyZWQtZmllbGRzIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1wYWlyZWQtZmllbGRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMjIzZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLXBhaXJlZC1maWVsZHMKQEAgLTAsMCArMSwxNiBAQAorW0ZSQU1FXQoraW50ZXJsYWNlZF9mcmFtZT0xCit0b3BfZmllbGRfZmlyc3Q9MQorWy9GUkFNRV0KK1tGUkFNRV0KK2ludGVybGFjZWRfZnJhbWU9MQordG9wX2ZpZWxkX2ZpcnN0PTAKK1svRlJBTUVdCitbRlJBTUVdCitpbnRlcmxhY2VkX2ZyYW1lPTEKK3RvcF9maWVsZF9maXJzdD0xCitbL0ZSQU1FXQorW0ZSQU1FXQoraW50ZXJsYWNlZF9mcmFtZT0xCit0b3BfZmllbGRfZmlyc3Q9MAorWy9GUkFNRV0KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtcGFyYW1jaGFuZ2UteXV2NDIwcC15dXY0MjBwMTAgYi90ZXN0cy9yZWYvZmF0ZS9oZXZjLXBhcmFtY2hhbmdlLXl1djQyMHAteXV2NDIwcDEwCmluZGV4IGYzY2Q1NTAuLjczYmY4NjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2hldmMtcGFyYW1jaGFuZ2UteXV2NDIwcC15dXY0MjBwMTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1wYXJhbWNoYW5nZS15dXY0MjBwLXl1djQyMHAxMApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMDU2eDg0NDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgMTMzNjg5NjAsIDB4ODMwYjNhMWQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAxMzM2ODk2MCwgMHgxMjBjYTAwOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsIDEzMzY4OTYwLCAweGM5NGUwZDg2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9oZXZjLXNraXBsb29wZmlsdGVyIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1za2lwbG9vcGZpbHRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzI5OTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaGV2Yy1za2lwbG9vcGZpbHRlcgpAQCAtMCwwICsxLDE0IEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQorI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMxMTA0MDAsIDA3NmM5Mjg4ODQzZWYxMTk3YThjYmVmN2Y5YTEzZmVlCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIDYxOTBlZWVhOTUyODA1ZWJkZTY5ZDIyOTYxYWFlYjQ1CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDlhYWE1MTExZDVlNmIyNWRjZjVkZGQxOWM1OGYxN2Y3CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDMxMTA0MDAsIDUyYTQ4N2U1ZjcxYjMxNGUzM2U2NjMyYjQ0OTZmMGE2CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDMxMTA0MDAsIDEzYWJiMWM3ODMxMzcwNWI1N2E4Mjk4ZGMxZTZjMGUyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9pZC1jaW4tdmlkZW8gYi90ZXN0cy9yZWYvZmF0ZS9pZC1jaW4tdmlkZW8KaW5kZXggZjU1NTQ0Zi4uNjcxYjM5NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaWQtY2luLXZpZGVvCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2lkLWNpbi12aWRlbwpAQCAtMSw1ICsxLDE0IEBACiAjdGIgMDogMS8xNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAwLzEKICN0YiAxOiAxLzIyMDUwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDE6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMTogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogc3RlcmVvCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4MDAwMDAwMDAKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxNTc1LCAgICAgNjMwMCwgMHhkZDc1OWRmOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjMwNDAwLCAweDNhMzQ4NmI0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9pZDN2Mi1wcml2IGIvdGVzdHMvcmVmL2ZhdGUvaWQzdjItcHJpdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVjODY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaWQzdjItcHJpdgpAQCAtMCwwICsxLDUgQEAKK1tGT1JNQVRdCitUQUc6dGl0bGU9aWQzdjItdGVzdAorVEFHOmlkM3YyX3ByaXYudGVzdG93bmVyPXRlc3RkYXRhCitUQUc6aWQzdjJfcHJpdi50ZXN0b3duZXIyPVx4MDBceDAxXHgwMgorWy9GT1JNQVRdCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9pZmYtYnl0ZXJ1bjEgYi90ZXN0cy9yZWYvZmF0ZS9pZmYtYnl0ZXJ1bjEKaW5kZXggNmY4MGM3Mi4uOGU2Zjk0OSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaWZmLWJ5dGVydW4xCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2lmZi1ieXRlcnVuMQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzkwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDUvNgogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDAsICAgMjMwNDAwLCAweDM1ZTUxYzYyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9pZmYtaWxibSBiL3Rlc3RzL3JlZi9mYXRlL2lmZi1pbGJtCmluZGV4IGE4MDFhZmYuLjM4YzQzZWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2lmZi1pbGJtCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2lmZi1pbGJtCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvOTAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMCwgICAyMzA0MDAsIDB4MDkyOWUzNDIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ltZ3V0aWxzIGIvdGVzdHMvcmVmL2ZhdGUvaW1ndXRpbHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhNDgyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2ltZ3V0aWxzCkBAIC0wLDAgKzEsNTUgQEAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTExMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2luZGVvMiBiL3Rlc3RzL3JlZi9mYXRlL2luZGVvMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY4MGYzNS4uMDAwMDAwMAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9pbmRlbzIKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotI3RiIDA6IDY2NjY3LzEwMDAwMDAKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyMTYwMCwgMHg1N2EyYmE0MgotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDIxNjAwLCAweDYxZTA5NjE1Ci0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ODI2ZTRlNjMKLTAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAyMTYwMCwgMHgxMDc3MTZlYwotMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgIDIxNjAwLCAweGIzNWNlMWY0Ci0wLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MTJjYWIwODUKLTAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgICAyMTYwMCwgMHgyZjkxN2Y2OQotMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgIDIxNjAwLCAweDI1YWEzZDZlCi0wLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YWIxYmZiZWQKLTAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgICAyMTYwMCwgMHg5OTM2ZGZmOQotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgIDIxNjAwLCAweGMyM2NkOGU1Ci0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAgMjE2MDAsIDB4YTdlYmJjYWEKLTAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgICAyMTYwMCwgMHhkNGRkYTA0NQotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgIDIxNjAwLCAweGNiY2U2ZDdkCi0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4M2NmMzViYWYKLTAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgICAyMTYwMCwgMHgxNmRlNjAwOAotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgIDIxNjAwLCAweDQ5ZDQxYWNmCi0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4OGM2MzAwMzQKLTAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgICAyMTYwMCwgMHgwYjMxMDI5NgotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgIDIxNjAwLCAweDQ4ODcwNjdkCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MTIxOWYyOWUKLTAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgICAyMTYwMCwgMHgzZjNmYzBjOAotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgIDIxNjAwLCAweDFiZDFkMGZjCi0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4OTEzZjlkNGMKLTAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgICAyMTYwMCwgMHg2OWU5YTZiNAotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgIDIxNjAwLCAweGNjMmU5MTdmCi0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZjY5NjdlMzAKLTAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgICAyMTYwMCwgMHhkZjgxNjU5MwotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgIDIxNjAwLCAweGZkOTQ1Yjc1Ci0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4N2Q3ZTAyMjQKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgICAyMTYwMCwgMHg3MjQ2ZjU4NAotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgIDIxNjAwLCAweDA3YjdjZTgyCi0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZWUxNmMyOTEKLTAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgICAyMTYwMCwgMHhmNGVmYjUzYQotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgIDIxNjAwLCAweDJlNzNhMjA4Ci0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MWMyYjYwNjgKLTAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgICAyMTYwMCwgMHgwMDQyNTBkZQotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgIDIxNjAwLCAweDYxZDk1N2Q5Ci0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4OGI1ZDJjYjAKLTAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgICAyMTYwMCwgMHhjMGE5MWZiYwotMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgIDIxNjAwLCAweGEzODEwOGZjCi0wLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NTUxZjAzYjkKLTAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgICAyMTYwMCwgMHg5M2RlZjVjYQotMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgIDIxNjAwLCAweGU4ZWNmOGJiCi0wLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NGMwNGZiYjAKLTAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgICAyMTYwMCwgMHgwZTQxZGFlNAotMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgIDIxNjAwLCAweGNhOWZiMGRmCi0wLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YjEyM2FmMTkKLTAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgICAyMTYwMCwgMHhmZDU5YmU3YQotMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgIDIxNjAwLCAweDJjODhiN2E2Ci0wLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NjRjYzlhMWYKLTAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgICAyMTYwMCwgMHg3M2Q2YTliYQotMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgIDIxNjAwLCAweDc5MTk4YTExCi0wLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MGQ0YTg2MTAKLTAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgICAyMTYwMCwgMHgzNTJlNzFiYwotMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgIDIxNjAwLCAweDA4YWE2MjdlCi0wLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YmVlMzZlNDUKLTAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgICAyMTYwMCwgMHgzMGRlNWMxYgotMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgIDIxNjAwLCAweDIxZDc1NDg0Ci0wLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZTBlOTFkNTIKLTAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgICAyMTYwMCwgMHg2NzhjMmViYgotMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgIDIxNjAwLCAweDIwODAzOTdiCi0wLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4N2RiYzEzMzMKLTAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgICAyMTYwMCwgMHg5YzczMGFkMAotMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgIDIxNjAwLCAweDRkYTUwZjU1Ci0wLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZGRlNWVhYTcKLTAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgICAyMTYwMCwgMHg5NDllZDRmYQotMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgIDIxNjAwLCAweDVkNjNiYzU0Ci0wLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YzVkY2JhNGYKLTAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgICAyMTYwMCwgMHhkNjhjYWVlMQotMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgIDIxNjAwLCAweGY3NDA5ZmM5Ci0wLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NmIwY2EzZTUKLTAsICAgICAgICAgNzIsICAgICAgICAgNzIsICAgICAgICAxLCAgICAyMTYwMCwgMHhkMTMzYTEwOAotMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgIDIxNjAwLCAweGYyNjg3YjgxCi0wLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NmU5NDY0NWQKLTAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgICAyMTYwMCwgMHhmZjdlNzUyNAotMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgIDIxNjAwLCAweDhjNzI1NWRkCi0wLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ODRlOTc5Y2YKLTAsICAgICAgICAgNzgsICAgICAgICAgNzgsICAgICAgICAxLCAgICAyMTYwMCwgMHhhYTRlNzEyNwotMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgIDIxNjAwLCAweDBiNTY3MDhjCi0wLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MzhmMDg2YzQKLTAsICAgICAgICAgODEsICAgICAgICAgODEsICAgICAgICAxLCAgICAyMTYwMCwgMHg2YTcwODZmNgotMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgIDIxNjAwLCAweDU3YTM2MTlkCi0wLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZWUyNzYzOWEKLTAsICAgICAgICAgODQsICAgICAgICAgODQsICAgICAgICAxLCAgICAyMTYwMCwgMHg3NTRiN2VjNgotMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgIDIxNjAwLCAweDJmN2I0MjhjCi0wLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MGRjOTQ2MDMKLTAsICAgICAgICAgODcsICAgICAgICAgODcsICAgICAgICAxLCAgICAyMTYwMCwgMHhlZWRlNTRkOAotMCwgICAgICAgICA4OCwgICAgICAgICA4OCwgICAgICAgIDEsICAgIDIxNjAwLCAweDU4N2I0NzI1Ci0wLCAgICAgICAgIDg5LCAgICAgICAgIDg5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZTdjNzJjN2EKLTAsICAgICAgICAgOTAsICAgICAgICAgOTAsICAgICAgICAxLCAgICAyMTYwMCwgMHg1MjM5NDljYgotMCwgICAgICAgICA5MSwgICAgICAgICA5MSwgICAgICAgIDEsICAgIDIxNjAwLCAweGVhZGU1Mzg1Ci0wLCAgICAgICAgIDkyLCAgICAgICAgIDkyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MWE4ZjQ1YzgKLTAsICAgICAgICAgOTMsICAgICAgICAgOTMsICAgICAgICAxLCAgICAyMTYwMCwgMHg4MTRhMzkzYwotMCwgICAgICAgICA5NCwgICAgICAgICA5NCwgICAgICAgIDEsICAgIDIxNjAwLCAweGU3YjM0ODg3Ci0wLCAgICAgICAgIDk1LCAgICAgICAgIDk1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4OGVlZjNmNWYKLTAsICAgICAgICAgOTYsICAgICAgICAgOTYsICAgICAgICAxLCAgICAyMTYwMCwgMHg1NmYxMmYwOAotMCwgICAgICAgICA5NywgICAgICAgICA5NywgICAgICAgIDEsICAgIDIxNjAwLCAweGIyZDAyNDQ4Ci0wLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YjdkOTM2ZGIKLTAsICAgICAgICAgOTksICAgICAgICAgOTksICAgICAgICAxLCAgICAyMTYwMCwgMHg0NWY3MjZhYgotMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDEsICAgIDIxNjAwLCAweDYwMTI0MDRkCi0wLCAgICAgICAgMTAxLCAgICAgICAgMTAxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MjczYzI1NGUKLTAsICAgICAgICAxMDIsICAgICAgICAxMDIsICAgICAgICAxLCAgICAyMTYwMCwgMHgzOGU4MmMxOQotMCwgICAgICAgIDEwMywgICAgICAgIDEwMywgICAgICAgIDEsICAgIDIxNjAwLCAweDczNjUzMjc0Ci0wLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MmZmNjNiMGMKLTAsICAgICAgICAxMDUsICAgICAgICAxMDUsICAgICAgICAxLCAgICAyMTYwMCwgMHg5NmQwMzYxMQotMCwgICAgICAgIDEwNiwgICAgICAgIDEwNiwgICAgICAgIDEsICAgIDIxNjAwLCAweGVlOGMyOWQ3Ci0wLCAgICAgICAgMTA3LCAgICAgICAgMTA3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YWMwNDMxOTkKLTAsICAgICAgICAxMDgsICAgICAgICAxMDgsICAgICAgICAxLCAgICAyMTYwMCwgMHhkMmM3NDFhNwotMCwgICAgICAgIDEwOSwgICAgICAgIDEwOSwgICAgICAgIDEsICAgIDIxNjAwLCAweGRjN2IyYjgxCi0wLCAgICAgICAgMTEwLCAgICAgICAgMTEwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4Mzc2ZjQzOGYKLTAsICAgICAgICAxMTEsICAgICAgICAxMTEsICAgICAgICAxLCAgICAyMTYwMCwgMHg1NTQ0MmZmNwotMCwgICAgICAgIDExMiwgICAgICAgIDExMiwgICAgICAgIDEsICAgIDIxNjAwLCAweDY1M2IxNDcyCi0wLCAgICAgICAgMTEzLCAgICAgICAgMTEzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4YzQyOTM3NzkKLTAsICAgICAgICAxMTQsICAgICAgICAxMTQsICAgICAgICAxLCAgICAyMTYwMCwgMHhjNjU1Mzc0MAotMCwgICAgICAgIDExNSwgICAgICAgIDExNSwgICAgICAgIDEsICAgIDIxNjAwLCAweGNmNDQxMDUzCi0wLCAgICAgICAgMTE2LCAgICAgICAgMTE2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YjE1MzFiY2UKLTAsICAgICAgICAxMTcsICAgICAgICAxMTcsICAgICAgICAxLCAgICAyMTYwMCwgMHgxNDUzMjNiMwotMCwgICAgICAgIDExOCwgICAgICAgIDExOCwgICAgICAgIDEsICAgIDIxNjAwLCAweDkxNmMyZTllCi0wLCAgICAgICAgMTE5LCAgICAgICAgMTE5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4Yjg5YmZlY2MKLTAsICAgICAgICAxMjAsICAgICAgICAxMjAsICAgICAgICAxLCAgICAyMTYwMCwgMHg4ZTI0MTViOQotMCwgICAgICAgIDEyMSwgICAgICAgIDEyMSwgICAgICAgIDEsICAgIDIxNjAwLCAweDVhZjIzMDIxCi0wLCAgICAgICAgMTIyLCAgICAgICAgMTIyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NTNlODFjMTAKLTAsICAgICAgICAxMjMsICAgICAgICAxMjMsICAgICAgICAxLCAgICAyMTYwMCwgMHhmN2Y4MmE2ZgotMCwgICAgICAgIDEyNCwgICAgICAgIDEyNCwgICAgICAgIDEsICAgIDIxNjAwLCAweDg1MTEyMWEyCi0wLCAgICAgICAgMTI1LCAgICAgICAgMTI1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YTg0MzJiZDIKLTAsICAgICAgICAxMjYsICAgICAgICAxMjYsICAgICAgICAxLCAgICAyMTYwMCwgMHgxYTM4MTc5OQotMCwgICAgICAgIDEyNywgICAgICAgIDEyNywgICAgICAgIDEsICAgIDIxNjAwLCAweGJiNzYxMzg0Ci0wLCAgICAgICAgMTI4LCAgICAgICAgMTI4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YzhmMzI4ZDUKLTAsICAgICAgICAxMjksICAgICAgICAxMjksICAgICAgICAxLCAgICAyMTYwMCwgMHhiMzc0MmU4YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaW5kZW8yLWRlbHRhIGIvdGVzdHMvcmVmL2ZhdGUvaW5kZW8yLWRlbHRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTAxZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9pbmRlbzItZGVsdGEKQEAgLTAsMCArMSwxMTkgQEAKKyN0YiAwOiAxNjU2Ny8yNTAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2MHgxMjAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4YTNlOTE0ZGQKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAyMTYwMCwgMHgzNjdlYjQyMAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDIxNjAwLCAweDUyNzQ4OGUyCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NWU3MDRkY2IKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgICAyMTYwMCwgMHhmYmZiMzVkNAorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgIDIxNjAwLCAweGY2ZTE2OGRlCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MGI1ODk4MTgKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgICAyMTYwMCwgMHhjNjdiMmRiZAorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgIDIxNjAwLCAweDAwMmY0OTk0CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZTNhNDc2ZjIKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgICAyMTYwMCwgMHhiYzVmMGYzOQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgIDIxNjAwLCAweGVmMDk1ZTNhCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NmJiNGY1MTUKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgICAyMTYwMCwgMHgxYmUxZjBmYQorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgIDIxNjAwLCAweDBkODU1NDY0CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NjcxMWI0N2QKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgICAyMTYwMCwgMHgxNGNiMjY0MAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgIDIxNjAwLCAweDViNzk0MDI3CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZjhjZmFiM2MKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgICAyMTYwMCwgMHhlNjM5YjBjMgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgIDIxNjAwLCAweDQwM2IzZDdiCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MzY0Y2JiNmYKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgICAyMTYwMCwgMHhhZGZmNmM3MgorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgIDIxNjAwLCAweDc2Yzg1YjUyCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YmU4NWVjODAKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgICAyMTYwMCwgMHgxZTlmOWU1MAorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgIDIxNjAwLCAweGJkMzFiZDgyCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NDQ0NWExMmEKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgICAyMTYwMCwgMHgwOGYyNTg4OAorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgIDIxNjAwLCAweDczZDQ1Njk2CiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4YmM2ODFhMTAKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgICAyMTYwMCwgMHgwM2Y1MDJiZQorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgIDIxNjAwLCAweDkyMDZhNzU3CiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4M2VkNWUxYmUKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgICAyMTYwMCwgMHg3NmI2MzZhOQorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgIDIxNjAwLCAweDdkNDBjY2IwCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YTI5NTU0OTkKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgICAyMTYwMCwgMHhmNGIyMGM4NgorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgIDIxNjAwLCAweGU0OTdkNjgxCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ODMxZWY5NzMKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgICAyMTYwMCwgMHg0M2FhNzhlNgorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgIDIxNjAwLCAweDI2ZTRiZGI2CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZDA0ZTlmZWIKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgICAyMTYwMCwgMHgwOGVmNGI1OAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgIDIxNjAwLCAweDMwYjg0Y2MzCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MDRlMWRlYzAKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgICAyMTYwMCwgMHhlZDRmMjRkNQorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgIDIxNjAwLCAweGNjOWY4ZDRjCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NDAyZmY2OWEKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgICAyMTYwMCwgMHhkNzdhNGU3YgorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgIDIxNjAwLCAweGU2MTRkZTcxCiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MThkYWNjYmQKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgICAyMTYwMCwgMHg4N2U4OTZkMQorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgIDIxNjAwLCAweDUxZDc2MjY0CiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4OWI5MTAzMDQKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgICAyMTYwMCwgMHhkM2E3YWEzMAorMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgIDIxNjAwLCAweDQwZTRlOTI2CiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4OWJiNWQ3MDMKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgICAyMTYwMCwgMHg2M2ZiMWFjMAorMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgIDIxNjAwLCAweDFiOWQ4NTFlCiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MzZlNGMwZTYKKzAsICAgICAgICAgNjEsICAgICAgICAgNjEsICAgICAgICAxLCAgICAyMTYwMCwgMHgxZjE0YjM4NgorMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgIDIxNjAwLCAweDAxMDE2ZTkzCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4OGYxOTJjYzcKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgICAyMTYwMCwgMHhhOWNhYWViMAorMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgIDIxNjAwLCAweGU5OTQ4YTNkCiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZTg3MGZhMTgKKzAsICAgICAgICAgNjcsICAgICAgICAgNjcsICAgICAgICAxLCAgICAyMTYwMCwgMHhjMDgzZWZmNQorMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgIDIxNjAwLCAweDJmMDcwMjI1CiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ODljYmQ5NTQKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgICAyMTYwMCwgMHg0NDhjNGZiYgorMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgIDIxNjAwLCAweGUxZWNmZGJlCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MjBiMzc0OWIKKzAsICAgICAgICAgNzMsICAgICAgICAgNzMsICAgICAgICAxLCAgICAyMTYwMCwgMHg4YmE4YTNjNgorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgIDIxNjAwLCAweDkwYzA2NDIxCiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MGU2YmQ1ZmMKKzAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgICAyMTYwMCwgMHgxOTQ0MjVhYQorMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgIDIxNjAwLCAweDQwMzgwNDNhCiswLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MjE1NDVlZGUKKzAsICAgICAgICAgNzksICAgICAgICAgNzksICAgICAgICAxLCAgICAyMTYwMCwgMHgyYWRlOGQ1MgorMCwgICAgICAgICA4MCwgICAgICAgICA4MCwgICAgICAgIDEsICAgIDIxNjAwLCAweGY1MDRhZDdlCiswLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4YzU4ZmNmMTAKKzAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgICAyMTYwMCwgMHg0YjBhZjIzMAorMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgIDIxNjAwLCAweDNmZjc2YjBiCiswLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NmQwNTFiZWUKKzAsICAgICAgICAgODUsICAgICAgICAgODUsICAgICAgICAxLCAgICAyMTYwMCwgMHhjNWQ1OTIwOAorMCwgICAgICAgICA4NiwgICAgICAgICA4NiwgICAgICAgIDEsICAgIDIxNjAwLCAweGVkNWY4MWNmCiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MmM5OTc2ZjkKKzAsICAgICAgICAgODgsICAgICAgICAgODgsICAgICAgICAxLCAgICAyMTYwMCwgMHhkZDViNWY1NQorMCwgICAgICAgICA4OSwgICAgICAgICA4OSwgICAgICAgIDEsICAgIDIxNjAwLCAweGNlYzczYmMzCiswLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NDYwMzNhMDIKKzAsICAgICAgICAgOTEsICAgICAgICAgOTEsICAgICAgICAxLCAgICAyMTYwMCwgMHgwMGM2YWFkZQorMCwgICAgICAgICA5MiwgICAgICAgICA5MiwgICAgICAgIDEsICAgIDIxNjAwLCAweDMzNjA0OWIzCiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZTE5Mzk0NzkKKzAsICAgICAgICAgOTQsICAgICAgICAgOTQsICAgICAgICAxLCAgICAyMTYwMCwgMHhjNzdjYTdlNworMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgIDIxNjAwLCAweDQwMTUzNDg5CiswLCAgICAgICAgIDk2LCAgICAgICAgIDk2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MzMyNTM1MDEKKzAsICAgICAgICAgOTcsICAgICAgICAgOTcsICAgICAgICAxLCAgICAyMTYwMCwgMHgxMGEzMjFjMQorMCwgICAgICAgICA5OCwgICAgICAgICA5OCwgICAgICAgIDEsICAgIDIxNjAwLCAweDg3MjBkYjY3CiswLCAgICAgICAgIDk5LCAgICAgICAgIDk5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MTg1Yjc3MmUKKzAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAxLCAgICAyMTYwMCwgMHhmNGNlMTk4NgorMCwgICAgICAgIDEwMSwgICAgICAgIDEwMSwgICAgICAgIDEsICAgIDIxNjAwLCAweDcyMzRhZjkxCiswLCAgICAgICAgMTAyLCAgICAgICAgMTAyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MWNiNzUzNjcKKzAsICAgICAgICAxMDMsICAgICAgICAxMDMsICAgICAgICAxLCAgICAyMTYwMCwgMHg3YmMyOTM3NworMCwgICAgICAgIDEwNCwgICAgICAgIDEwNCwgICAgICAgIDEsICAgIDIxNjAwLCAweGMzYzA0N2ExCiswLCAgICAgICAgMTA1LCAgICAgICAgMTA1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZTZmYjkzOGMKKzAsICAgICAgICAxMDYsICAgICAgICAxMDYsICAgICAgICAxLCAgICAyMTYwMCwgMHg5N2NhNWFiNQorMCwgICAgICAgIDEwNywgICAgICAgIDEwNywgICAgICAgIDEsICAgIDIxNjAwLCAweDdhOWZlOWJmCiswLCAgICAgICAgMTA4LCAgICAgICAgMTA4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NTNmODkyZTQKKzAsICAgICAgICAxMDksICAgICAgICAxMDksICAgICAgICAxLCAgICAyMTYwMCwgMHg2MDhhMGJmNgorMCwgICAgICAgIDExMCwgICAgICAgIDExMCwgICAgICAgIDEsICAgIDIxNjAwLCAweDYwNTJiOTZmCiswLCAgICAgICAgMTExLCAgICAgICAgMTExLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NjFmNjg5ZTcKKzAsICAgICAgICAxMTIsICAgICAgICAxMTIsICAgICAgICAxLCAgICAyMTYwMCwgMHgwMmE1MmU4MQorMCwgICAgICAgIDExMywgICAgICAgIDExMywgICAgICAgIDEsICAgIDIxNjAwLCAweDQzZjAxYWUyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9pbmRlbzItaW50cmEgYi90ZXN0cy9yZWYvZmF0ZS9pbmRlbzItaW50cmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzMWQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2luZGVvMi1pbnRyYQpAQCAtMCwwICsxLDEzNSBAQAorI3RiIDA6IDY2NjY3LzEwMDAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2MHgxMjAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NTdhMmJhNDIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAyMTYwMCwgMHg2MWUwOTYxNQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDIxNjAwLCAweDgyNmU0ZTYzCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MTA3NzE2ZWMKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgICAyMTYwMCwgMHhiMzVjZTFmNAorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgIDIxNjAwLCAweDEyY2FiMDg1CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MmY5MTdmNjkKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgICAyMTYwMCwgMHgyNWFhM2Q2ZQorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgIDIxNjAwLCAweGFiMWJmYmVkCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4OTkzNmRmZjkKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgICAyMTYwMCwgMHhjMjNjZDhlNQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgIDIxNjAwLCAweGE3ZWJiY2FhCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZDRkZGEwNDUKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgICAyMTYwMCwgMHhjYmNlNmQ3ZAorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgIDIxNjAwLCAweDNjZjM1YmFmCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MTZkZTYwMDgKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgICAyMTYwMCwgMHg0OWQ0MWFjZgorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgIDIxNjAwLCAweDhjNjMwMDM0CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MGIzMTAyOTYKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgICAyMTYwMCwgMHg0ODg3MDY3ZAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgIDIxNjAwLCAweDEyMTlmMjllCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4M2YzZmMwYzgKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgICAyMTYwMCwgMHgxYmQxZDBmYworMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgIDIxNjAwLCAweDkxM2Y5ZDRjCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NjllOWE2YjQKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgICAyMTYwMCwgMHhjYzJlOTE3ZgorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgIDIxNjAwLCAweGY2OTY3ZTMwCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZGY4MTY1OTMKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgICAyMTYwMCwgMHhmZDk0NWI3NQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgIDIxNjAwLCAweDdkN2UwMjI0CiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NzI0NmY1ODQKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgICAyMTYwMCwgMHgwN2I3Y2U4MgorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgIDIxNjAwLCAweGVlMTZjMjkxCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZjRlZmI1M2EKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgICAyMTYwMCwgMHgyZTczYTIwOAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgIDIxNjAwLCAweDFjMmI2MDY4CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MDA0MjUwZGUKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgICAyMTYwMCwgMHg2MWQ5NTdkOQorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgIDIxNjAwLCAweDhiNWQyY2IwCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YzBhOTFmYmMKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgICAyMTYwMCwgMHhhMzgxMDhmYworMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgIDIxNjAwLCAweDU1MWYwM2I5CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4OTNkZWY1Y2EKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgICAyMTYwMCwgMHhlOGVjZjhiYgorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgIDIxNjAwLCAweDRjMDRmYmIwCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MGU0MWRhZTQKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgICAyMTYwMCwgMHhjYTlmYjBkZgorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgIDIxNjAwLCAweGIxMjNhZjE5CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZmQ1OWJlN2EKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgICAyMTYwMCwgMHgyYzg4YjdhNgorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgIDIxNjAwLCAweDY0Y2M5YTFmCiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NzNkNmE5YmEKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgICAyMTYwMCwgMHg3OTE5OGExMQorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgIDIxNjAwLCAweDBkNGE4NjEwCiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MzUyZTcxYmMKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgICAyMTYwMCwgMHgwOGFhNjI3ZQorMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgIDIxNjAwLCAweGJlZTM2ZTQ1CiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MzBkZTVjMWIKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgICAyMTYwMCwgMHgyMWQ3NTQ4NAorMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgIDIxNjAwLCAweGUwZTkxZDUyCiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4Njc4YzJlYmIKKzAsICAgICAgICAgNjEsICAgICAgICAgNjEsICAgICAgICAxLCAgICAyMTYwMCwgMHgyMDgwMzk3YgorMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgIDIxNjAwLCAweDdkYmMxMzMzCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4OWM3MzBhZDAKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgICAyMTYwMCwgMHg0ZGE1MGY1NQorMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgIDIxNjAwLCAweGRkZTVlYWE3CiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4OTQ5ZWQ0ZmEKKzAsICAgICAgICAgNjcsICAgICAgICAgNjcsICAgICAgICAxLCAgICAyMTYwMCwgMHg1ZDYzYmM1NAorMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgIDIxNjAwLCAweGM1ZGNiYTRmCiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZDY4Y2FlZTEKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgICAyMTYwMCwgMHhmNzQwOWZjOQorMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgIDIxNjAwLCAweDZiMGNhM2U1CiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZDEzM2ExMDgKKzAsICAgICAgICAgNzMsICAgICAgICAgNzMsICAgICAgICAxLCAgICAyMTYwMCwgMHhmMjY4N2I4MQorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgIDIxNjAwLCAweDZlOTQ2NDVkCiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZmY3ZTc1MjQKKzAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgICAyMTYwMCwgMHg4YzcyNTVkZAorMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgIDIxNjAwLCAweDg0ZTk3OWNmCiswLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YWE0ZTcxMjcKKzAsICAgICAgICAgNzksICAgICAgICAgNzksICAgICAgICAxLCAgICAyMTYwMCwgMHgwYjU2NzA4YworMCwgICAgICAgICA4MCwgICAgICAgICA4MCwgICAgICAgIDEsICAgIDIxNjAwLCAweDM4ZjA4NmM0CiswLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NmE3MDg2ZjYKKzAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgICAyMTYwMCwgMHg1N2EzNjE5ZAorMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgIDIxNjAwLCAweGVlMjc2MzlhCiswLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NzU0YjdlYzYKKzAsICAgICAgICAgODUsICAgICAgICAgODUsICAgICAgICAxLCAgICAyMTYwMCwgMHgyZjdiNDI4YworMCwgICAgICAgICA4NiwgICAgICAgICA4NiwgICAgICAgIDEsICAgIDIxNjAwLCAweDBkYzk0NjAzCiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZWVkZTU0ZDgKKzAsICAgICAgICAgODgsICAgICAgICAgODgsICAgICAgICAxLCAgICAyMTYwMCwgMHg1ODdiNDcyNQorMCwgICAgICAgICA4OSwgICAgICAgICA4OSwgICAgICAgIDEsICAgIDIxNjAwLCAweGU3YzcyYzdhCiswLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NTIzOTQ5Y2IKKzAsICAgICAgICAgOTEsICAgICAgICAgOTEsICAgICAgICAxLCAgICAyMTYwMCwgMHhlYWRlNTM4NQorMCwgICAgICAgICA5MiwgICAgICAgICA5MiwgICAgICAgIDEsICAgIDIxNjAwLCAweDFhOGY0NWM4CiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ODE0YTM5M2MKKzAsICAgICAgICAgOTQsICAgICAgICAgOTQsICAgICAgICAxLCAgICAyMTYwMCwgMHhlN2IzNDg4NworMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgIDIxNjAwLCAweDhlZWYzZjVmCiswLCAgICAgICAgIDk2LCAgICAgICAgIDk2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NTZmMTJmMDgKKzAsICAgICAgICAgOTcsICAgICAgICAgOTcsICAgICAgICAxLCAgICAyMTYwMCwgMHhiMmQwMjQ0OAorMCwgICAgICAgICA5OCwgICAgICAgICA5OCwgICAgICAgIDEsICAgIDIxNjAwLCAweGI3ZDkzNmRiCiswLCAgICAgICAgIDk5LCAgICAgICAgIDk5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4NDVmNzI2YWIKKzAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAxLCAgICAyMTYwMCwgMHg2MDEyNDA0ZAorMCwgICAgICAgIDEwMSwgICAgICAgIDEwMSwgICAgICAgIDEsICAgIDIxNjAwLCAweDI3M2MyNTRlCiswLCAgICAgICAgMTAyLCAgICAgICAgMTAyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MzhlODJjMTkKKzAsICAgICAgICAxMDMsICAgICAgICAxMDMsICAgICAgICAxLCAgICAyMTYwMCwgMHg3MzY1MzI3NAorMCwgICAgICAgIDEwNCwgICAgICAgIDEwNCwgICAgICAgIDEsICAgIDIxNjAwLCAweDJmZjYzYjBjCiswLCAgICAgICAgMTA1LCAgICAgICAgMTA1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4OTZkMDM2MTEKKzAsICAgICAgICAxMDYsICAgICAgICAxMDYsICAgICAgICAxLCAgICAyMTYwMCwgMHhlZThjMjlkNworMCwgICAgICAgIDEwNywgICAgICAgIDEwNywgICAgICAgIDEsICAgIDIxNjAwLCAweGFjMDQzMTk5CiswLCAgICAgICAgMTA4LCAgICAgICAgMTA4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZDJjNzQxYTcKKzAsICAgICAgICAxMDksICAgICAgICAxMDksICAgICAgICAxLCAgICAyMTYwMCwgMHhkYzdiMmI4MQorMCwgICAgICAgIDExMCwgICAgICAgIDExMCwgICAgICAgIDEsICAgIDIxNjAwLCAweDM3NmY0MzhmCiswLCAgICAgICAgMTExLCAgICAgICAgMTExLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NTU0NDJmZjcKKzAsICAgICAgICAxMTIsICAgICAgICAxMTIsICAgICAgICAxLCAgICAyMTYwMCwgMHg2NTNiMTQ3MgorMCwgICAgICAgIDExMywgICAgICAgIDExMywgICAgICAgIDEsICAgIDIxNjAwLCAweGM0MjkzNzc5CiswLCAgICAgICAgMTE0LCAgICAgICAgMTE0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YzY1NTM3NDAKKzAsICAgICAgICAxMTUsICAgICAgICAxMTUsICAgICAgICAxLCAgICAyMTYwMCwgMHhjZjQ0MTA1MworMCwgICAgICAgIDExNiwgICAgICAgIDExNiwgICAgICAgIDEsICAgIDIxNjAwLCAweGIxNTMxYmNlCiswLCAgICAgICAgMTE3LCAgICAgICAgMTE3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MTQ1MzIzYjMKKzAsICAgICAgICAxMTgsICAgICAgICAxMTgsICAgICAgICAxLCAgICAyMTYwMCwgMHg5MTZjMmU5ZQorMCwgICAgICAgIDExOSwgICAgICAgIDExOSwgICAgICAgIDEsICAgIDIxNjAwLCAweGI4OWJmZWNjCiswLCAgICAgICAgMTIwLCAgICAgICAgMTIwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4OGUyNDE1YjkKKzAsICAgICAgICAxMjEsICAgICAgICAxMjEsICAgICAgICAxLCAgICAyMTYwMCwgMHg1YWYyMzAyMQorMCwgICAgICAgIDEyMiwgICAgICAgIDEyMiwgICAgICAgIDEsICAgIDIxNjAwLCAweDUzZTgxYzEwCiswLCAgICAgICAgMTIzLCAgICAgICAgMTIzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZjdmODJhNmYKKzAsICAgICAgICAxMjQsICAgICAgICAxMjQsICAgICAgICAxLCAgICAyMTYwMCwgMHg4NTExMjFhMgorMCwgICAgICAgIDEyNSwgICAgICAgIDEyNSwgICAgICAgIDEsICAgIDIxNjAwLCAweGE4NDMyYmQyCiswLCAgICAgICAgMTI2LCAgICAgICAgMTI2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MWEzODE3OTkKKzAsICAgICAgICAxMjcsICAgICAgICAxMjcsICAgICAgICAxLCAgICAyMTYwMCwgMHhiYjc2MTM4NAorMCwgICAgICAgIDEyOCwgICAgICAgIDEyOCwgICAgICAgIDEsICAgIDIxNjAwLCAweGM4ZjMyOGQ1CiswLCAgICAgICAgMTI5LCAgICAgICAgMTI5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YjM3NDJlOGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2luZGVvMyBiL3Rlc3RzL3JlZi9mYXRlL2luZGVvMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY1NTY0OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9pbmRlbzMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0jdGIgMDogMS8xMAotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDIxNjAwLCAweDg0NTA5OGZjCi0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4YzI4ZThiZjAKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAyMTYwMCwgMHgyZjQxOGZiNAotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgIDIxNjAwLCAweDA1MWQ3YTBlCi0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MWIzNmFhN2MKLTAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgICAyMTYwMCwgMHhiOWUyYWQzOAotMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgIDIxNjAwLCAweDhkYzk5YjYwCi0wLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YTNmYTc4OWEKLTAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgICAyMTYwMCwgMHgxZmRiYWRlMgotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgIDIxNjAwLCAweDRmNGFjMTY0Ci0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MGVhNWNiNTAKLTAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgICAyMTYwMCwgMHhmYjY1OTUyOAotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgIDIxNjAwLCAweGFjNTc5MGY4Ci0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4OTc2MmJlYjQKLTAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgICAyMTYwMCwgMHgyOWIwZGEwYQotMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgIDIxNjAwLCAweDZkODhiMGRhCi0wLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4Njg3YjhlZmEKLTAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgICAyMTYwMCwgMHhjZDcyNjIyMAotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgIDIxNjAwLCAweGExNzY2NTk4Ci0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZmY0YjgwNzQKLTAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgICAyMTYwMCwgMHg4NDUwOThmYwotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgIDIxNjAwLCAweGRiMjU5ZTA4Ci0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4YjZiZGE1YTAKLTAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgICAyMTYwMCwgMHhiYjk5ODk2MgotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgIDIxNjAwLCAweDI4YWE3YjdjCi0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MWFkMWExNWMKLTAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgICAyMTYwMCwgMHhiNTM1YTEyOAotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgIDIxNjAwLCAweDRkYmY5NjhhCi0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZmU5MGE4ZDYKLTAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgICAyMTYwMCwgMHhmNjNmYWJmMAotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgIDIxNjAwLCAweGQ2ZmFiZTU4Ci0wLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MTcyZWIwOWMKLTAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgICAyMTYwMCwgMHg0NGY4YThmZQotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgIDIxNjAwLCAweDI5NDI5YTA2Ci0wLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YjEyZjhjYzQKLTAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgICAyMTYwMCwgMHhkMGM3OGNiNAotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgIDIxNjAwLCAweDk3ZTE3ZTBjCi0wLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZjhhYzY3MDAKLTAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgICAyMTYwMCwgMHhmOWMxN2M5NAotMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgIDIxNjAwLCAweGIxMGU4YzU0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9pbmRlbzMtMSBiL3Rlc3RzL3JlZi9mYXRlL2luZGVvMy0xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NmU1MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9pbmRlbzMtMQpAQCAtMCwwICsxLDQ1IEBACisjdGIgMDogMS8xMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDEyMAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyMTYwMCwgMHg4NDUwOThmYworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDIxNjAwLCAweGMyOGU4YmYwCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4MmY0MThmYjQKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAyMTYwMCwgMHgwNTFkN2EwZQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgIDIxNjAwLCAweDFiMzZhYTdjCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YjllMmFkMzgKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgICAyMTYwMCwgMHg4ZGM5OWI2MAorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgIDIxNjAwLCAweGEzZmE3ODlhCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MWZkYmFkZTIKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgICAyMTYwMCwgMHg0ZjRhYzE2NAorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgIDIxNjAwLCAweDBlYTVjYjUwCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZmI2NTk1MjgKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgICAyMTYwMCwgMHhhYzU3OTBmOAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgIDIxNjAwLCAweDk3NjJiZWI0CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAgMjE2MDAsIDB4MjliMGRhMGEKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgICAyMTYwMCwgMHg2ZDg4YjBkYQorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgIDIxNjAwLCAweDY4N2I4ZWZhCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAgMjE2MDAsIDB4Y2Q3MjYyMjAKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgICAyMTYwMCwgMHhhMTc2NjU5OAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgIDIxNjAwLCAweGZmNGI4MDc0CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ODQ1MDk4ZmMKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgICAyMTYwMCwgMHhkYjI1OWUwOAorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgIDIxNjAwLCAweGI2YmRhNWEwCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAgMjE2MDAsIDB4YmI5OTg5NjIKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgICAyMTYwMCwgMHgyOGFhN2I3YworMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgIDIxNjAwLCAweDFhZDFhMTVjCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAgMjE2MDAsIDB4YjUzNWExMjgKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgICAyMTYwMCwgMHg0ZGJmOTY4YQorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgIDIxNjAwLCAweGZlOTBhOGQ2CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZjYzZmFiZjAKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgICAyMTYwMCwgMHhkNmZhYmU1OAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgIDIxNjAwLCAweDE3MmViMDljCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4NDRmOGE4ZmUKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgICAyMTYwMCwgMHgyOTQyOWEwNgorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgIDIxNjAwLCAweGIxMmY4Y2M0CiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZDBjNzhjYjQKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgICAyMTYwMCwgMHg5N2UxN2UwYworMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgIDIxNjAwLCAweGY4YWM2NzAwCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZjljMTdjOTQKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgICAyMTYwMCwgMHhiMTBlOGM1NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaW5kZW8zLTIgYi90ZXN0cy9yZWYvZmF0ZS9pbmRlbzMtMgppbmRleCA3MDJkMDZiLi43OGUxNDVlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9pbmRlbzMtMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9pbmRlbzMtMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAyMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDE4OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA2NzY4MCwgMHg1MzJhNGM0MAogMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgIDY3NjgwLCAweDYzZDI3NTdhCiAwLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAgNjc2ODAsIDB4YjFkY2Y3ZDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2luZGVvNCBiL3Rlc3RzL3JlZi9mYXRlL2luZGVvNAppbmRleCA3ZjYwNDYxLi4wYTJiMDUxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9pbmRlbzQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaW5kZW80CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgODY0MDAsIDB4OThmNWU0MjIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA4NjQwMCwgMHgxODY0Y2IwNgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDg2NDAwLCAweGIwOTUzMmVmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9pbmRlbzUgYi90ZXN0cy9yZWYvZmF0ZS9pbmRlbzUKaW5kZXggN2I5MTIzOC4uNmJlMjgxOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaW5kZW81CisrKyBiL3Rlc3RzL3JlZi9mYXRlL2luZGVvNQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNDB4MTgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ4NjAwLCAweDcyZDQxOTNiCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNDg2MDAsIDB4MzZhYmQ2ZjMKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICA0ODYwMCwgMHg5OWU1ODJmNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaW50ZXJwbGF5LW12ZS0xNmJpdCBiL3Rlc3RzL3JlZi9mYXRlL2ludGVycGxheS1tdmUtMTZiaXQKaW5kZXggYjIwZTk5OC4uYzFlYzFjYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvaW50ZXJwbGF5LW12ZS0xNmJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9pbnRlcnBsYXktbXZlLTE2Yml0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDQxNy8xMjUwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDMyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDYxNDQwMCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNjE0NDAwLCAweDAwMDAwMDAwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA2MTQ0MDAsIDB4M2M0Y2UwMTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2ludGVycGxheS1tdmUtOGJpdCBiL3Rlc3RzL3JlZi9mYXRlL2ludGVycGxheS1tdmUtOGJpdAppbmRleCBiMzdiZDZlLi42ZmI1YWYzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9pbnRlcnBsYXktbXZlLThiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaW50ZXJwbGF5LW12ZS04Yml0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDgzNDEvMTI1MDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA0MzJ4MzIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNDE0NzIwLCAweDI1ODBkNTc0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA0MTQ3MjAsIDB4OTdmNTVjZDMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDQxNDcyMCwgMHg5NDA4ZmI2MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvaXNjYyBiL3Rlc3RzL3JlZi9mYXRlL2lzY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxYmI0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2lzY2MKQEAgLTAsMCArMSwxMCBAQAorI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NjB4OTY4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA2ODE0NzIwLCAweDEzNjVmOGVmCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDY4MTQ3MjAsIDB4OTA4Mzg5ODMKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgNjgxNDcyMCwgMHhmMGNjMzEzMQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICA2ODE0NzIwLCAweGMwN2U0MDRkCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDY4MTQ3MjAsIDB4OTQ1OTYyZGQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2l2OC1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL2l2OC1kZW11eAppbmRleCAwMmI2MzE0Li41MThmM2RlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9pdjgtZGVtdXgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvaXY4LWRlbXV4CkBAIC0xLDI3ICsxLDMxIEBACiAjZXh0cmFkYXRhIDA6ICAgICAgIDE5LCAweDFmMjYwNGI5CiAjdGIgMDogMS85MDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBtcGVnNAorI2RpbWVuc2lvbnMgMDogNzA0eDU3NgorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAwLCAgICAyMDg4MywgMHgzNDcxOTFlMgotMCwgICAgICAgICAgMCwgICAgICAgMzYwMCwgICAgICAgIDAsICAgIDIwODgyLCAweGUxNTczOTA1Ci0wLCAgICAgICAzNjAwLCAgICAgICA3MjAwLCAgICAgICAgMCwgICAgMjA4OTQsIDB4ZDU0ZjUxNmEKLTAsICAgICAgIDcyMDAsICAgICAgMTA4MDAsICAgICAgICAwLCAgICAyMDg5MSwgMHgxYjVjNTAzOQotMCwgICAgICAxMDgwMCwgICAgICAxNDQwMCwgICAgICAgIDAsICAgIDIwODgzLCAweDhlNzg1YjRkCi0wLCAgICAgIDE0NDAwLCAgICAgIDE4MDAwLCAgICAgICAgMCwgICAgMjA4NzAsIDB4ZDI2Y2ExZjYKLTAsICAgICAgMTgwMDAsICAgICAgMjE2MDAsICAgICAgICAwLCAgICAyMTQ0OCwgMHg5NDZmNWIyYgotMCwgICAgICAyMTYwMCwgICAgICAyNTIwMCwgICAgICAgIDAsICAgIDIxNDMzLCAweGIxODY4N2M1Ci0wLCAgICAgIDI1MjAwLCAgICAgIDI4ODAwLCAgICAgICAgMCwgICAgMjA4NjUsIDB4YzBlYjNmY2UKLTAsICAgICAgMjg4MDAsICAgICAgMzIzOTksICAgICAgICAwLCAgICAyMDg0MiwgMHg5ZDA3MjhiYQotMCwgICAgICAzMjM5OSwgICAgICAzNTk5OSwgICAgICAgIDAsICAgIDIwODc4LCAweGY2MGY1ZGVlCi0wLCAgICAgIDM1OTk5LCAgICAgIDM5NjAwLCAgICAgICAgMCwgICAgMjA4NjYsIDB4M2JkZTU2OGYKLTAsICAgICAgMzk2MDAsICAgICAgNDMyMDAsICAgICAgICAwLCAgICAyMDg4NCwgMHgyMjczNjk5MwotMCwgICAgICA0MzIwMCwgICAgICA0NjgwMCwgICAgICAgIDAsICAgIDIwODYwLCAweGY1NmYyZmNhCi0wLCAgICAgIDQ2ODAwLCAgICAgIDUwNDAwLCAgICAgICAgMCwgICAgMjA4NzIsIDB4ZjM5ZTNjYjMKLTAsICAgICAgNTA0MDAsICAgICAgNTM5OTksICAgICAgICAwLCAgICAyMDgzNSwgMHhhM2M0MzYzYgotMCwgICAgICA1Mzk5OSwgICAgICA1NzYwMCwgICAgICAgIDAsICAgIDIwOTA1LCAweDU1Mjg1M2QxCi0wLCAgICAgIDU3NjAwLCAgICAgIDYxMjAwLCAgICAgICAgMCwgICAgMjA4NzQsIDB4ZWQwYjkxZWMKLTAsICAgICAgNjEyMDAsICAgICAgNjQ3OTksICAgICAgICAwLCAgICAyMDg3NywgMHhlMTYyM2UwMQotMCwgICAgICA2NDc5OSwgICAgICA2ODM5OSwgICAgICAgIDAsICAgIDIwOTMzLCAweDE5OTA2NTY0Ci0wLCAgICAgIDY4Mzk5LCAgICAgIDcyMDAwLCAgICAgICAgMCwgICAgMjA4OTEsIDB4M2QwNjRmZDMKLTAsICAgICAgNzIwMDAsICAgICAgNzU2MDAsICAgICAgICAwLCAgICAyMDgzNCwgMHhjYjc3NGRiYwotMCwgICAgICA3NTYwMCwgICAgICA3OTIwMCwgICAgICAgIDAsICAgIDIwODcwLCAweGJjNTM2NTg5Ci0wLCAgICAgIDc5MjAwLCAgICAgIDgyODAwLCAgICAgICAgMCwgICAgMjE0MjEsIDB4Yzk5YTY4ZTQKLTAsICAgICAgODI4MDAsICAgICAgODY0MDAsICAgICAgICAwLCAgICAxMjg2OSwgMHg1Njg0ZTMwNAorMCwgICAgICAgMzYwMCwgICAgICAgMzYwMCwgICAgICAgIDAsICAgIDIwODgyLCAweGUxNTczOTA1CiswLCAgICAgICA3MjAwLCAgICAgICA3MjAwLCAgICAgICAgMCwgICAgMjA4OTQsIDB4ZDU0ZjUxNmEKKzAsICAgICAgMTA4MDAsICAgICAgMTA4MDAsICAgICAgICAwLCAgICAyMDg5MSwgMHgxYjVjNTAzOQorMCwgICAgICAxNDQwMCwgICAgICAxNDQwMCwgICAgICAgIDAsICAgIDIwODgzLCAweDhlNzg1YjRkCiswLCAgICAgIDE4MDAwLCAgICAgIDE4MDAwLCAgICAgICAgMCwgICAgMjA4NzAsIDB4ZDI2Y2ExZjYKKzAsICAgICAgMjE2MDAsICAgICAgMjE2MDAsICAgICAgICAwLCAgICAyMTQ0OCwgMHg5NDZmNWIyYgorMCwgICAgICAyNTIwMCwgICAgICAyNTIwMCwgICAgICAgIDAsICAgIDIxNDMzLCAweGIxODY4N2M1CiswLCAgICAgIDI4ODAwLCAgICAgIDI4ODAwLCAgICAgICAgMCwgICAgMjA4NjUsIDB4YzBlYjNmY2UKKzAsICAgICAgMzIzOTksICAgICAgMzIzOTksICAgICAgICAwLCAgICAyMDg0MiwgMHg5ZDA3MjhiYQorMCwgICAgICAzNTk5OSwgICAgICAzNTk5OSwgICAgICAgIDAsICAgIDIwODc4LCAweGY2MGY1ZGVlCiswLCAgICAgIDM5NjAwLCAgICAgIDM5NjAwLCAgICAgICAgMCwgICAgMjA4NjYsIDB4M2JkZTU2OGYKKzAsICAgICAgNDMyMDAsICAgICAgNDMyMDAsICAgICAgICAwLCAgICAyMDg4NCwgMHgyMjczNjk5MworMCwgICAgICA0NjgwMCwgICAgICA0NjgwMCwgICAgICAgIDAsICAgIDIwODYwLCAweGY1NmYyZmNhCiswLCAgICAgIDUwNDAwLCAgICAgIDUwNDAwLCAgICAgICAgMCwgICAgMjA4NzIsIDB4ZjM5ZTNjYjMKKzAsICAgICAgNTM5OTksICAgICAgNTM5OTksICAgICAgICAwLCAgICAyMDgzNSwgMHhhM2M0MzYzYgorMCwgICAgICA1NzYwMCwgICAgICA1NzYwMCwgICAgICAgIDAsICAgIDIwOTA1LCAweDU1Mjg1M2QxCiswLCAgICAgIDYxMjAwLCAgICAgIDYxMjAwLCAgICAgICAgMCwgICAgMjA4NzQsIDB4ZWQwYjkxZWMKKzAsICAgICAgNjQ3OTksICAgICAgNjQ3OTksICAgICAgICAwLCAgICAyMDg3NywgMHhlMTYyM2UwMQorMCwgICAgICA2ODM5OSwgICAgICA2ODM5OSwgICAgICAgIDAsICAgIDIwOTMzLCAweDE5OTA2NTY0CiswLCAgICAgIDcyMDAwLCAgICAgIDcyMDAwLCAgICAgICAgMCwgICAgMjA4OTEsIDB4M2QwNjRmZDMKKzAsICAgICAgNzU2MDAsICAgICAgNzU2MDAsICAgICAgICAwLCAgICAyMDgzNCwgMHhjYjc3NGRiYworMCwgICAgICA3OTIwMCwgICAgICA3OTIwMCwgICAgICAgIDAsICAgIDIwODcwLCAweGJjNTM2NTg5CiswLCAgICAgIDgyODAwLCAgICAgIDgyODAwLCAgICAgICAgMCwgICAgMjE0MjEsIDB4Yzk5YTY4ZTQKKzAsICAgICAgODY0MDAsICAgICAgODY0MDAsICAgICAgICAwLCAgICAxMjg2OSwgMHg1Njg0ZTMwNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvanBlZzIwMDAtZGNpbmVtYSBiL3Rlc3RzL3JlZi9mYXRlL2pwZWcyMDAwLWRjaW5lbWEKaW5kZXggMDhiYmZkYy4uY2RmOGNkNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvanBlZzIwMDAtZGNpbmVtYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9qcGVnMjAwMC1kY2luZW1hCkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMjQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAxMjQ0MTYwMCwgMHhmY2Y2YTEyNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsIDEyNDQxNjAwLCAweDU3N2I2YTY0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9qcGctMTJicHAgYi90ZXN0cy9yZWYvZmF0ZS9qcGctMTJicHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNjNjYyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2pwZy0xMmJwcApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA5OTl4NzQ5Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxNDk2NTAyLCAweGQ5MWRlYjRiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9qcGctamZpZiBiL3Rlc3RzL3JlZi9mYXRlL2pwZy1qZmlmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDEzZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9qcGctamZpZgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4MDd4NTM4Cisjc2FyIDA6IDcyLzcyCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2NTE1MTgsIDB4NTBmYWE1YWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2p2IGIvdGVzdHMvcmVmL2ZhdGUvanYKaW5kZXggYjBhNjAwOC4uZDkwZmUyNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvanYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvanYKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMi8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5MjAwMCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTkyMDAwLCAweDMzMWIxYzEyCiAwLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxOTIwMDAsIDB4YzJmYTJkODkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2p2LWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvanYtZGVtdXgKaW5kZXggNTE2MzhkZi4uYmY4MjExMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvanYtZGVtdXgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvanYtZGVtdXgKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDIvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDoganYKKyNkaW1lbnNpb25zIDA6IDMyMHgyMDAKKyNzYXIgMDogMC8xCiAjdGIgMTogMS8yMjA1MAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fdTgKKyNzYW1wbGVfcmF0ZSAxOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgICAgNiwgMHgwMDBhMDAwMwogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAxMzEwNzIsICAgMTMxMDcyLCAweDE0YzY2NGQ2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICA3NzMsIDB4MTE4MDJhNTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2tndjEgYi90ZXN0cy9yZWYvZmF0ZS9rZ3YxCmluZGV4IDRmNDc1YmIuLmEzNjQ5YmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2tndjEKKysrIGIvdGVzdHMvcmVmL2ZhdGUva2d2MQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzYwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUzNjAwLCAweDAwMDAwMDAwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTM2MDAsIDB4MDAwMDAwMDAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE1MzYwMCwgMHgwMDAwMDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUva212YyBiL3Rlc3RzL3JlZi9mYXRlL2ttdmMKaW5kZXggOGE3MzNiYi4uOWM3Njg2YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUva212YworKysgYi90ZXN0cy9yZWYvZmF0ZS9rbXZjCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgxNjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTM2MDAsIDB4MDAwMDAwMDAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MzYwMCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUzNjAwLCAweDAwMDAwMDAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC1yZWQgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC1yZWQKaW5kZXggYjVmYjk2Yi4uMGUwNjVkNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgtcmVkCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXJlZApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweDY3ZGZlNTc2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4NjdkZmU1NzYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIzMDQwMCwgMHg2N2RmZTU3NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgtcmdiMjQgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC1yZ2IyNAppbmRleCAxZWIyYmM0Li42MzI1MGM2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC1yZ2IyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC1yZ2IyNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDgweDI1NgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDM2ODY0MCwgMHgyNmY3NGRiMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzY4NjQwLCAweDYzYjI5ZWE0CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzNjg2NDAsIDB4MTk0NjdmMDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXJnYjMyIGIvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgtcmdiMzIKaW5kZXggNDkwZTJlNS4uOGE0YzRkMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgtcmdiMzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgtcmdiMzIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTAwMS8yNDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTM4MjQwMCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxMzgyNDAwLCAweDAwMDAwMDAwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDEzODI0MDAsIDB4MDAwMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXRpY2tldDQxMTkgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC10aWNrZXQ0MTE5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmVmMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC10aWNrZXQ0MTE5CkBAIC0wLDAgKzEsOCBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHgzNjAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC10aWNrZXQ0MTE5LWNmciBiL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXRpY2tldDQxMTktY2ZyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNGZlNDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC10aWNrZXQ0MTE5LWNmcgpAQCAtMCwwICsxLDc5IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDM2MAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKKzAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YworMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCiswLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKKzAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YworMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKKzAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YworMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCiswLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKKzAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YworMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKKzAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YworMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKKzAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YworMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKKzAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YworMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCiswLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKKzAsICAgICAgICAgNzIsICAgICAgICAgNzIsICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YworMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC10aWNrZXQ0MTE5LWRyb3AgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC10aWNrZXQ0MTE5LWRyb3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJjNThkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXRpY2tldDQxMTktZHJvcApAQCAtMCwwICsxLDggQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4MzYwCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNjkxMjAwLCAweDAwMDAwMDAwCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2OTEyMDAsIDB4Yzg4YTZmMjQKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDY5MTIwMCwgMHg5MDZkNDc0YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgtdGlja2V0NDExOS1wYXNzIGIvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgtdGlja2V0NDExOS1wYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmVmMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC10aWNrZXQ0MTE5LXBhc3MKQEAgLTAsMCArMSw4IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDM2MAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDY5MTIwMCwgMHgwMDAwMDAwMAorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNjkxMjAwLCAweGM4OGE2ZjI0CiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICA2OTEyMDAsIDB4OTA2ZDQ3NGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXRpY2tldDQxMTktdmZyIGIvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgtdGlja2V0NDExOS12ZnIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2ZWYwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXRpY2tldDQxMTktdmZyCkBAIC0wLDAgKzEsOCBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHgzNjAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2OTEyMDAsIDB4MDAwMDAwMDAKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDY5MTIwMCwgMHhjODhhNmYyNAorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgNjkxMjAwLCAweDkwNmQ0NzRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC15dXkyIGIvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgteXV5MgppbmRleCBjNWFlZDkyLi42NGEyMTFlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC15dXkyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXl1eTIKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8xMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTAyNHg3NjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDE1NzI4NjQsIDB4ZWVkNzZhN2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXl2MTIgYi90ZXN0cy9yZWYvZmF0ZS9sYWdhcml0aC15djEyCmluZGV4IGM5YzlmZjMuLmE3OWEzYmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL2xhZ2FyaXRoLXl2MTIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbGFnYXJpdGgteXYxMgpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxLzYwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDkyMTYwLCAweDFkZmRmNWMxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgOTIxNjAsIDB4Njk2NTg4NGYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2xmZyBiL3Rlc3RzL3JlZi9mYXRlL2xmZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDAwZjRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbGZnCkBAIC0wLDAgKzEsMTAwNyBAQAorUFJOMCA6IDk5My45ODU0NTkKK1BSTjEgOiAxMDMzLjk4NzQzNQorUFJOMiA6IDEwNDcuNjYyNTcwCitQUk4zIDogMTA2My45MTIyNTAKK1BSTjQgOiA5OTEuMTcxNzgxCitQUk41IDogOTgxLjczNDcwOAorUFJONiA6IDk3MC4zNjExNzkKK1BSTjcgOiA5OTguNTk5NDEwCitQUk44IDogMTAwMS41NjIxMDgKK1BSTjkgOiAxMDk0LjY3NTI4NgorUFJOMTAgOiAxMDI2LjczMDczMworUFJOMTEgOiAxMDAxLjc5NDY2MgorUFJOMTIgOiAxMDYzLjk5Mjk2MgorUFJOMTMgOiAxMDAzLjE3NjI5MQorUFJOMTQgOiA5NzUuNDUxNDE4CitQUk4xNSA6IDk2My4xNjQyNzIKK1BSTjE2IDogMTAzNS4wNDI5NjQKK1BSTjE3IDogOTM2LjI4OTIyMQorUFJOMTggOiAxMDMxLjY5NjA2MQorUFJOMTkgOiAxMDMzLjk2MDg4MgorUFJOMjAgOiA5NzAuNDQ5MDg4CitQUk4yMSA6IDkxMC43NDIwMDkKK1BSTjIyIDogMTA2Mi44MzI4MzcKK1BSTjIzIDogOTcyLjMxNTAzNQorUFJOMjQgOiAxMDk0LjU1MzMwMgorUFJOMjUgOiAxMDA0LjM2NjA2MQorUFJOMjYgOiAxMDY3Ljk0MDk2NworUFJOMjcgOiA5NTQuNzYzMzQwCitQUk4yOCA6IDkyMy4wODkyNjMKK1BSTjI5IDogMTA1My4yODYyMjIKK1BSTjMwIDogMTAxMi42Mzk4ODcKK1BSTjMxIDogOTQ4LjU2ODE0OQorUFJOMzIgOiAxMDI3LjMzOTM2MgorUFJOMzMgOiA5NTMuMDgwNDI2CitQUk4zNCA6IDEwMzUuNDI1MTA2CitQUk4zNSA6IDk2Ni45NzY3NDAKK1BSTjM2IDogMTA2NC44NDE2NTcKK1BSTjM3IDogOTA0LjcxNDc0MAorUFJOMzggOiAxMDU0LjExMjIzMQorUFJOMzkgOiA5ODYuMDg0NDU0CitQUk40MCA6IDk2NC45OTUxMzQKK1BSTjQxIDogMTA2NC44OTg0MTUKK1BSTjQyIDogMTA0OS4zODU4NjAKK1BSTjQzIDogOTQ2LjAxMDY2NAorUFJONDQgOiA5MTQuNTYzNTIwCitQUk40NSA6IDEwNTQuMDU3Nzk4CitQUk40NiA6IDkyMS4wMDcyNjYKK1BSTjQ3IDogMTA1NS42MDA1NzUKK1BSTjQ4IDogOTg0LjAwMzI4NQorUFJONDkgOiAxMDY0LjQ3OTA0NAorUFJONTAgOiA5ODkuMTI4OTM2CitQUk41MSA6IDk3Mi43NzI0ODYKK1BSTjUyIDogMTAyOC44MjQ1MjcKK1BSTjUzIDogOTQ4Ljk5OTM5MgorUFJONTQgOiA5MjYuOTgyNTEyCitQUk41NSA6IDEwMjguMTA3MjY5CitQUk41NiA6IDEwMTguOTcxMjkyCitQUk41NyA6IDk3OS4wNDkxNTkKK1BSTjU4IDogMTA3OC42NTI5MzAKK1BSTjU5IDogMTA1OS4yNjg3ODUKK1BSTjYwIDogOTY2LjA2MjMwMgorUFJONjEgOiA5NTIuMjk4MjQ5CitQUk42MiA6IDk2NS40ODQ2NTkKK1BSTjYzIDogOTU3LjEzMTI5OAorUFJONjQgOiAxMTAxLjYzMTQ4MworUFJONjUgOiA5OTEuMzI4MjA3CitQUk42NiA6IDk0Ny44NjgwNzEKK1BSTjY3IDogOTc3LjMyOTczNgorUFJONjggOiAxMDM5Ljg2MDAyNgorUFJONjkgOiAxMDA1LjM1NzY0MQorUFJONzAgOiA5MjYuNTI0NzU0CitQUk43MSA6IDEwNjUuMzM3MTEwCitQUk43MiA6IDEwMTYuMjY2NTAwCitQUk43MyA6IDEwMDUuNzcxMTE1CitQUk43NCA6IDEwMTMuMzQyMjYwCitQUk43NSA6IDEwMTYuNDIxMTU3CitQUk43NiA6IDkxOC44NTc4NDYKK1BSTjc3IDogMTA4NC4xMjY0MDYKK1BSTjc4IDogMTAxMy4yNzMxOTcKK1BSTjc5IDogMTAwOS44NTk2OTkKK1BSTjgwIDogOTUzLjk3ODI3NgorUFJOODEgOiA5NjYuMTk1MzgxCitQUk44MiA6IDk2Ni4wNDE1MjYKK1BSTjgzIDogMTAzNC4zMTM5MzUKK1BSTjg0IDogMTAyOC4wMDY1MDIKK1BSTjg1IDogOTg4LjY2Nzk5NAorUFJOODYgOiA5NTEuNDQ3MjQzCitQUk44NyA6IDk1MC4xOTc0MDEKK1BSTjg4IDogMTAwNC40OTI4NjcKK1BSTjg5IDogMTAxOC43MjY1NDkKK1BSTjkwIDogMTAwMi4xMzUzODMKK1BSTjkxIDogMTAxNS41NTMyMjMKK1BSTjkyIDogOTY4LjgyNTYzOAorUFJOOTMgOiA5MDkuMjUxNjI5CitQUk45NCA6IDkyNy40MzAyMDAKK1BSTjk1IDogMTAyNi44MzkxNzMKK1BSTjk2IDogMTAwMS4yMDk3MzIKK1BSTjk3IDogOTAzLjk5NzM3MgorUFJOOTggOiAxMDI5LjU4Mjg1MworUFJOOTkgOiA5OTguMjIxNTg4CitQUk4xMDAgOiA4NzQuNTMzMzY4CitQUk4xMDEgOiAxMDA4LjE1ODcyNworUFJOMTAyIDogMTA2NC4xMzAwOTcKK1BSTjEwMyA6IDEwMjAuNDI1NDI5CitQUk4xMDQgOiA5MTQuOTA0NTkxCitQUk4xMDUgOiAxMDUwLjcxMTk2MAorUFJOMTA2IDogMTAxOS40OTE1ODUKK1BSTjEwNyA6IDk2OC4wNjIzMDUKK1BSTjEwOCA6IDk0Ni43NTUzODgKK1BSTjEwOSA6IDEwMTIuNTA4NzA1CitQUk4xMTAgOiA5OTcuOTIyNjI0CitQUk4xMTEgOiA5NjIuNDQ3MjY1CitQUk4xMTIgOiAxMDY1LjQxMDQ5NgorUFJOMTEzIDogMTA1OS40NzA3OTAKK1BSTjExNCA6IDEwMzYuNDI3Nzg5CitQUk4xMTUgOiA5NjMuNTE2MzUxCitQUk4xMTYgOiA5NzAuMDAwOTgyCitQUk4xMTcgOiA5NzguMDMwMjI2CitQUk4xMTggOiAxMDQxLjg4MzY4NworUFJOMTE5IDogOTI0LjMxMTc1OQorUFJOMTIwIDogOTg3LjU3NDc1NworUFJOMTIxIDogMTAyMC4xODg0NDEKK1BSTjEyMiA6IDk3OS4xMDk2MTYKK1BSTjEyMyA6IDEwNzYuNjUyOTYxCitQUk4xMjQgOiA5MDUuOTk0MDA5CitQUk4xMjUgOiA5OTkuNDI1MjgyCitQUk4xMjYgOiAxMDEyLjUyMTExMQorUFJOMTI3IDogODkzLjQ0MzQ0NworUFJOMTI4IDogOTc4LjU3ODMyNworUFJOMTI5IDogMTA2OC40NzY3MzIKK1BSTjEzMCA6IDk2MC42ODcxOTUKK1BSTjEzMSA6IDk1NC4yMTE0NDgKK1BSTjEzMiA6IDEwMzEuNTg3NjUxCitQUk4xMzMgOiAxMDY5LjU2MTMzNAorUFJOMTM0IDogOTQ4LjI5MzE2OAorUFJOMTM1IDogOTk5LjE4NTE5NQorUFJOMTM2IDogOTY3LjI4NDk3MAorUFJOMTM3IDogMTAwNC4xMTI4NjgKK1BSTjEzOCA6IDk4OS42ODMxNDkKK1BSTjEzOSA6IDEwMDguMTU0NjM5CitQUk4xNDAgOiAxMDQzLjk1Mzc0OAorUFJOMTQxIDogMTA4Mi4xMzEzNzkKK1BSTjE0MiA6IDEwMDYuNTI4NjExCitQUk4xNDMgOiA5NDIuODkzMDQwCitQUk4xNDQgOiAxMTIwLjA3Mjk3MAorUFJOMTQ1IDogOTA4LjM2OTI3MworUFJOMTQ2IDogMTAzOS4zMzgyMDcKK1BSTjE0NyA6IDEwMTEuNDI5MDU2CitQUk4xNDggOiAxMDU4LjAyMDM3NAorUFJOMTQ5IDogMTAwNy4zNDYyNzQKK1BSTjE1MCA6IDkxNi44MzAwMzIKK1BSTjE1MSA6IDEwMDAuMjM3MDA4CitQUk4xNTIgOiA5NzcuNDcwNjIyCitQUk4xNTMgOiA5ODUuMDY2NjkzCitQUk4xNTQgOiAxMDIwLjY3NTQ0OQorUFJOMTU1IDogMTAyNi4wNzQxOTkKK1BSTjE1NiA6IDEwODcuOTYxMzkwCitQUk4xNTcgOiA5OTMuODM2Njk4CitQUk4xNTggOiAxMDA4LjUxMDI2OAorUFJOMTU5IDogMTAxMy4zMzY1NzYKK1BSTjE2MCA6IDEwMjIuNjExMjExCitQUk4xNjEgOiA5OTYuMjExNTUwCitQUk4xNjIgOiAxMDI1Ljc3MjE1MgorUFJOMTYzIDogMTA1OC4yNjgwMTcKK1BSTjE2NCA6IDkxMS45OTc3ODcKK1BSTjE2NSA6IDEwNTIuNTU2NzIyCitQUk4xNjYgOiA5OTguNTM2MDk4CitQUk4xNjcgOiA5MTUuODM3NDEwCitQUk4xNjggOiA5NzkuMzEzMTM4CitQUk4xNjkgOiAxMDQ1LjY5MTE1MgorUFJOMTcwIDogMTAxOC44MzIzMjkKK1BSTjE3MSA6IDEwODYuOTU5MjkxCitQUk4xNzIgOiAxMDY1Ljg3NTU3NgorUFJOMTczIDogMTAxOC4zNDE0MzIKK1BSTjE3NCA6IDExMDEuNTExOTA2CitQUk4xNzUgOiAxMTMwLjE2NDQ2OAorUFJOMTc2IDogMTA0My4yMzI1NzQKK1BSTjE3NyA6IDEwODYuOTA3ODYzCitQUk4xNzggOiAxMDI1LjM3ODEzNgorUFJOMTc5IDogOTk5LjYwMTMyMworUFJOMTgwIDogMTAzNi43NzY3OTQKK1BSTjE4MSA6IDk4OC42NTMyNzIKK1BSTjE4MiA6IDk3My4yNzQ1MTgKK1BSTjE4MyA6IDEwMDAuODA3NjU1CitQUk4xODQgOiAxMDU3LjM4NjIxMQorUFJOMTg1IDogOTYwLjczNTAzNQorUFJOMTg2IDogOTA0Ljg3MjY0NQorUFJOMTg3IDogODg5LjExNzI4MAorUFJOMTg4IDogOTgzLjgwOTE4NgorUFJOMTg5IDogOTEyLjg3NDQxMQorUFJOMTkwIDogOTc1LjU4OTI2OQorUFJOMTkxIDogOTQ4LjQyMTk5OQorUFJOMTkyIDogOTQ3LjY1NzU2NgorUFJOMTkzIDogOTUwLjAwMDczOAorUFJOMTk0IDogOTYyLjkyMjU2MQorUFJOMTk1IDogMTAyNi4zMDE0ODgKK1BSTjE5NiA6IDEwMjkuMzUzODEyCitQUk4xOTcgOiAxMDQ3LjMwMzY3NAorUFJOMTk4IDogMTAyOC42OTU1NTcKK1BSTjE5OSA6IDEwNzAuMjAwNjMyCitQUk4yMDAgOiA5NDcuNTc1MTQ1CitQUk4yMDEgOiA4NzYuOTA0NjE2CitQUk4yMDIgOiAxMDE3LjcwMTQzMAorUFJOMjAzIDogMTA0OS4yNjc0OTgKK1BSTjIwNCA6IDk1OC4xMzk5NDgKK1BSTjIwNSA6IDk2Ny40MTczNzkKK1BSTjIwNiA6IDk2OC4yNzQxNDMKK1BSTjIwNyA6IDEwMDAuODY0Mzg4CitQUk4yMDggOiAxMDY2LjgwMjE4MQorUFJOMjA5IDogMTAxNC40NjMwNTEKK1BSTjIxMCA6IDEwMjYuNzk5ODcwCitQUk4yMTEgOiAxMDE4LjQ1MDgyNAorUFJOMjEyIDogOTg4LjYzMzk2MworUFJOMjEzIDogOTA0Ljc0OTExOQorUFJOMjE0IDogOTM3LjMyMzA1MgorUFJOMjE1IDogMTAzNy4zOTExNTgKK1BSTjIxNiA6IDEwMjYuMDk5MjgxCitQUk4yMTcgOiA5MDcuNjY3NjkxCitQUk4yMTggOiAxMDEwLjQ1NDc2NgorUFJOMjE5IDogMTAxOS40NzM0NjMKK1BSTjIyMCA6IDEwMDUuMTc3NTMwCitQUk4yMjEgOiA5OTcuMzYxNzU3CitQUk4yMjIgOiA5NTQuNjI4MjQ4CitQUk4yMjMgOiAxMDYxLjkxNzQ2MworUFJOMjI0IDogMTAzOS4zMTEwNDUKK1BSTjIyNSA6IDk4My44NDM5NDgKK1BSTjIyNiA6IDk2OC42Nzk0MjIKK1BSTjIyNyA6IDk3MC41MTg4NjMKK1BSTjIyOCA6IDk2My4wMzg5MjkKK1BSTjIyOSA6IDEwODYuMjEwMjkyCitQUk4yMzAgOiAxMDIyLjk2MTk0OAorUFJOMjMxIDogOTY0LjE0OTk2MQorUFJOMjMyIDogOTQ5LjQ2MjQyOAorUFJOMjMzIDogOTU5LjIyMTI3OQorUFJOMjM0IDogOTg3LjE1MTI5MworUFJOMjM1IDogOTU5LjAxNzY5NworUFJOMjM2IDogOTk2Ljg5MzY5MworUFJOMjM3IDogOTY1LjA2MzA5NAorUFJOMjM4IDogMTAwMC40NjgxMTYKK1BSTjIzOSA6IDEwMDQuNzU1ODc4CitQUk4yNDAgOiA5OTUuNjc0MjU2CitQUk4yNDEgOiA5OTYuNzIzNDU0CitQUk4yNDIgOiA5NjYuNzE0MzgxCitQUk4yNDMgOiA5OTIuNjAxNDYwCitQUk4yNDQgOiAxMDQxLjY1Njc3NgorUFJOMjQ1IDogMTA2MS42OTAxNTMKK1BSTjI0NiA6IDExMDMuNjUwNDU2CitQUk4yNDcgOiAxMDU1LjY2ODkyMgorUFJOMjQ4IDogMTA1Mi41ODIwOTIKK1BSTjI0OSA6IDk1My40NjE5MTcKK1BSTjI1MCA6IDEwMDYuNDMzMjg1CitQUk4yNTEgOiA5NTUuNjA2NzcyCitQUk4yNTIgOiAxMDM5LjY4ODA0MworUFJOMjUzIDogMTA4OC42NTM1OTEKK1BSTjI1NCA6IDk0Mi4wOTM5NjgKK1BSTjI1NSA6IDEwMzEuMDcxMTYxCitQUk4yNTYgOiA5NDYuMTEwMTQ4CitQUk4yNTcgOiA5MzIuNzYxODc0CitQUk4yNTggOiAxMDUyLjY5Mzk3NAorUFJOMjU5IDogMTAwOC40NzkzODEKK1BSTjI2MCA6IDEwNjMuNzIwODgxCitQUk4yNjEgOiA5OTIuNDc4NTQxCitQUk4yNjIgOiA5MTUuOTgxMDg5CitQUk4yNjMgOiA5OTIuMDI3MjgyCitQUk4yNjQgOiAxMDI0LjI2NjUzNQorUFJOMjY1IDogOTE5LjE2NTA2NQorUFJOMjY2IDogMTAxMC41MTY0NDAKK1BSTjI2NyA6IDk5Ny4yMTM5NjkKK1BSTjI2OCA6IDEwMjEuOTI1MjI1CitQUk4yNjkgOiA5NzguODgzMjc4CitQUk4yNzAgOiA5ODEuNTE1MTY2CitQUk4yNzEgOiA5ODAuMjgxODg2CitQUk4yNzIgOiAxMDUzLjE2MTA5MworUFJOMjczIDogOTEyLjUyMTIzMQorUFJOMjc0IDogOTUzLjEzMjEzMQorUFJOMjc1IDogMTAwNC42NDM4NDIKK1BSTjI3NiA6IDEwNTguNzk0MTg2CitQUk4yNzcgOiA5ODQuMjE1MTM4CitQUk4yNzggOiAxMDQyLjMwNDI3MAorUFJOMjc5IDogOTcyLjM4ODk3MworUFJOMjgwIDogMTAzMy4xODU1MzAKK1BSTjI4MSA6IDk2OS4xMzM0NDIKK1BSTjI4MiA6IDEwMjcuMTY5NzA3CitQUk4yODMgOiAxMDYxLjQ4MzMwNgorUFJOMjg0IDogOTYwLjY4MDg2OAorUFJOMjg1IDogMTAwMS4yNzI5MjkKK1BSTjI4NiA6IDEwMTcuODEzNjc0CitQUk4yODcgOiA5ODMuMzMxMDg1CitQUk4yODggOiA5MzIuMDUyMTU2CitQUk4yODkgOiAxMDA0LjM0ODY5MworUFJOMjkwIDogMTA4Ni45NjEwNTEKK1BSTjI5MSA6IDEwMzguMTgxMTQxCitQUk4yOTIgOiAxMDUwLjE5MTQwNAorUFJOMjkzIDogOTk3Ljc2Nzc3OAorUFJOMjk0IDogMTA4MC43OTc2NzMKK1BSTjI5NSA6IDk3Ni43ODI5OTEKK1BSTjI5NiA6IDEwMzEuNjMzNzIzCitQUk4yOTcgOiAxMDExLjEyODgwNgorUFJOMjk4IDogMTAwOC4zODA2NDAKK1BSTjI5OSA6IDEwODcuNTUyMjcyCitQUk4zMDAgOiA5NjIuNDg0MDY2CitQUk4zMDEgOiA5NDIuMzAxNjE5CitQUk4zMDIgOiA5ODMuMDM5NDY5CitQUk4zMDMgOiA5NjIuNjg5MDU2CitQUk4zMDQgOiA5NDcuMjk2MjMwCitQUk4zMDUgOiAxMDcwLjY2NjE1NAorUFJOMzA2IDogMTAzMi4xMTUzMjEKK1BSTjMwNyA6IDEwMjEuNTY3MzI0CitQUk4zMDggOiA5NTMuNTA2NDkwCitQUk4zMDkgOiAxMDAyLjAyNjY4MAorUFJOMzEwIDogMTAwOC4xODE4NjAKK1BSTjMxMSA6IDEwMjUuMzkyNjg0CitQUk4zMTIgOiA5NjguOTU1MDE5CitQUk4zMTMgOiAxMDQ5LjQ1ODg5MQorUFJOMzE0IDogOTU3LjY3Njk5MAorUFJOMzE1IDogMTAzNS42ODM1MTIKK1BSTjMxNiA6IDExMTIuMTMxMTc1CitQUk4zMTcgOiAxMDU1LjEzODkzMworUFJOMzE4IDogMTA3OC4yMzY4MTQKK1BSTjMxOSA6IDExMjUuNjkzODcyCitQUk4zMjAgOiAxMDIyLjEzMTE2NgorUFJOMzIxIDogMTExNi45OTc5NTcKK1BSTjMyMiA6IDEwODkuMTMxMDAwCitQUk4zMjMgOiAxMDc3LjE1OTI4OQorUFJOMzI0IDogOTQ1LjUzNjQzMgorUFJOMzI1IDogMTA3NS40MDQ2NTEKK1BSTjMyNiA6IDk0Ni40ODczMzIKK1BSTjMyNyA6IDEwMjQuMjU4ODcxCitQUk4zMjggOiAxMDMxLjIyNTg0MgorUFJOMzI5IDogMTAxNi43ODAyNTUKK1BSTjMzMCA6IDExMDMuOTEwOTM2CitQUk4zMzEgOiAxMDAwLjg0NjY5MQorUFJOMzMyIDogOTg0LjUzMjA4NworUFJOMzMzIDogMTAwNS4zMDY2NzMKK1BSTjMzNCA6IDExMTMuMDY3ODQwCitQUk4zMzUgOiA5NjQuNzg2NzA1CitQUk4zMzYgOiAxMDMxLjEyOTkwOQorUFJOMzM3IDogMTEwMi4wMzIyMjcKK1BSTjMzOCA6IDEwMzIuNDI3NTAwCitQUk4zMzkgOiA5MTUuMjg3OTQ4CitQUk4zNDAgOiAxMDY5LjUyMTQ2OAorUFJOMzQxIDogMTAzNy44ODQzMTEKK1BSTjM0MiA6IDEwMjIuNzgzMTcyCitQUk4zNDMgOiAxMDEwLjExMzg0MworUFJOMzQ0IDogOTM2LjY2MzgyMgorUFJOMzQ1IDogOTY3LjU2ODEzNAorUFJOMzQ2IDogOTk4LjI0ODUzMgorUFJOMzQ3IDogOTcwLjU5NTEwMworUFJOMzQ4IDogMTA1OS4xMzMwMTMKK1BSTjM0OSA6IDEwMDIuNDUwMzcyCitQUk4zNTAgOiAxMDQxLjU2OTI0NAorUFJOMzUxIDogMTA3MS4xNTE0NjcKK1BSTjM1MiA6IDEwNzQuNDMwODc5CitQUk4zNTMgOiAxMDI0LjE5MjUyMgorUFJOMzU0IDogMTAyNy4zMTYwOTgKK1BSTjM1NSA6IDkwMy44Mzc0MzcKK1BSTjM1NiA6IDEwMjUuMDg3OTgxCitQUk4zNTcgOiAxMDc4LjIzOTIwMQorUFJOMzU4IDogOTQ3LjE2MDc0NAorUFJOMzU5IDogOTQzLjc5MTg4MAorUFJOMzYwIDogOTgyLjQxOTM3OQorUFJOMzYxIDogMTAxNS4zMjY0MTMKK1BSTjM2MiA6IDkzMC40NTc2ODMKK1BSTjM2MyA6IDEwNTYuOTg5MTY0CitQUk4zNjQgOiAxMDQ4LjIxNDQxMQorUFJOMzY1IDogMTAxMS43MTQzMDkKK1BSTjM2NiA6IDk3My41NjE4ODUKK1BSTjM2NyA6IDkzOC44OTc0ODkKK1BSTjM2OCA6IDg5OC4xMzEzNTEKK1BSTjM2OSA6IDEwODkuNDIyMjI5CitQUk4zNzAgOiAxMDAwLjczNzI4NQorUFJOMzcxIDogOTQzLjE4NzYwOQorUFJOMzcyIDogOTgwLjYzMTM4NQorUFJOMzczIDogMTAyNi42MTI0NTYKK1BSTjM3NCA6IDkxNC41MzAwMjMKK1BSTjM3NSA6IDk4OS4xMzc0MzEKK1BSTjM3NiA6IDkzNi4wMTMwNjUKK1BSTjM3NyA6IDEwMzcuNDg0NzIxCitQUk4zNzggOiAxMDA1Ljc0MTA0MQorUFJOMzc5IDogMTA3OS4xMjE4NjYKK1BSTjM4MCA6IDEwNTUuMDMxMDU1CitQUk4zODEgOiA5NjcuNjQ3MTM5CitQUk4zODIgOiAxMDczLjg3NDkxMworUFJOMzgzIDogOTg3LjY3NjMxNAorUFJOMzg0IDogMTA2NC4yOTE0MTAKK1BSTjM4NSA6IDEwMzYuMDI5MzkzCitQUk4zODYgOiAxMDIxLjg4NTI0OQorUFJOMzg3IDogOTcxLjk1ODM4MAorUFJOMzg4IDogMTA2MC44MDcwNzYKK1BSTjM4OSA6IDk0NC41NTgzNDkKK1BSTjM5MCA6IDkzNi43OTExMjAKK1BSTjM5MSA6IDk4Ni4yMDM4NjIKK1BSTjM5MiA6IDkzNC44MTU0NzQKK1BSTjM5MyA6IDk1MC4xNzc4NjMKK1BSTjM5NCA6IDEwNTMuNTY2NTIwCitQUk4zOTUgOiA5NTUuNzE3MjExCitQUk4zOTYgOiA5MTQuNTYyNDk2CitQUk4zOTcgOiAxMDIxLjIzNzc0MQorUFJOMzk4IDogOTg1LjY2OTMzNQorUFJOMzk5IDogMTA0OS4yNjcwNTIKK1BSTjQwMCA6IDEwOTYuMjAxOTgxCitQUk40MDEgOiA4NzEuMjkwNDQ2CitQUk40MDIgOiAxMDU2Ljk0Mjc4OAorUFJONDAzIDogOTkxLjY4MDc3NworUFJONDA0IDogOTg3LjA5NDk5NQorUFJONDA1IDogMTAzMC44NTc1NzIKK1BSTjQwNiA6IDEwMTQuNzM4MTc0CitQUk40MDcgOiAxMTIyLjc4OTQyNAorUFJONDA4IDogMTA1Ny4zNzg3MTcKK1BSTjQwOSA6IDg1Mi42MzgyODQKK1BSTjQxMCA6IDk3OS4wMzQ5OTMKK1BSTjQxMSA6IDEwNTAuNzc2ODA1CitQUk40MTIgOiAxMDEzLjc2MDExOQorUFJONDEzIDogMTAxMy40NDIyODgKK1BSTjQxNCA6IDEwNTYuMzM1OTA3CitQUk40MTUgOiAxMDAzLjgzMzU4MgorUFJONDE2IDogOTUyLjI4NzM2OAorUFJONDE3IDogOTgzLjQxMDcxMQorUFJONDE4IDogOTgxLjYxMDIxNQorUFJONDE5IDogOTU1Ljc1MTM2NworUFJONDIwIDogMTAyNi4wMjQ0MDUKK1BSTjQyMSA6IDkxMy4yMTU0MDUKK1BSTjQyMiA6IDEwMzkuNTg3OTUyCitQUk40MjMgOiA5MzQuNDIwMzI3CitQUk40MjQgOiAxMDQ4LjA4NTE4OAorUFJONDI1IDogMTA2OS45ODQ5NzEKK1BSTjQyNiA6IDEwMjIuNTY5NjA1CitQUk40MjcgOiA5OTQuOTY3NzI5CitQUk40MjggOiA5NzguMjMxMTc0CitQUk40MjkgOiAxMDkxLjE5MTM2OAorUFJONDMwIDogMTExMC41NjU1MjUKK1BSTjQzMSA6IDk5My4wOTk2NDAKK1BSTjQzMiA6IDk0My4zNTY5MTYKK1BSTjQzMyA6IDEwMDguNTIwMzM3CitQUk40MzQgOiAxMDM5LjA1Nzk0OAorUFJONDM1IDogOTk1LjUxODcxMQorUFJONDM2IDogOTIzLjM4MTYzMAorUFJONDM3IDogMTAwOC41MjU5NTQKK1BSTjQzOCA6IDEwNzQuNzI1Nzg2CitQUk40MzkgOiA5NzMuODMxNDY1CitQUk40NDAgOiA5OTIuODUwNTExCitQUk40NDEgOiA5MTUuNTc0NzcyCitQUk40NDIgOiA5MzUuMjY4OTAxCitQUk40NDMgOiAxMDMwLjY2ODc2MQorUFJONDQ0IDogMTAwNi4zODk2MjQKK1BSTjQ0NSA6IDEwNzAuNTMyNTIwCitQUk40NDYgOiAxMDQ0LjE2MTA1OQorUFJONDQ3IDogMTAwOS44Njg5NzAKK1BSTjQ0OCA6IDk5NS40ODgxNzkKK1BSTjQ0OSA6IDEwMDMuNjc2OTYzCitQUk40NTAgOiAxMDM2LjI4MTQ0NworUFJONDUxIDogMTAzNC42NjM4NTAKK1BSTjQ1MiA6IDEwMTYuOTQwOTQ4CitQUk40NTMgOiAxMDQxLjc2MTQ0OQorUFJONDU0IDogMTAzNi4xNzkzMDgKK1BSTjQ1NSA6IDkyNy4xNDcwMjEKK1BSTjQ1NiA6IDEwMTUuMjY3NTE2CitQUk40NTcgOiAxMDI1LjEyMDYwMgorUFJONDU4IDogMTAwMy4wMTI4OTUKK1BSTjQ1OSA6IDEwMTcuNDA1Mzk4CitQUk40NjAgOiAxMDg0LjE1MjAxNQorUFJONDYxIDogOTM4LjEwMDU0NQorUFJONDYyIDogOTgyLjg0ODY4MgorUFJONDYzIDogOTcxLjIwODQzOQorUFJONDY0IDogMTAyNC4xNjk5MDIKK1BSTjQ2NSA6IDk4NC4wMjYxNjIKK1BSTjQ2NiA6IDg4NS43MzQ5NTIKK1BSTjQ2NyA6IDk3MC42NjI2NjUKK1BSTjQ2OCA6IDk2Ni42MjYzODMKK1BSTjQ2OSA6IDk3MC42MzA4OTUKK1BSTjQ3MCA6IDEwNjUuNzI5NTI2CitQUk40NzEgOiAxMDg3LjcyNTA1MQorUFJONDcyIDogOTM0LjY2MzY3NgorUFJONDczIDogOTgyLjMyNjY2MAorUFJONDc0IDogMTAyOC41NzM3OTYKK1BSTjQ3NSA6IDEwNDIuNjAyNzM2CitQUk40NzYgOiA5MTkuNjQ0MTI4CitQUk40NzcgOiAxMTE3LjU5MjUyOAorUFJONDc4IDogOTczLjcyNzc4NgorUFJONDc5IDogMTAxNy4wMzUzMDkKK1BSTjQ4MCA6IDk4NS45NDg1MDgKK1BSTjQ4MSA6IDk5My4zMzIyODQKK1BSTjQ4MiA6IDkxMy43ODMwMDYKK1BSTjQ4MyA6IDEwMzYuMjkyNjE0CitQUk40ODQgOiA5NDQuMzQ3MDc1CitQUk40ODUgOiA5OTMuNzc0NTIwCitQUk40ODYgOiAxMDA0LjUwMTczNworUFJONDg3IDogOTc1LjA3NDUxNgorUFJONDg4IDogOTYwLjM4MTcyMworUFJONDg5IDogMTAzMi40NjE5NzkKK1BSTjQ5MCA6IDk2NS44NDk4MzAKK1BSTjQ5MSA6IDk1OS4zNDM4NjUKK1BSTjQ5MiA6IDk5OC4zMDM1MTAKK1BSTjQ5MyA6IDEwOTguOTcyNDI5CitQUk40OTQgOiA5NzguNzc0NzMyCitQUk40OTUgOiA5MjMuNTg3NDA2CitQUk40OTYgOiA5MzQuMTk0NDY0CitQUk40OTcgOiAxMDE5LjIzMzcyNQorUFJONDk4IDogOTk4Ljk3ODQ3MAorUFJONDk5IDogOTY5LjE1MTA5MAorUFJONTAwIDogMTAwOC44NTA4NDQKK1BSTjUwMSA6IDEwMDIuNzExMTI2CitQUk41MDIgOiA5OTEuODcyNDQ5CitQUk41MDMgOiA5NDguOTk4NTEzCitQUk41MDQgOiA5ODUuNDgyOTM1CitQUk41MDUgOiAxMDY0LjM1NjY2NAorUFJONTA2IDogOTIwLjA4NTk4OQorUFJONTA3IDogOTU3LjkyNDk3NgorUFJONTA4IDogMTA1OS41ODY2NTcKK1BSTjUwOSA6IDk0OC45MTI0OTkKK1BSTjUxMCA6IDk2OS43MzQ5MjYKK1BSTjUxMSA6IDk5MS4xMjEwNDUKK1BSTjUxMiA6IDk4MC40MjU2NTEKK1BSTjUxMyA6IDEwMDIuMTA1ODgzCitQUk41MTQgOiAxMDQ0LjQyMDIyOQorUFJONTE1IDogMTA1MC4xMDgzODMKK1BSTjUxNiA6IDEwNTUuNjY2NTExCitQUk41MTcgOiAxMDUwLjU2Mjk5MworUFJONTE4IDogOTE4Ljk1NDEwMworUFJONTE5IDogMTAzMS4zOTg4ODEKK1BSTjUyMCA6IDEwMTUuNTMzMTU3CitQUk41MjEgOiA5ODIuMTEwMzQ4CitQUk41MjIgOiA5MTEuNjI1MTQwCitQUk41MjMgOiA5MDguMjYxNzA4CitQUk41MjQgOiA4OTIuNTE1MTAxCitQUk41MjUgOiA5OTkuMjcyNTk3CitQUk41MjYgOiAxMDYzLjUzNTc5NQorUFJONTI3IDogMTAwMS4wMzYwNTcKK1BSTjUyOCA6IDEwNTQuODkxMzU4CitQUk41MjkgOiA5NzAuNTEzMzkyCitQUk41MzAgOiAxMDA5Ljk1NzcxOQorUFJONTMxIDogOTk0LjA3NzcyMQorUFJONTMyIDogMTA5NC4xNTEwNjYKK1BSTjUzMyA6IDk4Ny4wMzk0OTgKK1BSTjUzNCA6IDk3My44MTEwNDcKK1BSTjUzNSA6IDk1OS44MzkxNTUKK1BSTjUzNiA6IDk2MS4zMjI5OTQKK1BSTjUzNyA6IDEwNTEuNTQ5ODg3CitQUk41MzggOiA5MzEuMDA2MTM4CitQUk41MzkgOiAxMDkwLjQ1MjI0MAorUFJONTQwIDogOTY3LjAzMzk2NgorUFJONTQxIDogOTkxLjQ1MTIxMQorUFJONTQyIDogMTA0Mi43ODg4MjUKK1BSTjU0MyA6IDEwNzUuOTEwMjc4CitQUk41NDQgOiAxMDA5LjIyNTAxMAorUFJONTQ1IDogMTAwNS42MzE1NjIKK1BSTjU0NiA6IDk3Mi41MjE1NDcKK1BSTjU0NyA6IDEwMDEuNzg4NDA2CitQUk41NDggOiAxMDI2LjA5NjI5MgorUFJONTQ5IDogOTQzLjUxNzY1MworUFJONTUwIDogMTA0My4yOTc5NzcKK1BSTjU1MSA6IDEwNjguNzM0OTAwCitQUk41NTIgOiA5NzEuNTI4OTA1CitQUk41NTMgOiAxMTAxLjczNjMwMAorUFJONTU0IDogMTA2NC45OTczNDcKK1BSTjU1NSA6IDEwMzYuMjU4ODIyCitQUk41NTYgOiA5MjEuMDM4NTI4CitQUk41NTcgOiAxMDA5LjMzMjU5MQorUFJONTU4IDogOTA4Ljc2NzM2OQorUFJONTU5IDogOTUwLjQzMjMxNgorUFJONTYwIDogMTAyNS44NDg4NTEKK1BSTjU2MSA6IDEwMjYuMjc1NDE4CitQUk41NjIgOiAxMDI3LjEzODE1OAorUFJONTYzIDogODkxLjAwODE2NAorUFJONTY0IDogOTY2LjYzNTMxNQorUFJONTY1IDogMTEwNS42OTQ5ODMKK1BSTjU2NiA6IDkwMS4xNjg2NTMKK1BSTjU2NyA6IDEwMDUuMDg1NjgwCitQUk41NjggOiA5ODYuMzc2NzgxCitQUk41NjkgOiAxMDIxLjk4ODcyOAorUFJONTcwIDogMTAzMi4wMzIzMDQKK1BSTjU3MSA6IDEwNjYuOTIyODQzCitQUk41NzIgOiA5NzguMTY1NzU5CitQUk41NzMgOiA5ODUuNDcxMDAzCitQUk41NzQgOiAxMDE4LjU0MjczOQorUFJONTc1IDogMTEwNC4yMTc2MDQKK1BSTjU3NiA6IDk5My4zNjY0MTEKK1BSTjU3NyA6IDkwOC40MjgxNjIKK1BSTjU3OCA6IDEwMzAuMTgxMjE1CitQUk41NzkgOiA5NTkuNjU0OTQ5CitQUk41ODAgOiAxMDAxLjk0Mzc0MQorUFJONTgxIDogMTAyNC44Mjk3NjIKK1BSTjU4MiA6IDkxMi4yMDcyNDIKK1BSTjU4MyA6IDEwMTYuMDkyMTI0CitQUk41ODQgOiA5NDQuNTE5NzUyCitQUk41ODUgOiAxMTE1LjYwNjQ5NgorUFJONTg2IDogODg0LjIyODU3MQorUFJONTg3IDogMTA4MC42ODQyOTYKK1BSTjU4OCA6IDEwMDAuNTQ0Mzg5CitQUk41ODkgOiAxMDE4LjI3NzUzMQorUFJONTkwIDogMTA2OS40NzY1MzMKK1BSTjU5MSA6IDk3Mi4zODA1MTUKK1BSTjU5MiA6IDk3OS4xNjI5NzMKK1BSTjU5MyA6IDEwNDAuNjUwNzE5CitQUk41OTQgOiA5NjIuMzc2OTIzCitQUk41OTUgOiA5MjkuMzAzMjczCitQUk41OTYgOiA5NzcuMjA4OTQyCitQUk41OTcgOiAxMDA5Ljg3NzI4NworUFJONTk4IDogOTQ2LjM2MTgyNQorUFJONTk5IDogOTM3LjM1ODg3MgorUFJONjAwIDogMTA0NS43MDY3MDEKK1BSTjYwMSA6IDEwMDEuMzUzMTY0CitQUk42MDIgOiAxMDcxLjY5MTYwNgorUFJONjAzIDogMTAyMC45NzE3MTQKK1BSTjYwNCA6IDk1Ny42MjM0MDQKK1BSTjYwNSA6IDk3MC44OTYzODIKK1BSTjYwNiA6IDk0MS40NDIyNDkKK1BSTjYwNyA6IDk0NS40MDY2ODQKK1BSTjYwOCA6IDk4MC45NzI0MjUKK1BSTjYwOSA6IDk2OS4xNzQ0MjQKK1BSTjYxMCA6IDEwMzEuODk0MDgxCitQUk42MTEgOiAxMDI5LjA5NTA0NgorUFJONjEyIDogOTU3LjUzNTc0NgorUFJONjEzIDogOTQzLjE4NjQ2MworUFJONjE0IDogOTU1LjA2NTM4MworUFJONjE1IDogOTg4LjkyNTc4MgorUFJONjE2IDogOTY5LjYwMzAyNQorUFJONjE3IDogOTc2LjMyMTkxNAorUFJONjE4IDogMTA4MS45ODIyNjAKK1BSTjYxOSA6IDEwMjEuMzgxMTEwCitQUk42MjAgOiA5NzguNTk0ODEzCitQUk42MjEgOiA5OTEuNTIyNTk5CitQUk42MjIgOiAxMDU2LjIyMTM0NgorUFJONjIzIDogMTAwNS4yNjEwMDMKK1BSTjYyNCA6IDkzOC40MzcyNTMKK1BSTjYyNSA6IDEwMDUuOTUyMDkyCitQUk42MjYgOiAxMDM0LjEzMTg0NQorUFJONjI3IDogMTAyNi4wMDAzOTcKK1BSTjYyOCA6IDEwNTYuNTA2Nzk4CitQUk42MjkgOiAxMDA3Ljg4Mzc4MgorUFJONjMwIDogOTQ4LjgwNTYyMAorUFJONjMxIDogOTI2LjAzMzQzMgorUFJONjMyIDogOTI5LjY4Mzk3MQorUFJONjMzIDogMTA4NC41NDk3NzAKK1BSTjYzNCA6IDkzOS45OTUxMjYKK1BSTjYzNSA6IDEwMTcuMzI5MDg3CitQUk42MzYgOiA5MjkuNzM0NzkzCitQUk42MzcgOiA5NjguOTQ3ODM1CitQUk42MzggOiA5OTIuNTQzNzg3CitQUk42MzkgOiAxMDUxLjQzOTYwNQorUFJONjQwIDogOTYyLjIxNTEyMworUFJONjQxIDogOTM0LjY2OTI3OQorUFJONjQyIDogODczLjE5MTk3OQorUFJONjQzIDogOTc4LjE1NjI3NgorUFJONjQ0IDogMTAzNi4xNjk0NDAKK1BSTjY0NSA6IDEwMDkuMTIzMTIyCitQUk42NDYgOiAxMDQyLjY5Njc4NworUFJONjQ3IDogMTAwNC45OTI0NzQKK1BSTjY0OCA6IDk4NS4zMDcwMjkKK1BSTjY0OSA6IDkxNC45OTMzNjkKK1BSTjY1MCA6IDg4My4yNjg4NTMKK1BSTjY1MSA6IDk3OC40OTI4NzEKK1BSTjY1MiA6IDEwMzcuNDY4ODU2CitQUk42NTMgOiA5MDMuNjk3ODMyCitQUk42NTQgOiAxMDE2LjI5OTE0NQorUFJONjU1IDogMTAzMi42NjI3MjkKK1BSTjY1NiA6IDk3MS44NjAwNDMKK1BSTjY1NyA6IDg3Ni4yMTc2NDAKK1BSTjY1OCA6IDEwNzYuMTI4NDk3CitQUk42NTkgOiA5NjcuNjYyNDk2CitQUk42NjAgOiAxMTE4LjE1MjEwOQorUFJONjYxIDogOTU5LjQwMjQwMAorUFJONjYyIDogOTMxLjEyNzY1MgorUFJONjYzIDogOTYzLjM5NTUwMgorUFJONjY0IDogOTg1LjAzOTM3MworUFJONjY1IDogMTEzMC45NjYwMTQKK1BSTjY2NiA6IDEwMTUuMjIyODAzCitQUk42NjcgOiA5NzkuNDE2NTU3CitQUk42NjggOiAxMDQ0LjQ1MTcxNAorUFJONjY5IDogMTAxMy41MjE0MzUKK1BSTjY3MCA6IDk4Ni40MzQ1OTUKK1BSTjY3MSA6IDEwODEuNjY4NDM3CitQUk42NzIgOiAxMTE4LjUxNTg5NgorUFJONjczIDogOTg5Ljk3Mjk3MQorUFJONjc0IDogOTY2LjI5MzU0MgorUFJONjc1IDogOTYwLjI3NzQxMworUFJONjc2IDogMTAwMC4wNDk2NjgKK1BSTjY3NyA6IDEwODIuMDAyNDA3CitQUk42NzggOiA5OTMuODk4MTYwCitQUk42NzkgOiAxMDI2LjUzNDI1MQorUFJONjgwIDogOTYyLjIwMjA4NgorUFJONjgxIDogMTAwNC42OTc1ODUKK1BSTjY4MiA6IDk0NS40NDk4NDkKK1BSTjY4MyA6IDEwMzYuMjk2MDYxCitQUk42ODQgOiAxMDI1LjQxNDE0NQorUFJONjg1IDogMTA2My4xNjUyNzIKK1BSTjY4NiA6IDk5My4yODE4NDIKK1BSTjY4NyA6IDEwMjQuODUwNDUxCitQUk42ODggOiA5NzguNzU2ODk1CitQUk42ODkgOiAxMDAwLjM0ODkwMworUFJONjkwIDogODg2LjUzODYxNQorUFJONjkxIDogMTA0NC4wNTMwOTEKK1BSTjY5MiA6IDEwMTEuNTE0MzUyCitQUk42OTMgOiA5NzcuMTYyMTU4CitQUk42OTQgOiAxMDQwLjEyMzQxMworUFJONjk1IDogMTA0OS4zNDg3NjgKK1BSTjY5NiA6IDEwNzAuMjgxNTk5CitQUk42OTcgOiA5OTQuMDk1MTU4CitQUk42OTggOiA5OTguMzExMjc3CitQUk42OTkgOiA5OTYuMzA1MjQ3CitQUk43MDAgOiA5MjYuNjA0MTE1CitQUk43MDEgOiAxMDAwLjA0NjcyOAorUFJONzAyIDogOTkyLjk3MzU0MAorUFJONzAzIDogMTAwMS4wMTQyMTAKK1BSTjcwNCA6IDk1MC45MDAyMzQKK1BSTjcwNSA6IDEwNzQuNjAyMTI3CitQUk43MDYgOiA5ODcuNzMxMTc0CitQUk43MDcgOiA5NDYuOTcxMjc1CitQUk43MDggOiAxMDI3LjU3ODE1OAorUFJONzA5IDogMTAyNC4wMTEyMjAKK1BSTjcxMCA6IDk1OS4xNDUxOTQKK1BSTjcxMSA6IDEwMDYuNDIzOTM3CitQUk43MTIgOiA5ODEuMjEzNzIxCitQUk43MTMgOiAxMDQ0LjA2NTQ2MQorUFJONzE0IDogOTc5LjIyMzQ4NQorUFJONzE1IDogMTAwOC44NTcwMzMKK1BSTjcxNiA6IDEwNDMuODkyNDUwCitQUk43MTcgOiAxMDYwLjUyOTk4MAorUFJONzE4IDogOTMzLjI1MDgwMgorUFJONzE5IDogMTA2MS40NjExNTIKK1BSTjcyMCA6IDk2MS4yNTk2MzcKK1BSTjcyMSA6IDEwNTguMjgzMDY0CitQUk43MjIgOiAxMDExLjMxOTExOQorUFJONzIzIDogOTk2LjE2Nzk0NworUFJONzI0IDogMTAzNy42NjU5NzQKK1BSTjcyNSA6IDg2NS41NzQ4OTUKK1BSTjcyNiA6IDEwMDIuOTExMTQ0CitQUk43MjcgOiA5NzguODg2MjA1CitQUk43MjggOiAxMDAyLjMwMjM2OQorUFJONzI5IDogOTQ1LjIxMzM2NgorUFJONzMwIDogMTA0OS4zMzA1MjYKK1BSTjczMSA6IDEwMTEuMDg5OTk1CitQUk43MzIgOiA5MTEuMjczMDAwCitQUk43MzMgOiAxMDMwLjc5NjEzMgorUFJONzM0IDogMTEwMS42OTk0NDYKK1BSTjczNSA6IDg2OC41MjQyODgKK1BSTjczNiA6IDk1MS44MDc3MTIKK1BSTjczNyA6IDk5Ny45NTczNjcKK1BSTjczOCA6IDk1My43OTE5NzkKK1BSTjczOSA6IDk1NC40MzA3NjAKK1BSTjc0MCA6IDk5My44MzQwNTUKK1BSTjc0MSA6IDEwMjEuMzAwODA4CitQUk43NDIgOiA4OTEuMjcyOTA2CitQUk43NDMgOiA4NzkuNTc3OTM5CitQUk43NDQgOiAxMDkzLjE3Njk1MAorUFJONzQ1IDogOTYxLjE5ODA5MQorUFJONzQ2IDogOTc2LjA4NjM0OQorUFJONzQ3IDogOTAwLjUxNDUzNQorUFJONzQ4IDogOTExLjcxMTM3NgorUFJONzQ5IDogOTc1Ljk5NzQ1NAorUFJONzUwIDogMTAwNy4yOTI0MzIKK1BSTjc1MSA6IDEwMjMuMjY2NDY0CitQUk43NTIgOiAxMDY2LjcyMzEwMgorUFJONzUzIDogMTA2MC40NjgyNjIKK1BSTjc1NCA6IDExMTUuNjczOTIyCitQUk43NTUgOiAxMDQxLjI5MDUzNAorUFJONzU2IDogOTEyLjI0ODA0MAorUFJONzU3IDogMTAzNC41MTg1ODcKK1BSTjc1OCA6IDk2Ny4xNTQ4OTUKK1BSTjc1OSA6IDEwNDMuNDc4NDkzCitQUk43NjAgOiAxMDI2LjAyNTI1NworUFJONzYxIDogOTk3Ljc5NTYzMgorUFJONzYyIDogOTQ4LjIwNzgyMworUFJONzYzIDogOTcwLjM2Njk4MAorUFJONzY0IDogOTczLjM5MDk0MQorUFJONzY1IDogMTAwOC4yNDk3MzQKK1BSTjc2NiA6IDk2NS44MTA2MTQKK1BSTjc2NyA6IDEwMzQuMzY4NzQzCitQUk43NjggOiA5NjkuMTMwNDM1CitQUk43NjkgOiA5MzkuNTI1MTUzCitQUk43NzAgOiA5MzkuMzQ2ODYzCitQUk43NzEgOiAxMDk4LjQzMzQzNAorUFJONzcyIDogOTczLjkxMzYyMworUFJONzczIDogOTk0LjYyOTM5MQorUFJONzc0IDogMTAxOS4wMjk3NTEKK1BSTjc3NSA6IDk5OS4wNjg2MDEKK1BSTjc3NiA6IDk1Mi4zNzQ1NjUKK1BSTjc3NyA6IDEwMDUuNDEzNDc2CitQUk43NzggOiAxMDA4LjYwNjQ1MAorUFJONzc5IDogOTQ5LjU4NjkyOAorUFJONzgwIDogOTg0LjMzNjAwNworUFJONzgxIDogOTY2LjMzNDIyMAorUFJONzgyIDogOTUyLjM1MzY5NworUFJONzgzIDogMTA4MS42ODUwODMKK1BSTjc4NCA6IDExNDguODY1OTI0CitQUk43ODUgOiAxMDQzLjg4MTc4MgorUFJONzg2IDogOTUwLjc0NzI2MgorUFJONzg3IDogMTAxMy4zNDIwOTkKK1BSTjc4OCA6IDEwMjEuODQxNzM4CitQUk43ODkgOiA5NDMuMjAyMTgzCitQUk43OTAgOiAxMDE4LjY1ODc1MworUFJONzkxIDogMTAzOS41MTk3NDgKK1BSTjc5MiA6IDEwNjYuNzQ1NDE3CitQUk43OTMgOiA5OTEuOTIyMjk3CitQUk43OTQgOiA5ODkuOTkzNTA4CitQUk43OTUgOiA5MzUuMjU2NzcwCitQUk43OTYgOiAxMDQ5LjM1NTEwMQorUFJONzk3IDogOTg0LjI3MTk2OQorUFJONzk4IDogMTA0Ni4wNjAzODQKK1BSTjc5OSA6IDEwNDQuMTcwMDUyCitQUk44MDAgOiA5MjAuNzIwNjI3CitQUk44MDEgOiA5MzguNDUzMjk1CitQUk44MDIgOiA5ODAuNDI1NzExCitQUk44MDMgOiA5NzQuODU3NDI1CitQUk44MDQgOiAxMDE2LjI2NjkxNworUFJOODA1IDogMTAzOS42NTg3NjQKK1BSTjgwNiA6IDkyNS4xNzE0ODEKK1BSTjgwNyA6IDk4Mi41NzcxMzkKK1BSTjgwOCA6IDk5Ny41NTIxMTQKK1BSTjgwOSA6IDEwNjMuMTA4Mzg5CitQUk44MTAgOiA5MjcuOTY1NjU2CitQUk44MTEgOiAxMDQ5LjgyODMxMworUFJOODEyIDogMTAxMi41MDY2NjUKK1BSTjgxMyA6IDk2Mi42MTM2MjcKK1BSTjgxNCA6IDkxNS41ODAyMzUKK1BSTjgxNSA6IDEwMDMuODA2NTk5CitQUk44MTYgOiAxMDg2LjQ1NDUyMgorUFJOODE3IDogOTY4LjkxNTAwMAorUFJOODE4IDogMTAwOC41NDY1NTkKK1BSTjgxOSA6IDg1Ni40OTkzMDYKK1BSTjgyMCA6IDk2MC41MzYwMzEKK1BSTjgyMSA6IDEwMjUuNzc4NzY2CitQUk44MjIgOiAxMDcxLjMyNjY3MworUFJOODIzIDogOTkzLjIwNTU5OQorUFJOODI0IDogMTA1Mi43NTA2MjQKK1BSTjgyNSA6IDEwNDAuOTg3MTY2CitQUk44MjYgOiAxMDM0LjAzOTA3MgorUFJOODI3IDogOTYzLjA0ODgwNAorUFJOODI4IDogOTcwLjUxMDk0OQorUFJOODI5IDogMTA0OS44Mjk4MTYKK1BSTjgzMCA6IDkzNC45NDUzNTgKK1BSTjgzMSA6IDk4MC45MjUwODQKK1BSTjgzMiA6IDEwMzcuMzIxNzE4CitQUk44MzMgOiAxMDMxLjUzMjU1MQorUFJOODM0IDogMTA0OS4wNDU4MjgKK1BSTjgzNSA6IDEwODYuNzUxOTQxCitQUk44MzYgOiAxMDM2Ljc3MDY3MAorUFJOODM3IDogMTAzMi40Nzk5ODgKK1BSTjgzOCA6IDk1Ny4yNjQ1ODEKK1BSTjgzOSA6IDk4Mi41ODYxMzQKK1BSTjg0MCA6IDEwMDIuMTQ0NTQ5CitQUk44NDEgOiA4NTYuMjIxMzQ2CitQUk44NDIgOiAxMDc3LjczMjI2MQorUFJOODQzIDogMTAyMy44NDQyMDQKK1BSTjg0NCA6IDEwNDkuMDE1MDEzCitQUk44NDUgOiAxMTA5Ljg2ODcwNgorUFJOODQ2IDogMTAzMi4wMzA4NDMKK1BSTjg0NyA6IDk5NC40MzEwNTEKK1BSTjg0OCA6IDk5OS4yNjMzODQKK1BSTjg0OSA6IDEwNTIuMzExMTEyCitQUk44NTAgOiA5NTUuODMxNzM0CitQUk44NTEgOiA5NTguODY0NDIzCitQUk44NTIgOiAxMDE2LjcyODc5NQorUFJOODUzIDogMTAwNC44NzQ3OTYKK1BSTjg1NCA6IDEwMDQuMjU5MDg0CitQUk44NTUgOiA5NjMuODE5NzE4CitQUk44NTYgOiA5NDkuNzU1MzMwCitQUk44NTcgOiA5ODcuOTAwMTY4CitQUk44NTggOiA5OTUuMjI2MDE3CitQUk44NTkgOiAxMDk4LjcwODg1OQorUFJOODYwIDogMTAwOS41MTQzMzcKK1BSTjg2MSA6IDk0OC43NzcyNTMKK1BSTjg2MiA6IDk4Mi42ODA1MDAKK1BSTjg2MyA6IDk5Ni4wMjgyODUKK1BSTjg2NCA6IDEwMjkuMTI0NDE1CitQUk44NjUgOiA5NDIuMTAxODE4CitQUk44NjYgOiAxMDM0LjIyMjA0MAorUFJOODY3IDogOTQ5LjM0ODU1MAorUFJOODY4IDogOTY1Ljk2MzU5NworUFJOODY5IDogOTk1LjAyMTUwMworUFJOODcwIDogODg5LjY1MzMyNgorUFJOODcxIDogOTUxLjg5OTA1NQorUFJOODcyIDogMTAzOC42Njc3NTYKK1BSTjg3MyA6IDEwODguODg1MzI5CitQUk44NzQgOiA5NzkuNDcxMTQxCitQUk44NzUgOiAxMDI3LjY0NzM0OAorUFJOODc2IDogMTA1NC4xNTc0NDYKK1BSTjg3NyA6IDEwMDMuNDcyMTE2CitQUk44NzggOiA5MTQuMDE2ODE1CitQUk44NzkgOiAxMDM0Ljg2MjU5OAorUFJOODgwIDogOTM2LjI1MzEwNAorUFJOODgxIDogOTYyLjI1NDg1NworUFJOODgyIDogMTA0Mi4xNjYwMzQKK1BSTjg4MyA6IDkzNC42MTgxNTYKK1BSTjg4NCA6IDkzOS45MjMyMjIKK1BSTjg4NSA6IDk5OC42NDkzMjQKK1BSTjg4NiA6IDk4Ni43NTM0OTIKK1BSTjg4NyA6IDEwOTUuNDUwMTE4CitQUk44ODggOiA5ODIuNjYwMTE5CitQUk44ODkgOiA5NDcuMTQ5NjY1CitQUk44OTAgOiA4OTMuOTMwOTg1CitQUk44OTEgOiA5NTYuNTg5OTUzCitQUk44OTIgOiAxMDY3LjMxMjMwMQorUFJOODkzIDogOTUyLjQwNjI0MAorUFJOODk0IDogOTg2LjcyODkyMAorUFJOODk1IDogMTAzMC45OTkyMTkKK1BSTjg5NiA6IDk5My4zMDY2MjgKK1BSTjg5NyA6IDk3Mi4yMzAwOTQKK1BSTjg5OCA6IDk5My4yMjcwOTQKK1BSTjg5OSA6IDEwMDguOTI2MTg4CitQUk45MDAgOiA5NzYuMzkxMTkyCitQUk45MDEgOiA5NTIuNTQ1NTYxCitQUk45MDIgOiAxMDExLjE1NzQ2MgorUFJOOTAzIDogMTA1Ni4zNTc0NTUKK1BSTjkwNCA6IDEwMjcuOTI5NTEwCitQUk45MDUgOiA5ODYuNzQ5MTUxCitQUk45MDYgOiA5NjMuNDYyODAzCitQUk45MDcgOiA5ODguNzcyOTI2CitQUk45MDggOiAxMDMxLjkzMDg4MgorUFJOOTA5IDogOTgxLjEzMDMwMAorUFJOOTEwIDogMTA3My40NjMyMzUKK1BSTjkxMSA6IDEwODEuNjk2MzgwCitQUk45MTIgOiAxMDIwLjY3ODU1MQorUFJOOTEzIDogOTA2LjU0NDI3MAorUFJOOTE0IDogMTA5Ny40OTU4NDkKK1BSTjkxNSA6IDExMTMuMTQ2MzgwCitQUk45MTYgOiAxMDU4LjQ0MzAyOQorUFJOOTE3IDogOTAyLjQ4Nzg0OAorUFJOOTE4IDogMTAwOS45MTQyODEKK1BSTjkxOSA6IDEwNTcuMTAwMDU0CitQUk45MjAgOiA5NDAuNDI4MDc5CitQUk45MjEgOiA5NDEuNDczMDU4CitQUk45MjIgOiA5MDUuNzE2NzU5CitQUk45MjMgOiA5OTcuNzg5MTA3CitQUk45MjQgOiA5NjIuMzA2MTc2CitQUk45MjUgOiAxMDcyLjUwNDIxNgorUFJOOTI2IDogOTQ2LjU1NDgyMgorUFJOOTI3IDogOTcyLjkzMjIyMworUFJOOTI4IDogMTAyNC45NjEzNjAKK1BSTjkyOSA6IDEwODAuNTEzNjkyCitQUk45MzAgOiAxMDQ3LjEzNzY1OAorUFJOOTMxIDogMTAxMi44MjQ5MzMKK1BSTjkzMiA6IDk3Ni40MDQ1MTIKK1BSTjkzMyA6IDg5NS42MDQ1MDkKK1BSTjkzNCA6IDExMTQuNDQ2OTA1CitQUk45MzUgOiAxMDUxLjM0MjUzMworUFJOOTM2IDogMTAyNy4yMDQ2MDkKK1BSTjkzNyA6IDkxNy44MTE4NDIKK1BSTjkzOCA6IDg4Mi4zMDY0ODcKK1BSTjkzOSA6IDEwMTAuNDQ0NzY2CitQUk45NDAgOiA5NzguNjg2MTA5CitQUk45NDEgOiAxMDIwLjU4NTU4MQorUFJOOTQyIDogOTg5Ljk0NDMzNQorUFJOOTQzIDogMTAxMC40ODQzMjMKK1BSTjk0NCA6IDkzNi43Mjc3NDQKK1BSTjk0NSA6IDEwMzguNjMxNDQ2CitQUk45NDYgOiAxMDEyLjUzMDU3MgorUFJOOTQ3IDogOTYxLjU3NzM1NworUFJOOTQ4IDogOTg4LjI1Mzc3MAorUFJOOTQ5IDogMTA1NC4zNTMyMDYKK1BSTjk1MCA6IDk2NC4xMjA0MjYKK1BSTjk1MSA6IDk0My40ODY4NjQKK1BSTjk1MiA6IDEwNTIuNjUwOTM3CitQUk45NTMgOiA5ODAuMzM0MzEzCitQUk45NTQgOiAxMTM3LjE4NjgxNworUFJOOTU1IDogMTEyNS4yNTU5NjgKK1BSTjk1NiA6IDk2NC44MzAwOTMKK1BSTjk1NyA6IDkzMC42NDY2MjYKK1BSTjk1OCA6IDEwNDMuNTE5OTQxCitQUk45NTkgOiAxMDg4LjgyOTkzOAorUFJOOTYwIDogMTAyNC4wMTcwNTEKK1BSTjk2MSA6IDEwNjUuNTc0MjY2CitQUk45NjIgOiAxMDA4Ljc0MDgzMworUFJOOTYzIDogOTcyLjQyMTk1MAorUFJOOTY0IDogMTA4Mi45OTEzMTYKK1BSTjk2NSA6IDk2My4xNjMwMjgKK1BSTjk2NiA6IDEwNDAuMTg0MTk3CitQUk45NjcgOiA4NjUuMjM0MjM4CitQUk45NjggOiAxMDI2LjcwMzY2NQorUFJOOTY5IDogOTkxLjc1ODYyNQorUFJOOTcwIDogMTA5MS4wMjE3MTYKK1BSTjk3MSA6IDEwNzkuODcyODkyCitQUk45NzIgOiAxMDQyLjQwMTg3NQorUFJOOTczIDogMTA4NS42MjQ2MDQKK1BSTjk3NCA6IDEwNTUuMzE0NDM3CitQUk45NzUgOiAxMTM4LjM0NDE0OQorUFJOOTc2IDogOTA2Ljk1ODQwMAorUFJOOTc3IDogOTU0LjY0MTE2MgorUFJOOTc4IDogMTAxNC44NDA0NzIKK1BSTjk3OSA6IDk5MS45MDY4NjQKK1BSTjk4MCA6IDk0Ny43MTY3MTMKK1BSTjk4MSA6IDEwNzUuMzQ2MTY5CitQUk45ODIgOiA5MTMuMDQzOTQzCitQUk45ODMgOiAxMDA2LjEwNzIyOAorUFJOOTg0IDogOTQwLjkzNzY5MQorUFJOOTg1IDogOTI1LjgyNzc3MAorUFJOOTg2IDogODcwLjAwMTI3OQorUFJOOTg3IDogMTA5My4zNDgwMjYKK1BSTjk4OCA6IDk5MC45Mzg2MzEKK1BSTjk4OSA6IDEwNjcuNTUyMTA3CitQUk45OTAgOiA5MzYuNDQxMTYyCitQUk45OTEgOiA5NTYuMDY2Nzg3CitQUk45OTIgOiAxMDAxLjcwNTIxNAorUFJOOTkzIDogMTAwNy4xOTg0NTMKK1BSTjk5NCA6IDk1Ni44ODM2NjEKK1BSTjk5NSA6IDEwMzMuNjQ1MzU2CitQUk45OTYgOiAxMDM2LjM5NTk5OQorUFJOOTk3IDogOTU0Ljk0MTY1OAorUFJOOTk4IDogMTAxNS43MjA1NDcKK1BSTjk5OSA6IDEwMjMuMTQ3OTk5CitzYW1wbGUgbWVhbiAgOiAxMDAwLjMwMzgyNQordHJ1ZSBtZWFuICAgIDogMTAwMC4wMDAwMDAKK3NhbXBsZSBzdGRkZXY6IDUzLjIzMzU4NAordHJ1ZSBzdGRkZXYgIDogNTMuMDAwMDAwCit6LXNjb3JlICAgICAgOiAwLjE4MTI3OQorcC12YWx1ZSAgICAgIDogMC40Mjg2MDAKK1FIW25vcm1hbGl0eV06IDEuMDE1MzQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9saWJhdmNvZGVjLWh0bWxzdWJ0aXRsZXMgYi90ZXN0cy9yZWYvZmF0ZS9saWJhdmNvZGVjLWh0bWxzdWJ0aXRsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkZDhlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2xpYmF2Y29kZWMtaHRtbHN1YnRpdGxlcwpAQCAtMCwwICsxLDggQEAKKzw8aGVsbG8+PiAtLT4gPDxoZWxsbz4+Cis8PDxiPmhlbGxvPC9iPj4+IC0tPiA8PHtcYjF9aGVsbG97XGIwfT4+Cis8IGhlbGxvIDwgMjAwMCA+IHdvcmxkID4gLS0+IDwgaGVsbG8gPCAyMDAwID4gd29ybGQgPgorPGgxPlRJVExFPC9oMT4gLS0+IFRJVExFCis8IGZvbnQgY29sb3I9cmVkID5yZWQ8L2ZvbnQ+IC0tPiB7XGMmSEZGJn1yZWR7XGN9CitGb28gPGZvb0BiYXIuY29tPiAtLT4gRm9vIDxmb29AYmFyLmNvbT4KKzxiPiBmb28gPEk+IGJhciA8L0I+IGJsYSA8L2k+IC0tPiB7XGIxfSBmb28ge1xpMX0gYmFyIHtcYjB9IGJsYSB7XGkwfQorQTxicj5CPEJSLz5DPGJyICAvID5EPCAgQnIgPkU8YnJrPjxicmsvPiAtLT4gQVxOQlxOQ1xORFxORQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbG1sbTQtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS9sbWxtNC1kZW11eAppbmRleCA5NWRmM2U2Li5iMDI3NmQ1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9sbWxtNC1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9sbWxtNC1kZW11eApAQCAtMSw2ICsxLDE1IEBACiAjZXh0cmFkYXRhIDA6ICAgICAgIDI4LCAweDJmMTQwNTM4CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBtcGVnNAorI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKICN0YiAxOiAxLzkwMDAwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IG1wMgorI3NhbXBsZV9yYXRlIDE6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMTogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogc3RlcmVvCiAwLCAgICAgICAgICAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA1OTUxLCAweGU5MTE4ZTBkCiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMjE2MCwgICAgICA3NjgsIDB4YWViY2JlYmIKIDEsICAgICAgIDIxNjAsICAgICAgIDIxNjAsICAgICAyMTYwLCAgICAgIDc2OCwgMHhhZWJjYmViYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbG9jby1yZ2IgYi90ZXN0cy9yZWYvZmF0ZS9sb2NvLXJnYgppbmRleCBhZDE5OWYxLi4yODllNzNmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9sb2NvLXJnYgorKysgYi90ZXN0cy9yZWYvZmF0ZS9sb2NvLXJnYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA3MS81MDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE4OHgxMjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNzIxOTIsIDB4MTg0NzUwMGMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA3MjE5MiwgMHgxYjBlMmU4NwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDcyMTkyLCAweDI5MzI3NmM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9sb2NvLXl1eTIgYi90ZXN0cy9yZWYvZmF0ZS9sb2NvLXl1eTIKaW5kZXggNjBhMDZiYy4uZTk2M2NkYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbG9jby15dXkyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2xvY28teXV5MgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA3MS81MDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE4OHgxMjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDgxMjgsIDB4Nzc5NTc4MmQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA0ODEyOCwgMHgzZDg5YmNmNwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDQ4MTI4LCAweDE3MGQyMDBhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9sb3NzbGVzcy13bWEyNC0xIGIvdGVzdHMvcmVmL2ZhdGUvbG9zc2xlc3Mtd21hMjQtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGVlMzFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbG9zc2xlc3Mtd21hMjQtMQpAQCAtMCwwICsxIEBACis5YWRlOTFmNTA2YmMwMjU4NTRmNmZmZWEwZDYzNWJjNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbG9zc2xlc3Mtd21hMjQtMiBiL3Rlc3RzL3JlZi9mYXRlL2xvc3NsZXNzLXdtYTI0LTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViZGZkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL2xvc3NsZXNzLXdtYTI0LTIKQEAgLTAsMCArMSBAQAorOTA4ZWM1YzE2ZjQ5N2JmN2Q1NjU4ZDI2ODlkMTI1YzgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL2xvc3NsZXNzLXdtYTI0LXJhd3RpbGUgYi90ZXN0cy9yZWYvZmF0ZS9sb3NzbGVzcy13bWEyNC1yYXd0aWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZTVlMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9sb3NzbGVzcy13bWEyNC1yYXd0aWxlCkBAIC0wLDAgKzEgQEAKKzMzNzU5MmYzOGEyMjE4YTViYzk1Y2ViOWI1ZTcyYzhiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tNHYgYi90ZXN0cy9yZWYvZmF0ZS9tNHYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViZTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL200dgpAQCAtMCwwICsxLDQ3IEBACisjdGIgMDogMS82MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MjYyMTU2YgorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGE2YWViYzJmCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWM3YmViYTEKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDExNTIwMCwgMHg1NTYwMzdhMgorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDUzMmUzYTIzCiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTEwNTExZjQKKzAsICAgICAgICAgNzEsICAgICAgICAgNzEsICAgICAgICAxLCAgIDExNTIwMCwgMHhiN2Y5MjlhNAorMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGRhYjlmM2MyCiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDQxNDEzZGQKKzAsICAgICAgICAxMDQsICAgICAgICAxMDQsICAgICAgICAxLCAgIDExNTIwMCwgMHgwMTE2M2YzMworMCwgICAgICAgIDEyMCwgICAgICAgIDEyMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDQ3NzIwYzc4CiswLCAgICAgICAgMTMxLCAgICAgICAgMTMxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDdjMjEzNTYKKzAsICAgICAgICAxNDIsICAgICAgICAxNDIsICAgICAgICAxLCAgIDExNTIwMCwgMHgwODVkNDI5MQorMCwgICAgICAgIDE1MywgICAgICAgIDE1MywgICAgICAgIDEsICAgMTE1MjAwLCAweGY2ZGIwNzRjCiswLCAgICAgICAgMTY0LCAgICAgICAgMTY0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTUwOTNlNzUKKzAsICAgICAgICAxODAsICAgICAgICAxODAsICAgICAgICAxLCAgIDExNTIwMCwgMHg1ZjgxMThlZgorMCwgICAgICAgIDE5MSwgICAgICAgIDE5MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDJiNGRlMzRhCiswLCAgICAgICAgMjAyLCAgICAgICAgMjAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGE3MzE4NTcKKzAsICAgICAgICAyMTMsICAgICAgICAyMTMsICAgICAgICAxLCAgIDExNTIwMCwgMHhkNzVlZjNiZQorMCwgICAgICAgIDIyNCwgICAgICAgIDIyNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDMyMWNmNWE5CiswLCAgICAgICAgMjQwLCAgICAgICAgMjQwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2ViMjIyZmQKKzAsICAgICAgICAyNTEsICAgICAgICAyNTEsICAgICAgICAxLCAgIDExNTIwMCwgMHhjN2Q5MmYzZQorMCwgICAgICAgIDI2MiwgICAgICAgIDI2MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDZmZGEwMzY2CiswLCAgICAgICAgMjczLCAgICAgICAgMjczLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NmJiNjFiMDMKKzAsICAgICAgICAyODQsICAgICAgICAyODQsICAgICAgICAxLCAgIDExNTIwMCwgMHg1ZjM2N2VmOAorMCwgICAgICAgIDMwMCwgICAgICAgIDMwMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDIzN2QwYzc3CiswLCAgICAgICAgMzExLCAgICAgICAgMzExLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWZhODEzZWYKKzAsICAgICAgICAzMjIsICAgICAgICAzMjIsICAgICAgICAxLCAgIDExNTIwMCwgMHgzOTI2M2VmNAorMCwgICAgICAgIDMzMywgICAgICAgIDMzMywgICAgICAgIDEsICAgMTE1MjAwLCAweDQ3YzcwNDQxCiswLCAgICAgICAgMzQ0LCAgICAgICAgMzQ0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDQzZmZmYjAKKzAsICAgICAgICAzNjAsICAgICAgICAzNjAsICAgICAgICAxLCAgIDExNTIwMCwgMHg3NTY5NmFmYgorMCwgICAgICAgIDM3MSwgICAgICAgIDM3MSwgICAgICAgIDEsICAgMTE1MjAwLCAweGIwZjExN2EzCiswLCAgICAgICAgMzgyLCAgICAgICAgMzgyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDAyZjQyZjAKKzAsICAgICAgICAzOTMsICAgICAgICAzOTMsICAgICAgICAxLCAgIDExNTIwMCwgMHhhMTkyNDg3ZQorMCwgICAgICAgIDQwNCwgICAgICAgIDQwNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDE5YTcwNzJlCiswLCAgICAgICAgNDIwLCAgICAgICAgNDIwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzUwMDY2OWMKKzAsICAgICAgICA0MzEsICAgICAgICA0MzEsICAgICAgICAxLCAgIDExNTIwMCwgMHhlNDYzNmJhOQorMCwgICAgICAgIDQ0MiwgICAgICAgIDQ0MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGRmM2Q1ZDg2CiswLCAgICAgICAgNDUzLCAgICAgICAgNDUzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjMwODI1ZDUKKzAsICAgICAgICA0NjQsICAgICAgICA0NjQsICAgICAgICAxLCAgIDExNTIwMCwgMHhlM2M5NDRhMQorMCwgICAgICAgIDQ4MCwgICAgICAgIDQ4MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDhmZWM0NDIwCiswLCAgICAgICAgNDkxLCAgICAgICAgNDkxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTM4MWZkYWIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL200di1jZnIgYi90ZXN0cy9yZWYvZmF0ZS9tNHYtY2ZyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDAyMDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tNHYtY2ZyCkBAIC0wLDAgKzEsNDYgQEAKKyN0YiAwOiAxLzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzI2MjE1NmIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNmFlYmMyZgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDljN2JlYmExCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTU2MDM3YTIKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgMHg1MzJlM2EyMworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDExMDUxMWY0CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjdmOTI5YTQKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgMHhkYWI5ZjNjMgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDQ0MTQxM2RkCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDExNjNmMzMKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NzcyMGM3OAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDA3YzIxMzU2CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDg1ZDQyOTEKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDExNTIwMCwgMHhmNmRiMDc0YworMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDk1MDkzZTc1CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NWY4MTE4ZWYKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDExNTIwMCwgMHgyYjRkZTM0YQorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTE1MjAwLCAweDBhNzMxODU3CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDc1ZWYzYmUKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDExNTIwMCwgMHgzMjFjZjVhOQorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDNlYjIyMmZkCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzdkOTJmM2UKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ZmRhMDM2NgorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTE1MjAwLCAweDZiYjYxYjAzCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NWYzNjdlZjgKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDExNTIwMCwgMHgyMzdkMGM3NworMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTE1MjAwLCAweGFmYTgxM2VmCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzkyNjNlZjQKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDExNTIwMCwgMHg0N2M3MDQ0MQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ0M2ZmZmIwCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzU2OTZhZmIKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDExNTIwMCwgMHhiMGYxMTdhMworMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDAwMmY0MmYwCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTE5MjQ4N2UKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDExNTIwMCwgMHgxOWE3MDcyZQorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM1MDA2NjljCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTQ2MzZiYTkKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDExNTIwMCwgMHhkZjNkNWQ4NgorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGYzMDgyNWQ1CiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTNjOTQ0YTEKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDExNTIwMCwgMHg4ZmVjNDQyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbWFnaWN5dXYtcmdiIGIvdGVzdHMvcmVmL2ZhdGUvbWFnaWN5dXYtcmdiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDQ4M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tYWdpY3l1di1yZ2IKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMTAwLzIzOTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDIwOHgyMzIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDQ3NjgsIDB4NDk3YzhjZTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21hZ2ljeXV2LXJnYmEgYi90ZXN0cy9yZWYvZmF0ZS9tYWdpY3l1di1yZ2JhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyY2NiNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tYWdpY3l1di1yZ2JhCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEwMC8yMzk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyMDh4MjMyCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTkzMDI0LCAweDdlMWI3MjMzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tYWdpY3l1di15NDAwaSBiL3Rlc3RzL3JlZi9mYXRlL21hZ2ljeXV2LXk0MDBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODdiNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tYWdpY3l1di15NDAwaQpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxMDAvMjM5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDIzMgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0ODI1NiwgMHgzNjhiOTNmMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbWFnaWN5dXYteTQyMCBiL3Rlc3RzL3JlZi9mYXRlL21hZ2ljeXV2LXk0MjAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmZmZjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21hZ2ljeXV2LXk0MjAKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMTAwLzIzOTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDIwOHgyMzIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNzIzODQsIDB4NTlhODc4NDIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21hZ2ljeXV2LXk0MjJpIGIvdGVzdHMvcmVmL2ZhdGUvbWFnaWN5dXYteTQyMmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiNzNmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21hZ2ljeXV2LXk0MjJpCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEwMC8yMzk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyMDh4MjMyCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDk2NTEyLCAweGU4NDc1MWJlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tYWdpY3l1di15NDQ0IGIvdGVzdHMvcmVmL2ZhdGUvbWFnaWN5dXYteTQ0NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzJkNDljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbWFnaWN5dXYteTQ0NApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxMDAvMjM5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDIzMgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE0NDc2OCwgMHhlZjQ4MDQzZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbWFnaWN5dXYteTQ0NDRpIGIvdGVzdHMvcmVmL2ZhdGUvbWFnaWN5dXYteTQ0NDRpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YWI3MGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tYWdpY3l1di15NDQ0NGkKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMTAwLzIzOTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDIwOHgyMzIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTMwMjQsIDB4NTI5MmVjZWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21hcGNoYW4tMmNoLWV4dHJhY3QtY2gwLWNoMi10cmFpbGluZyBiL3Rlc3RzL3JlZi9mYXRlL21hcGNoYW4tMmNoLWV4dHJhY3QtY2gwLWNoMi10cmFpbGluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTQwMDM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbWFwY2hhbi0yY2gtZXh0cmFjdC1jaDAtY2gyLXRyYWlsaW5nCkBAIC0wLDAgKzEgQEAKK2I2ZTFkMTQyYjRlNDg0MjIxNTYyZTdiNjZiOWJiYmRjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tYXBjaGFuLTNjaC1leHRyYWN0LWNoMC1jaDItdHJhaWxpbmcgYi90ZXN0cy9yZWYvZmF0ZS9tYXBjaGFuLTNjaC1leHRyYWN0LWNoMC1jaDItdHJhaWxpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzN2E5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21hcGNoYW4tM2NoLWV4dHJhY3QtY2gwLWNoMi10cmFpbGluZwpAQCAtMCwwICsxIEBACithZTUzMzk4NTE4NmNhYjI4NzMwOWMwNGY2YjNlODY2YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbWFwY2hhbi02Y2gtZXh0cmFjdC0yLWRvd25taXgtbW9ubyBiL3Rlc3RzL3JlZi9mYXRlL21hcGNoYW4tNmNoLWV4dHJhY3QtMi1kb3dubWl4LW1vbm8KaW5kZXggYTQ3Yzg1Yy4uOWFjNGRiYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbWFwY2hhbi02Y2gtZXh0cmFjdC0yLWRvd25taXgtbW9ubworKysgYi90ZXN0cy9yZWYvZmF0ZS9tYXBjaGFuLTZjaC1leHRyYWN0LTItZG93bm1peC1tb25vCkBAIC0xICsxIEBACi0yNzI3ZTU0MThlYjViOGY4OTk1NGYxNDBkOWYzYTE5YQorNmVkZWRjZmM5ZjBiMjZkMjAwYTcyOTUyMDVlODc2NjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21hcGNoYW4tc2lsZW50LW1vbm8gYi90ZXN0cy9yZWYvZmF0ZS9tYXBjaGFuLXNpbGVudC1tb25vCmluZGV4IGY3MjBjMzEuLjkzZjUxOWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21hcGNoYW4tc2lsZW50LW1vbm8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvbWFwY2hhbi1zaWxlbnQtbW9ubwpAQCAtMSArMSBAQAotMTZkYzczYzAzNzg5N2RmZjliMWQzZTNkODU2MWRjNzMKK2I2YjAzNGZmZmE4NjM5ZTY0ZDc5YmU4NGYxNmQ5ZWJlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tYXRyb3NrYS1zcGhlcmljYWwtbW9ubyBiL3Rlc3RzL3JlZi9mYXRlL21hdHJvc2thLXNwaGVyaWNhbC1tb25vCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTdkOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tYXRyb3NrYS1zcGhlcmljYWwtbW9ubwpAQCAtMCwwICsxLDE4IEBACitbU1RSRUFNXQorW1NJREVfREFUQV0KK3NpZGVfZGF0YV90eXBlPVN0ZXJlbyAzRAordHlwZT0yRAoraW52ZXJ0ZWQ9MAorWy9TSURFX0RBVEFdCitbU0lERV9EQVRBXQorc2lkZV9kYXRhX3R5cGU9U3BoZXJpY2FsIE1hcHBpbmcKK3Byb2plY3Rpb249dGlsZWQgZXF1aXJlY3Rhbmd1bGFyCitib3VuZF9sZWZ0PTE0OAorYm91bmRfdG9wPTczCitib3VuZF9yaWdodD0xNDcKK2JvdW5kX2JvdHRvbT03MgoreWF3PTQ1CitwaXRjaD0zMAorcm9sbD0xNQorWy9TSURFX0RBVEFdCitbL1NUUkVBTV0KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21heGlzLXhhIGIvdGVzdHMvcmVmL2ZhdGUvbWF4aXMteGEKaW5kZXggYzI5NzM4Yy4uYWQ5ZDczMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbWF4aXMteGEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbWF4aXMteGEKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS8yMjA1MAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBhZHBjbV9lYV9tYXhpc194YQorI3NhbXBsZV9yYXRlIDA6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMDogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogc3RlcmVvCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAyOCwgICAgICAgMzAsIDB4NTE3NTA3MTEKIDAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgIDI4LCAgICAgICAzMCwgMHg5Y2EyMGMyYQogMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgMjgsICAgICAgIDMwLCAweDc1NTEwODFmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tZGVjIGIvdGVzdHMvcmVmL2ZhdGUvbWRlYwppbmRleCBiN2FhYjYyLi5hZTQzOGVkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9tZGVjCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21kZWMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzA0eDIyNAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEwMjE0NCwgMHg2ZWRjODNkZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTAyMTQ0LCAweGQwNTM0ZmRhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMDIxNDQsIDB4NjQ0NzkxMWYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21kZWMtdjMgYi90ZXN0cy9yZWYvZmF0ZS9tZGVjLXYzCmluZGV4IDdlNGJiZGIuLjQ3MTMwM2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21kZWMtdjMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbWRlYy12MwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTYwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc2ODAwLCAweDI2NzdiZTgyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNzY4MDAsIDB4MWYzMjNjNzUKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA3NjgwMCwgMHhjOGJlM2JlOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbWltaWMgYi90ZXN0cy9yZWYvZmF0ZS9taW1pYwppbmRleCAyMTdkNDg3Li5lMzZlNmE4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9taW1pYworKysgYi90ZXN0cy9yZWYvZmF0ZS9taW1pYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMCwgICAxMTUyMDAsIDB4YTk3NGQ0MDcKIDAsICAgICAgICA1NDgsICAgICAgICA1NDgsICAgICAgICAwLCAgIDExNTIwMCwgMHg3MjYxOGI4NAogMCwgICAgICAgMTA4OCwgICAgICAgMTA4OCwgICAgICAgIDAsICAgMTE1MjAwLCAweDg3NzY4NTczCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tanBlZ2IgYi90ZXN0cy9yZWYvZmF0ZS9tanBlZ2IKaW5kZXggZWY4YTAwYi4uMDI5ODI3NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbWpwZWdiCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21qcGVnYgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEyCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNjB4MTIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4NDAwLCAweDQ1MzExMDgwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzg0MDAsIDB4OTQ3NGY3MzEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzODQwMCwgMHg0MjllYmIxMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbWt2IGIvdGVzdHMvcmVmL2ZhdGUvbWt2CmluZGV4IGFlYTM3OGEuLmY5YzMwMzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21rdgorKysgYi90ZXN0cy9yZWYvZmF0ZS9ta3YKQEAgLTEsNyArMSwxNiBAQAogI2V4dHJhZGF0YSAwOiAgICAgICAzNSwgMHhjM2IyMGI3MAogI2V4dHJhZGF0YSAxOiAgICAgICAgMiwgMHgwMGIyMDBhMQogI3RiIDA6IDEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBoMjY0CisjZGltZW5zaW9ucyAwOiAxMDI0eDU3NgorI3NhciAwOiAxLzEKICN0YiAxOiAxLzEwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogYWFjCisjc2FtcGxlX3JhdGUgMTogNDgwMDAKKyNjaGFubmVsX2xheW91dCAxOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBzdGVyZW8KIDAsICAgICAgICAtNDIsICAgICAgICAgIDAsICAgICAgIDQxLCAgICA2MzUwMSwgMHgxMzlkNGM5OQogMCwgICAgICAgICAgMCwgICAgICAgICA4NCwgICAgICAgNDEsICAgICA1MzY4LCAweGQ5NjRiNjc4LCBGPTB4MAogMSwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgMjEsICAgICAgNTI4LCAweDNjOTkwZGRmCkBAIC0yNSw5ICszNCw5IEBACiAxLCAgICAgICAgMjY0LCAgICAgICAgMjY0LCAgICAgICAyMSwgICAgICA2MDksIDB4YzBkYzI1NWMKIDEsICAgICAgICAyODUsICAgICAgICAyODUsICAgICAgIDIxLCAgICAgIDYxOSwgMHg5YWM1MmRkMQogMCwgICAgICAgIDI5MiwgICAgICAgIDI5MiwgICAgICAgNDEsICAgIDE2NzUxLCAweGYyOTNhYjQ2LCBGPTB4MAotMCwgICAgICAgIDI5MiwgICAgICAgIDQxNywgICAgICAgNDEsICAgIDIyMDI5LCAweDM2OTY0NjJiLCBGPTB4MAogMSwgICAgICAgIDMwNiwgICAgICAgIDMwNiwgICAgICAgMjEsICAgICAgNTc0LCAweGY2NDEwZDRkCiAxLCAgICAgICAgMzI3LCAgICAgICAgMzI3LCAgICAgICAyMiwgICAgICA1NjUsIDB4ZmQ1NjExOTEKKzAsICAgICAgICAzMzQsICAgICAgICA0MTcsICAgICAgIDQxLCAgICAyMjAyOSwgMHgzNjk2NDYyYiwgRj0weDAKIDEsICAgICAgICAzNTAsICAgICAgICAzNTAsICAgICAgIDIxLCAgICAgIDcxMywgMHg0ODQyNTE0NwogMSwgICAgICAgIDM3MSwgICAgICAgIDM3MSwgICAgICAgMjEsICAgICAgNTM3LCAweDA5YmJmNTE1CiAwLCAgICAgICAgMzc1LCAgICAgICAgMzc1LCAgICAgICA0MSwgICAgIDUwNDQsIDB4YTAzNDRhZTYsIEY9MHgwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9ta3YtMTI0MiBiL3Rlc3RzL3JlZi9mYXRlL21rdi0xMjQyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTViNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9ta3YtMTI0MgpAQCAtMCwwICsxLDQ4IEBACisjZXh0cmFkYXRhIDA6ICAgICAgIDkzLCAweGMyYTMyZTE0CisjZXh0cmFkYXRhIDE6ICAgICAgICAyLCAweDAwYjIwMGExCisjdGIgMDogMS8xMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGgyNjQKKyNkaW1lbnNpb25zIDA6IDEyODB4NzE4Cisjc2FyIDA6IDEvMQorI3RiIDE6IDEvMTAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBhYWMKKyNzYW1wbGVfcmF0ZSAxOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbworMCwgICAgICAgIC00MiwgICAgICAgICAgMCwgICAgICAgNDEsICAgICAyOTY5LCAweGE3MDE2NzQyCiswLCAgICAgICAgICAwLCAgICAgICAgIDQyLCAgICAgICA0MSwgICAgICAxMzUsIDB4MzNhZjFhOWUsIEY9MHgwCisxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAyMSwgICAgICAgIDYsIDB4MDI3ZTAwZTgKKzEsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgIDIxLCAgICAgICAgNiwgMHgwMjdlMDBlOAorMCwgICAgICAgICA0MiwgICAgICAgICA4MywgICAgICAgNDEsICAgICA5MTk2LCAweDI0ZDg0MzlmCisxLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAyMSwgICAgICAgIDYsIDB4MDI3ZTAwZTgKKzEsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgIDIxLCAgICAgICAgNiwgMHgwMjdlMDBlOAorMCwgICAgICAgICA4MywgICAgICAgIDEyNSwgICAgICAgNDEsICAgICA0OTI2LCAweGQ3ZTJlNDkyLCBGPTB4MAorMSwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgMjEsICAgICAgICA2LCAweDAyN2UwMGU4CisxLCAgICAgICAgMTA2LCAgICAgICAgMTA2LCAgICAgICAyMSwgICAgICAgMjQsIDB4ODg2ZjBjMWYKKzAsICAgICAgICAxMjUsICAgICAgICAxNjcsICAgICAgIDQxLCAgICAxMTA2OSwgMHg0NDgzOWM2NgorMSwgICAgICAgIDEyNywgICAgICAgIDEyNywgICAgICAgMjEsICAgICAgNTUwLCAweGY4NjMwNTljCisxLCAgICAgICAgMTQ4LCAgICAgICAgMTQ4LCAgICAgICAyMiwgICAgICA1OTYsIDB4MzJkNDE0YzEKKzAsICAgICAgICAxNjcsICAgICAgICAyNTAsICAgICAgIDQxLCAgICAgNjE0MywgMHhjMjUzNDNkZCwgRj0weDAKKzEsICAgICAgICAxNzEsICAgICAgICAxNzEsICAgICAgIDIxLCAgICAgIDI0NywgMHgyZDA3NzZjOQorMSwgICAgICAgIDE5MiwgICAgICAgIDE5MiwgICAgICAgMjEsICAgICAgMjY0LCAweGYwNGE3YjQ0CiswLCAgICAgICAgMjA5LCAgICAgICAgMjA5LCAgICAgICA0MSwgICAgIDQxOTcsIDB4M2I5Zjc0YWQsIEY9MHgwCisxLCAgICAgICAgMjEzLCAgICAgICAgMjEzLCAgICAgICAyMSwgICAgICAyNTEsIDB4Yzc2Mjg1MzkKKzEsICAgICAgICAyMzQsICAgICAgICAyMzQsICAgICAgIDIyLCAgICAgIDI0MywgMHg5OWVmNzY4YgorMCwgICAgICAgIDI1MCwgICAgICAgIDMzNCwgICAgICAgNDEsICAgIDE3NTk1LCAweDFlNTAyMTI4LCBGPTB4MAorMSwgICAgICAgIDI1NiwgICAgICAgIDI1NiwgICAgICAgMjEsICAgICAgMjU3LCAweDIzM2Y3Y2NjCisxLCAgICAgICAgMjc3LCAgICAgICAgMjc3LCAgICAgICAyMSwgICAgICAyNjQsIDB4N2Q5ZjdiZDkKKzAsICAgICAgICAyOTIsICAgICAgICAyOTIsICAgICAgIDQxLCAgICAgIDc0MSwgMHhlNmI5NGFmYywgRj0weDAKKzEsICAgICAgICAyOTgsICAgICAgICAyOTgsICAgICAgIDIxLCAgICAgIDI5OCwgMHg1MTQ3OGY5OAorMSwgICAgICAgIDMxOSwgICAgICAgIDMxOSwgICAgICAgMjIsICAgICAgMzIzLCAweDQxOWQ5OTM4CiswLCAgICAgICAgMzM0LCAgICAgICAgNDE3LCAgICAgICA0MSwgICAgMTYxMzgsIDB4YmE3MmYyZmUsIEY9MHgwCisxLCAgICAgICAgMzQxLCAgICAgICAgMzQxLCAgICAgICAyMSwgICAgICAzMDksIDB4NjIxOTk4MGMKKzEsICAgICAgICAzNjIsICAgICAgICAzNjIsICAgICAgIDIxLCAgICAgIDMyNSwgMHgzZmIzOTc2ZgorMCwgICAgICAgIDM3NSwgICAgICAgIDM3NSwgICAgICAgNDEsICAgICAgMzIyLCAweGQ2YmY3OTBmLCBGPTB4MAorMSwgICAgICAgIDM4MywgICAgICAgIDM4MywgICAgICAgMjEsICAgICAgMzI1LCAweGNkN2E5ZmQ2CisxLCAgICAgICAgNDA0LCAgICAgICAgNDA0LCAgICAgICAyMiwgICAgICAzNTksIDB4NmVkZWI5MWMKKzEsICAgICAgICA0MjYsICAgICAgICA0MjYsICAgICAgIDIxLCAgICAgIDMzMywgMHhiODk5OWZiNworMSwgICAgICAgIDQ0NywgICAgICAgIDQ0NywgICAgICAgMjEsICAgICAgMzE3LCAweGYyNTg5ZTFhCisxLCAgICAgICAgNDY4LCAgICAgICAgNDY4LCAgICAgICAyMSwgICAgICAzMTksIDB4ODJlZDk1NzIKKzEsICAgICAgICA0ODksICAgICAgICA0ODksICAgICAgIDIyLCAgICAgIDQ3MywgMHhlYTU0ZTY5NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW90aW9ucGl4ZWxzIGIvdGVzdHMvcmVmL2ZhdGUvbW90aW9ucGl4ZWxzCmluZGV4IGM4NzUyNzUuLmIzNzZjYzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21vdGlvbnBpeGVscworKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3Rpb25waXhlbHMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogNjY2NjcvMTAwMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIzMDQwMCwgMHhlZTA1YjUwOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjMwNDAwLCAweDIzYjI4YjI0CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMzA0MDAsIDB4NGE0ZDYwMDcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21vdi0xZWxpc3QtMWN0dHMgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtMWVsaXN0LTFjdHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OWQ0N2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtMWVsaXN0LTFjdHRzCkBAIC0wLDAgKzEsNTcgQEAKKyNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcworI3ZlcnNpb246IDIKKyNoYXNoOiBNRDUKKyN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQorI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0NjA4MDAsIDNkZDIxMzk1ZmM1ZDM0MjlmOWIwODQ5MmY0N2FmMDkzCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA0NjA4MDAsIDExNzAwOWNjZWVjYzE2MGMzODVkYWMzZDM0NDUwNWM5CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NjA4MDAsIGMwOTNhYTZlODc0NzI4N2NmZWI3NThmMmRhNzQ3NmQxCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA0NjA4MDAsIDZiN2M5NGEzMzYzZjMzODFmN2Y5MzBhYzAyYjBjOTc1CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICA0NjA4MDAsIDg3YzM4MjRhMGVmMzU2NmYxYTM4NGMzYzNlMmIwZDk2CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICA0NjA4MDAsIDNkZTQ4ZjMwMDlhMTU5ZTQ3MzdiNTk5MzEwMjI2NmRlCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICA0NjA4MDAsIDJiZTBlZDFhZmU5MjEwOTM2NDVhZjJmZjkxNzI4MWFiCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICA0NjA4MDAsIGE4OTE3MGM4NDEzMzA1ZmRiYThkNDEzYTUwODBlNTdhCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICA0NjA4MDAsIDVhM2JlMTMxMjIyYzIyM2VmOGVjY2Q5NjM2MzMwODM5CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICA0NjA4MDAsIDAxMDY4YjQyMzUyNjQ4MWI5NzMyMjE0YzE2YjllMjI5CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICA0NjA4MDAsIGY5ZWE2MDU2MDE1NGU4MmQ3N2UyNjYxYzM0ZGNhMTQzCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA0NjA4MDAsIGQ3N2Y1YjgyZTM0ZWE1YTQ1MDA3NmE4NTE0MWE1NjE4CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICA0NjA4MDAsIDkxZmY0ZWZjZmMzYTIzMDFmYjIzMjkxMzllMGU3MWEyCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICA0NjA4MDAsIGFmOGQ5MTQwMDhmNWY2NGYyZWMxZmFkZmFlOGJjNjk3CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICA0NjA4MDAsIGFiYjJjNGZkMWYxY2UzYzQ0OTIzNmRhMjQ2YjYyYmVmCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICA0NjA4MDAsIDY2YjA1NThmMDNkZDVhNDcyODM2ZmVhMDQ1ZGQwNmVhCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICA0NjA4MDAsIDIyNDIwN2QzZTViOTNmYzRlOGM3MWI3ODJhYWJjYTUxCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICA0NjA4MDAsIGVmOTc1Y2ZhN2JjNGRlODhmMTMzM2ViMzAxZjdlYmRkCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICA0NjA4MDAsIGQ3NWJmNzkwMDAzZDJiMWVlNTZiZWEwY2VmMDY4ZThlCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA0NjA4MDAsIGQ3YTE2OTM1ZDdmODA4Y2NhMDQ2ZGI5NzFlNWI2MTJhCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA0NjA4MDAsIGY0OWQwNmNhNDk5NWMyNjdmZGM4YzY3NGM5OTJjZGQxCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICA0NjA4MDAsIGY1M2ZkNjM0MTU0ZGVjMjZlYzg1YjZiZWYwMWJhODkwCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA0NjA4MDAsIGQyZDM2MzcxZTUwYWNlNDNhZTRkMmJhYjA5MmEyNGMzCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA0NjA4MDAsIGE0YzA4ZjQ5NzllN2RjOTE0ZDY5YTE3MGUxOTg2NTZjCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICA0NjA4MDAsIDBkMTI4ZTMzZjE1NmZjYzIyOGQ5MjExN2Q1NmE1ZjkzCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA0NjA4MDAsIDUyZmI4ZmM3NWM4NDhlZDliYzYxZDUxMjk0NzNmM2ZiCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA0NjA4MDAsIDU1MTdmNzlkMmNjYjRmYzkzZWRlMDYxYmZjZDYzMmVhCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICA0NjA4MDAsIGMyNGZlYTllOGQwMjI0MDMyOGRlM2NiNTIwOTA0YTZiCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA0NjA4MDAsIDBjYmU0NmE0YjkxYTBiZDIzNWQ1ZTc0MDg0MDU4ZTYxCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA0NjA4MDAsIDM1NWIxN2MyZmViNmI4MDljOTViYjcxYjMzM2E2NzBkCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICA0NjA4MDAsIDA2MzY0M2JhOTQxMjkzYmE5NWUwMjRkYTIwMjI2N2NiCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA0NjA4MDAsIDhiMzE3MjdkNDkyZmE5YjI1ZTAyNWExZjQ1NDI1YjE2CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA0NjA4MDAsIDQ1YzU5MDFjMjRkMmFlMjMwNGIzZTgyYzA3NWE5NmJmCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICA0NjA4MDAsIGI3ZDQ0NDlkMGUyMTU3MDkzNzI3Y2IwZjAwNjQ4NzUxCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA0NjA4MDAsIDE2NzY0MmU3MDJmNjQ1ODUzYzk3NDUzMTg1Mzk4N2Y4CiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA0NjA4MDAsIDJlYjQ1OTZkNjc1ZjA5OWJhYjZjM2I0MGNlMzBmZDg4CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICA0NjA4MDAsIDhkZDFhZWMzNWI5MjYxMGNiMjJiZWRkM2M1NGNiMjZhCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA0NjA4MDAsIDhlYWNmMzJlNThkOWE3MzE0NjdhYmEwZjYxZDllNjBmCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA0NjA4MDAsIDZhNzM1Zjg2ZDE4ZWJlMjY1ODk0ZjYzMzA3MWEyNWQ3CiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICA0NjA4MDAsIDg0M2IwYzkzODg0NWI3MmUxYzIzYmMzOWY3NDc5Y2JhCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICA0NjA4MDAsIGNhMjA5OWI0MzE0MWNiOTEzMTUwNWFiNDBhYzM5NTlmCiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICA0NjA4MDAsIGU2NTMyMmUxOTI5ZGVmMTFmOTk4NTY4MzM2NWFiNmJmCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICA0NjA4MDAsIDU2NTQxMGE4YzJmNGI1MGExOTJmOTU5MGU2YWIzMmMwCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICA0NjA4MDAsIGZhOWE4YWM2MjU4NTRjYzI3OWEwNzc2NmRkYWQ2ZTZmCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICA0NjA4MDAsIGE0NmFjNjI4ODZjNDhlZGVmM2RjNThkZTM0YTJhMDA0CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICA0NjA4MDAsIDQxNGUwMWI2YzI0ZTcxZWZjOWM1OGY2NWRjMGY0YWNhCiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICA0NjA4MDAsIGUwNTAxYjkwM2YyMWI0OTBkYTA0OWU1MWU3YTAyYmFlCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICA0NjA4MDAsIDQ4YjMwZWVjMWU5ZDg2MmVlNTRiMTM2MDQ1ZTFkOTBmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tb3YtMWVsaXN0LWVuZHMtbGFzdC1iZnJhbWUgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtMWVsaXN0LWVuZHMtbGFzdC1iZnJhbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4ZjFhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21vdi0xZWxpc3QtZW5kcy1sYXN0LWJmcmFtZQpAQCAtMCwwICsxLDU2IEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMS8yNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKKyNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNDYwODAwLCBiM2Q3NzQ2MDNhMjJkYmY5ZTk1MjQ2NWMwZDI5NTE2NgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDYwODAwLCBkOGY4OGU0MjY5ODg4ZGZhZGViMTViZWM2NjJhMzg1MQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDYwODAwLCA2ZDZlNjg2MDcwMTQzZjc5N2Y4ZjFlY2E0M2Q5Y2YyOAorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgNDYwODAwLCBhOTM0Zjg4Mzk2OGU3MWYyMmRmMDQ0ZjA0M2U2MWIxNAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNDYwODAwLCA4M2RjNjVjNzcwM2Y0M2NlOTdjODdlZWE3MTkxZjY5ZQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgNDYwODAwLCBkNjMzYWIwZGJhNjQyNzdiMTA0ZmY1YzJlMTk4MzQyNAorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgNDYwODAwLCA2YzdkMmM3NDgxYmQxMTU4NGQ2OGRiYjkyNjJkODM1MQorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgNDYwODAwLCA1OWIwYmJjNjYxYjc5YmE4MmQ3MjZjYTRkMjgyNTVmMgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgNDYwODAwLCA4MjFjZDdjYTBhZGM0ZDZhM2YxMDQxOWI2YzQyODNhNgorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgNDYwODAwLCA0NjU1YjFkNmU4MjM3YjJlODgwZjViNDE0MGY3Y2YwOAorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgNDYwODAwLCAyNjQ4NTg2NTNmOWFjMDYyM2ZmYzg3Y2E1ZTRjOTkzOQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgNDYwODAwLCBiNzEyOWU5MWI5YTZiNGY4NTgyNzQ3ZjEyY2FmYTUyZQorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgNDYwODAwLCAxZjY1OTZmYmE2NTVlMjEzZmQ1YzJlYTk5YTg5MTEzOAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgNDYwODAwLCBjOGQ2N2RjOGZhOGJkY2EyNjMwNjBhZTU0MmU1NTI3OAorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgNDYwODAwLCA1N2FhNjgwYjY0YjE0MGVhZWFhN2Y0MjUwYzEyYjU5ZQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgNDYwODAwLCBiODdlOGE5YzA3MDFjZDg4MTFkZDM4MjkyYjk5OTRmNworMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgNDYwODAwLCAyNDI3ZWIyOTAwYzhlMThkYTBmMzZlNDc3OTlhNWVkOAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgNDYwODAwLCA3MTBhNzI3YTdiYTUxYmMyOTM4Y2E4MzM3NmM2ZWRkNgorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNDYwODAwLCA0NGQ1Y2U4MDgwNGQ5Y2E0NzBmOWU1MzQ4YzY2ZTliMworMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNDYwODAwLCA0NDhlMWZjM2FmNDJjNDE0M2U1ZmM0MTIwMDkwY2RkNgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgNDYwODAwLCA3YzJjNGM2MTg0M2NmZGQwMzNiOGZhMjk1NzY2YTUyNAorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNDYwODAwLCAyMGExOTdjYjRlMjA4NTdlMTM1ZDRjMTA5NDU5ODdmNgorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNDYwODAwLCA3NTM0YjAwZTYwZjY5MjBkYTdiNzY3YWVmMDg3NmU2NQorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgNDYwODAwLCBiODhjZWRiODQxNDVmMDcyMjZkNTU3M2FhNTdhMWNjZQorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNDYwODAwLCA2MjA3NTEyNzE5ODVkZjM3MjhiNmRiYzYyNzk3NDE4MworMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNDYwODAwLCA2NDM3MTliMjZhYzkzZjkzZDE2NzRmZWU5N2M1OGEzNQorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgNDYwODAwLCA1ZDNmOGZhOWFiYWIwMjU2YWZiZjQyODVjZDMzNzgwNAorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNDYwODAwLCBhNmMzMDJjNTRjNjQ4MTA4OGY5YzI3MTg5ZWNkYTVhOAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNDYwODAwLCAyODUxYWQ4NmMxNWExZGM3YjZkNGEwZmU4ZjE1ZGU4ZgorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgNDYwODAwLCA0MjE1NzAwNTAxODkwOGM4MTBiMTg0MDg1Njc3ODQ4MgorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNDYwODAwLCAyNTQxMDQyMDM4NTY4MzI5OTIyZmQ2ZjcxODdhYWQ0OQorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNDYwODAwLCA4NTViOWVjZmE5ZGE2NmVmNTk3MWZjZWE3ZTUxNTg5MAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgNDYwODAwLCA4NWRmNjEwMTgzZWZjZTVkZTkxOTQ2Y2I5MDkwMTljOQorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNDYwODAwLCAzNjliY2U4M2Q4YWEwYWMzY2ZiODUzYjdlMjg4Njg5NgorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNDYwODAwLCBiNDI4ZTdiMjk0ZTVhYzBkMzE2OTcxZTAyYTI1YjEyYQorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgNDYwODAwLCBhYTY2MzIxOTk1Yjg5MGU4ZGJkMGQ3YjE4OGVjYjE5YworMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNDYwODAwLCAxNTMzZTNjODVmZDlkMWY2NzEwNDQyNjUzYjkzNmVmMAorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNDYwODAwLCA5OWYzZDM4Yzk1ZjFlNGMwYjQ0MjAwN2E0NjZmNzdjYgorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgNDYwODAwLCAzMGUwMDdkOGE0YzBmMGNmYTIyYzhiNjA1MTk4MGI1OQorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgNDYwODAwLCBmZWYyMTQyNmI1NDA0OGFmNjE3MjExMjM0ZWU5YjYwMgorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgNDYwODAwLCBmZjlhNDgyYzc5M2E4ZTk5NTBjMGFhN2UyODQ1Y2EwZQorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgNDYwODAwLCBhYzBiYjU4Njc4NmMzNWE1MWJkYjZhNTUxNGZmNTRiOQorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgNDYwODAwLCBiYjAwOGVjNzRmZTY0MmQ2MzUwYmIxYjRjOTIyYTZiMAorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgNDYwODAwLCAzZTQyNTVkMWU4MTdiOWM2ZmEyY2ZiYjBmMTk4MDY5ZAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgNDYwODAwLCAwZmUwNDI0MmYwNDQxZmE1YzkwZTY5Y2EwMTVmNGIyZAorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgNDYwODAwLCBmMTRjMTJlYzAwOGE1NmM5YWE5OWVmMWJlODU3YWQyMworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgNDYwODAwLCA0M2FjNTU4Mzk3YjY5OWFjODJmN2UxMjgxMGM3YWRlOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LTFlbGlzdC1ub2N0dHMgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtMWVsaXN0LW5vY3R0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzlkNDdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LTFlbGlzdC1ub2N0dHMKQEAgLTAsMCArMSw1NyBAQAorI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCisjdmVyc2lvbjogMgorI2hhc2g6IE1ENQorI3RiIDA6IDEvMjQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCisjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgM2RkMjEzOTVmYzVkMzQyOWY5YjA4NDkyZjQ3YWYwOTMKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQ2MDgwMCwgMTE3MDA5Y2NlZWNjMTYwYzM4NWRhYzNkMzQ0NTA1YzkKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDQ2MDgwMCwgYzA5M2FhNmU4NzQ3Mjg3Y2ZlYjc1OGYyZGE3NDc2ZDEKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDQ2MDgwMCwgNmI3Yzk0YTMzNjNmMzM4MWY3ZjkzMGFjMDJiMGM5NzUKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDQ2MDgwMCwgODdjMzgyNGEwZWYzNTY2ZjFhMzg0YzNjM2UyYjBkOTYKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDQ2MDgwMCwgM2RlNDhmMzAwOWExNTllNDczN2I1OTkzMTAyMjY2ZGUKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDQ2MDgwMCwgMmJlMGVkMWFmZTkyMTA5MzY0NWFmMmZmOTE3MjgxYWIKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDQ2MDgwMCwgYTg5MTcwYzg0MTMzMDVmZGJhOGQ0MTNhNTA4MGU1N2EKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDQ2MDgwMCwgNWEzYmUxMzEyMjJjMjIzZWY4ZWNjZDk2MzYzMzA4MzkKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDQ2MDgwMCwgMDEwNjhiNDIzNTI2NDgxYjk3MzIyMTRjMTZiOWUyMjkKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDQ2MDgwMCwgZjllYTYwNTYwMTU0ZTgyZDc3ZTI2NjFjMzRkY2ExNDMKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDQ2MDgwMCwgZDc3ZjViODJlMzRlYTVhNDUwMDc2YTg1MTQxYTU2MTgKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDQ2MDgwMCwgOTFmZjRlZmNmYzNhMjMwMWZiMjMyOTEzOWUwZTcxYTIKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDQ2MDgwMCwgYWY4ZDkxNDAwOGY1ZjY0ZjJlYzFmYWRmYWU4YmM2OTcKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDQ2MDgwMCwgYWJiMmM0ZmQxZjFjZTNjNDQ5MjM2ZGEyNDZiNjJiZWYKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDQ2MDgwMCwgNjZiMDU1OGYwM2RkNWE0NzI4MzZmZWEwNDVkZDA2ZWEKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDQ2MDgwMCwgMjI0MjA3ZDNlNWI5M2ZjNGU4YzcxYjc4MmFhYmNhNTEKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDQ2MDgwMCwgZWY5NzVjZmE3YmM0ZGU4OGYxMzMzZWIzMDFmN2ViZGQKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDQ2MDgwMCwgZDc1YmY3OTAwMDNkMmIxZWU1NmJlYTBjZWYwNjhlOGUKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDQ2MDgwMCwgZDdhMTY5MzVkN2Y4MDhjY2EwNDZkYjk3MWU1YjYxMmEKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDQ2MDgwMCwgZjQ5ZDA2Y2E0OTk1YzI2N2ZkYzhjNjc0Yzk5MmNkZDEKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDQ2MDgwMCwgZjUzZmQ2MzQxNTRkZWMyNmVjODViNmJlZjAxYmE4OTAKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDQ2MDgwMCwgZDJkMzYzNzFlNTBhY2U0M2FlNGQyYmFiMDkyYTI0YzMKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDQ2MDgwMCwgYTRjMDhmNDk3OWU3ZGM5MTRkNjlhMTcwZTE5ODY1NmMKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDQ2MDgwMCwgMGQxMjhlMzNmMTU2ZmNjMjI4ZDkyMTE3ZDU2YTVmOTMKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDQ2MDgwMCwgNTJmYjhmYzc1Yzg0OGVkOWJjNjFkNTEyOTQ3M2YzZmIKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDQ2MDgwMCwgNTUxN2Y3OWQyY2NiNGZjOTNlZGUwNjFiZmNkNjMyZWEKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDQ2MDgwMCwgYzI0ZmVhOWU4ZDAyMjQwMzI4ZGUzY2I1MjA5MDRhNmIKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDQ2MDgwMCwgMGNiZTQ2YTRiOTFhMGJkMjM1ZDVlNzQwODQwNThlNjEKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDQ2MDgwMCwgMzU1YjE3YzJmZWI2YjgwOWM5NWJiNzFiMzMzYTY3MGQKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDQ2MDgwMCwgMDYzNjQzYmE5NDEyOTNiYTk1ZTAyNGRhMjAyMjY3Y2IKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDQ2MDgwMCwgOGIzMTcyN2Q0OTJmYTliMjVlMDI1YTFmNDU0MjViMTYKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDQ2MDgwMCwgNDVjNTkwMWMyNGQyYWUyMzA0YjNlODJjMDc1YTk2YmYKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDQ2MDgwMCwgYjdkNDQ0OWQwZTIxNTcwOTM3MjdjYjBmMDA2NDg3NTEKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDQ2MDgwMCwgMTY3NjQyZTcwMmY2NDU4NTNjOTc0NTMxODUzOTg3ZjgKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDQ2MDgwMCwgMmViNDU5NmQ2NzVmMDk5YmFiNmMzYjQwY2UzMGZkODgKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDQ2MDgwMCwgOGRkMWFlYzM1YjkyNjEwY2IyMmJlZGQzYzU0Y2IyNmEKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDQ2MDgwMCwgOGVhY2YzMmU1OGQ5YTczMTQ2N2FiYTBmNjFkOWU2MGYKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDQ2MDgwMCwgNmE3MzVmODZkMThlYmUyNjU4OTRmNjMzMDcxYTI1ZDcKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDQ2MDgwMCwgODQzYjBjOTM4ODQ1YjcyZTFjMjNiYzM5Zjc0NzljYmEKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDQ2MDgwMCwgY2EyMDk5YjQzMTQxY2I5MTMxNTA1YWI0MGFjMzk1OWYKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDQ2MDgwMCwgZTY1MzIyZTE5MjlkZWYxMWY5OTg1NjgzMzY1YWI2YmYKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDQ2MDgwMCwgNTY1NDEwYThjMmY0YjUwYTE5MmY5NTkwZTZhYjMyYzAKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDQ2MDgwMCwgZmE5YThhYzYyNTg1NGNjMjc5YTA3NzY2ZGRhZDZlNmYKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDQ2MDgwMCwgYTQ2YWM2Mjg4NmM0OGVkZWYzZGM1OGRlMzRhMmEwMDQKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDQ2MDgwMCwgNDE0ZTAxYjZjMjRlNzFlZmM5YzU4ZjY1ZGMwZjRhY2EKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDQ2MDgwMCwgZTA1MDFiOTAzZjIxYjQ5MGRhMDQ5ZTUxZTdhMDJiYWUKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDQ2MDgwMCwgNDhiMzBlZWMxZTlkODYyZWU1NGIxMzYwNDVlMWQ5MGYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21vdi0yZWxpc3QtZWxpc3QxLWVuZHMtYmZyYW1lIGIvdGVzdHMvcmVmL2ZhdGUvbW92LTJlbGlzdC1lbGlzdDEtZW5kcy1iZnJhbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyOTZjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21vdi0yZWxpc3QtZWxpc3QxLWVuZHMtYmZyYW1lCkBAIC0wLDAgKzEsNTEgQEAKKyNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcworI3ZlcnNpb246IDIKKyNoYXNoOiBNRDUKKyN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQorI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0NjA4MDAsIGIzZDc3NDYwM2EyMmRiZjllOTUyNDY1YzBkMjk1MTY2CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA0NjA4MDAsIGQ4Zjg4ZTQyNjk4ODhkZmFkZWIxNWJlYzY2MmEzODUxCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NjA4MDAsIDZkNmU2ODYwNzAxNDNmNzk3ZjhmMWVjYTQzZDljZjI4CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA0NjA4MDAsIGE5MzRmODgzOTY4ZTcxZjIyZGYwNDRmMDQzZTYxYjE0CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICA0NjA4MDAsIDgzZGM2NWM3NzAzZjQzY2U5N2M4N2VlYTcxOTFmNjllCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICA0NjA4MDAsIGQ2MzNhYjBkYmE2NDI3N2IxMDRmZjVjMmUxOTgzNDI0CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICA0NjA4MDAsIDZjN2QyYzc0ODFiZDExNTg0ZDY4ZGJiOTI2MmQ4MzUxCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICA0NjA4MDAsIDU5YjBiYmM2NjFiNzliYTgyZDcyNmNhNGQyODI1NWYyCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICA0NjA4MDAsIDgyMWNkN2NhMGFkYzRkNmEzZjEwNDE5YjZjNDI4M2E2CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICA0NjA4MDAsIDQ2NTViMWQ2ZTgyMzdiMmU4ODBmNWI0MTQwZjdjZjA4CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICA0NjA4MDAsIDI2NDg1ODY1M2Y5YWMwNjIzZmZjODdjYTVlNGM5OTM5CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA0NjA4MDAsIGI3MTI5ZTkxYjlhNmI0Zjg1ODI3NDdmMTJjYWZhNTJlCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICA0NjA4MDAsIDFmNjU5NmZiYTY1NWUyMTNmZDVjMmVhOTlhODkxMTM4CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICA0NjA4MDAsIGM4ZDY3ZGM4ZmE4YmRjYTI2MzA2MGFlNTQyZTU1Mjc4CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICA0NjA4MDAsIDU3YWE2ODBiNjRiMTQwZWFlYWE3ZjQyNTBjMTJiNTllCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICA0NjA4MDAsIGI4N2U4YTljMDcwMWNkODgxMWRkMzgyOTJiOTk5NGY3CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICA0NjA4MDAsIDI0MjdlYjI5MDBjOGUxOGRhMGYzNmU0Nzc5OWE1ZWQ4CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICA0NjA4MDAsIDcxMGE3MjdhN2JhNTFiYzI5MzhjYTgzMzc2YzZlZGQ2CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICA0NjA4MDAsIDYyMDc1MTI3MTk4NWRmMzcyOGI2ZGJjNjI3OTc0MTgzCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA0NjA4MDAsIDY0MzcxOWIyNmFjOTNmOTNkMTY3NGZlZTk3YzU4YTM1CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA0NjA4MDAsIDVkM2Y4ZmE5YWJhYjAyNTZhZmJmNDI4NWNkMzM3ODA0CiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICA0NjA4MDAsIGE2YzMwMmM1NGM2NDgxMDg4ZjljMjcxODllY2RhNWE4CiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA0NjA4MDAsIDI4NTFhZDg2YzE1YTFkYzdiNmQ0YTBmZThmMTVkZThmCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA0NjA4MDAsIDQyMTU3MDA1MDE4OTA4YzgxMGIxODQwODU2Nzc4NDgyCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICA0NjA4MDAsIDI1NDEwNDIwMzg1NjgzMjk5MjJmZDZmNzE4N2FhZDQ5CiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA0NjA4MDAsIDg1NWI5ZWNmYTlkYTY2ZWY1OTcxZmNlYTdlNTE1ODkwCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA0NjA4MDAsIDg1ZGY2MTAxODNlZmNlNWRlOTE5NDZjYjkwOTAxOWM5CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICA0NjA4MDAsIDM2OWJjZTgzZDhhYTBhYzNjZmI4NTNiN2UyODg2ODk2CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA0NjA4MDAsIGI0MjhlN2IyOTRlNWFjMGQzMTY5NzFlMDJhMjViMTJhCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA0NjA4MDAsIGFhNjYzMjE5OTViODkwZThkYmQwZDdiMTg4ZWNiMTljCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICA0NjA4MDAsIDE1MzNlM2M4NWZkOWQxZjY3MTA0NDI2NTNiOTM2ZWYwCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA0NjA4MDAsIDk5ZjNkMzhjOTVmMWU0YzBiNDQyMDA3YTQ2NmY3N2NiCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA0NjA4MDAsIDMwZTAwN2Q4YTRjMGYwY2ZhMjJjOGI2MDUxOTgwYjU5CiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICA0NjA4MDAsIGZlZjIxNDI2YjU0MDQ4YWY2MTcyMTEyMzRlZTliNjAyCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA0NjA4MDAsIGZmOWE0ODJjNzkzYThlOTk1MGMwYWE3ZTI4NDVjYTBlCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA0NjA4MDAsIGFjMGJiNTg2Nzg2YzM1YTUxYmRiNmE1NTE0ZmY1NGI5CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICA0NjA4MDAsIGJiMDA4ZWM3NGZlNjQyZDYzNTBiYjFiNGM5MjJhNmIwCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA0NjA4MDAsIDNlNDI1NWQxZTgxN2I5YzZmYTJjZmJiMGYxOTgwNjlkCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA0NjA4MDAsIDBmZTA0MjQyZjA0NDFmYTVjOTBlNjljYTAxNWY0YjJkCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICA0NjA4MDAsIGYxNGMxMmVjMDA4YTU2YzlhYTk5ZWYxYmU4NTdhZDIzCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICA0NjA4MDAsIDQzYWM1NTgzOTdiNjk5YWM4MmY3ZTEyODEwYzdhZGU5CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICA0NjA4MDAsIDM1NDMxZWIxYThiZTRmMDVkMDhkMjMzODA2NTUxNzhjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tb3YtM2VsaXN0IGIvdGVzdHMvcmVmL2ZhdGUvbW92LTNlbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY0OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LTNlbGlzdApAQCAtMCwwICsxLDU3IEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMS8yNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKKyNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNDYwODAwLCA4MGZiYmRlYzU4OWUxNWU2YzQ5M2I0NGQyNDNmOTJhOQorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDYwODAwLCBmNGIyMzI5M2JiMmVjZjY5Y2MzNTcwODUzZDhjNTZhMQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDYwODAwLCAwYzAzY2UyYzFjNmVjNDA1ZDc0NTU0NjVlY2Q1NTlhMworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgNDYwODAwLCA3OTIxNzkxNjk1NTM3ZmJhMmMzYzEyM2RhNDgzNGNiOQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNDYwODAwLCAzMGM4ZTI5MDNhNTYxYjg0ZDRjYmFmOTVjNjY4ZDIzNgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgNDYwODAwLCA3ZmY0MmU5OTgyMTdjMTc1OTJkZGY2YjU4NGYyNmNlZgorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgNDYwODAwLCA1ZTQwMmM0OGJmMDk3ZGIyZDMxYjgyYmI0MTk0YTM4MgorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgNDYwODAwLCA4MjRjNDllOTJjOGFlNmQ5OWEwMjA3YjUxNGRkNzU2YworMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgNDYwODAwLCAyNGYxODkyMTZhMWQ5Y2YyMzEzYjJkNmRiZTNkYmRkMworMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgNDYwODAwLCA1MTkxNzlhOGU3NDI3NWQyNmIxODMzNzQ2MzdlMDAzZgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgNDYwODAwLCBmMTgzMzFkZGNlZjBhZGY1YjA2OWJmYTk4YmFmOGRiNAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgNDYwODAwLCAwODFmNjE2ODg2OTBkNDdkYmRkZGQ1Mzg0ZTVkNWE3MAorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgNDYwODAwLCA5MGRiZjAxOWI5MDM1NDMzMzcxYThkZjQxYTkyNjhiNworMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgNDYwODAwLCBiYjVhZGZiOWM2NjczMjg5OGIzNDE4NmVjYTE2NjdiYQorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgNDYwODAwLCBjYzA4Y2ZkNjRmMzc3ODNlY2RkYWYxNDNmNmFkNzhiYworMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgNDYwODAwLCBiOGFlMjFkMDI0ZmU0ZGY5MDNkNTZmNDUyMTk5M2M3MgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgNDYwODAwLCBiNDVhOTk5MDdmMDQ1ZGNhZGYwYTJiZWZjMTE1NTVlMworMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgNDYwODAwLCA2MDNiYTkzNTg0NWU2NWFiNmNjY2JiZWM4OGJiZjYwZAorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNDYwODAwLCBkZjgwYzhkM2U2YTc3MjU4YTMwNjkwM2YxNzk5NWExOAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNDYwODAwLCA0YjdlOTBjMGE1ZmQwZTBjZDk1OGQ0N2YwYWZhYzYzNgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgNDYwODAwLCA5ZmViNmUzNjE4MmYxNzQ1YmU2Mzg3ZWRlYTI0MGViNgorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNDYwODAwLCA4NmU2ZGU0YmQwYTVmZjc1NThmNGNmNmMxZWMzOTMwZAorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNDYwODAwLCA3MjZiNjlkZjc3ZWRiZTdiNTAzZDQ2OTg2NTZkMTMyMAorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgNDYwODAwLCBkMjgyZmI3YTk1M2FjMjA1YjBhNDNkMDBjMmQ2MGEzMworMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNDYwODAwLCBlZWNlM2RhYTcwY2MyMDIwOGRkNzVkOTFhYzg0YzhmZAorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNDYwODAwLCBjODZkMjNlNzNiY2NlMzUxZmMzMTVmYjFmMTMzNDhkYQorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgNDYwODAwLCA5MzQ5N2I0ZjdjNWFkOWQ2MTIxMjIzOWI3YzlkMjc3MAorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNDYwODAwLCBlYjIxN2QyYzEyZGU2NzkwMzgzNWE4YzU4ZjYyMDQ4OAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNDYwODAwLCBkOTY2NDgwODY3YmI1NGM4Y2QwNDRmMTgzODhlZDQ4NgorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgNDYwODAwLCAzZWE2MjA3OTQyYjMxODFmZGQ4ZThhYTZjYWUxMDYyYQorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNDYwODAwLCAyNjIwZGY1NGFjYTA4NmVjMGZiOTUyN2M2ZTZmNTEzNQorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNDYwODAwLCA0M2JiNzMyMGYwYmI1ODMxODhkYzk2NWRkYmZhZGU5MAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgNDYwODAwLCAwY2RkYWEwNDY0NWY4MDRlMDJmNjViMDgzNjQxMjExMworMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNDYwODAwLCA4M2IyZGM5NTgwNzI4OWQ3ZjRhNDYzMmJmMThjMmU5NworMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNDYwODAwLCA5ODEzNGQwZTQxZTZkZDEyODI3MDQ5Y2NmMzNiNDY2OQorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgNDYwODAwLCA1NmY1NTYzMTczMWZhMzljN2FjYmFiMGFmZWIyZWIxYgorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNDYwODAwLCAzNzljMTEwNWJlMDlkODM2YTUxNWRjOTA5NDU1ZGRmNAorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNDYwODAwLCAxZGY4N2M0N2U5ZDk4NzMxZmFmMWMzODg1Yjc3ZTVkYQorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgNDYwODAwLCA5YTg3MzRiY2JmZGI0ZDk3ZTUzMDY4M2I4YjU1NmEyNgorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgNDYwODAwLCBjN2E3OTkwZDBjZGRjNWFkZmJlMjdkYTdhNDJlMDI1ZQorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgNDYwODAwLCAwYzgxZTQ2MDExZTAzYmU0MTBmZWFmMDU2MjA3ZmQ1NQorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgNDYwODAwLCBjYTc2ZTRlNjMwMTZmZjI5ZDhhZWViOWNiMDUzYmI2YworMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgNDYwODAwLCBjZWJmYmUyOTljMTdjMWY4ZmMxZTZiMTg5NTU1YzNjMgorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgNDYwODAwLCA0ZjAwMmM1ZmVjYTVlNzVmMDcwODllMGRmNDc1MDdkZAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgNDYwODAwLCBjNWZkODNmYzRhNzQ1YWJlZTliM2Q5YTZlZWM5ZGQzZQorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgNDYwODAwLCA1N2Q5YmFkOWI0NWFhMjc0NmRlNWQ4YmRjMmMyNDk2OQorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgNDYwODAwLCA5ODMxNjczYWQ3ZGVjMTY3YWY0YTk1OWY2NDI1ODk0OQorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgNDYwODAwLCA3N2ExY2IyMDhmNzBmNTFiY2IwMWUyOGQ4Y2JhNzNiNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LTNlbGlzdC0xY3R0cyBiL3Rlc3RzL3JlZi9mYXRlL21vdi0zZWxpc3QtMWN0dHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5ZDQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21vdi0zZWxpc3QtMWN0dHMKQEAgLTAsMCArMSw1NyBAQAorI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCisjdmVyc2lvbjogMgorI2hhc2g6IE1ENQorI3RiIDA6IDEvMjQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCisjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgM2RkMjEzOTVmYzVkMzQyOWY5YjA4NDkyZjQ3YWYwOTMKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQ2MDgwMCwgMTE3MDA5Y2NlZWNjMTYwYzM4NWRhYzNkMzQ0NTA1YzkKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDQ2MDgwMCwgYzA5M2FhNmU4NzQ3Mjg3Y2ZlYjc1OGYyZGE3NDc2ZDEKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDQ2MDgwMCwgNmI3Yzk0YTMzNjNmMzM4MWY3ZjkzMGFjMDJiMGM5NzUKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDQ2MDgwMCwgODdjMzgyNGEwZWYzNTY2ZjFhMzg0YzNjM2UyYjBkOTYKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDQ2MDgwMCwgM2RlNDhmMzAwOWExNTllNDczN2I1OTkzMTAyMjY2ZGUKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDQ2MDgwMCwgMmJlMGVkMWFmZTkyMTA5MzY0NWFmMmZmOTE3MjgxYWIKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDQ2MDgwMCwgYTg5MTcwYzg0MTMzMDVmZGJhOGQ0MTNhNTA4MGU1N2EKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDQ2MDgwMCwgNWEzYmUxMzEyMjJjMjIzZWY4ZWNjZDk2MzYzMzA4MzkKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDQ2MDgwMCwgMDEwNjhiNDIzNTI2NDgxYjk3MzIyMTRjMTZiOWUyMjkKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDQ2MDgwMCwgZjllYTYwNTYwMTU0ZTgyZDc3ZTI2NjFjMzRkY2ExNDMKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDQ2MDgwMCwgZDc3ZjViODJlMzRlYTVhNDUwMDc2YTg1MTQxYTU2MTgKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDQ2MDgwMCwgOTFmZjRlZmNmYzNhMjMwMWZiMjMyOTEzOWUwZTcxYTIKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDQ2MDgwMCwgYWY4ZDkxNDAwOGY1ZjY0ZjJlYzFmYWRmYWU4YmM2OTcKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDQ2MDgwMCwgYWJiMmM0ZmQxZjFjZTNjNDQ5MjM2ZGEyNDZiNjJiZWYKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDQ2MDgwMCwgNjZiMDU1OGYwM2RkNWE0NzI4MzZmZWEwNDVkZDA2ZWEKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDQ2MDgwMCwgMjI0MjA3ZDNlNWI5M2ZjNGU4YzcxYjc4MmFhYmNhNTEKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDQ2MDgwMCwgZWY5NzVjZmE3YmM0ZGU4OGYxMzMzZWIzMDFmN2ViZGQKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDQ2MDgwMCwgZDc1YmY3OTAwMDNkMmIxZWU1NmJlYTBjZWYwNjhlOGUKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDQ2MDgwMCwgZDdhMTY5MzVkN2Y4MDhjY2EwNDZkYjk3MWU1YjYxMmEKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDQ2MDgwMCwgZjQ5ZDA2Y2E0OTk1YzI2N2ZkYzhjNjc0Yzk5MmNkZDEKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDQ2MDgwMCwgZjUzZmQ2MzQxNTRkZWMyNmVjODViNmJlZjAxYmE4OTAKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDQ2MDgwMCwgZDJkMzYzNzFlNTBhY2U0M2FlNGQyYmFiMDkyYTI0YzMKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDQ2MDgwMCwgYTRjMDhmNDk3OWU3ZGM5MTRkNjlhMTcwZTE5ODY1NmMKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDQ2MDgwMCwgMGQxMjhlMzNmMTU2ZmNjMjI4ZDkyMTE3ZDU2YTVmOTMKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDQ2MDgwMCwgNTJmYjhmYzc1Yzg0OGVkOWJjNjFkNTEyOTQ3M2YzZmIKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDQ2MDgwMCwgNTUxN2Y3OWQyY2NiNGZjOTNlZGUwNjFiZmNkNjMyZWEKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDQ2MDgwMCwgYzI0ZmVhOWU4ZDAyMjQwMzI4ZGUzY2I1MjA5MDRhNmIKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDQ2MDgwMCwgMGNiZTQ2YTRiOTFhMGJkMjM1ZDVlNzQwODQwNThlNjEKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDQ2MDgwMCwgMzU1YjE3YzJmZWI2YjgwOWM5NWJiNzFiMzMzYTY3MGQKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDQ2MDgwMCwgMDYzNjQzYmE5NDEyOTNiYTk1ZTAyNGRhMjAyMjY3Y2IKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDQ2MDgwMCwgOGIzMTcyN2Q0OTJmYTliMjVlMDI1YTFmNDU0MjViMTYKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDQ2MDgwMCwgNDVjNTkwMWMyNGQyYWUyMzA0YjNlODJjMDc1YTk2YmYKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDQ2MDgwMCwgYjdkNDQ0OWQwZTIxNTcwOTM3MjdjYjBmMDA2NDg3NTEKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDQ2MDgwMCwgMTY3NjQyZTcwMmY2NDU4NTNjOTc0NTMxODUzOTg3ZjgKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDQ2MDgwMCwgMmViNDU5NmQ2NzVmMDk5YmFiNmMzYjQwY2UzMGZkODgKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDQ2MDgwMCwgOGRkMWFlYzM1YjkyNjEwY2IyMmJlZGQzYzU0Y2IyNmEKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDQ2MDgwMCwgOGVhY2YzMmU1OGQ5YTczMTQ2N2FiYTBmNjFkOWU2MGYKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDQ2MDgwMCwgNmE3MzVmODZkMThlYmUyNjU4OTRmNjMzMDcxYTI1ZDcKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDQ2MDgwMCwgODQzYjBjOTM4ODQ1YjcyZTFjMjNiYzM5Zjc0NzljYmEKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDQ2MDgwMCwgY2EyMDk5YjQzMTQxY2I5MTMxNTA1YWI0MGFjMzk1OWYKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDQ2MDgwMCwgZTY1MzIyZTE5MjlkZWYxMWY5OTg1NjgzMzY1YWI2YmYKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDQ2MDgwMCwgNTY1NDEwYThjMmY0YjUwYTE5MmY5NTkwZTZhYjMyYzAKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDQ2MDgwMCwgZmE5YThhYzYyNTg1NGNjMjc5YTA3NzY2ZGRhZDZlNmYKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDQ2MDgwMCwgYTQ2YWM2Mjg4NmM0OGVkZWYzZGM1OGRlMzRhMmEwMDQKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDQ2MDgwMCwgNDE0ZTAxYjZjMjRlNzFlZmM5YzU4ZjY1ZGMwZjRhY2EKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDQ2MDgwMCwgZTA1MDFiOTAzZjIxYjQ5MGRhMDQ5ZTUxZTdhMDJiYWUKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDQ2MDgwMCwgNDhiMzBlZWMxZTlkODYyZWU1NGIxMzYwNDVlMWQ5MGYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21vdi0zZWxpc3QtZW5jcnlwdGVkIGIvdGVzdHMvcmVmL2ZhdGUvbW92LTNlbGlzdC1lbmNyeXB0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmNDkyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21vdi0zZWxpc3QtZW5jcnlwdGVkCkBAIC0wLDAgKzEsNTcgQEAKKyNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcworI3ZlcnNpb246IDIKKyNoYXNoOiBNRDUKKyN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQorI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0NjA4MDAsIDgwZmJiZGVjNTg5ZTE1ZTZjNDkzYjQ0ZDI0M2Y5MmE5CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA0NjA4MDAsIGY0YjIzMjkzYmIyZWNmNjljYzM1NzA4NTNkOGM1NmExCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NjA4MDAsIDBjMDNjZTJjMWM2ZWM0MDVkNzQ1NTQ2NWVjZDU1OWEzCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA0NjA4MDAsIDc5MjE3OTE2OTU1MzdmYmEyYzNjMTIzZGE0ODM0Y2I5CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICA0NjA4MDAsIDMwYzhlMjkwM2E1NjFiODRkNGNiYWY5NWM2NjhkMjM2CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICA0NjA4MDAsIDdmZjQyZTk5ODIxN2MxNzU5MmRkZjZiNTg0ZjI2Y2VmCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICA0NjA4MDAsIDVlNDAyYzQ4YmYwOTdkYjJkMzFiODJiYjQxOTRhMzgyCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICA0NjA4MDAsIDgyNGM0OWU5MmM4YWU2ZDk5YTAyMDdiNTE0ZGQ3NTZjCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICA0NjA4MDAsIDI0ZjE4OTIxNmExZDljZjIzMTNiMmQ2ZGJlM2RiZGQzCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICA0NjA4MDAsIDUxOTE3OWE4ZTc0Mjc1ZDI2YjE4MzM3NDYzN2UwMDNmCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICA0NjA4MDAsIGYxODMzMWRkY2VmMGFkZjViMDY5YmZhOThiYWY4ZGI0CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA0NjA4MDAsIDA4MWY2MTY4ODY5MGQ0N2RiZGRkZDUzODRlNWQ1YTcwCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICA0NjA4MDAsIDkwZGJmMDE5YjkwMzU0MzMzNzFhOGRmNDFhOTI2OGI3CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICA0NjA4MDAsIGJiNWFkZmI5YzY2NzMyODk4YjM0MTg2ZWNhMTY2N2JhCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICA0NjA4MDAsIGNjMDhjZmQ2NGYzNzc4M2VjZGRhZjE0M2Y2YWQ3OGJjCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICA0NjA4MDAsIGI4YWUyMWQwMjRmZTRkZjkwM2Q1NmY0NTIxOTkzYzcyCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICA0NjA4MDAsIGI0NWE5OTkwN2YwNDVkY2FkZjBhMmJlZmMxMTU1NWUzCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICA0NjA4MDAsIDYwM2JhOTM1ODQ1ZTY1YWI2Y2NjYmJlYzg4YmJmNjBkCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICA0NjA4MDAsIGRmODBjOGQzZTZhNzcyNThhMzA2OTAzZjE3OTk1YTE4CiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA0NjA4MDAsIDRiN2U5MGMwYTVmZDBlMGNkOTU4ZDQ3ZjBhZmFjNjM2CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA0NjA4MDAsIDlmZWI2ZTM2MTgyZjE3NDViZTYzODdlZGVhMjQwZWI2CiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICA0NjA4MDAsIDg2ZTZkZTRiZDBhNWZmNzU1OGY0Y2Y2YzFlYzM5MzBkCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA0NjA4MDAsIDcyNmI2OWRmNzdlZGJlN2I1MDNkNDY5ODY1NmQxMzIwCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICA0NjA4MDAsIGQyODJmYjdhOTUzYWMyMDViMGE0M2QwMGMyZDYwYTMzCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICA0NjA4MDAsIGVlY2UzZGFhNzBjYzIwMjA4ZGQ3NWQ5MWFjODRjOGZkCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA0NjA4MDAsIGM4NmQyM2U3M2JjY2UzNTFmYzMxNWZiMWYxMzM0OGRhCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICA0NjA4MDAsIDkzNDk3YjRmN2M1YWQ5ZDYxMjEyMjM5YjdjOWQyNzcwCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICA0NjA4MDAsIGViMjE3ZDJjMTJkZTY3OTAzODM1YThjNThmNjIwNDg4CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA0NjA4MDAsIGQ5NjY0ODA4NjdiYjU0YzhjZDA0NGYxODM4OGVkNDg2CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICA0NjA4MDAsIDNlYTYyMDc5NDJiMzE4MWZkZDhlOGFhNmNhZTEwNjJhCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICA0NjA4MDAsIDI2MjBkZjU0YWNhMDg2ZWMwZmI5NTI3YzZlNmY1MTM1CiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA0NjA4MDAsIDQzYmI3MzIwZjBiYjU4MzE4OGRjOTY1ZGRiZmFkZTkwCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICA0NjA4MDAsIDBjZGRhYTA0NjQ1ZjgwNGUwMmY2NWIwODM2NDEyMTEzCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICA0NjA4MDAsIDgzYjJkYzk1ODA3Mjg5ZDdmNGE0NjMyYmYxOGMyZTk3CiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA0NjA4MDAsIDk4MTM0ZDBlNDFlNmRkMTI4MjcwNDljY2YzM2I0NjY5CiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICA0NjA4MDAsIDU2ZjU1NjMxNzMxZmEzOWM3YWNiYWIwYWZlYjJlYjFiCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICA0NjA4MDAsIDM3OWMxMTA1YmUwOWQ4MzZhNTE1ZGM5MDk0NTVkZGY0CiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA0NjA4MDAsIDFkZjg3YzQ3ZTlkOTg3MzFmYWYxYzM4ODViNzdlNWRhCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICA0NjA4MDAsIDlhODczNGJjYmZkYjRkOTdlNTMwNjgzYjhiNTU2YTI2CiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICA0NjA4MDAsIGM3YTc5OTBkMGNkZGM1YWRmYmUyN2RhN2E0MmUwMjVlCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICA0NjA4MDAsIDBjODFlNDYwMTFlMDNiZTQxMGZlYWYwNTYyMDdmZDU1CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICA0NjA4MDAsIGNhNzZlNGU2MzAxNmZmMjlkOGFlZWI5Y2IwNTNiYjZjCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICA0NjA4MDAsIGNlYmZiZTI5OWMxN2MxZjhmYzFlNmIxODk1NTVjM2MyCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICA0NjA4MDAsIDRmMDAyYzVmZWNhNWU3NWYwNzA4OWUwZGY0NzUwN2RkCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICA0NjA4MDAsIGM1ZmQ4M2ZjNGE3NDVhYmVlOWIzZDlhNmVlYzlkZDNlCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICA0NjA4MDAsIDU3ZDliYWQ5YjQ1YWEyNzQ2ZGU1ZDhiZGMyYzI0OTY5CiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICA0NjA4MDAsIDk4MzE2NzNhZDdkZWMxNjdhZjRhOTU5ZjY0MjU4OTQ5CiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICA0NjA4MDAsIDc3YTFjYjIwOGY3MGY1MWJjYjAxZTI4ZDhjYmE3M2I0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tb3YtNDQwaHotMTBtcyBiL3Rlc3RzL3JlZi9mYXRlL21vdi00NDBoei0xMG1zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODg3OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtNDQwaHotMTBtcwpAQCAtMCwwICsxLDExIEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KKyNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICA5NjAsICAgICAxOTIwLCA0NGU3ZTQ4ZmYwODgzNWNlMzBlOTNjNzk3MWRhZTdkZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LWFhYy0yMDQ4LXByaW1pbmcgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtYWFjLTIwNDgtcHJpbWluZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjE2OTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWFhYy0yMDQ4LXByaW1pbmcKQEAgLTAsMCArMSwyMTggQEAKK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0tMjA0OHxwdHNfdGltZT0tMC4wNDY0NDB8ZHRzPS0yMDQ4fGR0c190aW1lPS0wLjA0NjQ0MHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjU4fHBvcz0zNnxmbGFncz1LRHNpZGVfZGF0YXxzaWRlX2RhdGFfdHlwZT1Ta2lwIFNhbXBsZXN8c2tpcF9zYW1wbGVzPTIwNDh8ZGlzY2FyZF9wYWRkaW5nPTB8c2tpcF9yZWFzb249MHxkaXNjYXJkX3JlYXNvbj0wCisKK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0tMTAyNHxwdHNfdGltZT0tMC4wMjMyMjB8ZHRzPS0xMDI0fGR0c190aW1lPS0wLjAyMzIyMHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjU4fHBvcz0yOTR8ZmxhZ3M9S0QKK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0wfHB0c190aW1lPTAuMDAwMDAwfGR0cz0wfGR0c190aW1lPTAuMDAwMDAwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNDZ8cG9zPTU1MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEwMjR8cHRzX3RpbWU9MC4wMjMyMjB8ZHRzPTEwMjR8ZHRzX3RpbWU9MC4wMjMyMjB8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE4Nnxwb3M9Njk4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjA0OHxwdHNfdGltZT0wLjA0NjQ0MHxkdHM9MjA0OHxkdHNfdGltZT0wLjA0NjQ0MHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjIyfHBvcz04ODR8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0zMDcyfHB0c190aW1lPTAuMDY5NjYwfGR0cz0zMDcyfGR0c190aW1lPTAuMDY5NjYwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODZ8cG9zPTExMDZ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz00MDk2fHB0c190aW1lPTAuMDkyODgwfGR0cz00MDk2fGR0c190aW1lPTAuMDkyODgwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDZ8cG9zPTEyOTJ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz01MTIwfHB0c190aW1lPTAuMTE2MTAwfGR0cz01MTIwfGR0c190aW1lPTAuMTE2MTAwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTl8cG9zPTE0OTh8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz02MTQ0fHB0c190aW1lPTAuMTM5MzIwfGR0cz02MTQ0fGR0c190aW1lPTAuMTM5MzIwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzZ8cG9zPTE2OTd8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz03MTY4fHB0c190aW1lPTAuMTYyNTQwfGR0cz03MTY4fGR0c190aW1lPTAuMTYyNTQwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDh8cG9zPTE5MzN8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz04MTkyfHB0c190aW1lPTAuMTg1NzYwfGR0cz04MTkyfGR0c190aW1lPTAuMTg1NzYwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzh8cG9zPTIxNDF8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz05MjE2fHB0c190aW1lPTAuMjA4OTgwfGR0cz05MjE2fGR0c190aW1lPTAuMjA4OTgwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMjJ8cG9zPTIzNzl8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDI0MHxwdHNfdGltZT0wLjIzMjIwMHxkdHM9MTAyNDB8ZHRzX3RpbWU9MC4yMzIyMDB8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxMXxwb3M9MjYwMXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTExMjY0fHB0c190aW1lPTAuMjU1NDIwfGR0cz0xMTI2NHxkdHNfdGltZT0wLjI1NTQyMHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTUzfHBvcz0yODEyfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTIyODh8cHRzX3RpbWU9MC4yNzg2Mzl8ZHRzPTEyMjg4fGR0c190aW1lPTAuMjc4NjM5fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTF8cG9zPTI5NjV8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMzMxMnxwdHNfdGltZT0wLjMwMTg1OXxkdHM9MTMzMTJ8ZHRzX3RpbWU9MC4zMDE4NTl8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwOHxwb3M9MzE1NnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE0MzM2fHB0c190aW1lPTAuMzI1MDc5fGR0cz0xNDMzNnxkdHNfdGltZT0wLjMyNTA3OXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTg4fHBvcz0zMzY0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTUzNjB8cHRzX3RpbWU9MC4zNDgyOTl8ZHRzPTE1MzYwfGR0c190aW1lPTAuMzQ4Mjk5fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzB8cG9zPTM1NTJ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNjM4NHxwdHNfdGltZT0wLjM3MTUxOXxkdHM9MTYzODR8ZHRzX3RpbWU9MC4zNzE1MTl8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIyMXxwb3M9MzcyMnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE3NDA4fHB0c190aW1lPTAuMzk0NzM5fGR0cz0xNzQwOHxkdHNfdGltZT0wLjM5NDczOXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjQ3fHBvcz0zOTQzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTg0MzJ8cHRzX3RpbWU9MC40MTc5NTl8ZHRzPTE4NDMyfGR0c190aW1lPTAuNDE3OTU5fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDJ8cG9zPTQxOTB8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xOTQ1NnxwdHNfdGltZT0wLjQ0MTE3OXxkdHM9MTk0NTZ8ZHRzX3RpbWU9MC40NDExNzl8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE4Nnxwb3M9NDM5MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIwNDgwfHB0c190aW1lPTAuNDY0Mzk5fGR0cz0yMDQ4MHxkdHNfdGltZT0wLjQ2NDM5OXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk2fHBvcz00NTc4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjE1MDR8cHRzX3RpbWU9MC40ODc2MTl8ZHRzPTIxNTA0fGR0c190aW1lPTAuNDg3NjE5fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDB8cG9zPTQ3NzR8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yMjUyOHxwdHNfdGltZT0wLjUxMDgzOXxkdHM9MjI1Mjh8ZHRzX3RpbWU9MC41MTA4Mzl8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE3MHxwb3M9NDk3NHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIzNTUyfHB0c190aW1lPTAuNTM0MDU5fGR0cz0yMzU1MnxkdHNfdGltZT0wLjUzNDA1OXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTcyfHBvcz01MTQ0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjQ1NzZ8cHRzX3RpbWU9MC41NTcyNzl8ZHRzPTI0NTc2fGR0c190aW1lPTAuNTU3Mjc5fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDZ8cG9zPTUzMTZ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yNTYwMHxwdHNfdGltZT0wLjU4MDQ5OXxkdHM9MjU2MDB8ZHRzX3RpbWU9MC41ODA0OTl8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwOHxwb3M9NTUyMnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTI2NjI0fHB0c190aW1lPTAuNjAzNzE5fGR0cz0yNjYyNHxkdHNfdGltZT0wLjYwMzcxOXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjE3fHBvcz01NzMwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9Mjc2NDh8cHRzX3RpbWU9MC42MjY5Mzl8ZHRzPTI3NjQ4fGR0c190aW1lPTAuNjI2OTM5fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNTJ8cG9zPTU5NDd8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yODY3MnxwdHNfdGltZT0wLjY1MDE1OXxkdHM9Mjg2NzJ8ZHRzX3RpbWU9MC42NTAxNTl8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE3MXxwb3M9NjE5OXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTI5Njk2fHB0c190aW1lPTAuNjczMzc5fGR0cz0yOTY5NnxkdHNfdGltZT0wLjY3MzM3OXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjA2fHBvcz02MzcwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MzA3MjB8cHRzX3RpbWU9MC42OTY1OTl8ZHRzPTMwNzIwfGR0c190aW1lPTAuNjk2NTk5fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzd8cG9zPTY1NzZ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0zMTc0NHxwdHNfdGltZT0wLjcxOTgxOXxkdHM9MzE3NDR8ZHRzX3RpbWU9MC43MTk4MTl8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxMHxwb3M9NjgxM3xmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTMyNzY4fHB0c190aW1lPTAuNzQzMDM5fGR0cz0zMjc2OHxkdHNfdGltZT0wLjc0MzAzOXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTY2fHBvcz03MDIzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MzM3OTJ8cHRzX3RpbWU9MC43NjYyNTl8ZHRzPTMzNzkyfGR0c190aW1lPTAuNzY2MjU5fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNjZ8cG9zPTcxODl8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0zNDgxNnxwdHNfdGltZT0wLjc4OTQ3OHxkdHM9MzQ4MTZ8ZHRzX3RpbWU9MC43ODk0Nzh8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE3N3xwb3M9NzM1NXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTM1ODQwfHB0c190aW1lPTAuODEyNjk4fGR0cz0zNTg0MHxkdHNfdGltZT0wLjgxMjY5OHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTg4fHBvcz03NTMyfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MzY4NjR8cHRzX3RpbWU9MC44MzU5MTh8ZHRzPTM2ODY0fGR0c190aW1lPTAuODM1OTE4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTN8cG9zPTc3MjB8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0zNzg4OHxwdHNfdGltZT0wLjg1OTEzOHxkdHM9Mzc4ODh8ZHRzX3RpbWU9MC44NTkxMzh8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5NXxwb3M9NzkxM3xmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTM4OTEyfHB0c190aW1lPTAuODgyMzU4fGR0cz0zODkxMnxkdHNfdGltZT0wLjg4MjM1OHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjExfHBvcz04MTA4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9Mzk5MzZ8cHRzX3RpbWU9MC45MDU1Nzh8ZHRzPTM5OTM2fGR0c190aW1lPTAuOTA1NTc4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNDl8cG9zPTgzMTl8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz00MDk2MHxwdHNfdGltZT0wLjkyODc5OHxkdHM9NDA5NjB8ZHRzX3RpbWU9MC45Mjg3OTh8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIyM3xwb3M9ODU2OHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTQxOTg0fHB0c190aW1lPTAuOTUyMDE4fGR0cz00MTk4NHxkdHNfdGltZT0wLjk1MjAxOHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjMwfHBvcz04NzkxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NDMwMDh8cHRzX3RpbWU9MC45NzUyMzh8ZHRzPTQzMDA4fGR0c190aW1lPTAuOTc1MjM4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDN8cG9zPTkwMjF8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz00NDAzMnxwdHNfdGltZT0wLjk5ODQ1OHxkdHM9NDQwMzJ8ZHRzX3RpbWU9MC45OTg0NTh8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE4MHxwb3M9OTIyNHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTQ1MDU2fHB0c190aW1lPTEuMDIxNjc4fGR0cz00NTA1NnxkdHNfdGltZT0xLjAyMTY3OHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTcyfHBvcz05NDA0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NDYwODB8cHRzX3RpbWU9MS4wNDQ4OTh8ZHRzPTQ2MDgwfGR0c190aW1lPTEuMDQ0ODk4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNDB8cG9zPTk1NzZ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz00NzEwNHxwdHNfdGltZT0xLjA2ODExOHxkdHM9NDcxMDR8ZHRzX3RpbWU9MS4wNjgxMTh8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE3OXxwb3M9OTgxNnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTQ4MTI4fHB0c190aW1lPTEuMDkxMzM4fGR0cz00ODEyOHxkdHNfdGltZT0xLjA5MTMzOHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkxfHBvcz05OTk1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NDkxNTJ8cHRzX3RpbWU9MS4xMTQ1NTh8ZHRzPTQ5MTUyfGR0c190aW1lPTEuMTE0NTU4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODR8cG9zPTEwMTg2fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTAxNzZ8cHRzX3RpbWU9MS4xMzc3Nzh8ZHRzPTUwMTc2fGR0c190aW1lPTEuMTM3Nzc4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTR8cG9zPTEwMzcwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTEyMDB8cHRzX3RpbWU9MS4xNjA5OTh8ZHRzPTUxMjAwfGR0c190aW1lPTEuMTYwOTk4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTR8cG9zPTEwNTg0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTIyMjR8cHRzX3RpbWU9MS4xODQyMTh8ZHRzPTUyMjI0fGR0c190aW1lPTEuMTg0MjE4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzV8cG9zPTEwNzc4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTMyNDh8cHRzX3RpbWU9MS4yMDc0Mzh8ZHRzPTUzMjQ4fGR0c190aW1lPTEuMjA3NDM4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTV8cG9zPTExMDEzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTQyNzJ8cHRzX3RpbWU9MS4yMzA2NTh8ZHRzPTU0MjcyfGR0c190aW1lPTEuMjMwNjU4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMjB8cG9zPTExMjA4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTUyOTZ8cHRzX3RpbWU9MS4yNTM4Nzh8ZHRzPTU1Mjk2fGR0c190aW1lPTEuMjUzODc4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODd8cG9zPTExNDI4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTYzMjB8cHRzX3RpbWU9MS4yNzcwOTh8ZHRzPTU2MzIwfGR0c190aW1lPTEuMjc3MDk4fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzh8cG9zPTExNjE1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTczNDR8cHRzX3RpbWU9MS4zMDAzMTd8ZHRzPTU3MzQ0fGR0c190aW1lPTEuMzAwMzE3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzV8cG9zPTExODUzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTgzNjh8cHRzX3RpbWU9MS4zMjM1Mzd8ZHRzPTU4MzY4fGR0c190aW1lPTEuMzIzNTM3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzh8cG9zPTEyMDI4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NTkzOTJ8cHRzX3RpbWU9MS4zNDY3NTd8ZHRzPTU5MzkyfGR0c190aW1lPTEuMzQ2NzU3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTl8cG9zPTEyMjA2fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NjA0MTZ8cHRzX3RpbWU9MS4zNjk5Nzd8ZHRzPTYwNDE2fGR0c190aW1lPTEuMzY5OTc3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzl8cG9zPTEyNDI1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NjE0NDB8cHRzX3RpbWU9MS4zOTMxOTd8ZHRzPTYxNDQwfGR0c190aW1lPTEuMzkzMTk3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTN8cG9zPTEyNjA0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NjI0NjR8cHRzX3RpbWU9MS40MTY0MTd8ZHRzPTYyNDY0fGR0c190aW1lPTEuNDE2NDE3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDB8cG9zPTEyNzk3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NjM0ODh8cHRzX3RpbWU9MS40Mzk2Mzd8ZHRzPTYzNDg4fGR0c190aW1lPTEuNDM5NjM3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTh8cG9zPTEyOTk3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NjQ1MTJ8cHRzX3RpbWU9MS40NjI4NTd8ZHRzPTY0NTEyfGR0c190aW1lPTEuNDYyODU3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTV8cG9zPTEzMjE1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NjU1MzZ8cHRzX3RpbWU9MS40ODYwNzd8ZHRzPTY1NTM2fGR0c190aW1lPTEuNDg2MDc3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDl8cG9zPTEzNDMwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NjY1NjB8cHRzX3RpbWU9MS41MDkyOTd8ZHRzPTY2NTYwfGR0c190aW1lPTEuNTA5Mjk3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzF8cG9zPTEzNjM5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9Njc1ODR8cHRzX3RpbWU9MS41MzI1MTd8ZHRzPTY3NTg0fGR0c190aW1lPTEuNTMyNTE3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzl8cG9zPTEzODEwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9Njg2MDh8cHRzX3RpbWU9MS41NTU3Mzd8ZHRzPTY4NjA4fGR0c190aW1lPTEuNTU1NzM3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODV8cG9zPTEzOTg5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9Njk2MzJ8cHRzX3RpbWU9MS41Nzg5NTd8ZHRzPTY5NjMyfGR0c190aW1lPTEuNTc4OTU3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMjV8cG9zPTE0MTc0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NzA2NTZ8cHRzX3RpbWU9MS42MDIxNzd8ZHRzPTcwNjU2fGR0c190aW1lPTEuNjAyMTc3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMjF8cG9zPTE0Mzk5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NzE2ODB8cHRzX3RpbWU9MS42MjUzOTd8ZHRzPTcxNjgwfGR0c190aW1lPTEuNjI1Mzk3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDF8cG9zPTE0NjIwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NzI3MDR8cHRzX3RpbWU9MS42NDg2MTd8ZHRzPTcyNzA0fGR0c190aW1lPTEuNjQ4NjE3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDZ8cG9zPTE0ODIxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NzM3Mjh8cHRzX3RpbWU9MS42NzE4Mzd8ZHRzPTczNzI4fGR0c190aW1lPTEuNjcxODM3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODJ8cG9zPTE1MDI3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NzQ3NTJ8cHRzX3RpbWU9MS42OTUwNTd8ZHRzPTc0NzUyfGR0c190aW1lPTEuNjk1MDU3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzZ8cG9zPTE1MjA5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NzU3NzZ8cHRzX3RpbWU9MS43MTgyNzd8ZHRzPTc1Nzc2fGR0c190aW1lPTEuNzE4Mjc3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzN8cG9zPTE1Mzg1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9NzY4MDB8cHRzX3RpbWU9MS43NDE0OTd8ZHRzPTc2ODAwfGR0c190aW1lPTEuNzQxNDk3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTl8cG9zPTE1NjE4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9Nzc4MjR8cHRzX3RpbWU9MS43NjQ3MTd8ZHRzPTc3ODI0fGR0c190aW1lPTEuNzY0NzE3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMjB8cG9zPTE1ODE3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9Nzg4NDh8cHRzX3RpbWU9MS43ODc5Mzd8ZHRzPTc4ODQ4fGR0c190aW1lPTEuNzg3OTM3fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTB8cG9zPTE2MDM3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9Nzk4NzJ8cHRzX3RpbWU9MS44MTExNTZ8ZHRzPTc5ODcyfGR0c190aW1lPTEuODExMTU2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTB8cG9zPTE2MjI3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODA4OTZ8cHRzX3RpbWU9MS44MzQzNzZ8ZHRzPTgwODk2fGR0c190aW1lPTEuODM0Mzc2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDR8cG9zPTE2NDM3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODE5MjB8cHRzX3RpbWU9MS44NTc1OTZ8ZHRzPTgxOTIwfGR0c190aW1lPTEuODU3NTk2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzF8cG9zPTE2NjQxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODI5NDR8cHRzX3RpbWU9MS44ODA4MTZ8ZHRzPTgyOTQ0fGR0c190aW1lPTEuODgwODE2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNjd8cG9zPTE2ODEyfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODM5Njh8cHRzX3RpbWU9MS45MDQwMzZ8ZHRzPTgzOTY4fGR0c190aW1lPTEuOTA0MDM2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDB8cG9zPTE2OTc5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODQ5OTJ8cHRzX3RpbWU9MS45MjcyNTZ8ZHRzPTg0OTkyfGR0c190aW1lPTEuOTI3MjU2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNTR8cG9zPTE3MTc5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODYwMTZ8cHRzX3RpbWU9MS45NTA0NzZ8ZHRzPTg2MDE2fGR0c190aW1lPTEuOTUwNDc2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDV8cG9zPTE3NDMzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODcwNDB8cHRzX3RpbWU9MS45NzM2OTZ8ZHRzPTg3MDQwfGR0c190aW1lPTEuOTczNjk2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTZ8cG9zPTE3NjM4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODgwNjR8cHRzX3RpbWU9MS45OTY5MTZ8ZHRzPTg4MDY0fGR0c190aW1lPTEuOTk2OTE2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTB8cG9zPTE3ODM0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9ODkwODh8cHRzX3RpbWU9Mi4wMjAxMzZ8ZHRzPTg5MDg4fGR0c190aW1lPTIuMDIwMTM2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTd8cG9zPTE4MDI0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTAxMTJ8cHRzX3RpbWU9Mi4wNDMzNTZ8ZHRzPTkwMTEyfGR0c190aW1lPTIuMDQzMzU2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODZ8cG9zPTE4MjIxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTExMzZ8cHRzX3RpbWU9Mi4wNjY1NzZ8ZHRzPTkxMTM2fGR0c190aW1lPTIuMDY2NTc2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTR8cG9zPTE4NDA3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTIxNjB8cHRzX3RpbWU9Mi4wODk3OTZ8ZHRzPTkyMTYwfGR0c190aW1lPTIuMDg5Nzk2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMjd8cG9zPTE4NjAxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTMxODR8cHRzX3RpbWU9Mi4xMTMwMTZ8ZHRzPTkzMTg0fGR0c190aW1lPTIuMTEzMDE2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTV8cG9zPTE4ODI4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTQyMDh8cHRzX3RpbWU9Mi4xMzYyMzZ8ZHRzPTk0MjA4fGR0c190aW1lPTIuMTM2MjM2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMjh8cG9zPTE5MDIzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTUyMzJ8cHRzX3RpbWU9Mi4xNTk0NTZ8ZHRzPTk1MjMyfGR0c190aW1lPTIuMTU5NDU2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTZ8cG9zPTE5MjUxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTYyNTZ8cHRzX3RpbWU9Mi4xODI2NzZ8ZHRzPTk2MjU2fGR0c190aW1lPTIuMTgyNjc2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTd8cG9zPTE5NDQ3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTcyODB8cHRzX3RpbWU9Mi4yMDU4OTZ8ZHRzPTk3MjgwfGR0c190aW1lPTIuMjA1ODk2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODZ8cG9zPTE5NjQ0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTgzMDR8cHRzX3RpbWU9Mi4yMjkxMTZ8ZHRzPTk4MzA0fGR0c190aW1lPTIuMjI5MTE2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTF8cG9zPTE5ODMwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9OTkzMjh8cHRzX3RpbWU9Mi4yNTIzMzZ8ZHRzPTk5MzI4fGR0c190aW1lPTIuMjUyMzM2fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTV8cG9zPTIwMDIxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTAwMzUyfHB0c190aW1lPTIuMjc1NTU2fGR0cz0xMDAzNTJ8ZHRzX3RpbWU9Mi4yNzU1NTZ8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwM3xwb3M9MjAyMzZ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDEzNzZ8cHRzX3RpbWU9Mi4yOTg3NzZ8ZHRzPTEwMTM3NnxkdHNfdGltZT0yLjI5ODc3NnxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjA1fHBvcz0yMDQzOXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEwMjQwMHxwdHNfdGltZT0yLjMyMTk5NXxkdHM9MTAyNDAwfGR0c190aW1lPTIuMzIxOTk1fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDV8cG9zPTIwNjQ0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTAzNDI0fHB0c190aW1lPTIuMzQ1MjE1fGR0cz0xMDM0MjR8ZHRzX3RpbWU9Mi4zNDUyMTV8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxM3xwb3M9MjA4NDl8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDQ0NDh8cHRzX3RpbWU9Mi4zNjg0MzV8ZHRzPTEwNDQ0OHxkdHNfdGltZT0yLjM2ODQzNXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk4fHBvcz0yMTA2MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEwNTQ3MnxwdHNfdGltZT0yLjM5MTY1NXxkdHM9MTA1NDcyfGR0c190aW1lPTIuMzkxNjU1fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzh8cG9zPTIxMjYwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTA2NDk2fHB0c190aW1lPTIuNDE0ODc1fGR0cz0xMDY0OTZ8ZHRzX3RpbWU9Mi40MTQ4NzV8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5NXxwb3M9MjE0Mzh8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDc1MjB8cHRzX3RpbWU9Mi40MzgwOTV8ZHRzPTEwNzUyMHxkdHNfdGltZT0yLjQzODA5NXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjI3fHBvcz0yMTYzM3xmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEwODU0NHxwdHNfdGltZT0yLjQ2MTMxNXxkdHM9MTA4NTQ0fGR0c190aW1lPTIuNDYxMzE1fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODV8cG9zPTIxODYwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTA5NTY4fHB0c190aW1lPTIuNDg0NTM1fGR0cz0xMDk1Njh8ZHRzX3RpbWU9Mi40ODQ1MzV8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNnxwb3M9MjIwNDV8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMTA1OTJ8cHRzX3RpbWU9Mi41MDc3NTV8ZHRzPTExMDU5MnxkdHNfdGltZT0yLjUwNzc1NXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTgzfHBvcz0yMjI1MXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTExMTYxNnxwdHNfdGltZT0yLjUzMDk3NXxkdHM9MTExNjE2fGR0c190aW1lPTIuNTMwOTc1fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDh8cG9zPTIyNDM0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTEyNjQwfHB0c190aW1lPTIuNTU0MTk1fGR0cz0xMTI2NDB8ZHRzX3RpbWU9Mi41NTQxOTV8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNHxwb3M9MjI2NDJ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMTM2NjR8cHRzX3RpbWU9Mi41Nzc0MTV8ZHRzPTExMzY2NHxkdHNfdGltZT0yLjU3NzQxNXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkyfHBvcz0yMjg0NnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTExNDY4OHxwdHNfdGltZT0yLjYwMDYzNXxkdHM9MTE0Njg4fGR0c190aW1lPTIuNjAwNjM1fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTB8cG9zPTIzMDM4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTE1NzEyfHB0c190aW1lPTIuNjIzODU1fGR0cz0xMTU3MTJ8ZHRzX3RpbWU9Mi42MjM4NTV8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5OXxwb3M9MjMyMjh8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMTY3MzZ8cHRzX3RpbWU9Mi42NDcwNzV8ZHRzPTExNjczNnxkdHNfdGltZT0yLjY0NzA3NXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjI5fHBvcz0yMzQyN3xmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTExNzc2MHxwdHNfdGltZT0yLjY3MDI5NXxkdHM9MTE3NzYwfGR0c190aW1lPTIuNjcwMjk1fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDh8cG9zPTIzNjU2fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTE4Nzg0fHB0c190aW1lPTIuNjkzNTE1fGR0cz0xMTg3ODR8ZHRzX3RpbWU9Mi42OTM1MTV8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5NXxwb3M9MjM4NjR8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMTk4MDh8cHRzX3RpbWU9Mi43MTY3MzV8ZHRzPTExOTgwOHxkdHNfdGltZT0yLjcxNjczNXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkwfHBvcz0yNDA1OXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEyMDgzMnxwdHNfdGltZT0yLjczOTk1NXxkdHM9MTIwODMyfGR0c190aW1lPTIuNzM5OTU1fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTB8cG9zPTI0MjQ5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTIxODU2fHB0c190aW1lPTIuNzYzMTc1fGR0cz0xMjE4NTZ8ZHRzX3RpbWU9Mi43NjMxNzV8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5Mnxwb3M9MjQ0Mzl8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMjI4ODB8cHRzX3RpbWU9Mi43ODYzOTV8ZHRzPTEyMjg4MHxkdHNfdGltZT0yLjc4NjM5NXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjI2fHBvcz0yNDYzMXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEyMzkwNHxwdHNfdGltZT0yLjgwOTYxNXxkdHM9MTIzOTA0fGR0c190aW1lPTIuODA5NjE1fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTV8cG9zPTI0ODU3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTI0OTI4fHB0c190aW1lPTIuODMyODM0fGR0cz0xMjQ5Mjh8ZHRzX3RpbWU9Mi44MzI4MzR8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIzMHxwb3M9MjUwNTJ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMjU5NTJ8cHRzX3RpbWU9Mi44NTYwNTR8ZHRzPTEyNTk1MnxkdHNfdGltZT0yLjg1NjA1NHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk4fHBvcz0yNTI4MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEyNjk3NnxwdHNfdGltZT0yLjg3OTI3NHxkdHM9MTI2OTc2fGR0c190aW1lPTIuODc5Mjc0fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODN8cG9zPTI1NDgwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTI4MDAwfHB0c190aW1lPTIuOTAyNDk0fGR0cz0xMjgwMDB8ZHRzX3RpbWU9Mi45MDI0OTR8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5OXxwb3M9MjU2NjN8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMjkwMjR8cHRzX3RpbWU9Mi45MjU3MTR8ZHRzPTEyOTAyNHxkdHNfdGltZT0yLjkyNTcxNHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk2fHBvcz0yNTg2MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEzMDA0OHxwdHNfdGltZT0yLjk0ODkzNHxkdHM9MTMwMDQ4fGR0c190aW1lPTIuOTQ4OTM0fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODZ8cG9zPTI2MDU4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTMxMDcyfHB0c190aW1lPTIuOTcyMTU0fGR0cz0xMzEwNzJ8ZHRzX3RpbWU9Mi45NzIxNTR8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwMHxwb3M9MjYyNDR8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMzIwOTZ8cHRzX3RpbWU9Mi45OTUzNzR8ZHRzPTEzMjA5NnxkdHNfdGltZT0yLjk5NTM3NHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjEwfHBvcz0yNjQ0NHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEzMzEyMHxwdHNfdGltZT0zLjAxODU5NHxkdHM9MTMzMTIwfGR0c190aW1lPTMuMDE4NTk0fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTZ8cG9zPTI2NjU0fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTM0MTQ0fHB0c190aW1lPTMuMDQxODE0fGR0cz0xMzQxNDR8ZHRzX3RpbWU9My4wNDE4MTR8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxNHxwb3M9MjY4NTB8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMzUxNjh8cHRzX3RpbWU9My4wNjUwMzR8ZHRzPTEzNTE2OHxkdHNfdGltZT0zLjA2NTAzNHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTg1fHBvcz0yNzA2NHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEzNjE5MnxwdHNfdGltZT0zLjA4ODI1NHxkdHM9MTM2MTkyfGR0c190aW1lPTMuMDg4MjU0fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTh8cG9zPTI3MjQ5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTM3MjE2fHB0c190aW1lPTMuMTExNDc0fGR0cz0xMzcyMTZ8ZHRzX3RpbWU9My4xMTE0NzR8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwMHxwb3M9Mjc0NDd8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xMzgyNDB8cHRzX3RpbWU9My4xMzQ2OTR8ZHRzPTEzODI0MHxkdHNfdGltZT0zLjEzNDY5NHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjA4fHBvcz0yNzY0N3xmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTEzOTI2NHxwdHNfdGltZT0zLjE1NzkxNHxkdHM9MTM5MjY0fGR0c190aW1lPTMuMTU3OTE0fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTJ8cG9zPTI3ODU1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTQwMjg4fHB0c190aW1lPTMuMTgxMTM0fGR0cz0xNDAyODh8ZHRzX3RpbWU9My4xODExMzR8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwOHxwb3M9MjgwNjd8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNDEzMTJ8cHRzX3RpbWU9My4yMDQzNTR8ZHRzPTE0MTMxMnxkdHNfdGltZT0zLjIwNDM1NHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkyfHBvcz0yODI3NXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE0MjMzNnxwdHNfdGltZT0zLjIyNzU3NHxkdHM9MTQyMzM2fGR0c190aW1lPTMuMjI3NTc0fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTJ8cG9zPTI4NDY3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTQzMzYwfHB0c190aW1lPTMuMjUwNzk0fGR0cz0xNDMzNjB8ZHRzX3RpbWU9My4yNTA3OTR8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxMXxwb3M9Mjg2NTl8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNDQzODR8cHRzX3RpbWU9My4yNzQwMTR8ZHRzPTE0NDM4NHxkdHNfdGltZT0zLjI3NDAxNHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk1fHBvcz0yODg3MHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE0NTQwOHxwdHNfdGltZT0zLjI5NzIzNHxkdHM9MTQ1NDA4fGR0c190aW1lPTMuMjk3MjM0fGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDh8cG9zPTI5MDY1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTQ2NDMyfHB0c190aW1lPTMuMzIwNDU0fGR0cz0xNDY0MzJ8ZHRzX3RpbWU9My4zMjA0NTR8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5NXxwb3M9MjkyNzN8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNDc0NTZ8cHRzX3RpbWU9My4zNDM2NzN8ZHRzPTE0NzQ1NnxkdHNfdGltZT0zLjM0MzY3M3xkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjA0fHBvcz0yOTQ2OHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE0ODQ4MHxwdHNfdGltZT0zLjM2Njg5M3xkdHM9MTQ4NDgwfGR0c190aW1lPTMuMzY2ODkzfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDl8cG9zPTI5NjcyfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTQ5NTA0fHB0c190aW1lPTMuMzkwMTEzfGR0cz0xNDk1MDR8ZHRzX3RpbWU9My4zOTAxMTN8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5NXxwb3M9Mjk4ODF8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNTA1Mjh8cHRzX3RpbWU9My40MTMzMzN8ZHRzPTE1MDUyOHxkdHNfdGltZT0zLjQxMzMzM3xkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkxfHBvcz0zMDA3NnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE1MTU1MnxwdHNfdGltZT0zLjQzNjU1M3xkdHM9MTUxNTUyfGR0c190aW1lPTMuNDM2NTUzfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTB8cG9zPTMwMjY3fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTUyNTc2fHB0c190aW1lPTMuNDU5NzczfGR0cz0xNTI1NzZ8ZHRzX3RpbWU9My40NTk3NzN8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwOXxwb3M9MzA0Nzd8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNTM2MDB8cHRzX3RpbWU9My40ODI5OTN8ZHRzPTE1MzYwMHxkdHNfdGltZT0zLjQ4Mjk5M3xkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTc1fHBvcz0zMDY4NnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE1NDYyNHxwdHNfdGltZT0zLjUwNjIxM3xkdHM9MTU0NjI0fGR0c190aW1lPTMuNTA2MjEzfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNDR8cG9zPTMwODYxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTU1NjQ4fHB0c190aW1lPTMuNTI5NDMzfGR0cz0xNTU2NDh8ZHRzX3RpbWU9My41Mjk0MzN8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE3N3xwb3M9MzExMDV8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNTY2NzJ8cHRzX3RpbWU9My41NTI2NTN8ZHRzPTE1NjY3MnxkdHNfdGltZT0zLjU1MjY1M3xkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjE3fHBvcz0zMTI4MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE1NzY5NnxwdHNfdGltZT0zLjU3NTg3M3xkdHM9MTU3Njk2fGR0c190aW1lPTMuNTc1ODczfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODJ8cG9zPTMxNDk5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTU4NzIwfHB0c190aW1lPTMuNTk5MDkzfGR0cz0xNTg3MjB8ZHRzX3RpbWU9My41OTkwOTN8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE4MXxwb3M9MzE2ODF8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNTk3NDR8cHRzX3RpbWU9My42MjIzMTN8ZHRzPTE1OTc0NHxkdHNfdGltZT0zLjYyMjMxM3xkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjAzfHBvcz0zMTg2MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE2MDc2OHxwdHNfdGltZT0zLjY0NTUzM3xkdHM9MTYwNzY4fGR0c190aW1lPTMuNjQ1NTMzfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTh8cG9zPTMyMDY1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTYxNzkyfHB0c190aW1lPTMuNjY4NzUzfGR0cz0xNjE3OTJ8ZHRzX3RpbWU9My42Njg3NTN8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxN3xwb3M9MzIyNjN8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNjI4MTZ8cHRzX3RpbWU9My42OTE5NzN8ZHRzPTE2MjgxNnxkdHNfdGltZT0zLjY5MTk3M3xkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk1fHBvcz0zMjQ4MHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE2Mzg0MHxwdHNfdGltZT0zLjcxNTE5M3xkdHM9MTYzODQwfGR0c190aW1lPTMuNzE1MTkzfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTh8cG9zPTMyNjc1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTY0ODY0fHB0c190aW1lPTMuNzM4NDEzfGR0cz0xNjQ4NjR8ZHRzX3RpbWU9My43Mzg0MTN8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwMnxwb3M9MzI4NzN8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNjU4ODh8cHRzX3RpbWU9My43NjE2MzN8ZHRzPTE2NTg4OHxkdHNfdGltZT0zLjc2MTYzM3xkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTg1fHBvcz0zMzA3NXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE2NjkxMnxwdHNfdGltZT0zLjc4NDg1M3xkdHM9MTY2OTEyfGR0c190aW1lPTMuNzg0ODUzfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTZ8cG9zPTMzMjYwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTY3OTM2fHB0c190aW1lPTMuODA4MDczfGR0cz0xNjc5MzZ8ZHRzX3RpbWU9My44MDgwNzN8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIyNnxwb3M9MzM0NTZ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNjg5NjB8cHRzX3RpbWU9My44MzEyOTN8ZHRzPTE2ODk2MHxkdHNfdGltZT0zLjgzMTI5M3xkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTg3fHBvcz0zMzY4MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE2OTk4NHxwdHNfdGltZT0zLjg1NDUxMnxkdHM9MTY5OTg0fGR0c190aW1lPTMuODU0NTEyfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTN8cG9zPTMzODY5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTcxMDA4fHB0c190aW1lPTMuODc3NzMyfGR0cz0xNzEwMDh8ZHRzX3RpbWU9My44Nzc3MzJ8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxOHxwb3M9MzQwNjJ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNzIwMzJ8cHRzX3RpbWU9My45MDA5NTJ8ZHRzPTE3MjAzMnxkdHNfdGltZT0zLjkwMDk1MnxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjAwfHBvcz0zNDI4MHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE3MzA1NnxwdHNfdGltZT0zLjkyNDE3MnxkdHM9MTczMDU2fGR0c190aW1lPTMuOTI0MTcyfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDB8cG9zPTM0NDgwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTc0MDgwfHB0c190aW1lPTMuOTQ3MzkyfGR0cz0xNzQwODB8ZHRzX3RpbWU9My45NDczOTJ8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5OHxwb3M9MzQ2ODB8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNzUxMDR8cHRzX3RpbWU9My45NzA2MTJ8ZHRzPTE3NTEwNHxkdHNfdGltZT0zLjk3MDYxMnxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjAwfHBvcz0zNDg3OHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE3NjEyOHxwdHNfdGltZT0zLjk5MzgzMnxkdHM9MTc2MTI4fGR0c190aW1lPTMuOTkzODMyfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTd8cG9zPTM1MDc4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTc3MTUyfHB0c190aW1lPTQuMDE3MDUyfGR0cz0xNzcxNTJ8ZHRzX3RpbWU9NC4wMTcwNTJ8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwOXxwb3M9MzUyNzV8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xNzgxNzZ8cHRzX3RpbWU9NC4wNDAyNzJ8ZHRzPTE3ODE3NnxkdHNfdGltZT00LjA0MDI3MnxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjA1fHBvcz0zNTQ4NHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE3OTIwMHxwdHNfdGltZT00LjA2MzQ5MnxkdHM9MTc5MjAwfGR0c190aW1lPTQuMDYzNDkyfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTl8cG9zPTM1Njg5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTgwMjI0fHB0c190aW1lPTQuMDg2NzEyfGR0cz0xODAyMjR8ZHRzX3RpbWU9NC4wODY3MTJ8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5Mnxwb3M9MzU4ODh8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xODEyNDh8cHRzX3RpbWU9NC4xMDk5MzJ8ZHRzPTE4MTI0OHxkdHNfdGltZT00LjEwOTkzMnxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjAxfHBvcz0zNjA4MHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE4MjI3MnxwdHNfdGltZT00LjEzMzE1MnxkdHM9MTgyMjcyfGR0c190aW1lPTQuMTMzMTUyfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDB8cG9zPTM2MjgxfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTgzMjk2fHB0c190aW1lPTQuMTU2MzcyfGR0cz0xODMyOTZ8ZHRzX3RpbWU9NC4xNTYzNzJ8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwMnxwb3M9MzY0ODF8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xODQzMjB8cHRzX3RpbWU9NC4xNzk1OTJ8ZHRzPTE4NDMyMHxkdHNfdGltZT00LjE3OTU5MnxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk2fHBvcz0zNjY4M3xmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE4NTM0NHxwdHNfdGltZT00LjIwMjgxMnxkdHM9MTg1MzQ0fGR0c190aW1lPTQuMjAyODEyfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDB8cG9zPTM2ODc5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTg2MzY4fHB0c190aW1lPTQuMjI2MDMyfGR0cz0xODYzNjh8ZHRzX3RpbWU9NC4yMjYwMzJ8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwOXxwb3M9MzcwNzl8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xODczOTJ8cHRzX3RpbWU9NC4yNDkyNTJ8ZHRzPTE4NzM5MnxkdHNfdGltZT00LjI0OTI1MnxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjAxfHBvcz0zNzI4OHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE4ODQxNnxwdHNfdGltZT00LjI3MjQ3MnxkdHM9MTg4NDE2fGR0c190aW1lPTQuMjcyNDcyfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDF8cG9zPTM3NDg5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTg5NDQwfHB0c190aW1lPTQuMjk1NjkyfGR0cz0xODk0NDB8ZHRzX3RpbWU9NC4yOTU2OTJ8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwMXxwb3M9Mzc2OTB8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xOTA0NjR8cHRzX3RpbWU9NC4zMTg5MTJ8ZHRzPTE5MDQ2NHxkdHNfdGltZT00LjMxODkxMnxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk5fHBvcz0zNzg5MXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE5MTQ4OHxwdHNfdGltZT00LjM0MjEzMnxkdHM9MTkxNDg4fGR0c190aW1lPTQuMzQyMTMyfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTh8cG9zPTM4MDkwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTkyNTEyfHB0c190aW1lPTQuMzY1MzUxfGR0cz0xOTI1MTJ8ZHRzX3RpbWU9NC4zNjUzNTF8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNXxwb3M9MzgyODh8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xOTM1MzZ8cHRzX3RpbWU9NC4zODg1NzF8ZHRzPTE5MzUzNnxkdHNfdGltZT00LjM4ODU3MXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkwfHBvcz0zODQ5M3xmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE5NDU2MHxwdHNfdGltZT00LjQxMTc5MXxkdHM9MTk0NTYwfGR0c190aW1lPTQuNDExNzkxfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDd8cG9zPTM4NjgzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTk1NTg0fHB0c190aW1lPTQuNDM1MDExfGR0cz0xOTU1ODR8ZHRzX3RpbWU9NC40MzUwMTF8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNHxwb3M9Mzg4OTB8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xOTY2MDh8cHRzX3RpbWU9NC40NTgyMzF8ZHRzPTE5NjYwOHxkdHNfdGltZT00LjQ1ODIzMXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkyfHBvcz0zOTA5NHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTE5NzYzMnxwdHNfdGltZT00LjQ4MTQ1MXxkdHM9MTk3NjMyfGR0c190aW1lPTQuNDgxNDUxfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTF8cG9zPTM5Mjg2fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MTk4NjU2fHB0c190aW1lPTQuNTA0NjcxfGR0cz0xOTg2NTZ8ZHRzX3RpbWU9NC41MDQ2NzF8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5NXxwb3M9Mzk0OTd8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0xOTk2ODB8cHRzX3RpbWU9NC41Mjc4OTF8ZHRzPTE5OTY4MHxkdHNfdGltZT00LjUyNzg5MXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjE0fHBvcz0zOTY5MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIwMDcwNHxwdHNfdGltZT00LjU1MTExMXxkdHM9MjAwNzA0fGR0c190aW1lPTQuNTUxMTExfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTV8cG9zPTM5OTA2fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjAxNzI4fHB0c190aW1lPTQuNTc0MzMxfGR0cz0yMDE3Mjh8ZHRzX3RpbWU9NC41NzQzMzF8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5OXxwb3M9NDAxMDF8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yMDI3NTJ8cHRzX3RpbWU9NC41OTc1NTF8ZHRzPTIwMjc1MnxkdHNfdGltZT00LjU5NzU1MXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTgzfHBvcz00MDMwMHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIwMzc3NnxwdHNfdGltZT00LjYyMDc3MXxkdHM9MjAzNzc2fGR0c190aW1lPTQuNjIwNzcxfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTF8cG9zPTQwNDgzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjA0ODAwfHB0c190aW1lPTQuNjQzOTkxfGR0cz0yMDQ4MDB8ZHRzX3RpbWU9NC42NDM5OTF8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwMHxwb3M9NDA2OTR8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yMDU4MjR8cHRzX3RpbWU9NC42NjcyMTF8ZHRzPTIwNTgyNHxkdHNfdGltZT00LjY2NzIxMXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk5fHBvcz00MDg5NHxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIwNjg0OHxwdHNfdGltZT00LjY5MDQzMXxkdHM9MjA2ODQ4fGR0c190aW1lPTQuNjkwNDMxfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTN8cG9zPTQxMDkzfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjA3ODcyfHB0c190aW1lPTQuNzEzNjUxfGR0cz0yMDc4NzJ8ZHRzX3RpbWU9NC43MTM2NTF8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5MXxwb3M9NDEzMDZ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yMDg4OTZ8cHRzX3RpbWU9NC43MzY4NzF8ZHRzPTIwODg5NnxkdHNfdGltZT00LjczNjg3MXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjExfHBvcz00MTQ5N3xmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIwOTkyMHxwdHNfdGltZT00Ljc2MDA5MXxkdHM9MjA5OTIwfGR0c190aW1lPTQuNzYwMDkxfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTh8cG9zPTQxNzA4fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjEwOTQ0fHB0c190aW1lPTQuNzgzMzExfGR0cz0yMTA5NDR8ZHRzX3RpbWU9NC43ODMzMTF8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwM3xwb3M9NDE5MDZ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yMTE5Njh8cHRzX3RpbWU9NC44MDY1MzF8ZHRzPTIxMTk2OHxkdHNfdGltZT00LjgwNjUzMXxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk2fHBvcz00MjEwOXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIxMjk5MnxwdHNfdGltZT00LjgyOTc1MXxkdHM9MjEyOTkyfGR0c190aW1lPTQuODI5NzUxfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTd8cG9zPTQyMzA1fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjE0MDE2fHB0c190aW1lPTQuODUyOTcxfGR0cz0yMTQwMTZ8ZHRzX3RpbWU9NC44NTI5NzF8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5MHxwb3M9NDI1MDJ8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yMTUwNDB8cHRzX3RpbWU9NC44NzYxOTB8ZHRzPTIxNTA0MHxkdHNfdGltZT00Ljg3NjE5MHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjA4fHBvcz00MjY5MnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIxNjA2NHxwdHNfdGltZT00Ljg5OTQxMHxkdHM9MjE2MDY0fGR0c190aW1lPTQuODk5NDEwfGR1cmF0aW9uPTEwMjR8ZHVyYXRpb25fdGltZT0wLjAyMzIyMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDN8cG9zPTQyOTAwfGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT1hdWRpb3xzdHJlYW1faW5kZXg9MHxwdHM9MjE3MDg4fHB0c190aW1lPTQuOTIyNjMwfGR0cz0yMTcwODh8ZHRzX3RpbWU9NC45MjI2MzB8ZHVyYXRpb249MTAyNHxkdXJhdGlvbl90aW1lPTAuMDIzMjIwfGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5OHxwb3M9NDMxMDN8ZmxhZ3M9S18KK3BhY2tldHxjb2RlY190eXBlPWF1ZGlvfHN0cmVhbV9pbmRleD0wfHB0cz0yMTgxMTJ8cHRzX3RpbWU9NC45NDU4NTB8ZHRzPTIxODExMnxkdHNfdGltZT00Ljk0NTg1MHxkdXJhdGlvbj0xMDI0fGR1cmF0aW9uX3RpbWU9MC4wMjMyMjB8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9Mjg0fHBvcz00MzMwMXxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9YXVkaW98c3RyZWFtX2luZGV4PTB8cHRzPTIxOTEzNnxwdHNfdGltZT00Ljk2OTA3MHxkdHM9MjE5MTM2fGR0c190aW1lPTQuOTY5MDcwfGR1cmF0aW9uPTEzNjR8ZHVyYXRpb25fdGltZT0wLjAzMDkzMHxjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT01fHBvcz00MzU4NXxmbGFncz1LXwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LWJiaS1lbHN0LXN0YXJ0cy1iIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWJiaS1lbHN0LXN0YXJ0cy1iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYTI4YjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtYmJpLWVsc3Qtc3RhcnRzLWIKQEAgLTAsMCArMSwzOTEgQEAKKyNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcworI3ZlcnNpb246IDIKKyNoYXNoOiBNRDUKKyN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMS8xCisjdGIgMTogMS80ODAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAxOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbworI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMxMTA0MDAsIGU5NDU0NDA5YWY3NjAzOGRiZTU2ZTgzNDkyMWQyZmE4CisxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDYyMGYwYjY3YTkxZjdmNzQxNTFiYzViZTc0NWI3MTEwCisxLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDQ5NjNhYjY0MTU4NTE0MmZiYWMwNjUwMjg3M2ZiNmQzCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIDM3YWE2MjBlNDk0ZDIyYmEyNDhmZWVhOWE1YTg2OWEwCisxLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDgwNjQ5YWUxMGQyNTg3MjY0ZmNiNDNjN2RjMjVlNjFiCisxLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDAxZWM5NGMxODA2MGJlMDg5ODhlOGI5YjFjOWRlODIyCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDdiOGJlOTYxOWU0ZTFkNjE4YWIxZWQ4NWFmZjM5NTdiCisxLCAgICAgICA0MDk2LCAgICAgICA0MDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDNmODM0MmRhMzEyNGUyMmI4OTIxMWMyZjIzM2ViNWIyCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDMxMTA0MDAsIDc1NmE0NTUxNDIwODUzYmMzYWU0NDRlNmI4NjE2OWYzCisxLCAgICAgICA1MTIwLCAgICAgICA1MTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDQ4MzJkMWEzZjdkOGFhY2ViMDQ4OWMxY2EwNzA2ZDMxCisxLCAgICAgICA2MTQ0LCAgICAgICA2MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDdlODlmMWU4MzE4ZWQ1NGQ4MWU0ZWZlM2M2Nzk1MTVmCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDMxMTA0MDAsIDk0YTkzYzE2NjlhOTZlYmY0MWE3MjU4MTc3ODQ5Mzk2CisxLCAgICAgICA3MTY4LCAgICAgICA3MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIGQ3MzQ2OGM2OGU5MmM5ZTI5MzllYjMwZDY2YTQ1YmMyCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgIDMxMTA0MDAsIDVkMWM0OWQzZjQzY2Q0NzI2ODNlNGEwMzllMzc2YWY1CisxLCAgICAgICA4MTkyLCAgICAgICA4MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDcyZTEwMjBjMWJiOTYxY2IxYzE3N2Y5N2U0MjdlZGI5CisxLCAgICAgICA5MjE2LCAgICAgICA5MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDFhNDc3M2FmNzA4MGJkOTA0YTNiMTRjMTJhODAyOGZhCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgIDMxMTA0MDAsIGUwZTg4Y2MzNGIwYTlkNzk2M2NkZGY1NTRhMzkwOWYwCisxLCAgICAgIDEwMjQwLCAgICAgIDEwMjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIGQzOWFlMTgwOTAzMmM0ODA3ZWZlNDE1MjAzMDJiZDM3CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDMxMTA0MDAsIDFmNDY0ZjI0MjdhYTM4NDIyMjQ4MDNiNmQ2NzE1NGY4CisxLCAgICAgIDExMjY0LCAgICAgIDExMjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIGUyNmFmODY5OThkMWE5NTc5MTI3YTk3ZGJlNDU4OTBiCisxLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDE0OGUxYWIxMDJjMWM2MmQ5MDE4MDk1YzdlOTM0ZWVhCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgIDMxMTA0MDAsIGU1ZDYxMGI4ZTUzMjAzYjVjY2IwMTg3N2FjYjNhYzU2CisxLCAgICAgIDEzMzEyLCAgICAgIDEzMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDk2NTgyYzk0MTE4NGFkOTY3ZTllOTExOTg3NzVlNjFmCisxLCAgICAgIDE0MzM2LCAgICAgIDE0MzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDhkMjM3MWJiMTUyNGQ5ZDAwN2FlNDQ1MTliNTVhMDU1CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgIDMxMTA0MDAsIGQxMzYzZmJkZmZiYjg1YTBhZmZlNjYwYmZkMDliOThjCisxLCAgICAgIDE1MzYwLCAgICAgIDE1MzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDYwMzRjOWU0MDlkOGRjZGZkMDMyYjQ0ZjYzMWUyMzYyCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDMxMTA0MDAsIDEzMGJiNGMxN2U5NjNiMDkyYTcxNzMyNTQ5OGMwNmMzCisxLCAgICAgIDE2Mzg0LCAgICAgIDE2Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDM2NDllOWVkYzY1YTA0MmM0YzkxM2MwNmMzZjNiZmY3CisxLCAgICAgIDE3NDA4LCAgICAgIDE3NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIGE0Y2RiMGM0YmVkNDhkMWY3YzQ5MThlNTU5MGE1NDJkCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgIDMxMTA0MDAsIGEzY2I3YTM3ZmVmNWQ4YTQ5ODE1ZGQxNTk3MGMxZjNkCisxLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIGExMzBlOGJhOWE0N2RmMGM3NmVkZjVjM2VjZTU3NjJmCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgIDMxMTA0MDAsIDdkYzRhNDMzNGZhOWJiNjFmMmFkNTZiM2QwNTliM2Y3CisxLCAgICAgIDE5NDU2LCAgICAgIDE5NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIGNmNzZhMTMyYzIwNWMyOWEwYjcwNDI1OTk5NzNmZGE0CisxLCAgICAgIDIwNDgwLCAgICAgIDIwNDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIGI5YjdkODE5NTk5YmI2ZDdjZDUzY2MxYmMwODEwY2E3CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDMxMTA0MDAsIGNjZGExMDZlYzU4OTk3ODdjM2JjODY3OWVlMDUyODU0CisxLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDNkMGQ2ZWY4MzE4YTk0NDE2YTU2MTA4MjQ4ZTZjYWQzCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgIDMxMTA0MDAsIDQyNTRjN2IwMWE2N2EwODEwYmYyMzRiYTdiMWY1OWQwCisxLCAgICAgIDIyNTI4LCAgICAgIDIyNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIGE4YTA4MmI0YzUyMWQyZTdmYzk5MGY1NGUzNTgwYTllCisxLCAgICAgIDIzNTUyLCAgICAgIDIzNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDYwYjM2YzI2OGJjOTgwOTNmMzVhN2M5MGM2NGI1MDdjCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgIDMxMTA0MDAsIDZjMGFjZDk3ODFjZmVjYWY5YTEwZmU5MWY4ZDZlYzQxCisxLCAgICAgIDI0NTc2LCAgICAgIDI0NTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIGM1MjExYjQ5ZWI1MWNlYTRjMTYwNzllYjU0ZGYzZDEyCisxLCAgICAgIDI1NjAwLCAgICAgIDI1NjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIGRkZGQ1NWEzMWU4YTY1MTEwYTg5ZGUxYWY2Nzg2MWIwCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgIDMxMTA0MDAsIDJhOWQ1ZGIwYmMyZjU0ZTJjNjY4MzRkYjY0Mzg2YmI3CisxLCAgICAgIDI2NjI0LCAgICAgIDI2NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDBjMjIwZjFkNDA1YmI0NjM0NjliNTRmYTEyNmEyYzQxCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgIDMxMTA0MDAsIDAxNDBmNTE1YmU4N2RhMzk5MDYxNzY0MDUwZDE1YjE2CisxLCAgICAgIDI3NjQ4LCAgICAgIDI3NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDExZDc0MDIzNGE5YTRkZDI4ZTMxOTFlMjU4ZmM4ZTNiCisxLCAgICAgIDI4NjcyLCAgICAgIDI4NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIGU0NTY5NDNjNzIyYTk4MDc2NjlmNTc3NzZkY2I4YzVkCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgIDMxMTA0MDAsIGNhZDU1NGZlMjIxZmJkOGVlODQ4ZmFjZWJkN2IyNGQyCisxLCAgICAgIDI5Njk2LCAgICAgIDI5Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDNjMTMxNjVkNjQ4ZjQ2YzNlM2U2OTliODc0ZGEzNzJhCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgIDMxMTA0MDAsIDFlODQ3NDkxMWNiMWJkODMxODA4ZGMyYmViYTU0MGMwCisxLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDdlN2E0NmUzMzYwZjg4NDUwN2M5NWY2NDBjZDZmNTMyCisxLCAgICAgIDMxNzQ0LCAgICAgIDMxNzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDQyMGQwNDdlZTRkNTViN2FmMmQ5N2M1MTE2ZTI1ZDM3CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgIDMxMTA0MDAsIGYzOWM0ODNmYmYzYzU5OGMzOGNmNTQzYWJhZDJjMDNjCisxLCAgICAgIDMyNzY4LCAgICAgIDMyNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIGIzMzM0YmNkMmVkM2IyYWIzMmFjMTNjMjRhOGQxMzIyCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgIDMxMTA0MDAsIDNiMjExNzFhMDAzODI3YTIwM2MwYzU4NTNjMzY4OTNlCisxLCAgICAgIDMzNzkyLCAgICAgIDMzNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDE0NzI4OThlMGQ0ZmFmZDUyZmMwYWRiNzg5ZTA2OTg3CisxLCAgICAgIDM0ODE2LCAgICAgIDM0ODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIGYzZTdjMzNkOTI1NzhmYTVlYjkwOTMzNDkxMTA2YzM3CiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgIDMxMTA0MDAsIDQwZTg3MzNmOTNjNDY4Y2I1OGMzOTIxYzgwZjgxYzY4CisxLCAgICAgIDM1ODQwLCAgICAgIDM1ODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDdkN2Y4ZThmNTQyYmU5MjkxYjc4OTU0NzJmOGNmMGE3CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgIDMxMTA0MDAsIGEyZDcxNmYyMTVhZjdkNzc4YmQ2MDVkZWNhZTIwMWRkCisxLCAgICAgIDM2ODY0LCAgICAgIDM2ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDY2ZTJlMzVkNDBiZWI2ZTFkZjMwZDRkMTgwNjYxZDRiCisxLCAgICAgIDM3ODg4LCAgICAgIDM3ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDhmYzBjMTZmYzNlYzVkYjQ3ZTQzNzI2M2I0Mjk0MDZiCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgIDMxMTA0MDAsIGU2ZmI4ZDNmMWM5NzQ3ZjE4NWI1MGVkZWQ2N2ZmMGFiCisxLCAgICAgIDM4OTEyLCAgICAgIDM4OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIGRkNjMzMWY0MzBhYmY0MWRhZGU0ZTRhODU3ODQ3NDVmCisxLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDVjNjkzYjM3NDE5ZmU0M2ZiODNiNzE1ZDRmNzA4M2VjCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgIDMxMTA0MDAsIGZlNGUwY2Y1NjY2NzQ2NzJhZDA0M2YyNGVhZTAyZTYzCisxLCAgICAgIDQwOTYwLCAgICAgIDQwOTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDllMTNiMDU0YzA3ZmVhYzBmYWQ2MDFlZDQ4MjM5OTZlCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgIDMxMTA0MDAsIGY1N2Q0ZDMyMDEyZGZjYjE0YTI3MGJkYzkwODEyZTVlCisxLCAgICAgIDQxOTg0LCAgICAgIDQxOTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIGRiZmZlYTIyNzgxYjM1MDg4ODU5ODY4MTg5ZTI3MGFhCisxLCAgICAgIDQzMDA4LCAgICAgIDQzMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDU5ZjFhOTg1ZDdhOTYyNzNiZjQ4YmU5ZGM4YTdkNGQyCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgIDMxMTA0MDAsIGZlN2FhOGMxNzU0Yjk1OTBmZTc1Yjc4M2Q0ZTEyNmVkCisxLCAgICAgIDQ0MDMyLCAgICAgIDQ0MDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIGIwN2UwMmQwYmZlY2JkZTliNDhlNmU4Mzk1MmFhM2M3CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgIDMxMTA0MDAsIDI5YWU2ZTU0MTAyMWJmNDgxYzg5MzdjMzdhYzM0NTcwCisxLCAgICAgIDQ1MDU2LCAgICAgIDQ1MDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIGQwZGZjYTMxODg1YWMxZDIxZmU0MmJiMjZlM2IxMWVjCisxLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDU0Nzk2NzBhZWEzYTRkMDdhNjFiOWVkY2MyMTEzYzdiCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgIDMxMTA0MDAsIDIxMWUwODAzYjVhNzA0YzdlZjFjMzZmYzVjMTgyNzEwCisxLCAgICAgIDQ3MTA0LCAgICAgIDQ3MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDAxMThkN2ZjMGQwZjg0NjI2NDdmMzdhYTZkODJjOGZjCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgIDMxMTA0MDAsIGE0ZWEzYTQ2ODZkMjE0YWQ1NGZjZGNlNjNmOGMyZGMwCisxLCAgICAgIDQ4MTI4LCAgICAgIDQ4MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIGNjMmIyMmQ0Yzc0OTdhY2NiNmIxOTQ5NjhiNDA3ZTEwCisxLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIGZlOGQzMGMwODJhMzYwOGI4Y2NmNWUzZDZmNGIwZGRiCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgIDMxMTA0MDAsIDhhZjk3MWNmNjM3NjA5NTM0ZWM1OWI2ZjI5YTM2NjZlCisxLCAgICAgIDUwMTc2LCAgICAgIDUwMTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIGVkMTVhNmFhMmQ4NzM5NWI0Nzg4OGY3NDRmNDFkZjMwCisxLCAgICAgIDUxMjAwLCAgICAgIDUxMjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDhkNDk3MWVlMjVkMjc0ODIyY2NlYWEwMGNjOGRmMWExCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgIDMxMTA0MDAsIDhjZmU5M2RmZDc2ZTRmOTdjYzA0YTE0NWJiNTU5YWY1CisxLCAgICAgIDUyMjI0LCAgICAgIDUyMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDc5OWYxYzljYWM2YzNjZWRhYWM4MGNjNmIyNmRmODI3CiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgIDMxMTA0MDAsIDY5MWZlNjEzOTgwMTZmNzY3ZWE3YmE3ODFlZjcyOTUzCisxLCAgICAgIDUzMjQ4LCAgICAgIDUzMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDQwY2JlZmJiNDU1MjMxYzBmMjFhZjEyOWUyNTA0Mzk1CisxLCAgICAgIDU0MjcyLCAgICAgIDU0MjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDA1ZWIxNzMxY2I5M2ZmNjg4MTVlOTJmMGE1MjhkNGQ3CiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgIDMxMTA0MDAsIDdlYWY1YmM1ZTk0MmY4MjE4ZjQ2YzljNTA1ZDdiNThjCisxLCAgICAgIDU1Mjk2LCAgICAgIDU1Mjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIGRlOTZmYTA2MmM1OWI2YjNiODg3MzFlNjBlMDJkMDQwCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgIDMxMTA0MDAsIGZlYWNjODI4MjE4NjkzNWUzMTBlYzJkY2NiYjc5MjM5CisxLCAgICAgIDU2MzIwLCAgICAgIDU2MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDE0ZDM4ZDg5MDc5YzFiNzgwMTk4N2M1MzE1NDc3ZDExCisxLCAgICAgIDU3MzQ0LCAgICAgIDU3MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDlhMDAyOWFlN2ZjN2UwMjk0MDJlYzI5NTM2Mjg4Y2ZmCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgIDMxMTA0MDAsIGE1ZGZiNWM0YzIzZTY0N2UyYzc3ZGQxMTdlNGVkNzE0CisxLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDgzOTI1YTZlYmY5NTNlNmI3MTFkMzA0MmM5NWZmZTUxCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgIDMxMTA0MDAsIGRhOTMwNmMyODcyNzg4YmEyYTU4N2VhYjdmNTk3ZjEzCisxLCAgICAgIDU5MzkyLCAgICAgIDU5MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDViMzMyYjIyYTJhOGFlNzJjYmY4MTU0ZDJjZmQ5YjVkCisxLCAgICAgIDYwNDE2LCAgICAgIDYwNDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDhkY2Q1MDQxYjQ5MDM2ZTQzZjc0ODE5NDM5YTZkYjYzCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgIDMxMTA0MDAsIDE5ZDE0YTY1NWFhMDJjYzI3NjdhZmQ5ZWQ5YmMyZmY0CisxLCAgICAgIDYxNDQwLCAgICAgIDYxNDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDkwZWEzYWM1NjAwM2I0ZjFjMDI0MmE2MTE3NDZiNzZhCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgIDMxMTA0MDAsIDRkOWU2NDU1ZmI3MWQ1Y2Q1MTFkZGRmODk0YjRmN2Q4CisxLCAgICAgIDYyNDY0LCAgICAgIDYyNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDZlZDlmODE1NzM5ZTZlM2I4ZWQxMjU2ODhmNjkzZDVmCisxLCAgICAgIDYzNDg4LCAgICAgIDYzNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIGUwNTZiOTFmNDg3NTAyOWFmM2MyOWEyNmUzNzM4MGExCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgIDMxMTA0MDAsIDA1MmMzMmMwMGJjMWI0MGQ1MjcwZjRiNWM0ZDM0ZDZiCisxLCAgICAgIDY0NTEyLCAgICAgIDY0NTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDM2ZmY4MmNiMzRmZmM5ZWE2MGIxZmJjOGQzZWRkOWYxCisxLCAgICAgIDY1NTM2LCAgICAgIDY1NTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDk3NWMyZDYwODA1MzI2NDViZTUxMDI0MWQ1MmI3ODhjCiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgIDMxMTA0MDAsIDY0NWUwYzNlYjg1OTljMmNjNzEyYTk3Y2JhZTlkMWQzCisxLCAgICAgIDY2NTYwLCAgICAgIDY2NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDlhNTNjNjIwZjE5ZDViYjczM2M4YmQwNjgxMzdiYTNhCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgIDMxMTA0MDAsIGQwYjNmZTA5MjUxMWZlZDBlMzg0ZmZhZDg1ZjZhZTNjCisxLCAgICAgIDY3NTg0LCAgICAgIDY3NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDQ4MjM2NTYxMWM4NjY2M2I3MGExMzUxMWQ4MTk0MjgyCisxLCAgICAgIDY4NjA4LCAgICAgIDY4NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDRmOTAwMjcxOGE3MTAzYTRiMTViOTZlOWUwOGEyY2ZkCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgIDMxMTA0MDAsIDEzMWMwOTBmODA2NjU4ZmZiYjQ5NDliMzMxMGE2MzQ4CisxLCAgICAgIDY5NjMyLCAgICAgIDY5NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDIzMDFlMzMzNjE2NGZlMjk4Yjg1MDA2YjBlN2RjMGI4CiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgIDMxMTA0MDAsIDcxZTgwNDJlZDAxYTFiYmU5NzE0MTdkODc2ODVkZGExCisxLCAgICAgIDcwNjU2LCAgICAgIDcwNjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIGQ4YjRjNDdiYjNmNThhNzAxMDlkNzBlZGFlYTk5MTZiCisxLCAgICAgIDcxNjgwLCAgICAgIDcxNjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIGZmODdjYTU0YWQxMTJjMDgzYjFjYzI1MDQzNDI5NDEwCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgIDMxMTA0MDAsIDk0OGNjOGQ3ZWNlYjJlNTEyYzg2NjAwNjMxNDM1NTdiCisxLCAgICAgIDcyNzA0LCAgICAgIDcyNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIGVlZTljN2ZkM2M3ODY4MWZjZmNkZjQwZWQ3ZWUyYzZiCiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgIDMxMTA0MDAsIDhiNTgwZDRmNjIwYWY1MmFjMGE1NzAyMTk3ZjVlOWQ2CisxLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIGQwNWEyZDgxMGUyYzIwMWNmZjllMTE1YzQ4Y2ZmOTc3CisxLCAgICAgIDc0NzUyLCAgICAgIDc0NzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDVlZjE0NjQwYjg2MDYyYzk5NDI3ZTAxNzdiMzM2NTdjCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgIDMxMTA0MDAsIGEzMGJmYzA3MjdjNmFiYjQ3Nzc1MTk2OWMxYjE0NTBjCisxLCAgICAgIDc1Nzc2LCAgICAgIDc1Nzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDkyMzk4ZGQxN2FmNjM2MmFhODFmZThhOWFhZDBhZjAxCisxLCAgICAgIDc2ODAwLCAgICAgIDc2ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDEzMWI5MTBlMGFmMzBlNTI1MDcyNmIzZDRhNWY0ZjEwCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgIDMxMTA0MDAsIDI4MzgxMTQyZTYwZTkwMTFkMGNkNzVlNzg4MWMxOTU2CisxLCAgICAgIDc3ODI0LCAgICAgIDc3ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDUwMTU3ZjM1NDFhY2Q0MmQyYzQ2MGUxMjVhOWYyMzkzCiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgIDMxMTA0MDAsIDFiNGJkYWU0MGQ3NmVkNzYyNWY4NWRhN2M1Mjg5MzYwCisxLCAgICAgIDc4ODQ4LCAgICAgIDc4ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDI2NmZkMTg1MjlkOTViNzM0N2U5YTAxOTI3MTA1NmZjCisxLCAgICAgIDc5ODcyLCAgICAgIDc5ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDJmOWEzNDdjZTc1MDUwMWYyZTRkMGEzNmM5NWJjOGIwCiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgIDMxMTA0MDAsIDM1NGZiNTQ1YWRmNjA4MmRjNTdiODA3N2JhMTQ2NmFkCisxLCAgICAgIDgwODk2LCAgICAgIDgwODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDBmOGIwNjI2ZWYwMWQwZTk0MTkxNGQ3ODEwOTQ1YWExCiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgIDMxMTA0MDAsIGM5NjlmMjFiZTBkY2JlZjZiMjMyZDNmMGE5ZTNmMTg5CisxLCAgICAgIDgxOTIwLCAgICAgIDgxOTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDUxZGE2YjBjM2Q1ZGFkZGI4ZjQ2MzVkNjkyYjBlOGJhCisxLCAgICAgIDgyOTQ0LCAgICAgIDgyOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIGFhYzhhNzE1MjEwMzI0M2RhYmQ5NGUyYTM3Y2FmNTNmCiswLCAgICAgICAgIDUyLCAgICAgICAgIDUyLCAgICAgICAgMSwgIDMxMTA0MDAsIDRmZjE5YWI4OWViZTQ2NmU4Y2UzZGYwYmEyNWI2YjBhCisxLCAgICAgIDgzOTY4LCAgICAgIDgzOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDUwYzhkNWIwYTM3M2MwN2VjYjY2Y2EzM2UwODdhMjk5CiswLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgIDMxMTA0MDAsIDQ5ZjYwMTkzMmMxOWFlOGQ0MDU3NzFlOWNmZDRmOWU4CisxLCAgICAgIDg0OTkyLCAgICAgIDg0OTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDJhYmQ5NzU4NjhjOTgwNWZhNDU2YTA4ZjFhYjE2YzkxCisxLCAgICAgIDg2MDE2LCAgICAgIDg2MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDU2MzA5MzI2YmM4MGE2MjE2YjA0ODkzNDcxM2RiOTA3CiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgIDMxMTA0MDAsIGM3NWQyMjIxMzI3ZDU5NTNiMDEzZmRjOWQzNmRiY2QzCisxLCAgICAgIDg3MDQwLCAgICAgIDg3MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDQ3MGZkNDk5Nzc5M2Y1M2FkMmIyMWI0N2M2Yjk4YmIxCisxLCAgICAgIDg4MDY0LCAgICAgIDg4MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDFhZWQ1N2U4YmEzMzM1MDcxMWUxZmY2NjhjOTA2OTUzCiswLCAgICAgICAgIDU1LCAgICAgICAgIDU1LCAgICAgICAgMSwgIDMxMTA0MDAsIDZjOGI4YzYwMTJiNmFjMzZjNGMyYTNhYjU2MjllYzYxCisxLCAgICAgIDg5MDg4LCAgICAgIDg5MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDllOTEwNDQ2YTNiOGQzMGYyNzBjMDVhY2EwMTE3MDRkCiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgIDMxMTA0MDAsIDQ0YTA1NzA1YWQ1Y2I3MzBlNzI0NGMzNmI0Zjk0NzcxCisxLCAgICAgIDkwMTEyLCAgICAgIDkwMTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIGFmNmMwMzZkNjZkZDViYjVjMjUwZjE2MjA3MTczMTgwCisxLCAgICAgIDkxMTM2LCAgICAgIDkxMTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIGRlNzZkNTg3ZjM0OWZlNTk3ZTY1Y2IxZjUxYmRjYzM0CiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgIDMxMTA0MDAsIDBlZTUzMjI0ODE0Yzg0MjI0NTI1MTgxYWFjYmQ5YTM5CisxLCAgICAgIDkyMTYwLCAgICAgIDkyMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDdhYmFiNWJmZmViZmNjODAxYTExZjZiNzkwNWExM2M5CiswLCAgICAgICAgIDU4LCAgICAgICAgIDU4LCAgICAgICAgMSwgIDMxMTA0MDAsIGNkNzc5N2FhNzVjOTZhMmE3MWU5MzllYTZiNjc3MzEwCisxLCAgICAgIDkzMTg0LCAgICAgIDkzMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDM1NjdjYWFhZWE3NWIxY2RhNTkyMGZkNmRiZjJhMDE2CisxLCAgICAgIDk0MjA4LCAgICAgIDk0MjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDJhNjg0ODQxOGQ4MjlhMjczYjg1NjIwZTViNTljYWJlCiswLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgIDMxMTA0MDAsIGFjMjIwNzE1NmRhMjlmZDMzY2ExYzY2MjI0NDQ1YmJjCisxLCAgICAgIDk1MjMyLCAgICAgIDk1MjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDc5ZDBjMjEzYWNlZmEyYmMwMGRlNGZkNDU1YjM0ZGY5CiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgIDMxMTA0MDAsIDE2NjljOTU5YmQyYjZmMjQ1Y2M4M2VhMDBkMGRlODNmCisxLCAgICAgIDk2MjU2LCAgICAgIDk2MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDI2NzQxNDQ3M2UwZTdjNzVjN2MxZGRlN2JlMDAxNzYyCisxLCAgICAgIDk3MjgwLCAgICAgIDk3MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDg5MzEwN2RkYjk2OWNiYzI1YTVhYThjNTY0NTU5ODM2CiswLCAgICAgICAgIDYxLCAgICAgICAgIDYxLCAgICAgICAgMSwgIDMxMTA0MDAsIGE3NGU2NTg2ODQyYTRjODc3ZmE5YTEyM2U3YjhlZjk0CisxLCAgICAgIDk4MzA0LCAgICAgIDk4MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDE1NTVhNzExN2Q1MjU0YWZlZjNlMzZiMWQwYTllZGQyCiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgIDMxMTA0MDAsIDVhZjRlZGJmOGE3N2VhZDE3ZjQ4OTFjYmFjNmQ3MmJlCisxLCAgICAgIDk5MzI4LCAgICAgIDk5MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIGRkOTJjMzI0MWU0NWQ1NGNjMDcyZmMwMzA3ZDE4NTBjCisxLCAgICAgMTAwMzUyLCAgICAgMTAwMzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDk1YzU1YjE3NjdkZGVhOWFmODBlZGJiMzJlMmI0ZGJjCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgIDMxMTA0MDAsIDUyNTk4Y2I1ZjNjYjc1YmM0MDEzNzAxMThiY2IyYzQ5CisxLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDFkMTMzZTdhODNmMGNmOTZhNmU5Y2VlOTBkMTc5NzVhCisxLCAgICAgMTAyNDAwLCAgICAgMTAyNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIGI3MWI4MmE0YWJjZGU2NDBhNDZmY2MzYmQ2OTMwZDUxCiswLCAgICAgICAgIDY0LCAgICAgICAgIDY0LCAgICAgICAgMSwgIDMxMTA0MDAsIGQ0NGFhMDVkZTg5ZTcxYjNhZjIzZGU5YWZiYjJhM2IxCisxLCAgICAgMTAzNDI0LCAgICAgMTAzNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDU3Njk3YzZmOGUzMmRkYTMwNGI3N2IyODgxYjUwMTFkCiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgIDMxMTA0MDAsIDE2MWZkMWZmOGI0NzdhMTM3ZTExM2NlN2U2YWMyNmY3CisxLCAgICAgMTA0NDQ4LCAgICAgMTA0NDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDU5MjcyNWVlNWVlMmFkZmMwMmU4YzE4OWY0MDJhM2Q5CisxLCAgICAgMTA1NDcyLCAgICAgMTA1NDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDJiMTA3MzczNGVhMDhjMGNmZWVhYWIxNWFkMDRhYTYwCiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgIDMxMTA0MDAsIGI5YjVlZmFmNWY3NDk1NDg5Nzg4MmIwZjA5YTVjMDg4CisxLCAgICAgMTA2NDk2LCAgICAgMTA2NDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDE4ZjJhNWRhZWYyMjkzZTY5MGZlMDkxNTEyN2NiNzk1CiswLCAgICAgICAgIDY3LCAgICAgICAgIDY3LCAgICAgICAgMSwgIDMxMTA0MDAsIDE0MDVmM2Q1ZTc1YzJmZmQzOTBiNDZmN2RlZjcwNDc4CisxLCAgICAgMTA3NTIwLCAgICAgMTA3NTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDRmYTc1ZmY3ODgwMTlkOTlmNmFiMGFkMmVlNWNjM2Q0CisxLCAgICAgMTA4NTQ0LCAgICAgMTA4NTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIGQ0MGYxMTcyMTQ5ODIxZDg0MTMwOTkwZDVhY2Q5Mzk1CiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgIDMxMTA0MDAsIDNiZjE5ZWRhMDU2ZDVmYzYwOTY2MmJmNWNhOGUzYjMzCisxLCAgICAgMTA5NTY4LCAgICAgMTA5NTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIGVkYWUxNGEzOWQxMDM0Y2ZjZTU2NTUzMzdkZjIyMDZlCiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgIDMxMTA0MDAsIDhiYTE5MjVkYzZiMzhhMzQwZTUxYWEyMzRiNWZmNGRmCisxLCAgICAgMTEwNTkyLCAgICAgMTEwNTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDU3NGE2YTNiNDI3MzE0YzJlYjQ4MjI2ZDJkN2NlNjdkCisxLCAgICAgMTExNjE2LCAgICAgMTExNjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIGViZjEzYWIyNzk1YzA5MWYxNWI5MDg2ZDViZjJlMTFlCiswLCAgICAgICAgIDcwLCAgICAgICAgIDcwLCAgICAgICAgMSwgIDMxMTA0MDAsIDMwMWFlY2JlM2Y4YmYzODMxZDZkZTU0MGE1NjhhYmJjCisxLCAgICAgMTEyNjQwLCAgICAgMTEyNjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDA3NGM2M2M4MTM0NTgwNGM3NDM3ZGUzM2NiNWUzNTVmCisxLCAgICAgMTEzNjY0LCAgICAgMTEzNjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDU4ZGE5ZWRiNWUyNzhlMjkyY2ViZWJmNmIyNjQzNWIwCiswLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgIDMxMTA0MDAsIDM4ODU2NWYwODg3MTBhZWIwZjUwZWNkZjhlZjBlZTg2CisxLCAgICAgMTE0Njg4LCAgICAgMTE0Njg4LCAgICAgMTAyNCwgICAgIDQwOTYsIGNlNzVmZDA3OWEyMWUwNjM3OTAwYWM0OTFjNGZiYzM2CiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgIDMxMTA0MDAsIGRmMjcxOTZmZjhkYTUwODVjNTg5NzlkZWVhZTljNGExCisxLCAgICAgMTE1NzEyLCAgICAgMTE1NzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDkyMTUzYzE0YWVhYmZiNGI0NTQ2YzM0MDIwMTIwMmIwCisxLCAgICAgMTE2NzM2LCAgICAgMTE2NzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIGYwMmU4ZDIzZWUwY2E4MDcxM2I0NDU4ODczY2U3MjRmCiswLCAgICAgICAgIDczLCAgICAgICAgIDczLCAgICAgICAgMSwgIDMxMTA0MDAsIDc1MDIyNmM4NGFhZTI3MDQ0OWUwYTIwNzUxMjE4MjE3CisxLCAgICAgMTE3NzYwLCAgICAgMTE3NzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDBhZGVjMDQzNDlkMjY5ZjdkZGUyN2M1OWM3MDc3OTU0CiswLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgIDMxMTA0MDAsIDA3NmQ0MjQ2ZTU0OTRlNmQ1Y2Y4ZmZiMDliZTNhNzUxCisxLCAgICAgMTE4Nzg0LCAgICAgMTE4Nzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDQ0MDhkNjgyNGNhNmMyMDgwZmQ3NmMxYWI4NDAzODJjCisxLCAgICAgMTE5ODA4LCAgICAgMTE5ODA4LCAgICAgMTAyNCwgICAgIDQwOTYsIGMzNjAzNzMwYTA1Y2ZmNDc5MTQ4ZDliNjliN2VkMmU4CiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgIDMxMTA0MDAsIDlmNjI2Mjg5ZjE4YTM0ODI2MjhiNTExODQwZGVhYTEwCisxLCAgICAgMTIwODMyLCAgICAgMTIwODMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDI1YTZhZjVlZjk4YWFlM2M0MDYxMGU1OGNhNjViOGE5CiswLCAgICAgICAgIDc2LCAgICAgICAgIDc2LCAgICAgICAgMSwgIDMxMTA0MDAsIGY5MjVlM2ZmNGJkYTk5NjJhMzEzYjZhYzIxYTIwMWYxCisxLCAgICAgMTIxODU2LCAgICAgMTIxODU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDVhZDg3NWU0NDM3MDU5MTU3ZjBmM2E1ZWM5MTFlNzQxCisxLCAgICAgMTIyODgwLCAgICAgMTIyODgwLCAgICAgMTAyNCwgICAgIDQwOTYsIGNmYzA2ZmRjNzU1NTc5YmU3NDQwZmNhNzk3ZDgxMTkxCiswLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgIDMxMTA0MDAsIDFkODkzODYxNTQ1ZTgwNDk0NGM1MTllNTgwMjA0OTg4CisxLCAgICAgMTIzOTA0LCAgICAgMTIzOTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDdjNzgzZDdiOTczYmI4MDQ4ZWVhYTU2ODI5N2NmYTM1CiswLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgIDMxMTA0MDAsIDRkNDJmY2E3MzA4MmZkZTM4MDIwYThmZWMwYjI3ZGIyCisxLCAgICAgMTI0OTI4LCAgICAgMTI0OTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIGNhZTIyYjk5YjJjNmZlYTUyN2ZiNWMwMzhkMzc2NWY4CisxLCAgICAgMTI1OTUyLCAgICAgMTI1OTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIGZjNGI1ZWY1YTVhMjgxMDJiZjc4MmI4NzMyZmMyOTkzCiswLCAgICAgICAgIDc5LCAgICAgICAgIDc5LCAgICAgICAgMSwgIDMxMTA0MDAsIGVkODgzMzU0ODBlZjAwYWVkY2Y3M2MzYTg3MTI3MDVjCisxLCAgICAgMTI2OTc2LCAgICAgMTI2OTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIGUyNzg5NjgyNzdjY2M2NDk5MmJhNmJiNzNhZDk5MDlkCisxLCAgICAgMTI4MDAwLCAgICAgMTI4MDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIGUyZWI4MWQzMGZlN2ZhOTAxZWFmMjk1ZmNhOGJjOGI4CiswLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgIDMxMTA0MDAsIDk2OGJhNGM5M2Y4MGNiOGM2ZmJmYWNjYjc2NWMzZDcwCisxLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDVhOWI5OWMwNjM5YmQ4MGVmN2YyMDk3MTU5MGUyM2M3CiswLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgIDMxMTA0MDAsIDAxZWY1MmIwYTE4ZjQ2NTU2YmE5ZTAwZDFiMGM3N2FmCisxLCAgICAgMTMwMDQ4LCAgICAgMTMwMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDI3NjVkMTA5ZjA5ZWZhMmYyNjYxZGZkMmU2NjZmMjVjCisxLCAgICAgMTMxMDcyLCAgICAgMTMxMDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDFmZjUyZDU4NzBjZDY2NzM4OGZlNjlmNDhlMjI4ZmM2CiswLCAgICAgICAgIDgyLCAgICAgICAgIDgyLCAgICAgICAgMSwgIDMxMTA0MDAsIDU0NTgyZjJhZTY4NzhiMzdjYmQxYjVjNTc2ZmQwOWM3CisxLCAgICAgMTMyMDk2LCAgICAgMTMyMDk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDM2MTI0NzBhNThiYjVlYWIyNjIzOWZiZDNkMDk3ODY2CiswLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgIDMxMTA0MDAsIGZlYzY1ODVkMjQ0MjU3YjUyYzkwY2ZhMTliMjJmZDdjCisxLCAgICAgMTMzMTIwLCAgICAgMTMzMTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIGJlMTcwYTFlM2ViYTRjNTNiMGUyZmM4Yjc5NWM3NzY3CisxLCAgICAgMTM0MTQ0LCAgICAgMTM0MTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIGFiYjg1YWI0OTg3YzUwZTA1ZWNhYjBlODMxZDUzZmQ2CiswLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgIDMxMTA0MDAsIGJlMWUwMjM3YzVkOGJhYjk4YWE3NWE5MWUwZDRiZDliCisxLCAgICAgMTM1MTY4LCAgICAgMTM1MTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDJlOWI1YzE3ZGNhZjc3ZjE3MTU0NGMwZWVlNmNmMTkxCiswLCAgICAgICAgIDg1LCAgICAgICAgIDg1LCAgICAgICAgMSwgIDMxMTA0MDAsIDExMzhhOWYzMTZkMWEyYTlhZTNjNDJkNzc3NTYxNTk1CisxLCAgICAgMTM2MTkyLCAgICAgMTM2MTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDU0YzFjNWQ5YzcwNmUxOTk5YjIyNDM4Mjg3MzZjOThkCisxLCAgICAgMTM3MjE2LCAgICAgMTM3MjE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDdiNDgyZjg1ZTEyMzk4MWU4ZWIzN2MzNjRiMmY0YmJlCiswLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgIDMxMTA0MDAsIDYyZGE0MmU5ZTg2NDNlYzliMTI5OWJiZWFmZmE0YmU1CisxLCAgICAgMTM4MjQwLCAgICAgMTM4MjQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDBiZTIyMzk2NzI4M2FjM2EwMDI5ZmFkNDU4MTc2MTU1CisxLCAgICAgMTM5MjY0LCAgICAgMTM5MjY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDhlYzBjNDA1NGQ0ODRlYmY4ZDY4ZTMyYzNmZmI1OTI0CiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgIDMxMTA0MDAsIDU1ZmM0ZGNmYjdmOGJhYjM3NTE4ODg0ZmM2NzQ3NDE2CisxLCAgICAgMTQwMjg4LCAgICAgMTQwMjg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDAzMDg3NjJhNDM2MmFjYmYxYzllMWU2MmU1MDU1ODgwCiswLCAgICAgICAgIDg4LCAgICAgICAgIDg4LCAgICAgICAgMSwgIDMxMTA0MDAsIDUxYmU2OTc5M2JmYWUzZmUwNzhkMDRlOGRlZTNhNDhiCisxLCAgICAgMTQxMzEyLCAgICAgMTQxMzEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDU2YTE4Zjc5NWIyNWVmOTNkMjdhNTNhOWY2YTg3ZWM5CisxLCAgICAgMTQyMzM2LCAgICAgMTQyMzM2LCAgICAgMTAyNCwgICAgIDQwOTYsIGFkNDZlZDhjM2FjMjNiNzliYmQwNjZlNDNiNzdmNGU2CiswLCAgICAgICAgIDg5LCAgICAgICAgIDg5LCAgICAgICAgMSwgIDMxMTA0MDAsIDM2M2I3OTQ4ODBhMmNjMDZlNWJlNDYyNmM2ODQ3YzE5CisxLCAgICAgMTQzMzYwLCAgICAgMTQzMzYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDYyNzE5YTdkNDUyMWFjODI5NTdjZTNmNTJiYTIxODU0CiswLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgIDMxMTA0MDAsIGNkMWQ1ODVjZjljYjY4ZjcyZjdkNmEwZWM5YWI5NmFiCisxLCAgICAgMTQ0Mzg0LCAgICAgMTQ0Mzg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDg4NTQxMjhhYTgzNzdhZDVlNTJhZjk5MGQ0NjQyZWY1CisxLCAgICAgMTQ1NDA4LCAgICAgMTQ1NDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDM4ODI3YmY3YTEyOWY5MjA2MmI5MGZjZjAzYmE4MGMxCiswLCAgICAgICAgIDkxLCAgICAgICAgIDkxLCAgICAgICAgMSwgIDMxMTA0MDAsIDEzOGY4Njg2ZWU3Mjk0YmY0YWYwNzJjZWU3MDQzZjUyCisxLCAgICAgMTQ2NDMyLCAgICAgMTQ2NDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDI0ZDRlMTEyYjI3NTExNmRjYjUxMmU2YjI4MzQ4N2UzCiswLCAgICAgICAgIDkyLCAgICAgICAgIDkyLCAgICAgICAgMSwgIDMxMTA0MDAsIDEzN2MxYmRjMmJiNmZhMWUxODFmODRiMDljMTRlMGI2CisxLCAgICAgMTQ3NDU2LCAgICAgMTQ3NDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDAzYzM3NGQ5ZDcyZGY4N2Y5OTQyN2ZlMTA0NWJlOGRhCisxLCAgICAgMTQ4NDgwLCAgICAgMTQ4NDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIGMwYzVhOGZkMjRkNWE5ZjUzNTExOGVjMjY2NDY4OTc2CiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgIDMxMTA0MDAsIGU3YmM0NjczOWM0NmVjODg2ZmM1MDU5YWY3MmY3NzJhCisxLCAgICAgMTQ5NTA0LCAgICAgMTQ5NTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIDMzODE0NzJlMTRjNDJhMDZjZGNmMzU3NzRhMGIzYTlhCisxLCAgICAgMTUwNTI4LCAgICAgMTUwNTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDRjMDdhN2EwMjgzMTY3NWE2ODZjNmYzMWUyODA5ZTRhCiswLCAgICAgICAgIDk0LCAgICAgICAgIDk0LCAgICAgICAgMSwgIDMxMTA0MDAsIGRiNGMyYWE2N2M3NjU3M2U0ODgwYjAyOWJlZjU5YzhkCisxLCAgICAgMTUxNTUyLCAgICAgMTUxNTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIGFkZGU5MjhmNzM0ZmZlNmMwNzQ0NmM5ZDcwMjE0Zjc0CiswLCAgICAgICAgIDk1LCAgICAgICAgIDk1LCAgICAgICAgMSwgIDMxMTA0MDAsIDNhMjg3MTEzYWQyMTk2NDIwYTA0NzQyNDNiZDE4MTNkCisxLCAgICAgMTUyNTc2LCAgICAgMTUyNTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIGYxZmY4MmZlYzFlZjA5NjA5MGFjYmY2MDIxMmIyYjY5CisxLCAgICAgMTUzNjAwLCAgICAgMTUzNjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIGUzYjI3MTk5MWNjMmNkNGZkYjU2NjE2NDQzYzlmM2U4CiswLCAgICAgICAgIDk2LCAgICAgICAgIDk2LCAgICAgICAgMSwgIDMxMTA0MDAsIGQzZWQ4MDNjYTE5ODRmMDIxODAyZTZjNzM2NGNiNTdmCisxLCAgICAgMTU0NjI0LCAgICAgMTU0NjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDAyNWMzMjcyYmZiOWYyNGFiNjg3YmM4MThkNTdkODUzCiswLCAgICAgICAgIDk3LCAgICAgICAgIDk3LCAgICAgICAgMSwgIDMxMTA0MDAsIDc3NmQ5OWMyOTczMjYxYzEyZTk3OGZlOWZlNWM1Nzk0CisxLCAgICAgMTU1NjQ4LCAgICAgMTU1NjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDhiYjJkZTA1OTE5NDQwODk2MmJlNGRmZGQ4ODc3NWZjCisxLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIGViNjFiY2JjYzk4OTdkMDFmNTY0NWEwNjYyZGZiZDZkCiswLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgIDMxMTA0MDAsIDYyZWUyZWMxMjYxZGI4NTQ0ZGVkOWRiOGM0NDQyZjE1CisxLCAgICAgMTU3Njk2LCAgICAgMTU3Njk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDQ4YTNjODk3MTgzNTM4ZGU5OTIwZTk0NDE3ZjU0NzMzCiswLCAgICAgICAgIDk5LCAgICAgICAgIDk5LCAgICAgICAgMSwgIDMxMTA0MDAsIDFiZmFiYzdhYjM3MDFlMTEyZTc2OTU1YTQ0OTQzMWQ3CisxLCAgICAgMTU4NzIwLCAgICAgMTU4NzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIGZmZTE1OWQxMzdlNTFkOGZkNGQ1YjM2MzlkZjU2M2EzCisxLCAgICAgMTU5NzQ0LCAgICAgMTU5NzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDc3MDJlNThlNGFlMDc1YjZlMTJlODYzZjhjNWQ5MDhlCiswLCAgICAgICAgMTAwLCAgICAgICAgMTAwLCAgICAgICAgMSwgIDMxMTA0MDAsIGUwM2RmYzcwYzI1Yjc3ZmM0N2VhNDJkZGI4ZDVkYTVjCisxLCAgICAgMTYwNzY4LCAgICAgMTYwNzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDJlMmI0OTc2NDNlMWI2YmYxM2RkNWU1ODVlY2Q5MDkyCiswLCAgICAgICAgMTAxLCAgICAgICAgMTAxLCAgICAgICAgMSwgIDMxMTA0MDAsIGIwZjBjMzA4YjQ5Y2I4MmZhZDNiNDk5NWNiNjBiNmExCisxLCAgICAgMTYxNzkyLCAgICAgMTYxNzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIGZjY2U3NmViYmE1MTY2OTY2ZGI3OTJkZmM3N2ZkYTNkCisxLCAgICAgMTYyODE2LCAgICAgMTYyODE2LCAgICAgMTAyNCwgICAgIDQwOTYsIGNjZjVhODE5ZTAwY2U4YzUxOTdhZTViMmI4MjdmM2U1CiswLCAgICAgICAgMTAyLCAgICAgICAgMTAyLCAgICAgICAgMSwgIDMxMTA0MDAsIDYyN2M4ODhlYTk0ZGFiZmYyYWFmOTZjODAwYTg1ZjdhCisxLCAgICAgMTYzODQwLCAgICAgMTYzODQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDIzODVjOWUyMDVjZmRkNWUwYjJhYzU0ZTllZjBmNTI1CisxLCAgICAgMTY0ODY0LCAgICAgMTY0ODY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDQwMjE0YmEzZjliZGMxYmJiN2Q1OWUxZmRiOWRlZjJmCiswLCAgICAgICAgMTAzLCAgICAgICAgMTAzLCAgICAgICAgMSwgIDMxMTA0MDAsIGYyMjMxZWFjNmU1ODg1ZjYxZjQ3MGE1YzZiNjVjZWVhCisxLCAgICAgMTY1ODg4LCAgICAgMTY1ODg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDUyNTE2ZTg2MGJlY2EwYWYwZDgwZjc5MjY2Yzc2MWNjCiswLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgIDMxMTA0MDAsIGVjODczZGVmNTljZGU3YzExNGZlMjdiYTFiMmMyNWE2CisxLCAgICAgMTY2OTEyLCAgICAgMTY2OTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIGEyNTg0ODk0NTIzNWZkNzBkMTAyMWI5YTkyZGFmZDhkCisxLCAgICAgMTY3OTM2LCAgICAgMTY3OTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDM4YzdhMjZjN2E1NDVkZjVmYTE3MjFlZTNlODIwMzA5CiswLCAgICAgICAgMTA1LCAgICAgICAgMTA1LCAgICAgICAgMSwgIDMxMTA0MDAsIDdhNWU5OGIxMGIxZjk4NGI2MjRiYzYzOTlhNDVkZGUyCisxLCAgICAgMTY4OTYwLCAgICAgMTY4OTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDUwNmQzYzNiMzRmMDYwYTA1MTYwMTFjYTIzN2NiNmE1CiswLCAgICAgICAgMTA2LCAgICAgICAgMTA2LCAgICAgICAgMSwgIDMxMTA0MDAsIDE4MGQ3YjllZjY5YThlZTMyZTVmY2MzYjk1NzljMTFmCisxLCAgICAgMTY5OTg0LCAgICAgMTY5OTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDJlZjNjZDU2ZGZjODcwYTI1MWJiOTdmNGQ0NzRiZTg0CisxLCAgICAgMTcxMDA4LCAgICAgMTcxMDA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDM4M2M4MmU2MDBlYmFkZGRkMDQ2N2NjM2E5NTc1ZjNlCiswLCAgICAgICAgMTA3LCAgICAgICAgMTA3LCAgICAgICAgMSwgIDMxMTA0MDAsIDhjMDEwN2UzYmRhNGM5OTMxMzFiMzYxZDU5OGI0YjRkCisxLCAgICAgMTcyMDMyLCAgICAgMTcyMDMyLCAgICAgMTAyNCwgICAgIDQwOTYsIGI5OTc2M2NkYzFkNTQxMmY4OWU3ZDFmY2IzYmQxYzM1CiswLCAgICAgICAgMTA4LCAgICAgICAgMTA4LCAgICAgICAgMSwgIDMxMTA0MDAsIDMxZTFlYTMyYzMyMDBhNDE4MTRiNTg5MGI4MWM1MjExCisxLCAgICAgMTczMDU2LCAgICAgMTczMDU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDdiM2VjYjkxYzYzZjdmODZkNmU5NmYzMDViM2JkNTA3CisxLCAgICAgMTc0MDgwLCAgICAgMTc0MDgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDY5NDU2MjFhMWVlMGZiYzY4ZTdkYjc4NmJjODM3ZjUzCiswLCAgICAgICAgMTA5LCAgICAgICAgMTA5LCAgICAgICAgMSwgIDMxMTA0MDAsIGY2MjIzMjIxYmU1MTM2ZDAzYzg3MzMzYzdmMjExM2M1CisxLCAgICAgMTc1MTA0LCAgICAgMTc1MTA0LCAgICAgMTAyNCwgICAgIDQwOTYsIGZiMWRlNzFhYjBkODQwNjk5ODM0ZDU4M2ZiZDM0NjhlCisxLCAgICAgMTc2MTI4LCAgICAgMTc2MTI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDJhM2IyZDI5OWQ4N2Y1Yjk4MjE1NmFlNzQwZmI3YjQ2CiswLCAgICAgICAgMTEwLCAgICAgICAgMTEwLCAgICAgICAgMSwgIDMxMTA0MDAsIDMyNWQwZmI2NWUzNTgyNmFlYmIwZjgwZmMzNGY0MjZmCisxLCAgICAgMTc3MTUyLCAgICAgMTc3MTUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDY0NjI5NTJlODU1NTE3MjExMGMzN2M1NzlkNDVmNjNjCiswLCAgICAgICAgMTExLCAgICAgICAgMTExLCAgICAgICAgMSwgIDMxMTA0MDAsIDEzMjhlOGM2OTQxOWZlMWM0NGZjNmNmYTFmNjQ4ODM5CisxLCAgICAgMTc4MTc2LCAgICAgMTc4MTc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDI3OTUzN2EwNjY4ZDI1NGE2NzEwYzkzNWYyYTdiOGQ3CisxLCAgICAgMTc5MjAwLCAgICAgMTc5MjAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDI4NmEyN2ZlZTk1YmY4NzczZWU4ZWEwMzYyMWU5NTAyCiswLCAgICAgICAgMTEyLCAgICAgICAgMTEyLCAgICAgICAgMSwgIDMxMTA0MDAsIGIyMzRmOWFhYjY5NjVlMTM2YmIyODNhMmFkMGZiYjY4CisxLCAgICAgMTgwMjI0LCAgICAgMTgwMjI0LCAgICAgMTAyNCwgICAgIDQwOTYsIDM0MzQxM2IxMTBmZTQ4Njc0ZGRkZWJhMDcxNDQwNzA3CiswLCAgICAgICAgMTEzLCAgICAgICAgMTEzLCAgICAgICAgMSwgIDMxMTA0MDAsIDM5NjFlZjQzMTczYzY5YTI4ZDIxOTZmNGZhMTFkMzdhCisxLCAgICAgMTgxMjQ4LCAgICAgMTgxMjQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDY2MjY1ZDgwNjI5MzY5ZmM5ZmZmZGRiYmU2ZWYxMDRkCisxLCAgICAgMTgyMjcyLCAgICAgMTgyMjcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDNmZjE5M2RhNGQyMTY4Zjk3ZjE3ODQxZjk2NjlkMzNlCiswLCAgICAgICAgMTE0LCAgICAgICAgMTE0LCAgICAgICAgMSwgIDMxMTA0MDAsIDk0M2M2ZGQ0MjI1NGQzNDZkODFmZDU1YmZhZDYwNTczCisxLCAgICAgMTgzMjk2LCAgICAgMTgzMjk2LCAgICAgMTAyNCwgICAgIDQwOTYsIGRkNDA3NDM5OGIxMDE1MDJjMjkwMDk2ODc2ODZlNzhkCiswLCAgICAgICAgMTE1LCAgICAgICAgMTE1LCAgICAgICAgMSwgIDMxMTA0MDAsIDAwMjhjMzJlYWNiNmY0ZDc3Y2I5OGNmODU2ZDI2NmU0CisxLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTAyNCwgICAgIDQwOTYsIDU2MmJlNDQ0ODk2NTQzZjI1OTUyNzA4MWM3Nzk1NTk3CisxLCAgICAgMTg1MzQ0LCAgICAgMTg1MzQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDE0NWI0YjI2MGYyMzkzZWMxZTM0NjRkNzljODdmZThlCiswLCAgICAgICAgMTE2LCAgICAgICAgMTE2LCAgICAgICAgMSwgIDMxMTA0MDAsIGY0NzhmZTQ5ZmVkODBiOTJlYWExODJhYThlNzk0MDc3CisxLCAgICAgMTg2MzY4LCAgICAgMTg2MzY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDY4ODRlYmM4MjBiYjQxZTYxZGM1NGE4N2JkNTUwMTFlCiswLCAgICAgICAgMTE3LCAgICAgICAgMTE3LCAgICAgICAgMSwgIDMxMTA0MDAsIDlhNTJjMDYxYzEzNWJkNzVlZTMxN2ZlNDhhMmNkZGY4CisxLCAgICAgMTg3MzkyLCAgICAgMTg3MzkyLCAgICAgMTAyNCwgICAgIDQwOTYsIGQyZDhiMmZkN2ExNDBhM2YzMmQ1NjQ5ZjhlNTA3NjM3CisxLCAgICAgMTg4NDE2LCAgICAgMTg4NDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDc2NzA3MWE0MDllMGIwN2JkMmNkYjI1MGMzYzg5NjA3CiswLCAgICAgICAgMTE4LCAgICAgICAgMTE4LCAgICAgICAgMSwgIDMxMTA0MDAsIGMzMjdiOTVjOGFmYTcxNmY3NzE5NjAzZDJiNjU2NzliCisxLCAgICAgMTg5NDQwLCAgICAgMTg5NDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDY0YzRlZWQ1ZTFiODVlMDcyOGIxYjBlM2RlMzBmZmExCisxLCAgICAgMTkwNDY0LCAgICAgMTkwNDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDExZmZlZjdlODVkOTkyNWE0MDMyYjNiY2Q5NzQwZTIwCiswLCAgICAgICAgMTE5LCAgICAgICAgMTE5LCAgICAgICAgMSwgIDMxMTA0MDAsIGVkZDNiNGM0ZmExNTc5NDBiOWMyNTJhN2Q5NGU2ZjU1CisxLCAgICAgMTkxNDg4LCAgICAgMTkxNDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDk5ODkzNDIxYTQ5MzY2NGJlMTcwODU1NjdlMTYwMjgwCiswLCAgICAgICAgMTIwLCAgICAgICAgMTIwLCAgICAgICAgMSwgIDMxMTA0MDAsIDVjY2RmZmU3MzU2YTczZDJkMTFlYjc3NjdkZGZhMzk2CisxLCAgICAgMTkyNTEyLCAgICAgMTkyNTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIGVhNDIyMDc3YmM1ODJhZWY0YWY1YmYzY2EzYWEwNjJhCisxLCAgICAgMTkzNTM2LCAgICAgMTkzNTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIGE5ZTdhYjljNDVmYWYzOWYzY2QxZWVlNjljOTVkNjQ3CiswLCAgICAgICAgMTIxLCAgICAgICAgMTIxLCAgICAgICAgMSwgIDMxMTA0MDAsIDdjNGQ4MDgzNjU2NTgxY2NjNjY2NTk3ZGE1NTU5YTQ2CisxLCAgICAgMTk0NTYwLCAgICAgMTk0NTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIGZjMTliNjY0MmRmM2I4NWM3ZWJlNjg0ZTcwNWJmMjlkCiswLCAgICAgICAgMTIyLCAgICAgICAgMTIyLCAgICAgICAgMSwgIDMxMTA0MDAsIDI4Y2FlNTMzNDE4ZjlhNWQ2Mjg2OWNiZWQwYmUzODRjCisxLCAgICAgMTk1NTg0LCAgICAgMTk1NTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIDM5NDIwNjIwYWVhOWQ2MWIyNDA2OTFkYWRhMGYzMDYzCisxLCAgICAgMTk2NjA4LCAgICAgMTk2NjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDVhZDUxNmE1NTY1NWNkYzJhMzM0OGJhZGMyYzdlNWExCiswLCAgICAgICAgMTIzLCAgICAgICAgMTIzLCAgICAgICAgMSwgIDMxMTA0MDAsIGU5Y2Y1MjdhMDU5YzgwNDYxZmQ1MDdiYWI0ODE3MDY5CisxLCAgICAgMTk3NjMyLCAgICAgMTk3NjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIGZhNGYzZDQ1YzFjZmM4ODA4OGI0Y2Q2ZjI5MjQxODRkCiswLCAgICAgICAgMTI0LCAgICAgICAgMTI0LCAgICAgICAgMSwgIDMxMTA0MDAsIGEyZjI1MThiOGEyNTkzMmFmYmI3ODUyM2U4ZGEyODllCisxLCAgICAgMTk4NjU2LCAgICAgMTk4NjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIDY4OWJlMWQ2Zjg0YjEzNjUzN2RmMTFiOGVkMjJiNTQwCisxLCAgICAgMTk5NjgwLCAgICAgMTk5NjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIDk2MTJkYWQ2YzkzYzc1YjY5MTFmMjE5OTdmMmY3YWVlCiswLCAgICAgICAgMTI1LCAgICAgICAgMTI1LCAgICAgICAgMSwgIDMxMTA0MDAsIDhmY2JkZGNlN2YyYTZjM2JjMzgwYWQ0Y2VjMTdlNTFjCisxLCAgICAgMjAwNzA0LCAgICAgMjAwNzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIGRlZmU0YjY2ZTVkZDljNmE1MjdhZWI5ZWJlYzA0Y2RmCisxLCAgICAgMjAxNzI4LCAgICAgMjAxNzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDBjMzliNzFiZTAxNjExZDZiZTAyYjc5NmFlYzJjNmRlCiswLCAgICAgICAgMTI2LCAgICAgICAgMTI2LCAgICAgICAgMSwgIDMxMTA0MDAsIDMyZmY3YjU1MGQwOTgyMWIyYjFlYjY0YzI4ODU1OWJhCisxLCAgICAgMjAyNzUyLCAgICAgMjAyNzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDIxNTBhM2Q2ZmRlYzYxY2Q1ODdiODMyMTdmOWJiYjJjCiswLCAgICAgICAgMTI3LCAgICAgICAgMTI3LCAgICAgICAgMSwgIDMxMTA0MDAsIDFlYjRlOTA1MGE2NjU3YWI5MjkwYWM1OGVkM2FhOTNmCisxLCAgICAgMjAzNzc2LCAgICAgMjAzNzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDRiZTM1YjM2ZDQ2Y2E1NmI3NzhhZTBhZmRkMWU0MjAwCisxLCAgICAgMjA0ODAwLCAgICAgMjA0ODAwLCAgICAgMTAyNCwgICAgIDQwOTYsIGZiNzlkM2Q5ZDBlNGQ1OTA4ODJjYmQwMjNiYmNkMDBkCiswLCAgICAgICAgMTI4LCAgICAgICAgMTI4LCAgICAgICAgMSwgIDMxMTA0MDAsIGU0NWZkNTJlOWVjM2FkMmQ0Mjc0MGRkN2NiNWU5NzFiCisxLCAgICAgMjA1ODI0LCAgICAgMjA1ODI0LCAgICAgMTAyNCwgICAgIDQwOTYsIGQ0Mjk1YTRhMzJkNjQ3YTA0ZWMwZWFiNjM5YzBkOWZjCiswLCAgICAgICAgMTI5LCAgICAgICAgMTI5LCAgICAgICAgMSwgIDMxMTA0MDAsIGQ2MjViOTcwYTc5N2UzN2U0NjVkOTMxOTQ3MWQ0MGMzCisxLCAgICAgMjA2ODQ4LCAgICAgMjA2ODQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIGYwMzQ3OGI3Njg5YWY5YmRmNmU2N2QyNzFhNGIzMTE0CisxLCAgICAgMjA3ODcyLCAgICAgMjA3ODcyLCAgICAgMTAyNCwgICAgIDQwOTYsIDlmZDk3MDEwMjc4ZGM5MTQ3ZDhiNzNiZTlhYWNmYjM1CiswLCAgICAgICAgMTMwLCAgICAgICAgMTMwLCAgICAgICAgMSwgIDMxMTA0MDAsIGI5OGU0YThmZDk5NDkxNWEzZGRlM2RlZjI2YTliMTcxCisxLCAgICAgMjA4ODk2LCAgICAgMjA4ODk2LCAgICAgMTAyNCwgICAgIDQwOTYsIDJiOTY3MDcwN2FkNjYxYjIxMjU2MjBkMjE1NmYxMWY2CiswLCAgICAgICAgMTMxLCAgICAgICAgMTMxLCAgICAgICAgMSwgIDMxMTA0MDAsIGE5OWI3NTliZGZjZjdmN2NlZThmMWVlODRjYTJkNjZkCisxLCAgICAgMjA5OTIwLCAgICAgMjA5OTIwLCAgICAgMTAyNCwgICAgIDQwOTYsIGUxYjJhZmJmY2I1ZWRiOGU0Yjg4YWU5YzA4ODQ4YzMwCisxLCAgICAgMjEwOTQ0LCAgICAgMjEwOTQ0LCAgICAgMTAyNCwgICAgIDQwOTYsIDU4Yzg5MTRmZDRlYzEyYmZlMTNmMzg4MDUwYjI1MWU4CiswLCAgICAgICAgMTMyLCAgICAgICAgMTMyLCAgICAgICAgMSwgIDMxMTA0MDAsIDU0MzljZDk2NDNhNzZkMjFlNWYxZGViMGFhNDAwMGEyCisxLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTAyNCwgICAgIDQwOTYsIDRkOGUwYjBkNGNkMzFmOThlYjRjYTk5MjJiYmExNDk3CisxLCAgICAgMjEyOTkyLCAgICAgMjEyOTkyLCAgICAgMTAyNCwgICAgIDQwOTYsIDAyYjFjMzYyYzJmMTkzOWZhNDFhNGNjOGQ0YjI1ZDZhCiswLCAgICAgICAgMTMzLCAgICAgICAgMTMzLCAgICAgICAgMSwgIDMxMTA0MDAsIDM4MzY0MGUzNzVmYTZiNDZiYmEyMWFjZDU1NmYwZWZkCisxLCAgICAgMjE0MDE2LCAgICAgMjE0MDE2LCAgICAgMTAyNCwgICAgIDQwOTYsIDEwZDNiMDc2MTcxNzEzZTk5NzhjNjc1MTVmZGQ0MzA0CiswLCAgICAgICAgMTM0LCAgICAgICAgMTM0LCAgICAgICAgMSwgIDMxMTA0MDAsIGU5MWJhOWVmMjU5NWZiZWUyMGZiMGYxZDVlMGI5MmJhCisxLCAgICAgMjE1MDQwLCAgICAgMjE1MDQwLCAgICAgMTAyNCwgICAgIDQwOTYsIDcyNjQ1MGM4NWRiZDgzOGJjMDBjNjg2NmQ0YzEwNzg2CisxLCAgICAgMjE2MDY0LCAgICAgMjE2MDY0LCAgICAgMTAyNCwgICAgIDQwOTYsIDM0NzkwNDVmMzBhOTdmYWFlZDJmMjQxNDc4ZWEwNDQ3CiswLCAgICAgICAgMTM1LCAgICAgICAgMTM1LCAgICAgICAgMSwgIDMxMTA0MDAsIDljOGNlMDdmMjIyMTViODQ1MGIwMWU4MmZjMDg1YjNkCisxLCAgICAgMjE3MDg4LCAgICAgMjE3MDg4LCAgICAgMTAyNCwgICAgIDQwOTYsIDYzZDVjYTBmOGQ3ZTA4NmRmYWU1NGU4NmE3NWY4OTcxCiswLCAgICAgICAgMTM2LCAgICAgICAgMTM2LCAgICAgICAgMSwgIDMxMTA0MDAsIDRmMTFiNTUzZWFhYTFmZWI2ODI4NDJhMTEyM2UxYjQzCisxLCAgICAgMjE4MTEyLCAgICAgMjE4MTEyLCAgICAgMTAyNCwgICAgIDQwOTYsIDQxOTUzYjk3ZDhmMmQzZTVjMDU4MjdjNjcwZTNjNTYyCisxLCAgICAgMjE5MTM2LCAgICAgMjE5MTM2LCAgICAgMTAyNCwgICAgIDQwOTYsIDUwNzA5ZjAxYmY4ZGJlOGU0MGY1YjQxNDIxMWU3ZGJlCiswLCAgICAgICAgMTM3LCAgICAgICAgMTM3LCAgICAgICAgMSwgIDMxMTA0MDAsIDMyZTg4MjM2NDNjZTRjYjAxNTQ0ODI2MTFmNGRlNTFkCisxLCAgICAgMjIwMTYwLCAgICAgMjIwMTYwLCAgICAgMTAyNCwgICAgIDQwOTYsIDAzZDgxMzExNmQ3MGZlZDE0OTg3ZTE3ZWJjYWVlZDNlCiswLCAgICAgICAgMTM4LCAgICAgICAgMTM4LCAgICAgICAgMSwgIDMxMTA0MDAsIDIwN2VlNTA1ZjBjZmI1NGEzZmQxZmQ1MjU2YmE5MDZhCisxLCAgICAgMjIxMTg0LCAgICAgMjIxMTg0LCAgICAgMTAyNCwgICAgIDQwOTYsIGQ2OTVlMjkwNWFhYzFkZWUzOWE4ZjM1ZTNhNGI3ZmVkCisxLCAgICAgMjIyMjA4LCAgICAgMjIyMjA4LCAgICAgMTAyNCwgICAgIDQwOTYsIDM1YzVjN2E5Y2ZlNWNmYjA4ZDNkZDI2OWFlYzliOTAxCiswLCAgICAgICAgMTM5LCAgICAgICAgMTM5LCAgICAgICAgMSwgIDMxMTA0MDAsIGY5NWRlMGUxZjNjZDI1NTliNmE4MWE2ZGJlNTNlZDVjCisxLCAgICAgMjIzMjMyLCAgICAgMjIzMjMyLCAgICAgMTAyNCwgICAgIDQwOTYsIDJhNGYzNjk5Nzc1ZTBkNjc2NTFjNGM0MDkxM2M5MDU5CiswLCAgICAgICAgMTQwLCAgICAgICAgMTQwLCAgICAgICAgMSwgIDMxMTA0MDAsIDNjNDdiMWVhNDgxYmRhZTdiNzczMDA4NDQwN2ZkMjJhCisxLCAgICAgMjI0MjU2LCAgICAgMjI0MjU2LCAgICAgMTAyNCwgICAgIDQwOTYsIGJiNTYxODE0ZmZiNWI3NmExZmFmN2RmNDM3NWMyMzNlCisxLCAgICAgMjI1MjgwLCAgICAgMjI1MjgwLCAgICAgMTAyNCwgICAgIDQwOTYsIGEzYzYzMmEwZDU0ZTA3ZTM5MjhhZWM4ZWYxNjlmZDExCiswLCAgICAgICAgMTQxLCAgICAgICAgMTQxLCAgICAgICAgMSwgIDMxMTA0MDAsIGZiZWM1MzNmMGNiNGQ3OTE4NWUwOWM5OTE3MzI5NDczCisxLCAgICAgMjI2MzA0LCAgICAgMjI2MzA0LCAgICAgMTAyNCwgICAgIDQwOTYsIGE4MDVjMzVlOTE2MTVmMTc2NjkxMzBlYzU4MTkxYjc1CisxLCAgICAgMjI3MzI4LCAgICAgMjI3MzI4LCAgICAgMTAyNCwgICAgIDQwOTYsIDA4NTg4MDY2NjNmNjQzMDIxOWI2OGRmN2ZmODNhOTMyCiswLCAgICAgICAgMTQyLCAgICAgICAgMTQyLCAgICAgICAgMSwgIDMxMTA0MDAsIDViOWYxY2Y1MTBiYzcyZDQyNzcyYTc4ZDQwMGQ5ODMxCisxLCAgICAgMjI4MzUyLCAgICAgMjI4MzUyLCAgICAgMTAyNCwgICAgIDQwOTYsIDU5MzM5ODEwZGVhNDdhNzA1YWI5ZTA5MTNmN2E4OGQ1CiswLCAgICAgICAgMTQzLCAgICAgICAgMTQzLCAgICAgICAgMSwgIDMxMTA0MDAsIDZiMDMxZjE4MDQzOWU3NTNiNmIwZTM2ZGU0NmRjMWE1CisxLCAgICAgMjI5Mzc2LCAgICAgMjI5Mzc2LCAgICAgMTAyNCwgICAgIDQwOTYsIDZkOWNkZDgxZTBiYTg1YWQ0ZTAwYzM0ZTJhMDk2NjExCisxLCAgICAgMjMwNDAwLCAgICAgMjMwNDAwLCAgICAgMTAyNCwgICAgIDQwOTYsIGNkNmRkOGRkMGRjNTE5OGI3YmYwYjQ1ZDRlY2MyNjA4CiswLCAgICAgICAgMTQ0LCAgICAgICAgMTQ0LCAgICAgICAgMSwgIDMxMTA0MDAsIGMwOTg3MGIxZTEzZWZhOGI2ODVkODllYmQ3ODFlODM1CisxLCAgICAgMjMxNDI0LCAgICAgMjMxNDI0LCAgICAgMTAyNCwgICAgIDQwOTYsIGMyZGQ5NzJlYjM0YWYyN2EyMTBiY2ZhM2U1ZjhkYTkzCiswLCAgICAgICAgMTQ1LCAgICAgICAgMTQ1LCAgICAgICAgMSwgIDMxMTA0MDAsIDQzOWM2Y2M2ZjcxNTdlYWYwNDZlMDZkOWU1NWRkZjY5CisxLCAgICAgMjMyNDQ4LCAgICAgMjMyNDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDA5OTNiYzQ1Yzk1ODIwNDhkNjk4MmJlZWFlYzZiNzJlCisxLCAgICAgMjMzNDcyLCAgICAgMjMzNDcyLCAgICAgMTAyNCwgICAgIDQwOTYsIGFlOTNjNTkzZmQ3NzVhZTk5N2M0M2VlZjQwZmU4ZDBlCiswLCAgICAgICAgMTQ2LCAgICAgICAgMTQ2LCAgICAgICAgMSwgIDMxMTA0MDAsIDdkNTUyMGMxODRjN2JmM2YxNzVlZWEzNTI2ZGViN2E4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tb3YtZGlzcGxheW1hdHJpeCBiL3Rlc3RzL3JlZi9mYXRlL21vdi1kaXNwbGF5bWF0cml4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MGZjZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtZGlzcGxheW1hdHJpeApAQCAtMCwwICsxLDEzIEBACitbU1RSRUFNXQorc2FtcGxlX2FzcGVjdF9yYXRpbz0xOjIKK2Rpc3BsYXlfYXNwZWN0X3JhdGlvPTE6MworW1NJREVfREFUQV0KK3NpZGVfZGF0YV90eXBlPURpc3BsYXkgTWF0cml4CitkaXNwbGF5bWF0cml4PQorMDAwMDAwMDA6ICAgICAgICAgICAgMCAgICAgIDEzMTA3MiAgICAgICAgICAgMAorMDAwMDAwMDE6ICAgICAgIC02NTUzNiAgICAgICAgICAgMCAgICAgICAgICAgMAorMDAwMDAwMDI6ICAgICA0NzE4NTkyMCAgICAgICAgICAgMCAgMTA3Mzc0MTgyNAorCityb3RhdGlvbj0tOTAKK1svU0lERV9EQVRBXQorWy9TVFJFQU1dCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tb3YtZWxpc3Qtc3RhcnRzLWN0dHMtMm5kc2FtcGxlIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWVsaXN0LXN0YXJ0cy1jdHRzLTJuZHNhbXBsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjg3YTQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWVsaXN0LXN0YXJ0cy1jdHRzLTJuZHNhbXBsZQpAQCAtMCwwICsxLDU3IEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMS8yNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKKyNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNDYwODAwLCBlMmVjNDA3NGU4M2RkNGY5MTg4OTE1YjZiMDhhYTNhMgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDYwODAwLCA5ZWQxYmE5MzViYzIyZWYwM2U2ZjhmZDViMGIzN2VlNgorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDYwODAwLCAzZjFjNTM2NTE0NzUwZGU4NjU3MTEyMjA0NmI1ODU4ZgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgNDYwODAwLCA0Zjc5NDNjYjZmNzk2NmQxOWQzNDQwODFiMGRiMGQ3MQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNDYwODAwLCAwNjYxZjM0ZWI0NTM5OGY4Y2QxNThiNWExNjM3YmQ5NgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgNDYwODAwLCAxNzc2MjBmYTE3YzRkNmZkZGFkMWQzMWMxNjA1ZTQ2ZQorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgNDYwODAwLCA4ZTIyY2RlNThhNTBlMDI3OWJlMDFjMjNkZmQ3YzAzMgorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgNDYwODAwLCA4Yzc0YzRkOGNlZWU5MjlmZGVkODJlZWI3YTBhN2MyOQorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgNDYwODAwLCBhNTBkMDBhODg2OGYwNzIyYmU1NWZhNTk1M2JjNmViZgorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgNDYwODAwLCBmNzkxMjMzYzg5MDRkYTRlMjY3YmY3YmNmNWQ2MjAxZQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgNDYwODAwLCA0ZmY3MDNlZjU3M2ViOGU4ODYzOWQzYzcwMDY0NWJmOAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgNDYwODAwLCBmZDRjOTg0ODc3NzlhYTc3ODNlOWZiM2U4NzRmOWM4YgorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgNDYwODAwLCBlMTFmYmM2YzM2YWQwODZlYTZlNjExZGRkMjhiMjExYworMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgNDYwODAwLCBhNjNiOGFmNjY2ZWUzMGEyNDNjZjllYTBkNDk4MzRiNQorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgNDYwODAwLCAxY2VjNjQ5OWJmYWYwNTRiZjU4MWVmZGFiNzJmNTc5OQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgNDYwODAwLCA1Y2I4ZWE1YTcxNThjYWMxMTEyZmM2NDUzYjJhNTc3ZgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgNDYwODAwLCAyZGYyNTZjYjMxMWY5N2Y0NjQ4Y2RlZWU0MWJhMjBkMQorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgNDYwODAwLCBhZmIyYzEzMzIwNGE5OWZlNDM0NzY3MzQwZjUwYzJiOQorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNDYwODAwLCAyN2M4MDI5MzJmYTg3M2FmODY2M2E2Yjg3MzMzOTFkNworMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgNDYwODAwLCBjNTM4NzJjNDNiYWY1NmQ0OTY4MTFkMjgwOWViY2Q5YgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgNDYwODAwLCBkM2NhMjZlY2I2YmVjNmJmYTUwOGYwN2UyYTY2ZmEzYQorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNDYwODAwLCAyZDQ0ZTE4Y2NmNzM0ZmUwZWQ5OGE3Y2UxZTM2MWZlNworMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNDYwODAwLCBhYzQwNzhiNTQyNmU0NjY0MDI5OTIzY2NmNmVhMzM3NworMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgNDYwODAwLCA2MGQ0NDYwYThiOTdlNThlNzJjMTJkMGM3MzM0YjRlNAorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNDYwODAwLCA5NWJjZWFiNjhiNGVjZjVkZjI2MWZmOWQzNzQzMDQxYQorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgNDYwODAwLCAwYjgwYWQ1YmYyYWZiZmJlNTEyYjgzYWY3OTdhZmQ4NAorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgNDYwODAwLCBmYmM3MDQ2OGY5MzMxYTA1MzhlOGMwOWVjM2VhZDIwZQorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNDYwODAwLCBkZTA1NzhiNGExMTQyMzUyNTBiN2U5M2U5ZjliZjZkZQorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgNDYwODAwLCA3MmY1MDQ5MDY1MGI3MThlMzk0ODIyZjg4NzNhZDA3MQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgNDYwODAwLCBiMjY1OTQwNTFkMzEzODkyODIzZWVmNzExYTA4ZGMwMAorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNDYwODAwLCAxMTIyNjQxNjU4ZjZiNDMzZTgyMDgwZTA5MmZlNjk0MworMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgNDYwODAwLCBhYWU0ZGRjNTFiY2JkZjk0MjhmNjgwNjlmNTg4MTA5MAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgNDYwODAwLCAwMTgwNDdhZGRmN2ZkMmVmNGYxZDIzMWQ2OTE4N2JmNQorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNDYwODAwLCBiZDAzYWNlMjljOTc0YjY0ZTJhN2E0Y2M4MTVlYzU4MgorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgNDYwODAwLCA3ZmRkYWNiMTdmMDFkOGZhY2ZiMDlkZjQ0ZmY4YmRmZAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgNDYwODAwLCBlOGQ4NGQ2YjM0MDY0MDQ5MDBiODM0MjE4M2Y2YWRhNworMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNDYwODAwLCA1YjI0ZmFlZDRmZGQyMWJmOWExMjE4NjU4YTExMzAwOQorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgNDYwODAwLCA4ZDgyNzc1YzU2YjZiMGFiMzFkYjBjNTIyOTk5YjBhMQorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgNDYwODAwLCAyODJlNWUwMzI5NWM4MGIyYTdiNDcyYjgyYzU3NDgzZAorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgNDYwODAwLCAwYWQ0MWY1OTc1YzI0NjZmYzMxNjZlYTIwYmRlNjg0MgorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgNDYwODAwLCAxNDM5YWQzMzZjZWFmZGEwYWQ2MjM1NWE3ZDBiNmU1MAorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgNDYwODAwLCBkM2E5NzQ3MWFkNjRhYzIzNzg1OTFkNGY2ZWFkYmExYworMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgNDYwODAwLCBhNDBjMzJhMWU1ODliMTAzZjYzOWYyMDY4YjcxYmYwMgorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgNDYwODAwLCBhMzM5YjJiZWRjN2VmNDY5NjFmODUwMjA4OWFiZmI4NworMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgNDYwODAwLCAyY2NkZTQzYzk0MjU5NjgyZWE3MjE4OGIwODQ4OWU5MgorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgNDYwODAwLCBmYzQ3Y2NhMWYwMjlkNDRlYzkyZDk1ODUzZTljNDZiNAorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgNDYwODAwLCA2YzRkM2I2M2RjMWQ0MjkxZWM4OGE0YmI4YzM1YWVjZAorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgNDYwODAwLCA3YTliZTY3YWNhNDM5ZGQyYTdmZjE3NDQ3YjQ3ODk3NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LWVsc3QtZW5kcy1iZXRuLWItYW5kLWkgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtZWxzdC1lbmRzLWJldG4tYi1hbmQtaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmYzMjViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWVsc3QtZW5kcy1iZXRuLWItYW5kLWkKQEAgLTAsMCArMSwzMyBAQAorI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCisjdmVyc2lvbjogMgorI2hhc2g6IE1ENQorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCisjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgZTEwNzQxZTU0NTdlOTMyNmQ1ZTk5MmU2YzA1YzNlMzIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgN2UyMGY4NzI5YjZiNTNkYzExNzkxOTI3YmY0YTVhZWMKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgNGU1ZGMyYjgwNmUzOTRjZDY2NmM5NjhmNzM2ZmVjZDAKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDExNTIwMCwgN2EzYzc0NzNkNDRjNWY2MGMwNzY1NWY2ZmMwYzJhYzMKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgMDM4MjU0NDIyYTYwM2EzMjcwYzA5Y2RjZDE0OTcwN2IKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDExNTIwMCwgNzU1M2I2YjQ1NDdjYjIzZWY4ZjAzOTJlZDVhNWQ0YjAKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDExNTIwMCwgNmQwMTdlZGU3ZjQ0NjEyNGFmNzMwODY2N2NiMGRjNDEKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgNzc3NTJmMDI4OGFlNjRmODU3NzMyYjhlNjJlNDc0NTcKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDExNTIwMCwgZDY1NjgzMzk1MWFmOTkzMzA2MjVmN2M2ZGU3Njg1YzQKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDExNTIwMCwgMTQzMzhiODMzZTQzMWU1NjZhYzk4ZGE4NDE2MDBiZmUKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgMDdlYTk1ZDE2NTlmM2M0NDI0YTQ3MGE1NDZkMGRmNmUKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDExNTIwMCwgZmQwNWI4Y2M4MzA3MmY4MTNlODlkMzk0ZDFmNmVmYzYKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDExNTIwMCwgNzUwYjgyY2E1YzdlOTAxNTQ1ZTdiMWFhNjk2OTI0MjYKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDExNTIwMCwgNzM0NzY3OWFiMDliYzkzNjA0NzM2OGI4Y2FlYmNhZmYKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDExNTIwMCwgNjNhMjNmZGQ1N2FjODQ2MmI5ZmZiY2IxMmFiNzE3YjMKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDExNTIwMCwgNzA1MjU3YTFjOTk2OTNkYjIzM2UyYTNlZTAyN2FkY2YKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDExNTIwMCwgZGY4NjFhMmVjN2E0ZWY3MGU4MmIxYzI4MDI1ZTVhNDgKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDExNTIwMCwgMmE4YjQwM2MwNzdiNmI0M2FhNzFlYWY3ZDE1Mzc3MTMKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDExNTIwMCwgOTczYjVjZDNjZTQ3M2UzOTcwZGZhOTYwNDU1NTMxNzIKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDExNTIwMCwgZmM2MTJjMGFmZWFlM2I2NTc2YjVlZTJmM2YxMTk4MzIKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDExNTIwMCwgOTcwNzRmZTVhMGI2ZTdlODQ3MDcyOTY1NDA5MmU1NmMKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDExNTIwMCwgOGNmOTMzNzIwMTA2NTMzNWIzYWE0ZGEyMWRjOWIzN2EKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDExNTIwMCwgOTNmZjM1ODkyOTRjYzA2NzNhZjNkYWVlMWU3ZmU0MmEKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDExNTIwMCwgYzBiNmZkODcwYTAyMmYzNzRmOWQ2YzY5N2U4ZTI5M2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21vdi1mcmFnLW92ZXJsYXAgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtZnJhZy1vdmVybGFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NWE5M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtZnJhZy1vdmVybGFwCkBAIC0wLDAgKzEsMTA1IEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjdGIgMDogMTAwMS8yNDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDM2MAorI3NhciAwOiAxLzEKKyNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzQ1NjAwLCBiYjVlMWVjMzdlMWNiNWE0ZWYyMzk5YzdiMWMwZWQwOAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzQ1NjAwLCA0MDQ1NWZhOTRiMWYzYjFjZDE5OWYxMjc0MDFmZTE4NworMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzQ1NjAwLCA5MTQ3YjU5OTE1MjUwZGUzNTA4ZjA2MmI0NWRkYTQ5OQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMzQ1NjAwLCBiYjliOTEwOWVhNjE2MjJmNDkxYzFlMmFhMjFjNTAzZQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMzQ1NjAwLCBlYWNlZmY0ZDY5NDIxMmIyZWI2YWJmNWUwOTBkN2I0YworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMzQ1NjAwLCBlYWNlZmY0ZDY5NDIxMmIyZWI2YWJmNWUwOTBkN2I0YworMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMzQ1NjAwLCBmMDRjYTRmNjRlN2U5OTA4NzRjN2FjOTI2NGViYmU2NQorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMzQ1NjAwLCBmMTk1ZDExNWUwYWQ2ZDVjMjQwYjA4MjI2ZDMxMmNlZgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMzQ1NjAwLCA3NTg1ZjNmMzI1Y2M4MjAyODcwMWZjZDIzNjA2MTBlMAorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMzQ1NjAwLCA3NTg1ZjNmMzI1Y2M4MjAyODcwMWZjZDIzNjA2MTBlMAorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMzQ1NjAwLCA0ZTRhMmQyZDQ3ODgxYjIzOGM0ZjQyMzkxN2MyOTE4MgorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMzQ1NjAwLCA3MjYwOWI0NTliZGU1NjQ0ZmU1ODE1YmI4OGZhNTM3ZQorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMzQ1NjAwLCA2NzU2OWRmMTg1YTY0ZWMwODQ5OGQ3MWU5NGFiMDE5NworMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMzQ1NjAwLCAzNTJlMWQ0MWZkOGQ1ZmIwYTkyYjcyMjc4MjU5MTA2NgorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMzQ1NjAwLCBmNTBmOTZmMGZmMGVlNThlZjg1NzdjYjljZTIxOGJlNAorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMzQ1NjAwLCA5NjgxYzk5ODk5MmQyMDA1NTM4OGFlNmMwZDRmNDBlNgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMzQ1NjAwLCA0Y2Q5YzMwNTZjMGQxYjJkNmVkNjY2ZDJmYmFiZWY0NQorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMzQ1NjAwLCA4OGQwYzEzY2ZmNWFjYjE3NDZlN2JiMjI3ZTdlYzgxYQorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMzQ1NjAwLCAzN2ExNWEyZDFkMDU1YTljMTU3YTgyZDc3Y2Y0ODMyOAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMzQ1NjAwLCBmMzBlNDM4MThhNDEyNDJjYTc1Y2FlYzRiZTdmMzY2ZAorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMzQ1NjAwLCBlMDQ0MWNhNWU0MTM3OTEwZWQ5NGVhMmQ2N2Y1MDZhZAorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMzQ1NjAwLCA2MWNhZTMwY2RiNTUxMjYxMGJhMWZmYjdiMzcyYmU1MQorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMzQ1NjAwLCAyODgzMmU2ZWM5MTdmZWNlNTBhYjk0ZjhkNjg4M2Q0YgorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMzQ1NjAwLCAwN2NmZDYwYzUzYTRlZGUwZGU0ZjVlYmE3NDlhYmFlMAorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMzQ1NjAwLCAyNTRiMDcyZTJmZTcwMTc5MzM3MzhiOGQ0M2NkM2YyZQorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMzQ1NjAwLCBhYTJjZWVmODY2NTc2MDExNjUzZmM5ZTRhZGQ4Yzg1MgorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMzQ1NjAwLCBkNTUwN2U5OTI3NjNmNjllZjdkYTA2YmNhMmU1ZTBlNAorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMzQ1NjAwLCAzZDdmZDgzZmFiMTJkYzljYTFiYjVjMGQwOTEwNDE3NAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMzQ1NjAwLCAxZmRjMzRkMzBmOTRiZmEyYWNkNWFiNDc5MWIzYjZiZQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMzQ1NjAwLCBhOTkzYTM0ODI3OWY3MWRiMjBlNDhhODc5YzcxODA5NgorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgMzQ1NjAwLCBiOTk5YjZhNTFiM2JkZWI5OWRmODBhYTg4ZjJjNDNmZgorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMzQ1NjAwLCAyYzg1MWY0NDRhYWYxZGQ2ZjE0OWVlOGU2ZTFiZGZhNAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMzQ1NjAwLCBhNTAzMDFkNDhkMjgzZTk4ODFkMTQyY2Q4NzEyOGQ4NgorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgMzQ1NjAwLCAwZGRmZmE1NjBjNjMxMGEyYWQxY2I1MzQzMzY0NzJhYworMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMzQ1NjAwLCA1ZjU1NjVkYWViNzM3ZjM1NDNhNWQwN2ZmOTExNWQ0YQorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMzQ1NjAwLCA5MTY0MGY5ODg3ZDA3NDIyMWU0ZTA4ZjlhOTdhOTM4YgorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMzQ1NjAwLCBiYzAxZjEzZDVjNzNhOTI4OTVjYTJhZDEzMjA5NjI4YQorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMzQ1NjAwLCA5NzUwZjI4MjgxN2M2ZGYxNDM1NjVlMmY1N2Y5Zjg1ZgorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMzQ1NjAwLCBhMTgwM2EzY2UzNDJkMjViNDVmOTEzY2M4YjlmZTk2MQorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgMzQ1NjAwLCA0YTBhZTAwZDRlOWRmNTJjN2RmNWJmYjA4MjM2YWU5NgorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMzQ1NjAwLCA4MTliMTJmMmY3MzU2YjI5NmJmZmQzOWU4NWM5YjZiZQorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMzQ1NjAwLCA0MGE1YWY4OWJmZjRiMTBhMTBkMGE1MWFiNWVlYjRlMAorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMzQ1NjAwLCA0NTRhOWI3MWJlODhkM2MwMjZjYjcyMzk5ODhmM2UzNworMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMzQ1NjAwLCBjNjUzZTljOWQ2NGM5NDk1Yjc2NGIwYTZlYjNiZmJjOQorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMzQ1NjAwLCA2YTRmYWNiZjhlMTRmZjYxNzdmZDRiMGY2ZjY1OTE4MAorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgMzQ1NjAwLCA4NDNkNWI3NzA0MmUzNDdjM2QyMWQxMTNiYTI5OTNmYgorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMzQ1NjAwLCAyODQ3ODVlOTI0ZWZiYThhYjE3ZTZlMWY3NTMyOTI4NworMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMzQ1NjAwLCA0ZjJiMmQwZjNkYzRhZDE2NWUwYmM1NjU2MDkzMGQ0OQorMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgMzQ1NjAwLCA3MTE1NGUxN2MyZjVjMzE2MjcyZTg5MDRlZjYxYzBiYworMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMzQ1NjAwLCA2YjEwNTg4YmU0NTQwYjVkYmJkNzY1ZGI0MDZiODcyMworMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgMzQ1NjAwLCBhYWY2MmE5NWI2MjFjOGRlMmRjYTIyZjc4NTk0YjhjNworMCwgICAgICAgICA1MSwgICAgICAgICA1MSwgICAgICAgIDEsICAgMzQ1NjAwLCBiYjUwOGI2MzQ0MTYyODdiYWY0NDA2ZjcwY2EzNjkzZAorMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgMzQ1NjAwLCAwNTUxMTQ5ODQ2ZmNhMWFlMWQxNjRhN2E3YzY0NDM5ZgorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgMzQ1NjAwLCBjM2ZhZDEzYWMxNjQzNzQ0YzRlYTE5NDc2M2FlNmNmNworMCwgICAgICAgICA1NCwgICAgICAgICA1NCwgICAgICAgIDEsICAgMzQ1NjAwLCA0YzQ4N2FkZjNlYzIwNGMwNDFhNTBjYmY4MmFiZDhlOAorMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgMzQ1NjAwLCBkYzQ4NTM5MjI1ZjRkYzA1NTg4OTk1ZDQyODhjNzFkMAorMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgMzQ1NjAwLCBiZTAwNWM0ZjgxNDIyYTc3NWZjOTA5ZGNlZTg0MDk0ZAorMCwgICAgICAgICA1NywgICAgICAgICA1NywgICAgICAgIDEsICAgMzQ1NjAwLCBhMzc0YzJlZDBlNjQ0ZjAzY2JiOGNkNTQ1Njg3N2NiYgorMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgMzQ1NjAwLCA5YjdkNWZhYzU3N2NmMGQ4MmUxMTU1MWNkOWIyODBkYgorMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgMzQ1NjAwLCBjMWQwNTUxYmM1Y2QxZjUzMTMzZTMwZWQ4MTFkODAzMgorMCwgICAgICAgICA2MCwgICAgICAgICA2MCwgICAgICAgIDEsICAgMzQ1NjAwLCA2YWI1NjNjZjJkZjkyYTJlOWUxYjhiOTBjMGUwZWMwNworMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgMzQ1NjAwLCAxOWRhZGJlM2MzNjM4NTc4ZmU4YTNlZDNmNzMwODU4ZQorMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgMzQ1NjAwLCBlOTgxMGExMmY3YzE0YzRiODMwNWE0MThlNGJjMzA1NQorMCwgICAgICAgICA2MywgICAgICAgICA2MywgICAgICAgIDEsICAgMzQ1NjAwLCBkNDVkNzQ1MzVjZDQ3MTk0OTIzODcxNmJkYzEyYzE2ZgorMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgMzQ1NjAwLCBkMWMyYzE5ZDBhYmE0MTcwZmUxYTAzZjljMTBiNjg2MworMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgMzQ1NjAwLCAwNDdjN2ZiZmNjZTQxZmNhZWM2ZjFlMTY4NmRiMDQyOQorMCwgICAgICAgICA2NiwgICAgICAgICA2NiwgICAgICAgIDEsICAgMzQ1NjAwLCA0YWRjMWFhMTAxNzg4MGY2YmFmNDc4NmVjZDJjOGRkYgorMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgMzQ1NjAwLCA5MGJhZDgwZDllNmM3NTc4NDQyM2Y3NDk4NGU0MGRkMgorMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgMzQ1NjAwLCBmZWIzNzhkNzQwZTFlNWY5MzEyYmY2OGMwNDcwNDBjMworMCwgICAgICAgICA2OSwgICAgICAgICA2OSwgICAgICAgIDEsICAgMzQ1NjAwLCAyOGIxZGUxMjVmZDZmNmE5ZDQyZWI0MjMwMGJlN2EzZgorMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgMzQ1NjAwLCA0OTUwNDNlNjU1MTVjNzkwYzFmZTAyNmM5ZDJjMGE0OQorMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgMzQ1NjAwLCBmYTZkNTA2MjkzMmU3ZmMxMWZiZmUzMTM0OWVjYmJmZAorMCwgICAgICAgICA3MiwgICAgICAgICA3MiwgICAgICAgIDEsICAgMzQ1NjAwLCA4OTc5NTJkMzMyMjE4ZjJkYWI3ZDc2MGIyZDIwNzZlYgorMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgMzQ1NjAwLCA3OWRmY2U3YWMyOWI5NmVmMjNjN2Y2NDhlODdhM2UwYgorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgMzQ1NjAwLCA5NGQxMWE4NWRjMzJiNDY5MzA0OGEzOWE2MjI3OTE5YgorMCwgICAgICAgICA3NSwgICAgICAgICA3NSwgICAgICAgIDEsICAgMzQ1NjAwLCBmOWMxNDlkYmRjNzFjNjBmMTQ2Y2Y2OGE2NzMxMDJkNQorMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgMzQ1NjAwLCBmZWJkZGJiOTBiM2YzN2NiMjliMDcxMDI1NzVkODQ0ZgorMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgMzQ1NjAwLCBiOWU1Y2RmYTYzYzI2MzdmMjIwNGRjYjg4NTYwOGJiOQorMCwgICAgICAgICA3OCwgICAgICAgICA3OCwgICAgICAgIDEsICAgMzQ1NjAwLCAwNTE3NzNmNDBhMzc0OWI1NGM1YTgwMmY4YTk3MTI4ZgorMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgMzQ1NjAwLCA1ZmVkNTJhMjk4YjhlZWY5NGViZTIxYzAzMzEzYTVkNworMCwgICAgICAgICA4MCwgICAgICAgICA4MCwgICAgICAgIDEsICAgMzQ1NjAwLCBmOGE0NDdjZDczOGVjNTg3ZmJhY2RlMDYxZGI1MWJlNQorMCwgICAgICAgICA4MSwgICAgICAgICA4MSwgICAgICAgIDEsICAgMzQ1NjAwLCA0NzRjZmQwNTI5YzBhNWRhZmZkY2FlZDUxODNlZTU4MworMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgMzQ1NjAwLCBiMGRkMmRkZDcwMzdlNzBlNzc0YTdiM2JhYWQwYjA5NAorMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgMzQ1NjAwLCA4NjYyMjY5NjAxNzI4M2QzY2U5OGU3MWQxMGY4OWY3NQorMCwgICAgICAgICA4NCwgICAgICAgICA4NCwgICAgICAgIDEsICAgMzQ1NjAwLCAyMGQ2YWU4YjRkY2Y3NWFiMzFjYzFmMDAwMDIyOThjYQorMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgMzQ1NjAwLCBhODgyNTI4Y2QzODdmYjNhNTVkNmUxODRhMzNmZTJjOQorMCwgICAgICAgICA4NiwgICAgICAgICA4NiwgICAgICAgIDEsICAgMzQ1NjAwLCA2YmZjYjUzOWNlMTZmM2RiMGQ3ZjI0ZGFiNjE2NjkxMworMCwgICAgICAgICA4NywgICAgICAgICA4NywgICAgICAgIDEsICAgMzQ1NjAwLCA2YmZjYjUzOWNlMTZmM2RiMGQ3ZjI0ZGFiNjE2NjkxMworMCwgICAgICAgICA4OCwgICAgICAgICA4OCwgICAgICAgIDEsICAgMzQ1NjAwLCAzYmRlNTJlZTg1ODgzZTRmMzUzZDQ3MzZhNDdiMzg3NAorMCwgICAgICAgICA4OSwgICAgICAgICA4OSwgICAgICAgIDEsICAgMzQ1NjAwLCA2ZjIwODM1ZWIyOWY4MjRkNmEzZTFiZTBjZTc3MmYwOAorMCwgICAgICAgICA5MCwgICAgICAgICA5MCwgICAgICAgIDEsICAgMzQ1NjAwLCA3Yjk5YjE1YzFiOGZiZTBlNjQzYjc1ZmRhN2IxN2IwNAorMCwgICAgICAgICA5MSwgICAgICAgICA5MSwgICAgICAgIDEsICAgMzQ1NjAwLCBmMDEzOWNkMjhhMDAzMGQ2MTFkNjBlOWQyODgzN2FmMAorMCwgICAgICAgICA5MiwgICAgICAgICA5MiwgICAgICAgIDEsICAgMzQ1NjAwLCBmMDEzOWNkMjhhMDAzMGQ2MTFkNjBlOWQyODgzN2FmMAorMCwgICAgICAgICA5MywgICAgICAgICA5MywgICAgICAgIDEsICAgMzQ1NjAwLCBhZGYwYTM3YWQyM2MzOGI1NGM3Mzk0ODcxYzg3NjQ2OAorMCwgICAgICAgICA5NCwgICAgICAgICA5NCwgICAgICAgIDEsICAgMzQ1NjAwLCBmMGJkMzdiY2I4Mjk5ZTkwZWZkMDVhMGUwMWM4NDAyOQorMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgMzQ1NjAwLCA4YTlkNzZiYzYxMTczMWVhYmMyOWJiZjIzMWUyMTUyOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LWd1ZXNzLWRlbGF5LTEgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtZ3Vlc3MtZGVsYXktMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmNiNjdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWd1ZXNzLWRlbGF5LTEKQEAgLTAsMCArMSwzIEBACitbU1RSRUFNXQoraGFzX2JfZnJhbWVzPTEKK1svU1RSRUFNXQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LWd1ZXNzLWRlbGF5LTIgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtZ3Vlc3MtZGVsYXktMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhkZTFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWd1ZXNzLWRlbGF5LTIKQEAgLTAsMCArMSwzIEBACitbU1RSRUFNXQoraGFzX2JfZnJhbWVzPTIKK1svU1RSRUFNXQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LWd1ZXNzLWRlbGF5LTMgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtZ3Vlc3MtZGVsYXktMwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhkZTFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWd1ZXNzLWRlbGF5LTMKQEAgLTAsMCArMSwzIEBACitbU1RSRUFNXQoraGFzX2JfZnJhbWVzPTIKK1svU1RSRUFNXQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LWliaS1lbHN0LXN0YXJ0cy1iIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWliaS1lbHN0LXN0YXJ0cy1iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYjljMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtaWJpLWVsc3Qtc3RhcnRzLWIKQEAgLTAsMCArMSwzMyBAQAorI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCisjdmVyc2lvbjogMgorI2hhc2g6IE1ENQorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCisjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgN2UyMGY4NzI5YjZiNTNkYzExNzkxOTI3YmY0YTVhZWMKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgNGU1ZGMyYjgwNmUzOTRjZDY2NmM5NjhmNzM2ZmVjZDAKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgN2EzYzc0NzNkNDRjNWY2MGMwNzY1NWY2ZmMwYzJhYzMKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDExNTIwMCwgMDM4MjU0NDIyYTYwM2EzMjcwYzA5Y2RjZDE0OTcwN2IKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgNzU1M2I2YjQ1NDdjYjIzZWY4ZjAzOTJlZDVhNWQ0YjAKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDExNTIwMCwgNmQwMTdlZGU3ZjQ0NjEyNGFmNzMwODY2N2NiMGRjNDEKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDExNTIwMCwgNzc3NTJmMDI4OGFlNjRmODU3NzMyYjhlNjJlNDc0NTcKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgZDY1NjgzMzk1MWFmOTkzMzA2MjVmN2M2ZGU3Njg1YzQKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDExNTIwMCwgMTQzMzhiODMzZTQzMWU1NjZhYzk4ZGE4NDE2MDBiZmUKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDExNTIwMCwgMDdlYTk1ZDE2NTlmM2M0NDI0YTQ3MGE1NDZkMGRmNmUKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgZmQwNWI4Y2M4MzA3MmY4MTNlODlkMzk0ZDFmNmVmYzYKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDExNTIwMCwgNzUwYjgyY2E1YzdlOTAxNTQ1ZTdiMWFhNjk2OTI0MjYKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDExNTIwMCwgNzM0NzY3OWFiMDliYzkzNjA0NzM2OGI4Y2FlYmNhZmYKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDExNTIwMCwgNjNhMjNmZGQ1N2FjODQ2MmI5ZmZiY2IxMmFiNzE3YjMKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDExNTIwMCwgNzA1MjU3YTFjOTk2OTNkYjIzM2UyYTNlZTAyN2FkY2YKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDExNTIwMCwgZGY4NjFhMmVjN2E0ZWY3MGU4MmIxYzI4MDI1ZTVhNDgKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDExNTIwMCwgMmE4YjQwM2MwNzdiNmI0M2FhNzFlYWY3ZDE1Mzc3MTMKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDExNTIwMCwgOTczYjVjZDNjZTQ3M2UzOTcwZGZhOTYwNDU1NTMxNzIKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDExNTIwMCwgZmM2MTJjMGFmZWFlM2I2NTc2YjVlZTJmM2YxMTk4MzIKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDExNTIwMCwgOTcwNzRmZTVhMGI2ZTdlODQ3MDcyOTY1NDA5MmU1NmMKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDExNTIwMCwgOGNmOTMzNzIwMTA2NTMzNWIzYWE0ZGEyMWRjOWIzN2EKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDExNTIwMCwgOTNmZjM1ODkyOTRjYzA2NzNhZjNkYWVlMWU3ZmU0MmEKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDExNTIwMCwgYzBiNmZkODcwYTAyMmYzNzRmOWQ2YzY5N2U4ZTI5M2QKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDExNTIwMCwgYmM0NjM4ZmY3MDM2YjMyM2MzOWE5NDhhNjQwNzY5NWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21vdi1pbml0LW5vbmtleWZyYW1lIGIvdGVzdHMvcmVmL2ZhdGUvbW92LWluaXQtbm9ua2V5ZnJhbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4MTg0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21vdi1pbml0LW5vbmtleWZyYW1lCkBAIC0wLDAgKzEsMTIwIEBACitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MHxwdHNfdGltZT0wLjAwMDAwMHxkdHM9MHxkdHNfdGltZT0wLjAwMDAwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NTk5fHBvcz00OHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTIwMDJ8cHRzX3RpbWU9MC4wNjY3MzN8ZHRzPTEwMDF8ZHRzX3RpbWU9MC4wMzMzNjd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI5NDR8cG9zPTE2NzR8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz03MDA3fHB0c190aW1lPTAuMjMzNTY3fGR0cz0yMDAyfGR0c190aW1lPTAuMDY2NzMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTk4N3xwb3M9NTMzNXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTUwMDV8cHRzX3RpbWU9MC4xNjY4MzN8ZHRzPTMwMDN8ZHRzX3RpbWU9MC4xMDAxMDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQxNDV8cG9zPTI4NjA1fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NDAwNHxwdHNfdGltZT0wLjEzMzQ2N3xkdHM9NDAwNHxkdHNfdGltZT0wLjEzMzQ2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzA5M3xwb3M9MzM0MjV8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz02MDA2fHB0c190aW1lPTAuMjAwMjAwfGR0cz01MDA1fGR0c190aW1lPTAuMTY2ODMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT01NzJ8cG9zPTM3NzY5fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTEwMTF8cHRzX3RpbWU9MC4zNjcwMzN8ZHRzPTYwMDZ8ZHRzX3RpbWU9MC4yMDAyMDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxNTk5fHBvcz0zODk5OXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTkwMDl8cHRzX3RpbWU9MC4zMDAzMDB8ZHRzPTcwMDd8ZHRzX3RpbWU9MC4yMzM1Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTYyODd8cG9zPTYxOTIyfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9ODAwOHxwdHNfdGltZT0wLjI2NjkzM3xkdHM9ODAwOHxkdHNfdGltZT0wLjI2NjkzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjcyMHxwb3M9Njg5MDl8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDAxMHxwdHNfdGltZT0wLjMzMzY2N3xkdHM9OTAwOXxkdHNfdGltZT0wLjMwMDMwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjcxNXxwb3M9NzIzMDF8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNTAxNXxwdHNfdGltZT0wLjUwMDUwMHxkdHM9MTAwMTB8ZHRzX3RpbWU9MC4zMzM2Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwMjIxfHBvcz03NjQzM3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTEzMDEzfHB0c190aW1lPTAuNDMzNzY3fGR0cz0xMTAxMXxkdHNfdGltZT0wLjM2NzAzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9OTUwNXxwb3M9OTczODF8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMjAxMnxwdHNfdGltZT0wLjQwMDQwMHxkdHM9MTIwMTJ8ZHRzX3RpbWU9MC40MDA0MDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTUyMnxwb3M9MTA4MzkxfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTQwMTR8cHRzX3RpbWU9MC40NjcxMzN8ZHRzPTEzMDEzfGR0c190aW1lPTAuNDMzNzY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMzYwfHBvcz0xMDk2ODN8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNzAxN3xwdHNfdGltZT0wLjU2NzIzM3xkdHM9MTQwMTR8ZHRzX3RpbWU9MC40NjcxMzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIyMTU2fHBvcz0xMTM1NzJ8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNjAxNnxwdHNfdGltZT0wLjUzMzg2N3xkdHM9MTUwMTV8ZHRzX3RpbWU9MC41MDA1MDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE4MDF8cG9zPTEzNjQ5NnxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTIxMDIxfHB0c190aW1lPTAuNzAwNzAwfGR0cz0xNjAxNnxkdHNfdGltZT0wLjUzMzg2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjAxODF8cG9zPTEzOTA3NHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE5MDE5fHB0c190aW1lPTAuNjMzOTY3fGR0cz0xNzAxN3xkdHNfdGltZT0wLjU2NzIzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzYwOHxwb3M9MTYwOTU5fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTgwMTh8cHRzX3RpbWU9MC42MDA2MDB8ZHRzPTE4MDE4fGR0c190aW1lPTAuNjAwNjAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zNjh8cG9zPTE2NTMwNXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTIwMDIwfHB0c190aW1lPTAuNjY3MzMzfGR0cz0xOTAxOXxkdHNfdGltZT0wLjYzMzk2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9Mjk4OXxwb3M9MTY3MDU0fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MjUwMjV8cHRzX3RpbWU9MC44MzQxNjd8ZHRzPTIwMDIwfGR0c190aW1lPTAuNjY3MzMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNDQ3NXxwb3M9MTcwODAxfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MjMwMjN8cHRzX3RpbWU9MC43Njc0MzN8ZHRzPTIxMDIxfGR0c190aW1lPTAuNzAwNzAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMDY4Mnxwb3M9MTk2NzMyfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MjIwMjJ8cHRzX3RpbWU9MC43MzQwNjd8ZHRzPTIyMDIyfGR0c190aW1lPTAuNzM0MDY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zMTk4fHBvcz0yMDgxNTF8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0yNDAyNHxwdHNfdGltZT0wLjgwMDgwMHxkdHM9MjMwMjN8ZHRzX3RpbWU9MC43Njc0MzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQ3OXxwb3M9MjEyOTU4fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MjkwMjl8cHRzX3RpbWU9MC45Njc2MzN8ZHRzPTI0MDI0fGR0c190aW1lPTAuODAwODAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTI0MHxwb3M9MjE0Mzg0fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MjcwMjd8cHRzX3RpbWU9MC45MDA5MDB8ZHRzPTI1MDI1fGR0c190aW1lPTAuODM0MTY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00NDA5fHBvcz0yMzY5NDZ8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0yNjAyNnxwdHNfdGltZT0wLjg2NzUzM3xkdHM9MjYwMjZ8ZHRzX3RpbWU9MC44Njc1MzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTMxMDZ8cG9zPTI0MjY0N3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTI4MDI4fHB0c190aW1lPTAuOTM0MjY3fGR0cz0yNzAyN3xkdHNfdGltZT0wLjkwMDkwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NDUzfHBvcz0yNDY0Mjh8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0zMzAzM3xwdHNfdGltZT0xLjEwMTEwMHxkdHM9MjgwMjh8ZHRzX3RpbWU9MC45MzQyNjd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIwNjY4fHBvcz0yNDgzMDh8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0zMTAzMXxwdHNfdGltZT0xLjAzNDM2N3xkdHM9MjkwMjl8ZHRzX3RpbWU9MC45Njc2MzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTY2Njh8cG9zPTI2OTcwOHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTMwMDMwfHB0c190aW1lPTEuMDAxMDAwfGR0cz0zMDAzMHxkdHNfdGltZT0xLjAwMTAwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzAyN3xwb3M9Mjc3Nzg5fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MzIwMzJ8cHRzX3RpbWU9MS4wNjc3MzN8ZHRzPTMxMDMxfGR0c190aW1lPTEuMDM0MzY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yODg0fHBvcz0yODE2MTN8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0zNzAzN3xwdHNfdGltZT0xLjIzNDU2N3xkdHM9MzIwMzJ8ZHRzX3RpbWU9MS4wNjc3MzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIxMzEzfHBvcz0yODUyNjF8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0zNTAzNXxwdHNfdGltZT0xLjE2NzgzM3xkdHM9MzMwMzN8ZHRzX3RpbWU9MS4xMDExMDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTk4OTB8cG9zPTMwODMwM3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTM0MDM0fHB0c190aW1lPTEuMTM0NDY3fGR0cz0zNDAzNHxkdHNfdGltZT0xLjEzNDQ2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NTAxfHBvcz0zMTg5MTl8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0zNjAzNnxwdHNfdGltZT0xLjIwMTIwMHxkdHM9MzUwMzV8ZHRzX3RpbWU9MS4xNjc4MzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTMxMjN8cG9zPTMyMDgyNHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTM5MDM5fHB0c190aW1lPTEuMzAxMzAwfGR0cz0zNjAzNnxkdHNfdGltZT0xLjIwMTIwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjE3Njh8cG9zPTMyNDY2NHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTM4MDM4fHB0c190aW1lPTEuMjY3OTMzfGR0cz0zNzAzN3xkdHNfdGltZT0xLjIzNDU2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjY2NHxwb3M9MzQ3OTIyfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NDMwNDN8cHRzX3RpbWU9MS40MzQ3Njd8ZHRzPTM4MDM4fGR0c190aW1lPTEuMjY3OTMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTE0NHxwb3M9MzUxMzU0fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NDEwNDF8cHRzX3RpbWU9MS4zNjgwMzN8ZHRzPTM5MDM5fGR0c190aW1lPTEuMzAxMzAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MTE4fHBvcz0zNzE5OTF8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz00MDA0MHxwdHNfdGltZT0xLjMzNDY2N3xkdHM9NDAwNDB8ZHRzX3RpbWU9MS4zMzQ2Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQyM3xwb3M9Mzc2ODk5fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NDIwNDJ8cHRzX3RpbWU9MS40MDE0MDB8ZHRzPTQxMDQxfGR0c190aW1lPTEuMzY4MDMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNzg1fHBvcz0zNzgwMzd8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz00NTA0NXxwdHNfdGltZT0xLjUwMTUwMHxkdHM9NDIwNDJ8ZHRzX3RpbWU9MS40MDE0MDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI0NDg5fHBvcz0zODIxNDR8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz00NDA0NHxwdHNfdGltZT0xLjQ2ODEzM3xkdHM9NDMwNDN8ZHRzX3RpbWU9MS40MzQ3Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI5ODR8cG9zPTQwNzM0NHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTQ5MDQ5fHB0c190aW1lPTEuNjM0OTY3fGR0cz00NDA0NHxkdHNfdGltZT0xLjQ2ODEzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkxNzR8cG9zPTQxMTc5MXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTQ3MDQ3fHB0c190aW1lPTEuNTY4MjMzfGR0cz00NTA0NXxkdHNfdGltZT0xLjUwMTUwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NDkwNXxwb3M9NDMxNzQwfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NDYwNDZ8cHRzX3RpbWU9MS41MzQ4Njd8ZHRzPTQ2MDQ2fGR0c190aW1lPTEuNTM0ODY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MTJ8cG9zPTQzODE4M3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTQ4MDQ4fHB0c190aW1lPTEuNjAxNjAwfGR0cz00NzA0N3xkdHNfdGltZT0xLjU2ODIzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzIxNXxwb3M9NDM5MzczfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NTEwNTF8cHRzX3RpbWU9MS43MDE3MDB8ZHRzPTQ4MDQ4fGR0c190aW1lPTEuNjAxNjAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTU3Mnxwb3M9NDQzMzcxfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NTAwNTB8cHRzX3RpbWU9MS42NjgzMzN8ZHRzPTQ5MDQ5fGR0c190aW1lPTEuNjM0OTY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNjQ0fHBvcz00NjY0ODZ8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz01NTA1NXxwdHNfdGltZT0xLjgzNTE2N3xkdHM9NTAwNTB8ZHRzX3RpbWU9MS42NjgzMzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5NDE3fHBvcz00NzA0NjJ8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz01MzA1M3xwdHNfdGltZT0xLjc2ODQzM3xkdHM9NTEwNTF8ZHRzX3RpbWU9MS43MDE3MDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTM2ODV8cG9zPTQ5MTMzNXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTUyMDUyfHB0c190aW1lPTEuNzM1MDY3fGR0cz01MjA1MnxkdHNfdGltZT0xLjczNTA2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzU1fHBvcz00OTU3NzF8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz01NDA1NHxwdHNfdGltZT0xLjgwMTgwMHxkdHM9NTMwNTN8ZHRzX3RpbWU9MS43Njg0MzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTMwMjF8cG9zPTQ5NzcxNHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTU5MDU5fHB0c190aW1lPTEuOTY4NjMzfGR0cz01NDA1NHxkdHNfdGltZT0xLjgwMTgwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjE0NjR8cG9zPTUwMTQzMXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTU3MDU3fHB0c190aW1lPTEuOTAxOTAwfGR0cz01NTA1NXxkdHNfdGltZT0xLjgzNTE2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9OTM0MHxwb3M9NTI0MzkyfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NTYwNTZ8cHRzX3RpbWU9MS44Njg1MzN8ZHRzPTU2MDU2fGR0c190aW1lPTEuODY4NTMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MDZ8cG9zPTUzNDUwNHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTU4MDU4fHB0c190aW1lPTEuOTM1MjY3fGR0cz01NzA1N3xkdHNfdGltZT0xLjkwMTkwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzI3N3xwb3M9NTM1Njk0fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NjMwNjN8cHRzX3RpbWU9Mi4xMDIxMDB8ZHRzPTU4MDU4fGR0c190aW1lPTEuOTM1MjY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMTM4OHxwb3M9NTQxMDkwfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NjEwNjF8cHRzX3RpbWU9Mi4wMzUzNjd8ZHRzPTU5MDU5fGR0c190aW1lPTEuOTY4NjMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00NDY2fHBvcz01NjMxMzJ8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz02MDA2MHxwdHNfdGltZT0yLjAwMjAwMHxkdHM9NjAwNjB8ZHRzX3RpbWU9Mi4wMDIwMDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTM0Njd8cG9zPTU2OTI0NXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTYyMDYyfHB0c190aW1lPTIuMDY4NzMzfGR0cz02MTA2MXxkdHNfdGltZT0yLjAzNTM2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NDk5fHBvcz01NzM0Nzh8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz02NzA2N3xwdHNfdGltZT0yLjIzNTU2N3xkdHM9NjIwNjJ8ZHRzX3RpbWU9Mi4wNjg3MzN8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI1OTcyfHBvcz01NzU0Njl8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz02NTA2NXxwdHNfdGltZT0yLjE2ODgzM3xkdHM9NjMwNjN8ZHRzX3RpbWU9Mi4xMDIxMDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTY2NDN8cG9zPTYwMjE2M3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTY0MDY0fHB0c190aW1lPTIuMTM1NDY3fGR0cz02NDA2NHxkdHNfdGltZT0yLjEzNTQ2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzA2OXxwb3M9NjA5NTU4fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NjYwNjZ8cHRzX3RpbWU9Mi4yMDIyMDB8ZHRzPTY1MDY1fGR0c190aW1lPTIuMTY4ODMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zMDQ5fHBvcz02MTQxMzN8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz02ODA2OHxwdHNfdGltZT0yLjI2ODkzM3xkdHM9NjYwNjZ8ZHRzX3RpbWU9Mi4yMDIyMDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQ1NTl8cG9zPTYxODU1MXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTcyMDcyfHB0c190aW1lPTIuNDAyNDAwfGR0cz02NzA2N3xkdHNfdGltZT0yLjIzNTU2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjEyNTF8cG9zPTYyNDYyMXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTcwMDcwfHB0c190aW1lPTIuMzM1NjY3fGR0cz02ODA2OHxkdHNfdGltZT0yLjI2ODkzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NzEwOHxwb3M9NjQ2NjU3fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NjkwNjl8cHRzX3RpbWU9Mi4zMDIzMDB8ZHRzPTY5MDY5fGR0c190aW1lPTIuMzAyMzAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zMjUwfHBvcz02NTUyOTl8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz03MTA3MXxwdHNfdGltZT0yLjM2OTAzM3xkdHM9NzAwNzB8ZHRzX3RpbWU9Mi4zMzU2Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTMzNjV8cG9zPTY1OTMxMHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTczMDczfHB0c190aW1lPTIuNDM1NzY3fGR0cz03MTA3MXxkdHNfdGltZT0yLjM2OTAzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjQ4MDN8cG9zPTY2NDIwMXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTc3MDc3fHB0c190aW1lPTIuNTY5MjMzfGR0cz03MjA3MnxkdHNfdGltZT0yLjQwMjQwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjIxODV8cG9zPTY4OTc2M3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTc1MDc1fHB0c190aW1lPTIuNTAyNTAwfGR0cz03MzA3M3xkdHNfdGltZT0yLjQzNTc2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NTA4OHxwb3M9NzEyNjc5fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NzQwNzR8cHRzX3RpbWU9Mi40NjkxMzN8ZHRzPTc0MDc0fGR0c190aW1lPTIuNDY5MTMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT01Mzd8cG9zPTcxOTEyOHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTc2MDc2fHB0c190aW1lPTIuNTM1ODY3fGR0cz03NTA3NXxkdHNfdGltZT0yLjUwMjUwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9Mzc2NXxwb3M9NzIwNDEzfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9ODEwODF8cHRzX3RpbWU9Mi43MDI3MDB8ZHRzPTc2MDc2fGR0c190aW1lPTIuNTM1ODY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDY1NHxwb3M9NzI1NTgzfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NzkwNzl8cHRzX3RpbWU9Mi42MzU5Njd8ZHRzPTc3MDc3fGR0c190aW1lPTIuNTY5MjMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMDIwMnxwb3M9NzQ2OTk5fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NzgwNzh8cHRzX3RpbWU9Mi42MDI2MDB8ZHRzPTc4MDc4fGR0c190aW1lPTIuNjAyNjAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zOTcwfHBvcz03NTg3MDV8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz04MDA4MHxwdHNfdGltZT0yLjY2OTMzM3xkdHM9NzkwNzl8ZHRzX3RpbWU9Mi42MzU5Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQyMXxwb3M9NzYzNDQyfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9ODQwODR8cHRzX3RpbWU9Mi44MDI4MDB8ZHRzPTgwMDgwfGR0c190aW1lPTIuNjY5MzMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNTY4NXxwb3M9NzY0NjUzfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9ODIwODJ8cHRzX3RpbWU9Mi43MzYwNjd8ZHRzPTgxMDgxfGR0c190aW1lPTIuNzAyNzAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MDc3fHBvcz03OTE5MTF8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz04MzA4M3xwdHNfdGltZT0yLjc2OTQzM3xkdHM9ODIwODJ8ZHRzX3RpbWU9Mi43MzYwNjd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTMwNDl8cG9zPTc5Njc4MHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTg4MDg4fHB0c190aW1lPTIuOTM2MjY3fGR0cz04MzA4M3xkdHNfdGltZT0yLjc2OTQzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9ODkyNHxwb3M9ODAxNDczfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9ODYwODZ8cHRzX3RpbWU9Mi44Njk1MzN8ZHRzPTg0MDg0fGR0c190aW1lPTIuODAyODAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNTEyfHBvcz04MTEwNzh8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz04NTA4NXxwdHNfdGltZT0yLjgzNjE2N3xkdHM9ODUwODV8ZHRzX3RpbWU9Mi44MzYxNjd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE2M3xwb3M9ODE1MDMzfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9ODcwODd8cHRzX3RpbWU9Mi45MDI5MDB8ZHRzPTg2MDg2fGR0c190aW1lPTIuODY5NTMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzM0fHBvcz04MTU5MzR8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz05MDA5MHxwdHNfdGltZT0zLjAwMzAwMHxkdHM9ODcwODd8ZHRzX3RpbWU9Mi45MDI5MDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTExNTA1fHBvcz04MTkwODh8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz04OTA4OXxwdHNfdGltZT0yLjk2OTYzM3xkdHM9ODgwODh8ZHRzX3RpbWU9Mi45MzYyNjd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE0MzF8cG9zPTgzMTM2N3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTkyMDkyfHB0c190aW1lPTMuMDY5NzMzfGR0cz04OTA4OXxkdHNfdGltZT0yLjk2OTYzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NTI2OXxwb3M9ODMzNTgwfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9OTEwOTF8cHRzX3RpbWU9My4wMzYzNjd8ZHRzPTkwMDkwfGR0c190aW1lPTMuMDAzMDAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTl8cG9zPTg0MDM1MnxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTkzMDkzfHB0c190aW1lPTMuMTAzMTAwfGR0cz05MTA5MXxkdHNfdGltZT0zLjAzNjM2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9ODU2NTB8cG9zPTg0MTcyMnxmbGFncz1LXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTk1MDk1fHB0c190aW1lPTMuMTY5ODMzfGR0cz05MjA5MnxkdHNfdGltZT0zLjA2OTczM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTMyNjF8cG9zPTkyODc0N3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTk0MDk0fHB0c190aW1lPTMuMTM2NDY3fGR0cz05MzA5M3xkdHNfdGltZT0zLjEwMzEwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTY2N3xwb3M9OTQyNzQxfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9OTkwOTl8cHRzX3RpbWU9My4zMDMzMDB8ZHRzPTk0MDk0fGR0c190aW1lPTMuMTM2NDY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDE0M3xwb3M9OTQ1ODQxfGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9OTcwOTd8cHRzX3RpbWU9My4yMzY1Njd8ZHRzPTk1MDk1fGR0c190aW1lPTMuMTY5ODMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNDg0fHBvcz05NjY2ODF8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz05NjA5NnxwdHNfdGltZT0zLjIwMzIwMHxkdHM9OTYwOTZ8ZHRzX3RpbWU9My4yMDMyMDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI3OHxwb3M9OTY5ODg3fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9OTgwOTh8cHRzX3RpbWU9My4yNjk5MzN8ZHRzPTk3MDk3fGR0c190aW1lPTMuMjM2NTY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNTM5fHBvcz05NzE2OTZ8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDExMDF8cHRzX3RpbWU9My4zNzAwMzN8ZHRzPTk4MDk4fGR0c190aW1lPTMuMjY5OTMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMDI3MHxwb3M9OTc0MDg4fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTAwMTAwfHB0c190aW1lPTMuMzM2NjY3fGR0cz05OTA5OXxkdHNfdGltZT0zLjMwMzMwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTc1NHxwb3M9OTk1OTc1fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTA1MTA1fHB0c190aW1lPTMuNTAzNTAwfGR0cz0xMDAxMDB8ZHRzX3RpbWU9My4zMzY2Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5MTU0fHBvcz05OTg0MjB8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDMxMDN8cHRzX3RpbWU9My40MzY3Njd8ZHRzPTEwMTEwMXxkdHNfdGltZT0zLjM3MDAzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzM1OXxwb3M9MTAxOTAxMHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTEwMjEwMnxwdHNfdGltZT0zLjQwMzQwMHxkdHM9MTAyMTAyfGR0c190aW1lPTMuNDAzNDAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yODd8cG9zPTEwMjMxMzh8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDQxMDR8cHRzX3RpbWU9My40NzAxMzN8ZHRzPTEwMzEwM3xkdHNfdGltZT0zLjQzNjc2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjExMXxwb3M9MTAyNDkyOHxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTEwOTEwOXxwdHNfdGltZT0zLjYzNjk2N3xkdHM9MTA0MTA0fGR0c190aW1lPTMuNDcwMTMzfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzE3OHxwb3M9MTAyNzgzM3xmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTEwNzEwN3xwdHNfdGltZT0zLjU3MDIzM3xkdHM9MTA1MTA1fGR0c190aW1lPTMuNTAzNTAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT03MjA1fHBvcz0xMDQ1NzE2fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTA2MTA2fHB0c190aW1lPTMuNTM2ODY3fGR0cz0xMDYxMDZ8ZHRzX3RpbWU9My41MzY4Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTIyMDl8cG9zPTEwNTQzNTR8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMDgxMDh8cHRzX3RpbWU9My42MDM2MDB8ZHRzPTEwNzEwN3xkdHNfdGltZT0zLjU3MDIzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MzU5fHBvcz0xMDU3MjI2fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTEzMTEzfHB0c190aW1lPTMuNzcwNDMzfGR0cz0xMDgxMDh8ZHRzX3RpbWU9My42MDM2MDB8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE4NDY5fHBvcz0xMDU5MDI0fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTExMTExfHB0c190aW1lPTMuNzAzNzAwfGR0cz0xMDkxMDl8ZHRzX3RpbWU9My42MzY5Njd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTMzMTR8cG9zPTEwNzgyMTN8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMTAxMTB8cHRzX3RpbWU9My42NzAzMzN8ZHRzPTExMDExMHxkdHNfdGltZT0zLjY3MDMzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjU1Nnxwb3M9MTA4MzA1OXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTExMjExMnxwdHNfdGltZT0zLjczNzA2N3xkdHM9MTExMTExfGR0c190aW1lPTMuNzAzNzAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00Mzd8cG9zPTEwODYzODh8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMTcxMTd8cHRzX3RpbWU9My45MDM5MDB8ZHRzPTExMjExMnxkdHNfdGltZT0zLjczNzA2N3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTk3MDd8cG9zPTEwODc2MTB8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMTUxMTV8cHRzX3RpbWU9My44MzcxNjd8ZHRzPTExMzExM3xkdHNfdGltZT0zLjc3MDQzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NTkxN3xwb3M9MTEwODg0NXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTExNDExNHxwdHNfdGltZT0zLjgwMzgwMHxkdHM9MTE0MTE0fGR0c190aW1lPTMuODAzODAwfGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yNjEzfHBvcz0xMTE1NDk1fGZsYWdzPV9fCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTE2MTE2fHB0c190aW1lPTMuODcwNTMzfGR0cz0xMTUxMTV8ZHRzX3RpbWU9My44MzcxNjd8ZHVyYXRpb249MTAwMXxkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI2NzJ8cG9zPTExMTk1MzB8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMjExMjF8cHRzX3RpbWU9NC4wMzczNjd8ZHRzPTExNjExNnxkdHNfdGltZT0zLjg3MDUzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkwOTF8cG9zPTExMjI5NzB8ZmxhZ3M9X0QKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMTkxMTl8cHRzX3RpbWU9My45NzA2MzN8ZHRzPTExNzExN3xkdHNfdGltZT0zLjkwMzkwMHxkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9OTI0NHxwb3M9MTE0MzU4NXxmbGFncz1fXworcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTExODExOHxwdHNfdGltZT0zLjkzNzI2N3xkdHM9MTE4MTE4fGR0c190aW1lPTMuOTM3MjY3fGR1cmF0aW9uPTEwMDF8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yODR8cG9zPTExNTM1ODd8ZmxhZ3M9X18KK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xMjAxMjB8cHRzX3RpbWU9NC4wMDQwMDB8ZHRzPTExOTExOXxkdHNfdGltZT0zLjk3MDYzM3xkdXJhdGlvbj0xMDAxfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjM4MXxwb3M9MTE1NTM5M3xmbGFncz1fRApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LWludmFsaWQtZWxzdC1lbnRyeS1jb3VudCBiL3Rlc3RzL3JlZi9mYXRlL21vdi1pbnZhbGlkLWVsc3QtZW50cnktY291bnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZTAyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21vdi1pbnZhbGlkLWVsc3QtZW50cnktY291bnQKQEAgLTAsMCArMSw1NyBAQAorI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCisjdmVyc2lvbjogMgorI2hhc2g6IE1ENQorI3RiIDA6IDEvMjQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMS8xCisjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgNTQ5NzMwODgzYTBiNTZlNmFjY2FmMDIxOTAzZGFlY2YKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQ2MDgwMCwgZDVmYzg0NGQ1MTJhMWRlY2IwODE0Yjg2OTI5MTRkNjAKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDQ2MDgwMCwgNjk3NTMxODU5MTFmOTlhYTM4YmQ5ZDllZTBmZjI0ZjcKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDQ2MDgwMCwgMmE5ODUxNzhjOGIyNGU5NzcwOGM2ZDMzMTQyZjE4YTkKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDQ2MDgwMCwgYTIzODE4ZTQzYmRmNGVlNzcyOTFlMGY3NDA1MWQwYmYKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDQ2MDgwMCwgZjJjOTI3YjExMzUwYjk4MjIwNjViZWM1ZjA2YjY1ZDkKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDQ2MDgwMCwgMGM1NTNmYjUzMGNmMDQyZWI4NGY1YjEzODE3YTk2YTYKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDQ2MDgwMCwgYTJiZTQyOWI1NzBjZTMwYTc0NzFiOTAxZjJlYTViY2MKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDQ2MDgwMCwgYjRmNGEzYjE5ODg0MDRiMzVjNTc2ODg3NTViZWI4YjkKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDQ2MDgwMCwgMjc3OGI5MzFkNWUxNTcwZTFiODA5YTg3YjFjNDU0OTEKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDQ2MDgwMCwgNGViMzQxZWJmMzIwMDZkOGJjZTEzZjFkMTMyZDg0YjIKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDQ2MDgwMCwgYzM5YTM0Mjg3MzAwZWU1MjU0Nzc1MjE5OGEyMjIyZmMKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDQ2MDgwMCwgZjNlYzU5ZTZmYzRlM2MyZTc1ZjQyYmVmMzRjYTczYjUKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDQ2MDgwMCwgM2YwZTYxMTZhOTRmZWZlODkwYjc5ZDFlOTRjMTU2YzYKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDQ2MDgwMCwgMGE4YTU5N2MwODA2ODE4MTEyYmY4MzUxZjUzZDM1MGEKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDQ2MDgwMCwgYWI1YzEwMDIzNzEyZWEyMWQ1OTVmNWY4NTZmNTNjNjYKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDQ2MDgwMCwgZDRlMjE4MDUxZWYzMmU2OGUzZGY1OGM4YzNkNmExYWIKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDQ2MDgwMCwgMjQwODJmYTlhMjc3MTIzYTY1Mzk4YTM2Y2IxYjA2YWYKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDQ2MDgwMCwgNGM2ZGEzOGM5ODQ0OTZmYjUxNGQ1ZTRkOGViYjEzZjgKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDQ2MDgwMCwgNTM1NDQzNWY2NjJlODBhNDdlMTQ2MGQzYmEwMjAxMzMKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDQ2MDgwMCwgNjg1NGJlYWFmOTBhZDlmMDU1YWY4MGZjNzVlODAyYWUKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDQ2MDgwMCwgY2I0MGM1N2Y5YjYxNzg4ZmI0YWJlNjc0YjU4NTE0MmYKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDQ2MDgwMCwgOGY0MmM2NTUzYzMzZGMwNDlmNmZiNWU3MWY2MzExMjUKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDQ2MDgwMCwgZDM5M2IzZWZhNzkyMWNhYWIzNTA0MDQ0NTUxYmY2YzMKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDQ2MDgwMCwgNjBhMDk5YmUzMTI0NGIyZjY5Y2E2MTA3Y2RiZDdlMDYKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDQ2MDgwMCwgMDVlNTQyYzEwNWRjM2Y2ZjgxMGQ4MTVmYmYwMjJhZmUKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDQ2MDgwMCwgYmY0NzhmNTU2OTRlZGE0Mzk0MmEzNDNlMGI3MGViMTkKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDQ2MDgwMCwgYjEwMTJlYTVmZjcyMzJkYTIwZDJjN2YyNDI1NDBiZGEKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDQ2MDgwMCwgOTM2Y2RkMGZkMTQ3ZjljM2FkNGU4MmJlZDc3YTZkMmMKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDQ2MDgwMCwgMjBiYWFmZGUxYWIyODE0NDRkOGNiZjU4OTk1MzQ0YzIKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDQ2MDgwMCwgYjBiYjM2NDdlYzg4ZDFhODYyZTJlOTJjMzJkOTViNjUKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDQ2MDgwMCwgYzg2ZDc4YjA2YzI4MWE4YzNiNjNiNGQ3YmVlYjNkZGQKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDQ2MDgwMCwgNGQ2OTkxNTdjNTVlYzM0MzkzOTBjNmZmNDAwNjU1YjQKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDQ2MDgwMCwgMzMyN2IwZTA5OTQ0ZGMxM2YwZjIxMjRjZGZhZDg2ZTkKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDQ2MDgwMCwgNWRiNTZiYjE0Y2Q0NzhmNzBiYjUyNDQ3ODFmMTM4MmQKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDQ2MDgwMCwgY2I4NTY0ZDdhNzYzNDQ0Y2M4NTUxMmRmM2Y3ZjEwZGIKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDQ2MDgwMCwgMTI1NmVhYzAzMDk4NWMwNGM0NTAxYWQ1YTcyZTlkNjYKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDQ2MDgwMCwgMjBlZmRmZjk5MTlmYWFjNTUyOGNiNTc2YTIxZDZjMmEKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDQ2MDgwMCwgMjg0MjA3MTRhZDEwMDg3NzJjZTgxMDBkOTE3ZTIyMjYKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDQ2MDgwMCwgNmMxOGRhZDBhNDcwZThjMGQ2MjQxM2I1NDllMGFlMmMKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDQ2MDgwMCwgM2Q4YjkzNTJlNWQyMTY5NzczM2U1ZmI1ZmRkNTVkNTgKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDQ2MDgwMCwgMDI1ZTMyY2VkOTE1NTMwZWI4MTRkMzk5YThiMjhhMjAKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDQ2MDgwMCwgY2M4ODBhNjRiNjZmMTU4NTk1NTIxMTgyYTFkYjhhMzYKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDQ2MDgwMCwgMzIyYTIzNDlhMDhlM2IzY2QxODU2MjA1MDI4N2MxMzMKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDQ2MDgwMCwgYzE5YzE2YTM4MjQ0OTU5NGYxZGVjN2E3N2E0ZTI2NGUKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDQ2MDgwMCwgMGQ0MjRiMjYwMzFmYTFkYjUyZmJkODBjMTAwZTI3YTQKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDQ2MDgwMCwgY2VmNjE1OGNkNDNiZWVlMGFlYTc3Nzk4MjYxM2U0OTMKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDQ2MDgwMCwgZWI2NGEwOTFhNTRlYmIxMDc3YzY2N2UxYjMzYWRkMmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21vdi1tcDMtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS9tb3YtbXAzLWRlbXV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MzA5NjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtbXAzLWRlbXV4CkBAIC0wLDAgKzEsMjk0IEBACisjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBtcDMKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDExNTIsICAgICAgIDM2LCAweDhlMjYwNTg5CiswLCAgICAgICAxMTUyLCAgICAgICAxMTUyLCAgICAgMTE1MiwgICAgICAgMzYsIDB4OGUyNjA1ODkKKzAsICAgICAgIDIzMDQsICAgICAgIDIzMDQsICAgICAxMTUyLCAgICAgICAzNiwgMHg4ZTI2MDU4OQorMCwgICAgICAgMzQ1NiwgICAgICAgMzQ1NiwgICAgIDExNTIsICAgICAgIDM2LCAweDhlMjYwNTg5CiswLCAgICAgICA0NjA4LCAgICAgICA0NjA4LCAgICAgMTE1MiwgICAgICAgMzYsIDB4OGUyNjA1ODkKKzAsICAgICAgIDU3NjAsICAgICAgIDU3NjAsICAgICAxMTUyLCAgICAgICAzNiwgMHg4ZTI2MDU4OQorMCwgICAgICAgNjkxMiwgICAgICAgNjkxMiwgICAgIDExNTIsICAgICAgIDY5LCAweGRiNTUwZjA5CiswLCAgICAgICA4MDY0LCAgICAgICA4MDY0LCAgICAgMTE1MiwgICAgICAxMDQsIDB4YmFlYjFhYTgKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxMTUyLCAgICAgIDEwNCwgMHhiYWViMWFhOAorMCwgICAgICAxMDM2OCwgICAgICAxMDM2OCwgICAgIDExNTIsICAgICAgMTA0LCAweGJhZWIxYWE4CiswLCAgICAgIDExNTIwLCAgICAgIDExNTIwLCAgICAgMTE1MiwgICAgICAxMDQsIDB4YmFlYjFhYTgKKzAsICAgICAgMTI2NzIsICAgICAgMTI2NzIsICAgICAxMTUyLCAgICAgIDEwNCwgMHhiYWViMWFhOAorMCwgICAgICAxMzgyNCwgICAgICAxMzgyNCwgICAgIDExNTIsICAgICAgMTA0LCAweGJhZWIxYWE4CiswLCAgICAgIDE0OTc2LCAgICAgIDE0OTc2LCAgICAgMTE1MiwgICAgICAgMzYsIDB4OGUyNjA1ODkKKzAsICAgICAgMTYxMjgsICAgICAgMTYxMjgsICAgICAxMTUyLCAgICAgIDYwMSwgMHhjMzRmMWRjOQorMCwgICAgICAxNzI4MCwgICAgICAxNzI4MCwgICAgIDExNTIsICAgICAgNzE2LCAweDZjMjY2NWU1CiswLCAgICAgIDE4NDMyLCAgICAgIDE4NDMyLCAgICAgMTE1MiwgICAgICA2NzIsIDB4Zjk4NzNmNGIKKzAsICAgICAgMTk1ODQsICAgICAgMTk1ODQsICAgICAxMTUyLCAgICAgIDYzMSwgMHhkMTMzMzNjYworMCwgICAgICAyMDczNiwgICAgICAyMDczNiwgICAgIDExNTIsICAgICAgNjA0LCAweGMwYmIxM2U1CiswLCAgICAgIDIxODg4LCAgICAgIDIxODg4LCAgICAgMTE1MiwgICAgICA2NDIsIDB4NGU4NzMzMTkKKzAsICAgICAgMjMwNDAsICAgICAgMjMwNDAsICAgICAxMTUyLCAgICAgIDYzMSwgMHhjZjcwMWU3ZAorMCwgICAgICAyNDE5MiwgICAgICAyNDE5MiwgICAgIDExNTIsICAgICAgNjMyLCAweDI3NzczMDQ2CiswLCAgICAgIDI1MzQ0LCAgICAgIDI1MzQ0LCAgICAgMTE1MiwgICAgICA2MDksIDB4N2VjMjFlNTMKKzAsICAgICAgMjY0OTYsICAgICAgMjY0OTYsICAgICAxMTUyLCAgICAgIDU4MiwgMHhkNjhlMGQ1OQorMCwgICAgICAyNzY0OCwgICAgICAyNzY0OCwgICAgIDExNTIsICAgICAgNTUwLCAweDViMTMwM2VlCiswLCAgICAgIDI4ODAwLCAgICAgIDI4ODAwLCAgICAgMTE1MiwgICAgICA1ODEsIDB4NzNkYzEyZTQKKzAsICAgICAgMjk5NTIsICAgICAgMjk5NTIsICAgICAxMTUyLCAgICAgIDU0NSwgMHg1MzBmMDg1YQorMCwgICAgICAzMTEwNCwgICAgICAzMTEwNCwgICAgIDExNTIsICAgICAgNTU2LCAweGZmMGNmZDlhCiswLCAgICAgIDMyMjU2LCAgICAgIDMyMjU2LCAgICAgMTE1MiwgICAgICA1NjcsIDB4M2MzMzA3NDMKKzAsICAgICAgMzM0MDgsICAgICAgMzM0MDgsICAgICAxMTUyLCAgICAgIDU2NCwgMHgyYzNhMTE0NAorMCwgICAgICAzNDU2MCwgICAgICAzNDU2MCwgICAgIDExNTIsICAgICAgOTEzLCAweDc0YjA4YWI3CiswLCAgICAgIDM1NzEyLCAgICAgIDM1NzEyLCAgICAgMTE1MiwgICAgICA2ODEsIDB4MjY2OTQ0NGEKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxMTUyLCAgICAgIDYxNSwgMHg2MGE0MWIxYQorMCwgICAgICAzODAxNiwgICAgICAzODAxNiwgICAgIDExNTIsICAgICAgNjcwLCAweDUzNzkzMzY3CiswLCAgICAgIDM5MTY4LCAgICAgIDM5MTY4LCAgICAgMTE1MiwgICAgICA2NjYsIDB4OGM0NTNjMWEKKzAsICAgICAgNDAzMjAsICAgICAgNDAzMjAsICAgICAxMTUyLCAgICAgIDYxMywgMHg2NzlmMTdhNAorMCwgICAgICA0MTQ3MiwgICAgICA0MTQ3MiwgICAgIDExNTIsICAgICAgNTYxLCAweDM1NzQwNWMwCiswLCAgICAgIDQyNjI0LCAgICAgIDQyNjI0LCAgICAgMTE1MiwgICAgICA1MjcsIDB4Njg3YWZhY2IKKzAsICAgICAgNDM3NzYsICAgICAgNDM3NzYsICAgICAxMTUyLCAgICAgIDUxNSwgMHhmOTlkZmI3MworMCwgICAgICA0NDkyOCwgICAgICA0NDkyOCwgICAgIDExNTIsICAgICAgNTYwLCAweGE5Y2EwNzY3CiswLCAgICAgIDQ2MDgwLCAgICAgIDQ2MDgwLCAgICAgMTE1MiwgICAgICA1NTAsIDB4YjFjZTA5OTAKKzAsICAgICAgNDcyMzIsICAgICAgNDcyMzIsICAgICAxMTUyLCAgICAgIDQ5NCwgMHgzZmQyZjJjOAorMCwgICAgICA0ODM4NCwgICAgICA0ODM4NCwgICAgIDExNTIsICAgICAgNTE4LCAweDljNWIwMjQyCiswLCAgICAgIDQ5NTM2LCAgICAgIDQ5NTM2LCAgICAgMTE1MiwgICAgICA1MjAsIDB4YmZkYzA4NzcKKzAsICAgICAgNTA2ODgsICAgICAgNTA2ODgsICAgICAxMTUyLCAgICAgIDUxMiwgMHg0OTg4Zjk0YgorMCwgICAgICA1MTg0MCwgICAgICA1MTg0MCwgICAgIDExNTIsICAgICAgNzg2LCAweGYzY2Y2MWRlCiswLCAgICAgIDUyOTkyLCAgICAgIDUyOTkyLCAgICAgMTE1MiwgICAgICA3MTMsIDB4MmYxYzQ2YjQKKzAsICAgICAgNTQxNDQsICAgICAgNTQxNDQsICAgICAxMTUyLCAgICAgIDYxNiwgMHgyMTAzMjdkOAorMCwgICAgICA1NTI5NiwgICAgICA1NTI5NiwgICAgIDExNTIsICAgICAgNjMyLCAweDM5ZDQzMGQ0CiswLCAgICAgIDU2NDQ4LCAgICAgIDU2NDQ4LCAgICAgMTE1MiwgICAgICA2MTUsIDB4ZDcyMzE5MzAKKzAsICAgICAgNTc2MDAsICAgICAgNTc2MDAsICAgICAxMTUyLCAgICAgIDYyMCwgMHhiNzAyMzY2MworMCwgICAgICA1ODc1MiwgICAgICA1ODc1MiwgICAgIDExNTIsICAgICAgNTg1LCAweDllOTAxMDBhCiswLCAgICAgIDU5OTA0LCAgICAgIDU5OTA0LCAgICAgMTE1MiwgICAgICA1ODMsIDB4ZTQxNTJiMmEKKzAsICAgICAgNjEwNTYsICAgICAgNjEwNTYsICAgICAxMTUyLCAgICAgIDYxNCwgMHgwZDU3MmViZgorMCwgICAgICA2MjIwOCwgICAgICA2MjIwOCwgICAgIDExNTIsICAgICAgNjM2LCAweDlkMWYyZTZiCiswLCAgICAgIDYzMzYwLCAgICAgIDYzMzYwLCAgICAgMTE1MiwgICAgICA2MDMsIDB4MmUzMzI0MGYKKzAsICAgICAgNjQ1MTIsICAgICAgNjQ1MTIsICAgICAxMTUyLCAgICAgIDYyNywgMHgyYzdlMjA0YworMCwgICAgICA2NTY2NCwgICAgICA2NTY2NCwgICAgIDExNTIsICAgICAgNjI2LCAweDVjYzMyNTRiCiswLCAgICAgIDY2ODE2LCAgICAgIDY2ODE2LCAgICAgMTE1MiwgICAgICA2MjYsIDB4ZThmZDM0ZGYKKzAsICAgICAgNjc5NjgsICAgICAgNjc5NjgsICAgICAxMTUyLCAgICAgIDYwMCwgMHgzM2E5MjZkNQorMCwgICAgICA2OTEyMCwgICAgICA2OTEyMCwgICAgIDExNTIsICAgICAgNzc3LCAweDRjZDY2ZjUzCiswLCAgICAgIDcwMjcyLCAgICAgIDcwMjcyLCAgICAgMTE1MiwgICAgICA3NTMsIDB4OGIyOTc5MDEKKzAsICAgICAgNzE0MjQsICAgICAgNzE0MjQsICAgICAxMTUyLCAgICAgIDY1NywgMHhkMTBlMzAyZgorMCwgICAgICA3MjU3NiwgICAgICA3MjU3NiwgICAgIDExNTIsICAgICAgNjExLCAweDQ4NGQyZjQ0CiswLCAgICAgIDczNzI4LCAgICAgIDczNzI4LCAgICAgMTE1MiwgICAgICA2NDAsIDB4MzEwYjQxNGEKKzAsICAgICAgNzQ4ODAsICAgICAgNzQ4ODAsICAgICAxMTUyLCAgICAgIDU4MCwgMHgzYjQxMGNkYgorMCwgICAgICA3NjAzMiwgICAgICA3NjAzMiwgICAgIDExNTIsICAgICAgNTc0LCAweDZhYmEyODJjCiswLCAgICAgIDc3MTg0LCAgICAgIDc3MTg0LCAgICAgMTE1MiwgICAgICA1NDEsIDB4NTk2ODBkNjQKKzAsICAgICAgNzgzMzYsICAgICAgNzgzMzYsICAgICAxMTUyLCAgICAgIDUxMiwgMHgwODI0ZjIzNgorMCwgICAgICA3OTQ4OCwgICAgICA3OTQ4OCwgICAgIDExNTIsICAgICAgNTE2LCAweDZkMWVmYWJhCiswLCAgICAgIDgwNjQwLCAgICAgIDgwNjQwLCAgICAgMTE1MiwgICAgICA1NTMsIDB4OTQyYjBkOTAKKzAsICAgICAgODE3OTIsICAgICAgODE3OTIsICAgICAxMTUyLCAgICAgIDU2NCwgMHhiODQ3MTE4MAorMCwgICAgICA4Mjk0NCwgICAgICA4Mjk0NCwgICAgIDExNTIsICAgICAgNTUwLCAweGZiMTUwOTY0CiswLCAgICAgIDg0MDk2LCAgICAgIDg0MDk2LCAgICAgMTE1MiwgICAgICA1MzQsIDB4YmM0ZTAyNTQKKzAsICAgICAgODUyNDgsICAgICAgODUyNDgsICAgICAxMTUyLCAgICAgIDUyOSwgMHgwMmIzZjYwMworMCwgICAgICA4NjQwMCwgICAgICA4NjQwMCwgICAgIDExNTIsICAgICAgNTIxLCAweGU3N2EwMGYzCiswLCAgICAgIDg3NTUyLCAgICAgIDg3NTUyLCAgICAgMTE1MiwgICAgICA1MDEsIDB4MDI5MmYwODgKKzAsICAgICAgODg3MDQsICAgICAgODg3MDQsICAgICAxMTUyLCAgICAgIDQ5OCwgMHhkMWY0ZWI2MAorMCwgICAgICA4OTg1NiwgICAgICA4OTg1NiwgICAgIDExNTIsICAgICAgNDk1LCAweGE5ZThlODgyCiswLCAgICAgIDkxMDA4LCAgICAgIDkxMDA4LCAgICAgMTE1MiwgICAgICA0ODcsIDB4MWI0MGVkZmQKKzAsICAgICAgOTIxNjAsICAgICAgOTIxNjAsICAgICAxMTUyLCAgICAgIDQ5MiwgMHhkOGNkZTk2ZgorMCwgICAgICA5MzMxMiwgICAgICA5MzMxMiwgICAgIDExNTIsICAgICAgNDgwLCAweDM4N2JlMzAwCiswLCAgICAgIDk0NDY0LCAgICAgIDk0NDY0LCAgICAgMTE1MiwgICAgICA0NzYsIDB4NGM2YWUyNDkKKzAsICAgICAgOTU2MTYsICAgICAgOTU2MTYsICAgICAxMTUyLCAgICAgIDQ1MCwgMHhkNjkwZDRmNAorMCwgICAgICA5Njc2OCwgICAgICA5Njc2OCwgICAgIDExNTIsICAgICAgNDUzLCAweDFhYWZkNzNlCiswLCAgICAgIDk3OTIwLCAgICAgIDk3OTIwLCAgICAgMTE1MiwgICAgICA0NDgsIDB4ZTk5N2Q4ZDEKKzAsICAgICAgOTkwNzIsICAgICAgOTkwNzIsICAgICAxMTUyLCAgICAgIDQyOSwgMHg1ODEzYzAzNAorMCwgICAgIDEwMDIyNCwgICAgIDEwMDIyNCwgICAgIDExNTIsICAgICAgNDMwLCAweGNkNGFjNTdiCiswLCAgICAgMTAxMzc2LCAgICAgMTAxMzc2LCAgICAgMTE1MiwgICAgICA0MTYsIDB4ZTQ2NmI5MTYKKzAsICAgICAxMDI1MjgsICAgICAxMDI1MjgsICAgICAxMTUyLCAgICAgIDQyNSwgMHg4ZjY3Yjg2MworMCwgICAgIDEwMzY4MCwgICAgIDEwMzY4MCwgICAgIDExNTIsICAgICAgNDE4LCAweGM4ZmFjY2ZlCiswLCAgICAgMTA0ODMyLCAgICAgMTA0ODMyLCAgICAgMTE1MiwgICAgICAzOTcsIDB4OTMyY2I1MTUKKzAsICAgICAxMDU5ODQsICAgICAxMDU5ODQsICAgICAxMTUyLCAgICAgIDQxMywgMHgwYTY0YmRmYworMCwgICAgIDEwNzEzNiwgICAgIDEwNzEzNiwgICAgIDExNTIsICAgICAgNDA4LCAweGE0YWJjYmU0CiswLCAgICAgMTA4Mjg4LCAgICAgMTA4Mjg4LCAgICAgMTE1MiwgICAgICA0MDUsIDB4YjIzMWMzMzYKKzAsICAgICAxMDk0NDAsICAgICAxMDk0NDAsICAgICAxMTUyLCAgICAgIDQxNywgMHhkYTZhYzc2MgorMCwgICAgIDExMDU5MiwgICAgIDExMDU5MiwgICAgIDExNTIsICAgICAgNDA0LCAweGIyZmRiOTgzCiswLCAgICAgMTExNzQ0LCAgICAgMTExNzQ0LCAgICAgMTE1MiwgICAgICA0MjAsIDB4MDQ3OGM3ZmMKKzAsICAgICAxMTI4OTYsICAgICAxMTI4OTYsICAgICAxMTUyLCAgICAgIDQxNCwgMHgxYTNmYjlmYgorMCwgICAgIDExNDA0OCwgICAgIDExNDA0OCwgICAgIDExNTIsICAgICAgNDExLCAweGZkYTBjMWE5CiswLCAgICAgMTE1MjAwLCAgICAgMTE1MjAwLCAgICAgMTE1MiwgICAgICAzOTAsIDB4ZTUwOGMyYWIKKzAsICAgICAxMTYzNTIsICAgICAxMTYzNTIsICAgICAxMTUyLCAgICAgIDM5OSwgMHg2MTBjYzljYQorMCwgICAgIDExNzUwNCwgICAgIDExNzUwNCwgICAgIDExNTIsICAgICAgMzc5LCAweDA0YTRiNGEzCiswLCAgICAgMTE4NjU2LCAgICAgMTE4NjU2LCAgICAgMTE1MiwgICAgICAzODMsIDB4NjIxN2I5MWEKKzAsICAgICAxMTk4MDgsICAgICAxMTk4MDgsICAgICAxMTUyLCAgICAgIDM2MCwgMHgxY2EzYWE0YQorMCwgICAgIDEyMDk2MCwgICAgIDEyMDk2MCwgICAgIDExNTIsICAgICAgMzM5LCAweDI2ZGNhNWNlCiswLCAgICAgMTIyMTEyLCAgICAgMTIyMTEyLCAgICAgMTE1MiwgICAgICAzMzYsIDB4MDI5MmEwYjAKKzAsICAgICAxMjMyNjQsICAgICAxMjMyNjQsICAgICAxMTUyLCAgICAgIDM0MCwgMHg0YTI0YTM2ZAorMCwgICAgIDEyNDQxNiwgICAgIDEyNDQxNiwgICAgIDExNTIsICAgICAgMzEyLCAweDQ1ZmM4YWZkCiswLCAgICAgMTI1NTY4LCAgICAgMTI1NTY4LCAgICAgMTE1MiwgICAgICAzMzUsIDB4YjU2M2E0MTAKKzAsICAgICAxMjY3MjAsICAgICAxMjY3MjAsICAgICAxMTUyLCAgICAgIDM0NiwgMHgwYWI0YTMzMQorMCwgICAgIDEyNzg3MiwgICAgIDEyNzg3MiwgICAgIDExNTIsICAgICAgMzM0LCAweDMyN2I5Y2ZjCiswLCAgICAgMTI5MDI0LCAgICAgMTI5MDI0LCAgICAgMTE1MiwgICAgICAzMzYsIDB4NTVmZGE1OTkKKzAsICAgICAxMzAxNzYsICAgICAxMzAxNzYsICAgICAxMTUyLCAgICAgIDM1NywgMHg5ZTZkYWRlNQorMCwgICAgIDEzMTMyOCwgICAgIDEzMTMyOCwgICAgIDExNTIsICAgICAgMzQzLCAweDNiZjRhODRhCiswLCAgICAgMTMyNDgwLCAgICAgMTMyNDgwLCAgICAgMTE1MiwgICAgICAzMzAsIDB4NTJkOTk5NTcKKzAsICAgICAxMzM2MzIsICAgICAxMzM2MzIsICAgICAxMTUyLCAgICAgIDM1OCwgMHg4OWJkYTc2ZgorMCwgICAgIDEzNDc4NCwgICAgIDEzNDc4NCwgICAgIDExNTIsICAgICAgMzQ5LCAweDYwNjdhMzFkCiswLCAgICAgMTM1OTM2LCAgICAgMTM1OTM2LCAgICAgMTE1MiwgICAgICAzNTcsIDB4MzRkZWE3N2YKKzAsICAgICAxMzcwODgsICAgICAxMzcwODgsICAgICAxMTUyLCAgICAgIDM3NiwgMHhkMDAxYjdkOAorMCwgICAgIDEzODI0MCwgICAgIDEzODI0MCwgICAgIDExNTIsICAgICAgMzM0LCAweGE4MWQ5YjZiCiswLCAgICAgMTM5MzkyLCAgICAgMTM5MzkyLCAgICAgMTE1MiwgICAgICAzNjksIDB4MWZkNWFiMzEKKzAsICAgICAxNDA1NDQsICAgICAxNDA1NDQsICAgICAxMTUyLCAgICAgIDM1OSwgMHg3ZmZiYWU4NQorMCwgICAgIDE0MTY5NiwgICAgIDE0MTY5NiwgICAgIDExNTIsICAgICAgMzY4LCAweGEyNzdhMTA4CiswLCAgICAgMTQyODQ4LCAgICAgMTQyODQ4LCAgICAgMTE1MiwgICAgICAzNTksIDB4ZWE2ZGE1MDcKKzAsICAgICAxNDQwMDAsICAgICAxNDQwMDAsICAgICAxMTUyLCAgICAgIDM2OSwgMHg0MzdhYjE2NAorMCwgICAgIDE0NTE1MiwgICAgIDE0NTE1MiwgICAgIDExNTIsICAgICAgMzYxLCAweDFhMmFhOTU5CiswLCAgICAgMTQ2MzA0LCAgICAgMTQ2MzA0LCAgICAgMTE1MiwgICAgICAzNDMsIDB4ODNjZmEyZTIKKzAsICAgICAxNDc0NTYsICAgICAxNDc0NTYsICAgICAxMTUyLCAgICAgIDM2OSwgMHg4NTU4YWViNgorMCwgICAgIDE0ODYwOCwgICAgIDE0ODYwOCwgICAgIDExNTIsICAgICAgMzU1LCAweDRkMWRhNjRkCiswLCAgICAgMTQ5NzYwLCAgICAgMTQ5NzYwLCAgICAgMTE1MiwgICAgICAzNjQsIDB4MGZlOWIyZDgKKzAsICAgICAxNTA5MTIsICAgICAxNTA5MTIsICAgICAxMTUyLCAgICAgIDM1NSwgMHhmYzk4YWJhNQorMCwgICAgIDE1MjA2NCwgICAgIDE1MjA2NCwgICAgIDExNTIsICAgICAgMzkwLCAweDlkMjViNWM0CiswLCAgICAgMTUzMjE2LCAgICAgMTUzMjE2LCAgICAgMTE1MiwgICAgICAzNjEsIDB4OWZlOGFiMjQKKzAsICAgICAxNTQzNjgsICAgICAxNTQzNjgsICAgICAxMTUyLCAgICAgIDM2NCwgMHgwM2FkYTcxNworMCwgICAgIDE1NTUyMCwgICAgIDE1NTUyMCwgICAgIDExNTIsICAgICAgMzc5LCAweGIwNmViOWUyCiswLCAgICAgMTU2NjcyLCAgICAgMTU2NjcyLCAgICAgMTE1MiwgICAgICAzNzEsIDB4YzNhZWI0NWMKKzAsICAgICAxNTc4MjQsICAgICAxNTc4MjQsICAgICAxMTUyLCAgICAgIDg5NSwgMHg4NmQxOThkYworMCwgICAgIDE1ODk3NiwgICAgIDE1ODk3NiwgICAgIDExNTIsICAgICAgNjQ0LCAweDFmMWQzNzZhCiswLCAgICAgMTYwMTI4LCAgICAgMTYwMTI4LCAgICAgMTE1MiwgICAgICA2ODIsIDB4NGRhODRkZjYKKzAsICAgICAxNjEyODAsICAgICAxNjEyODAsICAgICAxMTUyLCAgICAgIDY3NSwgMHhkNDE1NDNiZQorMCwgICAgIDE2MjQzMiwgICAgIDE2MjQzMiwgICAgIDExNTIsICAgICAgNjQyLCAweGQ1YjA0MjExCiswLCAgICAgMTYzNTg0LCAgICAgMTYzNTg0LCAgICAgMTE1MiwgICAgICA2MzIsIDB4NDVkYTM4Y2QKKzAsICAgICAxNjQ3MzYsICAgICAxNjQ3MzYsICAgICAxMTUyLCAgICAgIDU5NywgMHg5ZjE2MTFkMworMCwgICAgIDE2NTg4OCwgICAgIDE2NTg4OCwgICAgIDExNTIsICAgICAgNTc0LCAweDA4OWYyMTVmCiswLCAgICAgMTY3MDQwLCAgICAgMTY3MDQwLCAgICAgMTE1MiwgICAgICA1NzgsIDB4OTA4ODA0NjEKKzAsICAgICAxNjgxOTIsICAgICAxNjgxOTIsICAgICAxMTUyLCAgICAgIDU2NiwgMHgzODM2MGU3OQorMCwgICAgIDE2OTM0NCwgICAgIDE2OTM0NCwgICAgIDExNTIsICAgICAgNTgzLCAweGU2MmUwYWI2CiswLCAgICAgMTcwNDk2LCAgICAgMTcwNDk2LCAgICAgMTE1MiwgICAgICA1OTMsIDB4YTU1YTE5ZjgKKzAsICAgICAxNzE2NDgsICAgICAxNzE2NDgsICAgICAxMTUyLCAgICAgIDYyNSwgMHhiZjdkMWIwZgorMCwgICAgIDE3MjgwMCwgICAgIDE3MjgwMCwgICAgIDExNTIsICAgICAgNTc0LCAweGE3MTkxNzZhCiswLCAgICAgMTczOTUyLCAgICAgMTczOTUyLCAgICAgMTE1MiwgICAgICA2MDUsIDB4ZjVlNTE3ZWYKKzAsICAgICAxNzUxMDQsICAgICAxNzUxMDQsICAgICAxMTUyLCAgICAgIDgwNCwgMHgzYTBhODFhZQorMCwgICAgIDE3NjI1NiwgICAgIDE3NjI1NiwgICAgIDExNTIsICAgICAgNjk5LCAweDg4MDYzNWJkCiswLCAgICAgMTc3NDA4LCAgICAgMTc3NDA4LCAgICAgMTE1MiwgICAgICA2NDYsIDB4NzkwNTJmYWEKKzAsICAgICAxNzg1NjAsICAgICAxNzg1NjAsICAgICAxMTUyLCAgICAgIDYzNCwgMHgyZThkMmQ4ZQorMCwgICAgIDE3OTcxMiwgICAgIDE3OTcxMiwgICAgIDExNTIsICAgICAgNTk2LCAweGM4MjgxZTg3CiswLCAgICAgMTgwODY0LCAgICAgMTgwODY0LCAgICAgMTE1MiwgICAgICA2MDUsIDB4YTVlNzMxNTYKKzAsICAgICAxODIwMTYsICAgICAxODIwMTYsICAgICAxMTUyLCAgICAgIDU4OCwgMHg3YzhiMWE1NQorMCwgICAgIDE4MzE2OCwgICAgIDE4MzE2OCwgICAgIDExNTIsICAgICAgNTY2LCAweDllNzEwZWE0CiswLCAgICAgMTg0MzIwLCAgICAgMTg0MzIwLCAgICAgMTE1MiwgICAgICA2MjQsIDB4NjkwNzJkMzcKKzAsICAgICAxODU0NzIsICAgICAxODU0NzIsICAgICAxMTUyLCAgICAgIDYwMCwgMHhlODQ4MzJmYworMCwgICAgIDE4NjYyNCwgICAgIDE4NjYyNCwgICAgIDExNTIsICAgICAgNTgwLCAweDI5ZmQxMjNhCiswLCAgICAgMTg3Nzc2LCAgICAgMTg3Nzc2LCAgICAgMTE1MiwgICAgICA1NjIsIDB4YmEzMDBkMTEKKzAsICAgICAxODg5MjgsICAgICAxODg5MjgsICAgICAxMTUyLCAgICAgIDU3NywgMHg4YTQ3MWZjOQorMCwgICAgIDE5MDA4MCwgICAgIDE5MDA4MCwgICAgIDExNTIsICAgICAgNTg4LCAweDk0ZmIxOTU0CiswLCAgICAgMTkxMjMyLCAgICAgMTkxMjMyLCAgICAgMTE1MiwgICAgICA1NzYsIDB4NmQ3ZDFiY2YKKzAsICAgICAxOTIzODQsICAgICAxOTIzODQsICAgICAxMTUyLCAgICAgIDY5NywgMHhjMGExMzk1NQorMCwgICAgIDE5MzUzNiwgICAgIDE5MzUzNiwgICAgIDExNTIsICAgICAgODA1LCAweGU1ZmI4YWVlCiswLCAgICAgMTk0Njg4LCAgICAgMTk0Njg4LCAgICAgMTE1MiwgICAgICA2NzMsIDB4NjQ1YzRiMjMKKzAsICAgICAxOTU4NDAsICAgICAxOTU4NDAsICAgICAxMTUyLCAgICAgIDYzNSwgMHhkNDBmMjgyMAorMCwgICAgIDE5Njk5MiwgICAgIDE5Njk5MiwgICAgIDExNTIsICAgICAgNjYwLCAweGIzZDYzOGI4CiswLCAgICAgMTk4MTQ0LCAgICAgMTk4MTQ0LCAgICAgMTE1MiwgICAgICA2NTIsIDB4N2MyMTMyMmEKKzAsICAgICAxOTkyOTYsICAgICAxOTkyOTYsICAgICAxMTUyLCAgICAgIDYyMywgMHgzODJhMjczNQorMCwgICAgIDIwMDQ0OCwgICAgIDIwMDQ0OCwgICAgIDExNTIsICAgICAgNjA2LCAweGIwNjMyYTY5CiswLCAgICAgMjAxNjAwLCAgICAgMjAxNjAwLCAgICAgMTE1MiwgICAgICA1ODQsIDB4ZmFhODIwZWIKKzAsICAgICAyMDI3NTIsICAgICAyMDI3NTIsICAgICAxMTUyLCAgICAgIDY0NSwgMHg3NzQzMjdjOQorMCwgICAgIDIwMzkwNCwgICAgIDIwMzkwNCwgICAgIDExNTIsICAgICAgNjU0LCAweDk2YjQxYTRiCiswLCAgICAgMjA1MDU2LCAgICAgMjA1MDU2LCAgICAgMTE1MiwgICAgICA2NjAsIDB4NTc0ODMxNDUKKzAsICAgICAyMDYyMDgsICAgICAyMDYyMDgsICAgICAxMTUyLCAgICAgIDYwNiwgMHhkNjE3MTZmMAorMCwgICAgIDIwNzM2MCwgICAgIDIwNzM2MCwgICAgIDExNTIsICAgICAgNjM3LCAweDZjODUyNmVlCiswLCAgICAgMjA4NTEyLCAgICAgMjA4NTEyLCAgICAgMTE1MiwgICAgICA2MjQsIDB4Y2NjZjFmNzgKKzAsICAgICAyMDk2NjQsICAgICAyMDk2NjQsICAgICAxMTUyLCAgICAgIDY0MCwgMHg5NjZlMmQ1OAorMCwgICAgIDIxMDgxNiwgICAgIDIxMDgxNiwgICAgIDExNTIsICAgICAgODY4LCAweDZmNDJhMDNlCiswLCAgICAgMjExOTY4LCAgICAgMjExOTY4LCAgICAgMTE1MiwgICAgICA3MTIsIDB4MTAxOTVhYjIKKzAsICAgICAyMTMxMjAsICAgICAyMTMxMjAsICAgICAxMTUyLCAgICAgIDYyMywgMHgzYjNmMjRhOAorMCwgICAgIDIxNDI3MiwgICAgIDIxNDI3MiwgICAgIDExNTIsICAgICAgNjE4LCAweGZiODUzMTIyCiswLCAgICAgMjE1NDI0LCAgICAgMjE1NDI0LCAgICAgMTE1MiwgICAgICA2MDYsIDB4MjA5MjI5MDkKKzAsICAgICAyMTY1NzYsICAgICAyMTY1NzYsICAgICAxMTUyLCAgICAgIDUyNiwgMHgwNWRlZmNkZAorMCwgICAgIDIxNzcyOCwgICAgIDIxNzcyOCwgICAgIDExNTIsICAgICAgNTM4LCAweGMxOGZmZWVmCiswLCAgICAgMjE4ODgwLCAgICAgMjE4ODgwLCAgICAgMTE1MiwgICAgICA1MDgsIDB4MTk0M2ViYTcKKzAsICAgICAyMjAwMzIsICAgICAyMjAwMzIsICAgICAxMTUyLCAgICAgIDQ5NywgMHhmOTUzZmJiNgorMCwgICAgIDIyMTE4NCwgICAgIDIyMTE4NCwgICAgIDExNTIsICAgICAgNTEzLCAweDNiMzVmMDI2CiswLCAgICAgMjIyMzM2LCAgICAgMjIyMzM2LCAgICAgMTE1MiwgICAgICA1MzAsIDB4NzA1YjAzMzMKKzAsICAgICAyMjM0ODgsICAgICAyMjM0ODgsICAgICAxMTUyLCAgICAgIDUyOCwgMHg3YzU4MDBlOQorMCwgICAgIDIyNDY0MCwgICAgIDIyNDY0MCwgICAgIDExNTIsICAgICAgNTE3LCAweDE2MDFmYTdlCiswLCAgICAgMjI1NzkyLCAgICAgMjI1NzkyLCAgICAgMTE1MiwgICAgICA1MDEsIDB4NTA0NWY2MWEKKzAsICAgICAyMjY5NDQsICAgICAyMjY5NDQsICAgICAxMTUyLCAgICAgIDUyMCwgMHgyNTRlZTY1ZAorMCwgICAgIDIyODA5NiwgICAgIDIyODA5NiwgICAgIDExNTIsICAgICAgODI3LCAweDI5NjQ0Y2U0CiswLCAgICAgMjI5MjQ4LCAgICAgMjI5MjQ4LCAgICAgMTE1MiwgICAgICA2OTIsIDB4YjlkMjY1ZWUKKzAsICAgICAyMzA0MDAsICAgICAyMzA0MDAsICAgICAxMTUyLCAgICAgIDY2MCwgMHgwNTAyMzNjNgorMCwgICAgIDIzMTU1MiwgICAgIDIzMTU1MiwgICAgIDExNTIsICAgICAgNjMxLCAweDAzMDYyODRlCiswLCAgICAgMjMyNzA0LCAgICAgMjMyNzA0LCAgICAgMTE1MiwgICAgICA2MTEsIDB4ZjllZDIwNzkKKzAsICAgICAyMzM4NTYsICAgICAyMzM4NTYsICAgICAxMTUyLCAgICAgIDY0MCwgMHhkMWFiMzM2MworMCwgICAgIDIzNTAwOCwgICAgIDIzNTAwOCwgICAgIDExNTIsICAgICAgNjUyLCAweGFlYmYzYjVhCiswLCAgICAgMjM2MTYwLCAgICAgMjM2MTYwLCAgICAgMTE1MiwgICAgICA2MTksIDB4YzY0ZTI4MGIKKzAsICAgICAyMzczMTIsICAgICAyMzczMTIsICAgICAxMTUyLCAgICAgIDYwMSwgMHg2NDdkMjU4YworMCwgICAgIDIzODQ2NCwgICAgIDIzODQ2NCwgICAgIDExNTIsICAgICAgNTc0LCAweDBhMmIxNTQ4CiswLCAgICAgMjM5NjE2LCAgICAgMjM5NjE2LCAgICAgMTE1MiwgICAgICA1NzAsIDB4ZDk4ZTExYmYKKzAsICAgICAyNDA3NjgsICAgICAyNDA3NjgsICAgICAxMTUyLCAgICAgIDYxMSwgMHgwNGE4MWU4NQorMCwgICAgIDI0MTkyMCwgICAgIDI0MTkyMCwgICAgIDExNTIsICAgICAgNTI1LCAweDEwOGZmNWVlCiswLCAgICAgMjQzMDcyLCAgICAgMjQzMDcyLCAgICAgMTE1MiwgICAgICA1NjksIDB4OWEzYjEzMTkKKzAsICAgICAyNDQyMjQsICAgICAyNDQyMjQsICAgICAxMTUyLCAgICAgIDU3NCwgMHhkYzc3MGE4ZAorMCwgICAgIDI0NTM3NiwgICAgIDI0NTM3NiwgICAgIDExNTIsICAgICAgODMxLCAweDVlZDA2NmM3CiswLCAgICAgMjQ2NTI4LCAgICAgMjQ2NTI4LCAgICAgMTE1MiwgICAgICA3MjIsIDB4YTg4MzRmOGIKKzAsICAgICAyNDc2ODAsICAgICAyNDc2ODAsICAgICAxMTUyLCAgICAgIDczMCwgMHg3MWY1NmJlMQorMCwgICAgIDI0ODgzMiwgICAgIDI0ODgzMiwgICAgIDExNTIsICAgICAgNzI5LCAweDk2NTM2OTRhCiswLCAgICAgMjQ5OTg0LCAgICAgMjQ5OTg0LCAgICAgMTE1MiwgICAgICA3NTAsIDB4Zjg3MTZlYjgKKzAsICAgICAyNTExMzYsICAgICAyNTExMzYsICAgICAxMTUyLCAgICAgIDY5NSwgMHg1NDE5NTFmYQorMCwgICAgIDI1MjI4OCwgICAgIDI1MjI4OCwgICAgIDExNTIsICAgICAgNjc3LCAweGJmNTc1YjA1CiswLCAgICAgMjUzNDQwLCAgICAgMjUzNDQwLCAgICAgMTE1MiwgICAgICA2MzksIDB4MWY3NDM1MmIKKzAsICAgICAyNTQ1OTIsICAgICAyNTQ1OTIsICAgICAxMTUyLCAgICAgIDY0NywgMHg4N2U0M2E3ZQorMCwgICAgIDI1NTc0NCwgICAgIDI1NTc0NCwgICAgIDExNTIsICAgICAgNjEzLCAweDA5NTUxNzY2CiswLCAgICAgMjU2ODk2LCAgICAgMjU2ODk2LCAgICAgMTE1MiwgICAgICA1NjQsIDB4YTA2NzE2MmEKKzAsICAgICAyNTgwNDgsICAgICAyNTgwNDgsICAgICAxMTUyLCAgICAgIDUzOSwgMHhmMjI4MDc5MQorMCwgICAgIDI1OTIwMCwgICAgIDI1OTIwMCwgICAgIDExNTIsICAgICAgNTE2LCAweDljZmVmMzEzCiswLCAgICAgMjYwMzUyLCAgICAgMjYwMzUyLCAgICAgMTE1MiwgICAgICA1MjcsIDB4NWE5NDA4OGYKKzAsICAgICAyNjE1MDQsICAgICAyNjE1MDQsICAgICAxMTUyLCAgICAgIDUyOCwgMHg3MWQxZjMyYgorMCwgICAgIDI2MjY1NiwgICAgIDI2MjY1NiwgICAgIDExNTIsICAgICAgNTExLCAweGFmMjhmMzhjCiswLCAgICAgMjYzODA4LCAgICAgMjYzODA4LCAgICAgMTE1MiwgICAgICA1MTksIDB4NDdhNGYzZTQKKzAsICAgICAyNjQ5NjAsICAgICAyNjQ5NjAsICAgICAxMTUyLCAgICAgIDUxOSwgMHg2YTY3ZjRhNAorMCwgICAgIDI2NjExMiwgICAgIDI2NjExMiwgICAgIDExNTIsICAgICAgNTE0LCAweGUxNzZlNmQxCiswLCAgICAgMjY3MjY0LCAgICAgMjY3MjY0LCAgICAgMTE1MiwgICAgICA1MjUsIDB4ZDE5NGVkYWMKKzAsICAgICAyNjg0MTYsICAgICAyNjg0MTYsICAgICAxMTUyLCAgICAgIDUyNywgMHg2ZDUwZjdjMworMCwgICAgIDI2OTU2OCwgICAgIDI2OTU2OCwgICAgIDExNTIsICAgICAgNTA4LCAweDNmOGQwNWFmCiswLCAgICAgMjcwNzIwLCAgICAgMjcwNzIwLCAgICAgMTE1MiwgICAgICA1MTcsIDB4N2Y0OGVjNzcKKzAsICAgICAyNzE4NzIsICAgICAyNzE4NzIsICAgICAxMTUyLCAgICAgIDQ2OCwgMHg3M2EyZDgyZgorMCwgICAgIDI3MzAyNCwgICAgIDI3MzAyNCwgICAgIDExNTIsICAgICAgNDU3LCAweGM4MTZjZjE2CiswLCAgICAgMjc0MTc2LCAgICAgMjc0MTc2LCAgICAgMTE1MiwgICAgICA0MzQsIDB4OWU1YmM5MzAKKzAsICAgICAyNzUzMjgsICAgICAyNzUzMjgsICAgICAxMTUyLCAgICAgIDQ0MywgMHhkZTBmZDE3MQorMCwgICAgIDI3NjQ4MCwgICAgIDI3NjQ4MCwgICAgIDExNTIsICAgICAgNDE1LCAweDU4MDBiNzE1CiswLCAgICAgMjc3NjMyLCAgICAgMjc3NjMyLCAgICAgMTE1MiwgICAgICA0MjAsIDB4ZWRhOWQyMGMKKzAsICAgICAyNzg3ODQsICAgICAyNzg3ODQsICAgICAxMTUyLCAgICAgIDQxNiwgMHg0NzkzYzAxNworMCwgICAgIDI3OTkzNiwgICAgIDI3OTkzNiwgICAgIDExNTIsICAgICAgNDE3LCAweDVhMzdjMDBlCiswLCAgICAgMjgxMDg4LCAgICAgMjgxMDg4LCAgICAgMTE1MiwgICAgICA0MDksIDB4MDJkZWI5ZWQKKzAsICAgICAyODIyNDAsICAgICAyODIyNDAsICAgICAxMTUyLCAgICAgIDQwNywgMHhkOGIyYjEyNworMCwgICAgIDI4MzM5MiwgICAgIDI4MzM5MiwgICAgIDExNTIsICAgICAgMzk1LCAweDc4N2ZiYTUzCiswLCAgICAgMjg0NTQ0LCAgICAgMjg0NTQ0LCAgICAgMTE1MiwgICAgICAzODksIDB4MzM2MmIyYjMKKzAsICAgICAyODU2OTYsICAgICAyODU2OTYsICAgICAxMTUyLCAgICAgIDM4OCwgMHhlMDU4YWY1ZAorMCwgICAgIDI4Njg0OCwgICAgIDI4Njg0OCwgICAgIDExNTIsICAgICAgMzc0LCAweGUxYzBhZDQ4CiswLCAgICAgMjg4MDAwLCAgICAgMjg4MDAwLCAgICAgMTE1MiwgICAgICAzOTAsIDB4YTRmOGIyMDMKKzAsICAgICAyODkxNTIsICAgICAyODkxNTIsICAgICAxMTUyLCAgICAgIDM4MiwgMHhlMDc2YjY5MworMCwgICAgIDI5MDMwNCwgICAgIDI5MDMwNCwgICAgIDExNTIsICAgICAgMzgyLCAweGExOWFiMWQxCiswLCAgICAgMjkxNDU2LCAgICAgMjkxNDU2LCAgICAgMTE1MiwgICAgICAzODksIDB4NjE0ZGIwOWIKKzAsICAgICAyOTI2MDgsICAgICAyOTI2MDgsICAgICAxMTUyLCAgICAgIDM3NSwgMHg4ZTNiYjFhOQorMCwgICAgIDI5Mzc2MCwgICAgIDI5Mzc2MCwgICAgIDExNTIsICAgICAgMzc1LCAweDQ1NWRhYTVmCiswLCAgICAgMjk0OTEyLCAgICAgMjk0OTEyLCAgICAgMTE1MiwgICAgICAzOTEsIDB4ZDkzOGFlOWYKKzAsICAgICAyOTYwNjQsICAgICAyOTYwNjQsICAgICAxMTUyLCAgICAgIDM4MCwgMHg2Y2ViYjU1NQorMCwgICAgIDI5NzIxNiwgICAgIDI5NzIxNiwgICAgIDExNTIsICAgICAgMzgxLCAweGM0MmZhZjI2CiswLCAgICAgMjk4MzY4LCAgICAgMjk4MzY4LCAgICAgMTE1MiwgICAgICAzNjQsIDB4NjcxOWE1YjkKKzAsICAgICAyOTk1MjAsICAgICAyOTk1MjAsICAgICAxMTUyLCAgICAgIDM1MiwgMHhkOWFhYTkyMgorMCwgICAgIDMwMDY3MiwgICAgIDMwMDY3MiwgICAgIDExNTIsICAgICAgMzcyLCAweGZhY2VhYWI5CiswLCAgICAgMzAxODI0LCAgICAgMzAxODI0LCAgICAgMTE1MiwgICAgICAzNjksIDB4MWRkMGI0MDAKKzAsICAgICAzMDI5NzYsICAgICAzMDI5NzYsICAgICAxMTUyLCAgICAgIDMzOCwgMHgxYmU0OWRlMworMCwgICAgIDMwNDEyOCwgICAgIDMwNDEyOCwgICAgIDExNTIsICAgICAgMzQwLCAweDdmNDNhNGFmCiswLCAgICAgMzA1MjgwLCAgICAgMzA1MjgwLCAgICAgMTE1MiwgICAgICAzNDQsIDB4OGY1MTllYzAKKzAsICAgICAzMDY0MzIsICAgICAzMDY0MzIsICAgICAxMTUyLCAgICAgIDM1NSwgMHhkY2JkYTkzNQorMCwgICAgIDMwNzU4NCwgICAgIDMwNzU4NCwgICAgIDExNTIsICAgICAgMzM1LCAweDY5Mjk5MjE5CiswLCAgICAgMzA4NzM2LCAgICAgMzA4NzM2LCAgICAgMTE1MiwgICAgICAzMzEsIDB4MWY3MmE3N2MKKzAsICAgICAzMDk4ODgsICAgICAzMDk4ODgsICAgICAxMTUyLCAgICAgIDM1MywgMHhlMjhiYTU4MworMCwgICAgIDMxMTA0MCwgICAgIDMxMTA0MCwgICAgIDExNTIsICAgICAgMzM3LCAweDcwYjY5OTY2CiswLCAgICAgMzEyMTkyLCAgICAgMzEyMTkyLCAgICAgMTE1MiwgICAgICAzNjEsIDB4YmU3M2ExMzMKKzAsICAgICAzMTMzNDQsICAgICAzMTMzNDQsICAgICAxMTUyLCAgICAgIDM2OSwgMHgzMDBhYjQ5MQorMCwgICAgIDMxNDQ5NiwgICAgIDMxNDQ5NiwgICAgIDExNTIsICAgICAgMzgxLCAweDU5MTNiZjc4CiswLCAgICAgMzE1NjQ4LCAgICAgMzE1NjQ4LCAgICAgMTE1MiwgICAgICAzNzIsIDB4NTQ0ZGFhMTEKKzAsICAgICAzMTY4MDAsICAgICAzMTY4MDAsICAgICAxMTUyLCAgICAgIDM3NiwgMHhkYzA0YmEyYgorMCwgICAgIDMxNzk1MiwgICAgIDMxNzk1MiwgICAgIDExNTIsICAgICAgMzM3LCAweGMzZDA5NWY1CiswLCAgICAgMzE5MTA0LCAgICAgMzE5MTA0LCAgICAgMTE1MiwgICAgICAzNDUsIDB4MzA2ZGExYzEKKzAsICAgICAzMjAyNTYsICAgICAzMjAyNTYsICAgICAxMTUyLCAgICAgIDM3NCwgMHg4Mjk3YjI5ZQorMCwgICAgIDMyMTQwOCwgICAgIDMyMTQwOCwgICAgIDExNTIsICAgICAgMzQ3LCAweGU3ZjJhMzNlCiswLCAgICAgMzIyNTYwLCAgICAgMzIyNTYwLCAgICAgMTE1MiwgICAgICAzNjQsIDB4OWE3ZWI0MGMKKzAsICAgICAzMjM3MTIsICAgICAzMjM3MTIsICAgICAxMTUyLCAgICAgIDM1OCwgMHgzYmRjYTg3YworMCwgICAgIDMyNDg2NCwgICAgIDMyNDg2NCwgICAgIDExNTIsICAgICAgMzM5LCAweDlkNDhhMzE0CiswLCAgICAgMzI2MDE2LCAgICAgMzI2MDE2LCAgICAgMTE1MiwgICAgICAzNzAsIDB4NzhhNmFjYjEKKzAsICAgICAzMjcxNjgsICAgICAzMjcxNjgsICAgICAxMTUyLCAgICAgIDM1MywgMHhiODc2YTljYQorMCwgICAgIDMyODMyMCwgICAgIDMyODMyMCwgICAgIDExNTIsICAgICAgMzU1LCAweDgyZWFiMWNmCiswLCAgICAgMzI5NDcyLCAgICAgMzI5NDcyLCAgICAgMTE1MiwgICAgICAzNjAsIDB4YThjZWEyYTkKKzAsICAgICAzMzA2MjQsICAgICAzMzA2MjQsICAgICAxMTUyLCAgICAgIDU0NywgMHg2MTc2YWYyNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LW5lZy1maXJzdHB0cy1kaXNjYXJkIGIvdGVzdHMvcmVmL2ZhdGUvbW92LW5lZy1maXJzdHB0cy1kaXNjYXJkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTgyZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3YtbmVnLWZpcnN0cHRzLWRpc2NhcmQKQEAgLTAsMCArMSwzIEBACitbU1RSRUFNXQorc3RhcnRfdGltZT1OL0EKK1svU1RSRUFNXQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LW5lZy1maXJzdHB0cy1kaXNjYXJkLWZyYW1lcyBiL3Rlc3RzL3JlZi9mYXRlL21vdi1uZWctZmlyc3RwdHMtZGlzY2FyZC1mcmFtZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiNTliMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21vdi1uZWctZmlyc3RwdHMtZGlzY2FyZC1mcmFtZXMKQEAgLTAsMCArMSwyNCBAQAorI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCisjdmVyc2lvbjogMgorI2hhc2g6IE1ENQorI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCisjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgMWU1NTI2M2IzNTliNGM5OWMzNDYzNjU1YTExMjBmMTEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgY2UzM2VmZWE4MTA2NGU3YzIzZGViNTdkYzRjMjE5OTUKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDExNTIwMCwgNDIyMzRmMjVkNjE5MWFiMTNjMzY3NmE3OTM3YzkyMWIKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDExNTIwMCwgZWFiMmNjYjIyN2M2NmNiYTRjOWZlYjhjZGJmMjhlZjgKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgYzg4MTZlMGIxNTFiMmM4OTIxNjNlMzUwODY5MTg1MjAKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDExNTIwMCwgYzYzM2Y1NjA0Yzg2NTExNjVkNTUxZWU4OGZiNGNkOTIKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDExNTIwMCwgNWYzZjg1MzBkNzIwZmVmM2FjNGM5MzdlN2Y0ODhlYTcKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgYmUyNGE1ODM5MDljYTkyMDA4YjY0MmYzOWJlMDI2ODUKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDExNTIwMCwgODM4NzJhNmU1YzMzNjlmZTc2ZjY4NGRlMzFiZDlhMzYKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDExNTIwMCwgNDYyOWQ2ZWI2NTY4ODNiMzM3ZThlMGIzODFmMmRiOGQKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgZjZiZWM1NWJjMDI2NDQwZDIzYTQ0Yjk0ODkwMGU3ODUKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDExNTIwMCwgN2UxMmU4MTEzOTE2MzA1Yzc5ZTVkMDgzNTRhY2M5YWUKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDExNTIwMCwgZDMxNWMwMDkzNTM2NjQyZDM0MGVhNTBkZTNiMmJmYmIKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDExNTIwMCwgM2QxMmIyNGFhZWQ3MmJmYWRhNGExYTNlNWUwMjk0NWEKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDExNTIwMCwgMDcwZDZiODkzNWMxMTMwNGQ4Zjk1MjBjNDQwMWExMzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21vdi1zcGhlcmljYWwtbW9ubyBiL3Rlc3RzL3JlZi9mYXRlL21vdi1zcGhlcmljYWwtbW9ubwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDU3ZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbW92LXNwaGVyaWNhbC1tb25vCkBAIC0wLDAgKzEsMTggQEAKK1tTVFJFQU1dCitbU0lERV9EQVRBXQorc2lkZV9kYXRhX3R5cGU9U3RlcmVvIDNECit0eXBlPTJECitpbnZlcnRlZD0wCitbL1NJREVfREFUQV0KK1tTSURFX0RBVEFdCitzaWRlX2RhdGFfdHlwZT1TcGhlcmljYWwgTWFwcGluZworcHJvamVjdGlvbj10aWxlZCBlcXVpcmVjdGFuZ3VsYXIKK2JvdW5kX2xlZnQ9MTQ4Citib3VuZF90b3A9NzMKK2JvdW5kX3JpZ2h0PTE0NworYm91bmRfYm90dG9tPTcyCit5YXc9NDUKK3BpdGNoPTMwCityb2xsPTE1CitbL1NJREVfREFUQV0KK1svU1RSRUFNXQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92LXpvbWJpZSBiL3Rlc3RzL3JlZi9mYXRlL21vdi16b21iaWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmMmFkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21vdi16b21iaWUKQEAgLTAsMCArMSwxMzMgQEAKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0wfHB0c190aW1lPTAuMDAwMDAwfGR0cz0tMzAwNHxkdHNfdGltZT0tMC4wMzMzNzh8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQxMzN8cG9zPTExMzA5fGZsYWdzPUtfCitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NTQ0MHxwdHNfdGltZT0wLjA2MDQ0NHxkdHM9LTU2N3xkdHNfdGltZT0tMC4wMDYzMDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTEwNzd8cG9zPTE1NDQyfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0xfHBrdF9wdHM9MHxwa3RfcHRzX3RpbWU9MC4wMDAwMDB8cGt0X2R0cz0tNTY3fHBrdF9kdHNfdGltZT0tMC4wMDYzMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTB8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wMDAwMDB8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0xMTMwOXxwa3Rfc2l6ZT00MTMzfHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9SXxjb2RlZF9waWN0dXJlX251bWJlcj0wfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTI0Mzd8cHRzX3RpbWU9MC4wMjcwNzh8ZHRzPTI0MzZ8ZHRzX3RpbWU9MC4wMjcwNjd8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTM1NXxwb3M9MTY1MTl8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz0yNDM3fHBrdF9wdHNfdGltZT0wLjAyNzA3OHxwa3RfZHRzPTI0MzZ8cGt0X2R0c190aW1lPTAuMDI3MDY3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0yNDM3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDI3MDc4fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9MTY1MTl8cGt0X3NpemU9MzU1fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj0yfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTExNDQ2fHB0c190aW1lPTAuMTI3MTc4fGR0cz01NDM5fGR0c190aW1lPTAuMDYwNDMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMTEwfHBvcz0xNjg3NHxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTU0NDB8cGt0X3B0c190aW1lPTAuMDYwNDQ0fHBrdF9kdHM9NTQzOXxwa3RfZHRzX3RpbWU9MC4wNjA0MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTU0NDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4wNjA0NDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0xNTQ0Mnxwa3Rfc2l6ZT0xMDc3fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj0xfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTg0NDN8cHRzX3RpbWU9MC4wOTM4MTF8ZHRzPTg0NDJ8ZHRzX3RpbWU9MC4wOTM4MDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTQzMHxwb3M9MTc5ODR8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz04NDQzfHBrdF9wdHNfdGltZT0wLjA5MzgxMXxwa3RfZHRzPTg0NDJ8cGt0X2R0c190aW1lPTAuMDkzODAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD04NDQzfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMDkzODExfHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9MTc5ODR8cGt0X3NpemU9NDMwfHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj00fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE3NDUyfHB0c190aW1lPTAuMTkzOTExfGR0cz0xMTQ0NXxkdHNfdGltZT0wLjEyNzE2N3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTQ4NXxwb3M9MTg0MTR8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz0xMTQ0Nnxwa3RfcHRzX3RpbWU9MC4xMjcxNzh8cGt0X2R0cz0xMTQ0NXxwa3RfZHRzX3RpbWU9MC4xMjcxNjd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTExNDQ2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMTI3MTc4fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9MTY4NzR8cGt0X3NpemU9MTExMHx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9M3xkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNDQ0OXxwdHNfdGltZT0wLjE2MDU0NHxkdHM9MTQ0NDh8ZHRzX3RpbWU9MC4xNjA1MzN8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTEwMDV8cG9zPTE5ODk5fGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTQ0NDl8cGt0X3B0c190aW1lPTAuMTYwNTQ0fHBrdF9kdHM9MTQ0NDh8cGt0X2R0c190aW1lPTAuMTYwNTMzfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xNDQ0OXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjE2MDU0NHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTE5ODk5fHBrdF9zaXplPTEwMDV8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTZ8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MjM0NTh8cHRzX3RpbWU9MC4yNjA2NDR8ZHRzPTE3NDUxfGR0c190aW1lPTAuMTkzOTAwfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xOTc2fHBvcz0yMDkwNHxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE3NDUyfHBrdF9wdHNfdGltZT0wLjE5MzkxMXxwa3RfZHRzPTE3NDUxfHBrdF9kdHNfdGltZT0wLjE5MzkwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTc0NTJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4xOTM5MTF8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0xODQxNHxwa3Rfc2l6ZT0xNDg1fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj01fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTIwNDU1fHB0c190aW1lPTAuMjI3Mjc4fGR0cz0yMDQ1NHxkdHNfdGltZT0wLjIyNzI2N3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9OTA0fHBvcz0yMjg4MHxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTIwNDU1fHBrdF9wdHNfdGltZT0wLjIyNzI3OHxwa3RfZHRzPTIwNDU0fHBrdF9kdHNfdGltZT0wLjIyNzI2N3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjA0NTV8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4yMjcyNzh8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0yMjg4MHxwa3Rfc2l6ZT05MDR8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTh8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9Mjk0NjR8cHRzX3RpbWU9MC4zMjczNzh8ZHRzPTIzNDU3fGR0c190aW1lPTAuMjYwNjMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMjU0fHBvcz0yMzc4NHxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTIzNDU4fHBrdF9wdHNfdGltZT0wLjI2MDY0NHxwa3RfZHRzPTIzNDU3fHBrdF9kdHNfdGltZT0wLjI2MDYzM3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjM0NTh8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4yNjA2NDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0yMDkwNHxwa3Rfc2l6ZT0xOTc2fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj03fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTI2NDYxfHB0c190aW1lPTAuMjk0MDExfGR0cz0yNjQ2MHxkdHNfdGltZT0wLjI5NDAwMHxkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NzAwfHBvcz0yNTAzOHxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTI2NDYxfHBrdF9wdHNfdGltZT0wLjI5NDAxMXxwa3RfZHRzPTI2NDYwfHBrdF9kdHNfdGltZT0wLjI5NDAwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MjY0NjF8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC4yOTQwMTF8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0yNTAzOHxwa3Rfc2l6ZT03MDB8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTEwfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTM1NDcwfHB0c190aW1lPTAuMzk0MTExfGR0cz0yOTQ2M3xkdHNfdGltZT0wLjMyNzM2N3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTMxMXxwb3M9MjU3Mzh8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz0yOTQ2NHxwa3RfcHRzX3RpbWU9MC4zMjczNzh8cGt0X2R0cz0yOTQ2M3xwa3RfZHRzX3RpbWU9MC4zMjczNjd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTI5NDY0fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMzI3Mzc4fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9MjM3ODR8cGt0X3NpemU9MTI1NHx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9OXxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0zMjQ2N3xwdHNfdGltZT0wLjM2MDc0NHxkdHM9MzI0NjZ8ZHRzX3RpbWU9MC4zNjA3MzN8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTYzMXxwb3M9MjcwNDl8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz0zMjQ2N3xwa3RfcHRzX3RpbWU9MC4zNjA3NDR8cGt0X2R0cz0zMjQ2Nnxwa3RfZHRzX3RpbWU9MC4zNjA3MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTMyNDY3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuMzYwNzQ0fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9MjcwNDl8cGt0X3NpemU9NjMxfHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj0xMnxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz00MTQ3NnxwdHNfdGltZT0wLjQ2MDg0NHxkdHM9MzU0Njl8ZHRzX3RpbWU9MC4zOTQxMDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTEyOTZ8cG9zPTI3NjgwfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MzU0NzB8cGt0X3B0c190aW1lPTAuMzk0MTExfHBrdF9kdHM9MzU0Njl8cGt0X2R0c190aW1lPTAuMzk0MTAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0zNTQ3MHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjM5NDExMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTI1NzM4fHBrdF9zaXplPTEzMTF8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTExfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTM4NDczfHB0c190aW1lPTAuNDI3NDc4fGR0cz0zODQ3MnxkdHNfdGltZT0wLjQyNzQ2N3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NDY2fHBvcz0yODk3NnxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTM4NDczfHBrdF9wdHNfdGltZT0wLjQyNzQ3OHxwa3RfZHRzPTM4NDcyfHBrdF9kdHNfdGltZT0wLjQyNzQ2N3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9Mzg0NzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC40Mjc0Nzh8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0yODk3Nnxwa3Rfc2l6ZT00NjZ8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTE0fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTQ3NDgyfHB0c190aW1lPTAuNTI3NTc4fGR0cz00MTQ3NXxkdHNfdGltZT0wLjQ2MDgzM3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTYzOHxwb3M9Mjk0NDJ8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz00MTQ3Nnxwa3RfcHRzX3RpbWU9MC40NjA4NDR8cGt0X2R0cz00MTQ3NXxwa3RfZHRzX3RpbWU9MC40NjA4MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTQxNDc2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuNDYwODQ0fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9Mjc2ODB8cGt0X3NpemU9MTI5Nnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9MTN8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NDQ0Nzl8cHRzX3RpbWU9MC40OTQyMTF8ZHRzPTQ0NDc4fGR0c190aW1lPTAuNDk0MjAwfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT05MDd8cG9zPTMxMDgwfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9NDQ0Nzl8cGt0X3B0c190aW1lPTAuNDk0MjExfHBrdF9kdHM9NDQ0Nzh8cGt0X2R0c190aW1lPTAuNDk0MjAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD00NDQ3OXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjQ5NDIxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTMxMDgwfHBrdF9zaXplPTkwN3x3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9MTZ8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NTM0ODh8cHRzX3RpbWU9MC41OTQzMTF8ZHRzPTQ3NDgxfGR0c190aW1lPTAuNTI3NTY3fGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMzYyfHBvcz0zMTk4N3xmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTQ3NDgyfHBrdF9wdHNfdGltZT0wLjUyNzU3OHxwa3RfZHRzPTQ3NDgxfHBrdF9kdHNfdGltZT0wLjUyNzU2N3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9NDc0ODJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC41Mjc1Nzh8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0yOTQ0Mnxwa3Rfc2l6ZT0xNjM4fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj0xNXxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz01MDQ4NXxwdHNfdGltZT0wLjU2MDk0NHxkdHM9NTA0ODR8ZHRzX3RpbWU9MC41NjA5MzN8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTY4Mnxwb3M9MzMzNDl8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz01MDQ4NXxwa3RfcHRzX3RpbWU9MC41NjA5NDR8cGt0X2R0cz01MDQ4NHxwa3RfZHRzX3RpbWU9MC41NjA5MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTUwNDg1fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuNTYwOTQ0fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9MzMzNDl8cGt0X3NpemU9NjgyfHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj0xOHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz01OTQ5NHxwdHNfdGltZT0wLjY2MTA0NHxkdHM9NTM0ODd8ZHRzX3RpbWU9MC41OTQzMDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI5MTd8cG9zPTM0MDMxfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9NTM0ODh8cGt0X3B0c190aW1lPTAuNTk0MzExfHBrdF9kdHM9NTM0ODd8cGt0X2R0c190aW1lPTAuNTk0MzAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD01MzQ4OHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjU5NDMxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTMxOTg3fHBrdF9zaXplPTEzNjJ8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTE3fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTU2NDkxfHB0c190aW1lPTAuNjI3Njc4fGR0cz01NjQ5MHxkdHNfdGltZT0wLjYyNzY2N3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTE3NHxwb3M9MzY5NDh8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz01NjQ5MXxwa3RfcHRzX3RpbWU9MC42Mjc2Nzh8cGt0X2R0cz01NjQ5MHxwa3RfZHRzX3RpbWU9MC42Mjc2Njd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTU2NDkxfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuNjI3Njc4fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9MzY5NDh8cGt0X3NpemU9MTE3NHx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9MjB8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NjU1MDB8cHRzX3RpbWU9MC43Mjc3Nzh8ZHRzPTU5NDkzfGR0c190aW1lPTAuNjYxMDMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzQ4fHBvcz0zODEyMnxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTU5NDk0fHBrdF9wdHNfdGltZT0wLjY2MTA0NHxwa3RfZHRzPTU5NDkzfHBrdF9kdHNfdGltZT0wLjY2MTAzM3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9NTk0OTR8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC42NjEwNDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz0zNDAzMXxwa3Rfc2l6ZT0yOTE3fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj0xOXxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz02MjQ5N3xwdHNfdGltZT0wLjY5NDQxMXxkdHM9NjI0OTZ8ZHRzX3RpbWU9MC42OTQ0MDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTkyNnxwb3M9Mzk4NzB8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz02MjQ5N3xwa3RfcHRzX3RpbWU9MC42OTQ0MTF8cGt0X2R0cz02MjQ5Nnxwa3RfZHRzX3RpbWU9MC42OTQ0MDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTYyNDk3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuNjk0NDExfHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9Mzk4NzB8cGt0X3NpemU9OTI2fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj0yMnxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz02ODUwM3xwdHNfdGltZT0wLjc2MTE0NHxkdHM9NjU0OTl8ZHRzX3RpbWU9MC43Mjc3Njd8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTkxOHxwb3M9NDA3OTZ8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz02NTUwMHxwa3RfcHRzX3RpbWU9MC43Mjc3Nzh8cGt0X2R0cz02NTQ5OXxwa3RfZHRzX3RpbWU9MC43Mjc3Njd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTY1NTAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuNzI3Nzc4fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9MzgxMjJ8cGt0X3NpemU9MTc0OHx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9MjF8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NzE1MDZ8cHRzX3RpbWU9MC43OTQ1MTF8ZHRzPTY4NTAyfGR0c190aW1lPTAuNzYxMTMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0zODQ2fHBvcz00MTcxNHxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTY4NTAzfHBrdF9wdHNfdGltZT0wLjc2MTE0NHxwa3RfZHRzPTY4NTAyfHBrdF9kdHNfdGltZT0wLjc2MTEzM3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9Njg1MDN8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC43NjExNDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz00MDc5Nnxwa3Rfc2l6ZT05MTh8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTIzfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTc3NTEyfHB0c190aW1lPTAuODYxMjQ0fGR0cz03MTUwNXxkdHNfdGltZT0wLjc5NDUwMHxkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTkzMnxwb3M9NDU1NjB8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz03MTUwNnxwa3RfcHRzX3RpbWU9MC43OTQ1MTF8cGt0X2R0cz03MTUwNXxwa3RfZHRzX3RpbWU9MC43OTQ1MDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTcxNTA2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuNzk0NTExfHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9NDE3MTR8cGt0X3NpemU9Mzg0Nnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUl8Y29kZWRfcGljdHVyZV9udW1iZXI9MjR8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9NzQ1MDl8cHRzX3RpbWU9MC44Mjc4Nzh8ZHRzPTc0NTA4fGR0c190aW1lPTAuODI3ODY3fGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMTU5fHBvcz00NzQ5MnxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTc0NTA5fHBrdF9wdHNfdGltZT0wLjgyNzg3OHxwa3RfZHRzPTc0NTA4fHBrdF9kdHNfdGltZT0wLjgyNzg2N3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9NzQ1MDl8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC44Mjc4Nzh8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz00NzQ5Mnxwa3Rfc2l6ZT0xMTU5fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj0yNnxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz04MzUxOHxwdHNfdGltZT0wLjkyNzk3OHxkdHM9Nzc1MTF8ZHRzX3RpbWU9MC44NjEyMzN8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE1MjJ8cG9zPTQ4NjUxfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9Nzc1MTJ8cGt0X3B0c190aW1lPTAuODYxMjQ0fHBrdF9kdHM9Nzc1MTF8cGt0X2R0c190aW1lPTAuODYxMjMzfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD03NzUxMnxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjg2MTI0NHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTQ1NTYwfHBrdF9zaXplPTE5MzJ8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTI1fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTgwNTE1fHB0c190aW1lPTAuODk0NjExfGR0cz04MDUxNHxkdHNfdGltZT0wLjg5NDYwMHxkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9NzE5fHBvcz01MDE3M3xmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTgwNTE1fHBrdF9wdHNfdGltZT0wLjg5NDYxMXxwa3RfZHRzPTgwNTE0fHBrdF9kdHNfdGltZT0wLjg5NDYwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9ODA1MTV8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC44OTQ2MTF8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz01MDE3M3xwa3Rfc2l6ZT03MTl8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTI4fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTg5NTI0fHB0c190aW1lPTAuOTk0NzExfGR0cz04MzUxN3xkdHNfdGltZT0wLjkyNzk2N3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTcwMHxwb3M9NTA4OTJ8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz04MzUxOHxwa3RfcHRzX3RpbWU9MC45Mjc5Nzh8cGt0X2R0cz04MzUxN3xwa3RfZHRzX3RpbWU9MC45Mjc5Njd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTgzNTE4fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTAuOTI3OTc4fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9NDg2NTF8cGt0X3NpemU9MTUyMnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9Mjd8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9ODY1MjF8cHRzX3RpbWU9MC45NjEzNDR8ZHRzPTg2NTIwfGR0c190aW1lPTAuOTYxMzMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMDk5fHBvcz01MjU5MnxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTg2NTIxfHBrdF9wdHNfdGltZT0wLjk2MTM0NHxwa3RfZHRzPTg2NTIwfHBrdF9kdHNfdGltZT0wLjk2MTMzM3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9ODY1MjF8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MC45NjEzNDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz01MjU5Mnxwa3Rfc2l6ZT0xMDk5fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj0zMHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz05NTUzMHxwdHNfdGltZT0xLjA2MTQ0NHxkdHM9ODk1MjN8ZHRzX3RpbWU9MC45OTQ3MDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI1NTh8cG9zPTUzNjkxfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9ODk1MjR8cGt0X3B0c190aW1lPTAuOTk0NzExfHBrdF9kdHM9ODk1MjN8cGt0X2R0c190aW1lPTAuOTk0NzAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD04OTUyNHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0wLjk5NDcxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTUwODkyfHBrdF9zaXplPTE3MDB8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTI5fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTkyNTI3fHB0c190aW1lPTEuMDI4MDc4fGR0cz05MjUyNnxkdHNfdGltZT0xLjAyODA2N3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTAwOHxwb3M9NTYyNDl8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz05MjUyN3xwa3RfcHRzX3RpbWU9MS4wMjgwNzh8cGt0X2R0cz05MjUyNnxwa3RfZHRzX3RpbWU9MS4wMjgwNjd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTkyNTI3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTEuMDI4MDc4fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9NTYyNDl8cGt0X3NpemU9MTAwOHx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9MzJ8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTAxNTM2fHB0c190aW1lPTEuMTI4MTc4fGR0cz05NTUyOXxkdHNfdGltZT0xLjA2MTQzM3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTIzNnxwb3M9NTcyNTd8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz05NTUzMHxwa3RfcHRzX3RpbWU9MS4wNjE0NDR8cGt0X2R0cz05NTUyOXxwa3RfZHRzX3RpbWU9MS4wNjE0MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTk1NTMwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTEuMDYxNDQ0fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9NTM2OTF8cGt0X3NpemU9MjU1OHx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9MzF8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9OTg1MzN8cHRzX3RpbWU9MS4wOTQ4MTF8ZHRzPTk4NTMyfGR0c190aW1lPTEuMDk0ODAwfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT02MDd8cG9zPTU4NDkzfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9OTg1MzN8cGt0X3B0c190aW1lPTEuMDk0ODExfHBrdF9kdHM9OTg1MzJ8cGt0X2R0c190aW1lPTEuMDk0ODAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD05ODUzM3xiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjA5NDgxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTU4NDkzfHBrdF9zaXplPTYwN3x3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9MzR8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTA3NTQyfHB0c190aW1lPTEuMTk0OTExfGR0cz0xMDE1MzV8ZHRzX3RpbWU9MS4xMjgxNjd8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE4ODN8cG9zPTU5MTAwfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTAxNTM2fHBrdF9wdHNfdGltZT0xLjEyODE3OHxwa3RfZHRzPTEwMTUzNXxwa3RfZHRzX3RpbWU9MS4xMjgxNjd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEwMTUzNnxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjEyODE3OHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTU3MjU3fHBrdF9zaXplPTEyMzZ8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTMzfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTEwNDUzOXxwdHNfdGltZT0xLjE2MTU0NHxkdHM9MTA0NTM4fGR0c190aW1lPTEuMTYxNTMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT04OTN8cG9zPTYwOTgzfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTA0NTM5fHBrdF9wdHNfdGltZT0xLjE2MTU0NHxwa3RfZHRzPTEwNDUzOHxwa3RfZHRzX3RpbWU9MS4xNjE1MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEwNDUzOXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjE2MTU0NHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTYwOTgzfHBrdF9zaXplPTg5M3x3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9MzZ8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTEzNTQ4fHB0c190aW1lPTEuMjYxNjQ0fGR0cz0xMDc1NDF8ZHRzX3RpbWU9MS4xOTQ5MDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTEzMDV8cG9zPTYxODc2fGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTA3NTQyfHBrdF9wdHNfdGltZT0xLjE5NDkxMXxwa3RfZHRzPTEwNzU0MXxwa3RfZHRzX3RpbWU9MS4xOTQ5MDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEwNzU0MnxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjE5NDkxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTU5MTAwfHBrdF9zaXplPTE4ODN8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTM1fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTExMDU0NXxwdHNfdGltZT0xLjIyODI3OHxkdHM9MTEwNTQ0fGR0c190aW1lPTEuMjI4MjY3fGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00NzJ8cG9zPTYzMTgxfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTEwNTQ1fHBrdF9wdHNfdGltZT0xLjIyODI3OHxwa3RfZHRzPTExMDU0NHxwa3RfZHRzX3RpbWU9MS4yMjgyNjd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTExMDU0NXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjIyODI3OHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTYzMTgxfHBrdF9zaXplPTQ3Mnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9Mzh8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTE5NTU0fHB0c190aW1lPTEuMzI4Mzc4fGR0cz0xMTM1NDd8ZHRzX3RpbWU9MS4yNjE2MzN8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE0MTF8cG9zPTYzNjUzfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTEzNTQ4fHBrdF9wdHNfdGltZT0xLjI2MTY0NHxwa3RfZHRzPTExMzU0N3xwa3RfZHRzX3RpbWU9MS4yNjE2MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTExMzU0OHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjI2MTY0NHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTYxODc2fHBrdF9zaXplPTEzMDV8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTM3fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTExNjU1MXxwdHNfdGltZT0xLjI5NTAxMXxkdHM9MTE2NTUwfGR0c190aW1lPTEuMjk1MDAwfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT02MTZ8cG9zPTY1MDY0fGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTE2NTUxfHBrdF9wdHNfdGltZT0xLjI5NTAxMXxwa3RfZHRzPTExNjU1MHxwa3RfZHRzX3RpbWU9MS4yOTUwMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTExNjU1MXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjI5NTAxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTY1MDY0fHBrdF9zaXplPTYxNnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9NDB8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTI1NTYwfHB0c190aW1lPTEuMzk1MTExfGR0cz0xMTk1NTN8ZHRzX3RpbWU9MS4zMjgzNjd8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTEyOTF8cG9zPTY1NjgwfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTE5NTU0fHBrdF9wdHNfdGltZT0xLjMyODM3OHxwa3RfZHRzPTExOTU1M3xwa3RfZHRzX3RpbWU9MS4zMjgzNjd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTExOTU1NHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjMyODM3OHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTYzNjUzfHBrdF9zaXplPTE0MTF8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTM5fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTEyMjU1N3xwdHNfdGltZT0xLjM2MTc0NHxkdHM9MTIyNTU2fGR0c190aW1lPTEuMzYxNzMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00NzB8cG9zPTY2OTcxfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTIyNTU3fHBrdF9wdHNfdGltZT0xLjM2MTc0NHxwa3RfZHRzPTEyMjU1Nnxwa3RfZHRzX3RpbWU9MS4zNjE3MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEyMjU1N3xiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjM2MTc0NHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTY2OTcxfHBrdF9zaXplPTQ3MHx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9NDJ8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTMxNTY2fHB0c190aW1lPTEuNDYxODQ0fGR0cz0xMjU1NTl8ZHRzX3RpbWU9MS4zOTUxMDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE5Nzd8cG9zPTY3NDQxfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTI1NTYwfHBrdF9wdHNfdGltZT0xLjM5NTExMXxwa3RfZHRzPTEyNTU1OXxwa3RfZHRzX3RpbWU9MS4zOTUxMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEyNTU2MHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjM5NTExMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTY1NjgwfHBrdF9zaXplPTEyOTF8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTQxfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTEyODU2M3xwdHNfdGltZT0xLjQyODQ3OHxkdHM9MTI4NTYyfGR0c190aW1lPTEuNDI4NDY3fGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT00MzZ8cG9zPTY5NDE4fGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTI4NTYzfHBrdF9wdHNfdGltZT0xLjQyODQ3OHxwa3RfZHRzPTEyODU2Mnxwa3RfZHRzX3RpbWU9MS40Mjg0Njd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEyODU2M3xiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjQyODQ3OHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTY5NDE4fHBrdF9zaXplPTQzNnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9NDR8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTM3NTcyfHB0c190aW1lPTEuNTI4NTc4fGR0cz0xMzE1NjV8ZHRzX3RpbWU9MS40NjE4MzN8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTI1NjZ8cG9zPTY5ODU0fGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTMxNTY2fHBrdF9wdHNfdGltZT0xLjQ2MTg0NHxwa3RfZHRzPTEzMTU2NXxwa3RfZHRzX3RpbWU9MS40NjE4MzN8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEzMTU2NnxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjQ2MTg0NHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTY3NDQxfHBrdF9zaXplPTE5Nzd8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTQzfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTEzNDU2OXxwdHNfdGltZT0xLjQ5NTIxMXxkdHM9MTM0NTY4fGR0c190aW1lPTEuNDk1MjAwfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT04ODZ8cG9zPTcyNDIwfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTM0NTY5fHBrdF9wdHNfdGltZT0xLjQ5NTIxMXxwa3RfZHRzPTEzNDU2OHxwa3RfZHRzX3RpbWU9MS40OTUyMDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEzNDU2OXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjQ5NTIxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTcyNDIwfHBrdF9zaXplPTg4Nnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9NDZ8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTQwNTc1fHB0c190aW1lPTEuNTYxOTQ0fGR0cz0xMzc1NzF8ZHRzX3RpbWU9MS41Mjg1Njd8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTEzMzB8cG9zPTczMzA2fGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTM3NTcyfHBrdF9wdHNfdGltZT0xLjUyODU3OHxwa3RfZHRzPTEzNzU3MXxwa3RfZHRzX3RpbWU9MS41Mjg1Njd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTEzNzU3MnxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjUyODU3OHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTY5ODU0fHBrdF9zaXplPTI1NjZ8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTQ1fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE0MzU3OHxwdHNfdGltZT0xLjU5NTMxMXxkdHM9MTQwNTc0fGR0c190aW1lPTEuNTYxOTMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0yMjI3fHBvcz03NDYzNnxmbGFncz1LXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE0MDU3NXxwa3RfcHRzX3RpbWU9MS41NjE5NDR8cGt0X2R0cz0xNDA1NzR8cGt0X2R0c190aW1lPTEuNTYxOTMzfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xNDA1NzV8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MS41NjE5NDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz03MzMwNnxwa3Rfc2l6ZT0xMzMwfHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj00N3xkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNDk1ODR8cHRzX3RpbWU9MS42NjIwNDR8ZHRzPTE0MzU3N3xkdHNfdGltZT0xLjU5NTMwMHxkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjIxMHxwb3M9NzY4NjN8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTF8cGt0X3B0cz0xNDM1Nzh8cGt0X3B0c190aW1lPTEuNTk1MzExfHBrdF9kdHM9MTQzNTc3fHBrdF9kdHNfdGltZT0xLjU5NTMwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTQzNTc4fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTEuNTk1MzExfHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9NzQ2MzZ8cGt0X3NpemU9MjIyN3x3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUl8Y29kZWRfcGljdHVyZV9udW1iZXI9NDh8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTQ2NTgxfHB0c190aW1lPTEuNjI4Njc4fGR0cz0xNDY1ODB8ZHRzX3RpbWU9MS42Mjg2Njd8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE0OTh8cG9zPTc5MDczfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTQ2NTgxfHBrdF9wdHNfdGltZT0xLjYyODY3OHxwa3RfZHRzPTE0NjU4MHxwa3RfZHRzX3RpbWU9MS42Mjg2Njd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTE0NjU4MXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjYyODY3OHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTc5MDczfHBrdF9zaXplPTE0OTh8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTUwfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE1NTU5MHxwdHNfdGltZT0xLjcyODc3OHxkdHM9MTQ5NTgzfGR0c190aW1lPTEuNjYyMDMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNzIxfHBvcz04MDU3MXxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE0OTU4NHxwa3RfcHRzX3RpbWU9MS42NjIwNDR8cGt0X2R0cz0xNDk1ODN8cGt0X2R0c190aW1lPTEuNjYyMDMzfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xNDk1ODR8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MS42NjIwNDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz03Njg2M3xwa3Rfc2l6ZT0yMjEwfHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj00OXxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNTI1ODd8cHRzX3RpbWU9MS42OTU0MTF8ZHRzPTE1MjU4NnxkdHNfdGltZT0xLjY5NTQwMHxkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTIzOHxwb3M9ODIyOTJ8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz0xNTI1ODd8cGt0X3B0c190aW1lPTEuNjk1NDExfHBrdF9kdHM9MTUyNTg2fHBrdF9kdHNfdGltZT0xLjY5NTQwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTUyNTg3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTEuNjk1NDExfHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9ODIyOTJ8cGt0X3NpemU9MTIzOHx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9NTJ8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTYxNTk2fHB0c190aW1lPTEuNzk1NTExfGR0cz0xNTU1ODl8ZHRzX3RpbWU9MS43Mjg3Njd8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE3NTN8cG9zPTgzNTMwfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTU1NTkwfHBrdF9wdHNfdGltZT0xLjcyODc3OHxwa3RfZHRzPTE1NTU4OXxwa3RfZHRzX3RpbWU9MS43Mjg3Njd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTE1NTU5MHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjcyODc3OHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTgwNTcxfHBrdF9zaXplPTE3MjF8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTUxfGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE1ODU5M3xwdHNfdGltZT0xLjc2MjE0NHxkdHM9MTU4NTkyfGR0c190aW1lPTEuNzYyMTMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMDE0fHBvcz04NTI4M3xmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE1ODU5M3xwa3RfcHRzX3RpbWU9MS43NjIxNDR8cGt0X2R0cz0xNTg1OTJ8cGt0X2R0c190aW1lPTEuNzYyMTMzfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xNTg1OTN8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MS43NjIxNDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz04NTI4M3xwa3Rfc2l6ZT0xMDE0fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj01NHxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNjc2MDJ8cHRzX3RpbWU9MS44NjIyNDR8ZHRzPTE2MTU5NXxkdHNfdGltZT0xLjc5NTUwMHxkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MjQwOHxwb3M9ODYyOTd8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz0xNjE1OTZ8cGt0X3B0c190aW1lPTEuNzk1NTExfHBrdF9kdHM9MTYxNTk1fHBrdF9kdHNfdGltZT0xLjc5NTUwMHxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTYxNTk2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTEuNzk1NTExfHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9ODM1MzB8cGt0X3NpemU9MTc1M3x3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9NTN8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTY0NTk5fHB0c190aW1lPTEuODI4ODc4fGR0cz0xNjQ1OTh8ZHRzX3RpbWU9MS44Mjg4Njd8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE3Mjd8cG9zPTg4NzA1fGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTY0NTk5fHBrdF9wdHNfdGltZT0xLjgyODg3OHxwa3RfZHRzPTE2NDU5OHxwa3RfZHRzX3RpbWU9MS44Mjg4Njd8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTE2NDU5OXxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjgyODg3OHxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTg4NzA1fHBrdF9zaXplPTE3Mjd8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTU2fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE3MzYwOHxwdHNfdGltZT0xLjkyODk3OHxkdHM9MTY3NjAxfGR0c190aW1lPTEuODYyMjMzfGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xNTA0fHBvcz05MDQzMnxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE2NzYwMnxwa3RfcHRzX3RpbWU9MS44NjIyNDR8cGt0X2R0cz0xNjc2MDF8cGt0X2R0c190aW1lPTEuODYyMjMzfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xNjc2MDJ8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MS44NjIyNDR8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz04NjI5N3xwa3Rfc2l6ZT0yNDA4fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj01NXxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNzA2MDV8cHRzX3RpbWU9MS44OTU2MTF8ZHRzPTE3MDYwNHxkdHNfdGltZT0xLjg5NTYwMHxkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9OTU3fHBvcz05MTkzNnxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE3MDYwNXxwa3RfcHRzX3RpbWU9MS44OTU2MTF8cGt0X2R0cz0xNzA2MDR8cGt0X2R0c190aW1lPTEuODk1NjAwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xNzA2MDV8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MS44OTU2MTF8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz05MTkzNnxwa3Rfc2l6ZT05NTd8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTU4fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE3OTYxNHxwdHNfdGltZT0xLjk5NTcxMXxkdHM9MTczNjA3fGR0c190aW1lPTEuOTI4OTY3fGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xODkwfHBvcz05Mjg5M3xmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE3MzYwOHxwa3RfcHRzX3RpbWU9MS45Mjg5Nzh8cGt0X2R0cz0xNzM2MDd8cGt0X2R0c190aW1lPTEuOTI4OTY3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xNzM2MDh8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9MS45Mjg5Nzh8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz05MDQzMnxwa3Rfc2l6ZT0xNTA0fHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9UHxjb2RlZF9waWN0dXJlX251bWJlcj01N3xkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xNzY2MTF8cHRzX3RpbWU9MS45NjIzNDR8ZHRzPTE3NjYxMHxkdHNfdGltZT0xLjk2MjMzM3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTIzOXxwb3M9OTQ3ODN8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz0xNzY2MTF8cGt0X3B0c190aW1lPTEuOTYyMzQ0fHBrdF9kdHM9MTc2NjEwfHBrdF9kdHNfdGltZT0xLjk2MjMzM3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTc2NjExfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTEuOTYyMzQ0fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9OTQ3ODN8cGt0X3NpemU9MTIzOXx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPUJ8Y29kZWRfcGljdHVyZV9udW1iZXI9NjB8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTg1NjIwfHB0c190aW1lPTIuMDYyNDQ0fGR0cz0xNzk2MTN8ZHRzX3RpbWU9MS45OTU3MDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTE4NTZ8cG9zPTk2MDIyfGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTc5NjE0fHBrdF9wdHNfdGltZT0xLjk5NTcxMXxwa3RfZHRzPTE3OTYxM3xwa3RfZHRzX3RpbWU9MS45OTU3MDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTE3OTYxNHxiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0xLjk5NTcxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTkyODkzfHBrdF9zaXplPTE4OTB8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1QfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTU5fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE4MjYxN3xwdHNfdGltZT0yLjAyOTA3OHxkdHM9MTgyNjE2fGR0c190aW1lPTIuMDI5MDY3fGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT0xMzAyfHBvcz05Nzg3OHxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE4MjYxN3xwa3RfcHRzX3RpbWU9Mi4wMjkwNzh8cGt0X2R0cz0xODI2MTZ8cGt0X2R0c190aW1lPTIuMDI5MDY3fGJlc3RfZWZmb3J0X3RpbWVzdGFtcD0xODI2MTd8YmVzdF9lZmZvcnRfdGltZXN0YW1wX3RpbWU9Mi4wMjkwNzh8cGt0X2R1cmF0aW9uPTMwMDN8cGt0X2R1cmF0aW9uX3RpbWU9MC4wMzMzNjd8cGt0X3Bvcz05Nzg3OHxwa3Rfc2l6ZT0xMzAyfHdpZHRoPTE2MHxoZWlnaHQ9MjQwfHBpeF9mbXQ9eXV2NDIwcHxzYW1wbGVfYXNwZWN0X3JhdGlvPTI6MXxwaWN0X3R5cGU9Qnxjb2RlZF9waWN0dXJlX251bWJlcj02MnxkaXNwbGF5X3BpY3R1cmVfbnVtYmVyPTB8aW50ZXJsYWNlZF9mcmFtZT0wfHRvcF9maWVsZF9maXJzdD0wfHJlcGVhdF9waWN0PTB8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y29sb3JfdHJhbnNmZXI9YnQ3MDl8Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK3BhY2tldHxjb2RlY190eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfHB0cz0xOTE2MjZ8cHRzX3RpbWU9Mi4xMjkxNzh8ZHRzPTE4NTYxOXxkdHNfdGltZT0yLjA2MjQzM3xkdXJhdGlvbj0zMDAzfGR1cmF0aW9uX3RpbWU9MC4wMzMzNjd8Y29udmVyZ2VuY2VfZHVyYXRpb249Ti9BfGNvbnZlcmdlbmNlX2R1cmF0aW9uX3RpbWU9Ti9BfHNpemU9MTY2Nnxwb3M9OTkxODB8ZmxhZ3M9X18KK2ZyYW1lfG1lZGlhX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8a2V5X2ZyYW1lPTB8cGt0X3B0cz0xODU2MjB8cGt0X3B0c190aW1lPTIuMDYyNDQ0fHBrdF9kdHM9MTg1NjE5fHBrdF9kdHNfdGltZT0yLjA2MjQzM3xiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTg1NjIwfGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTIuMDYyNDQ0fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9OTYwMjJ8cGt0X3NpemU9MTg1Nnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9NjF8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitwYWNrZXR8Y29kZWNfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxwdHM9MTg4NjIzfHB0c190aW1lPTIuMDk1ODExfGR0cz0xODg2MjJ8ZHRzX3RpbWU9Mi4wOTU4MDB8ZHVyYXRpb249MzAwM3xkdXJhdGlvbl90aW1lPTAuMDMzMzY3fGNvbnZlcmdlbmNlX2R1cmF0aW9uPU4vQXxjb252ZXJnZW5jZV9kdXJhdGlvbl90aW1lPU4vQXxzaXplPTk3NHxwb3M9MTAwODQ2fGZsYWdzPV9fCitmcmFtZXxtZWRpYV90eXBlPXZpZGVvfHN0cmVhbV9pbmRleD0wfGtleV9mcmFtZT0wfHBrdF9wdHM9MTg4NjIzfHBrdF9wdHNfdGltZT0yLjA5NTgxMXxwa3RfZHRzPTE4ODYyMnxwa3RfZHRzX3RpbWU9Mi4wOTU4MDB8YmVzdF9lZmZvcnRfdGltZXN0YW1wPTE4ODYyM3xiZXN0X2VmZm9ydF90aW1lc3RhbXBfdGltZT0yLjA5NTgxMXxwa3RfZHVyYXRpb249MzAwM3xwa3RfZHVyYXRpb25fdGltZT0wLjAzMzM2N3xwa3RfcG9zPTEwMDg0Nnxwa3Rfc2l6ZT05NzR8d2lkdGg9MTYwfGhlaWdodD0yNDB8cGl4X2ZtdD15dXY0MjBwfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfHBpY3RfdHlwZT1CfGNvZGVkX3BpY3R1cmVfbnVtYmVyPTY0fGRpc3BsYXlfcGljdHVyZV9udW1iZXI9MHxpbnRlcmxhY2VkX2ZyYW1lPTB8dG9wX2ZpZWxkX2ZpcnN0PTB8cmVwZWF0X3BpY3Q9MHxjb2xvcl9yYW5nZT10dnxjb2xvcl9zcGFjZT1zbXB0ZTE3MG18Y29sb3JfcHJpbWFyaWVzPXNtcHRlMTcwbXxjb2xvcl90cmFuc2Zlcj1idDcwOXxjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorcGFja2V0fGNvZGVjX3R5cGU9dmlkZW98c3RyZWFtX2luZGV4PTB8cHRzPTE5NzYzMnxwdHNfdGltZT0yLjE5NTkxMXxkdHM9MTkxNjI1fGR0c190aW1lPTIuMTI5MTY3fGR1cmF0aW9uPTMwMDN8ZHVyYXRpb25fdGltZT0wLjAzMzM2N3xjb252ZXJnZW5jZV9kdXJhdGlvbj1OL0F8Y29udmVyZ2VuY2VfZHVyYXRpb25fdGltZT1OL0F8c2l6ZT01ODB8cG9zPTEwMTgyMHxmbGFncz1fXworZnJhbWV8bWVkaWFfdHlwZT12aWRlb3xzdHJlYW1faW5kZXg9MHxrZXlfZnJhbWU9MHxwa3RfcHRzPTE5MTYyNnxwa3RfcHRzX3RpbWU9Mi4xMjkxNzh8cGt0X2R0cz1OL0F8cGt0X2R0c190aW1lPU4vQXxiZXN0X2VmZm9ydF90aW1lc3RhbXA9MTkxNjI2fGJlc3RfZWZmb3J0X3RpbWVzdGFtcF90aW1lPTIuMTI5MTc4fHBrdF9kdXJhdGlvbj0zMDAzfHBrdF9kdXJhdGlvbl90aW1lPTAuMDMzMzY3fHBrdF9wb3M9OTkxODB8cGt0X3NpemU9MTY2Nnx3aWR0aD0xNjB8aGVpZ2h0PTI0MHxwaXhfZm10PXl1djQyMHB8c2FtcGxlX2FzcGVjdF9yYXRpbz0yOjF8cGljdF90eXBlPVB8Y29kZWRfcGljdHVyZV9udW1iZXI9NjN8ZGlzcGxheV9waWN0dXJlX251bWJlcj0wfGludGVybGFjZWRfZnJhbWU9MHx0b3BfZmllbGRfZmlyc3Q9MHxyZXBlYXRfcGljdD0wfGNvbG9yX3JhbmdlPXR2fGNvbG9yX3NwYWNlPXNtcHRlMTcwbXxjb2xvcl9wcmltYXJpZXM9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNocm9tYV9sb2NhdGlvbj10b3BsZWZ0CitzdHJlYW18aW5kZXg9MHxjb2RlY19uYW1lPWgyNjR8cHJvZmlsZT03N3xjb2RlY190eXBlPXZpZGVvfGNvZGVjX3RpbWVfYmFzZT0yMTI1MjEvMTI3NDQwMDB8Y29kZWNfdGFnX3N0cmluZz1hdmMxfGNvZGVjX3RhZz0weDMxNjM3NjYxfHdpZHRoPTE2MHxoZWlnaHQ9MjQwfGNvZGVkX3dpZHRoPTE2MHxjb2RlZF9oZWlnaHQ9MjQwfGhhc19iX2ZyYW1lcz0xfHNhbXBsZV9hc3BlY3RfcmF0aW89MjoxfGRpc3BsYXlfYXNwZWN0X3JhdGlvPTQ6M3xwaXhfZm10PXl1djQyMHB8bGV2ZWw9MTJ8Y29sb3JfcmFuZ2U9dHZ8Y29sb3Jfc3BhY2U9c21wdGUxNzBtfGNvbG9yX3RyYW5zZmVyPWJ0NzA5fGNvbG9yX3ByaW1hcmllcz1zbXB0ZTE3MG18Y2hyb21hX2xvY2F0aW9uPXRvcGxlZnR8ZmllbGRfb3JkZXI9dW5rbm93bnx0aW1lY29kZT1OL0F8cmVmcz0yfGlzX2F2Yz10cnVlfG5hbF9sZW5ndGhfc2l6ZT00fGlkPU4vQXxyX2ZyYW1lX3JhdGU9MzAwMDAvMTAwMXxhdmdfZnJhbWVfcmF0ZT02MzcyMDAwLzIxMjUyMXx0aW1lX2Jhc2U9MS85MDAwMHxzdGFydF9wdHM9MHxzdGFydF90aW1lPTAuMDAwMDAwfGR1cmF0aW9uX3RzPTIxMjUyMDB8ZHVyYXRpb249MjMuNjEzMzMzfGJpdF9yYXRlPTMzMzg3NHxtYXhfYml0X3JhdGU9Ti9BfGJpdHNfcGVyX3Jhd19zYW1wbGU9OHxuYl9mcmFtZXM9NzA4fG5iX3JlYWRfZnJhbWVzPTY1fG5iX3JlYWRfcGFja2V0cz02NnxkaXNwb3NpdGlvbjpkZWZhdWx0PTF8ZGlzcG9zaXRpb246ZHViPTB8ZGlzcG9zaXRpb246b3JpZ2luYWw9MHxkaXNwb3NpdGlvbjpjb21tZW50PTB8ZGlzcG9zaXRpb246bHlyaWNzPTB8ZGlzcG9zaXRpb246a2FyYW9rZT0wfGRpc3Bvc2l0aW9uOmZvcmNlZD0wfGRpc3Bvc2l0aW9uOmhlYXJpbmdfaW1wYWlyZWQ9MHxkaXNwb3NpdGlvbjp2aXN1YWxfaW1wYWlyZWQ9MHxkaXNwb3NpdGlvbjpjbGVhbl9lZmZlY3RzPTB8ZGlzcG9zaXRpb246YXR0YWNoZWRfcGljPTB8ZGlzcG9zaXRpb246dGltZWRfdGh1bWJuYWlscz0wfHRhZzpyb3RhdGU9MHx0YWc6Y3JlYXRpb25fdGltZT0yMDA4LTA1LTEyVDIwOjU5OjI3LjAwMDAwMFp8dGFnOmxhbmd1YWdlPWVuZ3x0YWc6aGFuZGxlcl9uYW1lPUFwcGxlIEFsaWFzIERhdGEgSGFuZGxlcnx0YWc6ZW5jb2Rlcj1ILjI2NAorc2lkZV9kYXRhfHNpZGVfZGF0YV90eXBlPURpc3BsYXkgTWF0cml4fGRpc3BsYXltYXRyaXg9XG4wMDAwMDAwMDogICAgICAgMTMxMDcyICAgICAgICAgICAwICAgICAgICAgICAwXG4wMDAwMDAwMTogICAgICAgICAgICAwICAgICAgIDY1NTM2ICAgICAgICAgICAwXG4wMDAwMDAwMjogICAgICAgICAgICAwICAgICAgICAgICAwICAxMDczNzQxODI0XG58cm90YXRpb249MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbW92ZW5jIGIvdGVzdHMvcmVmL2ZhdGUvbW92ZW5jCmluZGV4IDg0NWVmNTQuLjg3Mjc5NmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21vdmVuYworKysgYi90ZXN0cy9yZWYvZmF0ZS9tb3ZlbmMKQEAgLTEsMjggKzEsMTUzIEBACi0yNDllMDJlMzY0NWVhNWNhMmM3NDM5N2M2MmM1MzMxNCAzMjY5IG5vbi1lbXB0eS1tb292Ci0zMjgxZmY2NjRlOWEwNmU1YTAzZWM2ZWExNzI5Njk2YyAzNzIxIG5vbi1lbXB0eS1tb292LWVsc3QKLWI0MDhhNTQ1YjE5NjNhNWVhODJjZjM3MjA4YjY2NTQ4IDM2Mjkgbm9uLWVtcHR5LW1vb3Ytbm8tZWxzdAotYTY2Yzc4NjAyMjI4MGMxZjY5YWQ3Yzk4YzcxOWZhNTMgNDQzNSBpc212Ci0xNzZhMzE1YTUzODVjYjJlMDgyZDg2M2UwZmIyMmJmMSAyODkxIGVtcHR5LW1vb3YKLTEwZWIzZmRmNmVkMTQwMGExZWVjNTA3NDY1MzcxNTlmIDMyODMgZW1wdHktbW9vdi1uby1lbHN0Ci1iY2Q0ZDZkMjJmODI4ZjEwNjFlMTNmM2FmNDU5NjQ0ZiAzMTE1IGVtcHR5LW1vb3Ytbm8tZWxzdC1uby1hZGp1c3QKLTE3NmEzMTVhNTM4NWNiMmUwODJkODYzZTBmYjIyYmYxIDI4OTEgZGVsYXktbW9vdgotMTM5OGM4MGYxZjVmZDdmOGUxMjdiYjViMTczMTEwMTYgMzIwMyBkZWxheS1tb292LWVsc3QKLWVkNmRkMGUwZmQ2ZDBkOWQxMTQ1YjIwMTY3NDMyNWY2IDIwOTggZGVsYXktbW9vdi1lbXB0eS10cmFjawotN2YxZGFiZDY4MDEzNTcwOGM2ZmYzNTllNGFiMjcxNjUgMjAwMSBkZWxheS1tb292LWVtcHR5LXRyYWNrLWZsdXNoCi0zOWQ3OThhYTExYTI2NWM3OTA2ZjllMTFkNGYzMDNjMCAxMTU5IGVtcHR5LW1vb3YtaGVhZGVyCit3cml0ZV9kYXRhIGxlbiAzNiwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCit3cml0ZV9kYXRhIGxlbiAyMzg5LCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDc4OCwgdGltZSAxMDAwMDAwLCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiAxMTAsIHRpbWUgbm9wdHMsIHR5cGUgdHJhaWxlciBhdG9tIC0KKzE3YTM3NjkxZWJhOGI4NThjZjE1ZTYwYWE5YTdkYmY3IDMzMjMgbm9uLWVtcHR5LW1vb3YKK3dyaXRlX2RhdGEgbGVuIDM2LCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIGZ0eXAKK3dyaXRlX2RhdGEgbGVuIDI3MjEsIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gOTA4LCB0aW1lIDk2NjY2NywgdHlwZSBzeW5jIGF0b20gbW9vZgord3JpdGVfZGF0YSBsZW4gMTEwLCB0aW1lIG5vcHRzLCB0eXBlIHRyYWlsZXIgYXRvbSAtCiswMDI2ZmZlMDU5YzA2YzU5MjAyMWY5NzJiZjJjNWU3OSAzNzc1IG5vbi1lbXB0eS1tb292LWVsc3QKK3dyaXRlX2RhdGEgbGVuIDM2LCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIGZ0eXAKK3dyaXRlX2RhdGEgbGVuIDI2MjksIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gOTA4LCB0aW1lIDEwMDAwMDAsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDExMCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorYzE4NGUxNjhhYzFlNWJiM2Q5YzcwZTU4MGFiNjE3OWMgMzY4MyBub24tZW1wdHktbW9vdi1uby1lbHN0Cit3cml0ZV9kYXRhIGxlbiAyMCwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCit3cml0ZV9kYXRhIGxlbiAxMTcxLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDcyOCwgdGltZSAwLCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA4MjgsIHRpbWUgbm9wdHMsIHR5cGUgdW5rbm93biBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDcyOCwgdGltZSAxMDEzMTA2LCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA4MTIsIHRpbWUgbm9wdHMsIHR5cGUgdW5rbm93biBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDE0OCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorMWYzN2MxYThlMDE2NTFlOGJlYmNkNjZmMDBiNmEyMjYgNDQzNSBpc212Cit3cml0ZV9kYXRhIGxlbiAzNiwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCit3cml0ZV9kYXRhIGxlbiAxMTIzLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDc5NiwgdGltZSAwLCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA3ODgsIHRpbWUgMTAwMDAwMCwgdHlwZSBzeW5jIGF0b20gbW9vZgord3JpdGVfZGF0YSBsZW4gMTQ4LCB0aW1lIG5vcHRzLCB0eXBlIHRyYWlsZXIgYXRvbSAtCitlZDg1MDZlYmZjZTRjNDE3MzIyMDVhZTI2YTQ3NTlmZCAyODkxIGVtcHR5LW1vb3YKK3dyaXRlX2RhdGEgbGVuIDM2LCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIGZ0eXAKK3dyaXRlX2RhdGEgbGVuIDExMjMsIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gMTA2OCwgdGltZSAwLCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA5MDgsIHRpbWUgMTAwMDAwMCwgdHlwZSBzeW5jIGF0b20gbW9vZgord3JpdGVfZGF0YSBsZW4gMTQ4LCB0aW1lIG5vcHRzLCB0eXBlIHRyYWlsZXIgYXRvbSAtCisxODQ0ZWU2ZDE5ZmQxZTZkYWYyNjU1NjMyY2YyNjMxMCAzMjgzIGVtcHR5LW1vb3Ytbm8tZWxzdAord3JpdGVfZGF0YSBsZW4gMzYsIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gZnR5cAord3JpdGVfZGF0YSBsZW4gMTEyMywgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSAtCit3cml0ZV9kYXRhIGxlbiA5MDAsIHRpbWUgLTMzMzMzLCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA5MDgsIHRpbWUgOTY2NjY3LCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiAxNDgsIHRpbWUgbm9wdHMsIHR5cGUgdHJhaWxlciBhdG9tIC0KKzEzOWIyN2RiZTJhODBjMmRjMDg4ZDBjNzU1ZjI2MDMzIDMxMTUgZW1wdHktbW9vdi1uby1lbHN0LW5vLWFkanVzdAord3JpdGVfZGF0YSBsZW4gMTE1OSwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCit3cml0ZV9kYXRhIGxlbiA3OTYsIHRpbWUgMCwgdHlwZSBzeW5jIGF0b20gbW9vZgord3JpdGVfZGF0YSBsZW4gNzg4LCB0aW1lIDEwMDAwMDAsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDE0OCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorZWQ4NTA2ZWJmY2U0YzQxNzMyMjA1YWUyNmE0NzU5ZmQgMjg5MSBkZWxheS1tb292Cit3cml0ZV9kYXRhIGxlbiAxMjMxLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIGZ0eXAKK3dyaXRlX2RhdGEgbGVuIDkxNiwgdGltZSAtMzMzMzMsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDkwOCwgdGltZSA5NjY2NjcsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDE0OCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorM2VjZTE0ODc0NWNkNjRiNDQyODUzMGE0ZDEwODBhMmQgMzIwMyBkZWxheS1tb292LWVsc3QKK3dyaXRlX2RhdGEgbGVuIDExOTUsIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gZnR5cAord3JpdGVfZGF0YSBsZW4gODM2LCB0aW1lIDAsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDY3LCB0aW1lIG5vcHRzLCB0eXBlIHRyYWlsZXIgYXRvbSAtCis5NTYyOTQ2YTM2OWU2ZmI1NzBmYjJmZDdhYTJmZTcyOCAyMDk4IGRlbGF5LW1vb3YtZW1wdHktdHJhY2sKK3dyaXRlX2RhdGEgbGVuIDExOTUsIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gZnR5cAord3JpdGVfZGF0YSBsZW4gMzYwLCB0aW1lIDAsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDM2MCwgdGltZSAxMDAwMDAwLCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA4NiwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorNGM3ODMyYjgxODM2MzMxYzZjMzcxNTVkYzMxZDk1YmUgMjAwMSBkZWxheS1tb292LWVtcHR5LXRyYWNrLWZsdXNoCit3cml0ZV9kYXRhIGxlbiAzNiwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCit3cml0ZV9kYXRhIGxlbiAxMTIzLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIC0KK2I3ZTNjNzY4YjkwOTRlYmUyZmRhNDQ5NzlhN2Y4OTg1IDExNTkgZW1wdHktbW9vdi1oZWFkZXIKK3dyaXRlX2RhdGEgbGVuIDc5NiwgdGltZSAwLCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA3ODgsIHRpbWUgMTAwMDAwMCwgdHlwZSBzeW5jIGF0b20gbW9vZgogYTAxNjVmNGEyNmE0MDkyMTJiMDk0NmU5ODFiZGVmYjkgMTU4NCBlbXB0eS1tb292LWNvbnRlbnQKLTM5ZDc5OGFhMTFhMjY1Yzc5MDZmOWUxMWQ0ZjMwM2MwIDExNTkgZGVsYXktbW9vdi1oZWFkZXIKK3dyaXRlX2RhdGEgbGVuIDE0OCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gMTE1OSwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCitiN2UzYzc2OGI5MDk0ZWJlMmZkYTQ0OTc5YTdmODk4NSAxMTU5IGRlbGF5LW1vb3YtaGVhZGVyCit3cml0ZV9kYXRhIGxlbiA3OTYsIHRpbWUgMCwgdHlwZSBzeW5jIGF0b20gbW9vZgord3JpdGVfZGF0YSBsZW4gNzg4LCB0aW1lIDEwMDAwMDAsIHR5cGUgc3luYyBhdG9tIG1vb2YKIGEwMTY1ZjRhMjZhNDA5MjEyYjA5NDZlOTgxYmRlZmI5IDE1ODQgZGVsYXktbW9vdi1jb250ZW50Cit3cml0ZV9kYXRhIGxlbiAxNDgsIHRpbWUgbm9wdHMsIHR5cGUgdHJhaWxlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDI0LCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDExMjMsIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gODg0LCB0aW1lIDAsIHR5cGUgc3luYyBhdG9tIHNpZHgKK3dyaXRlX2RhdGEgbGVuIDg3NiwgdGltZSAxMDAwMDAwLCB0eXBlIHN5bmMgYXRvbSBzaWR4CiAyNzJhNDc0Y2ZkMmE2OGNjNWYwNWI0MjZiMTRhMmI3ZCA4NzYgZW1wdHktbW9vdi1zZWNvbmQtZnJhZword3JpdGVfZGF0YSBsZW4gMTQ4LCB0aW1lIG5vcHRzLCB0eXBlIHRyYWlsZXIgYXRvbSAtCit3cml0ZV9kYXRhIGxlbiAyNCwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSAtCit3cml0ZV9kYXRhIGxlbiAxMTIzLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDg3NiwgdGltZSAxMDAwMDAwLCB0eXBlIHN5bmMgYXRvbSBzaWR4CiAyNzJhNDc0Y2ZkMmE2OGNjNWYwNWI0MjZiMTRhMmI3ZCA4NzYgZW1wdHktbW9vdi1zZWNvbmQtZnJhZy1kaXNjb250Cit3cml0ZV9kYXRhIGxlbiAxMTAsIHRpbWUgbm9wdHMsIHR5cGUgdHJhaWxlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDEyMTksIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gODc2LCB0aW1lIDEwMDAwMDAsIHR5cGUgc3luYyBhdG9tIHNpZHgKIDI3MmE0NzRjZmQyYTY4Y2M1ZjA1YjQyNmIxNGEyYjdkIDg3NiBkZWxheS1tb292LXNlY29uZC1mcmFnLWRpc2NvbnQKLTYyNTY0NDViOTU5NWRlNzhiZTQ5M2UwZmFmMmJjNWQ3IDEyMTkgZGVsYXktbW9vdi1lbHN0LWluaXQKK3dyaXRlX2RhdGEgbGVuIDExMCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gMTIxOSwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCis2ZWMzNjk4YmNjODYwMTNlMDAxNmUzZDQ3ZDIzMDM2MyAxMjE5IGRlbGF5LW1vb3YtZWxzdC1pbml0Cit3cml0ZV9kYXRhIGxlbiA5ODgsIHRpbWUgLTMzMzMzLCB0eXBlIHN5bmMgYXRvbSBzaWR4Cit3cml0ZV9kYXRhIGxlbiA5OTYsIHRpbWUgOTY2NjY3LCB0eXBlIHN5bmMgYXRvbSBzaWR4CiBmY2FlOGY0MGUwMTViNTlhYWJjOGQ0YTk5YTc1OWNhMSA5OTYgZGVsYXktbW9vdi1lbHN0LXNlY29uZC1mcmFnCi02MjU2NDQ1Yjk1OTVkZTc4YmU0OTNlMGZhZjJiYzVkNyAxMjE5IGRlbGF5LW1vb3YtZWxzdC1pbml0LWRpc2NvbnQKK3dyaXRlX2RhdGEgbGVuIDE0OCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gMTIxOSwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCis2ZWMzNjk4YmNjODYwMTNlMDAxNmUzZDQ3ZDIzMDM2MyAxMjE5IGRlbGF5LW1vb3YtZWxzdC1pbml0LWRpc2NvbnQKK3dyaXRlX2RhdGEgbGVuIDk5NiwgdGltZSA5NjY2NjcsIHR5cGUgc3luYyBhdG9tIHNpZHgKIGZjYWU4ZjQwZTAxNWI1OWFhYmM4ZDRhOTlhNzU5Y2ExIDk5NiBkZWxheS1tb292LWVsc3Qtc2Vjb25kLWZyYWctZGlzY29udAotMjlmODc1ZTQwMWRmMGZjMzAyNjk5NWQxMjg3MmVmMjEgMTIxOSBkZWxheS1tb292LWVsc3Qtc2lnbmFsLWluaXQKK3dyaXRlX2RhdGEgbGVuIDExMCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gMTIxOSwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCitjMzY4MTU5MGEyOTJjYjljYTE5YTVhOTgyZTUzMDE2NiAxMjE5IGRlbGF5LW1vb3YtZWxzdC1zaWduYWwtaW5pdAord3JpdGVfZGF0YSBsZW4gMTAwNCwgdGltZSAtMzMzMzMsIHR5cGUgc3luYyBhdG9tIHNpZHgKK3dyaXRlX2RhdGEgbGVuIDk5NiwgdGltZSA5NjY2NjcsIHR5cGUgc3luYyBhdG9tIHNpZHgKIGFhNTQ2MmNjMGQyMTQ0ZjcyMTU0ZDljMzA5ZWRiNTdkIDk5NiBkZWxheS1tb292LWVsc3Qtc2lnbmFsLXNlY29uZC1mcmFnCi0yOWY4NzVlNDAxZGYwZmMzMDI2OTk1ZDEyODcyZWYyMSAxMjE5IGRlbGF5LW1vb3YtZWxzdC1zaWduYWwtaW5pdC1kaXNjb250Cit3cml0ZV9kYXRhIGxlbiAxNDgsIHRpbWUgbm9wdHMsIHR5cGUgdHJhaWxlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDEyMTksIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gZnR5cAorYzM2ODE1OTBhMjkyY2I5Y2ExOWE1YTk4MmU1MzAxNjYgMTIxOSBkZWxheS1tb292LWVsc3Qtc2lnbmFsLWluaXQtZGlzY29udAord3JpdGVfZGF0YSBsZW4gOTk2LCB0aW1lIDk2NjY2NywgdHlwZSBzeW5jIGF0b20gc2lkeAogYWE1NDYyY2MwZDIxNDRmNzIxNTRkOWMzMDllZGI1N2QgOTk2IGRlbGF5LW1vb3YtZWxzdC1zaWduYWwtc2Vjb25kLWZyYWctZGlzY29udAotNmNkNjA4NWY0ZjBmZjUzNmFjZmNiNzdjYjY1OGViNDcgNDkzNSB2ZnIKLTZjZDYwODVmNGYwZmY1MzZhY2ZjYjc3Y2I2NThlYjQ3IDQ5MzUgdmZyLW5vZHVyYXRpb24KK3dyaXRlX2RhdGEgbGVuIDExMCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQord3JpdGVfZGF0YSBsZW4gMTI0MywgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCitkYWMxNGM4Nzk1ZDVjYmQ5MWFlNzcwYzZlMjg4MGM2MiAxMjQzIGRlbGF5LW1vb3YtZWxzdC1zaWduYWwtaW5pdC1kaXNjb250LWxhcmdldHMKK3dyaXRlX2RhdGEgbGVuIDk5NiwgdGltZSAyNzk2MjEyMzMzMzMsIHR5cGUgc3luYyBhdG9tIHNpZHgKKzQxY2FjNGMzZGY2NTZhODdiYjM4MzYzZmRjZDc0NWU2IDk5NiBkZWxheS1tb292LWVsc3Qtc2lnbmFsLXNlY29uZC1mcmFnLWRpc2NvbnQtbGFyZ2V0cword3JpdGVfZGF0YSBsZW4gMTEwLCB0aW1lIG5vcHRzLCB0eXBlIHRyYWlsZXIgYXRvbSAtCit3cml0ZV9kYXRhIGxlbiAxMjE5LCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIGZ0eXAKK3dyaXRlX2RhdGEgbGVuIDI1NzIsIHRpbWUgLTMzMzMzMywgdHlwZSBzeW5jIGF0b20gc2lkeAord3JpdGVfZGF0YSBsZW4gOTk2LCB0aW1lIDUxNjY2NjcsIHR5cGUgc3luYyBhdG9tIHNpZHgKK3dyaXRlX2RhdGEgbGVuIDE0OCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorZjEyZDRhMGUwNTRhYmNjNTA4Y2MwZDI4Y2IzMjBlNTcgNDkzNSB2ZnIKK3dyaXRlX2RhdGEgbGVuIDEyMTksIHRpbWUgbm9wdHMsIHR5cGUgaGVhZGVyIGF0b20gZnR5cAord3JpdGVfZGF0YSBsZW4gMjU3MiwgdGltZSAtMzMzMzMzLCB0eXBlIHN5bmMgYXRvbSBzaWR4Cit3cml0ZV9kYXRhIGxlbiA5OTYsIHRpbWUgNTE2NjY2NywgdHlwZSBzeW5jIGF0b20gc2lkeAord3JpdGVfZGF0YSBsZW4gMTQ4LCB0aW1lIG5vcHRzLCB0eXBlIHRyYWlsZXIgYXRvbSAtCitmMTJkNGEwZTA1NGFiY2M1MDhjYzBkMjhjYjMyMGU1NyA0OTM1IHZmci1ub2R1cmF0aW9uCit3cml0ZV9kYXRhIGxlbiAxMjMxLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIGZ0eXAKK3dyaXRlX2RhdGEgbGVuIDE1MDAsIHRpbWUgLTMzMzMzMywgdHlwZSBzeW5jIGF0b20gbW9vZgord3JpdGVfZGF0YSBsZW4gMTUwMCwgdGltZSBub3B0cywgdHlwZSB1bmtub3duIGF0b20gLQord3JpdGVfZGF0YSBsZW4gOTE2LCB0aW1lIG5vcHRzLCB0eXBlIHVua25vd24gYXRvbSAtCit3cml0ZV9kYXRhIGxlbiAxNTAwLCB0aW1lIDk2NjY2NjcsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDE1MDAsIHRpbWUgbm9wdHMsIHR5cGUgdW5rbm93biBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDEwMDQsIHRpbWUgbm9wdHMsIHR5cGUgdW5rbm93biBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDE0OCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorM2MyYzNmOThjOGEwNDdmMGVjZWZmZjA3NTcwZmQ0NTcgOTI5OSBsYXJnZV9mcmFnCit3cml0ZV9kYXRhIGxlbiAxMjMxLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIGZ0eXAKK3dyaXRlX2RhdGEgbGVuIDY4NCwgdGltZSAtMzMzMzMsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDUwNCwgdGltZSA4MDAwMDAsIHR5cGUgYm91bmRhcnkgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA0MjAsIHRpbWUgMTI2NjY2NywgdHlwZSBib3VuZGFyeSBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDY2OCwgdGltZSAxNTY2NjY3LCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA0NDAsIHRpbWUgMjIzMzMzMywgdHlwZSBib3VuZGFyeSBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDI2MiwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorZWRkMTlkZWFlMmI3MGFmY2YyY2Q3NDRiODliNzAxM2QgNDIwOSB2ZnItbm9kdXJhdGlvbi1pbnRlcmxlYXZlCit3cml0ZV9kYXRhIGxlbiAxMjMxLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIGZ0eXAKK3dyaXRlX2RhdGEgbGVuIDkxNiwgdGltZSAwLCB0eXBlIHN5bmMgYXRvbSBtb29mCit3cml0ZV9kYXRhIGxlbiA5MDgsIHRpbWUgMTAwMDAwMCwgdHlwZSBzeW5jIGF0b20gbW9vZgord3JpdGVfZGF0YSBsZW4gMTQ4LCB0aW1lIG5vcHRzLCB0eXBlIHRyYWlsZXIgYXRvbSAtCis3ODFkYmZkMjI4ZjM2OTAzMTc4ZTI5ZmFhNzI3ZDc4YiAzMjAzIGRlbGF5LW1vb3YtZWxzdC1uZWctY3RzCit3cml0ZV9kYXRhIGxlbiAzNiwgdGltZSBub3B0cywgdHlwZSBoZWFkZXIgYXRvbSBmdHlwCit3cml0ZV9kYXRhIGxlbiAxMTIzLCB0aW1lIG5vcHRzLCB0eXBlIGhlYWRlciBhdG9tIC0KK3dyaXRlX2RhdGEgbGVuIDExODgsIHRpbWUgMCwgdHlwZSBzeW5jIGF0b20gbW9vZgord3JpdGVfZGF0YSBsZW4gOTA4LCB0aW1lIDEwMzMzMzMsIHR5cGUgc3luYyBhdG9tIG1vb2YKK3dyaXRlX2RhdGEgbGVuIDE0OCwgdGltZSBub3B0cywgdHlwZSB0cmFpbGVyIGF0b20gLQorNzYzMGZkZjM1OGUwMmM3OWU4OGYzMTJmODJhMjYwYjcgMzQwMyBlbXB0eS1tb292LW5lZy1jdHMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21wZWcyLWZpZWxkLWVuYyBiL3Rlc3RzL3JlZi9mYXRlL21wZWcyLWZpZWxkLWVuYwppbmRleCBiZjhhMDFhLi44MDYyYjgyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9tcGVnMi1maWVsZC1lbmMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzItZmllbGQtZW5jCkBAIC0xLDMxICsxLDM1IEBACiAjdGIgMDogMS8yNQotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgNjIyMDgwLCAweGIzYjY2YzVjCi0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICA2MjIwODAsIDB4MDg4ZWMwMmIKLTAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg3YTM2ZGIyMQotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgNjIyMDgwLCAweDU0MWIyODZmCi0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICA2MjIwODAsIDB4YjZjM2U1OTAKLTAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDYyMjA4MCwgMHgzOWRiZWQ1MQotMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDk3M2RjNzI4Ci0wLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZDdhNGY4MDQKLTAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDYyMjA4MCwgMHhhMjQ4NDc2MgotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNjIyMDgwLCAweDBjZDI2OGQxCi0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA2MjIwODAsIDB4NzJlYjY2M2QKLTAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4ZmRiYWM1OQotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNjIyMDgwLCAweGE2ZjRmZWI5Ci0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA2MjIwODAsIDB4YWRiODI4YzYKLTAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDYyMjA4MCwgMHhlYTYzMGE2MwotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNjIyMDgwLCAweGE5MDFkOTI1Ci0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA2MjIwODAsIDB4YWM1ZTcwODcKLTAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgxMDI3NGEyYgotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNjIyMDgwLCAweDE0M2Q1NDFjCi0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZWU5NGM5M2EKLTAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDYyMjA4MCwgMHhjYTAzMDIwOAotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDI2ZjMwZWFkCi0wLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA2MjIwODAsIDB4ZmMyMmYzMmMKLTAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDYyMjA4MCwgMHg5NDBhNWZmOAotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNjIyMDgwLCAweDIxNjRmODA1Ci0wLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA2MjIwODAsIDB4YTc2ZjVhYmEKLTAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4YzMxMTQ3MQotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNjIyMDgwLCAweGE0NWUxZDk1Ci0wLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA2MjIwODAsIDB4NmNjNjFkNmMKLTAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDYyMjA4MCwgMHg2OTgzYjQxNworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDU3NgorI3NhciAwOiAxNi8xNQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgNjIyMDgwLCAweGZmNDk2YmY1CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICA2MjIwODAsIDB4OWJmNmMwMTQKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4NzBlZGFjNworMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgNjIyMDgwLCAweDlkZWMyODBjCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICA2MjIwODAsIDB4MGYwMmU1N2EKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDYyMjA4MCwgMHgxNjFiZWNjYgorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgNjIyMDgwLCAweDIyMzRjNmIwCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICA2MjIwODAsIDB4MTQzZWY3OGEKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDYyMjA4MCwgMHgwZDZlNDZjZgorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNjIyMDgwLCAweGI0MTY2N2ZkCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICA2MjIwODAsIDB4Y2M0NzY1MzkKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4NWQ4YWIxNgorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgNjIyMDgwLCAweGNkNmFmZWMxCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICA2MjIwODAsIDB4MTg3YTI4YWMKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDYyMjA4MCwgMHgwNjEwMGE0YgorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgNjIyMDgwLCAweDFiNGVkOGU5CiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICA2MjIwODAsIDB4ZGUzMzcwMmMKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDYyMjA4MCwgMHgxMTk3NGEwYworMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgNjIyMDgwLCAweDFhMDU1M2U4CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICA2MjIwODAsIDB4OThlMWM4ZGEKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDYyMjA4MCwgMHgwMDM4MDFjZQorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgNjIyMDgwLCAweDZmMzAwZTAwCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICA2MjIwODAsIDB4YjIzMmYyN2QKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDYyMjA4MCwgMHgwN2M2NWY1NworMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgNjIyMDgwLCAweDYzNjNmN2NlCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICA2MjIwODAsIDB4NjliYTVhYzMKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4NTYxMTQzZQorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgNjIyMDgwLCAweGY0NWUxZDc2CiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICA2MjIwODAsIDB4NjlmODFkMmYKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDYyMjA4MCwgMHg4NjUzYjNlZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXBlZzItdGlja2V0MTg2IGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzItdGlja2V0MTg2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYWZkYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tcGVnMi10aWNrZXQxODYKQEAgLTAsMCArMSwzNTYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDEyLzExCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OGY5ZDAwYzEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4OTlmYjhiMQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDcyMjVjYjM5CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjJiZWNkOGYKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkNTZiYzU1NgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTUyMDY0LCAweDdjYTU0ZjM2CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDZkNzgwNWMKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0NjlmM2Y4NworMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTUyMDY0LCAweGRiMmY1N2Q1CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4Mzg3NmMyMGMKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1YjY3MGU3OQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGRmZTQyMGUwCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTc1NzgyMjIKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0N2UxY2IyNgorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTUyMDY0LCAweDE2OGUzNWQ2CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTlkMzRiNGUKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1ZTM5NTMwOAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTUyMDY0LCAweDg4ZTNiMzlmCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmIwOTljNTEKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDE1MjA2NCwgMHhiMWEyNGRkZgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGNlYTg0MGZjCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTgzMDZkNjQKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiMDUzNTRkMworMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTUyMDY0LCAweGFjYWMyNmYzCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YmNjZGYxNGIKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkOTM5ODUzOQorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTUyMDY0LCAweDA3YWVjMTNhCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YTZlZjk0NDAKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwZTdhYjY0ZQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTUyMDY0LCAweDM3OTY5MzlkCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4Y2MyMTkzNjUKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmNGNjODE1YQorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDhiOTFjNjIyCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZDNhOGFkOGUKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2NThlNDk4ZgorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTUyMDY0LCAweGY5YzExNWVhCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjYzOWY4ZDIKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3ZTllYWE2NAorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTUyMDY0LCAweDhhNTQ2YmNmCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTlkMjJkZDQKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4MGExMGVkYworMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTUyMDY0LCAweDVjOTdkNGExCiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGYxYmYwMjUKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0MjcyMTc4OQorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTUyMDY0LCAweDM5ZTY3MDBkCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZGY0YWY4YjQKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhY2Y4MzliYgorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTUyMDY0LCAweGJlYmZiZjdjCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDljNzYzMGQKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDE1MjA2NCwgMHgzMzMxYWIxOAorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgMTUyMDY0LCAweGFlMGYwZjI4CiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YmIwODU3MzcKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxZTIzYWQzOQorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgMTUyMDY0LCAweDE4ZDQ2NjgzCiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGVhZGQwYTAKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwOWIxMzQzMAorMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgMTUyMDY0LCAweDI0MGE2MDdiCiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZWMwZjhhNjcKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2YzM3ZmMwOAorMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgMTUyMDY0LCAweGRlZDRjZGE3CiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YzVkZjE0NzcKKzAsICAgICAgICAgNjEsICAgICAgICAgNjEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzYzlkZTZmOQorMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgMTUyMDY0LCAweGVmZDFjZGJkCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NWRmN2I4OWMKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxYjA0YWY1ZgorMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgMTUyMDY0LCAweGJiZmYyYzA5CiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MjNiMDQ1NTMKKzAsICAgICAgICAgNjcsICAgICAgICAgNjcsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzZDk5Y2FhMworMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgMTUyMDY0LCAweDM1MTM5YmY4CiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NDkyMDdjMGEKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhNzhlMmVmYQorMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgMTUyMDY0LCAweDVhNTBiMGRmCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzI1NWIzMDYKKzAsICAgICAgICAgNzMsICAgICAgICAgNzMsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2MDYyMmM2MQorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgMTUyMDY0LCAweDhjOGNkZTlmCiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZThjMGJiNmMKKzAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiYzY5ODQ3MworMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgMTUyMDY0LCAweDM5ODUyNWMyCiswLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ODc5ODNhYjAKKzAsICAgICAgICAgNzksICAgICAgICAgNzksICAgICAgICAxLCAgIDE1MjA2NCwgMHgwMzJhZjZiNQorMCwgICAgICAgICA4MCwgICAgICAgICA4MCwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ4NzhiYjExCiswLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmY1ZGQwNDQKKzAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlNjc1YmZlMAorMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgMTUyMDY0LCAweDFhZjI5MDA4CiswLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDdhYTg5NzUKKzAsICAgICAgICAgODUsICAgICAgICAgODUsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxNzk1Nzc1NgorMCwgICAgICAgICA4NiwgICAgICAgICA4NiwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ4YjU4MjVlCiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTY5ZDcwYmMKKzAsICAgICAgICAgODgsICAgICAgICAgODgsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzMjY3MzBjOAorMCwgICAgICAgICA4OSwgICAgICAgICA4OSwgICAgICAgIDEsICAgMTUyMDY0LCAweDYxNThjOTcxCiswLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTAzNWUzZWUKKzAsICAgICAgICAgOTEsICAgICAgICAgOTEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlZjQ5YmE1MworMCwgICAgICAgICA5MiwgICAgICAgICA5MiwgICAgICAgIDEsICAgMTUyMDY0LCAweDI2MTA4MWZhCiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTI4MDc3OWUKKzAsICAgICAgICAgOTQsICAgICAgICAgOTQsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4YTZkNmRmMworMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgMTUyMDY0LCAweGRiMGYxZWQ1CiswLCAgICAgICAgIDk2LCAgICAgICAgIDk2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTE2MjU3MGEKKzAsICAgICAgICAgOTcsICAgICAgICAgOTcsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwODQxNTQ3YworMCwgICAgICAgICA5OCwgICAgICAgICA5OCwgICAgICAgIDEsICAgMTUyMDY0LCAweGYwNjk0ZmNkCiswLCAgICAgICAgIDk5LCAgICAgICAgIDk5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmU1MjUwNTcKKzAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiNGVjMGM5NgorMCwgICAgICAgIDEwMSwgICAgICAgIDEwMSwgICAgICAgIDEsICAgMTUyMDY0LCAweGJmMmRjYWVlCiswLCAgICAgICAgMTAyLCAgICAgICAgMTAyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4Nzg2MGM0MTgKKzAsICAgICAgICAxMDMsICAgICAgICAxMDMsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjOWUyODhiYworMCwgICAgICAgIDEwNCwgICAgICAgIDEwNCwgICAgICAgIDEsICAgMTUyMDY0LCAweGIwNTE0ZGMzCiswLCAgICAgICAgMTA1LCAgICAgICAgMTA1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NzIyYTRiZDAKKzAsICAgICAgICAxMDYsICAgICAgICAxMDYsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1Mjc3ZjUyZAorMCwgICAgICAgIDEwNywgICAgICAgIDEwNywgICAgICAgIDEsICAgMTUyMDY0LCAweDA1MjA4ZTc1CiswLCAgICAgICAgMTA4LCAgICAgICAgMTA4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MGI1OTYwODkKKzAsICAgICAgICAxMDksICAgICAgICAxMDksICAgICAgICAxLCAgIDE1MjA2NCwgMHg0N2FhMTE3YworMCwgICAgICAgIDExMCwgICAgICAgIDExMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDEyZWRmZThiCiswLCAgICAgICAgMTExLCAgICAgICAgMTExLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MmU1MGY4NjQKKzAsICAgICAgICAxMTIsICAgICAgICAxMTIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0Y2VkYjg4MgorMCwgICAgICAgIDExMywgICAgICAgIDExMywgICAgICAgIDEsICAgMTUyMDY0LCAweGRiZjQ4Mjg1CiswLCAgICAgICAgMTE0LCAgICAgICAgMTE0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTA3MWIwZTYKKzAsICAgICAgICAxMTUsICAgICAgICAxMTUsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxYzg1YTVjZQorMCwgICAgICAgIDExNiwgICAgICAgIDExNiwgICAgICAgIDEsICAgMTUyMDY0LCAweDhlZjlhOGU4CiswLCAgICAgICAgMTE3LCAgICAgICAgMTE3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NDFlOGFlMjYKKzAsICAgICAgICAxMTgsICAgICAgICAxMTgsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzMzI4ZDU3MQorMCwgICAgICAgIDExOSwgICAgICAgIDExOSwgICAgICAgIDEsICAgMTUyMDY0LCAweGNlN2Q0ZGEyCiswLCAgICAgICAgMTIwLCAgICAgICAgMTIwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDMyZDc1NzUKKzAsICAgICAgICAxMjEsICAgICAgICAxMjEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiM2ZjNjVhNgorMCwgICAgICAgIDEyMiwgICAgICAgIDEyMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGU1YTI2NmI0CiswLCAgICAgICAgMTIzLCAgICAgICAgMTIzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTQzYzU5MjUKKzAsICAgICAgICAxMjQsICAgICAgICAxMjQsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlNjEzODAyNAorMCwgICAgICAgIDEyNSwgICAgICAgIDEyNSwgICAgICAgIDEsICAgMTUyMDY0LCAweDNhY2Q0ZTFiCiswLCAgICAgICAgMTI2LCAgICAgICAgMTI2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4OWRlNzkwM2UKKzAsICAgICAgICAxMjcsICAgICAgICAxMjcsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlYTExODRkMAorMCwgICAgICAgIDEyOCwgICAgICAgIDEyOCwgICAgICAgIDEsICAgMTUyMDY0LCAweDllMzIzODE4CiswLCAgICAgICAgMTI5LCAgICAgICAgMTI5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4Zjc3ODcyYTIKKzAsICAgICAgICAxMzAsICAgICAgICAxMzAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4ZjdjNzVjNworMCwgICAgICAgIDEzMSwgICAgICAgIDEzMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDlkNmQyNjIzCiswLCAgICAgICAgMTMyLCAgICAgICAgMTMyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4M2Q4ZTYyYWIKKzAsICAgICAgICAxMzMsICAgICAgICAxMzMsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjZDhiM2RjNQorMCwgICAgICAgIDEzNCwgICAgICAgIDEzNCwgICAgICAgIDEsICAgMTUyMDY0LCAweDU3NjgxZWJjCiswLCAgICAgICAgMTM1LCAgICAgICAgMTM1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NzY0ZjMyMzMKKzAsICAgICAgICAxMzYsICAgICAgICAxMzYsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4YzhiMGE0YgorMCwgICAgICAgIDEzNywgICAgICAgIDEzNywgICAgICAgIDEsICAgMTUyMDY0LCAweDJkOWFlZGFjCiswLCAgICAgICAgMTM4LCAgICAgICAgMTM4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MGFmZTAzYWUKKzAsICAgICAgICAxMzksICAgICAgICAxMzksICAgICAgICAxLCAgIDE1MjA2NCwgMHhjZWNhZTMxYgorMCwgICAgICAgIDE0MCwgICAgICAgIDE0MCwgICAgICAgIDEsICAgMTUyMDY0LCAweDBlNmVhMTdmCiswLCAgICAgICAgMTQxLCAgICAgICAgMTQxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjZiMGI4YzQKKzAsICAgICAgICAxNDIsICAgICAgICAxNDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkNDRmNzk3NgorMCwgICAgICAgIDE0MywgICAgICAgIDE0MywgICAgICAgIDEsICAgMTUyMDY0LCAweGY3ZjAyOWNjCiswLCAgICAgICAgMTQ0LCAgICAgICAgMTQ0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWRhMzA3YTkKKzAsICAgICAgICAxNDUsICAgICAgICAxNDUsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5MzZhZTM2NworMCwgICAgICAgIDE0NiwgICAgICAgIDE0NiwgICAgICAgIDEsICAgMTUyMDY0LCAweGEwMTlhZDhhCiswLCAgICAgICAgMTQ3LCAgICAgICAgMTQ3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTIzM2E5ZTcKKzAsICAgICAgICAxNDgsICAgICAgICAxNDgsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2ZmQ1NzM3ZgorMCwgICAgICAgIDE0OSwgICAgICAgIDE0OSwgICAgICAgIDEsICAgMTUyMDY0LCAweGIyZWIyNDc2CiswLCAgICAgICAgMTUwLCAgICAgICAgMTUwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzZhNTMyODAKKzAsICAgICAgICAxNTEsICAgICAgICAxNTEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmMDI1MjMwZgorMCwgICAgICAgIDE1MiwgICAgICAgIDE1MiwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ4MzczYTNlCiswLCAgICAgICAgMTUzLCAgICAgICAgMTUzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTRlOTUwZTIKKzAsICAgICAgICAxNTQsICAgICAgICAxNTQsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2M2QzN2ZjNAorMCwgICAgICAgIDE1NSwgICAgICAgIDE1NSwgICAgICAgIDEsICAgMTUyMDY0LCAweDFlNDY1ZmRhCiswLCAgICAgICAgMTU2LCAgICAgICAgMTU2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YzQ3ZWE5N2UKKzAsICAgICAgICAxNTcsICAgICAgICAxNTcsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwMjI0YWNhNworMCwgICAgICAgIDE1OCwgICAgICAgIDE1OCwgICAgICAgIDEsICAgMTUyMDY0LCAweDkwOWRlZGNjCiswLCAgICAgICAgMTU5LCAgICAgICAgMTU5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MWMxZGY3ZWEKKzAsICAgICAgICAxNjAsICAgICAgICAxNjAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1ZTQzZjdmMQorMCwgICAgICAgIDE2MSwgICAgICAgIDE2MSwgICAgICAgIDEsICAgMTUyMDY0LCAweGRiMTFkOGZhCiswLCAgICAgICAgMTYyLCAgICAgICAgMTYyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YTY2NzEwZjUKKzAsICAgICAgICAxNjMsICAgICAgICAxNjMsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzNTIwMTNiMAorMCwgICAgICAgIDE2NCwgICAgICAgIDE2NCwgICAgICAgIDEsICAgMTUyMDY0LCAweGM4ZTc0NWYxCiswLCAgICAgICAgMTY1LCAgICAgICAgMTY1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjE4YjY4MTAKKzAsICAgICAgICAxNjYsICAgICAgICAxNjYsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiMWMyNDNlMgorMCwgICAgICAgIDE2NywgICAgICAgIDE2NywgICAgICAgIDEsICAgMTUyMDY0LCAweDZmZTEyOWY5CiswLCAgICAgICAgMTY4LCAgICAgICAgMTY4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTI4MTRiZGUKKzAsICAgICAgICAxNjksICAgICAgICAxNjksICAgICAgICAxLCAgIDE1MjA2NCwgMHg1MDk1NDc1MgorMCwgICAgICAgIDE3MCwgICAgICAgIDE3MCwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ4NjM0ZGYzCiswLCAgICAgICAgMTcxLCAgICAgICAgMTcxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4M2FmMjU0YzAKKzAsICAgICAgICAxNzIsICAgICAgICAxNzIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2ZmRlNDgwMQorMCwgICAgICAgIDE3MywgICAgICAgIDE3MywgICAgICAgIDEsICAgMTUyMDY0LCAweGY4ZmUxOWI0CiswLCAgICAgICAgMTc0LCAgICAgICAgMTc0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTcwMDQ5MDYKKzAsICAgICAgICAxNzUsICAgICAgICAxNzUsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5MTZlMmZmNAorMCwgICAgICAgIDE3NiwgICAgICAgIDE3NiwgICAgICAgIDEsICAgMTUyMDY0LCAweGJjMGQyOGYwCiswLCAgICAgICAgMTc3LCAgICAgICAgMTc3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NDUyMjQzNWUKKzAsICAgICAgICAxNzgsICAgICAgICAxNzgsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4NjFmNWQxYgorMCwgICAgICAgIDE3OSwgICAgICAgIDE3OSwgICAgICAgIDEsICAgMTUyMDY0LCAweDQyYzNiZjI4CiswLCAgICAgICAgMTgwLCAgICAgICAgMTgwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YmQ2YWRiMTkKKzAsICAgICAgICAxODEsICAgICAgICAxODEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwNjkyZjViOAorMCwgICAgICAgIDE4MiwgICAgICAgIDE4MiwgICAgICAgIDEsICAgMTUyMDY0LCAweDFlMWU0YmZiCiswLCAgICAgICAgMTgzLCAgICAgICAgMTgzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZGM4NTI5ODYKKzAsICAgICAgICAxODQsICAgICAgICAxODQsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2MWM1MjU5ZQorMCwgICAgICAgIDE4NSwgICAgICAgIDE4NSwgICAgICAgIDEsICAgMTUyMDY0LCAweGUyOGYzNjVhCiswLCAgICAgICAgMTg2LCAgICAgICAgMTg2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTkzODgzMDgKKzAsICAgICAgICAxODcsICAgICAgICAxODcsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwNDNiYWNlOQorMCwgICAgICAgIDE4OCwgICAgICAgIDE4OCwgICAgICAgIDEsICAgMTUyMDY0LCAweDRiZWJiNjc4CiswLCAgICAgICAgMTg5LCAgICAgICAgMTg5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmJkNmQxMTIKKzAsICAgICAgICAxOTAsICAgICAgICAxOTAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzYzlkYzQwMQorMCwgICAgICAgIDE5MSwgICAgICAgIDE5MSwgICAgICAgIDEsICAgMTUyMDY0LCAweDkxZTc1NTZhCiswLCAgICAgICAgMTkyLCAgICAgICAgMTkyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YWU2MGY3ZTcKKzAsICAgICAgICAxOTMsICAgICAgICAxOTMsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxNDA2Njg5MworMCwgICAgICAgIDE5NCwgICAgICAgIDE5NCwgICAgICAgIDEsICAgMTUyMDY0LCAweDdmNWE1ZjBhCiswLCAgICAgICAgMTk1LCAgICAgICAgMTk1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjEwNjM5NTgKKzAsICAgICAgICAxOTYsICAgICAgICAxOTYsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhZGYxM2I5ZgorMCwgICAgICAgIDE5NywgICAgICAgIDE5NywgICAgICAgIDEsICAgMTUyMDY0LCAweDdkZGNmOTRkCiswLCAgICAgICAgMTk4LCAgICAgICAgMTk4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTEzOTM3MzAKKzAsICAgICAgICAxOTksICAgICAgICAxOTksICAgICAgICAxLCAgIDE1MjA2NCwgMHhjZDE1MDUzNgorMCwgICAgICAgIDIwMCwgICAgICAgIDIwMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDUyZTBkN2JkCiswLCAgICAgICAgMjAxLCAgICAgICAgMjAxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTEzMGIyY2UKKzAsICAgICAgICAyMDIsICAgICAgICAyMDIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhMDdmYTYyYQorMCwgICAgICAgIDIwMywgICAgICAgIDIwMywgICAgICAgIDEsICAgMTUyMDY0LCAweDdkYTI1OGNkCiswLCAgICAgICAgMjA0LCAgICAgICAgMjA0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTg0MDcxYTYKKzAsICAgICAgICAyMDUsICAgICAgICAyMDUsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkNWZhNzMxYQorMCwgICAgICAgIDIwNiwgICAgICAgIDIwNiwgICAgICAgIDEsICAgMTUyMDY0LCAweDU5M2Q3OTEwCiswLCAgICAgICAgMjA3LCAgICAgICAgMjA3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGI3NTRjNzEKKzAsICAgICAgICAyMDgsICAgICAgICAyMDgsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1MTU0NDg0MQorMCwgICAgICAgIDIwOSwgICAgICAgIDIwOSwgICAgICAgIDEsICAgMTUyMDY0LCAweGY0NjY5MTBlCiswLCAgICAgICAgMjEwLCAgICAgICAgMjEwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjUzNWM5YzQKKzAsICAgICAgICAyMTEsICAgICAgICAyMTEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2ZDQ1YjZkOAorMCwgICAgICAgIDIxMiwgICAgICAgIDIxMiwgICAgICAgIDEsICAgMTUyMDY0LCAweGU3Nzk5OGEyCiswLCAgICAgICAgMjEzLCAgICAgICAgMjEzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTYwMjMyNzUKKzAsICAgICAgICAyMTQsICAgICAgICAyMTQsICAgICAgICAxLCAgIDE1MjA2NCwgMHg3NzliMjBjYworMCwgICAgICAgIDIxNSwgICAgICAgIDIxNSwgICAgICAgIDEsICAgMTUyMDY0LCAweDFmZjFiMDVlCiswLCAgICAgICAgMjE2LCAgICAgICAgMjE2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YjllMmMzZjAKKzAsICAgICAgICAyMTcsICAgICAgICAyMTcsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkZmM2ZDU0MQorMCwgICAgICAgIDIxOCwgICAgICAgIDIxOCwgICAgICAgIDEsICAgMTUyMDY0LCAweDMwMWE3OTQ4CiswLCAgICAgICAgMjE5LCAgICAgICAgMjE5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDNkNjExY2EKKzAsICAgICAgICAyMjAsICAgICAgICAyMjAsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlOTQyNmYyYQorMCwgICAgICAgIDIyMSwgICAgICAgIDIyMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDMwNGM5NWRmCiswLCAgICAgICAgMjIyLCAgICAgICAgMjIyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjBlN2Y5MjQKKzAsICAgICAgICAyMjMsICAgICAgICAyMjMsICAgICAgICAxLCAgIDE1MjA2NCwgMHg2NDA4NjcwYworMCwgICAgICAgIDIyNCwgICAgICAgIDIyNCwgICAgICAgIDEsICAgMTUyMDY0LCAweGJmMDljYTc0CiswLCAgICAgICAgMjI1LCAgICAgICAgMjI1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjJkMTM1NzIKKzAsICAgICAgICAyMjYsICAgICAgICAyMjYsICAgICAgICAxLCAgIDE1MjA2NCwgMHg5MGNjYjQ3ZAorMCwgICAgICAgIDIyNywgICAgICAgIDIyNywgICAgICAgIDEsICAgMTUyMDY0LCAweDI0YmJkMjY5CiswLCAgICAgICAgMjI4LCAgICAgICAgMjI4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4N2FlMzMzZGQKKzAsICAgICAgICAyMjksICAgICAgICAyMjksICAgICAgICAxLCAgIDE1MjA2NCwgMHg5MDkxM2ZlMgorMCwgICAgICAgIDIzMCwgICAgICAgIDIzMCwgICAgICAgIDEsICAgMTUyMDY0LCAweGM5OTQwMDdjCiswLCAgICAgICAgMjMxLCAgICAgICAgMjMxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NDVhMTIzYzAKKzAsICAgICAgICAyMzIsICAgICAgICAyMzIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhhMDMzNWJiZgorMCwgICAgICAgIDIzMywgICAgICAgIDIzMywgICAgICAgIDEsICAgMTUyMDY0LCAweDNlNzljNGU5CiswLCAgICAgICAgMjM0LCAgICAgICAgMjM0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDVjZjQ0NzkKKzAsICAgICAgICAyMzUsICAgICAgICAyMzUsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyMTQ2MzkyYworMCwgICAgICAgIDIzNiwgICAgICAgIDIzNiwgICAgICAgIDEsICAgMTUyMDY0LCAweDY4YWM1ZDBhCiswLCAgICAgICAgMjM3LCAgICAgICAgMjM3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4OWQyNmZlZDgKKzAsICAgICAgICAyMzgsICAgICAgICAyMzgsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwNDdjOTA4MgorMCwgICAgICAgIDIzOSwgICAgICAgIDIzOSwgICAgICAgIDEsICAgMTUyMDY0LCAweDUxOGJkOWY4CiswLCAgICAgICAgMjQwLCAgICAgICAgMjQwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmJkMDNiMTYKKzAsICAgICAgICAyNDEsICAgICAgICAyNDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1MzE3NjAxYQorMCwgICAgICAgIDI0MiwgICAgICAgIDI0MiwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ1MDExOGM1CiswLCAgICAgICAgMjQzLCAgICAgICAgMjQzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTA1ODkxNWIKKzAsICAgICAgICAyNDQsICAgICAgICAyNDQsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwYTRhMDAwYQorMCwgICAgICAgIDI0NSwgICAgICAgIDI0NSwgICAgICAgIDEsICAgMTUyMDY0LCAweGEyNzc3MDdkCiswLCAgICAgICAgMjQ2LCAgICAgICAgMjQ2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YzdjYjI5YjIKKzAsICAgICAgICAyNDcsICAgICAgICAyNDcsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzNzEzNDRmYworMCwgICAgICAgIDI0OCwgICAgICAgIDI0OCwgICAgICAgIDEsICAgMTUyMDY0LCAweGJjOTM3NWE5CiswLCAgICAgICAgMjQ5LCAgICAgICAgMjQ5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NzBjMmZhMmYKKzAsICAgICAgICAyNTAsICAgICAgICAyNTAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0MWZiYzA1NworMCwgICAgICAgIDI1MSwgICAgICAgIDI1MSwgICAgICAgIDEsICAgMTUyMDY0LCAweGMyMWE3N2ZlCiswLCAgICAgICAgMjUyLCAgICAgICAgMjUyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTFlMDYzODQKKzAsICAgICAgICAyNTMsICAgICAgICAyNTMsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiZWU4M2ZjYgorMCwgICAgICAgIDI1NCwgICAgICAgIDI1NCwgICAgICAgIDEsICAgMTUyMDY0LCAweGNlMmJlZmRmCiswLCAgICAgICAgMjU1LCAgICAgICAgMjU1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGYxMzk4NjUKKzAsICAgICAgICAyNTYsICAgICAgICAyNTYsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0ZTBmNTM3MgorMCwgICAgICAgIDI1NywgICAgICAgIDI1NywgICAgICAgIDEsICAgMTUyMDY0LCAweGYwNzAxZmQ2CiswLCAgICAgICAgMjU4LCAgICAgICAgMjU4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NzQ2YzM1ZjQKKzAsICAgICAgICAyNTksICAgICAgICAyNTksICAgICAgICAxLCAgIDE1MjA2NCwgMHhmNTIxMTQ2OQorMCwgICAgICAgIDI2MCwgICAgICAgIDI2MCwgICAgICAgIDEsICAgMTUyMDY0LCAweGFlOGYxYzJmCiswLCAgICAgICAgMjYxLCAgICAgICAgMjYxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4YzI0ODNhNzUKKzAsICAgICAgICAyNjIsICAgICAgICAyNjIsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyZGEyNGFlNgorMCwgICAgICAgIDI2MywgICAgICAgIDI2MywgICAgICAgIDEsICAgMTUyMDY0LCAweDg2ZjcwZTNhCiswLCAgICAgICAgMjY0LCAgICAgICAgMjY0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTJiODE3MmEKKzAsICAgICAgICAyNjUsICAgICAgICAyNjUsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjYTgxMGYzYgorMCwgICAgICAgIDI2NiwgICAgICAgIDI2NiwgICAgICAgIDEsICAgMTUyMDY0LCAweDZkOTUwNGM0CiswLCAgICAgICAgMjY3LCAgICAgICAgMjY3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGVkY2ZiZmEKKzAsICAgICAgICAyNjgsICAgICAgICAyNjgsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyOTJjMGJmZAorMCwgICAgICAgIDI2OSwgICAgICAgIDI2OSwgICAgICAgIDEsICAgMTUyMDY0LCAweGVlOTk4ZTNkCiswLCAgICAgICAgMjcwLCAgICAgICAgMjcwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTRiNmMxYjIKKzAsICAgICAgICAyNzEsICAgICAgICAyNzEsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiYmUwYTRjYworMCwgICAgICAgIDI3MiwgICAgICAgIDI3MiwgICAgICAgIDEsICAgMTUyMDY0LCAweGNkODhiY2YyCiswLCAgICAgICAgMjczLCAgICAgICAgMjczLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MzY1ZGY3YzUKKzAsICAgICAgICAyNzQsICAgICAgICAyNzQsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwMWNkMDZhNAorMCwgICAgICAgIDI3NSwgICAgICAgIDI3NSwgICAgICAgIDEsICAgMTUyMDY0LCAweGNmYWVmZWVmCiswLCAgICAgICAgMjc2LCAgICAgICAgMjc2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTYxNTI4OWQKKzAsICAgICAgICAyNzcsICAgICAgICAyNzcsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxZDUyNDNkZQorMCwgICAgICAgIDI3OCwgICAgICAgIDI3OCwgICAgICAgIDEsICAgMTUyMDY0LCAweDdjMzk3ZGZlCiswLCAgICAgICAgMjc5LCAgICAgICAgMjc5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZTI1ODQ1YjEKKzAsICAgICAgICAyODAsICAgICAgICAyODAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgyZDZhNjBhOAorMCwgICAgICAgIDI4MSwgICAgICAgIDI4MSwgICAgICAgIDEsICAgMTUyMDY0LCAweGYxOTI2MjAzCiswLCAgICAgICAgMjgyLCAgICAgICAgMjgyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjM0YTg4YzkKKzAsICAgICAgICAyODMsICAgICAgICAyODMsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjNTBhYTFiNworMCwgICAgICAgIDI4NCwgICAgICAgIDI4NCwgICAgICAgIDEsICAgMTUyMDY0LCAweDk3MmZhNzEzCiswLCAgICAgICAgMjg1LCAgICAgICAgMjg1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YTExY2QwZjYKKzAsICAgICAgICAyODYsICAgICAgICAyODYsICAgICAgICAxLCAgIDE1MjA2NCwgMHhiZmY4ZjkwZQorMCwgICAgICAgIDI4NywgICAgICAgIDI4NywgICAgICAgIDEsICAgMTUyMDY0LCAweDAwOTAyZTc2CiswLCAgICAgICAgMjg4LCAgICAgICAgMjg4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NWNmMzFjYjEKKzAsICAgICAgICAyODksICAgICAgICAyODksICAgICAgICAxLCAgIDE1MjA2NCwgMHgyYjAyNjA1OAorMCwgICAgICAgIDI5MCwgICAgICAgIDI5MCwgICAgICAgIDEsICAgMTUyMDY0LCAweDI1ODAwMmNjCiswLCAgICAgICAgMjkxLCAgICAgICAgMjkxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MGQ3MDg4MTUKKzAsICAgICAgICAyOTIsICAgICAgICAyOTIsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlMzgwOWNlMAorMCwgICAgICAgIDI5MywgICAgICAgIDI5MywgICAgICAgIDEsICAgMTUyMDY0LCAweGYwMjM5NDY3CiswLCAgICAgICAgMjk0LCAgICAgICAgMjk0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NmU3MTkxNmEKKzAsICAgICAgICAyOTUsICAgICAgICAyOTUsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjMWZiMzZlMQorMCwgICAgICAgIDI5NiwgICAgICAgIDI5NiwgICAgICAgIDEsICAgMTUyMDY0LCAweGQ0N2YwN2M5CiswLCAgICAgICAgMjk3LCAgICAgICAgMjk3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4N2ZkMTExZWEKKzAsICAgICAgICAyOTgsICAgICAgICAyOTgsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjNDAyM2E4MAorMCwgICAgICAgIDI5OSwgICAgICAgIDI5OSwgICAgICAgIDEsICAgMTUyMDY0LCAweDhmNTg1MWJhCiswLCAgICAgICAgMzAwLCAgICAgICAgMzAwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTk4MmY0N2IKKzAsICAgICAgICAzMDEsICAgICAgICAzMDEsICAgICAgICAxLCAgIDE1MjA2NCwgMHgwZTVmNmY4MAorMCwgICAgICAgIDMwMiwgICAgICAgIDMwMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDQ5OTI1ZTUzCiswLCAgICAgICAgMzAzLCAgICAgICAgMzAzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZjYwMDZiY2MKKzAsICAgICAgICAzMDQsICAgICAgICAzMDQsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkNGI1ZDBmNworMCwgICAgICAgIDMwNSwgICAgICAgIDMwNSwgICAgICAgIDEsICAgMTUyMDY0LCAweDQxOWVmMGE0CiswLCAgICAgICAgMzA2LCAgICAgICAgMzA2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGU2MTA5MzQKKzAsICAgICAgICAzMDcsICAgICAgICAzMDcsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxOTE5ZTk5OQorMCwgICAgICAgIDMwOCwgICAgICAgIDMwOCwgICAgICAgIDEsICAgMTUyMDY0LCAweDNhNzUwZDgwCiswLCAgICAgICAgMzA5LCAgICAgICAgMzA5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTY2MTYwNzUKKzAsICAgICAgICAzMTAsICAgICAgICAzMTAsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzMjg0NTE5ZgorMCwgICAgICAgIDMxMSwgICAgICAgIDMxMSwgICAgICAgIDEsICAgMTUyMDY0LCAweDk3NmNkZDcwCiswLCAgICAgICAgMzEyLCAgICAgICAgMzEyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4NGVjNWQxZTMKKzAsICAgICAgICAzMTMsICAgICAgICAzMTMsICAgICAgICAxLCAgIDE1MjA2NCwgMHgzMGQzMTE3MgorMCwgICAgICAgIDMxNCwgICAgICAgIDMxNCwgICAgICAgIDEsICAgMTUyMDY0LCAweGUzMzYwOWI1CiswLCAgICAgICAgMzE1LCAgICAgICAgMzE1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NTM3N2JiODkKKzAsICAgICAgICAzMTYsICAgICAgICAzMTYsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1NDc5Y2QzZAorMCwgICAgICAgIDMxNywgICAgICAgIDMxNywgICAgICAgIDEsICAgMTUyMDY0LCAweDk2NGRhZDYwCiswLCAgICAgICAgMzE4LCAgICAgICAgMzE4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4M2E3ZGVhZjQKKzAsICAgICAgICAzMTksICAgICAgICAzMTksICAgICAgICAxLCAgIDE1MjA2NCwgMHhjZWQyMjMzMgorMCwgICAgICAgIDMyMCwgICAgICAgIDMyMCwgICAgICAgIDEsICAgMTUyMDY0LCAweDNiMzZiNTNmCiswLCAgICAgICAgMzIxLCAgICAgICAgMzIxLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTBjMzg2NjIKKzAsICAgICAgICAzMjIsICAgICAgICAzMjIsICAgICAgICAxLCAgIDE1MjA2NCwgMHg0NWQ0ZmNlYgorMCwgICAgICAgIDMyMywgICAgICAgIDMyMywgICAgICAgIDEsICAgMTUyMDY0LCAweDM1OWRhOTQ4CiswLCAgICAgICAgMzI0LCAgICAgICAgMzI0LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NjA2MjUxOTAKKzAsICAgICAgICAzMjUsICAgICAgICAzMjUsICAgICAgICAxLCAgIDE1MjA2NCwgMHgxY2RhOTg4OAorMCwgICAgICAgIDMyNiwgICAgICAgIDMyNiwgICAgICAgIDEsICAgMTUyMDY0LCAweDc3YWQxZDhjCiswLCAgICAgICAgMzI3LCAgICAgICAgMzI3LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MjBmMTUxMGYKKzAsICAgICAgICAzMjgsICAgICAgICAzMjgsICAgICAgICAxLCAgIDE1MjA2NCwgMHhkMTFkNTJjNgorMCwgICAgICAgIDMyOSwgICAgICAgIDMyOSwgICAgICAgIDEsICAgMTUyMDY0LCAweDlmMGU1Nzk3CiswLCAgICAgICAgMzMwLCAgICAgICAgMzMwLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MTc0Y2E1NWIKKzAsICAgICAgICAzMzEsICAgICAgICAzMzEsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4ZGY3OTA1NAorMCwgICAgICAgIDMzMiwgICAgICAgIDMzMiwgICAgICAgIDEsICAgMTUyMDY0LCAweDM4NDRhNDk1CiswLCAgICAgICAgMzMzLCAgICAgICAgMzMzLCAgICAgICAgMSwgICAxNTIwNjQsIDB4MjY4ZDlkMTIKKzAsICAgICAgICAzMzQsICAgICAgICAzMzQsICAgICAgICAxLCAgIDE1MjA2NCwgMHhmNjcyYjQ0ZgorMCwgICAgICAgIDMzNSwgICAgICAgIDMzNSwgICAgICAgIDEsICAgMTUyMDY0LCAweGUwYWM4N2NmCiswLCAgICAgICAgMzM2LCAgICAgICAgMzM2LCAgICAgICAgMSwgICAxNTIwNjQsIDB4YmM5OWZkN2QKKzAsICAgICAgICAzMzcsICAgICAgICAzMzcsICAgICAgICAxLCAgIDE1MjA2NCwgMHg4NzZlZjllMworMCwgICAgICAgIDMzOCwgICAgICAgIDMzOCwgICAgICAgIDEsICAgMTUyMDY0LCAweGVmODA2NmY3CiswLCAgICAgICAgMzM5LCAgICAgICAgMzM5LCAgICAgICAgMSwgICAxNTIwNjQsIDB4NzJhOTk1NjQKKzAsICAgICAgICAzNDAsICAgICAgICAzNDAsICAgICAgICAxLCAgIDE1MjA2NCwgMHg1OTIxYzA4OAorMCwgICAgICAgIDM0MSwgICAgICAgIDM0MSwgICAgICAgIDEsICAgMTUyMDY0LCAweDNhNmI5ZTc0CiswLCAgICAgICAgMzQyLCAgICAgICAgMzQyLCAgICAgICAgMSwgICAxNTIwNjQsIDB4ZmIwM2U5YjUKKzAsICAgICAgICAzNDMsICAgICAgICAzNDMsICAgICAgICAxLCAgIDE1MjA2NCwgMHhjMzUxYmZjNgorMCwgICAgICAgIDM0NCwgICAgICAgIDM0NCwgICAgICAgIDEsICAgMTUyMDY0LCAweDJmYWVjNzE3CiswLCAgICAgICAgMzQ1LCAgICAgICAgMzQ1LCAgICAgICAgMSwgICAxNTIwNjQsIDB4MDYyZmM2ZjMKKzAsICAgICAgICAzNDYsICAgICAgICAzNDYsICAgICAgICAxLCAgIDE1MjA2NCwgMHhlZGU3YTk3ZgorMCwgICAgICAgIDM0NywgICAgICAgIDM0NywgICAgICAgIDEsICAgMTUyMDY0LCAweDE5ODc0MTQ0CiswLCAgICAgICAgMzQ4LCAgICAgICAgMzQ4LCAgICAgICAgMSwgICAxNTIwNjQsIDB4OTI5NjUwZWIKKzAsICAgICAgICAzNDksICAgICAgICAzNDksICAgICAgICAxLCAgIDE1MjA2NCwgMHgwODI1NTdhMQorMCwgICAgICAgIDM1MCwgICAgICAgIDM1MCwgICAgICAgIDEsICAgMTUyMDY0LCAweDJiMjUxMDRiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tcGVnMi10aWNrZXQ2MDI0IGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzItdGlja2V0NjAyNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDQxNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzItdGlja2V0NjAyNApAQCAtMCwwICsxLDI3IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzE2eDIzNgorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDI1MzQ2NCwgMHhjNTFhNDZmOQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMjUzNDY0LCAweGQwNjYxNjUxCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAyNTM0NjQsIDB4MzhhMjEzYjMKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDI1MzQ2NCwgMHgwMzhhNTExOAorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMjUzNDY0LCAweGViZDhkZTY0CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAyNTM0NjQsIDB4MGIzMTllZTAKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDI1MzQ2NCwgMHgzN2IwM2E0NQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMjUzNDY0LCAweDVmOWM4OWFlCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAyNTM0NjQsIDB4ODhhZDljMDgKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDI1MzQ2NCwgMHgzODcxOThiYworMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMjUzNDY0LCAweGYzOTMzZWI2CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAyNTM0NjQsIDB4OWJkMjdiOTgKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDI1MzQ2NCwgMHg5NDQyYzUzOAorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMjUzNDY0LCAweDMzMGJlMmE0CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAyNTM0NjQsIDB4YjRiOGMxZGYKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDI1MzQ2NCwgMHhjOTdkZWQzNAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMjUzNDY0LCAweGNhZDkzNmUwCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAyNTM0NjQsIDB4MTFhMjg1MGQKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDI1MzQ2NCwgMHgyNTQ1YWQyMworMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMjUzNDY0LCAweGE1ZTE3YzQ3CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAyNTM0NjQsIDB4Mzk0NTI2ODkKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDI1MzQ2NCwgMHgxZGFlZmQ3MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXBlZzItdGlja2V0NjY3NyBiL3Rlc3RzL3JlZi9mYXRlL21wZWcyLXRpY2tldDY2NzcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2M2UzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21wZWcyLXRpY2tldDY2NzcKQEAgLTAsMCArMSwxMiBAQAorI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg0ODAKKyNzYXIgMDogOC85CiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YzE4NjZmNWYKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHg5YmEzMjc2NAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGE5MDMxYmI4CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NWUyYzM1MDIKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDUxODQwMCwgMHhlODYwMDI3YQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgNTE4NDAwLCAweGE5MTUyNDMwCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4Yjk4ZGQ5ZjcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21wZWc0LWJzZi11bnBhY2stYmZyYW1lcyBiL3Rlc3RzL3JlZi9mYXRlL21wZWc0LWJzZi11bnBhY2stYmZyYW1lcwppbmRleCAyMWU1OGY2Li43MDNhZTNhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9tcGVnNC1ic2YtdW5wYWNrLWJmcmFtZXMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzQtYnNmLXVucGFjay1iZnJhbWVzCkBAIC0xICsxIEBACi01ZGI2YjdiNzY2YzdhOWZkNWY0MjI5MmQ3NDY3YTM2ZAorYTBjNGJhMjFhYjlkNjg5NjZiOGZjZTdjYzg0OGUyYzYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21wZWc0LXBhY2tlZCBiL3Rlc3RzL3JlZi9mYXRlL21wZWc0LXBhY2tlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM2ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzQtcGFja2VkCkBAIC0wLDAgKzEsMjEgQEAKKyN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1NDR4MzUyCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjg3MjMyLCAweDE3Mjg4ZWQxCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyODcyMzIsIDB4MTcyODhlZDEKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDI4NzIzMiwgMHgyMzJkZmRhNAorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMjg3MjMyLCAweDFlODgwZWQ2CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAyODcyMzIsIDB4NjAxOTdkNzMKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDI4NzIzMiwgMHhlMjdhNGMwNQorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMjg3MjMyLCAweGE1ODhiNjU5CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAyODcyMzIsIDB4YWExMTE4OTUKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDI4NzIzMiwgMHgzOWFkNjRjMAorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMjg3MjMyLCAweDJhMDQ2YjYyCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAyODcyMzIsIDB4NzMzZGVhMzEKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDI4NzIzMiwgMHgwNmUzOGJmYworMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMjg3MjMyLCAweGNjMWQyZGU0CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAyODcyMzIsIDB4MjA3YTBhNjIKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDI4NzIzMiwgMHg5ZWU2Mjg5ZgorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMjg3MjMyLCAweDYwZGVkZjkyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tcGVnNC1yZXNvbHV0aW9uLWNoYW5nZS1kb3duLWRvd24gYi90ZXN0cy9yZWYvZmF0ZS9tcGVnNC1yZXNvbHV0aW9uLWNoYW5nZS1kb3duLWRvd24KaW5kZXggMDJmY2RhNS4uZGY1Mzc5NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbXBlZzQtcmVzb2x1dGlvbi1jaGFuZ2UtZG93bi1kb3duCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21wZWc0LXJlc29sdXRpb24tY2hhbmdlLWRvd24tZG93bgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgZDY1ZmNjNzljN2ViOWViZDlkODhkY2EzZWJiMTViZjQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQ2MDgwMCwgNmM4NmI4YzdlOGVhZTNkNjNiMjEzNDJmMjMzZmI0NGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21wZWc0LXJlc29sdXRpb24tY2hhbmdlLWRvd24tdXAgYi90ZXN0cy9yZWYvZmF0ZS9tcGVnNC1yZXNvbHV0aW9uLWNoYW5nZS1kb3duLXVwCmluZGV4IDM3ZTU2ZDguLjUyMzYxMTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21wZWc0LXJlc29sdXRpb24tY2hhbmdlLWRvd24tdXAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzQtcmVzb2x1dGlvbi1jaGFuZ2UtZG93bi11cApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgZDY1ZmNjNzljN2ViOWViZDlkODhkY2EzZWJiMTViZjQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQ2MDgwMCwgNmM4NmI4YzdlOGVhZTNkNjNiMjEzNDJmMjMzZmI0NGUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21wZWc0LXJlc29sdXRpb24tY2hhbmdlLXVwLWRvd24gYi90ZXN0cy9yZWYvZmF0ZS9tcGVnNC1yZXNvbHV0aW9uLWNoYW5nZS11cC1kb3duCmluZGV4IDM2MTEwYzMuLjA5MzBjYjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21wZWc0LXJlc29sdXRpb24tY2hhbmdlLXVwLWRvd24KKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzQtcmVzb2x1dGlvbi1jaGFuZ2UtdXAtZG93bgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQwMHgzMDAKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE4MDAwMCwgOWZjNjMwMjAyNmNmMmEyZGQzMTA2NDZiODNjNWRmYTEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE4MDAwMCwgYjFiMjY0NmM4ZGY1NzlkZGY4Njc2YmMyNDg4NDExYTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21wZWc0LXJlc29sdXRpb24tY2hhbmdlLXVwLXVwIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzQtcmVzb2x1dGlvbi1jaGFuZ2UtdXAtdXAKaW5kZXggOGQxYmJjZC4uYmE4MTJiNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbXBlZzQtcmVzb2x1dGlvbi1jaGFuZ2UtdXAtdXAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZzQtcmVzb2x1dGlvbi1jaGFuZ2UtdXAtdXAKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDdmOTUyZmQ4YmQ0MGMzMjE5N2FmYzIxZTJmYTY2NDA0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDViMmNjMjViMDRkOWE5ZDMzYmNmNWZlNDgwNTA1ZDY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tcGVncHMtcmVtdXhlZC1wY20tZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS9tcGVncHMtcmVtdXhlZC1wY20tZGVtdXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMjc3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21wZWdwcy1yZW11eGVkLXBjbS1kZW11eApAQCAtMCwwICsxLDUwIEBACisjdGIgMDogMS85MDAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fZHZkCisjc2FtcGxlX3JhdGUgMDogNDQxMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMjA0MCwgICAgIDIwMDUsIDB4OGU5OGU1NjMKKzAsICAgICAgIDIwOTAsICAgICAgIDIwOTAsICAgICAyMDY5LCAgICAgMjAzMywgMHhkNmYyZjQ1NQorMCwgICAgICAgNDE4MCwgICAgICAgNDE4MCwgICAgIDIwNTcsICAgICAyMDIxLCAweDc3YTZlNmM5CiswLCAgICAgICA2MjY5LCAgICAgICA2MjY5LCAgICAgMjA1NywgICAgIDIwMjEsIDB4OGRiY2Y2YmUKKzAsICAgICAgIDgzNTksICAgICAgIDgzNTksICAgICAyMDU3LCAgICAgMjAyMSwgMHhjNjI5ZWFhMAorMCwgICAgICAxMDQ0OSwgICAgICAxMDQ0OSwgICAgIDIwNTcsICAgICAyMDIxLCAweGE5NTFlYmU1CiswLCAgICAgIDEyNTM5LCAgICAgIDEyNTM5LCAgICAgMjA1NywgICAgIDIwMjEsIDB4MTMyNGYyOWIKKzAsICAgICAgMTQ2MjksICAgICAgMTQ2MjksICAgICAyMDU3LCAgICAgMjAyMSwgMHg1NWYxZTk2OAorMCwgICAgICAxNjcxOCwgICAgICAxNjcxOCwgICAgIDIwNTcsICAgICAyMDIxLCAweDk4YTdmOTk0CiswLCAgICAgIDE4ODA4LCAgICAgIDE4ODA4LCAgICAgMjA1NywgICAgIDIwMjEsIDB4YmE0MmY0MmYKKzAsICAgICAgMjA4OTgsICAgICAgMjA4OTgsICAgICAyMDU3LCAgICAgMjAyMSwgMHhjZjVjZWZlNgorMCwgICAgICAyMjk4OCwgICAgICAyMjk4OCwgICAgIDIwNTcsICAgICAyMDIxLCAweGVlZjhmMmI1CiswLCAgICAgIDI1MDc4LCAgICAgIDI1MDc4LCAgICAgMjA1NywgICAgIDIwMjEsIDB4NzFmYWY0MmYKKzAsICAgICAgMjcxNjcsICAgICAgMjcxNjcsICAgICAyMDU3LCAgICAgMjAyMSwgMHgwMzQ2ZjAxOQorMCwgICAgICAyOTI1NywgICAgICAyOTI1NywgICAgIDIwNTcsICAgICAyMDIxLCAweGJjYTBmNGEzCiswLCAgICAgIDMxMzQ3LCAgICAgIDMxMzQ3LCAgICAgMjA1NywgICAgIDIwMjEsIDB4M2I2Y2VkNGYKKzAsICAgICAgMzM0MzcsICAgICAgMzM0MzcsICAgICAyMDU3LCAgICAgMjAyMSwgMHhjOGI5ZWEwYQorMCwgICAgICAzNTUyNywgICAgICAzNTUyNywgICAgIDIwNTcsICAgICAyMDIxLCAweDE4ZTVmMzg1CiswLCAgICAgIDM3NjE2LCAgICAgIDM3NjE2LCAgICAgMjA1NywgICAgIDIwMjEsIDB4NzRmNmU5ZDYKKzAsICAgICAgMzk3MDYsICAgICAgMzk3MDYsICAgICAyMDU3LCAgICAgMjAyMSwgMHgzNWQ4ZjJiNQorMCwgICAgICA0MTc5NiwgICAgICA0MTc5NiwgICAgIDIwNTcsICAgICAyMDIxLCAweDlkMmFlYzUzCiswLCAgICAgIDQzODg2LCAgICAgIDQzODg2LCAgICAgMjA1NywgICAgIDIwMjEsIDB4ZjBhY2YxYTAKKzAsICAgICAgNDU5NzYsICAgICAgNDU5NzYsICAgICAyMDU3LCAgICAgMjAyMSwgMHhhNzI0ZWJlOQorMCwgICAgICA0ODA2NSwgICAgICA0ODA2NSwgICAgIDIwNTcsICAgICAyMDIxLCAweGQ0ZjhmNTM0CiswLCAgICAgIDUwMTU1LCAgICAgIDUwMTU1LCAgICAgMjA1NywgICAgIDIwMjEsIDB4ZGY2MmVmYzYKKzAsICAgICAgNTIyNDUsICAgICAgNTIyNDUsICAgICAyMDU3LCAgICAgMjAyMSwgMHg5ODY1ZjUwNAorMCwgICAgICA1NDMzNSwgICAgICA1NDMzNSwgICAgIDIwNTcsICAgICAyMDIxLCAweDg2NzBlZmI3CiswLCAgICAgIDU2NDI0LCAgICAgIDU2NDI0LCAgICAgMjA1NywgICAgIDIwMjEsIDB4ZTUxYWYyMTkKKzAsICAgICAgNTg1MTQsICAgICAgNTg1MTQsICAgICAyMDU3LCAgICAgMjAyMSwgMHgwMjEwZjI3ZgorMCwgICAgICA2MDYwNCwgICAgICA2MDYwNCwgICAgIDIwNTcsICAgICAyMDIxLCAweDRiMDhmNDA2CiswLCAgICAgIDYyNjk0LCAgICAgIDYyNjk0LCAgICAgMjA1NywgICAgIDIwMjEsIDB4MmIwMmVlZDQKKzAsICAgICAgNjQ3ODQsICAgICAgNjQ3ODQsICAgICAyMDU3LCAgICAgMjAyMSwgMHgwNDQ1ZWQwMAorMCwgICAgICA2Njg3MywgICAgICA2Njg3MywgICAgIDIwNTcsICAgICAyMDIxLCAweGZhZTlmMjFmCiswLCAgICAgIDY4OTYzLCAgICAgIDY4OTYzLCAgICAgMjA1NywgICAgIDIwMjEsIDB4M2Q2YmVhYmMKKzAsICAgICAgNzEwNTMsICAgICAgNzEwNTMsICAgICAyMDU3LCAgICAgMjAyMSwgMHhjNTBhZjM5YworMCwgICAgICA3MzE0MywgICAgICA3MzE0MywgICAgIDIwNTcsICAgICAyMDIxLCAweGY5ZWNlYjgyCiswLCAgICAgIDc1MjMzLCAgICAgIDc1MjMzLCAgICAgMjA1NywgICAgIDIwMjEsIDB4N2I4OWViOWIKKzAsICAgICAgNzczMjIsICAgICAgNzczMjIsICAgICAyMDU3LCAgICAgMjAyMSwgMHg3YzA3ZWY0YgorMCwgICAgICA3OTQxMiwgICAgICA3OTQxMiwgICAgIDIwNTcsICAgICAyMDIxLCAweGJmYWNmMWViCiswLCAgICAgIDgxNTAyLCAgICAgIDgxNTAyLCAgICAgMjA1NywgICAgIDIwMjEsIDB4Y2NiMmYyN2IKKzAsICAgICAgODM1OTIsICAgICAgODM1OTIsICAgICAyMDU3LCAgICAgMjAyMSwgMHhjMDM1ZjU1NworMCwgICAgICA4NTY4MiwgICAgICA4NTY4MiwgICAgIDIwNTcsICAgICAyMDIxLCAweGJkZjFlZGVhCiswLCAgICAgIDg3NzcxLCAgICAgIDg3NzcxLCAgICAgMjA1NywgICAgIDIwMjEsIDB4MzY0NGY0MjQKKzAsICAgICAgODk4NjEsICAgICAgODk4NjEsICAgICAxNDU3LCAgICAgMTQzMywgMHhkZDE3ZDUxZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXBlZ3RzLXByb2JlLWxhdG0gYi90ZXN0cy9yZWYvZmF0ZS9tcGVndHMtcHJvYmUtbGF0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2FlYTJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZ3RzLXByb2JlLWxhdG0KQEAgLTAsMCArMSwxNCBAQAorW1BST0dSQU1dCitbU1RSRUFNXQorY29kZWNfbmFtZT1oZXZjCitbL1NUUkVBTV0KK1tTVFJFQU1dCitjb2RlY19uYW1lPWFhY19sYXRtCitbL1NUUkVBTV0KK1svUFJPR1JBTV0KK1tTVFJFQU1dCitjb2RlY19uYW1lPWhldmMKK1svU1RSRUFNXQorW1NUUkVBTV0KK2NvZGVjX25hbWU9YWFjX2xhdG0KK1svU1RSRUFNXQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXBlZ3RzLXByb2JlLXByb2dyYW0gYi90ZXN0cy9yZWYvZmF0ZS9tcGVndHMtcHJvYmUtcHJvZ3JhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjEwMTJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXBlZ3RzLXByb2JlLXByb2dyYW0KQEAgLTAsMCArMSw4IEBACitbUFJPR1JBTV0KK1tTVFJFQU1dCitjb2RlY19uYW1lPWhldmMKK1svU1RSRUFNXQorWy9QUk9HUkFNXQorW1NUUkVBTV0KK2NvZGVjX25hbWU9aGV2YworWy9TVFJFQU1dCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tc21wZWc0djEgYi90ZXN0cy9yZWYvZmF0ZS9tc21wZWc0djEKaW5kZXggZDY3YTBlZi4uOTQ2ZWRlOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbXNtcGVnNHYxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21zbXBlZzR2MQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEyNjcyMCwgMHg4NDI4NDMyMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTI2NzIwLCAweDMzNmZlMjM2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMjY3MjAsIDB4OTAxZjEyOTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21zcmxlLThiaXQgYi90ZXN0cy9yZWYvZmF0ZS9tc3JsZS04Yml0CmluZGV4IDVkYjFjMjQuLjIwMmIzZjAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21zcmxlLThiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXNybGUtOGJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA4MzMzMy81MDAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDgweDQ4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDExNTIwLCAweGFmNDE2YTY2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMTE1MjAsIDB4OGFiNzY2NTQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAxMTUyMCwgMHhkMjI4ODBjNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXNzMS1wYWwgYi90ZXN0cy9yZWYvZmF0ZS9tc3MxLXBhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFmZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXNzMS1wYWwKQEAgLTAsMCArMSwyNSBAQAorI3RiIDA6IDEyLzIzCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMDI0eDc2OAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDc4NzQ1NiwgMHg5MzY5ZGFlYworMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNzg3NDU2LCAweDFjNjFhNWI4CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA3ODc0NTYsIDB4YjljM2FmMWYKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDc4NzQ1NiwgMHhjMDc4YmVjNworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgNzg3NDU2LCAweDMxYWVjZTdiCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICA3ODc0NTYsIDB4MDYwYTg2OWUKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDc4NzQ1NiwgMHgxMmJlYTkzNgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgNzg3NDU2LCAweGI0OTNhZjE5CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICA3ODc0NTYsIDB4YzhmNGIwY2MKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDc4NzQ1NiwgMHgyMWU0YWFkMAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgNzg3NDU2LCAweGVlODRiOGEwCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICA3ODc0NTYsIDB4Y2VjN2IyNTQKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDc4NzQ1NiwgMHg5MGI5OGYyMgorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgNzg3NDU2LCAweDExM2FlMzU1CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICA3ODc0NTYsIDB4YmUxZGVhZDkKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDc4NzQ1NiwgMHg4MTE2N2IyZQorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgNzg3NDU2LCAweGM2ZDY3YjJlCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICA3ODc0NTYsIDB4ZTE0Njg2Y2UKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDc4NzQ1NiwgMHhjNmQ2N2IyZQorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgNzg3NDU2LCAweDNlZjE2MmY2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tc3MyLXBhbCBiL3Rlc3RzL3JlZi9mYXRlL21zczItcGFsCmluZGV4IGFlOGJkNmYuLmEyZmIxMmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21zczItcGFsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21zczItcGFsCkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NDgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMCwgICAgIDkyMTYsIDB4ZDNjMTA2ZWYKIDAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAwLCAgICAgOTIxNiwgMHg4ODcxZjdjMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXNzMi1wYWxzIGIvdGVzdHMvcmVmL2ZhdGUvbXNzMi1wYWxzCmluZGV4IGFlOGJkNmYuLmEyZmIxMmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21zczItcGFscworKysgYi90ZXN0cy9yZWYvZmF0ZS9tc3MyLXBhbHMKQEAgLTEsMyArMSw3IEBACiAjdGIgMDogMS8xMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg0OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAwLCAgICAgOTIxNiwgMHhkM2MxMDZlZgogMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDAsICAgICA5MjE2LCAweDg4NzFmN2MyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tc3MyLXJnYjU1NSBiL3Rlc3RzL3JlZi9mYXRlL21zczItcmdiNTU1CmluZGV4IGQxNWIzYjQuLjEwZjFmMDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21zczItcmdiNTU1CisrKyBiL3Rlc3RzL3JlZi9mYXRlL21zczItcmdiNTU1CkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NDgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMCwgICAgIDYxNDQsIDB4NDE0NWI3YWUKIDAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAwLCAgICAgNjE0NCwgMHgzYjJiMzhkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXNzMi1yZ2I1NTVzIGIvdGVzdHMvcmVmL2ZhdGUvbXNzMi1yZ2I1NTVzCmluZGV4IGQxNWIzYjQuLjEwZjFmMDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21zczItcmdiNTU1cworKysgYi90ZXN0cy9yZWYvZmF0ZS9tc3MyLXJnYjU1NXMKQEAgLTEsMyArMSw3IEBACiAjdGIgMDogMS8xMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg0OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAwLCAgICAgNjE0NCwgMHg0MTQ1YjdhZQogMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDAsICAgICA2MTQ0LCAweDNiMmIzOGRlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tc3MyLXdtdiBiL3Rlc3RzL3JlZi9mYXRlL21zczItd212CmluZGV4IGM1NGNmZjYuLmQ5YWJiYjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21zczItd212CisrKyBiL3Rlc3RzL3JlZi9mYXRlL21zczItd212CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4MDAwMDAwMDAKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDIzMDQwMCwgMHhhZjk1MDAwOAogMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMjMwNDAwLCAweDhkMmEwMDEwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tc3ZpZGVvMS0xNmJpdCBiL3Rlc3RzL3JlZi9mYXRlL21zdmlkZW8xLTE2Yml0CmluZGV4IGY1YzBlNjQuLmQyOGQ5MmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21zdmlkZW8xLTE2Yml0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL21zdmlkZW8xLTE2Yml0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDMzMzY5LzUwMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTQ4eDE0OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA2NTcxMiwgMHgwM2ZmMjViOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY1NzEyLCAweGZjYTAyMjc2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNjU3MTIsIDB4ZDIzNjQ2ZTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL21zdmlkZW8xLThiaXQgYi90ZXN0cy9yZWYvZmF0ZS9tc3ZpZGVvMS04Yml0CmluZGV4IDc0ZDU0ZTguLmIyNzE0MzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL21zdmlkZW8xLThiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXN2aWRlbzEtOGJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxMDAwMC8zMDAwMDMKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2MHgxMjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNTc2MDAsIDB4OGMzYzVlZTgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA1NzYwMCwgMHhiNzk4MDBiMQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDU3NjAwLCAweDU0YTIyMWJlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tc3poIGIvdGVzdHMvcmVmL2ZhdGUvbXN6aAppbmRleCA0ZmY3NmZmLi4wMDdmZTAwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9tc3poCisrKyBiL3Rlc3RzL3JlZi9mYXRlL21zemgKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMTAwLzI5OTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyNTM0NDAsIDB4OTRhZjYxZTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL210czIgYi90ZXN0cy9yZWYvZmF0ZS9tdHMyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGZkZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9tdHMyCkBAIC0wLDAgKzEsMTMzIEBACisjdGIgMDogMTIvMTgxCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMTcyeDg1MgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAyOTk1NjMyLCAweGQ5OWJjZDU3CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZDk5YmNkNTcKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgMjk5NTYzMiwgMHhkOTliY2Q1NworMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAyOTk1NjMyLCAweGJlYjM1Mzc1CiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4YmViMzUzNzUKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgMjk5NTYzMiwgMHhiZWIzNTM3NQorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAyOTk1NjMyLCAweGJlYjM1Mzc1CiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4YmViMzUzNzUKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgMjk5NTYzMiwgMHhiZWIzNTM3NQorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAyOTk1NjMyLCAweGJlYjM1Mzc1CiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4Y2FhZTQxMDgKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgMjk5NTYzMiwgMHhjYWFlNDEwOAorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAyOTk1NjMyLCAweGNhYWU0MTA4CiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4Y2FhZTQxMDgKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgMjk5NTYzMiwgMHhjYWFlNDEwOAorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAyOTk1NjMyLCAweGNhYWU0MTA4CiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4OGFhMzhjZTAKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgMjk5NTYzMiwgMHg4YWEzOGNlMAorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAyOTk1NjMyLCAweDhhYTM4Y2UwCiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4OGFhMzhjZTAKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgMjk5NTYzMiwgMHg4YWEzOGNlMAorMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAyOTk1NjMyLCAweDhhYTM4Y2UwCiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MDU4ODVkMzAKKzAsICAgICAgICAgNTAsICAgICAgICAgNTAsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkM2VlZThlOAorMCwgICAgICAgICA1MSwgICAgICAgICA1MSwgICAgICAgIDEsICAyOTk1NjMyLCAweDBiODJlYTg0CiswLCAgICAgICAgIDUyLCAgICAgICAgIDUyLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MGI4MmVhODQKKzAsICAgICAgICAgNTMsICAgICAgICAgNTMsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOWYzMmM1ZQorMCwgICAgICAgICA1NCwgICAgICAgICA1NCwgICAgICAgIDEsICAyOTk1NjMyLCAweDE5ZjMyYzVlCiswLCAgICAgICAgIDU1LCAgICAgICAgIDU1LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MTlmMzJjNWUKKzAsICAgICAgICAgNTYsICAgICAgICAgNTYsICAgICAgICAxLCAgMjk5NTYzMiwgMHg0NzhiNDU1YworMCwgICAgICAgICA1NywgICAgICAgICA1NywgICAgICAgIDEsICAyOTk1NjMyLCAweDA4MjU2OTQwCiswLCAgICAgICAgIDU4LCAgICAgICAgIDU4LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MDgyNTY5NDAKKzAsICAgICAgICAgNTksICAgICAgICAgNTksICAgICAgICAxLCAgMjk5NTYzMiwgMHgwODI1Njk0MAorMCwgICAgICAgICA2MCwgICAgICAgICA2MCwgICAgICAgIDEsICAyOTk1NjMyLCAweDE4OGM4OGZjCiswLCAgICAgICAgIDYxLCAgICAgICAgIDYxLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4N2ZmNjU0MDMKKzAsICAgICAgICAgNjIsICAgICAgICAgNjIsICAgICAgICAxLCAgMjk5NTYzMiwgMHhlZjg2ODZkYgorMCwgICAgICAgICA2MywgICAgICAgICA2MywgICAgICAgIDEsICAyOTk1NjMyLCAweDhjYTM0MzIxCiswLCAgICAgICAgIDY0LCAgICAgICAgIDY0LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4NzIyZTE4ZDEKKzAsICAgICAgICAgNjUsICAgICAgICAgNjUsICAgICAgICAxLCAgMjk5NTYzMiwgMHg3MjJlMThkMQorMCwgICAgICAgICA2NiwgICAgICAgICA2NiwgICAgICAgIDEsICAyOTk1NjMyLCAweDBmMGMxNTc0CiswLCAgICAgICAgIDY3LCAgICAgICAgIDY3LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MGYwYzE1NzQKKzAsICAgICAgICAgNjgsICAgICAgICAgNjgsICAgICAgICAxLCAgMjk5NTYzMiwgMHgwZjBjMTU3NAorMCwgICAgICAgICA2OSwgICAgICAgICA2OSwgICAgICAgIDEsICAyOTk1NjMyLCAweDQ0MGM1MTgwCiswLCAgICAgICAgIDcwLCAgICAgICAgIDcwLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4NDQwYzUxODAKKzAsICAgICAgICAgNzEsICAgICAgICAgNzEsICAgICAgICAxLCAgMjk5NTYzMiwgMHg0NDBjNTE4MAorMCwgICAgICAgICA3MiwgICAgICAgICA3MiwgICAgICAgIDEsICAyOTk1NjMyLCAweDQ0MGM1MTgwCiswLCAgICAgICAgIDczLCAgICAgICAgIDczLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4NDQwYzUxODAKKzAsICAgICAgICAgNzQsICAgICAgICAgNzQsICAgICAgICAxLCAgMjk5NTYzMiwgMHg0NDBjNTE4MAorMCwgICAgICAgICA3NSwgICAgICAgICA3NSwgICAgICAgIDEsICAyOTk1NjMyLCAweDQ0MGM1MTgwCiswLCAgICAgICAgIDc2LCAgICAgICAgIDc2LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4NDQwYzUxODAKKzAsICAgICAgICAgNzcsICAgICAgICAgNzcsICAgICAgICAxLCAgMjk5NTYzMiwgMHg1MGI5NjU2YworMCwgICAgICAgICA3OCwgICAgICAgICA3OCwgICAgICAgIDEsICAyOTk1NjMyLCAweDUwYjk2NTZjCiswLCAgICAgICAgIDc5LCAgICAgICAgIDc5LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4NTBiOTY1NmMKKzAsICAgICAgICAgODAsICAgICAgICAgODAsICAgICAgICAxLCAgMjk5NTYzMiwgMHg1MGI5NjU2YworMCwgICAgICAgICA4MSwgICAgICAgICA4MSwgICAgICAgIDEsICAyOTk1NjMyLCAweDI5YzE3ZGViCiswLCAgICAgICAgIDgyLCAgICAgICAgIDgyLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4NmY4NjhkOGEKKzAsICAgICAgICAgODMsICAgICAgICAgODMsICAgICAgICAxLCAgMjk5NTYzMiwgMHgyZWE4OGQ1NQorMCwgICAgICAgICA4NCwgICAgICAgICA4NCwgICAgICAgIDEsICAyOTk1NjMyLCAweGUwMjA4YzhkCiswLCAgICAgICAgIDg1LCAgICAgICAgIDg1LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MjUwODRhOGYKKzAsICAgICAgICAgODYsICAgICAgICAgODYsICAgICAgICAxLCAgMjk5NTYzMiwgMHhkMGUzYmRkZAorMCwgICAgICAgICA4NywgICAgICAgICA4NywgICAgICAgIDEsICAyOTk1NjMyLCAweGM5YzNlMGZmCiswLCAgICAgICAgIDg4LCAgICAgICAgIDg4LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4Y2JlZmUwYjEKKzAsICAgICAgICAgODksICAgICAgICAgODksICAgICAgICAxLCAgMjk5NTYzMiwgMHhkN2IwZTAwZAorMCwgICAgICAgICA5MCwgICAgICAgICA5MCwgICAgICAgIDEsICAyOTk1NjMyLCAweDJkYzlkZmY4CiswLCAgICAgICAgIDkxLCAgICAgICAgIDkxLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MWVhOWE4MzUKKzAsICAgICAgICAgOTMsICAgICAgICAgOTMsICAgICAgICAxLCAgMjk5NTYzMiwgMHg5YmU5MWNjNworMCwgICAgICAgICA5NCwgICAgICAgICA5NCwgICAgICAgIDEsICAyOTk1NjMyLCAweDI3YzMxZDA5CiswLCAgICAgICAgIDk1LCAgICAgICAgIDk1LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4YzRkNjVjMGMKKzAsICAgICAgICAgOTYsICAgICAgICAgOTYsICAgICAgICAxLCAgMjk5NTYzMiwgMHhjNGQ2NWMwYworMCwgICAgICAgICA5NywgICAgICAgICA5NywgICAgICAgIDEsICAyOTk1NjMyLCAweGM0ZDY1YzBjCiswLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4YzRkNjVjMGMKKzAsICAgICAgICAgOTksICAgICAgICAgOTksICAgICAgICAxLCAgMjk5NTYzMiwgMHhjNGQ2NWMwYworMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDEsICAyOTk1NjMyLCAweGNlYjdiZGU3CiswLCAgICAgICAgMTAxLCAgICAgICAgMTAxLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4ZmJhY2U4YjAKKzAsICAgICAgICAxMDIsICAgICAgICAxMDIsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDEwMywgICAgICAgIDEwMywgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMDUsICAgICAgICAxMDUsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDEwNiwgICAgICAgIDEwNiwgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTA3LCAgICAgICAgMTA3LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMDgsICAgICAgICAxMDgsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDEwOSwgICAgICAgIDEwOSwgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTEwLCAgICAgICAgMTEwLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMTEsICAgICAgICAxMTEsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDExMiwgICAgICAgIDExMiwgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTEzLCAgICAgICAgMTEzLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMTQsICAgICAgICAxMTQsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDExNSwgICAgICAgIDExNSwgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTE2LCAgICAgICAgMTE2LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMTcsICAgICAgICAxMTcsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDExOCwgICAgICAgIDExOCwgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTE5LCAgICAgICAgMTE5LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMjAsICAgICAgICAxMjAsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDEyMSwgICAgICAgIDEyMSwgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTIyLCAgICAgICAgMTIyLCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMjMsICAgICAgICAxMjMsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDEyNCwgICAgICAgIDEyNCwgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTI1LCAgICAgICAgMTI1LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMjYsICAgICAgICAxMjYsICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDEyNywgICAgICAgIDEyNywgICAgICAgIDEsICAyOTk1NjMyLCAweDE4YWI2YjM1CiswLCAgICAgICAgMTI4LCAgICAgICAgMTI4LCAgICAgICAgMSwgIDI5OTU2MzIsIDB4MThhYjZiMzUKKzAsICAgICAgICAxMjksICAgICAgICAxMjksICAgICAgICAxLCAgMjk5NTYzMiwgMHgxOGFiNmIzNQorMCwgICAgICAgIDEzMCwgICAgICAgIDEzMCwgICAgICAgIDEsICAyOTk1NjMyLCAweDY4ZjZkMGU3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tdHMyLXhlc2MgYi90ZXN0cy9yZWYvZmF0ZS9tdHMyLXhlc2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0MDc0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL210czIteGVzYwpAQCAtMCwwICsxLDIyIEBACisjdGIgMDogMTIvMTg1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMzY4eDc2OAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzE1MTg3MiwgMHg5MGFhMTk0MworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAzMTUxODcyLCAweGJiZTY3MGRlCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDMxNTE4NzIsIDB4ODE4ZDhjMWMKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgMzE1MTg3MiwgMHhjMmNmNTEwZAorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAzMTUxODcyLCAweGZmOTA0Y2RhCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDMxNTE4NzIsIDB4Yzg0M2ZjZTgKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgMzE1MTg3MiwgMHhiZmMyNGU2ZQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAzMTUxODcyLCAweDVlZWE0NWJjCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDMxNTE4NzIsIDB4ODY2MzRiNTIKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgMzE1MTg3MiwgMHg4NjYzNGI1MgorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAzMTUxODcyLCAweDg2NjM0YjUyCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDMxNTE4NzIsIDB4ODY2MzRiNTIKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgMzE1MTg3MiwgMHg4NjYzNGI1MgorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAzMTUxODcyLCAweDg2NjM0YjUyCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgIDMxNTE4NzIsIDB4ODY2MzRiNTIKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgMzE1MTg3MiwgMHhhZjU0MjYzMgorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAzMTUxODcyLCAweDhmMTZjZGFmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tdHYgYi90ZXN0cy9yZWYvZmF0ZS9tdHYKaW5kZXggOWU4OThmZi4uN2IxN2JjMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbXR2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL210dgpAQCAtMSw2ICsxLDE1IEBACiAjZXh0cmFkYXRhIDA6ICAgICAgICA5LCAweDExNmMwMzNhCiAjdGIgMDogMS8xNgorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogOTZ4NjQKKyNzYXIgMDogMC8xCiAjdGIgMTogMS80NDEwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBtcDMKKyNzYW1wbGVfcmF0ZSAxOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDEyMjg4LCAweGMyMjU4ZWJjCiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTE1MiwgICAgICA0MTcsIDB4YWUxY2M2NmEKIDEsICAgICAgIDExNTIsICAgICAgIDExNTIsICAgICAxMTUyLCAgICAgIDQxOCwgMHhkYzNlYzg1MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXYtbXZjMSBiL3Rlc3RzL3JlZi9mYXRlL212LW12YzEKaW5kZXggMDczYzk1YS4uNTMyN2FmMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbXYtbXZjMQorKysgYi90ZXN0cy9yZWYvZmF0ZS9tdi1tdmMxCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM4NHgyODgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMjExODQsIDB4MzQwYWIwODAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIyMTE4NCwgMHhjMjExMDVhMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjIxMTg0LCAweGE3NDgyYWIzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9tdi1tdmMyIGIvdGVzdHMvcmVmL2ZhdGUvbXYtbXZjMgppbmRleCA5OWFjZGMwLi43NjM5ZjNkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9tdi1tdmMyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL212LW12YzIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS82MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTY4eDE4OAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEyNjMzNiwgMHhiNTBlOGJiMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTI2MzM2LCAweGRjMjYwY2ZhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMjYzMzYsIDB4Mjc2MmYwZDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL212LXNnaXJsZSBiL3Rlc3RzL3JlZi9mYXRlL212LXNnaXJsZQppbmRleCA2MGFmZjBhLi4zZjVkZTJiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9tdi1zZ2lybGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXYtc2dpcmxlCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTAweDM3NQorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE4NzUwMCwgMHhmMmMyNmEzOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTg3NTAwLCAweGY2NWU2ZWE1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxODc1MDAsIDB4ODA0Zjc4ZDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL214Zi1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL214Zi1kZW11eAppbmRleCAzZDlhMmRjLi45MDZhNmQwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9teGYtZGVtdXgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXhmLWRlbXV4CkBAIC0xLDYgKzEsMTUgQEAKICNleHRyYWRhdGEgMDogICAgICAgMTgsIDB4MGIxNTAyNDQKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IG1wZWc0CisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDE2LzExCiAjdGIgMTogMS84MDAwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IHBjbV9hbGF3Cisjc2FtcGxlX3JhdGUgMTogODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgODQ2OCwgMHhjMDg1NTU1MwogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgMTYwMDAsICAgIDMyMDAwLCAweDQ3OTE1NWU2CiAwLCAgICAgICAgICAxLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICAzODE0LCAweGExMDc4M2I0LCBGPTB4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXhmLWVzc2VuY2Vncm91cC1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL214Zi1lc3NlbmNlZ3JvdXAtZGVtdXgKaW5kZXggODQyMGRiOS4uODA0NWNkZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbXhmLWVzc2VuY2Vncm91cC1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9teGYtZXNzZW5jZWdyb3VwLWRlbXV4CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEwMDEvMjQwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMjA4MDc2OCwgMHhlOTkyMzNkOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXhmLW1ldGFkYXRhLXNvdXJjZS1yZWYxIGIvdGVzdHMvcmVmL2ZhdGUvbXhmLW1ldGFkYXRhLXNvdXJjZS1yZWYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZTFlNDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9teGYtbWV0YWRhdGEtc291cmNlLXJlZjEKQEAgLTAsMCArMSwxMyBAQAorO0ZGTUVUQURBVEExCitbU1RSRUFNXQorZmlsZV9wYWNrYWdlX3VtaWQ9MHgwNjBBMkIzNDAxMDEwMTAxMDEwMTBGMDAxMzAwMDAwMDU3RTE5RDE2QkE4MzAyREIwNjBFMkIzNDdGN0YyQTgwCit0cmFja19uYW1lPUJhc2UKK2RhdGFfdHlwZT12aWRlbworW1NUUkVBTV0KK2ZpbGVfcGFja2FnZV91bWlkPTB4MDYwQTJCMzQwMTAxMDEwMTAxMDEwRjAwMTMwMDAwMDA1N0UxOUQxNkJBODUwMkRCMDYwRTJCMzQ3RjdGMkE4MAordHJhY2tfbmFtZT1MZWZ0IENoYW5uZWwKK2RhdGFfdHlwZT1hdWRpbworW1NUUkVBTV0KK2ZpbGVfcGFja2FnZV91bWlkPTB4MDYwQTJCMzQwMTAxMDEwMTAxMDEwRjAwMTMwMDAwMDA1N0UxOUQxNkJBODYwMkRCMDYwRTJCMzQ3RjdGMkE4MAordHJhY2tfbmFtZT1SaWdodCBDaGFubmVsCitkYXRhX3R5cGU9YXVkaW8KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL214Zi1tZXRhZGF0YS1zb3VyY2UtcmVmMiBiL3Rlc3RzL3JlZi9mYXRlL214Zi1tZXRhZGF0YS1zb3VyY2UtcmVmMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2ZhMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXhmLW1ldGFkYXRhLXNvdXJjZS1yZWYyCkBAIC0wLDAgKzEsMTMgQEAKKztGRk1FVEFEQVRBMQorW1NUUkVBTV0KK2ZpbGVfcGFja2FnZV91bWlkPTB4MDYwQTJCMzQwMTAxMDEwMTAxMDEwRjAwMTMwMDAwMDA1N0UxOUQxNkJBODMwMkRCMDYwRTJCMzQ3RjdGMkE4MAordHJhY2tfbmFtZT1CYXNlCitkYXRhX3R5cGU9dmlkZW8KK1tTVFJFQU1dCitmaWxlX3BhY2thZ2VfdW1pZD0weDA2MEEyQjM0MDEwMTAxMDEwMTAxMEYwMDEzMDAwMDAwNTdFMTlEMTZCQTg0MDJEQjA2MEUyQjM0N0Y3RjJBODAKK3RyYWNrX25hbWU9VGl0bGVzCitkYXRhX3R5cGU9dmlkZW8KK1tTVFJFQU1dCitmaWxlX3BhY2thZ2VfdW1pZD0weDA2MEEyQjM0MDEwMTAxMDEwMTAxMEYwMDEzMDAwMDAwNTdFMTlEMTZCQTg2MDJEQjA2MEUyQjM0N0Y3RjJBODAKK3RyYWNrX25hbWU9UmlnaHQgQ2hhbm5lbAorZGF0YV90eXBlPWF1ZGlvCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9teGYtbXVsdGlwbGUtY29tcG9uZW50cy1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL214Zi1tdWx0aXBsZS1jb21wb25lbnRzLWRlbXV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYTdiYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9teGYtbXVsdGlwbGUtY29tcG9uZW50cy1kZW11eApAQCAtMCwwICsxLDExIEBACisjdGIgMDogMTAwMS8yNDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBkbnhoZAorI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyODY3MiwgMHg3YTRiMDA0NAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDI4NjcyLCAweDc1ZGMyOWE2CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjg2NzIsIDB4ZWNhYmQ0NGIKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAyODY3MiwgMHhjOTE3YTk2ZQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgIDI4NjcyLCAweDc4MDVjZmQ1CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAgMjg2NzIsIDB4NTVkMjZkYWIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL214Zi1wcm9iZS1kMTAgYi90ZXN0cy9yZWYvZmF0ZS9teGYtcHJvYmUtZDEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwY2VhYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9teGYtcHJvYmUtZDEwCkBAIC0wLDAgKzEsMTA4IEBACitbU1RSRUFNXQoraW5kZXg9MAorY29kZWNfbmFtZT1tcGVnMnZpZGVvCitwcm9maWxlPTAKK2NvZGVjX3R5cGU9dmlkZW8KK2NvZGVjX3RpbWVfYmFzZT0xLzI1Citjb2RlY190YWdfc3RyaW5nPVswXVswXVswXVswXQorY29kZWNfdGFnPTB4MDAwMAord2lkdGg9NzIwCitoZWlnaHQ9NjA4Citjb2RlZF93aWR0aD0wCitjb2RlZF9oZWlnaHQ9MAoraGFzX2JfZnJhbWVzPTAKK3NhbXBsZV9hc3BlY3RfcmF0aW89MTUyOjEzNQorZGlzcGxheV9hc3BlY3RfcmF0aW89NDozCitwaXhfZm10PXl1djQyMnAKK2xldmVsPTUKK2NvbG9yX3JhbmdlPXR2Citjb2xvcl9zcGFjZT11bmtub3duCitjb2xvcl90cmFuc2Zlcj11bmtub3duCitjb2xvcl9wcmltYXJpZXM9dW5rbm93bgorY2hyb21hX2xvY2F0aW9uPXRvcGxlZnQKK2ZpZWxkX29yZGVyPXR0Cit0aW1lY29kZT1OL0EKK3JlZnM9MQoraWQ9Ti9BCityX2ZyYW1lX3JhdGU9MjUvMQorYXZnX2ZyYW1lX3JhdGU9MjUvMQordGltZV9iYXNlPTEvMjUKK3N0YXJ0X3B0cz0wCitzdGFydF90aW1lPTAuMDAwMDAwCitkdXJhdGlvbl90cz00CitkdXJhdGlvbj0wLjE2MDAwMAorYml0X3JhdGU9NTAwMDAwMDAKK21heF9iaXRfcmF0ZT1OL0EKK2JpdHNfcGVyX3Jhd19zYW1wbGU9Ti9BCituYl9mcmFtZXM9Ti9BCituYl9yZWFkX2ZyYW1lcz1OL0EKK25iX3JlYWRfcGFja2V0cz1OL0EKK0RJU1BPU0lUSU9OOmRlZmF1bHQ9MAorRElTUE9TSVRJT046ZHViPTAKK0RJU1BPU0lUSU9OOm9yaWdpbmFsPTAKK0RJU1BPU0lUSU9OOmNvbW1lbnQ9MAorRElTUE9TSVRJT046bHlyaWNzPTAKK0RJU1BPU0lUSU9OOmthcmFva2U9MAorRElTUE9TSVRJT046Zm9yY2VkPTAKK0RJU1BPU0lUSU9OOmhlYXJpbmdfaW1wYWlyZWQ9MAorRElTUE9TSVRJT046dmlzdWFsX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOmNsZWFuX2VmZmVjdHM9MAorRElTUE9TSVRJT046YXR0YWNoZWRfcGljPTAKK0RJU1BPU0lUSU9OOnRpbWVkX3RodW1ibmFpbHM9MAorVEFHOmZpbGVfcGFja2FnZV91bWlkPTB4MDYwQTJCMzQwMTAxMDEwNTAxMDEwRDEzMTMwMDAwMDBBRTg2QjIwMDkxMzEwNTgwMDAwMDA4MDA0NkE1NDAxMQorWy9TVFJFQU1dCitbU1RSRUFNXQoraW5kZXg9MQorY29kZWNfbmFtZT1wY21fczE2bGUKK3Byb2ZpbGU9dW5rbm93bgorY29kZWNfdHlwZT1hdWRpbworY29kZWNfdGltZV9iYXNlPTEvNDgwMDAKK2NvZGVjX3RhZ19zdHJpbmc9WzBdWzBdWzBdWzBdCitjb2RlY190YWc9MHgwMDAwCitzYW1wbGVfZm10PXMxNgorc2FtcGxlX3JhdGU9NDgwMDAKK2NoYW5uZWxzPTgKK2NoYW5uZWxfbGF5b3V0PXVua25vd24KK2JpdHNfcGVyX3NhbXBsZT0xNgoraWQ9Ti9BCityX2ZyYW1lX3JhdGU9MC8wCithdmdfZnJhbWVfcmF0ZT0wLzAKK3RpbWVfYmFzZT0xLzQ4MDAwCitzdGFydF9wdHM9MAorc3RhcnRfdGltZT0wLjAwMDAwMAorZHVyYXRpb25fdHM9ODU2MgorZHVyYXRpb249MC4xNzgzNzUKK2JpdF9yYXRlPTYxNDQwMDAKK21heF9iaXRfcmF0ZT1OL0EKK2JpdHNfcGVyX3Jhd19zYW1wbGU9Ti9BCituYl9mcmFtZXM9Ti9BCituYl9yZWFkX2ZyYW1lcz1OL0EKK25iX3JlYWRfcGFja2V0cz1OL0EKK0RJU1BPU0lUSU9OOmRlZmF1bHQ9MAorRElTUE9TSVRJT046ZHViPTAKK0RJU1BPU0lUSU9OOm9yaWdpbmFsPTAKK0RJU1BPU0lUSU9OOmNvbW1lbnQ9MAorRElTUE9TSVRJT046bHlyaWNzPTAKK0RJU1BPU0lUSU9OOmthcmFva2U9MAorRElTUE9TSVRJT046Zm9yY2VkPTAKK0RJU1BPU0lUSU9OOmhlYXJpbmdfaW1wYWlyZWQ9MAorRElTUE9TSVRJT046dmlzdWFsX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOmNsZWFuX2VmZmVjdHM9MAorRElTUE9TSVRJT046YXR0YWNoZWRfcGljPTAKK0RJU1BPU0lUSU9OOnRpbWVkX3RodW1ibmFpbHM9MAorVEFHOmZpbGVfcGFja2FnZV91bWlkPTB4MDYwQTJCMzQwMTAxMDEwNTAxMDEwRDEzMTMwMDAwMDBBRTg2QjIwMDkxMzEwNTgwMDAwMDA4MDA0NkE1NDAxMQorWy9TVFJFQU1dCitbRk9STUFUXQorZm9ybWF0X25hbWU9bXhmCitkdXJhdGlvbj0wLjE3ODM3NQorYml0X3JhdGU9NTY0MTk3NDQKK1RBRzp1aWQ9MDA4NmIyMDAtOTEzMS0wNTgwLTAwMDAtMDgwMDQ2YTU0MDExCitUQUc6Z2VuZXJhdGlvbl91aWQ9YjQ4NmIyMDAtOTEzMS0wNTgwLTAwMDAtMDgwMDQ2YTU0MDExCitUQUc6Y29tcGFueV9uYW1lPVNPTlkKK1RBRzpwcm9kdWN0X25hbWU9ZVZUUgorVEFHOnByb2R1Y3RfdmVyc2lvbj0xLjAwCitUQUc6cHJvZHVjdF91aWQ9MDYwZTJiMzQtMDQwMS0wMTA2LTBlMDYtMDEyMDAxMDEwMTAwCitUQUc6bW9kaWZpY2F0aW9uX2RhdGU9MjAwNC0wNy0wNVQyMTozOTowMC4wMDAwMDBaCitUQUc6bWF0ZXJpYWxfcGFja2FnZV91bWlkPTB4MDYwQTJCMzQwMTAxMDEwNTAxMDEwRDEzMTMwMDAwMDBBODg2QjIwMDkxMzEwNTgwMDAwMDA4MDA0NkE1NDAxMQorVEFHOnRpbWVjb2RlPTA3OjEyOjEwOjAwCitbL0ZPUk1BVF0KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL214Zi1wcm9iZS1kbnhoZCBiL3Rlc3RzL3JlZi9mYXRlL214Zi1wcm9iZS1kbnhoZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGRlMjkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXhmLXByb2JlLWRueGhkCkBAIC0wLDAgKzEsMTgyIEBACitbU1RSRUFNXQoraW5kZXg9MAorY29kZWNfbmFtZT11bmtub3duCitwcm9maWxlPXVua25vd24KK2NvZGVjX3R5cGU9ZGF0YQorY29kZWNfdGFnX3N0cmluZz1bMF1bMF1bMF1bMF0KK2NvZGVjX3RhZz0weDAwMDAKK2lkPU4vQQorcl9mcmFtZV9yYXRlPTAvMAorYXZnX2ZyYW1lX3JhdGU9MC8wCit0aW1lX2Jhc2U9MS85MDAwMAorc3RhcnRfcHRzPTAKK3N0YXJ0X3RpbWU9MC4wMDAwMDAKK2R1cmF0aW9uX3RzPTIyNTIzCitkdXJhdGlvbj0wLjI1MDI1NgorYml0X3JhdGU9Ti9BCittYXhfYml0X3JhdGU9Ti9BCitiaXRzX3Blcl9yYXdfc2FtcGxlPU4vQQorbmJfZnJhbWVzPU4vQQorbmJfcmVhZF9mcmFtZXM9Ti9BCituYl9yZWFkX3BhY2tldHM9Ti9BCitESVNQT1NJVElPTjpkZWZhdWx0PTAKK0RJU1BPU0lUSU9OOmR1Yj0wCitESVNQT1NJVElPTjpvcmlnaW5hbD0wCitESVNQT1NJVElPTjpjb21tZW50PTAKK0RJU1BPU0lUSU9OOmx5cmljcz0wCitESVNQT1NJVElPTjprYXJhb2tlPTAKK0RJU1BPU0lUSU9OOmZvcmNlZD0wCitESVNQT1NJVElPTjpoZWFyaW5nX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOnZpc3VhbF9pbXBhaXJlZD0wCitESVNQT1NJVElPTjpjbGVhbl9lZmZlY3RzPTAKK0RJU1BPU0lUSU9OOmF0dGFjaGVkX3BpYz0wCitESVNQT1NJVElPTjp0aW1lZF90aHVtYm5haWxzPTAKK1RBRzpmaWxlX3BhY2thZ2VfdW1pZD0weDA2MEEyQjM0MDEwMTAxMDEwMTAxMEYwMDEzMDAwMDAwNTdERUVBMjVCN0Q4MEM5NDA2MEUyQjM0N0Y3RjJBODAKK1RBRzpkYXRhX3R5cGU9YXVkaW8KK1svU1RSRUFNXQorW1NUUkVBTV0KK2luZGV4PTEKK2NvZGVjX25hbWU9dW5rbm93bgorcHJvZmlsZT11bmtub3duCitjb2RlY190eXBlPWRhdGEKK2NvZGVjX3RhZ19zdHJpbmc9WzBdWzBdWzBdWzBdCitjb2RlY190YWc9MHgwMDAwCitpZD1OL0EKK3JfZnJhbWVfcmF0ZT0wLzAKK2F2Z19mcmFtZV9yYXRlPTAvMAordGltZV9iYXNlPTEvOTAwMDAKK3N0YXJ0X3B0cz0wCitzdGFydF90aW1lPTAuMDAwMDAwCitkdXJhdGlvbl90cz0yMjUyMworZHVyYXRpb249MC4yNTAyNTYKK2JpdF9yYXRlPU4vQQorbWF4X2JpdF9yYXRlPU4vQQorYml0c19wZXJfcmF3X3NhbXBsZT1OL0EKK25iX2ZyYW1lcz1OL0EKK25iX3JlYWRfZnJhbWVzPU4vQQorbmJfcmVhZF9wYWNrZXRzPU4vQQorRElTUE9TSVRJT046ZGVmYXVsdD0wCitESVNQT1NJVElPTjpkdWI9MAorRElTUE9TSVRJT046b3JpZ2luYWw9MAorRElTUE9TSVRJT046Y29tbWVudD0wCitESVNQT1NJVElPTjpseXJpY3M9MAorRElTUE9TSVRJT046a2FyYW9rZT0wCitESVNQT1NJVElPTjpmb3JjZWQ9MAorRElTUE9TSVRJT046aGVhcmluZ19pbXBhaXJlZD0wCitESVNQT1NJVElPTjp2aXN1YWxfaW1wYWlyZWQ9MAorRElTUE9TSVRJT046Y2xlYW5fZWZmZWN0cz0wCitESVNQT1NJVElPTjphdHRhY2hlZF9waWM9MAorRElTUE9TSVRJT046dGltZWRfdGh1bWJuYWlscz0wCitUQUc6ZmlsZV9wYWNrYWdlX3VtaWQ9MHgwNjBBMkIzNDAxMDEwMTAxMDEwMTBGMDAxMzAwMDAwMDU3REVFQTI1QjdGNDBDOTQwNjBFMkIzNDdGN0YyQTgwCitUQUc6ZGF0YV90eXBlPWF1ZGlvCitbL1NUUkVBTV0KK1tTVFJFQU1dCitpbmRleD0yCitjb2RlY19uYW1lPXVua25vd24KK3Byb2ZpbGU9dW5rbm93bgorY29kZWNfdHlwZT1kYXRhCitjb2RlY190YWdfc3RyaW5nPVswXVswXVswXVswXQorY29kZWNfdGFnPTB4MDAwMAoraWQ9Ti9BCityX2ZyYW1lX3JhdGU9MC8wCithdmdfZnJhbWVfcmF0ZT0wLzAKK3RpbWVfYmFzZT0xLzkwMDAwCitzdGFydF9wdHM9MAorc3RhcnRfdGltZT0wLjAwMDAwMAorZHVyYXRpb25fdHM9MjI1MjMKK2R1cmF0aW9uPTAuMjUwMjU2CitiaXRfcmF0ZT1OL0EKK21heF9iaXRfcmF0ZT1OL0EKK2JpdHNfcGVyX3Jhd19zYW1wbGU9Ti9BCituYl9mcmFtZXM9Ti9BCituYl9yZWFkX2ZyYW1lcz1OL0EKK25iX3JlYWRfcGFja2V0cz1OL0EKK0RJU1BPU0lUSU9OOmRlZmF1bHQ9MAorRElTUE9TSVRJT046ZHViPTAKK0RJU1BPU0lUSU9OOm9yaWdpbmFsPTAKK0RJU1BPU0lUSU9OOmNvbW1lbnQ9MAorRElTUE9TSVRJT046bHlyaWNzPTAKK0RJU1BPU0lUSU9OOmthcmFva2U9MAorRElTUE9TSVRJT046Zm9yY2VkPTAKK0RJU1BPU0lUSU9OOmhlYXJpbmdfaW1wYWlyZWQ9MAorRElTUE9TSVRJT046dmlzdWFsX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOmNsZWFuX2VmZmVjdHM9MAorRElTUE9TSVRJT046YXR0YWNoZWRfcGljPTAKK0RJU1BPU0lUSU9OOnRpbWVkX3RodW1ibmFpbHM9MAorVEFHOmZpbGVfcGFja2FnZV91bWlkPTB4MDYwQTJCMzQwMTAxMDEwMTAxMDEwRjAwMTMwMDAwMDA1N0RFRUEyNUI4MDUwQzk0MDYwRTJCMzQ3RjdGMkE4MAorVEFHOmRhdGFfdHlwZT12aWRlbworWy9TVFJFQU1dCitbU1RSRUFNXQoraW5kZXg9MworY29kZWNfbmFtZT1kbnhoZAorcHJvZmlsZT0xCitjb2RlY190eXBlPXZpZGVvCitjb2RlY190aW1lX2Jhc2U9MC8xCitjb2RlY190YWdfc3RyaW5nPVswXVswXVswXVswXQorY29kZWNfdGFnPTB4MDAwMAord2lkdGg9NjQwCitoZWlnaHQ9NDgwCitjb2RlZF93aWR0aD02NDAKK2NvZGVkX2hlaWdodD00ODAKK2hhc19iX2ZyYW1lcz0wCitzYW1wbGVfYXNwZWN0X3JhdGlvPTE6MQorZGlzcGxheV9hc3BlY3RfcmF0aW89NDozCitwaXhfZm10PXl1djQyMnAKK2xldmVsPS05OQorY29sb3JfcmFuZ2U9dW5rbm93bgorY29sb3Jfc3BhY2U9YnQ3MDkKK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjaHJvbWFfbG9jYXRpb249dW5zcGVjaWZpZWQKK2ZpZWxkX29yZGVyPXByb2dyZXNzaXZlCit0aW1lY29kZT1OL0EKK3JlZnM9MQoraWQ9Ti9BCityX2ZyYW1lX3JhdGU9MjQwMDAvMTAwMQorYXZnX2ZyYW1lX3JhdGU9MC8wCit0aW1lX2Jhc2U9MTAwMS8yNDAwMAorc3RhcnRfcHRzPTAKK3N0YXJ0X3RpbWU9MC4wMDAwMDAKK2R1cmF0aW9uX3RzPTYKK2R1cmF0aW9uPTAuMjUwMjUwCitiaXRfcmF0ZT1OL0EKK21heF9iaXRfcmF0ZT1OL0EKK2JpdHNfcGVyX3Jhd19zYW1wbGU9OAorbmJfZnJhbWVzPU4vQQorbmJfcmVhZF9mcmFtZXM9Ti9BCituYl9yZWFkX3BhY2tldHM9Ti9BCitESVNQT1NJVElPTjpkZWZhdWx0PTAKK0RJU1BPU0lUSU9OOmR1Yj0wCitESVNQT1NJVElPTjpvcmlnaW5hbD0wCitESVNQT1NJVElPTjpjb21tZW50PTAKK0RJU1BPU0lUSU9OOmx5cmljcz0wCitESVNQT1NJVElPTjprYXJhb2tlPTAKK0RJU1BPU0lUSU9OOmZvcmNlZD0wCitESVNQT1NJVElPTjpoZWFyaW5nX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOnZpc3VhbF9pbXBhaXJlZD0wCitESVNQT1NJVElPTjpjbGVhbl9lZmZlY3RzPTAKK0RJU1BPU0lUSU9OOmF0dGFjaGVkX3BpYz0wCitESVNQT1NJVElPTjp0aW1lZF90aHVtYm5haWxzPTAKK1RBRzpmaWxlX3BhY2thZ2VfdW1pZD0weDA2MEEyQjM0MDEwMTAxMDEwMTAxMEYwMDEzMDAwMDAwNTdERUVBMjVCODREMEM5NDA2MEUyQjM0N0Y3RjJBODAKK1RBRzpmaWxlX3BhY2thZ2VfbmFtZT1kbnhocl9leHBvcnQuYWFmCitUQUc6cmVlbF91bWlkPTB4MDYwQTJCMzQwMTAxMDEwMTAxMDEwRjAwMTMwMDAwMDA1N0RFRUExNTcwODk1MzEzMDYwRTJCMzQ3RjdGMkE4MAorVEFHOnJlZWxfbmFtZT1zYW1wbGVfZm9vdGFnZQorVEFHOnRpbWVjb2RlPTAxOjAwOjAwOjAwCitbL1NUUkVBTV0KK1tGT1JNQVRdCitmb3JtYXRfbmFtZT1teGYKK2R1cmF0aW9uPTAuMjUwMjUwCitiaXRfcmF0ZT0yNTM0MDE5NQorVEFHOnByb2plY3RfbmFtZT1VSEQKK1RBRzp1aWQ9Nzg0YzgxMzItYWUzNi1lZDRkLWIwZmYtMmVkZjFmM2YyZDkyCitUQUc6Z2VuZXJhdGlvbl91aWQ9YjZiY2ZjYWItNzBmZi03MzMxLWM0N2MtNDc4ODY5ZGUxMWQyCitUQUc6YXBwbGljYXRpb25fcGxhdGZvcm09QUFGU0RLIChNYWNPUyBYKQorVEFHOm1vZGlmaWNhdGlvbl9kYXRlPTIwMTYtMDktMThUMTk6MjU6MjUuMDAwMDAwWgorVEFHOnByb2R1Y3RfdWlkPWFjZmJmMDNhLTRmNDItYTIzMS1kMGI3LWMwNmVjZDNkNGFkNworVEFHOnByb2R1Y3RfdmVyc2lvbj1Vbmtub3duIHZlcnNpb24KK1RBRzpwcm9kdWN0X25hbWU9QXZpZCBNZWRpYSBDb21wb3NlciA4LjYuMy40Mzk1NQorVEFHOmNvbXBhbnlfbmFtZT1BdmlkIFRlY2hub2xvZ3ksIEluYy4KK1RBRzptYXRlcmlhbF9wYWNrYWdlX3VtaWQ9MHgwNjBBMkIzNDAxMDEwMTAxMDEwMTBGMDAxMzAwMDAwMDU3REVFQTE1NzA2NjUzMTMwNjBFMkIzNDdGN0YyQTgwCitUQUc6bWF0ZXJpYWxfcGFja2FnZV9uYW1lPXNhbXBsZV9mb290YWdlCitUQUc6Y29tbWVudF9VTkMgUGF0aD0vVXNlcnMvbWFyay9EZXYvcHlhYWYvZXhhbXBsZS93b3JrL2RueGhyX2V4cG9ydC5hYWYKK1svRk9STUFUXQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXhmLXByb2JlLWR2MjUgYi90ZXN0cy9yZWYvZmF0ZS9teGYtcHJvYmUtZHYyNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTAyZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXhmLXByb2JlLWR2MjUKQEAgLTAsMCArMSwxNDkgQEAKK1tTVFJFQU1dCitpbmRleD0wCitjb2RlY19uYW1lPWR2dmlkZW8KK3Byb2ZpbGU9dW5rbm93bgorY29kZWNfdHlwZT12aWRlbworY29kZWNfdGltZV9iYXNlPTEvMjUKK2NvZGVjX3RhZ19zdHJpbmc9WzBdWzBdWzBdWzBdCitjb2RlY190YWc9MHgwMDAwCit3aWR0aD03MjAKK2hlaWdodD01NzYKK2NvZGVkX3dpZHRoPTcyMAorY29kZWRfaGVpZ2h0PTU3NgoraGFzX2JfZnJhbWVzPTAKK3NhbXBsZV9hc3BlY3RfcmF0aW89MTY6MTUKK2Rpc3BsYXlfYXNwZWN0X3JhdGlvPTQ6MworcGl4X2ZtdD15dXY0MjBwCitsZXZlbD0tOTkKK2NvbG9yX3JhbmdlPXVua25vd24KK2NvbG9yX3NwYWNlPXVua25vd24KK2NvbG9yX3RyYW5zZmVyPXVua25vd24KK2NvbG9yX3ByaW1hcmllcz11bmtub3duCitjaHJvbWFfbG9jYXRpb249dG9wbGVmdAorZmllbGRfb3JkZXI9YmIKK3RpbWVjb2RlPU4vQQorcmVmcz0xCitpZD1OL0EKK3JfZnJhbWVfcmF0ZT0yNS8xCithdmdfZnJhbWVfcmF0ZT0yNS8xCit0aW1lX2Jhc2U9MS8yNQorc3RhcnRfcHRzPTAKK3N0YXJ0X3RpbWU9MC4wMDAwMDAKK2R1cmF0aW9uX3RzPTI1CitkdXJhdGlvbj0xLjAwMDAwMAorYml0X3JhdGU9Ti9BCittYXhfYml0X3JhdGU9Ti9BCitiaXRzX3Blcl9yYXdfc2FtcGxlPU4vQQorbmJfZnJhbWVzPU4vQQorbmJfcmVhZF9mcmFtZXM9Ti9BCituYl9yZWFkX3BhY2tldHM9Ti9BCitESVNQT1NJVElPTjpkZWZhdWx0PTAKK0RJU1BPU0lUSU9OOmR1Yj0wCitESVNQT1NJVElPTjpvcmlnaW5hbD0wCitESVNQT1NJVElPTjpjb21tZW50PTAKK0RJU1BPU0lUSU9OOmx5cmljcz0wCitESVNQT1NJVElPTjprYXJhb2tlPTAKK0RJU1BPU0lUSU9OOmZvcmNlZD0wCitESVNQT1NJVElPTjpoZWFyaW5nX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOnZpc3VhbF9pbXBhaXJlZD0wCitESVNQT1NJVElPTjpjbGVhbl9lZmZlY3RzPTAKK0RJU1BPU0lUSU9OOmF0dGFjaGVkX3BpYz0wCitESVNQT1NJVElPTjp0aW1lZF90aHVtYm5haWxzPTAKK1RBRzpmaWxlX3BhY2thZ2VfdW1pZD0weDA2MEEyQjM0MDEwMTAxMDUwMTAxMEQ0MzEzMDAwMDAwRjJFMkZDRTk4NzIyRjE0Rjk0N0YwOERFMUVGN0E4REEKK1svU1RSRUFNXQorW1NUUkVBTV0KK2luZGV4PTEKK2NvZGVjX25hbWU9cGNtX3MxNmxlCitwcm9maWxlPXVua25vd24KK2NvZGVjX3R5cGU9YXVkaW8KK2NvZGVjX3RpbWVfYmFzZT0xLzQ4MDAwCitjb2RlY190YWdfc3RyaW5nPVswXVswXVswXVswXQorY29kZWNfdGFnPTB4MDAwMAorc2FtcGxlX2ZtdD1zMTYKK3NhbXBsZV9yYXRlPTQ4MDAwCitjaGFubmVscz0xCitjaGFubmVsX2xheW91dD11bmtub3duCitiaXRzX3Blcl9zYW1wbGU9MTYKK2lkPU4vQQorcl9mcmFtZV9yYXRlPTAvMAorYXZnX2ZyYW1lX3JhdGU9MC8wCit0aW1lX2Jhc2U9MS80ODAwMAorc3RhcnRfcHRzPTAKK3N0YXJ0X3RpbWU9MC4wMDAwMDAKK2R1cmF0aW9uX3RzPTQ4MDAwCitkdXJhdGlvbj0xLjAwMDAwMAorYml0X3JhdGU9NzY4MDAwCittYXhfYml0X3JhdGU9Ti9BCitiaXRzX3Blcl9yYXdfc2FtcGxlPU4vQQorbmJfZnJhbWVzPU4vQQorbmJfcmVhZF9mcmFtZXM9Ti9BCituYl9yZWFkX3BhY2tldHM9Ti9BCitESVNQT1NJVElPTjpkZWZhdWx0PTAKK0RJU1BPU0lUSU9OOmR1Yj0wCitESVNQT1NJVElPTjpvcmlnaW5hbD0wCitESVNQT1NJVElPTjpjb21tZW50PTAKK0RJU1BPU0lUSU9OOmx5cmljcz0wCitESVNQT1NJVElPTjprYXJhb2tlPTAKK0RJU1BPU0lUSU9OOmZvcmNlZD0wCitESVNQT1NJVElPTjpoZWFyaW5nX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOnZpc3VhbF9pbXBhaXJlZD0wCitESVNQT1NJVElPTjpjbGVhbl9lZmZlY3RzPTAKK0RJU1BPU0lUSU9OOmF0dGFjaGVkX3BpYz0wCitESVNQT1NJVElPTjp0aW1lZF90aHVtYm5haWxzPTAKK1RBRzpmaWxlX3BhY2thZ2VfdW1pZD0weDA2MEEyQjM0MDEwMTAxMDUwMTAxMEQ0MzEzMDAwMDAwRjJFMkZDRTk4NzIyRjE0Rjk0N0YwOERFMUVGN0E4REEKK1svU1RSRUFNXQorW1NUUkVBTV0KK2luZGV4PTIKK2NvZGVjX25hbWU9cGNtX3MxNmxlCitwcm9maWxlPXVua25vd24KK2NvZGVjX3R5cGU9YXVkaW8KK2NvZGVjX3RpbWVfYmFzZT0xLzQ4MDAwCitjb2RlY190YWdfc3RyaW5nPVswXVswXVswXVswXQorY29kZWNfdGFnPTB4MDAwMAorc2FtcGxlX2ZtdD1zMTYKK3NhbXBsZV9yYXRlPTQ4MDAwCitjaGFubmVscz0xCitjaGFubmVsX2xheW91dD11bmtub3duCitiaXRzX3Blcl9zYW1wbGU9MTYKK2lkPU4vQQorcl9mcmFtZV9yYXRlPTAvMAorYXZnX2ZyYW1lX3JhdGU9MC8wCit0aW1lX2Jhc2U9MS80ODAwMAorc3RhcnRfcHRzPTAKK3N0YXJ0X3RpbWU9MC4wMDAwMDAKK2R1cmF0aW9uX3RzPTQ4MDAwCitkdXJhdGlvbj0xLjAwMDAwMAorYml0X3JhdGU9NzY4MDAwCittYXhfYml0X3JhdGU9Ti9BCitiaXRzX3Blcl9yYXdfc2FtcGxlPU4vQQorbmJfZnJhbWVzPU4vQQorbmJfcmVhZF9mcmFtZXM9Ti9BCituYl9yZWFkX3BhY2tldHM9Ti9BCitESVNQT1NJVElPTjpkZWZhdWx0PTAKK0RJU1BPU0lUSU9OOmR1Yj0wCitESVNQT1NJVElPTjpvcmlnaW5hbD0wCitESVNQT1NJVElPTjpjb21tZW50PTAKK0RJU1BPU0lUSU9OOmx5cmljcz0wCitESVNQT1NJVElPTjprYXJhb2tlPTAKK0RJU1BPU0lUSU9OOmZvcmNlZD0wCitESVNQT1NJVElPTjpoZWFyaW5nX2ltcGFpcmVkPTAKK0RJU1BPU0lUSU9OOnZpc3VhbF9pbXBhaXJlZD0wCitESVNQT1NJVElPTjpjbGVhbl9lZmZlY3RzPTAKK0RJU1BPU0lUSU9OOmF0dGFjaGVkX3BpYz0wCitESVNQT1NJVElPTjp0aW1lZF90aHVtYm5haWxzPTAKK1RBRzpmaWxlX3BhY2thZ2VfdW1pZD0weDA2MEEyQjM0MDEwMTAxMDUwMTAxMEQ0MzEzMDAwMDAwRjJFMkZDRTk4NzIyRjE0Rjk0N0YwOERFMUVGN0E4REEKK1svU1RSRUFNXQorW0ZPUk1BVF0KK2Zvcm1hdF9uYW1lPW14ZgorZHVyYXRpb249MS4wMDAwMDAKK2JpdF9yYXRlPTMwNjc5MDQwCitUQUc6dWlkPWE3NDFkMGM3LTI0NGEtYmM0YS1iZDM2LTMzMjNkMDRmODk1NAorVEFHOmdlbmVyYXRpb25fdWlkPWMxZDdhMGVlLTg5ZDYtNzU0ZC1iZDUyLWNkZjQyYjUzZGU5ZgorVEFHOmNvbXBhbnlfbmFtZT1BVklECitUQUc6cHJvZHVjdF9uYW1lPVRSTUcKK1RBRzpwcm9kdWN0X3ZlcnNpb249Mi45NworVEFHOnByb2R1Y3RfdWlkPTAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMAorVEFHOm1vZGlmaWNhdGlvbl9kYXRlPTIwMDYtMDYtMjJUMTY6Mzc6MzYuMDAwMDAwWgorVEFHOm1hdGVyaWFsX3BhY2thZ2VfdW1pZD0weDA2MEEyQjM0MDEwMTAxMDUwMTAxMEQ0MzEzMDAwMDAwMDhEQzM5MDA5NzI5MDU4MDAwMDAwODAwNDZCMUU4OUMKK1RBRzp0aW1lY29kZT0wMTowMDowMDowMAorWy9GT1JNQVRdCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9teGYtcmVlbF9uYW1lIGIvdGVzdHMvcmVmL2ZhdGUvbXhmLXJlZWxfbmFtZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk1ODYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbXhmLXJlZWxfbmFtZQpAQCAtMCwwICsxIEBACitkZGE2YzU0YjY0MmI4Nzk0YTg3ZDgwOWZkYjM2MWY5NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbXhwZWcgYi90ZXN0cy9yZWYvZmF0ZS9teHBlZwppbmRleCA5MGFmOTBmLi45YzVjMWZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9teHBlZworKysgYi90ZXN0cy9yZWYvZmF0ZS9teHBlZwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA0LzYzCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjgweDk2MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTg0MzIwMCwgMHg4NjhhNGU2NAogMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAxODQzMjAwLCAweDhkZGE0MzczCiAwLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgIDE4NDMyMDAsIDB4ZmNkZTNhZmMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL25jLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvbmMtZGVtdXgKaW5kZXggOTgzMThhYy4uMDA2YWRkYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbmMtZGVtdXgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvbmMtZGVtdXgKQEAgLTEsOTMgKzEsOTcgQEAKICNleHRyYWRhdGEgMDogICAgICAgMTksIDB4MWFmZDA0NDYKICN0YiAwOiAxLzEwMAotMCwgICAgICAgICAgMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxOTc4NywgMHg3NWU0NjNmMwotMCwgICAgICAgICAgMSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMTkxMywgMHgwZjQyOWMzNCwgRj0weDAKLTAsICAgICAgICAgIDIsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTQyMjUsIDB4YmQzYzcwNGMsIEY9MHgwCi0wLCAgICAgICAgICAzLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEwMzU3LCAweGJmMjMyMzkzLCBGPTB4MAotMCwgICAgICAgICAgNCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgOTU5NSwgMHhmNTY1ZDM5ZSwgRj0weDAKLTAsICAgICAgICAgIDUsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDkyNjIsIDB4MmFmZDZjZTAsIEY9MHgwCi0wLCAgICAgICAgICA2LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEyMjE0LCAweDZhZTgxZDliLCBGPTB4MAotMCwgICAgICAgICAgNywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMzkyMCwgMHgzMWI1YjMwNywgRj0weDAKLTAsICAgICAgICAgIDgsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTAxNjQsIDB4MTQxZWNhNGUsIEY9MHgwCi0wLCAgICAgICAgICA5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA5NTE2LCAweGQ1ZjJjNDJiLCBGPTB4MAotMCwgICAgICAgICAxMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMDAwNiwgMHg4MDg1MGE3NiwgRj0weDAKLTAsICAgICAgICAgMTEsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTE3OTEsIDB4MTBiYzJkY2QsIEY9MHgwCi0wLCAgICAgICAgIDEyLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEzNzU2LCAweGRhMWZlZTA4LCBGPTB4MAotMCwgICAgICAgICAxMywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMDQ1MiwgMHhiYjNkNjJiMCwgRj0weDAKLTAsICAgICAgICAgMTQsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDkxNzEsIDB4NjRhZTEwZjYsIEY9MHgwCi0wLCAgICAgICAgIDE1LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA4ODE2LCAweDMxYWQ4ZmNiLCBGPTB4MAotMCwgICAgICAgICAxNiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMzE2OCwgMHhlYTEwODVhYywgRj0weDAKLTAsICAgICAgICAgMTcsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTI3OTcsIDB4MjUxNDNkMjIsIEY9MHgwCi0wLCAgICAgICAgIDE4LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDExMzI0LCAweDNhNTRiMzhlLCBGPTB4MAotMCwgICAgICAgICAxOSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgOTE3MywgMHg4YjJiZjU1MiwgRj0weDAKLTAsICAgICAgICAgMjAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDkyNDcsIDB4MmU4NzIyNmIsIEY9MHgwCi0wLCAgICAgICAgIDIxLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDE0MTQwLCAweDEwNjM3ODZjLCBGPTB4MAotMCwgICAgICAgICAyMiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxNDQzNywgMHhkZTEyM2ExNywgRj0weDAKLTAsICAgICAgICAgMjMsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTE5MzgsIDB4M2YxMTY4ZjQsIEY9MHgwCi0wLCAgICAgICAgIDI0LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDExOTY2LCAweGRkNjc4NmVjLCBGPTB4MAotMCwgICAgICAgICAyNSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMzIxMywgMHg4YWIyN2M1OCwgRj0weDAKLTAsICAgICAgICAgMjYsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTE4NDMsIDB4OTA0MTVkOGIsIEY9MHgwCi0wLCAgICAgICAgIDI3LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEzMzQ1LCAweDNjMGUxNzkzLCBGPTB4MAotMCwgICAgICAgICAyOCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgOTk3NywgMHg3NGZjN2Y0YiwgRj0weDAKLTAsICAgICAgICAgMjksIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDkxNTgsIDB4MGI1NDI2YTUsIEY9MHgwCi0wLCAgICAgICAgIDMwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEyNzE1LCAweDAwMzVkNTY5LCBGPTB4MAotMCwgICAgICAgICAzMSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxOTk0NCwgMHhlMjg4N2JhOAotMCwgICAgICAgICAzMiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMjc2MiwgMHhiMGYxNzkzOSwgRj0weDAKLTAsICAgICAgICAgMzMsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTAyNjAsIDB4MTgyYjI3YWEsIEY9MHgwCi0wLCAgICAgICAgIDM0LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA3NDA1LCAweDIyN2ZlOWJmLCBGPTB4MAotMCwgICAgICAgICAzNSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMzMxNywgMHgxYTY3OGM2MiwgRj0weDAKLTAsICAgICAgICAgMzYsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTEzMDQsIDB4MzI3N2FmNmQsIEY9MHgwCi0wLCAgICAgICAgIDM3LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEzMjkxLCAweGUyNjc2MTZhLCBGPTB4MAotMCwgICAgICAgICAzOCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgODk3NSwgMHhlN2VlYWNlYSwgRj0weDAKLTAsICAgICAgICAgMzksIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDg0NzMsIDB4OGJiMWNiZmYsIEY9MHgwCi0wLCAgICAgICAgIDQwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEzODc4LCAweGZkM2Q1NWJiLCBGPTB4MAotMCwgICAgICAgICA0MSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMTI3OCwgMHg2MWM3YzU1ZSwgRj0weDAKLTAsICAgICAgICAgNDIsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTM3ODUsIDB4MmFjYmY4OGYsIEY9MHgwCi0wLCAgICAgICAgIDQzLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA5NTIxLCAweDk5ZTJkMDY1LCBGPTB4MAotMCwgICAgICAgICA0NCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgOTM0MCwgMHhlNWM5NjUxMCwgRj0weDAKLTAsICAgICAgICAgNDUsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTI3NzcsIDB4NGMzYzc4NDQsIEY9MHgwCi0wLCAgICAgICAgIDQ2LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEwNjg1LCAweDM5ZTBmNDJlLCBGPTB4MAotMCwgICAgICAgICA0NywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxNDIzNywgMHg5Mzk4ZDA3ZiwgRj0weDAKLTAsICAgICAgICAgNDgsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDkwMjEsIDB4MzM0M2M3ZWMsIEY9MHgwCi0wLCAgICAgICAgIDQ5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA5MzI3LCAweGFkNDg5ZTg2LCBGPTB4MAotMCwgICAgICAgICA1MCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMzUwNywgMHhiMTM0NGYxYywgRj0weDAKLTAsICAgICAgICAgNTEsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTAxOTksIDB4OWE4ODY4YmYsIEY9MHgwCi0wLCAgICAgICAgIDUyLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDE0NTM1LCAweGRkYjEzZjQxLCBGPTB4MAotMCwgICAgICAgICA1MywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgODc3MywgMHgzZDhiNmE3OSwgRj0weDAKLTAsICAgICAgICAgNTQsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTYwODQsIDB4NWQ5MTVkZTQsIEY9MHgwCi0wLCAgICAgICAgIDU1LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA5MTU2LCAweDVjYjA4YTZhLCBGPTB4MAotMCwgICAgICAgICA1NiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxNTAyNywgMHhjMjNiMWRjOCwgRj0weDAKLTAsICAgICAgICAgNTcsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDgyNDAsIDB4ZDZkMzUyNmMsIEY9MHgwCi0wLCAgICAgICAgIDU4LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA4NzIwLCAweDQzOWM0M2JmLCBGPTB4MAotMCwgICAgICAgICA1OSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMzY4NCwgMHgxOGZjODJmMCwgRj0weDAKLTAsICAgICAgICAgNjAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDg4MjksIDB4YTNlYmViMzAsIEY9MHgwCi0wLCAgICAgICAgIDYxLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDE0NjUwLCAweDk5ZTg2NzhjLCBGPTB4MAotMCwgICAgICAgICA2MiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxOTYyNiwgMHg4MGE3ZWU1YwotMCwgICAgICAgICA2MywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgNzc2MiwgMHg3YzIwOWExMiwgRj0weDAKLTAsICAgICAgICAgNjQsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTM2MzYsIDB4Yzg5YzFhYTMsIEY9MHgwCi0wLCAgICAgICAgIDY1LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA4MzM3LCAweDc0OWJmNzZhLCBGPTB4MAotMCwgICAgICAgICA2NiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxNTA5OCwgMHhjOThiYzZkYywgRj0weDAKLTAsICAgICAgICAgNjcsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDkwNzAsIDB4Y2Q0Y2Y3ZjEsIEY9MHgwCi0wLCAgICAgICAgIDY4LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA4MjY5LCAweDkwZTk1ZDU0LCBGPTB4MAotMCwgICAgICAgICA2OSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMjY3MiwgMHgwMzQ4ODhkMCwgRj0weDAKLTAsICAgICAgICAgNzAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDc1MTksIDB4NmMwODk2NzIsIEY9MHgwCi0wLCAgICAgICAgIDcxLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDE0NDM5LCAweDVkMjQ3OGI5LCBGPTB4MAotMCwgICAgICAgICA3MiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgNjkyOCwgMHg5OGZiYWE2NywgRj0weDAKLTAsICAgICAgICAgNzMsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDg3MzUsIDB4MDc2NDNmMWUsIEY9MHgwCi0wLCAgICAgICAgIDc0LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDEzNTIyLCAweDU1MDM0Y2RiLCBGPTB4MAotMCwgICAgICAgICA3NSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgNzgwNywgMHhmNTk4MzEwMywgRj0weDAKLTAsICAgICAgICAgNzYsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTQ0ODQsIDB4ZmM5Y2YyNjAsIEY9MHgwCi0wLCAgICAgICAgIDc3LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA3MTkzLCAweDE3MGEwZmExLCBGPTB4MAotMCwgICAgICAgICA3OCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgOTQ0NCwgMHg2ZjliZTM2ZiwgRj0weDAKLTAsICAgICAgICAgNzksIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTI1OTgsIDB4NjliNzYwOWQsIEY9MHgwCi0wLCAgICAgICAgIDgwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA3NjUwLCAweDFhYmFlYzllLCBGPTB4MAotMCwgICAgICAgICA4MSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxNTE2MiwgMHgyYTg3ZjcyMywgRj0weDAKLTAsICAgICAgICAgODIsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDc3NTIsIDB4Y2NhMjQ4YWEsIEY9MHgwCi0wLCAgICAgICAgIDgzLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA5MDg1LCAweDFjYTdkN2U1LCBGPTB4MAotMCwgICAgICAgICA4NCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAxMzE4NywgMHhhYmFiY2M2NCwgRj0weDAKLTAsICAgICAgICAgODUsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgIDc5NjgsIDB4NjRhMjhmNDYsIEY9MHgwCi0wLCAgICAgICAgIDg2LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgIDE1NDc0LCAweGYzNGM1ODdjLCBGPTB4MAotMCwgICAgICAgICA4NywgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgODYxNSwgMHg2MTMwMTAzNCwgRj0weDAKLTAsICAgICAgICAgODgsIC05MjIzMzcyMDM2ODU0Nzc1ODA4LCAgICAgICAgMSwgICAgMTQxMjksIDB4NDJjODhiZWEsIEY9MHgwCi0wLCAgICAgICAgIDg5LCAtOTIyMzM3MjAzNjg1NDc3NTgwOCwgICAgICAgIDEsICAgICA3MjIzLCAweDY3NWQ3NTAwLCBGPTB4MAotMCwgICAgICAgICA5MCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDgsICAgICAgICAxLCAgICAgMzA3MiwgMHg0Y2I2MjU0YywgRj0weDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogbXBlZzQKKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMS8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTk3ODcsIDB4NzVlNDYzZjMKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAxMTkxMywgMHgwZjQyOWMzNCwgRj0weDAKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAxNDIyNSwgMHhiZDNjNzA0YywgRj0weDAKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAxMDM1NywgMHhiZjIzMjM5MywgRj0weDAKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgICAgOTU5NSwgMHhmNTY1ZDM5ZSwgRj0weDAKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgICAgOTI2MiwgMHgyYWZkNmNlMCwgRj0weDAKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgICAxMjIxNCwgMHg2YWU4MWQ5YiwgRj0weDAKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgICAxMzkyMCwgMHgzMWI1YjMwNywgRj0weDAKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgICAxMDE2NCwgMHgxNDFlY2E0ZSwgRj0weDAKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgICAgOTUxNiwgMHhkNWYyYzQyYiwgRj0weDAKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgICAxMDAwNiwgMHg4MDg1MGE3NiwgRj0weDAKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgICAxMTc5MSwgMHgxMGJjMmRjZCwgRj0weDAKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgICAxMzc1NiwgMHhkYTFmZWUwOCwgRj0weDAKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgICAxMDQ1MiwgMHhiYjNkNjJiMCwgRj0weDAKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgICAgOTE3MSwgMHg2NGFlMTBmNiwgRj0weDAKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgICAgODgxNiwgMHgzMWFkOGZjYiwgRj0weDAKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgICAxMzE2OCwgMHhlYTEwODVhYywgRj0weDAKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgICAxMjc5NywgMHgyNTE0M2QyMiwgRj0weDAKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgICAxMTMyNCwgMHgzYTU0YjM4ZSwgRj0weDAKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgICAgOTE3MywgMHg4YjJiZjU1MiwgRj0weDAKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgICAgOTI0NywgMHgyZTg3MjI2YiwgRj0weDAKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgICAxNDE0MCwgMHgxMDYzNzg2YywgRj0weDAKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgICAxNDQzNywgMHhkZTEyM2ExNywgRj0weDAKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgICAxMTkzOCwgMHgzZjExNjhmNCwgRj0weDAKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgICAxMTk2NiwgMHhkZDY3ODZlYywgRj0weDAKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgICAxMzIxMywgMHg4YWIyN2M1OCwgRj0weDAKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgICAxMTg0MywgMHg5MDQxNWQ4YiwgRj0weDAKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgICAxMzM0NSwgMHgzYzBlMTc5MywgRj0weDAKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgICAgOTk3NywgMHg3NGZjN2Y0YiwgRj0weDAKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgICAgOTE1OCwgMHgwYjU0MjZhNSwgRj0weDAKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgICAxMjcxNSwgMHgwMDM1ZDU2OSwgRj0weDAKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgICAxOTk0NCwgMHhlMjg4N2JhOAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgIDEyNzYyLCAweGIwZjE3OTM5LCBGPTB4MAorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgIDEwMjYwLCAweDE4MmIyN2FhLCBGPTB4MAorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgICA3NDA1LCAweDIyN2ZlOWJmLCBGPTB4MAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgIDEzMzE3LCAweDFhNjc4YzYyLCBGPTB4MAorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgIDExMzA0LCAweDMyNzdhZjZkLCBGPTB4MAorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgIDEzMjkxLCAweGUyNjc2MTZhLCBGPTB4MAorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgICA4OTc1LCAweGU3ZWVhY2VhLCBGPTB4MAorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgICA4NDczLCAweDhiYjFjYmZmLCBGPTB4MAorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgIDEzODc4LCAweGZkM2Q1NWJiLCBGPTB4MAorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgIDExMjc4LCAweDYxYzdjNTVlLCBGPTB4MAorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgIDEzNzg1LCAweDJhY2JmODhmLCBGPTB4MAorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgICA5NTIxLCAweDk5ZTJkMDY1LCBGPTB4MAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgICA5MzQwLCAweGU1Yzk2NTEwLCBGPTB4MAorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgIDEyNzc3LCAweDRjM2M3ODQ0LCBGPTB4MAorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgIDEwNjg1LCAweDM5ZTBmNDJlLCBGPTB4MAorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgIDE0MjM3LCAweDkzOThkMDdmLCBGPTB4MAorMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgICA5MDIxLCAweDMzNDNjN2VjLCBGPTB4MAorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgICA5MzI3LCAweGFkNDg5ZTg2LCBGPTB4MAorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgIDEzNTA3LCAweGIxMzQ0ZjFjLCBGPTB4MAorMCwgICAgICAgICA1MSwgICAgICAgICA1MSwgICAgICAgIDEsICAgIDEwMTk5LCAweDlhODg2OGJmLCBGPTB4MAorMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgIDE0NTM1LCAweGRkYjEzZjQxLCBGPTB4MAorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgICA4NzczLCAweDNkOGI2YTc5LCBGPTB4MAorMCwgICAgICAgICA1NCwgICAgICAgICA1NCwgICAgICAgIDEsICAgIDE2MDg0LCAweDVkOTE1ZGU0LCBGPTB4MAorMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgICA5MTU2LCAweDVjYjA4YTZhLCBGPTB4MAorMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgIDE1MDI3LCAweGMyM2IxZGM4LCBGPTB4MAorMCwgICAgICAgICA1NywgICAgICAgICA1NywgICAgICAgIDEsICAgICA4MjQwLCAweGQ2ZDM1MjZjLCBGPTB4MAorMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgICA4NzIwLCAweDQzOWM0M2JmLCBGPTB4MAorMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgIDEzNjg0LCAweDE4ZmM4MmYwLCBGPTB4MAorMCwgICAgICAgICA2MCwgICAgICAgICA2MCwgICAgICAgIDEsICAgICA4ODI5LCAweGEzZWJlYjMwLCBGPTB4MAorMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgIDE0NjUwLCAweDk5ZTg2NzhjLCBGPTB4MAorMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgIDE5NjI2LCAweDgwYTdlZTVjCiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAgIDc3NjIsIDB4N2MyMDlhMTIsIEY9MHgwCiswLCAgICAgICAgIDY0LCAgICAgICAgIDY0LCAgICAgICAgMSwgICAgMTM2MzYsIDB4Yzg5YzFhYTMsIEY9MHgwCiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAgIDgzMzcsIDB4NzQ5YmY3NmEsIEY9MHgwCiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAgMTUwOTgsIDB4Yzk4YmM2ZGMsIEY9MHgwCiswLCAgICAgICAgIDY3LCAgICAgICAgIDY3LCAgICAgICAgMSwgICAgIDkwNzAsIDB4Y2Q0Y2Y3ZjEsIEY9MHgwCiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAgIDgyNjksIDB4OTBlOTVkNTQsIEY9MHgwCiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICAgMTI2NzIsIDB4MDM0ODg4ZDAsIEY9MHgwCiswLCAgICAgICAgIDcwLCAgICAgICAgIDcwLCAgICAgICAgMSwgICAgIDc1MTksIDB4NmMwODk2NzIsIEY9MHgwCiswLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICAgMTQ0MzksIDB4NWQyNDc4YjksIEY9MHgwCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAgIDY5MjgsIDB4OThmYmFhNjcsIEY9MHgwCiswLCAgICAgICAgIDczLCAgICAgICAgIDczLCAgICAgICAgMSwgICAgIDg3MzUsIDB4MDc2NDNmMWUsIEY9MHgwCiswLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICAgMTM1MjIsIDB4NTUwMzRjZGIsIEY9MHgwCiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgICAgIDc4MDcsIDB4ZjU5ODMxMDMsIEY9MHgwCiswLCAgICAgICAgIDc2LCAgICAgICAgIDc2LCAgICAgICAgMSwgICAgMTQ0ODQsIDB4ZmM5Y2YyNjAsIEY9MHgwCiswLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICAgIDcxOTMsIDB4MTcwYTBmYTEsIEY9MHgwCiswLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgICAgIDk0NDQsIDB4NmY5YmUzNmYsIEY9MHgwCiswLCAgICAgICAgIDc5LCAgICAgICAgIDc5LCAgICAgICAgMSwgICAgMTI1OTgsIDB4NjliNzYwOWQsIEY9MHgwCiswLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAgIDc2NTAsIDB4MWFiYWVjOWUsIEY9MHgwCiswLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgICAgMTUxNjIsIDB4MmE4N2Y3MjMsIEY9MHgwCiswLCAgICAgICAgIDgyLCAgICAgICAgIDgyLCAgICAgICAgMSwgICAgIDc3NTIsIDB4Y2NhMjQ4YWEsIEY9MHgwCiswLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAgIDkwODUsIDB4MWNhN2Q3ZTUsIEY9MHgwCiswLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgICAgMTMxODcsIDB4YWJhYmNjNjQsIEY9MHgwCiswLCAgICAgICAgIDg1LCAgICAgICAgIDg1LCAgICAgICAgMSwgICAgIDc5NjgsIDB4NjRhMjhmNDYsIEY9MHgwCiswLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAgMTU0NzQsIDB4ZjM0YzU4N2MsIEY9MHgwCiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAgIDg2MTUsIDB4NjEzMDEwMzQsIEY9MHgwCiswLCAgICAgICAgIDg4LCAgICAgICAgIDg4LCAgICAgICAgMSwgICAgMTQxMjksIDB4NDJjODhiZWEsIEY9MHgwCiswLCAgICAgICAgIDg5LCAgICAgICAgIDg5LCAgICAgICAgMSwgICAgIDcyMjMsIDB4Njc1ZDc1MDAsIEY9MHgwCiswLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgICAgIDMwNzIsIDB4NGNiNjI1NGMsIEY9MHgwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9uc3YtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS9uc3YtZGVtdXgKaW5kZXggMGFkMDhiMS4uYmZmODcxZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbnN2LWRlbXV4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL25zdi1kZW11eApAQCAtMSw1ICsxLDE0IEBACiAjdGIgMDogMTAwMS8xNTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiB2cDMKKyNkaW1lbnNpb25zIDA6IDE2MHgxMTIKKyNzYXIgMDogMC8xCiAjdGIgMTogMS8zMDAwMDAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBtcDMKKyNzYW1wbGVfcmF0ZSAxOiAxMTAyNQorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgICAxMiwgMHgxMzk2MDM1ZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgIDI0LCAweDhhYjgwYWM3LCBGPTB4MAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgICAgMjA4LCAweDFkZTE2MDNlLCBGPTB4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbnV2LXJ0anBlZyBiL3Rlc3RzL3JlZi9mYXRlL251di1ydGpwZWcKaW5kZXggOTZlYWQzMy4uZTRhNWJlNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbnV2LXJ0anBlZworKysgYi90ZXN0cy9yZWYvZmF0ZS9udXYtcnRqcGVnCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMC8yOTk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgNDYwODAwLCAweDU0YWVkYWZlCiAwLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICA0NjA4MDAsIDB4YjdhYThiNTYKIDAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDQ2MDgwMCwgMHgyODNlYTNiNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvbnV2LXJ0anBlZy1maCBiL3Rlc3RzL3JlZi9mYXRlL251di1ydGpwZWctZmgKaW5kZXggYjJlMDRjYi4uMGQ1MGI0NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvbnV2LXJ0anBlZy1maAorKysgYi90ZXN0cy9yZWYvZmF0ZS9udXYtcnRqcGVnLWZoCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvNTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMngyODgKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAyMjExODQsIDB4ZGFmNTRmODMKIDAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgIDIyMTE4NCwgMHhlZWEzZTNiNAogMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgMjIxMTg0LCAweDVmMWE4NTI1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9vZ2dvcHVzLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvb2dnb3B1cy1kZW11eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTkyNzYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvb2dnb3B1cy1kZW11eApAQCAtMCwwICsxLDQ4IEBACisjZXh0cmFkYXRhIDA6ICAgICAgIDE5LCAweDM5OWMwNDcxCisjdGIgMDogMS80ODAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBvcHVzCisjc2FtcGxlX3JhdGUgMDogNDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KKzAsICAgICAgIC0zNTYsICAgICAgIC0zNTYsICAgICAgOTYwLCAgICAgIDQwMiwgMHg4OWIxYzQwZgorMCwgICAgICAgIDYwNCwgICAgICAgIDYwNCwgICAgICA5NjAsICAgICAgMjE2LCAweDdiZjk3MTQ2CiswLCAgICAgICAxNTY0LCAgICAgICAxNTY0LCAgICAgIDk2MCwgICAgICAyMTUsIDB4NmNiODZkOGIKKzAsICAgICAgIDI1MjQsICAgICAgIDI1MjQsICAgICAgOTYwLCAgICAgIDIxOCwgMHg5Y2ZkNjkxYworMCwgICAgICAgMzQ4NCwgICAgICAgMzQ4NCwgICAgICA5NjAsICAgICAgMjE4LCAweGQ3ZmU2YTk0CiswLCAgICAgICA0NDQ0LCAgICAgICA0NDQ0LCAgICAgIDk2MCwgICAgICAxOTQsIDB4MzU3MzVkZTYKKzAsICAgICAgIDU0MDQsICAgICAgIDU0MDQsICAgICAgOTYwLCAgICAgIDIxNiwgMHgzZWU2NzA1YQorMCwgICAgICAgNjM2NCwgICAgICAgNjM2NCwgICAgICA5NjAsICAgICAgMjE4LCAweDY3ZWI2Y2IxCiswLCAgICAgICA3MzI0LCAgICAgICA3MzI0LCAgICAgIDk2MCwgICAgICAyMTgsIDB4MzJkMDcwMGQKKzAsICAgICAgIDgyODQsICAgICAgIDgyODQsICAgICAgOTYwLCAgICAgIDIxOSwgMHhjYjdmNmM2MAorMCwgICAgICAgOTI0NCwgICAgICAgOTI0NCwgICAgICA5NjAsICAgICAgMjE4LCAweDljODY2YjMzCiswLCAgICAgIDEwMjA0LCAgICAgIDEwMjA0LCAgICAgIDk2MCwgICAgICAyMTcsIDB4ZmUzZTZhNTMKKzAsICAgICAgMTExNjQsICAgICAgMTExNjQsICAgICAgOTYwLCAgICAgIDIxOCwgMHgxMzU4NjgzMworMCwgICAgICAxMjEyNCwgICAgICAxMjEyNCwgICAgICA5NjAsICAgICAgMjIyLCAweGJjYjI2NjllCiswLCAgICAgIDEzMDg0LCAgICAgIDEzMDg0LCAgICAgIDk2MCwgICAgICAyMTgsIDB4OGRmYzZlMzMKKzAsICAgICAgMTQwNDQsICAgICAgMTQwNDQsICAgICAgOTYwLCAgICAgIDIxNywgMHhmNTk1NzA1MQorMCwgICAgICAxNTAwNCwgICAgICAxNTAwNCwgICAgICA5NjAsICAgICAgMjEwLCAweGVkMTI2ZTZiCiswLCAgICAgIDE1OTY0LCAgICAgIDE1OTY0LCAgICAgIDk2MCwgICAgICAyMTYsIDB4YmY5NDcyNDkKKzAsICAgICAgMTY5MjQsICAgICAgMTY5MjQsICAgICAgOTYwLCAgICAgIDIwMywgMHg2YzdlNjgwYQorMCwgICAgICAxNzg4NCwgICAgICAxNzg4NCwgICAgICA5NjAsICAgICAgMjA5LCAweGY3OGY2YWY0CiswLCAgICAgIDE4ODQ0LCAgICAgIDE4ODQ0LCAgICAgIDk2MCwgICAgICAyMTcsIDB4ZDYwYzY4NGQKKzAsICAgICAgMTk4MDQsICAgICAgMTk4MDQsICAgICAgOTYwLCAgICAgIDIxOCwgMHg4OTA1NmE3YQorMCwgICAgICAyMDc2NCwgICAgICAyMDc2NCwgICAgICA5NjAsICAgICAgMjE5LCAweDBiYzY3NGFkCiswLCAgICAgIDIxNzI0LCAgICAgIDIxNzI0LCAgICAgIDk2MCwgICAgICAyMTcsIDB4YjFkODZkMWEKKzAsICAgICAgMjI2ODQsICAgICAgMjI2ODQsICAgICAgOTYwLCAgICAgIDIyMCwgMHg0MzNkNjg1YQorMCwgICAgICAyMzY0NCwgICAgICAyMzY0NCwgICAgICA5NjAsICAgICAgMzY0LCAweDBjODhiZTg0CiswLCAgICAgIDI0NjA0LCAgICAgIDI0NjA0LCAgICAgIDk2MCwgICAgICAyMjEsIDB4ODA0YTczM2QKKzAsICAgICAgMjU1NjQsICAgICAgMjU1NjQsICAgICAgOTYwLCAgICAgIDIxNSwgMHg2ZTlkNmU5YgorMCwgICAgICAyNjUyNCwgICAgICAyNjUyNCwgICAgICA5NjAsICAgICAgMjE1LCAweDYzMDE2YTgzCiswLCAgICAgIDI3NDg0LCAgICAgIDI3NDg0LCAgICAgIDk2MCwgICAgICAyMTgsIDB4ZjlhNDZmYmUKKzAsICAgICAgMjg0NDQsICAgICAgMjg0NDQsICAgICAgOTYwLCAgICAgIDIxNiwgMHhhMGQ2NmMwOAorMCwgICAgICAyOTQwNCwgICAgICAyOTQwNCwgICAgICA5NjAsICAgICAgMjE2LCAweGEyY2E2ZDBhCiswLCAgICAgIDMwMzY0LCAgICAgIDMwMzY0LCAgICAgIDk2MCwgICAgICAyMTYsIDB4ZjUwZTZmMWQKKzAsICAgICAgMzEzMjQsICAgICAgMzEzMjQsICAgICAgOTYwLCAgICAgIDIxNSwgMHg2YWFhNzBiNgorMCwgICAgICAzMjI4NCwgICAgICAzMjI4NCwgICAgICA5NjAsICAgICAgMjE5LCAweDdjZWI2YmEwCiswLCAgICAgIDMzMjQ0LCAgICAgIDMzMjQ0LCAgICAgIDk2MCwgICAgICAyMjAsIDB4Mzk4ZDZjYTkKKzAsICAgICAgMzQyMDQsICAgICAgMzQyMDQsICAgICAgOTYwLCAgICAgIDIxOCwgMHg3YmQwNmVkNQorMCwgICAgICAzNTE2NCwgICAgICAzNTE2NCwgICAgICA5NjAsICAgICAgMjE5LCAweGUyOTA2YzYyCiswLCAgICAgIDM2MTI0LCAgICAgIDM2MTI0LCAgICAgIDk2MCwgICAgICAyMTcsIDB4Y2YzMTZiYTEKKzAsICAgICAgMzcwODQsICAgICAgMzcwODQsICAgICAgOTYwLCAgICAgIDIxNywgMHg0NzBiNmVlYQorMCwgICAgICAzODA0NCwgICAgICAzODA0NCwgICAgICAzNTYsICAgICAgMzU5LCAweDM2YzJhMThhLCBTPTEsICAgICAgIDEwLCAweDAyMzIwMDVlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9vZ2d2cDgtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS9vZ2d2cDgtZGVtdXgKaW5kZXggOTZiZWI4Yy4uZmM2ODZkNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvb2dndnA4LWRlbXV4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL29nZ3ZwOC1kZW11eApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHZwOAorI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgNTAxNCwgMHg0Nzk4ZmEzMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgODIyLCAweDU5NjQ4NmM1LCBGPTB4MAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgICAgODQwLCAweGYwNjQ5MGJhLCBGPTB4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvb24yYXZjIGIvdGVzdHMvcmVmL2ZhdGUvb24yYXZjCmluZGV4IGFjMDhkYWUuLmE5ZDZjYmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL29uMmF2YworKysgYi90ZXN0cy9yZWYvZmF0ZS9vbjJhdmMKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS8xNjAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAxNjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgMjA0OCwgMHgwMDAwMDAwMAogMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgIDEwMjQsICAgICAyMDQ4LCAweDk2ZWUxMzAxCiAwLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDIwNDgsIDB4ZTJhODE2MDUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL29wdCBiL3Rlc3RzL3JlZi9mYXRlL29wdAppbmRleCA3YjQ3ZDQyLi42YTdkYmZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9vcHQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvb3B0CkBAIC0xOCwzMSArMTgsMzEgQEAKIGZsdD0wLjMzMzMzMwogZGJsPTAuMzMzMzMzCiBUZXN0Q29udGV4dCBBVk9wdGlvbnM6Ci0gIC1udW0gICAgICAgICAgICAgICA8aW50PiAgICAgICAgRS4uLi4uLi4gc2V0IG51bSAoZnJvbSAwIHRvIDEwMCkgKGRlZmF1bHQgMCkKLSAgLXRvZ2dsZSAgICAgICAgICAgIDxpbnQ+ICAgICAgICBFLi4uLi4uLiBzZXQgdG9nZ2xlIChmcm9tIDAgdG8gMSkgKGRlZmF1bHQgMSkKLSAgLXJhdGlvbmFsICAgICAgICAgIDxyYXRpb25hbD4gICBFLi4uLi4uLiBzZXQgcmF0aW9uYWwgKGZyb20gMCB0byAxMCkgKGRlZmF1bHQgMS8xKQotICAtc3RyaW5nICAgICAgICAgICAgPHN0cmluZz4gICAgIEUuLi4uLi4uIHNldCBzdHJpbmcgKGRlZmF1bHQgImRlZmF1bHQiKQotICAtZXNjYXBlICAgICAgICAgICAgPHN0cmluZz4gICAgIEUuLi4uLi4uIHNldCBlc2NhcGUgc3RyIChkZWZhdWx0ICJcPSwiKQotICAtZmxhZ3MgICAgICAgICAgICAgPGZsYWdzPiAgICAgIEUuLi4uLi4uIHNldCBmbGFncyAoZGVmYXVsdCBjb29sKQotICAgICBjb29sICAgICAgICAgICAgICAgICAgICAgICAgIEUuLi4uLi4uIHNldCBjb29sIGZsYWcKLSAgICAgbGFtZSAgICAgICAgICAgICAgICAgICAgICAgICBFLi4uLi4uLiBzZXQgbGFtZSBmbGFnCi0gICAgIG11ICAgICAgICAgICAgICAgICAgICAgICAgICAgRS4uLi4uLi4gc2V0IG11IGZsYWcKLSAgLXNpemUgICAgICAgICAgICAgIDxpbWFnZV9zaXplPiBFLi4uLi4uLiBzZXQgc2l6ZSAoZGVmYXVsdCAiMjAweDMwMCIpCi0gIC1waXhfZm10ICAgICAgICAgICA8cGl4X2ZtdD4gICAgRS4uLi4uLi4gc2V0IHBpeGZtdCAoZGVmYXVsdCAwYmdyKQotICAtc2FtcGxlX2ZtdCAgICAgICAgPHNhbXBsZV9mbXQ+IEUuLi4uLi4uIHNldCBzYW1wbGVmbXQgKGRlZmF1bHQgczE2KQotICAtdmlkZW9fcmF0ZSAgICAgICAgPHZpZGVvX3JhdGU+IEUuLi4uLi4uIHNldCB2aWRlb3JhdGUgKGRlZmF1bHQgIjI1IikKLSAgLWR1cmF0aW9uICAgICAgICAgIDxkdXJhdGlvbj4gICBFLi4uLi4uLiBzZXQgZHVyYXRpb24gKGRlZmF1bHQgMC4wMDEpCi0gIC1jb2xvciAgICAgICAgICAgICA8Y29sb3I+ICAgICAgRS4uLi4uLi4gc2V0IGNvbG9yIChkZWZhdWx0ICJwaW5rIikKLSAgLWNsICAgICAgICAgICAgICAgIDxjaGFubmVsX2xheW91dD4gRS4uLi4uLi4gc2V0IGNoYW5uZWwgbGF5b3V0IChkZWZhdWx0IDB4MTM3KQotICAtYmluICAgICAgICAgICAgICAgPGJpbmFyeT4gICAgIEUuLi4uLi4uIHNldCBiaW5hcnkgdmFsdWUKLSAgLWJpbjEgICAgICAgICAgICAgIDxiaW5hcnk+ICAgICBFLi4uLi4uLiBzZXQgYmluYXJ5IHZhbHVlCi0gIC1iaW4yICAgICAgICAgICAgICA8YmluYXJ5PiAgICAgRS4uLi4uLi4gc2V0IGJpbmFyeSB2YWx1ZQotICAtbnVtNjQgICAgICAgICAgICAgPGludDY0PiAgICAgIEUuLi4uLi4uIHNldCBudW0gNjRiaXQgKGZyb20gMCB0byAxMDApIChkZWZhdWx0IDEpCi0gIC1mbHQgICAgICAgICAgICAgICA8ZmxvYXQ+ICAgICAgRS4uLi4uLi4gc2V0IGZsb2F0IChmcm9tIDAgdG8gMTAwKSAoZGVmYXVsdCAwLjMzMzMzMykKLSAgLWRibCAgICAgICAgICAgICAgIDxkb3VibGU+ICAgICBFLi4uLi4uLiBzZXQgZG91YmxlIChmcm9tIDAgdG8gMTAwKSAoZGVmYXVsdCAwLjMzMzMzMykKLSAgLWJvb2wxICAgICAgICAgICAgIDxib29sZWFuPiAgICBFLi4uLi4uLiBzZXQgYm9vbGVhbiB2YWx1ZSAoZGVmYXVsdCBhdXRvKQotICAtYm9vbDIgICAgICAgICAgICAgPGJvb2xlYW4+ICAgIEUuLi4uLi4uIHNldCBib29sZWFuIHZhbHVlIChkZWZhdWx0IHRydWUpCi0gIC1ib29sMyAgICAgICAgICAgICA8Ym9vbGVhbj4gICAgRS4uLi4uLi4gc2V0IGJvb2xlYW4gdmFsdWUgKGRlZmF1bHQgZmFsc2UpCisgIC1udW0gICAgICAgICAgICAgICA8aW50PiAgICAgICAgRS4uLi4uLi4uIHNldCBudW0gKGZyb20gMCB0byAxMDApIChkZWZhdWx0IDApCisgIC10b2dnbGUgICAgICAgICAgICA8aW50PiAgICAgICAgRS4uLi4uLi4uIHNldCB0b2dnbGUgKGZyb20gMCB0byAxKSAoZGVmYXVsdCAxKQorICAtcmF0aW9uYWwgICAgICAgICAgPHJhdGlvbmFsPiAgIEUuLi4uLi4uLiBzZXQgcmF0aW9uYWwgKGZyb20gMCB0byAxMCkgKGRlZmF1bHQgMS8xKQorICAtc3RyaW5nICAgICAgICAgICAgPHN0cmluZz4gICAgIEUuLi4uLi4uLiBzZXQgc3RyaW5nIChkZWZhdWx0ICJkZWZhdWx0IikKKyAgLWVzY2FwZSAgICAgICAgICAgIDxzdHJpbmc+ICAgICBFLi4uLi4uLi4gc2V0IGVzY2FwZSBzdHIgKGRlZmF1bHQgIlw9LCIpCisgIC1mbGFncyAgICAgICAgICAgICA8ZmxhZ3M+ICAgICAgRS4uLi4uLi4uIHNldCBmbGFncyAoZGVmYXVsdCBjb29sKQorICAgICBjb29sICAgICAgICAgICAgICAgICAgICAgICAgIEUuLi4uLi4uLiBzZXQgY29vbCBmbGFnCisgICAgIGxhbWUgICAgICAgICAgICAgICAgICAgICAgICAgRS4uLi4uLi4uIHNldCBsYW1lIGZsYWcKKyAgICAgbXUgICAgICAgICAgICAgICAgICAgICAgICAgICBFLi4uLi4uLi4gc2V0IG11IGZsYWcKKyAgLXNpemUgICAgICAgICAgICAgIDxpbWFnZV9zaXplPiBFLi4uLi4uLi4gc2V0IHNpemUgKGRlZmF1bHQgIjIwMHgzMDAiKQorICAtcGl4X2ZtdCAgICAgICAgICAgPHBpeF9mbXQ+ICAgIEUuLi4uLi4uLiBzZXQgcGl4Zm10IChkZWZhdWx0IDBiZ3IpCisgIC1zYW1wbGVfZm10ICAgICAgICA8c2FtcGxlX2ZtdD4gRS4uLi4uLi4uIHNldCBzYW1wbGVmbXQgKGRlZmF1bHQgczE2KQorICAtdmlkZW9fcmF0ZSAgICAgICAgPHZpZGVvX3JhdGU+IEUuLi4uLi4uLiBzZXQgdmlkZW9yYXRlIChkZWZhdWx0ICIyNSIpCisgIC1kdXJhdGlvbiAgICAgICAgICA8ZHVyYXRpb24+ICAgRS4uLi4uLi4uIHNldCBkdXJhdGlvbiAoZGVmYXVsdCAwLjAwMSkKKyAgLWNvbG9yICAgICAgICAgICAgIDxjb2xvcj4gICAgICBFLi4uLi4uLi4gc2V0IGNvbG9yIChkZWZhdWx0ICJwaW5rIikKKyAgLWNsICAgICAgICAgICAgICAgIDxjaGFubmVsX2xheW91dD4gRS4uLi4uLi4uIHNldCBjaGFubmVsIGxheW91dCAoZGVmYXVsdCAweDEzNykKKyAgLWJpbiAgICAgICAgICAgICAgIDxiaW5hcnk+ICAgICBFLi4uLi4uLi4gc2V0IGJpbmFyeSB2YWx1ZQorICAtYmluMSAgICAgICAgICAgICAgPGJpbmFyeT4gICAgIEUuLi4uLi4uLiBzZXQgYmluYXJ5IHZhbHVlCisgIC1iaW4yICAgICAgICAgICAgICA8YmluYXJ5PiAgICAgRS4uLi4uLi4uIHNldCBiaW5hcnkgdmFsdWUKKyAgLW51bTY0ICAgICAgICAgICAgIDxpbnQ2ND4gICAgICBFLi4uLi4uLi4gc2V0IG51bSA2NGJpdCAoZnJvbSAwIHRvIDEwMCkgKGRlZmF1bHQgMSkKKyAgLWZsdCAgICAgICAgICAgICAgIDxmbG9hdD4gICAgICBFLi4uLi4uLi4gc2V0IGZsb2F0IChmcm9tIDAgdG8gMTAwKSAoZGVmYXVsdCAwLjMzMzMzMykKKyAgLWRibCAgICAgICAgICAgICAgIDxkb3VibGU+ICAgICBFLi4uLi4uLi4gc2V0IGRvdWJsZSAoZnJvbSAwIHRvIDEwMCkgKGRlZmF1bHQgMC4zMzMzMzMpCisgIC1ib29sMSAgICAgICAgICAgICA8Ym9vbGVhbj4gICAgRS4uLi4uLi4uIHNldCBib29sZWFuIHZhbHVlIChkZWZhdWx0IGF1dG8pCisgIC1ib29sMiAgICAgICAgICAgICA8Ym9vbGVhbj4gICAgRS4uLi4uLi4uIHNldCBib29sZWFuIHZhbHVlIChkZWZhdWx0IHRydWUpCisgIC1ib29sMyAgICAgICAgICAgICA8Ym9vbGVhbj4gICAgRS4uLi4uLi4uIHNldCBib29sZWFuIHZhbHVlIChkZWZhdWx0IGZhbHNlKQogCiBUZXN0aW5nIGF2X29wdF9pc19zZXRfdG9fZGVmYXVsdCgpCiBuYW1lOiAgICAgICBudW0gZGVmYXVsdDoxIGVycm9yOgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcGFmLWF1ZGlvIGIvdGVzdHMvcmVmL2ZhdGUvcGFmLWF1ZGlvCmluZGV4IGJhNDdkNWQuLmE5ZWQ5ZTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3BhZi1hdWRpbworKysgYi90ZXN0cy9yZWYvZmF0ZS9wYWYtYXVkaW8KQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS8yMjA1MAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgNTczMzAsICAgMjI5MzIwLCAweDA2MjUwOGI0CiAwLCAgICAgIDU3MzMwLCAgICAgIDU3MzMwLCAgICA1NzMzMCwgICAyMjkzMjAsIDB4MGE5NjZjYmYKIDAsICAgICAxMTQ2NjAsICAgICAxMTQ2NjAsICAgIDU3MzMwLCAgIDIyOTMyMCwgMHhlZTliYWQ0NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcGFmLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvcGFmLWRlbXV4CmluZGV4IDg1N2ZiNTQuLjZhNjY2OTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3BhZi1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wYWYtZGVtdXgKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcGFmX3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MTkyCisjc2FyIDA6IDAvMQogI3RiIDE6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGFmX2F1ZGlvCisjc2FtcGxlX3JhdGUgMTogMjIwNTAKKyNjaGFubmVsX2xheW91dCAxOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI2MjE0NCwgMHg3ZjlhM2M2YQogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgNTczMzAsICAgMTMxMDcyLCAweDI1NWE2YWMyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyNjA2MDAsIDB4MDMyOWU2ZjQsIEY9MHgwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9wYWYtdmlkZW8gYi90ZXN0cy9yZWYvZmF0ZS9wYWYtdmlkZW8KaW5kZXggZWQzN2MyOC4uYWExZmE4MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcGFmLXZpZGVvCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BhZi12aWRlbwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MTkyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ3NDU2LCAweDAwMDAwMDAwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDc0NTYsIDB4N2JlNDA3OTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE0NzQ1NiwgMHg0NGJjMmZjMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcGFyc2V1dGlscyBiL3Rlc3RzL3JlZi9mYXRlL3BhcnNldXRpbHMKaW5kZXggMzMwNjIyOS4uNTY4YjZkMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcGFyc2V1dGlscworKysgYi90ZXN0cy9yZWYvZmF0ZS9wYXJzZXV0aWxzCkBAIC02OCw2ICs2OCwxMyBAQAogZm10OiclWSAtICVtIC0gJWQnIHNwZWM6JzIwMTItMTItMjEnIC0+IDIwMTItMTItMjEgMDA6MDA6MDAKIGZtdDonJVktJW0tJWQgJUg6JU06JVMnIHNwZWM6JzIwMTItMTItMjEgMjA6MTI6MjEnIC0+IDIwMTItMTItMjEgMjA6MTI6MjEKIGZtdDonICAlWSAtICVtIC0gJWQgJUggOiAlTSA6ICVTJyBzcGVjOicgICAyMDEyIC0gMTIgLSAgMjEgICAyMCA6IDEyIDogMjEnIC0+IDIwMTItMTItMjEgMjA6MTI6MjEKK2ZtdDonICAlWSAtICViIC0gJWQgJUggOiAlTSA6ICVTJyBzcGVjOicgICAyMDEyIC0gbk9WIC0gIDIxICAgMjAgOiAxMiA6IDIxJyAtPiAyMDEyLTExLTIxIDIwOjEyOjIxCitmbXQ6JyAgJVkgLSAlQiAtICVkICVIIDogJU0gOiAlUycgc3BlYzonICAgMjAxMiAtIG5PVmVtQmVSIC0gIDIxICAgMjAgOiAxMiA6IDIxJyAtPiAyMDEyLTExLTIxIDIwOjEyOjIxCitmbXQ6JyAgJVkgLSAlQiVkICVIIDogJU0gOiAlUycgc3BlYzonICAgMjAxMiAtIG1heTIxICAgMjAgOiAxMiA6IDIxJyAtPiAyMDEyLTA1LTIxIDIwOjEyOjIxCitmbXQ6JyAgJVkgLSAlQiVkICVIIDogJU0gOiAlUycgc3BlYzonICAgMjAxMiAtIG1ieTIxICAgMjAgOiAxMiA6IDIxJyAtPiBlcnJvcgorZm10OicgICVZIC0gJUIgLSAlZCAlSCA6ICVNIDogJVMnIHNwZWM6JyAgIDIwMTIgLSBKdW5FIC0gIDIxICAgMjAgOiAxMiA6IDIxJyAtPiAyMDEyLTA2LTIxIDIwOjEyOjIxCitmbXQ6JyAgJVkgLSAlQiAtICVkICVIIDogJU0gOiAlUycgc3BlYzonICAgMjAxMiAtIEphbmUgLSAgMjEgICAyMCA6IDEyIDogMjEnIC0+IGVycm9yCitmbXQ6JyAgJVkgLSAlQiAtICVkICVIIDogJU0gOiAlUycgc3BlYzonICAgMjAxMiAtIEphbnVhcnkgLSAgMjEgICAyMCA6IDEyIDogMjEnIC0+IDIwMTItMDEtMjEgMjA6MTI6MjEKIAogVGVzdGluZyBhdl9wYXJzZV90aW1lKCkKIChub3cgaXMgMjAxMi0wMy0xNyAwOToxNDoxMy4yICswMTAwLCBsb2NhbCB0aW1lIGlzIFVUQysxKQpAQCAtODMsMyArOTAsMTU0IEBACiA0Mi4xNzI5ICAgICAgICAgICAgICAgICAgLT4gICAgICAgICAgICAgKzQyMTcyOTAwCiAtMTcyOS40MiAgICAgICAgICAgICAgICAgLT4gICAgICAgICAgIC0xNzI5NDIwMDAwCiAxMjozNCAgICAgICAgICAgICAgICAgICAgLT4gICAgICAgICAgICArNzU0MDAwMDAwCisKK1Rlc3RpbmcgYXZfZ2V0X2tub3duX2NvbG9yX25hbWUoKQorQWxpY2VCbHVlIC0+IFIoMjQwKSBHKDI0OCkgQigyNTUpIEEoMCkKK0FudGlxdWVXaGl0ZSAtPiBSKDI1MCkgRygyMzUpIEIoMjE1KSBBKDApCitBcXVhIC0+IFIoMCkgRygyNTUpIEIoMjU1KSBBKDApCitBcXVhbWFyaW5lIC0+IFIoMTI3KSBHKDI1NSkgQigyMTIpIEEoMCkKK0F6dXJlIC0+IFIoMjQwKSBHKDI1NSkgQigyNTUpIEEoMCkKK0JlaWdlIC0+IFIoMjQ1KSBHKDI0NSkgQigyMjApIEEoMCkKK0Jpc3F1ZSAtPiBSKDI1NSkgRygyMjgpIEIoMTk2KSBBKDApCitCbGFjayAtPiBSKDApIEcoMCkgQigwKSBBKDApCitCbGFuY2hlZEFsbW9uZCAtPiBSKDI1NSkgRygyMzUpIEIoMjA1KSBBKDApCitCbHVlIC0+IFIoMCkgRygwKSBCKDI1NSkgQSgwKQorQmx1ZVZpb2xldCAtPiBSKDEzOCkgRyg0MykgQigyMjYpIEEoMCkKK0Jyb3duIC0+IFIoMTY1KSBHKDQyKSBCKDQyKSBBKDApCitCdXJseVdvb2QgLT4gUigyMjIpIEcoMTg0KSBCKDEzNSkgQSgwKQorQ2FkZXRCbHVlIC0+IFIoOTUpIEcoMTU4KSBCKDE2MCkgQSgwKQorQ2hhcnRyZXVzZSAtPiBSKDEyNykgRygyNTUpIEIoMCkgQSgwKQorQ2hvY29sYXRlIC0+IFIoMjEwKSBHKDEwNSkgQigzMCkgQSgwKQorQ29yYWwgLT4gUigyNTUpIEcoMTI3KSBCKDgwKSBBKDApCitDb3JuZmxvd2VyQmx1ZSAtPiBSKDEwMCkgRygxNDkpIEIoMjM3KSBBKDApCitDb3Juc2lsayAtPiBSKDI1NSkgRygyNDgpIEIoMjIwKSBBKDApCitDcmltc29uIC0+IFIoMjIwKSBHKDIwKSBCKDYwKSBBKDApCitDeWFuIC0+IFIoMCkgRygyNTUpIEIoMjU1KSBBKDApCitEYXJrQmx1ZSAtPiBSKDApIEcoMCkgQigxMzkpIEEoMCkKK0RhcmtDeWFuIC0+IFIoMCkgRygxMzkpIEIoMTM5KSBBKDApCitEYXJrR29sZGVuUm9kIC0+IFIoMTg0KSBHKDEzNCkgQigxMSkgQSgwKQorRGFya0dyYXkgLT4gUigxNjkpIEcoMTY5KSBCKDE2OSkgQSgwKQorRGFya0dyZWVuIC0+IFIoMCkgRygxMDApIEIoMCkgQSgwKQorRGFya0toYWtpIC0+IFIoMTg5KSBHKDE4MykgQigxMDcpIEEoMCkKK0RhcmtNYWdlbnRhIC0+IFIoMTM5KSBHKDApIEIoMTM5KSBBKDApCitEYXJrT2xpdmVHcmVlbiAtPiBSKDg1KSBHKDEwNykgQig0NykgQSgwKQorRGFya29yYW5nZSAtPiBSKDI1NSkgRygxNDApIEIoMCkgQSgwKQorRGFya09yY2hpZCAtPiBSKDE1MykgRyg1MCkgQigyMDQpIEEoMCkKK0RhcmtSZWQgLT4gUigxMzkpIEcoMCkgQigwKSBBKDApCitEYXJrU2FsbW9uIC0+IFIoMjMzKSBHKDE1MCkgQigxMjIpIEEoMCkKK0RhcmtTZWFHcmVlbiAtPiBSKDE0MykgRygxODgpIEIoMTQzKSBBKDApCitEYXJrU2xhdGVCbHVlIC0+IFIoNzIpIEcoNjEpIEIoMTM5KSBBKDApCitEYXJrU2xhdGVHcmF5IC0+IFIoNDcpIEcoNzkpIEIoNzkpIEEoMCkKK0RhcmtUdXJxdW9pc2UgLT4gUigwKSBHKDIwNikgQigyMDkpIEEoMCkKK0RhcmtWaW9sZXQgLT4gUigxNDgpIEcoMCkgQigyMTEpIEEoMCkKK0RlZXBQaW5rIC0+IFIoMjU1KSBHKDIwKSBCKDE0NykgQSgwKQorRGVlcFNreUJsdWUgLT4gUigwKSBHKDE5MSkgQigyNTUpIEEoMCkKK0RpbUdyYXkgLT4gUigxMDUpIEcoMTA1KSBCKDEwNSkgQSgwKQorRG9kZ2VyQmx1ZSAtPiBSKDMwKSBHKDE0NCkgQigyNTUpIEEoMCkKK0ZpcmVCcmljayAtPiBSKDE3OCkgRygzNCkgQigzNCkgQSgwKQorRmxvcmFsV2hpdGUgLT4gUigyNTUpIEcoMjUwKSBCKDI0MCkgQSgwKQorRm9yZXN0R3JlZW4gLT4gUigzNCkgRygxMzkpIEIoMzQpIEEoMCkKK0Z1Y2hzaWEgLT4gUigyNTUpIEcoMCkgQigyNTUpIEEoMCkKK0dhaW5zYm9ybyAtPiBSKDIyMCkgRygyMjApIEIoMjIwKSBBKDApCitHaG9zdFdoaXRlIC0+IFIoMjQ4KSBHKDI0OCkgQigyNTUpIEEoMCkKK0dvbGQgLT4gUigyNTUpIEcoMjE1KSBCKDApIEEoMCkKK0dvbGRlblJvZCAtPiBSKDIxOCkgRygxNjUpIEIoMzIpIEEoMCkKK0dyYXkgLT4gUigxMjgpIEcoMTI4KSBCKDEyOCkgQSgwKQorR3JlZW4gLT4gUigwKSBHKDEyOCkgQigwKSBBKDApCitHcmVlblllbGxvdyAtPiBSKDE3MykgRygyNTUpIEIoNDcpIEEoMCkKK0hvbmV5RGV3IC0+IFIoMjQwKSBHKDI1NSkgQigyNDApIEEoMCkKK0hvdFBpbmsgLT4gUigyNTUpIEcoMTA1KSBCKDE4MCkgQSgwKQorSW5kaWFuUmVkIC0+IFIoMjA1KSBHKDkyKSBCKDkyKSBBKDApCitJbmRpZ28gLT4gUig3NSkgRygwKSBCKDEzMCkgQSgwKQorSXZvcnkgLT4gUigyNTUpIEcoMjU1KSBCKDI0MCkgQSgwKQorS2hha2kgLT4gUigyNDApIEcoMjMwKSBCKDE0MCkgQSgwKQorTGF2ZW5kZXIgLT4gUigyMzApIEcoMjMwKSBCKDI1MCkgQSgwKQorTGF2ZW5kZXJCbHVzaCAtPiBSKDI1NSkgRygyNDApIEIoMjQ1KSBBKDApCitMYXduR3JlZW4gLT4gUigxMjQpIEcoMjUyKSBCKDApIEEoMCkKK0xlbW9uQ2hpZmZvbiAtPiBSKDI1NSkgRygyNTApIEIoMjA1KSBBKDApCitMaWdodEJsdWUgLT4gUigxNzMpIEcoMjE2KSBCKDIzMCkgQSgwKQorTGlnaHRDb3JhbCAtPiBSKDI0MCkgRygxMjgpIEIoMTI4KSBBKDApCitMaWdodEN5YW4gLT4gUigyMjQpIEcoMjU1KSBCKDI1NSkgQSgwKQorTGlnaHRHb2xkZW5Sb2RZZWxsb3cgLT4gUigyNTApIEcoMjUwKSBCKDIxMCkgQSgwKQorTGlnaHRHcmVlbiAtPiBSKDE0NCkgRygyMzgpIEIoMTQ0KSBBKDApCitMaWdodEdyZXkgLT4gUigyMTEpIEcoMjExKSBCKDIxMSkgQSgwKQorTGlnaHRQaW5rIC0+IFIoMjU1KSBHKDE4MikgQigxOTMpIEEoMCkKK0xpZ2h0U2FsbW9uIC0+IFIoMjU1KSBHKDE2MCkgQigxMjIpIEEoMCkKK0xpZ2h0U2VhR3JlZW4gLT4gUigzMikgRygxNzgpIEIoMTcwKSBBKDApCitMaWdodFNreUJsdWUgLT4gUigxMzUpIEcoMjA2KSBCKDI1MCkgQSgwKQorTGlnaHRTbGF0ZUdyYXkgLT4gUigxMTkpIEcoMTM2KSBCKDE1MykgQSgwKQorTGlnaHRTdGVlbEJsdWUgLT4gUigxNzYpIEcoMTk2KSBCKDIyMikgQSgwKQorTGlnaHRZZWxsb3cgLT4gUigyNTUpIEcoMjU1KSBCKDIyNCkgQSgwKQorTGltZSAtPiBSKDApIEcoMjU1KSBCKDApIEEoMCkKK0xpbWVHcmVlbiAtPiBSKDUwKSBHKDIwNSkgQig1MCkgQSgwKQorTGluZW4gLT4gUigyNTApIEcoMjQwKSBCKDIzMCkgQSgwKQorTWFnZW50YSAtPiBSKDI1NSkgRygwKSBCKDI1NSkgQSgwKQorTWFyb29uIC0+IFIoMTI4KSBHKDApIEIoMCkgQSgwKQorTWVkaXVtQXF1YU1hcmluZSAtPiBSKDEwMikgRygyMDUpIEIoMTcwKSBBKDApCitNZWRpdW1CbHVlIC0+IFIoMCkgRygwKSBCKDIwNSkgQSgwKQorTWVkaXVtT3JjaGlkIC0+IFIoMTg2KSBHKDg1KSBCKDIxMSkgQSgwKQorTWVkaXVtUHVycGxlIC0+IFIoMTQ3KSBHKDExMikgQigyMTYpIEEoMCkKK01lZGl1bVNlYUdyZWVuIC0+IFIoNjApIEcoMTc5KSBCKDExMykgQSgwKQorTWVkaXVtU2xhdGVCbHVlIC0+IFIoMTIzKSBHKDEwNCkgQigyMzgpIEEoMCkKK01lZGl1bVNwcmluZ0dyZWVuIC0+IFIoMCkgRygyNTApIEIoMTU0KSBBKDApCitNZWRpdW1UdXJxdW9pc2UgLT4gUig3MikgRygyMDkpIEIoMjA0KSBBKDApCitNZWRpdW1WaW9sZXRSZWQgLT4gUigxOTkpIEcoMjEpIEIoMTMzKSBBKDApCitNaWRuaWdodEJsdWUgLT4gUigyNSkgRygyNSkgQigxMTIpIEEoMCkKK01pbnRDcmVhbSAtPiBSKDI0NSkgRygyNTUpIEIoMjUwKSBBKDApCitNaXN0eVJvc2UgLT4gUigyNTUpIEcoMjI4KSBCKDIyNSkgQSgwKQorTW9jY2FzaW4gLT4gUigyNTUpIEcoMjI4KSBCKDE4MSkgQSgwKQorTmF2YWpvV2hpdGUgLT4gUigyNTUpIEcoMjIyKSBCKDE3MykgQSgwKQorTmF2eSAtPiBSKDApIEcoMCkgQigxMjgpIEEoMCkKK09sZExhY2UgLT4gUigyNTMpIEcoMjQ1KSBCKDIzMCkgQSgwKQorT2xpdmUgLT4gUigxMjgpIEcoMTI4KSBCKDApIEEoMCkKK09saXZlRHJhYiAtPiBSKDEwNykgRygxNDIpIEIoMzUpIEEoMCkKK09yYW5nZSAtPiBSKDI1NSkgRygxNjUpIEIoMCkgQSgwKQorT3JhbmdlUmVkIC0+IFIoMjU1KSBHKDY5KSBCKDApIEEoMCkKK09yY2hpZCAtPiBSKDIxOCkgRygxMTIpIEIoMjE0KSBBKDApCitQYWxlR29sZGVuUm9kIC0+IFIoMjM4KSBHKDIzMikgQigxNzApIEEoMCkKK1BhbGVHcmVlbiAtPiBSKDE1MikgRygyNTEpIEIoMTUyKSBBKDApCitQYWxlVHVycXVvaXNlIC0+IFIoMTc1KSBHKDIzOCkgQigyMzgpIEEoMCkKK1BhbGVWaW9sZXRSZWQgLT4gUigyMTYpIEcoMTEyKSBCKDE0NykgQSgwKQorUGFwYXlhV2hpcCAtPiBSKDI1NSkgRygyMzkpIEIoMjEzKSBBKDApCitQZWFjaFB1ZmYgLT4gUigyNTUpIEcoMjE4KSBCKDE4NSkgQSgwKQorUGVydSAtPiBSKDIwNSkgRygxMzMpIEIoNjMpIEEoMCkKK1BpbmsgLT4gUigyNTUpIEcoMTkyKSBCKDIwMykgQSgwKQorUGx1bSAtPiBSKDIyMSkgRygxNjApIEIoMjIxKSBBKDApCitQb3dkZXJCbHVlIC0+IFIoMTc2KSBHKDIyNCkgQigyMzApIEEoMCkKK1B1cnBsZSAtPiBSKDEyOCkgRygwKSBCKDEyOCkgQSgwKQorUmVkIC0+IFIoMjU1KSBHKDApIEIoMCkgQSgwKQorUm9zeUJyb3duIC0+IFIoMTg4KSBHKDE0MykgQigxNDMpIEEoMCkKK1JveWFsQmx1ZSAtPiBSKDY1KSBHKDEwNSkgQigyMjUpIEEoMCkKK1NhZGRsZUJyb3duIC0+IFIoMTM5KSBHKDY5KSBCKDE5KSBBKDApCitTYWxtb24gLT4gUigyNTApIEcoMTI4KSBCKDExNCkgQSgwKQorU2FuZHlCcm93biAtPiBSKDI0NCkgRygxNjQpIEIoOTYpIEEoMCkKK1NlYUdyZWVuIC0+IFIoNDYpIEcoMTM5KSBCKDg3KSBBKDApCitTZWFTaGVsbCAtPiBSKDI1NSkgRygyNDUpIEIoMjM4KSBBKDApCitTaWVubmEgLT4gUigxNjApIEcoODIpIEIoNDUpIEEoMCkKK1NpbHZlciAtPiBSKDE5MikgRygxOTIpIEIoMTkyKSBBKDApCitTa3lCbHVlIC0+IFIoMTM1KSBHKDIwNikgQigyMzUpIEEoMCkKK1NsYXRlQmx1ZSAtPiBSKDEwNikgRyg5MCkgQigyMDUpIEEoMCkKK1NsYXRlR3JheSAtPiBSKDExMikgRygxMjgpIEIoMTQ0KSBBKDApCitTbm93IC0+IFIoMjU1KSBHKDI1MCkgQigyNTApIEEoMCkKK1NwcmluZ0dyZWVuIC0+IFIoMCkgRygyNTUpIEIoMTI3KSBBKDApCitTdGVlbEJsdWUgLT4gUig3MCkgRygxMzApIEIoMTgwKSBBKDApCitUYW4gLT4gUigyMTApIEcoMTgwKSBCKDE0MCkgQSgwKQorVGVhbCAtPiBSKDApIEcoMTI4KSBCKDEyOCkgQSgwKQorVGhpc3RsZSAtPiBSKDIxNikgRygxOTEpIEIoMjE2KSBBKDApCitUb21hdG8gLT4gUigyNTUpIEcoOTkpIEIoNzEpIEEoMCkKK1R1cnF1b2lzZSAtPiBSKDY0KSBHKDIyNCkgQigyMDgpIEEoMCkKK1Zpb2xldCAtPiBSKDIzOCkgRygxMzApIEIoMjM4KSBBKDApCitXaGVhdCAtPiBSKDI0NSkgRygyMjIpIEIoMTc5KSBBKDApCitXaGl0ZSAtPiBSKDI1NSkgRygyNTUpIEIoMjU1KSBBKDApCitXaGl0ZVNtb2tlIC0+IFIoMjQ1KSBHKDI0NSkgQigyNDUpIEEoMCkKK1llbGxvdyAtPiBSKDI1NSkgRygyNTUpIEIoMCkgQSgwKQorWWVsbG93R3JlZW4gLT4gUigxNTQpIEcoMjA1KSBCKDUwKSBBKDApCisKK1Rlc3RpbmcgYXZfZmluZF9pbmZvX3RhZygpCiswLiB0YWcxIGZvdW5kOiB2YWwxCisxLiB0YWcyIGZvdW5kOiB2YWwyCisyLiB0YWczIGZvdW5kOiB2YWwzCiszLiB0YWc0IG5vdCBmb3VuZAorNC4gdGFnNDEgZm91bmQ6IHZhbHVlIDQxCis1LiA0MSBub3QgZm91bmQKKzYuIHJhbmRvbTEgbm90IGZvdW5kCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9wY20tcGxhbmFyIGIvdGVzdHMvcmVmL2ZhdGUvcGNtLXBsYW5hcgppbmRleCA5MWI0YTc4Li44YjZjOTYxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9wY20tcGxhbmFyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BjbS1wbGFuYXIKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDE0NzEsICAgICA1ODg0LCAweDAwMDAwMDAwCiAwLCAgICAgICAxNDcxLCAgICAgICAxNDcxLCAgICAgMTQ3MSwgICAgIDU4ODQsIDB4MDAwMDAwMDAKIDAsICAgICAgIDI5NDIsICAgICAgIDI5NDIsICAgICAxNDcyLCAgICAgNTg4OCwgMHgwMDAwMDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcGNtX2R2ZCBiL3Rlc3RzL3JlZi9mYXRlL3BjbV9kdmQKaW5kZXggNjAzNzQ1MS4uMmEyNDE1NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcGNtX2R2ZAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wY21fZHZkCkBAIC0xLDQgKzEsOSBAQAogI3RiIDA6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogNDgwMDAKKyNjaGFubmVsX2xheW91dCAwOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgMzM0LCAgICAgMTMzNiwgMHg4ZTNjMGFiYwogMCwgICAgICAgIDQwMCwgICAgICAgIDQwMCwgICAgICAzMzQsICAgICAxMzM2LCAweDk5YzQxMTA4CiAwLCAgICAgICAgNzIwLCAgICAgICAgNzIwLCAgICAgIDMzNCwgICAgIDEzMzYsIDB4ZDY1YmUzMjIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3BjbV9zMTZiZS1zdGVyZW8gYi90ZXN0cy9yZWYvZmF0ZS9wY21fczE2YmUtc3RlcmVvCmluZGV4IDI1MDBiYTIuLjZkMjlhNjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3BjbV9zMTZiZS1zdGVyZW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvcGNtX3MxNmJlLXN0ZXJlbwpAQCAtMSArMSBAQAotZjBjMGZkNzYxNWNkZWY2NmZhNzJmNTgxNjYzMmNhOWIKKzc1OWNmNWQxMmE0YjJmYjY1M2U2MWY1MjE5MzMxZjE0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9waWN0IGIvdGVzdHMvcmVmL2ZhdGUvcGljdAppbmRleCAwYjc2NGZjLi5mMGYyZTIxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9waWN0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BpY3QKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjU2eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ5MTUyLCAweDE0NDgwNGIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9waWN0b3IgYi90ZXN0cy9yZWYvZmF0ZS9waWN0b3IKaW5kZXggYzg5YjYwOC4uMmM3Y2Y5MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcGljdG9yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BpY3RvcgpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMTJ4MjA2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTkyODE2LCAweDI5YjljMTU4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9waXhmbXRfYmVzdCBiL3Rlc3RzL3JlZi9mYXRlL3BpeGZtdF9iZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OWUyZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9waXhmbXRfYmVzdApAQCAtMCwwICsxIEBACis3MiB0ZXN0cyBwYXNzZWQsIDAgdGVzdHMgZmFpbGVkLgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcGl4bGV0LXJnYiBiL3Rlc3RzL3JlZi9mYXRlL3BpeGxldC1yZ2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0NWZkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BpeGxldC1yZ2IKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTN4OQorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDM3NCwgMHg5M2YxYmE2ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcG1wLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvcG1wLWRlbXV4CmluZGV4IGI0ODFkYjcuLjVjNTFiOGIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3BtcC1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wbXAtZGVtdXgKQEAgLTEsNCArMSw5IEBACiAjdGIgMDogMS80NDEwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBtcDMKKyNzYW1wbGVfcmF0ZSAwOiA0NDEwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDExNTIsICAgICAgNDE3LCAweGNiODczZmJhCiAwLCAgICAgICAxMTUyLCAgICAgICAxMTUyLCAgICAgMTE1MiwgICAgICAxMDQsIDB4NmQ1MjFjNWEKIDAsICAgICAgIDIzMDQsICAgICAgIDIzMDQsICAgICAxMTUyLCAgICAgIDEwNCwgMHhiM2FmMWQ2NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcG5nLWdyYXkxNiBiL3Rlc3RzL3JlZi9mYXRlL3BuZy1ncmF5MTYKaW5kZXggNjZmYzYwMS4uY2YwZDljMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcG5nLWdyYXkxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS9wbmctZ3JheTE2CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDkxNTIsIDB4YzcxYjc3Y2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3BuZy1ncmF5OCBiL3Rlc3RzL3JlZi9mYXRlL3BuZy1ncmF5OAppbmRleCA5ZDMwZGI2Li43NzU0MWNhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9wbmctZ3JheTgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcG5nLWdyYXk4CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDkxNTIsIDB4NTUxMjFiMDMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3BuZy1pbnQtcmdiMjQgYi90ZXN0cy9yZWYvZmF0ZS9wbmctaW50LXJnYjI0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzN2FhYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wbmctaW50LXJnYjI0CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMjgzNS8yODM1CiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDkxNTIsIDB4ZTAwMTNkZWUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3BuZy1yZ2IyNCBiL3Rlc3RzL3JlZi9mYXRlL3BuZy1yZ2IyNAppbmRleCBjMzgzODM2Li41NGM4ZGY4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9wbmctcmdiMjQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcG5nLXJnYjI0CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogNzIvNzIKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhlMDAxM2RlZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcG5nLXJnYjQ4IGIvdGVzdHMvcmVmL2ZhdGUvcG5nLXJnYjQ4CmluZGV4IGIxMTU5ZjEuLmRlZTg0OWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3BuZy1yZ2I0OAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wbmctcmdiNDgKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhjZjBlOTAyYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcG5nLXJnYmEgYi90ZXN0cy9yZWYvZmF0ZS9wbmctcmdiYQppbmRleCBmMjBmZTBjLi5lNGQ1YmI4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9wbmctcmdiYQorKysgYi90ZXN0cy9yZWYvZmF0ZS9wbmctcmdiYQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ5MTUyLCAweDUwMTdiYzIxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9wbmctcmdiYTY0IGIvdGVzdHMvcmVmL2ZhdGUvcG5nLXJnYmE2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTY2ZjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcG5nLXJnYmE2NApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ5MTUyLCAweDA0ZjM1MDYzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9wbmcteWExNiBiL3Rlc3RzL3JlZi9mYXRlL3BuZy15YTE2CmluZGV4IGRmZmRhZjcuLjI3OTdlYzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3BuZy15YTE2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BuZy15YTE2CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMS8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDkxNTIsIDB4MDgwMWNlNzgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3BuZy15YTggYi90ZXN0cy9yZWYvZmF0ZS9wbmcteWE4CmluZGV4IDEzMThhZjguLjZmY2E0NjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3BuZy15YTgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcG5nLXlhOApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ5MTUyLCAweDVhMTQ4MWY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9wbmdwYXJzZXIgYi90ZXN0cy9yZWYvZmF0ZS9wbmdwYXJzZXIKaW5kZXggOTMwMDVjZi4uMTExYzQxZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcG5ncGFyc2VyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BuZ3BhcnNlcgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyMHgyMAorI3NhciAwOiAzNTQzLzM1NDMKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMTYwMCwgMHgwMWE0ODFhOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAxNjAwLCAweDAxYTQ4MWE5CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgIDE2MDAsIDB4MDFhNDgxYTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy00MjIgYi90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtNDIyCmluZGV4IGY0MDI1MTEuLjFhZTRmNWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy00MjIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLTQyMgpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA4Mjk0NDAwLCAweDU3MTI3ZGQ5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4NTcxMjdkZDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy00MjJfaHEgYi90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtNDIyX2hxCmluZGV4IDYxYTUwMTQuLjRiNDAxMGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy00MjJfaHEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLTQyMl9ocQpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA4Mjk0NDAwLCAweDk3ODg1MWY0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4OTc4ODUxZjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy00MjJfbHQgYi90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtNDIyX2x0CmluZGV4IDMxMTNjOGEuLjg1M2M1MDAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy00MjJfbHQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLTQyMl9sdApAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA4Mjk0NDAwLCAweDRjYTExMGM3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4NGNhMTEwYzcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy00MjJfcHJveHkgYi90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtNDIyX3Byb3h5CmluZGV4IDU1NjJkY2UuLmI3N2FmM2IgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy00MjJfcHJveHkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLTQyMl9wcm94eQpAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICA4Mjk0NDAwLCAweDAwN2JhNzcwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDgyOTQ0MDAsIDB4MDA3YmE3NzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy1hbHBoYSBiL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy1hbHBoYQppbmRleCBkNjRjZmQ1Li5mNDUxZDgzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtYWxwaGEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLWFscGhhCkBAIC0xLDMgKzEsNyBAQAogI3RiIDA6IDEwMC8yOTk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgMTY1ODg4MDAsIDB4OGU0ZGFjNDgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAxNjU4ODgwMCwgMHg4ZTRkYWM0OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLWFscGhhX3NraXAgYi90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtYWxwaGFfc2tpcAppbmRleCA1NTllYzJiLi5hMTdjZWY4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtYWxwaGFfc2tpcAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtYWxwaGFfc2tpcApAQCAtMSwzICsxLDcgQEAKICN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsIDEyNDQxNjAwLCAweGYxMTY4NWRkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgMTI0NDE2MDAsIDB4ZjExNjg1ZGQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy1ncmF5IGIvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLWdyYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhNjNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy1ncmF5CkBAIC0wLDAgKzEsMTYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NTc2Cisjc2FyIDA6IDE2LzE1CisjdGIgMTogMS80ODAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAxOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxNjU4ODgwLCAweDQzZDljOWUyCisxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4NmM4YTlhMTgKKzEsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAxMDI0LCAgICAgNDA5NiwgMHg5NjBkYWRjZgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxNjU4ODgwLCAweGEyYTcyZjliCisxLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgMTAyNCwgICAgIDQwOTYsIDB4YTkxM2NkNTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy10cmFuc3BhcmVuY3kgYi90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtdHJhbnNwYXJlbmN5CmluZGV4IDc0NWU5NjYuLjdiM2VmYzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy10cmFuc3BhcmVuY3kKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLXRyYW5zcGFyZW5jeQpAQCAtMSw1ICsxLDE0IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTkyMHgxMDgwCisjc2FyIDA6IDEvMQogI3RiIDE6IDEvNDgwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogNDgwMDAKKyNjaGFubmVsX2xheW91dCAxOiAzCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBzdGVyZW8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAxNjU4ODgwMCwgMHg3MTYzYjAxYQogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICA0MDk2LCAweDAwMDAwMDAwCiAxLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgIDg5NiwgICAgIDM1ODQsIDB4MDAwMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy10cmFuc3BhcmVuY3lfc2tpcCBiL3Rlc3RzL3JlZi9mYXRlL3Byb3Jlcy10cmFuc3BhcmVuY3lfc2tpcAppbmRleCA1ZmQ4ZDBiLi41Yzk4ZDNlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9wcm9yZXMtdHJhbnNwYXJlbmN5X3NraXAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHJvcmVzLXRyYW5zcGFyZW5jeV9za2lwCkBAIC0xLDUgKzEsMTQgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMS8xCiAjdGIgMTogMS80ODAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAxOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsIDEyNDQxNjAwLCAweDYyN2QxNTQ4CiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMTAyNCwgICAgIDQwOTYsIDB4MDAwMDAwMDAKIDEsICAgICAgIDEwMjQsICAgICAgIDEwMjQsICAgICAgODk2LCAgICAgMzU4NCwgMHgwMDAwMDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWR1by10b25lLWNvbG9yIGIvdGVzdHMvcmVmL2ZhdGUvcHNkLWR1by10b25lLWNvbG9yCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0OTBlMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wc2QtZHVvLXRvbmUtY29sb3IKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjM4NCwgMHhlMGNmYTY4MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWdyYXkxNiBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1ncmF5MTYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4YWY2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1ncmF5MTYKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhjZTM0NzdkMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWdyYXk4IGIvdGVzdHMvcmVmL2ZhdGUvcHNkLWdyYXk4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGRjNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wc2QtZ3JheTgKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHg1NTEyMWIwMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWxlbmEtMTI3eDEyNy1yZ2IyNCBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1sZW5hLTEyN3gxMjctcmdiMjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0NGY0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1sZW5hLTEyN3gxMjctcmdiMjQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI3eDEyNworI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0ODM4NywgMHhkN2I2YmVjNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWxlbmEtMjU2YyBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1sZW5hLTI1NmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmMTM5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1sZW5hLTI1NmMKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNzQwOCwgMHg0ZDgwYmY0ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWxlbmEtYml0bWFwIGIvdGVzdHMvcmVmL2ZhdGUvcHNkLWxlbmEtYml0bWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNzI1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wc2QtbGVuYS1iaXRtYXAKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMjA0OCwgMHg0MGE3MmM0ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWxlbmEtcmdiLXJsZS0xMjd4MTI3LTE2YiBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1sZW5hLXJnYi1ybGUtMTI3eDEyNy0xNmIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2NTkzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1sZW5hLXJnYi1ybGUtMTI3eDEyNy0xNmIKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI3eDEyNworI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA5Njc3NCwgMHhhYWI2Y2MxZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWxlbmEtcmdiLXJsZS0xMjd4MTI3LThiIGIvdGVzdHMvcmVmL2ZhdGUvcHNkLWxlbmEtcmdiLXJsZS0xMjd4MTI3LThiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjM2I0YTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wc2QtbGVuYS1yZ2ItcmxlLTEyN3gxMjctOGIKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI3eDEyNworI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0ODM4NywgMHgzNWIyN2I2MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLWxlbmEtcmdiYS1ybGUtMTI4eDEyOC04YiBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1sZW5hLXJnYmEtcmxlLTEyOHgxMjgtOGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhMTFiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1sZW5hLXJnYmEtcmxlLTEyOHgxMjgtOGIKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA2NTUzNiwgMHhhYWFjZGZmMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLXJnYjI0IGIvdGVzdHMvcmVmL2ZhdGUvcHNkLXJnYjI0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGY1NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wc2QtcmdiMjQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhlMDAxM2RlZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLXJnYjQ4IGIvdGVzdHMvcmVmL2ZhdGUvcHNkLXJnYjQ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MGNiYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wc2QtcmdiNDgKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHgwYmM2NTAzYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLXJnYmEgYi90ZXN0cy9yZWYvZmF0ZS9wc2QtcmdiYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzI4OTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHNkLXJnYmEKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhiMjU2M2I0YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLXJnYmE2NCBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1yZ2JhNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxNjg2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BzZC1yZ2JhNjQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhiODQ3ZmQ3MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLXlhMTYgYi90ZXN0cy9yZWYvZmF0ZS9wc2QteWExNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU4MmViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcHNkLXlhMTYKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhlOGYwOGFmMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHNkLXlhOCBiL3Rlc3RzL3JlZi9mYXRlL3BzZC15YTgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1OWZiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3BzZC15YTgKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhmYTBlZTFkMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHN4LXN0ci1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL3BzeC1zdHItZGVtdXgKaW5kZXggNDJjNTczMS4uYTQ3Yzg2OSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcHN4LXN0ci1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wc3gtc3RyLWRlbXV4CkBAIC0xLDUgKzEsMTQgQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IG1kZWMKKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAjdGIgMTogNC83NQorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBhZHBjbV94YQorI3NhbXBsZV9yYXRlIDE6IDM3ODAwCisjY2hhbm5lbF9sYXlvdXQgMTogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogc3RlcmVvCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDg4MzIsIDB4MDFhZDNlZWIKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMjMwNCwgMHhmMGFkMTAwMAogMSwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAyMzA0LCAweDY5MjY5Y2U2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9wdHggYi90ZXN0cy9yZWYvZmF0ZS9wdHgKaW5kZXggN2VkYmJkZC4uM2RlZTljMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcHR4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3B0eApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMDI0eDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDM5MzIxNiwgMHgzMDQ3OTk1MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcHZhLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvcHZhLWRlbXV4CmluZGV4IDY3ZDQ4NDQuLjNmMWM3NGYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3B2YS1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9wdmEtZGVtdXgKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDU0NHg1NzYKKyNzYXIgMDogMjQvMTcKICN0YiAxOiAxLzkwMDAwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IG1wMgorI3NhbXBsZV9yYXRlIDE6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMTogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogc3RlcmVvCiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMjE2MCwgICAgICAzODQsIDB4MDcxYWJjYzgKIDEsICAgICAgIDIxNjAsICAgICAgIDIxNjAsICAgICAyMTYwLCAgICAgIDM4NCwgMHgzMWM5YWVlMAogMSwgICAgICAgNDMyMCwgICAgICAgNDMyMCwgICAgIDIxNjAsICAgICAgMzg0LCAweGE1MGVhYTk0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9xcGVnIGIvdGVzdHMvcmVmL2ZhdGUvcXBlZwppbmRleCBlY2EyOTI0Li4xYTk4ODg3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9xcGVnCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3FwZWcKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIzMDQwMCwgMHgwYjcxMmZiYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjMwNDAwLCAweDMwMjUyYWM3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMzA0MDAsIDB4NmQ5OGE3ODcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLTE2Yml0IGIvdGVzdHMvcmVmL2ZhdGUvcXRybGUtMTZiaXQKaW5kZXggMjAyMWYyYS4uNTc2NTFkZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcXRybGUtMTZiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcXRybGUtMTZiaXQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDEyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA1NzYwMCwgMHhjZjJkMzlmYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU3NjAwLCAweGZjOWY2YmVkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgNTc2MDAsIDB4M2Y1ODA1YmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLTFiaXQgYi90ZXN0cy9yZWYvZmF0ZS9xdHJsZS0xYml0CmluZGV4IDNlY2NjMjcuLmQyZjEwYmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLTFiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcXRybGUtMWJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEyCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc3ODI0LCAweGMyOThjNjhiCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNzc4MjQsIDB4MjJmN2M2M2UKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA3NzgyNCwgMHgyYWFjYzY2OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcXRybGUtMjRiaXQgYi90ZXN0cy9yZWYvZmF0ZS9xdHJsZS0yNGJpdAppbmRleCBhMjFiMDk5Li41NDVlODJlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9xdHJsZS0yNGJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9xdHJsZS0yNGJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNjB4MTIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU3NjAwLCAweDM3MThhZDAwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNTc2MDAsIDB4NTQ4NjE1NTgKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA1NzYwMCwgMHhlYTFkNjIzMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcXRybGUtMmJpdCBiL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLTJiaXQKaW5kZXggOTVjMGY3Yy4uNjMzZGQxNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcXRybGUtMmJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9xdHJsZS0yYml0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTIKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4YjFlZTU1ZGMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMDQwMCwgMHg5N2M1ODBiZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMwNDAwLCAweGQ0YmQ1N2U4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9xdHJsZS0zMmJpdCBiL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLTMyYml0CmluZGV4IGVkNmRjMDMuLmFhYWY4ZDYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLTMyYml0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLTMyYml0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMC8yOTk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMDM2ODAwLCAweDJhOTBkMDYyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDEwMzY4MDAsIDB4NjU2NWFkZWQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMTAzNjgwMCwgMHhmMGI1ODdkMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcXRybGUtNGJpdCBiL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLTRiaXQKaW5kZXggNzRlYjRhYi4uYjA5OTIwYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcXRybGUtNGJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS9xdHJsZS00Yml0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTIKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4MDY1NWIzZDkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMDQwMCwgMHg5YzYyNmZkMwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMwNDAwLCAweDViYzk1ODY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9xdHJsZS04Yml0IGIvdGVzdHMvcmVmL2ZhdGUvcXRybGUtOGJpdAppbmRleCA1YjMwZmJiLi44ZGExMTNkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9xdHJsZS04Yml0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3F0cmxlLThiaXQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDkyMTYwMCwgMHgxNDkyZTNlZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgOTIxNjAwLCAweDE0OTJlM2VkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA5MjE2MDAsIDB4MTQ5MmUzZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3F1aWNrZHJhdyBiL3Rlc3RzL3JlZi9mYXRlL3F1aWNrZHJhdwppbmRleCBlY2NiNDc3Li41NzQ2OTI5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9xdWlja2RyYXcKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcXVpY2tkcmF3CkBAIC0xLDMgKzEsMTcgQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgOTIxNjAwLCAweGMwZTY4NzY0Ci0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA5MjE2MDAsIDB4MDFhMTY2MjkKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDkyMTYwMCwgMHhjMGU2ODc2NAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgOTIxNjAwLCAweGMwZTY4NzY0CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA5MjE2MDAsIDB4YzBlNjg3NjQKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDkyMTYwMCwgMHhjMGU2ODc2NAorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgOTIxNjAwLCAweGMwZTY4NzY0CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICA5MjE2MDAsIDB4MDFhMTY2MjkKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDkyMTYwMCwgMHgwMWExNjYyOQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgOTIxNjAwLCAweDAxYTE2NjI5CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICA5MjE2MDAsIDB4MDFhMTY2MjkKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDkyMTYwMCwgMHgwMWExNjYyOQorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgOTIxNjAwLCAweDAxYTE2NjI5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9yMjEwIGIvdGVzdHMvcmVmL2ZhdGUvcjIxMAppbmRleCA0NWJiMTBjLi5lMzY4NmZlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9yMjEwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3IyMTAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTg0MzIwMCwgMHhiZDQxNGI5MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxODQzMjAwLCAweDIzMjk4ZjFmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDE4NDMyMDAsIDB4NWE1NmRmMTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3JhMy0xNDQgYi90ZXN0cy9yZWYvZmF0ZS9yYTMtMTQ0CmluZGV4IDQwYmNhZWQuLjc1ZTdiYmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3JhMy0xNDQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcmEzLTE0NApAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzgwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMDogODAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgMTYwLCAgICAgIDMyMCwgMHgwMDAwMDAwMAogMCwgICAgICAgIDE2MCwgICAgICAgIDE2MCwgICAgICAxNjAsICAgICAgMzIwLCAweDRjZmQ1ZDc0CiAwLCAgICAgICAgMzIwLCAgICAgICAgMzIwLCAgICAgIDE2MCwgICAgICAzMjAsIDB4YmI2MGZhM2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3JhbmRvbV9zZWVkIGIvdGVzdHMvcmVmL2ZhdGUvcmFuZG9tX3NlZWQKaW5kZXggMmI1YjNhZi4uZWYwZWVmMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcmFuZG9tX3NlZWQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcmFuZG9tX3NlZWQKQEAgLTEgKzEsMiBAQAogc2VlZHMgT0sKK3NlZWRzIE9LCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9yZWRjb2RlLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvcmVkY29kZS1kZW11eAppbmRleCBhN2UyODM4Li40NTExOWVjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9yZWRjb2RlLWRlbXV4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3JlZGNvZGUtZGVtdXgKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDEvMjQwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGpwZWcyMDAwCisjZGltZW5zaW9ucyAwOiAyMDQ4eDExNTIKKyNzYXIgMDogMC8xCiAjdGIgMTogMS8yNDAwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MzMmJlCisjc2FtcGxlX3JhdGUgMTogNDgwMDAKKyNjaGFubmVsX2xheW91dCAxOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAxMDAxMCwgIDE2MjYyODAsIDB4NTc2OGM3ZDYKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgIDE4MTQwLCAgICAxNDgxNiwgMHhkMTg1ZThjNwogMCwgICAgICAxMDAxMCwgICAgICAxMDAxMCwgICAgMTAwMTAsICAxNjI2MDkyLCAweDA3MGJkODgyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9yZ2IyNC1ta3YgYi90ZXN0cy9yZWYvZmF0ZS9yZ2IyNC1ta3YKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM5YjJiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3JnYjI0LW1rdgpAQCAtMCwwICsxLDggQEAKKzA5ZWU0MTNiMmQ5MmE2YmU1ZTNiMThlOWUyMGExZjc0ICp0ZXN0cy9kYXRhL2ZhdGUvcmdiMjQtbWt2Lm1hdHJvc2thCis1ODM0MiB0ZXN0cy9kYXRhL2ZhdGUvcmdiMjQtbWt2Lm1hdHJvc2thCisjdGIgMDogMS8xMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDEyMAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA1NzYwMCwgMHgzNzE4YWQwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcmdiYXBuZy00ODE2IGIvdGVzdHMvcmVmL2ZhdGUvcmdiYXBuZy00ODE2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NDkzYmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9yZ2JhcG5nLTQ4MTYKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzMweDMzMAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQzNTYwMCwgMHg5NjFjMGYwOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcmwyIGIvdGVzdHMvcmVmL2ZhdGUvcmwyCmluZGV4IGQ3ZGQyM2QuLjkxODk4MjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3JsMgorKysgYi90ZXN0cy9yZWYvZmF0ZS9ybDIKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTE3MS8xMTAyNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5MjAwMCwgMHg3MTEyYTY2NwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTkyMDAwLCAweDY5MzZhYmYzCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTIwMDAsIDB4YjFmMDg5ODEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3JvcXZpZGVvIGIvdGVzdHMvcmVmL2ZhdGUvcm9xdmlkZW8KaW5kZXggOWZlYmVkYi4uMzZlZWM1NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcm9xdmlkZW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvcm9xdmlkZW8KQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTEyeDI1NgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDM5MzIxNiwgMHg1Njk5NWFhYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzkzMjE2LCAweGY5ZWQ1ZDZjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzOTMyMTYsIDB4ZDMyODVkNzUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3JwemEgYi90ZXN0cy9yZWYvZmF0ZS9ycHphCmluZGV4IGE5YWUzYmIuLjNhZDdlNGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3JwemEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcnB6YQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweDI2YTQ3MjhjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4YTVmZjBhMjEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIzMDQwMCwgMHg0NzlkNzY3ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcnNjYyBiL3Rlc3RzL3JlZi9mYXRlL3JzY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZGJmZTEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvcnNjYworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotI3RiIDA6IDEvMTAKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgNjgxNDcyMCwgMHgxMzY1ZjhlZgotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICA2ODE0NzIwLCAweDkwODM4OTgzCi0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDY4MTQ3MjAsIDB4ZjBjYzMxMzEKLTAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgNjgxNDcyMCwgMHhjMDdlNDA0ZAotMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICA2ODE0NzIwLCAweDk0NTk2MmRkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9yc2NjLTE2Yml0IGIvdGVzdHMvcmVmL2ZhdGUvcnNjYy0xNmJpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTcxOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcnNjYy0xNmJpdApAQCAtMCwwICsxLDIwIEBACisjdGIgMDogMTAwLzIzOTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTM2MDAsIDB4MzM3NTlkYWYKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MzYwMCwgMHg0M2UwYzkxMAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUzNjAwLCAweDZjNzVhOGYwCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxNTM2MDAsIDB4YWFjZTEyNTUKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDE1MzYwMCwgMHg0MmQzZjQzOQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTUzNjAwLCAweGIyMjViMzk2CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxNTM2MDAsIDB4YTYxNTIyMWMKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDE1MzYwMCwgMHg1NDAxZjVhOQorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTUzNjAwLCAweGQyNzRjZWYzCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxNTM2MDAsIDB4NzkzNWY5OTIKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDE1MzYwMCwgMHg3NjY5ZTdjNgorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTUzNjAwLCAweDUyN2JkNmExCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxNTM2MDAsIDB4MGYzM2IyZWQKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDE1MzYwMCwgMHhlNjJkZGIzMgorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTUzNjAwLCAweDgxNTQxYWEyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9yc2NjLTI0Yml0IGIvdGVzdHMvcmVmL2ZhdGUvcnNjYy0yNGJpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjFlYmQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcnNjYy0yNGJpdApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxMDAvMjk5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODU0eDQ4MAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTIyOTc2MCwgMHg5Yzk5YmE5OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvcnNjYy0zMmJpdCBiL3Rlc3RzL3JlZi9mYXRlL3JzY2MtMzJiaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1YjRiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3JzY2MtMzJiaXQKQEAgLTAsMCArMSwxMyBAQAorI3RiIDA6IDEwMC8yMzk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzA3MjAwLCAweGUzNmMyYzM4CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YTJlMzQ3NmIKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDMwNzIwMCwgMHg2NTE2N2M5NQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMzA3MjAwLCAweDZhY2QwMmFjCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAzMDcyMDAsIDB4Mzc5MzVlMGIKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDMwNzIwMCwgMHg4ZTY5MThiYworMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMzA3MjAwLCAweDBhMjQ2NTc4CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAzMDcyMDAsIDB4OWMxYTJmNGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3JzY2MtOGJpdCBiL3Rlc3RzL3JlZi9mYXRlL3JzY2MtOGJpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTlmZmUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcnNjYy04Yml0CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEwMC8yOTk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4NTR4NDgwCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMjI5NzYwLCAweGZkZjJlNTM4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9ydjIwLTEyMzkgYi90ZXN0cy9yZWYvZmF0ZS9ydjIwLTEyMzkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlMWI4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3J2MjAtMTIzOQpAQCAtMCwwICsxLDk1IEBACisjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDEyMAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyODgwMCwgMHhlNDFjMGVlMgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDI4ODAwLCAweDA4MDU0NTIwCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjg4MDAsIDB4MjcyYjNlZDcKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAyODgwMCwgMHg0NTY1NTFkMAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgIDI4ODAwLCAweDRmOTY0NTdmCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAgMjg4MDAsIDB4NGU3ODU2OGEKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgICAyODgwMCwgMHhlNzkxNTFmMworMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgIDI4ODAwLCAweDZkNzM1MGQ4CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAgMjg4MDAsIDB4Mzk3MjUwYjIKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgICAyODgwMCwgMHg1MTg3NTBhZQorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgIDI4ODAwLCAweDRiZmE0YWEyCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAgMjg4MDAsIDB4MDg1YTU0OTAKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgICAyODgwMCwgMHg3ZGE1NmU3NAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgIDI4ODAwLCAweGZkZDA4MTQ2CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAgMjg4MDAsIDB4OTljMjk1YmQKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgICAyODgwMCwgMHhjOGJjODhmMgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgIDI4ODAwLCAweDk4NmVhYTcyCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAgMjg4MDAsIDB4YTNmOWFhNmYKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgICAyODgwMCwgMHhjMWI0YmVkNAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgIDI4ODAwLCAweGY5YTc2N2JiCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAgMjg4MDAsIDB4NzJlNmI0MjAKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgICAyODgwMCwgMHgzMGU3ZWFiZAorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgIDI4ODAwLCAweGNhMTAwMjA2CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAgMjg4MDAsIDB4ZTQzM2Y3YjkKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgICAyODgwMCwgMHgxZjcwZjRmMgorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgIDI4ODAwLCAweDJlNThmMTgyCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAgMjg4MDAsIDB4NDUxNGNjYTgKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgICAyODgwMCwgMHhjMGUxZTE0NAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgIDI4ODAwLCAweDFhNzllMzZhCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAgMjg4MDAsIDB4MDcyOWRlMGIKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgICAyODgwMCwgMHhkNjFjY2JiMQorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgIDI4ODAwLCAweDg3N2FhNjVkCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAgMjg4MDAsIDB4N2NhYmJjMzcKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgICAyODgwMCwgMHg2NTkxYjg3YworMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgIDI4ODAwLCAweDA5N2RkOGJjCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAgMjg4MDAsIDB4YTQ1NDlmNzgKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgICAyODgwMCwgMHgxMDlmOTFlZgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgIDI4ODAwLCAweDk2YTJjNDFiCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAgMjg4MDAsIDB4M2I3MWU5ODUKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgICAyODgwMCwgMHhiYjc2ZmY1NworMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgIDI4ODAwLCAweDI2NzAxYWUxCiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAgMjg4MDAsIDB4OWRhMDNlOWIKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgICAyODgwMCwgMHg1OGZjM2Q5YQorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgIDI4ODAwLCAweDY3OTQ3NzM1CiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAgMjg4MDAsIDB4Mzk2MWNlYTQKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgICAyODgwMCwgMHg2OGZlMGYzYQorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgIDI4ODAwLCAweDY2MjNkNjFmCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAgMjg4MDAsIDB4N2RmMmM0ZmYKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgICAyODgwMCwgMHhlOWI5ZWFhNgorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgIDI4ODAwLCAweGVlYzhjMTE1CiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAgMjg4MDAsIDB4YmZkOTZiYTQKKzAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgICAyODgwMCwgMHg0ZDZkZmY3MQorMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgIDI4ODAwLCAweDNmZmJkNmZlCiswLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICAgMjg4MDAsIDB4N2FhNWU0MmUKKzAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgICAyODgwMCwgMHg0ZDA1Y2Y4MAorMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgIDI4ODAwLCAweDlmYjNiMTUyCiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAgMjg4MDAsIDB4YzYyYjA1YjIKKzAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgICAyODgwMCwgMHg4MmEyZTdkZAorMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgIDI4ODAwLCAweDQ2MTFiNzZmCiswLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICAgMjg4MDAsIDB4YzdmNWFjZWUKKzAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgICAyODgwMCwgMHgxOTE0OWNjOAorMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgIDI4ODAwLCAweGU5N2Q1OTMzCiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAgMjg4MDAsIDB4OTI5NjBiNzMKKzAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgICAyODgwMCwgMHgyMzY5ZDkwZgorMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgIDI4ODAwLCAweDFkNThkNTE4CiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAgMjg4MDAsIDB4MmIyOWI2ZWUKKzAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgICAyODgwMCwgMHhiZmJiOGI2NgorMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgIDI4ODAwLCAweDZiZjc1OWQ0CiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAgMjg4MDAsIDB4OGNjZjNhNjAKKzAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgICAyODgwMCwgMHg0YjFiNDYyMworMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgIDI4ODAwLCAweGMxZGE5ZmM2CiswLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICAgMjg4MDAsIDB4YjliYzFlZWQKKzAsICAgICAgICAgNzIsICAgICAgICAgNzIsICAgICAgICAxLCAgICAyODgwMCwgMHg1MGY3ZDFlYgorMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgIDI4ODAwLCAweGY4YzUzZjU5CiswLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICAgMjg4MDAsIDB4OTUwZTM1MTUKKzAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgICAyODgwMCwgMHhlNWRmZjQ1NworMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgIDI4ODAwLCAweDJkYzNhZDZhCiswLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICAgMjg4MDAsIDB4MDU1OWI2M2MKKzAsICAgICAgICAgNzgsICAgICAgICAgNzgsICAgICAgICAxLCAgICAyODgwMCwgMHhhNDc1YmY0NgorMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgIDI4ODAwLCAweDc4NjFiYmNmCiswLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAgMjg4MDAsIDB4M2U0YWM0NGMKKzAsICAgICAgICAgODEsICAgICAgICAgODEsICAgICAgICAxLCAgICAyODgwMCwgMHhmYjViOTlhMAorMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgIDI4ODAwLCAweDk5Mjk5NjQ4CiswLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAgMjg4MDAsIDB4Mzg0ZDQ4YWMKKzAsICAgICAgICAgODQsICAgICAgICAgODQsICAgICAgICAxLCAgICAyODgwMCwgMHhmMTdlMThmNworMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgIDI4ODAwLCAweGE5ZTAwZTNmCiswLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAgMjg4MDAsIDB4NWQxMTBiYjMKKzAsICAgICAgICAgODcsICAgICAgICAgODcsICAgICAgICAxLCAgICAyODgwMCwgMHgzMzdkM2UzMQorMCwgICAgICAgICA4OCwgICAgICAgICA4OCwgICAgICAgIDEsICAgIDI4ODAwLCAweGZlYTM3MzdiCiswLCAgICAgICAgIDg5LCAgICAgICAgIDg5LCAgICAgICAgMSwgICAgMjg4MDAsIDB4Y2U3ZDYwMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3J2MzAgYi90ZXN0cy9yZWYvZmF0ZS9ydjMwCmluZGV4IDcwZGI2NDcuLmM1NGFlZWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3J2MzAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvcnYzMApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAzMjc2OC85ODIwNTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMjY3MjAsIDB4Y2VmYWVjNDcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDEyNjcyMCwgMHhhNDE2ZWNlNQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTI2NzIwLCAweGE0MTZlY2U1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9ydjQwIGIvdGVzdHMvcmVmL2ZhdGUvcnY0MAppbmRleCA2MTU5ODU5Li45Y2JiODQ0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9ydjQwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3J2NDAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMzI3NjgvNzg1NjQ3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1NzZ4MzIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjc2NDgwLCAweDVmN2EwZDRmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyNzY0ODAsIDB4NWY3YTBkNGYKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDI3NjQ4MCwgMHg1ZjdhMGQ0ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2FubSBiL3Rlc3RzL3JlZi9mYXRlL3Nhbm0KaW5kZXggYTg4MjExOC4uN2E2NjkwZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc2FubQorKysgYi90ZXN0cy9yZWYvZmF0ZS9zYW5tCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA5MjE2MDAsIDB4MDAwMDAwMDAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDkyMTYwMCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgOTIxNjAwLCAweDAwMDAwMDAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zY3JlZW5wcmVzc28gYi90ZXN0cy9yZWYvZmF0ZS9zY3JlZW5wcmVzc28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZGZmYjQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc2NyZWVucHJlc3NvCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0jdGIgMDogMS8xNQotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNjkxMjAwLCAweGZkYmRmYWQ2Ci0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2OTEyMDAsIDB4YzVmZWI5NjEKLTAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDY5MTIwMCwgMHg0YzhjN2UyMwotMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgNjkxMjAwLCAweGQ5NWM4OWY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zY3JlZW5wcmVzc28tMTZiaXQgYi90ZXN0cy9yZWYvZmF0ZS9zY3JlZW5wcmVzc28tMTZiaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjMzNhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NjcmVlbnByZXNzby0xNmJpdApAQCAtMCwwICsxLDEzIEBACisjdGIgMDogMTAwLzIzOTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTM2MDAsIDB4NjlhMjM0ZGUKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MzYwMCwgMHg3ZjQzYWVlNQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTUzNjAwLCAweDgxMDMwNjM0CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxNTM2MDAsIDB4ZjU3MGQwZWYKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDE1MzYwMCwgMHgzODZlOGNlYworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTUzNjAwLCAweGJlNTNhZjhmCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxNTM2MDAsIDB4ZjkyZjQ4YmQKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDE1MzYwMCwgMHg1OTQ0NzJjNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2NyZWVucHJlc3NvLTI0Yml0IGIvdGVzdHMvcmVmL2ZhdGUvc2NyZWVucHJlc3NvLTI0Yml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTk1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zY3JlZW5wcmVzc28tMjRiaXQKQEAgLTAsMCArMSw5IEBACisjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDM2MAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDY5MTIwMCwgMHhmZGJkZmFkNgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNjkxMjAwLCAweGM1ZmViOTYxCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICA2OTEyMDAsIDB4NGM4YzdlMjMKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDY5MTIwMCwgMHhkOTVjODlmOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2NyZWVucHJlc3NvLTMyYml0IGIvdGVzdHMvcmVmL2ZhdGUvc2NyZWVucHJlc3NvLTMyYml0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMDZlYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zY3JlZW5wcmVzc28tMzJiaXQKQEAgLTAsMCArMSw5IEBACisjdGIgMDogMTAwLzIzOTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDcyMDAsIDB4YTAxZjI3Y2MKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNzIwMCwgMHg1ZDgzYzRkMAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzA3MjAwLCAweGI3ZDc5MTlmCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAzMDcyMDAsIDB4NGQyMDE0NTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NlZ21lbnQtYWR0cy10by1ta3YtaGVhZGVyLTAwMCBiL3Rlc3RzL3JlZi9mYXRlL3NlZ21lbnQtYWR0cy10by1ta3YtaGVhZGVyLTAwMApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTRhYTIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc2VnbWVudC1hZHRzLXRvLW1rdi1oZWFkZXItMDAwCkBAIC0wLDAgKzEsMjIgQEAKKyNleHRyYWRhdGEgMDogICAgICAgIDIsIDB4MDAzMDAwMWMKKyN0YiAwOiAxLzEwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogYWFjCisjc2FtcGxlX3JhdGUgMDogMTYwMDAKKyNjaGFubmVsX2xheW91dCAwOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiBtb25vCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICA2NCwgICAgICAgIDQsIDB4MDJmNzAxMTcKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgIDY0LCAgICAgIDE2MywgMHhkNWY4NTAwNworMCwgICAgICAgIDEyOCwgICAgICAgIDEyOCwgICAgICAgNjQsICAgICAgMTI3LCAweDY2NDg0MDY1CiswLCAgICAgICAgMTkyLCAgICAgICAgMTkyLCAgICAgICA2NCwgICAgICAgOTQsIDB4NTUyMjJiZDYKKzAsICAgICAgICAyNTYsICAgICAgICAyNTYsICAgICAgIDY0LCAgICAgIDMxNCwgMHgzYzdlOTIzYQorMCwgICAgICAgIDMyMCwgICAgICAgIDMyMCwgICAgICAgNjQsICAgICAgMjA3LCAweDFlZmM1ZDFiCiswLCAgICAgICAgMzg0LCAgICAgICAgMzg0LCAgICAgICA2NCwgICAgICAxMTksIDB4YjJhMTM2MDEKKzAsICAgICAgICA0NDgsICAgICAgICA0NDgsICAgICAgIDY0LCAgICAgIDE4NCwgMHhjYWZjNjA5MQorMCwgICAgICAgIDUxMiwgICAgICAgIDUxMiwgICAgICAgNjQsICAgICAgMTMyLCAweGRkZDMzYzBiCiswLCAgICAgICAgNTc2LCAgICAgICAgNTc2LCAgICAgICA2NCwgICAgICAxNTIsIDB4ODM5MzUwMzEKKzAsICAgICAgICA2NDAsICAgICAgICA2NDAsICAgICAgIDY0LCAgICAgIDIyNywgMHgzMmE4NmJjNAorMCwgICAgICAgIDcwNCwgICAgICAgIDcwNCwgICAgICAgNjQsICAgICAgMTIyLCAweGQwNGUzNTcxCiswLCAgICAgICAgNzY4LCAgICAgICAgNzY4LCAgICAgICA2NCwgICAgICAxNjMsIDB4NTdkNDRkMTYKKzAsICAgICAgICA4MzIsICAgICAgICA4MzIsICAgICAgIDY0LCAgICAgIDE0NywgMHgyMjYwNDNkNworMCwgICAgICAgIDg5NiwgICAgICAgIDg5NiwgICAgICAgNjQsICAgICAgMTE5LCAweDhhZDkzMWVkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zZWdtZW50LWFkdHMtdG8tbWt2LWhlYWRlci0wMDEgYi90ZXN0cy9yZWYvZmF0ZS9zZWdtZW50LWFkdHMtdG8tbWt2LWhlYWRlci0wMDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0NjY5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NlZ21lbnQtYWR0cy10by1ta3YtaGVhZGVyLTAwMQpAQCAtMCwwICsxLDIzIEBACisjZXh0cmFkYXRhIDA6ICAgICAgICAyLCAweDAwMzAwMDFjCisjdGIgMDogMS8xMDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IGFhYworI3NhbXBsZV9yYXRlIDA6IDE2MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgNjQsICAgICAgMTUzLCAweGJiNmU0MzJmCiswLCAgICAgICAgIDY0LCAgICAgICAgIDY0LCAgICAgICA2NCwgICAgICAxODUsIDB4YTAxZjRmZjMKKzAsICAgICAgICAxMjgsICAgICAgICAxMjgsICAgICAgIDY0LCAgICAgIDEyNiwgMHg4NTUwM2NlNgorMCwgICAgICAgIDE5MiwgICAgICAgIDE5MiwgICAgICAgNjQsICAgICAgMjQ2LCAweDY1MmM3YjU5CiswLCAgICAgICAgMjU2LCAgICAgICAgMjU2LCAgICAgICA2NCwgICAgICAxNjIsIDB4YzlmMDRkYTAKKzAsICAgICAgICAzMjAsICAgICAgICAzMjAsICAgICAgIDY0LCAgICAgIDEzNSwgMHg3MWZhM2JlMAorMCwgICAgICAgIDM4NCwgICAgICAgIDM4NCwgICAgICAgNjQsICAgICAgMjQ2LCAweDdhNmY3Nzg4CiswLCAgICAgICAgNDQ4LCAgICAgICAgNDQ4LCAgICAgICA2NCwgICAgICAyNjIsIDB4ZDMwOTc3ODEKKzAsICAgICAgICA1MTIsICAgICAgICA1MTIsICAgICAgIDY0LCAgICAgICA2MCwgMHgwOWExMThmNQorMCwgICAgICAgIDU3NiwgICAgICAgIDU3NiwgICAgICAgNjQsICAgICAgMjU1LCAweGJhYjU3OTNjCiswLCAgICAgICAgNjQwLCAgICAgICAgNjQwLCAgICAgICA2NCwgICAgICAxNTMsIDB4NmI2YTQ0ZmIKKzAsICAgICAgICA3MDQsICAgICAgICA3MDQsICAgICAgIDY0LCAgICAgIDE2MCwgMHg1NTBlNDUzMAorMCwgICAgICAgIDc2OCwgICAgICAgIDc2OCwgICAgICAgNjQsICAgICAgMjE1LCAweDdmZTY2MTQ0CiswLCAgICAgICAgODMyLCAgICAgICAgODMyLCAgICAgICA2NCwgICAgICAxNDQsIDB4Y2Q3MjNmN2QKKzAsICAgICAgICA4OTYsICAgICAgICA4OTYsICAgICAgIDY0LCAgICAgIDE4NywgMHgyYTBiNWMxYgorMCwgICAgICAgIDk2MCwgICAgICAgIDk2MCwgICAgICAgNjQsICAgICAgMTc3LCAweGI4YzM1NWQ1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zZWdtZW50LWFkdHMtdG8tbWt2LWhlYWRlci0wMDIgYi90ZXN0cy9yZWYvZmF0ZS9zZWdtZW50LWFkdHMtdG8tbWt2LWhlYWRlci0wMDIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZkZjgyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NlZ21lbnQtYWR0cy10by1ta3YtaGVhZGVyLTAwMgpAQCAtMCwwICsxLDEwIEBACisjZXh0cmFkYXRhIDA6ICAgICAgICAyLCAweDAwMzAwMDFjCisjdGIgMDogMS8xMDAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IGFhYworI3NhbXBsZV9yYXRlIDA6IDE2MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubworMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgNjQsICAgICAgMTU2LCAweDg2N2Q0ZjNhCiswLCAgICAgICAgIDY0LCAgICAgICAgIDY0LCAgICAgICA2NCwgICAgICAyMDEsIDB4NjI3NDVmZjkKKzAsICAgICAgICAxMjgsICAgICAgICAxMjgsICAgICAgIDY0LCAgICAgIDEzNywgMHg5MGM2MzllMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2VnbWVudC1hZHRzLXRvLW1rdi1oZWFkZXItYWxsIGIvdGVzdHMvcmVmL2ZhdGUvc2VnbWVudC1hZHRzLXRvLW1rdi1oZWFkZXItYWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNzhkMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zZWdtZW50LWFkdHMtdG8tbWt2LWhlYWRlci1hbGwKQEAgLTAsMCArMSw0MSBAQAorI2V4dHJhZGF0YSAwOiAgICAgICAgMiwgMHgwMDMwMDAxYworI3RiIDA6IDEvMTAwMAorI21lZGlhX3R5cGUgMDogYXVkaW8KKyNjb2RlY19pZCAwOiBhYWMKKyNzYW1wbGVfcmF0ZSAwOiAxNjAwMAorI2NoYW5uZWxfbGF5b3V0IDA6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDA6IG1vbm8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgIDY0LCAgICAgICAgNCwgMHgwMmY3MDExNworMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgNjQsICAgICAgMTYzLCAweGQ1Zjg1MDA3CiswLCAgICAgICAgMTI4LCAgICAgICAgMTI4LCAgICAgICA2NCwgICAgICAxMjcsIDB4NjY0ODQwNjUKKzAsICAgICAgICAxOTIsICAgICAgICAxOTIsICAgICAgIDY0LCAgICAgICA5NCwgMHg1NTIyMmJkNgorMCwgICAgICAgIDI1NiwgICAgICAgIDI1NiwgICAgICAgNjQsICAgICAgMzE0LCAweDNjN2U5MjNhCiswLCAgICAgICAgMzIwLCAgICAgICAgMzIwLCAgICAgICA2NCwgICAgICAyMDcsIDB4MWVmYzVkMWIKKzAsICAgICAgICAzODQsICAgICAgICAzODQsICAgICAgIDY0LCAgICAgIDExOSwgMHhiMmExMzYwMQorMCwgICAgICAgIDQ0OCwgICAgICAgIDQ0OCwgICAgICAgNjQsICAgICAgMTg0LCAweGNhZmM2MDkxCiswLCAgICAgICAgNTEyLCAgICAgICAgNTEyLCAgICAgICA2NCwgICAgICAxMzIsIDB4ZGRkMzNjMGIKKzAsICAgICAgICA1NzYsICAgICAgICA1NzYsICAgICAgIDY0LCAgICAgIDE1MiwgMHg4MzkzNTAzMQorMCwgICAgICAgIDY0MCwgICAgICAgIDY0MCwgICAgICAgNjQsICAgICAgMjI3LCAweDMyYTg2YmM0CiswLCAgICAgICAgNzA0LCAgICAgICAgNzA0LCAgICAgICA2NCwgICAgICAxMjIsIDB4ZDA0ZTM1NzEKKzAsICAgICAgICA3NjgsICAgICAgICA3NjgsICAgICAgIDY0LCAgICAgIDE2MywgMHg1N2Q0NGQxNgorMCwgICAgICAgIDgzMiwgICAgICAgIDgzMiwgICAgICAgNjQsICAgICAgMTQ3LCAweDIyNjA0M2Q3CiswLCAgICAgICAgODk2LCAgICAgICAgODk2LCAgICAgICA2NCwgICAgICAxMTksIDB4OGFkOTMxZWQKKzAsICAgICAgICA5NjAsICAgICAgICA5NjAsICAgICAgIDY0LCAgICAgIDE1MywgMHhiYjZlNDMyZgorMCwgICAgICAgMTAyNCwgICAgICAgMTAyNCwgICAgICAgNjQsICAgICAgMTg1LCAweGEwMWY0ZmYzCiswLCAgICAgICAxMDg4LCAgICAgICAxMDg4LCAgICAgICA2NCwgICAgICAxMjYsIDB4ODU1MDNjZTYKKzAsICAgICAgIDExNTIsICAgICAgIDExNTIsICAgICAgIDY0LCAgICAgIDI0NiwgMHg2NTJjN2I1OQorMCwgICAgICAgMTIxNiwgICAgICAgMTIxNiwgICAgICAgNjQsICAgICAgMTYyLCAweGM5ZjA0ZGEwCiswLCAgICAgICAxMjgwLCAgICAgICAxMjgwLCAgICAgICA2NCwgICAgICAxMzUsIDB4NzFmYTNiZTAKKzAsICAgICAgIDEzNDQsICAgICAgIDEzNDQsICAgICAgIDY0LCAgICAgIDI0NiwgMHg3YTZmNzc4OAorMCwgICAgICAgMTQwOCwgICAgICAgMTQwOCwgICAgICAgNjQsICAgICAgMjYyLCAweGQzMDk3NzgxCiswLCAgICAgICAxNDcyLCAgICAgICAxNDcyLCAgICAgICA2NCwgICAgICAgNjAsIDB4MDlhMTE4ZjUKKzAsICAgICAgIDE1MzYsICAgICAgIDE1MzYsICAgICAgIDY0LCAgICAgIDI1NSwgMHhiYWI1NzkzYworMCwgICAgICAgMTYwMCwgICAgICAgMTYwMCwgICAgICAgNjQsICAgICAgMTUzLCAweDZiNmE0NGZiCiswLCAgICAgICAxNjY0LCAgICAgICAxNjY0LCAgICAgICA2NCwgICAgICAxNjAsIDB4NTUwZTQ1MzAKKzAsICAgICAgIDE3MjgsICAgICAgIDE3MjgsICAgICAgIDY0LCAgICAgIDIxNSwgMHg3ZmU2NjE0NAorMCwgICAgICAgMTc5MiwgICAgICAgMTc5MiwgICAgICAgNjQsICAgICAgMTQ0LCAweGNkNzIzZjdkCiswLCAgICAgICAxODU2LCAgICAgICAxODU2LCAgICAgICA2NCwgICAgICAxODcsIDB4MmEwYjVjMWIKKzAsICAgICAgIDE5MjAsICAgICAgIDE5MjAsICAgICAgIDY0LCAgICAgIDE3NywgMHhiOGMzNTVkNQorMCwgICAgICAgMTk4NCwgICAgICAgMTk4NCwgICAgICAgNjQsICAgICAgMTU2LCAweDg2N2Q0ZjNhCiswLCAgICAgICAyMDQ4LCAgICAgICAyMDQ4LCAgICAgICA2NCwgICAgICAyMDEsIDB4NjI3NDVmZjkKKzAsICAgICAgIDIxMTIsICAgICAgIDIxMTIsICAgICAgIDY0LCAgICAgIDEzNywgMHg5MGM2MzllMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2VnbWVudC1tcDQtdG8tdHMgYi90ZXN0cy9yZWYvZmF0ZS9zZWdtZW50LW1wNC10by10cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWFjY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc2VnbWVudC1tcDQtdG8tdHMKQEAgLTAsMCArMSwxMzIgQEAKKyNleHRyYWRhdGEgMDogICAgICAgNTEsIDB4NWQxNDBkZjkKKyN0YiAwOiAxLzkwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IGgyNjQKKyNkaW1lbnNpb25zIDA6IDY0MHgzNjAKKyNzYXIgMDogMS8xCiswLCAgICAgIC03MjAwLCAgICAgICAgICAwLCAgICAgICAgMCwgICAgMjI2MzEsIDB4OWNlYzk1NDEsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgLTM2MDAsICAgICAgMTQ0MDAsICAgICAgICAwLCAgICAgNDAyMSwgMHhiZjdjZGIwMiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgICAgIDAsICAgICAgIDcyMDAsICAgICAgICAwLCAgICAgMTA5NiwgMHg0ZjE2MjY5MCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgIDM2MDAsICAgICAgIDM2MDAsICAgICAgICAwLCAgICAgIDY4NywgMHgwMDM5NGI5NSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgIDcyMDAsICAgICAgMTA4MDAsICAgICAgICAwLCAgICAgIDQ0NSwgMHgwOGMzZDA2NSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMTA4MDAsICAgICAgMjg4MDAsICAgICAgICAwLCAgICAgNDIxMiwgMHg1NmQxMmI4ZiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMTQ0MDAsICAgICAgMjE2MDAsICAgICAgICAwLCAgICAgMTExNywgMHhkNTIxMjYwYiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMTgwMDAsICAgICAgMTgwMDAsICAgICAgICAwLCAgICAgIDg5MiwgMHg0MjYyYmRiYywgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMjE2MDAsICAgICAgMjUyMDAsICAgICAgICAwLCAgICAgIDQ4MCwgMHgzYmUxZWYwYiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMjUyMDAsICAgICAgNDMyMDAsICAgICAgICAwLCAgICAgNDA2NSwgMHg0MGRlZTIzNywgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMjg4MDAsICAgICAgMzYwMDAsICAgICAgICAwLCAgICAgIDk2MiwgMHgzMWE0Y2ViMSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMzI0MDAsICAgICAgMzI0MDAsICAgICAgICAwLCAgICAgIDY1MSwgMHhiMmFhMzE3YSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMzYwMDAsICAgICAgMzk2MDAsICAgICAgICAwLCAgICAgIDU0MywgMHg5YzRlMDAyNCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgMzk2MDAsICAgICAgNTc2MDAsICAgICAgICAwLCAgICAgNDIyMSwgMHg3N2MyMzk3NywgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgNDMyMDAsICAgICAgNTA0MDAsICAgICAgICAwLCAgICAgMTA0MCwgMHg0ODJjZmEzNCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgNDY4MDAsICAgICAgNDY4MDAsICAgICAgICAwLCAgICAgIDU3NiwgMHgyNjg2MTM2YSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgNTA0MDAsICAgICAgNTQwMDAsICAgICAgICAwLCAgICAgIDYwNywgMHhjNTNjMjMzOSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgNTQwMDAsICAgICAgNzIwMDAsICAgICAgICAwLCAgICAgNDc1NSwgMHgyZjY0MmI1OCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgNTc2MDAsICAgICAgNjQ4MDAsICAgICAgICAwLCAgICAgMTE4MiwgMHhiZTFhNDg0NywgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgNjEyMDAsICAgICAgNjEyMDAsICAgICAgICAwLCAgICAgIDgwOSwgMHg4ZDk0OGE0ZSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgNjQ4MDAsICAgICAgNjg0MDAsICAgICAgICAwLCAgICAgIDY1NiwgMHg0ZmEwM2MyYiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAgNjg0MDAsICAgICAgODY0MDAsICAgICAgICAwLCAgICAyNjU1NSwgMHg1NjI5YjU4NCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgICA3MjAwMCwgICAgICA3OTIwMCwgICAgICAgIDAsICAgICAxMTQxLCAweDc2MWIzMWU4LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgICA3NTYwMCwgICAgICA3NTYwMCwgICAgICAgIDAsICAgICAgNzE3LCAweDU3NzQ2MzUxLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgICA3OTIwMCwgICAgICA4MjgwMCwgICAgICAgIDAsICAgICAgNjkzLCAweDc4YjI0MjYzLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgICA4MjgwMCwgICAgIDEwMDgwMCwgICAgICAgIDAsICAgICAzNDE3LCAweDU2MGRiYzg5LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgICA4NjQwMCwgICAgICA5MzYwMCwgICAgICAgIDAsICAgICAxMTI4LCAweGMwZjEzODNjLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgICA5MDAwMCwgICAgICA5MDAwMCwgICAgICAgIDAsICAgICAgNjUwLCAweGMzYWQ0ODVlLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgICA5MzYwMCwgICAgICA5NzIwMCwgICAgICAgIDAsICAgICAgNzY2LCAweGQzZTk3NTdkLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgICA5NzIwMCwgICAgIDExNTIwMCwgICAgIDM2MDAsICAgICA0MjY4LCAweGVjMTIzNWI1LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDEwMDgwMCwgICAgIDEwODAwMCwgICAgIDM2MDAsICAgICAxMTE5LCAweDY1ZjUxZmI3LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDEwNDQwMCwgICAgIDEwNDQwMCwgICAgIDM2MDAsICAgICAgNzY2LCAweDIxM2I3OGQzLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDEwODAwMCwgICAgIDExMTYwMCwgICAgIDM2MDAsICAgICAgNzcwLCAweGE3NTM3ZTZkLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDExMTYwMCwgICAgIDEyOTYwMCwgICAgIDM2MDAsICAgICA2MzQ5LCAweGVjMjI1Y2Y5LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDExNTIwMCwgICAgIDEyMjQwMCwgICAgIDM2MDAsICAgICAxMTg4LCAweDlkZWEzOTZjLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDExODgwMCwgICAgIDExODgwMCwgICAgIDM2MDAsICAgICAgODA1LCAweGRkOWU4OGQwLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDEyMjQwMCwgICAgIDEyNjAwMCwgICAgIDM2MDAsICAgICAgNzUyLCAweDFmOTM3MzBhLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDEyNjAwMCwgICAgIDE0NDAwMCwgICAgIDM2MDAsICAgICA1NTAyLCAweDUwMWJkYTVjLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDEyOTYwMCwgICAgIDEzNjgwMCwgICAgIDM2MDAsICAgICAxMjQwLCAweDdlMzY2MWVhLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDEzMzIwMCwgICAgIDEzMzIwMCwgICAgIDM2MDAsICAgICAgODMwLCAweGE4MjQ5ZjM4LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDEzNjgwMCwgICAgIDE0MDQwMCwgICAgIDM2MDAsICAgICAgNzU0LCAweGFiMWM4MTVlLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDE0MDQwMCwgICAgIDE1ODQwMCwgICAgIDM2MDAsICAgICA1MzI4LCAweGQyYzU1YWM2LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDE0NDAwMCwgICAgIDE1MTIwMCwgICAgIDM2MDAsICAgICAxMjcxLCAweDQ2MDA2ODcwLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDE0NzYwMCwgICAgIDE0NzYwMCwgICAgIDM2MDAsICAgICAgODQ5LCAweDk0ZGM5OWM3LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDE1MTIwMCwgICAgIDE1NDgwMCwgICAgIDM2MDAsICAgICAgNzUzLCAweGY0MjM2Y2FiLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDE1NDgwMCwgICAgIDE3MjgwMCwgICAgIDM2MDAsICAgIDI1ODI1LCAweGQ1NDY0ZGVlLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTU4NDAwLCAgICAgMTY1NjAwLCAgICAgMzYwMCwgICAgIDEyMDYsIDB4OGNlODQzNDQsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTYyMDAwLCAgICAgMTYyMDAwLCAgICAgMzYwMCwgICAgICA4NjcsIDB4MzEyZmEwN2QsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTY1NjAwLCAgICAgMTY5MjAwLCAgICAgMzYwMCwgICAgICA3MTksIDB4ODEwNjY2ZDEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTY5MjAwLCAgICAgMTg3MjAwLCAgICAgMzYwMCwgICAgIDM3ODYsIDB4YTk2YTY4MjUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTcyODAwLCAgICAgMTgwMDAwLCAgICAgMzYwMCwgICAgIDExODcsIDB4NzdlNjQ5YTIsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTc2NDAwLCAgICAgMTc2NDAwLCAgICAgMzYwMCwgICAgICA3NTAsIDB4ODZkYTZkMmUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTgwMDAwLCAgICAgMTgzNjAwLCAgICAgMzYwMCwgICAgICA4MTUsIDB4ZjA5YTk4ODEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTgzNjAwLCAgICAgMjAxNjAwLCAgICAgMzYwMCwgICAgIDUyNzUsIDB4ZWUzNDUwYmIsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTg3MjAwLCAgICAgMTk0NDAwLCAgICAgMzYwMCwgICAgIDEzNTIsIDB4MTUwYTk2ZTEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTkwODAwLCAgICAgMTkwODAwLCAgICAgMzYwMCwgICAgICA4NzcsIDB4NjA2MmExMjAsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTk0NDAwLCAgICAgMTk4MDAwLCAgICAgMzYwMCwgICAgICA4MjksIDB4NTE4MDk4OGMsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMTk4MDAwLCAgICAgMjE2MDAwLCAgICAgMzYwMCwgICAgIDQ0MjEsIDB4NjIzYWFkMzMsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjAxNjAwLCAgICAgMjA4ODAwLCAgICAgMzYwMCwgICAgIDE0NjQsIDB4ZDM0ZGM4NTEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjA1MjAwLCAgICAgMjA1MjAwLCAgICAgMzYwMCwgICAgICA5MDMsIDB4ZjYzYmJlZDAsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjA4ODAwLCAgICAgMjEyNDAwLCAgICAgMzYwMCwgICAgICA3MTcsIDB4YzE3MDU0YjgsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjEyNDAwLCAgICAgMjMwNDAwLCAgICAgMzYwMCwgICAgIDQ3ODcsIDB4NzVlOTQwMGUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjE2MDAwLCAgICAgMjIzMjAwLCAgICAgMzYwMCwgICAgIDE0MzUsIDB4YjAxY2NhYmIsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjE5NjAwLCAgICAgMjE5NjAwLCAgICAgMzYwMCwgICAgICA4NTEsIDB4NTRiZGEyOTEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjIzMjAwLCAgICAgMjI2ODAwLCAgICAgMzYwMCwgICAgICA4MDksIDB4ODRlMzdmZWUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjI2ODAwLCAgICAgMjQ0ODAwLCAgICAgMzYwMCwgICAgIDQ1NDEsIDB4ZDRlNWMwZGUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjMwNDAwLCAgICAgMjM3NjAwLCAgICAgMzYwMCwgICAgIDE1NDUsIDB4MDA5OWZjOTgsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjM0MDAwLCAgICAgMjM0MDAwLCAgICAgMzYwMCwgICAgICA5MjksIDB4ZmQ3MmQwNDksIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjM3NjAwLCAgICAgMjQxMjAwLCAgICAgMzYwMCwgICAgICA4MjksIDB4Y2ZkYTllOTYsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgMjQxMjAwLCAgICAgMjU5MjAwLCAgICAgMzYwMCwgICAgMjQyMjAsIDB4NWNhMjFkNzEsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNDQ4MDAsICAgICAyNTIwMDAsICAgICAzNjAwLCAgICAgMTQyMiwgMHhjZGU2Y2MzNCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNDg0MDAsICAgICAyNDg0MDAsICAgICAzNjAwLCAgICAgIDg4MywgMHhlZGFjYmUyNSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNTIwMDAsICAgICAyNTU2MDAsICAgICAzNjAwLCAgICAgIDc2OCwgMHg4OWQ3NzRiYywgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNTU2MDAsICAgICAyNzM2MDAsICAgICAzNjAwLCAgICAgMzgwMiwgMHhlYTFkNzBkNCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNTkyMDAsICAgICAyNjY0MDAsICAgICAzNjAwLCAgICAgMTI4NCwgMHgyYzkyNzA5NywgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNjI4MDAsICAgICAyNjI4MDAsICAgICAzNjAwLCAgICAgIDc0NSwgMHg4MTA3NmE3ZiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNjY0MDAsICAgICAyNzAwMDAsICAgICAzNjAwLCAgICAgIDkzMSwgMHgzNjc1ZGJmZSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNzAwMDAsICAgICAyODgwMDAsICAgICAzNjAwLCAgICAgNDgzMCwgMHg3YTgwN2E2OCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNzM2MDAsICAgICAyODA4MDAsICAgICAzNjAwLCAgICAgMTQ0NiwgMHg2MjI0YmM4MSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyNzcyMDAsICAgICAyNzcyMDAsICAgICAzNjAwLCAgICAgIDgzMywgMHg1NmY3OGFlMiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyODA4MDAsICAgICAyODQ0MDAsICAgICAzNjAwLCAgICAgIDg3MywgMHg5Y2FlYWYwMCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyODQ0MDAsICAgICAzMDI0MDAsICAgICAzNjAwLCAgICAgNTE2NywgMHgxNzAzMTUxZiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyODgwMDAsICAgICAyOTUyMDAsICAgICAzNjAwLCAgICAgMTQ0OSwgMHgwODgxYjBkNiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyOTE2MDAsICAgICAyOTE2MDAsICAgICAzNjAwLCAgICAgIDg2NiwgMHgwYmZmYTcxOSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyOTUyMDAsICAgICAyOTg4MDAsICAgICAzNjAwLCAgICAgIDg3NCwgMHhjMjQzYTY1ZiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAyOTg4MDAsICAgICAzMTY4MDAsICAgICAzNjAwLCAgICAgNTQyNiwgMHg3Yzg5OWMzMCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAzMDI0MDAsICAgICAzMDk2MDAsICAgICAzNjAwLCAgICAgMTU3NCwgMHgwM2IwMGYwZCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAzMDYwMDAsICAgICAzMDYwMDAsICAgICAzNjAwLCAgICAgIDg2MCwgMHg2NWNlYTc0ZSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAzMDk2MDAsICAgICAzMTMyMDAsICAgICAzNjAwLCAgICAgIDgyOSwgMHhmZmQ3OTVjZCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAzMTMyMDAsICAgICAzMzEyMDAsICAgICAzNjAwLCAgICAgNTM1MiwgMHg1OTk5Nzk5NiwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAzMTY4MDAsICAgICAzMjQwMDAsICAgICAzNjAwLCAgICAgMTUwMSwgMHhiM2I4ZjAwMSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAzMjA0MDAsICAgICAzMjA0MDAsICAgICAzNjAwLCAgICAgIDk0MSwgMHg5MmIwY2IxOCwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAzMjQwMDAsICAgICAzMjc2MDAsICAgICAzNjAwLCAgICAgIDgyMywgMHgzZDU0ODM1NSwgRj0weDAsIFM9MSwgICAgICAgIDEsIDB4MDBlMDAwZTAKKzAsICAgICAzMjc2MDAsICAgICAzNDU2MDAsICAgICAzNjAwLCAgICAyNDA0MiwgMHg0NDFlOTRmYiwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDMzMTIwMCwgICAgIDMzODQwMCwgICAgIDM2MDAsICAgICAxNTgyLCAweDRmNWQxMDQ5LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDMzNDgwMCwgICAgIDMzNDgwMCwgICAgIDM2MDAsICAgICAgOTQ1LCAweDRmM2NjOWU4LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDMzODQwMCwgICAgIDM0MjAwMCwgICAgIDM2MDAsICAgICAgODE1LCAweDBjYTc5MGE0LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM0MjAwMCwgICAgIDM2MDAwMCwgICAgIDM2MDAsICAgICA0NDI1LCAweDFkYjJhMDg4LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM0NTYwMCwgICAgIDM1MjgwMCwgICAgIDM2MDAsICAgICAxNDkyLCAweDg4MWNlNzk4LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM0OTIwMCwgICAgIDM0OTIwMCwgICAgIDM2MDAsICAgICAgOTA1LCAweGJkZDljMjc4LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM1MjgwMCwgICAgIDM1NjQwMCwgICAgIDM2MDAsICAgICAgODcwLCAweDY0ZmJiMGUxLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM1NjQwMCwgICAgIDM3NDQwMCwgICAgIDM2MDAsICAgICA1MTk0LCAweDEzOGIxZTFkLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM2MDAwMCwgICAgIDM2NzIwMCwgICAgIDM2MDAsICAgICAxNDgzLCAweGM1YzlkNzE3LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM2MzYwMCwgICAgIDM2MzYwMCwgICAgIDM2MDAsICAgICAgOTc3LCAweDM2NDhkOWZjLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM2NzIwMCwgICAgIDM3MDgwMCwgICAgIDM2MDAsICAgICAgODM0LCAweDZjNWQ4OTY5LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM3MDgwMCwgICAgIDM4ODgwMCwgICAgIDM2MDAsICAgICA2OTU2LCAweDZhNTQ4ZTBiLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM3NDQwMCwgICAgIDM4MTYwMCwgICAgIDM2MDAsICAgICAxMTg3LCAweDc5NWY0MTYzLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM3ODAwMCwgICAgIDM3ODAwMCwgICAgIDM2MDAsICAgICAgOTI1LCAweDkyYmZjMmZiLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM4MTYwMCwgICAgIDM4NTIwMCwgICAgIDM2MDAsICAgICAgNzQ3LCAweGVhOTk3OGZjLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM4NTIwMCwgICAgIDQwMzIwMCwgICAgIDM2MDAsICAgICA1MDA1LCAweGM1NThjMTg5LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM4ODgwMCwgICAgIDM5NjAwMCwgICAgIDM2MDAsICAgICAgNDUyLCAweDdkOTJkOWQ4LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM5MjQwMCwgICAgIDM5MjQwMCwgICAgIDM2MDAsICAgICAgNzg0LCAweGZkNTk3YTVmLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM5NjAwMCwgICAgIDM5OTYwMCwgICAgIDM2MDAsICAgICAgMTk5LCAweDc5YjA2MzU1LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDM5OTYwMCwgICAgIDQxNzYwMCwgICAgIDM2MDAsICAgICAxODYyLCAweDIyYTJhMDZjLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDQwMzIwMCwgICAgIDQxMDQwMCwgICAgIDM2MDAsICAgICAgMzU5LCAweDExYmRhZTUyLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDQwNjgwMCwgICAgIDQwNjgwMCwgICAgIDM2MDAsICAgICAgMjM1LCAweGJlYzI2OTY0LCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDQxMDQwMCwgICAgIDQxNDAwMCwgICAgIDM2MDAsICAgICAgMjIxLCAweDgzODA2ODJjLCBGPTB4MCwgUz0xLCAgICAgICAgMSwgMHgwMGUwMDBlMAorMCwgICAgIDQxNDAwMCwgICAgIDQzMjAwMCwgICAgIDM2MDAsICAgIDIyNTg4LCAweGYwZWNmMDcyLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgNDE3NjAwLCAgICAgNDI0ODAwLCAgICAgMzYwMCwgICAgICAzODMsIDB4NGYzYmI1NzEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgNDIxMjAwLCAgICAgNDIxMjAwLCAgICAgMzYwMCwgICAgICAyNTcsIDB4MjJlODc4MDIsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgNDI0ODAwLCAgICAgNDI4NDAwLCAgICAgMzYwMCwgICAgICAyNjEsIDB4ZGI5ODgxMzQsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgNDI4NDAwLCAgICAgNDM1NjAwLCAgICAgMzYwMCwgICAgICAxNTYsIDB4ZDJjMzQwNmMsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgNDMyMDAwLCAgICAgNDM5MjAwLCAgICAgMzYwMCwgICAgICAzMzAsIDB4MTUwZDliNjAsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgNDM1NjAwLCAgICAgNDQ2NDAwLCAgICAgMzYwMCwgICAgICAzMjQsIDB4NTU4MTk0ZWUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgNDM5MjAwLCAgICAgNDQyODAwLCAgICAgMzYwMCwgICAgICAxOTEsIDB4MTA4ZTU0ZDEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgNDQyODAwLCAgICAgNDUwMDAwLCAgICAgMzYwMCwgICAgICAyMzMsIDB4YWM1YjY0ODYsIEY9MHgwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTE2IGIvdGVzdHMvcmVmL2ZhdGUvc2dpLWdyYXkxNgppbmRleCAwOTA4NzQ2Li44ZGJhMGY0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTE2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1ncmF5MTYKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTEyeDI1NgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI2MjE0NCwgMHg2YzI3ZjA4NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2dpLWdyYXkxNi1ybGUgYi90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTE2LXJsZQppbmRleCAwOTkwM2Q1Li40NzI4MzVhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTE2LXJsZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTE2LXJsZQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MTJ4MjU2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjYyMTQ0LCAweDY1ZWY1N2ZmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTggYi90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTgKaW5kZXggYjBlMDYwNi4uNTVjMTJkYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc2dpLWdyYXk4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1ncmF5OApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MTJ4MjU2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTMxMDcyLCAweGIwNzAyYTk0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTgtcmxlIGIvdGVzdHMvcmVmL2ZhdGUvc2dpLWdyYXk4LXJsZQppbmRleCBiMGUwNjA2Li41NWMxMmRjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktZ3JheTgtcmxlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1ncmF5OC1ybGUKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTEyeDI1NgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDEzMTA3MiwgMHhiMDcwMmE5NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2dpLXJnYjI0IGIvdGVzdHMvcmVmL2ZhdGUvc2dpLXJnYjI0CmluZGV4IDMwYWNhMWMuLjQzMjZjYWIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2IyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zZ2ktcmdiMjQKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTEyeDI1NgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDM5MzIxNiwgMHhhOWIyOGZkOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2dpLXJnYjI0LXJsZSBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2IyNC1ybGUKaW5kZXggMTEyOGRlNS4uZDIxYmRlMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc2dpLXJnYjI0LXJsZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9zZ2ktcmdiMjQtcmxlCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMngyNTYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzOTMyMTYsIDB4ZTk2ZTFkZTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2I0OCBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2I0OAppbmRleCA4ZjNjYTUwLi4yOWZlMzAyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktcmdiNDgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc2dpLXJnYjQ4CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMngyNTYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA3ODY0MzIsIDB4ZWU0YWE2NjcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2I0OC1ybGUgYi90ZXN0cy9yZWYvZmF0ZS9zZ2ktcmdiNDgtcmxlCmluZGV4IDJjZjAyNTkuLjQ5ZmM5NzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2I0OC1ybGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc2dpLXJnYjQ4LXJsZQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MTJ4MjU2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNzg2NDMyLCAweGJjNzQzYmM0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktcmdiYSBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhCmluZGV4IDA1OGY1ZjkuLjZhMmQxNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMngyNTYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MjQyODgsIDB4NGVlNWFkYmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhLXJsZSBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhLXJsZQppbmRleCAwNThmNWY5Li42YTJkMTc2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktcmdiYS1ybGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc2dpLXJnYmEtcmxlCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMngyNTYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MjQyODgsIDB4NGVlNWFkYmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhNjQgYi90ZXN0cy9yZWYvZmF0ZS9zZ2ktcmdiYTY0CmluZGV4IGY0ZTkzOWUuLjAwMTgxZGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhNjQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc2dpLXJnYmE2NApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MTJ4MjU2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMDQ4NTc2LCAweGM2NTdlMjJiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zZ2ktcmdiYTY0LXJsZSBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhNjQtcmxlCmluZGV4IGNkZjVmZDAuLjM1NGQzOTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhNjQtcmxlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NnaS1yZ2JhNjQtcmxlCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMngyNTYKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDEwNDg1NzYsIDB4YjYxOWQwZjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NpZXJyYS12bWQtYXVkaW8gYi90ZXN0cy9yZWYvZmF0ZS9zaWVycmEtdm1kLWF1ZGlvCmluZGV4IDEzZDM1NjcuLjljMGU2YjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NpZXJyYS12bWQtYXVkaW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvc2llcnJhLXZtZC1hdWRpbwpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzIyMDUwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgNjE3NDAsICAgMTIzNDgwLCAweDNhNzk0YzEzCiAwLCAgICAgIDYxNzQwLCAgICAgIDYxNzQwLCAgICAgMjIwNSwgICAgIDQ0MTAsIDB4MTA5ZDA0ZTAKIDAsICAgICAgNjM5NDUsICAgICAgNjM5NDUsICAgICAyMjA1LCAgICAgNDQxMCwgMHgyMjRkMjQ0ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc2llcnJhLXZtZC12aWRlbyBiL3Rlc3RzL3JlZi9mYXRlL3NpZXJyYS12bWQtdmlkZW8KaW5kZXggNjY4ZmFlZS4uYjFiMjJlMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc2llcnJhLXZtZC12aWRlbworKysgYi90ZXN0cy9yZWYvZmF0ZS9zaWVycmEtdm1kLXZpZGVvCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4NTRiNGJmZTIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMDQwMCwgMHg5ZTE0NjBlMwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMwNDAwLCAweDgxMzZmMjFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zaWZmLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvc2lmZi1kZW11eAppbmRleCA2OTJlNTA0Li5mOGU5ODk3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zaWZmLWRlbXV4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NpZmYtZGVtdXgKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDEvMTIKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdmIKKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAjdGIgMTogMS8yMjA1MAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fdTgKKyNzYW1wbGVfcmF0ZSAxOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNTE1MiwgMHgxNGZjMGYxZgogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgMjIwNTAsICAgIDIyMDUwLCAweGE3ZDYwZDI3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMTUzNDQsIDB4MzE2MTRiZDcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NtYWNrZXItYXVkaW8gYi90ZXN0cy9yZWYvZmF0ZS9zbWFja2VyLWF1ZGlvCmluZGV4IDQ0MmY0NzkuLjZiODY3ODcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NtYWNrZXItYXVkaW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvc21hY2tlci1hdWRpbwpAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzIyMDUwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDA6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgMjM2MjAsICAgIDQ3MjQwLCAweDk5NzQ4OTdjCiAwLCAgICAgIDIzNjIwLCAgICAgIDIzNjIwLCAgICAgMTU2NCwgICAgIDMxMjgsIDB4N2U0MDY0YjQKIDAsICAgICAgMjUxODQsICAgICAgMjUxODQsICAgICAxNTY0LCAgICAgMzEyOCwgMHg4MDg4MzMwMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc21hY2tlci12aWRlbyBiL3Rlc3RzL3JlZi9mYXRlL3NtYWNrZXItdmlkZW8KaW5kZXggOGJkMzA3MS4uOTMyNWQ5MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc21hY2tlci12aWRlbworKysgYi90ZXN0cy9yZWYvZmF0ZS9zbWFja2VyLXZpZGVvCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDcxLzEwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyMDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTIwMDAsIDB4ODkyNmQ3ZmMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5MjAwMCwgMHgyNTA2ZDM4NAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTkyMDAwLCAweDlhOGRjOTNhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zbWMgYi90ZXN0cy9yZWYvZmF0ZS9zbWMKaW5kZXggMTYzNWIzNy4uNDgwMjQwNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc21jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NtYwpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweGY4MTRmYzkwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4ZTFiMTMxMzcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIzMDQwMCwgMHhhN2Y0ZDQwOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc21qcGVnLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvc21qcGVnLWRlbXV4CmluZGV4IDYzN2YyOGMuLjA0MmY5ZmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NtanBlZy1kZW11eAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zbWpwZWctZGVtdXgKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBtanBlZworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKICN0YiAxOiAxLzEwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogYWRwY21faW1hX3NtanBlZworI3NhbXBsZV9yYXRlIDE6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMTogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDAsICAgICAgNzM0LCAweDVhMDQyYzJjCiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAyMywgICAgICAyNjAsIDB4MDAwMDAwMDAKIDEsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgIDIzLCAgICAgIDI2MCwgMHgwMDAwMDAwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc212anBlZyBiL3Rlc3RzL3JlZi9mYXRlL3NtdmpwZWcKaW5kZXggMWEwMTJjZC4uMzYwZmFkNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc212anBlZworKysgYi90ZXN0cy9yZWYvZmF0ZS9zbXZqcGVnCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDE2MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzMDcyMCwgMHgzYTgyMTgwNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDMwNzIwLCAweDk1MTY4ZTVkCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzA3MjAsIDB4ZDRkOThlNDUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NvdXJjZSBiL3Rlc3RzL3JlZi9mYXRlL3NvdXJjZQppbmRleCBlYzBhOThlLi44MDljNDYzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zb3VyY2UKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc291cmNlCkBAIC0xLDEzICsxLDEyIEBACiBGaWxlcyB3aXRob3V0IHN0YW5kYXJkIGxpY2Vuc2UgaGVhZGVyczoKLWNtZHV0aWxzX2NvbW1vbl9vcHRzLmgKIGNvbXBhdC9hdmlzeW50aC93aW5kb3dzUG9ydHMvYmFzaWNEYXRhVHlwZUNvbnZlcnNpb25zLmgKIGNvbXBhdC9hdmlzeW50aC93aW5kb3dzUG9ydHMvd2luZG93czJsaW51eC5oCiBsaWJhdmNvZGVjL2ZpbGVfb3Blbi5jCiBsaWJhdmNvZGVjL2ludGVycGxheWFjbS5jCiBsaWJhdmNvZGVjL2xvZzJfdGFiLmMKLWxpYmF2Y29kZWMvbWF0aG9wcy5jCiBsaWJhdmNvZGVjL3JldmVyc2UuYwogbGliYXZkZXZpY2UvZmlsZV9vcGVuLmMKK2xpYmF2ZGV2aWNlL3JldmVyc2UuYwogbGliYXZmaWx0ZXIvbG9nMl90YWIuYwogbGliYXZmb3JtYXQvZmlsZV9vcGVuLmMKIGxpYmF2Zm9ybWF0L2dvbG9tYl90YWIuYwpAQCAtMTcsNyArMTYsNiBAQAogdG9vbHMvdW5jb2RlZF9mcmFtZS5jCiB0b29scy95dXZjbXAuYwogSGVhZGVycyB3aXRob3V0IHN0YW5kYXJkIGluY2x1c2lvbiBndWFyZHM6Ci1jbWR1dGlsc19jb21tb25fb3B0cy5oCiBjb21wYXQvYXZpc3ludGgvYXZpc3ludGhfYy5oCiBjb21wYXQvYXZpc3ludGgvYXZzL2NhcGkuaAogY29tcGF0L2F2aXN5bnRoL2F2cy9jb25maWcuaApAQCAtMjUsNSArMjMsOCBAQAogY29tcGF0L2F2aXN5bnRoL2F2eHN5bnRoX2MuaAogY29tcGF0L2F2aXN5bnRoL3dpbmRvd3NQb3J0cy9iYXNpY0RhdGFUeXBlQ29udmVyc2lvbnMuaAogY29tcGF0L2F2aXN5bnRoL3dpbmRvd3NQb3J0cy93aW5kb3dzMmxpbnV4LmgKK2NvbXBhdC9jdWRhL2R5bmxpbmtfbG9hZGVyLmgKIGNvbXBhdC9mbG9hdC9mbG9hdC5oCiBjb21wYXQvZmxvYXQvbGltaXRzLmgKK1VzZSBvZiBhdl9jbGlwKCkgd2hlcmUgYXZfY2xpcF91aW50cDIoKSBjb3VsZCBiZSB1c2VkOgorVXNlIG9mIGF2X2NsaXAoKSB3aGVyZSBhdl9jbGlwX2ludHAyKCkgY291bGQgYmUgdXNlZDoKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NwNXggYi90ZXN0cy9yZWYvZmF0ZS9zcDV4CmluZGV4IDk4NmMxMTEuLjJjYTc5ODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3NwNXgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc3A1eApAQCAtMSw1ICsxLDE0IEBACiAjdGIgMDogNTEzLzUwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAjdGIgMTogMS84MDAwCisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDE6IDgwMDAKKyNjaGFubmVsX2xheW91dCAxOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGViY2I3ZjgKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxMDI0LCAgICAgMjA0OCwgMHgzNjZlZTcxYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDFmYThlNjczCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zcGVlZGhxLTQyMiBiL3Rlc3RzL3JlZi9mYXRlL3NwZWVkaHEtNDIyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjBkMjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zcGVlZGhxLTQyMgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMTJ4NjQKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTQzMzYsIDB4OWJiNmRjNmQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3NwZWVkaHEtNDIyLXNpbmdsZWZpZWxkIGIvdGVzdHMvcmVmL2ZhdGUvc3BlZWRocS00MjItc2luZ2xlZmllbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzYzUyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3NwZWVkaHEtNDIyLXNpbmdsZWZpZWxkCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDExMngzMgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgNzE2OCwgMHg3NWRlNDEwOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3ViLWNjIGIvdGVzdHMvcmVmL2ZhdGUvc3ViLWNjCmluZGV4IDBkNWJjNzcuLjRjYzAyZDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3N1Yi1jYworKysgYi90ZXN0cy9yZWYvZmF0ZS9zdWItY2MKQEAgLTEwLDUgKzEwLDUgQEAKIA0KIFtFdmVudHNdDQogRm9ybWF0OiBMYXllciwgU3RhcnQsIEVuZCwgU3R5bGUsIE5hbWUsIE1hcmdpbkwsIE1hcmdpblIsIE1hcmdpblYsIEVmZmVjdCwgVGV4dA0KLURpYWxvZ3VlOiAwLDA6MDA6MTIuMzYsMDowMDo0MC44MyxEZWZhdWx0LCwwLDAsMCwsKHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKQ0KLURpYWxvZ3VlOiAwLDA6MDA6NDAuODMsMDowMDo1OS4wNyxEZWZhdWx0LCwwLDAsMCwsKHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKVxOPj4gU2FmZXR5IHJlbWFpbnMgb3VyIG51bWJlciBvbmUNCitEaWFsb2d1ZTogMCwwOjAwOjEyLjM2LDA6MDA6NDAuODMsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDQ0KX0oe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApDQorRGlhbG9ndWU6IDAsMDowMDo0MC44MywwOjAwOjU5LjA3LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyOCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKVxOe1xhbjd9e1xwb3MoMzgsNDQpfT4+IFNhZmV0eSByZW1haW5zIG91ciBudW1iZXIgb25lDQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3ViLWNjLXJlYWx0aW1lIGIvdGVzdHMvcmVmL2ZhdGUvc3ViLWNjLXJlYWx0aW1lCmluZGV4IGM5ZTZiNmMuLmJlODAwYTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3N1Yi1jYy1yZWFsdGltZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9zdWItY2MtcmVhbHRpbWUKQEAgLTEwLDMzICsxMCwzMyBAQAogDQogW0V2ZW50c10NCiBGb3JtYXQ6IExheWVyLCBTdGFydCwgRW5kLCBTdHlsZSwgTmFtZSwgTWFyZ2luTCwgTWFyZ2luUiwgTWFyZ2luViwgRWZmZWN0LCBUZXh0DQotRGlhbG9ndWU6IDAsMDowMDoxNC4xNCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoDQotRGlhbG9ndWU6IDAsMDowMDoxNS40Nyw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW4NCi1EaWFsb2d1ZTogMCwwOjAwOjE1LjkyLDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1DQotRGlhbG9ndWU6IDAsMDowMDoxNi4zNiw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpDQotRGlhbG9ndWU6IDAsMDowMDoxNi44MSw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmwNCi1EaWFsb2d1ZTogMCwwOjAwOjE3LjI1LDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgDQotRGlhbG9ndWU6IDAsMDowMDoxNy43MCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhDQotRGlhbG9ndWU6IDAsMDowMDoxOC4xNCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGkNCi1EaWFsb2d1ZTogMCwwOjAwOjE4LjU5LDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gDQotRGlhbG9ndWU6IDAsMDowMDoxOS4wMyw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoDQotRGlhbG9ndWU6IDAsMDowMDoxOS40OCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXQNCi1EaWFsb2d1ZTogMCwwOjAwOjE5LjkyLDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlDQotRGlhbG9ndWU6IDAsMDowMDoyMC4zNiw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXINCi1EaWFsb2d1ZTogMCwwOjAwOjIxLjcwLDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9ICkNCi1EaWFsb2d1ZTogMCwwOjAwOjQyLjYxLDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTj4+DQotRGlhbG9ndWU6IDAsMDowMDo0My4wNSw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTDQotRGlhbG9ndWU6IDAsMDowMDo0My41MCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWYNCi1EaWFsb2d1ZTogMCwwOjAwOjQzLjk0LDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTj4+IFNhZmV0DQotRGlhbG9ndWU6IDAsMDowMDo0NC4zOSw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWZldHkgDQotRGlhbG9ndWU6IDAsMDowMDo0NC44Myw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWZldHkgcmUNCi1EaWFsb2d1ZTogMCwwOjAwOjQ1LjI4LDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTj4+IFNhZmV0eSByZW1hDQotRGlhbG9ndWU6IDAsMDowMDo0NS43Miw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWZldHkgcmVtYWluDQotRGlhbG9ndWU6IDAsMDowMDo0Ni4xNyw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWZldHkgcmVtYWlucyANCi1EaWFsb2d1ZTogMCwwOjAwOjQ2LjYxLDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTj4+IFNhZmV0eSByZW1haW5zIG91DQotRGlhbG9ndWU6IDAsMDowMDo0Ny4wNiw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWZldHkgcmVtYWlucyBvdXIgDQotRGlhbG9ndWU6IDAsMDowMDo0Ny41MCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWZldHkgcmVtYWlucyBvdXIgbnUNCi1EaWFsb2d1ZTogMCwwOjAwOjQ3Ljk1LDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTj4+IFNhZmV0eSByZW1haW5zIG91ciBudW1iDQotRGlhbG9ndWU6IDAsMDowMDo0OC4zOSw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWZldHkgcmVtYWlucyBvdXIgbnVtYmVyDQotRGlhbG9ndWU6IDAsMDowMDo0OC44NCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCwoe1xpMX0gaW5hdWRpYmxlIHJhZGlvIGNoYXR0ZXJ7XGkwfSApXE4+PiBTYWZldHkgcmVtYWlucyBvdXIgbnVtYmVyIG8NCi1EaWFsb2d1ZTogMCwwOjAwOjQ5LjI4LDk6NTk6NTkuOTksRGVmYXVsdCwsMCwwLDAsLCh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTj4+IFNhZmV0eSByZW1haW5zIG91ciBudW1iZXIgb25lDQorRGlhbG9ndWU6IDAsMDowMDoxNC4xNCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCw0NCl9KA0KK0RpYWxvZ3VlOiAwLDA6MDA6MTUuNDcsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsNDQpfSh7XGkxfSBpbg0KK0RpYWxvZ3VlOiAwLDA6MDA6MTUuOTIsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsNDQpfSh7XGkxfSBpbmF1DQorRGlhbG9ndWU6IDAsMDowMDoxNi4zNiw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCw0NCl9KHtcaTF9IGluYXVkaQ0KK0RpYWxvZ3VlOiAwLDA6MDA6MTYuODEsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsNDQpfSh7XGkxfSBpbmF1ZGlibA0KK0RpYWxvZ3VlOiAwLDA6MDA6MTcuMjUsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsNDQpfSh7XGkxfSBpbmF1ZGlibGUgDQorRGlhbG9ndWU6IDAsMDowMDoxNy43MCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCw0NCl9KHtcaTF9IGluYXVkaWJsZSByYQ0KK0RpYWxvZ3VlOiAwLDA6MDA6MTguMTQsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsNDQpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaQ0KK0RpYWxvZ3VlOiAwLDA6MDA6MTguNTksOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsNDQpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gDQorRGlhbG9ndWU6IDAsMDowMDoxOS4wMyw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCw0NCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaA0KK0RpYWxvZ3VlOiAwLDA6MDA6MTkuNDgsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsNDQpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdA0KK0RpYWxvZ3VlOiAwLDA6MDA6MTkuOTIsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsNDQpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlDQorRGlhbG9ndWU6IDAsMDowMDoyMC4zNiw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCw0NCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVyDQorRGlhbG9ndWU6IDAsMDowMDoyMS43MCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCw0NCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKQ0KK0RpYWxvZ3VlOiAwLDA6MDA6NDIuNjEsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+Pg0KK0RpYWxvZ3VlOiAwLDA6MDA6NDMuMDUsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTDQorRGlhbG9ndWU6IDAsMDowMDo0My41MCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyOCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKVxOe1xhbjd9e1xwb3MoMzgsNDQpfT4+IFNhZg0KK0RpYWxvZ3VlOiAwLDA6MDA6NDMuOTQsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldA0KK0RpYWxvZ3VlOiAwLDA6MDA6NDQuMzksOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldHkgDQorRGlhbG9ndWU6IDAsMDowMDo0NC44Myw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyOCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKVxOe1xhbjd9e1xwb3MoMzgsNDQpfT4+IFNhZmV0eSByZQ0KK0RpYWxvZ3VlOiAwLDA6MDA6NDUuMjgsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldHkgcmVtYQ0KK0RpYWxvZ3VlOiAwLDA6MDA6NDUuNzIsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldHkgcmVtYWluDQorRGlhbG9ndWU6IDAsMDowMDo0Ni4xNyw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyOCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKVxOe1xhbjd9e1xwb3MoMzgsNDQpfT4+IFNhZmV0eSByZW1haW5zIA0KK0RpYWxvZ3VlOiAwLDA6MDA6NDYuNjEsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldHkgcmVtYWlucyBvdQ0KK0RpYWxvZ3VlOiAwLDA6MDA6NDcuMDYsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldHkgcmVtYWlucyBvdXIgDQorRGlhbG9ndWU6IDAsMDowMDo0Ny41MCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyOCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKVxOe1xhbjd9e1xwb3MoMzgsNDQpfT4+IFNhZmV0eSByZW1haW5zIG91ciBudQ0KK0RpYWxvZ3VlOiAwLDA6MDA6NDcuOTUsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldHkgcmVtYWlucyBvdXIgbnVtYg0KK0RpYWxvZ3VlOiAwLDA6MDA6NDguMzksOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldHkgcmVtYWlucyBvdXIgbnVtYmVyDQorRGlhbG9ndWU6IDAsMDowMDo0OC44NCw5OjU5OjU5Ljk5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyOCl9KHtcaTF9IGluYXVkaWJsZSByYWRpbyBjaGF0dGVye1xpMH0gKVxOe1xhbjd9e1xwb3MoMzgsNDQpfT4+IFNhZmV0eSByZW1haW5zIG91ciBudW1iZXIgbw0KK0RpYWxvZ3VlOiAwLDA6MDA6NDkuMjgsOTo1OTo1OS45OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjgpfSh7XGkxfSBpbmF1ZGlibGUgcmFkaW8gY2hhdHRlcntcaTB9IClcTntcYW43fXtccG9zKDM4LDQ0KX0+PiBTYWZldHkgcmVtYWlucyBvdXIgbnVtYmVyIG9uZQ0KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3N1Yi1jYy1zY3RlMjAgYi90ZXN0cy9yZWYvZmF0ZS9zdWItY2Mtc2N0ZTIwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZmM5MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zdWItY2Mtc2N0ZTIwCkBAIC0wLDAgKzEsMTUgQEAKK1tTY3JpcHQgSW5mb10NCis7IFNjcmlwdCBnZW5lcmF0ZWQgYnkgRkZtcGVnL0xhdmMNCitTY3JpcHRUeXBlOiB2NC4wMCsNCitQbGF5UmVzWDogMzg0DQorUGxheVJlc1k6IDI4OA0KKw0KK1tWNCsgU3R5bGVzXQ0KK0Zvcm1hdDogTmFtZSwgRm9udG5hbWUsIEZvbnRzaXplLCBQcmltYXJ5Q29sb3VyLCBTZWNvbmRhcnlDb2xvdXIsIE91dGxpbmVDb2xvdXIsIEJhY2tDb2xvdXIsIEJvbGQsIEl0YWxpYywgVW5kZXJsaW5lLCBTdHJpa2VPdXQsIFNjYWxlWCwgU2NhbGVZLCBTcGFjaW5nLCBBbmdsZSwgQm9yZGVyU3R5bGUsIE91dGxpbmUsIFNoYWRvdywgQWxpZ25tZW50LCBNYXJnaW5MLCBNYXJnaW5SLCBNYXJnaW5WLCBFbmNvZGluZw0KK1N0eWxlOiBEZWZhdWx0LE1vbm9zcGFjZSwxNiwmSGZmZmZmZiwmSGZmZmZmZiwmSDAsJkgwLDAsMCwwLDAsMTAwLDEwMCwwLDAsMywxLDAsMiwxMCwxMCwxMCwwDQorDQorW0V2ZW50c10NCitGb3JtYXQ6IExheWVyLCBTdGFydCwgRW5kLCBTdHlsZSwgTmFtZSwgTWFyZ2luTCwgTWFyZ2luUiwgTWFyZ2luViwgRWZmZWN0LCBUZXh0DQorRGlhbG9ndWU6IDAsMDowMDowMC4wMCwwOjAwOjAxLjQ0LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg0OCwxODIpfUJFU0lERVMgVEhFIA0KK0RpYWxvZ3VlOiAwLDA6MDA6MDEuNDMsMDowMDowMy45MyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMTY2KX1caEJFU0lERVMgVEhFIFxOe1xhbjd9e1xwb3MoMzgsMTk3KX1TUEVORElORyBBTkQgVEhJUywgSVMgVEhBVCBDQVIgDQorRGlhbG9ndWU6IDAsMDowMDowMy45NCwwOjAwOjA2LjMxLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwxODIpfVNQRU5ESU5HIEFORCBUSElTLCBJUyBUSEFUIENBUiBcTntcYW43fXtccG9zKDM4LDE5Nyl9TUFOVUZBQ1RVUkVSUyBBUkUgQUJPVVQgQVMgDQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3ViLWNoYXJlbmMgYi90ZXN0cy9yZWYvZmF0ZS9zdWItY2hhcmVuYwppbmRleCBlZDVjZGJlLi5hMDU2Y2QxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zdWItY2hhcmVuYworKysgYi90ZXN0cy9yZWYvZmF0ZS9zdWItY2hhcmVuYwpAQCAtMTYsNyArMTYsNyBAQAogRGlhbG9ndWU6IDAsMDowMTo0NS40OCwwOjAxOjQ3LjMyLERlZmF1bHQsLDAsMCwwLCzQqNGDINCb0LjQtdC9IQ0KIERpYWxvZ3VlOiAwLDA6MDE6NTQuNTMsMDowMTo1Ny4yNCxEZWZhdWx0LCwwLDAsMCws0JvQuCDQnNGDINCR0LDQuSDQtSDRgtGD0LouDQogRGlhbG9ndWU6IDAsMDowMjowNS44MywwOjAyOjA5LjAwLERlZmF1bHQsLDAsMCwwLCwtINCa0LDQuiDQstGK0YDQstGP0YIg0L3QtdGJ0LDRgtCwP1xOLSDQlNC+0LHRgNC1LiDQnNC+0LvRjywg0LLQu9C10LfRgtC1IQ0KLURpYWxvZ3VlOiAwLDA6MDI6MjMuNDgsMDowMjoyNi41MixEZWZhdWx0LCwwLDAsMCws0JzRgyDQkdCw0LkuLi5cTtCc0LjQvdCwINC80L3QvtCz0L4g0LLRgNC10LzQtS4NCitEaWFsb2d1ZTogMCwwOjAyOjIzLjQ4LDA6MDI6MjYuNTMsRGVmYXVsdCwsMCwwLDAsLNCc0YMg0JHQsNC5Li4uXE7QnNC40L3QsCDQvNC90L7Qs9C+INCy0YDQtdC80LUuDQogRGlhbG9ndWU6IDAsMDowMjoyNi43MywwOjAyOjI4LjExLERlZmF1bHQsLDAsMCwwLCzQotCw0LrQsCDQtS4NCiBEaWFsb2d1ZTogMCwwOjAyOjI4LjU3LDA6MDI6MzEuNDEsRGVmYXVsdCwsMCwwLDAsLC0g0JrQsNC6INCy0YrRgNCy0Lgg0LHQuNC30L3QtdGB0YrRgj9cTi0g0JTQvtCx0YDQtS4NCiBEaWFsb2d1ZTogMCwwOjAyOjMxLjYxLDA6MDI6MzMuOTAsRGVmYXVsdCwsMCwwLDAsLC0g0JAg0YLQuCDQutCw0Log0YHQuD9cTi0g0JTQvtCx0YDQtS4NCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdWItc2FtaTIgYi90ZXN0cy9yZWYvZmF0ZS9zdWItc2FtaTIKaW5kZXggOWU5YzgwOC4uNjQ2NTZmMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc3ViLXNhbWkyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N1Yi1zYW1pMgpAQCAtMTksNyArMTksNyBAQAogRGlhbG9ndWU6IDAsMDowMDoyMS44NCwwOjAwOjIxLjg0LERlZmF1bHQsLDAsMCwwLCxcTntcdTF966ek66Cl7KCB7J24IOyEuOqzhOyXkOyEnFxO7J20IOuqqOuToCDqsoPsnbQg7Y687LOQ7KeR64uI64uke1x1MX0NCiBEaWFsb2d1ZTogMCwwOjAwOjIxLjg0LDA6MDA6MjMuNTgsRGVmYXVsdCwsMCwwLDAsLFxOe1xpMX17XGMmSDk5NjZDQyZ9b2Z7XGN9e1xjJkhDMkEzRTAmfSB3aGF0J3N7XGN9IHtcYyZIRTBEMUYwJn1yaWdodHtcY30ge1xjJkhGQ0ZBRkUmfWFuZHtcY30gd3Jvbmcue1xpMH0NCiBEaWFsb2d1ZTogMCwwOjAwOjIzLjY5LDA6MDA6MjMuNjksRGVmYXVsdCwsMCwwLDAsLFxOe1xpMX3snbQg7KO87KCc66W8IOyLrOyYpO2VnCDssqDtlZnsnLzroZxcTuuLtOyVhOuCtOqzoCDsnojslrTsmpR7XGkwfQ0KLURpYWxvZ3VlOiAwLDA6MDA6MjMuNjksMDowMDoyNS42NyxEZWZhdWx0LCwwLDAsMCwsXE57XGZzMjB9e1xjJkhGRjAwMDAmfXtcczF9SXR7XHMwfXtcY317XGZzfSBoYXMge1xmczE1fXtcYyZIRkZGRjAwJn1he1xjfXtcZnN9IGdyZWF0IHtcZnMxNn17XGMmSEZGQ0MwMCZ9cGhpbG9zb3BoeXtcY317XGZzfSBhYm91dCBpdC4NCitEaWFsb2d1ZTogMCwwOjAwOjIzLjY5LDA6MDA6MjUuNjcsRGVmYXVsdCwsMCwwLDAsLFxOe1xjJkhGRjAwMDAmfXtcZnMyMH17XHMxfUl0e1xzMH17XGZzfXtcY30gaGFzIHtcYyZIRkZGRjAwJn17XGZzMTV9YXtcZnN9e1xjfSBncmVhdCB7XGMmSEZGQ0MwMCZ9e1xmczE2fXBoaWxvc29waHl7XGZzfXtcY30gYWJvdXQgaXQuDQogRGlhbG9ndWU6IDAsMDowMDo0MC4yMiwwOjAwOjQwLjIyLERlZmF1bHQsLDAsMCwwLCxcTntcczF9IuyZleyijOydmCDqsozsnoQi7J2AIOybqOyKpO2FjOuhnOyKpOudvOuKlCDqsIDsg4HsmZXqta3snZhcTuq2jOugpSDrtoTsn4Eg7J207JW86riw7J6F64uI64uke1xzMH0NCiBEaWFsb2d1ZTogMCwwOjAwOjQwLjIyLDA6MDA6NDcuOTQsRGVmYXVsdCwsMCwwLDAsLFxOe1xjJkhBNUZGJn17XGZzMjZ9IkdhbWUgb2YgVGhyb25lcyJ7XGZzfXtcY30ge1xjJkgyQTJBQTUmfXtcYjF9aXN7XGIwfXtcY317XGMmSEZGRkYmfXtcZnMyNH17XGkxfSBhYm91dHtcaTB9e1xmc317XGN9IHtcYyZIMzM2Njk5Jn17XGZzMTR9cG93ZXJ7XGZzfXtcY317XGMmSEZGJn0gc3RydWdnbGVze1xjfVxOe1xjJkhBNUZGJn17XGZzOH1pbiBhIGZhbnRhc3l7XGZzfXtcYyZIQ0JDMEZGJn0ga2luZ2RvbXtcYyZIQTVGRiZ9LCBjYWxsZWQge1xmczZ9V2VzdGVyb3Mue1xmc317XGN9DQogRGlhbG9ndWU6IDAsMDowMDo0OC4wNiwwOjAwOjQ4LjA2LERlZmF1bHQsLDAsMCwwLCxcTuyyoOydmCDsmZXsoozrpbwg65GY65+s7Iu8XE7qtozroKUg67aE7J+B7J207KOgDQpAQCAtNTEsNyArNTEsNyBAQAogRGlhbG9ndWU6IDAsMDowMTozNC4wMSwwOjAxOjM1LjI0LERlZmF1bHQsLDAsMCwwLCxcTnB1cnN1aW5nIHRoZWlyIG93biBpbnRlcmVzdHMuDQogRGlhbG9ndWU6IDAsMDowMTozNS4zNiwwOjAxOjM1LjM2LERlZmF1bHQsLDAsMCwwLCxcTu2VnO2OuCwg7J286rOxIOyZleq1reydmCDrsJbsl5DshJzripRcTuuRkCDqsJzsnZgg6rGw64yA7ZWcIOychO2YkeydtCDrtoDsg4Htlanri4jri6QNCiBEaWFsb2d1ZTogMCwwOjAxOjM1LjM2LDA6MDE6NDAuMjMsRGVmYXVsdCwsMCwwLDAsLFxOe1xmczMwfUFuZCBtZWFud2hpbGUsIG91dHNpZGUgdGhlIFNldmVuXE5LaW5nZG9tcywgdHdvIGdyZWF0IHRocmVhdHMgYXJpc2luZy57XGZzfQ0KLURpYWxvZ3VlOiAwLDA6MDE6NDAuMzUsMDowMTo0MC4zNSxEZWZhdWx0LCwwLDAsMCwsXE48c3VwPu2VmOuCmOuKlCDrsJTri6Qg6rG064SIXE7tg4DqsIDrpqzsl5Qg7J287KGxIOycoOuwsOyekOuTpOydtOupsDwvc3ViPg0KK0RpYWxvZ3VlOiAwLDA6MDE6NDAuMzUsMDowMTo0MC4zNSxEZWZhdWx0LCwwLDAsMCwsXE7tlZjrgpjripQg67CU64ukIOqxtOuEiFxO7YOA6rCA66as7JeUIOydvOyhsSDsnKDrsLDsnpDrk6TsnbTrqbANCiBEaWFsb2d1ZTogMCwwOjAxOjQwLjM1LDA6MDE6NDQuMDYsRGVmYXVsdCwsMCwwLDAsLFxOT25lIGFjcm9zcyB0aGUgc2VhLCBpbiB0aGUgZXhpbGVcTlRhcmdhcnllbiBzaWJsaW5ncywNCiBEaWFsb2d1ZTogMCwwOjAxOjQ0LjE3LDA6MDE6NDQuMTcsRGVmYXVsdCwsMCwwLDAsLFxO65iQIO2VmOuCmOuKlCDsnbzqs7Eg7JmV6rWt7J2YXE7qta3qsr3snbQg7J6Q66as7J6h7J2ADQogRGlhbG9ndWU6IDAsMDowMTo0NC4xNywwOjAxOjQ3LjM5LERlZmF1bHQsLDAsMCwwLCxcTmFuZCBhbm90aGVyIGZhciB0byB0aGUgbm9ydGgsXE5iZXlvbmQgdGhlIFdhbGwsDQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3ViLXNjYyBiL3Rlc3RzL3JlZi9mYXRlL3N1Yi1zY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzZTE4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N1Yi1zY2MKQEAgLTAsMCArMSwxMDQgQEAKK1tTY3JpcHQgSW5mb10KKzsgU2NyaXB0IGdlbmVyYXRlZCBieSBGRm1wZWcvTGF2YworU2NyaXB0VHlwZTogdjQuMDArCitQbGF5UmVzWDogMzg0CitQbGF5UmVzWTogMjg4CisKK1tWNCsgU3R5bGVzXQorRm9ybWF0OiBOYW1lLCBGb250bmFtZSwgRm9udHNpemUsIFByaW1hcnlDb2xvdXIsIFNlY29uZGFyeUNvbG91ciwgT3V0bGluZUNvbG91ciwgQmFja0NvbG91ciwgQm9sZCwgSXRhbGljLCBVbmRlcmxpbmUsIFN0cmlrZU91dCwgU2NhbGVYLCBTY2FsZVksIFNwYWNpbmcsIEFuZ2xlLCBCb3JkZXJTdHlsZSwgT3V0bGluZSwgU2hhZG93LCBBbGlnbm1lbnQsIE1hcmdpbkwsIE1hcmdpblIsIE1hcmdpblYsIEVuY29kaW5nCitTdHlsZTogRGVmYXVsdCxNb25vc3BhY2UsMTYsJkhmZmZmZmYsJkhmZmZmZmYsJkgwLCZIMCwwLDAsMCwwLDEwMCwxMDAsMCwwLDMsMSwwLDIsMTAsMTAsMTAsMAorCitbRXZlbnRzXQorRm9ybWF0OiBMYXllciwgU3RhcnQsIEVuZCwgU3R5bGUsIE5hbWUsIE1hcmdpbkwsIE1hcmdpblIsIE1hcmdpblYsIEVmZmVjdCwgVGV4dAorRGlhbG9ndWU6IDAsMDowMDotMi4tNDcsMDowMDowMC43MCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoNzYsMjI4KX1XRSBIQVZFIEZPVU5EIEEgV0lUQ0ggIVxOe1xhbjd9e1xwb3MoNzYsMjQzKX1NQVkgV0UgQlVSTiBIRVIgPworRGlhbG9ndWU6IDAsMDowMDowMC42OSwwOjAwOjAzLjI5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygxMTUsMjI4KX1bIENyb3dkIF1cTntcYW43fXtccG9zKDExNSwyNDMpfUJVUk4gSEVSICEgIEJVUk4gSEVSICEKK0RpYWxvZ3VlOiAwLDA6MDA6MDMuMzAsMDowMDowNy4wNyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMTk3KX1IT1cgRE8gWU9VIEtOT1dcTntcYW43fXtccG9zKDM4LDIxMyl9U0hFIElTIEEgV0lUQ0ggP1xOe1xhbjd9e1xwb3MoMTUzLDI0Myl9U0hFIExPT0tTIExJS0UgT05FICEKK0RpYWxvZ3VlOiAwLDA6MDA6MDcuMDcsMDowMDowOS4yNyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTkyLDIyOCl9WyBTaG91dGluZ1xOe1xhbjd9e1xwb3MoMTkyLDI0Myl9XGhcaEFmZmlybWF0aW9ucyBdCitEaWFsb2d1ZTogMCwwOjAwOjA5LjI2LDA6MDA6MTEuMDYsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDI0Myl9QlJJTkcgSEVSIEZPUldBUkQuCitEaWFsb2d1ZTogMCwwOjAwOjExLjA3LDA6MDA6MTQuMjcsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDExNSwyMjgpfUnigJlNIE5PVCBBIFdJVENILlxOe1xhbjd9e1xwb3MoMTE1LDI0Myl9XGhJ4oCZTXtcaTF9IE5PVHtcaTB9IEEgV0lUQ0guCitEaWFsb2d1ZTogMCwwOjAwOjE0LjI2LDA6MDA6MTYuMDMsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDIyOCl9QlVUIFlPVSBBUkUgRFJFU1NFRFxOe1xhbjd9e1xwb3MoMzgsMjQzKX1BUyBPTkUuCitEaWFsb2d1ZTogMCwwOjAwOjE2LjAzLDA6MDA6MTkuMDMsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDc2LDE5Nyl9VEhFWSBEUkVTU0VEIE1FIFVQXE57XGFuN317XHBvcyg3NiwyMTMpfUxJS0UgVEhJUy5cTntcYW43fXtccG9zKDc2LDI0Myl9XGhcaFxoXGhcaFxoXGhcaE5PICEgIFdFIERJRE7igJlUICEKK0RpYWxvZ3VlOiAwLDA6MDA6MTkuMDMsMDowMDoyMi45NSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTE1LDIyOCl9QU5EIFRISVMgSVNO4oCZVCBNWSBOT1NFLlxOe1xhbjd9e1xwb3MoMTE1LDI0Myl9SVTigJlTIEEgRkFMU0UgT05FLgorRGlhbG9ndWU6IDAsMDowMDoyNS4zMCwwOjAwOjI4LjQzLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg3NiwxOTcpfVdFTEwgP1xOe1xhbjd9e1xwb3MoNzYsMjI4KX1caFxoXGhcaFxoXGhcaFxoV0VMTCwgV0UgRElEXE57XGFuN317XHBvcyg3NiwyNDMpfVxoXGhcaFxoXGhcaFxoXGhETyBUSEUgTk9TRS4KK0RpYWxvZ3VlOiAwLDA6MDA6MjguNDMsMDowMDozMC4wNyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoNzYsMTk3KX1USEUgTk9TRSA/XE57XGFuN317XHBvcyg3NiwyNDMpfVxoXGhcaFxoXGhcaFxoXGhBTkQgVEhFIEhBVC4KK0RpYWxvZ3VlOiAwLDA6MDA6MzAuMDcsMDowMDozNS41MCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTE1LDE5Nyl9QlVUIFNIRSBJUyBBIFdJVENILlxOe1xhbjd9e1xwb3MoMTE1LDIyOCl9WUVBSCAhICBCVVJOIEhFUiAhXE57XGFuN317XHBvcygxMTUsMjQzKX1CVVJOIEhFUiAhICBCVVJOIEhFUiAhCitEaWFsb2d1ZTogMCwwOjAwOjM1LjUwLDA6MDA6MzguNDcsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDc2LDIxMyl9LSBESUQgWU9VIERSRVNTIEhFUiBVUFxOe1xhbjd9e1xwb3MoNzYsMjI4KX1caFxoTElLRSBUSElTID9cTntcYW43fXtccG9zKDc2LDI0Myl9LSBOTyAhCitEaWFsb2d1ZTogMCwwOjAwOjM4LjQ2LDA6MDA6MzkuODYsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDE5MiwxOTcpfVxoXGhcaFxoXGhcaFxoXGhOTyAhXE57XGFuN317XHBvcygxOTIsMjEzKX1OTyAhXE57XGFuN317XHBvcygxOTIsMjQzKX1caFxoXGhcaE5PICEKK0RpYWxvZ3VlOiAwLDA6MDA6MzkuODYsMDowMDo0MS42MyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTUzLDIyOCl9WUVTLiAgWUVTLlxOe1xhbjd9e1xwb3MoMTUzLDI0Myl9WUVBSCwgQSBCSVQuCitEaWFsb2d1ZTogMCwwOjAwOjQxLjYzLDA6MDA6NDQuODMsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDE1MywxOTcpfVxoXGhcaFxoXGhcaFxoXGhBIEJJVC5cTntcYW43fXtccG9zKDE1MywyMTMpfVxoXGhcaFxoXGhcaFxoXGhcaEEgQklULlxOe1xhbjd9e1xwb3MoMTUzLDI0Myl9U0hFIEhBUyBHT1QgQSBXQVJULgorRGlhbG9ndWU6IDAsMDowMDo0NC44MywwOjAwOjQ3LjA0LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyMjgpfVdIQVQgTUFLRVMgWU9VIFRISU5LXE57XGFuN317XHBvcygzOCwyNDMpfVNIRSBJUyBBIFdJVENIID8KK0RpYWxvZ3VlOiAwLDA6MDA6NDcuMDMsMDowMDo0OS41MyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTE1LDIyOCl9V0VMTCwgU0hFIFRVUk5FRCBNRVxOe1xhbjd9e1xwb3MoMTE1LDI0Myl9SU5UTyBBIE5FV1QgIQorRGlhbG9ndWU6IDAsMDowMDo0OS41MywwOjAwOjUyLjMwLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg3NiwyNDMpfUEgTkVXVCA/CitEaWFsb2d1ZTogMCwwOjAwOjU1LjQ2LDA6MDA6NTcuMzksRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDExNSwyNDMpfUkgR09UIEJFVFRFUi4KK0RpYWxvZ3VlOiAwLDA6MDA6NTcuNDAsMDowMDo1OC45MCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTUzLDI0Myl9QlVSTiBIRVIgQU5ZV0FZICEKK0RpYWxvZ3VlOiAwLDA6MDA6NTguODksMDowMTowMS4wMyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoNzYsMTk3KX1CVVJOIEhFUiAhXE57XGFuN317XHBvcyg3NiwyMjgpfVxoXGhcaFxoXGhcaFxoXGhCVVJOIEhFUiAhXE57XGFuN317XHBvcyg3NiwyNDMpfVxoXGhcaFxoXGhcaFxoXGhDUkFDS0xFLCBDUkFDS0xFICEKK0RpYWxvZ3VlOiAwLDA6MDE6MDEuMDMsMDowMTowNC4wMCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMTk3KX1caFxoXGhcaFsgU2hvdXRpbmdcTntcYW43fXtccG9zKDM4LDIxMyl9XGhcaFxoXGhcaFxoQ29udGludWVzIF1cTntcYW43fXtccG9zKDM4LDI0Myl9UVVJRVQuICBRVUlFVC4KK0RpYWxvZ3VlOiAwLDA6MDE6MDQuMDAsMDowMTowNS40MyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX1RVUlFVCAhXE57XGFuN317XHBvcyg0OCwyNDMpfVFVSUVUICEKK0RpYWxvZ3VlOiAwLDA6MDE6MDUuNDMsMDowMTowOS4xMyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX1USEVSRSBBUkUgV0FZUyBPRiBURUxMSU5HXE57XGFuN317XHBvcygzOCwyNDMpfVdIRVRIRVIgU0hFIElTIEEgV0lUQ0guCitEaWFsb2d1ZTogMCwwOjAxOjA5LjEzLDA6MDE6MTAuOTYsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDIyOCl9QVJFIFRIRVJFID9cTntcYW43fXtccG9zKDM4LDI0Myl9V0hBVCBBUkUgVEhFWSA/CitEaWFsb2d1ZTogMCwwOjAxOjEwLjk2LDA6MDE6MTMuMzAsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDE5Nyl9VEVMTCBVUyAhXE57XGFuN317XHBvcygxNTMsMjEzKX1URUxMIFVTICFcTntcYW43fXtccG9zKDE1MywyNDMpfVxoXGhcaFxoRE8gVEhFWSBIVVJUID8KK0RpYWxvZ3VlOiAwLDA6MDE6MTMuMzAsMDowMToxNi4yMyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX1URUxMIE1FLFxOe1xhbjd9e1xwb3MoMzgsMjQzKX1XSEFUIERPIFlPVSBETyBXSVRIIFdJVENIRVMgPworRGlhbG9ndWU6IDAsMDowMToxNi4yMywwOjAxOjE5LjIwLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg3NiwyMTMpfVxoXGhcaFxoXGhcaFxoXGhcaFxoXGhcaEJVUk4gVEhFTSAhXE57XGFuN317XHBvcyg3NiwyMjgpfVxoXGhcaFxoXGhcaFxoXGhcaFxoXGhcaFxoQlVSTiBUSEVNIFVQICFcTntcYW43fXtccG9zKDc2LDI0Myl9QlVSTiAhCitEaWFsb2d1ZTogMCwwOjAxOjE5LjIwLDA6MDE6MjIuMzMsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDIyOCl9QU5EIFdIQVQgRE8gWU9VIEJVUk4sXE57XGFuN317XHBvcygzOCwyNDMpfUFQQVJUIEZST00gV0lUQ0hFUyA/CitEaWFsb2d1ZTogMCwwOjAxOjIyLjMzLDA6MDE6MjQuNTksRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDE5Nyl9TU9SRSBXSVRDSEVTICFcTntcYW43fXtccG9zKDE1MywyNDMpfVNISCAhCitEaWFsb2d1ZTogMCwwOjAxOjI0LjU5LDA6MDE6MjUuNjIsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDE5MiwyNDMpfVdPT0QgIQorRGlhbG9ndWU6IDAsMDowMToyNS42MywwOjAxOjI5LjMzLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyMjgpfVNPLFxOe1xhbjd9e1xwb3MoMzgsMjQzKX1XSFkgRE8gV0lUQ0hFUyBCVVJOID8KK0RpYWxvZ3VlOiAwLDA6MDE6MzIuNjksMDowMTozNS4wMyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTkyLDI0Myl9Qi0tCitEaWFsb2d1ZTogMCwwOjAxOjM5LjEzLDA6MDE6NDIuNDYsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDc2LDIxMyl9LSDigJlDQVVTRSBUSEVZ4oCZUkVcTntcYW43fXtccG9zKDc2LDIyOCl9XGhcaE1BREUgT0YgVy0tIFdPT0QgP1xOe1xhbjd9e1xwb3MoNzYsMjQzKX0tIEdPT0QgIQorRGlhbG9ndWU6IDAsMDowMTo0Mi40NiwwOjAxOjQ0LjAwLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygxOTIsMjEzKX1PSCwgWUVBSC5cTntcYW43fXtccG9zKDE5MiwyNDMpfVsgTXVybXVyaW5nIF0KK0RpYWxvZ3VlOiAwLDA6MDE6NDQuMDAsMDowMTo0OC41MCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjEzKX1TTywgSE9XIERPIFdFIFRFTExcTntcYW43fXtccG9zKDM4LDIyOCl9V0hFVEhFUiBTSEVcTntcYW43fXtccG9zKDM4LDI0Myl9SVMgTUFERSBPRiBXT09EID8KK0RpYWxvZ3VlOiAwLDA6MDE6NDguNTAsMDowMTo1MC4xMCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTUzLDIyOCl9QlVJTEQgQSBCUklER0VcTntcYW43fXtccG9zKDE1MywyNDMpfU9VVCBPRiBIRVIgIQorRGlhbG9ndWU6IDAsMDowMTo1MC4xMCwwOjAxOjU0LjEzLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyMjgpfUFILCBCVVQgQ0FOIFlPVSBOT1QgQUxTT1xOe1xhbjd9e1xwb3MoMzgsMjQzKX1NQUtFIEJSSURHRVMgT1VUIE9GIFNUT05FID8KK0RpYWxvZ3VlOiAwLDA6MDE6NTQuMTMsMDowMTo1Ny4yNixEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoNzYsMTk3KX1PSCwgWUVBSC5cTntcYW43fXtccG9zKDc2LDIyOCl9XGhcaFxoXGhcaFxoXGhcaE9ILCBZRUFILlxOe1xhbjd9e1xwb3MoNzYsMjQzKX1caFxoXGhcaFxoXGhcaFxoVFJVRS4gIFVILS0KK0RpYWxvZ3VlOiAwLDA6MDE6NTcuMjYsMDowMTo1OS43MixEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfURPRVMgV09PRFxOe1xhbjd9e1xwb3MoMzgsMjQzKX1TSU5LIElOIFdBVEVSID8KK0RpYWxvZ3VlOiAwLDA6MDE6NTkuNzMsMDowMjowMi4xNyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoNzYsMTk3KX1OTywgTk8uXE57XGFuN317XHBvcyg3NiwyMjgpfVxoXGhcaFxoXGhcaFxoXGhOTywgSVQgRkxPQVRTICFcTntcYW43fXtccG9zKDc2LDI0Myl9XGhcaFxoXGhcaFxoXGhcaElUIEZMT0FUUyAhCitEaWFsb2d1ZTogMCwwOjAyOjAyLjE3LDA6MDI6MDcuMDQsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDc2LDE5Nyl9VEhST1cgSEVSIElOVE8gVEhFIFBPTkQgIVxOe1xhbjd9e1xwb3MoNzYsMjQzKX1caFxoXGhcaFxoXGhcaFxoWyBBbGwgU2hvdXRpbmcgXQorRGlhbG9ndWU6IDAsMDowMjowNy4zNiwwOjAyOjEwLjQ5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyMjgpfVdIQVQgQUxTTyBGTE9BVFNcTntcYW43fXtccG9zKDM4LDI0Myl9SU4gV0FURVIgPworRGlhbG9ndWU6IDAsMDowMjoxMC41MCwwOjAyOjEyLjE0LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg3NiwxOTcpfUJSRUFEICFcTntcYW43fXtccG9zKDc2LDI0Myl9XGhcaFxoXGhcaFxoXGhcaFxoXGhcaFxoQVBQTEVTICEKK0RpYWxvZ3VlOiAwLDA6MDI6MTIuMTMsMDowMjoxMy4yMyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoNzYsMjQzKX1VSCwgVkVSWSBTTUFMTCBST0NLUy4KK0RpYWxvZ3VlOiAwLDA6MDI6MTMuMjMsMDowMjoxNi40OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoODYsMjI4KX17XGkxfS0gQ0lERVIgISAgQ0hFUlJJRVMgIVxOe1xhbjd9e1xwb3MoODYsMjQzKX17XGkwfS0gVUgsIEdSQS0tIEdSQVZZICEgIE1VRCAhCitEaWFsb2d1ZTogMCwwOjAyOjE2LjUwLDA6MDI6MTguNzYsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDg2LDIyOCl9LSBDSFVSQ0hFUyAhICBDSFVSQ0hFUyAhXE57XGFuN317XHBvcyg4NiwyNDMpfXtcaTF9LSBMRUFEICEgIExFQUQgIQorRGlhbG9ndWU6IDAsMDowMjoxOC43NiwwOjAyOjIyLjMwLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg3NiwyMjgpfS0gQSBEVUNLICFcTntcYW43fXtccG9zKDc2LDI0Myl9LSBbIENyb3dkIEdhc3BzLCBNdXJtdXJzIF0KK0RpYWxvZ3VlOiAwLDA6MDI6MjIuMzAsMDowMjoyNC42MyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTE1LDI0Myl9RVhBQ1RMWSAhCitEaWFsb2d1ZTogMCwwOjAyOjI1LjM2LDA6MDI6MjcuNTksRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDc2LDI0Myl9U08sIExPR0lDQUxMWS0tCitEaWFsb2d1ZTogMCwwOjAyOjI3LjU5LDA6MDI6MjkuNzYsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDE5MiwyNDMpfUlGLi4uIFNIRS4uLgorRGlhbG9ndWU6IDAsMDowMjoyOS43NiwwOjAyOjMzLjU2LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygxOTIsMjEzKX1XRUlHSFMuLi5cTntcYW43fXtccG9zKDE5MiwyMjgpfVRIRSBTQU1FXE57XGFuN317XHBvcygxOTIsMjQzKX1BUyBBIERVQ0suLi4KK0RpYWxvZ3VlOiAwLDA6MDI6MzQuNDAsMDowMjozNi41MCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTUzLDI0Myl9U0hF4oCZUyBNQURFIE9GIFdPT0QgIQorRGlhbG9ndWU6IDAsMDowMjozNi41MCwwOjAyOjM4LjQ3LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyNDMpfUFORCBUSEVSRUZPUkUgPworRGlhbG9ndWU6IDAsMDowMjozOS41MCwwOjAyOjQyLjE3LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyMjgpfS0gQSBXSVRDSCAhXE57XGFuN317XHBvcygzOCwyNDMpfXtcaTF9LSBbIEFsbCBdICBBIFdJVENIICEgIEEgV0lUQ0ggIQorRGlhbG9ndWU6IDAsMDowMjo0Mi4xNywwOjAyOjQ0LjA3LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg3NiwyNDMpfVsgU2hvdXRpbmcgQ29udGludWVzIF0KK0RpYWxvZ3VlOiAwLDA6MDI6NDQuMDcsMDowMjo0NS43NixEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTkyLDIxMyl9SEVSReKAmVMgQSBEVUNLICFcTntcYW43fXtccG9zKDE5MiwyNDMpfVsgUXVhY2tpbmcgXQorRGlhbG9ndWU6IDAsMDowMjo0NS43NiwwOjAyOjQ5Ljc5LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg3NiwyMTMpfVZFUlkgR09PRC5cTntcYW43fXtccG9zKDc2LDIyOCl9V0UgU0hBTEwgVVNFXE57XGFuN317XHBvcyg3NiwyNDMpfU1ZIExBUkdFU1QgU0NBTEVTLgorRGlhbG9ndWU6IDAsMDowMjo0OS43OSwwOjAyOjUyLjcyLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcyg3NiwyNDMpfVsgU2hvdXRpbmcgQ29udGludWVzIF0KK0RpYWxvZ3VlOiAwLDA6MDI6NTIuNzMsMDowMjo1NS4xNyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTE1LDIyOCl9QlVSTiAhXE57XGFuN317XHBvcygxMTUsMjQzKX1caEJVUk4gVEhFIFdJVENIICEKK0RpYWxvZ3VlOiAwLDA6MDI6NTUuMTcsMDowMjo1Ny42MyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTUzLDIyOCl9QlVSTiBIRVIgIVxOe1xhbjd9e1xwb3MoMTUzLDI0Myl9XGhCVVJOIFRIRSBXSVRDSCAhCitEaWFsb2d1ZTogMCwwOjAyOjU3LjYzLDA6MDM6MDEuNjMsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDExNSwyMjgpfUJVUk4gSEVSICFcTntcYW43fXtccG9zKDExNSwyNDMpfVxoQlVSTiBIRVIgISAgQlVSTiBIRVIgIQorRGlhbG9ndWU6IDAsMDowMzowMS42MywwOjAzOjA0LjE0LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygxMTUsMjI4KX1CVVJOIEhFUiAhXE57XGFuN317XHBvcygxMTUsMjQzKX1caEJVUk4gSEVSICEKK0RpYWxvZ3VlOiAwLDA6MDM6MDQuMTMsMDowMzowNi41OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMjMwLDIyOCl9QlVSTiBIRVIgIVxOe1xhbjd9e1xwb3MoMjMwLDI0Myl9XGhCVVJOIEhFUiAhCitEaWFsb2d1ZTogMCwwOjAzOjA2LjU5LDA6MDM6MDguMDAsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDIwMSwyNDMpfXtcaTF9WyBNYW4gR3J1bnRzIF0KK0RpYWxvZ3VlOiAwLDA6MDM6MDguMDAsMDowMzoxNC4zMCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfVJJR0hUICFcTntcYW43fXtccG9zKDM4LDI0Myl9UkVNT1ZFIFRIRSBTVVBQT1JUUyAhCitEaWFsb2d1ZTogMCwwOjAzOjE3LjA3LDA6MDM6MTkuMTcsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDE5Nyl9QSBXSVRDSCAhXE57XGFuN317XHBvcygyMzAsMjQzKX1BIFdJVENIICEKK0RpYWxvZ3VlOiAwLDA6MDM6MTkuMTcsMDowMzoyMC4wNCxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoNzYsMjQzKX1JVOKAmVMgQSBGQUlSIENPUC4KK0RpYWxvZ3VlOiAwLDA6MDM6MjAuMDMsMDowMzoyNS4yOSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjEzKX0tIEJVUk4gSEVSICFcTntcYW43fXtccG9zKDM4LDIyOCl9LSBbIENyb3dkIENvbnRpbnVlcyBTaG91dGluZyBdXE57XGFuN317XHBvcyg1NywyNDMpfUJVUk4gSEVSICEgIEJVUk4gSEVSICEKK0RpYWxvZ3VlOiAwLDA6MDM6MjguODYsMDowMzozMi43MyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjEzKX1XSE8gQVJFIFlPVSxcTntcYW43fXtccG9zKDM4LDIyOCl9V0hPIEFSRSBTTyBXSVNFXE57XGFuN317XHBvcygzOCwyNDMpfUlOIFRIRSBXQVlTIE9GIFNDSUVOQ0UgPworRGlhbG9ndWU6IDAsMDowMzozMi43MywwOjAzOjM1Ljc2LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygxNTMsMjI4KX1JIEFNIEFSVEhVUixcTntcYW43fXtccG9zKDE1MywyNDMpfUtJTkcgT0YgVEhFIEJSSVRPTlMuCitEaWFsb2d1ZTogMCwwOjAzOjM1Ljc2LDA6MDM6MzYuOTYsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDc2LDI0Myl9TVkgTElFR0UgIQorRGlhbG9ndWU6IDAsMDowMzozNi45NiwwOjAzOjQwLjM3LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygxMTUsMjEzKX1HT09EIFNJUiBLTklHSFQsXE57XGFuN317XHBvcygxMTUsMjI4KX1XSUxMIFlPVSBDT01FIFdJVEggTUVcTntcYW43fXtccG9zKDExNSwyNDMpfVRPIENBTUVMT1QuLi4KK0RpYWxvZ3VlOiAwLDA6MDM6NDAuMzYsMDowMzo0My4zOSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMTUzLDIyOCl9QU5EIEpPSU4gVVNcTntcYW43fXtccG9zKDE1MywyNDMpfUFUIFRIRSBST1VORCBUQUJMRSA/CitEaWFsb2d1ZTogMCwwOjAzOjQzLjQwLDA6MDM6NDUuNTMsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDIyOCl9TVkgTElFR0UsXE57XGFuN317XHBvcygzOCwyNDMpfUkgV09VTEQgQkUgSE9OT1JFRCAhCitEaWFsb2d1ZTogMCwwOjAzOjQ1LjUzLDA6MDM6NDguNzAsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDE5Nyl9XGhcaFxoXGhcaFxoXGhcaFxoXGhcaFxoV0hBVCBJUyBZT1VSIE5BTUUgP1xOe1xhbjd9e1xwb3MoMzgsMjQzKX1CRURFVkVSRSwgTVkgTElFR0UuCitEaWFsb2d1ZTogMCwwOjAzOjQ4LjY5LDA6MDM6NTIuNDksRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDE2MywyMjgpfVRIRU4gSSBEVUIgWU9VXE57XGFuN317XHBvcygxNjMsMjQzKX17XGkxfVNJUntcaTB9IEJFREVWRVJFLAorRGlhbG9ndWU6IDAsMDowMzo1Mi41MCwwOjAzOjU0Ljg2LERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygxNTMsMjI4KX1LTklHSFRcTntcYW43fXtccG9zKDE1MywyNDMpfU9GIFRIRSBST1VORCBUQUJMRS4KK0RpYWxvZ3VlOiAwLDA6MDM6NTQuODYsMDowMzo1Ni43NixEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfVsgTmFycmF0b3IgXVxOe1xhbjd9e1xwb3MoMzgsMjQzKX1USEUgV0lTRSBTSVIgQkVERVZFUkUuLi4KK0RpYWxvZ3VlOiAwLDA6MDM6NTYuNzYsMDowMzo1OS42OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfVdBUyBUSEUgRklSU1QgVE8gSk9JTlxOe1xhbjd9e1xwb3MoMzgsMjQzKX1LSU5HIEFSVEhVUuKAmVMgS05JR0hUUy4KK0RpYWxvZ3VlOiAwLDA6MDM6NTkuNjksMDowNDowMy4yNixEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfUJVVCBPVEhFUiBJTExVU1RSSU9VUyBOQU1FU1xOe1xhbjd9e1xwb3MoMzgsMjQzKX1XRVJFIFNPT04gVE8gRk9MTE9XOgorRGlhbG9ndWU6IDAsMDowNDowMy4yNiwwOjA0OjA2LjAzLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyNDMpfXtcaTF9U0lSIExBVU5DRUxPVCBUSEUgQlJBVkU7CitEaWFsb2d1ZTogMCwwOjA0OjA2LjAzLDA6MDQ6MDcuOTUsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDI0Myl9e1xpMX1TSVIgR0FMQUhBRCBUSEUgUFVSRTsKK0RpYWxvZ3VlOiAwLDA6MDQ6MDcuOTYsMDowNDoxMS4yNyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjEzKX17XGkxfUFORCBTSVIgUk9CSU5cTntcYW43fXtccG9zKDM4LDIyOCl9VEhFIE5PVC1RVUlURS1TTy1CUkFWRS1cTntcYW43fXtccG9zKDM4LDI0Myl9QVMtU0lSLUxBVU5DRUxPVCwKK0RpYWxvZ3VlOiAwLDA6MDQ6MTEuMjYsMDowNDoxMy45MixEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfVdITyBIQUQgTkVBUkxZIEZPVUdIVFxOe1xhbjd9e1xwb3MoMzgsMjQzKX1USEUgRFJBR09OIE9GIEFOR05PUiwKK0RpYWxvZ3VlOiAwLDA6MDQ6MTMuOTIsMDowNDoxNi44OSxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjEzKX17XGkxfVdITyBIQUQgTkVBUkxZXE57XGFuN317XHBvcygzOCwyMjgpfVNUT09EIFVQIFRPIFRIRSBWSUNJT1VTXE57XGFuN317XHBvcygzOCwyNDMpfUNISUNLRU4gT0YgQlJJU1RPTC4uLgorRGlhbG9ndWU6IDAsMDowNDoxNi44OSwwOjA0OjIwLjczLERlZmF1bHQsLDAsMCwwLCx7XGFuN317XHBvcygzOCwyMTMpfXtcaTF9QU5EIFdITyBIQURcTntcYW43fXtccG9zKDM4LDIyOCl9UEVSU09OQUxMWSBXRVQgSElNU0VMRlxOe1xhbjd9e1xwb3MoMzgsMjQzKX1BVCBUSEUgQkFUVExFIE9GIEJBRE9OIEhJTEw7CitEaWFsb2d1ZTogMCwwOjA0OjIwLjczLDA6MDQ6MjUuNDMsRGVmYXVsdCwsMCwwLDAsLHtcYW43fXtccG9zKDM4LDIyOCl9e1xpMX1BTkQgVEhFIEFQVExZIE5BTUVEXE57XGFuN317XHBvcygzOCwyNDMpfVNJUiBOT1QtQVBQRUFSSU5HLUlOLVRISVMtRklMTS4KK0RpYWxvZ3VlOiAwLDA6MDQ6MjUuNTksMDowNDoyOS4wMyxEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfVRPR0VUSEVSIFRIRVkgRk9STUVEIEEgQkFORFxOe1xhbjd9e1xwb3MoMzgsMjQzKX1XSE9TRSBOQU1FUyBBTkQgREVFRFMuLi4KK0RpYWxvZ3VlOiAwLDA6MDQ6MjkuMDMsMDowNDozMS43MixEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfVdFUkUgVE8gQkUgUkVUT0xEXE57XGFuN317XHBvcygzOCwyNDMpfVRIUk9VR0hPVVQgVEhFIENFTlRVUklFUy4KK0RpYWxvZ3VlOiAwLDA6MDQ6MzEuNzMsMDowNDozMy44NixEZWZhdWx0LCwwLDAsMCwse1xhbjd9e1xwb3MoMzgsMjI4KX17XGkxfVRIRSBLTklHSFRTXE57XGFuN317XHBvcygzOCwyNDMpfU9GIFRIRSBST1VORCBUQUJMRS4KZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3N1Yi1zcnQgYi90ZXN0cy9yZWYvZmF0ZS9zdWItc3J0CmluZGV4IDQwYjIwY2QuLmZkNjAyOTAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3N1Yi1zcnQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc3ViLXNydApAQCAtMTQsMTAgKzE0LDEwIEBACiBEaWFsb2d1ZTogMCwwOjAwOjAxLjUwLDA6MDA6MDQuNTAsRGVmYXVsdCwsMCwwLDAsLFN1YlJpcCBzdWJ0aXRsZXMgY2FwYWJpbGl0eSB0ZXN0ZXIgMS4zbyBieSBhbGU1MDAwXE57XGIxfXtcaTF9VXNlIFZMQyAxLjEgb3IgaGlnaGVyIGFzIHJlZmVyZW5jZSBmb3IgbW9zdCB0aGluZ3MgYW5kIE1QQyBIb21lIENpbmVtYSBmb3Igb3RoZXJze1xpMH17XGIwfVxOe1xjJkhGRjAwMDAmfVRoaXMgdGV4dCBzaG91bGQgYmUgYmx1ZXtcY31cTntcYyZIRkYmfVRoaXMgdGV4dCBzaG91bGQgYmUgcmVke1xjfVxOe1xjJkgwJn1UaGlzIHRleHQgc2hvdWxkIGJlIGJsYWNre1xjfVxOe1xmbldlYmRpbmdzfUlmIHlvdSBzZWUgdGhpcyB3aXRoIHRoZSBub3JtYWwgZm9udCwgdGhlIHBsYXllciBkb24ndCAoZnVsbHkpIHN1cHBvcnQgZm9udCBmYWNle1xmbn0NCiBEaWFsb2d1ZTogMCwwOjAwOjA0LjUwLDA6MDA6MDQuNTAsRGVmYXVsdCwsMCwwLDAsLEhpZGRlbg0KIERpYWxvZ3VlOiAwLDA6MDA6MDQuNTAsMDowMDowNy41MCxEZWZhdWx0LCwwLDAsMCwse1xmczh9VGhpcyB0ZXh0IHNob3VsZCBiZSBzbWFsbHtcZnN9XE5UaGlzIHRleHQgc2hvdWxkIGJlIG5vcm1hbFxOe1xmczM1fVRoaXMgdGV4dCBzaG91bGQgYmUgYmlne1xmc30NCi1EaWFsb2d1ZTogMCwwOjAwOjA3LjUwLDA6MDA6MTEuNTAsRGVmYXVsdCwsMCwwLDAsLFRoaXMgc2hvdWxkIGJlIGFuIEUgd2l0aCBhbiBhY2NlbnQ6IMOIXE7ml6XmnKzoqp5cTntcZnMzMH17XGIxfXtcaTF9e1x1MX1UaGlzIHRleHQgc2hvdWxkIGJlIGJvbGQsIGl0YWxpY3MgYW5kIHVuZGVybGluZXtcdTB9e1xpMH17XGIwfXtcZnN9XE57XGZzOX17XGMmSEZGMDAmfVRoaXMgdGV4dCBzaG91bGQgYmUgc21hbGwgYW5kIGdyZWVue1xjfXtcZnN9XE57XGZzOX17XGMmSEZGJn1UaGlzIHRleHQgc2hvdWxkIGJlIHNtYWxsIGFuZCByZWR7XGN9e1xmc31cTntcZnMyNH17XGMmSDJBMkFBNSZ9VGhpcyB0ZXh0IHNob3VsZCBiZSBiaWcgYW5kIGJyb3due1xjfXtcZnN9DQorRGlhbG9ndWU6IDAsMDowMDowNy41MCwwOjAwOjExLjUwLERlZmF1bHQsLDAsMCwwLCxUaGlzIHNob3VsZCBiZSBhbiBFIHdpdGggYW4gYWNjZW50OiDDiFxO5pel5pys6KqeXE57XGZzMzB9e1xiMX17XGkxfXtcdTF9VGhpcyB0ZXh0IHNob3VsZCBiZSBib2xkLCBpdGFsaWNzIGFuZCB1bmRlcmxpbmV7XHUwfXtcaTB9e1xiMH17XGZzfVxOe1xmczl9e1xjJkhGRjAwJn1UaGlzIHRleHQgc2hvdWxkIGJlIHNtYWxsIGFuZCBncmVlbntcZnN9e1xjfVxOe1xjJkhGRiZ9e1xmczl9VGhpcyB0ZXh0IHNob3VsZCBiZSBzbWFsbCBhbmQgcmVke1xmc317XGN9XE57XGMmSDJBMkFBNSZ9e1xmczI0fVRoaXMgdGV4dCBzaG91bGQgYmUgYmlnIGFuZCBicm93bntcZnN9e1xjfQ0KIERpYWxvZ3VlOiAwLDA6MDA6MTEuNTAsMDowMDoxNC41MCxEZWZhdWx0LCwwLDAsMCwse1xiMX1UaGlzIGxpbmUgc2hvdWxkIGJlIGJvbGR7XGIwfVxOe1xpMX1UaGlzIGxpbmUgc2hvdWxkIGJlIGl0YWxpY3N7XGkwfVxOe1x1MX1UaGlzIGxpbmUgc2hvdWxkIGJlIHVuZGVybGluZXtcdTB9XE57XHMxfVRoaXMgbGluZSBzaG91bGQgYmUgc3RyaWtldGhyb3VnaHtcczB9XE57XHUxfUJvdGggbGluZXNcTnNob3VsZCBiZSB1bmRlcmxpbmV7XHUwfQ0KLURpYWxvZ3VlOiAwLDA6MDA6MTQuNTAsMDowMDoxNy41MCxEZWZhdWx0LCwwLDAsMCwsPlxOSXQgd291bGQgYmUgYSBnb29kIHRoaW5nIHRvXE5oaWRlIGludmFsaWQgaHRtbCB0YWdzIHRoYXQgYXJlIGNsb3NlZCBhbmQgc2hvdyB0aGUgdGV4dCBpbiB0aGVtXE48aW52YWxpZF90YWdfdW5jbG9zZWQ+YnV0IHNob3cgdW4tY2xvc2VkIGludmFsaWQgaHRtbCB0YWdzXE5TaG93IG5vdCBvcGVuZWQgdGFnczwvaW52YWxpZF90YWdfbm90X29wZW5lZD5cTjwNCi1EaWFsb2d1ZTogMCwwOjAwOjE3LjUwLDA6MDA6MjAuNTAsRGVmYXVsdCwsMCwwLDAsLGFuZCBhbHNvXE5oaWRlIGludmFsaWQgaHRtbCB0YWdzIHdpdGggcGFyYW1ldGVycyB0aGF0IGFyZSBjbG9zZWQgYW5kIHNob3cgdGhlIHRleHQgaW4gdGhlbVxOPGludmFsaWRfdGFnX3VjIHBhcj01PmJ1dCBzaG93IHVuLWNsb3NlZCBpbnZhbGlkIGh0bWwgdGFnc1xOe1x1MX1UaGlzIHRleHQgc2hvdWxkIGJlIHNob3dlZCB1bmRlcmxpbmVkIHdpdGhvdXQgcHJvYmxlbXMgYWxzbzogMjwzLDU+MSw0PDZ7XHUwfVxOVGhpcyBzaG91bGRuJ3QgYmUgdW5kZXJsaW5lZA0KK0RpYWxvZ3VlOiAwLDA6MDA6MTQuNTAsMDowMDoxNy41MCxEZWZhdWx0LCwwLDAsMCwsPlxOSXQgd291bGQgYmUgYSBnb29kIHRoaW5nIHRvXE5oaWRlIGludmFsaWQgaHRtbCB0YWdzIHRoYXQgYXJlIGNsb3NlZCBhbmQgc2hvdyB0aGUgdGV4dCBpbiB0aGVtXE5idXQgc2hvdyB1bi1jbG9zZWQgaW52YWxpZCBodG1sIHRhZ3NcTlNob3cgbm90IG9wZW5lZCB0YWdzXE48DQorRGlhbG9ndWU6IDAsMDowMDoxNy41MCwwOjAwOjIwLjUwLERlZmF1bHQsLDAsMCwwLCxhbmQgYWxzb1xOaGlkZSBpbnZhbGlkIGh0bWwgdGFncyB3aXRoIHBhcmFtZXRlcnMgdGhhdCBhcmUgY2xvc2VkIGFuZCBzaG93IHRoZSB0ZXh0IGluIHRoZW1cTmJ1dCBzaG93IHVuLWNsb3NlZCBpbnZhbGlkIGh0bWwgdGFnc1xOe1x1MX1UaGlzIHRleHQgc2hvdWxkIGJlIHNob3dlZCB1bmRlcmxpbmVkIHdpdGhvdXQgcHJvYmxlbXMgYWxzbzogMjwzLDU+MSw0PDZ7XHUwfVxOVGhpcyBzaG91bGRuJ3QgYmUgdW5kZXJsaW5lZA0KIERpYWxvZ3VlOiAwLDA6MDA6MjAuNTAsMDowMDoyMS41MCxEZWZhdWx0LCwwLDAsMCwsVGhpcyB0ZXh0IHNob3VsZCBiZSBpbiB0aGUgbm9ybWFsIHBvc2l0aW9uLi4uDQogRGlhbG9ndWU6IDAsMDowMDoyMS41MCwwOjAwOjIyLjUwLERlZmF1bHQsLDAsMCwwLCx7XGFuNX17XHBvcygwLDQ1KX1UaGlzIHRleHQgc2hvdWxkIE5PVCBiZSBpbiB0aGUgbm9ybWFsIHBvc2l0aW9uDQogRGlhbG9ndWU6IDAsMDowMDoyMi41MCwwOjAwOjI0LjUwLERlZmF1bHQsLDAsMCwwLCxJbXBsZW1lbnRhdGlvbiBpcyB0aGUgc2FtZSBvZiB0aGUgQVNTIHRhZ1xOe1xhbjh9VGhpcyB0ZXh0IHNob3VsZCBiZSBhdCB0aGVcTnRvcCBhbmQgaG9yaXpvbnRhbGx5IGNlbnRlcmVkDQpAQCAtMjksNyArMjksNyBAQAogRGlhbG9ndWU6IDAsMDowMDoyNi41MCwwOjAwOjI4LjUwLERlZmF1bHQsLDAsMCwwLCx7XGFuOX1UaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZVxOdG9wIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIHJpZ2h0DQogRGlhbG9ndWU6IDAsMDowMDoyNi41MCwwOjAwOjI4LjUwLERlZmF1bHQsLDAsMCwwLCx7XGFuNn1UaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZVxObWlkZGxlIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIHJpZ2h0DQogRGlhbG9ndWU6IDAsMDowMDoyNi41MCwwOjAwOjI4LjUwLERlZmF1bHQsLDAsMCwwLCx7XGFuM31UaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZVxOYm90dG9tIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIHJpZ2h0DQotRGlhbG9ndWU6IDAsMDowMDoyOC41MCwwOjAwOjMxLjUwLERlZmF1bHQsLDAsMCwwLCx7XGZzNn17XGMmSEZGMDAmfVRoaXMgY291bGQgYmUgdGhlIHtcZnMzNX1te1xjJkgwJn1ve1xjJkhGRjAwJn1zdHtcZnM2fSBkaWZmaWN1bHQgdGhpbmcgdG8gaW1wbGVtZW50e1xjfXtcZnN9DQorRGlhbG9ndWU6IDAsMDowMDoyOC41MCwwOjAwOjMxLjUwLERlZmF1bHQsLDAsMCwwLCx7XGMmSEZGMDAmfXtcZnM2fVRoaXMgY291bGQgYmUgdGhlIHtcZnMzNX1te1xjJkgwJn1ve1xjJkhGRjAwJn1zdHtcZnM2fSBkaWZmaWN1bHQgdGhpbmcgdG8gaW1wbGVtZW50e1xmc317XGN9DQogRGlhbG9ndWU6IDAsMDowMDozMS41MCwwOjAwOjUwLjUwLERlZmF1bHQsLDAsMCwwLCxGaXJzdCB0ZXh0DQogRGlhbG9ndWU6IDAsMDowMDozMy41MCwwOjAwOjM1LjUwLERlZmF1bHQsLDAsMCwwLCxTZWNvbmQsIGl0IHNob3VsZG4ndCBvdmVybGFwIGZpcnN0DQogRGlhbG9ndWU6IDAsMDowMDozNS41MCwwOjAwOjM3LjUwLERlZmF1bHQsLDAsMCwwLCxUaGlyZCwgaXQgc2hvdWxkIHJlcGxhY2Ugc2Vjb25kDQpAQCAtNDQsNiArNDQsNiBAQAogRGlhbG9ndWU6IDAsMDowMDo1Ni41MCwwOjAwOjU4LjUwLERlZmF1bHQsLDAsMCwwLCxcaFxoXGhcaFxoQSAoMDUgaGFyZCBzcGFjZXMgZm9sbG93ZWQgYnkgYSBsZXR0ZXIpXE5BIChOb3JtYWwgIHNwYWNlcyBmb2xsb3dlZCBieSBhIGxldHRlcilcTkEgKE5vIGhhcmQgc3BhY2VzIGZvbGxvd2VkIGJ5IGEgbGV0dGVyKVxOU2hvdyB0aGlzOiBcVEVTVCBhbmQgdGhpczogXC0pDQogRGlhbG9ndWU6IDAsMDowMDo1OC41MCwwOjAxOjAwLjUwLERlZmF1bHQsLDAsMCwwLCx7XGFuM31cTkEgbGV0dGVyIGZvbGxvd2VkIGJ5IDA1IGhhcmQgc3BhY2VzOiBBXGhcaFxoXGhcaFxOQSBsZXR0ZXIgZm9sbG93ZWQgYnkgbm9ybWFsICBzcGFjZXM6IEFcTkEgbGV0dGVyIGZvbGxvd2VkIGJ5IG5vIGhhcmQgc3BhY2VzOiBBXE4wNSBoYXJkICBzcGFjZXMgYmV0d2VlbiBsZXR0ZXJzOiBBXGhcaFxoXGhcaEFcTjUgbm9ybWFsIHNwYWNlcyBiZXR3ZWVuIGxldHRlcnM6IEEgICAgIEFcTlxOXi0tRm9yY2VkIGxpbmUgYnJlYWsNCiBEaWFsb2d1ZTogMCwwOjAxOjAwLjUwLDA6MDE6MDIuNTAsRGVmYXVsdCwsMCwwLDAsLHtcczF9Qm90aCBsaW5lIHNob3VsZCBiZSBzdHJpa2V0aHJvdWdoLFxOeWVzLntcczB9XE5Db3JyZWN0bHkgY2xvc2VkIHRhZ3NcTnNob3VsZCBiZSBoaWRkZW4uDQotRGlhbG9ndWU6IDAsMDowMTowMi41MCwwOjAxOjA0LjUwLERlZmF1bHQsLDAsMCwwLCxJdCBzaG91bGRuJ3QgYmUgc3RyaWtldGhyb3VnaCxcTm5vdCBvcGVuZWQgdGFnIHNob3dlZCBhcyB0ZXh0Ljwvcz5cTk5vdCBvcGVuZWQgdGFnIHNob3dlZCBhcyB0ZXh0LjwveHh4eHg+DQotRGlhbG9ndWU6IDAsMDowMTowNC41MCwwOjAxOjA2LjUwLERlZmF1bHQsLDAsMCwwLCx7XHMxfVRocmVlIGxpbmVzIHNob3VsZCBiZSBzdHJpa2V0aHJvdWdoLFxOeWVzLlxOPHl5eXk+Tm90IGNsb3NlZCB0YWdzIHNob3dlZCBhcyB0ZXh0DQotRGlhbG9ndWU6IDAsMDowMTowNi41MCwwOjAxOjA4LjUwLERlZmF1bHQsLDAsMCwwLCx7XHMxfUJvdGggbGluZSBzaG91bGQgYmUgc3RyaWtldGhyb3VnaCBidXRcTnRoZSB3cm9uZyBjbG9zaW5nIHRhZyBzaG91bGQgYmUgc2hvd2VkPC9iPg0KK0RpYWxvZ3VlOiAwLDA6MDE6MDIuNTAsMDowMTowNC41MCxEZWZhdWx0LCwwLDAsMCwsSXQgc2hvdWxkbid0IGJlIHN0cmlrZXRocm91Z2gsXE5ub3Qgb3BlbmVkIHRhZyBzaG93ZWQgYXMgdGV4dC57XHMwfVxOTm90IG9wZW5lZCB0YWcgc2hvd2VkIGFzIHRleHQuDQorRGlhbG9ndWU6IDAsMDowMTowNC41MCwwOjAxOjA2LjUwLERlZmF1bHQsLDAsMCwwLCx7XHMxfVRocmVlIGxpbmVzIHNob3VsZCBiZSBzdHJpa2V0aHJvdWdoLFxOeWVzLlxOTm90IGNsb3NlZCB0YWdzIHNob3dlZCBhcyB0ZXh0DQorRGlhbG9ndWU6IDAsMDowMTowNi41MCwwOjAxOjA4LjUwLERlZmF1bHQsLDAsMCwwLCx7XHMxfUJvdGggbGluZSBzaG91bGQgYmUgc3RyaWtldGhyb3VnaCBidXRcTnRoZSB3cm9uZyBjbG9zaW5nIHRhZyBzaG91bGQgYmUgc2hvd2Vke1xiMH0NCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdWItc3J0LWJhZHN5bnRheCBiL3Rlc3RzL3JlZi9mYXRlL3N1Yi1zcnQtYmFkc3ludGF4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NjFkM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zdWItc3J0LWJhZHN5bnRheApAQCAtMCwwICsxLDIyIEBACitbU2NyaXB0IEluZm9dDQorOyBTY3JpcHQgZ2VuZXJhdGVkIGJ5IEZGbXBlZy9MYXZjDQorU2NyaXB0VHlwZTogdjQuMDArDQorUGxheVJlc1g6IDM4NA0KK1BsYXlSZXNZOiAyODgNCisNCitbVjQrIFN0eWxlc10NCitGb3JtYXQ6IE5hbWUsIEZvbnRuYW1lLCBGb250c2l6ZSwgUHJpbWFyeUNvbG91ciwgU2Vjb25kYXJ5Q29sb3VyLCBPdXRsaW5lQ29sb3VyLCBCYWNrQ29sb3VyLCBCb2xkLCBJdGFsaWMsIFVuZGVybGluZSwgU3RyaWtlT3V0LCBTY2FsZVgsIFNjYWxlWSwgU3BhY2luZywgQW5nbGUsIEJvcmRlclN0eWxlLCBPdXRsaW5lLCBTaGFkb3csIEFsaWdubWVudCwgTWFyZ2luTCwgTWFyZ2luUiwgTWFyZ2luViwgRW5jb2RpbmcNCitTdHlsZTogRGVmYXVsdCxBcmlhbCwxNiwmSGZmZmZmZiwmSGZmZmZmZiwmSDAsJkgwLDAsMCwwLDAsMTAwLDEwMCwwLDAsMSwxLDAsMiwxMCwxMCwxMCwwDQorDQorW0V2ZW50c10NCitGb3JtYXQ6IExheWVyLCBTdGFydCwgRW5kLCBTdHlsZSwgTmFtZSwgTWFyZ2luTCwgTWFyZ2luUiwgTWFyZ2luViwgRWZmZWN0LCBUZXh0DQorRGlhbG9ndWU6IDAsMDowMDowMS4wMCwwOjAwOjAyLjMxLERlZmF1bHQsLDAsMCwwLCw8PDw8PDwgQW50ZXMgPDw8PDw8XE5FbGEgw6kgaHVtLi4uDQorRGlhbG9ndWU6IDAsMDowMToxMC4wMCwwOjAxOjE0LjUwLERlZmF1bHQsLDAsMCwwLCw+Pj4gUmViZWxTdWJUZWFtIDw8PA0KK0RpYWxvZ3VlOiAwLDA6MDI6MzcuNzUsMDowMjo0My43MCxEZWZhdWx0LCwwLDAsMCwse1xiMX1+QVNVS08gTUFSQ0ghflxOPj46PDxcTnRyYW5zbGF0aW9uIGJ5OiBjYW5naWlcTlJldGltaW5nIGJ5OiBmdXJyYW5zdXtcYjB9DQorRGlhbG9ndWU6IDAsMDowMzozOC4zMiwwOjAzOjQyLjc4LERlZmF1bHQsLDAsMCwwLCw8PFRIRSBISUdIIFJPTExFUlM+PlxOPDxHcmFuZGVzIEpvZ2Fkb3Jlcz4+DQorRGlhbG9ndWU6IDAsMDowNDo1MC40MywwOjA1OjAxLjAzLERlZmF1bHQsLDAsMCwwLCw8PGZsYXNoIGdvcmRvblxOcGlzb2RlIDRcTnNhaXNvbiAxPlxOd3d3LlNlcmllc1N1Yi5jb20+DQorRGlhbG9ndWU6IDAsMDoyMDozMS44NSwwOjIwOjU2Ljg0LERlZmF1bHQsLDAsMCwwLCx7XGMmSEZGRkYmfVxOPDw8PHd3dy5lZ2ZpcmUuY29tPj4+PntcY30NCitEaWFsb2d1ZTogMCwwOjM3OjU5LjY5LDA6Mzg6MDEuNTksRGVmYXVsdCwsMCwwLDAsLG1pbnQgYXN6dGFsdCBmb2dsYWx0YXRuaVxOYSA8PD5MZSBDaXJxdWUtYmVuLg0KK0RpYWxvZ3VlOiAwLDA6NTM6NDMuNzgsMDo1Mzo0NS45NCxEZWZhdWx0LCwwLDAsMCwsPDxUaGF0J3MgT0ssID4+IC0gaGUgY2FsbWVkIGhpbXNlbGYuDQorRGlhbG9ndWU6IDAsMDo1Mzo0Ni4yMiwwOjUzOjQ5LjA5LERlZmF1bHQsLDAsMCwwLCw8PGx0J3Mgbm90IGEgbG9uZyB3YXkgdG8gdGhlIGhvdGVsLFxOdGhlIGhvdGVsIGlzIHdpdGhpbiBlYXN5IHJlYWNoLg0KK0RpYWxvZ3VlOiAwLDI6MTE6MDAuNzQsMjoxMTowNS41NCxEZWZhdWx0LCwwLDAsMCwse1xiMX08PDwgw5PDjcOAw4rDkSDDksOIw4nDjCA8IDIwMTUgPiBVTkFDUyBURUFNID4+PntcYjB9DQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3ViLXRleHRlbmMgYi90ZXN0cy9yZWYvZmF0ZS9zdWItdGV4dGVuYwppbmRleCBjYjBkYjdmLi4zZWE1NmIzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zdWItdGV4dGVuYworKysgYi90ZXN0cy9yZWYvZmF0ZS9zdWItdGV4dGVuYwpAQCAtMTYsMTMgKzE2LDEzIEBACiBIaWRkZW4KIAogNAotMDA6MDA6MDQsNTAxIC0tPiAwMDowMDowNyw1MDEKKzAwOjAwOjA0LDUwMSAtLT4gMDA6MDA6MDcsNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIHNtYWxsDQogVGhpcyB0ZXh0IHNob3VsZCBiZSBub3JtYWwNCiBUaGlzIHRleHQgc2hvdWxkIGJlIGJpZwogCiA1Ci0wMDowMDowNyw1MDEgLS0+IDAwOjAwOjExLDUwMQorMDA6MDA6MDcsNTAxIC0tPiAwMDowMDoxMSw1MDAKIFRoaXMgc2hvdWxkIGJlIGFuIEUgd2l0aCBhbiBhY2NlbnQ6IMOIDQog5pel5pys6KqeDQogVGhpcyB0ZXh0IHNob3VsZCBiZSBib2xkLCBpdGFsaWNzIGFuZCB1bmRlcmxpbmUNCkBAIC0zMSw3ICszMSw3IEBACiBUaGlzIHRleHQgc2hvdWxkIGJlIGJpZyBhbmQgYnJvd24KIAogNgotMDA6MDA6MTEsNTAxIC0tPiAwMDowMDoxNCw1MDEKKzAwOjAwOjExLDUwMSAtLT4gMDA6MDA6MTQsNTAwCiBUaGlzIGxpbmUgc2hvdWxkIGJlIGJvbGQNCiBUaGlzIGxpbmUgc2hvdWxkIGJlIGl0YWxpY3MNCiBUaGlzIGxpbmUgc2hvdWxkIGJlIHVuZGVybGluZQ0KQEAgLTQwLDgzICs0MCw4MyBAQAogc2hvdWxkIGJlIHVuZGVybGluZQogCiA3Ci0wMDowMDoxNCw1MDEgLS0+IDAwOjAwOjE3LDUwMQorMDA6MDA6MTQsNTAxIC0tPiAwMDowMDoxNyw1MDAKID4NCiBJdCB3b3VsZCBiZSBhIGdvb2QgdGhpbmcgdG8NCiBoaWRlIGludmFsaWQgaHRtbCB0YWdzIHRoYXQgYXJlIGNsb3NlZCBhbmQgc2hvdyB0aGUgdGV4dCBpbiB0aGVtDQotPGludmFsaWRfdGFnX3VuY2xvc2VkPmJ1dCBzaG93IHVuLWNsb3NlZCBpbnZhbGlkIGh0bWwgdGFncw0KLVNob3cgbm90IG9wZW5lZCB0YWdzPC9pbnZhbGlkX3RhZ19ub3Rfb3BlbmVkPg0KK2J1dCBzaG93IHVuLWNsb3NlZCBpbnZhbGlkIGh0bWwgdGFncw0KK1Nob3cgbm90IG9wZW5lZCB0YWdzDQogPAogCiA4Ci0wMDowMDoxNyw1MDEgLS0+IDAwOjAwOjIwLDUwMQorMDA6MDA6MTcsNTAxIC0tPiAwMDowMDoyMCw1MDAKIGFuZCBhbHNvDQogaGlkZSBpbnZhbGlkIGh0bWwgdGFncyB3aXRoIHBhcmFtZXRlcnMgdGhhdCBhcmUgY2xvc2VkIGFuZCBzaG93IHRoZSB0ZXh0IGluIHRoZW0NCi08aW52YWxpZF90YWdfdWMgcGFyPTU+YnV0IHNob3cgdW4tY2xvc2VkIGludmFsaWQgaHRtbCB0YWdzDQorYnV0IHNob3cgdW4tY2xvc2VkIGludmFsaWQgaHRtbCB0YWdzDQogVGhpcyB0ZXh0IHNob3VsZCBiZSBzaG93ZWQgdW5kZXJsaW5lZCB3aXRob3V0IHByb2JsZW1zIGFsc286IDI8Myw1PjEsNDw2DQogVGhpcyBzaG91bGRuJ3QgYmUgdW5kZXJsaW5lZAogCiA5Ci0wMDowMDoyMCw1MDEgLS0+IDAwOjAwOjIxLDUwMQorMDA6MDA6MjAsNTAxIC0tPiAwMDowMDoyMSw1MDAKIFRoaXMgdGV4dCBzaG91bGQgYmUgaW4gdGhlIG5vcm1hbCBwb3NpdGlvbi4uLgogCiAxMAotMDA6MDA6MjEsNTAxIC0tPiAwMDowMDoyMiw1MDEKKzAwOjAwOjIxLDUwMSAtLT4gMDA6MDA6MjIsNTAwCiBUaGlzIHRleHQgc2hvdWxkIE5PVCBiZSBpbiB0aGUgbm9ybWFsIHBvc2l0aW9uCiAKIDExCi0wMDowMDoyMiw1MDEgLS0+IDAwOjAwOjI0LDUwMQorMDA6MDA6MjIsNTAxIC0tPiAwMDowMDoyNCw1MDAKIEltcGxlbWVudGF0aW9uIGlzIHRoZSBzYW1lIG9mIHRoZSBBU1MgdGFnDQogVGhpcyB0ZXh0IHNob3VsZCBiZSBhdCB0aGUNCiB0b3AgYW5kIGhvcml6b250YWxseSBjZW50ZXJlZAogCiAxMgotMDA6MDA6MjIsNTAxIC0tPiAwMDowMDoyNCw1MDEKKzAwOjAwOjIyLDUwMSAtLT4gMDA6MDA6MjQsNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQ0KIG1pZGRsZSBhbmQgaG9yaXpvbnRhbGx5IGNlbnRlcmVkCiAKIDEzCi0wMDowMDoyMiw1MDEgLS0+IDAwOjAwOjI0LDUwMQorMDA6MDA6MjIsNTAxIC0tPiAwMDowMDoyNCw1MDAKIFRoaXMgdGV4dCBzaG91bGQgYmUgYXQgdGhlDQogYm90dG9tIGFuZCBob3Jpem9udGFsbHkgY2VudGVyZWQKIAogMTQKLTAwOjAwOjI0LDUwMSAtLT4gMDA6MDA6MjYsNTAxCiswMDowMDoyNCw1MDEgLS0+IDAwOjAwOjI2LDUwMAogVGhpcyB0ZXh0IHNob3VsZCBiZSBhdCB0aGUNCiB0b3AgYW5kIGhvcml6b250YWxseSBhdCB0aGUgbGVmdAogCiAxNQotMDA6MDA6MjQsNTAxIC0tPiAwMDowMDoyNiw1MDEKKzAwOjAwOjI0LDUwMSAtLT4gMDA6MDA6MjYsNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQ0KIG1pZGRsZSBhbmQgaG9yaXpvbnRhbGx5IGF0IHRoZSBsZWZ0DQogKFRoZSBzZWNvbmQgcG9zaXRpb24gbXVzdCBiZSBpZ25vcmVkKQogCiAxNgotMDA6MDA6MjQsNTAxIC0tPiAwMDowMDoyNiw1MDEKKzAwOjAwOjI0LDUwMSAtLT4gMDA6MDA6MjYsNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQ0KIGJvdHRvbSBhbmQgaG9yaXpvbnRhbGx5IGF0IHRoZSBsZWZ0CiAKIDE3Ci0wMDowMDoyNiw1MDEgLS0+IDAwOjAwOjI4LDUwMQorMDA6MDA6MjYsNTAxIC0tPiAwMDowMDoyOCw1MDAKIFRoaXMgdGV4dCBzaG91bGQgYmUgYXQgdGhlDQogdG9wIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIHJpZ2h0CiAKIDE4Ci0wMDowMDoyNiw1MDEgLS0+IDAwOjAwOjI4LDUwMQorMDA6MDA6MjYsNTAxIC0tPiAwMDowMDoyOCw1MDAKIFRoaXMgdGV4dCBzaG91bGQgYmUgYXQgdGhlDQogbWlkZGxlIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIHJpZ2h0CiAKIDE5Ci0wMDowMDoyNiw1MDEgLS0+IDAwOjAwOjI4LDUwMQorMDA6MDA6MjYsNTAxIC0tPiAwMDowMDoyOCw1MDAKIFRoaXMgdGV4dCBzaG91bGQgYmUgYXQgdGhlDQogYm90dG9tIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIHJpZ2h0CiAKIDIwCi0wMDowMDoyOCw1MDEgLS0+IDAwOjAwOjMxLDUwMQorMDA6MDA6MjgsNTAxIC0tPiAwMDowMDozMSw1MDAKIFRoaXMgY291bGQgYmUgdGhlIG1vc3QgZGlmZmljdWx0IHRoaW5nIHRvIGltcGxlbWVudAogCiAyMQotMDA6MDA6MzEsNTAxIC0tPiAwMDowMDo1MCw1MDEKKzAwOjAwOjMxLDUwMSAtLT4gMDA6MDA6NTAsNTAwCiBGaXJzdCB0ZXh0CiAKIDIyCkBAIC0xMjQsMzggKzEyNCwzOCBAQAogU2Vjb25kLCBpdCBzaG91bGRuJ3Qgb3ZlcmxhcCBmaXJzdAogCiAyMwotMDA6MDA6MzUsNTAxIC0tPiAwMDowMDozNyw1MDEKKzAwOjAwOjM1LDUwMSAtLT4gMDA6MDA6MzcsNTAwCiBUaGlyZCwgaXQgc2hvdWxkIHJlcGxhY2Ugc2Vjb25kCiAKIDI0Ci0wMDowMDozNiw1MDEgLS0+IDAwOjAwOjUwLDUwMQorMDA6MDA6MzYsNTAxIC0tPiAwMDowMDo1MCw1MDAKIEZvdXJ0aCwgaXQgc2hvdWxkbid0IG92ZXJsYXAgZmlyc3QgYW5kIHRoaXJkCiAKIDI1Ci0wMDowMDo0MCw1MDEgLS0+IDAwOjAwOjQ1LDUwMQorMDA6MDA6NDAsNTAxIC0tPiAwMDowMDo0NSw1MDAKIEZpZnRoLCBpdCBzaG91bGQgcmVwbGFjZSB0aGlyZAogCiAyNgotMDA6MDA6NDUsNTAxIC0tPiAwMDowMDo1MCw1MDEKKzAwOjAwOjQ1LDUwMSAtLT4gMDA6MDA6NTAsNTAwCiBTaXh0aCwgaXQgc2hvdWxkbid0IGJlDQogc2hvd2VkIG92ZXJsYXBwZWQKIAogMjcKLTAwOjAwOjUwLDUwMSAtLT4gMDA6MDA6NTIsNTAxCiswMDowMDo1MCw1MDEgLS0+IDAwOjAwOjUyLDUwMAogVEVYVCAxIChib3R0b20pCiAKIDI4Ci0wMDowMDo1MCw1MDEgLS0+IDAwOjAwOjUyLDUwMQorMDA6MDA6NTAsNTAxIC0tPiAwMDowMDo1Miw1MDAKIHRleHQgMgogCiAyOQotMDA6MDA6NTIsNTAxIC0tPiAwMDowMDo1NCw1MDEKKzAwOjAwOjUyLDUwMSAtLT4gMDA6MDA6NTQsNTAwCiBIaWRlIHRoZXNlIHRhZ3M6DQogYWxzbyBoaWRlIHRoZXNlIHRhZ3M6DQogYnV0IHNob3cgdGhpczoge25vcm1hbCB0ZXh0fQogCiAzMAotMDA6MDA6NTQsNTAxIC0tPiAwMDowMTowMCw1MDEKKzAwOjAwOjU0LDUwMSAtLT4gMDA6MDE6MDAsNTAwCiANCiBcIE4gaXMgYSBmb3JjZWQgbGluZSBicmVhaw0KIFwgaCBpcyBhIGhhcmQgc3BhY2UNCkBAIC0xNjMsMjEgKzE2MywyMSBAQAogVGhlXGhsaW5lXGh3aWxsXGhuZXZlclxoYnJlYWtcaGF1dG9tYXRpY2FsbHlcaHJpZ2h0XGhiZWZvcmVcaG9yXGhhZnRlclxoYVxoaGFyZFxoc3BhY2UuXGg6LUQKIAogMzEKLTAwOjAwOjU0LDUwMSAtLT4gMDA6MDA6NTYsNTAxCiswMDowMDo1NCw1MDEgLS0+IDAwOjAwOjU2LDUwMAogDQogXGhcaFxoXGhcaEEgKDA1IGhhcmQgc3BhY2VzIGZvbGxvd2VkIGJ5IGEgbGV0dGVyKQ0KIEEgKE5vcm1hbCAgc3BhY2VzIGZvbGxvd2VkIGJ5IGEgbGV0dGVyKQ0KIEEgKE5vIGhhcmQgc3BhY2VzIGZvbGxvd2VkIGJ5IGEgbGV0dGVyKQogCiAzMgotMDA6MDA6NTYsNTAxIC0tPiAwMDowMDo1OCw1MDEKKzAwOjAwOjU2LDUwMSAtLT4gMDA6MDA6NTgsNTAwCiBcaFxoXGhcaFxoQSAoMDUgaGFyZCBzcGFjZXMgZm9sbG93ZWQgYnkgYSBsZXR0ZXIpDQogQSAoTm9ybWFsICBzcGFjZXMgZm9sbG93ZWQgYnkgYSBsZXR0ZXIpDQogQSAoTm8gaGFyZCBzcGFjZXMgZm9sbG93ZWQgYnkgYSBsZXR0ZXIpDQogU2hvdyB0aGlzOiBcVEVTVCBhbmQgdGhpczogXC0pCiAKIDMzCi0wMDowMDo1OCw1MDEgLS0+IDAwOjAxOjAwLDUwMQorMDA6MDA6NTgsNTAxIC0tPiAwMDowMTowMCw1MDAKIA0KIEEgbGV0dGVyIGZvbGxvd2VkIGJ5IDA1IGhhcmQgc3BhY2VzOiBBXGhcaFxoXGhcaA0KIEEgbGV0dGVyIGZvbGxvd2VkIGJ5IG5vcm1hbCAgc3BhY2VzOiBBDQpAQCAtMTg4LDI2ICsxODgsMjYgQEAKIF4tLUZvcmNlZCBsaW5lIGJyZWFrCiAKIDM0Ci0wMDowMTowMCw1MDEgLS0+IDAwOjAxOjAyLDUwMQorMDA6MDE6MDAsNTAxIC0tPiAwMDowMTowMiw1MDAKIEJvdGggbGluZSBzaG91bGQgYmUgc3RyaWtldGhyb3VnaCwNCiB5ZXMuDQogQ29ycmVjdGx5IGNsb3NlZCB0YWdzDQogc2hvdWxkIGJlIGhpZGRlbi4KIAogMzUKLTAwOjAxOjAyLDUwMSAtLT4gMDA6MDE6MDQsNTAxCiswMDowMTowMiw1MDEgLS0+IDAwOjAxOjA0LDUwMAogSXQgc2hvdWxkbid0IGJlIHN0cmlrZXRocm91Z2gsDQotbm90IG9wZW5lZCB0YWcgc2hvd2VkIGFzIHRleHQuPC9zPg0KLU5vdCBvcGVuZWQgdGFnIHNob3dlZCBhcyB0ZXh0LjwveHh4eHg+Citub3Qgb3BlbmVkIHRhZyBzaG93ZWQgYXMgdGV4dC4NCitOb3Qgb3BlbmVkIHRhZyBzaG93ZWQgYXMgdGV4dC4KIAogMzYKLTAwOjAxOjA0LDUwMSAtLT4gMDA6MDE6MDYsNTAxCiswMDowMTowNCw1MDEgLS0+IDAwOjAxOjA2LDUwMAogVGhyZWUgbGluZXMgc2hvdWxkIGJlIHN0cmlrZXRocm91Z2gsDQogeWVzLg0KLTx5eXl5Pk5vdCBjbG9zZWQgdGFncyBzaG93ZWQgYXMgdGV4dAorTm90IGNsb3NlZCB0YWdzIHNob3dlZCBhcyB0ZXh0CiAKIDM3Ci0wMDowMTowNiw1MDEgLS0+IDAwOjAxOjA4LDUwMQorMDA6MDE6MDYsNTAxIC0tPiAwMDowMTowOCw1MDAKIEJvdGggbGluZSBzaG91bGQgYmUgc3RyaWtldGhyb3VnaCBidXQNCi10aGUgd3JvbmcgY2xvc2luZyB0YWcgc2hvdWxkIGJlIHNob3dlZDwvYj4KK3RoZSB3cm9uZyBjbG9zaW5nIHRhZyBzaG91bGQgYmUgc2hvd2VkCiAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3N1Yi13ZWJ2dHRlbmMgYi90ZXN0cy9yZWYvZmF0ZS9zdWItd2VidnR0ZW5jCmluZGV4IGRiZWFkYjAuLjQ1YWUwYjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3N1Yi13ZWJ2dHRlbmMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc3ViLXdlYnZ0dGVuYwpAQCAtMTQsMTIgKzE0LDEyIEBACiAwMDowNC41MDAgLS0+IDAwOjA0LjUwMAogSGlkZGVuCiAKLTAwOjA0LjUwMSAtLT4gMDA6MDcuNTAxCiswMDowNC41MDEgLS0+IDAwOjA3LjUwMAogVGhpcyB0ZXh0IHNob3VsZCBiZSBzbWFsbAogVGhpcyB0ZXh0IHNob3VsZCBiZSBub3JtYWwKIFRoaXMgdGV4dCBzaG91bGQgYmUgYmlnCiAKLTAwOjA3LjUwMSAtLT4gMDA6MTEuNTAxCiswMDowNy41MDEgLS0+IDAwOjExLjUwMAogVGhpcyBzaG91bGQgYmUgYW4gRSB3aXRoIGFuIGFjY2VudDogw4gKIOaXpeacrOiqngogPGI+PGk+PHU+VGhpcyB0ZXh0IHNob3VsZCBiZSBib2xkLCBpdGFsaWNzIGFuZCB1bmRlcmxpbmU8L3U+PC9pPjwvYj4KQEAgLTI3LDcgKzI3LDcgQEAKIFRoaXMgdGV4dCBzaG91bGQgYmUgc21hbGwgYW5kIHJlZAogVGhpcyB0ZXh0IHNob3VsZCBiZSBiaWcgYW5kIGJyb3duCiAKLTAwOjExLjUwMSAtLT4gMDA6MTQuNTAxCiswMDoxMS41MDEgLS0+IDAwOjE0LjUwMAogPGI+VGhpcyBsaW5lIHNob3VsZCBiZSBib2xkPC9iPgogPGk+VGhpcyBsaW5lIHNob3VsZCBiZSBpdGFsaWNzPC9pPgogPHU+VGhpcyBsaW5lIHNob3VsZCBiZSB1bmRlcmxpbmU8L3U+CkBAIC0zNSwxMTggKzM1LDExOCBAQAogPHU+Qm90aCBsaW5lcwogc2hvdWxkIGJlIHVuZGVybGluZTwvdT4KIAotMDA6MTQuNTAxIC0tPiAwMDoxNy41MDEKKzAwOjE0LjUwMSAtLT4gMDA6MTcuNTAwCiA+CiBJdCB3b3VsZCBiZSBhIGdvb2QgdGhpbmcgdG8KIGhpZGUgaW52YWxpZCBodG1sIHRhZ3MgdGhhdCBhcmUgY2xvc2VkIGFuZCBzaG93IHRoZSB0ZXh0IGluIHRoZW0KLTxpbnZhbGlkX3RhZ191bmNsb3NlZD5idXQgc2hvdyB1bi1jbG9zZWQgaW52YWxpZCBodG1sIHRhZ3MKLVNob3cgbm90IG9wZW5lZCB0YWdzPC9pbnZhbGlkX3RhZ19ub3Rfb3BlbmVkPgorYnV0IHNob3cgdW4tY2xvc2VkIGludmFsaWQgaHRtbCB0YWdzCitTaG93IG5vdCBvcGVuZWQgdGFncwogPAogCi0wMDoxNy41MDEgLS0+IDAwOjIwLjUwMQorMDA6MTcuNTAxIC0tPiAwMDoyMC41MDAKIGFuZCBhbHNvCiBoaWRlIGludmFsaWQgaHRtbCB0YWdzIHdpdGggcGFyYW1ldGVycyB0aGF0IGFyZSBjbG9zZWQgYW5kIHNob3cgdGhlIHRleHQgaW4gdGhlbQotPGludmFsaWRfdGFnX3VjIHBhcj01PmJ1dCBzaG93IHVuLWNsb3NlZCBpbnZhbGlkIGh0bWwgdGFncworYnV0IHNob3cgdW4tY2xvc2VkIGludmFsaWQgaHRtbCB0YWdzCiA8dT5UaGlzIHRleHQgc2hvdWxkIGJlIHNob3dlZCB1bmRlcmxpbmVkIHdpdGhvdXQgcHJvYmxlbXMgYWxzbzogMjwzLDU+MSw0PDY8L3U+CiBUaGlzIHNob3VsZG4ndCBiZSB1bmRlcmxpbmVkCiAKLTAwOjIwLjUwMSAtLT4gMDA6MjEuNTAxCiswMDoyMC41MDEgLS0+IDAwOjIxLjUwMAogVGhpcyB0ZXh0IHNob3VsZCBiZSBpbiB0aGUgbm9ybWFsIHBvc2l0aW9uLi4uCiAKLTAwOjIxLjUwMSAtLT4gMDA6MjIuNTAxCiswMDoyMS41MDEgLS0+IDAwOjIyLjUwMAogVGhpcyB0ZXh0IHNob3VsZCBOT1QgYmUgaW4gdGhlIG5vcm1hbCBwb3NpdGlvbgogCi0wMDoyMi41MDEgLS0+IDAwOjI0LjUwMQorMDA6MjIuNTAxIC0tPiAwMDoyNC41MDAKIEltcGxlbWVudGF0aW9uIGlzIHRoZSBzYW1lIG9mIHRoZSBBU1MgdGFnCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQogdG9wIGFuZCBob3Jpem9udGFsbHkgY2VudGVyZWQKIAotMDA6MjIuNTAxIC0tPiAwMDoyNC41MDEKKzAwOjIyLjUwMSAtLT4gMDA6MjQuNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQogbWlkZGxlIGFuZCBob3Jpem9udGFsbHkgY2VudGVyZWQKIAotMDA6MjIuNTAxIC0tPiAwMDoyNC41MDEKKzAwOjIyLjUwMSAtLT4gMDA6MjQuNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQogYm90dG9tIGFuZCBob3Jpem9udGFsbHkgY2VudGVyZWQKIAotMDA6MjQuNTAxIC0tPiAwMDoyNi41MDEKKzAwOjI0LjUwMSAtLT4gMDA6MjYuNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQogdG9wIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIGxlZnQKIAotMDA6MjQuNTAxIC0tPiAwMDoyNi41MDEKKzAwOjI0LjUwMSAtLT4gMDA6MjYuNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQogbWlkZGxlIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIGxlZnQKIChUaGUgc2Vjb25kIHBvc2l0aW9uIG11c3QgYmUgaWdub3JlZCkKIAotMDA6MjQuNTAxIC0tPiAwMDoyNi41MDEKKzAwOjI0LjUwMSAtLT4gMDA6MjYuNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQogYm90dG9tIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIGxlZnQKIAotMDA6MjYuNTAxIC0tPiAwMDoyOC41MDEKKzAwOjI2LjUwMSAtLT4gMDA6MjguNTAwCiBUaGlzIHRleHQgc2hvdWxkIGJlIGF0IHRoZQogdG9wIGFuZCBob3Jpem9udGFsbHkgYXQgdGhlIHJpZ2h0CiAKLTAwOjI2LjUwMSAtLT4gMDA6MjguNTAxCiswMDoyNi41MDEgLS0+IDAwOjI4LjUwMAogVGhpcyB0ZXh0IHNob3VsZCBiZSBhdCB0aGUKIG1pZGRsZSBhbmQgaG9yaXpvbnRhbGx5IGF0IHRoZSByaWdodAogCi0wMDoyNi41MDEgLS0+IDAwOjI4LjUwMQorMDA6MjYuNTAxIC0tPiAwMDoyOC41MDAKIFRoaXMgdGV4dCBzaG91bGQgYmUgYXQgdGhlCiBib3R0b20gYW5kIGhvcml6b250YWxseSBhdCB0aGUgcmlnaHQKIAotMDA6MjguNTAxIC0tPiAwMDozMS41MDEKKzAwOjI4LjUwMSAtLT4gMDA6MzEuNTAwCiBUaGlzIGNvdWxkIGJlIHRoZSBtb3N0IGRpZmZpY3VsdCB0aGluZyB0byBpbXBsZW1lbnQKIAotMDA6MzEuNTAxIC0tPiAwMDo1MC41MDEKKzAwOjMxLjUwMSAtLT4gMDA6NTAuNTAwCiBGaXJzdCB0ZXh0CiAKIDAwOjMzLjUwMCAtLT4gMDA6MzUuNTAwCiBTZWNvbmQsIGl0IHNob3VsZG4ndCBvdmVybGFwIGZpcnN0CiAKLTAwOjM1LjUwMSAtLT4gMDA6MzcuNTAxCiswMDozNS41MDEgLS0+IDAwOjM3LjUwMAogVGhpcmQsIGl0IHNob3VsZCByZXBsYWNlIHNlY29uZAogCi0wMDozNi41MDEgLS0+IDAwOjUwLjUwMQorMDA6MzYuNTAxIC0tPiAwMDo1MC41MDAKIEZvdXJ0aCwgaXQgc2hvdWxkbid0IG92ZXJsYXAgZmlyc3QgYW5kIHRoaXJkCiAKLTAwOjQwLjUwMSAtLT4gMDA6NDUuNTAxCiswMDo0MC41MDEgLS0+IDAwOjQ1LjUwMAogRmlmdGgsIGl0IHNob3VsZCByZXBsYWNlIHRoaXJkCiAKLTAwOjQ1LjUwMSAtLT4gMDA6NTAuNTAxCiswMDo0NS41MDEgLS0+IDAwOjUwLjUwMAogU2l4dGgsIGl0IHNob3VsZG4ndCBiZQogc2hvd2VkIG92ZXJsYXBwZWQKIAotMDA6NTAuNTAxIC0tPiAwMDo1Mi41MDEKKzAwOjUwLjUwMSAtLT4gMDA6NTIuNTAwCiBURVhUIDEgKGJvdHRvbSkKIAotMDA6NTAuNTAxIC0tPiAwMDo1Mi41MDEKKzAwOjUwLjUwMSAtLT4gMDA6NTIuNTAwCiB0ZXh0IDIKIAotMDA6NTIuNTAxIC0tPiAwMDo1NC41MDEKKzAwOjUyLjUwMSAtLT4gMDA6NTQuNTAwCiBIaWRlIHRoZXNlIHRhZ3M6CiBhbHNvIGhpZGUgdGhlc2UgdGFnczoKIGJ1dCBzaG93IHRoaXM6IHtub3JtYWwgdGV4dH0KIAotMDA6NTQuNTAxIC0tPiAwMTowMC41MDEKKzAwOjU0LjUwMSAtLT4gMDE6MDAuNTAwCiAKIFwgTiBpcyBhIGZvcmNlZCBsaW5lIGJyZWFrCiBcIGggaXMgYSBoYXJkIHNwYWNlCiBOb3JtYWwgc3BhY2VzIGF0IHRoZSBzdGFydCBhbmQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSBhcmUgdHJpbW1lZCB3aGlsZSBoYXJkIHNwYWNlcyBhcmUgbm90IHRyaW1tZWQuCiBUaGVcaGxpbmVcaHdpbGxcaG5ldmVyXGhicmVha1xoYXV0b21hdGljYWxseVxocmlnaHRcaGJlZm9yZVxob3JcaGFmdGVyXGhhXGhoYXJkXGhzcGFjZS5caDotRAogCi0wMDo1NC41MDEgLS0+IDAwOjU2LjUwMQorMDA6NTQuNTAxIC0tPiAwMDo1Ni41MDAKIAogXGhcaFxoXGhcaEEgKDA1IGhhcmQgc3BhY2VzIGZvbGxvd2VkIGJ5IGEgbGV0dGVyKQogQSAoTm9ybWFsICBzcGFjZXMgZm9sbG93ZWQgYnkgYSBsZXR0ZXIpCiBBIChObyBoYXJkIHNwYWNlcyBmb2xsb3dlZCBieSBhIGxldHRlcikKIAotMDA6NTYuNTAxIC0tPiAwMDo1OC41MDEKKzAwOjU2LjUwMSAtLT4gMDA6NTguNTAwCiBcaFxoXGhcaFxoQSAoMDUgaGFyZCBzcGFjZXMgZm9sbG93ZWQgYnkgYSBsZXR0ZXIpCiBBIChOb3JtYWwgIHNwYWNlcyBmb2xsb3dlZCBieSBhIGxldHRlcikKIEEgKE5vIGhhcmQgc3BhY2VzIGZvbGxvd2VkIGJ5IGEgbGV0dGVyKQogU2hvdyB0aGlzOiBcVEVTVCBhbmQgdGhpczogXC0pCiAKLTAwOjU4LjUwMSAtLT4gMDE6MDAuNTAxCiswMDo1OC41MDEgLS0+IDAxOjAwLjUwMAogCiBBIGxldHRlciBmb2xsb3dlZCBieSAwNSBoYXJkIHNwYWNlczogQVxoXGhcaFxoXGgKIEEgbGV0dGVyIGZvbGxvd2VkIGJ5IG5vcm1hbCAgc3BhY2VzOiBBCkBAIC0xNTYsMjIgKzE1NiwyMiBAQAogCiBeLS1Gb3JjZWQgbGluZSBicmVhawogCi0wMTowMC41MDEgLS0+IDAxOjAyLjUwMQorMDE6MDAuNTAxIC0tPiAwMTowMi41MDAKIEJvdGggbGluZSBzaG91bGQgYmUgc3RyaWtldGhyb3VnaCwKIHllcy4KIENvcnJlY3RseSBjbG9zZWQgdGFncwogc2hvdWxkIGJlIGhpZGRlbi4KIAotMDE6MDIuNTAxIC0tPiAwMTowNC41MDEKKzAxOjAyLjUwMSAtLT4gMDE6MDQuNTAwCiBJdCBzaG91bGRuJ3QgYmUgc3RyaWtldGhyb3VnaCwKLW5vdCBvcGVuZWQgdGFnIHNob3dlZCBhcyB0ZXh0Ljwvcz4KLU5vdCBvcGVuZWQgdGFnIHNob3dlZCBhcyB0ZXh0LjwveHh4eHg+Citub3Qgb3BlbmVkIHRhZyBzaG93ZWQgYXMgdGV4dC4KK05vdCBvcGVuZWQgdGFnIHNob3dlZCBhcyB0ZXh0LgogCi0wMTowNC41MDEgLS0+IDAxOjA2LjUwMQorMDE6MDQuNTAxIC0tPiAwMTowNi41MDAKIFRocmVlIGxpbmVzIHNob3VsZCBiZSBzdHJpa2V0aHJvdWdoLAogeWVzLgotPHl5eXk+Tm90IGNsb3NlZCB0YWdzIHNob3dlZCBhcyB0ZXh0CitOb3QgY2xvc2VkIHRhZ3Mgc2hvd2VkIGFzIHRleHQKIAotMDE6MDYuNTAxIC0tPiAwMTowOC41MDEKKzAxOjA2LjUwMSAtLT4gMDE6MDguNTAwCiBCb3RoIGxpbmUgc2hvdWxkIGJlIHN0cmlrZXRocm91Z2ggYnV0Ci10aGUgd3JvbmcgY2xvc2luZyB0YWcgc2hvdWxkIGJlIHNob3dlZDwvYj4KK3RoZSB3cm9uZyBjbG9zaW5nIHRhZyBzaG91bGQgYmUgc2hvd2VkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdWIydmlkZW8gYi90ZXN0cy9yZWYvZmF0ZS9zdWIydmlkZW8KaW5kZXggM2EwM2NiZi4uNGUwMzRhNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc3ViMnZpZGVvCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N1YjJ2aWRlbwpAQCAtMSwxMCArMSwxNiBAQAogI2V4dHJhZGF0YSAxOiAgICAgIDE1MCwgMHg3Yzk5MjU4YgogI3RiIDA6IDEvNQotI3RiIDE6IDEvMTAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAwLzEKKyN0YiAxOiAxLzEwMDAwMDAKKyNtZWRpYV90eXBlIDE6IHN1YnRpdGxlCisjY29kZWNfaWQgMTogZHZkX3N1YnRpdGxlCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODNjMjdiODIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDUxODQwMCwgMHg0MDUxYzdmOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGZiMDBlMTdlCi0xLCAgICAgICAgNDk5LCAgICAgICAgNDk5LCAgICAgNDk2MCwgICAgIDEwMTUsIDB4MTllMDkyZDIsIEY9MHgwCisxLCAgICAgNDk5MDAwLCAgICAgNDk5MDAwLCAgNDk2MDAwMCwgICAgIDEwMTUsIDB4MTllMDkyZDIsIEY9MHgwCiAwLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MTkyYWJiNzQKIDAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDUxODQwMCwgMHg0NjY5YTg4YgogMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgNTE4NDAwLCAweGFhYmFiZTAwCkBAIC01MiwxMjkgKzU4LDEyOSBAQAogMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgNTE4NDAwLCAweGRlNjk2ODNmCiAwLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4N2RmMDhmYmEKIDAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgICAxNTM1NSwgICAgICAxNTM1NSwgICAgIDQ3MzMsICAgICAyMDk0LCAweDNjMTcxNDI1LCBGPTB4MAorMSwgICAxNTM1NTAwMCwgICAxNTM1NTAwMCwgIDQ3MzMwMDAsICAgICAyMDk0LCAweDNjMTcxNDI1LCBGPTB4MAogMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgNTE4NDAwLCAweDkwMjI4NWQ5CiAwLCAgICAgICAgMTAwLCAgICAgICAgMTAwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAgNDg3OTcsICAgICAgNDg3OTcsICAgICAyNTYwLCAgICAgMjQ4MCwgMHg3YzBlZGYyMSwgRj0weDAKKzEsICAgNDg3OTcwMDAsICAgNDg3OTcwMDAsICAyNTYwMDAwLCAgICAgMjQ4MCwgMHg3YzBlZGYyMSwgRj0weDAKIDAsICAgICAgICAyNDQsICAgICAgICAyNDQsICAgICAgICAxLCAgIDUxODQwMCwgMHg3YTExYzgxMgogMCwgICAgICAgIDI1NywgICAgICAgIDI1NywgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgIDUxNDMzLCAgICAgIDUxNDMzLCAgICAgMjM2NiwgICAgIDMwNTksIDB4Yzk1YjhhMDUsIEY9MHgwCisxLCAgIDUxNDMzMDAwLCAgIDUxNDMzMDAwLCAgMjM2NjAwMCwgICAgIDMwNTksIDB4Yzk1YjhhMDUsIEY9MHgwCiAwLCAgICAgICAgMjU4LCAgICAgICAgMjU4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MzRjZGRkZWUKIDAsICAgICAgICAyNjksICAgICAgICAyNjksICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgICA1MzkxMCwgICAgICA1MzkxMCwgICAgIDI2OTYsICAgICAyMDk1LCAweDYxYmIxNWVkLCBGPTB4MAorMSwgICA1MzkxMDAwMCwgICA1MzkxMDAwMCwgIDI2OTYwMDAsICAgICAyMDk1LCAweDYxYmIxNWVkLCBGPTB4MAogMCwgICAgICAgIDI3MCwgICAgICAgIDI3MCwgICAgICAgIDEsICAgNTE4NDAwLCAweDRkYjRjZTUxCiAwLCAgICAgICAgMjgzLCAgICAgICAgMjgzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAgNTY2NjMsICAgICAgNTY2NjMsICAgICAxMjYyLCAgICAgMTAxMywgMHhjOWFlODliNywgRj0weDAKKzEsICAgNTY2NjMwMDAsICAgNTY2NjMwMDAsICAxMjYyMDAwLCAgICAgMTAxMywgMHhjOWFlODliNywgRj0weDAKIDAsICAgICAgICAyODQsICAgICAgICAyODQsICAgICAgICAxLCAgIDUxODQwMCwgMHhlNmJjMGVhOQogMCwgICAgICAgIDI5MCwgICAgICAgIDI5MCwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgIDU4MDE0LCAgICAgIDU4MDE0LCAgICAgMTY2MSwgICAgICA5NjksIDB4ZTAxODc4ZjAsIEY9MHgwCisxLCAgIDU4MDE0MDAwLCAgIDU4MDE0MDAwLCAgMTY2MTAwMCwgICAgICA5NjksIDB4ZTAxODc4ZjAsIEY9MHgwCiAwLCAgICAgICAgMjkxLCAgICAgICAgMjkxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YTg2NDNhZjcKIDAsICAgICAgICAyOTgsICAgICAgICAyOTgsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgICA2NzcyNCwgICAgICA2NzcyNCwgICAgIDEzNjUsICAgICAgODQ0LCAweGU3ZGI0ZmMxLCBGPTB4MAorMSwgICA2NzcyNDAwMCwgICA2NzcyNDAwMCwgIDEzNjUwMDAsICAgICAgODQ0LCAweGU3ZGI0ZmMxLCBGPTB4MAogMCwgICAgICAgIDMzOSwgICAgICAgIDMzOSwgICAgICAgIDEsICAgNTE4NDAwLCAweGIxODg1YzY3CiAwLCAgICAgICAgMzQ1LCAgICAgICAgMzQ1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAgNjkxNzUsICAgICAgNjkxNzUsICAgICAxNTU4LCAgICAgIDgwMiwgMHhmNDg1MzFiYSwgRj0weDAKKzEsICAgNjkxNzUwMDAsICAgNjkxNzUwMDAsICAxNTU4MDAwLCAgICAgIDgwMiwgMHhmNDg1MzFiYSwgRj0weDAKIDAsICAgICAgICAzNDYsICAgICAgICAzNDYsICAgICAgICAxLCAgIDUxODQwMCwgMHgzNzhlM2ZkMAogMCwgICAgICAgIDM1NCwgICAgICAgIDM1NCwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgIDcwODE5LCAgICAgIDcwODE5LCAgICAgMTg2NSwgICAgIDE3MDksIDB4YjRkNWExYmQsIEY9MHgwCisxLCAgIDcwODE5MDAwLCAgIDcwODE5MDAwLCAgMTg2NTAwMCwgICAgIDE3MDksIDB4YjRkNWExYmQsIEY9MHgwCiAwLCAgICAgICAgMzU1LCAgICAgICAgMzU1LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YTM3ODI0NjkKIDAsICAgICAgICAzNjMsICAgICAgICAzNjMsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgICA3Mjc2MiwgICAgICA3Mjc2MiwgICAgIDE5NjgsICAgICAyNDM4LCAweDk5ZDdiYzgyLCBGPTB4MAorMSwgICA3Mjc2MjAwMCwgICA3Mjc2MjAwMCwgIDE5NjgwMDAsICAgICAyNDM4LCAweDk5ZDdiYzgyLCBGPTB4MAogMCwgICAgICAgIDM2NCwgICAgICAgIDM2NCwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhMjNhMGQ1CiAwLCAgICAgICAgMzc0LCAgICAgICAgMzc0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAgNzQ4MDYsICAgICAgNzQ4MDYsICAgICAxODMxLCAgICAgMjExNiwgMHg5NjUxNDA5NywgRj0weDAKKzEsICAgNzQ4MDYwMDAsICAgNzQ4MDYwMDAsICAxODMxMDAwLCAgICAgMjExNiwgMHg5NjUxNDA5NywgRj0weDAKIDAsICAgICAgICAzNzUsICAgICAgICAzNzUsICAgICAgICAxLCAgIDUxODQwMCwgMHgxMjlkZTJmOAogMCwgICAgICAgIDM4MywgICAgICAgIDM4MywgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgIDc2NzE2LCAgICAgIDc2NzE2LCAgICAgMTI2MiwgICAgIDE4MjIsIDB4ZWZjY2M3MmUsIEY9MHgwCisxLCAgIDc2NzE2MDAwLCAgIDc2NzE2MDAwLCAgMTI2MjAwMCwgICAgIDE4MjIsIDB4ZWZjY2M3MmUsIEY9MHgwCiAwLCAgICAgICAgMzg0LCAgICAgICAgMzg0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MTk3NzJmMGYKIDAsICAgICAgICAzOTAsICAgICAgICAzOTAsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgICA3ODA1MSwgICAgICA3ODA1MSwgICAgIDE1MjQsICAgICAgOTg3LCAweDdiOTI3YTI3LCBGPTB4MAorMSwgICA3ODA1MTAwMCwgICA3ODA1MTAwMCwgIDE1MjQwMDAsICAgICAgOTg3LCAweDdiOTI3YTI3LCBGPTB4MAogMCwgICAgICAgIDM5MSwgICAgICAgIDM5MSwgICAgICAgIDEsICAgNTE4NDAwLCAweDU2ZjU0ZTczCiAwLCAgICAgICAgMzk4LCAgICAgICAgMzk4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAgNzk2NDQsICAgICAgNzk2NDQsICAgICAyNjYyLCAgICAgMjk1NiwgMHgxOTA3NzhmNywgRj0weDAKKzEsICAgNzk2NDQwMDAsICAgNzk2NDQwMDAsICAyNjYyMDAwLCAgICAgMjk1NiwgMHgxOTA3NzhmNywgRj0weDAKIDAsICAgICAgICAzOTksICAgICAgICAzOTksICAgICAgICAxLCAgIDUxODQwMCwgMHgzMDBiNTI0NwotMSwgICAgICA4MjM4MCwgICAgICA4MjM4MCwgICAgIDI3NjQsICAgICAzMDk0LCAweGMwMjFiN2QzLCBGPTB4MAorMSwgICA4MjM4MDAwMCwgICA4MjM4MDAwMCwgIDI3NjQwMDAsICAgICAzMDk0LCAweGMwMjFiN2QzLCBGPTB4MAogMCwgICAgICAgIDQxMiwgICAgICAgIDQxMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCiAwLCAgICAgICAgNDEzLCAgICAgICAgNDEzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4NmZkMDI4ZmEKIDAsICAgICAgICA0MjYsICAgICAgICA0MjYsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgICA4NTIyNSwgICAgICA4NTIyNSwgICAgIDIzNjYsICAgICAyNTg1LCAweDc0ZDAwNDhmLCBGPTB4MAorMSwgICA4NTIyNTAwMCwgICA4NTIyNTAwMCwgIDIzNjYwMDAsICAgICAyNTg1LCAweDc0ZDAwNDhmLCBGPTB4MAogMCwgICAgICAgIDQyNywgICAgICAgIDQyNywgICAgICAgIDEsICAgNTE4NDAwLCAweDAxZjgwZTlkCiAwLCAgICAgICAgNDM4LCAgICAgICAgNDM4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAgODc2NTIsICAgICAgODc2NTIsICAgICAxODMxLCAgICAgIDYzNCwgMHg4ODMyZmRhMSwgRj0weDAKKzEsICAgODc2NTIwMDAsICAgODc2NTIwMDAsICAxODMxMDAwLCAgICAgIDYzNCwgMHg4ODMyZmRhMSwgRj0weDAKIDAsICAgICAgICA0MzksICAgICAgICA0MzksICAgICAgICAxLCAgIDUxODQwMCwgMHhiNDhkOTBjMAogMCwgICAgICAgIDQ0NywgICAgICAgIDQ0NywgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgIDkxNTMxLCAgICAgIDkxNTMxLCAgICAgMjMzMiwgICAgIDIwODAsIDB4OTdhMTE0NmYsIEY9MHgwCisxLCAgIDkxNTMxMDAwLCAgIDkxNTMxMDAwLCAgMjMzMjAwMCwgICAgIDIwODAsIDB4OTdhMTE0NmYsIEY9MHgwCiAwLCAgICAgICAgNDU4LCAgICAgICAgNDU4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4Y2I1YTAxNzMKIDAsICAgICAgICA0NjksICAgICAgICA0NjksICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgICA5NTUxMCwgICAgICA5NTUxMCwgICAgIDMyOTksICAgICAyOTY0LCAweDhiOGY2Njg0LCBGPTB4MAorMSwgICA5NTUxMDAwMCwgICA5NTUxMDAwMCwgIDMyOTkwMDAsICAgICAyOTY0LCAweDhiOGY2Njg0LCBGPTB4MAogMCwgICAgICAgIDQ3OCwgICAgICAgIDQ3OCwgICAgICAgIDEsICAgNTE4NDAwLCAweGI4YTMyM2U0CiAwLCAgICAgICAgNDk0LCAgICAgICAgNDk0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAgOTg4NzIsICAgICAgOTg4NzIsICAgICAyMTYxLCAgICAgMTg3NSwgMHg5MDAyZWY3MSwgRj0weDAKKzEsICAgOTg4NzIwMDAsICAgOTg4NzIwMDAsICAyMTYxMDAwLCAgICAgMTg3NSwgMHg5MDAyZWY3MSwgRj0weDAKIDAsICAgICAgICA0OTUsICAgICAgICA0OTUsICAgICAgICAxLCAgIDUxODQwMCwgMHhjNDM1MThiYQogMCwgICAgICAgIDUwNSwgICAgICAgIDUwNSwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgMTAxMTI0LCAgICAgMTAxMTI0LCAgICAgNDA5NiwgICAgIDM4NzIsIDB4MjBjNmVkOWMsIEY9MHgwCisxLCAgMTAxMTI0MDAwLCAgMTAxMTI0MDAwLCAgNDA5NjAwMCwgICAgIDM4NzIsIDB4MjBjNmVkOWMsIEY9MHgwCiAwLCAgICAgICAgNTA2LCAgICAgICAgNTA2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4MDRlMzg2OTIKIDAsICAgICAgICA1MjYsICAgICAgICA1MjYsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgIDEwNTMwMywgICAgIDEwNTMwMywgICAgIDI3MzAsICAgICAzMDk0LCAweGYyMDNhNjYzLCBGPTB4MAorMSwgIDEwNTMwMzAwMCwgIDEwNTMwMzAwMCwgIDI3MzAwMDAsICAgICAzMDk0LCAweGYyMDNhNjYzLCBGPTB4MAogMCwgICAgICAgIDUyNywgICAgICAgIDUyNywgICAgICAgIDEsICAgNTE4NDAwLCAweDg1NmIwZWU1CiAwLCAgICAgICAgNTQwLCAgICAgICAgNTQwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAxMDgxMDYsICAgICAxMDgxMDYsICAgICAyMDU5LCAgICAgMjQwNCwgMHg0MWE3YjQyOSwgRj0weDAKKzEsICAxMDgxMDYwMDAsICAxMDgxMDYwMDAsICAyMDU5MDAwLCAgICAgMjQwNCwgMHg0MWE3YjQyOSwgRj0weDAKIDAsICAgICAgICA1NDEsICAgICAgICA1NDEsICAgICAgICAxLCAgIDUxODQwMCwgMHgzZTViZWVlMgogMCwgICAgICAgIDU1MSwgICAgICAgIDU1MSwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgMTQxNTU2LCAgICAgMTQxNTU2LCAgICAgMTY2MSwgICAgIDEwODgsIDB4ZGUyMGFhMjAsIEY9MHgwCisxLCAgMTQxNTU2MDAwLCAgMTQxNTU2MDAwLCAgMTY2MTAwMCwgICAgIDEwODgsIDB4ZGUyMGFhMjAsIEY9MHgwCiAwLCAgICAgICAgNzA4LCAgICAgICAgNzA4LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YjhiYzEzNjUKIDAsICAgICAgICA3MTYsICAgICAgICA3MTYsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQogMCwgICAgICAgIDgxNywgICAgICAgIDgxNywgICAgICAgIDEsICAgNTE4NDAwLCAweDgzZWZhMzJkCi0xLCAgICAgMTYzNDQ1LCAgICAgMTYzNDQ1LCAgICAgMTMzMSwgICAgICAzMzksIDB4OGJkMTg2ZWYsIEY9MHgwCisxLCAgMTYzNDQ1MDAwLCAgMTYzNDQ1MDAwLCAgMTMzMTAwMCwgICAgICAzMzksIDB4OGJkMTg2ZWYsIEY9MHgwCiAwLCAgICAgICAgODI0LCAgICAgICAgODI0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKIDAsICAgICAgICA4NDAsICAgICAgICA4NDAsICAgICAgICAxLCAgIDUxODQwMCwgMHgwM2VhMGU5MAotMSwgICAgIDE2ODA0OSwgICAgIDE2ODA0OSwgICAgIDE5MDAsICAgICAxMzEyLCAweDBiZjIwZThkLCBGPTB4MAorMSwgIDE2ODA0OTAwMCwgIDE2ODA0OTAwMCwgIDE5MDAwMDAsICAgICAxMzEyLCAweDBiZjIwZThkLCBGPTB4MAogMCwgICAgICAgIDg1MCwgICAgICAgIDg1MCwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgMTcwMDM1LCAgICAgMTcwMDM1LCAgICAgMTUyNCwgICAgIDEyNzksIDB4YjZjMmRhZmUsIEY9MHgwCisxLCAgMTcwMDM1MDAwLCAgMTcwMDM1MDAwLCAgMTUyNDAwMCwgICAgIDEyNzksIDB4YjZjMmRhZmUsIEY9MHgwCiAwLCAgICAgICAgODUxLCAgICAgICAgODUxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4ODc4MDIzOWUKIDAsICAgICAgICA4NTgsICAgICAgICA4NTgsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQogMCwgICAgICAgIDg2MSwgICAgICAgIDg2MSwgICAgICAgIDEsICAgNTE4NDAwLCAweDZlYjcyMzQ3Ci0xLCAgICAgMTcyMjAzLCAgICAgMTcyMjAzLCAgICAgMTY5NSwgICAgIDE4MjYsIDB4OWExYWM3NjksIEY9MHgwCisxLCAgMTcyMjAzMDAwLCAgMTcyMjAzMDAwLCAgMTY5NTAwMCwgICAgIDE4MjYsIDB4OWExYWM3NjksIEY9MHgwCiAwLCAgICAgICAgODY5LCAgICAgICAgODY5LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAxNzM5NDcsICAgICAxNzM5NDcsICAgICAxOTM0LCAgICAgMTQ3NCwgMHhhOWIwM2NkYywgRj0weDAKKzEsICAxNzM5NDcwMDAsICAxNzM5NDcwMDAsICAxOTM0MDAwLCAgICAgMTQ3NCwgMHhhOWIwM2NkYywgRj0weDAKIDAsICAgICAgICA4NzAsICAgICAgICA4NzAsICAgICAgICAxLCAgIDUxODQwMCwgMHg5YzRhM2EzZAogMCwgICAgICAgIDg3OSwgICAgICAgIDg3OSwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgMTc1OTU3LCAgICAgMTc1OTU3LCAgICAgMTc2MywgICAgIDEwMTksIDB4MjA0MDkzNTUsIEY9MHgwCisxLCAgMTc1OTU3MDAwLCAgMTc1OTU3MDAwLCAgMTc2MzAwMCwgICAgIDEwMTksIDB4MjA0MDkzNTUsIEY9MHgwCiAwLCAgICAgICAgODgwLCAgICAgICAgODgwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YzllYmZhODkKIDAsICAgICAgICA4ODksICAgICAgICA4ODksICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQogMCwgICAgICAgIDk0NiwgICAgICAgIDk0NiwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhZjgwMWVmCi0xLCAgICAgMTg5Mjk1LCAgICAgMTg5Mjk1LCAgICAgMTk2OCwgICAgIDE1OTYsIDB4NDA4YzcyNmUsIEY9MHgwCisxLCAgMTg5Mjk1MDAwLCAgMTg5Mjk1MDAwLCAgMTk2ODAwMCwgICAgIDE1OTYsIDB4NDA4YzcyNmUsIEY9MHgwCiAwLCAgICAgICAgOTU2LCAgICAgICAgOTU2LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAxOTEzNTYsICAgICAxOTEzNTYsICAgICAxMjI4LCAgICAgMTUxNywgMHhhZThjNWMyYiwgRj0weDAKKzEsICAxOTEzNTYwMDAsICAxOTEzNTYwMDAsICAxMjI4MDAwLCAgICAgMTUxNywgMHhhZThjNWMyYiwgRj0weDAKIDAsICAgICAgICA5NTcsICAgICAgICA5NTcsICAgICAgICAxLCAgIDUxODQwMCwgMHg1OWY0ZTcyZgogMCwgICAgICAgIDk2MywgICAgICAgIDk2MywgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgMTkyNjQwLCAgICAgMTkyNjQwLCAgICAgMTc2MywgICAgIDI1MDYsIDB4YTQ1OGQ2ZDQsIEY9MHgwCisxLCAgMTkyNjQwMDAwLCAgMTkyNjQwMDAwLCAgMTc2MzAwMCwgICAgIDI1MDYsIDB4YTQ1OGQ2ZDQsIEY9MHgwCiAwLCAgICAgICAgOTY0LCAgICAgICAgOTY0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4OWQ1YjlkNjkKIDAsICAgICAgICA5NzIsICAgICAgICA5NzIsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgIDE5NTE5MywgICAgIDE5NTE5MywgICAgIDEwOTIsICAgICAxMDc0LCAweDM5N2JhOWE4LCBGPTB4MAorMSwgIDE5NTE5MzAwMCwgIDE5NTE5MzAwMCwgIDEwOTIwMDAsICAgICAxMDc0LCAweDM5N2JhOWE4LCBGPTB4MAogMCwgICAgICAgIDk3NiwgICAgICAgIDk3NiwgICAgICAgIDEsICAgNTE4NDAwLCAweDkyM2QxY2U3CiAwLCAgICAgICAgOTgxLCAgICAgICAgOTgxLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAxOTYzNjEsICAgICAxOTYzNjEsICAgICAxNTI0LCAgICAgMTcxNSwgMHg2OTVjYTQxZSwgRj0weDAKKzEsICAxOTYzNjEwMDAsICAxOTYzNjEwMDAsICAxNTI0MDAwLCAgICAgMTcxNSwgMHg2OTVjYTQxZSwgRj0weDAKIDAsICAgICAgICA5ODIsICAgICAgICA5ODIsICAgICAgICAxLCAgIDUxODQwMCwgMHg2ZTY1MmNkMgogMCwgICAgICAgIDk4OSwgICAgICAgIDk4OSwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgMTk3OTQ2LCAgICAgMTk3OTQ2LCAgICAgMTE2MCwgICAgICA3ODksIDB4YzYzYTE4OWUsIEY9MHgwCisxLCAgMTk3OTQ2MDAwLCAgMTk3OTQ2MDAwLCAgMTE2MDAwMCwgICAgICA3ODksIDB4YzYzYTE4OWUsIEY9MHgwCiAwLCAgICAgICAgOTkwLCAgICAgICAgOTkwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MjUxMTM5NjYKIDAsICAgICAgICA5OTYsICAgICAgICA5OTYsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgIDE5OTIzMCwgICAgIDE5OTIzMCwgICAgIDE2MjcsICAgICAxODQ2LCAweGVlYThjNTk5LCBGPTB4MAorMSwgIDE5OTIzMDAwMCwgIDE5OTIzMDAwMCwgIDE2MjcwMDAsICAgICAxODQ2LCAweGVlYThjNTk5LCBGPTB4MAogMCwgICAgICAgIDk5NywgICAgICAgIDk5NywgICAgICAgIDEsICAgNTE4NDAwLCAweDJkYzgzNjA5CiAwLCAgICAgICAxMDA0LCAgICAgICAxMDA0LCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKLTEsICAgICAyMDA5MjQsICAgICAyMDA5MjQsICAgICAxNzYzLCAgICAgIDkyMiwgMHhkNGE4NzIyMiwgRj0weDAKKzEsICAyMDA5MjQwMDAsICAyMDA5MjQwMDAsICAxNzYzMDAwLCAgICAgIDkyMiwgMHhkNGE4NzIyMiwgRj0weDAKIDAsICAgICAgIDEwMDUsICAgICAgIDEwMDUsICAgICAgICAxLCAgIDUxODQwMCwgMHg5MDQ4M2JjNgogMCwgICAgICAgMTAxMywgICAgICAgMTAxMywgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCiAwLCAgICAgICAxMDUzLCAgICAgICAxMDUzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4M2RlODZhYjcKLTEsICAgICAyMTA2MDAsICAgICAyMTA2MDAsICAgICAxODMxLCAgICAgIDY2NSwgMHg1NTU4MDEzNSwgRj0weDAKKzEsICAyMTA2MDAwMDAsICAyMTA2MDAwMDAsICAxODMxMDAwLCAgICAgIDY2NSwgMHg1NTU4MDEzNSwgRj0weDAKIDAsICAgICAgIDEwNjIsICAgICAgIDEwNjIsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQotMSwgICAgIDIxNDc3MSwgICAgIDIxNDc3MSwgICAgIDE1NTgsICAgICAxMjE2LCAweDUwZDFmNmM1LCBGPTB4MAorMSwgIDIxNDc3MTAwMCwgIDIxNDc3MTAwMCwgIDE1NTgwMDAsICAgICAxMjE2LCAweDUwZDFmNmM1LCBGPTB4MAogMCwgICAgICAgMTA3NCwgICAgICAgMTA3NCwgICAgICAgIDEsICAgNTE4NDAwLCAweDhjMzIwZTY4CiAwLCAgICAgICAxMDgyLCAgICAgICAxMDgyLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YmFiMTk3ZWEKIDAsICAgICAgIDExMjgsICAgICAgIDExMjgsICAgICAgICAxLCAgIDUxODQwMCwgMHg4MWU5NzdiMgotMSwgICAgIDIyNTY0MCwgICAgIDIyNTY0MCwgICAgIDIxMjcsICAgICAyMTMzLCAweDY3MGMxMWE1LCBGPTB4MAorMSwgIDIyNTY0MDAwMCwgIDIyNTY0MDAwMCwgIDIxMjcwMDAsICAgICAyMTMzLCAweDY3MGMxMWE1LCBGPTB4MAogMCwgICAgICAgMTEzOSwgICAgICAgMTEzOSwgICAgICAgIDEsICAgNTE4NDAwLCAweGJhYjE5N2VhCi0xLCAgICAgMjI3ODM0LCAgICAgMjI3ODM0LCAgICAgMTI2MiwgICAgIDEyNjQsIDB4YzFkOWZjNTcsIEY9MHgwCisxLCAgMjI3ODM0MDAwLCAgMjI3ODM0MDAwLCAgMTI2MjAwMCwgICAgIDEyNjQsIDB4YzFkOWZjNTcsIEY9MHgwCiAwLCAgICAgICAxMTQwLCAgICAgICAxMTQwLCAgICAgICAgMSwgICA1MTg0MDAsIDB4YjA0NmRkMzAKIDAsICAgICAgIDExNDUsICAgICAgIDExNDUsICAgICAgICAxLCAgIDUxODQwMCwgMHhiYWIxOTdlYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLTFiaXQtcmF3IGIvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLTFiaXQtcmF3CmluZGV4IDEyM2UyNDUuLmE1NWE1NDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci0xYml0LXJhdworKysgYi90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItMWJpdC1yYXcKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTEyeDUxMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzMjc2OCwgMHg2ZDE2ZTI0NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLTFiaXQtcmxlIGIvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLTFiaXQtcmxlCmluZGV4IDEyM2UyNDUuLmE1NWE1NDEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci0xYml0LXJsZQorKysgYi90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItMWJpdC1ybGUKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTEyeDUxMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzMjc2OCwgMHg2ZDE2ZTI0NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLTI0Yml0LXJhdyBiL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci0yNGJpdC1yYXcKaW5kZXggZmEwNTllZi4uZGM5NjYwOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLTI0Yml0LXJhdworKysgYi90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItMjRiaXQtcmF3CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMng1MTIKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA3ODY0MzIsIDB4YjRkNDE3YmYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci0yNGJpdC1ybGUgYi90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItMjRiaXQtcmxlCmluZGV4IGZhMDU5ZWYuLmRjOTY2MDkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci0yNGJpdC1ybGUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLTI0Yml0LXJsZQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MTJ4NTEyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNzg2NDMyLCAweGI0ZDQxN2JmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItOGJpdC1yYXcgYi90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItOGJpdC1yYXcKaW5kZXggNjU5YjQzMy4uOTRhMTAxNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLThiaXQtcmF3CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci04Yml0LXJhdwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MTJ4NTEyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNzg2NDMyLCAweGY0MzY0MDA4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItOGJpdC1ybGUgYi90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItOGJpdC1ybGUKaW5kZXggNjU5YjQzMy4uOTRhMTAxNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvc3VucmFzdGVyLThiaXQtcmxlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci04Yml0LXJsZQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA1MTJ4NTEyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNzg2NDMyLCAweGY0MzY0MDA4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdW5yYXN0ZXItOGJpdF9ncmF5LXJhdyBiL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci04Yml0X2dyYXktcmF3CmluZGV4IDQ1NWFmNWYuLmQzM2ExM2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci04Yml0X2dyYXktcmF3CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N1bnJhc3Rlci04Yml0X2dyYXktcmF3CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEwMjR4NzY4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNzg2NDMyLCAweDU4NTliNDhlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdnExIGIvdGVzdHMvcmVmL2ZhdGUvc3ZxMQppbmRleCAzYmNmNzE1Li5kNTNlMjk1IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zdnExCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N2cTEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDEyMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyMTYwMCwgMHg3ZjkzODllMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDIxNjAwLCAweGNlYmI4ODk2CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjE2MDAsIDB4ZWY1MTg2MGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3N2cTEtaGVhZGVyc3dhcCBiL3Rlc3RzL3JlZi9mYXRlL3N2cTEtaGVhZGVyc3dhcAppbmRleCBkOWY5NTk3Li44MWRmMjI3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zdnExLWhlYWRlcnN3YXAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc3ZxMS1oZWFkZXJzd2FwCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI5M3gxNzgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNTg4MTQsIDB4NWNhYWQwNGIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA1ODgxNCwgMHg5OGQ4Y2ViOAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDU4ODE0LCAweDg5MjVjZGIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdnEzIGIvdGVzdHMvcmVmL2ZhdGUvc3ZxMwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczZDEwYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9yZWYvZmF0ZS9zdnEzCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLSN0YiAwOiAxLzMwCi0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmM4MTA0NjUKLTAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgwMTBiNTc2NQotMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDJiZTExYTRlCi0wLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTk0NDVkMDYKLTAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgMHg2YjU0ZDgzYwotMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM4MzJiNzZhCi0wLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzgzMmI3NmEKLTAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgMHhlMTgzODVkYgotMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDg0N2Q0YmYwCi0wLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGQ2NTBmNTAKLTAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgMHg0Yjg1YzQ0YwotMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGNlMTkyN2E2Ci0wLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODkzNTM3NDcKLTAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg1OGRhNDNmMgotMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTE1MjAwLCAweGVlOWE0ZWVmCi0wLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2U5NDUzZDkKLTAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDExNTIwMCwgMHg4MDRhNWViMAotMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTE1MjAwLCAweGIzZDQ2NjA1Ci0wLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDViNTY2OGUKLTAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDExNTIwMCwgMHhkZDBkNGM1YQotMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDk5MTAxMzAxCi0wLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjBjM2YyNzIKLTAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYTIxZjhiMQotMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTE1MjAwLCAweGQ4ZTdmYmIxCi0wLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODlkOTBhYTEKLTAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDExNTIwMCwgMHg4ODJlMTlkYQotMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTE1MjAwLCAweGZjMGYyNzA5Ci0wLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWI3MzJmM2YKLTAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYzQ1M2NkYQotMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTE1MjAwLCAweGE3N2U0OTg5Ci0wLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWQ5MzU4MzQKLTAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDExNTIwMCwgMHgzYTVhNjE3NwotMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTE1MjAwLCAweGQzYzA3OTk5Ci0wLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZmFkMzg4ZGQKLTAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZjZlOTUyMAotMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGRiNjRhNGIzCi0wLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzZmOWI0OWUKLTAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NDQ2YzMxNQotMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDY2MGJkMDFjCi0wLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTYzZmRkN2QKLTAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDExNTIwMCwgMHg4NzMzZTdiMwotMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQxYWFmMWQ1Ci0wLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTgwM2ZkODEKLTAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDExNTIwMCwgMHhlMmI0MDc3ZgotMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGZlNjcwN2NiCi0wLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDI3YzEyMmQKLTAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDExNTIwMCwgMHhiY2I4MWVhOAotMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTE1MjAwLCAweGQyYWMyNDA1Ci0wLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2Q4OTMwMDYKLTAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDExNTIwMCwgMHhiZGNjM2JhOAotMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDgzZWQ0YzZiCi0wLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjllZTVlN2MKLTAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgIDExNTIwMCwgMHhmZTMxNzQxMQotMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgMTE1MjAwLCAweDg0OWU4NGU2Ci0wLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDQwZjk0NWYKLTAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgIDExNTIwMCwgMHg2NDgxYWM4OQotMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDhhNDhiZTllCi0wLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjE2MmNlOTQKLTAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgIDExNTIwMCwgMHgxNzhkZDY5YQotMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDY0ZmRlY2FhCi0wLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGI1MTI5N2UKLTAsICAgICAgICAgNjEsICAgICAgICAgNjEsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZDM5YTFhZQotMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDkwMGZkOTM5Ci0wLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzcwNGZiMTkKLTAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNDI2MTM3ZQotMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDlhMTEyNzA2Ci0wLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mjk0OTMxZjcKLTAsICAgICAgICAgNjcsICAgICAgICAgNjcsICAgICAgICAxLCAgIDExNTIwMCwgMHgwZDBlNDM3MgotMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDMzYmQ1MGU0Ci0wLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWM4NmUzZTIKLTAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MTRhZjVkNQotMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM1ZjlmY2QwCi0wLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTg0NjAyYmIKLTAsICAgICAgICAgNzMsICAgICAgICAgNzMsICAgICAgICAxLCAgIDExNTIwMCwgMHg2OTU4ZTllNgotMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDVhMjE0OTUyCi0wLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzA2Y2NhMGUKLTAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgIDExNTIwMCwgMHg2NzY4OTM2MwotMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgMTE1MjAwLCAweDQ1OWY0MTBjCi0wLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YThmNGMzNjUKLTAsICAgICAgICAgNzksICAgICAgICAgNzksICAgICAgICAxLCAgIDExNTIwMCwgMHhmMWZjNTBjNQotMCwgICAgICAgICA4MCwgICAgICAgICA4MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGMyMmFmNTQ1Ci0wLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDM5ODAyYTIKLTAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgIDExNTIwMCwgMHhiNzZjMDRiNgotMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgMTE1MjAwLCAweDdhNTQ4ZGI0Ci0wLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzllNTY3NjUKLTAsICAgICAgICAgODUsICAgICAgICAgODUsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZjI3M2ExNwotMCwgICAgICAgICA4NiwgICAgICAgICA4NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGUwNDM2NmRiCi0wLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGUxMDkzOWIKLTAsICAgICAgICAgODgsICAgICAgICAgODgsICAgICAgICAxLCAgIDExNTIwMCwgMHg0OTIyMGVhMgotMCwgICAgICAgICA4OSwgICAgICAgICA4OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM1MzYxODg5Ci0wLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWIyMGJkZmEKLTAsICAgICAgICAgOTEsICAgICAgICAgOTEsICAgICAgICAxLCAgIDExNTIwMCwgMHg1ZDQ3MmVhZgotMCwgICAgICAgICA5MiwgICAgICAgICA5MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGVkYTQzMDgxCi0wLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTliYWU4YjQKLTAsICAgICAgICAgOTQsICAgICAgICAgOTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhmMTI2ZDZhNAotMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDE4MTA2NDY0Ci0wLCAgICAgICAgIDk2LCAgICAgICAgIDk2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODU1MzBjNzMKLTAsICAgICAgICAgOTcsICAgICAgICAgOTcsICAgICAgICAxLCAgIDExNTIwMCwgMHhjZWYzMmM3OAotMCwgICAgICAgICA5OCwgICAgICAgICA5OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGZkNjIzM2EwCi0wLCAgICAgICAgIDk5LCAgICAgICAgIDk5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWU5ZDZmYzMKLTAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZDBjY2UxMAotMCwgICAgICAgIDEwMSwgICAgICAgIDEwMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGZjZTVmMTI0Ci0wLCAgICAgICAgMTAyLCAgICAgICAgMTAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTBiMTA4MDIKLTAsICAgICAgICAxMDMsICAgICAgICAxMDMsICAgICAgICAxLCAgIDExNTIwMCwgMHhlZWE0NDIwMQotMCwgICAgICAgIDEwNCwgICAgICAgIDEwNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDFjZWZiNTZkCi0wLCAgICAgICAgMTA1LCAgICAgICAgMTA1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDZkYWEwYjEKLTAsICAgICAgICAxMDYsICAgICAgICAxMDYsICAgICAgICAxLCAgIDExNTIwMCwgMHhkNzAwY2VmNAotMCwgICAgICAgIDEwNywgICAgICAgIDEwNywgICAgICAgIDEsICAgMTE1MjAwLCAweDM2ZGJmNThmCi0wLCAgICAgICAgMTA4LCAgICAgICAgMTA4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGIyMGQwNjAKLTAsICAgICAgICAxMDksICAgICAgICAxMDksICAgICAgICAxLCAgIDExNTIwMCwgMHg1Y2E2MWZkNQotMCwgICAgICAgIDExMCwgICAgICAgIDExMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDRmMjcxMzYxCi0wLCAgICAgICAgMTExLCAgICAgICAgMTExLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2FmMDM3NDMKLTAsICAgICAgICAxMTIsICAgICAgICAxMTIsICAgICAgICAxLCAgIDExNTIwMCwgMHg1MjBmMzUxYQotMCwgICAgICAgIDExMywgICAgICAgIDExMywgICAgICAgIDEsICAgMTE1MjAwLCAweDQwYmM3Yjg5Ci0wLCAgICAgICAgMTE0LCAgICAgICAgMTE0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDBhZjBiMDgKLTAsICAgICAgICAxMTUsICAgICAgICAxMTUsICAgICAgICAxLCAgIDExNTIwMCwgMHg2YTQ1MjkwYwotMCwgICAgICAgIDExNiwgICAgICAgIDExNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDU3MjEwYzE0Ci0wLCAgICAgICAgMTE3LCAgICAgICAgMTE3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzFlMjMzZjkKLTAsICAgICAgICAxMTgsICAgICAgICAxMTgsICAgICAgICAxLCAgIDExNTIwMCwgMHg5NmZkZmM1NAotMCwgICAgICAgIDExOSwgICAgICAgIDExOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQzYTgzNTljCi0wLCAgICAgICAgMTIwLCAgICAgICAgMTIwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDQ5M2JmZGUKLTAsICAgICAgICAxMjEsICAgICAgICAxMjEsICAgICAgICAxLCAgIDExNTIwMCwgMHhkNTMzOWQxMwotMCwgICAgICAgIDEyMiwgICAgICAgIDEyMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDc1NDJiYWEwCi0wLCAgICAgICAgMTIzLCAgICAgICAgMTIzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MjY4ZDJjYjkKLTAsICAgICAgICAxMjQsICAgICAgICAxMjQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZjM4ODhiYgotMCwgICAgICAgIDEyNSwgICAgICAgIDEyNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGI4MmY1MjBhCi0wLCAgICAgICAgMTI2LCAgICAgICAgMTI2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGZlYjI5ODEKLTAsICAgICAgICAxMjcsICAgICAgICAxMjcsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NTMxNGI1OAotMCwgICAgICAgIDEyOCwgICAgICAgIDEyOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGIyNmExOTNhCi0wLCAgICAgICAgMTI5LCAgICAgICAgMTI5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGZkZmZjMzgKLTAsICAgICAgICAxMzAsICAgICAgICAxMzAsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYzZhNTVmNQotMCwgICAgICAgIDEzMSwgICAgICAgIDEzMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGY2ZTM1NzE2Ci0wLCAgICAgICAgMTMyLCAgICAgICAgMTMyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NWNlODU0NGUKLTAsICAgICAgICAxMzMsICAgICAgICAxMzMsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZTM4ZGRjZQotMCwgICAgICAgIDEzNCwgICAgICAgIDEzNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDk2NGEyMDA2Ci0wLCAgICAgICAgMTM1LCAgICAgICAgMTM1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWJhMTM4ZDYKLTAsICAgICAgICAxMzYsICAgICAgICAxMzYsICAgICAgICAxLCAgIDExNTIwMCwgMHgyZjQ2OTQ5YwotMCwgICAgICAgIDEzNywgICAgICAgIDEzNywgICAgICAgIDEsICAgMTE1MjAwLCAweGJkYmRiNTg3Ci0wLCAgICAgICAgMTM4LCAgICAgICAgMTM4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWJmMTFlMWQKLTAsICAgICAgICAxMzksICAgICAgICAxMzksICAgICAgICAxLCAgIDExNTIwMCwgMHgyNjMyZjU1OAotMCwgICAgICAgIDE0MCwgICAgICAgIDE0MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDBlNTgwNzhiCi0wLCAgICAgICAgMTQxLCAgICAgICAgMTQxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmFiMmY5YmUKLTAsICAgICAgICAxNDIsICAgICAgICAxNDIsICAgICAgICAxLCAgIDExNTIwMCwgMHg5MjA1ZjFkOAotMCwgICAgICAgIDE0MywgICAgICAgIDE0MywgICAgICAgIDEsICAgMTE1MjAwLCAweDZhNGJkOTQ5Ci0wLCAgICAgICAgMTQ0LCAgICAgICAgMTQ0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWRjMTU1MmYKLTAsICAgICAgICAxNDUsICAgICAgICAxNDUsICAgICAgICAxLCAgIDExNTIwMCwgMHgwYTYwOTc0ZAotMCwgICAgICAgIDE0NiwgICAgICAgIDE0NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGUxYTE0MDBlCi0wLCAgICAgICAgMTQ3LCAgICAgICAgMTQ3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDVmMDY5NTIKLTAsICAgICAgICAxNDgsICAgICAgICAxNDgsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNTE2MzEyNQotMCwgICAgICAgIDE0OSwgICAgICAgIDE0OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDE1MWRhMTU2Ci0wLCAgICAgICAgMTUwLCAgICAgICAgMTUwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2YzNGIwNDgKLTAsICAgICAgICAxNTEsICAgICAgICAxNTEsICAgICAgICAxLCAgIDExNTIwMCwgMHhjZjdjMWU1ZAotMCwgICAgICAgIDE1MiwgICAgICAgIDE1MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGVkOWM0ZTFjCi0wLCAgICAgICAgMTUzLCAgICAgICAgMTUzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDdlMDY0NTMKLTAsICAgICAgICAxNTQsICAgICAgICAxNTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhjOGNlNmYxOQotMCwgICAgICAgIDE1NSwgICAgICAgIDE1NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGFjNjE5NjE5Ci0wLCAgICAgICAgMTU2LCAgICAgICAgMTU2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjQ3MTFlMmQKLTAsICAgICAgICAxNTcsICAgICAgICAxNTcsICAgICAgICAxLCAgIDExNTIwMCwgMHgxZjUwMmI1MgotMCwgICAgICAgIDE1OCwgICAgICAgIDE1OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDM5NTkyYzlkCi0wLCAgICAgICAgMTU5LCAgICAgICAgMTU5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2RmZmI5MDEKLTAsICAgICAgICAxNjAsICAgICAgICAxNjAsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNzVmYTNjZQotMCwgICAgICAgIDE2MSwgICAgICAgIDE2MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDYyNWJjOTc3Ci0wLCAgICAgICAgMTYyLCAgICAgICAgMTYyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTVjN2ZkYTMKLTAsICAgICAgICAxNjMsICAgICAgICAxNjMsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ZTVkMzViNQotMCwgICAgICAgIDE2NCwgICAgICAgIDE2NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGY4NDdjZjg4Ci0wLCAgICAgICAgMTY1LCAgICAgICAgMTY1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzEwODY3ZmUKLTAsICAgICAgICAxNjYsICAgICAgICAxNjYsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZTA3ZmJmYwotMCwgICAgICAgIDE2NywgICAgICAgIDE2NywgICAgICAgIDEsICAgMTE1MjAwLCAweGMxNTcxNTQyCi0wLCAgICAgICAgMTY4LCAgICAgICAgMTY4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGM3ZDU2MDIKLTAsICAgICAgICAxNjksICAgICAgICAxNjksICAgICAgICAxLCAgIDExNTIwMCwgMHhiZTcwNDVhYQotMCwgICAgICAgIDE3MCwgICAgICAgIDE3MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGM4YjQ4MzViCi0wLCAgICAgICAgMTcxLCAgICAgICAgMTcxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjliN2Q0MjcKLTAsICAgICAgICAxNzIsICAgICAgICAxNzIsICAgICAgICAxLCAgIDExNTIwMCwgMHg3ZmE3YzExMgotMCwgICAgICAgIDE3MywgICAgICAgIDE3MywgICAgICAgIDEsICAgMTE1MjAwLCAweGUwMTA1ZmViCi0wLCAgICAgICAgMTc0LCAgICAgICAgMTc0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzA3ODQ3NDAKLTAsICAgICAgICAxNzUsICAgICAgICAxNzUsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNjgwMWVmNQotMCwgICAgICAgIDE3NiwgICAgICAgIDE3NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDljZjM1OTIxCi0wLCAgICAgICAgMTc3LCAgICAgICAgMTc3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGQ5NTY2MzAKLTAsICAgICAgICAxNzgsICAgICAgICAxNzgsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MTdhMjVjMQotMCwgICAgICAgIDE3OSwgICAgICAgIDE3OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDhmNWUzOWRlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdnEzLTEgYi90ZXN0cy9yZWYvZmF0ZS9zdnEzLTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5MGM2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N2cTMtMQpAQCAtMCwwICsxLDE4NSBAQAorI3RiIDA6IDEvMzAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmM4MTA0NjUKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgwMTBiNTc2NQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDJiZTExYTRlCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTk0NDVkMDYKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDExNTIwMCwgMHg2YjU0ZDgzYworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM4MzJiNzZhCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzgzMmI3NmEKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDExNTIwMCwgMHhlMTgzODVkYgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDg0N2Q0YmYwCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGQ2NTBmNTAKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDExNTIwMCwgMHg0Yjg1YzQ0YworMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGNlMTkyN2E2CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODkzNTM3NDcKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg1OGRhNDNmMgorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTE1MjAwLCAweGVlOWE0ZWVmCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2U5NDUzZDkKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDExNTIwMCwgMHg4MDRhNWViMAorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTE1MjAwLCAweGIzZDQ2NjA1CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDViNTY2OGUKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDExNTIwMCwgMHhkZDBkNGM1YQorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDk5MTAxMzAxCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjBjM2YyNzIKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYTIxZjhiMQorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTE1MjAwLCAweGQ4ZTdmYmIxCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODlkOTBhYTEKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDExNTIwMCwgMHg4ODJlMTlkYQorMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTE1MjAwLCAweGZjMGYyNzA5CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWI3MzJmM2YKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYzQ1M2NkYQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTE1MjAwLCAweGE3N2U0OTg5CiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWQ5MzU4MzQKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDExNTIwMCwgMHgzYTVhNjE3NworMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTE1MjAwLCAweGQzYzA3OTk5CiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZmFkMzg4ZGQKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZjZlOTUyMAorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGRiNjRhNGIzCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzZmOWI0OWUKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NDQ2YzMxNQorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDY2MGJkMDFjCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTYzZmRkN2QKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDExNTIwMCwgMHg4NzMzZTdiMworMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQxYWFmMWQ1CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTgwM2ZkODEKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDExNTIwMCwgMHhlMmI0MDc3ZgorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGZlNjcwN2NiCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDI3YzEyMmQKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDExNTIwMCwgMHhiY2I4MWVhOAorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTE1MjAwLCAweGQyYWMyNDA1CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2Q4OTMwMDYKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDExNTIwMCwgMHhiZGNjM2JhOAorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDgzZWQ0YzZiCiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjllZTVlN2MKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgIDExNTIwMCwgMHhmZTMxNzQxMQorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgMTE1MjAwLCAweDg0OWU4NGU2CiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDQwZjk0NWYKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgIDExNTIwMCwgMHg2NDgxYWM4OQorMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDhhNDhiZTllCiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjE2MmNlOTQKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgIDExNTIwMCwgMHgxNzhkZDY5YQorMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDY0ZmRlY2FhCiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGI1MTI5N2UKKzAsICAgICAgICAgNjEsICAgICAgICAgNjEsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZDM5YTFhZQorMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDkwMGZkOTM5CiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzcwNGZiMTkKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNDI2MTM3ZQorMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDlhMTEyNzA2CiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Mjk0OTMxZjcKKzAsICAgICAgICAgNjcsICAgICAgICAgNjcsICAgICAgICAxLCAgIDExNTIwMCwgMHgwZDBlNDM3MgorMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDMzYmQ1MGU0CiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWM4NmUzZTIKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MTRhZjVkNQorMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM1ZjlmY2QwCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTg0NjAyYmIKKzAsICAgICAgICAgNzMsICAgICAgICAgNzMsICAgICAgICAxLCAgIDExNTIwMCwgMHg2OTU4ZTllNgorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDVhMjE0OTUyCiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzA2Y2NhMGUKKzAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgIDExNTIwMCwgMHg2NzY4OTM2MworMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgMTE1MjAwLCAweDQ1OWY0MTBjCiswLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YThmNGMzNjUKKzAsICAgICAgICAgNzksICAgICAgICAgNzksICAgICAgICAxLCAgIDExNTIwMCwgMHhmMWZjNTBjNQorMCwgICAgICAgICA4MCwgICAgICAgICA4MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGMyMmFmNTQ1CiswLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDM5ODAyYTIKKzAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgIDExNTIwMCwgMHhiNzZjMDRiNgorMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgMTE1MjAwLCAweDdhNTQ4ZGI0CiswLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzllNTY3NjUKKzAsICAgICAgICAgODUsICAgICAgICAgODUsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZjI3M2ExNworMCwgICAgICAgICA4NiwgICAgICAgICA4NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGUwNDM2NmRiCiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGUxMDkzOWIKKzAsICAgICAgICAgODgsICAgICAgICAgODgsICAgICAgICAxLCAgIDExNTIwMCwgMHg0OTIyMGVhMgorMCwgICAgICAgICA4OSwgICAgICAgICA4OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM1MzYxODg5CiswLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWIyMGJkZmEKKzAsICAgICAgICAgOTEsICAgICAgICAgOTEsICAgICAgICAxLCAgIDExNTIwMCwgMHg1ZDQ3MmVhZgorMCwgICAgICAgICA5MiwgICAgICAgICA5MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGVkYTQzMDgxCiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTliYWU4YjQKKzAsICAgICAgICAgOTQsICAgICAgICAgOTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhmMTI2ZDZhNAorMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDE4MTA2NDY0CiswLCAgICAgICAgIDk2LCAgICAgICAgIDk2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODU1MzBjNzMKKzAsICAgICAgICAgOTcsICAgICAgICAgOTcsICAgICAgICAxLCAgIDExNTIwMCwgMHhjZWYzMmM3OAorMCwgICAgICAgICA5OCwgICAgICAgICA5OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGZkNjIzM2EwCiswLCAgICAgICAgIDk5LCAgICAgICAgIDk5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWU5ZDZmYzMKKzAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZDBjY2UxMAorMCwgICAgICAgIDEwMSwgICAgICAgIDEwMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGZjZTVmMTI0CiswLCAgICAgICAgMTAyLCAgICAgICAgMTAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTBiMTA4MDIKKzAsICAgICAgICAxMDMsICAgICAgICAxMDMsICAgICAgICAxLCAgIDExNTIwMCwgMHhlZWE0NDIwMQorMCwgICAgICAgIDEwNCwgICAgICAgIDEwNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDFjZWZiNTZkCiswLCAgICAgICAgMTA1LCAgICAgICAgMTA1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDZkYWEwYjEKKzAsICAgICAgICAxMDYsICAgICAgICAxMDYsICAgICAgICAxLCAgIDExNTIwMCwgMHhkNzAwY2VmNAorMCwgICAgICAgIDEwNywgICAgICAgIDEwNywgICAgICAgIDEsICAgMTE1MjAwLCAweDM2ZGJmNThmCiswLCAgICAgICAgMTA4LCAgICAgICAgMTA4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGIyMGQwNjAKKzAsICAgICAgICAxMDksICAgICAgICAxMDksICAgICAgICAxLCAgIDExNTIwMCwgMHg1Y2E2MWZkNQorMCwgICAgICAgIDExMCwgICAgICAgIDExMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDRmMjcxMzYxCiswLCAgICAgICAgMTExLCAgICAgICAgMTExLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2FmMDM3NDMKKzAsICAgICAgICAxMTIsICAgICAgICAxMTIsICAgICAgICAxLCAgIDExNTIwMCwgMHg1MjBmMzUxYQorMCwgICAgICAgIDExMywgICAgICAgIDExMywgICAgICAgIDEsICAgMTE1MjAwLCAweDQwYmM3Yjg5CiswLCAgICAgICAgMTE0LCAgICAgICAgMTE0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDBhZjBiMDgKKzAsICAgICAgICAxMTUsICAgICAgICAxMTUsICAgICAgICAxLCAgIDExNTIwMCwgMHg2YTQ1MjkwYworMCwgICAgICAgIDExNiwgICAgICAgIDExNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDU3MjEwYzE0CiswLCAgICAgICAgMTE3LCAgICAgICAgMTE3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzFlMjMzZjkKKzAsICAgICAgICAxMTgsICAgICAgICAxMTgsICAgICAgICAxLCAgIDExNTIwMCwgMHg5NmZkZmM1NAorMCwgICAgICAgIDExOSwgICAgICAgIDExOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQzYTgzNTljCiswLCAgICAgICAgMTIwLCAgICAgICAgMTIwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDQ5M2JmZGUKKzAsICAgICAgICAxMjEsICAgICAgICAxMjEsICAgICAgICAxLCAgIDExNTIwMCwgMHhkNTMzOWQxMworMCwgICAgICAgIDEyMiwgICAgICAgIDEyMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDc1NDJiYWEwCiswLCAgICAgICAgMTIzLCAgICAgICAgMTIzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MjY4ZDJjYjkKKzAsICAgICAgICAxMjQsICAgICAgICAxMjQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZjM4ODhiYgorMCwgICAgICAgIDEyNSwgICAgICAgIDEyNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGI4MmY1MjBhCiswLCAgICAgICAgMTI2LCAgICAgICAgMTI2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGZlYjI5ODEKKzAsICAgICAgICAxMjcsICAgICAgICAxMjcsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NTMxNGI1OAorMCwgICAgICAgIDEyOCwgICAgICAgIDEyOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGIyNmExOTNhCiswLCAgICAgICAgMTI5LCAgICAgICAgMTI5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGZkZmZjMzgKKzAsICAgICAgICAxMzAsICAgICAgICAxMzAsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYzZhNTVmNQorMCwgICAgICAgIDEzMSwgICAgICAgIDEzMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGY2ZTM1NzE2CiswLCAgICAgICAgMTMyLCAgICAgICAgMTMyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NWNlODU0NGUKKzAsICAgICAgICAxMzMsICAgICAgICAxMzMsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZTM4ZGRjZQorMCwgICAgICAgIDEzNCwgICAgICAgIDEzNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDk2NGEyMDA2CiswLCAgICAgICAgMTM1LCAgICAgICAgMTM1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWJhMTM4ZDYKKzAsICAgICAgICAxMzYsICAgICAgICAxMzYsICAgICAgICAxLCAgIDExNTIwMCwgMHgyZjQ2OTQ5YworMCwgICAgICAgIDEzNywgICAgICAgIDEzNywgICAgICAgIDEsICAgMTE1MjAwLCAweGJkYmRiNTg3CiswLCAgICAgICAgMTM4LCAgICAgICAgMTM4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWJmMTFlMWQKKzAsICAgICAgICAxMzksICAgICAgICAxMzksICAgICAgICAxLCAgIDExNTIwMCwgMHgyNjMyZjU1OAorMCwgICAgICAgIDE0MCwgICAgICAgIDE0MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDBlNTgwNzhiCiswLCAgICAgICAgMTQxLCAgICAgICAgMTQxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmFiMmY5YmUKKzAsICAgICAgICAxNDIsICAgICAgICAxNDIsICAgICAgICAxLCAgIDExNTIwMCwgMHg5MjA1ZjFkOAorMCwgICAgICAgIDE0MywgICAgICAgIDE0MywgICAgICAgIDEsICAgMTE1MjAwLCAweDZhNGJkOTQ5CiswLCAgICAgICAgMTQ0LCAgICAgICAgMTQ0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWRjMTU1MmYKKzAsICAgICAgICAxNDUsICAgICAgICAxNDUsICAgICAgICAxLCAgIDExNTIwMCwgMHgwYTYwOTc0ZAorMCwgICAgICAgIDE0NiwgICAgICAgIDE0NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGUxYTE0MDBlCiswLCAgICAgICAgMTQ3LCAgICAgICAgMTQ3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDVmMDY5NTIKKzAsICAgICAgICAxNDgsICAgICAgICAxNDgsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNTE2MzEyNQorMCwgICAgICAgIDE0OSwgICAgICAgIDE0OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDE1MWRhMTU2CiswLCAgICAgICAgMTUwLCAgICAgICAgMTUwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2YzNGIwNDgKKzAsICAgICAgICAxNTEsICAgICAgICAxNTEsICAgICAgICAxLCAgIDExNTIwMCwgMHhjZjdjMWU1ZAorMCwgICAgICAgIDE1MiwgICAgICAgIDE1MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGVkOWM0ZTFjCiswLCAgICAgICAgMTUzLCAgICAgICAgMTUzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDdlMDY0NTMKKzAsICAgICAgICAxNTQsICAgICAgICAxNTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhjOGNlNmYxOQorMCwgICAgICAgIDE1NSwgICAgICAgIDE1NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGFjNjE5NjE5CiswLCAgICAgICAgMTU2LCAgICAgICAgMTU2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjQ3MTFlMmQKKzAsICAgICAgICAxNTcsICAgICAgICAxNTcsICAgICAgICAxLCAgIDExNTIwMCwgMHgxZjUwMmI1MgorMCwgICAgICAgIDE1OCwgICAgICAgIDE1OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDM5NTkyYzlkCiswLCAgICAgICAgMTU5LCAgICAgICAgMTU5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2RmZmI5MDEKKzAsICAgICAgICAxNjAsICAgICAgICAxNjAsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNzVmYTNjZQorMCwgICAgICAgIDE2MSwgICAgICAgIDE2MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDYyNWJjOTc3CiswLCAgICAgICAgMTYyLCAgICAgICAgMTYyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTVjN2ZkYTMKKzAsICAgICAgICAxNjMsICAgICAgICAxNjMsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ZTVkMzViNQorMCwgICAgICAgIDE2NCwgICAgICAgIDE2NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGY4NDdjZjg4CiswLCAgICAgICAgMTY1LCAgICAgICAgMTY1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzEwODY3ZmUKKzAsICAgICAgICAxNjYsICAgICAgICAxNjYsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZTA3ZmJmYworMCwgICAgICAgIDE2NywgICAgICAgIDE2NywgICAgICAgIDEsICAgMTE1MjAwLCAweGMxNTcxNTQyCiswLCAgICAgICAgMTY4LCAgICAgICAgMTY4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGM3ZDU2MDIKKzAsICAgICAgICAxNjksICAgICAgICAxNjksICAgICAgICAxLCAgIDExNTIwMCwgMHhiZTcwNDVhYQorMCwgICAgICAgIDE3MCwgICAgICAgIDE3MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGM4YjQ4MzViCiswLCAgICAgICAgMTcxLCAgICAgICAgMTcxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjliN2Q0MjcKKzAsICAgICAgICAxNzIsICAgICAgICAxNzIsICAgICAgICAxLCAgIDExNTIwMCwgMHg3ZmE3YzExMgorMCwgICAgICAgIDE3MywgICAgICAgIDE3MywgICAgICAgIDEsICAgMTE1MjAwLCAweGUwMTA1ZmViCiswLCAgICAgICAgMTc0LCAgICAgICAgMTc0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzA3ODQ3NDAKKzAsICAgICAgICAxNzUsICAgICAgICAxNzUsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNjgwMWVmNQorMCwgICAgICAgIDE3NiwgICAgICAgIDE3NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDljZjM1OTIxCiswLCAgICAgICAgMTc3LCAgICAgICAgMTc3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGQ5NTY2MzAKKzAsICAgICAgICAxNzgsICAgICAgICAxNzgsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MTdhMjVjMQorMCwgICAgICAgIDE3OSwgICAgICAgIDE3OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDhmNWUzOWRlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zdnEzLTIgYi90ZXN0cy9yZWYvZmF0ZS9zdnEzLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4OWMwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3N2cTMtMgpAQCAtMCwwICsxLDI0IEBACisjdGIgMDogMS8yNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNDgweDI1NworI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE4NTI4MCwgMHgwNDQyMDljNAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTg1MjgwLCAweDQyN2VmOWE3CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxODUyODAsIDB4OGY3NzFjYzgKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDE4NTI4MCwgMHhiNDBkMGU1MgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTg1MjgwLCAweDJlNmVlNDYxCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxODUyODAsIDB4NjgxYmE1MTMKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDE4NTI4MCwgMHg5OThjNTY3NgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTg1MjgwLCAweGY5MTAwM2VjCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxODUyODAsIDB4MzIyZWQzZGUKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDE4NTI4MCwgMHhiMWM5MzcwYQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTg1MjgwLCAweDQxNDIzYjM2CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxODUyODAsIDB4MGI5Mjg0ZTQKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDE4NTI4MCwgMHgxODU3ODliMgorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTg1MjgwLCAweDhmMGJlY2UwCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxODUyODAsIDB4ZmNkOTQ1MGUKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDE4NTI4MCwgMHg1MDlkODY4YgorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTg1MjgwLCAweDcxZmQ5YWUzCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxODUyODAsIDB4M2RhZDFiM2MKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDE4NTI4MCwgMHg2OWJhMzdkZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvc3ZxMy13YXRlcm1hcmsgYi90ZXN0cy9yZWYvZmF0ZS9zdnEzLXdhdGVybWFyawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDA2OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvc3ZxMy13YXRlcm1hcmsKQEAgLTAsMCArMSwxNCBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI4NHgyNDAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMDIyNDAsIDB4YjNjYmY4M2IKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDEwMjI0MCwgMHhjOGMyYTcwNAorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTAyMjQwLCAweDE5ZGQwOTg5CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxMDIyNDAsIDB4YzM0NzE3ZWIKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDEwMjI0MCwgMHgzNzgyOGE5OQorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTAyMjQwLCAweGNhZGMwZjY5CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxMDIyNDAsIDB4MzQyYmYzMmYKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDEwMjI0MCwgMHg3YjMxMWJmMQorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTAyMjQwLCAweGY1NmUwY2QzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS9zd3MtcGl4ZGVzYy1xdWVyeSBiL3Rlc3RzL3JlZi9mYXRlL3N3cy1waXhkZXNjLXF1ZXJ5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZGZkY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS9zd3MtcGl4ZGVzYy1xdWVyeQpAQCAtMCwwICsxLDgzMiBAQAoraXMxNkJQUzoKKyAgYXl1djY0YmUKKyAgYXl1djY0bGUKKyAgYmdyNDhiZQorICBiZ3I0OGxlCisgIGJncmE2NGJlCisgIGJncmE2NGxlCisgIGdicmFwMTZiZQorICBnYnJhcDE2bGUKKyAgZ2JycDE2YmUKKyAgZ2JycDE2bGUKKyAgZ3JheTE2YmUKKyAgZ3JheTE2bGUKKyAgcDAxNmJlCisgIHAwMTZsZQorICByZ2I0OGJlCisgIHJnYjQ4bGUKKyAgcmdiYTY0YmUKKyAgcmdiYTY0bGUKKyAgeWExNmJlCisgIHlhMTZsZQorICB5dXY0MjBwMTZiZQorICB5dXY0MjBwMTZsZQorICB5dXY0MjJwMTZiZQorICB5dXY0MjJwMTZsZQorICB5dXY0NDRwMTZiZQorICB5dXY0NDRwMTZsZQorICB5dXZhNDIwcDE2YmUKKyAgeXV2YTQyMHAxNmxlCisgIHl1dmE0MjJwMTZiZQorICB5dXZhNDIycDE2bGUKKyAgeXV2YTQ0NHAxNmJlCisgIHl1dmE0NDRwMTZsZQorCitpc05CUFM6CisgIGdicmFwMTBiZQorICBnYnJhcDEwbGUKKyAgZ2JyYXAxMmJlCisgIGdicmFwMTJsZQorICBnYnJwMTBiZQorICBnYnJwMTBsZQorICBnYnJwMTJiZQorICBnYnJwMTJsZQorICBnYnJwMTRiZQorICBnYnJwMTRsZQorICBnYnJwOWJlCisgIGdicnA5bGUKKyAgZ3JheTEwYmUKKyAgZ3JheTEwbGUKKyAgZ3JheTEyYmUKKyAgZ3JheTEybGUKKyAgZ3JheTliZQorICBncmF5OWxlCisgIG52MjBiZQorICBudjIwbGUKKyAgcDAxMGJlCisgIHAwMTBsZQorICB4eXoxMmJlCisgIHh5ejEybGUKKyAgeXV2NDIwcDEwYmUKKyAgeXV2NDIwcDEwbGUKKyAgeXV2NDIwcDEyYmUKKyAgeXV2NDIwcDEybGUKKyAgeXV2NDIwcDE0YmUKKyAgeXV2NDIwcDE0bGUKKyAgeXV2NDIwcDliZQorICB5dXY0MjBwOWxlCisgIHl1djQyMnAxMGJlCisgIHl1djQyMnAxMGxlCisgIHl1djQyMnAxMmJlCisgIHl1djQyMnAxMmxlCisgIHl1djQyMnAxNGJlCisgIHl1djQyMnAxNGxlCisgIHl1djQyMnA5YmUKKyAgeXV2NDIycDlsZQorICB5dXY0NDBwMTBiZQorICB5dXY0NDBwMTBsZQorICB5dXY0NDBwMTJiZQorICB5dXY0NDBwMTJsZQorICB5dXY0NDRwMTBiZQorICB5dXY0NDRwMTBsZQorICB5dXY0NDRwMTJiZQorICB5dXY0NDRwMTJsZQorICB5dXY0NDRwMTRiZQorICB5dXY0NDRwMTRsZQorICB5dXY0NDRwOWJlCisgIHl1djQ0NHA5bGUKKyAgeXV2YTQyMHAxMGJlCisgIHl1dmE0MjBwMTBsZQorICB5dXZhNDIwcDliZQorICB5dXZhNDIwcDlsZQorICB5dXZhNDIycDEwYmUKKyAgeXV2YTQyMnAxMGxlCisgIHl1dmE0MjJwOWJlCisgIHl1dmE0MjJwOWxlCisgIHl1dmE0NDRwMTBiZQorICB5dXZhNDQ0cDEwbGUKKyAgeXV2YTQ0NHA5YmUKKyAgeXV2YTQ0NHA5bGUKKworaXNCRToKKyAgYXl1djY0YmUKKyAgYmF5ZXJfYmdncjE2YmUKKyAgYmF5ZXJfZ2JyZzE2YmUKKyAgYmF5ZXJfZ3JiZzE2YmUKKyAgYmF5ZXJfcmdnYjE2YmUKKyAgYmdyNDQ0YmUKKyAgYmdyNDhiZQorICBiZ3I1NTViZQorICBiZ3I1NjViZQorICBiZ3JhNjRiZQorICBnYnJhcDEwYmUKKyAgZ2JyYXAxMmJlCisgIGdicmFwMTZiZQorICBnYnJhcGYzMmJlCisgIGdicnAxMGJlCisgIGdicnAxMmJlCisgIGdicnAxNGJlCisgIGdicnAxNmJlCisgIGdicnA5YmUKKyAgZ2JycGYzMmJlCisgIGdyYXkxMGJlCisgIGdyYXkxMmJlCisgIGdyYXkxNmJlCisgIGdyYXk5YmUKKyAgbnYyMGJlCisgIHAwMTBiZQorICBwMDE2YmUKKyAgcmdiNDQ0YmUKKyAgcmdiNDhiZQorICByZ2I1NTViZQorICByZ2I1NjViZQorICByZ2JhNjRiZQorICB4eXoxMmJlCisgIHlhMTZiZQorICB5dXY0MjBwMTBiZQorICB5dXY0MjBwMTJiZQorICB5dXY0MjBwMTRiZQorICB5dXY0MjBwMTZiZQorICB5dXY0MjBwOWJlCisgIHl1djQyMnAxMGJlCisgIHl1djQyMnAxMmJlCisgIHl1djQyMnAxNGJlCisgIHl1djQyMnAxNmJlCisgIHl1djQyMnA5YmUKKyAgeXV2NDQwcDEwYmUKKyAgeXV2NDQwcDEyYmUKKyAgeXV2NDQ0cDEwYmUKKyAgeXV2NDQ0cDEyYmUKKyAgeXV2NDQ0cDE0YmUKKyAgeXV2NDQ0cDE2YmUKKyAgeXV2NDQ0cDliZQorICB5dXZhNDIwcDEwYmUKKyAgeXV2YTQyMHAxNmJlCisgIHl1dmE0MjBwOWJlCisgIHl1dmE0MjJwMTBiZQorICB5dXZhNDIycDE2YmUKKyAgeXV2YTQyMnA5YmUKKyAgeXV2YTQ0NHAxMGJlCisgIHl1dmE0NDRwMTZiZQorICB5dXZhNDQ0cDliZQorCitpc1lVVjoKKyAgYXl1djY0YmUKKyAgYXl1djY0bGUKKyAgbnYxMgorICBudjE2CisgIG52MjBiZQorICBudjIwbGUKKyAgbnYyMQorICBwMDEwYmUKKyAgcDAxMGxlCisgIHAwMTZiZQorICBwMDE2bGUKKyAgdXl2eTQyMgorICB1eXl2eXk0MTEKKyAgeHl6MTJiZQorICB4eXoxMmxlCisgIHlhMTZiZQorICB5YTE2bGUKKyAgeWE4CisgIHl1djQxMHAKKyAgeXV2NDExcAorICB5dXY0MjBwCisgIHl1djQyMHAxMGJlCisgIHl1djQyMHAxMGxlCisgIHl1djQyMHAxMmJlCisgIHl1djQyMHAxMmxlCisgIHl1djQyMHAxNGJlCisgIHl1djQyMHAxNGxlCisgIHl1djQyMHAxNmJlCisgIHl1djQyMHAxNmxlCisgIHl1djQyMHA5YmUKKyAgeXV2NDIwcDlsZQorICB5dXY0MjJwCisgIHl1djQyMnAxMGJlCisgIHl1djQyMnAxMGxlCisgIHl1djQyMnAxMmJlCisgIHl1djQyMnAxMmxlCisgIHl1djQyMnAxNGJlCisgIHl1djQyMnAxNGxlCisgIHl1djQyMnAxNmJlCisgIHl1djQyMnAxNmxlCisgIHl1djQyMnA5YmUKKyAgeXV2NDIycDlsZQorICB5dXY0NDBwCisgIHl1djQ0MHAxMGJlCisgIHl1djQ0MHAxMGxlCisgIHl1djQ0MHAxMmJlCisgIHl1djQ0MHAxMmxlCisgIHl1djQ0NHAKKyAgeXV2NDQ0cDEwYmUKKyAgeXV2NDQ0cDEwbGUKKyAgeXV2NDQ0cDEyYmUKKyAgeXV2NDQ0cDEybGUKKyAgeXV2NDQ0cDE0YmUKKyAgeXV2NDQ0cDE0bGUKKyAgeXV2NDQ0cDE2YmUKKyAgeXV2NDQ0cDE2bGUKKyAgeXV2NDQ0cDliZQorICB5dXY0NDRwOWxlCisgIHl1dmE0MjBwCisgIHl1dmE0MjBwMTBiZQorICB5dXZhNDIwcDEwbGUKKyAgeXV2YTQyMHAxNmJlCisgIHl1dmE0MjBwMTZsZQorICB5dXZhNDIwcDliZQorICB5dXZhNDIwcDlsZQorICB5dXZhNDIycAorICB5dXZhNDIycDEwYmUKKyAgeXV2YTQyMnAxMGxlCisgIHl1dmE0MjJwMTZiZQorICB5dXZhNDIycDE2bGUKKyAgeXV2YTQyMnA5YmUKKyAgeXV2YTQyMnA5bGUKKyAgeXV2YTQ0NHAKKyAgeXV2YTQ0NHAxMGJlCisgIHl1dmE0NDRwMTBsZQorICB5dXZhNDQ0cDE2YmUKKyAgeXV2YTQ0NHAxNmxlCisgIHl1dmE0NDRwOWJlCisgIHl1dmE0NDRwOWxlCisgIHl1dmo0MTFwCisgIHl1dmo0MjBwCisgIHl1dmo0MjJwCisgIHl1dmo0NDBwCisgIHl1dmo0NDRwCisgIHl1eXY0MjIKKyAgeXZ5dTQyMgorCitpc1BsYW5hcllVVjoKKyAgbnYxMgorICBudjE2CisgIG52MjBiZQorICBudjIwbGUKKyAgbnYyMQorICBwMDEwYmUKKyAgcDAxMGxlCisgIHAwMTZiZQorICBwMDE2bGUKKyAgeXV2NDEwcAorICB5dXY0MTFwCisgIHl1djQyMHAKKyAgeXV2NDIwcDEwYmUKKyAgeXV2NDIwcDEwbGUKKyAgeXV2NDIwcDEyYmUKKyAgeXV2NDIwcDEybGUKKyAgeXV2NDIwcDE0YmUKKyAgeXV2NDIwcDE0bGUKKyAgeXV2NDIwcDE2YmUKKyAgeXV2NDIwcDE2bGUKKyAgeXV2NDIwcDliZQorICB5dXY0MjBwOWxlCisgIHl1djQyMnAKKyAgeXV2NDIycDEwYmUKKyAgeXV2NDIycDEwbGUKKyAgeXV2NDIycDEyYmUKKyAgeXV2NDIycDEybGUKKyAgeXV2NDIycDE0YmUKKyAgeXV2NDIycDE0bGUKKyAgeXV2NDIycDE2YmUKKyAgeXV2NDIycDE2bGUKKyAgeXV2NDIycDliZQorICB5dXY0MjJwOWxlCisgIHl1djQ0MHAKKyAgeXV2NDQwcDEwYmUKKyAgeXV2NDQwcDEwbGUKKyAgeXV2NDQwcDEyYmUKKyAgeXV2NDQwcDEybGUKKyAgeXV2NDQ0cAorICB5dXY0NDRwMTBiZQorICB5dXY0NDRwMTBsZQorICB5dXY0NDRwMTJiZQorICB5dXY0NDRwMTJsZQorICB5dXY0NDRwMTRiZQorICB5dXY0NDRwMTRsZQorICB5dXY0NDRwMTZiZQorICB5dXY0NDRwMTZsZQorICB5dXY0NDRwOWJlCisgIHl1djQ0NHA5bGUKKyAgeXV2YTQyMHAKKyAgeXV2YTQyMHAxMGJlCisgIHl1dmE0MjBwMTBsZQorICB5dXZhNDIwcDE2YmUKKyAgeXV2YTQyMHAxNmxlCisgIHl1dmE0MjBwOWJlCisgIHl1dmE0MjBwOWxlCisgIHl1dmE0MjJwCisgIHl1dmE0MjJwMTBiZQorICB5dXZhNDIycDEwbGUKKyAgeXV2YTQyMnAxNmJlCisgIHl1dmE0MjJwMTZsZQorICB5dXZhNDIycDliZQorICB5dXZhNDIycDlsZQorICB5dXZhNDQ0cAorICB5dXZhNDQ0cDEwYmUKKyAgeXV2YTQ0NHAxMGxlCisgIHl1dmE0NDRwMTZiZQorICB5dXZhNDQ0cDE2bGUKKyAgeXV2YTQ0NHA5YmUKKyAgeXV2YTQ0NHA5bGUKKyAgeXV2ajQxMXAKKyAgeXV2ajQyMHAKKyAgeXV2ajQyMnAKKyAgeXV2ajQ0MHAKKyAgeXV2ajQ0NHAKKworaXNSR0I6CisgIDBiZ3IKKyAgMHJnYgorICBiYXllcl9iZ2dyMTZiZQorICBiYXllcl9iZ2dyMTZsZQorICBiYXllcl9iZ2dyOAorICBiYXllcl9nYnJnMTZiZQorICBiYXllcl9nYnJnMTZsZQorICBiYXllcl9nYnJnOAorICBiYXllcl9ncmJnMTZiZQorICBiYXllcl9ncmJnMTZsZQorICBiYXllcl9ncmJnOAorICBiYXllcl9yZ2diMTZiZQorICBiYXllcl9yZ2diMTZsZQorICBiYXllcl9yZ2diOAorICBiZ3IwCisgIGJncjI0CisgIGJncjMyCisgIGJncjMyXzEKKyAgYmdyNAorICBiZ3I0NDRiZQorICBiZ3I0NDRsZQorICBiZ3I0OGJlCisgIGJncjQ4bGUKKyAgYmdyNF9ieXRlCisgIGJncjU1NWJlCisgIGJncjU1NWxlCisgIGJncjU2NWJlCisgIGJncjU2NWxlCisgIGJncjgKKyAgYmdyYTY0YmUKKyAgYmdyYTY0bGUKKyAgZ2JyYXAKKyAgZ2JyYXAxMGJlCisgIGdicmFwMTBsZQorICBnYnJhcDEyYmUKKyAgZ2JyYXAxMmxlCisgIGdicmFwMTZiZQorICBnYnJhcDE2bGUKKyAgZ2JyYXBmMzJiZQorICBnYnJhcGYzMmxlCisgIGdicnAKKyAgZ2JycDEwYmUKKyAgZ2JycDEwbGUKKyAgZ2JycDEyYmUKKyAgZ2JycDEybGUKKyAgZ2JycDE0YmUKKyAgZ2JycDE0bGUKKyAgZ2JycDE2YmUKKyAgZ2JycDE2bGUKKyAgZ2JycDliZQorICBnYnJwOWxlCisgIGdicnBmMzJiZQorICBnYnJwZjMybGUKKyAgcmdiMAorICByZ2IyNAorICByZ2IzMgorICByZ2IzMl8xCisgIHJnYjQKKyAgcmdiNDQ0YmUKKyAgcmdiNDQ0bGUKKyAgcmdiNDhiZQorICByZ2I0OGxlCisgIHJnYjRfYnl0ZQorICByZ2I1NTViZQorICByZ2I1NTVsZQorICByZ2I1NjViZQorICByZ2I1NjVsZQorICByZ2I4CisgIHJnYmE2NGJlCisgIHJnYmE2NGxlCisKK0dyYXk6CisgIGdyYXkKKyAgZ3JheTEwYmUKKyAgZ3JheTEwbGUKKyAgZ3JheTEyYmUKKyAgZ3JheTEybGUKKyAgZ3JheTE2YmUKKyAgZ3JheTE2bGUKKyAgZ3JheTliZQorICBncmF5OWxlCisgIHlhMTZiZQorICB5YTE2bGUKKyAgeWE4CisKK1JHQmluSW50OgorICBtb25vYgorICBtb25vdworICByZ2IyNAorICByZ2IzMgorICByZ2IzMl8xCisgIHJnYjQKKyAgcmdiNDQ0YmUKKyAgcmdiNDQ0bGUKKyAgcmdiNDhiZQorICByZ2I0OGxlCisgIHJnYjRfYnl0ZQorICByZ2I1NTViZQorICByZ2I1NTVsZQorICByZ2I1NjViZQorICByZ2I1NjVsZQorICByZ2I4CisgIHJnYmE2NGJlCisgIHJnYmE2NGxlCisKK0JHUmluSW50OgorICBiZ3IyNAorICBiZ3IzMgorICBiZ3IzMl8xCisgIGJncjQKKyAgYmdyNDQ0YmUKKyAgYmdyNDQ0bGUKKyAgYmdyNDhiZQorICBiZ3I0OGxlCisgIGJncjRfYnl0ZQorICBiZ3I1NTViZQorICBiZ3I1NTVsZQorICBiZ3I1NjViZQorICBiZ3I1NjVsZQorICBiZ3I4CisgIGJncmE2NGJlCisgIGJncmE2NGxlCisgIG1vbm9iCisgIG1vbm93CisKK0JheWVyOgorICBiYXllcl9iZ2dyMTZiZQorICBiYXllcl9iZ2dyMTZsZQorICBiYXllcl9iZ2dyOAorICBiYXllcl9nYnJnMTZiZQorICBiYXllcl9nYnJnMTZsZQorICBiYXllcl9nYnJnOAorICBiYXllcl9ncmJnMTZiZQorICBiYXllcl9ncmJnMTZsZQorICBiYXllcl9ncmJnOAorICBiYXllcl9yZ2diMTZiZQorICBiYXllcl9yZ2diMTZsZQorICBiYXllcl9yZ2diOAorCitBbnlSR0I6CisgIDBiZ3IKKyAgMHJnYgorICBiYXllcl9iZ2dyMTZiZQorICBiYXllcl9iZ2dyMTZsZQorICBiYXllcl9iZ2dyOAorICBiYXllcl9nYnJnMTZiZQorICBiYXllcl9nYnJnMTZsZQorICBiYXllcl9nYnJnOAorICBiYXllcl9ncmJnMTZiZQorICBiYXllcl9ncmJnMTZsZQorICBiYXllcl9ncmJnOAorICBiYXllcl9yZ2diMTZiZQorICBiYXllcl9yZ2diMTZsZQorICBiYXllcl9yZ2diOAorICBiZ3IwCisgIGJncjI0CisgIGJncjMyCisgIGJncjMyXzEKKyAgYmdyNAorICBiZ3I0NDRiZQorICBiZ3I0NDRsZQorICBiZ3I0OGJlCisgIGJncjQ4bGUKKyAgYmdyNF9ieXRlCisgIGJncjU1NWJlCisgIGJncjU1NWxlCisgIGJncjU2NWJlCisgIGJncjU2NWxlCisgIGJncjgKKyAgYmdyYTY0YmUKKyAgYmdyYTY0bGUKKyAgZ2JyYXAKKyAgZ2JyYXAxMGJlCisgIGdicmFwMTBsZQorICBnYnJhcDEyYmUKKyAgZ2JyYXAxMmxlCisgIGdicmFwMTZiZQorICBnYnJhcDE2bGUKKyAgZ2JyYXBmMzJiZQorICBnYnJhcGYzMmxlCisgIGdicnAKKyAgZ2JycDEwYmUKKyAgZ2JycDEwbGUKKyAgZ2JycDEyYmUKKyAgZ2JycDEybGUKKyAgZ2JycDE0YmUKKyAgZ2JycDE0bGUKKyAgZ2JycDE2YmUKKyAgZ2JycDE2bGUKKyAgZ2JycDliZQorICBnYnJwOWxlCisgIGdicnBmMzJiZQorICBnYnJwZjMybGUKKyAgbW9ub2IKKyAgbW9ub3cKKyAgcmdiMAorICByZ2IyNAorICByZ2IzMgorICByZ2IzMl8xCisgIHJnYjQKKyAgcmdiNDQ0YmUKKyAgcmdiNDQ0bGUKKyAgcmdiNDhiZQorICByZ2I0OGxlCisgIHJnYjRfYnl0ZQorICByZ2I1NTViZQorICByZ2I1NTVsZQorICByZ2I1NjViZQorICByZ2I1NjVsZQorICByZ2I4CisgIHJnYmE2NGJlCisgIHJnYmE2NGxlCisKK0FMUEhBOgorICBheXV2NjRiZQorICBheXV2NjRsZQorICBiZ3IzMgorICBiZ3IzMl8xCisgIGJncmE2NGJlCisgIGJncmE2NGxlCisgIGdicmFwCisgIGdicmFwMTBiZQorICBnYnJhcDEwbGUKKyAgZ2JyYXAxMmJlCisgIGdicmFwMTJsZQorICBnYnJhcDE2YmUKKyAgZ2JyYXAxNmxlCisgIGdicmFwZjMyYmUKKyAgZ2JyYXBmMzJsZQorICBwYWw4CisgIHJnYjMyCisgIHJnYjMyXzEKKyAgcmdiYTY0YmUKKyAgcmdiYTY0bGUKKyAgeWExNmJlCisgIHlhMTZsZQorICB5YTgKKyAgeXV2YTQyMHAKKyAgeXV2YTQyMHAxMGJlCisgIHl1dmE0MjBwMTBsZQorICB5dXZhNDIwcDE2YmUKKyAgeXV2YTQyMHAxNmxlCisgIHl1dmE0MjBwOWJlCisgIHl1dmE0MjBwOWxlCisgIHl1dmE0MjJwCisgIHl1dmE0MjJwMTBiZQorICB5dXZhNDIycDEwbGUKKyAgeXV2YTQyMnAxNmJlCisgIHl1dmE0MjJwMTZsZQorICB5dXZhNDIycDliZQorICB5dXZhNDIycDlsZQorICB5dXZhNDQ0cAorICB5dXZhNDQ0cDEwYmUKKyAgeXV2YTQ0NHAxMGxlCisgIHl1dmE0NDRwMTZiZQorICB5dXZhNDQ0cDE2bGUKKyAgeXV2YTQ0NHA5YmUKKyAgeXV2YTQ0NHA5bGUKKworUGFja2VkOgorICAwYmdyCisgIDByZ2IKKyAgYXl1djY0YmUKKyAgYXl1djY0bGUKKyAgYmF5ZXJfYmdncjE2YmUKKyAgYmF5ZXJfYmdncjE2bGUKKyAgYmF5ZXJfYmdncjgKKyAgYmF5ZXJfZ2JyZzE2YmUKKyAgYmF5ZXJfZ2JyZzE2bGUKKyAgYmF5ZXJfZ2JyZzgKKyAgYmF5ZXJfZ3JiZzE2YmUKKyAgYmF5ZXJfZ3JiZzE2bGUKKyAgYmF5ZXJfZ3JiZzgKKyAgYmF5ZXJfcmdnYjE2YmUKKyAgYmF5ZXJfcmdnYjE2bGUKKyAgYmF5ZXJfcmdnYjgKKyAgYmdyMAorICBiZ3IyNAorICBiZ3IzMgorICBiZ3IzMl8xCisgIGJncjQKKyAgYmdyNDQ0YmUKKyAgYmdyNDQ0bGUKKyAgYmdyNDhiZQorICBiZ3I0OGxlCisgIGJncjRfYnl0ZQorICBiZ3I1NTViZQorICBiZ3I1NTVsZQorICBiZ3I1NjViZQorICBiZ3I1NjVsZQorICBiZ3I4CisgIGJncmE2NGJlCisgIGJncmE2NGxlCisgIG1vbm9iCisgIG1vbm93CisgIHBhbDgKKyAgcmdiMAorICByZ2IyNAorICByZ2IzMgorICByZ2IzMl8xCisgIHJnYjQKKyAgcmdiNDQ0YmUKKyAgcmdiNDQ0bGUKKyAgcmdiNDhiZQorICByZ2I0OGxlCisgIHJnYjRfYnl0ZQorICByZ2I1NTViZQorICByZ2I1NTVsZQorICByZ2I1NjViZQorICByZ2I1NjVsZQorICByZ2I4CisgIHJnYmE2NGJlCisgIHJnYmE2NGxlCisgIHV5dnk0MjIKKyAgdXl5dnl5NDExCisgIHh5ejEyYmUKKyAgeHl6MTJsZQorICB5YTE2YmUKKyAgeWExNmxlCisgIHlhOAorICB5dXl2NDIyCisgIHl2eXU0MjIKKworUGxhbmFyOgorICBnYnJhcAorICBnYnJhcDEwYmUKKyAgZ2JyYXAxMGxlCisgIGdicmFwMTJiZQorICBnYnJhcDEybGUKKyAgZ2JyYXAxNmJlCisgIGdicmFwMTZsZQorICBnYnJhcGYzMmJlCisgIGdicmFwZjMybGUKKyAgZ2JycAorICBnYnJwMTBiZQorICBnYnJwMTBsZQorICBnYnJwMTJiZQorICBnYnJwMTJsZQorICBnYnJwMTRiZQorICBnYnJwMTRsZQorICBnYnJwMTZiZQorICBnYnJwMTZsZQorICBnYnJwOWJlCisgIGdicnA5bGUKKyAgZ2JycGYzMmJlCisgIGdicnBmMzJsZQorICBudjEyCisgIG52MTYKKyAgbnYyMGJlCisgIG52MjBsZQorICBudjIxCisgIHAwMTBiZQorICBwMDEwbGUKKyAgcDAxNmJlCisgIHAwMTZsZQorICB5dXY0MTBwCisgIHl1djQxMXAKKyAgeXV2NDIwcAorICB5dXY0MjBwMTBiZQorICB5dXY0MjBwMTBsZQorICB5dXY0MjBwMTJiZQorICB5dXY0MjBwMTJsZQorICB5dXY0MjBwMTRiZQorICB5dXY0MjBwMTRsZQorICB5dXY0MjBwMTZiZQorICB5dXY0MjBwMTZsZQorICB5dXY0MjBwOWJlCisgIHl1djQyMHA5bGUKKyAgeXV2NDIycAorICB5dXY0MjJwMTBiZQorICB5dXY0MjJwMTBsZQorICB5dXY0MjJwMTJiZQorICB5dXY0MjJwMTJsZQorICB5dXY0MjJwMTRiZQorICB5dXY0MjJwMTRsZQorICB5dXY0MjJwMTZiZQorICB5dXY0MjJwMTZsZQorICB5dXY0MjJwOWJlCisgIHl1djQyMnA5bGUKKyAgeXV2NDQwcAorICB5dXY0NDBwMTBiZQorICB5dXY0NDBwMTBsZQorICB5dXY0NDBwMTJiZQorICB5dXY0NDBwMTJsZQorICB5dXY0NDRwCisgIHl1djQ0NHAxMGJlCisgIHl1djQ0NHAxMGxlCisgIHl1djQ0NHAxMmJlCisgIHl1djQ0NHAxMmxlCisgIHl1djQ0NHAxNGJlCisgIHl1djQ0NHAxNGxlCisgIHl1djQ0NHAxNmJlCisgIHl1djQ0NHAxNmxlCisgIHl1djQ0NHA5YmUKKyAgeXV2NDQ0cDlsZQorICB5dXZhNDIwcAorICB5dXZhNDIwcDEwYmUKKyAgeXV2YTQyMHAxMGxlCisgIHl1dmE0MjBwMTZiZQorICB5dXZhNDIwcDE2bGUKKyAgeXV2YTQyMHA5YmUKKyAgeXV2YTQyMHA5bGUKKyAgeXV2YTQyMnAKKyAgeXV2YTQyMnAxMGJlCisgIHl1dmE0MjJwMTBsZQorICB5dXZhNDIycDE2YmUKKyAgeXV2YTQyMnAxNmxlCisgIHl1dmE0MjJwOWJlCisgIHl1dmE0MjJwOWxlCisgIHl1dmE0NDRwCisgIHl1dmE0NDRwMTBiZQorICB5dXZhNDQ0cDEwbGUKKyAgeXV2YTQ0NHAxNmJlCisgIHl1dmE0NDRwMTZsZQorICB5dXZhNDQ0cDliZQorICB5dXZhNDQ0cDlsZQorICB5dXZqNDExcAorICB5dXZqNDIwcAorICB5dXZqNDIycAorICB5dXZqNDQwcAorICB5dXZqNDQ0cAorCitQYWNrZWRSR0I6CisgIDBiZ3IKKyAgMHJnYgorICBiYXllcl9iZ2dyMTZiZQorICBiYXllcl9iZ2dyMTZsZQorICBiYXllcl9iZ2dyOAorICBiYXllcl9nYnJnMTZiZQorICBiYXllcl9nYnJnMTZsZQorICBiYXllcl9nYnJnOAorICBiYXllcl9ncmJnMTZiZQorICBiYXllcl9ncmJnMTZsZQorICBiYXllcl9ncmJnOAorICBiYXllcl9yZ2diMTZiZQorICBiYXllcl9yZ2diMTZsZQorICBiYXllcl9yZ2diOAorICBiZ3IwCisgIGJncjI0CisgIGJncjMyCisgIGJncjMyXzEKKyAgYmdyNAorICBiZ3I0NDRiZQorICBiZ3I0NDRsZQorICBiZ3I0OGJlCisgIGJncjQ4bGUKKyAgYmdyNF9ieXRlCisgIGJncjU1NWJlCisgIGJncjU1NWxlCisgIGJncjU2NWJlCisgIGJncjU2NWxlCisgIGJncjgKKyAgYmdyYTY0YmUKKyAgYmdyYTY0bGUKKyAgcmdiMAorICByZ2IyNAorICByZ2IzMgorICByZ2IzMl8xCisgIHJnYjQKKyAgcmdiNDQ0YmUKKyAgcmdiNDQ0bGUKKyAgcmdiNDhiZQorICByZ2I0OGxlCisgIHJnYjRfYnl0ZQorICByZ2I1NTViZQorICByZ2I1NTVsZQorICByZ2I1NjViZQorICByZ2I1NjVsZQorICByZ2I4CisgIHJnYmE2NGJlCisgIHJnYmE2NGxlCisKK1BsYW5hclJHQjoKKyAgZ2JyYXAKKyAgZ2JyYXAxMGJlCisgIGdicmFwMTBsZQorICBnYnJhcDEyYmUKKyAgZ2JyYXAxMmxlCisgIGdicmFwMTZiZQorICBnYnJhcDE2bGUKKyAgZ2JyYXBmMzJiZQorICBnYnJhcGYzMmxlCisgIGdicnAKKyAgZ2JycDEwYmUKKyAgZ2JycDEwbGUKKyAgZ2JycDEyYmUKKyAgZ2JycDEybGUKKyAgZ2JycDE0YmUKKyAgZ2JycDE0bGUKKyAgZ2JycDE2YmUKKyAgZ2JycDE2bGUKKyAgZ2JycDliZQorICBnYnJwOWxlCisgIGdicnBmMzJiZQorICBnYnJwZjMybGUKKwordXNlUGFsOgorICBiZ3I0X2J5dGUKKyAgYmdyOAorICBncmF5CisgIHBhbDgKKyAgcmdiNF9ieXRlCisgIHJnYjgKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtQ0JXOCBiL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLUNCVzgKaW5kZXggNjAyNzBkNy4uYmU0YmRjMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtQ0JXOAorKysgYi90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1DQlc4CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMTYzODQsIDB4MjY3ZTIxZWYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLUNDTTggYi90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1DQ004CmluZGV4IDQ1YmIxODEuLmQzMGZhNzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLUNDTTgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtQ0NNOApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY1NTM2LCAweDQ3ZTk3ZmU5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1DVEMxNiBiL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLUNUQzE2CmluZGV4IGU4NDhmZjguLjE1ZGZhZmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLUNUQzE2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLUNUQzE2CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzI3NjgsIDB4YTZiM2QyMGQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLUNUQzI0IGIvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtQ1RDMjQKaW5kZXggYzk1ZjQwNi4uZDBiN2Q2NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtQ1RDMjQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtQ1RDMjQKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0OTE1MiwgMHhhY2E0YmMyOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtQ1RDMzIgYi90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1DVEMzMgppbmRleCBhYWQzYmZjLi4xYzQzODk2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1DVEMzMgorKysgYi90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1DVEMzMgpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY1NTM2LCAweGNmOThiYzI5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1VQlc4IGIvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtVUJXOAppbmRleCA2MDI3MGQ3Li5iZTRiZGMzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1VQlc4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLVVCVzgKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxNjM4NCwgMHgyNjdlMjFlZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtVUNNOCBiL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLVVDTTgKaW5kZXggNDViYjE4MS4uZDMwZmE3MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtVUNNOAorKysgYi90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1VQ004CkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNjU1MzYsIDB4NDdlOTdmZTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLVVUQzE2IGIvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtVVRDMTYKaW5kZXggZTg0OGZmOC4uMTVkZmFmZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtVVRDMTYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtVVRDMTYKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4eDEyOAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzMjc2OCwgMHhhNmIzZDIwZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtY29uZm9ybWFuY2UtVVRDMjQgYi90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1VVEMyNAppbmRleCBjOTVmNDA2Li5kMGI3ZDY2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1VVEMyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1VVEMyNApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ5MTUyLCAweGFjYTRiYzI5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90YXJnYS1jb25mb3JtYW5jZS1VVEMzMiBiL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLVVUQzMyCmluZGV4IGFhZDNiZmMuLjFjNDM4OTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLVVUQzMyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLWNvbmZvcm1hbmNlLVVUQzMyCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyOHgxMjgKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNjU1MzYsIDB4Y2Y5OGJjMjkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLXRvcC10by1ib3R0b20gYi90ZXN0cy9yZWYvZmF0ZS90YXJnYS10b3AtdG8tYm90dG9tCmluZGV4IDRkOTU3N2EuLjZjZjFjOTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RhcmdhLXRvcC10by1ib3R0b20KKysrIGIvdGVzdHMvcmVmL2ZhdGUvdGFyZ2EtdG9wLXRvLWJvdHRvbQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MjU2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTk2NjA4LCAweGIyOWVjNTFhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90ZHNjIGIvdGVzdHMvcmVmL2ZhdGUvdGRzYwppbmRleCBkNjkyNWU5Li5kZTlmMzYyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90ZHNjCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3Rkc2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTQ0MHg5MDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDM4ODgwMDAsIDB4OWM0OTg2NTcKIDAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgMzg4ODAwMCwgMHg3MmEyYWUyMgogMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAzODg4MDAwLCAweDcyYTJhZTIyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90aGVvcmEtY29lZmYtbGV2ZWw2NCBiL3Rlc3RzL3JlZi9mYXRlL3RoZW9yYS1jb2VmZi1sZXZlbDY0CmluZGV4IDRiZmFmYWYuLmNjNjRiY2MgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RoZW9yYS1jb2VmZi1sZXZlbDY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RoZW9yYS1jb2VmZi1sZXZlbDY0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI5NjB4MTA0MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgNDYxNzYwMCwgMHg0YmE2ZGY1MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICA0NjE3NjAwLCAweDQxOWZkZWFmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDQ2MTc2MDAsIDB4ZWIyZWRjZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3RoZW9yYS1vZmZzZXQgYi90ZXN0cy9yZWYvZmF0ZS90aGVvcmEtb2Zmc2V0CmluZGV4IDU5MjE2NTcuLmI5YTZlMDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RoZW9yYS1vZmZzZXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdGhlb3JhLW9mZnNldApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMng1MTIKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzOTMyMTYsIDB4ZGM5OThmYTIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDM5MzIxNiwgMHg5NzlhOGZiZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMzkzMjE2LCAweDk3OWE4ZmJkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90aHAgYi90ZXN0cy9yZWYvZmF0ZS90aHAKaW5kZXggNTJkZDA1OS4uNDMyM2FjOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdGhwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RocApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA1MjQyODgvMTU3MTI5MTEKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDYwOHgzMjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyOTE4NDAsIDB4YmQ3ZTBiMjIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDI5MTg0MCwgMHhmNmUxMmNhNQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjkxODQwLCAweDUyOGM3MDQ5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90aWVydGV4LXNlcSBiL3Rlc3RzL3JlZi9mYXRlL3RpZXJ0ZXgtc2VxCmluZGV4IDc0NDA3ZTcuLjFkYjkwNmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RpZXJ0ZXgtc2VxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RpZXJ0ZXgtc2VxCkBAIC0xLDUgKzEsMTQgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MTI4Cisjc2FyIDA6IDAvMQogI3RiIDE6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogMjIwNTAKKyNjaGFubmVsX2xheW91dCAxOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBtb25vCiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDg4MiwgICAgIDE3NjQsIDB4MDAwMDAwMDAKIDEsICAgICAgICA4ODIsICAgICAgICA4ODIsICAgICAgODgyLCAgICAgMTc2NCwgMHg4MGEyNTNkOQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDk4MzA0LCAweDJlNWRiNGE0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90aWZmLWZheC1nMyBiL3Rlc3RzL3JlZi9mYXRlL3RpZmYtZmF4LWczCmluZGV4IGZhN2JjMmYuLmFjMWZmZjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RpZmYtZmF4LWczCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RpZmYtZmF4LWczCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI0NjR4MzI0OAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTAwMDM4NCwgMHhiNzU4ZWI4YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdGlmZi1mYXgtZzNzIGIvdGVzdHMvcmVmL2ZhdGUvdGlmZi1mYXgtZzNzCmluZGV4IGZhN2JjMmYuLmFjMWZmZjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RpZmYtZmF4LWczcworKysgYi90ZXN0cy9yZWYvZmF0ZS90aWZmLWZheC1nM3MKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjQ2NHgzMjQ4Cisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMDAwMzg0LCAweGI3NThlYjhiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90aW1lX2Jhc2UgYi90ZXN0cy9yZWYvZmF0ZS90aW1lX2Jhc2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkMTQwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RpbWVfYmFzZQpAQCAtMCwwICsxIEBACitmOTc1NTFmODg0ZGY1YWI3MDljNTg2OWM2NmM3YjliYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdG12IGIvdGVzdHMvcmVmL2ZhdGUvdG12CmluZGV4IDYyMDNlODYuLjA5MTk4ZmEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RtdgorKysgYi90ZXN0cy9yZWYvZmF0ZS90bXYKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDE4NC8xMTAyOQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKICN0YiAxOiAxLzIyMDU4CisjbWVkaWFfdHlwZSAxOiBhdWRpbworI2NvZGVjX2lkIDE6IHBjbV9zMTZsZQorI3NhbXBsZV9yYXRlIDE6IDIyMDU4CisjY2hhbm5lbF9sYXlvdXQgMTogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTkyMDAwLCAweGM2OTgyOTdhCiAxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgIDM2OCwgICAgICA3MzYsIDB4ZjYzZGI0OTcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5MjAwMCwgMHg4ZDViZDZiZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdHJ1ZW1vdGlvbjEtMTUgYi90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMS0xNQppbmRleCBhZjRhMzIwLi4yNGQ0YzJjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMS0xNQorKysgYi90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMS0xNQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTY4Cisjc2FyIDA6IDEvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTYxMjgwLCAweDY3N2M5ZmIzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNjEyODAsIDB4YWEyODBlMGEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDE2MTI4MCwgMHg4YTRkMjIyNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdHJ1ZW1vdGlvbjEtMjQgYi90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMS0yNAppbmRleCA3M2JiOWU3Li5iNDFlYWUwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMS0yNAorKysgYi90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMS0yNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNDR4MTYwCisjc2FyIDA6IDIvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY5MTIwLCAweDY4YmViMzBmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNjkxMjAsIDB4Mzk3NmY1Y2YKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA2OTEyMCwgMHhmODE1YmMzYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdHJ1ZW1vdGlvbjIgYi90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMgppbmRleCBjMjYzYmE0Li5kZjI1ZjYxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMgorKysgYi90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweDEzNWNiNTA5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4OTE5YTFhYjcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIzMDQwMCwgMHgwYWY4NzIyYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdHJ1ZW1vdGlvbjJydC1oaWdoIGIvdGVzdHMvcmVmL2ZhdGUvdHJ1ZW1vdGlvbjJydC1oaWdoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDc4NTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMnJ0LWhpZ2gKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMTAwLzIzOTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDIwOHgyMzIKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNTQyODgsIDB4YmI4OGRiODQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3RydWVtb3Rpb24ycnQtbG93IGIvdGVzdHMvcmVmL2ZhdGUvdHJ1ZW1vdGlvbjJydC1sb3cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZTgyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RydWVtb3Rpb24ycnQtbG93CkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEwMC8yMzk3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyMDh4MjMyCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU0Mjg4LCAweDk0MzEwNDU5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMnJ0LW1pZCBiL3Rlc3RzL3JlZi9mYXRlL3RydWVtb3Rpb24ycnQtbWlkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZWM2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS90cnVlbW90aW9uMnJ0LW1pZApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxMDAvMjM5NworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDE5NgorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA0NTg2NCwgMHg2YzM5YTllMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdHMtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS90cy1kZW11eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjEzZWNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdHMtZGVtdXgKQEAgLTAsMCArMSwzMiBAQAorI2V4dHJhZGF0YSAwOiAgICAgIDE1MCwgMHhiNDE5MmZiOQorI3RiIDA6IDEvOTAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogbXBlZzJ2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMS8xCisjdGIgMTogMS85MDAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBhYzMKKyNzYW1wbGVfcmF0ZSAxOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDYwZgorI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogNS4xKHNpZGUpCisxLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgMjg4MCwgICAgIDE1MzYsIDB4NzczZmZlZWEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzEsICAgICAgIDI4ODAsICAgICAgIDI4ODAsICAgICAyODgwLCAgICAgMTUzNiwgMHg2ZGMxMDc0OAorMSwgICAgICAgNTc2MCwgICAgICAgNTc2MCwgICAgIDI4ODAsICAgICAxNTM2LCAweGJhYjUxMjljCisxLCAgICAgICA4NjQwLCAgICAgICA4NjQwLCAgICAgMjg4MCwgICAgIDE1MzYsIDB4NjAyZjAzNGIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzEsICAgICAgMTE1MjAsICAgICAgMTE1MjAsICAgICAyODgwLCAgICAgIDkwNiwgMHg2OWNkY2JjZAorMCwgICAgICAzMjAzNywgICAgICAzNjU0MSwgICAgIDE1MDEsICAgMTE0MzM2LCAweDM3YTIxNWE4LCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDMzNTM4LCAgICAgIDMzNTM4LCAgICAgMTUwMSwgICAgMTI1NjAsIDB4YjU1OWEzZDQsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDM1MDQwLCAgICAgIDM1MDQwLCAgICAgMTUwMSwgICAgMTI3MDQsIDB4MjYxNGFkZjQsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDM2NTQxLCAgICAgIDQxMDQ2LCAgICAgMTUwMSwgICAgNTE5NzYsIDB4OWZmMWRiZmUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDM4MDQzLCAgICAgIDM4MDQzLCAgICAgMTUwMSwgICAgMTMwOTYsIDB4NGZmOWVhMjMsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDM5NTQ0LCAgICAgIDM5NTQ0LCAgICAgMTUwMSwgICAgMTM3NDQsIDB4ZjJiMjQwMmEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDQxMDQ2LCAgICAgIDQ1NTUwLCAgICAgMTUwMSwgICAgNTY1NjgsIDB4NjVmNWFlZTEsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDQyNTQ3LCAgICAgIDQyNTQ3LCAgICAgMTUwMSwgICAgMTQ3MjAsIDB4ODg1NTg2NmMsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDQ0MDQ5LCAgICAgIDQ0MDQ5LCAgICAgMTUwMSwgICAgMTUyMTYsIDB4ODNjYmM0ZmMsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDQ1NTUwLCAgICAgIDUwMDU1LCAgICAgMTUwMSwgICAgNjE3MjAsIDB4ZWNkYTZiMDUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDQ3MDUyLCAgICAgIDQ3MDUyLCAgICAgMTUwMSwgICAgMTc0MTYsIDB4ZGY0ODBjNmQsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDQ4NTUzLCAgICAgIDQ4NTUzLCAgICAgMTUwMSwgICAgMTgxNDQsIDB4MTk1MDYyNGMsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDUwMDU1LCAgICAgIDU0NTU5LCAgICAgMTUwMSwgICAgNTY4NDgsIDB4ZDRmMzE1YmUsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDUxNTU2LCAgICAgIDUxNTU2LCAgICAgMTUwMSwgICAgMTYyOTYsIDB4ZDM5MWExZDAsIEY9MHgwLCBTPTEsICAgICAgICAxLCAweDAwZTAwMGUwCiswLCAgICAgIDUzMDU4LCAgICAgIDUzMDU4LCAgICAgMTUwMSwgICAgIDQ5NDQsIDB4NGQ4ODY0MGUsIEY9MHgwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90cy1vcHVzLWRlbXV4IGIvdGVzdHMvcmVmL2ZhdGUvdHMtb3B1cy1kZW11eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzVlZGZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdHMtb3B1cy1kZW11eApAQCAtMCwwICsxLDUxOSBAQAorI2V4dHJhZGF0YSAwOiAgICAgICAzMCwgMHg1M2JlMDM0NworI3RiIDA6IDEvOTAwMDAKKyNtZWRpYV90eXBlIDA6IGF1ZGlvCisjY29kZWNfaWQgMDogb3B1cworI3NhbXBsZV9yYXRlIDA6IDQ4MDAwCisjY2hhbm5lbF9sYXlvdXQgMDogNjNmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA3LjEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxODAwLCAgICAgIDc0NCwgMHgxNzJiNjE1YiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICAgMTgwMCwgICAgICAgMTgwMCwgICAgIDE4MDAsICAgICAgNzQzLCAweDNmNWI2NzNkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgICAzNjAwLCAgICAgICAzNjAwLCAgICAgMTgwMCwgICAgICA3NDcsIDB4ZTU0ZTczNWQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgIDU0MDAsICAgICAgIDU0MDAsICAgICAxODAwLCAgICAgIDc0MiwgMHg1ZDBkODM5MywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICAgNzIwMCwgICAgICAgNzIwMCwgICAgIDE4MDAsICAgICAgNzUyLCAweDM5MjY3ODE0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgICA5MDAwLCAgICAgICA5MDAwLCAgICAgMTgwMCwgICAgICA3NTMsIDB4MjEzMTc2NWUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgMTA4MDAsICAgICAgMTA4MDAsICAgICAxODAwLCAgICAgIDc1NiwgMHg1MTMyODI3ZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICAxMjYwMCwgICAgICAxMjYwMCwgICAgIDE4MDAsICAgICAgNzYxLCAweDQ4NTc3NjBiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDE0NDAwLCAgICAgIDE0NDAwLCAgICAgMTgwMCwgICAgICA3NTUsIDB4ODdhYjc1ZDYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgMTYyMDAsICAgICAgMTYyMDAsICAgICAxODAwLCAgICAgIDc2MCwgMHhiODEzNzkwNywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICAxODAwMCwgICAgICAxODAwMCwgICAgIDE4MDAsICAgICAgNzU5LCAweDcyMmQ3OTA4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDE5ODAwLCAgICAgIDE5ODAwLCAgICAgMTgwMCwgICAgICA3NjAsIDB4NzM4Njc0YTYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgMjE2MDAsICAgICAgMjE2MDAsICAgICAxODAwLCAgICAgIDc2MiwgMHg0ZjgwN2MyOCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICAyMzQwMCwgICAgICAyMzQwMCwgICAgIDE4MDAsICAgICAgNzYxLCAweGVhMTE3YzY1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDI1MjAwLCAgICAgIDI1MjAwLCAgICAgMTgwMCwgICAgICA3NTgsIDB4YThhZDdkMmYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgMjcwMDAsICAgICAgMjcwMDAsICAgICAxODAwLCAgICAgIDc1NiwgMHhiZWE1NzQ3YSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICAyODgwMCwgICAgICAyODgwMCwgICAgIDE4MDAsICAgICAgNzYyLCAweDYyY2U4YWI3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDMwNjAwLCAgICAgIDMwNjAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4ZDdkMzZlZTksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgMzI0MDAsICAgICAgMzI0MDAsICAgICAxODAwLCAgICAgIDc2NSwgMHgwNjhiN2IxNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICAzNDIwMCwgICAgICAzNDIwMCwgICAgIDE4MDAsICAgICAgNzcyLCAweDdjNDA4NmY3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDM2MDAwLCAgICAgIDM2MDAwLCAgICAgMTgwMCwgICAgICA4MTcsIDB4ODE4MjhlOGMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgMzc4MDAsICAgICAgMzc4MDAsICAgICAxODAwLCAgICAgIDgyOCwgMHgxODJkOTYyMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICAzOTYwMCwgICAgICAzOTYwMCwgICAgIDE4MDAsICAgICAgOTUyLCAweGNiMzZkN2YzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDQxNDAwLCAgICAgIDQxNDAwLCAgICAgMTgwMCwgICAgICA4MTksIDB4OTQwNDljNDYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgNDMyMDAsICAgICAgNDMyMDAsICAgICAxODAwLCAgICAgIDgxNiwgMHg5YTA3OTRkZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA0NTAwMCwgICAgICA0NTAwMCwgICAgIDE4MDAsICAgICAgODI1LCAweDI3NDVhMGI1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDQ2ODAwLCAgICAgIDQ2ODAwLCAgICAgMTgwMCwgICAgICA4MTQsIDB4NGFiYzk5NGMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgNDg2MDAsICAgICAgNDg2MDAsICAgICAxODAwLCAgICAgIDgyNCwgMHhlNDliODllYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA1MDQwMCwgICAgICA1MDQwMCwgICAgIDE4MDAsICAgICAgODE1LCAweDJmNGI4NjczLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDUyMjAwLCAgICAgIDUyMjAwLCAgICAgMTgwMCwgICAgICA4MjQsIDB4NzAzZGE3OWEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgNTQwMDAsICAgICAgNTQwMDAsICAgICAxODAwLCAgICAgIDgyMiwgMHg0MWU1OTI4NSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA1NTgwMCwgICAgICA1NTgwMCwgICAgIDE4MDAsICAgICAgODE5LCAweGJjNGM4ZjRkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDU3NjAwLCAgICAgIDU3NjAwLCAgICAgMTgwMCwgICAgICA4MTcsIDB4YmE3Zjk2MTQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgNTk0MDAsICAgICAgNTk0MDAsICAgICAxODAwLCAgICAgIDgyNiwgMHg3NGNiOWIxMCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA2MTIwMCwgICAgICA2MTIwMCwgICAgIDE4MDAsICAgICAgODIyLCAweGFiNGJhNDM1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDYzMDAwLCAgICAgIDYzMDAwLCAgICAgMTgwMCwgICAgICA4MTUsIDB4ZjEyMDllZWIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgNjQ4MDAsICAgICAgNjQ4MDAsICAgICAxODAwLCAgICAgIDgyMCwgMHgzMDJiOGY0YSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA2NjYwMCwgICAgICA2NjYwMCwgICAgIDE4MDAsICAgICAgODI4LCAweDE2ZTI5YjFiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDY4NDAwLCAgICAgIDY4NDAwLCAgICAgMTgwMCwgICAgICA4MjgsIDB4MjFkYmEzNTMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgNzAyMDAsICAgICAgNzAyMDAsICAgICAxODAwLCAgICAgIDk0MiwgMHhmNTFjZDUxNywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA3MjAwMCwgICAgICA3MjAwMCwgICAgIDE4MDAsICAgICAgODA5LCAweDIyYjI5Njg3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDczODAwLCAgICAgIDczODAwLCAgICAgMTgwMCwgICAgICA4MjMsIDB4NWE1NDllMjAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgNzU2MDAsICAgICAgNzU2MDAsICAgICAxODAwLCAgICAgIDgyNywgMHg1MWJjOTEzMCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA3NzQwMCwgICAgICA3NzQwMCwgICAgIDE4MDAsICAgICAgODIzLCAweDlhMmQ5MzM0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDc5MjAwLCAgICAgIDc5MjAwLCAgICAgMTgwMCwgICAgICA4MjUsIDB4NmIyYzhhMWYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgODEwMDAsICAgICAgODEwMDAsICAgICAxODAwLCAgICAgIDgyOCwgMHhmMTE2OTVjOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA4MjgwMCwgICAgICA4MjgwMCwgICAgIDE4MDAsICAgICAgODIzLCAweGNkYjc5ZWRmLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDg0NjAwLCAgICAgIDg0NjAwLCAgICAgMTgwMCwgICAgICA4MTcsIDB4NTU4Njk1MGQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgODY0MDAsICAgICAgODY0MDAsICAgICAxODAwLCAgICAgIDgxMywgMHhiNGY3OTY4OCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA4ODIwMCwgICAgICA4ODIwMCwgICAgIDE4MDAsICAgICAgODA5LCAweGVmOGU5NTQ4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDkwMDAwLCAgICAgIDkwMDAwLCAgICAgMTgwMCwgICAgICA4MTMsIDB4MDhlMThiNmMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgOTE4MDAsICAgICAgOTE4MDAsICAgICAxODAwLCAgICAgIDgyMCwgMHg5NDc1OTM0NiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA5MzYwMCwgICAgICA5MzYwMCwgICAgIDE4MDAsICAgICAgODE4LCAweDdiYTE5OGRjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgIDk1NDAwLCAgICAgIDk1NDAwLCAgICAgMTgwMCwgICAgICA4MjUsIDB4OTZkMDk1ZmUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAgOTcyMDAsICAgICAgOTcyMDAsICAgICAxODAwLCAgICAgIDgwOCwgMHhhNzJmYTBhYywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgICA5OTAwMCwgICAgICA5OTAwMCwgICAgIDE4MDAsICAgICAgNzc0LCAweDM2YzY3ZjNjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTAwODAwLCAgICAgMTAwODAwLCAgICAgMTgwMCwgICAgICA3NzQsIDB4MDhhYzgyOTIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxMDI2MDAsICAgICAxMDI2MDAsICAgICAxODAwLCAgICAgIDc3NywgMHg4NjY1OTFlYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDEwNDQwMCwgICAgIDEwNDQwMCwgICAgIDE4MDAsICAgICAgNzc2LCAweGQzY2I3ZWM2LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTA2MjAwLCAgICAgMTA2MjAwLCAgICAgMTgwMCwgICAgICA3NzksIDB4YzY5MjdhOTMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxMDgwMDAsICAgICAxMDgwMDAsICAgICAxODAwLCAgICAgIDc3OSwgMHg3M2QxODJjYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDEwOTgwMCwgICAgIDEwOTgwMCwgICAgIDE4MDAsICAgICAgNzc0LCAweGQ5Nzg3MWQyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTExNjAwLCAgICAgMTExNjAwLCAgICAgMTgwMCwgICAgICA3NzIsIDB4MzcyMjg1MjksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxMTM0MDAsICAgICAxMTM0MDAsICAgICAxODAwLCAgICAgIDc3OSwgMHg5ZjYxODU2MiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDExNTIwMCwgICAgIDExNTIwMCwgICAgIDE4MDAsICAgICAgNzc0LCAweGVlMDc4YmQ4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTE3MDAwLCAgICAgMTE3MDAwLCAgICAgMTgwMCwgICAgICA3NzIsIDB4Y2VlZDgwMDMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxMTg4MDAsICAgICAxMTg4MDAsICAgICAxODAwLCAgICAgIDc3MSwgMHg4ZTQ3OGRhMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDEyMDYwMCwgICAgIDEyMDYwMCwgICAgIDE4MDAsICAgICAgNzc2LCAweDRmYWU4MzE5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTIyNDAwLCAgICAgMTIyNDAwLCAgICAgMTgwMCwgICAgICA3NzYsIDB4ZWE1ZDkxYWIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxMjQyMDAsICAgICAxMjQyMDAsICAgICAxODAwLCAgICAgIDc3NywgMHg1MmI5ODhmMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDEyNjAwMCwgICAgIDEyNjAwMCwgICAgIDE4MDAsICAgICAgNzc5LCAweGIyNTE4N2UyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTI3ODAwLCAgICAgMTI3ODAwLCAgICAgMTgwMCwgICAgICA3NzksIDB4YmUwYzg4ZGUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxMjk2MDAsICAgICAxMjk2MDAsICAgICAxODAwLCAgICAgIDc3NCwgMHhhYWI1ODI2MywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDEzMTQwMCwgICAgIDEzMTQwMCwgICAgIDE4MDAsICAgICAgNzc5LCAweGQxYjU4MDkwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTMzMjAwLCAgICAgMTMzMjAwLCAgICAgMTgwMCwgICAgICA3ODIsIDB4NDYyMjkxOTMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxMzUwMDAsICAgICAxMzUwMDAsICAgICAxODAwLCAgICAgIDc3NiwgMHg4NzNjOGUwOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDEzNjgwMCwgICAgIDEzNjgwMCwgICAgIDE4MDAsICAgICAgNzc4LCAweDNlYTU3OGU4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTM4NjAwLCAgICAgMTM4NjAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4ZWJmODhkMmMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxNDA0MDAsICAgICAxNDA0MDAsICAgICAxODAwLCAgICAgIDc4NSwgMHg5YTg4ODZlMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE0MjIwMCwgICAgIDE0MjIwMCwgICAgIDE4MDAsICAgICAgNzgyLCAweDAwMDI4M2QwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTQ0MDAwLCAgICAgMTQ0MDAwLCAgICAgMTgwMCwgICAgICA3ODIsIDB4N2M3ZjdlN2YsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxNDU4MDAsICAgICAxNDU4MDAsICAgICAxODAwLCAgICAgIDc4MCwgMHhkYmExN2U3NCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE0NzYwMCwgICAgIDE0NzYwMCwgICAgIDE4MDAsICAgICAgNzc2LCAweDdhNzc4MjNhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTQ5NDAwLCAgICAgMTQ5NDAwLCAgICAgMTgwMCwgICAgICA3ODAsIDB4NTcwZTg0NTksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxNTEyMDAsICAgICAxNTEyMDAsICAgICAxODAwLCAgICAgIDc4NCwgMHgxMzAwOGRhMCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE1MzAwMCwgICAgIDE1MzAwMCwgICAgIDE4MDAsICAgICAgNzc2LCAweGY5N2I4NWJiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTU0ODAwLCAgICAgMTU0ODAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4N2VhODhiOTUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxNTY2MDAsICAgICAxNTY2MDAsICAgICAxODAwLCAgICAgIDc4MywgMHg0NWEwN2RiMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE1ODQwMCwgICAgIDE1ODQwMCwgICAgIDE4MDAsICAgICAgNzgwLCAweGMzNTk4ZGViLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTYwMjAwLCAgICAgMTYwMjAwLCAgICAgMTgwMCwgICAgICA3ODIsIDB4NGFlZTg2ZDUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxNjIwMDAsICAgICAxNjIwMDAsICAgICAxODAwLCAgICAgIDg0OCwgMHgyYWRlOWQ3NSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE2MzgwMCwgICAgIDE2MzgwMCwgICAgIDE4MDAsICAgICAgODQ5LCAweGM2MTdhOTBlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTY1NjAwLCAgICAgMTY1NjAwLCAgICAgMTgwMCwgICAgICA3ODMsIDB4Yzk5ZDgzNDgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxNjc0MDAsICAgICAxNjc0MDAsICAgICAxODAwLCAgICAgIDc4NCwgMHgwMTkzODQxNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE2OTIwMCwgICAgIDE2OTIwMCwgICAgIDE4MDAsICAgICAgNzg1LCAweGFhMWU3ZjNhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTcxMDAwLCAgICAgMTcxMDAwLCAgICAgMTgwMCwgICAgICA3ODMsIDB4MzczOTg0ZTUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxNzI4MDAsICAgICAxNzI4MDAsICAgICAxODAwLCAgICAgIDg3NiwgMHgzMGMzYjA0NSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE3NDYwMCwgICAgIDE3NDYwMCwgICAgIDE4MDAsICAgICAgNzc2LCAweDU0YjU4NDc1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTc2NDAwLCAgICAgMTc2NDAwLCAgICAgMTgwMCwgICAgICA3ODcsIDB4NzZlNzg1NmYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxNzgyMDAsICAgICAxNzgyMDAsICAgICAxODAwLCAgICAgIDc4MSwgMHhmMWY2ODBjMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE4MDAwMCwgICAgIDE4MDAwMCwgICAgIDE4MDAsICAgICAgODUyLCAweGFlOGJhZWM1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTgxODAwLCAgICAgMTgxODAwLCAgICAgMTgwMCwgICAgICA4NDksIDB4MjcwZDlkNzUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxODM2MDAsICAgICAxODM2MDAsICAgICAxODAwLCAgICAgIDg3MywgMHgzZDIwYWU5NywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE4NTQwMCwgICAgIDE4NTQwMCwgICAgIDE4MDAsICAgICAgODQzLCAweDBlZjRhMmUwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTg3MjAwLCAgICAgMTg3MjAwLCAgICAgMTgwMCwgICAgICA4NDEsIDB4ZjJjNWFkODUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxODkwMDAsICAgICAxODkwMDAsICAgICAxODAwLCAgICAgIDc3NywgMHhlYmY4OGRiZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE5MDgwMCwgICAgIDE5MDgwMCwgICAgIDE4MDAsICAgICAgODQ2LCAweDc3YmRhMzU4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTkyNjAwLCAgICAgMTkyNjAwLCAgICAgMTgwMCwgICAgICA3ODIsIDB4NDc5NTg1MzIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxOTQ0MDAsICAgICAxOTQ0MDAsICAgICAxODAwLCAgICAgIDg2OSwgMHhhMWMxYWUzOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDE5NjIwMCwgICAgIDE5NjIwMCwgICAgIDE4MDAsICAgICAgNzc4LCAweGE3NDI4NTgxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMTk4MDAwLCAgICAgMTk4MDAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4NTUwZTg1YzQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAxOTk4MDAsICAgICAxOTk4MDAsICAgICAxODAwLCAgICAgIDg3MCwgMHg0NmM4YzM3NCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDIwMTYwMCwgICAgIDIwMTYwMCwgICAgIDE4MDAsICAgICAgNzgyLCAweDZhNDQ4NTBiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjAzNDAwLCAgICAgMjAzNDAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4Yjk1Njc3NWUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyMDUyMDAsICAgICAyMDUyMDAsICAgICAxODAwLCAgICAgIDg2OSwgMHgzZmM0YjIzYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDIwNzAwMCwgICAgIDIwNzAwMCwgICAgIDE4MDAsICAgICAgNzcyLCAweDgxNTY4NTcyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjA4ODAwLCAgICAgMjA4ODAwLCAgICAgMTgwMCwgICAgICA3NzUsIDB4Nzc2ODg3MzgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyMTA2MDAsICAgICAyMTA2MDAsICAgICAxODAwLCAgICAgIDc3MSwgMHgxZjIyNzZmMSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDIxMjQwMCwgICAgIDIxMjQwMCwgICAgIDE4MDAsICAgICAgNzc4LCAweDgyZWM3ZTA3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjE0MjAwLCAgICAgMjE0MjAwLCAgICAgMTgwMCwgICAgICA4NjcsIDB4MTA0MmFjYjgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyMTYwMDAsICAgICAyMTYwMDAsICAgICAxODAwLCAgICAgIDc3OCwgMHgzZjAwN2QxYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDIxNzgwMCwgICAgIDIxNzgwMCwgICAgIDE4MDAsICAgICAgNzc0LCAweDY2YTA4NzgwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjE5NjAwLCAgICAgMjE5NjAwLCAgICAgMTgwMCwgICAgICA3NzUsIDB4ZWJkYzgyMmQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyMjE0MDAsICAgICAyMjE0MDAsICAgICAxODAwLCAgICAgIDc3NCwgMHgzM2Q3ODk0ZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDIyMzIwMCwgICAgIDIyMzIwMCwgICAgIDE4MDAsICAgICAgNzc0LCAweDczNGM3NjIzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjI1MDAwLCAgICAgMjI1MDAwLCAgICAgMTgwMCwgICAgICA3NzIsIDB4YmI5OTc3ZDIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyMjY4MDAsICAgICAyMjY4MDAsICAgICAxODAwLCAgICAgIDc3NCwgMHg4Zjg2NzBkMSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDIyODYwMCwgICAgIDIyODYwMCwgICAgIDE4MDAsICAgICAgNzc1LCAweDIzODU3ZjI4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjMwNDAwLCAgICAgMjMwNDAwLCAgICAgMTgwMCwgICAgICA3NzMsIDB4NzA5ZjY3MzEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyMzIyMDAsICAgICAyMzIyMDAsICAgICAxODAwLCAgICAgIDc3MywgMHhjMWZhNzUyZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDIzNDAwMCwgICAgIDIzNDAwMCwgICAgIDE4MDAsICAgICAgNzY5LCAweDJlMzM3ZmU0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjM1ODAwLCAgICAgMjM1ODAwLCAgICAgMTgwMCwgICAgICA3NzQsIDB4NGFiMDdiNmYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyMzc2MDAsICAgICAyMzc2MDAsICAgICAxODAwLCAgICAgIDc3OSwgMHg5NWQzODZmOCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDIzOTQwMCwgICAgIDIzOTQwMCwgICAgIDE4MDAsICAgICAgNzgyLCAweDM4NjM3ZGM1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjQxMjAwLCAgICAgMjQxMjAwLCAgICAgMTgwMCwgICAgICA3NzksIDB4NzhhNzc4ZDUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyNDMwMDAsICAgICAyNDMwMDAsICAgICAxODAwLCAgICAgIDc3OCwgMHhiOTQ1NzYwZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI0NDgwMCwgICAgIDI0NDgwMCwgICAgIDE4MDAsICAgICAgNzcxLCAweDY3NDk3NTFhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjQ2NjAwLCAgICAgMjQ2NjAwLCAgICAgMTgwMCwgICAgICA3NzUsIDB4MDVjZDdjNmQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyNDg0MDAsICAgICAyNDg0MDAsICAgICAxODAwLCAgICAgIDc3NywgMHgyNTU4NzQ2MywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI1MDIwMCwgICAgIDI1MDIwMCwgICAgIDE4MDAsICAgICAgNzczLCAweDZhYjk3YzFkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjUyMDAwLCAgICAgMjUyMDAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4MmI5NDdkNDMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyNTM4MDAsICAgICAyNTM4MDAsICAgICAxODAwLCAgICAgIDc3NywgMHgzZjMzNzg5MywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI1NTYwMCwgICAgIDI1NTYwMCwgICAgIDE4MDAsICAgICAgOTA4LCAweDY0YjFiZTRlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjU3NDAwLCAgICAgMjU3NDAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4YjQ4MDg3M2UsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyNTkyMDAsICAgICAyNTkyMDAsICAgICAxODAwLCAgICAgIDc3MiwgMHhiM2VjNzZjMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI2MTAwMCwgICAgIDI2MTAwMCwgICAgIDE4MDAsICAgICAgNzc4LCAweDRlN2M3ZWY5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjYyODAwLCAgICAgMjYyODAwLCAgICAgMTgwMCwgICAgICA3NzYsIDB4Y2RjNjgzN2YsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyNjQ2MDAsICAgICAyNjQ2MDAsICAgICAxODAwLCAgICAgIDc3NSwgMHhmMjUwODk0MiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI2NjQwMCwgICAgIDI2NjQwMCwgICAgIDE4MDAsICAgICAgNzcyLCAweDEyOTA3NDg5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjY4MjAwLCAgICAgMjY4MjAwLCAgICAgMTgwMCwgICAgICA3NzgsIDB4OWM2ZjdlYzQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyNzAwMDAsICAgICAyNzAwMDAsICAgICAxODAwLCAgICAgIDgwOCwgMHgwMGI2OGI1MywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI3MTgwMCwgICAgIDI3MTgwMCwgICAgIDE4MDAsICAgICAgODM2LCAweDVlYWZhMTNiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjczNjAwLCAgICAgMjczNjAwLCAgICAgMTgwMCwgICAgICA5MTMsIDB4NDFiYmI4ZWYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyNzU0MDAsICAgICAyNzU0MDAsICAgICAxODAwLCAgICAgIDgzNywgMHhjODdjOTcyMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI3NzIwMCwgICAgIDI3NzIwMCwgICAgIDE4MDAsICAgICAgODM0LCAweDBmNmE5ZTZiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjc5MDAwLCAgICAgMjc5MDAwLCAgICAgMTgwMCwgICAgICA4MzYsIDB4NDQ0N2FmODQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyODA4MDAsICAgICAyODA4MDAsICAgICAxODAwLCAgICAgIDgzMiwgMHg5NWJlYTVjNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI4MjYwMCwgICAgIDI4MjYwMCwgICAgIDE4MDAsICAgICAgODI2LCAweDE3YjdhYjc3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjg0NDAwLCAgICAgMjg0NDAwLCAgICAgMTgwMCwgICAgICA4MTcsIDB4ODVlYjlkZWMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyODYyMDAsICAgICAyODYyMDAsICAgICAxODAwLCAgICAgIDgyNSwgMHhlMjE0ODliNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI4ODAwMCwgICAgIDI4ODAwMCwgICAgIDE4MDAsICAgICAgODI0LCAweGEyNzE5NTAxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjg5ODAwLCAgICAgMjg5ODAwLCAgICAgMTgwMCwgICAgICA4MjgsIDB4YWQzZDhkZmMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyOTE2MDAsICAgICAyOTE2MDAsICAgICAxODAwLCAgICAgIDgzMywgMHgzOTQxOWE5ZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI5MzQwMCwgICAgIDI5MzQwMCwgICAgIDE4MDAsICAgICAgODMyLCAweDdiNDZiMGQwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMjk1MjAwLCAgICAgMjk1MjAwLCAgICAgMTgwMCwgICAgICA4OTYsIDB4MzUxYWExMjksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAyOTcwMDAsICAgICAyOTcwMDAsICAgICAxODAwLCAgICAgIDgyNCwgMHgyMTViYTZhNiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDI5ODgwMCwgICAgIDI5ODgwMCwgICAgIDE4MDAsICAgICAgODEyLCAweDUyM2FhNmU0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzAwNjAwLCAgICAgMzAwNjAwLCAgICAgMTgwMCwgICAgICA4MjEsIDB4M2YzZmE2ZGYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzMDI0MDAsICAgICAzMDI0MDAsICAgICAxODAwLCAgICAgIDg4MywgMHhhODdhOTg4NiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDMwNDIwMCwgICAgIDMwNDIwMCwgICAgIDE4MDAsICAgICAgODIwLCAweGUwOTdhN2VlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzA2MDAwLCAgICAgMzA2MDAwLCAgICAgMTgwMCwgICAgICA4MzUsIDB4ZjNhM2E0OTYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzMDc4MDAsICAgICAzMDc4MDAsICAgICAxODAwLCAgICAgIDgzMywgMHhhN2QxYTEzZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDMwOTYwMCwgICAgIDMwOTYwMCwgICAgIDE4MDAsICAgICAgODMwLCAweGFiNzE5ZjI1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzExNDAwLCAgICAgMzExNDAwLCAgICAgMTgwMCwgICAgICA4MjAsIDB4ODA1OTk3NTQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzMTMyMDAsICAgICAzMTMyMDAsICAgICAxODAwLCAgICAgIDgxNSwgMHg1MTdlOGRlYywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDMxNTAwMCwgICAgIDMxNTAwMCwgICAgIDE4MDAsICAgICAgODI3LCAweDhlMzM4NTViLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzE2ODAwLCAgICAgMzE2ODAwLCAgICAgMTgwMCwgICAgICA4MTksIDB4NmE3ZDg4YTMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzMTg2MDAsICAgICAzMTg2MDAsICAgICAxODAwLCAgICAgIDgyOCwgMHg2OWIwOTQ5NywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDMyMDQwMCwgICAgIDMyMDQwMCwgICAgIDE4MDAsICAgICAgODMwLCAweDcyY2I5ZjJhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzIyMjAwLCAgICAgMzIyMjAwLCAgICAgMTgwMCwgICAgICA4MjgsIDB4YjcyOTk4OTcsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzMjQwMDAsICAgICAzMjQwMDAsICAgICAxODAwLCAgICAgIDgyOSwgMHg5ZGNhYTRiOCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDMyNTgwMCwgICAgIDMyNTgwMCwgICAgIDE4MDAsICAgICAgODIwLCAweDYzMDNhNmJkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzI3NjAwLCAgICAgMzI3NjAwLCAgICAgMTgwMCwgICAgICA4MjMsIDB4ZjFkNjk0ZTcsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzMjk0MDAsICAgICAzMjk0MDAsICAgICAxODAwLCAgICAgIDc5OCwgMHg2YWRkOGNmYywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDMzMTIwMCwgICAgIDMzMTIwMCwgICAgIDE4MDAsICAgICAgNzcyLCAweGQ3OTI3MzMxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzMzMDAwLCAgICAgMzMzMDAwLCAgICAgMTgwMCwgICAgICA3NzksIDB4ODJlYjc2NjAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzMzQ4MDAsICAgICAzMzQ4MDAsICAgICAxODAwLCAgICAgIDc3NCwgMHg1MDIxN2UyYiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDMzNjYwMCwgICAgIDMzNjYwMCwgICAgIDE4MDAsICAgICAgOTA3LCAweGZjZDdiYzdlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzM4NDAwLCAgICAgMzM4NDAwLCAgICAgMTgwMCwgICAgICA3NzIsIDB4NDMzYjZjMTksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzNDAyMDAsICAgICAzNDAyMDAsICAgICAxODAwLCAgICAgIDc3NywgMHhmMzczN2M5MywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM0MjAwMCwgICAgIDM0MjAwMCwgICAgIDE4MDAsICAgICAgNzc3LCAweDc0YzE4NTgwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzQzODAwLCAgICAgMzQzODAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4YjRkOTdiMzksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzNDU2MDAsICAgICAzNDU2MDAsICAgICAxODAwLCAgICAgIDc3NSwgMHhkZTNhODVmZCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM0NzQwMCwgICAgIDM0NzQwMCwgICAgIDE4MDAsICAgICAgNzczLCAweGYyZmM4ZDExLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzQ5MjAwLCAgICAgMzQ5MjAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4YWMzZjg2ZDAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzNTEwMDAsICAgICAzNTEwMDAsICAgICAxODAwLCAgICAgIDc3NywgMHg2YTEzODI2NSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM1MjgwMCwgICAgIDM1MjgwMCwgICAgIDE4MDAsICAgICAgNzc2LCAweGZiYjU4Y2ExLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzU0NjAwLCAgICAgMzU0NjAwLCAgICAgMTgwMCwgICAgICA3ODAsIDB4ZDI4YTg0Y2YsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzNTY0MDAsICAgICAzNTY0MDAsICAgICAxODAwLCAgICAgIDc3NiwgMHg2MjNhN2U1NiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM1ODIwMCwgICAgIDM1ODIwMCwgICAgIDE4MDAsICAgICAgNzc4LCAweGNjYjE3ZDUxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzYwMDAwLCAgICAgMzYwMDAwLCAgICAgMTgwMCwgICAgICA3NzQsIDB4MTU3NDdmY2IsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzNjE4MDAsICAgICAzNjE4MDAsICAgICAxODAwLCAgICAgIDc3OCwgMHhlYmY0ODg1MiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM2MzYwMCwgICAgIDM2MzYwMCwgICAgIDE4MDAsICAgICAgNzc3LCAweGVjMGQ3MWY1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzY1NDAwLCAgICAgMzY1NDAwLCAgICAgMTgwMCwgICAgICA3NzMsIDB4ZWEzMjgwNTUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzNjcyMDAsICAgICAzNjcyMDAsICAgICAxODAwLCAgICAgIDc4MiwgMHhjNDdjOGJhNiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM2OTAwMCwgICAgIDM2OTAwMCwgICAgIDE4MDAsICAgICAgNzgwLCAweDlkZTM4ZWE1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzcwODAwLCAgICAgMzcwODAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4YTFkOTg5YzMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzNzI2MDAsICAgICAzNzI2MDAsICAgICAxODAwLCAgICAgIDc3NSwgMHhmZjhlODI5YiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM3NDQwMCwgICAgIDM3NDQwMCwgICAgIDE4MDAsICAgICAgNzc3LCAweDdmNDY4NWJkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzc2MjAwLCAgICAgMzc2MjAwLCAgICAgMTgwMCwgICAgICA3NzYsIDB4OTExMDkwZWYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzNzgwMDAsICAgICAzNzgwMDAsICAgICAxODAwLCAgICAgIDc3OCwgMHg0N2EwODZiMSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM3OTgwMCwgICAgIDM3OTgwMCwgICAgIDE4MDAsICAgICAgNzc1LCAweDgzZjA4MWY0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzgxNjAwLCAgICAgMzgxNjAwLCAgICAgMTgwMCwgICAgICA3NzUsIDB4ZjdkNDg3NDEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzODM0MDAsICAgICAzODM0MDAsICAgICAxODAwLCAgICAgIDc3OSwgMHgyYzA4N2E3YiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM4NTIwMCwgICAgIDM4NTIwMCwgICAgIDE4MDAsICAgICAgNzc5LCAweDVjNzc4NTdhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzg3MDAwLCAgICAgMzg3MDAwLCAgICAgMTgwMCwgICAgICA3NzgsIDB4NDY5MDdiNzAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzODg4MDAsICAgICAzODg4MDAsICAgICAxODAwLCAgICAgIDc4MCwgMHhjM2E4OGY2OCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM5MDYwMCwgICAgIDM5MDYwMCwgICAgIDE4MDAsICAgICAgNzc4LCAweDM1YWE4MThiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzkyNDAwLCAgICAgMzkyNDAwLCAgICAgMTgwMCwgICAgICA3NzYsIDB4ZmIzZDc0OWMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzOTQyMDAsICAgICAzOTQyMDAsICAgICAxODAwLCAgICAgIDc3NywgMHg5NWUzN2ZkYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDM5NjAwMCwgICAgIDM5NjAwMCwgICAgIDE4MDAsICAgICAgODQxLCAweGJmZmZhMzkzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgMzk3ODAwLCAgICAgMzk3ODAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4NjM4NThmNjcsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICAzOTk2MDAsICAgICAzOTk2MDAsICAgICAxODAwLCAgICAgIDc4MCwgMHhlMjc3ODg0YiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQwMTQwMCwgICAgIDQwMTQwMCwgICAgIDE4MDAsICAgICAgNzc3LCAweDFlNjU4NjU5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDAzMjAwLCAgICAgNDAzMjAwLCAgICAgMTgwMCwgICAgICA3NzcsIDB4MGVkMTdkZjMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0MDUwMDAsICAgICA0MDUwMDAsICAgICAxODAwLCAgICAgIDc3OCwgMHg4MDRiNmZhZCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQwNjgwMCwgICAgIDQwNjgwMCwgICAgIDE4MDAsICAgICAgNzc4LCAweDZiMmM4NTEyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDA4NjAwLCAgICAgNDA4NjAwLCAgICAgMTgwMCwgICAgICA3NzksIDB4NmNhNzc2ZDMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0MTA0MDAsICAgICA0MTA0MDAsICAgICAxODAwLCAgICAgIDc3NiwgMHg2YThiOGVhOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQxMjIwMCwgICAgIDQxMjIwMCwgICAgIDE4MDAsICAgICAgNzg0LCAweDFhMzY3ZjQzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDE0MDAwLCAgICAgNDE0MDAwLCAgICAgMTgwMCwgICAgICA3NzYsIDB4MTlkMjg2NWEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0MTU4MDAsICAgICA0MTU4MDAsICAgICAxODAwLCAgICAgIDc3OCwgMHhiMDBkODYwZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQxNzYwMCwgICAgIDQxNzYwMCwgICAgIDE4MDAsICAgICAgNzc1LCAweDlkNGY3YjgwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDE5NDAwLCAgICAgNDE5NDAwLCAgICAgMTgwMCwgICAgICA3ODEsIDB4NDJmMTg2M2IsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0MjEyMDAsICAgICA0MjEyMDAsICAgICAxODAwLCAgICAgIDc3OSwgMHg2YjY2OWQ0ZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQyMzAwMCwgICAgIDQyMzAwMCwgICAgIDE4MDAsICAgICAgODQ2LCAweDlhM2ZhYjA0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDI0ODAwLCAgICAgNDI0ODAwLCAgICAgMTgwMCwgICAgICA3NzYsIDB4MmRiODc1ZTIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0MjY2MDAsICAgICA0MjY2MDAsICAgICAxODAwLCAgICAgIDc4MSwgMHhiYWRmODU4MCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQyODQwMCwgICAgIDQyODQwMCwgICAgIDE4MDAsICAgICAgNzgzLCAweGVkODc4Mzc4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDMwMjAwLCAgICAgNDMwMjAwLCAgICAgMTgwMCwgICAgICA5NzEsIDB4ZjIzYWYyYTksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0MzIwMDAsICAgICA0MzIwMDAsICAgICAxODAwLCAgICAgIDk3MCwgMHhjZWNmZWU0ZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQzMzgwMCwgICAgIDQzMzgwMCwgICAgIDE4MDAsICAgICAgOTY3LCAweGM3MzdlZWU3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDM1NjAwLCAgICAgNDM1NjAwLCAgICAgMTgwMCwgICAgICA3NzYsIDB4MTEzZDg0NTgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0Mzc0MDAsICAgICA0Mzc0MDAsICAgICAxODAwLCAgICAgIDk3MSwgMHhkOGEzZTc3ZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQzOTIwMCwgICAgIDQzOTIwMCwgICAgIDE4MDAsICAgICAgOTYyLCAweGU0NTRlMzQ0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDQxMDAwLCAgICAgNDQxMDAwLCAgICAgMTgwMCwgICAgICA5NjQsIDB4MDFiY2UzODMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0NDI4MDAsICAgICA0NDI4MDAsICAgICAxODAwLCAgICAgIDc3MywgMHhiMjU3ODAwYiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ0NDYwMCwgICAgIDQ0NDYwMCwgICAgIDE4MDAsICAgICAgNzcwLCAweDM5MGE4ZmM5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDQ2NDAwLCAgICAgNDQ2NDAwLCAgICAgMTgwMCwgICAgICA5NjQsIDB4YjM3N2RjNDAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0NDgyMDAsICAgICA0NDgyMDAsICAgICAxODAwLCAgICAgIDk1OCwgMHg3MjVkZDFiYywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ1MDAwMCwgICAgIDQ1MDAwMCwgICAgIDE4MDAsICAgICAgNzc1LCAweDcxNjc2ZWY5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDUxODAwLCAgICAgNDUxODAwLCAgICAgMTgwMCwgICAgICA3NzUsIDB4MzAyZjdiZTQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0NTM2MDAsICAgICA0NTM2MDAsICAgICAxODAwLCAgICAgIDk2NiwgMHgxNWUyZGRmYywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ1NTQwMCwgICAgIDQ1NTQwMCwgICAgIDE4MDAsICAgICAgODQzLCAweGEzNzRhMDkxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDU3MjAwLCAgICAgNDU3MjAwLCAgICAgMTgwMCwgICAgICA4NDYsIDB4ZmVlZWExMmYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0NTkwMDAsICAgICA0NTkwMDAsICAgICAxODAwLCAgICAgIDc3NSwgMHhiYTQyNzhkNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ2MDgwMCwgICAgIDQ2MDgwMCwgICAgIDE4MDAsICAgICAgOTAxLCAweGMxMzVjYmQyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDYyNjAwLCAgICAgNDYyNjAwLCAgICAgMTgwMCwgICAgICA5NTgsIDB4Nzc4NWNlOGEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0NjQ0MDAsICAgICA0NjQ0MDAsICAgICAxODAwLCAgICAgIDc3MCwgMHg5M2ZmNzJlMCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ2NjIwMCwgICAgIDQ2NjIwMCwgICAgIDE4MDAsICAgICAgNzczLCAweDRiODU4NTIwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDY4MDAwLCAgICAgNDY4MDAwLCAgICAgMTgwMCwgICAgICA3NjgsIDB4Zjk3MThiYzEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0Njk4MDAsICAgICA0Njk4MDAsICAgICAxODAwLCAgICAgIDc3NiwgMHg0Mjk3OGE1ZCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ3MTYwMCwgICAgIDQ3MTYwMCwgICAgIDE4MDAsICAgICAgNzcxLCAweGQ0MGY4NWY0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDczNDAwLCAgICAgNDczNDAwLCAgICAgMTgwMCwgICAgICA3NzIsIDB4OWUzOTgxNGUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0NzUyMDAsICAgICA0NzUyMDAsICAgICAxODAwLCAgICAgIDk1OCwgMHhhNDAyZGQ1NCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ3NzAwMCwgICAgIDQ3NzAwMCwgICAgIDE4MDAsICAgICAgNzcxLCAweGVmNDg3NjVjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDc4ODAwLCAgICAgNDc4ODAwLCAgICAgMTgwMCwgICAgICA3NzAsIDB4MjAzNjdjN2MsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0ODA2MDAsICAgICA0ODA2MDAsICAgICAxODAwLCAgICAgIDk1OSwgMHhkODU1Y2U3NSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ4MjQwMCwgICAgIDQ4MjQwMCwgICAgIDE4MDAsICAgICAgNzY5LCAweDQ0ZTk4MDVmLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDg0MjAwLCAgICAgNDg0MjAwLCAgICAgMTgwMCwgICAgICA4NDAsIDB4MGNlYjkwYjksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0ODYwMDAsICAgICA0ODYwMDAsICAgICAxODAwLCAgICAgIDc2OSwgMHhlYjBiN2MyNSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ4NzgwMCwgICAgIDQ4NzgwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweDVjMjc4MDI3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDg5NjAwLCAgICAgNDg5NjAwLCAgICAgMTgwMCwgICAgICA5NTEsIDB4YTliNmRjM2YsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0OTE0MDAsICAgICA0OTE0MDAsICAgICAxODAwLCAgICAgIDc2OSwgMHg0MDgyODI1ZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ5MzIwMCwgICAgIDQ5MzIwMCwgICAgIDE4MDAsICAgICAgOTU4LCAweGQ3MWZlNjhhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNDk1MDAwLCAgICAgNDk1MDAwLCAgICAgMTgwMCwgICAgICA3NzMsIDB4MzVmNzg5Y2QsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA0OTY4MDAsICAgICA0OTY4MDAsICAgICAxODAwLCAgICAgIDc3MSwgMHhhMTVkN2VjYiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDQ5ODYwMCwgICAgIDQ5ODYwMCwgICAgIDE4MDAsICAgICAgNzY4LCAweDM1ZTc3YWNhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTAwNDAwLCAgICAgNTAwNDAwLCAgICAgMTgwMCwgICAgICA3NjUsIDB4ZTIzZjczYTUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1MDIyMDAsICAgICA1MDIyMDAsICAgICAxODAwLCAgICAgIDc3NCwgMHhhMmVmN2NhYywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDUwNDAwMCwgICAgIDUwNDAwMCwgICAgIDE4MDAsICAgICAgODM3LCAweDIzNTQ5NGYyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTA1ODAwLCAgICAgNTA1ODAwLCAgICAgMTgwMCwgICAgICA3NzMsIDB4ODg1MzgxNzUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1MDc2MDAsICAgICA1MDc2MDAsICAgICAxODAwLCAgICAgIDc3MywgMHgxNzc5ODFmYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDUwOTQwMCwgICAgIDUwOTQwMCwgICAgIDE4MDAsICAgICAgNzcwLCAweDI3M2Q3MzY0LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTExMjAwLCAgICAgNTExMjAwLCAgICAgMTgwMCwgICAgICA3NzAsIDB4M2U4MzdiZjYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1MTMwMDAsICAgICA1MTMwMDAsICAgICAxODAwLCAgICAgIDc3NCwgMHgwODIxOTA3OCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDUxNDgwMCwgICAgIDUxNDgwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweGViNWY3OTdjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTE2NjAwLCAgICAgNTE2NjAwLCAgICAgMTgwMCwgICAgICA3NzQsIDB4OGVhYTdhNDUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1MTg0MDAsICAgICA1MTg0MDAsICAgICAxODAwLCAgICAgIDgzMywgMHg3MzI0OTMwNSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDUyMDIwMCwgICAgIDUyMDIwMCwgICAgIDE4MDAsICAgICAgNzc0LCAweDk3ZTU4NWQ1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTIyMDAwLCAgICAgNTIyMDAwLCAgICAgMTgwMCwgICAgICA3NjgsIDB4NDViMjc4ZmUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1MjM4MDAsICAgICA1MjM4MDAsICAgICAxODAwLCAgICAgIDc3MywgMHhhY2Y0N2QyNSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDUyNTYwMCwgICAgIDUyNTYwMCwgICAgIDE4MDAsICAgICAgNzY4LCAweGQzODI3NzNkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTI3NDAwLCAgICAgNTI3NDAwLCAgICAgMTgwMCwgICAgICA3NjksIDB4MjBlOTdhNWYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1MjkyMDAsICAgICA1MjkyMDAsICAgICAxODAwLCAgICAgIDc2NywgMHgwZWY2N2RhYiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDUzMTAwMCwgICAgIDUzMTAwMCwgICAgIDE4MDAsICAgICAgNzczLCAweDVmYTk4NjkzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTMyODAwLCAgICAgNTMyODAwLCAgICAgMTgwMCwgICAgICA3NzQsIDB4ZDI3Njg2YWIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1MzQ2MDAsICAgICA1MzQ2MDAsICAgICAxODAwLCAgICAgIDc2OSwgMHhjM2Q2N2FjMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDUzNjQwMCwgICAgIDUzNjQwMCwgICAgIDE4MDAsICAgICAgODMzLCAweDgwYzg5ZjcwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTM4MjAwLCAgICAgNTM4MjAwLCAgICAgMTgwMCwgICAgICA3NjgsIDB4NTAwMDc3NmYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1NDAwMDAsICAgICA1NDAwMDAsICAgICAxODAwLCAgICAgIDc3MiwgMHg3OWIyODEyZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU0MTgwMCwgICAgIDU0MTgwMCwgICAgIDE4MDAsICAgICAgODM5LCAweDUyNzZhZDJiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTQzNjAwLCAgICAgNTQzNjAwLCAgICAgMTgwMCwgICAgICA3NjksIDB4YTU4Mjc5YjEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1NDU0MDAsICAgICA1NDU0MDAsICAgICAxODAwLCAgICAgIDc2OSwgMHg4MjZmOGMyYywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU0NzIwMCwgICAgIDU0NzIwMCwgICAgIDE4MDAsICAgICAgNzcxLCAweDVhNTA4OTgwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTQ5MDAwLCAgICAgNTQ5MDAwLCAgICAgMTgwMCwgICAgICA3NzAsIDB4NjU5YTdlMDksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1NTA4MDAsICAgICA1NTA4MDAsICAgICAxODAwLCAgICAgIDc3MSwgMHgzMGVmNzRkYiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU1MjYwMCwgICAgIDU1MjYwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweGM3NWQ4NGNkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTU0NDAwLCAgICAgNTU0NDAwLCAgICAgMTgwMCwgICAgICA4OTksIDB4OTg4MWM2MjcsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1NTYyMDAsICAgICA1NTYyMDAsICAgICAxODAwLCAgICAgIDk1MywgMHgwYzkwYmQxMCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU1ODAwMCwgICAgIDU1ODAwMCwgICAgIDE4MDAsICAgICAgNzcwLCAweDJjZGY4NDk4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTU5ODAwLCAgICAgNTU5ODAwLCAgICAgMTgwMCwgICAgICA3NzAsIDB4MGZkYzdjNjcsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1NjE2MDAsICAgICA1NjE2MDAsICAgICAxODAwLCAgICAgIDc3MSwgMHg3MjFhN2Q0MiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU2MzQwMCwgICAgIDU2MzQwMCwgICAgIDE4MDAsICAgICAgNzcwLCAweDE2NGM3MWZjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTY1MjAwLCAgICAgNTY1MjAwLCAgICAgMTgwMCwgICAgICA3NjksIDB4YzM2ZjdjNzEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1NjcwMDAsICAgICA1NjcwMDAsICAgICAxODAwLCAgICAgIDg5NiwgMHhmYWQ1YmMzOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU2ODgwMCwgICAgIDU2ODgwMCwgICAgIDE4MDAsICAgICAgOTU3LCAweDA4YzhlNGZmLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTcwNjAwLCAgICAgNTcwNjAwLCAgICAgMTgwMCwgICAgICA3NzMsIDB4MDA5YjgxYTAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1NzI0MDAsICAgICA1NzI0MDAsICAgICAxODAwLCAgICAgIDc3NCwgMHhhMjZkODNlOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU3NDIwMCwgICAgIDU3NDIwMCwgICAgIDE4MDAsICAgICAgOTU2LCAweDA1NDRkZGUxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTc2MDAwLCAgICAgNTc2MDAwLCAgICAgMTgwMCwgICAgICA3NjgsIDB4M2U0ODg3ZjMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1Nzc4MDAsICAgICA1Nzc4MDAsICAgICAxODAwLCAgICAgIDc3MCwgMHgyNDAwN2EzYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU3OTYwMCwgICAgIDU3OTYwMCwgICAgIDE4MDAsICAgICAgNzcxLCAweDE0NTA4Mjg3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTgxNDAwLCAgICAgNTgxNDAwLCAgICAgMTgwMCwgICAgICA5NTUsIDB4YTBmM2RlMTgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1ODMyMDAsICAgICA1ODMyMDAsICAgICAxODAwLCAgICAgIDk1MywgMHhjYjc1ZDJmZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU4NTAwMCwgICAgIDU4NTAwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweDg1ZWM3NDdlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTg2ODAwLCAgICAgNTg2ODAwLCAgICAgMTgwMCwgICAgICA3NjgsIDB4OGIyOTcxYTEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1ODg2MDAsICAgICA1ODg2MDAsICAgICAxODAwLCAgICAgIDc3NCwgMHhjNzNiOGE4NSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU5MDQwMCwgICAgIDU5MDQwMCwgICAgIDE4MDAsICAgICAgODM1LCAweGU3N2U5MzMzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTkyMjAwLCAgICAgNTkyMjAwLCAgICAgMTgwMCwgICAgICA3NjgsIDB4NTI0Mjg3MTMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1OTQwMDAsICAgICA1OTQwMDAsICAgICAxODAwLCAgICAgIDc2OSwgMHhmNjIzNzdmNSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDU5NTgwMCwgICAgIDU5NTgwMCwgICAgIDE4MDAsICAgICAgNzcxLCAweGIwODI3OTkwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNTk3NjAwLCAgICAgNTk3NjAwLCAgICAgMTgwMCwgICAgICA3NzEsIDB4YjkzYTg1MjIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA1OTk0MDAsICAgICA1OTk0MDAsICAgICAxODAwLCAgICAgIDc3MCwgMHg5ZTc0OGQyMywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDYwMTIwMCwgICAgIDYwMTIwMCwgICAgIDE4MDAsICAgICAgNzY4LCAweDkyZDY3NzllLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjAzMDAwLCAgICAgNjAzMDAwLCAgICAgMTgwMCwgICAgICA5NTEsIDB4MzcxYWU1MzUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2MDQ4MDAsICAgICA2MDQ4MDAsICAgICAxODAwLCAgICAgIDk1MCwgMHhlMjczZGZiOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDYwNjYwMCwgICAgIDYwNjYwMCwgICAgIDE4MDAsICAgICAgOTQ3LCAweGU4MDZkMWY3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjA4NDAwLCAgICAgNjA4NDAwLCAgICAgMTgwMCwgICAgICA5NTYsIDB4OWM2MWQyODYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2MTAyMDAsICAgICA2MTAyMDAsICAgICAxODAwLCAgICAgIDk1MSwgMHg3NmI1ZWUzNSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDYxMjAwMCwgICAgIDYxMjAwMCwgICAgIDE4MDAsICAgICAgOTQzLCAweGNmZTdlMTFiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjEzODAwLCAgICAgNjEzODAwLCAgICAgMTgwMCwgICAgICA3NjYsIDB4Y2M4Mzc2MGEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2MTU2MDAsICAgICA2MTU2MDAsICAgICAxODAwLCAgICAgIDg5MCwgMHhhZmJiYmI0ZCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDYxNzQwMCwgICAgIDYxNzQwMCwgICAgIDE4MDAsICAgICAgOTUyLCAweDZmYmFkZTMxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjE5MjAwLCAgICAgNjE5MjAwLCAgICAgMTgwMCwgICAgICA3NjYsIDB4NDliYTg0ZDQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2MjEwMDAsICAgICA2MjEwMDAsICAgICAxODAwLCAgICAgIDc2NywgMHhiMjllNmY4MywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDYyMjgwMCwgICAgIDYyMjgwMCwgICAgIDE4MDAsICAgICAgNzYwLCAweGZmZTQ3YTk1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjI0NjAwLCAgICAgNjI0NjAwLCAgICAgMTgwMCwgICAgICA5NDYsIDB4NzY4Y2RkZGEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2MjY0MDAsICAgICA2MjY0MDAsICAgICAxODAwLCAgICAgIDc2OSwgMHgxYTIyOGM3MCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDYyODIwMCwgICAgIDYyODIwMCwgICAgIDE4MDAsICAgICAgNzYwLCAweGE2Mjg3ZmQ3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjMwMDAwLCAgICAgNjMwMDAwLCAgICAgMTgwMCwgICAgICA3NjIsIDB4MWQyZDc2YjEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2MzE4MDAsICAgICA2MzE4MDAsICAgICAxODAwLCAgICAgIDc2NywgMHgwNDdjODQ1YywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDYzMzYwMCwgICAgIDYzMzYwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweGVhNmM3YTkxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjM1NDAwLCAgICAgNjM1NDAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4NDlkNDcxMzQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2MzcyMDAsICAgICA2MzcyMDAsICAgICAxODAwLCAgICAgIDc2MCwgMHhiMjlhNmVhNywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDYzOTAwMCwgICAgIDYzOTAwMCwgICAgIDE4MDAsICAgICAgNzYzLCAweDE0NDU4ODI1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjQwODAwLCAgICAgNjQwODAwLCAgICAgMTgwMCwgICAgICA3NjQsIDB4NmY0MzdmODcsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2NDI2MDAsICAgICA2NDI2MDAsICAgICAxODAwLCAgICAgIDc2NCwgMHhhMTc1N2JjZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY0NDQwMCwgICAgIDY0NDQwMCwgICAgIDE4MDAsICAgICAgNzYzLCAweDc3Yjg4NjNiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjQ2MjAwLCAgICAgNjQ2MjAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4MmVkZjcwZGQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2NDgwMDAsICAgICA2NDgwMDAsICAgICAxODAwLCAgICAgIDc2NCwgMHg5NjE3N2I5ZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY0OTgwMCwgICAgIDY0OTgwMCwgICAgIDE4MDAsICAgICAgNzY2LCAweGE3NTE2OGNmLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjUxNjAwLCAgICAgNjUxNjAwLCAgICAgMTgwMCwgICAgICA3NjcsIDB4YmExOTc1NmYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2NTM0MDAsICAgICA2NTM0MDAsICAgICAxODAwLCAgICAgIDc2NSwgMHg3ZTA2NzZkZCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY1NTIwMCwgICAgIDY1NTIwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweDYwYTE4ZGJkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjU3MDAwLCAgICAgNjU3MDAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4MDk0ZDc2MzYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2NTg4MDAsICAgICA2NTg4MDAsICAgICAxODAwLCAgICAgIDc2NywgMHgwY2ZhODAyMywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY2MDYwMCwgICAgIDY2MDYwMCwgICAgIDE4MDAsICAgICAgNzY4LCAweDY5ZWM4MWM1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjYyNDAwLCAgICAgNjYyNDAwLCAgICAgMTgwMCwgICAgICA3NjQsIDB4MTUzZjc4ZmYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2NjQyMDAsICAgICA2NjQyMDAsICAgICAxODAwLCAgICAgIDc2NSwgMHgwOGY5OGVkZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY2NjAwMCwgICAgIDY2NjAwMCwgICAgIDE4MDAsICAgICAgNzY0LCAweGIwNTQ3ZmU5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjY3ODAwLCAgICAgNjY3ODAwLCAgICAgMTgwMCwgICAgICA3NjksIDB4N2I2ODc4NjUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2Njk2MDAsICAgICA2Njk2MDAsICAgICAxODAwLCAgICAgIDc2NiwgMHgyMzhlODBlMSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY3MTQwMCwgICAgIDY3MTQwMCwgICAgIDE4MDAsICAgICAgNzY2LCAweDY4NDE4M2YyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjczMjAwLCAgICAgNjczMjAwLCAgICAgMTgwMCwgICAgICA4MjksIDB4ZTllMDk5NWQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2NzUwMDAsICAgICA2NzUwMDAsICAgICAxODAwLCAgICAgIDc2NSwgMHhhMDA0N2IzYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY3NjgwMCwgICAgIDY3NjgwMCwgICAgIDE4MDAsICAgICAgNzY2LCAweDVhZmI3YzExLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjc4NjAwLCAgICAgNjc4NjAwLCAgICAgMTgwMCwgICAgICA3NjYsIDB4Y2U1ZjdmMzUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2ODA0MDAsICAgICA2ODA0MDAsICAgICAxODAwLCAgICAgIDg5OCwgMHg0NjdhYzZiOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY4MjIwMCwgICAgIDY4MjIwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweDU5NGM3YjEzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjg0MDAwLCAgICAgNjg0MDAwLCAgICAgMTgwMCwgICAgICA4OTYsIDB4NzllOGIzYzYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2ODU4MDAsICAgICA2ODU4MDAsICAgICAxODAwLCAgICAgIDc2NCwgMHgxZjkyNjRjNSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY4NzYwMCwgICAgIDY4NzYwMCwgICAgIDE4MDAsICAgICAgNzYyLCAweDA2OGM4MzBmLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjg5NDAwLCAgICAgNjg5NDAwLCAgICAgMTgwMCwgICAgICA3NjIsIDB4ZDk0MDc2MGEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2OTEyMDAsICAgICA2OTEyMDAsICAgICAxODAwLCAgICAgIDc2MywgMHhiYWQ1ODNjNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY5MzAwMCwgICAgIDY5MzAwMCwgICAgIDE4MDAsICAgICAgOTQ3LCAweGY2MWVkNjVjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNjk0ODAwLCAgICAgNjk0ODAwLCAgICAgMTgwMCwgICAgICA3NjcsIDB4MDNhMDc4ZWEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA2OTY2MDAsICAgICA2OTY2MDAsICAgICAxODAwLCAgICAgIDk1NywgMHg3NzYyZTQ5YiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDY5ODQwMCwgICAgIDY5ODQwMCwgICAgIDE4MDAsICAgICAgOTU1LCAweDE1NDFkNjYwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzAwMjAwLCAgICAgNzAwMjAwLCAgICAgMTgwMCwgICAgICA3NjcsIDB4ZDY3OTg5MTEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3MDIwMDAsICAgICA3MDIwMDAsICAgICAxODAwLCAgICAgIDc2NywgMHg0ZjMxN2RmZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDcwMzgwMCwgICAgIDcwMzgwMCwgICAgIDE4MDAsICAgICAgNzY0LCAweDQ3ZTE3YjMzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzA1NjAwLCAgICAgNzA1NjAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4MGMwYzg2YjgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3MDc0MDAsICAgICA3MDc0MDAsICAgICAxODAwLCAgICAgIDc2OSwgMHgxODU1OGFlZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDcwOTIwMCwgICAgIDcwOTIwMCwgICAgIDE4MDAsICAgICAgNzY2LCAweGUwYWE3NjRiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzExMDAwLCAgICAgNzExMDAwLCAgICAgMTgwMCwgICAgICA3NjIsIDB4ODczNTdkODEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3MTI4MDAsICAgICA3MTI4MDAsICAgICAxODAwLCAgICAgIDc2NiwgMHhkYzhiNzE2NywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDcxNDYwMCwgICAgIDcxNDYwMCwgICAgIDE4MDAsICAgICAgNzY4LCAweDdkYmU5MmRiLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzE2NDAwLCAgICAgNzE2NDAwLCAgICAgMTgwMCwgICAgICA3NjUsIDB4YjQ1MTg2N2UsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3MTgyMDAsICAgICA3MTgyMDAsICAgICAxODAwLCAgICAgIDk1MywgMHgxMmQ3ZDY4NywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDcyMDAwMCwgICAgIDcyMDAwMCwgICAgIDE4MDAsICAgICAgNzY5LCAweDY0OWM3ZDI4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzIxODAwLCAgICAgNzIxODAwLCAgICAgMTgwMCwgICAgICA5NTUsIDB4Y2UxZmQyYWEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3MjM2MDAsICAgICA3MjM2MDAsICAgICAxODAwLCAgICAgIDk1MiwgMHgyNDdkZDg3MCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDcyNTQwMCwgICAgIDcyNTQwMCwgICAgIDE4MDAsICAgICAgOTUxLCAweDM2ZDRkYTE4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzI3MjAwLCAgICAgNzI3MjAwLCAgICAgMTgwMCwgICAgICA5NTQsIDB4YmU2YmQxOGYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3MjkwMDAsICAgICA3MjkwMDAsICAgICAxODAwLCAgICAgIDk0OCwgMHhjNzcwY2E4OSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDczMDgwMCwgICAgIDczMDgwMCwgICAgIDE4MDAsICAgICAgNzYxLCAweDljNWQ3N2VhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzMyNjAwLCAgICAgNzMyNjAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4ZGVkZDg4ZTAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3MzQ0MDAsICAgICA3MzQ0MDAsICAgICAxODAwLCAgICAgIDc2MCwgMHg3NDJhODI4NiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDczNjIwMCwgICAgIDczNjIwMCwgICAgIDE4MDAsICAgICAgNzY0LCAweDg5OTE3MDUzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzM4MDAwLCAgICAgNzM4MDAwLCAgICAgMTgwMCwgICAgICA3NjQsIDB4Nzc0NDc2MjIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3Mzk4MDAsICAgICA3Mzk4MDAsICAgICAxODAwLCAgICAgIDk0NiwgMHg5ZWJhZDJiZCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc0MTYwMCwgICAgIDc0MTYwMCwgICAgIDE4MDAsICAgICAgNzU4LCAweDYzOGE4MzZkLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzQzNDAwLCAgICAgNzQzNDAwLCAgICAgMTgwMCwgICAgICA5NTAsIDB4Mjg1ZWM5MDQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3NDUyMDAsICAgICA3NDUyMDAsICAgICAxODAwLCAgICAgIDc2OSwgMHg0MzEwNzIzMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc0NzAwMCwgICAgIDc0NzAwMCwgICAgIDE4MDAsICAgICAgNzY0LCAweDk5NmI3YTBmLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzQ4ODAwLCAgICAgNzQ4ODAwLCAgICAgMTgwMCwgICAgICA3NTcsIDB4YTUzNTZmNTAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3NTA2MDAsICAgICA3NTA2MDAsICAgICAxODAwLCAgICAgIDc2MSwgMHg2MjhlN2M1NSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc1MjQwMCwgICAgIDc1MjQwMCwgICAgIDE4MDAsICAgICAgNzYxLCAweGNiY2M3NDE2LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzU0MjAwLCAgICAgNzU0MjAwLCAgICAgMTgwMCwgICAgICA3NTksIDB4MzRiYzcxYmEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3NTYwMDAsICAgICA3NTYwMDAsICAgICAxODAwLCAgICAgIDc1OCwgMHhjY2EyN2ZmMywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc1NzgwMCwgICAgIDc1NzgwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweDdhYjg4MmI2LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzU5NjAwLCAgICAgNzU5NjAwLCAgICAgMTgwMCwgICAgICA3NjEsIDB4Y2JkNzg1NGEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3NjE0MDAsICAgICA3NjE0MDAsICAgICAxODAwLCAgICAgIDgyOCwgMHg1NWJlOTNlMCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc2MzIwMCwgICAgIDc2MzIwMCwgICAgIDE4MDAsICAgICAgNzU5LCAweGI2ZmI4MDRjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzY1MDAwLCAgICAgNzY1MDAwLCAgICAgMTgwMCwgICAgICA3NjEsIDB4MzMxZDdiNDgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3NjY4MDAsICAgICA3NjY4MDAsICAgICAxODAwLCAgICAgIDc2MiwgMHhhODRlN2U5YiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc2ODYwMCwgICAgIDc2ODYwMCwgICAgIDE4MDAsICAgICAgNzYxLCAweDk3NDQ4MDM3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzcwNDAwLCAgICAgNzcwNDAwLCAgICAgMTgwMCwgICAgICA3NTcsIDB4YzgyMTg2YmMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3NzIyMDAsICAgICA3NzIyMDAsICAgICAxODAwLCAgICAgIDc1OSwgMHg4MmFiODc0NiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc3NDAwMCwgICAgIDc3NDAwMCwgICAgIDE4MDAsICAgICAgNzU5LCAweDg4NGY2ZDFhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzc1ODAwLCAgICAgNzc1ODAwLCAgICAgMTgwMCwgICAgICA3NjEsIDB4ZjI5MDZmYTksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3Nzc2MDAsICAgICA3Nzc2MDAsICAgICAxODAwLCAgICAgIDc1NiwgMHgzZWI3NmExNywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc3OTQwMCwgICAgIDc3OTQwMCwgICAgIDE4MDAsICAgICAgNzY1LCAweDRkZTY3YTQwLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzgxMjAwLCAgICAgNzgxMjAwLCAgICAgMTgwMCwgICAgICA3NTksIDB4MmU3YzdiMWUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3ODMwMDAsICAgICA3ODMwMDAsICAgICAxODAwLCAgICAgIDc1OSwgMHhkYWMyNzhmYSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc4NDgwMCwgICAgIDc4NDgwMCwgICAgIDE4MDAsICAgICAgNzYxLCAweDVjYWY3MDBlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzg2NjAwLCAgICAgNzg2NjAwLCAgICAgMTgwMCwgICAgICA3NjIsIDB4ZDQxMDdiMTMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3ODg0MDAsICAgICA3ODg0MDAsICAgICAxODAwLCAgICAgIDc3MSwgMHhlNGYxNmNkNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc5MDIwMCwgICAgIDc5MDIwMCwgICAgIDE4MDAsICAgICAgNzU4LCAweDk2MDg4NzcyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzkyMDAwLCAgICAgNzkyMDAwLCAgICAgMTgwMCwgICAgICA3NTksIDB4NjhmZDc5OGQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3OTM4MDAsICAgICA3OTM4MDAsICAgICAxODAwLCAgICAgIDc2MCwgMHg3Yzg5NmM3NywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDc5NTYwMCwgICAgIDc5NTYwMCwgICAgIDE4MDAsICAgICAgNzYyLCAweDEwZjA3ZGY2LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgNzk3NDAwLCAgICAgNzk3NDAwLCAgICAgMTgwMCwgICAgICA3NjAsIDB4OTAyMzczYjgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA3OTkyMDAsICAgICA3OTkyMDAsICAgICAxODAwLCAgICAgIDc2MCwgMHhkOWRiODA0NSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDgwMTAwMCwgICAgIDgwMTAwMCwgICAgIDE4MDAsICAgICAgNzU3LCAweDUxNjQ3OTZlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODAyODAwLCAgICAgODAyODAwLCAgICAgMTgwMCwgICAgICA3NjIsIDB4NDFmMjc4YmEsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4MDQ2MDAsICAgICA4MDQ2MDAsICAgICAxODAwLCAgICAgIDc2MywgMHgwNGU2NzZiMSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDgwNjQwMCwgICAgIDgwNjQwMCwgICAgIDE4MDAsICAgICAgODM1LCAweDAzNTg5OWQzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODA4MjAwLCAgICAgODA4MjAwLCAgICAgMTgwMCwgICAgICA3NTgsIDB4OTBiNzgyOGUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4MTAwMDAsICAgICA4MTAwMDAsICAgICAxODAwLCAgICAgIDc2MSwgMHgyZjQ0NmUwZSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDgxMTgwMCwgICAgIDgxMTgwMCwgICAgIDE4MDAsICAgICAgODg4LCAweDNjNmNiNzRjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODEzNjAwLCAgICAgODEzNjAwLCAgICAgMTgwMCwgICAgICA3NTgsIDB4OGYyNjdkNzIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4MTU0MDAsICAgICA4MTU0MDAsICAgICAxODAwLCAgICAgIDc2NSwgMHhhYTJmN2YxNiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDgxNzIwMCwgICAgIDgxNzIwMCwgICAgIDE4MDAsICAgICAgNzYxLCAweDhiM2Q3ZTIzLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODE5MDAwLCAgICAgODE5MDAwLCAgICAgMTgwMCwgICAgICA3NjQsIDB4ZDRkOTgxZmIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4MjA4MDAsICAgICA4MjA4MDAsICAgICAxODAwLCAgICAgIDc2MiwgMHhhOThkNzQwYiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDgyMjYwMCwgICAgIDgyMjYwMCwgICAgIDE4MDAsICAgICAgNzY3LCAweGFkMzU4MDc5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODI0NDAwLCAgICAgODI0NDAwLCAgICAgMTgwMCwgICAgICA3NTksIDB4MTY1ODc1Y2IsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4MjYyMDAsICAgICA4MjYyMDAsICAgICAxODAwLCAgICAgIDc2MSwgMHg2NWQxN2FkZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDgyODAwMCwgICAgIDgyODAwMCwgICAgIDE4MDAsICAgICAgNzYyLCAweDg5OTI3OTAxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODI5ODAwLCAgICAgODI5ODAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4ZGVlNDc0MmMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4MzE2MDAsICAgICA4MzE2MDAsICAgICAxODAwLCAgICAgIDc2MCwgMHhkNjE5NzU4MSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDgzMzQwMCwgICAgIDgzMzQwMCwgICAgIDE4MDAsICAgICAgODMyLCAweDgzMzk4YzVhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODM1MjAwLCAgICAgODM1MjAwLCAgICAgMTgwMCwgICAgICA3NjEsIDB4OTBhNDg1MDAsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4MzcwMDAsICAgICA4MzcwMDAsICAgICAxODAwLCAgICAgIDg4NywgMHhmOGZiYzFjZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDgzODgwMCwgICAgIDgzODgwMCwgICAgIDE4MDAsICAgICAgNzY1LCAweDE5NmY4MDBhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODQwNjAwLCAgICAgODQwNjAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4NzBlNTgxZDgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4NDI0MDAsICAgICA4NDI0MDAsICAgICAxODAwLCAgICAgIDc2MywgMHg3OTA4N2I3ZCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg0NDIwMCwgICAgIDg0NDIwMCwgICAgIDE4MDAsICAgICAgOTUyLCAweDU4NjJmNGZlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODQ2MDAwLCAgICAgODQ2MDAwLCAgICAgMTgwMCwgICAgICA5NTMsIDB4MmMwMGRjMDksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4NDc4MDAsICAgICA4NDc4MDAsICAgICAxODAwLCAgICAgIDk0NSwgMHg2NmNiZTM4NiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg0OTYwMCwgICAgIDg0OTYwMCwgICAgIDE4MDAsICAgICAgOTQ4LCAweGU3N2ZkY2E3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODUxNDAwLCAgICAgODUxNDAwLCAgICAgMTgwMCwgICAgICA5NTEsIDB4ZTUzMmQ1NGYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4NTMyMDAsICAgICA4NTMyMDAsICAgICAxODAwLCAgICAgIDgyNiwgMHhkMDAyOGY4ZiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg1NTAwMCwgICAgIDg1NTAwMCwgICAgIDE4MDAsICAgICAgNzYzLCAweGQyYTU3MjJjLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODU2ODAwLCAgICAgODU2ODAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4Nzk4MDkwYWIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4NTg2MDAsICAgICA4NTg2MDAsICAgICAxODAwLCAgICAgIDc2NiwgMHhiYjQ5OGUxOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg2MDQwMCwgICAgIDg2MDQwMCwgICAgIDE4MDAsICAgICAgOTQ2LCAweDQ2M2ZjNWFhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODYyMjAwLCAgICAgODYyMjAwLCAgICAgMTgwMCwgICAgICA3NjIsIDB4ZWE2MzhmOGIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4NjQwMDAsICAgICA4NjQwMDAsICAgICAxODAwLCAgICAgIDc2NSwgMHgwZWVkN2JkMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg2NTgwMCwgICAgIDg2NTgwMCwgICAgIDE4MDAsICAgICAgNzYzLCAweGZiMWI2ZWFlLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODY3NjAwLCAgICAgODY3NjAwLCAgICAgMTgwMCwgICAgICA3NjEsIDB4YTQ4YTc0MDcsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4Njk0MDAsICAgICA4Njk0MDAsICAgICAxODAwLCAgICAgIDc2MCwgMHhjZDczN2M0MywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg3MTIwMCwgICAgIDg3MTIwMCwgICAgIDE4MDAsICAgICAgNzU3LCAweGVmZmQ3YzFhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODczMDAwLCAgICAgODczMDAwLCAgICAgMTgwMCwgICAgICA3NTcsIDB4MmY2MjcyY2IsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4NzQ4MDAsICAgICA4NzQ4MDAsICAgICAxODAwLCAgICAgIDc2MiwgMHhlMmEyODIyMywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg3NjYwMCwgICAgIDg3NjYwMCwgICAgIDE4MDAsICAgICAgNzYwLCAweGVjYjQ3NTQ4LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODc4NDAwLCAgICAgODc4NDAwLCAgICAgMTgwMCwgICAgICA3NjMsIDB4ODBhYzgyOTMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4ODAyMDAsICAgICA4ODAyMDAsICAgICAxODAwLCAgICAgIDc2NCwgMHg1YTA2NzExNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg4MjAwMCwgICAgIDg4MjAwMCwgICAgIDE4MDAsICAgICAgOTQ2LCAweDdhZjJjNjk1LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODgzODAwLCAgICAgODgzODAwLCAgICAgMTgwMCwgICAgICA5NDYsIDB4YWFkZWRkYjksIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4ODU2MDAsICAgICA4ODU2MDAsICAgICAxODAwLCAgICAgIDk0OSwgMHg3NWJkZDY1NywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg4NzQwMCwgICAgIDg4NzQwMCwgICAgIDE4MDAsICAgICAgOTQ2LCAweDNmY2RkMTdhLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODg5MjAwLCAgICAgODg5MjAwLCAgICAgMTgwMCwgICAgICA5NDAsIDB4ODQ0MWUxNjQsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4OTEwMDAsICAgICA4OTEwMDAsICAgICAxODAwLCAgICAgIDc2MiwgMHgwNjI3ODJhOSwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg5MjgwMCwgICAgIDg5MjgwMCwgICAgIDE4MDAsICAgICAgNzU5LCAweGZkYTk3ZDViLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgODk0NjAwLCAgICAgODk0NjAwLCAgICAgMTgwMCwgICAgICA5NDIsIDB4MDMwZWRhNjgsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA4OTY0MDAsICAgICA4OTY0MDAsICAgICAxODAwLCAgICAgIDc2NCwgMHgxYmU4N2YzMiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDg5ODIwMCwgICAgIDg5ODIwMCwgICAgIDE4MDAsICAgICAgNzU5LCAweDlkZDU3N2U3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgOTAwMDAwLCAgICAgOTAwMDAwLCAgICAgMTgwMCwgICAgICA3NjAsIDB4MzIxZjczMTIsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA5MDE4MDAsICAgICA5MDE4MDAsICAgICAxODAwLCAgICAgIDc1NywgMHhkODFiNzUxMywgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDkwMzYwMCwgICAgIDkwMzYwMCwgICAgIDE4MDAsICAgICAgOTQxLCAweDA4OGNkN2U3LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgOTA1NDAwLCAgICAgOTA1NDAwLCAgICAgMTgwMCwgICAgICA5NDMsIDB4YzdlZmRkYmUsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA5MDcyMDAsICAgICA5MDcyMDAsICAgICAxODAwLCAgICAgIDc1OSwgMHgzMWVkN2JkNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDkwOTAwMCwgICAgIDkwOTAwMCwgICAgIDE4MDAsICAgICAgNzU5LCAweGRkZDQ3NDg5LCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgOTEwODAwLCAgICAgOTEwODAwLCAgICAgMTgwMCwgICAgICA3NjIsIDB4Yjc2YTdjMWYsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA5MTI2MDAsICAgICA5MTI2MDAsICAgICAxODAwLCAgICAgIDgzMSwgMHg4ODM4OWNlNCwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDkxNDQwMCwgICAgIDkxNDQwMCwgICAgIDE4MDAsICAgICAgNzU2LCAweDk2MTg3OGQyLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCiswLCAgICAgOTE2MjAwLCAgICAgOTE2MjAwLCAgICAgMTgwMCwgICAgICA3NjAsIDB4YjRlNTgzYmMsIFM9MSwgICAgICAgIDEsIDB4MDBiZDAwYmQKKzAsICAgICA5MTgwMDAsICAgICA5MTgwMDAsICAgICAxODAwLCAgICAgIDc2MSwgMHgyZjU5N2M0MiwgUz0xLCAgICAgICAgMSwgMHgwMGJkMDBiZAorMCwgICAgIDkxOTgwMCwgICAgIDkxOTgwMCwgICAgIDE4MDAsICAgICAgNzU5LCAweDQzZTk3MmYxLCBTPTEsICAgICAgICAxLCAweDAwYmQwMGJkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90c2NjLTE1Yml0IGIvdGVzdHMvcmVmL2ZhdGUvdHNjYy0xNWJpdAppbmRleCBhMjg3MWVmLi5hYmZlNmE2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90c2NjLTE1Yml0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RzY2MtMTViaXQKQEAgLTEsNSArMSwxNCBAQAogI3RiIDA6IDEvMTUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDU0OHg0MDAKKyNzYXIgMDogMC8xCiAjdGIgMTogMS8xMTAyNQorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBwY21fczE2bGUKKyNzYW1wbGVfcmF0ZSAxOiAxMTAyNQorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDY1NzYwMCwgMHg1MGIzYTBjMgogMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgMTEwMjUsICAgIDIyMDUwLCAweDE3NDBhYWVjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2NTc2MDAsIDB4NTBiM2EwYzIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3RzY2MtMzJiaXQgYi90ZXN0cy9yZWYvZmF0ZS90c2NjLTMyYml0CmluZGV4IDRlZWY0OTAuLmRmYjM3YTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3RzY2MtMzJiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdHNjYy0zMmJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMDI0eDc2OAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMjM1OTI5NiwgMHg3NmNjY2FhNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAyMzU5Mjk2LCAweDA5YzUyYmJmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDIzNTkyOTYsIDB4Yzg3NDYwMDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3RzY2MyLWF2aSBiL3Rlc3RzL3JlZi9mYXRlL3RzY2MyLWF2aQppbmRleCBhZDcxYjgyLi4wOWVkODk3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90c2NjMi1hdmkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdHNjYzItYXZpCkBAIC0xLDMzICsxLDI5IEBACiAjdGIgMDogMS8yNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDIzMDQwMCwgMHg3YTIxMDNjMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjMwNDAwLCAweGQzODFjMjc5Ci0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyMzA0MDAsIDB4ZDM4MWMyNzkKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDIzMDQwMCwgMHgxMTBhZWMyNwogMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMjMwNDAwLCAweDRiZTY3ZWU3CiAwLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAyMzA0MDAsIDB4ZDg3ZmU0YjQKLTAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDIzMDQwMCwgMHhkODdmZTRiNAogMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMjMwNDAwLCAweDliYzZhMzk4CiAwLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAyMzA0MDAsIDB4ZDY3ZDkyZGIKIDAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDIzMDQwMCwgMHgzZGY2NTU5ZQotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMjMwNDAwLCAweDNkZjY1NTllCiAwLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAyMzA0MDAsIDB4MjEzNmZmMjUKIDAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDIzMDQwMCwgMHg5NDU3M2ZlNgogMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMjMwNDAwLCAweGJmNjdkM2Y1Ci0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAyMzA0MDAsIDB4YmY2N2QzZjUKIDAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDIzMDQwMCwgMHgyNTkyYjVjZgogMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMjMwNDAwLCAweDViMjNjZDkzCiAwLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAyMzA0MDAsIDB4OWI3NmQwNzkKLTAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDIzMDQwMCwgMHg5Yjc2ZDA3OQogMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMjMwNDAwLCAweDc3MWEwMTdlCiAwLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAyMzA0MDAsIDB4YWNmZWUxZDAKIDAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDIzMDQwMCwgMHg2YjlmZjRlYgotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMjMwNDAwLCAweDZiOWZmNGViCiAwLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAyMzA0MDAsIDB4YmFmNjQzZTEKIDAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDIzMDQwMCwgMHgwNTJlZmU1OQogMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMjMwNDAwLCAweGQ3NTFmOTAxCi0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAyMzA0MDAsIDB4ZDc1MWY5MDEKIDAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDIzMDQwMCwgMHg2Zjk0ZTExZgogMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMjMwNDAwLCAweDE3ZWVhYmI5CiAwLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAyMzA0MDAsIDB4MzczM2EwMzUKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDIzMDQwMCwgMHgzNzMzYTAzNQogMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMjMwNDAwLCAweGIwODI5ZjQ1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90c2NjMi1tb3YgYi90ZXN0cy9yZWYvZmF0ZS90c2NjMi1tb3YKaW5kZXggZDczZmYzZi4uNjc5ZjViYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdHNjYzItbW92CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3RzY2MyLW1vdgpAQCAtMSwxNiArMSwxMCBAQAogI3RiIDA6IDEvNQotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMTgwMTE2LCAweDAxZDAxMzM2Ci0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDExODAxMTYsIDB4MDFkMDEzMzYKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMTE4MDExNiwgMHgwMWQwMTMzNgotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAxMTgwMTE2LCAweDAxZDAxMzM2Ci0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDExODAxMTYsIDB4MDFkMDEzMzYKLTAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgMTE4MDExNiwgMHgwMWQwMTMzNgotMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAxMTgwMTE2LCAweDAxZDAxMzM2Ci0wLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDExODAxMTYsIDB4MDFkMDEzMzYKLTAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgMTE4MDExNiwgMHgwMWQwMTMzNgotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAxMTgwMTE2LCAweDAxZDAxMzM2Ci0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDExODAxMTYsIDB4MDU2ZmRhZGQKLTAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgMTE4MDExNiwgMHg2ZjczZTA4MAotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAxMTgwMTE2LCAweDUyNDRkOWU1Ci0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDExODAxMTYsIDB4NjI5YmYxMGYKLTAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgMTE4MDExNiwgMHg5N2M3MjZjYgorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODkyeDQ0MQorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTE4MDExNiwgMHgwNTZmZGFkZAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxMTgwMTE2LCAweDZmNzNlMDgwCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDExODAxMTYsIDB4NTI0NGQ5ZTUKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgMTE4MDExNiwgMHg2MjliZjEwZgorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAxMTgwMTE2LCAweDk3YzcyNmNiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS90eGQtMTZicHAgYi90ZXN0cy9yZWYvZmF0ZS90eGQtMTZicHAKaW5kZXggMzM5NDNmOS4uYTNiMWUyMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdHhkLTE2YnBwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3R4ZC0xNmJwcApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDY0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDE2Mzg0LCAweDRkMzliNGNiCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMTYzODQsIDB4MmE4ZDE0YjQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAxNjM4NCwgMHhlMjY3OTNjYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdHhkLW9kZCBiL3Rlc3RzL3JlZi9mYXRlL3R4ZC1vZGQKaW5kZXggZmU3YzYxNS4uNmVhNTgxMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdHhkLW9kZAorKysgYi90ZXN0cy9yZWYvZmF0ZS90eGQtb2RkCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzg3eDI0OQorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDM4NTQ1MiwgMHgwNTVhMTRkNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdHhkLXBhbDggYi90ZXN0cy9yZWYvZmF0ZS90eGQtcGFsOAppbmRleCA2MWZlZTgwLi4yYzM2NjY4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS90eGQtcGFsOAorKysgYi90ZXN0cy9yZWYvZmF0ZS90eGQtcGFsOApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMng1MTIKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA3ODY0MzIsIDB4NTY2NTRkNjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3VsdGkgYi90ZXN0cy9yZWYvZmF0ZS91bHRpCmluZGV4IDRlOTk2OGIuLjRiM2E3NjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3VsdGkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdWx0aQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEyCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDg2NDAwLCAweDVkNTgyNTNkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgODY0MDAsIDB4MDYyNmQ5MGQKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA4NjQwMCwgMHg0ZWNiNTA0OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JfaW50X2dyYWRpZW50IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JfaW50X2dyYWRpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTY5ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYl9pbnRfZ3JhZGllbnQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NDgKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDkyMTYsIDB4ZDAwZmRkOGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9fcmdiX2ludF9tZWRpYW4gYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYl9pbnRfbWVkaWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTY5ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYl9pbnRfbWVkaWFuCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDQ4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA5MjE2LCAweGQwMGZkZDhjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYl9sZWZ0IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JfbGVmdAppbmRleCBkMTlhNmIxLi4yM2U0OGM0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYl9sZWZ0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9fcmdiX2xlZnQKQEAgLTEsNSArMSw5IEBACiAjdGIgMDogMTAwMS8zMDAwMAotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgOTIxNjAwLCAweDI3ZTYwMDFlCi0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA5MjE2MDAsIDB4N2MwYTkyYmMKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDkyMTYwMCwgMHg0ZDJiZTQyYwotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgOTIxNjAwLCAweDU4ZGRkMGJlCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgOTIxNjAwLCAweGI0NTcwMDFlCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA5MjE2MDAsIDB4Y2VmZjkyYmMKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDkyMTYwMCwgMHg3NjJkZTQyYworMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgOTIxNjAwLCAweGVmMTRkMGJlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYl9tZWRpYW4gYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYl9tZWRpYW4KaW5kZXggZjA0MTI4NS4uZTdjNjIzYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JfbWVkaWFuCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9fcmdiX21lZGlhbgpAQCAtMSw2ICsxLDEwIEBACiAjdGIgMDogMTAwMS8zMDAwMAotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgOTIxNjAwLCAweDk3NzY2MTFmCi0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA5MjE2MDAsIDB4ZGJmYTY0ZjQKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDkyMTYwMCwgMHhlZDJhMDU4MAotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgOTIxNjAwLCAweDZlY2M4MGJjCi0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICA5MjE2MDAsIDB4NThkZGQwYmUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA5MjE2MDAsIDB4ODVhZjYxMWYKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDkyMTYwMCwgMHhjOTdhNjRmNAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgOTIxNjAwLCAweGIxZGIwNTgwCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA5MjE2MDAsIDB4YTE4ZDgwYmMKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDkyMTYwMCwgMHhlZjE0ZDBiZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JhX2dyYWRpZW50IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JhX2dyYWRpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MmY0NmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYmFfZ3JhZGllbnQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzd4MzcKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDU0NzYsIDB4MjBmODYwYWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9fcmdiYV9sZWZ0IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JhX2xlZnQKaW5kZXggYTdlMGVkNC4uYjI0YjdmNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JhX2xlZnQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JhX2xlZnQKQEAgLTEsNiArMSwxMCBAQAogI3RiIDA6IDEwMDEvMzAwMDAKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMTIyODgwMCwgMHhmMWJjOTQzMgotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxMjI4ODAwLCAweDg0ODBkMWU1Ci0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDEyMjg4MDAsIDB4YjAxZDVmYjIKLTAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgMTIyODgwMCwgMHg1M2NiNDJjNAotMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAxMjI4ODAwLCAweDJiMmVhMTc2CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NDB4NDgwCisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMjI4ODAwLCAweGY5ZjQ5NDMyCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDEyMjg4MDAsIDB4ZjA4OWQxZTUKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMTIyODgwMCwgMHhiZDAyNWZiMgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAxMjI4ODAwLCAweDE3YmY0MmM0CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDEyMjg4MDAsIDB4ZTMxZWExNzYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9fcmdiYV9tZWRpYW4gYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYmFfbWVkaWFuCmluZGV4IGE3ZTBlZDQuLmIyNGI3ZjQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9fcmdiYV9tZWRpYW4KKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JhX21lZGlhbgpAQCAtMSw2ICsxLDEwIEBACiAjdGIgMDogMTAwMS8zMDAwMAotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMjI4ODAwLCAweGYxYmM5NDMyCi0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDEyMjg4MDAsIDB4ODQ4MGQxZTUKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMTIyODgwMCwgMHhiMDFkNWZiMgotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAxMjI4ODAwLCAweDUzY2I0MmM0Ci0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDEyMjg4MDAsIDB4MmIyZWExNzYKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDEyMjg4MDAsIDB4ZjlmNDk0MzIKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMTIyODgwMCwgMHhmMDg5ZDFlNQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAxMjI4ODAwLCAweGJkMDI1ZmIyCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDEyMjg4MDAsIDB4MTdiZjQyYzQKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgMTIyODgwMCwgMHhlMzFlYTE3NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb19yZ2JhX3NpbmdsZV9zeW1ib2wgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYmFfc2luZ2xlX3N5bWJvbAppbmRleCBjMGUwZDk4Li5hMjBkYzNkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYmFfc2luZ2xlX3N5bWJvbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3JnYmFfc2luZ2xlX3N5bWJvbApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI0Ci0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMxNDU3MjgsIDB4YWM5NWM1OTMKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEwMjR4NzY4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzMTQ1NzI4LCAweGEwN2RjNTkzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMF9ncmFkaWVudCBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIwX2dyYWRpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMmI3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMF9ncmFkaWVudApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg0OAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgNDYwOCwgMHhjNDQxZGQ5MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0MjBfaW50X2dyYWRpZW50IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0MjBfaW50X2dyYWRpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTQ1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMF9pbnRfZ3JhZGllbnQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NDgKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDQ2MDgsIDB4OGNlY2RkYWUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIwX2ludF9tZWRpYW4gYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMF9pbnRfbWVkaWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTQ1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMF9pbnRfbWVkaWFuCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDQ4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA0NjA4LCAweDhjZWNkZGFlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMF9sZWZ0IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0MjBfbGVmdAppbmRleCAwMjZmOGZiLi4zZDEyZDdlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMF9sZWZ0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIwX2xlZnQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDQ2MDgwMCwgMHhlY2U5OGZjOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNDYwODAwLCAweDliYWY3ODZiCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA0NjA4MDAsIDB4OGU4ZTA1MTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIwX21lZGlhbiBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIwX21lZGlhbgppbmRleCA1NjYyZDhjLi5jY2NhN2Y4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMF9tZWRpYW4KKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0MjBfbWVkaWFuCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA0NjA4MDAsIDB4NmE4MTc5ODcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDQ2MDgwMCwgMHgyZjcxM2VjMgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNDYwODAwLCAweDAwM2I1NjBlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMl9ncmFkaWVudCBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIyX2dyYWRpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTQ5YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMl9ncmFkaWVudApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg0OAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgNjE0NCwgMHhkMzNhZGQ5MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0MjJfaW50X2dyYWRpZW50IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0MjJfaW50X2dyYWRpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTQ5YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMl9pbnRfZ3JhZGllbnQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NDgKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDYxNDQsIDB4ZDMzYWRkOTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIyX2ludF9tZWRpYW4gYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMl9pbnRfbWVkaWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OTQ5YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMl9pbnRfbWVkaWFuCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDQ4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA2MTQ0LCAweGQzM2FkZDkxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMl9sZWZ0IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0MjJfbGVmdAppbmRleCA0MzhiMzJhLi40ZTY2Y2ZjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMl9sZWZ0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIyX2xlZnQKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDQ4MAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDYxNDQwMCwgMHg5YTZiODgwMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNjE0NDAwLCAweGFhODY4N2UyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA2MTQ0MDAsIDB4MmZlNWJkNDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIyX21lZGlhbiBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDIyX21lZGlhbgppbmRleCA0MzhiMzJhLi40ZTY2Y2ZjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQyMl9tZWRpYW4KKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0MjJfbWVkaWFuCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2MTQ0MDAsIDB4OWE2Yjg4MDIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDYxNDQwMCwgMHhhYTg2ODdlMgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNjE0NDAwLCAweDJmZTViZDQwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQ0NF83MDlfZ3JhZGllbnQgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQ0NF83MDlfZ3JhZGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3MGM4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDQ0XzcwOV9ncmFkaWVudApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzOHgzOAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgNDMzMiwgMHhhOWRlNjViYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0NDRfNzA5X2ludF9ncmFkaWVudCBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDQ0XzcwOV9pbnRfZ3JhZGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5MzM3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDQ0XzcwOV9pbnRfZ3JhZGllbnQKQEAgLTAsMCArMSw2IEBACisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NDgKKyNzYXIgMDogMC8xCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDkyMTYsIDB4YmNiMmRkNzgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDQ0XzcwOV9pbnRfbWVkaWFuIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0NDRfNzA5X2ludF9tZWRpYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5MzM3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9feXV2NDQ0XzcwOV9pbnRfbWVkaWFuCkBAIC0wLDAgKzEsNiBAQAorI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDQ4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA5MjE2LCAweGJjYjJkZDc4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvX3l1djQ0NF83MDlfbWVkaWFuIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0NDRfNzA5X21lZGlhbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjkzMzdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb195dXY0NDRfNzA5X21lZGlhbgpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg0OAorI3NhciAwOiAwLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgOTIxNiwgMHhiY2IyZGQ3OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY19yZ2JfbGVmdCBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfcmdiX2xlZnQKaW5kZXggZjZhZGFiZS4uMWVlN2M1OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY19yZ2JfbGVmdAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYl9sZWZ0CkBAIC0xLDU1ICsxLDYwIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQorI2V4dHJhZGF0YSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCBjOWExNzQxZmIyOTNiOWFkMjE4NzY0OTJiNTQyNWEzYgogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdXR2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTgyMzI4LCBjZDA4NGIyNDQ5MzlkN2UwMDA4ZDhlNWFiMzQyOWRjMQotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTgyMzM2LCBjOWM0MDY3Mjc1MGYzNzIxMzQxODU5MDExNDdmYjc3NgotMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTgyOTU2LCBjNzI4OTExY2E3MzIyNWYyZGM3NDUzNTMzYzliZTk1ZQotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTgyMzg0LCA1NDUyMWY3MDliNDYxYTI1MTk4ZGI3NTViY2U1ODJmYQotMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTgxNzA0LCA1ZTAzYWI1OGI0NDgwYTY2MTNmNTQ4NTdmMTBjMzllNQotMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTgyMTM2LCBjNjIzZmIwNmI5MGZkZDdhNWJhMGI0ZjIxN2I2YTM4OAotMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTgxNTUyLCA1ZDAzYmU5ZGZjMDFhZDk5MzY0ZmMzY2M4Mzc4YWY3MgotMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTgyMjkyLCBmYzkwODc4Mjc4YzgyYjJmODM1MTUxZGM2ZDQzZGQ0NwotMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTgxNDI0LCA5YjYzMzlhMGQzYWYyZDMwMzQxNjIxODNjZDRkNzllNAotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTgyMzE2LCA3ZTQ1YmI1ZmZlNTdmOThhNDMzNDIwYWJhZmZlNzhjYwotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTgyMDY0LCBkOTUyNTYwNWE3ZDdkNzVhOGUzMzUwMmY2MTczM2FmMQotMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTgyNTk2LCA2MmU4N2ZhNWMzM2E4ZDIwOGRlYWE4NzE5NjgyYjlhNQotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMTgwOTAwLCAxNDkwNTlkM2Q1NmM1NTM1OGM3MDQ0YzdkNTY5NzMwZgotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMTgxOTIwLCAwZDIwZjU4OGMyNzQ3MWEwMzhlMTU5YTEzMWU5YzhlYQotMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTgyODI0LCBhMzAxYTQxMWZmMTEwNDJlY2I1ODNlMWUzYjEyZGJkYQotMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMTgyNDUyLCAwZWUyYTllZDM5ZmI4NTY5YThkNmMyYjNhZmI4ZjgwYQotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMTgyMzEyLCA2OGRkM2I4MjBhZGYyY2JjNjY4NmE3ZDQ4ZmEyMmM2ZQotMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTgxODU2LCAxODk3OTI2Y2ZlOWI3YWNhZjljMjE3MTRjNDQ5Y2U0MQotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMTgxMTA4LCAxNWQyYWY0NjA3MzNmZGQ4OTYwNzg2MzJjZGZlZjlmZAotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMTgxMzg4LCA4YjhlN2E0YjdkMzU1ZjQxZjdlODM2MTIwYzQ3OTJhYwotMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTgwOTM2LCBlMThlMjdhYTAyN2YyNDcwYmZhOTVjNTM2YTBhODlhZgotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMTgwOTAwLCBlYjY2M2FlM2M1ZmZhOGU3NTEyODBlMGRiYjI2MGUwMgotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMTgxOTM2LCA3NTE0YmJlMDZjZWUwMjdmNTQ3MTBkYzkwMDI5Nzg2MwotMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTgyMzA0LCA4Y2IyZGNkYmQ0YzkxOWI0Yzk3N2Y0NWJlZTQ2YzU0YwotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMTgyNTgwLCA5MTg1ZWQ1M2I3ZTgzMzliNjFkM2FiZTIzMGJiYWI3MQotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMTgyNTcyLCA4MWY4YmRkMzI1NWI5MWQ2NjIxZTllYmQzYzlkNzY3OQotMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTgyMzU2LCAxZjlmZjQwNzAwODgxMDU0YzYyZTMzYWNkZTA2OTEwZAotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMTgxNTMyLCAxMGQyNDc3YWExZTMxOWE2MWU1MTdkMjVmZDZjOTVkMAotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMTc5NTgwLCAzMDEyNDgwYzQzZDE1ODY2Y2NjNGE4MWQ1NjY1MGVlMgotMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTc5NTI4LCA1ZTBmYmQ2MmExNjRkYzcyY2Y1MTEwMjNkYTc5MjE3NQotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgMTgwNzYwLCA2NzlmNDMwYzg2ZGNhMjAzNDU2ZjUzMmU5NzhkZmZjMgotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMTgxNTY0LCA2NGQzMWZhZjAxY2I3YjUyZDdkN2UyMDI4MGU2NjUyYgotMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTgxNDI4LCAwNDk2MWQ3MWFhM2M4MWIzM2QyOGIzOWVhZDIwZWUxZAotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgMTgyOTgwLCA1MTM2MWM4MDIwMDU3MjEwMDJmNWY0OTI0ZjA4MTcwOAotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMTgyNjI0LCA2N2M1NTgyYzQ1ZTNlZTdlNmFjYTQ5ZmRjMGE5ODBiOAotMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTgyMzUyLCA0ZmFkZTlkYjEyZjJkNmNlNjMzNTU2ZmRiODkxNDk3MQotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMTgxMzM2LCBhYzhmYmFiNjdiMzZkNThjNGU4Mzc0YmZiMDc0NThlNwotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMTgxNTI4LCBmNzk4MTU3YjZkNGQwNGM3NjdlY2I3NjM0NjkyMmRkYwotMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTc5Nzc2LCAwMWQ0MDdlZDBiODZlZWIyYzNlZTNjMjRkZDQ1MmQ4ZAotMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgMTgwMTAwLCAwNjJlNGFmMTUwMTAwZDdhY2NmODZhOTA3YTRiOTliNQotMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMTgwMjI4LCAyM2M2MTdiNzZlZjhmMjc0YmQwODkwMTZmYjg1MTZjNwotMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTgwNTkyLCA1Y2QzZDkzNTk3MzI1MTk2MDc5ZGMwMTk1NTZmNjkzMwotMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMTgxMTg4LCBkMzlkNTJmNWI2OTA2NjE0MzRiMWFiZDg3MTdiM2UzMAotMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMTgxMzAwLCA5ZTIwMjQ0NDI4NzIzNGJhZmQxMDNmYWI4M2IxYTk3NAotMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTgwODEyLCA2MDIxNjUyNzFkZTcxNTk0MTMyY2NlOThhZjU2YTdiMgotMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgMTc4ODE2LCBjNDI3ZDY3MTk2ZjQzZWNlNmJmMzg1NWUxMjU2ZDdiYgotMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMTc4MTk2LCAwZDA1OTAyZTI4NzBhODUzMzNhMjE2YzcyMzA3N2U5OAotMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTc4NzcyLCA1N2Y1MjhlYjk4NGI1YjcxODFjODliNDhiNTgyNzFmMwotMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgMTc4NjUyLCA1Y2QxMDMxYjBhZGEzYmE5YzJkNGMyZjJiN2M4ZTI3NwotMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMTc4NTEyLCBkM2MwYzg0ZmM2M2YxZTMyYTRhMDI2ZTJjZDM5YjE2MQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTk3ODMyLCAxMWRhNzc4ZDNkOTA0ZmNkMmFkNmRhZjg0YjIyN2U2YgorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTk3ODQwLCBlODljOTY3YzI3ZDdjZDk5NjNjOWYxMmY5ZGYyYzI2OAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTk4NjMyLCBiMmM1OWY5ODM0MDI0ZDFlNGI4MjllNTQwYTkxODE0ZQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTk3MTAwLCBiMjFiMzQ0ZDQyZGExMGVmNjczMGZlZDU1M2ZiM2YyZgorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTk2MjM2LCBlNjFkZTBlNGZmODc5YjY2MzBhZThlYjYzZDA2M2I3ZgorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTk3MzUyLCBlZmQyMTEwNWY1Zjk4Y2JkNTk1M2U4NWExMDA5MTUzMQorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTk3MjUyLCAwZTI0NDRhOTE4NWY2ODI5NGMxNmYwMzRkZDUyMjY2NgorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTk3MjA0LCAwMjU0NzUwZDg1YzQ3NGMxM2ZlM2MwZTRlM2MyNzJjZgorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTk3MDg0LCA0Yzg5YTk5ZGYyMzM1NzU5NzhkOWJjZDg5MzZlNDU4OAorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTk3NjkyLCA2ODFhNzZmNjc4OTJmOWQwNWJlNzJhYmFhNDAzYmMzMgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTk3NDU2LCBiYmE5NmI4NTIwZWFhNWI2NjEyYjVjNDhkNjQwOTkzOAorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTk3MDI0LCBiOWVhM2RjYzBjYjhjZjU1MmU1MzY3NjVjNWJiMzFmNgorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMTk1MTMyLCAyNjY0Yjc5Mzk3YWY3NjA4MWI3ZGRkNWMzNTA3ZDU3OQorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMTk2Nzk2LCBkNjEyODMwOGMxZmMzNDkzZWJjMmNlY2U3ZWQ3ODVjYgorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTk4NzA4LCA2YjNlNTBkNWQ0N2YyOWRmYjM4ZTE3OGZmYjkwMzZjNQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMTk4MDAwLCBhM2Q2YmU4OTNlZGIwMmU0NGY2NWY3YTA2YWE4ZWVlZAorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMTk3NTY4LCAxZWQ3YTAxZjgxMDc3MGQ2MmFlZDNkMTJkMTBjZDEyYworMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTk3Mzk2LCA1MTVlMTNiZWZiOWVlYmY5MmY3NzU3NGQ2Y2Q5ZmVjNAorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMTk2NjgwLCBhYzE4MzViOWE0MjY5Mjc4NTVlM2U1ZGJhYjI4YzE3NworMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMTk2Nzg0LCA1NmZhMjZhMzM5YzY5ZGYxN2QwMDNmYjAwYjMzNWJhYQorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTk1OTgwLCA4NTM3NDRmYjJhMmRlNzY4NThkMzJmMzVmOGIzZDgzNgorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMTk2MTIwLCBlOWM1MDEyNGQ5MmUyNjFmN2E5ODU5OWNiOWEyMGUzNgorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMTk2NjIwLCBlNzUwZWFlZDc1MmQwOTg3NGQ4MjNlZTQwYTg5MDRjNAorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTk3NTI4LCA2NjcxNTk4MDE0ZGI0MDJiNzBlMjc1M2VmZGEwMjhkMQorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMTk4MjA0LCA2ZTQ3MWViOWMzNTRkNmJlNGUwZDhhNjkxMzEzZTIzZQorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMTk3NTEyLCA3ZTQxNTczOGZiNzg4OWRlZTQ3OGY2MzkwMGY0N2U3YworMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTk2ODMyLCAwZTMwYWZhYjZkZTYwMmQwOTlkODhlZGQ2Mjc2ZjFkZQorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMTk2Mzk2LCAxMzg4MGFkODg4YzljZjM1MDRlMmViMDg3NzY3NjAyZQorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMTk0MjIwLCBhYTkwMDc2ODdjYWRlOGM5YTg3MmRlMDYzYmVkMDc1NQorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTk0NDI4LCA3OGFiNTc5NThlZjg5MTQwOTU0NzdlNThlZTQ0NjFjMgorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgMTk1Njc2LCBhN2QwNzc5ZGNkYTdmOTNkYTU2MDE0ODJiYjY4NjI1YgorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMTk2MzUyLCA2NjhjNTI1YzkxMDAwMGFhYjdkOTI4NWJlNmFjN2VkMQorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTk2NDY4LCA5YzEyNDk5NWQ2M2YyYTU0OGU2NDA4MTFlOTM5MTk1MQorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgMTk4MTg4LCAxY2I2MDAwMDVlNjhkMWVmMTQxOGIxYjQyZTQ2M2YwYQorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMTk3NTU2LCA4MGY2MjIzYWJhMmQ2Y2ZhYjNjYjU5NmYzNzIyNDNmMgorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTk3MDIwLCBiMTg5MGJiYjczNGMwMTYxMDMxOTBhOWMwNDNlOWZlMgorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMTk2MjA4LCA3YWRmNGIwOGM5MDIzMWVkZGVjMTZhZmY2NWNjMTM4ZgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMTk2NDQ4LCBkZTY5YzgxYTYwNWM5ZTE3M2E3YWM2NTA3N2QwMzk2ZAorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTk0MDcyLCA4YjNhZmI2ODk3MjEwZjE2NjBiNDQyN2RmMGQ5Y2M1MQorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgMTk0MDM2LCAxODI3ZjFkZWVmNjU5NDI2OTM5ZmZkOTRiNzM1NzViYworMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMTk0NDM2LCA0NmYzYWQwMWUxOGEyYTI0ZDcyMGU3OGY5YmRiNTMyZAorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTk1Njk2LCBhMTYwZmYxZTI4MTk1OTE0N2ZlMTE2MDY3NTRlY2M3ZAorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMTk2MDQ0LCAzN2YxNTc3MWY1YzA0YzEzYjAyYzAxMjdiZDk3N2ZlZAorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMTk2Mzg0LCBmYzQzYzM1NmU1Nzc1NTU3NTdlMjIwYmVlN2U4YTIzMgorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTk1NDI0LCA2ODIwMzQ2NzM1ZTM5MGI4NmQ5NTY0Mjk4YzkzNDEwMQorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgMTkzNjg4LCA1ZjM0NmY2MjJmOGUwZDMzZDdmNjYyZTlkZmJjY2NiNQorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMTkzMDAwLCAxNWViNjU2OWQ5ZmQzOWEzNDNkMTEwYjk2NWE5NzI3NworMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTkzNTkyLCBkNDFkNTYxZWI5MjdiOGUwZDYwODE3N2FmOTBkMGUxZAorMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgMTkzNTEyLCAzNTExMmUyM2UyMzhiZWZmMDNjNzY5Njc0ZGI0MDM5OQorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMTkyNTI4LCAzYTNhYzFiMjRmYjhmYzcyMTc0OTcwZDY2OGMzMDI5MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY19yZ2JfbWVkaWFuIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY19yZ2JfbWVkaWFuCmluZGV4IDNkNGMyMmIuLjZjNGQyZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfcmdiX21lZGlhbgorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYl9tZWRpYW4KQEAgLTEsNTUgKzEsNjAgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CisjZXh0cmFkYXRhIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIGM5YTE3NDFmYjI5M2I5YWQyMTg3NjQ5MmI1NDI1YTNiCiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiB1dHZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCi0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxODIxNjAsIGFiY2Y0ZjQ3N2Y3NGI2OTZmYWNhMmZjZmYxZjYyYWE5Ci0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxODIxMDQsIDdjYmNmMzM5ZmE0MGMyNDUyMjA2NzI5NWIzOWQ2MzdmCi0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxODMxMDgsIGRmYzJjNDE4ZjQzNzlhODk2NTRjMTZiMzRmZjE5NDQ2Ci0wLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxODIzMjAsIDYyYTQ2NDdiMDU3MDlkODZjNTFhMThiZTE2ODc3ZTk4Ci0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxODE5MjAsIDYxZDYzNTIwNzAzNTAzZjZlMTdmYWQ2N2NiYzA4Nzk0Ci0wLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxODI0MjQsIGY0Njc2MzgzOTZmZWFiZTYxM2IzYzg1MTI4OTQ1MmQ4Ci0wLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxODIyNDgsIDhhMGNiYTk1MGQ2YzVkNjNiYTk2MDMyMTJjYTk1YjBlCi0wLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxODE4NzYsIDkxNDMyZjQ3MmNmMzczZDVkNDAzNmJkMTAwOTUwZjNlCi0wLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxODIxMDQsIDFjODg1MmQ4MmE0OGMxYjAxOTExZmZiZWRmMGFjMWY0Ci0wLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxODI1NDAsIGYzNmI5ZDQ4MTIzYjU1ZjIxNDFhZTEwZGQyNmUxY2EwCi0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAxODIxMjAsIGU2ZWNkYjlhZjY1OTE5MTYxNTNjYTlhZWJhNzZiOWQwCi0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxODIxMzYsIDdkYzdiODI4YTViN2M2NTJkZjYxMjQ3NGZhZDY2ZjZiCi0wLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxODEyOTYsIDM0N2VhYzY1NjM0MzVhNjJmNzUyOThjZWZlMTNkM2E2Ci0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAxODIxMzYsIDNiYmNkOGFmYWNkZjk1NDlkYTllYmQ3MzZkZjU0OGE3Ci0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAxODI0MTIsIDE3ZjhjNmVmNjkyYjQwODU2MjRjZTFlZjdlZmJjOTYzCi0wLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxODI3MzIsIDkyMTI3NjBmYTExZmU0ZmExOTNiYTFhYTI1OWU5NzY1Ci0wLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAxODE5NDQsIDdkZDZkNmE3MDg0Zjk3YTc3ZWMwOWVjNmM2MmYwYWI4Ci0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAxODIyMzIsIDUxODU1MjY4N2Q0N2FlOTM3MjY2NzlmMGVkOTYyZWY0Ci0wLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxODE1MTIsIDI5YTY2OTI0NzQyYWRkMTNhMGNhZTY1ZDkzZDM4ZWE5Ci0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAxODE0MjQsIDY3Yzk2NTYzNzI0ODMzM2Y5MmRhOWQ0OTNiZjc1NDZlCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAxODA3NjQsIDI5ODQ1N2M2YzJiM2Y0ZWJjZGE4N2ExMjU3OWYwOTRkCi0wLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxODEwNzIsIDQ5M2VhNTkyYjdkNTllZWJmMDFjMDAyZTdlMjJmYzQzCi0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAxODExNjAsIGUzMDE5NWZjYzE2ZWNmYmI5MzQ4OTQzY2ZmMDE2MjNmCi0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAxODIxNTYsIGQyNmNmYWMzM2UxOWI0Y2ExMTIxMGM5ZTZjYjkxOTU1Ci0wLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxODIyNjAsIDk2M2MxNTdkM2YwMDIzYjQ5ZDIzMDk5ZDUzZDYwYzhiCi0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAxODE5NzYsIDI0OTRkNDgxYmYyYmU5NzY5MmVhZWRhOTVmMjc5YjBkCi0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAxODE4MzIsIGYxYmU5NWM4NDBkNGZjYjBjOGQ0YjdhZWQ1YjE5N2M1Ci0wLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxODE0MjQsIDAzZDkyZTg5MzU4YThiOWI5ZTdjZjMwMmVkZGUzMDdlCi0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAxODA2MzIsIDA5ZjllMTYyZmRhZjI4MzQyYzQ0MjE3MjE3OWE3NWM5Ci0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAxODA2MjQsIDQ4MWU3Zjc3MzBhYjNiYTY3YzA2ZmFhNjIwYThiZDVlCi0wLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxODEwMjQsIDdhMWQxYjA2YjczZDJiZjQxNTYzZWI3NDk4MDU3ODBjCi0wLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAxODE4NDQsIDhhNmNlNmRkNmY3OWU0MjNhM2JiNmMyYjE2M2FkYzU1Ci0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAxODE3MTIsIGE2ODAwN2JiZGYwMTY5YzllZDJkZmZhZTNkYzYzMjIxCi0wLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxODIwMDgsIGYzN2RkMDYzNWRlMzY5NzYxZTJkZTk3OWVlNzk5YzNhCi0wLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAxODE4MDAsIDE0MDI5YmExYzM2NGVjYTQ3NjU1OWNlNTUzOTE5ZTk5Ci0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAxODE4NDAsIGVlMjI3ZDE1ZjE1YzNjZDU2NGRjYWQyMTYwNDUzZmI3Ci0wLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxODE4NDgsIDEzYjVkMDg5MmNjNzZhMjViNDkxNGYyZDcwNmEwYWQ1Ci0wLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAxODE5NzYsIDFhMGJlOWYyY2VmZTBkODY3YzVjMDNkNmIzOTg3YWQ4Ci0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAxODEyMTYsIDc5Nzk1ZDczNWY5ZTBmOTIwOTEyMDNiZjhiOWViOWVkCi0wLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxODEyMzYsIDJkMDA2YzhjNGJhNDQ4Y2E3ODQxZGY3NmU0NGZmYTg4Ci0wLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAxODA2NzIsIGVkNTIxMGFiZGFlNDkwNDJmY2FlOWJkZTJmNjVhMDU3Ci0wLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAxODEzMjQsIGZiYmM3ODM5YzU5NWNkMGYwZWZjMDkxN2VkZmVkMmMzCi0wLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxODA5ODAsIGM2MTIwYjVhOTQ0MGY0YTBkODM3MzE2MjdlYjk2ZDk4Ci0wLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAxODEyMDQsIGFjNDM3MTkxMmQxNmY2NTdjOTBlOGEwMGNmYWZkZmQyCi0wLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAxODA3MjAsIGQzOTJkOTVjNjczNDkyOTZkOTIyZGJmNTNlYzNmODMyCi0wLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxODAwMjgsIDM3YTI3MTdmYmQ1YWFlYjEyODgxMjI5ODQ4NGY4MjY3Ci0wLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAxNzk3MDQsIGU4NzE2ZjQ4NTZlNGNjZGM1NDE2MzJhMjE4ODk0ZjYyCi0wLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAxNzk2NDgsIGU5OWNiZTVkMWJiZDdiY2UyNDFhZTUwMGI0ZGUwNmMyCi0wLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxNzk0MjQsIDZmOGE1ZTM1NmZiNzdiNjFkOWRmY2FiZGY5NzM0MGI5Ci0wLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAxNzg5ODAsIDc1YTc3MDBiODIyMjM2YjBlY2IxNjlmZDY5MjkxMGYxCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTQyMzIsIDk2NDMxZjU3YzE1ZGZjZTc4OTQ1NjNkZjE4NjQ1N2M3CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTQyNTYsIGY3NjE3ZDg4YTViYjg2MjA0N2RkNjJhMzYxOGVjYTJjCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTUwNDgsIDc3YWE1NDQ2ZTY0NzMzYWEyOWJmNWJhNGFkOTIwNzNkCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxOTQwMTIsIDRhNzNlOGIxNTZlZWJjMTVkZTI5OWM1NzA4NzYzOWE1CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxOTMyNjgsIGEwYWZiMzViZTRmOWY5MTM2NmQ4NDhiMDYwMGM5NDlkCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxOTQxNjgsIGIwNTgwZmJmMDVkYzlhMmFiYzA1M2YyZGViNDhiOGM5CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxOTQyNDAsIDVmNWFkYjg2MmExMzg0MzEyM2UyN2YwMWQxODcwNzk5CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxOTM1MTIsIDcxZGNhODhkM2ZkZjc1Mzg1ODg4NzAwNmFjM2NjMTNiCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxOTM5NTIsIDdlZmE3ZDEzOGZhNDEyMzQzNzQxY2NiZWIxOGFjZDE4CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxOTQ3MDAsIGZmZGRmNDEwZTViOGU0OWNmMDQ2MmJhZjdiYzllMTc5CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAxOTM5ODQsIGM3MWI1OWE5Njk5ZjI4MzJlOGMzZDc2ZTVkNWU0ZjBjCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxOTM2NDAsIDU5OGJkZjNhODE0ZGI0NDc3NWFkNzAzZDY3NGU5YWI5CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxOTI5MDAsIGRlODNkZDYwZTY5YTMwNWFiMGE3OWM0YTg1OWQ0NDRkCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAxOTM3ODAsIDc4NTgzNDliYWE5NzA3OTRiMDM1M2UwMTFmNzUxMjU5CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAxOTQ1NjQsIDk0NzAzNTllYjZmMDlkNWExZGI1ZGMxOTllOTEwYmNmCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxOTQ4NTYsIGMxNTgyMzc2NWE5ZDRkMTU4M2YyZGQ3YjYzNTM0Yzk1CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAxOTQwNTYsIDVmNjBlZTMyYzllMDZmMDgwZGNkMGI0MDI1NTc2ZDViCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAxOTQxMjQsIGExMDgxNWM2NjAzZTM3NWFiMGIyMTMzMWUwMzY1MWRlCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxOTM1MDgsIDU0YTU3NjJmMjcxN2NlMWJlM2I5MTkzYjkzMGQxYjFmCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAxOTM0MTIsIDc4MmIwN2I4YWMzYmQxYTg2YWQ1NjJlZjdkN2ViY2E1CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAxOTI0NzIsIDk2ZjdmMTk4M2Q2YWMzNGM1OTFlMzMwNDVjNWJhM2RjCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxOTI4NDQsIGI1NmJlYzAxZDY5YjNlMDczYWM5ODIzYjJiZjRjMmY1CiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAxOTI2NjgsIDMwNzFjMmQyODI2NzJhNTk3YmVlNDY4MmNlZjMwNGZmCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAxOTQxMDgsIDM0ODRkMmNhNzQ4YzIwZDg3MjgwZjUzMzMwNTQ1NTJkCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxOTQ1NTIsIGIwNWE5MGRhMDJjMThlZTg4MDIzNGQ2MjAyNTkzNjFkCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAxOTM4NjAsIDA4NjE3YTQ5M2QyYWJlNzViNDM4YTM1MzE1YWVmN2EwCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAxOTM0NTIsIDk1OGVhY2NkNTVkNmE1NTgzMmVjOWNiNmNlMjAxZmM0CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxOTMzNjQsIDhjYWI2ODUwODY2Y2U5YzBlY2Y4MThjYzQ2MzBiZGIzCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAxOTIwNjQsIDAzY2UzMGZhZGY2YjgwZDBiOTAxYzBmNTNmMDllMjNiCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAxOTI0NjQsIDdiZjMzNjRhMDk1Y2JlYTJhMDMyZjY3NjJkMzQzM2JmCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxOTI4ODAsIDYxNzZiY2JkZjQyZjc4N2FhNGMyMTc5MWZkM2Q3M2UyCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAxOTM2NzIsIDA3NjBiMDRlZGY5NjljNWIwOTE0ZmNhZTgyZWU3ZWUzCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAxOTM2MzYsIGEwOGM5MDVlNDZlMzVkNTc1MDAxZTU3MDM4OWE5YjcwCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxOTM5NzYsIGRmZjE1MWRjMmRmYTVhODYxMDNiZGRjMTE0ODRhMzhmCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAxOTM0NTYsIDg2ZjQ0ZTRhNDM4YWQxNTBiYWVlMTRmYWNkZWJiNzAxCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAxOTM3NjgsIDU2NDVmNTVlZDgxNTRhMGM5MTM4OTBhMTFiNmYxMjYxCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxOTM1ODQsIDAyM2NhMzY0ZDlhODhjY2IyYmFlMDgwMDhjNmMzMDk4CiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAxOTM4NDQsIGJlODMwNjJiZmZmZjcyYmEwYzQ0MmY1MDJjNDFhMTg3CiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAxOTMwMDgsIDZlMWRkOGYyZDE4MTQ1ZWUxOTkzOTVkMzRjMGU1NWZmCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxOTI2ODAsIDI3MjU2ZjNmMTExMTU1NGE3NWQ3YjczNjZiNzc0NTdmCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAxOTIxODgsIGQ4NmVhNWZhZmM0MWQ1N2UzMjA0NzlmNTRmZDEyODZhCiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAxOTMyMDAsIGEzNzU1MzQxNmMwMTg3YjM2NGNlMmI2NGVjZTIyOTc1CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxOTMwNTIsIDhlM2M4MWQyNDZiNzQ0YzJhZWQ5YjczNTAxNWVlOTNmCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAxOTMwMzIsIGRkOGUyYjM1MGQ4MTgxYzZhNzM4MzJjODY4ZWE5OWY0CiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAxOTI0NDQsIDY4NDRlMmRjNDM1ZjQxNzAyODY0NGQzMzE0Yjk0YzRmCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxOTE4MjQsIGZjMDFlMjJiYTQ1YmNhNmVhYzY5YmE3NjA0M2UxNDg0CiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAxOTE3NzIsIDVlMmJlZGRhMzgyOGQ1OTBkMjVjYWExNGY5NmJhN2IwCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAxOTE3MjAsIGVkYWFlNTIyZjhhOTc1YmJlZjBlOTA5ZWYwOWU3ZmM3CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxOTE1MjgsIGYyZDk4MTc5ZjVjZjA3NTJlY2JkNmQzOWM0NDU3MjgzCiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAxOTA2OTIsIDc0Y2QwZjc2MjM3MTc4MTcxMmUyZmYyZTNmNjBhYzU3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYl9ub25lIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY19yZ2Jfbm9uZQppbmRleCA4Mzk3NjZiLi4yN2RmOGJhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYl9ub25lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfcmdiX25vbmUKQEAgLTEsNTUgKzEsNjAgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CisjZXh0cmFkYXRhIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIGM5YTE3NDFmYjI5M2I5YWQyMTg3NjQ5MmI1NDI1YTNiCiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiB1dHZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCi0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDEwMjQsIDQ0ZGU2MjQ3MmY0ODU0MTA4MTk3MDdjNDRiNTNmMjc2Ci0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzMDEwMzYsIGZmM2MyOGMyM2IxNTgzNGE4NGM1N2IzMDQ2MTA5MjRmCi0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzMDA4MTIsIDcyZjAyYTY5NzQ2NGY1ZmRkNTRhZTJlMDU0YzEzMWQxCi0wLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAzMDA4NzYsIDg4NzliZWNmOGIzZDUwMDFiMTk2ZjQ1Yjc4MTdlZjZiCi0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAzMDA4ODAsIDJlZGVlZDU1YzRkODRkZWExZmM5Mzg2NTUzZDc1MDNmCi0wLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAzMDA5MDQsIGY3OTlmMjZlYWUzMGUxNzk2YmQ2MmY5Y2RiY2IyYjE3Ci0wLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAzMDA5MDgsIGJjNjA2ZWUzYWIyODRkMzU2N2EzZmJkNDc2ZDY3NGYwCi0wLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAzMDEwMTIsIDQwNGY1NWJlOWVjODYwYTFhYjNkMTU3MTE5NjVjOWJhCi0wLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAzMDEwNDgsIDExMjM5NGRiMjg2NTYxMDFiNGU4YmEzNjIxYjQzN2FlCi0wLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAzMDEwMDgsIDg5NDViYjc2NjhiNGE1Mjk4NDRlNjhlMWY2YjY1MjJiCi0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAzMDA5MDgsIGE5MDk3YzVmMGJkN2RkZWE3MTFhMjVhYTc0Njk2ZjcwCi0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAzMDA4NzYsIDU3OWRlMzE3ZDE2NjI5NTA4ODUzMGM3OGY0MDM2MTFkCi0wLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAzMDEwMTIsIGQ5N2UzNjI3YzQ5NDAxMmQ2MTY3YTMwZWM4MTkyMzYwCi0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAzMDA5MjgsIGZkMjAwNjZiN2YzMTM2Mzc1MTMyOGFlZmVkZmFlMDRjCi0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAzMDA4MzYsIGQ5YmRkNTYwNmY0NDI2YjUwM2YxOWE2NzRlODA1OGEzCi0wLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAzMDA4NDgsIDZjOGYyY2JkNzU2NDY1OTI4NzZmODEzOGEwMTdjMWNlCi0wLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAzMDA5ODgsIDU0ZTE5OTQwMDExYjNiZmVkODA5YTBlZGMxMmMzZGQ3Ci0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAzMDEwNDAsIGIxZDVmMzkyMTVmMzA1OTUzYTg0NmZiMDFkYmMyZjI0Ci0wLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAzMDExNjQsIDlkZGU3NGYwZWUzNjI2ZWVlYTQxYzUzOGZkODBlMWZiCi0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAzMDExOTYsIGZkZjIyZDJjMzVjN2FiNzI0MTZhMjY4YmY2NjEyNjUwCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAzMDExNDgsIDI3NTI2MWJjMWMxZGVjMGJmNzEyZGNmMDUyMTNkZWYyCi0wLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAzMDExNDQsIDY2Y2NlYTZmY2U5ZDZkNzAxNmRhZmIzYjM0OWZhMTYzCi0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAzMDEwODAsIGQ2ZGM2Y2UwNzA4ZGZkZjc0ZTkzNjI3MWE5OGMxOWU5Ci0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAzMDEwMjgsIDQ4ZTYxMGI5ZDc5OGUwNjQyODI1OTE5ZmFiMjMzNTI0Ci0wLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAzMDExMDAsIGFlZDhmOGYwYTlkOTZhYjk5MDZlYTgxNzVlMThjOWZmCi0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAzMDExMTYsIGZlOWUxZWNjYjljY2M5MmI0MDQxMjI4ZWEyYzU2YzhlCi0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAzMDEwNTIsIDNlYzJmNzZiNDFmZDhhNmVhZmFhNmJiMTRiOTRjMTUzCi0wLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAzMDEyMDAsIDYwZDYwOGJiZTBjYTI4NWE3ZDhhMWE0ODIyYTg0YzRkCi0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAzMDExMjAsIDZkMmNlYzUwZWUzMmU3NmViNmRmZjc2YTQ5NzZkMjIxCi0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAzMDExODgsIDhmYWE2OWZkNjJlMDY0NmU0ZWI4NWMxNjAxODI3MzY0Ci0wLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAzMDExOTIsIGViMWZhMTA5YzVlOWI4OWYyOWJlN2NmMzYzNjQ5YWNkCi0wLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAzMDExMjgsIDMyYmExNzk3ZjVkZWU2NjQzNzEyNjg4NjIxOTg0MzI2Ci0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAzMDEwODgsIGExYmZhNzAzMTRjNDBmNjBhMDgyM2JlZWY3NGUyMzNlCi0wLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAzMDEwNjQsIGIxOGQ4NGVmYTAwOTExOTlkZDkxNjdiYmRiMzZiODczCi0wLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAzMDA5NjQsIGEyYWU4ZDNkZDY1NTQwM2JjZmRhY2U0MGFhYTFkNzhiCi0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAzMDExMjQsIDhlY2U2MGRmMGYwZWY0ZjNkODg3ZWFjMTZjMjNjYWQ2Ci0wLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAzMDEyMDAsIDEzZWI0YjVlYzc0NzE4MzdhYWRjZTM4ODQ4ZTQ4Y2IyCi0wLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAzMDExOTYsIGI1ZmRlZjIxMTc1NTEzNGY4ZTc5OTg3OTNhMGFiMGMwCi0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAzMDEyNjAsIDJmN2UyMDQ2YmFlOWU2NjRlNzRiYzU2YTM1OTY3NDNjCi0wLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAzMDEyNjQsIDJjZmMwMTNjOWU2NmE1ZGQwMjI5YzY1NTFmZWJkNjU4Ci0wLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAzMDEyNzIsIDQ3ZThmZjAyYThmMDU0YzY2Njg3ZTJiNjEzZTQ2Y2Y1Ci0wLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAzMDEyMzYsIGY0ZDc2NjE1NWVlZWI3YjAzNjg3YTMxNDE4NDBiZjMyCi0wLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAzMDEzMTIsIDhmZTEzNGFlZmMwMmI2OTEwZGMyMDU0NDQ3ZmQ5YzM3Ci0wLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAzMDEyNzIsIDllYzU3ZGIyNzVmY2EyYjU5NjczNGM0OGE1MGMyOGJjCi0wLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAzMDEyNTYsIDE3YmFlMjA3ZDhkNmY1YjJiNTAwODg1ZTMwNTgxODVmCi0wLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAzMDEzMDgsIDlmOGU5MWYzZmJiZGQwY2ExN2IyYWQwZmZlODg4ZDVhCi0wLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAzMDE0MDAsIDgxODRlNTVlYjU0MzI1MTY1NDdkZjUxMjE3NWMxNWZjCi0wLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAzMDE0MDgsIGRkMGMwYWExNDI2NDI3NTQ5ZTljYmIyMmVmODJmOTMwCi0wLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAzMDE0MjQsIGM2NTAyNWRjM2ZhMjFmYWQ5ODExOGFiMDM4NmI5MTBlCi0wLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAzMDE0MDgsIDI5ODJiNDllOTRhYTI1YjhlZjMwZjgxNzY5NjUwZjE1CiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAzMDM3NjgsIGMzN2QyM2I1YmMxZGNjZWFjYWZjZWJkMGE1MDU0NTkwCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAzMDM3NjQsIGE2YThiNDQ1MzIzYzAwYWI1NmFkMTA3N2E5MGIzNGJmCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzMDM2NzIsIDAyOTA0ODc2OWUwMDZmMmEyMzU3ZjM3M2NmYzBiNmJmCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAzMDM2NzIsIGUxMzQzM2Q3ZThmNzVhMjZlZWNhODY1MjNkNDdkMGNmCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAzMDM3MjQsIDRjM2Q0MzdjMTU4MjU1ZTM5ODA3MWJkZDJlNjk5ZDllCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAzMDM2NzIsIDExZTMzNWRmNGZkZmNmYjc1NjMzMDVhMzM3NDAwNThlCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAzMDM2NzYsIDU5NGE3YTYxMDFmYmY4ODRiYjNiYzMwOTQ3OWJkZjE4CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAzMDM3NjQsIDA5ZjkxYTA1ZjhmNTA3ZjYzMzhkMTU1OTFkZjM0MDAyCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAzMDM3NzIsIDFlMTc3ODg5YzE4OGZkZDc4MzgxNTEwM2MxOTg3ZTVlCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAzMDM3MDAsIGY2ZGE4ODczYzY5ZmI2MzY1NzY0MzI3MzA1YTM2ODQwCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAzMDM2ODQsIDY4MTBjODA3MTkwNTgwNzhiN2Q0MGE3ODdmYWJlZTcwCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAzMDM2OTYsIGY4ZGNhZDY5NGMyNzYwNzRmNTAyMjI3NmU0MDY3Njk0CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAzMDM3MjAsIGQxZjc2NGFhZjE0ZTc4YjY0YjE4MjUwMzM0MmRmNzY0CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAzMDM2NzYsIDQzMDY2ZGRiYTIwNzI2ZjU3ZDc2MjMwODkxZjc2NzMwCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAzMDM1NDgsIDY1MTJiZmYwNTA1MjFjZDYzNDNlNWIyZjRiMThiZTZjCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAzMDM2MDQsIDc2YzkxMzY4ZThkYjhjMTg1OTFjN2NiNTY5Nzc0ZTEyCiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAzMDM3NDgsIDM2NTgwNTg0MmVlM2NlZmVlOGQ1ZmViMTY5MDc1ZWNmCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAzMDM3NDAsIGU2YmJjMzRkNzA1N2Q4MTJjZDk5NDQ3M2I5M2NjYWRiCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAzMDM3ODgsIDQ4YmNiYmMzYmY4MDU1ODZjMzRmZjIzZWJlYWEyOGVhCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAzMDM4MDgsIDI5ZjI2ODg2N2M0NTIyNTUxZTZmNzNkZDRhZmIzNmUxCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAzMDM4MDgsIGVmZmQxY2YwYTYxNTAxZjQyN2U0N2M3NmM0NjlmZjMyCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAzMDM4MzIsIDBlYTg0NTc2NjEyYTRiMGI4ZjllMTRiM2VjZjEwODYxCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAzMDM4MDAsIDRiNGQyNGNlNGYxNzZkZTRjMzRlYzg1NjU2ZWExZTQ5CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAzMDM3MTYsIDU4ODQ1YWQxYzlhMDdkNjJmODM0MTQ2NjJlYWYxMTgxCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAzMDM3ODAsIDhkYjY0N2M1MzI0YjNjMDYxYWEyY2RhZTc1MjdlYzhkCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAzMDM4MjQsIDdhMmRkYmU5ZDFhZjNkMzRkNzUzOGJhMTBhMGFhZTNjCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAzMDM3OTYsIGE4NDQ0ZThlYzdiNjRjMzQ4MTc2NmViY2FmZDJlN2I3CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAzMDM4MTYsIGJmNzhlMDRlMDQ0MjlhYWIzNTI3YmFhY2Q1MWRhMWIwCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAzMDM4NzIsIDAyZDk2OTNjYzc4YWYxYjlkNGExN2I1MzYxZGFhMzI1CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAzMDM5MDAsIDA2NWNkZTM1YzBhYzQ5Njc1YTllZThlMDQ3YmIxNDcxCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAzMDM4NzYsIDA4ODhkZDUyMDE4NjRhOWYzNGY3ODRiNzk1OTU2M2JhCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAzMDM4MjgsIDY4MzdhMWEzZjRhZTA0Yzk2MDFmYTlmNGMyNzA5OGIyCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAzMDM3MjAsIDhjOTBmYzg0ODFkNzQ1YjAyMGMzMjUxMzRiZjAwNDdkCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAzMDM3MDQsIGQzN2JkODhhNDJlNGI4NGE5OGYwZTUxMjA4YTM4NzdkCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAzMDM2NDAsIDI0NDRjMDY5NDI3YmY2YTg0NzExM2ZkMTZlN2E4NjNmCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAzMDM3ODAsIDdhOWFhMWQ3ZDQzYmNiMjJhNzU0ZmE1ZTdlZTkxMWEwCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAzMDM4MjgsIDRhMGFiMWJiZWE4ODY5Nzk1MGJiYWZlNTY2YTAzYjUyCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAzMDM4NjAsIDZkMjA3M2QyOGUyMjYyODZlMWU3OGRmOTJiYzI3MTU0CiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAzMDM4ODQsIDc0YzQzZjI0ZDYzNmRlM2ZkNmFmZDFkMGFiMDk4ZTU3CiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAzMDM4NzYsIDMyOWExZDE1NThmZmM0MmI3Y2RiMWYxNDFlMDQyNDMxCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAzMDM5MTIsIDZiMWYzYzM1ZjI4YWIxMTgyMzU0YjMzZWE5ZTM3MzMxCiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAzMDM4NTYsIGVjMDBkYjViMDE5YTNmNzJjM2ZjOTM0ZDM4MTFjYWQ3CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAzMDM4ODAsIDZkMjkxZjgyOTE0NWMwN2YwMDAyNjMxYjBlMjJhMWY5CiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAzMDM4NTYsIGM0MzhhZTRkYjdmODk3YzllMmExYmM2NTI2YmI0M2UxCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAzMDM4MjgsIGQ5ZTU4NzBjZjQ1OTg1NzdlNGJhMGFjNDY4ZWYyNWRiCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAzMDM5MzYsIDZjOTBkYmNhMzE3Mjk1MDEwMDI0Y2M0ZWM3MGQzZjg3CiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAzMDM5NDAsIDAyNWQ5MTczZmYzMDdmODljM2VkZjQzMDc0YTI2MWU5CiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAzMDM5NDgsIDQ4ZTdhYjY1ZmI5YzdhMzVlNDkzM2E3NjU4OTM1NzI2CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAzMDM5NDQsIDkyNWViM2M0MmI4NjVkMDg2MWFlMDM0ODEzNmZjMThjCiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAzMDM5MjQsIDgzYWUxMDVkOWQzMDFlYTkwMGYwMDRkMjc0YWRmODk0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYmFfbGVmdCBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfcmdiYV9sZWZ0CmluZGV4IDgzZTNjYjQuLjExYmRlMWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfcmdiYV9sZWZ0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfcmdiYV9sZWZ0CkBAIC0xLDU1ICsxLDYwIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQorI2V4dHJhZGF0YSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCA5ODgxZjQ0MjNmMGEzYjVkYTI1YTA1NzRkMzQ1MWVlZgogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdXR2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTk1MjYwLCBhOGZkYjIyNjQ2MGYyMTA1NDJlN2FjYTZjMTJiMDg3NAotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTk1MjY4LCA0NWYwOTg3NjRjY2JhODVkYzY0MWI3ZTQwMTQ2MWMwYQotMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTk1ODg4LCBlOTIyMjYxNjcyYzdkZTQ2YTMwMmFiYWQzYTNmZTQ1MAotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTk1MzE2LCBmOGZlYmQ1YWYwZmVkMDAwZmFiMjk0M2NjNjQ5OTc1ZgotMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTk0NjM2LCBkOTA5ODVhZDhhZmQyZjk2OWFmYTg0MjUxMDA4NTg1MgotMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTk1MDY4LCA5MDlhZGI0NGJkMDQ5MTg2YTk1OWYyODAzZTY0MTUyMAotMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTk0NDg0LCA1NDc3NzIyMzNlNjUzZGFjY2M2NjEwZmNiNjM2OWRhNwotMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTk1MjI0LCBhYTgyYjc1ZjYyMzBiMmU5NDhhYmRmZTM2YmNlMTE1MAotMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTk0MzU2LCBkNjdmYjEyMDg1MzIxMzcyNTI3MDFkZGNiZjdiZmMyZQotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTk1MjQ4LCA3YjA4Njk4ZDJhOTExZmJhNTIzMWMwZmVmMGRlZDRjMgotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTk0OTk2LCA1NzBlN2Q5Y2FlYzUyOTc1ZGVjMWMyYTVkYmY3Y2RlZgotMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTk1NTI4LCA3MzA5YzA1MzFiOTQyOTAyYzY5MTc4MWYyYTZkYTFhMQotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMTkzODMyLCA0MDk1NGNlYjg3MzcwY2FjM2RiNWM4YzJkN2MwMDFkMQotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMTk0ODUyLCA1MzgzODJjMzc3ZjBjNmU5MDcwZWMwYjhjNWZiM2UzOQotMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTk1NzU2LCBkMDAyYTgwMzQ2ZjM0NjAzODBhYmI3OTRmMmQ1NmE2MgotMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMTk1Mzg0LCAxYTRmNThiM2M3MTBmMmZlZGFmNzQ2YzI4MTU1NmI0YwotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMTk1MjQ0LCAyMTg4MzJkYWIxMjUxZTFkYzg1MmU2ODM5YTQ4YjNmYwotMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTk0Nzg4LCBhMDM1YWNmNDI4YmQ5NTY1YTRjM2ZlYzI1ZGZjNmY0ZgotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMTk0MDQwLCA2ZGJmZWI5NDliZGVlYjA1NWE0ZjdlYmY3OGFmOWE4NQotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMTk0MzIwLCA4YjRhYTNmNmYwNWFhNjg0ZDllNGFkZmE0Y2RjZTgxNAotMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTkzODY4LCA5OGNkOGIxNTA3ODRmNjY5NWY4ZGVhMTYzY2VjZjI4NgotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMTkzODMyLCAyN2E4ZGIzMzAxNGM0YmM2YThkYTM1NmM0YjFhM2U0ZgotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMTk0ODY4LCBmMWUxNDYwZGNhOTEyNzE5N2MwYTQwZTY1OTkyNDYxNgotMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTk1MjM2LCBhMDEyZjg1NDhlOTIyNDMzMzRlZGNkN2M4ZjU3YWE1MgotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMTk1NTEyLCBiZjNkNGU5NjhkMTI2MjMxYmFhNjYxOGQzMzQ0ZWY4MQotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMTk1NTA0LCBhZGY0YjQ5ZDg3MjFmMWIzMjNmYTUxOGYyZjBkNDc1MAotMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTk1Mjg4LCBhYTE2ZGQwODdhNzNhOWNhZGM1YWJmYzBhNDZjY2RkNAotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMTk0NDY0LCAyZTNmMDcyNDQ5OTljYmU5NDk0OTViNTdhZGNhYmU2OQotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMTkyNTEyLCAyZDZjZTBkMjlhOTI5ZTAyMDhlMTU3OGU5NWM5ZDM4OAotMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTkyNDYwLCAwODFkMThjZDEzOGVlYWQwY2Q0YjI1ZjU0YTdjNzU0MAotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgMTkzNjkyLCA1NDZiNmFkMjhiNjEyYzJmNjAxYzdkODdiMjY1YmE5NQotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMTk0NDk2LCBiMmIyYWUzYjFkNjdlMzMyMjk1NDU2ZTZjN2JkZDM4MQotMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTk0MzYwLCAwODM3YjEyMmQ4NWFiYzRkNzA0ZDQwNjI5MjY2YzU4ZAotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgMTk1OTEyLCBiN2E0YmJlNDM2ZDYzMzk0Y2VlNzBkNDBlOGE4YTRjZgotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMTk1NTU2LCAxYjlhM2ViNmNkYTliYmQ0NGJiZGQwZGMyNmE3NDI1MgotMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTk1Mjg0LCBmMjhkNzgwZDQzZmE2OTc5Mzc5ZGQyMWZjYjEyZTkwNgotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMTk0MjY4LCA1NTA4OTg5ZGFkMDZmYTA1ZWU0MDU0ZTc1OWNkZmQ0YgotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMTk0NDYwLCBjYjY1YTBlOTdjMDNiMmZiZTY5Y2FhNmFjMTY2MDA3MAotMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTkyNzA4LCA0MTI1ZWU4NmNmNGI4Y2E2ZDg5MWMxNzY2NjJlNTg0ZgotMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgMTkzMDMyLCAwOTZlZTI0YjNlMzUwNDk0ODBlMjgxNzE2OTNmYmQ4NQotMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMTkzMTYwLCBjMDFhZWY2M2I4YmM3OTJkMDgzNTVjZTZkNjhhZmZlZQotMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTkzNTI0LCA1N2FmNDdiN2JmZTEzMmNmNThlYWIyODA3OTk2YjNmZQotMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMTk0MTIwLCA5YTRlMmQ3MmY0NTI2ODE1YjI1M2IzYWNjZTJkZDQ5YwotMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMTk0MjMyLCBlNTc1NTA4ZmZiZDJhNTM4NzFlODE3Y2Q4OTQ3ZTJkMgotMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTkzNzQ0LCA5NWQ4ZWVmYmZiZjVhNzM1NGVjYmYzNTgzNTI0M2U0NAotMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgMTkxNzQ4LCBkZTJlZWRlYmIyODQ5MWU1OTcwMDMwMDYzNWFmMWY5MAotMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMTkxMTI4LCA2NTI2NzBmNjg4MTQxOWJlNTA2OGYyZGU2YWMyZDkxZQotMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTkxNzA0LCAwNzBmNDZkYzI3ODIzMDUyOGFhNmI0MDI1NmE2ZDg5MQotMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgMTkxNTg0LCBlNGI3NmZjZjM0NGUxMjU3MjljMzM5ZTM2MGExNGIxNQotMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMTkxNDQ0LCA2YTMzYjM3NGE4YjQ4NTQ5MDk0YTI0NTQzZDgxZDk5OQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjEwNzY0LCA3YzE3Y2Q4MzgyNTgwZmNmZDZkYWMxZGRhYTY0NGM4ZAorMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjEwNzcyLCA0YzZiY2RlNTJlNThkODAwOTI3NjIwZGY5ZTBlMDNiOAorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjExNTY0LCBjMDc1NGU1YzgyMWFlMGMwY2EwYmFlNzhhZDhmZTFhYQorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMjEwMDMyLCA2ZWE5ODgzOTdkMDBmNTUzYzZlNWRkYmNhN2EwOGFmOQorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMjA5MTY4LCBjMmQxZmNlZTYxYmZkYjVlMzkyNWFjYTM0MjU1MGFlNQorMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMjEwMjg0LCBkYzkyY2MwN2FjMTIxMWU2NjRhMjRjNzAxYzQxMGUwZQorMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMjEwMTg0LCAwOTc3ZTI1MzM1NWJmZjgyZjBlZmQzMzBlOTRjZWM2YworMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMjEwMTM2LCBkODFjMjhjZmVmN2RkNDdhYmYyYWM5NTFiNmE5NDhlNworMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMjEwMDE2LCBkMzc4ZWZkMGVmZTEwMzQwN2FmYThiOGY0NWQxN2UyNAorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMjEwNjI0LCAxYTdlNGE0YzdiNGNjYmQxMGI5MjM4YjIyZGJjOTUzYgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMjEwMzg4LCA2MDdmZGIyOWIwYmY1ODQ2Y2JiYjc3NjQ1OTg0MDQwMQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMjA5OTU2LCBjNGM0YzE4YjgzZGIxOTgzYjFkOTI2ODAyNDAyNzAyNQorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMjA4MDY0LCBmMWE3M2Q3ZmUxZGZkZWIzMzc1OGM5ZDdjNjFmYTgxYgorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMjA5NzI4LCBjZTdiODFlMTlkOTQwZWJkZGVlZjkzZTI4MWZlZDAwZAorMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMjExNjQwLCAwZDY5MjlkOGQwMzRmOGFjY2QwMGY1OGI4ODcwNzNmNQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMjEwOTMyLCBiODk1ZjgxYzAwZjk1OTg2OGUyNDk0NGVlODE2ZTBkZgorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMjEwNTAwLCBjNDM0OTQ0MjBhNDViYjhmYjBhOTA3ZDMxNjlkMzBiNworMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMjEwMzI4LCA1ZTRkNzIzODllMjczM2Q4Y2UyNzRmMGM5YTdjZjdhYQorMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMjA5NjEyLCA1OWQzNjhhY2MxZWEyYzBmMjhlZDA3ODdmZTViYWQ0YQorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMjA5NzE2LCA3N2EzMzFlZmZjMGJiNTQ0ZWYxNDQ1ZmQ1YzQyY2ZlMgorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMjA4OTEyLCAxZGU2OTQyMTBkOGU3ODFjZThlYTI5YWRkMTkwYWQwNgorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMjA5MDUyLCBiNDg5MjdkNmUxNjU4YjVkZjMzNWMzNGJmMGZjMGRjOQorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMjA5NTUyLCAxYzAwYWQ3OWJjZjFlZmRiNjMzYmFhMDQwZjVlMTQwMAorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMjEwNDYwLCA3NTVjNmRhZjI2ODFiYTBhZWQ0ZTRjOTYyZmFhMjg4YworMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMjExMTM2LCBlNmE1Njg3ZTA1YTcwZmM3Yzc0MWYyZWY3YWZiOTNiOQorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMjEwNDQ0LCA2ZmUzZWM1NjU3ZjA5MmIwMDlhN2JjYzQ4MTVmYzViMworMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMjA5NzY0LCAxOWJjOTc5MmIzMDcxMWZiNzI3NmE5Zjc0ZDQyM2MzZQorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMjA5MzI4LCAwMTQ0ODk0NDExYTRjNWYxNGM2NmEzOTNhNDZiYjNiNAorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMjA3MTUyLCA2MWJiZDI2NzZjYWY4ZmJlNjU4MjI3NGZlOGFkZDA5ZAorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMjA3MzYwLCA5NjYzYTZkMTMxYjAyOWM5YWQ3NDY5ZDY3YTM4MTgyMworMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgMjA4NjA4LCBhMDkwODQ4NGRmZWVhZDc0ZmIzNTFiYjFiYTNiNTE0YQorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMjA5Mjg0LCAwMGRkYTczM2UyMTZlYjk2OGNmZGY5N2Y2MTM4Mjk0ZAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMjA5NDAwLCA3ZjdlNGQzNTQ2YWI4OWJhNWVhZWQ4MzVhMmZhYmY2NAorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgMjExMTIwLCAzYjI4MWZhZGJjMWVlZDNiNGQwZTZiMTRkZWI0YTE4ZgorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMjEwNDg4LCBmM2ZiOTNmNjUwNGZmZWU5OTg0NTc0YTdiNjg1NGQ4OQorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMjA5OTUyLCAxY2NmNWFhMTE4YzhjZDUxZTA5OTc0OTI4OWZkYzM3NAorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMjA5MTQwLCA0ZTRjMGYwYTM4NjA4ZjFmZjc2MGE3YWRhOWQ0NGE2ZgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMjA5MzgwLCBkYWM3NjY4M2MwY2U5ZTEwMDhmZTE0OTBkYzE0NzliZgorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMjA3MDA0LCBlOTE0YjU0NTQyMTBmYzZiNGMzOWQyMmI3ZGFmMTZkYQorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgMjA2OTY4LCAwYTk1NjZjODc5YTY4OTc1MzZlYzA5NDEwMGYzMmZiZgorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMjA3MzY4LCBhNjQ0YzJiM2I4Yzg5ZWMwMWIyYjUxNTc2YTViMDliNQorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMjA4NjI4LCAyY2U2Y2E2OWQ1ZjZlMjk2NDFmNWE5MDdmZmFjOWJiMAorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMjA4OTc2LCBkM2JlN2ZlMzg5ZTgwZGY1MTdlYWZkMGM4NjE5NDdhMgorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMjA5MzE2LCBjNTE0OGUwMDczY2ViZDUwZDhmNjE5ZDQ4NzU4NzRkZAorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMjA4MzU2LCA1NGUwMDgyY2RjMWFhN2ZjYmI4YzY1NWU5NGZiZDQxMAorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgMjA2NjIwLCA3N2VjNmQzNzE0YTBkY2JmMGNkZDUzNDlkZjA5NTFmYworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMjA1OTMyLCA3ODU3YWNkMmFmZDMxNjkxMjZhNTQyOGRkZWY5N2FiZAorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMjA2NTI0LCBjOTAzZWM2NzcxMDZlYzFmN2Y1ODNiYjgxM2ExMTIwYQorMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgMjA2NDQ0LCBlYTU0OWRhNjJhNDYwYjUwODExY2IzZjE4MmZlNWMxOQorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMjA1NDYwLCA4MWQ4MjM2MzM0OTFiMTNhMzFkZmRiYzVmMzNkNzlmNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY19yZ2JhX21lZGlhbiBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfcmdiYV9tZWRpYW4KaW5kZXggMTU4OGI2ZC4uYTIxMThjMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY19yZ2JhX21lZGlhbgorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYmFfbWVkaWFuCkBAIC0xLDU1ICsxLDYwIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQorI2V4dHJhZGF0YSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCA5ODgxZjQ0MjNmMGEzYjVkYTI1YTA1NzRkMzQ1MWVlZgogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdXR2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTk1MDkyLCBkMzJkNWEzZGM4OGI5YWVmMDgyNmI1NjVlZTVkZmJjNgotMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTk1MDM2LCBlYTEzZTM1MjJkMWYzYWVkZGQ0NzExN2M5MWVjY2M1NQotMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTk2MDQwLCAyMWMyYzlhYmU3OTFiZWQyYTliZjAyZTUzOWNhYTc4NwotMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTk1MjUyLCA1OGQ1ZTA4MTEyN2YyNDZmNzExZjViOGVlMWM3NjBmZgotMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTk0ODUyLCA4Y2ViMzgyNGVjNjI4YTczZTFjMDhlNDk4ZjM2OTQ4NAotMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMTk1MzU2LCAzMGVhNjQwOTRmMjlkNjcwZTJmZjhmNDNiNTA1NzhkNgotMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMTk1MTgwLCAwOGI0MDZiOWYzMDYzYTU0NjgxZDcxOTVmYjUzZTk1MwotMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMTk0ODA4LCBlMjhjNDNlZjNhZWYxNzRmMGY5YjlkN2E3MDJjYTc0NwotMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMTk1MDM2LCA2NjI0N2I0MGIwZGVmOTM3M2JmNmZkZGE5ZWY4MzJmNwotMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMTk1NDcyLCBlZmE4YTYyNGQ2YjBmYTY5ZTBjMWM3NDZiYWVkMGIzMwotMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMTk1MDUyLCBmZGZjNzg0YWVkNjYxY2I3NmJjNWIzZWYxODYzYmQ4OQotMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMTk1MDY4LCAwNDBhZDUwM2QxOGEzNmQ0ZjFjZGFlYzY0OTk4MTM4YQotMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMTk0MjI4LCAxY2QxNjg0MjdkMDIyODI1YTgwMWIyMzJjYjIzY2ExMgotMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMTk1MDY4LCBlNDA4MmY4MzNkM2JmNzVhZjI0ZTFiYjVmMDZkOTRmZQotMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMTk1MzQ0LCAxOTYzODM0MGU5M2Q0ZjFmNzA5OWRlZGEzNGQyOGUzZgotMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMTk1NjY0LCAwMDFhODAxYzVjNWNlYjE5NzU3NmMwZjdiNzkzODUwZAotMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMTk0ODc2LCA5NTUwYjNjZjYxMzM5OTdiZjc1NTc0ODNmMzQ2YjAzNgotMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMTk1MTY0LCBlYjcyMjBjYWY0OGFiMjYwNWVjOTcxY2ExMjk3YTdhZQotMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMTk0NDQ0LCBhMmFjODEyZTYzMDdhOTJlY2QwOWQ0MjgyMzY3YTlkNAotMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMTk0MzU2LCBlZTRkMjUwMjI2YWIyYTM0Y2VmMGUzZWQ4OTIwZjdiMgotMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMTkzNjk2LCA0YmZmMGZjODcxOTY5ZDE3YWQxZjczOTFiYmQ1NDNiMgotMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMTk0MDA0LCAwODBlMmE5MWZlNzY4ZmQxNzI1YTg0MDBiYzZhMTMzMQotMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMTk0MDkyLCA1YjlkNjUyNzU2OTUzNzJlMWY2YjljMGEyM2YxZmZhMAotMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMTk1MDg4LCBhNDA2MGJmNTk1Yzg3NzQ3NmE1OTUyYjMzNTUyNmQ1NwotMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMTk1MTkyLCAxN2I1NTczNTgzNGYyOTFlY2FlMzk5YzMxNzAwN2QyYwotMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMTk0OTA4LCBmYzc4ZDc5N2JkNTc0MGY0ZmVjOGYzZDM0YmMyZmYxYgotMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMTk0NzY0LCBkMjI5YTllNGQxYzc4MjUwNGNhZDYxN2QyYjAwODAyYgotMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMTk0MzU2LCBmOTg3YTU4N2NiOWZkY2QwNGUzNmQ5MzgyYzRkOTEzOQotMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMTkzNTY0LCBiZGZhNTEyZTNhMGE0NmFhYmYyODljMjJkYmFlZTBiOQotMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMTkzNTU2LCAzNDE3MDhmMzE4MWJhNGIzNzExNGQ2ZGJmZmM2NWU2MwotMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgMTkzOTU2LCBmOTc2OTM0NjlhZTZmNDljMzk5NTc5NGQwMDQzMGM0YQotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMTk0Nzc2LCA5NzBjOTZmZTBmNzMzNjgzY2U0ZjJiNDc4YWYyMWI4OAotMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMTk0NjQ0LCA4YTk2MjQ4ZTI4MjEwNDBlNGQwZDZkMzJkMGE0ZjFhOQotMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgMTk0OTQwLCA3MGE0NjJkOGRlMGRhOGI1NzE4YmY4ZmI4MDM0ZmEzOAotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMTk0NzMyLCAyZmIzNDM3YWJiYzBhODViNmM0NmUxYjFlZGQ5MjJjOQotMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMTk0NzcyLCAwYTBmNTRlMjY2NDM4ZTFhODQwMjQ3ZTFhZjJmYjFmMQotMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMTk0NzgwLCBjNGQ1MTZhNDU5NTIzYjFjMTUwZDhhYWQxZDVlM2E2ZAotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMTk0OTA4LCBlMDlkYjY3MTk2NTEzNDAwZGQ1NTM5N2E1MjViNzNjMgotMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMTk0MTQ4LCBmM2NjOWZjODU5N2Y4ODA2ZmJjMmEwYzEzYWY1YjliYQotMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgMTk0MTY4LCAyYmI4MmY4MGMyMzk5ODRmZTdjMTA5MWFiNmFmYjMzMgotMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMTkzNjA0LCA2ZmQxMjgyNDBjNTQwYTA2NTVlOGYyN2ZmNmE1MGVlOQotMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMTk0MjU2LCA5YjQ5Mjc1MTU0YjQ1MzhhYmRlYmJkZGZmZTAxMDEwNQotMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMTkzOTEyLCA2YWNmZjc5OGY5Y2NhOTEzNDdlMzZlZTFlYTg2MTgzYwotMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMTk0MTM2LCBmMjRjYTc4ZDliODEzYWI4YmZjNzIwYmFkMjY4MmU3YgotMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMTkzNjUyLCBkN2Q5MjdmYWY1OWEzYjgyYmQxY2NlNDE4YzEzYzQzMAotMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgMTkyOTYwLCA4YTgxM2ZjZTFkMjFkZDRhZDQ3NGQwNmQ4OTBhM2RlNQotMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMTkyNjM2LCA2YmJlMTU3ZWM0Zjc5OWNmZDQ3YTY5YzVhNWNiYjBmYwotMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTkyNTgwLCAxYzE3YmYwOGEzOTI4NTMzYTAwMzZiZGExZmIwOGVjYgotMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgMTkyMzU2LCBhNWIzNGFjNDhjODJlNzlmZjgyN2Y3MmRkZGJmYzZiMAotMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMTkxOTEyLCBhZmNlYjQ2N2RkZmZkOTY5N2M5NTY2YzQzZjI1NzZmOQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjA3MTY0LCA5MWJkMGEwNGM1MjJlNGE0NDlhMmIyNzI5Y2NlYjI3MworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjA3MTg4LCA4YTlhMjNjMzI1MDNmZTMwZGY0N2E1OThkMzE5NTkxZQorMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjA3OTgwLCBmYWMwMjI4OWQ4NjBjNDg1YjA5MDUzMTE5YTI1OTc3MgorMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMjA2OTQ0LCBiYzAyNTFmMGEzYWQ1ODgxY2I0MDJkMWQwNzFjYmZlOAorMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMjA2MjAwLCBlM2I4MTFlYTU4Yjc5MGIxNzFiNzVjOWFmNDZhMzYzNworMCwgICAgICAgICAgNSwgICAgICAgICAgNSwgICAgICAgIDEsICAgMjA3MTAwLCAwNzZjYTU0MjE5MDk5NmQ0ZmY0MzgwYmZmZjFiODcwNworMCwgICAgICAgICAgNiwgICAgICAgICAgNiwgICAgICAgIDEsICAgMjA3MTcyLCA4N2Q4NTQwMDEyZGY1YzYyZmZjZWM5N2FjNDI1NWU0NAorMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMjA2NDQ0LCA4YTRhNzg3ZGQ3M2I5MzY1M2FiNjk2MjJiM2ZjYWE2ZAorMCwgICAgICAgICAgOCwgICAgICAgICAgOCwgICAgICAgIDEsICAgMjA2ODg0LCBlNGNlNTkxNmVjZWU2MjM4N2E0NDI1N2Y5ZjdlMzA5ZgorMCwgICAgICAgICAgOSwgICAgICAgICAgOSwgICAgICAgIDEsICAgMjA3NjMyLCA2N2YzNDNlMjRmNDdiMWVkZGI0N2U1OTgzMTc1MmFhYgorMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMjA2OTE2LCA2YTFkMDAzYTJiM2MxMGJkODdkNWI3MWEwZWNiNmZhZQorMCwgICAgICAgICAxMSwgICAgICAgICAxMSwgICAgICAgIDEsICAgMjA2NTcyLCA4OTM5YWRkZTQ2ZTkyYmYwMmJlMzAxNTkwZGU1NzhhZQorMCwgICAgICAgICAxMiwgICAgICAgICAxMiwgICAgICAgIDEsICAgMjA1ODMyLCBhYzM2Y2UwY2MyMDFiODlhYTg1YWVhOWY4Zjg1YjY1NAorMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMjA2NzEyLCAxZDg1ZmFhMjJlZjE4ZTA2MDM1NGQyZTI5MzFmNzhmMworMCwgICAgICAgICAxNCwgICAgICAgICAxNCwgICAgICAgIDEsICAgMjA3NDk2LCAyNDU5Yjg2ODA1MDczMGJhM2MzMTUyNDQzZjExOWU1OQorMCwgICAgICAgICAxNSwgICAgICAgICAxNSwgICAgICAgIDEsICAgMjA3Nzg4LCAyNzYxNmQ3NDk0ZTU3MDgxNDM3OGEzNWZkNzJiM2Q0YQorMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMjA2OTg4LCA0ZjBkYWRkYmE3NDRhZTBlYmVlYThiNTVlYmM2Nzc4YgorMCwgICAgICAgICAxNywgICAgICAgICAxNywgICAgICAgIDEsICAgMjA3MDU2LCBlMjM0MDY2NzA2NGEyNWE3NWY2N2UyNjFmZTk2YmFmNworMCwgICAgICAgICAxOCwgICAgICAgICAxOCwgICAgICAgIDEsICAgMjA2NDQwLCBkNDg3Nzk1YzVmNGEzZjMzOGNlYmZkMzZiMjY0YTc2MAorMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMjA2MzQ0LCAwY2QxYTRjNDU5NDAyZTgyZDdjODlhMTMxZDZmNzVmZQorMCwgICAgICAgICAyMCwgICAgICAgICAyMCwgICAgICAgIDEsICAgMjA1NDA0LCA1MmVhNjI5OTJlZmFjYzRiZjQyMzQ1MDc3NTJjZDRlZAorMCwgICAgICAgICAyMSwgICAgICAgICAyMSwgICAgICAgIDEsICAgMjA1Nzc2LCA3NzEyZTgyYjk0ZmQxNTVjMWUwZGZlYzFkYjE5YTI5OAorMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMjA1NjAwLCBlYzA4MWViYjRlMTJmMzVhYTQ3ZTY3M2M1Y2Q4Yzg1OAorMCwgICAgICAgICAyMywgICAgICAgICAyMywgICAgICAgIDEsICAgMjA3MDQwLCA2MzdkN2IyMGFiMTY5ZGI0NjcxZDc2YWJjOTg2YzIwZAorMCwgICAgICAgICAyNCwgICAgICAgICAyNCwgICAgICAgIDEsICAgMjA3NDg0LCBhNzc2ZGUxMjY5YWQ1NjRlMWRjMjFlYWQ5NGRjYzcxZQorMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMjA2NzkyLCA2YWFhNjgzODhmYjEyYjJlNzBlYjU0MjgxOTkwMmE5NworMCwgICAgICAgICAyNiwgICAgICAgICAyNiwgICAgICAgIDEsICAgMjA2Mzg0LCBiNGM0ZDA3OWQ3Yzc1YjAzZTJkMzkxNWE4Njc2YTY0ZAorMCwgICAgICAgICAyNywgICAgICAgICAyNywgICAgICAgIDEsICAgMjA2Mjk2LCA1MjE2NDdhMDA1MzVmNjNjMjQxYjU0Njk5YjVkODAzYQorMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMjA0OTk2LCA4OTJmMGMyMTZkMDRkZmExMjA1NzZjMGNiYmJkYjBhMgorMCwgICAgICAgICAyOSwgICAgICAgICAyOSwgICAgICAgIDEsICAgMjA1Mzk2LCBmYTFiMjMwMWM3NjViYjFjYTFjODU4Mjg5MTg0NjJiOQorMCwgICAgICAgICAzMCwgICAgICAgICAzMCwgICAgICAgIDEsICAgMjA1ODEyLCBlNDBkOGRhNjBhMDdmMTliNDNhYjI3YTEzOTI4Yjg3ZAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMjA2NjA0LCAyYTA2YjExNWEzYTQwMGE3M2FkMDZiNjljOTBhMDc2OAorMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgIDEsICAgMjA2NTY4LCBlNmQzNjdjYzNkN2JkMTdhNmM0NzBmZTg2NTkxZTU2ZAorMCwgICAgICAgICAzMywgICAgICAgICAzMywgICAgICAgIDEsICAgMjA2OTA4LCA4ZDUzZmU1N2IxMDQzNTYyYzUwYTJmZDYzZmEyZWJmYQorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMjA2Mzg4LCAzYTU1NDRhMGE4MTRkYmJhMTcxZDAzODRjOTFlYTU2NgorMCwgICAgICAgICAzNSwgICAgICAgICAzNSwgICAgICAgIDEsICAgMjA2NzAwLCBiZmU0MzEyNGJjYmJhZWY5ODg0ODkzYzMyMzk2ZjMxNgorMCwgICAgICAgICAzNiwgICAgICAgICAzNiwgICAgICAgIDEsICAgMjA2NTE2LCBhOTNlMzAzZjMwYTkyNjljNmQ2YjU5ODgyYjY2ODYzMAorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMjA2Nzc2LCAzMDQ0ZDljOTg1NTVkMzQxNWZjNzViMDg1ZjhhYWIwYQorMCwgICAgICAgICAzOCwgICAgICAgICAzOCwgICAgICAgIDEsICAgMjA1OTQwLCA4NzA0MDNmNjMyNmRlNzM3NTBhNTc2OTJhMjg4YmMyZAorMCwgICAgICAgICAzOSwgICAgICAgICAzOSwgICAgICAgIDEsICAgMjA1NjEyLCBmOTdiOTRkYTdiNTY1ZjY3Y2I0NzZjNzNjMjE5NmJiMQorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMjA1MTIwLCA3ODM0MWUxNjkxNThmOTc3OTFlYzlhODhlZTkzNjA0OAorMCwgICAgICAgICA0MSwgICAgICAgICA0MSwgICAgICAgIDEsICAgMjA2MTMyLCA4M2QzMWUwYjQwZjI4NTBiMDc2N2ZiZDE2MmI0YWFiZAorMCwgICAgICAgICA0MiwgICAgICAgICA0MiwgICAgICAgIDEsICAgMjA1OTg0LCBiYTAyOTU5NWI1NjA4N2M1NWYzMjRhNTRjYjVlMjBhNgorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMjA1OTY0LCBkMDY3OTMyYjUwN2FjZGE5MDIwODM3ZWQyNzFlYjA5ZQorMCwgICAgICAgICA0NCwgICAgICAgICA0NCwgICAgICAgIDEsICAgMjA1Mzc2LCA2MmI0NWY0OTQ5NDA1ODc1Zjk0N2NkNmQ1MTMzYjc2ZAorMCwgICAgICAgICA0NSwgICAgICAgICA0NSwgICAgICAgIDEsICAgMjA0NzU2LCBlYzQ1YmNlZjA2MDFmYWZmOTdkODlmODliZmVkZTRmMworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMjA0NzA0LCA1OWM5ZDMwOWFhMzgxZTM5ZjNiMjM2ZDMzMmFlNTE2YQorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMjA0NjUyLCBjNDRmOGZiYTk2ZGZiMzA1Y2RjNzk3ZGRmYTAzMzg5OQorMCwgICAgICAgICA0OCwgICAgICAgICA0OCwgICAgICAgIDEsICAgMjA0NDYwLCBkMDExNmQwNjEyOGJhYmNmOGVjNTUyMDVjZTg5ZDQ2YQorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMjAzNjI0LCBiYmQzNTIzYWMyNjNjNjIyNTQxYWE2NzgyNTYwMWZkMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY19yZ2JhX25vbmUgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYmFfbm9uZQppbmRleCBiOGUwYjQxLi5mMzg4YzkxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYmFfbm9uZQorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3JnYmFfbm9uZQpAQCAtMSw1NSArMSw2MCBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKKyNleHRyYWRhdGEgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgOTg4MWY0NDIzZjBhM2I1ZGEyNWEwNTc0ZDM0NTFlZWYKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHV0dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDMwMTI4NCwgNTVlODRjNmUxZjQxZTQ4ZjQ3ZGNlZmI2M2UzYzFlZmQKLTAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwMTI5NiwgMTJkYWIyM2RmZDJjMmQ1YjQ4YmVkMjI5MmI4NzY2ODgKLTAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDMwMTA3MiwgY2MyZTI4ODk0MDNkY2M1ZDhlMzY4NjhmMDc5MThiOWQKLTAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDMwMTEzNiwgOTgxM2Q2MGU2MTNhM2ExNGU2MzlmOWFmMGE1YjFmZTcKLTAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDMwMTE0MCwgNTg1NTRiYjY3NDllOGJiZDk0NzYzMzVhYzFjYjAwNzYKLTAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDMwMTE2NCwgMzdhMjQ5Mjg2MDE5NzYxYTRhM2U0OThlOTc3ZjlkYTEKLTAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDMwMTE2OCwgZjNhYTExYjQxOWVjNmY2ODNhZDkwNmU3ZjdhMzYzNDIKLTAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDMwMTI3MiwgZjQ4OTY1NDY0MGYwZTQyMjI1ODE1ZWE5Yzk2ODEyMDEKLTAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDMwMTMwOCwgZjEwZWIzYzFkMDMyNGI1OWJkMjVjOGJjNjU1NmFjYTAKLTAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDMwMTI2OCwgMjE2M2FhOTkyYWZlZjUyMTBkNjc3OTUzZDgxYWRiMTcKLTAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDMwMTE2OCwgNjg0ZDE5ZDE0MjEyNjE1ZWJmZmExNzQ4YTljNTUyZWQKLTAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDMwMTEzNiwgYTVjNDdjMzBkMTJkYmM2NzljZTkzMmE1OTg4YjMyZTUKLTAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDMwMTI3MiwgM2E1MWRjMzdkN2U1ZWNiNGE4ZGI5NDhlYWRlMmUwZmEKLTAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDMwMTE4OCwgZjlmOWVkNDFjMjMzZTc5MWU2Y2Q3NWEzNGU1MmVkZjgKLTAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDMwMTA5NiwgNjNiYmZiZWU2ZjBmYTY3NDVlMTQzZGZhZTQwY2U3ZmYKLTAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDMwMTEwOCwgMWZiMzM0MGRkMTgwNGQyN2ZiNDBhZWE2YjA3M2U5Y2UKLTAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDMwMTI0OCwgNDc2ZDI3ZjI5ZGE4ZTc0ZGI2OTZmZjM4ZTgxNzQzZmMKLTAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDMwMTMwMCwgODRhN2Y1ODA0YTg1NmI3ZWY2NDA4MzgzMjA2MzQ1NjgKLTAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDMwMTQyNCwgZjM0MDA2ZmI1NTc0NWFhYzI5ZTI2NWUwMzYyNDM0YmYKLTAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDMwMTQ1NiwgZDkyMDdlNTRlMjYxZDE4NGRkZDAyZjM3MDZlNjMxMDMKLTAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDMwMTQwOCwgODliNWE2ODA0YmFkODUwMjVhNmEzZDIzZGM1Mzk0MjYKLTAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDMwMTQwNCwgNTk4N2QyMmQ2ZTNiZjE4Y2QyZWJlYTk4YTE5MTVmNTcKLTAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDMwMTM0MCwgNDNmZjEzYmIyMzdhNzg5OWVjYjA0ZmE3ZDI3ZTk0YWIKLTAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDMwMTI4OCwgMDFiM2UxNDhlZDZiOGEwZDA1ZWU2MjhmYjIxZmE0YTUKLTAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDMwMTM2MCwgYWE3NzA0MDA3ZTNjNDM3Y2ZjYWQ0ZmI4M2E2OTU5NGEKLTAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDMwMTM3NiwgNGRlYTk4M2YwYjRhMDEyYmE2ODc1YWE4NTdkMDJlOTEKLTAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDMwMTMxMiwgZTI2M2YxY2IwZmIxOWI1MDc1MWU5YTIxNGE0YzlkODEKLTAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDMwMTQ2MCwgODVhZDQ0MTY2NGM5OWM1OTFkNmRjNDI3OTEwZmFhMTkKLTAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDMwMTM4MCwgODZmZmU4MjczMDExNzYzZDgwMGRiZjZjODk5NDJhNzAKLTAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDMwMTQ0OCwgNTAwODYyZWE2MmUxOTgyMzI1ZDY1M2Q0ODUzZGNiY2QKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDMwMTQ1MiwgOTFjNDM5MGE4MDVlMDJkMTkyNGJkNzU5NDZiYzBiNjMKLTAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDMwMTM4OCwgNGViMzA0MGQ2NTk0ODM1NWM0NTA2ZWU4ZThlMDQxY2EKLTAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDMwMTM0OCwgZWNlODE0YTc2NDQ3MGYxZDgwOTczNzQzYTdhZGFhNGIKLTAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDMwMTMyNCwgMmFlMGI5YWY1MzgwYzhmOTgwODdiOTBjNjQ2YWY4MTMKLTAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDMwMTIyNCwgZDZhM2JhMGI1NDM1MzRiZDdkZTlkZDgyMTA3YzQ2OGMKLTAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDMwMTM4NCwgNGY0OTE5YzFiMjUwMmM2ZTAzZGRhYTgzZjRjMDNmMTUKLTAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDMwMTQ2MCwgYjQ1MTg5YmM4OWU2NTgzZjQ0MjZjMzkwNjIyZmExZmMKLTAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDMwMTQ1NiwgZGIwYzVlMmJjNzA1YzgyNWU1NTRjMmRhNTQzMTQ3NDYKLTAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDMwMTUyMCwgOGQwMTAzN2IyZGNiYmEzOWQ0NzQ2NzU4ZmQ1MzMyM2MKLTAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDMwMTUyNCwgMGE3OGFmNDRiZjQ5NTIwYWU4ODMwMDYwZTYwMTE4OTgKLTAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDMwMTUzMiwgZGE5MDMyYWM5N2I3NmVjMTBmOTRkNzRlZTg3OGNmNDEKLTAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDMwMTQ5NiwgOWEyMmIyYTlhM2FkODk3NDA2ZmM3YzMxMzdkNDFhM2IKLTAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDMwMTU3MiwgYTE0YTgwYWI0MTZjZjRhOWExZWMyNGJmYzcyNjAyYTEKLTAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDMwMTUzMiwgNzFlYTVhMjQwNTQwYTJlMDhjZWQ4YWQ3OGMxYTA2NzYKLTAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDMwMTUxNiwgZmZmZTEwMWQwMzZlZDVhZmVlOWI2Zjg2MjY3YzJhMGMKLTAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDMwMTU2OCwgNThlYTNhNmVkYWVlNzYwZDk4ZWFkYjA3MmZiMzA3OTYKLTAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDMwMTY2MCwgOTg4NmU3N2Y1ZGYzNWQ4YmQxNjRkNTk4ZDBmODc1MTQKLTAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDMwMTY2OCwgMWYzMjZlYjc4OTk3NGZjODUzZTFkYjU3MTE1ZWY1OGIKLTAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDMwMTY4NCwgMDhiMmViNjIwYjlhN2JlMWJkZWQ0NzQ0Y2Q0Yzg4ZGIKLTAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDMwMTY2OCwgYmZjY2UxY2U1ZjdjMzAyMzBhYWU5YTJkNjdmYzhhNzAKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDMwNDAyOCwgZTE2ODdmNjNiZDEzMWFjZTM4NjZiNjE4ODFlOGU5YTEKKzAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNDAyNCwgOTMwNjdmZGFkMTQ3MGIxYzJmMmZkNGFlNjAzYTNhZmUKKzAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDMwMzkzMiwgMmZlZjA4Y2U1NzBmNTgxMzczYmQ0OGIzYTQ3NzNhY2IKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDMwMzkzMiwgODYyM2Q0NjM1MjM5ZGVhYzE2ZDU2MDg1ZWRiOGFlYzEKKzAsICAgICAgICAgIDQsICAgICAgICAgIDQsICAgICAgICAxLCAgIDMwMzk4NCwgZWYwYTFiZTc2ZjdjODU0ZTVmMjcyNGQ3YTY3MDdmNTQKKzAsICAgICAgICAgIDUsICAgICAgICAgIDUsICAgICAgICAxLCAgIDMwMzkzMiwgMGU1NzAwOWY2ZTkzYzJlNWNlODBkNjEwOWQ5YTY2ZjMKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDMwMzkzNiwgZGI5ODhkOGQ2ZTllZTAzODNjZmM2OWEyMDFkZTYyZTIKKzAsICAgICAgICAgIDcsICAgICAgICAgIDcsICAgICAgICAxLCAgIDMwNDAyNCwgOTYzZTg2YzA4MWZhZmVkMmY3NTdjNGFhZmM5MTg2ZGYKKzAsICAgICAgICAgIDgsICAgICAgICAgIDgsICAgICAgICAxLCAgIDMwNDAzMiwgZTg2N2MwNjg3MDZiZmYzNGE1NjFhNGIyYzQ2MjJmZDMKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDMwMzk2MCwgMGRkNmQxY2JlNmE5ZmIwN2UzZjNjYjRhMTJjMjgyMWEKKzAsICAgICAgICAgMTAsICAgICAgICAgMTAsICAgICAgICAxLCAgIDMwMzk0NCwgNDI0NjEyY2U4ODUwYjM3ODE3MWVlOGJmY2E1ZDkxY2UKKzAsICAgICAgICAgMTEsICAgICAgICAgMTEsICAgICAgICAxLCAgIDMwMzk1NiwgZjI2ZDUwNjU4MThmOThiYmY5N2FhZTU2ZmUwN2IwNTcKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDMwMzk4MCwgZGZkMWE2MWI1YTcxNzgwNWEwNmYxOWVlODk5YzM5MTcKKzAsICAgICAgICAgMTMsICAgICAgICAgMTMsICAgICAgICAxLCAgIDMwMzkzNiwgMjIyM2Y5OGFjNTgwNzhjNDk0ODk4MTExNzFjNzEzZTEKKzAsICAgICAgICAgMTQsICAgICAgICAgMTQsICAgICAgICAxLCAgIDMwMzgwOCwgNmE2M2JkN2NkNGNhZmU1ZTY0ZGM4ZGM0NmY5ZjM3NjAKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDMwMzg2NCwgYTM1NTY5OWM5ODk3OTUzNzlkMWVmMjA4OWM5OGU2MTkKKzAsICAgICAgICAgMTYsICAgICAgICAgMTYsICAgICAgICAxLCAgIDMwNDAwOCwgMDdhMGM0MTA4ODg0NmVkNzdmZWRjNTY1Y2ZlYWViYTcKKzAsICAgICAgICAgMTcsICAgICAgICAgMTcsICAgICAgICAxLCAgIDMwNDAwMCwgZGJiMzdhMWFmMGJiNTM0MTEyYWFjOTI2OWI3ZDdjMmMKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDMwNDA0OCwgMzEyOTk5N2M5YmE4NGEwYzkxZmY5ZDFjNDhkMTJkN2UKKzAsICAgICAgICAgMTksICAgICAgICAgMTksICAgICAgICAxLCAgIDMwNDA2OCwgNjIwYjRjOTY0ZGFjYTEwNWNkMWI2YmY4ZDU1ZTg2YWUKKzAsICAgICAgICAgMjAsICAgICAgICAgMjAsICAgICAgICAxLCAgIDMwNDA2OCwgYmFmYWY1MzUzMGY3NmQ1MjVlYWZiNzVhMzg2NmI1ZTcKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDMwNDA5MiwgNjc4MTM4YjkzZjA3ZWY4ZjMwYWQzNzM0OTlhOWNhYTMKKzAsICAgICAgICAgMjIsICAgICAgICAgMjIsICAgICAgICAxLCAgIDMwNDA2MCwgNGJmODE3NGZmOWVlNjJjMTNiZGUyOWFkNWJiYTNmYzkKKzAsICAgICAgICAgMjMsICAgICAgICAgMjMsICAgICAgICAxLCAgIDMwMzk3NiwgZTZlOTI2MDU3ZjQ5ZTY5ZTJlYThlNjc5ODcxZTQ0OWEKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDMwNDA0MCwgZjgxYmE0ZDM2ZGY3ZTg5NjdhMTZlN2RlNWM3YTAyM2IKKzAsICAgICAgICAgMjUsICAgICAgICAgMjUsICAgICAgICAxLCAgIDMwNDA4NCwgYTVhNjNhMjJlNmJjM2E1NGJmYmQ2MDg1MmNhOWRhNjAKKzAsICAgICAgICAgMjYsICAgICAgICAgMjYsICAgICAgICAxLCAgIDMwNDA1NiwgZGY5YmQ1MGI5ZGQ3NDM3YWZiMzY3MWM5OWUyZTE3NDYKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDMwNDA3NiwgNzg1YTJhN2RlNDRlODNmMTExMWU2NjE2NWIzZDA3NjUKKzAsICAgICAgICAgMjgsICAgICAgICAgMjgsICAgICAgICAxLCAgIDMwNDEzMiwgYWIwMWJhY2Q3YWVlOTFhYjgwYjMwYTQ4ZjU0ZWM0ZDcKKzAsICAgICAgICAgMjksICAgICAgICAgMjksICAgICAgICAxLCAgIDMwNDE2MCwgNDg5MzI5NjE0MGU3ZWU2ZjJkMTk0YmMyNzlmOTI4ZjMKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDMwNDEzNiwgNjA0NmM3NTE2YTVlOGRiMmY0ZGQzYjEyODZhZDQ2YzAKKzAsICAgICAgICAgMzEsICAgICAgICAgMzEsICAgICAgICAxLCAgIDMwNDA4OCwgZTZkYmMxZWM4NmNiNjc4YmFiNmExY2EwZTkzODg4ZDAKKzAsICAgICAgICAgMzIsICAgICAgICAgMzIsICAgICAgICAxLCAgIDMwMzk4MCwgNjZkYjk4Njc0YzEwN2FmMjk3YTNkZTAxYzA0N2ViY2UKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDMwMzk2NCwgZTJjZTBhMmVlNWJhOGRlNTA5NjA4NzNhODQwNWMwMDEKKzAsICAgICAgICAgMzQsICAgICAgICAgMzQsICAgICAgICAxLCAgIDMwMzkwMCwgN2FlOTZhMzllNjZlMGFiZTYzZTI5OGY0NTQ3N2MwZWMKKzAsICAgICAgICAgMzUsICAgICAgICAgMzUsICAgICAgICAxLCAgIDMwNDA0MCwgZDVmYzhmNzgwOTQ3MGJjNDA5MzUyODVkNGVkNjlhODAKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDMwNDA4OCwgZWZhZTA5NjZhN2U0MjFjMzEwNzAxNmRmODYyYjA0MjkKKzAsICAgICAgICAgMzcsICAgICAgICAgMzcsICAgICAgICAxLCAgIDMwNDEyMCwgYzZhM2JmODk5MWJmMmI1NTlmMjdkNWVhOWFlNzZkMDgKKzAsICAgICAgICAgMzgsICAgICAgICAgMzgsICAgICAgICAxLCAgIDMwNDE0NCwgNTg4YWM4OWM0MDNjNWQzY2E5Mjg5ZmJkMzM5ZmRiNzQKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDMwNDEzNiwgYTM4MjQ1Mzc0ODRkZDJmYzI1ZGRlOWVjMjk3NDA2OGMKKzAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAxLCAgIDMwNDE3MiwgZTFhMDI0YWE5ZmFiYTBlZTBjYjk4ZTQxY2VmMjU0YzkKKzAsICAgICAgICAgNDEsICAgICAgICAgNDEsICAgICAgICAxLCAgIDMwNDExNiwgYzI2YzRjMDUzZDUzYjcwYzk3Y2JmOTg5Y2I1MWExNWQKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDMwNDE0MCwgNGQxM2VlMmEzYjMyYmEzZjA4MGZmZmE3Y2EyZGI2ZTYKKzAsICAgICAgICAgNDMsICAgICAgICAgNDMsICAgICAgICAxLCAgIDMwNDExNiwgZmIwMmI1N2Y5YTlmYWZhN2JjNmQyYTM1YTY4NTQ4ZmMKKzAsICAgICAgICAgNDQsICAgICAgICAgNDQsICAgICAgICAxLCAgIDMwNDA4OCwgNmRhYTQ5NGMxZWQxMWM5ZWE4ZGE2YzgzZWI0NzNjZTcKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDMwNDE5NiwgODg4Njk1M2ZmMDI2ZWZlZjI4ZjRhZjEyY2U1MjM5YjYKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDMwNDIwMCwgNTFmZjJjODU1MmI4YjA0NGExYTE4MzMzMGExODhkNjIKKzAsICAgICAgICAgNDcsICAgICAgICAgNDcsICAgICAgICAxLCAgIDMwNDIwOCwgNzJmY2QzZGJmNDUyODRiYjQzNGFkMzY2MGY4YTFkZGYKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDMwNDIwNCwgMWQ1ZTIxNzA5NjNkNzBhY2VhMmFkMDFlMTQ4NmQ0OTAKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDMwNDE4NCwgNmVlYzIzYzNkNDQwMmY3YTBhYjRkZTE2ZmRlODY0NjIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDIwX2xlZnQgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQyMF9sZWZ0CmluZGV4IGFlNzllZmYuLjVhNWYwZWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDIwX2xlZnQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjBfbGVmdApAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQorI2V4dHJhZGF0YSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAzMmZlOWY5NWU1N2I3ODc3M2EwZmU1NGM0NzA1NWE2MAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdXR2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU5Nzk2LCBkZWRkOTYyM2VhZDI1N2I5OGUwNzljNmQwNDc5ZTVhOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYwMDEyLCA3M2FlNDAzNTkwZmZjNTk2MmZmODZiOGRjYjQ0Y2E1MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjBfbWVkaWFuIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjBfbWVkaWFuCmluZGV4IDIxZTE1YjUuLmMyMzZjNGMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDIwX21lZGlhbgorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQyMF9tZWRpYW4KQEAgLTEsNyArMSwxMiBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKKyNleHRyYWRhdGEgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMzJmZTlmOTVlNTdiNzg3NzNhMGZlNTRjNDcwNTVhNjAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHV0dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMC8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA2Mjg3NiwgNWUyYTUyNzZlMTBiODY1MTFmYjgxMDE3MzNiYzQ3OTUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA2MjgzMiwgZmIxZTBhN2IyYmRiY2JhZGE5ODkyZTNkYjdiZTc4MjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDIwX25vbmUgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQyMF9ub25lCmluZGV4IDdmOWI1OGQuLmYxNjA2YjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDIwX25vbmUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjBfbm9uZQpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQorI2V4dHJhZGF0YSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCAzMmZlOWY5NWU1N2I3ODc3M2EwZmU1NGM0NzA1NWE2MAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdXR2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTQ0NTA4LCA4MDhhNWJmN2Y4NjQ3MDk1ZWQ2MjljMThiY2Q3OGM4ZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTQ0NDk2LCA4OGQ5MWI1YWViZWNiOGUzNTUzZGM1ZDI1YzExZjY2MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjJfbGVmdCBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDIyX2xlZnQKaW5kZXggOWRhNDdhNC4uMzU4MTk3NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjJfbGVmdAorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQyMl9sZWZ0CkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CisjZXh0cmFkYXRhIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDdkNjEzYTRkYWFhZGYxOTIyOGQ0MmM5OGRlYjI2MDI0CiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiB1dHZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgOTE3ODgsIDJiMjllYWQ2YTA0ZjA4ZTQ5YzI1Y2Q4OWZlMGMwZTQ2CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgOTIxNDAsIDAxMWEzYzkyYTFhNjY1OWIyNmRiN2RlM2M3NGNkYTQxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQyMl9tZWRpYW4gYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQyMl9tZWRpYW4KaW5kZXggODI0MWFhZS4uYjNmNDI5NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjJfbWVkaWFuCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDIyX21lZGlhbgpAQCAtMSw3ICsxLDEyIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQorI2V4dHJhZGF0YSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LCA3ZDYxM2E0ZGFhYWRmMTkyMjhkNDJjOThkZWIyNjAyNAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdXR2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDg5NzMyLCBjOGRiYmJlZDZjNTljZmYwMGM3Y2VhZDM5Y2FkZDdkNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDg5NjUyLCBmMWM5OTVjMmJjYjEzZjlkZTk3ZmQ4YzVkYTI2MzdhMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjJfbm9uZSBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDIyX25vbmUKaW5kZXggYmI5N2UyMS4uNWU3ODViNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0MjJfbm9uZQorKysgYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQyMl9ub25lCkBAIC0xLDcgKzEsMTIgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CisjZXh0cmFkYXRhIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDdkNjEzYTRkYWFhZGYxOTIyOGQ0MmM5OGRlYjI2MDI0CiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiB1dHZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTE4MDAsIDRhNTY1MzQ1OGE0MjA2YmNiYzU4NGQ1ZTZiZWI2MWYyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxOTE4MjAsIDJmNzdjZWQxN2MxODZiNTA3ODY0ZWE0ODIwMTZjOTEzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQ0NF9sZWZ0IGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0NDRfbGVmdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhkOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0NDRfbGVmdApAQCAtMCwwICsxLDYwIEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjZXh0cmFkYXRhIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIGU0NmM3MTIzMTk0YzBlYmYxOWEyM2U1Y2VmZWJhYTYzCisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiB1dHZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQorI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNDQwODAsIDY3OGI0YTNlY2UzNTk3MWMzZTBmMTk5ZmNhYjJiNGExCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNDQxMjAsIGQwYzMyNmVkMDYyYjU2OWEwNGVhODQzNTllNDNjZmRlCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxNDQ5NTYsIDMyZTJkOGExZGMyMmIxZDgzN2U4ZjcwNTA5NzY3ZDdkCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxNDMzMjQsIDZmZmYxNjkxYzQ5OGNjZjFjZjg0ODE0N2RjYzFiNjJjCiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxNDI0NjQsIGRmNGNhYTgzMTZlYzk4N2ZlM2NiYTRhNzZjMDk3NmYwCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxNDQwNjgsIDJjYzkyZjU0ODUwYTQ1ZDc2YjhhOTU5ZDYyYzI4NDA4CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxNDM4NDAsIGM4MGUwZTk5NDVhOTI4NjljYTYzOWI1OTExOGYyNGYzCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxNDM1MzYsIDY4MmEzMTQ4OTExZjk0ZGFhMzMzZTEyYTUwNWQ2ODlmCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxNDM3MzYsIGFmNjkyZDhkNWZlMmUyM2Y5ZTE2YzcxNjRjZWFhZWI1CiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxNDQwNzYsIDEzNDEyNDczNDgzYTcyN2U4Y2NlZDAwZDBkMGZiYjc4CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAxNDQwMTIsIDRmMTQwMmM3ZDI1ZWUyMjIzMjljYzAwN2FhNGRmMzQ1CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxNDM1MjAsIGNjNGI4M2Y0MDdkMDMxY2M0YTE2NmMzMjEwNTgzNTk5CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxNDE2NDAsIGU0YTRkMWI4OGM3YWFiZmNjNDBjNTFmZjgwMzA1ZjcwCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAxNDMwOTYsIGIzZGU5MzY1MmMxOTBiYzg4ZGQ2ZTE3YTI3ZGI0ZWJmCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAxNDQ3MDQsIDQ4Y2U1ZDZhODRiOTY1ZjM4ZjVlNGE0NmU4YmZkMGMzCiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxNDQ1MjAsIDkzNjk3MGFlNzZjMjNlNmE3ODgwZjJjODc1YzFmYjY2CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAxNDM3MDQsIDMyZDlhM2U0MTE4ZTExMzRmM2MwZWFkODQ2ODA1YWFmCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAxNDM2NDgsIDQyMTQyMjRiODQzZmFiNTNhZTQ1OTIxNDI2ZGUxODkyCiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxNDI5MjAsIDIyYjFjM2EwOWYyM2ZhMjYyZDdmZmEyZmI0MzQ3ZjNhCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAxNDI2MDQsIGQyNGMwYmEyNDdiYjM4YmY3YmRmYzM0OGQ3YzZmZGYxCiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAxNDE5MjgsIDgxMTVjZGQwZmI1MWZhOTA4MjFmOTM5MDBjOGNjOTgwCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxNDIwNzIsIGY2ZDg3YWZlMzgzYWE5YTg1Yjg5ODMyZTQyMjg1OWUwCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAxNDIyMDQsIGNlZDc1MjU4YWU3MDAxYThhNDAyOTQyM2Q2MWFiZjA2CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAxNDM0MjAsIDY4NmE1ZGVkNDVjZDcwYWY5ZTY5OWU5OTE5ZGE5Y2M3CiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxNDQ1NTIsIDVhMWUwZjUyMmU3NGExMjg0Yjg2YzVkMGUxODVmMTZkCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAxNDMzMjgsIGY1NGU2Nzg3YWMyZjNhYzBlOTI1Mzg4YjY2Yzk1YjJhCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAxNDI1ODQsIDY1MmRkYTUwNGFjZTljNGUxNTY5MzE5ZWY2Y2QzMzNkCiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxNDIwODQsIDNlYWZiODdmNDc4NDRjZTZkMDU3MmFmMDUxZDJlMjViCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAxNDAxOTYsIDkyYjYwY2YzM2U1YzQzMGYzZTkyYTM5YmI0Mzg5MDk2CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAxNDAxNTIsIDY1OGEzMzFkM2Y1ZWUxYmI1MDM5MmYzODM1YWVkNTZkCiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxNDE0ODQsIGI1NGRiN2Q1OTc4ZDk5ZjcxOTJkZDIwMDg0MzhhYjQxCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAxNDIzNjAsIGVkODRhOWQyMjQxYWRlNGMzNmY5NWVhYTFhZTAwYjBlCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAxNDI3NDQsIDdkYmI5OWRlM2E0YTgxZGU1NTY0YmI1Nzc0NzExMjhkCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxNDQzNjAsIGJkMjZhNzFiMDgyNGEwNGJhZGZmZmEwNjUzZjBhYzAwCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAxNDM0NjQsIDExZmU1NjE3MzQyMzE4MGQ1ODFiYzUyZmUwNDQ2NTdhCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAxNDI4NTYsIDlmNjkwZmE4NzI3NjY5YmE4NjQwMDMyOTMzZWI4MjM1CiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxNDIxMDgsIGI1YzE4MmYzZjBlNmQzMDdmNTk4ZGM1NWY1MWY5ZDUxCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAxNDI0OTIsIGFiN2I2YjQ0NmI0ZjVmNWVjMmIyZWI1MmY5MzQ1MjNjCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAxNDA1MzIsIDNmZGE3ZTU0NDNkY2Y1OWU1MmY1MjNiY2Y4NjNkNWQyCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxNDAyODgsIDE0MjZjYjMwNGEyMTk4NzY1ODZiYTVjMTYxODA5ZmFjCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAxNDA1NDAsIDNhNjlmMzcyODc1ZTJjZDZlYzViNDk0OThlMWYxYTA1CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAxNDE4NjgsIGFjYThmMGJkMWIyOWM0MTQyYjgwZTVlM2U1OWFlYjc1CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxNDE4OTIsIDkxYmYzODQ3NzAzMDQxYjRmYmU4NzYwMmU3OGZiNTc3CiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAxNDIwODAsIGYxYjI4YzUzZTEwNjhhNjMwNWViYjZkNDg2MmFlYmYxCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAxNDEyMjAsIDE4OGZmZWVmMjk3M2I0OTAzNjRlOGNmMDFmYzJkOGU2CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxMzk5MDgsIDFlYWExMTk0ZjcxOWFhNmRhNGM3YWI0ZGRkY2VlNGNlCiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAxMzg4NjgsIDIyNDNiNWQ0NzNkNmRmMmVhMjgzNzUyZmU3OTljOTViCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAxMzkyNzYsIGQ3NGYyY2JmYWMwMDE3N2Q4NDhmYjFiMWUyMjNlNjU0CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxMzkzMTIsIDI3MDU0YmUxODRhMTAyOGE4NmM1ZTM0MDY0MThhOTJjCiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAxMzgxMzIsIGZlYjY1M2Y5MDJjOTJjZmQxOTU0YjYxYjlkMTE0OWYyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQ0NF9tZWRpYW4gYi90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQ0NF9tZWRpYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5MGEzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3V0dmlkZW9lbmNfeXV2NDQ0X21lZGlhbgpAQCAtMCwwICsxLDYwIEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjZXh0cmFkYXRhIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIGU0NmM3MTIzMTk0YzBlYmYxOWEyM2U1Y2VmZWJhYTYzCisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiB1dHZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQorI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMzY0OTIsIDVlM2NjNzhmZTllNDA0YjBlY2E3YzJkZjk4ODQxZWFiCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMzYzMzYsIGNlYzdiYWQ4MGZlYWM2ZTE2YTNkODQ3MzRhZTQ3M2Q4CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMzcyOTYsIGNiNDNkNzY2YzUxM2RhODE1YzU5NjRmMWY0OGMyZTQ5CiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAxMzYwODgsIDRjODkwMDYwMmM1ODA1MjYwNTdiNTJiYjE0MTYxMjc0CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAxMzUyNzYsIGE5YjEzNGEwZTQ5ODEyZmY5MjljZGQ1N2Q4YTAwOTA3CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAxMzY2NjgsIDBiOWRjM2NkNTFjZTVjNjc0MzE1YzA2YmQ2NzdmY2VhCiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAxMzY0ODAsIDE2MDIwZmYxODFlNDc3ZjFiMDFiODZhYTUwNzBiZjdjCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAxMzU4NzYsIDU1N2YxZjQzY2RmYzA2NjAzZjNiZDk3YmI5ZDQ0Mzk0CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAxMzYyMDQsIGMwM2I3Y2QzMTA5NjFlZjlmZTg3MzRmNDVhOTI3NmUyCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAxMzY3OTYsIGI2NjhjNjNiZWQwYjJkZTRkMTgyY2YwMjgxZTcxZWNmCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAxMzYyNTIsIDc3NTg3Nzc2ODJmNmUzZWE4NDAxMGNiYWYyNjQ1YTZlCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAxMzYyODQsIDY5OWU2YWI2NjkxMWNkZDBmYTM1N2MwNjk1MzdlM2VjCiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAxMzUwOTYsIDY1ZDRkM2I2ZTFiYmY2ZDY3YmFjYTFmMzQ2ZDA2NzM1CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAxMzYwODgsIDdkNjlmYjg2ZjY3YjNmZDNkZjQwMDhjYjAzZDlmMWVmCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAxMzY4NzYsIGFiY2E0YTAyNmJmOTNkYTU4MjgzZDVkZGQ1MWNlYWQ0CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAxMzcwOTYsIGY1YmIyNTRlZGU4YTllZDRjMDdmYjgwZmIxYTMwMWQ3CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAxMzYyMzIsIGNkYmU3MGI0YjcwNTFiOWMxMDkyZWE2MjZlODI1NjU4CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAxMzYzMDgsIGFjYjMxMDUyMjQ5YzQ4YjcyOTg0MjkzODk3NzE3MmU4CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAxMzU0NDQsIGJmMzhlNTZlMmExNTIxNTRiMDQwMTUwNzU1MGI1NjA1CiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAxMzUzMDAsIDE3MzczNDFjMzYxZjY1NmZlZmZjODY5MDNkYTM0NjQ3CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAxMzQ1NDgsIGMyOGU5YzQ0MTU0NGI3YzUxY2Y3NmFmZDRiNWEyNzk5CiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAxMzQ4MTYsIDViOGJhMGQyMDU4NjMxMDVkNzIzYWZjYzI4Mjc0ZmIyCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAxMzQ3NzYsIDkwYzVhYzVlZDgzZWQ2YTQzYjRmZTE0YzBlZTA3ZGM1CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAxMzYzMzIsIDNjYTA2NWI2MGI0ZmJjNWIwNGY2OGU2YmI5MDBkODYyCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAxMzY3MjQsIDI4M2IyMzI3OGNhNDBkYzkzYTMyNmU5NmU1YzIyNjI5CiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAxMzU5NDgsIDY1NjhmYjg1OTNlZGNlMjBmMjk0YTkzNmFiMTExNTNiCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAxMzU0MDAsIDIyYWJhZjBjMzE4NGE3OWNiOTBiNGQ3ZmU2Y2VlODk3CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAxMzUwNTYsIGFiZDYxMTdlMzFhZjJkMTM2YzBkZjhhYjFkYjY0NTk5CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAxMzM2NzYsIDY3YTY1MDE3ZmIyYTIzMmE3MjY3MTc2MjhmYmUxZDk1CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAxMzM3MDAsIDdkZmYzZDk1OGVjYmVkYzY5MWQzYjE4ODA4NGQyNmQ5CiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAxMzQ0NDQsIDE5MmM5OGMxYTdjMmY0YTE1YzdhYTU5NjA3YjdkMWZmCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAxMzUzODgsIDMyZDFhYmE2ZDQ5OTE2MjM0NWZjYjBjYTg1ODU1OGQ1CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAxMzU2ODAsIDc3Y2QxZjhkZGY3Y2U5NzdiYTlmZjA3NGQ1OTVlMDMzCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAxMzY0MDQsIDllYjAyMTNmMGQ2NmQ5NTdmNjY4Zjg4ZDQyNmYwMTRmCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAxMzU4MTYsIDMzN2I0MDgyMTgxZTg2MjdmMmZlOWM4NTI2ODE2ODhmCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAxMzU2MTYsIGM3M2M5NWU3NTY2OWNlOWRhZmQwYWMyNTMyMzk0MzBhCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAxMzUxMzYsIGU0ZTU1MTVkYmIwNWI4NTViNGNlNDJmZTE2MzhkMTE5CiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAxMzU1NzIsIDk4N2ZmZGM4ZDBjMTQyZTkyZGMwMjE5MGY3M2FmZDcwCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAxMzQ3NDgsIDhhMDE1MzhiODYzZTUxMDY2Zjg5NmYxOGFkOGNjNjhiCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAxMzQ0MjgsIDMwOTZlOTQzNWU1ODEzZDU0MDEzYmY1Yzg2ZTE1YzRmCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAxMzM3OTYsIDc4ZDM5NTJjODE0MTcyMTczYjI0ODgxZTExMGM4NjFmCiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAxMzUwNTIsIGIwYzJiZjBiMTA0N2RkNzEyNjhkM2MzMTE0YjY1NWQ4CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAxMzQ3NjgsIDY1Mzg2MmI3ZTUxOWMyOTkyNzgxODY5MjAyMTdhMzAzCiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAxMzQ2OTIsIDI2ZmI5MTgxNGVmYWRkMDEyMGYyNDdkNmI1ZjIyZDgxCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAxMzQxNjQsIGU4NTM5MDYyMmNiN2ViNjYxODUxMmVhZDU4ZDU3OGM2CiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAxMzMzODAsIDdjMDRlNTAxNWY4OWMyNDcxMzIyNzMyOWFhMTgyMGZiCiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAxMzI4NzIsIDg3N2RiMjI5YzE5Yzk3MTliZDliMTlkMGRhYjFjMTY5CiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAxMzI4NjQsIGM0YTg2MzI2MzAzZjk2ZDUzY2IyNjcxMTFlZDE5OWU1CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxMzI2NDQsIDdkZDNmZTQxYzUzNWQxNjhlYjA0NTBkOTYxNzFlYzBmCiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAxMzE3NzIsIGM0MzBmMTVjMTY4MzIwN2ZiZWMyNTBkYzlkN2EyYjEzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS91dHZpZGVvZW5jX3l1djQ0NF9ub25lIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0NDRfbm9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODBiODEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdXR2aWRlb2VuY195dXY0NDRfbm9uZQpAQCAtMCwwICsxLDYwIEBACisjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKKyN2ZXJzaW9uOiAyCisjaGFzaDogTUQ1CisjZXh0cmFkYXRhIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIGU0NmM3MTIzMTk0YzBlYmYxOWEyM2U1Y2VmZWJhYTYzCisjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiB1dHZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDAvMQorI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyODYyODgsIGY3N2I2NjBiMTNmNGNhMmQ5MDZkYmU2MjAwMTkyMjRmCiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyODYzODgsIDYxYzNlOWMwNWJlNDI4YzJhZGYzMTIyNTc1ODBkNTI4CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyODYxNDgsIGNmMmQ4ZGUzMTk5N2JhNmM5Yzg3Y2EwMjAzMjk1ZmZkCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAyODYxMjQsIDk4MWY5ZWVlZWQ1MTJhZjM4ZWFjN2M1ZGYwNjkzYjg1CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAyODY2NDQsIGJlOWU5NTEwNmNhNTk3MzdiMTE1NGI4NjVlOTE3MTEwCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAyODYyODAsIGU3MGI2NmYxM2U0YTA4YzEwZTFkMDE0YWMxYmUwY2Y5CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAyODYxNzYsIGIyMGE3OGU0YmNkMDJkN2ZlZGMwZjAwYWY4Mjc2ODQ3CiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAyODYxMzIsIDgwY2M2NmM4OGVhMDE1YjYyYmJmNDZhZTE4OGVlZDk1CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAyODU5NjgsIDQ0NmFlMDBkMGUxZmMyMzNiNjZlY2IzNWM3MjA0NjRkCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAyODU4ODgsIDlkNGIyOWJmZDYyZTVjYWMyZDc3MTg1ZTE5NzA2MzI1CiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAyODU3OTIsIGJjNzQ1NDhjMWVkMzdkYzFkNmNhNTIzZTAwYjgzZWQ3CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAyODU0MTIsIGY3MjM0Njg0YzkwZTBkZmNmZDdmZjlhNzYxMmI5Y2I5CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAyODYwODAsIDM4NzMxNzNiN2RhNjExM2IwNThjMGU1MGQxZmIyYWM5CiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAyODU1MjQsIDkwNjU0MTgxNDkxMjQwZTE4ODNjZmE4ZTlkY2JjNTNhCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAyODU2MjgsIDVhZTJkZTFhNjBjMjU4NmFmNGEyN2RjYTI3ZTBkNjE0CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAyODU2MjAsIDlkNzhlZTVmMTM5MGMwNWFmMjY3N2JlZGYyYjA4OGU0CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAyODU3NjgsIDdjNDdjYmJiYTdhZjExYWNlMzIzM2M5MDRlNjI4MjQyCiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAyODU4ODAsIDgyOTJlYTJlYjgwYjg2MGVkZjA3NDc3MDdlYjk5OTY2CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAyODU5NTYsIDE3YWVmNDEwY2EzZmVjNjNlZjgzMTg1NDAxZTAwNWEzCiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAyODU5OTIsIDc3OTgxOWQ2ZDA5MGE2NzI2MWVmMzYxMWY3YjUwYWQ2CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAyODU5MjAsIDUyZmJlNDNmODY0MzUwNjQzY2I0ZThhNTdmY2Y4ZjYzCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAyODYwNDAsIGMyZTc5MTllNmUyMGM3ZmNmNzhjMDIyOWU0ZDQ1NmQ0CiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAyODU4NDQsIGVkYzQ2MDM2YTIyOTg3OGQyNmE4ZGYxZjZkZmJkNjYxCiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAyODU4NjgsIDdlNWE5YWYyZDcwZGM1N2E3Y2EwYTAzZjg4YTNhMWE5CiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAyODYwNTYsIDE3NGQyYzhhY2E3M2NiNTQ4MWUxMmE1YTIyNTE2ZDAyCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAyODU4MzYsIGNmMWQyOGE4OGFhNGZjMmE1ZTE2ZTAzZTIwODE5MTlmCiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAyODYwMDQsIDJmZmQxMmM3NTAxZTQ3MDk5Mzk3MTJhNjI5NDVlYzI5CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAyODYyNjQsIDYxOTYyMTI3ZWYyYTQ2MTJhOWEzNTIxMTliNzQ0NGRkCiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAyODY2MzIsIDkzNTVlYTdlZjM4NDI0NjMzYjllMGI3N2ViYjIzZDc3CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAyODY1MDgsIGE3NDFmNjc2OTNiMDE1NDM1NTk2NmExYjA3MjY1OTM5CiswLCAgICAgICAgIDMwLCAgICAgICAgIDMwLCAgICAgICAgMSwgICAyODYxMjQsIDBmYjJhM2EwYjZlNTI1OTA3YjZkMGM1MGNhOGY3YmUxCiswLCAgICAgICAgIDMxLCAgICAgICAgIDMxLCAgICAgICAgMSwgICAyODYzMDgsIDg5ZmQ1M2MzODExOTQyNmNkZDYzYmU3MTRlODU3ZGFjCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAyODYwMzIsIDY3NGQ5MDQzOTgxY2NlMTljMzllMmM2ZDQwNWQ4NTZhCiswLCAgICAgICAgIDMzLCAgICAgICAgIDMzLCAgICAgICAgMSwgICAyODU2NzIsIDdiOTY3OGU3NzcyYjcxYWJmNWE5NWZhOTY3ZDMxOWFmCiswLCAgICAgICAgIDM0LCAgICAgICAgIDM0LCAgICAgICAgMSwgICAyODU1MjAsIDZlNjI2ZDRjNzIyY2NhZmVhNjYwMGE2MmMwOTNhNDdhCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAyODU4MjgsIDQ5ZTkwMjNkOWM4MjA3OThhZjZiNDQ1ZWMxZDg3YjEzCiswLCAgICAgICAgIDM2LCAgICAgICAgIDM2LCAgICAgICAgMSwgICAyODYzNDQsIDZjZjYxMWYzZWY0NzQ0MjY1OWUzY2UzODA3ZDNhNDgwCiswLCAgICAgICAgIDM3LCAgICAgICAgIDM3LCAgICAgICAgMSwgICAyODYzNjAsIGEwZWNhODhhZmVkMzdlMDc0N2IxZmE2MWM3ZTM2NzEzCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAyODYyNjQsIDViM2U2MDVmNzFiOGJhYjNhYTJjYzNlZDQzOWM2ZjhhCiswLCAgICAgICAgIDM5LCAgICAgICAgIDM5LCAgICAgICAgMSwgICAyODYwOTYsIGY5YTFjNWJlY2E1OTZlMmI1ZWVmMjM5MmIwYWRiMDFlCiswLCAgICAgICAgIDQwLCAgICAgICAgIDQwLCAgICAgICAgMSwgICAyODYyODQsIGViMjQ0MGY2NTM5NDEzZWZjODZlNWEwY2Q1NDVlY2Q0CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAyODU4MTYsIDUyMGQzMzQ0ZjMzNWI1ODBiZmIyZmFkNThiMTY0M2I0CiswLCAgICAgICAgIDQyLCAgICAgICAgIDQyLCAgICAgICAgMSwgICAyODU4NjQsIDQ4ZWQwZDllZDcwNzgwODI5ODgwMGM4N2YyZDYxZDc1CiswLCAgICAgICAgIDQzLCAgICAgICAgIDQzLCAgICAgICAgMSwgICAyODYxMDgsIDljYjk1MjI4NTA0OWY4MzU0YWI3ZTAwYzBhYjJmN2Q1CiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAyODYzMDgsIDdiYTA3ZTRjYzA0Y2Q0MjI3MmFiNzVlMWE2NTcwM2NhCiswLCAgICAgICAgIDQ1LCAgICAgICAgIDQ1LCAgICAgICAgMSwgICAyODY1NTIsIDU1NzIyYTdiYzYwYzllYjY4YTk0ZmQwZThiYTNiYTRmCiswLCAgICAgICAgIDQ2LCAgICAgICAgIDQ2LCAgICAgICAgMSwgICAyODY0NTYsIGUzZTU0ZTAzMWJjZjMwNjczNjA5NTU4MTc2OTBhNzU1CiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAyODYyNDAsIDk2YWE0OTNiMmI4ZDI2NGZmYjBkNDljOTUyNTk0YzExCiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAyODYxMjgsIDZlN2UwNGVlYzg2ZjI1N2FhNDZjNTlmMGU4YjZiMjJjCiswLCAgICAgICAgIDQ5LCAgICAgICAgIDQ5LCAgICAgICAgMSwgICAyODYxMjgsIGFiNzJjOGEwMWEwOTUwNDBlZmIxZDRjYjFmZGRiZDRhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92MjEwIGIvdGVzdHMvcmVmL2ZhdGUvdjIxMAppbmRleCA3YWQ5ZGNmLi4xZmY3NmY4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92MjEwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3YyMTAKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMS81MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDM2ODY0MDAsIDB4OGQ1YzM4NDcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3Y0MTBkZWMgYi90ZXN0cy9yZWYvZmF0ZS92NDEwZGVjCmluZGV4IDk4YjI4MTYuLmVkNzhlMzkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3Y0MTBkZWMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdjQxMGRlYwpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyNTZ4MjU2Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzkzMjE2LCAweGZlMTFhNmIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92NDEwZW5jIGIvdGVzdHMvcmVmL2ZhdGUvdjQxMGVuYwppbmRleCBiMmM3MjhlLi45ZmRkZjVhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92NDEwZW5jCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3Y0MTBlbmMKQEAgLTEgKzEgQEAKLWY3Y2YxYjc0M2MxOGY3NGQwNDdjZThkNmVhMDVkM2Q5Cis0NjViY2M3NDc3MTA0YTgyOTVmNDdiMzVmMWI5ODdkZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdmIgYi90ZXN0cy9yZWYvZmF0ZS92YgppbmRleCAzMzZkNDI2Li5kNWZkYjA0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92YgorKysgYi90ZXN0cy9yZWYvZmF0ZS92YgpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzEyCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MjQwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMjMwNDAwLCAweDNiZDFkNzMxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAyMzA0MDAsIDB4OWQwNzc0YzMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgIDIzMDQwMCwgMHhhMGZhYWZlMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdmJsZSBiL3Rlc3RzL3JlZi9mYXRlL3ZibGUKaW5kZXggOGM0MjUwZi4uNjJkOTY4MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmJsZQorKysgYi90ZXN0cy9yZWYvZmF0ZS92YmxlCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyODB4NzIwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMzgyNDAwLCAweDVlMWJjMzA3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDEzODI0MDAsIDB4MTk4Nzk1ZjcKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMTM4MjQwMCwgMHhhOTEwMmFjMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdmMxLWlzbSBiL3Rlc3RzL3JlZi9mYXRlL3ZjMS1pc20KaW5kZXggN2QzYjBhYi4uMWJkNmM2NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmMxLWlzbQorKysgYi90ZXN0cy9yZWYvZmF0ZS92YzEtaXNtCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMjQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDI0MHgxMDQKKyNzYXIgMDogMTU2LzE1NgogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM3NDQwLCAweGQxYmM1MjM1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzc0NDAsIDB4MTU4ZTYxNjcKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgICAzNzQ0MCwgMHgwZmFhNDQ4MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdmMxX2lsYWNlZF90d29tdiBiL3Rlc3RzL3JlZi9mYXRlL3ZjMV9pbGFjZWRfdHdvbXYKaW5kZXggMWI0ZDU1Zi4uZmE1NmIyOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmMxX2lsYWNlZF90d29tdgorKysgYi90ZXN0cy9yZWYvZmF0ZS92YzFfaWxhY2VkX3R3b212CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE5MjB4MTA4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgMzExMDQwMCwgMHg3NjRmODg1NgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAzMTEwNDAwLCAweDNiNjE1Yjc5CiAwLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDMxMTA0MDAsIDB4NGZiYjZmODQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZjMV9zYTAwMDQwIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMDAwNDAKaW5kZXggNzliZmYyNy4uNTU0YjgzOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMDAwNDAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMDAwNDAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAzODAxNiwgMHhhNmYxNWRiNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCAweGE2ZjE1ZGI1CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMzgwMTYsIDB4YTZmMTVkYjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZjMV9zYTAwMDUwIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMDAwNTAKaW5kZXggODlhMzg0MC4uZDMwYjFiZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMDAwNTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMDAwNTAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDExNTIwMCwgMHhiODgzMGVlZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGI4ODMwZWVmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Yjg4MzBlZWYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZjMV9zYTEwMDkxIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMTAwOTEKaW5kZXggMzMzMjZkNi4uZWJmZTI3MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMTAwOTEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMTAwOTEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHhhZTIwYjRmYQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweDJiNGNjZGY5CiAwLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MmI0Y2NkZjkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZjMV9zYTEwMTQzIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMTAxNDMKaW5kZXggYzBlY2MzYi4uZDY5MDQ4MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMTAxNDMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMTAxNDMKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQ4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUxODQwMCwgMHg4OTQwN2Y1NQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTE4NDAwLCAweGFhODk2YWZkCiAwLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA1MTg0MDAsIDB4MGU2OWZmNTkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZjMV9zYTIwMDIxIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMjAwMjEKaW5kZXggMjI5ODlhMC4uNDUwNTA0ZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMjAwMjEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdmMxX3NhMjAwMjEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzA0eDQ4MAorI3NhciAwOiAxLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDUwNjg4MCwgMHg4ODRiYzA5MwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNTA2ODgwLCAweDRiMDk1NDhmCiAwLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICA1MDY4ODAsIDB4MTk1Y2JlZTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZjcjEgYi90ZXN0cy9yZWYvZmF0ZS92Y3IxCmluZGV4IGRhMjFkZjQuLjk4M2M1MmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZjcjEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdmNyMQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiA2NjA5OS8xMDAwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDI4NTEyLCAweDcxNjUyODZkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMjg1MTIsIDB4MmI4NDJhY2MKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAyODUxMiwgMHg2ZDFiOGU4NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdmNyMiBiL3Rlc3RzL3JlZi9mYXRlL3ZjcjIKaW5kZXggZjdlMTU0MC4uZTI1YWExNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdmNyMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92Y3IyCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMTUwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE3NngxNDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDB4NTBlOTNlMGQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODAxNiwgMHg2YWM4NjI3ZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4MDE2LCAweDZmMzg2NjFlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92aWRlb3hsIGIvdGVzdHMvcmVmL2ZhdGUvdmlkZW94bAppbmRleCA0ZDJkYjM3Li5jNWI0YzgxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92aWRlb3hsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZpZGVveGwKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogNzEvNTAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxODh4MTI4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM2MDk2LCAweGFiMWM1M2MxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzYwOTYsIDB4OGI1OThmZjMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAzNjA5NiwgMHhlOWE1ZjNlYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdm1uYy0xNmJpdCBiL3Rlc3RzL3JlZi9mYXRlL3ZtbmMtMTZiaXQKaW5kZXggMDY0YjdmYS4uNjljZjA5NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdm1uYy0xNmJpdAorKysgYi90ZXN0cy9yZWYvZmF0ZS92bW5jLTE2Yml0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDQwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDg2NDAwMCwgMHhkNjkyOWVhNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgODY0MDAwLCAweDlkNTI4M2ZhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICA4NjQwMDAsIDB4Y2VjNTJkNDIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZtbmMtMzJiaXQgYi90ZXN0cy9yZWYvZmF0ZS92bW5jLTMyYml0CmluZGV4IGQ1NWQ4OGYuLjcxMTE3YjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZtbmMtMzJiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdm1uYy0zMmJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEyNjh4OTYxCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAzNjU1NjQ0LCAweDg3OTczNTMwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDM2NTU2NDQsIDB4ODc5NzM1MzAKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgMzY1NTY0NCwgMHgzYzMxNjdmZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdm9yYmlzLTE4MzMtY2hhcHRlcnMgYi90ZXN0cy9yZWYvZmF0ZS92b3JiaXMtMTgzMy1jaGFwdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmJkNzdhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdm9yYmlzLTE4MzMtY2hhcHRlcnMKQEAgLTAsMCArMSwzNiBAQAorW0NIQVBURVJdCitpZD0xCit0aW1lX2Jhc2U9MS8xMDAwCitzdGFydD0wCitzdGFydF90aW1lPTAuMDAwMDAwCitlbmQ9NTAwMAorZW5kX3RpbWU9NS4wMDAwMDAKK1RBRzp0aXRsZT1zdGFydAorWy9DSEFQVEVSXQorW0NIQVBURVJdCitpZD0yCit0aW1lX2Jhc2U9MS8xMDAwCitzdGFydD01MDAwCitzdGFydF90aW1lPTUuMDAwMDAwCitlbmQ9MTA1MDAKK2VuZF90aW1lPTEwLjUwMDAwMAorVEFHOnRpdGxlPUZpdmUgU2Vjb25kcworWy9DSEFQVEVSXQorW0NIQVBURVJdCitpZD0zCit0aW1lX2Jhc2U9MS8xMDAwCitzdGFydD0xMDUwMAorc3RhcnRfdGltZT0xMC41MDAwMDAKK2VuZD0xNTAwMAorZW5kX3RpbWU9MTUuMDAwMDAwCitUQUc6dGl0bGU9VGVuIHBvaW50IDUgc2Vjb25kcworWy9DSEFQVEVSXQorW0NIQVBURVJdCitpZD00Cit0aW1lX2Jhc2U9MS8xMDAwCitzdGFydD0xNTAwMAorc3RhcnRfdGltZT0xNS4wMDAwMDAKK2VuZD0xOTg0OQorZW5kX3RpbWU9MTkuODQ5MDAwCitUQUc6dGl0bGU9MTUgc2VjIC0gb3ZlciBzb29uCitbL0NIQVBURVJdCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDMxIGIvdGVzdHMvcmVmL2ZhdGUvdnAzMQppbmRleCA0ODIyMWMxLi5lNDFkMzcyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDMxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwMzEKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDI3MgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDI2MTEyMCwgMHhjNTBkZWMyYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMjYxMTIwLCAweGFhOGQ0NDQxCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAyNjExMjAsIDB4OTMyYjBkNDQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwNSBiL3Rlc3RzL3JlZi9mYXRlL3ZwNQppbmRleCAwZTYwMWJhLi4yNDY5YTNlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDUKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA1CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDEvMjQwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDUxMngzMDQKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyMzM0NzIsIDB4Mjc0ODg0MTMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDIzMzQ3MiwgMHg0YWYzODRiNQogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMjMzNDcyLCAweDk0OGQ4NDVkCkBAIC0yNDUsNCArMjQ5LDQgQEAKIDAsICAgICAgICAyNDMsICAgICAgICAyNDMsICAgICAgICAxLCAgIDIzMzQ3MiwgMHg2ZjUzMGFjNgogMCwgICAgICAgIDI0NCwgICAgICAgIDI0NCwgICAgICAgIDEsICAgMjMzNDcyLCAweDk0Zjc0NjZjCiAwLCAgICAgICAgMjQ1LCAgICAgICAgMjQ1LCAgICAgICAgMSwgICAyMzM0NzIsIDB4YThjMWQzNjUKLTAsICAgICAgICAyNDYsICAgICAgICAyNDYsICAgICAgICAxLCAgIDIzMzQ3MiwgMHhlZGNmZjA1MAorMCwgICAgICAgIDI0NiwgICAgICAgIDI0NiwgICAgICAgIDEsICAgMjMzNDcyLCAweGJmNzNmMWI3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDYwIGIvdGVzdHMvcmVmL2ZhdGUvdnA2MAppbmRleCBjMWRhNzJiLi40YmVjZjJhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDYwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwNjAKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMzI3NjcvOTgyMDI3CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTJ4MTkyCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU1Mjk2LCAweDZhMzIwMmEzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNTUyOTYsIDB4MmFmMjAyZWIKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA1NTI5NiwgMHhhMWE0MDM4OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA2MSBiL3Rlc3RzL3JlZi9mYXRlL3ZwNjEKaW5kZXggYmUxZmU1My4uMmQzYmVlYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA2MQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDYxCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDMyNzY3Lzk4MjAyNworI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTEyeDExMgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAxODgxNiwgMHhjM2ZlOWZjNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDE4ODE2LCAweDZkZGY5NzJmCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMTg4MTYsIDB4NzI4MDhiNmUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwNmEgYi90ZXN0cy9yZWYvZmF0ZS92cDZhCmluZGV4IDFmMmRkZDkuLmI0ZjMzNjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwNmEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA2YQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMwMHgxODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMzUwMDAsIDB4OWRjZWVkNmQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDEzNTAwMCwgMHg0N2U1Nzc4ZAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTM1MDAwLCAweDVkZTM2NTk5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDZhLXNraXBfYWxwaGEgYi90ZXN0cy9yZWYvZmF0ZS92cDZhLXNraXBfYWxwaGEKaW5kZXggOTFhMDk5Yy4uZTJjNDM1ZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA2YS1za2lwX2FscGhhCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwNmEtc2tpcF9hbHBoYQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzQKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMwMHgxODAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgODEwMDAsIDB4Y2I5Mjk2MmQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA4MTAwMCwgMHhhZTM4MTkwNAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDgxMDAwLCAweDFmY2MwYzc1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDZmIGIvdGVzdHMvcmVmL2ZhdGUvdnA2ZgppbmRleCBlZGI1NTVkLi42NWUxMTMxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDZmCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwNmYKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTEyeDgwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDEzNDQwLCAweDdjYjBhMjJmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMTM0NDAsIDB4ZGZjZWE2YmEKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICAxMzQ0MCwgMHg1OWIyYTVkYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA3IGIvdGVzdHMvcmVmL2ZhdGUvdnA3CmluZGV4IGIwMTQwMTAuLjNhZjIxZjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwNworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDcKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMTAwMS8xMjAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDE3NgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhNzc3NjEwMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDg0NDgwLCAweGViMTU2MGNhCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4N2E0ZTYxMjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOC0yNDUxIGIvdGVzdHMvcmVmL2ZhdGUvdnA4LTI0NTEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY4MTY5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC0yNDUxCkBAIC0wLDAgKzEsMTEyIEBACisjdGIgMDogMTAwMS8yNDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDM2MAorI3NhciAwOiAxLzEKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgIDYsICAgICAgICAgIDYsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAgNywgICAgICAgICAgNywgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgIDksICAgICAgICAgIDksICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAxMCwgICAgICAgICAxMCwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgMTIsICAgICAgICAgMTIsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAxMywgICAgICAgICAxMywgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgMTUsICAgICAgICAgMTUsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAxNiwgICAgICAgICAxNiwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgMTgsICAgICAgICAgMTgsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAxOSwgICAgICAgICAxOSwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgMjEsICAgICAgICAgMjEsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAyMiwgICAgICAgICAyMiwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgMjQsICAgICAgICAgMjQsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAyNSwgICAgICAgICAyNSwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgMjcsICAgICAgICAgMjcsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAyOCwgICAgICAgICAyOCwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAzNDU2MDAsIDB4YTFlNjUwNzcKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgIDM0NTYwMCwgMHhhMWU2NTA3NworMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgMzQ1NjAwLCAweGExZTY1MDc3CiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAzNDU2MDAsIDB4MDcwNTlhMjUKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgIDM0NTYwMCwgMHhjOTE3MDAzYworMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgMzQ1NjAwLCAweGFiNWI3MjI3CiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAzNDU2MDAsIDB4ZDM5M2M0YzQKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgIDM0NTYwMCwgMHg3ZWFiMmU4MQorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgMzQ1NjAwLCAweDIwM2E5NDA0CiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MGQ4NGY5NTYKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgIDM0NTYwMCwgMHhmZWQxNWI0MQorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE2NTliZGI0CiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAzNDU2MDAsIDB4ZmZkODJkMmMKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgIDM0NTYwMCwgMHhlYWRhOTA4MworMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMzQ1NjAwLCAweGViMjhmNjkzCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAzNDU2MDAsIDB4ZjJhOGY2OTMKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDM0NTYwMCwgMHhmMmE4ZjY5MworMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMzQ1NjAwLCAweGYyYThmNjkzCiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAzNDU2MDAsIDB4ZjJhOGY2OTMKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDM0NTYwMCwgMHhmMmE4ZjY5MworMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMzQ1NjAwLCAweGYyYThmNjkzCiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAzNDU2MDAsIDB4ZjJhOGY2OTMKKzAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgIDM0NTYwMCwgMHhmMmE4ZjY5MworMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgMzQ1NjAwLCAweGYyYThmNjkzCiswLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICAzNDU2MDAsIDB4ZjJhOGY2OTMKKzAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgIDM0NTYwMCwgMHhmMmE4ZjY5MworMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgMzQ1NjAwLCAweGYyYThmNjkzCiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAzNDU2MDAsIDB4ZjJhOGY2OTMKKzAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgNzIsICAgICAgICAgNzIsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgNzgsICAgICAgICAgNzgsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgODEsICAgICAgICAgODEsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgODQsICAgICAgICAgODQsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgODcsICAgICAgICAgODcsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA4OCwgICAgICAgICA4OCwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDg5LCAgICAgICAgIDg5LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgOTAsICAgICAgICAgOTAsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA5MSwgICAgICAgICA5MSwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDkyLCAgICAgICAgIDkyLCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgOTMsICAgICAgICAgOTMsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA5NCwgICAgICAgICA5NCwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDk1LCAgICAgICAgIDk1LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgOTYsICAgICAgICAgOTYsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgICA5NywgICAgICAgICA5NywgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAgOTksICAgICAgICAgOTksICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgMTAxLCAgICAgICAgMTAxLCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAxMDIsICAgICAgICAxMDIsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgIDEwMywgICAgICAgIDEwMywgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCiswLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgICAzNDU2MDAsIDB4MTljYmY2ZDAKKzAsICAgICAgICAxMDUsICAgICAgICAxMDUsICAgICAgICAxLCAgIDM0NTYwMCwgMHgxOWNiZjZkMAorMCwgICAgICAgIDEwNiwgICAgICAgIDEwNiwgICAgICAgIDEsICAgMzQ1NjAwLCAweDE5Y2JmNmQwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtYWxwaGEgYi90ZXN0cy9yZWYvZmF0ZS92cDgtYWxwaGEKaW5kZXggNWIxMDcyNS4uY2MwOTZjNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LWFscGhhCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC1hbHBoYQpAQCAtMSw1ICsxLDkgQEAKICN0YiAwOiAxLzEwMDAKLTAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgIDMzLCAgICAgMjEwOCwgMHg1OWI5MmEzNCwgUz0yLCAgICAgMTkwMCwgMHg4ZmIzYWRjNSwgICAgICAgIDgsIDB4MDAwMDAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogdnA4CisjZGltZW5zaW9ucyAwOiAzMjB4MjEzCisjc2FyIDA6IDEvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgMzMsICAgICAyMTA4LCAweDU5YjkyYTM0LCBTPTIsICAgICAxOTAwLCAweDhmYjNhZGM1LCAgICAgICAxMiwgMHgwMDAwMDAwMAogMCwgICAgICAgICAzMiwgICAgICAgICAzMiwgICAgICAgMzMsICAgICAgMTQyLCAweDJmMmEzZmVkLCBGPTB4MCwgUz0xLCAgICAgIDE2MCwgMHhhMTMzNDZhZgogMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgMzMsICAgICAgMTU3LCAweDE3ODA0NzY3LCBGPTB4MCwgUz0xLCAgICAgIDIwOSwgMHg2NDExNWYxNQogMCwgICAgICAgICA5OSwgICAgICAgICA5OSwgICAgICAgMzMsICAgICAgMjA2LCAweDUzNzI2MmNhLCBGPTB4MCwgUz0xLCAgICAgIDMxNywgMHg0NGEwOWRkMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXNpZ24tYmlhcyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC1zaWduLWJpYXMKaW5kZXggYjUwM2RlOC4uMzZmZmMwMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXNpZ24tYmlhcworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtc2lnbi1iaWFzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8yNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogODU0eDQ4MAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNjE0ODgwLCAxMmNlMjNiMjg4NDg1YmUzZGRiYzFkYjI4YzIxNTE3ZgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgNjE0ODgwLCBjZTM1MmUxMDc5NTM1ZWEwNThjMGU5YWQ1MGY3Y2RiOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXNpemUtY2hhbmdlIGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXNpemUtY2hhbmdlCmluZGV4IGY1ODFjOTkuLjUxMDViYzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOC1zaXplLWNoYW5nZQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtc2l6ZS1jaGFuZ2UKQEAgLTEsMzUgKzEsMzkgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDkwCisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCi0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDMxMTA0MDAsIDdkZGU4Y2QxMzZhYjRiMDRhOTVkOTg1NmI5NDE2OTdlCi0wLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgIDMxMTA0MDAsIGFhODg1Zjc4Y2I2Mzc0YjViZmNjNjZhNGZjNTcwMjZmCi0wLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgIDMxMTA0MDAsIGI2OWI3YjU2ZjU0OWEzZjliMGE2MDM5NDBiYWM4NWVkCi0wLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgIDMxMTA0MDAsIDIwZTJlMGYwYzg5YzU4ODI4YjZhM2IxMGQ5ZTE3NWU1Ci0wLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgIDMxMTA0MDAsIDQ4Mzk5NzkzNmU3ZDZiYjg0OWU2NGQ1MDQyNmVjNjg5Ci0wLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgIDMxMTA0MDAsIGM4NWVmOTdhODUzZmY1OTRlMmJmZGYwYTBhNTgxZGNjCi0wLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgIDMxMTA0MDAsIGM1ZTdiOWZmNGMyNTM5MTc5MzQ0NmRhNzg4Y2I4M2E5Ci0wLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgIDMxMTA0MDAsIDYzZjkzZTg5ZDI0MTYyZTJmNjMyOGVkYmM2NzE2YjMzCi0wLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgIDMxMTA0MDAsIDBlMzQ2YWI0ODMxY2U4YzY5MDAxMTUzYzcyYjdiODI3Ci0wLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgIDMxMTA0MDAsIGM1MjZjMjE1MTFkOGJlYzI2NTlkM2Q0M2Q5MzczNGYyCi0wLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgIDMxMTA0MDAsIGU5NWQwMWQ1ZjlmYjgxYTk4YmQzNDMwNWM3YWIzMGY4Ci0wLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgIDMxMTA0MDAsIDE3N2U3NWU3NTE2ZTg3NDZkMzFiNDNlYTlkMzllNmIxCi0wLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgIDMxMTA0MDAsIDQ4OWQyYmMwZGE5M2YxMThkYzlhMjY5NzI3NTY5N2E3Ci0wLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgIDMxMTA0MDAsIGEyZGMwMGQ2MjczNTBmZjFhYjMwMmJjYmFkNWNhNWFjCi0wLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgIDMxMTA0MDAsIDIwY2UxNDM4MzFiMDE4OWY3NjNlZTViZWU5YzUxMTg4Ci0wLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgIDMxMTA0MDAsIDc4MjJmZDkwOGJkODFiNTIxYzIzZmE0YTYzOWNhZjllCi0wLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgIDMxMTA0MDAsIGRhYmM0ZmViYmUwOTczNDEyNmFjNmY1YTUxODBiYThjCi0wLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgIDMxMTA0MDAsIGVmODhmMGQ2NjY3ZmVlZmFjMTQ3MWIwNjUyMDhlMWM4Ci0wLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgIDMxMTA0MDAsIDdjN2ZjNjY1YTZmZDllMTlhZjkzNThiYmRjMTYyYTUxCi0wLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgIDMxMTA0MDAsIGYyYmNmMzJmNzM0Zjk5NTA2YmRkMGEwMzc2YmFkZjgyCi0wLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgIDMxMTA0MDAsIDA2ODA5YzJkMjc3ZmQzYjM5MThlYmI0YjY1YzI3NjYxCi0wLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgIDMxMTA0MDAsIGU0MDNlOWU4NmZhNWQ1MTlmNjVjNTY1YjNhZGQ4NGI1Ci0wLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgIDMxMTA0MDAsIGQyYjg3NjczMGUxMjI0NWNhY2I1NzgzMDc3OTQzNDlhCi0wLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgIDMxMTA0MDAsIGRmZGZkOGNiNjI2YTk2MTM4ZjZhMmMxOTUzZGNmNWVjCi0wLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgIDMxMTA0MDAsIDBhYzU4YzI4NTc1YjgwNGQ5ZTYzMzk1NjUzYzNhZWYyCi0wLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgIDMxMTA0MDAsIDY0MWYyYTc4ZTMzOGM3MzNlZjE1OWJkMzZlYzc5NjZmCi0wLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgIDMxMTA0MDAsIDk0MDJkNDU1ZmE1YmQ1NTZiODVmNDc5YzQyYzNhNGQyCi0wLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgIDMxMTA0MDAsIDAwNDRkNDJiNDA0OGJjOTMxMTJhYTU5Nzg5ZGJkYzJkCi0wLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgIDMxMTA0MDAsIDVkOWU1YzViYTM1ZjZmNDUyZTVmMzFjY2ZmOWU4MTljCi0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgIDMxMTA0MDAsIDMwN2E1NWE5NDczOWI0Y2ZkZjQxZjdkYTdlNWMwMTM1CiswLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjE2MDAsIDVhYmQ2YzE2MzUyMmM3ZTg4MmY3ZTljMzY5MjkzYmY5CiswLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMjE2MDAsIDVjMTFkOGNjOWNjOTEwMmQwZWY1YWZkMWRjNjRhZmYxCiswLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAgMjE2MDAsIGNiZWZmYTllYTlkNjgyYWY3N2QzZmQwZmRmMTJjOGMxCiswLCAgICAgICAgICAzLCAgICAgICAgICAzLCAgICAgICAgMSwgICAgMjE2MDAsIGVhN2NlYzUxNWZjZjhjY2JjOTMyZDllOWI0NzJjZGM3CiswLCAgICAgICAgICA0LCAgICAgICAgICA0LCAgICAgICAgMSwgICAgMjE2MDAsIDIzMDM4YjcxMWRiYWM5NWNlNzEwNjU3YjFmZWY1OTAxCiswLCAgICAgICAgICA1LCAgICAgICAgICA1LCAgICAgICAgMSwgICAgMjE2MDAsIGUwZDZmYjQ2YmI1YzBkOTM5ZWUzM2FmODJiODg3NjY4CiswLCAgICAgICAgICA2LCAgICAgICAgICA2LCAgICAgICAgMSwgICAgMjE2MDAsIDY5NDUxOGYxNGQzYTJiZDNjMzE5YmMwYjA5OGM3OGJiCiswLCAgICAgICAgICA3LCAgICAgICAgICA3LCAgICAgICAgMSwgICAgMjE2MDAsIGMxYzczOTRiZDQyMzZhZmJjNzczYWY1MmVmN2ExMGVhCiswLCAgICAgICAgICA4LCAgICAgICAgICA4LCAgICAgICAgMSwgICAgMjE2MDAsIDRkOGQzYjJjOWE2MzdmOTYzNTIxNTg1ZWE4NzkzNTdiCiswLCAgICAgICAgICA5LCAgICAgICAgICA5LCAgICAgICAgMSwgICAgMjE2MDAsIGI0NDQ0ZGMzY2JmMWI2Y2RkODA0N2QzZGNkNDk3ZmZkCiswLCAgICAgICAgIDEwLCAgICAgICAgIDEwLCAgICAgICAgMSwgICAgMjE2MDAsIDY1ZTVkNjY3ZWM5Y2ViNjM2ZTIxMzU3ZjAzMmNlODAwCiswLCAgICAgICAgIDExLCAgICAgICAgIDExLCAgICAgICAgMSwgICAgMjE2MDAsIGZkOWE0YzY3NTk4MDUxMDc0Mzg3YjY0MGRmN2VkYWE5CiswLCAgICAgICAgIDEyLCAgICAgICAgIDEyLCAgICAgICAgMSwgICAgMjE2MDAsIDBlNTRlMjJkOTBmNjI5NmFlNjk4OWM4Mzg0NjI3MmNkCiswLCAgICAgICAgIDEzLCAgICAgICAgIDEzLCAgICAgICAgMSwgICAgMjE2MDAsIGRiNGIxNzI3NDUwMjQzYjIwMmJmZWM1ZWQ2YzczYWUwCiswLCAgICAgICAgIDE0LCAgICAgICAgIDE0LCAgICAgICAgMSwgICAgMjE2MDAsIGFiMzdhODRiZTA3NWNhNDJjYzczNTFmZjlmYjFjYjQ3CiswLCAgICAgICAgIDE1LCAgICAgICAgIDE1LCAgICAgICAgMSwgICAgMjE2MDAsIGFlNGQyZDI5N2U2NDZiZDhlMDVlNzZiNDU3ZDliNTc2CiswLCAgICAgICAgIDE2LCAgICAgICAgIDE2LCAgICAgICAgMSwgICAgMjE2MDAsIGU3Y2ZkNTgwZTNjM2Q3YzNmMmY1MTM2ZDFlNTQ4NTk1CiswLCAgICAgICAgIDE3LCAgICAgICAgIDE3LCAgICAgICAgMSwgICAgMjE2MDAsIGNiZWMwOTMxNGEwYjdhZDUzZjQ4OTNlYjQ3NGUxYzY1CiswLCAgICAgICAgIDE4LCAgICAgICAgIDE4LCAgICAgICAgMSwgICAgMjE2MDAsIGUxZmE4OWNkNjNjMzc0OTZiYzg2ZjE4Njk0MzI0ZDg4CiswLCAgICAgICAgIDE5LCAgICAgICAgIDE5LCAgICAgICAgMSwgICAgMjE2MDAsIGU5NjU1YjE1MTI1Mzk1MDMxMzgxMDIyODI3OGNhMTA0CiswLCAgICAgICAgIDIwLCAgICAgICAgIDIwLCAgICAgICAgMSwgICAgMjE2MDAsIDY5YmEzMWMwZWZmN2JjOTNmNDE4MDE3M2Q4ZTY0YzYwCiswLCAgICAgICAgIDIxLCAgICAgICAgIDIxLCAgICAgICAgMSwgICAgMjE2MDAsIDM2OGExZjZhMTE3MmQ3ZDU2ZjY5NTE1M2IyMzRhMzMwCiswLCAgICAgICAgIDIyLCAgICAgICAgIDIyLCAgICAgICAgMSwgICAgMjE2MDAsIDZjMjk4YjE5NmUxNmM2NGY3YzJmNDA3YmExMjQyOTM3CiswLCAgICAgICAgIDIzLCAgICAgICAgIDIzLCAgICAgICAgMSwgICAgMjE2MDAsIGJmNTQ0NzQxMTJlZDU1OTJjNGQ4OTBlMzMxMzg4MWEwCiswLCAgICAgICAgIDI0LCAgICAgICAgIDI0LCAgICAgICAgMSwgICAgMjE2MDAsIDk0NWQ0OWFiZWRiMDYwNmI2YTAwOWM4YjVkOGZhY2UzCiswLCAgICAgICAgIDI1LCAgICAgICAgIDI1LCAgICAgICAgMSwgICAgMjE2MDAsIGRkNmViZWY3YjZmMjQ2MTk5MTBkZTgxMTkxOGQzNDM3CiswLCAgICAgICAgIDI2LCAgICAgICAgIDI2LCAgICAgICAgMSwgICAgMjE2MDAsIDc5NTIzNDZmYzBmMWVmZjM5MTRlMGQ3NjQ2YjNjZjI4CiswLCAgICAgICAgIDI3LCAgICAgICAgIDI3LCAgICAgICAgMSwgICAgMjE2MDAsIDI2YmQwZDZiMjFlOGEyZGYxN2FmOGQxNDQ2ZmJhNzQ1CiswLCAgICAgICAgIDI4LCAgICAgICAgIDI4LCAgICAgICAgMSwgICAgMjE2MDAsIGIwZDkxNjAwNDE2NzE2ZDgxYzFmNzNhYzE0MWEwYjYyCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAgMjE2MDAsIDA4ZjE2Njk4YmViOWNjMTVmNzExNTk2MWJkNjllOTk1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDAxIGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwMQppbmRleCBlZjM4YWE4Li40YWJhZjY4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDAxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDEKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDgzYzc4YjVkYjU3OTcxMGY2MWY5MzU0ZDVjNTFlOGM4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDhkMDg5ZDIyNmY1MmQ2Y2RhZmZkYjNmY2MwODBiNzViCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDAyIGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwMgppbmRleCA1NTE0OWIwLi4zMTU0YTFhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDAyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDg3MmU5OTIyZjM3ZjBlOTJjNzY3ZDMzZTBhMTViOGUwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIGVhNWFkNmM2ZWU0MzU1MDE4ZmMwYmE4M2I1MTcyODM2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDAzIGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwMwppbmRleCBmZmUzODk2Li4xZTAzYmFkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDAzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDMKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDk2ZTZjZTE2OGI1ZWYzNzcwNTNlODZhYjU0ODRlN2Y5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDEwZmQ3NTAyOTJkODUyMmFiN2VlNTc3MDQzNjA0Nzg5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA0IGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwNAppbmRleCBmN2Y1MzEzLi42ZGU1NDhmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDQKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDgzYzc4YjVkYjU3OTcxMGY2MWY5MzU0ZDVjNTFlOGM4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIGQxNzNlYjhhODIxMWEwNTY3MmI0MzIwNjYwOWM5MDM0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA1IGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwNQppbmRleCAzMzY4YzcwLi5lMTk2M2EwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA1CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDUKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIGU3YTRiZTQzNGRmNGJiNTI0YmE1NmEwM2NiYTkwMWY0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIGQ5MDNhZGU2ZDQ5ZTUxNDg1NjI3YzA0NGZiYjIxOTBjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA2IGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwNgppbmRleCAyOGMyNDljLi40OTEzMDQzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDYKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzV4MTQzCisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzc2OTcsIDljYTVkZjI3YjAxNThhY2EyYTM4ZGZmOTQ2ZjU4YzQxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzc2OTcsIDYyNzEyOWE5OTUzOGVjMWFjNTFiZTkxMGNhOTJlYmM0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA3IGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwNwppbmRleCBhMGNiNDQxLi44NTFjZTdiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA3CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDcKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNzZ4MTQ0Cisjc2FyIDA6IDAvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzgwMTYsIDk4YmQwYWY2OTI4YzE0NDg4OGE5YzMyMDI3MGU5ZjBlCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMzgwMTYsIDlmZjdjZmY3MDNkNTg0ODFhY2QyMzM0NTEzODgzNzdjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA4IGIvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwOAppbmRleCAwNTAzYzRlLi4wMDA2NmE2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDgKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzIzCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNDMyeDg4OAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxOTA3NDI0LCA3MTQ2ZDNhNzJiNmNiOGU0M2VlNTI4MGVmOGQ2NjFmZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxOTA3NDI0LCA1YTUzN2U5NzEwMTU4ZWZiNWFkMjY4M2ExZDNiNGM3MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwOSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMDkKaW5kZXggZjQxZjAxNC4uMDJhMWFhNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAwOQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDA5CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8yNAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCBiM2EzMTIxYzc5NmE2MGM4ODk4OGZlZjUyNDBhMDdmZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCBmMjUxNDc3NjQ4MjljZjgzN2UwMGI4ZmQ2MzgzZTJjNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMTAKaW5kZXggMmZlZWI2My4uNzRhNzE2MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCAzNDQxZWMxYTliOWQzMjVjOWFlZGE0NGUzYjY4Mzc3ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTE1MjAwLCBiZmY4NmE4NGZkNjczMzk0ZjQ1YzA5ZDE5YTFlZTBhYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxMSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMTEKaW5kZXggYWRmNzIzNS4uMTRiMjc3MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxMQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDExCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCA4M2M3OGI1ZGI1Nzk3MTBmNjFmOTM1NGQ1YzUxZThjOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCA5Yjc1NWE2M2M3YzUzNTI2NjBhMjY1ZjZlMjQ5OTFlMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMTIKaW5kZXggM2RlNjRiNi4uMjdmNzI4ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDEyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCBjYzMwNjlhNTliNmY0MzE5NzYxYWYyYjM5OTIzYTZlNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCBjMGJjOTM1OTQxZDk5NGM2YWY2YTg2NGYwMmE5MGE2MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxMyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMTMKaW5kZXggZTMxZTZlNi4uMDViMGYyMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxMworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDEzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCBhZDEzN2I5ZWFlOTNkYWVkMjhmZTMxZmQ1MTY1YjRkMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCA3Y2Q1MjdmNjQ3NjgwYzBlYjMwNTA1MGQyN2ZiODA5MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMTQKaW5kZXggNjg5ZTI0Yi4uNzJiMTZhMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDE0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc1eDE0MworI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM3Njk3LCA3YTAzNTZkYzk1MGU3OTc0NGQ3OWM5OGUzOTFlYmVlOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM3Njk3LCA5NmUyMjFlNzVjMjkwZGQ4NDdiOGU1NTg2NTA3MzM2NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxNSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMTUKaW5kZXggNzY2YzkzMS4uNTAyNGJkNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxNQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDE1CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDI0MAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTE1MjAwLCA2YjRjN2NjMGM2YTcyMTgzNjJlNDNjZmZlZjY2MThjOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTE1MjAwLCBlMTMyYTdiMWJiNGZiMTViMTAxOTA5MmFlZGMwZTU5OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMTYKaW5kZXggNGRhN2ZmMy4uNGMzNWEzNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDE2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCA5MDVhODIzZGEzMWY3MWY5YzI1ZWJiOGRmYzlkZGQzYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCA5YTFiOTc4NTliMmY3NzQ5NTRkYmY5NmY0NWEyMmEwYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxNyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOC10ZXN0LXZlY3Rvci0wMTcKaW5kZXggMGQzZmJlYS4uZGIwNTI3ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA4LXRlc3QtdmVjdG9yLTAxNworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDgtdGVzdC12ZWN0b3ItMDE3CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTc2eDE0NAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDM4MDE2LCA5MDVhODIzZGEzMWY3MWY5YzI1ZWJiOGRmYzlkZGQzYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDM4MDE2LCBmMGY0MTFkZDA2N2JmZjA1ZDVkOWM2NGUzZjUyYTRiMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDAKaW5kZXggZTJhZmI5Yy4uZGUxZjU0YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBjM2ZiYjdhYmJkYjViZDRlZDRhN2UzNDc2OGMxN2RmMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAwODIwM2MyNTk1YmRiMmQ1OGVhZDZmOTIxMzQ1ZDY5OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wMSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDEKaW5kZXggNGQ5YjA4MS4uNTljNDk3NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wMQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTAxCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBmMDQxYjg3MGNmOTIzNmQ1ZjIyZTJiMDhhNzdkNTk1OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBjYmRiNzUyNjk4NmFlMTU1OTI4OTE0ODhjOWFmYzg0YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDIKaW5kZXggMDllNjI5OS4uNmNjOTJmNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA5ODA0OGNmZGI0YWY1MDU5ZjQwODVjNWFjYzk0ZWY4ZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA4MTYwMTgzZTFlZWQxZDBhZjQ0MjdiZTIxNmI4YjlmNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wMyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDMKaW5kZXggMGMyMjE1Ny4uYTdlMzA0MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wMworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTAzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAxNWM1NDgyMDhmNWVkYTI0M2ExNTFhNDJmNGQ2NDg1NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBlOTZkNDYzZGM4ZTliMjdiMWMyZWM0MGY3N2VlZTZlZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDQKaW5kZXggNzMwYTAxMi4uZGY3NDJmZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTA0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA5MjhjNjRhMDc0N2FjNTdhYjUwYzE1MjBkNjk0ZmVhNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBhNmY2ZGFhMjkzMjMxZTk1ZWYzMGVkMTY4ZjU4MmM4NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wNSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDUKaW5kZXggMGYyZGQ3YS4uY2E1NDRhOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wNQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTA1CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAwODI0NjA3MThiN2Q3MDQ2YzhmYjIzMTg0YjdmNzFjYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA0YTQxYWFkNTFjNDBhOTJkZjcyMzMzZTEzZjQ3ZDNmZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDYKaW5kZXggYzZjMTI4Mi4uZDVkZTE4OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTA2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBjZmNhMWJlZDk2ZmY2MmE2OWIyZDg0MWZkYTAxYzZiOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA5YjRkNjFmMWI5OTg3NDVjMTA4ZjhlYjY3OTI1ZTAzZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wNyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDcKaW5kZXggY2RjNmVjNS4uNjE5Y2U0NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wNworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTA3CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA2ZjUxMjIwNjRiZWFkOWQ5ODgyYmVjMjY5OGE2ZWQ5YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA1MGRhZTY3ZDJmNTdhNzZlZWNlMjEwZGVlOGI2ZGY5ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDgKaW5kZXggZjQwNWNlZi4uM2JjY2JlYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBlYjNkNjk4NWZjZGE1ZDkzZGQ2MmQ1MzM1NGU4YTA5MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA1YjFmNWI3NzgwYjRjYWZlMWY3NWU1NmEwYjUyNjY0MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wOSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMDkKaW5kZXggYmM1ZTg2YS4uNDJhZTEyYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0wOQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTA5CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBkN2NjYWYyOGM1OTg3NWZlOTE5ODNkZWY1NDkwZDJiMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBiZDk4ZmU5NDkyMDU0ODI2NzQ4ZGU4NDBiNDQ5NTMwOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTAKaW5kZXggOTNlNDZhOS4uYzNhN2Q3YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAyMGRkYTYyMzFmOTgwMWM5YzIzN2M2ZDA5ZDk5MzliNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAyM2M5MWU5MzgwN2ZiOWE0ZWQ1YmQ1YmRkNDQ5ZDk5ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xMSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTEKaW5kZXggMDkyNGY1NC4uMjYyOTc4YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xMQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTExCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA5NjA4MzMzMTVlYmNkZWU5N2Y0NmM0ZDk4ZDBmM2ZlZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBlZWM0MDUwN2QxN2I2NGI3ODk1YTYxY2I4N2IyMDk2YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTIKaW5kZXggOTIxM2U5ZC4uYzNkZmQzZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTEyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA2NTMzMjI0ZDNiNmJhMWVjMGRkOTczYmJlNTZjNjM0OQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAxMmNlYWRjNmQyODMyN2EyNGE3NWY4YzQwYjYwODRkMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xMyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTMKaW5kZXggODBkMWE2Yy4uZTNhNzBmYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xMworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTEzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA3MjY4ZGU2NzU2MDE0Zjc5YTU2ZGNmMDEwYzUyYTk3ZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA5ZTM5ZTliMGUyMjk1Yjg0NjBkZmEwNWY0NDc2Mjc3MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTQKaW5kZXggZTdhYjIxZC4uMGNiNDhmMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTE0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA1N2U5ZTMzM2M2NDFmYTk1MmY3NDg1Yjc4OGRmMjI1YQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA1NTFmMGNlYTgzZGNkZjQ1NDBjMzk4MzczNjc1Nzg3NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xNSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTUKaW5kZXggODQyYWI2ZS4uZmRhYjUxNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xNQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTE1CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAxN2EwYTI4NDI4NTZiOWU4OWFlZGUyMzc2NDhkNWRkYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBjOWZjYWRlODg4YTM4NjIxYmViZTNkNGI0MTY2NDI0NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTYKaW5kZXggNzQ3ODU1OC4uZWY0NWM5YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTE2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA2Y2MyMDg5ZTlhM2QzNTJmZTEwYjU5Y2NkOTM1YzY3NwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBkMTY1YmY3YjljYjkwMWUxMjFhNjUwMzg3NThkODYxMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xNyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTcKaW5kZXggM2E1YjFjMS4uZjY2ZGU2YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xNworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTE3CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBiYzgwNTExYzgzMTYyYzA5NjYxZjE1NWNkMjlmNmRkOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBhNjJmMWNiZGIzZjg2ZDJmYjRjODgwY2ZkOTE3ZGVmNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTgKaW5kZXggYmFmM2JjMy4uNjBmN2JjOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTE4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBiMmQzNTBmNmZhYTQxY2I1MGMyZThhOTkwN2QwZjRhNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAzOWI0MzgwZDE2YmM4ZTA5M2RkNGRiYTQ3NTE3NWZiMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xOSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMTkKaW5kZXggMmJhOTVlMS4uM2MyNWVkZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0xOQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTE5CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA0NDFlMDliZTNjMTVmY2IyNDBhZmQ3NGJiN2ExMGE3MgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAzMmFlNWRhYzg3NmNhNWQ1YWU2YWI3Yzc0ZjRkYzI1ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjAKaW5kZXggODExOTY4OC4uMDZhOTczZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTIwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA3Nzg2ZWI5OTQ0ZGJhMDU1M2UxMjkxMzM1MjNhOThjMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAyMDZkODg4Zjg0NTM0MjdmMTBhNDBhYThiZjVmNmRmMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yMSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjEKaW5kZXggMGU5NDk5Mi4uMGZjMDBkMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yMQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTIxCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBhYWI5NWUxOTViZTcxZmVjYTA1MGE4MzlkN2IzMTU0ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAwMmEwNWQ2OTliYmJkYzQ3N2UzNGJiMGRhZDlmMDM5MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjIKaW5kZXggOTA1MzNhYS4uM2U2MzA1ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTIyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA0MWY4NTNjM2VlMmQ0NjExYjY0NWNjNjQzZDgyZTI4NwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAxYzI0MGM2NTMxMTBmZjg2MDljYTBmMDI4N2E2NDk2ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yMyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjMKaW5kZXggZDE2ZDE5OC4uOWNlMjk2NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yMworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTIzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBiYzViMDczNjlkZjUwYzhmOTdjZTFhMzc3ZmU1MTNjZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBjZTYyZGRiNGYzZTMwNWQwZjg1ODdhZThiYjQ0Y2M3OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjQKaW5kZXggZWNjZGZkNi4uOGUzNzIxNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA5ODJkNTQwNDEyMjFjOTc3YjZmMGUzN2E5MjM2Y2M3NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA1NzYzMWU3ZjEzZjY0NWM4MzRlMjk0NGViZmQ2ZDQwZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yNSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjUKaW5kZXggNzBhNzZiMy4uMDA1OTJlOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yNQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTI1CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBiMGZiNTVmM2YyZjU2YjNkMjcwMzhlODNjMTAxMjNjZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA5ZmNhYzNiZWNkY2MyZDMwZDc3OGE1NWVjYTRjMjAxOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjYKaW5kZXggZDkzMDhkYy4uNmI2ZGRjOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA0ZjY0NWUwZjM1NGRhNzdiOWUyZjJhNjc1M2MzNjFkYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBiNzU0Mjk5OGVjMjk4MjczY2E2NjJiYzliNjU4ZDEwZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yNyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjcKaW5kZXggZDJlZmQ2OS4uOTMyMzRiYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yNworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTI3CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA2ZWRjOTZhMzc0N2NhZDQzODI4Mzk3MDQ1NzY0MjA2ZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA1ZmJjNjVkMjBmZGNhMWFiZDY5MDc5ODUxY2U2NzZkMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjgKaW5kZXggODU5MTlmYy4uYTE3MzU1ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTI4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA1ZGIzZTkxMGU3MGRhMzhiYjkxZDAxZDczYWNjMzNkZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBiOTIwZWU3ZjdlNjFiN2ZkZjlmNDRiMWY3MzhkMDI5MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yOSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMjkKaW5kZXggY2M2ZWFlNy4uYjBmNTZlZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0yOQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTI5CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAzY2IzZTMxMGJlNTMwNTA3N2VmYTYyMTZmNmYxMDY1NAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA2OTJkM2UwOThhZjU5NzhmZTFhODk4ZWJjMWE2NmE3YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzAKaW5kZXggNGYyNmI1OC4uODQ5MWMyZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTMwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBlM2IzY2VhNjZlYTM4YzVkZmJhMWFhNzNiYjRjNjExZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA0MmJiM2U1NGIxOWMzZjRjNGY3ZWUzYTZiYTAxMmUxOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zMSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzEKaW5kZXggNGM5YmY5Ni4uZjliODUwNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zMQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTMxCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAyNTIzZTllY2ZkMzc4MWVhZmNkN2RhMTkyZGMxMDVlOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA2ZDVmZWVhMDEyYjlhMWY1MWZjNjQzNjMzZTcyODc2NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzIKaW5kZXggZWY0OWM0ZS4uZjkzMjg2YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTMyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAwYTAzMDVlYmEzNjUwMGViZjZjYzZjYzBmMDFmNWEzYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAyYzc2YmNkNjc2MzQ2N2Y5MDU3YTcyNmZiY2Y1MGFiMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zMyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzMKaW5kZXggMzc0YzQ0ZS4uY2JiYzQ2MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zMworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTMzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBjNjg0MzNlMGU5NDA0N2MyMjBiZTliNjI5MzM0Zjc0NAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBmY2ZhNGRmZjdhMzliYzljNWUzMTU4NDllY2JiNDZlYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzQKaW5kZXggYWE5YzgzMy4uZGM5YmMzMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTM0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBhZDlkYzJmOTEyYzEzN2IwMTRhMzNlMjc5MmM4OGEyNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAxMTIyMWVlNGVhNWM3NzZmNDNhZjY4NzU2NjgyY2Q1YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zNSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzUKaW5kZXggODIwNzI1Yi4uMjNlZmZlYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zNQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTM1CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA3NTAzMWY4OThjY2NmMzAzYTY0YWI0NmIxZjgxNTM4OQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBhNGZjODY0ZTdmYmM0NzBkZmNhYjYyMDdlMGVlYTE1MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzYKaW5kZXggNGEzOWExMy4uZjQzOTE1ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTM2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBjNzgyNGFmMDA5ZmRlNmNhZmRkOGQzOWZhZTZiYjZjZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA1MTZhODJkNWZjNGRmYTNkYWY3MTNlZDJlYzM2MDQxYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zNyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzcKaW5kZXggOTZlNTI2Zi4uMWU0ZmQ3NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zNworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTM3CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBhMmU1YzgyMGZkOTczM2UxOGY5MzQ5ZmI2NThjYTI4MQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBmYjIzZTBiYzY0NzI4YTQ5MmEzM2Q5ODUwMzJmMjFiOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzgKaW5kZXggOWY2MWQzMy4uN2FlNTQ0NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTM4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA4MzQ3YmZiODkxMzE3ZTg5ZWY2Njc4MWQ2YzI4ZTI0ZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBhNTcyMmY4MjRkMzJkZWFjMDQyNTEzYTFhN2RjZGNkMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zOSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItMzkKaW5kZXggMzk2YTFhMy4uMDI0MTQ5NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci0zOQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTM5CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAwMTg5NjhmOTdmYWMzYmRmZjE0NmNmMjJjMWRhNWVmMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBjYThiMDliMDFlNTEzMjE4MzM5NWUyMzhmMWM3OTAxZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00MCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDAKaW5kZXggZGM3NzM5NC4uMmRhNGVhMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00MAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA3OTI2NjBmNjU4OWFkNTM0MGJlNGJkMDU1NDQzNTg2NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA2OGM4NGM4YTE1ZDY3OWUwYTczNjc4YjkzMjE1YzYyYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00MSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDEKaW5kZXggNjY3NTQ5Yy4uYmI3NjIzZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00MQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQxCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBhNDU2YmRmYzZjMWMwN2I0Y2IzYTM4NDg4NDM3NDNiOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBmZTQxYTEyYjhjYjZiYzU2NjdiYTIxNzllMDc2ZjNiMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00MiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDIKaW5kZXggYzdmYmZiYy4uYjFmNTI5MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00MgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBmMDE2ZGQ4NDMxNjk0ZDk4OTcwMGZiMWJhNzFhNWIyZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBlODljM2M1YjkzNTE1N2I0MGYyZmIwYWI5MjQxNTgyOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00MyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDMKaW5kZXggMDkwY2U2Zi4uYjI1ZTFjMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00MworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA3YjhhYjgyNjI1ZjMwMDZiYWM4OWQ0ZmI1MTk3ZTcxYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAxOGJkMzcxNjA0NTU2M2RmYmEyYzcyYjY0MGIzMjc0YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDQKaW5kZXggMTMwYjVmYS4uMWQzNzhmNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00NAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQ0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA2NmZkZTA0ZDgzMjBjNzUwZTU2NDA2ZmVlZmQyOTk3OQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBmOWQwMWQ4ZmMxNzIyZWMzNDVlNjI0ZTE0YjQwNDIxNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00NSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDUKaW5kZXggNWNiNzEwNS4uODE1NWZhYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00NQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQ1CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBjYzk3NTk3YjAxNTg5NmQ3M2YzZTYwZTdhZTQ0YzRkYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBmZWE5OGJjNTA4ZjkyMTM1NjQxYWI5OTc2MjQ0NGIxNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDYKaW5kZXggY2I1MWY3Mi4uMTY2NDIzYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQ2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA3OWVkOTVjNzQxMTc4YmIzYzA5NTRmMWY2ZjhlMjFhMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBmMDJhMDZhNWUyYjViNzYxOWM5YTUyYzViZWEwNTY0ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00NyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDcKaW5kZXggMGJmOTBiNC4uNWUwNDg5OSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00NworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQ3CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA5Yjk4ZTk0OGI4YzJhODIyZjIxYmQ4NDE5ZTZmNDQxMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA0OTEzODJkNjhjMTZjMmEzYzZmMTc0NjU5OGJjNGE5NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDgKaW5kZXggMjYwNGE1My4uNDQ0Mjc4YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQ4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBmMGYwOTViMGVkYWU3MjYyZjQ0ZDdlZDdlZjg0ZGVkNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAwZTgzMzg4OWNjYWM4MWQ2MDI1MTAwN2QxYmFmNjUwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00OSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNDkKaW5kZXggMzQwM2QxZC4uMzFlNTlmZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci00OQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTQ5CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA2YzFiN2I3ODI3NjE3ZmI5Yjg0MTdhY2EyY2ZkYmNhYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA0YzFmYzhhODkyOTdmZGNmNzlmMGZhYWJkNDJiODY4NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01MCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTAKaW5kZXggZjJjZGM4ZS4uY2E0MGM2MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01MAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTUwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBjYTYxNDJkYjY4NDYzNDg3YmMyOGM4ODhhYjM4NDc2YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAwMmE3MTE1M2VjNzBmNTY5NTI0YzNkODE0Y2I2MmY4NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01MSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTEKaW5kZXggODdhYjU3ZS4uOGI2NWQ4NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01MQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTUxCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBlZWNlMjYyN2RmMWRkZjA4NzIyNTZlYjkyMzUyZTE3OQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAwZWU5ZjIyMTI0NmFkNzQ3MjUwZTRiNWU4YmE1ODZlMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01MiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTIKaW5kZXggZjNhMTRkMS4uZTViZWE0NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01MgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTUyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA3MjkwMDM5ZDk3NGM0ZTUwZGI5ZDY5Zjk4NjRiY2RiZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAyNjQ3NjVkZTlkMDI1MDMwMzhhNGRhNTQxMzNiOWY4NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01MyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTMKaW5kZXggNzg0OTI1ZC4uNjYzYmM1YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01MworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTUzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA5MTdhZjI0ZGE2NmYxNDNhNTZhMDFlYjJjMjI1NDI4NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA0NWEwNWQzYmM2NDQ0MjA1MTk2MTllNDExNTY2MmE3MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTQKaW5kZXggZGFhNmY1ZC4uOGQ0MTc4MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01NAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTU0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA2ZmVhMjgyMGJiMTBhOWRlYzlhZGQ0ZDI0NTJiMDFmNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA3NDY3NTE2OWE0YmZjMmZmNTQ2M2M0ZGI1ZDg1YTc5ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01NSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTUKaW5kZXggMGE0OGNmOS4uNjc2NDkxYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01NQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTU1CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAxMWU1ZDE5NmY2NTM3ZmI3ZDg1OTg4ZDkwMTk1ZTU1NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA4NTM2MTA2Nzk1ZjdjOTNjNWE0M2ExMTQ5MzUyNzQ2OQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTYKaW5kZXggZjFmNjA2OS4uNDRkZWJhYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTU2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA0MDgzOWI3YTNhNDBlYzEwZjk2YjhhNzUyMjRmNjQ2ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAxMTQwOGRkNzNlOGM0NWRkYWFiOTlmNWM5NjUwMTAyYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01NyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTcKaW5kZXggNDk5YjU3ZS4uZDUwNmEwZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01NworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTU3CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBkMGU5ZmEwM2RkNDhkYTQ1OTJlYmFhZGI0ZTM3OTRlMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA1MTcyZTI5YjFlMDRjZDU0MzgzM2Q2YTY4YWFiMjk3YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTgKaW5kZXggMmExMDM1MC4uMmMzMzllMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTU4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBiZWY0YTI3ZDQ2MGU3Njk3ZTAzOGZlNmYxYzhiZDU5NwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAxMjQ2NzQ2ODZjYWZjNWYyZmY1YmM3ZWE0MTJiOGYzYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01OSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNTkKaW5kZXggOGFlOWJkMy4uZGUzZGY5MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci01OQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTU5CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBhZTlkOTllOWQxNmVmMjAwNzMzMDA1NTk1NjY4NDRhZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBkYTk0MDVlNWE2YmZlNGVkMThkOTI3YmEyMDA0MDA4ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci02MCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNjAKaW5kZXggYTQwOTQ2Mi4uNWZlZTEzYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci02MAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTYwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA5ZTY2YmI4ZTFiNWUyMDZlYTRhZmU0YmYyZDMzNWFjNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAwOTJiNzRjOTA1YzEyYzFlODdlOTBmNWE3OTg1NzczNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci02MSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNjEKaW5kZXggOTJhYTY3Zi4uODc3YTViMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci02MQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTYxCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBkMDYyZGM2YmUyNDZjODA0Mjc0NDAxODc2NWVmNTBhOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA0NWZkOWNiYWNiNmE5MTA2MGE3ZTQ5YTU4YTg1ODY5ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci02MiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNjIKaW5kZXggZDE3ZDNkNi4uOGVkOWYxZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci02MgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTYyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA2MmY3ZTQyZmU2NTNlODFjNWE2NWEyNTM4OWUwNDViNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBjYjBjZGQwYjI1Njg5ZTBhNDMzMjg1NTAwMTFkOTYwZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci02MyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMC1xdWFudGl6ZXItNjMKaW5kZXggZDc3NjViZS4uYmViZTcxNiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAwLXF1YW50aXplci02MworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDAtcXVhbnRpemVyLTYzCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA4NDY3NjQzZGNlZmY4MjdlMDRhY2Q4MmVlZmYxZDFiMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBjNzg2ZjQ5ZDY2ZjRkZmQ2ODVkZWE5NjA1ODIxYTE5ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy0xIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy0xCmluZGV4IDAyZTZlMTYuLjkwMTdjYTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtMQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTEKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIGEyZTVjODIwZmQ5NzMzZTE4ZjkzNDlmYjY1OGNhMjgxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIGFhMjBhNzViZTNhMzE2MTkzNDk2NzA2YzlmNzYwZDA4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTIgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTIKaW5kZXggNTEyMzhjMS4uZWEyNDY0YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy0yCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtMgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgYTJlNWM4MjBmZDk3MzNlMThmOTM0OWZiNjU4Y2EyODEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgY2Q5NDU3MjIzOTgxN2FlN2M5YjA3ZGU3MzljMzI3MmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtMyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtMwppbmRleCBlMWFmNmY2Li43OWJmZjZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy0zCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBhMmU1YzgyMGZkOTczM2UxOGY5MzQ5ZmI2NThjYTI4MQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCAwZDQ4N2ExNDYzOTNhMGI4Yjg0YjRiZTFiMzcxYjUwNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy00IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy00CmluZGV4IDk3NzA5NWYuLmQ1MzkzYzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTQKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIGEyZTVjODIwZmQ5NzMzZTE4ZjkzNDlmYjY1OGNhMjgxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDhiYWQ3NmM1NWI1MTQ5MTY5ZDY0Y2U2NTEyNTIxZGU2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTUgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTUKaW5kZXggYzBjZjcxNS4uOTNkZmIwZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy01CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtNQpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgYTJlNWM4MjBmZDk3MzNlMThmOTM0OWZiNjU4Y2EyODEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgZjFjZTBhNWQ1N2E0NmM5ZmYxMzMxODA0YjdiMDNmZGIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtNgppbmRleCAyZTUyZDMyLi44MGMxMjBjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy02CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCBhMmU1YzgyMGZkOTczM2UxOGY5MzQ5ZmI2NThjYTI4MQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCA0NWQ5Y2EwN2VkMDQyMTBiMWViYzc0MzE2OWJjOGVjNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy03IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAxLXNoYXJwbmVzcy03CmluZGV4IGIyYjVmZGEuLmRjMWFiM2YgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMS1zaGFycG5lc3MtNworKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDEtc2hhcnBuZXNzLTcKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIGEyZTVjODIwZmQ5NzMzZTE4ZjkzNDlmYjY1OGNhMjgxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIGY3MTlkMGJlMThkMTZhNDQ4YjRlN2RhM2UyZDliZjI4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDA4CmluZGV4IDQwM2ExMzEuLjk5Y2YxOGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDA4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogOHg4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICAgOTYsIDUyZGVmMjQyYzM2MTIzZTVhOGY1ZjUzZDZhOTcxMzk5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICAgOTYsIDc5YzkzMzYwZmJkNDcxNzk0MDA0MTRiYmZlZTA5MDFjCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDEwCmluZGV4IDAxZDg4MTguLmE0MDAxZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDEwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogOHgxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMTIwLCBlYTNlMGY4MDczMDRiMGViMmQzZTMyOWIwMTI0Zjc1YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgMTIwLCA4ZDEzY2Y2ODJkNjNlN2ViMTMwOTRmNTVkNjdmYzQ1OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMDh4MTYgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgxNgppbmRleCBkNzJhYWZjLi5mMTQzY2Q4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgxNgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDh4MTYKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDE5MiwgMDU1M2U1NmE5ZDg5YWVhNDk2NDIxODg1YWFiNDkxZjUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDE5MiwgYjJhMTRjZjY3NmY3ZWJmM2M1MDQ1MDA1MGY3NmFkMTYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDE4IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMDh4MTgKaW5kZXggODYxNWQ3Yi4uMzA4ZDIyOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMDh4MTgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMDh4MTgKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4eDE4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICAyMTYsIDRjNDFmOTNiMWIyODBiMzdiYzc3ZDcwNDc0MzVlYWE0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICAyMTYsIGM5YzgwZmRiYTJlYmMyYjhjMzQ5MGFlMzVlMzRmODRmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgzMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDMyCmluZGV4IDU1YWI2MjAuLjllYzM1YTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDMyCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDMyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogOHgzMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMzg0LCBmOTJhNzc3N2ZkNjlhYTJmMjkxNGQ5YTQxYzQ4MjhiYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgMzg0LCA2MmUxY2M3MzQ4N2QyMjQ5YTg4YTYwZTM1YTIyZDljNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMDh4MzQgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgzNAppbmRleCBiZGNlZGJmLi43ZTRiYzViIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgzNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHgzNApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDh4MzQKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDQwOCwgZjNmMmNkOGYxNTc0NjZmZjIzZGFjZTg1ZDc3MzY3Y2UKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDQwOCwgNjM5ZDliNzBhMTQwNjJlOTU1NTljMTJkMmI1OTdmOTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDY0IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMDh4NjQKaW5kZXggMzIyNmRmYS4uMjRkYWZiOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMDh4NjQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMDh4NjQKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA4eDY0Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA3NjgsIDc2NGJkMDJiNzgxYTM4YzYyMWExMDljMTJmM2Q5MzkzCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICA3NjgsIDc5NDk2YmQyYjkyMTIwMjZhZjgxNmIzYjdhMDU4N2Q1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0wOHg2NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDY2CmluZGV4IDdhYWEzNjkuLmY1MmViNjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDY2CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTA4eDY2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogOHg2NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzkyLCBkZjIwZThkZjg5NDQ5ZmU1MGJiNjEwZTk1YTQ0OWE5NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgNzkyLCAxOGYxYTY2ZDQ2MzI3NGQxYjA0ODlmM2E1MGU4Njg1NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MDggYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgwOAppbmRleCA1NzA4Y2QzLi5iMjM1MDlhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgwOApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEweDgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDEyMCwgZTFlNjZhODg2MTVkYTk4NTIzZWY4ODdmMTQ2M2ZjNDIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDEyMCwgNTQ5ODQyZmE5OGM4ZmFmNTcyODgyZDM4YjBhYWUzOTAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDEwIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MTAKaW5kZXggYTYwZTM2Yi4uN2E0ODMxZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MTAKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMHgxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMTUwLCAwODNkNjM4ZjJlMTQ3Mjk1ZDgxN2JiMTRmZmY1ZTRmNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgMTUwLCA2ZGJkYzQ0NWI2ZmQ2YmI5OWYyMDI1Y2MyYTQwOTc3ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MTYgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgxNgppbmRleCA2NTlkNDkxLi5jYTBiY2YyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgxNgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEweDE2Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICAyNDAsIGZhYjA3ZDYyMDlkMjQxM2UwYTQzNGUxYWFhYTEyMTU0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICAyNDAsIGY5ZmZmZmRiOTZmOTg1MjdiYTJlNTUzZDEyNjVlZGJiCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgxOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDE4CmluZGV4IGQ0MDY5YzkuLjdmOTJkMjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDE4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTB4MTgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDI3MCwgMGU5MTgyZTIxNGFhZTczMmQ5NGQwMDdlNWZlNDQ4ODgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDI3MCwgMjYzMGUyNjc0YjU2MTFkNjgyMThmZGRhYzA4ODE1ZTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDMyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MzIKaW5kZXggZjVlYzMxYy4uYzg0ZDgyMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MzIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMHgzMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNDgwLCA2MjJlNjQwN2EwNTFlYTA4NzA2Mzk0ZDAzMzMwZmZiZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgNDgwLCAxODQxYTBkYWY3YzNlZjdiZTk0ZTAxZmRiMWQzOTY4YQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4MzQgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgzNAppbmRleCA5NTBiMDRlLi5hMzhhYTJhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgzNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHgzNApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDEweDM0Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA1MTAsIGJmZWVhZjUxZjk3MmZkMGRmZTllZTc1NzA4M2NiYjU0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICA1MTAsIDEwY2Q0ZWQ2ZDc2MjAwNDg0NjQxMmQ5Y2QwY2FhNDA3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xMHg2NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDY0CmluZGV4IDA0YTVlN2UuLjc3YTA1ZDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDY0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTB4NjQKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDk2MCwgODM1MjU0ZDBlZWNiMTdiZWQxZjJiMGYzYTE2MzgxNjUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDk2MCwgYzBjOTVjZTk4OTBlYWIzMzlhMGUwZjhiMjZjYjA5NWMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTEweDY2IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4NjYKaW5kZXggZjI2OTY1YS4uNzJiMjVkOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4NjYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTB4NjYKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMHg2NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgOTkwLCAxYmQ4YjJkM2JmNjc5YzRiOTI1NzgwYmY4MmUxMmZhZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgOTkwLCBhMDI1NGI0Y2Q0OTI4ZmUxMDgwY2Q2Zjg4MjgyODhhOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MDggYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngwOAppbmRleCA4NGU5YjE3Li5iZGYzMjA3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngwOApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2eDgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDE5MiwgNjhkY2NkMTY3ZjlhYTE4ZGYwODQwZWJiODcxNWViNjgKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDE5MiwgNjVjOTBiYjk5ZmRiZWU3YWJmMjEwMzFkMzRjYjE4ZGMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDEwIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MTAKaW5kZXggODQ5MGU0ZS4uZjE0MjRhNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MTAKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNngxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMjQwLCBmYjNjYWQ2MWQ3ZDllYjUxMTc1OGRiZjg3ZGQ4YWJlMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgMjQwLCA0ZmJjMWFhNTU1OWM4ZGIyOTMwODAzODkzYmQ2YmE3NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MTYgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngxNgppbmRleCBmYjZmMGM4Li5mODFmNTEzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngxNgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2eDE2Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICAzODQsIGI1YzlkYWFmYTU0OGU1NGE4ZTMzZTk4ODFmZGEzM2Y0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICAzODQsIDExOTNhY2Q3ZWE0YjdhYWM5NjhlMzVlZjgzYzY0Mzc4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngxOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDE4CmluZGV4IGZhZGNlNTUuLjAxOGFmZTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDE4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTZ4MTgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDQzMiwgNTE1NmIxMWNkOTk5NWQwYzE2MzhjOWIwZDJiMDc4NmMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDQzMiwgZWY3ODU1N2Y5M2ZiM2VhNzcwYzdkNDlhYjYwZWRmMjEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDMyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MzIKaW5kZXggMDJhMjY3Ni4uOThlNWY2YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MzIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNngzMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNzY4LCBjNzNkNjExNDkwYTVkZGVjNmM2OTA1ODlkZWFmNWU4NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgNzY4LCA1ZDhlYWViMjIyYWE2NGFiZGE1OWNlN2IwOWIyZjZkOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4MzQgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngzNAppbmRleCA5N2U1MjdmLi40ZmIyODdmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngzNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNngzNApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2eDM0Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA4MTYsIGI4YmY3MTFkOWExY2U0OTE4MGVkNTY0MDdjOGE0YjBhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICA4MTYsIDA0NTc5MjliMDZjZTQ2YWVjNjNkNjZiZDM4NTg2ZTNmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xNng2NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDY0CmluZGV4IDYzZGJmMjQuLmM1YjlmNDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDY0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTZ4NjQKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMTUzNiwgOTI1ZmRjNDg1ZjNiYWExZWQxNDVhZTM5MTUxOWQ3ZmQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgMTUzNiwgZDM3YWY2NTZkYTJkN2E3MjdjODQ1MTc3MzQ5NWQ1ZWQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE2eDY2IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4NjYKaW5kZXggZjdkMDEwMi4uYjNkYWRkZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4NjYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTZ4NjYKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNng2NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAxNTg0LCBjN2IwZDkxZjM2MmRmZjBhNTgxNDM0YWY2ZTkwMmQ0MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAxNTg0LCBkOGIwMTZlZjU5YzZiYzE5M2IyOWQxYzcxNGYzNDJjMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MDggYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgwOAppbmRleCAwOGFhYmNjLi4xOGVkZWY5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgwOApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE4eDgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDIxNiwgMzIxOWFmNGVmNTQwNjM2YjBmNjdhOTg5ZTk5NjYwNTkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDIxNiwgMWEzNjU1YzJjZmQyZWUzMzJiYzg5ZGE1YjNmYWY3NzgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDEwIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MTAKaW5kZXggOTMyM2ExNC4uNTk0OTExMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MTAKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOHgxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMjcwLCBiZjU3NDQ4OWU5MzYwYjY0NzVhYTAxMmM3NDdlNzkyNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgMjcwLCA4NTExMDAzMDFjMjkzNzMxMmE2ZmQzMmY1YWFiNWEwOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MTYgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgxNgppbmRleCBhM2E5MWI5Li5iY2QyODU3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgxNgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE4eDE2Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA0MzIsIDk1MzVhYWEyZWEyNmZiZGMxNmU3ZmU5Y2JhM2ZjOWI0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICA0MzIsIDdmNmU3Y2EzM2MwYjI3ZmYwNTJkYzJhYjY3MjFlMzdkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgxOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDE4CmluZGV4IGI5MGZhZjMuLjU4ZTY5MGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDE4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTh4MTgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDQ4NiwgODM3OTBiMGU3MDA0ZDhkODliNzEzNGVlMWE4OGQ4ODUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDQ4NiwgMGJhZjBiZjU1NmFlNTZkMmY0YjA0NTY3ZTZhYzdlZDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDMyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MzIKaW5kZXggYjdiZDc0Yi4uMzdjYWJlYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MzIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOHgzMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgODY0LCA2MmVhYmM4ODE5ZGVkNmRkYmEyYzNhNTAyOTQ5N2NmMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgODY0LCBiNzYwMTgyZmRkZjhiYzA1ZjE0OWU4MGJiY2IyYzI4MQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4MzQgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgzNAppbmRleCAwZjQ2ZGE3Li42MDg4OWQ0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgzNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHgzNApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE4eDM0Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA5MTgsIDYxMmNjNDI0ZWFhZTkyNGNiMjVjNzczMmM0MjJmNzUyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICA5MTgsIDAxMGU4YzJhODE0ODYyNTI5ZmNmOGQ3NzcxYmEyZDdmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0xOHg2NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDY0CmluZGV4IDE3MjQyMmMuLjFlYzE2MWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDY0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTh4NjQKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMTcyOCwgNzJjNzRkZTU0N2Q5ZWQxYjE3YmM5NjJkYmQ1ZTBiYjEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgMTcyOCwgNDYyODQ5ZjllMjIwNDczOGU5ZjA4YjQwZTY4MmE2YWUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTE4eDY2IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4NjYKaW5kZXggYzQwMDk1Ni4uZjA2YTRkMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4NjYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMTh4NjYKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOHg2NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAxNzgyLCBjM2ZjNGExNTkzYjljYzJmMzc1MjEwNmFmODUzOTM4NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAxNzgyLCA3ZjJmZmU2YmMxNzUwZjY3NDliYjVhZDEyY2JhZjM0YgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MDggYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngwOAppbmRleCAyZGY1YWRjLi45YTU3ODNmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngwOApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyeDgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDM4NCwgYzdiMzBjZGU1NjY0Mzg3YjBmN2E4MGQ5YjAxZTRmZTIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDM4NCwgMjIyOGEyYTRlNTRhYjUxNDU1MjVlNTgwM2MzMTRkY2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDEwIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MTAKaW5kZXggZjVmNDVmYi4uZjVmMGQxZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MTAKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMngxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNDgwLCA3YzViNWRmMzczZWJmZDMxZDIxMGZmOTEwZTAyMjEzYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgNDgwLCBjNWIwYTVlM2VjZWI3OTJiMTU4MTgzMjRhNDNhYTJhOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MTYgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngxNgppbmRleCA0YWFjMjExLi40MDBkOWYzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngxNgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyeDE2Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA3NjgsIDdjMjgxOGRiMjYzMmU1YzViZWVlMTdlNzEwNWQ5MjA5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICA3NjgsIGNlYWQ3MmJkMjI5OTVlOThiNTRhOTFjN2I0YTIwOTc1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngxOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDE4CmluZGV4IDJiMzAyMTkuLjdkNThjMzIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDE4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzJ4MTgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDg2NCwgOWRhNTQwOWQzNDRlN2I4MzgwNjg4NTY5ZTU0ODAzYTUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDg2NCwgOWI1MWUxNGUyZTYyNGVlMmI0MzBlOWVhZjFhNDg3OTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDMyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MzIKaW5kZXggZTlkZTJlZC4uODQ5M2M5MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MzIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMngzMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAxNTM2LCAxMTc5MTVkYjE4NTZjZWUyNmYwNWE2MDljOGM4ZGUyZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAxNTM2LCA5NDM3NzFhOThiMjZiMTc0ZTg4ZWQxZjRlODcyZTUwNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4MzQgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngzNAppbmRleCBlMWUwMGZkLi5mYTMzYjA3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngzNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMngzNApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyeDM0Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDE2MzIsIDc3MDU4MjkxMWZkMDA5NWViYmVhZTM4NGU4NzY2NWFjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDE2MzIsIGY5OWQ3ZTMxMzFmMDQ0MTNjYmEyZjlkZTY4MTg5NzZkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zMng2NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDY0CmluZGV4IGMzOWM4OGQuLmY3MGMyN2EgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDY0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzJ4NjQKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMzA3MiwgY2FhODQ3MWE4YjM4MWQ1M2MzZThmYzYyNzk0NmE4NzEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgMzA3MiwgMmNiYTg2ZWExNGMwZjI4ZTI0MjYyNWIwOGY1ZTliODgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTMyeDY2IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4NjYKaW5kZXggZDAzNmRmMS4uZjdjMDYxNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4NjYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzJ4NjYKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMng2NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAzMTY4LCA5MjBlYTRiOGEwMGQ0MTQ4OWQxMjJkNjQxZDZlNGZlNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAzMTY4LCA4YmZjOGQ0NTJhNzlmMjk3OGI4ZTk3M2I3N2NiZjhhOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MDggYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgwOAppbmRleCA1ODY5MTg2Li4wYzM1NDkzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgwOApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM0eDgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDQwOCwgYzE0ZjJiYTViNDU4MmM5ZDNhNDg4OTc2ODE0NjkxYjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDQwOCwgNDM4N2E0ZGNlMTkwMDdiN2VmYjgxMGI1YTQwNjk3NDkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDEwIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MTAKaW5kZXggYTJjZTEwZS4uZWRjZmRmOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MTAKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNHgxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgNTEwLCBmZDcyMTJiNTE5NzgzY2Y0ODMxY2U0YmZmOTFmMjMxMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgNTEwLCA5NzY4NzIyZWU5MzlkODBhNjcxNjg2NWZkZWJjYTMzZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MTYgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgxNgppbmRleCAwYzhkYzY3Li41NjI4ODc2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgxNgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM0eDE2Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgICA4MTYsIGU0NDNjNDMxMDFiZTAwNDcwYzZhNjFjMWEyOTk1YjVhCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgICA4MTYsIDFlNzliMWI0NmVjNzA0ZDM2MGI1ZmI3MjU5MTNiMGYxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgxOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDE4CmluZGV4IDhjOTJiMmQuLjVhN2YzYzggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDE4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzR4MTgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDkxOCwgYWI3ZWFiYjM1NWU1MTYzZTc0NTE5NDUwMThmYWRlYmQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDkxOCwgYjlhNzdjYzBjNzY5NTM1ODA4OTk2YTZkZTdiMzc0ZmYKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDMyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MzIKaW5kZXggYTlmODA0ZS4uOTU2ZDJlMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MzIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNHgzMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAxNjMyLCA3ZTMzNDg2N2UyNzA0NmZhYmYwZjM5MzY1MzExYzM4YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAxNjMyLCBkMmE0OTIxNmVjZWRlYTYyZjU0NmU1NGMxNTUyZjE2MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4MzQgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgzNAppbmRleCA0YmVkMTQ5Li45MzFkNDIyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgzNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHgzNApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM0eDM0Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDE3MzQsIDFiYjk4YmE4OWFiZjZiODZmNDdhODUxZjgxMjZlMWZmCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDE3MzQsIGI5NjBjYzc5NWMxNzlhZmU3ZWVjMzYwYzU3ZmRkZDdmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS0zNHg2NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDY0CmluZGV4IGFjNjFmMjcuLjk4Yzg4Y2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDY0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzR4NjQKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMzI2NCwgMzg1NjYzNTIyM2Y1NzhlMWU3ZjdlNzI1MGE1M2NiOGQKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgMzI2NCwgZWU4ZDdjM2EwZWExNjU0MjBkN2U3MzNiOWU1OTIxOWEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTM0eDY2IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4NjYKaW5kZXggMmJjOWViNi4uYWYwYTIxMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4NjYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtMzR4NjYKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNHg2NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAzMzY2LCBiZjRlNTY4MjE3OTA2ZWU0YjU4ZGM0NzA3YmVlOGVmNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAzMzY2LCBmODIzZjhjN2I2ZTQ3YmE0MzIxNWYzYmVjZDM1MjA4ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MDggYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgwOAppbmRleCBlMWUwMWVlLi41ZTcwNDZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgwOApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDc2OCwgZDgwMTc5N2M5NDAzOWIwYTE2NmQ0NmUxNTFlYzkxMmMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDc2OCwgMTYxZWMyMmNhYTM2ODliMjE0ZDlhYjk5MzQyNDU4NGIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDEwIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MTAKaW5kZXggMDQ2ZTdlZS4uMTQzYmEyYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MTAKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHgxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgOTYwLCA5N2ViNWZkMDU5OWQ0ODI2NjJlYjBhMWRlZjVjNWVmMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgOTYwLCBkZmRjMWI2MWI0NzhkY2NhOGQ0MTEwMjE0ODZhYTJlYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MTYgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgxNgppbmRleCAxNmNiNWRkLi42NzQ3OWYzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgxNgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDE2Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDE1MzYsIGE0MzA2OGEzNjRjYzQyNjE5ZTYyNDA2ZGNmMTdkZGZjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDE1MzYsIDk0NjkxZjkzMjk5YmJmNWI2YmEzMDIyYjAyYjNlMDY5CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgxOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDE4CmluZGV4IDQyN2FjY2EuLmM3YWNhZDcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDE4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4MTgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMTcyOCwgYWRmN2U4NGEzNTE4NDc2ODNmNmE4ZGQxNzcwMTllMjkKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgMTcyOCwgODIyN2NmMjgzYTI3Mjc3ZmJhYjNkNzgyNmUzNDAzMzcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDMyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MzIKaW5kZXggYTBmMDMzZS4uODhlMjllMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MzIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHgzMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAzMDcyLCA5MzFhYjZhMjQ4MmMzZTg0YmM3ZWY4ZGZiYzI1MTMwNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAzMDcyLCAzNTUyYTlkODQ3MGE2NGVkNjI3YTZkYmI3OTliNzgxMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4MzQgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgzNAppbmRleCBhODUyMjcyLi5lYTQxZjAxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgzNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHgzNApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY0eDM0Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDMyNjQsIDY4ZDAwOTU4YTc4ZTYyNTJkZDc1ZDYzMjgwNmUyMDIyCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDMyNjQsIGY3YjYyNjZlNzQyMDBhNjY5ZWVjZDI0MWRiNzg3ZWUyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NHg2NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDY0CmluZGV4IDQxOGZlYmUuLmM5ZDBjMjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDY0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjR4NjQKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgNjE0NCwgMzVmMTdkYjkwNzZmYTIwMzY4ZmRkZmEwMTU0M2M3NDYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgNjE0NCwgNjFjZDc3NWRmYzE3NzI2MmRhOWE5MWQzOTEyZTY3MTgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY0eDY2IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4NjYKaW5kZXggZDM1OGJkNi4uNGJjZDU3MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4NjYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjR4NjYKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NHg2NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA2MzM2LCA4ODU4N2RlNjVhY2ZjODVmZjU2ZGFhYzhlZjVkMTJlNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICA2MzM2LCBiZTQxZjZjNzg4YjkyOWI1YjZiMjdjNTY3NGY0MGFiZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MDggYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngwOAppbmRleCA0MjZmOTFiLi4wYjI2YzVhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngwOApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY2eDgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgIDc5MiwgM2IxNjg0N2U2MDc4NjcwNmZjMzM5YWJjNDUyNzQ2ZmYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgIDc5MiwgMzY1YTU5NTFjYjEyN2Q2ZGYxODNmZTVkNTAwMGY0OTMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDEwIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MTAKaW5kZXggOGUwMTMzYS4uMDIxM2ZjZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MTAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MTAKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NngxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgOTkwLCA3Y2JkOGM2YjJmYjM1YzBjMzA2M2NiN2EzNzk5NDRjOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAgOTkwLCAxNDA2MmU3NGI5OGJlZDFjYTk4MmY0MDhiYzE0MzI2YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MTYgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngxNgppbmRleCA0YmRjMWJhLi5mOWVlMTBlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngxNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngxNgpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY2eDE2Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDE1ODQsIGZhMmYyOTJkMjczYzM3ZGMyODA0YTcwZDFjYWUxZTlkCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDE1ODQsIGJhNzVkOTA2NTJjMDIxYmM3Y2EwNjEzNTJlNmU5NGNlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngxOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDE4CmluZGV4IDNiMzk1ZGQuLjFjYjliYmQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDE4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDE4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjZ4MTgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgMTc4MiwgZmRhNWFkOWJmNzBhNTFiM2E0MWJkY2FiZjJjY2UzMmEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgMTc4MiwgOTE5MTZmYjIwYWQ1NDJhN2EzYWQyNzZlNjUwNWY5YjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDMyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MzIKaW5kZXggMTRiOWNiMC4uMjBiZmE3OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MzIKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MzIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2NngzMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAzMTY4LCAwMTNjZDIyYWVhNmJmZWNjYzhlYzgwOWFiZDUyYmU1YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICAzMTY4LCAwOTgwYWRmYjBlZjg3OWIzYzk2MDc5NzI3MmYwMjVhZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4MzQgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngzNAppbmRleCA3OWJjOTFjLi4wMTI5MDBmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngzNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02NngzNApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDY2eDM0Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgIDMzNjYsIDY4MjFlYjNmY2QxZDEwZGIzMmVmZjcwNDY4ZGNmOWMxCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgIDMzNjYsIGVkMDA5NGQzNDdkOWYyNTBkNDZiNDkwM2NiYzE0ODAxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDItc2l6ZS02Nng2NCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDY0CmluZGV4IGE4OWUxMGYuLmNmZDc3ZDQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDY0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDY0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjZ4NjQKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgNjMzNiwgOTI5MDg2ZmJiM2UxMTdiZDUzMTEwYjY0YzFlZTkxNWIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAgNjMzNiwgOWVkNDVmNWU0MGRkMjM5MzQzNGUxNGEwYzAxNjBjNjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMi1zaXplLTY2eDY2IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4NjYKaW5kZXggNzNhYTRlNy4uODU2MDM4MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4NjYKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTAyLXNpemUtNjZ4NjYKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiA2Nng2NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA2NTM0LCA2OWY5MDI4ZDUyZjk1ZDJlN2Y5ODZjNTdiMTlmYzAxOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgICA2NTM0LCAwNjhlNjExZjYyYjNmNjIyMmY2YjE2OTk3NDhjOGZiZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLWRlbHRhcSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1kZWx0YXEKaW5kZXggMjkzYWJhZC4uM2QxMzk2MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLWRlbHRhcQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtZGVsdGFxCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI0MAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTI2NzIwLCAyZjkwZDYwNmVkYzUxMWM4Yzk2MDUzMGRkOTE1Y2I5OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTI2NzIwLCA3ZmQ0NTFhMDU3ZDYzNDFiMmIwZDExNmY1OWU0MWExMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDE5NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5NngxOTYKaW5kZXggMWM0MTU2Yi4uN2FjMzBhNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDE5NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTZ4MTk2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk2eDE5NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU3NjI0LCAxNGNjMWMzNGI4MTA2ZTM1MjM4ZDQ2NTBhOTEyMzg1MgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU3NjI0LCA2NmUwYmI5MTM2ZWEyNGUzMGI3ODFhNDYxMGI0MjhhMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDE5OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5NngxOTgKaW5kZXggMjk0YzdkZS4uZmQ2NWRlMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDE5OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTZ4MTk4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk2eDE5OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU4MjEyLCBkMmJkMmRmYWYyYWMyMmIzZjI0OTk4NDRmMjI4ZDg5YQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU4MjEyLCBlMDY2NDQ4YmFlYjM5ZGEwNGIyMmQ0ZDJlYmQyN2IwYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIwMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5NngyMDAKaW5kZXggZDA4ODJlNS4uZGU1OWVlMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIwMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTZ4MjAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk2eDIwMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU4ODAwLCBiMmYyYWMzZTM4MzNhZTFiNGRkMDc1ZmUwMDIxMDM3MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU4ODAwLCBjMGNjZTA1ZTU2YTA3MTExZmU2MjU1M2ZhM2E4NzA3NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIwMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5NngyMDIKaW5kZXggMjBmNDZlYS4uNGE0MDY3NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIwMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTZ4MjAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk2eDIwMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU5Mzg4LCA3MTA5ZDJlZjE2MDgyOGVjZTI2MzM3ZjM2ZmNmYzA5MgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU5Mzg4LCBiZGFhNjYxMmY4MWE5NTZkOWIyMGQ1NWEwNGRmODM0NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5NngyMDgKaW5kZXggYjFmZmQ4Zi4uYWVlNDQ0NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTZ4MjA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk2eDIwOAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYxMTUyLCBlZmEyYTJhNzZhMGZlNzA5YTc4ZTQ5MTM0NmNmY2YyOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYxMTUyLCA5N2RlODVlMjFiNDA4ODc4ODUzZmE4NzAxMDQ3MDdkNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5NngyMTAKaW5kZXggNzI0ODg3NC4uYmNmZGUyMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTZ4MjEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk2eDIxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYxNzQwLCBmY2NjMTg3MTRhOWVkMzg0MGJkNmU5YzZjYTQ4NThlNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYxNzQwLCBhOGY2ZWI0M2NmNmVkNjcwZWIxODBjNTA1MWRlMDZmNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIyNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5NngyMjQKaW5kZXggZmI0OTE4OC4uMGU5ZDY0YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTZ4MjI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk2eDIyNAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY1ODU2LCAxMzI2MzY3NGVhNWFhNjE5MjUwZGZkMTM5YmRhODcyZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY1ODU2LCAzOWY1Y2JkODkxN2YyYjNhMWRmOGNmMmI3ODYyNjZkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIyNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5NngyMjYKaW5kZXggMGVmMzE4YS4uMDVjODhlYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk2eDIyNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTZ4MjI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk2eDIyNgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY2NDQ0LCA1Y2IyNDBmMTA3NjFmNTk2ODc2MTJlZDU4OTc1OTgwMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY2NDQ0LCA5ZDhkNWI1NzMzNmRkZmE1YzljNTEwMGEwMzAyMTk3ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDE5NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5OHgxOTYKaW5kZXggMmQwMmE0OS4uNzVhZjk4ZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDE5NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTh4MTk2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk4eDE5NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU4MjEyLCBjOTgwODY2YTZmMTdkNDEwN2NlMTI4ZWUxMTJkNzRjZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU4MjEyLCBkNGQ1ZDJhMTBlNzNmMWQwOTkxOTM1NWRjNGQ2M2Q0OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDE5OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5OHgxOTgKaW5kZXggZjQ1OGY1My4uOTMyM2U3YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDE5OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTh4MTk4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk4eDE5OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU4ODA2LCBlZTA3NjA2MTFkYTk5MzhlNzJmNTUxZDIxOTY3MWM3NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU4ODA2LCBjNTEyY2I4YTg2NGMyNTMxODI1NDQzOGM3MTcwZjM3MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIwMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5OHgyMDAKaW5kZXggMTc2YjlkOS4uYjdjMzQwZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIwMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTh4MjAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk4eDIwMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU5NDAwLCBmYjBlODE3MWIwZjkxZDliMmNlYjU0MzBkYjI3YTY3YgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU5NDAwLCA3M2YxMjFlNmFhMGU2MjkwY2ZkMDZhYzliMDMzYzc3MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIwMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5OHgyMDIKaW5kZXggMzcxYTg3NC4uNjVlMDk1ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIwMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTh4MjAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk4eDIwMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU5OTk0LCBmNWUxY2Y0Y2M1Njc0MmZhZGRkZjQyMTg5YTNmNjVlMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU5OTk0LCBmM2U4Y2EyYzhkZWIyOWE2YjViZmU0MTViMzljOTAxZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5OHgyMDgKaW5kZXggOTViMmUwNi4uOWIwYTc2ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTh4MjA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk4eDIwOAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYxNzc2LCBkNDViNTYxZjgxY2JmY2NhOGExZGRkYmMyYmY4Y2EzMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYxNzc2LCAzNjY0ZjYzYjJlNTllMzgwNjIyY2FhZGI3YTA1NTQ1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5OHgyMTAKaW5kZXggMWUyNzkwYS4uN2M4ODc4YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTh4MjEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk4eDIxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYyMzcwLCA4NTI1YTI3MTcwOTgyYzA1OWQ1OTA0YzFhZjNiNDNmYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYyMzcwLCBjNGViMzI5NzMzOTEzMzYwMzg0ZDM5MTdhNThmNmYzNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIyNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5OHgyMjQKaW5kZXggN2NjY2Y5Yi4uMDlkMjBiNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTh4MjI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk4eDIyNAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY2NTI4LCA1ZjY5MjMwYmZkOGJiNDg1YmQ4NTU1MmIxODMzOWZjMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY2NTI4LCBmNWMzNjU3NzRmYzFkMGJmZmQ1MDI1Y2UyZTkzMWFhZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIyNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTE5OHgyMjYKaW5kZXggODExMzZlNi4uOWZjYmNkNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMTk4eDIyNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0xOTh4MjI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTk4eDIyNgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY3MTIyLCA0MTJjMzNhOGZkNzFjOTllNjhlNjcwMWIwNTBiMTA3YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3MTIyLCA4ZTY5NDgzZmY4YTA5NDA5NmRkNTUwYjMwYmUyMGRkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDE5NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMHgxOTYKaW5kZXggNjcwZDExNS4uMzMyNmIyMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDE5NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDB4MTk2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDE5NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU4ODAwLCA2NTFhMDYyN2M2Y2RhZWU4YjQ2ZTFmOGM0MTIxYTM2OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU4ODAwLCAzZTYzMDc1MTQ4ZGYxNmY2OWM5MzNjZjZjNjNlMDc4YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDE5OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMHgxOTgKaW5kZXggZmQzNzUwNi4uNjZjY2QwYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDE5OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDB4MTk4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDE5OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU5NDAwLCBkNGIzNTc4ZDgwMGM3NDdiY2FiYWE0ODRhMTQwZmZiMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU5NDAwLCBhNDBmNmY4YzM4NGM1ZGMzZDU1NDZkOTYwYmI2ZDllNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIwMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMHgyMDAKaW5kZXggZDU4MDZhMS4uMjI2ZTMxYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIwMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDB4MjAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDIwMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYwMDAwLCBiMzM5ZjRlNTYzYWZhZGIyNWY0M2I4YzA1YjEyZGMwMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYwMDAwLCAzYmQ1MjgwZTdmYjQyNDAwMDg1YjBiMWRiYmExOTA1ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIwMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMHgyMDIKaW5kZXggM2Y2ZWU4Yi4uYmUwZmY1ZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIwMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDB4MjAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDIwMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYwNjAwLCBjNGExM2RmNDRlNjZmMDY5NjFkZDcyZmM5OTA0MzllOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYwNjAwLCA4MWM3M2I4ZDM4MDZhZDk2YWY4ZjQyMjkxNGEyNTNmOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMHgyMDgKaW5kZXggZWExY2IwYy4uMzYyMjYwOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDB4MjA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDIwOAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYyNDAwLCA3MDI3NDhiZWMxOGM1MDBkZDQxZDkzYWU3NGIxMWQ1NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYyNDAwLCA0ZmI1NDIxOTBkYWIyZmQ2NzM3MjRkNDc0NTFmZjZlZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMHgyMTAKaW5kZXggN2M0NTlkMi4uYzBkMTcyZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDB4MjEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDIxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYzMDAwLCAzMWVmNDRiZDEyYWU3MDJmMzA2YzU1ZWJhMTBkMmJhNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYzMDAwLCA4M2U5ZDkxM2Y1YWEwNThkNzlhODEwNDdjYTQ1ZTRhMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIyNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMHgyMjQKaW5kZXggMTlhNzg2Yy4uNzYwYzU5OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDB4MjI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDIyNAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY3MjAwLCAzMTVkNjk4NDdiZjc1MmE4NDIzMWEzNjgyNzhlYjBiNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3MjAwLCBkMjQ1NzM4Zjg2MjdmYzM0NWFiMzhhNTQ3YmM3ZDM1MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIyNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMHgyMjYKaW5kZXggZGQ3OTY3ZC4uZDRiZjQ3YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAweDIyNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDB4MjI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAweDIyNgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY3ODAwLCBlNDViNmI5ZGNlNGE4NTA5YjdkMjZiYzNjZmRmN2M4NgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3ODAwLCBkZGI5ZDUwMzNlY2ZhMmQ2ZTlhNTUwNWRjZTM3NGJkYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDE5NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMngxOTYKaW5kZXggMWFmN2M1OC4uZjQwZmRhOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDE5NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDJ4MTk2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAyeDE5NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU5Mzg4LCAxMjYxNDY2MTc5ZGY5NjA5OWU1OThlNDZjNTBmYTdjMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU5Mzg4LCBjYzBmZTM3M2NkMDM5OWNmMGM5NWVkZjkyZDlhYjAxZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDE5OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMngxOTgKaW5kZXggZDUxZWU5Ni4uMWE3NDczYyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDE5OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDJ4MTk4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAyeDE5OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDU5OTk0LCAxODFlZGM0ZWJlZWZmN2YwNTI3YjkzYjg0ZDVkOGVmYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDU5OTk0LCAxMzJjNzFiNjM0ZmI2N2VlZDUxZmNkZWYxNzc1YjZiMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIwMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMngyMDAKaW5kZXggZjc1ZTE5Mi4uNTEzZGJmNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIwMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDJ4MjAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAyeDIwMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYwNjAwLCAyMGM0MWQ0YTEyNzExODNkYmJjN2E0NGU2YjkwZWE4MAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYwNjAwLCBiZDhjMWZiYThkODc0MmY0ZDk4YjdkNTA5N2M4YzgyOApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIwMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMngyMDIKaW5kZXggYWY3Y2I5YS4uNTU5MWU1MSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIwMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDJ4MjAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAyeDIwMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYxMjA2LCA2MTBjZWY1MmQzNWU5YzY0MWYyYjhjMTA0ODljM2QxMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYxMjA2LCAxZjg0MDYyZTYwN2Q0Nzk4YjA1NDQ3MzlmZTBkYTk5YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMngyMDgKaW5kZXggY2M4NWQyNy4uNTkwOTI2NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDJ4MjA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAyeDIwOAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYzMDI0LCBkMjEyOGUyOTBiZTgxYmIwNzAwZWJlMTllM2ZhZWQ0ZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYzMDI0LCBkY2NhZWNiN2U0ZGRiN2U0MjI0MjIxYTY1OWFmMmE0MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMngyMTAKaW5kZXggZDUxZmNjNi4uZWRhNWExZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDJ4MjEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAyeDIxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYzNjMwLCBlNDY2M2EyOGNhYmJmZGQzODE1ZWZkYTJkMzhkZWJjYwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYzNjMwLCAzY2M3ZGJlYzY0ZTlmNjk3ZjQwZDc0MGE3MmMwOWZjNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIyNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMngyMjQKaW5kZXggMGEzNmJkMy4uMTAyNGZlOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDJ4MjI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAyeDIyNAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY3ODcyLCAxZDMxOGYwNTMxMGY2ZDQwNjQ2ZjIzYzYyYzdlYWZlNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3ODcyLCA0Mjg3MGJkNzNlMWEwYzVkODRiOTg2ZGIzZDI0ZjBmMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIyNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwMngyMjYKaW5kZXggNmJjMzFmOS4uMDU3MmVlYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjAyeDIyNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDJ4MjI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjAyeDIyNgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY4NDc4LCA1YWEwZjQzOWM1OGM2MzM1Y2Q4NmQ0MjM4YThjNGI2OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY4NDc4LCAzNjE2Y2MzMDZlYzA1Zjg5ZDliMGRiNjMyMDBlNGFiZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDE5NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwOHgxOTYKaW5kZXggYjA2NTU3Zi4uMzc3ZGQyNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDE5NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDh4MTk2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDE5NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYxMTUyLCA2MTk1OTc1MTgxOTY5Nzg5ZTEwMWE4M2E1NTVkMTNmNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYxMTUyLCAyYWNhNWUzMzA3ZDY4YTVlOTY5NTY0YTk0M2I4ZTcyMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDE5OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwOHgxOTgKaW5kZXggODRkYTdkZC4uNDg2ZjhkMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDE5OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDh4MTk4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDE5OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYxNzc2LCAxZjFmYTNjZGY4NjVkOGM3NTE4M2Y0YmE2MjAzYjY3NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYxNzc2LCBlYWQzM2VhZDhmZWE1YmQ1ZDgzMWE3OWY0Yzc1YTU5MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIwMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwOHgyMDAKaW5kZXggMDk0M2FiZi4uNDBkNWQ0NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIwMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDh4MjAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDIwMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYyNDAwLCBmZjJkZGEzZGRiZThiNDYxZDk2MGJhYmEwYWQxMzJiZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYyNDAwLCBkNjkzNWFjOGYyMjUwMzE2ZjQ5OGU4ZjAxYWZhMDRmZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIwMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwOHgyMDIKaW5kZXggYjE4MTIyNC4uZjdjNThlMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIwMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDh4MjAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDIwMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYzMDI0LCBlNTE2NGY4N2ZlYWRmNGI2NTI1N2Y1NzhhZmZjM2UwNAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYzMDI0LCA2YWVlNWEzYjZjM2EwOTZkZmMxNTk0NzYyYjJiMjQ4ZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwOHgyMDgKaW5kZXggN2JjYmZkYy4uZmE1MDg4NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDh4MjA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDIwOAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY0ODk2LCA2YmZmN2MxZjRjNWVmODQxMmViZjY2OTg1MmM3MGRlNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY0ODk2LCBmZGZkN2EyMzA4ZGU5NTA5YTQxZmVkMjg4MGE4ZjBmNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwOHgyMTAKaW5kZXggN2RiY2NmNi4uOTJmMjE2NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDh4MjEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDIxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY1NTIwLCBiMTVjN2U5OGRkZDEzNzIzN2IwNjJjYjUxNjY3NTIyZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY1NTIwLCAwMGM1OTRjNjhiMTllZjM5YTc5YTM4ZTg2ODUzZGM2NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIyNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwOHgyMjQKaW5kZXggNzBkNjRlYS4uMGQxN2E5YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDh4MjI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDIyNAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY5ODg4LCA0NzlkMDdiYjk2OTA1YWQ3ZDVmMGVjM2VlMTJiNDFiYQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY5ODg4LCA0YjY1NTVhYWVkOGU1YTQ1ODc5NzczZjFiZjg3OTYyZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIyNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIwOHgyMjYKaW5kZXggN2Q5MDIwYy4uMWU5YzI4NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjA4eDIyNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMDh4MjI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjA4eDIyNgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDcwNTEyLCAzM2FhNGFmNjE1MzU3MDUxOGM1OTk2MGEwYzk1OTA1MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDcwNTEyLCAwMjRmYTI3ZGVlODBhZDE5OTUyODA1MmFhYThkNDJjNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDE5NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIxMHgxOTYKaW5kZXggYTY4MTNiNC4uMjhkYjFkYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDE5NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMTB4MTk2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjEweDE5NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYxNzQwLCA1YzY5ZjgwZGE2NjdiZmQyMDM5NDk5NWU5M2U0Y2QyYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYxNzQwLCAxMzM2M2NkOGU1MmNhOGMxMDUzZGIxYzg0YzExMWJjOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDE5OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIxMHgxOTgKaW5kZXggYzE0ZDIwYy4uYjY3NmM3NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDE5OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMTB4MTk4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjEweDE5OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYyMzcwLCBkODNlZTI0MTNlNzAxYWU0MDVhMmI3NDg2M2Q0YzVhOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYyMzcwLCBmMmViYzBmN2RjMTcxZTBlNWQyOTExYzdlZTJkZjVlMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIwMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIxMHgyMDAKaW5kZXggODczNTI1Yi4uMDFmMTA5MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIwMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMTB4MjAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjEweDIwMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYzMDAwLCAyNDY1NTYwMjQ2YzFlZTI0ZDkzN2NiOWNiYzE0MjJmMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYzMDAwLCA4OTI2YjYyOGRjZGYyMTgyNTE2ODIyYzdkMGQ3NzhlYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIwMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIxMHgyMDIKaW5kZXggOTFlMjI5ZS4uNDI5MjRjNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIwMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMTB4MjAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjEweDIwMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDYzNjMwLCA1ZDAxODQ4YWVlMmIzMjRmMmUzNTY2MjdmOWMzOTUzMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDYzNjMwLCBiNjcxZmUzNGJjMGU1YTY4MmJhZmY5MjlkMjZlYTYyNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIxMHgyMDgKaW5kZXggYTc3YWM1Zi4uMGQyNzFiMiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMTB4MjA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjEweDIwOAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY1NTIwLCAxMTU2ZDMxOGMwMGQyOTljZjViZGM3ZTQ4NTk2NmRhYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY1NTIwLCBhODA5NGY4ZjFlN2UwNGU1NDI1MWJlZThjNGM4MDBjZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIxMHgyMTAKaW5kZXggZmE5ZjE1OC4uYmFjMGU5YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMTB4MjEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjEweDIxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY2MTUwLCBiNjU3MjVjNjg5NzhiZGFhYWZkZjczNWRmYmFmYTllMwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY2MTUwLCAzNWJlMmYxNmJkNWRlZGM5ZDNmN2EwMTZmMGQ3MTcwMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIyNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIxMHgyMjQKaW5kZXggMWUxZDIyNS4uMTdlYmU4YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMTB4MjI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjEweDIyNAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDcwNTYwLCBiYjkwM2I5MjZjNGIzNGFlMzM2ZTIxZDY1YWQ4ZmQyNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDcwNTYwLCBjNGMwYmMzYjExMjQ4N2U5OTRkMjIxNzY4MTdhY2UzYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIyNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIxMHgyMjYKaW5kZXggNTU2MzM2My4uY2ZhZGVhZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjEweDIyNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMTB4MjI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjEweDIyNgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDcxMTkwLCAwMzcwN2IyZjVjMzkyOTMzZjczMzZmMzgwNDIzYTBhMQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDcxMTkwLCBiMzg4NTUzYzc5NTczNTU1YTNiNjYwZjVlMzZkNGUzNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDE5NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNHgxOTYKaW5kZXggMTI3NWU5ZS4uZDhhMjUxOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDE5NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjR4MTk2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI0eDE5NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY1ODU2LCAzZmZjMDk2ZjFiNDJiNGQzMTlkNGE5ZWZiZWZjNzYyNQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY1ODU2LCA3OGIzNjU1ZDVjYWQzMGZhNmIyYzJkOGZkMjk0NjNkZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDE5OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNHgxOTgKaW5kZXggMzllMDgyNS4uZjEzMjg3NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDE5OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjR4MTk4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI0eDE5OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY2NTI4LCBjZjM1ZGZmYzgwOTQ2ZTg3YmI5ZDNlMThhYWI5ZDMyMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY2NTI4LCBhNzZhYzkyZjA1ZTliMDk3ZjhhYzU4ODJlMWZmZTY1NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIwMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNHgyMDAKaW5kZXggOGZiYzViMS4uYTM4ZDQxNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIwMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjR4MjAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI0eDIwMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY3MjAwLCAwODE5ZTZkNzE1YzliNGQ5NGYwNWY2M2E3Y2E4NjE5OQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3MjAwLCA5YjlhNGIwMWVkNGM4YTkzNjg3ZTQ1MjQ1YjMwOTJhMwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIwMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNHgyMDIKaW5kZXggM2UyMTJhYy4uZGRmMDc2ZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIwMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjR4MjAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI0eDIwMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY3ODcyLCBlMWUzYjRhZjU5MTAzODNmZjZmNjZiNmFiMWEyOTU0NAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3ODcyLCA4NjY4ZWY5MmI3MmYzNTcyOGViYjQ1NjY2NWQ0OGI5NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNHgyMDgKaW5kZXggYTkyNWUxYS4uNThkODYxNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjR4MjA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI0eDIwOAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY5ODg4LCA4NWYwOGFmYWRmZDEyMDRkNDEzMWI5ZWU5YzhjYzEwYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY5ODg4LCBmODkzZGU1NDMyYTA4MmIzZGZmY2Y3NDk5ODI3ZjU0OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNHgyMTAKaW5kZXggM2M1OTQ1OS4uZDI0ZGM0YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjR4MjEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI0eDIxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDcwNTYwLCA0Mjc0MjFlNWZkMjA4N2M2ZmY3Yjg3YTI3OTgyMzMyZgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDcwNTYwLCBiNjgzMTFmZDQ0ZTE4OWU0MTc0YWMzNTdkNTQxNTA2OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIyNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNHgyMjQKaW5kZXggNjEwNTc4Yi4uODE4MzM2NCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjR4MjI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI0eDIyNAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc1MjY0LCBiZWRkNWQyNzI1ZmZmZjA2YTUwZTIzODQxYmMyZGZiOAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDc1MjY0LCA4YzM2M2Y2OGIwYjMwZjUwNzU2MzUxNmFhOTllMjNhYwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIyNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNHgyMjYKaW5kZXggODc0ZTU5NS4uYTVhNGFlNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI0eDIyNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjR4MjI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI0eDIyNgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc1OTM2LCBkY2E1NTZlNjQ4YTU3NmIzOTczZmJlNGIzNGQwMzI4YwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDc1OTM2LCAzNGE0OWU0YWJhNGFjYTVjNzZhYjBmNzUxMzQxYzMyYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDE5NiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNngxOTYKaW5kZXggNDNkNTViOS4uZjg1YmZiOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDE5NgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjZ4MTk2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI2eDE5NgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY2NDQ0LCA0NzU3YTMxODQyNDUzZjgwNmRlMmYyMjU2MzI5NTQ3ZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY2NDQ0LCBmZTVmYjk1NWE0MTQzMDkxYzViZmFlN2M0YTRhZmUwZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDE5OCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNngxOTgKaW5kZXggZmUyYzQ3Ny4uZGNiMDg1MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDE5OAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjZ4MTk4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI2eDE5OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY3MTIyLCBiOTcwODdlYjhjNTNjZjU2ZGM0NDU3NjkxMjY1NGZiMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3MTIyLCAyMTliYjY4YTU5ZGMxNjY4MDZhNWI1Njg5YTk0M2I2NgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIwMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNngyMDAKaW5kZXggYjE2YzUzMS4uNzYyMmYyOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIwMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjZ4MjAwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI2eDIwMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY3ODAwLCAwYWUyN2RiMzM4ZjczZjM3ZWFlZDgwNmIxYzc4OTU5MwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY3ODAwLCAzZjY5MjczNzUyZjQzNjk5YTNiYzdiMjJhODhjYzNhYQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIwMiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNngyMDIKaW5kZXggODE4MDM4ZC4uYjhhMjE3YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIwMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjZ4MjAyCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI2eDIwMgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY4NDc4LCAwY2QyODc2NjQwZTcxZGUzYTZkZjc4MzliZDZmMGI1MQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDY4NDc4LCBmODg3ZGI2ODM5YzBjZGRkMWVhOWFlNmJmZDJjYzE2ZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIwOCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNngyMDgKaW5kZXggY2RhNmY5OS4uY2RmMTExMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIwOAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjZ4MjA4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI2eDIwOAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDcwNTEyLCA2MDA2Y2FjNjYyOGNmOWU3Y2VhNThhZWMwNzQ3MWIwNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDcwNTEyLCBmN2U5OTQ5MjEyNDhiNjkzMzkyMGM5ODQ4ODBlYzk2YwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIxMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNngyMTAKaW5kZXggZmE4M2UxZC4uZTkwM2U4MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIxMAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjZ4MjEwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI2eDIxMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDcxMTkwLCBhNmMxYjc2ODYyMDJmNWNjNjQzMzVmOTJiZTU5NTMwOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDcxMTkwLCAzZTU3M2Q0YzY5M2EzOWM1ZDZjZDQ2Yjg4NzNlOTliYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIyNCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNngyMjQKaW5kZXggNTBkODFjYi4uNDI1NDkwZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIyNAorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjZ4MjI0CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI2eDIyNAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc1OTM2LCA4MGZiM2E2NDMzODQzODZiZWFkYzA5OTFmMTcxNjY5ZAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDc1OTM2LCA2NWE0YTUxMTYzZjQ5YTc1ZjhlZWVjZDk0Y2IyYmE0NwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIyNiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wMy1zaXplLTIyNngyMjYKaW5kZXggODhiM2M0My4uNWMyOTFlNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTAzLXNpemUtMjI2eDIyNgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDMtc2l6ZS0yMjZ4MjI2CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMTAwMS8zMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMjI2eDIyNgorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc2NjE0LCBmMjM3MGZjODAyZGFmZGY1MDgyYmVmZmMxOTA3YTljNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDc2NjE0LCBhYWQ2ZGU3Yjk4NjIzNGExZDYyMTkzNWIyNzI1MDFjOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTA1LXJlc2l6ZSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wNS1yZXNpemUKaW5kZXggNGEzY2QwOS4uNmI4ODIzZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTA1LXJlc2l6ZQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDUtcmVzaXplCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAwLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCA1MzllOTk2NDM2NGMxZGIwOWFkMThmMmUwMTcxMzc5OQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTUyMDY0LCBmYjc2ZTY3M2JhMmE1MzQyYmZlZDhhMTUyM2UwYTQyNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTA2LWJpbGluZWFyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTA2LWJpbGluZWFyCmluZGV4IGIxNzUxOTUuLjc3MzY5ZjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wNi1iaWxpbmVhcgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMDYtYmlsaW5lYXIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDgxOGE1YWY1MzFjOTIxYWU1OGRmZWRjNzUyMzRmM2M1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIGY4NjNmOGM2OGI1Yzg3YzcyMWQzNDVjNWE4OTQzMzZkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMDktbGZfZGVsdGFzIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTA5LWxmX2RlbHRhcwppbmRleCA3MzNhNzBjLi4yNzgzOTVmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktMDktbGZfZGVsdGFzCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0wOS1sZl9kZWx0YXMKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4MjQwCisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMjY3MjAsIGE4M2M3ZjQ2MDJmNTk1ZmQwOWU5N2Y4YzhhNzI3N2VjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxMjY3MjAsIDUzZTFhM2ZkNDQ5MzI4ODNhOGRkMTEyYmJiMGUzNTlmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMTAtc2hvdy1leGlzdGluZy1mcmFtZSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0xMC1zaG93LWV4aXN0aW5nLWZyYW1lCmluZGV4IDZhMmM5MDQuLmFlZWQ0NGEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0xMC1zaG93LWV4aXN0aW5nLWZyYW1lCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0xMC1zaG93LWV4aXN0aW5nLWZyYW1lCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzUyeDI4OAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMTUyMDY0LCAxODk4MTM0MmVjMTc4ZTA4MjUxOTQ1MTA2MmMzYTY3ZgogMCwgICAgICAgICAgMywgICAgICAgICAgMywgICAgICAgIDEsICAgMTUyMDY0LCAwNGFiOWRiZWFjNDllYzMxYmU1OGY2ZTY3MTY5OGUwNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTEwLXNob3ctZXhpc3RpbmctZnJhbWUyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTEwLXNob3ctZXhpc3RpbmctZnJhbWUyCmluZGV4IGIwZmE2NjkuLmM5M2EwOWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0xMC1zaG93LWV4aXN0aW5nLWZyYW1lMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktMTAtc2hvdy1leGlzdGluZy1mcmFtZTIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzMwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIDM4MmIxMmMzM2NkODZiMzg3NTg3MDZiOGViY2E4YTg1CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIDc5OTU0NDM3MGIzNWM5MTcxMWE1YjQ5YTI4Y2Y4NmE4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMTUtc2Vna2V5X2FkcHEgYi90ZXN0cy9yZWYvZmF0ZS92cDktMTUtc2Vna2V5X2FkcHEKaW5kZXggZjEyZGI4Yi4uNGU0YWRhZCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTE1LXNlZ2tleV9hZHBxCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0xNS1zZWdrZXlfYWRwcQpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDg1Mng0ODAKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDYxMzQ0MCwgZDRmMGU0YjYwNmRkYjQwYjQ4MmFlY2IyNGNmM2JjNjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDYxMzQ0MCwgNjkyZWMwOTJiYzU5MjhmYTY0MzBkMDU2ZTg4Mzc1OWEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS0xNi1pbnRyYS1vbmx5IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTE2LWludHJhLW9ubHkKaW5kZXggMWU4ZDI4MC4uYTMzZTYyZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTE2LWludHJhLW9ubHkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LTE2LWludHJhLW9ubHkKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxMDAxLzMwMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzNTJ4Mjg4Cisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTIwNjQsIGQ1NzUyOTYwMTE3ODk0OGFmYTQ4MThjM2M4OTM4ODg0CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAxNTIwNjQsIGQ0N2UwMDI1MGM0NTczM2Q2NGFmMDY3YTQxN2JjZDA2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDktMnBhc3MtYWtpeW8gYi90ZXN0cy9yZWYvZmF0ZS92cDktMnBhc3MtYWtpeW8KaW5kZXggMmYzMjA5Mi4uNTljNTQyOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5LTJwYXNzLWFraXlvCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS0ycGFzcy1ha2l5bwpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgMDQzY2UwNjVhMzA5NTE0ZTFlOGViZGNiYjNjMjQ1OGIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgODU3OWM5Y2ZmZDk1YjExZGI4NjE1OGU1MThiMmUzNGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS1wYXJhbGxlbG1vZGUtYWtpeW8gYi90ZXN0cy9yZWYvZmF0ZS92cDktcGFyYWxsZWxtb2RlLWFraXlvCmluZGV4IDk2NjhjNTQuLmRmMzE4NjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS1wYXJhbGxlbG1vZGUtYWtpeW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LXBhcmFsbGVsbW9kZS1ha2l5bwpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgZjViYzYwMmRiMTVjNjk1NDUzMDdlNTY5OTBmOWY5ZjcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgYjU2NDI4YjZmOTc2Njk5MzhjOGI5YjA1NDU4ZmNhNzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS1zZWdtZW50YXRpb24tYXEtYWtpeW8gYi90ZXN0cy9yZWYvZmF0ZS92cDktc2VnbWVudGF0aW9uLWFxLWFraXlvCmluZGV4IDVjOTMxYjYuLmRlYjVhYzUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS1zZWdtZW50YXRpb24tYXEtYWtpeW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LXNlZ21lbnRhdGlvbi1hcS1ha2l5bwpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgYjIwOGVhYzEyZjBhZTc0YTgxMmJjOWUzMTRiZGZhYzcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgZWJiMjI1OTQ1MWMzYWNmM2FkNjM3OWQxZjQwOTJlZmIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS1zZWdtZW50YXRpb24tc2YtYWtpeW8gYi90ZXN0cy9yZWYvZmF0ZS92cDktc2VnbWVudGF0aW9uLXNmLWFraXlvCmluZGV4IDBmZGIzZjIuLjA4ZjEzMDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS1zZWdtZW50YXRpb24tc2YtYWtpeW8KKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LXNlZ21lbnRhdGlvbi1zZi1ha2l5bwpAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEwMDEvMzAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE1MjA2NCwgZjRlMDRhMGY5MmZhYjNhNTJkODU4YmIyMjI4MDdhYzAKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE1MjA2NCwgNDkzY2I5NmI4MjAyYTE1MThjNmM5YmRiODQ4NTQwZTQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS10aWxpbmctcGVkZXN0cmlhbiBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS10aWxpbmctcGVkZXN0cmlhbgppbmRleCAyOTE1MzIzLi40YjI1YTI5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktdGlsaW5nLXBlZGVzdHJpYW4KKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LXRpbGluZy1wZWRlc3RyaWFuCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8xMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxOTIweDEwODAKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAwLCAgMzExMDQwMCwgMWU2YzJlNzY4YTUxMDdlNTdlNmQ2MjZmMDUxMTE5M2EKIDAsICAgICAgICAgNDAsICAgICAgICAgNDAsICAgICAgICAwLCAgMzExMDQwMCwgOTcyZDNlMmI1ZWUyZTNiMDkwNzIxOGEyNDNlNGNiN2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS10cmFjMzg0OSBiL3Rlc3RzL3JlZi9mYXRlL3ZwOS10cmFjMzg0OQppbmRleCA0ZDEyOWIzLi42ZDY1ODRhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDktdHJhYzM4NDkKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5LXRyYWMzODQ5CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8zMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNjQweDM2MAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgMzQ1NjAwLCBjMmVlMzBjYjQ1MjlmY2JkNjE5MzhhZjE4ODdlMmI0NQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzQ1NjAwLCA5NDZlOWJmZWUwMzc3N2EwN2MxMjJkZjAzODA4N2Q5MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5LXRyYWM0MzU5IGIvdGVzdHMvcmVmL2ZhdGUvdnA5LXRyYWM0MzU5CmluZGV4IGNkMjcxYTcuLjBmNTBjZmYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOS10cmFjNDM1OQorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDktdHJhYzQzNTkKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjgweDcyMAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAxMzgyNDAwLCAyOTI5ZTUzMThlZGVlNmNkNmIyNGVkZTBjMTAxNTEzNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAxMzgyNDAwLCBjYTBkODNiMDQyOTdkYTMzYTFhYTE3MTI5YTlmZTljOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5cDEtMDQteXV2NDIyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5cDEtMDQteXV2NDIyCmluZGV4IDU5YWJmYjAuLjMzNDBlNzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOXAxLTA0LXl1djQyMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDlwMS0wNC15dXY0MjIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzUwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNjB4OTAKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAyODgwMCwgYjgxYjhhODQ0NGFjNmNlNGE0ODA3YzM3ZTBhNDRjOGIKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAyODgwMCwgMzQ0NDU4YjgyZDM1ZWE5OTQ0ZGM4NDE2NDNmYzI1YzIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOXAxLTA0LXl1djQ0MCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOXAxLTA0LXl1djQ0MAppbmRleCAwYzI4ZjM2Li4xN2M5Zjk5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDlwMS0wNC15dXY0NDAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5cDEtMDQteXV2NDQwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS81MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDkwCisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMjg4MDAsIDYxMTU3YWQ0ZmIwMmEyNTRkZThmMzRhZTdiODkxNWRjCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgMjg4MDAsIDk0MzEzMzczODJiZjkwZDQwYWE0MTdlMjk3YWMwNWRhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDlwMS0wNC15dXY0NDQgYi90ZXN0cy9yZWYvZmF0ZS92cDlwMS0wNC15dXY0NDQKaW5kZXggZTk1NTljNi4uYjdlNTYwMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5cDEtMDQteXV2NDQ0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOXAxLTA0LXl1djQ0NApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyODgKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDMwNDEyOCwgODU5ZGY3YjM2NjE3ODNlMzM3YTE2ZWU3OWYzYzIwYmMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDMwNDEyOCwgM2IzY2NmMzQ0Y2Q1YTQ3OGM0YzFmYTQyMjQ5NzE4M2QKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOXAyLTIwLTEwYml0LXl1djQyMCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOXAyLTIwLTEwYml0LXl1djQyMAppbmRleCAyOTdhMTc4Li41MzViZDc3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDlwMi0yMC0xMGJpdC15dXY0MjAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5cDItMjAtMTBiaXQteXV2NDIwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS81MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDkwCisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNDMyMDAsIGMzOTY0ZWQ5MDY1ZGU3ZjgzOWI4ZDg3ODQ0NGM2MTQwCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNDMyMDAsIDg3NTk1ZjdmNTNkNmU4NGFmOTcwOGRiYTcyNDIyY2M0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDlwMi0yMC0xMmJpdC15dXY0MjAgYi90ZXN0cy9yZWYvZmF0ZS92cDlwMi0yMC0xMmJpdC15dXY0MjAKaW5kZXggMWJhMDA5NC4uZTgwODU5YiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5cDItMjAtMTJiaXQteXV2NDIwCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOXAyLTIwLTEyYml0LXl1djQyMApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvNTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2MHg5MAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQzMjAwLCA4NDAzYmQ1YTM4MTczN2UxYzJkNzM3MDQ3ZjZhNWEwYgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDQzMjAwLCAzYzBiZjdlZWNjMzEzMWUzNTk4ZjY4MTBkNmI3MDUzOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5cDMtMjAtMTBiaXQteXV2NDIyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5cDMtMjAtMTBiaXQteXV2NDIyCmluZGV4IDVhYWYwNTYuLjUzZDdlNjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOXAzLTIwLTEwYml0LXl1djQyMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDlwMy0yMC0xMGJpdC15dXY0MjIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzUwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNjB4OTAKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA1NzYwMCwgMThmZWQzZWZmNjIzZjAzMDg1NjFlNWRiMGJjMjg2OTEKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA1NzYwMCwgM2YyMmIyMjY5Y2Q1MzczOGU5NTVjNGIyN2ZmNmFiY2UKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOXAzLTIwLTEwYml0LXl1djQ0MCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOXAzLTIwLTEwYml0LXl1djQ0MAppbmRleCBjZDNmMzgzLi44YjU0MTZlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDlwMy0yMC0xMGJpdC15dXY0NDAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5cDMtMjAtMTBiaXQteXV2NDQwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS81MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDkwCisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNTc2MDAsIDUwNGEzNDc2NTRlZjQxZTU2OGM0ODRhYjAxN2Y1Mzg3CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNTc2MDAsIDYxMTBmMTUxYTM5MTQ0ZGE1NjE2MjI3ZDQ0YjgxYzIxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDlwMy0yMC0xMGJpdC15dXY0NDQgYi90ZXN0cy9yZWYvZmF0ZS92cDlwMy0yMC0xMGJpdC15dXY0NDQKaW5kZXggY2EyMThiOC4uODg5NjE4NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5cDMtMjAtMTBiaXQteXV2NDQ0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOXAzLTIwLTEwYml0LXl1djQ0NApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvNTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2MHg5MAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDg2NDAwLCAwNmE0YzQ1NTBkYzMxZjc1Zjg0MmE0ZTY1ZmMzMjM5OAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDg2NDAwLCBmN2ZlZGExNWQ1YzJiYWJjMWY2NDM4YzcyZDQ5MDBlNApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnA5cDMtMjAtMTJiaXQteXV2NDIyIGIvdGVzdHMvcmVmL2ZhdGUvdnA5cDMtMjAtMTJiaXQteXV2NDIyCmluZGV4IDFhOGE4M2IuLmVkNGFmMjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZwOXAzLTIwLTEyYml0LXl1djQyMgorKysgYi90ZXN0cy9yZWYvZmF0ZS92cDlwMy0yMC0xMmJpdC15dXY0MjIKQEAgLTEsNyArMSwxMSBAQAogI2Zvcm1hdDogZnJhbWUgY2hlY2tzdW1zCi0jdmVyc2lvbjogMQorI3ZlcnNpb246IDIKICNoYXNoOiBNRDUKICN0YiAwOiAxLzUwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNjB4OTAKKyNzYXIgMDogMS8xCiAjc3RyZWFtIywgZHRzLCAgICAgICAgcHRzLCBkdXJhdGlvbiwgICAgIHNpemUsIGhhc2gKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICA1NzYwMCwgNDQyYTZkOTMyYTE2MzkwNzMwM2YxZTA4MDU2YjMzYjMKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICA1NzYwMCwgODBiMjE5NTRlYjUyMmYwMTQwZTIyMjZhMDMwNjI4MzkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZwOXAzLTIwLTEyYml0LXl1djQ0MCBiL3Rlc3RzL3JlZi9mYXRlL3ZwOXAzLTIwLTEyYml0LXl1djQ0MAppbmRleCBmNmU0Y2YxLi42MGQ1YzU4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cDlwMy0yMC0xMmJpdC15dXY0NDAKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnA5cDMtMjAtMTJiaXQteXV2NDQwCkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS81MAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTYweDkwCisjc2FyIDA6IDEvMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgNTc2MDAsIDljMDNmYjRhYTgxMzUyMmQ5YTQ0YjNiMzA5Yjg1ZDE5CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNTc2MDAsIDczMDgxYmVhZmExN2JjMjNhMTcwMTcyZTMxMWMwZjU0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS92cDlwMy0yMC0xMmJpdC15dXY0NDQgYi90ZXN0cy9yZWYvZmF0ZS92cDlwMy0yMC0xMmJpdC15dXY0NDQKaW5kZXggMmU1MzIyMS4uOWIzYjE2MyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvdnA5cDMtMjAtMTJiaXQteXV2NDQ0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3ZwOXAzLTIwLTEyYml0LXl1djQ0NApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvNTAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2MHg5MAorI3NhciAwOiAxLzEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDg2NDAwLCBkOTUwMGEyYzllMGI2YjQ0OTM1ZGUwMTljMzU4MzE5NAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgIDg2NDAwLCA1OGVkZjNlNjliMzMyYTJiNjJjYTc4YThkYzk5ZWE2OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvdnFhLWNjIGIvdGVzdHMvcmVmL2ZhdGUvdnFhLWNjCmluZGV4IDg5NTBmOTQuLmZkN2JjNzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ZxYS1jYworKysgYi90ZXN0cy9yZWYvZmF0ZS92cWEtY2MKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5MjAwMCwgMHgwMDAwMDAwMAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTkyMDAwLCAweDAwMDAwMDAwCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTIwMDAsIDB4MDAwMDAwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ZxZi1kZW11eCBiL3Rlc3RzL3JlZi9mYXRlL3ZxZi1kZW11eAppbmRleCAzYzFkZDM1Li5kNzY4ZGRiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS92cWYtZGVtdXgKKysrIGIvdGVzdHMvcmVmL2ZhdGUvdnFmLWRlbXV4CkBAIC0xICsxIEBACi0wODRhOWJmOTJkNDA5NmM4MTU2ZDFmY2U1MGRhYzhiOAorNWY0Y2Q5YTZhOGJlYTAwNDBkYjY3MzJhNzgzMGU5ZDcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3dhdi1hYzMgYi90ZXN0cy9yZWYvZmF0ZS93YXYtYWMzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOWUxNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS93YXYtYWMzCkBAIC0wLDAgKzEsNDggQEAKKyN0YiAwOiAxLzQ0MTAwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IGFjMworI3NhbXBsZV9yYXRlIDA6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMDogNjBmCisjY2hhbm5lbF9sYXlvdXRfbmFtZSAwOiA1LjEoc2lkZSkKKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxNTM2LCAgICAgMjc4NiwgMHhlMmZkMGY0MAorMCwgICAgICAgMTUzNiwgICAgICAgMTUzNiwgICAgIDE1MzYsICAgICAyNzg2LCAweDdhNjIwN2MyCiswLCAgICAgICAzMDcyLCAgICAgICAzMDcyLCAgICAgMTUzNiwgICAgIDI3ODYsIDB4N2E2MjA3YzIKKzAsICAgICAgIDQ2MDgsICAgICAgIDQ2MDgsICAgICAxNTM2LCAgICAgMjc4NiwgMHg3YTYyMDdjMgorMCwgICAgICAgNjE0NCwgICAgICAgNjE0NCwgICAgIDE1MzYsICAgICAyNzg2LCAweDdhNjIwN2MyCiswLCAgICAgICA3NjgwLCAgICAgICA3NjgwLCAgICAgMTUzNiwgICAgIDI3ODYsIDB4N2E2MjA3YzIKKzAsICAgICAgIDkyMTYsICAgICAgIDkyMTYsICAgICAxNTM2LCAgICAgMjc4NiwgMHg0MWJlMDM1ZQorMCwgICAgICAxMDc1MiwgICAgICAxMDc1MiwgICAgIDE1MzYsICAgICAyNzg2LCAweGM3OTkwNzJhCiswLCAgICAgIDEyMjg4LCAgICAgIDEyMjg4LCAgICAgMTUzNiwgICAgIDI3ODYsIDB4ZjVlYjA2MDMKKzAsICAgICAgMTM4MjQsICAgICAgMTM4MjQsICAgICAxNTM2LCAgICAgMjc4NiwgMHgzZDMzMGJiMgorMCwgICAgICAxNTM2MCwgICAgICAxNTM2MCwgICAgIDE1MzYsICAgICAyNzg2LCAweDk5MjIwNmQyCiswLCAgICAgIDE2ODk2LCAgICAgIDE2ODk2LCAgICAgMTUzNiwgICAgIDI3ODYsIDB4ODkwNTE4NzgKKzAsICAgICAgMTg0MzIsICAgICAgMTg0MzIsICAgICAxNTM2LCAgICAgMjc4NiwgMHhlNjI5MWE2YgorMCwgICAgICAxOTk2OCwgICAgICAxOTk2OCwgICAgIDE1MzYsICAgICAyNzg2LCAweDA3YzEzM2I0CiswLCAgICAgIDIxNTA0LCAgICAgIDIxNTA0LCAgICAgMTUzNiwgICAgIDI3ODYsIDB4NjFjNDJlMzUKKzAsICAgICAgMjMwNDAsICAgICAgMjMwNDAsICAgICAxNTM2LCAgICAgMjc4NiwgMHg5ZWM1NDJhZQorMCwgICAgICAyNDU3NiwgICAgICAyNDU3NiwgICAgIDE1MzYsICAgICAyNzg2LCAweDQyNTQ0ZTA2CiswLCAgICAgIDI2MTEyLCAgICAgIDI2MTEyLCAgICAgMTUzNiwgICAgIDI3ODYsIDB4MGM0OTVlNjIKKzAsICAgICAgMjc2NDgsICAgICAgMjc2NDgsICAgICAxNTM2LCAgICAgMjc4NiwgMHgwNjJmNzhiYworMCwgICAgICAyOTE4NCwgICAgICAyOTE4NCwgICAgIDE1MzYsICAgICAyNzg2LCAweDQ5N2E4YmU5CiswLCAgICAgIDMwNzIwLCAgICAgIDMwNzIwLCAgICAgMTUzNiwgICAgIDI3ODYsIDB4ZWRhZTk3OGUKKzAsICAgICAgMzIyNTYsICAgICAgMzIyNTYsICAgICAxNTM2LCAgICAgMjc4NiwgMHg3N2NmYWEwZgorMCwgICAgICAzMzc5MiwgICAgICAzMzc5MiwgICAgIDE1MzYsICAgICAyNzg2LCAweDE0NzFiNzkyCiswLCAgICAgIDM1MzI4LCAgICAgIDM1MzI4LCAgICAgMTUzNiwgICAgIDI3ODYsIDB4NzZiN2RhZjkKKzAsICAgICAgMzY4NjQsICAgICAgMzY4NjQsICAgICAxNTM2LCAgICAgMjc4NiwgMHhmYzg1ZjM1ZgorMCwgICAgICAzODQwMCwgICAgICAzODQwMCwgICAgIDE1MzYsICAgICAyNzg2LCAweGViZjgyMTNiCiswLCAgICAgIDM5OTM2LCAgICAgIDM5OTM2LCAgICAgMTUzNiwgICAgIDI3ODYsIDB4NTllNzNmNzcKKzAsICAgICAgNDE0NzIsICAgICAgNDE0NzIsICAgICAxNTM2LCAgICAgMjc4NiwgMHg5ODYxNTg5OQorMCwgICAgICA0MzAwOCwgICAgICA0MzAwOCwgICAgIDE1MzYsICAgICAyNzg2LCAweGQ5ZmM2NDJjCiswLCAgICAgIDQ0NTQ0LCAgICAgIDQ0NTQ0LCAgICAgMTUzNiwgICAgIDI3ODYsIDB4MTAzNzhjN2MKKzAsICAgICAgNDYwODAsICAgICAgNDYwODAsICAgICAxNTM2LCAgICAgMjc4NiwgMHgxZDZhYmJiMQorMCwgICAgICA0NzYxNiwgICAgICA0NzYxNiwgICAgIDE1MzYsICAgICAyNzg2LCAweGJlMjhkMDA3CiswLCAgICAgIDQ5MTUyLCAgICAgIDQ5MTUyLCAgICAgMTUzNiwgICAgIDI3ODYsIDB4YTQyN2YyYzEKKzAsICAgICAgNTA2ODgsICAgICAgNTA2ODgsICAgICAxNTM2LCAgICAgMjc4NiwgMHhiNDMyMDNhMworMCwgICAgICA1MjIyNCwgICAgICA1MjIyNCwgICAgIDE1MzYsICAgICAyNzg2LCAweGNiNmQwZjJiCiswLCAgICAgIDUzNzYwLCAgICAgIDUzNzYwLCAgICAgMTUzNiwgICAgIDI3ODYsIDB4N2I4MzNkNWMKKzAsICAgICAgNTUyOTYsICAgICAgNTUyOTYsICAgICAxNTM2LCAgICAgMjc4NiwgMHgyNjQ3NzEwNQorMCwgICAgICA1NjgzMiwgICAgICA1NjgzMiwgICAgIDE1MzYsICAgICAyNzg2LCAweGVmMTY4MTRkCiswLCAgICAgIDU4MzY4LCAgICAgIDU4MzY4LCAgICAgMTUzNiwgICAgIDI3ODYsIDB4MmE0M2FlODYKKzAsICAgICAgNTk5MDQsICAgICAgNTk5MDQsICAgICAxNTM2LCAgICAgMjc4NiwgMHg1YWYxY2NiMworMCwgICAgICA2MTQ0MCwgICAgICA2MTQ0MCwgICAgIDE1MzYsICAgICAyNzg2LCAweDZmYTIwOTQxCiswLCAgICAgIDYyOTc2LCAgICAgIDYyOTc2LCAgICAgMTUzNiwgICAgIDI3ODYsIDB4NWQ0ZjMzNmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3djM21vdmllLXhhbiBiL3Rlc3RzL3JlZi9mYXRlL3djM21vdmllLXhhbgppbmRleCA1N2I3ZjcwLi4wNTJkYmJjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS93YzNtb3ZpZS14YW4KKysrIGIvdGVzdHMvcmVmL2ZhdGUvd2MzbW92aWUteGFuCkBAIC0xLDUgKzEsMTQgQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTY1Cisjc2FyIDA6IDAvMQogI3RiIDE6IDEvMjIwNTAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogcGNtX3MxNmxlCisjc2FtcGxlX3JhdGUgMTogMjIwNTAKKyNjaGFubmVsX2xheW91dCAxOiA0CisjY2hhbm5lbF9sYXlvdXRfbmFtZSAxOiBtb25vCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxNTg0MDAsIDB4MjVhZWM3ODEKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAxNDcwLCAgICAgMjk0MCwgMHg5MmNlZTJhNgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTU4NDAwLCAweGRhNGRiZjcwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93ZWJtLWRhc2gtbWFuaWZlc3QtbGl2ZS1iYW5kd2lkdGggYi90ZXN0cy9yZWYvZmF0ZS93ZWJtLWRhc2gtbWFuaWZlc3QtbGl2ZS1iYW5kd2lkdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThiODk1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3dlYm0tZGFzaC1tYW5pZmVzdC1saXZlLWJhbmR3aWR0aApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPE1QRAorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4bWxucz0idXJuOm1wZWc6REFTSDpzY2hlbWE6TVBEOjIwMTEiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0idXJuOm1wZWc6REFTSDpzY2hlbWE6TVBEOjIwMTEiCisgIHR5cGU9ImR5bmFtaWMiCisgIG1pbkJ1ZmZlclRpbWU9IlBUMVMiCisgIHByb2ZpbGVzPSJ1cm46bXBlZzpkYXNoOnByb2ZpbGU6aXNvZmYtbGl2ZToyMDExIgorICBhdmFpbGFiaWxpdHlTdGFydFRpbWU9IiIKKyAgdGltZVNoaWZ0QnVmZmVyRGVwdGg9IlBUNzIwMFMiCisgIG1pbmltdW1VcGRhdGVQZXJpb2Q9IlBUNjBTIj4KKzxQZXJpb2QgaWQ9IjAiIHN0YXJ0PSJQVDBTIiA+Cis8QWRhcHRhdGlvblNldCBpZD0iMCIgbWltZVR5cGU9InZpZGVvL3dlYm0iIGNvZGVjcz0idnA5IiBiaXRzdHJlYW1Td2l0Y2hpbmc9InRydWUiIHN1YnNlZ21lbnRBbGlnbm1lbnQ9InRydWUiIHN1YnNlZ21lbnRTdGFydHNXaXRoU0FQPSIxIj4KKzxDb250ZW50Q29tcG9uZW50IGlkPSIxIiB0eXBlPSJ2aWRlbyIvPgorPFNlZ21lbnRUZW1wbGF0ZSB0aW1lc2NhbGU9IjEwMDAiIGR1cmF0aW9uPSI1MDAwIiBtZWRpYT0iZGFzaF9saXZlX3ZpZGVvXyRSZXByZXNlbnRhdGlvbklEJF8kTnVtYmVyJC5jaGsiIHN0YXJ0TnVtYmVyPSIxIiBpbml0aWFsaXphdGlvbj0iZGFzaF9saXZlX3ZpZGVvXyRSZXByZXNlbnRhdGlvbklEJC5oZHIiLz4KKzxSZXByZXNlbnRhdGlvbiBpZD0iMzYwIiBiYW5kd2lkdGg9IjEwMCIgd2lkdGg9IjY0MCIgaGVpZ2h0PSIzNjAiIGNvZGVjcz0idnA5IiBtaW1lVHlwZT0idmlkZW8vd2VibSIgc3RhcnRzV2l0aFNBUD0iMSI+PC9SZXByZXNlbnRhdGlvbj4KKzwvQWRhcHRhdGlvblNldD4KKzxBZGFwdGF0aW9uU2V0IGlkPSIxIiBtaW1lVHlwZT0iYXVkaW8vd2VibSIgY29kZWNzPSJ2b3JiaXMiIGJpdHN0cmVhbVN3aXRjaGluZz0idHJ1ZSIgc3Vic2VnbWVudEFsaWdubWVudD0idHJ1ZSIgc3Vic2VnbWVudFN0YXJ0c1dpdGhTQVA9IjEiPgorPENvbnRlbnRDb21wb25lbnQgaWQ9IjEiIHR5cGU9ImF1ZGlvIi8+Cis8U2VnbWVudFRlbXBsYXRlIHRpbWVzY2FsZT0iMTAwMCIgZHVyYXRpb249IjUwMDAiIG1lZGlhPSJkYXNoX2xpdmVfYXVkaW9fJFJlcHJlc2VudGF0aW9uSUQkXyROdW1iZXIkLmNoayIgc3RhcnROdW1iZXI9IjEiIGluaXRpYWxpemF0aW9uPSJkYXNoX2xpdmVfYXVkaW9fJFJlcHJlc2VudGF0aW9uSUQkLmhkciIvPgorPFJlcHJlc2VudGF0aW9uIGlkPSIxNzEiIGJhbmR3aWR0aD0iMjAwIiBhdWRpb1NhbXBsaW5nUmF0ZT0iMzIwMDAiIGNvZGVjcz0idm9yYmlzIiBtaW1lVHlwZT0iYXVkaW8vd2VibSIgc3RhcnRzV2l0aFNBUD0iMSI+PC9SZXByZXNlbnRhdGlvbj4KKzwvQWRhcHRhdGlvblNldD4KKzwvUGVyaW9kPgorPC9NUEQ+CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYi1sZW5hLWxvc3NsZXNzIGIvdGVzdHMvcmVmL2ZhdGUvd2VicC1yZ2ItbGVuYS1sb3NzbGVzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA3MTVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvd2VicC1yZ2ItbGVuYS1sb3NzbGVzcwpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDY1NTM2LCAweGRmY2QwMWFlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYi1sZW5hLWxvc3NsZXNzLXJnYjI0IGIvdGVzdHMvcmVmL2ZhdGUvd2VicC1yZ2ItbGVuYS1sb3NzbGVzcy1yZ2IyNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjhmNTUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvd2VicC1yZ2ItbGVuYS1sb3NzbGVzcy1yZ2IyNApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMjh4MTI4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDQ5MTUyLCAweGUwMDEzZGVlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYi1sb3NzbGVzcyBiL3Rlc3RzL3JlZi9mYXRlL3dlYnAtcmdiLWxvc3NsZXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmRmZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYi1sb3NzbGVzcwpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMzg0LCAweGUzMGQxYjAxCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYi1sb3NzeS1xODAgYi90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYi1sb3NzeS1xODAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYxZDc1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3dlYnAtcmdiLWxvc3N5LXE4MApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMTQ0LCAweGYzOGI1MzA3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYmEtbG9zc2xlc3MgYi90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYmEtbG9zc2xlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI2NTRhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3dlYnAtcmdiYS1sb3NzbGVzcwpAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMzg0LCAweGJkMzVlMGU2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93ZWJwLXJnYmEtbG9zc3ktcTgwIGIvdGVzdHMvcmVmL2ZhdGUvd2VicC1yZ2JhLWxvc3N5LXE4MApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMyYWEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvd2VicC1yZ2JhLWxvc3N5LXE4MApAQCAtMCwwICsxLDYgQEAKKyN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxMng4Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMjQwLCAweGM1NmM5NmMzCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93ZXN0d29vZC1hdWQgYi90ZXN0cy9yZWYvZmF0ZS93ZXN0d29vZC1hdWQKaW5kZXggOWZhYjI0MS4uYjcxOWM1MCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvd2VzdHdvb2QtYXVkCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3dlc3R3b29kLWF1ZApAQCAtMSw0ICsxLDkgQEAKICN0YiAwOiAxLzIyMDUwCisjbWVkaWFfdHlwZSAwOiBhdWRpbworI2NvZGVjX2lkIDA6IGFkcGNtX2ltYV93cworI3NhbXBsZV9yYXRlIDA6IDIyMDUwCisjY2hhbm5lbF9sYXlvdXQgMDogNAorI2NoYW5uZWxfbGF5b3V0X25hbWUgMDogbW9ubwogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgIDEwMjQsICAgICAgNTEyLCAweDY2OTRjYzU1CiAwLCAgICAgICAxMDI0LCAgICAgICAxMDI0LCAgICAgMTAyNCwgICAgICA1MTIsIDB4ZGJjNWNiMjIKIDAsICAgICAgIDIwNDgsICAgICAgIDIwNDgsICAgICAxMDI0LCAgICAgIDUxMiwgMHg4ZTViY2JmZApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvd212My1kcm0tZGVjIGIvdGVzdHMvcmVmL2ZhdGUvd212My1kcm0tZGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDJiNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvZmF0ZS93bXYzLWRybS1kZWMKQEAgLTAsMCArMSwxMzQgQEAKKyN0YiAwOiAxLzI0CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTc2Cisjc2FyIDA6IDAvMQorMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDg0NDgwLCAweDc3NjBhMDBiCiswLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmUzOWExZGIKKzAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgICA4NDQ4MCwgMHhkNzE5NjFiNAorMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgIDg0NDgwLCAweGM4MGRlZGJhCiswLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4MzRkOGI1MzgKKzAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgICA4NDQ4MCwgMHgxYTg2YjhlNQorMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgIDg0NDgwLCAweGFiZjdjMjVkCiswLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4OTEyNjAwZWUKKzAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgICA4NDQ4MCwgMHg3ZWU3YzcwYgorMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgIDg0NDgwLCAweDA5YzViMGQxCiswLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NmRiZTZjMGMKKzAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgICA4NDQ4MCwgMHgwZmUwYTEyMAorMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgIDg0NDgwLCAweDIzNTJkM2EyCiswLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4YjIyY2U5MmUKKzAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzMWRiMDA5OQorMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgIDg0NDgwLCAweGFkMmRkNzNhCiswLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YjlhZjhlMjAKKzAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgICA4NDQ4MCwgMHg3Yjk1NjU0OQorMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgIDg0NDgwLCAweDNmNzc0Yjg3CiswLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ODI0YTIzYTMKKzAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgICA4NDQ4MCwgMHg0NDY5YThkOAorMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgIDg0NDgwLCAweGM4MGM3YTBhCiswLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAgODQ0ODAsIDB4Y2Y5NTg1NDkKKzAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgICA4NDQ4MCwgMHg0NDk3NDZlMworMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgIDg0NDgwLCAweGJhYzY2YTgyCiswLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICAgODQ0ODAsIDB4OTllODU4NTUKKzAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhNGExN2QxNworMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgIDg0NDgwLCAweGUyOWM3NTg3CiswLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NTUxZGU1OTIKKzAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgICA4NDQ4MCwgMHhlMDg3N2JjZQorMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgIDg0NDgwLCAweDk2NjBlYjM1CiswLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4MGEzNGI2NDQKKzAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzNTI5MTlmMAorMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgIDg0NDgwLCAweGVmNTZjZTI3CiswLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4MDMwZmU4NjIKKzAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgICA4NDQ4MCwgMHgyZWJhMzNlMgorMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgIDg0NDgwLCAweDI0MmRlNDAxCiswLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YmFkZDYxY2EKKzAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgICA4NDQ4MCwgMHgyMDYwNDY1YgorMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgIDg0NDgwLCAweDI1NmU2OTY1CiswLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4MjQzYjcwODQKKzAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgICA4NDQ4MCwgMHg4YjNjMGI0NworMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgIDg0NDgwLCAweGMxNzRhOWFmCiswLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4YjZkNDg2ODYKKzAsICAgICAgICAgNzIsICAgICAgICAgNzIsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhM2RkMTg3MQorMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgIDg0NDgwLCAweDA0Y2RjYWY3CiswLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NTVmODljOTQKKzAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgICA4NDQ4MCwgMHhkYTY1NzAzMgorMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgIDg0NDgwLCAweDM4YmE3Njk4CiswLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NGQwM2E3ZjIKKzAsICAgICAgICAgNzgsICAgICAgICAgNzgsICAgICAgICAxLCAgICA4NDQ4MCwgMHgxMTVkOTAzNQorMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgIDg0NDgwLCAweDI0YzZhY2M2CiswLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZGQyYmJjYWUKKzAsICAgICAgICAgODEsICAgICAgICAgODEsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiNGZlZTBiOQorMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgIDg0NDgwLCAweGM1MWMxNGUwCiswLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmI3NzM3ZGUKKzAsICAgICAgICAgODQsICAgICAgICAgODQsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzODY3NWZiMAorMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgIDg0NDgwLCAweDQ3NTJjNzEwCiswLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmViNzQ5MWIKKzAsICAgICAgICAgODcsICAgICAgICAgODcsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhYTI0ODEyMgorMCwgICAgICAgICA4OCwgICAgICAgICA4OCwgICAgICAgIDEsICAgIDg0NDgwLCAweDlhNGFmODdjCiswLCAgICAgICAgIDg5LCAgICAgICAgIDg5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZWRjZjA5ZGYKKzAsICAgICAgICAgOTAsICAgICAgICAgOTAsICAgICAgICAxLCAgICA4NDQ4MCwgMHg1NjNhMDVkZgorMCwgICAgICAgICA5MSwgICAgICAgICA5MSwgICAgICAgIDEsICAgIDg0NDgwLCAweDBkZGUxZTAzCiswLCAgICAgICAgIDkyLCAgICAgICAgIDkyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZDhmMGZmNjUKKzAsICAgICAgICAgOTMsICAgICAgICAgOTMsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiZWI5YWUxYQorMCwgICAgICAgICA5NCwgICAgICAgICA5NCwgICAgICAgIDEsICAgIDg0NDgwLCAweDQxNmQxNDY4CiswLCAgICAgICAgIDk1LCAgICAgICAgIDk1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NjZjODdkNGMKKzAsICAgICAgICAgOTYsICAgICAgICAgOTYsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhNjdjMDc3NAorMCwgICAgICAgICA5NywgICAgICAgICA5NywgICAgICAgIDEsICAgIDg0NDgwLCAweGQ4ZjhhZWMxCiswLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWRmYTUwMmIKKzAsICAgICAgICAgOTksICAgICAgICAgOTksICAgICAgICAxLCAgICA4NDQ4MCwgMHg1MGJmMjBlNAorMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDEsICAgIDg0NDgwLCAweGJjYjNkOGNjCiswLCAgICAgICAgMTAxLCAgICAgICAgMTAxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4YTU0Njc3ZDcKKzAsICAgICAgICAxMDIsICAgICAgICAxMDIsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzNTY2MDQyZAorMCwgICAgICAgIDEwMywgICAgICAgIDEwMywgICAgICAgIDEsICAgIDg0NDgwLCAweDRjOWVlZDU3CiswLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YzNiOTBlNTgKKzAsICAgICAgICAxMDUsICAgICAgICAxMDUsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzYzA0MmJmYQorMCwgICAgICAgIDEwNiwgICAgICAgIDEwNiwgICAgICAgIDEsICAgIDg0NDgwLCAweDE5ZjhlODkwCiswLCAgICAgICAgMTA3LCAgICAgICAgMTA3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZDNkYWNmYjkKKzAsICAgICAgICAxMDgsICAgICAgICAxMDgsICAgICAgICAxLCAgICA4NDQ4MCwgMHgyMzY1ZmM2ZgorMCwgICAgICAgIDEwOSwgICAgICAgIDEwOSwgICAgICAgIDEsICAgIDg0NDgwLCAweGEyYzE5ZDAwCiswLCAgICAgICAgMTEwLCAgICAgICAgMTEwLCAgICAgICAgMSwgICAgODQ0ODAsIDB4Y2U5NDMzNmYKKzAsICAgICAgICAxMTEsICAgICAgICAxMTEsICAgICAgICAxLCAgICA4NDQ4MCwgMHhmYTliY2YxNAorMCwgICAgICAgIDExOCwgICAgICAgIDExOCwgICAgICAgIDEsICAgIDg0NDgwLCAweDI0ZDZhMjQzCiswLCAgICAgICAgMTE5LCAgICAgICAgMTE5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWUxYzg4NTQKKzAsICAgICAgICAxMjAsICAgICAgICAxMjAsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiYjg5NjhiZgorMCwgICAgICAgIDEyMSwgICAgICAgIDEyMSwgICAgICAgIDEsICAgIDg0NDgwLCAweDZmOTIzNjIzCiswLCAgICAgICAgMTIyLCAgICAgICAgMTIyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4MjJlOTgwMjkKKzAsICAgICAgICAxMjMsICAgICAgICAxMjMsICAgICAgICAxLCAgICA4NDQ4MCwgMHg4YWMzM2FmMworMCwgICAgICAgIDEyNCwgICAgICAgIDEyNCwgICAgICAgIDEsICAgIDg0NDgwLCAweDA1OTQ3YjZlCiswLCAgICAgICAgMTI1LCAgICAgICAgMTI1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmMzNTY2MWEKKzAsICAgICAgICAxMjYsICAgICAgICAxMjYsICAgICAgICAxLCAgICA4NDQ4MCwgMHgwZTZiNmU0NworMCwgICAgICAgIDEyNywgICAgICAgIDEyNywgICAgICAgIDEsICAgIDg0NDgwLCAweDgyYzc2NGJiCiswLCAgICAgICAgMTI4LCAgICAgICAgMTI4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NTdhMzY4MzMKKzAsICAgICAgICAxMjksICAgICAgICAxMjksICAgICAgICAxLCAgICA4NDQ4MCwgMHhjOGRkNjkwYQorMCwgICAgICAgIDEzMCwgICAgICAgIDEzMCwgICAgICAgIDEsICAgIDg0NDgwLCAweDAyYzQ3MjMyCiswLCAgICAgICAgMTMxLCAgICAgICAgMTMxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4NjY0NTcxNWQKKzAsICAgICAgICAxMzIsICAgICAgICAxMzIsICAgICAgICAxLCAgICA4NDQ4MCwgMHhjNjQ4NjBmNworMCwgICAgICAgIDEzMywgICAgICAgIDEzMywgICAgICAgIDEsICAgIDg0NDgwLCAweDRmNTYxNGIzCiswLCAgICAgICAgMTM0LCAgICAgICAgMTM0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YTcwODQyY2EKKzAsICAgICAgICAxMzUsICAgICAgICAxMzUsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzNzlkODQ1OAorMCwgICAgICAgIDEzNiwgICAgICAgIDEzNiwgICAgICAgIDEsICAgIDg0NDgwLCAweGExNDcwMWNmCiswLCAgICAgICAgMTM3LCAgICAgICAgMTM3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWQxYWEyYjIKKzAsICAgICAgICAxMzgsICAgICAgICAxMzgsICAgICAgICAxLCAgICA4NDQ4MCwgMHhlZTI4ZjMyMAorMCwgICAgICAgIDEzOSwgICAgICAgIDEzOSwgICAgICAgIDEsICAgIDg0NDgwLCAweDUwNTgwMWU5CiswLCAgICAgICAgMTQwLCAgICAgICAgMTQwLCAgICAgICAgMSwgICAgODQ0ODAsIDB4Nzk0NzIzM2IKKzAsICAgICAgICAxNDEsICAgICAgICAxNDEsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzY2U3MmE5ZAorMCwgICAgICAgIDE0MiwgICAgICAgIDE0MiwgICAgICAgIDEsICAgIDg0NDgwLCAweGE2ODM0ZTY0CiswLCAgICAgICAgMTQzLCAgICAgICAgMTQzLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmViZjRkNzAKKzAsICAgICAgICAxNDQsICAgICAgICAxNDQsICAgICAgICAxLCAgICA4NDQ4MCwgMHg0YTA3NzVlMgorMCwgICAgICAgIDE0NSwgICAgICAgIDE0NSwgICAgICAgIDEsICAgIDg0NDgwLCAweDlkN2U5NDViCiswLCAgICAgICAgMTQ2LCAgICAgICAgMTQ2LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWE5ZWFkZDkKKzAsICAgICAgICAxNDcsICAgICAgICAxNDcsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhYTg1YzliMQorMCwgICAgICAgIDE0OCwgICAgICAgIDE0OCwgICAgICAgIDEsICAgIDg0NDgwLCAweGEwMDVlZGFmCiswLCAgICAgICAgMTQ5LCAgICAgICAgMTQ5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4N2ZjNGU1Y2MKKzAsICAgICAgICAxNTAsICAgICAgICAxNTAsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiMGY2ZThkMQorMCwgICAgICAgIDE1MSwgICAgICAgIDE1MSwgICAgICAgIDEsICAgIDg0NDgwLCAweDllZjlmMzMwCiswLCAgICAgICAgMTUyLCAgICAgICAgMTUyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4YmUxNGZmMWYKKzAsICAgICAgICAxNTMsICAgICAgICAxNTMsICAgICAgICAxLCAgICA4NDQ4MCwgMHhkNDk0MDQ4YworMCwgICAgICAgIDE1NCwgICAgICAgIDE1NCwgICAgICAgIDEsICAgIDg0NDgwLCAweDA0NjE2NmE3CiswLCAgICAgICAgMTU1LCAgICAgICAgMTU1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4MDUyYTA5YjIKKzAsICAgICAgICAxNTYsICAgICAgICAxNTYsICAgICAgICAxLCAgICA4NDQ4MCwgMHg3MWZmZjRhYgorMCwgICAgICAgIDE1NywgICAgICAgIDE1NywgICAgICAgIDEsICAgIDg0NDgwLCAweGI5Njg0ZTQxCiswLCAgICAgICAgMTU4LCAgICAgICAgMTU4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4MWRkY2UwNjgKKzAsICAgICAgICAxNTksICAgICAgICAxNTksICAgICAgICAxLCAgICA4NDQ4MCwgMHhiOWRlMzAwZQorMCwgICAgICAgIDE2MCwgICAgICAgIDE2MCwgICAgICAgIDEsICAgIDg0NDgwLCAweDEzOTYyNTkwCiswLCAgICAgICAgMTYxLCAgICAgICAgMTYxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZGU3OTQ4MmYKKzAsICAgICAgICAxNjIsICAgICAgICAxNjIsICAgICAgICAxLCAgICA4NDQ4MCwgMHg3ZDFjYTA2NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvd212My1kcm0tbm9kZWMgYi90ZXN0cy9yZWYvZmF0ZS93bXYzLWRybS1ub2RlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZjMzM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2ZhdGUvd212My1kcm0tbm9kZWMKQEAgLTAsMCArMSwxNjMgQEAKKyNleHRyYWRhdGEgMDogICAgICAgIDQsIDB4MDIxODAwYTIKKyNleHRyYWRhdGEgMTogICAgICAgNDYsIDB4NjNkOTA0M2EKKyN0YiAwOiAxLzEwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogd212MworI2RpbWVuc2lvbnMgMDogMzIweDE3NgorI3NhciAwOiAwLzEKKyN0YiAxOiAxLzEwMDAKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogd21hdm9pY2UKKyNzYW1wbGVfcmF0ZSAxOiAyMjA1MAorI2NoYW5uZWxfbGF5b3V0IDE6IDQKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IG1vbm8KKzAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAwLCAgICAgIDI4MiwgMHgwMDBkOTQ5YQorMSwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDAsICAgICAxMDg4LCAweDVjZDM3OWJiCisxLCAgICAgICAgNDM1LCAgICAgICAgNDM1LCAgICAgICAgMCwgICAgIDEwODgsIDB4OGRmYTEzNjgKKzEsICAgICAgICA3NDAsICAgICAgICA3NDAsICAgICAgICAwLCAgICAgMTA4OCwgMHhjMGQyMTFiZQorMSwgICAgICAgMTAyMywgICAgICAgMTAyMywgICAgICAgIDAsICAgICAxMDg4LCAweDgyMzgxMTNhCiswLCAgICAgICAxMjA4LCAgICAgICAxMjA4LCAgICAgICAgMCwgICAgICAxMzcsIDB4OTAzYzQxNWUsIEY9MHgwCiswLCAgICAgICAxMjUwLCAgICAgICAxMjUwLCAgICAgICAgMCwgICAgICA5NDIsIDB4ZDViN2QyYWEsIEY9MHgwCiswLCAgICAgICAxMjkxLCAgICAgICAxMjkxLCAgICAgICAgMCwgICAgICA4NDEsIDB4YWZmZDhjZTYsIEY9MHgwCisxLCAgICAgICAxMzA2LCAgICAgICAxMzA2LCAgICAgICAgMCwgICAgIDEwODgsIDB4OWY4OTI0YjcKKzAsICAgICAgIDEzMzMsICAgICAgIDEzMzMsICAgICAgICAwLCAgICAgMTE2NCwgMHg0ZWQ4NDgzNiwgRj0weDAKKzAsICAgICAgIDEzNzUsICAgICAgIDEzNzUsICAgICAgICAwLCAgICAgMTQ5MiwgMHgzN2YzZThhYSwgRj0weDAKKzAsICAgICAgIDE0MTYsICAgICAgIDE0MTYsICAgICAgICAwLCAgICAgMTY2MywgMHhjMDkxMzkyZCwgRj0weDAKKzAsICAgICAgIDE0NTgsICAgICAgIDE0NTgsICAgICAgICAwLCAgICAgMTQ0MywgMHg2MTYyYzcxOCwgRj0weDAKKzAsICAgICAgIDE1MDAsICAgICAgIDE1MDAsICAgICAgICAwLCAgICAgMTcyMSwgMHg3YmRiM2RkMCwgRj0weDAKKzAsICAgICAgIDE1NDEsICAgICAgIDE1NDEsICAgICAgICAwLCAgICAgMTQxMCwgMHhkZTY4OTg4MSwgRj0weDAKKzAsICAgICAgIDE1ODMsICAgICAgIDE1ODMsICAgICAgICAwLCAgICAgMTI1OCwgMHhiNWI4NjkyMCwgRj0weDAKKzEsICAgICAgIDE1ODksICAgICAgIDE1ODksICAgICAgICAwLCAgICAgMTA4OCwgMHg3NjdmMzE3YQorMCwgICAgICAgMTYyNSwgICAgICAgMTYyNSwgICAgICAgIDAsICAgICAyMDUwLCAweDk5YjZkN2M3LCBGPTB4MAorMCwgICAgICAgMTY2NiwgICAgICAgMTY2NiwgICAgICAgIDAsICAgICAxMjQyLCAweDliYTM1MDA5LCBGPTB4MAorMCwgICAgICAgMTcwOCwgICAgICAgMTcwOCwgICAgICAgIDAsICAgICAxNjMwLCAweDE3ZjEwMTkyLCBGPTB4MAorMCwgICAgICAgMTc1MCwgICAgICAgMTc1MCwgICAgICAgIDAsICAgICAxNzQ3LCAweGJiZWU1OWQ3LCBGPTB4MAorMCwgICAgICAgMTc5MSwgICAgICAgMTc5MSwgICAgICAgIDAsICAgICAxNTY1LCAweGIwOWIwMGQ5LCBGPTB4MAorMCwgICAgICAgMTgzMywgICAgICAgMTgzMywgICAgICAgIDAsICAgICAxNTczLCAweGQyZTYyMjAxLCBGPTB4MAorMSwgICAgICAgMTg3MiwgICAgICAgMTg3MiwgICAgICAgIDAsICAgICAxMDg4LCAweDU3MDAwZDM4CiswLCAgICAgICAxODc1LCAgICAgICAxODc1LCAgICAgICAgMCwgICAgIDEzNTMsIDB4MjMwNWEyNGQsIEY9MHgwCiswLCAgICAgICAxOTE2LCAgICAgICAxOTE2LCAgICAgICAgMCwgICAgIDE0MjUsIDB4ZjQxYmJiNDYsIEY9MHgwCiswLCAgICAgICAxOTU4LCAgICAgICAxOTU4LCAgICAgICAgMCwgICAgIDEzNTUsIDB4ZmMwOGE3NjIsIEY9MHgwCiswLCAgICAgICAyMDAwLCAgICAgICAyMDAwLCAgICAgICAgMCwgICAgIDEzNjMsIDB4OThjZGE3MWQsIEY9MHgwCiswLCAgICAgICAyMDQxLCAgICAgICAyMDQxLCAgICAgICAgMCwgICAgIDE1NDcsIDB4ODc0MmYxMWYsIEY9MHgwCiswLCAgICAgICAyMDgzLCAgICAgICAyMDgzLCAgICAgICAgMCwgICAgIDE5NjcsIDB4NDNkNjE3MjMsIEY9MHgwCiswLCAgICAgICAyMTI1LCAgICAgICAyMTI1LCAgICAgICAgMCwgICAgIDEzNzgsIDB4ZGUyMmM3NTMsIEY9MHgwCiswLCAgICAgICAyMTY2LCAgICAgICAyMTY2LCAgICAgICAgMCwgICAgICA5NjEsIDB4MjQxOGE0ZGEsIEY9MHgwCisxLCAgICAgICAyMTk4LCAgICAgICAyMTk4LCAgICAgICAgMCwgICAgIDEwODgsIDB4YWQ5NzcyNjEKKzAsICAgICAgIDIyMDgsICAgICAgIDIyMDgsICAgICAgICAwLCAgICAgIDk2OCwgMHgwZDA0YmE1MSwgRj0weDAKKzAsICAgICAgIDIyNTAsICAgICAgIDIyNTAsICAgICAgICAwLCAgICAgMTE0MCwgMHg3MzdmMzU0MywgRj0weDAKKzAsICAgICAgIDIyOTEsICAgICAgIDIyOTEsICAgICAgICAwLCAgICAgMTExOSwgMHgzYzA1MDM4OCwgRj0weDAKKzAsICAgICAgIDIzMzMsICAgICAgIDIzMzMsICAgICAgICAwLCAgICAgMTA3OCwgMHhlYWM4ZDk4MSwgRj0weDAKKzAsICAgICAgIDIzNzUsICAgICAgIDIzNzUsICAgICAgICAwLCAgICAgMTExMywgMHhlYmZhMDMxNCwgRj0weDAKKzAsICAgICAgIDI0MTYsICAgICAgIDI0MTYsICAgICAgICAwLCAgICAgMTIyOSwgMHg5NWRjM2NiNSwgRj0weDAKKzAsICAgICAgIDI0NTgsICAgICAgIDI0NTgsICAgICAgICAwLCAgICAgMTMxMSwgMHg4YTZmNWJkYSwgRj0weDAKKzAsICAgICAgIDI1MDAsICAgICAgIDI1MDAsICAgICAgICAwLCAgICAgMTI3MCwgMHgyZTY2NTQwYSwgRj0weDAKKzAsICAgICAgIDI1NDEsICAgICAgIDI1NDEsICAgICAgICAwLCAgICAgMTQwOCwgMHg1ZjQ4OTc3OSwgRj0weDAKKzAsICAgICAgIDI1ODMsICAgICAgIDI1ODMsICAgICAgICAwLCAgICAgMTM1OSwgMHg4YmQwODVmNSwgRj0weDAKKzAsICAgICAgIDI2MjUsICAgICAgIDI2MjUsICAgICAgICAwLCAgICAgMTQyOCwgMHhlZjliYTQ4MCwgRj0weDAKKzAsICAgICAgIDI2NjYsICAgICAgIDI2NjYsICAgICAgICAwLCAgICAgMTE3OSwgMHg1YmIyMjFhOCwgRj0weDAKKzAsICAgICAgIDI3MDgsICAgICAgIDI3MDgsICAgICAgICAwLCAgICAgMTEwOCwgMHg5YTYwMTlhOCwgRj0weDAKKzAsICAgICAgIDI3NTAsICAgICAgIDI3NTAsICAgICAgICAwLCAgICAgMTIwNSwgMHhjY2JhNGQyMiwgRj0weDAKKzAsICAgICAgIDI3OTEsICAgICAgIDI3OTEsICAgICAgICAwLCAgICAgMTMwNiwgMHhkZTcwOGMxOSwgRj0weDAKKzAsICAgICAgIDI4MzMsICAgICAgIDI4MzMsICAgICAgICAwLCAgICAgMTcyNCwgMHhhNzBiNTIxZSwgRj0weDAKKzAsICAgICAgIDI4NzUsICAgICAgIDI4NzUsICAgICAgIDQxLCAgICAgMTMzNiwgMHhkZjM5NzRiOSwgRj0weDAKKzAsICAgICAgIDI5MTYsICAgICAgIDI5MTYsICAgICAgIDQxLCAgICAgMTI1OSwgMHgxZjZiNDMwNywgRj0weDAKKzAsICAgICAgIDI5NTgsICAgICAgIDI5NTgsICAgICAgIDQxLCAgICAgMTE5NCwgMHg2MzVmNWE0MywgRj0weDAKKzAsICAgICAgIDMwMDAsICAgICAgIDMwMDAsICAgICAgIDQxLCAgICAgMTE4MywgMHgxZGQ0NzExNSwgRj0weDAKKzAsICAgICAgIDMwNDEsICAgICAgIDMwNDEsICAgICAgIDQxLCAgICAgMTEyNiwgMHg1YmFjM2NjOCwgRj0weDAKKzAsICAgICAgIDMwODMsICAgICAgIDMwODMsICAgICAgIDQxLCAgICAgMTM2MCwgMHgxZmUyZDk4MSwgRj0weDAKKzAsICAgICAgIDMxMjUsICAgICAgIDMxMjUsICAgICAgIDQxLCAgICAgMTI2MSwgMHgzNDI4OGFjYiwgRj0weDAKKzAsICAgICAgIDMxNjYsICAgICAgIDMxNjYsICAgICAgIDQxLCAgICAgMTI1MCwgMHgyNmJkNzJiMywgRj0weDAKKzAsICAgICAgIDMyMDgsICAgICAgIDMyMDgsICAgICAgIDQxLCAgICAgMTE0NywgMHgwMmU4MWJhMCwgRj0weDAKKzAsICAgICAgIDMyNTAsICAgICAgIDMyNTAsICAgICAgIDQxLCAgICAgMTM2OCwgMHhiODE0Njk2MiwgRj0weDAKKzAsICAgICAgIDMyOTEsICAgICAgIDMyOTEsICAgICAgIDQxLCAgICAgMTM3NywgMHhmN2I2Y2U2NSwgRj0weDAKKzAsICAgICAgIDMzMzMsICAgICAgIDMzMzMsICAgICAgIDQxLCAgICAgMTM5NiwgMHg4ODQ2N2RlZSwgRj0weDAKKzAsICAgICAgIDMzNzUsICAgICAgIDMzNzUsICAgICAgIDQxLCAgICAgMTQwOCwgMHg1NTg1YzI1YywgRj0weDAKKzAsICAgICAgIDM0MTYsICAgICAgIDM0MTYsICAgICAgIDQxLCAgICAgMTU1MSwgMHg0MjAwMmM4ZCwgRj0weDAKKzAsICAgICAgIDM0NTgsICAgICAgIDM0NTgsICAgICAgIDQxLCAgICAgMTUyNCwgMHhiY2I2MDllMywgRj0weDAKKzEsICAgICAgIDM0ODIsICAgICAgIDM0ODIsICAgICAgICAwLCAgICAgMTA4OCwgMHhkY2U1NzQ3MQorMCwgICAgICAgMzUwMCwgICAgICAgMzUwMCwgICAgICAgNDEsICAgICAxNTU0LCAweDNkNzQwNTY0LCBGPTB4MAorMCwgICAgICAgMzU0MSwgICAgICAgMzU0MSwgICAgICAgNDEsICAgICAxNDY3LCAweGMzNDlmMmQ3LCBGPTB4MAorMCwgICAgICAgMzU4MywgICAgICAgMzU4MywgICAgICAgNDEsICAgICAxMDY2LCAweGI3NDAxNDYyLCBGPTB4MAorMCwgICAgICAgMzYyNSwgICAgICAgMzYyNSwgICAgICAgNDEsICAgICAxNTAyLCAweDNlZTYwMmVkLCBGPTB4MAorMCwgICAgICAgMzY2NiwgICAgICAgMzY2NiwgICAgICAgNDEsICAgICAxMTQ4LCAweGJhNDYzNjM3LCBGPTB4MAorMCwgICAgICAgMzcwOCwgICAgICAgMzcwOCwgICAgICAgNDEsICAgICAxMzUxLCAweDVlODVhZTc5LCBGPTB4MAorMCwgICAgICAgMzc1MCwgICAgICAgMzc1MCwgICAgICAgNDEsICAgICAxMTg3LCAweGVkOGQ2MDU1LCBGPTB4MAorMCwgICAgICAgMzc5MSwgICAgICAgMzc5MSwgICAgICAgNDEsICAgICAxMjAwLCAweDY0MTg1YmU2LCBGPTB4MAorMCwgICAgICAgMzgzMywgICAgICAgMzgzMywgICAgICAgNDEsICAgICAxMTc1LCAweDEyYWQzYzFlLCBGPTB4MAorMCwgICAgICAgMzg3NSwgICAgICAgMzg3NSwgICAgICAgNDEsICAgICAxMTc5LCAweDdlMDM0NTcwLCBGPTB4MAorMCwgICAgICAgMzkxNiwgICAgICAgMzkxNiwgICAgICAgNDEsICAgICAxMTM2LCAweDVjNjMzYzUxLCBGPTB4MAorMSwgICAgICAgMzkxOCwgICAgICAgMzkxOCwgICAgICAgIDAsICAgICAxMDg4LCAweGYzODg3OTc3CiswLCAgICAgICAzOTU4LCAgICAgICAzOTU4LCAgICAgICA0MSwgICAgIDEwNjQsIDB4NWViNTFkODksIEY9MHgwCiswLCAgICAgICA0MDAwLCAgICAgICA0MDAwLCAgICAgICA0MSwgICAgICA5NTMsIDB4ZTE0OGJiZGQsIEY9MHgwCiswLCAgICAgICA0MDQxLCAgICAgICA0MDQxLCAgICAgICA0MSwgICAgICA5ODksIDB4OTAxZWMzMDYsIEY9MHgwCiswLCAgICAgICA0MDgzLCAgICAgICA0MDgzLCAgICAgICA0MSwgICAgIDEwMzAsIDB4NjgwZGUyNmYsIEY9MHgwCiswLCAgICAgICA0MTI1LCAgICAgICA0MTI1LCAgICAgICA0MSwgICAgIDEwNzgsIDB4ODZlMGVlNDMsIEY9MHgwCiswLCAgICAgICA0MTY2LCAgICAgICA0MTY2LCAgICAgICA0MSwgICAgIDEyMzIsIDB4OTg1NDZhODYsIEY9MHgwCiswLCAgICAgICA0MjA4LCAgICAgICA0MjA4LCAgICAgICA0MSwgICAgIDExNjQsIDB4OTMzMDUwNzQsIEY9MHgwCiswLCAgICAgICA0MjUwLCAgICAgICA0MjUwLCAgICAgICA0MSwgICAgIDEzNDgsIDB4MjdjZmE5MWIsIEY9MHgwCiswLCAgICAgICA0MjkxLCAgICAgICA0MjkxLCAgICAgICA0MSwgICAgIDE0MTcsIDB4MjMxMmQ3MGUsIEY9MHgwCiswLCAgICAgICA0MzMzLCAgICAgICA0MzMzLCAgICAgICA0MSwgICAgIDEyODUsIDB4NDZjYTRjY2EsIEY9MHgwCisxLCAgICAgICA0MzUzLCAgICAgICA0MzUzLCAgICAgICAgMCwgICAgIDEwODgsIDB4MWQ2YzhlZDIKKzAsICAgICAgIDQzNzUsICAgICAgIDQzNzUsICAgICAgIDQxLCAgICAgMTAzNywgMHhjZjA5ZGQzZCwgRj0weDAKKzAsICAgICAgIDQ0MTYsICAgICAgIDQ0MTYsICAgICAgIDQxLCAgICAgMTAwNSwgMHhlNzgwY2YxZiwgRj0weDAKKzAsICAgICAgIDQ0NTgsICAgICAgIDQ0NTgsICAgICAgIDQxLCAgICAgIDg5MCwgMHg4YjFkOGMxYiwgRj0weDAKKzAsICAgICAgIDQ1MDAsICAgICAgIDQ1MDAsICAgICAgIDQxLCAgICAgMTAyMywgMHhkMWRiZDUwNiwgRj0weDAKKzAsICAgICAgIDQ1NDEsICAgICAgIDQ1NDEsICAgICAgIDQxLCAgICAgIDgwMywgMHg5MzVlNzc1ZSwgRj0weDAKKzAsICAgICAgIDQ1ODMsICAgICAgIDQ1ODMsICAgICAgIDQxLCAgICAgMTAzNSwgMHg2YTIyMDQ4MywgRj0weDAKKzAsICAgICAgIDQ2MjUsICAgICAgIDQ2MjUsICAgICAgIDQxLCAgICAgIDQ2NiwgMHhkODhiYjIzNywgRj0weDAKKzEsICAgICAgIDQ3ODksICAgICAgIDQ3ODksICAgICAgICAwLCAgICAgMTA4OCwgMHgwOTExNWJhZQorMCwgICAgICAgNDkxNiwgICAgICAgNDkxNiwgICAgICAgNDEsICAgICAgOTQ1LCAweDhmMmViMWVjLCBGPTB4MAorMCwgICAgICAgNDk1OCwgICAgICAgNDk1OCwgICAgICAgNDEsICAgICAxMTkwLCAweDRjNDUxYzFiCiswLCAgICAgICA1MDAwLCAgICAgICA1MDAwLCAgICAgICA0MSwgICAgIDE4MTEsIDB4NzI3YzUyY2IsIEY9MHgwCiswLCAgICAgICA1MDQxLCAgICAgICA1MDQxLCAgICAgICA0MSwgICAgIDE1NTIsIDB4NzNmODJiZmYsIEY9MHgwCiswLCAgICAgICA1MDgzLCAgICAgICA1MDgzLCAgICAgICA0MSwgICAgIDE1NDQsIDB4YTcyNDFlY2UsIEY9MHgwCiswLCAgICAgICA1MTI1LCAgICAgICA1MTI1LCAgICAgICA0MSwgICAgIDE3MDcsIDB4M2QxYTY0NjQsIEY9MHgwCiswLCAgICAgICA1MTY2LCAgICAgICA1MTY2LCAgICAgICA0MSwgICAgIDExMDMsIDB4MDZiMjI3MTAsIEY9MHgwCiswLCAgICAgICA1MjA4LCAgICAgICA1MjA4LCAgICAgICA0MSwgICAgIDExMjIsIDB4NjU2NzI1YjgsIEY9MHgwCisxLCAgICAgICA1MjI0LCAgICAgICA1MjI0LCAgICAgICAgMCwgICAgIDEwODgsIDB4MGM4YjkzNzIKKzAsICAgICAgIDUyNTAsICAgICAgIDUyNTAsICAgICAgIDQxLCAgICAgMTE1MCwgMHhmOTY3NDY3OCwgRj0weDAKKzAsICAgICAgIDUyOTEsICAgICAgIDUyOTEsICAgICAgIDQxLCAgICAgMTQzOCwgMHgwM2ZhYzQyNiwgRj0weDAKKzAsICAgICAgIDUzMzMsICAgICAgIDUzMzMsICAgICAgIDQxLCAgICAgMTYyMywgMHg3YWRiMTMyMSwgRj0weDAKKzAsICAgICAgIDUzNzUsICAgICAgIDUzNzUsICAgICAgIDQxLCAgICAgMTY3NywgMHgwYjlhM2U2MiwgRj0weDAKKzAsICAgICAgIDU0MTYsICAgICAgIDU0MTYsICAgICAgIDQxLCAgICAgMTEyNCwgMHg3NjljMGVhMiwgRj0weDAKKzAsICAgICAgIDU0NTgsICAgICAgIDU0NTgsICAgICAgIDQxLCAgICAgMTIyMSwgMHhkOTQyNDA5ZiwgRj0weDAKKzAsICAgICAgIDU1MDAsICAgICAgIDU1MDAsICAgICAgIDQxLCAgICAgMTY5OCwgMHhkN2NhM2ZlMywgRj0weDAKKzAsICAgICAgIDU1NDEsICAgICAgIDU1NDEsICAgICAgIDQxLCAgICAgMTI2MiwgMHhiOTk0NjkyZiwgRj0weDAKKzAsICAgICAgIDU1ODMsICAgICAgIDU1ODMsICAgICAgIDQxLCAgICAgMjA5NywgMHhmNGViNjYzZiwgRj0weDAKKzAsICAgICAgIDU2MjUsICAgICAgIDU2MjUsICAgICAgIDQxLCAgICAgMTI1MSwgMHhmZDRmNjMzYSwgRj0weDAKKzEsICAgICAgIDU2NTksICAgICAgIDU2NTksICAgICAgICAwLCAgICAgMTA4OCwgMHg3NWE4MjU0MAorMCwgICAgICAgNTY2NiwgICAgICAgNTY2NiwgICAgICAgNDEsICAgICAxNjMzLCAweGI3ZTEyOTBlLCBGPTB4MAorMCwgICAgICAgNTcwOCwgICAgICAgNTcwOCwgICAgICAgNDEsICAgICAxNzM5LCAweGVjZDE4YzM4LCBGPTB4MAorMCwgICAgICAgNTc1MCwgICAgICAgNTc1MCwgICAgICAgNDEsICAgICAxMTMyLCAweGM4M2UxODI4LCBGPTB4MAorMCwgICAgICAgNTc5MSwgICAgICAgNTc5MSwgICAgICAgNDEsICAgICAgODI1LCAweGRkMDI4NjdjLCBGPTB4MAorMCwgICAgICAgNTgzMywgICAgICAgNTgzMywgICAgICAgNDEsICAgICAgOTAzLCAweDM0OWJhMjA1LCBGPTB4MAorMCwgICAgICAgNTg3NSwgICAgICAgNTg3NSwgICAgICAgNDEsICAgICAxMDEzLCAweDEzNjZlYzJhLCBGPTB4MAorMCwgICAgICAgNTkxNiwgICAgICAgNTkxNiwgICAgICAgNDEsICAgICAxMzQwLCAweGVhYTJhMjMxLCBGPTB4MAorMCwgICAgICAgNTk1OCwgICAgICAgNTk1OCwgICAgICAgNDEsICAgICAxMTAyLCAweDgyZGUyODg5LCBGPTB4MAorMCwgICAgICAgNjAwMCwgICAgICAgNjAwMCwgICAgICAgNDEsICAgICAxODM0LCAweDU5Yjk5YjkyLCBGPTB4MAorMSwgICAgICAgNjAwOCwgICAgICAgNjAwOCwgICAgICAgIDAsICAgICAxMDg4LCAweDY5MDMxMmIwCiswLCAgICAgICA2MDQxLCAgICAgICA2MDQxLCAgICAgICA0MSwgICAgIDEzMzIsIDB4MDYxMDgxM2EsIEY9MHgwCiswLCAgICAgICA2MDgzLCAgICAgICA2MDgzLCAgICAgICA0MSwgICAgIDEyNzUsIDB4NWIwZDdiZTcsIEY9MHgwCiswLCAgICAgICA2MTI1LCAgICAgICA2MTI1LCAgICAgICA0MSwgICAgIDEzNzYsIDB4ZDkxNWIwZmUsIEY9MHgwCiswLCAgICAgICA2MTY2LCAgICAgICA2MTY2LCAgICAgICA0MSwgICAgIDE0MTcsIDB4ODYwNmIzNGEsIEY9MHgwCiswLCAgICAgICA2MjA4LCAgICAgICA2MjA4LCAgICAgICA0MSwgICAgIDEzNjAsIDB4M2JjZDkzZDMsIEY9MHgwCiswLCAgICAgICA2MjUwLCAgICAgICA2MjUwLCAgICAgICA0MSwgICAgIDEzMzAsIDB4ZDA0MzljOTMsIEY9MHgwCiswLCAgICAgICA2MjkxLCAgICAgICA2MjkxLCAgICAgICA0MSwgICAgIDE1NjIsIDB4YjI1NjBhMDksIEY9MHgwCisxLCAgICAgICA2MzEyLCAgICAgICA2MzEyLCAgICAgICAgMCwgICAgIDEwODgsIDB4NzZkNTBmZjMKKzAsICAgICAgIDYzMzMsICAgICAgIDYzMzMsICAgICAgIDQxLCAgICAgMTM3NiwgMHg0ZjllYjQ0NywgRj0weDAKKzAsICAgICAgIDYzNzUsICAgICAgIDYzNzUsICAgICAgIDQxLCAgICAgMTQwNSwgMHg4NWQzYjA4NCwgRj0weDAKKzAsICAgICAgIDY0MTYsICAgICAgIDY0MTYsICAgICAgIDQxLCAgICAgMTM0NCwgMHhjZGJkYTJhZSwgRj0weDAKKzAsICAgICAgIDY0NTgsICAgICAgIDY0NTgsICAgICAgIDQxLCAgICAgMTMxMywgMHhlMzA2N2IzNSwgRj0weDAKKzAsICAgICAgIDY1MDAsICAgICAgIDY1MDAsICAgICAgIDQxLCAgICAgMTQ1OSwgMHhmOWQyYzU2ZiwgRj0weDAKKzAsICAgICAgIDY1NDEsICAgICAgIDY1NDEsICAgICAgIDQxLCAgICAgMTI3NSwgMHhmNTUzNmQ4MSwgRj0weDAKKzAsICAgICAgIDY1ODMsICAgICAgIDY1ODMsICAgICAgIDQxLCAgICAgMTIwOSwgMHgzYjViNGVhNSwgRj0weDAKKzEsICAgICAgIDY1OTUsICAgICAgIDY1OTUsICAgICAgICAwLCAgICAgMTA4OCwgMHg4NzY2Mjc2ZgorMCwgICAgICAgNjYyNSwgICAgICAgNjYyNSwgICAgICAgNDEsICAgICAxMzUyLCAweDdiMTk5ZDI4LCBGPTB4MAorMCwgICAgICAgNjY2NiwgICAgICAgNjY2NiwgICAgICAgNDEsICAgICAxMzQ5LCAweDAyYWRhYWYzLCBGPTB4MAorMCwgICAgICAgNjcwOCwgICAgICAgNjcwOCwgICAgICAgNDEsICAgICAxNDY0LCAweDIwZDdjZmQyLCBGPTB4MAorMCwgICAgICAgNjc1MCwgICAgICAgNjc1MCwgICAgICAgNDEsICAgICAxMzc3LCAweDc4ZTBiMWY0LCBGPTB4MAorMCwgICAgICAgNjc5MSwgICAgICAgNjc5MSwgICAgICAgNDEsICAgICAgMjg5LCAweDFmMmU5MjQ2LCBGPTB4MAorMSwgICAgICAgNjg3OCwgICAgICAgNjg3OCwgICAgICAgIDAsICAgICAxMDg4LCAweDY3OGYyMGZkCisxLCAgICAgICA3MTYxLCAgICAgICA3MTYxLCAgICAgICAgMCwgICAgIDEwODgsIDB4NzE4YWZhMjAKKzEsICAgICAgIDc0NDQsICAgICAgIDc0NDQsICAgICAgICAwLCAgICAgMTA4OCwgMHg3NThmMDkzOQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvd212OC1kcm0gYi90ZXN0cy9yZWYvZmF0ZS93bXY4LWRybQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkOGZiYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9yZWYvZmF0ZS93bXY4LWRybQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0jdGIgMDogMS8yNAotMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDg0NDgwLCAweDc3NjBhMDBiCi0wLCAgICAgICAgIDI5LCAgICAgICAgIDI5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmUzOWExZGIKLTAsICAgICAgICAgMzAsICAgICAgICAgMzAsICAgICAgICAxLCAgICA4NDQ4MCwgMHhkNzE5NjFiNAotMCwgICAgICAgICAzMSwgICAgICAgICAzMSwgICAgICAgIDEsICAgIDg0NDgwLCAweGM4MGRlZGJhCi0wLCAgICAgICAgIDMyLCAgICAgICAgIDMyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4MzRkOGI1MzgKLTAsICAgICAgICAgMzMsICAgICAgICAgMzMsICAgICAgICAxLCAgICA4NDQ4MCwgMHgxYTg2YjhlNQotMCwgICAgICAgICAzNCwgICAgICAgICAzNCwgICAgICAgIDEsICAgIDg0NDgwLCAweGFiZjdjMjVkCi0wLCAgICAgICAgIDM1LCAgICAgICAgIDM1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4OTEyNjAwZWUKLTAsICAgICAgICAgMzYsICAgICAgICAgMzYsICAgICAgICAxLCAgICA4NDQ4MCwgMHg3ZWU3YzcwYgotMCwgICAgICAgICAzNywgICAgICAgICAzNywgICAgICAgIDEsICAgIDg0NDgwLCAweDA5YzViMGQxCi0wLCAgICAgICAgIDM4LCAgICAgICAgIDM4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NmRiZTZjMGMKLTAsICAgICAgICAgMzksICAgICAgICAgMzksICAgICAgICAxLCAgICA4NDQ4MCwgMHgwZmUwYTEyMAotMCwgICAgICAgICA0MCwgICAgICAgICA0MCwgICAgICAgIDEsICAgIDg0NDgwLCAweDIzNTJkM2EyCi0wLCAgICAgICAgIDQxLCAgICAgICAgIDQxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4YjIyY2U5MmUKLTAsICAgICAgICAgNDIsICAgICAgICAgNDIsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzMWRiMDA5OQotMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgIDg0NDgwLCAweGFkMmRkNzNhCi0wLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YjlhZjhlMjAKLTAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgICA4NDQ4MCwgMHg3Yjk1NjU0OQotMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgIDg0NDgwLCAweDNmNzc0Yjg3Ci0wLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ODI0YTIzYTMKLTAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgICA4NDQ4MCwgMHg0NDY5YThkOAotMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgIDg0NDgwLCAweGM4MGM3YTBhCi0wLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAgODQ0ODAsIDB4Y2Y5NTg1NDkKLTAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgICA4NDQ4MCwgMHg0NDk3NDZlMwotMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgIDg0NDgwLCAweGJhYzY2YTgyCi0wLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICAgODQ0ODAsIDB4OTllODU4NTUKLTAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhNGExN2QxNwotMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgIDg0NDgwLCAweGUyOWM3NTg3Ci0wLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NTUxZGU1OTIKLTAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgICA4NDQ4MCwgMHhlMDg3N2JjZQotMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgIDg0NDgwLCAweDk2NjBlYjM1Ci0wLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4MGEzNGI2NDQKLTAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzNTI5MTlmMAotMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgIDg0NDgwLCAweGVmNTZjZTI3Ci0wLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4MDMwZmU4NjIKLTAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgICA4NDQ4MCwgMHgyZWJhMzNlMgotMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgIDg0NDgwLCAweDI0MmRlNDAxCi0wLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YmFkZDYxY2EKLTAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgICA4NDQ4MCwgMHgyMDYwNDY1YgotMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgIDg0NDgwLCAweDI1NmU2OTY1Ci0wLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4MjQzYjcwODQKLTAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgICA4NDQ4MCwgMHg4YjNjMGI0NwotMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgIDg0NDgwLCAweGMxNzRhOWFmCi0wLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4YjZkNDg2ODYKLTAsICAgICAgICAgNzIsICAgICAgICAgNzIsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhM2RkMTg3MQotMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgIDg0NDgwLCAweDA0Y2RjYWY3Ci0wLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NTVmODljOTQKLTAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgICA4NDQ4MCwgMHhkYTY1NzAzMgotMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgIDg0NDgwLCAweDM4YmE3Njk4Ci0wLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NGQwM2E3ZjIKLTAsICAgICAgICAgNzgsICAgICAgICAgNzgsICAgICAgICAxLCAgICA4NDQ4MCwgMHgxMTVkOTAzNQotMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgIDg0NDgwLCAweDI0YzZhY2M2Ci0wLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZGQyYmJjYWUKLTAsICAgICAgICAgODEsICAgICAgICAgODEsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiNGZlZTBiOQotMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgIDg0NDgwLCAweGM1MWMxNGUwCi0wLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmI3NzM3ZGUKLTAsICAgICAgICAgODQsICAgICAgICAgODQsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzODY3NWZiMAotMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgIDg0NDgwLCAweDQ3NTJjNzEwCi0wLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmViNzQ5MWIKLTAsICAgICAgICAgODcsICAgICAgICAgODcsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhYTI0ODEyMgotMCwgICAgICAgICA4OCwgICAgICAgICA4OCwgICAgICAgIDEsICAgIDg0NDgwLCAweDlhNGFmODdjCi0wLCAgICAgICAgIDg5LCAgICAgICAgIDg5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZWRjZjA5ZGYKLTAsICAgICAgICAgOTAsICAgICAgICAgOTAsICAgICAgICAxLCAgICA4NDQ4MCwgMHg1NjNhMDVkZgotMCwgICAgICAgICA5MSwgICAgICAgICA5MSwgICAgICAgIDEsICAgIDg0NDgwLCAweDBkZGUxZTAzCi0wLCAgICAgICAgIDkyLCAgICAgICAgIDkyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZDhmMGZmNjUKLTAsICAgICAgICAgOTMsICAgICAgICAgOTMsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiZWI5YWUxYQotMCwgICAgICAgICA5NCwgICAgICAgICA5NCwgICAgICAgIDEsICAgIDg0NDgwLCAweDQxNmQxNDY4Ci0wLCAgICAgICAgIDk1LCAgICAgICAgIDk1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NjZjODdkNGMKLTAsICAgICAgICAgOTYsICAgICAgICAgOTYsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhNjdjMDc3NAotMCwgICAgICAgICA5NywgICAgICAgICA5NywgICAgICAgIDEsICAgIDg0NDgwLCAweGQ4ZjhhZWMxCi0wLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWRmYTUwMmIKLTAsICAgICAgICAgOTksICAgICAgICAgOTksICAgICAgICAxLCAgICA4NDQ4MCwgMHg1MGJmMjBlNAotMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDEsICAgIDg0NDgwLCAweGJjYjNkOGNjCi0wLCAgICAgICAgMTAxLCAgICAgICAgMTAxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4YTU0Njc3ZDcKLTAsICAgICAgICAxMDIsICAgICAgICAxMDIsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzNTY2MDQyZAotMCwgICAgICAgIDEwMywgICAgICAgIDEwMywgICAgICAgIDEsICAgIDg0NDgwLCAweDRjOWVlZDU3Ci0wLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YzNiOTBlNTgKLTAsICAgICAgICAxMDUsICAgICAgICAxMDUsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzYzA0MmJmYQotMCwgICAgICAgIDEwNiwgICAgICAgIDEwNiwgICAgICAgIDEsICAgIDg0NDgwLCAweDE5ZjhlODkwCi0wLCAgICAgICAgMTA3LCAgICAgICAgMTA3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZDNkYWNmYjkKLTAsICAgICAgICAxMDgsICAgICAgICAxMDgsICAgICAgICAxLCAgICA4NDQ4MCwgMHgyMzY1ZmM2ZgotMCwgICAgICAgIDEwOSwgICAgICAgIDEwOSwgICAgICAgIDEsICAgIDg0NDgwLCAweGEyYzE5ZDAwCi0wLCAgICAgICAgMTEwLCAgICAgICAgMTEwLCAgICAgICAgMSwgICAgODQ0ODAsIDB4Y2U5NDMzNmYKLTAsICAgICAgICAxMTEsICAgICAgICAxMTEsICAgICAgICAxLCAgICA4NDQ4MCwgMHhmYTliY2YxNAotMCwgICAgICAgIDExOCwgICAgICAgIDExOCwgICAgICAgIDEsICAgIDg0NDgwLCAweDI0ZDZhMjQzCi0wLCAgICAgICAgMTE5LCAgICAgICAgMTE5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWUxYzg4NTQKLTAsICAgICAgICAxMjAsICAgICAgICAxMjAsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiYjg5NjhiZgotMCwgICAgICAgIDEyMSwgICAgICAgIDEyMSwgICAgICAgIDEsICAgIDg0NDgwLCAweDZmOTIzNjIzCi0wLCAgICAgICAgMTIyLCAgICAgICAgMTIyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4MjJlOTgwMjkKLTAsICAgICAgICAxMjMsICAgICAgICAxMjMsICAgICAgICAxLCAgICA4NDQ4MCwgMHg4YWMzM2FmMwotMCwgICAgICAgIDEyNCwgICAgICAgIDEyNCwgICAgICAgIDEsICAgIDg0NDgwLCAweDA1OTQ3YjZlCi0wLCAgICAgICAgMTI1LCAgICAgICAgMTI1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmMzNTY2MWEKLTAsICAgICAgICAxMjYsICAgICAgICAxMjYsICAgICAgICAxLCAgICA4NDQ4MCwgMHgwZTZiNmU0NwotMCwgICAgICAgIDEyNywgICAgICAgIDEyNywgICAgICAgIDEsICAgIDg0NDgwLCAweDgyYzc2NGJiCi0wLCAgICAgICAgMTI4LCAgICAgICAgMTI4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4NTdhMzY4MzMKLTAsICAgICAgICAxMjksICAgICAgICAxMjksICAgICAgICAxLCAgICA4NDQ4MCwgMHhjOGRkNjkwYQotMCwgICAgICAgIDEzMCwgICAgICAgIDEzMCwgICAgICAgIDEsICAgIDg0NDgwLCAweDAyYzQ3MjMyCi0wLCAgICAgICAgMTMxLCAgICAgICAgMTMxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4NjY0NTcxNWQKLTAsICAgICAgICAxMzIsICAgICAgICAxMzIsICAgICAgICAxLCAgICA4NDQ4MCwgMHhjNjQ4NjBmNwotMCwgICAgICAgIDEzMywgICAgICAgIDEzMywgICAgICAgIDEsICAgIDg0NDgwLCAweDRmNTYxNGIzCi0wLCAgICAgICAgMTM0LCAgICAgICAgMTM0LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YTcwODQyY2EKLTAsICAgICAgICAxMzUsICAgICAgICAxMzUsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzNzlkODQ1OAotMCwgICAgICAgIDEzNiwgICAgICAgIDEzNiwgICAgICAgIDEsICAgIDg0NDgwLCAweGExNDcwMWNmCi0wLCAgICAgICAgMTM3LCAgICAgICAgMTM3LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWQxYWEyYjIKLTAsICAgICAgICAxMzgsICAgICAgICAxMzgsICAgICAgICAxLCAgICA4NDQ4MCwgMHhlZTI4ZjMyMAotMCwgICAgICAgIDEzOSwgICAgICAgIDEzOSwgICAgICAgIDEsICAgIDg0NDgwLCAweDUwNTgwMWU5Ci0wLCAgICAgICAgMTQwLCAgICAgICAgMTQwLCAgICAgICAgMSwgICAgODQ0ODAsIDB4Nzk0NzIzM2IKLTAsICAgICAgICAxNDEsICAgICAgICAxNDEsICAgICAgICAxLCAgICA4NDQ4MCwgMHgzY2U3MmE5ZAotMCwgICAgICAgIDE0MiwgICAgICAgIDE0MiwgICAgICAgIDEsICAgIDg0NDgwLCAweGE2ODM0ZTY0Ci0wLCAgICAgICAgMTQzLCAgICAgICAgMTQzLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZmViZjRkNzAKLTAsICAgICAgICAxNDQsICAgICAgICAxNDQsICAgICAgICAxLCAgICA4NDQ4MCwgMHg0YTA3NzVlMgotMCwgICAgICAgIDE0NSwgICAgICAgIDE0NSwgICAgICAgIDEsICAgIDg0NDgwLCAweDlkN2U5NDViCi0wLCAgICAgICAgMTQ2LCAgICAgICAgMTQ2LCAgICAgICAgMSwgICAgODQ0ODAsIDB4YWE5ZWFkZDkKLTAsICAgICAgICAxNDcsICAgICAgICAxNDcsICAgICAgICAxLCAgICA4NDQ4MCwgMHhhYTg1YzliMQotMCwgICAgICAgIDE0OCwgICAgICAgIDE0OCwgICAgICAgIDEsICAgIDg0NDgwLCAweGEwMDVlZGFmCi0wLCAgICAgICAgMTQ5LCAgICAgICAgMTQ5LCAgICAgICAgMSwgICAgODQ0ODAsIDB4N2ZjNGU1Y2MKLTAsICAgICAgICAxNTAsICAgICAgICAxNTAsICAgICAgICAxLCAgICA4NDQ4MCwgMHhiMGY2ZThkMQotMCwgICAgICAgIDE1MSwgICAgICAgIDE1MSwgICAgICAgIDEsICAgIDg0NDgwLCAweDllZjlmMzMwCi0wLCAgICAgICAgMTUyLCAgICAgICAgMTUyLCAgICAgICAgMSwgICAgODQ0ODAsIDB4YmUxNGZmMWYKLTAsICAgICAgICAxNTMsICAgICAgICAxNTMsICAgICAgICAxLCAgICA4NDQ4MCwgMHhkNDk0MDQ4YwotMCwgICAgICAgIDE1NCwgICAgICAgIDE1NCwgICAgICAgIDEsICAgIDg0NDgwLCAweDA0NjE2NmE3Ci0wLCAgICAgICAgMTU1LCAgICAgICAgMTU1LCAgICAgICAgMSwgICAgODQ0ODAsIDB4MDUyYTA5YjIKLTAsICAgICAgICAxNTYsICAgICAgICAxNTYsICAgICAgICAxLCAgICA4NDQ4MCwgMHg3MWZmZjRhYgotMCwgICAgICAgIDE1NywgICAgICAgIDE1NywgICAgICAgIDEsICAgIDg0NDgwLCAweGI5Njg0ZTQxCi0wLCAgICAgICAgMTU4LCAgICAgICAgMTU4LCAgICAgICAgMSwgICAgODQ0ODAsIDB4MWRkY2UwNjgKLTAsICAgICAgICAxNTksICAgICAgICAxNTksICAgICAgICAxLCAgICA4NDQ4MCwgMHhiOWRlMzAwZQotMCwgICAgICAgIDE2MCwgICAgICAgIDE2MCwgICAgICAgIDEsICAgIDg0NDgwLCAweDEzOTYyNTkwCi0wLCAgICAgICAgMTYxLCAgICAgICAgMTYxLCAgICAgICAgMSwgICAgODQ0ODAsIDB4ZGU3OTQ4MmYKLTAsICAgICAgICAxNjIsICAgICAgICAxNjIsICAgICAgICAxLCAgICA4NDQ4MCwgMHg3ZDFjYTA2NApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUvd212OC1kcm0tbm9kZWMgYi90ZXN0cy9yZWYvZmF0ZS93bXY4LWRybS1ub2RlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5YzhiNi4uMDAwMDAwMAotLS0gYS90ZXN0cy9yZWYvZmF0ZS93bXY4LWRybS1ub2RlYworKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0jZXh0cmFkYXRhIDA6ICAgICAgICA0LCAweDAyMTgwMGEyCi0jZXh0cmFkYXRhIDE6ICAgICAgIDQ2LCAweDYzZDkwNDNhCi0jdGIgMDogMS8xMDAwCi0jdGIgMTogMS8xMDAwCi0wLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMCwgICAgICAyODIsIDB4MDAwZDk0OWEKLTEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAwLCAgICAgMTA4OCwgMHg1Y2QzNzliYgotMSwgICAgICAgIDQzNSwgICAgICAgIDQzNSwgICAgICAgIDAsICAgICAxMDg4LCAweDhkZmExMzY4Ci0xLCAgICAgICAgNzQwLCAgICAgICAgNzQwLCAgICAgICAgMCwgICAgIDEwODgsIDB4YzBkMjExYmUKLTEsICAgICAgIDEwMjMsICAgICAgIDEwMjMsICAgICAgICAwLCAgICAgMTA4OCwgMHg4MjM4MTEzYQotMCwgICAgICAgMTIwOCwgICAgICAgMTIwOCwgICAgICAgIDAsICAgICAgMTM3LCAweDkwM2M0MTVlLCBGPTB4MAotMCwgICAgICAgMTI1MCwgICAgICAgMTI1MCwgICAgICAgIDAsICAgICAgOTQyLCAweGQ1YjdkMmFhLCBGPTB4MAotMCwgICAgICAgMTI5MSwgICAgICAgMTI5MSwgICAgICAgIDAsICAgICAgODQxLCAweGFmZmQ4Y2U2LCBGPTB4MAotMSwgICAgICAgMTMwNiwgICAgICAgMTMwNiwgICAgICAgIDAsICAgICAxMDg4LCAweDlmODkyNGI3Ci0wLCAgICAgICAxMzMzLCAgICAgICAxMzMzLCAgICAgICAgMCwgICAgIDExNjQsIDB4NGVkODQ4MzYsIEY9MHgwCi0wLCAgICAgICAxMzc1LCAgICAgICAxMzc1LCAgICAgICAgMCwgICAgIDE0OTIsIDB4MzdmM2U4YWEsIEY9MHgwCi0wLCAgICAgICAxNDE2LCAgICAgICAxNDE2LCAgICAgICAgMCwgICAgIDE2NjMsIDB4YzA5MTM5MmQsIEY9MHgwCi0wLCAgICAgICAxNDU4LCAgICAgICAxNDU4LCAgICAgICAgMCwgICAgIDE0NDMsIDB4NjE2MmM3MTgsIEY9MHgwCi0wLCAgICAgICAxNTAwLCAgICAgICAxNTAwLCAgICAgICAgMCwgICAgIDE3MjEsIDB4N2JkYjNkZDAsIEY9MHgwCi0wLCAgICAgICAxNTQxLCAgICAgICAxNTQxLCAgICAgICAgMCwgICAgIDE0MTAsIDB4ZGU2ODk4ODEsIEY9MHgwCi0wLCAgICAgICAxNTgzLCAgICAgICAxNTgzLCAgICAgICAgMCwgICAgIDEyNTgsIDB4YjViODY5MjAsIEY9MHgwCi0xLCAgICAgICAxNTg5LCAgICAgICAxNTg5LCAgICAgICAgMCwgICAgIDEwODgsIDB4NzY3ZjMxN2EKLTAsICAgICAgIDE2MjUsICAgICAgIDE2MjUsICAgICAgICAwLCAgICAgMjA1MCwgMHg5OWI2ZDdjNywgRj0weDAKLTAsICAgICAgIDE2NjYsICAgICAgIDE2NjYsICAgICAgICAwLCAgICAgMTI0MiwgMHg5YmEzNTAwOSwgRj0weDAKLTAsICAgICAgIDE3MDgsICAgICAgIDE3MDgsICAgICAgICAwLCAgICAgMTYzMCwgMHgxN2YxMDE5MiwgRj0weDAKLTAsICAgICAgIDE3NTAsICAgICAgIDE3NTAsICAgICAgICAwLCAgICAgMTc0NywgMHhiYmVlNTlkNywgRj0weDAKLTAsICAgICAgIDE3OTEsICAgICAgIDE3OTEsICAgICAgICAwLCAgICAgMTU2NSwgMHhiMDliMDBkOSwgRj0weDAKLTAsICAgICAgIDE4MzMsICAgICAgIDE4MzMsICAgICAgICAwLCAgICAgMTU3MywgMHhkMmU2MjIwMSwgRj0weDAKLTEsICAgICAgIDE4NzIsICAgICAgIDE4NzIsICAgICAgICAwLCAgICAgMTA4OCwgMHg1NzAwMGQzOAotMCwgICAgICAgMTg3NSwgICAgICAgMTg3NSwgICAgICAgIDAsICAgICAxMzUzLCAweDIzMDVhMjRkLCBGPTB4MAotMCwgICAgICAgMTkxNiwgICAgICAgMTkxNiwgICAgICAgIDAsICAgICAxNDI1LCAweGY0MWJiYjQ2LCBGPTB4MAotMCwgICAgICAgMTk1OCwgICAgICAgMTk1OCwgICAgICAgIDAsICAgICAxMzU1LCAweGZjMDhhNzYyLCBGPTB4MAotMCwgICAgICAgMjAwMCwgICAgICAgMjAwMCwgICAgICAgIDAsICAgICAxMzYzLCAweDk4Y2RhNzFkLCBGPTB4MAotMCwgICAgICAgMjA0MSwgICAgICAgMjA0MSwgICAgICAgIDAsICAgICAxNTQ3LCAweDg3NDJmMTFmLCBGPTB4MAotMCwgICAgICAgMjA4MywgICAgICAgMjA4MywgICAgICAgIDAsICAgICAxOTY3LCAweDQzZDYxNzIzLCBGPTB4MAotMCwgICAgICAgMjEyNSwgICAgICAgMjEyNSwgICAgICAgIDAsICAgICAxMzc4LCAweGRlMjJjNzUzLCBGPTB4MAotMCwgICAgICAgMjE2NiwgICAgICAgMjE2NiwgICAgICAgIDAsICAgICAgOTYxLCAweDI0MThhNGRhLCBGPTB4MAotMSwgICAgICAgMjE5OCwgICAgICAgMjE5OCwgICAgICAgIDAsICAgICAxMDg4LCAweGFkOTc3MjYxCi0wLCAgICAgICAyMjA4LCAgICAgICAyMjA4LCAgICAgICAgMCwgICAgICA5NjgsIDB4MGQwNGJhNTEsIEY9MHgwCi0wLCAgICAgICAyMjUwLCAgICAgICAyMjUwLCAgICAgICAgMCwgICAgIDExNDAsIDB4NzM3ZjM1NDMsIEY9MHgwCi0wLCAgICAgICAyMjkxLCAgICAgICAyMjkxLCAgICAgICAgMCwgICAgIDExMTksIDB4M2MwNTAzODgsIEY9MHgwCi0wLCAgICAgICAyMzMzLCAgICAgICAyMzMzLCAgICAgICAgMCwgICAgIDEwNzgsIDB4ZWFjOGQ5ODEsIEY9MHgwCi0wLCAgICAgICAyMzc1LCAgICAgICAyMzc1LCAgICAgICAgMCwgICAgIDExMTMsIDB4ZWJmYTAzMTQsIEY9MHgwCi0wLCAgICAgICAyNDE2LCAgICAgICAyNDE2LCAgICAgICAgMCwgICAgIDEyMjksIDB4OTVkYzNjYjUsIEY9MHgwCi0wLCAgICAgICAyNDU4LCAgICAgICAyNDU4LCAgICAgICAgMCwgICAgIDEzMTEsIDB4OGE2ZjViZGEsIEY9MHgwCi0wLCAgICAgICAyNTAwLCAgICAgICAyNTAwLCAgICAgICAgMCwgICAgIDEyNzAsIDB4MmU2NjU0MGEsIEY9MHgwCi0wLCAgICAgICAyNTQxLCAgICAgICAyNTQxLCAgICAgICAgMCwgICAgIDE0MDgsIDB4NWY0ODk3NzksIEY9MHgwCi0wLCAgICAgICAyNTgzLCAgICAgICAyNTgzLCAgICAgICAgMCwgICAgIDEzNTksIDB4OGJkMDg1ZjUsIEY9MHgwCi0wLCAgICAgICAyNjI1LCAgICAgICAyNjI1LCAgICAgICAgMCwgICAgIDE0MjgsIDB4ZWY5YmE0ODAsIEY9MHgwCi0wLCAgICAgICAyNjY2LCAgICAgICAyNjY2LCAgICAgICAgMCwgICAgIDExNzksIDB4NWJiMjIxYTgsIEY9MHgwCi0wLCAgICAgICAyNzA4LCAgICAgICAyNzA4LCAgICAgICAgMCwgICAgIDExMDgsIDB4OWE2MDE5YTgsIEY9MHgwCi0wLCAgICAgICAyNzUwLCAgICAgICAyNzUwLCAgICAgICAgMCwgICAgIDEyMDUsIDB4Y2NiYTRkMjIsIEY9MHgwCi0wLCAgICAgICAyNzkxLCAgICAgICAyNzkxLCAgICAgICAgMCwgICAgIDEzMDYsIDB4ZGU3MDhjMTksIEY9MHgwCi0wLCAgICAgICAyODMzLCAgICAgICAyODMzLCAgICAgICAgMCwgICAgIDE3MjQsIDB4YTcwYjUyMWUsIEY9MHgwCi0wLCAgICAgICAyODc1LCAgICAgICAyODc1LCAgICAgICA0MSwgICAgIDEzMzYsIDB4ZGYzOTc0YjksIEY9MHgwCi0wLCAgICAgICAyOTE2LCAgICAgICAyOTE2LCAgICAgICA0MSwgICAgIDEyNTksIDB4MWY2YjQzMDcsIEY9MHgwCi0wLCAgICAgICAyOTU4LCAgICAgICAyOTU4LCAgICAgICA0MSwgICAgIDExOTQsIDB4NjM1ZjVhNDMsIEY9MHgwCi0wLCAgICAgICAzMDAwLCAgICAgICAzMDAwLCAgICAgICA0MSwgICAgIDExODMsIDB4MWRkNDcxMTUsIEY9MHgwCi0wLCAgICAgICAzMDQxLCAgICAgICAzMDQxLCAgICAgICA0MSwgICAgIDExMjYsIDB4NWJhYzNjYzgsIEY9MHgwCi0wLCAgICAgICAzMDgzLCAgICAgICAzMDgzLCAgICAgICA0MSwgICAgIDEzNjAsIDB4MWZlMmQ5ODEsIEY9MHgwCi0wLCAgICAgICAzMTI1LCAgICAgICAzMTI1LCAgICAgICA0MSwgICAgIDEyNjEsIDB4MzQyODhhY2IsIEY9MHgwCi0wLCAgICAgICAzMTY2LCAgICAgICAzMTY2LCAgICAgICA0MSwgICAgIDEyNTAsIDB4MjZiZDcyYjMsIEY9MHgwCi0wLCAgICAgICAzMjA4LCAgICAgICAzMjA4LCAgICAgICA0MSwgICAgIDExNDcsIDB4MDJlODFiYTAsIEY9MHgwCi0wLCAgICAgICAzMjUwLCAgICAgICAzMjUwLCAgICAgICA0MSwgICAgIDEzNjgsIDB4YjgxNDY5NjIsIEY9MHgwCi0wLCAgICAgICAzMjkxLCAgICAgICAzMjkxLCAgICAgICA0MSwgICAgIDEzNzcsIDB4ZjdiNmNlNjUsIEY9MHgwCi0wLCAgICAgICAzMzMzLCAgICAgICAzMzMzLCAgICAgICA0MSwgICAgIDEzOTYsIDB4ODg0NjdkZWUsIEY9MHgwCi0wLCAgICAgICAzMzc1LCAgICAgICAzMzc1LCAgICAgICA0MSwgICAgIDE0MDgsIDB4NTU4NWMyNWMsIEY9MHgwCi0wLCAgICAgICAzNDE2LCAgICAgICAzNDE2LCAgICAgICA0MSwgICAgIDE1NTEsIDB4NDIwMDJjOGQsIEY9MHgwCi0wLCAgICAgICAzNDU4LCAgICAgICAzNDU4LCAgICAgICA0MSwgICAgIDE1MjQsIDB4YmNiNjA5ZTMsIEY9MHgwCi0xLCAgICAgICAzNDgyLCAgICAgICAzNDgyLCAgICAgICAgMCwgICAgIDEwODgsIDB4ZGNlNTc0NzEKLTAsICAgICAgIDM1MDAsICAgICAgIDM1MDAsICAgICAgIDQxLCAgICAgMTU1NCwgMHgzZDc0MDU2NCwgRj0weDAKLTAsICAgICAgIDM1NDEsICAgICAgIDM1NDEsICAgICAgIDQxLCAgICAgMTQ2NywgMHhjMzQ5ZjJkNywgRj0weDAKLTAsICAgICAgIDM1ODMsICAgICAgIDM1ODMsICAgICAgIDQxLCAgICAgMTA2NiwgMHhiNzQwMTQ2MiwgRj0weDAKLTAsICAgICAgIDM2MjUsICAgICAgIDM2MjUsICAgICAgIDQxLCAgICAgMTUwMiwgMHgzZWU2MDJlZCwgRj0weDAKLTAsICAgICAgIDM2NjYsICAgICAgIDM2NjYsICAgICAgIDQxLCAgICAgMTE0OCwgMHhiYTQ2MzYzNywgRj0weDAKLTAsICAgICAgIDM3MDgsICAgICAgIDM3MDgsICAgICAgIDQxLCAgICAgMTM1MSwgMHg1ZTg1YWU3OSwgRj0weDAKLTAsICAgICAgIDM3NTAsICAgICAgIDM3NTAsICAgICAgIDQxLCAgICAgMTE4NywgMHhlZDhkNjA1NSwgRj0weDAKLTAsICAgICAgIDM3OTEsICAgICAgIDM3OTEsICAgICAgIDQxLCAgICAgMTIwMCwgMHg2NDE4NWJlNiwgRj0weDAKLTAsICAgICAgIDM4MzMsICAgICAgIDM4MzMsICAgICAgIDQxLCAgICAgMTE3NSwgMHgxMmFkM2MxZSwgRj0weDAKLTAsICAgICAgIDM4NzUsICAgICAgIDM4NzUsICAgICAgIDQxLCAgICAgMTE3OSwgMHg3ZTAzNDU3MCwgRj0weDAKLTAsICAgICAgIDM5MTYsICAgICAgIDM5MTYsICAgICAgIDQxLCAgICAgMTEzNiwgMHg1YzYzM2M1MSwgRj0weDAKLTEsICAgICAgIDM5MTgsICAgICAgIDM5MTgsICAgICAgICAwLCAgICAgMTA4OCwgMHhmMzg4Nzk3NwotMCwgICAgICAgMzk1OCwgICAgICAgMzk1OCwgICAgICAgNDEsICAgICAxMDY0LCAweDVlYjUxZDg5LCBGPTB4MAotMCwgICAgICAgNDAwMCwgICAgICAgNDAwMCwgICAgICAgNDEsICAgICAgOTUzLCAweGUxNDhiYmRkLCBGPTB4MAotMCwgICAgICAgNDA0MSwgICAgICAgNDA0MSwgICAgICAgNDEsICAgICAgOTg5LCAweDkwMWVjMzA2LCBGPTB4MAotMCwgICAgICAgNDA4MywgICAgICAgNDA4MywgICAgICAgNDEsICAgICAxMDMwLCAweDY4MGRlMjZmLCBGPTB4MAotMCwgICAgICAgNDEyNSwgICAgICAgNDEyNSwgICAgICAgNDEsICAgICAxMDc4LCAweDg2ZTBlZTQzLCBGPTB4MAotMCwgICAgICAgNDE2NiwgICAgICAgNDE2NiwgICAgICAgNDEsICAgICAxMjMyLCAweDk4NTQ2YTg2LCBGPTB4MAotMCwgICAgICAgNDIwOCwgICAgICAgNDIwOCwgICAgICAgNDEsICAgICAxMTY0LCAweDkzMzA1MDc0LCBGPTB4MAotMCwgICAgICAgNDI1MCwgICAgICAgNDI1MCwgICAgICAgNDEsICAgICAxMzQ4LCAweDI3Y2ZhOTFiLCBGPTB4MAotMCwgICAgICAgNDI5MSwgICAgICAgNDI5MSwgICAgICAgNDEsICAgICAxNDE3LCAweDIzMTJkNzBlLCBGPTB4MAotMCwgICAgICAgNDMzMywgICAgICAgNDMzMywgICAgICAgNDEsICAgICAxMjg1LCAweDQ2Y2E0Y2NhLCBGPTB4MAotMSwgICAgICAgNDM1MywgICAgICAgNDM1MywgICAgICAgIDAsICAgICAxMDg4LCAweDFkNmM4ZWQyCi0wLCAgICAgICA0Mzc1LCAgICAgICA0Mzc1LCAgICAgICA0MSwgICAgIDEwMzcsIDB4Y2YwOWRkM2QsIEY9MHgwCi0wLCAgICAgICA0NDE2LCAgICAgICA0NDE2LCAgICAgICA0MSwgICAgIDEwMDUsIDB4ZTc4MGNmMWYsIEY9MHgwCi0wLCAgICAgICA0NDU4LCAgICAgICA0NDU4LCAgICAgICA0MSwgICAgICA4OTAsIDB4OGIxZDhjMWIsIEY9MHgwCi0wLCAgICAgICA0NTAwLCAgICAgICA0NTAwLCAgICAgICA0MSwgICAgIDEwMjMsIDB4ZDFkYmQ1MDYsIEY9MHgwCi0wLCAgICAgICA0NTQxLCAgICAgICA0NTQxLCAgICAgICA0MSwgICAgICA4MDMsIDB4OTM1ZTc3NWUsIEY9MHgwCi0wLCAgICAgICA0NTgzLCAgICAgICA0NTgzLCAgICAgICA0MSwgICAgIDEwMzUsIDB4NmEyMjA0ODMsIEY9MHgwCi0wLCAgICAgICA0NjI1LCAgICAgICA0NjI1LCAgICAgICA0MSwgICAgICA0NjYsIDB4ZDg4YmIyMzcsIEY9MHgwCi0xLCAgICAgICA0Nzg5LCAgICAgICA0Nzg5LCAgICAgICAgMCwgICAgIDEwODgsIDB4MDkxMTViYWUKLTAsICAgICAgIDQ5MTYsICAgICAgIDQ5MTYsICAgICAgIDQxLCAgICAgIDk0NSwgMHg4ZjJlYjFlYywgRj0weDAKLTAsICAgICAgIDQ5NTgsICAgICAgIDQ5NTgsICAgICAgIDQxLCAgICAgMTE5MCwgMHg0YzQ1MWMxYgotMCwgICAgICAgNTAwMCwgICAgICAgNTAwMCwgICAgICAgNDEsICAgICAxODExLCAweDcyN2M1MmNiLCBGPTB4MAotMCwgICAgICAgNTA0MSwgICAgICAgNTA0MSwgICAgICAgNDEsICAgICAxNTUyLCAweDczZjgyYmZmLCBGPTB4MAotMCwgICAgICAgNTA4MywgICAgICAgNTA4MywgICAgICAgNDEsICAgICAxNTQ0LCAweGE3MjQxZWNlLCBGPTB4MAotMCwgICAgICAgNTEyNSwgICAgICAgNTEyNSwgICAgICAgNDEsICAgICAxNzA3LCAweDNkMWE2NDY0LCBGPTB4MAotMCwgICAgICAgNTE2NiwgICAgICAgNTE2NiwgICAgICAgNDEsICAgICAxMTAzLCAweDA2YjIyNzEwLCBGPTB4MAotMCwgICAgICAgNTIwOCwgICAgICAgNTIwOCwgICAgICAgNDEsICAgICAxMTIyLCAweDY1NjcyNWI4LCBGPTB4MAotMSwgICAgICAgNTIyNCwgICAgICAgNTIyNCwgICAgICAgIDAsICAgICAxMDg4LCAweDBjOGI5MzcyCi0wLCAgICAgICA1MjUwLCAgICAgICA1MjUwLCAgICAgICA0MSwgICAgIDExNTAsIDB4Zjk2NzQ2NzgsIEY9MHgwCi0wLCAgICAgICA1MjkxLCAgICAgICA1MjkxLCAgICAgICA0MSwgICAgIDE0MzgsIDB4MDNmYWM0MjYsIEY9MHgwCi0wLCAgICAgICA1MzMzLCAgICAgICA1MzMzLCAgICAgICA0MSwgICAgIDE2MjMsIDB4N2FkYjEzMjEsIEY9MHgwCi0wLCAgICAgICA1Mzc1LCAgICAgICA1Mzc1LCAgICAgICA0MSwgICAgIDE2NzcsIDB4MGI5YTNlNjIsIEY9MHgwCi0wLCAgICAgICA1NDE2LCAgICAgICA1NDE2LCAgICAgICA0MSwgICAgIDExMjQsIDB4NzY5YzBlYTIsIEY9MHgwCi0wLCAgICAgICA1NDU4LCAgICAgICA1NDU4LCAgICAgICA0MSwgICAgIDEyMjEsIDB4ZDk0MjQwOWYsIEY9MHgwCi0wLCAgICAgICA1NTAwLCAgICAgICA1NTAwLCAgICAgICA0MSwgICAgIDE2OTgsIDB4ZDdjYTNmZTMsIEY9MHgwCi0wLCAgICAgICA1NTQxLCAgICAgICA1NTQxLCAgICAgICA0MSwgICAgIDEyNjIsIDB4Yjk5NDY5MmYsIEY9MHgwCi0wLCAgICAgICA1NTgzLCAgICAgICA1NTgzLCAgICAgICA0MSwgICAgIDIwOTcsIDB4ZjRlYjY2M2YsIEY9MHgwCi0wLCAgICAgICA1NjI1LCAgICAgICA1NjI1LCAgICAgICA0MSwgICAgIDEyNTEsIDB4ZmQ0ZjYzM2EsIEY9MHgwCi0xLCAgICAgICA1NjU5LCAgICAgICA1NjU5LCAgICAgICAgMCwgICAgIDEwODgsIDB4NzVhODI1NDAKLTAsICAgICAgIDU2NjYsICAgICAgIDU2NjYsICAgICAgIDQxLCAgICAgMTYzMywgMHhiN2UxMjkwZSwgRj0weDAKLTAsICAgICAgIDU3MDgsICAgICAgIDU3MDgsICAgICAgIDQxLCAgICAgMTczOSwgMHhlY2QxOGMzOCwgRj0weDAKLTAsICAgICAgIDU3NTAsICAgICAgIDU3NTAsICAgICAgIDQxLCAgICAgMTEzMiwgMHhjODNlMTgyOCwgRj0weDAKLTAsICAgICAgIDU3OTEsICAgICAgIDU3OTEsICAgICAgIDQxLCAgICAgIDgyNSwgMHhkZDAyODY3YywgRj0weDAKLTAsICAgICAgIDU4MzMsICAgICAgIDU4MzMsICAgICAgIDQxLCAgICAgIDkwMywgMHgzNDliYTIwNSwgRj0weDAKLTAsICAgICAgIDU4NzUsICAgICAgIDU4NzUsICAgICAgIDQxLCAgICAgMTAxMywgMHgxMzY2ZWMyYSwgRj0weDAKLTAsICAgICAgIDU5MTYsICAgICAgIDU5MTYsICAgICAgIDQxLCAgICAgMTM0MCwgMHhlYWEyYTIzMSwgRj0weDAKLTAsICAgICAgIDU5NTgsICAgICAgIDU5NTgsICAgICAgIDQxLCAgICAgMTEwMiwgMHg4MmRlMjg4OSwgRj0weDAKLTAsICAgICAgIDYwMDAsICAgICAgIDYwMDAsICAgICAgIDQxLCAgICAgMTgzNCwgMHg1OWI5OWI5MiwgRj0weDAKLTEsICAgICAgIDYwMDgsICAgICAgIDYwMDgsICAgICAgICAwLCAgICAgMTA4OCwgMHg2OTAzMTJiMAotMCwgICAgICAgNjA0MSwgICAgICAgNjA0MSwgICAgICAgNDEsICAgICAxMzMyLCAweDA2MTA4MTNhLCBGPTB4MAotMCwgICAgICAgNjA4MywgICAgICAgNjA4MywgICAgICAgNDEsICAgICAxMjc1LCAweDViMGQ3YmU3LCBGPTB4MAotMCwgICAgICAgNjEyNSwgICAgICAgNjEyNSwgICAgICAgNDEsICAgICAxMzc2LCAweGQ5MTViMGZlLCBGPTB4MAotMCwgICAgICAgNjE2NiwgICAgICAgNjE2NiwgICAgICAgNDEsICAgICAxNDE3LCAweDg2MDZiMzRhLCBGPTB4MAotMCwgICAgICAgNjIwOCwgICAgICAgNjIwOCwgICAgICAgNDEsICAgICAxMzYwLCAweDNiY2Q5M2QzLCBGPTB4MAotMCwgICAgICAgNjI1MCwgICAgICAgNjI1MCwgICAgICAgNDEsICAgICAxMzMwLCAweGQwNDM5YzkzLCBGPTB4MAotMCwgICAgICAgNjI5MSwgICAgICAgNjI5MSwgICAgICAgNDEsICAgICAxNTYyLCAweGIyNTYwYTA5LCBGPTB4MAotMSwgICAgICAgNjMxMiwgICAgICAgNjMxMiwgICAgICAgIDAsICAgICAxMDg4LCAweDc2ZDUwZmYzCi0wLCAgICAgICA2MzMzLCAgICAgICA2MzMzLCAgICAgICA0MSwgICAgIDEzNzYsIDB4NGY5ZWI0NDcsIEY9MHgwCi0wLCAgICAgICA2Mzc1LCAgICAgICA2Mzc1LCAgICAgICA0MSwgICAgIDE0MDUsIDB4ODVkM2IwODQsIEY9MHgwCi0wLCAgICAgICA2NDE2LCAgICAgICA2NDE2LCAgICAgICA0MSwgICAgIDEzNDQsIDB4Y2RiZGEyYWUsIEY9MHgwCi0wLCAgICAgICA2NDU4LCAgICAgICA2NDU4LCAgICAgICA0MSwgICAgIDEzMTMsIDB4ZTMwNjdiMzUsIEY9MHgwCi0wLCAgICAgICA2NTAwLCAgICAgICA2NTAwLCAgICAgICA0MSwgICAgIDE0NTksIDB4ZjlkMmM1NmYsIEY9MHgwCi0wLCAgICAgICA2NTQxLCAgICAgICA2NTQxLCAgICAgICA0MSwgICAgIDEyNzUsIDB4ZjU1MzZkODEsIEY9MHgwCi0wLCAgICAgICA2NTgzLCAgICAgICA2NTgzLCAgICAgICA0MSwgICAgIDEyMDksIDB4M2I1YjRlYTUsIEY9MHgwCi0xLCAgICAgICA2NTk1LCAgICAgICA2NTk1LCAgICAgICAgMCwgICAgIDEwODgsIDB4ODc2NjI3NmYKLTAsICAgICAgIDY2MjUsICAgICAgIDY2MjUsICAgICAgIDQxLCAgICAgMTM1MiwgMHg3YjE5OWQyOCwgRj0weDAKLTAsICAgICAgIDY2NjYsICAgICAgIDY2NjYsICAgICAgIDQxLCAgICAgMTM0OSwgMHgwMmFkYWFmMywgRj0weDAKLTAsICAgICAgIDY3MDgsICAgICAgIDY3MDgsICAgICAgIDQxLCAgICAgMTQ2NCwgMHgyMGQ3Y2ZkMiwgRj0weDAKLTAsICAgICAgIDY3NTAsICAgICAgIDY3NTAsICAgICAgIDQxLCAgICAgMTM3NywgMHg3OGUwYjFmNCwgRj0weDAKLTAsICAgICAgIDY3OTEsICAgICAgIDY3OTEsICAgICAgIDQxLCAgICAgIDI4OSwgMHgxZjJlOTI0NiwgRj0weDAKLTEsICAgICAgIDY4NzgsICAgICAgIDY4NzgsICAgICAgICAwLCAgICAgMTA4OCwgMHg2NzhmMjBmZAotMSwgICAgICAgNzE2MSwgICAgICAgNzE2MSwgICAgICAgIDAsICAgICAxMDg4LCAweDcxOGFmYTIwCi0xLCAgICAgICA3NDQ0LCAgICAgICA3NDQ0LCAgICAgICAgMCwgICAgIDEwODgsIDB4NzU4ZjA5MzkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3dtdjgteDhpbnRyYSBiL3Rlc3RzL3JlZi9mYXRlL3dtdjgteDhpbnRyYQppbmRleCAxZjc1Y2UyLi5jOWVkMjczIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS93bXY4LXg4aW50cmEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvd212OC14OGludHJhCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEvMTUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDNmYmQ4MzgKIDAsICAgICAgICAgIDMsICAgICAgICAgIDMsICAgICAgICAxLCAgIDExNTIwMCwgMHg4OTExZDg2ZgogMCwgICAgICAgICAgNCwgICAgICAgICAgNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDdjNWRkODJlCkBAIC0xOSw0NDcgKzIzLDQ0NyBAQAogMCwgICAgICAgICA0MywgICAgICAgICA0MywgICAgICAgIDEsICAgMTE1MjAwLCAweDRlNjczMDI3CiAwLCAgICAgICAgIDQ0LCAgICAgICAgIDQ0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTQ3MTc5NzkKIDAsICAgICAgICAgNDUsICAgICAgICAgNDUsICAgICAgICAxLCAgIDExNTIwMCwgMHhmOWU1NTdjOQotMCwgICAgICAgICA0NiwgICAgICAgICA0NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGVmYWQ2MzQ0Ci0wLCAgICAgICAgIDQ3LCAgICAgICAgIDQ3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDc0OTdiYTMKLTAsICAgICAgICAgNDgsICAgICAgICAgNDgsICAgICAgICAxLCAgIDExNTIwMCwgMHhhYmVmNzFkMwotMCwgICAgICAgICA0OSwgICAgICAgICA0OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDViOGY1ODAyCi0wLCAgICAgICAgIDUwLCAgICAgICAgIDUwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGI5MjBiNzYKLTAsICAgICAgICAgNTEsICAgICAgICAgNTEsICAgICAgICAxLCAgIDExNTIwMCwgMHhiOTNmMGYwNAotMCwgICAgICAgICA1MiwgICAgICAgICA1MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGEzMWIxOGMwCi0wLCAgICAgICAgIDUzLCAgICAgICAgIDUzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTExNjIzNWIKLTAsICAgICAgICAgNTQsICAgICAgICAgNTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhlNTRiMWQwYgotMCwgICAgICAgICA1NSwgICAgICAgICA1NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM1ZTcyNTJhCi0wLCAgICAgICAgIDU2LCAgICAgICAgIDU2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmNhZTMxZDUKLTAsICAgICAgICAgNTcsICAgICAgICAgNTcsICAgICAgICAxLCAgIDExNTIwMCwgMHgyODQ5M2M1NwotMCwgICAgICAgICA1OCwgICAgICAgICA1OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ4YTQ0NWI1Ci0wLCAgICAgICAgIDU5LCAgICAgICAgIDU5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmY4NTRjNTUKLTAsICAgICAgICAgNjAsICAgICAgICAgNjAsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNzYxNTU1YwotMCwgICAgICAgICA2MSwgICAgICAgICA2MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDA3YTM1YzhhCi0wLCAgICAgICAgIDYyLCAgICAgICAgIDYyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODQ4YzZlYjAKLTAsICAgICAgICAgNjMsICAgICAgICAgNjMsICAgICAgICAxLCAgIDExNTIwMCwgMHg4ZDdjNzdkMQotMCwgICAgICAgICA2NCwgICAgICAgICA2NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDkwMzk4MGI3Ci0wLCAgICAgICAgIDY1LCAgICAgICAgIDY1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmQzMDg5OGMKLTAsICAgICAgICAgNjYsICAgICAgICAgNjYsICAgICAgICAxLCAgIDExNTIwMCwgMHgzMWY3OGQyNQotMCwgICAgICAgICA2NywgICAgICAgICA2NywgICAgICAgIDEsICAgMTE1MjAwLCAweDMwOGFhMTlkCi0wLCAgICAgICAgIDY4LCAgICAgICAgIDY4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjE4NTk0OGMKLTAsICAgICAgICAgNjksICAgICAgICAgNjksICAgICAgICAxLCAgIDExNTIwMCwgMHg4YWVlYTBiOQotMCwgICAgICAgICA3MCwgICAgICAgICA3MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDA2NjY5NTQ1Ci0wLCAgICAgICAgIDcxLCAgICAgICAgIDcxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGQzZTg0ZDcKLTAsICAgICAgICAgNzIsICAgICAgICAgNzIsICAgICAgICAxLCAgIDExNTIwMCwgMHg4MDAwN2U5YwotMCwgICAgICAgICA3MywgICAgICAgICA3MywgICAgICAgIDEsICAgMTE1MjAwLCAweDdjYWQ2ZWE1Ci0wLCAgICAgICAgIDc0LCAgICAgICAgIDc0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDVkNzQ3ZjYKLTAsICAgICAgICAgNzUsICAgICAgICAgNzUsICAgICAgICAxLCAgIDExNTIwMCwgMHhlZGRiNDNiZgotMCwgICAgICAgICA3NiwgICAgICAgICA3NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDJkM2MzMGI1Ci0wLCAgICAgICAgIDc3LCAgICAgICAgIDc3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2I0NjU4NzIKLTAsICAgICAgICAgNzgsICAgICAgICAgNzgsICAgICAgICAxLCAgIDExNTIwMCwgMHhkMTQ0YjQ2MQotMCwgICAgICAgICA3OSwgICAgICAgICA3OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM2YjAwNTNlCi0wLCAgICAgICAgIDgwLCAgICAgICAgIDgwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGY5MGVjNjQKLTAsICAgICAgICAgODEsICAgICAgICAgODEsICAgICAgICAxLCAgIDExNTIwMCwgMHhiNTljZWNjNgotMCwgICAgICAgICA4MiwgICAgICAgICA4MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDA0NjllZDUyCi0wLCAgICAgICAgIDgzLCAgICAgICAgIDgzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmQ3Y2Y3Y2IKLTAsICAgICAgICAgODQsICAgICAgICAgODQsICAgICAgICAxLCAgIDExNTIwMCwgMHg4Mzc2YmYyYwotMCwgICAgICAgICA4NSwgICAgICAgICA4NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ3OWRiZDFlCi0wLCAgICAgICAgIDg2LCAgICAgICAgIDg2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmM3OTk5NmQKLTAsICAgICAgICAgODcsICAgICAgICAgODcsICAgICAgICAxLCAgIDExNTIwMCwgMHg1MjRkMGE2MgotMCwgICAgICAgICA4OCwgICAgICAgICA4OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDA3Nzk4ZjQ0Ci0wLCAgICAgICAgIDg5LCAgICAgICAgIDg5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDhiODVkNDkKLTAsICAgICAgICAgOTAsICAgICAgICAgOTAsICAgICAgICAxLCAgIDExNTIwMCwgMHg1NDEyNmQwNwotMCwgICAgICAgICA5MSwgICAgICAgICA5MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDAzNDZmMzUwCi0wLCAgICAgICAgIDkyLCAgICAgICAgIDkyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGZlYWRhNGYKLTAsICAgICAgICAgOTMsICAgICAgICAgOTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg3NDI0M2M2NQotMCwgICAgICAgICA5NCwgICAgICAgICA5NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGJjZTI4MGM4Ci0wLCAgICAgICAgIDk1LCAgICAgICAgIDk1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTliYzQwYzcKLTAsICAgICAgICAgOTYsICAgICAgICAgOTYsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MmVjZWEyMQotMCwgICAgICAgICA5NywgICAgICAgICA5NywgICAgICAgIDEsICAgMTE1MjAwLCAweGI0YzMyYTQzCi0wLCAgICAgICAgIDk4LCAgICAgICAgIDk4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDI4YTYyNzYKLTAsICAgICAgICAgOTksICAgICAgICAgOTksICAgICAgICAxLCAgIDExNTIwMCwgMHhmNjdmOTM2NAotMCwgICAgICAgIDEwMCwgICAgICAgIDEwMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGYyNWU4ODU4Ci0wLCAgICAgICAgMTAxLCAgICAgICAgMTAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTczOWI5MDkKLTAsICAgICAgICAxMDIsICAgICAgICAxMDIsICAgICAgICAxLCAgIDExNTIwMCwgMHg4YTFiOGYzOAotMCwgICAgICAgIDEwMywgICAgICAgIDEwMywgICAgICAgIDEsICAgMTE1MjAwLCAweGU0YTJjZmYxCi0wLCAgICAgICAgMTA0LCAgICAgICAgMTA0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTgwMGI4M2YKKzAsICAgICAgICAgNDYsICAgICAgICAgNDYsICAgICAgICAxLCAgIDExNTIwMCwgMHhiZGNmNjM1OAorMCwgICAgICAgICA0NywgICAgICAgICA0NywgICAgICAgIDEsICAgMTE1MjAwLCAweGQ1NWM3YmI3CiswLCAgICAgICAgIDQ4LCAgICAgICAgIDQ4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzhkMTcxZTcKKzAsICAgICAgICAgNDksICAgICAgICAgNDksICAgICAgICAxLCAgIDExNTIwMCwgMHgyODcxNTgxNgorMCwgICAgICAgICA1MCwgICAgICAgICA1MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDU4NzQwYjhhCiswLCAgICAgICAgIDUxLCAgICAgICAgIDUxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODZjMTBmMTgKKzAsICAgICAgICAgNTIsICAgICAgICAgNTIsICAgICAgICAxLCAgIDExNTIwMCwgMHg5MDM5MThmOQorMCwgICAgICAgICA1MywgICAgICAgICA1MywgICAgICAgIDEsICAgMTE1MjAwLCAweDdmNzQyMzk0CiswLCAgICAgICAgIDU0LCAgICAgICAgIDU0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDNhOTFkNDQKKzAsICAgICAgICAgNTUsICAgICAgICAgNTUsICAgICAgICAxLCAgIDExNTIwMCwgMHgyNDQ1MjU2MworMCwgICAgICAgICA1NiwgICAgICAgICA1NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDFiMGMzMjBlCiswLCAgICAgICAgIDU3LCAgICAgICAgIDU3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2E0OTNjOGUKKzAsICAgICAgICAgNTgsICAgICAgICAgNTgsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYmU0NDVlYworMCwgICAgICAgICA1OSwgICAgICAgICA1OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQyYzU0YzhjCiswLCAgICAgICAgIDYwLCAgICAgICAgIDYwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGFhMTU1OTMKKzAsICAgICAgICAgNjEsICAgICAgICAgNjEsICAgICAgICAxLCAgIDExNTIwMCwgMHgxOWEzNWNjMQorMCwgICAgICAgICA2MiwgICAgICAgICA2MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDk2OGM2ZWU3CiswLCAgICAgICAgIDYzLCAgICAgICAgIDYzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWY3Yzc4MDgKKzAsICAgICAgICAgNjQsICAgICAgICAgNjQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhMjM5ODBlZQorMCwgICAgICAgICA2NSwgICAgICAgICA2NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGNmMzA4OWMzCiswLCAgICAgICAgIDY2LCAgICAgICAgIDY2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDNmNzhkNWMKKzAsICAgICAgICAgNjcsICAgICAgICAgNjcsICAgICAgICAxLCAgIDExNTIwMCwgMHg0M2NhYTFkNAorMCwgICAgICAgICA2OCwgICAgICAgICA2OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDAyNTU5NGMzCiswLCAgICAgICAgIDY5LCAgICAgICAgIDY5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NWVjOGExMWMKKzAsICAgICAgICAgNzAsICAgICAgICAgNzAsICAgICAgICAxLCAgIDExNTIwMCwgMHg3ZjJhOTU5YgorMCwgICAgICAgICA3MSwgICAgICAgICA3MSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM2MDI4NTJkCiswLCAgICAgICAgIDcyLCAgICAgICAgIDcyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Njc3MzdlZjUKKzAsICAgICAgICAgNzMsICAgICAgICAgNzMsICAgICAgICAxLCAgIDExNTIwMCwgMHg4MWUwNmVmZQorMCwgICAgICAgICA3NCwgICAgICAgICA3NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGRiMGE0ODRmCiswLCAgICAgICAgIDc1LCAgICAgICAgIDc1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjMwZTQ0MTgKKzAsICAgICAgICAgNzYsICAgICAgICAgNzYsICAgICAgICAxLCAgIDExNTIwMCwgMHhiZGQxMzEwZAorMCwgICAgICAgICA3NywgICAgICAgICA3NywgICAgICAgIDEsICAgMTE1MjAwLCAweDBkMmE1OGNhCiswLCAgICAgICAgIDc4LCAgICAgICAgIDc4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTQyOGI0YmEKKzAsICAgICAgICAgNzksICAgICAgICAgNzksICAgICAgICAxLCAgIDExNTIwMCwgMHg0Yjg1MDU5NgorMCwgICAgICAgICA4MCwgICAgICAgICA4MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDM4ZDNlY2MwCiswLCAgICAgICAgIDgxLCAgICAgICAgIDgxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NmJiMGVkMjMKKzAsICAgICAgICAgODIsICAgICAgICAgODIsICAgICAgICAxLCAgIDExNTIwMCwgMHhiNTZlZWRhZgorMCwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgIDEsICAgMTE1MjAwLCAweGRlODFmODI4CiswLCAgICAgICAgIDg0LCAgICAgICAgIDg0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzM0YWJmODkKKzAsICAgICAgICAgODUsICAgICAgICAgODUsICAgICAgICAxLCAgIDExNTIwMCwgMHg4ZThlYmQ3OAorMCwgICAgICAgICA4NiwgICAgICAgICA4NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDk2YmE5OWM4CiswLCAgICAgICAgIDg3LCAgICAgICAgIDg3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmM4ZTBhYmQKKzAsICAgICAgICAgODgsICAgICAgICAgODgsICAgICAgICAxLCAgIDExNTIwMCwgMHhlMWFiOGY5ZgorMCwgICAgICAgICA4OSwgICAgICAgICA4OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGIyZjk1ZGE0CiswLCAgICAgICAgIDkwLCAgICAgICAgIDkwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmU1MzZkNjIKKzAsICAgICAgICAgOTEsICAgICAgICAgOTEsICAgICAgICAxLCAgIDExNTIwMCwgMHhkZDc4ZjNhYgorMCwgICAgICAgICA5MiwgICAgICAgICA5MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGVhMWNkYWFhCiswLCAgICAgICAgIDkzLCAgICAgICAgIDkzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGU2NTNjYzAKKzAsICAgICAgICAgOTQsICAgICAgICAgOTQsICAgICAgICAxLCAgIDExNTIwMCwgMHg5NWUzODEyMworMCwgICAgICAgICA5NSwgICAgICAgICA5NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDIwOTY0MTE5CiswLCAgICAgICAgIDk2LCAgICAgICAgIDk2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2QwOGVhNzQKKzAsICAgICAgICAgOTcsICAgICAgICAgOTcsICAgICAgICAxLCAgIDExNTIwMCwgMHgwZWVlMmE5NgorMCwgICAgICAgICA5OCwgICAgICAgICA5OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDk2NjY2MmM5CiswLCAgICAgICAgIDk5LCAgICAgICAgIDk5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTc1ODkzYjQKKzAsICAgICAgICAxMDAsICAgICAgICAxMDAsICAgICAgICAxLCAgIDExNTIwMCwgMHgwYWE4ODhhNworMCwgICAgICAgIDEwMSwgICAgICAgIDEwMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDgwZGFiOTY2CiswLCAgICAgICAgMTAyLCAgICAgICAgMTAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzhiYjhmOTUKKzAsICAgICAgICAxMDMsICAgICAgICAxMDMsICAgICAgICAxLCAgIDExNTIwMCwgMHg5YzcxZDAzZgorMCwgICAgICAgIDEwNCwgICAgICAgIDEwNCwgICAgICAgIDEsICAgMTE1MjAwLCAweGJlNWRiODg3CiAwLCAgICAgICAgMTA1LCAgICAgICAgMTA1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTg4ZTAwZDAKLTAsICAgICAgICAxMDYsICAgICAgICAxMDYsICAgICAgICAxLCAgIDExNTIwMCwgMHg1Nzg2MDgyZQotMCwgICAgICAgIDEwNywgICAgICAgIDEwNywgICAgICAgIDEsICAgMTE1MjAwLCAweGM3MjA1ZWViCi0wLCAgICAgICAgMTA4LCAgICAgICAgMTA4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWFkMDJkNmIKLTAsICAgICAgICAxMDksICAgICAgICAxMDksICAgICAgICAxLCAgIDExNTIwMCwgMHg1MzE0MTg1ZAotMCwgICAgICAgIDExMCwgICAgICAgIDExMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDAxNWI2MzUxCi0wLCAgICAgICAgMTExLCAgICAgICAgMTExLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTFhNWMyZTEKLTAsICAgICAgICAxMTIsICAgICAgICAxMTIsICAgICAgICAxLCAgIDExNTIwMCwgMHhjMjMyZWMyNgotMCwgICAgICAgIDExMywgICAgICAgIDExMywgICAgICAgIDEsICAgMTE1MjAwLCAweDM1YjMwZmZjCi0wLCAgICAgICAgMTE0LCAgICAgICAgMTE0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmI5NDdhY2QKLTAsICAgICAgICAxMTUsICAgICAgICAxMTUsICAgICAgICAxLCAgIDExNTIwMCwgMHhjZjFhNzk3MQotMCwgICAgICAgIDExNiwgICAgICAgIDExNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDcwMDU1NzQ4Ci0wLCAgICAgICAgMTE3LCAgICAgICAgMTE3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Nzc0YjYxZTYKLTAsICAgICAgICAxMTgsICAgICAgICAxMTgsICAgICAgICAxLCAgIDExNTIwMCwgMHg3NGRhNzhhNwotMCwgICAgICAgIDExOSwgICAgICAgIDExOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDEzYjU1MjNjCi0wLCAgICAgICAgMTIwLCAgICAgICAgMTIwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTI3MDUwYTAKLTAsICAgICAgICAxMjEsICAgICAgICAxMjEsICAgICAgICAxLCAgIDExNTIwMCwgMHgwNzMxNTZiMAotMCwgICAgICAgIDEyMiwgICAgICAgIDEyMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDlhMzY2MmQ0Ci0wLCAgICAgICAgMTIzLCAgICAgICAgMTIzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGM5MDEzOWMKLTAsICAgICAgICAxMjQsICAgICAgICAxMjQsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NWNkZWIwOAotMCwgICAgICAgIDEyNSwgICAgICAgIDEyNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDA0NmZmMjE3Ci0wLCAgICAgICAgMTI2LCAgICAgICAgMTI2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTZiMGE4NjMKLTAsICAgICAgICAxMjcsICAgICAgICAxMjcsICAgICAgICAxLCAgIDExNTIwMCwgMHhhOWMyNDI3YQotMCwgICAgICAgIDEyOCwgICAgICAgIDEyOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDdkNDc4ZGYxCi0wLCAgICAgICAgMTI5LCAgICAgICAgMTI5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWY0MjY1MDQKLTAsICAgICAgICAxMzAsICAgICAgICAxMzAsICAgICAgICAxLCAgIDExNTIwMCwgMHg4OTcyM2Q4OQotMCwgICAgICAgIDEzMSwgICAgICAgIDEzMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDg1MWRkMDIzCi0wLCAgICAgICAgMTMyLCAgICAgICAgMTMyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTZlZDAwN2QKLTAsICAgICAgICAxMzMsICAgICAgICAxMzMsICAgICAgICAxLCAgIDExNTIwMCwgMHhmZTVjYjA4ZAotMCwgICAgICAgIDEzNCwgICAgICAgIDEzNCwgICAgICAgIDEsICAgMTE1MjAwLCAweGM5NmU1MmJkCi0wLCAgICAgICAgMTM1LCAgICAgICAgMTM1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTVjNWZmZTgKLTAsICAgICAgICAxMzYsICAgICAgICAxMzYsICAgICAgICAxLCAgIDExNTIwMCwgMHg1NDU0MDY1NgotMCwgICAgICAgIDEzNywgICAgICAgIDEzNywgICAgICAgIDEsICAgMTE1MjAwLCAweGE1ZThkYmVjCi0wLCAgICAgICAgMTM4LCAgICAgICAgMTM4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzVlZGRlMjkKLTAsICAgICAgICAxMzksICAgICAgICAxMzksICAgICAgICAxLCAgIDExNTIwMCwgMHhiYmI2Y2IzNgotMCwgICAgICAgIDE0MCwgICAgICAgIDE0MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDU5YzVlZDUwCi0wLCAgICAgICAgMTQxLCAgICAgICAgMTQxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2U4YTQ5N2EKLTAsICAgICAgICAxNDIsICAgICAgICAxNDIsICAgICAgICAxLCAgIDExNTIwMCwgMHgxNjU4NmQzMwotMCwgICAgICAgIDE0MywgICAgICAgIDE0MywgICAgICAgIDEsICAgMTE1MjAwLCAweDE5ZGZkNmU2Ci0wLCAgICAgICAgMTQ0LCAgICAgICAgMTQ0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2VhODU3NGEKLTAsICAgICAgICAxNDUsICAgICAgICAxNDUsICAgICAgICAxLCAgIDExNTIwMCwgMHg1ODU2N2I0NAotMCwgICAgICAgIDE0NiwgICAgICAgIDE0NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDBkMmQwNDllCi0wLCAgICAgICAgMTQ3LCAgICAgICAgMTQ3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2MyZDdiMDAKLTAsICAgICAgICAxNDgsICAgICAgICAxNDgsICAgICAgICAxLCAgIDExNTIwMCwgMHg5MmRlYmRhNgotMCwgICAgICAgIDE0OSwgICAgICAgIDE0OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDFlNGNmY2MxCi0wLCAgICAgICAgMTUwLCAgICAgICAgMTUwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjU4Yjc0MmUKLTAsICAgICAgICAxNTEsICAgICAgICAxNTEsICAgICAgICAxLCAgIDExNTIwMCwgMHhjMjA4OWU4YgotMCwgICAgICAgIDE1MiwgICAgICAgIDE1MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDFiNGYwMWU4Ci0wLCAgICAgICAgMTUzLCAgICAgICAgMTUzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTEzYjFlNzYKLTAsICAgICAgICAxNTQsICAgICAgICAxNTQsICAgICAgICAxLCAgIDExNTIwMCwgMHgwZjE1NGI0OAotMCwgICAgICAgIDE1NSwgICAgICAgIDE1NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGY4MmY1Nzk1Ci0wLCAgICAgICAgMTU2LCAgICAgICAgMTU2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTlmNjhmNWMKLTAsICAgICAgICAxNTcsICAgICAgICAxNTcsICAgICAgICAxLCAgIDExNTIwMCwgMHhkMzc5OTJmYQotMCwgICAgICAgIDE1OCwgICAgICAgIDE1OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDVlMDhiMGFkCi0wLCAgICAgICAgMTU5LCAgICAgICAgMTU5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWNmNzdmNTAKLTAsICAgICAgICAxNjAsICAgICAgICAxNjAsICAgICAgICAxLCAgIDExNTIwMCwgMHg0YTM3OTQ1YgotMCwgICAgICAgIDE2MSwgICAgICAgIDE2MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDlkMjY3MGI3Ci0wLCAgICAgICAgMTYyLCAgICAgICAgMTYyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2Y3ZTVkNzYKLTAsICAgICAgICAxNjMsICAgICAgICAxNjMsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNTdkM2VjMwotMCwgICAgICAgIDE2NCwgICAgICAgIDE2NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGU0NjIyMjg3Ci0wLCAgICAgICAgMTY1LCAgICAgICAgMTY1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTUyNjBhYTYKLTAsICAgICAgICAxNjYsICAgICAgICAxNjYsICAgICAgICAxLCAgIDExNTIwMCwgMHhmZjg3MDQ5YQotMCwgICAgICAgIDE2NywgICAgICAgIDE2NywgICAgICAgIDEsICAgMTE1MjAwLCAweDViOTFjNzZiCi0wLCAgICAgICAgMTY4LCAgICAgICAgMTY4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTVmY2E0NGMKLTAsICAgICAgICAxNjksICAgICAgICAxNjksICAgICAgICAxLCAgIDExNTIwMCwgMHhjY2M0NmVlMQotMCwgICAgICAgIDE3MCwgICAgICAgIDE3MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDBhZWM1M2U4Ci0wLCAgICAgICAgMTcxLCAgICAgICAgMTcxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzUwOTUzN2YKLTAsICAgICAgICAxNzIsICAgICAgICAxNzIsICAgICAgICAxLCAgIDExNTIwMCwgMHhkNjUxNmE4MQotMCwgICAgICAgIDE3MywgICAgICAgIDE3MywgICAgICAgIDEsICAgMTE1MjAwLCAweGJjMTQ1NjJiCi0wLCAgICAgICAgMTc0LCAgICAgICAgMTc0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTNmOTYxOWUKLTAsICAgICAgICAxNzUsICAgICAgICAxNzUsICAgICAgICAxLCAgIDExNTIwMCwgMHgyY2JlMzVlZgotMCwgICAgICAgIDE3NiwgICAgICAgIDE3NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ3OGE0MGI5Ci0wLCAgICAgICAgMTc3LCAgICAgICAgMTc3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmNmYTA4Y2QKLTAsICAgICAgICAxNzgsICAgICAgICAxNzgsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZWNlMDlmZQotMCwgICAgICAgIDE3OSwgICAgICAgIDE3OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM0NDVkNDNhCi0wLCAgICAgICAgMTgwLCAgICAgICAgMTgwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTFjYmFjZGQKLTAsICAgICAgICAxODEsICAgICAgICAxODEsICAgICAgICAxLCAgIDExNTIwMCwgMHg3YTAzYjQyMQotMCwgICAgICAgIDE4MiwgICAgICAgIDE4MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDdjODBhYjI3Ci0wLCAgICAgICAgMTgzLCAgICAgICAgMTgzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWNlY2FlNjAKLTAsICAgICAgICAxODQsICAgICAgICAxODQsICAgICAgICAxLCAgIDExNTIwMCwgMHhlZjAwYzZiMwotMCwgICAgICAgIDE4NSwgICAgICAgIDE4NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGNkYzllNzhkCi0wLCAgICAgICAgMTg2LCAgICAgICAgMTg2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTUxNzBkZDEKLTAsICAgICAgICAxODcsICAgICAgICAxODcsICAgICAgICAxLCAgIDExNTIwMCwgMHhmZTU2MWUxZgotMCwgICAgICAgIDE4OCwgICAgICAgIDE4OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGM1ZDA1NmY5Ci0wLCAgICAgICAgMTg5LCAgICAgICAgMTg5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjAyNjcyODQKLTAsICAgICAgICAxOTAsICAgICAgICAxOTAsICAgICAgICAxLCAgIDExNTIwMCwgMHhjZGM0YTA5YQotMCwgICAgICAgIDE5MSwgICAgICAgIDE5MSwgICAgICAgIDEsICAgMTE1MjAwLCAweGE4YzhhZjQwCi0wLCAgICAgICAgMTkyLCAgICAgICAgMTkyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGMwY2M5ODcKLTAsICAgICAgICAxOTMsICAgICAgICAxOTMsICAgICAgICAxLCAgIDExNTIwMCwgMHgxM2EwY2M2NAotMCwgICAgICAgIDE5NCwgICAgICAgIDE5NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDBmZjNlNmZlCi0wLCAgICAgICAgMTk1LCAgICAgICAgMTk1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2ZiZmU4NTIKLTAsICAgICAgICAxOTYsICAgICAgICAxOTYsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MmVhMDI3MwotMCwgICAgICAgIDE5NywgICAgICAgIDE5NywgICAgICAgIDEsICAgMTE1MjAwLCAweDhkMDIxMzMwCi0wLCAgICAgICAgMTk4LCAgICAgICAgMTk4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2FjNjMyMWEKLTAsICAgICAgICAxOTksICAgICAgICAxOTksICAgICAgICAxLCAgIDExNTIwMCwgMHhlZmM5MmRlOAotMCwgICAgICAgIDIwMCwgICAgICAgIDIwMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDRiZTk1YzI0Ci0wLCAgICAgICAgMjAxLCAgICAgICAgMjAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjYyYzc5YjAKLTAsICAgICAgICAyMDIsICAgICAgICAyMDIsICAgICAgICAxLCAgIDExNTIwMCwgMHgxZDlmODVjNgotMCwgICAgICAgIDIwMywgICAgICAgIDIwMywgICAgICAgIDEsICAgMTE1MjAwLCAweDEzYjZhZDhmCi0wLCAgICAgICAgMjA0LCAgICAgICAgMjA0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2Q5NmU0NTEKLTAsICAgICAgICAyMDUsICAgICAgICAyMDUsICAgICAgICAxLCAgIDExNTIwMCwgMHgwODkxZjNjNAotMCwgICAgICAgIDIwNiwgICAgICAgIDIwNiwgICAgICAgIDEsICAgMTE1MjAwLCAweGM3MjhmOGNkCi0wLCAgICAgICAgMjA3LCAgICAgICAgMjA3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTQ4MWVlNzQKLTAsICAgICAgICAyMDgsICAgICAgICAyMDgsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZjk1ZmNmOQotMCwgICAgICAgIDIwOSwgICAgICAgIDIwOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDg1NmZlNDhkCi0wLCAgICAgICAgMjEwLCAgICAgICAgMjEwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NWI5YzAzZGEKLTAsICAgICAgICAyMTEsICAgICAgICAyMTEsICAgICAgICAxLCAgIDExNTIwMCwgMHg5OGY4MDIyOAotMCwgICAgICAgIDIxMiwgICAgICAgIDIxMiwgICAgICAgIDEsICAgMTE1MjAwLCAweGE0ZTUyMTQ4Ci0wLCAgICAgICAgMjEzLCAgICAgICAgMjEzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjViYzRiOTEKLTAsICAgICAgICAyMTQsICAgICAgICAyMTQsICAgICAgICAxLCAgIDExNTIwMCwgMHgwYzE2NjMxMgotMCwgICAgICAgIDIxNSwgICAgICAgIDIxNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQ2NTdhMzU2Ci0wLCAgICAgICAgMjE2LCAgICAgICAgMjE2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjE3ZTAwMDMKLTAsICAgICAgICAyMTcsICAgICAgICAyMTcsICAgICAgICAxLCAgIDExNTIwMCwgMHg5NWE4MTczOAotMCwgICAgICAgIDIxOCwgICAgICAgIDIxOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGIwMmQ2YmQ5Ci0wLCAgICAgICAgMjE5LCAgICAgICAgMjE5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MjU5NGU4OWQKLTAsICAgICAgICAyMjAsICAgICAgICAyMjAsICAgICAgICAxLCAgIDExNTIwMCwgMHg1YzRhMTM0OQotMCwgICAgICAgIDIyMSwgICAgICAgIDIyMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGJjOWQ1ODc1Ci0wLCAgICAgICAgMjIyLCAgICAgICAgMjIyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDkzNWIzMDcKLTAsICAgICAgICAyMjMsICAgICAgICAyMjMsICAgICAgICAxLCAgIDExNTIwMCwgMHgyMTE0Y2I4NAotMCwgICAgICAgIDIyNCwgICAgICAgIDIyNCwgICAgICAgIDEsICAgMTE1MjAwLCAweGJlNTgxMzBjCi0wLCAgICAgICAgMjI1LCAgICAgICAgMjI1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2EzZDJiMmIKLTAsICAgICAgICAyMjYsICAgICAgICAyMjYsICAgICAgICAxLCAgIDExNTIwMCwgMHhlNTc1M2U2YgotMCwgICAgICAgIDIyNywgICAgICAgIDIyNywgICAgICAgIDEsICAgMTE1MjAwLCAweGM4NDA0MmNjCi0wLCAgICAgICAgMjI4LCAgICAgICAgMjI4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OThlZjRjNTgKLTAsICAgICAgICAyMjksICAgICAgICAyMjksICAgICAgICAxLCAgIDExNTIwMCwgMHgyY2I4M2JmZgotMCwgICAgICAgIDIzMCwgICAgICAgIDIzMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDRlNTg0MzNhCi0wLCAgICAgICAgMjMxLCAgICAgICAgMjMxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2VjMjY3MzQKLTAsICAgICAgICAyMzIsICAgICAgICAyMzIsICAgICAgICAxLCAgIDExNTIwMCwgMHg0OTE2OGQwNwotMCwgICAgICAgIDIzMywgICAgICAgIDIzMywgICAgICAgIDEsICAgMTE1MjAwLCAweGZjOWU4MmYyCi0wLCAgICAgICAgMjM0LCAgICAgICAgMjM0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDk5NzZjMjYKLTAsICAgICAgICAyMzUsICAgICAgICAyMzUsICAgICAgICAxLCAgIDExNTIwMCwgMHhhMTI0NjZmZgotMCwgICAgICAgIDIzNiwgICAgICAgIDIzNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDk4YWU2NDk5Ci0wLCAgICAgICAgMjM3LCAgICAgICAgMjM3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Yzg1NzVlNzgKLTAsICAgICAgICAyMzgsICAgICAgICAyMzgsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNjU5NmNkMgotMCwgICAgICAgIDIzOSwgICAgICAgIDIzOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDgzZDlhMDY4Ci0wLCAgICAgICAgMjQwLCAgICAgICAgMjQwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTgxOWI1NjAKLTAsICAgICAgICAyNDEsICAgICAgICAyNDEsICAgICAgICAxLCAgIDExNTIwMCwgMHhiMDdhYzNjMwotMCwgICAgICAgIDI0MiwgICAgICAgIDI0MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDNkNzllZjViCi0wLCAgICAgICAgMjQzLCAgICAgICAgMjQzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmM2ODAwZTAKLTAsICAgICAgICAyNDQsICAgICAgICAyNDQsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNzhjMTVmOAotMCwgICAgICAgIDI0NSwgICAgICAgIDI0NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGNiOTEzNjBiCi0wLCAgICAgICAgMjQ2LCAgICAgICAgMjQ2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NmM2NTcxNDMKLTAsICAgICAgICAyNDcsICAgICAgICAyNDcsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MzYzOTFkMQotMCwgICAgICAgIDI0OCwgICAgICAgIDI0OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGI1MTllNDlkCi0wLCAgICAgICAgMjQ5LCAgICAgICAgMjQ5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjY1ZDAwYzUKLTAsICAgICAgICAyNTAsICAgICAgICAyNTAsICAgICAgICAxLCAgIDExNTIwMCwgMHgxNDY3MmJhOAotMCwgICAgICAgIDI1MSwgICAgICAgIDI1MSwgICAgICAgIDEsICAgMTE1MjAwLCAweGI2NWQzODlmCi0wLCAgICAgICAgMjUyLCAgICAgICAgMjUyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTg4ZTk5MWIKLTAsICAgICAgICAyNTMsICAgICAgICAyNTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg2YTdiYWQ0ZQotMCwgICAgICAgIDI1NCwgICAgICAgIDI1NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGQzMDVlY2ExCiswLCAgICAgICAgMTA2LCAgICAgICAgMTA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzdiNTA4MjcKKzAsICAgICAgICAxMDcsICAgICAgICAxMDcsICAgICAgICAxLCAgIDExNTIwMCwgMHhmOTE1NWVkMworMCwgICAgICAgIDEwOCwgICAgICAgIDEwOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDhkZDcyZDQ0CiswLCAgICAgICAgMTA5LCAgICAgICAgMTA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWUzODE4M2EKKzAsICAgICAgICAxMTAsICAgICAgICAxMTAsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYTJiNjMyOQorMCwgICAgICAgIDExMSwgICAgICAgIDExMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGY1NTZjMmIzCiswLCAgICAgICAgMTEyLCAgICAgICAgMTEyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTBlZGViZjkKKzAsICAgICAgICAxMTMsICAgICAgICAxMTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg0ZjQ0MGZkZgorMCwgICAgICAgIDExNCwgICAgICAgIDExNCwgICAgICAgIDEsICAgMTE1MjAwLCAweGZkZWM3YTlkCiswLCAgICAgICAgMTE1LCAgICAgICAgMTE1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Yzc5Mjc5NTIKKzAsICAgICAgICAxMTYsICAgICAgICAxMTYsICAgICAgICAxLCAgIDExNTIwMCwgMHhkZDQ3NTcwNAorMCwgICAgICAgIDExNywgICAgICAgIDExNywgICAgICAgIDEsICAgMTE1MjAwLCAweDk3NGE2MWE1CiswLCAgICAgICAgMTE4LCAgICAgICAgMTE4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmYyYjc4NWUKKzAsICAgICAgICAxMTksICAgICAgICAxMTksICAgICAgICAxLCAgIDExNTIwMCwgMHg1ZGU0NTFmYQorMCwgICAgICAgIDEyMCwgICAgICAgIDEyMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDNmYWM1MDNlCiswLCAgICAgICAgMTIxLCAgICAgICAgMTIxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzY3ODU2NDMKKzAsICAgICAgICAxMjIsICAgICAgICAxMjIsICAgICAgICAxLCAgIDExNTIwMCwgMHhlNjY2NjI1NAorMCwgICAgICAgIDEyMywgICAgICAgIDEyMywgICAgICAgIDEsICAgMTE1MjAwLCAweDFhMDUxMzBjCiswLCAgICAgICAgMTI0LCAgICAgICAgMTI0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDgyY2VhNWQKKzAsICAgICAgICAxMjUsICAgICAgICAxMjUsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NzNlZjE0MgorMCwgICAgICAgIDEyNiwgICAgICAgIDEyNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDk3NjlhNzc2CiswLCAgICAgICAgMTI3LCAgICAgICAgMTI3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTZlODQxYWYKKzAsICAgICAgICAxMjgsICAgICAgICAxMjgsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNDRjOGQxZQorMCwgICAgICAgIDEyOSwgICAgICAgIDEyOSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQwM2Q2NDFiCiswLCAgICAgICAgMTMwLCAgICAgICAgMTMwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2FlYTNjOWUKKzAsICAgICAgICAxMzEsICAgICAgICAxMzEsICAgICAgICAxLCAgIDExNTIwMCwgMHgwOWVmY2YyMQorMCwgICAgICAgIDEzMiwgICAgICAgIDEzMiwgICAgICAgIDEsICAgMTE1MjAwLCAweGVlYjZmZjY0CiswLCAgICAgICAgMTMzLCAgICAgICAgMTMzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTMxMGFmNmYKKzAsICAgICAgICAxMzQsICAgICAgICAxMzQsICAgICAgICAxLCAgIDExNTIwMCwgMHgyNDg4NTE5ZQorMCwgICAgICAgIDEzNSwgICAgICAgIDEzNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQ4ZTFmZWJmCiswLCAgICAgICAgMTM2LCAgICAgICAgMTM2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzZkMDA1MTMKKzAsICAgICAgICAxMzcsICAgICAgICAxMzcsICAgICAgICAxLCAgIDExNTIwMCwgMHhhMjhlZGE4MQorMCwgICAgICAgIDEzOCwgICAgICAgIDEzOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGMyY2JkY2FlCiswLCAgICAgICAgMTM5LCAgICAgICAgMTM5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDk3NmM5YjIKKzAsICAgICAgICAxNDAsICAgICAgICAxNDAsICAgICAgICAxLCAgIDExNTIwMCwgMHhiMGFiZWJhYgorMCwgICAgICAgIDE0MSwgICAgICAgIDE0MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDMyYmU0NzY1CiswLCAgICAgICAgMTQyLCAgICAgICAgMTQyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzBhMzZiMTEKKzAsICAgICAgICAxNDMsICAgICAgICAxNDMsICAgICAgICAxLCAgIDExNTIwMCwgMHhiNmQxZDQ3ZgorMCwgICAgICAgIDE0NCwgICAgICAgIDE0NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGFiNzk1NGE2CiswLCAgICAgICAgMTQ1LCAgICAgICAgMTQ1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzQ4NTc4OWMKKzAsICAgICAgICAxNDYsICAgICAgICAxNDYsICAgICAgICAxLCAgIDExNTIwMCwgMHhhMDcxMDFiNgorMCwgICAgICAgIDE0NywgICAgICAgIDE0NywgICAgICAgIDEsICAgMTE1MjAwLCAweDYyOTc3ODBhCiswLCAgICAgICAgMTQ4LCAgICAgICAgMTQ4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjU1MGJhOTQKKzAsICAgICAgICAxNDksICAgICAgICAxNDksICAgICAgICAxLCAgIDExNTIwMCwgMHg5Yjc3Zjk5NAorMCwgICAgICAgIDE1MCwgICAgICAgIDE1MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGIwZTg3MGFkCiswLCAgICAgICAgMTUxLCAgICAgICAgMTUxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmRkODliMGIKKzAsICAgICAgICAxNTIsICAgICAgICAxNTIsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNmRjZmUyZgorMCwgICAgICAgIDE1MywgICAgICAgIDE1MywgICAgICAgIDEsICAgMTE1MjAwLCAweDNlNWUxYThmCiswLCAgICAgICAgMTU0LCAgICAgICAgMTU0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjgzOTQ3NDAKKzAsICAgICAgICAxNTUsICAgICAgICAxNTUsICAgICAgICAxLCAgIDExNTIwMCwgMHhiZmM4NTJmYworMCwgICAgICAgIDE1NiwgICAgICAgIDE1NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDViM2Y4YWEyCiswLCAgICAgICAgMTU3LCAgICAgICAgMTU3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzI5ZDhlM2EKKzAsICAgICAgICAxNTgsICAgICAgICAxNTgsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MzAwYWJkOAorMCwgICAgICAgIDE1OSwgICAgICAgIDE1OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQxZGQ3YTNiCiswLCAgICAgICAgMTYwLCAgICAgICAgMTYwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTU5NzhmMzkKKzAsICAgICAgICAxNjEsICAgICAgICAxNjEsICAgICAgICAxLCAgIDExNTIwMCwgMHgyMzVjNmI4ZAorMCwgICAgICAgIDE2MiwgICAgICAgIDE2MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGVjMWI1ODA1CiswLCAgICAgICAgMTYzLCAgICAgICAgMTYzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTZkMjM5NDYKKzAsICAgICAgICAxNjQsICAgICAgICAxNjQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhOGRlMWNmNAorMCwgICAgICAgIDE2NSwgICAgICAgIDE2NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDVlNzMwNTEyCiswLCAgICAgICAgMTY2LCAgICAgICAgMTY2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTI1MGZlZWQKKzAsICAgICAgICAxNjcsICAgICAgICAxNjcsICAgICAgICAxLCAgIDExNTIwMCwgMHgwOTI4YzE5MAorMCwgICAgICAgIDE2OCwgICAgICAgIDE2OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGEyNWQ5ZTVjCiswLCAgICAgICAgMTY5LCAgICAgICAgMTY5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTIxMDY4ZWEKKzAsICAgICAgICAxNzAsICAgICAgICAxNzAsICAgICAgICAxLCAgIDExNTIwMCwgMHgyYzk3NGRkYgorMCwgICAgICAgIDE3MSwgICAgICAgIDE3MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDM1YWU0ZDc1CiswLCAgICAgICAgMTcyLCAgICAgICAgMTcyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWMwYzY0NjkKKzAsICAgICAgICAxNzMsICAgICAgICAxNzMsICAgICAgICAxLCAgIDExNTIwMCwgMHgyMjcwNGZhZAorMCwgICAgICAgIDE3NCwgICAgICAgIDE3NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDBhOWE1YWVkCiswLCAgICAgICAgMTc1LCAgICAgICAgMTc1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDUxOTJmMmYKKzAsICAgICAgICAxNzYsICAgICAgICAxNzYsICAgICAgICAxLCAgIDExNTIwMCwgMHhjMDdiMzlmNAorMCwgICAgICAgIDE3NywgICAgICAgIDE3NywgICAgICAgIDEsICAgMTE1MjAwLCAweDMyYzYwMjE1CiswLCAgICAgICAgMTc4LCAgICAgICAgMTc4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGE2NTAzNWUKKzAsICAgICAgICAxNzksICAgICAgICAxNzksICAgICAgICAxLCAgIDExNTIwMCwgMHg5OWQwY2Q4MQorMCwgICAgICAgIDE4MCwgICAgICAgIDE4MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGQwOGNhNWUzCiswLCAgICAgICAgMTgxLCAgICAgICAgMTgxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODJjZGFkMTcKKzAsICAgICAgICAxODIsICAgICAgICAxODIsICAgICAgICAxLCAgIDExNTIwMCwgMHgyNTg3YTQyMAorMCwgICAgICAgIDE4MywgICAgICAgIDE4MywgICAgICAgIDEsICAgMTE1MjAwLCAweDg1Y2JhNzNkCiswLCAgICAgICAgMTg0LCAgICAgICAgMTg0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDY3N2JmODkKKzAsICAgICAgICAxODUsICAgICAgICAxODUsICAgICAgICAxLCAgIDExNTIwMCwgMHg4NGMyZTAzNAorMCwgICAgICAgIDE4NiwgICAgICAgIDE4NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGQzNDMwNjZjCiswLCAgICAgICAgMTg3LCAgICAgICAgMTg3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGVjNzE2YTEKKzAsICAgICAgICAxODgsICAgICAgICAxODgsICAgICAgICAxLCAgIDExNTIwMCwgMHg5M2MwNGY1ZAorMCwgICAgICAgIDE4OSwgICAgICAgIDE4OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGNlMTI2YWM0CiswLCAgICAgICAgMTkwLCAgICAgICAgMTkwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTIwMDk4YzUKKzAsICAgICAgICAxOTEsICAgICAgICAxOTEsICAgICAgICAxLCAgIDExNTIwMCwgMHg5YTRjYTcxMQorMCwgICAgICAgIDE5MiwgICAgICAgIDE5MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGZhZTljMTU0CiswLCAgICAgICAgMTkzLCAgICAgICAgMTkzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjM0Y2M0MzEKKzAsICAgICAgICAxOTQsICAgICAgICAxOTQsICAgICAgICAxLCAgIDExNTIwMCwgMHg5MjNjZGVjMgorMCwgICAgICAgIDE5NSwgICAgICAgIDE5NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDYwZmZkZmU4CiswLCAgICAgICAgMTk2LCAgICAgICAgMTk2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTNlNmY5ZjIKKzAsICAgICAgICAxOTcsICAgICAgICAxOTcsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNzRmMGE0NworMCwgICAgICAgIDE5OCwgICAgICAgIDE5OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDhmYjIyOGYxCiswLCAgICAgICAgMTk5LCAgICAgICAgMTk5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGMxYTI0YmYKKzAsICAgICAgICAyMDAsICAgICAgICAyMDAsICAgICAgICAxLCAgIDExNTIwMCwgMHg3NjhhNTJkMQorMCwgICAgICAgIDIwMSwgICAgICAgIDIwMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDViZjc3MDI1CiswLCAgICAgICAgMjAyLCAgICAgICAgMjAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NmNhNjdjMmEKKzAsICAgICAgICAyMDMsICAgICAgICAyMDMsICAgICAgICAxLCAgIDExNTIwMCwgMHgxMDdjYTNlOQorMCwgICAgICAgIDIwNCwgICAgICAgIDIwNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDRhYmVkYTkzCiswLCAgICAgICAgMjA1LCAgICAgICAgMjA1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzUwYmU5ZmYKKzAsICAgICAgICAyMDYsICAgICAgICAyMDYsICAgICAgICAxLCAgIDExNTIwMCwgMHgyOGM1ZWVlMworMCwgICAgICAgIDIwNywgICAgICAgIDIwNywgICAgICAgIDEsICAgMTE1MjAwLCAweGExYjBlNGIyCiswLCAgICAgICAgMjA4LCAgICAgICAgMjA4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmFlN2YzM2QKKzAsICAgICAgICAyMDksICAgICAgICAyMDksICAgICAgICAxLCAgIDExNTIwMCwgMHhmMjljZGFlMAorMCwgICAgICAgIDIxMCwgICAgICAgIDIxMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ0NzBmOWVkCiswLCAgICAgICAgMjExLCAgICAgICAgMjExLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmQyMmY4MzIKKzAsICAgICAgICAyMTIsICAgICAgICAyMTIsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNWI5MTc4MAorMCwgICAgICAgIDIxMywgICAgICAgIDIxMywgICAgICAgIDEsICAgMTE1MjAwLCAweDNkOGU0MTUxCiswLCAgICAgICAgMjE0LCAgICAgICAgMjE0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDU5ZjU4ZTAKKzAsICAgICAgICAyMTUsICAgICAgICAyMTUsICAgICAgICAxLCAgIDExNTIwMCwgMHg4ZGMxOThmZQorMCwgICAgICAgIDIxNiwgICAgICAgIDIxNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDI0NzlmNTc5CiswLCAgICAgICAgMjE3LCAgICAgICAgMjE3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzIwNDBjMjEKKzAsICAgICAgICAyMTgsICAgICAgICAyMTgsICAgICAgICAxLCAgIDExNTIwMCwgMHgzOWFkNjBkNQorMCwgICAgICAgIDIxOSwgICAgICAgIDIxOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDkzMjlkZDM3CiswLCAgICAgICAgMjIwLCAgICAgICAgMjIwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTA4ODA3ZGEKKzAsICAgICAgICAyMjEsICAgICAgICAyMjEsICAgICAgICAxLCAgIDExNTIwMCwgMHhiZjUxNGNkMQorMCwgICAgICAgIDIyMiwgICAgICAgIDIyMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDhiNjZhNzc5CiswLCAgICAgICAgMjIzLCAgICAgICAgMjIzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODY1ZWJmZjUKKzAsICAgICAgICAyMjQsICAgICAgICAyMjQsICAgICAgICAxLCAgIDExNTIwMCwgMHg1OTY3MDc0YworMCwgICAgICAgIDIyNSwgICAgICAgIDIyNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ1NTIxZjYwCiswLCAgICAgICAgMjI2LCAgICAgICAgMjI2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDYyYzMyOWMKKzAsICAgICAgICAyMjcsICAgICAgICAyMjcsICAgICAgICAxLCAgIDExNTIwMCwgMHhiZWZkMzZmYgorMCwgICAgICAgIDIyOCwgICAgICAgIDIyOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDZmNTg0MDNiCiswLCAgICAgICAgMjI5LCAgICAgICAgMjI5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTRhZjJmYWMKKzAsICAgICAgICAyMzAsICAgICAgICAyMzAsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NjQ1MzY2MgorMCwgICAgICAgIDIzMSwgICAgICAgIDIzMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDcyY2M1OWU4CiswLCAgICAgICAgMjMyLCAgICAgICAgMjMyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDZjNjdmOGUKKzAsICAgICAgICAyMzMsICAgICAgICAyMzMsICAgICAgICAxLCAgIDExNTIwMCwgMHhkMzU2NzRhNworMCwgICAgICAgIDIzNCwgICAgICAgIDIzNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDY1Nzg1ZGRiCiswLCAgICAgICAgMjM1LCAgICAgICAgMjM1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZmQ3OTU4YWEKKzAsICAgICAgICAyMzYsICAgICAgICAyMzYsICAgICAgICAxLCAgIDExNTIwMCwgMHg5M2U0NTYwNworMCwgICAgICAgIDIzNywgICAgICAgIDIzNywgICAgICAgIDEsICAgMTE1MjAwLCAweDE5NmE0ZmE1CiswLCAgICAgICAgMjM4LCAgICAgICAgMjM4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTMzYTVkYWMKKzAsICAgICAgICAyMzksICAgICAgICAyMzksICAgICAgICAxLCAgIDExNTIwMCwgMHg0ZTY2OTA0YQorMCwgICAgICAgIDI0MCwgICAgICAgIDI0MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGMxZTNhNTBhCiswLCAgICAgICAgMjQxLCAgICAgICAgMjQxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTY4NWIzNTEKKzAsICAgICAgICAyNDIsICAgICAgICAyNDIsICAgICAgICAxLCAgIDExNTIwMCwgMHhlZTJmZGViNworMCwgICAgICAgIDI0MywgICAgICAgIDI0MywgICAgICAgIDEsICAgMTE1MjAwLCAweDE4OWNlZmRkCiswLCAgICAgICAgMjQ0LCAgICAgICAgMjQ0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmRmOTA1MDYKKzAsICAgICAgICAyNDUsICAgICAgICAyNDUsICAgICAgICAxLCAgIDExNTIwMCwgMHhlNzJjMjNkMgorMCwgICAgICAgIDI0NiwgICAgICAgIDI0NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGEzZjY1ZTdiCiswLCAgICAgICAgMjQ3LCAgICAgICAgMjQ3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGJjNjdlZWUKKzAsICAgICAgICAyNDgsICAgICAgICAyNDgsICAgICAgICAxLCAgIDExNTIwMCwgMHhkMzA1ZDA5YgorMCwgICAgICAgIDI0OSwgICAgICAgIDI0OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM1MjFlYmE1CiswLCAgICAgICAgMjUwLCAgICAgICAgMjUwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTZjZjE2MWYKKzAsICAgICAgICAyNTEsICAgICAgICAyNTEsICAgICAgICAxLCAgIDExNTIwMCwgMHgyY2UzMjJiNQorMCwgICAgICAgIDI1MiwgICAgICAgIDI1MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDU3Y2U4MmI0CiswLCAgICAgICAgMjUzLCAgICAgICAgMjUzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGRhODk2YjkKKzAsICAgICAgICAyNTQsICAgICAgICAyNTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhjMTZhZDU5MAogMCwgICAgICAgIDI1NSwgICAgICAgIDI1NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDhjZGJlNzI5Ci0wLCAgICAgICAgMjU2LCAgICAgICAgMjU2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGQxYmZkOWEKLTAsICAgICAgICAyNTcsICAgICAgICAyNTcsICAgICAgICAxLCAgIDExNTIwMCwgMHhlZjc0MGEwNgotMCwgICAgICAgIDI1OCwgICAgICAgIDI1OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDFjZDQyM2RmCi0wLCAgICAgICAgMjU5LCAgICAgICAgMjU5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Zjc4NjE2YmEKLTAsICAgICAgICAyNjAsICAgICAgICAyNjAsICAgICAgICAxLCAgIDExNTIwMCwgMHhjYzBiMmI4MQotMCwgICAgICAgIDI2MSwgICAgICAgIDI2MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQzNGU0YWU5Ci0wLCAgICAgICAgMjYyLCAgICAgICAgMjYyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjJkNDYxZWMKLTAsICAgICAgICAyNjMsICAgICAgICAyNjMsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNzVmNmExNQotMCwgICAgICAgIDI2NCwgICAgICAgIDI2NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDcxMDM4Yzg3Ci0wLCAgICAgICAgMjY1LCAgICAgICAgMjY1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2E1NWFiNTUKLTAsICAgICAgICAyNjYsICAgICAgICAyNjYsICAgICAgICAxLCAgIDExNTIwMCwgMHhlZWYyZTFkZQotMCwgICAgICAgIDI2NywgICAgICAgIDI2NywgICAgICAgIDEsICAgMTE1MjAwLCAweGQyNjAwYzNkCi0wLCAgICAgICAgMjY4LCAgICAgICAgMjY4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGQ4NzI0NTIKLTAsICAgICAgICAyNjksICAgICAgICAyNjksICAgICAgICAxLCAgIDExNTIwMCwgMHhkMTM2MWZjZAotMCwgICAgICAgIDI3MCwgICAgICAgIDI3MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGRhNGYwZDEyCi0wLCAgICAgICAgMjcxLCAgICAgICAgMjcxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmEwNjE5MjAKLTAsICAgICAgICAyNzIsICAgICAgICAyNzIsICAgICAgICAxLCAgIDExNTIwMCwgMHg0YjJlZjllZAotMCwgICAgICAgIDI3MywgICAgICAgIDI3MywgICAgICAgIDEsICAgMTE1MjAwLCAweDExZGZhYjA4Ci0wLCAgICAgICAgMjc0LCAgICAgICAgMjc0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2E2MDNmYzIKLTAsICAgICAgICAyNzUsICAgICAgICAyNzUsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MTY5MGFkOQotMCwgICAgICAgIDI3NiwgICAgICAgIDI3NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDQ4MWFjOGI5Ci0wLCAgICAgICAgMjc3LCAgICAgICAgMjc3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWEzNTU3MGQKKzAsICAgICAgICAyNTYsICAgICAgICAyNTYsICAgICAgICAxLCAgIDExNTIwMCwgMHg2OWVhZmQ5NgorMCwgICAgICAgIDI1NywgICAgICAgIDI1NywgICAgICAgIDEsICAgMTE1MjAwLCAweGQ5ZTQwYTAzCiswLCAgICAgICAgMjU4LCAgICAgICAgMjU4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjkxNDIzZTEKKzAsICAgICAgICAyNTksICAgICAgICAyNTksICAgICAgICAxLCAgIDExNTIwMCwgMHgwOWI1MTZiZAorMCwgICAgICAgIDI2MCwgICAgICAgIDI2MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDIwMjkyYjg1CiswLCAgICAgICAgMjYxLCAgICAgICAgMjYxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGNiYjRhZWIKKzAsICAgICAgICAyNjIsICAgICAgICAyNjIsICAgICAgICAxLCAgIDExNTIwMCwgMHg5OWI3NjFlYworMCwgICAgICAgIDI2MywgICAgICAgIDI2MywgICAgICAgIDEsICAgMTE1MjAwLCAweDI4NDA2YTE0CiswLCAgICAgICAgMjY0LCAgICAgICAgMjY0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWEzNjhjODYKKzAsICAgICAgICAyNjUsICAgICAgICAyNjUsICAgICAgICAxLCAgIDExNTIwMCwgMHhmMzg4YWI1NAorMCwgICAgICAgIDI2NiwgICAgICAgIDI2NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDI2M2ZlMWRlCiswLCAgICAgICAgMjY3LCAgICAgICAgMjY3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzM0MTBjMzkKKzAsICAgICAgICAyNjgsICAgICAgICAyNjgsICAgICAgICAxLCAgIDExNTIwMCwgMHhjMDU2MjQ0ZAorMCwgICAgICAgIDI2OSwgICAgICAgIDI2OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDk5YzUxZmM1CiswLCAgICAgICAgMjcwLCAgICAgICAgMjcwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2U0YTBkMDcKKzAsICAgICAgICAyNzEsICAgICAgICAyNzEsICAgICAgICAxLCAgIDExNTIwMCwgMHhjZDkxMTkxNgorMCwgICAgICAgIDI3MiwgICAgICAgIDI3MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDhiZDBmYTIxCiswLCAgICAgICAgMjczLCAgICAgICAgMjczLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDFhMWFiNzEKKzAsICAgICAgICAyNzQsICAgICAgICAyNzQsICAgICAgICAxLCAgIDExNTIwMCwgMHhiYzkwNDAyOAorMCwgICAgICAgIDI3NSwgICAgICAgIDI3NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGZkNDgwYWNjCiswLCAgICAgICAgMjc2LCAgICAgICAgMjc2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWNiNWM4YjUKKzAsICAgICAgICAyNzcsICAgICAgICAyNzcsICAgICAgICAxLCAgIDExNTIwMCwgMHhjYWQxNTcwOQogMCwgICAgICAgIDI3OCwgICAgICAgIDI3OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGRkMzA2ZjE5CiAwLCAgICAgICAgMjc5LCAgICAgICAgMjc5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2Y5NzVmMWIKIDAsICAgICAgICAyODAsICAgICAgICAyODAsICAgICAgICAxLCAgIDExNTIwMCwgMHgyMzg2Y2QxZgotMCwgICAgICAgIDI4MSwgICAgICAgIDI4MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDFiNzdmNTczCiswLCAgICAgICAgMjgxLCAgICAgICAgMjgxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2FhNGY1YjAKIDAsICAgICAgICAyODIsICAgICAgICAyODIsICAgICAgICAxLCAgIDExNTIwMCwgMHg4Y2UyMTNkZQogMCwgICAgICAgIDI4MywgICAgICAgIDI4MywgICAgICAgIDEsICAgMTE1MjAwLCAweDVmNzQwN2M2CiAwLCAgICAgICAgMjg0LCAgICAgICAgMjg0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDFiM2VlMDAKIDAsICAgICAgICAyODUsICAgICAgICAyODUsICAgICAgICAxLCAgIDExNTIwMCwgMHg5Mjc1OTcxNQogMCwgICAgICAgIDI4NiwgICAgICAgIDI4NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDRhMjA4ZTFlCiAwLCAgICAgICAgMjg3LCAgICAgICAgMjg3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NmUxYjgwYTUKLTAsICAgICAgICAyODgsICAgICAgICAyODgsICAgICAgICAxLCAgIDExNTIwMCwgMHgyOThjNzYyMQotMCwgICAgICAgIDI4OSwgICAgICAgIDI4OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDBlMjU1ZGE4Ci0wLCAgICAgICAgMjkwLCAgICAgICAgMjkwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWJkNjYxY2EKLTAsICAgICAgICAyOTEsICAgICAgICAyOTEsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ZjA0NTIyNgotMCwgICAgICAgIDI5MiwgICAgICAgIDI5MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDM5NmE1ZTRjCi0wLCAgICAgICAgMjkzLCAgICAgICAgMjkzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGJkNTM5MTUKLTAsICAgICAgICAyOTQsICAgICAgICAyOTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZjk2MzFiMwotMCwgICAgICAgIDI5NSwgICAgICAgIDI5NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGIyNjAyMjkwCi0wLCAgICAgICAgMjk2LCAgICAgICAgMjk2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjEyNzJmMWIKLTAsICAgICAgICAyOTcsICAgICAgICAyOTcsICAgICAgICAxLCAgIDExNTIwMCwgMHhlOGQyMzY5OQotMCwgICAgICAgIDI5OCwgICAgICAgIDI5OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ2ZTI1NThkCi0wLCAgICAgICAgMjk5LCAgICAgICAgMjk5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjEyNzAxMDYKLTAsICAgICAgICAzMDAsICAgICAgICAzMDAsICAgICAgICAxLCAgIDExNTIwMCwgMHg2YWIxZmM0ZgotMCwgICAgICAgIDMwMSwgICAgICAgIDMwMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDRhOWI1YzZmCi0wLCAgICAgICAgMzAyLCAgICAgICAgMzAyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTQxNzdiNjEKLTAsICAgICAgICAzMDMsICAgICAgICAzMDMsICAgICAgICAxLCAgIDExNTIwMCwgMHg4ZjdmNzk3MQotMCwgICAgICAgIDMwNCwgICAgICAgIDMwNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDE2NTk3M2NkCi0wLCAgICAgICAgMzA1LCAgICAgICAgMzA1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzQxYzRiYTUKLTAsICAgICAgICAzMDYsICAgICAgICAzMDYsICAgICAgICAxLCAgIDExNTIwMCwgMHgwOGRmMzkwMgotMCwgICAgICAgIDMwNywgICAgICAgIDMwNywgICAgICAgIDEsICAgMTE1MjAwLCAweDRjMWUzODZhCi0wLCAgICAgICAgMzA4LCAgICAgICAgMzA4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWIxYzM4N2MKLTAsICAgICAgICAzMDksICAgICAgICAzMDksICAgICAgICAxLCAgIDExNTIwMCwgMHhlNDJmZGI4MwotMCwgICAgICAgIDMxMCwgICAgICAgIDMxMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDViYjJhZDJlCi0wLCAgICAgICAgMzExLCAgICAgICAgMzExLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzE5MjQ5MDIKLTAsICAgICAgICAzMTIsICAgICAgICAzMTIsICAgICAgICAxLCAgIDExNTIwMCwgMHg1YTI5MGU5YQotMCwgICAgICAgIDMxMywgICAgICAgIDMxMywgICAgICAgIDEsICAgMTE1MjAwLCAweDE1ZDZlYTQ1Ci0wLCAgICAgICAgMzE0LCAgICAgICAgMzE0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjVhZGMzNGQKLTAsICAgICAgICAzMTUsICAgICAgICAzMTUsICAgICAgICAxLCAgIDExNTIwMCwgMHhiMjEwYTk1NgotMCwgICAgICAgIDMxNiwgICAgICAgIDMxNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDc5NDc4ZGFjCi0wLCAgICAgICAgMzE3LCAgICAgICAgMzE3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjI2YTNmYTkKLTAsICAgICAgICAzMTgsICAgICAgICAzMTgsICAgICAgICAxLCAgIDExNTIwMCwgMHg2YjBlMzcwZAotMCwgICAgICAgIDMxOSwgICAgICAgIDMxOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDFmMTExM2VjCi0wLCAgICAgICAgMzIwLCAgICAgICAgMzIwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzYyZWZhMTAKLTAsICAgICAgICAzMjEsICAgICAgICAzMjEsICAgICAgICAxLCAgIDExNTIwMCwgMHhjYThkZTYzNwotMCwgICAgICAgIDMyMiwgICAgICAgIDMyMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDQzMmUxZjE5Ci0wLCAgICAgICAgMzIzLCAgICAgICAgMzIzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTJjOTMwMzEKLTAsICAgICAgICAzMjQsICAgICAgICAzMjQsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MzI5NGZjYwotMCwgICAgICAgIDMyNSwgICAgICAgIDMyNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDFjMWQ1OTI4Ci0wLCAgICAgICAgMzI2LCAgICAgICAgMzI2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTVmYjQ1ZWEKLTAsICAgICAgICAzMjcsICAgICAgICAzMjcsICAgICAgICAxLCAgIDExNTIwMCwgMHgwNzEyY2M3NwotMCwgICAgICAgIDMyOCwgICAgICAgIDMyOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGFlZjFjOTRiCi0wLCAgICAgICAgMzI5LCAgICAgICAgMzI5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MzBjOGE4NGUKLTAsICAgICAgICAzMzAsICAgICAgICAzMzAsICAgICAgICAxLCAgIDExNTIwMCwgMHhkNjg5NmI3NQotMCwgICAgICAgIDMzMSwgICAgICAgIDMzMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDdmODgzOWNiCi0wLCAgICAgICAgMzMyLCAgICAgICAgMzMyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2Q2OWQ3ZDQKLTAsICAgICAgICAzMzMsICAgICAgICAzMzMsICAgICAgICAxLCAgIDExNTIwMCwgMHhhNmYzY2RhYQotMCwgICAgICAgIDMzNCwgICAgICAgIDMzNCwgICAgICAgIDEsICAgMTE1MjAwLCAweGNjYmRjNjA5Ci0wLCAgICAgICAgMzM1LCAgICAgICAgMzM1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmQzZjc3ZDcKLTAsICAgICAgICAzMzYsICAgICAgICAzMzYsICAgICAgICAxLCAgIDExNTIwMCwgMHgxOGY4NTgyZAotMCwgICAgICAgIDMzNywgICAgICAgIDMzNywgICAgICAgIDEsICAgMTE1MjAwLCAweGU4ODcxN2JiCi0wLCAgICAgICAgMzM4LCAgICAgICAgMzM4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjQyZmQ0NGIKLTAsICAgICAgICAzMzksICAgICAgICAzMzksICAgICAgICAxLCAgIDExNTIwMCwgMHg3ZWRhYTViNwotMCwgICAgICAgIDM0MCwgICAgICAgIDM0MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGVmMzk5YTdiCi0wLCAgICAgICAgMzQxLCAgICAgICAgMzQxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTFkNzVmMzUKLTAsICAgICAgICAzNDIsICAgICAgICAzNDIsICAgICAgICAxLCAgIDExNTIwMCwgMHhjMDcxN2I3OAorMCwgICAgICAgIDI4OCwgICAgICAgIDI4OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGU3OGM3NjIyCiswLCAgICAgICAgMjg5LCAgICAgICAgMjg5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2MyNTVkYTkKKzAsICAgICAgICAyOTAsICAgICAgICAyOTAsICAgICAgICAxLCAgIDExNTIwMCwgMHg2OWU1NjFjYgorMCwgICAgICAgIDI5MSwgICAgICAgIDI5MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDJkMTM1MjI3CiswLCAgICAgICAgMjkyLCAgICAgICAgMjkyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZmM2YTVlNGQKKzAsICAgICAgICAyOTMsICAgICAgICAyOTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg4MTQ3MzkxNAorMCwgICAgICAgIDI5NCwgICAgICAgIDI5NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGU1MDgzMWIyCiswLCAgICAgICAgMjk1LCAgICAgICAgMjk1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTdkMjIyOGYKKzAsICAgICAgICAyOTYsICAgICAgICAyOTYsICAgICAgICAxLCAgIDExNTIwMCwgMHhlNjk5MmYxYQorMCwgICAgICAgIDI5NywgICAgICAgIDI5NywgICAgICAgIDEsICAgMTE1MjAwLCAweDFlNTMzNjk4CiswLCAgICAgICAgMjk4LCAgICAgICAgMjk4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGM2MzU1OGMKKzAsICAgICAgICAyOTksICAgICAgICAyOTksICAgICAgICAxLCAgIDExNTIwMCwgMHg1NDk5MDEwNAorMCwgICAgICAgIDMwMCwgICAgICAgIDMwMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGNlMTRmYzRkCiswLCAgICAgICAgMzAxLCAgICAgICAgMzAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzYwYjVjNmUKKzAsICAgICAgICAzMDIsICAgICAgICAzMDIsICAgICAgICAxLCAgIDExNTIwMCwgMHgxNDE1N2I2MQorMCwgICAgICAgIDMwMywgICAgICAgIDMwMywgICAgICAgIDEsICAgMTE1MjAwLCAweDYyY2E3OTcyCiswLCAgICAgICAgMzA0LCAgICAgICAgMzA0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTk5NTczY2UKKzAsICAgICAgICAzMDUsICAgICAgICAzMDUsICAgICAgICAxLCAgIDExNTIwMCwgMHgzNmRmNGI4ZAorMCwgICAgICAgIDMwNiwgICAgICAgIDMwNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDI3MjIzOGVhCiswLCAgICAgICAgMzA3LCAgICAgICAgMzA3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjA2ZTM4NjMKKzAsICAgICAgICAzMDgsICAgICAgICAzMDgsICAgICAgICAxLCAgIDExNTIwMCwgMHg4YjE0Mzg3MworMCwgICAgICAgIDMwOSwgICAgICAgIDMwOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDJlNDZkYjllCiswLCAgICAgICAgMzEwLCAgICAgICAgMzEwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTEzMWFkNzgKKzAsICAgICAgICAzMTEsICAgICAgICAzMTEsICAgICAgICAxLCAgIDExNTIwMCwgMHg1MmYzNDk1MQorMCwgICAgICAgIDMxMiwgICAgICAgIDMxMiwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ0NTkwZWVhCiswLCAgICAgICAgMzEzLCAgICAgICAgMzEzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDRkZGVhYTIKKzAsICAgICAgICAzMTQsICAgICAgICAzMTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhiYzgzYzM5OQorMCwgICAgICAgIDMxNSwgICAgICAgIDMxNSwgICAgICAgIDEsICAgMTE1MjAwLCAweDVlOWRhOWE3CiswLCAgICAgICAgMzE2LCAgICAgICAgMzE2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2E2YThkZmMKKzAsICAgICAgICAzMTcsICAgICAgICAzMTcsICAgICAgICAxLCAgIDExNTIwMCwgMHhlMTdiM2ZmOAorMCwgICAgICAgIDMxOCwgICAgICAgIDMxOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGVhMWYzNzVjCiswLCAgICAgICAgMzE5LCAgICAgICAgMzE5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTI2NTE0M2IKKzAsICAgICAgICAzMjAsICAgICAgICAzMjAsICAgICAgICAxLCAgIDExNTIwMCwgMHhlNzg4ZmExZQorMCwgICAgICAgIDMyMSwgICAgICAgIDMyMSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ1OGJlNjQ5CiswLCAgICAgICAgMzIyLCAgICAgICAgMzIyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzQwYzFmMTkKKzAsICAgICAgICAzMjMsICAgICAgICAzMjMsICAgICAgICAxLCAgIDExNTIwMCwgMHhmYWIzMzAyZgorMCwgICAgICAgIDMyNCwgICAgICAgIDMyNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDFjOTU0ZmM3CiswLCAgICAgICAgMzI1LCAgICAgICAgMzI1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDU3YTU5MjMKKzAsICAgICAgICAzMjYsICAgICAgICAzMjYsICAgICAgICAxLCAgIDExNTIwMCwgMHgwOTk3NDVkOQorMCwgICAgICAgIDMyNywgICAgICAgIDMyNywgICAgICAgIDEsICAgMTE1MjAwLCAweDJlNjFjYzY2CiswLCAgICAgICAgMzI4LCAgICAgICAgMzI4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGIzZWM5M2EKKzAsICAgICAgICAzMjksICAgICAgICAzMjksICAgICAgICAxLCAgIDExNTIwMCwgMHg1NTNiYTgzOQorMCwgICAgICAgIDMzMCwgICAgICAgIDMzMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGZhZmM2YjYwCiswLCAgICAgICAgMzMxLCAgICAgICAgMzMxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTNmYjM5YjYKKzAsICAgICAgICAzMzIsICAgICAgICAzMzIsICAgICAgICAxLCAgIDExNTIwMCwgMHg3ZmI5ZDdiZQorMCwgICAgICAgIDMzMywgICAgICAgIDMzMywgICAgICAgIDEsICAgMTE1MjAwLCAweDdlNzNjZDkzCiswLCAgICAgICAgMzM0LCAgICAgICAgMzM0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YTQzZWM1ZjIKKzAsICAgICAgICAzMzUsICAgICAgICAzMzUsICAgICAgICAxLCAgIDExNTIwMCwgMHgzZWMwNzdjMQorMCwgICAgICAgIDMzNiwgICAgICAgIDMzNiwgICAgICAgIDEsICAgMTE1MjAwLCAweGM0Mjc1ODE1CiswLCAgICAgICAgMzM3LCAgICAgICAgMzM3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Zjg0YzE3YmYKKzAsICAgICAgICAzMzgsICAgICAgICAzMzgsICAgICAgICAxLCAgIDExNTIwMCwgMHgxZjU0ZDQ0ZAorMCwgICAgICAgIDMzOSwgICAgICAgIDMzOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDU2NmZhNWJiCiswLCAgICAgICAgMzQwLCAgICAgICAgMzQwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODIxNzlhODIKKzAsICAgICAgICAzNDEsICAgICAgICAzNDEsICAgICAgICAxLCAgIDExNTIwMCwgMHhmODg2NWYzZAorMCwgICAgICAgIDM0MiwgICAgICAgIDM0MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGE1ZmI3YjgwCiAwLCAgICAgICAgMzQzLCAgICAgICAgMzQzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWFlYmMwNGQKIDAsICAgICAgICAzNDQsICAgICAgICAzNDQsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NGM3MDVmYwogMCwgICAgICAgIDM0NSwgICAgICAgIDM0NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQzMjJhZGQzCi0wLCAgICAgICAgMzQ2LCAgICAgICAgMzQ2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGY1ZjBiNzkKLTAsICAgICAgICAzNDcsICAgICAgICAzNDcsICAgICAgICAxLCAgIDExNTIwMCwgMHg1NGExNTA3MAotMCwgICAgICAgIDM0OCwgICAgICAgIDM0OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGQxMTU1M2RmCi0wLCAgICAgICAgMzQ5LCAgICAgICAgMzQ5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NmYzZWQ5MTAKLTAsICAgICAgICAzNTAsICAgICAgICAzNTAsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ZDNhM2MxNwotMCwgICAgICAgIDM1MSwgICAgICAgIDM1MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQzNGViYzEzCi0wLCAgICAgICAgMzUyLCAgICAgICAgMzUyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2YwN2VjYjIKLTAsICAgICAgICAzNTMsICAgICAgICAzNTMsICAgICAgICAxLCAgIDExNTIwMCwgMHgxYzk0NDk3ZQotMCwgICAgICAgIDM1NCwgICAgICAgIDM1NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDgzYzEzY2JjCi0wLCAgICAgICAgMzU1LCAgICAgICAgMzU1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGE4YmE0ZjUKLTAsICAgICAgICAzNTYsICAgICAgICAzNTYsICAgICAgICAxLCAgIDExNTIwMCwgMHg5MjJhMzkzZgotMCwgICAgICAgIDM1NywgICAgICAgIDM1NywgICAgICAgIDEsICAgMTE1MjAwLCAweDQ0MDI0OTU5Ci0wLCAgICAgICAgMzU4LCAgICAgICAgMzU4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MjNmMThlYmQKLTAsICAgICAgICAzNTksICAgICAgICAzNTksICAgICAgICAxLCAgIDExNTIwMCwgMHgyY2RmMTE0NgotMCwgICAgICAgIDM2MCwgICAgICAgIDM2MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDhhN2Q0MDJjCi0wLCAgICAgICAgMzYxLCAgICAgICAgMzYxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDJkNjdiYjMKLTAsICAgICAgICAzNjIsICAgICAgICAzNjIsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MDQ1ZmYyYwotMCwgICAgICAgIDM2MywgICAgICAgIDM2MywgICAgICAgIDEsICAgMTE1MjAwLCAweGI2N2E0ZjE1Ci0wLCAgICAgICAgMzY0LCAgICAgICAgMzY0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzQ4MWYzMTEKLTAsICAgICAgICAzNjUsICAgICAgICAzNjUsICAgICAgICAxLCAgIDExNTIwMCwgMHhlMzk0ZmY4ZAotMCwgICAgICAgIDM2NiwgICAgICAgIDM2NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDJjYTE2ZjIzCi0wLCAgICAgICAgMzY3LCAgICAgICAgMzY3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDUzMjM4ZTEKLTAsICAgICAgICAzNjgsICAgICAgICAzNjgsICAgICAgICAxLCAgIDExNTIwMCwgMHhlMjhhODBjOQotMCwgICAgICAgIDM2OSwgICAgICAgIDM2OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDA0M2NjZDUxCi0wLCAgICAgICAgMzcwLCAgICAgICAgMzcwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmU5NTBkODAKLTAsICAgICAgICAzNzEsICAgICAgICAzNzEsICAgICAgICAxLCAgIDExNTIwMCwgMHhmNzM5NGM2ZQotMCwgICAgICAgIDM3MiwgICAgICAgIDM3MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGFlNDZkMmM4Ci0wLCAgICAgICAgMzczLCAgICAgICAgMzczLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGI1NGRmODUKLTAsICAgICAgICAzNzQsICAgICAgICAzNzQsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MzZmNGNhNQotMCwgICAgICAgIDM3NSwgICAgICAgIDM3NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDJjNjg3NzU0Ci0wLCAgICAgICAgMzc2LCAgICAgICAgMzc2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGRkZWEwZjkKLTAsICAgICAgICAzNzcsICAgICAgICAzNzcsICAgICAgICAxLCAgIDExNTIwMCwgMHg4MmIwOGRmZAotMCwgICAgICAgIDM3OCwgICAgICAgIDM3OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDVkYjU4YzI1Ci0wLCAgICAgICAgMzc5LCAgICAgICAgMzc5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWI5NzVlYWEKLTAsICAgICAgICAzODAsICAgICAgICAzODAsICAgICAgICAxLCAgIDExNTIwMCwgMHgyY2JlNGJmMQotMCwgICAgICAgIDM4MSwgICAgICAgIDM4MSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM4ODczYmQ3Ci0wLCAgICAgICAgMzgyLCAgICAgICAgMzgyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWFhMzU3ZjIKLTAsICAgICAgICAzODMsICAgICAgICAzODMsICAgICAgICAxLCAgIDExNTIwMCwgMHg1MjZlNTM5MgotMCwgICAgICAgIDM4NCwgICAgICAgIDM4NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDMwYWE1ZDE4Ci0wLCAgICAgICAgMzg1LCAgICAgICAgMzg1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWZlNzM4YjQKLTAsICAgICAgICAzODYsICAgICAgICAzODYsICAgICAgICAxLCAgIDExNTIwMCwgMHg5Y2VjMDRhZAotMCwgICAgICAgIDM4NywgICAgICAgIDM4NywgICAgICAgIDEsICAgMTE1MjAwLCAweDNkZGQ5MjJkCi0wLCAgICAgICAgMzg4LCAgICAgICAgMzg4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzY1NzhiYmIKLTAsICAgICAgICAzODksICAgICAgICAzODksICAgICAgICAxLCAgIDExNTIwMCwgMHg0MTNjMzVhZQotMCwgICAgICAgIDM5MCwgICAgICAgIDM5MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDkwMDk1YWIzCi0wLCAgICAgICAgMzkxLCAgICAgICAgMzkxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OGFlODQzNzEKLTAsICAgICAgICAzOTIsICAgICAgICAzOTIsICAgICAgICAxLCAgIDExNTIwMCwgMHgxYzkzNTQwNAotMCwgICAgICAgIDM5MywgICAgICAgIDM5MywgICAgICAgIDEsICAgMTE1MjAwLCAweDIxM2YzN2U4Ci0wLCAgICAgICAgMzk0LCAgICAgICAgMzk0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MTlhYjM5ZTYKLTAsICAgICAgICAzOTUsICAgICAgICAzOTUsICAgICAgICAxLCAgIDExNTIwMCwgMHg3OTViZjgyZgotMCwgICAgICAgIDM5NiwgICAgICAgIDM5NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGUyMzhmY2NmCi0wLCAgICAgICAgMzk3LCAgICAgICAgMzk3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTJjMGQ2OWUKLTAsICAgICAgICAzOTgsICAgICAgICAzOTgsICAgICAgICAxLCAgIDExNTIwMCwgMHhhMWU5ZDM0YwotMCwgICAgICAgIDM5OSwgICAgICAgIDM5OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGVkZjNkMzAzCi0wLCAgICAgICAgNDAwLCAgICAgICAgNDAwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDBmYWMxNTYKLTAsICAgICAgICA0MDEsICAgICAgICA0MDEsICAgICAgICAxLCAgIDExNTIwMCwgMHgxYmM1OWRkYgotMCwgICAgICAgIDQwMiwgICAgICAgIDQwMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDQyOTVhMmFiCi0wLCAgICAgICAgNDAzLCAgICAgICAgNDAzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzMzNzgwOWQKLTAsICAgICAgICA0MDQsICAgICAgICA0MDQsICAgICAgICAxLCAgIDExNTIwMCwgMHg0YTMyOTk5NgotMCwgICAgICAgIDQwNSwgICAgICAgIDQwNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGI0ZmE3NmI0Ci0wLCAgICAgICAgNDA2LCAgICAgICAgNDA2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjQ5YjdkMTgKLTAsICAgICAgICA0MDcsICAgICAgICA0MDcsICAgICAgICAxLCAgIDExNTIwMCwgMHhmYWI2NzI2MgotMCwgICAgICAgIDQwOCwgICAgICAgIDQwOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDMxOTE5NDA0Ci0wLCAgICAgICAgNDA5LCAgICAgICAgNDA5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTgzZDg5NmMKLTAsICAgICAgICA0MTAsICAgICAgICA0MTAsICAgICAgICAxLCAgIDExNTIwMCwgMHg4NTk0OTM5ZQotMCwgICAgICAgIDQxMSwgICAgICAgIDQxMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDlmYjg5MzJhCi0wLCAgICAgICAgNDEyLCAgICAgICAgNDEyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjlmM2FmMDcKLTAsICAgICAgICA0MTMsICAgICAgICA0MTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg1OTA0YzViNAotMCwgICAgICAgIDQxNCwgICAgICAgIDQxNCwgICAgICAgIDEsICAgMTE1MjAwLCAweGY2ZTA5NWQ2Ci0wLCAgICAgICAgNDE1LCAgICAgICAgNDE1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDE2OGJkODYKLTAsICAgICAgICA0MTYsICAgICAgICA0MTYsICAgICAgICAxLCAgIDExNTIwMCwgMHgzOTE1MWE2MwotMCwgICAgICAgIDQxNywgICAgICAgIDQxNywgICAgICAgIDEsICAgMTE1MjAwLCAweDllNDI2ZjZkCi0wLCAgICAgICAgNDE4LCAgICAgICAgNDE4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGM2ZDdkMWQKLTAsICAgICAgICA0MTksICAgICAgICA0MTksICAgICAgICAxLCAgIDExNTIwMCwgMHg2NWY3ODdjYQotMCwgICAgICAgIDQyMCwgICAgICAgIDQyMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGY0MjI4OGM2Ci0wLCAgICAgICAgNDIxLCAgICAgICAgNDIxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTY1YjhkOTEKLTAsICAgICAgICA0MjIsICAgICAgICA0MjIsICAgICAgICAxLCAgIDExNTIwMCwgMHhkNzJlODgyZgotMCwgICAgICAgIDQyMywgICAgICAgIDQyMywgICAgICAgIDEsICAgMTE1MjAwLCAweDhkZWY4ODZjCi0wLCAgICAgICAgNDI0LCAgICAgICAgNDI0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWQ1ZTc4MDAKLTAsICAgICAgICA0MjUsICAgICAgICA0MjUsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MjgyNzZmNwotMCwgICAgICAgIDQyNiwgICAgICAgIDQyNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDAwZTI3ZDBmCi0wLCAgICAgICAgNDI3LCAgICAgICAgNDI3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTJkZjc3MzcKLTAsICAgICAgICA0MjgsICAgICAgICA0MjgsICAgICAgICAxLCAgIDExNTIwMCwgMHhmOThmNjMwMwotMCwgICAgICAgIDQyOSwgICAgICAgIDQyOSwgICAgICAgIDEsICAgMTE1MjAwLCAweDlhMmQyZDY1Ci0wLCAgICAgICAgNDMwLCAgICAgICAgNDMwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDhjYjI1ZjUKLTAsICAgICAgICA0MzEsICAgICAgICA0MzEsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ODA3MWNlMQotMCwgICAgICAgIDQzMiwgICAgICAgIDQzMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDRjNjIxOGM5Ci0wLCAgICAgICAgNDMzLCAgICAgICAgNDMzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWYwYTExYTMKLTAsICAgICAgICA0MzQsICAgICAgICA0MzQsICAgICAgICAxLCAgIDExNTIwMCwgMHhmYTBhMGZiOQotMCwgICAgICAgIDQzNSwgICAgICAgIDQzNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM2MTQxNGZiCi0wLCAgICAgICAgNDM2LCAgICAgICAgNDM2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2E4YjBlOTQKLTAsICAgICAgICA0MzcsICAgICAgICA0MzcsICAgICAgICAxLCAgIDExNTIwMCwgMHgxZWFiMGU5MgotMCwgICAgICAgIDQzOCwgICAgICAgIDQzOCwgICAgICAgIDEsICAgMTE1MjAwLCAweGM3MjYwMjhjCi0wLCAgICAgICAgNDM5LCAgICAgICAgNDM5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmRhMmY1ZGUKLTAsICAgICAgICA0NDAsICAgICAgICA0NDAsICAgICAgICAxLCAgIDExNTIwMCwgMHg3NjcyZTkyZgotMCwgICAgICAgIDQ0MSwgICAgICAgIDQ0MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDdlZGFlNjg2Ci0wLCAgICAgICAgNDQyLCAgICAgICAgNDQyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OWE2Y2UzYzYKLTAsICAgICAgICA0NDMsICAgICAgICA0NDMsICAgICAgICAxLCAgIDExNTIwMCwgMHg5ZjY5ZTc0YwotMCwgICAgICAgIDQ0NCwgICAgICAgIDQ0NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDczZmJmNTAyCi0wLCAgICAgICAgNDQ1LCAgICAgICAgNDQ1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZmY4MWY1YjgKLTAsICAgICAgICA0NDYsICAgICAgICA0NDYsICAgICAgICAxLCAgIDExNTIwMCwgMHgyYjhiZjdkZQotMCwgICAgICAgIDQ0NywgICAgICAgIDQ0NywgICAgICAgIDEsICAgMTE1MjAwLCAweGNkMDBmMzgwCi0wLCAgICAgICAgNDQ4LCAgICAgICAgNDQ4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NGNlZGZlN2MKLTAsICAgICAgICA0NDksICAgICAgICA0NDksICAgICAgICAxLCAgIDExNTIwMCwgMHhjZDMwZmJiNAotMCwgICAgICAgIDQ1MCwgICAgICAgIDQ1MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDRiN2RmMjI4Ci0wLCAgICAgICAgNDUxLCAgICAgICAgNDUxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWRjN2U1ZGYKLTAsICAgICAgICA0NTIsICAgICAgICA0NTIsICAgICAgICAxLCAgIDExNTIwMCwgMHg2ODdhZTBmNQotMCwgICAgICAgIDQ1MywgICAgICAgIDQ1MywgICAgICAgIDEsICAgMTE1MjAwLCAweDgxMjdlMmI5Ci0wLCAgICAgICAgNDU0LCAgICAgICAgNDU0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTMxYWUxMWMKLTAsICAgICAgICA0NTUsICAgICAgICA0NTUsICAgICAgICAxLCAgIDExNTIwMCwgMHhlY2U1ZTVjNQotMCwgICAgICAgIDQ1NiwgICAgICAgIDQ1NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDRmMWJkZmU0Ci0wLCAgICAgICAgNDU3LCAgICAgICAgNDU3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjVjNWRmZTMKLTAsICAgICAgICA0NTgsICAgICAgICA0NTgsICAgICAgICAxLCAgIDExNTIwMCwgMHhmYzg5ZDUxZgorMCwgICAgICAgIDM0NiwgICAgICAgIDM0NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGY0MjMwYjc2CiswLCAgICAgICAgMzQ3LCAgICAgICAgMzQ3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YWE5MTUwNjkKKzAsICAgICAgICAzNDgsICAgICAgICAzNDgsICAgICAgICAxLCAgIDExNTIwMCwgMHg1MThkNTNkOAorMCwgICAgICAgIDM0OSwgICAgICAgIDM0OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGVmYTdkOTA5CiswLCAgICAgICAgMzUwLCAgICAgICAgMzUwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODAzYzNjMGUKKzAsICAgICAgICAzNTEsICAgICAgICAzNTEsICAgICAgICAxLCAgIDExNTIwMCwgMHg1NjUwYmMwYQorMCwgICAgICAgIDM1MiwgICAgICAgIDM1MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDhiMzRlY2FiCiswLCAgICAgICAgMzUzLCAgICAgICAgMzUzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTc1YzQ5NzYKKzAsICAgICAgICAzNTQsICAgICAgICAzNTQsICAgICAgICAxLCAgIDExNTIwMCwgMHg3MDBlM2NiNAorMCwgICAgICAgIDM1NSwgICAgICAgIDM1NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGVmMjdhNGVjCiswLCAgICAgICAgMzU2LCAgICAgICAgMzU2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmI5NTM5MzYKKzAsICAgICAgICAzNTcsICAgICAgICAzNTcsICAgICAgICAxLCAgIDExNTIwMCwgMHhjZjliNDk1NgorMCwgICAgICAgIDM1OCwgICAgICAgIDM1OCwgICAgICAgIDEsICAgMTE1MjAwLCAweGFlNGE4ZWJhCiswLCAgICAgICAgMzU5LCAgICAgICAgMzU5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Zjg4MjExNDQKKzAsICAgICAgICAzNjAsICAgICAgICAzNjAsICAgICAgICAxLCAgIDExNTIwMCwgMHg5N2MyNDAyYworMCwgICAgICAgIDM2MSwgICAgICAgIDM2MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDIwOWI3YmIzCiswLCAgICAgICAgMzYyLCAgICAgICAgMzYyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDIyZmZmMmMKKzAsICAgICAgICAzNjMsICAgICAgICAzNjMsICAgICAgICAxLCAgIDExNTIwMCwgMHhlODViNGYxNgorMCwgICAgICAgIDM2NCwgICAgICAgIDM2NCwgICAgICAgIDEsICAgMTE1MjAwLCAweDA2NTlmMzE4CiswLCAgICAgICAgMzY1LCAgICAgICAgMzY1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NmUyYmZmOTgKKzAsICAgICAgICAzNjYsICAgICAgICAzNjYsICAgICAgICAxLCAgIDExNTIwMCwgMHhjNjYyNmYyZgorMCwgICAgICAgIDM2NywgICAgICAgIDM2NywgICAgICAgIDEsICAgMTE1MjAwLCAweDEyMzEzOGUyCiswLCAgICAgICAgMzY4LCAgICAgICAgMzY4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjllNjgwYWIKKzAsICAgICAgICAzNjksICAgICAgICAzNjksICAgICAgICAxLCAgIDExNTIwMCwgMHhlNGQ3Y2QxZAorMCwgICAgICAgIDM3MCwgICAgICAgIDM3MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDRjYTEwZDQ3CiswLCAgICAgICAgMzcxLCAgICAgICAgMzcxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NjMzYTRjMzkKKzAsICAgICAgICAzNzIsICAgICAgICAzNzIsICAgICAgICAxLCAgIDExNTIwMCwgMHg2NGRlZDI5MgorMCwgICAgICAgIDM3MywgICAgICAgIDM3MywgICAgICAgIDEsICAgMTE1MjAwLCAweDg4ZDJkZjQyCiswLCAgICAgICAgMzc0LCAgICAgICAgMzc0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTk4ZjRjNjMKKzAsICAgICAgICAzNzUsICAgICAgICAzNzUsICAgICAgICAxLCAgIDExNTIwMCwgMHg3NTNjNzZmOQorMCwgICAgICAgIDM3NiwgICAgICAgIDM3NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDlkN2JhMGE2CiswLCAgICAgICAgMzc3LCAgICAgICAgMzc3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Njg3OThkYTUKKzAsICAgICAgICAzNzgsICAgICAgICAzNzgsICAgICAgICAxLCAgIDExNTIwMCwgMHhiNWIxOGJjMworMCwgICAgICAgIDM3OSwgICAgICAgIDM3OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDIwMjQ1ZTQ5CiswLCAgICAgICAgMzgwLCAgICAgICAgMzgwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjE1ZDRiOGYKKzAsICAgICAgICAzODEsICAgICAgICAzODEsICAgICAgICAxLCAgIDExNTIwMCwgMHgxN2Y4M2I2OQorMCwgICAgICAgIDM4MiwgICAgICAgIDM4MiwgICAgICAgIDEsICAgMTE1MjAwLCAweGNjNTQ1NzgzCiswLCAgICAgICAgMzgzLCAgICAgICAgMzgzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2RhZDUzMGUKKzAsICAgICAgICAzODQsICAgICAgICAzODQsICAgICAgICAxLCAgIDExNTIwMCwgMHg2YjQ2NWM5NAorMCwgICAgICAgIDM4NSwgICAgICAgIDM4NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGJjNWYzODMxCiswLCAgICAgICAgMzg2LCAgICAgICAgMzg2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWIyZjA0MmQKKzAsICAgICAgICAzODcsICAgICAgICAzODcsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZWMzOTFhYworMCwgICAgICAgIDM4OCwgICAgICAgIDM4OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDk5ZmE4YjJhCiswLCAgICAgICAgMzg5LCAgICAgICAgMzg5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Zjc4ZDM1MjQKKzAsICAgICAgICAzOTAsICAgICAgICAzOTAsICAgICAgICAxLCAgIDExNTIwMCwgMHhlNjI1NWEyNAorMCwgICAgICAgIDM5MSwgICAgICAgIDM5MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDI1MzU0MmM2CiswLCAgICAgICAgMzkyLCAgICAgICAgMzkyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZmFiMDUzNjUKKzAsICAgICAgICAzOTMsICAgICAgICAzOTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg0MDZhMzc0OQorMCwgICAgICAgIDM5NCwgICAgICAgIDM5NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGFmMGYzOTM1CiswLCAgICAgICAgMzk1LCAgICAgICAgMzk1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGQ5ZmY3ODAKKzAsICAgICAgICAzOTYsICAgICAgICAzOTYsICAgICAgICAxLCAgIDExNTIwMCwgMHhmYWRjZmMxNQorMCwgICAgICAgIDM5NywgICAgICAgIDM5NywgICAgICAgIDEsICAgMTE1MjAwLCAweDgyNjdkNWFkCiswLCAgICAgICAgMzk4LCAgICAgICAgMzk4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDcwNWQyNTAKKzAsICAgICAgICAzOTksICAgICAgICAzOTksICAgICAgICAxLCAgIDExNTIwMCwgMHgxOGY5ZDFmMgorMCwgICAgICAgIDQwMCwgICAgICAgIDQwMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ5MmJjMDQ1CiswLCAgICAgICAgNDAxLCAgICAgICAgNDAxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDM5YjljYTAKKzAsICAgICAgICA0MDIsICAgICAgICA0MDIsICAgICAgICAxLCAgIDExNTIwMCwgMHhjYjgwYTE0YworMCwgICAgICAgIDQwMywgICAgICAgIDQwMywgICAgICAgIDEsICAgMTE1MjAwLCAweGVlODg3ZjQ5CiswLCAgICAgICAgNDA0LCAgICAgICAgNDA0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZmJhMjk3ZWIKKzAsICAgICAgICA0MDUsICAgICAgICA0MDUsICAgICAgICAxLCAgIDExNTIwMCwgMHgwZTJmNzQ0YgorMCwgICAgICAgIDQwNiwgICAgICAgIDQwNiwgICAgICAgIDEsICAgMTE1MjAwLCAweGFhMjI3YWE3CiswLCAgICAgICAgNDA3LCAgICAgICAgNDA3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDdiYzZmZmYKKzAsICAgICAgICA0MDgsICAgICAgICA0MDgsICAgICAgICAxLCAgIDExNTIwMCwgMHgyOTVjOTFjZgorMCwgICAgICAgIDQwOSwgICAgICAgIDQwOSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM1Njc4NzMzCiswLCAgICAgICAgNDEwLCAgICAgICAgNDEwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzhkNDkxMjAKKzAsICAgICAgICA0MTEsICAgICAgICA0MTEsICAgICAgICAxLCAgIDExNTIwMCwgMHhiMTRlOTBiOQorMCwgICAgICAgIDQxMiwgICAgICAgIDQxMiwgICAgICAgIDEsICAgMTE1MjAwLCAweDZhMDlhY2FiCiswLCAgICAgICAgNDEzLCAgICAgICAgNDEzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjlhZWMzNTgKKzAsICAgICAgICA0MTQsICAgICAgICA0MTQsICAgICAgICAxLCAgIDExNTIwMCwgMHhlYjM2OTViMgorMCwgICAgICAgIDQxNSwgICAgICAgIDQxNSwgICAgICAgIDEsICAgMTE1MjAwLCAweGM1YmViZDYyCiswLCAgICAgICAgNDE2LCAgICAgICAgNDE2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MmQ2YjFhM2YKKzAsICAgICAgICA0MTcsICAgICAgICA0MTcsICAgICAgICAxLCAgIDExNTIwMCwgMHg5Mjk4NmY0OQorMCwgICAgICAgIDQxOCwgICAgICAgIDQxOCwgICAgICAgIDEsICAgMTE1MjAwLCAweDAwYzM3Y2Y5CiswLCAgICAgICAgNDE5LCAgICAgICAgNDE5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NWE0ZDg3YTYKKzAsICAgICAgICA0MjAsICAgICAgICA0MjAsICAgICAgICAxLCAgIDExNTIwMCwgMHhlODc4ODhhMgorMCwgICAgICAgIDQyMSwgICAgICAgIDQyMSwgICAgICAgIDEsICAgMTE1MjAwLCAweDRhYjE4ZDZkCiswLCAgICAgICAgNDIyLCAgICAgICAgNDIyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2I4NDg4MGIKKzAsICAgICAgICA0MjMsICAgICAgICA0MjMsICAgICAgICAxLCAgIDExNTIwMCwgMHg4MjQ1ODg0OAorMCwgICAgICAgIDQyNCwgICAgICAgIDQyNCwgICAgICAgIDEsICAgMTE1MjAwLCAweDExYjQ3N2RjCiswLCAgICAgICAgNDI1LCAgICAgICAgNDI1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTZkODc2ZDMKKzAsICAgICAgICA0MjYsICAgICAgICA0MjYsICAgICAgICAxLCAgIDExNTIwMCwgMHhmNTI5N2NlYgorMCwgICAgICAgIDQyNywgICAgICAgIDQyNywgICAgICAgIDEsICAgMTE1MjAwLCAweDQ3MzU3NzEzCiswLCAgICAgICAgNDI4LCAgICAgICAgNDI4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZWRlNTYyZGYKKzAsICAgICAgICA0MjksICAgICAgICA0MjksICAgICAgICAxLCAgIDExNTIwMCwgMHhhYmY0MmQzOAorMCwgICAgICAgIDQzMCwgICAgICAgIDQzMCwgICAgICAgIDEsICAgMTE1MjAwLCAweGVhOTIyNWM4CiswLCAgICAgICAgNDMxLCAgICAgICAgNDMxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NzljZTFjYjQKKzAsICAgICAgICA0MzIsICAgICAgICA0MzIsICAgICAgICAxLCAgIDExNTIwMCwgMHgwY2Q0MThiNAorMCwgICAgICAgIDQzMywgICAgICAgIDQzMywgICAgICAgIDEsICAgMTE1MjAwLCAweDZmN2MxMThlCiswLCAgICAgICAgNDM0LCAgICAgICAgNDM0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmJiYzBmYTQKKzAsICAgICAgICA0MzUsICAgICAgICA0MzUsICAgICAgICAxLCAgIDExNTIwMCwgMHg4OTA1MTRlNgorMCwgICAgICAgIDQzNiwgICAgICAgIDQzNiwgICAgICAgIDEsICAgMTE1MjAwLCAweDljNGQwZTdkCiswLCAgICAgICAgNDM3LCAgICAgICAgNDM3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTYyNjBlNzYKKzAsICAgICAgICA0MzgsICAgICAgICA0MzgsICAgICAgICAxLCAgIDExNTIwMCwgMHg3ZGM4MDI1OAorMCwgICAgICAgIDQzOSwgICAgICAgIDQzOSwgICAgICAgIDEsICAgMTE1MjAwLCAweGE5OTBmNWEzCiswLCAgICAgICAgNDQwLCAgICAgICAgNDQwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MjE3NGU5MTMKKzAsICAgICAgICA0NDEsICAgICAgICA0NDEsICAgICAgICAxLCAgIDExNTIwMCwgMHg4Mjk2ZTY3NAorMCwgICAgICAgIDQ0MiwgICAgICAgIDQ0MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDllMjhlM2I0CiswLCAgICAgICAgNDQzLCAgICAgICAgNDQzLCAgICAgICAgMSwgICAxMTUyMDAsIDB4NDA0Y2U3MmIKKzAsICAgICAgICA0NDQsICAgICAgICA0NDQsICAgICAgICAxLCAgIDExNTIwMCwgMHhjN2NiZjRlYworMCwgICAgICAgIDQ0NSwgICAgICAgIDQ0NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDVjZTBmNWExCiswLCAgICAgICAgNDQ2LCAgICAgICAgNDQ2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODhkYmY3YzcKKzAsICAgICAgICA0NDcsICAgICAgICA0NDcsICAgICAgICAxLCAgIDExNTIwMCwgMHgyNmRhZjM1YQorMCwgICAgICAgIDQ0OCwgICAgICAgIDQ0OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDVjZmRmZTYzCiswLCAgICAgICAgNDQ5LCAgICAgICAgNDQ5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZGQ0MGZiOWIKKzAsICAgICAgICA0NTAsICAgICAgICA0NTAsICAgICAgICAxLCAgIDExNTIwMCwgMHg1YjhkZjIwZgorMCwgICAgICAgIDQ1MSwgICAgICAgIDQ1MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDRmMmNlNWFjCiswLCAgICAgICAgNDUyLCAgICAgICAgNDUyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4YzlkMGUwYzIKKzAsICAgICAgICA0NTMsICAgICAgICA0NTMsICAgICAgICAxLCAgIDExNTIwMCwgMHg1MWM3ZTJhNgorMCwgICAgICAgIDQ1NCwgICAgICAgIDQ1NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGIzYmFlMTA5CiswLCAgICAgICAgNDU1LCAgICAgICAgNDU1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YmQ4NWU1YjIKKzAsICAgICAgICA0NTYsICAgICAgICA0NTYsICAgICAgICAxLCAgIDExNTIwMCwgMHgxZmJiZGZkMQorMCwgICAgICAgIDQ1NywgICAgICAgIDQ1NywgICAgICAgIDEsICAgMTE1MjAwLCAweDM2NjVkZmQwCiswLCAgICAgICAgNDU4LCAgICAgICAgNDU4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4Y2QyOWQ1MGMKIDAsICAgICAgICA0NTksICAgICAgICA0NTksICAgICAgICAxLCAgIDExNTIwMCwgMHhlZGQxYzZiYwotMCwgICAgICAgIDQ2MCwgICAgICAgIDQ2MCwgICAgICAgIDEsICAgMTE1MjAwLCAweDI5MTNkMDczCi0wLCAgICAgICAgNDYxLCAgICAgICAgNDYxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjE5NmZiYmUKLTAsICAgICAgICA0NjIsICAgICAgICA0NjIsICAgICAgICAxLCAgIDExNTIwMCwgMHhjMGJlMTNlMQotMCwgICAgICAgIDQ2MywgICAgICAgIDQ2MywgICAgICAgIDEsICAgMTE1MjAwLCAweDU1YjIxZjAxCi0wLCAgICAgICAgNDY0LCAgICAgICAgNDY0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjE2YjIzNjQKLTAsICAgICAgICA0NjUsICAgICAgICA0NjUsICAgICAgICAxLCAgIDExNTIwMCwgMHg0YTg2MzJkYgotMCwgICAgICAgIDQ2NiwgICAgICAgIDQ2NiwgICAgICAgIDEsICAgMTE1MjAwLCAweDQ0Yzk0NDI2Ci0wLCAgICAgICAgNDY3LCAgICAgICAgNDY3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTU0NzBiMDEKLTAsICAgICAgICA0NjgsICAgICAgICA0NjgsICAgICAgICAxLCAgIDExNTIwMCwgMHhkODk1ZDVkMAotMCwgICAgICAgIDQ2OSwgICAgICAgIDQ2OSwgICAgICAgIDEsICAgMTE1MjAwLCAweGU5ODcxNWMyCi0wLCAgICAgICAgNDcwLCAgICAgICAgNDcwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MjY4ODU5OWIKLTAsICAgICAgICA0NzEsICAgICAgICA0NzEsICAgICAgICAxLCAgIDExNTIwMCwgMHg4ZTQ4ODlhYQotMCwgICAgICAgIDQ3MiwgICAgICAgIDQ3MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDY1OGJjZDhkCi0wLCAgICAgICAgNDczLCAgICAgICAgNDczLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjAwOTBjMDYKLTAsICAgICAgICA0NzQsICAgICAgICA0NzQsICAgICAgICAxLCAgIDExNTIwMCwgMHhlZmQ5YmQyOAotMCwgICAgICAgIDQ3NSwgICAgICAgIDQ3NSwgICAgICAgIDEsICAgMTE1MjAwLCAweDQ1MDA5YmI0Ci0wLCAgICAgICAgNDc2LCAgICAgICAgNDc2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4N2ViZDE2NTUKLTAsICAgICAgICA0NzcsICAgICAgICA0NzcsICAgICAgICAxLCAgIDExNTIwMCwgMHg2NGZmNzg5OAotMCwgICAgICAgIDQ3OCwgICAgICAgIDQ3OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDRhOTM4NGYxCi0wLCAgICAgICAgNDc5LCAgICAgICAgNDc5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZDgwZjA3MDEKLTAsICAgICAgICA0ODAsICAgICAgICA0ODAsICAgICAgICAxLCAgIDExNTIwMCwgMHgyZjg1NTExNgotMCwgICAgICAgIDQ4MSwgICAgICAgIDQ4MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDBjMTMxM2NiCi0wLCAgICAgICAgNDgyLCAgICAgICAgNDgyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZjRkZjRkMTkKLTAsICAgICAgICA0ODMsICAgICAgICA0ODMsICAgICAgICAxLCAgIDExNTIwMCwgMHhkZTYyMThmYgotMCwgICAgICAgIDQ4NCwgICAgICAgIDQ4NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGNlMjZlNmI0Ci0wLCAgICAgICAgNDg1LCAgICAgICAgNDg1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODQ4YWY5MzEKLTAsICAgICAgICA0ODYsICAgICAgICA0ODYsICAgICAgICAxLCAgIDExNTIwMCwgMHg4Njc3MGE5NworMCwgICAgICAgIDQ2MCwgICAgICAgIDQ2MCwgICAgICAgIDEsICAgMTE1MjAwLCAweGViYzJkMDcyCiswLCAgICAgICAgNDYxLCAgICAgICAgNDYxLCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZTJlNWZiYmQKKzAsICAgICAgICA0NjIsICAgICAgICA0NjIsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MTZhMTNkYworMCwgICAgICAgIDQ2MywgICAgICAgIDQ2MywgICAgICAgIDEsICAgMTE1MjAwLCAweGY2NGYxZWZjCiswLCAgICAgICAgNDY0LCAgICAgICAgNDY0LCAgICAgICAgMSwgICAxMTUyMDAsIDB4NTM1NjIzNWYKKzAsICAgICAgICA0NjUsICAgICAgICA0NjUsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZmMwMzJkNQorMCwgICAgICAgIDQ2NiwgICAgICAgIDQ2NiwgICAgICAgIDEsICAgMTE1MjAwLCAweGFhMDM0NDIwCiswLCAgICAgICAgNDY3LCAgICAgICAgNDY3LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MDA3ZTBhZmEKKzAsICAgICAgICA0NjgsICAgICAgICA0NjgsICAgICAgICAxLCAgIDExNTIwMCwgMHgwNzdhZDVjOAorMCwgICAgICAgIDQ2OSwgICAgICAgIDQ2OSwgICAgICAgIDEsICAgMTE1MjAwLCAweDhmYzgxNWI4CiswLCAgICAgICAgNDcwLCAgICAgICAgNDcwLCAgICAgICAgMSwgICAxMTUyMDAsIDB4OTViODU5OTAKKzAsICAgICAgICA0NzEsICAgICAgICA0NzEsICAgICAgICAxLCAgIDExNTIwMCwgMHg0NmY1ODk5ZgorMCwgICAgICAgIDQ3MiwgICAgICAgIDQ3MiwgICAgICAgIDEsICAgMTE1MjAwLCAweDFlMzdjZDgyCiswLCAgICAgICAgNDczLCAgICAgICAgNDczLCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2NlOTBiZmQKKzAsICAgICAgICA0NzQsICAgICAgICA0NzQsICAgICAgICAxLCAgIDExNTIwMCwgMHhiYjk1YmQxZAorMCwgICAgICAgIDQ3NSwgICAgICAgIDQ3NSwgICAgICAgIDEsICAgMTE1MjAwLCAweGQ0YWE5YmE4CiswLCAgICAgICAgNDc2LCAgICAgICAgNDc2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4MGU3NjE2NDkKKzAsICAgICAgICA0NzcsICAgICAgICA0NzcsICAgICAgICAxLCAgIDExNTIwMCwgMHg0OWFkNzg4NgorMCwgICAgICAgIDQ3OCwgICAgICAgIDQ3OCwgICAgICAgIDEsICAgMTE1MjAwLCAweDJmNDE4NGRmCiswLCAgICAgICAgNDc5LCAgICAgICAgNDc5LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ODBiOTA2ZWUKKzAsICAgICAgICA0ODAsICAgICAgICA0ODAsICAgICAgICAxLCAgIDExNTIwMCwgMHg2MjQwNTEwMAorMCwgICAgICAgIDQ4MSwgICAgICAgIDQ4MSwgICAgICAgIDEsICAgMTE1MjAwLCAweDNlY2UxM2I1CiswLCAgICAgICAgNDgyLCAgICAgICAgNDgyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4M2FiZDRjZmMKKzAsICAgICAgICA0ODMsICAgICAgICA0ODMsICAgICAgICAxLCAgIDExNTIwMCwgMHg5MWI0MThlMworMCwgICAgICAgIDQ4NCwgICAgICAgIDQ4NCwgICAgICAgIDEsICAgMTE1MjAwLCAweGRlMWNlNjhlCiswLCAgICAgICAgNDg1LCAgICAgICAgNDg1LCAgICAgICAgMSwgICAxMTUyMDAsIDB4ZmM0N2Y5MTIKKzAsICAgICAgICA0ODYsICAgICAgICA0ODYsICAgICAgICAxLCAgIDExNTIwMCwgMHg1YjM4MGE2ZgogMCwgICAgICAgIDQ4NywgICAgICAgIDQ4NywgICAgICAgIDEsICAgMTE1MjAwLCAweDhmMzVjM2MwCiAwLCAgICAgICAgNDg4LCAgICAgICAgNDg4LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjI2ZGMyMjAKIDAsICAgICAgICA0ODksICAgICAgICA0ODksICAgICAgICAxLCAgIDExNTIwMCwgMHgzZDViYmZjZQpAQCAtNDcyLDMgKzQ3Niw0IEBACiAwLCAgICAgICAgNDk2LCAgICAgICAgNDk2LCAgICAgICAgMSwgICAxMTUyMDAsIDB4YjViOGI4NjYKIDAsICAgICAgICA0OTcsICAgICAgICA0OTcsICAgICAgICAxLCAgIDExNTIwMCwgMHhhZmNjMTAxOQogMCwgICAgICAgIDUxMCwgICAgICAgIDUxMCwgICAgICAgIDEsICAgMTE1MjAwLCAweDYyM2IwZmYzCiswLCAgICAgICAgNTEyLCAgICAgICAgNTEyLCAgICAgICAgMSwgICAxMTUyMDAsIDB4MWQ2ZjEwYjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3dudjEgYi90ZXN0cy9yZWYvZmF0ZS93bnYxCmluZGV4IDRkZTM1YmYuLjVkNDhhZWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3dudjEKKysrIGIvdGVzdHMvcmVmL2ZhdGUvd252MQpAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxMzMzMy8yMDAwMDAKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDE2MHgxMjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAgMzg0MDAsIDB4NGMzZmRjMmYKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgICAzODQwMCwgMHgxMWM5ZDBjYgogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgIDM4NDAwLCAweDZjMzdmZDdmCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS93dHYtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS93dHYtZGVtdXgKaW5kZXggOTA0ZDc4Yi4uYWJlODVhNCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUvd3R2LWRlbXV4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3d0di1kZW11eApAQCAtMSw3ICsxLDE2IEBACiAjZXh0cmFkYXRhIDA6ICAgICAgIDg2LCAweGM3Y2EwOWU1CiAjZXh0cmFkYXRhIDE6ICAgICAgIDIyLCAweDEyZGMwMTBjCiAjdGIgMDogMS8xMDAwMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiBtcGVnMnZpZGVvCisjZGltZW5zaW9ucyAwOiA3MjB4NTc2Cisjc2FyIDA6IDY0LzQ1CiAjdGIgMTogMS8xMDAwMDAwMAorI21lZGlhX3R5cGUgMTogYXVkaW8KKyNjb2RlY19pZCAxOiBtcDIKKyNzYW1wbGVfcmF0ZSAxOiA0ODAwMAorI2NoYW5uZWxfbGF5b3V0IDE6IDMKKyNjaGFubmVsX2xheW91dF9uYW1lIDE6IHN0ZXJlbwogMSwgICAgICAgICAtMiwgICAgICAgICAtMiwgICAyNDAwMDAsICAgICAgNTc2LCAweDliNmUxNjM4CiAxLCAgICAgMjM5OTk4LCAgICAgMjM5OTk4LCAgIDI0MDAwMCwgICAgICA1NzYsIDB4MGNhOTExODMKIDEsICAgICA0Nzk5OTgsICAgICA0Nzk5OTgsICAgMjQwMDAwLCAgICAgIDU3NiwgMHhlYzZhMTgwZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUveGJtMTAgYi90ZXN0cy9yZWYvZmF0ZS94Ym0xMAppbmRleCAwMDM4ODkxLi41N2E3MGQyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS94Ym0xMAorKysgYi90ZXN0cy9yZWYvZmF0ZS94Ym0xMApAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAxNngxNgorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgICAgICAzMiwgMHg3NzdmMDczNwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUveGJtMTEgYi90ZXN0cy9yZWYvZmF0ZS94Ym0xMQppbmRleCA3NzE5MmIzLi44Mzg1MjgxIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS94Ym0xMQorKysgYi90ZXN0cy9yZWYvZmF0ZS94Ym0xMQpAQCAtMSwyICsxLDYgQEAKICN0YiAwOiAxLzI1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAyMDB4MTkwCisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICA0NzUwLCAweGM4NWYwYjZkCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS94ZmFjZSBiL3Rlc3RzL3JlZi9mYXRlL3hmYWNlCmluZGV4IDdmMWYxZTYuLjA1YTk1NWMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3hmYWNlCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3hmYWNlCkBAIC0xLDIgKzEsNiBAQAogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDQ4eDQ4Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgICAgMjg4LCAweDg3ZGRhZWY4CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS94bXYtZGVtdXggYi90ZXN0cy9yZWYvZmF0ZS94bXYtZGVtdXgKaW5kZXggZDEzMjcwYS4uNmRhMmIxYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUveG12LWRlbXV4CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3htdi1kZW11eApAQCAtMSw2ICsxLDE1IEBACiAjZXh0cmFkYXRhIDA6ICAgICAgICA0LCAweDAxNWEwMGFkCiAjdGIgMDogMS8xMDAwCisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHdtdjIKKyNkaW1lbnNpb25zIDA6IDY0MHg0ODAKKyNzYXIgMDogMC8xCiAjdGIgMTogMTYvMTEwMjUKKyNtZWRpYV90eXBlIDE6IGF1ZGlvCisjY29kZWNfaWQgMTogYWRwY21faW1hX3dhdgorI3NhbXBsZV9yYXRlIDE6IDQ0MTAwCisjY2hhbm5lbF9sYXlvdXQgMTogMworI2NoYW5uZWxfbGF5b3V0X25hbWUgMTogc3RlcmVvCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMCwgICAgIDE1MDgsIDB4ZWZjZWJhNDgKIDEsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgIDgzLCAgICAgNTk3NiwgMHhmYTJjMmRiOQogMSwgICAgICAgICA4MywgICAgICAgICA4MywgICAgICAgODMsICAgICA1OTc2LCAweDI1NmI5MzVjCkBAIC04NCwzMyArOTMsMzMgQEAKIDAsICAgICAgIDQ2NDAsICAgICAgIDQ2NDAsICAgICAgICAwLCAgICAgIDEwMCwgMHg0NTAyMzg5NCwgRj0weDAKIDAsICAgICAgIDQ2ODAsICAgICAgIDQ2ODAsICAgICAgICAwLCAgICAgIDk0OCwgMHhhNjVlZDM0NSwgRj0weDAKIDAsICAgICAgIDQ3MjAsICAgICAgIDQ3MjAsICAgICAgICAwLCAgICAgMjgwOCwgMHhkNzI4NTc0NiwgRj0weDAKLTAsICAgICAgIDQ3NjAsICAgICAgIDQ3NjAsICAgICAgIDQwLCAgICAgNTM3MiwgMHgwNTc5NDE3NSwgRj0weDAKKzAsICAgICAgIDQ3NjAsICAgICAgIDQ3NjAsICAgICAgICAwLCAgICAgNTM3MiwgMHgwNTc5NDE3NSwgRj0weDAKIDEsICAgICAgIDMzMDcsICAgICAgIDMzMDcsICAgICAgIDIxLCAgICAgMTUxMiwgMHhlZDhiM2Y0YgotMCwgICAgICAgNDgwMCwgICAgICAgNDgwMCwgICAgICAgNDAsICAgIDExNTk2LCAweDg2MzZlY2E3LCBGPTB4MAorMCwgICAgICAgNDgwMCwgICAgICAgNDgwMCwgICAgICAgIDAsICAgIDExNTk2LCAweDg2MzZlY2E3LCBGPTB4MAogMSwgICAgICAgMzMyOCwgICAgICAgMzMyOCwgICAgICAgMjEsICAgICAxNTEyLCAweGEyN2QzODkxCi0wLCAgICAgICA0ODQwLCAgICAgICA0ODQwLCAgICAgICA0MCwgICAgMTE1MjQsIDB4ZTFmMzliZTMsIEY9MHgwCiswLCAgICAgICA0ODQwLCAgICAgICA0ODQwLCAgICAgICAgMCwgICAgMTE1MjQsIDB4ZTFmMzliZTMsIEY9MHgwCiAxLCAgICAgICAzMzQ5LCAgICAgICAzMzQ5LCAgICAgICAyMSwgICAgIDE1MTIsIDB4YjBmMTNlYjYKLTAsICAgICAgIDQ4ODAsICAgICAgIDQ4ODAsICAgICAgIDQwLCAgICAyMzM5MiwgMHhhYjA1M2YwNSwgRj0weDAKKzAsICAgICAgIDQ4ODAsICAgICAgIDQ4ODAsICAgICAgICAwLCAgICAyMzM5MiwgMHhhYjA1M2YwNSwgRj0weDAKIDEsICAgICAgIDMzNzAsICAgICAgIDMzNzAsICAgICAgIDIzLCAgICAgMTY1NiwgMHhlNWE5ODMyNAotMCwgICAgICAgNDkyMCwgICAgICAgNDkyMCwgICAgICAgNDAsICAgICA0NTYwLCAweDAzMTk3ZDA3LCBGPTB4MAorMCwgICAgICAgNDkyMCwgICAgICAgNDkyMCwgICAgICAgIDAsICAgICA0NTYwLCAweDAzMTk3ZDA3LCBGPTB4MAogMSwgICAgICAgMzM5MywgICAgICAgMzM5MywgICAgICAgMzEsICAgICAyMjMyLCAweDE1NDQ1NDMzCi0wLCAgICAgICA0OTYwLCAgICAgICA0OTYwLCAgICAgICA0MCwgICAgIDQ0NDAsIDB4MWNjMzYxYTIsIEY9MHgwCiswLCAgICAgICA0OTYwLCAgICAgICA0OTYwLCAgICAgICAgMCwgICAgIDQ0NDAsIDB4MWNjMzYxYTIsIEY9MHgwCiAxLCAgICAgICAzNDI0LCAgICAgICAzNDI0LCAgICAgICAzMSwgICAgIDIyMzIsIDB4NWNiMzQ4YTkKLTAsICAgICAgIDUwMDAsICAgICAgIDUwMDAsICAgICAgIDQwLCAgICAyMzY4OCwgMHgxNjAzMDYzNCwgRj0weDAKKzAsICAgICAgIDUwMDAsICAgICAgIDUwMDAsICAgICAgICAwLCAgICAyMzY4OCwgMHgxNjAzMDYzNCwgRj0weDAKIDEsICAgICAgIDM0NTUsICAgICAgIDM0NTUsICAgICAgIDMxLCAgICAgMjIzMiwgMHhmMTAzNDdkYQotMCwgICAgICAgNTA0MCwgICAgICAgNTA0MCwgICAgICAgNDAsICAgIDE2MTMyLCAweGYwZWNhNzk5LCBGPTB4MAorMCwgICAgICAgNTA0MCwgICAgICAgNTA0MCwgICAgICAgIDAsICAgIDE2MTMyLCAweGYwZWNhNzk5LCBGPTB4MAogMSwgICAgICAgMzQ4NiwgICAgICAgMzQ4NiwgICAgICAgMzQsICAgICAyNDQ4LCAweDNlMTZhMTc1Ci0wLCAgICAgICA1MDgwLCAgICAgICA1MDgwLCAgICAgICA0MCwgICAgMjk4OTYsIDB4MGMwOTg4ZWEsIEY9MHgwCiswLCAgICAgICA1MDgwLCAgICAgICA1MDgwLCAgICAgICAgMCwgICAgMjk4OTYsIDB4MGMwOTg4ZWEsIEY9MHgwCiAxLCAgICAgICAzNTIwLCAgICAgICAzNTIwLCAgICAgICAzNSwgICAgIDI1MjAsIDB4MTdlM2NhMmIKLTAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAgIDQwLCAgICAxOTk1NiwgMHgwMDkzYWEwYiwgRj0weDAKKzAsICAgICAgIDUxMjAsICAgICAgIDUxMjAsICAgICAgICAwLCAgICAxOTk1NiwgMHgwMDkzYWEwYiwgRj0weDAKIDEsICAgICAgIDM1NTUsICAgICAgIDM1NTUsICAgICAgIDI3LCAgICAgMTk0NCwgMHgzNWMyZGU4NAotMCwgICAgICAgNTE2MCwgICAgICAgNTE2MCwgICAgICAgNDAsICAgIDE2MzkyLCAweDg4MjlhOWNhLCBGPTB4MAorMCwgICAgICAgNTE2MCwgICAgICAgNTE2MCwgICAgICAgIDAsICAgIDE2MzkyLCAweDg4MjlhOWNhLCBGPTB4MAogMSwgICAgICAgMzU4MiwgICAgICAgMzU4MiwgICAgICAgMjcsICAgICAxOTQ0LCAweDU1YjRkYjQwCi0wLCAgICAgICA1MjAwLCAgICAgICA1MjAwLCAgICAgICA0MCwgICAgMTY3NzIsIDB4OWE0YTU0NmQsIEY9MHgwCiswLCAgICAgICA1MjAwLCAgICAgICA1MjAwLCAgICAgICAgMCwgICAgMTY3NzIsIDB4OWE0YTU0NmQsIEY9MHgwCiAxLCAgICAgICAzNjA5LCAgICAgICAzNjA5LCAgICAgICAyOSwgICAgIDIwODgsIDB4ZGFhZTE0YjIKLTAsICAgICAgIDUyNDAsICAgICAgIDUyNDAsICAgICAgIDQwLCAgICAgODkyMCwgMHhjZDhjYTIwMywgRj0weDAKKzAsICAgICAgIDUyNDAsICAgICAgIDUyNDAsICAgICAgICAwLCAgICAgODkyMCwgMHhjZDhjYTIwMywgRj0weDAKIDEsICAgICAgIDM2MzgsICAgICAgIDM2MzgsICAgICAgIDI3LCAgICAgMTk0NCwgMHg5MmNjZDM3ZgotMCwgICAgICAgNTI4MCwgICAgICAgNTI4MCwgICAgICAgNDAsICAgICA5NjMyLCAweDUzYzFkMzdiLCBGPTB4MAorMCwgICAgICAgNTI4MCwgICAgICAgNTI4MCwgICAgICAgIDAsICAgICA5NjMyLCAweDUzYzFkMzdiLCBGPTB4MAogMSwgICAgICAgMzY2NSwgICAgICAgMzY2NSwgICAgICAgMjcsICAgICAxOTQ0LCAweDcwZWZlZGUxCiAwLCAgICAgICA1MzIwLCAgICAgICA1MzIwLCAgICAgICA0MCwgICAgIDg5NzYsIDB4ZmU0ZGEyY2MsIEY9MHgwCiAxLCAgICAgICAzNjkyLCAgICAgICAzNjkyLCAgICAgICAyNywgICAgIDE5NDQsIDB4NzYwMWQzMDQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3h2aWQtY3VzdG9tLW1hdHJpeCBiL3Rlc3RzL3JlZi9mYXRlL3h2aWQtY3VzdG9tLW1hdHJpeAppbmRleCBjMDBhMjRiLi4zMmY2MjlmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS94dmlkLWN1c3RvbS1tYXRyaXgKKysrIGIvdGVzdHMvcmVmL2ZhdGUveHZpZC1jdXN0b20tbWF0cml4CkBAIC0xLDcgKzEsMTEgQEAKICNmb3JtYXQ6IGZyYW1lIGNoZWNrc3VtcwotI3ZlcnNpb246IDEKKyN2ZXJzaW9uOiAyCiAjaGFzaDogTUQ1CiAjdGIgMDogMS8yNQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNzIweDU3NgorI3NhciAwOiAxNi8xMQogI3N0cmVhbSMsIGR0cywgICAgICAgIHB0cywgZHVyYXRpb24sICAgICBzaXplLCBoYXNoCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICA2MjIwODAsIDg3MGU4NDZiNmIwMDFkM2UzNGZhODdkZjk2Mjk3ZTI4CiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICA2MjIwODAsIGRlMWEzZGQ5ZmNjMzIwODZlY2RmZmQ0NTkxYThkZWZhCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS94dmlkLWlkY3QgYi90ZXN0cy9yZWYvZmF0ZS94dmlkLWlkY3QKaW5kZXggMmZjOTNlZS4uY2RiYmEyZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2ZhdGUveHZpZC1pZGN0CisrKyBiL3Rlc3RzL3JlZi9mYXRlL3h2aWQtaWRjdApAQCAtMSw3ICsxLDExIEBACiAjZm9ybWF0OiBmcmFtZSBjaGVja3N1bXMKLSN2ZXJzaW9uOiAxCisjdmVyc2lvbjogMgogI2hhc2g6IE1ENQogI3RiIDA6IDEvMjUKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDcyMHg1NzYKKyNzYXIgMDogMTYvMTEKICNzdHJlYW0jLCBkdHMsICAgICAgICBwdHMsIGR1cmF0aW9uLCAgICAgc2l6ZSwgaGFzaAogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgNjIyMDgwLCA4ZmUzMThkZjk3M2I1ZDc2NjllNmQyOGViZjAzYjIyOQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgNjIyMDgwLCAzNTY4ZDkyMDc0ZTAyOThhMjAyN2Y5OTAwMDRmZTFhNgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUveHhhbi13YzQgYi90ZXN0cy9yZWYvZmF0ZS94eGFuLXdjNAppbmRleCA4OGRjYzk4Li5hZTNiZGEzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS94eGFuLXdjNAorKysgYi90ZXN0cy9yZWYvZmF0ZS94eGFuLXdjNApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAxLzE1CisjbWVkaWFfdHlwZSAwOiB2aWRlbworI2NvZGVjX2lkIDA6IHJhd3ZpZGVvCisjZGltZW5zaW9ucyAwOiAzMjB4MTY1Cisjc2FyIDA6IDAvMQogMCwgICAgICAgICAgMCwgICAgICAgICAgMCwgICAgICAgIDEsICAgIDc5MzYwLCAweDg1Mzc4MjFiCiAwLCAgICAgICAgICAxLCAgICAgICAgICAxLCAgICAgICAgMSwgICAgNzkzNjAsIDB4MTEwYzQzNDMKIDAsICAgICAgICAgIDIsICAgICAgICAgIDIsICAgICAgICAxLCAgICA3OTM2MCwgMHhhODUxMDViYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2ZhdGUveW9wIGIvdGVzdHMvcmVmL2ZhdGUveW9wCmluZGV4IDE5MjAyODEuLjlkNjE1YjEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3lvcAorKysgYi90ZXN0cy9yZWYvZmF0ZS95b3AKQEAgLTEsNCArMSw4IEBACiAjdGIgMDogMS8xMgorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogNTgweDE3NAorI3NhciAwOiAxLzIKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDMwMjc2MCwgMHhmMjRkZmEzNwogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMzAyNzYwLCAweGNlZGNiYjZjCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAzMDI3NjAsIDB4Yzg3NzE2YTIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3plcm9jb2RlYyBiL3Rlc3RzL3JlZi9mYXRlL3plcm9jb2RlYwppbmRleCAyZDM2OGMzLi4xMGY5ZDRjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS96ZXJvY29kZWMKKysrIGIvdGVzdHMvcmVmL2ZhdGUvemVyb2NvZGVjCkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDQxNzA4My8xMDAwMDAwMAorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMTI4MHg3MjAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgIDE4NDMyMDAsIDB4MDQxNTRiZDUKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgMTg0MzIwMCwgMHgzYTg3MmQwNAogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAxODQzMjAwLCAweDNiMTMwNGEwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvZmF0ZS96bGliIGIvdGVzdHMvcmVmL2ZhdGUvemxpYgppbmRleCA0ZmY3NmZmLi4wMDdmZTAwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS96bGliCisrKyBiL3Rlc3RzL3JlZi9mYXRlL3psaWIKQEAgLTEsMiArMSw2IEBACiAjdGIgMDogMTAwLzI5OTcKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDM1MngyNDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAyNTM0NDAsIDB4OTRhZjYxZTUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ptYnYtMTViaXQgYi90ZXN0cy9yZWYvZmF0ZS96bWJ2LTE1Yml0CmluZGV4IDM4NGJiNjUuLmQzYmVlMzAgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ptYnYtMTViaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvem1idi0xNWJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAyNTAwMDAvMTU4NTM0MQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5MjAwMCwgMHg4ZjkwMjBmMgogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTkyMDAwLCAweGJmYmE3ZjYzCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTIwMDAsIDB4OTZiNDhkMTEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ptYnYtMTZiaXQgYi90ZXN0cy9yZWYvZmF0ZS96bWJ2LTE2Yml0CmluZGV4IGNiMzkwMTQuLmQ2NTBlMDggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ptYnYtMTZiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvem1idi0xNmJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAyNTAwMDAvMTU4NTM0MQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5MjAwMCwgMHhlODY5ZGM5NAogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTkyMDAwLCAweDc0MjkzMmYyCiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTIwMDAsIDB4NzQyOTMyZjIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ptYnYtMzJiaXQgYi90ZXN0cy9yZWYvZmF0ZS96bWJ2LTMyYml0CmluZGV4IGUxZGYxMjMuLmZmNGQ2OWYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9mYXRlL3ptYnYtMzJiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvem1idi0zMmJpdApAQCAtMSw0ICsxLDggQEAKICN0YiAwOiAyNTAwMDAvMTU4NTM0MQorI21lZGlhX3R5cGUgMDogdmlkZW8KKyNjb2RlY19pZCAwOiByYXd2aWRlbworI2RpbWVuc2lvbnMgMDogMzIweDIwMAorI3NhciAwOiAwLzEKIDAsICAgICAgICAgIDAsICAgICAgICAgIDAsICAgICAgICAxLCAgIDE5MjAwMCwgMHgzYWMxMGU4ZQogMCwgICAgICAgICAgMSwgICAgICAgICAgMSwgICAgICAgIDEsICAgMTkyMDAwLCAweGI3NzJlZTU3CiAwLCAgICAgICAgICAyLCAgICAgICAgICAyLCAgICAgICAgMSwgICAxOTIwMDAsIDB4OWI2ZTY0OGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9mYXRlL3ptYnYtOGJpdCBiL3Rlc3RzL3JlZi9mYXRlL3ptYnYtOGJpdAppbmRleCA5ZjAyYWUzLi43YzJmYWI2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvZmF0ZS96bWJ2LThiaXQKKysrIGIvdGVzdHMvcmVmL2ZhdGUvem1idi04Yml0CkBAIC0xLDQgKzEsOCBAQAogI3RiIDA6IDEwMDAwMDAvNzAwODYzMDMKKyNtZWRpYV90eXBlIDA6IHZpZGVvCisjY29kZWNfaWQgMDogcmF3dmlkZW8KKyNkaW1lbnNpb25zIDA6IDMyMHgyMDAKKyNzYXIgMDogMC8xCiAwLCAgICAgICAgICAwLCAgICAgICAgICAwLCAgICAgICAgMSwgICAxOTIwMDAsIDB4NTIzNGI2MTcKIDAsICAgICAgICAgIDEsICAgICAgICAgIDEsICAgICAgICAxLCAgIDE5MjAwMCwgMHg1MjM0YjYxNwogMCwgICAgICAgICAgMiwgICAgICAgICAgMiwgICAgICAgIDEsICAgMTkyMDAwLCAweDUyMzRiNjE3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvbGF2Zi1mYXRlL2F2aV9jcmFtIGIvdGVzdHMvcmVmL2xhdmYtZmF0ZS9hdmlfY3JhbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjg4MmZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2xhdmYtZmF0ZS9hdmlfY3JhbQpAQCAtMCwwICsxLDMgQEAKKzZmYzg4NzAyYzIzYjg5NWMzMDVjNWUxZjUxYTA5MDRlICouL3Rlc3RzL2RhdGEvbGF2Zi1mYXRlL2xhdmYuYXZpCis5MjgyNjAgLi90ZXN0cy9kYXRhL2xhdmYtZmF0ZS9sYXZmLmF2aQorLi90ZXN0cy9kYXRhL2xhdmYtZmF0ZS9sYXZmLmF2aSBDUkM9MHhhNDc3MGRlMgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYtZmF0ZS9tb3ZfcXRybGVfbWFjZTYgYi90ZXN0cy9yZWYvbGF2Zi1mYXRlL21vdl9xdHJsZV9tYWNlNgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODQyOGFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2xhdmYtZmF0ZS9tb3ZfcXRybGVfbWFjZTYKQEAgLTAsMCArMSwzIEBACitkY2M5YzRjMTgyYTU4MDlkZWU5YTkzNjZmNDUzMzc5NyAqLi90ZXN0cy9kYXRhL2xhdmYtZmF0ZS9sYXZmLm1vdgorMTI3MDM4NyAuL3Rlc3RzL2RhdGEvbGF2Zi1mYXRlL2xhdmYubW92CisuL3Rlc3RzL2RhdGEvbGF2Zi1mYXRlL2xhdmYubW92IENSQz0weDkzMjBjZDI2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvbGF2Zi1mYXRlL29nZ192cDggYi90ZXN0cy9yZWYvbGF2Zi1mYXRlL29nZ192cDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgxMzFmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9sYXZmLWZhdGUvb2dnX3ZwOApAQCAtMCwwICsxLDMgQEAKK2M1NmQ4ZGNlNzI4ZDQ2ZDRmMGFiNGM3Y2M5Zjg2YWJjICouL3Rlc3RzL2RhdGEvbGF2Zi1mYXRlL2xhdmYub2d2Cis5NTAwOSAuL3Rlc3RzL2RhdGEvbGF2Zi1mYXRlL2xhdmYub2d2CisuL3Rlc3RzL2RhdGEvbGF2Zi1mYXRlL2xhdmYub2d2IENSQz0weDhjMDY3YTY2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvbGF2Zi9hcG5nIGIvdGVzdHMvcmVmL2xhdmYvYXBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTllNWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2xhdmYvYXBuZwpAQCAtMCwwICsxLDkgQEAKK2E0YzQ2ZmFkNzcxNmFkMDk0ZWIzYzc4Yjc0Y2EwMjQ0ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmFwbmcKKzYyMDk4NjQgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5hcG5nCisuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmFwbmcgQ1JDPTB4ODdiM2MxNWYKK2E0YzQ2ZmFkNzcxNmFkMDk0ZWIzYzc4Yjc0Y2EwMjQ0ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmNvcHkuYXBuZworNjIwOTg2NCAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmNvcHkuYXBuZworLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5jb3B5LmFwbmcgQ1JDPTB4ODdiM2MxNWYKK2M1OTAwZmRkMWIyZmMzMGI5ODU3OTNmNTIyNmZkMGM0ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLnBuZworMjQ4ODU0IC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYucG5nCisuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLnBuZyBDUkM9MHhkOGM3YjdhMQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvYXUgYi90ZXN0cy9yZWYvbGF2Zi9hdQppbmRleCBlZGU0OTI2Li5kY2QwMmYzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvbGF2Zi9hdQorKysgYi90ZXN0cy9yZWYvbGF2Zi9hdQpAQCAtMSwzICsxLDMgQEAKLWFhNWVjMWY4MmFjMDdjNjUzZmZjNTI3YjBmMGRjMTBkICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmF1Ci04ODIzMiAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmF1Cis1MjI4YWQzNzgzODg4YzQ1YTA4ZGFjNWFiNjExODc5NCAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5hdQorODgyNDAgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5hdQogLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5hdSBDUkM9MHgzYTFkYTE3ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvZHB4IGIvdGVzdHMvcmVmL2xhdmYvZHB4CmluZGV4IDU5MWVmMWIuLjdiYmVkM2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9sYXZmL2RweAorKysgYi90ZXN0cy9yZWYvbGF2Zi9kcHgKQEAgLTEsMTEgKzEsMTEgQEAKIDRjODg4MGQ1ODM1ZmZiNWZlMzdjMWVkOGM4ZDQwNGRlICouL3Rlc3RzL2RhdGEvaW1hZ2VzL2RweC8wMi5kcHgKIC4vdGVzdHMvZGF0YS9pbWFnZXMvZHB4LyUwMmQuZHB4IENSQz0weDZkYTAxOTQ2CiAzMDU3OTIgLi90ZXN0cy9kYXRhL2ltYWdlcy9kcHgvMDIuZHB4Ci0xNmQ2NWNlYWExMjc4MDZkYzdlZGU5MzkxZmU4MDg3MiAqLi90ZXN0cy9kYXRhL2ltYWdlcy9kcHgvMDIuZHB4Ci0uL3Rlc3RzL2RhdGEvaW1hZ2VzL2RweC8lMDJkLmRweCBDUkM9MHgyMmRjYzdhOAorN2NhOTM1ZDVkNWUwMGM1NGFjYmM4NTU2NWQzMDM5YjYgKi4vdGVzdHMvZGF0YS9pbWFnZXMvZHB4LzAyLmRweAorLi90ZXN0cy9kYXRhL2ltYWdlcy9kcHgvJTAyZC5kcHggQ1JDPTB4ZTY2NjNmYmEKIDQwNzE2OCAuL3Rlc3RzL2RhdGEvaW1hZ2VzL2RweC8wMi5kcHgKLTAyYjRmZDg1OWQ5NDQwNzU5MDVlODRlOWYzODliZjIzICouL3Rlc3RzL2RhdGEvaW1hZ2VzL2RweC8wMi5kcHgKLS4vdGVzdHMvZGF0YS9pbWFnZXMvZHB4LyUwMmQuZHB4IENSQz0weDk2NGI4N2JhCithNGNmZWExNzk3YzkyOGYyZWZmNzM1NzNlNTU5Njc1ZCAqLi90ZXN0cy9kYXRhL2ltYWdlcy9kcHgvMDIuZHB4CisuL3Rlc3RzL2RhdGEvaW1hZ2VzL2RweC8lMDJkLmRweCBDUkM9MHgxYzc1NTYzMwogNjA5OTIwIC4vdGVzdHMvZGF0YS9pbWFnZXMvZHB4LzAyLmRweAogMDc1OTYzYzNjMDg5NzhiNmEyMDU1NWJhMDkxNjE0MzQgKi4vdGVzdHMvZGF0YS9pbWFnZXMvZHB4LzAyLmRweAogLi90ZXN0cy9kYXRhL2ltYWdlcy9kcHgvJTAyZC5kcHggQ1JDPTB4ZTViOWMwMjMKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9sYXZmL2R2X2ZtdCBiL3Rlc3RzL3JlZi9sYXZmL2R2X2ZtdAppbmRleCBiMTUyYzg0Li4wMjYzMjAyIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvbGF2Zi9kdl9mbXQKKysrIGIvdGVzdHMvcmVmL2xhdmYvZHZfZm10CkBAIC0xLDkgKzEsOSBAQAotMTFiZTNlNWNhYTI4OTIyMzZiMzQ3NWMzZjc4MDdiNzYgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZHYKKzc4MzBmOWM2NzE2Y2ViNjAxMWY4NjVmMWU1MjFiOTUxICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmR2CiAzNjAwMDAwIC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZHYKLS4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZHYgQ1JDPTB4MGIyY2QzZWMKLWU5OTQ5YmM3Njc5MjRlMWU3ZDI4ODU2MDI5ZmVlMDI0ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmR2CisuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmR2IENSQz0weGQ0MjhkM2VlCis1NTY5NjI2MzcwYzdjNzJkNDBkZTJjNDU1OWUzMjg1NiAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5kdgogMzQ4MDAwMCAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmR2Ci0uL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmR2IENSQz0weGZhYjE3YzRhCi04N2QzYjIwZjY1NjIzNTY3MTM4M2E3ZWFhMmY2NjMzMCAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5kdgorLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5kdiBDUkM9MHhhMDA4ODE2MworMmZiMzMyYWFiOGYyYmE5YzMzYjFiMjM2ODE5NDM5MmEgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZHYKIDM2MDAwMDAgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5kdgotLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5kdiBDUkM9MHhmM2U2ODczYworLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5kdiBDUkM9MHhiZGFmN2Y1MgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvZmZtIGIvdGVzdHMvcmVmL2xhdmYvZmZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQ3ZTFmLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL3JlZi9sYXZmL2ZmbQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotZTYzYzE2YjVmMGFkNTAxNTMwNGZjNDAwOWZkYjMzY2EgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZmZtCi0zNzY4MzIgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5mZm0KLS4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZmZtIENSQz0weDAwMGUyM2FlCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvbGF2Zi9maXRzIGIvdGVzdHMvcmVmL2xhdmYvZml0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODk1NDJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2xhdmYvZml0cwpAQCAtMCwwICsxLDE4IEBACitlZDlmZDY5N2QwZDc4MmRmNjIwMWY2YTJkYjE4NDU1MiAqLi90ZXN0cy9kYXRhL2xhdmYvZ3JheWxhdmYuZml0cworNTMyODAwMCAuL3Rlc3RzL2RhdGEvbGF2Zi9ncmF5bGF2Zi5maXRzCisuL3Rlc3RzL2RhdGEvbGF2Zi9ncmF5bGF2Zi5maXRzIENSQz0weGJhY2Y0NDZjCis0OGU2Y2FmNmE1OWUzMmY5YThhMzk5NzljOTE4M2E3ZiAqLi90ZXN0cy9kYXRhL2xhdmYvZ3JheTE2YmVsYXZmLmZpdHMKKzEwMzY4MDAwIC4vdGVzdHMvZGF0YS9sYXZmL2dyYXkxNmJlbGF2Zi5maXRzCisuL3Rlc3RzL2RhdGEvbGF2Zi9ncmF5MTZiZWxhdmYuZml0cyBDUkM9MHhhZTJiNThkNAorYmUyZjcxMTJmZDE5M2M5YTkwOTMwNGM4MWU2NjI3NjkgKi4vdGVzdHMvZGF0YS9sYXZmL2dicnBsYXZmLmZpdHMKKzE1NDA4MDAwIC4vdGVzdHMvZGF0YS9sYXZmL2dicnBsYXZmLmZpdHMKKy4vdGVzdHMvZGF0YS9sYXZmL2dicnBsYXZmLmZpdHMgQ1JDPTB4MDRlZDM4MjgKK2M4OWE3MjE4NWNmYWQzNjNhYTljYzQyZTg0ZmVkMzAxICouL3Rlc3RzL2RhdGEvbGF2Zi9nYnJhcGxhdmYuZml0cworMjA0NDgwMDAgLi90ZXN0cy9kYXRhL2xhdmYvZ2JyYXBsYXZmLmZpdHMKKy4vdGVzdHMvZGF0YS9sYXZmL2dicmFwbGF2Zi5maXRzIENSQz0weDAzMmE2NDA5CitkNTM5YjllMDJmNWFiOGZiODU3MTdjOGFkYjYwYjZjYyAqLi90ZXN0cy9kYXRhL2xhdmYvZ2JycDE2YmVsYXZmLmZpdHMKKzMwNjcyMDAwIC4vdGVzdHMvZGF0YS9sYXZmL2dicnAxNmJlbGF2Zi5maXRzCisuL3Rlc3RzL2RhdGEvbGF2Zi9nYnJwMTZiZWxhdmYuZml0cyBDUkM9MHg4MTg5N2ZmNworM2RjMzYyMmZiMDlhMzM4YjQwNmQ4YTEyYTMwZjI1NDUgKi4vdGVzdHMvZGF0YS9sYXZmL2dicmFwMTZiZWxhdmYuZml0cworNDA3NTIwMDAgLi90ZXN0cy9kYXRhL2xhdmYvZ2JyYXAxNmJlbGF2Zi5maXRzCisuL3Rlc3RzL2RhdGEvbGF2Zi9nYnJhcDE2YmVsYXZmLmZpdHMgQ1JDPTB4MjQ3ZGQ3YjkKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9sYXZmL2d4ZiBiL3Rlc3RzL3JlZi9sYXZmL2d4ZgppbmRleCBkMzU2ZjIwLi40ZGQ0NjNjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvbGF2Zi9neGYKKysrIGIvdGVzdHMvcmVmL2xhdmYvZ3hmCkBAIC0xLDkgKzEsOSBAQAotNzk5M2RhOTVkOGJmZTA0ODMyZTI3ODkyYzE2M2U1NjIgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZ3hmCis2ZWYzNGU4YmVkZjY5OWNkMTYwMTAyMmM0YTBhNDkxMCAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5neGYKIDc5NTg3NiAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmd4ZgotLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5neGYgQ1JDPTB4ZGE3Y2ViYmMKLTllODczMDc0YjVjM2VmMWQ4MGQyMzNhMzhlN2RlMTU2ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmd4ZgorLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5neGYgQ1JDPTB4MWRiZmVmNzYKKzc3ODBjNDI4ZGRlMmM5M2E5ZmYwNDc5NGY3MTY4NDQwICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmd4ZgogNzk0NjU2IC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZ3hmCi0uL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmd4ZiBDUkM9MHg3ZjBjOTA4OQorLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5neGYgQ1JDPTB4ZGNkMzk0NDMKIDA2MzhjNGQwNzNhYzIyNDYwOGJhYWJhMTY3MzJiNjhmICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmd4ZgogNzk1ODc2IC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuZ3hmCiAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLmd4ZiBDUkM9MHg1YWRlMDI4NQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvanBnIGIvdGVzdHMvcmVmL2xhdmYvanBnCmluZGV4IDEzMDlkNzQuLjUwODA2NjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9sYXZmL2pwZworKysgYi90ZXN0cy9yZWYvbGF2Zi9qcGcKQEAgLTEsMyArMSwzIEBACi0xMzE4NzhmZWUxNTNhMDg2ZDc0MDU0M2ZiZjJhYjM1OSAqLi90ZXN0cy9kYXRhL2ltYWdlcy9qcGcvMDIuanBnCisxZTdjNmQ5MzdmMjFjMDQ1ZTBiMjM4YTgzZjYyZjNjNSAqLi90ZXN0cy9kYXRhL2ltYWdlcy9qcGcvMDIuanBnCiAuL3Rlc3RzL2RhdGEvaW1hZ2VzL2pwZy8lMDJkLmpwZyBDUkM9MHhlMzUwOWYzMwotMjg0MDYgLi90ZXN0cy9kYXRhL2ltYWdlcy9qcGcvMDIuanBnCisyNjAzNyAuL3Rlc3RzL2RhdGEvaW1hZ2VzL2pwZy8wMi5qcGcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9sYXZmL21rYSBiL3Rlc3RzL3JlZi9sYXZmL21rYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzBmNmNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2xhdmYvbWthCkBAIC0wLDAgKzEsMyBAQAorMmQ5NzIyYzA2OTFlMTQwMjM3YWYwMDM2ZTNhMTc4YjAgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubWthCis0MzY4NCAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1rYQorLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5ta2EgQ1JDPTB4M2ExZGExN2UKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9sYXZmL21rdiBiL3Rlc3RzL3JlZi9sYXZmL21rdgppbmRleCAzOWE0OGQ4Li4wMDgzMDMzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvbGF2Zi9ta3YKKysrIGIvdGVzdHMvcmVmL2xhdmYvbWt2CkBAIC0xLDYgKzEsNiBAQAotN2M2NTA5ZjU5N2ZiNTdiYWIwMDJjYmNlZWM5NjAwMTEgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubWt2Ci00NzI4NzIgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5ta3YKKzdjODY5N2MzMjRlOGFkNzljNWVhMTQzNjRhNmMzOWI4ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1rdgorNDcyNzU5IC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubWt2CiAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1rdiBDUkM9MHhlYzZjM2M2OAotNWY4Y2I0YjdlOTg2MTAzNDdkZDhkMGQ1OGE4MjhhMGYgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubWt2Ci0zMjA1NDggLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5ta3YKKzk3NjdhM2I1MjZkN2U1NmQ3NDAwMTY0Y2I4ODg5OTBjICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1rdgorMzIwNjAzIC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubWt2CiAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1rdiBDUkM9MHhlYzZjM2M2OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvbW92IGIvdGVzdHMvcmVmL2xhdmYvbW92CmluZGV4IDcyZDk2MmEuLjJlMWYyNGQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9sYXZmL21vdgorKysgYi90ZXN0cy9yZWYvbGF2Zi9tb3YKQEAgLTEwLDMgKzEwLDEyIEBACiBmZDBlNGRlOGU3ZjZkMGM4YzA2ODFkNzAyMGYwMGY1MCAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5tb3YKIDM1NjkyMSAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1vdgogLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5tb3YgQ1JDPTB4YmIyYjk0OWIKK2ViY2E3MmMxODZhNGYzYmE5YmIxN2Q5Y2I1Yjc0ZmVmICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1wNAorMzEyNDU3IC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXA0CisuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1wNCBDUkM9MHg5ZDlhNjM4YQorOTk0NDUxMjQ3NWQ4MmQyZDYwMWYzYzk2MTAxYmRmOWMgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXA0CiszMjEzNDMgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5tcDQKKy4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXA0IENSQz0weGU4MTMwMTIwCis3YjNlNzFmMjk0OTAxMDY3MDQ2YzA5ZjAzYTQyNmJkYyAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5tcDQKKzMxMjAwMSAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm1wNAorLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5tcDQgQ1JDPTB4OWQ5YTYzOGEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9sYXZmL214ZiBiL3Rlc3RzL3JlZi9sYXZmL214ZgppbmRleCBlMWMwYzc5Li43MzE4NDQ3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvbGF2Zi9teGYKKysrIGIvdGVzdHMvcmVmL2xhdmYvbXhmCkBAIC0xLDkgKzEsOSBAQAotZjliNTcwYzdiNGZiYmMyYjcxZjIyMzZiMzJlN2NiYjYgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmCitkNDE0MDEyOTQ2M2RlYzY0YmRiNGE3ZDdhZDFiMGM4MiAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5teGYKIDUyNTM2OSAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14ZgotLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5teGYgQ1JDPTB4ZGJmZmY2ZjEKLThmNmE5YTZiNDA5ZjBmNWEwYmYwMDNmOGRlYTI2MzE0ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14ZgorLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5teGYgQ1JDPTB4OGRkZGZhYWIKK2EyN2JiOGNkNWUxODVlYTEzYjBhOGRhYTRlYjIyMWNkICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14ZgogNTYwNjk3IC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmCi0uL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14ZiBDUkM9MHgxMWE2MTc4ZQotMTBhYzBmMTU4ZmMwYWYzNTY0MzliODE4ZGU3NjAxZTMgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmCisuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14ZiBDUkM9MHhmMjFiMWI0OAorMzk1YmYwMDQ3Yzk3Y2VjYTk2OTM1MzU3MTY2Yjk0YzcgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmCiA1MjUzNjkgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5teGYKLS4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmIENSQz0weGRiZmZmNmYxCisuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14ZiBDUkM9MHg4ZGRkZmFhYgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvbXhmX2QxMCBiL3Rlc3RzL3JlZi9sYXZmL214Zl9kMTAKaW5kZXggMTM0ZGI4Ny4uMjM4NGQ0MiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2xhdmYvbXhmX2QxMAorKysgYi90ZXN0cy9yZWYvbGF2Zi9teGZfZDEwCkBAIC0xLDMgKzEsMyBAQAotNzNjMGNiNDE2NTQ4YzMzZDA2NTFjNTk1MTlhOGY3ZTIgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmX2QxMAorZjQ2OTQ5NDFiMGNkNWI1ZTNjOTEwNjRkODRkYmQzNDUgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmX2QxMAogNTMzMDk4OSAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9kMTAKIC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmX2QxMCBDUkM9MHg2Yzc0ZDQ4OApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvbXhmX2R2MjUgYi90ZXN0cy9yZWYvbGF2Zi9teGZfZHYyNQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODM2YjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2xhdmYvbXhmX2R2MjUKQEAgLTAsMCArMSwzIEBACisxY2E4MTQzYmY2Y2YzMjJmZDM5ZjZlODU2OTU5ZDUwMiAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5teGZfZHYyNQorMzgzMzM4OSAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9kdjI1CisuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9kdjI1IENSQz0weGJkYWY3ZjUyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvbGF2Zi9teGZfZHZjcHJvNTAgYi90ZXN0cy9yZWYvbGF2Zi9teGZfZHZjcHJvNTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzZDZiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9sYXZmL214Zl9kdmNwcm81MApAQCAtMCwwICsxLDMgQEAKKzk4N2ZkNGIyYWJiMzY0MzNmYmEwZTM1ZjQwOTJlZmM2ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9kdmNwcm81MAorNzQzMDE4OSAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9kdmNwcm81MAorLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5teGZfZHZjcHJvNTAgQ1JDPTB4ZTNiYmU0YjQKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9sYXZmL214Zl9vcGF0b20gYi90ZXN0cy9yZWYvbGF2Zi9teGZfb3BhdG9tCmluZGV4IGVhMTE5MGMuLjFjYzYxMmUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9sYXZmL214Zl9vcGF0b20KKysrIGIvdGVzdHMvcmVmL2xhdmYvbXhmX29wYXRvbQpAQCAtMSwzICsxLDMgQEAKLTk2MmMyY2Q1ODIzNDBmODk2MWE4MjgzNjM2MDkzYWJmICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9vcGF0b20KK2I4ZmU2MGY3NDU3YjgzNzA5ZjMzMzU3ZDA0YzhkYjBjICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9vcGF0b20KIDQ3MTcxMTMgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5teGZfb3BhdG9tCiAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9vcGF0b20gQ1JDPTB4ZjU1YWEyMmEKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9sYXZmL214Zl9vcGF0b21fYXVkaW8gYi90ZXN0cy9yZWYvbGF2Zi9teGZfb3BhdG9tX2F1ZGlvCmluZGV4IDk1M2RmOTAuLmRlZWQ1NWUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9sYXZmL214Zl9vcGF0b21fYXVkaW8KKysrIGIvdGVzdHMvcmVmL2xhdmYvbXhmX29wYXRvbV9hdWRpbwpAQCAtMSwzICsxLDMgQEAKLWQ0YWQ1YTBmYWY0MTBhOWQ5ZTk5YjMzMjgxNDNlODlkICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9vcGF0b21fYXVkaW8KK2U3ZGE1MmJkNTkxZTZlZGRiNGUxYWYzODFhNGU1YmQ0ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9vcGF0b21fYXVkaW8KIDEwMTk0NSAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLm14Zl9vcGF0b21fYXVkaW8KIC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYubXhmX29wYXRvbV9hdWRpbyBDUkM9MHhkMTU1YzZmZgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvc21qcGVnIGIvdGVzdHMvcmVmL2xhdmYvc21qcGVnCmluZGV4IGEyZWViOTcuLmZiOGM2NTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9sYXZmL3NtanBlZworKysgYi90ZXN0cy9yZWYvbGF2Zi9zbWpwZWcKQEAgLTEsMyArMSwzIEBACi1hOTU5ODJhMmQzOTBmNGRjZGM3MmE0MWQ4OTIwYWJiOSAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5zbWpwZWcKLTc4OTU1MSAuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLnNtanBlZworM2ZlOTAyMTNhYzRmNTI3NWViODVhZDBhNGU0YmRiNDQgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuc21qcGVnCis3Mjg2NDIgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5zbWpwZWcKIC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYuc21qcGVnIENSQz0weDU0YmY2MTQ3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvbGF2Zi90cyBiL3Rlc3RzL3JlZi9sYXZmL3RzCmluZGV4IDEzODFmMDkuLjJiZTM1MjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9sYXZmL3RzCisrKyBiL3Rlc3RzL3JlZi9sYXZmL3RzCkBAIC0xLDMgKzEsMyBAQAotY2NhNmJjYTUxMjYwNWJiZGUyMGI3YWE1Y2NjZjQ4NTAgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYudHMKKzM4ZjRiMTRkNDNhMGU0MTZiZThkNTk4NjI4OTk3Y2JjICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLnRzCiA0MDcwMjAgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi50cwogLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi50cyBDUkM9MHg3MTI4N2UyNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvdHRhIGIvdGVzdHMvcmVmL2xhdmYvdHRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmQwOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvbGF2Zi90dGEKQEAgLTAsMCArMSwzIEBACitkODZjNWNjY2IyNTU0MTQzZDM0ZDE3ODZhYjQ2MGEzMSAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi50dGEKKzQzMjAwIC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYudHRhCisuL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLnR0YSBDUkM9MHgzYTFkYTE3ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvd2F2X3BlYWsgYi90ZXN0cy9yZWYvbGF2Zi93YXZfcGVhawppbmRleCBhYTdlNWZjLi44NjFiMjQ2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvbGF2Zi93YXZfcGVhaworKysgYi90ZXN0cy9yZWYvbGF2Zi93YXZfcGVhawpAQCAtMSwzICsxLDMgQEAKLTM1MTQ4ZDFmNmU2NmIwMDgwODkzODUxZDkxN2VjYmY0ICouL3Rlc3RzL2RhdGEvbGF2Zi9sYXZmLnBlYWsud2F2CisxMDU4MDU5NjNmYjc2N2QwMGRhMDU2ZjQyZjMyZDlmMyAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5wZWFrLndhdgogODkwOTQgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5wZWFrLndhdgogLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi5wZWFrLndhdiBDUkM9MHgzYTFkYTE3ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvd2F2X3BlYWtfb25seSBiL3Rlc3RzL3JlZi9sYXZmL3dhdl9wZWFrX29ubHkKaW5kZXggZGNjZDBlNy4uYjIwM2QwMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL2xhdmYvd2F2X3BlYWtfb25seQorKysgYi90ZXN0cy9yZWYvbGF2Zi93YXZfcGVha19vbmx5CkBAIC0xLDIgKzEsMiBAQAotYjYwOWEzNjNlNmQ0OTA3MTBlZDUyMjMxYThkMDlkM2MgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYucGVha19vbmx5LndhdgorZjFhOGFlZWFlODA2OWYzOTkyYzRkNzgwNDM2YzNkMjMgKi4vdGVzdHMvZGF0YS9sYXZmL2xhdmYucGVha19vbmx5LndhdgogODMyIC4vdGVzdHMvZGF0YS9sYXZmL2xhdmYucGVha19vbmx5LndhdgpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYvd3YgYi90ZXN0cy9yZWYvbGF2Zi93dgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjNjNWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL2xhdmYvd3YKQEAgLTAsMCArMSwzIEBACis0N2Q5YTM4MWQ5YzNmOTliOGIwNTlmM2IxN2YxZGMxMSAqLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi53dgorNTk1NjAgLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi53dgorLi90ZXN0cy9kYXRhL2xhdmYvbGF2Zi53diBDUkM9MHgzYTFkYTE3ZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL2xhdmYveHdkIGIvdGVzdHMvcmVmL2xhdmYveHdkCmluZGV4IDNkNjM4MjEuLmIyNjNjZTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9sYXZmL3h3ZAorKysgYi90ZXN0cy9yZWYvbGF2Zi94d2QKQEAgLTExLDEwICsxMSwxMCBAQAogLi90ZXN0cy9kYXRhL2ltYWdlcy94d2QvJTAyZC54d2QgQ1JDPTB4MTQ1NTVkNmUKIDIwMjg2MyAuL3Rlc3RzL2RhdGEvaW1hZ2VzL3h3ZC8wMi54d2QKIGM2ZjNjYjdjNDVmNzIzODQ3NGE4OWQyYWQ2MWExY2FmICouL3Rlc3RzL2RhdGEvaW1hZ2VzL3h3ZC8wMi54d2QKLS4vdGVzdHMvZGF0YS9pbWFnZXMveHdkLyUwMmQueHdkIENSQz0weGZhYWZiNTliCisuL3Rlc3RzL2RhdGEvaW1hZ2VzL3h3ZC8lMDJkLnh3ZCBDUkM9MHhmMjE3YTk1ZQogMTA0NTU5IC4vdGVzdHMvZGF0YS9pbWFnZXMveHdkLzAyLnh3ZAogZmUxYWY5NTQ5NjZhNDBjMmNkMzVmYzI3MDk0ZmY4MjMgKi4vdGVzdHMvZGF0YS9pbWFnZXMveHdkLzAyLnh3ZAotLi90ZXN0cy9kYXRhL2ltYWdlcy94d2QvJTAyZC54d2QgQ1JDPTB4ZDY5YzNhMDkKKy4vdGVzdHMvZGF0YS9pbWFnZXMveHdkLyUwMmQueHdkIENSQz0weGNlMDQyZGNjCiAxMDQ1NTkgLi90ZXN0cy9kYXRhL2ltYWdlcy94d2QvMDIueHdkCiA4NWU5YjhiODE0YTFkZWE3MWQxNDNhYWMyZTQ4NzAzNyAqLi90ZXN0cy9kYXRhL2ltYWdlcy94d2QvMDIueHdkCiAuL3Rlc3RzL2RhdGEvaW1hZ2VzL3h3ZC8lMDJkLnh3ZCBDUkM9MHgwZmYyMDViZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3NlZWsvYWNvZGVjLWFkcGNtLXN3ZiBiL3Rlc3RzL3JlZi9zZWVrL2Fjb2RlYy1hZHBjbS1zd2YKaW5kZXggMmY5MDkxMy4uNTkwNWIzMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3NlZWsvYWNvZGVjLWFkcGNtLXN3ZgorKysgYi90ZXN0cy9yZWYvc2Vlay9hY29kZWMtYWRwY20tc3dmCkBAIC0xLDQ5ICsxLDQ5IEBACi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIwOCBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTYgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAyMDggc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTk2IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjg1ODAwMCBwdHM6IDEuODU4MDAwIHBvczogIDgyOTY4IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS44NTgwMDAgcHRzOiAxLjg1ODAwMCBwb3M6ICA4Mjk1NiBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuNzg4MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC43ODkwMDAgcHRzOiAwLjc4OTAwMCBwb3M6ICAzNTM4MSBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNzg5MDAwIHB0czogMC43ODkwMDAgcG9zOiAgMzUzNjkgc2l6ZTogIDIwNTMKIHJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjMxNzAwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi42MDEwMDAgcHRzOiAyLjYwMTAwMCBwb3M6IDExNjA3MiBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuNjAxMDAwIHB0czogMi42MDEwMDAgcG9zOiAxMTYwNjAgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDQwMDAwIHB0czogMS40NDAwMDAgcG9zOiAgNjQzNDcgc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjQ0MDAwMCBwdHM6IDEuNDQwMDAwIHBvczogIDY0MzM1IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjUwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM3MjAwMCBwdHM6IDAuMzcyMDAwIHBvczogIDE2NzYwIHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4zNzIwMDAgcHRzOiAwLjM3MjAwMCBwb3M6ICAxNjc0OCBzaXplOiAgMjA1MwogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzQxMDAwCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi4xNTMzMzYKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjE4MzAwMCBwdHM6IDIuMTgzMDAwIHBvczogIDk3NDUxIHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4xODMwMDAgcHRzOiAyLjE4MzAwMCBwb3M6ICA5NzQzOSBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4wMjIwMDAgcHRzOiAxLjAyMjAwMCBwb3M6ICA0NTcyNiBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMDIyMDAwIHB0czogMS4wMjIwMDAgcG9zOiAgNDU3MTQgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA1ODAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAyMDggc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTk2IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi44MzYwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjgzMzAwMCBwdHM6IDIuODMzMDAwIHBvczogMTI2NDE3IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi44MzMwMDAgcHRzOiAyLjgzMzAwMCBwb3M6IDEyNjQwNSBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS43NjUwMDAgcHRzOiAxLjc2NTAwMCBwb3M6ICA3ODgzMCBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNzY1MDAwIHB0czogMS43NjUwMDAgcG9zOiAgNzg4MTggc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjYyNDE3MQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNjA0MDAwIHB0czogMC42MDQwMDAgcG9zOiAgMjcxMDUgc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjYwNDAwMCBwdHM6IDAuNjA0MDAwIHBvczogIDI3MDkzIHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODIwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMjA4IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDE5NiBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDEzMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4zNjgwMDAgcHRzOiAyLjM2ODAwMCBwb3M6IDEwNTcyNyBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuMzY4MDAwIHB0czogMi4zNjgwMDAgcG9zOiAxMDU3MTUgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjMwNjY3MgotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMzQ3MDAwIHB0czogMS4zNDcwMDAgcG9zOiAgNjAyMDkgc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjM0NzAwMCBwdHM6IDEuMzQ3MDAwIHBvczogIDYwMTk3IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjE4NjAwMCBwdHM6IDAuMTg2MDAwIHBvczogICA4NDg0IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4xODYwMDAgcHRzOiAwLjE4NjAwMCBwb3M6ICAgODQ3MiBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuOTA1MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIwOCBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTYgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjk4OTAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTUwMDAwIHB0czogMS45NTAwMDAgcG9zOiAgODcxMDYgc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjk1MDAwMCBwdHM6IDEuOTUwMDAwIHBvczogIDg3MDk0IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjkyOTAwMCBwdHM6IDAuOTI5MDAwIHBvczogIDQxNTg4IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45MjkwMDAgcHRzOiAwLjkyOTAwMCBwb3M6ICA0MTU3NiBzaXplOiAgMjA1MwogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzIwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjY5NDAwMCBwdHM6IDIuNjk0MDAwIHBvczogMTIwMjEwIHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi42OTQwMDAgcHRzOiAyLjY5NDAwMCBwb3M6IDEyMDE5OCBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuNTY2MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS41MzMwMDAgcHRzOiAxLjUzMzAwMCBwb3M6ICA2ODQ4NSBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNTMzMDAwIHB0czogMS41MzMwMDAgcG9zOiAgNjg0NzMgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDY0MDAwIHB0czogMC40NjQwMDAgcG9zOiAgMjA4OTggc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ2NDAwMCBwdHM6IDAuNDY0MDAwIHBvczogIDIwODg2IHNpemU6ICAyMDUzCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC42NDU4MjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2Fjb2RlYy1hZHBjbS1zd2YtdHJlbGxpcyBiL3Rlc3RzL3JlZi9zZWVrL2Fjb2RlYy1hZHBjbS1zd2YtdHJlbGxpcwppbmRleCAyZjkwOTEzLi41OTA1YjMzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvc2Vlay9hY29kZWMtYWRwY20tc3dmLXRyZWxsaXMKKysrIGIvdGVzdHMvcmVmL3NlZWsvYWNvZGVjLWFkcGNtLXN3Zi10cmVsbGlzCkBAIC0xLDQ5ICsxLDQ5IEBACi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIwOCBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTYgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAyMDggc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTk2IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjg1ODAwMCBwdHM6IDEuODU4MDAwIHBvczogIDgyOTY4IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS44NTgwMDAgcHRzOiAxLjg1ODAwMCBwb3M6ICA4Mjk1NiBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuNzg4MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC43ODkwMDAgcHRzOiAwLjc4OTAwMCBwb3M6ICAzNTM4MSBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNzg5MDAwIHB0czogMC43ODkwMDAgcG9zOiAgMzUzNjkgc2l6ZTogIDIwNTMKIHJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjMxNzAwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi42MDEwMDAgcHRzOiAyLjYwMTAwMCBwb3M6IDExNjA3MiBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuNjAxMDAwIHB0czogMi42MDEwMDAgcG9zOiAxMTYwNjAgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDQwMDAwIHB0czogMS40NDAwMDAgcG9zOiAgNjQzNDcgc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjQ0MDAwMCBwdHM6IDEuNDQwMDAwIHBvczogIDY0MzM1IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjUwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM3MjAwMCBwdHM6IDAuMzcyMDAwIHBvczogIDE2NzYwIHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4zNzIwMDAgcHRzOiAwLjM3MjAwMCBwb3M6ICAxNjc0OCBzaXplOiAgMjA1MwogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzQxMDAwCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi4xNTMzMzYKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjE4MzAwMCBwdHM6IDIuMTgzMDAwIHBvczogIDk3NDUxIHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4xODMwMDAgcHRzOiAyLjE4MzAwMCBwb3M6ICA5NzQzOSBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4wMjIwMDAgcHRzOiAxLjAyMjAwMCBwb3M6ICA0NTcyNiBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMDIyMDAwIHB0czogMS4wMjIwMDAgcG9zOiAgNDU3MTQgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA1ODAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAyMDggc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTk2IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi44MzYwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjgzMzAwMCBwdHM6IDIuODMzMDAwIHBvczogMTI2NDE3IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi44MzMwMDAgcHRzOiAyLjgzMzAwMCBwb3M6IDEyNjQwNSBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS43NjUwMDAgcHRzOiAxLjc2NTAwMCBwb3M6ICA3ODgzMCBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNzY1MDAwIHB0czogMS43NjUwMDAgcG9zOiAgNzg4MTggc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjYyNDE3MQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNjA0MDAwIHB0czogMC42MDQwMDAgcG9zOiAgMjcxMDUgc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjYwNDAwMCBwdHM6IDAuNjA0MDAwIHBvczogIDI3MDkzIHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODIwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMjA4IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDE5NiBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDEzMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4zNjgwMDAgcHRzOiAyLjM2ODAwMCBwb3M6IDEwNTcyNyBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuMzY4MDAwIHB0czogMi4zNjgwMDAgcG9zOiAxMDU3MTUgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjMwNjY3MgotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMzQ3MDAwIHB0czogMS4zNDcwMDAgcG9zOiAgNjAyMDkgc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjM0NzAwMCBwdHM6IDEuMzQ3MDAwIHBvczogIDYwMTk3IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjE4NjAwMCBwdHM6IDAuMTg2MDAwIHBvczogICA4NDg0IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4xODYwMDAgcHRzOiAwLjE4NjAwMCBwb3M6ICAgODQ3MiBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuOTA1MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIwOCBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTYgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjk4OTAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTUwMDAwIHB0czogMS45NTAwMDAgcG9zOiAgODcxMDYgc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjk1MDAwMCBwdHM6IDEuOTUwMDAwIHBvczogIDg3MDk0IHNpemU6ICAyMDUzCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjkyOTAwMCBwdHM6IDAuOTI5MDAwIHBvczogIDQxNTg4IHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45MjkwMDAgcHRzOiAwLjkyOTAwMCBwb3M6ICA0MTU3NiBzaXplOiAgMjA1MwogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzIwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjY5NDAwMCBwdHM6IDIuNjk0MDAwIHBvczogMTIwMjEwIHNpemU6ICAyMDUzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi42OTQwMDAgcHRzOiAyLjY5NDAwMCBwb3M6IDEyMDE5OCBzaXplOiAgMjA1MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuNTY2MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS41MzMwMDAgcHRzOiAxLjUzMzAwMCBwb3M6ICA2ODQ4NSBzaXplOiAgMjA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNTMzMDAwIHB0czogMS41MzMwMDAgcG9zOiAgNjg0NzMgc2l6ZTogIDIwNTMKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDY0MDAwIHB0czogMC40NjQwMDAgcG9zOiAgMjA4OTggc2l6ZTogIDIwNTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ2NDAwMCBwdHM6IDAuNDY0MDAwIHBvczogIDIwODg2IHNpemU6ICAyMDUzCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC42NDU4MjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2NhY2hlLXBpcGUgYi90ZXN0cy9yZWYvc2Vlay9jYWNoZS1waXBlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTU5NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvc2Vlay9jYWNoZS1waXBlCkBAIC0wLDAgKzEsNDkgQEAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAxNDUxIHNpemU6ICAgNDE3CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAxNDUxIHNpemU6ICAgNDE3CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjg4MDgxNiBwdHM6IDEuODgwODE2IHBvczogIDMxNTQ0IHNpemU6ICAgNDE4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC43ODgzMzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjgwOTc5NiBwdHM6IDAuODA5Nzk2IHBvczogIDE0NDA3IHNpemU6ICAgNDE4CityZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC4zMTc0OTkKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjU3NjY2OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuNTg2MTIyIHB0czogMi41ODYxMjIgcG9zOiAgNDI4Mjggc2l6ZTogICA0MTgKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDYyODU3IHB0czogMS40NjI4NTcgcG9zOiAgMjQ4NTYgc2l6ZTogICA0MTgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjM2NTAwMgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMzY1NzE0IHB0czogMC4zNjU3MTQgcG9zOiAgIDczMDIgc2l6ZTogICA0MTgKK3JldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjc0MDgzMQorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuMTUzMzM2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4xNjgxNjMgcHRzOiAyLjE2ODE2MyBwb3M6ICAzNjE0MSBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4wNDQ4OTggcHRzOiAxLjA0NDg5OCBwb3M6ICAxODE2OSBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuMDU4MzMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQxNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuODM1ODM3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi44MjEyMjQgcHRzOiAyLjgyMTIyNCBwb3M6ICA0NjU5MCBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS43NTAyMDQgcHRzOiAxLjc1MDIwNCBwb3M6ICAyOTQ1NCBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42MDA4MTYgcHRzOiAwLjYwMDgxNiBwb3M6ICAxMTA2NCBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgxNjYyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQxNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDEyNTA1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi40MDMyNjUgcHRzOiAyLjQwMzI2NSBwb3M6ICAzOTkwMyBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4zMzIyNDUgcHRzOiAxLjMzMjI0NSBwb3M6ICAyMjc2NiBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuMjAwODM5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4xODI4NTcgcHRzOiAwLjE4Mjg1NyBwb3M6ICAgNDM3NiBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuOTA0OTk0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQxNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuOTg5MTczCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45ODUzMDYgcHRzOiAxLjk4NTMwNiBwb3M6ICAzMzIxNSBzaXplOiAgIDQxOAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuODgzMzQwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44ODgxNjMgcHRzOiAwLjg4ODE2MyBwb3M6ICAxNTY2MSBzaXplOiAgIDQxOAorcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzE2NzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjY5MDYxMiBwdHM6IDIuNjkwNjEyIHBvczogIDQ0NTAwIHNpemU6ICAgNDE4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS41NjU4NDEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjU0MTIyNCBwdHM6IDEuNTQxMjI0IHBvczogIDI2MTEwIHNpemU6ICAgNDE4CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ3MDIwNCBwdHM6IDAuNDcwMjA0IHBvczogICA4OTc0IHNpemU6ICAgNDE4CityZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC42NDU4MjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2VtcHR5LWVkaXQtbXA0IGIvdGVzdHMvcmVmL3NlZWsvZW1wdHktZWRpdC1tcDQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhNGFkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2VtcHR5LWVkaXQtbXA0CkBAIC0wLDAgKzEsMTM0IEBACityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA1LjAwMDAwMCBwb3M6ICAgICA0OCBzaXplOiAgMjkxNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMTAwMDAwIHB0czogNS4xMDAwMDAgcG9zOiAgIDI5NjUgc2l6ZTogICA2NzIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjIwMDAwMCBwdHM6IDUuMjAwMDAwIHBvczogICAzNjM3IHNpemU6ICAgNDY0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4zMDAwMDAgcHRzOiA1LjMwMDAwMCBwb3M6ICAgNDEwMSBzaXplOiAgIDQ1NAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA1LjAwMDAwMCBwb3M6ICAgICA0OCBzaXplOiAgMjkxNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMTAwMDAwIHB0czogNS4xMDAwMDAgcG9zOiAgIDI5NjUgc2l6ZTogICA2NzIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjIwMDAwMCBwdHM6IDUuMjAwMDAwIHBvczogICAzNjM3IHNpemU6ICAgNDY0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4zMDAwMDAgcHRzOiA1LjMwMDAwMCBwb3M6ICAgNDEwMSBzaXplOiAgIDQ1NAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDExLjg5NDE2NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDExLjAwMDAwMCBwdHM6IDExLjAwMDAwMCBwb3M6ICA0MDUxNSBzaXplOiAgMzIxNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDExLjEwMDAwMCBwdHM6IDExLjEwMDAwMCBwb3M6ICA0MzcyOSBzaXplOiAgIDU4MQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDExLjIwMDAwMCBwdHM6IDExLjIwMDAwMCBwb3M6ICA0NDMxMCBzaXplOiAgIDQzMgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDExLjMwMDAwMCBwdHM6IDExLjMwMDAwMCBwb3M6ICA0NDc0MiBzaXplOiAgIDM4MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDkuNzg4Mzc5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTAuMDAwMDAwIHB0czogMTAuMDAwMDAwIHBvczogIDMzNTIzIHNpemU6ICAzMjIxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMTAwMDAwIHB0czogMTAuMTAwMDAwIHBvczogIDM2NzQ0IHNpemU6ICAgNTc1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMjAwMDAwIHB0czogMTAuMjAwMDAwIHBvczogIDM3MzE5IHNpemU6ICAgNDM4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMzAwMDAwIHB0czogMTAuMzAwMDAwIHBvczogIDM3NzU3IHNpemU6ICAgNDQ5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogNy42ODI1MjAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA3LjAwMDAwMCBwdHM6IDcuMDAwMDAwIHBvczogIDEzNjQzIHNpemU6ICAzMjM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNy4xMDAwMDAgcHRzOiA3LjEwMDAwMCBwb3M6ICAxNjg3NyBzaXplOiAgIDU4NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDcuMjAwMDAwIHB0czogNy4yMDAwMDAgcG9zOiAgMTc0NjIgc2l6ZTogICA0NDIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA3LjMwMDAwMCBwdHM6IDcuMzAwMDAwIHBvczogIDE3OTA0IHNpemU6ICAgMzcxCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogNS41NzY2NjgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA2LjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogICA2OTUzIHNpemU6ICAzMTY2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNi4xMDAwMDAgcHRzOiA2LjEwMDAwMCBwb3M6ICAxMDExOSBzaXplOiAgIDU5OQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDYuMjAwMDAwIHB0czogNi4yMDAwMDAgcG9zOiAgMTA3MTggc2l6ZTogICA0MTgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA2LjMwMDAwMCBwdHM6IDYuMzAwMDAwIHBvczogIDExMTM2IHNpemU6ICAgMzU0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMy40NzA4MzUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMS4zNjUwMzkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NDA4MjAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMTIuMTUzMzM2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTMuMDAwMDAwIHB0czogMTMuMDAwMDAwIHBvczogIDU0NDQ0IHNpemU6ICAzMzEwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMuMTAwMDAwIHB0czogMTMuMTAwMDAwIHBvczogIDU3NzU0IHNpemU6ICAgNTQwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMuMjAwMDAwIHB0czogMTMuMjAwMDAwIHBvczogIDU4Mjk0IHNpemU6ICAgNDE5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMuMzAwMDAwIHB0czogMTMuMzAwMDAwIHBvczogIDU4NzEzIHNpemU6ICAgMzM4CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMTAuMDQ3NTAzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTAuMDAwMDAwIHB0czogMTAuMDAwMDAwIHBvczogIDMzNTIzIHNpemU6ICAzMjIxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMTAwMDAwIHB0czogMTAuMTAwMDAwIHBvczogIDM2NzQ0IHNpemU6ICAgNTc1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMjAwMDAwIHB0czogMTAuMjAwMDAwIHBvczogIDM3MzE5IHNpemU6ICAgNDM4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMzAwMDAwIHB0czogMTAuMzAwMDAwIHBvczogIDM3NzU3IHNpemU6ICAgNDQ5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogNy45NDE2OTkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA4LjAwMDAwMCBwdHM6IDguMDAwMDAwIHBvczogIDIwMzk2IHNpemU6ICAzMjgxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogOC4xMDAwMDAgcHRzOiA4LjEwMDAwMCBwb3M6ICAyMzY3NyBzaXplOiAgIDYzMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDguMjAwMDAwIHB0czogOC4yMDAwMDAgcG9zOiAgMjQzMDggc2l6ZTogICAzNDkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA4LjMwMDAwMCBwdHM6IDguMzAwMDAwIHBvczogIDI0NjU3IHNpemU6ICAgMzE5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogNS44MzU4NDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMy43MzAwMDQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS42MjQxNzEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODE2NDEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMTIuNDEyNTAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTIuMDAwMDAwIHB0czogMTIuMDAwMDAwIHBvczogIDQ3NDE5IHNpemU6ICAzMjI5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTIuMTAwMDAwIHB0czogMTIuMTAwMDAwIHBvczogIDUwNjQ4IHNpemU6ICAgNTg4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTIuMjAwMDAwIHB0czogMTIuMjAwMDAwIHBvczogIDUxMjM2IHNpemU6ICAgNDA0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTIuMzAwMDAwIHB0czogMTIuMzAwMDAwIHBvczogIDUxNjQwIHNpemU6ICAgNDE1CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMTAuMzA2NjcyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTEuMDAwMDAwIHB0czogMTEuMDAwMDAwIHBvczogIDQwNTE1IHNpemU6ICAzMjE0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTEuMTAwMDAwIHB0czogMTEuMTAwMDAwIHBvczogIDQzNzI5IHNpemU6ICAgNTgxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTEuMjAwMDAwIHB0czogMTEuMjAwMDAwIHBvczogIDQ0MzEwIHNpemU6ICAgNDMyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTEuMzAwMDAwIHB0czogMTEuMzAwMDAwIHBvczogIDQ0NzQyIHNpemU6ICAgMzgwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogOC4yMDA4MzkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA4LjAwMDAwMCBwdHM6IDguMDAwMDAwIHBvczogIDIwMzk2IHNpemU6ICAzMjgxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogOC4xMDAwMDAgcHRzOiA4LjEwMDAwMCBwb3M6ICAyMzY3NyBzaXplOiAgIDYzMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDguMjAwMDAwIHB0czogOC4yMDAwMDAgcG9zOiAgMjQzMDggc2l6ZTogICAzNDkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA4LjMwMDAwMCBwdHM6IDguMzAwMDAwIHBvczogIDI0NjU3IHNpemU6ICAgMzE5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogNi4wOTUwMjAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA3LjAwMDAwMCBwdHM6IDcuMDAwMDAwIHBvczogIDEzNjQzIHNpemU6ICAzMjM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNy4xMDAwMDAgcHRzOiA3LjEwMDAwMCBwb3M6ICAxNjg3NyBzaXplOiAgIDU4NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDcuMjAwMDAwIHB0czogNy4yMDAwMDAgcG9zOiAgMTc0NjIgc2l6ZTogICA0NDIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA3LjMwMDAwMCBwdHM6IDcuMzAwMDAwIHBvczogIDE3OTA0IHNpemU6ICAgMzcxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMy45ODkxNjAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS44ODMzNDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC4yMjI0OTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICAyOTE3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNS4xMDAwMDAgcHRzOiA1LjEwMDAwMCBwb3M6ICAgMjk2NSBzaXplOiAgIDY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDUuMjAwMDAwIHB0czogNS4yMDAwMDAgcG9zOiAgIDM2Mzcgc2l6ZTogICA0NjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA1LjMwMDAwMCBwdHM6IDUuMzAwMDAwIHBvczogICA0MTAxIHNpemU6ICAgNDU0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMTIuNjcxNjgwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTMuMDAwMDAwIHB0czogMTMuMDAwMDAwIHBvczogIDU0NDQ0IHNpemU6ICAzMzEwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMuMTAwMDAwIHB0czogMTMuMTAwMDAwIHBvczogIDU3NzU0IHNpemU6ICAgNTQwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMuMjAwMDAwIHB0czogMTMuMjAwMDAwIHBvczogIDU4Mjk0IHNpemU6ICAgNDE5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMuMzAwMDAwIHB0czogMTMuMzAwMDAwIHBvczogIDU4NzEzIHNpemU6ICAgMzM4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMTAuNTY1ODIwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTAuMDAwMDAwIHB0czogMTAuMDAwMDAwIHBvczogIDMzNTIzIHNpemU6ICAzMjIxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMTAwMDAwIHB0czogMTAuMTAwMDAwIHBvczogIDM2NzQ0IHNpemU6ICAgNTc1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMjAwMDAwIHB0czogMTAuMjAwMDAwIHBvczogIDM3MzE5IHNpemU6ICAgNDM4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMzAwMDAwIHB0czogMTAuMzAwMDAwIHBvczogIDM3NzU3IHNpemU6ICAgNDQ5CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogOC40NjAwMDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA5LjAwMDAwMCBwdHM6IDkuMDAwMDAwIHBvczogIDI3MDkwIHNpemU6ICAzMTgyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogOS4xMDAwMDAgcHRzOiA5LjEwMDAwMCBwb3M6ICAzMDI3MiBzaXplOiAgIDQ4MQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDkuMjAwMDAwIHB0czogOS4yMDAwMDAgcG9zOiAgMzA3NTMgc2l6ZTogICAzMzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA5LjMwMDAwMCBwdHM6IDkuMzAwMDAwIHBvczogIDMxMDg3IHNpemU6ICAgMzI4CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogNi4zNTQxNzUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA2LjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogICA2OTUzIHNpemU6ICAzMTY2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNi4xMDAwMDAgcHRzOiA2LjEwMDAwMCBwb3M6ICAxMDExOSBzaXplOiAgIDU5OQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDYuMjAwMDAwIHB0czogNi4yMDAwMDAgcG9zOiAgMTA3MTggc2l6ZTogICA0MTgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA2LjMwMDAwMCBwdHM6IDYuMzAwMDAwIHBvczogIDExMTM2IHNpemU6ICAgMzU0CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9leHRyYS1tcDMgYi90ZXN0cy9yZWYvc2Vlay9leHRyYS1tcDMKaW5kZXggOTgxYWMwMi4uZmRmYjFhNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3NlZWsvZXh0cmEtbXAzCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2V4dHJhLW1wMwpAQCAtMSwxMiArMSwxMiBAQAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDE0NTEgc2l6ZTogICA0NDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAxNDUxIHNpemU6ICAgNDE3CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAxNDUxIHNpemU6ICAgNDQwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQxNwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS44ODA4MTYgcHRzOiAxLjg4MDgxNiBwb3M6ICAzMTU0NCBzaXplOiAgIDQxOAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuNzg4MzM0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44MDk3OTYgcHRzOiAwLjgwOTc5NiBwb3M6ICAxNDQwNyBzaXplOiAgIDQxOAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzE3NDk5Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQ0MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDE0NTEgc2l6ZTogICA0MTcKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjU3NjY2OAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuNTg2MTIyIHB0czogMi41ODYxMjIgcG9zOiAgNDI4Mjggc2l6ZTogICA0MTgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQpAQCAtMTQsMTMgKzE0LDEzIEBACiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjUwMDIKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM2NTcxNCBwdHM6IDAuMzY1NzE0IHBvczogICA3MzAyIHNpemU6ICAgNDE4CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NDA4MzEKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAxNDUxIHNpemU6ICAgNDQwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQxNwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuMTUzMzM2CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4xNjgxNjMgcHRzOiAyLjE2ODE2MyBwb3M6ICAzNjE0MSBzaXplOiAgIDQxOAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4wNDQ4OTggcHRzOiAxLjA0NDg5OCBwb3M6ICAxODE2OSBzaXplOiAgIDQxOAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuMDU4MzMwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQ0MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDE0NTEgc2l6ZTogICA0MTcKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjgzNTgzNwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuODIxMjI0IHB0czogMi44MjEyMjQgcG9zOiAgNDY1OTAgc2l6ZTogICA0MTgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjczMDAwNApAQCAtMjgsNyArMjgsNyBAQAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42MDA4MTYgcHRzOiAwLjYwMDgxNiBwb3M6ICAxMTA2NCBzaXplOiAgIDQxOAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgxNjYyCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQ0MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDE0NTEgc2l6ZTogICA0MTcKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjQxMjUwNQogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuNDAzMjY1IHB0czogMi40MDMyNjUgcG9zOiAgMzk5MDMgc2l6ZTogICA0MTgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjMwNjY3MgpAQCAtMzYsMTMgKzM2LDEzIEBACiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjE4Mjg1NyBwdHM6IDAuMTgyODU3IHBvczogICA0Mzc2IHNpemU6ICAgNDE4CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MDQ5OTQKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAxNDUxIHNpemU6ICAgNDQwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQxNwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuOTg5MTczCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45ODUzMDYgcHRzOiAxLjk4NTMwNiBwb3M6ICAzMzIxNSBzaXplOiAgIDQxOAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuODgzMzQwCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44ODgxNjMgcHRzOiAwLjg4ODE2MyBwb3M6ICAxNTY2MSBzaXplOiAgIDQxOAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQ0MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDE0NTEgc2l6ZTogICA0MTcKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyLjY3MTY3NAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuNjkwNjEyIHB0czogMi42OTA2MTIgcG9zOiAgNDQ1MDAgc2l6ZTogICA0MTgKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2NTg0MQpAQCAtNTAsNCArNTAsNCBAQAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuNDYwMDA4CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40NzAyMDQgcHRzOiAwLjQ3MDIwNCBwb3M6ICAgODk3NCBzaXplOiAgIDQxOAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTQ1MSBzaXplOiAgIDQ0MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDE0NTEgc2l6ZTogICA0MTcKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2V4dHJhLW1wNCBiL3Rlc3RzL3JlZi9zZWVrL2V4dHJhLW1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTdjZTQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3NlZWsvZXh0cmEtbXA0CkBAIC0wLDAgKzEsMTM0IEBACityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMzMzMzMgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTI4NyBzaXplOiAgIDE4MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMC4wMzMzMzMgcG9zOiAgIDE0NzAgc2l6ZTogICAgMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAzMzMzMyBwdHM6IDAuMDY2NjY3IHBvczogICAxNDk0IHNpemU6ICA2Nzc5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wNjY2NjcgcHRzOiAwLjEwMDAwMCBwb3M6ICAgODI3MyBzaXplOiAxMTA0MQorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMzMzMzMgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTI4NyBzaXplOiAgIDE4MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMC4wMzMzMzMgcG9zOiAgIDE0NzAgc2l6ZTogICAgMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAzMzMzMyBwdHM6IDAuMDY2NjY3IHBvczogICAxNDk0IHNpemU6ICA2Nzc5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wNjY2NjcgcHRzOiAwLjEwMDAwMCBwb3M6ICAgODI3MyBzaXplOiAxMTA0MQorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEwMS44OTQxNjcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxMDEuMzAwMDAwIHB0czogMTAxLjMzMzMzMyBwb3M6MTA5ODIzMTEgc2l6ZTogNjcyMzcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDEuMzMzMzMzIHB0czogMTAxLjQzMzMzMyBwb3M6MTEwNDk1NDggc2l6ZTogIDM1MjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDEuMzY2NjY3IHB0czogMTAxLjM2NjY2NyBwb3M6MTEwNTMwNzIgc2l6ZTogICA1NjIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDEuNDAwMDAwIHB0czogMTAxLjQwMDAwMCBwb3M6MTEwNTM2MzQgc2l6ZTogICA1OTkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyNC43ODgzMzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyNS4zMDAwMDAgcHRzOiAyNS4zMzMzMzMgcG9zOjI2MDcyNDYgc2l6ZTogNDAyNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS4zMzMzMzMgcHRzOiAyNS40MzMzMzMgcG9zOjI2NDc1MTkgc2l6ZTogIDI5NTkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS4zNjY2NjcgcHRzOiAyNS4zNjY2NjcgcG9zOjI2NTA0Nzggc2l6ZTogICAxOTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS40MDAwMDAgcHRzOiAyNS40MDAwMDAgcG9zOjI2NTA2NzUgc2l6ZTogICAyMzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxMjcuNjgyNTAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTI2LjYzMzMzMyBwdHM6IDEyNi42NjY2NjcgcG9zOjEzMzU5OTc1IHNpemU6IDY4NzQxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTI2LjY2NjY2NyBwdHM6IDEyNi43NjY2NjcgcG9zOjEzNDI4NzE2IHNpemU6ICAyOTE0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTI2LjcwMDAwMCBwdHM6IDEyNi43MDAwMDAgcG9zOjEzNDMxNjMwIHNpemU6ICAgNzgxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTI2LjczMzMzMyBwdHM6IDEyNi43MzMzMzMgcG9zOjEzNDMyNDExIHNpemU6ICAgODE3CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogNTAuNTc2NjY4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNTAuNjAwMDAwIHB0czogNTAuNjMzMzMzIHBvczo1ODU4MjU0IHNpemU6IDY3OTAzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNjMzMzMzIHB0czogNTAuNzMzMzMzIHBvczo1OTI2MTU3IHNpemU6ICAxMzA3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNjY2NjY3IHB0czogNTAuNjY2NjY3IHBvczo1OTI3NDY0IHNpemU6ICAgMTUwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNzAwMDAwIHB0czogNTAuNzAwMDAwIHBvczo1OTI3NjE0IHNpemU6ICAgMTc2CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMTUzLjQ3MDgzNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDE1MS45NjY2NjcgcHRzOiAxNTIuMDAwMDAwIHBvczoxNTcwNTM1NSBzaXplOjE0NjkyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1Mi4wMDAwMDAgcHRzOiAxNTIuMTAwMDAwIHBvczoxNTg1MjI3OSBzaXplOiAgMTM1NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1Mi4wMzMzMzMgcHRzOiAxNTIuMDMzMzMzIHBvczoxNTg1MzYzNCBzaXplOiAgIDIxMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1Mi4wNjY2NjcgcHRzOiAxNTIuMDY2NjY3IHBvczoxNTg1Mzg0NSBzaXplOiAgIDIxNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDc2LjM2NTAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDc3LjgzMzMzMyBwdHM6IDc3Ljg2NjY2NyBwb3M6ODY1OTY1NyBzaXplOiA0MTE4MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc3Ljg2NjY2NyBwdHM6IDc3Ljk2NjY2NyBwb3M6ODcwMDgzOSBzaXplOiAgNDE5NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc3LjkwMDAwMCBwdHM6IDc3LjkwMDAwMCBwb3M6ODcwNTAzNiBzaXplOiAgIDY1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc3LjkzMzMzMyBwdHM6IDc3LjkzMzMzMyBwb3M6ODcwNTY4OSBzaXplOiAgIDc1MQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzQwODMzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMzMzMzMgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTI4NyBzaXplOiAgIDE4MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMC4wMzMzMzMgcG9zOiAgIDE0NzAgc2l6ZTogICAgMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAzMzMzMyBwdHM6IDAuMDY2NjY3IHBvczogICAxNDk0IHNpemU6ICA2Nzc5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wNjY2NjcgcHRzOiAwLjEwMDAwMCBwb3M6ICAgODI3MyBzaXplOiAxMTA0MQorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEwMi4xNTMzMzYKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxMDQuMDY2NjY3IHB0czogMTA0LjEwMDAwMCBwb3M6MTExMTY0NjEgc2l6ZToxMTI5MjkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDQuMTAwMDAwIHB0czogMTA0LjEzMzMzMyBwb3M6MTEyMjkzOTAgc2l6ZTogICA1ODUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDQuMTMzMzMzIHB0czogMTA0LjE2NjY2NyBwb3M6MTEyMjk5NzUgc2l6ZTogICA3OTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDQuMTY2NjY3IHB0czogMTA0LjIwMDAwMCBwb3M6MTEyMzA3NzIgc2l6ZTogICA4MTAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAyNS4wNDc1MDMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyMC4yMzMzMzMgcHRzOiAyMC4yNjY2NjcgcG9zOjIyMjM5NTkgc2l6ZTogNTE4MjMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyMC4yNjY2NjcgcHRzOiAyMC4zMDAwMDAgcG9zOjIyNzU3ODIgc2l6ZTogICA0ODgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyMC4zMDAwMDAgcHRzOiAyMC40MDAwMDAgcG9zOjIyNzYyNzAgc2l6ZTogICA2NzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyMC4zMzMzMzMgcHRzOiAyMC4zMzMzMzMgcG9zOjIyNzY5NDAgc2l6ZTogICAgODQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAxMjcuOTQxNjY3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTMxLjIzMzMzMyBwdHM6IDEzMS4yNjY2NjcgcG9zOjEzNzI3OTUzIHNpemU6IDYyMjI5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMxLjI2NjY2NyBwdHM6IDEzMS4zNjY2NjcgcG9zOjEzNzkwMTgyIHNpemU6ICAyMzQ5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMxLjMwMDAwMCBwdHM6IDEzMS4zMDAwMDAgcG9zOjEzNzkyNTMxIHNpemU6ICAgNTcxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMxLjMzMzMzMyBwdHM6IDEzMS4zMzMzMzMgcG9zOjEzNzkzMTAyIHNpemU6ICAxMTkwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogNTAuODM1ODMzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNTAuNjAwMDAwIHB0czogNTAuNjMzMzMzIHBvczo1ODU4MjU0IHNpemU6IDY3OTAzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNjMzMzMzIHB0czogNTAuNzMzMzMzIHBvczo1OTI2MTU3IHNpemU6ICAxMzA3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNjY2NjY3IHB0czogNTAuNjY2NjY3IHBvczo1OTI3NDY0IHNpemU6ICAgMTUwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNzAwMDAwIHB0czogNTAuNzAwMDAwIHBvczo1OTI3NjE0IHNpemU6ICAgMTc2CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMTUzLjczMDAwNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDE1Ny4wMzMzMzMgcHRzOiAxNTcuMDY2NjY3IHBvczoxNjIyNTM2NSBzaXplOiA4MjczOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1Ny4wNjY2NjcgcHRzOiAxNTcuMTY2NjY3IHBvczoxNjMwODEwMyBzaXplOiAgMjI3MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1Ny4xMDAwMDAgcHRzOiAxNTcuMTAwMDAwIHBvczoxNjMxMDM3NiBzaXplOiAgIDM1MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1Ny4xMzMzMzMgcHRzOiAxNTcuMTMzMzMzIHBvczoxNjMxMDcyNiBzaXplOiAgIDMzNworcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDc2LjYyNDE3MQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDc1Ljk2NjY2NyBwdHM6IDc2LjAwMDAwMCBwb3M6ODUyMDE3OCBzaXplOiA5NDM5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc2LjAwMDAwMCBwdHM6IDc2LjEwMDAwMCBwb3M6ODYxNDU3MyBzaXplOiAgIDQ4MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc2LjAzMzMzMyBwdHM6IDc2LjAzMzMzMyBwb3M6ODYxNTA1NiBzaXplOiAgICAzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc2LjA2NjY2NyBwdHM6IDc2LjA2NjY2NyBwb3M6ODYxNTA5MyBzaXplOiAgICA1NgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgxNjY3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMzMzMzMgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTI4NyBzaXplOiAgIDE4MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMC4wMzMzMzMgcG9zOiAgIDE0NzAgc2l6ZTogICAgMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAzMzMzMyBwdHM6IDAuMDY2NjY3IHBvczogICAxNDk0IHNpemU6ICA2Nzc5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wNjY2NjcgcHRzOiAwLjEwMDAwMCBwb3M6ICAgODI3MyBzaXplOiAxMTA0MQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEwMi40MTI1MDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxMDEuMzAwMDAwIHB0czogMTAxLjMzMzMzMyBwb3M6MTA5ODIzMTEgc2l6ZTogNjcyMzcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDEuMzMzMzMzIHB0czogMTAxLjQzMzMzMyBwb3M6MTEwNDk1NDggc2l6ZTogIDM1MjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDEuMzY2NjY3IHB0czogMTAxLjM2NjY2NyBwb3M6MTEwNTMwNzIgc2l6ZTogICA1NjIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDEuNDAwMDAwIHB0czogMTAxLjQwMDAwMCBwb3M6MTEwNTM2MzQgc2l6ZTogICA1OTkKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyNS4zMDY2NzIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyNS4zMDAwMDAgcHRzOiAyNS4zMzMzMzMgcG9zOjI2MDcyNDYgc2l6ZTogNDAyNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS4zMzMzMzMgcHRzOiAyNS40MzMzMzMgcG9zOjI2NDc1MTkgc2l6ZTogIDI5NTkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS4zNjY2NjcgcHRzOiAyNS4zNjY2NjcgcG9zOjI2NTA0Nzggc2l6ZTogICAxOTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS40MDAwMDAgcHRzOiAyNS40MDAwMDAgcG9zOjI2NTA2NzUgc2l6ZTogICAyMzAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxMjguMjAwODM5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTI3LjgzMzMzMyBwdHM6IDEyNy44NjY2NjcgcG9zOjEzNTE0MDcyIHNpemU6IDY3MzgyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTI3Ljg2NjY2NyBwdHM6IDEyNy45NjY2NjcgcG9zOjEzNTgxNDU0IHNpemU6ICAyOTM2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTI3LjkwMDAwMCBwdHM6IDEyNy45MDAwMDAgcG9zOjEzNTg0MzkwIHNpemU6ICAgNDUxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTI3LjkzMzMzMyBwdHM6IDEyNy45MzMzMzMgcG9zOjEzNTg0ODQxIHNpemU6ICAgNTM3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogNTEuMDk1MDExCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNTIuMDMzMzMzIHB0czogNTIuMDY2NjY3IHBvczo2MDI4MDUwIHNpemU6MTE1ODA5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTIuMDY2NjY3IHB0czogNTIuMTY2NjY3IHBvczo2MTQzODU5IHNpemU6ICAxNjIwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTIuMTAwMDAwIHB0czogNTIuMTAwMDAwIHBvczo2MTQ1NDc5IHNpemU6ICAgIDkyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTIuMTMzMzMzIHB0czogNTIuMTMzMzMzIHBvczo2MTQ1NTcxIHNpemU6ICAgNTMzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMTUzLjk4OTE3OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDE1My40NjY2NjcgcHRzOiAxNTMuNTAwMDAwIHBvczoxNTg2NzcwMCBzaXplOiA5NjE2OQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1My41MDAwMDAgcHRzOiAxNTMuNTMzMzMzIHBvczoxNTk2Mzg2OSBzaXplOiAgIDc4NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1My41MzMzMzMgcHRzOiAxNTMuNjMzMzMzIHBvczoxNTk2NDY1NCBzaXplOiAgMzEzNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDE1My41NjY2NjcgcHRzOiAxNTMuNTY2NjY3IHBvczoxNTk2Nzc4OSBzaXplOiAgIDg1OQorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDc2Ljg4MzM0MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDc3LjgzMzMzMyBwdHM6IDc3Ljg2NjY2NyBwb3M6ODY1OTY1NyBzaXplOiA0MTE4MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc3Ljg2NjY2NyBwdHM6IDc3Ljk2NjY2NyBwb3M6ODcwMDgzOSBzaXplOiAgNDE5NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc3LjkwMDAwMCBwdHM6IDc3LjkwMDAwMCBwb3M6ODcwNTAzNiBzaXplOiAgIDY1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDc3LjkzMzMzMyBwdHM6IDc3LjkzMzMzMyBwb3M6ODcwNTY4OSBzaXplOiAgIDc1MQorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMzMzMzMgcHRzOiAwLjAwMDAwMCBwb3M6ICAgMTI4NyBzaXplOiAgIDE4MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMC4wMzMzMzMgcG9zOiAgIDE0NzAgc2l6ZTogICAgMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAzMzMzMyBwdHM6IDAuMDY2NjY3IHBvczogICAxNDk0IHNpemU6ICA2Nzc5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wNjY2NjcgcHRzOiAwLjEwMDAwMCBwb3M6ICAgODI3MyBzaXplOiAxMTA0MQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDEwMi42NzE2NzgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxMDQuMDY2NjY3IHB0czogMTA0LjEwMDAwMCBwb3M6MTExMTY0NjEgc2l6ZToxMTI5MjkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDQuMTAwMDAwIHB0czogMTA0LjEzMzMzMyBwb3M6MTEyMjkzOTAgc2l6ZTogICA1ODUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDQuMTMzMzMzIHB0czogMTA0LjE2NjY2NyBwb3M6MTEyMjk5NzUgc2l6ZTogICA3OTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMDQuMTY2NjY3IHB0czogMTA0LjIwMDAwMCBwb3M6MTEyMzA3NzIgc2l6ZTogICA4MTAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyNS41NjU4NDQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyNS4zMDAwMDAgcHRzOiAyNS4zMzMzMzMgcG9zOjI2MDcyNDYgc2l6ZTogNDAyNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS4zMzMzMzMgcHRzOiAyNS40MzMzMzMgcG9zOjI2NDc1MTkgc2l6ZTogIDI5NTkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS4zNjY2NjcgcHRzOiAyNS4zNjY2NjcgcG9zOjI2NTA0Nzggc2l6ZTogICAxOTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAyNS40MDAwMDAgcHRzOiAyNS40MDAwMDAgcG9zOjI2NTA2NzUgc2l6ZTogICAyMzAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxMjguNDYwMDA4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMTMxLjIzMzMzMyBwdHM6IDEzMS4yNjY2NjcgcG9zOjEzNzI3OTUzIHNpemU6IDYyMjI5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMxLjI2NjY2NyBwdHM6IDEzMS4zNjY2NjcgcG9zOjEzNzkwMTgyIHNpemU6ICAyMzQ5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMxLjMwMDAwMCBwdHM6IDEzMS4zMDAwMDAgcG9zOjEzNzkyNTMxIHNpemU6ICAgNTcxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTMxLjMzMzMzMyBwdHM6IDEzMS4zMzMzMzMgcG9zOjEzNzkzMTAyIHNpemU6ICAxMTkwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogNTEuMzU0MTc1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNTAuNjAwMDAwIHB0czogNTAuNjMzMzMzIHBvczo1ODU4MjU0IHNpemU6IDY3OTAzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNjMzMzMzIHB0czogNTAuNzMzMzMzIHBvczo1OTI2MTU3IHNpemU6ICAxMzA3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNjY2NjY3IHB0czogNTAuNjY2NjY3IHBvczo1OTI3NDY0IHNpemU6ICAgMTUwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNTAuNzAwMDAwIHB0czogNTAuNzAwMDAwIHBvczo1OTI3NjE0IHNpemU6ICAgMTc2CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9sYXZmLWFsYXcgYi90ZXN0cy9yZWYvc2Vlay9sYXZmLWFsYXcKaW5kZXggNGIxZjhmYi4uOGQ1MTdmYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3NlZWsvbGF2Zi1hbGF3CisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtYWxhdwpAQCAtMSw1MyArMSw1MyBAQAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS44OTQxNTAgcHRzOiAxLjg5NDE1MCBwb3M6ICA0MTc2NiBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuODk0MTUwIHB0czogMS44OTQxNTAgcG9zOiAgNDE3NjYgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjc4ODM0NQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNzg4MzQ1IHB0czogMC43ODgzNDUgcG9zOiAgMTczODMgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjc4ODM0NSBwdHM6IDAuNzg4MzQ1IHBvczogIDE3MzgzIHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC4zMTc1MDYKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4CiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuNDcwODM1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS40NzA4MzkgcHRzOiAxLjQ3MDgzOSBwb3M6ICAzMjQzMiBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDcwODM5IHB0czogMS40NzA4MzkgcG9zOiAgMzI0MzIgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjM2NDk4OQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMzY0OTg5IHB0czogMC4zNjQ5ODkgcG9zOiAgIDgwNDggc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM2NDk4OSBwdHM6IDAuMzY0OTg5IHBvczogICA4MDQ4IHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NDA4MTYKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuMTUzMzM2CiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4wNDc0ODMgcHRzOiAxLjA0NzQ4MyBwb3M6ICAyMzA5NyBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMDQ3NDgzIHB0czogMS4wNDc0ODMgcG9zOiAgMjMwOTcgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA1ODMyMgotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi44MzU4MjgKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS43MzAwMDQKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjczMDAyMyBwdHM6IDEuNzMwMDIzIHBvczogIDM4MTQ3IHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS43MzAwMjMgcHRzOiAxLjczMDAyMyBwb3M6ICAzODE0NyBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42MjQxNzIgcHRzOiAwLjYyNDE3MiBwb3M6ICAxMzc2MyBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNjI0MTcyIHB0czogMC42MjQxNzIgcG9zOiAgMTM3NjMgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjQ4MTY3OAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MTI1MTcKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS4zMDY2NzIKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjMwNjY2NyBwdHM6IDEuMzA2NjY3IHBvczogIDI4ODEyIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4zMDY2NjcgcHRzOiAxLjMwNjY2NyBwb3M6ICAyODgxMiBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuMjAwODM5Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4yMDA4MTYgcHRzOiAwLjIwMDgxNiBwb3M6ICAgNDQyOCBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMjAwODE2IHB0czogMC4yMDA4MTYgcG9zOiAgIDQ0Mjggc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjkwNDk4OQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS45ODkxNjEKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjk4OTE2MSBwdHM6IDEuOTg5MTYxIHBvczogIDQzODYxIHNpemU6ICAgMjM5CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjg4MzM1NiBwdHM6IDAuODgzMzU2IHBvczogIDE5NDc4IHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44ODMzNTYgcHRzOiAwLjg4MzM1NiBwb3M6ICAxOTQ3OCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyLjY3MTY1NQogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2NTg1MAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNTY1ODUwIHB0czogMS41NjU4NTAgcG9zOiAgMzQ1Mjcgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjU2NTg1MCBwdHM6IDEuNTY1ODUwIHBvczogIDM0NTI3IHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ2MDAwMCBwdHM6IDAuNDYwMDAwIHBvczogIDEwMTQzIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40NjAwMDAgcHRzOiAwLjQ2MDAwMCBwb3M6ICAxMDE0MyBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogICA4ODIKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtYXUgYi90ZXN0cy9yZWYvc2Vlay9sYXZmLWF1CmluZGV4IGQ1YTcwYjIuLjhlZGNlNTggMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtYXUKKysrIGIvdGVzdHMvcmVmL3NlZWsvbGF2Zi1hdQpAQCAtMSw1MyArMSw1MyBAQAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgMzIgc2l6ZTogIDIwNDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDQwIHNpemU6ICAyMDQ4CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDMyIHNpemU6ICAyMDQ4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICA0MCBzaXplOiAgMjA0OAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3CiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuNzg4MzQ1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC43ODgzNDUgcHRzOiAwLjc4ODM0NSBwb3M6ICA2OTU2NCBzaXplOiAgMjA0OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNzg4MzQ1IHB0czogMC43ODgzNDUgcG9zOiAgNjk1NzIgc2l6ZTogIDIwNDgKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjMxNzUwNgotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgMzIgc2l6ZTogIDIwNDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDQwIHNpemU6ICAyMDQ4CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi41NzY2NjgKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS40NzA4MzUKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjUwMTEKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM2NTAxMSBwdHM6IDAuMzY1MDExIHBvczogIDMyMjI2IHNpemU6ICAyMDQ4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4zNjUwMTEgcHRzOiAwLjM2NTAxMSBwb3M6ICAzMjIzNCBzaXplOiAgMjA0OAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzQwODM5Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAzMiBzaXplOiAgMjA0OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgNDAgc2l6ZTogIDIwNDgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjE1MzMzNgogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMwogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA1ODMyMgotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgMzIgc2l6ZTogIDIwNDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDQwIHNpemU6ICAyMDQ4CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi44MzU4MjgKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS43MzAwMDQKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC42MjQxNzEKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjYyNDE3MiBwdHM6IDAuNjI0MTcyIHBvczogIDU1MDg0IHNpemU6ICAyMDQ4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42MjQxNzIgcHRzOiAwLjYyNDE3MiBwb3M6ICA1NTA5MiBzaXplOiAgMjA0OAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgxNjU1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAzMiBzaXplOiAgMjA0OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgNDAgc2l6ZTogIDIwNDgKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjQxMjQ5NAogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjMwNjY3MgogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjIwMDgzOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMjAwODM5IHB0czogMC4yMDA4MzkgcG9zOiAgMTc3NDYgc2l6ZTogIDIwNDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjIwMDgzOSBwdHM6IDAuMjAwODM5IHBvczogIDE3NzU0IHNpemU6ICAyMDQ4CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MDQ5ODkKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDMyIHNpemU6ICAyMDQ4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICA0MCBzaXplOiAgMjA0OAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuOTg5MTg0CiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuODgzMzQwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44ODMzMzMgcHRzOiAwLjg4MzMzMyBwb3M6ICA3Nzk0MiBzaXplOiAgMjA0OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuODgzMzMzIHB0czogMC44ODMzMzMgcG9zOiAgNzc5NTAgc2l6ZTogIDIwNDgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjIyMjQ5MwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgMzIgc2l6ZTogIDIwNDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDQwIHNpemU6ICAyMDQ4CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzE2NzgKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS41NjU4NTAKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ2MDAwMCBwdHM6IDAuNDYwMDAwIHBvczogIDQwNjA0IHNpemU6ICAyMDQ4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40NjAwMDAgcHRzOiAwLjQ2MDAwMCBwb3M6ICA0MDYxMiBzaXplOiAgMjA0OAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAzMiBzaXplOiAgMjA0OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgNDAgc2l6ZTogIDIwNDgKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtZmZtIGIvdGVzdHMvcmVmL3NlZWsvbGF2Zi1mZm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZWVkMWEuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcmVmL3NlZWsvbGF2Zi1mZm0KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuNzg4MzM0Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC44MjUwMTEgcHRzOiAwLjgyNTAxMSBwb3M6IDMyNzY4MCBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzE3NDk5Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSAgdHM6IDEuNDcwODM1Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuMzY1MDAyCi1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC4zODA5MzAgcHRzOiAwLjM4MDkzMCBwb3M6IDE2Mzg0MCBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNzQwODMxCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDIuMTUzMzM2Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCi1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MCAgdHM6LTAuMDU4MzMwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSAgdHM6IDIuODM1ODM3Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCi1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC42NDIxNTQgcHRzOiAwLjY0MjE1NCBwb3M6IDI3NDQzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgxNjYyCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDEyNTA1Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCi1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSAgdHM6IDAuMjAwODM5Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC4yMjQxOTUgcHRzOiAwLjIyNDE5NSBwb3M6IDExNDY4OCBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTAuOTA0OTk0Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuOTg5MTczCi1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuODgzMzQwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC44ODAwMDAgcHRzOiAwLjkyMDAwMCBwb3M6IDMzOTk2OCBzaXplOiAxMjMwNwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MCAgdHM6IDIuNjcxNjc0Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSAgdHM6IDEuNTY1ODQxCi1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45Mjk1MDEgcHRzOiAwLjkyOTUwMSBwb3M6IDM3NjgzMiBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuNDYwMDA4Ci1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC40ODU0MjAgcHRzOiAwLjQ4NTQyMCBwb3M6IDIyMTE4NCBzaXplOiAgIDIwOQotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wNDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgODE5MiBzaXplOiAyNDY2MwpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3NlZWsvbGF2Zi1mbHZfZm10IGIvdGVzdHMvcmVmL3NlZWsvbGF2Zi1mbHZfZm10CmluZGV4IGMxMmRhODQuLjlkODZhODEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtZmx2X2ZtdAorKysgYi90ZXN0cy9yZWYvc2Vlay9sYXZmLWZsdl9mbXQKQEAgLTEsNDQgKzEsNDQgQEAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMjE3IHNpemU6IDMxMDc0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIwNSBzaXplOiAzMTA3NAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIxNyBzaXplOiAzMTA3NAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAyMDUgc2l6ZTogMzEwNzQKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjg5NDE2NwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOiAyOTg0MTYgc2l6ZTogMzExMzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMjk4NDA0IHNpemU6IDMxMTM0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC43ODgwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMjk4NDE2IHNpemU6IDMxMTM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6IDI5ODQwNCBzaXplOiAzMTEzNAogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzE3MDAwCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi41NzY2NjgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOiAyOTg0MTYgc2l6ZTogMzExMzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMjk4NDA0IHNpemU6IDMxMTM0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjUwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczogMTQ5NDU2IHNpemU6IDMxMTI1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40ODAwMDAgcHRzOiAwLjQ4MDAwMCBwb3M6IDE0OTQ0NCBzaXplOiAzMTEyNQogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzQxMDAwCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi4xNTMzMzYKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOiAyOTg0MTYgc2l6ZTogMzExMzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMjk4NDA0IHNpemU6IDMxMTM0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC4wNTgwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMjE3IHNpemU6IDMxMDc0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIwNSBzaXplOiAzMTA3NAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuODM2MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6IDI5ODQxNiBzaXplOiAzMTEzNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOiAyOTg0MDQgc2l6ZTogMzExMzQKIHJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjczMDAwNAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40ODAwMDAgcHRzOiAwLjQ4MDAwMCBwb3M6IDE0OTQ1NiBzaXplOiAzMTEyNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDgwMDAwIHB0czogMC40ODAwMDAgcG9zOiAxNDk0NDQgc2l6ZTogMzExMjUKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjQ4MjAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAyMTcgc2l6ZTogMzEwNzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMjA1IHNpemU6IDMxMDc0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MTMwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMjk4NDE2IHNpemU6IDMxMTM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6IDI5ODQwNCBzaXplOiAzMTEzNAogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMjE3IHNpemU6IDMxMDc0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIwNSBzaXplOiAzMTA3NAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuOTA1MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDIxNyBzaXplOiAzMTA3NAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAyMDUgc2l6ZTogMzEwNzQKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjk4OTAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOiAyOTg0MTYgc2l6ZTogMzExMzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMjk4NDA0IHNpemU6IDMxMTM0CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMjk4NDE2IHNpemU6IDMxMTM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6IDI5ODQwNCBzaXplOiAzMTEzNAogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzIwMDAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2NjAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOiAyOTg0MTYgc2l6ZTogMzExMzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMjk4NDA0IHNpemU6IDMxMTM0CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczogMTQ5NDU2IHNpemU6IDMxMTI1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40ODAwMDAgcHRzOiAwLjQ4MDAwMCBwb3M6IDE0OTQ0NCBzaXplOiAzMTEyNQogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9sYXZmLWpwZyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtanBnCmluZGV4IDRmM2ExNGMuLjU0NWY1OWQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtanBnCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtanBnCkBAIC0xLDQgKzEsNCBAQAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgLTEgc2l6ZTogMjgwNzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIC0xIHNpemU6IDI1NjQxCiByZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKIHJldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjg5NDE2NwogcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuODAwMDAwCkBAIC02LDcgKzYsNyBAQAogcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4CiByZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczoxICB0czogMS40NzA4MzUKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjM2MDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMzYwMDAwIHB0czogMC4zNjAwMDAgcG9zOiAgICAgLTEgc2l6ZTogMjc3NzEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM2MDAwMCBwdHM6IDAuMzYwMDAwIHBvczogICAgIC0xIHNpemU6IDI1MzE2CiByZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczoxICB0czotMC43NjAwMDAKIHJldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjE1MzMzNgogcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCkBAIC0xOCw3ICsxOCw3IEBACiByZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczoxICB0czogMi40MDAwMDAKIHJldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjMwNjY3MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuMjAwODM5Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4yMDAwMDAgcHRzOiAwLjIwMDAwMCBwb3M6ICAgICAtMSBzaXplOiAyODE5NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMjAwMDAwIHB0czogMC4yMDAwMDAgcG9zOiAgICAgLTEgc2l6ZTogMjU3ODgKIHJldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjkyMDAwMAogcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuMDAwMDAwCiByZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKQEAgLTI2LDUgKzI2LDUgQEAKIHJldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyLjY4MDAwMAogcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuNTYwMDAwCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczogICAgIC0xIHNpemU6IDI3OTUwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40ODAwMDAgcHRzOiAwLjQ4MDAwMCBwb3M6ICAgICAtMSBzaXplOiAyNTQ4NwogcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9sYXZmLW1rdiBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbWt2CmluZGV4IGFmMTNkZGIuLmNlYTM0ZTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbWt2CisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbWt2CkBAIC0xLDQ4ICsxLDQ4IEBACi1yZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDc5NyBzaXplOiAgIDIwOAorcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICA4MzQgc2l6ZTogICAyMDgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDExMDAwIHB0czogMC4wMTEwMDAgcG9zOiAgIDEwMTMgc2l6ZTogMjc4MzcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAxMTAwMCBwdHM6IDAuMDExMDAwIHBvczogICAxMDUwIHNpemU6IDI3ODM3CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk3MTAwMCBwdHM6IDAuOTcxMDAwIHBvczogMjkyNDI3IHNpemU6IDI3ODM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NzEwMDAgcHRzOiAwLjk3MTAwMCBwb3M6IDI5MjQ3NiBzaXplOiAyNzgzNAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuNzg4MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NzEwMDAgcHRzOiAwLjk3MTAwMCBwb3M6IDI5MjQyNyBzaXplOiAyNzgzNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTcxMDAwIHB0czogMC45NzEwMDAgcG9zOiAyOTI0NzYgc2l6ZTogMjc4MzQKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjMxNzAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDExMDAwIHB0czogMC4wMTEwMDAgcG9zOiAgIDEwMTMgc2l6ZTogMjc4MzcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAxMTAwMCBwdHM6IDAuMDExMDAwIHBvczogICAxMDUwIHNpemU6IDI3ODM3CiByZXQ6LTEgICAgICAgICBzdDogMSBmbGFnczowICB0czogMi41NzcwMDAKIHJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgIHRzOiAxLjQ3MTAwMAotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSBkdHM6IDAuOTkzMDAwIHB0czogMC45OTMwMDAgcG9zOiAzMjAyNjggc2l6ZTogICAyMDkKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjk5MzAwMCBwdHM6IDAuOTkzMDAwIHBvczogMzIwMzE3IHNpemU6ICAgMjA5CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC4zNjUwMDIKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ5MTAwMCBwdHM6IDAuNDkxMDAwIHBvczogMTQ2OTgwIHNpemU6IDI3OTI1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40OTEwMDAgcHRzOiAwLjQ5MTAwMCBwb3M6IDE0NzAyMyBzaXplOiAyNzkyNQogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNzQwODMxCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMTEwMDAgcHRzOiAwLjAxMTAwMCBwb3M6ICAgMTAxMyBzaXplOiAyNzgzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDExMDAwIHB0czogMC4wMTEwMDAgcG9zOiAgIDEwNTAgc2l6ZTogMjc4MzcKIHJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyLjE1MzAwMAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuMDQ4MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NzEwMDAgcHRzOiAwLjk3MTAwMCBwb3M6IDI5MjQyNyBzaXplOiAyNzgzNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTcxMDAwIHB0czogMC45NzEwMDAgcG9zOiAyOTI0NzYgc2l6ZTogMjc4MzQKIHJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjAgIHRzOi0wLjA1ODAwMAotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICA3OTcgc2l6ZTogICAyMDgKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgODM0IHNpemU6ICAgMjA4CiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMi44MzYwMDAKLXJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjk5MzAwMCBwdHM6IDAuOTkzMDAwIHBvczogMzIwMjY4IHNpemU6ICAgMjA5CityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45OTMwMDAgcHRzOiAwLjk5MzAwMCBwb3M6IDMyMDMxNyBzaXplOiAgIDIwOQogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC42MjQxNzEKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ5MTAwMCBwdHM6IDAuNDkxMDAwIHBvczogMTQ2OTgwIHNpemU6IDI3OTI1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40OTEwMDAgcHRzOiAwLjQ5MTAwMCBwb3M6IDE0NzAyMyBzaXplOiAyNzkyNQogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgyMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMTEwMDAgcHRzOiAwLjAxMTAwMCBwb3M6ICAgMTAxMyBzaXplOiAyNzgzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDExMDAwIHB0czogMC4wMTEwMDAgcG9zOiAgIDEwNTAgc2l6ZTogMjc4MzcKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjQxMzAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTcxMDAwIHB0czogMC45NzEwMDAgcG9zOiAyOTI0Mjcgc2l6ZTogMjc4MzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk3MTAwMCBwdHM6IDAuOTcxMDAwIHBvczogMjkyNDc2IHNpemU6IDI3ODM0CiByZXQ6LTEgICAgICAgICBzdDogMSBmbGFnczowICB0czogMS4zMDcwMDAKIHJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgIHRzOiAwLjIwMTAwMAotcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICA3OTcgc2l6ZTogICAyMDgKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgODM0IHNpemU6ICAgMjA4CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMC45MDQ5OTQKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAxMTAwMCBwdHM6IDAuMDExMDAwIHBvczogICAxMDEzIHNpemU6IDI3ODM3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMTEwMDAgcHRzOiAwLjAxMTAwMCBwb3M6ICAgMTA1MCBzaXplOiAyNzgzNwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuOTg5MTczCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NzEwMDAgcHRzOiAwLjk3MTAwMCBwb3M6IDI5MjQyNyBzaXplOiAyNzgzNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTcxMDAwIHB0czogMC45NzEwMDAgcG9zOiAyOTI0NzYgc2l6ZTogMjc4MzQKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjg4MzAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTcxMDAwIHB0czogMC45NzEwMDAgcG9zOiAyOTI0Mjcgc2l6ZTogMjc4MzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk3MTAwMCBwdHM6IDAuOTcxMDAwIHBvczogMjkyNDc2IHNpemU6IDI3ODM0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC4yMjIwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAxMTAwMCBwdHM6IDAuMDExMDAwIHBvczogICAxMDEzIHNpemU6IDI3ODM3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMTEwMDAgcHRzOiAwLjAxMTAwMCBwb3M6ICAgMTA1MCBzaXplOiAyNzgzNwogcmV0Oi0xICAgICAgICAgc3Q6IDEgZmxhZ3M6MCAgdHM6IDIuNjcyMDAwCiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMS41NjYwMDAKLXJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjk5MzAwMCBwdHM6IDAuOTkzMDAwIHBvczogMzIwMjY4IHNpemU6ICAgMjA5CityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45OTMwMDAgcHRzOiAwLjk5MzAwMCBwb3M6IDMyMDMxNyBzaXplOiAgIDIwOQogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuNDYwMDA4Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40OTEwMDAgcHRzOiAwLjQ5MTAwMCBwb3M6IDE0Njk4MCBzaXplOiAyNzkyNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDkxMDAwIHB0czogMC40OTEwMDAgcG9zOiAxNDcwMjMgc2l6ZTogMjc5MjUKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjY0NTgyNQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDExMDAwIHB0czogMC4wMTEwMDAgcG9zOiAgIDEwMTMgc2l6ZTogMjc4MzcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAxMTAwMCBwdHM6IDAuMDExMDAwIHBvczogICAxMDUwIHNpemU6IDI3ODM3CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9sYXZmLW11bGF3IGIvdGVzdHMvcmVmL3NlZWsvbGF2Zi1tdWxhdwppbmRleCA0YjFmOGZiLi44ZDUxN2ZhIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvc2Vlay9sYXZmLW11bGF3CisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbXVsYXcKQEAgLTEsNTMgKzEsNTMgQEAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjg5NDE2NwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuODk0MTUwIHB0czogMS44OTQxNTAgcG9zOiAgNDE3NjYgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjg5NDE1MCBwdHM6IDEuODk0MTUwIHBvczogIDQxNzY2IHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC43ODgzNDUKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjc4ODM0NSBwdHM6IDAuNzg4MzQ1IHBvczogIDE3MzgzIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC43ODgzNDUgcHRzOiAwLjc4ODM0NSBwb3M6ICAxNzM4MyBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzE3NTA2Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjU3NjY2OAogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDcwODM5IHB0czogMS40NzA4MzkgcG9zOiAgMzI0MzIgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjQ3MDgzOSBwdHM6IDEuNDcwODM5IHBvczogIDMyNDMyIHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjQ5ODkKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM2NDk4OSBwdHM6IDAuMzY0OTg5IHBvczogICA4MDQ4IHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4zNjQ5ODkgcHRzOiAwLjM2NDk4OSBwb3M6ICAgODA0OCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzQwODE2Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjE1MzMzNgogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMDQ3NDgzIHB0czogMS4wNDc0ODMgcG9zOiAgMjMwOTcgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjA0NzQ4MyBwdHM6IDEuMDQ3NDgzIHBvczogIDIzMDk3IHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC4wNTgzMjIKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuODM1ODI4CiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS43MzAwMjMgcHRzOiAxLjczMDAyMyBwb3M6ICAzODE0NyBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNzMwMDIzIHB0czogMS43MzAwMjMgcG9zOiAgMzgxNDcgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjYyNDE3MQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNjI0MTcyIHB0czogMC42MjQxNzIgcG9zOiAgMTM3NjMgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjYyNDE3MiBwdHM6IDAuNjI0MTcyIHBvczogIDEzNzYzIHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODE2NzgKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDEyNTE3CiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4zMDY2NjcgcHRzOiAxLjMwNjY2NyBwb3M6ICAyODgxMiBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMzA2NjY3IHB0czogMS4zMDY2NjcgcG9zOiAgMjg4MTIgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjIwMDgzOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMjAwODE2IHB0czogMC4yMDA4MTYgcG9zOiAgIDQ0Mjggc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjIwMDgxNiBwdHM6IDAuMjAwODE2IHBvczogICA0NDI4IHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MDQ5ODkKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuOTg5MTYxCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45ODkxNjEgcHRzOiAxLjk4OTE2MSBwb3M6ICA0Mzg2MSBzaXplOiAgIDIzOQogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuODgzMzQwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44ODMzNTYgcHRzOiAwLjg4MzM1NiBwb3M6ICAxOTQ3OCBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuODgzMzU2IHB0czogMC44ODMzNTYgcG9zOiAgMTk0Nzggc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjIyMjQ5MwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAgODgyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzE2NTUKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS41NjU4NTAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjU2NTg1MCBwdHM6IDEuNTY1ODUwIHBvczogIDM0NTI3IHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS41NjU4NTAgcHRzOiAxLjU2NTg1MCBwb3M6ICAzNDUyNyBzaXplOiAgIDg4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuNDYwMDA4Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40NjAwMDAgcHRzOiAwLjQ2MDAwMCBwb3M6ICAxMDE0MyBzaXplOiAgMTAyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDYwMDAwIHB0czogMC40NjAwMDAgcG9zOiAgMTAxNDMgc2l6ZTogICA4ODIKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjY0NTgyNQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6ICAgODgyCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9sYXZmLW14Zl9kMTAgYi90ZXN0cy9yZWYvc2Vlay9sYXZmLW14Zl9kMTAKaW5kZXggMTdjY2EyOS4uNWE2ODJmMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3NlZWsvbGF2Zi1teGZfZDEwCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbXhmX2QxMApAQCAtOCw5ICs4LDkgQEAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjMyMDAwMAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNTAwMDAKIHJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjAgIHRzOiAyLjU3NjY2NwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOjUxMTc5NTIgc2l6ZToxNTAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczo1MTE3OTUyIHNpemU6MTUwMDAwCiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMS40NzA4MzMKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo1MTE3OTUyIHNpemU6MTUwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6NTExNzk1MiBzaXplOjE1MDAwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuMzY1MDAyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4zNjAwMDAgcHRzOiAwLjM2MDAwMCBwb3M6MTkyMzA3MiBzaXplOjE1MDAwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNzQwODMxCkBAIC0yMiw3ICsyMiw3IEBACiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czotMC4wNTgzMzMKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6MTUwMDAwCiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMi44MzU4MzMKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo1MTE3OTUyIHNpemU6MTUwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6NTExNzk1MiBzaXplOjE1MDAwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6NTExNzk1MiBzaXplOjE1MDAwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCkBAIC0zMiw3ICszMiw3IEBACiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MDAwMDAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczo1MTE3OTUyIHNpemU6MTUwMDAwCiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czogMS4zMDY2NjcKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo1MTE3OTUyIHNpemU6MTUwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6NTExNzk1MiBzaXplOjE1MDAwMAogcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSAgdHM6IDAuMjAwODMzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4yMDAwMDAgcHRzOiAwLjIwMDAwMCBwb3M6MTA3MTEwNCBzaXplOjE1MDAwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTAuOTA0OTk0CkBAIC00NCw5ICs0NCw5IEBACiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC4yNDAwMDAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6MTUwMDAwCiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czogMi42NzE2NjcKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo1MTE3OTUyIHNpemU6MTUwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6NTExNzk1MiBzaXplOjE1MDAwMAogcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSAgdHM6IDEuNTY1ODMzCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6NTExNzk1MiBzaXplOjE1MDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOjUxMTc5NTIgc2l6ZToxNTAwMDAKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDgwMDAwIHB0czogMC40ODAwMDAgcG9zOjI1NjIwNDggc2l6ZToxNTAwMDAKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjY0NTgyNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3NlZWsvbGF2Zi1teGZfZHYyNSBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbXhmX2R2MjUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiM2JiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbXhmX2R2MjUKQEAgLTAsMCArMSw1MyBAQAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjg5NDE2NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjgwMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuODAwMDAwIHB0czogMC44MDAwMDAgcG9zOjMwNjc5MDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjMyMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjAgIHRzOiAyLjU3NjY2NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgIHRzOiAxLjQ3MDgzMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjM2NTAwMgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMzYwMDAwIHB0czogMC4zNjAwMDAgcG9zOjEzODM5MzYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjc0MDgzMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyLjE2MDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjA0MDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjAgIHRzOi0wLjA1ODMzMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgIHRzOiAyLjgzNTgzMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjczMDAwNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjYyNDE3MQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNjQwMDAwIHB0czogMC42NDAwMDAgcG9zOjI0NTU1NTIgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjQ4MDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjQwMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjAgIHRzOiAxLjMwNjY2NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgIHRzOiAwLjIwMDgzMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiA3NzE1ODQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0wLjkwNDk5NAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjk4OTE3MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjg4MDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuODgwMDAwIHB0czogMC44ODAwMDAgcG9zOjMzNzQwODAgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjI0MDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjAgIHRzOiAyLjY3MTY2NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgIHRzOiAxLjU2NTgzMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOjM2ODAyNTYgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDgwMDAwIHB0czogMC40ODAwMDAgcG9zOjE4NDMyMDAgc2l6ZToxNDQwMDAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjY0NTgyNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDYxNDQgc2l6ZToxNDQwMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbXhmX2R2Y3BybzUwIGIvdGVzdHMvcmVmL3NlZWsvbGF2Zi1teGZfZHZjcHJvNTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkOWQzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtbXhmX2R2Y3BybzUwCkBAIC0wLDAgKzEsNTMgQEAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC44MDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjgwMDAwMCBwdHM6IDAuODAwMDAwIHBvczo1OTQ1MzQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC4zMjAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czogMi41NzY2NjcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMS40NzA4MzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC4zNjUwMDIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM2MDAwMCBwdHM6IDAuMzYwMDAwIHBvczoyNjc4Nzg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC43NDA4MzEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi4xNjAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS4wNDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czotMC4wNTgzMzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMi44MzU4MzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS43MzAwMDQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC42MjQxNzEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjY0MDAwMCBwdHM6IDAuNjQwMDAwIHBvczo0NzU3NTA0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czogMS4zMDY2NjcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMC4yMDA4MzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczoxNDkwOTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMC45MDQ5OTQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS45ODkxNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC44ODAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjg4MDAwMCBwdHM6IDAuODgwMDAwIHBvczo2NTM5MjY0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC4yNDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czogMi42NzE2NjcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMS41NjU4MzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczo3MTMzMTg0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczozNTY5NjY0IHNpemU6Mjg4MDAwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC42NDU4MjUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA2MTQ0IHNpemU6Mjg4MDAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9sYXZmLXBibXBpcGUgYi90ZXN0cy9yZWYvc2Vlay9sYXZmLXBibXBpcGUKaW5kZXggMjViYjY4Zi4uMjc4MmE5ZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3NlZWsvbGF2Zi1wYm1waXBlCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtcGJtcGlwZQpAQCAtMSwyNyArMSwzMSBAQAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgLTEgc2l6ZTozMTcwNzUKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3Ci1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC44MDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6IDEyNjgzCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6IDEyNjgzCityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKK3JldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjgwMDAwMAogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzIwMDAwCi1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi41NzY2NjgKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuMzYwMDAwCityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczowICB0czogMi41NzY2NjgKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQorcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuMzYwMDAwCiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NjAwMDAKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjE1MzMzNgotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCi1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC4wNDAwMDAKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjg0MDAwMAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0Ci1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC42MjQxNzEKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjQ4MDAwMAotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDAwMDAwCi1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS4zMDY2NzIKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjIwMDgzOQotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuOTIwMDAwCi1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi4wMDAwMDAKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjg4MzM0MAorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuMTUzMzM2CityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczoxICB0czogMS4wNDc1MDMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA0MDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogMTI2ODMKK3JldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjg0MDAwMAorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0CityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczoxICB0czogMC42MjQxNzEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjQ4MDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogMTI2ODMKK3JldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjQwMDAwMAorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjkyMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTogMTI2ODMKK3JldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjAwMDAwMAorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuODgzMzQwCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC4yMjI0OTMKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyLjY4MDAwMAotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuNTYwMDAwCi1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKK3JldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyLjY4MDAwMAorcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuNTYwMDAwCityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKIHJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjY0NTgyNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3NlZWsvbGF2Zi1wZ21waXBlIGIvdGVzdHMvcmVmL3NlZWsvbGF2Zi1wZ21waXBlCmluZGV4IDU3YjRlNGEuLjY2NDE1YzQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtcGdtcGlwZQorKysgYi90ZXN0cy9yZWYvc2Vlay9sYXZmLXBnbXBpcGUKQEAgLTEsMjcgKzEsMzEgQEAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIC0xIHNpemU6MjUzNDc3NQotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCi1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjgwMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZToxMDEzOTEKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZToxMDEzOTEKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjg5NDE2NworcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuODAwMDAwCiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC4zMjAwMDAKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjU3NjY2OAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuNDcwODM1Ci1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjAwMDAKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjU3NjY2OAorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuNDcwODM1CityZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczowICB0czogMC4zNjAwMDAKIHJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjc2MDAwMAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuMTUzMzM2Ci1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS4wNDc1MDMKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA0MDAwMAotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuODQwMDAwCi1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS43MzAwMDQKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjYyNDE3MQotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgwMDAwCi1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MDAwMDAKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjMwNjY3MgotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuMjAwODM5Ci1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MjAwMDAKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjAwMDAwMAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuODgzMzQwCityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczowICB0czogMi4xNTMzMzYKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuMDQwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOjEwMTM5MQorcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuODQwMDAwCityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczowICB0czogMS43MzAwMDQKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjYyNDE3MQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOjEwMTM5MQorcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDAwMDAwCityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczowICB0czogMS4zMDY2NzIKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjIwMDgzOQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuOTIwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOjEwMTM5MQorcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuMDAwMDAwCityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKIHJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjIyMjQ5MwotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDIuNjgwMDAwCi1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS41NjAwMDAKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAorcmV0Oi1FSU5WQUwgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDIuNjgwMDAwCityZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczoxICB0czogMS41NjAwMDAKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9sYXZmLXBwbXBpcGUgYi90ZXN0cy9yZWYvc2Vlay9sYXZmLXBwbXBpcGUKaW5kZXggNzA4NzQ5NC4uMjlhOTQyNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3NlZWsvbGF2Zi1wcG1waXBlCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtcHBtcGlwZQpAQCAtMSwyNyArMSwzMSBAQAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgLTEgc2l6ZTo3NjAzNTc1Ci1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjg5NDE2NwotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuODAwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOjMwNDE0MworcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOjMwNDE0MworcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3CityZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczowICB0czogMC44MDAwMDAKIHJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjMyMDAwMAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4Ci1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS40NzA4MzUKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjM2MDAwMAorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4CityZXQ6LUVJTlZBTCAgICBzdDotMSBmbGFnczoxICB0czogMS40NzA4MzUKK3JldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjM2MDAwMAogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzYwMDAwCi1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi4xNTMzMzYKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMwotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuMDQwMDAwCi1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi44NDAwMDAKLXJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjczMDAwNAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCi1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODAwMDAKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjQwMDAwMAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCi1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjkyMDAwMAotcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuMDAwMDAwCi1yZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjE1MzMzNgorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC4wNDAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6MzA0MTQzCityZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczoxICB0czogMi44NDAwMDAKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjczMDAwNAorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6MzA0MTQzCityZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczoxICB0czogMi40MDAwMDAKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjMwNjY3MgorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuMjAwODM5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MjAwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6MzA0MTQzCityZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczoxICB0czogMi4wMDAwMDAKK3JldDotRUlOVkFMICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjg4MzM0MAogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCi1yZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42ODAwMDAKLXJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2MDAwMAotcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuNDYwMDA4CityZXQ6LUVJTlZBTCAgICBzdDogMCBmbGFnczowICB0czogMi42ODAwMDAKK3JldDotRUlOVkFMICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2MDAwMAorcmV0Oi1FSU5WQUwgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuNDYwMDA4CiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC42NDU4MjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtcm0gYi90ZXN0cy9yZWYvc2Vlay9sYXZmLXJtCmluZGV4IDRiMTkxNzMuLjc1NmUxNTcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtcm0KKysrIGIvdGVzdHMvcmVmL3NlZWsvbGF2Zi1ybQpAQCAtMSw0ICsxLDQgQEAKLXJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMzk1IHNpemU6ICAgMjc4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDY5NiBzaXplOiAzMTA4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDY5NiBzaXplOiAzMTA4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3CkBAIC0yMCw3ICsyMCw3IEBACiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS4wNDgwMDAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogMzE0OTkyIHNpemU6IDMxMTQzCiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czotMC4wNTgwMDAKLXJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMzk1IHNpemU6ICAgMjc4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDY5NiBzaXplOiAzMTA4MgogcmV0OiAwICAgICAgICAgc3Q6IDEgZmxhZ3M6MSAgdHM6IDIuODM2MDAwCiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxIGR0czogMC45NzUwMDAgcHRzOiAwLjk3NTAwMCBwb3M6IDM0NjEzOCBzaXplOiAgIDI3OAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0CkBAIC0zNCw3ICszNCw3IEBACiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczowICB0czogMS4zMDcwMDAKIHJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjk3NTAwMCBwdHM6IDAuOTc1MDAwIHBvczogMzQ2MTM4IHNpemU6ICAgMjc4CiByZXQ6IDAgICAgICAgICBzdDogMSBmbGFnczoxICB0czogMC4yMDEwMDAKLXJldDogMCAgICAgICAgIHN0OiAxIGZsYWdzOjEgZHRzOiAwLjE3NDAwMCBwdHM6IDAuMTc0MDAwIHBvczogIDc4OTc3IHNpemU6ICAgMjc4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4yMDAwMDAgcHRzOiAwLjIwMDAwMCBwb3M6ICA3OTI3NCBzaXplOiAxMTQwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTAuOTA0OTk0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDY5NiBzaXplOiAzMTA4MgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuOTg5MTczCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9sYXZmLXZvYyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtdm9jCmluZGV4IDQ4M2M3ODIuLjAxNGMyNTEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYtdm9jCisrKyBiL3Rlc3RzL3JlZi9zZWVrL2xhdmYtdm9jCkBAIC00LDEzICs0LDEzIEBACiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC43ODgzMzAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjgwMDc3MyBwdHM6IDAuODAwNzczIHBvczogIDMzOTU2IHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44MDA3NzMgcHRzOiAwLjgwMDc3MyBwb3M6ICAzNDk4NCBzaXplOiAgMTAyNAogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzE3NDk0CiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi41NzY2NjgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjM2NTAxMgotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMzc2ODM0IHB0czogMC4zNzY4MzQgcG9zOiAgMTU0NTIgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM3NjgzNCBwdHM6IDAuMzc2ODM0IHBvczogIDE2NDgwIHNpemU6ICAxMDI0CiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NDA4MzQKIHJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjE1MzMzNgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCkBAIC0yMSwyNCArMjEsMjQgQEAKIHJldDotRU9GCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS43MzAwMDQKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjYyNDE3MQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNjEyMzU2IHB0czogMC42MTIzNTYgcG9zOiAgMjU3MzIgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjYxMjM1NiBwdHM6IDAuNjEyMzU2IHBvczogIDI2NzYwIHNpemU6ICAxMDI0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODE2NjkKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDMyIHNpemU6ICAxMDI0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MTI1MDcKIHJldDotRU9GCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS4zMDY2NzIKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjIwMDgzOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMTg4NDE3IHB0czogMC4xODg0MTcgcG9zOiAgIDcyMjggc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjE4ODQxNyBwdHM6IDAuMTg4NDE3IHBvczogICA4MjU2IHNpemU6ICAxMDI0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MDQ5ODYKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDMyIHNpemU6ICAxMDI0CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS45ODkxNjcKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjg5NDk4MSBwdHM6IDAuODk0OTgxIHBvczogIDM4MDY4IHNpemU6ICAxMDI0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44OTQ5ODEgcHRzOiAwLjg5NDk4MSBwb3M6ICAzOTA5NiBzaXplOiAgMTAyNAogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzE2NzMKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2NTg0OQogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDcxMDQzIHB0czogMC40NzEwNDMgcG9zOiAgMTk1NjQgc2l6ZTogIDEwMjQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ3MTA0MyBwdHM6IDAuNDcxMDQzIHBvczogIDIwNTkyIHNpemU6ICAxMDI0CiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC42NDU4MjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYteXV2NG1wZWcgYi90ZXN0cy9yZWYvc2Vlay9sYXZmLXl1djRtcGVnCmluZGV4IDYwYzMwMzYuLjZiZTliYTkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL2xhdmYteXV2NG1wZWcKKysrIGIvdGVzdHMvcmVmL3NlZWsvbGF2Zi15dXY0bXBlZwpAQCAtMSw1MyArMSw0NSBAQAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgNjQgc2l6ZToxNTIwNjQKLXJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDQwMDAwIHB0czogMC4wNDAwMDAgcG9zOiAxNTIxMzQgc2l6ZToxNTIwNjQKK3JldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3CiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuODAwMDAwCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44MDAwMDAgcHRzOiAwLjgwMDAwMCBwb3M6MzA0MTQ2NCBzaXplOjE1MjA2NAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzIwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44NDAwMDAgcHRzOiAwLjg0MDAwMCBwb3M6MzE5MzUzNCBzaXplOjE1MjA2NAorcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzIwMDAwCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi41NzY2NjgKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS40NzA4MzUKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjAwMDAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM2MDAwMCBwdHM6IDAuMzYwMDAwIHBvczoxMzY4Njk0IHNpemU6MTUyMDY0Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NjAwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQwMDAwMCBwdHM6IDAuNDAwMDAwIHBvczoxNTIwNzY0IHNpemU6MTUyMDY0CityZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NjAwMDAKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjE1MzMzNgogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMwogcmV0Oi1FT0YKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA0MDAwMAotcmV0Oi1FT0YKK3JldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA0MDAwMAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuODQwMDAwCiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0CiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42NDAwMDAgcHRzOiAwLjY0MDAwMCBwb3M6MjQzMzE4NCBzaXplOjE1MjA2NAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42ODAwMDAgcHRzOiAwLjY4MDAwMCBwb3M6MjU4NTI1NCBzaXplOjE1MjA2NAorcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgwMDAwCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MDAwMDAKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS4zMDY2NzIKIHJldDotRU9GCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjIwMDAwMCBwdHM6IDAuMjAwMDAwIHBvczogNzYwNDE0IHNpemU6MTUyMDY0Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MjAwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjI0MDAwMCBwdHM6IDAuMjQwMDAwIHBvczogOTEyNDg0IHNpemU6MTUyMDY0CityZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MjAwMDAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjAwMDAwMAogcmV0Oi1FT0YKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjg4MzM0MAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuODgwMDAwIHB0czogMC44ODAwMDAgcG9zOjMzNDU2MDQgc2l6ZToxNTIwNjQKLXJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjIyMjQ5MwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTIwMDAwIHB0czogMC45MjAwMDAgcG9zOjM0OTc2NzQgc2l6ZToxNTIwNjQKK3JldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjIyMjQ5MwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDIuNjgwMDAwCiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuNTYwMDAwCiByZXQ6LUVPRgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDAuNDYwMDA4CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40ODAwMDAgcHRzOiAwLjQ4MDAwMCBwb3M6MTgyNDkwNCBzaXplOjE1MjA2NAotcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC41MjAwMDAgcHRzOiAwLjUyMDAwMCBwb3M6MTk3Njk3NCBzaXplOjE1MjA2NAorcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay9ta3YtY29kZWMtZGVsYXkgYi90ZXN0cy9yZWYvc2Vlay9ta3YtY29kZWMtZGVsYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1NjFlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi9zZWVrL21rdi1jb2RlYy1kZWxheQpAQCAtMCwwICsxLDQ4IEBACityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMDcwMDAgcHRzOi0wLjAwNzAwMCBwb3M6ICAgIDc0OCBzaXplOiAgIDMyMAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMDcwMDAgcHRzOi0wLjAwNzAwMCBwb3M6ICAgIDc0OCBzaXplOiAgIDMyMAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4wMTQwMDAgcHRzOiAxLjAxNDAwMCBwb3M6ICAgOTMwNiBzaXplOiAgIDI2OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuNzg4MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC43OTQwMDAgcHRzOiAwLjc5NDAwMCBwb3M6ICAgNzM1OCBzaXplOiAgIDE1NAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzE3MDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMDcwMDAgcHRzOi0wLjAwNzAwMCBwb3M6ICAgIDc0OCBzaXplOiAgIDMyMAorcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS40NzA4MzUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjAxNDAwMCBwdHM6IDEuMDE0MDAwIHBvczogICA5MzA2IHNpemU6ICAgMjY4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjUwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjM3NDAwMCBwdHM6IDAuMzc0MDAwIHBvczogICAzOTYzIHNpemU6ICAgMTUwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NDEwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0wLjAwNzAwMCBwdHM6LTAuMDA3MDAwIHBvczogICAgNzQ4IHNpemU6ICAgMzIwCityZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi4xNTMzMzYKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMDE0MDAwIHB0czogMS4wMTQwMDAgcG9zOiAgIDkzMDYgc2l6ZTogICAyNjgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA1ODAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTAuMDA3MDAwIHB0czotMC4wMDcwMDAgcG9zOiAgICA3NDggc2l6ZTogICAzMjAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjgzNjAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMDE0MDAwIHB0czogMS4wMTQwMDAgcG9zOiAgIDkzMDYgc2l6ZTogICAyNjgKK3JldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjczMDAwNAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42MTQwMDAgcHRzOiAwLjYxNDAwMCBwb3M6ICAgNTkwMyBzaXplOiAgIDE1OQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgyMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMC4wMDcwMDAgcHRzOi0wLjAwNzAwMCBwb3M6ICAgIDc0OCBzaXplOiAgIDMyMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDEzMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4wMTQwMDAgcHRzOiAxLjAxNDAwMCBwb3M6ICAgOTMwNiBzaXplOiAgIDI2OAorcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjE5NDAwMCBwdHM6IDAuMTk0MDAwIHBvczogICAyNTEyIHNpemU6ICAgMTU5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MDUwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0wLjAwNzAwMCBwdHM6LTAuMDA3MDAwIHBvczogICAgNzQ4IHNpemU6ICAgMzIwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS45ODkwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjAxNDAwMCBwdHM6IDEuMDE0MDAwIHBvczogICA5MzA2IHNpemU6ICAgMjY4CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjg5NDAwMCBwdHM6IDAuODk0MDAwIHBvczogICA4MTU0IHNpemU6ICAgMTU1CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC4yMjI0OTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0wLjAwNzAwMCBwdHM6LTAuMDA3MDAwIHBvczogICAgNzQ4IHNpemU6ICAgMzIwCityZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzIwMDAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2NjAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMDE0MDAwIHB0czogMS4wMTQwMDAgcG9zOiAgIDkzMDYgc2l6ZTogICAyNjgKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDc0MDAwIHB0czogMC40NzQwMDAgcG9zOiAgIDQ3Njggc2l6ZTogICAxNTMKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjY0NTgyNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTAuMDA3MDAwIHB0czotMC4wMDcwMDAgcG9zOiAgICA3NDggc2l6ZTogICAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi9zZWVrL3Rlc3QtaWliYmliYi1tcDQgYi90ZXN0cy9yZWYvc2Vlay90ZXN0LWlpYmJpYmItbXA0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODk2MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvc2Vlay90ZXN0LWlpYmJpYmItbXA0CkBAIC0wLDAgKzEsMTIyIEBACityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMi4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICA0OCBzaXplOiAgNzgwNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTEuMDAwMDAwIHB0czogMy4wMDAwMDAgcG9zOiAgIDc4NTIgc2l6ZTogIDc4MDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAwMDAwMCBwdHM6IDIuMDAwMDAwIHBvczogIDE1NjYwIHNpemU6ICAxMzAxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMS4wMDAwMDAgcHRzOiAxLjAwMDAwMCBwb3M6ICAxNjk2MSBzaXplOiAgMTExNAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTEuMDAwMDAwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMi4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICA0OCBzaXplOiAgNzgwNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTEuMDAwMDAwIHB0czogMy4wMDAwMDAgcG9zOiAgIDc4NTIgc2l6ZTogIDc4MDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAwMDAwMCBwdHM6IDIuMDAwMDAwIHBvczogIDE1NjYwIHNpemU6ICAxMzAxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMS4wMDAwMDAgcHRzOiAxLjAwMDAwMCBwb3M6ICAxNjk2MSBzaXplOiAgMTExNAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDQuODk0MTY3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDMuMDAwMDAwIHB0czogNS4wMDAwMDAgcG9zOiAgMjU4MDUgc2l6ZTogIDEyNDcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA0LjAwMDAwMCBwdHM6IDQuMDAwMDAwIHBvczogIDI3MDUyIHNpemU6ICAxMTEwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDEwLjc4ODMzMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDMuNjgyNDk1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMS4wMDAwMDAgcHRzOiAzLjAwMDAwMCBwb3M6ICAgNzg1MiBzaXplOiAgNzgwOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMi4wMDAwMDAgcG9zOiAgMTU2NjAgc2l6ZTogIDEzMDEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxLjAwMDAwMCBwdHM6IDEuMDAwMDAwIHBvczogIDE2OTYxIHNpemU6ICAxMTE0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDkuNTc2NjY4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogOC4wMDAwMDAgcHRzOiAxMi4wMDAwMDAgcG9zOiAgMzgxNjAgc2l6ZTogIDY3MzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA5LjAwMDAwMCBwdHM6IDExLjAwMDAwMCBwb3M6ICA0NDg5NCBzaXplOiAgMTQzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEwLjAwMDAwMCBwdHM6IDEwLjAwMDAwMCBwb3M6ICA0NjMzMSBzaXplOiAgMTE4NgorcmV0Oi1FT0YKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAyLjQ3MDgzNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTEuMDAwMDAwIHB0czogMy4wMDAwMDAgcG9zOiAgIDc4NTIgc2l6ZTogIDc4MDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAwMDAwMCBwdHM6IDIuMDAwMDAwIHBvczogIDE1NjYwIHNpemU6ICAxMzAxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMS4wMDAwMDAgcHRzOiAxLjAwMDAwMCBwb3M6ICAxNjk2MSBzaXplOiAgMTExNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuMDAwMDAwIHB0czogNi4wMDAwMDAgcG9zOiAgMTgwNzUgc2l6ZTogIDc3MzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiA4LjM2NDk5MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDguMDAwMDAwIHB0czogMTIuMDAwMDAwIHBvczogIDM4MTYwIHNpemU6ICA2NzM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogOS4wMDAwMDAgcHRzOiAxMS4wMDAwMDAgcG9zOiAgNDQ4OTQgc2l6ZTogIDE0MzcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMC4wMDAwMDAgcHRzOiAxMC4wMDAwMDAgcG9zOiAgNDYzMzEgc2l6ZTogIDExODYKK3JldDotRU9GCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS4yNTkxNTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0xLjAwMDAwMCBwdHM6IDMuMDAwMDAwIHBvczogICA3ODUyIHNpemU6ICA3ODA4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wMDAwMDAgcHRzOiAyLjAwMDAwMCBwb3M6ICAxNTY2MCBzaXplOiAgMTMwMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEuMDAwMDAwIHB0czogMS4wMDAwMDAgcG9zOiAgMTY5NjEgc2l6ZTogIDExMTQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogIDE4MDc1IHNpemU6ICA3NzMwCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogNy4xNTMzMzYKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA4LjAwMDAwMCBwdHM6IDEyLjAwMDAwMCBwb3M6ICAzODE2MCBzaXplOiAgNjczNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDkuMDAwMDAwIHB0czogMTEuMDAwMDAwIHBvczogIDQ0ODk0IHNpemU6ICAxNDM3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMDAwMDAwIHB0czogMTAuMDAwMDAwIHBvczogIDQ2MzMxIHNpemU6ICAxMTg2CityZXQ6LUVPRgorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuMDQ3NTAzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMi4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICA0OCBzaXplOiAgNzgwNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTEuMDAwMDAwIHB0czogMy4wMDAwMDAgcG9zOiAgIDc4NTIgc2l6ZTogIDc4MDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAwMDAwMCBwdHM6IDIuMDAwMDAwIHBvczogIDE1NjYwIHNpemU6ICAxMzAxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMS4wMDAwMDAgcHRzOiAxLjAwMDAwMCBwb3M6ICAxNjk2MSBzaXplOiAgMTExNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDUuOTQxNjUwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDYuMDAwMDAwIHB0czogOC4wMDAwMDAgcG9zOiAgMzU3NTcgc2l6ZTogIDEyNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA3LjAwMDAwMCBwdHM6IDcuMDAwMDAwIHBvczogIDM3MDMwIHNpemU6ICAxMTMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogOC4wMDAwMDAgcHRzOiAxMi4wMDAwMDAgcG9zOiAgMzgxNjAgc2l6ZTogIDY3MzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxMS44MzU4MTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA4LjAwMDAwMCBwdHM6IDEyLjAwMDAwMCBwb3M6ICAzODE2MCBzaXplOiAgNjczNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDkuMDAwMDAwIHB0czogMTEuMDAwMDAwIHBvczogIDQ0ODk0IHNpemU6ICAxNDM3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMDAwMDAwIHB0czogMTAuMDAwMDAwIHBvczogIDQ2MzMxIHNpemU6ICAxMTg2CityZXQ6LUVPRgorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDQuNzMwMDA0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDYuMDAwMDAwIHB0czogOC4wMDAwMDAgcG9zOiAgMzU3NTcgc2l6ZTogIDEyNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA3LjAwMDAwMCBwdHM6IDcuMDAwMDAwIHBvczogIDM3MDMwIHNpemU6ICAxMTMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogOC4wMDAwMDAgcHRzOiAxMi4wMDAwMDAgcG9zOiAgMzgxNjAgc2l6ZTogIDY3MzQKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxMC42MjQxNzEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA4LjAwMDAwMCBwdHM6IDEyLjAwMDAwMCBwb3M6ICAzODE2MCBzaXplOiAgNjczNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDkuMDAwMDAwIHB0czogMTEuMDAwMDAwIHBvczogIDQ0ODk0IHNpemU6ICAxNDM3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMDAwMDAwIHB0czogMTAuMDAwMDAwIHBvczogIDQ2MzMxIHNpemU6ICAxMTg2CityZXQ6LUVPRgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDMuNTE4MzExCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDMuMDAwMDAwIHB0czogNS4wMDAwMDAgcG9zOiAgMjU4MDUgc2l6ZTogIDEyNDcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA0LjAwMDAwMCBwdHM6IDQuMDAwMDAwIHBvczogIDI3MDUyIHNpemU6ICAxMTEwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDkuNDEyNDc2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDYuMDAwMDAwIHB0czogOC4wMDAwMDAgcG9zOiAgMzU3NTcgc2l6ZTogIDEyNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA3LjAwMDAwMCBwdHM6IDcuMDAwMDAwIHBvczogIDM3MDMwIHNpemU6ICAxMTMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogOC4wMDAwMDAgcHRzOiAxMi4wMDAwMDAgcG9zOiAgMzgxNjAgc2l6ZTogIDY3MzQKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjMwNjY3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuMDAwMDAwIHB0czogNi4wMDAwMDAgcG9zOiAgMTgwNzUgc2l6ZTogIDc3MzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAzLjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogIDI1ODA1IHNpemU6ICAxMjQ3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNC4wMDAwMDAgcHRzOiA0LjAwMDAwMCBwb3M6ICAyNzA1MiBzaXplOiAgMTExMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDUuMDAwMDAwIHB0czogOS4wMDAwMDAgcG9zOiAgMjgxNjIgc2l6ZTogIDc1OTUKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiA4LjIwMDgzOQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDUuMDAwMDAwIHB0czogOS4wMDAwMDAgcG9zOiAgMjgxNjIgc2l6ZTogIDc1OTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA2LjAwMDAwMCBwdHM6IDguMDAwMDAwIHBvczogIDM1NzU3IHNpemU6ICAxMjczCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNy4wMDAwMDAgcHRzOiA3LjAwMDAwMCBwb3M6ICAzNzAzMCBzaXplOiAgMTEzMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDguMDAwMDAwIHB0czogMTIuMDAwMDAwIHBvczogIDM4MTYwIHNpemU6ICA2NzM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMS4wOTUwMzIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogIDE4MDc1IHNpemU6ICA3NzMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMy4wMDAwMDAgcHRzOiA1LjAwMDAwMCBwb3M6ICAyNTgwNSBzaXplOiAgMTI0NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDQuMDAwMDAwIHB0czogNC4wMDAwMDAgcG9zOiAgMjcwNTIgc2l6ZTogIDExMTAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDkuMDAwMDAwIHBvczogIDI4MTYyIHNpemU6ICA3NTk1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogNi45ODkxOTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogIDE4MDc1IHNpemU6ICA3NzMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMy4wMDAwMDAgcHRzOiA1LjAwMDAwMCBwb3M6ICAyNTgwNSBzaXplOiAgMTI0NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDQuMDAwMDAwIHB0czogNC4wMDAwMDAgcG9zOiAgMjcwNTIgc2l6ZTogIDExMTAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDkuMDAwMDAwIHBvczogIDI4MTYyIHNpemU6ICA3NTk1CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMC4xMTY2NjAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0yLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgIDQ4IHNpemU6ICA3ODA0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMS4wMDAwMDAgcHRzOiAzLjAwMDAwMCBwb3M6ICAgNzg1MiBzaXplOiAgNzgwOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMi4wMDAwMDAgcG9zOiAgMTU2NjAgc2l6ZTogIDEzMDEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxLjAwMDAwMCBwdHM6IDEuMDAwMDAwIHBvczogIDE2OTYxIHNpemU6ICAxMTE0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogNS43Nzc1MDcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogIDE4MDc1IHNpemU6ICA3NzMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMy4wMDAwMDAgcHRzOiA1LjAwMDAwMCBwb3M6ICAyNTgwNSBzaXplOiAgMTI0NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDQuMDAwMDAwIHB0czogNC4wMDAwMDAgcG9zOiAgMjcwNTIgc2l6ZTogIDExMTAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDkuMDAwMDAwIHBvczogIDI4MTYyIHNpemU6ICA3NTk1CityZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMTEuNjcxNjkyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogNC41NjU4NTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogIDE4MDc1IHNpemU6ICA3NzMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMy4wMDAwMDAgcHRzOiA1LjAwMDAwMCBwb3M6ICAyNTgwNSBzaXplOiAgMTI0NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDQuMDAwMDAwIHB0czogNC4wMDAwMDAgcG9zOiAgMjcwNTIgc2l6ZTogIDExMTAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDkuMDAwMDAwIHBvczogIDI4MTYyIHNpemU6ICA3NTk1CityZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMTAuNDYwMDA4CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMy4zNTQxNzUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0xLjAwMDAwMCBwdHM6IDMuMDAwMDAwIHBvczogICA3ODUyIHNpemU6ICA3ODA4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wMDAwMDAgcHRzOiAyLjAwMDAwMCBwb3M6ICAxNTY2MCBzaXplOiAgMTMwMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEuMDAwMDAwIHB0czogMS4wMDAwMDAgcG9zOiAgMTY5NjEgc2l6ZTogIDExMTQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogIDE4MDc1IHNpemU6ICA3NzMwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay90ZXN0LWlpYmJpYmItbmVnLWN0dHMtbXA0IGIvdGVzdHMvcmVmL3NlZWsvdGVzdC1paWJiaWJiLW5lZy1jdHRzLW1wNApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTg5NjAwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3NlZWsvdGVzdC1paWJiaWJiLW5lZy1jdHRzLW1wNApAQCAtMCwwICsxLDEyMiBAQAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTIuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgNDggc2l6ZTogIDc4MDQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0xLjAwMDAwMCBwdHM6IDMuMDAwMDAwIHBvczogICA3ODUyIHNpemU6ICA3ODA4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wMDAwMDAgcHRzOiAyLjAwMDAwMCBwb3M6ICAxNTY2MCBzaXplOiAgMTMwMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEuMDAwMDAwIHB0czogMS4wMDAwMDAgcG9zOiAgMTY5NjEgc2l6ZTogIDExMTQKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTIuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgNDggc2l6ZTogIDc4MDQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0xLjAwMDAwMCBwdHM6IDMuMDAwMDAwIHBvczogICA3ODUyIHNpemU6ICA3ODA4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wMDAwMDAgcHRzOiAyLjAwMDAwMCBwb3M6ICAxNTY2MCBzaXplOiAgMTMwMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEuMDAwMDAwIHB0czogMS4wMDAwMDAgcG9zOiAgMTY5NjEgc2l6ZTogIDExMTQKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiA0Ljg5NDE2NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuMDAwMDAwIHB0czogNi4wMDAwMDAgcG9zOiAgMTgwNzUgc2l6ZTogIDc3MzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAzLjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogIDI1ODA1IHNpemU6ICAxMjQ3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNC4wMDAwMDAgcHRzOiA0LjAwMDAwMCBwb3M6ICAyNzA1MiBzaXplOiAgMTExMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDUuMDAwMDAwIHB0czogOS4wMDAwMDAgcG9zOiAgMjgxNjIgc2l6ZTogIDc1OTUKK3JldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAxMC43ODgzMzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAzLjY4MjQ5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTEuMDAwMDAwIHB0czogMy4wMDAwMDAgcG9zOiAgIDc4NTIgc2l6ZTogIDc4MDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAwMDAwMCBwdHM6IDIuMDAwMDAwIHBvczogIDE1NjYwIHNpemU6ICAxMzAxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMS4wMDAwMDAgcHRzOiAxLjAwMDAwMCBwb3M6ICAxNjk2MSBzaXplOiAgMTExNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuMDAwMDAwIHB0czogNi4wMDAwMDAgcG9zOiAgMTgwNzUgc2l6ZTogIDc3MzAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiA5LjU3NjY2OAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDguMDAwMDAwIHB0czogMTIuMDAwMDAwIHBvczogIDM4MTYwIHNpemU6ICA2NzM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogOS4wMDAwMDAgcHRzOiAxMS4wMDAwMDAgcG9zOiAgNDQ4OTQgc2l6ZTogIDE0MzcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxMC4wMDAwMDAgcHRzOiAxMC4wMDAwMDAgcG9zOiAgNDYzMzEgc2l6ZTogIDExODYKK3JldDotRU9GCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMi40NzA4MzUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0xLjAwMDAwMCBwdHM6IDMuMDAwMDAwIHBvczogICA3ODUyIHNpemU6ICA3ODA4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wMDAwMDAgcHRzOiAyLjAwMDAwMCBwb3M6ICAxNTY2MCBzaXplOiAgMTMwMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEuMDAwMDAwIHB0czogMS4wMDAwMDAgcG9zOiAgMTY5NjEgc2l6ZTogIDExMTQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogIDE4MDc1IHNpemU6ICA3NzMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogOC4zNjQ5OTAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA4LjAwMDAwMCBwdHM6IDEyLjAwMDAwMCBwb3M6ICAzODE2MCBzaXplOiAgNjczNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDkuMDAwMDAwIHB0czogMTEuMDAwMDAwIHBvczogIDQ0ODk0IHNpemU6ICAxNDM3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMTAuMDAwMDAwIHB0czogMTAuMDAwMDAwIHBvczogIDQ2MzMxIHNpemU6ICAxMTg2CityZXQ6LUVPRgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuMjU5MTU1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMS4wMDAwMDAgcHRzOiAzLjAwMDAwMCBwb3M6ICAgNzg1MiBzaXplOiAgNzgwOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMi4wMDAwMDAgcG9zOiAgMTU2NjAgc2l6ZTogIDEzMDEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxLjAwMDAwMCBwdHM6IDEuMDAwMDAwIHBvczogIDE2OTYxIHNpemU6ICAxMTE0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDcuMTUzMzM2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogOC4wMDAwMDAgcHRzOiAxMi4wMDAwMDAgcG9zOiAgMzgxNjAgc2l6ZTogIDY3MzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA5LjAwMDAwMCBwdHM6IDExLjAwMDAwMCBwb3M6ICA0NDg5NCBzaXplOiAgMTQzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEwLjAwMDAwMCBwdHM6IDEwLjAwMDAwMCBwb3M6ICA0NjMzMSBzaXplOiAgMTE4NgorcmV0Oi1FT0YKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjA0NzUwMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTIuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgNDggc2l6ZTogIDc4MDQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOi0xLjAwMDAwMCBwdHM6IDMuMDAwMDAwIHBvczogICA3ODUyIHNpemU6ICA3ODA4CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMC4wMDAwMDAgcHRzOiAyLjAwMDAwMCBwb3M6ICAxNTY2MCBzaXplOiAgMTMwMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEuMDAwMDAwIHB0czogMS4wMDAwMDAgcG9zOiAgMTY5NjEgc2l6ZTogIDExMTQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiA1Ljk0MTY1MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDUuMDAwMDAwIHB0czogOS4wMDAwMDAgcG9zOiAgMjgxNjIgc2l6ZTogIDc1OTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA2LjAwMDAwMCBwdHM6IDguMDAwMDAwIHBvczogIDM1NzU3IHNpemU6ICAxMjczCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNy4wMDAwMDAgcHRzOiA3LjAwMDAwMCBwb3M6ICAzNzAzMCBzaXplOiAgMTEzMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDguMDAwMDAwIHB0czogMTIuMDAwMDAwIHBvczogIDM4MTYwIHNpemU6ICA2NzM0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMTEuODM1ODE1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogOC4wMDAwMDAgcHRzOiAxMi4wMDAwMDAgcG9zOiAgMzgxNjAgc2l6ZTogIDY3MzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA5LjAwMDAwMCBwdHM6IDExLjAwMDAwMCBwb3M6ICA0NDg5NCBzaXplOiAgMTQzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEwLjAwMDAwMCBwdHM6IDEwLjAwMDAwMCBwb3M6ICA0NjMzMSBzaXplOiAgMTE4NgorcmV0Oi1FT0YKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiA0LjczMDAwNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDUuMDAwMDAwIHB0czogOS4wMDAwMDAgcG9zOiAgMjgxNjIgc2l6ZTogIDc1OTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA2LjAwMDAwMCBwdHM6IDguMDAwMDAwIHBvczogIDM1NzU3IHNpemU6ICAxMjczCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNy4wMDAwMDAgcHRzOiA3LjAwMDAwMCBwb3M6ICAzNzAzMCBzaXplOiAgMTEzMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDguMDAwMDAwIHB0czogMTIuMDAwMDAwIHBvczogIDM4MTYwIHNpemU6ICA2NzM0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMTAuNjI0MTcxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogOC4wMDAwMDAgcHRzOiAxMi4wMDAwMDAgcG9zOiAgMzgxNjAgc2l6ZTogIDY3MzQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA5LjAwMDAwMCBwdHM6IDExLjAwMDAwMCBwb3M6ICA0NDg5NCBzaXplOiAgMTQzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDEwLjAwMDAwMCBwdHM6IDEwLjAwMDAwMCBwb3M6ICA0NjMzMSBzaXplOiAgMTE4NgorcmV0Oi1FT0YKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAzLjUxODMxMQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDIuMDAwMDAwIHB0czogNi4wMDAwMDAgcG9zOiAgMTgwNzUgc2l6ZTogIDc3MzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAzLjAwMDAwMCBwdHM6IDUuMDAwMDAwIHBvczogIDI1ODA1IHNpemU6ICAxMjQ3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNC4wMDAwMDAgcHRzOiA0LjAwMDAwMCBwb3M6ICAyNzA1MiBzaXplOiAgMTExMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDUuMDAwMDAwIHB0czogOS4wMDAwMDAgcG9zOiAgMjgxNjIgc2l6ZTogIDc1OTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiA5LjQxMjQ3NgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDUuMDAwMDAwIHB0czogOS4wMDAwMDAgcG9zOiAgMjgxNjIgc2l6ZTogIDc1OTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA2LjAwMDAwMCBwdHM6IDguMDAwMDAwIHBvczogIDM1NzU3IHNpemU6ICAxMjczCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNy4wMDAwMDAgcHRzOiA3LjAwMDAwMCBwb3M6ICAzNzAzMCBzaXplOiAgMTEzMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDguMDAwMDAwIHB0czogMTIuMDAwMDAwIHBvczogIDM4MTYwIHNpemU6ICA2NzM0CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi4zMDY2NzIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAyLjAwMDAwMCBwdHM6IDYuMDAwMDAwIHBvczogIDE4MDc1IHNpemU6ICA3NzMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMy4wMDAwMDAgcHRzOiA1LjAwMDAwMCBwb3M6ICAyNTgwNSBzaXplOiAgMTI0NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDQuMDAwMDAwIHB0czogNC4wMDAwMDAgcG9zOiAgMjcwNTIgc2l6ZTogIDExMTAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDkuMDAwMDAwIHBvczogIDI4MTYyIHNpemU6ICA3NTk1CityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogOC4yMDA4MzkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA1LjAwMDAwMCBwdHM6IDkuMDAwMDAwIHBvczogIDI4MTYyIHNpemU6ICA3NTk1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogNi4wMDAwMDAgcHRzOiA4LjAwMDAwMCBwb3M6ICAzNTc1NyBzaXplOiAgMTI3MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDcuMDAwMDAwIHB0czogNy4wMDAwMDAgcG9zOiAgMzcwMzAgc2l6ZTogIDExMzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiA4LjAwMDAwMCBwdHM6IDEyLjAwMDAwMCBwb3M6ICAzODE2MCBzaXplOiAgNjczNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDEuMDk1MDMyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDMuMDAwMDAwIHB0czogNS4wMDAwMDAgcG9zOiAgMjU4MDUgc2l6ZTogIDEyNDcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA0LjAwMDAwMCBwdHM6IDQuMDAwMDAwIHBvczogIDI3MDUyIHNpemU6ICAxMTEwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDYuOTg5MTk3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDMuMDAwMDAwIHB0czogNS4wMDAwMDAgcG9zOiAgMjU4MDUgc2l6ZTogIDEyNDcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA0LjAwMDAwMCBwdHM6IDQuMDAwMDAwIHBvczogIDI3MDUyIHNpemU6ICAxMTEwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6LTAuMTE2NjYwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMi4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICA0OCBzaXplOiAgNzgwNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6LTEuMDAwMDAwIHB0czogMy4wMDAwMDAgcG9zOiAgIDc4NTIgc2l6ZTogIDc4MDgKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAwLjAwMDAwMCBwdHM6IDIuMDAwMDAwIHBvczogIDE1NjYwIHNpemU6ICAxMzAxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowIGR0czogMS4wMDAwMDAgcHRzOiAxLjAwMDAwMCBwb3M6ICAxNjk2MSBzaXplOiAgMTExNAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDUuNzc3NTA3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDMuMDAwMDAwIHB0czogNS4wMDAwMDAgcG9zOiAgMjU4MDUgc2l6ZTogIDEyNDcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA0LjAwMDAwMCBwdHM6IDQuMDAwMDAwIHBvczogIDI3MDUyIHNpemU6ICAxMTEwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDExLjY3MTY5MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDQuNTY1ODU3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDMuMDAwMDAwIHB0czogNS4wMDAwMDAgcG9zOiAgMjU4MDUgc2l6ZTogIDEyNDcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiA0LjAwMDAwMCBwdHM6IDQuMDAwMDAwIHBvczogIDI3MDUyIHNpemU6ICAxMTEwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogNS4wMDAwMDAgcHRzOiA5LjAwMDAwMCBwb3M6ICAyODE2MiBzaXplOiAgNzU5NQorcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEwLjQ2MDAwOAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDMuMzU0MTc1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czotMS4wMDAwMDAgcHRzOiAzLjAwMDAwMCBwb3M6ICAgNzg1MiBzaXplOiAgNzgwOAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCBkdHM6IDAuMDAwMDAwIHB0czogMi4wMDAwMDAgcG9zOiAgMTU2NjAgc2l6ZTogIDEzMDEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgZHRzOiAxLjAwMDAwMCBwdHM6IDEuMDAwMDAwIHBvczogIDE2OTYxIHNpemU6ICAxMTE0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMi4wMDAwMDAgcHRzOiA2LjAwMDAwMCBwb3M6ICAxODA3NSBzaXplOiAgNzczMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3NlZWsvdnN5bnRoX2xlbmEtZG54aGQtNGstaHItbGIgYi90ZXN0cy9yZWYvc2Vlay92c3ludGhfbGVuYS1kbnhoZC00ay1oci1sYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTViOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3NlZWsvdnN5bnRoX2xlbmEtZG54aGQtNGstaHItbGIKQEAgLTAsMCArMSw0MCBAQAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTo3OTg3MjAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTo3OTg3MjAKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjg5NDE2NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMTYwMDAwIHB0czogMC4xNjAwMDAgcG9zOjMxOTQ4ODAgc2l6ZTo3OTg3MjAKK3JldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjc4ODMzNAorcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzE3NDk5CityZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi41NzY2NjgKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMTYwMDAwIHB0czogMC4xNjAwMDAgcG9zOjMxOTQ4ODAgc2l6ZTo3OTg3MjAKK3JldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjM2NTAwMgorcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzQwODMxCityZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi4xNTMzMzYKK3JldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMTYwMDAwIHB0czogMC4xNjAwMDAgcG9zOjMxOTQ4ODAgc2l6ZTo3OTg3MjAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA1ODMzMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAgIDAgc2l6ZTo3OTg3MjAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjgzNTgzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMTYwMDAwIHB0czogMC4xNjAwMDAgcG9zOjMxOTQ4ODAgc2l6ZTo3OTg3MjAKK3JldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjczMDAwNAorcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4xNjAwMDAgcHRzOiAwLjE2MDAwMCBwb3M6MzE5NDg4MCBzaXplOjc5ODcyMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuNDgxNjYyCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgICAgMCBzaXplOjc5ODcyMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDEyNTA1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4xNjAwMDAgcHRzOiAwLjE2MDAwMCBwb3M6MzE5NDg4MCBzaXplOjc5ODcyMAorcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCityZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjE2MDAwMCBwdHM6IDAuMTYwMDAwIHBvczozMTk0ODgwIHNpemU6Nzk4NzIwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MDQ5OTQKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgICAwIHNpemU6Nzk4NzIwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS45ODkxNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjE2MDAwMCBwdHM6IDAuMTYwMDAwIHBvczozMTk0ODgwIHNpemU6Nzk4NzIwCityZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKK3JldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjIyMjQ5MworcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDIuNjcxNjc0CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS41NjU4NDEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjE2MDAwMCBwdHM6IDAuMTYwMDAwIHBvczozMTk0ODgwIHNpemU6Nzk4NzIwCityZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKK3JldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOi0wLjY0NTgyNQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3NlZWsvdnN5bnRoX2xlbmEtZmxhc2hzdiBiL3Rlc3RzL3JlZi9zZWVrL3ZzeW50aF9sZW5hLWZsYXNoc3YKaW5kZXggOGJmYjJmYy4uMjUxNzZiYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3NlZWsvdnN5bnRoX2xlbmEtZmxhc2hzdgorKysgYi90ZXN0cy9yZWYvc2Vlay92c3ludGhfbGVuYS1mbGFzaHN2CkBAIC0xLDQ2ICsxLDQ2IEBACi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDE5OSBzaXplOjI0MDc1NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxODcgc2l6ZToyNDA3NTcKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTkgc2l6ZToyNDA3NTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTg3IHNpemU6MjQwNzU3CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjg4MDAwMCBwdHM6IDEuODgwMDAwIHBvczoxMTYwNTc2MiBzaXplOjI1NDA1MworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuODgwMDAwIHB0czogMS44ODAwMDAgcG9zOjExNjA1NzUwIHNpemU6MjU0MDUzCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC43ODgwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjgwMDAwMCBwdHM6IDAuODAwMDAwIHBvczo0ODIwNTE3IHNpemU6MjQ1NTAzCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44MDAwMDAgcHRzOiAwLjgwMDAwMCBwb3M6NDgyMDUwNSBzaXplOjI0NTUwMwogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuMzE3MDAwCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi41NzY2NjgKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjQ3MDgzNQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDQwMDAwIHB0czogMS40NDAwMDAgcG9zOjg4MTE5MTEgc2l6ZToyNTMwNDEKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjQ0MDAwMCBwdHM6IDEuNDQwMDAwIHBvczo4ODExODk5IHNpemU6MjUzMDQxCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czogMC4zNjUwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQwMDAwMCBwdHM6IDAuNDAwMDAwIHBvczoyMzg3NDUyIHNpemU6MjQxMTAxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40MDAwMDAgcHRzOiAwLjQwMDAwMCBwb3M6MjM4NzQ0MCBzaXplOjI0MTEwMQogcmV0Oi0xICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6LTAuNzQxMDAwCiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczowICB0czogMi4xNTMzMzYKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAxLjA0NzUwMwotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMDQwMDAwIHB0czogMS4wNDAwMDAgcG9zOjYzMDI4MzQgc2l6ZToyNDg5MjcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjA0MDAwMCBwdHM6IDEuMDQwMDAwIHBvczo2MzAyODIyIHNpemU6MjQ4OTI3CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC4wNTgwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTk5IHNpemU6MjQwNzU3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDE4NyBzaXplOjI0MDc1NwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuODM2MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45NjAwMDAgcHRzOiAxLjk2MDAwMCBwb3M6MTIxMTQ3MTIgc2l6ZToyNTQyMzcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjk2MDAwMCBwdHM6IDEuOTYwMDAwIHBvczoxMjExNDcwMCBzaXplOjI1NDIzNwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS43NjAwMDAgcHRzOiAxLjc2MDAwMCBwb3M6MTA4NDM1NzYgc2l6ZToyNTM5MTMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjc2MDAwMCBwdHM6IDEuNzYwMDAwIHBvczoxMDg0MzU2NCBzaXplOjI1MzkxMwogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42MDAwMDAgcHRzOiAwLjYwMDAwMCBwb3M6MzU5ODgwNSBzaXplOjI0MzM3MgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNjAwMDAwIHB0czogMC42MDAwMDAgcG9zOjM1OTg3OTMgc2l6ZToyNDMzNzIKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjQ4MjAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTkgc2l6ZToyNDA3NTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTg3IHNpemU6MjQwNzU3CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MTMwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjk2MDAwMCBwdHM6IDEuOTYwMDAwIHBvczoxMjExNDcxMiBzaXplOjI1NDIzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTYwMDAwIHB0czogMS45NjAwMDAgcG9zOjEyMTE0NzAwIHNpemU6MjU0MjM3CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS4zMDY2NzIKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjMyMDAwMCBwdHM6IDEuMzIwMDAwIHBvczo4MDUzNzE2IHNpemU6MjUyMTk1CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4zMjAwMDAgcHRzOiAxLjMyMDAwMCBwb3M6ODA1MzcwNCBzaXplOjI1MjE5NQogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuMjAwODM5Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4yMDAwMDAgcHRzOiAwLjIwMDAwMCBwb3M6MTE4NzgyMSBzaXplOjIzODU2NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMjAwMDAwIHB0czogMC4yMDAwMDAgcG9zOjExODc4MDkgc2l6ZToyMzg1NjcKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjkwNTAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTkgc2l6ZToyNDA3NTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTg3IHNpemU6MjQwNzU3CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMS45ODkwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjk2MDAwMCBwdHM6IDEuOTYwMDAwIHBvczoxMjExNDcxMiBzaXplOjI1NDIzNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTYwMDAwIHB0czogMS45NjAwMDAgcG9zOjEyMTE0NzAwIHNpemU6MjU0MjM3CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjkyMDAwMCBwdHM6IDAuOTIwMDAwIHBvczo1NTU5MjM4IHNpemU6MjQ3MzQxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45MjAwMDAgcHRzOiAwLjkyMDAwMCBwb3M6NTU1OTIyNiBzaXplOjI0NzM0MQogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzIwMDAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2NjAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNTYwMDAwIHB0czogMS41NjAwMDAgcG9zOjk1NzIyNDcgc2l6ZToyNTQyMTkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjU2MDAwMCBwdHM6IDEuNTYwMDAwIHBvczo5NTcyMjM1IHNpemU6MjU0MjE5CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczoyODcwMjUzIHNpemU6MjQyMzc3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40ODAwMDAgcHRzOiAwLjQ4MDAwMCBwb3M6Mjg3MDI0MSBzaXplOjI0MjM3NwogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay92c3ludGhfbGVuYS1mbHYgYi90ZXN0cy9yZWYvc2Vlay92c3ludGhfbGVuYS1mbHYKaW5kZXggZDRhZWNkYS4uYWU5ZWVkZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3NlZWsvdnN5bnRoX2xlbmEtZmx2CisrKyBiL3Rlc3RzL3JlZi9zZWVrL3ZzeW50aF9sZW5hLWZsdgpAQCAtMSw0NiArMSw0NiBAQAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTkgc2l6ZTogMTAzODAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTg3IHNpemU6IDEwMzgwCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czotMS4wMDAwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTk5IHNpemU6IDEwMzgwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDE4NyBzaXplOiAxMDM4MAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuODk0MTY3Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS40NDAwMDAgcHRzOiAxLjQ0MDAwMCBwb3M6ICA4MzI0MCBzaXplOiAxMjI5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDQwMDAwIHB0czogMS40NDAwMDAgcG9zOiAgODMyMjggc2l6ZTogMTIyOTUKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjc4ODAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOiAgNTI1ODUgc2l6ZTogMTExMjcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogIDUyNTczIHNpemU6IDExMTI3CiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC4zMTcwMDAKIHJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjU3NjY2OAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuNDcwODM1Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS40NDAwMDAgcHRzOiAxLjQ0MDAwMCBwb3M6ICA4MzI0MCBzaXplOiAxMjI5NQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDQwMDAwIHB0czogMS40NDAwMDAgcG9zOiAgODMyMjggc2l6ZTogMTIyOTUKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAwLjM2NTAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDgwMDAwIHB0czogMC40ODAwMDAgcG9zOiAgMjU5NjAgc2l6ZTogMTAwODkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczogIDI1OTQ4IHNpemU6IDEwMDg5CiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczoxICB0czotMC43NDEwMDAKIHJldDotMSAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAyLjE1MzMzNgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDEuMDQ3NTAzCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6ICA1MjU4NSBzaXplOiAxMTEyNworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuOTYwMDAwIHB0czogMC45NjAwMDAgcG9zOiAgNTI1NzMgc2l6ZTogMTExMjcKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjA1ODAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxOTkgc2l6ZTogMTAzODAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTg3IHNpemU6IDEwMzgwCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi44MzYwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjkyMDAwMCBwdHM6IDEuOTIwMDAwIHBvczogMTE3MTc3IHNpemU6IDEyNzMwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45MjAwMDAgcHRzOiAxLjkyMDAwMCBwb3M6IDExNzE2NSBzaXplOiAxMjczMAogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuNzMwMDA0Ci1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45MjAwMDAgcHRzOiAxLjkyMDAwMCBwb3M6IDExNzE3NyBzaXplOiAxMjczMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTIwMDAwIHB0czogMS45MjAwMDAgcG9zOiAxMTcxNjUgc2l6ZTogMTI3MzAKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjYyNDE3MQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDgwMDAwIHB0czogMC40ODAwMDAgcG9zOiAgMjU5NjAgc2l6ZTogMTAwODkKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczogIDI1OTQ4IHNpemU6IDEwMDg5CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC40ODIwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTk5IHNpemU6IDEwMzgwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDE4NyBzaXplOiAxMDM4MAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuNDEzMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45MjAwMDAgcHRzOiAxLjkyMDAwMCBwb3M6IDExNzE3NyBzaXplOiAxMjczMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTIwMDAwIHB0czogMS45MjAwMDAgcG9zOiAxMTcxNjUgc2l6ZTogMTI3MzAKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAxLjMwNjY3MgotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDQwMDAwIHB0czogMS40NDAwMDAgcG9zOiAgODMyNDAgc2l6ZTogMTIyOTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjQ0MDAwMCBwdHM6IDEuNDQwMDAwIHBvczogIDgzMjI4IHNpemU6IDEyMjk1CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMC4yMDA4MzkKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICAgMTk5IHNpemU6IDEwMzgwCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDE4NyBzaXplOiAxMDM4MAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuOTA1MDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgIDE5OSBzaXplOiAxMDM4MAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgICAxODcgc2l6ZTogMTAzODAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjk4OTAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTIwMDAwIHB0czogMS45MjAwMDAgcG9zOiAxMTcxNzcgc2l6ZTogMTI3MzAKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjkyMDAwMCBwdHM6IDEuOTIwMDAwIHBvczogMTE3MTY1IHNpemU6IDEyNzMwCiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC44ODMzNDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjk2MDAwMCBwdHM6IDAuOTYwMDAwIHBvczogIDUyNTg1IHNpemU6IDExMTI3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC45NjAwMDAgcHRzOiAwLjk2MDAwMCBwb3M6ICA1MjU3MyBzaXplOiAxMTEyNwogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuMjIyNDkzCiByZXQ6LTEgICAgICAgICBzdDogMCBmbGFnczowICB0czogMi42NzIwMDAKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAxLjU2NjAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNDQwMDAwIHB0czogMS40NDAwMDAgcG9zOiAgODMyNDAgc2l6ZTogMTIyOTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjQ0MDAwMCBwdHM6IDEuNDQwMDAwIHBvczogIDgzMjI4IHNpemU6IDEyMjk1CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMC40NjAwMDgKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczogIDI1OTYwIHNpemU6IDEwMDg5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC40ODAwMDAgcHRzOiAwLjQ4MDAwMCBwb3M6ICAyNTk0OCBzaXplOiAxMDA4OQogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6LTAuNjQ1ODI1CmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvc2Vlay92c3ludGhfbGVuYS1tanBlZyBiL3Rlc3RzL3JlZi9zZWVrL3ZzeW50aF9sZW5hLW1qcGVnCmluZGV4IDA4Y2JkODguLjcxZjc5OGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi9zZWVrL3ZzeW50aF9sZW5hLW1qcGVnCisrKyBiL3Rlc3RzL3JlZi9zZWVrL3ZzeW50aF9sZW5hLW1qcGVnCkBAIC0xLDQ2ICsxLDQ2IEBACi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgNTY1MiBzaXplOiAxMjA5NgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDU2NTIgc2l6ZTogMTEyMDkKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOi0xLjAwMDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDU2NTIgc2l6ZTogMTIwOTYKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA1NjUyIHNpemU6IDExMjA5CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS44OTQxNjcKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjg4MDAwMCBwdHM6IDEuODgwMDAwIHBvczogNjI3ODE4IHNpemU6IDE0ODA2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS44ODAwMDAgcHRzOiAxLjg4MDAwMCBwb3M6IDU5MjQxMiBzaXplOiAxNDA2NgogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuODAwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC44MDAwMDAgcHRzOiAwLjgwMDAwMCBwb3M6IDI0NzUwMiBzaXplOiAxMjk1OQorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuODAwMDAwIHB0czogMC44MDAwMDAgcG9zOiAyMzI2NTIgc2l6ZTogMTIyNjkKIHJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjMyMDAwMAogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuNTc2NjY4CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS40NzA4MzUKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjQ4MDAwMCBwdHM6IDEuNDgwMDAwIHBvczogNDgwNzQwIHNpemU6IDE0NTE5CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS40ODAwMDAgcHRzOiAxLjQ4MDAwMCBwb3M6IDQ1MzEwNCBzaXplOiAxMzczNQogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6IDAuMzYwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4zNjAwMDAgcHRzOiAwLjM2MDAwMCBwb3M6IDExMTAwMCBzaXplOiAxMTkyNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMzYwMDAwIHB0czogMC4zNjAwMDAgcG9zOiAxMDQxMTggc2l6ZTogMTEyMTMKIHJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOi0wLjc2MDAwMAogcmV0Oi0xICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDIuMTUzMzM2CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczoxICB0czogMS4wNDc1MDMKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjA0MDAwMCBwdHM6IDEuMDQwMDAwIHBvczogMzI2Njg0IHNpemU6IDEzNDkxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4wNDAwMDAgcHRzOiAxLjA0MDAwMCBwb3M6IDMwNzQwNCBzaXplOiAxMjcyMwogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MCAgdHM6LTAuMDQwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgNTY1MiBzaXplOiAxMjA5NgorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDU2NTIgc2l6ZTogMTEyMDkKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgIHRzOiAyLjg0MDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTYwMDAwIHB0czogMS45NjAwMDAgcG9zOiA2NTc0NzIgc2l6ZTogMTQ4OTcKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjk2MDAwMCBwdHM6IDEuOTYwMDAwIHBvczogNjIwNTY0IHNpemU6IDE0MTI1CiByZXQ6IDAgICAgICAgICBzdDotMSBmbGFnczowICB0czogMS43MzAwMDQKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjcyMDAwMCBwdHM6IDEuNzIwMDAwIHBvczogNTY4NjEwIHNpemU6IDE0NzUxCityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS43MjAwMDAgcHRzOiAxLjcyMDAwMCBwb3M6IDUzNjI2NCBzaXplOiAxMzk2NgogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MSAgdHM6IDAuNjI0MTcxCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC42NDAwMDAgcHRzOiAwLjY0MDAwMCBwb3M6IDE5NjQyNCBzaXplOiAxMjcyMAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNjQwMDAwIHB0czogMC42NDAwMDAgcG9zOiAxODQ0Nzggc2l6ZTogMTE5ODEKIHJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOi0wLjQ4MDAwMAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMDAwMDAwIHB0czogMC4wMDAwMDAgcG9zOiAgIDU2NTIgc2l6ZTogMTIwOTYKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA1NjUyIHNpemU6IDExMjA5CiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxICB0czogMi40MDAwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAxLjk2MDAwMCBwdHM6IDEuOTYwMDAwIHBvczogNjU3NDcyIHNpemU6IDE0ODk3CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45NjAwMDAgcHRzOiAxLjk2MDAwMCBwb3M6IDYyMDU2NCBzaXplOiAxNDEyNQogcmV0OiAwICAgICAgICAgc3Q6LTEgZmxhZ3M6MCAgdHM6IDEuMzA2NjcyCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS4zMjAwMDAgcHRzOiAxLjMyMDAwMCBwb3M6IDQyMzQ3NCBzaXplOiAxNDExNAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuMzIwMDAwIHB0czogMS4zMjAwMDAgcG9zOiAzOTg5MzQgc2l6ZTogMTMzNDAKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjEgIHRzOiAwLjIwMDgzOQotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuMjAwMDAwIHB0czogMC4yMDAwMDAgcG9zOiAgNjM4NjYgc2l6ZTogMTE3MTUKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjIwMDAwMCBwdHM6IDAuMjAwMDAwIHBvczogIDU5OTA0IHNpemU6IDEwOTcyCiByZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczowICB0czotMC45MjAwMDAKLXJldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjAwMDAwMCBwdHM6IDAuMDAwMDAwIHBvczogICA1NjUyIHNpemU6IDEyMDk2CityZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMC4wMDAwMDAgcHRzOiAwLjAwMDAwMCBwb3M6ICAgNTY1MiBzaXplOiAxMTIwOQogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDIuMDAwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS45NjAwMDAgcHRzOiAxLjk2MDAwMCBwb3M6IDY1NzQ3MiBzaXplOiAxNDg5NworcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuOTYwMDAwIHB0czogMS45NjAwMDAgcG9zOiA2MjA1NjQgc2l6ZTogMTQxMjUKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjg4MzM0MAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuODgwMDAwIHB0czogMC44ODAwMDAgcG9zOiAyNzM1MTYgc2l6ZTogMTMxMjIKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjg4MDAwMCBwdHM6IDAuODgwMDAwIHBvczogMjU3MjIwIHNpemU6IDEyNDA3CiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC4yMjI0OTMKIHJldDotMSAgICAgICAgIHN0OiAwIGZsYWdzOjAgIHRzOiAyLjY4MDAwMAogcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSAgdHM6IDEuNTYwMDAwCi1yZXQ6IDAgICAgICAgICBzdDogMCBmbGFnczoxIGR0czogMS41NjAwMDAgcHRzOiAxLjU2MDAwMCBwb3M6IDUwOTg5NiBzaXplOiAxNDU5NAorcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDEuNTYwMDAwIHB0czogMS41NjAwMDAgcG9zOiA0ODA3MTAgc2l6ZTogMTM4MzEKIHJldDogMCAgICAgICAgIHN0Oi0xIGZsYWdzOjAgIHRzOiAwLjQ2MDAwOAotcmV0OiAwICAgICAgICAgc3Q6IDAgZmxhZ3M6MSBkdHM6IDAuNDgwMDAwIHB0czogMC40ODAwMDAgcG9zOiAxNDY5NTQgc2l6ZTogMTIxNzMKK3JldDogMCAgICAgICAgIHN0OiAwIGZsYWdzOjEgZHRzOiAwLjQ4MDAwMCBwdHM6IDAuNDgwMDAwIHBvczogMTM3OTIwIHNpemU6IDExNDU4CiByZXQ6LTEgICAgICAgICBzdDotMSBmbGFnczoxICB0czotMC42NDU4MjUKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1icHAxIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWJwcDEKaW5kZXggMGJkMWE3Ny4uYjY0N2JhMCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWJwcDEKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWJwcDEKQEAgLTEsNCArMSw0IEBACi02MTFkZTA4MDNmZjZiZDBlZjM4NWRkZTU5OTY0YTEwNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtYnBwMS5hdmkKLTY0MDQ1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1icHAxLmF2aQotNTc2YjY5MGU4YTg5MjFjNTRkNzc3NDYzYjYzYTgzMDcgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWJwcDEub3V0LnJhd3ZpZGVvCi1zdGRkZXY6ICAgOTcuNDEgUFNOUjogIDguMzYgTUFYRElGRjogIDIzOCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCisxYzc4ZTc3Yzk3MWIxY2UzMWYyMjljNmZjMjNkMDkwMiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtYnBwMS5hdmkKKzY0MDQ2MCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1icHAxLmF2aQorY2QxZTE0NDhkOTg5NTU2MTM0N2NlYjY2ZDBhZGQzNGQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWJwcDEub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgODQuNDggUFNOUjogIDkuNjAgTUFYRElGRjogIDIxOCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtYnBwMTUgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtYnBwMTUKaW5kZXggODU1MzgzOC4uZDY4N2I5NiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWJwcDE1CisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1icHAxNQpAQCAtMSw0ICsxLDQgQEAKLWRjMzdkMWRiMDQyOWY0NDAwMGEwM2E2MDg2Mjc1MWNkICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1icHAxNS5hdmkKKzYxNDdmNWYyMzU2NTdmYTljZWQ2ZWM2MTQ2YmU2ZmYwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1icHAxNS5hdmkKIDEwMTQ0NDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWJwcDE1LmF2aQogM2FlZTJkNmU4MmE5NTA3ZDdmMDE4NDRjMDRkMmI1N2IgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWJwcDE1Lm91dC5yYXd2aWRlbwogc3RkZGV2OiAgIDM4LjQ0IFBTTlI6IDE2LjQzIE1BWERJRkY6ICAxNTkgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWNpbmVwYWsgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtY2luZXBhawppbmRleCBmMWRmY2Q4Li5lNDdhZTI2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtY2luZXBhaworKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtY2luZXBhawpAQCAtMSw0ICsxLDQgQEAKLTU0NmM3YzEwNjlmOWU0MThhYTc4N2Y0NjliNjkzYjk0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1jaW5lcGFrLm1vdgotOTk0NjUgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtY2luZXBhay5tb3YKLWJlZTA5MWMyMDAyNjJiZTM0MjdhMjMzYTI4MTIzODhjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1jaW5lcGFrLm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICA4LjQ2IFBTTlI6IDI5LjU4IE1BWERJRkY6ICAxMDUgYnl0ZXM6ICA3NjAzMjAwLyAgIDQ1NjE5MgorY2QyOGU0N2E2YWMzOTYyNDBhM2ZlZTY5ZjE1NjI1ZDEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWNpbmVwYWsuYXZpCis0MDg2MTYgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtY2luZXBhay5hdmkKK2U3NDA2NmEwMjhjNzA4ZjQ2NzI3Mjg4NGVjZDNmN2QzICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1jaW5lcGFrLm91dC5yYXd2aWRlbworc3RkZGV2OiAgIDYxLjM4IFBTTlI6IDEyLjM3IE1BWERJRkY6ICAyMjUgYnl0ZXM6ICA3NjAzMjAwLyAgIDkyMTYwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLTJrLWhyLWhxIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLTJrLWhyLWhxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDIyOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtMmstaHItaHEKQEAgLTAsMCArMSw0IEBACis3NWNhZGUwODliNTZiYjJmN2E3YTIxMzM0MDNjZDNhYyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZG54aGQtMmstaHItaHEuZG54aGQKKzQ4OTQ3MjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZG54aGQtMmstaHItaHEuZG54aGQKKzFiYWI3MzI2NmQ4MDlkNTIzZWRiNmFiNzgwMjAwMWE4ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC0yay1oci1ocS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNS43MyBQU05SOiAzMi45NiBNQVhESUZGOiAgIDU1IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kbnhoZC00ay1oci1sYiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kbnhoZC00ay1oci1sYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIxZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLTRrLWhyLWxiCkBAIC0wLDAgKzEsNCBAQAorYzZiNmIzNWZmZDE0NzI5Nzk4M2RhNGFkOTQ4ODdhYzYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLTRrLWhyLWxiLmRueGhkCiszOTkzNjAwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLTRrLWhyLWxiLmRueGhkCisxZGMxOTg0ZTRhMzE1YTM1ZTk3ZWQ5ZTk5OTQwZDEyNCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZG54aGQtNGstaHItbGIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDUuNTggUFNOUjogMzMuMTkgTUFYRElGRjogICA1NSBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtNzIwcC1oci1sYiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kbnhoZC03MjBwLWhyLWxiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZTU5MzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtNzIwcC1oci1sYgpAQCAtMCwwICsxLDQgQEAKKzA4Y2JmZTliOWY2NzFjZGI5ZGRkYzkzMDcxMjFkMTA3ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC03MjBwLWhyLWxiLmRueGhkCis0MDk2MDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZG54aGQtNzIwcC1oci1sYi5kbnhoZAorNzdlNTEwZTM1MzgzMTNiMWNiYWZiODZlZDI0OGQyZGYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLTcyMHAtaHItbGIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDcuNTAgUFNOUjogMzAuNjIgTUFYRElGRjogICA2NCBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtZWRnZTEtaHIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtZWRnZTEtaHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgxYmFiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kbnhoZC1lZGdlMS1ocgpAQCAtMCwwICsxLDQgQEAKKzU4ZGZjNDc0MDZhNGNiN2NhMzQ0ZGQ3YjJmZTNmY2RiICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1lZGdlMS1oci5kbnhoZAorODE5MjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZG54aGQtZWRnZTEtaHIuZG54aGQKKzZlNDA3MGVmODAwNWNhNWM1NmJlMWFkNjNlN2VlNTk2ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1lZGdlMS1oci5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAxNi4wMyBQU05SOiAyNC4wMyBNQVhESUZGOiAgMTUwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kbnhoZC1lZGdlMi1ociBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kbnhoZC1lZGdlMi1ocgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2RiMzMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWVkZ2UyLWhyCkBAIC0wLDAgKzEsNCBAQAorM2ViZWI1MmFlNTNhNWIyYWU0YTBkOTBmYTcyOGM0ZmEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLWVkZ2UyLWhyLmRueGhkCis4MTkyMCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1lZGdlMi1oci5kbnhoZAorMTc2MzYzNzUwNGY4OWM0ZTFhNTBhNGRlMjVjNWU1OGEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLWVkZ2UyLWhyLm91dC5yYXd2aWRlbworc3RkZGV2OiAgIDE1Ljg2IFBTTlI6IDI0LjEyIE1BWERJRkY6ICAxNTcgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWVkZ2UzLWhyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWVkZ2UzLWhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTEyNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtZWRnZTMtaHIKQEAgLTAsMCArMSw0IEBACitkNTA5ZjFmNGE0OGFhMmQxMWE2YzI5NDBlMzMwYTk2ZCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZG54aGQtZWRnZTMtaHIuZG54aGQKKzgxOTIwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLWVkZ2UzLWhyLmRueGhkCisxNzk4NzY0ZGRjZTY1MGRiNDJlNmU3NWM3YzUzMzBlMCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZG54aGQtZWRnZTMtaHIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgMTYuMzYgUFNOUjogMjMuODUgTUFYRElGRjogIDE1MiBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtaHItaHEtbW92IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWhyLWhxLW1vdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTljMmYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWhyLWhxLW1vdgpAQCAtMCwwICsxLDQgQEAKK2M4YjVkMmJkZTQ1Nzc2YmJmMTNmMDI2MmM5MTVmNWI5ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1oci1ocS1tb3YubW92Cis0NzcyNTk5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLWhyLWhxLW1vdi5tb3YKKzM4OGM3Yzg0NTczYWJlMjhjYzk2M2UzYWQ1ZTE1YTMxICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1oci1ocS1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDUuNzMgUFNOUjogMzIuOTYgTUFYRElGRjogICA1NiBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtaHItbGItbW92IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWhyLWxiLW1vdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTJiNGEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWhyLWxiLW1vdgpAQCAtMCwwICsxLDQgQEAKKzI1NGFhM2YwYmU4MTE4ODJmZjM1MTE3MmZkMzkxNDkyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1oci1sYi1tb3YubW92CiszNzQ4NTk5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLWhyLWxiLW1vdi5tb3YKKzIxYzY4MjUyZjUwMGJhZGExM2NjY2UyMzJlMWVjZmNhICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1oci1sYi1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDUuNTkgUFNOUjogMzMuMTcgTUFYRElGRjogICA1NSBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtaHItc3EtbW92IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWhyLXNxLW1vdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzUyZTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLWhyLXNxLW1vdgpAQCAtMCwwICsxLDQgQEAKKzdkN2ZiNDdlOTI2YWE1NjViNTE2NjEyNjRmMWEzOWU5ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1oci1zcS1tb3YubW92CisyNTYwNzYzIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLWhyLXNxLW1vdi5tb3YKKzY2ZDI5ZjkxY2RmMDM4NzUzODk0ZGQ0MmU2NWQ5OTdhICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC1oci1zcS1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDUuNzcgUFNOUjogMzIuOTEgTUFYRElGRjogICA1OCBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZG54aGQtdWhkLWhyLXNxIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLXVoZC1oci1zcQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzBiNDIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWRueGhkLXVoZC1oci1zcQpAQCAtMCwwICsxLDQgQEAKKzJjNTM3NTliYTZjZmExMTM2NjA0NTU4MjI0ODc5MDU0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kbnhoZC11aGQtaHItc3EuZG54aGQKKzEyMDQyMjQwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLXVoZC1oci1zcS5kbnhoZAorYzkxY2EwNzlkODFkMDJkY2E3YjZhZTAxNjFmNmUyZGIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWRueGhkLXVoZC1oci1zcS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNS42MiBQU05SOiAzMy4xMiBNQVhESUZGOiAgIDU1IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kdiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kdgppbmRleCA2MjM3YjA3Li5lYTM1N2I3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZHYKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWR2CkBAIC0xLDQgKzEsNCBAQAotNGQ1NzJmNzU4YjU1YTE3NTZhZGY5ZjU0MTMyZjNiOWUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWR2LmR2Cis0MjQ2NjY4ZDYxNDM5NjE3MTAxZDA1MWQ3YTk5NTEwOCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZHYuZHYKIDcyMDAwMDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZHYuZHYKLTFjZGE1YTYyYzNhMmYxN2NjN2Q1YjRjZGRjY2YyNTI0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kdi5vdXQucmF3dmlkZW8KK2Q1MmU3YTllYWM0NTlhZGU5NTYxZDBiODliYmE1OGU3ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kdi5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgNi45MCBQU05SOiAzMS4zNCBNQVhESUZGOiAgIDc2IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kdi00MTEgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZHYtNDExCmluZGV4IDQ4ZTAxYTEuLmVjODhkNjcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kdi00MTEKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWR2LTQxMQpAQCAtMSw0ICsxLDQgQEAKLWYxNzk4OTllZmJhNDMyYzZmMDExNDljMzZjNzA5MDkyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kdi00MTEuZHYKK2RmMDY3YWZlNjVmMTcxMmQ5ZThlZmE3MTE3YWFiNmVhICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1kdi00MTEuZHYKIDcyMDAwMDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZHYtNDExLmR2Ci00ODkwNDc0NGZhYmJiYzM0MjFhNzYyZjYxNWVmNjQ1NiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZHYtNDExLm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICA5LjQ0IFBTTlI6IDI4LjYyIE1BWERJRkY6ICAgODQgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMAorZWQ0OTNiYWQ4MjdkYzkwMzE4OGZjZThkM2I1OTdmY2IgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWR2LTQxMS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgOS40NSBQU05SOiAyOC42MiBNQVhESUZGOiAgIDg0IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kdi01MCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1kdi01MAppbmRleCBkNWRhODhkLi40YTJmZjAwIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZHYtNTAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWR2LTUwCkBAIC0xLDQgKzEsNCBAQAotYTE5M2M1ZjkyYmY2ZTc0YzYwNGU3NTlkNWY0ZjBmOTQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWR2LTUwLmR2CithZGIxZGYxYTY1Y2VjYWIyMjU2NzcwMDNhNWRlOWYyOCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZHYtNTAuZHYKIDE0NDAwMDAwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWR2LTUwLmR2Ci00MWM0ZGY1ZjJkODc2ZmNkNTI0NTY0M2I5ZGVkNjcxMSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZHYtNTAub3V0LnJhd3ZpZGVvCi1zdGRkZXY6ICAgIDEuNzIgUFNOUjogNDMuMzggTUFYRElGRjogICAyOSBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCis0YWIxZjViN2FhZDE1ZmFiOWUzYzFlYTViOTZkYTM5YiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZHYtNTAub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuNzIgUFNOUjogNDMuMzcgTUFYRElGRjogICAyOSBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZmZ2MS12My1yZ2I0OCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1mZnYxLXYzLXJnYjQ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNDQ0ODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZmZ2MS12My1yZ2I0OApAQCAtMCwwICsxLDQgQEAKK2Y0NTdkYmE3ZDU4ZjBjMjhhZWRjZmVmNTE4NzU4ZDIzICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1mZnYxLXYzLXJnYjQ4LmF2aQorMTY4NTgzMDQgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZmZ2MS12My1yZ2I0OC5hdmkKK2I5MWRkYzQ1ZWI3MGI0Mzc3ZGM3NDM5ZTE2NzMzMjMyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1mZnYxLXYzLXJnYjQ4Lm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAzLjU4IFBTTlI6IDM3LjA0IE1BWERJRkY6ICAgNzUgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLWZmdmh1ZmY0MjBwMTIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZmZ2aHVmZjQyMHAxMgppbmRleCAwZDgwYmQ2Li5kNGIyMmYzIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZmZ2aHVmZjQyMHAxMgorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtZmZ2aHVmZjQyMHAxMgpAQCAtMSw0ICsxLDQgQEAKIDg2NjQ4NWM5NTQyNDIyMzI4NzhlNDBmMDM4OTc5MGRkICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1mZnZodWZmNDIwcDEyLmF2aQogMTQyMDUzNTYgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtZmZ2aHVmZjQyMHAxMi5hdmkKLWI0OGYzMmMxNDA3MTJlOGM3YmY4MWNmZGQ2NmFlMzEyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1mZnZodWZmNDIwcDEyLm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICAwLjY4IFBTTlI6IDUxLjQ3IE1BWERJRkY6ICAgIDEgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMAorYzVjY2FjODc0ZGJmODA4ZTkwODhiYzMxMDc4NjAwNDIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLWZmdmh1ZmY0MjBwMTIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDAuMDAgUFNOUjo5OTkuOTkgTUFYRElGRjogICAgMCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWcgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWcKaW5kZXggMTFkZTAyMC4uYWE0NDFkMyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLW1qcGVnCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1tanBlZwpAQCAtMSw0ICsxLDQgQEAKLTlmZjE4YjE5ZDEyYmI5YmIyZWQ0MzRhNzlmMjEyODg4ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1tanBlZy5hdmkKLTE1MTU5MDYgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWcuYXZpCis2M2VhOWJkNDk0ZTE2YmFkOGYzYTBjOGRiYjNkYzExZSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWcuYXZpCisxMzkxMzgwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLmF2aQogOWEzYjgxNjljMjUxZDE5MDQ0ZjcwODdhOTU0NThjNTUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICA3Ljg3IFBTTlI6IDMwLjIxIE1BWERJRkY6ICAgNjMgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLW1qcGVnLTQyMiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1tanBlZy00MjIKaW5kZXggYmQ3NjBhMS4uZGRhMzkyOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLW1qcGVnLTQyMgorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWctNDIyCkBAIC0xLDQgKzEsNCBAQAotM2IxOWRhMDZmZmUyM2NiODA0YmNhN2E5YTg2ZWIzZDUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLTQyMi5hdmkKLTE3NTYzMDQgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWctNDIyLmF2aQorODJkODg3NGJmZTEzZjU2ZWM0NjZiMjA2YTA4YTQ0MDIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLTQyMi5hdmkKKzE2MTE4MzIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWctNDIyLmF2aQogYzM1ZWVhNDg2YzZkNzIwNTBmNDg0OGVhYjY0MDMyYjUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLTQyMi5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgNy40NSBQU05SOiAzMC42OSBNQVhESUZGOiAgIDYzIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1tanBlZy00NDQgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWctNDQ0CmluZGV4IDQyYTliZTMuLjY2YTBlZmMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1tanBlZy00NDQKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLW1qcGVnLTQ0NApAQCAtMSw0ICsxLDQgQEAKLTk1OTFiNzU0Y2ExNTFmMzgwMjczODg0MGZhNWMyNmMwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1tanBlZy00NDQuYXZpCi0xOTg5Nzg0IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLTQ0NC5hdmkKKzJkZDc0MWNiZWU5YjM0OTk4MjZiZWNhN2M3ZDNiOGRjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1tanBlZy00NDQuYXZpCisxODMxNjE0IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLTQ0NC5hdmkKIDMxM2E0YTc2YWYxM2Q1ODc5ZWE0OTEwMTA3YjdlYTc0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1tanBlZy00NDQub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDcuMzcgUFNOUjogMzAuNzcgTUFYRElGRjogICA2MyBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWctaHVmZm1hbiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1tanBlZy1odWZmbWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YzNmMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWctaHVmZm1hbgpAQCAtMCwwICsxLDQgQEAKKzYzZWE5YmQ0OTRlMTZiYWQ4ZjNhMGM4ZGJiM2RjMTFlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1tanBlZy1odWZmbWFuLmF2aQorMTM5MTM4MCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1tanBlZy1odWZmbWFuLmF2aQorOWEzYjgxNjljMjUxZDE5MDQ0ZjcwODdhOTU0NThjNTUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLWh1ZmZtYW4ub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDcuODcgUFNOUjogMzAuMjEgTUFYRElGRjogICA2MyBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWctdHJlbGwgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWctdHJlbGwKaW5kZXggYjk3ZWZjYi4uY2YyYTdmZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLW1qcGVnLXRyZWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1tanBlZy10cmVsbApAQCAtMSw0ICsxLDQgQEAKLTAzZDE0YjNkYjYyMzJmNDZjMGQ5MzE0Nzc4MDFhN2E2ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1tanBlZy10cmVsbC5hdmkKLTE0NTQzMDggdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWctdHJlbGwuYXZpCi0yMThkNGRjODA4NmZkZWYxNWQ1MzgyZTZiYTk3ZGYwYiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWctdHJlbGwub3V0LnJhd3ZpZGVvCi1zdGRkZXY6ICAgIDcuNzEgUFNOUjogMzAuMzkgTUFYRElGRjogICA2MiBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCitkOTQxMGZhODBjMDdlZGJkMmEyYjQ0Y2ViMDYwODZjYSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWctdHJlbGwuYXZpCisxMzYwNDU2IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLXRyZWxsLmF2aQorMDI2NmIyMjNiZGQ3OTI4NDI2YTk1MTE2NGJiNGEzNjYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLW1qcGVnLXRyZWxsLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA3LjY4IFBTTlI6IDMwLjQyIE1BWERJRkY6ICAgNjIgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLW1qcGVnLXRyZWxsLWh1ZmZtYW4gYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtbWpwZWctdHJlbGwtaHVmZm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGNlNzgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLW1qcGVnLXRyZWxsLWh1ZmZtYW4KQEAgLTAsMCArMSw0IEBACitkOTQxMGZhODBjMDdlZGJkMmEyYjQ0Y2ViMDYwODZjYSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWctdHJlbGwtaHVmZm1hbi5hdmkKKzEzNjA0NTYgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtbWpwZWctdHJlbGwtaHVmZm1hbi5hdmkKKzAyNjZiMjIzYmRkNzkyODQyNmE5NTExNjRiYjRhMzY2ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1tanBlZy10cmVsbC1odWZmbWFuLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA3LjY4IFBTTlI6IDMwLjQyIE1BWERJRkY6ICAgNjIgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXIyMTAgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtcjIxMAppbmRleCBlMjViMWRlLi44MjVlMWQ0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtcjIxMAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtcjIxMApAQCAtMSw0ICsxLDQgQEAKLWZkMmJiOGIzZDNlNDdmNWVhNzc2OTQ0MzMyNGVlMGFlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1yMjEwLmF2aQorMWVhNzJmMjgwYjExMGVkNjVmYzUzNWMzNDM4ZDI3ZjkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXIyMTAuYXZpCiAyMjEyNTI1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1yMjEwLmF2aQogZWNhYWZhOWVlYzExYjVlMTQ1M2E2M2VkNmQxOTRlZWQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXIyMTAub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDMuMjMgUFNOUjogMzcuOTQgTUFYRElGRjogICA0OCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtcmdiIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXJnYgppbmRleCAwYTM5NDdjLi42ZDk2MjliIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtcmdiCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS1yZ2IKQEAgLTEsNCArMSw0IEBACi1jOGE0Yjg2NDg0MzZlNzNjZWQ3ZmUzMmY2ZjY1YTFiMyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtcmdiLmF2aQorOWQyYmQxZmE1NjlhODAzYzQxYjVkYzVkZDAzZjA4OGUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXJnYi5hdmkKIDE1MjEzMjUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXJnYi5hdmkKIDkzNjk1YTI3YzI0YTYxMTA1MDc2Y2E3YjFmMDEwYmJkICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS1yZ2Iub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDMuNDIgUFNOUjogMzcuNDQgTUFYRElGRjogICA0OCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtdjIxMCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12MjEwCmluZGV4IDM4OGU4YjYuLjFiNjlkYTQgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12MjEwCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12MjEwCkBAIC0xLDQgKzEsNCBAQAotMDcxMmQ2MGIzYTAwY2YyZDVhN2UzOWFhMjFlMjU0N2EgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXYyMTAuYXZpCis3Njc0NzFjNzFkNjBkYWY0NmNhM2E3NTg3NzFjNGY4ZSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdjIxMC5hdmkKIDE0NzUyNDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXYyMTAuYXZpCiAyYmE3ZjRjYTMwMmYzYzQxNDc4NjBiOWRmYjEyYjZlNCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdjIxMC5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMS44NCBQU05SOiA0Mi44MSBNQVhESUZGOiAgIDI5IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12MjEwLTEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXYyMTAtMTAKaW5kZXggNDYyMWI5ZC4uZjQ1OWNmYSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXYyMTAtMTAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXYyMTAtMTAKQEAgLTEsNCArMSw0IEBACi0yMzBiYmQzMWM4MmQ0ZmJiOTJkNWVhMmFjNTkxZGVkNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdjIxMC0xMC5hdmkKKzkyNjljZTJhNTI5NGE0YzlhODM0NjMyOGQwNmIyM2FmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12MjEwLTEwLmF2aQogMTQ3NTI0NTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdjIxMC0xMC5hdmkKIDUwOTczNzkyZDNmMWFiZTA0YTUxZWUwMTIxZjA3N2YyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12MjEwLTEwLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAxLjg1IFBTTlI6IDQyLjc4IE1BWERJRkY6ICAgMjkgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXYzMDggYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtdjMwOAppbmRleCA5ZWIyOTExLi4xNjI2MjRlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtdjMwOAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtdjMwOApAQCAtMSw0ICsxLDQgQEAKLTU4ZWEyNmQzMDYwZjlkNDdjZjk1MDU2ZWQ5MzYxYzkwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12MzA4LmF2aQorNWQ4NjhiNzNjNTU0YTlhMjQyMmQ2YzhhMThjZTljMDIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXYzMDguYXZpCiAxNTIxMzI1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12MzA4LmF2aQogMTBmYjQyZjFhYmY0MGEyODljM2VkYWZjMDM5MDQ4MmMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXYzMDgub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDIuNjcgUFNOUjogMzkuNjAgTUFYRElGRjogICA0MyBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEtdjQwOCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12NDA4CmluZGV4IGJmMTZjYmQuLjVkNWY4MTYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12NDA4CisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12NDA4CkBAIC0xLDQgKzEsNCBAQAotNGFjNjhlOTFhYzI1YmM0MjJhYmIzZmViZTg2YTRhY2QgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXY0MDguYXZpCis0ZTk3N2JlYzcwN2NkYTJiMDllZGI3MTc4MDVjYjk2MCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdjQwOC5hdmkKIDIwMjgyMDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXY0MDguYXZpCiBjNWNjYWM4NzRkYmY4MDhlOTA4OGJjMzEwNzg2MDA0MiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdjQwOC5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIwcCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI1YzUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00MjBwCkBAIC0wLDAgKzEsNCBAQAorZmI4ZmZmY2ZjMTc1NThjODdkZDExYTY3Y2NiMGY2MTUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjBwLm1vdgorMTE1NTQxNSB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12YzItNDIwcC5tb3YKKzM4NzY5NjcwN2M3OWNmMWE2YzlhZWZmNDAyNDIyNmI5ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12YzItNDIwcC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIwcDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00MjBwMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI1YTFjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIwcDEwCkBAIC0wLDAgKzEsNCBAQAorMTM2NTc0Mjk4NWI2MzE1ZjY3OTZjNzY1YWExN2YzOWUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjBwMTAubW92CisxNDE3MDQ3IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjBwMTAubW92CiszODc2OTY3MDdjNzljZjFhNmM5YWVmZjQwMjQyMjZiOSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdmMyLTQyMHAxMC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIwcDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00MjBwMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE5ZjBkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIwcDEyCkBAIC0wLDAgKzEsNCBAQAorMDhhODQ0ZDE3OTQwY2Q2MTJkYTI2OWZiMDg0MzA2MjggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjBwMTIubW92CisxNzQ2MDA3IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjBwMTIubW92CiszODc2OTY3MDdjNzljZjFhNmM5YWVmZjQwMjQyMjZiOSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdmMyLTQyMHAxMi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIycCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIycApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmM2MTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00MjJwCkBAIC0wLDAgKzEsNCBAQAorMTlmMDFhOTg1ZTg3ZTE0NjY0ZTBlNWQxNGMwMmQwNDYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjJwLm1vdgorMTIyOTc4MyB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12YzItNDIycC5tb3YKKzU3YTdmNDEyMzVlN2Y5ZjA5NGFhN2JhNWJkYzgyZjAyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12YzItNDIycC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS44OSBQU05SOiA0Mi41OCBNQVhESUZGOiAgIDIzIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIycDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00MjJwMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMDcyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIycDEwCkBAIC0wLDAgKzEsNCBAQAorODhlMzQ4OGU0Njg5Y2YwNmU3NTk1OWM3MWUyZjlkOTYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjJwMTAubW92CisxNjg0MDU1IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjJwMTAubW92CitmMzVkZDFjMWRmNDcyNmJiMWQ3NWQ5NWUzMjFiMDY5OCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdmMyLTQyMnAxMC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS44OCBQU05SOiA0Mi42MSBNQVhESUZGOiAgIDIzIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIycDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00MjJwMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFkNDc5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDIycDEyCkBAIC0wLDAgKzEsNCBAQAorYjE2MmE3YzUzMWZiMDZmNDM2Yzc5YjM4ZmIzZDc0MDMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjJwMTIubW92CisyMTM1MTMxIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00MjJwMTIubW92CisxYjU2YjNkMTI3MzIwYzBlNmM2NDNlMzQzMGI3ZmZkMSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdmMyLTQyMnAxMi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS44OCBQU05SOiA0Mi42MiBNQVhESUZGOiAgIDIzIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDQ0cCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDQ0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDFlOTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00NDRwCkBAIC0wLDAgKzEsNCBAQAorYjNmMGQ5ODdkY2IwYjVkMWViMGI4N2YzNTZhZDIxYzQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00NDRwLm1vdgorMTU5MzgxMCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12YzItNDQ0cC5tb3YKKzc5MWNmMGYyMTU1OGFkNGE0Y2FkNDNkYTA1NjI4ZTA2ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS12YzItNDQ0cC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMi42OSBQU05SOiAzOS41MSBNQVhESUZGOiAgIDM3IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDQ0cDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00NDRwMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYwMDc0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDQ0cDEwCkBAIC0wLDAgKzEsNCBAQAorZWYyODY2OTZjNWQzNzI3N2I0MDY0YzRmODdmNmU1NjQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00NDRwMTAubW92CisyMTY3NjQzIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00NDRwMTAubW92CiswZTJjZDZkMGUxZDY4ZmZlZTY0ZDI2OWRjYjU3ZDY2ZCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdmMyLTQ0NHAxMC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMi42OSBQU05SOiAzOS41MyBNQVhESUZGOiAgIDM3IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDQ0cDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXZjMi00NDRwMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MWI2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS12YzItNDQ0cDEyCkBAIC0wLDAgKzEsNCBAQAorMjFhYWVkNzgyOGZhODQ3Y2U1Yjc1Mzk5ZWZiYzc2OGMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00NDRwMTIubW92CisyNzU1MTU5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXZjMi00NDRwMTIubW92Cis1NTk5ODExNGQ3Mzg2ZDIxOWE0OTAxMWM4YjgwNGE1OCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEtdmMyLTQ0NHAxMi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMi42OSBQU05SOiAzOS41MyBNQVhESUZGOiAgIDM3IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS15NDFwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXk0MXAKaW5kZXggY2I0YzAwMS4uODRlNzkwYiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXk0MXAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXk0MXAKQEAgLTEsNCArMSw0IEBACi04NjJmZmRkZDkwYzgyMTYzZDI1MDUwMzFlNWJiY2Q5YSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEteTQxcC5hdmkKKzczNTVmYzc2MTRlMWJhNTBkMzY0ZmMxM2FmNWZjM2UxICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS15NDFwLmF2aQogNzYxMDA1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMS15NDFwLmF2aQogM2FlZjFkODM3MzJhM2Y5ODM1ZWUyNTIzYTExYzk1YzEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXk0MXAub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDUuOTggUFNOUjogMzIuNTkgTUFYRElGRjogICA4NyBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEteXV2IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgxLXl1dgppbmRleCA4NDk4ZDY4Li45ZjczYzZmIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDEteXV2CisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMS15dXYKQEAgLTEsNCArMSw0IEBACi0yYjkzMGQ4MDljMTllOGQ1MGViNGM5MjQ3NDA4NWMyNyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEteXV2LmF2aQorNzk1Y2U2M2YxZmUzNzFiOTg4MjJiMWNiMzg1YjA2MmYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXl1di5hdmkKIDc2MTAwNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDEteXV2LmF2aQogYzVjY2FjODc0ZGJmODA4ZTkwODhiYzMxMDc4NjAwNDIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgxLXl1di5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1icHAxIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWJwcDEKaW5kZXggZDI4M2Q2Yy4uM2I1MTJlOSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWJwcDEKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWJwcDEKQEAgLTEsNCArMSw0IEBACi1iNTFhZDQ5ODkyZWI4Zjg5MTJjNWE5ODM3MThhMTdiYiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItYnBwMS5hdmkKLTY0MDQ1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1icHAxLmF2aQotMzM4ZmI5MDM5YTQ1NjRlNDcxYmY4MTc5ZjBjNDhhOTUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWJwcDEub3V0LnJhd3ZpZGVvCi1zdGRkZXY6ICAgODAuNDAgUFNOUjogMTAuMDIgTUFYRElGRjogIDIzOCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCisyMjY2NGRjN2U2Y2VmYzU4MGIxNDU2NTAyYzQ2ZWIxMCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItYnBwMS5hdmkKKzY0MDQ2MCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1icHAxLmF2aQorZjBkZmMwZTg3ZTVkOTZiY2UyOWE1OTQ0YjFiZDc0NzEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWJwcDEub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgNjguOTggUFNOUjogMTEuMzYgTUFYRElGRjogIDIxOCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItYnBwMTUgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItYnBwMTUKaW5kZXggMTUzYjIxZS4uOTIzNmMyNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWJwcDE1CisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1icHAxNQpAQCAtMSw0ICsxLDQgQEAKLTRiZjA5OTJkZTZiNDAzODlhMzVjZDc0NGY3NmJiMjEzICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1icHAxNS5hdmkKKzE3NjBiNzZkZGYxZGYwMDkyMzMzNDM0ZjFhOTc0MDdiICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1icHAxNS5hdmkKIDEwMTQ0NDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWJwcDE1LmF2aQogOWE0MDEzMzM4NGUzZjIyYzk2MGQ3MGM4Y2ZlNTE3ODEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWJwcDE1Lm91dC5yYXd2aWRlbwogc3RkZGV2OiAgIDMzLjk3IFBTTlI6IDE3LjUxIE1BWERJRkY6ICAxNTQgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWNpbmVwYWsgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItY2luZXBhawppbmRleCAxOGViMWQ1Li44MzVkZTc4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItY2luZXBhaworKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItY2luZXBhawpAQCAtMSw0ICsxLDQgQEAKLWNjMDg3OWYxOTkzY2RkNjIzMWUyYzNiOWMyYzAxNWEwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1jaW5lcGFrLm1vdgotODg0MDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItY2luZXBhay5tb3YKLTEyYzQ4MDkxMWViYjg5NzYyZGM0OWFmMDAzYjE3NmM3ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1jaW5lcGFrLm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICA1LjA3IFBTTlI6IDM0LjAyIE1BWERJRkY6ICAgNTkgYnl0ZXM6ICA3NjAzMjAwLyAgIDQ1NjE5MgorNjYzYTI4MDRmNDIxNzA5MjA4Yzc2ZjZlMzRlN2JlYTUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWNpbmVwYWsuYXZpCis0MDA0MDIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItY2luZXBhay5hdmkKKzJjNzYxYzNjOGNkYTA4M2ViOGY1NGIyZGY3MmIyNTdiICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1jaW5lcGFrLm91dC5yYXd2aWRlbworc3RkZGV2OiAgIDgwLjk2IFBTTlI6ICA5Ljk2IE1BWERJRkY6ICAyMjcgYnl0ZXM6ICA3NjAzMjAwLyAgIDkyMTYwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLTJrLWhyLWhxIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLTJrLWhyLWhxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2EwMzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtMmstaHItaHEKQEAgLTAsMCArMSw0IEBACitkZWEwZmI0YmQxNmM1NTI4MzdlNGFkMGRkZDY3MTk0YSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZG54aGQtMmstaHItaHEuZG54aGQKKzQ4OTQ3MjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZG54aGQtMmstaHItaHEuZG54aGQKKzVmYzQzNzhjMWYyZTU3N2U0MzY2YmFhOWIyMmNiZGEzICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC0yay1oci1ocS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS41NiBQU05SOiA0NC4yNiBNQVhESUZGOiAgIDM0IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kbnhoZC00ay1oci1sYiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kbnhoZC00ay1oci1sYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM1NjZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLTRrLWhyLWxiCkBAIC0wLDAgKzEsNCBAQAorOTBhNTllNzYwMDM2MmQxNTY5MjJiZTg5YWE5NjYxOTkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLTRrLWhyLWxiLmRueGhkCiszOTkzNjAwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLTRrLWhyLWxiLmRueGhkCitlZDlkMjdhYTVhOTY4NmNmMDA1NTA4NWM1MTU3ZmY3YSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZG54aGQtNGstaHItbGIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuNTEgUFNOUjogNDQuNTQgTUFYRElGRjogICAzMiBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtNzIwcC1oci1sYiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kbnhoZC03MjBwLWhyLWxiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjgwNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtNzIwcC1oci1sYgpAQCAtMCwwICsxLDQgQEAKK2NlZmUzMTg4MjJiZTgyOGEwM2M5ZWFiOTJmNGIyMTg3ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC03MjBwLWhyLWxiLmRueGhkCis0MDk2MDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZG54aGQtNzIwcC1oci1sYi5kbnhoZAorZDdhNmY0YmRiMzBmMmIyNGJjNmQ0ZGY4OTBlMDM5NTcgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLTcyMHAtaHItbGIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuOTQgUFNOUjogNDIuMzcgTUFYRElGRjogICAzNSBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtZWRnZTEtaHIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtZWRnZTEtaHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3MTI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kbnhoZC1lZGdlMS1ocgpAQCAtMCwwICsxLDQgQEAKK2UwODM3ZTk3M2MxZjAzMzMwZjU3MTk0YmUyNTRlYjYyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1lZGdlMS1oci5kbnhoZAorODE5MjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZG54aGQtZWRnZTEtaHIuZG54aGQKKzNmYzczMTY3MDc5YTEyZTE4MTYxM2I2NTc4NTk4Y2IwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1lZGdlMS1oci5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNy4wMSBQU05SOiAzMS4yMSBNQVhESUZGOiAgMTA3IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kbnhoZC1lZGdlMi1ociBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kbnhoZC1lZGdlMi1ocgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIxMmFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWVkZ2UyLWhyCkBAIC0wLDAgKzEsNCBAQAorY2M3ZDYxMjIxMjM3ZjA4NDkzYzJjNDQwNTc0MjU5M2MgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLWVkZ2UyLWhyLmRueGhkCis4MTkyMCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1lZGdlMi1oci5kbnhoZAorNTgzNzBiM2E2NzFlOWExYWFhM2ZmMGYwNGY2YjY1ZmYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLWVkZ2UyLWhyLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA2Ljc3IFBTTlI6IDMxLjUyIE1BWERJRkY6ICAxMDYgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWVkZ2UzLWhyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWVkZ2UzLWhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjliZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtZWRnZTMtaHIKQEAgLTAsMCArMSw0IEBACis0Yjk2NDlhZjA5MDhjMDI3YzU3NDMyY2JiYWNkNWJjNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZG54aGQtZWRnZTMtaHIuZG54aGQKKzgxOTIwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLWVkZ2UzLWhyLmRueGhkCithMzJkNmNlNmQ2OTNjYmViMzViOTNhOTdmYjY4YzA4OCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZG54aGQtZWRnZTMtaHIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDcuNDUgUFNOUjogMzAuNjggTUFYRElGRjogIDExMSBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtaHItaHEtbW92IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWhyLWhxLW1vdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ5YTNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWhyLWhxLW1vdgpAQCAtMCwwICsxLDQgQEAKK2ExNWE0ZDI2N2RjYWViYTdhMzY2NzMzYmUwYjUwOGRmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1oci1ocS1tb3YubW92Cis0NzcyNTk5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLWhyLWhxLW1vdi5tb3YKKzljMDg3ODM2YjVlMDdiZGRiOTY1MzNkMjc5MzkyMTlmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1oci1ocS1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuNTYgUFNOUjogNDQuMjUgTUFYRElGRjogICAzMyBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtaHItbGItbW92IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWhyLWxiLW1vdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjBmNDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWhyLWxiLW1vdgpAQCAtMCwwICsxLDQgQEAKK2Y4YzM2NjA1MWZiMTYwMjVlOTdmMWJmNzhmMTNlMWFmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1oci1sYi1tb3YubW92CiszNzQ4NTk5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLWhyLWxiLW1vdi5tb3YKKzZkNGNkZDg4MjJlYWQzMDA2OTBhZjljZTUyZGIwMzdjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1oci1sYi1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuNTIgUFNOUjogNDQuNDkgTUFYRElGRjogICAzMyBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtaHItc3EtbW92IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWhyLXNxLW1vdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmZmYmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLWhyLXNxLW1vdgpAQCAtMCwwICsxLDQgQEAKKzg2M2IxNzgwY2ZkYWJmZDcxM2RkZjcyMjc5MmE1ZTYxICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1oci1zcS1tb3YubW92CisyNTYwNzYzIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLWhyLXNxLW1vdi5tb3YKK2JhODZkNDcyYjNmMTYwZTJmMWQwMGNmNTY5MjMxZTNmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC1oci1zcS1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuNTggUFNOUjogNDQuMTMgTUFYRElGRjogICAzNSBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZG54aGQtdWhkLWhyLXNxIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLXVoZC1oci1zcQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM1YTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWRueGhkLXVoZC1oci1zcQpAQCAtMCwwICsxLDQgQEAKKzYzYjRlNjQ1NmQ5OGIxMmQ1ZDg4NjE3ZTIxYTU2MjIwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kbnhoZC11aGQtaHItc3EuZG54aGQKKzEyMDQyMjQwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLXVoZC1oci1zcS5kbnhoZAorNmY0ODBlMmMwYzEwNmIxNzJkNGQ0NzdjYTBjYmExMzAgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWRueGhkLXVoZC1oci1zcS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS41MiBQU05SOiA0NC40NiBNQVhESUZGOiAgIDMzIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kdiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kdgppbmRleCBiYjA2MDJhLi4zMTI3YjU2IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZHYKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWR2CkBAIC0xLDQgKzEsNCBAQAotOTAwMmE1NzY5YTc3NDRhNGI4ZDI0YjAxNzg3YWJjM2IgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWR2LmR2Cis2YTA1OTY5OGYxZjYxOTMxMmRkOTE1MDQ2OTdjY2E5OCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZHYuZHYKIDcyMDAwMDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZHYuZHYKLTIyYTYyZGM5MTA4YzRhOGIxYTNjNzA4ZTVkMzgzNzQ4ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kdi5vdXQucmF3dmlkZW8KLXN0ZGRldjogICAgMS45OSBQU05SOiA0Mi4xMiBNQVhESUZGOiAgIDM4IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKKzUyOGZkNDA3YjZkMTlmNWZlM2IzNDQ2YTMwODBkMTQ4ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kdi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS45OSBQU05SOiA0Mi4xMyBNQVhESUZGOiAgIDM4IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kdi00MTEgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZHYtNDExCmluZGV4IGJkZGE2MzYuLjNjZWU0ZGUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kdi00MTEKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWR2LTQxMQpAQCAtMSw0ICsxLDQgQEAKLTcwMWRhYzhjMWQzZmU2OTk1N2VhYjdiYThkNWVjYjI1ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kdi00MTEuZHYKK2E0YWZkM2M1OTViNDI0MmZiNWYxMzI5YzgyYTBiMGMyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1kdi00MTEuZHYKIDcyMDAwMDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZHYtNDExLmR2Ci1iZjgyMTkzMWJiODFmNGU5MmRjMzhmODZkODE4NzMwMCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZHYtNDExLm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICAzLjQ4IFBTTlI6IDM3LjI4IE1BWERJRkY6ICAgNTYgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMAorMWVmOWJkODliNzJhOTQyYzAyNTcxZjMyYWYwM2JiMDQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWR2LTQxMS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMy40OCBQU05SOiAzNy4yOSBNQVhESUZGOiAgIDU2IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kdi01MCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1kdi01MAppbmRleCBjMjFjNTI1Li43MDdmZDVjIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZHYtNTAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWR2LTUwCkBAIC0xLDQgKzEsNCBAQAotOWI5ZWJkZjM1OTExZGFkNjIyMDNkZmRmMWY1Njc1NGUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWR2LTUwLmR2Cis4Nzc0NjMyOTU0ZTc4MDY5N2M0NzJkOTQ1YzU5N2RhZiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZHYtNTAuZHYKIDE0NDAwMDAwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWR2LTUwLmR2Ci1iNGQzMjRiMjA5NWJjOTE5YWQxNjg5MTg5MWQ0MGIzNiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZHYtNTAub3V0LnJhd3ZpZGVvCi1zdGRkZXY6ICAgIDAuODggUFNOUjogNDkuMjAgTUFYRElGRjogICAxNyBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCisxMTE2N2RlMDVjMjA1Zjk3NGQ0NjJmOTFmNTZlYjgzNyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZHYtNTAub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDAuODYgUFNOUjogNDkuNDMgTUFYRElGRjogICAxNyBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZmZ2MS12My1yZ2I0OCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1mZnYxLXYzLXJnYjQ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4M2MzODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZmZ2MS12My1yZ2I0OApAQCAtMCwwICsxLDQgQEAKKzk5YjM5YjAyODY0MjhjY2Y5Yzc4ODU0NWRmY2NiNDlmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1mZnYxLXYzLXJnYjQ4LmF2aQorMTUwODkyMTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZmZ2MS12My1yZ2I0OC5hdmkKK2I3Mjc4ZDk5ZWE4NGZlOGJlY2YwMmRlNzczZmVlMGE1ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1mZnYxLXYzLXJnYjQ4Lm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAxLjQzIFBTTlI6IDQ0Ljk3IE1BWERJRkY6ICAgMjggYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLWZmdmh1ZmY0MjBwMTIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZmZ2aHVmZjQyMHAxMgppbmRleCA4MmM0NjdhLi5mOTdlZGZiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZmZ2aHVmZjQyMHAxMgorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItZmZ2aHVmZjQyMHAxMgpAQCAtMSw0ICsxLDQgQEAKIDNhYjk1Njc4OTViZjFlYzMxYTgyYWFkZjE2YTVkYTBlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1mZnZodWZmNDIwcDEyLmF2aQogMTA1NjI4MDggdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItZmZ2aHVmZjQyMHAxMi5hdmkKLTU0MjMyN2NiNWNhNzcwODA4NTUxM2ZmYzNkN2M2OTNjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1mZnZodWZmNDIwcDEyLm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICAwLjcyIFBTTlI6IDUwLjg3IE1BWERJRkY6ICAgIDEgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMAorMzZkN2NhOTQzOTE2ZTE3NDNjZWZhNjA5ZWJhMDIwNWMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLWZmdmh1ZmY0MjBwMTIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDAuMDAgUFNOUjo5OTkuOTkgTUFYRElGRjogICAgMCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItbWpwZWcgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItbWpwZWcKaW5kZXggOThiMjU3ZS4uY2Y4MDkzNyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLW1qcGVnCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1tanBlZwpAQCAtMSw0ICsxLDQgQEAKLWM3NjEwMGJkYzNmNGM4ZTI1ODBiYjI2M2FjY2RhOWVjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy5hdmkKLTgzMDE1NCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy5hdmkKKzliZjAwY2QzMTg4YjczOTViNzk4YmIxMGRmMzc2MjQzICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy5hdmkKKzc5Mjc0MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy5hdmkKIDJiOGM1OWM1OWUzM2Q2Y2E3Yzg1ZDMxYzVlZWFiN2JlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgNC44NyBQU05SOiAzNC4zNyBNQVhESUZGOiAgIDU1IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1tanBlZy00MjIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItbWpwZWctNDIyCmluZGV4IGRkZWRkYTYuLmIxNjJiYjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1tanBlZy00MjIKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLW1qcGVnLTQyMgpAQCAtMSw0ICsxLDQgQEAKLTFjOGRkNjVjOTAxY2U0OGVmODJkNzNiODBlMzhjNzM1ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy00MjIuYXZpCi05MjAzNjQgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctNDIyLmF2aQorZTM3NzIwODkyYzllZTlkMDI4NDJjYzUwYmYyMDE4MWUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLW1qcGVnLTQyMi5hdmkKKzg3Nzc4NiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy00MjIuYXZpCiA0YTFiMThlZWI4YjBmM2RjY2MyYzBlNmE5ZjhjODc2ZCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctNDIyLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICA0LjY5IFBTTlI6IDM0LjY5IE1BWERJRkY6ICAgNTUgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLW1qcGVnLTQ0NCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1tanBlZy00NDQKaW5kZXggNDI4ZmVkYy4uYzQ2MWU4NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLW1qcGVnLTQ0NAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItbWpwZWctNDQ0CkBAIC0xLDQgKzEsNCBAQAotMGFjNmQzM2VmMzFkMDdlZWNmNjU5NTVlYWJmMjQxZjcgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLW1qcGVnLTQ0NC5hdmkKLTEwNjAwNzAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctNDQ0LmF2aQorMjhjOTMzMWRhOTQ2YTRiYTc2OTQ3Y2VmMjkwZmUxODQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLW1qcGVnLTQ0NC5hdmkKKzEwMDUwNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctNDQ0LmF2aQogNjQxN2Y1YTRiZTAzY2E3ODU0ZjBhMWJlNDI5YTI4NmUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLW1qcGVnLTQ0NC5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgNC41NyBQU05SOiAzNC45MyBNQVhESUZGOiAgIDU1IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1tanBlZy1odWZmbWFuIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLW1qcGVnLWh1ZmZtYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNmOTk4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1tanBlZy1odWZmbWFuCkBAIC0wLDAgKzEsNCBAQAorOWJmMDBjZDMxODhiNzM5NWI3OThiYjEwZGYzNzYyNDMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLW1qcGVnLWh1ZmZtYW4uYXZpCis3OTI3NDIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctaHVmZm1hbi5hdmkKKzJiOGM1OWM1OWUzM2Q2Y2E3Yzg1ZDMxYzVlZWFiN2JlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy1odWZmbWFuLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA0Ljg3IFBTTlI6IDM0LjM3IE1BWERJRkY6ICAgNTUgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLW1qcGVnLXRyZWxsIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLW1qcGVnLXRyZWxsCmluZGV4IGNlNmQ5MTcuLmUxYWNiMzMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1tanBlZy10cmVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItbWpwZWctdHJlbGwKQEAgLTEsNCArMSw0IEBACi00ZmRiZDIzMjdlZDE2ZmM0NDQ4ZWI0MjFkZWYyMmI1ZSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctdHJlbGwuYXZpCi03NjU2MjggdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctdHJlbGwuYXZpCi1jZTE0NTM5M2JlY2UyNmQ0OTA3NmIyNmNmMWEyZTUyZSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctdHJlbGwub3V0LnJhd3ZpZGVvCithNTlkOTlkMzFkMjQ4NzUxNjE1MDQ4MjBkNDI2NmU0ZCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctdHJlbGwuYXZpCis3MzQ3MjggdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctdHJlbGwuYXZpCis0MjM3NjEyNjIxM2M3M2M4NmI0MDg4ODJlMjRiYTAxNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctdHJlbGwub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDUuMDMgUFNOUjogMzQuMDkgTUFYRElGRjogICA2NyBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItbWpwZWctdHJlbGwtaHVmZm1hbiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1tanBlZy10cmVsbC1odWZmbWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODY3NDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItbWpwZWctdHJlbGwtaHVmZm1hbgpAQCAtMCwwICsxLDQgQEAKK2E1OWQ5OWQzMWQyNDg3NTE2MTUwNDgyMGQ0MjY2ZTRkICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1tanBlZy10cmVsbC1odWZmbWFuLmF2aQorNzM0NzI4IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLW1qcGVnLXRyZWxsLWh1ZmZtYW4uYXZpCis0MjM3NjEyNjIxM2M3M2M4NmI0MDg4ODJlMjRiYTAxNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItbWpwZWctdHJlbGwtaHVmZm1hbi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNS4wMyBQU05SOiAzNC4wOSBNQVhESUZGOiAgIDY3IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1yMjEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXIyMTAKaW5kZXggM2UxOWVmOC4uZGM1ZmYxOCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXIyMTAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXIyMTAKQEAgLTEsNCArMSw0IEBACi01MGU4MjgzMGE5NDE0NTdhM2NhZGUwMTM5NGUzNGRkMCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItcjIxMC5hdmkKKzJmOTI4MDk2ZDg5MmNlMDIzOTgzMmFmYzM2OWUxMTdjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1yMjEwLmF2aQogMjIxMjUyNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItcjIxMC5hdmkKIDJhZGU1ZjYxNjdkN2E0YTE1ODllMTY4ZGRiYmMzNWQwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1yMjEwLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAxLjE3IFBTTlI6IDQ2LjcxIE1BWERJRkY6ICAgMTUgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXJnYiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi1yZ2IKaW5kZXggOTNmZTYzNC4uNmQ0NGIyNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXJnYgorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItcmdiCkBAIC0xLDQgKzEsNCBAQAotNzA3MTU5ZTQ1YTIwYjIyZDM4M2U3MWQzZTU5NjA3NTMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXJnYi5hdmkKKzNmOGYwNDYzNmFhMDI3ZDFmYzgyNDViMDhjN2E4NDE0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1yZ2IuYXZpCiAxNTIxMzI1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi1yZ2IuYXZpCiAzMmZhZTNlNjY1NDA3YmI0MzE3YjNmOTBmZWRiOTAzYyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItcmdiLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAxLjU0IFBTTlI6IDQ0LjM3IE1BWERJRkY6ICAgMTcgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXYyMTAgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdjIxMAppbmRleCBjYzcyYmIyLi4zYmQ0NTk4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdjIxMAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdjIxMApAQCAtMSw0ICsxLDQgQEAKLTIxMWE5MDFkN2U2MzI3Y2M3YTQ4YTgwMjUwYWNmNGY4ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12MjEwLmF2aQorN2E0ZjU4NDA4NjBhZTBiZWMwYzM1NDAyNWI0ODgxMTggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXYyMTAuYXZpCiAxNDc1MjQ1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12MjEwLmF2aQogOTllMzY3YTUwZGE3NWMyYzE4NzIzMDg4OWJlZThlMmUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXYyMTAub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDAuNDAgUFNOUjogNTYuMDYgTUFYRElGRjogICAgOSBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdjIxMC0xMCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12MjEwLTEwCmluZGV4IGRiMzhiMmYuLjRlOTczYWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12MjEwLTEwCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12MjEwLTEwCkBAIC0xLDQgKzEsNCBAQAotMDJhNWQ5ODNkZWI0YmM5MWJiMjczYzJiMjZjMzEwMGYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXYyMTAtMTAuYXZpCitkMDc4Y2IzY2JiYmMwMjJlZDdjNWM0NDgwMjZiMDUwYSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdjIxMC0xMC5hdmkKIDE0NzUyNDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXYyMTAtMTAuYXZpCiA4YmIxYzQ0OWUxYTJhOTRmZDBkOTg4NDFjMDQyNDZiYiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdjIxMC0xMC5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMC4zOSBQU05SOiA1Ni4xNyBNQVhESUZGOiAgICA5IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12MzA4IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXYzMDgKaW5kZXggZjFmZWUyZC4uY2MzNmQ4YSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXYzMDgKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXYzMDgKQEAgLTEsNCArMSw0IEBACi1hMDdjOWUxMjUwOGRlYzkwYTQxNGE0YTYxMTljNWFlNCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdjMwOC5hdmkKKzg2NmZiNTA5NTk3NmQ2MjI3OWM0MDIwMjM1MjZkN2E5ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12MzA4LmF2aQogMTUyMTMyNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdjMwOC5hdmkKIDgzOTQzMjdjMTRlZjBiNmZiYWFlM2I2OWZjYzU1NzJhICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12MzA4Lm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAwLjUwIFBTTlI6IDU0LjEwIE1BWERJRkY6ICAgMTMgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXY0MDggYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdjQwOAppbmRleCA4MDgxMzVmLi42ODhlNGU0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdjQwOAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdjQwOApAQCAtMSw0ICsxLDQgQEAKLTAxNjEyNzUyYTQ0NzgyY2Q5OWJmNjM5OTg3NWQzMTNjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12NDA4LmF2aQorYTliMjViZjZmOTU1OWNkYmU3OTU5MTNjYzY5ZDVjMGYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXY0MDguYXZpCiAyMDI4MjA1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12NDA4LmF2aQogMzZkN2NhOTQzOTE2ZTE3NDNjZWZhNjA5ZWJhMDIwNWMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXY0MDgub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDAuMDAgUFNOUjo5OTkuOTkgTUFYRElGRjogICAgMCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdmMyLTQyMHAgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDItdmMyLTQyMHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1NWU4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIwcApAQCAtMCwwICsxLDQgQEAKK2FjNGRmOTM3ZmVkNzM1MzJiZDg3MTNiMGUwNzg3MGM5ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12YzItNDIwcC5tb3YKKzg2MDc0MyB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12YzItNDIwcC5tb3YKKzAxMzg5ZjdhZTRmMmEzZGMwZDdiODM4NGQ0MzVmZDgzICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12YzItNDIwcC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIwcDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXZjMi00MjBwMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhkOTdkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIwcDEwCkBAIC0wLDAgKzEsNCBAQAorMTE5N2Y4MTA4NjgzYjllYjZiMDc3N2FkYjJkYjFhYTggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjBwMTAubW92CisxMTgxMjcxIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjBwMTAubW92CiswMTM4OWY3YWU0ZjJhM2RjMGQ3YjgzODRkNDM1ZmQ4MyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdmMyLTQyMHAxMC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIwcDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXZjMi00MjBwMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5Y2NiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIwcDEyCkBAIC0wLDAgKzEsNCBAQAorMGU2YjNhZWZkNzBmY2E0NWU2N2RjOGNiYzk5NjQwZTggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjBwMTIubW92CisxNTI1MDc5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjBwMTIubW92CiswMTM4OWY3YWU0ZjJhM2RjMGQ3YjgzODRkNDM1ZmQ4MyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdmMyLTQyMHAxMi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIycCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIycApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzY4OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXZjMi00MjJwCkBAIC0wLDAgKzEsNCBAQAorYjI1NzMzOTllMGVkNjJlZGU2NmIxNzA4ZGU4NjQxMmEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjJwLm1vdgorMTAzNTIwNyB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12YzItNDIycC5tb3YKK2MxNGViMDAzOGE1ZGJhOTM4MmY0MmY3NTBkNDZlZDNjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12YzItNDIycC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4zNSBQU05SOiA1Ny4yMSBNQVhESUZGOiAgICA3IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIycDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXZjMi00MjJwMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5YTBiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIycDEwCkBAIC0wLDAgKzEsNCBAQAorY2E2NWRlMDMzYjE3YzY3YmU5NDM1NmUwYjZlMGIxMjggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjJwMTAubW92CisxMzIxNjg3IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjJwMTAubW92Cis4ZjYyOWU1Y2VhMjRjYzgwNGQ2YWVhZGNlYWNmMGIyYSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdmMyLTQyMnAxMC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4zNyBQU05SOiA1Ni42NiBNQVhESUZGOiAgICA3IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIycDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXZjMi00MjJwMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmOTc4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDIycDEyCkBAIC0wLDAgKzEsNCBAQAorNGU5NTcwNmIwNjNhZGJjYzFmN2Y4MmE0ZTdkN2QwMjcgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjJwMTIubW92CisxNzUyNTM1IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00MjJwMTIubW92Cis3MjQxYjkyMmU3YzE3ZDE0NzAxNTY3ZGI2Yzc0M2E5ZSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdmMyLTQyMnAxMi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC4zNyBQU05SOiA1Ni43MyBNQVhESUZGOiAgICA3IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDQ0cCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDQ0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk3OTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXZjMi00NDRwCkBAIC0wLDAgKzEsNCBAQAorNjQ0YTM5ZDFiODUzZjQ0NzIyYTQzMzJkNWExMzc5N2UgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00NDRwLm1vdgorMTIwMjM4NiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12YzItNDQ0cC5tb3YKKzZiMzVmM2RkYzNiNTJmNDQyNDIzN2Q0MTkxYTI0NjFmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi12YzItNDQ0cC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC40NCBQU05SOiA1NS4wNyBNQVhESUZGOiAgIDEwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDQ0cDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXZjMi00NDRwMTAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q5MzY3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDQ0cDEwCkBAIC0wLDAgKzEsNCBAQAorMzZjZmMzZGEyYWI2ZmY2ZDQ4ZjE3YWI0M2U3Nzc3NGQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00NDRwMTAubW92CisxNjAzOTI3IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00NDRwMTAubW92CitkNWM4MGVlMTg4MWEwMzA2YjA0ODdlM2M4Njg1MjlhMyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdmMyLTQ0NHAxMC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC40OCBQU05SOiA1NC40NiBNQVhESUZGOiAgIDEwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDQ0cDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXZjMi00NDRwMTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwOTgzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi12YzItNDQ0cDEyCkBAIC0wLDAgKzEsNCBAQAorNjExN2MyZWU2ZDVjMjJlZTVhMGIwYWM2YjcwZTZjMTcgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00NDRwMTIubW92CisyMTQ1NDk5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXZjMi00NDRwMTIubW92CiszODgzNmJlNWMxMmI5NTFjOWIyODBkMTVmZTNiMzFjZSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDItdmMyLTQ0NHAxMi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMC40OCBQU05SOiA1NC40NiBNQVhESUZGOiAgIDEwIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi15NDFwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXk0MXAKaW5kZXggZTQwYTBmMy4uMTY0YTg0NSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXk0MXAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXk0MXAKQEAgLTEsNCArMSw0IEBACi0zNDQyNTMwM2EyNzQzM2NmYTJjZjA3NzI1OGMyMWM2OCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDIteTQxcC5hdmkKKzRlZGE2ZGI1MTgwMDFhOGYyYmJiMmVjNGI0MTRiMDVhICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi15NDFwLmF2aQogNzYxMDA1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMi15NDFwLmF2aQogN2M3NjBmZWJmZmNmMWMyZTQzZTQ5NGYzOGIwMTBhZjEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXk0MXAub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDEuMzIgUFNOUjogNDUuNzIgTUFYRElGRjogICAzNCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDIteXV2IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgyLXl1dgppbmRleCAwOGM5NTkzLi43MTk5OTY4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDIteXV2CisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMi15dXYKQEAgLTEsNCArMSw0IEBACi0zZDdlY2ZmNjNjZTQ4NjNhM2QyOTlmZjgyZDkxMGQ3OCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDIteXV2LmF2aQorNWVkYTU1MGZhYzIxZTg5MTNjYmIyYzg4ZTRmMDc5MWEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXl1di5hdmkKIDc2MTAwNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDIteXV2LmF2aQogMzZkN2NhOTQzOTE2ZTE3NDNjZWZhNjA5ZWJhMDIwNWMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgyLXl1di5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1icHAxIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWJwcDEKaW5kZXggNWE2NTcyOC4uNjM5YTJiMSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWJwcDEKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWJwcDEKQEAgLTEsNCArMSw0IEBACi05ODg1MjY0OWM1MjAxZGY3ZDg1ZDBlOWI1YTViOWYxNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtYnBwMS5hdmkKLTE1MzUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWJwcDEuYXZpCi0wYjFlYTIxYjY5ZDM4NDU2NGRkM2E5NzgwNjU0NDNiMiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtYnBwMS5vdXQucmF3dmlkZW8KLXN0ZGRldjogICA5Ny42NCBQU05SOiAgOC4zNCBNQVhESUZGOiAgMjQ4IGJ5dGVzOiAgICA4NjcwMC8gICAgODY3MDAKKzdlYWZhYjAyYTUwMWIzYjBhYzlmODU0Y2QzMzRmNDdhICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1icHAxLmF2aQorMjA0NjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtYnBwMS5hdmkKKzUyYWU3NGVmNzkxMGU1YjYwM2MxMjI4OGQ0MjViOWFlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1icHAxLm91dC5yYXd2aWRlbworc3RkZGV2OiAgIDg0Ljc2IFBTTlI6ICA5LjU3IE1BWERJRkY6ICAyMzIgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWJwcDE1IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWJwcDE1CmluZGV4IGZmZjgwMzcuLmZlNjdlMWEgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1icHAxNQorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtYnBwMTUKQEAgLTEsNCArMSw0IEBACi05YWMyMzZjMTI3NTdjYmY5ZWU2Zjk1YzI0YTM3NDUyNCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtYnBwMTUuYXZpCithZDY3OTEwYmNlZTFmM2ZlNDliYTczMTI0OTlhM2IxNiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtYnBwMTUuYXZpCiAxMjI0NTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtYnBwMTUuYXZpCiA4NWFjMmZhOTgyNTJhZTkwN2I5N2E3YTU2MWNhNjc2ZiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtYnBwMTUub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgMzcuNzYgUFNOUjogMTYuNTkgTUFYRElGRjogIDE1NiBieXRlczogICAgODY3MDAvICAgIDg2NzAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtMmstaHItaHEgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtMmstaHItaHEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3M2JiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC0yay1oci1ocQpAQCAtMCwwICsxLDQgQEAKK2ZhMGNjNThlNjRjOTgxYTQ1ZDFjNmQ2NjdiYTRlNTg0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1kbnhoZC0yay1oci1ocS5kbnhoZAorNDg5NDcyMCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1kbnhoZC0yay1oci1ocS5kbnhoZAorMTEyOGE5Y2YxYTZjY2I0NjE0YmU2OWFkZWY1NTdiZjEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLTJrLWhyLWhxLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA2LjkxIFBTTlI6IDMxLjMzIE1BWERJRkY6ICAgNTAgYnl0ZXM6ICAgIDg2NzAwLyAgICAgODY3MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWRueGhkLTRrLWhyLWxiIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWRueGhkLTRrLWhyLWxiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkODU5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtNGstaHItbGIKQEAgLTAsMCArMSw0IEBACisxZGM3ODg0NjFkZjc5YzJhMWU3YjY0MzA5Y2Q5ZjEzMSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtNGstaHItbGIuZG54aGQKKzM5OTM2MDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtNGstaHItbGIuZG54aGQKKzJkNzBhODQ3Mjg4YzZiMTk0ZTdjMzhmNDJlZDNjODQwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1kbnhoZC00ay1oci1sYi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNi45MiBQU05SOiAzMS4zMiBNQVhESUZGOiAgIDUwIGJ5dGVzOiAgICA4NjcwMC8gICAgIDg2NzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC03MjBwLWhyLWxiIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWRueGhkLTcyMHAtaHItbGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwMDNkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC03MjBwLWhyLWxiCkBAIC0wLDAgKzEsNCBAQAorMDlmOTVlYTA4MDYzNTIwNWE0YjZlNjgxODIyYjI1ZDYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLTcyMHAtaHItbGIuZG54aGQKKzQwOTYwMCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1kbnhoZC03MjBwLWhyLWxiLmRueGhkCitiMzM0OWJhMWJiYTAyODFkNTc1Zjc2NTBhYThlN2M3MiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtNzIwcC1oci1sYi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNi45MiBQU05SOiAzMS4zMiBNQVhESUZGOiAgIDUwIGJ5dGVzOiAgICA4NjcwMC8gICAgIDg2NzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC1lZGdlMS1ociBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC1lZGdlMS1ocgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzU0NDViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWRueGhkLWVkZ2UxLWhyCkBAIC0wLDAgKzEsNCBAQAorMTc4Y2JmMzllZTUzMGJmYTE5MGIzMzJjZTNmYTM0OTggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWVkZ2UxLWhyLmRueGhkCis4MTkyMCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1kbnhoZC1lZGdlMS1oci5kbnhoZAorNzE0ZmQzZjlmNDY3Y2I2MGQ2MDY1NDhiOThlNWQ1MmIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWVkZ2UxLWhyLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA3LjExIFBTTlI6IDMxLjA5IE1BWERJRkY6ICAgNTIgYnl0ZXM6ICAgIDg2NzAwLyAgICAgODY3MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWRueGhkLWVkZ2UyLWhyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWRueGhkLWVkZ2UyLWhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YWViZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtZWRnZTItaHIKQEAgLTAsMCArMSw0IEBACithMTE1NDk0ZmU1NTc0MDc0M2I0YTFhNzVlOGY5NDBlYyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtZWRnZTItaHIuZG54aGQKKzgxOTIwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWVkZ2UyLWhyLmRueGhkCiszYmRmMGRmNGU4MDdmNWMxMDM2MjYxOGJhNTcyOTc4YyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtZWRnZTItaHIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDcuMDggUFNOUjogMzEuMTMgTUFYRElGRjogICA1MiBieXRlczogICAgODY3MDAvICAgICA4NjcwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtZWRnZTMtaHIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtZWRnZTMtaHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjZTcxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC1lZGdlMy1ocgpAQCAtMCwwICsxLDQgQEAKK2RiOTQ5YWQwYzg0MWJjNmNmNjAzNjQ2ZTE0YTVkYTUzICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1kbnhoZC1lZGdlMy1oci5kbnhoZAorODE5MjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtZWRnZTMtaHIuZG54aGQKK2QzNGM0YzQzMjRlNDAzNzBhNzhlYjE3OGM5NzQ1MTI2ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1kbnhoZC1lZGdlMy1oci5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNy4xMiBQU05SOiAzMS4wOCBNQVhESUZGOiAgIDUxIGJ5dGVzOiAgICA4NjcwMC8gICAgIDg2NzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC1oci1ocS1tb3YgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtaHItaHEtbW92Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NmUxNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtaHItaHEtbW92CkBAIC0wLDAgKzEsNCBAQAorY2E0NDJkZTZhYzg5NzFhMWRhMGFmZWQwZWU3ZmJkMTggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWhyLWhxLW1vdi5tb3YKKzQ3NzI1OTkgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtaHItaHEtbW92Lm1vdgorYWEyZTZjMTNhMWU3NzYwYTIyZmNjZmNhOWZhYWNkZjMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWhyLWhxLW1vdi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNi45MiBQU05SOiAzMS4zMiBNQVhESUZGOiAgIDUwIGJ5dGVzOiAgICA4NjcwMC8gICAgIDg2NzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC1oci1sYi1tb3YgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtaHItbGItbW92Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NjljYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtaHItbGItbW92CkBAIC0wLDAgKzEsNCBAQAorOTIxZjE2NzUxOTUwMzIwZDhkYTdhMWRkZTIxNWMyZmYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWhyLWxiLW1vdi5tb3YKKzM3NDg1OTkgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtaHItbGItbW92Lm1vdgorMWE0ZDEyZmQ4OTNlNDU4NTk0NGRkOWM2OGZiMjNlZGYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWhyLWxiLW1vdi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNi45MiBQU05SOiAzMS4zMiBNQVhESUZGOiAgIDUwIGJ5dGVzOiAgICA4NjcwMC8gICAgIDg2NzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC1oci1zcS1tb3YgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtaHItc3EtbW92Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDdjZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtaHItc3EtbW92CkBAIC0wLDAgKzEsNCBAQAorYWE1MWUxYWFmOWJkODg5OWUyODIwOTZkMmRjYjRmMjUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWhyLXNxLW1vdi5tb3YKKzI1NjA3NjMgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtaHItc3EtbW92Lm1vdgorNzMwYzAwY2M1YTI0ZTEzZWU5OWE3NTc4OTgwNmNiMjggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLWhyLXNxLW1vdi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNi45MSBQU05SOiAzMS4zMyBNQVhESUZGOiAgIDUwIGJ5dGVzOiAgICA4NjcwMC8gICAgIDg2NzAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1kbnhoZC11aGQtaHItc3EgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtdWhkLWhyLXNxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Mzk2YzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZG54aGQtdWhkLWhyLXNxCkBAIC0wLDAgKzEsNCBAQAorMDY3YTY2NDAxYjkxNWY1NDE3MWI2NWYwODY4MjJiYmIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWRueGhkLXVoZC1oci1zcS5kbnhoZAorMTIwNDIyNDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtdWhkLWhyLXNxLmRueGhkCis4NDkxY2I2Y2YxMTFmZGVjY2RmNWU0ZjU3MTJhMzNjMSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZG54aGQtdWhkLWhyLXNxLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA2LjkyIFBTTlI6IDMxLjMyIE1BWERJRkY6ICAgNTAgYnl0ZXM6ICAgIDg2NzAwLyAgICAgODY3MApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWZmdjEtdjMtcmdiNDggYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZmZ2MS12My1yZ2I0OApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTdiNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLWZmdjEtdjMtcmdiNDgKQEAgLTAsMCArMSw0IEBACiszYmVjMmY0MzgxZGMzNjJjMjRkMWJiYzMwNGQwYWY1OCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZmZ2MS12My1yZ2I0OC5hdmkKKzI0NDc0MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1mZnYxLXYzLXJnYjQ4LmF2aQorZDM3ZTE1MDdhYmQzMjMzZTI3YjBiMDA0NDExNDlkZGMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWZmdjEtdjMtcmdiNDgub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDMuNTIgUFNOUjogMzcuMTkgTUFYRElGRjogICA1OSBieXRlczogICAgODY3MDAvICAgIDg2NzAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtZmZ2aHVmZjQyMHAxMiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1mZnZodWZmNDIwcDEyCmluZGV4IDcyZDQxMmQuLjIwMWVjNzYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1mZnZodWZmNDIwcDEyCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1mZnZodWZmNDIwcDEyCkBAIC0xLDQgKzEsNCBAQAogZTVhMTc4ZDc1YWZlZGE2ZGYxZDRlYjZmN2NkZmEzYTAgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWZmdmh1ZmY0MjBwMTIuYXZpCiAxNzUyNjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtZmZ2aHVmZjQyMHAxMi5hdmkKLWVlOTVhNDRjY2Q2MTJiNTA1Nzg2MGI0M2ZlOTc3NWQ2ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1mZnZodWZmNDIwcDEyLm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICAwLjY5IFBTTlI6IDUxLjM1IE1BWERJRkY6ICAgIDEgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMAorYTAzOGFkN2MzYzA5Zjc3NjMwNGVmN2FjY2RlYTljNzQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLWZmdmh1ZmY0MjBwMTIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDAuMDAgUFNOUjo5OTkuOTkgTUFYRElGRjogICAgMCBieXRlczogICAgODY3MDAvICAgIDg2NzAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWcgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWcKaW5kZXggYzY5MzM4Zi4uNGIzMzcxZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLW1qcGVnCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1tanBlZwpAQCAtMSw0ICsxLDQgQEAKLTdkN2EyZmE4NTU5YTM2NTJkYjUyYjdhNzAyNjdkMWEzICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1tanBlZy5hdmkKLTY0ODA4IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLmF2aQorZWVjNDM1MzUyNDg1ZmVjMTY3MTc5YTYzNDA1NTA1YmUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLmF2aQorNDgxNTYgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWcuYXZpCiBjNGZlN2EyNjY5YWZiZDk2YzY0MDc0ODY5M2ZjNGUzMCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWcub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDguNjAgUFNOUjogMjkuNDMgTUFYRElGRjogICA1OCBieXRlczogICAgODY3MDAvICAgIDg2NzAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWctNDIyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLW1qcGVnLTQyMgppbmRleCBiNTBlNDc5Li5jMzY0Yzc5IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWctNDIyCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1tanBlZy00MjIKQEAgLTEsNCArMSw0IEBACi0zNGM1NzYzMmQyM2M0MzIyZDJlNTA4MzY4ZTdjOGUzNiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWctNDIyLmF2aQotNjk0NjIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWctNDIyLmF2aQorMzk2Mzk0ZmFiMGQ0NTY0NDNhMzkyOWEzM2Y4YzBkNTkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLTQyMi5hdmkKKzUyNjA2IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLTQyMi5hdmkKIGEzMzI4OTNjYjA2MDNmMmY1MDVmZTVkM2JmMTA1NTE5ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1tanBlZy00MjIub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDguMjMgUFNOUjogMjkuODIgTUFYRElGRjogICA1OCBieXRlczogICAgODY3MDAvICAgIDg2NzAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWctNDQ0IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLW1qcGVnLTQ0NAppbmRleCBkNzAxZjY2Li4wZTM4NzQ0IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWctNDQ0CisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1tanBlZy00NDQKQEAgLTEsNCArMSw0IEBACi0wOTAwMjU4OTUzZTkwYWI5N2E5NWNjYWNjYjdiMGQ4YSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWctNDQ0LmF2aQotNzA1ODggdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWctNDQ0LmF2aQorM2YyZGNhN2JlNzg5ZWI3ODE4YzY5ZWM3MTZjMGQ4MzEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLTQ0NC5hdmkKKzUzOTU4IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLTQ0NC5hdmkKIDc5YTkwMWYyZWQ4NWQ4MmNmMWM2NzRmYWIzZDNlZjcyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1tanBlZy00NDQub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDguMjEgUFNOUjogMjkuODQgTUFYRElGRjogICA1OCBieXRlczogICAgODY3MDAvICAgIDg2NzAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWctaHVmZm1hbiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1tanBlZy1odWZmbWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNGExYTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWctaHVmZm1hbgpAQCAtMCwwICsxLDQgQEAKK2VlYzQzNTM1MjQ4NWZlYzE2NzE3OWE2MzQwNTUwNWJlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1tanBlZy1odWZmbWFuLmF2aQorNDgxNTYgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWctaHVmZm1hbi5hdmkKK2M0ZmU3YTI2NjlhZmJkOTZjNjQwNzQ4NjkzZmM0ZTMwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1tanBlZy1odWZmbWFuLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA4LjYwIFBTTlI6IDI5LjQzIE1BWERJRkY6ICAgNTggYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLW1qcGVnLXRyZWxsIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLW1qcGVnLXRyZWxsCmluZGV4IDkxNzhkMDIuLjViMzg2YzcgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1tanBlZy10cmVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWctdHJlbGwKQEAgLTEsNCArMSw0IEBACi02ZjgxNWFjYjhmY2U1NDU4NTYxYWE5MDI3MDNlNjE4OSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWctdHJlbGwuYXZpCi02Mzk5NCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1tanBlZy10cmVsbC5hdmkKLTRmZWQxZTEyYzgwZGY3YjY3ZGYyOTJiMTUzYzNjZjE2ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1tanBlZy10cmVsbC5vdXQucmF3dmlkZW8KLXN0ZGRldjogICAgOC4yNyBQU05SOiAyOS43NyBNQVhESUZGOiAgIDYxIGJ5dGVzOiAgICA4NjcwMC8gICAgODY3MDAKKzQ4NGZhMzM3YjcxYzA2YTAyMDYyNDM4MTRjNDg5NGIwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1tanBlZy10cmVsbC5hdmkKKzQ3ODE2IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLXRyZWxsLmF2aQorZjBjY2ZlNDU4NGQxOTNmZDZkNjkwYTg1YTcwZGIxODggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLXRyZWxsLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA4LjI3IFBTTlI6IDI5Ljc4IE1BWERJRkY6ICAgNTUgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLW1qcGVnLXRyZWxsLWh1ZmZtYW4gYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtbWpwZWctdHJlbGwtaHVmZm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTkwMjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLW1qcGVnLXRyZWxsLWh1ZmZtYW4KQEAgLTAsMCArMSw0IEBACis0ODRmYTMzN2I3MWMwNmEwMjA2MjQzODE0YzQ4OTRiMCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWctdHJlbGwtaHVmZm1hbi5hdmkKKzQ3ODE2IHRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLW1qcGVnLXRyZWxsLWh1ZmZtYW4uYXZpCitmMGNjZmU0NTg0ZDE5M2ZkNmQ2OTBhODVhNzBkYjE4OCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtbWpwZWctdHJlbGwtaHVmZm1hbi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgOC4yNyBQU05SOiAyOS43OCBNQVhESUZGOiAgIDU1IGJ5dGVzOiAgICA4NjcwMC8gICAgODY3MDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1yMjEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXIyMTAKaW5kZXggY2RiZGIyOC4uNzVjNDI0YyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXIyMTAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXIyMTAKQEAgLTEsNCArMSw0IEBACi00MGI5MzgwNGQ1MjFlMmI3YzgyYTMwNjBkZWM4MTIyMSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtcjIxMC5hdmkKKzIyOWU3MDBlMGZhYjRlODE0ODFlOTlhNzBlMDBiZWM5ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1yMjEwLmF2aQogNDQyMDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLXIyMTAuYXZpCiBlMWQ4ODJiYWJjODc1NGY3NDE4YWE5MWNlNDhmN2FiMCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtcjIxMC5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMy40OCBQU05SOiAzNy4yOCBNQVhESUZGOiAgIDQyIGJ5dGVzOiAgICA4NjcwMC8gICAgODY3MDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1yZ2IgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtcmdiCmluZGV4IGMwYTg1NjMuLjFhODgyY2UgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy1yZ2IKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXJnYgpAQCAtMSw0ICsxLDQgQEAKLWEyY2I4NjAwN2I4OTQ1ZTJkMTM5OWI1NjU4NWI5ODNhICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1yZ2IuYXZpCi0xODAyNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtcmdiLmF2aQorM2UyOTA5YTY5ODY1ZWI4OGRmNzI5MTZjMzhkMjY1ZGUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLXJnYi5hdmkKKzE4MzY1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy1yZ2IuYXZpCiA2OTNhZmYxMGMwOTRmOGJkMzE2OTNmNzRjZjc5ZDJiMiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtcmdiLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAzLjY3IFBTTlI6IDM2LjgyIE1BWERJRkY6ICAgNDMgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXYyMTAgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjIxMAppbmRleCA2NThmOTBjLi5mNTI4MmVlIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjIxMAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjIxMApAQCAtMSw0ICsxLDQgQEAKLWRmMGFlNmNhZmMxYWVkYmYxNzE3NmViNDRhNzMyZTRkICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy12MjEwLmF2aQorNjgyNGY5NDFlZDA3OTk1MmNkZjIyY2M5Y2RmYWEzNWQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLXYyMTAuYXZpCiAyMjQ0NTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtdjIxMC5hdmkKIDE5OGZmYjI0YzA2OTI3ZDhhYWFjNWU1OWQ4MWEwOTM0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy12MjEwLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAyLjExIFBTTlI6IDQxLjYxIE1BWERJRkY6ICAgMjcgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXYyMTAtMTAgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjIxMC0xMAppbmRleCAxYTY2NGFmLi40NmZlMjRkIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjIxMC0xMAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjIxMC0xMApAQCAtMSw0ICsxLDQgQEAKLWI2OGFkMTZlM2JmZDc4NTU2YjgxNmVjMWE2NzY0NDVjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy12MjEwLTEwLmF2aQorODNlZWY3MDA0ZjgxYTJmOTUyOTk0MWVkMjc1NTQ1MDkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLXYyMTAtMTAuYXZpCiAyMjQ0NTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtdjIxMC0xMC5hdmkKIDBjZjdjZjY4NzI0ZmE1MTQ2YjE2NjdlNGZhMDhiMGUxICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy12MjEwLTEwLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAyLjEyIFBTTlI6IDQxLjU4IE1BWERJRkY6ICAgMjYgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXYzMDggYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjMwOAppbmRleCAzNDdkNDc1Li5iODIzYzdiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjMwOAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjMwOApAQCAtMSw0ICsxLDQgQEAKLTA3M2UyNGNjMDBhMjc0MzZlOTdlMGIyNDJkNGZkMDc3ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy12MzA4LmF2aQorZTEyNTkyODczNzVkMDU0MzFlZTcxOGU1MGViN2YzN2IgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLXYzMDguYXZpCiAxODAyNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtdjMwOC5hdmkKIDAyYTg1ZWMwNzM3N2RmNmI0ODMyODEwMzhmODg4MmVlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy12MzA4Lm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAzLjA2IFBTTlI6IDM4LjQwIE1BWERJRkY6ICAgNDAgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXY0MDggYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjQwOAppbmRleCAyZGEwOWUxLi5iNjRmN2Q4IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjQwOAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMtdjQwOApAQCAtMSw0ICsxLDQgQEAKLWU3NGExYWJmNzNiOWRmOTBmNTEwM2Q5MDFiMzcxODVmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy12NDA4LmF2aQorYzc1ZmM2OWMxOWM2YzU3OGVjOTVjMzk3MmY0YWYzMzkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLXY0MDguYXZpCiAyMzgwNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMtdjQwOC5hdmkKIGEwMzhhZDdjM2MwOWY3NzYzMDRlZjdhY2NkZWE5Yzc0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy12NDA4Lm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXl1diBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoMy15dXYKaW5kZXggYWEyY2YyZi4uY2VlYjEwNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGgzLXl1dgorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aDMteXV2CkBAIC0xLDQgKzEsNCBAQAotMDgwNDAxNjQ3ZjRiMDhkZjRmYjQ0YTI1M2M5MTRjYzAgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGgzLXl1di5hdmkKKzc5MzVmZWU2MGQzZWI1NjdiYWYzMTI5MDA2MTZkZWMwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy15dXYuYXZpCiA5MzU1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoMy15dXYuYXZpCiBhMDM4YWQ3YzNjMDlmNzc2MzA0ZWY3YWNjZGVhOWM3NCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aDMteXV2Lm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICAgIDg2NzAwLyAgICA4NjcwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1icHAxIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1icHAxCmluZGV4IDYzYWI5ZTEuLmEzNzcyNTUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtYnBwMQorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWJwcDEKQEAgLTEsNCArMSw0IEBACi0yODU5MDIyZmFjNDUyYjU5ZTQ5YTExODljNGZiYjNlYyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWJwcDEuYXZpCi02NDA0NTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWJwcDEuYXZpCi0zYmUzNDk3ZjhjYTU0OGM5MTk2ZGNlY2M1YmM3Y2IyYiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWJwcDEub3V0LnJhd3ZpZGVvCi1zdGRkZXY6ICAgOTYuNTIgUFNOUjogIDguNDQgTUFYRElGRjogIDIzMSBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCis4ZGM5MDY5NmRhYmYyMjBhOGY0NDEzYWYyMGU5MzA3MyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWJwcDEuYXZpCis2NDA0NjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWJwcDEuYXZpCis2MTgzYmE4NjFkNGU0OGQ0YWFlZmM1MTRmZGUyNzBlNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWJwcDEub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgODMuMjggUFNOUjogIDkuNzIgTUFYRElGRjogIDIxNSBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWJwcDE1IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1icHAxNQppbmRleCA5NmRiZjZkLi42NWJmZjBiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWJwcDE1CisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtYnBwMTUKQEAgLTEsNCArMSw0IEBACi1iMWIyZGQzNWJjYjNkNWMyMDY1MWZmZTBkYTU1Y2I0NiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWJwcDE1LmF2aQorNjQ1MTZiYTk0N2Q1MzFkYjJiY2NjMmVjYzMzOGI3YmUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1icHAxNS5hdmkKIDEwMTQ0NDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1icHAxNS5hdmkKIGNjZjZmYzUwN2U5MzhlOGNjNWMyYTk3YjY0NGRlNTFjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtYnBwMTUub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgMzIuODQgUFNOUjogMTcuODAgTUFYRElGRjogICA5MiBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWNpbmVwYWsgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWNpbmVwYWsKaW5kZXggMzliMWQ2OC4uNmIwMjE2NyAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1jaW5lcGFrCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtY2luZXBhawpAQCAtMSw0ICsxLDQgQEAKLWUzODM3MDE4Zjg0OTI5ZjA3MDE5YWUyZWNjZDMwM2UyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtY2luZXBhay5tb3YKLTg4OTAwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1jaW5lcGFrLm1vdgotZjU0ZmZhNzBmMzM1YWM3YjcwMWQ3YWUzNDQ2MmUwMDEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1jaW5lcGFrLm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICA0LjA5IFBTTlI6IDM1Ljg4IE1BWERJRkY6ICAgNDYgYnl0ZXM6ICA3NjAzMjAwLyAgIDQ1NjE5MgorYTllYTE5ZWIwZDIzOWE1M2FmODYzMGQ1YmM0MTY3ZDAgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1jaW5lcGFrLmF2aQorNDA3NTc0IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1jaW5lcGFrLmF2aQorZTMyZDQxMDMxOTQ2NjVkMmVhMGY0NmQ1Y2RkMGNkZjIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1jaW5lcGFrLm91dC5yYXd2aWRlbworc3RkZGV2OiAgIDU4LjEwIFBTTlI6IDEyLjg1IE1BWERJRkY6ICAxODUgYnl0ZXM6ICA3NjAzMjAwLyAgIDkyMTYwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kbnhoZC0yay1oci1ocSBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtMmstaHItaHEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1N2VjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtMmstaHItaHEKQEAgLTAsMCArMSw0IEBACithZWE1OWIwNGQwZTViMDk1NTU5ZDRmMzA3OWJlMjA4YyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWRueGhkLTJrLWhyLWhxLmRueGhkCis0ODk0NzIwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC0yay1oci1ocS5kbnhoZAorYTAwMWRkNTIxZTdhYzM5N2Y4ODA3NzY1M2IxZjVhZDAgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC0yay1oci1ocS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS4zNCBQU05SOiA0NS41NiBNQVhESUZGOiAgIDIzIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtNGstaHItbGIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLTRrLWhyLWxiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NzgyNzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLTRrLWhyLWxiCkBAIC0wLDAgKzEsNCBAQAorYzE2NmY1ZTEzNTU3ODRlYWU4YjgyYmJhZWVmNzkyNzMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC00ay1oci1sYi5kbnhoZAorMzk5MzYwMCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtNGstaHItbGIuZG54aGQKKzQ5YzIyZDNlYjlkZTAxOTRiNTcyZjc1NDkxNDQ0NzcyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtNGstaHItbGIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuMzAgUFNOUjogNDUuODIgTUFYRElGRjogICAyMSBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLTcyMHAtaHItbGIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLTcyMHAtaHItbGIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY5M2M0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtNzIwcC1oci1sYgpAQCAtMCwwICsxLDQgQEAKKzJjYzM4N2FmZDNlNWEyNDRkY2E0NWFkZDFlMDc0MmJiICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtNzIwcC1oci1sYi5kbnhoZAorNDA5NjAwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC03MjBwLWhyLWxiLmRueGhkCis4YTdmZTkzZDFmYjI5NzFkODJkZDhjOGYxNDQ5ODU2NyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWRueGhkLTcyMHAtaHItbGIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuNjMgUFNOUjogNDMuODYgTUFYRElGRjogICAyMyBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWVkZ2UxLWhyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kbnhoZC1lZGdlMS1ocgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWJjMGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kbnhoZC1lZGdlMS1ocgpAQCAtMCwwICsxLDQgQEAKK2MyODAyYjhhMjYyZmQ2ZmMzMDRkMDE4MTlhZDQ5ZjMxICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtZWRnZTEtaHIuZG54aGQKKzgxOTIwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC1lZGdlMS1oci5kbnhoZAorMTI4MTg5NDEwMjhhMDAwMzY3NTYwMzFlNDI2OGU5YWYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC1lZGdlMS1oci5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNC45NCBQU05SOiAzNC4yNSBNQVhESUZGOiAgIDc4IGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtZWRnZTItaHIgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWVkZ2UyLWhyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YjhjMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWVkZ2UyLWhyCkBAIC0wLDAgKzEsNCBAQAorZTg0NjAyNzIwZGE4OTMzZGQ2OGVmNDgwZmI3ODU3YzAgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC1lZGdlMi1oci5kbnhoZAorODE5MjAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWRueGhkLWVkZ2UyLWhyLmRueGhkCis4Njc4NGE4NTEzMWE5NzVjZjY1NmM2MzAwOWQzMjQyZCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWRueGhkLWVkZ2UyLWhyLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA0LjcwIFBTTlI6IDM0LjY4IE1BWERJRkY6ICAgNzkgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kbnhoZC1lZGdlMy1ociBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtZWRnZTMtaHIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkYWQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtZWRnZTMtaHIKQEAgLTAsMCArMSw0IEBACithMGFkMWY0NDMzYjlhYjI1M2ZjNzhlOTZlNzVjZTAyNCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWRueGhkLWVkZ2UzLWhyLmRueGhkCis4MTkyMCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtZWRnZTMtaHIuZG54aGQKK2E2ZGU3Nzc4OWEyZTA0ZDg1Y2MwZTg2YzIxYjBjMmVjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtZWRnZTMtaHIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDUuMDkgUFNOUjogMzMuOTggTUFYRElGRjogICA4NCBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWhyLWhxLW1vdiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtaHItaHEtbW92Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZWE3NjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWhyLWhxLW1vdgpAQCAtMCwwICsxLDQgQEAKK2IyMzI3NzVlMDRjNmE2YTc5OTU3OTlkYjZjZDhjMjU1ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtaHItaHEtbW92Lm1vdgorNDc3MjU5OSB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtaHItaHEtbW92Lm1vdgorZTZjMzUzMWNiMzJlYjNkMGM0NjVjNDQwOTg3NDZmZWEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC1oci1ocS1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuMzQgUFNOUjogNDUuNTQgTUFYRElGRjogICAyMyBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWhyLWxiLW1vdiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtaHItbGItbW92Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODJiODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWhyLWxiLW1vdgpAQCAtMCwwICsxLDQgQEAKKzJjNjg4MWViYjhlZmRiMDIxODk4NjJmNjdjZDcyODUxICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtaHItbGItbW92Lm1vdgorMzc0ODU5OSB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtaHItbGItbW92Lm1vdgorMDk1MWRlMDBiOTBkMWJmMzRkMmZmMTBhNTFkYjcwNWQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC1oci1sYi1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuMzEgUFNOUjogNDUuNzIgTUFYRElGRjogICAyMSBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWhyLXNxLW1vdiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtaHItc3EtbW92Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTY4OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLWhyLXNxLW1vdgpAQCAtMCwwICsxLDQgQEAKK2IzYjIzODBiMDE5ZjBmNjU1YWY1ZDYxY2FhNzZjZjEyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtaHItc3EtbW92Lm1vdgorMjU2MDc2MyB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtaHItc3EtbW92Lm1vdgorOTVlN2RhNDZmYzA2NmVkNzk1ZGU0ZWMxY2Y0ZDRhYjUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kbnhoZC1oci1zcS1tb3Yub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDEuMzUgUFNOUjogNDUuNTEgTUFYRElGRjogICAyMyBieXRlczogIDc2MDMyMDAvICAgNzYwMzIwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLXVoZC1oci1zcSBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZG54aGQtdWhkLWhyLXNxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5Y2Y4YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWRueGhkLXVoZC1oci1zcQpAQCAtMCwwICsxLDQgQEAKKzVhZTMwNzI4MjBlMjE3ZTIxY2E5YTgxOGQ5MTUwYWNjICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtdWhkLWhyLXNxLmRueGhkCisxMjA0MjI0MCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZG54aGQtdWhkLWhyLXNxLmRueGhkCis3N2M2YTdmZWI0M2Q2ZWZmOTRiYWYwODU3MDM2OGJkYSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWRueGhkLXVoZC1oci1zcS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS4zMiBQU05SOiA0NS42OSBNQVhESUZGOiAgIDIxIGJ5dGVzOiAgNzYwMzIwMC8gICA3NjAzMjAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZHYgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWR2CmluZGV4IGFkMDU0OWYuLmE4MDQxZjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZHYKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kdgpAQCAtMSw0ICsxLDQgQEAKLTg1YjhkNTViMGI2OGJiM2ZjMmU5MGJhYmI1ODBmOWI3ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZHYuZHYKK2FiMDMyNDFlOTg4ZGNkNWJkMzZhNzZiMjUzNzIzNDNmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZHYuZHYKIDcyMDAwMDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWR2LmR2Ci03ZGFjNDIwNjM3MzYwYjAzMWNjYWU3YzVhNjljNWUwYyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWR2Lm91dC5yYXd2aWRlbwotc3RkZGV2OiAgICAxLjcwIFBTTlI6IDQzLjQ3IE1BWERJRkY6ICAgMzMgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMAorNmU0YjkwYmUzOWFkNDA4ZGRjMWMwZGM0Y2VkNDBiZjAgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kdi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMS42OSBQU05SOiA0My41NCBNQVhESUZGOiAgIDMzIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZHYtNDExIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kdi00MTEKaW5kZXggNzM2YTM1ZC4uMTY0ZGQzNSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kdi00MTEKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kdi00MTEKQEAgLTEsNCArMSw0IEBACi1lNDI4NTA4ZjQwMDMyN2FlYjk2OTY5YzA4ZmI5ZTFiNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWR2LTQxMS5kdgorMWE3ZjA5MTk5M2ViNmZlNWI2ZjlkOTI3YmE2MDM4N2QgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kdi00MTEuZHYKIDcyMDAwMDAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWR2LTQxMS5kdgotNzEzZWQ5MDdmZGU0NDhjNjAzZDZlOWFlZTVlZmVkZDEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kdi00MTEub3V0LnJhd3ZpZGVvCi1zdGRkZXY6ICAgIDIuODkgUFNOUjogMzguOTEgTUFYRElGRjogICA0NSBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCitlNTYyNGYzZDRkZTk2ZTUxNGFjOWI5NmMyYjRiNDQ3YyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWR2LTQxMS5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgMi44NyBQU05SOiAzOC45NyBNQVhESUZGOiAgIDQ1IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZHYtNTAgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWR2LTUwCmluZGV4IGFkZWU2MjguLjIxNDlmZDUgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZHYtNTAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1kdi01MApAQCAtMSw0ICsxLDQgQEAKLTAwMzJhMDcxNjcxOTllNmY0OWUwN2ZhN2VkNGQ1ZjYyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZHYtNTAuZHYKK2M2NzhiMjkxZTU4YTI3NzcyNWFhNDU1NzM4N2VmYzU4ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZHYtNTAuZHYKIDE0NDAwMDAwIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kdi01MC5kdgotNTZjNzdlNTM3MjkxNTM2YjI0Mjg1N2QxMDU2ZGUzMGMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1kdi01MC5vdXQucmF3dmlkZW8KLXN0ZGRldjogICAgMC44MiBQU05SOiA0OS44MiBNQVhESUZGOiAgIDEyIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKK2JkYTRmOThmMzg3ZjgyOTg2ZTUyMWI3OGE5YmMxZWVmICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZHYtNTAub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDAuNzggUFNOUjogNTAuMjggTUFYRElGRjogICAxMiBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWZmdjEtdjMtcmdiNDggYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWZmdjEtdjMtcmdiNDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI5ZDY4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZmZ2MS12My1yZ2I0OApAQCAtMCwwICsxLDQgQEAKKzI5NGQ0ZjlmZGY1M2JhMGZlOWQyMjRkMjhiYTcwMGYwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtZmZ2MS12My1yZ2I0OC5hdmkKKzEzNzk1MDM2IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1mZnYxLXYzLXJnYjQ4LmF2aQorN2JkODJkMTg2MDA5NWFlMWUxMGVjMGFjZTljYjA0YjYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1mZnYxLXYzLXJnYjQ4Lm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjkxIFBTTlI6IDQ4LjkxIE1BWERJRkY6ICAgMjEgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1mZnYxLXYzLXl1djQyMCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZmZ2MS12My15dXY0MjAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYjQzN2UuLjAwMDAwMDAKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1mZnYxLXYzLXl1djQyMAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZWQ3MmMyMjM3NDcxODU4OWZmYWNkN2VhMTU0MjQ2ODcgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1mZnYxLXYzLXl1djQyMC5hdmkKLTM1NDc3OTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWZmdjEtdjMteXV2NDIwLmF2aQotZGRlNTg5NTgxN2FkOWQyMTlmNzlhNTJkMGJkZmIwMDEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1mZnYxLXYzLXl1djQyMC5vdXQucmF3dmlkZW8KLXN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZmZ2aHVmZjQyMHAxMiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtZmZ2aHVmZjQyMHAxMgppbmRleCBlOGVhNGJjLi5lNzc2OThiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLWZmdmh1ZmY0MjBwMTIKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1mZnZodWZmNDIwcDEyCkBAIC0xLDQgKzEsNCBAQAogYjJmM2QwNGNhMzBjMTEzYjc5ODc3YmI1NTE4ZGQ2ZWEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1mZnZodWZmNDIwcDEyLmF2aQogMTA5MjU1ODAgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWZmdmh1ZmY0MjBwMTIuYXZpCi0wOGIzYzZjNzBlYmE2MDhiYWU5MjY2MDhmZjI1M2YyYSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWZmdmh1ZmY0MjBwMTIub3V0LnJhd3ZpZGVvCi1zdGRkZXY6ICAgIDAuNjggUFNOUjogNTEuMzggTUFYRElGRjogICAgMSBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCitkZGU1ODk1ODE3YWQ5ZDIxOWY3OWE1MmQwYmRmYjAwMSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLWZmdmh1ZmY0MjBwMTIub3V0LnJhd3ZpZGVvCitzdGRkZXY6ICAgIDAuMDAgUFNOUjo5OTkuOTkgTUFYRElGRjogICAgMCBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLW1qcGVnIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1tanBlZwppbmRleCAxNDg3NjQxLi5lMzBkZGM3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLW1qcGVnCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtbWpwZWcKQEAgLTEsNCArMSw0IEBACi00MGM1YmExYjE1MDA2Nzk5NzczNjE3Zjg4OGMyODA4YiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLW1qcGVnLmF2aQotNjczMTc4IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy5hdmkKKzAwN2M5ODlhZjYyMTQ0NWRjN2M5YmQyNDhiOWRmM2I0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWcuYXZpCis2MzU0OTggdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLW1qcGVnLmF2aQogOWQ0YmQ5MGU5YWJmYTE4MTkyMzgzYjRhZGMyM2M4ZDQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgNC4zMiBQU05SOiAzNS40MCBNQVhESUZGOiAgIDQ5IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtbWpwZWctNDIyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1tanBlZy00MjIKaW5kZXggMjNkZDFhMi4uZjk0YWU1OCAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1tanBlZy00MjIKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1tanBlZy00MjIKQEAgLTEsNCArMSw0IEBACi00YTFmNzJjZjRjOGU1NjJmNGU4MDVmMGM3OTEyNTE1YiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLW1qcGVnLTQyMi5hdmkKLTc0NjUzNCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctNDIyLmF2aQorZTg2N2JjNWU4ZTRlNDU1NTg0NmM2MWIzY2I0NTgwYTYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy00MjIuYXZpCis3MDczNzYgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLW1qcGVnLTQyMi5hdmkKIDQ1MWFjODA5ODljNGUxNDQ0NWNmOTUxZmQ3ZjgzYjZkICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctNDIyLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICA0LjE4IFBTTlI6IDM1LjcwIE1BWERJRkY6ICAgNDkgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1tanBlZy00NDQgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLW1qcGVnLTQ0NAppbmRleCAxZGMxMDNjLi5jYjRjMGExIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLW1qcGVnLTQ0NAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLW1qcGVnLTQ0NApAQCAtMSw0ICsxLDQgQEAKLTk2OWFjMTRjYmM3N2Q1NDc1ZjQ4NzFjZWZlM2NjNmIwICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctNDQ0LmF2aQotODUxNDQ2IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy00NDQuYXZpCis5YTM2YjIwMWM0ZjY4MDUxNDQxYjFlZTEzMDdhMmNjMiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLW1qcGVnLTQ0NC5hdmkKKzgwNzYyOCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctNDQ0LmF2aQogMzRlZGNiOWM4N2ZmN2FhYzQ1NmE0ZmIwN2Y0MzUwNGIgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy00NDQub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDQuMDUgUFNOUjogMzUuOTYgTUFYRElGRjogICA0OSBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLW1qcGVnLWh1ZmZtYW4gYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLW1qcGVnLWh1ZmZtYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjMWI3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtbWpwZWctaHVmZm1hbgpAQCAtMCwwICsxLDQgQEAKKzAwN2M5ODlhZjYyMTQ0NWRjN2M5YmQyNDhiOWRmM2I0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctaHVmZm1hbi5hdmkKKzYzNTQ5OCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctaHVmZm1hbi5hdmkKKzlkNGJkOTBlOWFiZmExODE5MjM4M2I0YWRjMjNjOGQ0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctaHVmZm1hbi5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNC4zMiBQU05SOiAzNS40MCBNQVhESUZGOiAgIDQ5IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtbWpwZWctdHJlbGwgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLW1qcGVnLXRyZWxsCmluZGV4IGQzN2Q1YTIuLjg2MzMyYjIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtbWpwZWctdHJlbGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1tanBlZy10cmVsbApAQCAtMSw0ICsxLDQgQEAKLTYxYzEyYjVlMGY5NWMzNTJjMWZmMmYzYjk1ZDg4Mjc0ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctdHJlbGwuYXZpCi02MTM2MTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLW1qcGVnLXRyZWxsLmF2aQotZWU0OTk5ZmNjMDkxM2UwMWU2OWZlNjg5YjQyMjljYmUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy10cmVsbC5vdXQucmF3dmlkZW8KLXN0ZGRldjogICAgNC41MSBQU05SOiAzNS4wMyBNQVhESUZGOiAgIDYwIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKKzZlYjM2YWIyOGEwODJmNDk2ZjFmM2JjMTY1NzA0YTY4ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtbWpwZWctdHJlbGwuYXZpCis1ODI1MzQgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLW1qcGVnLXRyZWxsLmF2aQorZGNiMTgzYTZhNWZhMDZlNzIzNGQ0NmRkOTdjZWI4ZWMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy10cmVsbC5vdXQucmF3dmlkZW8KK3N0ZGRldjogICAgNC41MSBQU05SOiAzNS4wNSBNQVhESUZGOiAgIDYwIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtbWpwZWctdHJlbGwtaHVmZm1hbiBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtbWpwZWctdHJlbGwtaHVmZm1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWZjZDE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1tanBlZy10cmVsbC1odWZmbWFuCkBAIC0wLDAgKzEsNCBAQAorNmViMzZhYjI4YTA4MmY0OTZmMWYzYmMxNjU3MDRhNjggKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy10cmVsbC1odWZmbWFuLmF2aQorNTgyNTM0IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy10cmVsbC1odWZmbWFuLmF2aQorZGNiMTgzYTZhNWZhMDZlNzIzNGQ0NmRkOTdjZWI4ZWMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS1tanBlZy10cmVsbC1odWZmbWFuLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICA0LjUxIFBTTlI6IDM1LjA1IE1BWERJRkY6ICAgNjAgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1yMjEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1yMjEwCmluZGV4IDNlZDMwZmYuLjhmZDFhNjYgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtcjIxMAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXIyMTAKQEAgLTEsNCArMSw0IEBACi1lNWY5NmExZDBmZTVjNTE5ZjZjYjk1NDgzOGUxMDViYyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXIyMTAuYXZpCis5NDg3NGE0ODk4N2ZkNDAxNDk0ZjRkN2NhOGUxMjczYiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXIyMTAuYXZpCiAyMjEyNTI1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtcjIxMC5hdmkKIDZlYTRmY2Q5M2ZjODNkZWZjODc3MGU4NWI2NGI2MGJiICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtcjIxMC5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMC43MCBQU05SOiA1MS4xMiBNQVhESUZGOiAgIDEyIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtcmdiIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1yZ2IKaW5kZXggOTcwNmZmYi4uZjNkMjMyZSAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1yZ2IKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS1yZ2IKQEAgLTEsNCArMSw0IEBACi1mMDgzZTgxMjIxNjE5NWMxZTk0NTRiNWZhYzY4MWM5MiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXJnYi5hdmkKKzZmZmJiZDY5MzliM2ZlOWY1ZGNmMDM2ZWU0NmFhZDJkICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtcmdiLmF2aQogMTUyMTMyNTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXJnYi5hdmkKIDk4ZDBlMjg1NDczMTQ3MmM1YmYxM2Q4NjM4NTAyZDBhICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtcmdiLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAxLjI2IFBTTlI6IDQ2LjEwIE1BWERJRkY6ICAgMTMgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12MjEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12MjEwCmluZGV4IGVmNTAyMGIuLjU0OWJmNDMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdjIxMAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXYyMTAKQEAgLTEsNCArMSw0IEBACi0yMGFmOGI5ODY3MDRiOTcxM2NkNzVkM2U2ZTQxZWZhNCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXYyMTAuYXZpCiswZTBkYjU4ZmEyNjljZmZiZmIxNWY4MTI3N2ZhMjgyOCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXYyMTAuYXZpCiAxNDc1MjQ1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdjIxMC5hdmkKIDdiYTZlNDExZTQzYzZiNTdjOTVjNDlkNjg0OGY0MWU2ICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdjIxMC5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMC4zNCBQU05SOiA1Ny40MSBNQVhESUZGOiAgICA2IGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdjIxMC0xMCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdjIxMC0xMAppbmRleCAxZTU3MzJiLi45NTQxYjU3IDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXYyMTAtMTAKKysrIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12MjEwLTEwCkBAIC0xLDQgKzEsNCBAQAotYTM5MTNiNzE5Mzk3ZmFlODcwYzFkOWJjMzUwNTMyNTkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12MjEwLTEwLmF2aQorMGQ2MzhjNTc1Yzc3ODRjMmQ0NDVmN2Y3ZTNiODg5YmMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12MjEwLTEwLmF2aQogMTQ3NTI0NTIgdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXYyMTAtMTAuYXZpCiBhNjI3ZmI1MGM4Mjc2MjAwZmQ3MTM4Mzk3N2Q4N2NhMyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXYyMTAtMTAub3V0LnJhd3ZpZGVvCiBzdGRkZXY6ICAgIDAuMzQgUFNOUjogNTcuNDMgTUFYRElGRjogICAgNiBieXRlczogIDc2MDMyMDAvICA3NjAzMjAwCmRpZmYgLS1naXQgYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXYzMDggYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXYzMDgKaW5kZXggNmRlMTViNS4uODE3NjZkZiAxMDA2NDQKLS0tIGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12MzA4CisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdjMwOApAQCAtMSw0ICsxLDQgQEAKLTViZmY0ZDc3NjNlNjI0MjcyODM1ZTA1NmM5ZmFmNGMyICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdjMwOC5hdmkKK2VhYmIwMDIwODgyNDRmYTgwMmI2N2FlYTc4MjcxNjQxICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdjMwOC5hdmkKIDE1MjEzMjUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12MzA4LmF2aQogZDQzY2IzMTBjMTMwYzY5MjE0MzMyZDc0ZjZlZTVmOWEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12MzA4Lm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAwLjQxIFBTTlI6IDU1LjgwIE1BWERJRkY6ICAgIDcgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12NDA4IGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12NDA4CmluZGV4IGJhMTllMjguLjJjNjdkY2QgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdjQwOAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXY0MDgKQEAgLTEsNCArMSw0IEBACi1lMmExYzA5N2E3OGYxYTVjOGFkMWJjY2M0MDc3ODQ0YiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXY0MDguYXZpCitiYTE2NmNkMzYwOTkxNzdiMzk0MmIxNmNkMmMyMDBmYyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXY0MDguYXZpCiAyMDI4MjA1MiB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdjQwOC5hdmkKIGRkZTU4OTU4MTdhZDlkMjE5Zjc5YTUyZDBiZGZiMDAxICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdjQwOC5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdmMyLTQyMHAgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXZjMi00MjBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OTY2YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXZjMi00MjBwCkBAIC0wLDAgKzEsNCBAQAorYjkyMGVhZjQ4NGFmOWVkM2ZiZmY0YTg1ZDA0M2I1NDQgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIwcC5tb3YKKzg0OTczNSB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdmMyLTQyMHAubW92CitiMWM2NjAxMTNhY2FiOGViNDA3NWYzZDlmYmI5Y2VlOSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00MjBwLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIwcDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIwcDEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NThlZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXZjMi00MjBwMTAKQEAgLTAsMCArMSw0IEBACis1YmNjZWM2NTNjMzMwZjAzYjkwMDY1YTg0ZmFkOWI0YiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00MjBwMTAubW92CisxMTU0Nzc1IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIwcDEwLm1vdgorYjFjNjYwMTEzYWNhYjhlYjQwNzVmM2Q5ZmJiOWNlZTkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIwcDEwLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIwcDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIwcDEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNjAxMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXZjMi00MjBwMTIKQEAgLTAsMCArMSw0IEBACitkMjdhNmQzNTE3Y2M5YTZkMjJlMzM4ZjRiMjA2NTQ1YyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00MjBwMTIubW92CisxNTE2NzU5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIwcDEyLm1vdgorYjFjNjYwMTEzYWNhYjhlYjQwNzVmM2Q5ZmJiOWNlZTkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIwcDEyLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjAwIFBTTlI6OTk5Ljk5IE1BWERJRkY6ICAgIDAgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIycCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdmMyLTQyMnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY5NTgzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdmMyLTQyMnAKQEAgLTAsMCArMSw0IEBACis5NGQzYTI0ZTllZWM2Y2I4OGM4NDc4MDc5NmFkYmVjNSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00MjJwLm1vdgorMTA0OTI4NyB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdmMyLTQyMnAubW92CitjNGIyZTY5Mjc4YzgyMmYyMjY1NTM0NDA2OGVhNDg2ZCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00MjJwLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjI2IFBTTlI6IDU5LjgyIE1BWERJRkY6ICAgIDUgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIycDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIycDEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTA0YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXZjMi00MjJwMTAKQEAgLTAsMCArMSw0IEBACitmYzk1NWI4NjNlYjNmMjI2OTRkMzdlOGE3MDA4NWE2YyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00MjJwMTAubW92CisxMjk0MDM5IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIycDEwLm1vdgorZTVlYTE3NDE2YmRhMjM0YWU1OGYyN2RlYTI3ZTgxMzUgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIycDEwLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjMwIFBTTlI6IDU4LjU4IE1BWERJRkY6ICAgIDUgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIycDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDIycDEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTYyZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXZjMi00MjJwMTIKQEAgLTAsMCArMSw0IEBACisyY2VmNTdjZTM1ZjMyNjQyYzgyOWYyNGEwY2EzZTI2MCAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00MjJwMTIubW92CisxNzY4MDI3IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIycDEyLm1vdgorYmQzNzQzMDQ5OTc4MzQ0MTBhNjllZTZjNmUwNDdkMTkgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDIycDEyLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjI5IFBTTlI6IDU4Ljc2IE1BWERJRkY6ICAgIDUgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDQ0cCBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdmMyLTQ0NHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3NzkxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEtdmMyLTQ0NHAKQEAgLTAsMCArMSw0IEBACitjYmRmMjQyMWZkZDZjZjA3ODljMWYzMDgwMDk2NjZmNiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00NDRwLm1vdgorMTE3NDczOCB0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEtdmMyLTQ0NHAubW92CitmOTMwNmIxNGZmODI3Y2VkMWE5OTIzMDFkMWFiMDJjYSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00NDRwLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjM4IFBTTlI6IDU2LjQzIE1BWERJRkY6ICAgIDYgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDQ0cDEwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDQ0cDEwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTMzZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXZjMi00NDRwMTAKQEAgLTAsMCArMSw0IEBACithY2RhNzA0MmVjYzViOTE3ODI0ZDljZjYyZWUzYjQ2YyAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00NDRwMTAubW92CisxNTc3ODE1IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDQ0cDEwLm1vdgorZGExM2M2N2ZlMWM2ZDk4ZGQ3M2U5MmE2YmEwMDZlZGMgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDQ0cDEwLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjQyIFBTTlI6IDU1LjU2IE1BWERJRkY6ICAgIDcgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDQ0cDEyIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS12YzItNDQ0cDEyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNmMyMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXZjMi00NDRwMTIKQEAgLTAsMCArMSw0IEBACithMzFmMmU2YTU0ODk2ZmI4YzAyMjcyYzlmNTBkYjcxNiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXZjMi00NDRwMTIubW92CisyMTM0ODc1IHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDQ0cDEyLm1vdgorYTUwNTQzNGVjOTUzNjI3NzJhNTdkMjc0ZjYzYTNmNWEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS12YzItNDQ0cDEyLm91dC5yYXd2aWRlbworc3RkZGV2OiAgICAwLjQyIFBTTlI6IDU1LjU4IE1BWERJRkY6ICAgIDcgYnl0ZXM6ICA3NjAzMjAwLyAgIDc2MDMyMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS15NDFwIGIvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS15NDFwCmluZGV4IDljYzA5NTcuLjMyNWQ3NTIgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3JlZi92c3ludGgvdnN5bnRoX2xlbmEteTQxcAorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXk0MXAKQEAgLTEsNCArMSw0IEBACi0zYjk1ODczNGM2NTNkMjY1Y2Q0MmUzMWQ2YTIyMjMwZiAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXk0MXAuYXZpCisxNTk1NDhlYzA4ODEyODY2NzRlNGExYmQ3NWI4OWY5ZSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXk0MXAuYXZpCiA3NjEwMDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS15NDFwLmF2aQogZDI3YTg0Y2NkYWMwOTA1NTcyNGQxMjJlMDNmZWE4MmEgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS15NDFwLm91dC5yYXd2aWRlbwogc3RkZGV2OiAgICAxLjA3IFBTTlI6IDQ3LjU0IE1BWERJRkY6ICAgMjEgYnl0ZXM6ICA3NjAzMjAwLyAgNzYwMzIwMApkaWZmIC0tZ2l0IGEvdGVzdHMvcmVmL3ZzeW50aC92c3ludGhfbGVuYS15dXYgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXl1dgppbmRleCBiYzI3ZGNmLi42NDVlZjhiIDEwMDY0NAotLS0gYS90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXl1dgorKysgYi90ZXN0cy9yZWYvdnN5bnRoL3ZzeW50aF9sZW5hLXl1dgpAQCAtMSw0ICsxLDQgQEAKLTBkMDYxYjBiN2JlZGNkNTllNWM5MGE5OWY1OGNlZWFlICp0ZXN0cy9kYXRhL2ZhdGUvdnN5bnRoX2xlbmEteXV2LmF2aQorMmY0MTAyY2Q0Mzc1MzgzYzBhM2I2MTE0YTUwMjk5NmYgKnRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS15dXYuYXZpCiA3NjEwMDUyIHRlc3RzL2RhdGEvZmF0ZS92c3ludGhfbGVuYS15dXYuYXZpCiBkZGU1ODk1ODE3YWQ5ZDIxOWY3OWE1MmQwYmRmYjAwMSAqdGVzdHMvZGF0YS9mYXRlL3ZzeW50aF9sZW5hLXl1di5vdXQucmF3dmlkZW8KIHN0ZGRldjogICAgMC4wMCBQU05SOjk5OS45OSBNQVhESUZGOiAgICAwIGJ5dGVzOiAgNzYwMzIwMC8gIDc2MDMyMDAKZGlmZiAtLWdpdCBhL3Rlc3RzL3JlZmNtcC1tZXRhZGF0YS5hd2sgYi90ZXN0cy9yZWZjbXAtbWV0YWRhdGEuYXdrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjFhYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9yZWZjbXAtbWV0YWRhdGEuYXdrCkBAIC0wLDAgKzEsNjQgQEAKKyMgQ29tcGFyZSBtZXRhZGF0YSBmaWx0ZXIgb3V0cHV0IGNvbnRhaW5pbmcgZmxvYXQgdmFsdWUgc3RyaW5ncyB0byByZWZlcmVuY2UKKyMgb3V0cHV0IGRhdGEuIFJldHVybnMgdGhlIHdob2xlIHJlZmVyZW5jZSBkYXRhIGlmIGRlbHRhIG9mIGVhY2ggdmFsdWUgaXMgYmVsb3cKKyMgdGhyZXNob2xkLCBlbHNlIHJldHVybnMgdGhlIHdob2xlIGlucHV0IGRhdGEuCisKK2Z1bmN0aW9uIGFicyh2YWwpIHsKKyAgICByZXR1cm4gKCh2YWwgPCAwLjApID8gLXZhbCA6IHZhbCk7Cit9CisKK2Z1bmN0aW9uIG1heCh2YWwxLCB2YWwyKSB7CisgICAgcmV0dXJuICgodmFsMSA+PSB2YWwyKSA/IHZhbDEgOiB2YWwyKTsKK30KKworZnVuY3Rpb24gaXNfbnVtZXJpY19zdHIoc3RyKSB7CisgICAgcmV0dXJuIChzdHIgfiAvXlsrLV0/WzAtOV0qXC4/WzAtOV0rJC8pOworfQorCitCRUdJTiB7CisgICAgRlMgPSAiPSI7CisgICAgIyBjaGVjayBmb3IgImZ1enoiICh0aHJlc2hvbGQpIHByb2dyYW0gcGFyYW1ldGVyLCBlbHNlIHVzZSBkZWZhdWx0CisgICAgaWYgKGZ1enogPD0gMC4wKSB7CisgICAgICAgIGZ1enogPSAwLjE7CisgICAgfQorICAgICMgY2hlY2sgZm9yICJyZWYiIChyZWZlcmVuY2UgZmlsZSkgcHJvZ3JhbSBwYXJhbWV0ZXIKKyAgICBpZiAocmVmKSB7CisgICAgICAgIHJlZl9uciA9IDA7CisgICAgICAgIHdoaWxlICgoZ2V0bGluZSBsaW5lIDwgcmVmKSA+IDApIHsKKyAgICAgICAgICAgIHJlZl9ucisrOworICAgICAgICAgICAgcmVmX2xpbmVzW3JlZl9ucl0gPSBsaW5lOworICAgICAgICAgICAgaWYgKHNwbGl0KGxpbmUsIGZpZWxkcykgPT0gMiAmJiBpc19udW1lcmljX3N0cihmaWVsZHNbMl0pKSB7CisgICAgICAgICAgICAgICAgcmVmX2tleXNbcmVmX25yXSA9IGZpZWxkc1sxXTsKKyAgICAgICAgICAgICAgICByZWZfdmFsc1tyZWZfbnJdID0gZmllbGRzWzJdICsgMDsgICMgY29udmVydCB0byBudW1iZXIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbG9zZShyZWYpOworICAgIH0KKyAgICBkZWx0YV9tYXggPSAwOworICAgIHJlc3VsdCA9IChyZWYgPyAxIDogMCk7Cit9CisKK3sKKyAgICBjbXBfbGluZXNbTlJdID0gJDA7CisgICAgaWYgKE5GID09IDIgJiYgaXNfbnVtZXJpY19zdHIoJDIpICYmIHJlZl92YWxzW05SXSkgeworICAgICAgICB2YWwgPSAkMiArIDA7ICAjIGNvbnZlcnQgdG8gbnVtYmVyCisgICAgICAgIGRlbHRhID0gYWJzKCh2YWwgLyByZWZfdmFsc1tOUl0pIC0gMSk7CisgICAgICAgIGRlbHRhX21heCA9IG1heChkZWx0YV9tYXgsIGRlbHRhKTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmICgkMSA9PSByZWZfa2V5c1tOUl0pICYmIChkZWx0YSA8PSBmdXp6KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSByZXN1bHQgJiYgKCQwID09IHJlZl9saW5lc1tOUl0pOworICAgIH0KK30KKworRU5EIHsKKyAgICBpZiAocmVzdWx0KSB7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gcmVmX25yOyBpKyspCisgICAgICAgICAgICBwcmludCByZWZfbGluZXNbaV07CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8PSBOUjsgaSsrKQorICAgICAgICAgICAgcHJpbnQgY21wX2xpbmVzW2ldOworICAgICAgICBpZiAoTlIgIT0gcmVmX25yKQorICAgICAgICAgICAgcHJpbnQgIltyZWZjbXBdIGxpbmVzOiAiIE5SICIgIT0gIiByZWZfbnIgPiAiL2Rldi9zdGRlcnIiOworICAgICAgICBpZiAoZGVsdGFfbWF4ID49IGZ1enopCisgICAgICAgICAgICBwcmludCAiW3JlZmNtcF0gZGVsdGFfbWF4OiAiIGRlbHRhX21heCAiID49ICIgZnV6eiA+ICIvZGV2L3N0ZGVyciI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcmVncmVzc2lvbi1mdW5jcy5zaCBiL3Rlc3RzL3JlZ3Jlc3Npb24tZnVuY3Muc2gKaW5kZXggMTliY2VjYS4uMGM3ZDM0YiAxMDA3NTUKLS0tIGEvdGVzdHMvcmVncmVzc2lvbi1mdW5jcy5zaAorKysgYi90ZXN0cy9yZWdyZXNzaW9uLWZ1bmNzLnNoCkBAIC00Myw3ICs0Myw3IEBACiAKIC4gJChkaXJuYW1lICQwKS9tZDUuc2gKIAotQVZDT05WX09QVFM9Ii1ub3N0YXRzIC15IC1jcHVmbGFncyAkY3B1ZmxhZ3MiCitBVkNPTlZfT1BUUz0iLW5vc3RkaW4gLW5vc3RhdHMgLXkgLWNwdWZsYWdzICRjcHVmbGFncyIKIENPTU1PTl9PUFRTPSItZmxhZ3MgK2JpdGV4YWN0IC1pZGN0IHNpbXBsZSAtc3dzX2ZsYWdzICthY2N1cmF0ZV9ybmQrYml0ZXhhY3QgLWZmbGFncyArYml0ZXhhY3QiCiBERUNfT1BUUz0iJENPTU1PTl9PUFRTIC10aHJlYWRzICR0aHJlYWRzIgogRU5DX09QVFM9IiRDT01NT05fT1BUUyAtdGhyZWFkcyAkdGhyZWFkcyAtZGN0IGZhc3RpbnQiCmRpZmYgLS1naXQgYS90ZXN0cy90aW55X3BzbnIuYyBiL3Rlc3RzL3RpbnlfcHNuci5jCmluZGV4IDMzODg0NWUuLmQwMWFhMjkgMTAwNjQ0Ci0tLSBhL3Rlc3RzL3RpbnlfcHNuci5jCisrKyBiL3Rlc3RzL3RpbnlfcHNuci5jCkBAIC0xMzIsMTMgKzEzMiwxMyBAQAogCiBzdGF0aWMgaW50IHJ1bl9wc25yKEZJTEUgKmZbMl0sIGludCBsZW4sIGludCBzaGlmdCwgaW50IHNraXBfYnl0ZXMpCiB7Ci0gICAgaW50IGksIGo7CisgICAgdWludDY0X3QgaSwgajsKICAgICB1aW50NjRfdCBzc2UgPSAwOwogICAgIGRvdWJsZSBzc2VfZCA9IDAuMDsKICAgICB1aW50OF90IGJ1ZlsyXVtTSVpFXTsKICAgICBpbnQ2NF90IG1heCAgICA9ICgxTEwgPDwgKDggKiBsZW4pKSAtIDE7Ci0gICAgaW50IHNpemUwICAgICAgPSAwOwotICAgIGludCBzaXplMSAgICAgID0gMDsKKyAgICB1aW50NjRfdCBzaXplMCAgID0gMDsKKyAgICB1aW50NjRfdCBzaXplMSAgID0gMDsKICAgICB1aW50NjRfdCBtYXhkaXN0ID0gMDsKICAgICBkb3VibGUgbWF4ZGlzdF9kID0gMC4wOwogICAgIGludCBub3NlZWs7CkBAIC0yMzMsNyArMjMzLDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgICAgcHNuciA9IDEwMDAgKiBGIC0gMTsgLy8gZmxvYXRpbmcgcG9pbnQgZnJlZSBpbmZpbml0eSA6KQogCi0gICAgICAgIHByaW50Zigic3RkZGV2OiU1ZC4lMDJkIFBTTlI6JTNkLiUwMmQgTUFYRElGRjolNSJQUkl1NjQiIGJ5dGVzOiU5ZC8lOWRcbiIsCisgICAgICAgIHByaW50Zigic3RkZGV2OiU1ZC4lMDJkIFBTTlI6JTNkLiUwMmQgTUFYRElGRjolNSJQUkl1NjQiIGJ5dGVzOiU5IlBSSXU2NCIvJTkiUFJJdTY0IlxuIiwKICAgICAgICAgICAgICAgIChpbnQpKGRldiAvIEYpLCAoaW50KShkZXYgJSBGKSwKICAgICAgICAgICAgICAgIChpbnQpKHBzbnIgLyBGKSwgKGludCkocHNuciAlIEYpLAogICAgICAgICAgICAgICAgbWF4ZGlzdCwgc2l6ZTAsIHNpemUxKTsKQEAgLTI1NCw3ICsyNTQsNyBAQAogCiAgICAgICAgIG1heGRpc3QgPSBtYXhkaXN0X2QgKiBzY2FsZTsKIAotICAgICAgICBwcmludGYoInN0ZGRldjolMTAuMmYgUFNOUjolcyBNQVhESUZGOiUxMCJQUkl1NjQiIGJ5dGVzOiU5ZC8lOWRcbiIsCisgICAgICAgIHByaW50Zigic3RkZGV2OiUxMC4yZiBQU05SOiVzIE1BWERJRkY6JTEwIlBSSXU2NCIgYnl0ZXM6JTkiUFJJdTY0Ii8lOSJQUkl1NjQiXG4iLAogICAgICAgICAgICAgICAgZGV2ICogc2NhbGUsIHBzbnJfc3RyLCBtYXhkaXN0LCBzaXplMCwgc2l6ZTEpOwogICAgICAgICByZXR1cm4gcHNucjsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZSBiL3Rvb2xzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDllN2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9NYWtlZmlsZQpAQCAtMCwwICsxLDEzIEBACitUT09MUyA9IHF0LWZhc3RzdGFydCB0cmFzaGVyIHVuY29kZWRfZnJhbWUKK1RPT0xTLSQoQ09ORklHX0xJQk1ZU09GQSkgKz0gc29mYTJ3YXZzCitUT09MUy0kKENPTkZJR19aTElCKSArPSBjd3MyZndzCisKK3Rvb2xzL3RhcmdldF9kZWNfJV9mdXp6ZXIubzogdG9vbHMvdGFyZ2V0X2RlY19mdXp6ZXIuYworCSQoQ09NUElMRV9DKSAtREZGTVBFR19ERUNPREVSPSQqCisKK09CSkRJUlMgKz0gdG9vbHMKKworY2xlYW46OgorCSQoUk0pICQoQ0xFQU5TVUZGSVhFUzolPXRvb2xzLyUpCisKKy1pbmNsdWRlICQod2lsZGNhcmQgdG9vbHMvKi5kKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYXZpb2NhdC5jIGIvdG9vbHMvYXZpb2NhdC5jCmluZGV4IDNiZDYyYjcuLjJhYTA4YjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2F2aW9jYXQuYworKysgYi90b29scy9hdmlvY2F0LmMKQEAgLTI2LDcgKzI2LDggQEAKIAogc3RhdGljIGludCB1c2FnZShjb25zdCBjaGFyICphcmd2MCwgaW50IHJldCkKIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIFstYiBieXRlc3BlcnNlY10gWy1kIGR1cmF0aW9uXSBpbnB1dF91cmwgb3V0cHV0X3VybFxuIiwgYXJndjApOworICAgIGZwcmludGYoc3RkZXJyLCAiJXMgWy1iIGJ5dGVzcGVyc2VjXSBbLWQgZHVyYXRpb25dIFstb2kgPG9wdGlvbnM+XSBbLW9vIDxvcHRpb25zPl0gaW5wdXRfdXJsIG91dHB1dF91cmxcbiIsIGFyZ3YwKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIjxvcHRpb25zPjogQVZPcHRpb25zIGV4cHJlc3NlZCBhcyBrZXk9dmFsdWUsIDotc2VwYXJhdGVkXG4iKTsKICAgICByZXR1cm4gcmV0OwogfQogCkBAIC0zOCw4ICszOSw5IEBACiAgICAgaW50NjRfdCBzdGFydF90aW1lOwogICAgIGNoYXIgZXJyYnVmWzUwXTsKICAgICBBVklPQ29udGV4dCAqaW5wdXQsICpvdXRwdXQ7CisgICAgQVZEaWN0aW9uYXJ5ICppbl9vcHRzID0gTlVMTDsKKyAgICBBVkRpY3Rpb25hcnkgKm91dF9vcHRzID0gTlVMTDsKIAotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwogICAgIGF2Zm9ybWF0X25ldHdvcmtfaW5pdCgpOwogCiAgICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewpAQCAtNDksNiArNTEsMjAgQEAKICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZCIpICYmIGkgKyAxIDwgYXJnYykgewogICAgICAgICAgICAgZHVyYXRpb24gPSBhdG9pKGFyZ3ZbaSArIDFdKTsKICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItb2kiKSAmJiBpICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgICAgIGlmIChhdl9kaWN0X3BhcnNlX3N0cmluZygmaW5fb3B0cywgYXJndltpICsgMV0sICI9IiwgIjoiLCAwKSA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBwYXJzZSBvcHRpb24gc3RyaW5nICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJndltpICsgMV0pOworICAgICAgICAgICAgICAgIHJldHVybiB1c2FnZShhcmd2WzBdLCAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItb28iKSAmJiBpICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgICAgIGlmIChhdl9kaWN0X3BhcnNlX3N0cmluZygmb3V0X29wdHMsIGFyZ3ZbaSArIDFdLCAiPSIsICI6IiwgMCkgPCAwKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW5ub3QgcGFyc2Ugb3B0aW9uIHN0cmluZyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbaSArIDFdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXNhZ2UoYXJndlswXSwgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CiAgICAgICAgIH0gZWxzZSBpZiAoIWlucHV0X3VybCkgewogICAgICAgICAgICAgaW5wdXRfdXJsID0gYXJndltpXTsKICAgICAgICAgfSBlbHNlIGlmICghb3V0cHV0X3VybCkgewpAQCAtNjAsNyArNzYsNyBAQAogICAgIGlmICghb3V0cHV0X3VybCkKICAgICAgICAgcmV0dXJuIHVzYWdlKGFyZ3ZbMF0sIDEpOwogCi0gICAgcmV0ID0gYXZpb19vcGVuMigmaW5wdXQsIGlucHV0X3VybCwgQVZJT19GTEFHX1JFQUQsIE5VTEwsIE5VTEwpOworICAgIHJldCA9IGF2aW9fb3BlbjIoJmlucHV0LCBpbnB1dF91cmwsIEFWSU9fRkxBR19SRUFELCBOVUxMLCAmaW5fb3B0cyk7CiAgICAgaWYgKHJldCkgewogICAgICAgICBhdl9zdHJlcnJvcihyZXQsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOwogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuICVzOiAlc1xuIiwgaW5wdXRfdXJsLCBlcnJidWYpOwpAQCAtNzUsNyArOTEsNyBAQAogICAgICAgICB9CiAgICAgICAgIGJwcyA9IHNpemUgLyBkdXJhdGlvbjsKICAgICB9Ci0gICAgcmV0ID0gYXZpb19vcGVuMigmb3V0cHV0LCBvdXRwdXRfdXJsLCBBVklPX0ZMQUdfV1JJVEUsIE5VTEwsIE5VTEwpOworICAgIHJldCA9IGF2aW9fb3BlbjIoJm91dHB1dCwgb3V0cHV0X3VybCwgQVZJT19GTEFHX1dSSVRFLCBOVUxMLCAmb3V0X29wdHMpOwogICAgIGlmIChyZXQpIHsKICAgICAgICAgYXZfc3RyZXJyb3IocmV0LCBlcnJidWYsIHNpemVvZihlcnJidWYpKTsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiAlczogJXNcbiIsIG91dHB1dF91cmwsIGVycmJ1Zik7CkBAIC05MCw2ICsxMDYsMTEgQEAKICAgICAgICAgaWYgKG4gPD0gMCkKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBhdmlvX3dyaXRlKG91dHB1dCwgYnVmLCBuKTsKKyAgICAgICAgaWYgKG91dHB1dC0+ZXJyb3IpIHsKKyAgICAgICAgICAgIGF2X3N0cmVycm9yKG91dHB1dC0+ZXJyb3IsIGVycmJ1Ziwgc2l6ZW9mKGVycmJ1ZikpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gd3JpdGUgJXM6ICVzXG4iLCBvdXRwdXRfdXJsLCBlcnJidWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgc3RyZWFtX3BvcyArPSBuOwogICAgICAgICBpZiAoYnBzKSB7CiAgICAgICAgICAgICBhdmlvX2ZsdXNoKG91dHB1dCk7CkBAIC0xMDIsNiArMTIzLDggQEAKICAgICBhdmlvX2Nsb3NlKG91dHB1dCk7CiAKIGZhaWw6CisgICAgYXZfZGljdF9mcmVlKCZpbl9vcHRzKTsKKyAgICBhdl9kaWN0X2ZyZWUoJm91dF9vcHRzKTsKICAgICBhdmlvX2Nsb3NlKGlucHV0KTsKICAgICBhdmZvcm1hdF9uZXR3b3JrX2RlaW5pdCgpOwogICAgIHJldHVybiByZXQgPyAxIDogMDsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Jpc2VjdC1jcmVhdGUgYi90b29scy9iaXNlY3QtY3JlYXRlCmluZGV4IGZjNjBlODYuLmVlNmVjM2YgMTAwNzU1Ci0tLSBhL3Rvb2xzL2Jpc2VjdC1jcmVhdGUKKysrIGIvdG9vbHMvYmlzZWN0LWNyZWF0ZQpAQCAtMjAsNyArMjAsNyBAQAogY2FzZSAiJDEiIGluCiAgICAgbmVlZCkKICAgICAgICAgY2FzZSAkMiBpbgotICAgICAgICAgICAgZmZtcGVnfGZmcGxheXxmZnByb2JlfGZmc2VydmVyKQorICAgICAgICAgICAgZmZtcGVnfGZmcGxheXxmZnByb2JlKQogICAgICAgICAgICAgICAgIGVjaG8gJDIuYyA+PiB0b29scy9iaXNlY3QubmVlZAogICAgICAgICAgICAgOzsKICAgICAgICAgZXNhYwpkaWZmIC0tZ2l0IGEvdG9vbHMvY2wyYyBiL3Rvb2xzL2NsMmMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTNmOTJiYQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2NsMmMKQEAgLTAsMCArMSwzNiBAQAorIyEvYmluL3NoCisjIENvbnZlcnQgYW4gT3BlbkNMIHNvdXJjZSBmaWxlIGludG8gYSBDIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlCisjIE9wZW5DTCBzb3VyY2UgYXMgYSBDIHN0cmluZy4gIEFsc28gYWRkcyBhICNsaW5lIGRpcmVjdGl2ZSBzbyB0aGF0CisjIGNvbXBpbGVyIG1lc3NhZ2VzIGFyZSB1c2VmdWwuCisKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorIworIyBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisjIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBGRm1wZWcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorIyBTZWUgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyMgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorCitpbnB1dD0iJDEiCitvdXRwdXQ9IiQyIgorCituYW1lPSQoYmFzZW5hbWUgIiRpbnB1dCIgfCBzZWQgJ3MvLmNsJC8vJykKKworY2F0ID4kb3V0cHV0IDw8RU9GCisvLyBHZW5lcmF0ZWQgZnJvbSAkaW5wdXQKK2NvbnN0IGNoYXIgKmZmX29wZW5jbF9zb3VyY2VfJG5hbWUgPQorIiNsaW5lIDEgXCIkaW5wdXRcIlxuIgorRU9GCisKKyMgQ29udmVydCBcIHRvIFxcIGFuZCAiIHRvIFwiLCB0aGVuIGFkZCAiIHRvIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBsaW5lLgorY2F0ICIkaW5wdXQiIHwgc2VkICdzL1xcL1xcXFwvZztzL1wiL1xcXCIvZztzL14vXCIvO3MvJC9cXG5cIi8nID4+JG91dHB1dAorCitlY2hvICI7IiA+PiRvdXRwdXQKZGlmZiAtLWdpdCBhL3Rvb2xzL2NvdmVyaXR5LmMgYi90b29scy9jb3Zlcml0eS5jCmluZGV4IDgwZmMxYzIuLjE5YTEzMmEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2NvdmVyaXR5LmMKKysrIGIvdG9vbHMvY292ZXJpdHkuYwpAQCAtMzUsOCArMzUsNDUgQEAKIHZvaWQgKmF2X21hbGxvYyhzaXplX3Qgc2l6ZSkgewogICAgIGludCBoYXNfbWVtb3J5OwogICAgIF9fY292ZXJpdHlfbmVnYXRpdmVfc2lua19fKHNpemUpOwotICAgIGlmKGhhc19tZW1vcnkpCi0gICAgICAgIHJldHVybiBfX2NvdmVyaXR5X2FsbG9jX18oc2l6ZSk7Ci0gICAgZWxzZQorICAgIGlmIChoYXNfbWVtb3J5KSB7CisgICAgICAgIHZvaWQgKnB0ciA9IF9fY292ZXJpdHlfYWxsb2NfXyhzaXplKTsKKyAgICAgICAgX19jb3Zlcml0eV9tYXJrX2FzX3VuaW5pdGlhbGl6ZWRfYnVmZmVyX18ocHRyKTsKKyAgICAgICAgX19jb3Zlcml0eV9tYXJrX2FzX2FmbV9hbGxvY2F0ZWRfXyhwdHIsICJhdl9mcmVlIik7CisgICAgICAgICByZXR1cm4gcHRyOworICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiAwOworICAgIH0KIH0KKwordm9pZCAqYXZfbWFsbG9jeihzaXplX3Qgc2l6ZSkgeworICAgIGludCBoYXNfbWVtb3J5OworICAgIF9fY292ZXJpdHlfbmVnYXRpdmVfc2lua19fKHNpemUpOworICAgIGlmIChoYXNfbWVtb3J5KSB7CisgICAgICAgIHZvaWQgKnB0ciA9IF9fY292ZXJpdHlfYWxsb2NfXyhzaXplKTsKKyAgICAgICAgX19jb3Zlcml0eV93cml0ZWFsbDBfXyhwdHIpOworICAgICAgICBfX2NvdmVyaXR5X21hcmtfYXNfYWZtX2FsbG9jYXRlZF9fKHB0ciwgImF2X2ZyZWUiKTsKKyAgICAgICAgcmV0dXJuIHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3ZvaWQgKmF2X3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgeworICAgIGludCBoYXNfbWVtb3J5OworICAgIF9fY292ZXJpdHlfbmVnYXRpdmVfc2lua19fKHNpemUpOworICAgIGlmIChoYXNfbWVtb3J5KSB7CisgICAgICAgIF9fY292ZXJpdHlfZXNjYXBlX18ocHRyKTsKKyAgICAgICAgcHRyID0gX19jb3Zlcml0eV9hbGxvY19fKHNpemUpOworICAgICAgICBfX2NvdmVyaXR5X3dyaXRlYWxsX18ocHRyKTsKKyAgICAgICAgX19jb3Zlcml0eV9tYXJrX2FzX2FmbV9hbGxvY2F0ZWRfXyhwdHIsICJhdl9mcmVlIik7CisgICAgICAgIHJldHVybiBwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCit2b2lkICphdl9mcmVlKHZvaWQgKnB0cikgeworICAgIF9fY292ZXJpdHlfZnJlZV9fKHB0cik7CisgICAgX19jb3Zlcml0eV9tYXJrX2FzX2FmbV9mcmVlZF9fKHB0ciwgImF2X2ZyZWUiKTsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvY3J5cHRvX2JlbmNoLmMgYi90b29scy9jcnlwdG9fYmVuY2guYwppbmRleCBiM2IyNGE2Li4yMDNiZmZlIDEwMDY0NAotLS0gYS90b29scy9jcnlwdG9fYmVuY2guYworKysgYi90b29scy9jcnlwdG9fYmVuY2guYwpAQCAtNzgsNiArNzgsNyBAQAogI2luY2x1ZGUgImxpYmF2dXRpbC9ibG93ZmlzaC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jYW1lbGxpYS5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9jYXN0NS5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9kZXMuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwvdHdvZmlzaC5oIgogI2luY2x1ZGUgImxpYmF2dXRpbC9yYzQuaCIKICNpbmNsdWRlICJsaWJhdnV0aWwveHRlYS5oIgpAQCAtMTQ4LDYgKzE0OSwxNiBAQAogICAgIGF2X2Nhc3Q1X2NyeXB0KGNhc3QsIG91dHB1dCwgaW5wdXQsIHNpemUgPj4gMywgMCk7CiB9CiAKK3N0YXRpYyB2b2lkIHJ1bl9sYXZ1X2Rlcyh1aW50OF90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBzdGF0aWMgc3RydWN0IEFWREVTICpkZXM7CisgICAgaWYgKCFkZXMgJiYgIShkZXMgPSBhdl9kZXNfYWxsb2MoKSkpCisgICAgICAgIGZhdGFsX2Vycm9yKCJvdXQgb2YgbWVtb3J5Iik7CisgICAgYXZfZGVzX2luaXQoZGVzLCBoYXJkY29kZWRfa2V5LCA2NCwgMCk7CisgICAgYXZfZGVzX2NyeXB0KGRlcywgb3V0cHV0LCBpbnB1dCwgc2l6ZSA+PiAzLCBOVUxMLCAwKTsKK30KKwogc3RhdGljIHZvaWQgcnVuX2xhdnVfdHdvZmlzaCh1aW50OF90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdW5zaWduZWQgc2l6ZSkKIHsKQEAgLTE4NCw2ICsxOTUsNyBAQAogCiAjaWYgKFVTRV9FWFRfTElCUykgJiBVU0VfY3J5cHRvCiAKKyNkZWZpbmUgT1BFTlNTTF9ESVNBQkxFX09MRF9ERVNfU1VQUE9SVAogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9zaGEuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3JpcGVtZC5oPgpAQCAtMTkxLDYgKzIwMyw3IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9ibG93ZmlzaC5oPgogI2luY2x1ZGUgPG9wZW5zc2wvY2FtZWxsaWEuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Nhc3QuaD4KKyNpbmNsdWRlIDxvcGVuc3NsL2Rlcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvcmM0Lmg+CiAKICNkZWZpbmUgREVGSU5FX0NSWVBUT19XUkFQUEVSKHN1ZmZpeCwgZnVuY3Rpb24pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjUyLDYgKzI2NSwxNyBAQAogICAgICAgICBDQVNUX2VjYl9lbmNyeXB0KGlucHV0ICsgaSwgb3V0cHV0ICsgaSwgJmNhc3QsIDEpOwogfQogCitzdGF0aWMgdm9pZCBydW5fY3J5cHRvX2Rlcyh1aW50OF90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdW5zaWduZWQgc2l6ZSkKK3sKKyAgICBERVNfa2V5X3NjaGVkdWxlIGRlczsKKyAgICB1bnNpZ25lZCBpOworCisgICAgREVTX3NldF9rZXkoaGFyZGNvZGVkX2tleSwgJmRlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gOCkKKyAgICAgICAgREVTX2VjYl9lbmNyeXB0KGlucHV0ICsgaSwgb3V0cHV0ICsgaSwgJmRlcywgMSk7Cit9CisKIHN0YXRpYyB2b2lkIHJ1bl9jcnlwdG9fcmM0KHVpbnQ4X3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVuc2lnbmVkIHNpemUpCiB7CkBAIC0yODcsNTUgKzMxMSwyMyBAQAogREVGSU5FX0dDUllQVF9XUkFQUEVSKHNoYTUxMiwgICAgU0hBNTEyKQogREVGSU5FX0dDUllQVF9XUkFQUEVSKHJpcGVtZDE2MCwgUk1EMTYwKQogCi1zdGF0aWMgdm9pZCBydW5fZ2NyeXB0X2FlczEyOCh1aW50OF90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdW5zaWduZWQgc2l6ZSkKLXsKLSAgICBzdGF0aWMgZ2NyeV9jaXBoZXJfaGRfdCBhZXM7Ci0gICAgaWYgKCFhZXMpCi0gICAgICAgIGdjcnlfY2lwaGVyX29wZW4oJmFlcywgR0NSWV9DSVBIRVJfQUVTMTI4LCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiwgMCk7Ci0gICAgZ2NyeV9jaXBoZXJfc2V0a2V5KGFlcywgaGFyZGNvZGVkX2tleSwgMTYpOwotICAgIGdjcnlfY2lwaGVyX2VuY3J5cHQoYWVzLCBvdXRwdXQsIHNpemUsIGlucHV0LCBzaXplKTsKKyNkZWZpbmUgREVGSU5FX0dDUllQVF9DWVBIRVJfV1JBUFBFUihzdWZmaXgsIGN5cGhlciwgc3opICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIHJ1bl9nY3J5cHRfICMjIHN1ZmZpeCh1aW50OF90ICpvdXRwdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1bnNpZ25lZCBzaXplKSAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgZ2NyeV9jaXBoZXJfaGRfdCBzdWZmaXg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIXN1ZmZpeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZ2NyeV9jaXBoZXJfb3Blbigmc3VmZml4LCBHQ1JZX0NJUEhFUl8gIyMgY3lwaGVyLCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiwgMCk7IFwKKyAgICBnY3J5X2NpcGhlcl9zZXRrZXkoc3VmZml4LCBoYXJkY29kZWRfa2V5LCBzeik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnY3J5X2NpcGhlcl9lbmNyeXB0KHN1ZmZpeCwgb3V0cHV0LCBzaXplLCBpbnB1dCwgc2l6ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotc3RhdGljIHZvaWQgcnVuX2djcnlwdF9ibG93ZmlzaCh1aW50OF90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1bnNpZ25lZCBzaXplKQotewotICAgIHN0YXRpYyBnY3J5X2NpcGhlcl9oZF90IGJsb3dmaXNoOwotICAgIGlmICghYmxvd2Zpc2gpCi0gICAgICAgIGdjcnlfY2lwaGVyX29wZW4oJmJsb3dmaXNoLCBHQ1JZX0NJUEhFUl9CTE9XRklTSCwgR0NSWV9DSVBIRVJfTU9ERV9FQ0IsIDApOwotICAgIGdjcnlfY2lwaGVyX3NldGtleShibG93ZmlzaCwgaGFyZGNvZGVkX2tleSwgMTYpOwotICAgIGdjcnlfY2lwaGVyX2VuY3J5cHQoYmxvd2Zpc2gsIG91dHB1dCwgc2l6ZSwgaW5wdXQsIHNpemUpOwotfQotCi1zdGF0aWMgdm9pZCBydW5fZ2NyeXB0X2NhbWVsbGlhKHVpbnQ4X3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVuc2lnbmVkIHNpemUpCi17Ci0gICAgc3RhdGljIGdjcnlfY2lwaGVyX2hkX3QgY2FtZWxsaWE7Ci0gICAgaWYgKCFjYW1lbGxpYSkKLSAgICAgICAgZ2NyeV9jaXBoZXJfb3BlbigmY2FtZWxsaWEsIEdDUllfQ0lQSEVSX0NBTUVMTElBMTI4LCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiwgMCk7Ci0gICAgZ2NyeV9jaXBoZXJfc2V0a2V5KGNhbWVsbGlhLCBoYXJkY29kZWRfa2V5LCAxNik7Ci0gICAgZ2NyeV9jaXBoZXJfZW5jcnlwdChjYW1lbGxpYSwgb3V0cHV0LCBzaXplLCBpbnB1dCwgc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ1bl9nY3J5cHRfY2FzdDEyOCh1aW50OF90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppbnB1dCwgdW5zaWduZWQgc2l6ZSkKLXsKLSAgICBzdGF0aWMgZ2NyeV9jaXBoZXJfaGRfdCBjYXN0OwotICAgIGlmICghY2FzdCkKLSAgICAgICAgZ2NyeV9jaXBoZXJfb3BlbigmY2FzdCwgR0NSWV9DSVBIRVJfQ0FTVDUsIEdDUllfQ0lQSEVSX01PREVfRUNCLCAwKTsKLSAgICBnY3J5X2NpcGhlcl9zZXRrZXkoY2FzdCwgaGFyZGNvZGVkX2tleSwgMTYpOwotICAgIGdjcnlfY2lwaGVyX2VuY3J5cHQoY2FzdCwgb3V0cHV0LCBzaXplLCBpbnB1dCwgc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJ1bl9nY3J5cHRfdHdvZmlzaCh1aW50OF90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1bnNpZ25lZCBzaXplKQotewotICAgIHN0YXRpYyBnY3J5X2NpcGhlcl9oZF90IHR3b2Zpc2g7Ci0gICAgaWYgKCF0d29maXNoKQotICAgICAgICBnY3J5X2NpcGhlcl9vcGVuKCZ0d29maXNoLCBHQ1JZX0NJUEhFUl9UV09GSVNIMTI4LCBHQ1JZX0NJUEhFUl9NT0RFX0VDQiwgMCk7Ci0gICAgZ2NyeV9jaXBoZXJfc2V0a2V5KHR3b2Zpc2gsIGhhcmRjb2RlZF9rZXksIDE2KTsKLSAgICBnY3J5X2NpcGhlcl9lbmNyeXB0KHR3b2Zpc2gsIG91dHB1dCwgc2l6ZSwgaW5wdXQsIHNpemUpOwotfQorREVGSU5FX0dDUllQVF9DWVBIRVJfV1JBUFBFUihhZXMxMjgsICAgQUVTMTI4LCAgICAgIDE2KQorREVGSU5FX0dDUllQVF9DWVBIRVJfV1JBUFBFUihibG93ZmlzaCwgQkxPV0ZJU0gsICAgIDE2KQorREVGSU5FX0dDUllQVF9DWVBIRVJfV1JBUFBFUihjYW1lbGxpYSwgQ0FNRUxMSUExMjgsIDE2KQorREVGSU5FX0dDUllQVF9DWVBIRVJfV1JBUFBFUihjYXN0MTI4LCAgQ0FTVDUsICAgICAgIDE2KQorREVGSU5FX0dDUllQVF9DWVBIRVJfV1JBUFBFUihkZXMsICAgICAgREVTLCAgICAgICAgIDgpCitERUZJTkVfR0NSWVBUX0NZUEhFUl9XUkFQUEVSKHR3b2Zpc2gsICBUV09GSVNIMTI4LCAgMTYpCiAKICNkZWZpbmUgSU1QTF9VU0VfZ2NyeXB0KC4uLikgSU1QTF9VU0UoX19WQV9BUkdTX18pCiAjZWxzZQpAQCAtNDEzLDYgKzQwNSwxNyBAQAogICAgICAgICBjYXN0NV9lY2JfZW5jcnlwdChpbnB1dCArIGksIG91dHB1dCArIGksICZjYXN0KTsKIH0KIAorc3RhdGljIHZvaWQgcnVuX3RvbWNyeXB0X2Rlcyh1aW50OF90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1bnNpZ25lZCBzaXplKQoreworICAgIHN5bW1ldHJpY19rZXkgZGVzOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBkZXNfc2V0dXAoaGFyZGNvZGVkX2tleSwgOCwgMCwgJmRlcyk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gOCkKKyAgICAgICAgZGVzX2VjYl9lbmNyeXB0KGlucHV0ICsgaSwgb3V0cHV0ICsgaSwgJmRlcyk7Cit9CisKIHN0YXRpYyB2b2lkIHJ1bl90b21jcnlwdF90d29maXNoKHVpbnQ4X3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaW5wdXQsIHVuc2lnbmVkIHNpemUpCiB7CkBAIC01MjQsNiArNTI3LDcgQEAKICAgICBJTVBMX0FMTCgiQ0FNRUxMSUEiLCAgIGNhbWVsbGlhLCAgImNyYzo3YWJiNTlhNyIpCiAgICAgSU1QTF9BTEwoIkNBU1QtMTI4IiwgICBjYXN0MTI4LCAgICJjcmM6NDU2YWE1ODQiKQogICAgIElNUExfQUxMKCJCTE9XRklTSCIsICAgYmxvd2Zpc2gsICAiY3JjOjMzZThhYTc0IikKKyAgICBJTVBMX0FMTCgiREVTIiwgICAgICAgIGRlcywgICAgICAgImNyYzozMTI5MWUwYiIpCiAgICAgSU1QTChsYXZ1LCAgICAgIlRXT0ZJU0giLCB0d29maXNoLCAiY3JjOjllZGJkNWMxIikKICAgICBJTVBMKGdjcnlwdCwgICAiVFdPRklTSCIsIHR3b2Zpc2gsICJjcmM6OWVkYmQ1YzEiKQogICAgIElNUEwodG9tY3J5cHQsICJUV09GSVNIIiwgdHdvZmlzaCwgImNyYzo5ZWRiZDVjMSIpCmRpZmYgLS1naXQgYS90b29scy9kdmQyY29uY2F0IGIvdG9vbHMvZHZkMmNvbmNhdAppbmRleCAwMjM3MWUwLi44ZWZmZWU4IDEwMDc1NQotLS0gYS90b29scy9kdmQyY29uY2F0CisrKyBiL3Rvb2xzL2R2ZDJjb25jYXQKQEAgLTM2LDcgKzM2LDcgQEAKIG5vcm1hbGx5IGNvbnRhaW5zIGEgZGlyZWN0b3J5IG5hbWVkIEI8VklERU9fVFM+LiBJdCBtdXN0IG5vdCBiZSBlbmNyeXB0ZWQKIHdpdGggQ1NTLgogCi1JPGZpbGUuY29uY2F0PiBpcyB0aGUgb3V0cHV0IGZpbGUuIEl0IGNhbiBiZSB1c2VkIGEgaW5wdXQgdG8gZmZtcGVnLgorSTxmaWxlLmNvbmNhdD4gaXMgdGhlIG91dHB1dCBmaWxlLiBJdCBjYW4gYmUgdXNlZCBhcyBhbiBpbnB1dCB0byBmZm1wZWcuCiBJdCB3aWxsIHJlcXVpcmUgdGhlIEI8LXNhZmUgMD4gb3B0aW9uLgogCiA9Y3V0CmRpZmYgLS1naXQgYS90b29scy9lbnVtX29wdGlvbnMuYyBiL3Rvb2xzL2VudW1fb3B0aW9ucy5jCmluZGV4IGMyYTI5NWMuLjc3ZTFmOWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2VudW1fb3B0aW9ucy5jCisrKyBiL3Rvb2xzL2VudW1fb3B0aW9ucy5jCkBAIC0xMzAsOCArMTMwLDYgQEAKICAgICBpZiAoYXJnYyA8IDIpCiAgICAgICAgIHByaW50X3VzYWdlKCk7CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGlmICghc3RyY21wKGFyZ3ZbMV0sICJmb3JtYXQiKSkKICAgICAgICAgc2hvd19mb3JtYXRfb3B0cygpOwogICAgIGVsc2UgaWYgKCFzdHJjbXAoYXJndlsxXSwgImNvZGVjIikpCmRpZmYgLS1naXQgYS90b29scy9mb3VyY2MycGl4Zm10LmMgYi90b29scy9mb3VyY2MycGl4Zm10LmMKaW5kZXggNjI1ZjUzMS4uNzViYjYwNyAxMDA2NDQKLS0tIGEvdG9vbHMvZm91cmNjMnBpeGZtdC5jCisrKyBiL3Rvb2xzL2ZvdXJjYzJwaXhmbXQuYwpAQCAtNTEsMTMgKzUxLDkgQEAKIHsKICAgICBpbnQgaTsKIAotICAgIGZvciAoaSA9IDA7IHBpeF9mbXRfdGFnc1tpXS5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORTsgaSsrKSB7Ci0gICAgICAgIGlmIChwaXhfZm10X3RhZ3NbaV0ucGl4X2ZtdCA9PSBwaXhfZm10KSB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlszMl07Ci0gICAgICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyhidWYsIHNpemVvZihidWYpLCBwaXhfZm10X3RhZ3NbaV0uZm91cmNjKTsKLSAgICAgICAgICAgIHByaW50ZigiJXMlYyIsIGJ1Ziwgc2VwKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBmb3IgKGkgPSAwOyBwaXhfZm10X3RhZ3NbaV0ucGl4X2ZtdCAhPSBBVl9QSVhfRk1UX05PTkU7IGkrKykKKyAgICAgICAgaWYgKHBpeF9mbXRfdGFnc1tpXS5waXhfZm10ID09IHBpeF9mbXQpCisgICAgICAgICAgICBwcmludGYoIiVzJWMiLCBhdl9mb3VyY2Myc3RyKHBpeF9mbXRfdGFnc1tpXS5mb3VyY2MpLCBzZXApOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCkBAIC05MiwxMyArODgsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChsaXN0X2ZvdXJjY19waXhfZm10KSB7Ci0gICAgICAgIGZvciAoaSA9IDA7IHBpeF9mbXRfdGFnc1tpXS5waXhfZm10ICE9IEFWX1BJWF9GTVRfTk9ORTsgaSsrKSB7Ci0gICAgICAgICAgICBjaGFyIGJ1ZlszMl07Ci0gICAgICAgICAgICBhdl9nZXRfY29kZWNfdGFnX3N0cmluZyhidWYsIHNpemVvZihidWYpLCBwaXhfZm10X3RhZ3NbaV0uZm91cmNjKTsKLSAgICAgICAgICAgIHByaW50ZigiJXM6ICVzXG4iLCBidWYsIGF2X2dldF9waXhfZm10X25hbWUocGl4X2ZtdF90YWdzW2ldLnBpeF9mbXQpKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBpZiAobGlzdF9mb3VyY2NfcGl4X2ZtdCkKKyAgICAgICAgZm9yIChpID0gMDsgcGl4X2ZtdF90YWdzW2ldLnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9OT05FOyBpKyspCisgICAgICAgICAgICBwcmludGYoIiVzOiAlc1xuIiwgYXZfZm91cmNjMnN0cihwaXhfZm10X3RhZ3NbaV0uZm91cmNjKSwKKyAgICAgICAgICAgICAgICAgICBhdl9nZXRfcGl4X2ZtdF9uYW1lKHBpeF9mbXRfdGFnc1tpXS5waXhfZm10KSk7CiAKICAgICBpZiAobGlzdF9waXhfZm10X2ZvdXJjY3MpIHsKICAgICAgICAgZm9yIChpID0gMDsgYXZfcGl4X2ZtdF9kZXNjX2dldChpKTsgaSsrKSB7CmRpZmYgLS1naXQgYS90b29scy9ncmFwaDJkb3QuYyBiL3Rvb2xzL2dyYXBoMmRvdC5jCmluZGV4IDIxZDA3OTUuLmQ1YzFlNGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2dyYXBoMmRvdC5jCisrKyBiL3Rvb2xzL2dyYXBoMmRvdC5jCkBAIC0xODksOCArMTg5LDYgQEAKICAgICAgICAgKnAgPSAnXDAnOwogICAgIH0KIAotICAgIGF2ZmlsdGVyX3JlZ2lzdGVyX2FsbCgpOwotCiAgICAgaWYgKGF2ZmlsdGVyX2dyYXBoX3BhcnNlKGdyYXBoLCBncmFwaF9zdHJpbmcsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBwYXJzZSB0aGUgZ3JhcGggZGVzY3JpcHRpb25cbiIpOwogICAgICAgICByZXR1cm4gMTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2lzbWluZGV4LmMgYi90b29scy9pc21pbmRleC5jCmluZGV4IGRmZWYxMTguLjc2MDFmNjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2lzbWluZGV4LmMKKysrIGIvdG9vbHMvaXNtaW5kZXguYwpAQCAtNDcsOCArNDcsNiBAQAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlICJjbWR1dGlscy5oIgotCiAjaW5jbHVkZSAibGliYXZmb3JtYXQvYXZmb3JtYXQuaCIKICNpbmNsdWRlICJsaWJhdmZvcm1hdC9pc29tLmgiCiAjaW5jbHVkZSAibGliYXZmb3JtYXQvb3Nfc3VwcG9ydC5oIgpAQCAtMzc1LDcgKzM3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5kdXJhdGlvbiAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5vZmZzZXRzW3RyYWNrLT5jaHVua3MgLSAxXS50aW1lOwogICAgIH0KLSAgICAvLyBOb3cgdHJ5IGFuZCByZWFkIHRoZSBhY3R1YWwgZHVyYXRpb25zIGZyb20gdGhlIHRydW4gc2FtcGxlIGRhdGEuCisgICAgLy8gTm93IHRyeSB0byByZWFkIHRoZSBhY3R1YWwgZHVyYXRpb25zIGZyb20gdGhlIHRydW4gc2FtcGxlIGRhdGEuCiAgICAgZm9yIChpID0gMDsgaSA8IHRyYWNrLT5jaHVua3M7IGkrKykgewogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gcmVhZF9tb29mX2R1cmF0aW9uKGYsIHRyYWNrLT5vZmZzZXRzW2ldLm9mZnNldCk7CiAgICAgICAgIGlmIChkdXJhdGlvbiA+IDAgJiYgbGxhYnMoZHVyYXRpb24gLSB0cmFjay0+b2Zmc2V0c1tpXS5kdXJhdGlvbikgPiAzKSB7CkBAIC00NTMsNDEgKzQ1MSw0MSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3ByaXZhdGVfZGF0YShzdHJ1Y3QgVHJhY2sgKnRyYWNrLCBBVkNvZGVjQ29udGV4dCAqY29kZWMpCitzdGF0aWMgaW50IGdldF9wcml2YXRlX2RhdGEoc3RydWN0IFRyYWNrICp0cmFjaywgQVZDb2RlY1BhcmFtZXRlcnMgKmNvZGVjcGFyKQogewogICAgIHRyYWNrLT5jb2RlY19wcml2YXRlX3NpemUgPSAwOwotICAgIHRyYWNrLT5jb2RlY19wcml2YXRlICAgICAgPSBhdl9tYWxsb2N6KGNvZGVjLT5leHRyYWRhdGFfc2l6ZSk7CisgICAgdHJhY2stPmNvZGVjX3ByaXZhdGUgICAgICA9IGF2X21hbGxvY3ooY29kZWNwYXItPmV4dHJhZGF0YV9zaXplKTsKICAgICBpZiAoIXRyYWNrLT5jb2RlY19wcml2YXRlKQogICAgICAgICByZXR1cm4gQVZFUlJPUihFTk9NRU0pOwotICAgIHRyYWNrLT5jb2RlY19wcml2YXRlX3NpemUgPSBjb2RlYy0+ZXh0cmFkYXRhX3NpemU7Ci0gICAgbWVtY3B5KHRyYWNrLT5jb2RlY19wcml2YXRlLCBjb2RlYy0+ZXh0cmFkYXRhLCBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpOworICAgIHRyYWNrLT5jb2RlY19wcml2YXRlX3NpemUgPSBjb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemU7CisgICAgbWVtY3B5KHRyYWNrLT5jb2RlY19wcml2YXRlLCBjb2RlY3Bhci0+ZXh0cmFkYXRhLCBjb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpOwogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF92aWRlb19wcml2YXRlX2RhdGEoc3RydWN0IFRyYWNrICp0cmFjaywgQVZDb2RlY0NvbnRleHQgKmNvZGVjKQorc3RhdGljIGludCBnZXRfdmlkZW9fcHJpdmF0ZV9kYXRhKHN0cnVjdCBUcmFjayAqdHJhY2ssIEFWQ29kZWNQYXJhbWV0ZXJzICpjb2RlY3BhcikKIHsKICAgICBBVklPQ29udGV4dCAqaW8gPSBOVUxMOwogICAgIHVpbnQxNl90IHNwc19zaXplLCBwcHNfc2l6ZTsKICAgICBpbnQgZXJyOwogCi0gICAgaWYgKGNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEpCi0gICAgICAgIHJldHVybiBnZXRfcHJpdmF0ZV9kYXRhKHRyYWNrLCBjb2RlYyk7CisgICAgaWYgKGNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9WQzEpCisgICAgICAgIHJldHVybiBnZXRfcHJpdmF0ZV9kYXRhKHRyYWNrLCBjb2RlY3Bhcik7CiAKICAgICBpZiAoKGVyciA9IGF2aW9fb3Blbl9keW5fYnVmKCZpbykpIDwgMCkKICAgICAgICAgZ290byBmYWlsOwogICAgIGVyciA9IEFWRVJST1IoRUlOVkFMKTsKLSAgICBpZiAoY29kZWMtPmV4dHJhZGF0YV9zaXplIDwgMTEgfHwgY29kZWMtPmV4dHJhZGF0YVswXSAhPSAxKQorICAgIGlmIChjb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPCAxMSB8fCBjb2RlY3Bhci0+ZXh0cmFkYXRhWzBdICE9IDEpCiAgICAgICAgIGdvdG8gZmFpbDsKLSAgICBzcHNfc2l6ZSA9IEFWX1JCMTYoJmNvZGVjLT5leHRyYWRhdGFbNl0pOwotICAgIGlmICgxMSArIHNwc19zaXplID4gY29kZWMtPmV4dHJhZGF0YV9zaXplKQorICAgIHNwc19zaXplID0gQVZfUkIxNigmY29kZWNwYXItPmV4dHJhZGF0YVs2XSk7CisgICAgaWYgKDExICsgc3BzX3NpemUgPiBjb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUpCiAgICAgICAgIGdvdG8gZmFpbDsKICAgICBhdmlvX3diMzIoaW8sIDB4MDAwMDAwMDEpOwotICAgIGF2aW9fd3JpdGUoaW8sICZjb2RlYy0+ZXh0cmFkYXRhWzhdLCBzcHNfc2l6ZSk7Ci0gICAgcHBzX3NpemUgPSBBVl9SQjE2KCZjb2RlYy0+ZXh0cmFkYXRhWzkgKyBzcHNfc2l6ZV0pOwotICAgIGlmICgxMSArIHNwc19zaXplICsgcHBzX3NpemUgPiBjb2RlYy0+ZXh0cmFkYXRhX3NpemUpCisgICAgYXZpb193cml0ZShpbywgJmNvZGVjcGFyLT5leHRyYWRhdGFbOF0sIHNwc19zaXplKTsKKyAgICBwcHNfc2l6ZSA9IEFWX1JCMTYoJmNvZGVjcGFyLT5leHRyYWRhdGFbOSArIHNwc19zaXplXSk7CisgICAgaWYgKDExICsgc3BzX3NpemUgKyBwcHNfc2l6ZSA+IGNvZGVjcGFyLT5leHRyYWRhdGFfc2l6ZSkKICAgICAgICAgZ290byBmYWlsOwogICAgIGF2aW9fd2IzMihpbywgMHgwMDAwMDAwMSk7Ci0gICAgYXZpb193cml0ZShpbywgJmNvZGVjLT5leHRyYWRhdGFbMTEgKyBzcHNfc2l6ZV0sIHBwc19zaXplKTsKKyAgICBhdmlvX3dyaXRlKGlvLCAmY29kZWNwYXItPmV4dHJhZGF0YVsxMSArIHNwc19zaXplXSwgcHBzX3NpemUpOwogICAgIGVyciA9IDA7CiAKIGZhaWw6CkBAIC01MjcsNyArNTI1LDcgQEAKICAgICAgICAgc3RydWN0IFRyYWNrICoqdGVtcDsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gY3R4LT5zdHJlYW1zW2ldOwogCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmJpdF9yYXRlID09IDApIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTa2lwcGluZyB0cmFjayAlZCBpbiAlcyBhcyBpdCBoYXMgemVybyBiaXRyYXRlXG4iLAogICAgICAgICAgICAgICAgICAgICBzdC0+aWQsIGZpbGUpOwogICAgICAgICAgICAgY29udGludWU7CkBAIC01NTMsMTIgKzU1MSwxMiBAQAogICAgICAgICBpZiAoKHB0ciA9IHN0cnJjaHIoZmlsZSwgJy8nKSkpCiAgICAgICAgICAgICB0cmFjay0+bmFtZSA9IHB0ciArIDE7CiAKLSAgICAgICAgdHJhY2stPmJpdHJhdGUgICA9IHN0LT5jb2RlYy0+Yml0X3JhdGU7CisgICAgICAgIHRyYWNrLT5iaXRyYXRlICAgPSBzdC0+Y29kZWNwYXItPmJpdF9yYXRlOwogICAgICAgICB0cmFjay0+dHJhY2tfaWQgID0gc3QtPmlkOwogICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gc3QtPnRpbWVfYmFzZS5kZW47CiAgICAgICAgIHRyYWNrLT5kdXJhdGlvbiAgPSBzdC0+ZHVyYXRpb247Ci0gICAgICAgIHRyYWNrLT5pc19hdWRpbyAgPSBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICB0cmFjay0+aXNfdmlkZW8gID0gc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgdHJhY2stPmlzX2F1ZGlvICA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHRyYWNrLT5pc192aWRlbyAgPSBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPOwogCiAgICAgICAgIGlmICghdHJhY2stPmlzX2F1ZGlvICYmICF0cmFjay0+aXNfdmlkZW8pIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLApAQCAtNTc2LDMwICs1NzQsMzAgQEAKICAgICAgICAgICAgIGlmICh0cmFja3MtPmF1ZGlvX3RyYWNrIDwgMCkKICAgICAgICAgICAgICAgICB0cmFja3MtPmF1ZGlvX3RyYWNrID0gdHJhY2tzLT5uYl90cmFja3M7CiAgICAgICAgICAgICB0cmFja3MtPm5iX2F1ZGlvX3RyYWNrcysrOwotICAgICAgICAgICAgdHJhY2stPmNoYW5uZWxzICAgID0gc3QtPmNvZGVjLT5jaGFubmVsczsKLSAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9BQUMpIHsKKyAgICAgICAgICAgIHRyYWNrLT5jaGFubmVscyAgICA9IHN0LT5jb2RlY3Bhci0+Y2hhbm5lbHM7CisgICAgICAgICAgICB0cmFjay0+c2FtcGxlX3JhdGUgPSBzdC0+Y29kZWNwYXItPnNhbXBsZV9yYXRlOworICAgICAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfQUFDKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPmZvdXJjYyAgICA9ICJBQUNMIjsKICAgICAgICAgICAgICAgICB0cmFjay0+dGFnICAgICAgID0gMjU1OwogICAgICAgICAgICAgICAgIHRyYWNrLT5ibG9ja3NpemUgPSA0OwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVBSTykgeworICAgICAgICAgICAgfSBlbHNlIGlmIChzdC0+Y29kZWNwYXItPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1dNQVBSTykgewogICAgICAgICAgICAgICAgIHRyYWNrLT5mb3VyY2MgICAgPSAiV01BUCI7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnRhZyAgICAgICA9IHN0LT5jb2RlYy0+Y29kZWNfdGFnOwotICAgICAgICAgICAgICAgIHRyYWNrLT5ibG9ja3NpemUgPSBzdC0+Y29kZWMtPmJsb2NrX2FsaWduOworICAgICAgICAgICAgICAgIHRyYWNrLT50YWcgICAgICAgPSBzdC0+Y29kZWNwYXItPmNvZGVjX3RhZzsKKyAgICAgICAgICAgICAgICB0cmFjay0+YmxvY2tzaXplID0gc3QtPmNvZGVjcGFyLT5ibG9ja19hbGlnbjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldF9wcml2YXRlX2RhdGEodHJhY2ssIHN0LT5jb2RlYyk7CisgICAgICAgICAgICBnZXRfcHJpdmF0ZV9kYXRhKHRyYWNrLCBzdC0+Y29kZWNwYXIpOwogICAgICAgICB9CiAgICAgICAgIGlmICh0cmFjay0+aXNfdmlkZW8pIHsKICAgICAgICAgICAgIGlmICh0cmFja3MtPnZpZGVvX3RyYWNrIDwgMCkKICAgICAgICAgICAgICAgICB0cmFja3MtPnZpZGVvX3RyYWNrID0gdHJhY2tzLT5uYl90cmFja3M7CiAgICAgICAgICAgICB0cmFja3MtPm5iX3ZpZGVvX3RyYWNrcysrOwotICAgICAgICAgICAgdHJhY2stPndpZHRoICA9IHN0LT5jb2RlYy0+d2lkdGg7Ci0gICAgICAgICAgICB0cmFjay0+aGVpZ2h0ID0gc3QtPmNvZGVjLT5oZWlnaHQ7Ci0gICAgICAgICAgICBpZiAoc3QtPmNvZGVjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQorICAgICAgICAgICAgdHJhY2stPndpZHRoICA9IHN0LT5jb2RlY3Bhci0+d2lkdGg7CisgICAgICAgICAgICB0cmFjay0+aGVpZ2h0ID0gc3QtPmNvZGVjcGFyLT5oZWlnaHQ7CisgICAgICAgICAgICBpZiAoc3QtPmNvZGVjcGFyLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9IMjY0KQogICAgICAgICAgICAgICAgIHRyYWNrLT5mb3VyY2MgPSAiSDI2NCI7Ci0gICAgICAgICAgICBlbHNlIGlmIChzdC0+Y29kZWMtPmNvZGVjX2lkID09IEFWX0NPREVDX0lEX1ZDMSkKKyAgICAgICAgICAgIGVsc2UgaWYgKHN0LT5jb2RlY3Bhci0+Y29kZWNfaWQgPT0gQVZfQ09ERUNfSURfVkMxKQogICAgICAgICAgICAgICAgIHRyYWNrLT5mb3VyY2MgPSAiV1ZDMSI7Ci0gICAgICAgICAgICBnZXRfdmlkZW9fcHJpdmF0ZV9kYXRhKHRyYWNrLCBzdC0+Y29kZWMpOworICAgICAgICAgICAgZ2V0X3ZpZGVvX3ByaXZhdGVfZGF0YSh0cmFjaywgc3QtPmNvZGVjcGFyKTsKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrcy0+bmJfdHJhY2tzKys7CkBAIC03OTMsOCArNzkxLDYgQEAKICAgICBpbnQgc3BsaXQgPSAwLCBpc21mID0gMCwgaTsKICAgICBzdHJ1Y3QgVHJhY2tzIHRyYWNrcyA9IHsgMCwgLnZpZGVvX3RyYWNrID0gLTEsIC5hdWRpb190cmFjayA9IC0xIH07CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1uIikpIHsKICAgICAgICAgICAgIGJhc2VuYW1lID0gYXJndltpICsgMV07CmRpZmYgLS1naXQgYS90b29scy9saWJhdi1tZXJnZS1uZXh0LWNvbW1pdCBiL3Rvb2xzL2xpYmF2LW1lcmdlLW5leHQtY29tbWl0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjliZDAzZmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9saWJhdi1tZXJnZS1uZXh0LWNvbW1pdApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKworaWYgWyAiJDEiICE9ICJtZXJnZSIgLWEgIiQxIiAhPSAibm9vcCIgXTsgdGhlbgorICAgIHByaW50ZiAiVXNhZ2U6ICQwIDxtZXJnZXxub29wIFtSRUZfSEFTSF0+XG4iCisgICAgZXhpdCAwCitmaQorCitbICIkMSIgPSAibm9vcCIgXSAmJiBtZXJnZV9vcHRzPSItcyBvdXJzIgorCituZXh0cmV2PSQoZ2l0IHJldi1saXN0IGxpYmF2L21hc3RlciAtLW5vdCBtYXN0ZXIgLS1uby1tZXJnZXMgfCB0YWlsIC1uMSkKK2lmIFsgLXogIiRuZXh0cmV2IiBdOyB0aGVuCisgICAgcHJpbnRmICJOb3RoaW5nIHRvIG1lcmdlLi5cbiIKKyAgICBleGl0IDAKK2ZpCitwcmludGYgIk1lcmdpbmcgJChnaXQgbG9nIC1uIDEgLS1vbmVsaW5lICRuZXh0cmV2KVxuIgorZ2l0IG1lcmdlIC0tbm8tY29tbWl0ICRtZXJnZV9vcHRzIC0tbm8tZmYgLS1sb2cgJG5leHRyZXYKKworaWYgWyAiJDEiID0gIm5vb3AiIC1hIC1uICIkMiIgXTsgdGhlbgorICAgIHByaW50ZiAiXG5UaGlzIGNvbW1pdCBpcyBhIG5vb3AsIHNlZSAkMlxuIiA+PiAuZ2l0L01FUkdFX01TRworZmkKKworcHJpbnRmICJcbk1lcmdlZC1ieTogJChnaXQgY29uZmlnIC0tZ2V0IHVzZXIubmFtZSkgPCQoZ2l0IGNvbmZpZyAtLWdldCB1c2VyLmVtYWlsKT5cbiIgPj4gLmdpdC9NRVJHRV9NU0cKZGlmZiAtLWdpdCBhL3Rvb2xzL2xvdWRub3JtLnJiIGIvdG9vbHMvbG91ZG5vcm0ucmIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGFkMzc0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2xvdWRub3JtLnJiCkBAIC0wLDAgKzEsNjEgQEAKKyMhL3Vzci9iaW4vZW52IHJ1YnkKKworcmVxdWlyZSAnb3BlbjMnCityZXF1aXJlICdqc29uJworCitmZm1wZWdfYmluID0gJ2ZmbXBlZycKK3RhcmdldF9pbCAgPSAtMjQuMAordGFyZ2V0X2xyYSA9ICsxMS4wCit0YXJnZXRfdHAgID0gLTIuMAorc2FtcGxlcmF0ZSA9ICc0OGsnCisKK2lmIEFSR0YuYXJndi5jb3VudCAhPSAyCisgIHB1dHMgIlVzYWdlOiAjeyRQUk9HUkFNX05BTUV9IGlucHV0LndhdiBvdXRwdXQud2F2IgorICBleGl0IDEKK2VuZAorCitmZl9jbWQgPSBBcnJheS5uZXcoWworICBmZm1wZWdfYmluLAorICAnLWhpZGVfYmFubmVyJywKKyAgJy1pJywgQVJHRi5hcmd2WzBdLAorICAnLWFmJywgImxvdWRub3JtPSdJPSN7dGFyZ2V0X2lsfTpMUkE9I3t0YXJnZXRfbHJhfTp0cD0je3RhcmdldF90cH06cHJpbnRfZm9ybWF0PWpzb24nIiwKKyAgJy1mJywgJ251bGwnLAorICAnLSddKTsKKworX3N0ZGluLCBfc3Rkb3V0LCBzdGRlcnIsIHdhaXRfdGhyID0gT3BlbjMucG9wZW4zKCpmZl9jbWQpCisKK2lmIHdhaXRfdGhyLnZhbHVlLnN1Y2Nlc3M/CisgIHN0YXRzID0gSlNPTi5wYXJzZShzdGRlcnIucmVhZC5saW5lc1stMTIsIDEyXS5qb2luKQorICBsb3Vkbm9ybV9zdHJpbmcgID0gJ2xvdWRub3JtPScKKyAgbG91ZG5vcm1fc3RyaW5nICs9ICdwcmludF9mb3JtYXQ9c3VtbWFyeTonCisgIGxvdWRub3JtX3N0cmluZyArPSAnbGluZWFyPXRydWU6JworICBsb3Vkbm9ybV9zdHJpbmcgKz0gIkk9I3t0YXJnZXRfaWx9OiIKKyAgbG91ZG5vcm1fc3RyaW5nICs9ICJMUkE9I3t0YXJnZXRfbHJhfToiCisgIGxvdWRub3JtX3N0cmluZyArPSAidHA9I3t0YXJnZXRfdHB9OiIKKyAgbG91ZG5vcm1fc3RyaW5nICs9ICJtZWFzdXJlZF9JPSN7c3RhdHNbJ2lucHV0X2knXX06IgorICBsb3Vkbm9ybV9zdHJpbmcgKz0gIm1lYXN1cmVkX0xSQT0je3N0YXRzWydpbnB1dF9scmEnXX06IgorICBsb3Vkbm9ybV9zdHJpbmcgKz0gIm1lYXN1cmVkX3RwPSN7c3RhdHNbJ2lucHV0X3RwJ119OiIKKyAgbG91ZG5vcm1fc3RyaW5nICs9ICJtZWFzdXJlZF90aHJlc2g9I3tzdGF0c1snaW5wdXRfdGhyZXNoJ119OiIKKyAgbG91ZG5vcm1fc3RyaW5nICs9ICJvZmZzZXQ9I3tzdGF0c1sndGFyZ2V0X29mZnNldCddfSIKK2Vsc2UKKyAgcHV0cyBzdGRlcnIucmVhZAorICBleGl0IDEKK2VuZAorCitmZl9jbWQgPSBBcnJheS5uZXcoWworICBmZm1wZWdfYmluLAorICAnLXknLCAnLWhpZGVfYmFubmVyJywKKyAgJy1pJywgQVJHRi5hcmd2WzBdLAorICAnLWFmJywgbG91ZG5vcm1fc3RyaW5nLAorICAnLWFyJywgc2FtcGxlcmF0ZSwKKyAgQVJHRi5hcmd2WzFdLnRvX3NdKTsKKworX3N0ZGluLCBfc3Rkb3V0LCBzdGRlcnIsIHdhaXRfdGhyID0gT3BlbjMucG9wZW4zKCpmZl9jbWQpCisKK2lmIHdhaXRfdGhyLnZhbHVlLnN1Y2Nlc3M/CisgIHB1dHMgc3RkZXJyLnJlYWQubGluZXNbLTEyLCAxMl0uam9pbgorICBleGl0IDAKK2Vsc2UKKyAgcHV0cyBzdGRlcnIucmVhZAorICBleGl0IDEKK2VuZApkaWZmIC0tZ2l0IGEvdG9vbHMvbXVyZ2UgYi90b29scy9tdXJnZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMjJmY2ZkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbXVyZ2UKQEAgLTAsMCArMSwxMSBAQAorIyEvYmluL3NoCisKK2dyZXAgLUE5OTk5OSAnXjw8PDw8PDwnIHwgZ3JlcCAtQjk5OTk5ICdePj4+Pj4+PicgPm11cmdlLlgKK2dyZXAgLUE5OTk5OSAnXj09PT0nIG11cmdlLlggfCBlZ3JlcCAtdiAnXig9PT09PT09fDw8PDw8PDx8Pj4+Pj4+PnxcfFx8XHxcfFx8XHxcfCknID5tdXJnZS50aGVpcnMKK2dyZXAgLUI5OTk5OSAnXnx8fHwnIG11cmdlLlggfCBlZ3JlcCAtdiAnXig9PT09PT09fDw8PDw8PDx8Pj4+Pj4+PnxcfFx8XHxcfFx8XHxcfCknID5tdXJnZS5vdXJzCitncmVwIC1COTk5OTkgJ149PT09JyBtdXJnZS5YIHwgZ3JlcCAtQTk5OTk5ICdefHx8fCcgfCBlZ3JlcCAtdiAnXig9PT09PT09fDw8PDw8PDx8Pj4+Pj4+PnxcfFx8XHxcfFx8XHxcfCknICA+bXVyZ2UuY29tbW9uCisKK2NvbG9yZGlmZiAtZHUgJCogbXVyZ2Uub3VycyBtdXJnZS50aGVpcnMKK2dyZXAgLiBtdXJnZS5jb21tb24gPiAvZGV2L251bGwgJiYgY29sb3JkaWZmIC1kdSAkKiBtdXJnZS5jb21tb24gbXVyZ2UudGhlaXJzCitncmVwIC4gbXVyZ2UuY29tbW9uID4gL2Rldi9udWxsICYmIGNvbG9yZGlmZiAtZHUgJCogbXVyZ2UuY29tbW9uIG11cmdlLm91cnMKK3JtIG11cmdlLnRoZWlycyBtdXJnZS5jb21tb24gbXVyZ2Uub3VycyBtdXJnZS5YCmRpZmYgLS1naXQgYS90b29scy9wYXRjaGVjayBiL3Rvb2xzL3BhdGNoZWNrCmluZGV4IDA2NDgyZTIuLjEwMWE1NDIgMTAwNzU1Ci0tLSBhL3Rvb2xzL3BhdGNoZWNrCisrKyBiL3Rvb2xzL3BhdGNoZWNrCkBAIC02OCw3ICs2OCw3IEBACiBjYXQgJFRNUAogaGllZ3JlcCAnIyAqaWZkZWYgKiAoSEFWRXxDT05GSUcpXycgJ2lmZGVmcyB0aGF0IHNob3VsZCBiZSAjaWYnICQqCiAKLWhpZWdyZXAgJ1xiKGF3bnNlcnxjYW50fGRvbnR8d29udHxkb2VzbnR8dXNlZnVsbHxzdWNjZXNzZnVsbHxvY2N1cmVkfHRlaHxhbG90fHdldGhlcnxza2lwZWR8c2tpcGluZ3xoZWlndGh8aW5mb3JtYXRpb25zfGNvbHVtc3xsb29zeXxsb29zaW5nfG91cHV0fHNlcGVyYXRlfHByZWNlZWR8dXB0b3xwYWtldHxwb3NpYmxlfHVua293bnxpbnBvc3NpYmxlfGRpbWVudGlvbnxhY2hlaXZlfGZ1bnRpb25zfG92ZXJyaWRlbnxvdXRwdXRpbmd8c2VwZXJhdGlvbnxpbml0YWxpemV8Y29tcGF0aWJpbHR5fGJpc3RyZWFtfGtud29ufHVua253b258Y2hvb3NlbnxhZGRpdG9uYWx8Z3VyYW50ZWV8YXZhaWxibGV8d2ljaClcYicgJ2NvbW1vbiB0eXBvcycgJCoKK2hpZWdyZXAgJ1xiKGF3bnNlcnxjYW50fGRvbnR8d29udHxkb2VzbnR8dXNlZnVsbHxzdWNjZXNzZnVsbHxvY2N1cmVkfHRlaHxhbG90fHdldGhlcnxza2lwZWR8c2tpcGluZ3xoZWlndGh8aW5mb3JtYXRpb25zfGNvbHVtc3xsb29zeXxsb29zaW5nfG91cHV0fHNlcGVyYXRlfHByZWNlZWR8dXB0b3xwYWtldHxwb3NpYmxlfHVua293bnxpbnBvc3NpYmxlfGRpbWVudGlvbnxhY2hlaXZlfGZ1bnRpb25zfG92ZXJyaWRlbnxvdXRwdXRpbmd8c2VwZXJhdGlvbnxpbml0YWxpemV8Y29tcGF0aWJpbHR5fGJpc3RyZWFtfGtud29ufHVua253b258Y2hvb3NlbnxhZGRpdG9uYWx8Z3VyYW50ZWV8YXZhaWxibGV8d2ljaHxiZWdpbmluZ3xtaWxpc2Vjb25kfG1pc3NtYXRjaHx0aHJlc2hob2xkKVxiJyAnY29tbW9uIHR5cG9zJyAkKgogCiBoaWVncmVwICdhdl9sb2dcKCAqTlVMTCcgJ01pc3NpbmcgY29udGV4dCBpbiBhdl9sb2cnICQqCiBoaWVncmVwICdbXnNuXXByaW50ZicgJ1BsZWFzZSB1c2UgYXZfbG9nJyAkKgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGt0ZHVtcGVyLmMgYi90b29scy9wa3RkdW1wZXIuYwppbmRleCA2NTE2YWQzLi4xNmE5NjViIDEwMDY0NAotLS0gYS90b29scy9wa3RkdW1wZXIuYworKysgYi90b29scy9wa3RkdW1wZXIuYwpAQCAtODksOSArODksNiBAQAogICAgIHN0cmNhdChmbnRlbXBsYXRlLCBQS1RGSUxFU1VGRik7CiAgICAgcHJpbnRmKCJGTlRFTVBMQVRFOiAnJXMnXG4iLCBmbnRlbXBsYXRlKTsKIAotICAgIC8vIHJlZ2lzdGVyIGFsbCBmaWxlIGZvcm1hdHMKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGVyciA9IGF2Zm9ybWF0X29wZW5faW5wdXQoJmZjdHgsIGFyZ3ZbMV0sIE5VTEwsIE5VTEwpOwogICAgIGlmIChlcnIgPCAwKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiY2Fubm90IG9wZW4gaW5wdXQ6IGVycm9yICVkXG4iLCBlcnIpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcHJvYmV0ZXN0LmMgYi90b29scy9wcm9iZXRlc3QuYwppbmRleCA3NDA0NWViLi4yYzZjMWRlIDEwMDY0NAotLS0gYS90b29scy9wcm9iZXRlc3QuYworKysgYi90b29scy9wcm9iZXRlc3QuYwpAQCAtMTI0LDkgKzEyNCw2IEBACiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIGF2Y29kZWNfcmVnaXN0ZXJfYWxsKCk7Ci0gICAgYXZfcmVnaXN0ZXJfYWxsKCk7Ci0KICAgICBhdl9sZmdfaW5pdCgmc3RhdGUsIDB4ZGVhZGJlZWYpOwogCiAgICAgcGQuYnVmID0gTlVMTDsKZGlmZiAtLWdpdCBhL3Rvb2xzL3NlZWtfcHJpbnQuYyBiL3Rvb2xzL3NlZWtfcHJpbnQuYwppbmRleCBkZTg3NmI0Li45MjgwNDIxIDEwMDY0NAotLS0gYS90b29scy9zZWVrX3ByaW50LmMKKysrIGIvdG9vbHMvc2Vla19wcmludC5jCkBAIC02NSw3ICs2NSw2IEBACiAgICAgYXJndisrOwogICAgIGFyZ2MtLTsKIAotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwogICAgIGlmICgocmV0ID0gYXZmb3JtYXRfb3Blbl9pbnB1dCgmYXZmLCBmaWxlbmFtZSwgTlVMTCwgTlVMTCkpIDwgMCkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiAlc1xuIiwgZmlsZW5hbWUsIGF2X2VycjJzdHIocmV0KSk7CiAgICAgICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvdG9vbHMvc2lkeGluZGV4LmMgYi90b29scy9zaWR4aW5kZXguYwppbmRleCA1MDRjNTk1Li5hNGY5NTUxIDEwMDY0NAotLS0gYS90b29scy9zaWR4aW5kZXguYworKysgYi90b29scy9zaWR4aW5kZXguYwpAQCAtNTIsMjIgKzUyLDIzIEBACiAgICAgaW50IG11bHRpcGxlX3RyYWNrc19wZXJfZmlsZTsKIH07CiAKLXN0YXRpYyB2b2lkIHNldF9jb2RlY19zdHIoQVZDb2RlY0NvbnRleHQgKmNvZGVjLCBjaGFyICpzdHIsIGludCBzaXplKQorc3RhdGljIHZvaWQgc2V0X2NvZGVjX3N0cihBVkNvZGVjUGFyYW1ldGVycyAqY29kZWNwYXIsIGNoYXIgKnN0ciwgaW50IHNpemUpCiB7Ci0gICAgc3dpdGNoIChjb2RlYy0+Y29kZWNfaWQpIHsKKyAgICBzd2l0Y2ggKGNvZGVjcGFyLT5jb2RlY19pZCkgewogICAgIGNhc2UgQVZfQ09ERUNfSURfSDI2NDoKICAgICAgICAgc25wcmludGYoc3RyLCBzaXplLCAiYXZjMSIpOwotICAgICAgICBpZiAoY29kZWMtPmV4dHJhZGF0YV9zaXplID49IDQgJiYgY29kZWMtPmV4dHJhZGF0YVswXSA9PSAxKSB7CisgICAgICAgIGlmIChjb2RlY3Bhci0+ZXh0cmFkYXRhX3NpemUgPj0gNCAmJiBjb2RlY3Bhci0+ZXh0cmFkYXRhWzBdID09IDEpIHsKICAgICAgICAgICAgIGF2X3N0cmxjYXRmKHN0ciwgc2l6ZSwgIi4lMDJ4JTAyeCUwMngiLAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWMtPmV4dHJhZGF0YVsxXSwgY29kZWMtPmV4dHJhZGF0YVsyXSwgY29kZWMtPmV4dHJhZGF0YVszXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3Bhci0+ZXh0cmFkYXRhWzFdLCBjb2RlY3Bhci0+ZXh0cmFkYXRhWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNwYXItPmV4dHJhZGF0YVszXSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVl9DT0RFQ19JRF9BQUM6CiAgICAgICAgIHNucHJpbnRmKHN0ciwgc2l6ZSwgIm1wNGEuNDAiKTsgLy8gMHg0MCBpcyB0aGUgbXA0IG9iamVjdCB0eXBlIGZvciBBQUMKLSAgICAgICAgaWYgKGNvZGVjLT5leHRyYWRhdGFfc2l6ZSA+PSAyKSB7Ci0gICAgICAgICAgICBpbnQgYW90ID0gY29kZWMtPmV4dHJhZGF0YVswXSA+PiAzOworICAgICAgICBpZiAoY29kZWNwYXItPmV4dHJhZGF0YV9zaXplID49IDIpIHsKKyAgICAgICAgICAgIGludCBhb3QgPSBjb2RlY3Bhci0+ZXh0cmFkYXRhWzBdID4+IDM7CiAgICAgICAgICAgICBpZiAoYW90ID09IDMxKQotICAgICAgICAgICAgICAgIGFvdCA9ICgoQVZfUkIxNihjb2RlYy0+ZXh0cmFkYXRhKSA+PiA1KSAmIDB4M2YpICsgMzI7CisgICAgICAgICAgICAgICAgYW90ID0gKChBVl9SQjE2KGNvZGVjcGFyLT5leHRyYWRhdGEpID4+IDUpICYgMHgzZikgKyAzMjsKICAgICAgICAgICAgIGF2X3N0cmxjYXRmKHN0ciwgc2l6ZSwgIi4lZCIsIGFvdCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC0xNDUsNyArMTQ2LDcgQEAKICAgICAgICAgc3RydWN0IFRyYWNrICoqdGVtcDsKICAgICAgICAgQVZTdHJlYW0gKnN0ID0gY3R4LT5zdHJlYW1zW2ldOwogCi0gICAgICAgIGlmIChzdC0+Y29kZWMtPmJpdF9yYXRlID09IDApIHsKKyAgICAgICAgaWYgKHN0LT5jb2RlY3Bhci0+Yml0X3JhdGUgPT0gMCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJTa2lwcGluZyB0cmFjayAlZCBpbiAlcyBhcyBpdCBoYXMgemVybyBiaXRyYXRlXG4iLAogICAgICAgICAgICAgICAgICAgICBzdC0+aWQsIGZpbGUpOwogICAgICAgICAgICAgY29udGludWU7CkBAIC0xNzAsMTIgKzE3MSwxMiBAQAogICAgICAgICBpZiAoKHB0ciA9IHN0cnJjaHIoZmlsZSwgJy8nKSkpCiAgICAgICAgICAgICB0cmFjay0+bmFtZSA9IHB0ciArIDE7CiAKLSAgICAgICAgdHJhY2stPmJpdHJhdGUgICA9IHN0LT5jb2RlYy0+Yml0X3JhdGU7CisgICAgICAgIHRyYWNrLT5iaXRyYXRlICAgPSBzdC0+Y29kZWNwYXItPmJpdF9yYXRlOwogICAgICAgICB0cmFjay0+dHJhY2tfaWQgID0gc3QtPmlkOwogICAgICAgICB0cmFjay0+dGltZXNjYWxlID0gc3QtPnRpbWVfYmFzZS5kZW47CiAgICAgICAgIHRyYWNrLT5kdXJhdGlvbiAgPSBzdC0+ZHVyYXRpb247Ci0gICAgICAgIHRyYWNrLT5pc19hdWRpbyAgPSBzdC0+Y29kZWMtPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPOwotICAgICAgICB0cmFjay0+aXNfdmlkZW8gID0gc3QtPmNvZGVjLT5jb2RlY190eXBlID09IEFWTUVESUFfVFlQRV9WSURFTzsKKyAgICAgICAgdHJhY2stPmlzX2F1ZGlvICA9IHN0LT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU87CisgICAgICAgIHRyYWNrLT5pc192aWRlbyAgPSBzdC0+Y29kZWNwYXItPmNvZGVjX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPOwogCiAgICAgICAgIGlmICghdHJhY2stPmlzX2F1ZGlvICYmICF0cmFjay0+aXNfdmlkZW8pIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLApAQCAtMTkwLDE0ICsxOTEsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUsIEFWX1JPVU5EX1VQKSk7CiAKICAgICAgICAgaWYgKHRyYWNrLT5pc19hdWRpbykgewotICAgICAgICAgICAgdHJhY2stPmNoYW5uZWxzICAgID0gc3QtPmNvZGVjLT5jaGFubmVsczsKLSAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVfcmF0ZSA9IHN0LT5jb2RlYy0+c2FtcGxlX3JhdGU7CisgICAgICAgICAgICB0cmFjay0+Y2hhbm5lbHMgICAgPSBzdC0+Y29kZWNwYXItPmNoYW5uZWxzOworICAgICAgICAgICAgdHJhY2stPnNhbXBsZV9yYXRlID0gc3QtPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZTsKICAgICAgICAgfQogICAgICAgICBpZiAodHJhY2stPmlzX3ZpZGVvKSB7Ci0gICAgICAgICAgICB0cmFjay0+d2lkdGggID0gc3QtPmNvZGVjLT53aWR0aDsKLSAgICAgICAgICAgIHRyYWNrLT5oZWlnaHQgPSBzdC0+Y29kZWMtPmhlaWdodDsKKyAgICAgICAgICAgIHRyYWNrLT53aWR0aCAgPSBzdC0+Y29kZWNwYXItPndpZHRoOworICAgICAgICAgICAgdHJhY2stPmhlaWdodCA9IHN0LT5jb2RlY3Bhci0+aGVpZ2h0OwogICAgICAgICB9Ci0gICAgICAgIHNldF9jb2RlY19zdHIoc3QtPmNvZGVjLCB0cmFjay0+Y29kZWNfc3RyLCBzaXplb2YodHJhY2stPmNvZGVjX3N0cikpOworICAgICAgICBzZXRfY29kZWNfc3RyKHN0LT5jb2RlY3BhciwgdHJhY2stPmNvZGVjX3N0ciwgc2l6ZW9mKHRyYWNrLT5jb2RlY19zdHIpKTsKIAogICAgICAgICB0cmFja3MtPm5iX3RyYWNrcysrOwogICAgIH0KQEAgLTM2Miw4ICszNjMsNiBAQAogICAgIHN0cnVjdCBUcmFja3MgdHJhY2tzID0geyAwIH07CiAgICAgaW50IGk7CiAKLSAgICBhdl9yZWdpc3Rlcl9hbGwoKTsKLQogICAgIGZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1vdXQiKSkgewogICAgICAgICAgICAgb3V0ID0gYXJndltpICsgMV07CmRpZmYgLS1naXQgYS90b29scy9zb2ZhMndhdnMuYyBiL3Rvb2xzL3NvZmEyd2F2cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMTA3NWIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zb2ZhMndhdnMuYwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3IFBhdWwgQiBNYWhvbAorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG15c29mYS5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisgICAgc3RydWN0IE1ZU09GQV9IUlRGICpocnRmOworICAgIGludCBzYW1wbGVfcmF0ZTsKKyAgICBpbnQgZXJyLCBpLCBqOworCisgICAgaWYgKGFyZ2MgPCAzKSB7CisgICAgICAgIHByaW50ZigidXNhZ2U6ICVzIGlucHV0X1NPRkFfZmlsZSBvdXRwdXRfZGlyZWN0b3J5XG4iLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaHJ0ZiA9IG15c29mYV9sb2FkKGFyZ3ZbMV0sICZlcnIpOworICAgIGlmICghaHJ0ZiB8fCBlcnIpIHsKKyAgICAgICAgcHJpbnRmKCJpbnZhbGlkIGlucHV0IFNPRkEgZmlsZTogJXNcbiIsIGFyZ3ZbMV0pOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBpZiAoaHJ0Zi0+RGF0YVNhbXBsaW5nUmF0ZS5lbGVtZW50cyAhPSAxKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgc2FtcGxlX3JhdGUgPSBocnRmLT5EYXRhU2FtcGxpbmdSYXRlLnZhbHVlc1swXTsKKworICAgIGVyciA9IG1rZGlyKGFyZ3ZbMl0sIDA3NDQpOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGVyciA9IGNoZGlyKGFyZ3ZbMl0pOworICAgIGlmIChlcnIpCisgICAgICAgIGdvdG8gZmFpbDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBocnRmLT5NOyBpKyspIHsKKyAgICAgICAgRklMRSAqZmlsZTsKKyAgICAgICAgaW50IGJwcyA9IDMyOworICAgICAgICBpbnQgYmxrYWxpZ24gPSA4OworICAgICAgICBpbnQgYnl0ZXNwZXJzZWMgPSBibGthbGlnbiAqIHNhbXBsZV9yYXRlOworICAgICAgICBjaGFyIGZpbGVuYW1lWzEwMjRdOworICAgICAgICBpbnQgYXppID0gaHJ0Zi0+U291cmNlUG9zaXRpb24udmFsdWVzW2kgKiAzXTsKKyAgICAgICAgaW50IGVsZSA9IGhydGYtPlNvdXJjZVBvc2l0aW9uLnZhbHVlc1tpICogMyArIDFdOworICAgICAgICBpbnQgZGlzID0gaHJ0Zi0+U291cmNlUG9zaXRpb24udmFsdWVzW2kgKiAzICsgMl07CisgICAgICAgIGludCBzaXplID0gOCAqIGhydGYtPk47CisgICAgICAgIGludCBvZmZzZXQgPSBpICogMiAqIGhydGYtPk47CisKKyAgICAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICJhemlfJWRfZWxlXyVkX2Rpc18lZC53YXYiLCBhemksIGVsZSwgZGlzKTsKKyAgICAgICAgZmlsZSA9IGZvcGVuKGZpbGVuYW1lLCAidysiKTsKKyAgICAgICAgZndyaXRlKCJSSUZGIiwgNCwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgiXHhGRlx4RkZceEZGXHhGRiIsIDQsIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoIldBVkUiLCA0LCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKCJmbXQgIiwgNCwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgiXHgxMFx4MDBcMDBcMDAiLCA0LCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKCJceDAzXHgwMCIsIDIsIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoIlx4MDJceDAwIiwgMiwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgmc2FtcGxlX3JhdGUsIDQsIDEsIGZpbGUpOworICAgICAgICBmd3JpdGUoJmJ5dGVzcGVyc2VjLCA0LCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKCZibGthbGlnbiwgMiwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgmYnBzLCAyLCAxLCBmaWxlKTsKKyAgICAgICAgZndyaXRlKCJkYXRhIiwgNCwgMSwgZmlsZSk7CisgICAgICAgIGZ3cml0ZSgmc2l6ZSwgNCwgMSwgZmlsZSk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGhydGYtPk47IGorKykgeworICAgICAgICAgICAgZmxvYXQgbCwgcjsKKworICAgICAgICAgICAgbCA9IGhydGYtPkRhdGFJUi52YWx1ZXNbb2Zmc2V0ICsgal07CisgICAgICAgICAgICByID0gaHJ0Zi0+RGF0YUlSLnZhbHVlc1tvZmZzZXQgKyBqICsgaHJ0Zi0+Tl07CisgICAgICAgICAgICBmd3JpdGUoJmwsIDQsIDEsIGZpbGUpOworICAgICAgICAgICAgZndyaXRlKCZyLCA0LCAxLCBmaWxlKTsKKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgfQorCitmYWlsOgorICAgIG15c29mYV9mcmVlKGhydGYpOworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy90YXJnZXRfZGVjX2Z1enplci5jIGIvdG9vbHMvdGFyZ2V0X2RlY19mdXp6ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQ2MmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvdGFyZ2V0X2RlY19mdXp6ZXIuYwpAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZGbXBlZy4KKyAqCisgKiBGRm1wZWcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEZGbXBlZyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCBGRm1wZWc7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLworCisvKiBUYXJnZXRlZCBmdXp6ZXIgdGhhdCB0YXJnZXRzIHNwZWNpZmljIGNvZGVjcyBkZXBlbmRpbmcgb24gdHdvCisgICBjb21waWxlLXRpbWUgZmxhZ3MuCisgIElOU1RSVUNUSU9OUzoKKworICAqIEdldCB0aGUgdmVyeSBmcmVzaCBjbGFuZywgZS5nLiBzZWUgaHR0cDovL2xpYmZ1enplci5pbmZvI3ZlcnNpb25zCisgICogR2V0IGFuZCBidWlsZCBsaWJGdXp6ZXI6CisgICAgIHN2biBjbyBodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9sbHZtL3RydW5rL2xpYi9GdXp6ZXIKKyAgICAgLi9GdXp6ZXIvYnVpbGQuc2gKKyAgKiBidWlsZCBmZm1wZWcgZm9yIGZ1enppbmc6CisgICAgRkxBR1M9Ii1mc2FuaXRpemU9YWRkcmVzcyAtZnNhbml0aXplLWNvdmVyYWdlPXRyYWNlLXBjLWd1YXJkLHRyYWNlLWNtcCAtZyIgQ0M9ImNsYW5nICRGTEFHUyIgQ1hYPSJjbGFuZysrICRGTEFHUyIgLi9jb25maWd1cmUgIC0tZGlzYWJsZS14ODZhc20KKyAgICBtYWtlIGNsZWFuICYmIG1ha2UgLWoKKyAgKiBidWlsZCB0aGUgZnV6eiB0YXJnZXQuCisgICAgQ2hvb3NlIHRoZSB2YWx1ZSBvZiBGRk1QRUdfQ09ERUMgKGUuZy4gQVZfQ09ERUNfSURfRFZEX1NVQlRJVExFKSBhbmQKKyAgICBjaG9vc2Ugb25lIG9mIEZVWlpfRkZNUEVHX1ZJREVPLCBGVVpaX0ZGTVBFR19BVURJTywgRlVaWl9GRk1QRUdfU1VCVElUTEUuCisgICAgY2xhbmcgLWZzYW5pdGl6ZT1hZGRyZXNzIC1mc2FuaXRpemUtY292ZXJhZ2U9dHJhY2UtcGMtZ3VhcmQsdHJhY2UtY21wIHRvb2xzL3RhcmdldF9kZWNfZnV6emVyLmMgLW8gdGFyZ2V0X2RlY19mdXp6ZXIgLUkuICAgLURGRk1QRUdfQ09ERUM9QVZfQ09ERUNfSURfTVBFRzFWSURFTyAtREZVWlpfRkZNUEVHX1ZJREVPIC4uLy4uL2xpYmZ1enplci9saWJGdXp6ZXIuYSAgIC1MbGliYXZjb2RlYyAtTGxpYmF2ZGV2aWNlIC1MbGliYXZmaWx0ZXIgLUxsaWJhdmZvcm1hdCAtTGxpYmF2cmVzYW1wbGUgLUxsaWJhdnV0aWwgLUxsaWJwb3N0cHJvYyAtTGxpYnN3c2NhbGUgLUxsaWJzd3Jlc2FtcGxlIC1XbCwtLWFzLW5lZWRlZCAtV2wsLXosbm9leGVjc3RhY2sgLVdsLC0td2Fybi1jb21tb24gLVdsLC1ycGF0aC1saW5rPWxpYnBvc3Rwcm9jOmxpYnN3cmVzYW1wbGU6bGlic3dzY2FsZTpsaWJhdmZpbHRlcjpsaWJhdmRldmljZTpsaWJhdmZvcm1hdDpsaWJhdmNvZGVjOmxpYmF2dXRpbDpsaWJhdnJlc2FtcGxlIC1sYXZkZXZpY2UgLWxhdmZpbHRlciAtbGF2Zm9ybWF0IC1sYXZjb2RlYyAtbHN3cmVzYW1wbGUgLWxzd3NjYWxlIC1sYXZ1dGlsIC1sZGwgLWx4Y2IgLWx4Y2Itc2htIC1seGNiIC1seGNiLXhmaXhlcyAgLWx4Y2IgLWx4Y2Itc2hhcGUgLWx4Y2IgLWxYMTEgLWxhc291bmQgLWxtIC1sYnoyIC1seiAtcHRocmVhZAorICAqIGNyZWF0ZSBhIGNvcnB1cyBkaXJlY3RvcnkgYW5kIHB1dCBzb21lIHNhbXBsZXMgdGhlcmUgKGVtcHR5IGRpciBpcyBvayB0b28pOgorICAgIG1rZGlyIENPUlBVUyAmJiBjcCBzb21lLWZpbGVzIENPUlBVUworCisgICogUnVuIGZ1enppbmc6CisgICAgLi90YXJnZXRfZGVjX2Z1enplciAtbWF4X2xlbj0xMDAwMDAgQ09SUFVTCisKKyAgIE1vcmUgaW5mbzoKKyAgIGh0dHA6Ly9saWJmdXp6ZXIuaW5mbworICAgaHR0cDovL3R1dG9yaWFsLmxpYmZ1enplci5pbmZvCisgICBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CisgICBodHRwOi8vbGNhbXR1Zi5jb3JlZHVtcC5jeC9hZmwvCisgICBodHRwczovL3NlY3VyaXR5Lmdvb2dsZWJsb2cuY29tLzIwMTYvMDgvZ3VpZGVkLWluLXByb2Nlc3MtZnV6emluZy1vZi1jaHJvbWUuaHRtbAorKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9hdmFzc2VydC5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbWd1dGlscy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9pbnRyZWFkd3JpdGUuaCIKKworI2luY2x1ZGUgImxpYmF2Y29kZWMvYXZjb2RlYy5oIgorI2luY2x1ZGUgImxpYmF2Y29kZWMvYnl0ZXN0cmVhbS5oIgorI2luY2x1ZGUgImxpYmF2Zm9ybWF0L2F2Zm9ybWF0LmgiCisKK2ludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKKworc3RhdGljIHZvaWQgZXJyb3IoY29uc3QgY2hhciAqZXJyKQoreworICAgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBlcnIpOworICAgIGV4aXQoMSk7Cit9CisKK3N0YXRpYyBBVkNvZGVjICpjID0gTlVMTDsKK3N0YXRpYyBBVkNvZGVjICpBVkNvZGVjSW5pdGlhbGl6ZShlbnVtIEFWQ29kZWNJRCBjb2RlY19pZCkKK3sKKyAgICBBVkNvZGVjICpyZXM7CisKKyAgICByZXMgPSBhdmNvZGVjX2ZpbmRfZGVjb2Rlcihjb2RlY19pZCk7CisgICAgaWYgKCFyZXMpCisgICAgICAgIGVycm9yKCJGYWlsZWQgdG8gZmluZCBkZWNvZGVyIik7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBzdWJ0aXRsZV9oYW5kbGVyKEFWQ29kZWNDb250ZXh0ICphdmN0eCwgdm9pZCAqZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpnb3Rfc3ViX3B0ciwgQVZQYWNrZXQgKmF2cGt0KQoreworICAgIEFWU3VidGl0bGUgc3ViOworICAgIGludCByZXQgPSBhdmNvZGVjX2RlY29kZV9zdWJ0aXRsZTIoYXZjdHgsICZzdWIsIGdvdF9zdWJfcHRyLCBhdnBrdCk7CisgICAgaWYgKHJldCA+PSAwICYmICpnb3Rfc3ViX3B0cikKKyAgICAgICAgYXZzdWJ0aXRsZV9mcmVlKCZzdWIpOworICAgIHJldHVybiByZXQ7Cit9CisKKy8vIENsYXNzIHRvIGhhbmRsZSBidWZmZXIgYWxsb2NhdGlvbiBhbmQgcmVzaXplIGZvciBlYWNoIGZyYW1lCit0eXBlZGVmIHN0cnVjdCBGdXp6RGF0YUJ1ZmZlciB7CisgICAgc2l6ZV90IHNpemVfOworICAgIHVpbnQ4X3QgKmRhdGFfOworfSBGdXp6RGF0YUJ1ZmZlcjsKKworc3RhdGljIHZvaWQgRkRCQ3JlYXRlKEZ1enpEYXRhQnVmZmVyICpGREIpIHsKKyAgICBGREItPnNpemVfID0gMHgxMDAwOworICAgIEZEQi0+ZGF0YV8gPSBhdl9tYWxsb2MoRkRCLT5zaXplXyk7CisgICAgaWYgKCFGREItPmRhdGFfKQorICAgICAgICBlcnJvcigiRmFpbGVkIG1lbW9yeSBhbGxvY2F0aW9uIik7Cit9CisKK3N0YXRpYyB2b2lkIEZEQkRlc3JveShGdXp6RGF0YUJ1ZmZlciAqRkRCKSB7IGF2X2ZyZWUoRkRCLT5kYXRhXyk7IH0KKworc3RhdGljIHZvaWQgRkRCUmVhbGxvYyhGdXp6RGF0YUJ1ZmZlciAqRkRCLCBzaXplX3Qgc2l6ZSkgeworICAgIHNpemVfdCBuZWVkZWQgPSBzaXplICsgQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRTsKKyAgICBhdl9hc3NlcnQwKG5lZWRlZCA+IHNpemUpOworICAgIGlmIChuZWVkZWQgPiBGREItPnNpemVfKSB7CisgICAgICAgIGF2X2ZyZWUoRkRCLT5kYXRhXyk7CisgICAgICAgIEZEQi0+c2l6ZV8gPSBuZWVkZWQ7CisgICAgICAgIEZEQi0+ZGF0YV8gPSBhdl9tYWxsb2MoRkRCLT5zaXplXyk7CisgICAgICAgIGlmICghRkRCLT5kYXRhXykKKyAgICAgICAgICAgIGVycm9yKCJGYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIEZEQlByZXBhcmUoRnV6ekRhdGFCdWZmZXIgKkZEQiwgQVZQYWNrZXQgKmRzdCwgY29uc3QgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkKK3sKKyAgICBGREJSZWFsbG9jKEZEQiwgc2l6ZSk7CisgICAgbWVtY3B5KEZEQi0+ZGF0YV8sIGRhdGEsIHNpemUpOworICAgIHNpemVfdCBwYWRkID0gRkRCLT5zaXplXyAtIHNpemU7CisgICAgaWYgKHBhZGQgPiBBVl9JTlBVVF9CVUZGRVJfUEFERElOR19TSVpFKQorICAgICAgICBwYWRkID0gQVZfSU5QVVRfQlVGRkVSX1BBRERJTkdfU0laRTsKKyAgICBtZW1zZXQoRkRCLT5kYXRhXyArIHNpemUsIDAsIHBhZGQpOworICAgIGF2X2luaXRfcGFja2V0KGRzdCk7CisgICAgZHN0LT5kYXRhID0gRkRCLT5kYXRhXzsKKyAgICBkc3QtPnNpemUgPSBzaXplOworfQorCisvLyBFbnN1cmUgd2UgZG9uJ3QgbG9vcCBmb3JldmVyCitjb25zdCB1aW50MzJfdCBtYXhpdGVyYXRpb24gPSA4MDk2OworCitzdGF0aWMgY29uc3QgdWludDY0X3QgRlVaWl9UQUcgPSAweDQ3NDE1NDJENUE1QTU1NDZVTEw7CisKK2ludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgY29uc3QgdWludDY0X3QgZnV6el90YWcgPSBGVVpaX1RBRzsKKyAgICBGdXp6RGF0YUJ1ZmZlciBidWZmZXI7CisgICAgY29uc3QgdWludDhfdCAqbGFzdCA9IGRhdGE7CisgICAgY29uc3QgdWludDhfdCAqZW5kID0gZGF0YSArIHNpemU7CisgICAgdWludDMyX3QgaXQgPSAwOworICAgIGludCAoKmRlY29kZV9oYW5kbGVyKShBVkNvZGVjQ29udGV4dCAqYXZjdHgsIEFWRnJhbWUgKnBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZ290X3BpY3R1cmVfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBVlBhY2tldCAqYXZwa3QpID0gTlVMTDsKKworICAgIGlmICghYykgeworI2lmZGVmIEZGTVBFR19ERUNPREVSCisjZGVmaW5lIERFQ09ERVJfU1lNQk9MMChDT0RFQykgZmZfIyNDT0RFQyMjX2RlY29kZXIKKyNkZWZpbmUgREVDT0RFUl9TWU1CT0woQ09ERUMpIERFQ09ERVJfU1lNQk9MMChDT0RFQykKKyAgICAgICAgZXh0ZXJuIEFWQ29kZWMgREVDT0RFUl9TWU1CT0woRkZNUEVHX0RFQ09ERVIpOworICAgICAgICBhdmNvZGVjX3JlZ2lzdGVyKCZERUNPREVSX1NZTUJPTChGRk1QRUdfREVDT0RFUikpOworCisgICAgICAgIGMgPSAmREVDT0RFUl9TWU1CT0woRkZNUEVHX0RFQ09ERVIpOworI2Vsc2UKKyAgICAgICAgYXZjb2RlY19yZWdpc3Rlcl9hbGwoKTsKKyAgICAgICAgYyA9IEFWQ29kZWNJbml0aWFsaXplKEZGTVBFR19DT0RFQyk7ICAvLyBEb25lIG9uY2UuCisjZW5kaWYKKyAgICAgICAgYXZfbG9nX3NldF9sZXZlbChBVl9MT0dfUEFOSUMpOworICAgIH0KKworICAgIHN3aXRjaCAoYy0+dHlwZSkgeworICAgIGNhc2UgQVZNRURJQV9UWVBFX0FVRElPICAgOiBkZWNvZGVfaGFuZGxlciA9IGF2Y29kZWNfZGVjb2RlX2F1ZGlvNDsgYnJlYWs7CisgICAgY2FzZSBBVk1FRElBX1RZUEVfVklERU8gICA6IGRlY29kZV9oYW5kbGVyID0gYXZjb2RlY19kZWNvZGVfdmlkZW8yOyBicmVhazsKKyAgICBjYXNlIEFWTUVESUFfVFlQRV9TVUJUSVRMRTogZGVjb2RlX2hhbmRsZXIgPSBzdWJ0aXRsZV9oYW5kbGVyICAgICA7IGJyZWFrOworICAgIH0KKworICAgIEFWQ29kZWNDb250ZXh0KiBjdHggPSBhdmNvZGVjX2FsbG9jX2NvbnRleHQzKE5VTEwpOworICAgIGlmICghY3R4KQorICAgICAgICBlcnJvcigiRmFpbGVkIG1lbW9yeSBhbGxvY2F0aW9uIik7CisKKyAgICBjdHgtPm1heF9waXhlbHMgPSA0MDk2ICogNDA5NjsgLy9UbyByZWR1Y2UgZmFsc2UgcG9zaXRpdmUgT09NIGFuZCBoYW5ncworCisgICAgaWYgKHNpemUgPiAxMDI0KSB7CisgICAgICAgIEdldEJ5dGVDb250ZXh0IGdiYzsKKyAgICAgICAgYnl0ZXN0cmVhbTJfaW5pdCgmZ2JjLCBkYXRhICsgc2l6ZSAtIDEwMjQsIDEwMjQpOworICAgICAgICBjdHgtPndpZHRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2JjKTsKKyAgICAgICAgY3R4LT5oZWlnaHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYnl0ZXN0cmVhbTJfZ2V0X2xlMzIoJmdiYyk7CisgICAgICAgIGN0eC0+Yml0X3JhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGJ5dGVzdHJlYW0yX2dldF9sZTY0KCZnYmMpOworICAgICAgICBjdHgtPmJpdHNfcGVyX2NvZGVkX3NhbXBsZSAgICAgICAgICAgICAgPSBieXRlc3RyZWFtMl9nZXRfbGUzMigmZ2JjKTsKKyAgICAgICAgaWYgKGF2X2ltYWdlX2NoZWNrX3NpemUoY3R4LT53aWR0aCwgY3R4LT5oZWlnaHQsIDAsIGN0eCkpCisgICAgICAgICAgICBjdHgtPndpZHRoID0gY3R4LT5oZWlnaHQgPSAwOworICAgICAgICBzaXplIC09IDEwMjQ7CisgICAgfQorCisgICAgaW50IHJlcyA9IGF2Y29kZWNfb3BlbjIoY3R4LCBjLCBOVUxMKTsKKyAgICBpZiAocmVzIDwgMCkgeworICAgICAgICBhdl9mcmVlKGN0eCk7CisgICAgICAgIHJldHVybiAwOyAvLyBGYWlsdXJlIG9mIGF2Y29kZWNfb3BlbjIoKSBkb2VzIG5vdCBpbXBseSB0aGF0IGEgaXNzdWUgd2FzIGZvdW5kCisgICAgfQorCisgICAgRkRCQ3JlYXRlKCZidWZmZXIpOworICAgIGludCBnb3RfZnJhbWU7CisgICAgQVZGcmFtZSAqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIGVycm9yKCJGYWlsZWQgbWVtb3J5IGFsbG9jYXRpb24iKTsKKworICAgIC8vIFJlYWQgdmVyeSBzaW1wbGUgY29udGFpbmVyCisgICAgQVZQYWNrZXQgYXZwa3Q7CisgICAgd2hpbGUgKGRhdGEgPCBlbmQgJiYgaXQgPCBtYXhpdGVyYXRpb24pIHsKKyAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgVEFHCisgICAgICAgIHdoaWxlIChkYXRhICsgc2l6ZW9mKGZ1enpfdGFnKSA8IGVuZCkgeworICAgICAgICAgICAgaWYgKGRhdGFbMF0gPT0gKGZ1enpfdGFnICYgMHhGRikgJiYgQVZfUk42NChkYXRhKSA9PSBmdXp6X3RhZykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRhdGErKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGF0YSArIHNpemVvZihmdXp6X3RhZykgPiBlbmQpCisgICAgICAgICAgICBkYXRhID0gZW5kOworCisgICAgICAgIEZEQlByZXBhcmUoJmJ1ZmZlciwgJmF2cGt0LCBsYXN0LCBkYXRhIC0gbGFzdCk7CisgICAgICAgIGRhdGEgKz0gc2l6ZW9mKGZ1enpfdGFnKTsKKyAgICAgICAgbGFzdCA9IGRhdGE7CisKKyAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBkYXRhCisgICAgICAgIHdoaWxlIChhdnBrdC5zaXplID4gMCAmJiBpdCsrIDwgbWF4aXRlcmF0aW9uKSB7CisgICAgICAgICAgICBhdl9mcmFtZV91bnJlZihmcmFtZSk7CisgICAgICAgICAgICBpbnQgcmV0ID0gZGVjb2RlX2hhbmRsZXIoY3R4LCBmcmFtZSwgJmdvdF9mcmFtZSwgJmF2cGt0KTsKKworICAgICAgICAgICAgaWYgKGl0ID4gMjApCisgICAgICAgICAgICAgICAgY3R4LT5lcnJvcl9jb25jZWFsbWVudCA9IDA7CisKKyAgICAgICAgICAgIGlmIChyZXQgPD0gMCB8fCByZXQgPiBhdnBrdC5zaXplKQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiAoY3R4LT5jb2RlY190eXBlICE9IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgICAgICAgICByZXQgPSBhdnBrdC5zaXplOworICAgICAgICAgICAgYXZwa3QuZGF0YSArPSByZXQ7CisgICAgICAgICAgICBhdnBrdC5zaXplIC09IHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF2X2luaXRfcGFja2V0KCZhdnBrdCk7CisgICAgYXZwa3QuZGF0YSA9IE5VTEw7CisgICAgYXZwa3Quc2l6ZSA9IDA7CisKKyAgICBkbyB7CisgICAgICAgIGdvdF9mcmFtZSA9IDA7CisgICAgICAgIGRlY29kZV9oYW5kbGVyKGN0eCwgZnJhbWUsICZnb3RfZnJhbWUsICZhdnBrdCk7CisgICAgfSB3aGlsZSAoZ290X2ZyYW1lID09IDEgJiYgaXQrKyA8IG1heGl0ZXJhdGlvbik7CisKKyAgICBhdl9mcmFtZV9mcmVlKCZmcmFtZSk7CisgICAgYXZjb2RlY19mcmVlX2NvbnRleHQoJmN0eCk7CisgICAgYXZfZnJlZXAoJmN0eCk7CisgICAgRkRCRGVzcm95KCZidWZmZXIpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvdW5jb2RlZF9mcmFtZS5jIGIvdG9vbHMvdW5jb2RlZF9mcmFtZS5jCmluZGV4IDNjYTJiYTQuLjNmODUwZDMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3VuY29kZWRfZnJhbWUuYworKysgYi90b29scy91bmNvZGVkX2ZyYW1lLmMKQEAgLTExLDcgKzExLDYgQEAKICAgICBBVkZvcm1hdENvbnRleHQgKm11eDsKICAgICBBVlN0cmVhbSAqc3RyZWFtOwogICAgIEFWRmlsdGVyQ29udGV4dCAqc2luazsKLSAgICBBVkZpbHRlckxpbmsgKmxpbms7CiB9IFN0cmVhbTsKIAogc3RhdGljIGludCBjcmVhdGVfc2luayhTdHJlYW0gKnN0LCBBVkZpbHRlckdyYXBoICpncmFwaCwKQEAgLTM2LDcgKzM1LDYgQEAKICAgICByZXQgPSBhdmZpbHRlcl9saW5rKGYsIGlkeCwgc3QtPnNpbmssIDApOwogICAgIGlmIChyZXQgPCAwKQogICAgICAgICByZXR1cm4gcmV0OwotICAgIHN0LT5saW5rID0gc3QtPnNpbmstPmlucHV0c1swXTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtNjQsOSArNjIsNyBAQAogICAgIG91dF9kZXZfbmFtZSA9IGFyZ3YgKyAyOwogICAgIG5iX291dF9kZXYgPSBhcmdjIC0gMjsKIAotICAgIGF2X3JlZ2lzdGVyX2FsbCgpOwogICAgIGF2ZGV2aWNlX3JlZ2lzdGVyX2FsbCgpOwotICAgIGF2ZmlsdGVyX3JlZ2lzdGVyX2FsbCgpOwogCiAgICAgLyogQ3JlYXRlIGlucHV0IGdyYXBoICovCiAgICAgaWYgKCEoaW5fZ3JhcGggPSBhdmZpbHRlcl9ncmFwaF9hbGxvYygpKSkgewpAQCAtMTQzLDcgKzEzOSw3IEBACiAgICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCEoc3QtPm11eC0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpKSB7Ci0gICAgICAgICAgICByZXQgPSBhdmlvX29wZW4yKCZzdC0+bXV4LT5wYiwgc3QtPm11eC0+ZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSwKKyAgICAgICAgICAgIHJldCA9IGF2aW9fb3BlbjIoJnN0LT5tdXgtPnBiLCBzdC0+bXV4LT51cmwsIEFWSU9fRkxBR19XUklURSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCk7CiAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgIGF2X2xvZyhzdC0+bXV4LCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gaW5pdCBvdXRwdXQ6ICVzXG4iLApAQCAtMTYzLDI2ICsxNTksMjQgQEAKICAgICAgICAgICAgIGF2X2xvZyhOVUxMLCBBVl9MT0dfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBzdHJlYW1cbiIpOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9Ci0gICAgICAgIHN0LT5zdHJlYW0tPmNvZGVjLT5jb2RlY190eXBlID0gc3QtPmxpbmstPnR5cGU7Ci0gICAgICAgIHN0LT5zdHJlYW0tPnRpbWVfYmFzZSA9IHN0LT5zdHJlYW0tPmNvZGVjLT50aW1lX2Jhc2UgPQotICAgICAgICAgICAgc3QtPmxpbmstPnRpbWVfYmFzZTsKLSAgICAgICAgc3dpdGNoIChzdC0+bGluay0+dHlwZSkgeworICAgICAgICBzdC0+c3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9IGF2X2J1ZmZlcnNpbmtfZ2V0X3R5cGUoc3QtPnNpbmspOworICAgICAgICBzdC0+c3RyZWFtLT50aW1lX2Jhc2UgPSBhdl9idWZmZXJzaW5rX2dldF90aW1lX2Jhc2Uoc3QtPnNpbmspOworICAgICAgICBzd2l0Y2ggKGF2X2J1ZmZlcnNpbmtfZ2V0X3R5cGUoc3QtPnNpbmspKSB7CiAgICAgICAgIGNhc2UgQVZNRURJQV9UWVBFX1ZJREVPOgotICAgICAgICAgICAgc3QtPnN0cmVhbS0+Y29kZWMtPmNvZGVjX2lkID0gQVZfQ09ERUNfSURfUkFXVklERU87CisgICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfaWQgPSBBVl9DT0RFQ19JRF9SQVdWSURFTzsKICAgICAgICAgICAgIHN0LT5zdHJlYW0tPmF2Z19mcmFtZV9yYXRlID0KICAgICAgICAgICAgIHN0LT5zdHJlYW0tPiAgcl9mcmFtZV9yYXRlID0gYXZfYnVmZmVyc2lua19nZXRfZnJhbWVfcmF0ZShzdC0+c2luayk7Ci0gICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlYy0+d2lkdGggICAgICAgICAgICAgICA9IHN0LT5saW5rLT53OwotICAgICAgICAgICAgc3QtPnN0cmVhbS0+Y29kZWMtPmhlaWdodCAgICAgICAgICAgICAgPSBzdC0+bGluay0+aDsKLSAgICAgICAgICAgIHN0LT5zdHJlYW0tPmNvZGVjLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gc3QtPmxpbmstPnNhbXBsZV9hc3BlY3RfcmF0aW87Ci0gICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlYy0+cGl4X2ZtdCAgICAgICAgICAgICA9IHN0LT5saW5rLT5mb3JtYXQ7CisgICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlY3Bhci0+d2lkdGggICAgICAgICAgICAgICA9IGF2X2J1ZmZlcnNpbmtfZ2V0X3coc3QtPnNpbmspOworICAgICAgICAgICAgc3QtPnN0cmVhbS0+Y29kZWNwYXItPmhlaWdodCAgICAgICAgICAgICAgPSBhdl9idWZmZXJzaW5rX2dldF9oKHN0LT5zaW5rKTsKKyAgICAgICAgICAgIHN0LT5zdHJlYW0tPmNvZGVjcGFyLT5zYW1wbGVfYXNwZWN0X3JhdGlvID0gYXZfYnVmZmVyc2lua19nZXRfc2FtcGxlX2FzcGVjdF9yYXRpbyhzdC0+c2luayk7CisgICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlY3Bhci0+Zm9ybWF0ICAgICAgICAgICAgICA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2Zvcm1hdChzdC0+c2luayk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVk1FRElBX1RZUEVfQVVESU86Ci0gICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlYy0+Y2hhbm5lbF9sYXlvdXQgPSBzdC0+bGluay0+Y2hhbm5lbF9sYXlvdXQ7Ci0gICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlYy0+Y2hhbm5lbHMgPSBhdmZpbHRlcl9saW5rX2dldF9jaGFubmVscyhzdC0+bGluayk7Ci0gICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlYy0+c2FtcGxlX3JhdGUgPSBzdC0+bGluay0+c2FtcGxlX3JhdGU7Ci0gICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlYy0+c2FtcGxlX2ZtdCA9IHN0LT5saW5rLT5mb3JtYXQ7Ci0gICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlYy0+Y29kZWNfaWQgPQotICAgICAgICAgICAgICAgIGF2X2dldF9wY21fY29kZWMoc3QtPnN0cmVhbS0+Y29kZWMtPnNhbXBsZV9mbXQsIC0xKTsKKyAgICAgICAgICAgIHN0LT5zdHJlYW0tPmNvZGVjcGFyLT5jaGFubmVsX2xheW91dCA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2NoYW5uZWxfbGF5b3V0KHN0LT5zaW5rKTsKKyAgICAgICAgICAgIHN0LT5zdHJlYW0tPmNvZGVjcGFyLT5jaGFubmVscyAgICAgICA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2NoYW5uZWxzKHN0LT5zaW5rKTsKKyAgICAgICAgICAgIHN0LT5zdHJlYW0tPmNvZGVjcGFyLT5zYW1wbGVfcmF0ZSAgICA9IGF2X2J1ZmZlcnNpbmtfZ2V0X3NhbXBsZV9yYXRlKHN0LT5zaW5rKTsKKyAgICAgICAgICAgIHN0LT5zdHJlYW0tPmNvZGVjcGFyLT5mb3JtYXQgICAgICAgICA9IGF2X2J1ZmZlcnNpbmtfZ2V0X2Zvcm1hdChzdC0+c2luayk7CisgICAgICAgICAgICBzdC0+c3RyZWFtLT5jb2RlY3Bhci0+Y29kZWNfaWQgICAgICAgPSBhdl9nZXRfcGNtX2NvZGVjKHN0LT5zdHJlYW0tPmNvZGVjcGFyLT5mb3JtYXQsIC0xKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgYXZfYXNzZXJ0MCghInJlYWNoZWQiKTsKQEAgLTI0MCwxNCArMjM0LDE0IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+cHRzICE9IEFWX05PUFRTX1ZBTFVFKQogICAgICAgICAgICAgICAgICAgICBmcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9xKGZyYW1lLT5wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPmxpbmsgIC0+dGltZV9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X2J1ZmZlcnNpbmtfZ2V0X3RpbWVfYmFzZShzdC0+c2luayksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3QtPnN0cmVhbS0+dGltZV9iYXNlKTsKICAgICAgICAgICAgICAgICByZXQgPSBhdl9pbnRlcmxlYXZlZF93cml0ZV91bmNvZGVkX2ZyYW1lKHN0LT5tdXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdC0+c3RyZWFtLT5pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lKTsKICAgICAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYXZfbG9nKHN0LT5zdHJlYW0tPmNvZGVjLCBBVl9MT0dfRVJST1IsCisgICAgICAgICAgICAgICAgICAgIGF2X2xvZyhzdC0+bXV4LCBBVl9MT0dfRVJST1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd3JpdGluZyBmcmFtZTogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90b29scy96bXFzZW5kLmMgYi90b29scy96bXFzZW5kLmMKaW5kZXggZDQ3YmYyMS4uN2JkN2ZlNCAxMDA2NDQKLS0tIGEvdG9vbHMvem1xc2VuZC5jCisrKyBiL3Rvb2xzL3ptcXNlbmQuYwpAQCAtNTIsOCArNTIsOSBAQAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewogICAgIEFWQlByaW50IHNyYzsKLSAgICBjaGFyIGMsICpzcmNfYnVmLCAqcmVjdl9idWY7Ci0gICAgaW50IHJlY3ZfYnVmX3NpemUsIHJldDsKKyAgICBjaGFyICpzcmNfYnVmLCAqcmVjdl9idWY7CisgICAgaW50IGM7CisgICAgaW50IHJlY3ZfYnVmX3NpemUsIHJldCA9IDA7CiAgICAgdm9pZCAqem1xX2N0eCwgKnNvY2tldDsKICAgICBjb25zdCBjaGFyICpiaW5kX2FkZHJlc3MgPSAidGNwOi8vbG9jYWxob3N0OjU1NTUiOwogICAgIGNvbnN0IGNoYXIgKmluZmlsZW5hbWUgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvdmVyc2lvbi5zaCBiL3ZlcnNpb24uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE5ZDdlMzkuLjAwMDAwMDAKLS0tIGEvdmVyc2lvbi5zaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLSMhL2Jpbi9zaAotCi0jIFVzYWdlOiB2ZXJzaW9uLnNoIDxmZm1wZWctcm9vdC1kaXI+IDxvdXRwdXQtdmVyc2lvbi5oPiA8ZXh0cmEtdmVyc2lvbj4KLQotIyBjaGVjayBmb3IgZ2l0IHNob3J0IGhhc2gKLWlmICEgdGVzdCAiJHJldmlzaW9uIjsgdGhlbgotICAgIGlmIChjZCAiJDEiICYmIGdyZXAgZ2l0IFJFTEVBU0UgMj4gL2Rldi9udWxsID4vZGV2L251bGwpIDsgdGhlbgotICAgICAgICByZXZpc2lvbj0kKGNkICIkMSIgJiYgZ2l0IGRlc2NyaWJlIC0tdGFncyAtLW1hdGNoIE4gMj4gL2Rldi9udWxsKQotICAgIGVsc2UKLSAgICAgICAgcmV2aXNpb249JChjZCAiJDEiICYmIGdpdCBkZXNjcmliZSAtLXRhZ3MgLS1hbHdheXMgMj4gL2Rldi9udWxsKQotICAgIGZpCi1maQotCi0jIFNoYWxsb3cgR2l0IGNsb25lcyAoLS1kZXB0aCkgZG8gbm90IGhhdmUgdGhlIE4gdGFnOgotIyB1c2UgJ2dpdC1ZWVlZLU1NLURELWhoaGhoaGgnLgotdGVzdCAiJHJldmlzaW9uIiB8fCByZXZpc2lvbj0kKGNkICIkMSIgJiYKLSAgZ2l0IGxvZyAtMSAtLXByZXR0eT1mb3JtYXQ6ImdpdC0lY2QtJWgiIC0tZGF0ZT1zaG9ydCAyPiAvZGV2L251bGwpCi0KLSMgU25hcHNob3RzIGZyb20gZ2l0d2ViIGFyZSBpbiBhIGRpcmVjdG9yeSBjYWxsZWQgZmZtcGVnLWhoaGhoaGggb3IKLSMgZmZtcGVnLUhFQUQtaGhoaGhoaC4KLWlmIFsgLXogIiRyZXZpc2lvbiIgXTsgdGhlbgotICBzcmNkaXI9JChjZCAiJDEiICYmIHB3ZCkKLSAgY2FzZSAiJHNyY2RpciIgaW4KLSAgICAqL2ZmbXBlZy1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXSkKLSAgICAgIGdpdF9oYXNoPSIke3NyY2RpciMjKi19Ijs7Ci0gICAgKi9mZm1wZWctSEVBRC1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXVswLTlhLWZdWzAtOWEtZl1bMC05YS1mXSkKLSAgICAgIGdpdF9oYXNoPSIke3NyY2RpciMjKi19Ijs7Ci0gIGVzYWMKLWZpCi0KLSMgbm8gcmV2aXNpb24gbnVtYmVyIGZvdW5kCi10ZXN0ICIkcmV2aXNpb24iIHx8IHJldmlzaW9uPSQoY2QgIiQxIiAmJiBjYXQgUkVMRUFTRSAyPiAvZGV2L251bGwpCi0KLSMgQXBwZW5kIHRoZSBHaXQgaGFzaCBpZiB3ZSBoYXZlIG9uZQotdGVzdCAiJHJldmlzaW9uIiAmJiB0ZXN0ICIkZ2l0X2hhc2giICYmIHJldmlzaW9uPSIkcmV2aXNpb24tJGdpdF9oYXNoIgotCi0jIHJlbGVhc2VzIGV4dHJhY3QgdGhlIHZlcnNpb24gbnVtYmVyIGZyb20gdGhlIFZFUlNJT04gZmlsZQotdmVyc2lvbj0kKGNkICIkMSIgJiYgY2F0IFZFUlNJT04gMj4gL2Rldi9udWxsKQotdGVzdCAiJHZlcnNpb24iIHx8IHZlcnNpb249JHJldmlzaW9uCi0KLXRlc3QgLW4gIiQzIiAmJiB2ZXJzaW9uPSR2ZXJzaW9uLSQzCi0KLWlmIFsgLXogIiQyIiBdOyB0aGVuCi0gICAgZWNobyAiJHZlcnNpb24iCi0gICAgZXhpdAotZmkKLQotTkVXX1JFVklTSU9OPSIjZGVmaW5lIEZGTVBFR19WRVJTSU9OIFwiJHZlcnNpb25cIiIKLU9MRF9SRVZJU0lPTj0kKGNhdCAiJDIiIDI+IC9kZXYvbnVsbCB8IGhlYWQgLTMgfCB0YWlsIC0xKQotCi0jIFN0cmluZyB1c2VkIGZvciBwcmVwcm9jZXNzb3IgZ3VhcmQKLUdVQVJEPSQoZWNobyAiJDIiIHwgc2VkICdzL1wvL18vJyB8IHNlZCAncy9cLi9fLycgfCB0ciAnWzpsb3dlcjpdJyAnWzp1cHBlcjpdJyB8IHNlZCAncy9MSUIvLycpCi0KLSMgVXBkYXRlIHZlcnNpb24gaGVhZGVyIG9ubHkgb24gcmV2aXNpb24gY2hhbmdlcyB0byBhdm9pZCBzcHVyaW91cyByZWJ1aWxkcwotaWYgdGVzdCAiJE5FV19SRVZJU0lPTiIgIT0gIiRPTERfUkVWSVNJT04iOyB0aGVuCi0gICAgY2F0IDw8IEVPRiA+ICIkMiIKLS8qIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHZlcnNpb24uc2gsIGRvIG5vdCBtYW51YWxseSBlZGl0ISAqLwotI2lmbmRlZiAkR1VBUkQKLSNkZWZpbmUgJEdVQVJECi0kTkVXX1JFVklTSU9OCi0jZW5kaWYgLyogJEdVQVJEICovCi1FT0YKLWZpCg==